From 14a36b707eec0d5fac99489dd4a1a0598582171b Mon Sep 17 00:00:00 2001 From: denghao Date: Sat, 8 Oct 2022 12:37:59 +0300 Subject: [PATCH] Import Upstream version 12.44 --- Changes | 10183 +++++ MANIFEST | 1130 + META.json | 51 + META.yml | 31 + Makefile.PL | 52 + README | 255 + arg_files/exif2iptc.args | 31 + arg_files/exif2xmp.args | 53 + arg_files/gps2xmp.args | 27 + arg_files/iptc2exif.args | 24 + arg_files/iptc2xmp.args | 57 + arg_files/iptcCore.args | 241 + arg_files/pdf2xmp.args | 27 + arg_files/xmp2exif.args | 56 + arg_files/xmp2gps.args | 31 + arg_files/xmp2iptc.args | 66 + arg_files/xmp2pdf.args | 27 + config_files/acdsee.config | 258 + config_files/age.config | 84 + config_files/bibble.config | 520 + config_files/convert_regions.config | 234 + config_files/cuepointlist.config | 70 + config_files/depthmap.config | 56 + config_files/example.config | 357 + config_files/fotoware.config | 114 + config_files/gps2utm.config | 256 + config_files/nksc.config | 146 + config_files/photoshop_paths.config | 221 + config_files/picasa_faces.config | 382 + config_files/pix4d.config | 99 + config_files/rotate_regions.config | 173 + config_files/tiff_version.config | 121 + config_files/time_zone.config | 96 + exiftool | 7300 +++ fmt_files/gpx.fmt | 36 + fmt_files/gpx_wpt.fmt | 40 + fmt_files/kml.fmt | 59 + fmt_files/kml_track.fmt | 46 + html/ExifTool.html | 2304 + html/MIE1.1-20070121.pdf | Bin 0 -> 128751 bytes html/Shift.html | 183 + html/TagNames/AFCP.html | 54 + html/TagNames/AIFF.html | 160 + html/TagNames/APE.html | 155 + html/TagNames/APP12.html | 189 + html/TagNames/ASF.html | 1067 + html/TagNames/Apple.html | 97 + html/TagNames/Audible.html | 178 + html/TagNames/BMP.html | 234 + html/TagNames/BPG.html | 119 + html/TagNames/CBOR.html | 62 + html/TagNames/Canon.html | 11639 +++++ html/TagNames/CanonCustom.html | 2224 + html/TagNames/CanonRaw.html | 564 + html/TagNames/CanonVRD.html | 2042 + html/TagNames/Casio.html | 1607 + html/TagNames/Composite.html | 830 + html/TagNames/DICOM.html | 15763 +++++++ html/TagNames/DJI.html | 371 + html/TagNames/DNG.html | 312 + html/TagNames/DPX.html | 300 + html/TagNames/DV.html | 76 + html/TagNames/DarwinCore.html | 1891 + html/TagNames/DjVu.html | 314 + html/TagNames/EXE.html | 766 + html/TagNames/EXIF.html | 3824 ++ html/TagNames/Extra.html | 561 + html/TagNames/FITS.html | 96 + html/TagNames/FLAC.html | 189 + html/TagNames/FLIF.html | 85 + html/TagNames/FLIR.html | 1433 + html/TagNames/Flash.html | 420 + html/TagNames/FlashPix.html | 1689 + html/TagNames/Font.html | 486 + html/TagNames/FotoStation.html | 104 + html/TagNames/FujiFilm.html | 1242 + html/TagNames/GE.html | 41 + html/TagNames/GIF.html | 191 + html/TagNames/GIMP.html | 159 + html/TagNames/GPS.html | 231 + html/TagNames/GeoTiff.html | 2301 + html/TagNames/GoPro.html | 589 + html/TagNames/H264.html | 399 + html/TagNames/HP.html | 156 + html/TagNames/HTML.html | 667 + html/TagNames/ICC_Profile.html | 1411 + html/TagNames/ID3.html | 1679 + html/TagNames/IPTC.html | 904 + html/TagNames/ISO.html | 160 + html/TagNames/ITC.html | 91 + html/TagNames/JFIF.html | 89 + html/TagNames/JPEG.html | 674 + html/TagNames/JSON.html | 58 + html/TagNames/JVC.html | 57 + html/TagNames/Jpeg2000.html | 570 + html/TagNames/Kodak.html | 5735 +++ html/TagNames/KyoceraRaw.html | 93 + html/TagNames/LIF.html | 30 + html/TagNames/LNK.html | 479 + html/TagNames/Leaf.html | 872 + html/TagNames/Lytro.html | 123 + html/TagNames/M2TS.html | 136 + html/TagNames/MIE.html | 1030 + html/TagNames/MIFF.html | 197 + html/TagNames/MNG.html | 848 + html/TagNames/MOI.html | 61 + html/TagNames/MPC.html | 98 + html/TagNames/MPEG.html | 250 + html/TagNames/MPF.html | 200 + html/TagNames/MRC.html | 731 + html/TagNames/MWG.html | 591 + html/TagNames/MXF.html | 6674 +++ html/TagNames/MacOS.html | 660 + html/TagNames/Matroska.html | 1117 + html/TagNames/Microsoft.html | 2149 + html/TagNames/Minolta.html | 2601 ++ html/TagNames/MinoltaRaw.html | 332 + html/TagNames/Motorola.html | 53 + html/TagNames/Nikon.html | 8991 ++++ html/TagNames/NikonCapture.html | 800 + html/TagNames/NikonCustom.html | 11654 +++++ html/TagNames/NikonSettings.html | 2587 ++ html/TagNames/Nintendo.html | 64 + html/TagNames/OOXML.html | 281 + html/TagNames/Ogg.html | 50 + html/TagNames/Olympus.html | 3739 ++ html/TagNames/OpenEXR.html | 223 + html/TagNames/Opus.html | 63 + html/TagNames/Other.html | 42 + html/TagNames/PCX.html | 105 + html/TagNames/PDF.html | 746 + html/TagNames/PGF.html | 81 + html/TagNames/PICT.html | 754 + html/TagNames/PLIST.html | 87 + html/TagNames/PLUS.html | 2616 ++ html/TagNames/PNG.html | 606 + html/TagNames/PSP.html | 161 + html/TagNames/Palm.html | 389 + html/TagNames/Panasonic.html | 2121 + html/TagNames/PanasonicRaw.html | 671 + html/TagNames/Parrot.html | 676 + html/TagNames/Pentax.html | 4924 ++ html/TagNames/PhaseOne.html | 267 + html/TagNames/PhotoCD.html | 403 + html/TagNames/PhotoMechanic.html | 199 + html/TagNames/Photoshop.html | 769 + html/TagNames/PostScript.html | 174 + html/TagNames/PrintIM.html | 32 + html/TagNames/Qualcomm.html | 4779 ++ html/TagNames/QuickTime.html | 8884 ++++ html/TagNames/RIFF.html | 1663 + html/TagNames/RSRC.html | 75 + html/TagNames/RTF.html | 151 + html/TagNames/Radiance.html | 93 + html/TagNames/Rawzor.html | 46 + html/TagNames/Real.html | 781 + html/TagNames/Reconyx.html | 396 + html/TagNames/Red.html | 292 + html/TagNames/Ricoh.html | 812 + html/TagNames/Samsung.html | 1137 + html/TagNames/Sanyo.html | 367 + html/TagNames/Scalado.html | 46 + html/TagNames/Shortcuts.html | 302 + html/TagNames/Sigma.html | 710 + html/TagNames/SigmaRaw.html | 439 + html/TagNames/Sony.html | 11835 +++++ html/TagNames/SonyIDC.html | 339 + html/TagNames/Stim.html | 201 + html/TagNames/Text.html | 76 + html/TagNames/Theora.html | 103 + html/TagNames/Torrent.html | 189 + html/TagNames/Unknown.html | 32 + html/TagNames/VCard.html | 529 + html/TagNames/Vorbis.html | 244 + html/TagNames/WTV.html | 381 + html/TagNames/XMP.html | 19437 ++++++++ html/TagNames/ZIP.html | 211 + html/TagNames/ZISRAW.html | 41 + html/TagNames/iWork.html | 50 + html/TagNames/index.html | 243 + html/TagNames/style.css | 31 + html/ancient_history.html | 11077 +++++ html/canon_raw.html | 368 + html/commentary.html | 336 + html/config.html | 377 + html/data_members.html | 316 + html/exiftool_pod.html | 2053 + html/faq.html | 1768 + html/filename.html | 379 + html/geotag.html | 726 + html/history.html | 379 + html/htmldump.html | 769 + html/idiosyncracies.html | 293 + html/index.html | 1534 + html/install.html | 266 + html/metafiles.html | 323 + html/mistakes.html | 155 + html/overview.png | Bin 0 -> 27207 bytes html/standards.html | 306 + html/struct.html | 431 + html/style.css | 31 + html/under.html | 165 + html/verbose.html | 211 + html/writing.html | 239 + lib/File/RandomAccess.pm | 418 + lib/File/RandomAccess.pod | 250 + lib/Image/ExifTool.pm | 8971 ++++ lib/Image/ExifTool.pod | 2780 ++ lib/Image/ExifTool/AES.pm | 501 + lib/Image/ExifTool/AFCP.pm | 281 + lib/Image/ExifTool/AIFF.pm | 312 + lib/Image/ExifTool/APE.pm | 287 + lib/Image/ExifTool/APP12.pm | 322 + lib/Image/ExifTool/ASF.pm | 898 + lib/Image/ExifTool/Apple.pm | 171 + lib/Image/ExifTool/Audible.pm | 317 + lib/Image/ExifTool/BMP.pm | 361 + lib/Image/ExifTool/BPG.pm | 253 + lib/Image/ExifTool/BZZ.pm | 472 + lib/Image/ExifTool/BigTIFF.pm | 297 + lib/Image/ExifTool/BuildTagLookup.pm | 2776 ++ lib/Image/ExifTool/CBOR.pm | 331 + lib/Image/ExifTool/Canon.pm | 10193 +++++ lib/Image/ExifTool/CanonCustom.pm | 2900 ++ lib/Image/ExifTool/CanonRaw.pm | 910 + lib/Image/ExifTool/CanonVRD.pm | 2282 + lib/Image/ExifTool/CaptureOne.pm | 235 + lib/Image/ExifTool/Casio.pm | 2060 + lib/Image/ExifTool/Charset.pm | 434 + lib/Image/ExifTool/Charset/Arabic.pm | 39 + lib/Image/ExifTool/Charset/Baltic.pm | 35 + lib/Image/ExifTool/Charset/Cyrillic.pm | 45 + lib/Image/ExifTool/Charset/DOSCyrillic.pm | 49 + lib/Image/ExifTool/Charset/DOSLatin1.pm | 49 + lib/Image/ExifTool/Charset/DOSLatinUS.pm | 49 + lib/Image/ExifTool/Charset/Greek.pm | 40 + lib/Image/ExifTool/Charset/Hebrew.pm | 36 + lib/Image/ExifTool/Charset/JIS.pm | 1735 + lib/Image/ExifTool/Charset/Latin.pm | 24 + lib/Image/ExifTool/Charset/Latin2.pm | 36 + lib/Image/ExifTool/Charset/MacArabic.pm | 47 + lib/Image/ExifTool/Charset/MacChineseCN.pm | 2088 + lib/Image/ExifTool/Charset/MacChineseTW.pm | 3623 ++ lib/Image/ExifTool/Charset/MacCroatian.pm | 43 + lib/Image/ExifTool/Charset/MacCyrillic.pm | 47 + lib/Image/ExifTool/Charset/MacGreek.pm | 45 + lib/Image/ExifTool/Charset/MacHebrew.pm | 47 + lib/Image/ExifTool/Charset/MacIceland.pm | 42 + lib/Image/ExifTool/Charset/MacJapanese.pm | 1933 + lib/Image/ExifTool/Charset/MacKorean.pm | 2720 ++ lib/Image/ExifTool/Charset/MacLatin2.pm | 44 + lib/Image/ExifTool/Charset/MacRSymbol.pm | 2087 + lib/Image/ExifTool/Charset/MacRoman.pm | 42 + lib/Image/ExifTool/Charset/MacRomanian.pm | 42 + lib/Image/ExifTool/Charset/MacThai.pm | 49 + lib/Image/ExifTool/Charset/MacTurkish.pm | 42 + lib/Image/ExifTool/Charset/PDFDoc.pm | 28 + lib/Image/ExifTool/Charset/ShiftJIS.pm | 1835 + lib/Image/ExifTool/Charset/Symbol.pm | 54 + lib/Image/ExifTool/Charset/Thai.pm | 41 + lib/Image/ExifTool/Charset/Turkish.pm | 25 + lib/Image/ExifTool/Charset/Vietnam.pm | 27 + lib/Image/ExifTool/DICOM.pm | 3881 ++ lib/Image/ExifTool/DJI.pm | 223 + lib/Image/ExifTool/DNG.pm | 848 + lib/Image/ExifTool/DPX.pm | 247 + lib/Image/ExifTool/DV.pm | 315 + lib/Image/ExifTool/DarwinCore.pm | 393 + lib/Image/ExifTool/DjVu.pm | 378 + lib/Image/ExifTool/EXE.pm | 1432 + lib/Image/ExifTool/Exif.pm | 6850 +++ lib/Image/ExifTool/FITS.pm | 159 + lib/Image/ExifTool/FLAC.pm | 307 + lib/Image/ExifTool/FLIF.pm | 353 + lib/Image/ExifTool/FLIR.pm | 1667 + lib/Image/ExifTool/Fixup.pm | 366 + lib/Image/ExifTool/Flash.pm | 755 + lib/Image/ExifTool/FlashPix.pm | 2445 + lib/Image/ExifTool/Font.pm | 654 + lib/Image/ExifTool/FotoStation.pm | 261 + lib/Image/ExifTool/FujiFilm.pm | 1723 + lib/Image/ExifTool/GE.pm | 81 + lib/Image/ExifTool/GIF.pm | 569 + lib/Image/ExifTool/GIMP.pm | 294 + lib/Image/ExifTool/GPS.pm | 621 + lib/Image/ExifTool/GeoTiff.pm | 2265 + lib/Image/ExifTool/Geotag.pm | 1475 + lib/Image/ExifTool/GoPro.pm | 757 + lib/Image/ExifTool/H264.pm | 1149 + lib/Image/ExifTool/HP.pm | 263 + lib/Image/ExifTool/HTML.pm | 583 + lib/Image/ExifTool/HtmlDump.pm | 930 + lib/Image/ExifTool/ICC_Profile.pm | 1381 + lib/Image/ExifTool/ID3.pm | 1680 + lib/Image/ExifTool/IPTC.pm | 1301 + lib/Image/ExifTool/ISO.pm | 206 + lib/Image/ExifTool/ITC.pm | 215 + lib/Image/ExifTool/Import.pm | 360 + lib/Image/ExifTool/InDesign.pm | 279 + lib/Image/ExifTool/JPEG.pm | 732 + lib/Image/ExifTool/JPEGDigest.pm | 2617 ++ lib/Image/ExifTool/JSON.pm | 190 + lib/Image/ExifTool/JVC.pm | 130 + lib/Image/ExifTool/Jpeg2000.pm | 1379 + lib/Image/ExifTool/Kodak.pm | 3279 ++ lib/Image/ExifTool/KyoceraRaw.pm | 173 + lib/Image/ExifTool/LIF.pm | 153 + lib/Image/ExifTool/LNK.pm | 726 + lib/Image/ExifTool/Lang/cs.pm | 1588 + lib/Image/ExifTool/Lang/de.pm | 8720 ++++ lib/Image/ExifTool/Lang/en_ca.pm | 1002 + lib/Image/ExifTool/Lang/en_gb.pm | 1045 + lib/Image/ExifTool/Lang/es.pm | 4023 ++ lib/Image/ExifTool/Lang/fi.pm | 2896 ++ lib/Image/ExifTool/Lang/fr.pm | 4769 ++ lib/Image/ExifTool/Lang/it.pm | 7921 ++++ lib/Image/ExifTool/Lang/ja.pm | 5858 +++ lib/Image/ExifTool/Lang/ko.pm | 2333 + lib/Image/ExifTool/Lang/nl.pm | 3226 ++ lib/Image/ExifTool/Lang/pl.pm | 1276 + lib/Image/ExifTool/Lang/ru.pm | 5736 +++ lib/Image/ExifTool/Lang/sv.pm | 638 + lib/Image/ExifTool/Lang/tr.pm | 546 + lib/Image/ExifTool/Lang/zh_cn.pm | 1330 + lib/Image/ExifTool/Lang/zh_tw.pm | 801 + lib/Image/ExifTool/Leaf.pm | 517 + lib/Image/ExifTool/Lytro.pm | 214 + lib/Image/ExifTool/M2TS.pm | 882 + lib/Image/ExifTool/MIE.pm | 2568 ++ lib/Image/ExifTool/MIEUnits.pod | 377 + lib/Image/ExifTool/MIFF.pm | 279 + lib/Image/ExifTool/MNG.pm | 684 + lib/Image/ExifTool/MOI.pm | 159 + lib/Image/ExifTool/MPC.pm | 156 + lib/Image/ExifTool/MPEG.pm | 735 + lib/Image/ExifTool/MPF.pm | 288 + lib/Image/ExifTool/MRC.pm | 341 + lib/Image/ExifTool/MWG.pm | 777 + lib/Image/ExifTool/MXF.pm | 3031 ++ lib/Image/ExifTool/MacOS.pm | 735 + lib/Image/ExifTool/MakerNotes.pm | 1841 + lib/Image/ExifTool/Matroska.pm | 939 + lib/Image/ExifTool/Microsoft.pm | 1122 + lib/Image/ExifTool/Minolta.pm | 2959 ++ lib/Image/ExifTool/MinoltaRaw.pm | 536 + lib/Image/ExifTool/Motorola.pm | 178 + lib/Image/ExifTool/Nikon.pm | 12029 +++++ lib/Image/ExifTool/NikonCapture.pm | 940 + lib/Image/ExifTool/NikonCustom.pm | 10074 ++++ lib/Image/ExifTool/NikonSettings.pm | 2093 + lib/Image/ExifTool/Nintendo.pm | 128 + lib/Image/ExifTool/OOXML.pm | 410 + lib/Image/ExifTool/Ogg.pm | 240 + lib/Image/ExifTool/Olympus.pm | 4125 ++ lib/Image/ExifTool/OpenEXR.pm | 326 + lib/Image/ExifTool/Opus.pm | 98 + lib/Image/ExifTool/Other.pm | 93 + lib/Image/ExifTool/PCX.pm | 138 + lib/Image/ExifTool/PDF.pm | 2420 + lib/Image/ExifTool/PGF.pm | 143 + lib/Image/ExifTool/PICT.pm | 1260 + lib/Image/ExifTool/PLIST.pm | 462 + lib/Image/ExifTool/PLUS.pm | 2607 ++ lib/Image/ExifTool/PNG.pm | 1590 + lib/Image/ExifTool/PPM.pm | 169 + lib/Image/ExifTool/PSP.pm | 306 + lib/Image/ExifTool/Palm.pm | 403 + lib/Image/ExifTool/Panasonic.pm | 2882 ++ lib/Image/ExifTool/PanasonicRaw.pm | 909 + lib/Image/ExifTool/Parrot.pm | 846 + lib/Image/ExifTool/Pentax.pm | 6329 +++ lib/Image/ExifTool/PhaseOne.pm | 733 + lib/Image/ExifTool/PhotoCD.pm | 506 + lib/Image/ExifTool/PhotoMechanic.pm | 256 + lib/Image/ExifTool/Photoshop.pm | 1174 + lib/Image/ExifTool/PostScript.pm | 802 + lib/Image/ExifTool/PrintIM.pm | 125 + lib/Image/ExifTool/Qualcomm.pm | 1344 + lib/Image/ExifTool/QuickTime.pm | 9733 ++++ lib/Image/ExifTool/QuickTimeStream.pl | 2934 ++ lib/Image/ExifTool/README | 1119 + lib/Image/ExifTool/RIFF.pm | 2065 + lib/Image/ExifTool/RSRC.pm | 247 + lib/Image/ExifTool/RTF.pm | 390 + lib/Image/ExifTool/Radiance.pm | 149 + lib/Image/ExifTool/Rawzor.pm | 190 + lib/Image/ExifTool/Real.pm | 739 + lib/Image/ExifTool/Reconyx.pm | 444 + lib/Image/ExifTool/Red.pm | 325 + lib/Image/ExifTool/Ricoh.pm | 1168 + lib/Image/ExifTool/Samsung.pm | 1747 + lib/Image/ExifTool/Sanyo.pm | 440 + lib/Image/ExifTool/Scalado.pm | 141 + lib/Image/ExifTool/Shift.pl | 644 + lib/Image/ExifTool/Shortcuts.pm | 355 + lib/Image/ExifTool/Sigma.pm | 858 + lib/Image/ExifTool/SigmaRaw.pm | 672 + lib/Image/ExifTool/Sony.pm | 11331 +++++ lib/Image/ExifTool/SonyIDC.pm | 393 + lib/Image/ExifTool/Stim.pm | 196 + lib/Image/ExifTool/TagInfoXML.pm | 840 + lib/Image/ExifTool/TagLookup.pm | 12486 +++++ lib/Image/ExifTool/TagNames.pod | 37990 ++++++++++++++++ lib/Image/ExifTool/Text.pm | 245 + lib/Image/ExifTool/Theora.pm | 145 + lib/Image/ExifTool/Torrent.pm | 332 + lib/Image/ExifTool/Unknown.pm | 66 + lib/Image/ExifTool/VCard.pm | 443 + lib/Image/ExifTool/Validate.pm | 672 + lib/Image/ExifTool/Vorbis.pm | 255 + lib/Image/ExifTool/WTV.pm | 319 + lib/Image/ExifTool/WriteCanonRaw.pl | 637 + lib/Image/ExifTool/WriteExif.pl | 2576 ++ lib/Image/ExifTool/WriteIPTC.pl | 728 + lib/Image/ExifTool/WritePDF.pl | 771 + lib/Image/ExifTool/WritePNG.pl | 414 + lib/Image/ExifTool/WritePhotoshop.pl | 270 + lib/Image/ExifTool/WritePostScript.pl | 700 + lib/Image/ExifTool/WriteQuickTime.pl | 1940 + lib/Image/ExifTool/WriteXMP.pl | 1634 + lib/Image/ExifTool/Writer.pl | 7050 +++ lib/Image/ExifTool/XMP.pm | 4398 ++ lib/Image/ExifTool/XMP2.pl | 2159 + lib/Image/ExifTool/XMPStruct.pl | 882 + lib/Image/ExifTool/ZIP.pm | 735 + lib/Image/ExifTool/ZISRAW.pm | 242 + lib/Image/ExifTool/iWork.pm | 230 + perl-Image-ExifTool.spec | 119 + t/AFCP.t | 45 + t/AFCP_2.out | 39 + t/AFCP_3.out | 20 + t/AIFF.t | 29 + t/AIFF_2.out | 33 + t/APE.t | 39 + t/APE_2.out | 30 + t/APE_3.out | 58 + t/ASF.t | 29 + t/ASF_2.out | 56 + t/Apple.t | 30 + t/Apple_2.out | 79 + t/Audible.t | 29 + t/Audible_2.out | 40 + t/BMP.t | 29 + t/BMP_2.out | 24 + t/BPG.t | 29 + t/BPG_2.out | 92 + t/BigTIFF.t | 29 + t/BigTIFF_2.out | 21 + t/Canon.t | 42 + t/CanonRaw.t | 164 + t/CanonRaw_2.out | 169 + t/CanonRaw_4.out | 221 + t/CanonRaw_5.out | 209 + t/CanonRaw_6.out | 234 + t/CanonRaw_7.out | 251 + t/CanonRaw_8.out | 507 + t/CanonRaw_9.out | 631 + t/CanonVRD.t | 232 + t/CanonVRD_11.out | 121 + t/CanonVRD_12.out | 13 + t/CanonVRD_13.out | 102 + t/CanonVRD_14.out | 101 + t/CanonVRD_15.out | 5 + t/CanonVRD_16.out | 6 + t/CanonVRD_17.out | 5 + t/CanonVRD_18.out | 5 + t/CanonVRD_19.out | 5 + t/CanonVRD_2.out | 119 + t/CanonVRD_20.out | 5 + t/CanonVRD_21.out | 5 + t/CanonVRD_22.out | 1 + t/CanonVRD_24.out | 5 + t/CanonVRD_3.out | 119 + t/CanonVRD_4.out | 2 + t/CanonVRD_5.out | 3 + t/CanonVRD_6.out | 3 + t/CanonVRD_7.out | 2 + t/CanonVRD_8.out | 2 + t/CanonVRD_9.out | 2 + t/Canon_2.out | 358 + t/Canon_3.out | 3 + t/Casio.t | 55 + t/Casio_2.out | 72 + t/Casio_3.out | 102 + t/Casio_4.out | 28 + t/Casio_5.out | 80 + t/Casio_6.out | 117 + t/DICOM.t | 29 + t/DICOM_2.out | 109 + t/DNG.t | 40 + t/DNG_2.out | 329 + t/DNG_3.out | 4 + t/DPX.t | 29 + t/DPX_2.out | 42 + t/DV.t | 28 + t/DV_2.out | 26 + t/DjVu.t | 29 + t/DjVu_2.out | 46 + t/EXE.t | 32 + t/EXE_2.out | 35 + t/EXE_3.out | 10 + t/EXE_4.out | 8 + t/EXE_5.out | 9 + t/EXE_6.out | 8 + t/EXE_7.out | 10 + t/ExifTool.t | 355 + t/ExifTool_16.out | 185 + t/ExifTool_17.out | 599 + t/ExifTool_2.out | 443 + t/ExifTool_20.out | 1 + t/ExifTool_21.out | 1 + t/ExifTool_22.out | 1 + t/ExifTool_23.out | 6 + t/ExifTool_24.out | 3 + t/ExifTool_25.out | 14 + t/ExifTool_26.out | 13 + t/ExifTool_27.out | 4 + t/ExifTool_28.out | 11 + t/ExifTool_29.out | 442 + t/ExifTool_3.out | 89 + t/ExifTool_30.out | 2 + t/ExifTool_31.out | 1 + t/ExifTool_32.out | 5 + t/ExifTool_4.out | 41 + t/ExifTool_5.out | 6 + t/ExifTool_6.out | 71 + t/ExifTool_7.out | 126 + t/ExifTool_8.out | 126 + t/ExifTool_9.out | 33 + t/FITS.t | 28 + t/FITS_2.out | 47 + t/FLAC.t | 38 + t/FLAC_2.out | 27 + t/FLAC_3.out | 21 + t/FLIF.t | 133 + t/FLIF_2.out | 51 + t/FLIF_3.out | 5 + t/FLIF_4.out | 18 + t/FLIF_5.out | 4 + t/FLIF_6.out | 4 + t/FLIR.t | 31 + t/FLIR_2.out | 121 + t/FLIR_3.out | 49 + t/Flash.t | 38 + t/FlashPix.t | 31 + t/FlashPix_2.out | 49 + t/Flash_2.out | 22 + t/Flash_3.out | 55 + t/Font.t | 31 + t/Font_2.out | 24 + t/Font_3.out | 36 + t/Font_4.out | 27 + t/Font_5.out | 27 + t/Font_6.out | 37 + t/Font_7.out | 37 + t/FotoStation.t | 39 + t/FotoStation_2.out | 41 + t/FotoStation_3.out | 3 + t/FujiFilm.t | 79 + t/FujiFilm_2.out | 89 + t/FujiFilm_3.out | 90 + t/FujiFilm_4.out | 147 + t/FujiFilm_5.out | 1 + t/GE.t | 47 + t/GE_2.out | 86 + t/GE_3.out | 86 + t/GIF.t | 84 + t/GIF_2.out | 43 + t/GIF_3.out | 44 + t/GIF_4.out | 19 + t/GIMP.t | 28 + t/GIMP_2.out | 67 + t/GPS.t | 47 + t/GPS_2.out | 96 + t/GPS_3.out | 98 + t/GeoTiff.t | 54 + t/GeoTiff_2.out | 38 + t/GeoTiff_3.out | 38 + t/GeoTiff_4.out | 11 + t/Geotag.t | 223 + t/Geotag_10.out | 15 + t/Geotag_11.out | 3 + t/Geotag_12.out | 5 + t/Geotag_2.out | 9 + t/Geotag_3.out | 6 + t/Geotag_5.out | 1 + t/Geotag_6.out | 9 + t/Geotag_7.out | 58 + t/Geotag_8.out | 15 + t/Geotag_9.out | 7 + t/GoPro.t | 30 + t/GoPro_2.out | 30 + t/HTML.t | 29 + t/HTML_2.out | 69 + t/IPTC.t | 158 + t/IPTC_2.out | 70 + t/IPTC_4.out | 68 + t/IPTC_5.out | 1 + t/IPTC_6.out | 2 + t/IPTC_7.out | 1 + t/IPTC_8.out | 20 + t/ISO.t | 29 + t/ISO_2.out | 19 + t/ITC.t | 29 + t/ITC_2.out | 21 + t/InDesign.t | 62 + t/InDesign_2.out | 20 + t/InDesign_3.out | 22 + t/InDesign_4.out | 12 + t/JSON.t | 31 + t/JSON_2.out | 19 + t/JVC.t | 37 + t/JVC_2.out | 3 + t/JVC_3.out | 3 + t/JXL.t | 50 + t/JXL_2.out | 8 + t/JXL_3.out | 19 + t/Jpeg2000.t | 61 + t/Jpeg2000_2.out | 71 + t/Jpeg2000_3.out | 54 + t/Jpeg2000_4.out | 17 + t/Jpeg2000_5.out | 2 + t/Kodak.t | 41 + t/Kodak_2.out | 111 + t/Kodak_3.out | 121 + t/KyoceraRaw.t | 29 + t/KyoceraRaw_2.out | 28 + t/LNK.t | 29 + t/LNK_2.out | 47 + t/Lang.t | 43 + t/Lang_1.out | 1 + t/Lang_10.out | 47 + t/Lang_11.out | 47 + t/Lang_12.out | 47 + t/Lang_13.out | 47 + t/Lang_14.out | 47 + t/Lang_15.out | 47 + t/Lang_16.out | 47 + t/Lang_17.out | 47 + t/Lang_18.out | 47 + t/Lang_2.out | 47 + t/Lang_3.out | 47 + t/Lang_4.out | 47 + t/Lang_5.out | 47 + t/Lang_6.out | 47 + t/Lang_7.out | 47 + t/Lang_8.out | 47 + t/Lang_9.out | 47 + t/Lytro.t | 29 + t/Lytro_2.out | 109 + t/M2TS.t | 30 + t/M2TS_2.out | 31 + t/MIE.t | 83 + t/MIE_2.out | 69 + t/MIE_3.out | 136 + t/MIE_5.out | 1 + t/MIE_6.out | 1 + t/MIFF.t | 29 + t/MIFF_2.out | 114 + t/MOI.t | 28 + t/MOI_2.out | 11 + t/MP3.t | 30 + t/MP3_2.out | 46 + t/MRC.t | 30 + t/MRC_2.out | 157 + t/MWG.t | 100 + t/MWG_2.out | 13 + t/MWG_3.out | 11 + t/MWG_4.out | 7 + t/MWG_5.out | 23 + t/MWG_6.out | 2 + t/MWG_7.out | 11 + t/MXF.t | 28 + t/MXF_2.out | 79 + t/MacOS.t | 29 + t/MacOS_2.out | 19 + t/Matroska.t | 30 + t/Matroska_2.out | 66 + t/Minolta.t | 51 + t/Minolta_2.out | 135 + t/Minolta_3.out | 148 + t/Minolta_4.out | 156 + t/Motorola.t | 30 + t/Motorola_2.out | 97 + t/Nikon.t | 123 + t/Nikon_2.out | 84 + t/Nikon_3.out | 100 + t/Nikon_4.out | 176 + t/Nikon_5.out | 169 + t/Nikon_7.out | 261 + t/Nikon_8.out | 4 + t/Olympus.t | 95 + t/Olympus_2.out | 81 + t/Olympus_3.out | 83 + t/Olympus_4.out | 194 + t/Olympus_5.out | 266 + t/Olympus_6.out | 153 + t/Olympus_7.out | 484 + t/Olympus_8.out | 15 + t/OpenEXR.t | 29 + t/OpenEXR_2.out | 25 + t/Opus.t | 28 + t/Opus_2.out | 26 + t/PCX.t | 29 + t/PCX_2.out | 26 + t/PDF.t | 304 + t/PDF_10.out | 10 + t/PDF_11.out | 10 + t/PDF_12.out | 9 + t/PDF_14.out | 5 + t/PDF_15.out | 6 + t/PDF_16.out | 4 + t/PDF_17.out | 4 + t/PDF_18.out | 5 + t/PDF_19.out | 6 + t/PDF_2.out | 127 + t/PDF_20.out | 4 + t/PDF_22.out | 3 + t/PDF_4.out | 12 + t/PDF_5.out | 8 + t/PDF_6.out | 9 + t/PDF_7.out | 11 + t/PDF_8.out | 9 + t/PDF_9.out | 9 + t/PFM.t | 29 + t/PFM_2.out | 17 + t/PGF.t | 29 + t/PGF_2.out | 35 + t/PICT.t | 29 + t/PICT_2.out | 17 + t/PLIST.t | 32 + t/PLIST_2.out | 21 + t/PLIST_3.out | 21 + t/PLIST_4.out | 17 + t/PLUS.t | 46 + t/PLUS_2.out | 31 + t/PNG.t | 141 + t/PNG_2.out | 25 + t/PNG_3.out | 123 + t/PNG_4.out | 12 + t/PNG_5.out | 24 + t/PNG_6.out | 5 + t/PNG_7.out | 2 + t/PPM.t | 41 + t/PPM_2.out | 17 + t/PPM_3.out | 11 + t/PSP.t | 29 + t/PSP_2.out | 34 + t/Palm.t | 28 + t/Palm_2.out | 32 + t/Panasonic.t | 61 + t/Panasonic_2.out | 102 + t/Panasonic_3.out | 121 + t/Panasonic_4.out | 213 + t/Panasonic_5.out | 244 + t/Pentax.t | 51 + t/Pentax_2.out | 225 + t/Pentax_3.out | 266 + t/Pentax_4.out | 132 + t/PhaseOne.t | 39 + t/PhaseOne_2.out | 100 + t/PhaseOne_3.out | 171 + t/PhotoCD.t | 29 + t/PhotoCD_2.out | 37 + t/PhotoMechanic.t | 39 + t/PhotoMechanic_2.out | 83 + t/PhotoMechanic_3.out | 2 + t/Photoshop.t | 43 + t/Photoshop_2.out | 109 + t/Photoshop_3.out | 118 + t/PostScript.t | 50 + t/PostScript_2.out | 66 + t/PostScript_3.out | 135 + t/QuickTime.t | 241 + t/QuickTime_10.out | 23 + t/QuickTime_11.out | 46 + t/QuickTime_12.out | 49 + t/QuickTime_13.out | 55 + t/QuickTime_14.out | 22 + t/QuickTime_15.out | 20 + t/QuickTime_16.out | 2 + t/QuickTime_17.out | 2 + t/QuickTime_2.out | 133 + t/QuickTime_3.out | 73 + t/QuickTime_4.out | 16 + t/QuickTime_5.out | 12 + t/QuickTime_6.out | 4 + t/QuickTime_7.out | 27 + t/QuickTime_8.out | 96 + t/QuickTime_9.out | 54 + t/RIFF.t | 32 + t/RIFF_2.out | 25 + t/RIFF_3.out | 55 + t/RIFF_4.out | 18 + t/RTF.t | 28 + t/RTF_2.out | 21 + t/Radiance.t | 29 + t/Radiance_2.out | 24 + t/Real.t | 47 + t/Real_2.out | 69 + t/Real_3.out | 19 + t/Real_4.out | 12 + t/Red.t | 29 + t/Red_2.out | 45 + t/Ricoh.t | 48 + t/Ricoh_2.out | 72 + t/Ricoh_3.out | 100 + t/Ricoh_4.out | 114 + t/Sanyo.t | 40 + t/Sanyo_2.out | 103 + t/Sanyo_3.out | 113 + t/Sigma.t | 61 + t/Sigma_2.out | 93 + t/Sigma_3.out | 96 + t/Sigma_4.out | 65 + t/Sigma_5.out | 194 + t/Sony.t | 63 + t/Sony_2.out | 86 + t/Sony_3.out | 87 + t/Sony_5.out | 34 + t/TestLib.pm | 453 + t/Text.t | 32 + t/Text_2.out | 8 + t/Text_3.out | 8 + t/Text_4.out | 9 + t/Text_5.out | 8 + t/Text_6.out | 7 + t/Text_7.out | 10 + t/Torrent.t | 29 + t/Torrent_2.out | 32 + t/Unknown.t | 37 + t/Unknown_2.out | 92 + t/Unknown_3.out | 92 + t/VCard.t | 32 + t/VCard_2.out | 54 + t/VCard_3.out | 88 + t/Vorbis.t | 29 + t/Vorbis_2.out | 29 + t/WTV.t | 29 + t/WTV_2.out | 80 + t/Writer.t | 1091 + t/Writer_10.out | 246 + t/Writer_11.out | 39 + t/Writer_13.out | 166 + t/Writer_14.out | 69 + t/Writer_15.out | 175 + t/Writer_16.out | 1 + t/Writer_17.out | 1 + t/Writer_18.out | 3 + t/Writer_19.out | 36 + t/Writer_2.out | 172 + t/Writer_22.out | 4 + t/Writer_24.out | 1 + t/Writer_25.out | 40 + t/Writer_26.out | 34 + t/Writer_27.out | 14 + t/Writer_28.out | 1 + t/Writer_29.out | 2 + t/Writer_30.out | 2 + t/Writer_31.out | 109 + t/Writer_32.out | 3 + t/Writer_33.out | 3 + t/Writer_34.out | 3 + t/Writer_35.out | 184 + t/Writer_36.out | 2 + t/Writer_37.out | 2 + t/Writer_38.out | 63 + t/Writer_39.out | 4 + t/Writer_4.out | 87 + t/Writer_40.out | 4 + t/Writer_41.out | 3 + t/Writer_42.out | 5 + t/Writer_43.out | 5 + t/Writer_44.out | 2 + t/Writer_45.out | 1 + t/Writer_46.out | 121 + t/Writer_47.out | 57 + t/Writer_48.out | 31 + t/Writer_50.out | 3 + t/Writer_51.out | 430 + t/Writer_52.out | 23 + t/Writer_53.out | 36 + t/Writer_54.out | 2 + t/Writer_55.out | 7 + t/Writer_56.out | 4 + t/Writer_58.out | 44 + t/Writer_59.out | 2 + t/Writer_6.out | 186 + t/Writer_7.out | 151 + t/Writer_9.out | 243 + t/XMP.t | 701 + t/XMP_10.out | 37 + t/XMP_11.out | 81 + t/XMP_12.out | 4 + t/XMP_13.out | 5 + t/XMP_14.out | 3 + t/XMP_15.out | 3 + t/XMP_16.out | 5 + t/XMP_17.out | 6 + t/XMP_18.out | 10 + t/XMP_19.out | 35 + t/XMP_2.out | 140 + t/XMP_20.out | 35 + t/XMP_21.out | 38 + t/XMP_22.out | 38 + t/XMP_23.out | 9 + t/XMP_24.out | 32 + t/XMP_25.out | 28 + t/XMP_26.out | 51 + t/XMP_27.out | 95 + t/XMP_28.out | 46 + t/XMP_29.out | 26 + t/XMP_3.out | 138 + t/XMP_30.out | 86 + t/XMP_31.out | 20 + t/XMP_32.out | 2 + t/XMP_34.out | 2 + t/XMP_36.out | 19 + t/XMP_37.out | 36 + t/XMP_39.out | 45 + t/XMP_40.out | 3 + t/XMP_41.out | 247 + t/XMP_42.out | 8 + t/XMP_43.out | 6 + t/XMP_44.out | 35 + t/XMP_45.out | 23 + t/XMP_46.out | 1 + t/XMP_47.out | 2 + t/XMP_48.out | 2 + t/XMP_49.out | 2 + t/XMP_5.out | 30 + t/XMP_50.out | 35 + t/XMP_52.out | 39 + t/XMP_53.out | 67 + t/XMP_54.out | 1 + t/XMP_6.out | 89 + t/XMP_7.out | 118 + t/XMP_8.out | 20 + t/XMP_9.out | 52 + t/ZIP.t | 70 + t/ZIP_2.out | 19 + t/ZIP_3.out | 18 + t/ZIP_4.out | 214 + t/ZIP_5.out | 136 + t/ZIP_6.out | 50 + t/ZIP_7.out | 29 + t/ZISRAW.t | 29 + t/ZISRAW_2.out | 42 + t/images/AFCP.jpg | Bin 0 -> 1110 bytes t/images/AIFF.aif | Bin 0 -> 290 bytes t/images/APE.ape | Bin 0 -> 2166 bytes t/images/APE.mpc | Bin 0 -> 2513 bytes t/images/ASF.wmv | Bin 0 -> 12379 bytes t/images/Apple.jpg | Bin 0 -> 2355 bytes t/images/Audible.aa | Bin 0 -> 1322 bytes t/images/BMP.bmp | Bin 0 -> 1142 bytes t/images/BPG.bpg | Bin 0 -> 1863 bytes t/images/BigTIFF.btf | Bin 0 -> 384 bytes t/images/Canon.jpg | Bin 0 -> 2697 bytes t/images/Canon1DmkIII.jpg | Bin 0 -> 8337 bytes t/images/CanonRaw.cr2 | Bin 0 -> 8724 bytes t/images/CanonRaw.cr3 | Bin 0 -> 52502 bytes t/images/CanonRaw.crw | Bin 0 -> 6816 bytes t/images/CanonVRD.dr4 | Bin 0 -> 5472 bytes t/images/CanonVRD.vrd | Bin 0 -> 1768 bytes t/images/CaptureOne.eip | Bin 0 -> 5448 bytes t/images/Casio.jpg | Bin 0 -> 1203 bytes t/images/Casio2.jpg | Bin 0 -> 1699 bytes t/images/CasioQVCI.jpg | Bin 0 -> 407 bytes t/images/DICOM.dcm | Bin 0 -> 1860 bytes t/images/DNG.dng | Bin 0 -> 13662 bytes t/images/DPX.dpx | Bin 0 -> 2080 bytes t/images/DV.dv | Bin 0 -> 4400 bytes t/images/DjVu.djvu | Bin 0 -> 930 bytes t/images/EXE.a | Bin 0 -> 784 bytes t/images/EXE.dylib | Bin 0 -> 4144 bytes t/images/EXE.elf | Bin 0 -> 2860 bytes t/images/EXE.exe | Bin 0 -> 5120 bytes t/images/EXE.macho | Bin 0 -> 9484 bytes t/images/EXE.so | Bin 0 -> 5608 bytes t/images/ExifTool.jpg | Bin 0 -> 25766 bytes t/images/ExifTool.jps | Bin 0 -> 283 bytes t/images/ExifTool.tif | Bin 0 -> 4864 bytes t/images/ExtendedXMP.jpg | Bin 0 -> 1380 bytes t/images/FITS.fits | 1 + t/images/FLAC.flac | Bin 0 -> 282 bytes t/images/FLAC.ogg | Bin 0 -> 151 bytes t/images/FLIF.flif | Bin 0 -> 674 bytes t/images/FLIR.fpf | Bin 0 -> 914 bytes t/images/FLIR.jpg | Bin 0 -> 7338 bytes t/images/Flash.flv | Bin 0 -> 1358 bytes t/images/Flash.swf | Bin 0 -> 384 bytes t/images/FlashPix.ppt | Bin 0 -> 9728 bytes t/images/Font.afm | 28 + t/images/Font.dfont | Bin 0 -> 1744 bytes t/images/Font.pfa | 38 + t/images/Font.pfb | Bin 0 -> 1423 bytes t/images/Font.pfm | Bin 0 -> 240 bytes t/images/Font.ttf | Bin 0 -> 1252 bytes t/images/FotoStation.jpg | Bin 0 -> 4320 bytes t/images/FujiFilm.jpg | Bin 0 -> 1373 bytes t/images/FujiFilm.raf | Bin 0 -> 38452 bytes t/images/GE.jpg | Bin 0 -> 1467 bytes t/images/GIF.gif | Bin 0 -> 2321 bytes t/images/GIMP.xcf | Bin 0 -> 2405 bytes t/images/GPS.jpg | Bin 0 -> 2133 bytes t/images/GeoTiff.tif | Bin 0 -> 2660 bytes t/images/Geotag.gpx | 23 + t/images/Geotag.igc | 24 + t/images/Geotag.kml | 55 + t/images/Geotag.log | 13 + t/images/Geotag.xml | 23 + t/images/Geotag2.log | 7 + t/images/Geotag3.log | 7 + t/images/Geotag_DJI_2020-12-02_[07-50-31].csv | 94 + t/images/GoPro.jpg | Bin 0 -> 4601 bytes t/images/HTML.html | 77 + t/images/ICC_Profile.icc | Bin 0 -> 492 bytes t/images/IPTC.jpg | Bin 0 -> 9851 bytes t/images/ISO.iso | Bin 0 -> 40960 bytes t/images/ITC.itc | Bin 0 -> 672 bytes t/images/InDesign.indd | Bin 0 -> 12288 bytes t/images/JSON.json | 19 + t/images/JVC.jpg | Bin 0 -> 1253 bytes t/images/JVC2.jpg | Bin 0 -> 947 bytes t/images/JXL.jxl | 2 + t/images/Jpeg2000.j2c | Bin 0 -> 618 bytes t/images/Jpeg2000.jp2 | Bin 0 -> 2028 bytes t/images/Kodak.jpg | Bin 0 -> 3375 bytes t/images/KyoceraRaw.raw | Bin 0 -> 166 bytes t/images/LNK.lnk | Bin 0 -> 876 bytes t/images/Lytro.lfp | Bin 0 -> 4400 bytes t/images/M2TS.mts | Bin 0 -> 1344 bytes t/images/MIE.mie | Bin 0 -> 2055 bytes t/images/MIFF.miff | Bin 0 -> 3750 bytes t/images/MOI.moi | Bin 0 -> 320 bytes t/images/MP3.mp3 | Bin 0 -> 395 bytes t/images/MRC.mrc | Bin 0 -> 2560 bytes t/images/MWG.jpg | Bin 0 -> 2255 bytes t/images/MXF.mxf | Bin 0 -> 7510 bytes t/images/MacOS.macos | Bin 0 -> 4096 bytes t/images/Matroska.mkv | Bin 0 -> 507 bytes t/images/Minolta.jpg | Bin 0 -> 13501 bytes t/images/Minolta.mrw | Bin 0 -> 2596 bytes t/images/Motorola.jpg | Bin 0 -> 2489 bytes t/images/Nikon.jpg | Bin 0 -> 1703 bytes t/images/Nikon.nef | Bin 0 -> 6188 bytes t/images/NikonD2Hs.jpg | Bin 0 -> 3505 bytes t/images/NikonD70.jpg | Bin 0 -> 3661 bytes t/images/OOXML.docx | Bin 0 -> 7521 bytes t/images/Olympus.dss | Bin 0 -> 80 bytes t/images/Olympus.jpg | Bin 0 -> 1573 bytes t/images/Olympus2.jpg | Bin 0 -> 7701 bytes t/images/OlympusE1.jpg | Bin 0 -> 7365 bytes t/images/OpenDoc.ods | Bin 0 -> 7037 bytes t/images/OpenEXR.exr | Bin 0 -> 395 bytes t/images/Opus.opus | Bin 0 -> 1128 bytes t/images/PCX.pcx | Bin 0 -> 160 bytes t/images/PDF.pdf | Bin 0 -> 8907 bytes t/images/PDF2.pdf | Bin 0 -> 2213 bytes t/images/PFM.pfm | 4 + t/images/PGF.pgf | Bin 0 -> 286 bytes t/images/PICT.pict | Bin 0 -> 150 bytes t/images/PLIST-bin.plist | Bin 0 -> 351 bytes t/images/PLIST-xml.plist | 35 + t/images/PLIST.aae | 24 + t/images/PLUS.xmp | 127 + t/images/PNG.png | Bin 0 -> 572 bytes t/images/PPM.ppm | 5 + t/images/PSP.psp | Bin 0 -> 1703 bytes t/images/Palm.mobi | Bin 0 -> 1382 bytes t/images/Panasonic.jpg | Bin 0 -> 7099 bytes t/images/Panasonic.rw2 | Bin 0 -> 12344 bytes t/images/Pentax.avi | Bin 0 -> 1672 bytes t/images/Pentax.jpg | Bin 0 -> 2721 bytes t/images/PhaseOne.iiq | Bin 0 -> 3364 bytes t/images/PhotoCD.pcd | Bin 0 -> 4116 bytes t/images/PhotoMechanic.jpg | Bin 0 -> 3417 bytes t/images/Photoshop.psd | Bin 0 -> 17369 bytes t/images/PostScript.eps | 108 + t/images/QuickTime.heic | Bin 0 -> 623 bytes t/images/QuickTime.m4a | Bin 0 -> 5237 bytes t/images/QuickTime.mov | Bin 0 -> 3871 bytes t/images/RIFF.avi | Bin 0 -> 1262 bytes t/images/RIFF.wav | Bin 0 -> 224 bytes t/images/RIFF.webp | Bin 0 -> 58 bytes t/images/RTF.rtf | 25 + t/images/Radiance.hdr | Bin 0 -> 587 bytes t/images/Real.ra | Bin 0 -> 130 bytes t/images/Real.ram | 1 + t/images/Real.rm | Bin 0 -> 1915 bytes t/images/Red.r3d | Bin 0 -> 1160 bytes t/images/Ricoh.jpg | Bin 0 -> 1903 bytes t/images/Ricoh2.jpg | Bin 0 -> 3187 bytes t/images/Sanyo.jpg | Bin 0 -> 2165 bytes t/images/Sigma.jpg | Bin 0 -> 1531 bytes t/images/Sigma.x3f | Bin 0 -> 1464 bytes t/images/SigmaDP2.x3f | Bin 0 -> 4364 bytes t/images/Sony.jpg | Bin 0 -> 2779 bytes t/images/Sony.pmp | Bin 0 -> 375 bytes t/images/Text.csv | 3 + t/images/Text1.txt | 1 + t/images/Text2.txt | 1 + t/images/Text3.txt | 1 + t/images/Text4.txt | 1 + t/images/Text5.txt | Bin 0 -> 36 bytes t/images/Torrent.torrent | 1 + t/images/Unknown.jpg | Bin 0 -> 7199 bytes t/images/VCard.ics | 94 + t/images/VCard.vcf | 45 + t/images/Vorbis.ogg | Bin 0 -> 5371 bytes t/images/WTV.wtv | Bin 0 -> 7680 bytes t/images/Writer.jpg | Bin 0 -> 251 bytes t/images/XMP.inx | 108 + t/images/XMP.jpg | Bin 0 -> 10314 bytes t/images/XMP.svg | 33 + t/images/XMP.xml | 98 + t/images/XMP.xmp | 99 + t/images/XMP2.xmp | 25 + t/images/XMP3.xmp | 69 + t/images/XMP4.xmp | 93 + t/images/XMP5.xmp | 157 + t/images/XMP6.xmp | 48 + t/images/XMP7.xmp | 26 + t/images/XMP8.xmp | 38 + t/images/XMP9.xmp | 34 + t/images/ZIP.gz | Bin 0 -> 71 bytes t/images/ZIP.zip | Bin 0 -> 167 bytes t/images/ZISRAW.czi | Bin 0 -> 1856 bytes t/images/iWork.numbers | Bin 0 -> 1359 bytes 1130 files changed, 615737 insertions(+) create mode 100644 Changes create mode 100644 MANIFEST create mode 100644 META.json create mode 100644 META.yml create mode 100644 Makefile.PL create mode 100644 README create mode 100644 arg_files/exif2iptc.args create mode 100644 arg_files/exif2xmp.args create mode 100644 arg_files/gps2xmp.args create mode 100644 arg_files/iptc2exif.args create mode 100644 arg_files/iptc2xmp.args create mode 100644 arg_files/iptcCore.args create mode 100644 arg_files/pdf2xmp.args create mode 100644 arg_files/xmp2exif.args create mode 100644 arg_files/xmp2gps.args create mode 100644 arg_files/xmp2iptc.args create mode 100644 arg_files/xmp2pdf.args create mode 100644 config_files/acdsee.config create mode 100644 config_files/age.config create mode 100644 config_files/bibble.config create mode 100644 config_files/convert_regions.config create mode 100644 config_files/cuepointlist.config create mode 100644 config_files/depthmap.config create mode 100644 config_files/example.config create mode 100644 config_files/fotoware.config create mode 100644 config_files/gps2utm.config create mode 100644 config_files/nksc.config create mode 100644 config_files/photoshop_paths.config create mode 100644 config_files/picasa_faces.config create mode 100644 config_files/pix4d.config create mode 100644 config_files/rotate_regions.config create mode 100644 config_files/tiff_version.config create mode 100644 config_files/time_zone.config create mode 100755 exiftool create mode 100644 fmt_files/gpx.fmt create mode 100644 fmt_files/gpx_wpt.fmt create mode 100644 fmt_files/kml.fmt create mode 100644 fmt_files/kml_track.fmt create mode 100644 html/ExifTool.html create mode 100644 html/MIE1.1-20070121.pdf create mode 100644 html/Shift.html create mode 100644 html/TagNames/AFCP.html create mode 100644 html/TagNames/AIFF.html create mode 100644 html/TagNames/APE.html create mode 100644 html/TagNames/APP12.html create mode 100644 html/TagNames/ASF.html create mode 100644 html/TagNames/Apple.html create mode 100644 html/TagNames/Audible.html create mode 100644 html/TagNames/BMP.html create mode 100644 html/TagNames/BPG.html create mode 100644 html/TagNames/CBOR.html create mode 100644 html/TagNames/Canon.html create mode 100644 html/TagNames/CanonCustom.html create mode 100644 html/TagNames/CanonRaw.html create mode 100644 html/TagNames/CanonVRD.html create mode 100644 html/TagNames/Casio.html create mode 100644 html/TagNames/Composite.html create mode 100644 html/TagNames/DICOM.html create mode 100644 html/TagNames/DJI.html create mode 100644 html/TagNames/DNG.html create mode 100644 html/TagNames/DPX.html create mode 100644 html/TagNames/DV.html create mode 100644 html/TagNames/DarwinCore.html create mode 100644 html/TagNames/DjVu.html create mode 100644 html/TagNames/EXE.html create mode 100644 html/TagNames/EXIF.html create mode 100644 html/TagNames/Extra.html create mode 100644 html/TagNames/FITS.html create mode 100644 html/TagNames/FLAC.html create mode 100644 html/TagNames/FLIF.html create mode 100644 html/TagNames/FLIR.html create mode 100644 html/TagNames/Flash.html create mode 100644 html/TagNames/FlashPix.html create mode 100644 html/TagNames/Font.html create mode 100644 html/TagNames/FotoStation.html create mode 100644 html/TagNames/FujiFilm.html create mode 100644 html/TagNames/GE.html create mode 100644 html/TagNames/GIF.html create mode 100644 html/TagNames/GIMP.html create mode 100644 html/TagNames/GPS.html create mode 100644 html/TagNames/GeoTiff.html create mode 100644 html/TagNames/GoPro.html create mode 100644 html/TagNames/H264.html create mode 100644 html/TagNames/HP.html create mode 100644 html/TagNames/HTML.html create mode 100644 html/TagNames/ICC_Profile.html create mode 100644 html/TagNames/ID3.html create mode 100644 html/TagNames/IPTC.html create mode 100644 html/TagNames/ISO.html create mode 100644 html/TagNames/ITC.html create mode 100644 html/TagNames/JFIF.html create mode 100644 html/TagNames/JPEG.html create mode 100644 html/TagNames/JSON.html create mode 100644 html/TagNames/JVC.html create mode 100644 html/TagNames/Jpeg2000.html create mode 100644 html/TagNames/Kodak.html create mode 100644 html/TagNames/KyoceraRaw.html create mode 100644 html/TagNames/LIF.html create mode 100644 html/TagNames/LNK.html create mode 100644 html/TagNames/Leaf.html create mode 100644 html/TagNames/Lytro.html create mode 100644 html/TagNames/M2TS.html create mode 100644 html/TagNames/MIE.html create mode 100644 html/TagNames/MIFF.html create mode 100644 html/TagNames/MNG.html create mode 100644 html/TagNames/MOI.html create mode 100644 html/TagNames/MPC.html create mode 100644 html/TagNames/MPEG.html create mode 100644 html/TagNames/MPF.html create mode 100644 html/TagNames/MRC.html create mode 100644 html/TagNames/MWG.html create mode 100644 html/TagNames/MXF.html create mode 100644 html/TagNames/MacOS.html create mode 100644 html/TagNames/Matroska.html create mode 100644 html/TagNames/Microsoft.html create mode 100644 html/TagNames/Minolta.html create mode 100644 html/TagNames/MinoltaRaw.html create mode 100644 html/TagNames/Motorola.html create mode 100644 html/TagNames/Nikon.html create mode 100644 html/TagNames/NikonCapture.html create mode 100644 html/TagNames/NikonCustom.html create mode 100644 html/TagNames/NikonSettings.html create mode 100644 html/TagNames/Nintendo.html create mode 100644 html/TagNames/OOXML.html create mode 100644 html/TagNames/Ogg.html create mode 100644 html/TagNames/Olympus.html create mode 100644 html/TagNames/OpenEXR.html create mode 100644 html/TagNames/Opus.html create mode 100644 html/TagNames/Other.html create mode 100644 html/TagNames/PCX.html create mode 100644 html/TagNames/PDF.html create mode 100644 html/TagNames/PGF.html create mode 100644 html/TagNames/PICT.html create mode 100644 html/TagNames/PLIST.html create mode 100644 html/TagNames/PLUS.html create mode 100644 html/TagNames/PNG.html create mode 100644 html/TagNames/PSP.html create mode 100644 html/TagNames/Palm.html create mode 100644 html/TagNames/Panasonic.html create mode 100644 html/TagNames/PanasonicRaw.html create mode 100644 html/TagNames/Parrot.html create mode 100644 html/TagNames/Pentax.html create mode 100644 html/TagNames/PhaseOne.html create mode 100644 html/TagNames/PhotoCD.html create mode 100644 html/TagNames/PhotoMechanic.html create mode 100644 html/TagNames/Photoshop.html create mode 100644 html/TagNames/PostScript.html create mode 100644 html/TagNames/PrintIM.html create mode 100644 html/TagNames/Qualcomm.html create mode 100644 html/TagNames/QuickTime.html create mode 100644 html/TagNames/RIFF.html create mode 100644 html/TagNames/RSRC.html create mode 100644 html/TagNames/RTF.html create mode 100644 html/TagNames/Radiance.html create mode 100644 html/TagNames/Rawzor.html create mode 100644 html/TagNames/Real.html create mode 100644 html/TagNames/Reconyx.html create mode 100644 html/TagNames/Red.html create mode 100644 html/TagNames/Ricoh.html create mode 100644 html/TagNames/Samsung.html create mode 100644 html/TagNames/Sanyo.html create mode 100644 html/TagNames/Scalado.html create mode 100644 html/TagNames/Shortcuts.html create mode 100644 html/TagNames/Sigma.html create mode 100644 html/TagNames/SigmaRaw.html create mode 100644 html/TagNames/Sony.html create mode 100644 html/TagNames/SonyIDC.html create mode 100644 html/TagNames/Stim.html create mode 100644 html/TagNames/Text.html create mode 100644 html/TagNames/Theora.html create mode 100644 html/TagNames/Torrent.html create mode 100644 html/TagNames/Unknown.html create mode 100644 html/TagNames/VCard.html create mode 100644 html/TagNames/Vorbis.html create mode 100644 html/TagNames/WTV.html create mode 100644 html/TagNames/XMP.html create mode 100644 html/TagNames/ZIP.html create mode 100644 html/TagNames/ZISRAW.html create mode 100644 html/TagNames/iWork.html create mode 100644 html/TagNames/index.html create mode 100644 html/TagNames/style.css create mode 100644 html/ancient_history.html create mode 100644 html/canon_raw.html create mode 100644 html/commentary.html create mode 100644 html/config.html create mode 100644 html/data_members.html create mode 100644 html/exiftool_pod.html create mode 100644 html/faq.html create mode 100644 html/filename.html create mode 100644 html/geotag.html create mode 100644 html/history.html create mode 100644 html/htmldump.html create mode 100644 html/idiosyncracies.html create mode 100644 html/index.html create mode 100644 html/install.html create mode 100644 html/metafiles.html create mode 100644 html/mistakes.html create mode 100644 html/overview.png create mode 100644 html/standards.html create mode 100644 html/struct.html create mode 100644 html/style.css create mode 100644 html/under.html create mode 100644 html/verbose.html create mode 100644 html/writing.html create mode 100644 lib/File/RandomAccess.pm create mode 100644 lib/File/RandomAccess.pod create mode 100644 lib/Image/ExifTool.pm create mode 100644 lib/Image/ExifTool.pod create mode 100644 lib/Image/ExifTool/AES.pm create mode 100644 lib/Image/ExifTool/AFCP.pm create mode 100644 lib/Image/ExifTool/AIFF.pm create mode 100644 lib/Image/ExifTool/APE.pm create mode 100644 lib/Image/ExifTool/APP12.pm create mode 100644 lib/Image/ExifTool/ASF.pm create mode 100644 lib/Image/ExifTool/Apple.pm create mode 100644 lib/Image/ExifTool/Audible.pm create mode 100644 lib/Image/ExifTool/BMP.pm create mode 100644 lib/Image/ExifTool/BPG.pm create mode 100644 lib/Image/ExifTool/BZZ.pm create mode 100644 lib/Image/ExifTool/BigTIFF.pm create mode 100644 lib/Image/ExifTool/BuildTagLookup.pm create mode 100644 lib/Image/ExifTool/CBOR.pm create mode 100644 lib/Image/ExifTool/Canon.pm create mode 100644 lib/Image/ExifTool/CanonCustom.pm create mode 100644 lib/Image/ExifTool/CanonRaw.pm create mode 100644 lib/Image/ExifTool/CanonVRD.pm create mode 100644 lib/Image/ExifTool/CaptureOne.pm create mode 100644 lib/Image/ExifTool/Casio.pm create mode 100644 lib/Image/ExifTool/Charset.pm create mode 100644 lib/Image/ExifTool/Charset/Arabic.pm create mode 100644 lib/Image/ExifTool/Charset/Baltic.pm create mode 100644 lib/Image/ExifTool/Charset/Cyrillic.pm create mode 100644 lib/Image/ExifTool/Charset/DOSCyrillic.pm create mode 100644 lib/Image/ExifTool/Charset/DOSLatin1.pm create mode 100644 lib/Image/ExifTool/Charset/DOSLatinUS.pm create mode 100644 lib/Image/ExifTool/Charset/Greek.pm create mode 100644 lib/Image/ExifTool/Charset/Hebrew.pm create mode 100644 lib/Image/ExifTool/Charset/JIS.pm create mode 100644 lib/Image/ExifTool/Charset/Latin.pm create mode 100644 lib/Image/ExifTool/Charset/Latin2.pm create mode 100644 lib/Image/ExifTool/Charset/MacArabic.pm create mode 100644 lib/Image/ExifTool/Charset/MacChineseCN.pm create mode 100644 lib/Image/ExifTool/Charset/MacChineseTW.pm create mode 100644 lib/Image/ExifTool/Charset/MacCroatian.pm create mode 100644 lib/Image/ExifTool/Charset/MacCyrillic.pm create mode 100644 lib/Image/ExifTool/Charset/MacGreek.pm create mode 100644 lib/Image/ExifTool/Charset/MacHebrew.pm create mode 100644 lib/Image/ExifTool/Charset/MacIceland.pm create mode 100644 lib/Image/ExifTool/Charset/MacJapanese.pm create mode 100644 lib/Image/ExifTool/Charset/MacKorean.pm create mode 100644 lib/Image/ExifTool/Charset/MacLatin2.pm create mode 100644 lib/Image/ExifTool/Charset/MacRSymbol.pm create mode 100644 lib/Image/ExifTool/Charset/MacRoman.pm create mode 100644 lib/Image/ExifTool/Charset/MacRomanian.pm create mode 100644 lib/Image/ExifTool/Charset/MacThai.pm create mode 100644 lib/Image/ExifTool/Charset/MacTurkish.pm create mode 100644 lib/Image/ExifTool/Charset/PDFDoc.pm create mode 100644 lib/Image/ExifTool/Charset/ShiftJIS.pm create mode 100644 lib/Image/ExifTool/Charset/Symbol.pm create mode 100644 lib/Image/ExifTool/Charset/Thai.pm create mode 100644 lib/Image/ExifTool/Charset/Turkish.pm create mode 100644 lib/Image/ExifTool/Charset/Vietnam.pm create mode 100644 lib/Image/ExifTool/DICOM.pm create mode 100644 lib/Image/ExifTool/DJI.pm create mode 100644 lib/Image/ExifTool/DNG.pm create mode 100644 lib/Image/ExifTool/DPX.pm create mode 100644 lib/Image/ExifTool/DV.pm create mode 100644 lib/Image/ExifTool/DarwinCore.pm create mode 100644 lib/Image/ExifTool/DjVu.pm create mode 100644 lib/Image/ExifTool/EXE.pm create mode 100644 lib/Image/ExifTool/Exif.pm create mode 100644 lib/Image/ExifTool/FITS.pm create mode 100644 lib/Image/ExifTool/FLAC.pm create mode 100644 lib/Image/ExifTool/FLIF.pm create mode 100644 lib/Image/ExifTool/FLIR.pm create mode 100644 lib/Image/ExifTool/Fixup.pm create mode 100644 lib/Image/ExifTool/Flash.pm create mode 100644 lib/Image/ExifTool/FlashPix.pm create mode 100644 lib/Image/ExifTool/Font.pm create mode 100644 lib/Image/ExifTool/FotoStation.pm create mode 100644 lib/Image/ExifTool/FujiFilm.pm create mode 100644 lib/Image/ExifTool/GE.pm create mode 100644 lib/Image/ExifTool/GIF.pm create mode 100644 lib/Image/ExifTool/GIMP.pm create mode 100644 lib/Image/ExifTool/GPS.pm create mode 100644 lib/Image/ExifTool/GeoTiff.pm create mode 100644 lib/Image/ExifTool/Geotag.pm create mode 100644 lib/Image/ExifTool/GoPro.pm create mode 100644 lib/Image/ExifTool/H264.pm create mode 100644 lib/Image/ExifTool/HP.pm create mode 100644 lib/Image/ExifTool/HTML.pm create mode 100644 lib/Image/ExifTool/HtmlDump.pm create mode 100644 lib/Image/ExifTool/ICC_Profile.pm create mode 100644 lib/Image/ExifTool/ID3.pm create mode 100644 lib/Image/ExifTool/IPTC.pm create mode 100644 lib/Image/ExifTool/ISO.pm create mode 100644 lib/Image/ExifTool/ITC.pm create mode 100644 lib/Image/ExifTool/Import.pm create mode 100644 lib/Image/ExifTool/InDesign.pm create mode 100644 lib/Image/ExifTool/JPEG.pm create mode 100644 lib/Image/ExifTool/JPEGDigest.pm create mode 100644 lib/Image/ExifTool/JSON.pm create mode 100644 lib/Image/ExifTool/JVC.pm create mode 100644 lib/Image/ExifTool/Jpeg2000.pm create mode 100644 lib/Image/ExifTool/Kodak.pm create mode 100644 lib/Image/ExifTool/KyoceraRaw.pm create mode 100644 lib/Image/ExifTool/LIF.pm create mode 100644 lib/Image/ExifTool/LNK.pm create mode 100644 lib/Image/ExifTool/Lang/cs.pm create mode 100644 lib/Image/ExifTool/Lang/de.pm create mode 100644 lib/Image/ExifTool/Lang/en_ca.pm create mode 100644 lib/Image/ExifTool/Lang/en_gb.pm create mode 100644 lib/Image/ExifTool/Lang/es.pm create mode 100644 lib/Image/ExifTool/Lang/fi.pm create mode 100644 lib/Image/ExifTool/Lang/fr.pm create mode 100644 lib/Image/ExifTool/Lang/it.pm create mode 100644 lib/Image/ExifTool/Lang/ja.pm create mode 100644 lib/Image/ExifTool/Lang/ko.pm create mode 100644 lib/Image/ExifTool/Lang/nl.pm create mode 100644 lib/Image/ExifTool/Lang/pl.pm create mode 100644 lib/Image/ExifTool/Lang/ru.pm create mode 100644 lib/Image/ExifTool/Lang/sv.pm create mode 100644 lib/Image/ExifTool/Lang/tr.pm create mode 100644 lib/Image/ExifTool/Lang/zh_cn.pm create mode 100644 lib/Image/ExifTool/Lang/zh_tw.pm create mode 100644 lib/Image/ExifTool/Leaf.pm create mode 100644 lib/Image/ExifTool/Lytro.pm create mode 100644 lib/Image/ExifTool/M2TS.pm create mode 100644 lib/Image/ExifTool/MIE.pm create mode 100644 lib/Image/ExifTool/MIEUnits.pod create mode 100644 lib/Image/ExifTool/MIFF.pm create mode 100644 lib/Image/ExifTool/MNG.pm create mode 100644 lib/Image/ExifTool/MOI.pm create mode 100644 lib/Image/ExifTool/MPC.pm create mode 100644 lib/Image/ExifTool/MPEG.pm create mode 100644 lib/Image/ExifTool/MPF.pm create mode 100644 lib/Image/ExifTool/MRC.pm create mode 100644 lib/Image/ExifTool/MWG.pm create mode 100644 lib/Image/ExifTool/MXF.pm create mode 100644 lib/Image/ExifTool/MacOS.pm create mode 100644 lib/Image/ExifTool/MakerNotes.pm create mode 100644 lib/Image/ExifTool/Matroska.pm create mode 100644 lib/Image/ExifTool/Microsoft.pm create mode 100644 lib/Image/ExifTool/Minolta.pm create mode 100644 lib/Image/ExifTool/MinoltaRaw.pm create mode 100644 lib/Image/ExifTool/Motorola.pm create mode 100644 lib/Image/ExifTool/Nikon.pm create mode 100644 lib/Image/ExifTool/NikonCapture.pm create mode 100644 lib/Image/ExifTool/NikonCustom.pm create mode 100644 lib/Image/ExifTool/NikonSettings.pm create mode 100644 lib/Image/ExifTool/Nintendo.pm create mode 100644 lib/Image/ExifTool/OOXML.pm create mode 100644 lib/Image/ExifTool/Ogg.pm create mode 100644 lib/Image/ExifTool/Olympus.pm create mode 100644 lib/Image/ExifTool/OpenEXR.pm create mode 100644 lib/Image/ExifTool/Opus.pm create mode 100644 lib/Image/ExifTool/Other.pm create mode 100644 lib/Image/ExifTool/PCX.pm create mode 100644 lib/Image/ExifTool/PDF.pm create mode 100644 lib/Image/ExifTool/PGF.pm create mode 100644 lib/Image/ExifTool/PICT.pm create mode 100644 lib/Image/ExifTool/PLIST.pm create mode 100644 lib/Image/ExifTool/PLUS.pm create mode 100644 lib/Image/ExifTool/PNG.pm create mode 100644 lib/Image/ExifTool/PPM.pm create mode 100644 lib/Image/ExifTool/PSP.pm create mode 100644 lib/Image/ExifTool/Palm.pm create mode 100644 lib/Image/ExifTool/Panasonic.pm create mode 100644 lib/Image/ExifTool/PanasonicRaw.pm create mode 100644 lib/Image/ExifTool/Parrot.pm create mode 100644 lib/Image/ExifTool/Pentax.pm create mode 100644 lib/Image/ExifTool/PhaseOne.pm create mode 100644 lib/Image/ExifTool/PhotoCD.pm create mode 100644 lib/Image/ExifTool/PhotoMechanic.pm create mode 100644 lib/Image/ExifTool/Photoshop.pm create mode 100644 lib/Image/ExifTool/PostScript.pm create mode 100644 lib/Image/ExifTool/PrintIM.pm create mode 100644 lib/Image/ExifTool/Qualcomm.pm create mode 100644 lib/Image/ExifTool/QuickTime.pm create mode 100644 lib/Image/ExifTool/QuickTimeStream.pl create mode 100644 lib/Image/ExifTool/README create mode 100644 lib/Image/ExifTool/RIFF.pm create mode 100644 lib/Image/ExifTool/RSRC.pm create mode 100644 lib/Image/ExifTool/RTF.pm create mode 100644 lib/Image/ExifTool/Radiance.pm create mode 100644 lib/Image/ExifTool/Rawzor.pm create mode 100644 lib/Image/ExifTool/Real.pm create mode 100644 lib/Image/ExifTool/Reconyx.pm create mode 100644 lib/Image/ExifTool/Red.pm create mode 100644 lib/Image/ExifTool/Ricoh.pm create mode 100644 lib/Image/ExifTool/Samsung.pm create mode 100644 lib/Image/ExifTool/Sanyo.pm create mode 100644 lib/Image/ExifTool/Scalado.pm create mode 100644 lib/Image/ExifTool/Shift.pl create mode 100644 lib/Image/ExifTool/Shortcuts.pm create mode 100644 lib/Image/ExifTool/Sigma.pm create mode 100644 lib/Image/ExifTool/SigmaRaw.pm create mode 100644 lib/Image/ExifTool/Sony.pm create mode 100644 lib/Image/ExifTool/SonyIDC.pm create mode 100644 lib/Image/ExifTool/Stim.pm create mode 100644 lib/Image/ExifTool/TagInfoXML.pm create mode 100644 lib/Image/ExifTool/TagLookup.pm create mode 100644 lib/Image/ExifTool/TagNames.pod create mode 100644 lib/Image/ExifTool/Text.pm create mode 100644 lib/Image/ExifTool/Theora.pm create mode 100644 lib/Image/ExifTool/Torrent.pm create mode 100644 lib/Image/ExifTool/Unknown.pm create mode 100644 lib/Image/ExifTool/VCard.pm create mode 100644 lib/Image/ExifTool/Validate.pm create mode 100644 lib/Image/ExifTool/Vorbis.pm create mode 100644 lib/Image/ExifTool/WTV.pm create mode 100644 lib/Image/ExifTool/WriteCanonRaw.pl create mode 100644 lib/Image/ExifTool/WriteExif.pl create mode 100644 lib/Image/ExifTool/WriteIPTC.pl create mode 100644 lib/Image/ExifTool/WritePDF.pl create mode 100644 lib/Image/ExifTool/WritePNG.pl create mode 100644 lib/Image/ExifTool/WritePhotoshop.pl create mode 100644 lib/Image/ExifTool/WritePostScript.pl create mode 100644 lib/Image/ExifTool/WriteQuickTime.pl create mode 100644 lib/Image/ExifTool/WriteXMP.pl create mode 100644 lib/Image/ExifTool/Writer.pl create mode 100644 lib/Image/ExifTool/XMP.pm create mode 100644 lib/Image/ExifTool/XMP2.pl create mode 100644 lib/Image/ExifTool/XMPStruct.pl create mode 100644 lib/Image/ExifTool/ZIP.pm create mode 100644 lib/Image/ExifTool/ZISRAW.pm create mode 100644 lib/Image/ExifTool/iWork.pm create mode 100644 perl-Image-ExifTool.spec create mode 100644 t/AFCP.t create mode 100644 t/AFCP_2.out create mode 100644 t/AFCP_3.out create mode 100644 t/AIFF.t create mode 100644 t/AIFF_2.out create mode 100644 t/APE.t create mode 100644 t/APE_2.out create mode 100644 t/APE_3.out create mode 100644 t/ASF.t create mode 100644 t/ASF_2.out create mode 100644 t/Apple.t create mode 100644 t/Apple_2.out create mode 100644 t/Audible.t create mode 100644 t/Audible_2.out create mode 100644 t/BMP.t create mode 100644 t/BMP_2.out create mode 100644 t/BPG.t create mode 100644 t/BPG_2.out create mode 100644 t/BigTIFF.t create mode 100644 t/BigTIFF_2.out create mode 100644 t/Canon.t create mode 100644 t/CanonRaw.t create mode 100644 t/CanonRaw_2.out create mode 100644 t/CanonRaw_4.out create mode 100644 t/CanonRaw_5.out create mode 100644 t/CanonRaw_6.out create mode 100644 t/CanonRaw_7.out create mode 100644 t/CanonRaw_8.out create mode 100644 t/CanonRaw_9.out create mode 100644 t/CanonVRD.t create mode 100644 t/CanonVRD_11.out create mode 100644 t/CanonVRD_12.out create mode 100644 t/CanonVRD_13.out create mode 100644 t/CanonVRD_14.out create mode 100644 t/CanonVRD_15.out create mode 100644 t/CanonVRD_16.out create mode 100644 t/CanonVRD_17.out create mode 100644 t/CanonVRD_18.out create mode 100644 t/CanonVRD_19.out create mode 100644 t/CanonVRD_2.out create mode 100644 t/CanonVRD_20.out create mode 100644 t/CanonVRD_21.out create mode 100644 t/CanonVRD_22.out create mode 100644 t/CanonVRD_24.out create mode 100644 t/CanonVRD_3.out create mode 100644 t/CanonVRD_4.out create mode 100644 t/CanonVRD_5.out create mode 100644 t/CanonVRD_6.out create mode 100644 t/CanonVRD_7.out create mode 100644 t/CanonVRD_8.out create mode 100644 t/CanonVRD_9.out create mode 100644 t/Canon_2.out create mode 100644 t/Canon_3.out create mode 100644 t/Casio.t create mode 100644 t/Casio_2.out create mode 100644 t/Casio_3.out create mode 100644 t/Casio_4.out create mode 100644 t/Casio_5.out create mode 100644 t/Casio_6.out create mode 100644 t/DICOM.t create mode 100644 t/DICOM_2.out create mode 100644 t/DNG.t create mode 100644 t/DNG_2.out create mode 100644 t/DNG_3.out create mode 100644 t/DPX.t create mode 100644 t/DPX_2.out create mode 100644 t/DV.t create mode 100644 t/DV_2.out create mode 100644 t/DjVu.t create mode 100644 t/DjVu_2.out create mode 100644 t/EXE.t create mode 100644 t/EXE_2.out create mode 100644 t/EXE_3.out create mode 100644 t/EXE_4.out create mode 100644 t/EXE_5.out create mode 100644 t/EXE_6.out create mode 100644 t/EXE_7.out create mode 100644 t/ExifTool.t create mode 100644 t/ExifTool_16.out create mode 100644 t/ExifTool_17.out create mode 100644 t/ExifTool_2.out create mode 100644 t/ExifTool_20.out create mode 100644 t/ExifTool_21.out create mode 100644 t/ExifTool_22.out create mode 100644 t/ExifTool_23.out create mode 100644 t/ExifTool_24.out create mode 100644 t/ExifTool_25.out create mode 100644 t/ExifTool_26.out create mode 100644 t/ExifTool_27.out create mode 100644 t/ExifTool_28.out create mode 100644 t/ExifTool_29.out create mode 100644 t/ExifTool_3.out create mode 100644 t/ExifTool_30.out create mode 100644 t/ExifTool_31.out create mode 100644 t/ExifTool_32.out create mode 100644 t/ExifTool_4.out create mode 100644 t/ExifTool_5.out create mode 100644 t/ExifTool_6.out create mode 100644 t/ExifTool_7.out create mode 100644 t/ExifTool_8.out create mode 100644 t/ExifTool_9.out create mode 100644 t/FITS.t create mode 100644 t/FITS_2.out create mode 100644 t/FLAC.t create mode 100644 t/FLAC_2.out create mode 100644 t/FLAC_3.out create mode 100644 t/FLIF.t create mode 100644 t/FLIF_2.out create mode 100644 t/FLIF_3.out create mode 100644 t/FLIF_4.out create mode 100644 t/FLIF_5.out create mode 100644 t/FLIF_6.out create mode 100644 t/FLIR.t create mode 100644 t/FLIR_2.out create mode 100644 t/FLIR_3.out create mode 100644 t/Flash.t create mode 100644 t/FlashPix.t create mode 100644 t/FlashPix_2.out create mode 100644 t/Flash_2.out create mode 100644 t/Flash_3.out create mode 100644 t/Font.t create mode 100644 t/Font_2.out create mode 100644 t/Font_3.out create mode 100644 t/Font_4.out create mode 100644 t/Font_5.out create mode 100644 t/Font_6.out create mode 100644 t/Font_7.out create mode 100644 t/FotoStation.t create mode 100644 t/FotoStation_2.out create mode 100644 t/FotoStation_3.out create mode 100644 t/FujiFilm.t create mode 100644 t/FujiFilm_2.out create mode 100644 t/FujiFilm_3.out create mode 100644 t/FujiFilm_4.out create mode 100644 t/FujiFilm_5.out create mode 100644 t/GE.t create mode 100644 t/GE_2.out create mode 100644 t/GE_3.out create mode 100644 t/GIF.t create mode 100644 t/GIF_2.out create mode 100644 t/GIF_3.out create mode 100644 t/GIF_4.out create mode 100644 t/GIMP.t create mode 100644 t/GIMP_2.out create mode 100644 t/GPS.t create mode 100644 t/GPS_2.out create mode 100644 t/GPS_3.out create mode 100644 t/GeoTiff.t create mode 100644 t/GeoTiff_2.out create mode 100644 t/GeoTiff_3.out create mode 100644 t/GeoTiff_4.out create mode 100644 t/Geotag.t create mode 100644 t/Geotag_10.out create mode 100644 t/Geotag_11.out create mode 100644 t/Geotag_12.out create mode 100644 t/Geotag_2.out create mode 100644 t/Geotag_3.out create mode 100644 t/Geotag_5.out create mode 100644 t/Geotag_6.out create mode 100644 t/Geotag_7.out create mode 100644 t/Geotag_8.out create mode 100644 t/Geotag_9.out create mode 100644 t/GoPro.t create mode 100644 t/GoPro_2.out create mode 100644 t/HTML.t create mode 100644 t/HTML_2.out create mode 100644 t/IPTC.t create mode 100644 t/IPTC_2.out create mode 100644 t/IPTC_4.out create mode 100644 t/IPTC_5.out create mode 100644 t/IPTC_6.out create mode 100644 t/IPTC_7.out create mode 100644 t/IPTC_8.out create mode 100644 t/ISO.t create mode 100644 t/ISO_2.out create mode 100644 t/ITC.t create mode 100644 t/ITC_2.out create mode 100644 t/InDesign.t create mode 100644 t/InDesign_2.out create mode 100644 t/InDesign_3.out create mode 100644 t/InDesign_4.out create mode 100644 t/JSON.t create mode 100644 t/JSON_2.out create mode 100644 t/JVC.t create mode 100644 t/JVC_2.out create mode 100644 t/JVC_3.out create mode 100644 t/JXL.t create mode 100644 t/JXL_2.out create mode 100644 t/JXL_3.out create mode 100644 t/Jpeg2000.t create mode 100644 t/Jpeg2000_2.out create mode 100644 t/Jpeg2000_3.out create mode 100644 t/Jpeg2000_4.out create mode 100644 t/Jpeg2000_5.out create mode 100644 t/Kodak.t create mode 100644 t/Kodak_2.out create mode 100644 t/Kodak_3.out create mode 100644 t/KyoceraRaw.t create mode 100644 t/KyoceraRaw_2.out create mode 100644 t/LNK.t create mode 100644 t/LNK_2.out create mode 100644 t/Lang.t create mode 100644 t/Lang_1.out create mode 100644 t/Lang_10.out create mode 100644 t/Lang_11.out create mode 100644 t/Lang_12.out create mode 100644 t/Lang_13.out create mode 100644 t/Lang_14.out create mode 100644 t/Lang_15.out create mode 100644 t/Lang_16.out create mode 100644 t/Lang_17.out create mode 100644 t/Lang_18.out create mode 100644 t/Lang_2.out create mode 100644 t/Lang_3.out create mode 100644 t/Lang_4.out create mode 100644 t/Lang_5.out create mode 100644 t/Lang_6.out create mode 100644 t/Lang_7.out create mode 100644 t/Lang_8.out create mode 100644 t/Lang_9.out create mode 100644 t/Lytro.t create mode 100644 t/Lytro_2.out create mode 100644 t/M2TS.t create mode 100644 t/M2TS_2.out create mode 100644 t/MIE.t create mode 100644 t/MIE_2.out create mode 100644 t/MIE_3.out create mode 100644 t/MIE_5.out create mode 100644 t/MIE_6.out create mode 100644 t/MIFF.t create mode 100644 t/MIFF_2.out create mode 100644 t/MOI.t create mode 100644 t/MOI_2.out create mode 100644 t/MP3.t create mode 100644 t/MP3_2.out create mode 100644 t/MRC.t create mode 100644 t/MRC_2.out create mode 100644 t/MWG.t create mode 100644 t/MWG_2.out create mode 100644 t/MWG_3.out create mode 100644 t/MWG_4.out create mode 100644 t/MWG_5.out create mode 100644 t/MWG_6.out create mode 100644 t/MWG_7.out create mode 100644 t/MXF.t create mode 100644 t/MXF_2.out create mode 100644 t/MacOS.t create mode 100644 t/MacOS_2.out create mode 100644 t/Matroska.t create mode 100644 t/Matroska_2.out create mode 100644 t/Minolta.t create mode 100644 t/Minolta_2.out create mode 100644 t/Minolta_3.out create mode 100644 t/Minolta_4.out create mode 100644 t/Motorola.t create mode 100644 t/Motorola_2.out create mode 100644 t/Nikon.t create mode 100644 t/Nikon_2.out create mode 100644 t/Nikon_3.out create mode 100644 t/Nikon_4.out create mode 100644 t/Nikon_5.out create mode 100644 t/Nikon_7.out create mode 100644 t/Nikon_8.out create mode 100644 t/Olympus.t create mode 100644 t/Olympus_2.out create mode 100644 t/Olympus_3.out create mode 100644 t/Olympus_4.out create mode 100644 t/Olympus_5.out create mode 100644 t/Olympus_6.out create mode 100644 t/Olympus_7.out create mode 100644 t/Olympus_8.out create mode 100644 t/OpenEXR.t create mode 100644 t/OpenEXR_2.out create mode 100644 t/Opus.t create mode 100644 t/Opus_2.out create mode 100644 t/PCX.t create mode 100644 t/PCX_2.out create mode 100644 t/PDF.t create mode 100644 t/PDF_10.out create mode 100644 t/PDF_11.out create mode 100644 t/PDF_12.out create mode 100644 t/PDF_14.out create mode 100644 t/PDF_15.out create mode 100644 t/PDF_16.out create mode 100644 t/PDF_17.out create mode 100644 t/PDF_18.out create mode 100644 t/PDF_19.out create mode 100644 t/PDF_2.out create mode 100644 t/PDF_20.out create mode 100644 t/PDF_22.out create mode 100644 t/PDF_4.out create mode 100644 t/PDF_5.out create mode 100644 t/PDF_6.out create mode 100644 t/PDF_7.out create mode 100644 t/PDF_8.out create mode 100644 t/PDF_9.out create mode 100644 t/PFM.t create mode 100644 t/PFM_2.out create mode 100644 t/PGF.t create mode 100644 t/PGF_2.out create mode 100644 t/PICT.t create mode 100644 t/PICT_2.out create mode 100644 t/PLIST.t create mode 100644 t/PLIST_2.out create mode 100644 t/PLIST_3.out create mode 100644 t/PLIST_4.out create mode 100644 t/PLUS.t create mode 100644 t/PLUS_2.out create mode 100644 t/PNG.t create mode 100644 t/PNG_2.out create mode 100644 t/PNG_3.out create mode 100644 t/PNG_4.out create mode 100644 t/PNG_5.out create mode 100644 t/PNG_6.out create mode 100644 t/PNG_7.out create mode 100644 t/PPM.t create mode 100644 t/PPM_2.out create mode 100644 t/PPM_3.out create mode 100644 t/PSP.t create mode 100644 t/PSP_2.out create mode 100644 t/Palm.t create mode 100644 t/Palm_2.out create mode 100644 t/Panasonic.t create mode 100644 t/Panasonic_2.out create mode 100644 t/Panasonic_3.out create mode 100644 t/Panasonic_4.out create mode 100644 t/Panasonic_5.out create mode 100644 t/Pentax.t create mode 100644 t/Pentax_2.out create mode 100644 t/Pentax_3.out create mode 100644 t/Pentax_4.out create mode 100644 t/PhaseOne.t create mode 100644 t/PhaseOne_2.out create mode 100644 t/PhaseOne_3.out create mode 100644 t/PhotoCD.t create mode 100644 t/PhotoCD_2.out create mode 100644 t/PhotoMechanic.t create mode 100644 t/PhotoMechanic_2.out create mode 100644 t/PhotoMechanic_3.out create mode 100644 t/Photoshop.t create mode 100644 t/Photoshop_2.out create mode 100644 t/Photoshop_3.out create mode 100644 t/PostScript.t create mode 100644 t/PostScript_2.out create mode 100644 t/PostScript_3.out create mode 100644 t/QuickTime.t create mode 100644 t/QuickTime_10.out create mode 100644 t/QuickTime_11.out create mode 100644 t/QuickTime_12.out create mode 100644 t/QuickTime_13.out create mode 100644 t/QuickTime_14.out create mode 100644 t/QuickTime_15.out create mode 100644 t/QuickTime_16.out create mode 100644 t/QuickTime_17.out create mode 100644 t/QuickTime_2.out create mode 100644 t/QuickTime_3.out create mode 100644 t/QuickTime_4.out create mode 100644 t/QuickTime_5.out create mode 100644 t/QuickTime_6.out create mode 100644 t/QuickTime_7.out create mode 100644 t/QuickTime_8.out create mode 100644 t/QuickTime_9.out create mode 100644 t/RIFF.t create mode 100644 t/RIFF_2.out create mode 100644 t/RIFF_3.out create mode 100644 t/RIFF_4.out create mode 100644 t/RTF.t create mode 100644 t/RTF_2.out create mode 100644 t/Radiance.t create mode 100644 t/Radiance_2.out create mode 100644 t/Real.t create mode 100644 t/Real_2.out create mode 100644 t/Real_3.out create mode 100644 t/Real_4.out create mode 100644 t/Red.t create mode 100644 t/Red_2.out create mode 100644 t/Ricoh.t create mode 100644 t/Ricoh_2.out create mode 100644 t/Ricoh_3.out create mode 100644 t/Ricoh_4.out create mode 100644 t/Sanyo.t create mode 100644 t/Sanyo_2.out create mode 100644 t/Sanyo_3.out create mode 100644 t/Sigma.t create mode 100644 t/Sigma_2.out create mode 100644 t/Sigma_3.out create mode 100644 t/Sigma_4.out create mode 100644 t/Sigma_5.out create mode 100644 t/Sony.t create mode 100644 t/Sony_2.out create mode 100644 t/Sony_3.out create mode 100644 t/Sony_5.out create mode 100644 t/TestLib.pm create mode 100644 t/Text.t create mode 100644 t/Text_2.out create mode 100644 t/Text_3.out create mode 100644 t/Text_4.out create mode 100644 t/Text_5.out create mode 100644 t/Text_6.out create mode 100644 t/Text_7.out create mode 100644 t/Torrent.t create mode 100644 t/Torrent_2.out create mode 100644 t/Unknown.t create mode 100644 t/Unknown_2.out create mode 100644 t/Unknown_3.out create mode 100644 t/VCard.t create mode 100644 t/VCard_2.out create mode 100644 t/VCard_3.out create mode 100644 t/Vorbis.t create mode 100644 t/Vorbis_2.out create mode 100644 t/WTV.t create mode 100644 t/WTV_2.out create mode 100644 t/Writer.t create mode 100644 t/Writer_10.out create mode 100644 t/Writer_11.out create mode 100644 t/Writer_13.out create mode 100644 t/Writer_14.out create mode 100644 t/Writer_15.out create mode 100644 t/Writer_16.out create mode 100644 t/Writer_17.out create mode 100644 t/Writer_18.out create mode 100644 t/Writer_19.out create mode 100644 t/Writer_2.out create mode 100644 t/Writer_22.out create mode 100644 t/Writer_24.out create mode 100644 t/Writer_25.out create mode 100644 t/Writer_26.out create mode 100644 t/Writer_27.out create mode 100644 t/Writer_28.out create mode 100644 t/Writer_29.out create mode 100644 t/Writer_30.out create mode 100644 t/Writer_31.out create mode 100644 t/Writer_32.out create mode 100644 t/Writer_33.out create mode 100644 t/Writer_34.out create mode 100644 t/Writer_35.out create mode 100644 t/Writer_36.out create mode 100644 t/Writer_37.out create mode 100644 t/Writer_38.out create mode 100644 t/Writer_39.out create mode 100644 t/Writer_4.out create mode 100644 t/Writer_40.out create mode 100644 t/Writer_41.out create mode 100644 t/Writer_42.out create mode 100644 t/Writer_43.out create mode 100644 t/Writer_44.out create mode 100644 t/Writer_45.out create mode 100644 t/Writer_46.out create mode 100644 t/Writer_47.out create mode 100644 t/Writer_48.out create mode 100644 t/Writer_50.out create mode 100644 t/Writer_51.out create mode 100644 t/Writer_52.out create mode 100644 t/Writer_53.out create mode 100644 t/Writer_54.out create mode 100644 t/Writer_55.out create mode 100644 t/Writer_56.out create mode 100644 t/Writer_58.out create mode 100644 t/Writer_59.out create mode 100644 t/Writer_6.out create mode 100644 t/Writer_7.out create mode 100644 t/Writer_9.out create mode 100644 t/XMP.t create mode 100644 t/XMP_10.out create mode 100644 t/XMP_11.out create mode 100644 t/XMP_12.out create mode 100644 t/XMP_13.out create mode 100644 t/XMP_14.out create mode 100644 t/XMP_15.out create mode 100644 t/XMP_16.out create mode 100644 t/XMP_17.out create mode 100644 t/XMP_18.out create mode 100644 t/XMP_19.out create mode 100644 t/XMP_2.out create mode 100644 t/XMP_20.out create mode 100644 t/XMP_21.out create mode 100644 t/XMP_22.out create mode 100644 t/XMP_23.out create mode 100644 t/XMP_24.out create mode 100644 t/XMP_25.out create mode 100644 t/XMP_26.out create mode 100644 t/XMP_27.out create mode 100644 t/XMP_28.out create mode 100644 t/XMP_29.out create mode 100644 t/XMP_3.out create mode 100644 t/XMP_30.out create mode 100644 t/XMP_31.out create mode 100644 t/XMP_32.out create mode 100644 t/XMP_34.out create mode 100644 t/XMP_36.out create mode 100644 t/XMP_37.out create mode 100644 t/XMP_39.out create mode 100644 t/XMP_40.out create mode 100644 t/XMP_41.out create mode 100644 t/XMP_42.out create mode 100644 t/XMP_43.out create mode 100644 t/XMP_44.out create mode 100644 t/XMP_45.out create mode 100644 t/XMP_46.out create mode 100644 t/XMP_47.out create mode 100644 t/XMP_48.out create mode 100644 t/XMP_49.out create mode 100644 t/XMP_5.out create mode 100644 t/XMP_50.out create mode 100644 t/XMP_52.out create mode 100644 t/XMP_53.out create mode 100644 t/XMP_54.out create mode 100644 t/XMP_6.out create mode 100644 t/XMP_7.out create mode 100644 t/XMP_8.out create mode 100644 t/XMP_9.out create mode 100644 t/ZIP.t create mode 100644 t/ZIP_2.out create mode 100644 t/ZIP_3.out create mode 100644 t/ZIP_4.out create mode 100644 t/ZIP_5.out create mode 100644 t/ZIP_6.out create mode 100644 t/ZIP_7.out create mode 100644 t/ZISRAW.t create mode 100644 t/ZISRAW_2.out create mode 100644 t/images/AFCP.jpg create mode 100644 t/images/AIFF.aif create mode 100644 t/images/APE.ape create mode 100644 t/images/APE.mpc create mode 100644 t/images/ASF.wmv create mode 100644 t/images/Apple.jpg create mode 100644 t/images/Audible.aa create mode 100644 t/images/BMP.bmp create mode 100644 t/images/BPG.bpg create mode 100644 t/images/BigTIFF.btf create mode 100644 t/images/Canon.jpg create mode 100644 t/images/Canon1DmkIII.jpg create mode 100644 t/images/CanonRaw.cr2 create mode 100644 t/images/CanonRaw.cr3 create mode 100644 t/images/CanonRaw.crw create mode 100644 t/images/CanonVRD.dr4 create mode 100644 t/images/CanonVRD.vrd create mode 100644 t/images/CaptureOne.eip create mode 100644 t/images/Casio.jpg create mode 100644 t/images/Casio2.jpg create mode 100644 t/images/CasioQVCI.jpg create mode 100644 t/images/DICOM.dcm create mode 100644 t/images/DNG.dng create mode 100644 t/images/DPX.dpx create mode 100644 t/images/DV.dv create mode 100644 t/images/DjVu.djvu create mode 100644 t/images/EXE.a create mode 100644 t/images/EXE.dylib create mode 100755 t/images/EXE.elf create mode 100755 t/images/EXE.exe create mode 100755 t/images/EXE.macho create mode 100644 t/images/EXE.so create mode 100644 t/images/ExifTool.jpg create mode 100644 t/images/ExifTool.jps create mode 100644 t/images/ExifTool.tif create mode 100644 t/images/ExtendedXMP.jpg create mode 100644 t/images/FITS.fits create mode 100644 t/images/FLAC.flac create mode 100644 t/images/FLAC.ogg create mode 100755 t/images/FLIF.flif create mode 100644 t/images/FLIR.fpf create mode 100644 t/images/FLIR.jpg create mode 100644 t/images/Flash.flv create mode 100644 t/images/Flash.swf create mode 100644 t/images/FlashPix.ppt create mode 100644 t/images/Font.afm create mode 100644 t/images/Font.dfont create mode 100644 t/images/Font.pfa create mode 100644 t/images/Font.pfb create mode 100644 t/images/Font.pfm create mode 100644 t/images/Font.ttf create mode 100644 t/images/FotoStation.jpg create mode 100644 t/images/FujiFilm.jpg create mode 100644 t/images/FujiFilm.raf create mode 100644 t/images/GE.jpg create mode 100644 t/images/GIF.gif create mode 100644 t/images/GIMP.xcf create mode 100644 t/images/GPS.jpg create mode 100644 t/images/GeoTiff.tif create mode 100644 t/images/Geotag.gpx create mode 100644 t/images/Geotag.igc create mode 100644 t/images/Geotag.kml create mode 100644 t/images/Geotag.log create mode 100644 t/images/Geotag.xml create mode 100644 t/images/Geotag2.log create mode 100644 t/images/Geotag3.log create mode 100644 t/images/Geotag_DJI_2020-12-02_[07-50-31].csv create mode 100644 t/images/GoPro.jpg create mode 100644 t/images/HTML.html create mode 100644 t/images/ICC_Profile.icc create mode 100644 t/images/IPTC.jpg create mode 100644 t/images/ISO.iso create mode 100644 t/images/ITC.itc create mode 100644 t/images/InDesign.indd create mode 100644 t/images/JSON.json create mode 100644 t/images/JVC.jpg create mode 100644 t/images/JVC2.jpg create mode 100644 t/images/JXL.jxl create mode 100644 t/images/Jpeg2000.j2c create mode 100644 t/images/Jpeg2000.jp2 create mode 100644 t/images/Kodak.jpg create mode 100644 t/images/KyoceraRaw.raw create mode 100755 t/images/LNK.lnk create mode 100644 t/images/Lytro.lfp create mode 100644 t/images/M2TS.mts create mode 100644 t/images/MIE.mie create mode 100644 t/images/MIFF.miff create mode 100644 t/images/MOI.moi create mode 100755 t/images/MP3.mp3 create mode 100644 t/images/MRC.mrc create mode 100644 t/images/MWG.jpg create mode 100644 t/images/MXF.mxf create mode 100755 t/images/MacOS.macos create mode 100644 t/images/Matroska.mkv create mode 100644 t/images/Minolta.jpg create mode 100644 t/images/Minolta.mrw create mode 100644 t/images/Motorola.jpg create mode 100644 t/images/Nikon.jpg create mode 100644 t/images/Nikon.nef create mode 100644 t/images/NikonD2Hs.jpg create mode 100644 t/images/NikonD70.jpg create mode 100644 t/images/OOXML.docx create mode 100644 t/images/Olympus.dss create mode 100644 t/images/Olympus.jpg create mode 100644 t/images/Olympus2.jpg create mode 100644 t/images/OlympusE1.jpg create mode 100644 t/images/OpenDoc.ods create mode 100644 t/images/OpenEXR.exr create mode 100644 t/images/Opus.opus create mode 100644 t/images/PCX.pcx create mode 100644 t/images/PDF.pdf create mode 100644 t/images/PDF2.pdf create mode 100644 t/images/PFM.pfm create mode 100644 t/images/PGF.pgf create mode 100644 t/images/PICT.pict create mode 100644 t/images/PLIST-bin.plist create mode 100644 t/images/PLIST-xml.plist create mode 100644 t/images/PLIST.aae create mode 100644 t/images/PLUS.xmp create mode 100644 t/images/PNG.png create mode 100644 t/images/PPM.ppm create mode 100644 t/images/PSP.psp create mode 100644 t/images/Palm.mobi create mode 100644 t/images/Panasonic.jpg create mode 100644 t/images/Panasonic.rw2 create mode 100644 t/images/Pentax.avi create mode 100644 t/images/Pentax.jpg create mode 100644 t/images/PhaseOne.iiq create mode 100644 t/images/PhotoCD.pcd create mode 100644 t/images/PhotoMechanic.jpg create mode 100644 t/images/Photoshop.psd create mode 100644 t/images/PostScript.eps create mode 100644 t/images/QuickTime.heic create mode 100644 t/images/QuickTime.m4a create mode 100644 t/images/QuickTime.mov create mode 100644 t/images/RIFF.avi create mode 100755 t/images/RIFF.wav create mode 100644 t/images/RIFF.webp create mode 100644 t/images/RTF.rtf create mode 100644 t/images/Radiance.hdr create mode 100644 t/images/Real.ra create mode 100644 t/images/Real.ram create mode 100644 t/images/Real.rm create mode 100644 t/images/Red.r3d create mode 100644 t/images/Ricoh.jpg create mode 100644 t/images/Ricoh2.jpg create mode 100644 t/images/Sanyo.jpg create mode 100644 t/images/Sigma.jpg create mode 100644 t/images/Sigma.x3f create mode 100644 t/images/SigmaDP2.x3f create mode 100644 t/images/Sony.jpg create mode 100644 t/images/Sony.pmp create mode 100644 t/images/Text.csv create mode 100644 t/images/Text1.txt create mode 100644 t/images/Text2.txt create mode 100644 t/images/Text3.txt create mode 100644 t/images/Text4.txt create mode 100644 t/images/Text5.txt create mode 100644 t/images/Torrent.torrent create mode 100644 t/images/Unknown.jpg create mode 100644 t/images/VCard.ics create mode 100644 t/images/VCard.vcf create mode 100644 t/images/Vorbis.ogg create mode 100644 t/images/WTV.wtv create mode 100644 t/images/Writer.jpg create mode 100644 t/images/XMP.inx create mode 100644 t/images/XMP.jpg create mode 100644 t/images/XMP.svg create mode 100644 t/images/XMP.xml create mode 100644 t/images/XMP.xmp create mode 100644 t/images/XMP2.xmp create mode 100644 t/images/XMP3.xmp create mode 100644 t/images/XMP4.xmp create mode 100644 t/images/XMP5.xmp create mode 100644 t/images/XMP6.xmp create mode 100644 t/images/XMP7.xmp create mode 100644 t/images/XMP8.xmp create mode 100644 t/images/XMP9.xmp create mode 100644 t/images/ZIP.gz create mode 100644 t/images/ZIP.zip create mode 100644 t/images/ZISRAW.czi create mode 100644 t/images/iWork.numbers diff --git a/Changes b/Changes new file mode 100644 index 0000000..1896935 --- /dev/null +++ b/Changes @@ -0,0 +1,10183 @@ +DO NOT EDIT THIS FILE -- it is generated from the html history files. + +ExifTool Version History + +RSS feed: https://exiftool.org/rss.xml + +Note: The most recent production release is Version 12.42. (Other versions are +considered development releases, and are not uploaded to MetaCPAN.) + +July 21, 2022 - Version 12.44 + + - Added a few new Sony lenses (thanks Jos Roost) + - Decode Accelerometer and Gyroscope data from ARCore videos + - Decode a couple of new Motorola tags (thanks Neal Krawetz) + - Decode FujiFilm FirmwareVersion (thanks Justin Arkinson) + - Decode MetaType for timed metadata in videos + - Decode a number of new Nikon Z tags (thanks Warren Hatch) + - Extract more types of embedded images from FlashPix-format files + - Made Composite GPSLatitude and GPSLongitude writable for setting GPS + coordinates and reference directions with one assignment + - Fixed bug introduced in 12.39 which broke extraction of timed GPS from some + INNOVV videos + - Fixed bug introduced in 12.43 which broke extraction of timed GPSDateTime + from Insta360 videos + +July 6, 2022 - Version 12.43 + + - Added the ability to geotag from Google Takeout JSON files + - Added a few new Canon RF LensType values and a couple of new CanonModelID's + (thanks Norbert Wasser) + - Added new values to a couple of FujiFilm tags (thanks Greybeard) + - Added a new Nikon LensID (thanks BertJan Bakker) + - Recognize Autodesk Revit files (but don't yet support reading metadata) + - Decode DriveSerialNumber from LNK files (github #145) + - Decode Apple FocusDistanceRange (thanks Neal Krawetz) + - Made a number of Sony SR2SubIFD tags writable + - Tolerate dashes instead of colons as date separators in -geotag CSV files + - Patched to read new format accelerometer data from Insta360 files + - Patched to avoid outputting some Unknown tags when the -validate option is + used after a previously -execute'd command used the -u option + - Fixed names of Canon G9 WB levels tags (changed from GRGB to GRBG) (thanks + Christoph) + - Fixed typo in new Olympus AISubjectTrackingMode value + - Fixed "use of undefined value" warning when reading DJI metadata + - API Changes: + - Added IgnoreTags option + +June 1, 2022 - Version 12.42 (production release) + + - Added support for reading maker notes from Panasonic DC-GH6 videos + - Added conversion for Samsung MCCData + - Added a new Nikon LensID (thanks Chris) + - Added a few new Canon LensType values + - Added a couple of new Olympus StackedImage values (thanks Eberhard) + - Added a few new values for some Nikon Settings tags (thanks Warren Hatch) + - Added a "lang:" element to the -json output for alternate language tags when + -D, -H or -t is used + - Update DNG writer to not issue an error when writing DNG 1.6 files + - Decode information from DJI "ae_dbg_info" maker notes + - Decode Olympus AISubjectTrackingMode + - Changed ExifTool FileSize print conversion to use kB/MB/GB units instead of + KiB/MiB/GiB + - Changed "is not shiftable" warning to appear in -v (instead of just -v3) + output + - Patched to allow PDF Encrypt object to be "null" + - Fixed bug reading ICC_Profile 'meta' tags + +Apr. 7, 2022 - Version 12.41 + + - Added support for "OM SYSTEM" maker notes + - Added 2 new Sony LensType values (thanks Jos Roost) + - Added some new Canon lenses (thanks LibRaw) + - Added a new Nikon LensID (thanks Bert Ligtvoet) + - Added a new Canon ContinuousDrive value (thanks Wolfgang Gulcker) + - Enhanced -v0 option to also print new file name when renaming, moving or + copying a file + - Updated xmp2exif.args and exif2xmp.args helper files to reflect the IPTC + Photometadata Mapping Guidelines version 2202.1 + - Made "Invalid Xxx data" a minor warning for MakerNote data + - Patched to allow writing of MP4 videos which have other tracks with a + missing sample description entry + - Patched MacOS version to specify directory for external utilities (setfile, + xattr, stat, mdls and osascript from /usr/bin, and tag from /usr/local/bin) + - Fixed long-standing problem where Windows version could behave differently + for -if conditions containing undefined tags + - Fixed problem where -W+! combined with -j or -X produced invalid JSON or XML + when processing multiple files + - Fixed potential "uninitialized value $time in division" runtime warning when + reading MP4 videos + +Feb. 9, 2022 - Version 12.40 + + - Added PageCount tag to return the number of pages in a multi-page TIFF + - Added a new Nikon LensID (thanks Wolfgang Exler) + - Added a few more Sony LensTypes (thanks Jos Roost) + - Decode some new Canon tags (thanks Mark Reid) + - Decode another Nikon Z9 tag (thanks Warren Hatch) + - Decode Nikon NKSC GPSImgDirection (thanks Olaf) + - Improved handling of empty XMP structures in lists + - Tolerate leading UTF-8 BOM in -geotag log files + - Updated photoshop_paths.config to include WorkingPath + - Patched to allow writing of MP4 videos which have url tracks with a missing + sample description entry + - Fixed deep recursion error when reading multi-page TIFF images with more + than 100 pages + - Fixed potential deep recursion runtime error when writing nested XMP + structures + - Fixed warning which could be generated when writing new + Composite:GPSCoordinates tag + - Fixed description of GPR (General Purpose RAW) file type + - Fixed typo in the name of a new Nikon tag (thanks Herb) + +Jan. 13, 2022 - Version 12.39 + + - Added a new Pentax LensType (thanks Christian Shulz) + - Added a couple of new Nikon LensID's + - Added support for Nikon NKSC sidecar files + - Decode another type of timed GPS from MP4 videos + - Decode more tags for the Nikon Z7 and Z9 (thanks Warren Hatch) + - Decode a couple more FLIR tags + - Extract ZIP file comments + - Made PNG ProfileName, SRGBRendering and Gamma writable + - Patched to avoid possible problem running "more" to show documentation in + Windows version + - Fixed problem writing Composite:GPSPosition with coordinates in DMS format, + and made this tag protected when writing + - Fixed bug where invalid date/time tags could be written to PNG files when + attempting to shift a non-existent date/time tag + - Fixed spelling of a few Matroska tag names (thanks Martin Hoppenheit) + +Dec. 20, 2021 - Version 12.38 + + - Decode a number of new tags for the Nikon Z9 (thanks Warren Hatch) + - Patched incorrect decoding of AEBShotCount for the Canon EOS 90D + - Patched EXR reader to support long tag names + - Patched security issue (thanks Joe Lothan) + - Fixed an incorrect tag ID for a new Nikon MakerNote tag (github #108) + - Fixed XMP-exif:GPSMeasureMode conversions to match EXIF + - Fixed problem where some namespaces may be undeclared in the -X output when + using the -struct option + +Dec. 8, 2021 - Version 12.37 + + - Decode timed GPS from Vantrue S1 dashcam MP4 videos + - Decode ColorData tags for the Canon EOS R3 (thanks LibRaw) + - Decode more makernotes tags for Nikon Z cameras (thanks Warren Hatch) + - Extract TransparentColor from GIF images + - Improved parsing of input time values for GPSTimeStamp to properly handle a + "." separator + - Improved warning when incorrectly using " + +Nov. 16, 2021 - Version 12.36 + + - IMPORTANT: Fixed bug introduced in 12.35 which corrupted JPEG 2000 images + when removing all metadata with -all= + - Added feature to bypass processing of specified XMP namespaces and + properties (to improve performance in cases where the XMP suffers from + Adobe-editing bloat) + - Added a number of new XMP tags used by Lightroom 11.0 + - Decode a number of new Nikon tags (thanks Warren Hatch) + - Made the Composite GPSPosition tag writable + - Fixed erroneous "Skipped unknown bytes after JPEG SOS" warning + - Fixed group for new writable Jpeg2000 color tags in -listx output + - Fixed problem finding files in Windows when using wildcards in file name and + a drive letter with no slash + +Nov. 11, 2021 - Version 12.35 + + - Added ability to write ICC_Profile (and other color specifications) to + Jpeg2000 images + - Added %o code to -W option format string + - Added %f code to -d option for fractional seconds + - Added a couple of new Sony LensType values (thanks Jos Roost) + - Added a new CanonModelID (thanks Norbert Wasser) + - Added a new Nikon LensID + - Decode more Nikon MakerNotes tags for some new models (thanks Warren Hatch) + - Extract ThumbnailImage from some DJI drone videos + - Enhanced -ee option to extract metadata from all frames in a SEQ file + - Patched to avoid possible "Use of uninitialized value" runtime warning + - Fixed a couple of misspelt new ICC_Profile tag names (thanks Herb) + - Fixed problem generating the correct file extension when extracting + OriginalRawImage from a DNG file using the -W option with the %s format code + - Fixed bug introduced in 11.91 where exiftool couldn't find its libraries + when run via a soft link. Also changed to look for config file in the link + target directory instead of the directory of the link itself + +Oct. 27, 2021 - Version 12.34 + + - Added support for ICC.2:2019 (Profile version 5.0.0 - iccMAX) color profiles + - Added ability to detect/delete a Windows Zone.Identifier alternate data + stream (ADS) via the new ZoneIdentifier tag (thanks Alex Xu) + - Added support for the Sony ILCE-7M4 (thanks Jos Roost) + - Added a new Sony lens (thanks LibRaw and Jos Roost) + - Added a new SonyModelID (thanks LibRaw) + - Added a new Canon RF lens (thanks Norbert Wasser) + - Improved handling of some SVG files + - Patched -overwrite_original_in_place option to open the output file in + update mode rather than write mode (to allow some write optimizations on + certain filesystems) (thanks Joel Low) + - Fixed case of tag ID for new XMP-iptcExt:EventID (thanks Michael Steidl) + - Fixed problem extracting ICC_Profile information from some PDF files + - API Changes: + - Added QuickTimePad option + +Oct. 16, 2021 - Version 12.33 + + - Added support for DNG version 1.6.0.0 + - Added two new Sony LensType values (thanks Jos Roost and LibRaw) + - Added some new elements to the XMP-crs:Look structure (thanks Herb) + - Added a few new IPTC XMP tags (thanks Michael Steidl) + - Added a new Canon RF lens (thanks Norbert Wasser) + - Decode Canon ShutterMode (thanks John Moyer) + - Extract LensModel from some Olympus MOV videos + - Generate MediaDataOffset/Size for MOV videos with zero-sized MDAT chunk + - Improvements to CBOR reader, including hex dump with -v3 option + - Recognize Final Cut Pro XML files + - Allow binary data of Protected tags to be extracted with the -X -j and -php + options with -b by setting the API RequestAll option to 3 + - Changed name of "Canon EF 80-200mm f/4.5-5.6" lens with LensType 38 to add + "II" to the name (Exiv2 issue 1906) + - Fixed runtime warning when processing files with a .DIR extension + +Sept. 30, 2021 - Version 12.32 + + - Added support for CBOR-format metadata in JUMBF (note that JUMBF support is + still experimental) + - Added a new Nikon LensID + - Added a new Pentax LensType + - Decode timed GPS for two more dashcam formats + - Support reference direction columns in -geotag CSV input + - Removed generation of GPSSpeedRef and GPSTrackRef tags in timed metadata for + most dashcam formats when speed is km/h and track is relative to true north + - Patched to allow writing of console output to named pipes + - Fixed formatting of InternalSerialNumber for some Panasonic cameras + - Fixed bug in arg_files/xmp2exif.args support file + +Sept. 22, 2021 - Version 12.31 + + - Added a new SonyModelID and a couple of new Sony lenses (thanks Jos Roost) + - Added a new Canon LensType (thanks Chris Skopec) + - Added Composite GPSLatitude/Longitude tags for Sony videos to combine the + reference hemispheres as with the Composite tags for EXIF GPS + - Decode DPX AspectRatio + - Decode more GoPro MP4 tags + - Extract ICC_Profile from CS0 object in PDF files + - Extract encrypted GPS from Akaso V1 dashcam videos (can't yet decrypt) + - Improved handling of QuickTime iTunesInfo tags, and created new "iTunes" + family 1 group for these + - Patched so NoPDFList option also applies when writing + - Patched to allow user-defined PNG TextualData tags to be written only as iTXt + - Patched PDF reader to avoid concatenating values of multiple List-type tags + into a single tag + +Aug. 12, 2021 - Version 12.30 (production release) + + - Added read support for Portable FloatMap (PFM) images (this was a bit of a + pain because they have the same file extension as Printer Font Metrix files) + - Added a few new Nikon LensID values (thanks LibRaw) + - Added a new Canon LensType + - Added a new Olympus CameraType (thanks LibRaw) + - Added minor warning about unknown data between JPEG segments + - Added a couple of new NikonSettings tags (thanks Warren Hatch) + - Added a new Sony LensType (thanks Jos Roost) + - Decode 'id3 ' chunk in WAV audio files + - Decode timed GPS from concatenated Garmin dashcam videos + - Decode SamsungTrailer information from sefd atom in HEIC images + - Decode more Sony MakerNote tags for the ZV-E10 (thanks Jos Roost) + - Decode DepthMapTiff from JPEG images of more Samsung models + - Decode timed GPS from M2TS videos of yet another type of dashcam + - Extract PreviewImage from Xaiomi MP4 videos + - Changed name of second EmbeddedImage in Samsung trailer to EmbeddedImage2 + - Improved Dutch translations for GPS tags (thanks Peter Dubbelman) + - Allow ICC_Profile to be "deleted" from AVIF files (actually, the profile + isn't really deleted. Instead, a zero-length profile is written to allow a + profile to be added back later since QuickTime item property containers + currently can't be created) + - Patched to remove 2 GB size limit when reading Photoshop ImageSourceData + +July 9, 2021 - Version 12.29 + + - Added a few new Nikon and Olympus lenses (thanks LibRaw) + - Improved a QuickTime "File format error" message to be more meaningful, and + made it a minor error + - Changed PNG writer to add EXIF before IDAT + - Some changes the way JUMBF metadata is handled + - Patched to read timed GPS from a different type of INSV videos + - Patched a security issue + - Fixed problem where ExifTool could hang when processing mebx timed metadata + +June 22, 2021 - Version 12.28 + + - Added read support for Leica Image File (LIF) images + - Added a new Olympus LensType (thanks LibRaw) + - Decode another Panasonic tag (thanks LibRaw) + - Decode more timed metadata from Sony MP4 videos + - Attempt to shorten tag names for metadata in CZI files + - Allow full QuickTime Keys tag ID's in UserDefined tags (fixes backward + incompatibility introduced in 12.02) + - Patched to handle special characters in Torrent tag values + +June 9, 2021 - Version 12.27 + + - Added a new SonyModelID value + - Added two new Nikon LensID values (thanks Daniel) + - Added a new Pentax RawDevelopmentProcess value + - Added a few new Sony LensType values (thanks Jos Roost) + - Added warning if IPTCDigest is not current + - Decode a couple more Pentax tags (thanks LibRaw) + - Decode streaming GPS from Novatek INNOVV MP4 and TS videos + - Improved tag names in config_files/covert_regions.config (thanks StarGeek) + - Changed MIME types for MS Office macro-enabled formats to add the .12 + - Patched Canon LensID logic to properly identify the Canon RF 24-105mm F4 L + IS USM lens + - Patched decoding of camm6 GPSDateTime to use a flexible epoch because other + apps don't seem to use a consistent time zero + - Fixed family 7 group names for QuickTime Keys tags + - Fixed problem reading BeatsPerMinute from some MP4 files + - Fixed hemisphere problem when extracting GPS from 70mai dashcam videos + +May 20, 2021 - Version 12.26 (production release) + + - Added support for JPEG Stereo (JPS) images + - Added a new Sony LensType (thanks LibRaw) + - Added a new PentaxModelID (thanks LibRaw) + - Changed ExifTool namespace URI to use exiftool.org instead of exiftool.ca in + the -X option output (exiftool.ca is still recognized when reading XML) + - Improved handling of large-array warnings in -htmldump output + - Changed handling of escaped characters in #[CSTR] lines of -@ argfile + - Patched security vulnerability in argument of -lang option + - Fixed problem which could cause a "Wide character" warning and generate a + corrupted output file when writing some illegal values + +History of older versions (back to Nov. 19, 2003 - Version 1.00) --> + +Apr. 22, 2021 - Version 12.25 + + - JPEG XL support is now official + - Added read support for Medical Research Council (MRC) image files + - Added ability to write a number of 3gp tags in video files + - Added a new Sony PictureProfile value (thanks Jos Roost) + - Added a new Sony LensType (thanks LibRaw) + - Added a new Nikon LensID (thanks Niels Kristian Bech Jensen) + - Added a new Canon LensType + - Decode more GPS information from Blackvue dashcam videos + - Decode a couple of new NikonSettings tags (thanks Warren Hatch) + - Decode a few new RIFF tags + - Improved Validate option to add minor warning if standard XMP is missing + xpacket wrapper + - Avoid decoding some large arrays in DNG images to improve performance unless + the -m option is used + - Patched bug that could give runtime warning when trying to write an empty + XMP structure + - Fixed decoding of ImageWidth/Height for JPEG XL images + - Fixed problem were Microsoft Xtra tags couldn't be deleted + +Apr. 13, 2021 - Version 12.24 + + - Added a new PhaseOne RawFormat value (thanks LibRaw) + - Decode a new Sony tag (thanks Jos Roost) + - Decode a few new Panasonic and FujiFilm tags (thanks LibRaw and Greybeard) + - Updated acdsee.config in distribution (thanks StarGeek) + - Recognize AutoCAD DXF files + - More work on experimental JUMBF read support + - More work on experimental JPEG XL read/write support + - Patched security vulnerability in DjVu reader + +Apr. 1, 2021 - Version 12.23 + + - Added support for Olympus ORI files + - Added experimental read/write support for JPEG XL images + - Added experimental read support for JUMBF metadata in JPEG and Jpeg2000 + images + - Added built-in support for parsing GPS track from Denver ACG-8050 videos + with the -ee option + - Added a some new Sony lenses (thanks Jos Roost and LibRaw) + - Changed priority of Samsung trailer tags so the first DepthMapImage takes + precedence when -a is not used + - Improved identification of M4A audio files + - Patched to avoid escaping ',' in "Binary data" message when -struct is used + - Removed Unknown flag from MXF VideoCodingSchemeID tag + - Fixed -forcewrite=EXIF to apply to EXIF in binary header of EPS files + - API Changes: + - Added BlockExtract option + +Mar. 17, 2021 - Version 12.22 + + - Added a few new Sony LensTypes and a new SonyModelID (thanks Jos Roost and + LibRaw) + - Added Extra BaseName tag + - Added a new CanonModelID (thanks LibRaw) + - Decode timed GPS from unlisted programs in M2TS videos with the -ee3 option + - Decode more Sony rtmd tags + - Decode some tags for the Sony ILME-FX3 (thanks Jos Roost) + - Allow negative values to be written to XMP-aux:LensID + - Recognize HEVC video program in M2TS files + - Enhanced -b option so --b suppresses tags with binary data + - Improved flexibility when writing GPS coordinates: + - Now pulls latitude and longitude from a combined GPSCoordinates string + - Recognize full word "South" and "West" to write negative coordinates + - Improved warning when trying to write an integer QuickTime date/time tag and + Time::Local is not available + - Convert GPSSpeed from mph to km/h in timed GPS from Garmin MP4 videos + +Feb. 24, 2021 - Version 12.21 + + - Added a few new iOS QuickTime tags + - Decode a couple more Sony rtmd tags + - Patch to avoid possible "Use of uninitialized value" warning when attempting + to write QuickTime date/time tags with an invalid value + - Fixed problem writing Microsoft Xtra tags + - Fixed Windows daylight savings time patch for file times that was broken in + 12.19 (however directory times will not yet handle DST properly) + +Feb. 23, 2021 - Version 12.20 + + - Added ability to write some Microsoft Xtra tags in MOV/MP4 videos + - Added two new Canon LensType values (thanks Norbert Wasser) + - Added a new Nikon LensID + - Fixed problem reading FITS comments that start before column 11 + +Feb. 18, 2021 - Version 12.19 + + - Added -list_dir option + - Added the "ls-l" Shortcut tag + - Extract Comment and History from FITS files + - Enhanced FilePermissions to include device type (similar to "ls -l") + - Changed the name of Apple ContentIdentifier tag to MediaGroupUUID + (thanks Neal Krawetz) + - Fixed a potential "substr outside of string" runtime error when reading + corrupted EXIF + - Fixed edge case where NikonScanIFD may not be copied properly when copying + MakerNotes to another file + - API Changes: + - Added ability to read/write System tags of directories + - Enhanced GetAllGroups() to support family 7 and take optional ExifTool + reference + - Changed QuickTimeHandler option default to 1 + +Feb. 9, 2021 - Version 12.18 + + - Added a new SonyModelID + - Decode a number of Sony tags for the ILCE-1 (thanks Jos Roost) + - Decode a couple of new Canon tags (thanks LibRaw) + - Patched to read differently formatted UserData:Keywords as written by iPhone + - Patched to tolerate out-of-order Nikon MakerNote IFD entries when obtaining + tags necessary for decryption + - Fixed a few possible Condition warnings for some NikonSettings tags + +Feb. 3, 2021 - Version 12.17 + + - Added a new Canon FocusMode value + - Added a new FujiFilm FilmMode value + - Added a number of new XMP-crs tags (thanks Herb) + - Decode a new H264 MDPM tag + - Allow non-conforming lower-case XMP boolean "true" and "false" values to be + written, but only when print conversion is disabled + - Improved Validate option to warn about non-capitalized boolean XMP values + - Improved logic for setting GPSLatitude/LongitudeRef values when writing + - Changed -json and -php options so the -a option is implied even without the + -g option + - Avoid extracting audio/video data from AVI videos when -ee -u is used + - Patched decoding of Canon ContinuousShootingSpeed for newer firmware + versions of the EOS-1DXmkIII + - Re-worked LensID patch of version 12.00 (github issue #51) + - Fixed a few typos in newly-added NikonSettings tags (thanks Herb) + - Fixed problem where group could not be specified for PNG-pHYs tags when + writing + +Jan. 21, 2021 - Version 12.16 (production release) + + - Extract another form of video subtitle text + - Enhanced -ee option with -ee2 and -ee3 to allow parsing of the H264 video + stream in MP4 files + - Changed a Nikon FlashMode value + - Fixed problem that caused a failed DPX test on Strawberry Perl + - API Changes: + - Enhanced ExtractEmbedded option + +Jan. 18, 2021 - Version 12.15 (production release) + + - Added a couple of new Sony LensType values (thanks LibRaw and Jos Roost) + - Added a new Nikon FlashMode value (thanks Mike) + - Decode NikonSettings (thanks Warren Hatch) + - Decode thermal information from DJI RJPEG images + - Fixed extra newline in -echo3 and -echo4 outputs added in version 12.10 + - Fixed out-of-memory problem when writing some very large PNG files under + Windows + +Jan. 6, 2021 - Version 12.14 + + - Added support for 2 more types of timed GPS in video files (that makes 49 + different formats now supported) + - Added validity check for PDF trailer dictionary Size + - Added a new Pentax LensType + - Extract metadata from Jpeg2000 Association box + - Changed -g:XX:YY and -G:XX:YY options to show empty strings for non-existent + groups + - Patched to issue warning and avoid writing date/time values with a zero + month or day number + - Patched to avoid runtime warnings if trying to set FileName to an empty + string + - Fixed issue that could cause GPS test number 12 to fail on some systems + - Fixed problem extracting XML as a block from Jpeg2000 images, and extract + XML tags in the XML group instead of XMP + +Dec. 24, 2020 - Version 12.13 + + - Added -i HIDDEN option to ignore files with names that start with "." + - Added a few new Nikon ShutterMode values (thanks Jan Skoda) + - Added ability to write Google GCamera MicroVideo XMP tags + - Add time zone automatically to most string-based QuickTime date/time tags + when writing unless the PrintConv option is disabled + - Decode a new Sony tag (thanks LibRaw) + - Changed behaviour when writing only pseudo tags to return an error and avoid + writing any other tags if writing FileName fails + - Print "X image files read" message even if only 1 file is read when at least + one other file has failed the -if condition + +Dec. 4, 2020 - Version 12.12 + + - Added ability to geotag from DJI CSV log files + - Added a new CanonModelID + - Added a couple of new Sony LensType values (thanks LibRaw) + - Enhanced -csvDelim option to allow "\t", "\n", "\r" and "\\" + - Unescape "\b" and "\f" in imported JSON values + - Fixed bug introduced in 12.10 which generated a "Not an integer" warning + when attempting to shift some QuickTime date/time tags + - Fixed shared-write permission problem with -@ argfile when using -stay_open + and a filename containing special characters on Windows + +Nov. 27, 2020 - Version 12.11 + + - Added -csvDelim option + - Added new Canon and Olympus LensType values (thanks LibRaw) + - Added a warning if ICC_Profile is deleted from an image (github issue #63) + - EndDir() function for -if option now works when -fileOrder is used + - Changed FileSize conversion to use binary prefixes since that is how the + conversion is currently done (eg. MiB instead of MB) + - Patched -csv option so columns aren't resorted when using -G option and one + of the tags is missing from a file + - Fixed incompatiblity with Google Photos when writing UserData:GPSCoordinates + to MP4 videos + - Fixed problem where the tags available in a -p format string were limited to + the same as the -if[NUM] option when NUM was specified + - Fixed incorrect decoding of SourceFileIndex/SourceDirectoryIndex for Ricoh + models + +Nov. 12, 2020 - Version 12.10 + + - Added -validate test for proper TIFF magic number in JPEG EXIF header + - Added support for Nikon Z7 LensData version 0801 + - Added a new XMP-GPano tag + - Decode ColorData for the Canon EOS 1DXmkIII (thanks LibRaw) + - Decode more tags for the Sony ILCE-7SM3 (thanks Jos Roost) + - Automatically apply QuickTimeUTC option for CR3 files + - Improved decoding of XAttrMDLabel from MacOS files + - Ignore time zones when writing date/time values and using the -d option + - Enhanced -echo3 and -echo4 options to allow exit status to be returned + - Changed -execute so the -q option no longer suppresses the "{ready}" message + when a synchronization number is used (eg. -execute123) + +Oct. 29, 2020 - Version 12.09 + + - Added ability to copy CanonMakerNotes from CR3 images to other file types + - Added read support for ON1 presets file (.ONP) + - Added two new CanonModelID values + - Added trailing "/" when writing QuickTime:GPSCoordinates + - Added a number of new XMP-crs tags + - Added a new Sony LensType (thanks Jos Roost) + - Added a new Nikon Z lens (thanks LibRaw) + - Added a new Canon LensType + - Decode ColorData for Canon EOS R5/R6 + - Decode a couple of new HEIF tags + - Decode FirmwareVersion for Canon M50 + - Improved decoding of Sony CreativeStyle tags (thanks Jos Roost) + - Improved parsing of Radiance files to recognize comments + - Renamed GIF AspectRatio tag to PixelAspectRatio + - Patched EndDir() feature so subdirectories are always processed when -r is + used (previously, EndDir() would end processing of a directory completely) + - Yet another tweak to the EventTime formatting rules (also allow time-only + values with fractional seconds and a time zone) + - Avoid loading GoPro module unnecessarily when reading MP4 videos from some + other cameras + - Fixed problem with an incorrect naming of CodecID tags in some MKV videos + - Fixed verbose output to avoid "adding" messages for existing flattened XMP + tags + +Oct. 15, 2020 - Version 12.08 + + - Added read support for MacOS "._" sidecar files + - Added a new Sony LensType (thanks Jos Roost) + - Recognize Mac OS X xattr files + - Extract ThumbnailImage from MP4 videos of more dashcam models + - Improved decoding of a number of Sony tags (thanks Jos Roost) + - Fixed problem where the special -if EndDir() function didn't work properly + for directories after the one in which it was initially called + - Patched to read DLL files which don't have a .rsrc section (thanks Hank) + - Patched to support new IGC date format when geotagging + - Patched to read DLL files with an invalid size in the header + +Oct. 2, 2020 - Version 12.07 + + - Added support for GoPro .360 videos + - Added some new Canon RF and Nikkor Z lenses (thanks LibRaw) + - Added some new Sony LensType and CreativeStyle values and decode some + ILCE-7C tags (thanks Jos Roost) + - Added a number of new Olympus SceneMode values (thanks Herb) + - Added a new Nikon LensID + - Decode more timed metadata from Insta360 videos (thanks Thomas Allen) + - Decode timed GPS from videos of more Garmin dashcam models + - Decode a new GoPro video tag + - Reformat time-only EventTime values when writing and prevent arbitrary + strings from being written + - Patched to accept backslashes in SourceFile entries for -csv option + +Sept. 11, 2020 - Version 12.06 + + - Added read support for Lyrics3 metadata (and fixed problem where APE + metadata may be ignored if Lyrics3 exists) + - Added a new Panasonic VideoBurstMode value (thanks Klaus Homeister) + - Added a new Olympus MultipleExposureMode value + - Added a new Nikon LensID + - Added back conversions for XMP-dwc EventTime that were removed in 12.04 with + a patch to allow time-only values + - Decode GIF AspectRatio + - Decode Olympus FocusBracketStepSize (thanks Karsten) + - Extract PNG iDOT chunk in Binary format with the name AppleDataOffsets + - Process PNG images which do not start with mandatory IHDR chunk + +Aug. 24, 2020 - Version 12.05 + + - Added a new Panasonic SelfTimer value (thanks Herb) + - Decode a few more DPX tags (thanks Harry Mallon) + - Extract AIFF APPL tag as ApplicationData + - Fixed bug writing QuickTime ItemList 'gnre' Genre values + - Fixed an incorrect value for Panasonic VideoBurstResolution (thanks Herb) + - Fixed problem when applying a time shift to some invalid makernote date/time + values + +Aug. 10, 2020 - Version 12.04 + + - Added read support for Zeiss ZISRAW CZI files + - Added some new values for a couple of Olympus tags (thanks Sebastian) + - Decode a number of new tags for the Sony ILCE-7SM3 (thanks Jos Roost) + - Removed formatting restrictions on XMP-dwc:EventTime to allow a time-only + value to be written + - Moved new QuckTime ItemList tags added in version 12.02 to the proper group + (they were incorrectly added to the Keys group) + - Improved QuickTime -v3 output to show default language codes + - Patched -lang option to work for the values of somet tags with coded + translations + - Patched the format of a number of QuickTime tags when writing for improved + compatibility with iTunes and AtomicParsley + - Patched to write a default QuickTime language code of 0x0000 (null) instead + of 0x55c4 ('und') + +July 29, 2020 - Version 12.03 + + - Added family 7 group names to allow tag ID's to be specified when reading + and writing + - Fixed a couple of typos in tag values (thanks Herb) + - API Changes: + - Added HexTagIDs option + - Enhanced GetNewValue() to allow family 7 groups names to be used + - Internal Changes: + - Changed Composite tag ID's to use "-" instead of "::" as a separator + +July 27, 2020 - Version 12.02 + + - Added support for a number of new QuickTime ItemList tags + - Added support for writing XMP-xmp:RatingPercent + - Added a new Sony LensType (thanks Jos Roost and LibRaw) + - Added a new Pentax LensType (thanks James O'Neill) + - Decode barcodes from Ricoh APP5 RMETA segment + - Decode a few new QuickTime tags written by Ricoh and Garmin cameras + - Decode timed GPS from Sony A7R IV MP4 videos + - Decode timed GPS from 70mai dashcam videos + - Decode a few new Panasonic tags (thanks Klaus Homeister) + - Decode altitude and more accurate latitude/longitude from Transcend Driver + Pro 230 MP4 videos + - Improved decoding of some Canon EOS 1DXmkIII custom functions + - Allow integer QuickTime TrackNumber and DiskNumber values + - Relax validity check of QuickTime:ContentCreateDate when writing with -n + - Removed "Com" from the start of some unknown QuickTime ItemList tag names + - Patched CanonCustom decoding for bug in Canon EOS-1DX firmware + - Changed QuickTime CleanAperture tags decode as signed rationals + +June 24, 2020 - Version 12.01 + + - Added a new NEFCompression value (thanks Warren Hatch) + - Added a new Sony LensType (thanks Jos Roost) + - Decode timed GPS from Rove Stealth 4K dashcam videos + - Fixed bug which would corrupt TIFF images with 16-bit image data offsets + when writing (these are very rare) + +June 11, 2020 - Version 12.00 (production release) + + - Added two new Olympus LensTypes (thanks Don Komarechka for one) + - Added two new Sony LensType values (thanks Jos Roost) + - Added a few new Nikon LensID's (thanks Mathieu Carbou) + - Added support for the Sony ZV-1 (thanks Jos Roost) + - Added a new CanonModelID (thanks Jos Roost) + - Added missing MimeType values for HEICS and HEIFS files + - Added definitions for a number of new XMP-crs tags + - Recognize WOFF and WOFF2 font files + - Decode streaming GPS from Roadhawk, EEEkit and 360Fly MP4 videos + - Decode a number of new tags for the Nikon D6 (thanks Warren Hatch) + - Decode a couple more AF tags for the D500/D850 + - Decode a number of new Panasonic tags + - Improved Composite LensID logic (thanks Matt Stancliff) + - Enhanced -v option to state when a directory has 0 entries + - Removed a couple of incorrect Validate warnings for bilevel TIFF images + - Drop ContrastCurve tag when copying from NEF to JPEG + - Changed -csv output to add "Unknown" group name to column headings for + missing tags when -f and -G options are used + - Patched to support new XMP LensID format for Nikon cameras as written by + Apple Photos (thanks Mattsta) + - Fixed problem extracting metadata from Sigma DP2 Quattro X3F files + - Fixed End() and EndDir() functions so they work when writing and when the -v + option is used + - Fixed problem recognizing some PGM files + - Fixed bug in offsets for some Photoshop information in -v3 output + - Fixed problem writing a list containing empty elements inside an XMP + structure + - API Changes: + - Added NoMultiExif option + - Changed FilterW option to not write tag if $_ is set to undef + +May 11, 2020 - Version 11.99 + + - Added a new Nikon LensID (thanks Mykyta Kozlov) + - Added a new Canon LensType + - Added a newn PentaxModelID + - Decode a few new QuickTime tags + - Decode new ID3 Grouping tag + - Decode a few more MinoltaRaw tags (thanks LibRaw) + - Fixed runtime warning which could occur when reading corrupted RTF files + - Fixed another potential pitfall in M2TS Duration calculation + - Fixed problem extracting some unknown QuickTime:Keys tags + - Fixed problem decoding Nikon D850 orientation tags + - Fixed bug where TIFF image data may not be padded to an even number of bytes + +May 1, 2020 - Version 11.98 + + - Added a new Nikon LensID (thanks Warren Hatch) + - Added a new Sony LensType (thanks LibRaw) + - Added a new Canon LensType + - Patched to extract EXIF with an "Exif\0\0" header from WebP images + - Enhanced -efile option and added to the documentation + - Minor tweak to -htmlDump output (disallow locking of empty selection) + - Fixed problem determining Duration of some M2TS videos + +Apr. 27, 2020 - Version 11.97 + + - Added experimental -efile option (undocumented) + - Decode NMEA GGA sentence from streaming GPS of some dashcam videos + +Apr. 24, 2020 - Version 11.96 + + - Decode streaming GPS from Lucas LK-7900 Ace AVI videos + - Changed new Exit/ExitDir function names to End/EndDir + - Fixed inconsistencies when using "-use mwg" together with the -wm option + +Apr. 23, 2020 - Version 11.95 + + - Added Exit() and ExitDir() functions for use in -if conditions (NOTE: these + function names changed to End() and EndDir() in ExifTool 11.96) + - Enhanced -geotag feature to support a more flexible input CSV file format + - Enhanced -if and API Filter options to allow access to ExifTool object via + $self + - Fixed problem reading HEIC Exif with a missing header + +Apr. 17, 2020 - Version 11.94 + + - Added support for QuickTime ItemList:GPSCoordinates + - Added additional Validate test for overlapping EXIF values + - Added a new Sony LensType (thanks Jos Roost) + - Added a new Nikon LensID + - Decode a few more Nikon tags (thanks Warren Hatch) + - Decode Pentax ShutterType + - Changed color of locked highlighted selection in -htmlDump output + - Fixed problem reading PDF files written by Microsoft Print-to-PDF + - Fixed problem where -X output would produce invalid XML for MP4 files + containing an HTCTrack + +Apr. 3, 2020 - Version 11.93 + + - Added new config file to the distribution for writing Pix4D XMP-Camera tags + (config_files/pix4d.config) + - Added support for the DOSCyrillic (cp866) character set + - Added IO::String to the Windows EXE version + - Improved identification of Canon RF lenses (thanks LibRaw) + - Enhanced -htmlDump output to add "File offset" entry for EXIF tags and + ability lock highlighted selection by clicking the mouse + - Enhanced -srcfile option to generate OriginalFileName and OriginalDirectory + UserParam tags + - Patched HEIC writer to add missing pitm box if necessary + - Fixed problem adding back EXIF after deleting it from HEIC file + - Fixed minor problem with incorrect number of bytes being reported for + invalid header in corrupt files + - API Changes: + - Enhanced UserParam option to allow parameters to be extracted as if + they were normal tags + +Mar. 19, 2020 - Version 11.92 + + - Added a new Nikon LensID (thanks Wolfgang Exler) + - Decode a few new Leica tags (thanks Tim Gray) + - Decode AccelerometerData from Samsung Gear 360 videos + - Fixed a couple of problems decoding timed GPS metadata from NextBase dashcam + videos + - Fixed problem where -X option could produce invalid XML when reading + corrupted XMP + +Mar. 5, 2020 - Version 11.91 + + - Added undocumented -xpath option for use by alternate Windows version + - Decode a couple of new Panasonic tags + - Documented -ec option (available since version 11.54) + - Reverted -htmlDump fix of 11.90 because it broke more than it fixed, and + instead applied a targeted patch to fix this problem for RW2 files + +Mar. 3, 2020 - Version 11.90 + + - Added a new Sony LensType (thanks LibRaw and Jos Roost) + - Added two new Olympus LensType values + - Added a new Canon LensType + - Added some new Canon RecordMode values + - Added some new QuickTime GeneralProfileIDC values + - Added new values for a couple of FujiFilm tags + - Added a number of new QuickTime GenreID values + - Decode Nikon Z6/Z7 phase-detect AF points (thanks Andy Dragon) + - Patched to avoid possible "Undefined subroutine" error in MacOS 10.15 + - Fixed incorrect offsets in -htmlDump output for some file types + +Feb. 25, 2020 - Version 11.89 + + - Added support for Exif 2.32 for XMP + - Recognize the HIF file extension + - Improved verbose output for QuickTime iref items + - Patched to create new GPS metadata in Canon CR3 images using a default byte + order that is the same as existing EXIF boxes + - Patched to add missing newline that could occur in XMP with the API Compact + Shorthand option + +Feb. 20, 2020 - Version 11.88 + + - Added write support for new Google depth-map XMP tags + - Added config_files/depthmap.config to the distribution + - Added minor error when attempting to write FFF images due to incompatibility + with Hasselblad Phocus software + - Patched to avoid "Invalid iloc offset size" error when writing some + QuickTime-based files + - Fixed incorrect ColumnCount for CSV files + - Fixed various spelling errors (thanks Jens Schleusener) + - Fixed bug writing QuickTime:Rotation in HEIC files + +Feb. 13, 2020 - Version 11.87 + + - Added read support for CSV files + - Added "--" option to indicate the end of options + - Added ability to read/write/copy/delete the JPEG trailer as a block + - Added new Olympus CameraType and LensType values (thanks LibRaw) + - Decode a few more FujiFilm tags + - Enhanced -fast option (API FastScan) to bypass PNG CRC validation when + writing + +Feb. 4, 2020 - Version 11.86 + + - Added support for DNG version 1.5 + - Added config_files/acdsee.config to the full distribution (thanks StarGeek) + - Added a new Sony LensType (thanks Jos Roost and LibRaw) + - Decode two more bits from Nikon LensType (thanks LibRaw) + - Decode QuickTime MovieFragmentSequence + - Patched HEIC writer to add missing iref box if necessary + - Fixed typo in a Canon LensType value + - API Changes: + - Patched ImageInfo() to recognize a stringified object as a file name + +Jan. 28, 2020 - Version 11.85 (production release) + + - Added a new Sony LensType (thanks Jos Roost) + - Added a new Olympus CameraType (thanks LibRaw) + - Added a two new Pentax LensType values + - Added a new FujiFilm FocusMode + - Decode timed GPS from Akaso dashcam MOV videos + - Decode Insta360 trailer from INSP images and made Insta360 a deletable group + - Patched kml.fmt file to limit maximum image size (thanks Fedor Kotov) + - Fixed problem decoding values from Leica M10 and S maker notes + +Jan. 10, 2020 - Version 11.84 + + - Decode accelerometer data from timed metadata of more dashcam videos + - Decode Canon G9 white balance tags (thanks LibRaw) + - Recognize INSP files + +Jan. 9, 2020 - Version 11.83 + + - Added a couple of new XMP-crs tags (thanks Herb) + - Fixed bug introduced in 11.82 with the -php -D output + - Fixed problem where some flattened XMP tags could be written when they + should be avoided + +Jan. 8, 2020 - Version 11.82 + + - Added a new Canon LensType + - Added a new CanonModelID (thanks LibRaw) + - Added ability to process SubDirectories in QuickTime Keys tags + - Removed minor error when writing PDF 2.0 files (github issue #30) + - Fixed problem where trailing null bytes were removed from binary values in + the -php output when the -b option was used + +Jan. 2, 2020 - Version 11.81 + + - Added a new Nikon LensID + - Added two new CanonModelID's (thanks LibRaw) + - Decode AVIF AV1 configuration record + - Changed names of QuickTime MovieData tags to "MediaData" + - Patched to use 4-digit years in Time::Local calls + - Patched Composite sub-second date/time tags to do additional validation of + source EXIF date/time tags before adding sub seconds + - Fixed problem where -json output could produce invalid JSON when -struct was + used and the structure field names contained special characters (github + issue #32) + - Fixed spelling in a Panasonic SceneMode value (thanks Hubert) + +Dec. 17, 2019 - Version 11.80 + + - Added a new Canon LensType + - Added a new Nikon Z LensID (thanks LibRaw) + - Added a few new Sony LensType values (thanks Jos Roost) + - Attempt to improve reliability of Samsung DepthMapWidth/Height decoding + - Updated a number of Canon-mount Tamron lens names to include the Tamron + model number + - Patched MOV/MP4 writer to allow a small amount of garbage at the end of a + file to be deleted when writing with the -m option + - Fixed bug where some Composite tags may not have taken priority over other + tags as they should have + +Dec. 12, 2019 - Version 11.79 + + - Added support for AVIF files + - Added new Canon, Sigma and Sony LensType values (thanks LibRaw) + - Made PDF 2.0 writable at your own risk with the -m option (github issue #30) + - Enhanced -validate feature to warn about duplicate languages in an XMP + lang-alt list + - Fixed inconsistency between documentation and ExifTool capabilities for + "Writable" status of some tags + +Dec. 5, 2019 - Version 11.78 + + - Added a new Nikon LensID (thanks Chris) + - Added two new FujiFilm SceneRecognition values + - Patched to avoid crash in Windows when writing a negative epoch time using + the "-d %s" option + - Fixed problem editing MIE tags when using the "-wm w" option + +Nov. 27, 2019 - Version 11.77 + + - Added a new Nikon LensID (thanks Joe Schonberg) + - Added a number of new Olympus LensType values (thanks LibRaw) + - Added a new Canon LensType + - Decode timed GPS from Ambarella A12 dash cam MP4 videos + - Decode a number of new Sigma tags (thanks LibRaw) + - Decode a couple of new PanasonicRaw tags (thanks LibRaw) + - Enhanced -fileOrder option to add -fast feature + +Nov. 12, 2019 - Version 11.76 + + - Added support for the Sony ILCE-9M2 (thanks Jos Roost) + - Added a couple of new XMP-GCamera tags + - Added MIMEType values for some formats that previously reported + "application/unknown" + - Enhanced -geotag feature to write pitch to CameraElevationAngle if available + - Improved determination of MIMEEncoding for TXT files + +Nov. 4, 2019 - Version 11.75 + + - Added ability to read some basic characteristics of TXT files + - Added kml_track.fmt to the fmt_files of the full distribution + - Added built-in support for decoding GPS from the four video subtitle text + formats that were previously handled by separate config files, and removed + these config files from the distribution + - Derive GPSDateTime from CreateDate and SampleTime if not already available + when extracting timed GPS metadata from QuickTime-format videos + - Changed family 2 groups of some Extra tags + +Oct. 29, 2019 - Version 11.74 + + - Added support for new XMP IPTC Extension version 1.5 tags + - Added a new Nikon LensID (thanks LibRaw) + - Decode GPS track from Auto-Vox dashcam MOV videos + - Improved Russian translations (thanks Andrei Korzhyts and Alexander) + - Enhanced convert_regions.config to support new IPTC Extension 1.5 ImageRegion + - Changed the way the FlatName element works when used in a structure element + (the structure name is now added as a prefix to the flattened tag name) + - Patched gpx.fmt and gpx_wpt.fmt to support sub-seconds in GPSDateTime value + +Oct. 23, 2019 - Version 11.73 + + - Decode timed metadata from Parrot drone videos + - Patched dji.config file to properly handle time zones + - Fixed bug which caused runtime error when reading timed metadata from Cobra + Dash Cam AVI videos + +Oct. 22, 2019 - Version 11.72 + + - Added warning messages for corrupted Photoshop document data + - Added a new Olympus CameraType + - Added a new Canon LensType + - Decode more Sigma tags + - Improved Russian translations (thanks Alexander) + - Updated decoding of some CanonCustom settings for recent models + - Documented DNG OpcodeList values + +Oct. 16, 2019 - Version 11.71 + + - Added a new Sony LensType (thanks Jos Roost) + - Added a few new Nikon Z LensID's + - Added a simple print conversion for DNG OpcodeList tags (note that due to + this, these tags must now be copied using the -n option) + - Fixed problems determining some video parameters for DV files + - Changed behaviour of -sep option when writing empty list items + - API Changes: + - Changed ListSplit option to preserve empty list items + +Oct. 10, 2019 - Version 11.70 (production release) + + - Added a new CanonModelID (thanks Laurent Clevy) + - Improved identification of Office Open XML files (github issue #27) + - Removed RAF version check when writing FujiFilm RAF files + - Limited the number of accelerometer records that ExifTool will read by + default with the -ee option from INSV files to avoid excessive processing + times and memory usage + - Patched Windows version to allow reading of shared files with Unicode names + (thanks Eriksson) + - Patched to avoid converting some bad GPS coordinates (thanks Csaba Toth) + - Fixed verbose output to include YCbCrSubSampling for JPEG files + - Fixed conversion and group names for the new FujiFilm tag added in 11.68 + - Fixed format of GeoTiffDirectory and GeoTiffDoubleParams when writing + +Oct. 2, 2019 - Version 11.69 + + - Fixed bug introduced in version 11.66 where the sign was lost when writing + coordinate values between 0 and -1 to QuickTime:GPSCoordinates + +Oct. 1, 2019 - Version 11.68 + + - Added read support for yet another type of streaming GPS in MP4 videos + - Added a number of new FujiFlashMode values + - Decode a new FujiFilm tag + - Made NikonCaptureOffsets and NikonCaptureVersion deletable + - Enhanced tag name documentation to indicate deletable MakerNotes tags + +Sept. 30, 2019 - Version 11.67 + + - Added config_files/thinkware.config to the distribution + - Fixed bug decoding negative GPS coordinates from INSV videos + +Sept. 30, 2019 - Version 11.66 + + - Added a new Nikon LensID (thanks LibRaw) + - Added a few new Canon LensType values (thanks LibRaw and Tom Lachecki) + - Decode a few more Hasselblad tags (thanks LibRaw) + - Decode a new Canon tag (thanks Laurent Clevy) + - Decode more Samsung trailer tags + - Extract BWF iXML, aXML and UMID from RIFF-format files + - Extract ICC_Profile from more types of PDF files + - Enhanced %s of the -W option to recognize the PICT format + - Recognize MacOS alias files + - Changed name of Ricoh CropMode35mm tag and added a new value (thanks LibRaw) + - Minor change to a Minolta lens name (thanks Jos Roost) + - Fixed problem where NikonCapture information couldn't be deleted from an NEF + - Fixed problem identifying some SVG files + - Fixed typo in a CanonModelID value (thanks Dmitry) + - Fixed bug which could result in "Internal error: no list index" warning when + creating nested XMP lang-alt lists + - Fixed the names of a few Tamron lenses for Nikon (thanks Tom Lachecki) + - Fixed problem extracting Layer information from some PSD files + - Fixed writing of QuickTime GPSCoordinates to use the correct number of + digits before the decimal point for latitude and longitude + +Aug. 29, 2019 - Version 11.65 + + - Added new SonyModelID and Sony LensType values (thanks LibRaw and Jos Roost) + - Added support for some new Sony models (thanks Jos Roost) + - Added a couple of new CanonModelID values (thanks LibRaw) + - Added a new Canon ColorDataVersion value + - Enhanced FastScan option so a setting of 2 stops processing PNG images at + the IDAT chunk when reading + - Preserve order of nested lang-alt list entries when -struct option is used + +Aug. 28, 2019 - Version 11.64 + + - Added a new Canon LensType (thanks LibRaw) + - Added a new Nikon LensID (thanks Bruno) + - Added config file for converting streaming GPS from BlueSkySea dashcam + - Decode FocusDistance for Nikon Z6/Z7 + - Documented groups in families 5 and 6 (available but undocumented since + Exiftool version 8.22 and 11.50 respectively) + - Fixed some ordering problems when writing/copying nested XMP lang-alt lists + - Fixed some minor quirks with QuickTime language codes (thanks Hayo Baan) + - Fixed a CanonModelID value (thanks Dmitry) + - API Changes: + - Documented SavePath and SaveFormat options + +Aug. 20, 2019 - Version 11.63 - "PNG Early Text" + + - Added a few new Sigma lenses (thanks LibRaw) + - Improved handling of Canon CNTH atom in MOV/MP4 videos + - Changed PNG writer to place all text chunks before IDAT (not just XMP) + (github issue #23) + - Issue minor warning for any text chunk after PNG IDAT (not just XMP) + - Enhanced ForceWrite feature to allow "PNG" to be specified (to move existing + text chunks to before IDAT without editing any metadata) + - Removed Windows "surrogate" warning for files that wouldn't be processed + anyway + - Fixed some entries in the Minolta LensType list (thanks Jos Roost) + - Fixed identification of a Sony lens (thanks Jos Roost) + +Aug. 15, 2019 - Version 11.62 + + - Added a number of new Canon, Pentax, Sony and Sigma lenses (thanks LibRaw) + - Removed some extraneous verbose warnings when geotagging + - Removed Minolta LensType value for a non-existent lens (thanks LibRaw) + - Patched problem writing some simple qualified XMP values + - Patched to avoid writing files in Windows with Unicode surrogate characters + in their name unless the -overwrite_original_in_place option is used + - Fixed an incorrect Pentax LensType (thanks LibRaw) + - Fixed family 2 group names of some XMP-exifEX and XMP Composite tags + +Aug. 7, 2019 - Version 11.61 + + - Added a new FujiFilm CropMode (thanks LibRaw) + - Added a few new proprietary CustomRendered values (thanks Jeffrey Friedl) + - Added a new Nikon LensID and fixed a Canon LensType (thanks LibRaw) + - Added a new CanonModelID + - Decode more Sony DSC-RX100M7 tags (thanks Jos Roost) + - Write standard EXIF to PNG even if non-standard EXIF already exists + - Changed a Minolta/Sony LensType (thanks LibRaw) + - Changed Composite GPS reference direction tags to be derived from only the + XMP-exif GPS coordinate tags (and not other XMP GPS coordinates) + - Reverted a PNG Validation check that was removed from 11.60 + - Patched to avoid problems overriding new values when writing thumbnail and + preview images + +July 30, 2019 - Version 11.60 + + - Added a few new Sigma LensType values (thanks LibRaw) + - Updated Sony makernote decoding for the DSC-RX100M7 (thanks Jos Roost) + - Various internal improvements to PNG reader/writer + - Fixed bug in RIFF decoder that could cause an "undefined subroutine" error + (thanks Hayo Baan) + - Fixed problem writing some QuickTime tags if the PREFERRED levels were + changed via the config file + - Install Changes: + - Properly erase all temporary files after validation tests + +July 25, 2019 - Version 11.59 + + - Added a new SonyModelID (thanks LibRaw) + - Changed block delete to allow subsequent writing of tags from the same group + (like a group delete) + - Minor changes to warnings and verbose output when writing PNG images + - Fixed potential runtime warning on an error rewriting XMP in a PNG image + +July 25, 2019 - Version 11.58 + + - Added a number of new Canon and Sony LensType values (thanks LibRaw) + - Decode NikonMeteringMode for the D500 + - Decode LensID for Nikon Z lenses + - Extract RawThermalImage from Parrot Bebop-Pro Thermal images + - Validate PNG CRC values when writing or using the Validate option + - Improved Russian translation (thanks Andrei Korzhyts) + - Improved identification of some Tamron lenses for Canon cameras + - Changed name of D810MeteringMode tag to NikonMeteringMode + - Patched writing of XMP in PNG images to always come before IDAT, and warn if + XMP comes after IDAT when reading + - Fixed problem replacing multiple lang-alt default-language structure + elements in lists of XMP structures (behaviour for other languages still not + ideal) + - API Changes: + - Removed PNGEarlyXMP option + - Fixed problem introduced in 11.54 which caused Options('UserParam') to + return undef + - Internal Changes: + - A block delete of EXIF, XMP, IPTC, etc now sets the group delete flag + +July 19, 2019 - Version 11.57 + + - Improved decoding of some tags for the Sony ILCE-7RM4 (thanks Jos Roost) + - Minor change to a Sony lens name + - Fixed format of a number of 8-bit integer QuickTime tags when writing + - Fixed problem replacing multiple structure elements in lists of XMP + structures + +July 18, 2019 - Version 11.56 + + - Added support for the Sony ILCE-7RM4 (thanks Jos Roost) + - Added a new SonyModelID (thanks LibRaw) + - Added a few new Sony/Minolta LensType values (thanks LibRaw and Jos Roost) + - Decode some new Nikon and Motorola tags (thanks Neal Krawetz) + - Decode a couple more ColorData tags for some Canon models + - Extract PreviewImage from DNG files which don't have a .DNG extension + - Extract Huawei APP7 maker notes with the Unknown (-u) option + - Internal change in LensID logic for Sony E-type lenses + +July 12, 2019 - Version 11.55 + + - Added write support for XMP-crs:Texture and XMP-drs tags + - Added a number of new Panasonic NoiseReduction values + - Added definition for a new Kodak tag (thanks LibRaw) + - Added a couple of new Panasonic AFAreaMode values (thanks Daniel Beichl) + - Added a couple of new Sony/Minolta LensTypes (thanks Jos Roost and LibRaw) + - Added a new CanonModelID + - Decode HEVCConfiguration record from HEIC images + - Decode a new Panasonic tag + - Decode a new QuickTime tag + - Changed internal handling of Composite tag ID's to include module name + - Removed "FE" designation from Samyang E-mount lenses + - Dropped Validate warning about missing GPSProcessingMethod tag + +July 2, 2019 - Version 11.54 + + - Added new Canon and Sony/Minolta LensType values (thanks LibRaw) + - Added a number of new Sony/Minolta LensType values (thanks Jos Roost) + - Added "Unknown" value for new EXIF CompositeImage tag + - Added ability to write GSpherical tags in video track of MOV/MP4 files + - Added support for geotagging from GPS/IMU CSV-format files + - Improved Russian translation (thanks Alexander) + - Improved Validate feature to check ExifVersion/GPSVersionID numbers + - Accept unsigned numbers when setting GPSAltitudeRef from a numerical value + - Fixed decoding of DepthMapWidth/Height for some Samsung live-focus images + - Fixed a couple of incorrect/incomplete CanonModelID values (thanks LibRaw) + - Fixed problem identifying some Canon lenses when used on a Sony camera with + a Metabones adapter + - API Changes: + - Added FilterW option + - Enhanced Compact option to improve flexibility and include features of + XMPShorthand option + - Removed XMPShorthand option from documentation + +June 24, 2019 - Version 11.53 - "Exif 2.32" + + - Added support for the new tags of the Exif 2.32 specification + - Added a new SamsungModelID (thanks LibRaw) + - Added warning if extracting ZIP file contents without the -a option + - Added ability to extract EmbeddedVideo from the trailer of Android JPEG + images with the ExtractEmbedded option + - Decode timed GPS from Cobra Dash Cam AVI videos + - Decode a new GoPro tag + - Enhanced -struct option to allow extraction of structured Torrent Info + - Improved error handling when an unexpected terminator is encountered while + writing a QuickTime-format file + - Renamed one of the Nikon Saturation tags to "SaturationAdj" + - Removed warning message when writing FujiFilm RAFVersion 0240 and 0261 files + - Fixed encoding problem when writing some QuickTime UserData tags with + strings containing special characters + - API Changes: + - Enhanced XMPShorthand option to add level 2 + +June 17, 2019 - Version 11.52 + + - Added a few new Nikon CropHiSpeed values (thanks Hayo Baan) + - Added a new Nikon LensID (thanks Yves) + - Fixed problem where reading a large, corrupt AIFF file may could take an + excessively long time + - API Changes: + - Enhanced Compact option to add levels 3, 4 and 5 (github issue #16) + +June 13, 2019 - Version 11.51 + + - Decode Canon DistortionCorrection tags + - Removed a minor EXIF warning when processing EPS files with a DOS header + - Fixed bug which caused an error when rewriting some EPS files multiple times + +June 11, 2019 - Version 11.50 (production release) + + - Added a new Canon LensType and two new Sony LensTypes (thanks LibRaw) + - Added tiff_version and rotate_regions config files to the distribution + - Added two new QuickTime Keys tags and made some existing Keys unwritable + - Improved Composite LensID logic to make better use of EXIF LensModel + - Improved logic when writing BinaryData tags to allow multiple interdependent + tags to be written in a single command + - Improved -htmldump output to show names of Unknown tags + - Allow advanced formatting expressions to access the current tag key ($tag) + - Remove escaped nulls from -json string values + - Reverted change in ExifTool 11.38 so that Composite GPS reference directions + are generated again even if the EXIF versions of these tags already exist + - Fixed an incorrect FlashPix CodePage conversion + +June 5, 2019 - Version 11.49 + + - Added inverse print conversion for one of the QuickTime ItemList Genre tags + - Avoid creating a few obscure QuickTime UserData tags when writing + - Fixed problem where some QuickTime groups were not being created when + writing QuickTime tags without specifying a group + - Fixed problem where QuickTime Keys tags could be duplicated when writing an + existing alternate-language tag + - Fixed problem were QuickTime Keys alternate-language tags would not be + written when deleting the corresponding default-language tag in the same + command + - Fixed some inconsistencies when writing QuickTime tags using the -wm + (WriteMode) option + - Fixed an incorrect Pentax Sigma LensType value + +June 1, 2019 - Version 11.48 + + - Added write support for Google GCamera and GCreation XMP tags + - Renamed XMP-GDepth "Data" tag to "DepthImage" + - Fixed bug where some QuickTime UserData tags could be duplicated when + writing + +May 31, 2019 - Version 11.47 + + - Fixed problem which resulted in a warning for one of the CanonVRD tests on + some platforms + +May 31, 2019 - Version 11.46 - "CR3 update" + + - Added ability to write CanonVRD tags in CR3 images + - Decode a couple more tags from Canon CR3 images + - Enhanced Validate option to check for duplicate QuickTime atoms + - Relaxed constraints when writing IPTC date tags to allow use of separators + other than a colon + - Fixed CR3 writing to update CTBO table with any changed offsets or sizes + (although this table doesn't seem to be used by any RAW viewer, it may be + used in-camera to improve response time when browsing images) + +May 29, 2019 - Version 11.45 + + - CORRUPTION WARNING: Patched problem where Canon DPP would destroy a CR3 + image if the file had previously been edited by DPP then Exiftool + (If you have edited any CR3 images with ExifTool that had been previously + edited by DPP, then re-edit with ExifTool 11.45 or later to restructure the + file so DPP doesn't destroy it if used later to edit the file again) + - Added ability to create and delete QuickTime Keys tags + - Added sample config file (mini0806.config) to generate GPS tags from + subtitle Text in Mini 0806 dashcam videos + - Added new Canon and Nikon lenses (thanks LibRaw) + - Added a new Olympus CameraType (thanks LibRaw) + - Decode CanonVRD tags from CR3 images + - Improved handling of QuickTime language tags when writing + - Fixed bug introduced in 11.38 which could cause "Use of uninitialized value" + runtime warning when reading XMP GPS tags + - Fixed bug where QuickTime tags could be written when another group was + specified + - API Changes: + - Added QuickTimeHandler option + +May 21, 2019 - Version 11.44 + + - Added ability to extract XMP as a block from XMP files + - Prevent ExifIFD from being deleted from any RAW file type + - Fixed problem where some Canon tags couldn't be written in CR3 files + - Fixed problem reading QuickTime Keys tags with a space in the tag ID + - Fixed incorrect family 1 group when reading some QuickTime Keys tags + +May 17, 2019 - Version 11.43 - "Write HEIC and CR3" + + - Added ability to write/create EXIF and write ICC_Profile in HEIC images + - Added ability to write/create EXIF and write MakerNotes in CR3 images + (one might hope/expect EXIF to be stored in the same location for HEIC and + CR3 since they are both based on the QuickTime file format, but in fact they + couldn't be more different, and both are much more complicated than + necessary, which of course follows the seemingly established practice of + intentional obfuscation and zero standardization in video metadata) + - Added support for QuickTime ItemList:Author and Keys:DisplayName tags + - Prevent MakerNotes from being deleted from any RAW file type + - Fixed writing of XMP in HEIC files to conform with the HEIC specification + (obviously, Apple couldn't put this XMP in the same place as any other + QuickTime-based file format, because Apple is, after all, king of "Let's + reinvent the wheel!") + - Fixed problem where API WriteMode option wouldn't always prevent groups from + being created when group creation was disabled + +May 13, 2019 - Version 11.42 + + - Added ability to edit ThumbnailImage in Canon MOV videos + - Improved verbose hex dump for HEIC files + - Fixed another "Chunk offset outside movie data" error when writing some HEIC + files + +May 9, 2019 - Version 11.41 + + - Added write support and improved language handling for 3GP QuickTime tags + - Fixed format problems writing some binary values to QuickTime tags + - Fixed some language translations (thanks Herbert Kauer) + +May 7, 2019 - Version 11.40 + + - Added a new Canon LensType + - Added a new value for EXIF:SceneCaptureType used by some Samsung cameras + - Fixed QuickTime writing to preserve existing same-named default-language + tags in other groups when writing a default language tag + +May 3, 2019 - Version 11.39 - "Create QuickTime tags" + + - Added ability to create new QuickTime tags in MOV/MP4 videos + - Added two new Canon LensTypes and a new CanonModelID (thanks LibRaw) + - Added a few new Sony/Minolta LensType values (thanks Jos Roost) + - Added a number of new QuickTime GenreID values + - Added range check on date/time values when writing + - Decode Canon EOS D60 black levels + - Split off some QuickTime tags into different family 1 groups + - Fixed "Chunk offset outside movie data" error when writing some HEIC files + - Fixed decoding of Pentax AutoBracketing for K-1 and K-5 (github issue #15) + - Fixed some QuickTime family 2 group names + - Fixed bug introduced in 11.38 that broke extraction of thumbnail images from + Canon MOV videos + +Apr. 24, 2019 - Version 11.38 + + - Added Extra JPEGImageLength tag + - Added nksc.config to the sample config files + - Added a couple more Sony/Minolta LensTypes (thanks Jos Roost) + - Added a couple of new Sigma LensType values + - Decode a couple more tags from Pittasoft dashcam videos + - Decode two new FLIR tags (thanks Corinne Berthier) + - Decode a new ERF tag, and fix wrong format for some others (thanks LibRaw) + - Improved decoding of Sigma maker notes for some models + - Enhanced Composite tag logic to allow a scalar Inhibit entry + - Enhanced XMP processing to support readable subdirectories embedded in a tag + - Updated some language translations + - Patched Composite GPS reference direction tags to prevent them from being + created if these tags already exist + - Fixed problem reading some odd PDF files + +Apr. 17, 2019 - Version 11.37 + + - Added a new Sony AFAreaMode (thanks Jos Roost) + - Decode GPS and other tags from Pittasoft Blackvue dashcam videos + - Improved decoding of FujiFilm FlickerReduction + - Ignore any garbage before an NMEA sentence when geotagging + - Fixed bug which could result in loss of timed GPS metadata when writing MP4 + videos + +Apr. 15, 2019 - Version 11.36 + + - Added a number of new MacOS tags + - Added a new CanonModelID (thanks Laurent Clevy) + - Added some new Canon EasyMode and AFAreaMode values + - Added two new Canon AspectRatio values (thanks LibRaw) + - Decode a new Nikon tag (thanks LibRaw) + - Decode some new FujiFilm tags + - Updated Sony maker notes for the DSC-RX0M2 (thanks Jos Roost) + - Hide the Nikon ShotInfo offset tags + - Fixed problem decoding NikonCustom settings for some D810 firmware versions + - Fixed typo in a warning message (thanks Hayo Baan) + +Apr. 9, 2019 - Version 11.35 + + - Added print conversion for MDItemFSLabel + - Added a new Sony LensType (thanks Jos Roost) + - Added an additional -validate check for PNG images + - Decode a few more FujiFilm RAF tags (thanks LibRaw) + - Decode a couple more QuickTime tags + - Allow "Copy0" to be specified as a group name for the copy number of the + primary tag when extracting information + - Improved the Composite ImageSize tag to report the RawImageCroppedSize for + FujiFilm RAF images + - Changed Composite ImageSize tag to use a space instead of "x" as a separator + when the -n option is used + - Fixed problem writing user-defined PhaseOne SensorCalibration tags + - Fixed problem where a List-type tag may not be split into individual items + with the -sep option when using the advanced-formatting "@" feature + - API Changes: + - Patched a potential pitfall if calling code used both the old List and + ListSep options at the same time as the new ListJoin option + +Apr. 4, 2019 - Version 11.34 + + - Added a couple of new Canon LensType values (thanks LibRaw for one) + - Added a new CanonExposureMode value (thanks Arnold van Oostrum) + - Added support for FujiFilm X-H1 Ver2.01 RAF images + - Decode a couple of new Sony tags (thanks LibRaw) + - Improved decoding of Sony Shutter tag (thanks Jos Roost) + - Improved identification of some Sony lenses (thanks Jos Roost) + - Improved parsing of streamed metadata from TomTom Bandit videos + - Improved warning for truncated QuickTime atom + - Accept wider range of formats when writing QuickTime:GPSCoordinates + - API Changes: + - Changed SetFileName() 'Link' option name to 'HardLink' (but still allow + 'Link' for backward compatibility) + +Mar. 28, 2019 - Version 11.33 + + - Added write support for HEIC/HEIF files + - Added new write-only SymLink tag for creating symbolic links + - Made EXIF GDALMetadata and GDALNoData writable + - Enhanced writing capabilities for MOV/MP4 videos + - Enhanced -validate option to add more IPTC checks + - Updated decoding of Sony ILCE-9 maker notes for firmware version 5.00 + (thanks Jos Roost) + - Fixed problem reading streamed metadata from some TomTom Bandit videos + - API Changes: + - Added SymLink option to SetFileName() + +Mar. 14, 2019 - Version 11.32 + + - Added a new Nikon LensID (thanks Kenneth Cochran) + - Added a couple of new QuickTime HandlerType values + - Decode streamed metadata from DuDuBell M1 and VSYS M6L dashcam videos + - Attempt to improve Nikon lens identification + - API Changes: + - Added new single-argument version of ShiftTime() + +Mar. 7, 2019 - Version 11.31 + + - Added read support for FITS images + - Another try at removing spaces from some DICOM values (github issues #10/12) + +Mar. 6, 2019 - Version 11.30 (production release) + + - Added a new Sony/Minolta LensType (thanks Jos Roost) + - Decode streaming metadata from TomTom Bandit Action Cam MP4 videos + - Decode Reconyx HF2 PRO maker notes + - Decode ColorData for some new Canon models (thanks LibRaw) + - Enhanced -geotag feature to set AmbientTemperature if available + - Remove non-significant spaces from some DICOM values (github issues #10/12) + - Fixed possible "'x' outside of string" error when reading corrupted EXIF + - Fixed incorrect write group for GeoTIFF tags added in version 11.24 + +Feb. 28, 2019 - Version 11.29 + + - Added support for Ricoh GR III maker notes + - Added a new Canon LensType (thanks Claude Jolicoeur) + - Added a new XMP-crs tag (github issue #8) + - Enhanced -csv option to output base64-encoded binary data when combined with + -b or when the -charset option is used and the text has invalid characters + (github issue #11) + - Remove trailing space from even-length DICOM values (github issue #9) + - Patched to avoid "Hexadecimal number > 0xffffffff non-portable" warning + (github issue #6) + - Fixed meta charset attribute in -htmlDump output + +Feb. 21, 2019 - Version 11.28 + + - Added support for reading INSV video and decode streaming GPS + - Added a new Pentax LensType (thanks Louis Granboulan) + - Added a new FujiFilm ImageStabilization value + - Allow exiftool to be run via a symbolic link on Mac/Linux + - Reverted INDD patch of version 11.27 (ie. raise error again on incorrectly + terminated INDD object list) + - Changed handling of temporary documentation file in Windows version + +Feb. 14, 2019 - Version 11.27 + + - Added support for more XMP-dji-drone tags + - Added new Olympus CameraType and LensType values (thanks LibRaw) + - Added a new Canon LensType (thanks LibRaw) + - Added a new CanonModelID + - Decode yet another type of GPS from DashCam videos + - Allow FileName to be written when only case is changed on case-insensitive + filesystems + - Improved identification of some iWork file types + - Recognize the LRV file extension + - Changed Windows version to use the parent folder of PAR_GLOBAL_TEMP for the + temporary documentation file + - Don't raise an error if an INDD object list is terminated by spaces instead + of nulls + - Fixed some problems with new -htmldump IFD highlighting feature + - Fixed bug introduced in 11.24 with "-o -.EXT" feature + +Jan. 21, 2019 - Version 11.26 + + - Added a new Nikon LensID (thanks LibRaw) + - Decode more tags for the Sony ICLE-6400 (thanks Jos Roost and LibRaw) + - Enhanced -htmldump feature to highlight IFD when mousing over IFD offset + +Jan. 15, 2019 - Version 11.25 + + - Added a new Sony/Minolta LensType (thanks LibRaw) + - Added a new Nikon LensID + - Decode Leica D-Lux7 maker notes + - Decode more Nikon AF tags for newer models + - Decode Samsung Type2 maker notes with lower case Make + - Decode another Sony tag (thanks Jos Roost) + - Improved decoding of Nikon LensType + - Improved time shift feature to fix some incorrectly formatted date/time + values + - Renamed some Sony ImageCount tags to ShutterCount (thanks Jos Roost) + - Fixed problem reading back metadata written to some odd PDF files + +Jan. 8, 2019 - Version 11.24 + + - Compatibility Notice: Changed the meaning of '-' and '+' modifiers for %C + formatting code (does not affect lower-case %c code) + - Decode a number of new Nikon tags (thanks Michael Tapes for samples) + - Added new Olympus FlashType and FlashModel values (thanks Per) + - Added a new Canon LensType + - Added a new Nikon LensID + - Made more GeoTIFF tags writable + - Handle XMP rdf:value when reading + - Improved warning when trying to read a file with a zero-length name + - Fixed decoding of PictureControl tags for Nikon Z-7 + - Fixed problem writing date/time values with " DST" designator at end of + date/time string + - Fixed problem in Windows which could cause ExifTool to abort due to a + Win32::FindFile error if a file name contained surrogate Unicode characters + +Dec. 21, 2018 - Version 11.23 + + - Recognize DWG and DWF files + - Minor improvement to some -validate warnings + - Tolerate leading UTF-8 byte order mark (BOM) at start of JSON files + - Fixed problem recognizing some streaming camm metadata in QuickTime videos + +Dec. 13, 2018 - Version 11.22 + + - Added read support for PC Paintbrush (PCX) files + - Added two new Sony/Minolta LensTypes (thanks Jos Roost and LibRaw) + - Decode LensData tags for some newer Nikon models + - Decode ColorData for the Canon EOS R (thanks LibRaw) + - Recognize DCX files + +Dec. 7, 2018 - Version 11.21 + + - Added a new Sony/Minolta LensType (thanks Jos Roost) + - Added a new Olympus FlashModel (thanks Michael Meissner) + - Improved decoding of FujiFilm InternalSerialNumber (thanks LibRaw) + - Minor improvements to decoding of GPS from some dashcam videos + - Made XMP-getty:Personality a List-type tag + - Made it an error to use the -o option or write FileName or Directory tags + when using the TestName dry-run feature + - Fixed problem using -E with other character sets when writing + +Nov. 20, 2018 - Version 11.20 + + - Added a new Panasonic WhiteBalance value + - Added a new Nikon LensID (thanks LibRaw) + - Decode streaming GPS from MOV videos for another dashcam model + - Improved -E option to support character sets other than UTF-8 + +Nov. 14, 2018 - Version 11.19 + + - Added -fast4 option + - Enhanced -if option to allow arbitrary Perl expressions instead of just + logic expressions + - API Changes: + - Enhanced FastScan option to add a setting of 4 + +Nov. 12, 2018 - Version 11.18 + + - Decode a new Nikon tag (thanks Richard Butler) + - Decode a new FujiFilm tag + - Updated decoding of Sony maker notes for newer models (thanks Jos Roost) + - Enhanced -if option to allow fast processing pass to evaluate the condition + - Improved warning for unknown JPEG APP segment + +Nov. 4, 2018 - Version 11.17 + + - Added a new Canon LensType (thanks Norbert Wasser) + - Added a new Sony/Minolta LensType and a new SonyModelID (thanks LibRaw) + - Decode GPS from Garmin Dashcam videos + - Changed type of J2C files from a JPEG 2000 image to a JPEG 2000 codestream + +Oct. 26, 2018 - Version 11.16 + + - Decode FLIR GPS information + - Decode 3D image from RED Hydrogen smartphone + - Minor improvements to decoding of new FujiFilm tags + - Fixed problem where writing Shortcut tags with the -E option would double + unescape the HTML entities + +Oct. 25, 2018 - Version 11.15 + + - Added a couple of new Canon LensType values (thanks LibRaw and Andrew Shieh) + - Added a new Nikon LensID + - Added definitions for a few more VCard tags + - Added a new FujiFilm ShutterType value + - Decode some new FujiFilm tags (thanks Richard Butler) + - Store XMP GPS coordinates with two extra digits of precision and trim + trailing zeros + - Improved technique for handling rounding errors in times and GPS seconds + - Removed "Undersized IFD0 StripByteCounts" minor warning when writing ORF + files since this is a "feature" of most Olympus models + - Warn about undefined EXIF values with -validate option + - Changed the way Mask-ed values are decoded (do bit shift automatically) + - Changed FujiFilm HighISONoiseReduction tag to just "NoiseReduction", and + avoid extracting historic NoiseReduction tag if value is "n/a" + - Fixed potential problem reading GeoTiff tags with multiple SHORT values + - API Changes: + - Added GeoSpeedRef option + +Oct. 16, 2018 - Version 11.14 + + - Added more TIFF Compression values + - Added more AIFF CompressionType values + - Added more Nikon NEFCompression values (thanks LibRaw) + - Added a new Canon RecordMode + - Decode some new Canon custom functions + - Patched "Invalid VignettingCorrUnknown2 data" warning for EOS R CR3 images + - Fixed bug were any argument beginning with "-progress" on the command line + was interpreted as the -progress option + +Oct. 9, 2018 - Version 11.13 + + - Decode GPS from NextBase 512G dashcam MOV videos (different than 512GW) + - Added a new Canon LensType (thanks LibRaw) + - Minor improvements to verbose dump of streaming GPS metadata + - Reverted change of version 10.71 which resulted in Windows not recognizing + PNG CreationTime as written by ExifTool (added this feature to the API + StrictDate option instead) + - Improved decoding of Nikon CropHiSpeed (thanks LibRaw) + - Improved -fast option to reduce memory usage when reading JPG, PNG, + QuickTime-based and RIFF-based files via a sequential stream + - Fixed DOF calculation to use ApproximateFocusDistance if available + - API Changes: + - Enhanced StrictDate option to reformat PNG CreateTime according to PNG + specification + +Oct. 2, 2018 - Version 11.12 + + - Added a new Sony/Minolta LensType (thanks LibRaw and Jos Roost) + - Added a new Nikon LensID + - Decode a few new Sony SRF2 tags (thanks LibRaw) + - Decode GPS from NextBase 512GW dashcam MOV videos + - Validate MS-DOC FIB before extracting contained tags + - Fixed bug extracting GPSSpeed for some dashcam models + +Sept. 27, 2018 - Version 11.11 (production release) + + - Added ARQ to the list of supported file types + - Added support for GIMP XCF version 4 and later + - Added a new QuickTime HandlerType value + - Added read support for Apple AAE files + - Added a new CanonModelID and some new Canon LensType values (thanks LibRaw) + - Added a number of new Nikon LensID values (thanks Robert Rottmerhusen) + - Added a new Sony/Minolta LensType (thanks LibRaw) + - Decode more Sony IDC tags (thanks Jos Roost) + - Decode some new Panasonic tags (thanks Klaus Homeister) + - Decode more tags from Nikon MOV videos + - Decode a new Nikon tag (thanks LibRaw) + - Decode a large number of new Kodak IFD tags (thanks Jim McGarvey) + - Decode streaming GPS from videos of more dashcam and drone models + - Decode more tags from Microsoft Word DOC files + - Updated arg_files/iptcCore.args for IPTC Extension version 1.4 + - Patched to read corrupted MakN data written by buggy Adobe Camera Raw + - Downgraded "Undersized StripByteCounts" error for some RAW file types + - Fixed incorrect decoding of embedded GPS in Rexing V1P dashcam videos + - Fixed incorrect format for DNGPrivateData + - Fixed potential error when deleting maker notes from some images + - Fixed problem decoding Apple PLIST information from some files + - Fixed bug in Windows with CR/LF sequences in list values of the -X output + - Fixed some inconsistencies in detecting file name conflicts when writing the + TestName tag + +Aug. 17, 2018 - Version 11.10 + + - Added support for Canon 1DX firmware 2.1.0 + - Added a new Canon LensType (thanks LibRaw) + - Added a new Nikon LensID (thanks LibRaw) + - Added a new CanonModelID + - Decode more tags for newer Sony DSC models (thanks Jos Roost) + - Decode some new SonyIDC tags (thanks Jos Roost) + - Decode a number of new Panasonic tags (thanks Klaus Homeister) + - Improved validation of XMP namespaces + - Changed "File not found" messages to "Error: File not found" + - Fixed problem editing tags in Canon DR4 directory + +Aug. 13, 2018 - Version 11.09 + + - Added new Pentax and Canon LensType values + - Decode Google Camera Motion metadata from MP4 videos + - Decode more PanasonicRaw tags (thanks Klaus Homeister) + - Removed warning when multiple Word document LastSavedBy tags exist and the + Duplicates option wasn't enabled (added Note in tag name docs instead) + +Aug. 1, 2018 - Version 11.08 + + - Decode more tags from Microsoft Word documents, including LastSavedBy + - Decode image file characteristics from Windows EXE files + - Decode more PanasonicRaw tags (thanks Klaus Homeister) + - Changed names of new Samsung trailer tags + - Fixed potential problems converting C-style escaped strings + - Fixed new "#[CSTR]" feature to work with -stay_open option + +July 27, 2018 - Version 11.07 + + - Added "#[CSTR]" feature to -@ argfile + - Added some new Sony LensType values (thanks Jos Roost) + - Decode more tags from Samsung trailer + - Decode an undocumented DNG tag + - Decode some new Panasonic tags (thanks Klaus Homeister) + - Improved/fixed a few Validate warnings + - Made MakerNote "Bad SubDirectory start" warnings minor + - Fixed NoDups() function to work with special characters as list separators + +July 6, 2018 - Version 11.06 + + - Fixed "undefined value" bug when reading ImageSourceData from a JPEG file + +July 5, 2018 - Version 11.05 + + - Added a number of new Nikon LensID's (thanks Robert Rottmerhusen) + - Fixed out-of-memory problem when writing some large TIFF images in Windows + +July 4, 2018 - Version 11.04 + + - Added a check on TIFF image data size when writing or using Validate option + - Added a few new Sony lenses (thanks LibRaw) + - Added a new Nikon LensType + - Improved validation of XMP with Validate option + - Drop PhaseOne tags larger than 8 kB when copying PhaseOne maker notes to + another file + - Fixed out-of-memory problem when reading some large TIFF images in Windows + +June 21, 2018 - Version 11.03 + + - Added support for new Exif 2.31 for XMP tags + - Added support for another FujiFilm X-T1 firmware version + - Decode more Panasonic tags (thanks Klaus Homeister) + +June 13, 2018 - Version 11.02 + + - Added support for a different format of Apple iWorks files + - Added undocumented API FixCorruptedMOV option to allow fixing MOV videos + with multiple 'mdat' atoms which were corrupted by ExifTool + - Decode more QuickTime tags + - Decode more PanasonicRaw tags (thanks Klaus Homeister) + - Improved decoding of makernotes in ARW images from Hasselblad cameras + (thanks LibRaw) + - Fixed some problems writing multi-segment EXIF in JPEG images + +June 11, 2018 - Version 11.01 (production release) + + - Added a new ProfileCMMType (thanks Neal Krawetz) + - Added a Validate warning about non-standard EXIF or XMP in PNG images + - Added a new Canon LensType + - Decode a couple more PanasonicRaw tags (thanks Klaus Homeister) + - Patched to avoid adding tags to QuickTime videos with multiple 'mdat' atoms + --> avoids potential corruption of these videos! + +June 7, 2018 - Version 11.00 (production release) + + - Added read support for WTV and DVR-MS videos + - Added print conversions for some ASF date/time tags + - Added a new SonyModelID (thanks LibRaw) + - Decode a new PanasonicRaw tag (thanks Klaus Homeister) + - Decode some new Sony RX100 VI tags (thanks LibRaw and Jos Roost) + - Made Padding and OffsetSchema tags "unsafe" so they aren't copied by default + +May 29, 2018 - Version 10.99 + + - Decode layer information from Photoshop ImageSourceData in TIFF images + - Updated to the IPTC video metadata 1.2 specification + - Patched DateFmt() utility function to apply GlobalTimeShift if used + - Improved error message when trying to write a file with a wrong extension + - Fixed unnecessary warning when setting FileCreateDate in Windows + +May 22, 2018 - Version 10.98 + + - Added additional Validate checks for JPEG thumbnail tags + - Added a new Canon LensType (thanks LibRaw) + - Decode a number of new Nikon ColorBalance tags (thanks LibRaw) + - Disable extraction of Nikon D850 PhotoShootingMenuBank from NEF images + (apparently not valid in this type of file) + - Fixed problem with writable user-defined Composite tags introduced in 10.16 + - Fixed unnecessary Validate warning about missing GPSVersionID + - Fixed incorrect "wrong IFD" Validate warnings in CR3 images + +May 17, 2018 - Version 10.97 - "Multi-segment EXIF" + + - Added read/write support for multi-segment EXIF in JPEG images + - Added a number of new Canon LensType values (thanks LibRaw) + - Added support for Panasonic DC-FT7 makernotes and metadata in MP4 videos + - Decode a number of new Nikon WB tags (thanks LibRaw) + - Improved warning message when attempting to write to an invalid tag name + - Enhanced Validate feature to perform more tests on TIFF and JPEG images + [The Validate feature is no longer considered experimental] + +May 9, 2018 - Version 10.96 + + - Added a new Sony LensType (thanks Jos Roost) + - Added a few new Panasonic lenses (thanks LibRaw) + - Added Composite tags for GPSDestLatitudeRef and GPSDestLongitudeRef + - Decode maker notes from Kodak PixPro AZ901 + - Extract Preview images from iWork files + - Improved identification of Apple iWork files + - Fixed arg_files to handle GPS destination reference directions + +May 4, 2018 - Version 10.95 + + - Added new Nikon LensID's (thanks Warren Hatch, LibRaw and Jami Bradley) + - Added a new Sony LensType (thanks Jos Roost) + - Decode a new Samsung tag (thanks LibRaw) + - Decode Photoshop Lr16 layer information + - Decode more Leica tags (thanks LibRaw) + - Updated DarwinCore tags to current specification + - Improved validation of JPEG files + - Disabled writing of buggy Samsung EK-GN120 SRW files + - Fixed conversion for Nikon D850 ExposureDelayMode (thanks Jami Bradley) + - Fixed "x outside string" error when reading a truncated zip file + - Fixed "uninitialized value" error when writing a corrupted JPEG image + +Apr. 19, 2018 - Version 10.94 + + - Added read/write support for Canon CRM files + - Added a new Sony LensType (thanks Jos Roost) + - Added a new CanonModelID + - Decode a new Samsung tag (thanks LibRaw) + - Fixed AIColorModel conversion + +Apr. 13, 2018 - Version 10.93 + + - Added a new Canon Quality value (thanks Norbert Wasser) + - Added a new Pentax Quality value (thanks LibRaw) + - Decode some new Sony ARW tags (thanks Jos Roost) + - Decode some AI-specific tags from PDF and PostScript files + - Decode a new QuickTime tag + - Enhanced -geotag option to support NMEA from GLONASS and other systems + - Fixed bug decoding seconds of ZIP file timestamps (thanks Lars Wallenborn) + +Apr. 19, 2018 - Version 10.92 + + - Decode GPS from videos of more camera models + - Tolerate white space before header in PDF files + +Apr. 9, 2018 - Version 10.91 + + - Added read/write support for MacOS FileCreateDate (writing this is the same + as MDItemFSCreationDate, but reading uses a different mechanism which + doesn't have the delayed-update issue of MDItemFSCreationDate) + - Added ability to write MacOS MDItemUserTags (requires "tag" utility) + - Decode a new Sony tag (thanks LibRaw) + - Properly un-escape quotes in extracted MacOS MDItem values + - Fixed another subtle order-of-operations anomaly + - API Changes: + - Enhanced GetValue() to accept a tag name with group prefix(es) + +Apr. 5, 2018 - Version 10.90 + + - Improved decoding of Sony PictureProfile (thanks Jos Roost) + - Fixed problem introduced in 10.61 with order of command-line operations when + mixing copied values with assigned values + +Apr. 2, 2018 - Version 10.89 + + - Added ability to rotate MP4/MOV videos by writing Rotation angle + - Added two new Sony PictureProfile values (thanks Albert Shan) + - Decode more Nikon tags + - Updated some values of the QuickTime MediaType tag + +Mar. 27, 2018 - Version 10.88 + + - Added example config file (dji.config) to generate Composite GPS and other + tags from Text metadata embedded in DJI drone videos + - Added a new PentaxModelID + - Documented new advanced-formatting "@" feature which has existed since + version 10.53 but not fully functional until 10.87 + - Decode a new Sony tag (thanks LibRaw) + - User-defined Composite tags now show up in the -list output + - Improved speed for generating Composite SubDoc tags with -ee option + - Fixed problem creating writable UserDefined Composite tags + - Fixed an incorrect PRISM tag name + +Mar. 20, 2018 - Version 10.87 + + - Added a new FujiFilm ShutterType value (thanks Albert Shan) + - Decode more timed metadata from CR3 images + - Decode Samsung DualShot depth map + - Decode a new Canon tag + - Improved decoding of some Canon color information (thanks LibRaw) + - Fixed print conversion of ID3v2 Genre values with multiple genres + +Mar. 15, 2018 - Version 10.86 + + - Decode timed GPS and accelerometer data from BikeBro AVI videos + - Decode a new Sony tag and add a new value to another tag (thanks Jos Roost) + - Decode GPSAltitude from some videos with the -ee option + - Decode some new tags from Kodak PixPro 4KVR360 JPEG images and MP4 videos + - Decode GPS information from CR3 images + - Fixed unnecessary warnings when Validate option used on CR3 images + +Mar. 14, 2018 - Version 10.85 + + - Decode GPSTrack from MOV videos of more dashcam models + - Decode a few new CanonVRD tags for DPP 4.8.20 + - Decode a new Sony tag (thanks Jos Roost) + - Decode a few more Canon tags (thanks LibRaw) + - Improved processing speed when using the -ee option on some video files + - Fixed incorrect names for a couple of CanonVRD HSL tags + - Fixed problem where UTF-8 validation missed some invalid sequences + - Fixed bug introduced in 10.84 with GPSPosition when -n option is used + +Mar. 12, 2018 - Version 10.84 + + - Decode GPS from MOV videos of more dashcam models with -ee option + - Decode a new Sony tag (thanks Jos Roost) + - Convert GPS speeds extracted from MOV videos with the -ee option to km/h + - Avoid converting empty GPS coordinates to 0.000000 + - Fixed some bugs extracting Novatek GPS from MP4 videos + +Mar. 7, 2018 - Version 10.83 + + - Added read support for Sketch design files + - Added Light LRI files to the list of recognized file types + - Added a new Canon LensType (thanks LibRaw) + - Decode a couple of new Sony tags (thanks Jos Roost) + - Extract JpgFromRaw image from CR3 images + - Improved warning message when attempting to write a tag in a specific group + that isn't writable + - Changed group name of JSON tags from "File" to "JSON" + - Fixed some incorrect offsets in -v3 output for CR3 images + +Mar. 1, 2018 - Version 10.82 + + - Added support for Canon's new CR3 raw file format + - Added a few new CanonModelID/SonyModelID values (thanks LibRaw) + - Added support for the Sony ILCE-7M3 (thanks Jos Roost) + - Decode timed GPS information from Insta360 MP4 videos with the -ee option + - Write XMP before idat in MOV/MP4/CR3 files if possible + - Fixed "'x' outside of string" runtime error when reading some Sony images + - Fixed problem with some hex dumps going to the console when -v3 was combined + with the -w option + +Feb. 26, 2018 - Version 10.81 + + - Added new values for a few Panasonic tags (thanks Bernd-Michael Kemper) + - Added a new Canon, Olympus and Sony LensTypes (thanks LibRaw) + - Added a new PanasonicRaw Compression type (thanks LibRaw) + - Added definitions for a number of new MacOS tags + - Decode CameraInfo for Canon 5DmkIII firmware 1.3.5 + - Removed INX from list of writable files (-listwf option output) + - Fixed problem introduced in version 10.16 that could cause a "Can't create" + error when using the -o option to write certain types of files + - Fixed problem introduced in version 10.34 resulting in a "Can't delete all + meta information" error when writing .PS files + +Feb. 22, 2018 - Version 10.80 (production release) + + - Added read/write support for Reconyx UltraFire maker notes + - Added a new Sony/Minolta lens (thanks Jos Roost) + - Decode a new PanasonicRaw tag (thanks LibRaw) + - Extract ImageWidth/Height for main image of an HEIC file + - Internal changes: + - Changed TimeNow() make ExifTool object optional + +Feb. 11, 2018 - Version 10.79 + + - Added a new Olympus CameraType (thanks LibRaw) + - Added a new XMP-microsoft tag (thanks Jose Oliver-Didier) + - Decode a new GoPro QuickTime tag + - Convert nulls IPTC:DocumentHistory to newlines + - Removed all null terminators from JSON and PHP output + - Fixed writing of GPSDateStamp and GPSTimeStamp to be able to set to "now" + - Internal changes: + - Changed TimeNow() to require ExifTool object as first argument + +Jan. 31, 2018 - Version 10.78 + + - Added a few new values for some Olympus tags (thanks John) + - Decode GoPro APP6 metadata in JPEG images and more GoPro MP4 tags + - Decode more Red tags, and improved decoding of others + - Decode face detection information from timed metadata with the -ee option + - Fixed problem writing shorthand XMP containing CDATA sections + - Fixed problem copying XMP-acdsee:Snapshots + - Fixed decoding of a few Panasonic RAW tags (thanks Klaus Homeister) + +Jan. 26, 2018 - Version 10.77 + + - Added read support for Redcode R3D RAW videos + - Enhanced -sep option to specify separator and terminator for binary output + - Removed null terminator from JSON output of ICC_Profile:CharTarget + - Improved error messages to help diagnosing some types of corrupted files + - Return an exit status of 2 instead of 1 if all files fail the -if condition + - Fixed decoding of QuickTime chapter names + - Fixed incorrect MimeType for RMD files + - Fixed problem where exit status of 1 was returned when writing with a -if + condition if any of the files failed the condition + +Jan. 22, 2018 - Version 10.76 + + - Added ability to write shorthand XMP with the -z option + - Added write support for Google XMP GFocus tags + - Improved decoding of GoPro timed metadata + - Renamed ASF PlayDuration to Duration + - Fixed problem where fractional seconds were ignored when geotagging from an + NMEA track log with no date stamps + - Fixed runtime warning when reading XMP with an empty structure in a list + - API Changes: + - Added XMPShorthand option + - Enhanced Compact option so a setting of 2 avoids XMP indentation + +Jan. 12, 2018 - Version 10.75 + + - Added another Sony/Minolta lens (thanks Jos Roost) + - Decode more QuickTime tags + - Decode a number of new tags from GoPro Hero6 MP4 videos + - Enhanded "Unknown file type" error to indicate if "File is empty" or "File + header is all binary zeros" + - Improved decoding of some Sony tags (thanks Jos Roost) + - Improved decoding of QuickTime timed metadata + - Marked ArtworkCircaDateCreated as "unsafe" for writing to avoid it being + added when attempting to shift all date/time tags + - Fixed bug which could cause runtime error when reading some old Sony maker + notes (thanks Tamas Lovag) + +Jan. 8, 2018 - Version 10.74 + + - Added a new Sony/Minolta lens (thanks Jos Roost) + - Added print conversion for ICC_Profile DeviceManufacturer and ProfileCreator + - Added informational warning when the ExtractEmbedded option may be useful + - Improved experimental Validate feature for RAW files + - Fixed bug in experimental Validate feature that could cause out-of-memory + error when combined with "-use mwg" + +Jan. 5, 2018 - Version 10.73 + + - Added read/write support for GoPro RAW (GPR) files + - Added a new Sony/Minolta lens (thanks Sylvain) + - Improved conversions for GPS tags extracted from video streams + +Jan. 4, 2018 - Version 10.72 + + - Added IF feature to -p option + - Decode streamed GPS position and other streamed metadata from MP4 videos + when the -ee option is used + - Fixed problem geotagging GPSAltitude from some GPX files + +Jan. 2, 2018 - Version 10.71 + + - Decode some more ICC_Profile tags (thanks Eef Vreeland) + - Decode MechanicalShutterCount for Nikon D850 (thanks Xavier Jubier) + - Convert PNG:CreationTime values to/from standard date format + - Fixed problem loading default config file from application directory + - Fixed problem reading XMP where a namespace is defined after an attribute + which uses the namespace + +Dec. 27, 2017 - Version 10.70 + + - Search application directory for -config file + - Improved robustness of JSON import + - Enhancements to experimental Validate feature + - Fixed bug introduced in 10.69 which could result in hang when writing + multi-segment JPEG metadata + +Dec. 18, 2017 - Version 10.69 + + - Added "OK" UserParam for use in -if conditions + - Allow writing an empty JPEG Comment + - Check for proper location of Photoshop metadata with -validate or -use mwg + - Exit status now set to 1 if command was aborted due to invalid arguments + - Translate "UTF8" to appropriate escape sequence when writing + IPTC:CodedCharacterSet with the -n option + - Improved "Not a valid TIFF" error message to be more specific about the file + type for TIFF-based formats + - Fixed problem parsing Honeywell PTNTHPR NMEA sentences from some GPS devices + +Dec. 5, 2017 - Version 10.68 + + - Added ability to set tag values and API options to an empty string using + "^=" on the command line + - Added a new Sony LensType (thanks Jos Roost) + - Added a new Nikon LensID + - Decode more tags from some newer Leica models + - Decode a new Apple tag + - Fixed indeterminate order of extracted XMP structures + +Nov. 16, 2017 - Version 10.67 + + - Fixed problem introduced in 10.66 with -execute not returning the command + number in the "{ready}" message when -stay_open was used + - API Changes: + - Added TimeZone option + +Nov. 14, 2017 - Version 10.66 + + - Added a new Canon LensType (thanks Norbert Wasser) + - Updated en-ca and en-gb language translations + - Minor format change to experimental Validate feature return value + - Prevent JFIF from being added to a JPEG containing Adobe APP14 + - Changed a number of Canon LensType strings to add "USM" to L model names + - Patched for compatibility with Time::Piece version 1.29_04 and later, and + improved error handling when writing formatted date/time values + - Fixed bug in Composite MWG CreateDate and DateTimeOriginal tags which could + cause existing tags to be hidden when not using the -a option + - Fixed problem using '#' suffix not properly fixed in 10.65 + - Fixed problem decoding Nikon D810 MultiExposure tags + +Oct. 31, 2017 - Version 10.65 + + - Added support for DOSLatinUS (cp437) and DOSLatin1 (cp850) character sets + - Added Extra ForceWrite tag for forcing metadata in a file to be rewritten + - Added write support for RAF images from some newer FujiFilm models + - Added a new SonyModelID, Sony LensType and Olympus LensTypes (thanks LibRaw) + - Added a new Pentax LensType + - Added a new Nikon LensID + - Decode more Sony tags for new models (thanks Jos Roost) + - Decode Nikon D850 ShotInfo tags and custom settings (thanks Warren Hatch) + - Decode Nikon D850 ColorTemperatureAuto (thanks LibRaw) + - Decode Photoshop LayerModifyDates and LayerIDs + - Improved decoding of Nikon D5/D500/D810 ShotInfo tags + - Allow advanced formatting expressions to return a list reference + - Fixed problem in Composite:GPSAltitude when derived from an "undef" altitude + - Fixed bug which could result in runtime warning when excluding some tags + from being extracted + +Oct. 17, 2017 - Version 10.64 + + - Added a new Nikon LensID + - Added a new SonyModelID + - Added a new CanonModelID (thanks LibRaw) + - Added some new non-standard CustomRendered values + - Decode FrameRate from FLIR SEQ files (thanks Sebastian Hani) + - Enhanced shift feature to be able to shift some not-so-simple numerical + values (eg. GPSLatitude) with -TAG+=VALUE syntax + - Fixed problem with possible malformed UTF-8 when writing IPTC values that + require truncation + - Fixed incorrect Writable type for XMP-GSpherical:TimeStamp + - Fixed incorrect family 2 group name for Nikon HDRInfo tags + +Oct. 4, 2017 - Version 10.63 + + - Added a number of new Canon LensTypes (thanks Norbert Wasser for some) + - Added a new CanonModelID + - Added a new Olympus CameraType + - Decode MD5Signature in FLAC StreamInfo (thanks Tim Eliseo) + - Improved decoding of HEIC/HEIF metadata + - Removed useless write support for QuickTime date/time tags in HEIC/HEIF + images + - Fixed "Incorrect XMP stream length" problem when writing some INDD files + +Sept. 28, 2017 - Version 10.62 + + - Added preliminary support for HEIC/HEIF images + - Added support for Google depthmap metadata (XMP-GDepth) + - Added some new Sony/Minolta lenses (thanks LibRaw and Jos Roost) + - Added a new CanonModelID (thanks Norbert Wasser) + - Added a new Nikon LensID (thanks Michael Tapes) + - Decode a new Sony tag (thanks Jos Roost) + - Decode some new Nikon tags (thanks Warren Hatch) + - Decode maker notes from Leica TL2 + - Enhanced ID3 -v2 output to show frame flags + - Fixed problem decoding Nikon D810 camera tilt angles + - Fixed problem where SphericalVideoXML metadata was deleted when writing XMP + to a QuickTime-format file containing this information + +Aug. 18, 2017 - Version 10.61 + + - Added a new Canon LensType (thanks LibRaw) + - Added a number of new Sigma, Nikon and Sony lenses (thanks Jos Roost) + - Added a new Nikon LensID (thanks Yang You) + - Decode a number of new Sony tags (thanks Jos Roost) + - Decode Panasonic FocusDistance (thanks David Ellsworth) + - Updated to the IPTC video metadata 1.1 specification + - Restored the ability to delete JpgFromRaw from RAW images (broken in 10.38) + - Fixed problem decoding maker notes from Pentax K-70 AVI videos + - Fixed problem conditionally replacing a tag if the value to be deleted was + taken from another tag while the new value was assigned directly + +July 21, 2017 - Version 10.60 + + - Added two new Sony/Minolta LensTypes (thanks Jos Roost) + - Added a new Pentax LensType (thanks Dieter Pearcey) + - Added new Composite UniquePathPoints tag to photoshop_paths.config + - Extract raw-data JFIF/JFXX thumbnails as ThumbnailTIFF + - Improved Sony LensSpec conversion + - Updated German translations (thanks Herbert Kauer) + - Set family 1 group name of JFXX ThumbnailImage to JFXX instead of JFIF + - Fixed problem with %C no longer incrementing properly + +July 7, 2017 - Version 10.59 + + - Added a new Canon LensType (thanks LibRaw) + - Added a new Nikon LensID + - Added "wrong extension" warning to experimental Validate feature + - Decode Pentax maker notes in Q-S1 AVI videos + - Updated iptc2exif.args and exif2iptc.args to support new EXIF OffsetTime + tags (thanks Herb) + - Patched potential problem with "Use of uninitialized value $pos" error when + importing malformed JSON data + - Patched to avoid runtime warning due to invalid Nikon ShutterCount value + - Raise an error if -b is used with the -csv option + - Changed PNG exIf chunk name to eXIf + - Fixed bug introduced in 10.26 which could cause hang when %C is used in an + output file name + - Fixed MWG:DateTimeOriginal and MWG:CreateDate to return XMP when EXIF and + IPTC don't exist + +June 29, 2017 - Version 10.58 + + - Added read support for RIFF-format MBWF/RF64 files + - Added write support for dji-drone XMP tags + - Added a new Canon LensType (thanks Steve Bates) + - Added a few new Sony/Minolta LensType values (thanks Jos Roost) + - Added a couple of new CanonModelID values (thanks LibRaw and Norbert Wasser) + - Decode some new FujiFilm tags (thanks Chris Schucker) + - Enhanced FileSize print conversion to show in "GB" for large files + - Fixed "outside of string in unpack" errors when reading some corrupted + EXE/ICC files + - Fixed problem extracting GIF MIDISong metadata + +June 20, 2017 - Version 10.57 + + - Added a new Canon LensType (thanks Norbert Wasser) + - Added write support for PNG Collection tag + - Added a few new CanonModelID values + - Added some new Pentax ShakeReduction values + - Removed ability to create PNG zxIf chunks + - Documented -progress:%b feature (added in 10.26) + - No longer report FileType, FileTypeExtension or MIMEType for JPEG/TIFF + images with an unknown header + - Relaxed case requirement for "SourceFile" header in CSV and JSON import + - Fixed decoding of Pentax ExposureCompensation for newer Ricoh models + - Fixed some incorrect "Wrong IFD" messages with experimental Validate feature + - Fixed a couple of Sony/Minolta lens names (thanks Jos Roost) + - Fixed "Error reading PreviewImage" warning for some Sony models + +June 6, 2017 - Version 10.56 + + - Removed ordering constraints between Geotag/Geosync and Geotime assignments + on the command line + - Removed debugging print statement left in photoshop_paths.config + +June 5, 2017 - Version 10.55 (production release) + + - Added support for GIF multimedia extensions + - Added a couple of new Sony/Minolta lenses (thanks Chris) + - Added a new Nikon LensID (thanks Jakob Dettner) + - Added new Composite TotalPathPoints tag to photoshop_paths.config + - Decode a number of new Sony tags and updated some others (thanks Jos Roost) + - Decode a new Pentax tag and fixed decoding of another (thanks Andras + Salamon) + - Updated iptcCore.args for new IPTC specification + - Changed description of a couple of AVI Model tags to match EXIF + - Patched tests to avoid failures with Perl 5.25.11 due to missing "." in @INC + - Fixed an incorrect warning from the experimental Validate feature + +May 26, 2017 - Version 10.54 + + - Added support for Google XMP GImage and GAudio tags + - Added a new Olympus CameraType (thanks LibRaw) + - Added a two new Sony lenses and decode more ILCE-9 tags (thanks Jos Roost) + - Added new values to some Pentax tags (thanks Andras Salamon) + - Added a new Canon LensType + - Added an additional checks to the experimental Validate feature + - Improved user-defined FileTypes feature to provide more flexibility + - Enhanced -ext option to allow specific files extensions to be processed + along with supported files + - API Changes: + - Added ListJoin option to replace List and ListSep options + +May 17, 2017 - Version 10.53 + + - Added support for "MeSa" Photoshop IRB resource + - Made XMP-GSpherical tags writable + - Improved German translations (thanks Jobi) + +May 12, 2017 - Version 10.52 + + - Added some new values to a number of FujiFilm tags and changed some others + (thanks Albert Shan) + - Decode a number of new Sony tags for the ILCE-9 (thanks Jos Roost) + - Made SonyISO writable + - Changed behaviour of advanced formatting expression for Shortcut tags so it + now applies to the combined value rather than individual constituent values + - Minor changes to some Pentax print conversions + - Fixed problem using new NoDups utility with Shortcut tags + +May 2, 2017 - Version 10.51 + + - Added "NoDups" utility function for use in advanced formatting expressions + - Added a new Pentax LensType (thanks JohnK) + - Added some new Pentax DriveMode values (thanks Andras Salamon) + - Enhanced -ver option to report Perl include directories with -v2 + - Improved warning message when advanced formatting expression returns undef + - Minor change to a few FujiFilm print conversion strings (thanks Albert Shan) + - Changed behaviour when interpolating Shortcut tags in a string (the values + are now separated according to the -sep option setting instead of simply + being concatenated) + - Patched to allow file times to be set on systems where futimes is not + available + +Apr. 20, 2017 - Version 10.50 (production release) + + - Decode a new Pentax tag (thanks Andras Salamon) + - Improved decoding of Olympus DriveMode (thanks Herbert Kauer) + - Improved handling of errors from utime when setting file times + - Fixed potential hang problem when reading corrupted QuickTime metadata + - Fixed problem deleting duplicate EXIF tags when writing other tags at the + same time + +Apr. 10, 2017 - Version 10.49 + + - Added "DateFmt" utility function for use in advanced formatting expressions + - Added a new Sony/Minolta LensType (thanks LibRaw) + - Decode a new Panasonic tag + - Fixed problem decoding Sony VariableLowPassFilter values (thanks Jos Roost) + - Fixed problem setting XMP:About when creating new XMP in a file + - Fixed an incorrect Pentax DriveMode value (thanks Andras Salamon) + - API Changes + - Allow access to the advanced formatting expression via a new ExifTool + "FMT_EXPR" member variable + +Apr. 3, 2017 - Version 10.48 + + - Added some new FujiFlashMode values (thanks Albert Shan) + - Added a new Sony LensType (thanks Jos Roost) + - Added a new Canon LensType (thanks LibRaw) + - Added a new CanonModelID and minor changes to some others (thanks Dmitry) + - Decode two Pentax tags and added a number of new values for other Pentax + tags (thanks Andras Salamon) + - Decode a new Sony tag (thanks Jos Roost) + - Improvements to the experimental Validate feature + - Fixed problem which could cause hang when reading bad PPT documents + +Mar. 20, 2017 - Version 10.47 + + - Added read support for JSON-format files + - Added two new Sony/Minolta lenses (thanks Jos Roost) + - Added a number of new Pentax tag values + - Decode a new Canon CR2 tag (thanks Ed Hannon) + - Decode WB information for Canon 800D (thanks LibRaw) + - Improved config_files/photoshop_paths.config to indicate start of paths + - Attempt to validate new file names in Windows before renaming images + - Experimental Validate feature no longer warns about Windows XP tags + - Fixed problem extracting layer information from very large PSD/PSB files + +Mar. 8, 2017 - Version 10.46 + + - Moved Mac System tags from the Extra table into a new MacOS group and added + ability to extract them by requesting the MacOS group + - Updated QuickTime GenreID list (thanks Francois Bonzon) + - Fixed "Invalid xref" problem when reading some PDF files + - Fixed error in Minolta lens list (thanks Jos Roost) + - Fixed minor problem with -U option generating Unknown tags for some known + bytes in variable-sized strings + - API Changes: + - Enhanced RequestTags option to allow groups to be requested + +Mar. 2, 2017 - Version 10.45 + + - Added ability to write a number of Mac OS X system tags (including the file + creation date!) + - Added ability to extract OS X extended attributes ("XAttr" tags) + - API Changes: + - Added XAttrTags option + - Enhanced RequestAll option + +Feb. 24, 2017 - Version 10.44 + + - Added a few new CanonModelID values and a new Canon LensType + - Added two new Nikon lenses (thanks Rolf Probst) + - Added a few new Sony/Minolta lenses (thanks Jos Roost) + - Added two new Sony MeteringMode values (thanks Jos Roost) + - Improved verbose dump of Photoshop Layer information + - Patched to allow "FileName encoding not specified" warnings to be avoided by + setting -charset filename="" + - Fixed problem in photoshop_paths.config printing some paths + +Feb. 16, 2017 - Version 10.43 + + - Restrict writing of EXIF:FlashEnergy to a single value as per EXIF spec + - Reverted format change of Sony ImageCount tag + - Changed PNG new eXIF/zXIF chunk names to "exIf" and "zxIf" until the + proposed chunks are accepted (of course, while maintaining backward + compatibility for reading/updating the other chunks) + - Lowered priority of XMP-pdf:Keywords so it doesn't take precedence over + PDF:Keywords when the Duplicates option is not used + - Improved config_files/convert_regions.config to handle the case where the + RegionInfoMP is missing a Rectangle + +Feb. 10, 2017 - Version 10.42 + + - Added ability to read/write PNG eXIF and zXIF chunks, and made these the + place where new EXIF is created in PNG images (zXIF if the -z option is + used, or eXIF otherwise) + - Added ability to copy Photoshop OriginPathInfo with photoshop_paths.config + - Made FileUserID and FileGroupID writable + - Changed format for a Sony ImageCount tag + - Improvements to experimental Validate feature + - Fixed incorrect XMP swf namespace URI + - Fixed problem using new -p section feature when combined with -w or -ee + - Fixed formatting problem in -listx output when -lang option was used + - Fixed problem where UserComment wasn't removed if found in IFD0 when writing + it to the correct IFD + +Feb. 1, 2017 - Version 10.41 + + - Added an experimental metadata validation feature (invoked either by + requesting the new Extra Validate tag or by setting the API Validate option) + - Added support for PSDT file extension + - Added age.config to the distribution + - Added a new Sony lens (thanks Jos Roost) + - Added a new PentaxModelID (thanks Louis Granboulan) + - Enhanced -p option to allow files to be grouped in sections + - Made makernote offset warning minor + - Relaxed parsing of NMEA GGA sentence so comma after the geoid units is now + optional + - Patched problem extracting value of an unsafe binary tag with the -b option + when specified using -TAG# instead of -TAG with -n + - API Changes: + - Added experimental Validate option + +Jan. 14, 2017 - Version 10.40 (production release) + + - Fixed tests that were failing on some platforms + +Jan. 13, 2017 - Version 10.39 + + - Added Perl version and Unicode settings to -ver -v output + - Added a new Sony LensType2 value + - Added a new Canon LensType (thanks Norbert Wasser) + - More improvements to sample time_zone.config file (thanks Hayo Baan) + - Fixed problem with MWG date/time tags introduced in version 10.34 + - Fixed problem setting the value of a tag from a binary file when the + PERL_UNICODE environment or the perl -C option is used to force UTF-8 + treatment of @ARGV elements + +Jan. 5, 2017 - Version 10.38 + + - Added a couple of new XMP-ics tags + - Added a new Nikon LensID (thanks Ken Cochran) + - Decode a couple more PhaseOne tags + - Increased priority of Sony 0x0115 WhiteBalance when reading + - Range check QuickTime date/time values when writing + - Apply CharsetPhotoshop setting to decoding of Photoshop LayerNames + - Improved identification of Nikon NRW images + - Minor improvements to verbose dump of FLIR information + - Improvements to sample time_zone.config file (thanks Hayo Baan) + - Removed trailing null in -b output for GPSDateStamp + - Changed "TAG is not supported" warning when writing to "TAG is not defined" + - Changed groups of Composite Preview/Thumbnail/JpgFromRaw/etc images to match + the tags from which they are derived + - Changed description of Composite Nikon LensSpec tag to match the tag name + - Fixed problems reading/writing PreviewImage from some DNG files + +Dec. 19, 2016 - Version 10.37 + + - Decode more information from BMP V4 and V5 images + - Added a few new FujiFlashMode values (thanks Albert Shan) + - Changed -geotime default to use unconverted value of DateTimeOriginal + - Changed a couple of Sony Voigtlander LensType strings (thanks Jos Roost) + - Warn about invalid tag names used on the command line + - Generate default-language version of QuickTime tags even if the same-named + tag already exists in another group + - Fixed bug reading some Photoshop layer information + - Fixed problems in sample config file time_zone.config (thanks Hayo Baan) + +Nov. 24, 2016 - Version 10.36 (production release) + + - Added 3D Studio MAX files to the list of supported file types + - Decode more Sony tags (thanks Jos Roost) + - Decode a couple more FlashPix tags + - Minor changes to some of the new IPTC Extension tags + - Fixed problem reading some FlashPix (Windows Compound Binary Format) files + +Nov. 21, 2016 - Version 10.35 + + - Fixed bug in Windows version introduced in 10.32 which could cause ExifTool + to exit with an error if the -lang option was used + +Nov. 21, 2016 - Version 10.34 + + - Added support for new IPTC Extension version 1.3 + video metadata XMP tags + - Added missing print conversion for PreviewDateTime + - Decode a few new FujiFilm tags (thanks Zilvinas Brobliauskas) + - Enhanced MWG date/time tags to support new EXIF time offsets + - Patched loophole in WriteMode which would allow creation of new metadata + files when creation of new groups was disallowed + - Fixed problem where some EXIF date/time tags may not shifted when shifting + all date/time tags with "-time:all-=VAL" for ExifTool version 10.28-10.33 or + when the MWG feature was used + +Nov. 11, 2016 - Version 10.33 + + - Windows EXE version is 32-bit again, and packaged with Perl 5.24.0 + - Fixed encoding problem with EXIF:Copyright when writing MWG tags using an + alternate EXIF charset + +Nov. 9, 2016 - Version 10.32 + + - WARNING: The Windows EXE version for this release is 64-bit (and packaged + with Perl 5.22.2 instead of 5.24.0) + - Time::Piece may now be used as an alternative to POSIX::strptime for parsing + date/time values when writing, and is included in the Windows package + - Added a number of new XMP tags (thanks StarGeek) + - Added support for a few new Sony cameras (thanks Jos Roost) + - Added new Nikon LensID (thanks Tanel) + - Decode a new Nikon tag (thanks Warren Hatch) + - Decode FLIF encoding type + - Decode a new Samsung tag (thanks Klaus Homeister) + - Ignore -filter option for a tag if it returns an undefined value + +Oct. 19, 2016 - Version 10.31 + + - Added write support for FLIF images + - Added support for animated PNG images + - Added a few new SamsungModelID values + - Added a new Canon LensType + - Added a new Sony/Minolta LensType (thanks Jos Roost) + - Decode more Samsung tags (thanks Klaus Homeister and Sreerag Raghavan) + - Decode more Nikon tags (thanks Warren Hatch) + - Changed "TAG does not exist" warning when writing to "TAG is not supported" + - Fixed problem importing information from CSV or JSON databases for files + with special characters in their name + +Oct. 13, 2016 - Version 10.30 + + - Added read support for FLIF images + - Added a couple of new Minolta/Sony LensType values (thanks Jos Roost) + - Added a new SonyModelID (thanks LibRaw and Jos Roost) + - Added a new digiKam XMP tag + - Decode a new Apple tag (thanks Neal Krawetz) + - Decode a few new FujiFilm tags (thanks Chris Schucker) + - Decode more Nikon D5 custom settings (thanks Warren Hatch) + - Decode a couple more Samsung tags (thanks Klaus Homeister) + - Improved decoding of Nikon D500/D5 ShotInfo information + - Enhanced -ver option to output system information when -v is added + - Minor change to parsing of -@ argfile (comment lines may may no longer have + spaces before the "#") + - Patched Jpeg2000 reader to read bad UUID-EXIF boxes + - Lowered priority of unknown XMP tags when reading + - Fixed problem in new xmp2exif.args date/time arguments introduced in 10.28 + - Fixed potential "Use of uninitialized value" warning when decoding + compressed PNG iTXt chunk + +Oct. 5, 2016 - Version 10.29 + + - Added a couple of new Sony LensType values (thanks LibRaw) + - Decode a few new Sony tags + - Decode a few new FLIR tags + - Decode some new Nikon D5 tags (thanks Warren Hatch) + - Decode a new Apple tag + - Enhanced -geotag option to allow tagging from KML placemarks with a TimeSpan + - Enhanced -d option (and API DateFormat option) to perform inverse date/time + conversion when writing if the POSIX::strptime module is available. If + POSIX::strptime is not available then the behaviour is like older versions + (ie. the date/time is not converted) unless the API StrictDate option is set + in which case a warning is issued and the tag is not written + +Sept. 27, 2016 - Version 10.28 - "Exif 2.31" + + - Added support for new Exif 2.31 tags + - Added some new Canon LensType values (thanks Norbert Wasser for one) + - Added a new Olympus LensType (thanks LibRaw and Niels Kristian Bech Jensen) + - Added a new Sony LensType and SonyModelID (thanks Jos Roost) + - Added a new Pentax LensType + - Added fotoware.config and bibble.config files to the distribution + - Made Composite SubSecDateTimeOriginal, SubSecCreateDate and SubSecModifyDate + tags writable, and expanded to include new Exif 2.31 time zone tags + - Fixed problem writing user-defined structured tag elements with a dot (.) in + their tag ID + +Sept. 23, 2016 - Version 10.27 + + - Added a new CanonModelID (thanks LibRaw) + - Added a new Sony LensType (thanks Jos Roost) + - Added a few new NikonLensID's (thanks Yang You and Robert Rottmerhusen) + - Added a couple of new Olympus LensType values (thanks LibRaw and Niels + Kristian Bech Jensen) + - Added a new Olympus CameraType + - Decode some Canon 80D, 750D, 760D and 1200D CameraInfo tags + - Changed writing of some ExposureTime and ExposureCompensation tags to allow + the exact numerator and denominator of the stored rational value to be + specified + - Fixed Timecode printout in -v3 output for M2TS videos (thanks Ken Neighbors) + - Fixed some problems with the new "-progress:TITLE" feature + - Fixed problem where "_exiftool_tmp" file could be left around after a failed + write attempt + - Fixed potential "isn't numeric" runtime error when reading a PDF file with + the -ee option + +Sept. 15, 2016 - Version 10.26 + + - Added read support for GSpherical metadata in MP4 videos + - Added a few new XMP-xmpMM tags and a new XMP-crs tag + - Added some new Minolta/Sony lenses (thanks Jos Roost) + - Added two new CanonModelID's (thanks Norbert Wasser and Laurent Clevy) + - Added two new Canon LensType's (thanks Norbert Wasser) + - Decode a number of Nikon D610 custom settings (thanks Tor) + - Removed a questionable Samsung tag + - Marked TestName tag as "unsafe" for writing + - Enhanced -progress option with ability to set console window title + - Changed behaviour of %C to increment for each processed file as documented + (was incrementing for each output file created) + - Patched to recreate XMP in the standard location of PNG images when deleting + certain non-standard XMP as a group and recreating in one step + - Fixed runtime warning when writing 0 to MinoltaRaw ISOSetting + - Fixed problem writing SRW images from some newer Samsung models + +Aug. 3, 2016 - Version 10.25 + + - Added a new Pentax PictureMode (thanks Louis Granboulan) + - Added a new Nikon LensID (thanks LibRaw) + - Decode a new Samsung tag (thanks LibRaw) + - Decode a few more Canon tags (thanks Anton Reiser) + - Removed "Avoid" flag for XMP-crs:ColorTemperature + - Changed the format of a number of XMP-GPano tags from integer to real + - Fixed incorrect tag ID's for some obscure Island Graphics EXIF tags + - Fixed decoding of some UTF-8 DNG tags which may be stored in BYTE format + +July 27, 2016 - Version 10.24 + + - Added support for DJI Phantom maker notes + - Added a few more XMP-crs tags + - Added ability to write DNG OpcodeList tags + - Added a new Sony/Minolta LensType (thanks Jos Roost) + - Added a few new FujiFilm Saturation values + - Added a new FujiFlashMode value and fixed an incorrect Italian translation + (thanks Massimo Sanna, ApolloOne) + - Decode more Pentax tags (thanks Louis Granboulan) + - Changed -config option to search the current directory first for the config + file (patches problem introduced in ExifTool 10.21 for Windows where the + working directory might not be searched when using the -config option) + - Changed print conversion of ProcessingTime to show 3 significant digits + - Fixed bug decoding PanasonicRaw DistortionInfo in DNG images + +July 14, 2016 - Version 10.23 + + - Added read support for Ogg Opus audio files + - Added ability to geotag only GPS date/time if no position information is + available by setting Geotag to "DATETIMEONLY" (all caps) + - Added "-charset RIFF" option + - Added a new Sony LensType (thanks Jos Roost) + - Decode a number of new Canon tags (thanks Kai Harrekilde-Petersen) + - Changed handling of special characters in RIFF-format files (eg. AVI, WAV) + - Changed MIME type of OGG files to audio/ogg (was audio/x-ogg) + - Minor change to wording of new Nikon D80 Rotation tag for consistency + - API Changes: + - Added CharsetRIFF option + +July 7, 2016 - Version 10.22 + + - Added read support for BPG images + - Minor changes to a few of the new Nikon tags + - Fixed problem in Windows version where not all 10.21 updates were included + in the release + +June 29, 2016 - Version 10.21 + + - WARNING: The Windows EXE package for this release was built on Windows 10 + using Perl 5.24 instead of Windows XP and Perl 5.8 -- please watch for + problems and report anything that you find + - Added a new Minolta/Sony LensType (thanks LibRaw) + - Added a new element to the XMP Colorant structure + - Added a new Pentax lens (thanks Louis Granboulan) + - Decode Nikon D5/D500 AF information (thanks Michael Tapes for samples) + - Decode a number of new Olympus tags (thanks Daniel Pollock) + - Decode a number of new Nikon tags (thanks Warren Hatch) + - Decode Pentax K-1 AF points (thanks Louis Granboulan) + - Extract a new DPX tag + - Patched to avoid writing an empty structure field for an undefined value + +June 13, 2016 - Version 10.20 (production release) + + - Added a few new Sigma LensTypes (thanks LibRaw and Jos Roost) + - Added a new Sony LensType (thanks Jos Roost) + - Added two new Canon LensTypes (thanks Jos Roost and Norbert Wasser) + - Added a couple of new PentaxModelID's (thanks Louis Granboulan for one) + - Added a new Pentax LensType (thanks Louis Granboulan) + - Added a few new Olympus PictureMode values (thanks Daniel Pollock) + - Added a few more XMP tags + - Decode a new Nikon video tag (thanks Hayo Baan) + - Patched to allow protected binary data tags to be extracted when -b is + combined with -php or -X if the tag is specifically requested + - Fixed bug introduced in version 9.96 where extended XMP is ignored if the + MWG module is used + - Fixed problem where the MWG module wasn't loaded automatically if there were + MWG tags in the argument to the -p option + - Fixed column alignment of alternate-language output (requires + Unicode::LineBreak to be installed) + - Fixed problem writing Sigma:LensFocalRange + +May 31, 2016 - Version 10.19 + + - Added a few new Sony and Sigma LensType values (thanks Jos Roost) + - Decode more Nikon tags (thanks Warren Hatch) + - Fixed an incorrect Sigma LensType (thanks LibRaw) + - Fixed decoding of D500 custom settings for NEF images (thanks Warren Hatch) + +May 27, 2016 - Version 10.18 + + - Added a number of new Sigma LensTypes (thanks LibRaw) + - Added a few new Sony/Minolta lenses (thanks Jos Roost) + - Added ability to write FilePermissions + - Decode NikonCustom settings for the D500 (thanks Warren Hatch) + - Decode PLUS MediaSummaryCode values + - Use hexadecimal for Sigma LensType values + - Changed -fileOrder option to sort numbers in strings numerically + - Fixed typo in Samsung lens name + +May 16, 2016 - Version 10.17 + + - Added support for Leica X-U (Typ 113) maker notes + - Added a new Pentax LensType (thanks Louis Granboulan) + - Added a number of new Sony lenses (thanks Jos Roost) + - Added a new Canon LensType (thanks Mees Dekker) + - Extract TIFF-format thumbnails and previews + - Patched to ignore XML entities inside comments + - Fixed inconsistent conversion of PreviewColorSpace values + - Fixed writing of TargetPrinter tag + - Fixed bug introduced in 10.16 which which could cause a runtime warning when + using the -o option and not writing any "real" tags + +May 3, 2016 - Version 10.16 + + - Added %D, %F and %E filename format codes + - Added a new Minolta lens (thanks Jos Roost) + - Decode Photoshop Compression mode + - Decode Nikon MultiExposure information for the D5 + - Updated decoding of Sony tags for ILCA-68 (thanks Jos Roost) + - Fixed bug adding back XMP tags after deleting all XMP from MOV/MP4 files + - Fixed problem using -o option when reading from stdin (ie. FILE is "-") + - Fixed problem where user-defined Composite tags may not always override + pre-defined Composite tags with the same name, and added feature to allow + the user to specify whether they should override existing tags or not + +Apr. 20, 2016 - Version 10.15 (production release) + + - Added .a and .o to the list of supported file types + - Added a few new Sony/Minolta lenses (thanks Jos Roost and LibRaw) + - Decode more Photoshop tags (thanks Taylor Bangs for some) + - Decode more information from static library (.a) files + - Decode a few more tags from GoPro MP4 videos (thanks Calvin Hass) + - Decode ColorData for Canon EOS 1300D (thanks LibRaw) + - Updated Sony decoding for newer models (thanks Jos Roost) + - Fixed bug where ScaleFactor35efl could be calculated incorrectly for Canon + images from some models which have had their EXIF rebuilt + +Apr. 8, 2016 - Version 10.14 + + - Added read support for ISO 9660 disk images + - Added a few new Nikon ISOExpansion values (thanks LibRaw) + - Added a few new Olympus LensType values (thanks Niels Kristian Bech Jensen) + - Added a couple of new SonyModelID values (thanks LibRaw for one) + - Added a new Olympus CameraType + - Added config_files/gps2utm.config to the distribution + - Decode Canon ColorData for the EOS 80D (thanks LibRaw) + - Decode a few new Samsung tags (thanks Francois) + - Decode a new Fuji tag (thanks Frank Markesteijn) + - Calculate Duration for APE audio files + - Tightened constraints on M2TS file recognition + - Improved verbose dump of ID3 information + - Changed XMP-acdsee:Snapshots to a Binary data tag + - Fixed bug which prevented writing of various Sony FocalLength tags + - API Changes: + - Fixed bug where FileModifyDate wasn't set properly when WriteInfo() was + called without a destination file name and other "real" tags were + written at the same time + +Mar. 12, 2016 - Version 10.13 + + - Added a few new Canon LensType values (thanks Niels Kristian Bech Jensen and + LibRaw) + - Added a new CanonModelID + - Added a number of new Nikon RetouchHistory modes + - Decode a number of new Sony tags (thanks Jos Roost) + - Changed a couple of Sigma "| C" lens names for consistency + - API Changes: + - Fixed bug which could cause the API Filter option to be ignored for some + tags when copying tags with the Composite option set + +Mar. 4, 2016 - Version 10.12 + + - Added a new PentaxModelID and SonyModelID (thanks LibRaw) + - Added a number of new CanonModelID values (thanks Norbert Wasser for one) + - Added a new Olypus LensType (thanks Niels Kristian Bech Jensen) + - Added two new Pentax LensType values + - Added a few new Nikon LensID values and updated some others + - Added a new Canon LensType (thanks Norbert Wasser) + - Decode a new Nikon tag + - Decode a new CanonCustom tag for the EOS 80D + - Improved decoding of SonyRawFileType (thanks Jos Roost and LibRaw) + - Changed "Optimised" to "Optimized" in a Photoshop tag value + - Fixed warning that could be generated by the Canon FileNumber conversion + +Feb. 17, 2016 - Version 10.11 + + - Added a couple of new Olympus CameraType values (thanks LibRaw for one) + - Added some new ACDSee XMP tags (thanks Malus) + - Added a few more XMP-crs tags + - Added a new CanonModelID (thanks Norbert Wasser) + - Added a couple of new Sony LensType values (thanks Jos Roost and LibRaw) + - Added support for PDF ASCII85Decode filter + - Decode a number of new Sony tags (thanks Jos Roost) + - Decode a new Canon tag (thanks Juha Iso-Sipila) + - Decode a few more Photoshop tags + - Convert MDItem date/time values to local time + - Patched to read incorrectly written DJI GPSCoordinates in MOV videos + +Jan. 22, 2016 - Version 10.10 (production release) + + - Added a new Olympus LensType (thanks Niels Kristian Bech Jensen) + - Added a couple of new Olympus FlashModel values + - Added a new Nikon LensID + - Added a new Pentax LensType + - Decode a number of new Sony tags (thanks Jos Roost) + - Decode H264:DateTimeOriginal DST flag, and add " DST" to time string if set + - Decode a few more CanonCustom settings + - Fixed problem creating user-defined XMP structure elements with names + containing characters which are illegal in tag names + - Improved mechanism for generating tags which must be specifically requested + when copying or used in -if or -p expressions + - Improved warning in Windows if help documentation file can't be created + - Patched Composite:FileNumber to handle case where Canon:FileNumber is 10000 + - Patched reading FujiFilm RawImageWidth/Height for new X-Pro2 RAF images + - Fixed problem reading PDF objects which begin with a comment line + - Fixed problem which could result in ExifTool corrupting a PDF file when + writing + - API Changes: + - Added RequestTags option + - No longer generate MDItem tags when RequestAll option is set + +Jan. 4, 2016 - Version 10.09 + + - Added ability to extract OS X system metadata ("MDItem" tags) + - Added a value conversion for GoogleTrackDuration + - Enhanced the -i option to allow full path names to be specified + - Fixed a potential runtime error when writing corrupted JPEG images + - API Changes: + - Added MDItemTags option + +Dec. 22, 2015 - Version 10.08 + + - Added ability to write empty XMP structures + - Added write support for PhaseOne MakerNotes tags in IIQ files + - Added a new Nikon LensID (thanks David Puschel) + - Decode a new Olympus tag and improved decoding of DriveMode + - Minor improvements to HtmlDump of PhaseOne IIQ and PDF files + - Patched to allow overwriting of empty XMP written by some PhaseOne cameras + - Fixed bug in HtmlDump feature that could cause a "substr outside of string" + error + - API Changes: + - Changed API QuickTimeUTC option to also enforce proper time zero + +Nov. 26, 2015 - Version 10.07 + + - Fixed problem with warnings on some systems about unimplemented functions + for FileGroupID and FileUserID when -p or -if were used + +Nov. 26, 2015 - Version 10.06 + + - Added a new Canon LensType (thanks LibRaw) + - Added a new Pentax LensType (thanks Louis Granboulan) + - Added a couple of new XMP-digiKam tags + - Added a new CanonModelID + - Added a new ACDSee XMP tag (thanks Malus) + - Decode a new Canon tag + - Improved a few lens names (thanks Jos Roost) + - Patched to remove trailing null when reading improperly written QuickTime + strings + - Fixed bug where SystemTags weren't available for use with the -p and -if + options + +Nov. 6, 2015 - Version 10.05 + + - Added new Canon and Sony LensType values + - Added some new Nikon LensID's (thanks Robert Rottmerhusen) + - Added a new PentaxModelID + - Added preliminary support for Motorola maker notes + - Changed format of XMP-photoshop:DocumentAncestors to write a simple Bag of + strings rather than structures (since this is what the Adobe software + writes, contrary to their own XMP specification) + - Fixed problem where HASH references may be exposed when copying a list of + structures to a non-list-type tag + - API Changes: + - Added Filter option + - Changed GetNewValues method name to GetNewValue (GetNewValues still + works for backward compatibility) + +Oct. 28, 2015 - Version 10.04 + + - Added a few new Microsoft XMP tags + - Enhanced -r option to allow processing of directory names beginning with "." + - Avoid writing XMP-microsoft:LensModel unless specified explicitly + - Limit precision of area size in picasa_faces config file (thanks StarGeek) + - Moved Nikon NCDT GPS tags into the GPS group so they work with the Composite + GPS tags + - Fixed problem reading Ricoh RMETA information from some cameras + +Oct. 21, 2015 - Version 10.03 + + - Added support for JPEG 2000 extended-length boxes + - Added a few new Canon LensType and CanonModelID values + - Added a new Nikon LensID (thanks LibRaw) + - Added ExifTool version number as a comment in -listx output + - Added support for Leica SL (Typ 601) maker notes + - Added a new Sony LensType (thanks Jos Roost) + - Decode more Sony tags for some new models (thanks Jos Roost) + - Decode a new Pentax tag + - Patched for invalid makernote entry written by Sony ILCE-7M2 v1.21 + - Patched problem reading EXE resources with a missing null terminator + - Updated Windows distribution package to use latest version of PAR + +Sept. 17, 2015 - Version 10.02 + + - Added ability to read PNG chunks after the normal PNG end of file (IEND) + - Added ability to delete a PNG trailer (with -trailer:all=) + - Added some new Nikon LensID's (thanks Robert Rottmerhusen and LibRaw) + - Added a few new Canon LensType's (thanks Jos Roost and LibRaw) + - Added a new Pentax LensType (thanks Niels Kristian Bech Jensen) + - Decode some new PanasonicRaw tags (thanks Andrew) + - Decode a new Pentax tag + - Enhanced -m option to allow IPTC values which are too short to be written + +Sept. 3, 2015 - Version 10.01 + + - Added a new Olympus CameraType + - Added a new Canon LensType (thanks Norbert Wasser) + - Added a few new QuickTime GenreID values (thanks Francois Bonzon) + - Decode a new Pentax tag + - Leica programmers should all be ashamed of the complete shambles of metadata + they have created + - Minor change to the name of a Sigma lens for Canon + - Improved recognition of Pentax lens adapter + - Implemented NoPDFList for -b option of Windows version too + - Renamed a few Sony tags and improved decoding of others (thanks Jos Roost) + - Renamed a few Pentax tags + - Fixed problem importing structured information from -X option output + - Fixed round-off errors in value and typo in name of CanonVRD:GammaWhitePoint + - Fixed test failures if Encode, POSIX or Time::Local modules are missing + +Aug. 18, 2015 - Version 10.00 (production release) + + - Added a few new CanonModelID's + - Added a few new Nikon LensID's (thanks Jaap Voets and Robert Rottmerhusen) + - Added a new Canon LensType (thanks Jos Roost) + - Decode a number of new Sony tags (thanks Jos Roost) + - Decode a couple more RIFF tags and extract Unknown RIFF tags + - Changed -b option to avoid splitting PDF List-type tag values + - API Changes: + - Added NoPDFList option + +July 23, 2015 - Version 9.99 + + - Added support for the Leica Q (Typ 116) maker notes + - Added two new SonyModelID's (thanks Jos Roost for one) + - Added two new Sony LensType2 values (thanks Jos Roost) + - Added a new Pentax LensType + - Extract a number of new File System tags when API SystemTags option is set + - Decode a new FujiFilm tag (thanks TonyB) + - Decode a number of new Sony tags (thanks Jos Roost) + - Disabled writing of XMP to PostScript-format Adobe Illustrator files + - SourceFile values in -csv and -json input/output are now converted to/from + filename character set (set by -charset filename option) when + reading/writing + - Renamed Flash:FileAttributes to FlashAttributes + - Renamed FujiFilm:AFPointSet to AFMode and improved decoding + - Fixed problem where a partial command could be executed if the -stay_open + option was used and the command is aborted due to an error in arguments + - Fixed problem with OS X installer on El Capitan (now installs in + /usr/local/bin instead of /usr/bin) + - API Changes: + - Added SystemTags option + +June 26, 2015 - Version 9.98 + + - Added read support for DSS and DS2 file formats + - Added write support for XMP-mwg-rs:Rotation (seen in XMP from LR6) + - Added a new Sigma LensType (thanks Niels Kristian Bech Jensen) + - Decode Pentax DiffractionCorrection + - Decode Olympus ID3 XOLY frame + - Decode a few more Sony tags + - Improved reliability of decoding Nikon D810 ShotInfo and custom settings + - Changed name of Pentax VignettingCorrection to PeripheralIlluminationCorr + - Fixed problem with user parameters in tag name expressions when copying + +June 2, 2015 - Version 9.97 + + - Added a new Pentax Quality value + - Added a new Panasonic AdvancedSceneMode (thanks Horst Wandres) + - Minor improvement to lens identification logic based on XMP information + - Changed a few DR4 tag names + - Fixed improper scoping of XMP namespace prefixes (so conflicting prefixes + are now properly resolved) + +May 20, 2015 - Version 9.96 + + - Added support for CanonVRD version 4 information and DR4 files + - Added two new Canon LensType values (thanks Norbert Wasser) + - Added two new Olympus LensType values (thanks Niels Kristian Bech Jensen) + - Added a new Minolta/Sony LensType and fixed another one (thanks Jos Roost) + - Added a new Nikon LensID (thanks John Helour) + - Added a few new QuickTime tags + - Added a new PentaxModelID and a new Pentax PictureMode + - Added a few new XMP-aux tags + - Decode a couple more DPX tags + - Decode NikonCustom tags for D810 firmware version 1.02 + - Improved -htmlDump output for extended XMP and some other JPEG segments + - Improved a Canon lens name + - Documented the -userParam command-line option (which has existed since 9.90) + - Changed default behaviour to ignore extended XMP with an incorrect GUID (as + per the XMP specification) + - Changed the case of a few tag names for consistency + - Patched problem with Sony cameras giving incorrect LensInfo for some third + party lenses, leading to an incorrect LensID by ExifTool (thanks Jos Roost) + - Patched problem where GPS minutes or seconds could round up to 60 + - Fixed picasa_faces.config to rotate regions if necessary for RAW file types + (thanks Stargeek) + - API Changes: + - Added ExtendedXMP option + +May 9, 2015 - Version 9.95 + + - Added a few new Minolta/Sony lenses (thanks Jos Roost) + - Added config_files/photoshop_paths.config to the full distribution + - Avoid rebuilding maker notes when using -tagsFromFile with -fast2 option + - Validate tag names when redirecting (ie. "-DSTTAG 1) + - Avoid writing a few XMP-crs tags which have XMP-exifEX equivalents unless + specified explicitly + - Patched POD documentation in MIE.pm to remove non-ASCII characters + - Fixed bug adding back XMP tags in PDF files after deleting all in the same + command (also made XMP the preferred group when writing PDF files) + - Fixed bug extracting some font information from QuickTime videos + - Fixed inconsistencies in behaviour when extracting XML as a block from + JPEG2000 images + - Fixed problem where FileName was changed when using -srcfile option and + writing only the Directory + - API Changes: + - Added the PNGEarlyXMP option + - Internal Changes: + - Changed all "$exifTool" variable names to "$et" throughout -- my + apologies to the diff engines + +Oct. 19, 2013 - Version 9.39 + + - Added a new PentaxCameraID and some new LensTypes (thanks Louis Granboulan) + - Added a new Nikon LensID + - Added a new Panasonic ShutterType + - Additions and improvements to Pentax makernote decoding for K-3 + - Decode a number of new tags including purchase information from MP4 videos + - Decode FLIR information acquired by Extech MeterLink meters (thanks Tomas) + - Decode more Sony tags (thanks Jos Roost) + - Patched to suppress the run-time "No such file or directory" error that has + been seen when using the -csv option on Windows systems + +Oct. 7, 2013 - Version 9.38 + + - Added read support for DPX images + - Added a new Pentax LensType + - Added a few new CanonModelID values + - Added a new XMP-apple-fi tag + - Decode a few more Canon tags (thanks Tomasz Kawecki) + - Decode a few more Sony tags (thanks Jos Roost) + - Improved the names of a few Apple tags (thanks Neal Krawetz) and added new + Composite tag + - Tolerate NMEA sentences with missing degrees written by some crappy software + - Changed Duration conversion to print number of days if more than 24 hours + +Sept. 14, 2013 - Version 9.37 + + - Added support for maker notes from Apple iPhone5 iOS 7 + - Added two more Torrent tags + - Added a new Pentax DigitalFilter + - Added new Olympus CameraType and LensType values + - Decode a couple more Olympus tags + - More improvements to Sony decoding (thanks Jos Roost) + - Improved decoding of Scalado JPEG APP4 information + - Fixed problem where a PreviewImage could be reported in either the File or + Composite group, depending on the details of the command + +Sept. 7, 2013 - Version 9.36 + + - Added read support for BitTorrent description files (bencode format) + - Added a couple of new Nikon LensID's (thanks Jurgen Sahlberg) + - Added support for PNG 8bim raw profile + - Added or fixed a few Pentax LensType values (thanks Louis Granboulan) + - Added ability to delete DNGAdobeData and DNGPrivateData + - Decode more Sony tags and improved decoding of others (thanks Jos Roost) + - Decode a number of new FujiFilm tags and fixed 2 incorrect Saturation values + - Decode a number of Canon CameraInfo tags for the 70D (thanks Tomasz Kawecki) + - Patched to issue minor warning and extract only the first 1000 values from + XMP list-type tags containing more than 1000 items (all values may be + extracted by ignoring this warning with the -m option) + - Patched decoding of PNG IPTC raw profile to allow either IIM or IRB data + - Flagged ImageSourceData as "unsafe" (avoids excessive memory usage when + copying all tags because this data may be larger than the image itself for + Photoshop TIFF images) + - Disabled feature introduced in version 9.14 which allowed multiple tags + (specified by wildcards) to be copied into a single list. This feature had + the unintended side-effect of generating duplicate list items when copying + list-type tags if there were multiple source tags with the same name. If + necessary, -addTagsFromFile may still be used to copy the values of multiple + tags into a single list. + +Aug. 17, 2013 - Version 9.35 + + - Added a new Canon LensType (thanks Oliver) + - Added two new Olympus CameraType values + - Added some new Pentax LensType values (thanks Louis Granboulan) + - Added a new RIFF StreamType value + - Decode a number of new Sony tags (thanks Jos Roost) + - Decode CameraTemperature from more Canon models + - Extract thumbnail information from Leica X VARIO MP4 videos + - Improved decoding of Pentax LensData (thanks Louis Granboulan) + - Patched to avoid a warning for the messed-up Leica M maker notes + - Changed a few Pentax Samsung/Schneider lens names for consistency + - Changed "Can't delete" message to indicate if the tag is Permanent + - Fixed the case of a few tag names (thanks Romain) + +July 27, 2013 - Version 9.34 + + - Added support for Ricoh GR maker notes (in MOV videos too) + - Added a new Olympus LensType (thanks Niels Kristian Bech Jensen) + - Added a new Canon LensType (thanks Norbert Wasser) + - Added support for Sony DSC-TF1 maker notes (thanks Jos Roost) + - Added patch for messed up Leica M (Typ 240) MakerNote trailer + - Added a few new CanonModelID's and a few new PentaxModelID's + - Added some new XMP-crs tags written by LR5 + - Added a few new Nikon LensID's + - Decode a number of new Ricoh GR tags (thanks Tim Gray) + - Recognize the Nikon SB-700 external flash + - Updated MWG location tags to conform with the MWG 2.0 specification (but + continue writing legacy IPTC Core location tags) + - Removed "[Minor]" designation from "excessive count" warning if count is + greater than 2M + - Avoid processing multiple EXIF IFD's if only one should exist + +July 13, 2013 - Version 9.33 + + - Added support for EXIF UTF-16 Unicode text (previously treated as UCS-2) + - Added support for Leica X Vario maker notes + - Added a couple of new SonyModelID values (thanks Jos Roost) + - Added a new CanonModelID and a new Olympus CameraType + - Added a new Canon LensType + - Added a new Olympus LensType (thanks Niels Kristian Bech Jensen) + - Decode some new Panasonic tags and added values for others (thanks Thomas) + - Improved decoding of Olympus RawDevArtFilter + - Improved decoding of some Sony tags for the RX100M2 + - Changed application to always return an error status when exiting if an + error was encountered when extracting information + +June 22, 2013 - Version 9.32 + + - Added support for "Exif 2.3 for XMP" tags + - Added a few new Olympus LensTypes (thanks Niels Kristian Bech Jensen) + - Added a few new PentaxModelID's + - Added two new Samsung LensType values (thanks Pascal de Bruijn) + - Decode a new Olympus tag + - Fixed problem extracting audio comments from Ricoh G700SE images + - Fixed a non-conforming CanonModelID string + +June 8, 2013 - Version 9.31 + + - Added a number of new Photoshop tags (but marked as Unknown) + - Added a few new values for some Olympus tags + - Added conversion for Olympus SensorTemperature + - Added two new CanonModelID's + - Added support for Reconyx firmware 4.0.0 + - Decode a number of new QuickTime and FLIR tags in MP4 videos + - Decode more Sony tags (thanks Jos Roost) + - Decode a new Olympus tag + - The API List option may now be used in the config file for the same effect + as -sep when combined with the -X, -j or -php option on the command line + - Fixed problem where some QuickTime string values could have terminating NULL + characters, which caused problems when renaming files using these tags + +May 25, 2013 - Version 9.30 + + - Added a new Canon LensType + - Decode many Canon 700D CameraInfo tags + - Also delete null characters with the default advanced formatting filter + - Tolerate leading whitespace in HTML files + - Fixed decoding of Canon 650D CameraInfo FocalLength + - Fixed bug in new advanced formatting feature which gave incorrect + output when used in the -p option for processing multiple files + +May 18, 2013 - Version 9.29 + + - Added another H264 Model value (thanks Rob Lewis) + - Added support for Canon 5DmkIII firmware version 1.2.1 + - Added recognition of IBM AVC video files + - Added a new CanonModelID + - Decode more FLIR tags (thanks Tomas) + - Decode H264 MDPM TimeCode + - More improvements to Sony LensType decoding (thanks Jos Roost) + - Extract information from the ASF Metadata Library in WMV files + - Extract ColorBalanceVersion for unknown Nikon ColorBalance information + - Updated some ID3 Genre names (thanks Mats Peterson) + - Fixed warning when using -p with a string containing a newline + - Fixed some incorrect Pentax Q LensType values + +Apr. 21, 2013 - Version 9.28 + + - Added the ability to delete unknown JPEG APP segments by segment name + - Added a bunch of new ID3 Genre values (thanks Mats Peterson) + - Decode a few more Sony tags (thanks Jos Roost) + - Decode a few more tricky FLIR tags (thanks Tomas) + - Improved Dutch language translation (thanks Peter van der Laan) + - Patched to avoid warning in images where the AFMicroAdj data has been + truncated by Canon DPP + - Fixed -tagsFromFile and -v so they may now be used when writing via pipes + - Fixed writing of Panasonic LensType tags that were broken in the 9.15 update + - Fixed incorrect case for list type of XMP DocumentAncestors and TextLayers + - API Changes: + - Allow a File::RandomAccess reference as an input to WriteInfo() + +Apr. 15, 2013 - Version 9.27 (production release) + + - Fixed "ARRAY ref" runtime error introduced in 9.25 that could occur when + using the -X option + - Fixed runtime warning which could occur when conditionally deleting XMP + structure + +Apr. 13, 2013 - Version 9.26 + + - Added read support for FLIR FFF and FPF images and decode more FLIR tags + - Added some new Pentax LensType's and Nikon LensID's + - Added a few new Panasonic ContrastMode values + - Decode a number of Canon 6D tags + - Allow CanonRaw tags to be written using "CIFF" as a group name + - Improved decoding of Canon ColorData information for newer EOS models + - Improved decoding of a number of Sony tags (thanks Jos Roost) + - Removed index number from duplicate Composite TagID's in XML output + - Fixed byte-order problem for a few Nikon D5200 and D7100 tags + - Fixed incompatibility with old-style (pre-8.46) XMP user-defined structure + definitions + +Apr. 6, 2013 - Version 9.25 (production release) + + - Added read support for FLIR thermal image metadata in JPEG images + - Added write support for DNG version 1.4 images + - Added a new Pentax DriveMode value and a new Pentax LensType + - Added two new Olympus CameraType values + - Added print conversion for XMP Flash tags to provide alternate language + support + - Decode a few more Nikon and Pentax tags + - Decode more Sony tags (thanks Jos Roost) + - Decode more Panasonic tags and changed decoding of others + - Enhanced -j and -php options to work with -D, -H and -l + - Improved German translations (thanks Herbert Kauer) + - Patched decoding of QuickTime date/time tags to accommodate Samsung and Sony + cameras that use an incorrect time zero of 1970 instead of 1904. This patch + will only work for videos produced before 2036, so hopefully Samsung and + Sony will fix this problem at their end before then (care to place a wager?) + - Fixed issues when using "-wm cg" and writing metadata as a block + - Fixed possible "division by zero" error when reading undefined XMP rational + +Mar. 23, 2013 - Version 9.24 + + - Added ability to overwrite plus append output files (-w+!) + - Added support for Sigma X3F version 3.0 images + - Added a few new values for some Pentax tags + - Added a few new CanonModelID's + - Decode Nikon D5100 and D5200 custom settings plus a few other Nikon tags + - Allow the value for missing tags extracted with the -f option to be + configured via the API MissingTagValue setting (default is still "-") + - Improved decoding of Sony LensSpec (again, thanks Jos Roost) + - Fixed bug reading QuickTime extended-size atoms + +Mar. 10, 2013 - Version 9.23 + + - Added -W (-tagOut) and -Wext (-tagOutExt) options to allow multiple tags + to be extracted to separate output files from a single source file + - Added append feature to -w (-w+) + - Added ability to extract SoundFile from Ricoh RMETA + - Added more SonyModelID and Sony LensType values and improved Sony LensType + decoding (thanks Jos Roost) + - Added a new Olympus LensType (thanks Niels Kristian Bech Jensen) + - Added another Pentax LensType + - Decode more Nikon flash information (thanks Alyda Gilmore for the samples) + - Decode Pentax Kelvin white balance tags (thanks Klaus Homeister) + - Extract PDF embedded image color space + - Improved Spanish translations (thanks Emilio Sancha) + - More patches to avoid "APP1 segment too large" errors when copying all tags + from some RAW images + +Mar. 2, 2013 - Version 9.22 + + - Fixed problem extracting metadata from encrypted embedded JPEG images in PDF + files and added the ability to extract JPEG 2000 information too + +Mar. 2, 2013 - Version 9.21 + + - Added ability to extract embedded images and their metadata from PDF files + - Added read support for binary-format PLIST files + - Added support for Sigma DP3 Merrill maker notes + - Added a few new Sigma LensType values + - Added a new FujiFilm PictureMode value + - Decode a number of new Pentax tags (thanks Klaus Homeister) + - Decode more Sony tags (thanks Jos Roost) + - Decode some new Nikon D800 tags (thanks Alyda Gilmore for the samples) + - Decode a number of new tags in 3GP videos + - Decode Pentax CameraType + - Made a few more DNG tags writable (but protected) + - Fixed problem reading XREF table of some PDF files + - API Changes: + - The CombineInfo() routine is now deprecated because it is likely that + nobody ever used it. If anyone actually uses this, please let me know + +Feb. 20, 2013 - Version 9.20 + + - NOTICE: This release fixes a problem in the 9.19 Windows version that could + cause ExifTool to crash when writing metadata to some files (it seems that + one of the files in the 9.19 Windows package was corrupted) + - Added a new PentaxModelID + - Added write support for a few Getty Images XMP tags + - Decode Sony AFAreaModeSetting (thanks Jos Roost) + +Feb. 20, 2013 - Version 9.19 + + - Added read support for Phase One IIQ maker notes + - Added a couple of new Minolta Teleconverter values + - Patched problem which could result in runtime warning when extracting + information from a file with an incorrectly formatted PreviewImage pointer + - Improved handling of unknown maker notes when writing to reduce the chance + of corruption (fixes problem of corrupted SilverFast maker notes) + - Fixed bug in HtmlDump where unused bytes at end of MakerNotes were not shown + if they came at the end of a TIFF-format file + +Feb. 16, 2013 - Version 9.18 + + - Decode more AF information for Sony SLT models (thanks Andy Johnson for the + samples) + - Recognize CameraInfo and ColorData information from newer Canon 1DX firmware + - Organized support files in full Perl distribution into separate directories + - Improved German and Spanish translations (thanks Herbert Kauer and Emilio + Sancha) + - Fixed inconsistency where a priority tag could be hidden by a same-named tag + in the same group when using the -j or -X option combined with -g or -G + - Fixed problem in standard tests that could cause ExifTool test 25 to fail + +Feb. 9, 2013 - Version 9.17 + + - Added PLIST and MODD to the list of supported file extensions + - Added track name to UserData tags within QuickTime tracks + - Added a new Pentax LensType (thanks Pietu Pohjalainen) + - Added a new Canon LensType + - Decode binary data in PLIST and MODD files + - Decode new Canon 1DX CustomFunctions + - Issue a minor warning and ignore duplicate PDF Info dictionaries unless the + -m option is used + - Improved date/time parsing when writing to allow single-digit fields + - Improved decoding/naming of a few Sony tags (thanks Jos Roost) + - Improved German translations (thanks Herbert Kauer) + - Changed a few PLIST tag names + - Fixed decoding of Olympus CameraType for some models + - Fixed problem calculating AvgBitrate for some video files + - Fixed problem writing Canon:LensSerialNumber + +Feb. 2, 2013 - Version 9.16 + + - Added support for DarwinCore XMP tags + - Added support for CinemaDNG tags + - Added basic support for parsing XML PLIST information, and use this to + extract tags from QuickTime iTunesInfo Data + - Added a new Pentax lens (thanks Niels Kristian Bech Jensen) + - Added some new Sony E-mount lenses (thanks Jos Roost) + - Added a new NEFBitDepth value (thanks Jos Roost) + - Added a new CanonModelID + - Decode a few more Sony tags (thanks Jos Roost) + - Improved decoding of QuickTime iTunesInfo tags + - Improved Spanish translations (thanks Emilio Sancha) + - Improved handling of errors in Perl expression of new formatting feature + - Improved -p option to also handle structures + - Changed a number of Sigma lens names for Olympus to conform with official + Sigma model names (thanks Niels Kristian Bech Jensen) + - Moved the MWG XMP tags documentation to the MWG page + - Patched to allow reading GPX track logs with no version number + - Fixed problem reading an ID3 POPM frame with a missing counter + - Fixed bug which could cause "uninitialized value" runtime warning when + reading Nikon maker notes with an empty RetouchHistory + - API Changes: + - Compatibility Notice: The MWG Composite tags are no longer automatically + loaded just by using the MWG module. Image::ExifTool::MWG::Load() must + now be called explicitly to load these tags + +Jan. 27, 2013 - Version 9.15 + + - Added advanced formatting feature to -p and -tagsFromFile options + - Added -echo3 and -echo4 options + - Added a few more Olympus LensType values, removed one, changed some lens + names for consistency (all thanks Niels Kristian Bech Jensen), and use + hexadecimal instead of decimal for numerical LensType values + - Added a number of new Sony E-mount lenses + - Added a new Tamron lens for Sony (thanks Marcin Krol) + - Trim trailing spaces from Panasonic LensType strings + - Fixed bug which could cause "Can't call method GetMarkerPointers" runtime + warning when writing certain types of corrupted images + - Fixed problem copying PrevewImage from some corrupted files + - Fixed problem identifying a Sigma lens for Nikon at some focal lengths + - API Changes: + - Added AddUserDefinedTags() method + - Added formatting feature for tag values in SetNewValuesFromFile() + +Jan. 18, 2013 - Version 9.14 + + - Added -wm (-writeMode) option to provide control over tag write/create mode + - Added ability to use wildcards in target tag names when writing + - Added ability to read/write Jpeg2000 XML tag as a block + - Added ability to delete MPF segment (with -MPF:All=) + - Added a number of new Olympus lenses (thanks Niels Kristian Bech Jensen) + - Added a new Nikon LensID (thanks Robert Rottmerhusen) + - Added a number of new Pentax LensType's (thanks Alan Robinson for one) + - Added a few new CanonModelID's and Canon LensType's + - Decode ID3v2 POPM and OWNE frames + - Decode new Canon 6D CustomFunctions + - Improved calculation of ScaleFactor35efl for Canon cameras + - Changed priority of PDF Info tags so tags from most recent Info dictionary + take precedence (to partially accommodate the questionable Acrobat Pro + incremental update technique) + - Changed some verbose warnings when attempting to write "unsafe" tags + - Changed behaviour so that "unsafe" tags are not copied for any tag specified + using a wildcard (previously this was the behaviour for a tag name of 'all' + or '*', but not names like 'gps*') + - Fixed bug where a Composite tag could sometimes not be generated when the + -struct option was used if the tag was derived from an XMP List-type tag + - Fixed problem conditionally deleting GIF Comment and MIE tags + - Fixed decoding of RawImageWidth/Height from FujiFilm X-E1 RAF images + - API Changes: + - Added WriteMode option + +Jan. 10, 2013 - Version 9.13 (production release) + + - Added basic validation of ExifVersion and FlashpixVersion tags when writing + - Fixed problem where MPF PreviewImage was lost when editing metadata in JPEG + images from the Nikon D4, D600 or D800 + +Jan. 2, 2013 - Version 9.12 (production release) + + - Fixed problem introduced in 9.10 preserving file modification date/time when + some options are used + +Jan. 2, 2013 - Version 9.11 (production release) + + - Improved decoding of some Sony tags + - Changed 3 tag names to avoid a leading digit to fix XML validation problem + - Fixed bug introduced in 9.04 that could double-encipher some Sony MakerNote + information when writing (affected files are fixed by writing any tag with + ExifTool 9.11) + +Dec. 29, 2012 - Version 9.10 + + - Added write support for a few new XMP-crs and XMP-photomech tags + - Added a new Samsung LensType (thanks Jaroslav Stepanek) + - Added a new Pentax LensType (thanks Helmut Schutz) + - Added a new Canon LensType + - Decode Sony A99 FocusMode (thanks Michael Tapes for the samples) + - Tolerate (but warn about) up to 4 bytes of garbage at start of EXIF segment + - Changed -P option to also preserve FileCreateDate on Windows (requires + Win32API::File::Time) + - Changed "[minor]" warning messages to capitalize the "M" (ie. "[Minor]") if + processing is affected when the warning is ignored + - Patched to avoid problem of slow processing with some corrupted EXIF + +Dec. 15, 2012 - Version 9.09 + + - Added a few new Google XMP GPano tags + - Added a new Olympus CameraType + - Added a couple of new Minolta LensTypes + - Added two new Nikon LensID's (thanks David Puschel and Robert + Rottmerhusen) + - Decode Nikon D7000 AFPointsUsed and make this tag writable + - Decode a new Olympus tag (thanks Christoph Anton Mitterer) + - Renamed one of the FujiFilm RAF RawImageWidth/Height pairs to + RawImageFullWidth/Height + - Changed -stay_open when combined with -q to flush output after each command + (as already done without -q) (requires IO::Handle) + - Fixed problem shifting FileCreateDate when writing other "real" tags in the + same command + +Nov. 26, 2012 - Version 9.08 + + - Fixed bug introduced in 9.07 that broke writing of FileModifyDate + +Nov. 24, 2012 - Version 9.07 + + - Added ability to read/write FileCreateDate (Windows only) + - Added ability to read FileInodeChangeDate (non-Windows only) + - Added support for new tags in DNG 1.4 specification + - Added support for Google Photosphere GPano XMP tags + - Added a couple of new Olympus filter effects + - Changed a Panasonic LensType (thanks Olaf Ulrich) + - API Changes: + - Enhanced SetFileModifyDate() to write FileCreateDate (Windows only) + +Nov. 17, 2012 - Version 9.06 + + - Added support for Nikon maker notes in images from any camera make (as + written by Capture NX2) + - Added support for FujiFilm X-E1 RAF images + - Added a new Olympus CameraType + - Added a new PentaxModelID and a new Pentax LensType + - Extract FileCreateDate (Windows) and FileInodeChangeDate (other systems) + - Fixed bug decoding UTF-16 ID3 synchronized lyrics + +Nov. 10, 2012 - Version 9.05 + + - Added ability to read APE metadata from MP3 audio files + - Decode ID3 synchronized lyrics/text information + - Decode maker notes in Leica V-LUX40 MP4 videos + - Decode Sony A99 AFPointSelected (thanks Michael Tapes for the samples) + - Improved decoding of some Sony tags (thanks Jos Roost) + - API Changes: + - Removed GeoNoInterpolate option (just set GeoMaxIntSecs to 0 instead) + +Nov. 3, 2012 - Version 9.04 (production release) + + - Added two new Sony LensType values (thanks Matthias Paul) + - Added a few new Canon LensType values + - Added a couple of new PentaxModelID's and decode some new K-5 II values + - Added support for some new XMP tags written by the Apple iPhone 5 + - Added a new Olympus CameraType + - Decode more Sony tags/values (thanks Jos Roost) + - Decode Nikon HDRInfo (thanks Stefan) + - Decode some FlashInfo tags for new Nikon models + - Decode a few WM ID3 tags (some documentation on these would be nice) + - Fixed bug which could cause truncated/garbage ID3v2 strings to be returned + - Fixed -globalTimeShift option to also work when copying tags + - Fixed decoding of Nikon AFFineTuneAdj for FirmwareVersion 1.10B (thanks + Michael Tapes for the samples for this and the A77) + - Fixed problem where a few tags (FileSequence, NewGUID and Now) were not + available for use with the -p option + - API Changes: + - Added RequestAll and GeoNoInterpolate options + - Fixed problem in SetNewValue when setting the Raw value of some tags + +Oct. 13, 2012 - Version 9.03 + + - Added new feature to provide control over directory levels in %d strings + - Added ability to write OtherImage in NEF images + - Added a new Pentax LensType + - Added a few new CanonModelID's (thanks Laurent Clevy) + - Added a new Nikon LensID (thanks Geert De Soete) + - Added a few new Olympus CameraType values + - Decode some new CameraInfo tags for the Canon EOS 650D + - Decode a number of new Sony tags (thanks Jos Roost) + - Improved decoding of some Sigma tags for the DP1/DP2 Merrill + - Give priority to EXIF tags over SigmaRaw tags X3F images + - Changed Samsung lens names to include "NX" (thanks Jaroslav Stepanek) + - Fixed misleading verbose "TAG is not writable" messages when copying + list-type tags + - API Changes: + - Enhanced GetValue() to allow return of 'Rational' value + +Sept. 6, 2012 - Version 9.02 + + - Added a new Nikon LensID (thanks Joseph Heled) + - Added a new EXIF SubFileType value used in DNG images + - Added write support for Apple Adjustment Settings XMP tags (XMP-aas) + - Added a couple of new Samsung LensType values (thanks Jaroslav Stepanek) + - Added a couple of new Canon LensType values and a new CanonModelID + - Decode a number of new Sony tags (thanks Jos Roost) + - Enhanced "-o -" feature to allow output file type to be specified + - Extract last file access time as FileAccessDate + - Allow tags to be set from files which are zero bytes in size + - Made ProfileHueSatMap tags Binary if they are too long + - Changed names of some PanasonicRaw DistortionInfo tags + - Changed decoding for a Sony ExposureMode value + - Fixed hang/crash that could occur when writing to an image with corrupted + Sony MoreInfo data (eg. SLT-A55V JPEG corrupted by GIMP) + +Aug. 25, 2012 - Version 9.01 (production release) + + - Added a couple of new CanonModelID values + - Added a couple of new Canon LensType values (thanks Pascal de Bruijn) + - Added a new PentaxModelID and a few new Pentax PictureMode values + - Decode a new Pentax ISO tag + - Improved -listx output for XMP structure tags + - Fixed "unexpected end of file" problems with some compressed MIE files + +Aug. 18, 2012 - Version 9.00 + + - Added support for PDF encryption V5.6 (new in Adobe Reader X) + - Added a few new XMP-cc tags and changed a few others to rdf:resource type + - Added a new Sony LensType and values for other Sony tags (thanks Jos Roost) + - Added a new Nikon LensID + - Added a new Panasonic LensType (thanks Olaf Ulrich) + - Added patch to fix simple XMP tags written incorrectly as lang-alt type + - Decode some Panasonic RW2 lens distortion correction tags + - Decode some WEBP image characteristics from the VP8 bitstream + - Decode more Leica MakerNote information + - Calculate CurrentIPTCDigest for IPTC in PostScript files + - Changed the names of a couple of WBShift tags + - Improved parsing of -if expressions to interpret a dash after a tag name as + a minus sign instead of part of the tag name + - Patched problem with conditional deletion of an incorrectly null-terminated + JPEG Comment + - Fixed hang bug when reading unsupported Microsoft Xtra information in MOV + videos + +Aug. 3, 2012 - Version 8.99 + + - Added patch to avoid "Error renaming temporary file" errors in Windows + - Decode some new Sony tags and values (thanks Mike Reit and Jos Roost) + - Improved Italian translation (thanks Michele Locati) + - Improved decoding of H264 ImageStabilization + - Changed names of PanasonicRaw ImageWidth/Height tags, and added new + Composite tags to calculate actual size of RW2 images + - Fixed "Corrupted Ricoh RMETA data" warning for images from some Ricoh models + - Fixed problem writing information to some EPS images + +July 28, 2012 - Version 8.98 + + - Added a new Pentax LensType and two new PentaxModelID's + - Added a new CanonModelID and a new Olympus CameraType + - Added a new Composite Duration tag for Vorbis audio files + - Added more elements to Microsoft Regions XMP structure and fixed tag name + documentation for this + - Decode a number of new Sony tags (thanks Jos Roost) + - Changed name of Minolta BatteryLevel tag to BatteryState + - Patched problem with conditional deletion of IPTC string-type tags which are + incorrectly null terminated (eg. written by Picasa 2.0) + - Fixed problem copying Canon 5DmkIII MakerNotes from CR2 to JPEG images + - Fixed runtime error when writing some images with corrupted EXIF + +July 6, 2012 - Version 8.97 + + - Added a new Canon LensType + - Added support for GPX attitude information as written by Arduino + - Added write support for XMP-expressionmedia:CatalogSets + - Made CFARepeatPatternDim and CFAPattern2 writable but protected + - Minor improvement to decoding of Sony FaceInfo + - Fixed problem reading some GPX track logs + +June 30, 2012 - Version 8.96 + + - Added -globalTimeShift option + - Added new values for a couple of Nikon tags (thanks Michael Relt) + - Added a few new Sony PictureEffect values + - Added a new Olympus LensType + - Decode a new Sony A100 tag and improved/renamed some others (thanks Igal + Milchtaich) + - Changed -restore_original and -delete_original options to scan directories + only for writable file types + - Enhanced -srcfile option to allow multiple source files to be specified + - Patched possible round-off problem when extracting rational values + - Fixed bug which could cause runtime error when reading some HTML files and + improved reliability when extracting HTML "meta" tags + - API Changes: + - Added GlobalTimeShift option + +June 16, 2012 - Version 8.95 + + - Added a few new Sony PictureEffect values + - Added a new Olympus lens type (thanks Niels Kristian Bech Jensen) + - Improved decoding of Canon IntelligentContrast + - Improved user-defined lens logic to attempt to choose the best matching + user-defined lens if more than one is possible + +June 9, 2012 - Version 8.94 + + - Added ability to read/write IPTC as a block + - Added a few Nikon LensID's (thanks Mike Pollock and Robert Rottmerhusen) + - Added a new Olympus LensType (thanks Brad Grier) + - Added new values for a few Olympus tags + - Decode more Sony tags (thanks Jos Roost and Igal Milchtaich) + - Decode Canon IntelligentContrast and add a new CanonModelID + - Changed names of Canon Sort/LongFocal tags to Min/MaxFocalLength + +May 26, 2012 - Version 8.93 + + - Added some new Nikon RetouchHistory values + - Added a couple of new Pentax LensType values + - Added some new Olympus MagicFilter and LensType values + - Added a new CanonModelID + - Decode more Sony tags (thanks Jos Roost) + - Decode some MakerNote information in Olympus E-M5 MOV videos + - Decode a couple more Canon tags + - Patched to overcome formatting problems in Samsung NX200 JPEG maker notes + +May 12, 2012 - Version 8.92 + + - Added read support for PCD (Kodak Photo CD Image Pac) files + - Added Geotag support for Winplus Beacon text-format GPS log files + - Added support for Leica X2 MakeNotes + - Added NewGUID tag + - Decode Panasonic ManometerPressure tag (thanks Christoph Mitterer) + - Decode more Sony tags (thanks Jos Roost) + - Changed a few Canon-mount Tokina lens model names for consistency + +May 5, 2012 - Version 8.91 + + - Added -progress option + - Added support for XMP fpv namespace + - Added a new Canon EasyMode value and fixed an incorrect one + - Added a couple of new Canon LensTypes + - Decode a number of new tags for the Canon 1DX and 5DmkIII + - Improved the names of a few Sony tags (thanks Jos Roost) + - Fixed -sep option to apply to interpolated tag values in a string when + copying + +Apr. 28, 2012 - Version 8.90 (production release) + + - Added ability to fix double-UTF-encoded embedded XMP + - Added a warning for invalid XMP + - Added a new Minolta/Sony LensType (thanks Matthias) + - Added a new values for some Canon tags + - Decode ColorBalance information for a few more Nikon models + - Ignore trailing whitespace when writing converted values + - Enhanced the -z option to avoid writing the 2424 bytes of padding in XMP + - Improved decoding of some Sony MakerNotes tags (thanks Jos Roost) + - Improved "best guess" for fixing corrupted makernote offsets of some Sony + models + +Apr. 21, 2012 - Version 8.89 + + - Added new Nikon and Ricoh LensID's + - Added a new Olympus CameraType + - Added new Canon LensType, EasyMode and CanonModelID values + - Added new Pentax PictureMode and PentaxModelID values + - Added support for IDimager XMP tags + - Added a number of new XMP-crs tags used by LR4 + - Decode a few more QuickTime tags + - More improvements decoding Minolta/Sony CameraSettings (thanks Jos Roost) + - Enhanced -ext option to allow files with any extension to be processed + - Increased maximum number of SubIFD's to accommodate some DNG 1.4 images + - Lowered priority of JPEG APP12 PictureInfo tags when reading + - Created mechanism to allow self-referential XMP structures + +Apr. 15, 2012 - Version 8.88 + + - Added a new Canon LensType (thanks Gerald Erdmann) + - Decode a number of new Olympus tags and values + - Decode a few more QuickTime tags + - Many more improvements and additions to Sony decoding (thanks Jos Roost) + - Changed Ricoh InternalSerialNumber to also convert numerical value + - Removed the ability to create IFD1 in TIFF-format images (you shouldn't + really do this anyway) + - Fixed incorrect IFD number in some error messages when writing + +Apr. 9, 2012 - Version 8.87 + + - Added a new PentaxModelID + - Added new values for some Panasonic tags + - Added a couple of new Canon LensTypes + - Decode a few more Sony tags and values (thanks Jos Roost) + - Decode more CanonVRD tags + - Decode makernotes from Pentax WG-2 GPS MOV videos + - Changed Panasonic AdvancedSceneMode to a Composite tag + - Fixed problem introduced in 8.70 where excluding groups from deletion didn't + work when copying back tags in the same command + - Fixed problem repairing incorrect makernotes offsets in JPEG images from + Sony SLT and NEX cameras + +Apr. 3, 2012 - Version 8.86 + + - Added a few new values for some Panasonic tags + - Added a new CanonModelID and a new Canon LensType + - Added a new Nikon LensID + - Decode more Sony CameraSettings3 information (thanks Jos Roost) + - Decode another Canon 5D tag + - Decode some new CanonVRD DLO tags + - Changed decoding of CanonVRD VRDVersion tag + - Changed formatting of a Pentax LensType for consistency with other lenses + - Patched decoding of Reconyx:DateTimeOriginal to accommodate values written + with an incorrect byte order by some models + +Mar. 25, 2012 - Version 8.85 (production release) + + - Added a couple more Olympus CameraType values + - Added two new Pentax LensType's and a PentaxModelID + - Decode a number of new Sony CameraSettings3 tags (thanks Jos Roost) + - Decode a few new Pentax K-01 tags + - Decode new custom functions of the Canon 5D Mark III + - Recognize another non-standard APP1 XMP header + - Increased unrolled depth of XMP-mwg-kw:HierarchicalKeywords from 4 to 6 + - Extended "-charset exif=CHARSET" to also apply to EXIF UserComment when + stored as ASCII + - Changed name of Olympus MaxApertureAtCurrentFocal to to MaxAperture + - Patched to avoid possibility of unnecessary "references previous directory" + warning when the length of one directory is zero + +Mar. 17, 2012 - Version 8.84 + + - Added a few more SonyModelID's (thanks Jos Roost) + - Added a new CanonModelID and a number of new Canon LensType values + - Added a new Minolta/Sony LensType + - Decode CameraTemperature for a number of new Canon PowerShot models + - Decode information from PANA atom of Panasonic DMC-FT20 MP4 videos + - Decode a bit more of the Casio MakerNotes + - Improved Polish translations for EXIF information (thanks Kacper Perschke) + - Changed some warning messages for invalid IFD entries + - Patched to allow writing of Sony MakerNotes containing invalid IFD entries + +Mar. 13, 2012 - Version 8.83 + + - Added a new SonyModelID and a new Nikon LensID (thanks Gregg Lee and Jos + Roost) + - Added Finnish translations (thanks Jens Duttke and Jarkko Makineva) + - Fixed the Composite:LensID problem properly this time (with any luck) + +Mar. 13, 2012 - Version 8.82 + + - Added ability to extract information from PostScript-type DFONT files + - Added a new Minolta/Sony LensType (thanks Jos Roost) + - Improved geotagging of orientation information when extrapolating past end + of track + - Changed behaviour while copying information to allow flattened tags to be + specified without the need to use the --struct option + - Removed unnecessary warning when writing PreviewImage to Ricoh DNG file + - Fixed problem introduced in 8.81 which prevented generation of the Composite + LensID for Nikon images when duplicate tags were disabled + - API Changes: + - Added NoFlat option to SetNewValues() + - Changed Struct option to allow copying of both structured and flattened + tags at the same time + +Mar. 9, 2012 - Version 8.81 + + - Added some new Canon, Pentax and Sony/Minolta LensType's + - Added a few new FujiFilm PictureMode values (thanks Kai Lappalainen) + - Added some new FujiFilm FilmMode values + - Added a couple of new CanonModelID values + - Added local timezone message to -v2 geotagging output + - Made all Pentax LensType tags writable + - Improved Composite LensID logic to use Sony LensSpec value if available + - Fixed problem opening files with path names that begin with "&" + +Feb. 25, 2012 - Version 8.80 + + - Added a new Olympus CameraType + - Improved geotagging to tolerate out-of-sequence and missing NMEA sentences + - Increased the maximum XMP tag ID length to 250 characters to allow very deep + user-defined structure hierarchies + +Feb. 20, 2012 - Version 8.79 + + - Avoid deleting the JPEG APP14 Adobe segment when deleting all metadata + - Added ability to read/write/create JPEG APP14 Adobe segment as a block + - Added some new CanonModelID values + - Added another Panasonic WhiteBalance value (thanks PeterK) + - Decode Panasonic ColorTempKelvin tag + - Decode information from Qualcomm APP7 JPEG segment + - Extract PreviewImage for a few more uncommon camera models + - Strengthened MP3 file recognition to avoid mis-identification of some files + - Fixed problems reading "sfnt" resource in some DFONT files + - Fixed problems writing some LensType values for 3rd-party lenses + +Feb. 11, 2012 - Version 8.78 + + - Added basic read support for a few obscure audio formats (LA, OFR, PAC, WV) + - Added a couple more Canon LensType values + - Decode some new Kodak tags in MP4 videos + - Patched timezone problem on MirBSD due to leap-second "feature" of this OS + - Fixed problem converting Adobe XMP LensID's for Pentax lenses + - Fixed runtime warning due to conflict with some Vorbis tag ID's + - Fixed problem which could result in duplicate columns in -csv output when + used with -f and the "#" suffix on a tag name + - API Changes: + - Added XMPAutoConv option + +Jan. 27, 2012 - Version 8.77 (production release) + + - Added some new and updated some existing Sony/Minolta LensType values + - Added two missing Minolta Teleconverter values + - Added a new Canon LensType + - Decode Olympus ArtFilterEffect + - Enhanced -c (CoordFormat) option to allow signed coordinate output + - Changed -sort option to always sort -json and -X outputs by tag name + - Minor change to an Olympus LensType name (thanks Niels Kristian Bech Jensen) + - Fixed problem geotagging orientation information from PTNTHPR sentence + - Fixed decoding of negative Pentax EffectiveLV values + - Fixed typo in an Olympus LensType + +Jan. 18, 2012 - Version 8.76 + + - Added -sort option to sort output by tag name or description + - Added support for FujiFilm RAF version 1.03 images and downgraded RAF + version error to a warning + - Added a number of new Minolta/Sony LensType's + - Added a new CanonModelID + - Decode FocusPosition for Sony A850 and calculate Composite FocusDistance + - Decode IFD found in some Samsung Type1 maker notes + - Patched Olympus test to fix failure on some platforms + - Patched -json output to filter out invalid UTF-8 characters + - API Changes: + - Added Sort2 option and 'Descr' setting for Sort option + - Added secondary sort option to GetFoundTags() and GetTagList() + - Changed name of Sort 'Alpha' setting to 'Tag' (but 'Alpha' still works + for backward compatibility) + +Jan. 8, 2012 - Version 8.75 (production release) + + - Added -php output option (thanks Marcel) + - Decode another AIFF tag and handle character encoding in AIFF text values + - Recognize PHP files + - Enhanced Geotag feature to write speed/track from NMEA GPRMC sentence, and + orientation information from Honeywell NMEA PTNTHPR sentence + - Changed verbose XMP output to print raw values + - Lowered default priority of "avoided" tags so they don't override other + same-named tags when reading with duplicate tags disabled + - Patched tests to ignore MirBSD leap-second unconformity + - Patched ZIP module to avoid failed tests with Perl 5.6.2 on GNU/Linux 2.6 + - Fixed problem reading xref table of some PDF files created by PScript5.dll + - Fixed problem reading RicohSubdir from AVI videos of the GR Digital 4 + +Dec. 28, 2011 - Version 8.74 + + - Added read/write support for Hasselblad FFF images + - Added iptcCore.args convenience file to the distribution package + - Catch CONT signal to allow calling applications to trigger an immediate + response (avoiding a delay of up to 0.01 sec) after writing arguments to a + -stay_open ARGFILE + - Protect against some infinite loops that could be created when using some of + the advanced exiftool options + - Improved decoding of Samsung PictureWizard (thanks Pascal de Bruijn) + - Improved handling of bad IFD entries in -htmlDump output + - Changed print conversion of EXIF:FNumber and XMP:FNumber to use 2 decimal + digits for values less than 1.0, and disable conversion for invalid values + - Tightened up the -stay_open feature to fix a few potential problems + - Fixed bug using -csv+= or -json+= for non-list-type tags + - Fixed problem deleting unknown makernotes as a block + - API Changes: + - Enhanced SetNewValue() AddValue option to allow this option to be + ignored for non-list tags + +Dec. 16, 2011 - Version 8.73 + + - Added read support for OpenEXR and Radiance RGBE images + - Added a couple of new Nikon LensID's (thanks Robert Rottmerhusen) + - Added a new PentaxModelID + - Added a new Olympus CameraType + - Created new FileSequence tag for use in batch processing + - Decode maker notes from Pentax Optio RZ18 AVI videos + - Tolerate unrecognized IPTC records (but still issue warning) + - Changed ScaleFactor35efl calculation to also use Pentax SensorSize + - Minor changes to two Samsung lens names (thanks Pascal de Bruijn) + +Dec. 8, 2011 - Version 8.72 + + - Added support for reading XMP from INX files + - Added PDF HasXFA tag + - Added a new XMP Colorants field (not in 2010 XMP specification) + - Decode Casio BestShotMode for yet more cameras + - Decode a few more Casio ImageStabilization values + - Decode a few more Olympus tags and added conversion for CameraType + - Protect against reading insanely large XMP (> 300 MB) in INDD files + - Extract large (> 64 kB) unknown XMP tags as binary data + - Reduced memory requirements for XMP processing (by 1/10) + - Fixed another place where empty XMP structures could hide (in lists) + +Nov. 19, 2011 - Version 8.71 + + - Added two new Olympus LensType values (thanks Martin Hilbers) + - Avoid recreating duplicate groups when deleting whole groups and adding back + tags in the same step + - Fixed problem where the QuickTime -charset option didn't work for some tags + - Fixed bug introduced in 8.69 which could cause excessive memory usage when + reading QuickTime videos with the -u option + - Fixed problem where existing empty XMP structure couldn't be deleted or + overwritten as a structured tag + +Nov. 15, 2011 - Version 8.70 + + - Compatibility Notice: Changed order of operations when batch processing with + -tagsFromFile option to be consistent with non-batch mode + - Added -listItem option + - Added read support for IDML files + - Added a new Canon LensType (thanks Jon Charnas) + - Added a couple of new Samsung LensType's (thanks Tae-Sun Park) + - Added support for another DigiKam XMP tag + - Decode a couple more ID3 tags + - Decode Casio BestShotMode for more cameras + - Improved decoding of Casio AFMode + - Extract unknown FLAC blocks as binary data + - Changed ITC:ImageType to make "numerical" value more friendly + - Changed priority of two unreliable Samsung tags + - Fixed bug where ExifTool could produce improperly formatted XMP when writing + structure elements to a previously empty XMP structure (the empty XMP + structure was not being properly deleted). Affected XMP may be repaired by + re-writing any element of the structure with this version of ExifTool + - API Changes: + - Added ProtectSaved option to SetNewValue() and return save count from + SaveNewValues() + +Nov. 9, 2011 - Version 8.69 + + - IMPORTANT: Fixed bug which could corrupt GIF images when writing a Comment + to a GIF image containing XMP metadata + - Added ability to read/write ICC_Profile in GIF images + - Added ability to specify internal encoding of EXIF "ASCII" strings and + QuickTime strings + - Added a new DigiKam XMP tag + - Documented -echo option (has been an undocumented feature since 6.86) + - Decode a number of new Sony tags + - Decode a few new Pentax tags and added a few new values + - Decode a few new QuickTime and ID3 tags + - Decode Casio BestShotMode for a number of models + - Improved validity checking of ICC_Profile segments in JPEG image + - Tolerate UTF-8 byte order mark (BOM) in input CSV and JSON files + - No longer trim trailing spaces from arguments in -@ argfiles + - Upgraded Windows executable version to use PAR 1.002 + - Changed priority of the Sony DynamicRangeOptimizer tags + - Changed MWG feature to use UTF8 encoding for EXIF strings by default + - Changed the -b option to avoid loading large binary values for tags that + have been excluded with the -x option or --TAG + - Changed Canon AFMicroAdjActive to AFMicroAdjMode and improved decoding + - Fixed problem where the PreviewImage could be lost when writing to images + from some newer Sony cameras + - Fixed problem reporting duplicate information when -if used with -TAG# + - Fixed incorrectly written XMP-tiff:YCbCrSubSampling tag + - Fixed problem opening files with names beginning and/or ending with some + characters such as SPACE, '>', '<' and '|'; however file names ending + with '|' are still not allowed + - API Changes: + - Added CharsetEXIF and CharsetQuickTime options + +Oct. 21, 2011 - Version 8.68 + + - Added a new CanonModelID and a new SonyModelID + - Added new Canon and Pentax LensType's + - Decode more makernote information from Nikon MOV videos + - Improved decoding of Sony LensSpec and enabled writing of this tag + - Overhauled Minolta/Sony LensType list for consistency with official Sony + lens names and removed a couple of anomalous entries (thanks Jos Roost) + - Fixed problem with negative temperatures in Reconyx makernotes + - Fixed bug which could cause runtime warnings when -f used with -X and -l + - Fixed some minor problems when using -X with MWG option + - Fixed issue where some missing tags could be printed when -f option was used + in combination with wildcard tag names + +Oct. 13, 2011 - Version 8.67 + + - Added a new Canon LensType (thanks Norbert Wasser) + - Decode tags from FujiIFD in HS10 and X100 RAF images + - Decode LocationInfo tags from Nikon maker notes + - Decode GPS tags from Nikon MOV videos + - Decode information from Microsoft "Xtra" atom in QuickTime files + - Decode Sony LensSpec information (thanks Jos Roost) + - Use more specific MakerNotes names in warning messages and verbose output + - Updated Canon CustomFunctions for the EOS 600D and 1100D + - Improved handling of some corrupted RIFF files + - Improved decoding of Samsung manual lens types (thanks Pascal de Bruijn) + - Changed "No writable tags found" warning to "No writable tags set from" + - Fixed problem handling resource forks in newer versions of OS X + - Fixed problem writing XMP as a block to Jpeg2000 images + - Fixed problem which could cause XMP and IPTC to be ignored when using MWG + feature with TIFF images and performing multiple operations in a single + command + +Oct. 3, 2011 - Version 8.66 + + - Added the ability to use "$GROUP:all" in -if and -p expressions (evaluates + to "1" if any tag exists in the specified group, or "0" otherwise) + - Added a new Sony/Minolta LensType (thanks Florian Knorn) + - Added list of recommended modules to Perl installation + - Decode ColorBalance information for a few new Nikon models + - Updated Canon CustomFunctions for the EOS 600D and 1100D + - Fixed problem writing "now" to MWG date/time tags + +Sept. 24, 2011 - Version 8.65 (production release) + + - Added a few new CanonModelID's + - Added a new Sony/Minolta LensType + - Added a new Canon LensType (thanks Klaus Reinfeld) + - Added a number of new Olympus ArtFilter/MagicFilter values + - Included new .args files in distribution: exif2iptc.args and iptc2exif.args + - Enhanced writing of date/time tags to recognize "now" for the current time + - Improved decoding of H264 Gain + - Minor improvement to -htmlDump for some invalid IFD entries + - Allow PostScript date/time tags to be written without the -n option + - Allow NikonCapture:ExposureAdj2 to be written without the -n option + - Fixed problem introduced in version 8.62 where DateTimeOriginal in IFD0 of + NEF images was no longer updated when shifting times + - Fixed problem where keywords could be duplicated when exporting to XMP while + using the MWG module + - Fixed problem reading PDF images with extra whitespace before xref table + - Fixed format problem in CSV output for filenames containing a comma or quote + - Fixed problem reading concatenated AVI videos + +Sept. 10, 2011 - Version 8.64 + + - Added 2 new ACDSee XMP tags (thanks Hannes Leubbers) + - Added a new Sony FileFormat value + - Added a new CanonModelID + - Added a few new Pentax DigitalFilter and ImageTone values + - Enhanced -execute option to allow a command ID number to be added + - Enhanced -csv and -json import features to also key on canonical SourceFile + path (requires Cwd module) + - Improved Composite LensID logic for some Sony cameras + - Fixed misleading error message when using -if option on file that doesn't + exist + - Fixed problems decoding a number of inconsistent tags in the Sigma SD1 maker + notes + +Aug. 27, 2011 - Version 8.63 + + - Added support for a number of new Open Document file extensions + - Added a few new CanonModelID and SonyModelID values + - Added a new Ricoh GXR LensID + - Added a new Sony/Minolta LensType (thanks Mladen Sever) + - Added patch to read the improperly formatted DateTimeOriginal in AVI videos + written by the Kodak Easyshare Sport camera + - API Changes: + - Added QuickTimeUTC option + +Aug. 21, 2011 - Version 8.62 - "JPEG2000 Update" + + - Added read support for JPEG2000 codestream format (J2C) + - Added a few new Nikon LensID's (thanks Robert Rottmerhusen) + - Added a few new Pentax LensType's + - Added a few new Sony/Minolta LensType's (thanks Wolfram for 2 of these) + - Added two new Sony Teleconverter values (thanks Wolfram) + - Decode a few more JPEG2000 UUID's written by Adobe JPEG2000 plugin + - Decode additional JPEG2000 ColorSpecification information + - Recognize a few more JPEG2000 file extensions + - Updated some CanonModelID's + - Tolerate extra comma at end of line in imported -csv files + - Changed name of Kodak Type9 SerialNumber tag to UnknownNumber + - Fixed bug which in rare situations could result in an erroneous "IFD pointer + references previous IFD" warning + - Fixed another memory leak when writing and removed circular references from + ExifTool object to prevent future bugs like this + - Fixed problem in Windows where values in the -X (XML) output containing + CR+LF were converted to CR+CR+LF + - Fixed superfluous warning which could occur when using += to decrement a + numerical tag + - Fixed an incorrectly spelt Pentax city name (thanks John Francis) + +July 16, 2011 - Version 8.61 + + - Added the ability to increment/decrement tags with numerical values using += + - Added support for Extensis Portfolio XMP tags plus a number of non-standard + and/or undocumented XMP-xmp and XMP-xmpMM tags + - Added read support for Microsoft Compiled HTML (CHM) format + - Added read support for Ogg Video (OGV) files + - Added new LensType values for Pentax (thanks Heike Herrmann), Sony/Minolta + (thanks Fabio Suprani and Florian Knorn), Nikon (thanks Jens Kriese), + Olympus and Sigma cameras + - Added a new QuickTime VendorID + - Recognize DEX (Dalvik Executable) files + - Identify Windows 64-bit EXE/DLL files and relax EXE validation + - Validate date/time values when reading NMEA GPS log files + - Changed decoding of CFAPattern to return a string of numbers with -n option + - Extract all unknown makernote blocks as undef, regardless of actual format + - Improved print conversion of Pentax ShakeReduction + - Fixed problem processing some Ogg files with multiple streams + - Fixed incorrect namespace URI for stArea (used by MWG 2.0 regions) + - Fixed problem with spaces in -geotag path when using wildcards + - Fixed problem writing PDF:Keywords list items individually if they contain + special characters + - API Changes: + - Enhanced SetNewValue() to allow increment/decrement of numerical tags + +June 25, 2011 - Version 8.60 (production release) + + - Added Composite Flash tag to facilitate copying of flash information between + XMP and EXIF + - Added new Pentax and Canon LensType values and fixed a Pentax lens name + - Added a few new Leica LensType's (thanks Olaf Ulrich) + - Added a new PentaxModelID + - Enhanced GPSDateStamp conversion to tolerate null separators (Casio EX-H20G) + - Made DNG LinearizationCurve and Nikon ContrastCurve writable but protected + - Renamed Nikon LinearizationTable to NEFLinearizationTable and made writable + but protected + - Removed Leica M8 FrameSelector tag since it seems to have evolved into an + extension of the LensType tag for newer lenses + - Fixed problem with order of operations when using multiple -if options + +June 11, 2011 - Version 8.59 + + - Added new Composite:LensID derived from XMP-aux:LensID + - Added new PentaxModelID and CanonModelID values + - Added a new Pentax LensType (thanks Artur) + - Decode maker notes in Pentax Optio S1 AVI videos + - Extract PreviewWMF from DOCX files + - Recognize WMF images + - Fixed decoding of CanonVRD WBAdjRGBLevels and renamed to WBAdjRGGBLevels + +June 2, 2011 - Version 8.58 + + - Decode a number of CameraInfo tags for the Canon EOS 600D and 1100D + - Improved speed by a factor of 2 when reading M2TS videos + - Fixed memory leak with -stay_open feature when writing + +May 26, 2011 - Version 8.57 + + - Added a couple of new Canon LensType values + - Added a few new Nikon LensID's (thanks Robert Rottmerhusen) + - Added format string to -v2 output for IPTC tags + - Added extra logic to avoid misidentifying unknown IFD-style maker notes + - Decode custom settings for Nikon D700 and D7000 + - Fixed problem recognizing NikonCaptureData for ViewNX version 2.1.1 + +Apr. 16, 2011 - Version 8.56 + + - Added a new Canon LensType (thanks Rodolfo Borges) + - Decode EXIF information in FujiFilm HS20EXR MOV videos + - Decode NikonCaptureEditVersions when ExtractEmbedded option is used + (previously called NikonCaptureHistory) + - Decode another Samsung tag (thanks Tae-Sun Park) + - Recognize CaptureOne ".newer" COS files + - Reverted JSON output to pre-8.51 behaviour by removing '#' suffix from tag + names when print conversion is disabled on a per-tag basis + - Fixed bug introduced in 8.32 interpreting some expressions when copying tags + +Apr. 11, 2011 - Version 8.55 + + - Added write support for FujiFilm RAF version 0716 images + - Added support for a number of new LR3 XMP tags (thanks Wolfgang Guelcker) + - Decode some more Samsung tags (thanks Tae-Sun Park) + - Improved handling of incorrectly formatted XMP + - Recognize a few alternate PS and EPS file extensions (thanks Jeff Harmon) + - Reverted a few Pentax macro lens names (less consistent, but at least they + match the official Pentax names) + - Fixed problem reading some XMP custom properties + - Fixed minor problem in HtmlDump output for Canon MakerNotes footer + +Apr. 2, 2011 - Version 8.54 + + - Added a number of new values for various tags + - Added a new Nikon LensID + - Decode a number of encrypted Samsung SRW tags (thanks Tae-Sun Park) + - Enhanced -s option so allow a number to be specified + - Fixed problem reading some Casio EX-Z35 MakerNote values + +Mar. 27, 2011 - Version 8.53 + + - Added a new Olympus LensType + - Added a new Nikon LensID + - Added a new PentaxModelID value + - Decode new Pentax MakerNotes format of Optio WG-1 GPS + - Decode Casio, Ricoh and Sanyo face detection information (thanks Jeffrey + Friedl and Emilio for samples) + - Decode FujiFilm face recognition information (thanks Jeffrey Friedl) + - Decode a new FujiFilm tag for GE models + - Allow writing GPSLatitudeRef/GPSLongitudeRef with a signed number + - Return proper FileType for M4P audio files + - Combined Canon FaceDetectFrameWidth/FaceDetectFrameHeight tags into + FaceDetectFrameSize for consistency with other makes + - API Changes: + - Fixed problem when specifying family 1 group in call to SetNewValue() + when tags were previously extracted with ExtractInfo() + +Mar. 20, 2011 - Version 8.52 + + - Added -listr option and mechanism to recognize some unsupported file types + - Added read support for VSD (Microsoft Visio Drawing) files + - Added a new Pentax LensType and improved consistency of macro lens names + - Added another CanonModelID + - Calculate Duration for M2TS (AVCHD) videos + - Decode a new FujiFilm tag + - Recognize .TS extension + - Recognize FotoStation IPTC record 240 + - Attempt to better identify FPX-format MSOffice documents with incorrect file + extensions + - Fixed bug applying time shift to Nikon PowerUpTime + - API Changes: + - Enhanced GetNewValues() to allow group name to be specified + - Allow description flag to be set to '0' when calling GetFileType() to + return types of recognized-yet-unsupported files + +Mar. 12, 2011 - Version 8.51 + + - Added -csv option for import/export of CSV database files + - Added ability to import JSON files + - Added read support for APP1 "Ocad" segment + - Added a new Nikon LensID (thanks Robert Rottmerhusen) + - Decode more Reconyx MakerNotes tags (thanks Robert Hass of Reconyx!) + - Report the number of encryption bits in the PDF:Encryption tag value + - Allow empty group name when specifying a tag + - Improved decoding of Olympus ArtFilter and MagicFilter tags + - Improved exception handling to continue with next -execute command after + aborting a command due to a serious error + - Fixed problem reading indexed PGF images + +Mar. 1, 2011 - Version 8.50 (production release) + + - Added Composite tags to convert QuickTime GPS information + - Added a couple new Sony PMP Orientation values (thanks Mike Battilana) + - Added a couple of new Nikon LensID's (thanks Rolando Ruzic) + - Added a new Canon LensType (thanks Gerald Kapounek) + - Decode new Nikon, Olympus, Pentax and Sony face detection tags (thanks + Jeffrey Friedl) + - Decode Ricoh FirmwareRevision tags + - Allow GPSLatitudeRef and GPSLongitudeRef to be written with a GPS coordinate + containing a N/S/E/W designator + - Removed Canon20D shortcut and changed Canon shortcut + - Removed LEGRIA/VIXIA/iVIS from CanonModelID names + - Renumbered Canon FacePosition tags to start at Face1Position + +Feb. 12, 2011 - Version 8.49 + + - Added a number of new values for various Canon tags + - Added a new Pentax LensType + - Added ability to write Nikon PowerUpTime tag + - Added a number of MachO CPUSubtype's and improved handling of 64-bit flag + - Decode ColorData for the Canon EOS 600D and 1100D + - Decode a few new Sony tags + - Set document number for FlashPix tags extracted from embedded documents + - Attempted to patch OS X 10.6 quirk where FileModifyDate may not be preserved + for some files when -P is combined with -overwrite_original_in_place + +Feb. 3, 2011 - Version 8.48 + + - Added a new Canon LensType value + - Changed order of stored information when rewriting existing IPTC tags (to + make the order of items in list-type tags consistent with XMP when deleting + and adding back values in the same command) + - Fixed problems with format of binary data in lists for some output options + +Jan. 29, 2011 - Version 8.47 + + - Added -args option + - Added read support for PGF (Progressive Graphics File) images + - Added write support for Phase One IIQ images + - Added ability to write XMP-xmpMM:Pantry + - Added print conversions for a number of closed-choice XMP properties + - Added some new CanonModelID's + - Included new argument files in distribution: pdf2xmp.args and xmp2pdf.args + - Avoid copying TIFF trailers containing nothing but zeros when rewriting + - Handle binary data in serialized structure output + - Moved BMP tags to the File group + - Fixed bug reading/writing some IPTC binary data tags + - Fixed problem copying XMP:Thumbnails structure + - Fixed conversion of MXF:ByteOrder value + - Fixed potential "Undefined subroutine ConvertStruct" crash bug + - API Changes: + - Fixed bug introduced in 8.46 when calling GetValue(xxx,'Raw') + +Jan. 22, 2011 - Version 8.46 + + - Simplified definition of user-defined XMP structures: flattened tags are now + automatically generated, and UserDefined::xmpStruct is no longer needed (but + backward compatibility is maintained with the old-style definitions) + - Added ability to handle multi-dimensional arrays in structured output + - Added a new Canon LensType (thanks Jean-Michel Dubois) + - Added some new XMP-xmpMM tags + - Enabled writing of a number of XMP-crs tags + - Decode Reconyx TriggerMode tag + - Relaxed structure validation to allow a structure to be written even if + there were errors with some fields + - Patched problem with formatting of very large numbers in JSON (-j) output + - Fixed a few problems reading and writing structured information + - Fixed bug which could cause hang with some user-defined tag definitions + +Jan. 12, 2011 - Version 8.45 + + - Fixed a couple of minor bugs with the new -struct option + +Jan. 12, 2011 - Version 8.44 - "Structured XMP" + + - Added ability to specify XMP structures when writing (yet another Christmas + vacation spent adding a significant new feature to ExifTool) + - Added support for new XMP tags in the MWG 2.0 specification + - Added read support for DV video files + - Added support for Reconyx maker notes + - Added option to overwrite existing text output files (-w!) + - Added ability to ignore symbolic directory links with "-i SYMLINKS" + - Added support for Sony Ericsson XMP cell phone location tags + - Added a few new CanonModelID's + - Added a new Minolta/Sony LensType (thanks Jean-Michel Dubois) + - Added a new Olympus LensType + - Added print conversion for all Bitrate tags + - Decode a couple new RIFF tags + - Decode CameraTemperature for a few new Canon PowerShot models + - Improved -struct option to work with all text output formats + - Changed behaviour of XMP lang-alt lists to conform to the July 2010 + specification (x-default item is no longer mandatory) + - Renamed AudioSampleBits tags to AudioBitsPerSample + - Renamed XMP-crs:Temperature tag to ColorTemperature + - Minor change to behaviour when replacing values in XMP lists: new list + items are now all inserted in place of the first deleted item (previously + new items were inserted one-by-one into the holes left by deleted items) + - Fixed bug writing alternate languages for XMP-iptcExt:ArtworkTitle tag + - Fixed problem where console echo was disabled when using -k option from a + bash script + - Attempted to patch problem of -b option affecting newline sequence for + subsequent -execute commands in Windows + - API Changes: + - SetNewValue() now accepts structured values (as HASH references or + serialized strings) + - Struct option now has 3 settings (undef, 0 and 1) + +Dec. 21, 2010 - Version 8.43 + + - Added read support for MXF (Material Exchange Format) files + - Added support for GE (General Imaging) maker notes + - Added a couple of new Pentax LensType's + - Added a couple of new CanonModelID's + - Added a few more values to Casio UnknownMode + - Recognize 3GPP and 3GP2 file extensions + - Improved handling of character encoding errors + - Changed Duration format to always include hours for times > 1 minute + - Fixed minor quirk in HtmlDump output + - Fixed race condition with -stay_open when reading options requiring + additional arguments from the argfile + +Dec. 11, 2010 - Version 8.42 + + - Added a couple more Samsung LensType values + - Added a few new Canon EasyMode values and a Canon LensType value + - Added a new PentaxModelID + - Decode some new H264 tags (thanks Dave Nicholson) + - Decode JUNK chunk in Pentax RS1000 AVI videos + - Flush console output before "{ready}" message when using -stay_open + - Improved decoding of some Canon and Pentax tags (thanks Dave Nicholson) + - Fixed problem copying makernotes from Nikon NRW image to JPEG + - Fixed incorrect decoding of some AEInfo tags for newer Pentax DSLR's + +Dec. 3, 2010 - Version 8.41 + + - Added a new PentaxModelID + - Added a few new values for some Canon tags + - Added some non-standard values to a few XMP-exif tags + - Decode a new Ricoh tag and added a LensID + - Decode more Pentax K-5 tags and values + - Improved decoding of Battery tags for various Pentax DSLR models + - Fixed bug where time could be wrong by up to 2 seconds when shifting + multiple date/time values containing fractional seconds + +Nov. 21, 2010 - Version 8.40 (production release) + + - Added -restore_original and -delete_original options + - Added new Canon, Pentax and Sony LensType values + - Decode more Pentax K-5 tags + - Decode a number of new tags in Nikon D7000 MOV videos + - Decode FocusDistance tags for the Canon EOS 60D + - Decode a few new Panasonic tags + - Decode a few maker note tags from Flip Video MP4 files + - Extract PDF PageMode and PageLayout tags + - Changed family 2 group names for a number of PDF tags + - Changed Canon LensType strings for a few lenses with updated models + - Patched problem reading GPX files which contain no newlines + +Nov. 12, 2010 - Version 8.39 + + - Added read support for RAR archive files + - Added warning for non-standard XMP APP1 header in JPEG images + - Added a new Canon LensType (thanks Rolando Ruzic) + - Decode more Olympus WAV tags + - Decode a few more PDF document property tags + - Decode a new Canon tag + - Extract firmware revision letter with Nikon FirmwareVersion + - Improved decoding of some Pentax tags + - Changed names of a couple of Pentax tags + - Changed name of ASF:FileSize to FileLength to avoid conflict + - Fixed problem creating output files on network drives in Windows + - Fixed bug where MWG module wasn't loaded automatically when -execute was + used + +Nov. 7, 2010 - Version 8.38 + + - Added support for Nikon D3 firmware 2.02 + - Decode many new Pentax K-5 tags and improved decoding of others + - Decode a few more Nikon D3 and D3S settings (thanks Warren Hatch) + - Decode some new Olympus WAV tags (thanks Tomasz Kawecki) + - Decode a few new Canon DPP 3.9.2 tags + - Decode PDF digital signature permission information + - Improved recognition of Adobe Illustrator PS-format AI files + - Disable writing XMP to Adobe Illustrator version 8 and older EPS files + +Oct. 31, 2010 - Version 8.37 + + - Added ability to switch ARGFILE while -stay_open is active + - Fixed a couple of bugs with the new -stay_open option + - Fixed problem with -E option that caused double-escaping of Composite tags + +Oct. 30, 2010 - Version 8.36 + + - Added ability to read/write metadata in Sigma X3F images containing a + JpgFromRaw (eg. all Sigma models except the SD9 and SD10) + - Added -stay_open option to avoid startup delay when called from other + applications + - Added a new Pentax LensType (thanks Hubert Meier) + - Decode a couple of new tags written by Sigma Photo Pro + - Changed family 0 group name for SonyIDC tags to "MakerNotes" + - Improved Composite:LensID to use LensModel if available when LensType is + "Unknown" + - Fixed problem extracting ThumbnailImage from some FujiFilm RAF images + - Fixed problem calculating Red/BlueBalance for some newer Nikon models + +Oct. 23, 2010 - Version 8.35 - "PDF Encryption" + + - Added support for PDF AES-128 and AES-256 encryption (requires Digest::SHA + for AES-256 support) + - Added -password option for processing password-protected PDF documents + - Added write support for a couple more FujiFilm RAF versions + - Added a number of new Olympus SceneMode values + - Added a few new SonyModelID's + - Added a new Nikon LensID (thanks marten) + - Added a Canon LensType and fixed an incorrect one (thanks Andreas Huggel) + - Decode a number of new Canon tags + - Decode a few new Nikon D3S settings (thanks Warren Hatch) + - Extract PDF UserAccess + - Extract Olympus ZoomedPreviewImage + - Updated decoding of Olympus AFPoint for recent E-models + - Avoid writing mandatory IPTC tags unless another IPTC tag actually changes + (eg. trying to delete a non-existent IPTC tag will no longer have the side + effect of generating mandatory IPTC tags) + - Improved language translations + - Improved error message when trying to write a file with the wrong extension + - Renamed a couple of Olympus tags + - Fixed problem reading/writing PDF tags from some encrypted stream objects + - API Changes: + - Added Password option + +Oct. 7, 2010 - Version 8.34 + + - Added read support for XCF and WebP images and WebM videos + - Added a couple of new PentaxModelID's + - Decode a number of new Canon 60D MakerNotes tags (thanks Bogdan for + LensSerialNumber) + - Decode FrameCount from MakerNotes in Nikon MOV videos + - Decode Ambience and some video tags from Canon + - Decode more Canon EOS 1D Mark IV CameraInfo tags + - Updated decoding of Pentax HighISONoiseReduction for newer models + - Changed description of Canon SerialNumber tags + - Fixed problem with extra comma in JSON output when -w option was used + +Oct. 3, 2010 - Version 8.33 + + - Added ability to specify numerator and denominator of rational values + - Decode more Canon custom picture style settings (thanks Tom Kawecki) + - Decode Samsung MP4 "TAGS" information from WP10 videos + - Decode thumbnail image and maker notes from Canon S95 MOV videos + - Decode Microsoft Photo 1.1 EXIF and XMP information + - Fixed problem copying tags dynamically from files with read errors + - Fixed problem setting FileName with a Windows UNC path (leading "\\") + +Sept. 25, 2010 - Version 8.32 + + - Added the ability to use wildcards ('?' and '*') in tag names when + extracting or copying information + - Added a number of new CanonModelID's + - Decode a few more QuickTime tags and improved decoding of others + - Decode UserDefPictureStyle tags for more Canon cameras (thanks Tom Kawecki) + - Extract unknown text-based maker notes under new MakerNoteUnknownText tag + - Tested writing of PDF 1.7 files and removed warning for this version + - Identify Canon MakerNote footer in HtmlDump of DNG images + - Updated MimeType for PSD, AVI, AIFF plus a number of raw file formats + - Changed FileType for Adobe Illustrator (AI) files + - Fixed "Can't handle XMP attribute 'rdf:xmlns'" error when writing some XMP + +Sept. 17, 2010 - Version 8.31 - "CRW+XMP" + + - Added ability to read/write XMP inside CanonVRD, which finally provides a + technique to write XMP in CRW images! (thanks Mike Kobzar for help testing) + - Added a couple of new Canon LensType's and CanonModelID's + - Added a number of new Nikon LensID's (thanks Robert Rottmerhusen) + - Added a new Sony LensType (thanks Mladen Sever) + - Treat 'eng' as a default language in ID3v2 information + - Recognize AIT file extension (AI file) + - Fixed problem where ExifTool could refuse to write PDF files containing + XMP-pdf:PDFVersion information + +Sept. 11, 2010 - Version 8.30 + + - Added a couple of new Nikon LensID's (thanks Robert Rottmerhusen) + - Added a couple more Sigma LensType values + - Added a few more tag values for the new Sony SLT-A33, SLT-A55V and DSLR-A560 + - Added a few more values for various Casio tags + - Added a new Canon LensType (thanks Guido) + - Decode Panasonic ContrastMode for the TZ10/ZS7 + - Decode some Canon CameraInfo tags for the 60D + - Updated Canon custom functions for the 60D + - Updated Flash video to add some new values and decode some new tags + - Updated QuickTime decoding for new track and movie header formats + - Named a couple of unknown Canon tags + - Made Nikon PictureControl and NikonCaptureOutput directories block writable + - Fixed problem geotagging when any coordinate was exactly zero + - Fixed typo in Canon AFAssistBeam converted value + - Fixed problem displaying exiftool documentation on OS/2 (thanks Ilya + Zakharevich) + +Aug. 22, 2010 - Version 8.29 + + - Added a few new CanonModelID's + - Added verbose messages for "unsafe" and "protected" tags which are not + copied + - Decode CameraTemperature for a few new Canon models + - Decode a few new Panasonic tags (thanks Zdenek Mihula) + - Decode a number of new 3rd party RIFF tags + - Recognize Casio-type maker notes in Concord cameras + - Handle "CDATA" sections in XML/XMP + - Fixed problem that could cause value to be added twice when writing MWG + list-type tags without specifying a group + - Fixed bug extracting altitude from GPX files containing "rtept" nodes which + could result in an altitude being associated with the next GPS fix + - Fixed problem deleting PreviewImage from MIE files + +Aug. 14, 2010 - Version 8.28 + + - Added ability to specify Photoshop encoding (-charset Photoshop=CHARSET) + - Added support for maker notes of some Sony Ericsson phones + - Improved conversion for SigmaRaw:FocalLengthIn35mmFormat (thanks Niels + Kristian Bech Jensen) + - Fixed bug in calculation of AvgBitrate for QuickTime videos (thanks Mats + Peterson) + - Improved error handling when reading Matroska files + - Fixed -GROUP:geotag= to allow multiple geotag groups to be deleted + separately + +July 31, 2010 - Version 8.27 + + - Added support for QuickTime localized languages and character encodings + - Added support for alternate language ICC_Profile tags + - Added a new XMP-swf tag + - Added a new Sony LensType (thanks Mladen Sever) + - Added ability to specify any group (not only family 0 and 1) for source tag + when copying + - Decode a number of new QuickTime tags + - Decode MakerNoteKodak9 maker notes in a few non-Kodak cameras + - Extract NikonCaptureHistory and drop when copying Nikon MakerNotes + - Calculate AvgBitrate for QuickTime movies + - Fixed names of a few recently added ICC_Profile tags (thanks Jeff Harmon) + - Fixed bug calculating duration of AVI videos for which FrameCount is zero + - Fixed tag ID for XMP-iptcExt:AdditionalModelInformation + - Fixed decoding of ShiftJIS character set + +July 20, 2010 - Version 8.26 + + - Decode a number of new ICC_Profile tags added in approved revisions to the + specification + - Drop NikonCaptureData when copying Nikon MakerNotes (it may be too large for + a JPEG APP1 segment when copying from an NEF image) + - Made NikonCaptureData writable as a block and NikonCapture a deletable group + - Minor addition to tooltip for HtmlDump of offset values + - Fixed problem writing to an incorrectly-typed XMP list (patch for LR3 bug) + - Fixed problem setting file ownership on OS/2 systems when writing (thanks + Ilya Zakharevich) + - Fixed incorrect ICC_Profile tag name (thanks Jeff Harmon) + +July 13, 2010 - Version 8.25 (production release) + + - Added CommonIFD0 shortcut tag to help when deleting metata from TIFF images + - Added a new Pentax LensType and fixed an incorrect one + - Added a new Panasonic ColorMode + - Decode FLAC picture metadata + - Changed ASF Preview tags to be consistent with ID3 and FLAC Picture tags + - Patched problem with funny dash character in cut-n-paste from documentation + on some systems (by allowing the funny dash in command-line arguments) + - Fixed misleading warning message which could appear when writing MWG tags + - Fixed typo in an ID3 tag name (thanks Mats Peterson) + - Fixed an incorrect Sony lens name (thanks Stephen Bishop) + - Fixed problem misidentifying some other RAW files as Epson ERF + +June 30, 2010 - Version 8.24 + + - Added ability to write some Kodak APP3 Meta tags + - Added a few new Olympus LensType's and new values for a couple of other tags + - Added support for yet another Kodak MakerNote variation (M580) + - Added conversion for OOXML DocSecurity tag (thanks Jeff Harmon) + - Added another Nikon ExternalFlashFlags value (thanks Warren Hatch) + - Decode more Canon VRD tags (thanks Gert Kello) and changed some tag names + - Decode a couple of new Canon 7D tags (thanks Vesa Kivisto) + - Decode a few more Sigma tags + - Decode HTML tags written by Microsoft Office + - Decode some MakerNotes tags from Samsung MP4 videos + - Allow RFC 8601 date/time values to be written without seconds + - Fixed conversion for Kodak Meta:SerialNumber + - Changed conversion of Canon FocusDistanceUpper/Lower tags to add units (m) + - Changed the names of some Nikon FlashExposureComp tags + - Changed name of RTF CharactersNoWhiteSpace tag to CharactersWithSpaces to + conform with what Microsoft does with their software as opposed to what they + say in their RTF specification + - Changed a few FlashPix tags for better consistency with OOXML and RTF + - Properly convert OOXML Unicode character entities + - Fixed problem writing some Sigma MakerNote tags + - Fixed problem writing incorrect value for "Uncalibrated" XMP:ColorSpace + - Fixed bug where some unknown Canon values were extracted twice with -U + +June 20, 2010 - Version 8.23 + + - Added write support for FujiFilm RAF images from the HS10 and S100FS + - Added read support for RTF files + - Added read support for FPXR in JPEG APP4 as written by some HP cameras + - Added ability to copy files of any type (now does a straight copy instead of + processing the file if no new values are set for any "real" tag) + - Added new values for CanonModelID, PentaxModelID and SonyModelID + - Added a new Ricoh LensID + - Added conversion for "Off" and "On" values when writing EXIF:Flash + - Added a new Canon LensType and changed the name of one Sigma lens + - Decode more Canon VRD tags and update to DPP 3.8 (thanks Gert Kello) + - Decode FujiFilm AutoDynamicRange + - Changed some DNG tags to make them writable (but "unsafe") + +June 9, 2010 - Version 8.22 + + - Implemented PNG alternate language tags and special character translations + - Added print conversion for XMP-photoshop:ColorMode + - Decode some new Pentax 645D tags/values and added more PentaxModelID's + - Changed family 1 group names for Matroska Chapters + - Changed frame rate conversions to round to 3 decimal points + - Enable summary messages when -b is combined with -w + - Assume local system timezone on specified date (instead of current local + timezone) when writing an IPTC time tag with a date/time value which doesn't + include a timezone + - Fixed conversion of Matroska:ChapterTimeStart/End values + - Fixed an incorrect Panasonic Lens name (thanks Michael Byczkowski) + +June 2, 2010 - Version 8.21 + + - Added read support for Matroska multimedia files (MKA, MKV and MKS) + - Added a new PentaxModelID (Optio E80) + - Decode some information from Casio EX-7000SX APP1 "QVCI", HP Photosmart + R837 APP6 "TDHD" JPEG segments + - Extract more Samsung and HP PreviewImages hidden in other JPEG APP segments + - Extract unknown tags with numerical ID's by default when -v option is used + - Updated default GPSVersionID to 2.3.0.0 when writing + - Fixed bug geotagging from KML file (lat/long were swapped) + +May 26, 2010 - Version 8.20 - "Exif 2.3" + + - Added read support for Open Document files (ODP, ODS, ODT) + - Added Composite:AudioBitrate tag for VBR MPEG audio + - Added support for IPTC:CatalogSets written by iView MediaPro + - Decode Olympus MagicFilter tag and add a two new SceneMode values + - Decode a few new Sony tags written by NEX models + - Decode a number of new Sony A100 tags (thanks Igal Milchtaich) + - Decode some information from MPEG audio LAME header + - Updated to Exif 2.3 specification (!!) + - Allow date/time tags to be shifted by the values of other tags when using + the -tagsFromFile feature + - Fixed formatting of QuickTime:CreateDate as written by iPhone + - Fixed problem conditionally replacing some blank EXIF tags and alternate + language tags in XMP + +May 11, 2010 - Version 8.19 + + - Added ability to read/write Samsung PreviewImage trailer + - Added two new PentaxModelID's (Optio H90 and W90) + - Added a new Canon LensType + - Added a new CanonModelID + - Decode more Sony tags/values (thanks Michael Reitinger) + - Decode more Leica M9 tags (thanks Michael Byczkowski and Carl Bretteville) + - Updated to XMP April 2010 specification + - Avoid extracting Sony DSLR-A100 tags which have "n/a" values + - Improved German language translations (thanks Herbert Kauer) + - Improved efficiency of Composite tag calculations + - Made RSRC a deletable group + - Tolerate extra white space at the start of an XMP file + - Changed MWG logic to ignore blank EXIF tags + - Changed a few print conversion strings to improve interoperability + - Changed XMP namespace prefix 'prismusagerights' to 'pur' as per most recent + PRISM specification + - Patched memory problem in Windows when processing very large EPS files + - Fixed a couple of incorrectly named Sony Panorama tags + - Fixed bug which could prevent file from being updated when deleting + mandatory tags and adding back tags in other locations + +Apr. 16, 2010 - Version 8.18 + + - Added read support for Sony DSC-F1 PMP images + - Added a new Nikon LensID (thanks Jeffrey Friedl) + - Decode a number of new Sony tags (thanks Michael Reitinger) + - Decode a few more Leica M9 tags (thanks Michael Byczkowski) + - Preserve original file permissions and ownership when writing + - Made Canon DustRemovalData writable + - Changed some Pentax WhiteBalance strings for consistency + - Patched potential security problem when writing values + - Fixed bug extracting unsynchronized ID3v2.4 information + +Apr. 9, 2010 - Version 8.17 + + - Added a new Sony ExposureMode (thanks Michael Reitinger) + - Decode Casio DriveMode (thanks Robert Chi) + - Decode CameraTemperature for more Canon EOS models (thanks Vesa Kivisto) + - Updated to the DICOM 2009 specification (Note: Changed some DICOM tag names) + - Improved conversions for XMP:LensInfo, EXIF:DNGLensInfo and Nikon:Lens + - Changed case of some Canon DriveMode strings + - Fixed divide-by-zero error when Geotagging from a track with only one point + - Fixed incorrect ImageHeight reported for top-to-bottom BMP images + - API Changes: + - Fixed a problem passing options to Image::ExifTool::TagInfoXML::Write() + +Mar. 31, 2010 - Version 8.16 + + - Preserve Mac OS resource fork when writing (OS X only) + - Added a number of new Nikon LensID's (thanks Robert Rottmerhusen) + - Decode a couple more Mac OS resources + - Decode Olympus LensModel tag (thanks Martin Hilbers) + - Extract PrintIMVersion tag from PrintIM information + - Separate extraction of Leica FrameSelector information from LensType tag + - Recognize Bitstream PFA/PFB font files + - Patched ActivePerl 5.10 bug which could cause Perl crash during Geotag tests + - Fixed another Geotag test that fails due to round-off errors on some systems + +Mar. 18, 2010 - Version 8.15 (production release) + + - Added read support for Macintosh resource files: + - Generate ResourceForkSize tag if data exists in a file's resource fork + - Enhanced -ee option to process resource fork as a sub-document + - Added a new PentaxModelID (Optio I-10) + - Decode Panasonic DMC-ZS7 landmark tags + - Fixed decoding of Pentax Optio 555 PictureMode and added a number of new + values (thanks Ralf Medow) + +Mar. 16, 2010 - Version 8.14 + + - Added some new Canon AFMode values for the EOS 7D (thanks Dieter Steiner) + and renamed tag to AFAreaMode + - Decode ColorData and some new MOV tags for the production Canon EOS 550D + - Decode Panasonic IntelligentResolution tag + - Allow times with timezones in GPX track logs + - Improved handling of maker notes in Olympus MP4 videos + - Changed H264 GPS tags to the GPS group + - Fixed date/time format error in reverse geotagging GPX example + - Fixed problem introduced in version 8.09 where XMP:GPSLatitude/GPSLongitude + require the -a option to be extracted + - API Changes: + - Fixed bug where some options (Charset, Escape, Exclude and Lang) weren't + activated properly when set via options hash in calls to some functions + - Fixed some potential problems when used with mod_perl + +Mar. 5, 2010 - Version 8.13 + + - Added read/write support for Samsung SRW images and decode some NX10 maker + note tags (thanks Tae-Sun Park) + - Added new values for some Sony tags (thanks Michael Reitinger) + - Added a new Canon LensType + - Decode maker notes in Nikon Coolpix S8000 MOV videos + - Decode a number of obscure TIFF FX tags + - Implemented list-type behaviour for MWG:Creator tag + - More improvements to German translations (thanks Herbert Kauer) + - Changed name of NikonPreview group to PreviewIFD + - Fixed problem which prevented ThumbnailImage from being written to ARW, SR2 + and PEF images + +Feb. 26, 2010 - Version 8.12 + + - Added a number of missing ProgramMode values for the Sony DSLR-A330 + - Added XMP-iptcCore:DigitalSourceType (IPTC Extension version 1.1) + - Added a couple more Nikon LensID's (thanks Jens Kriese and Robert + Rottmerhusen) + - Improved German language tag descriptions (thanks Herbert Kauer) + - Improved identification of some RAW file types + - Moved MPF PreviewImage into the Composite group + - Fixed some problems in HtmlDump output + - Fixed problem copying makernotes as a block into DNGAdobeData + +Feb. 20, 2010 - Version 8.11 + + - Added support for Leica S2 maker notes + - Added a bunch of new CanonModelID's + - Decode MacroMagnification for more Canon models (MP-E 65mm only) + - Decode a number of Canon CameraInfo tags for the 1DmkIV and 550D + - Updated CanonCustom tags for the 550D + - Improved parsing of Canon OriginalDecisionData + - Improved decoding of Canon CameraInfo LensType + - Improved decoding of some Sigma tags + - Recognize a number of new Paint Shop Pro file extensions + - Prevent a directory from being recreated in the wrong location when deleting + a group and adding back information in the same step + - Changed -fileOrder option to sort numbers numerically + - Fixed bug in -fileOrder option when directory names are specified + - Fixed problem extracting information from some Panasonic AVCHD videos + - Fixed some minor compatibility problems with Perl 5.11 + - Fixed problem which could result in runtime error when using MWG feature + - Fixed an inconsistency in the way duplicate tags were handled in the grouped + JSON (-j -g) and short XML (-X -s) output formats + +Feb. 8, 2010 - Version 8.10 (production release) + + - Added read/write support for Photoshop PSB file format + - Added -fileOrder option to provide control over file processing order + - Added a few new Sony/Minolta LensTypes (thanks Marcin Krol) + - Added more Nikon LensID's (thanks Robert Rottmerhusen) + - Decode metadata from all frames in AVCHD H.264 video with -ee option + - Decode more H.264 tags and improved decoding of others + - Improved decoding of some Olympus E-P1 tags + - Improved handling of some types of unknown maker notes + - Enhanced -p option to support output file headers and footers, and to parse + embedded documents as separate input files when combined with -ee + - Relaxed validation of PFM files to accommodate incorrect device type string + written by FontForge software + - API Changes: + - Enhanced GetFileType() to return descriptions for more file types + +Jan. 29, 2010 - Version 8.09 + + - Added a number of new Nikon LensID's (thanks Robert Rottmerhusen) + - Decode GPS position and some camera settings from AVCHD (.M2TS) video + - Decode a few new PhotoMechanic tags + - Decode MacroMagnification for the Canon MP-E 65mm f/2.8 1-5x Macro Photo + lens in EOS 5DmkII and 40D images + - Delete multiple Photoshop segments in JPEG images when deleting all + Photoshop information and adding some back in one step + - Print warning message in Windows when there are no matching files to process + - Changed print conversion for PSP CreatorAppVersion + - Fixed problem rewriting NikonCapture information written by NX2 + +Jan. 25, 2010 - Version 8.08 + + - Added read support for Paint Shop Pro images (PSP and PSPIMAGE) + - Added ability to decode a number of new character sets including JIS, and + completely overhauled character encoding routines + - Fixed problem reading old OS/2-format BMP images + +Jan. 19, 2010 - Version 8.07 + + - Added read support for a number of font file formats (OTF, TTF, TTC, PFA, + PFB, PFM, DFONT, AFM, ACFM and AMFM) + - Added (experimental) read support for FLA files + - Added a few new Sony LensType's (thanks Sander Stols) + - Added a new Canon LensType (thanks Mark Berger) + - Set BigTIFF MIME type to "image/x-tiff-big" (unofficial) + - Fixed bug in GPS time drift correction when dates are specified for both GPS + and image times + - Fixed problem reading some IGC GPS logs + +Jan. 12, 2010 - Version 8.06 + + - Added a few new CanonModelID's + - Fixed a bug introduced in 8.05 which broke rewriting of XMP in MWG mode + +Jan. 10, 2010 - Version 8.05 - "Strict MWG" + + - Improved MWG conformance by ignoring non-standard EXIF, IPTC and XMP when + the MWG module is loaded + - CurrentIPTCDigest tag is now only generated for IPTC in the standard + location (as specified by the MWG recommendation) + - Added support for 3rd party trailers on ARW images + - Changed names of Sony IDC date/time tags and decode the last unknown IDC tag + - Fixed "-TAG-= -TAG=VALUE" syntax to work with shiftable (date/time) tags + and tags with conversions + - Fixed incorrect tag format when writing some PhotoMechanic tags + - Fixed problem where some tags couldn't be written in Olympus ORF images + +Jan. 7, 2010 - Version 8.04 - "Write ARW" + + - Added write support for Sony ARW and SR2 images (at long last!) + - WARNING: Some Adobe utilities (Photoshop Camera Raw 5.6, DNG Converter + 5.6, LightRoom 2.6) have a bug which causes the tone curve to be + incorrect for edited ARW images from some Sony cameras (A500, A550, + A700, A850, A900 and maybe others) + - Compatibility Notice: Embedded JPEG in ARW and SR2 images is now extracted + as PreviewImage instead of JpgFromRaw + - Added read/write support for Sony IDC tags + - Added support for Leica X1 maker notes and decode a few tags + - Added support for DigiKam XMP schema + - Added a new Minolta/Sony LensType (thanks Jean-Michel Dubois) + - Decode Nikon D90 AFAreaModeSetting + - Decode Nikon NEFBitDepth (thanks Warren Hatch) + - Decode a few new Sony SRF, Casio AVI and MSOffice TIFF tags + - Enhanced Geosync tag to allow GPS time-drift correction + - Fixed Nikon D3 FlashSyncSpeed values (thanks Warren Hatch) + +Dec. 19, 2009 - Version 8.03 + + - Added a new Nikon ExternalFlashFlags value (thanks Warren Hatch) + - Implemented -charset id3=CHARSET option in Windows version too (oops!) + - Improved heuristic for guessing EXIF "Unicode" string byte order + - Improved decoding of some obscure QuickTime tags + - Renamed Casio SelfTimer tag to ReleaseMode and added new values + - Fixed problem converting numerical M4P Genre values + +Dec. 15, 2009 - Version 8.02 + + - Added MIME types for Apple iWork file formats + - Added bitmask to -v2 output for applicable tags + - Added a new Canon LensType and fixed an incorrect one (thanks Hugh + Griffiths) + - Added a few new Ricoh Saturation values (written by GXR) + - Added ability to specify character set for ID3v1 information + - Added French translations for some Nikon tags (thanks Harry Nizard) + - Extract FilePermissions information + - Decode Nikon D90 custom settings + - Decode a few more Nikon tags and removed AutoBracketRelease (thanks Warren + Hatch) + - Decode a few more GIF tags (and changed groups of some others) + - Decode some information from JPEG APP4 "SCALADO" segment + - Updated DICOM decoding to latest (2008) specification + - Enhanced -fast option to allow MakerNote information to be skipped + - Changed -v0 to enable output autoflushing for STDERR as well as STDOUT + - Improved decoding of some QuickTime tags (fixes M4P Genre problem) + - API Changes: + - Added CharsetID3 option + - Changed name of IPTCCharset option to CharsetIPTC (but IPTCCharset may + still be used for backward compatibility) + +Dec. 1, 2009 - Version 8.01 + + - Compatibility Notice: Extract full-sized preview from X3F images as + JpgFromRaw instead of PreviewImage + - Added support for the new X3F version 2.3 files written by the Sigma DP2 + - Added support for a few more XMP-acdsee tags + - Decode Nikon D3 custom settings (thanks Warren Hatch) and extrapolate to + D3S, D3X and D300S + - Decode the few remaining Nikon D300 custom settings (thanks Stuart Solomon + for providing sample images) + - Decode Nikon D5000 custom settings + - Decode Nikon FlashColorFilter tag (thanks Warren Hatch) + - Decode a few more PNG tags + - Created a new family 1 group for Nikon custom settings + - Improved write conversions for EXIF Contrast, Saturation and Sharpness + - Fixed problem with %f and %e when the source file has no extension + - Fixed problem decoding Nikon D3 flash group B and C intensities + - Fixed missing MIME type for XLT files + +Nov. 20, 2009 - Version 8.00 (production release) + + - Added read support for Apple iWork '09 files (Keynote, Pages and Numbers) + - Added ability to write Nikon SerialNumber and ShutterCount tags + - Added a few new Nikon LensID's and changed Tamron lens names to include + model number (thanks Robert Rottmerhusen) + - Decode a number of new Nikon tags (thanks Warren Hatch for much of this) + - Decode a few new Sony tags and improved others (thanks Igal Milchtaich) + - Decode a few new Ricoh tags, renamed RicohDateTime1/2, Revision and + MakerNoteVersion tags, and added some print conversions + - Decode Parallax in FujiFilm MPO MPImage2 images (thanks John Goodman) + - Decode Canon EOS 1D Mark IV custom functions + - Decode a number of new tags in MPEG-4 videos + - Decode a large number of private GE DICOM tags + - Decode a few more tags in AVI videos and attempt to fix problem calculating + duration when multiple video streams exist + - Enhanced -ee option to extract information from embedded MPF images + - Improved Nikon LensID conversion to recognize user-defined lenses + - Improved decoding of a few Olympus tags (ArtFilter, FaceDetect and + FocusProcess) + - Improved handling of warnings when processing corrupted ZIP files + - Improved recognition of Canon teleconverters in Composite LensID tag + - Added patch for Leica M8 bug which writes incorrect format for EXIF + ExposureCompensation and ShutterSpeedValue + - Changed prefix of unknown Leica M9 tags from LeicaSubdir to Leica_Subdir + - Fixed problem writing encrypted Nikon WB Levels + - Fixed problems reading PDF tags written by OS X 10.6 utilities + - Fixed problem where the -charset option didn't work properly for some XML + character entities when reading XMP + +Nov. 6, 2009 - Version 7.99 + + - Added read support for Office Open XML files and improved recognition of + many MS Office file types + - Added read support for Phase One IIQ and Capture One COS and EIP files + - Added read support for GZIP information (first archived file only) + - Added a new Canon LensType (thanks Karsten Sote) + - Added a new Nikon LensID (thanks Geert De Soete) + - Decode a few new Sony tags + - Decode MakerNotes in Pentax AVI videos + - Decode SerialNumber for newer Pentax cameras + - Decode Canon FlashMeteringMode for most EOS models + - Disabled some Sony A230 CameraInfo tags which weren't valid for this model + - Give names to a number of unknown QuickTime atoms + - Recognize VOB file extension (but audio information in MPEG private stream + is not yet decoded) + - Tolerate extra white space in GPX attributes when geotagging (fixes problem + reading GlobalSat GPX files) + - Minor improvements to FlashPix decoding + - Changed names of all ZIP tags to avoid name conflicts with other tags + - Changed Composite ImageSize to use ExifImageWidth/Height for CR2 images + - Changed names of QuickTime image and video track description + ImageWidth/Height tags to SourceImageWidth/Height + - Fixed problems when -if option was combined with -v or -htmlDump + - Fixed problem parsing NMEA track logs where coordinates have the wrong + number of digits due to missing leading zeros (Holux M-241) + - Fixed an incorrect Pentax LensType + +Oct. 28, 2009 - Version 7.98 + + - Implemented MWG support via a plug-in module ("-use MWG") + - Added -config and -use options + - Added ability to read Sony Vegas tags in AVI videos + - Added a couple of new Canon LensType's + - Added a new Panasonic ShootingMode (thanks Joerg) + - Added a new PentaxModelID (Optio P80) + - Added a new CanonModelID + - Added a few new Canon 1D Mark IV custom functions values + - Added warning for superfluous tag names on the command line when writing + - Decode a few more tags for the Canon EOS 5D and 7D + - Decode a number of new tags in Quicktime-based files (including MP4 and JP2) + - Impose length limit on IPTC values when writing as per spec. (for backward + compatibility, the length check may be disabled with the -m option) + - Improved checks for invalid EXIF offsets and changed some warning messages + - Improved decoding for a few Canon tags (and renamed NoiseReduction tag) + - Improved date/time formatting to accept date-only values + - Implemented print conversion for ID3 date/time tags + - Enhanced writing of Photoshop:IPTCDigest to allow a special value of 'old' + to represent the digest of the IPTC from the original file + - Updated iptc2xmp.args and xmp2iptc.args to handle IPTC + DigitalCreationDate/Time + - Recognize a number of Sigma LensType's in X3F images + - Recognize a large number of additional audio/video file extensions + - Minor improvements to -htmldump output + - Minor changes to some application warning messages + - Fixed problem writing Canon CameraTemperature tags + - Fixed "Error reading Info object" warning when reading a PDF file after + deleting all PDF tags + - API Changes: + - Added ability to specify config file via $Image::ExifTool::configFile + - Added EditGroup option for SetNewValue() + +Oct. 13, 2009 - Version 7.97 + + - Added ability to disable print conversion on a per-tag basis by suffixing + the tag name with a '#' character + - Added a new PentaxModelID (Optio WS80) + - Decode a few more Sony tags + - Decode a number of new Casio tags and values + - Decode CameraTemperature for Canon PowerShot models (thanks Vesa Kivisto) + - Improved warning messages for the -ext option + - Improved DOF calculation to use ObjectDistance if SubjectDistance and + FocusDistance are not available + - Improved -X output to support more of the new -charset encodings + - Made Composite:FileNumber writable + - Use more detailed makernote directory names in EXIF warning messages + - Decreased priority of tags in IFD1 of JPEG images to avoid taking precedence + over tags from IFD0 or ExifIFD + - Changed print conversion strings for TIFF SampleFormat tag + - Renamed Casio ObjectDistance tag to FocusDistance + - Fixed invalid character in a Minolta/Sony LensType string + - Fixed bug decoding NITFVersion tag + - Fixed bug where binary data was returned without the -b option when using an + expression involving tag names for some tags such as ThumbnailImage + - Fixed two problems which could result in runtime warnings when: + - reading truncated ICC_Profile information + - using -htmldump on an image containing invalid EXIF offsets + - API Changes: + - Added ability to disable print conversion by suffixing tag name with '#' + - Changed name of BigTIFF 'ifd8' format to 'ifd64' for consistency + +Oct. 2, 2009 - Version 7.96 + + - Added new Geosync tag to allow geotagging of images with timestamps which + are not pre-synchronized to GPS time + - Added patch to avoid crash bug in Canon DPP software when OwnerName is set + to a value that is exactly 3 characters long (doh!) + - Added a few new Olympus LensType's (thanks Godfrey DiGiorgi) + - Added a couple more Nikon LensID's (thanks Robert Rottmerhusen) + - Added minor warning when fixing invalid counts in Kodak MakerNotes + - Decode a few new tags and values for the Panasonic GF1 + - Improved parsing of command-line arguments to remove order dependencies of + certain options + - Minor improvement to decoding of Olympus FaceDetect tag + - Changed "Error reading PreviewImage from file" to a minor warning + - Changed conversion of Canon MeasuredEV to correspond more closely to + LightValue (by adding 5 to the MeasuredEV value, which seems to be good for + all EOS models, but it may be high by up to 1 EV for some PowerShot models) + - Fixed problems decoding some CameraInfo tags for the Canon 7D with the new + production firmware (1.0.7) + - Fixed problems writing some CameraInfo tags for the Canon 50D and 5DmkII + +Sept. 24, 2009 - Version 7.95 + + - Added read support for LNK (Windows shortcut) file metadata + - Added patch to fix incorrect count written by a number of recent Kodak + cameras to some tags in SubIFD3 of the MakerNotes + - Added a few more Sony/Minolta LensType's + - Added a couple more Canon LensType's (thanks Norbert Wasser) + - Added a PentaxModelID for the new K-x + - Decode a couple more Canon VignettingCorr tags + - Improved Canon FocusDistance conversions to indicate "inf" for maximum value + - Improved DOF calculation to use SubjectDistance if FocusDistance is not + available + - Changed -fast, -scanForXMP and -unknown options to also apply when copying + tags with -tagsFromFile + +Sept. 11, 2009 - Version 7.94 + + - Added support for Leica M9 makernote format and decode a few new tags + - Added a few new Leica LensType's + - Added support for IGC GPS track logs (thanks Lionel Genet) + - Added a number of alternate Macintosh character sets and changed a couple of + character set names for -charset option + - Decode even more Sony A100 tags (thanks Igal Milchtaich!) + - Improved handling of FlashPix character translations + - Changed a couple of Sony and Minolta AF tag names to be more consistent + +Sept. 5, 2009 - Version 7.93 + + - Added a new CanonModelID + - Added a couple of new Nikon LensType's (thanks Robert Rottmerhusen) + - Added a few new Pentax LensType's + - Decode a number of new tags for the Canon EOS 7D + - Calculate Duration for WAV audio files + - Allow exponents when writing GPS coordinates (eg. "-gpslatitude=7.657e+01") + - Print available character sets if no CHARSET is given for -charset option + - Improved -v3 and -htmldump output to show MPF image data + - Fixed -E option to work with tag descriptions when -lang option used + - Fixed problem reading large FlashPix-format documents + - API Changes: + - Added LargeFileSupport option + +Aug. 29, 2009 - Version 7.92 + + - Fixed new "-charset iptc=CHARSET" feature to work with -tagsFromFile + +Aug. 29, 2009 - Version 7.91 + + - Added -charset option and support for additional Windows and Mac character + sets. Character sets now supported are: UTF-8, Latin1, Latin2, Cyrillic, + Greek, Turkish, Hebrew, Arabic, Baltic, Vietnam, Thai and MacRoman + - Fixed problem with some duplicate Nikon LensID's + - Fixed incorrect Duration calculation for multi-channel FLAC audio files + - Compatibility Notice: Removed "CreatorContactInfo" shortcuts which were + added to ease the transition when some Iptc4xmpCore tag names were changed + in version 7.45 + - API Changes: + - Added IPTCCharset option and support for additional character sets + +Aug. 24, 2009 - Version 7.90 + + - Added -ex (-escapeXML) option + - Added a few more Minolta M42-type lenses (thanks Lukasz Stelmach) + - Added a number of new CanonModelID's + - Decode more Sony A100 tags (thanks Igal Milchtaich) + - Decode a few more Kodak WhiteBalance tags + - Decode a couple more JPEG APP segments + - Internal changes to Composite tag calculation algorithm + - Patched problem with renaming files on OS/2 that caused failed tests + +Aug. 18, 2009 - Version 7.89 (production release) + + - IMPORTANT: Not quite done with NRW fixes -- fixed similar bug which could + corrupt NRW images when writing new values larger than 10 MB + +Aug. 17, 2009 - Version 7.88 (production release) + + - IMPORTANT: Fixed bug introduced in version 7.77 which causes Nikon NRW + images to be corrupted when writing + - Decode a number of Sony A100 Camera Settings tags (thanks Igal Milchtaich) + - Improved accuracy of some CameraInfo values for Canon PowerShot models + - Tolerate blank lines in PDF xref tables + - Fixed problem where -E didn't escape values when copying with -tagsFromFile + - Fixed bug identifying AF Micro-Nikkor 105mm f/2.8D lens + +Aug. 14, 2009 - Version 7.87 + + - Added a new Sony lens (thanks Lukasz Stelmach) + - Added a few new Pentax City and PictureMode values (thanks Niels Kristian + Bech Jensen) + - Added lookup for XMP-photoshop:Urgency + - Added a few new Nikon RetouchHistory values + - Decode a number of new Sony tags for the A700 (thanks Rudiger Lange) + - Decode Canon PeripheralLighting tags + - Decode Olympus AFFineTuneAdj (thanks Yrjo Rauste) + - Extract System tags from unknown file types + - Enhanced -E option to work when writing, and when used in combination with + other options such as -p + - Tolerate white space around "=" in XMP attributes (allowed by XML spec) + - Improved error handling when parsing bad EXIF IFD entries + - API Changes: + - Added Escape option + +July 25, 2009 - Version 7.86 + + - Added support for reading Garmin TCX track logs with the -geotag option + - Added a number of new Canon, Olympus and Pentax LensType's + - Enabled writing of .AI (Adobe Illustrator) files + - Minor changes to DICOM decoding + +July 21, 2009 - Version 7.85 + + - Added a new Sony LensType + - Added a new Pentax LensType (thanks Albert Bogner) + - Added a new PentaxModelID value (Optio W80) + - Added a few new JPEGDigest values (thanks Franz Buchinger) + - Added check for proper support of IFD-format value types + - Decode Nikon D300 firmware 1.10 camera settings (thanks Stuart Solomon) + - Improved handling of Olympus makernotes for recent models and fixed error + messages resulting from makernote format changes in Stylus 550WP images + - Improved geotagging by allowing different NMEA sentences with slightly + different timestamps (within 10 seconds) in the same fix + - Fixed decoding of some CameraSettings tags for the new Sony A330 and A380 + - API Changes: + - Added GeoMinSats option + +July 16, 2009 - Version 7.84 (Windows only) + + - Fixed bug in -geotag option of Windows version when using wildcards in the + GPS track filename + +July 13, 2009 - Version 7.83 + + - Added preliminary read support for M2TS/AVCHD video files (much pain for + little gain) + - Added family 4 group names (instance number) to provide a technique for + differentiating same-named tags extracted from the same location via the + command-line application + - Added a new family 1 group ("System") to differentiate tags obtained from + the file system + - Added a couple of new Canon LensType values + - Decode ID3 Picture attributes + - Decode ICC_Profile ColorantTableOut + - Changed application to return a value of 1 if all files fail condition + - Made the IPTC CodedCharacterSet tag "unsafe" to copy by default (since this + could result in incorrect encoding for existing IPTC in the destination + image) + - Fixed bug handing some non-standard offset formats when writing EXIF + - Fixed problem with MakerNote warnings for Samsung WB500 + - Fixed problem reading Leica M8 makernotes when copied between JPEG and DNG + images + - Fixed problem extracting ThumbnailImage from Sanyo VPC-FH1 MP4 videos + - Fixed problem extracting ThumbnailImage from some Sony DSLR-A100 ARW images + (due to a bug in some A100 firmware versions which results in incorrect + ThumbnailOffset values) + +July 2, 2009 - Version 7.82 (production release) + + - Added a new Canon LensType (thanks Norbert Wasser) + - Decode another Nikon AVI tag + - A number of improvements, bug fixes and additions to ID3 decoding + +June 28, 2009 - Version 7.81 + + - Added a few missing print conversions to Nikon, Kyocera and FlashPix + date/time tags + +June 26, 2009 - Version 7.80 + + - IMPORTANT: Fixed bug introduced in 7.77 which had the potential to corrupt + TIFF-format images when writing to an image containing a SubIFD tag larger + than 10 MB (not that I've ever seen one of these in the wild) + - Added support for DNG version 1.3 + - Decode makernotes in Nikon AVI videos + - Decode QuickTime MatrixStructure tag and added Composite Rotation tag to + calculate the rotation of the QuickTime video track + - Updated CanonCustom tags for the EOS 500D + - The -fast option now stops parsing of WAV and AVI files at audio/video data + - API Changes: + - Improved handling of $/ by localizing internally + +June 20, 2009 - Version 7.79 + + - Added read/write support for Adobe InDesign files (.IND, .INDD, .INDT) + - Added ability to geotag with KML files (Note: each Placemark must contain a + TimeStamp for this to work) + - Added undocumented XMP-xmp PagInfo tags written by Adobe InDesign + - Added conversion for MPF:PanOrientation + - Many improvements and additions to Olympus and Panasonic makernote decoding + - Improved logic of -scanForXMP option + - Recognize MPO file extension (Extended Multi-Picture format) + - Distinguish between infinite (inf) and undefined (undef) rational values + - Changed namespace prefixes for xapG and xapGImg to match current XMP spec + - Changed print conversion for Casio AFPointPosition + - Made "Error reading value" warning minor when reading makernotes values + - Allow all tags to be deleted from an XMP file + - Fixed group names for a few Panasonic and Sony makernote tags + +June 13, 2009 - Version 7.78 + + - Added read support for the new CIPA standards: Multi Picture Format (MPF) + and Stereo Still Image format (Stim) + - Added support for Kodak type 10 makernotes (Z980) + - Added a new Pentax LensType and a new Nikon LensID (thanks Jens Duttke) + - Added %C format code for output file names + - Decode a number of camera settings from Sony DSLR images + +June 7, 2009 - Version 7.77 + + - Added -struct option for JSON (-j) and XML (-X) outputs + - Added 2 new Pentax LensType's and a PentaxModelID (thanks Jens Duttke) + - Decode large preview in APP2 of images from newer Samsung models + - Extract FujiFilm PreviewImage from improperly written FPXR segment + - Improved decoding of Nikon WB levels for some models + - Reduced memory usage when writing DNG and some other RAW image files + - Changed format of Canon D30 SerialNumber to remove the hyphen and add + leading 0's if less than 9 characters (now same format as printed on camera) + - Changed writing of GPSTimeStamp and GPSDateStamp to adjust date/time to UTC + if it contains a timezone, and added timezone ("Z") to Composite:GPSDateTime + - Suppress "Unlisted FPXR segment (index 255)" warning from some Kodak images + - Suppress "Unrecognized MakerNotes" warning for Samsung STMN-type maker notes + - Made "Unrecognized MakerNotes" a minor warning + - Fixed problems reading/writing large PreviewImage in some Sony JPEG images + - Fixed problem decoding some base64 values in XML files + - API Changes: + - Added Struct option (considered experimental) + +May 20, 2009 - Version 7.76 + + - Added support for Leica RWL raw images (just RW2 with a different name -- + Panasonic is pulling the same dumb stunt as Nikon with NRW) + - Added ability to specify geotagging parameters via config file + - Added two new Canon LensType's (thanks Jose Oliver-Didier) + - Added a couple more Panasonic FilmMode values + - Added bitmapped value lookups to -listx output + - Decode Panasonic face recognition information (DMC-TZ7) + - Decode some new FujiFilm face detection tags + - Implemented language translations for bitmapped values + - Enhanced -geotag option to allow wildcards in track file name + - Minor changes to Nikon AF point decoding + - Allow empty string when writing unknown values (ie. "Unknown ()") + - Pad numerical IPTC values with zeros if necessary when writing + - Fixed problem with -geotag feature interpolating in some NMEA logs + - API Changes: + - Added GeoMaxHDOP, GeoMaxPDOP, GeoMaxIntSecs and GeoMaxExtSecs options + +May 9, 2009 - Version 7.75 + + - Added a few new translations (thanks Jens Duttke et al) + - Added warning when stream mode data is encountered in a ZIP file (this + is currently not supported) + - Added a couple of new Nikon ActiveD-Lighting values (thanks Werner Kober) + - Added and changed some Nikon LensID's (thanks Robert Rottmerhusen) + - Added ability to specify user-defined option defaults in config file + - Added write support for FujiFilm S5Pro firmware 1.11 RAF images + - Decode AF point information for more Nikon models (thanks Werner Kober) + - Improvements to new geotagging feature + - Changed language code for simplified Chinese from "zh_s" to "zh_cn" + - Changed user-defined shortcuts to Image::ExifTool::UserDefined::Shortcuts + - Limit PrintConv precision of Composite GPSAltitude to 1 decimal place + - API Changes: + - Changed WriteInfo() to use a temporary file instead of a memory buffer + when a source file name is given with no destination file + - Attempt (yet again) to fix problems when UTF-8 encoded strings are + passed to exiftool functions + +Apr. 10, 2009 - Version 7.74 + + - Added geotagging feature and new -geotag option (guess who finally bought a + hand-held GPS!) + - Added a few new Casio RecordMode values + - Decode FujiFilm EXRAuto and EXRMode tags (FinePix F200EXR) + - Decode Olympus ArtFilter tag + - Allow EXIF ISO to have multiple values as per EXIF spec + - Improved XMP-exif and XMP-tiff list-type tags to allow copying from EXIF + - Changed handling of ComponentsConfiguration to facilitate copying between + EXIF and XMP + - Changed name of EXIF tag 0x9214 from SubjectLocation to SubjectArea to match + EXIF specification + - Changed behaviour when writing pre-existing EXIF tags to use the standard + EXIF field type instead of preserving the existing type (fixes problem + rewriting some incorrectly typed EXIF tags) + - Fixed error if a shift value is not given when shifting a date/time tag + - Fixed makernote offsets error message when writing Pentax Optio WP images + - API Changes: + - Added EditOnly option to SetNewValue() + +Mar. 31, 2009 - Version 7.73 + + - Added write support for Panasonic RW2 images (including IPTC and XMP) + - Added ability to write IPTC and XMP to Panasonic/Leica RAW images and fixed + bug introduced in version 7.64 which disabled write support for these images + - Added a new Canon EasyMode value (thanks Irwin Poche) + - Added a number of new Nikon LensID's (thanks Robert Rottmerhusen) + - Added CanonModelID for the new 500D + - Decode many CameraInfo and ColorData tags for the Canon EOS 500D + - Decode track-level 'meta' atom in MOV videos + - Enhanced Canon Composite:ShootingMode logic to distinguish Bulb mode + - Improved decoding of Canon TargetExposureTime + - Changed name of Panasonic RW2 PreviewImage to JpgFromRaw + - Fixed bug where JPEGDigest wasn't generated for some images + - Fixed problem where -F didn't permanently fix makernote offsets for some + images when writing + - Fixed bug decoding Canon RawMeasuredRGGB and MeasuredRGGBData which resulted + in a failed test on 64-bit systems + +Mar. 20, 2009 - Version 7.72 + + - Added a new Minolta/Sony LensType (thanks Jens Duttke) + - Added support for localized language descriptions of "lang-alt" tags + - Added support for Nikon NRW files (please just kill me now) + - Added two new PentaxModelID's and a new PentaxImageSize + - Decode Pentax PEF HuffmanTable as Unknown Binary tag + - Decode Leaf and Kodak records in DNGAdobeData information + - Made "Empty PrintIM data" a minor warning + - Minor improvement to Canon lens recognition logic + - Changed Composite:LensID to also return a value for Olympus lenses + - Changed copying behaviour to preserve the specific location (family 1 group) + when source group is specified and destination group is "all" or "*" + (eg. "-exif:all>all:all" now preserves the IFD of each tag) + - Fixed a number of incorrect Minolta/Sony lens names (thanks Olaf Ulrich) + - Fixed bug rewriting MIE trailers on TIFF images + +Mar. 12, 2009 - Version 7.71 + + - Added a new Pentax LensType (thanks Akos Szalkai) + - Added a new Canon LensType (thanks Kurt Garloff) + - Added new PentaxModelID for the Optio P70 + - Added XMP list-type flag (Alt, Bag or Seq) to "-f -listx" output + - Decode a number of new Canon tags (thanks Vesa Kivisto) + - Removed unreliable Canon Composite FlashOn tag (use Flash instead) + - Removed Nikon FlashModel tag and replaced it with ExternalFlashFirmware + - Changed tags in Canon "ColorBalance" tables to signed integer and renamed + the tables to "ColorData" + - Changed formatting for Canon FocalUnits + - Changes to -X output: + - Now uses 'rdf:datatype' instead of 'et:encoding' (thanks Alexander Vonk) + - Improved long (-l) output to produce valid RDF/XML, and added 'et:val' + - Improved handling of unknown XMP lang-alt tags + - Fixed family 2 group names for a few tags + +Feb. 26, 2009 - Version 7.70 + + - Added a few new Nikon LensID's (thanks Robert Rottmerhusen) + - Added a number of new CanonModelID's + - Added ability to use -f before -listx to output 'flags' attribute + - Added xml:lang attribute to -X output (when used with -t, -H or -D) to + identify alternate language entries for XMP lang-alt tags + - Decode Canon ImageUniqueID and added a new EasyMode value + - Created "unsafe" shortcut used when rebuilding JPEG EXIF metadata from + scratch + - Changed Olympus lens "pre-release" designation to "release 1" + - Changed exiftool to continue after encountering "Error opening directory" + - Enhanced makernote-offset-fix logic to account for problems like those + caused by bugs in Picasa and ACDSee + - API Changes: + - Enhanced GetTagID() to also return language code in list context + +Feb. 17, 2009 - Version 7.69 + + - Added a new Nikon LensID (thanks Jens Kriese) + - Added a new Pentax LensType (thanks Jens Duttke) + - Added Extra JPEGDigest tag + - Recognize new Panasonic APP2 MPF information written by FX40 + - Improved -@ option to allow a UTF-8 BOM at the start of the input file + - Augmented -listx output to include indexed value conversions + - Changed Japanese and Chinese language codes to 'ja' and 'zh' (ISO 639-1) + - Fixed a few problems with some CanonCustom tags + +Feb. 13, 2009 - Version 7.68 + + - Added French translations for XMP and Composite tags (thanks Jean Piquemal) + - Decode Panasonic AdvancedSceneMode, added a few more SceneMode values, and + fixed incorrect format for TextStamp + - Decode a missing Canon 1DmkII custom function + - Changed Czech language code to 'cs' (as per ISO 639-1) + - Relaxed XMP date/time validation to allow writing year-only and year-month + values (YYYY and YYYY:MM) without requiring the -n option + - More work on language translations (this will be ongoing) + - Fixed problem shifting XMP date/time values with missing seconds + - Fixed some family 1 group names in -listx output + +Feb. 9, 2009 - Version 7.67 (production release) + + - IMPORTANT: Fixed bug introduced in version 7.01 which could cause corruption + of TIFF-format images in very rare situations when adding tags to an image + containing very large (> 10 MB) binary data blocks + +Feb. 7, 2009 - Version 7.66 + + - Improved language support + - Changed conversion for a couple of the EXIF Flash values + - Removed trailing white space from Make and Model values + - Removed null terminators that may be left on some string values + - Fixed problem with family 1 group names for QuickTime Date tags + - Fixed problem with invalid names being generated for some unknown tags + - Fixed decoding of ASF PreviewMimeType and PreviewDescription + - Fixed formatting problems with -j output when combined with some options + +Feb. 5, 2009 - Version 7.65 + + - Added -j option for JSON (JavaScript Object Notation) output format + - Improved French language translation for File group (thanks Jean Piquemal) + - Enhanced -listx option to give short output when used after -s + - Renamed "tagid" attribute to "id" in -X output to match -listx output + - Fixed bug introduced in 7.64 which resulted in runtime warning when + extracting non-existent tags with the -f option + - Fixed problem which could cause runtime error with -listx option on some + systems + +Feb. 3, 2009 - Version 7.64 - "Babel fish" + + - Added -listx and -lang options + - Added preliminary support for the following languages (thanks Jens!): + - en [default] + - ch_s (thanks Haibing Zhong) [renamed 'zh_cn' in 7.75] + - cz (thanks Petr Michalek) [renamed 'cs' in 7.68] + - de (thanks Jens Duttke) + - en_ca (for those of us who like to see "colour" spelled properly) + - en_gb (correct "colour" plus a few other quirks) + - es (thanks Santiago del Brio Gonzalez) + - fr (thanks Bernard Guillotin) + - it (thanks Emilio Dati) + - jp (thanks Kazunari Nishina) [renamed 'ja' in 7.69] + - nl (thanks Peter Moonen and Herman Beld) + - pl (thanks Przemyslaw Sulek) + - Added support for new XMP Windows Live Photo Gallery tags + - Decode two new Panasonic tags and improved decoding of some others + - Decode a few new 3rd party EXIF and IPTC tags + - Enhanced -X output by adding -t feature for tag table information + - Improved decoding of Photoshop ClippingPathName and remove Unknown flag + - Renamed Panasonic EXIF "Title" tag to "PanasonicTitle" and improved decoding + - Fixed problem which could cause crash if reading corrupted images on Windows + - Fixed inconsistencies rewriting XMP which uses extra rdf:Description + elements instead of rdf:parseType='Resource' attribute + - Fixed decoding of Nikon D40 RemoteOnDuration + - API Changes: + - Added Lang option + +Jan. 23, 2009 - Version 7.63 + + - Added new Composite tags: SubSecCreateDate and SubSecModifyDate + - Decode Sony DSLR WB_RGBLevels tags (thanks Andrey Tverdokhleb) + - Decode a few more NikonScan tags (thanks Brendt Wohlberg) + - Included new argument files in distribution: xmp2exif.args and exif2xmp.args + - Improved decoding of PentaxModelID for K-m and K2000 + - Minor change to decoding of Canon 1DmkIII ISOSpeedRange + - Downgrade "MRW format error" to a warning when reading ARW images containing + MRW information that has been corrupted by the Sony IDC utility + - Renamed Kodak SubSecTime tag to Time + - Changed Composite DateTimeCreated tag to use only IPTC tags + - Changed name of Sony/Minolta MRW WBLevels tag to reflect ordering of color + components + - Fixed problems recognizing some MP3 files + +Jan. 16, 2009 - Version 7.62 + + - Decode a number of new tags for recent Canon EOS models + - Decode ID3v2.3 Compilation tag (written by iTunes) + - Added a number of new ID3 genre's and improved ID3v2 genre conversion + - Avoid converting MIE ISO 8859-1 string values + - Enhanced XML output (-X) to work with binary data (-b) option and encode + values in base64 if necessary + - Fixed problem with invalid UTF-8 when writing XMP or using -X (XML) option + +Jan. 10, 2009 - Version 7.61 + + - Added a new Pentax LensType and a new PentaxModelID (thanks Denis Bourez) + - Added ability to copy makernotes from Pentax or Samsung native DNG image + - Decode makernotes in Samsung GX model DNG images + - Decode CameraTemperature for Canon EOS cameras with Live View (thanks + Karl-Heinz Klotz) + - Decode a number of Canon 5DmkII CameraInfo tags + - Included 2 new argument files in distribution: xmp2gps.args and gps2xmp.args + - Prevent writing of TIFF images containing the obsolete (and unsupported) + TIFF 6.0 JPEG extensions + - Fixed bug which could result in runtime warning when writing makernotes as a + block + +Jan. 6, 2009 - Version 7.60 (production release) + + - Decode a few more Nikon D700 FlashInfo tags (thanks Jens Duttke) + - Defined (empty) XMP-pdfx tag table, mainly for documentation purposes + - Fixed problem where the behaviour of -tagsFromFile changed to that of + -addTagsFromFile if the first specified tag was an exclusion + - Fixed XMP writer to allow a namespace to be deleted after a mass copy + - Fixed bug introduced in 7.58 which could cause hang when using -tagsFromFile + +Dec. 23, 2008 - Version 7.59 + + - Removed file size limit when setting tag value from contents of a file + +Dec. 22, 2008 - Version 7.58 + + - Added new Canon, Nikon and Olympus lenses (thanks Jan Boelsma and Geert De + Soete) + - Added write support for FujiFilm S5000 Ver3.00 and S9500 Ver1.01 RAF images + - Extract RAFVersion tag from FujiFilm RAF images + - Decode ColorBalance information for PowerShot G10 + - Decode Sharpness for Canon EOS 50D + - More improvements to Canon 50D and 5DmkII makernote decoding + - Attempt to identify unknown Nikon lenses which exist in LensID list with a + different LensIDNumber (to patch Sigma lens renumbering debacle) + - Removed limit of 1000 items in an XMP list-type tag when writing + - Increased maximum size of file from 16MB to 100MB when setting tag value + from the contents of a file + - Improved performance when extracting a large number of same-named tags + - Fixed bug which resulted in "segment too large" error message when rewriting + multi-segment XMP if XMP was edited but nothing was actually changed + +Dec. 11, 2008 - Version 7.57 + + - Added read support for Panasonic RW2 raw images (and extract meta + information from embedded PreviewImage as Doc1) + - Added new Pentax K-m PictureModes and new PentaxModelID for the Optio S12 + - Decode ColorBalance information for Canon 50D and 5DmkII + - Decode Panasonic RAW/RW2 information from DNG images + - Decode Canon SRAWQuality tag + - Recognize DCP (DNG Camera Profile) files + - Updated Canon CustomFunctions for the EOS 5D Mark II + - Changed name of "OtherImage" tags to "JpgFromRaw" in IFD0 of SR2 and ARW + images, and to "ThumbnailImage" in IFD0 of MRW images + - Changed EXIF DeviceSettingDescription and ProfileLookTableData to binary + data tags + - Fixed problem reading/writing ThumbnailImage in Minolta A200 MRW images + - Fixed ColorBalance2 tags for AsShot and Auto modes of Canon 1DmkII/1DSmkII + +Dec. 2, 2008 - Version 7.56 + + - Decode CompressorVersion from Canon 5D Mark II videos + - Fixed family 1 group classifications for tags in QuickTime video tracks + - Fixed problem with new -sep feature when separator contained spaces + +Dec. 2, 2008 - Version 7.55 + + - Added a number of new CanonVRD tags for DPP 3.4/3.5 (thanks Bogdan) + - Added a new FocusMode for the Pentax K-m + - Added a new Nikon LensID (thanks Niels Kristian) + - Decode some tags from Kodak C1013 maker notes (type 9) + - Enhanced -sep option to allow list-type tag values to be split when writing + - API Changes: + - Added ListSplit option + +Nov. 26, 2008 - Version 7.54 + + - Added a few old XMP-crs tags that were missed + - Show numerator and denominator for rational EXIF values in verbose mode + - Changed htmldump tooltip font + - Fixed bugs in HTML reader that could cause runtime error or hang + +Nov. 19, 2008 - Version 7.53 + + - Added read/write support for EXIF files + - Added ability to write EXIF as a block (finally!) + - Added ability to write CanonVRD information to MIE files + - Added timezone to "Now" tag value + - Added a new CanonModelID (FS100) + - Added write support for ACDSee XMP tags (XMP-acdsee:RPP) + - Added a few new XMP-cc tags + - Decode CameraOrientation for a number of Canon EOS models (thanks Bogdan) + - Allow XMP to be copied as a block with -tagsFromFile option + - Highlight odd value offsets in -htmldump output + - Improved htmldump tooltip display + - Minor improvements to MIE reader + - API Changes: + - The full XMP block is now extracted with the Binary option, so the XMP + block is marked as "unsafe" and the Protected flag must be set (as with + other writable blocks) when calling SetNewValue() + +Nov. 4, 2008 - Version 7.52 + + - Added ability to extract AI private data from PDF files + - Added extract embedded option (-ee, -extractEmbedded) + - Added new group family 3 and ability to specify multiple group names for a + single tag when extracting information + - Added a new Sony lens and decode two new Sony tags (thanks Jens Duttke) + - Added a few new Nikon LensID's (thanks Robert Rottmerhusen) + - Added a new Olympus LensType (thanks Michael Meissner) + - Decode a few new Nikon tags (thanks Jens Duttke) + - Enhanced command line parsing to allow long names for most options + - Improved verbose output when writing makernotes + - Allow writing of empty string values in EXIF information + - Fixed problem rewriting XMP lists that contained no entries + - Fixed bug writing JpgFromRaw and ThumbnailImage to CRW files that could make + the image unreadable by Canon utilities (affected images may be repaired by + rewriting the same tag with this version of exiftool) + - Fixed bug where some Canon MakerNote values could not be written + - Fixed bug introduced in version 7.49 that broke the use of wildcards in + filenames for the Windows version + - API Changes: + - Enhanced a number of functions to accept multiple group names separated + by colons + +Oct. 27, 2008 - Version 7.51 (production release) + + - Fixed problems which caused failed test or warning with Perl 5.6 or older + (does do not affect Mac or Windows versions) + - Fixed Windows application so help is displayed when run with no options + +Oct. 26, 2008 - Version 7.50 (production release) "XMP 2008" + + - Added a number of new XMP tags from new XMP specification released Oct. 17 + - Added support for extended XMP segment in JPEG images (as per new XMP spec) + - Added a number of new Minolta/Sony lenses (thanks Jens Duttke) + - Added a new Canon LensType (thanks Andreas Huggel and Pascal de Bruijn) + - Added new PRISM 2.1 XMP tags + - Added ability to read/write x:xmptk attribute (via XMP-x:XMPToolkit tag) + - Added ability to specify user-defined Lenses + - Decode XMP in ASF (WMA/WMV), FLV, SWF and MP4 audio and video files + - Preserve byte order of EXIF information when copying to MIE file + - Allow byte order for newly created MIE files to be set by ExifByteOrder tag + (and API ByteOrder option) + - Allow backslashes in filenames on non-Windows-like systems + - Removed 's' from XMP-xmp:Thumbnails tag names and set Avoid flag for + XMP-xmp:ThumbnailImage + - Fixed definitions of some XMP-xmpDM tags + - Fixed some PDF reader bugs (thanks Leonhard Zachl for one patch) + - API Changes: + - Added ExtractEmbedded option + +Oct. 16, 2008 - Version 7.49 + + - Added new PentaxModelID for K-m/K2000 plus a new LensID used by K-m + - Added --a option and made -a the default behaviour for the -X option + - Added ability to read/write XMP-rdf:about attribute + - Added new "Resource" flag which may be set in user-defined XMP tags to write + a value as an rdf:resource instead of a normal string + - Allow decimal (real) values to be written to XMP-xmp:Rating (contrary to + current XMP specification, but as per MWG recommendation) + - Fixed file renaming bug in Windows that caused the file to be moved into the + current directory instead of leaving it in the original directory when the + source file was specified using backslashes as directory separators + +Oct. 14, 2008 - Version 7.48 + + - Added support for XMP PRISM 2.0 schema tags + - Added two more ZIP compression types + - Added conversions for XMP-plus date tags + - Changed conversion of all Digest tags to make the -n value readable + - Changed some error handling to avoid generating console warnings + +Oct. 11, 2008 - Version 7.47 - "Jumbo" + + - Added -X option to output extracted information in XML format + - Added -listwf option to list extensions of writable files + - Added a number of new Nikon and Pentax LensTypes (thanks Robert + Rottmerhusen, Jens Duttke and Bozi) + - Decode Canon 1000D custom functions + - Decode a number of new tags written by Nikon Capture NX 2 + - Decode many FlashInfo tags for the Nikon D90 and D700 + - Implemented character set translation for MIE information (-L option) + - Improved speed when scanning unknown file to determine FileType + - Fixed bug where some writable EXIF tags gave a "not writable" message when + reading tag value from a dynamic file (eg. "-TAG<=%f.txt") + - Fixed problem double-escaping characters when -h and -S were used together + - Fixed decoding of Nikon FlashModel for SU-800 Remote Commander + - Fixed swapped Nikon FlashGroupBControlMode/FlashGroupCControlMode tags + - Fixed bug reading PDF files that could cause "Argument isn't numeric in + subtraction" warning (note that writing PDF files with this problem could + cause format errors which may be fixed by reverting with "-pdf-update:all=") + - API Changes: + - Fixed CanWrite() to be consistent with documentation + +Oct. 2, 2008 - Version 7.46 + + - Fixed bug which could cause a runtime warning when writing images in a + directory containing an unrecognized file type + - Fixed an IPTC-XMP test that failed in other time zones (this was a test + problem, not an exiftool bug) + +Oct. 1, 2008 - Version 7.45 + + - Added support for new XMP IPTC Extension 1.0 tags (rev 2) + - Added a few more TIFF Compression values (for MDI files) + - Decode a few new Nikon Flash tags + - Decode Canon 50D custom functions + - Calculate CurrentIPTCDigest tag (if Digest::MD5 is available) + - Renamed Photoshop CaptionDigest tag back to IPTCDigest again + - Avoid touching IPTC data block when only Photoshop information is changed + - Allow IPTCDigest to be set to the special value of 'new', representing the + new IPTC digest of the output file + - Updated iptc2xmp.args and xmp2iptc.args to write IPTCDigest as per MWG + recommendation + - Allow zone-less date/time values in XMP (as per MWG and upcoming XMP spec) + - Allow brackets in $$ and $/ expressions (eg. ${$} and ${/} now work) + - Changed decoding of EXIF:Copyright to allow two separate strings as per spec + - Changed a number of XMP Iptc4xmpCore tag names and added a corresponding set + of aliases (shortcuts) for backward compatibility + - Changed some XMP xmpTPg tag names + - Fixed problem extracting lists from other information types in MIE files + +Sept. 26, 2008 - Version 7.44 + + - Added read support for DjVu images + - Added two new Sony LensType's (thanks Mladen Sever) + - Added a new Pentax LensType (thanks Jens Duttke) + - Decode a few new Canon 450D and 1000D tags (thanks Bogdan) + +Sept. 17, 2008 - Version 7.43 + + - Added two new Pentax LensTypes (thanks Jens Duttke and Anton Bondar) + - Added PentaxModelID's for the Optio E60 and M60 + - Added a number of new CanonModelID's + - Extract XMP from MOV and AVI videos (as written by Adobe CS3 Bridge) + - Decode information from QuickTime HintInfo atoms (hinf and hnti) + - Decode Canon 50D/5DmkII AutoLightingOptimizer + - Enable writing of ThumbnailImage in CR2 images + - Avoid extracting invalid Canon FocusDistance tags + - Improved handling of timezones in date/time values (fixes failed EXE test) + +Sept. 11, 2008 - Version 7.42 + + - Added read support for Windows, MacOS and Unix executable and library files + - Added read support for ZIP and RWZ (Rawzor) compressed files + - Added a number of new XMP tags written by PS Elements 4.0 (thanks Drew + Holland) and LightRoom 2.0 + - Added new Sony, Canon and Nikon LensTypes (thanks Jens Duttke and Werner + Kober) + - Decode a few new Canon CameraInfo tags for the 40D, 50D, 450D and 1000D + (thanks D.J. Cristi) + - Decode Nikon D90 LensData + - Define version number etc. in properties of exiftool Windows executable + - Improved handling of corrupted makernote offsets when writing + - Fixed problem where FileType could be incorrect for a TIFF-based file with + the wrong extension + +Aug. 28, 2008 - Version 7.41 + + - Added new Composite LensID tag and changed a number of LensType values in + an attempt to disambiguate Canon, Pentax, Minolta and Sony 3rd party lenses + - Added -sep option to specify separator for values in list-type tags + - Added a new Nikon LensID (thanks Jens Duttke) + - Added CanonModelID values for new models (SX110, A1000, A2000, E1, 50D) + - Decode some CameraInfo tags of the Canon EOS 450D and 1000D (thanks Bogdan) + - Decode a few new tags in Kodak MOV videos + - Updated CanonVRD decoding for version 3.40 (DPP 3.4.1, thanks Bogdan) + - Allow writable EXIF properties to be overridden by user-defined tags + - Relaxed PDF parsing to allow xref tables with zero entries + - Renamed Sigma LensID tag to LensType + - Changed PDF update structure to better conform with PDF specification + - Changed conversion of Olympus ManometerReading values + - Reverted back to Perl 5.8 for Windows EXE version (fixes problem running + exiftool.exe using a non-standard TEMP directory) + - Patched DST problem in Windows when "Automatically adjust clock for daylight + savings time" is used in Windows Date and Time settings + - Fixed problems in the QuickTime parser that could cause exiftool to hang + - Fixed bug which could cause an error to be reported when writing a DNG image + containing ProfileIFD information + - API Changes: + - Added ListSep option + +Aug. 17, 2008 - Version 7.40 + + - Fixed -p option in Windows executable version (caused by packaging problem + with Perl 5.10 release) + +July 30, 2008 - Version 7.39 + + - Added a number of new Canon LensType values (thanks Rich Taylor) + - Added a new Pentax LensType (thanks Jens Duttke) + - Added a new Sony LensType (thanks Mladen Sever) + - Added support for writing invalid IFD entries used by some Kodak Z cameras + - Updated Canon CustomFunctions for EOS 450D + - Made a few more DNG tags writable + - Renamed CIFF TvValue and AvValue tags to ShutterSpeedValue and ApertureValue + and added conversions (to seconds and F-number) as with EXIF tags + +July 18, 2008 - Version 7.38 + + - Same as version 7.37 except that Windows executable is packaged with Perl + 5.10.0 instead of 5.8.7 -- this fixes a problem with FileModifyDate and DST + +July 16, 2008 - Version 7.37 + + - Added -addTagsFromFile option (variant of -tagsFromFile which allows copying + multiple tags into the values of a single list-type tag) + - Added a new Sony LensID (thanks Jens Duttke) + - Added PentaxModelID for the Optio W60 + - Added a couple of new YCbCrSubSampling values (thanks Jens Duttke) and made + values consistent across different types of meta information + - Decoded Canon Categories tag (thanks Darryl Zurn) + - Reduced priority of XMP-xmp date/time tags so the EXIF tags are preferred + - Fixed problem where time may be duplicated in Composite:DateTimeCreated + - API Changes: + - Added ability to pass options to SetNewValuesFromFile + +July 8, 2008 - Version 7.36 + + - Added a new Nikon LensID (thanks Jens Duttke) + - Fixed bug introduced in 7.33 where a SubIFD error was erroneously reported + when writing an already edited NEF image + +July 6, 2008 - Version 7.35 + + - Added two new Nikon LensIDs (thanks Geert De Soete and Jens Duttke) + - Added XMP-pdf:Trapped tag + - Added Composite:GPSAltitude tag (like Composite:GPSLatitude/GPSLongitude) + - Added a couple of new PentaxModelID values + - Decode Canon 450D Sharpness tag (thanks Bogdan) + - Decode Nikon D300 AFAreaMode and AutoFocus tags (thanks Jens Duttke) + - Extract Pentax SaturationInfo as an Unknown tag (thanks Dave Nicholson) + - Renamed Canon LensType string tag (ID 0x0095) to LensModel + - Changed JFIFVersion print conversion to match the formatting used in the + JFIF specification + - Fixed a Minolta LensID entry for Tamron lenses + - Fixed problem excluding XMP family 1 groups from deletion in some file types + +June 28, 2008 - Version 7.34 + + - Added names for a few more of the Unknown Photoshop tags + - Added support for XMP files with leading XML comments + - Added support for older XMP "x:xapmeta", and XMP without "x:xmpmeta" element + - Changed priority of XMP:Source tags when writing so XMP-photoshop:Source is + now preferred over XMP-dc:Source + - Renamed Photoshop IPTCDigest to CaptionDigest and removed Unknown status + - Improved parsing of IPTC time values when writing, and assume the local + timezone (if available) instead of UTC when a timezone is not specified + - Improved handling of lists that exist in multiple groups in the same file + - Disabled shifting of list-type date/time tags (allows += to add list items) + - Reduced priority of XMP-exif and XMP-tiff tags so these values don't + override more reliable EXIF and TIFF tags when extracting information + without specifying a group + - Fixed quirk where exiftool could add an extra padding byte to the makernotes + - Fixed incorrect tag ID that prevented ImageStabilization from being decoded + in Sony DSLR-A100 images (thanks Ger Vermeulen) + - Fixed problem where error/warning messages could be duplicated for + subsequent files when copying tags from multiple files + +June 21, 2008 - Version 7.33 + + - WARNING: Older ExifTool versions will not properly rewrite DNG 1.2 images + which contain multiple color profiles + - Added DNGVersion check to avoid future problems with major DNG revisions + - Added support for new DNG version 1.2.0.0 tags + - Added support for XMP PLUS License Data Format 1.2.0 tags + - Added a new Pentax LensType (thanks Peter) + - Added a new Canon LensType + - Added support for user-defined XMP structures + - Decode a few new Sony tags (thanks Marcus Holland-Moritz) + - Decode Nikon Capture NX 2 NikonICCProfile information (thanks Jens Duttke) + - Extract MP3 VBR and ID3Size tags + - Improved accuracy of MP3 Duration calculation (account for VBR and ID3Size) + +June 12, 2008 - Version 7.32 + + - Added a new Pentax LensType (thanks yeryry) + - Decode ColorBalance information for Canon 450D and 1000D + - Fixed names of a few NikonCapture D-LightingHQ tags (thanks Jens Duttke) + - Fixed bug where a list-type tag was not created when simultaneously adding + and deleting values from the list + +June 10, 2008 - Version 7.31 + + - Added proper support for special characters in PDF text strings + - Added support for a number of new XMP tags written by Adobe Lightroom 1.4 + - Added ability to write XMP-xmp:ThumbnailsImage + - Added Photoshop IPTCDigest tag + - Added two new Nikon LensID's (thanks Jens Duttke) + - Added a new Pentax LensType (thanks Bogdan) + - Added a new CanonModelID for the EOS 1000D + - Decode a few new Pentax tags (thanks Dave Nicholson) + - Increased precision of GPS coordinates when copying with -tagsFromFile + - Fixed problem which could result in "Argument isn't numeric" runtime warning + when attempting to write an Unknown value to a bitmapped tag + +May 31, 2008 - Version 7.30 (production release) + + - Adjusted MakerNote error checks to be a compromise between 7.28 and 7.29 + - Fixed various htmlDump problems + - Fixed bug which could cause runtime warnings when attempting to write + certain types of unsupported images + +May 28, 2008 - Version 7.29 + + - Renamed Pentax ModelRevision tag to ProductionCode and improved print + conversion to indicate if camera has been serviced + - Added check to prevent EXIF tags from being written to JPEG images if they + would obviously exceed the maximum JPEG segment size limit + - Relaxed error checks when writing JPEG images to allow MakerNotes to be + rebuilt if the MakerNote IFD is not contained within the MakerNotes data + - Fixed decoding of Pentax ExternalFlashGuideNumber when AF360 is used with + the wide angle panel + - Fixed unnecessary "Multiple new values for IFD0 tag 0x927c" warning which + could occur when copying MakerNotes from some images + +May 26, 2008 - Version 7.28 + + - Added new Canon CustomFunctions values from the EOS 1DmkIII firmware update, + and a new CanonExposureMode value (thanks David Pitcher) + - Added a new Olympus LensType (thanks Viktor Lushnikov) + - Decode Pentax ExternalFlashBounce tag (thanks Cvetan Ivanov) + - Renamed Pentax ExternalFlashZoom tag to ExternalFlashGuideNumber and + improved decoding (thanks Cvetan Ivanov) + - Fixed bug which could prevent maker notes from being copied when copying all + tags from a file containing a PreviewImage + - Fixed problems decoding some Sony ARW images + - Fixed problem writing some makernote values in sub-IFD's + - Fixed "APP1 segment too large" problem where PreviewImage was not dropped + as it should have been when copying all tags from some RAW images + +May 24, 2008 - Version 7.27 - "GIF+XMP" + + - Added ability to read/write XMP in GIF images + - Added ability to write to GIF87a images (by upgrading them to GIF89a) + - Added GIFVersion tag + - Improved decoding of Canon 1DmkIII/1DSmkIII TimeStamp tags + - Changed print conversion of EXIF/XMP GPSStatus tags to make more sense + - Fixed bug introduced in version 7.22 that could cause exiftool to abort with + an "'x' outside string" error when processing some DNG images + - API Changes: + - Extract FileSize information from images passed as a scalar reference + +May 21, 2008 - Version 7.26 + + - Added write support for FujiFilm FinePix S5 Pro V1.04 RAF images + - Added support for new Kodak TIFF-format maker notes used by the Z1085 + - Added new Pentax and Nikon LensType's (thanks Jens Duttke, Dave Nicholson + and Robert Rottmerhusen) + - Added some new Minolta LensID's (thanks Thomas Kassner) + - Added new CanonModelID's and a 1DmkIII TimeStamp (thanks Ger Vermeulen) + - Decode a number of new Pentax K10D tags (thanks Dave Nicholson) + - Decode Panasonic Title tag (thanks Jens Duttke) + - Recognize a few more uncommon top-level QuickTime atoms + - Changed decoding of some Olympus tags for new E-520 + - Changed warning when empty PrintIM data is encountered (eg. as written in + Sony A700 ARW files when Adobe RGB color mode is used) + - Dropped Canon PreviewFocalPlaneX/YResolution tags since they never really + existed (thanks Ger Vermeulen for pointing out the Canon bug which lead to + this false assumption) + - Fixed duplicate tag problem with Pentax LensData when -U option used + - Fixed bug which could cause a runtime warning when copying Nikon maker notes + - Fixed bug in exiftool application which could cause all tags to be copied + instead of just the specified tags when creating an output XMP or MIE file + and using the -tagsFromFile option + +Apr. 18, 2008 - Version 7.25 (production release) + + - Added read support for DIVX video files + - Added a new Nikon LensID (thanks Tanel Kuusk) + - Decode a number of new Pentax K10D tags and values (thanks Dave Nicholson) + - Decode a few new Nikon tags (thanks Jens Duttke) + - Decode Nikon VignetteControl tag found in D3 images with new 1.10 firmware + (thanks Alexandre Naaman) + - Improved formatting of video duration times + - Improved print conversion for video Compression values + - Apply print conversion for XMP:FocalLengthIn35mmFormat to add "mm" + - Fixed MIME type of JPEG 2000 images + - Fixed problem decoding new Nikon D300 AFPrioritySelection tags + - API Changes: + - Fixed CanWrite so it returns false for non-writable TIFF-based files + +Apr. 10, 2008 - Version 7.24 + + - Added read support for SVG (Scalable Vector Graphics) images + - Added support for non-standard Apple iPhone PNG images + - Added support for ISL maker note format + - Added a couple of new Olympus LensType's + - Added a few new Nikon LensID's (thanks Robert Rottmerhusen) + - Added values for various Sony tags (thanks Jens Duttke) + - Decode Nikon D300 custom settings (thanks Jens Duttke) + - Decode Nikon D300 AFFineTuneAdj (thanks Neil Nappe) + - Decode a number of new Pentax tags and values (thanks Jens Duttke) + - Decode a number of new QuickTime tags, including 'mdta' information + - Decode a missing Custom Function for Canon 450D + - Avoid extracting any unknown tag in binary data tables when -u option used + - Avoid writing Canon 1D/1DS RAW images masquerading as TIF (writing 1D + RAW images is not yet supported) + - Improved parsing of AFCP ThumbnailImage and PreviewImage + - Downgraded errors in the NikonScan and NikonPreview IFD's to allow writing + of images with these problems without requiring the -m option + +Mar. 27, 2008 - Version 7.23 + + - Decode a number of new Pentax K20D/K200D tags and values + - Fixed bug introduced in 7.18 which caused "Error parsing XMP" warning when + deleting all XMP and writing new XMP tags in the same step + +Mar. 25, 2008 - Version 7.22 + + - Added support for Olympus-style Sony makernotes (DSC-S45/500/650/700/750) + - Added %c 'n' modifier to number output files from 1 instead of 0 + - Added Extra "Now" tag used for setting a tag value to the current date/time + - Added a new Nikon LensID (thanks Jens Duttke) + - Added ability to specify byte order for EXIF Unicode text and fixed problem + where text wasn't always written in EXIF byte order by default + - Added a new Canon LensType (thanks Hal Williamson) + - Added a few new CanonModelID values + - Decode a new Pentax K20D tag and add a few new values to other tags (thanks + Jens Duttke) + - Recognize non-standard Nikon ICC Profile files + - Improved error checking when writing a JPEG image with a bad IFD + - Fixed bug where IFD0 could be deleted when writing JPEG with a bad IFD1 + - Fixed some Olympus LensType names for Leica lenses + - Fixed problem extracting some writable directories as a block + - Fixed bug which could cause "Not an ARRAY" error when reading PDF files + +Mar. 12, 2008 - Version 7.21 (production release) + + - Added support for Leica M8 maker notes (in both DNG and JPEG images) + - Added ability to write encrypted Nikon makernote information (!!) + - Added a new Olympus Leica lens (thanks Chris Shaw) + - Decode a couple of new Canon 40D and 1DmkIII tags (thanks Chris Huebsch) + - Decode Adobe RAF data in DNG images + - Decode a few new Nikon D3 and D300 tags (thanks Jens Duttke) + - Calculate VideoFrameRate for QuickTime MOV videos + - Marked DNG OriginalRawFileName and OriginalRawFileData as "unsafe" to copy + - Changed decoding of Casio BestShotMode + - Renamed Nikon NEFCurve tags (thanks Jens Duttke) + - Patched problem parsing OriginalDecisionData for the Canon EOS 5D + +Mar. 7, 2008 - Version 7.20 + + - Added a few new Minolta LensID's + - Added two more TIFF-IT tags to the EXIF table + - Added a number of new RIFF and ASF Audio Encoding values + - Added a new new values for some Canon tags (thanks Dave Nicholson) + - Decode a number of new Pentax K10D tags (thanks Dave Nicholson) + - Decode a number of new MP4/QuickTime tags + - Decode makernotes in Casio, Kodak, Minolta, Olympus and Ricoh AVI and MOV + videos + - Improved decoding of Casio maker notes and decode a few new tags (thanks + Jens Duttke) + - Removed incorrect CanonD30 ColorTemperature and ColorMatrix tags + - Fixed Location translation in iptc2xmp.args and xmp2iptc.args + - Fixed problem decoding some Nikon tags in images edited by Capture NX + - Fixed decoding of InternalSerialNumber for Canon 5D + - Fixed decoding of Nikon D3 color balance information + - Fixed decoding of Minolta 7D FocusMode (thanks Jens Duttke) + +Feb. 25, 2008 - Version 7.19 + + - Added a new Pentax LensType and some new Panasonic NoiseReduction values + (thanks Jens Duttke) + - Decode Nikon D40 and D40X custom settings plus a couple of other tags + - Decode a couple of new Pentax K10D tags (thanks Dave Nicholson) + - Improved reliability of Canon FocalPlaneXSize and FocalPlaneYSize tags + - Recognize HP Type2 maker notes in images from other makes + - Write TIFF ApplicationNotes in 'int8u' format as per XMP specification + - Made TIFF ApplicationNotes writable as a block + - Changed HtmlDump to show actual IFD format if different than read format + - Changed some MeteringMode strings to be more consistent + - Fixed problem adding back JFIF information after deleting JFIF group + +Feb. 21, 2008 - Version 7.18 + + - Added ability to exclude XMP family 1 groups from deletion + - Added patch to recognize new Ricoh R50 maker notes + - Added a new Minolta LensID (thanks Jens Duttke) + - Decode AFPointsUsed for Nikon D3 and D300 (thanks Jens Duttke) + - Decode a couple of new Pentax K10D tags (thanks Dave Nicholson) + - Improved decoding of Nikon FlashInfo tags (thanks Jens Duttke) + - Renamed Olympus FlashExposureCompensation tag to FlashExposureComp + - Patched problem with Perl 5.10.x which broke conversion of UTF8 strings + - Fixed problem where an ExposureTime of 1 second was ignored in CRW images + - Fixed problem where special characters were not handled properly when using + the -L option while copying IPTC tags + - Fixed bug which could cause a runtime error when attempting to write JFIF + information after deleting JFIF:all in the same step + +Feb. 16, 2008 - Version 7.17 + + - Extract duplicate tags when -p option is used + - Fixed bug introduced in 7.00 which broke the use of group family numbers and + groups ending with a digit in tag format strings (eg. "$IFD0:Model") + +Feb. 14, 2008 - Version 7.16 + + - Added a couple of new Pentax LensTypes (thanks Jens Duttke) + - Added a few more EXIF:Compression values + - Decode color balance levels in Leaf MOS images + - Decode a number of new tags from JPEG, TIFF, KDC and DCR images of older + Kodak models + - Improved decoding of TIFF SampleFormat tag + - Made a number of DNG tags "unsafe" so they aren't copied by default + - Allow JPEG EXIF segment to be deleted and a new EXIF segment to be created + with a different byte order in a single command + - Attempted to improve reliability of ScaleFactor35efl calculation for newer + Canon models + - Fixed a couple more places where we still needed a space before "mm" + - Fixed problem with LightValue calculation which caused failed tests for Perl + 5.6.2 on Darwin + +Feb. 5, 2008 - Version 7.15 (production release) + + - Added a few new CanonModelID's and PentaxModelID's + - Added support for new Pentax K20D/K200D values for some tags + - Added a few new Nikon LensID's (thanks Robert Rottmerhusen) + - Decode a few new Sigma tags, including PreviewImage + - Decode a few more tags in Canon CRW images (thanks Dave Nicholson) + - Improved Sony ARW parsing (fix some problems and extract more tags) + - Improved handling of timezone when writing EXIF and XMP information (the + timezone is now added to XMP date/time values and removed from EXIF + date/time values if necessary unless the -n option is used) + - Recognize a few more FLV AudioEncoding and VideoEncoding values + - Allow "pseudo" tags to be copied from unrecognized file types + - Made FileModifyDate an "unsafe" tag so it isn't copied unless specified + - Changed all "sec" units to "s" with a leading space for consistency + - Fixed bug introduced in version 6.91 that could prevent some XMP date/time + tags from being written when copying with "-all:all" + +Jan. 25, 2008 - Version 7.14 + + - Added read support for Kodak KDC raw images + - Added ability to read/write Canon OriginalDecisionData in JPEG, CR2 and DNG + images + - Added ValueConv translations for some of the new Nikon PictureControl tags + - Decode a number of new Nikon tags (thanks Jens Duttke and Gregor Dorlars) + - Decode Canon CR2Segmentation tag + - Decode a new Canon CustomFunction of the EOS 450D + - Improved handling of mandatory tags in EXIF information + - Changed all FocalLength print conversions to add a space before "mm" + - Renamed Canon Self-timer tags to SelfTimer for consistency + - Fixed some problem with -htmlDump for some types of trailer information + - Fixed problem which could give a runtime warning when attempting to delete a + permanent tag + +Jan. 17, 2008 - Version 7.13 + + - Decode a couple more Nikon and Sony tags + - Decode Windows HD Photo "Padding" tag + - Recognize HDP (Windows HD Photo) file extension + - Designated EXIF CompressedBitsPerPixel and ComponentsConfiguration as + "unsafe" tags so they aren't copied by -tagsFromFile by default + - Changed priority of new Nikon D3/D300 ISO tag + - Changed Canon LensType for a Tamron lens (thanks Monica Wallek) + - Fixed incorrect TagID for new Panasonic Sharpness tag + +Jan. 15, 2008 - Version 7.12 + + - Added read support for ITC (iTunes Cover Flow) files + - Added ability to deal with corrupted IPTC written by Nikon Capture NX + - Added a few new Canon LensType's (thanks Steve Balcombe) + - Decode a number of new Nikon D3/D300 tags (thanks Gregor Dorlars) + - Decode a number of new FujiFilm and Panasonic tags and values + - Decode ColorBalance information for the Canon 40D, 1DmkIII and 1DSmkIII + - Improved decoding of Nikon D80 VibrationReduction tag (thanks Jens Duttke) + - Renamed Pentax WBShiftBA and WBShiftGM tags to WBShiftAB and WBShiftMG (now + more consistent with Pentax software, but inconsistent with Canon naming) + - Fixed a CanonImageHeight tag which was incorrectly named CanonImageWidth + +Jan. 10, 2008 - Version 7.11 + + - Decode a number of new Canon tags and improved decoding of many old tags + - Renamed EXIF:RelatedImageLength to RelatedImageHeight (hopefully all + ImageWidth/Height tag names are now consistent) + +Jan. 7, 2008 - Version 7.10 + + - Added support for escape sequences and continuation comments in EPS files + - Added ability to read/write Sony A700 PreviewImage (tag 0x2001) + - Added a new Sony ColorMode value (thanks Philippe Devaux) + - Decode a number of new Minolta tags + - Improved handling of newlines when writing PDF information + - Improved decoding of Canon 40D and 1DmkIII FocusDistance tags (thanks + Wolfgang Hoffmann) + - Fixed problem creating multiple output meta files with some commands + - Fixed problem deleting XMP by value for strings with escaped characters + - Fixed bug when trying to write output image to console with "-o -" + - Fixed problem where %c (copy number) was changed when the new file name + should have been the same as the source file + +Jan. 3, 2008 - Version 7.09 + + - Decode Canon ThumbnailImageValidArea + - Improved decoding of some Olympus tags (thanks Frank Ledwon) + - Improved decoding of some Pentax tags (thanks Dave Nicholson) + - Improved error messages when writing PDF files + - Changed XMP-cc namespace URI (spec apparently changed for some reason) + - Changed Photoshop XMLData to a binary data tag + - Changed conversion strings for Canon ModifiedSharpnessFrequency values + - Changed Olympus NoiseReduction "ISO Boost" value back to "Noise Filter (ISO + Boost)" + - Fixed minor problem writing PDF cross-reference stream after multiple edits + - Fixed problem redirecting some verbose output to an output text file + +Dec. 21, 2007 - Version 7.08 + + - Added write support for PDF files which use only cross-reference streams + - Added a number of new Olympus tags, and changed names of some existing tags + - Fixed problem decoding some PDF cross-reference streams + - Fixed bug introduced in 7.07 which broke copying between two list-type tags + +Dec. 18, 2007 - Version 7.07 + + - Added ability to write XMP and PDF information to PDF files, with revert + capability! (use "-PDF-update:all=" to undo all exiftool edits) + - Added PDF:AppleKeywords tag (written by Apple Preview) + - Added Composite FOV (Field Of View) tag + - Added a few more Minolta/Sony LensID's + - Added new Canon and Pentax LensType's (thanks Magne Nilsen and Jens Duttke) + - Added "Nothing changed" message in verbose mode for files that weren't + changed when writing + - Added minor warning when invalid IFD entries are removed during writing (you + will get this, for instance, when ExifTool fixes the entry count problem in + Canon EOS 40D firmware 1.0.4 maker notes) + - Patched Canon 40D firmware 1.0.4 problem for JPEG images too + - Decode specified "unknown" zero values for four EXIF tags (ExposureProgram, + LightSource, MeteringMode and SubjectDistanceRange) instead of handling as a + truly unknown value (if this makes sense) + - Extract PreviewImage from newer Panasonic RAW images (thanks Jens Duttke) + - Recognize Pentax-type Kodak maker notes (eg. Easyshare 883) + - Made "Entries out of sequence" a minor warning since this problem is fixed + - Allow decimal seconds to be written in time values without needing to use -n + - Improved parsing of PDF files + - Improved behaviour when copying list-type tags to to non-List tags + - Improved exiftool summary message for files that were copied without changes + - Adjusted Pentax K10D battery percentage calibration + - Changed names of Pentax FirmwareID tags + - Fixed runtime warning that could occur with some invalid tag names + - Fixed problem decoding Pentax:LensCodes for some images (thanks Jens Duttke) + - API Changes: + - Also allow File::RandomAccess reference as argument to ImageInfo() + +Dec. 7, 2007 - Version 7.06 + + - Permanently fix MakerNote offsets with -F option when writing + - A few more Pentax tag improvements (thanks Dave and Jens) + +Dec. 6, 2007 - Version 7.05 + + - Patched problem rewriting Canon 40D CR2 images caused by bug in the 40D + firmware 1.0.4 which writes an improperly formatted MakerNote IFD + - More improvements in decoding Pentax K10D tags (thanks Dave Nicholson) + - Translate non-standard XMP namespace prefixes + - Changed a couple of Kodak Meta tags to Binary data type + - Renamed Pentax MeasuredLV to EffectiveLV (thanks Jens Duttke) + +Dec. 3, 2007 - Version 7.04 + + - COMPATIBILITY WARNING: Renamed EXIF:ExifImageLength to ExifImageHeight and + XMP:GPSTimeStamp to GPSDateTime + - Added write support Minolta A200 MRW images + - Added read support for Hasselblad 3FR raw images + - Added a few new Nikon LensID's (thanks Robert Rottmerhusen) + - Added a new Canon LensType (thanks Bogdan) + - Added ability to insert a newline using "$/" in a print format string + - Decode some new FujiFilm and Pentax tags (thanks Jens Duttke) + - Decode some new Pentax and Canon tags (thanks Dave Nicholson) + - Recognize a few new Olympus lenses (thanks Michael Meissner) + - Improved decoding of Sony ARW images and added support for A700 + - Improved warnings for HtmlDump option + - Improved string parsing when writing date/time tags + - Fixed problem extracting Canon CRW RGGB values from DNG images + +Nov. 17, 2007 - Version 7.03 + + - Fixed problem deleting XMP family 1 groups from JPEG images + +Nov. 16, 2007 - Version 7.02 + + - Added ability to delete XMP family 1 groups (eg. "-XMP-crss:all=") + - Fixed problem writing XMP as a block to XMP file + +Nov. 15, 2007 - Version 7.01 + + - Added ability to write FujiFilm RAF images (thanks Jens Duttke) + - Added -T option (equivalent to -t -S -q -f) + - Decode a number of new Pentax tags and values (thanks Dave Nicholson) + - Decode a new Canon LensType value (thanks Bogdan) + - Decode the not-so-accurate FocusDistanceUpper and FocusDistanceLower in + Canon EOS 1DmkIII and 40D images (thanks Heiko Hinrichs) + - Allow FileSource tag to be assigned values outside the EXIF standard + - Made ImageSourceData a protected tag + - Avoid loading huge binary data blocks into memory unless necessary (avoids + out-of-memory problem when processing huge, layered Photoshop TIFF images) + - Improved HtmlDump speed and memory usage by not loading "snipped" data + - Improved decoding of Nikon ShootingMode + - Various improvements and bug fixes when reading FujiFilm RAF information + - Fixed problem decoding CRW images where ImageWidth wasn't extracted with -U + +Oct. 23, 2007 - Version 7.00 (production release) + + - IMPORTANT: Fixed problem writing ORF images from newer Olympus cameras which + could lead to errors when the image is opened by another utility (affected + images may be repaired by rewriting with this version of ExifTool) + - Added -ScanForXMP option + - Added ability to extract ID3v2 PRIV tags (including XMP) and the ID3:MCDI + tag (plus unknown ID3v2 tags with the -u option) + - Added new PentaxModelID's for Optio V10 and A40 + - Added support for Casio-like and HP-like Pentax maker notes + - Added ICC_Profile WCSProfiles tag (thanks Jens Duttke) + - Added ability to write and create CanonVRD as a block + - Added ability to shift GPSTimeStamp tag + - Added ability to write DNG AsShotICCProfile and CurrentICCProfile tags + - Decode VRDOffset tag in Canon MakerNotes + - Shortcuts may now be used in redirections and expressions, and with group + names + - Improved decoding of CanonVRD information (also decode new DPP 3.0 tags and + fixed a problem which could give a "Possibly corrupt CanonVRD" warning) + - Improved decoding of FujiFilm RAF images, and extract JPEG Preview + - Improved handling of Pentax Casio-style maker notes + - Improved conversion for Pentax K10D AFPointsInFocus + - Enhanced Composite tag syntax to simplify user-defined tag definitions + - Changed decoding of Nikon VibrationReduction 0x0075 tag + - Changed a number of Pentax and Casio tags to improve consistency + - Dump unsupported files with -htmlDump only if -u option is used + - Fixed problem which could cause a virtual hang when writing large EPS files + - Fixed problem of misleading error messages when attempting to write + unsupported file formats + - Fixed problem outputting list-type tags with -b option + - Fixed bug where the "image files created" count could miss some files + - Fixed problem where "Error rebuilding maker notes" warning could be issued + in cases where the maker notes do not need rebuilding + +Oct. 6, 2007 - Version 6.99 + + - Added support for IView MediaPro XMP tags + - Added ability to read multiple comments from GIF89a images + - Added some new PentaxModelID's (Optio L20, T20, Z10) + - Added minor warning for unknown JPEG APP segments when -u option is used + - Extract information from JPEG APP13 "Adobe_CM" segment + - Improved -htmlDump output to show TIFF image data and trailer (the TIFF dump + is now complete) + - Improved decoding of Minolta WhiteBalance for some DiMAGE models + - Improved decoding of Panasonic FirmwareVersion when -n option is used + - Increased precision of 64-bit rational conversion from 7 to 10 digits + - Fixed problem which caused failed tests with Perl 5.005_05 + - Fixed problem where some groups could not easily be excluded when deleting + all other information (eg. "-all= --exif:all" now behaves as expected) + - Fixed problem decoding ICC Profile "dtim" format values + - Fixed typo in a Minolta FlashMetering value (thanks Jens Duttke) + - Fixed problem in API which could result in a UTF-8 encoded file not being + properly identified if it was passed as a scalar reference to WriteInfo() + +Sept. 23, 2007 - Version 6.98 + + - Added ExifByteOrder tag (writable to set byte order for new Exif segments) + - Added CanonModelID for new EOS-1Ds Mark III + - Added value conversions for Pentax AEFlashTv, AEXv and AEBXv tags + - Decode Pentax ShutterCount (with help from Jens Duttke) + - Decode Pentax AFPointsInFocus for newer DSLR models (thanks Jens Duttke) + - Improved decoding of a Pentax LensType (thanks Jens Duttke) + - Renamed Pentax AutoAFPoint to AFPointsInFocus and improved conversion + - Renamed Pentax AEDump to AEMeteringSegments and converted values to + approximate LV equivalent units + - Fixed problem where some warnings were not being properly handled when + attempting to write an invalid value to some tags + +Sept. 14, 2007 - Version 6.97 + + - Added support for Canon EOS 40D Custom Functions + - Added ability to decode new Nikon D3 and D300 LensData + - Added a few new Nikon LensID's (thanks Robert Rottmerhusen) + - Decode Olympus NoiseFilter tag (thanks Ioannis Panagiotopoulos) + - Decode a few new Nikon ShotInfo tags (thanks Jens Duttke) + - Improved decoding of Canon AF point information + - Improved decoding of Nikon HighISONoiseReduction + - Renamed Nikon VRState to VibrationReduction + - Fixed typo which prevented some Olympus MakerNote tags from being written + +Sept. 5, 2007 - Version 6.96 + + - Added ability to read/write XMP alternate languages + - Added ability to create new GPS information in Panasonic RAW images + - Added a few new PentaxModelID's (Optio E40, M40 and S10) + - Added a couple of new Pentax LensType's (thanks Jens Duttke) + - Added a new Olympus Sigma LensType (thanks Jens Duttke) + - Added EOS 40D CanonModelID and prepared for new 40D custom functions + - Decode a large number of new Canon tags + - Decode SerialNumber from previously unknown maker notes of some Kodak models + - Decode Olympus ImageStabilization tag (thanks Jens Birch) + - Improved decoding of Canon Self-timer and AFPoint values + - Improved decoding of some tags for high end Canon EOS models + - Renamed Pentax LensCoefficients to LensCodes and print 16 values + - Renamed Panasonic ImageStabilizer to ImageStabilization + - Renamed all AFPointsUsed tags to AFPointsInFocus + - Fixed decoding of ICC_Profile DeviceAttributes + +Aug. 21, 2007 - Version 6.95 + + - Added support for new Kodak IFD-format makernotes used by the P712, P850, + P880, Z612 and Z712 + - Added a few new Nikon LensID's (thanks Robert Rottmerhusen) + - Added LensType's for 2 new Pentax DA* lenses (thanks Jens Duttke) + - Added 2 new FujiFilm S5 WhiteBalance values (thanks Paul Samuelson) + - Added a number of new CanonModelID's + - Extract TIFFPreview from DOS EPS images + - Decode a number of new Panasonic tags, and added a number of new SceneMode's + - Decode FujiFilm S5 ColorTemperature tag (thanks Paul Samuelson) + - Improved handling of unknown XMP list-type tags + - Suppress EPS 'unterminated Document data' warning + - Fixed decoding of ASCII-type Panasonic FirmwareVersion + - Fixed bug calculating leap years for years outside the range 1601-2399 + - API Changes: + - Changed WriteInfo() behaviour to be more consistent when editing file in + place and a new FileName is specified (original file is now deleted) + - Improved warning message when trying to write an 'unsafe' tag + +July 26, 2007 - Version 6.94 + + - Added a few new XMP-crs tags + - Added ability to create a new Photoshop IRB record in TIFF-format images + - Added a few new EXIF:Compression values (thanks Jens Duttke) + - Added a number of new Panasonic/Leica tags, and changed the names of some + Panasonic tags, including reverting FirmwareVersion (thanks Jens Duttke) + - Added test for Unknown (Bulb) Pentax ExposureTime value (thanks Jens Duttke) + - Added a new Nikon LensID (thanks Vladimir Sauta) + - Avoid extracting information from documents embedded in EPS images + (this is temporary; eventually I want to figure out a way to allow this + information to be extracted separately) + - Decode Red/BlueBalance from Leica Digilux 2 RAW images (thanks Jens Duttke) + - Changed conversion for Sony A100 Rotation tag to conform to EXIF:Rotation + - Changed decoding of one of the Pentax ExternalFlashBounce tags (thanks + Michael Meissner) + - Extract EncodingProcess, BitsPerSample, ColorComponents and YCbCrSubSampling + from JPEG SOF segment + - Show raw horizontal/vertical widths in the converted YCbCrSubSampling value + - Improved conversion of some Pentax tags (thanks Jens Duttke) + - Avoid loading data blocks larger than 16MB from QuickTime images + - Allow PDF:Keywords to be comma-delimited + - Fixed problem where a tag would be removed from both IFD0 and ExifIFD even + if only IFD0 or ExifIFD was specified + - Fixed problem with byte order mark showing up in output when decoding + hex-encoded Unicode values from PDF images + - Fixed problem where ExifTool could hang when reading corrupted ASF files + - Fixed possible problem with infinite recursion in FlashPix-format files + +July 6, 2007 - Version 6.93 + + - Added read support for BigTIFF images (with extensions BTF, TIF and TIFF) + - Added a number of new Olympus tags and fixed decoding of a few others + (thanks Jens Duttke) + - Added a number of new SigmaRaw tags (found in SD14 X3F images) + - Changed conversion for Canon LensType 152 (used by various Sigma models) + - Fixed problem editing XMP containing new "Camera Raw Saved Settings" + properties (written by Adobe Lightroom) + +June 29, 2007 - Version 6.92 + + - Added read support for FLV (Flash Video) files + - Added read support for EXIF and IPTC and write support for EXIF, IPTC and + XMP in JPEG 2000 images + - Added read/write support for Sinar CS1 raw images + - Added read support for Kodak DCR and K25 raw images + - Added ability to read/write improperly byte-swapped IPTC information + - Added check for infinity value of Casio ObjectDistance + - Added a new Nikon LensID (thanks Bruce Stevens) + - Improved decoding of APP12 "Ducky" segment (thanks Heinrich Giesen) and + added write/create support + - Improved handling of warning messages when setting new values + - Changed print conversion for Olympus PictureModeSaturation, + PictureModeContrast and PictureModeSharpness to label min and max values + - Fixed problem introduced in 6.91 when writing some EPS images + - Fixed group names for Pentax CameraInfo tags + - Fixed bug which could result in negative Canon SerialNumber values + - Fixed decoding of some Canon EOS 1DmkIII custom function values + - Fixed problem copying subdirectories in new-style Olympus maker notes + - Fixed problem of missing last character when decoding ID3 Unicode strings + - Fixed problems decoding some ID3 URL values + - Fixed inconsistency where the -if option may have used a different tag than + the one normally extracted when a group name was specified and multiple + matching tags existed in the group + +June 5, 2007 - Version 6.91 + + - Added support for new XMP-lr, XMP-photoshop and XMP-DICOM tags of PS CS3 + - Added new Sigma lens to Pentax LensID list + - Added a few new Nikon and Canon LensID's (thanks Jens Duttke) + - Added Canon IXY Digital 810 IS to CanonModelID + - Recognize Photoshop "AgHg" resource type + - Removed "warnings" dependency in exiftool application + - Updated XMP:FileSource values to match EXIF:FileSource + - Greatly improved processing speed for some large EPS images + - Improved handling of XMP date/time formatting + - Officially support writing of MEF images + - Applied patch to convert Pentax LensType for changes in K10D firmware 1.2 + - Fixed decoding of Pentax BatteryBodyGripStates (thanks Jens Duttke) + +May 10, 2007 - Version 6.90 (production release) + + - Added CanonModelID values for new PowerShot S5 IS and SD850 IS + - Encode IPTC values in default CodedCharacterSet when writing new values at + the same time as deleting the existing CodedCharacterSet + - Renamed Nikon FirmwareVersion to MakerNoteVersion and Panasonic + FirmwareVersion to ProductionVersion (thanks Jens Duttke) + - Allow EXIF GPS coordinates to be negative when writing (take absolute value) + - Revert "$evalWarning" fix (false alarm) + +May 7, 2007 - Version 6.89 + + - Added support for maker notes of some Hewlett-Packard models + - Decode Pentax ImageProcessing tag + - Fixed problem which gave "$evalWarning" errors on some systems + +May 2, 2007 - Version 6.88 + + - Added read support for Mamiya MEF images + - Implement long overdue change to standardize FocalPlaneResolutionUnit values + - Decode Panasonic BabyAge + some new ShootingMode values (thanks Jens Duttke) + - Improved recognition of maker notes for some camera models + - Fixed bug that could cause an incorrect "tag is not writable" warning + - Fixed problems converting WDP PixelFormat values + - Fixed decoding of Canon 350D AFPointsUsed (thanks Bogdan) + - API Changes: + - Added option to allow makernote block to be extracted without rebuilding + +Apr. 26, 2007 - Version 6.87 + + - Added read/write/delete support for recognized trailers in PSD images + - Added PhotoMechanic IPTC:Prefs tag + - Added ability to decode double-UTF-encoded XMP files + - Added a few more Canon, Pentax and Nikon lens types (thanks Hayo Baan and + Robert Rottmerhusen for Nikon entries) + - Added ability to create new user-defined MIE groups + - Decode a new Nikon lens tag: ExitPupilPosition (thanks Robert Rottmerhusen) + - Increased precision (from 20m to 2mm) when writing XMP GPS coordinates + - Renamed Panasonic SpotMode tag to AFMode and improved decoding + - The -e (Composite) option now also applies when copying tags + - Minor changes to IPTC verbose output and error handling + - Minor changes to a few warning messages + - Avoid converting XMP values as rational or date if tag is known and not + specified with these formats + - Identify CR2 header and Canon MakerNote footer in -htmlDump output + - Reverted change from version 6.85 to once again allow JPEG thumbnails to be + written to TIFF-type images (perfectly valid for many TIFF-based RAW formats + even though it isn't technically correct in a proper TIFF) + - Added test to check for invalid encoding when Image::ExifTool is loaded + - Fixed problem shifting Canon:TimeStamp tag + - Fixed failed FlashPix test on Cygwin Perl 5.8.2 (roundoff errors again) + - Fixed problem where some types of write errors could result in exiftool + reporting that a file was updated when it wasn't + +Apr. 10, 2007 - Version 6.86 + + - Added -execute, -srcfile and -common_args options to allow complex + processing with multiple commands in a single invocation + - Added ability to write Panasonic RAW files + - Added Panasonic ConversionLens tag + - Improved decoding of Panasonic/Leica Contrast and SpotMode tags + - Changed -@ to insert arguments at the current position in the command line + (rather than at the end) + - Once again automatically fix Canon maker note offsets (this feature was + removed in 6.84 due to a bug bug report that turned out to be a false alarm) + - Fixed bug in -if option which could incorrectly cause a failed condition + when using expressions containing multiple tags with proper-case names + - Fixed problem extracting binary data when -if option was used + - Fixed bug which caused error when setting CodedCharacterSet to "UTF8" + - Fixed decoding of InternalSerialNumber for FujiFilm FinePix F40fd + - Fixed problem using "-TAG+<=FMT" or "-TAG-<=FMT" on command line + +Apr. 3, 2007 - Version 6.85 + + - Prevent JPEG thumbnail image from being written to TIFF-type images + - Fixed a couple of problems decoding Canon EOS 1D Mark III tags + - Fixed bug which generated an error message when rewriting maker notes in + Adobe-edited Pentax K10D native DNG images + +Mar. 30, 2007 - Version 6.84 + + - Added a number of new XMP-crs tags, plus new XMP-lr (Adobe Lightroom) group + - No longer automatically fix Canon makernote offsets (but still use makernote + footer if present to calculate recommended fix) + - Fixed problem where some errors were not properly counted in the summary + statistics with the -overwrite_original_in_place option + - Fixed problem parsing XMP shorthand format for values containing '=' symbol + +Mar. 24, 2007 - Version 6.83 + + - Automatically fix corrupted makernote offsets when reading images from Canon + models which include a makernote offset footer + - Added CanonModelID and CameraType values for 2 new Canon DV cameras + - Renamed SPIFF ResolutionUnits tag to ResolutionUnit + - Fixed formatting of GPSTimeStamp value + +Mar. 20, 2007 - Version 6.82 + + - Added read/write support for new Canon EOS-1D Mark III custom functions + - Made a few makernotes warnings minor when writing + - Append "mm" to FocalLengthIn25mmFormat value + - Fixed problem which could cause "uninitialized value" warning when writing + - Fixed problem writing Canon EOS D60 custom functions + +Mar. 17, 2007 - Version 6.81 + + - Added l/u modifiers for lower/uppercase in filename format codes (eg. "%le") + - Added equivalent IXY names to CanonModelID for PowerShot SD750 and SD1000 + - Added a few new Pentax ModelID's (Optio E30, T30, W30, A30) + - Allow non-encrypted Nikon ColorBalance values to be written + - Fixed problem where some encrypted Nikon information was not properly + protected against writing + +Mar. 14, 2007 - Version 6.80 + + - Added Olympus ManometerReading tag + - Added ability to edit private IPTC and XMP information found inside + PhotoshopSettings record of TIFF images + - Renamed NikonShotInfoVers tag to ShotInfoVersion and added + MultiExposureVersion tag + - Search further in MPEG file to look for first audio/video frame headers + - Use default resolution information from JPEG JFIF segment for mandatory EXIF + resolution tags when creating new EXIF segment + - Enhanced %c format code so %+c adds an underline before the copy number + +Mar. 7, 2007 - Version 6.79 + + - Translate special characters in ID3 information when reading + - Improved conversions for GPSTimeStamp and GPSDateStamp when writing so they + can be set from a normal date/time tag (eg. "-gpstimestampDSTTAG") + - Added a few more Canon EasyMode values (thanks Samson Tai) + - Added CanonModelID values for new A450, A460 and A550 + - Changed the -if option so the condition automatically fails if the + expression generates a warning (use -v to show the warning) + - Specified LF character (0x0a) for MIE text newline sequence + - Catch warnings if perldoc doesn't exist when running with no arguments + - Minor tweaks/fixes to htmldump output + +Jan. 19, 2007 - Version 6.70 - "IPTC Character Coding" + + - Translate coded characters in IPTC string values (UTF8 and Latin only), and + assume Latin encoding if no CodedCharacterSet (see FAQ #10 for details) + - Enhanced IPTC:CodedCharacterSet print conversion so "ESC % G" is now printed + as "UTF8" (either may be used when writing) + - Specified ISO 8859-1 character set for MIE ASCII string values + - Added warnings for UTF-8 conversion errors + - Decode a few new Pentax tags + - Decode maker notes in Pentax DNG images + +Jan. 8, 2007 - Version 6.69 + + - Decode information in NikonScanIFD + - Enhanced -p option to allow expressions to be used + - The -p option no longer suppresses error and warning messages + - Made ImageSourceData writable + - Reduced font size of htmldump output + - Fixed "Argument isn't numeric" error when reading an image with a missing + IFD offset + +Jan. 3, 2007 - Version 6.68 + + - Added mechanism to allow Composite tags to be writable + - Recognize XMP sidecar files that begin with a UTF BOM (byte order mark) + - Changed TIFF ImageSourceData tag to a Binary data type + - Fixed problem which could cause warning when writing XMP in PNG images + - Fixed bug when shifting times in an XMP sidecar file that caused an invalid + date/time to be written if the tag didn't previously exist + - Fixed problem where writing to a JPEG image containing a PreviewImage could + report that the file was updated even if nothing was changed + +Dec. 30, 2006 - Version 6.67 - "Adobe DNGPrivateData" + + - Added ability to write MakerNote information written by Adobe DNG Converter + - Added ability to copy Adobe MakerNote and CRW information from DNG images + - Added ability to read/write Adobe CRW and MRW information in DNG images + - Added ability to read Adobe SR2 information in DNG images + - Added a few more Nikon LensID's (thanks Robert Rottmerhusen) + - Added ability to delete a specific MIE document in multi-document files + - Improved handling of tags in multi-document MIE files + - Improved verbose and htmlDump output for unknown JPEG trailers + - Improved handling of ignored minor errors when writing MakerNotes + - Decode Panasonic LensType tag + - Changed description for Canon:OwnerName tag + - Minor changes to HtmlDump output + - Fixed parsing of XMP date/time values with no seconds + +Dec. 20, 2006 - Version 6.66 (production release) + + - Added a few more Pentax K10D PictureMode's (thanks Axel Kellner) + - Added a few new Nikon LensID's and Olympus LensType's + - Added Canon 1D PictureStyle's + - Updated CanonModelID strings for a few new models + - Changed tagID for MIE:GPSDifferential + - Minor change to MIE specification for unknown data formats (MIE 1.1) + +Dec. 15, 2006 - Version 6.65 - "MIE 1.0" + + - Added ability to read/write MIE trailers in JPEG and TIFF images + - Added a number of new MIE tags and changed some existing tags + - Added support for units in MIE values + - Added new Pentax K10D PictureMode's (thanks Axel Kellner) + - Avoid creating non-native groups in MIE, PNG and EPS images unless necessary + - Fixed problem with -P option so it now works when -o option is used + - Fixed bug where 'all' was replaced with '*' in redirection expressions + - Fixed "APP1 segment too large" error when copying all tags from some Canon + CR2 images to a JPEG (fixed initially in 6.08, but broken again in 6.47) + +Dec. 8, 2006 - Version 6.64 + + - Added Nikon ImageAuthentication tag (thanks Jeffrey Friedl) + - Added Canon RecordMode and OpticalZoomCode and Composite DigitalZoom tag + - Applied FocalUnits scaling to Canon ShortFocal, LongFocal and + ScaledFocalLength tags, and renamed ScaledFocalLength to FocalLength + - Allow (but ignore) leading family number on tag group when writing + - Fixed calculation of 35mm scaling factor when Canon digital zoom is applied + - Fixed bug which could cause "'x' outside of string" error when reading Nikon + images with the -U option + +Dec. 6, 2006 - Version 6.63 + + - Changed the sense of the '-' modifier for the new '%c' format code + +Dec. 6, 2006 - Version 6.62 + + - Added '%c' format code to add copy number if output file exists + - Added a couple of new Nikon LensID's (Werner Kober, Robert Rottmerhusen) + - Made -htmlDump tag names purple if actual offset differs from stored offset + +Dec. 4, 2006 - Version 6.61 + + - MakerNotes offsets are now permanently fixed when the makernotes are copied + using -tagsFromFile with the -F option + - Fixed typo in MakerNoteSanyoC4 tag name of MakerNotes shortcut + - Minor improvements to htmldump style + +Dec. 2, 2006 - Version 6.60 + + - Added -k option of stand-alone version to regular distribution + - Fixed bug adding/deleting XMP tags in a list (introduced in 6.50) + - Fixed decoding of Canon 5D LongExposureNoiseReduction + - Fixed problem writing AFCP where incorrect offset could be written + - Fixed bug in -p option which caused it to abort if all tag names were + contained in braces (thanks Joel Becker) + - Stand-alone Windows executable: + - Print application documentation after "No file specified" warning + +Nov. 30, 2006 - Version 6.59 + + - Do not delete IFD1 when deleting all meta information from a TIFF image + - Added a couple of new CanonImageSize values: "Postcard" and "Widescreen" + - Added a few new Olympus LensType's (thanks Lilo Huang for one) + - Improved handling of invalid date values + - Fixed "divide by zero" warning if FocalPlaneXYResolution is "inf" + - Fixed incorrect "unknown trailer" verbose message when writing JPEG images + - Stand-alone Windows executable: + - Allow quoting of options embedded in executable name + +Nov. 25, 2006 - Version 6.58 + + - Added a few more Nikon LensID's (thanks Robert Rottmerhusen) + - Added missing print conversion for RIFF DateTimeOriginal + - Improved HTML 4.01 compliance of -htmlDump output + - Lowered priority of ID3v1 tags so ID3v2 takes precedence if both exist + - Minor change to names of some Vorbis and APE tags + - Made Ogg file type all capitals + - Patched problem which could cause ExifTool to die if input file is corrupt + - Fixed GPSDOP description (GPS Dilution of Precision, thanks Greg Troxel) + - Fixed problem which could generate a run-time error when attempting to write + to a corrupted JPEG image + - API Changes: + - GetFileType() may now also be used to return a file description + +Nov. 19, 2006 - Version 6.57 (production release) + + - Missing tags in -p and redirection expressions are now set to an empty + string ('') by default, or a dash ('-') if the -f option is used + - Added ability to use %f,%d,%e tokens in "-TAG<=FILE" argument + - Added new Nikon LensID (thanks Werner Kober) + - Set missing tags to '' instead of '-' in redirected expressions if -m used + - Renamed LV tag to LightValue + - Improved decoding of Sony DSLR-A100 maker notes + - Attempted to clarify date/time shift documentation in Shift.pl + - Fixed bug which could result in CanonVRD information not being recognized + - Fixed bug in new SetResourceName feature of user-defined Photoshop tags + - First release of stand-alone Windows executable + - API Changes: + - Added MissingTagValue option + +Nov. 15, 2006 - Version 6.56 - "Audio Update" + + - Added read support for a number of audio file formats: Ogg Vorbis, + Ogg FLAC, FLAC, APE (Monkey's Audio) and MPC (Musepack) + - Improved parsing of ID3 v2.3 and v2.4 information + - Added a number of new Pentax *istD tags (thanks Douglas O'Brien) + - Added ability to print processed file names when writing (-v0 option) + - Patched problem with makernotes offsets in Sanyo C4 images + - Fixed problem that prevented some Olympus RAW files from being written + - Fixed bug where XMP values could be improperly converted as a rational + +Nov. 8, 2006 - Version 6.55 + + - Added read/write support for Canon VRD (Recipe Data) files and trailers + - Changed name of CanonDPP module and group to CanonVRD + +Nov. 3, 2006 - Version 6.54 + + - Added write support for ORF (Olympus RAW) images + - Added Panasonic TravelDay tag (thanks Marcel Coenen) + - Show Photoshop resource block names in verbose output, and preserve these + names when copying tags from file + - Changed write format of Nikon WhiteBalanceFineTune from int16u to int16s + (thanks Giridhar Appaji Nag) + - Allow Flags to be used in UserDefined tags + - Added trailer signature to MIE format specification + - Fixed problem with the -list and -listw options (dynamically loaded tags + weren't appearing in the list) + +Nov. 1, 2006 - Version 6.53 + + - IMPORTANT: Fixed bug introduced in 6.51 which could result in a corrupted + image (!!) when rewriting TIFF-format files containing an unknown trailer + (this includes all TIFF-based RAW formats except CR2). The good news is + that unknown trailers should be very uncommon, and nobody has reported any + problems yet, so with any luck I caught this before it affected anyone. But + please update immediately to 6.53 if you downloaded 6.51 or 6.52. + +Nov. 1, 2006 - Version 6.52 + + - Added read/write support for trailers in CRW images + - Dropped historic support for obsolete -group# option + +Oct. 31, 2006 - Version 6.51 - "Trailer Update" + + - Improved handling of trailers in JPEG and TIFF-format images: + - Added read/write support for PhotoMechanic and FotoStation trailers + - Recognize and handle Canon DPP trailers + - Added AFCP trailer read/write support for TIFF (previously JPEG only) + - Added ability to read/write multiple trailers in the same image + - Trailers are now dumped with verbose and htmlDump options + - Trailers are now deleted when deleting all tags + - Added ability to delete trailers individually by group or altogether + with "-Trailer:all=" + - Changed reading/writing XMP in PNG images to conform with XMP specification + (but continue to support the XMP profile format used previously) + - Avoid writing duplicate XMP tags in less common namespaces + - More consistent handling of unknown IPTC tags + - Added -listd option to list deletable groups + - IPTC time-only tags may now be set from date/time values (this already + worked for date-only tags) + - Fixed problem rewriting international text (iTXt) chunks in PNG images + - API Changes: + - Added GetDeleteGroups() routine + +Oct. 26, 2006 - Version 6.50 + + - Changed name of new "-eval" option to "-if" + - Added read support for PhotoStudio Unicode comment (thanks Dec Anisimov) + - Recognize the "PHUT" Photoshop IRB resource type (thanks Dec Anisimov) + - Extract PhotoshopBGRThumbnail image from Photoshop information + - Write PNG compressed text for new tags when -z option is used + - Added ability to write PNG:ModifyDate + - Don't print Olympus LensType "release" if used to differentiate lenses + - Changed TagName documentation to show actual format written instead of + format used to interpret the data (which differs only for a few odd tags) + - Fixed bug in PNG writer which could cause duplicate tags to be written + - Fixed minor problem in HtmlDump output + - Fixed logic bug when writing XMP using += or -= + +Oct. 21, 2006 - Version 6.49 + + - Added -eval option for conditional batch processing [changed to -if in 6.50] + - Allow .ExifTool_config file to be placed in application directory + - Decode copyright information from JPEG APP12 "Ducky" segment + - Decode Casio FirmwareDate + - Added IFD0 ProcessingSoftware tag (0x000b, written by ACD Systems) + - Added print conversion for InteropIndex + - Write InteropVersion automatically when creating a new InteropIFD + - Made RelatedImageFileFormat writable + - Protect all InteropIFD tags from being copied by default with -TagsFromFile + - Renamed XMP ExifImageHeight to ExifImageLength (to correspond with EXIF tag) + +Oct. 19, 2006 - Version 6.48 + + - Decode Minolta 7D FlashExposureComp (thanks Jeffery Small) + - Decode InternalSerialNumber from newer FujiFilm models + - Improved decoding of new Pentax PictureMode tag (thanks Doug O'Brien) + - Updated CustomFunctions in Canon CRW images and recognize CIFF extension + - Added a couple new Pentax LensType's (thanks Barney Garrett) + - Changed "AdobeRGB" to "Adobe RGB" in all ColorSpace values for consistency + - Fixed bug in recent update to extract large preview from Epson JPEG images + - Fixed problem in -htmldump output introduced in 6.46 + - Various documentation improvements and updates + +Oct. 15, 2006 - Version 6.47 + + - Decode JPEG APP6 "EPPIM" segment used in Toshiba images + - Process PICT images to extract JPEG preview when -u option is used + - Added OtherImage composite tag + - Added PentaxModelID for K110D and a new K110D PictureMode tag + - Fixed problem extracting CoverArt from some MP4 audio files + - Fixed problem decoding Canon BulbDuration (affects Composite ShutterSpeed) + - Fixed problem reading/writing large Epson preview image in R-D1 JPEG images + and allow large (>64kB) preview images for all make/models + +Oct. 11, 2006 - Version 6.46 + + - The "-ext" option now overrides internal file selection rules + - Expand filename wildcards on Windows command line (thanks Marjolein Katsma) + - Enhanced warnings when copying information to a specific tag + - Changed family 0 group name: GPS->EXIF + - Changed family 1 group names: APP12->PictureInfo,GraphicConverter->GraphConv + - Added a couple of new Pentax LensType's + - Added JPEG.pm module (mainly for documentation purposes) + - Fixed bug when re-writing NEF files which caused new preview image written + by Nikon Capture 4.4.0 to be lost + - Fixed bug which could cause problems if a user-defined composite tag is + created with the same name as an existing tag + +Oct. 6, 2006 - Version 6.45 + + - Added ability to create JFIF segment + - Decode information in JPEG APP8 "SPIFF", APP12 "Ducky", and APP15 + GraphicConverter segments + - Improved html dump feature to dump all JPEG APP segments + - Decode maker notes in FujiFilm AVI videos + - Renamed Nikon AFMode tag to AFAreaMode (thanks Tobias Briseno) + - Changed "Image Quality" description to "Quality" + - Added option to allow the htmlDump base offset to be specified + - Changed EV tag name to LV since this is technically more correct + - Print warnings if syntax problems are found in .ExifTool_config file + - Use HOMEDRIVE and HOMEPATH (Windows cmd shell environment variables) for + .ExifTool_config path if neither EXIFTOOL_HOME nor HOME are available + - Fixed some problems which were causing failed tests when using ActivePerl + - User-defined Composite tags now override composite tags of the same name + - Added a few more PentaxModelID's (K10D, A20, M20, W20) + +Oct. 2, 2006 - Version 6.44 + + - Now deletes all JPEG APP segments when deleting all information + - Decode Ricoh APP5 RMETA information (custom fields in Caplio Pro G3 images) + - Decode AVI Audio/Video stream headers + - Recognize and preserve PhotoMechanic trailer when editing TIFF-based images + - Added ability to delete JFIF, CIFF, Meta and FlashPix groups + - Added ability to exclude groups when deleting all information + - Added a number of new Canon, Nikon, Pentax, Sony and Minolta tags + - Added description for GPSDOP tag (GPS Degree Of Precision) + +Sept. 26, 2006 - Version 6.43 + + - Added read support for M4A audio files + - Simplified and documented technique for adding user-defined Composite tags + - Issue minor warning when a tag used in an expression doesn't exist, instead + of silently inserting a '-' (use -m option for previous behaviour) + +Sept. 21, 2006 - Version 6.42 (production release) + + - Re-worked Sony and Minolta LensID lists and added a number of new lenses + - Extract maker note information from Sanyo MOV and MP4 videos + - Recognize ARW extension of Sony Alpha-100 RAW images + - Improved extraction of PreviewImage from damaged Minolta images + +Sept. 18, 2006 - Version 6.41 + + - Fixed calculation of Canon ISO in some images and renamed ShotISO to BaseISO + - Minor improvement to order of operations when deleting multiple groups and + adding back information in batch mode + +Sept. 14, 2006 - Version 6.40 + + - Added ability to delete a group and write back information in one step + - Compatibility Warning: This changes previous behaviour when adding and + deleting information in the same operation if new tag values are set + after a group has been flagged for deletion + - Fixed problem writing to specific MIE groups + - Minor improvements to verbose output while writing + - Added a few new CanonModelID's (PowerShot G7, SD900, SD800IS, SD40) + +Sept. 12, 2006 - Version 6.37 + + - Decode Sony LensID's (thanks Thomas Bodenmann) + - Added another Canon LensType + - Added shortcut MakerNotes tag to represent the maker notes tags from all + manufacturers (useful when copying tags between files) + - Improved MPEG decoding and calculate approx. Duration based on avg. bitrate + - Issue a minor error when rewriting an empty IFD (previously this was fatal) + - Print 2 decimal points of MeasuredEV (avoids round-off errors resulting in + failed tests on some systems) + +Sept. 6, 2006 - Version 6.36 (production release) + + - Added a few more Canon LensType's + - Improved decoding of Canon 400D ExposureTime and FileNumber + - Decode AFPointsUsed for PowerShot models with 9 AF points + - Fixed decoding of Canon 5D PictureStyle + +Sept. 5, 2006 - Version 6.35 + + - Added Canon NumAFPoints tag + - Added support for Canon 400D custom functions + - Renamed Canon AFPointsUsed20D to AFPointsUsed and decode for 30D and 400D + - Changed phrasing in a text string to bypass bug in rpm build causing it to + obtain incorrect dependencies + +Sept. 3, 2006 - Version 6.34 + + - Removed empirical offset from Canon:MeasuredEV + +Sept. 1, 2006 - Version 6.33 + + - Added Composite:EV and Canon:MeasuredEV tags [comments welcome] + +Sept. 1, 2006 - Version 6.32 + + - Decode a new value of "Auto High" for Canon CameraISO + - Added new Canon AutoISO tag, renamed Canon:ISO tag to ShotISO, and added a + new composite ISO tag to give the ISO that was actually used + - Decode CanonModelID's for recently announced Canon cameras (400D, etc) + - Decode PentaxModelID for Optio S7 + - XMP Changes: + - Added support for rdf:nodeID attribute in XMP information + - Changed XMP file MIME type from application/xmp to application/rdf+xml + to correspond with XMP specification + - Write 'rdf:about' instead of 'about' (unqualified use now deprecated) + - Don't write blank-line padding (as per XMP spec) for .XMP files + - Fixed problem extracting XMP information from some EPS files + - Fixed typos in some (not commonly used) XMP namespace URI's + - Fixed FocalLength conversion for some Pentax-built BenQ and Samsung models + +Aug. 23, 2006 - Version 6.31 + + - Decode a number of new values for FujiFilm PictureMode (thanks Michael + Meissner) + - Properly parse AVI DateTimeOriginal tag when month name is all capitals + - Improved compatibility when running "exiftool" with no arguments (thanks + Jesse Zhang) + - Added support for Nikon D80 lens information and recognize a new lens + (thanks Robert Rottmerhusen) + - Improvements to Pentax maker note decoding (thanks Ger Vermeulen) + - Fixed problem when extracting information from image in memory when the + UTF-8 flag is set for the image data (fixes install on RHEL 3) + +July 28, 2006 - Version 6.30 + + - Added ability to read/write APP0 CIFF segment (found in Canon PowerShot A5 + and PowerShot Pro 70 images) + - Improved decoding of Canon 30D FileNumber (was ShutterCount) + - Made EXIF tags ImageNumber and ImageHistory writable + - Fixed decoding of TargetExposureTime for Canon 20D/250D and ExposureTime + for Kiss Digital N + - Fixed problem processing GIF images which don't contain a color table + - Fixed bug in EXIF tag name documentation introduced in 6.12 where ExifIFD + group was not properly shown + - Fixed typo in exiftool pod documentation ("GROUP:TAG" was reversed) + +July 24, 2006 - Version 6.29 (production release) + + - Added XMP-xmpMM:PreservedFileName tag (used by Photoshop CS) + - Fixed problem reading TIFF images which don't start at the beginning of the + file + +July 12, 2006 - Version 6.28 + + - Fixed bug introduced in 6.04 which prevented PNG tags from being deleted + - Improved decoding of Canon PictureStyle information + +July 7, 2006 - Version 6.27 + + - Decode a number of new tags in Canon, Casio, FujiFilm, Minolta, Nikon, + Panasonic, Pentax, Ricoh and Sony and maker notes + - Improved recognition of various Minolta maker note formats + - Added a number of new Nikon Capture tags + - Added support for XML-formatted XMP files + - Properly handle mixed linefeed characters in PostScript images + - Improved formatting of DICOM date/time values + - Added "Actual Offset" entry to HtmlDump tooltip information + +June 27, 2006 - Version 6.26 + + - Avoid creating new SubIFD when copying all tags with "-all:all" from a RAW + or TIFF image (this gave problems if image was subsequently edited by PSCS2) + - Fixed decoding of a few Nikon LensID strings + - Minor fixes and changes to htmlDump and verbose output + - Added a new Pentax LensType (thanks Kazumichi Kawabata) + +June 19, 2006 - Version 6.25 + + - Added read/write support for WDP (Windows Media Photo) images + - Improved algorithm to recognize maker notes offsets which need fixing + - Properly handle maker notes which have value offsets relative to the + individual IFD entries (Kyocera, Rollei and some Konica and Toshiba models) + - Decode a couple of new Sigma lens values in Canon LensType + - Decreased block size for buffered files to improve performance over slow + pipes + +June 9, 2006 - Version 6.24 + + - Added -fast option to avoid scanning to the end of JPEG images to check for + an AFCP or PreviewImage trailer + - Recognize PS files which start with %!Adobe-PS instead of %!PS + - Improved FlashPix verbose output + - API Changes: + - Added FastScan option + +June 7, 2006 - Version 6.23 + + - Added new feature allowing tag-name expressions to be used with the + -TagsFromFile option + +June 5, 2006 - Version 6.22 + + - Added read support for FPX (FlashPix) images and FPXR (FlashPix Ready) + JPEG APP2 meta information + - Added AllDates shortcut tag to allow DateTimeOriginal, CreateDate and + ModifyDate to all be written via a single tag + - Added shortcuts to tag name documentation + - Return "0000:00:00 00:00:00" instead of "1970:01:01 00:00:00" as the string + representation of numerical times with a value of zero + +May 26, 2006 - Version 6.21 + + - Changed CR2 identification logic to properly identify CR2 images which have + been edited by PhotoMechanic + +May 24, 2006 - Version 6.20 + + - Added read support for Real audio/video (RA, RM, RV, RMVB, RAM, RPM) files + - Downgraded "Error reading value..." message from an error to a warning + - Fixed bug where IgnoreMinorErrors option could get set when writing images + with NikonCapture information + - Fixed two ID3 tag names which contained spaces + - Fixed problem parsing DateTimeOriginal in Casio EX-Z30 AVI files (thanks + Joachim Loehr) + - Fixed problem with apostrophes in HTML documentation for some browsers + - API Changes: + - Can now call Options() with undefined value to set option value to undef + +May 16, 2006 - Version 6.19 + + - Added read support for SWF (Shockwave Flash) files + +May 15, 2006 - Version 6.18 + + - Added read support for MPEG audio/video files + - Decode audio information in MP3 files + - Print Nikon:LensPosition in hex + +May 12, 2006 - Version 6.17 (production release) + + - Fixed problem with rpmbuild on Mandriva 2006.0 (thanks Niels Kristian) + - Fixed typo in iptc2xmp.args and xmp2iptc.args which prevented the XMP + Instructions from being copied properly (thanks Mark Tate) + - Handle byte order mark in unicode EXIF strings + +May 8, 2006 - Version 6.16 + + - Write %ADO_ContainsXMP comment when adding XMP to EPS images + - Don't issue DSC warning when writing Adobe version 3.1 EPS images + - Added separate table for decoding tags in IFD0 of Panasonic RAW images + - Improvements to Nikon AF point decoding (thanks Roger Larsson) + - Allow .ExifTool_config directory to be specified by setting the + EXIFTOOL_HOME environment variable + - Made all maker note write errors minor so they can be ignored if necessary, + allowing information to be written to images with corrupted maker notes + - Minor change to perl-Image-ExifTool.spec to fix problem with rpmbuild + (thanks Volker Kuhlmann) + - Fixed bug which could cause incorrect date to be calculated when shifting + date/time values + +Apr. 20, 2006 - Version 6.15 + + - Changes to MIE specification involving string lists and alternate languages + +Apr. 18, 2006 - Version 6.14 + + - Fixed some problems with EPS writer and removed beta testing status (thanks + to Tim Kordick for help with testing) + - Created new MIE meta information format [Note: The MIE module is fully + functional but the MIE format specification is still in development] + - Added print conversion for SpatialFrequencyResponse + - Extended meaning of -z option when writing to allow compressed information + to be written to MIE files + - Added Minolta FlashMetering tag + - API Changes: + - Added 'Compress' option + +Apr. 9, 2006 - Version 6.13 + + - Fixed problem with writing FileName that caused format codes not to be + properly expanded if the specified filename already existed + - Standardized reported FileType for ACR, AIFC, CRW, JP2, PS and PSD files + - Allow 2 values to be written for EXIF TimeZoneOffset and make EXIF + SecurityClassification writable + +Apr. 5, 2006 - Version 6.12 + + - Avoid printing garbage for DNG maker note information that was not copied + properly by the Adobe DNG converter (affects converted ORF images) + - Disabled "Possibly incorrect maker notes offsets" warning for a number of + Olympus models + - Fixed bug introduced in 6.04 which could cause endless loop (eeek!) when + writing tags with PostScript equivalents + - Fixed error reading some DICOM images + +Apr. 3, 2006 - Version 6.11 + + - Added a few new Pentax LensType's + - Fixed bug rewriting MOS images (this bug introduced in version 5.95 caused + an error message and prevented the file from being rewritten) + +Mar. 31, 2006 - Version 6.10 + + - Added ability to use filename format codes %d, %f and %e in values written + to FileName and Directory tags + - Fixed problem of odd filenames being generated when setting FileName from an + invalid date/time tag + - Removed debugging print statement forgotten in Olympus code of 6.07 (oops) + - API Changes: + - Added StrictDate option + +Mar. 30, 2006 - Version 6.09 + + - Made FileName and Directory writable (enabling a whole new functionality!) + - Added ability to write DOS-style EPS images [Note: still in beta testing] + - Increased precision of Composite Red/BlueBalance print conversion + - When combining the -o and -overwrite_original options, the original file is + now erased if the new file is written successfully + - Added a new Nikon lens (thanks Werner Kober) + - API Changes: + - Added SetFileName() routine + - In list context, CountNewValues() now also returns a "pseudo" tag count + +Mar. 25, 2006 - Version 6.08 + + - Made YCbCrCoefficients and YCbCrPositioning protected when writing + - Decode some new Nikon-specific tags in QuickTime videos from Nikon cameras + - Calculate Red/BlueBalance for Olympus images + - Fixed "APP1 segment too large" problem when copying all tags from Canon + EOS-5D or EOS-30D CR2 image to JPEG image + - Fixed problem running "exiftool" with no arguments in Windows cmd shell + +Mar. 22, 2006 - Version 6.07 + + - Added a number of new Olympus tags (thanks Frank Ledwon) + - Decode Adobe JPEG APP14 segment (thanks Didier Giet) + - Made Rotation writable in CRW images + - Changed some FujiFilm WhiteBalance strings + - No longer return multiple tags when a group is specified unless the + duplicates option is enabled or the group name is 'all' or '*' + +Mar. 20, 2006 - Version 6.06 + + - Added validity check for Canon FocalPlaneX/YSize which resulted in incorrect + values of FocalLength35efl being calculated for some PowerShot models + - Made Opto-ElectricConvFactor value binary + +Mar. 18, 2006 - Version 6.05 + + - Improved JPEG writer to tolerate any segment ordering + - Fixed Olympus ExtenderStatus to work with E-330 (thanks Mark Dapoz) + +Mar. 15, 2006 - Version 6.04 + + - Added write support for EPS and PS images [Note: still in beta testing -- + must currently use the -m option to enable writing to EPS images] + - Added ability to write ICC_Profile data as a block + - Added read/write support for ICC and ICM color profile files + - Added read/write support for ERF (Epson Raw Format) images + - Added a couple of new Olympus tags and LensType's (thanks Mark Dapoz) + - Added ability to scan past unknown header to find JPEG or TIFF image + - Added Canon EOS 30D custom functions + - Renamed Panasonic SerialNumber tag to InternalSerialNumber + - Renamed Canon 5D PictureNumber tag to ImageNumber + - Improved MRW reading and writing + - Decode a number of new Minolta tags and changed names of some existing tags + - Decode some type-specific data in ASF StreamProperties, including video + ImageWidth and ImageHeight + - Extract a few more PostScript tags and derive ImageWidth and ImageHeight for + PostScript documents + - Some improvements to Panasonic decoding (thanks Tels) + - API Changes: + - 'Unsafe' tags are now copied by SetNewValuesFromFile() if specified + explicitly + - Internal Changes: + - SubDirectory tags are no longer Writable by default in WRITABLE tables + +Mar. 2, 2006 - Version 6.03 + + - Added print conversion for CFAPlaneColor + - Decode CFAPattern as written incorrectly in ASCII by some Panasonic cameras + - Added recently announced Canon cameras to CanonModelID list + - API Changes: + - Added ability to prefix tag name with group in arguments to ImageInfo() + (read/write symmetry is now improved since this feature already existed + in the write routines, and now group names can be used in shortcuts) + - Changed order of filtering for Group# option and tag exclusions to be + applied after extracting tags specified in calls to ImageInfo() + +Feb. 26, 2006 - Version 6.02 + + - Fixed problem rewriting Photoshop IRB resources as written by some + applications (eg. PixVue) + - Improved decoding of AVI files to increase speed and extract more tags + - Added -overwrite_original_in_place option + - Added a number of new XMP tags and bring XMP support up to new + specification, plus a few undocumented XMP-aux tags (thanks Lou Salkind) + - Added support for large DNG preview image (with JpgFromRaw tag) + - Added ability to decode DNG Adobe MakerNotes + - Added SEMInfo tag (thanks Robert Mucke) + - Decode (but don't rewrite) old PS APP13 "Adobe_Photoshop2.5:" segment + +Feb. 20, 2006 - Version 6.01 + + - Added back RedBalance and BlueBalance as composite tags + - Fixed potential problem in File::RandomAccess which could cause a "substr + outside of string" warning + +Feb. 19, 2006 - Version 6.00 (production release) + + - Added read support for Sony SR2 raw images (but most tags still unknown) + - Added read support for Kyocera Contax N Digital RAW images + - Added ability to write or delete shortcuts which reference multiple tags + (previously only shortcuts referencing a single tag were writable) + - Changed descriptions of FNumber, ExposureTime, ISO, DateTimeOriginal, + CreateDate and ModifyDate to more closely match their tag names + - Separated Canon and Nikon Red/BlueBalance information into individual + components with tag names like WB_RGGBLevels + - Decoded a number of new Canon tags for EOS models, including ColorBalance + tables, 20D AF points and SensorInfo (thanks Rainer Honle) + - Fixed incorrect decoding of EOS 10D/300D color balance modes + - More additions and minor fixes to Canon decoding + - Made EOS-1D personal functions writable + - Added ability to write bitmasks at the PrintConv level + - Set MIME type for all RAW image formats to "image/x-raw" + - The -f option is no longer implied when -S and -s are combined + - Fixed bug introduced in 5.99 which broke the "-tagsFromFile @" feature + - Fixed problem with offsets in verbose dump of CRW images + - Fixed problem with some tags in Canon images not printing without -a option + - Fixed problem with validation of Canon PictureInfo for images rotated by + Canon ZoomBrowser EX (thanks Joshua Bixby) + +Feb. 1, 2006 - Version 5.99 + + - Major additions to Canon maker note decoding, including EOS-1D personal + functions (thanks Rainer Honle for decoding many 5D tags) + - Added Canon maker note footer when rewriting Canon maker notes + - Attempt to fix problem where ScaleFactor35efl was calculated incorrectly for + some Canon images + - Reduce memory usage and speed up writing of large TIFF images + - Fixed problem with binary data offsets in verbose dump + - Fixed problem writing Comment if 'File' group specified + - Fixed bug which could cause formatting error in htmlDump output + +Jan. 22, 2006 - Version 5.98 + + - Enhanced FMT syntax for -o, -w and -tagsFromFile options + - Decode maker notes of Samsung DX-1S + - Added ability to list tags in a specific group + - Recognize maker notes of a few more Kodak models + - Added a few more Canon LensType's + - Added missing semicolons in HtmlDump JavaScript output + +Jan. 16, 2006 - Version 5.97 + + - Added support for Canon 5D custom functions (thanks Rainer Honle) + - Added support for Canon 1DmkII and 350D custom functions + - General fixes and improvements to Canon custom functions + - Renamed ICC_Profile Copyright to ProfileCopyright + - Report all extraction errors when copying only specified tags from file + - Avoid issuing "Error rebuilding maker notes" warning when copying maker + notes that don't require rebuilding + +Jan. 14, 2006 - Version 5.96 + + - Fixed problem where XMP information could be lost when writing PSD images + +Jan. 12, 2006 - Version 5.95 + + - Decode AIFF SampleRate + - Fixed problem where FileType was being set twice for AIFF files + - Patched problem reading some file types through Windows cmd shell pipeline + - Properly identify CR2 images read via pipes (previously identified as TIFF) + - Improved formatting of printed values for some DNG tags + - Fixed problem with EXIF format of some tags when writing + - Changed 'rational' format names to match full bit size of value + +Jan. 10, 2006 - Version 5.94 + + - Fixed problem extracting OriginalRawImage from little-endian DNG images + - Fixed problem where "unreferenced bytes" error could be incorrectly issued + when deleting all EXIF from a TIFF image + +Jan. 9, 2006 - Version 5.93 + + - Added ability to write JFIF information + +Jan. 9, 2006 - Version 5.92 + + - Added ability to extract and decompress original raw image from DNG + - Fixed problem extracting information from some image types in pipelines + - Decode more information in PSD images + +Jan. 7, 2006 - Version 5.91 + + - Added write support for PSD images + - Made a couple more Photoshop tags writable + +Jan. 6, 2006 - Version 5.90 + + - Added read support for AIFF audio files + - Made Photoshop:XResolution and Photoshop:YResolution writable + - Fixed problem with processing some RIFF files + - Added a new Canon LensType + - API Changes: + - SetNewValue() now accepts an ARRAY reference for setting list-type tags + such as Keywords, or a SCALAR reference for binary data, so it may now + be called directly with any value returned by GetValue(). + +Jan. 3, 2006 - Version 5.89 + + - Recognize Panasonic Type 2 maker notes + - Changed Nikon LensID to a composite tag to allow better decoding of + non-Nikon lenses, and added a bunch of new lenses to the list + +Jan. 1, 2006 - Version 5.88 + + - Added ability to read and write AFCP information in JPEG images + - Added read support for WMV video and WMA audio files (ASF format files) + - Added EXIF tags 0x82a5-0x82ac + - Fixed TagID of IntergraphPacketData tag + - Fixed problem in rewriting some types of JVC maker notes + - Renamed WAV module to RIFF + +Dec. 22, 2005 - Version 5.87 (production release) + + - Added support for JVC maker notes + - Extract a number of new DNG tags plus DNG JPEG preview image + - Renamed DNGCameraSerialNumber tag to CameraSerialNumber + +Dec. 20, 2005 - Version 5.86 + + - Added support for AVI and MP4 videos + - Improved decoding of Olympus maker notes + - Improved APP12 decoding + - Improved CanonPictureInfo validation to work with more PowerShot models + - Display Canon 1D serial numbers with 6 digits + - Decode maker notes of Nikon D1 + - Combining -t with -S now gives a single-line tab-delimited list of values + - Extract preview image for Samsung Digimax i5 + +Dec. 13, 2005 - Version 5.85 + + - Added ability to read and write XMP files which don't have an xpacket header + - Fixed problem deleting entire XMP data block using '-xmp=' syntax + - More minor HtmlDump improvements + +Dec. 12, 2005 - Version 5.84 + + - Minor improvements to HtmlDump output + +Dec. 12, 2005 - Version 5.83 + + - Added -F option to allow maker notes offsets to be fixed + - Added -htmlDump option to generate a verbose HTML-based hex dump of EXIF + and/or TIFF information (cool new diagnostic tool) + - Attempt to validate maker notes offsets and issue warning if they look wrong + - Fixed problem rewriting PreviewImage in some Olympus and Pentax images + - Increased speed for extracting large preview images + - Improved synthetic maker notes when coping tags from CRW file + - Display absolute offsets for EXIF values in very very verbose mode + - Verbose option output is now written to file if -w option used + - Speed up rewriting of some TIFF images when using ActivePerl 5.8.x for + Windows (image strips are now copied in a single block if they are + contiguous in the file to avoid ActivePerl bug which causes extremely poor + performance when concatenating a large number of memory blocks) + - Added a couple of new Nikon and Pentax lens ID's (thanks Robert Rottmerhusen + and David Buret) + - Decode PrintIM information in Casio QV-4000 + - Fixed Decoding of Canon EOS D60 serial numbers to agree with Canon utilities + - API Changes: + - Added HtmlDump and TextOut options + +Nov. 26, 2005 - Version 5.82 + + - Fixed bug which caused error rewriting Minolta MRW images + - Added MRW write test + - Improved MRW verbose output + +Nov. 24, 2005 - Version 5.81 + + - Changed writing of TIFF so that existing IPTC will be rewritten as int32u + whenever IPTC is edited, regardless of original format type. This allows + files to be 'fixed' even if IPTC was previously another format (now we get + to see if there is any software out there that barfs on int32u's...) + - Changed the -s option so tag names are displayed instead of descriptions + (now similar to the -S option, but values are aligned in a column) + - Remove padding at the end of IPTC record when writing + - Fixed problem which was generating a warning with ActivePerl 5.6.1 + +Nov. 22, 2005 - Version 5.80 + + - Changed writing of new TIFF IPTC information to make it visible in Nikon + Capture (for some reason requires int32u format) + - Installed patch for building of ExifTool RPMS on Mandriva Linux (thanks + Niels Kristian) + +Nov. 22, 2005 - Version 5.79 + + - Fixed problem which could render XMP information unreadable by Photoshop + when editing some XMP written by Photoshop CS2 + +Nov. 21, 2005 - Version 5.78 + + - Fixed problem which could generate an error when adding IFD1 to an image + +Nov. 18, 2005 - Version 5.77 (production release) + + - Allow integer tag values to be specified in hex (with leading '0x') + - Fixed problem which generated warnings about symbol "@indent" in Nikon.pm + when using older versions of Perl (observed with 5.6.1) + +Nov. 16, 2005 - Version 5.76 + + - Tolerate extra null padding at end of TIFF images (as written by Photoshop + CS) when rewriting TIFF images + - Minor improvements to DICOM image processing + - Updated FAQ + +Nov. 14, 2005 - Version 5.75 + + - Fixed problem decompressing deflated DICOM images + +Nov. 14, 2005 - Version 5.74 + + - Added read support for DICOM (DCM, DC3, DIC, DICM) and ACR-NEMA (ACR) + medical image files + - Decode a lot more Nikon Capture information and add write ability + - Updated Nikon makernote decoding for D200 and new AF-S Nikkor 18-200 lens + (thanks Werner Kober) + - Added a number of new Canon LensType's (thanks Volker Gering) + - Recognize file types even if they have the wrong extension + +Nov. 7, 2005 - Version 5.73 + + - Added ability to shift date/time tag values + - Extract Red/BlueBalance tags for Nikon D2Hs, D50 and D2X + - Decode Nikon Capture Data to extract IPTC information and Rotation + - Added a new Olympus LensType (thanks Michael Meissner) + +Oct. 28, 2005 - Version 5.72 + + - Added ability to create XMP data files. This is more significant than it + sounds: The -o option may now be used to generate XMP files from + information in any other format, or even to create an XMP file from nothing + more than tags defined on the command line. + - Added printout of number of directories created with -w and -o options + - Improved error handling + - Effectively set preferred group to 'XMP' when writing XMP data files + - Fixed problem rewriting maker notes of some Pentax cameras + - API Changes: + - Added CanWrite() and CanCreate() functions + - Allow WriteInfo() source file to be undefined to create new file + - Allow WriteInfo() output file to be undefined to edit file in place + - Added extra argument to WriteInfo() to specify output file type + +Oct. 24, 2005 - Version 5.71 + + - Added ability to read/write .XMP data files + - Added -listf option to print list of recognized file types + - Changed "-group#" option to "-listg#" (but still support old -group#) + - Moved Kodak APP3 "Meta" tags from EXIF to a new Kodak "Meta" group + +Oct. 23, 2005 - Version 5.70 + + - Significant internal changes to improve speed and reduce memory usage + - Fixed a bug introduced in version 5.63 which caused incorrect XMP GPS + coordinates to be returned + - Changed handling of Kodak date records + - API Changes: + - Added ability to access original 'Raw' values via GetValue() + - GetValue() now returns empty array in list context if value is undefined + - Values are now converted as they are requested, so the PrintConv option + now applies to GetInfo() and GetValue() instead of ExtractInfo() + +Oct. 19, 2005 - Version 5.69 + + - Changed UTF-8 bug fix introduced in 5.67 to improve portability and allow it + to work with Perl versions back to 5.6 + - Changed some offsets in verbose output from relative to absolute addressing + - Improved APP12 decoding + - Changed technique for rounding off extracted rational values + - API Changes: + - Changed handling of floating point numbers to tolerate locales where a + comma is used instead of a decimal point + +Oct. 17, 2005 - Version 5.68 + + - Added support for reading Sigma RAW (X3F) images + +Oct. 13, 2005 - Version 5.67 (production release) + + - Added support for reading PICT images + - Fixed a problem when writing information via the ExifTool API if using Perl + 5.8 or later and passing a UTF-8 encoded string to SetNewValue(). The + problem generated an error which prevented the file from being written + - Fixed timezone problem in timestamps of QuickTime images which was causing + a failed test + +Oct. 10, 2005 - Version 5.66 + + - Enhanced -tagsFromFile option to allow %d, %f and %e in filenames + - Extract a few more tags from Canon EOS 5D images + - Allow multiple ICC_Profiles to be extracted from same image and add a number + to the group1 name for subsequent profiles to make the tag locations unique + - Changed Photoshop PixelsPerInchX/Y and QuickTime DotsPerInchX/Y tag names to + X/YResolution. Neither has a corresponding ResolutionUnit tag, so inches + should be assumed if no resolution unit is present + - Added tests of Nikon, Sony and PDF decryption algorithms + +Oct. 7, 2005 - Version 5.65 + + - Added read support for QuickTime MOV videos (and QTIF images if anyone + cares) + - Extract maker note information from Sony SRF raw images + - Improved Jpeg2000 decoding + - Decode a few more Photoshop tags + - Issue an error if there is extra data after the normal end of file when + rewriting TIFF images (avoids possible data loss if attempting to write an + unsupported RAW image with a TIFF-like data structure) + - Added ability to replace existing tags with user defined tags + - Denote minor errors/warnings by adding '[minor]' to the message (these are + the errors which can be ignored with the -m option) + - Fixed problem of missing LeafSubIFD when rewriting MOS images + - Removed hack to write Leaf maker note information at start of image + +Sept. 30, 2005 - Version 5.64 + + - Improved writing of Canon CR2 images to preserve CR2 header and editing + information written by Canon Digital Photo Professional software + - Extract information from JPEG APP0 JFIF segments + - Added support for extracting Creo Leaf meta information from MOS images + - Added ability to define new tags in .ExifTool_config file and added a sample + ExifTool_config file to the distribution + - Extended the -w option to allow an expression to be specified + - Allow tag aliases to be used when writing + - Changed print conversion of FileSize tag + - Internal changes to tag lookup to improve speed when writing information + - Decode Photoshop resolution information + +Sept. 21, 2005 - Version 5.63 + + - Added read support for MP3 and WAV audio files (Oops... ExifTool has + expanded beyond its "Image" roots!) + - Added write support for PNG and MRW (Minolta RAW) images + - Improved decoding of PNG profile information and added a few new PNG tags + - Changes to handling of GPS coordinates: + - Added -c (CoordFormat) option to format output of GPS coordinates + - Added GPSPosition composite tag + - GPS coordinates now show as decimal degrees with the -n option + - Much more flexible about the input coordinate format when writing + - Enforce proper formatting of XMP GPS coordinates + - Added XMP-xmp Rating and Label tags, and a few missing XMP-exif GPS tags + - Added new XMP-dex group + - Added two new lenses to the Minolta LensID list (thanks Pedro Corte-Real) + - Added a new lens to the Olympus list (thanks Shingo Noguchi) + +Sept. 7, 2005 - Version 5.62 + + - Fixed problem reading FujiFilm maker notes from RAF images + - Extract comments from PPM/PGM/PBM images and add write support + - Extract maker notes from Nikon Coolscan scanner images + +Sept. 3, 2005 - Version 5.61 + + - Added read support for PBM, PGM and PPM file formats + - Added read support for RAF (FujiFilm RAW) file format + +Sept. 2, 2005 - Version 5.60 + + - Fixed bug where tag was deleted if TAG+=VALUE used for a non-list type tag + - Fixed problem where reading some CRW files could generate a "Use of + uninitialized value in concatenation" warning + - Restructured XMP to separate tags by namespace + - Added XMP-xmpTPg, XMP-cc, XMP-xmpPLUS and XMP-PixelLive groups + - Improved logic for editing XMP list-type tags + - Removed SubDirectory tags from -list option output + - More updates to Pentax LensType list + - Changed Nikon FileSystemVersion tag name to FirmwareVersion + - Added NikonCaptureData and NikonCaptureVersion tags + +Aug. 24, 2005 - Version 5.55 (production release) + + - Added patch to fix word ordering when unpacking doubles on ARM systems with + little-endian byte order but big-endian word order (thanks Riku Voipio) + - Added another lens to the Pentax LensType list + +Aug. 22, 2005 - Version 5.54 + + - Fixed problem introduced in version 5.50 which broke ability to delete + groups of information + - Added a couple of new Pentax LensType's + - Renamed Olympus Lens tag to LensType + +July 29, 2005 - Version 5.53 + + - Added -ext option to allow files to be processed or excluded from processing + based on their extension + - Added MimeType tag + - Convert PDF UTF-16 character strings to UTF-8 (or Windows Latin1 if '-L' + option used) + +July 28, 2005 - Version 5.52 + + - Removed warning message when writing CR2 files that was intended only for + Canon 1D TIFF files + +July 27, 2005 - Version 5.51 + + - Assume '-TagsFromFile @' for any redirected tags (eg. '-SRCTAG>DSTTAG' or + '-DSTTAGTAG' + - Recognize some more Nikon lenses + - API Changes: + - Added ByteOrder option to specify byte ordering when creating new EXIF + segment in a JPEG file + +June 3, 2005 - Version 5.25 (production release) + + - Fixed problem with writing IPTC Time tags + - Changed Composite ShutterSpeed to ignore bulb duration if it is negative + - API Changes: + - Allow tag name to be prefixed by group in calls to SetNewValue() + +June 1, 2005 - Version 5.24 + + - Added new "XMP" tag to allow read/write of XMP data as a block + - Added numbers to subsequent SubIFD group names to allow tags in various + SubIFD's to be accessed individually + - Give priority to tags in full resolution image (whichever TIFF directory + this is in) + - Renamed ExifData tag to EXIF (but didn't make it writable as a block like + XMP) + - Recognize maker notes from more Konica Minolta cameras + - Extract PreviewImage for Samsung Digimax V700, Kenox V10 and Digimax V10 + - Changed validation of CanonPictureInfo to work with more PowerShot cameras + (Note: for these cameras, CanonImageHeightAsShot may not be meaningful) + - Added a number of new IPTC ApplicationRecord tags + - Added Nikon ExposureDifference tag + - Removed trailing white space in values printed by exiftool + +May 27, 2005 - Version 5.23 + + - Changed behaviour of -tagsfromfile slightly so that '-GROUP:TAG>DSTTAG' now + commutes information between different groups unless a destination group is + specified + - Improved reliability of calculating offsets in Pentax maker notes + +May 26, 2005 - Version 5.22 + + - Fixed problem with new '-tagsFromFile @' feature which occurred when + simultaneously copying tags and writing new values to multiple target files + (the new values were only getting written to the first file) + +May 25, 2005 - Version 5.21 + + - Allow target file to be specified by '@' with -TagsFromFile option + - Fixed bug which caused internal error when using -TagsFromFile option to + copy PrintIM information to a file that already contained PrintIM data + - Fixed problem which broke the (now deprecated) -allTagsFromFile=FILE syntax + - Fixed problem decoding Pentax Date for some Optio cameras + - Fixed problem in GeoTiff decoding which could cause some tags to be missed + - Decode a number of new Pentax tags (using my new Optio WP!) + - Made Photoshop URL writable + - Limit length of JPEG segment dump at Verbose=4, and add Verbose=5 level + - API Changes: + - Added SaveNewValues() and RestoreNewValues() + +May 20, 2005 - Version 5.20 + + - Give names to many Photoshop tags, but leave them marked as 'Unknown' so + they aren't extracted under normal circumstances (must use the -u option) + - Read/write Kyocera maker notes properly (although Kyocera information + remains unknown) + - Changed installation tests to tolerate rounding-off errors or format + differences in floating point numbers + +May 17, 2005 - Version 5.19 + + - Added -overwrite_original option + +May 16, 2005 - Version 5.18 (production release) + + - Added -@ option and two utility files (iptc2xmp.args and xmp2iptc.args) to + use with this option for translating between IPTC and XMP tag names + - Disable normal console output if -v option used and no tags specified + - Repair incorrect first byte of MRW preview images when extracting + - More tweaking of -TagsFromFile order of operations + +May 14, 2005 - Version 5.17 + + - Allow 'All' to be used as a group name with '-TagsFromFile' option to + preserve original tag groups (eg. '-all:all') + - PrintIM information is now copied with -TagsFromFile + - Decode EXIF:Gamma tag + - Decode Canon 350D FileNumber + - Made a few more tags writable + - Don't rewrite TIFF files which could be Canon 1D RAW files since this + format currently isn't supported (can use the -m option to write anyway, + which will remove the RAW image data if this is a 1D file) + - Don't add null terminator to UserComment, GPSProcessingMethod or + GPSAreaInformation + - Improved logic for handling command line tag names and exclusions, + especially when associated with the -TagsFromFile option + +May 10, 2005 - Version 5.16 + + - Decode a number of new Nikon lens-related tags (thanks again Robert + Rottmerhusen) + - Various other improvements + +May 7, 2005 - Version 5.15 + + - Added powerful new information redirection feature to -TagsFromFile option + - Added writable File:FileModifyDate tag which represents the filesystem + date/time of last modification + - Allow '*' to also be used as well as 'all' to represent all tags, although + this feature is not documented for the command-line options because 'all' is + more convenient since '*' must be quoted to prevent shell globbing + +May 5, 2005 - Version 5.11 + + - Fixed problem where the proper tags weren't excluded from being extracted if + -GROUP:All and --TAG options are used together on the command line + +May 5, 2005 - Version 5.10 + + - Changed -AllTagsFromFile option to -TagsFromFile and allow copied tags to be + specified on the command line. (-AllTagsFromFile is preserved as an alias + to -TagsFromFile for backward compatibility.) + - Allow -GROUP:All and --GROUP:All on command line to extract or exclude all + tags in specified group + - Allow family 1 group names to be used when deleting groups with -GROUP:All= + - Added composite CFAPattern derived from CFARepeatPatternDim and CFAPattern2 + - Fixed problem where tags which can exist in both IFD0 and ExifIFD weren't + being properly removed from one IFD when written to the other + - Added FAQ + +May 2, 2005 - Version 5.06 + + - Made a few more EXIF tags writable + - No longer add null-terminator to JPEG comment (was confusing xv) + +Apr. 20, 2005 - Version 5.05 (production release) + + - Added Nikon LensFStops tag (thanks to Robert Rottmerhusen) + - Reliability improvements for writing maker notes information + - exiftool now returns error status if there were errors reading/writing files + +Apr. 18, 2005 - Version 5.04 + + - Fixed problem where maker notes of Olympus C2500L could get corrupted when + writing + +Apr. 18, 2005 - Version 5.03 + + - ExifTool now requires Perl version 5.004 or higher (previously 5.002 was OK) + - Restrict the size of preview images where data is referenced directly as + the value data of an IFD entry (only affects Casio images) + - Fixed problems rewriting some Casio maker notes + - Change priority of orientation (and a number of other tags which may appear + in IFD1) so value in IFD0 takes precedence of value in IFD1 if it exists + - API Changes: + - Allow any file reference, not only GLOB references, to be used in + function calls + +Apr. 16, 2005 - Version 5.02 + + - Fixed problem rewriting Pentax *istD preview image + +Apr. 15, 2005 - Version 5.01 + + - Major speed improvements for writing large JPEG files with preview images + - Fixed problem rewriting preview in Olympus E-1 and E-300 images + - Old large preview is now properly removed when writing new small preview + - Allow PreviewImage to be deleted (ie. set length to zero) + - Don't extract images that have zero length + - Deleting MakerNotes group now works in conjunction with -allTagsFromFile + - Change image validation again to only validate images for tags that were + specifically requested + - Separate lookups by manufacturer for Olympus lens information + +Apr. 14, 2005 - Version 5.00 + + - ALL MAJOR PLANNED WRITING FEATURES NOW IMPLEMENTED! + - Finally solved problem of writing large preview images in JPEG files + - -AllTagsFromFile now sets PreviewImage to 'dummy' if it exists in the maker + notes to avoid writing a large preview to the destination file (now you have + to do this manually afterwards if this is what you want) + - Fixed problem rewriting Olympus E1 maker note subdirectories + - Only validate extracted images when Binary (-b) option is used + - Rename Olympus PreviewImageAvailable to PreviewImageValid, and check/set + this tag when reading/writing the preview image + - Change priority of X/YResolution tags so IFD0 value takes precedence + - Changes to Olympus Lens decoding + +Apr. 11, 2005 - Version 4.95 + + - Added ability to delete all meta information, or all information in a group + - Create some mandatory IPTC tags automatically when writing IPTC information + - Decoded a bunch more Olympus tags (thanks to Frank Ledwon) + - Decoded a couple more Canon 1D MkII tags (thanks to Denny Priebe) + - Fixed problem where Sony maker notes could be corrupted when rewriting file + - Fixed problem that could cause wrong tag description to be printed for + missing tags when the -f option is used + - Account for different encoding of Canon ExposureTime in 20D and 350D, and + lower priority of Canon ExposureTime and FNumber so regular EXIF values take + precedence because it appears these values may be model dependent (I hate it + when that happens) + +Apr. 6, 2005 - Version 4.94 + + - Added support for Kodak DX3215 and DX3700 + - Improved Kodak decoding and changed some Kodak tag names + - Improved logic to guard against cyclical recursion in EXIF directories + - Allow tags to be edited in IFD2, IFD3, etc... + - Patched problem when writing Canon 350D images due to probable bug in 350D + firmware (version 1.0.1) that writes an incorrect ThumbnailLength in IFD1 + +Apr. 2, 2005 - Version 4.93 (production release) + + - Added IPTC XMP Core support + - Added support for Kodak CX4200 plus other minor Kodak changes + - Made Kodak maker notes writable + - Minor changes to Olympus tag names and decoding + - Split HTML TagNames documentation into separate files + +Mar. 31, 2005 - Version 4.92 + + - Added support for Kodak and Ricoh cameras + - Decode still more Olympus E-1/E-300 tags (thanks Markku Hanninen) + - Added 'Directory' tag + - Decode a few more Pentax tags (thanks to John Francis) + - Allow newlines in tag values on command line when writing + - Fixed problem rewriting makernotes with sub directories (eg. Olympus) + +Mar. 28, 2005 - Version 4.91 + + - Decode yet more Olympus E-1/E-300 tags (thanks Markku Hanninen) + - Changed decoding of Olympus E-300 Quality tag + - Patched bug in Olympus maker notes that was causing ExifTool to report an + error when reading ORF files + - Fixed problem where strings weren't being properly truncated at the null + terminator if there was a newline after the terminator + - Improved decoding for some Nikon tags (thanks Tom Christiansen) + - Added Nikon shortcut + - Added composite SubSecDateTimeOriginal tag + - Fixed problem where CRW file without file extension wasn't being identified + properly + - Fixed problem extracting thumbnail from some (specifically Olympus) images + - Changed verbose output to always show original EXIF format + - Skip over EXIF entries with unknown format instead of aborting (while + reading only) + - Recognize TIFF field type 13 + +Mar. 24, 2005 - Version 4.90 + + - Extract Olympus PreviewImage, and decode a bunch more Olympus tags + - Improvements to documentation + +Mar. 23, 2005 - Version 4.89 + + - Decode subdirectories in Olympus maker notes (now much more information is + extracted for E-1 and E-300 cameras, although most is still unknown) + +Mar. 22, 2005 - Version 4.88 + + - Convert exiftool help to POD format + +Mar. 15, 2005 - Version 4.87 (production release) + + - Added notes to TagNames documentation + +Mar. 11, 2005 - Version 4.86 + + - Extract PreviewImage from CR2 files + - Create mandatory GPS tags when adding new GPS directory + - Bring IPTC newsphoto support up to spec (as if anyone uses this crap) + - Fixed problem when setting 8-bit integer IPTC values + +Mar. 10, 2005 - Version 4.85 + + - Create most mandatory EXIF entries automatically when a new EXIF directory + is created + - Fixed problem which caused an error when adding XMP information to a TIFF + file which didn't previously contain XMP + - Made '=' optional with -AllTagsFromFile option + - Fixed problem with verbose dump of zero-length directory (eg. Sony F717 + maker notes) + +Mar. 9, 2005 - Version 4.84 + + - Interpret Olympus ImageQuality of 6 as RAW + - Remove validation of TIFF identifier to allow forward compatibility with + untested RAW file formats (ORF files in particular seem to fiddle with this + identifier) + +Mar. 8, 2005 - Version 4.83 + + - Extract ThumbnailImage from Canon CRW files written by some cameras + - Recognize ORF files from Olympus C5060WZ (and hopefully some others too!) + +Mar. 7, 2005 - Version 4.82 + + - Made a number of new EXIF tags writable, but classify them as 'unsafe' so + they aren't copied over with the -AllTagsFromFile option + - Recognize a number of new and very uncommon EXIF tags + - Remove copy number from tag name when using the -S option + - Interpret Photoshop XMP:ColorSpace value of 4294967295 as 'Uncalibrated' + +Mar. 4, 2005 - Version 4.81 + + - Added user-definable shortcuts + - Fixed problem with XMP:Identifier (should have existed in both XMP-dc and + XMP-xmp) + +Mar. 2, 2005 - Version 4.80 + + - The -n option now prints binary data values as "Binary data #### bytes" + - API Changes: (NOTE: Change in API behaviour for binary data values) + - Changed returned ValueConv values so that binary data is now returned as + a SCALAR reference, the same as with PrintConv values + +Mar. 1, 2005 - Version 4.73 (production release) + + - Minor changes to XMP parsing to increase speed and improve validation + +Feb. 28, 2005 - Version 4.72 + + - Extract info from UTF-16 and UTF-32 encoded XMP + - Convert EXIF text fields if encoded in Unicode + - Fixed a few incorrect XP character translation codes + - Fixed name of Nikon ColorBalanceD2H tag + +Feb. 25, 2005 - Version 4.71 + + - Fixed bug introduced in 4.70 which caused error when transferring + information using -AllTagsFromFile from a RAW file to a JPEG file + +Feb. 24, 2005 - Version 4.70 + + - Allow family 1 group name to be specified for any tag while writing + - Fixed problem with writing Nikon PreviewImage to NEF files + +Feb. 23, 2005 - Version 4.67 + + - Added -L option to allow XP characters to be converted to Latin character + set instead of UTF-8. (Now XP characters can be displayed properly in + terminal windows which use either the UTF-8 or WinLatin1 character set.) + - Make JpgFromRaw image writable in Nikon NEF files + +Feb. 21, 2005 - Version 4.66 + + - Recognize JPEG 2000 XMP UUID information + - Extract Meta information from JPEG APP3 + - Yet more playing with XP characters (this has been a learning process for + me). Now special characters show up properly in my OSX terminal window, and + the reverse translation works so now they get written properly as well (for + Perl 5.6.1 or greater anyway... Earlier versions don't have the required + UTF-8 support to handle these special characters) + - Improvements to TagNames documentation (including changing format names to + make them more consistent across different types of meta information) + +Feb. 18, 2005 - Version 4.65 + + - Fixed problem in translating XP characters + +Feb. 17, 2005 - Version 4.64 (production release) + + - Added new tag name documentation (replaces old tag lists) + - Made a few more DNG tags writable + +Feb. 15, 2005 - Version 4.63 + + - Remove null terminators in ICC_Profile 'desc' strings + - Treat Olympus CameraID as a string (why wasn't it written this way?) + - Added print conversion for EXIF:CFAPattern + +Feb. 14, 2005 - Version 4.62 + + - Convert XPTitle, XPComment, XPKeywords etc from XP character codes and add + write support for these tags + - Decode JPEG 2000 Resolution, Label and URL information + - Another try at patching 3 digit exponent situation which causes failed tests + on MSWin32-x86 + - Removed .J2K from recognized extensions (since apparently this is a raw JP2 + codestream, and doesn't contain any metadata that ExifTool can extract) + +Feb. 14, 2005 - Version 4.61 + + - Don't print filename line when -p option used + - JPEG 2000 improvements + - Also recognize .JPX and .J2K extensions + +Feb. 11, 2005 - Version 4.60 + + - Added support for reading the JPEG 2000 (.JP2) files + - Improved warnings on errors while setting tag values + +Feb. 10, 2005 - Version 4.54 + + - Added ColorTemperature tag for many Canon models + - Added AutoRotate for Canon 10D and 300D + - Lowered priority of Nikon ISO so that EXIF ISO is used instead if both exist + - Changed names of PentaxISO and Casio ISOSetting to ISO, and lowered priority + as with Nikon ISO + - Made Photoshop EXIF Camera RAW tags writable + +Feb. 7, 2005 - Version 4.53 (production release) + + - Added FileNumber for Canon 20D (decoded by Juha Eskelinen) + - Removed CanonA0Tag + +Feb. 4, 2005 - Version 4.52 + + - Added another CanonRaw test + - Changes to Canon CRW documentation + +Feb. 4, 2005 - Version 4.51 + + - Finally found documentation for Canon CRW files (CIFF format)!! + - Changed CanonRaw to bring code up to CIFF specification + - Added a bunch more CanonRaw tags + - Updated Canon CRW documentation + +Feb. 2, 2005 - Version 4.50 + + - Allow writing to specific IFD + - Allow permanent tags (eg. MakerNotes tags) 'deleted' by setting them to an + empty string if '' is a valid value for the tag + - Added test for rewriting Nikon D70 information + - Added missing inverse conversion routines for GPS tags (now they are all + writable) + - Decoded a few more Canon and CanonRaw tags + - Added -z option to extract information from images in compressed files + - Improved CanonRaw verbose output + - Remove garbage after null terminator in CanonRaw string-type tags + +Jan. 30, 2005 - Version 4.45 + + - Added a few more Canon tags + - Fixed bug with divide by zero error (in Perl, '0.0' is a true value -- doh!) + +Jan. 30, 2005 - Version 4.44 + + - Sort entries in synthesized Canon MakerNotes directory + - Interpret Canon custom functions for models other than 10D in CRW files + +Jan. 29, 2005 - Version 4.43 + + - Synthesize Canon MakerNotes information when using -allTagsFromFile for a + CRW file + - Decode WhiteBalance table in Canon maker notes + - Rename CanonRaw CanonFileType tag to CanonImageType + +Jan. 28, 2005 - Version 4.42 + + - Fixed problem where multiple IPTC tags could be created if replacing + specific IPTC tag values with 'TAG-=VALUE' + - Made EXIF SceneType writable + - Renamed Nikon ISOUsed tag to ISO + - Added documentation of Canon RAW (CRW) file format + +Jan. 27, 2005 - Version 4.41 + + - Added write support for Canon exposure parameters + - Change validation of CanonPictureInfo to get it working for Canon 20D + +Jan. 26, 2005 - Version 4.40 + + - Added ability to write Canon RAW (CRW) files. With this format you aren't + allowed to add or delete any new tags (just as with the MakerNotes), except + for JpgFromRaw, which I like to be able to delete to save disk space + - Added validation of JpgFromRaw images + - Relax filtering on non-ASCII characters by exiftool script to allow + high-ASCII characters to be printed + - Changed the tense of Orientation values to try to make the meaning more + clear. This tag can be a bit confusing. It gives the rotation that must be + applied to the image to view it properly (hence the rotation of the camera + when the picture was taken). + - Patched problem which was causing failed tests on some platforms (floating + point format has 3 digits in exponent on Perl 5.8.5 MSWin32-x86, grrrr...) + - API Changes: + - Added 'Compact' option to not write blank padding as per XMP and IPTC + specs + +Jan. 24, 2005 - Version 4.36 (production release) + + - Added support for reading Olympus Raw Format (ORF) + +Jan. 23, 2005 - Version 4.35 + + - Moved a couple of the informational warnings to verbose mode + - Suppress warnings an non-critical errors with -m option + - Made a few more of the EXIF tags writable + - Made model-dependent tags Pentax FocalLength and Olympus Quality writable + - Added ability to write CanonCustom tags + - Added range check for integer values + +Jan. 21, 2005 - Version 4.34 + + - Fixed problem when writing Canon maker notes with -allTagsFromFile + - Added -o option to write to different file or directory + - Added handler to clean up temporary file on Ctrl-C + - Re-wrote routine to rationalize floating point values (it is slower now, but + produces much prettier fractions) + - Other minor improvements to writer code + +Jan. 19, 2005 - Version 4.33 + + - Added check at higher level and return warning if trying to delete + information from maker notes + - Make GPS latitude and longitude a bit more flexible about the format they + accept when writing + - Updates to documentation + +Jan. 19, 2005 - Version 4.32 + + - Now rewrites Casio EX-Z3 maker notes properly (well, not actually + 'properly', but the way they were written in the first place, which is + wrong) + - Added warning when writing information if original IFD entries were not in + the proper sequence, which is a violation of EXIF specs. (And surprise, + you'll never guess who does this too... Yup, the EX-Z3.) + - Fixed parsing problem with GPSProcessingMethod and GPSAreaInformation + - No longer truncates 'undef' values at first null character + - Changed all DataDump tags to binary data types + - Changed some warning messages + - Documented the -m option (it's now official, even though it's been there + since version 4.10) + - Added some more writer tests + +Jan. 18, 2005 - Version 4.31 + + - Now also copies over preview image in Nikon NEF files + +Jan. 18, 2005 - Version 4.30 + + - Now copies over preview images in EXIF data (large, external previews still + not copied) + - Account for funny offsets in Casio EX-Z3 maker notes while extracting data + (but haven't figured out how to handle them when writing) + - Fixed bug introduced in 4.20 that broke extraction of Canon PreviewImage + +Jan. 17, 2005 - Version 4.23 + + - Improve handling of unrecognized maker notes when writing + +Jan. 17, 2005 - Version 4.22 + + - Added check in -AllTagsFromFile to test for pointers in the maker notes + directory running outside the maker notes data. If they do, a warning is + issued and the maker notes are rebuilt properly before copying. + - Fixed problem which could corrupt some values when editing maker notes + +Jan. 17, 2005 - Version 4.21 + + - Added Olympus Red/BlueBalance + +Jan. 17, 2005 - Version 4.20 + + - Added ability to edit MakerNotes! + - Added more validation when writing IPTC information + - Fixed display of Nikon FlashExposureComp for negative values + - Fixed problem where the large JPEG image in Nikon and Pentax raw files was + misidentified as the ThumbnailImage. It is now extracted as JpgFromRaw. + This allows all 3 JPEG images contained in Pentax PEF files to be extracted: + ThumbnailImage, PreviewImage and JpgFromRaw. + - Fixed problem on systems that use backslashes in directory names that + prevented exiftool from finding its libraries if not installed + - Changed many Pentax tag names to remove "Pentax" prefix and conform more to + the other tag names (moving information between files of different formats + is much easier if tags have standardized names): + - PentaxPictureMode => PictureMode + - PentaxFocusMode => FocusMode + - PentaxWhiteBalance => WhiteBalance + - PentaxAEMetering => MeteringMode + - PentaxFocalLength => FocalLength + - PentaxZoom => DigitalZoom + - PentaxSaturation => Saturation + - PentaxContrast => Contrast + - PentaxSharpness => Sharpness + - Fixed FocalLength conversion for Pentax Optio S + - Fixed printout of Nikon FileSystemVersion for older Nikon models + - More improvements to reliabilty of preview image extraction + - Fixed Quality for Olympus E-1 + +Jan. 12, 2005 - Version 4.15 + + - Added Pentax LensType and RawImageSize tags + - Change printing of some unknown values to hexadecimal + - Now recognizes Nikon PEF files + - More reliable extraction of preview and thumbnail images, particularly for + the various models of Pentax cameras + - Added decoding of the Canon 20D custom functions and a new Canon20D shortcut + (thanks to Christian Koller) + - Improved write logic for EXIF information + - Improved logic in determining byte ordering of maker notes + +Jan. 10, 2005 - Version 4.14 + + - Fixed problem introduced in 4.13 that messed up new 4.12 features. doh. + (and added test to keep this from happening again!). + - No longer store bad directory data as a tag (dump in verbose output instead) + +Jan. 9, 2005 - Version 4.13 + + - Added check on size of new ThumbnailImage so ExifTool doesn't try to write + an image that is too large (>60k) into the JPEG EXIF APP1 segment + +Jan. 9, 2005 - Version 4.12 + + - -AllTagsFromFile option now copies over the maker notes + - Changed some misleading warning messages + +Jan. 8, 2005 - Version 4.11 + + - Improved validation of tag values with -AllTagsFromFile option + +Jan. 7, 2005 - Version 4.10 + + - Added ability to write EXIF, IPTC and XMP tags in JPEG and TIFF files! + - Allow Photoshop APP13 data to span multiple segments (read and write) + - Added -TAG+=VALUE, -TAG-=VALUE and -TAG<=VALUE syntaxes + - Added -GROUP:TAG syntax to allow tag group to be specified + - Added powerful -AllTagsFromFile=SRCFILE option to copy all tags from file + - Added -listw option to list all writable tags + - Added -E option to escape output values for HTML + - Fixed -w option to only replace extension after last '.' in filename if more + than one '.' + - Unescape XMP character codes when extracting values (and escape again when + writing) + - Now processes all IFD's of TIFF imags (not just IFD0) + - Added data length check in hex dump of verbose option + - Allow group name to be specified as prefix to tag name on command line + - Renamed a few Nikon tags: FlashExposureComp to FlashExposureBracketValue, + FEC to FlashExposureComp, and ShutterReleaseMode to ShootingMode + - Extract Nikon preview image + - Changed descriptions for Aperture and Shutter Speed to drop the Av/Tv + Canonism + - Improved logic to recognize more types of unknown maker notes + - Recognize a couple more values of the Canon WhiteBalance tag + - Renamed IPTC 'SupplementalCategory' to 'SupplementalCategories' + - Handle timezone in times + - API Changes: + - Fixed problem where first tag name passed to GetInfo() was ignored + - The values returned by ImageInfo() and GetInfo() may contain array + references to indicate lists of values if PrintConv is disabled + - Added a bunch of new stuff... + +Dec. 15, 2004 - Version 4.05 + + - Added a couple of Nikon tags (thanks Brian Ristuccia) + - Now preserves original file by renaming to "NAME_original" when writing + information + - Don't preserve file time by default when writing. Added -P option to do + this. + - Changes to spec file + +Dec. 11, 2004 - Version 4.04 + + - Fixed problem which could corrupt JPEG images when adding comments (Note: if + done, the damage can reversed by removing the comments with the same version + of ExifTool that added them.) + +Dec. 6, 2004 - Version 4.03 + + - Major overhaul of verbose message output + - Change -v option to allow verbose level to be specified (eg. -v3 = very very + verbose) + - Added a new Nikon tag (thanks Thomas Walter) + - Count images which were unchanged when writing tags + - Changed FileType 'JPG' to 'JPEG' + +Dec. 2, 2004 - Version 4.02 + + - Fixed problem with rewriting some JPEG images + - Preserve original file modification time when updating tags in a file + - Report of number of files updated + - API Changes: + - Changed arguments of WriteInfo() and allow scalar and file references to + be used + +Dec. 1, 2004 - Version 4.01 + + - Changed -o option to -w to avoid confusion since we now write image files + too + - Added warning if specified image file doesn't exist + +Dec. 1, 2004 - Version 4.00 + + - Started down the road of adding write support: + - Allow writing of Comment tag to JPEG and GIF files + - API for write functions still under development and is likely to change + - Clean up formatting of Nikon string tags (fix case and remove trailing + spaces) + +Nov. 30, 2004 - Version 3.96 + + - Changed JPEG read routine to speed things up a bit + - Added a few more ICC_Profile tags + +Nov. 25, 2004 - Version 3.95 + + - Improved compatibility with old Perl versions (now runs, albeit with + warnings, on 5.003) + +Nov. 25, 2004 - Version 3.94 (production release) + + - Patched problem with reading XMP data using Perl 5.6.x (Perl bug) + - Put lib directory first in exiftool include list to take precedence over + installed versions + - Continue trying to parse JPEG image after an unrecognized APP1 segment + +Nov. 24, 2004 - Version 3.93 (production release) + + - Final round of ICC_Profile updates + - Increase precision of extracted rational values + - Internal Changes: + - Build in better support for all data formats + - Standardize data format names + - Clean up and streamline data read routine + +Nov. 22, 2004 - Version 3.92 + + - Fixed problem with -p option when multiple files are specified + - Enhancements to ICC_Profile information, including extracting information + from profile header + - Subdivide ICC_Profile group in family 1 + - Added Minolta ImageStabilization tag + +Nov. 20, 2004 - Version 3.91 + + - Fixed problem where some tags were not extracted properly from Canon CR2 + files + - Internal Changes: + - Cleaned up and simplified pointer calculations and dirInfo members + +Nov. 20, 2004 - Version 3.90 + + - Extract information from ICC Profiles + - Extract undocumented IFD0 Photoshop tags + - Added support for Minolta RAW (MRW) file format + - Added support for Konica-Minolta cameras + - Improved decoding for Minolta maker notes + - Extract (the sometimes misleading) EXIF WhiteBalance tag even if + WhiteBalance was extracted from the maker notes if the Duplicates option is + set. (Previously it was only extracted as an Unknown tag in this case.) + - API Changes: + - Return list of all tags in image if GetFoundTags() or GetTagList() are + called before ImageInfo() or GetInfo() + +Nov. 15, 2004 - Version 3.85 + + - Extract a couple more Photoshop tags (including PhotoshopQuality) + - All XMP lists now comma separated (previously, 'alt' lists were separated by + '|') + - API Changes: + - GetValue() now returns reference to array if values form a list and + ValueConv is specified + +Nov. 12, 2004 - Version 3.84 + + - Added test of GetTagID() + - Fixed bug in GetTagID() which was causing special tags to get overwritten + +Nov. 12, 2004 - Version 3.83 + + - Added -D and -H command line options + - API Changes: + - Added GetTagID() + +Nov. 11, 2004 - Version 3.82 (production release) + + - Improved diagnostic output for failed tests in installation + +Nov. 11, 2004 - Version 3.81 + + - Updated Olympus module to also support Epson cameras + - Moved MakerNotes code into separate module + - Added tests for Sony and Unknown maker notes + +Nov. 10, 2004 - Version 3.80 + + - Added support for Panasonic/Leica cameras + - Updated Pentax module to also support Asahi cameras + - Decode a couple more Minolta camera model types + +Nov. 4, 2004 - Version 3.74 (production release) + + - Properly localize $_ in public Image::ExifTool subroutines + +Nov. 3, 2004 - Version 3.73 + + - Changes to tests to avoid false failures on MSWin32-x86-multi-thread 4.0 + +Nov. 1, 2004 - Version 3.72 (production release) + + - Fixed minor bug in generation of family 1 XMP group names + - Changes to Photoshop family 2 groups + +Oct. 30, 2004 - Version 3.71 + + - Switched group families 0 and 1 so the general location is now the default + - Fixed bug when sorting by order of group for any family other than 0 + - Added test 17 to ExifTool.t + +Oct. 29, 2004 - Version 3.70 + + - Major improvements to XMP parsing + - Divided XMP group in family 0 based on the XMP namespace prefix + - Changed a few long tables to binary type + - Recognize some new YCbCrSubSampling values + - Display DNG LocalizedCameraModel in plain text + - Patched problem in FileSource reported by Sigma cameras + - Added information about tag format to verbose hex dump + +Oct. 22, 2004 - Version 3.61 + + - Added support for DNG file format + - Added and updated a number of EXIF tags for FAX and other uncommon images + - Added Photoshop URL tag + - Attempt to extract image from files with unrecognized extensions assuming + TIFF format + - Added "Image format error" if the image type is recognized but the format is + bad + - Changed "Unknown file type" error to "Unknown image type" + - Moved POD documentation into separate .pod files + - Started referencing sources for tag definitions in the source code + +Oct. 1, 2004 - Version 3.60 (production release) - initial CPAN release! + + - Changed group family 0 to divide EXIF group into individual IFD groups + - Fixed typos in some Casio tag names + - API Changes: + - Changed name of File::RandomAccessFile to File::RandomAccess + - Changed default setting of Duplicates to 1 + +Sept. 21, 2004 - Version 3.51 + + - Improvements to interpretation of Nikon D70 ISO settings + +Sept. 16, 2004 - Version 3.50 + + - Fixed problem with duplicate tags showing up without the -a option + - Changed Nikon DataDump to a binary type + - Added D70Boring shortcut + +Sept. 14, 2004 - Version 3.49 + + - Changed installation to also install the 'exiftool' script + +Sept. 13, 2004 - Version 3.48 + + - Changed UserComment to skip first 8 bytes since the comments come after an 8 + byte character code + +Sept. 10, 2004 - Version 3.47 + + - Added support for second type of Casio maker notes (MakerNoteCasio2) + +Sept. 1, 2004 - Version 3.46 + + - Fixed minor bug in PrintConv of FileNumber for CanonRaw files + +June 3, 2004 - Version 3.45 + + - Recognize Canon 1D Mk II raw files (.CR2) + (Note: Not properly decoding maker notes from these files yet) + +May 28, 2004 - Version 3.44 + + - Improved validity check of Sony maker notes + +May 18, 2004 - Version 3.43 + + - A couple more changes to the Nikon maker notes + +May 17, 2004 - Version 3.42 + + - Additions to Nikon maker notes for values derived from D70 + +Apr. 28, 2004 - Version 3.41 + + - Fixed some errors when running on older Perl versions + +Apr. 7, 2004 - Version 3.40 + + - Try to extract data from unrecognized maker notes (assuming standard EXIF + format) + - Added tests for different maker notes + +Apr. 6, 2004 - Version 3.37 + + - Added support for Sigma maker notes + - Remember to add new files to MANIFEST so they get included in release. Doh + +Apr. 6, 2004 - Version 3.36 + + - Added support for Sanyo and Minolta maker notes + - Added skeleton for interpreting Sony maker notes + - Interpret Pentax PrintIM + +Apr. 6, 2004 - Version 3.35 + + - Added support for Nikon PrintIM + - Changed names of duplicate EXIF tags + +Apr. 5, 2004 - Version 3.34 + + - Added all missing tag definitions from TIFF 6 standard + - Added a few more EXIF tag definitions + - Interpret PrintIM IFD + - Fixed interpretation of Interoperability IFD + - Fixed potential endless loop bug introduced in version 3.33 + +Apr. 5, 2004 - Version 3.33 + + - Parse SubIFD of Nikon NEF file (now extracts raw image size and thumbnail + image) + +Apr. 2, 2004 - Version 3.32 + + - Changes to some Nikon tag names + - Added Nikon Saturation + - Documentation improvements + +Mar. 31, 2004 - Version 3.31 + + - Now recognizes NEF (Nikon Electronic image Format) files + +Mar. 29, 2004 - Version 3.30 + + - Removed -w option + - Fixed problem with some XMP tags being put in the EXIF group + - More minor speed improvements + - API Changes: + - GetDescription() now requires an ExifTool object reference + - Removed WarnDuplicateDescriptions() + +Mar. 26, 2004 - Version 3.27 + + - Optimized a few routines to speed things up a bit + - API Changes: + - Changed GetDescription() documentation to indicate it is called with an + ExifTool object (this is still optional, but will be mandatory with the + next version) + +Mar. 25, 2004 - Version 3.26 + + - Don't generate warning if end of IPTC block is padded with nulls + +Mar. 19, 2004 - Version 3.25 + + - Fixed problem with 'Input' sort order + +Mar. 19, 2004 - Version 3.24 + + - Only return PreviewImage if it is a valid JPG (otherwise set 'Warning') + +Mar. 16, 2004 - Version 3.23 + + - API Changes: + - Added GetGroups() + - GetGroup() now returns group names for all families if used in list + context and family not specified + +Mar. 12, 2004 - Version 3.22 + + - API Changes: + - Changed GetInfo() to return list of tags like ImageInfo() if list + reference provided + - Fixed bug that caused GetInfo() to ignore specified tags + +Mar. 11, 2004 - Version 3.21 + + - Fixed problem with Composite group in family 1 + - Changed case of Exif to EXIF in family 1 + - -group option now lists Composite group as it should + - Internal Changes: + - Cleaned up handling of function arguments + +Mar. 10, 2004 - Version 3.20 + + - Added -group option + - Added group families 1 and 2 + - Can now specify excluded tags with leading '-' (replaces -x option) + - API Changes: + - Added ClearOptions(), ExtractInfo(), GetInfo(), CombineInfo(), + GetTagList() and GetAllGroups() + - Removed IsVerbose() function (use Options('Verbose') instead) + - Allow groups to be excluded by specifying leading '-' on group name + - ImageInfo() and GetInfo() now use specified group order to set tag + precedence if Duplicates option is not set + - Change default value of Duplicates option back to 0 + +Mar. 1, 2004 - Version 3.15 + + - Changed format of all date and time tags to EXIF standard + - Added some composite date/time tags + - Fixed date formatting so -d option should now work with all combined + date/time tags + - Other minor changes to GPS information + - Improvements to TIFF processing + - Set value to "Undefined" if PrintConv evaluates to undefined value + - Added -G option + - API Changes: + - Changed all option names: shortened and changed to mixed case (sorry!) + - Internal changes: + - Standardized arguments to all processing procedures + - Made call to processing procedure more automatic + - Removed TABLE_TYPE tag and added PROCESS_PROC + - Added ProcessTagTable() member function + +Feb. 27, 2004 - Version 3.14 + + - Added GPS tag conversions and GPS test + - Values that can't be converted now show up simply as "Unknown (X)" + +Feb. 26, 2004 - Version 3.13 + + - Print out errors from exiftool script (since Image::ExifTool no longer + prints them) + - Added more tests + - Failed tests now leave ".failed" file in "t" directory for post mortem + +Feb. 25, 2004 - Version 3.12 + + - Moved all image-related warnings to new Warning tag + +Feb. 25, 2004 - Version 3.11 + + - Added GeoTiff support + - Added -x option + - Improvements to documentation + - Improve XMP parsing for 'Bag' elements + - Capitalize first letter of XMP tag descriptions + - Patch problem with APP13 resource written by older Photoshop versions + - API Changes: + - Added EXCLUDE and GROUP# options + - Change default value of SAVE_DUPLICATES option to 1 + +Feb. 20, 2004 - Version 3.10 + + - Restructuring only -- the behaviour of the exiftool script was not changed + - Moved html documentation to new html directory + - API Changes: + - Conform to standard Perl module mechanics: + - Changed ExifTool package name to Image::ExifTool + - Added Makefile.PL and other standard files + - Added Perl pod documentation + - Added standard test files + - Moved modules into lib directory + - Changed "TagTables" directory name to "ExifTool" + - Added extra parameter in new RandomAccessFile + +Feb. 20, 2004 - Version 3.05 + + - Fixed problem where output files (-o) weren't written if -p option used + +Feb. 19, 2004 - Version 3.04 + + - Added -U option to allow display of unknown values in Canon binary data + blocks + - Made unknown tag names more specific when -u or -U option used + - Added RawData and DecoderTable tags (for Canon RAW file) + +Feb. 17, 2004 - Version 3.03 + + - Fixed RandomAccessFile package name (should have been + File::RandomAccessFile) + - Added IxusAFPoint tag to Canon maker notes (thanks Michael Rommel) + - Avoid scanning past end of Canon binary data blocks + - API Changes: + - GetFoundTags() and GetRequestedTags() now return list instead of list + reference + +Feb. 16, 2004 - Version 3.02 + + - Improved handling of Pentax maker notes + +Feb. 15, 2004 - Version 3.01 + + - API Changes: + - Added GetValue() function + - Completed API documentation + +Feb. 13, 2004 - Version 3.00 + + - Removed -all option (it is now the default -- specify -common for previous + default behaviour) + - Added -a option to allow printout of duplicate tag values + - API Changes: + - I am finally happy with the API, so future major changes are less likely + (hence the major version number) + - No longer return ARRAY reference for list of tags (Instead, tag values + are joined in a comma separated list if tag 'List' flag is set) + - Added SAVE_DUPLICATES option + - Added BuildCompositeTags() to EXPORT_OK list + - GetFoundTags() now sorts tags in specified order + - GetDescriptions() longer returns undef if the description doesn't exist + +Feb. 12, 2004 - Version 2.71 + + - Still more playing with Pentax maker notes + - More API Changes: + - Added RandomAccessFile.pm + - All image file i/o now done through a RandomAccessFile object + --> allows proper piping and use of string i/o + - Allow scalar reference to be passed to ImageInfo() (for string i/o) + +Feb. 11, 2004 - Version 2.70 + + - More tweaking of Pentax maker notes + - Changed API to be more object oriented: + - Removed SetVerbose(), ExtractUnknown(), SetDateFormat(), + EnablePrintConversion(), EnableCompositeTags() + - Added Options() to replace above functions + - Changed WarnDuplicateTags() to WarnDuplicateDescriptions() + - Added GetFoundTags() and GetRequestedTags() + - Many functions now take ExifTool object reference as first argument + - ImageInfo() no longer returns reference to ExifTool object when used in + list context (you have to use "new ExifTool" and the OO form of + ImageInfo() if you want the object) + +Feb. 10, 2004 - Version 2.62 + + - Added -u option to allow display of unknown tags + - Major changes to Pentax maker notes (still needs work) (thanks Wayne Smith) + +Feb. 09, 2004 - Version 2.61 + + - Allow file reference to be passed to ImageInfo() + - Allow file to be read from standard input by specifying "-" as file name + - Added FileType tag + +Feb. 07, 2004 - Version 2.60 + + - Improve IPTC parsing and add support for more IPTC data types + - Read Photoshop APP13 records properly + - Added -g option + - Move shortcuts into separate module + - Changes to API: + - Removed LoadAllTables() and added GetAllTags() + - Removed GetDescriptions() and added GetDescription() + - Changed GetShortcuts() to return a list + - Added tag groups and GetGroup() function + - Return object data from ImageInfo() for use in GetGroup() + +Jan. 30, 2004 - Version 2.51 + + - Speed up JPG reading code + - API no longer returns references to image-specific static data + - Added ExifToolVersion tag + +Jan. 29, 2004 - Version 2.50 + + - Changed API to return binary data as SCALAR reference and + list of values as ARRAY reference (thanks Dan Heller for the suggestions) + - Attempt to make case of tag descriptions more consistent + +Jan. 28, 2004 - Version 2.41 + + - Scan photoshop JPG 0xe1 garbage for possible XMP information + +Jan. 27, 2004 - Version 2.40 + + - Improved handling of XMP data + - Changed output format and added -l option + +Jan. 21, 2004 - Version 2.36 + + - Don't output trailing linefeed when -b option used + +Jan. 19, 2004 - Version 2.35 + + - Changes to verbose output + - Added TagTables::CanonRaw::CleanRaw() as an API utility function + +Jan. 16, 2004 - Version 2.34 + + - Added 'Validate' check for Canon data fields + - Changed ScaleFactor35efl to use FocalLengthIn35mmFormat if available + +Jan. 15, 2004 - Version 2.33 + + - Added ScaleFactor35efl, FocalLength35efl, Lens35efl + - Allow Composite tags to Require/Desire each other + - Changed FlashType to use FlashBits instead of CanonFlashMode + +Jan. 13, 2004 - Version 2.32 + + - Added -d (date format) option + - Added -p (print format file) option + +Jan. 9, 2004 - Version 2.31 + + - Exif WhiteBalance no longer overrides maker-specific WhiteBalance + +Jan. 8, 2004 - Version 2.30 + + - Added support for IPTC format information + +Jan. 6, 2004 - Version 2.25 + + - Fixed problem with ImageInfo() function prototype + - Fixed printout of JpgFromRaw message (doesn't affect JPG extraction) + - Set output files to binmode (including STDOUT) if -b option used (thanks + David Anson) + +Jan. 1, 2004 - Version 2.24 + + - Fixed -list option to show all available tag names + +Dec. 18, 2003 - Version 2.23 + + - Changed "Disable" routines to "Enable" + +Dec. 17, 2003 - Version 2.22 + + - Fixed make/model tags which I broke with a recent change + - Removed null terminator from returned strings + +Dec. 16, 2003 - Version 2.21 + + - Fixed problem with decoding some Nikon maker notes + - General improvements and tweaks to the code + +Dec. 14, 2003 - Version 2.20 + + - Now extracts preview image from 300D JPG files (PreviewImage) + - Changed ThumbnailData tag name to ThumbnailImage + +Dec. 12, 2003 - Version 2.10 + + - ExifTool::ImageInfo now returns reference to hash instead of hash + +Dec. 10, 2003 - Version 2.01 + + - Minor fixes for reading of RAW files + +Dec. 09, 2003 - Version 2.00 + + - Added support for Olympus, Casio and Nikon cameras + - Now recognizes GPS information + - Moved config information to TagTables modules + - Restructured API + +Dec. 05, 2003 - Version 1.72 + + - Changes to composite Aperture and ShutterSpeed decisions + +Dec. 05, 2003 - Version 1.71 + + - Read 10D Custom functions from CRW file too (thanks dpophyte) + +Dec. 05, 2003 - Version 1.70 + + - Added custom functions for 10D and 1D + +Dec. 04, 2003 - Version 1.62 + + - Decode known flash bits + +Dec. 04, 2003 - Version 1.61 + + - Override ShutterSpeed with BulbDuration if available + - Change -s option to add tab-separated list + +Dec. 03, 2003 - Version 1.60 + + - Big improvements in reading Canon RAW files + +Nov. 29, 2003 - Version 1.50 + + - Added ability to extract JPG from RAW + - Added ExifData tag to allow entire EXIF block to be dumped + +Nov. 26, 2003 - Version 1.40 + + - Split up config files to speed things up + - Added ability to extract binary data + - Added ThumbnailData tag (to allow extracting JPG thumbnails) + +Nov. 25, 2003 - Version 1.30 + + - Added experimental Canon RAW (CRW) file support + +Nov. 22, 2003 - Version 1.20 + + - Now reads TIFF files too + +Nov. 20, 2003 - Version 1.12 + + - Don't translate Photoshop Brightness, etc + +Nov. 20, 2003 - Version 1.11 + + - Attempt to fix problem on hp + - Clean up code a bit + - Added '-ver' command-line option + +Nov. 20, 2003 - Version 1.10 + + - Added support for XMP format + +Nov. 19, 2003 - Version 1.00 + + - Initial release (extracts information from JPEG and GIF images, with Canon, + FujiFilm and Pentax makernote support) + diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..f453fc8 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,1130 @@ +Changes +MANIFEST +META.json +META.yml +Makefile.PL +README +arg_files/exif2iptc.args +arg_files/exif2xmp.args +arg_files/gps2xmp.args +arg_files/iptc2exif.args +arg_files/iptc2xmp.args +arg_files/iptcCore.args +arg_files/pdf2xmp.args +arg_files/xmp2exif.args +arg_files/xmp2gps.args +arg_files/xmp2iptc.args +arg_files/xmp2pdf.args +config_files/acdsee.config +config_files/age.config +config_files/bibble.config +config_files/convert_regions.config +config_files/cuepointlist.config +config_files/depthmap.config +config_files/example.config +config_files/fotoware.config +config_files/gps2utm.config +config_files/nksc.config +config_files/photoshop_paths.config +config_files/picasa_faces.config +config_files/pix4d.config +config_files/rotate_regions.config +config_files/tiff_version.config +config_files/time_zone.config +exiftool +fmt_files/gpx.fmt +fmt_files/gpx_wpt.fmt +fmt_files/kml.fmt +fmt_files/kml_track.fmt +html/ExifTool.html +html/MIE1.1-20070121.pdf +html/Shift.html +html/TagNames/AFCP.html +html/TagNames/AIFF.html +html/TagNames/APE.html +html/TagNames/APP12.html +html/TagNames/ASF.html +html/TagNames/Apple.html +html/TagNames/Audible.html +html/TagNames/BMP.html +html/TagNames/BPG.html +html/TagNames/CBOR.html +html/TagNames/Canon.html +html/TagNames/CanonCustom.html +html/TagNames/CanonRaw.html +html/TagNames/CanonVRD.html +html/TagNames/Casio.html +html/TagNames/Composite.html +html/TagNames/DICOM.html +html/TagNames/DJI.html +html/TagNames/DNG.html +html/TagNames/DPX.html +html/TagNames/DV.html +html/TagNames/DarwinCore.html +html/TagNames/DjVu.html +html/TagNames/EXE.html +html/TagNames/EXIF.html +html/TagNames/Extra.html +html/TagNames/FITS.html +html/TagNames/FLAC.html +html/TagNames/FLIF.html +html/TagNames/FLIR.html +html/TagNames/Flash.html +html/TagNames/FlashPix.html +html/TagNames/Font.html +html/TagNames/FotoStation.html +html/TagNames/FujiFilm.html +html/TagNames/GE.html +html/TagNames/GIF.html +html/TagNames/GIMP.html +html/TagNames/GPS.html +html/TagNames/GeoTiff.html +html/TagNames/GoPro.html +html/TagNames/H264.html +html/TagNames/HP.html +html/TagNames/HTML.html +html/TagNames/ICC_Profile.html +html/TagNames/ID3.html +html/TagNames/IPTC.html +html/TagNames/ISO.html +html/TagNames/ITC.html +html/TagNames/JFIF.html +html/TagNames/JPEG.html +html/TagNames/JSON.html +html/TagNames/JVC.html +html/TagNames/Jpeg2000.html +html/TagNames/Kodak.html +html/TagNames/KyoceraRaw.html +html/TagNames/LIF.html +html/TagNames/LNK.html +html/TagNames/Leaf.html +html/TagNames/Lytro.html +html/TagNames/M2TS.html +html/TagNames/MIE.html +html/TagNames/MIFF.html +html/TagNames/MNG.html +html/TagNames/MOI.html +html/TagNames/MPC.html +html/TagNames/MPEG.html +html/TagNames/MPF.html +html/TagNames/MRC.html +html/TagNames/MWG.html +html/TagNames/MXF.html +html/TagNames/MacOS.html +html/TagNames/Matroska.html +html/TagNames/Microsoft.html +html/TagNames/Minolta.html +html/TagNames/MinoltaRaw.html +html/TagNames/Motorola.html +html/TagNames/Nikon.html +html/TagNames/NikonCapture.html +html/TagNames/NikonCustom.html +html/TagNames/NikonSettings.html +html/TagNames/Nintendo.html +html/TagNames/OOXML.html +html/TagNames/Ogg.html +html/TagNames/Olympus.html +html/TagNames/OpenEXR.html +html/TagNames/Opus.html +html/TagNames/Other.html +html/TagNames/PCX.html +html/TagNames/PDF.html +html/TagNames/PGF.html +html/TagNames/PICT.html +html/TagNames/PLIST.html +html/TagNames/PLUS.html +html/TagNames/PNG.html +html/TagNames/PSP.html +html/TagNames/Palm.html +html/TagNames/Panasonic.html +html/TagNames/PanasonicRaw.html +html/TagNames/Parrot.html +html/TagNames/Pentax.html +html/TagNames/PhaseOne.html +html/TagNames/PhotoCD.html +html/TagNames/PhotoMechanic.html +html/TagNames/Photoshop.html +html/TagNames/PostScript.html +html/TagNames/PrintIM.html +html/TagNames/Qualcomm.html +html/TagNames/QuickTime.html +html/TagNames/RIFF.html +html/TagNames/RSRC.html +html/TagNames/RTF.html +html/TagNames/Radiance.html +html/TagNames/Rawzor.html +html/TagNames/Real.html +html/TagNames/Reconyx.html +html/TagNames/Red.html +html/TagNames/Ricoh.html +html/TagNames/Samsung.html +html/TagNames/Sanyo.html +html/TagNames/Scalado.html +html/TagNames/Shortcuts.html +html/TagNames/Sigma.html +html/TagNames/SigmaRaw.html +html/TagNames/Sony.html +html/TagNames/SonyIDC.html +html/TagNames/Stim.html +html/TagNames/Text.html +html/TagNames/Theora.html +html/TagNames/Torrent.html +html/TagNames/Unknown.html +html/TagNames/VCard.html +html/TagNames/Vorbis.html +html/TagNames/WTV.html +html/TagNames/XMP.html +html/TagNames/ZIP.html +html/TagNames/ZISRAW.html +html/TagNames/iWork.html +html/TagNames/index.html +html/TagNames/style.css +html/ancient_history.html +html/canon_raw.html +html/commentary.html +html/config.html +html/data_members.html +html/exiftool_pod.html +html/faq.html +html/filename.html +html/geotag.html +html/history.html +html/htmldump.html +html/idiosyncracies.html +html/index.html +html/install.html +html/metafiles.html +html/mistakes.html +html/overview.png +html/standards.html +html/struct.html +html/style.css +html/under.html +html/verbose.html +html/writing.html +lib/File/RandomAccess.pm +lib/File/RandomAccess.pod +lib/Image/ExifTool.pm +lib/Image/ExifTool.pod +lib/Image/ExifTool/AES.pm +lib/Image/ExifTool/AFCP.pm +lib/Image/ExifTool/AIFF.pm +lib/Image/ExifTool/APE.pm +lib/Image/ExifTool/APP12.pm +lib/Image/ExifTool/ASF.pm +lib/Image/ExifTool/Apple.pm +lib/Image/ExifTool/Audible.pm +lib/Image/ExifTool/BMP.pm +lib/Image/ExifTool/BPG.pm +lib/Image/ExifTool/BZZ.pm +lib/Image/ExifTool/BigTIFF.pm +lib/Image/ExifTool/BuildTagLookup.pm +lib/Image/ExifTool/CBOR.pm +lib/Image/ExifTool/Canon.pm +lib/Image/ExifTool/CanonCustom.pm +lib/Image/ExifTool/CanonRaw.pm +lib/Image/ExifTool/CanonVRD.pm +lib/Image/ExifTool/CaptureOne.pm +lib/Image/ExifTool/Casio.pm +lib/Image/ExifTool/Charset.pm +lib/Image/ExifTool/Charset/Arabic.pm +lib/Image/ExifTool/Charset/Baltic.pm +lib/Image/ExifTool/Charset/Cyrillic.pm +lib/Image/ExifTool/Charset/DOSCyrillic.pm +lib/Image/ExifTool/Charset/DOSLatin1.pm +lib/Image/ExifTool/Charset/DOSLatinUS.pm +lib/Image/ExifTool/Charset/Greek.pm +lib/Image/ExifTool/Charset/Hebrew.pm +lib/Image/ExifTool/Charset/JIS.pm +lib/Image/ExifTool/Charset/Latin.pm +lib/Image/ExifTool/Charset/Latin2.pm +lib/Image/ExifTool/Charset/MacArabic.pm +lib/Image/ExifTool/Charset/MacChineseCN.pm +lib/Image/ExifTool/Charset/MacChineseTW.pm +lib/Image/ExifTool/Charset/MacCroatian.pm +lib/Image/ExifTool/Charset/MacCyrillic.pm +lib/Image/ExifTool/Charset/MacGreek.pm +lib/Image/ExifTool/Charset/MacHebrew.pm +lib/Image/ExifTool/Charset/MacIceland.pm +lib/Image/ExifTool/Charset/MacJapanese.pm +lib/Image/ExifTool/Charset/MacKorean.pm +lib/Image/ExifTool/Charset/MacLatin2.pm +lib/Image/ExifTool/Charset/MacRSymbol.pm +lib/Image/ExifTool/Charset/MacRoman.pm +lib/Image/ExifTool/Charset/MacRomanian.pm +lib/Image/ExifTool/Charset/MacThai.pm +lib/Image/ExifTool/Charset/MacTurkish.pm +lib/Image/ExifTool/Charset/PDFDoc.pm +lib/Image/ExifTool/Charset/ShiftJIS.pm +lib/Image/ExifTool/Charset/Symbol.pm +lib/Image/ExifTool/Charset/Thai.pm +lib/Image/ExifTool/Charset/Turkish.pm +lib/Image/ExifTool/Charset/Vietnam.pm +lib/Image/ExifTool/DICOM.pm +lib/Image/ExifTool/DJI.pm +lib/Image/ExifTool/DNG.pm +lib/Image/ExifTool/DPX.pm +lib/Image/ExifTool/DV.pm +lib/Image/ExifTool/DarwinCore.pm +lib/Image/ExifTool/DjVu.pm +lib/Image/ExifTool/EXE.pm +lib/Image/ExifTool/Exif.pm +lib/Image/ExifTool/FITS.pm +lib/Image/ExifTool/FLAC.pm +lib/Image/ExifTool/FLIF.pm +lib/Image/ExifTool/FLIR.pm +lib/Image/ExifTool/Fixup.pm +lib/Image/ExifTool/Flash.pm +lib/Image/ExifTool/FlashPix.pm +lib/Image/ExifTool/Font.pm +lib/Image/ExifTool/FotoStation.pm +lib/Image/ExifTool/FujiFilm.pm +lib/Image/ExifTool/GE.pm +lib/Image/ExifTool/GIF.pm +lib/Image/ExifTool/GIMP.pm +lib/Image/ExifTool/GPS.pm +lib/Image/ExifTool/GeoTiff.pm +lib/Image/ExifTool/Geotag.pm +lib/Image/ExifTool/GoPro.pm +lib/Image/ExifTool/H264.pm +lib/Image/ExifTool/HP.pm +lib/Image/ExifTool/HTML.pm +lib/Image/ExifTool/HtmlDump.pm +lib/Image/ExifTool/ICC_Profile.pm +lib/Image/ExifTool/ID3.pm +lib/Image/ExifTool/IPTC.pm +lib/Image/ExifTool/ISO.pm +lib/Image/ExifTool/ITC.pm +lib/Image/ExifTool/Import.pm +lib/Image/ExifTool/InDesign.pm +lib/Image/ExifTool/JPEG.pm +lib/Image/ExifTool/JPEGDigest.pm +lib/Image/ExifTool/JSON.pm +lib/Image/ExifTool/JVC.pm +lib/Image/ExifTool/Jpeg2000.pm +lib/Image/ExifTool/Kodak.pm +lib/Image/ExifTool/KyoceraRaw.pm +lib/Image/ExifTool/LIF.pm +lib/Image/ExifTool/LNK.pm +lib/Image/ExifTool/Lang/cs.pm +lib/Image/ExifTool/Lang/de.pm +lib/Image/ExifTool/Lang/en_ca.pm +lib/Image/ExifTool/Lang/en_gb.pm +lib/Image/ExifTool/Lang/es.pm +lib/Image/ExifTool/Lang/fi.pm +lib/Image/ExifTool/Lang/fr.pm +lib/Image/ExifTool/Lang/it.pm +lib/Image/ExifTool/Lang/ja.pm +lib/Image/ExifTool/Lang/ko.pm +lib/Image/ExifTool/Lang/nl.pm +lib/Image/ExifTool/Lang/pl.pm +lib/Image/ExifTool/Lang/ru.pm +lib/Image/ExifTool/Lang/sv.pm +lib/Image/ExifTool/Lang/tr.pm +lib/Image/ExifTool/Lang/zh_cn.pm +lib/Image/ExifTool/Lang/zh_tw.pm +lib/Image/ExifTool/Leaf.pm +lib/Image/ExifTool/Lytro.pm +lib/Image/ExifTool/M2TS.pm +lib/Image/ExifTool/MIE.pm +lib/Image/ExifTool/MIEUnits.pod +lib/Image/ExifTool/MIFF.pm +lib/Image/ExifTool/MNG.pm +lib/Image/ExifTool/MOI.pm +lib/Image/ExifTool/MPC.pm +lib/Image/ExifTool/MPEG.pm +lib/Image/ExifTool/MPF.pm +lib/Image/ExifTool/MRC.pm +lib/Image/ExifTool/MWG.pm +lib/Image/ExifTool/MXF.pm +lib/Image/ExifTool/MacOS.pm +lib/Image/ExifTool/MakerNotes.pm +lib/Image/ExifTool/Matroska.pm +lib/Image/ExifTool/Microsoft.pm +lib/Image/ExifTool/Minolta.pm +lib/Image/ExifTool/MinoltaRaw.pm +lib/Image/ExifTool/Motorola.pm +lib/Image/ExifTool/Nikon.pm +lib/Image/ExifTool/NikonCapture.pm +lib/Image/ExifTool/NikonCustom.pm +lib/Image/ExifTool/NikonSettings.pm +lib/Image/ExifTool/Nintendo.pm +lib/Image/ExifTool/OOXML.pm +lib/Image/ExifTool/Ogg.pm +lib/Image/ExifTool/Olympus.pm +lib/Image/ExifTool/OpenEXR.pm +lib/Image/ExifTool/Opus.pm +lib/Image/ExifTool/Other.pm +lib/Image/ExifTool/PCX.pm +lib/Image/ExifTool/PDF.pm +lib/Image/ExifTool/PGF.pm +lib/Image/ExifTool/PICT.pm +lib/Image/ExifTool/PLIST.pm +lib/Image/ExifTool/PLUS.pm +lib/Image/ExifTool/PNG.pm +lib/Image/ExifTool/PPM.pm +lib/Image/ExifTool/PSP.pm +lib/Image/ExifTool/Palm.pm +lib/Image/ExifTool/Panasonic.pm +lib/Image/ExifTool/PanasonicRaw.pm +lib/Image/ExifTool/Parrot.pm +lib/Image/ExifTool/Pentax.pm +lib/Image/ExifTool/PhaseOne.pm +lib/Image/ExifTool/PhotoCD.pm +lib/Image/ExifTool/PhotoMechanic.pm +lib/Image/ExifTool/Photoshop.pm +lib/Image/ExifTool/PostScript.pm +lib/Image/ExifTool/PrintIM.pm +lib/Image/ExifTool/Qualcomm.pm +lib/Image/ExifTool/QuickTime.pm +lib/Image/ExifTool/QuickTimeStream.pl +lib/Image/ExifTool/README +lib/Image/ExifTool/RIFF.pm +lib/Image/ExifTool/RSRC.pm +lib/Image/ExifTool/RTF.pm +lib/Image/ExifTool/Radiance.pm +lib/Image/ExifTool/Rawzor.pm +lib/Image/ExifTool/Real.pm +lib/Image/ExifTool/Reconyx.pm +lib/Image/ExifTool/Red.pm +lib/Image/ExifTool/Ricoh.pm +lib/Image/ExifTool/Samsung.pm +lib/Image/ExifTool/Sanyo.pm +lib/Image/ExifTool/Scalado.pm +lib/Image/ExifTool/Shift.pl +lib/Image/ExifTool/Shortcuts.pm +lib/Image/ExifTool/Sigma.pm +lib/Image/ExifTool/SigmaRaw.pm +lib/Image/ExifTool/Sony.pm +lib/Image/ExifTool/SonyIDC.pm +lib/Image/ExifTool/Stim.pm +lib/Image/ExifTool/TagInfoXML.pm +lib/Image/ExifTool/TagLookup.pm +lib/Image/ExifTool/TagNames.pod +lib/Image/ExifTool/Text.pm +lib/Image/ExifTool/Theora.pm +lib/Image/ExifTool/Torrent.pm +lib/Image/ExifTool/Unknown.pm +lib/Image/ExifTool/VCard.pm +lib/Image/ExifTool/Validate.pm +lib/Image/ExifTool/Vorbis.pm +lib/Image/ExifTool/WTV.pm +lib/Image/ExifTool/WriteCanonRaw.pl +lib/Image/ExifTool/WriteExif.pl +lib/Image/ExifTool/WriteIPTC.pl +lib/Image/ExifTool/WritePDF.pl +lib/Image/ExifTool/WritePNG.pl +lib/Image/ExifTool/WritePhotoshop.pl +lib/Image/ExifTool/WritePostScript.pl +lib/Image/ExifTool/WriteQuickTime.pl +lib/Image/ExifTool/WriteXMP.pl +lib/Image/ExifTool/Writer.pl +lib/Image/ExifTool/XMP.pm +lib/Image/ExifTool/XMP2.pl +lib/Image/ExifTool/XMPStruct.pl +lib/Image/ExifTool/ZIP.pm +lib/Image/ExifTool/ZISRAW.pm +lib/Image/ExifTool/iWork.pm +perl-Image-ExifTool.spec +t/AFCP.t +t/AFCP_2.out +t/AFCP_3.out +t/AIFF.t +t/AIFF_2.out +t/APE.t +t/APE_2.out +t/APE_3.out +t/ASF.t +t/ASF_2.out +t/Apple.t +t/Apple_2.out +t/Audible.t +t/Audible_2.out +t/BMP.t +t/BMP_2.out +t/BPG.t +t/BPG_2.out +t/BigTIFF.t +t/BigTIFF_2.out +t/Canon.t +t/CanonRaw.t +t/CanonRaw_2.out +t/CanonRaw_4.out +t/CanonRaw_5.out +t/CanonRaw_6.out +t/CanonRaw_7.out +t/CanonRaw_8.out +t/CanonRaw_9.out +t/CanonVRD.t +t/CanonVRD_11.out +t/CanonVRD_12.out +t/CanonVRD_13.out +t/CanonVRD_14.out +t/CanonVRD_15.out +t/CanonVRD_16.out +t/CanonVRD_17.out +t/CanonVRD_18.out +t/CanonVRD_19.out +t/CanonVRD_2.out +t/CanonVRD_20.out +t/CanonVRD_21.out +t/CanonVRD_22.out +t/CanonVRD_24.out +t/CanonVRD_3.out +t/CanonVRD_4.out +t/CanonVRD_5.out +t/CanonVRD_6.out +t/CanonVRD_7.out +t/CanonVRD_8.out +t/CanonVRD_9.out +t/Canon_2.out +t/Canon_3.out +t/Casio.t +t/Casio_2.out +t/Casio_3.out +t/Casio_4.out +t/Casio_5.out +t/Casio_6.out +t/DICOM.t +t/DICOM_2.out +t/DNG.t +t/DNG_2.out +t/DNG_3.out +t/DPX.t +t/DPX_2.out +t/DV.t +t/DV_2.out +t/DjVu.t +t/DjVu_2.out +t/EXE.t +t/EXE_2.out +t/EXE_3.out +t/EXE_4.out +t/EXE_5.out +t/EXE_6.out +t/EXE_7.out +t/ExifTool.t +t/ExifTool_16.out +t/ExifTool_17.out +t/ExifTool_2.out +t/ExifTool_20.out +t/ExifTool_21.out +t/ExifTool_22.out +t/ExifTool_23.out +t/ExifTool_24.out +t/ExifTool_25.out +t/ExifTool_26.out +t/ExifTool_27.out +t/ExifTool_28.out +t/ExifTool_29.out +t/ExifTool_3.out +t/ExifTool_30.out +t/ExifTool_31.out +t/ExifTool_32.out +t/ExifTool_4.out +t/ExifTool_5.out +t/ExifTool_6.out +t/ExifTool_7.out +t/ExifTool_8.out +t/ExifTool_9.out +t/FITS.t +t/FITS_2.out +t/FLAC.t +t/FLAC_2.out +t/FLAC_3.out +t/FLIF.t +t/FLIF_2.out +t/FLIF_3.out +t/FLIF_4.out +t/FLIF_5.out +t/FLIF_6.out +t/FLIR.t +t/FLIR_2.out +t/FLIR_3.out +t/Flash.t +t/FlashPix.t +t/FlashPix_2.out +t/Flash_2.out +t/Flash_3.out +t/Font.t +t/Font_2.out +t/Font_3.out +t/Font_4.out +t/Font_5.out +t/Font_6.out +t/Font_7.out +t/FotoStation.t +t/FotoStation_2.out +t/FotoStation_3.out +t/FujiFilm.t +t/FujiFilm_2.out +t/FujiFilm_3.out +t/FujiFilm_4.out +t/FujiFilm_5.out +t/GE.t +t/GE_2.out +t/GE_3.out +t/GIF.t +t/GIF_2.out +t/GIF_3.out +t/GIF_4.out +t/GIMP.t +t/GIMP_2.out +t/GPS.t +t/GPS_2.out +t/GPS_3.out +t/GeoTiff.t +t/GeoTiff_2.out +t/GeoTiff_3.out +t/GeoTiff_4.out +t/Geotag.t +t/Geotag_10.out +t/Geotag_11.out +t/Geotag_12.out +t/Geotag_2.out +t/Geotag_3.out +t/Geotag_5.out +t/Geotag_6.out +t/Geotag_7.out +t/Geotag_8.out +t/Geotag_9.out +t/GoPro.t +t/GoPro_2.out +t/HTML.t +t/HTML_2.out +t/IPTC.t +t/IPTC_2.out +t/IPTC_4.out +t/IPTC_5.out +t/IPTC_6.out +t/IPTC_7.out +t/IPTC_8.out +t/ISO.t +t/ISO_2.out +t/ITC.t +t/ITC_2.out +t/InDesign.t +t/InDesign_2.out +t/InDesign_3.out +t/InDesign_4.out +t/JSON.t +t/JSON_2.out +t/JVC.t +t/JVC_2.out +t/JVC_3.out +t/JXL.t +t/JXL_2.out +t/JXL_3.out +t/Jpeg2000.t +t/Jpeg2000_2.out +t/Jpeg2000_3.out +t/Jpeg2000_4.out +t/Jpeg2000_5.out +t/Kodak.t +t/Kodak_2.out +t/Kodak_3.out +t/KyoceraRaw.t +t/KyoceraRaw_2.out +t/LNK.t +t/LNK_2.out +t/Lang.t +t/Lang_1.out +t/Lang_10.out +t/Lang_11.out +t/Lang_12.out +t/Lang_13.out +t/Lang_14.out +t/Lang_15.out +t/Lang_16.out +t/Lang_17.out +t/Lang_18.out +t/Lang_2.out +t/Lang_3.out +t/Lang_4.out +t/Lang_5.out +t/Lang_6.out +t/Lang_7.out +t/Lang_8.out +t/Lang_9.out +t/Lytro.t +t/Lytro_2.out +t/M2TS.t +t/M2TS_2.out +t/MIE.t +t/MIE_2.out +t/MIE_3.out +t/MIE_5.out +t/MIE_6.out +t/MIFF.t +t/MIFF_2.out +t/MOI.t +t/MOI_2.out +t/MP3.t +t/MP3_2.out +t/MRC.t +t/MRC_2.out +t/MWG.t +t/MWG_2.out +t/MWG_3.out +t/MWG_4.out +t/MWG_5.out +t/MWG_6.out +t/MWG_7.out +t/MXF.t +t/MXF_2.out +t/MacOS.t +t/MacOS_2.out +t/Matroska.t +t/Matroska_2.out +t/Minolta.t +t/Minolta_2.out +t/Minolta_3.out +t/Minolta_4.out +t/Motorola.t +t/Motorola_2.out +t/Nikon.t +t/Nikon_2.out +t/Nikon_3.out +t/Nikon_4.out +t/Nikon_5.out +t/Nikon_7.out +t/Nikon_8.out +t/Olympus.t +t/Olympus_2.out +t/Olympus_3.out +t/Olympus_4.out +t/Olympus_5.out +t/Olympus_6.out +t/Olympus_7.out +t/Olympus_8.out +t/OpenEXR.t +t/OpenEXR_2.out +t/Opus.t +t/Opus_2.out +t/PCX.t +t/PCX_2.out +t/PDF.t +t/PDF_10.out +t/PDF_11.out +t/PDF_12.out +t/PDF_14.out +t/PDF_15.out +t/PDF_16.out +t/PDF_17.out +t/PDF_18.out +t/PDF_19.out +t/PDF_2.out +t/PDF_20.out +t/PDF_22.out +t/PDF_4.out +t/PDF_5.out +t/PDF_6.out +t/PDF_7.out +t/PDF_8.out +t/PDF_9.out +t/PFM.t +t/PFM_2.out +t/PGF.t +t/PGF_2.out +t/PICT.t +t/PICT_2.out +t/PLIST.t +t/PLIST_2.out +t/PLIST_3.out +t/PLIST_4.out +t/PLUS.t +t/PLUS_2.out +t/PNG.t +t/PNG_2.out +t/PNG_3.out +t/PNG_4.out +t/PNG_5.out +t/PNG_6.out +t/PNG_7.out +t/PPM.t +t/PPM_2.out +t/PPM_3.out +t/PSP.t +t/PSP_2.out +t/Palm.t +t/Palm_2.out +t/Panasonic.t +t/Panasonic_2.out +t/Panasonic_3.out +t/Panasonic_4.out +t/Panasonic_5.out +t/Pentax.t +t/Pentax_2.out +t/Pentax_3.out +t/Pentax_4.out +t/PhaseOne.t +t/PhaseOne_2.out +t/PhaseOne_3.out +t/PhotoCD.t +t/PhotoCD_2.out +t/PhotoMechanic.t +t/PhotoMechanic_2.out +t/PhotoMechanic_3.out +t/Photoshop.t +t/Photoshop_2.out +t/Photoshop_3.out +t/PostScript.t +t/PostScript_2.out +t/PostScript_3.out +t/QuickTime.t +t/QuickTime_10.out +t/QuickTime_11.out +t/QuickTime_12.out +t/QuickTime_13.out +t/QuickTime_14.out +t/QuickTime_15.out +t/QuickTime_16.out +t/QuickTime_17.out +t/QuickTime_2.out +t/QuickTime_3.out +t/QuickTime_4.out +t/QuickTime_5.out +t/QuickTime_6.out +t/QuickTime_7.out +t/QuickTime_8.out +t/QuickTime_9.out +t/RIFF.t +t/RIFF_2.out +t/RIFF_3.out +t/RIFF_4.out +t/RTF.t +t/RTF_2.out +t/Radiance.t +t/Radiance_2.out +t/Real.t +t/Real_2.out +t/Real_3.out +t/Real_4.out +t/Red.t +t/Red_2.out +t/Ricoh.t +t/Ricoh_2.out +t/Ricoh_3.out +t/Ricoh_4.out +t/Sanyo.t +t/Sanyo_2.out +t/Sanyo_3.out +t/Sigma.t +t/Sigma_2.out +t/Sigma_3.out +t/Sigma_4.out +t/Sigma_5.out +t/Sony.t +t/Sony_2.out +t/Sony_3.out +t/Sony_5.out +t/TestLib.pm +t/Text.t +t/Text_2.out +t/Text_3.out +t/Text_4.out +t/Text_5.out +t/Text_6.out +t/Text_7.out +t/Torrent.t +t/Torrent_2.out +t/Unknown.t +t/Unknown_2.out +t/Unknown_3.out +t/VCard.t +t/VCard_2.out +t/VCard_3.out +t/Vorbis.t +t/Vorbis_2.out +t/WTV.t +t/WTV_2.out +t/Writer.t +t/Writer_10.out +t/Writer_11.out +t/Writer_13.out +t/Writer_14.out +t/Writer_15.out +t/Writer_16.out +t/Writer_17.out +t/Writer_18.out +t/Writer_19.out +t/Writer_2.out +t/Writer_22.out +t/Writer_24.out +t/Writer_25.out +t/Writer_26.out +t/Writer_27.out +t/Writer_28.out +t/Writer_29.out +t/Writer_30.out +t/Writer_31.out +t/Writer_32.out +t/Writer_33.out +t/Writer_34.out +t/Writer_35.out +t/Writer_36.out +t/Writer_37.out +t/Writer_38.out +t/Writer_39.out +t/Writer_4.out +t/Writer_40.out +t/Writer_41.out +t/Writer_42.out +t/Writer_43.out +t/Writer_44.out +t/Writer_45.out +t/Writer_46.out +t/Writer_47.out +t/Writer_48.out +t/Writer_50.out +t/Writer_51.out +t/Writer_52.out +t/Writer_53.out +t/Writer_54.out +t/Writer_55.out +t/Writer_56.out +t/Writer_58.out +t/Writer_59.out +t/Writer_6.out +t/Writer_7.out +t/Writer_9.out +t/XMP.t +t/XMP_10.out +t/XMP_11.out +t/XMP_12.out +t/XMP_13.out +t/XMP_14.out +t/XMP_15.out +t/XMP_16.out +t/XMP_17.out +t/XMP_18.out +t/XMP_19.out +t/XMP_2.out +t/XMP_20.out +t/XMP_21.out +t/XMP_22.out +t/XMP_23.out +t/XMP_24.out +t/XMP_25.out +t/XMP_26.out +t/XMP_27.out +t/XMP_28.out +t/XMP_29.out +t/XMP_3.out +t/XMP_30.out +t/XMP_31.out +t/XMP_32.out +t/XMP_34.out +t/XMP_36.out +t/XMP_37.out +t/XMP_39.out +t/XMP_40.out +t/XMP_41.out +t/XMP_42.out +t/XMP_43.out +t/XMP_44.out +t/XMP_45.out +t/XMP_46.out +t/XMP_47.out +t/XMP_48.out +t/XMP_49.out +t/XMP_5.out +t/XMP_50.out +t/XMP_52.out +t/XMP_53.out +t/XMP_54.out +t/XMP_6.out +t/XMP_7.out +t/XMP_8.out +t/XMP_9.out +t/ZIP.t +t/ZIP_2.out +t/ZIP_3.out +t/ZIP_4.out +t/ZIP_5.out +t/ZIP_6.out +t/ZIP_7.out +t/ZISRAW.t +t/ZISRAW_2.out +t/images/AFCP.jpg +t/images/AIFF.aif +t/images/APE.ape +t/images/APE.mpc +t/images/ASF.wmv +t/images/Apple.jpg +t/images/Audible.aa +t/images/BMP.bmp +t/images/BPG.bpg +t/images/BigTIFF.btf +t/images/Canon.jpg +t/images/Canon1DmkIII.jpg +t/images/CanonRaw.cr2 +t/images/CanonRaw.cr3 +t/images/CanonRaw.crw +t/images/CanonVRD.dr4 +t/images/CanonVRD.vrd +t/images/CaptureOne.eip +t/images/Casio.jpg +t/images/Casio2.jpg +t/images/CasioQVCI.jpg +t/images/DICOM.dcm +t/images/DNG.dng +t/images/DPX.dpx +t/images/DV.dv +t/images/DjVu.djvu +t/images/EXE.a +t/images/EXE.dylib +t/images/EXE.elf +t/images/EXE.exe +t/images/EXE.macho +t/images/EXE.so +t/images/ExifTool.jpg +t/images/ExifTool.jps +t/images/ExifTool.tif +t/images/ExtendedXMP.jpg +t/images/FITS.fits +t/images/FLAC.flac +t/images/FLAC.ogg +t/images/FLIF.flif +t/images/FLIR.fpf +t/images/FLIR.jpg +t/images/Flash.flv +t/images/Flash.swf +t/images/FlashPix.ppt +t/images/Font.afm +t/images/Font.dfont +t/images/Font.pfa +t/images/Font.pfb +t/images/Font.pfm +t/images/Font.ttf +t/images/FotoStation.jpg +t/images/FujiFilm.jpg +t/images/FujiFilm.raf +t/images/GE.jpg +t/images/GIF.gif +t/images/GIMP.xcf +t/images/GPS.jpg +t/images/GeoTiff.tif +t/images/Geotag.gpx +t/images/Geotag.igc +t/images/Geotag.kml +t/images/Geotag.log +t/images/Geotag.xml +t/images/Geotag2.log +t/images/Geotag3.log +t/images/Geotag_DJI_2020-12-02_[07-50-31].csv +t/images/GoPro.jpg +t/images/HTML.html +t/images/ICC_Profile.icc +t/images/IPTC.jpg +t/images/ISO.iso +t/images/ITC.itc +t/images/InDesign.indd +t/images/JSON.json +t/images/JVC.jpg +t/images/JVC2.jpg +t/images/JXL.jxl +t/images/Jpeg2000.j2c +t/images/Jpeg2000.jp2 +t/images/Kodak.jpg +t/images/KyoceraRaw.raw +t/images/LNK.lnk +t/images/Lytro.lfp +t/images/M2TS.mts +t/images/MIE.mie +t/images/MIFF.miff +t/images/MOI.moi +t/images/MP3.mp3 +t/images/MRC.mrc +t/images/MWG.jpg +t/images/MXF.mxf +t/images/MacOS.macos +t/images/Matroska.mkv +t/images/Minolta.jpg +t/images/Minolta.mrw +t/images/Motorola.jpg +t/images/Nikon.jpg +t/images/Nikon.nef +t/images/NikonD2Hs.jpg +t/images/NikonD70.jpg +t/images/OOXML.docx +t/images/Olympus.dss +t/images/Olympus.jpg +t/images/Olympus2.jpg +t/images/OlympusE1.jpg +t/images/OpenDoc.ods +t/images/OpenEXR.exr +t/images/Opus.opus +t/images/PCX.pcx +t/images/PDF.pdf +t/images/PDF2.pdf +t/images/PFM.pfm +t/images/PGF.pgf +t/images/PICT.pict +t/images/PLIST-bin.plist +t/images/PLIST-xml.plist +t/images/PLIST.aae +t/images/PLUS.xmp +t/images/PNG.png +t/images/PPM.ppm +t/images/PSP.psp +t/images/Palm.mobi +t/images/Panasonic.jpg +t/images/Panasonic.rw2 +t/images/Pentax.avi +t/images/Pentax.jpg +t/images/PhaseOne.iiq +t/images/PhotoCD.pcd +t/images/PhotoMechanic.jpg +t/images/Photoshop.psd +t/images/PostScript.eps +t/images/QuickTime.heic +t/images/QuickTime.m4a +t/images/QuickTime.mov +t/images/RIFF.avi +t/images/RIFF.wav +t/images/RIFF.webp +t/images/RTF.rtf +t/images/Radiance.hdr +t/images/Real.ra +t/images/Real.ram +t/images/Real.rm +t/images/Red.r3d +t/images/Ricoh.jpg +t/images/Ricoh2.jpg +t/images/Sanyo.jpg +t/images/Sigma.jpg +t/images/Sigma.x3f +t/images/SigmaDP2.x3f +t/images/Sony.jpg +t/images/Sony.pmp +t/images/Text.csv +t/images/Text1.txt +t/images/Text2.txt +t/images/Text3.txt +t/images/Text4.txt +t/images/Text5.txt +t/images/Torrent.torrent +t/images/Unknown.jpg +t/images/VCard.ics +t/images/VCard.vcf +t/images/Vorbis.ogg +t/images/WTV.wtv +t/images/Writer.jpg +t/images/XMP.inx +t/images/XMP.jpg +t/images/XMP.svg +t/images/XMP.xml +t/images/XMP.xmp +t/images/XMP2.xmp +t/images/XMP3.xmp +t/images/XMP4.xmp +t/images/XMP5.xmp +t/images/XMP6.xmp +t/images/XMP7.xmp +t/images/XMP8.xmp +t/images/XMP9.xmp +t/images/ZIP.gz +t/images/ZIP.zip +t/images/ZISRAW.czi +t/images/iWork.numbers diff --git a/META.json b/META.json new file mode 100644 index 0000000..30fb779 --- /dev/null +++ b/META.json @@ -0,0 +1,51 @@ +{ + "abstract" : "Read and write meta information", + "author" : [ + "Phil Harvey (philharvey66 at gmail.com)" + ], + "dynamic_config" : 1, + "generated_by" : "ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.133380", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Image-ExifTool", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "runtime" : { + "recommends" : { + "Archive::Zip" : "0", + "Compress::Zlib" : "0", + "Digest::MD5" : "0", + "Digest::SHA" : "0", + "IO::Compress::RawDeflate" : "0", + "IO::Uncompress::RawInflate" : "0", + "POSIX::strptime" : "0", + "Time::HiRes" : "0" + }, + "requires" : { + "perl" : "5.004" + } + } + }, + "release_status" : "stable", + "version" : "12.44" +} diff --git a/META.yml b/META.yml new file mode 100644 index 0000000..6dd62a2 --- /dev/null +++ b/META.yml @@ -0,0 +1,31 @@ +--- +abstract: 'Read and write meta information' +author: + - 'Phil Harvey (philharvey66 at gmail.com)' +build_requires: + ExtUtils::MakeMaker: 0 +configure_requires: + ExtUtils::MakeMaker: 0 +dynamic_config: 1 +generated_by: 'ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.133380' +license: perl +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.4.html + version: 1.4 +name: Image-ExifTool +no_index: + directory: + - t + - inc +recommends: + Archive::Zip: 0 + Compress::Zlib: 0 + Digest::MD5: 0 + Digest::SHA: 0 + IO::Compress::RawDeflate: 0 + IO::Uncompress::RawInflate: 0 + POSIX::strptime: 0 + Time::HiRes: 0 +requires: + perl: 5.004 +version: 12.44 diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..361e88f --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,52 @@ +use ExtUtils::MakeMaker; +use File::Spec; + +my $ExifTool_pm = File::Spec->catfile('lib', 'Image', 'ExifTool.pm'); +my $ExifTool_pod = File::Spec->catfile('lib', 'Image', 'ExifTool.pod'); + +WriteMakefile( + NAME => 'Image::ExifTool', + VERSION_FROM => $ExifTool_pm, + PREREQ_PM => { }, + (($ExtUtils::MakeMaker::VERSION gt '6.31' and + $ExtUtils::MakeMaker::VERSION lt '6.46') ? + (EXTRA_META => "recommends:\n" . + " Archive::Zip: 0\n" . + " Compress::Zlib: 0\n" . + " Digest::MD5: 0\n" . + " Digest::SHA: 0\n" . + " Time::HiRes: 0\n" . + " POSIX::strptime: 0\n" . + " IO::Compress::RawDeflate: 0\n" . + " IO::Uncompress::RawInflate: 0\n" , + # (not worth recommending -- only for column alignment of some languages) + # " Unicode::LineBreak: 0\n", + # (not worth recommending -- only for Rawzor files) + # " IO::Compress::Bzip2: 0\n", + ) : ()), + ($ExtUtils::MakeMaker::VERSION ge '6.46' ? + (META_MERGE => { + recommends => { + 'Archive::Zip' => 0, + 'Compress::Zlib' => 0, + 'Digest::MD5' => 0, + 'Digest::SHA' => 0, + 'Time::HiRes' => 0, + 'POSIX::strptime' => 0, + 'IO::Compress::RawDeflate' => 0, + 'IO::Uncompress::RawInflate' => 0, + # 'Unicode::LineBreak' => 0, + # 'IO::Compress::Bzip2' => 0, + }, + } ) : ()), + clean => { FILES => 't/*.tmp' }, + EXE_FILES => [ 'exiftool' ], + ($] >= 5.005 ? + (ABSTRACT_FROM => $ExifTool_pod, + AUTHOR => 'Phil Harvey (philharvey66 at gmail.com)', + ) : ()), + (($ExtUtils::MakeMaker::VERSION gt '6.30') ? + (LICENSE => 'perl') : ()), + (($ExtUtils::MakeMaker::VERSION ge '6.47') ? + (MIN_PERL_VERSION => '5.004') : ()), +); diff --git a/README b/README new file mode 100644 index 0000000..78f0861 --- /dev/null +++ b/README @@ -0,0 +1,255 @@ +ExifTool by Phil Harvey (philharvey66 at gmail.com) +---------------------------------------------------------------------------- + +ExifTool is a customizable set of Perl modules plus a full-featured +command-line application for reading and writing meta information in a wide +variety of files, including the maker note information of many digital +cameras by various manufacturers such as Canon, Casio, DJI, FLIR, FujiFilm, +GE, HP, JVC/Victor, Kodak, Leaf, Minolta/Konica-Minolta, Nikon, Nintendo, +Olympus/Epson, Panasonic/Leica, Pentax/Asahi, Phase One, Reconyx, Ricoh, +Samsung, Sanyo, Sigma/Foveon and Sony. + +Below is a list of file types and meta information formats currently +supported by ExifTool (r = read, w = write, c = create): + + File Types + ------------+-------------+-------------+-------------+------------ + 360 r/w | DR4 r/w/c | JNG r/w | O r | RAW r/w + 3FR r | DSS r | JP2 r/w | ODP r | RIFF r + 3G2 r/w | DV r | JPEG r/w | ODS r | RSRC r + 3GP r/w | DVB r/w | JSON r | ODT r | RTF r + A r | DVR-MS r | JXL r | OFR r | RW2 r/w + AA r | DYLIB r | K25 r | OGG r | RWL r/w + AAE r | EIP r | KDC r | OGV r | RWZ r + AAX r/w | EPS r/w | KEY r | ONP r | RM r + ACR r | EPUB r | LA r | OPUS r | SEQ r + AFM r | ERF r/w | LFP r | ORF r/w | SKETCH r + AI r/w | EXE r | LIF r | ORI r/w | SO r + AIFF r | EXIF r/w/c | LNK r | OTF r | SR2 r/w + APE r | EXR r | LRV r/w | PAC r | SRF r + ARQ r/w | EXV r/w/c | M2TS r | PAGES r | SRW r/w + ARW r/w | F4A/V r/w | M4A/V r/w | PBM r/w | SVG r + ASF r | FFF r/w | MACOS r | PCD r | SWF r + AVI r | FITS r | MAX r | PCX r | THM r/w + AVIF r/w | FLA r | MEF r/w | PDB r | TIFF r/w + AZW r | FLAC r | MIE r/w/ | PDF r/w | TORRENT r + BMP r | FLIF r/w | MIFF r c | PEF r/w | TTC r + BPG r | FLV r | MKA r | PFA r | TTF r + BTF r | FPF r | MKS r | PFB r | TXT r + CHM r | FPX r | MKV r | PFM r | VCF r + COS r | GIF r/w | MNG r/w | PGF r | VRD r/w/c + CR2 r/w | GPR r/w | MOBI r | PGM r/w | VSD r + CR3 r/w | GZ r | MODD r | PLIST r | WAV r + CRM r/w | HDP r/w | MOI r | PICT r | WDP r/w + CRW r/w | HDR r | MOS r/w | PMP r | WEBP r + CS1 r/w | HEIC r/w | MOV r/w | PNG r/w | WEBM r + CSV r | HEIF r/w | MP3 r | PPM r/w | WMA r + CZI r | HTML r | MP4 r/w | PPT r | WMV r + DCM r | ICC r/w/c | MPC r | PPTX r | WTV r + DCP r/w | ICS r | MPG r | PS r/w | WV r + DCR r | IDML r | MPO r/w | PSB r/w | X3F r/w + DFONT r | IIQ r/w | MQV r/w | PSD r/w | XCF r + DIVX r | IND r/w | MRC r | PSP r | XLS r + DJVU r | INSP r/w | MRW r/w | QTIF r/w | XLSX r + DLL r | INSV r | MXF r | R3D r | XMP r/w/c + DNG r/w | INX r | NEF r/w | RA r | ZIP r + DOC r | ISO r | NKSC r/w | RAF r/w | + DOCX r | ITC r | NRW r/w | RAM r | + DPX r | J2C r | NUMBERS r | RAR r | + + Meta Information + ----------------------+----------------------+--------------------- + EXIF r/w/c | CIFF r/w | Ricoh RMETA r + GPS r/w/c | AFCP r/w | Picture Info r + IPTC r/w/c | Kodak Meta r/w | Adobe APP14 r + XMP r/w/c | FotoStation r/w | MPF r + MakerNotes r/w/c | PhotoMechanic r/w | Stim r + Photoshop IRB r/w/c | JPEG 2000 r | DPX r + ICC Profile r/w/c | DICOM r | APE r + MIE r/w/c | Flash r | Vorbis r + JFIF r/w/c | FlashPix r | SPIFF r + Ducky APP12 r/w/c | QuickTime r | DjVu r + PDF r/w/c | Matroska r | M2TS r + PNG r/w/c | MXF r | PE/COFF r + Canon VRD r/w/c | PrintIM r | AVCHD r + Nikon Capture r/w/c | FLAC r | ZIP r + GeoTIFF r/w/c | ID3 r | (and more) + +See html/index.html for more details about ExifTool features. + +ExifTool can be downloaded from + + https://exiftool.org/ + +RUNNING + +The exiftool script can be run right away without the need to install +Image::ExifTool. For example, from within the exiftool directory you can +extract the information from one of the included test files by typing: + + ./exiftool t/images/ExifTool.jpg + +If you move the exiftool script to a different directory, you must also +either move the contents of the lib directory or install the Image::ExifTool +package so the script can find the necessary libraries. + +Note: If you are using the Windows cmd shell, you may need to rename +'exiftool' to 'exiftool.pl' to run it directly from the command line. +Alternatively, you can run exiftool with the command 'perl exiftool'. + +IF YOU ARE STILL CONFUSED + +The exiftool script is a command line application. You run it by typing +commands in a terminal window. The first step is to determine the name of +the directory where you downloaded the ExifTool distribution package. +Assuming, for example, you downloaded it to a folder called "Desktop" in +your home directory, then you would type the following commands in a +terminal window to extract and run ExifTool: + + cd ~/Desktop + gzip -dc Image-ExifTool-12.44.tar.gz | tar -xf - + cd Image-ExifTool-12.44 + ./exiftool t/images/ExifTool.jpg + +Note: These commands extract meta information from one of the test images. +To use one of your images instead, enter the full path name of your file in +place of "t/images/ExifTool.jpg". + +INSTALLATION + +You can install the Image::ExifTool package to make it available for use by +other Perl scripts by typing the following: + + perl Makefile.PL + make + make test + make install + +Notes: + i) You need root access for the last step above. + + ii) Some Perl installations (like the standard OSX installation) may not + contain the necessary files to complete the first step above. But no + worries: You can install ExifTool manually by moving 'exiftool' and the + 'lib' directory to any directory in your current PATH (ie. /usr/bin). + + iii) In Windows, "dmake" or "nmake" may be used if "make" is not + available. + +(Also see html/install.html for more help with installation.) + +DEPENDENCIES + +Requires Perl version 5.004 or later. No other special libraries are +required, however the following modules are recommended for decoding +compressed and/or encrypted information from the indicated file types, and +for calculating digest values and providing other features listed below: + + Archive::Zip (ZIP, DOCX, PPTX, XLSX, ODP, ODS, ODT, EIP, iWork) + Compress::Zlib (DNG, PNG, PDF, DCM, MIE and SWF files) + Digest::MD5 (PDF files, IPTC information, and JPG Extended XMP) + Digest::SHA (PDF with AES-256 encryption) + IO::Compress::Bzip2 (RWZ files) + Time::HiRes (for generating ProcessingTime tag) + POSIX::strptime (for inverse date/time conversion) + Time::Piece (alternative to POSIX::strptime) + Unicode::LineBreak (for column alignment of alternate-language output) + Win32::API (for proper handling of Windows file times) + Win32::FindFile (for Windows Unicode directory support, app only) + Win32API::File (for Windows Unicode file names and file times) + IO::Compress::RawDeflate (for writing FLIF images) + IO::Uncompress::RawInflate (for reading FLIF images) + +COPYRIGHT AND LICENSE + +Copyright 2003-2022, Phil Harvey + +This is free software; you can redistribute it and/or modify it under the +same terms as Perl itself. + +DISTRIBUTION FILES + +Below is a list of the files/directories included in the full ExifTool +distribution package: + + Changes - Revision history + MANIFEST - Full list of distribution files + META.json - Standard CPAN dependency file (JSON format) + META.yml - Standard CPAN dependency file (YAML format) + Makefile.PL - Makefile for installation + README - This file + arg_files/ - Argument files to convert metadata formats: + exif2iptc.args - Arguments for converting EXIF to IPTC + exif2xmp.args - Arguments for converting EXIF to XMP + gps2xmp.args - Arguments for converting GPS to XMP + iptc2exif.args - Arguments for converting IPTC to EXIF + iptc2xmp.args - Arguments for converting IPTC to XMP + iptcCore.args - Complete list of IPTC Core XMP tags + pdf2xmp.args - Arguments for converting PDF to XMP + xmp2exif.args - Arguments for converting XMP to EXIF + xmp2gps.args - Arguments for converting XMP to GPS + xmp2iptc.args - Arguments for converting XMP to IPTC + xmp2pdf.args - Arguments for converting XMP to PDF + config_files/ - Sample ExifTool configuration files: + acdsee.config - Definitions for writing ACDSee XMP regions + age.config - Calculate Age of person in photo + bibble.config - Definitions for writing Bibble XMP tags + convert_regions.config - Convert between MWG, MP and IPTC regions + cuepointlist.config - Extract cue points and labels as a list + depthmap.config - Extract Google DepthMap images + example.config - General example showing config features + fotoware.config - Definitions for writing Fotoware XMP tags + gps2utm.config - Generate UTM coordinate tags from GPS info + gpsdatetime.config - Make GPSDateTime from CreateDate+SampleTime + nksc.config - Decode tags in Nikon ViewNX NKSC files + photoshop_paths.config - For extracting or copying Photoshop paths + picasa_faces.config - Convert from Picasa to MWG/MP face regions + rotate_regions.config - Rotate MWG and MP region tags + tiff_version.config - Determine the version of a TIFF file + time_zone.config - Calculate time zone from EXIF tags + exiftool - The exiftool application (Perl script) + fmt_files/ - Output formatting example files: + gpx.fmt - Format file for creating GPX track + gpx_wpt.fmt - Format file for creating GPX waypoints + kml.fmt - Format file for creating KML placemarks + kml_track.fmt - Format file for creating KML track + html/ - HTML documentation + html/TagNames/ - HTML tag name documentation + lib/ - ExifTool Perl library modules + perl-Image-ExifTool.spec - Red Hat Packaging Manager specification file + t/ - Verification test code + t/images/ - Verification test images + +ADDITIONAL INFORMATION + +Read the following files included in the full distribution for more +information: + + html/index.html - Main ExifTool documentation + html/install.html - Installation instructions + html/history.html - Revision history + html/ExifTool.html - API documentation + html/TagNames/index.html - Tag name documentation + html/geotag.html - Geotag feature + html/faq.html - Frequently asked questions + html/filename.html - Renaming/moving files + html/metafiles.html - Working with metadata sidecar files + html/struct.html - Working with structured XMP information + lib/Image/ExifTool/README - ExifTool library modules documentation + +and if you have installed Image::ExifTool, you can also consult perldoc or +the man pages: + + perldoc exiftool + perldoc Image::ExifTool + perldoc Image::ExifTool::TagNames + + man exiftool + man Image::ExifTool + man Image::ExifTool::TagNames + +Note: If the man pages don't work, it is probably because your man path is +not set to include the installed documentation. See "man man" for +information about how to set the man path. + +---------------------------------------------------------------------------- diff --git a/arg_files/exif2iptc.args b/arg_files/exif2iptc.args new file mode 100644 index 0000000..408d8e4 --- /dev/null +++ b/arg_files/exif2iptc.args @@ -0,0 +1,31 @@ +#------------------------------------------------------------------------------ +# File: exif2iptc.args +# +# Description: Tag name translations for converting EXIF to IPTC +# +# Usage: exiftool -tagsFromFile SRCFILE -@ exif2iptc.args DSTFILE +# +# Requires: ExifTool version 6.51 or later +# +# Revisions: 2011/09/13 - P. Harvey Created +# 2017/07/06 - PH Set time zone from new EXIF OffsetTime tags +# +# Notes: 1) IPTC requires a timezone but EXIF does not support one, so +# the local timezone is assumed when writing the IPTC times +# +# 2) These arguments will not delete existing IPTC tags which are +# missing from the EXIF. The IPTC tags should be deleted +# beforehand if required. +#------------------------------------------------------------------------------ +-IPTC:By-line < EXIF:Artist +-IPTC:CopyrightNotice < EXIF:Copyright +-IPTC:Caption-Abstract < EXIF:ImageDescription +# the inverse IPTC date and time conversions automagically pull the +# appropriate date or time part out of the EXIF date/time value +-IPTC:DateCreated < EXIF:DateTimeOriginal +-IPTC:TimeCreated < EXIF:DateTimeOriginal +-IPTC:TimeCreated < Composite:SubSecDateTimeOriginal +-IPTC:DigitalCreationDate < EXIF:CreateDate +-IPTC:DigitalCreationTime < EXIF:CreateDate +-IPTC:DigitalCreationTime < Composite:SubSecCreateDate +# end diff --git a/arg_files/exif2xmp.args b/arg_files/exif2xmp.args new file mode 100644 index 0000000..234a0cb --- /dev/null +++ b/arg_files/exif2xmp.args @@ -0,0 +1,53 @@ +#------------------------------------------------------------------------------ +# File: exif2xmp.args +# +# Description: Tag name translations for converting EXIF to XMP +# +# Usage: exiftool -tagsFromFile SRCFILE -@ exif2xmp.args DSTFILE +# +# Requires: ExifTool version 10.96 or later +# +# Revisions: 2009/01/20 - P. Harvey Created +# 2011/06/22 - PH Copy flash information via Composite:Flash +# 2013/06/12 - PH Additions for the Exif 2.3 for XMP spec +# 2015/01/12 - PH Avoid copying to non-standard namespaces +# 2018/05/07 - PH Added support for GPSDestXxxRef tags +# 2022/03/31 - PH IPTC Photometadata Mapping Guidelines 2202.1 update +# +# References: http://www.metadataworkinggroup.org/specs/ +# https://iptc.org/std/photometadata/documentation/mappingguidelines/ +# +# Notes: 1) The first three arguments copy most of the EXIF and GPS tags to +# XMP-exif/XMP-tiff, and the remaining arguments handle tags +# which have different names and/or formats in EXIF and XMP. +# +# 2) These arguments will not delete existing XMP tags which are +# missing from the EXIF. The XMP tags should be deleted +# beforehand if required. +# +# 3) EXIF:SubjectArea is not currently mapped into XMP-iptcExt:ImageRegion +#------------------------------------------------------------------------------ +-XMP-exif:all < EXIF:all +-XMP-exifEX:all < EXIF:all +-XMP-tiff:all < EXIF:all +-XMP-dc:Description < EXIF:ImageDescription +# overwrite date/time values to include sub-second information if available +-XMP-photoshop:DateCreated < EXIF:DateTimeOriginal +-XMP-photoshop:DateCreated < Composite:SubSecDateTimeOriginal +-XMP-xmp:CreateDate < EXIF:CreateDate +-XMP-xmp:CreateDate < Composite:SubSecCreateDate +-XMP-xmp:ModifyDate < EXIF:ModifyDate +-XMP-xmp:ModifyDate < Composite:SubSecModifyDate +-XMP-xmp:CreatorTool < EXIF:Software +-XMP-dc:Rights < EXIF:Copyright +-XMP-dc:Creator < EXIF:Artist +-XMP-iptcExt:DigitalImageGUID < EXIF:DigImageGUID +# XMP flash information is translated by the Composite Flash tag +-Composite:Flash < EXIF:Flash +# overwrite GPS tags which have different formats in XMP +-XMP:GPSLatitude < Composite:GPSLatitude +-XMP:GPSLongitude < Composite:GPSLongitude +-XMP:GPSDestLatitude < Composite:GPSDestLatitude +-XMP:GPSDestLongitude < Composite:GPSDestLongitude +-XMP:GPSDateTime < Composite:GPSDateTime +# end diff --git a/arg_files/gps2xmp.args b/arg_files/gps2xmp.args new file mode 100644 index 0000000..96482ba --- /dev/null +++ b/arg_files/gps2xmp.args @@ -0,0 +1,27 @@ +#------------------------------------------------------------------------------ +# File: gps2xmp.args +# +# Description: Argument file for copying GPS information from EXIF to XMP +# +# Usage: exiftool -tagsFromFile SRCFILE -@ gps2xmp.args DSTFILE +# +# Requires: ExifTool version 10.96 or later +# +# Revisions: 2009/01/09 - P. Harvey Created +# 2018/05/07 - PH Handle GPSDestLatitude/LongitudeRef tags +# +# Notes: 1) Most of the GPS tags are copied by the first argument, but +# the XMP GPS coordinate and date/time tags are composites of +# more than one EXIF GPS tag, so they are handled separately. +# +# 2) These arguments will not delete existing XMP tags which are +# missing from the GPS. The XMP GPS tags should be deleted +# first with "-xmp:gps*=" if required. +#------------------------------------------------------------------------------ +-XMP:all < GPS:all +-XMP:GPSLatitude < Composite:GPSLatitude +-XMP:GPSLongitude < Composite:GPSLongitude +-XMP:GPSDestLatitude < Composite:GPSDestLatitude +-XMP:GPSDestLongitude < Composite:GPSDestLongitude +-XMP:GPSDateTime < Composite:GPSDateTime +# end diff --git a/arg_files/iptc2exif.args b/arg_files/iptc2exif.args new file mode 100644 index 0000000..4cafcc8 --- /dev/null +++ b/arg_files/iptc2exif.args @@ -0,0 +1,24 @@ +#------------------------------------------------------------------------------ +# File: iptc2exif.args +# +# Description: Tag name translations for converting IPTC to EXIF +# +# Usage: exiftool -tagsFromFile SRCFILE -@ iptc2exif.args DSTFILE +# +# Requires: ExifTool version 7.98 or later +# +# Revisions: 2011/09/13 - P. Harvey Created +# 2017/07/06 - PH Set new EXIF OffsetTime tags +# +# Notes: These arguments will not delete existing EXIF tags which are +# missing from the IPTC. The EXIF tags should be deleted +# beforehand if required. +#------------------------------------------------------------------------------ +-EXIF:Artist < IPTC:By-line +-EXIF:Copyright < IPTC:CopyrightNotice +-EXIF:ImageDescription < IPTC:Caption-Abstract +-EXIF:DateTimeOriginal < Composite:DateTimeCreated +-EXIF:CreateDate < Composite:DigitalCreationDateTime +-EXIF:OffsetTimeOriginal < IPTC:TimeCreated +-EXIF:OffsetTimeDigitized < IPTC:DigitalCreationTime +# end diff --git a/arg_files/iptc2xmp.args b/arg_files/iptc2xmp.args new file mode 100644 index 0000000..1e387f6 --- /dev/null +++ b/arg_files/iptc2xmp.args @@ -0,0 +1,57 @@ +#------------------------------------------------------------------------------ +# File: iptc2xmp.args +# +# Description: Tag name translations for converting from IPTC to XMP +# +# Usage: exiftool -tagsFromFile SRCFILE -@ iptc2xmp.args DSTFILE +# +# Requires: ExifTool version 7.45 or later +# +# Revisions: 2005/05/14 - P. Harvey Created +# 2008/03/04 - PH Changed Location translation and added +# IntellectualGenre and SubjectCode +# 2008/09/30 - PH Added writing of Photoshop:IPTCDigest +# 2009/01/20 - PH Updated to conform with MWG spec +# 2009/10/21 - PH Write XMP-xmp:CreateDate as per MWG 1.01 spec +# +# References: http://www.iptc.org/IPTC4XMP/ +# http://www.iptc.org/IIM/ +# http://www.adobe.com/products/xmp/pdfs/xmpspec.pdf +# http://www.metadataworkinggroup.org/specs/ +# +# Notes: 1) Also updates Photoshop:IPTCDigest as per MWG recommendation. +# +# 2) These arguments will not delete existing XMP tags which are +# missing from the IPTC. The XMP tags should be deleted +# beforehand if required. +#------------------------------------------------------------------------------ +-XMP-dc:Creator < IPTC:By-line +-XMP-dc:Description < IPTC:Caption-Abstract +-XMP-dc:Rights < IPTC:CopyrightNotice +-XMP-dc:Subject < IPTC:Keywords +-XMP-dc:Title < IPTC:ObjectName +-XMP-photoshop:AuthorsPosition < IPTC:By-lineTitle +-XMP-photoshop:CaptionWriter < IPTC:Writer-Editor +-XMP-photoshop:Category < IPTC:Category +-XMP-photoshop:City < IPTC:City +-XMP-photoshop:Country < IPTC:Country-PrimaryLocationName +-XMP-photoshop:Credit < IPTC:Credit +-XMP-photoshop:DateCreated < IPTC:DateCreated +# overwrite XMP DateCreated to include date and time if available +-XMP-photoshop:DateCreated < Composite:DateTimeCreated +-XMP-photoshop:Headline < IPTC:Headline +-XMP-photoshop:Instructions < IPTC:SpecialInstructions +-XMP-photoshop:Source < IPTC:Source +-XMP-photoshop:State < IPTC:Province-State +-XMP-photoshop:SupplementalCategories < IPTC:SupplementalCategories +-XMP-photoshop:TransmissionReference < IPTC:OriginalTransmissionReference +-XMP-photoshop:Urgency < IPTC:Urgency +-XMP-iptcCore:CountryCode < IPTC:Country-PrimaryLocationCode +-XMP-iptcCore:Location < IPTC:Sub-location +-XMP-xmp:CreateDate < IPTC:DigitalCreationDate +-XMP-xmp:CreateDate < Composite:DigitalCreationDateTime +# these tags are not free-form text, and may need special handling: +#-XMP-iptcCore:IntellectualGenre < IPTC:ObjectAttributeReference +#-XMP-iptcCore:SubjectCode < IPTC:SubjectReference +-Photoshop:IPTCDigest=new +# end diff --git a/arg_files/iptcCore.args b/arg_files/iptcCore.args new file mode 100644 index 0000000..1f3de09 --- /dev/null +++ b/arg_files/iptcCore.args @@ -0,0 +1,241 @@ +#------------------------------------------------------------------------------ +# File: iptcCore.args +# +# Description: ExifTool arguments for IPTC Core and Extension tags +# +# Usage: exiftool -@ iptcCore.args FILE +# +# Requires: ExifTool version 8.44 or later +# +# Revisions: 2011/12/28 - P. Harvey Created (IPTC Core version 1.1) +# 2015/04/21 - PH Updated to IPTC Extension version 1.2 +# 2017/06/02 - PH Updated to IPTC Extension version 1.3 +# 2018/08/20 - PH Updated to IPTC Extension version 1.4 +# +# References: http://www.iptc.org/IPTC4XMP/ +# +# Notes: Both flattened and structured tags are included +#------------------------------------------------------------------------------ + +# +# dc schema +# + +-XMP-dc:Creator +-XMP-dc:Description +-XMP-dc:Rights +-XMP-dc:Subject +-XMP-dc:Title + +# +# photoshop schema +# + +-XMP-photoshop:AuthorsPosition +-XMP-photoshop:CaptionWriter +-XMP-photoshop:City +-XMP-photoshop:Country +-XMP-photoshop:Credit +-XMP-photoshop:DateCreated +-XMP-photoshop:Headline +-XMP-photoshop:Instructions +-XMP-photoshop:Source +-XMP-photoshop:State +-XMP-photoshop:TransmissionReference + +# +# xmp schema +# + +-XMP-xmp:Rating + +# +# xmpRights schema +# + +-XMP-xmpRights:UsageTerms +-XMP-xmpRights:WebStatement + +# +# Iptc4xmpCore schema +# + +-XMP-iptcCore:CountryCode + +# ContactInfo struct +-XMP-iptcCore:CreatorContactInfo +-XMP-iptcCore:CreatorAddress +-XMP-iptcCore:CreatorCity +-XMP-iptcCore:CreatorCountry +-XMP-iptcCore:CreatorPostalCode +-XMP-iptcCore:CreatorRegion +-XMP-iptcCore:CreatorWorkEmail +-XMP-iptcCore:CreatorWorkTelephone +-XMP-iptcCore:CreatorWorkURL + +-XMP-iptcCore:IntellectualGenre +-XMP-iptcCore:Location +-XMP-iptcCore:Scene +-XMP-iptcCore:SubjectCode + +# +# Iptc4xmpExt schema +# + +-XMP-iptcExt:AdditionalModelInformation + +# CVTermDetails struct +-XMP-iptcExt:AboutCvTerm +-XMP-iptcExt:AboutCvTermCvId +-XMP-iptcExt:AboutCvTermId +-XMP-iptcExt:AboutCvTermName +-XMP-iptcExt:AboutCvTermRefinedAbout + +# ArtworkOrObjectDetails struct +-XMP-iptcExt:ArtworkOrObject +-XMP-iptcExt:ArtworkCopyrightNotice +-XMP-iptcExt:ArtworkCreator +-XMP-iptcExt:ArtworkDateCreated +-XMP-iptcExt:ArtworkSource +-XMP-iptcExt:ArtworkSourceInventoryNo +-XMP-iptcExt:ArtworkTitle +-XMP-iptcExt:ArtworkCopyrightOwnerName +-XMP-iptcExt:ArtworkCopyrightOwnerID +-XMP-iptcExt:ArtworkLicensorName +-XMP-iptcExt:ArtworkLicensorID +-XMP-iptcExt:ArtworkCreatorID +-XMP-iptcExt:ArtworkCircaDateCreated +-XMP-iptcExt:ArtworkStylePeriod +-XMP-iptcExt:ArtworkSourceInvURL +-XMP-iptcExt:ArtworkContentDescription +-XMP-iptcExt:ArtworkContributionDescription +-XMP-iptcExt:ArtworkPhysicalDescription + +-XMP-iptcExt:ControlledVocabularyTerm +-XMP-iptcExt:DigitalImageGUID +-XMP-iptcExt:DigitalSourcefileType +-XMP-iptcExt:DigitalSourceType + +# EEREDetails struct +-XMP-iptcExt:EmbdEncRightsExpr +-XMP-iptcExt:EmbeddedEncodedRightsExpr +-XMP-iptcExt:EmbeddedEncodedRightsExprType +-XMP-iptcExt:EmbeddedEncodedRightsExprLangID + +-XMP-iptcExt:Event +-XMP-iptcExt:IPTCLastEdited + +# LEREDetails struct +-XMP-iptcExt:LinkedEncRightsExpr +-XMP-iptcExt:LinkedEncodedRightsExpr +-XMP-iptcExt:LinkedEncodedRightsExprType +-XMP-iptcExt:LinkedEncodedRightsExprLangID + +# LocationDetails struct +-XMP-iptcExt:LocationCreated +-XMP-iptcExt:LocationCreatedCity +-XMP-iptcExt:LocationCreatedCountryCode +-XMP-iptcExt:LocationCreatedCountryName +-XMP-iptcExt:LocationCreatedProvinceState +-XMP-iptcExt:LocationCreatedSublocation +-XMP-iptcExt:LocationCreatedWorldRegion +-XMP-iptcExt:LocationCreatedLocationId + +# LocationDetails struct +-XMP-iptcExt:LocationShown +-XMP-iptcExt:LocationShownCity +-XMP-iptcExt:LocationShownCountryCode +-XMP-iptcExt:LocationShownCountryName +-XMP-iptcExt:LocationShownProvinceState +-XMP-iptcExt:LocationShownSublocation +-XMP-iptcExt:LocationShownWorldRegion +-XMP-iptcExt:LocationShownLocationId + +-XMP-iptcExt:MaxAvailHeight +-XMP-iptcExt:MaxAvailWidth +-XMP-iptcExt:ModelAge +-XMP-iptcExt:OrganisationInImageCode +-XMP-iptcExt:OrganisationInImageName +-XMP-iptcExt:PersonInImage + +# PersonDetails struct +-XMP-iptcExt:PersonInImageWDetails +-XMP-iptcExt:PersonInImageId +-XMP-iptcExt:PersonInImageName +-XMP-iptcExt:PersonInImageDescription +# CVTermDetails struct +#-XMP-iptcExt:PersonInImageCharacteristic +-XMP-iptcExt:PersonInImageCvTermCvId +-XMP-iptcExt:PersonInImageCvTermId +-XMP-iptcExt:PersonInImageCvTermName +-XMP-iptcExt:PersonInImageCvTermRefinedAbout + +# ProductDetails struct +-XMP-iptcExt:ProductInImage +-XMP-iptcExt:ProductInImageName +-XMP-iptcExt:ProductInImageGTIN +-XMP-iptcExt:ProductInImageDescription + +# RegistryEntryDetails struct +-XMP-iptcExt:RegistryID +-XMP-iptcExt:RegistryItemID +-XMP-iptcExt:RegistryOrganisationID +-XMP-iptcExt:RegistryEntryRole + +# Genre struct +-XMP-iptcExt:Genre +-XMP-iptcExt:GenreCvId +-XMP-iptcExt:GenreCvTermId +-XMP-iptcExt:GenreCvTermName +-XMP-iptcExt:GenreCvTermRefinedAbout + +# +# plus schema +# + +# CopyrightOwnerDetail struct +-XMP-plus:CopyrightOwner +-XMP-plus:CopyrightOwnerID +-XMP-plus:CopyrightOwnerImageID +-XMP-plus:CopyrightOwnerName + +# ImageCreatorDetail struct +-XMP-plus:ImageCreator +-XMP-plus:ImageCreatorID +-XMP-plus:ImageCreatorImageID +-XMP-plus:ImageCreatorName + +# ImageSupplierDetail struct +-XMP-plus:ImageSupplier +-XMP-plus:ImageSupplierID +-XMP-plus:ImageSupplierImageID +-XMP-plus:ImageSupplierName + +# LicensorDetail struct +-XMP-plus:Licensor +-XMP-plus:LicensorCity +-XMP-plus:LicensorCountry +-XMP-plus:LicensorEmail +-XMP-plus:LicensorExtendedAddress +-XMP-plus:LicensorID +-XMP-plus:LicensorImageID +-XMP-plus:LicensorName +-XMP-plus:LicensorNotes +-XMP-plus:LicensorPostalCode +-XMP-plus:LicensorRegion +-XMP-plus:LicensorStreetAddress +-XMP-plus:LicensorTelephone1 +-XMP-plus:LicensorTelephone2 +-XMP-plus:LicensorTelephoneType1 +-XMP-plus:LicensorTelephoneType2 +-XMP-plus:LicensorTransactionID +-XMP-plus:LicensorURL + +-XMP-plus:MinorModelAgeDisclosure +-XMP-plus:ModelReleaseID +-XMP-plus:ModelReleaseStatus +-XMP-plus:PLUSVersion +-XMP-plus:PropertyReleaseID +-XMP-plus:PropertyReleaseStatus + +# end diff --git a/arg_files/pdf2xmp.args b/arg_files/pdf2xmp.args new file mode 100644 index 0000000..58eb288 --- /dev/null +++ b/arg_files/pdf2xmp.args @@ -0,0 +1,27 @@ +#------------------------------------------------------------------------------ +# File: pdf2xmp.args +# +# Description: Tag name translations for converting from PDF DocInfo to XMP +# +# Usage: exiftool -tagsFromFile SRCFILE -@ pdf2xmp.args DSTFILE +# +# Requires: ExifTool version 7.07 or later +# +# Revisions: 2011/01/23 - P. Harvey Created +# +# References: http://www.adobe.com/devnet/xmp/ +# +# Notes: These arguments will not delete existing XMP tags which are +# missing from the PDF. The XMP tags should be deleted +# beforehand if required. +#------------------------------------------------------------------------------ +-XMP-dc:Title < PDF:Title +-XMP-dc:Creator < PDF:Author +-XMP-dc:Description < PDF:Subject +-XMP-pdf:Keywords < PDF:Keywords +-XMP-xmp:CreatorTool < PDF:Creator +-XMP-pdf:Producer < PDF:Producer +-XMP-xmp:CreateDate < PDF:CreateDate +-XMP-xmp:ModifyDate < PDF:ModifyDate +-XMP-pdf:Trapped < PDF:Trapped +# end diff --git a/arg_files/xmp2exif.args b/arg_files/xmp2exif.args new file mode 100644 index 0000000..e06da76 --- /dev/null +++ b/arg_files/xmp2exif.args @@ -0,0 +1,56 @@ +#------------------------------------------------------------------------------ +# File: xmp2exif.args +# +# Description: Tag name translations for converting XMP to EXIF +# +# Usage: exiftool -tagsFromFile SRCFILE -@ xmp2exif.args DSTFILE +# +# Requires: ExifTool version 10.96 or later +# +# Revisions: 2009/01/20 - P. Harvey Created +# 2011/06/22 - PH Copy flash information via Composite:Flash +# 2013/06/12 - PH Additions for the Exif 2.3 for XMP spec +# 2015/01/12 - PH Avoid copying from non-standard namespaces +# 2016/09/26 - PH Write Composite SubSec tags +# 2018/05/07 - PH Added support for GPSDestXxxRef tags +# 2021/09/30 - PH Removed erroneous "-" when copying CreatorTool +# 2022/03/31 - PH IPTC Photometadata Mapping Guidelines 2202.1 update +# +# References: http://www.metadataworkinggroup.org/specs/ +# https://iptc.org/std/photometadata/documentation/mappingguidelines/ +# +# Notes: 1) The first three arguments copy the bulk of the EXIF and GPS +# information, and the remaining arguments handle the tags +# which have different names and/or formats in XMP and EXIF. +# +# 2) These arguments will not delete existing EXIF tags which are +# missing from the XMP. The EXIF tags should be deleted +# beforehand if required. +# +# 3) XMP-iptcExt:ImageRegion is not currently mapped into EXIF:SubjectArea +#------------------------------------------------------------------------------ +-EXIF:all < XMP-exif:all +-EXIF:all < XMP-exifEX:all +-EXIF:all < XMP-tiff:all +-EXIF:ImageDescription < XMP-dc:Description +-EXIF:DateTimeOriginal < XMP-photoshop:DateCreated +# the following 3 SubSec tags also write/delete the corresponding EXIF +# SubSecTime and OffsetTime tags as appropriate +-Composite:SubSecDateTimeOriginal < XMP-photoshop:DateCreated +-Composite:SubSecCreateDate < XMP-xmp:CreateDate +-Composite:SubSecModifyDate < XMP-xmp:ModifyDate +-EXIF:Software < XMP-xmp:CreatorTool +-EXIF:Copyright < XMP-dc:Rights +-EXIF:Artist < XMP-plus:ImageCreatorName +-EXIF:Artist < XMP-dc:Creator +-EXIF:DigImageGUID < XMP-iptcExt:DigitalImageGUID +# XMP flash information is translated by the Composite Flash tag +-EXIF:Flash < Composite:Flash +# generate GPS tags which have been combined into other XMP tags +-GPS:GPSLatitudeRef < Composite:GPSLatitudeRef +-GPS:GPSLongitudeRef < Composite:GPSLongitudeRef +-GPS:GPSDestLatitudeRef < Composite:GPSDestLatitudeRef +-GPS:GPSDestLongitudeRef < Composite:GPSDestLongitudeRef +-GPS:GPSDatestamp < XMP-exif:GPSDateTime +-GPS:GPSTimestamp < XMP-exif:GPSDateTime +# end diff --git a/arg_files/xmp2gps.args b/arg_files/xmp2gps.args new file mode 100644 index 0000000..0e978f3 --- /dev/null +++ b/arg_files/xmp2gps.args @@ -0,0 +1,31 @@ +#------------------------------------------------------------------------------ +# File: xmp2gps.args +# +# Description: Argument file for copying GPS information from XMP to EXIF +# +# Usage: exiftool -tagsFromFile SRCFILE -@ xmp2gps.args DSTFILE +# +# Requires: ExifTool version 10.96 or later +# +# Revisions: 2009/01/09 - P. Harvey Created +# 2018/05/07 - PH Handle GPSDestLatitude/LongitudeRef tags +# +# Notes: 1) Most of the GPS tags are copied by the first argument, but +# the coordinate references and date/time values are stored +# separately in EXIF, so they must be handled separately. +# A bit of magic is employed by ExifTool to extract the date +# and time parts respectively when writing date-only and +# time-only tags with a date/time value. +# +# 2) These arguments will not delete existing GPS tags which are +# missing from the XMP. The GPS tags should be deleted with +# "-gps:all=" first if required. +#------------------------------------------------------------------------------ +-GPS:all < XMP-exif:all +-GPS:GPSLatitudeRef < Composite:GPSLatitudeRef +-GPS:GPSLongitudeRef < Composite:GPSLongitudeRef +-GPS:GPSDestLatitudeRef < Composite:GPSDestLatitudeRef +-GPS:GPSDestLongitudeRef < Composite:GPSDestLongitudeRef +-GPS:GPSDateStamp < XMP-exif:GPSDateTime +-GPS:GPSTimeStamp < XMP-exif:GPSDateTime +# end diff --git a/arg_files/xmp2iptc.args b/arg_files/xmp2iptc.args new file mode 100644 index 0000000..3d87317 --- /dev/null +++ b/arg_files/xmp2iptc.args @@ -0,0 +1,66 @@ +#------------------------------------------------------------------------------ +# File: xmp2iptc.args +# +# Description: Tag name translations for converting from XMP to IPTC +# +# Usage: exiftool -tagsFromFile SRCFILE -@ xmp2iptc.args DSTFILE +# +# Requires: ExifTool version 7.45 or later +# +# Revisions: 2005/05/14 - P. Harvey Created +# 2008/03/04 - PH Changed Location translation and added +# IntellectualGenre and SubjectCode +# 2008/09/30 - PH Added writing of Photoshop:IPTCDigest +# 2009/01/20 - PH Updated to conform with MWG spec +# 2009/10/21 - PH Write IPTC:DigitalCreationDate/Time tags +# +# References: http://www.iptc.org/IPTC4XMP/ +# http://www.iptc.org/IIM/ +# http://www.adobe.com/products/xmp/pdfs/xmpspec.pdf +# http://www.metadataworkinggroup.org/specs/ +# +# Notes: 1) Also updates Photoshop:IPTCDigest as per MWG recommendation. +# +# 2) For special characters in the XMP to be preserved, the IPTC +# encoding must be UTF-8: Either IPTC:CodedCharacterSet must +# already be "UTF8", or it must be set to "UTF8" when copying the +# XMP. This is not done automatically by this argfile because it +# could invalidate the encoding of existing IPTC if there were +# any values containing special characters. See FAQ number 10 +# for more information about converting the IPTC encoding: +# https://exiftool.org/faq.html#Q10 +# +# 3) These arguments will not delete existing IPTC tags which are +# missing from the XMP. The IPTC tags should be deleted +# beforehand if required. +#------------------------------------------------------------------------------ +-IPTC:By-line < XMP-dc:Creator +-IPTC:Caption-Abstract < XMP-dc:Description +-IPTC:CopyrightNotice < XMP-dc:Rights +-IPTC:Keywords < XMP-dc:Subject +-IPTC:ObjectName < XMP-dc:Title +-IPTC:By-lineTitle < XMP-photoshop:AuthorsPosition +-IPTC:Writer-Editor < XMP-photoshop:CaptionWriter +-IPTC:Category < XMP-photoshop:Category +-IPTC:City < XMP-photoshop:City +-IPTC:Country-PrimaryLocationName < XMP-photoshop:Country +-IPTC:Credit < XMP-photoshop:Credit +-IPTC:DateCreated < XMP-photoshop:DateCreated +# magically extracts time from a date/time value +-IPTC:TimeCreated < XMP-photoshop:DateCreated +-IPTC:Headline < XMP-photoshop:Headline +-IPTC:SpecialInstructions < XMP-photoshop:Instructions +-IPTC:Source < XMP-photoshop:Source +-IPTC:Province-State < XMP-photoshop:State +-IPTC:SupplementalCategories < XMP-photoshop:SupplementalCategories +-IPTC:OriginalTransmissionReference < XMP-photoshop:TransmissionReference +-IPTC:Urgency < XMP-photoshop:Urgency +-IPTC:Country-PrimaryLocationCode < XMP-iptcCore:CountryCode +-IPTC:Sub-location < XMP-iptcCore:Location +-IPTC:DigitalCreationDate < XMP-xmp:CreateDate +-IPTC:DigitalCreationTime < XMP-xmp:CreateDate +# these tags are not free-form text, and may need special handling: +#-IPTC:ObjectAttributeReference < XMP-iptcCore:IntellectualGenre +#-IPTC:SubjectReference < XMP-iptcCore:SubjectCode +-Photoshop:IPTCDigest=new +# end diff --git a/arg_files/xmp2pdf.args b/arg_files/xmp2pdf.args new file mode 100644 index 0000000..b7f8ab8 --- /dev/null +++ b/arg_files/xmp2pdf.args @@ -0,0 +1,27 @@ +#------------------------------------------------------------------------------ +# File: xmp2pdf.args +# +# Description: Tag name translations for converting from XMP to PDF DocInfo +# +# Usage: exiftool -tagsFromFile SRCFILE -@ xmp2pdf.args DSTFILE +# +# Requires: ExifTool version 7.07 or later +# +# Revisions: 2011/01/23 - P. Harvey Created +# +# References: http://www.adobe.com/devnet/xmp/ +# +# Notes: These arguments will not delete existing PDF tags which are +# missing from the XMP. The PDF tags should be deleted +# beforehand if required. +#------------------------------------------------------------------------------ +-PDF:Title < XMP-dc:Title +-PDF:Author < XMP-dc:Creator +-PDF:Subject < XMP-dc:Description +-PDF:Keywords < XMP-pdf:Keywords +-PDF:Creator < XMP-xmp:CreatorTool +-PDF:Producer < XMP-pdf:Producer +-PDF:CreateDate < XMP-xmp:CreateDate +-PDF:ModifyDate < XMP-xmp:ModifyDate +-PDF:Trapped < XMP-pdf:Trapped +# end diff --git a/config_files/acdsee.config b/config_files/acdsee.config new file mode 100644 index 0000000..2fa4743 --- /dev/null +++ b/config_files/acdsee.config @@ -0,0 +1,258 @@ +#------------------------------------------------------------------------------ +# File: acdsee.config +# +# Description: This config file defines ACDSee XMP region tags for writing. +# The following tags are created in the XMP-acdsee-rs group +# +# RegionInfoACDSee : The structured tag for the ACDSee regions +# (similar to XMP-mwg-rs:RegionInfo) +# +# The following tags are the width, height, and unit of the +# image at the time of processing when storing image region +# metadata. They are similar to the AppliedToDimensions tags +# of the MWG regions. +# ACDSeeRegionAppliedToDimensionsH : Height of the image +# ACDSeeRegionAppliedToDimensionsUnit : Unit of the image +# ACDSeeRegionAppliedToDimensionsW : Width of the image +# +# Actual region data, stored in an array. These flattened tags +# are treated as List Type tags. There are two region types, +# the ALYArea and the DLYArea. The ALYArea tags tags assigned +# by ACDSee and are usually square in dimensions. The DLYArea +# tags are both the tags assigned by ACDSee (but possibly +# rectangular instead of square) as well as any manual +# assigned tags. They are similar to the area tags of the MWG +# regions. +# ACDSeeRegionDLYAreaH : Height of DLY region +# ACDSeeRegionDLYAreaW : Width of DLY region +# ACDSeeRegionDLYAreaX : X centerpoint of DLY region +# ACDSeeRegionDLYAreaY : Y centerpoint of DLY region +# ACDSeeRegionALYAreaH : Height of ALY region +# ACDSeeRegionALYAreaW : Width of ALY region +# ACDSeeRegionALYAreaX : X centerpoint of ALY region +# ACDSeeRegionALYAreaY : Y centerpoint of ALY region +# ACDSeeRegionName : Name of region +# ACDSeeRegionType : Type of region +# ACDSeeRegionNameAssignType : How the type was assigned. +# "Manual" is the only known +# entry at this time +# +# Conversion tags. These tags can be used to convert other region +# type tags to ACDSee regions. +# MPRegion2ACDSeeRegion : Converts a Microsoft RegionInfoMP +# IPTCRegion2ACDSeeRegion : Converts an IPTC ImageRegion +# MWGRegion2ACDSeeRegion : Converts a MWG RegionInfo +# +# Usage: To set individual tags +# exiftool -config acdsee.config -ACDSEETAG=VALUE FILE ... +# +# To convert Microsoft Regions to ACDSee regions +# exiftool -config acdsee.config "-RegionInfoACDSee "ACDSeeRegionAppliedToDimensions*" +# "RegionInfoACDSeeRegionList* -> "ACDSeeRegion*" +#------------------------------------------------------------------------------ +use Data::Dumper; + +my %sACDSeeDimensions = ( + STRUCT_NAME => 'ACDSee Dimensions', + NAMESPACE => {'acdsee-stDim' => 'http://ns.acdsee.com/sType/Dimensions#'}, + 'w' => { Writable => 'real' }, + 'h' => { Writable => 'real' }, + 'unit' => { }, +); + +my %sACDSeeArea = ( + STRUCT_NAME => 'ACDSee Area', + NAMESPACE => { 'acdsee-stArea' => 'http://ns.acdsee.com/sType/Area#' }, + 'x' => { Writable => 'real' }, + 'y' => { Writable => 'real' }, + w => { Writable => 'real' }, + h => { Writable => 'real' }, +); + +my %sACDSeeRegionStruct = ( + STRUCT_NAME => 'ACDSee Regions', + NAMESPACE => { 'acdsee-rs' => 'http://ns.acdsee.com/regions/' }, + ALGArea => { Struct => \%sACDSeeArea }, + DLYArea => { Struct => \%sACDSeeArea }, + Name => { }, + NameAssignType => { }, + Type => { }, +); + +%Image::ExifTool::UserDefined = ( + # new XMP namespaces for ACDSee regions + 'Image::ExifTool::XMP::Main' => { + 'acdsee-rs' => { # <-- must be the same as the NAMESPACE prefix + SubDirectory => { + TagTable => 'Image::ExifTool::UserDefined::ACDSeeRegions' + }, + }, + }, + 'Image::ExifTool::Composite' => { + # create an ACDSee RegionInfo structure from a Microsoft RegionInfoMP structure + MPRegion2ACDSeeRegion => { + Require => { + 0 => 'RegionInfoMP', + 1 => 'ImageWidth', + 2 => 'ImageHeight', + }, + ValueConv => q{ + my ($rgn, @newRgns); + foreach $rgn (@{$val[0]{Regions}}) { + my $name = $$rgn{PersonDisplayName}; + next unless $$rgn{Rectangle} or defined $name; + my %newRgn = ( Type => 'Face' ); + if (defined $name) { + # don't add ignored faces + next if $name eq 'ffffffffffffffff'; + $newRgn{Name} = $name; + } + if ($$rgn{Rectangle}) { + my @rect = split /\s*,\s*/, $$rgn{Rectangle}; + $newRgn{DLYArea} = { + X => $rect[0] + $rect[2]/2, + Y => $rect[1] + $rect[3]/2, + W => $rect[2], + H => $rect[3], + } if @rect == 4; + } + push @newRgns, \%newRgn; + } + return { + AppliedToDimensions => { W => $val[1], H => $val[2], Unit => 'pixel' }, + RegionList => \@newRgns, + }; + }, + }, + # create an ACDSee RegionInfo structure from an IPTC ImageRegion list + IPTCRegion2ACDSeeRegion => { + Require => { + 0 => 'ImageRegion', + 1 => 'ImageWidth', + 2 => 'ImageHeight', + }, + ValueConv => q{ + my ($rgn, @newRgns); + my $rgns = ref $val[0] eq 'ARRAY' ? $val[0] : [ $val[0] ]; + foreach $rgn (@$rgns) { + my %newRgn = ( Type => 'Face' ); + if ($$rgn{RegionBoundary} and $$rgn{RegionBoundary}{RbShape} eq 'rectangle') { + my @rect = @{$$rgn{RegionBoundary}}{'RbX','RbY','RbW','RbH'}; + if ($$rgn{RegionBoundary}{RbUnit} eq 'pixel') { + $rect[0] /= $val[1], $rect[2] /= $val[1]; + $rect[1] /= $val[2]; $rect[3] /= $val[2]; + } + $newRgn{'DLYArea'} = { + X => $rect[0] + $rect[2]/2, + Y => $rect[1] + $rect[3]/2, + W => $rect[2], + H => $rect[3], + }; + } else { + next unless defined $$rgn{Name}; + } + $newRgn{Name} = $$rgn{Name} if defined $$rgn{Name}; + push @newRgns, \%newRgn; + } + return { + AppliedToDimensions => { 'W' => $val[1], 'H' => $val[2], 'Unit' => 'pixel' }, + RegionList => \@newRgns, + }; + }, + }, + + # create an MWG RegionInfo structure from an IPTC ImageRegion list + MWGRegion2ACDSeeRegion => { + Require => { + 0 => 'RegionInfo', + 1 => 'ImageWidth', + 2 => 'ImageHeight', + }, + ValueConv => q{ + my ($rgn, @newRgns); + my %newRgn; + foreach $rgn (@{$val[0]{RegionList}}) { + next unless $$rgn{Area} or defined $$rgn{Name}; + my %newRgn; + if ($$rgn{Area}) { + $newRgn{'DLYArea'} = { + 'X' => $$rgn{Area}{'X'}, + 'Y' => $$rgn{Area}{'Y'}, + 'W' => $$rgn{Area}{'W'}, + 'H' => $$rgn{Area}{'H'}, + }; + }; + $newRgn{Name} = $$rgn{Name} if defined $$rgn{Name}; + $newRgn{'Type'} = $$rgn{'Type'} if defined $$rgn{'Type'}; + push @newRgns, \%newRgn; + } + return { + 'AppliedToDimensions' => $val[0]{'AppliedToDimensions'}, + RegionList => \@newRgns, + } + }, + }, + #### + }, +); + +%Image::ExifTool::UserDefined::ACDSeeRegions = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-acdsee', 2 => 'Image' }, + NAMESPACE => { 'acdsee-rs' => 'http://ns.acdsee.com/regions/' }, + WRITABLE => 'string', # (default to string-type tags) + Regions => { + Name => 'RegionInfoACDSee', + FlatName => 'ACDSee', + # the "Struct" entry defines the structure fields + Struct => { + # optional structure name (used for warning messages only) + STRUCT_NAME => 'ACDSee RegionInfo', + RegionList => { + FlatName => 'Region', + Struct => \%sACDSeeRegionStruct, + List => 'Bag', + }, + AppliedToDimensions => { + FlatName => 'RegionAppliedToDimensions',Struct => \%sACDSeeDimensions }, + }, + }, +); + +# Shortcuts to old names added so as not to break previously used commands +%Image::ExifTool::UserDefined::Shortcuts = ( + RegionInfoACDSeeAppliedToDimensionsH => 'ACDSeeRegionAppliedToDimensionsH', + RegionInfoACDSeeAppliedToDimensionsUnit => 'ACDSeeRegionAppliedToDimensionsUnit', + RegionInfoACDSeeAppliedToDimensionsW => 'ACDSeeRegionAppliedToDimensionsW', + RegionInfoACDSeeRegionListDLYAreaH => 'ACDSeeRegionDLYAreaH', + RegionInfoACDSeeRegionListDLYAreaW => 'ACDSeeRegionDLYAreaW', + RegionInfoACDSeeRegionListDLYAreaX => 'ACDSeeRegionDLYAreaX', + RegionInfoACDSeeRegionListDLYAreaY => 'ACDSeeRegionDLYAreaY', + RegionInfoACDSeeRegionListALGAreaH => 'ACDSeeRegionALGAreaH', + RegionInfoACDSeeRegionListALGAreaW => 'ACDSeeRegionALGAreaW', + RegionInfoACDSeeRegionListALGAreaX => 'ACDSeeRegionALGAreaX', + RegionInfoACDSeeRegionListALGAreaY => 'ACDSeeRegionALGAreaY', + RegionInfoACDSeeRegionListName => 'ACDSeeRegionName', + RegionInfoACDSeeRegionListType => 'ACDSeeRegionType', + RegionInfoACDSeeRegionListNameAssignType => 'ACDSeeRegionNameAssignType', +); + +# Forced -struct option during debugging +#%Image::ExifTool::UserDefined::Options = ( +# Struct => 1, +#); +#------------------------------------------------------------------------------ +1; #end \ No newline at end of file diff --git a/config_files/age.config b/config_files/age.config new file mode 100644 index 0000000..879f894 --- /dev/null +++ b/config_files/age.config @@ -0,0 +1,84 @@ +#------------------------------------------------------------------------------ +# File: age.config +# +# Description: Definition for a Composite "Age" tag to calculate age of person +# in image based on their birthday and the DateTimeOriginal or +# CreateDate of the image. +# +# Notes: The birthday date is set via the -userParam option, and is a +# string containing year, month, day, hour, minute and second. +# Only the year is required. By default the format of the +# returned Age value is exactly the same as the input birthday, +# with 2 digits for each parameter, however an AgeFormat user +# parameter may be used to define a printf-style format string +# for any desired output format (see fourth example below). +# +# If the specified birthday comes after the image date/time +# then the returned result is enclosed in brackets to indicate +# a negative time difference (see last example below). +# +# If birthday is not given, then the current date/time is assumed +# (in which case Age returns the age of the photo). +# +# Examples: (based on a DateTimeOriginal of "2005:08:27 18:21:00") +# +# > exiftool -config age.config -userparam birthday=1990:09:31 -age a.jpg +# Age : 14:10:26 +# +# > exiftool -config age.config -userparam birthday=1990Y09M31D -age a.jpg +# Age : 14Y10M26D +# +# > exiftool -config age.config -userparam birthday="2000:01:02 03:45" -age a.jpg +# Age : 05:07:25 14:36 +# +# > exiftool -config age.config -userparam birthday=2000:01:02 \ +# -userparam ageformat="%d years" -age a.jpg +# Age : 5 years +# +# > exiftool -config age.config -userparam birthday=2005:09:26 -age a.jpg +# Age : (00:00:30) +# +# Requires: ExifTool version 9.90 or later +# +# Revisions: 2017/01/24 - P. Harvey Created +#------------------------------------------------------------------------------ + +%Image::ExifTool::UserDefined = ( + 'Image::ExifTool::Composite' => { + Age => { + Desire => { + 0 => 'DateTimeOriginal', + 1 => 'CreateDate', + }, + ValueConv => q{ + my $bday = $self->Options(UserParam => 'Birthday'); + $bday or ($bday = TimeNow()) =~ s/[-+].*//; + my $date = $val[0] || $val[1] or return undef; + my @t0 = ($bday =~ /\d+/g); + my @t1 = ($date =~ /\d+/g); + return '' unless $t0[0]; + my ($i, @diff, $sign); + for ($i=0; $i<6; ++$i) { + last unless defined $t0[$i]; + my $dt = $t1[$i] - $t0[$i]; + $sign or $sign = ($dt <=> 0); + push @diff, $dt * $sign; + } + require 'Image/ExifTool/Shift.pl'; + my $base = $sign < 0 ? \@t1 : \@t0; + my @wrap = (0, 12, DaysInMonth($$base[1]||1,$$base[0]), 24, 60, 60); + for ($i=$#diff; $i>0; --$i) { + $diff[$i] < 0 and $diff[$i] += $wrap[$i], --$diff[$i-1]; + } + $bday =~ s/\d+/sprintf '%.2d', shift @diff/ge; + return $sign < 0 ? "($bday)" : $bday; + }, + PrintConv => q{ + my $fmt = $self->Options(UserParam => 'AgeFormat') or return $val; + sprintf($fmt, $val =~ /\d+/g); + }, + }, + }, +); + +1; #end diff --git a/config_files/bibble.config b/config_files/bibble.config new file mode 100644 index 0000000..063f5bc --- /dev/null +++ b/config_files/bibble.config @@ -0,0 +1,520 @@ +#------------------------------------------------------------------------------ +# File: bibble.config +# +# Description: This config file defines Bibble XMP tags for writing. +# +# Usage: exiftool -config bibble.config -BIBBLETAG=VALUE FILE ... +# +# Requires: ExifTool version 10.28 or later +# +# Revisions: 2016/09/25 - P. Harvey Created +#------------------------------------------------------------------------------ + +%Image::ExifTool::UserDefined = ( + 'Image::ExifTool::XMP::Main' => { + dmf => { + SubDirectory => { TagTable => 'Image::ExifTool::UserDefined::dmf' }, + }, + }, +); + +%Image::ExifTool::UserDefined::dmf = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-dmf', 2 => 'Image' }, + NAMESPACE => { 'dmf' => 'http://www.bibblelabs.com/DigitalMasterFile/1.0/' }, + WRITABLE => 'string', + versionCount => { + Name => 'DMFCount', + Writable => 'integer', + }, + versions => { + Name => 'DMF', + List => 'Seq', + Struct => { + NAMESPACE => { 'dmfversion' => 'http://www.bibblelabs.com/DigitalMasterFileVersion/1.0/' }, + software => { }, + softwareVersion => { }, + versionName => { }, + settings => { + Struct => { + NAMESPACE => { 'bset' => 'http://www.bibblelabs.com/BibbleSettings/5.0/' }, + settingsVersion => { }, + respectsTransform => { }, + curLayer => { }, + layers => { + List => 'Seq', + Struct => { + NAMESPACE => { 'blay' => 'http://www.bibblelabs.com/BibbleLayers/5.0/' }, + layerId => { }, + layerPos => { }, + name => { }, + enabled => { }, + options => { + Struct => { + NAMESPACE => { 'bopt' => 'http://www.bibblelabs.com/BibbleOpt/5.0/' }, + 'optionchanged' => { }, + 'hasSettings' => { }, + 'metaDirty' => { }, + 'version' => { }, + 'colormode' => { }, + 'colormode' => { }, + 'workingspace' => { }, + 'whiteauto' => { }, + 'whitetype' => { }, + 'lwhitetype' => { }, + 'lmr' => { }, + 'lmb' => { }, + 'whitered' => { }, + 'whitegreen' => { }, + 'whiteblue' => { }, + 'whiteowbr' => { }, + 'whiteowbb' => { }, + 'autolevel' => { }, + 'shadowval' => { }, + 'highlightval' => { }, + 'exposureval' => { }, + 'highlightrecval' => { }, + 'highlightrange' => { }, + 'blackPoint' => { }, + 'fillamount' => { }, + 'fillrange' => { }, + 'autorotate' => { }, + 'rotateangle' => { }, + 'sharpensense' => { }, + 'newsharpen' => { }, + 'sharpenon' => { }, + 'pcenabled' => { }, + 'pctintmeta' => { }, + 'PCNOn' => { }, + 'PCNPreset' => { }, + 'PCNStrength' => { }, + 'PCNDetail' => { }, + 'red' => { }, + 'green' => { }, + 'blue' => { }, + 'sat' => { }, + 'cont' => { }, + 'hue' => { }, + 'vibe' => { }, + 'useHSL' => { }, + 'useHSV' => { }, + 'invertRegions' => { }, + 'layerOpacity' => { }, + 'selective_color' => { }, + 'curveson' => { }, + 'curves_m_cn' => { }, + 'curves_m_cy' => { }, + 'curves_m_cx' => { }, + 'curves_m_imid' => { }, + 'curves_m_olo' => { }, + 'curves_m_ilo' => { }, + 'curves_m_ihi' => { }, + 'curves_m_ohi' => { }, + 'kelvin' => { }, + 'tint' => { }, + 'okelvin' => { }, + 'otint' => { }, + 'lkelvin' => { }, + 'ltint' => { }, + 'ckelvin' => { }, + 'ctint' => { }, + 'cropon' => { }, + 'croplocked' => { }, + 'cropstyle' => { }, + 'cropleft' => { }, + 'croptop' => { }, + 'cropheight' => { }, + 'cropwidth' => { }, + 'cropdpi' => { }, + 'cropstickydpi' => { }, + 'cropstickyx' => { }, + 'cropstickyy' => { }, + 'cropmenuitem' => { }, + 'croppercent' => { }, + 'Date' => { }, + 'DigitizedDateTime' => { }, + 'title' => { }, + 'Priority' => { }, + 'Category' => { }, + 'SupplementalCategory' => { }, + 'creator' => { }, + 'AuthorsPosition' => { }, + 'rights' => { }, + 'Credit' => { }, + 'description' => { }, + 'CaptionWriter' => { }, + 'City' => { }, + 'State' => { }, + 'Country' => { }, + 'CountryCode' => { }, + 'Headline' => { }, + 'Instructions' => { }, + 'TransmissionReference' => { }, + 'Source' => { }, + 'subject' => { }, + 'IntellectualGenre' => { }, + 'CiAdrCity' => { }, + 'CiAdrCtry' => { }, + 'CiAdrExtadr' => { }, + 'CiAdrPcode' => { }, + 'CiAdrRegion' => { }, + 'CiEmailWork' => { }, + 'CiTelWork' => { }, + 'CiUrlWork' => { }, + 'UsageTerms' => { }, + 'Location' => { }, + 'SubjectCode' => { }, + 'Scene' => { }, + 'tag' => { }, + 'keywordlist' => { }, + 'rating' => { }, + 'label' => { }, + 'warpon' => { }, + 'warpa' => { }, + 'warpb' => { }, + 'warpc' => { }, + 'warpresize' => { }, + 'warpfocal' => { }, + 'warpcaon' => { }, + 'warpcarc' => { }, + 'warpcaby' => { }, + 'vignetteon' => { }, + 'vignetterad' => { }, + 'vignetteamt' => { }, + 'profilemake' => { }, + 'profilemodel' => { }, + 'profilelens' => { }, + 'lens' => { }, + 'GPSVersionID' => { }, + 'GPSLatitude' => { }, + 'GPSLongitude' => { }, + 'GPSAltitudeRef' => { }, + 'GPSAltitude' => { }, + 'GPSTimeStamp' => { }, + 'GPSSatellites' => { }, + 'GPSStatus' => { }, + 'GPSMeasureMode' => { }, + 'GPSDateStamp' => { }, + 'GPSMapDatum' => { }, + 'GPSAreaInformation' => { }, + 'GPSProcessingMethod' => { }, + 'bMirrorOn' => { }, + 'bInvertOn' => { }, + 'rn_enabled' => { }, + 'rn_smooth_enabled' => { }, + 'rn_threshold' => { }, + 'rn_limit' => { }, + 'lc_enabled' => { }, + 'lc_radius' => { }, + 'lc_strength' => { }, + 'lc_debug' => { }, + 'enableInputProfile' => { }, + 'inputProfile' => { }, + 'redeyeSize' => { }, + 'redeyeTrack' => { }, + 'redeyeTrackStra' => { }, + 'redeyeTrackCrop' => { }, + 'redeyeEnable' => { }, + 'watermark_mode' => { }, + 'watermark_imageFilename' => { }, + 'watermark_text' => { }, + 'watermark_fontName' => { }, + 'watermark_fontColor' => { }, + 'watermark_fontItalic' => { }, + 'watermark_fontUnderline' => { }, + 'watermark_fontBold' => { }, + 'watermark_fontStrikeout' => { }, + 'watermark_alignment' => { }, + 'watermark_basesize' => { }, + 'watermark_rotation' => { }, + 'watermark_size' => { }, + 'watermark_hpos' => { }, + 'watermark_vpos' => { }, + 'watermark_opacity' => { }, + 'watermark_hskew' => { }, + 'watermark_vskew' => { }, + 'watermark_hproject' => { }, + 'watermark_vproject' => { }, + 'watermark_hstretch' => { }, + 'watermark_vstretch' => { }, + 'watermark_enabled' => { }, + 'ferd.bez_enabled' => { }, + 'ferd.bez_Early' => { }, + 'ferd.bez_HCL' => { }, + 'ferd.bez_opacity' => { }, + 'ferd.bez_saturation' => { }, + 'ferd.bez_lighten' => { }, + 'ferd.bez_lightengamma' => { }, + 'ferd.bez_midi' => { }, + 'ferd.bez_sigcontrast' => { }, + 'ferd.bez_sigmiddle' => { }, + 'ferd.bez_shadows' => { }, + 'ferd.bez_lowmids' => { }, + 'ferd.bez_greys' => { }, + 'ferd.bez_highmids' => { }, + 'ferd.bez_highlights' => { }, + 'ferd.bez_shadows4' => { }, + 'ferd.bez_lowmids4' => { }, + 'ferd.bez_highmids4' => { }, + 'ferd.bez_highlights4' => { }, + 'ferd.ferd_bez_enabled' => { }, + 'ferd.ferd_bez_RGB' => { }, + 'ferd.ferd_bez_BW' => { }, + 'ferd.ferd_bez_lighten' => { }, + 'ferd.ferd_bez_lightengamma' => { }, + 'ferd.ferd_bez_midi' => { }, + 'ferd.ferd_bez_blak' => { }, + 'ferd.ferd_bez_sigcontrast' => { }, + 'ferd.ferd_bez_sigmiddle' => { }, + 'ferd.ferd_bez_contrast' => { }, + 'ferd.ferd_bez_centre' => { }, + 'ferd.ferd_bez_shadows' => { }, + 'ferd.ferd_bez_lowmids' => { }, + 'ferd.ferd_bez_greys' => { }, + 'ferd.ferd_bez_highmids' => { }, + 'ferd.ferd_bez_highlights' => { }, + 'ferd.ferd_bez_shadows4' => { }, + 'ferd.ferd_bez_lowmids4' => { }, + 'ferd.ferd_bez_highmids4' => { }, + 'ferd.ferd_bez_highlights4' => { }, + 'Grid_kb.thirds' => { }, + 'Grid_kb.goldenrat' => { }, + 'Grid_kb.goldenspir' => { }, + 'Grid_kb.squaregrid' => { }, + 'Grid_kb.spiralcenter' => { }, + 'Grid_kb.gridsize' => { }, + 'Grid_kb.gridxcenter' => { }, + 'Grid_kb.gridycenter' => { }, + 'Mix3.mix3_enabled' => { }, + 'Mix3.mix3_early' => { }, + 'Mix3.mix3_exposure' => { }, + 'Mix3.mix3_red' => { }, + 'Mix3.mix3_green' => { }, + 'Mix3.mix3_blue' => { }, + 'SiliconBonk.SiliconBonkOn' => { }, + 'SiliconBonk.SiliconBonkHighlights' => { }, + 'SiliconBonk.SiliconBonkH' => { }, + 'SiliconBonk.SiliconBonkL' => { }, + 'SiliconBonk.SiliconBonkContrast' => { }, + 'SiliconBonk.SiliconBonkMid' => { }, + 'SiliconBonk.SiliconBonkSat' => { }, + 'SiliconBonk.SiliconBonkC0L' => { }, + 'SiliconBonk.SiliconBonkC1L' => { }, + 'SiliconBonk.SiliconBonkC2L' => { }, + 'SiliconBonk.SiliconBonkC3L' => { }, + 'SiliconBonk.SiliconBonkC4L' => { }, + 'SiliconBonk.SiliconBonkC5L' => { }, + 'Vigne_kb.kbv_enabled' => { }, + 'Vigne_kb.kbv_size' => { }, + 'Vigne_kb.kbv_strength' => { }, + 'Vigne_kb.kbv_ccol' => { }, + 'Vigne_kb.kbv_falloff' => { }, + 'Vigne_kb.kbv_shape' => { }, + 'Vigne_kb.kbv_horzcenter' => { }, + 'Vigne_kb.kbv_vertcenter' => { }, + 'Vigne_kb.kbv_factor' => { }, + 'Vigne_kb.kbv_trans' => { }, + 'Vigne_kb.kbv_adjustcrop' => { }, + 'Vigne_kb.kbv_colenabled' => { }, + 'Vigne_kb.kbv_col' => { }, + 'Vigne_kb.kbv_preview' => { }, + 'Vigne_kb.kbv_desat' => { }, + 'Vigne_kb.kbv_desaturate' => { }, + 'WaveletDenoise2.bSphWaveletDenoiseon' => { }, + 'WaveletDenoise2.bSphWaveletDenoiseThresL' => { }, + 'WaveletDenoise2.bSphWaveletDenoiseLowL' => { }, + 'WaveletDenoise2.bSphWaveletDenoiseThresC' => { }, + 'WaveletDenoise2.bSphWaveletDenoiseLowC' => { }, + 'WaveletDenoise2.bSphWaveletDenoiseDePepper' => { }, + 'WaveletDenoise2.bSphWaveletDenoiseShowEdge' => { }, + 'WaveletSharpen2.bSphWaveletUsmon' => { }, + 'WaveletSharpen2.bSphWaveletUsmRadius' => { }, + 'WaveletSharpen2.bSphWaveletUsmAmount' => { }, + 'WaveletSharpen2.bSphWaveletUsmThreshold' => { }, + 'WaveletSharpen2.bSphWaveletUsmClarity' => { }, + 'WaveletSharpen2.bSphWaveletLLenable' => { }, + 'WaveletSharpen2.bSphWaveletLLStrength' => { }, + 'WaveletSharpen2.bSphWaveletLLiter' => { }, + 'WaveletSharpen2.bSphWaveletMCStrength' => { }, + 'WaveletSharpen2.bSphWaveleton' => { }, + 'WaveletSharpen2.bSphWaveletAmount' => { }, + 'WaveletSharpen2.bSphWaveletRadius' => { }, + 'WaveletSharpen2.bSphWaveletSharpenDePepper' => { }, + 'WaveletSharpen2.bSphWaveletEdge' => { }, + 'WaveletSharpen2.bSphWaveletSharpenClarity' => { }, + 'WaveletSharpen2.bSphWaveleton2' => { }, + 'WaveletSharpen2.bSphWaveletAmount2' => { }, + 'WaveletSharpen2.bSphWaveletRadius2' => { }, + 'WaveletSharpen2.bSphWaveletSharpenDePepper2' => { }, + 'WaveletSharpen2.bSphWaveletEdge2' => { }, + 'WaveletSharpen2.bSphWaveletSharpenClarity2' => { }, + 'zChannelMixerGroup.zcmEnable' => { }, + 'zChannelMixerGroup.zcmbw' => { }, + 'zChannelMixerGroup.zcmbwa' => { }, + 'zChannelMixerGroup.zcmlockbw' => { }, + 'zChannelMixerGroup.zcmlockcolor' => { }, + 'zChannelMixerGroup.zcmrr' => { }, + 'zChannelMixerGroup.zcmrg' => { }, + 'zChannelMixerGroup.zcmrb' => { }, + 'zChannelMixerGroup.zcmgr' => { }, + 'zChannelMixerGroup.zcmgg' => { }, + 'zChannelMixerGroup.zcmgb' => { }, + 'zChannelMixerGroup.zcmbr' => { }, + 'zChannelMixerGroup.zcmbg' => { }, + 'zChannelMixerGroup.zcmbb' => { }, + 'zFramePlug.zframeSize1' => { }, + 'zFramePlug.zframeColor1' => { }, + 'zFramePlug.zframeSize2' => { }, + 'zFramePlug.zframeColor2' => { }, + 'zFramePlug.zframeSize3' => { }, + 'zFramePlug.zframeColor3' => { }, + 'zFramePlug.zframeSize4' => { }, + 'zFramePlug.zframeColor4' => { }, + 'zFramePlug.zframeSize5' => { }, + 'zFramePlug.zframeColor5' => { }, + 'zFramePlug.zframeDummy' => { }, + 'zFramePlug.zframeEnable' => { }, + 'zFramePlug.zframeEnable1' => { }, + 'zFramePlug.zframeEnable2' => { }, + 'zFramePlug.zframeEnable3' => { }, + 'zFramePlug.zframeEnable4' => { }, + 'zFramePlug.zframeEnable5' => { }, + 'zFramePlug.zframeCalibration' => { }, + 'zFramePlug.zframeRatio1' => { }, + 'zFramePlug.zframeRatio2' => { }, + 'zFramePlug.zframeRatio3' => { }, + 'zFramePlug.zframeRatio4' => { }, + 'zFramePlug.zframeRatio5' => { }, + 'zFramePlug.xPos1' => { }, + 'zFramePlug.yPos1' => { }, + 'zFramePlug.xPos2' => { }, + 'zFramePlug.yPos2' => { }, + 'zFramePlug.xPos3' => { }, + 'zFramePlug.yPos3' => { }, + 'zFramePlug.xPos4' => { }, + 'zFramePlug.yPos4' => { }, + 'zFramePlug.xPos5' => { }, + 'zFramePlug.yPos5' => { }, + 'zFramePlug.relativeTo' => { }, + 'zFramePlug.place' => { }, + 'Zone_kb.kbz_enabled' => { }, + 'Zone_kb.kbz_highlight' => { }, + 'zPerspectorPlug.zpersEnable' => { }, + 'zPerspectorPlug.zpersRotate' => { }, + 'zPerspectorPlug.zpersGridEnable' => { }, + 'zPerspectorPlug.zpersGrid' => { }, + 'zPerspectorPlug.zpersTopLeft' => { }, + 'zPerspectorPlug.zpersTopRight' => { }, + 'zPerspectorPlug.zpersLeftTop' => { }, + 'zPerspectorPlug.zpersRightTop' => { }, + 'zPerspectorPlug.zpersBottomLeft' => { }, + 'zPerspectorPlug.zpersBottomRight' => { }, + 'zPerspectorPlug.zpersLeftBottom' => { }, + 'zPerspectorPlug.zpersRightBottom' => { }, + 'zPerspectorPlug.zpersmirror' => { }, + 'zPerspectorPlug.zpersMirrorOffset' => { }, + 'zPerspectorPlug.zpersCanvasResize' => { }, + 'zShadowPlug.direction' => { }, + 'zShadowPlug.zshadowEnable' => { }, + 'zShadowPlug.dummy' => { }, + 'zShadowPlug.size' => { }, + 'zShadowPlug.scale' => { }, + 'zShadowPlug.edge' => { }, + 'zShadowPlug.sizeBg' => { }, + 'zShadowPlug.color' => { }, + 'zShadowPlug.colorBg' => { }, + 'zShadowPlug.relativeTo' => { }, + 'zShadowPlug.xPos' => { }, + 'zShadowPlug.yPos' => { }, + 'zSoftenPlug.softenEnable' => { }, + 'zSoftenPlug.softenradius' => { }, + 'zSoftenPlug.softenorton' => { }, + 'zSoftenPlug.softencombo' => { }, + 'zSoftenPlug.softenVignette' => { }, + 'zSoftenPlug.softenProof' => { }, + 'zSoftenPlug.softenvigSize' => { }, + 'zSoftenPlug.softenvigShape' => { }, + 'zSoftenPlug.softenvigFeather' => { }, + 'zSoftenPlug.softenvigXpos' => { }, + 'zSoftenPlug.softenvigYpos' => { }, + 'zSoftenPlug.softenvigRotate' => { }, + 'zTextPlug.zTextOn' => { }, + 'zTextPlug.italic' => { }, + 'zTextPlug.bold' => { }, + 'zTextPlug.underline' => { }, + 'zTextPlug.strikeout' => { }, + 'zTextPlug.overline' => { }, + 'zTextPlug.size' => { }, + 'zTextPlug.xpos' => { }, + 'zTextPlug.ypos' => { }, + 'zTextPlug.rotate' => { }, + 'zTextPlug.font' => { }, + 'zTextPlug.text' => { }, + 'zTextPlug.opacity' => { }, + 'zTextPlug.stretch' => { }, + 'zTextPlug.color' => { }, + 'zTextPlug.shearv' => { }, + 'zTextPlug.shearh' => { }, + 'zTextPlug.scalev' => { }, + 'zTextPlug.scaleh' => { }, + 'zTextPlug.projectv' => { }, + 'zTextPlug.projecth' => { }, + 'zTextPlug.basesize' => { }, + 'zTextPlug.textalign' => { }, + 'zTextPlug.textposh' => { }, + 'zTextPlug.textposv' => { }, + 'zTextPlug.shadowEnable' => { }, + 'zTextPlug.shadowDirection' => { }, + 'zTextPlug.shadowShift' => { }, + 'zTextPlug.shadowIntensity' => { }, + 'zTextPlug.shadowColor' => { }, + 'blplug.bbwenabled' => { }, + 'blplug.bbwspotA' => { }, + 'blplug.bbwspotB' => { }, + 'blplug.bbwhueA' => { }, + 'blplug.bbwfuzzyA' => { }, + 'blplug.bbwcolorA' => { }, + 'blplug.bbwhueB' => { }, + 'blplug.bbwcolorB' => { }, + 'blplug.bbwfuzzyB' => { }, + 'blplug.bbwmode' => { }, + 'Equalizer_kb.kbs_enabled' => { }, + 'Equalizer_kb.kbs_bw' => { }, + 'Equalizer_kb.kbs_redlum' => { }, + 'Equalizer_kb.kbs_yellowlum' => { }, + 'Equalizer_kb.kbs_orangelum' => { }, + 'Equalizer_kb.kbs_greenlum' => { }, + 'Equalizer_kb.kbs_cyanlum' => { }, + 'Equalizer_kb.kbs_bluelum' => { }, + 'Equalizer_kb.kbs_magentalum' => { }, + 'Equalizer_kb.kbs_redhue' => { }, + 'Equalizer_kb.kbs_yellowhue' => { }, + 'Equalizer_kb.kbs_orangehue' => { }, + 'Equalizer_kb.kbs_greenhue' => { }, + 'Equalizer_kb.kbs_cyanhue' => { }, + 'Equalizer_kb.kbs_bluehue' => { }, + 'Equalizer_kb.kbs_magentahue' => { }, + 'Equalizer_kb.kbs_redsat' => { }, + 'Equalizer_kb.kbs_yellowsat' => { }, + 'Equalizer_kb.kbs_orangesat' => { }, + 'Equalizer_kb.kbs_greensat' => { }, + 'Equalizer_kb.kbs_cyansat' => { }, + 'Equalizer_kb.kbs_bluesat' => { }, + 'Equalizer_kb.kbs_magentasat' => { }, + 'Equalizer_kb.kbs_redvib' => { }, + 'Equalizer_kb.kbs_yellowvib' => { }, + 'Equalizer_kb.kbs_orangevib' => { }, + 'Equalizer_kb.kbs_greenvib' => { }, + 'Equalizer_kb.kbs_cyanvib' => { }, + 'Equalizer_kb.kbs_bluevib' => { }, + 'Equalizer_kb.kbs_magentavib' => { }, + }, + }, + }, + }, + }, + }, + }, + }, +); + +1; #end diff --git a/config_files/convert_regions.config b/config_files/convert_regions.config new file mode 100644 index 0000000..481b96f --- /dev/null +++ b/config_files/convert_regions.config @@ -0,0 +1,234 @@ +#------------------------------------------------------------------------------ +# File: convert_regions.config +# +# Description: User-defined Composite tag definitions to allow conversion of +# face regions between Microsoft Windows Live Photo Gallery (WLPG), +# Metadata Working Group (MWG), and IPTC Extension formats +# +# Usage: 1) Convert from MP WLPG or IPTC regions to MWG regions: +# +# exiftool -config convert_regions.config "-RegionInfo { + + # create an MWG RegionInfo structure from a Microsoft RegionInfoMP structure + MPRegion2MWGRegion => { + Require => { + 0 => 'RegionInfoMP', + 1 => 'ImageWidth', + 2 => 'ImageHeight', + }, + ValueConv => q{ + my ($rgn, @newRgns); + foreach $rgn (@{$val[0]{Regions}}) { + my $name = $$rgn{PersonDisplayName}; + next unless $$rgn{Rectangle} or defined $name; + my %newRgn = ( Type => 'Face' ); + if (defined $name) { + # don't add ignored faces + next if $name eq 'ffffffffffffffff'; + $newRgn{Name} = $name; + } + if ($$rgn{Rectangle}) { + my @rect = split /\s*,\s*/, $$rgn{Rectangle}; + $newRgn{Area} = { + X => $rect[0] + $rect[2]/2, + Y => $rect[1] + $rect[3]/2, + W => $rect[2], + H => $rect[3], + Unit => 'normalized', + } if @rect == 4; + } + push @newRgns, \%newRgn; + } + return { + AppliedToDimensions => { W => $val[1], H => $val[2], Unit => 'pixel' }, + RegionList => \@newRgns, + }; + }, + }, + + # create an MWG RegionInfo structure from an IPTC ImageRegion list + IPTCRegion2MWGRegion => { + Name => 'MPRegion2MWGRegion', + Require => { + 0 => 'ImageRegion', + 1 => 'ImageWidth', + 2 => 'ImageHeight', + }, + ValueConv => q{ + my ($rgn, @newRgns); + my $rgns = ref $val[0] eq 'ARRAY' ? $val[0] : [ $val[0] ]; + foreach $rgn (@$rgns) { + my %newRgn = ( Type => 'Face' ); + if ($$rgn{RegionBoundary} and $$rgn{RegionBoundary}{RbShape} eq 'rectangle') { + my @rect = @{$$rgn{RegionBoundary}}{'RbX','RbY','RbW','RbH'}; + if ($$rgn{RegionBoundary}{RbUnit} eq 'pixel') { + $rect[0] /= $val[1], $rect[2] /= $val[1]; + $rect[1] /= $val[2]; $rect[3] /= $val[2]; + } + $newRgn{Area} = { + X => $rect[0] + $rect[2]/2, + Y => $rect[1] + $rect[3]/2, + W => $rect[2], + H => $rect[3], + Unit => 'normalized', + }; + } else { + next unless defined $$rgn{Name}; + } + $newRgn{Name} = $$rgn{Name} if defined $$rgn{Name}; + push @newRgns, \%newRgn; + } + return { + AppliedToDimensions => { W => $val[1], H => $val[2], Unit => 'pixel' }, + RegionList => \@newRgns, + }; + }, + }, + + # create a Microsoft RegionInfoMP structure from an MWG RegionInfo structure + MWGRegion2MPRegion => { + Require => 'RegionInfo', + ValueConv => q{ + my ($rgn, @newRgns); + foreach $rgn (@{$val[0]{RegionList}}) { + next unless $$rgn{Area} or defined $$rgn{Name}; + my %newRgn; + if ($$rgn{Area}) { + my @rect = @{$$rgn{Area}}{'X','Y','W','H'}; + $rect[0] -= $rect[2]/2; + $rect[1] -= $rect[3]/2; + $newRgn{Rectangle} = join(', ', @rect); + } + $newRgn{PersonDisplayName} = $$rgn{Name} if defined $$rgn{Name}; + push @newRgns, \%newRgn; + } + return { Regions => \@newRgns }; + }, + }, + + # create a Microsoft RegionInfoMP structure from an IPTC ImageRegion list + IPTCRegion2MPRegion => { + Name => 'MWGRegion2MPRegion', + Require => { + 0 => 'ImageRegion', + 1 => 'ImageWidth', + 2 => 'ImageHeight', + }, + ValueConv => q{ + my ($rgn, @newRgns); + my $rgns = ref $val[0] eq 'ARRAY' ? $val[0] : [ $val[0] ]; + foreach $rgn (@$rgns) { + my %newRgn; + if ($$rgn{RegionBoundary} and $$rgn{RegionBoundary}{RbShape} eq 'rectangle') { + my @rect = @{$$rgn{RegionBoundary}}{'RbX','RbY','RbW','RbH'}; + if ($$rgn{RegionBoundary}{RbUnit} eq 'pixel') { + $rect[0] /= $val[1], $rect[2] /= $val[1]; + $rect[1] /= $val[2]; $rect[3] /= $val[2]; + } + $newRgn{Rectangle} = join(', ', @rect); + } else { + next unless defined $$rgn{Name}; + } + $newRgn{PersonDisplayName} = $$rgn{Name} if defined $$rgn{Name}; + push @newRgns, \%newRgn; + } + return { Regions => \@newRgns }; + }, + }, + + # create an IPTC ImageRegion list from an MWG RegionInfo structure + MWGRegion2IPTCRegion => { + Require => 'RegionInfo', + ValueConv => q{ + my ($rgn, @newRgns); + foreach $rgn (@{$val[0]{RegionList}}) { + next unless $$rgn{Area} or defined $$rgn{Name}; + my %newRgn; + if ($$rgn{Area}) { + my @rect = @{$$rgn{Area}}{'X','Y','W','H'}; + $rect[0] -= $rect[2]/2; + $rect[1] -= $rect[3]/2; + $newRgn{RegionBoundary} = { + RbShape => 'rectangle', + RbUnit => 'relative', + RbX => $rect[0], + RbY => $rect[1], + RbW => $rect[2], + RbH => $rect[3], + }; + } + $newRgn{Name} = $$rgn{Name} if defined $$rgn{Name}; + push @newRgns, \%newRgn; + } + return \@newRgns; + }, + }, + + # create an IPTC ImageRegion list from a Microsoft RegionInfoMP structure + MPRegion2IPTCRegion => { + Name => 'MWGRegion2IPTCRegion', + Require => 'RegionInfoMP', + ValueConv => q{ + my ($rgn, @newRgns); + foreach $rgn (@{$val[0]{Regions}}) { + my $name = $$rgn{PersonDisplayName}; + next unless $$rgn{Rectangle} or defined $name; + my %newRgn; + if (defined $name) { + # don't add ignored faces + next if $name eq 'ffffffffffffffff'; + $newRgn{Name} = $name; + } + if ($$rgn{Rectangle}) { + my @rect = split /\s*,\s*/, $$rgn{Rectangle}; + $newRgn{RegionBoundary} = { + RbShape => 'rectangle', + RbUnit => 'relative', + RbX => $rect[0], + RbY => $rect[1], + RbW => $rect[2], + RbH => $rect[3], + } if @rect == 4; + } + push @newRgns, \%newRgn; + } + return \@newRgns; + }, + }, + }, +); + +%Image::ExifTool::UserDefined::Shortcuts = ( + MyRegion => 'MPRegion2MWGRegion', + MyRegion2 => 'IPTCRegion2MWGRegion', + MyRegionMP => 'MWGRegion2MPRegion', + MyRegionMP2 => 'IPTCRegion2MPRegion', + MyRegionIPTC => 'MWGRegion2IPTCRegion', + MyRegionIPTC2 => 'MPRegion2IPTCRegion', +); + +1; #end diff --git a/config_files/cuepointlist.config b/config_files/cuepointlist.config new file mode 100644 index 0000000..21bc75c --- /dev/null +++ b/config_files/cuepointlist.config @@ -0,0 +1,70 @@ +#------------------------------------------------------------------------------ +# File: cuepointlist.config +# +# Description: ExifTool config file to generate list of cue points and labels +# in WAV audio files +# +# Usage: exiftool -config cuepointlist.config -cuepointlist -b FILE +# +# Requires: ExifTool version 12.25 or later +# +# Revisions: 2021-04-20 - P. Harvey Created +#------------------------------------------------------------------------------ + +%Image::ExifTool::UserDefined = ( + 'Image::ExifTool::Composite' => { + CuePointList => { + Require => { + 0 => 'CuePoints', + 1 => 'SampleRate', + }, + Desire => { + 2 => 'CuePointLabel', + 3 => 'CuePointNotes', + 4 => 'LabeledText', + }, + ValueConv => q{ + SetByteOrder('II'); + my (%lbl, %rgn, %rtyp, %rlbl, %note, $pos, $i); + # get labels if available + for ($i=1; defined $val[2]; ++$i) { + $lbl{$1} = $2 if $val[2] =~ /^(\d+) (.*)/ and length $2; + $val[2] = $self->GetValue("CuePointLabel ($i)"); + } + # get notes if available + for ($i=1; defined $val[3]; ++$i) { + $note{$1} = $2 if $val[3] =~ /^(\d+) (.*)/ and length $2; + $val[3] = $self->GetValue("CuePointNotes ($i)"); + } + # get regions if available + for ($i=1; defined $val[4]; ++$i) { + if ($val[4] =~ /^(\d+) (\d+) '(.*)' \d+ \d+ \d+ \d+ (.*)/) { + $rgn{$1} = $2; + $rtyp{$1} = $3; + $rlbl{$1} = $4; + } + $val[4] = $self->GetValue("LabeledText ($i)"); + } + my $buff = "Cue\tStart\tEnd\tLabel\tPurpose\tText\tNotes\n"; + for ($pos=4; $pos+24<=length(${$val[0]}); $pos+=24) { + my $n = Get32u($val[0], $pos); + my $start = Get32u($val[0], $pos + 4); + my (@lbl, $lbl); + push @lbl, $lbl{$n} if defined $lbl{$n}; + push @lbl, $rlbl{$n} if defined $rlbl{$n}; + push @lbl, '-', $note{$n} if defined $note{$n}; + my $lbl = join ' ', @lbl; + $buff .= sprintf("%d\t%.3f\t%.3f\t%s\t%s\t%s\t%s\n", + $n, $start/$val[1], ($start+($rgn{$n}||0))/$val[1], + defined($lbl{$n}) ? $lbl{$n} : '', + defined($rtyp{$n}) ? $rtyp{$n} : '', + defined($rlbl{$n}) ? $rlbl{$n} : '', + defined($note{$n}) ? $note{$n} : ''); + } + return $buff; + }, + }, + }, +); + +1; # end \ No newline at end of file diff --git a/config_files/depthmap.config b/config_files/depthmap.config new file mode 100644 index 0000000..ec56fef --- /dev/null +++ b/config_files/depthmap.config @@ -0,0 +1,56 @@ +#------------------------------------------------------------------------------ +# File: depthmap.config +# +# Description: Composite tag definitions to extract DepthMap and ConfidenceMap +# images from Google Dynamic-depth images +# +# Usage: exiftool -config depthmap.config -W %d%f_%t.%s -depthmap -confidencemap -b DIR +# +# Requires: ExifTool version 11.88 or later +# +# Revisions: 2020/02/20 - P. Harvey Created +#------------------------------------------------------------------------------ + +sub GetTrailerImage($$) +{ + my ($val, $type) = @_; + my @uri = ref $$val[1] ? @{$$val[1]} : $$val[1]; + my @len = ref $$val[2] ? @{$$val[2]} : $$val[2]; + my $start = 0; + for (my $i=0; $i<@uri; ++$i) { + if ($uri[$i] =~ /$type/) { + my $img = substr(${$$val[0]}, $start, $len[$i]); + return \$img; + } + $start += $len[$i]; + } + return undef; +} + +%Image::ExifTool::UserDefined = ( + 'Image::ExifTool::Composite' => { + DepthMap => { + Require => { + 0 => 'Trailer', + 1 => 'ContainerDirectoryItemDataURI', + 2 => 'ContainerDirectoryItemLength', + }, + ValueConv => 'GetTrailerImage(\@val, "depthmap")', + }, + ConfidenceMap => { + Require => { + 0 => 'Trailer', + 1 => 'ContainerDirectoryItemDataURI', + 2 => 'ContainerDirectoryItemLength', + }, + ValueConv => 'GetTrailerImage(\@val, "confidencemap")', + }, + }, +); + +%Image::ExifTool::UserDefined::Options = ( + RequestTags => 'Trailer', +); + +#------------------------------------------------------------------------------ +1; #end \ No newline at end of file diff --git a/config_files/example.config b/config_files/example.config new file mode 100644 index 0000000..4d8327a --- /dev/null +++ b/config_files/example.config @@ -0,0 +1,357 @@ +#------------------------------------------------------------------------------ +# File: example.config --> ~/.ExifTool_config +# +# Description: Sample user configuration file for Image::ExifTool +# +# Notes: This example file shows how to define your own shortcuts and +# add new EXIF, IPTC, XMP, PNG, MIE and Composite tags, as well +# as how to specify preferred lenses for the LensID tag, and +# define new file types and default ExifTool option values. +# +# Note that unknown tags may be extracted even if they aren't +# defined, but tags must be defined to be written. Also note +# that it is possible to override an existing tag definition +# with a user-defined tag. +# +# To activate this file, rename it to ".ExifTool_config" and +# place it in your home directory or the exiftool application +# directory. (On Mac and some Windows systems this must be done +# via the command line since the GUI's may not allow filenames to +# begin with a dot. Use the "rename" command in Windows or "mv" +# on the Mac.) This causes ExifTool to automatically load the +# file when run. Your home directory is determined by the first +# defined of the following environment variables: +# +# 1. EXIFTOOL_HOME +# 2. HOME +# 3. HOMEDRIVE + HOMEPATH +# 4. (the current directory) +# +# Alternatively, the -config option of the exiftool application +# may be used to load a specific configuration file (note that +# this must be the first option on the command line): +# +# exiftool -config example.config ... +# +# This example file defines the following 16 new tags as well as +# a number of Shortcut and Composite tags: +# +# 1. EXIF:NewEXIFTag +# 2. GPS:GPSPitch +# 3. GPS:GPSRoll +# 4. IPTC:NewIPTCTag +# 5. XMP-xmp:NewXMPxmpTag +# 6. XMP-exif:GPSPitch +# 7. XMP-exif:GPSRoll +# 8. XMP-xxx:NewXMPxxxTag1 +# 9. XMP-xxx:NewXMPxxxTag2 +# 10. XMP-xxx:NewXMPxxxTag3 +# 11. XMP-xxx:NewXMPxxxStruct +# 12. PNG:NewPngTag1 +# 13. PNG:NewPngTag2 +# 14. PNG:NewPngTag3 +# 15. MIE-Meta:NewMieTag1 +# 16. MIE-Test:NewMieTag2 +# +# For detailed information on the definition of tag tables and +# tag information hashes, see lib/Image/ExifTool/README. +#------------------------------------------------------------------------------ + +# Shortcut tags are used when extracting information to simplify +# commonly used commands. They can be used to represent groups +# of tags, or to provide an alias for a tag name. +%Image::ExifTool::UserDefined::Shortcuts = ( + MyShortcut => ['exif:createdate','exposuretime','aperture'], + MyAlias => 'FocalLengthIn35mmFormat', +); + +# NOTE: All tag names used in the following tables are case sensitive. + +# The %Image::ExifTool::UserDefined hash defines new tags to be added +# to existing tables. +%Image::ExifTool::UserDefined = ( + # All EXIF tags are added to the Main table, and WriteGroup is used to + # specify where the tag is written (default is ExifIFD if not specified): + 'Image::ExifTool::Exif::Main' => { + # Example 1. EXIF:NewEXIFTag + 0xd000 => { + Name => 'NewEXIFTag', + Writable => 'int16u', + WriteGroup => 'IFD0', + }, + # add more user-defined EXIF tags here... + }, + # the Geotag feature writes these additional GPS tags if available: + 'Image::ExifTool::GPS::Main' => { + # Example 2. GPS:GPSPitch + 0xd000 => { + Name => 'GPSPitch', + Writable => 'rational64s', + }, + # Example 3. GPS:GPSRoll + 0xd001 => { + Name => 'GPSRoll', + Writable => 'rational64s', + }, + }, + # IPTC tags are added to a specific record type (eg. application record): + # (Note: IPTC tag ID's are limited to the range 0-255) + 'Image::ExifTool::IPTC::ApplicationRecord' => { + # Example 4. IPTC:NewIPTCTag + 160 => { + Name => 'NewIPTCTag', + Format => 'string[0,16]', + }, + # add more user-defined IPTC ApplicationRecord tags here... + }, + # XMP tags may be added to existing namespaces: + 'Image::ExifTool::XMP::xmp' => { + # Example 5. XMP-xmp:NewXMPxmpTag + NewXMPxmpTag => { Groups => { 2 => 'Author' } }, + # add more user-defined XMP-xmp tags here... + }, + # special Geotag tags for XMP-exif: + 'Image::ExifTool::XMP::exif' => { + # Example 6. XMP-exif:GPSPitch + GPSPitch => { Writable => 'rational', Groups => { 2 => 'Location' } }, + # Example 7. XMP-exif:GPSRoll + GPSRoll => { Writable => 'rational', Groups => { 2 => 'Location' } }, + }, + # new XMP namespaces (eg. xxx) must be added to the Main XMP table: + 'Image::ExifTool::XMP::Main' => { + # namespace definition for examples 8 to 11 + xxx => { # <-- must be the same as the NAMESPACE prefix + SubDirectory => { + TagTable => 'Image::ExifTool::UserDefined::xxx', + # (see the definition of this table below) + }, + }, + # add more user-defined XMP namespaces here... + }, + # new PNG tags are added to the PNG::TextualData table: + 'Image::ExifTool::PNG::TextualData' => { + # Example 12. PNG:NewPngTag1 + NewPngTag1 => { }, + # Example 13. PNG:NewPngTag2 + NewPngTag2 => { iTXt => 1 }, # (force this tag to be written as iTXt) + # Example 14. PNG:NewPngTag3 + NewPngTag3 => { }, + }, + # add a new MIE tag (NewMieTag1) and group (MIE-Test) to MIE-Meta + # (Note: MIE group names must NOT end with a number) + 'Image::ExifTool::MIE::Meta' => { + # Example 15. MIE-Meta:NewMieTag1 + NewMieTag1 => { + Writable => 'rational64u', + Units => [ 'cm', 'in' ], + }, + # new MIE "Test" group for example 16 + Test => { + SubDirectory => { + TagTable => 'Image::ExifTool::UserDefined::MIETest', + DirName => 'MIE-Test', + }, + }, + }, + # Composite tags are added to the Composite table: + 'Image::ExifTool::Composite' => { + # Composite tags have values that are derived from the values of + # other tags. The Require/Desire elements below specify constituent + # tags that must/may exist, and the keys of these hashes are used as + # indices in the @val array of the ValueConv expression to access the + # numerical (-n) values of these tags. Print-converted values are + # accessed via the @prt array. All Require'd tags must exist for + # the Composite tag to be evaluated. If no Require'd tags are + # specified, then at least one of the Desire'd tags must exist. See + # the Composite table in Image::ExifTool::Exif for more examples, + # and lib/Image/ExifTool/README for all of the details. + # The first few examples demonstrate simplifications which may be + # used if only one tag is Require'd or Desire'd: + # 1) the Require lookup may be replaced with a simple tag name + # 2) "$val" may be used to represent "$val[0]" in the expression + FileExtension => { + Require => 'FileName', + ValueConv => '$val=~/\.([^.]*)$/; $1', + }, + # override CircleOfConfusion tag to use D/1750 instead of D/1440 + CircleOfConfusion => { + Require => 'ScaleFactor35efl', + Groups => { 2 => 'Camera' }, + ValueConv => 'sqrt(24*24+36*36) / ($val * 1750)', + # an optional PrintConv may be used to format the value + PrintConv => 'sprintf("%.3f mm",$val)', + }, + # generate a description for this file type + FileTypeDescription => { + Require => 'FileType', + ValueConv => 'GetFileType($val,1) || $val', + }, + # calculate physical image size based on resolution + PhysicalImageSize => { + Require => { + 0 => 'ImageWidth', + 1 => 'ImageHeight', + 2 => 'XResolution', + 3 => 'YResolution', + 4 => 'ResolutionUnit', + }, + ValueConv => '$val[0]/$val[2] . " " . $val[1]/$val[3]', + # (the @prt array contains print-formatted values) + PrintConv => 'sprintf("%.1fx%.1f $prt[4]", split(" ",$val))', + }, + # [advanced] select largest JPEG preview image + BigImage => { + Groups => { 2 => 'Preview' }, + Desire => { + 0 => 'JpgFromRaw', + 1 => 'PreviewImage', + 2 => 'OtherImage', + # (DNG and A100 ARW may be have 2 PreviewImage's) + 3 => 'PreviewImage (1)', + # (if the MPF has 2 previews, MPImage3 could be the larger one) + 4 => 'MPImage3', + }, + # ValueConv may also be a code reference + # Inputs: 0) reference to list of values, 1) ExifTool object + ValueConv => sub { + my $val = shift; + my ($image, $bigImage, $len, $bigLen); + foreach $image (@$val) { + next unless ref $image eq 'SCALAR'; + # check for JPEG image (or "Binary data" if -b not used) + next unless $$image =~ /^(\xff\xd8\xff|Binary data (\d+))/; + $len = $2 || length $$image; # get image length + # save largest image + next if defined $bigLen and $bigLen >= $len; + $bigLen = $len; + $bigImage = $image; + } + return $bigImage; + }, + }, + # **** ADD ADDITIONAL COMPOSITE TAG DEFINITIONS HERE **** + }, +); + +# This is a basic example of the definition for a new XMP namespace. +# This table is referenced through a SubDirectory tag definition +# in the %Image::ExifTool::UserDefined definition above. +# The namespace prefix for these tags is 'xxx', which corresponds to +# an ExifTool family 1 group name of 'XMP-xxx'. +%Image::ExifTool::UserDefined::xxx = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-xxx', 2 => 'Image' }, + NAMESPACE => { 'xxx' => 'http://ns.myname.com/xxx/1.0/' }, + WRITABLE => 'string', # (default to string-type tags) + # Example 8. XMP-xxx:NewXMPxxxTag1 (an alternate-language tag) + # - replace "NewXMPxxxTag1" with your own tag name (eg. "MyTag") + NewXMPxxxTag1 => { Writable => 'lang-alt' }, + # Example 9. XMP-xxx:NewXMPxxxTag2 (a string tag in the Author category) + NewXMPxxxTag2 => { Groups => { 2 => 'Author' } }, + # Example 10. XMP-xxx:NewXMPxxxTag3 (an unordered List-type tag) + NewXMPxxxTag3 => { List => 'Bag' }, + # Example 11. XMP-xxx:NewXMPxxxStruct (a structured tag) + # - example structured XMP tag + NewXMPxxxStruct => { + # the "Struct" entry defines the structure fields + Struct => { + # optional namespace prefix and URI for structure fields + # (required only if different than NAMESPACE above) + # --> multiple entries may exist in this namespace lookup, + # with the last one alphabetically being the default for + # the fields, but each field may have a "Namespace" + # element to specify which prefix to use + NAMESPACE => { 'test' => 'http://x.y.z/test/' }, + # optional structure name (used for warning messages only) + STRUCT_NAME => 'MyStruct', + # optional rdf:type property for the structure + TYPE => 'http://x.y.z/test/xystruct', + # structure field definitions (very similar to tag definitions) + X => { Writable => 'integer' }, + Y => { Writable => 'integer' }, + # a nested structure... + Things => { + List => 'Bag', + Struct => { + NAMESPACE => { thing => 'http://x.y.z/thing/' }, + What => { }, + Where => { }, + }, + }, + }, + List => 'Seq', # structures may also be elements of a list + }, + # Each field in the structure has a corresponding flattened tag that is + # generated automatically with an ID made from a concatenation of the + # original structure tag ID and the field name (after capitalizing the + # first letter of the field name if necessary). The Name and/or + # Description of these flattened tags may be changed if desired, but all + # other tag properties are taken from the structure field definition. + # The "Flat" flag must be used when setting the Name or Description of a + # flattened tag. For example: + NewXMPxxxStructX => { Name => 'SomeOtherName', Flat => 1 }, +); + +# Adding a new MIE group requires a few extra definitions +use Image::ExifTool::MIE; +%Image::ExifTool::UserDefined::MIETest = ( + %Image::ExifTool::MIE::tableDefaults, # default MIE table entries + GROUPS => { 0 => 'MIE', 1 => 'MIE-Test', 2 => 'Document' }, + WRITE_GROUP => 'MIE-Test', + # Example 16. MIE-Test:NewMieTag2 + NewMieTag2 => { }, # new user-defined tag in MIE-Test group +); + +# A special 'Lenses' list can be defined to give priority to specific lenses +# in the logic to determine a lens model for the Composite:LensID tag +@Image::ExifTool::UserDefined::Lenses = ( + 'Sigma AF 10-20mm F4-5.6 EX DC', + 'Tokina AF193-2 19-35mm f/3.5-4.5', +); + +# User-defined file types to recognize +%Image::ExifTool::UserDefined::FileTypes = ( + XXX => { # <-- the extension of the new file type (case insensitive) + # BaseType specifies the format upon which this file is based (case + # sensitive). If BaseType is defined, then the file will be fully + # supported, and in this case the Magic pattern should not be defined + BaseType => 'TIFF', + MIMEType => 'image/x-xxx', + Description => 'My XXX file type', + # if the BaseType is writable by ExifTool, then the new file type + # will also be writable unless otherwise specified, like this: + Writable => 0, + }, + YYY => { + # without BaseType, the file will be recognized but not supported + Magic => '0123abcd', # regular expression to match at start of file + MIMEType => 'application/test', + Description => 'My YYY file type', + }, + ZZZ => { + # if neither BaseType nor Magic are defined, the file will be + # recognized by extension only. MIMEType will be application/unknown + # unless otherwise specified + Description => 'My ZZZ file type', + }, + # if only BaseType is specified, then the following simplified syntax + # may be used. In this example, files with extension "TTT" will be + # processed as JPEG files + TTT => 'JPEG', +); + +# Change default location for writing QuickTime tags so Keys is preferred +# (by default, the PREFERRED levels are: ItemList=2, UserData=1, Keys=0) +use Image::ExifTool::QuickTime; +$Image::ExifTool::QuickTime::Keys{PREFERRED} = 3; + +# Specify default ExifTool option values +# (see the Options function documentation for available options) +%Image::ExifTool::UserDefined::Options = ( + CoordFormat => '%.6f', # change default GPS coordinate format + Duplicates => 1, # make -a default for the exiftool app + GeoMaxHDOP => 4, # ignore GPS fixes with HDOP > 4 + RequestAll => 3, # request additional tags not normally generated +); + +#------------------------------------------------------------------------------ +1; #end diff --git a/config_files/fotoware.config b/config_files/fotoware.config new file mode 100644 index 0000000..137f832 --- /dev/null +++ b/config_files/fotoware.config @@ -0,0 +1,114 @@ +#------------------------------------------------------------------------------ +# File: fotoware.config +# +# Description: This config file defines Fotoware XMP tags for writing. +# +# Notes: Length limits are imposed according to Fotoware limitations when +# writing string values, but these may be disabled with the -n +# option or by adding a "#" to the tag name. However, beware that +# longer strings may cause unpredictable results in Fotoware +# software. +# +# Use of this file will not bring full Fotoware 'experience'. +# Fotostation writes these tags not only into XMP but also in IIM +# and even Exif spaces. Communication with older Fotoware systems +# may be broken when using only XMP. +# +# Also note that there are potential problems with character +# encoding on systems with mixed environments, depending on +# Fotoware software settings. +# +# Usage: exiftool -config fotoware.config -FOTOWARETAG=VALUE FILE ... +# +# Requires: ExifTool version 7.00 or later +# +# Revisions: 2012/09/19 - P. Harvey Created +# 2016/09/24 - Mikolaj Machowski updated with new Fotostation tags +#------------------------------------------------------------------------------ + +%Image::ExifTool::UserDefined = ( + 'Image::ExifTool::XMP::Main' => { + fwl => { + SubDirectory => { TagTable => 'Image::ExifTool::UserDefined::fwl' }, + }, + fwr => { + SubDirectory => { TagTable => 'Image::ExifTool::UserDefined::fwr' }, + }, + fwc => { + SubDirectory => { TagTable => 'Image::ExifTool::UserDefined::fwc' }, + }, + fwu => { + SubDirectory => { TagTable => 'Image::ExifTool::UserDefined::fwu' }, + }, + }, +); + +%Image::ExifTool::UserDefined::fwl = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-fwl', 2 => 'Image' }, + NAMESPACE => { 'fwl' => 'http://ns.fotoware.com/iptcxmp-legacy/1.0/' }, + WRITABLE => 'string', + # limit maximum lengths of string values + CreatedTime => { PrintConvInv => 'substr($val,0,16)' }, + EditStatus => { PrintConvInv => 'substr($val,0,64)' }, + FixtureIdentifier=> { PrintConvInv => 'substr($val,0,1024)' }, + LocalCaption => { PrintConvInv => 'substr($val,0,2000)' }, + ObjectCycle => { PrintConvInv => 'substr($val,0,32)' }, + ProgramVersion => { PrintConvInv => 'substr($val,0,10)' }, + ReferenceNumber => { PrintConvInv => 'substr($val,0,256)' }, + ReferenceService => { PrintConvInv => 'substr($val,0,256)' }, + ReferenceDate => { + Groups => { 2 => 'Time' }, + Writable => 'date', + Shift => 'Time', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', + }, + ReleaseDate => { + Groups => { 2 => 'Time' }, + Writable => 'date', + Shift => 'Time', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', + }, + ReleaseTime => { PrintConvInv => 'substr($val,0,16)' }, +); + +%Image::ExifTool::UserDefined::fwr = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-fwr', 2 => 'Image' }, + NAMESPACE => { 'fwr' => 'http://ns.fotoware.com/iptcxmp-reserved/1.0/' }, + WRITABLE => 'string', + Classify => { PrintConvInv => 'substr($val,0,256)' }, + DocumentText => { PrintConvInv => 'substr($val,0,2000)' }, + Exif => { PrintConvInv => 'substr($val,0,1024)' }, + History => { PrintConvInv => 'substr($val,0,256)' }, + ImageNotes => { PrintConvInv => 'substr($val,0,256)' }, + JobId => { PrintConvInv => 'substr($val,0,256)' }, + OwnerId => { PrintConvInv => 'substr($val,0,256)' }, + ShortUniqeId => { PrintConvInv => 'substr($val,0,256)' }, + ContentValue => { PrintConvInv => 'substr($val,0,256)' }, + UniqueId => { PrintConvInv => 'substr($val,0,256)' }, + MasterDocumentId => { PrintConvInv => 'substr($val,0,256)' }, +); + + +%Image::ExifTool::UserDefined::fwc = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-fwc', 2 => 'Image' }, + NAMESPACE => { 'fwc' => 'http://ns.fotoware.com/iptcxmp-custom/1.0/' }, + WRITABLE => 'string', + # generate CustomField1 through CustomField20 tags + map { 'CustomField' . $_ => { + PrintConvInv => 'substr($val,0,256)', + } } (1 .. 20), +); + +%Image::ExifTool::UserDefined::fwu = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-fwu', 2 => 'Image' }, + NAMESPACE => { 'fwu' => 'http://ns.fotoware.com/iptcxmp-user/1.0/' }, + WRITABLE => 'string', + # generate UserDefined1 through UserDefined255 tags + map { 'UserDefined' . $_ => { + PrintConvInv => 'substr($val,0,256)', + } } (1 .. 255), +); + +1; #end diff --git a/config_files/gps2utm.config b/config_files/gps2utm.config new file mode 100644 index 0000000..1f929e6 --- /dev/null +++ b/config_files/gps2utm.config @@ -0,0 +1,256 @@ +#------------------------------------------------------------------------------ +# File: gps2utm.config +# +# Description: Generate UTM tags from GPS information +# +# Requires: ExifTool version 7.00 or later +# +# Notes: Uses GPSMapDatum, GPSLatitude and GPSLongitude to generate +# UTMCoordinates, UTMZone, UTMEasting and UTMNorthing. If +# GPSMapDatum is not available then "WGS84" is assumed. +# +# Example: > exiftool -config gps2utm.config "-utm*" t/images/GPS.jpg +# UTM Coordinates : 30U 569475.596m E 6094180.754m N +# UTM Easting : 569475.595558165 +# UTM Northing : 6094180.75443061 +# UTM Zone : 30U +# +# Caveats: When used to convert EXIF GPS coordinates, the reference +# direction tags (GPSLatitudeRef/GPSLongitudeRef) must exist or +# the calculated UTM coordinates may be in the wrong hemisphere +# +# Revisions: 2016/03/08 - Bryan K. Williams (aka StarGeek) Created +# 2016/03/09 - PH removed library dependency and re-organized +#------------------------------------------------------------------------------ + +my $deg2rad = 3.14159265358979 / 180; + +sub tan($) +{ + return sin($_[0]) / cos($_[0]); +} + +#=============================================================================== +# the following code is by Graham Crookham: +# http://search.cpan.org/~grahamc/Geo-Coordinates-UTM/ (version 0.11) + +# remove all markup from an ellipsoid name, to increase the chance +# that a match is found. +sub _cleanup_name($) +{ my $copy = lc(shift); + for($copy) + { s/\([^)]+\)//g; # remove text between parentheses + s/[\s-]//g; # no blanks or dashes + } + $copy; +} + +# Ellipsoid array (name,equatorial radius,square of eccentricity) +# Same data also as hash with key eq name (in variations) + +my (@Ellipsoid, %Ellipsoid); + +BEGIN { # Initialize this before other modules get a chance + @Ellipsoid = + ( [ "Airy", 6377563, 0.00667054] + , [ "Australian National", 6378160, 0.006694542] + , [ "Bessel 1841", 6377397, 0.006674372] + , [ "Bessel 1841 Nambia", 6377484, 0.006674372] + , [ "Clarke 1866", 6378206, 0.006768658] + , [ "Clarke 1880", 6378249, 0.006803511] + , [ "Everest 1830 India", 6377276, 0.006637847] + , [ "Fischer 1960 Mercury", 6378166, 0.006693422] + , [ "Fischer 1968", 6378150, 0.006693422] + , [ "GRS 1967", 6378160, 0.006694605] + , [ "GRS 1980", 6378137, 0.00669438] + , [ "Helmert 1906", 6378200, 0.006693422] + , [ "Hough", 6378270, 0.00672267] + , [ "International", 6378388, 0.00672267] + , [ "Krassovsky", 6378245, 0.006693422] + , [ "Modified Airy", 6377340, 0.00667054] + , [ "Modified Everest", 6377304, 0.006637847] + , [ "Modified Fischer 1960", 6378155, 0.006693422] + , [ "South American 1969", 6378160, 0.006694542] + , [ "WGS 60", 6378165, 0.006693422] + , [ "WGS 66", 6378145, 0.006694542] + , [ "WGS-72", 6378135, 0.006694318] + , [ "WGS-84", 6378137, 0.00669438 ] + , [ "Everest 1830 Malaysia", 6377299, 0.006637847] + , [ "Everest 1956 India", 6377301, 0.006637847] + , [ "Everest 1964 Malaysia and Singapore", 6377304, 0.006637847] + , [ "Everest 1969 Malaysia", 6377296, 0.006637847] + , [ "Everest Pakistan", 6377296, 0.006637534] + , [ "Indonesian 1974", 6378160, 0.006694609] + , [ "Arc 1950", 6378249.145,0.006803481] + , [ "NAD 27",6378206.4,0.006768658] + , [ "NAD 83",6378137,0.006694384] + ); + +# calc ecc as +# a = semi major axis +# b = semi minor axis +# e^2 = (a^2-b^2)/a^2 +# For clarke 1880 (Arc1950) a=6378249.145 b=6356514.966398753 +# e^2 (40682062155693.23 - 40405282518051.34) / 40682062155693.23 +# e^2 = 0.0068034810178165 + + foreach my $el (@Ellipsoid) + { my ($name, $eqrad, $eccsq) = @$el; + $Ellipsoid{$name} = $el; + $Ellipsoid{_cleanup_name $name} = $el; + } +} + +# Returns "official" name, equator radius and square eccentricity +# The specified name can be numeric (for compatibility reasons) or +# a more-or-less exact name +# Examples: my($name, $r, $sqecc) = ellipsoid_info 'wgs84'; +# my($name, $r, $sqecc) = ellipsoid_info 'WGS 84'; +# my($name, $r, $sqecc) = ellipsoid_info 'WGS-84'; +# my($name, $r, $sqecc) = ellipsoid_info 'WGS-84 (new specs)'; +# my($name, $r, $sqecc) = ellipsoid_info 22; + +sub ellipsoid_info($) +{ my $id = shift; + + my $el = $id !~ m/\D/ + ? $Ellipsoid[$id-1] # old system counted from 1 + : $Ellipsoid{$id} || $Ellipsoid{_cleanup_name $id}; + + defined $el ? @$el : (); +} + +# Expects Ellipsoid Number or name, Latitude, Longitude +# (Latitude and Longitude in decimal degrees) +# Returns UTM Zone, UTM Easting, UTM Northing + +sub latlon_to_utm(@) +{ my ($ellips, $latitude, $longitude) = @_; + + die("Longitude value ($longitude) invalid\n") + if $longitude < -180 || $longitude > 180; + + my $long2 = $longitude - int(($longitude + 180)/360) * 360; + my $zone = _latlon_zone_number($latitude, $long2); + + _latlon_to_utm($ellips || 'WGS84', $zone, $latitude, $long2); +} + +sub _latlon_zone_number +{ my ($latitude, $long2) = @_; + + my $zone = int( ($long2 + 180)/6) + 1; + if($latitude >= 56.0 && $latitude < 64.0 && $long2 >= 3.0 && $long2 < 12.0) + { $zone = 32; + } + if($latitude >= 72.0 && $latitude < 84.0) { + $zone = ($long2 >= 0.0 && $long2 < 9.0) ? 31 + : ($long2 >= 9.0 && $long2 < 21.0) ? 33 + : ($long2 >= 21.0 && $long2 < 33.0) ? 35 + : ($long2 >= 33.0 && $long2 < 42.0) ? 37 + : $zone; + } + return $zone; +} + +sub _latlon_to_utm +{ my ($ellips, $zone, $latitude, $long2) = @_; + + my ($name, $radius, $eccentricity) = ellipsoid_info $ellips + or die("Ellipsoid value ($ellips) invalid\n"); + + my $lat_radian = $deg2rad * $latitude; + my $long_radian = $deg2rad * $long2; + + my $k0 = 0.9996; # scale + + my $longorigin = ($zone - 1)*6 - 180 + 3; + my $longoriginradian = $deg2rad * $longorigin; + my $eccentprime = $eccentricity/(1-$eccentricity); + + my $N = $radius / sqrt(1-$eccentricity * sin($lat_radian)*sin($lat_radian)); + my $T = tan($lat_radian) * tan($lat_radian); + my $C = $eccentprime * cos($lat_radian)*cos($lat_radian); + my $A = cos($lat_radian) * ($long_radian - $longoriginradian); + my $M = $radius + * ( ( 1 - $eccentricity/4 - 3 * $eccentricity * $eccentricity/64 + - 5 * $eccentricity * $eccentricity * $eccentricity/256 + ) * $lat_radian + - ( 3 * $eccentricity/8 + 3 * $eccentricity * $eccentricity/32 + + 45 * $eccentricity * $eccentricity * $eccentricity/1024 + ) * sin(2 * $lat_radian) + + ( 15 * $eccentricity * $eccentricity/256 + + 45 * $eccentricity * $eccentricity * $eccentricity/1024 + ) * sin(4 * $lat_radian) + - ( 35 * $eccentricity * $eccentricity * $eccentricity/3072 + ) * sin(6 * $lat_radian) + ); + + my $utm_easting = $k0*$N*($A+(1-$T+$C)*$A*$A*$A/6 + + (5-18*$T+$T*$T+72*$C-58*$eccentprime)*$A*$A*$A*$A*$A/120) + + 500000.0; + + my $utm_northing= $k0 * ( $M + $N*tan($lat_radian) * ( $A*$A/2+(5-$T+9*$C+4*$C*$C)*$A*$A*$A*$A/24 + (61-58*$T+$T*$T+600*$C-330*$eccentprime) * $A*$A*$A*$A*$A*$A/720)); + + $utm_northing += 10000000.0 if $latitude < 0; + + my $utm_letter + = ( 84 >= $latitude && $latitude >= 72) ? 'X' + : ( 72 > $latitude && $latitude >= 64) ? 'W' + : ( 64 > $latitude && $latitude >= 56) ? 'V' + : ( 56 > $latitude && $latitude >= 48) ? 'U' + : ( 48 > $latitude && $latitude >= 40) ? 'T' + : ( 40 > $latitude && $latitude >= 32) ? 'S' + : ( 32 > $latitude && $latitude >= 24) ? 'R' + : ( 24 > $latitude && $latitude >= 16) ? 'Q' + : ( 16 > $latitude && $latitude >= 8) ? 'P' + : ( 8 > $latitude && $latitude >= 0) ? 'N' + : ( 0 > $latitude && $latitude >= -8) ? 'M' + : ( -8 > $latitude && $latitude >= -16) ? 'L' + : (-16 > $latitude && $latitude >= -24) ? 'K' + : (-24 > $latitude && $latitude >= -32) ? 'J' + : (-32 > $latitude && $latitude >= -40) ? 'H' + : (-40 > $latitude && $latitude >= -48) ? 'G' + : (-48 > $latitude && $latitude >= -56) ? 'F' + : (-56 > $latitude && $latitude >= -64) ? 'E' + : (-64 > $latitude && $latitude >= -72) ? 'D' + : (-72 > $latitude && $latitude >= -80) ? 'C' + : die("Latitude ($latitude) out of UTM range\n"); + + $zone .= $utm_letter; + + ($zone, $utm_easting, $utm_northing); +} +# End Graham Crookham code +#=============================================================================== + +%Image::ExifTool::UserDefined = ( + 'Image::ExifTool::Composite' => { + UTMCoordinates => { + Desire => { + 0 => 'GPSMapDatum', + }, + Require => { + 1 => 'GPSLatitude', + 2 => 'GPSLongitude', + }, + ValueConv => 'join " ", latlon_to_utm(@val)', + PrintConv => 'sprintf("%s %.3fm E %.3fm N", split(" ", $val))', + }, + UTMZone => { + Require => 'UTMCoordinates', + ValueConv => 'my @a=split(" ",$val); $a[0]', + }, + UTMEasting => { + Require => 'UTMCoordinates', + ValueConv => 'my @a=split(" ",$val); $a[1]', + }, + UTMNorthing => { + Require => 'UTMCoordinates', + ValueConv => 'my @a=split(" ",$val); $a[2]', + }, + }, +); + +#------------------------------------------------------------------------------ +1; #end diff --git a/config_files/nksc.config b/config_files/nksc.config new file mode 100644 index 0000000..c0244b9 --- /dev/null +++ b/config_files/nksc.config @@ -0,0 +1,146 @@ +#------------------------------------------------------------------------------ +# File: nksc.config +# +# Description: This config file contains tag definitions to extract metadata +# from RDF/XML-based Nikon ViewNX NKSC sidecar files +# +# Usage: exiftool -config nksc.config -ext nksc DIR +# +# Requires: ExifTool version 11.38 or later +# +# Revisions: 2019/04/24 - P. Harvey Created +#------------------------------------------------------------------------------ + +%Image::ExifTool::UserDefined = ( + 'Image::ExifTool::XMP::Main' => { + ast => { + SubDirectory => { TagTable => 'Image::ExifTool::UserDefined::ast' }, + }, + sdc => { + SubDirectory => { TagTable => 'Image::ExifTool::UserDefined::sdc' }, + }, + nine => { + SubDirectory => { TagTable => 'Image::ExifTool::UserDefined::nine' }, + }, + }, + 'Image::ExifTool::Composite' => { + GPSLatitude => { + Require => { + 0 => 'XMP-ast:GPSLatitude', + 1 => 'XMP-ast:GPSLatitudeRef', + }, + ValueConv => '$prt[1] =~ /^S/i ? -$val[0] : $val[0]', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + GPSLongitude => { + Require => { + 0 => 'XMP-ast:GPSLongitude', + 1 => 'XMP-ast:GPSLongitudeRef', + }, + ValueConv => '$prt[1] =~ /^W/i ? -$val[0] : $val[0]', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + }, +); + +%Image::ExifTool::UserDefined::ast = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-ast', 2 => 'Location' }, + NAMESPACE => { 'ast' => 'http://ns.nikon.com/asteroid/1.0/' }, + about => { Groups => { 2 => 'Image' } }, + version => { Groups => { 2 => 'Image' } }, + GPSVersionID => { + ValueConv => q{ + my $valPt = Image::ExifTool::XMP::DecodeBase64($val); + SetByteOrder('II'); + ReadValue($valPt, 0, 'int8u', 4, length($$valPt)); + }, + PrintConv => '$val =~ tr/ /./; $val', + }, + GPSLatitude => { + ValueConv => q{ + my $valPt = Image::ExifTool::XMP::DecodeBase64($val); + SetByteOrder('II'); + $val = ReadValue($valPt, 0, 'double', 3, length($$valPt)); + Image::ExifTool::GPS::ToDegrees($val); + }, + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val)', + }, + GPSLatitudeRef => { + ValueConv => q{ + my $valPt = Image::ExifTool::XMP::DecodeBase64($val); + SetByteOrder('II'); + ReadValue($valPt, 0, 'int32u', 3, length($$valPt)); + }, + PrintConv => { 0 => 'North', 1 => 'South' }, + }, + GPSLongitude => { + ValueConv => q{ + my $valPt = Image::ExifTool::XMP::DecodeBase64($val); + SetByteOrder('II'); + $val = ReadValue($valPt, 0, 'double', 3, length($$valPt)); + Image::ExifTool::GPS::ToDegrees($val); + }, + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val)', + }, + GPSLongitudeRef => { + ValueConv => q{ + my $valPt = Image::ExifTool::XMP::DecodeBase64($val); + SetByteOrder('II'); + ReadValue($valPt, 0, 'int32u', 3, length($$valPt)); + }, + PrintConv => { 2 => 'East', 3 => 'West' }, + }, + GPSAltitude => { + ValueConv => q{ + my $valPt = Image::ExifTool::XMP::DecodeBase64($val); + SetByteOrder('II'); + ReadValue($valPt, 0, 'double'); + }, + PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "$val m"', + }, + GPSAltitudeRef => { + ValueConv => q{ + my $valPt = Image::ExifTool::XMP::DecodeBase64($val); + ReadValue($valPt, 0, 'int8u'); + }, + PrintConv => { + 0 => 'Above Sea Level', + 1 => 'Below Sea Level', + }, + }, + GPSMapDatum => { }, + XMLPackets => { + Name => 'XMP', + Groups => { 2 => 'Image' }, + RawConv => 'Image::ExifTool::XMP::DecodeBase64($val)', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, + IPTC => { + Name => 'IPTC', + Groups => { 2 => 'Image' }, + RawConv => 'Image::ExifTool::XMP::DecodeBase64($val)', + SubDirectory => { TagTable => 'Image::ExifTool::IPTC::Main' }, + }, +); + +%Image::ExifTool::UserDefined::sdc = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-sdc', 2 => 'Image' }, + NAMESPACE => { 'sdc' => 'http://ns.nikon.com/sdc/1.0/' }, + about => { }, + version => { }, + appversion => { }, + appname => { }, +); + +%Image::ExifTool::UserDefined::nine = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-nine', 2 => 'Image' }, + NAMESPACE => { 'nine' => 'http://ns.nikon.com/nine/1.0/' }, + about => { }, + version => { }, + NineEdits => { Binary => 1 }, + Label => { }, + Rating => { }, + Trim => { ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)' }, +); + +1; #end diff --git a/config_files/photoshop_paths.config b/config_files/photoshop_paths.config new file mode 100644 index 0000000..a2e0ab6 --- /dev/null +++ b/config_files/photoshop_paths.config @@ -0,0 +1,221 @@ +#------------------------------------------------------------------------------ +# File: photoshop_paths.config +# +# Description: This config file generates user-defined tags for Photoshop +# paths, and may be used to extract path names and/or Bezier knot +# anchor points, or copy path information from one file to +# another. +# +# The anchor points may be extracted along with the path names by +# setting the "Anchor" user parameter (ie. "-userparam anchor"), +# or by themselves with "AnchorOnly". +# +# An "AllPaths" shortcut tag is also provided represent all +# Photoshop path tags. This shortcut must be used when copying +# because these tags are marked as "Protected" so they won't be +# copied by default (also see the notes below). +# +# Path anchor points are converted to pixel coordinates by the +# Composite PathPixXXX tags, and an "AllPathPix" shortcut is +# provided to represent these tags. +# +# Finally, a Composite PathCount tag is provided to return the +# number of paths in an image, and a TotalPathPoints tag counts +# the total number of path anchor points. +# +# Notes: 1) Print conversion must be disabled to be able to copy the paths +# (via either the -n option, or by adding a "#" to the tag name, +# eg. "-tagsfromfile SRC -allpaths#"). +# +# 2) When copying the paths, OriginPathInfo must also be copied +# (otherwise Photoshop may give a "program error" and refuse to +# load the image). +# +# Usage: +# +# 1) Extract Photoshop path names: +# +# exiftool -config photoshop_paths.config -allpaths FILE +# +# 2) Extract Photoshop path names and anchor points: +# +# exiftool -config photoshop_paths.config -userparam anchor -allpaths FILE +# +# 3) Extract Photoshop path anchor points only: +# +# exiftool -config photoshop_paths.config -userparam anchoronly -allpaths FILE +# +# 4) Copy all Photoshop paths from one file (SRC) to another (DST): +# (note that OriginPathInfo must also be copied when copying all paths) +# +# exiftool -config photoshop_paths.config -tagsfromfile SRC -allpaths# -originpathinfo DST +# +# 5) Extract path names and anchor points in pixel coordinates: +# +# exiftool -config photoshop_paths.config -allpathpix FILE +# +# Requires: ExifTool version 9.95 or later +# +# Notes: A "-" before a set of Bezier path points indicates a closed subpath, +# and a "+ indicates the start of an open subpath. +# +# Revisions: 2015/05/07 - P. Harvey Created +# 2016/09/14 - PH Added feature to allow extracting anchor points +# 2017/01/24 - PH Added PathCount and PathPix Composite tags +# 2017/02/02 - PH Added support for copying OriginPathInfo +# 2017/02/22 - PH Fixed problem printing some paths +# 2017/03/19 - PH Added "-" or "+" at the start of closed or open +# subpath respectively +# 2017/06/03 - PH Added TotalPathPoints +# 2017/07/17 - PH Added UniquePathPoints +# 2022/02/03 - PH Added WorkingPath and WorkingPathPix +# +# References: https://exiftool.org/forum/index.php/topic,1621.0.html +# https://exiftool.org/forum/index.php/topic,3910.0.html +# https://exiftool.org/forum/index.php/topic,6647.0.html +#------------------------------------------------------------------------------ + +# Print Photoshop path name and/or anchor points +# Inputs: 0) reference to Photoshop path data, 1) ExifTool object reference +# 2-3) optional image width/height to convert anchor points to pixels +# 4) optional path name +# Returns: String with name and/or Bezier knot anchor points +sub PrintPath($$;$$$) +{ + my ($val, $et, $w, $h, $nm) = @_; + my ($pos, $name, @rtn); + my $len = length($$val) - 26; + + # recover exiftool-added path name if it exists + if ($$val =~ m{.*/#(.{0,255})#/$}s) { + $name = $1; + $len -= length($1) + 4; + $name = $nm if defined $nm and not length $name; + } else { + $name = defined $nm ? $nm : ''; + } + my $anchorOnly = $et->Options(UserParam => 'AnchorOnly'); + push @rtn, $name unless $anchorOnly; + + # loop through path points and extract anchor points if specified + if ($anchorOnly or $et->Options(UserParam => 'Anchor') or defined $w) { + SetByteOrder('MM'); + for ($pos=0; $pos<=$len; $pos+=26) { + my $type = Get16u($val, $pos); + $type == 0 and push(@rtn, '-'), next; + $type == 3 and push(@rtn, '+'), next; + # Bezier knot records are types 1, 2, 4 and 5 + next unless {1=>1,2=>1,4=>1,5=>1}->{$type}; + # the anchor point is at offset 10 in the Bezier knot record + # (fixed-point values with 24-bits after the decimal point) + my $y = Get32s($val, $pos+10) / 0x1000000; # (vertical component first) + my $x = Get32s($val, $pos+14) / 0x1000000; + if (defined $w and defined $h) { + push @rtn, sprintf('(%g,%g)', $x * $w, $y * $h); + } else { + push @rtn, sprintf('(%g,%g)', $x, $y); + } + } + } + return join ' ', @rtn; +} + +%Image::ExifTool::Shortcuts::UserDefined = ( + # create "AllPaths" shortcut for all Photoshop path tags (except WorkingPath) + AllPaths => [ + map { sprintf "Path%x", $_ } (0x7d0 .. 0xbb5), + ], + AllPathPix => [ + map { sprintf "PathPix%x", $_ } (0x7d0 .. 0xbb5), + ], +); + +%Image::ExifTool::UserDefined = ( + 'Image::ExifTool::Photoshop::Main' => { + 0xbb8 => { + Name => 'OriginPathInfo', + Flags => [ qw(Writable Protected Binary SetResourceName) ], + }, + 0x401 => { + Name => 'WorkingPath', + Flags => [ qw(Writable Protected Binary ConvertBinary SetResourceName) ], + PrintConv => sub { + my ($val, $et) = @_; + PrintPath($val, $et, undef, undef, 'Work Path'); + }, + }, + # generate tags for each of the 998 possible Photoshop paths + map { $_ => { + Name => sprintf('Path%x', $_), + Description => sprintf('Path %x', $_), + Flags => [ qw(Writable Protected Binary ConvertBinary SetResourceName) ], + PrintConv => \&PrintPath, + } } (0x7d0 .. 0xbb5), + }, + 'Image::ExifTool::Composite' => { + PathCount => { + # (PathCount statistics do not include WorkingPath) + Desire => { + map { $_-0x7d0 => sprintf('Path%x', $_) } (0x7d0 .. 0xbb5), + }, + ValueConv => sub { + my ($val, $self) = @_; + my $count = 0; + my $pts = 0; + my $uniq = 0; + my %uniq; + foreach (@$val) { + next unless defined $_; + ++$count; + # determine the total number of path anchor points + my $len = length($$_) - 26; + for ($pos=0; $pos<=$len; $pos+=26) { + SetByteOrder('MM'); + my $type = Get16u($_, $pos); + last if $type == 0x2f23; # (start of path name added by ExifTool) + next unless {1=>1,2=>1,4=>1,5=>1}->{$type}; + my $pt = substr($$_, $pos+10, 8); + $uniq{$pt} or ++$uniq, $uniq{$pt} = 1; + ++$pts; + } + } + $$self{TotalPathPoints} = $pts; + $$self{UniquePathPoints} = $uniq; + return $count; + }, + }, + UniquePathPoints => { + Require => 'PathCount', + ValueConv => '$$self{UniquePathPoints}', + }, + TotalPathPoints => { + Require => 'PathCount', + ValueConv => '$$self{TotalPathPoints}', + }, + WorkingPathPix => { + Require => { + 0 => 'ImageWidth', + 1 => 'ImageHeight', + 2 => 'WorkingPath', + }, + ValueConv => sub { + my ($val, $et) = @_; + PrintPath($$val[2], $et, $$val[0], $$val[1], 'Work Path'); + }, + }, + map { sprintf('PathPix%x', $_) => { + Require => { + 0 => 'ImageWidth', + 1 => 'ImageHeight', + 2 => sprintf('Path%x', $_), + }, + Description => sprintf('Path Pix %x', $_), + ValueConv => sub { + my ($val, $et) = @_; + PrintPath($$val[2], $et, $$val[0], $$val[1]); + }, + } } (0x7d0 .. 0xbb5), + }, +); + +1; #end diff --git a/config_files/picasa_faces.config b/config_files/picasa_faces.config new file mode 100644 index 0000000..4db3c85 --- /dev/null +++ b/config_files/picasa_faces.config @@ -0,0 +1,382 @@ +#------------------------------------------------------------------------------ +# File: picasa_faces.config +# +# Description: User-defined Composite tag definitions to convert face regions +# in .picasa.ini files to MWG region tags (Metadata Working Group +# region, used by Picasa) and MP region tags (used by Microsoft +# Photo Library). +# +# Tag definitions and examples: +# +# PicasaToMWGRegion +# This will create the MWG region tag but will filter out the regions +# that are still unnamed in Picasa. Picasa defaults to naming these +# regions 'ffffffffffffffff' but normally will not save these to file. +# Example: +# exiftool -config picasa_faces.config "-RegionInfo 1 } qw( + 3FR ARW CR2 CRW CS1 DCR DNG EIP ERF IIQ K25 KDC MEF MOS MRW NEF NRW + ORF PEF RAF RAW RW2 RWL SR2 SRF SRW X3F), 'Canon 1D RAW'; + +my %contactHash; # lookup for loaded contacts.xml entries +my %fileHash; # lookup for loaded .picasa.ini entries + +#------------------------------------------------------------------------------ +# Load Picasa's contacts.xml and .picasa.ini files. +# Inputs: 0) ExifTool object reference, 1) .picasa.ini directory +# Returns: 1 if files were loaded and parsed, undef on error +# Notes: If file has already been loaded, it isn't reloaded +sub LoadPicasaFiles($$) +{ + local (*CONTACTS, *INI); + my ($et, $iniDir) = @_; + + # check ExifTool version to see if there might be + # a command line setting for the contact file + my $contactFile = ($Image::ExifTool::VERSION >= 9.89 and + defined($et->Options(UserParam => 'PicasaContactsFile'))) ? + $et->Options(UserParam => 'PicasaContactsFile') : $contactXML; + + # load Picasa contacts.xml file unless done already + unless ($contactFile eq $lastContactFile) { + $lastContactFile = $contactFile; + undef %contactHash; + # Picasa's default setting for unnamed faces. + $contactHash{'ffffffffffffffff'} = 'unnamed'; + if (open(CONTACTS, $contactFile)) { + require Image::ExifTool::HTML; + while () { + /name="(.*?)"/ or next; + my $name = $1; + /id="([a-f0-9]+)"/ or next; + my $id = $1; + $contactHash{$id} = Image::ExifTool::HTML::UnescapeHTML($name); + } + close(CONTACTS); + } else { + local $SIG{'__WARN__'} = undef; # stop ExifTool from catching the warning + warn "Error reading contacts file $contactFile\n"; + } + } + + # load .picasa.ini file from the specified directory + my $iniFile = "$iniDir/.picasa.ini"; + + if ($iniFile eq $lastIniFile) { + return %fileHash ? 1 : undef; + } + $lastIniFile = $iniFile; + open(INI, $iniFile) or return undef; + my $section = ''; + while () { + # Process New Section + /^\s*\[(.+)\][\n\r]*$/ and $section = $1, next; + # process entry (all we care about are the "faces" lines) + /^faces=(.*)$/ or next; + my @temp = split /;/, $1; + foreach (@temp) { + /rect64\(([\da-f]{1,16})\),([\da-f]{1,16})/ or next; + # the string in parens after "rect64" is a 64 bit number in hex, + # but Picasa doesn't add leading zeroes, so the length of the string + # cannot be assumed to be 16 bytes. Handle this as two 32-bit numbers + # for compatibility with 32-bit systems. + my $hi = hex(substr($1, 0, -8)); + my $lo = hex(substr($1, -8)); + my $x0 = ($hi >> 16) /65535; + my $y0 = ($hi & 0xffff)/65535; + my $x1 = ($lo >> 16) /65535; + my $y1 = ($lo & 0xffff)/65535; + push @{ $fileHash{$section} }, { + ContactID => $2, + X => $x0, + Y => $y0, + W => $x1 - $x0, + H => $y1 - $y0, + }; + } + } + close(INI); + return %fileHash ? 1 : undef; +} + +#------------------------------------------------------------------------------ +# Rotate region to specified orientation (for RAW file types only) +# Input: 0) rectangle array ref (x,y,w,h), 1) EXIF orientation value, 2) file type +sub RotateRegion($$$) +{ + my ($rect, $orientation, $fileType) = @_; + if ($orientation and $fileType and $isRawFile{$fileType}) { + my ($x,$y,$w,$h) = @$rect; + if ($orientation == 8) { # CW 90 + @$rect = (1-$h-$y, $x, $h, $w); + } elsif ($orientation == 3) { # CW 180 + @$rect = (1-$x-$w, 1-$y-$h, $w, $h); + } elsif ($orientation == 6) { # CW 270 + @$rect = ($y, 1-$x-$w, $h, $w); + } + } +} + +#------------------------------------------------------------------------------ +# Rounds number to 9 decimal places, which is the limit to the number of decimal places that Picasa can read. +sub Rounded +{ + my $DecAcc = 10**9; + return(int($_[0]*$DecAcc+.5)/$DecAcc); +} + +#------------------------------------------------------------------------------ +# User-defined tag definitions +# +%Image::ExifTool::UserDefined = ( + 'Image::ExifTool::Composite' => { + # + # Versions that filter out unnamed regions (ContactID=ffffffffffffffff) + # + PicasaToMWGRegion => { + Require => { + 0 => 'Directory', + 1 => 'FileName', + 2 => 'ImageWidth', + 3 => 'ImageHeight', + }, + Desire => { + 4 => 'Orientation', + 5 => 'FileType', + }, + ValueConv => sub { + my ($val, $et) = @_; + LoadPicasaFiles($et, $$val[0]) or return undef; # load contacts.xml and Picasa.ini + my $filename = $$val[1]; + my @regList; + # convert to local variables for readability, and make + # sure there is a region associated with the current file + my $contactHashRef = \%contactHash; + my $tempArrayRef = $fileHash{$filename} or return undef; + foreach my $tempHash (@$tempArrayRef) { + next if $$tempHash{ContactID} eq 'ffffffffffffffff'; + my $name = $$contactHashRef{$$tempHash{ContactID}}; + next unless defined $name; + my @rect = @$tempHash{'X','Y','W','H'}; + RotateRegion(\@rect, $$val[4], $$val[5]); + push @regList, { + Area => { + X => Rounded($rect[0] + $rect[2] / 2), + Y => Rounded($rect[1] + $rect[3] / 2), + W => Rounded($rect[2]), + H => Rounded($rect[3]), + Unit => 'normalized', + }, + Name => $name, + Type => 'Face', + }; + } + # make sure a region exists, otherwise return undef + return @regList ? { + AppliedToDimensions => { W => $$val[2], H => $$val[3], Unit => 'pixel' }, + RegionList => \@regList, + } : undef; + }, + }, + PicasaToMPRegion => { + Require => { + 0 => 'Directory', + 1 => 'FileName', + }, + Desire => { + 2 => 'Orientation', + 3 => 'FileType', + }, + ValueConv => sub { + my ($val, $et) = @_; + LoadPicasaFiles($et, $$val[0]) or return undef; # load contacts.xml and Picasa.ini + my $filename = $$val[1]; + my @regList; + # convert to local variables for readability, and make + # sure there is a region associated with the current file + my $contactHashRef = \%contactHash; + my $tempArrayRef = $fileHash{$filename} or return undef; + foreach my $tempHash (@$tempArrayRef) { + next if $$tempHash{ContactID} eq 'ffffffffffffffff'; + my $name = $$contactHashRef{$$tempHash{ContactID}}; + next unless defined $name; + my @rect = @$tempHash{'X','Y','W','H'}; + RotateRegion(\@rect, $$val[2], $$val[3]); + @rect = map {Rounded($_)} @rect; + push @regList, { + PersonDisplayName => $name, + Rectangle => join(', ', @rect), + }; + } + # make sure a region exists, otherwise return undef + return @regList ? { Regions => \@regList } : undef; + }, + }, + PicasaRegionNames => { + Require => { + 0 => 'Directory', + 1 => 'FileName', + }, + ValueConv => sub { + my ($val, $et) = @_; + LoadPicasaFiles($et, $$val[0]) or return undef; # load contacts.xml and Picasa.ini + my $filename = $$val[1]; + my @regList; + # convert to local variables for readability, and make + # sure there is a region associated with the current file + my $contactHashRef = \%contactHash; + my $tempArrayRef = $fileHash{$filename} or return undef; + foreach my $tempHash (@$tempArrayRef) { + next if $$tempHash{ContactID} eq 'ffffffffffffffff'; + my $name = $$contactHashRef{$$tempHash{ContactID}}; + push @regList, $name if defined $name; + } + # make sure a region exists, otherwise return undef + return @regList ? \@regList : undef; + }, + }, + # + # Versions that do not filter out unnamed regions (ContactID=ffffffffffffffff) + # Picasa normally does not add these regions when it saves names to the file. + # + PicasaToMWGRegionUnfiltered => { + Require => { + 0 => 'Directory', + 1 => 'FileName', + 2 => 'ImageWidth', + 3 => 'ImageHeight', + }, + Desire => { + 4 => 'Orientation', + 5 => 'FileType', + }, + ValueConv => sub { + my ($val, $et) = @_; + LoadPicasaFiles($et, $$val[0]) or return undef; # load contacts.xml and Picasa.ini + my $filename = $$val[1]; + my @regList; + # convert to local variables for readability, and make + # sure there is a region associated with the current file + my $contactHashRef = \%contactHash; + my $tempArrayRef = $fileHash{$filename} or return undef; + foreach my $tempHash (@$tempArrayRef) { + my @rect = @$tempHash{'X','Y','W','H'}; + RotateRegion(\@rect, $$val[4], $$val[5]); + push @regList, { + Area => { + X => Rounded($rect[0] + $rect[2] / 2), + Y => Rounded($rect[1] + $rect[3] / 2), + W => Rounded($rect[2]), + H => Rounded($rect[3]), + Unit => 'normalized', + }, + Name => $$contactHashRef{$$tempHash{ContactID}} || 'unnamed', + Type => 'Face', + }; + } + # make sure a region exists, otherwise return undef + return @regList ? { + AppliedToDimensions => { W => $$val[2], H => $$val[3], Unit => 'pixel' }, + RegionList => \@regList, + } : undef; + }, + }, + PicasaToMPRegionUnfiltered => { + Require => { + 0 => 'Directory', + 1 => 'FileName', + }, + Desire => { + 2 => 'Orientation', + 3 => 'FileType', + }, + ValueConv => sub { + my ($val, $et) = @_; + LoadPicasaFiles($et, $$val[0]) or return undef; # load contacts.xml and Picasa.ini + my $filename = $$val[1]; + my @regList; + # convert to local variables for readability, and make + # sure there is a region associated with the current file + my $contactHashRef = \%contactHash; + my $tempArrayRef = $fileHash{$filename} or return undef; + foreach my $tempHash (@$tempArrayRef) { + my @rect = @$tempHash{'X','Y','W','H'}; + RotateRegion(\@rect, $$val[2], $$val[3]); + @rect = map {Rounded($_)} @rect; + push @regList, { + PersonDisplayName => $$contactHashRef{$$tempHash{ContactID}} || 'unnamed', + Rectangle => join(', ', @rect), + } + } + # make sure a region exists, otherwise return undef + return @regList ? { Regions => \@regList } : undef; + }, + }, + }, +); + +#------------------------------------------------------------------------------ +1; #end diff --git a/config_files/pix4d.config b/config_files/pix4d.config new file mode 100644 index 0000000..b11bc92 --- /dev/null +++ b/config_files/pix4d.config @@ -0,0 +1,99 @@ +#------------------------------------------------------------------------------ +# File: pix4d.config +# +# Description: This config file contains tag definitions needed to be able +# to write Pix4D XMP-Camera tags +# +# Usage: exiftool -config pix4d.config -XMP-camera:TAG=VAL ... +# +# Requires: ExifTool version 7.00 or later +# +# References: 1) https://support.pix4d.com/hc/en-us/articles/360016450032-Specifications-of-xmpcamera-tags +# +# Revisions: 2017/12/08 - P. Harvey Created +# 2020/04/02 - PH Updated to current specification +#------------------------------------------------------------------------------ + +%Image::ExifTool::UserDefined = ( + 'Image::ExifTool::XMP::Main' => { + Camera => { + SubDirectory => { + TagTable => 'Image::ExifTool::UserDefined::Camera', + }, + }, + }, +); + +%Image::ExifTool::UserDefined::Camera = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-Camera', 2 => 'Camera' }, + NAMESPACE => { 'Camera' => 'http://pix4d.com/camera/1.0/' }, + WRITABLE => 'string', + Yaw => { Writable => 'real' }, + Pitch => { Writable => 'real' }, + Roll => { Writable => 'real' }, + IMUSampleSize => { Writable => 'integer' }, + IMUTimeOffset => { Writable => 'integer' }, + LineReadoutTime => { Writable => 'integer' }, + IMUFrequency => { Writable => 'real' }, + PrincipalPoint => { }, + ModelType => { }, + PerspectiveFocalLength => { Writable => 'real' }, + PerspectiveDistortion => { }, + IMULinearVelocity => { }, + GPSXYAccuracy => { Writable => 'real' }, + GPSZAccuracy => { Writable => 'real' }, + FlightUUID => { }, + CentralWaveLength => { }, + BandName => { List => 'Seq' }, + RigName => { }, + RigCameraIndex => { Writable => 'integer' }, + BandName => { List => 'Seq' }, + IMUAngularVelocity => { + Binary => 1, + ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)', + ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)', + }, + # added 2020/04/02 (ref 1) + FisheyeAffineMatrix => { }, + FisheyeAffineSymmetric => { }, + FisheyePolynomial => { }, + RigRelatives => { }, + PerspectiveFocalLengthUnits => { }, + CaptureUUID => { }, + CentralWavelength => { List => 'Seq' }, + WavelengthFWHM => { List => 'Seq' }, + BlackCurrent => { List => 'Seq' }, + BandSensitivity => { List => 'Seq' }, + SunSensor => { List => 'Seq' }, + SunSensorExposureTime => { List => 'Seq' }, + SunSensorSensitivity => { List => 'Seq' }, + InvalidPixel => { List => 'Seq' }, + VignettingPolynomial => { List => 'Seq' }, + VignettingCenter => { List => 'Seq' }, + VignettingPolynomial2DName => { List => 'Seq' }, + VignettingPolynomial2D => { List => 'Seq' }, + ColorTransform => { List => 'Seq' }, + IsNormalized => { }, + Albedo => { List => 'Seq' }, + ReflectArea => { List => 'Seq' }, + CalibrationPicture => { Writable => 'integer' }, + GyroRate => { Writable => 'real' }, + IMUPitchAccuracy => { Writable => 'real' }, + IMURollAccuracy => { Writable => 'real' }, + IMUYawAccuracy => { Writable => 'real' }, + NominalCameraDistance => { Writable => 'real' }, + AboveGroundAltitude => { Writable => 'real' }, + SunSensorYaw => { Writable => 'real' }, + SunSensorPitch => { Writable => 'real' }, + SunSensorRoll => { Writable => 'real' }, + SunSensorRelativeRotation => { Writable => 'real', List => 'Seq' }, + TransformAlpha => { List => 'Seq' }, + TransformBeta => { List => 'Seq' }, + TransformGamma => { List => 'Seq' }, + SensorBitDepth => { Writable => 'integer' }, + SensorTemperature => { Writable => 'real' }, + # (ref https://community.pix4d.com/t/camera-sun-irradiance-and-sun-angle-in-red-text/3290) + IrradianceRelativeRotation => { }, +); + +1; #end diff --git a/config_files/rotate_regions.config b/config_files/rotate_regions.config new file mode 100644 index 0000000..79ea460 --- /dev/null +++ b/config_files/rotate_regions.config @@ -0,0 +1,173 @@ +#------------------------------------------------------------------------------ +# File: rotate_regions.config +# +# Description: User-defined Composite tag definitions to rotate MWG region tags +# (Metadata Working Group region, used by Picasa) and MP region tags +# (used by Microsoft Photo Library). +# +# Tag definitions and examples: +# +# RotateMWGRegionCW90 +# RotateMWGRegionCW180 +# RotateMWGRegionCW270 +# These tags will rotate a MWG Region clockwise 90, 180, or 270 degrees. +# Example: +# exiftool -config rotate_regions.config "-RegionInfo { + RotateMWGRegionCW90 =>{ + Require => 'RegionInfo', + ValueConv => q{ + my ($rgn, @newRgns); + foreach $rgn (@{$val[0]{RegionList}}) { + my @rect = @{$$rgn{Area}}{'X','Y','W','H'}; + my %newRgn = ( + Area => { + X => 1-$rect[1], + Y => $rect[0], + W => $rect[3], + H => $rect[2], + Unit => 'normalized', + }, + Name => $$rgn{Name}, + Type => 'Face', + ); + push @newRgns, \%newRgn; + } + return { + AppliedToDimensions => { + W => $val[0]{AppliedToDimensions}{W}, + H => $val[0]{AppliedToDimensions}{H}, + Unit => $val[0]{AppliedToDimensions}{Unit}, + }, + RegionList => \@newRgns, + }; + }, + }, #End RotateMWGRegionCW90 + RotateMWGRegionCW180 =>{ + Require => 'RegionInfo', + ValueConv => q{ + my ($rgn, @newRgns); + foreach $rgn (@{$val[0]{RegionList}}) { + my @rect = @{$$rgn{Area}}{'X','Y','W','H'}; + my %newRgn = ( + Area => { + X => 1-$rect[0], + Y => 1-$rect[1], + W => $rect[2], + H => $rect[3], + Unit => 'normalized', + }, + Name => $$rgn{Name}, + Type => 'Face', + ); + push @newRgns, \%newRgn; + } + return { + AppliedToDimensions => { + W => $val[0]{AppliedToDimensions}{W}, + H => $val[0]{AppliedToDimensions}{H}, + Unit => $val[0]{AppliedToDimensions}{Unit}, + }, + RegionList => \@newRgns, + }; + }, + }, #End RotateMWGRegionCW180 + RotateMWGRegionCW270 =>{ + Require => 'RegionInfo', + ValueConv => q{ + my ($rgn, @newRgns); + foreach $rgn (@{$val[0]{RegionList}}) { + my @rect = @{$$rgn{Area}}{'X','Y','W','H'}; + my %newRgn = ( + Area => { + X => $rect[1], + Y => 1-$rect[0], + W => $rect[3], + H => $rect[2], + Unit => 'normalized', + }, + Name => $$rgn{Name}, + Type => 'Face', + ); + push @newRgns, \%newRgn; + } + return { + AppliedToDimensions => { + W => $val[0]{AppliedToDimensions}{W}, + H => $val[0]{AppliedToDimensions}{H}, + Unit => $val[0]{AppliedToDimensions}{Unit}, + }, + RegionList => \@newRgns, + }; + }, + }, #End RotateMWGRegionCW270 + RotateMPRegionCW90=>{ + Require => 'RegionInfoMP', + ValueConv => q{ + my ($rgn, @newRgns); + foreach $rgn (@{$val[0]{Regions}}) { + my @rect = split /\s*,\s*/, $$rgn{Rectangle}; + my $temp = $rect[0]; + $rect[0] = 1-$rect[1]-$rect[3]; + $rect[1] = $temp; + ($rect[2], $rect[3]) = ($rect[3],$rect[2]); #Swap W and H + push @newRgns, { + PersonDisplayName => $$rgn{PersonDisplayName}, + Rectangle => join(', ', @rect), + }; + } + return { Regions => \@newRgns }; + } + }, #end RotateMPRegionCW90 + RotateMPRegionCW180=>{ + Require => 'RegionInfoMP', + ValueConv => q{ + my ($rgn, @newRgns); + foreach $rgn (@{$val[0]{Regions}}) { + my @rect = split /\s*,\s*/, $$rgn{Rectangle}; + my $tempX = $rect[0]; + my $tempY = $rect[1]; + $rect[0] = 1-$tempX-$rect[2]; + $rect[1] = 1-$tempY-$rect[3]; + push @newRgns, { + PersonDisplayName => $$rgn{PersonDisplayName}, + Rectangle => join(', ', @rect), + }; + } + return { Regions => \@newRgns }; + } + }, #end RotateMPRegionCW180 + RotateMPRegionCW270=>{ + Require => 'RegionInfoMP', + ValueConv => q{ + my ($rgn, @newRgns); + foreach $rgn (@{$val[0]{Regions}}) { + my @rect = split /\s*,\s*/, $$rgn{Rectangle}; + my $temp = $rect[1]; + $rect[1] = 1-$rect[0]-$rect[2]; + $rect[0] = $temp; + ($rect[2], $rect[3]) = ($rect[3],$rect[2]); #Swap W and H + push @newRgns, { + PersonDisplayName => $$rgn{PersonDisplayName}, + Rectangle => join(', ', @rect), + }; + } + return { Regions => \@newRgns }; + } + }, #end RotateMPRegionCW270 + }, +); + +1; #end diff --git a/config_files/tiff_version.config b/config_files/tiff_version.config new file mode 100644 index 0000000..021e72d --- /dev/null +++ b/config_files/tiff_version.config @@ -0,0 +1,121 @@ +#------------------------------------------------------------------------------ +# File: tiff_version.config +# +# Description: This config file contains the definition for a Composite +# TIFFVersion tag used to determine the version of a TIFF file +# +# Usage: exiftool -config tiff_version.config -tiffversion DIR +# +# Requires: ExifTool version 11.50 or later +# +# Revisions: 2019/06/06 - Bryan K. Williams (aka StarGeek) Created +# 2019/06/07 - P. Harvey added test of TIFF format types +# +# References: http://jhove.openpreservation.org/modules/tiff/#profiles +#------------------------------------------------------------------------------ + +# Checks if at least one the values passed are defined. +sub has_defined { + for my $i ( @_ ) { + return 1 if defined $i; + } + return 0; +} + +%Image::ExifTool::UserDefined = ( + 'Image::ExifTool::Composite' => { + TIFFVersion => { + Require => { + 0 => 'FileType' + }, + Desire => { + # Version 5 + 1 => 'EXIF:Artist', # Artist (315/0x013b) + 2 => 'EXIF:ColorMap', # ColorMap (320/0x0140) + 3 => 'EXIF:ModifyDate', # DateTime (306/0x0132) Called DateTime by EXIF spec, ModifyDate by exiftool + 4 => 'EXIF:HostComputer', # HostComputer (316/0x013c) + 5 => 'EXIF:SubfileType', # NewSubfileType (254/0x00fe) Called NewSubfileType by TIFF spec, SubfileType by exiftool + 6 => 'EXIF:Predictor', # Predictor (317/0x013d) + 7 => 'EXIF:PrimaryChromaticities', # PrimaryChromaticities (319/0x013f) + 8 => 'EXIF:Software', # Software (305/0x0131) + 9 => 'EXIF:WhitePoint', # WhitePoint (318/0x013e) + # Version 6 + 10 => 'EXIF:Copyright', # Copyright (33432/0x8298) + 11 => 'EXIF:DotRange', # DotRange (336/0x0150) + 12 => 'EXIF:ExtraSamples', # ExtraSamples (338/0x0152) + 13 => 'EXIF:HalftoneHints', # HalftoneHints (321/0x0141) + 14 => 'EXIF:InkNames', # InkNames (333/0x014d) + 15 => 'EXIF:InkSet', # InkSet (332/0x014c) + 16 => 'EXIF:JPEGACTables', # JPEGACTables (521/0x0209) + 17 => 'EXIF:JPEGDCTables', # JPEGDCTables (520/0x0208) + 18 => 'EXIF:ThumbnailOffset', # JPEGInterchangeFormat (513/0x0201) + 19 => 'EXIF:ThumbnailLength ', # JPEGInterchangeFormatLength (514/0x0202) + 20 => 'EXIF:JPEGLosslessPredictors', # JPEGLosslessPredictors (517/0x0205) + 21 => 'EXIF:JPEGPointTransforms', # JPEGPointTransforms (518/0x0206) + 22 => 'EXIF:JPEGProc', # JPEGProc (512/0x0200) + 23 => 'EXIF:JPEGRestartInterval', # JPEGRestartInterval (515/0x0203) + 24 => 'EXIF:JPEGQTables', # JPEGQTables (519/0x0207) + 25 => 'EXIF:NumberofInks', # NumberOfInks (334/0x014e) + 26 => 'EXIF:ReferenceBlackWhite', # ReferenceBlackWhite (532/0x0214) + 27 => 'EXIF:SampleFormat', # SampleFormat (339/0x0153) + 28 => 'EXIF:SMinSampleValue', # SMinSampleValue (340/0x0154) + 29 => 'EXIF:SMaxSampleValue', # SMaxSampleValue (341/0x0155) + 30 => 'EXIF:TargetPrinter', # TargetPrinter (337/0x0151) + 31 => 'EXIF:TileLength', # TileLength (323/0x0143) + 32 => 'EXIF:TileOffsets', # TileOffsets (324/0x0144) + 33 => 'EXIF:TileWidth', # TileWidth (322/0x0142) + 34 => 'EXIF:TileByteCounts', # TileByteCounts (325/0x0145) + 35 => 'EXIF:TransferRange', # TransferRange (342/0x0156) + 36 => 'EXIF:YCbCrCoefficients', # YCbCrCoefficients (529/0x0211) + 37 => 'EXIF:YCbCrPositioning', # YCbCrPositioning (531/0x0213) + 38 => 'EXIF:YCbCrSubSampling', # YCbCrSubSampling (530/0x0212) + # Other tags to check + 39 => 'EXIF:PhotometricInterpretation', # PhotometricInterpretation (262/0x0106) + 40 => 'EXIF:Compression', # Compression (259/0x0103) + }, + ValueConv => q{ + if ($val[0] ne 'TIFF') { + return undef; + } + unless ($$self{SaveFormat}) { + return ''; + } + foreach (qw(int8s undef int16s int32s rational64s float double)) { + return '6.0' if $$self{SaveFormat}{$_}; + } + if ( $val[39]=~/^(?:C(?:IELab|MYK)|YCbCr)$/ or $val[40] eq 'JPEG (old-style)' or has_defined(@val[10..38]) ) { + return '6.0'; + } + if ($val[39]=~/^(?:Transparency Mask|RGB Palette)$/ or $val[40] eq 'LZW' or has_defined(@val[1..9]) ) { + return '5.0'; + } + return '4.0'; + }, + }, + }, +); + +# A couple of shortcuts to test for the existence of certain tags +%Image::ExifTool::UserDefined::Shortcuts = ( + TiffVersion5Tags => [ + 'EXIF:Artist', 'EXIF:ColorMap', 'EXIF:ModifyDate', 'EXIF:HostComputer', 'EXIF:SubfileType', + 'EXIF:Predictor', 'EXIF:PrimaryChromaticities', 'EXIF:Software', 'EXIF:WhitePoint', + ], + TiffVersion6Tags => [ + 'EXIF:Copyright', 'EXIF:DotRange', 'EXIF:ExtraSamples', 'EXIF:HalftoneHints', + 'EXIF:InkNames', 'EXIF:InkSet', 'EXIF:JPEGACTables', 'EXIF:JPEGDCTables', + 'EXIF:ThumbnailOffset', 'EXIF:ThumbnailLength ', 'EXIF:JPEGLosslessPredictors', + 'EXIF:JPEGPointTransforms', 'EXIF:JPEGProc', 'EXIF:JPEGRestartInterval', + 'EXIF:JPEGQTables', 'EXIF:NumberofInks', 'EXIF:ReferenceBlackWhite', 'EXIF:SampleFormat', + 'EXIF:SMinSampleValue', 'EXIF:SMaxSampleValue', 'EXIF:TargetPrinter', 'EXIF:TileLength', + 'EXIF:TileOffsets', 'EXIF:TileWidth', 'EXIF:TileByteCounts', 'EXIF:TransferRange', + 'EXIF:YCbCrCoefficients', 'EXIF:YCbCrPositioning', 'EXIF:YCbCrSubSampling', + ], +); + +# Must set undocumented SaveFormat option to provide access to the tag format types +%Image::ExifTool::UserDefined::Options = ( + SaveFormat => 1, +); + +1; #end diff --git a/config_files/time_zone.config b/config_files/time_zone.config new file mode 100644 index 0000000..bfe61b8 --- /dev/null +++ b/config_files/time_zone.config @@ -0,0 +1,96 @@ +#------------------------------------------------------------------------------ +# File: time_zone.config +# +# Description: ExifTool config file to return time zone from an image +# +# Notes: The Composite:TimeZone tag defined here attempts to determine +# the time zone for an image. If possible, the camera time zone +# is used, if that does not exist, the time zone for +# DateTimeOriginal is returned, but if this can't be determined +# then the time zone for CreateDate and then ModifyDate are used. +# If this all does not result in a time zone, the timezone of the +# TimeCreated tag is used +# +# Usage: exiftool -config time_zone.config -timezone FILE +# +# Requires: ExifTool version 7.74 or later +# +# Revisions: 2016/10/03 - P. Harvey Created +# 2016/12/12 - H. Baan Corrected tag name, added support for +# camera time zone/daylight savings info in +# MakerNotes +# 2017/01/05 - H. Baan Handle case were GPSDateStamp is missing +# 2017/01/06 - H. Baan Use QuickTime:CreationDate if available +# 2017/03/12 - H. Baan Added QuickTime:TimeZone, reordered +# Desired tags according to precedence, added +# comments +#------------------------------------------------------------------------------ + +%Image::ExifTool::UserDefined = ( + 'Image::ExifTool::Composite' => { + # Calculate the TimeZone of the picture taken + TimeZone => { + Desire => { + # TimeZone information tags ordered by precedence + 0 => 'MakerNotes:TimeZone', + 1 => 'MakerNotes:DaylightSavings', + 2 => 'QuickTime:TimeZone', + 3 => 'OffsetTimeOriginal', + 4 => 'OffsetTimeDigitized', + 5 => 'OffsetTime', + 6 => 'TimeZoneOffset', + 7 => 'GPSDateStamp', + 8 => 'GPSTimeStamp', + 9 => 'DateTimeOriginal', + 10 => 'DateTimeDigitized', + 11 => 'CreateDate', + 12 => 'ModifyDate', + 13 => 'QuickTime:CreationDate', + 14 => 'TimeCreated', + }, + RawConv => q{ + # TimeZone from MakeNotes (camera setting) + return TimeZoneString($val[0] + ($val[1] ? 60 : 0)) if defined $val[0]; + + # TimeZone from QuickTime (camera setting) + return TimeZoneString($val[2]) if $val[2]; + + # TimeZone from offset fields + return $val[3] if $val[3]; # DateTimeOriginal + return $val[4] if $val[4]; # DateTimeDigitized + return $val[5] if $val[5]; # (ModifyDate) + if (defined $val[6]) { # (ModifyDate) + my $tzh = $val[6]; + $tzh =~ s/ .*//; + return TimeZoneString($tzh * 60); + } + + # Difference between GPS and local time as TimeZone + if (defined $val[8]) { + my $loc = $val[9] || $val[10] || $val[11] || $val[12]; + if ($loc) { + my @loc = split /[: ]/, $loc; + my @gmt = split /[: ]/, ($val[7]||"$loc[0]:$loc[1]:$loc[2]") . " $val[8]"; + my $tzm = 15 * sprintf("%.0f", (GetTimeZone([@loc[5,4,3,2]], [@gmt[5,4,3,2]])) / 15); + $tzm -= 1440 if $tzm > 840; + $tzm += 1440 if $tzm < -720; + return TimeZoneString($tzm); + } + } + + # TimeZone from QuickTime Creation Date + if ($val[13] && $val[13] =~ /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}([+-]\d{2})(\d{2})/) { + return TimeZoneString($1 * 60 + $2); + } + + # Time Created + if ($val[14] && $val[14] =~ /\d{6}([+-]\d{2})(\d{2})/) { + return TimeZoneString($1 * 60 + $2); + } + return undef; + }, + }, + }, +); + +1; #end diff --git a/exiftool b/exiftool new file mode 100755 index 0000000..6354ccb --- /dev/null +++ b/exiftool @@ -0,0 +1,7300 @@ +#!/usr/bin/perl -w +#------------------------------------------------------------------------------ +# File: exiftool +# +# Description: Read/write meta information +# +# Revisions: Nov. 12/03 - P. Harvey Created +# (See html/history.html for revision history) +#------------------------------------------------------------------------------ +use strict; +use warnings; +require 5.004; + +my $version = '12.44'; + +# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool' +BEGIN { + # (undocumented -xpath option added in 11.91, must come before other options) + my $exePath = @ARGV && lc($ARGV[0]) eq '-xpath' && shift() ? $^X : $0; + # get exe directory + my $exeDir = ($exePath =~ /(.*)[\\\/]/) ? $1 : '.'; + my $incDir = ($0 =~ /(.*)[\\\/]/) ? "$1/lib" : './lib'; + if (-l $0) { + my $lnk = eval { readlink $0 }; + if (defined $lnk) { + my $lnkDir = ($lnk =~ /(.*)[\\\/]/) ? $1 : '.'; + $exeDir = (($lnk =~ m(^/)) ? '' : $exeDir . '/') . $lnkDir; + $incDir = "$exeDir/lib"; + } + } + $Image::ExifTool::exeDir = $exeDir; # use our exeDir for loading config file + # add lib directory at start of include path + unshift @INC, $incDir; + # load or disable config file if specified + if (@ARGV and lc($ARGV[0]) eq '-config') { + shift; + $Image::ExifTool::configFile = shift; + } +} +use Image::ExifTool qw{:Public}; + +# function prototypes +sub SigInt(); +sub SigCont(); +sub Cleanup(); +sub GetImageInfo($$); +sub SetImageInfo($$$); +sub DoHardLink($$$$$); +sub CleanXML($); +sub EncodeXML($); +sub FormatXML($$$); +sub EscapeJSON($;$); +sub FormatJSON($$$); +sub PrintCSV(); +sub AddGroups($$$$); +sub ConvertBinary($); +sub IsEqual($$); +sub Infile($;$); +sub AddSetTagsFile($;$); +sub DoSetFromFile($$$); +sub CleanFilename($); +sub SetWindowTitle($); +sub ProcessFiles($;$); +sub ScanDir($$;$); +sub FindFileWindows($$); +sub FileNotFound($); +sub PreserveTime(); +sub AbsPath($); +sub MyConvertFileName($$); +sub SuggestedExtension($$$); +sub LoadPrintFormat($); +sub FilenameSPrintf($;$@); +sub NextUnusedFilename($;$); +sub CreateDirectory($); +sub OpenOutputFile($;@); +sub AcceptFile($); +sub SlurpFile($$); +sub FilterArgfileLine($); +sub ReadStayOpen($); +sub PrintTagList($@); +sub PrintErrors($$$); + +$SIG{INT} = 'SigInt'; # do cleanup on Ctrl-C +$SIG{CONT} = 'SigCont'; # (allows break-out of delays) +END { + Cleanup(); +} + +# declare all static file-scope variables +my @commonArgs; # arguments common to all commands +my @condition; # conditional processing of files +my @csvFiles; # list of files when reading with CSV option (in ExifTool Charset) +my @csvTags; # order of tags for first file with CSV option (lower case) +my @delFiles; # list of files to delete +my @dynamicFiles; # list of -tagsFromFile files with dynamic names and -TAG<=FMT pairs +my @efile; # files for writing list of error/fail/same file names +my @exclude; # list of excluded tags +my (@echo3, @echo4);# stdout and stderr echo after processing is complete +my @files; # list of files and directories to scan +my @moreArgs; # more arguments to process after -stay_open -@ +my @newValues; # list of new tag values to set +my @requestTags; # tags to request (for -p or -if option arguments) +my @srcFmt; # source file name format strings +my @tags; # list of tags to extract +my %appended; # list of files appended to +my %countLink; # count hard and symbolic links made +my %created; # list of files we created +my %csvTags; # lookup for all found tags with CSV option (lower case keys) +my %database; # lookup for database information based on file name (in ExifTool Charset) +my %filterExt; # lookup for filtered extensions +my %ignore; # directory names to ignore +my $ignoreHidden; # flag to ignore hidden files +my %outComma; # flag that output text file needs a comma +my %outTrailer; # trailer for output text file +my %preserveTime; # preserved timestamps for files +my %printFmt; # the contents of the print format file +my %setTags; # hash of list references for tags to set from files +my %setTagsList; # list of other tag lists for multiple -tagsFromFile from the same file +my %usedFileName; # lookup for file names we already used in TestName feature +my %utf8FileName; # lookup for file names that are UTF-8 encoded +my %warnedOnce; # lookup for once-only warnings +my %wext; # -W extensions to write +my $allGroup; # show group name for all tags +my $altEnc; # alternate character encoding if not UTF-8 +my $argFormat; # use exiftool argument-format output +my $binaryOutput; # flag for binary output (undef or 1, or 0 for binary XML/PHP) +my $binaryStdout; # flag set if we output binary to stdout +my $binSep; # separator used for list items in binary output +my $binTerm; # terminator used for binary output +my $comma; # flag set if we need a comma in JSON output +my $count; # count of files scanned when reading or deleting originals +my $countBad; # count of files with errors +my $countBadCr; # count files not created due to errors +my $countBadWr; # count write errors +my $countCopyWr; # count of files copied without being changed +my $countDir; # count of directories scanned +my $countFailed; # count files that failed condition +my $countGoodCr; # count files created OK +my $countGoodWr; # count files written OK +my $countNewDir; # count of directories created +my $countSameWr; # count files written OK but not changed +my $critical; # flag for critical operations (disable CTRL-C) +my $csv; # flag for CSV option (set to "CSV", or maybe "JSON" when writing) +my $csvAdd; # flag to add CSV information to existing lists +my $csvDelim; # delimiter for CSV files +my $csvSaveCount; # save counter for last CSV file loaded +my $deleteOrig; # 0=restore original files, 1=delete originals, 2=delete w/o asking +my $disableOutput; # flag to disable normal output +my $doSetFileName; # flag set if FileName may be written +my $doUnzip; # flag to extract info from .gz and .bz2 files +my ($end,$endDir,%endDir); # flags to end processing +my $escapeC; # C-style escape +my $escapeHTML; # flag to escape printed values for html +my $evalWarning; # warning from eval +my $executeID; # -execute ID number +my $failCondition; # flag to fail -if condition +my $fastCondition; # flag for fast -if condition +my $fileHeader; # header to print to output file (or console, once) +my $fileTrailer; # trailer for output file +my $filtered; # flag indicating file was filtered by name +my $filterFlag; # file filter flag (0x01=deny extensions, 0x02=allow extensions, 0x04=add ext) +my $fixLen; # flag to fix description lengths when writing alternate languages +my $forcePrint; # string to use for missing tag values (undef to not print them) +my $helped; # flag to avoid printing help if no tags specified +my $html; # flag for html-formatted output (2=html dump) +my $interrupted; # flag set if CTRL-C is pressed during a critical process +my $isBinary; # true if value is a SCALAR ref +my $isWriting; # flag set if we are writing tags +my $joinLists; # flag set to join list values into a single string +my $json; # flag for JSON/PHP output format (1=JSON, 2=PHP) +my $langOpt; # language option +my $listDir; # treat a directory as a regular file +my $listItem; # item number for extracting single item from a list +my $listSep; # list item separator (', ' by default) +my $mt; # main ExifTool object +my $multiFile; # non-zero if we are scanning multiple files +my $noBinary; # flag set to ignore binary tags +my $outFormat; # -1=Canon format, 0=same-line, 1=tag names, 2=values only +my $outOpt; # output file or directory name +my $overwriteOrig; # flag to overwrite original file (1=overwrite, 2=in place) +my $pause; # pause before returning +my $preserveTime; # flag to preserve times of updated files (2=preserve FileCreateDate only) +my $progress; # flag to calculate total files to process (0=calculate but don't display) +my $progressCount; # count of files processed +my $progressMax; # total number of files to process +my $progStr; # progress message string +my $quiet; # flag to disable printing of informational messages / warnings +my $rafStdin; # File::RandomAccess for stdin (if necessary to rewind) +my $recurse; # recurse into subdirectories (2=also hidden directories) +my $rtnVal; # command return value (0=success) +my $rtnValPrev; # previous command return value (0=success) +my $saveCount; # count the number of times we will/did call SaveNewValues() +my $scanWritable; # flag to process only writable file types +my $sectHeader; # current section header for -p option +my $sectTrailer; # section trailer for -p option +my $seqFileBase; # sequential file number at start of directory +my $seqFileNum; # sequential file number used for %C +my $setCharset; # character set setting ('default' if not set and -csv -b used) +my $showGroup; # number of group to show (may be zero or '') +my $showTagID; # non-zero to show tag ID's +my $stayOpenBuff='';# buffer for -stay_open file +my $stayOpenFile; # name of the current -stay_open argfile +my $structOpt; # output structured XMP information (JSON and XML output only) +my $tabFormat; # non-zero for tab output format +my $tagOut; # flag for separate text output file for each tag +my $textOut; # extension for text output file (or undef for no output) +my $textOverwrite; # flag to overwrite existing text output file (2=append, 3=over+append) +my $tmpFile; # temporary file to delete on exit +my $tmpText; # temporary text file +my $validFile; # flag indicating we processed a valid file +my $verbose; # verbose setting +my $vout; # verbose output file reference (\*STDOUT or \*STDERR) +my $windowTitle; # title for console window +my $xml; # flag for XML-formatted output + +# flag to keep the input -@ argfile open: +# 0 = normal behaviour +# 1 = received "-stay_open true" and waiting for argfile to keep open +# 2 = currently reading from STAYOPEN argfile +# 3 = waiting for -@ to switch to a new STAYOPEN argfile +my $stayOpen = 0; + +my $rtnValApp = 0; # app return value (0=success) +my $curTitle = ''; # current window title + +# lookup for O/S names which may use a backslash as a directory separator +# (ref File::Spec of PathTools-3.2701) +my %hasBackslash = ( MSWin32 => 1, os2 => 1, dos => 1, NetWare => 1, symbian => 1, cygwin => 1 ); + +# lookup for O/S names which use CR/LF newlines +my $isCRLF = { MSWin32 => 1, os2 => 1, dos => 1 }->{$^O}; + +# lookup for JSON characters that we escape specially +my %jsonChar = ( '"'=>'"', '\\'=>'\\', "\t"=>'t', "\n"=>'n', "\r"=>'r' ); + +# lookup for C-style escape sequences +my %escC = ( "\n" => '\n', "\r" => '\r', "\t" => '\t', '\\' => '\\\\'); +my %unescC = ( a => "\a", b => "\b", f => "\f", n => "\n", r => "\r", + t => "\t", 0 => "\0", '\\' => '\\' ); + +# options requiring additional arguments +# (used only to skip over these arguments when reading -stay_open ARGFILE) +# (arg is converted to lower case then tested again unless an entry was found with the same case) +my %optArgs = ( + '-tagsfromfile' => 1, '-addtagsfromfile' => 1, '-alltagsfromfile' => 1, + '-@' => 1, + '-api' => 1, + '-c' => 1, '-coordformat' => 1, + '-charset' => 0, # (optional arg; OK because arg cannot begin with "-") + '-config' => 1, + '-csvdelim' => 1, + '-d' => 1, '-dateformat' => 1, + '-D' => 0, # necessary to avoid matching lower-case equivalent + '-echo' => 1, '-echo1' => 1, '-echo2' => 1, '-echo3' => 1, '-echo4' => 1, + '-efile' => 1, '-efile1' => 1, '-efile2' => 1, '-efile3' => 1, '-efile4' => 1, + '-efile!' => 1, '-efile1!' => 1, '-efile2!' => 1, '-efile3!' => 1, '-efile4!' => 1, + '-ext' => 1, '--ext' => 1, '-ext+' => 1, '--ext+' => 1, + '-extension' => 1, '--extension' => 1, '-extension+' => 1, '--extension+' => 1, + '-fileorder' => 1, '-fileorder0' => 1, '-fileorder1' => 1, '-fileorder2' => 1, + '-fileorder3' => 1, '-fileorder4' => 1, '-fileorder5' => 1, + '-geotag' => 1, + '-globaltimeshift' => 1, + '-i' => 1, '-ignore' => 1, + '-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1, '-if5' => 1, + '-lang' => 0, # (optional arg; cannot begin with "-") + '-listitem' => 1, + '-o' => 1, '-out' => 1, + '-p' => 1, '-printformat' => 1, + '-P' => 0, + '-password' => 1, + '-require' => 1, + '-sep' => 1, '-separator' => 1, + '-srcfile' => 1, + '-stay_open' => 1, + '-use' => 1, + '-userparam' => 1, + '-w' => 1, '-w!' => 1, '-w+' => 1, '-w+!' => 1, '-w!+' => 1, + '-textout' => 1, '-textout!' => 1, '-textout+' => 1, '-textout+!' => 1, '-textout!+' => 1, + '-tagout' => 1, '-tagout!' => 1, '-tagout+' => 1, '-tagout+!' => 1, '-tagout!+' => 1, + '-wext' => 1, + '-wm' => 1, '-writemode' => 1, + '-x' => 1, '-exclude' => 1, + '-X' => 0, +); + +# recommended packages and alternatives +my @recommends = qw( + Archive::Zip + Compress::Zlib + Digest::MD5 + Digest::SHA + IO::Compress::Bzip2 + POSIX::strptime + Time::Local + Unicode::LineBreak + IO::Compress::RawDeflate + IO::Uncompress::RawInflate + Win32::API + Win32::FindFile + Win32API::File +); +my %altRecommends = ( + 'POSIX::strptime' => 'Time::Piece', # (can use Time::Piece instead of POSIX::strptime) +); + +my %unescapeChar = ( 't'=>"\t", 'n'=>"\n", 'r'=>"\r" ); + +# special subroutines used in -if condition +sub Image::ExifTool::EndDir() { return $endDir = 1 } +sub Image::ExifTool::End() { return $end = 1 } + +# exit routine +sub Exit { + if ($pause) { + if (eval { require Term::ReadKey }) { + print STDERR "-- press any key --"; + Term::ReadKey::ReadMode('cbreak'); + Term::ReadKey::ReadKey(0); + Term::ReadKey::ReadMode(0); + print STDERR "\b \b" x 20; + } else { + print STDERR "-- press RETURN --\n"; + ; + } + } + exit shift; +} +# my warning and error routines (NEVER say "die"!) +sub Warn { + if ($quiet < 2 or $_[0] =~ /^Error/) { + my $oldWarn = $SIG{'__WARN__'}; + delete $SIG{'__WARN__'}; + warn(@_); + $SIG{'__WARN__'} = $oldWarn if defined $oldWarn; + } +} +sub Error { Warn @_; $rtnVal = 1; } +sub WarnOnce($) { + Warn(@_) and $warnedOnce{$_[0]} = 1 unless $warnedOnce{$_[0]}; +} + +# define signal handlers and cleanup routine +sub SigInt() { + $critical and $interrupted = 1, return; + Cleanup(); + exit 1; +} +sub SigCont() { } +sub Cleanup() { + $mt->Unlink($tmpFile) if defined $tmpFile; + $mt->Unlink($tmpText) if defined $tmpText; + undef $tmpFile; + undef $tmpText; + PreserveTime() if %preserveTime; + SetWindowTitle(''); +} + +#------------------------------------------------------------------------------ +# main script +# + +# isolate arguments common to all commands +if (grep /^-common_args$/i, @ARGV) { + my (@newArgs, $common); + foreach (@ARGV) { + if (/^-common_args$/i) { + $common = 1; + } elsif ($common) { + push @commonArgs, $_; + } else { + push @newArgs, $_; + } + } + @ARGV = @newArgs if $common; +} + +#.............................................................................. +# loop over sets of command-line arguments separated by "-execute" +Command: for (;;) { + +if (@echo3) { + my $str = join("\n", @echo3) . "\n"; + $str =~ s/\$\{status\}/$rtnVal/ig; + print STDOUT $str; +} +if (@echo4) { + my $str = join("\n", @echo4) . "\n"; + $str =~ s/\$\{status\}/$rtnVal/ig; + print STDERR $str; +} + +$rafStdin->Close() if $rafStdin; +undef $rafStdin; + +# save our previous return codes +$rtnValPrev = $rtnVal; +$rtnValApp = $rtnVal if $rtnVal; + +# exit Command loop now if we are all done processing commands +last unless @ARGV or not defined $rtnVal or $stayOpen >= 2 or @commonArgs; + +# attempt to restore text mode for STDOUT if necessary +if ($binaryStdout) { + binmode(STDOUT,':crlf') if $] >= 5.006 and $isCRLF; + $binaryStdout = 0; +} + +# flush console and print "{ready}" message if -stay_open is in effect +if ($stayOpen >= 2) { + if ($quiet and not defined $executeID) { + # flush output if possible + eval { require IO::Handle } and STDERR->flush(), STDOUT->flush(); + } else { + eval { require IO::Handle } and STDERR->flush(); + my $id = defined $executeID ? $executeID : ''; + my $save = $|; + $| = 1; # turn on output autoflush for stdout + print "{ready$id}\n"; + $| = $save; # restore original autoflush setting + } +} + +# initialize necessary static file-scope variables +# (not done: @commonArgs, @moreArgs, $critical, $binaryStdout, $helped, +# $interrupted, $mt, $pause, $rtnValApp, $rtnValPrev, $stayOpen, $stayOpenBuff, $stayOpenFile) +undef @condition; +undef @csvFiles; +undef @csvTags; +undef @delFiles; +undef @dynamicFiles; +undef @echo3; +undef @echo4; +undef @efile; +undef @exclude; +undef @files; +undef @newValues; +undef @srcFmt; +undef @tags; +undef %appended; +undef %countLink; +undef %created; +undef %csvTags; +undef %database; +undef %endDir; +undef %filterExt; +undef %ignore; +undef %outComma; +undef %outTrailer; +undef %printFmt; +undef %preserveTime; +undef %setTags; +undef %setTagsList; +undef %usedFileName; +undef %utf8FileName; +undef %warnedOnce; +undef %wext; +undef $allGroup; +undef $altEnc; +undef $argFormat; +undef $binaryOutput; +undef $binSep; +undef $binTerm; +undef $comma; +undef $csv; +undef $csvAdd; +undef $deleteOrig; +undef $disableOutput; +undef $doSetFileName; +undef $doUnzip; +undef $end; +undef $endDir; +undef $escapeHTML; +undef $escapeC; +undef $evalWarning; +undef $executeID; +undef $failCondition; +undef $fastCondition; +undef $fileHeader; +undef $filtered; +undef $fixLen; +undef $forcePrint; +undef $ignoreHidden; +undef $joinLists; +undef $langOpt; +undef $listItem; +undef $multiFile; +undef $noBinary; +undef $outOpt; +undef $preserveTime; +undef $progress; +undef $progressCount; +undef $progressMax; +undef $recurse; +undef $scanWritable; +undef $sectHeader; +undef $setCharset; +undef $showGroup; +undef $showTagID; +undef $structOpt; +undef $tagOut; +undef $textOut; +undef $textOverwrite; +undef $tmpFile; +undef $tmpText; +undef $validFile; +undef $verbose; +undef $windowTitle; + +$count = 0; +$countBad = 0; +$countBadCr = 0; +$countBadWr = 0; +$countCopyWr = 0; +$countDir = 0; +$countFailed = 0; +$countGoodCr = 0; +$countGoodWr = 0; +$countNewDir = 0; +$countSameWr = 0; +$csvDelim = ','; +$csvSaveCount = 0; +$fileTrailer = ''; +$filterFlag = 0; +$html = 0; +$isWriting = 0; +$json = 0; +$listSep = ', '; +$outFormat = 0; +$overwriteOrig = 0; +$progStr = ''; +$quiet = 0; +$rtnVal = 0; +$saveCount = 0; +$sectTrailer = ''; +$seqFileBase = 0; +$seqFileNum = 0; +$tabFormat = 0; +$vout = \*STDOUT; +$xml = 0; + +# define local variables used only in this command loop +my @fileOrder; # tags to use for ordering of input files +my $fileOrderFast; # -fast level for -fileOrder option +my $addGeotime; # automatically added geotime argument +my $doGlob; # flag set to do filename wildcard expansion +my $endOfOpts; # flag set if "--" option encountered +my $escapeXML; # flag to escape printed values for xml +my $setTagsFile; # filename for last TagsFromFile option +my $sortOpt; # sort option is used +my $srcStdin; # one of the source files is STDIN +my $useMWG; # flag set if we are using any MWG tag + +my ($argsLeft, @nextPass, $badCmd); +my $pass = 0; + +# for Windows, use globbing for wildcard expansion if available - MK/20061010 +if ($^O eq 'MSWin32' and eval { require File::Glob }) { + # override the core glob forcing case insensitivity + import File::Glob qw(:globally :nocase); + $doGlob = 1; +} + +$mt = new Image::ExifTool; # create ExifTool object + +# don't extract duplicates by default unless set by UserDefined::Options +$mt->Options(Duplicates => 0) unless %Image::ExifTool::UserDefined::Options + and defined $Image::ExifTool::UserDefined::Options{Duplicates}; + +# default is to join lists if the List option was set to zero in the config file +$joinLists = 1 if defined $mt->Options('List') and not $mt->Options('List'); + +# preserve FileCreateDate if possible +if (not $preserveTime and $^O eq 'MSWin32') { + $preserveTime = 2 if eval { require Win32::API } and eval { require Win32API::File }; +} + +# parse command-line options in 2 passes... +# pass 1: set all of our ExifTool options +# pass 2: print all of our help and informational output (-list, -ver, etc) +for (;;) { + + # execute the command now if no more arguments or -execute is used + if (not @ARGV or ($ARGV[0] =~ /^(-|\xe2\x88\x92)execute(\d+)?$/i and not $endOfOpts)) { + if (@ARGV) { + $executeID = $2; # save -execute number for "{ready}" response + $helped = 1; # don't show help if we used -execute + $badCmd and shift, $rtnVal=1, next Command; + } elsif ($stayOpen >= 2) { + ReadStayOpen(\@ARGV); # read more arguments from -stay_open file + next; + } elsif ($badCmd) { + undef @commonArgs; # all done. Flush common arguments + $rtnVal = 1; + next Command; + } + if ($pass == 0) { + # insert common arguments now if not done already + if (@commonArgs and not defined $argsLeft) { + # count the number of arguments remaining for subsequent commands + $argsLeft = scalar(@ARGV) + scalar(@moreArgs); + unshift @ARGV, @commonArgs; + # all done with commonArgs if this is the end of the command + undef @commonArgs unless $argsLeft; + next; + } + # check if we have more arguments now than we did before we processed + # the common arguments. If so, then we have an infinite processing loop + if (defined $argsLeft and $argsLeft < scalar(@ARGV) + scalar(@moreArgs)) { + Warn "Ignoring -common_args from $ARGV[0] onwards to avoid infinite recursion\n"; + while ($argsLeft < scalar(@ARGV) + scalar(@moreArgs)) { + @ARGV and shift(@ARGV), next; + shift @moreArgs; + } + } + # require MWG module if used in any argument + # (note: doesn't cover the -p option because these tags will be parsed on the 2nd pass) + $useMWG = 1 if not $useMWG and grep /^mwg:/i, @tags, @requestTags; + if ($useMWG) { + require Image::ExifTool::MWG; + Image::ExifTool::MWG::Load(); + } + # update necessary variables for 2nd pass + if (defined $forcePrint) { + unless (defined $mt->Options('MissingTagValue')) { + $mt->Options(MissingTagValue => '-'); + } + $forcePrint = $mt->Options('MissingTagValue'); + } + } + if (@nextPass) { + # process arguments which were deferred to the next pass + unshift @ARGV, @nextPass; + undef @nextPass; + undef $endOfOpts; + ++$pass; + next; + } + @ARGV and shift; # remove -execute from argument list + last; # process the command now + } + $_ = shift; + next if $badCmd; # flush remaining arguments if aborting this command + + # allow funny dashes (nroff dash bug for cut-n-paste from pod) + if (not $endOfOpts and s/^(-|\xe2\x88\x92)//) { + s/^\xe2\x88\x92/-/; # translate double-dash too + if ($_ eq '-') { + $pass or push @nextPass, '--'; + $endOfOpts = 1; + next; + } + my $a = lc $_; + if (/^list([wfrdx]|wf|g(\d*))?$/i) { + $pass or push @nextPass, "-$_"; + my $type = lc($1 || ''); + if (not $type or $type eq 'w' or $type eq 'x') { + my $group; + if ($ARGV[0] and $ARGV[0] =~ /^(-|\xe2\x88\x92)(.+):(all|\*)$/i) { + if ($pass == 0) { + $useMWG = 1 if lc($2) eq 'mwg'; + push @nextPass, shift; + next; + } + $group = $2; + shift; + $group =~ /IFD/i and Warn("Can't list tags for specific IFD\n"), $helped=1, next; + $group =~ /^(all|\*)$/ and undef $group; + } else { + $pass or next; + } + $helped = 1; + if ($type eq 'x') { + require Image::ExifTool::TagInfoXML; + my %opts; + $opts{Flags} = 1 if defined $forcePrint; + $opts{NoDesc} = 1 if $outFormat > 0; + $opts{Lang} = $langOpt; + Image::ExifTool::TagInfoXML::Write(undef, $group, %opts); + next; + } + my $wr = ($type eq 'w'); + my $msg = ($wr ? 'Writable' : 'Available') . ($group ? " $group" : '') . ' tags'; + PrintTagList($msg, $wr ? GetWritableTags($group) : GetAllTags($group)); + # also print shortcuts if listing all tags + next if $group or $wr; + my @tagList = GetShortcuts(); + PrintTagList('Command-line shortcuts', @tagList) if @tagList; + next; + } + $pass or next; + $helped = 1; + if ($type eq 'wf') { + my @wf; + CanWrite($_) and push @wf, $_ foreach GetFileType(); + PrintTagList('Writable file extensions', @wf); + } elsif ($type eq 'f') { + PrintTagList('Supported file extensions', GetFileType()); + } elsif ($type eq 'r') { + PrintTagList('Recognized file extensions', GetFileType(undef, 0)); + } elsif ($type eq 'd') { + PrintTagList('Deletable groups', GetDeleteGroups()); + } else { # 'g(\d*)' + # list all groups in specified family + my $family = $2 || 0; + PrintTagList("Groups in family $family", $mt->GetAllGroups($family)); + } + next; + } + if ($a eq 'ver') { + $pass or push(@nextPass,'-ver'), next; + my $libVer = $Image::ExifTool::VERSION; + my $str = $libVer eq $version ? '' : " [Warning: Library version is $libVer]"; + if ($verbose) { + print "ExifTool version $version$str$Image::ExifTool::RELEASE\n"; + printf "Perl version %s%s\n", $], (defined ${^UNICODE} ? " (-C${^UNICODE})" : ''); + print "Platform: $^O\n"; + print "Optional libraries:\n"; + foreach (@recommends) { + next if /^Win32/ and $^O ne 'MSWin32'; + my $ver = eval "require $_ and \$${_}::VERSION"; + my $alt = $altRecommends{$_}; + # check for alternative if primary not available + $ver = eval "require $alt and \$${alt}::VERSION" and $_ = $alt if not $ver and $alt; + printf " %-28s %s\n", $_, $ver || '(not installed)'; + } + if ($verbose > 1) { + print "Include directories:\n"; + print " $_\n" foreach @INC; + } + } else { + print "$version$str$Image::ExifTool::RELEASE\n"; + } + $helped = 1; + next; + } + if (/^(all|add)?tagsfromfile(=.*)?$/i) { + $setTagsFile = $2 ? substr($2,1) : (@ARGV ? shift : ''); + if ($setTagsFile eq '') { + Error("File must be specified for -tagsFromFile option\n"); + $badCmd = 1; + next; + } + # create necessary lists, etc for this new -tagsFromFile file + AddSetTagsFile($setTagsFile, { Replace => ($1 and lc($1) eq 'add') ? 0 : 1 } ); + next; + } + if ($a eq '@') { + my $argFile = shift or Error("Expecting filename for -\@ option\n"), $badCmd=1, next; + # switch to new ARGFILE if using chained -stay_open options + if ($stayOpen == 1) { + # defer remaining arguments until we close this argfile + @moreArgs = @ARGV; + undef @ARGV; + } elsif ($stayOpen == 3) { + if ($stayOpenFile and $stayOpenFile ne '-' and $argFile eq $stayOpenFile) { + # don't allow user to switch to the same -stay_open argfile + # because it will result in endless recursion + $stayOpen = 2; + Warn "Ignoring request to switch to the same -stay_open ARGFILE ($argFile)\n"; + next; + } + close STAYOPEN; + $stayOpen = 1; # switch to this -stay_open file + } + my $fp = ($stayOpen == 1 ? \*STAYOPEN : \*ARGFILE); + unless ($mt->Open($fp, $argFile)) { + unless ($argFile !~ /^\// and $mt->Open($fp, "$Image::ExifTool::exeDir/$argFile")) { + Error "Error opening arg file $argFile\n"; + $badCmd = 1; + next + } + } + if ($stayOpen == 1) { + $stayOpenFile = $argFile; # remember the name of the file we have open + $stayOpenBuff = ''; # initialize buffer for reading this file + $stayOpen = 2; + $helped = 1; + ReadStayOpen(\@ARGV); + next; + } + my (@newArgs, $didBOM); + foreach () { + # filter Byte Order Mark if it exists from start of UTF-8 text file + unless ($didBOM) { + s/^\xef\xbb\xbf//; + $didBOM = 1; + } + $_ = FilterArgfileLine($_); + push @newArgs, $_ if defined $_; + } + close ARGFILE; + unshift @ARGV, @newArgs; + next; + } + /^(-?)(a|duplicates)$/i and $mt->Options(Duplicates => ($1 ? 0 : 1)), next; + if ($a eq 'api') { + my $opt = shift; + defined $opt or Error("Expected OPT[=VAL] argument for -api option\n"), $badCmd=1, next; + my $val = ($opt =~ s/=(.*)//s) ? $1 : 1; + # empty string means an undefined value unless ^= is used + $val = undef unless $opt =~ s/\^$// or length $val; + $mt->Options($opt => $val); + next; + } + /^arg(s|format)$/i and $argFormat = 1, next; + if (/^(-?)b(inary)?$/i) { + ($binaryOutput, $noBinary) = $1 ? (undef, 1) : (1, undef); + $mt->Options(Binary => $binaryOutput, NoPDFList => $binaryOutput); + next; + } + if (/^c(oordFormat)?$/i) { + my $fmt = shift; + $fmt or Error("Expecting coordinate format for -c option\n"), $badCmd=1, next; + $mt->Options('CoordFormat', $fmt); + next; + } + if ($a eq 'charset') { + my $charset = (@ARGV and $ARGV[0] !~ /^(-|\xe2\x88\x92)/) ? shift : undef; + if (not $charset) { + $pass or push(@nextPass, '-charset'), next; + my %charsets; + $charsets{$_} = 1 foreach values %Image::ExifTool::charsetName; + PrintTagList('Available character sets', sort keys %charsets); + $helped = 1; + } elsif ($charset !~ s/^(\w+)=// or lc($1) eq 'exiftool') { + { + local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] }; + undef $evalWarning; + $mt->Options(Charset => $charset); + } + if ($evalWarning) { + warn $evalWarning; + } else { + $setCharset = $mt->Options('Charset'); + } + } else { + # set internal encoding of specified metadata type + my $type = { id3 => 'ID3', iptc => 'IPTC', exif => 'EXIF', filename => 'FileName', + photoshop => 'Photoshop', quicktime => 'QuickTime', riff=>'RIFF' }->{lc $1}; + $type or Warn("Unknown type for -charset option: $1\n"), next; + $mt->Options("Charset$type" => $charset); + } + next; + } + /^config$/i and Warn("Ignored -config option (not first on command line)\n"), shift, next; + if (/^csv(\+?=.*)?$/i) { + my $csvFile = $1; + # must process on 2nd pass so -f and -charset options are available + unless ($pass) { + push @nextPass, "-$_"; + if ($csvFile) { + push @newValues, { SaveCount => ++$saveCount }; # marker to save new values now + $csvSaveCount = $saveCount; + } + next; + } + if ($csvFile) { + $csvFile =~ s/^(\+?=)//; + $csvAdd = 2 if $1 eq '+='; + $vout = \*STDERR if $srcStdin; + $verbose and print $vout "Reading CSV file $csvFile\n"; + my $msg; + if ($mt->Open(\*CSVFILE, $csvFile)) { + binmode CSVFILE; + require Image::ExifTool::Import; + $msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint, $csvDelim); + close(CSVFILE); + } else { + $msg = "Error opening CSV file '${csvFile}'"; + } + $msg and Warn("$msg\n"); + $isWriting = 1; + } + $csv = 'CSV'; + next; + } + if (/^csvdelim$/i) { + $csvDelim = shift; + defined $csvDelim or Error("Expecting argument for -csvDelim option\n"), $badCmd=1, next; + $csvDelim =~ /"/ and Error("CSV delimiter can not contain a double quote\n"), $badCmd=1, next; + my %unescape = ( 't'=>"\t", 'n'=>"\n", 'r'=>"\r", '\\' => '\\' ); + $csvDelim =~ s/\\(.)/$unescape{$1}||"\\$1"/sge; + $mt->Options(CSVDelim => $csvDelim); + next; + } + if (/^d$/ or $a eq 'dateformat') { + my $fmt = shift; + $fmt or Error("Expecting date format for -d option\n"), $badCmd=1, next; + $mt->Options('DateFormat', $fmt); + next; + } + (/^D$/ or $a eq 'decimal') and $showTagID = 'D', next; + /^delete_original(!?)$/i and $deleteOrig = ($1 ? 2 : 1), next; + /^list_dir$/i and $listDir = 1, next; + (/^e$/ or $a eq '-composite') and $mt->Options(Composite => 0), next; + (/^-e$/ or $a eq 'composite') and $mt->Options(Composite => 1), next; + (/^E$/ or $a eq 'escapehtml') and require Image::ExifTool::HTML and $escapeHTML = 1, next; + ($a eq 'ec' or $a eq 'escapec') and $escapeC = 1, next; + ($a eq 'ex' or $a eq 'escapexml') and $escapeXML = 1, next; + if (/^echo(\d)?$/i) { + my $n = $1 || 1; + my $arg = shift; + next unless defined $arg; + $n > 4 and Warn("Invalid -echo number\n"), next; + if ($n > 2) { + $n == 3 ? push(@echo3, $arg) : push(@echo4, $arg); + } else { + print {$n==2 ? \*STDERR : \*STDOUT} $arg, "\n"; + } + $helped = 1; + next; + } + if (/^(ee|extractembedded)(\d*)$/i) { + $mt->Options(ExtractEmbedded => $2 || 1); + $mt->Options(Duplicates => 1); + next; + } + if (/^efile(\d)?(!)?$/i) { + my $arg = shift; + defined $arg or Error("Expecting file name for -$_ option\n"), $badCmd=1, next; + $efile[0] = $arg if not $1 or $1 & 0x01; + $efile[1] = $arg if $1 and $1 & 0x02; + $efile[2] = $arg if $1 and $1 & 0x04; + unlink $arg if $2; + next; + } + # (-execute handled at top of loop) + if (/^-?ext(ension)?(\+)?$/i) { + my $ext = shift; + defined $ext or Error("Expecting extension for -ext option\n"), $badCmd=1, next; + my $flag = /^-/ ? 0 : ($2 ? 2 : 1); + $filterFlag |= (0x01 << $flag); + $ext =~ s/^\.//; # remove leading '.' if it exists + $filterExt{uc($ext)} = $flag ? 1 : 0; + next; + } + if (/^f$/ or $a eq 'forceprint') { + $forcePrint = 1; + next; + } + if (/^F([-+]?\d*)$/ or /^fixbase([-+]?\d*)$/i) { + $mt->Options(FixBase => $1); + next; + } + if (/^fast(\d*)$/i) { + $mt->Options(FastScan => (length $1 ? $1 : 1)); + next; + } + if (/^fileorder(\d*)$/i) { + push @fileOrder, shift if @ARGV; + my $num = $1 || 0; + $fileOrderFast = $num if not defined $fileOrderFast or $fileOrderFast > $num; + next; + } + $a eq 'globaltimeshift' and $mt->Options(GlobalTimeShift => shift), next; + if (/^(g)(roupHeadings|roupNames)?([\d:]*)$/i) { + $showGroup = $3 || 0; + $allGroup = ($2 ? lc($2) eq 'roupnames' : $1 eq 'G'); + $mt->Options(SavePath => 1) if $showGroup =~ /\b5\b/; + $mt->Options(SaveFormat => 1) if $showGroup =~ /\b6\b/; + next; + } + if ($a eq 'geotag') { + my $trkfile = shift; + unless ($pass) { + # defer to next pass so the filename charset is available + push @nextPass, '-geotag', $trkfile; + next; + } + $trkfile or Error("Expecting file name for -geotag option\n"), $badCmd=1, next; + # allow wildcards in filename + if ($trkfile =~ /[*?]/) { + # CORE::glob() splits on white space, so use File::Glob if possible + my @trks; + if ($^O eq 'MSWin32' and eval { require Win32::FindFile }) { + # ("-charset filename=UTF8" must be set for this to work with Unicode file names) + @trks = FindFileWindows($mt, $trkfile); + } elsif (eval { require File::Glob }) { + @trks = File::Glob::bsd_glob($trkfile); + } else { + @trks = glob($trkfile); + } + @trks or Error("No matching file found for -geotag option\n"), $badCmd=1, next; + push @newValues, 'geotag='.shift(@trks) while @trks > 1; + $trkfile = pop(@trks); + } + $_ = "geotag=$trkfile"; + # (fall through!) + } + if (/^h$/ or $a eq 'htmlformat') { + require Image::ExifTool::HTML; + $html = $escapeHTML = 1; + $json = $xml = 0; + next; + } + (/^H$/ or $a eq 'hex') and $showTagID = 'H', next; + if (/^htmldump([-+]?\d+)?$/i) { + $verbose = ($verbose || 0) + 1; + $html = 2; + $mt->Options(HtmlDumpBase => $1) if defined $1; + next; + } + if (/^i(gnore)?$/i) { + my $dir = shift; + defined $dir or Error("Expecting directory name for -i option\n"), $badCmd=1, next; + $ignore{$dir} = 1; + $dir eq 'HIDDEN' and $ignoreHidden = 1; + next; + } + if (/^if(\d*)$/i) { + my $cond = shift; + $fastCondition = $1 if length $1; + defined $cond or Error("Expecting expression for -if option\n"), $badCmd=1, next; + # prevent processing file unnecessarily for simple case of failed '$ok' or 'not $ok' + $cond =~ /^\s*(not\s*)\$ok\s*$/i and ($1 xor $rtnValPrev) and $failCondition=1; + # add to list of requested tags + push @requestTags, $cond =~ /\$\{?((?:[-\w]+:)*[-\w?*]+)/g; + push @condition, $cond; + next; + } + if (/^j(son)?(\+?=.*)?$/i) { + if ($2) { + # must process on 2nd pass because we need -f and -charset options + unless ($pass) { + push @nextPass, "-$_"; + push @newValues, { SaveCount => ++$saveCount }; # marker to save new values now + $csvSaveCount = $saveCount; + next; + } + my $jsonFile = $2; + $jsonFile =~ s/^(\+?=)//; + $csvAdd = 2 if $1 eq '+='; + $vout = \*STDERR if $srcStdin; + $verbose and print $vout "Reading JSON file $jsonFile\n"; + my $chset = $mt->Options('Charset'); + my $msg; + if ($mt->Open(\*JSONFILE, $jsonFile)) { + binmode JSONFILE; + require Image::ExifTool::Import; + $msg = Image::ExifTool::Import::ReadJSON(\*JSONFILE, \%database, $forcePrint, $chset); + close(JSONFILE); + } else { + $msg = "Error opening JSON file '${jsonFile}'"; + } + $msg and Warn("$msg\n"); + $isWriting = 1; + $csv = 'JSON'; + } else { + $json = 1; + $html = $xml = 0; + $mt->Options(Duplicates => 1); + require Image::ExifTool::XMP; # for FixUTF8() + } + next; + } + /^(k|pause)$/i and $pause = 1, next; + (/^l$/ or $a eq 'long') and --$outFormat, next; + (/^L$/ or $a eq 'latin') and $mt->Options(Charset => 'Latin'), next; + if ($a eq 'lang') { + $langOpt = (@ARGV and $ARGV[0] !~ /^(-|\xe2\x88\x92)/) ? shift : undef; + if ($langOpt) { + # make lower case and use underline as a separator (eg. 'en_ca') + $langOpt =~ tr/-A-Z/_a-z/; + $mt->Options(Lang => $langOpt); + next if $langOpt eq $mt->Options('Lang'); + } else { + $pass or push(@nextPass, '-lang'), next; + } + my $langs = "Available languages:\n"; + $langs .= " $_ - $Image::ExifTool::langName{$_}\n" foreach @Image::ExifTool::langs; + $langs =~ tr/_/-/; # display dashes instead of underlines in language codes + $langs = Image::ExifTool::HTML::EscapeHTML($langs) if $escapeHTML; + $langs = $mt->Decode($langs, 'UTF8'); + $langOpt and Error("Invalid or unsupported language '${langOpt}'.\n$langs"), $badCmd=1, next; + print $langs; + $helped = 1; + next; + } + if ($a eq 'listitem') { + my $li = shift; + defined $li and Image::ExifTool::IsInt($li) or Warn("Expecting integer for -listItem option\n"), next; + $mt->Options(ListItem => $li); + $listItem = $li; + next; + } + /^(m|ignoreminorerrors)$/i and $mt->Options(IgnoreMinorErrors => 1), next; + /^(n|-printconv)$/i and $mt->Options(PrintConv => 0), next; + /^(-n|printconv)$/i and $mt->Options(PrintConv => 1), next; + $a eq 'nop' and $helped=1, next; # (undocumented) no operation, added in 11.25 + if (/^o(ut)?$/i) { + $outOpt = shift; + defined $outOpt or Error("Expected output file or directory name for -o option\n"), $badCmd=1, next; + CleanFilename($outOpt); + # verbose messages go to STDERR of output is to console + $vout = \*STDERR if $vout =~ /^-(\.\w+)?$/; + next; + } + /^overwrite_original$/i and $overwriteOrig = 1, next; + /^overwrite_original_in_place$/i and $overwriteOrig = 2, next; + if (/^p$/ or $a eq 'printformat') { + my $fmt = shift; + if ($pass) { + LoadPrintFormat($fmt); + # load MWG module now if necessary + if (not $useMWG and grep /^mwg:/i, @requestTags) { + $useMWG = 1; + require Image::ExifTool::MWG; + Image::ExifTool::MWG::Load(); + } + } else { + # defer to next pass so the filename charset is available + push @nextPass, '-p', $fmt; + } + next; + } + (/^P$/ or $a eq 'preserve') and $preserveTime = 1, next; + /^password$/i and $mt->Options(Password => shift), next; + if (/^progress(:.*)?$/i) { + if ($1) { + $windowTitle = substr $1, 1; + $windowTitle = 'ExifTool %p%%' unless length $windowTitle; + $windowTitle =~ /%\d*[bpr]/ and $progress = 0 unless defined $progress; + } else { + $progress = 1; + $verbose = 0 unless defined $verbose; + } + $progressCount = 0; + next; + } + /^q(uiet)?$/i and ++$quiet, next; + /^r(ecurse)?(\.?)$/i and $recurse = ($2 ? 2 : 1), next; + if ($a eq 'require') { # (undocumented) added in version 8.65 + my $ver = shift; + unless (defined $ver and Image::ExifTool::IsFloat($ver)) { + Error("Expecting version number for -require option\n"); + $badCmd = 1; + next; + } + unless ($Image::ExifTool::VERSION >= $ver) { + Error("Requires ExifTool version $ver or later\n"); + $badCmd = 1; + } + next; + } + /^restore_original$/i and $deleteOrig = 0, next; + (/^S$/ or $a eq 'veryshort') and $outFormat+=2, next; + /^s(hort)?(\d*)$/i and $outFormat = $2 eq '' ? $outFormat + 1 : $2, next; + /^scanforxmp$/i and $mt->Options(ScanForXMP => 1), next; + if (/^sep(arator)?$/i) { + my $sep = $listSep = shift; + defined $listSep or Error("Expecting list item separator for -sep option\n"), $badCmd=1, next; + $sep =~ s/\\(.)/$unescapeChar{$1}||$1/sge; # translate escape sequences + (defined $binSep ? $binTerm : $binSep) = $sep; + $mt->Options(ListSep => $listSep); + $joinLists = 1; + # also split when writing values + my $listSplit = quotemeta $listSep; + # a space in the string matches zero or more whitespace characters + $listSplit =~ s/(\\ )+/\\s\*/g; + # but a single space alone matches one or more whitespace characters + $listSplit = '\\s+' if $listSplit eq '\\s*'; + $mt->Options(ListSplit => $listSplit); + next; + } + /^(-)?sort$/i and $sortOpt = $1 ? 0 : 1, next; + if ($a eq 'srcfile') { + @ARGV or Warn("Expecting FMT for -srcfile option\n"), next; + push @srcFmt, shift; + next; + } + if ($a eq 'stay_open') { + my $arg = shift; + defined $arg or Warn("Expecting argument for -stay_open option\n"), next; + if ($arg =~ /^(1|true)$/i) { + if (not $stayOpen) { + $stayOpen = 1; + } elsif ($stayOpen == 2) { + $stayOpen = 3; # chained -stay_open options + } else { + Warn "-stay_open already active\n"; + } + } elsif ($arg =~ /^(0|false)$/i) { + if ($stayOpen >= 2) { + # close -stay_open argfile and process arguments up to this point + close STAYOPEN; + push @ARGV, @moreArgs; + undef @moreArgs; + } elsif (not $stayOpen) { + Warn("-stay_open wasn't active\n"); + } + $stayOpen = 0; + } else { + Warn "Invalid argument for -stay_open\n"; + } + next; + } + if (/^(-)?struct$/i) { + $mt->Options(Struct => $1 ? 0 : 1); + next; + } + /^t(ab)?$/ and $tabFormat = 1, next; + if (/^T$/ or $a eq 'table') { + $tabFormat = $forcePrint = 1; $outFormat+=2; ++$quiet; + next; + } + if (/^(u)(nknown(2)?)?$/i) { + my $inc = ($3 or (not $2 and $1 eq 'U')) ? 2 : 1; + $mt->Options(Unknown => $mt->Options('Unknown') + $inc); + next; + } + if ($a eq 'use') { + my $module = shift; + $module or Error("Expecting module name for -use option\n"), $badCmd=1, next; + lc $module eq 'mwg' and $useMWG = 1, next; + $module =~ /[^\w:]/ and Error("Invalid module name: $module\n"), $badCmd=1, next; + local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] }; + unless (eval "require Image::ExifTool::$module" or + eval "require $module" or + eval "require '${module}'") + { + Error("Error using module $module\n"); + $badCmd = 1; + } + next; + } + if ($a eq 'userparam') { + my $opt = shift; + defined $opt or Error("Expected parameter for -userParam option\n"), $badCmd=1, next; + $opt =~ /=/ or $opt .= '=1'; + $mt->Options(UserParam => $opt); + next; + } + if (/^v(erbose)?(\d*)$/i) { + $verbose = ($2 eq '') ? ($verbose || 0) + 1 : $2; + next; + } + if (/^(w|textout|tagout)([!+]*)$/i) { + $textOut = shift || Warn("Expecting output extension for -$_ option\n"); + my ($t1, $t2) = ($1, $2); + $textOverwrite = 0; + $textOverwrite += 1 if $t2 =~ /!/; # overwrite + $textOverwrite += 2 if $t2 =~ /\+/; # append + if ($t1 ne 'W' and lc($t1) ne 'tagout') { + undef $tagOut; + } elsif ($textOverwrite >= 2 and $textOut !~ /%[-+]?\d*[.:]?\d*[lu]?[tgso]/) { + $tagOut = 0; # append tags to one file + } else { + $tagOut = 1; # separate file for each tag + } + next; + } + if (/^(-?)(wext|tagoutext)$/i) { + my $ext = shift; + defined $ext or Error("Expecting extension for -wext option\n"), $badCmd=1, next; + my $flag = 1; + $1 and $wext{'*'} = 1, $flag = -1; + $ext =~ s/^\.//; + $wext{lc $ext} = $flag; + next; + } + if ($a eq 'wm' or $a eq 'writemode') { + my $wm = shift; + defined $wm or Error("Expecting argument for -$_ option\n"), $badCmd=1, next; + $wm =~ /^[wcg]*$/i or Error("Invalid argument for -$_ option\n"), $badCmd=1, next; + $mt->Options(WriteMode => $wm); + next; + } + if (/^x$/ or $a eq 'exclude') { + my $tag = shift; + defined $tag or Error("Expecting tag name for -x option\n"), $badCmd=1, next; + $tag =~ s/\ball\b/\*/ig; # replace 'all' with '*' in tag names + if ($setTagsFile) { + push @{$setTags{$setTagsFile}}, "-$tag"; + } else { + push @exclude, $tag; + } + next; + } + (/^X$/ or $a eq 'xmlformat') and $xml = 1, $html = $json = 0, $mt->Options(Duplicates => 1), next; + if (/^php$/i) { + $json = 2; + $html = $xml = 0; + $mt->Options(Duplicates => 1); + next; + } + if (/^z(ip)?$/i) { + $doUnzip = 1; + $mt->Options(Compress => 1, XMPShorthand => 1); + $mt->Options(Compact => 1) unless $mt->Options('Compact'); + next; + } + $_ eq '' and push(@files, '-'), $srcStdin = 1, next; # read STDIN + length $_ eq 1 and $_ ne '*' and Error("Unknown option -$_\n"), $badCmd=1, next; + if (/^[^<]+( ++$saveCount }; + } + push @newValues, $_; + if (/^mwg:/i) { + $useMWG = 1; + } elsif (/^([-\w]+:)*(filename|directory|testname)\b/i) { + $doSetFileName = 1; + } elsif (/^([-\w]+:)*(geotag|geotime|geosync)\b/i) { + if (lc $2 eq 'geotime') { + $addGeotime = ''; + } else { + # add geotag/geosync commands first + unshift @newValues, pop @newValues; + if (lc $2 eq 'geotag' and (not defined $addGeotime or $addGeotime) and length $val) { + $addGeotime = ($1 || '') . 'Geotime)/; + if ($setTagsFile) { + push @{$setTags{$setTagsFile}}, $_; + if (/>/) { + $useMWG = 1 if /^(.*>\s*)?mwg:/si; + if (/\b(filename|directory|testname)#?$/i) { + $doSetFileName = 1; + } elsif (/\bgeotime#?$/i) { + $addGeotime = ''; + } + } else { + $useMWG = 1 if /^([^<]+<\s*(.*\$\{?)?)?mwg:/si; + if (/^([-\w]+:)*(filename|directory|testname)\b/i) { + $doSetFileName = 1; + } elsif (/^([-\w]+:)*geotime\b/i) { + $addGeotime = ''; + } + } + } else { + my $lst = s/^-// ? \@exclude : \@tags; + unless (/^([-\w*]+:)*([-\w*?]+)#?$/) { + Warn(qq(Invalid TAG name: "$_"\n)); + } + push @$lst, $_; # (push everything for backward compatibility) + } + } + } else { + unless ($pass) { + # defer to next pass so the filename charset is available + push @nextPass, $_; + next; + } + if ($doGlob and /[*?]/) { + if ($^O eq 'MSWin32' and eval { require Win32::FindFile }) { + push @files, FindFileWindows($mt, $_); + } else { + # glob each filespec if necessary - MK/20061010 + push @files, File::Glob::bsd_glob($_); + } + $doGlob = 2; + } else { + push @files, $_; + $srcStdin = 1 if $_ eq '-'; + } + } +} + +# set "OK" UserParam based on result of last command +$mt->Options(UserParam => 'OK=' . (not $rtnValPrev)); + +# set verbose output to STDERR if output could be to console +$vout = \*STDERR if $srcStdin and ($isWriting or @newValues); +$mt->Options(TextOut => $vout) if $vout eq \*STDERR; + +# change default EXIF string encoding if MWG used +if ($useMWG and not defined $mt->Options('CharsetEXIF')) { + $mt->Options(CharsetEXIF => 'UTF8'); +} + +# print help +unless ((@tags and not $outOpt) or @files or @newValues) { + if ($doGlob and $doGlob == 2) { + Warn "No matching files\n"; + $rtnVal = 1; + next; + } + if ($outOpt) { + Warn "Nothing to write\n"; + $rtnVal = 1; + next; + } + unless ($helped) { + # catch warnings if we have problems running perldoc + local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] }; + my $dummy = \*SAVEERR; # avoid "used only once" warning + unless ($^O eq 'os2') { + open SAVEERR, ">&STDERR"; + open STDERR, '>/dev/null'; + } + if (system('perldoc',$0)) { + print "Syntax: exiftool [OPTIONS] FILE\n\n"; + print "Consult the exiftool documentation for a full list of options.\n"; + } + unless ($^O eq 'os2') { + close STDERR; + open STDERR, '>&SAVEERR'; + } + } + next; +} + +# do sanity check on -delete_original and -restore_original +if (defined $deleteOrig and (@newValues or @tags)) { + if (not @newValues) { + my $verb = $deleteOrig ? 'deleting' : 'restoring from'; + Warn "Can't specify tags when $verb originals\n"; + } elsif ($deleteOrig) { + Warn "Can't use -delete_original when writing.\n"; + Warn "Maybe you meant -overwrite_original ?\n"; + } else { + Warn "It makes no sense to use -restore_original when writing\n"; + } + $rtnVal = 1; + next; +} + +if ($overwriteOrig > 1 and $outOpt) { + Warn "Can't overwrite in place when -o option is used\n"; + $rtnVal = 1; + next; +} + +if ($tagOut and ($csv or %printFmt or $tabFormat or $xml or ($verbose and $html))) { + Warn "Sorry, -W may not be combined with -csv, -htmlDump, -j, -p, -t or -X\n"; + $rtnVal = 1; + next; +} + +if ($csv and $csv eq 'CSV' and not $isWriting) { + if ($textOut) { + Warn "Sorry, -w may not be combined with -csv\n"; + $rtnVal = 1; + next; + } + if ($binaryOutput) { + $binaryOutput = 0; + $setCharset = 'default' unless defined $setCharset; + } + require Image::ExifTool::XMP if $setCharset; +} + +if ($escapeHTML or $json) { + # must be UTF8 for HTML conversion and JSON output + $mt->Options(Charset => 'UTF8') if $json; + # use Escape option to do our HTML escaping unless XML output + $mt->Options(Escape => 'HTML') if $escapeHTML and not $xml; +} elsif ($escapeXML and not $xml) { + $mt->Options(Escape => 'XML'); +} + +# set sort option +if ($sortOpt) { + # (note that -csv sorts alphabetically by default anyway if more than 1 file) + my $sort = ($outFormat > 0 or $xml or $json or $csv) ? 'Tag' : 'Descr'; + $mt->Options(Sort => $sort, Sort2 => $sort); +} + +# set $structOpt in case set by API option +if ($mt->Options('Struct') and not $structOpt) { + $structOpt = $mt->Options('Struct'); + require 'Image/ExifTool/XMPStruct.pl'; +} + +# set up for RDF/XML, JSON and PHP output formats +if ($xml) { + require Image::ExifTool::XMP; # for EscapeXML() + my $charset = $mt->Options('Charset'); + # standard XML encoding names for supported Charset settings + # (ref http://www.iana.org/assignments/character-sets) + my %encoding = ( + UTF8 => 'UTF-8', + Latin => 'windows-1252', + Latin2 => 'windows-1250', + Cyrillic => 'windows-1251', + Greek => 'windows-1253', + Turkish => 'windows-1254', + Hebrew => 'windows-1255', + Arabic => 'windows-1256', + Baltic => 'windows-1257', + Vietnam => 'windows-1258', + MacRoman => 'macintosh', + ); + # switch to UTF-8 if we don't have a standard encoding name + unless ($encoding{$charset}) { + $charset = 'UTF8'; + $mt->Options(Charset => $charset); + } + # set file header/trailer for XML output + $fileHeader = "\n" . + "\n"; + $fileTrailer = "\n"; + # extract as a list unless short output format + $joinLists = 1 if $outFormat > 0; + $mt->Options(List => 1) unless $joinLists; + $showGroup = $allGroup = 1; # always show group 1 + # set binaryOutput flag to 0 or undef (0 = output encoded binary in XML) + $binaryOutput = ($outFormat > 0 ? undef : 0) if $binaryOutput; + $showTagID = 'D' if $tabFormat and not $showTagID; +} elsif ($json) { + if ($json == 1) { # JSON + $fileHeader = '['; + $fileTrailer = "]\n"; + } else { # PHP + $fileHeader = 'Array('; + $fileTrailer = ");\n"; + } + # allow binary output in a text-mode file when -php/-json and -b used together + # (this works because PHP strings are simple arrays of bytes, and CR/LF + # won't be messed up in the text mode output because they are converted + # to escape sequences in the strings) + if ($binaryOutput) { + $binaryOutput = 0; + require Image::ExifTool::XMP if $json == 1; # (for EncodeBase64) + } + $mt->Options(List => 1) unless $joinLists; + $showTagID = 'D' if $tabFormat and not $showTagID; +} elsif ($structOpt) { + $mt->Options(List => 1); +} else { + $joinLists = 1; # join lists for all other unstructured output formats +} + +if ($argFormat) { + $outFormat = 3; + $allGroup = 1 if defined $showGroup; +} + +# change to forward slashes if necessary in all filenames (like CleanFilename) +if ($hasBackslash{$^O}) { + tr/\\/\// foreach @files; +} + +# can't do anything if no file specified +unless (@files) { + unless ($outOpt) { + if ($doGlob and $doGlob == 2) { + Warn "No matching files\n"; + } else { + Warn "No file specified\n"; + } + $rtnVal = 1; + next; + } + push @files, ''; # create file from nothing +} + +# set Verbose and HtmlDump options +if ($verbose) { + $disableOutput = 1 unless @tags or @exclude or $tagOut; + undef $binaryOutput unless $tagOut; # disable conflicting option + if ($html) { + $html = 2; # flag for html dump + $mt->Options(HtmlDump => $verbose); + } else { + $mt->Options(Verbose => $verbose) unless $tagOut; + } +} elsif (defined $verbose) { + # auto-flush output when -v0 is used + require FileHandle; + STDOUT->autoflush(1); + STDERR->autoflush(1); +} + +# validate all tags we're writing +my $needSave = 1; +if (@newValues) { + # assume -geotime value if -geotag specified without -geotime + if ($addGeotime) { + AddSetTagsFile($setTagsFile = '@') unless $setTagsFile and $setTagsFile eq '@'; + push @{$setTags{$setTagsFile}}, $addGeotime; + $verbose and print $vout qq{Argument "-$addGeotime" is assumed\n}; + } + my %setTagsIndex; + # add/delete option lookup + my %addDelOpt = ( '+' => 'AddValue', '-' => 'DelValue', "\xe2\x88\x92" => 'DelValue' ); + $saveCount = 0; + foreach (@newValues) { + if (ref $_ eq 'HASH') { + # save new values now if we stored a "SaveCount" marker + if ($$_{SaveCount}) { + $saveCount = $mt->SaveNewValues(); + $needSave = 0; + # insert marker to load values from CSV file now if this was the CSV file + push @dynamicFiles, \$csv if $$_{SaveCount} == $csvSaveCount; + } + next; + } + /(.*?)=(.*)/s or next; + my ($tag, $newVal) = ($1, $2); + $tag =~ s/\ball\b/\*/ig; # replace 'all' with '*' in tag names + $newVal eq '' and undef $newVal unless $tag =~ s/\^([-+]*)$/$1/; # undefined to delete tag + if ($tag =~ /^(All)?TagsFromFile$/i) { + defined $newVal or Error("Need file name for -tagsFromFile\n"), next Command; + ++$isWriting; + if ($newVal eq '@' or not defined FilenameSPrintf($newVal)) { + push @dynamicFiles, $newVal; + next; # set tags from dynamic file later + } + unless ($mt->Exists($newVal) or $newVal eq '-') { + Warn "File '${newVal}' does not exist for -tagsFromFile option\n"; + $rtnVal = 1; + next Command; + } + my $setTags = $setTags{$newVal}; + # do we have multiple -tagsFromFile options with this file? + if ($setTagsList{$newVal}) { + # use the tags set in the i-th occurrence + my $i = $setTagsIndex{$newVal} || 0; + $setTagsIndex{$newVal} = $i + 1; + $setTags = $setTagsList{$newVal}[$i] if $setTagsList{$newVal}[$i]; + } + # set specified tags from this file + unless (DoSetFromFile($mt, $newVal, $setTags)) { + $rtnVal = 1; + next Command; + } + $needSave = 1; + next; + } + my %opts = ( Shift => 0 ); # shift values if possible instead of adding/deleting + # allow writing of 'Unsafe' tags unless specified by wildcard + $opts{Protected} = 1 unless $tag =~ /[?*]/; + + if ($tag =~ s/SetNewValue($tag, $newVal, %opts); + $needSave = 1; + ++$isWriting if $rtn; + $wrn and Warn "Warning: $wrn\n"; + } + # exclude specified tags + foreach (@exclude) { + $mt->SetNewValue($_, undef, Replace => 2); + $needSave = 1; + } + unless ($isWriting or $outOpt or @tags) { + Warn "Nothing to do.\n"; + $rtnVal = 1; + next; + } +} elsif (grep /^(\*:)?\*$/, @exclude) { + Warn "All tags excluded -- nothing to do.\n"; + $rtnVal = 1; + next; +} +if ($isWriting and @tags and not $outOpt) { + my ($tg, $s) = @tags > 1 ? ("$tags[0] ...", 's') : ($tags[0], ''); + Warn "Ignored superfluous tag name$s or invalid option$s: -$tg\n"; +} +# save current state of new values if setting values from target file +# or if we may be translating to a different format +$mt->SaveNewValues() if $outOpt or (@dynamicFiles and $needSave); + +$multiFile = 1 if @files > 1; +@exclude and $mt->Options(Exclude => \@exclude); + +undef $binaryOutput if $html; + +if ($binaryOutput) { + $outFormat = 99; # shortest possible output format + $mt->Options(PrintConv => 0); + unless ($textOut or $binaryStdout) { + binmode(STDOUT); + $binaryStdout = 1; + $mt->Options(TextOut => ($vout = \*STDERR)); + } + # disable conflicting options + undef $showGroup; +} + +# sort by groups to look nicer depending on options +if (defined $showGroup and not (@tags and $allGroup) and ($sortOpt or not defined $sortOpt)) { + $mt->Options(Sort => "Group$showGroup"); +} + +if (defined $textOut) { + CleanFilename($textOut); # make all forward slashes + # add '.' before output extension if necessary + $textOut = ".$textOut" unless $textOut =~ /[.%]/ or defined $tagOut; +} + +# determine if we should scan for only writable files +if ($outOpt) { + my $type = GetFileType($outOpt); + if ($type) { + unless (CanWrite($type)) { + Warn "Can't write $type files\n"; + $rtnVal = 1; + next; + } + $scanWritable = $type unless CanCreate($type); + } else { + $scanWritable = 1; + } + $isWriting = 1; # set writing flag +} elsif ($isWriting or defined $deleteOrig) { + $scanWritable = 1; +} + +# initialize alternate encoding flag +$altEnc = $mt->Options('Charset'); +undef $altEnc if $altEnc eq 'UTF8'; + +# set flag to fix description lengths if necessary +if (not $altEnc and $mt->Options('Lang') ne 'en' and eval { require Encode }) { + # (note that Unicode::GCString is part of the Unicode::LineBreak package) + $fixLen = eval { require Unicode::GCString } ? 2 : 1; +} + +# sort input files if specified +if (@fileOrder) { + my @allFiles; + ProcessFiles($mt, \@allFiles); + my $sortTool = new Image::ExifTool; + $sortTool->Options(FastScan => $fileOrderFast) if $fileOrderFast; + $sortTool->Options(PrintConv => $mt->Options('PrintConv')); + $sortTool->Options(Duplicates => 0); + my (%sortBy, %isFloat, @rev, $file); + # save reverse sort flags + push @rev, (s/^-// ? 1 : 0) foreach @fileOrder; + foreach $file (@allFiles) { + my @tags; + my $info = $sortTool->ImageInfo(Infile($file,1), @fileOrder, \@tags); + # get values of all tags (or '~' to sort last if not defined) + foreach (@tags) { + $_ = $$info{$_}; # put tag value into @tag list + defined $_ or $_ = '~', next; + $isFloat{$_} = Image::ExifTool::IsFloat($_); + # pad numbers to 12 digits to keep them sequential + s/(\d+)/(length($1) < 12 ? '0'x(12-length($1)) : '') . $1/eg unless $isFloat{$_}; + } + $sortBy{$file} = \@tags; # save tag values for each file + } + # sort in specified order + @files = sort { + my ($i, $cmp); + for ($i=0; $i<@rev; ++$i) { + my $u = $sortBy{$a}[$i]; + my $v = $sortBy{$b}[$i]; + if (not $isFloat{$u} and not $isFloat{$v}) { + $cmp = $u cmp $v; # alphabetically + } elsif ($isFloat{$u} and $isFloat{$v}) { + $cmp = $u <=> $v; # numerically + } else { + $cmp = $isFloat{$u} ? -1 : 1; # numbers first + } + return $rev[$i] ? -$cmp : $cmp if $cmp; + } + return $a cmp $b; # default to sort by name + } @allFiles; +} elsif (defined $progress) { + # expand FILE argument to count the number of files to process + my @allFiles; + ProcessFiles($mt, \@allFiles); + @files = @allFiles; +} +# set file count for progress message +$progressMax = scalar @files if defined $progress; + +# store duplicate database information under absolute path +my @dbKeys = keys %database; +if (@dbKeys) { + if (eval { require Cwd }) { + undef $evalWarning; + local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] }; + foreach (@dbKeys) { + my $db = $database{$_}; + tr/\\/\// and $database{$_} = $db; # allow for backslashes in SourceFile + # (punt on using ConvertFileName here, so $absPath may be a mix of encodings) + my $absPath = AbsPath($_); + if (defined $absPath) { + $database{$absPath} = $db unless $database{$absPath}; + if ($verbose and $verbose > 1) { + print $vout "Imported entry for '${_}' (full path: '${absPath}')\n"; + } + } elsif ($verbose and $verbose > 1) { + print $vout "Imported entry for '${_}' (non-existent file)\n"; + } + } + } +} + +# process all specified files +ProcessFiles($mt); + +if ($filtered and not $validFile) { + Warn "No file with specified extension\n"; + $rtnVal = 1; +} + +# print CSV information if necessary +PrintCSV() if $csv and not $isWriting; + +# print folder/file trailer if necessary +if ($textOut) { + foreach (keys %outTrailer) { + next unless $outTrailer{$_}; + if ($mt->Open(\*OUTTRAIL, $_, '>>')) { + my $fp = \*OUTTRAIL; + print $fp $outTrailer{$_}; + close $fp; + } else { + Error("Error appending to $_\n"); + } + } +} else { + print $sectTrailer if $sectTrailer; + print $fileTrailer if $fileTrailer and not $fileHeader; +} + +my $totWr = $countGoodWr + $countBadWr + $countSameWr + $countCopyWr + + $countGoodCr + $countBadCr; + +if (defined $deleteOrig) { + + # print summary and delete requested files + unless ($quiet) { + printf "%5d directories scanned\n", $countDir if $countDir; + printf "%5d directories created\n", $countNewDir if $countNewDir; + printf "%5d files failed condition\n", $countFailed if $countFailed; + printf "%5d image files found\n", $count; + } + if (@delFiles) { + # verify deletion unless "-delete_original!" was specified + if ($deleteOrig == 1) { + printf '%5d originals will be deleted! Are you sure [y/n]? ', scalar(@delFiles); + my $response = ; + unless ($response =~ /^(y|yes)\s*$/i) { + Warn "Originals not deleted.\n"; + next; + } + } + $countGoodWr = $mt->Unlink(@delFiles); + $countBad = scalar(@delFiles) - $countGoodWr; + } + if ($quiet) { + # no more messages + } elsif ($count and not $countGoodWr and not $countBad) { + printf "%5d original files found\n", $countGoodWr; # (this will be 0) + } elsif ($deleteOrig) { + printf "%5d original files deleted\n", $countGoodWr if $count; + printf "%5d originals not deleted due to errors\n", $countBad if $countBad; + } else { + printf "%5d image files restored from original\n", $countGoodWr if $count; + printf "%5d files not restored due to errors\n", $countBad if $countBad; + } + +} elsif ((not $binaryStdout or $verbose) and not $quiet) { + + # print summary + my $tot = $count + $countBad; + if ($countDir or $totWr or $countFailed or $tot > 1 or $textOut or %countLink) { + my $o = (($html or $json or $xml or %printFmt or $csv) and not $textOut) ? \*STDERR : $vout; + printf($o "%5d directories scanned\n", $countDir) if $countDir; + printf($o "%5d directories created\n", $countNewDir) if $countNewDir; + printf($o "%5d files failed condition\n", $countFailed) if $countFailed; + printf($o "%5d image files created\n", $countGoodCr) if $countGoodCr; + printf($o "%5d image files updated\n", $countGoodWr) if $totWr - $countGoodCr - $countBadCr - $countCopyWr; + printf($o "%5d image files unchanged\n", $countSameWr) if $countSameWr; + printf($o "%5d image files %s\n", $countCopyWr, $overwriteOrig ? 'moved' : 'copied') if $countCopyWr; + printf($o "%5d files weren't updated due to errors\n", $countBadWr) if $countBadWr; + printf($o "%5d files weren't created due to errors\n", $countBadCr) if $countBadCr; + printf($o "%5d image files read\n", $count) if ($tot+$countFailed)>1 or ($countDir and not $totWr); + printf($o "%5d files could not be read\n", $countBad) if $countBad; + printf($o "%5d output files created\n", scalar(keys %created)) if $textOut; + printf($o "%5d output files appended\n", scalar(keys %appended)) if %appended; + printf($o "%5d hard links created\n", $countLink{Hard} || 0) if $countLink{Hard} or $countLink{BadHard}; + printf($o "%5d hard links could not be created\n", $countLink{BadHard}) if $countLink{BadHard}; + printf($o "%5d symbolic links created\n", $countLink{Sym} || 0) if $countLink{Sym} or $countLink{BadSym}; + printf($o "%5d symbolic links could not be created\n", $countLink{BadSym}) if $countLink{BadSym}; + } +} + +# set error status if we had any errors or if all files failed the "-if" condition +if ($countBadWr or $countBadCr or $countBad) { + $rtnVal = 1; +} elsif ($countFailed and not ($count or $totWr) and not $rtnVal) { + $rtnVal = 2; +} + +# clean up after each command +Cleanup(); + +} # end "Command" loop ........................................................ + +close STAYOPEN if $stayOpen >= 2; + +Exit $rtnValApp; # all done + + +#------------------------------------------------------------------------------ +# Get image information from EXIF data in file (or write file if writing) +# Inputs: 0) ExifTool object reference, 1) file name +sub GetImageInfo($$) +{ + my ($et, $orig) = @_; + my (@foundTags, $info, $file, $ind); + + # set window title for this file if necessary + if (defined $windowTitle) { + my $prog = $progressMax ? "$progressCount/$progressMax" : '0/0'; + my $title = $windowTitle; + my ($num, $denom) = split '/', $prog; + my $frac = $num / ($denom || 1); + my $n = $title =~ s/%(\d+)b/%b/ ? $1 : 20; # length of bar + my $bar = int($frac * $n + 0.5); + my %lkup = ( + b => ('I' x $bar) . ('.' x ($n - $bar)), # (undocumented) + f => $orig, + p => int(100 * $frac + 0.5), + r => $prog, + '%'=> '%', + ); + $title =~ s/%([%bfpr])/$lkup{$1}/eg; + SetWindowTitle($title); + } + unless (length $orig or $outOpt) { + Warn qq(Error: Zero-length file name - ""\n); + ++$countBad; + return; + } + # determine the name of the source file based on the original input file name + if (@srcFmt) { + my ($fmt, $first); + foreach $fmt (@srcFmt) { + $file = $fmt eq '@' ? $orig : FilenameSPrintf($fmt, $orig); + # use this file if it exists + $et->Exists($file) and undef($first), last; + $verbose and print $vout "Source file $file does not exist\n"; + $first = $file unless defined $first; + } + $file = $first if defined $first; + my ($d, $f) = Image::ExifTool::SplitFileName($orig); + $et->Options(UserParam => "OriginalDirectory#=$d"); + $et->Options(UserParam => "OriginalFileName#=$f"); + } else { + $file = $orig; + } + + my $pipe = $file; + if ($doUnzip) { + # pipe through gzip or bzip2 if necessary + if ($file =~ /\.(gz|bz2)$/i) { + my $type = lc $1; + if ($file =~ /[^-_.'A-Za-z0-9\/\\]/) { + Warn "Error: Insecure zip file name. Skipped\n"; + EFile($file); + ++$countBad; + return; + } + if ($type eq 'gz') { + $pipe = qq{gzip -dc "$file" |}; + } else { + $pipe = qq{bzip2 -dc "$file" |}; + } + $$et{TRUST_PIPE} = 1; + } + } + # evaluate -if expression for conditional processing + if (@condition) { + unless ($file eq '-' or $et->Exists($file)) { + Warn "Error: File not found - $file\n"; + EFile($file); + FileNotFound($file); + ++$countBad; + return; + } + my $result; + + unless ($failCondition) { + # catch run time errors as well as compile errors + undef $evalWarning; + local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] }; + + my (%info, $condition); + # extract information and build expression for evaluation + my $opts = { Duplicates => 1, RequestTags => \@requestTags, Verbose => 0, HtmlDump => 0 }; + $$opts{FastScan} = $fastCondition if defined $fastCondition; + # return all tags but explicitly mention tags on command line so + # requested images will generate the appropriate warnings + @foundTags = ('*', @tags) if @tags; + $info = $et->ImageInfo(Infile($pipe,$isWriting), \@foundTags, $opts); + foreach $condition (@condition) { + my $cond = $et->InsertTagValues(\@foundTags, $condition, \%info); + { + # set package so eval'd functions are in Image::ExifTool namespace + package Image::ExifTool; + + my $self = $et; + #### eval "-if" condition (%info, $self) + $result = eval $cond; + + $@ and $evalWarning = $@; + } + if ($evalWarning) { + # fail condition if warning is issued + undef $result; + if ($verbose) { + chomp $evalWarning; + $evalWarning =~ s/ at \(eval .*//s; + Warn "Condition: $evalWarning - $file\n"; + } + } + last unless $result; + } + undef @foundTags if $fastCondition; # ignore if we didn't get all tags + } + unless ($result) { + $verbose and print $vout "-------- $file (failed condition)$progStr\n"; + EFile($file, 2); + ++$countFailed; + return; + } + # can't make use of $info if verbose because we must reprocess + # the file anyway to generate the verbose output + undef $info if $verbose or defined $fastCondition; + } + if (defined $deleteOrig) { + print $vout "======== $file$progStr\n" if defined $verbose; + ++$count; + my $original = "${file}_original"; + $et->Exists($original) or return; + if ($deleteOrig) { + $verbose and print $vout "Scheduled for deletion: $original\n"; + push @delFiles, $original; + } elsif ($et->Rename($original, $file)) { + $verbose and print $vout "Restored from $original\n"; + ++$countGoodWr; + } else { + Warn "Error renaming $original\n"; + EFile($file); + ++$countBad; + } + return; + } + ++$seqFileNum; # increment our file counter + + my $lineCount = 0; + my ($fp, $outfile, $append); + if ($textOut and $verbose and not $tagOut) { + ($fp, $outfile, $append) = OpenOutputFile($orig); + $fp or EFile($file), ++$countBad, return; + # delete file if we exit prematurely (unless appending) + $tmpText = $outfile unless $append; + $et->Options(TextOut => $fp); + } + + if ($isWriting) { + print $vout "======== $file$progStr\n" if defined $verbose; + SetImageInfo($et, $file, $orig); + $info = $et->GetInfo('Warning', 'Error'); + PrintErrors($et, $info, $file); + # close output text file if necessary + if ($outfile) { + undef $tmpText; + close($fp); + $et->Options(TextOut => $vout); + if ($info->{Error}) { + $et->Unlink($outfile); # erase bad file + } elsif ($append) { + $appended{$outfile} = 1 unless $created{$outfile}; + } else { + $created{$outfile} = 1; + } + } + return; + } + + # extract information from this file + unless ($file eq '-' or $et->Exists($file)) { + Warn "Error: File not found - $file\n"; + FileNotFound($file); + $outfile and close($fp), undef($tmpText), $et->Unlink($outfile); + EFile($file); + ++$countBad; + return; + } + # print file/progress message + my $o; + unless ($binaryOutput or $textOut or %printFmt or $html > 1 or $csv) { + if ($html) { + require Image::ExifTool::HTML; + my $f = Image::ExifTool::HTML::EscapeHTML($file); + print "\n"; + } elsif (not ($json or $xml)) { + $o = \*STDOUT if ($multiFile and not $quiet) or $progress; + } + } + $o = \*STDERR if $progress and not $o; + $o and print $o "======== $file$progStr\n"; + if ($info) { + # get the information we wanted + if (@tags and not %printFmt) { + @foundTags = @tags; + $info = $et->GetInfo(\@foundTags); + } + } else { + # request specified tags unless using print format option + my $oldDups = $et->Options('Duplicates'); + if (%printFmt) { + $et->Options(Duplicates => 1); + $et->Options(RequestTags => \@requestTags); + } else { + @foundTags = @tags; + } + # extract the information + $info = $et->ImageInfo(Infile($pipe), \@foundTags); + $et->Options(Duplicates => $oldDups); + } + # all done now if we already wrote output text file (eg. verbose option) + if ($fp) { + if ($outfile) { + $et->Options(TextOut => \*STDOUT); + undef $tmpText; + if ($info->{Error}) { + close($fp); + $et->Unlink($outfile); # erase bad file + } else { + ++$lineCount; # output text file (likely) is not empty + } + } + if ($info->{Error}) { + Warn "Error: $info->{Error} - $file\n"; + EFile($file); + ++$countBad; + return; + } + } + + # print warnings to stderr if using binary output + # (because we are likely ignoring them and piping stdout to file) + # or if there is none of the requested information available + if ($binaryOutput or not %$info) { + my $errs = $et->GetInfo('Warning', 'Error'); + PrintErrors($et, $errs, $file) and EFile($file), $rtnVal = 1; + } elsif ($et->GetValue('Error') or ($$et{Validate} and $et->GetValue('Warning'))) { + $rtnVal = 1; + } + + # open output file (or stdout if no output file) if not done already + unless ($outfile or $tagOut) { + ($fp, $outfile, $append) = OpenOutputFile($orig); + $fp or EFile($file), ++$countBad, return; + $tmpText = $outfile unless $append; + } + + # restore state of comma flag for this file if appending + $comma = $outComma{$outfile} if $append and ($textOverwrite & 0x02); + + # print the results for this file + if (%printFmt) { + # output using print format file (-p) option + my ($type, $doc, $grp, $lastDoc, $cache); + $fileTrailer = ''; + # repeat for each embedded document if necessary + if ($et->Options('ExtractEmbedded')) { + # (cache tag keys if there are sub-documents) + $lastDoc = $$et{DOC_COUNT} and $cache = { }; + } else { + $lastDoc = 0; + } + for ($doc=0; $doc<=$lastDoc; ++$doc) { + my $skipBody; + foreach $type (qw(HEAD SECT IF BODY ENDS TAIL)) { + my $prf = $printFmt{$type} or next; + next if $type eq 'BODY' and $skipBody; + if ($lastDoc) { + if ($doc) { + next if $type eq 'HEAD' or $type eq 'TAIL'; # only repeat SECT/IF/BODY/ENDS + $grp = "Doc$doc"; + } else { + $grp = 'Main'; + } + } + my @lines; + my $opt = $type eq 'IF' ? 'Silent' : 'Warn'; # silence "IF" warnings + foreach (@$prf) { + my $line = $et->InsertTagValues(\@foundTags, $_, $opt, $grp, $cache); + if ($type eq 'IF') { + $skipBody = 1 unless defined $line; + } elsif (defined $line) { + push @lines, $line; + } + } + $lineCount += scalar @lines; + if ($type eq 'SECT') { + my $thisHeader = join '', @lines; + if ($sectHeader and $sectHeader ne $thisHeader) { + print $fp $sectTrailer if $sectTrailer; + undef $sectHeader; + } + $sectTrailer = ''; + print $fp $sectHeader = $thisHeader unless $sectHeader; + } elsif ($type eq 'ENDS') { + $sectTrailer .= join '', @lines if defined $sectHeader; + } elsif ($type eq 'TAIL') { + $fileTrailer .= join '', @lines; + } elsif (@lines) { + print $fp @lines; + } + } + } + delete $printFmt{HEAD} unless $outfile; # print header only once per output file + my $errs = $et->GetInfo('Warning', 'Error'); + PrintErrors($et, $errs, $file) and EFile($file); + } elsif (not $disableOutput) { + my ($tag, $line, %noDups, %csvInfo, $bra, $ket, $sep); + if ($fp) { + # print file header (only once) + if ($fileHeader) { + print $fp $fileHeader unless defined $outfile and ($created{$outfile} or $appended{$outfile}); + undef $fileHeader unless $textOut; + } + if ($html) { + print $fp "\n"; + } elsif ($xml) { + my $f = $file; + CleanXML(\$f); + print $fp "\nGetGroup($tag); + unless ($grp1) { + next unless defined $forcePrint; + $grp0 = $grp1 = 'Unknown'; + } + # add groups from structure fields + AddGroups($$info{$tag}, $grp0, \%groups, \@groups) if ref $$info{$tag}; + next if $groups{$grp1}; + # include family 0 and 1 groups in URI except for internal tags + # (this will put internal tags in the "XML" group on readback) + $groups{$grp1} = $grp0; + push @groups, $grp1; + } + foreach $grp1 (@groups) { + my $grp = $groups{$grp1}; + unless ($grp eq $grp1 and $grp =~ /^(ExifTool|File|Composite|Unknown)$/) { + $grp .= "/$grp1"; + } + print $fp "\n xmlns:$grp1='http://ns.exiftool.org/$grp/1.0/'"; + } + print $fp '>' if $outFormat < 1; # finish rdf:Description token unless short format + $ind = $outFormat >= 0 ? ' ' : ' '; + } elsif ($json) { + # set delimiters for JSON or PHP output + ($bra, $ket, $sep) = $json == 1 ? ('{','}',':') : ('Array(',')',' =>'); + print $fp ",\n" if $comma; + print $fp qq($bra\n "SourceFile"$sep ), EscapeJSON(MyConvertFileName($et,$file)); + $comma = 1; + $ind = (defined $showGroup and not $allGroup) ? ' ' : ' '; + } elsif ($csv) { + my $file2 = MyConvertFileName($et, $file); + $database{$file2} = \%csvInfo; + push @csvFiles, $file2; + } + } + # suppress duplicates manually in JSON and short XML output + my $noDups = ($json or ($xml and $outFormat > 0)); + my $printConv = $et->Options('PrintConv'); + my $lastGroup = ''; + my $i = -1; +TAG: foreach $tag (@foundTags) { + ++$i; # keep track on index in @foundTags + my $tagName = GetTagName($tag); + my ($group, $valList); + # get the value for this tag + my $val = $$info{$tag}; + # set flag if this is binary data + $isBinary = (ref $val eq 'SCALAR' and defined $binaryOutput); + if (ref $val) { + # happens with -X, -j or -php when combined with -b: + if (defined $binaryOutput and not $binaryOutput and $$et{TAG_INFO}{$tag}{Protected}) { + # avoid extracting Protected binary tags (eg. data blocks) [insider information] + my $lcTag = lc $tag; + $lcTag =~ s/ .*//; + next unless $$et{REQ_TAG_LOOKUP}{$lcTag} or ($$et{OPTIONS}{RequestAll} || 0) > 2; + } + $val = ConvertBinary($val); # convert SCALAR references + next unless defined $val; + if ($structOpt and ref $val) { + # serialize structure if necessary + $val = Image::ExifTool::XMP::SerializeStruct($val) unless $xml or $json; + } elsif (ref $val eq 'ARRAY') { + if (defined $listItem) { + # take only the specified item + $val = $$val[$listItem]; + # join arrays of simple values (with newlines for binary output) + } elsif ($binaryOutput) { + if ($tagOut) { + $valList = $val; + $val = shift @$valList; + } else { + $val = join defined $binSep ? $binSep : "\n", @$val; + } + } elsif ($joinLists) { + $val = join $listSep, @$val; + } + } + } + if (not defined $val) { + # ignore tags that weren't found unless necessary + next if $binaryOutput; + if (defined $forcePrint) { + $val = $forcePrint; # forced to print all tag values + } elsif (not $csv) { + next; + } + } + if (defined $showGroup) { + $group = $et->GetGroup($tag, $showGroup); + # look ahead to see if this tag may suppress a priority tag in + # the same group, and if so suppress this tag instead + next if $noDups and $tag =~ /^(.*?) \(/ and defined $$info{$1} and + $group eq $et->GetGroup($1, $showGroup); + $group = 'Unknown' if not $group and ($xml or $json or $csv); + if ($fp and not ($allGroup or $csv)) { + if ($lastGroup ne $group) { + if ($html) { + my $cols = 1; + ++$cols if $outFormat==0 or $outFormat==1; + ++$cols if $showTagID; + print $fp "\n"; + } elsif ($json) { + print $fp "\n $ket" if $lastGroup; + print $fp ',' if $lastGroup or $comma; + print $fp qq(\n "$group"$sep $bra); + undef $comma; + undef %noDups; # allow duplicate names in different groups + } else { + print $fp "---- $group ----\n"; + } + $lastGroup = $group; + } + undef $group; # undefine so we don't print it below + } + } elsif ($noDups) { + # don't allow duplicates, but avoid suppressing the priority tag + next if $tag =~ /^(.*?) \(/ and defined $$info{$1}; + } + + ++$lineCount; # we are printing something meaningful + + # loop through list values when -b -W used + for (;;) { + if ($tagOut) { + # determine suggested extension for output file + my $ext = SuggestedExtension($et, \$val, $tagName); + if (%wext and ($wext{$ext} || $wext{'*'} || -1) < 0) { + if ($verbose and $verbose > 1) { + print $vout "Not writing $ext output file for $tagName\n"; + } + next TAG; + } + my @groups = $et->GetGroup($tag); + $outfile and close($fp), undef($tmpText); # (shouldn't happen) + my $org = $et->GetValue('OriginalRawFileName') || $et->GetValue('OriginalFileName'); + ($fp, $outfile, $append) = OpenOutputFile($orig, $tagName, \@groups, $ext, $org); + $fp or ++$countBad, next TAG; + $tmpText = $outfile unless $append; + } + # write binary output + if ($binaryOutput) { + print $fp $val; + print $fp $binTerm if defined $binTerm; + if ($tagOut) { + if ($append) { + $appended{$outfile} = 1 unless $created{$outfile}; + } else { + $created{$outfile} = 1; + } + close($fp); + undef $tmpText; + $verbose and print $vout "Wrote $tagName to $outfile\n"; + undef $outfile; + undef $fp; + next TAG unless $valList and @$valList; + $val = shift @$valList; + next; # loop over values of List tag + } + next TAG; + } + last; + } + # save information for CSV output + if ($csv) { + my $tn = $tagName; + $tn .= '#' if $tag =~ /#/; # add ValueConv "#" suffix if used + my $gt = $group ? "$group:$tn" : $tn; + # (tag-name case may be different if some tags don't exist + # in a file, so all logic must use lower-case tag names) + my $lcTag = lc $gt; + # override existing entry only if top priority + next if defined $csvInfo{$lcTag} and $tag =~ /\(/; + $csvInfo{$lcTag} = $val; + if (defined $csvTags{$lcTag}) { + # overwrite with actual extracted tag name + # (note: can't check "if defined $val" here because -f may be used) + $csvTags{$lcTag} = $gt if defined $$info{$tag}; + next; + } + # must check for "Unknown" group (for tags that don't exist) + if ($group and defined $csvTags[$i] and $csvTags[$i] =~ /^(.*):$tn$/i) { + next if $group eq 'Unknown'; # nothing more to do if we don't know tag group + if ($1 eq 'unknown') { + # replace unknown entry in CSV tag lookup and list + delete $csvTags{$csvTags[$i]}; + $csvTags{$lcTag} = defined($val) ? $gt : ''; + $csvTags[$i] = $lcTag; + next; + } + } + # (don't save unextracted tag name unless -f was used) + $csvTags{$lcTag} = defined($val) ? $gt : ''; + if (@csvFiles == 1) { + push @csvTags, $lcTag; # save order of tags for first file + } elsif (@csvTags) { + undef @csvTags; + } + next; + } + + # get description if we need it (use tag name if $outFormat > 0) + my $desc = $outFormat > 0 ? $tagName : $et->GetDescription($tag); + + if ($xml) { + # RDF/XML output format + my $tok = "$group:$tagName"; + if ($outFormat > 0) { + if ($structOpt and ref $val) { + $val = Image::ExifTool::XMP::SerializeStruct($val); + } + if ($escapeHTML) { + $val =~ tr/\0-\x08\x0b\x0c\x0e-\x1f/./; + Image::ExifTool::XMP::FixUTF8(\$val) unless $altEnc; + $val = Image::ExifTool::HTML::EscapeHTML($val, $altEnc); + } else { + CleanXML(\$val); + } + unless ($noDups{$tok}) { + # manually un-do CR/LF conversion in Windows because output + # is in text mode, which will re-convert newlines to CR/LF + $isCRLF and $val =~ s/\x0d\x0a/\x0a/g; + print $fp "\n $tok='${val}'"; + # XML does not allow duplicate attributes + $noDups{$tok} = 1; + } + next; + } + my ($xtra, $valNum, $descClose); + if ($showTagID) { + my ($id, $lang) = $et->GetTagID($tag); + if ($id =~ /^\d+$/) { + $id = sprintf("0x%.4x", $id) if $showTagID eq 'H'; + } else { + $id = Image::ExifTool::XMP::FullEscapeXML($id); + } + $xtra = " et:id='${id}'"; + $xtra .= " xml:lang='${lang}'" if $lang; + } else { + $xtra = ''; + } + if ($tabFormat) { + my $table = $et->GetTableName($tag); + my $index = $et->GetTagIndex($tag); + $xtra .= " et:table='${table}'"; + $xtra .= " et:index='${index}'" if defined $index; + } + my $lastVal = $val; + for ($valNum=0; $valNum<2; ++$valNum) { + $val = FormatXML($val, $ind, $group); + # manually un-do CR/LF conversion in Windows because output + # is in text mode, which will re-convert newlines to CR/LF + $isCRLF and $val =~ s/\x0d\x0a/\x0a/g; + if ($outFormat >= 0) { + # normal output format (note: this will give + # non-standard RDF/XML if there are any attributes) + print $fp "\n <$tok$xtra$val"; + last; + } elsif ($valNum == 0) { + CleanXML(\$desc); + if ($xtra) { + print $fp "\n <$tok>"; + print $fp "\n "; + $descClose = "\n "; + } else { + print $fp "\n <$tok rdf:parseType='Resource'>"; + $descClose = ''; + } + # print tag Description + print $fp "\n $desc"; + if ($printConv) { + # print PrintConv value + print $fp "\n "; + $val = $et->GetValue($tag, 'ValueConv'); + $val = '' unless defined $val; + # go back to print ValueConv value only if different + next unless IsEqual($val, $lastVal); + print $fp "$descClose\n "; + last; + } + } + # print ValueConv value + print $fp "\n "; + print $fp "$descClose\n "; + last; + } + next; + } elsif ($json) { + # JSON or PHP output format + my $tok = $allGroup ? "$group:$tagName" : $tagName; + # (removed due to backward incompatibility) + # $tok .= '#' if $tag =~ /#/; # add back '#' suffix if used + next if $noDups{$tok}; + $noDups{$tok} = 1; + print $fp ',' if $comma; + print $fp qq(\n$ind"$tok"$sep ); + if ($showTagID or $outFormat < 0) { + $val = { val => $val }; + if ($showTagID) { + my ($id, $lang) = $et->GetTagID($tag); + $id = sprintf('0x%.4x', $id) if $showTagID eq 'H' and $id =~ /^\d+$/; + $$val{lang} = $lang if $lang; + $$val{id} = $id; + } + if ($tabFormat) { + $$val{table} = $et->GetTableName($tag); + my $index = $et->GetTagIndex($tag); + $$val{index} = $index if defined $index; + } + if ($outFormat < 0) { + $$val{desc} = $desc; + if ($printConv) { + my $num = $et->GetValue($tag, 'ValueConv'); + $$val{num} = $num if defined $num and not IsEqual($num, $$val{val}); + } + } + } + FormatJSON($fp, $val, $ind); + $comma = 1; + next; + } + my $id; + if ($showTagID) { + $id = $et->GetTagID($tag); + if ($id =~ /^(\d+)(\.\d+)?$/) { # only print numeric ID's + $id = sprintf("0x%.4x", $1) if $showTagID eq 'H'; + } else { + $id = '-'; + } + } + + if ($escapeC) { + $val =~ s/([\0-\x1f\\\x7f])/$escC{$1} || sprintf('\x%.2x', ord $1)/eg; + } else { + # translate unprintable chars in value and remove trailing spaces + $val =~ tr/\x01-\x1f\x7f/./; + $val =~ s/\x00//g; + $val =~ s/\s+$//; + } + + if ($html) { + print $fp ""; + print $fp "" if defined $group; + print $fp "" if $showTagID; + print $fp "" if $outFormat <= 1; + print $fp "\n"; + } else { + my $buff = ''; + if ($tabFormat) { + $buff = "$group\t" if defined $group; + $buff .= "$id\t" if $showTagID; + if ($outFormat <= 1) { + $buff .= "$desc\t$val\n"; + } elsif (defined $line) { + $line .= "\t$val"; + } else { + $line = $val; + } + } elsif ($outFormat < 0) { # long format + $buff = "[$group] " if defined $group; + $buff .= "$id " if $showTagID; + $buff .= "$desc\n $val\n"; + } elsif ($outFormat == 0 or $outFormat == 1) { + my $wid; + my $len = 0; + if (defined $group) { + $buff = sprintf("%-15s ", "[$group]"); + $len = 16; + } + if ($showTagID) { + $wid = ($showTagID eq 'D') ? 5 : 6; + $len += $wid + 1; + ($wid = $len - length($buff) - 1) < 1 and $wid = 1; + $buff .= sprintf "%${wid}s ", $id; + } + $wid = 32 - (length($buff) - $len); + # pad description to a constant length + # (get actual character length when using alternate languages + # because these descriptions may contain UTF8-encoded characters) + my $padLen = $wid; + if (not $fixLen) { + $padLen -= length $desc; + } elsif ($fixLen == 1) { + $padLen -= length Encode::decode_utf8($desc); + } else { + my $gcstr = eval { new Unicode::GCString(Encode::decode_utf8($desc)) }; + if ($gcstr) { + $padLen -= $gcstr->columns; + } else { + $padLen -= length Encode::decode_utf8($desc); + Warn "Warning: Unicode::GCString problem. Columns may be misaligned\n"; + $fixLen = 1; + } + } + $padLen = 0 if $padLen < 0; + $buff .= $desc . (' ' x $padLen) . ": $val\n"; + } elsif ($outFormat == 2) { + $buff = "[$group] " if defined $group; + $buff .= "$id " if $showTagID; + $buff .= "$tagName: $val\n"; + } elsif ($argFormat) { + $buff = '-'; + $buff .= "$group:" if defined $group; + $tagName .= '#' if $tag =~ /#/; # add '#' suffix if used + $buff .= "$tagName=$val\n"; + } else { + $buff = "$group " if defined $group; + $buff .= "$id " if $showTagID; + $buff .= "$val\n"; + } + print $fp $buff; + } + if ($tagOut) { + if ($append) { + $appended{$outfile} = 1 unless $created{$outfile}; + } else { + $created{$outfile} = 1; + } + close($fp); + undef $tmpText; + $verbose and print $vout "Wrote $tagName to $outfile\n"; + undef $outfile; + undef $fp; + } + } + if ($fp) { + if ($html) { + print $fp "
$group
$group$id$desc$val
\n"; + } elsif ($xml) { + # close rdf:Description element + print $fp $outFormat < 1 ? "\n\n" : "/>\n"; + } elsif ($json) { + print $fp "\n $ket" if $lastGroup; + print $fp "\n$ket"; + $comma = 1; + } elsif ($tabFormat and $outFormat > 1) { + print $fp "$line\n" if defined $line; + } + } + } + if ($outfile) { + if ($textOverwrite & 0x02) { + # save state of this file if we may be appending + $outComma{$outfile} = $comma; + $outTrailer{$outfile} = ''; + $outTrailer{$outfile} .= $sectTrailer and $sectTrailer = '' if $sectTrailer; + $outTrailer{$outfile} .= $fileTrailer if $fileTrailer; + } else { + # write section and file trailers before closing the file + print $fp $sectTrailer and $sectTrailer = '' if $sectTrailer; + print $fp $fileTrailer if $fileTrailer; + } + close($fp); + undef $tmpText; + if ($lineCount) { + if ($append) { + $appended{$outfile} = 1 unless $created{$outfile}; + } else { + $created{$outfile} = 1; + } + } else { + $et->Unlink($outfile) unless $append; # don't keep empty output files + } + undef $comma; + } + ++$count; +} + +#------------------------------------------------------------------------------ +# Set information in file +# Inputs: 0) ExifTool object reference, 1) source file name +# 2) original source file name ('' to create from scratch) +# Returns: true on success +sub SetImageInfo($$$) +{ + my ($et, $file, $orig) = @_; + my ($outfile, $restored, $isTemporary, $isStdout, $outType, $tagsFromSrc); + my ($hardLink, $symLink, $testName, $sameFile); + my $infile = $file; # save infile in case we change it again + + # clean up old temporary file if necessary + if (defined $tmpFile) { + $et->Unlink($tmpFile); + undef $tmpFile; + } + # clear any existing errors or warnings since we check these on return + delete $$et{VALUE}{Error}; + delete $$et{VALUE}{Warning}; + + # first, try to determine our output file name so we can return quickly + # if it already exists (note: this test must be delayed until after we + # set tags from dynamic files if writing FileName or Directory) + if (defined $outOpt) { + if ($outOpt =~ /^-(\.\w+)?$/) { + # allow output file type to be specified with "-o -.EXT" + $outType = GetFileType($outOpt) if $1; + $outfile = '-'; + $isStdout = 1; + } else { + $outfile = FilenameSPrintf($outOpt, $orig); + if ($outfile eq '') { + Warn "Error: Can't create file with zero-length name from $orig\n"; + EFile($infile); + ++$countBadCr; + return 0; + } + } + if (not $isStdout and (($et->IsDirectory($outfile) and not $listDir) or $outfile =~ /\/$/)) { + $outfile .= '/' unless $outfile =~ /\/$/; + my $name = $file; + $name =~ s/^.*\///s; # remove directory name + $outfile .= $name; + } else { + my $srcType = GetFileType($file) || ''; + $outType or $outType = GetFileType($outfile); + if ($outType and ($srcType ne $outType or $outType eq 'ICC') and $file ne '-') { + unless (CanCreate($outType)) { + my $what = $srcType ? 'other types' : 'scratch'; + WarnOnce "Error: Can't create $outType files from $what\n"; + EFile($infile); + ++$countBadCr; + return 0; + } + if ($file ne '') { + # restore previous new values unless done already + $et->RestoreNewValues() unless $restored; + $restored = 1; + # translate to this type by setting specified tags from file + my @setTags = @tags; + foreach (@exclude) { + push @setTags, "-$_"; + } + # force some tags to be copied for certain file types + my %forceCopy = ( + ICC => 'ICC_Profile', + VRD => 'CanonVRD', + DR4 => 'CanonDR4', + ); + push @setTags, $forceCopy{$outType} if $forceCopy{$outType}; + # assume "-tagsFromFile @" unless -tagsFromFile already specified + # (%setTags won't be empty if -tagsFromFile used) + if (not %setTags or (@setTags and not $setTags{'@'})) { + return 0 unless DoSetFromFile($et, $file, \@setTags); + } elsif (@setTags) { + # add orphaned tags to existing "-tagsFromFile @" for this file only + push @setTags, @{$setTags{'@'}}; + $tagsFromSrc = \@setTags; + } + # all done with source file -- create from meta information alone + $file = ''; + } + } + } + unless ($isStdout) { + $outfile = NextUnusedFilename($outfile); + if ($et->Exists($outfile) and not $doSetFileName) { + Warn "Error: '${outfile}' already exists - $infile\n"; + EFile($infile); + ++$countBadWr; + return 0; + } + } + } elsif ($file eq '-') { + $isStdout = 1; + } + # set tags from destination file if required + if (@dynamicFiles) { + # restore previous values if necessary + $et->RestoreNewValues() unless $restored; + my ($dyFile, %setTagsIndex); + foreach $dyFile (@dynamicFiles) { + if (not ref $dyFile) { + my ($fromFile, $setTags); + if ($dyFile eq '@') { + $fromFile = $orig; + $setTags = $tagsFromSrc || $setTags{$dyFile}; + } else { + $fromFile = FilenameSPrintf($dyFile, $orig); + defined $fromFile or EFile($infile), ++$countBadWr, return 0; + $setTags = $setTags{$dyFile}; + } + # do we have multiple -tagsFromFile options with this file? + if ($setTagsList{$dyFile}) { + # use the tags set in the i-th occurrence + my $i = $setTagsIndex{$dyFile} || 0; + $setTagsIndex{$dyFile} = $i + 1; + $setTags = $setTagsList{$dyFile}[$i] if $setTagsList{$dyFile}[$i]; + } + # set new values values from file + return 0 unless DoSetFromFile($et, $fromFile, $setTags); + } elsif (ref $dyFile eq 'ARRAY') { + # a dynamic file containing a simple tag value + my $fname = FilenameSPrintf($$dyFile[1], $orig); + my ($buff, $rtn, $wrn); + my $opts = $$dyFile[2]; + if (defined $fname and SlurpFile($fname, \$buff)) { + $verbose and print $vout "Reading $$dyFile[0] from $fname\n"; + ($rtn, $wrn) = $et->SetNewValue($$dyFile[0], $buff, %$opts); + $wrn and Warn "$wrn\n"; + } + # remove this tag if we couldn't set it properly + $rtn or $et->SetNewValue($$dyFile[0], undef, Replace => 2, + ProtectSaved => $$opts{ProtectSaved}); + next; + } elsif (ref $dyFile eq 'SCALAR') { + # set new values from CSV or JSON database + my ($f, $found, $tag); + undef $evalWarning; + local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] }; + # force UTF-8 if the database was JSON + my $old = $et->Options('Charset'); + $et->Options(Charset => 'UTF8') if $csv eq 'JSON'; + # read tags for SourceFile '*' plus the specific file + foreach $f ('*', MyConvertFileName($et, $file)) { + my $csvInfo = $database{$f}; + unless ($csvInfo) { + next if $f eq '*'; + # check absolute path + # (punt on using ConvertFileName here, so $absPath may be a mix of encodings) + my $absPath = AbsPath($f); + next unless defined $absPath and $csvInfo = $database{$absPath}; + } + $found = 1; + $verbose and print $vout "Setting new values from $csv database\n"; + foreach $tag (sort keys %$csvInfo) { + next if $tag =~ /\b(SourceFile|Directory|FileName)$/i; # don't write these + my ($rtn, $wrn) = $et->SetNewValue($tag, $$csvInfo{$tag}, + Protected => 1, AddValue => $csvAdd, + ProtectSaved => $csvSaveCount); + $wrn and Warn "$wrn\n" if $verbose; + } + } + $et->Options(Charset => $old) if $csv eq 'JSON'; + unless ($found) { + Warn("No SourceFile '${file}' in imported $csv database\n"); + my $absPath = AbsPath($file); + Warn("(full path: '${absPath}')\n") if defined $absPath and $absPath ne $file; + return 0; + } + } + } + } + if ($isStdout) { + # write to STDOUT + $outfile = \*STDOUT; + unless ($binaryStdout) { + binmode(STDOUT); + $binaryStdout = 1; + } + } else { + # get name of hard link if we are creating one + $hardLink = $et->GetNewValues('HardLink'); + $symLink = $et->GetNewValues('SymLink'); + $testName = $et->GetNewValues('TestName'); + $hardLink = FilenameSPrintf($hardLink, $orig) if defined $hardLink; + $symLink = FilenameSPrintf($symLink, $orig) if defined $symLink; + # determine what our output file name should be + my $newFileName = $et->GetNewValues('FileName'); + my $newDir = $et->GetNewValues('Directory'); + if (defined $newFileName and not length $newFileName) { + Warn "Warning: New file name is empty - $ infile\n"; + undef $newFileName; + } + if (defined $testName) { + my $err; + $err = "You shouldn't write FileName or Directory with TestFile" if defined $newFileName or defined $newDir; + $err = "The -o option shouldn't be used with TestFile" if defined $outfile; + $err and Warn("Error: $err - $infile\n"), EFile($infile), ++$countBadWr, return 0; + $testName = FilenameSPrintf($testName, $orig); + $testName = Image::ExifTool::GetNewFileName($file, $testName) if $file ne ''; + } + if (defined $newFileName or defined $newDir or ($doSetFileName and defined $outfile)) { + if ($newFileName) { + $newFileName = FilenameSPrintf($newFileName, $orig); + if (defined $outfile) { + $outfile = Image::ExifTool::GetNewFileName($file, $outfile) if $file ne ''; + $outfile = Image::ExifTool::GetNewFileName($outfile, $newFileName); + } elsif ($file ne '') { + $outfile = Image::ExifTool::GetNewFileName($file, $newFileName); + } + } + if ($newDir) { + $newDir = FilenameSPrintf($newDir, $orig); + $outfile = Image::ExifTool::GetNewFileName(defined $outfile ? $outfile : $file, $newDir); + } + $outfile = NextUnusedFilename($outfile, $infile); + if ($et->Exists($outfile)) { + if ($infile eq $outfile) { + undef $outfile; # not changing the file name after all + # (allow for case-insensitive filesystems) + } elsif ($et->IsSameFile($infile, $outfile)) { + $sameFile = $outfile; # same file, but the name has a different case + } else { + Warn "Error: '${outfile}' already exists - $infile\n"; + EFile($infile); + ++$countBadWr; + return 0; + } + } + } + if (defined $outfile) { + defined $verbose and print $vout "'${infile}' --> '${outfile}'\n"; + # create output directory if necessary + CreateDirectory($outfile); + # set temporary file (automatically erased on abnormal exit) + $tmpFile = $outfile if defined $outOpt; + } + unless (defined $tmpFile) { + # count the number of tags and pseudo-tags we are writing + my ($numSet, $numPseudo) = $et->CountNewValues(); + if ($numSet != $numPseudo and $et->IsDirectory($file)) { + print $vout "Can't write real tags to a directory - $infile\n" if defined $verbose; + $numSet = $numPseudo; + } + if ($et->Exists($file)) { + unless ($numSet) { + # no need to write if no tags set + print $vout "Nothing changed in $file\n" if defined $verbose; + EFile($infile, 1); + ++$countSameWr; + return 1; + } + } elsif (CanCreate($file)) { + if ($numSet == $numPseudo) { + # no need to write if no real tags + Warn("Error: Nothing to write - $file\n"); + EFile($infile, 1); + ++$countBadWr; + return 0; + } + unless (defined $outfile) { + # create file from scratch + $outfile = $file; + $file = ''; + } + } else { + # file doesn't exist, and we can't create it + Warn "Error: File not found - $file\n"; + EFile($infile); + FileNotFound($file); + ++$countBadWr; + return 0; + } + # quickly rename file and/or set file date if this is all we are doing + if ($numSet == $numPseudo) { + my ($r0, $r1, $r2, $r3) = (0, 0, 0, 0); + if (defined $outfile) { + $r0 = $et->SetFileName($file, $outfile); + $file = $$et{NewName} if $r0 > 0; # continue with new name if changed + } + unless ($r0 < 0) { + $r1 = $et->SetFileModifyDate($file,undef,'FileCreateDate'); + $r2 = $et->SetFileModifyDate($file); + $r3 = $et->SetSystemTags($file); + } + if ($r0 > 0 or $r1 > 0 or $r2 > 0 or $r3 > 0) { + ++$countGoodWr; + } elsif ($r0 < 0 or $r1 < 0 or $r2 < 0 or $r3 < 0) { + EFile($infile); + ++$countBadWr; + return 0; + } else { + EFile($infile, 1); + ++$countSameWr; + } + if (defined $hardLink or defined $symLink or defined $testName) { + DoHardLink($et, $file, $hardLink, $symLink, $testName); + } + return 1; + } + if (not defined $outfile or defined $sameFile) { + # write to a truly temporary file + $outfile = "${file}_exiftool_tmp"; + if ($et->Exists($outfile)) { + Warn("Error: Temporary file already exists: $outfile\n"); + EFile($infile); + ++$countBadWr; + return 0; + } + $isTemporary = 1; + } + # new output file is temporary until we know it has been written properly + $tmpFile = $outfile; + } + } + # rewrite the file + my $success = $et->WriteInfo(Infile($file), $outfile, $outType); + + # create hard link if specified + if ($success and (defined $hardLink or defined $symLink or defined $testName)) { + my $src = defined $outfile ? $outfile : $file; + DoHardLink($et, $src, $hardLink, $symLink, $testName); + } + + # get file time if preserving it + my ($aTime, $mTime, $cTime, $doPreserve); + $doPreserve = $preserveTime unless $file eq ''; + if ($doPreserve and $success) { + ($aTime, $mTime, $cTime) = $et->GetFileTime($file); + # don't override date/time values written by the user + undef $cTime if $$et{WRITTEN}{FileCreateDate}; + if ($$et{WRITTEN}{FileModifyDate} or $doPreserve == 2) { + if (defined $cTime) { + undef $aTime; # only preserve FileCreateDate + undef $mTime; + } else { + undef $doPreserve; # (nothing to preserve) + } + } + } + + if ($success == 1) { + # preserve the original file times + if (defined $tmpFile) { + if ($et->Exists($file)) { + $et->SetFileTime($tmpFile, $aTime, $mTime, $cTime) if $doPreserve; + if ($isTemporary) { + # preserve original file attributes if possible + $et->CopyFileAttrs($file, $outfile); + # move original out of the way + my $original = "${file}_original"; + if (not $overwriteOrig and not $et->Exists($original)) { + # rename the file and check again to be sure the file doesn't exist + # (in case, say, the filesystem truncated the file extension) + if (not $et->Rename($file, $original) or $et->Exists($file)) { + Error "Error renaming $file\n"; + return 0; + } + } + my $dstFile = defined $sameFile ? $sameFile : $file; + if ($overwriteOrig > 1) { + # copy temporary file over top of original to preserve attributes + my ($err, $buff); + my $newFile = $tmpFile; + $et->Open(\*NEW_FILE, $newFile) or Error("Error opening $newFile\n"), return 0; + binmode(NEW_FILE); + + #.......................................................... + # temporarily disable CTRL-C during this critical operation + $critical = 1; + undef $tmpFile; # handle deletion of temporary file ourself + if ($et->Open(\*ORIG_FILE, $file, '+<')) { + binmode(ORIG_FILE); + while (read(NEW_FILE, $buff, 65536)) { + print ORIG_FILE $buff or $err = 1; + } + close(NEW_FILE); + # Handle files being shorter than the original + eval { truncate(ORIG_FILE, tell(ORIG_FILE)) } or $err = 1; + close(ORIG_FILE) or $err = 1; + if ($err) { + Warn "Couldn't overwrite in place - $file\n"; + unless ($et->Rename($newFile, $file) or + ($et->Unlink($file) and $et->Rename($newFile, $file))) + { + Error("Error renaming $newFile to $file\n"); + undef $critical; + SigInt() if $interrupted; + return 0; + } + } else { + $et->SetFileModifyDate($file, $cTime, 'FileCreateDate', 1); + $et->SetFileModifyDate($file, $mTime, 'FileModifyDate', 1); + $et->Unlink($newFile); + if ($doPreserve) { + $et->SetFileTime($file, $aTime, $mTime, $cTime); + # save time to set it later again to patch OS X 10.6 bug + $preserveTime{$file} = [ $aTime, $mTime, $cTime ]; + } + } + ++$countGoodWr; + } else { + close(NEW_FILE); + Warn "Error opening $file for writing\n"; + EFile($infile); + $et->Unlink($newFile); + ++$countBadWr; + } + undef $critical; # end critical section + SigInt() if $interrupted; # issue delayed SIGINT if necessary + #.......................................................... + + # simply rename temporary file to replace original + # (if we didn't already rename it to add "_original") + } elsif ($et->Rename($tmpFile, $dstFile)) { + ++$countGoodWr; + } else { + my $newFile = $tmpFile; + undef $tmpFile; # (avoid deleting file if we get interrupted) + # unlink may fail if already renamed or no permission + if (not $et->Unlink($file)) { + Warn "Error renaming temporary file to $dstFile\n"; + EFile($infile); + $et->Unlink($newFile); + ++$countBadWr; + # try renaming again now that the target has been deleted + } elsif (not $et->Rename($newFile, $dstFile)) { + Warn "Error renaming temporary file to $dstFile\n"; + EFile($infile); + # (don't delete tmp file now because it is all we have left) + ++$countBadWr; + } else { + ++$countGoodWr; + } + } + } elsif ($overwriteOrig) { + # erase original file + $et->Unlink($file) or Warn "Error erasing original $file\n"; + ++$countGoodWr; + } else { + ++$countGoodCr; + } + } else { + # this file was created from scratch, not edited + ++$countGoodCr; + } + } else { + ++$countGoodWr; + } + } elsif ($success) { + EFile($infile, 1); + if ($isTemporary) { + # just erase the temporary file since no changes were made + $et->Unlink($tmpFile); + ++$countSameWr; + } else { + $et->SetFileTime($outfile, $aTime, $mTime, $cTime) if $doPreserve; + if ($overwriteOrig) { + $et->Unlink($file) or Warn "Error erasing original $file\n"; + } + ++$countCopyWr; + } + print $vout "Nothing changed in $file\n" if defined $verbose; + } else { + EFile($infile); + $et->Unlink($tmpFile) if defined $tmpFile; + ++$countBadWr; + } + undef $tmpFile; + return $success; +} + +#------------------------------------------------------------------------------ +# Make hard link and handle TestName if specified +# Inputs: 0) ExifTool ref, 1) source file name, 2) HardLink name, +# 3) SymLink name, 4) TestFile name +sub DoHardLink($$$$$) +{ + my ($et, $src, $hardLink, $symLink, $testName) = @_; + if (defined $hardLink) { + $hardLink = NextUnusedFilename($hardLink); + if ($et->SetFileName($src, $hardLink, 'Link') > 0) { + $countLink{Hard} = ($countLink{Hard} || 0) + 1; + } else { + $countLink{BadHard} = ($countLink{BadHard} || 0) + 1; + } + } + if (defined $symLink) { + $symLink = NextUnusedFilename($symLink); + if ($et->SetFileName($src, $symLink, 'SymLink') > 0) { + $countLink{Sym} = ($countLink{Sym} || 0) + 1; + } else { + $countLink{BadSym} = ($countLink{BadSym} || 0) + 1; + } + } + if (defined $testName) { + $testName = NextUnusedFilename($testName, $src); + if ($usedFileName{$testName}) { + $et->Warn("File '${testName}' would exist"); + } elsif ($et->SetFileName($src, $testName, 'Test', $usedFileName{$testName}) == 1) { + $usedFileName{$testName} = 1; + $usedFileName{$src} = 0; + } + } +} + +#------------------------------------------------------------------------------ +# Clean string for XML (also removes invalid control chars and malformed UTF-8) +# Inputs: 0) string ref +# Returns: nothing, but input string is escaped +sub CleanXML($) +{ + my $strPt = shift; + # translate control characters that are invalid in XML + $$strPt =~ tr/\0-\x08\x0b\x0c\x0e-\x1f/./; + # fix malformed UTF-8 characters + Image::ExifTool::XMP::FixUTF8($strPt) unless $altEnc; + # escape necessary characters for XML + $$strPt = Image::ExifTool::XMP::EscapeXML($$strPt); +} + +#------------------------------------------------------------------------------ +# Encode string for XML +# Inputs: 0) string ref +# Returns: encoding used (and input string is translated) +sub EncodeXML($) +{ + my $strPt = shift; + if ($$strPt =~ /[\0-\x08\x0b\x0c\x0e-\x1f]/ or + (not $altEnc and Image::ExifTool::XMP::IsUTF8($strPt) < 0)) + { + # encode binary data and non-UTF8 with special characters as base64 + $$strPt = Image::ExifTool::XMP::EncodeBase64($$strPt); + # #ATV = Alexander Vonk, private communication + return 'http://www.w3.org/2001/XMLSchema#base64Binary'; #ATV + } elsif ($escapeHTML) { + $$strPt = Image::ExifTool::HTML::EscapeHTML($$strPt, $altEnc); + } else { + $$strPt = Image::ExifTool::XMP::EscapeXML($$strPt); + } + return ''; # not encoded +} + +#------------------------------------------------------------------------------ +# Format value for XML output +# Inputs: 0) value, 1) indentation, 2) group +# Returns: formatted value +sub FormatXML($$$) +{ + local $_; + my ($val, $ind, $grp) = @_; + my $gt = '>'; + if (ref $val eq 'ARRAY') { + # convert ARRAY into an rdf:Bag + my $val2 = "\n$ind "; + foreach (@$val) { + $val2 .= "\n$ind "; + } + $val = "$val2\n$ind \n$ind"; + } elsif (ref $val eq 'HASH') { + $gt = " rdf:parseType='Resource'>"; + my $val2 = ''; + my @keys = $$val{_ordered_keys_} ? @{$$val{_ordered_keys_}} : sort keys %$val; + foreach (@keys) { + # (some variable-namespace XML structure fields may have a different group) + my $tok = /:/ ? $_ : ($grp . ':' . $_); + $val2 .= "\n$ind <$tok" . FormatXML($$val{$_}, "$ind ", $grp) . ""; + } + $val = "$val2\n$ind"; + } else { + # (note: SCALAR reference should have already been converted) + my $enc = EncodeXML(\$val); + $gt = " rdf:datatype='${enc}'>\n" if $enc; #ATV + } + return $gt . $val; +} + +#------------------------------------------------------------------------------ +# Escape string for JSON or PHP +# Inputs: 0) string, 1) flag to force numbers to be quoted too +# Returns: Escaped string (quoted if necessary) +sub EscapeJSON($;$) +{ + my ($str, $quote) = @_; + unless ($quote) { + # JSON boolean (true or false) + return lc($str) if $str =~ /^(true|false)$/i and $json < 2; + # JSON/PHP number (see json.org for numerical format) + # return $str if $str =~ /^-?(\d|[1-9]\d+)(\.\d+)?(e[-+]?\d+)?$/i; + # (these big numbers caused problems for some JSON parsers, so be more conservative) + return $str if $str =~ /^-?(\d|[1-9]\d{1,14})(\.\d{1,16})?(e[-+]?\d{1,3})?$/i; + } + # encode JSON string in base64 if necessary + if ($json < 2 and defined $binaryOutput and Image::ExifTool::XMP::IsUTF8(\$str) < 0) { + return '"base64:' . Image::ExifTool::XMP::EncodeBase64($str, 1) . '"'; + } + # escape special characters + $str =~ s/(["\t\n\r\\])/\\$jsonChar{$1}/sg; + if ($json < 2) { # JSON + $str =~ tr/\0//d; # remove all nulls + # escape other control characters with \u + $str =~ s/([\0-\x1f])/sprintf("\\u%.4X",ord $1)/sge; + # JSON strings must be valid UTF8 + Image::ExifTool::XMP::FixUTF8(\$str) unless $altEnc; + } else { # PHP + $str =~ s/\0+$// unless $isBinary; # remove trailing nulls unless binary + # must escape "$" too for PHP + $str =~ s/\$/\\\$/sg; + # escape other control characters with \x + $str =~ s/([\0-\x1f])/sprintf("\\x%.2X",ord $1)/sge; + } + return '"' . $str . '"'; # return the quoted string +} + +#------------------------------------------------------------------------------ +# Print JSON or PHP value +# Inputs: 0) file reference, 1) value, 2) indentation +sub FormatJSON($$$) +{ + local $_; + my ($fp, $val, $ind) = @_; + my $comma; + if (not ref $val) { + print $fp EscapeJSON($val); + } elsif (ref $val eq 'ARRAY') { + if ($joinLists and not ref $$val[0]) { + print $fp EscapeJSON(join $listSep, @$val); + } else { + my ($bra, $ket) = $json == 1 ? ('[',']') : ('Array(',')'); + print $fp $bra; + foreach (@$val) { + print $fp ',' if $comma; + FormatJSON($fp, $_, $ind); + $comma = 1, + } + print $fp $ket, + } + } elsif (ref $val eq 'HASH') { + my ($bra, $ket, $sep) = $json == 1 ? ('{','}',':') : ('Array(',')',' =>'); + print $fp $bra; + my @keys = $$val{_ordered_keys_} ? @{$$val{_ordered_keys_}} : sort keys %$val; + foreach (@keys) { + print $fp ',' if $comma; + my $key = EscapeJSON($_, 1); + print $fp qq(\n$ind $key$sep ); + # hack to force decimal id's to be printed as strings with -H + if ($showTagID and $_ eq 'id' and $showTagID eq 'H' and $$val{$_} =~ /^\d+\.\d+$/) { + print $fp qq{"$$val{$_}"}; + } else { + FormatJSON($fp, $$val{$_}, "$ind "); + } + $comma = 1, + } + print $fp "\n$ind$ket", + } else { + # (note: SCALAR reference should have already been converted) + print $fp '""'; + } +} + +#------------------------------------------------------------------------------ +# Format value for CSV file +# Inputs: value +# Returns: value quoted if necessary +sub FormatCSV($) +{ + my $val = shift; + # check for valid encoding if the Charset option was used + if ($setCharset and ($val =~ /[^\x09\x0a\x0d\x20-\x7e\x80-\xff]/ or + ($setCharset eq 'UTF8' and Image::ExifTool::XMP::IsUTF8(\$val) < 0))) + { + $val = 'base64:' . Image::ExifTool::XMP::EncodeBase64($val, 1); + } + # currently, there is a chance that the value may contain NULL characters unless + # the -b option is used to encode as Base64. It is unclear whether or not this + # is valid CSV, but some readers may not like it. (If this becomes a problem, + # in the future values may need to be truncated at the first NULL character.) + $val = qq{"$val"} if $val =~ s/"/""/g or $val =~ /(^\s+|\s+$)/ or $val =~ /[\n\r]|\Q$csvDelim/; + return $val; +} + +#------------------------------------------------------------------------------ +# Print accumulated CSV information +sub PrintCSV() +{ + my ($file, $lcTag, @tags); + + @csvTags or @csvTags = sort keys %csvTags; + # make a list of tags actually found + foreach $lcTag (@csvTags) { + push @tags, FormatCSV($csvTags{$lcTag}) if $csvTags{$lcTag}; + } + print join($csvDelim, 'SourceFile', @tags), "\n"; + my $empty = defined($forcePrint) ? $forcePrint : ''; + foreach $file (@csvFiles) { + my @vals = (FormatCSV($file)); # start with full file name + my $csvInfo = $database{$file}; + foreach $lcTag (@csvTags) { + next unless $csvTags{$lcTag}; + my $val = $$csvInfo{$lcTag}; + defined $val or push(@vals,$empty), next; + push @vals, FormatCSV($val); + } + print join($csvDelim, @vals), "\n"; + } +} + +#------------------------------------------------------------------------------ +# Add tag groups from structure fields to a list +# Inputs: 0) tag value, 1) parent group, 2) group hash ref, 3) group list ref +sub AddGroups($$$$) +{ + my ($val, $grp, $groupHash, $groupList) = @_; + my ($key, $val2); + if (ref $val eq 'HASH') { + foreach $key (sort keys %$val) { + if ($key =~ /(.*?):/ and not $$groupHash{$1}) { + $$groupHash{$1} = $grp; + push @$groupList, $1; + } + AddGroups($$val{$key}, $grp, $groupHash, $groupList) if ref $$val{$key}; + } + } elsif (ref $val eq 'ARRAY') { + foreach $val2 (@$val) { + AddGroups($val2, $grp, $groupHash, $groupList) if ref $val2; + } + } +} + +#------------------------------------------------------------------------------ +# Convert binary data (SCALAR references) for printing +# Inputs: 0) object reference +# Returns: converted object, or undef if we don't want binary objects +sub ConvertBinary($) +{ + my $obj = shift; + my ($key, $val); + if (ref $obj eq 'HASH') { + foreach $key (keys %$obj) { + next unless ref $$obj{$key}; + $$obj{$key} = ConvertBinary($$obj{$key}); + return undef unless defined $$obj{$key}; + } + } elsif (ref $obj eq 'ARRAY') { + foreach $val (@$obj) { + next unless ref $val; + $val = ConvertBinary($val); + return undef unless defined $val; + } + } elsif (ref $obj eq 'SCALAR') { + return undef if $noBinary; + # (binaryOutput flag is set to 0 for binary mode of XML/PHP/JSON output formats) + if (defined $binaryOutput) { + $obj = $$obj; + # encode in base64 if necessary (0xf7 allows for up to 21-bit UTF-8 code space) + if ($json == 1 and ($obj =~ /[^\x09\x0a\x0d\x20-\x7e\x80-\xf7]/ or + Image::ExifTool::XMP::IsUTF8(\$obj) < 0)) + { + $obj = 'base64:' . Image::ExifTool::XMP::EncodeBase64($obj, 1); + } + } else { + # (-b is not valid for HTML output) + my $bOpt = $html ? '' : ', use -b option to extract'; + if ($$obj =~ /^Binary data \d+ bytes$/) { + $obj = "($$obj$bOpt)"; + } else { + $obj = '(Binary data ' . length($$obj) . " bytes$bOpt)"; + } + } + } + return $obj; +} + +#------------------------------------------------------------------------------ +# Compare ValueConv and PrintConv values of a tag to see if they are equal +# Inputs: 0) value1, 1) value2 +# Returns: true if they are equal +sub IsEqual($$) +{ + my ($a, $b) = @_; + # (scalar values are not print-converted) + return 1 if $a eq $b or ref $a eq 'SCALAR'; + if (ref $a eq 'HASH' and ref $b eq 'HASH') { + return 0 if scalar(keys %$a) != scalar(keys %$b); + my $key; + foreach $key (keys %$a) { + return 0 unless IsEqual($$a{$key}, $$b{$key}); + } + } else { + return 0 if ref $a ne 'ARRAY' or ref $b ne 'ARRAY' or @$a != @$b; + my $i; + for ($i=0; $i ++$saveCount }, "TagsFromFile=$setFile"; + # add option to protect the tags which are assigned after this + # (this is the mechanism by which the command-line order-of-operations is preserved) + $opts or $opts = { }; + $$opts{ProtectSaved} = $saveCount; + push @{$setTags{$setFile}}, $opts; +} + +#------------------------------------------------------------------------------ +# Get input file name or reference for calls to the ExifTool API +# Inputs: 0) file name ('-' for STDIN), 1) flag to buffer STDIN +# Returns: file name, or RAF reference for buffering STDIN +sub Infile($;$) +{ + my ($file, $bufferStdin) = @_; + if ($file eq '-' and ($bufferStdin or $rafStdin)) { + if ($rafStdin) { + $rafStdin->Seek(0); # rewind + } elsif (open RAF_STDIN, '-') { + $rafStdin = new File::RandomAccess(\*RAF_STDIN); + $rafStdin->BinMode(); + } + return $rafStdin if $rafStdin; + } + return $file; +} + +#------------------------------------------------------------------------------ +# Set new values from file +# Inputs: 0) exiftool ref, 1) filename, 2) reference to list of values to set +# Returns: 0 on error (and increments $countBadWr) +sub DoSetFromFile($$$) +{ + local $_; + my ($et, $file, $setTags) = @_; + $verbose and print $vout "Setting new values from $file\n"; + my $info = $et->SetNewValuesFromFile(Infile($file,1), @$setTags); + my $numSet = scalar(keys %$info); + if ($$info{Error}) { + # delete all error and warning tags + my @warns = grep /^(Error|Warning)\b/, keys %$info; + $numSet -= scalar(@warns); + # issue a warning for the main error only if we were able to set some tags + if (keys(%$info) > @warns) { + my $err = $$info{Error}; + delete $$info{$_} foreach @warns; + $$info{Warning} = $err; + } + } elsif ($$info{Warning}) { + my $warns = 1; + ++$warns while $$info{"Warning ($warns)"}; + $numSet -= $warns; + } + PrintErrors($et, $info, $file) and EFile($file), ++$countBadWr, return 0; + Warn "Warning: No writable tags set from $file\n" unless $numSet; + return 1; +} + +#------------------------------------------------------------------------------ +# Translate backslashes to forward slashes in filename if necessary +# Inputs: 0) Filename +# Returns: nothing, but changes filename if necessary +sub CleanFilename($) +{ + $_[0] =~ tr/\\/\// if $hasBackslash{$^O}; +} + +#------------------------------------------------------------------------------ +# Check for valid UTF-8 of a file name +# Inputs: 0) string, 1) original encoding +# Returns: 0=plain ASCII, 1=valid UTF-8, -1=invalid UTF-8 (and print warning) +sub CheckUTF8($$) +{ + my ($file, $enc) = @_; + my $isUTF8 = 0; + if ($file =~ /[\x80-\xff]/) { + require Image::ExifTool::XMP; + $isUTF8 = Image::ExifTool::XMP::IsUTF8(\$file); + if ($isUTF8 < 0) { + if ($enc) { + Warn("Invalid filename encoding for $file\n"); + } elsif (not defined $enc) { + WarnOnce(qq{FileName encoding not specified. Use "-charset FileName=CHARSET"\n}); + } + } + } + return $isUTF8; +} + +#------------------------------------------------------------------------------ +# Set window title +# Inputs: title string or '' to reset title +sub SetWindowTitle($) +{ + my $title = shift; + if ($curTitle ne $title) { + $curTitle = $title; + if ($^O eq 'MSWin32') { + $title =~ s/([&\/\?:|"<>])/^$1/g; # escape special chars + eval { system qq{title $title} }; + } else { + # (this only works for XTerm terminals, and STDERR must go to the console) + printf STDERR "\033]0;%s\007", $title; + } + } +} + +#------------------------------------------------------------------------------ +# Process files in our @files list +# Inputs: 0) ExifTool ref, 1) list ref to just return full file names +sub ProcessFiles($;$) +{ + my ($et, $list) = @_; + my $enc = $et->Options('CharsetFileName'); + my $file; + foreach $file (@files) { + $et->Options(CharsetFileName => 'UTF8') if $utf8FileName{$file}; + if (defined $progressMax) { + ++$progressCount; + $progStr = " [$progressCount/$progressMax]" if $progress; + } + if ($et->IsDirectory($file) and not $listDir) { + $multiFile = $validFile = 1; + ScanDir($et, $file, $list); + } elsif ($filterFlag and not AcceptFile($file)) { + if ($et->Exists($file)) { + $filtered = 1; + $verbose and print $vout "-------- $file (wrong extension)$progStr\n"; + } else { + Warn "Error: File not found - $file\n"; + FileNotFound($file); + $rtnVal = 1; + } + } else { + $validFile = 1; + if ($list) { + push(@$list, $file); + } else { + if (%endDir) { + my ($d, $f) = Image::ExifTool::SplitFileName($file); + next if $endDir{$d}; + } + GetImageInfo($et, $file); + $end and Warn("End called - $file\n"); + if ($endDir) { + Warn("EndDir called - $file\n"); + my ($d, $f) = Image::ExifTool::SplitFileName($file); + $endDir{$d} = 1; + undef $endDir; + } + } + } + $et->Options(CharsetFileName => $enc) if $utf8FileName{$file}; + last if $end; + } +} + +#------------------------------------------------------------------------------ +# Scan directory for image files +# Inputs: 0) ExifTool ref, 1) directory name, 2) list ref to return file names +sub ScanDir($$;$) +{ + local $_; + my ($et, $dir, $list) = @_; + my (@fileList, $done, $file, $utf8Name, $winSurrogate, $endThisDir); + my $enc = $et->Options('CharsetFileName'); + # recode as UTF-8 if necessary + if ($enc) { + unless ($enc eq 'UTF8') { + $dir = $et->Decode($dir, $enc, undef, 'UTF8'); + $et->Options(CharsetFileName => 'UTF8'); # now using UTF8 + } + $utf8Name = 1; + } + return if $ignore{$dir}; + my $oldBase = $seqFileBase; + $seqFileBase = $seqFileNum; + # use Win32::FindFile on Windows if available + # (ReadDir will croak if there is a wildcard, so check for this) + if ($^O eq 'MSWin32' and $dir !~ /[*?]/) { + undef $evalWarning; + local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] };; + if (CheckUTF8($dir, $enc) >= 0) { + if (eval { require Win32::FindFile }) { + eval { + @fileList = Win32::FindFile::ReadDir($dir); + $_ = $_->cFileName foreach @fileList; + }; + $@ and $evalWarning = $@; + if ($evalWarning) { + chomp $evalWarning; + $evalWarning =~ s/ at .*//s; + Warn "Warning: [Win32::FindFile] $evalWarning - $dir\n"; + $winSurrogate = 1 if $evalWarning =~ /surrogate/; + } else { + $et->Options(CharsetFileName => 'UTF8'); # now using UTF8 + $utf8Name = 1; # ReadDir returns UTF-8 file names + $done = 1; + } + } else { + $done = 0; + } + } + } + unless ($done) { + # use standard perl library routines to read directory + unless (opendir(DIR_HANDLE, $dir)) { + Warn("Error opening directory $dir\n"); + $seqFileBase = $oldBase + ($seqFileNum - $seqFileBase); + return; + } + @fileList = readdir(DIR_HANDLE); + closedir(DIR_HANDLE); + if (defined $done) { + # issue warning if some names would have required Win32::FindFile + foreach $file ($dir, @fileList) { + next unless $file =~ /[\?\x80-\xff]/; + WarnOnce("Install Win32::FindFile to support Windows Unicode file names in directories\n"); + last; + } + } + } + $dir =~ /\/$/ or $dir .= '/'; # make sure directory name ends with '/' + foreach $file (@fileList) { + my $path = "$dir$file"; + if ($et->IsDirectory($path)) { + next unless $recurse; + # ignore directories starting with "." by default + next if $file =~ /^\./ and ($recurse == 1 or $file eq '.' or $file eq '..'); + next if $ignore{$file} or ($ignore{SYMLINKS} and -l $path); + ScanDir($et, $path, $list); + last if $end; + next; + } + next if $endThisDir; + next if $ignoreHidden and $file =~ /^\./; # ignore hidden files if specified + # apply rules from -ext options + my $accepted; + if ($filterFlag) { + $accepted = AcceptFile($file) or next; + # must be specifically accepted to bypass selection logic + $accepted &= 0x01; + } + unless ($accepted) { + # read/write this file if it is a supported type + if ($scanWritable) { + if ($scanWritable eq '1') { + next unless CanWrite($file); + } else { + my $type = GetFileType($file); + next unless defined $type and $type eq $scanWritable; + } + } elsif (not GetFileType($file)) { + next unless $doUnzip; + next unless $file =~ /\.(gz|bz2)$/i; + } + } + # Windows patch to avoid replacing filename containing Unicode surrogate with 8.3 name + if ($winSurrogate and $isWriting and + (not $overwriteOrig or $overwriteOrig != 2) and + not $doSetFileName and $file =~ /~/) # (8.3 name will contain a tilde) + { + Warn("Not writing $path\n"); + WarnOnce("Use -overwrite_original_in_place to write files with Unicode surrogate characters\n"); + EFile($file); + ++$countBad; + next; + } + $utf8FileName{$path} = 1 if $utf8Name; + if ($list) { + push(@$list, $path); + } else { + GetImageInfo($et, $path); + if ($end) { + Warn("End called - $file\n"); + last; + } + if ($endDir) { + $path =~ s(/$)(); + Warn("EndDir called - $path\n"); + $endDir{$path} = 1; + $endThisDir = 1; + undef $endDir; + } + } + } + ++$countDir; + $et->Options(CharsetFileName => $enc); # restore original setting + # update sequential file base for parent directory + $seqFileBase = $oldBase + ($seqFileNum - $seqFileBase); +} + +#------------------------------------------------------------------------------ +# Find files with wildcard expression on Windows +# Inputs: 0) ExifTool ref, 1) file name with wildcards +# Returns: list of matching file names +# Notes: +# 1) Win32::FindFile must already be loaded +# 2) Sets flag in %utf8FileName for each file found +sub FindFileWindows($$) +{ + my ($et, $wildfile) = @_; + + # recode file name as UTF-8 if necessary + my $enc = $et->Options('CharsetFileName'); + $wildfile = $et->Decode($wildfile, $enc, undef, 'UTF8') if $enc and $enc ne 'UTF8'; + $wildfile =~ tr/\\/\//; # use forward slashes + my ($dir, $wildname) = ($wildfile =~ m{(.*[:/])(.*)}) ? ($1, $2) : ('', $wildfile); + if ($dir =~ /[*?]/) { + Warn "Wildcards don't work in the directory specification\n"; + return (); + } + CheckUTF8($wildfile, $enc) >= 0 or return (); + undef $evalWarning; + local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] }; + my @files; + eval { + my @names = Win32::FindFile::FindFile($wildfile) or return; + # (apparently this isn't always sorted, so do a case-insensitive sort here) + @names = sort { uc($a) cmp uc($b) } @names; + my ($rname, $nm); + # replace "\?" with ".", and "\*" with ".*" for regular expression + ($rname = quotemeta $wildname) =~ s/\\\?/./g; + $rname =~ s/\\\*/.*/g; + foreach $nm (@names) { + $nm = $nm->cFileName; + # make sure that FindFile behaves + # (otherwise "*.jpg" matches things like "a.jpg_original"!) + next unless $nm =~ /^$rname$/i; + next if $nm eq '.' or $nm eq '..'; # don't match "." and ".." + my $file = "$dir$nm"; # add back directory name + push @files, $file; + $utf8FileName{$file} = 1; # flag this file name as UTF-8 encoded + } + }; + $@ and $evalWarning = $@; + if ($evalWarning) { + chomp $evalWarning; + $evalWarning =~ s/ at .*//s; + Warn "Error: [Win32::FindFile] $evalWarning - $wildfile\n"; + undef @files; + EFile($wildfile); + ++$countBad; + } + return @files; +} + +#------------------------------------------------------------------------------ +# Handle missing file on the command line +# Inputs: 0) file name +sub FileNotFound($) +{ + my $file = shift; + if ($file =~ /^(DIR|FILE)$/) { + my $type = { DIR => 'directory', FILE => 'file' }->{$file}; + Warn qq{You were meant to enter any valid $type name, not "$file" literally.\n}; + } +} + +#------------------------------------------------------------------------------ +# Patch for OS X 10.6 to preserve file modify date +# (this probably isn't a 100% fix, but it may solve a majority of the cases) +sub PreserveTime() +{ + local $_; + $mt->SetFileTime($_, @{$preserveTime{$_}}) foreach keys %preserveTime; + undef %preserveTime; +} + +#------------------------------------------------------------------------------ +# Return absolute path for a file +# Inputs: 0) file name +# Returns: absolute path string, or undef if path could not be determined +# Note: Warnings should be suppressed when calling this routine +sub AbsPath($) +{ + my $file = shift; + my $path; + if (defined $file and eval { require Cwd }) { + $path = eval { Cwd::abs_path($file) }; + # make the delimiters and case consistent + # (abs_path is very inconsistent about what it returns in Windows) + if (defined $path and $hasBackslash{$^O}) { + $path =~ tr/\\/\//; + $path = lc $path; + } + } + return $path; +} + +#------------------------------------------------------------------------------ +# Convert file name to ExifTool Charset +# Inputs: 0) ExifTool ref, 1) file name in CharsetFileName +# Returns: file name in ExifTool Charset +sub MyConvertFileName($$) +{ + my ($et, $file) = @_; + my $enc = $et->Options('CharsetFileName'); + $et->Options(CharsetFileName => 'UTF8') if $utf8FileName{$file}; + my $convFile = $et->ConvertFileName($file); + $et->Options(CharsetFileName => $enc) if $utf8FileName{$file}; + return $convFile; +} + +#------------------------------------------------------------------------------ +# Add print format entry +# Inputs: 0) expression string +sub AddPrintFormat($) +{ + my $expr = shift; + my $type; + if ($expr =~ /^#/) { + $expr =~ s/^#\[(HEAD|SECT|IF|BODY|ENDS|TAIL)\]// or return; # ignore comments + $type = $1; + } else { + $type = 'BODY'; + } + $printFmt{$type} or $printFmt{$type} = [ ]; + push @{$printFmt{$type}}, $expr; + # add to list of requested tags + push @requestTags, $expr =~ /\$\{?((?:[-\w]+:)*[-\w?*]+)/g; +} + +#------------------------------------------------------------------------------ +# Get suggested file extension based on tag value for binary output +# Inputs: 0) ExifTool ref, 1) data ref, 2) tag name +# Returns: file extension (lower case), or 'dat' if unknown +sub SuggestedExtension($$$) +{ + my ($et, $valPt, $tag) = @_; + my $ext; + if (not $binaryOutput) { + $ext = 'txt'; + } elsif ($$valPt =~ /^\xff\xd8\xff/) { + $ext = 'jpg'; + } elsif ($$valPt =~ /^(\0\0\0\x0cjP( |\x1a\x1a)\x0d\x0a\x87\x0a|\xff\x4f\xff\x51\0)/) { + $ext = 'jp2'; + } elsif ($$valPt =~ /^(\x89P|\x8aM|\x8bJ)NG\r\n\x1a\n/) { + $ext = 'png'; + } elsif ($$valPt =~ /^GIF8[79]a/) { + $ext = 'gif'; + } elsif ($$valPt =~ /^<\?xpacket/ or $tag eq 'XMP') { + $ext = 'xmp'; + } elsif ($$valPt =~ /^<\?xml/ or $tag eq 'XML') { + $ext = 'xml'; + } elsif ($$valPt =~ /^RIFF....WAVE/s) { + $ext = 'wav'; + } elsif ($tag eq 'OriginalRawImage' and defined($ext = $et->GetValue('OriginalRawFileName'))) { + $ext =~ s/^.*\.//s; + $ext = $ext ? lc($ext) : 'raw'; + } elsif ($tag eq 'EXIF') { + $ext = 'exif'; + } elsif ($tag eq 'ICC_Profile') { + $ext = 'icc'; + } elsif ($$valPt =~ /^(MM\0\x2a|II\x2a\0)/) { + $ext = 'tiff'; + } elsif ($$valPt =~ /^.{4}ftyp(3gp|mp4|f4v|qt )/s) { + my %movType = ( 'qt ' => 'mov' ); + $ext = $movType{$1} || $1; + } elsif ($$valPt !~ /^.{0,4096}\0/s) { + $ext = 'txt'; + } elsif ($$valPt =~ /^BM.{15}\0/s) { + $ext = 'bmp'; + } elsif ($$valPt =~ /^CANON OPTIONAL DATA\0/) { + $ext = 'vrd'; + } elsif ($$valPt =~ /^IIII\x04\0\x04\0/) { + $ext = 'dr4'; + } elsif ($$valPt =~ /^(.{10}|.{522})(\x11\x01|\x00\x11)/s) { + $ext = 'pict'; + } else { + $ext = 'dat'; + } + return $ext; +} + +#------------------------------------------------------------------------------ +# Load print format file +# Inputs: 0) file name +# - saves lines of file to %printFmt list +# - adds tag names to @tags list +sub LoadPrintFormat($) +{ + my $arg = shift; + if (not defined $arg) { + Error "Must specify file or expression for -p option\n"; + } elsif ($arg !~ /\n/ and -f $arg and $mt->Open(\*FMT_FILE, $arg)) { + foreach () { + AddPrintFormat($_); + } + close(FMT_FILE); + } else { + AddPrintFormat($arg . "\n"); + } +} + +#------------------------------------------------------------------------------ +# A sort of sprintf for filenames +# Inputs: 0) format string (%d=dir, %f=file name, %e=ext), +# 1) source filename or undef to test format string +# 2-4) [%t %g %s %o only] tag name, ref to array of group names, +# suggested extension, original raw file name +# Returns: new filename or undef on error (or if no file and fmt contains token) +sub FilenameSPrintf($;$@) +{ + my ($fmt, $file, @extra) = @_; + local $_; + # return format string straight away if no tokens + return $fmt unless $fmt =~ /%[-+]?\d*[.:]?\d*[lu]?[dDfFeEtgso]/; + return undef unless defined $file; + CleanFilename($file); # make sure we are using forward slashes + # split filename into directory, file, extension + my %part; + @part{qw(d f E)} = ($file =~ /^(.*?)([^\/]*?)(\.[^.\/]*)?$/); + defined $part{f} or Warn("Error: Bad pattern match for file $file\n"), return undef; + if ($part{E}) { + $part{e} = substr($part{E}, 1); + } else { + @part{qw(e E)} = ('', ''); + } + $part{F} = $part{f} . $part{E}; + ($part{D} = $part{d}) =~ s{/+$}{}; + @part{qw(t g s o)} = @extra; + my ($filename, $pos) = ('', 0); + while ($fmt =~ /(%([-+]?)(\d*)([.:]?)(\d*)([lu]?)([dDfFeEtgso]))/g) { + $filename .= substr($fmt, $pos, pos($fmt) - $pos - length($1)); + $pos = pos($fmt); + my ($sign, $wid, $dot, $skip, $mod, $code) = ($2, $3, $4, $5 || 0, $6, $7); + my (@path, $part, $len, $groups); + if (lc $code eq 'd' and $dot and $dot eq ':') { + # field width applies to directory levels instead of characters + @path = split '/', $part{$code}; + $len = scalar @path; + } else { + if ($code eq 'g') { + $groups = $part{g} || [ ] unless defined $groups; + $fmt =~ /\G(\d?)/g; # look for %g1, %g2, etc + $part{g} = $$groups[$1 || 0]; + $pos = pos($fmt); + } + $part{$code} = '' unless defined $part{$code}; + $len = length $part{$code}; + } + next unless $skip < $len; + $wid = $len - $skip if $wid eq '' or $wid + $skip > $len; + $skip = $len - $wid - $skip if $sign eq '-'; + if (@path) { + $part = join('/', @path[$skip..($skip+$wid-1)]); + $part .= '/' unless $code eq 'D'; + } else { + $part = substr($part{$code}, $skip, $wid); + } + $part = ($mod eq 'u') ? uc($part) : lc($part) if $mod; + $filename .= $part; + } + $filename .= substr($fmt, $pos); # add rest of file name + # remove double slashes (except at beginning to allow Windows UNC paths) + $filename =~ s{(?!^)//}{/}g; + return $filename; +} + +#------------------------------------------------------------------------------ +# Convert number to alphabetical index: a, b, c, ... z, aa, ab ... +# Inputs: 0) number +# Returns: alphabetical index string +sub Num2Alpha($) +{ + my $num = shift; + my $alpha = chr(97 + ($num % 26)); + while ($num >= 26) { + $num = int($num / 26) - 1; + $alpha = chr(97 + ($num % 26)) . $alpha; + } + return $alpha; +} + +#------------------------------------------------------------------------------ +# Expand '%c' and '%C' codes if filename to get next unused file name +# Inputs: 0) file name format string, 1) filename ok to use even if it exists +# Returns: new file name +sub NextUnusedFilename($;$) +{ + my ($fmt, $okfile) = @_; + return $fmt unless $fmt =~ /%[-+]?\d*\.?\d*[lun]?[cC]/; + my %sep = ( '-' => '-', '+' => '_' ); + my ($copy, $alpha) = (0, 'a'); + my $seq = $seqFileNum - 1; + for (;;) { + my ($filename, $pos) = ('', 0); + while ($fmt =~ /(%([-+]?)(\d*)(\.?)(\d*)([lun]?)([cC]))/g) { + $filename .= substr($fmt, $pos, pos($fmt) - $pos - length($1)); + $pos = pos($fmt); + my ($sign, $wid, $dec, $wid2, $mod, $tok) = ($2, $3 || 0, $4, $5 || 0, $6, $7); + my $diff; + if ($tok eq 'C') { + $diff = $wid - ($sign eq '-' ? $seqFileBase : 0); + $wid = $wid2; + } else { + next unless $dec or $copy; + $wid = $wid2 if $wid < $wid2; + # add dash or underline separator if '-' or '+' specified + $filename .= $sep{$sign} if $sign; + } + if ($mod and $mod ne 'n') { + my $a = $tok eq 'C' ? Num2Alpha($diff + $seq) : $alpha; + my $str = ($wid and $wid > length $a) ? 'a' x ($wid - length($a)) : ''; + $str .= $a; + $str = uc $str if $mod eq 'u'; + $filename .= $str; + } else { + my $c = $tok eq 'C' ? ($diff + $seq) : $copy; + my $num = $c + ($mod ? 1 : 0); + $filename .= $wid ? sprintf("%.${wid}d",$num) : $num; + } + } + $filename .= substr($fmt, $pos); # add rest of file name + # return now with filename unless file exists + return $filename unless ($mt->Exists($filename) and not defined $usedFileName{$filename}) or $usedFileName{$filename}; + if (defined $okfile) { + return $filename if $filename eq $okfile; + my ($fn, $ok) = (AbsPath($filename), AbsPath($okfile)); + return $okfile if defined $fn and defined $ok and $fn eq $ok; + } + ++$copy; + ++$alpha; + ++$seq; + } +} + +#------------------------------------------------------------------------------ +# Create directory for specified file +# Inputs: 0) complete file name including path +# Returns: true if a directory was created +my $k32CreateDir; +sub CreateDirectory($) +{ + my $file = shift; + my ($dir, $created); + ($dir = $file) =~ s/[^\/]*$//; # remove filename from path specification + if ($dir and not $mt->IsDirectory($dir)) { + my @parts = split /\//, $dir; + $dir = ''; + foreach (@parts) { + $dir .= $_; + if (length $dir and not $mt->IsDirectory($dir) and + # don't try to create a network drive root directory + not ($hasBackslash{$^O} and $dir =~ m{^//[^/]*$})) + { + my $success; + # create directory since it doesn't exist + my $d2 = $dir; # (must make a copy in case EncodeFileName recodes it) + if ($mt->EncodeFileName($d2)) { + # handle Windows Unicode directory names + unless (eval { require Win32::API }) { + Error('Install Win32::API to create directories with Unicode names'); + return 0; + } + unless ($k32CreateDir) { + $k32CreateDir = new Win32::API('KERNEL32', 'CreateDirectoryW', 'PP', 'I'); + } + $success = $k32CreateDir->Call($d2, 0) if $k32CreateDir; + } else { + $success = mkdir($d2, 0777); + } + $success or Error("Error creating directory $dir\n"), return 0; + $verbose and print $vout "Created directory $dir\n"; + $created = 1; + } + $dir .= '/'; + } + ++$countNewDir if $created; + } + return $created; +} + +#------------------------------------------------------------------------------ +# Open output text file +# Inputs: 0) file name format string, 1-N) extra arguments for FilenameSPrintf +# Returns: 0) file reference (or undef on error), 1) file name if opened, 2) append flag +# Notes: returns reference to STDOUT and no file name if no textOut file needed +sub OpenOutputFile($;@) +{ + my ($file, @args) = @_; + my ($fp, $outfile, $append); + if ($textOut) { + $outfile = $file; + CleanFilename($outfile); + if ($textOut =~ /%[-+]?\d*[.:]?\d*[lun]?[dDfFeEtgsocC]/ or defined $tagOut) { + # make filename from printf-like $textOut + $outfile = FilenameSPrintf($textOut, $file, @args); + return () unless defined $outfile; + $outfile = NextUnusedFilename($outfile); + CreateDirectory($outfile); # create directory if necessary + } else { + $outfile =~ s/\.[^.\/]*$//; # remove extension if it exists + $outfile .= $textOut; + } + my $mode = '>'; + if ($mt->Exists($outfile)) { + unless ($textOverwrite) { + Warn "Output file $outfile already exists for $file\n"; + return (); + } + if ($textOverwrite == 2 or ($textOverwrite == 3 and $created{$outfile})) { + $mode = '>>'; + $append = 1; + } + } + unless ($mt->Open(\*OUTFILE, $outfile, $mode)) { + my $what = $mode eq '>' ? 'creating' : 'appending to'; + Error("Error $what $outfile\n"); + return (); + } + binmode(OUTFILE) if $binaryOutput; + $fp = \*OUTFILE; + } else { + $fp = \*STDOUT; + } + return($fp, $outfile, $append); +} + +#------------------------------------------------------------------------------ +# Filter files based on extension +# Inputs: 0) file name +# Returns: 0 = rejected, 1 = specifically accepted, 2 = accepted by default +# Notes: This routine should only be called if $filterFlag is set +sub AcceptFile($) +{ + my $file = shift; + my $ext = ($file =~ /^.*\.(.+)$/s) ? uc($1) : ''; + return $filterExt{$ext} if defined $filterExt{$ext}; + return $filterExt{'*'} if defined $filterExt{'*'}; + return 0 if $filterFlag & 0x02; # reject if accepting specific extensions + return 2; # accept by default +} + +#------------------------------------------------------------------------------ +# Slurp file into buffer +# Inputs: 0) file name, 1) buffer reference +# Returns: 1 on success +sub SlurpFile($$) +{ + my ($file, $buffPt) = @_; + $mt->Open(\*INFILE, $file) or Warn("Error opening file $file\n"), return 0; + binmode(INFILE); + # (CAREFUL!: must clear buffer first to reset possible utf8 flag because the data + # would be corrupted if it was read into a buffer which had the utf8 flag set!) + undef $$buffPt; + my $bsize = 1024 * 1024; + my $num = read(INFILE, $$buffPt, $bsize); + unless (defined $num) { + close(INFILE); + Warn("Error reading $file\n"); + return 0; + } + my $bmax = 64 * $bsize; + while ($num == $bsize) { + $bsize *= 2 if $bsize < $bmax; + my $buff; + $num = read(INFILE, $buff, $bsize); + last unless $num; + $$buffPt .= $buff; + } + close(INFILE); + return 1; +} + + +#------------------------------------------------------------------------------ +# Filter argfile line +# Inputs: 0) line of argfile +# Returns: filtered line or undef to ignore +sub FilterArgfileLine($) +{ + my $arg = shift; + if ($arg =~ /^#/) { # comment lines begin with '#' + return undef unless $arg =~ s/^#\[CSTR\]//; + $arg =~ s/[\x0d\x0a]+$//s; # remove trailing newline + # escape double quotes, dollar signs and ampersands if they aren't already + # escaped by an odd number of backslashes, and escape a single backslash + # if it occurs at the end of the string + $arg =~ s{\\(.)|(["\$\@]|\\$)}{'\\'.($2 || $1)}sge; + # un-escape characters in C string + my %esc = ( a => "\a", b => "\b", f => "\f", n => "\n", + r => "\r", t => "\t", '"' => '"', '\\' => '\\' ); + $arg =~ s/\\(.)/$esc{$1}||'\\'.$1/egs; + } else { + $arg =~ s/^\s+//; # remove leading white space + $arg =~ s/[\x0d\x0a]+$//s; # remove trailing newline + # remove white space before, and single space after '=', '+=', '-=' or '<=' + $arg =~ s/^(-[-:\w]+#?)\s*([-+<]?=) ?/$1$2/; + return undef if $arg eq ''; + } + return $arg; +} + +#------------------------------------------------------------------------------ +# Read arguments from -stay_open argfile +# Inputs: 0) argument list ref +# Notes: blocks until -execute, -stay_open or -@ option is available +# (or until there was an error reading from the file) +sub ReadStayOpen($) +{ + my $args = shift; + my (@newArgs, $processArgs, $result, $optArgs); + my $lastOpt = ''; + my $unparsed = length $stayOpenBuff; + for (;;) { + if ($unparsed) { + # parse data already read from argfile + $result = $unparsed; + undef $unparsed; + } else { + # read more data from argfile + # - this read may block (which is good) if reading from a pipe + $result = sysread(STAYOPEN, $stayOpenBuff, 65536, length($stayOpenBuff)); + } + if ($result) { + my $pos = 0; + while ($stayOpenBuff =~ /\n/g) { + my $len = pos($stayOpenBuff) - $pos; + my $arg = substr($stayOpenBuff, $pos, $len); + $pos += $len; + $arg = FilterArgfileLine($arg); + next unless defined $arg; + push @newArgs, $arg; + if ($optArgs) { + # this is an argument for the last option + undef $optArgs; + next unless $lastOpt eq '-stay_open' or $lastOpt eq '-@'; + } else { + $optArgs = $optArgs{$arg}; + $lastOpt = lc $arg; + $optArgs = $optArgs{$lastOpt} unless defined $optArgs; + next unless $lastOpt =~ /^-execute\d*$/; + } + $processArgs = 1; + last; # process arguments up to this point + } + next unless $pos; # nothing to do if we didn't read any arguments + # keep unprocessed data in buffer + $stayOpenBuff = substr($stayOpenBuff, $pos); + if ($processArgs) { + # process new arguments after -execute or -stay_open option + unshift @$args, @newArgs; + last; + } + } elsif ($result == 0) { + # sysread() didn't block (eg. when reading from a file), + # so wait for a short time (1/100 sec) then try again + # Note: may break out of this early if SIGCONT is received + select(undef,undef,undef,0.01); + } else { + Warn "Error reading from ARGFILE\n"; + close STAYOPEN; + $stayOpen = 0; + last; + } + } +} + +#------------------------------------------------------------------------------ +# Add new entry to -efile output file +# Inputs: 0) file name, 1) -efile option number (0=error, 1=same, 2=failed) +sub EFile($$) +{ + my $entry = shift; + my $efile = $efile[shift || 0]; + if (defined $efile and length $entry and $entry ne '-') { + my $err; + CreateDirectory($efile); + if ($mt->Open(\*EFILE_FILE, $efile, '>>')) { + print EFILE_FILE $entry, "\n" or Warn("Error writing to $efile\n"), $err = 1; + close EFILE_FILE; + } else { + Warn("Error opening '${efile}' for append\n"); + $err = 1; + } + if ($err) { + defined $_ and $_ eq $efile and undef $_ foreach @efile; + } + } +} + +#------------------------------------------------------------------------------ +# Print list of tags +# Inputs: 0) message, 1-N) list of tag names +sub PrintTagList($@) +{ + my $msg = shift; + print $msg, ":\n" unless $quiet; + my $tag; + if ($outFormat < 0 and $msg =~ /file extensions$/ and @_) { + foreach $tag (@_) { + printf(" %-11s %s\n", $tag, GetFileType($tag, 1)); + } + return; + } + my ($len, $pad) = (0, $quiet ? '' : ' '); + foreach $tag (@_) { + my $taglen = length($tag); + if ($len + $taglen > 77) { + print "\n"; + ($len, $pad) = (0, $quiet ? '' : ' '); + } + print $pad, $tag; + $len += $taglen + 1; + $pad = ' '; + } + @_ or print $pad, '[empty list]'; + print "\n"; +} + +#------------------------------------------------------------------------------ +# Print warnings and errors from info hash +# Inputs: 0) ExifTool object ref, 1) info hash, 2) file name +# Returns: true if there was an Error +sub PrintErrors($$$) +{ + my ($et, $info, $file) = @_; + my ($tag, $key); + foreach $tag (qw(Warning Error)) { + next unless $$info{$tag}; + my @keys = ( $tag ); + push @keys, sort(grep /^$tag /, keys %$info) if $et->Options('Duplicates'); + foreach $key (@keys) { + Warn "$tag: $info->{$key} - $file\n"; + } + } + return $$info{Error}; +} + +__END__ + +=head1 NAME + +exiftool - Read and write meta information in files + +=head1 SYNOPSIS + +=head2 Reading + +B [I] [-I...] [--I...] I... + +=head2 Writing + +B [I] -I[+-E]=[I]... I... + +=head2 Copying + +B [I] B<-tagsFromFile> I +[-[IE]I...] I... + +=head2 Other + +B [ B<-ver> | +B<-list>[B|B|B|B|B[I]|B|B] ] + +For specific examples, see the L sections below. + +This documentation is displayed if exiftool is run without an input I +when one is expected. + +=head1 DESCRIPTION + +A command-line interface to L, used for +reading and writing meta information in a variety of file types. I is +one or more source file names, directory names, or C<-> for the standard +input. Metadata is read from source files and printed in readable form to +the console (or written to output text files with B<-w>). + +To write or delete metadata, tag values are assigned using +-I=[I], and/or the B<-geotag>, B<-csv=> or B<-json=> options. +To copy or move metadata, the B<-tagsFromFile> feature is used. By default +the original files are preserved with C<_original> appended to their names +-- be sure to verify that the new files are OK before erasing the originals. +Once in write mode, exiftool will ignore any read-specific options. + +Note: If I is a directory name then only supported file types in the +directory are processed (in write mode only writable types are processed). +However, files may be specified by name, or the B<-ext> option may be used +to force processing of files with any extension. Hidden files in the +directory are also processed. Adding the B<-r> option causes subdirectories +to be processed recursively, but subdirectories with names beginning with +"." are skipped unless B<-r.> is used. + +Below is a list of file types and meta information formats currently +supported by ExifTool (r = read, w = write, c = create): + + File Types + ------------+-------------+-------------+-------------+------------ + 360 r/w | DR4 r/w/c | JNG r/w | O r | RAW r/w + 3FR r | DSS r | JP2 r/w | ODP r | RIFF r + 3G2 r/w | DV r | JPEG r/w | ODS r | RSRC r + 3GP r/w | DVB r/w | JSON r | ODT r | RTF r + A r | DVR-MS r | JXL r | OFR r | RW2 r/w + AA r | DYLIB r | K25 r | OGG r | RWL r/w + AAE r | EIP r | KDC r | OGV r | RWZ r + AAX r/w | EPS r/w | KEY r | ONP r | RM r + ACR r | EPUB r | LA r | OPUS r | SEQ r + AFM r | ERF r/w | LFP r | ORF r/w | SKETCH r + AI r/w | EXE r | LIF r | ORI r/w | SO r + AIFF r | EXIF r/w/c | LNK r | OTF r | SR2 r/w + APE r | EXR r | LRV r/w | PAC r | SRF r + ARQ r/w | EXV r/w/c | M2TS r | PAGES r | SRW r/w + ARW r/w | F4A/V r/w | M4A/V r/w | PBM r/w | SVG r + ASF r | FFF r/w | MACOS r | PCD r | SWF r + AVI r | FITS r | MAX r | PCX r | THM r/w + AVIF r/w | FLA r | MEF r/w | PDB r | TIFF r/w + AZW r | FLAC r | MIE r/w/ | PDF r/w | TORRENT r + BMP r | FLIF r/w | MIFF r c | PEF r/w | TTC r + BPG r | FLV r | MKA r | PFA r | TTF r + BTF r | FPF r | MKS r | PFB r | TXT r + CHM r | FPX r | MKV r | PFM r | VCF r + COS r | GIF r/w | MNG r/w | PGF r | VRD r/w/c + CR2 r/w | GPR r/w | MOBI r | PGM r/w | VSD r + CR3 r/w | GZ r | MODD r | PLIST r | WAV r + CRM r/w | HDP r/w | MOI r | PICT r | WDP r/w + CRW r/w | HDR r | MOS r/w | PMP r | WEBP r + CS1 r/w | HEIC r/w | MOV r/w | PNG r/w | WEBM r + CSV r | HEIF r/w | MP3 r | PPM r/w | WMA r + CZI r | HTML r | MP4 r/w | PPT r | WMV r + DCM r | ICC r/w/c | MPC r | PPTX r | WTV r + DCP r/w | ICS r | MPG r | PS r/w | WV r + DCR r | IDML r | MPO r/w | PSB r/w | X3F r/w + DFONT r | IIQ r/w | MQV r/w | PSD r/w | XCF r + DIVX r | IND r/w | MRC r | PSP r | XLS r + DJVU r | INSP r/w | MRW r/w | QTIF r/w | XLSX r + DLL r | INSV r | MXF r | R3D r | XMP r/w/c + DNG r/w | INX r | NEF r/w | RA r | ZIP r + DOC r | ISO r | NKSC r/w | RAF r/w | + DOCX r | ITC r | NRW r/w | RAM r | + DPX r | J2C r | NUMBERS r | RAR r | + + Meta Information + ----------------------+----------------------+--------------------- + EXIF r/w/c | CIFF r/w | Ricoh RMETA r + GPS r/w/c | AFCP r/w | Picture Info r + IPTC r/w/c | Kodak Meta r/w | Adobe APP14 r + XMP r/w/c | FotoStation r/w | MPF r + MakerNotes r/w/c | PhotoMechanic r/w | Stim r + Photoshop IRB r/w/c | JPEG 2000 r | DPX r + ICC Profile r/w/c | DICOM r | APE r + MIE r/w/c | Flash r | Vorbis r + JFIF r/w/c | FlashPix r | SPIFF r + Ducky APP12 r/w/c | QuickTime r | DjVu r + PDF r/w/c | Matroska r | M2TS r + PNG r/w/c | MXF r | PE/COFF r + Canon VRD r/w/c | PrintIM r | AVCHD r + Nikon Capture r/w/c | FLAC r | ZIP r + GeoTIFF r/w/c | ID3 r | (and more) + +=head1 OPTIONS + +Case is not significant for any command-line option (including tag and group +names), except for single-character options when the corresponding +upper-case option exists. Many single-character options have equivalent +long-name versions (shown in brackets), and some options have inverses which +are invoked with a leading double-dash. Unrecognized options are +interpreted as tag names (for this reason, multiple single-character options +may NOT be combined into one argument). Contrary to standard practice, +options may appear after source file names on the exiftool command line. + +=head2 Option Overview + +L + + -TAG or --TAG Extract or exclude specified tag + -TAG[+-^]=[VALUE] Write new value for tag + -TAG[+-]<=DATFILE Write tag value from contents of file + -TAG[+-] + + -args (-argFormat) Format metadata as exiftool arguments + -b (-binary) Output metadata in binary format + -c FMT (-coordFormat) Set format for GPS coordinates + -charset [[TYPE=]CHARSET] Specify encoding for special characters + -csv[[+]=CSVFILE] Export/import tags in CSV format + -csvDelim STR Set delimiter for CSV file + -d FMT (-dateFormat) Set format for date/time values + -D (-decimal) Show tag ID numbers in decimal + -E,-ex,-ec (-escape(HTML|XML|C))Escape tag values for HTML, XML or C + -f (-forcePrint) Force printing of all specified tags + -g[NUM...] (-groupHeadings) Organize output by tag group + -G[NUM...] (-groupNames) Print group name for each tag + -h (-htmlFormat) Use HTML formatting for output + -H (-hex) Show tag ID numbers in hexadecimal + -htmlDump[OFFSET] Generate HTML-format binary dump + -j[[+]=JSONFILE] (-json) Export/import tags in JSON format + -l (-long) Use long 2-line output format + -L (-latin) Use Windows Latin1 encoding + -lang [LANG] Set current language + -listItem INDEX Extract specific item from a list + -n (--printConv) No print conversion + -p FMTFILE (-printFormat) Print output in specified format + -php Export tags as a PHP Array + -s[NUM] (-short) Short output format + -S (-veryShort) Very short output format + -sep STR (-separator) Set separator string for list items + -sort Sort output alphabetically + -struct Enable output of structured information + -t (-tab) Output in tab-delimited list format + -T (-table) Output in tabular format + -v[NUM] (-verbose) Print verbose messages + -w[+|!] EXT (-textOut) Write (or overwrite!) output text files + -W[+|!] FMT (-tagOut) Write output text file for each tag + -Wext EXT (-tagOutExt) Write only specified file types with -W + -X (-xmlFormat) Use RDF/XML output format + +L + + -a (-duplicates) Allow duplicate tags to be extracted + -e (--composite) Do not generate composite tags + -ee[NUM] (-extractEmbedded) Extract information from embedded files + -ext[+] EXT (-extension) Process files with specified extension + -F[OFFSET] (-fixBase) Fix the base for maker notes offsets + -fast[NUM] Increase speed when extracting metadata + -fileOrder[NUM] [-]TAG Set file processing order + -i DIR (-ignore) Ignore specified directory name + -if[NUM] EXPR Conditionally process files + -m (-ignoreMinorErrors) Ignore minor errors and warnings + -o OUTFILE (-out) Set output file or directory name + -overwrite_original Overwrite original by renaming tmp file + -overwrite_original_in_place Overwrite original by copying tmp file + -P (-preserve) Preserve file modification date/time + -password PASSWD Password for processing protected files + -progress[:[TITLE]] Show file progress count + -q (-quiet) Quiet processing + -r[.] (-recurse) Recursively process subdirectories + -scanForXMP Brute force XMP scan + -u (-unknown) Extract unknown tags + -U (-unknown2) Extract unknown binary tags too + -wm MODE (-writeMode) Set mode for writing/creating tags + -z (-zip) Read/write compressed information + +L + + -@ ARGFILE Read command-line arguments from file + -k (-pause) Pause before terminating + -list[w|f|wf|g[NUM]|d|x] List various exiftool capabilities + -ver Print exiftool version number + -- End of options + +L + + -geotag TRKFILE Geotag images from specified GPS log + -globalTimeShift SHIFT Shift all formatted date/time values + -use MODULE Add features from plug-in module + +L + + -delete_original[!] Delete "_original" backups + -restore_original Restore from "_original" backups + +L + + -api OPT[[^]=[VAL]] Set ExifTool API option + -common_args Define common arguments + -config CFGFILE Specify configuration file name + -echo[NUM] TEXT Echo text to stdout or stderr + -efile[NUM][!] ERRFILE Save names of files with errors + -execute[NUM] Execute multiple commands on one line + -list_dir List directories, not their contents + -srcfile FMT Process a different source file + -stay_open FLAG Keep reading -@ argfile even after EOF + -userParam PARAM[[^]=[VAL]] Set user parameter (API UserParam opt) + +=head2 Option Details + +=head3 Tag operations + +=over 5 + +=item B<->I + +Extract information for the specified tag (eg. C<-CreateDate>). Multiple +tags may be specified in a single command. A tag name is the handle by +which a piece of information is referenced. See +L for documentation on +available tag names. A tag name may include leading group names separated +by colons (eg. C<-EXIF:CreateDate>, or C<-Doc1:XMP:Creator>), and each group +name may be prefixed by a digit to specify family number (eg. +C<-1IPTC:City>). Use the B<-listg> option to list available group names by +family. + +A special tag name of C may be used to indicate all meta information +(ie. B<-All>). This is particularly useful when a group name is specified +to extract all information in a group (but beware that unless the B<-a> +option is also used, some tags in the group may be suppressed by same-named +tags in other groups). The wildcard characters C and C<*> may be used in +a tag name to match any single character and zero or more characters +respectively. These may not be used in a group name, with the exception that +a group name of C<*> (or C) may be used to extract all instances of a +tag (as if B<-a> was used). Note that arguments containing wildcards must +be quoted on the command line of most systems to prevent shell globbing. + +A C<#> may be appended to the tag name to disable the print conversion on a +per-tag basis (see the B<-n> option). This may also be used when writing or +copying tags. + +If no tags are specified, all available information is extracted (as if +C<-All> had been specified). + +Note: Descriptions, not tag names, are shown by default when extracting +information. Use the B<-s> option to see the tag names instead. + +=item B<-->I + +Exclude specified tag from extracted information. Same as the B<-x> option. +Group names and wildcards are permitted as described above for B<-TAG>. +Once excluded from the output, a tag may not be re-included by a subsequent +option. May also be used following a B<-tagsFromFile> option to exclude +tags from being copied (when redirecting to another tag, it is the source +tag that should be excluded), or to exclude groups from being deleted when +deleting all information (eg. C<-all= --exif:all> deletes all but EXIF +information). But note that this will not exclude individual tags from a +group delete (unless a family 2 group is specified, see note 4 below). +Instead, individual tags may be recovered using the B<-tagsFromFile> option +(eg. C<-all= -tagsfromfile @ -artist>). + +To speed processing when reading XMP, exclusions in XMP groups also bypass +processing of the corresponding XMP property and any contained properties. +For example, C<--xmp-crs:all> may speed processing significantly in cases +where a large number of XMP-crs tags exist. To use this feature to bypass +processing of a specific XMP property, the property name must be used +instead of the ExifTool tag name (eg. C<--xmp-crs:dabs>). Also, C +may be used to to indicate any XMP namespace (eg. ). + +=item B<->I[+-^]B<=>[I] + +Write a new value for the specified tag (eg. C<-comment=wow>), or delete the +tag if no I is given (eg. C<-comment=>). C<+=> and C<-=> are used to +add or remove existing entries from a list, or to shift date/time values +(see L and note 6 below +for more details). C<+=> may also be used to increment numerical values (or +decrement if I is negative), and C<-=> may be used to conditionally +delete or replace a tag (see L for examples). C<^=> is +used to write an empty string instead of deleting the tag when no I +is given, but otherwise it is equivalent to C<=>, but note that the caret +must be quoted on the Windows command line. + +I may contain one or more leading family 0, 1, 2 or 7 group names, +prefixed by optional family numbers, and separated colons. If no group name +is specified, the tag is created in the preferred group, and updated in any +other location where a same-named tag already exists. The preferred group +in JPEG and TIFF-format images is the first group in the following list +where I is valid: 1) EXIF, 2) IPTC, 3) XMP. + +The wildcards C<*> and C may be used in tag names to assign the same +value to multiple tags. When specified with wildcards, "Unsafe" tags are +not written. A tag name of C is equivalent to C<*> (except that it +doesn't require quoting, while arguments with wildcards do on systems with +shell globbing), and is often used when deleting all metadata (ie. C<-All=>) +or an entire group (eg. C<-XMP-dc:All=>, see note 4 below). Note that not +all groups are deletable, and that the JPEG APP14 "Adobe" group is not +removed by default with C<-All=> because it may affect the appearance of the +image. However, color space information is removed, so the colors may be +affected (but this may be avoided by copying back the tags defined by the +ColorSpaceTags shortcut). Use the B<-listd> option for a complete list of +deletable groups, and see note 5 below regarding the "APP" groups. Also, +within an image some groups may be contained within others, and these groups +are removed if the containing group is deleted: + + JPEG Image: + - Deleting EXIF or IFD0 also deletes ExifIFD, GlobParamIFD, + GPS, IFD1, InteropIFD, MakerNotes, PrintIM and SubIFD. + - Deleting ExifIFD also deletes InteropIFD and MakerNotes. + - Deleting Photoshop also deletes IPTC. + + TIFF Image: + - Deleting EXIF only removes ExifIFD which also deletes + InteropIFD and MakerNotes. + +Notes: + +1) B. If two +assignments affect the same tag, the latter takes precedence (except for +list-type tags, for which both values are written). + +2) In general, MakerNotes tags are considered "Permanent", and may be edited +but not created or deleted individually. This avoids many potential +problems, including the inevitable compatibility problems with OEM software +which may be very inflexible about the information it expects to find in the +maker notes. + +3) Changes to PDF files by ExifTool are reversible (by deleting the update +with C<-PDF-update:all=>) because the original information is never actually +deleted from the file. So ExifTool alone may not be used to securely edit +metadata in PDF files. + +4) Specifying C<-GROUP:all=> deletes the entire group as a block only if a +single family 0 or 1 group is specified. Otherwise all deletable tags in +the specified group(s) are removed individually, and in this case is it +possible to exclude individual tags from a mass delete. For example, +C<-time:all --Exif:Time:All> removes all deletable Time tags except those in +the EXIF. This difference also applies if family 2 is specified when +deleting all groups. For example, C<-2all:all=> deletes tags individually, +while C<-all:all=> deletes entire blocks. + +5) The "APP" group names ("APP0" through "APP15") are used to delete JPEG +application segments which are not associated with another deletable group. +For example, specifying C<-APP14:All=> will NOT delete the APP14 "Adobe" +segment because this is accomplished with C<-Adobe:All>. + +6) When shifting a value, the shift is applied to the original value of the +tag, overriding any other values previously assigned to the tag on the same +command line. To shift a date/time value and copy it to another tag in the +same operation, use the B<-globalTimeShift> option. + +Special feature: Integer values may be specified in hexadecimal with a +leading C<0x>, and simple rational values may be specified as fractions. + +=item B<->IE=I or B<->IE=I + +Set the value of a tag from the contents of file I. The file name +may also be given by a I string where %d, %f and %e represent the +directory, file name and extension of the original I (see the B<-w> +option for more details). Note that quotes are required around this +argument to prevent shell redirection since it contains a C> symbol. +If I/I is not provided, the effect is the same as C<-TAG=>, +and the tag is simply deleted. C<+E=> or C<-E=> may also be used to +add or delete specific list entries, or to shift date/time values. + +=item B<-tagsFromFile> I or I + +Copy tag values from I to I. Tag names on the command line +after this option specify the tags to be copied, or excluded from the copy. +Wildcards are permitted in these tag names. If no tags are specified, then +all possible tags (see note 1 below) from the source file are copied to +same-named tags in the preferred location of the output file (the same as +specifying C<-all>). More than one B<-tagsFromFile> option may be used to +copy tags from multiple files. + +By default, this option will update any existing and writable same-named +tags in the output I, but will create new tags only in their preferred +groups. This allows some information to be automatically transferred to the +appropriate group when copying between images of different formats. However, +if a group name is specified for a tag then the information is written only +to this group (unless redirected to another group, see below). If C is +used as a group name, then the specified tag(s) are written to the same +family 1 group they had in the source file (ie. the same specific location, +like ExifIFD or XMP-dc). For example, the common operation of copying all +writable tags to the same specific locations in the output I is +achieved by adding C<-all:all>. A different family may be specified by +adding a leading family number to the group name (eg. C<-0all:all> preserves +the same general location, like EXIF or XMP). + +I may be the same as I to move information around within a +single file. In this case, C<@> may be used to represent the source file +(ie. C<-tagsFromFile @>), permitting this feature to be used for batch +processing multiple files. Specified tags are then copied from each file in +turn as it is rewritten. For advanced batch use, the source file name may +also be specified using a I string in which %d, %f and %e represent the +directory, file name and extension of I. (eg. the current I +would be represented by C<%d%f.%e>, with the same effect as C<@>). See the +B<-w> option for I string examples. + +A powerful redirection feature allows a destination tag to be specified for +each copied tag. With this feature, information may be written to a tag +with a different name or group. This is done using +E'-IEI'E or +E'-IEI'E on the command line after +B<-tagsFromFile>, and causes the value of I to be copied from +I and written to I in I. Has no effect unless +I exists in I. Note that this argument must be quoted to +prevent shell redirection, and there is no C<=> sign as when assigning new +values. Source and/or destination tags may be prefixed by a group name +and/or suffixed by C<#>. Wildcards are allowed in both the source and +destination tag names. A destination group and/or tag name of C or +C<*> writes to the same family 1 group and/or tag name as the source. If no +destination group is specified, the information is written to the preferred +group. Whitespace around the C> or C> is ignored. As a +convenience, C<-tagsFromFile @> is assumed for any redirected tags which are +specified without a prior B<-tagsFromFile> option. Copied tags may also be +added or deleted from a list with arguments of the form +E'-I+EI'E or +E'-I-EI'E (but see Note 5 below). + +An extension of the redirection feature allows strings involving tag names +to be used on the right hand side of the C> symbol with the syntax +E'-IEI'E, where tag names in I are +prefixed with a C<$> symbol. See the B<-p> option and the +L section for more details about this syntax. +Strings starting with a C<=> sign must insert a single space after the +C> to avoid confusion with the C=> operator which sets the tag +value from the contents of a file. A single space at the start of the +string is removed if it exists, but all other whitespace in the string is +preserved. See note 8 below about using the redirection feature with +list-type stags, shortcuts or when using wildcards in tag names. + +See L for examples using B<-tagsFromFile>. + +Notes: + +1) Some tags (generally tags which may affect the appearance of the image) +are considered "Unsafe" to write, and are only copied if specified +explicitly (ie. no wildcards). See the +L for more details about +"Unsafe" tags. + +2) Be aware of the difference between excluding a tag from being copied +(--I), and deleting a tag (-I=). Excluding a tag prevents it from +being copied to the destination image, but deleting will remove a +pre-existing tag from the image. + +3) The maker note information is copied as a block, so it isn't affected +like other information by subsequent tag assignments on the command line, +and individual makernote tags may not be excluded from a block copy. Also, +since the PreviewImage referenced from the maker notes may be rather large, +it is not copied, and must be transferred separately if desired. + +4) The order of operations is to copy all specified tags at the point of the +B<-tagsFromFile> option in the command line. Any tag assignment to the +right of the B<-tagsFromFile> option is made after all tags are copied. For +example, new tag values are set in the order One, Two, Three then Four with +this command: + + exiftool -One=1 -tagsFromFile s.jpg -Two -Four=4 -Three d.jpg + +This is significant in the case where an overlap exists between the copied +and assigned tags because later operations may override earlier ones. + +5) The normal behaviour of copied tags differs from that of assigned tags +for list-type tags and conditional replacements because each copy operation +on a tag overrides any previous operations. While this avoids duplicate +list items when copying groups of tags from a file containing redundant +information, it also prevents values of different tags from being copied +into the same list when this is the intent. So a B<-addTagsFromFile> option +is provided which allows copying of multiple tags into the same list. eg) + + exiftool -addtagsfromfile @ '-subject must be used when conditionally replacing a +tag to prevent overriding earlier conditions. + +Other than these differences, the B<-tagsFromFile> and B<-addTagsFromFile> +options are equivalent. + +6) The B<-a> option (allow duplicate tags) is always in effect when copying +tags from I, but the highest priority tag is always copied last so +it takes precedence. + +7) Structured tags are copied by default when copying tags. See the +B<-struct> option for details. + +8) With the redirection feature, copying a tag directly (ie. +E'-IEI'E) is not the same as interpolating +its value inside a string (ie. E'-IE$I'E) +for list-type tags, L, tag names +containing wildcards, or UserParam variables. When copying directly, the +values of each matching source tag are copied individually to the +destination tag (as if they were separate assignments). However, when +interpolated inside a string, list items and the values of shortcut tags are +concatenated (with a separator set by the B<-sep> option), and wildcards are +not allowed. Also, UserParam variables are available only when interpolated +in a string. Another difference is that a minor warning is generated if a +tag doesn't exist when interpolating its value in a string (with C<$>), but +isn't when copying the tag directly. + +Finally, the behaviour is different when a destination tag or group of +C is used. When copying directly, a destination group and/or tag name +of C writes to the same family 1 group and/or tag name as the source. +But when interpolated in a string, the identity of the source tags are lost +and the value is written to all possible groups/tags. For example, the +string form must be used in the following command since the intent is to set +the value of all existing date/time tags from C: + + exiftool '-time:all<$createdate' -wm w FILE + +=item B<-x> I (B<-exclude>) + +Exclude the specified tag. There may be multiple B<-x> options. This has +the same effect as --I on the command line. See the --I +documentation above for a complete description. + +=back + +=head3 Input-output text formatting + +Note that trailing spaces are removed from extracted values for most output +text formats. The exceptions are B<-b>, B<-csv>, B<-j> and B<-X>. + +=over 5 + +=item B<-args> (B<-argFormat>) + +Output information in the form of exiftool arguments, suitable for use with +the B<-@> option when writing. May be combined with the B<-G> option to +include group names. This feature may be used to effectively copy tags +between images, but allows the metadata to be altered by editing the +intermediate file (C in this example): + + exiftool -args -G1 --filename --directory src.jpg > out.args + exiftool -@ out.args -sep ', ' dst.jpg + +Note: Be careful when copying information with this technique since it is +easy to write tags which are normally considered "Unsafe". For instance, +the FileName and Directory tags are excluded in the example above to avoid +renaming and moving the destination file. Also note that the second command +above will produce warning messages for any tags which are not writable. + +As well, the B<-sep> option should be used as in the second command above to +maintain separate list items when writing metadata back to image files, and +the B<-struct> option may be used when extracting to preserve structured XMP +information. + +=item B<-b>, B<--b> (B<-binary>, B<--binary>) + +Output requested metadata in binary format without tag names or descriptions +(B<-b> or B<-binary>). This option is mainly used for extracting embedded +images or other binary data, but it may also be useful for some text strings +since control characters (such as newlines) are not replaced by '.' as they +are in the default output. By default, list items are separated by a +newline when extracted with the B<-b> option, but this may be changed (see +the B<-sep> option for details). May be combined with B<-j>, B<-php> or +B<-X> to extract binary data in JSON, PHP or XML format, but note that +"Unsafe" tags are not extracted as binary unless they are specified explicitly or +the API RequestAll option is set to 3 or higher. + +With a leading double dash (B<--b> or B<--binary>), tags which contain +binary data are suppressed in the output when reading. + +=item B<-c> I (B<-coordFormat>) + +Set the print format for GPS coordinates. I uses the same syntax as +a C format string. The specifiers correspond to degrees, minutes +and seconds in that order, but minutes and seconds are optional. For +example, the following table gives the output for the same coordinate using +various formats: + + FMT Output + ------------------- ------------------ + "%d deg %d' %.2f"\" 54 deg 59' 22.80" (default for reading) + "%d %d %.8f" 54 59 22.80000000 (default for copying) + "%d deg %.4f min" 54 deg 59.3800 min + "%.6f degrees" 54.989667 degrees + +Notes: + +1) To avoid loss of precision, the default coordinate format is different +when copying tags using the B<-tagsFromFile> option. + +2) If the hemisphere is known, a reference direction (N, S, E or W) is +appended to each printed coordinate, but adding a C<+> to the format +specifier (eg. C<%+.6f>) prints a signed coordinate instead. + +3) This print formatting may be disabled with the B<-n> option to extract +coordinates as signed decimal degrees. + +=item B<-charset> [[I=]I] + +If I is C or not specified, this option sets the ExifTool +character encoding for output tag values when reading and input values when +writing, with a default of C. If no I is given, a list of +available character sets is returned. Valid I values are: + + CHARSET Alias(es) Description + ---------- --------------- ---------------------------------- + UTF8 cp65001, UTF-8 UTF-8 characters (default) + Latin cp1252, Latin1 Windows Latin1 (West European) + Latin2 cp1250 Windows Latin2 (Central European) + Cyrillic cp1251, Russian Windows Cyrillic + Greek cp1253 Windows Greek + Turkish cp1254 Windows Turkish + Hebrew cp1255 Windows Hebrew + Arabic cp1256 Windows Arabic + Baltic cp1257 Windows Baltic + Vietnam cp1258 Windows Vietnamese + Thai cp874 Windows Thai + DOSLatinUS cp437 DOS Latin US + DOSLatin1 cp850 DOS Latin1 + DOSCyrillic cp866 DOS Cyrillic + MacRoman cp10000, Roman Macintosh Roman + MacLatin2 cp10029 Macintosh Latin2 (Central Europe) + MacCyrillic cp10007 Macintosh Cyrillic + MacGreek cp10006 Macintosh Greek + MacTurkish cp10081 Macintosh Turkish + MacRomanian cp10010 Macintosh Romanian + MacIceland cp10079 Macintosh Icelandic + MacCroatian cp10082 Macintosh Croatian + +I may be C to specify the encoding of file names on the +command line (ie. I arguments). In Windows, this triggers use of +wide-character i/o routines, thus providing support for Unicode file names. +See the L section below for details. + +Other values of I listed below are used to specify the internal +encoding of various meta information formats. + + TYPE Description Default + --------- ------------------------------------------- ------- + EXIF Internal encoding of EXIF "ASCII" strings (none) + ID3 Internal encoding of ID3v1 information Latin + IPTC Internal IPTC encoding to assume when Latin + IPTC:CodedCharacterSet is not defined + Photoshop Internal encoding of Photoshop IRB strings Latin + QuickTime Internal encoding of QuickTime strings MacRoman + RIFF Internal encoding of RIFF strings 0 + +See L for more information about coded +character sets, and the L +for more details about the B<-charset> settings. + +=item B<-csv>[[+]=I] + +Export information in CSV format, or import information if I is +specified. When importing, the CSV file must be in exactly the same format +as the exported file. The first row of the I must be the ExifTool +tag names (with optional group names) for each column of the file, and +values must be separated by commas. A special "SourceFile" column specifies +the files associated with each row of information (and a SourceFile of "*" +may be used to define default tags to be imported for all files which are +combined with any tags specified for the specific SourceFile processed). The +B<-csvDelim> option may be used to change the input/output field delimiter +if something other than a comma is required. + +The following examples demonstrate basic use of the B<-csv> option: + + # generate CSV file with common tags from all images in a directory + exiftool -common -csv dir > out.csv + + # update metadata for all images in a directory from CSV file + exiftool -csv=a.csv dir + +When importing, empty values are ignored unless the B<-f> option is used and +the API MissingTagValue is set to an empty string (in which case the tag is +deleted). Also, FileName and Directory columns are ignored if they exist +(ie. ExifTool will not attempt to write these tags with a CSV import), but +all other columns are imported. To force a tag to be deleted, use the B<-f> +option and set the value to "-" in the CSV file (or to the MissingTagValue +if this API option was used). Multiple databases may be imported in a +single command. + +When exporting a CSV file, the B<-g> or B<-G> option adds group names to the +tag headings. If the B<-a> option is used to allow duplicate tag names, the +duplicate tags are only included in the CSV output if the column headings +are unique. Adding the B<-G4> option ensures a unique column heading for +each tag. The B<-b> option may be added to output binary data, encoded in +base64 if necessary (indicated by ASCII "base64:" as the first 7 bytes of +the value). Values may also be encoded in base64 if the B<-charset> option +is used and the value contains invalid characters. + +When exporting specific tags, the CSV columns are arranged in the same order +as the specified tags provided the column headings exactly match the +specified tag names, otherwise the columns are sorted in alphabetical order. + +When importing from a CSV file, only files specified on the command line are +processed. Any extra entries in the CSV file are ignored. + +List-type tags are stored as simple strings in a CSV file, but the B<-sep> +option may be used to split them back into separate items when importing. + +Special feature: B<-csv>+=I may be used to add items to existing +lists. This affects only list-type tags. Also applies to the B<-j> option. + +Note that this option is fundamentally different than all other output +format options because it requires information from all input files to be +buffered in memory before the output is written. This may result in +excessive memory usage when processing a very large number of files with a +single command. Also, it makes this option incompatible with the B<-w> +option. When processing a large number of files, it is recommended to +either use the JSON (B<-j>) or XML (B<-X>) output format, or use B<-p> to +generate a fixed-column CSV file instead of using the B<-csv> option. + +=item B<-csvDelim> I + +Set the delimiter for separating CSV entries for CSV file input/output via +the B<-csv> option. I may contain "\t", "\n", "\r" and "\\" to +represent TAB, LF, CR and '\' respectively. A double quote is not allowed +in the delimiter. Default is ','. + +=item B<-d> I (B<-dateFormat>) + +Set the format for date/time tag values. The I string may contain +formatting codes beginning with a percent character (C<%>) to represent the +various components of a date/time value. The specifics of the I syntax +are system dependent -- consult the C man page on your system for +details. The default format is equivalent to "%Y:%m:%d %H:%M:%S". This +option has no effect on date-only or time-only tags and ignores timezone +information if present. ExifTool adds a C<%f> format code to represent +fractional seconds, and supports an optional width to specify the number of +digits after the decimal point (eg. C<%3f> would give something like +C<.437>). Only one B<-d> option may be used per command. Requires +POSIX::strptime or Time::Piece for the inversion conversion when writing. + +=item B<-D> (B<-decimal>) + +Show tag ID number in decimal when extracting information. + +=item B<-E>, B<-ex>, B<-ec> (B<-escapeHTML>, B<-escapeXML>, B<-escapeC>) + +Escape characters in output tag values for HTML (B<-E>), XML (B<-ex>) or C +(B<-ec>). For HTML, all characters with Unicode code points above U+007F +are escaped as well as the following 5 characters: & (&) E<39> (') +E (") E (>) and E (<). For XML, only these 5 +characters are escaped. The B<-E> option is implied with B<-h>, and B<-ex> +is implied with B<-X>. For C, all control characters and the backslash are +escaped. The inverse conversion is applied when writing tags. + +=item B<-f> (B<-forcePrint>) + +Force printing of tags even if their values are not found. This option only +applies when specific tags are requested on the command line (ie. not with +wildcards or by C<-all>). With this option, a dash (C<->) is printed for +the value of any missing tag, but the dash may be changed via the API +MissingTagValue option. May also be used to add a 'flags' attribute to the +B<-listx> output, or to allow tags to be deleted when writing with the +B<-csv>=I feature. + +=item B<-g>[I][:I...] (B<-groupHeadings>) + +Organize output by tag group. I specifies a group family number, and +may be 0 (general location), 1 (specific location), 2 (category), 3 +(document number), 4 (instance number), 5 (metadata path), 6 (EXIF/TIFF +format) or 7 (tag ID). B<-g0> is assumed if a family number is not +specified. May be combined with other options to add group names to the +output. Multiple families may be specified by separating them with colons. +By default the resulting group name is simplified by removing any leading +C and collapsing adjacent identical group names, but this can be +avoided by placing a colon before the first family number (eg. B<-g:3:1>). +Use the B<-listg> option to list group names for a specified family. The +API SavePath and SaveFormat options are automatically enabled if the +respective family 5 or 6 group names are requested. See the +L for more information. + +=item B<-G>[I][:I...] (B<-groupNames>) + +Same as B<-g> but print group name for each tag. B<-G0> is assumed if +I is not specified. May be combined with a number of other options to +add group names to the output. Note that I may be added wherever B<-G> +is mentioned in the documentation. See the B<-g> option above for details. + +=item B<-h> (B<-htmlFormat>) + +Use HTML table formatting for output. Implies the B<-E> option. The +formatting options B<-D>, B<-H>, B<-g>, B<-G>, B<-l> and B<-s> may be used +in combination with B<-h> to influence the HTML format. + +=item B<-H> (B<-hex>) + +Show tag ID number in hexadecimal when extracting information. + +=item B<-htmlDump>[I] + +Generate a dynamic web page containing a hex dump of the EXIF information. +This can be a very powerful tool for low-level analysis of EXIF information. +The B<-htmlDump> option is also invoked if the B<-v> and B<-h> options are +used together. The verbose level controls the maximum length of the blocks +dumped. An I may be given to specify the base for displayed +offsets. If not provided, the EXIF/TIFF base offset is used. Use +B<-htmlDump0> for absolute offsets. Currently only EXIF/TIFF and JPEG +information is dumped, but the -u option can be used to give a raw hex dump +of other file formats. + +=item B<-j>[[+]=I] (B<-json>) + +Use JSON (JavaScript Object Notation) formatting for console output, or +import JSON file if I is specified. This option may be combined +with B<-g> to organize the output into objects by group, or B<-G> to add +group names to each tag. List-type tags with multiple items are output as +JSON arrays unless B<-sep> is used. By default XMP structures are flattened +into individual tags in the JSON output, but the original structure may be +preserved with the B<-struct> option (this also causes all list-type XMP +tags to be output as JSON arrays, otherwise single-item lists would be +output as simple strings). The B<-a> option is implied when B<-json> is +used, but entries with identical JSON names are suppressed in the output. +(B<-G4> may be used to ensure that all tags have unique JSON names.) Adding +the B<-D> or B<-H> option changes tag values to JSON objects with "val" and +"id" fields, and adding B<-l> adds a "desc" field, and a "num" field if the +numerical value is different from the converted "val". The B<-b> option may +be added to output binary data, encoded in base64 if necessary (indicated by +ASCII "base64:" as the first 7 bytes of the value), and B<-t> may be added +to include tag table information (see B<-t> for details). The JSON output +is UTF-8 regardless of any B<-L> or B<-charset> option setting, but the +UTF-8 validation is disabled if a character set other than UTF-8 is +specified. + +If I is specified, the file is imported and the tag definitions +from the file are used to set tag values on a per-file basis. The special +"SourceFile" entry in each JSON object associates the information with a +specific target file. An object with a missing SourceFile or a SourceFile +of "*" defines default tags for all target files which are combined with any +tags specified for the specific SourceFile processed. The imported JSON +file must have the same format as the exported JSON files with the exception +that the B<-g> option is not compatible with the import file format (use +B<-G> instead). Additionally, tag names in the input JSON file may be +suffixed with a C<#> to disable print conversion. + +Unlike CSV import, empty values are not ignored, and will cause an empty +value to be written if supported by the specific metadata type. Tags are +deleted by using the B<-f> option and setting the tag value to "-" (or to +the MissingTagValue setting if this API option was used). Importing with +B<-j>+=I causes new values to be added to existing lists. + +=item B<-l> (B<-long>) + +Use long 2-line Canon-style output format. Adds a description and +unconverted value (if it is different from the converted value) to the XML, +JSON or PHP output when B<-X>, B<-j> or B<-php> is used. May also be +combined with B<-listf>, B<-listr> or B<-listwf> to add descriptions of the +file types. + +=item B<-L> (B<-latin>) + +Use Windows Latin1 encoding (cp1252) for output tag values instead of the +default UTF-8. When writing, B<-L> specifies that input text values are +Latin1 instead of UTF-8. Equivalent to C<-charset latin>. + +=item B<-lang> [I] + +Set current language for tag descriptions and converted values. I is +C, C, C, etc. Use B<-lang> with no other arguments to get a +list of available languages. The default language is C if B<-lang> is +not specified. Note that tag/group names are always English, independent of +the B<-lang> setting, and translation of warning/error messages has not yet +been implemented. May also be combined with B<-listx> to output +descriptions in one language only. + +By default, ExifTool uses UTF-8 encoding for special characters, but the +the B<-L> or B<-charset> option may be used to invoke other encodings. Note +that ExifTool uses Unicode::LineBreak if available to help preserve the +column alignment of the plain text output for languages with a +variable-width character set. + +Currently, the language support is not complete, but users are welcome to +help improve this by submitting their own translations. To submit a +translation, follow these steps (you must have Perl installed for this): + +1. Download and unpack the latest Image-ExifTool full distribution. + +2. 'cd' into the Image-ExifTool directory. + +3. Run this command to make an XML file of the desired tags (eg. EXIF): + + ./exiftool -listx -exif:all > out.xml + +4. Copy this text into a file called 'import.pl' in the exiftool directory: + + push @INC, 'lib'; + require Image::ExifTool::TagInfoXML; + my $file = shift or die "Expected XML file name\n"; + $Image::ExifTool::TagInfoXML::makeMissing = shift; + Image::ExifTool::TagInfoXML::BuildLangModules($file,8); + +5. Run the 'import.pl' script to Import the XML file, generating the +'MISSING' entries for your language (eg. Russian): + + perl import.pl out.xml ru + +6. Edit the generated language module lib/Image/ExifTool/Lang/ru.pm, and +search and replace all 'MISSING' strings in the file with your translations. + +7. Email the module ('ru.pm' in this example) to philharvey66 at gmail.com + +8. Thank you!! + +=item B<-listItem> I + +For list-type tags, this causes only the item with the specified index to be +extracted. I is 0 for the first item in the list. Negative indices +may also be used to reference items from the end of the list. Has no effect +on single-valued tags. Also applies to tag values when copying from a tag, +and in B<-if> conditions. + +=item B<-n> (B<--printConv>) + +Disable print conversion for all tags. By default, extracted values are +converted to a more human-readable format, but the B<-n> option disables +this conversion, revealing the machine-readable values. For example: + + > exiftool -Orientation -S a.jpg + Orientation: Rotate 90 CW + > exiftool -Orientation -S -n a.jpg + Orientation: 6 + +The print conversion may also be disabled on a per-tag basis by suffixing +the tag name with a C<#> character: + + > exiftool -Orientation# -Orientation -S a.jpg + Orientation: 6 + Orientation: Rotate 90 CW + +These techniques may also be used to disable the inverse print conversion +when writing. For example, the following commands all have the same effect: + + > exiftool -Orientation='Rotate 90 CW' a.jpg + > exiftool -Orientation=6 -n a.jpg + > exiftool -Orientation#=6 a.jpg + +=item B<-p> I or I (B<-printFormat>) + +Print output in the format specified by the given file or string. The +argument is interpreted as a string unless a file of that name exists, in +which case the string is loaded from the contents of the file. Tag names in +the format file or string begin with a C<$> symbol and may contain leading +group names and/or a trailing C<#> (to disable print conversion). Case is +not significant. Braces C<{}> may be used around the tag name to separate +it from subsequent text. Use C<$$> to represent a C<$> symbol, and C<$/> +for a newline. + +Multiple B<-p> options may be used, each contributing a line (or more) of +text to the output. Lines beginning with C<#[HEAD]> and C<#[TAIL]> are +output before the first processed file and after the last processed file +respectively. Lines beginning with C<#[SECT]> and C<#[ENDS]> are output +before and after each section of files. A section is defined as a group of +consecutive files with the same section header (eg. files are grouped by +directory if C<#[SECT]> contains C<$directory>). Lines beginning with +C<#[BODY]> and lines not beginning with C<#> are output for each processed +file. Lines beginning with C<#[IF]> are not output, but all BODY lines are +skipped if any tag on an IF line doesn't exist. Other lines beginning with +C<#> are ignored. (To output a line beginning with C<#>, use C<#[BODY]#>.) +For example, this format file: + + # this is a comment line + #[HEAD]-- Generated by ExifTool $exifToolVersion -- + File: $FileName - $DateTimeOriginal + (f/$Aperture, ${ShutterSpeed}s, ISO $EXIF:ISO) + #[TAIL]-- end -- + +with this command: + + exiftool -p test.fmt a.jpg b.jpg + +produces output like this: + + -- Generated by ExifTool 12.44 -- + File: a.jpg - 2003:10:31 15:44:19 + (f/5.6, 1/60s, ISO 100) + File: b.jpg - 2006:05:23 11:57:38 + (f/8.0, 1/13s, ISO 100) + -- end -- + +The values of List-type tags with multiple items and Shortcut tags +representing multiple tags are joined according the the B<-sep> option +setting when interpolated in the string. + +When B<-ee> (B<-extractEmbedded>) is combined with B<-p>, embedded documents +are effectively processed as separate input files. + +If a specified tag does not exist, a minor warning is issued and the line +with the missing tag is not printed. However, the B<-f> option may be used +to set the value of missing tags to '-' (but this may be configured via the +API MissingTagValue option), or the B<-m> option may be used to ignore minor +warnings and leave the missing values empty. Alternatively, B<-q -q> may be +used to simply suppress the warning messages. + +The L may be used to modify the values of +individual tags with the B<-p> option. + +=item B<-php> + +Format output as a PHP Array. The B<-g>, B<-G>, B<-D>, B<-H>, B<-l>, +B<-sep> and B<-struct> options combine with B<-php>, and duplicate tags are +handled in the same way as with the B<-json> option. As well, the B<-b> +option may be added to output binary data, and B<-t> may be added to include +tag table information (see B<-t> for details). Here is a simple example +showing how this could be used in a PHP script: + + + +=item B<-s>[I] (B<-short>) + +Short output format. Prints tag names instead of descriptions. Add I +or up to 3 B<-s> options for even shorter formats: + + -s1 or -s - print tag names instead of descriptions + -s2 or -s -s - no extra spaces to column-align values + -s3 or -s -s -s - print values only (no tag names) + +Also effective when combined with B<-t>, B<-h>, B<-X> or B<-listx> options. + +=item B<-S> (B<-veryShort>) + +Very short format. The same as B<-s2> or two B<-s> options. Tag names are +printed instead of descriptions, and no extra spaces are added to +column-align values. + +=item B<-sep> I (B<-separator>) + +Specify separator string for items in list-type tags. When reading, the +default is to join list items with ", ". When writing, this option causes +values assigned to list-type tags to be split into individual items at each +substring matching I (otherwise they are not split by default). Space +characters in I match zero or more whitespace characters in the value. + +Note that an empty separator ("") is allowed, and will join items with no +separator when reading, or split the value into individual characters when +writing. + +For pure binary output (B<-b> used without B<-j>, B<-php> or B<-X>), the +first B<-sep> option specifies a list-item separator, and a second B<-sep> +option specifies a terminator for the end of the list (or after each value +if not a list). In these strings, C<\n>, C<\r> and C<\t> may be used to +represent a newline, carriage return and tab respectively. By default, +binary list items are separated by a newline, and no terminator is added. + +=item B<-sort>, B<--sort> + +Sort output by tag description, or by tag name if the B<-s> option is used. +When sorting by description, the sort order will depend on the B<-lang> +option setting. Without the B<-sort> option, tags appear in the order they +were specified on the command line, or if not specified, the order they were +extracted from the file. By default, tags are organized by groups when +combined with the B<-g> or B<-G> option, but this grouping may be disabled +with B<--sort>. + +=item B<-struct>, B<--struct> + +Output structured XMP information instead of flattening to individual tags. +This option works well when combined with the XML (B<-X>) and JSON (B<-j>) +output formats. For other output formats, XMP structures and lists are +serialized into the same format as when writing structured information (see +L for details). When copying, structured +tags are copied by default unless B<--struct> is used to disable this +feature (although flattened tags may still be copied by specifying them +individually unless B<-struct> is used). These options have no effect when +assigning new values since both flattened and structured tags may always be +used when writing. + +=item B<-t> (B<-tab>) + +Output a tab-delimited list of description/values (useful for database +import). May be combined with B<-s> to print tag names instead of +descriptions, or B<-S> to print tag values only, tab-delimited on a single +line. The B<-t> option may be combined with B<-j>, B<-php> or B<-X> to add +tag table information (C, tag C, and C for cases where +multiple conditional tags exist with the same ID). + +=item B<-T> (B<-table>) + +Output tag values in table form. Equivalent to B<-t -S -q -f>. + +=item B<-v>[I] (B<-verbose>) + +Print verbose messages. I specifies the level of verbosity in the +range 0-5, with higher numbers being more verbose. If I is not given, +then each B<-v> option increases the level of verbosity by 1. With any +level greater than 0, most other options are ignored and normal console +output is suppressed unless specific tags are extracted. Using B<-v0> +causes the console output buffer to be flushed after each line (which may be +useful to avoid delays when piping exiftool output), and prints the name of +each processed file when writing and the new file name when renaming, +moving or copying. Verbose levels above B<-v0> do not flush after each +line. Also see the B<-progress> option. + +=item B<-w>[+|!] I or I (B<-textOut>) + +Write console output to files with names ending in I, one for each +source file. The output file name is obtained by replacing the source file +extension (including the '.') with the specified extension (and a '.' is +added to the start of I if it doesn't already contain one). +Alternatively, a I string may be used to give more control over the +output file name and directory. In the format string, %d, %f and %e +represent the directory, filename and extension of the source file, and %c +represents a copy number which is automatically incremented if the file +already exists. %d includes the trailing '/' if necessary, but %e does not +include the leading '.'. For example: + + -w %d%f.txt # same effect as "-w txt" + -w dir/%f_%e.out # write files to "dir" as "FILE_EXT.out" + -w dir2/%d%f.txt # write to "dir2", keeping dir structure + -w a%c.txt # write to "a.txt" or "a1.txt" or "a2.txt"... + +Existing files will not be changed unless an exclamation point is added to +the option name (ie. B<-w!> or B<-textOut!>) to overwrite the file, or a +plus sign (ie. B<-w+> or B<-textOut+>) to append to the existing file. Both +may be used (ie. B<-w+!> or B<-textOut+!>) to overwrite output files that +didn't exist before the command was run, and append the output from multiple +source files. For example, to write one output file for all source files in +each directory: + + exiftool -filename -createdate -T -w+! %d/out.txt -r DIR + +Capitalized format codes %D, %F, %E and %C provide slightly different +alternatives to the lower case versions. %D does not include the trailing +'/', %F is the full filename including extension, %E includes the leading +'.', and %C increments the count for each processed file (see below). + +Notes: + +1) In a Windows BAT file the C<%> character is represented by C<%%>, so an +argument like C<%d%f.txt> is written as C<%%d%%f.txt>. + +2) If the argument for B<-w> does not contain a valid format code (eg. %f), +then it is interpreted as a file extension, but there are three different +ways to create a single output file from multiple source files: + + # 1. Shell redirection + exiftool FILE1 FILE2 ... > out.txt + + # 2. With the -w option and a zero-width format code + exiftool -w+! %0fout.txt FILE1 FILE2 ... + + # 3. With the -W option (see the -W option below) + exiftool -W+! out.txt FILE1 FILE2 ... + +Advanced features: + +A substring of the original file name, directory or extension may be taken +by specifying a field width immediately following the '%' character. If the +width is negative, the substring is taken from the end. The substring +position (characters to ignore at the start or end of the string) may be +given by a second optional value after a decimal point. For example: + + Input File Name Format Specifier Output File Name + ---------------- ---------------- ---------------- + Picture-123.jpg %7f.txt Picture.txt + Picture-123.jpg %-.4f.out Picture.out + Picture-123.jpg %7f.%-3f Picture.123 + Picture-123a.jpg Meta%-3.1f.txt Meta123.txt + +(Note that special characters may have a width of greater than one.) + +For %d and %D, the field width/position specifiers may be applied to the +directory levels instead of substring position by using a colon instead of a +decimal point in the format specifier. For example: + + Source Dir Format Result Notes + ------------ ------ ---------- ------------------ + pics/2012/02 %2:d pics/2012/ take top 2 levels + pics/2012/02 %-:1d pics/2012/ up one directory level + pics/2012/02 %:1d 2012/02/ ignore top level + pics/2012/02 %1:1d 2012/ take 1 level after top + pics/2012/02 %-1:D 02 bottom level folder name + /Users/phil %:2d phil/ ignore top 2 levels + +(Note that the root directory counts as one level when an absolute path is +used as in the last example above.) + +For %c, these modifiers have a different effects. If a field width is +given, the copy number is padded with zeros to the specified width. A +leading '-' adds a dash before the copy number, and a '+' adds an underline. +By default, the copy number is omitted from the first file of a given name, +but this can be changed by adding a decimal point to the modifier. For +example: + + -w A%-cZ.txt # AZ.txt, A-1Z.txt, A-2Z.txt ... + -w B%5c.txt # B.txt, B00001.txt, B00002.txt ... + -w C%.c.txt # C0.txt, C1.txt, C2.txt ... + -w D%-.c.txt # D-0.txt, D-1.txt, D-2.txt ... + -w E%-.4c.txt # E-0000.txt, E-0001.txt, E-0002.txt ... + -w F%-.4nc.txt # F-0001.txt, F-0002.txt, F-0003.txt ... + -w G%+c.txt # G.txt, G_1.txt G_2.txt ... + -w H%-lc.txt # H.txt, H-b.txt, H-c.txt ... + -w I.%.3uc.txt # I.AAA.txt, I.AAB.txt, I.AAC.txt ... + +A special feature allows the copy number to be incremented for each +processed file by using %C (upper case) instead of %c. This allows a +sequential number to be added to output file names, even if the names are +different. For %C, a copy number of zero is not omitted as it is with %c. +A leading '-' causes the number to be reset at the start of each new +directory, and '+' has no effect. The number before the decimal place gives +the starting index, the number after the decimal place gives the field +width. The following examples show the output filenames when used with the +command C: + + -w %C%f.txt # 0rose.txt, 1star.txt, 2jet.txt + -w %f-%10C.txt # rose-10.txt, star-11.txt, jet-12.txt + -w %.3C-%f.txt # 000-rose.txt, 001-star.txt, 002-jet.txt + -w %57.4C%f.txt # 0057rose.txt, 0058star.txt, 0059jet.txt + +All format codes may be modified by 'l' or 'u' to specify lower or upper +case respectively (ie. C<%le> for a lower case file extension). When used +to modify %c or %C, the numbers are changed to an alphabetical base (see +example H above). Also, %c and %C may be modified by 'n' to count using +natural numbers starting from 1, instead of 0 (see example F above). + +This same I syntax is used with the B<-o> and B<-tagsFromFile> options, +although %c and %C are only valid for output file names. + +=item B<-W>[+|!] I (B<-tagOut>) + +This enhanced version of the B<-w> option allows a separate output file to +be created for each extracted tag. See the B<-w> option documentation above +for details of the basic functionality. Listed here are the differences +between B<-W> and B<-w>: + +1) With B<-W>, a new output file is created for each extracted tag. + +2) B<-W> supports four additional format codes: %t, %g and %s represent the +tag name, group name, and suggested extension for the output file (based on +the format of the data), and %o represents the value of the +OriginalRawFileName or OriginalFileName tag from the input file (including +extension). The %g code may be followed by a single digit to specify the +group family number (eg. %g1), otherwise family 0 is assumed. The substring +width/position/case specifiers may be used with these format codes in +exactly the same way as with %f and %e. + +3) The argument for B<-W> is interpreted as a file name if it contains no +format codes. (For B<-w>, this would be a file extension.) This change +allows a simple file name to be specified, which, when combined with the +append feature, provides a method to write metadata from multiple source +files to a single output file without the need for shell redirection. For +example, the following pairs of commands give the same result: + + # overwriting existing text file + exiftool test.jpg > out.txt # shell redirection + exiftool test.jpg -W+! out.txt # equivalent -W option + + # append to existing text file + exiftool test.jpg >> out.txt # shell redirection + exiftool test.jpg -W+ out.txt # equivalent -W option + +4) Adding the B<-v> option to B<-W> sends a list of the tags and output file +names to the console instead of giving a verbose dump of the entire file. +(Unless appending all output to one file for each source file by using +B<-W+> with an output file I that does not contain %t, %g, %s or %o.) + +5) Individual list items are stored in separate files when B<-W> is combined +with B<-b>, but note that for separate files to be created %c or %C must be +used in I to give the files unique names. + +=item B<-Wext> I, B<--Wext> I (B<-tagOutExt>) + +This option is used to specify the type of output file(s) written by the +B<-W> option. An output file is written only if the suggested extension +matches I. Multiple B<-Wext> options may be used to write more than +one type of file. Use B<--Wext> to write all but the specified type(s). + +=item B<-X> (B<-xmlFormat>) + +Use ExifTool-specific RDF/XML formatting for console output. Implies the +B<-a> option, so duplicate tags are extracted. The formatting options +B<-b>, B<-D>, B<-H>, B<-l>, B<-s>, B<-sep>, B<-struct> and B<-t> may be used +in combination with B<-X> to affect the output, but note that the tag ID +(B<-D>, B<-H> and B<-t>), binary data (B<-b>) and structured output +(B<-struct>) options are not effective for the short output (B<-s>). Another +restriction of B<-s> is that only one tag with a given group and name may +appear in the output. Note that the tag ID options (B<-D>, B<-H> and B<-t>) +will produce non-standard RDF/XML unless the B<-l> option is also used. + +By default, B<-X> outputs flattened tags, so B<-struct> should be added if +required to preserve XMP structures. List-type tags with multiple values +are formatted as an RDF Bag, but they are combined into a single string when +B<-s> or B<-sep> is used. Using B<-L> changes the XML encoding from "UTF-8" +to "windows-1252". Other B<-charset> settings change the encoding only if +there is a corresponding standard XML character set. The B<-b> option +causes binary data values to be written, encoded in base64 if necessary. +The B<-t> option adds tag table information to the output (see B<-t> for +details). + +Note: This output is NOT the same as XMP because it uses +dynamically-generated property names corresponding to the ExifTool tag names +with ExifTool family 1 group names as namespaces, and not the standard XMP +properties and namespaces. To write XMP instead, use the B<-o> option with +an XMP extension for the output file. + +=back + +=head3 Processing control + +=over 5 + +=item B<-a>, B<--a> (B<-duplicates>, B<--duplicates>) + +Allow (B<-a>) or suppress (B<--a>) duplicate tag names to be extracted. By +default, duplicate tags are suppressed when reading unless the B<-ee> or B<-X> +options are used or the Duplicates option is enabled in the configuration file. +When writing, this option allows multiple Warning messages to be shown. +Duplicate tags are always extracted when copying. + +=item B<-e> (B<--composite>) + +Extract existing tags only -- don't generate composite tags. + +=item B<-ee>[I] (B<-extractEmbedded>) + +Extract information from embedded documents in EPS files, embedded EPS +information and JPEG and Jpeg2000 images in PDF files, embedded MPF images +in JPEG and MPO files, streaming metadata in AVCHD videos, and the resource +fork of Mac OS files. Implies the B<-a> option. Use B<-g3> or B<-G3> to +identify the originating document for extracted information. Embedded +documents containing sub-documents are indicated with dashes in the family 3 +group name. (eg. C is the 3rd sub-document of the 2nd embedded +document.) Note that this option may increase processing time substantially, +especially for PDF files with many embedded images or videos with streaming +metadata. + +When used with B<-ee>, the B<-p> option is evaluated for each embedded +document as if it were a separate input file. This allows, for example, +generation of GPS track logs from timed metadata in videos. See +L for examples. + +Setting I to 2 causes the H264 video stream in MP4 videos to be parsed +until the first Supplemental Enhancement Information (SEI) message is +decoded, or 3 to parse the entire H624 stream and decode all SEI +information. For M2TS videos, a setting of 3 causes the entire file to be +parsed in search of unlisted programs which may contain timed GPS. + +=item B<-ext>[+] I, B<--ext> I (B<-extension>) + +Process only files with (B<-ext>) or without (B<--ext>) a specified +extension. There may be multiple B<-ext> and B<--ext> options. A plus sign +may be added (ie. B<-ext+>) to add the specified extension to the normally +processed files. EXT may begin with a leading '.', which is ignored. Case +is not significant. C<"*"> may be used to process files with any extension +(or none at all), as in the last three examples: + + exiftool -ext JPG DIR # process only JPG files + exiftool --ext cr2 --ext dng DIR # supported files but CR2/DNG + exiftool -ext+ txt DIR # supported files plus TXT + exiftool -ext "*" DIR # process all files + exiftool -ext "*" --ext xml DIR # process all but XML files + exiftool -ext "*" --ext . DIR # all but those with no ext + +Using this option has two main advantages over specifying C<*.I> on the +command line: 1) It applies to files in subdirectories when combined with +the B<-r> option. 2) The B<-ext> option is case-insensitive, which is +useful when processing files on case-sensitive filesystems. + +Note that all files specified on the command line will be processed +regardless of extension unless the B<-ext> option is used. + +=item B<-F>[I] (B<-fixBase>) + +Fix the base for maker notes offsets. A common problem with some image +editors is that offsets in the maker notes are not adjusted properly when +the file is modified. This may cause the wrong values to be extracted for +some maker note entries when reading the edited file. This option allows an +integer I to be specified for adjusting the maker notes base offset. +If no I is given, ExifTool takes its best guess at the correct base. +Note that exiftool will automatically fix the offsets for images which store +original offset information (eg. newer Canon models). Offsets are fixed +permanently if B<-F> is used when writing EXIF to an image. eg) + + exiftool -F -exif:resolutionunit=inches image.jpg + +=item B<-fast>[I] + +Increase speed of extracting information. With B<-fast> (or B<-fast1>), +ExifTool will not scan to the end of a JPEG image to check for an AFCP or +PreviewImage trailer, or past the first comment in GIF images or the +audio/video data in WAV/AVI files to search for additional metadata. These +speed benefits are small when reading images directly from disk, but can be +substantial if piping images through a network connection. For more +substantial speed benefits, B<-fast2> also causes exiftool to avoid +extracting any EXIF MakerNote information. B<-fast3> avoids extracting +metadata from the file, and returns only pseudo System tags, but still reads +the file header to obtain an educated guess at FileType. B<-fast4> doesn't +even read the file header, and returns only System tags and a FileType based +on the file extension. B<-fast5> also disables generation of the Composite +tags (like B<-e>). Has no effect when writing. + +Note that a separate B<-fast> setting may be used for evaluation of a B<-if> +condition, or when ordering files with the B<-fileOrder> option. See the +B<-if> and B<-fileOrder> options for details. + +=item B<-fileOrder>[I] [-]I + +Set file processing order according to the sorted value of the specified +I. For example, to process files in order of date: + + exiftool -fileOrder DateTimeOriginal DIR + +Additional B<-fileOrder> options may be added for secondary sort keys. +Numbers are sorted numerically, and all other values are sorted +alphabetically. Files missing the specified tag are sorted last. The sort +order may be reversed by prefixing the tag name with a C<-> (eg. +C<-fileOrder -createdate>). Print conversion of the sorted values is +disabled with the B<-n> option, or a C<#> appended to the tag name. Other +formatting options (eg. B<-d>) have no effect on the sorted values. Note +that the B<-fileOrder> option can have a large performance impact since it +involves an additional processing pass of each file, but this impact may be +reduced by specifying a I for the B<-fast> level used during the +metadata-extraction phase. For example, B<-fileOrder4> may be used if +I is a pseudo System tag. If multiple B<-fileOrder> options are used, +the extraction is done at the lowest B<-fast> level. Note that files are +sorted across directory boundaries if multiple input directories are +specified. + +=item B<-i> I (B<-ignore>) + +Ignore specified directory name. I may be either an individual folder +name, or a full path. If a full path is specified, it must match the +Directory tag exactly to be ignored. Use multiple B<-i> options to ignore +more than one directory name. A special I value of C (case +sensitive) may be specified to avoid recursing into directories which are +symbolic links when the B<-r> option is used. As well, a value of C +(case sensitive) may be used to ignore files with names that start with a +"." (ie. hidden files on Unix systems) when scanning a directory. + +=item B<-if>[I] I + +Specify a condition to be evaluated before processing each I. I +is a Perl-like logic expression containing tag names prefixed by C<$> +symbols. It is evaluated with the tags from each I in turn, and the +file is processed only if the expression returns true. Unlike Perl variable +names, tag names are not case sensitive and may contain a hyphen. As well, +tag names may have a leading group names separated by colons, and/or a +trailing C<#> character to disable print conversion. The expression +C<$GROUP:all> evaluates to 1 if any tag exists in the specified C, or +0 otherwise (see note 2 below). When multiple B<-if> options are used, all +conditions must be satisfied to process the file. Returns an exit status of +2 if all files fail the condition. Below are a few examples: + + # extract shutterspeed from all Canon images in a directory + exiftool -shutterspeed -if '$make eq "Canon"' dir + + # add one hour to all images created on or after Apr. 2, 2006 + exiftool -alldates+=1 -if '$CreateDate ge "2006:04:02"' dir + + # set EXIF ISO value if possible, unless it is set already + exiftool '-exif:iso to the B<-if> option causes a separate processing pass to be +executed for evaluating I at a B<-fast> level given by I (see the +B<-fast> option documentation for details). Without I, only one +processing pass is done at the level specified by the B<-fast> option. For +example, using B<-if5> is possible if I uses only pseudo System tags, +and may significantly speed processing if enough files fail the condition. + +The expression has access to the current ExifTool object through C<$self>, +and the following special functions are available to allow short-circuiting +of the file processing. Both functions have a return value of 1. Case is +significant for function names. + + End() - end processing after this file + EndDir() - end processing of files in this directory (not + compatible with the B<-fileOrder> option) + +Notes: + +1) The B<-n> and B<-b> options also apply to tags used in I. + +2) Some binary data blocks are not extracted unless specified explicitly. +These tags are not available for use in the B<-if> condition unless they are +also specified on the command line. The alternative is to use the +C<$GROUP:all> syntax. (eg. Use C<$exif:all> instead of C<$exif> in I +to test for the existence of EXIF tags.) + +3) Tags in the string are interpolated the same way as with B<-p> before the +expression is evaluated. In this interpolation, C<$/> is converted to a +newline and C<$$> represents a single C<$> symbol (so Perl variables, if +used, require a double C<$>). + +4) The condition may only test tags from the file being processed. To +process one file based on tags from another, two steps are required. For +example, to process XMP sidecar files in directory C based on tags from +the associated NEF: + + exiftool -if EXPR -p '$directory/$filename' -ext nef DIR > nef.txt + exiftool -@ nef.txt -srcfile %d%f.xmp ... + +5) The B<-a> option has no effect on the evaluation of the expression, and +the values of duplicate tags are accessible only by specifying a group name +(such as a family 4 instance number, eg. C<$Copy1:TAG>, C<$Copy2:TAG>, etc). + +6) A special "OK" UserParam is available to test the success of the previous +command when B<-execute> was used, and may be used like any other tag in the +condition (ie. "$OK"). + +=item B<-m> (B<-ignoreMinorErrors>) + +Ignore minor errors and warnings. This enables writing to files with minor +errors and disables some validation checks which could result in minor +warnings. Generally, minor errors/warnings indicate a problem which usually +won't result in loss of metadata if ignored. However, there are exceptions, +so ExifTool leaves it up to you to make the final decision. Minor errors +and warnings are indicated by "[minor]" at the start of the message. +Warnings which affect processing when ignored are indicated by "[Minor]" +(with a capital "M"). Note that this causes missing values in +B<-tagsFromFile>, B<-p> and B<-if> strings to be set to an empty string +rather than an undefined value. + +=item B<-o> I or I (B<-out>) + +Set the output file or directory name when writing information. Without +this option, when any "real" tags are written the original file is renamed +to C and output is written to I. When writing only +FileName and/or Directory "pseudo" tags, B<-o> causes the file to be copied +instead of moved, but directories specified for either of these tags take +precedence over that specified by the B<-o> option. + +I may be C<-> to write to stdout. The output file name may also be +specified using a I string in which %d, %f and %e represent the +directory, file name and extension of I. Also, %c may be used to add +a copy number. See the B<-w> option for I string examples. + +The output file is taken to be a directory name if it already exists as a +directory or if the name ends with '/'. Output directories are created if +necessary. Existing files will not be overwritten. Combining the +B<-overwrite_original> option with B<-o> causes the original source file to +be erased after the output file is successfully written. + +A special feature of this option allows the creation of certain types of +files from scratch, or with the metadata from another type of file. The +following file types may be created using this technique: + + XMP, EXIF, EXV, MIE, ICC/ICM, VRD, DR4 + +The output file type is determined by the extension of I (specified +as C<-.EXT> when writing to stdout). The output file is then created from a +combination of information in I (as if the B<-tagsFromFile> option was +used), and tag values assigned on the command line. If no I is +specified, the output file may be created from scratch using only tags +assigned on the command line. + +=item B<-overwrite_original> + +Overwrite the original I (instead of preserving it by adding +C<_original> to the file name) when writing information to an image. +Caution: This option should only be used if you already have separate backup +copies of your image files. The overwrite is implemented by renaming a +temporary file to replace the original. This deletes the original file and +replaces it with the edited version in a single operation. When combined +with B<-o>, this option causes the original file to be deleted if the output +file was successfully written (ie. the file is moved instead of copied). + +=item B<-overwrite_original_in_place> + +Similar to B<-overwrite_original> except that an extra step is added to +allow the original file attributes to be preserved. For example, on a Mac +this causes the original file creation date, type, creator, label color, +icon, Finder tags, other extended attributes and hard links to the file to +be preserved (but note that the Mac OS resource fork is always preserved +unless specifically deleted with C<-rsrc:all=>). This is implemented by +opening the original file in update mode and replacing its data with a copy +of a temporary file before deleting the temporary. The extra step results +in slower performance, so the B<-overwrite_original> option should be used +instead unless necessary. + +Note that this option reverts to the behaviour of the B<-overwrite_original> +option when also writing the FileName and/or Directory tags. + +=item B<-P> (B<-preserve>) + +Preserve the filesystem modification date/time (C) of the +original file when writing. Note that some filesystems store a creation +date (ie. C on Windows and Mac systems) which is not +affected by this option. This creation date is preserved on Windows systems +where Win32API::File and Win32::API are available regardless of this +setting. For other systems, the B<-overwrite_original_in_place> option may +be used if necessary to preserve the creation date. The B<-P> option is +superseded by any value written to the FileModifyDate tag. + +=item B<-password> I + +Specify password to allow processing of password-protected PDF documents. +If a password is required but not given, a warning is issued and the +document is not processed. This option is ignored if a password is not +required. + +=item B<-progress>[:[I]] + +Show the progress when processing files. Without a colon, the B<-progress> +option adds a progress count in brackets after the name of each processed +file, giving the current file number and the total number of files to be +processed. Implies the B<-v0> option, causing the names of processed files +to also be printed when writing. When combined with the B<-if> option, the +total count includes all files before the condition is applied, but files +that fail the condition will not have their names printed. + +If followed by a colon (ie. B<-progress:>), the console window title is set +according to the specified I<TITLE> string. If no I<TITLE> is given, a +default I<TITLE> string of "ExifTool %p%%" is assumed. In the string, %f +represents the file name, %p is the progress as a percent, %r is the +progress as a ratio, %##b is a progress bar of width "##" (20 characters if +"##" is omitted), and %% is a % character. May be combined with the normal +B<-progress> option to also show the progress count in console messages. +(Note: For this feature to function correctly on Mac/Linux, stderr must go +to the console.) + +=item B<-q> (B<-quiet>) + +Quiet processing. One B<-q> suppresses normal informational messages, and a +second B<-q> suppresses warnings as well. Error messages can not be +suppressed, although minor errors may be downgraded to warnings with the +B<-m> option, which may then be suppressed with C<-q -q>. + +=item B<-r>[.] (B<-recurse>) + +Recursively process files in subdirectories. Only meaningful if I<FILE> is +a directory name. Subdirectories with names beginning with "." are not +processed unless "." is added to the option name (ie. B<-r.> or +B<-recurse.>). By default, exiftool will also follow symbolic links to +directories if supported by the system, but this may be disabled with +C<-i SYMLINKS> (see the B<-i> option for details). Combine this with +B<-ext> options to control the types of files processed. + +=item B<-scanForXMP> + +Scan all files (even unsupported formats) for XMP information unless found +already. When combined with the B<-fast> option, only unsupported file +types are scanned. Warning: It can be time consuming to scan large files. + +=item B<-u> (B<-unknown>) + +Extract values of unknown tags. Add another B<-u> to also extract unknown +information from binary data blocks. This option applies to tags with +numerical tag ID's, and causes tag names like "Exif_0xc5d9" to be generated +for unknown information. It has no effect on information types which have +human-readable tag ID's (such as XMP), since unknown tags are extracted +automatically from these formats. + +=item B<-U> (B<-unknown2>) + +Extract values of unknown tags as well as unknown information from some +binary data blocks. This is the same as two B<-u> options. + +=item B<-wm> I<MODE> (B<-writeMode>) + +Set mode for writing/creating tags. I<MODE> is a string of one or more +characters from the list below. The default write mode is C<wcg>. + + w - Write existing tags + c - Create new tags + g - create new Groups as necessary + +For example, use C<-wm cg> to only create new tags (and avoid editing +existing ones). + +The level of the group is the SubDirectory level in the metadata structure. +For XMP or IPTC this is the full XMP/IPTC block (the family 0 group), but +for EXIF this is the individual IFD (the family 1 group). + +=item B<-z> (B<-zip>) + +When reading, causes information to be extracted from .gz and .bz2 +compressed images (only one image per archive; requires gzip and bzip2 to be +available). When writing, causes compressed information to be written if +supported by the metadata format (eg. compressed textual metadata in PNG), +disables the recommended padding in embedded XMP (saving 2424 bytes when +writing XMP in a file), and writes XMP in shorthand format -- the equivalent +of setting the API Compress=1 and Compact="NoPadding,Shorthand". + +=back + +=head3 Other options + +=over 5 + +=item B<-@> I<ARGFILE> + +Read command-line arguments from the specified file. The file contains one +argument per line (NOT one option per line -- some options require +additional arguments, and all arguments must be placed on separate lines). +Blank lines and lines beginning with C<#> are ignored (unless they start +with C<#[CSTR]>, in which case the rest of the line is treated as a C +string, allowing standard C escape sequences such as "\n" for a newline). +White space at the start of a line is removed. Normal shell processing of +arguments is not performed, which among other things means that arguments +should not be quoted and spaces are treated as any other character. +I<ARGFILE> may exist relative to either the current directory or the +exiftool directory unless an absolute pathname is given. + +For example, the following I<ARGFILE> will set the value of Copyright to +"Copyright YYYY, Phil Harvey", where "YYYY" is the year of CreateDate: + + -d + %Y + -copyright<Copyright $createdate, Phil Harvey + +Arguments in I<ARGFILE> behave exactly the same as if they were entered at +the location of the B<-@> option on the command line, with the exception +that the B<-config> and B<-common_args> options may not be used in an +I<ARGFILE>. + +=item B<-k> (B<-pause>) + +Pause with the message C<-- press any key --> or C<-- press RETURN --> +(depending on your system) before terminating. This option is used to +prevent the command window from closing when run as a Windows drag and drop +application. + +=item B<-list>, B<-listw>, B<-listf>, B<-listr>, B<-listwf>, +B<-listg>[I<NUM>], B<-listd>, B<-listx> + +Print a list of all valid tag names (B<-list>), all writable tag names +(B<-listw>), all supported file extensions (B<-listf>), all recognized file +extensions (B<-listr>), all writable file extensions (B<-listwf>), all tag +groups [in a specified family] (B<-listg>[I<NUM>]), all deletable tag groups +(B<-listd>), or an XML database of tag details including language +translations (B<-listx>). The B<-list>, B<-listw> and B<-listx> options may +be followed by an additional argument of the form C<-GROUP:All> to list only +tags in a specific group, where C<GROUP> is one or more family 0-2 group +names (excepting EXIF IFD groups) separated by colons. With B<-listg>, +I<NUM> may be given to specify the group family, otherwise family 0 is +assumed. The B<-l> option may be combined with B<-listf>, B<-listr> or +B<-listwf> to add file descriptions to the list. The B<-lang> option may be +combined with B<-listx> to output descriptions in a single language. Here +are some examples: + + -list # list all tag names + -list -EXIF:All # list all EXIF tags + -list -xmp:time:all # list all XMP tags relating to time + -listw -XMP-dc:All # list all writable XMP-dc tags + -listf # list all supported file extensions + -listr # list all recognized file extensions + -listwf # list all writable file extensions + -listg1 # list all groups in family 1 + -listd # list all deletable groups + -listx -EXIF:All # list database of EXIF tags in XML format + -listx -XMP:All -s # list short XML database of XMP tags + +When combined with B<-listx>, the B<-s> option shortens the output by +omitting the descriptions and values (as in the last example above), and +B<-f> adds a 'flags' attribute if applicable. The flags are formatted as a +comma-separated list of the following possible values: Avoid, Binary, List, +Mandatory, Permanent, Protected, Unknown and Unsafe (see the L<Tag Name +documentation|Image::ExifTool::TagNames>). For XMP List tags, the list type +(Alt, Bag or Seq) is added to the flags, and flattened structure tags are +indicated by a Flattened flag. + +Note that none of the B<-list> options require an input I<FILE>. + +=item B<-ver> + +Print exiftool version number. The B<-v> option may be added to print +addition system information (see the README file of the full distribution +for more details about optional libraries), or B<-v2> to also list the Perl +include directories. + +=item B<--> + +Indicates the end of options. Any remaining arguments are treated as file +names, even if they begin with a dash (C<->). + +=back + +=head3 Special features + +=over 5 + +=item B<-geotag> I<TRKFILE> + +Geotag images from the specified GPS track log file. Using the B<-geotag> +option is equivalent to writing a value to the C<Geotag> tag. The GPS +position is interpolated from the track at a time specified by the value +written to the C<Geotime> tag. If C<Geotime> is not specified, the value is +copied from C<DateTimeOriginal#> (the C<#> is added to copy the unformatted +value, avoiding potential conflicts with the B<-d> option). For example, +the following two commands are equivalent: + + exiftool -geotag trk.log image.jpg + exiftool -geotag trk.log "-Geotime<DateTimeOriginal#" image.jpg + +When the C<Geotime> value is converted to UTC, the local system timezone is +assumed unless the date/time value contains a timezone. Writing C<Geotime> +causes the following tags to be written (provided they can be calculated +from the track log, and they are supported by the destination metadata +format): GPSLatitude, GPSLatitudeRef, GPSLongitude, GPSLongitudeRef, +GPSAltitude, GPSAltitudeRef, GPSDateStamp, GPSTimeStamp, GPSDateTime, +GPSTrack, GPSTrackRef, GPSSpeed, GPSSpeedRef, GPSImgDirection, +GPSImgDirectionRef, GPSPitch, GPSRoll, AmbientTemperature and +CameraElevationAngle. By default, tags are created in EXIF, and updated in +XMP only if they already exist. However, C<EXIF:Geotime> or C<XMP:Geotime> +may be specified to write only EXIF or XMP tags respectively. Note that +GPSPitch and GPSRoll are non-standard, and require user-defined tags in +order to be written. + +The C<Geosync> tag may be used to specify a time correction which is applied +to each C<Geotime> value for synchronization with GPS time. For example, +the following command compensates for image times which are 1 minute and 20 +seconds behind GPS: + + exiftool -geosync=+1:20 -geotag a.log DIR + +Advanced C<Geosync> features allow a linear time drift correction and +synchronization from previously geotagged images. See "geotag.html" in the +full ExifTool distribution for more information. + +Multiple B<-geotag> options may be used to concatenate GPS track log data. +Also, a single B<-geotag> option may be used to load multiple track log +files by using wildcards in the I<TRKFILE> name, but note that in this case +I<TRKFILE> must be quoted on most systems (with the notable exception of +Windows) to prevent filename expansion. For example: + + exiftool -geotag "TRACKDIR/*.log" IMAGEDIR + +Currently supported track file formats are GPX, NMEA RMC/GGA/GLL, KML, IGC, +Garmin XML and TCX, Magellan PMGNTRK, Honeywell PTNTHPR, Bramor gEO, Winplus +Beacon TXT, and GPS/IMU CSV files. See L</GEOTAGGING EXAMPLES> for +examples. Also see "geotag.html" in the full ExifTool distribution and the +L<Image::ExifTool Options|Image::ExifTool/Options> for more details and for +information about geotag configuration options. + +=item B<-globalTimeShift> I<SHIFT> + +Shift all formatted date/time values by the specified amount when reading. +Does not apply to unformatted (B<-n>) output. I<SHIFT> takes the same form +as the date/time shift when writing (see +L<Image::ExifTool::Shift.pl|Image::ExifTool::Shift.pl> for details), with a +negative shift being indicated with a minus sign (C<->) at the start of the +I<SHIFT> string. For example: + + # return all date/times, shifted back by 1 hour + exiftool -globalTimeShift -1 -time:all a.jpg + + # set the file name from the shifted CreateDate (-1 day) for + # all images in a directory + exiftool "-filename<createdate" -globaltimeshift "-0:0:1 0:0:0" \ + -d %Y%m%d-%H%M%S.%%e dir + +=item B<-use> I<MODULE> + +Add features from specified plug-in I<MODULE>. Currently, the MWG module is +the only plug-in module distributed with exiftool. This module adds +read/write support for tags as recommended by the Metadata Working Group. +As a convenience, C<-use MWG> is assumed if the C<MWG> group is specified +for any tag on the command line. See the L<MWG Tags +documentation|Image::ExifTool::TagNames/MWG Tags> for more details. Note +that this option is not reversible, and remains in effect until the +application terminates, even across the B<-execute> option. + +=back + +=head3 Utilities + +=over 5 + +=item B<-restore_original> + +=item B<-delete_original>[!] + +These utility options automate the maintenance of the C<_original> files +created by exiftool. They have no effect on files without an C<_original> +copy. The B<-restore_original> option restores the specified files from +their original copies by renaming the C<_original> files to replace the +edited versions. For example, the following command restores the originals +of all JPG images in directory C<DIR>: + + exiftool -restore_original -ext jpg DIR + +The B<-delete_original> option deletes the C<_original> copies of all files +specified on the command line. Without a trailing C<!> this option prompts +for confirmation before continuing. For example, the following command +deletes C<a.jpg_original> if it exists, after asking "Are you sure?": + + exiftool -delete_original a.jpg + +These options may not be used with other options to read or write tag values +in the same command, but may be combined with options such B<-ext>, B<-if>, +B<-r>, B<-q> and B<-v>. + +=back + +=head3 Advanced options + +Among other things, the advanced options allow complex processing to be +performed from a single command without the need for additional scripting. +This may be particularly useful for implementations such as Windows +drag-and-drop applications. These options may also be used to improve +performance in multi-pass processing by reducing the overhead required to +load exiftool for each invocation. + +=over 5 + +=item B<-api> I<OPT[[^]=[VAL]]> + +Set ExifTool API option. I<OPT> is an API option name. The option value is +set to 1 if I<=VAL> is omitted. If I<VAL> is omitted, the option value is +set to undef if C<=> is used, or an empty string with C<^=>. See +L<Image::ExifTool Options|Image::ExifTool/Options> for a list of available +API options. This overrides API options set via the config file. + +=item B<-common_args> + +Specifies that all arguments following this option are common to all +executed commands when B<-execute> is used. This and the B<-config> option +are the only options that may not be used inside a B<-@> I<ARGFILE>. Note +that by definition this option and its arguments MUST come after all other +options on the command line. + +=item B<-config> I<CFGFILE> + +Load specified configuration file instead of the default ".ExifTool_config". +If used, this option must come before all other arguments on the command +line and applies to all B<-execute>'d commands. The I<CFGFILE> must exist +relative to the current working directory or the exiftool application +directory unless an absolute path is specified. Loading of the default +config file may be disabled by setting I<CFGFILE> to an empty string (ie. +""). See L<https://exiftool.org/config.html> and +config_files/example.config in the full ExifTool distribution for details +about the configuration file syntax. + +=item B<-echo>[I<NUM>] I<TEXT> + +Echo I<TEXT> to stdout (B<-echo> or B<-echo1>) or stderr (B<-echo2>). Text +is output as the command line is parsed, before the processing of any input +files. I<NUM> may also be 3 or 4 to output text (to stdout or stderr +respectively) after processing is complete. For B<-echo3> and B<-echo4>, +"${status}" may be used in the I<TEXT> string to represent the numerical +exit status of the command (see L</EXIT STATUS>). + +=item B<-efile>[I<NUM>][!] I<ERRFILE> + +Save the names of files giving errors (I<NUM> missing or 1), files that were +unchanged (I<NUM> is 2), files that fail the B<-if> condition (I<NUM> is 4), +or any combination thereof by summing I<NUM> (eg. B<-efile3> is the same +has having both B<-efile> and B<-efile2> options with the same I<ERRFILE>). +By default, file names are appended to any existing I<ERRFILE>, but +I<ERRFILE> is overwritten if an exclamation point is added to the option +(eg. B<-efile!>). Saves the name of the file specified by the B<-srcfile> +option if applicable. + +=item B<-execute>[I<NUM>] + +Execute command for all arguments up to this point on the command line (plus +any arguments specified by B<-common_args>). The result is as if the +commands were executed as separate command lines (with the exception of the +B<-config> and B<-use> options which remain in effect for subsequent +commands). Allows multiple commands to be executed from a single command +line. I<NUM> is an optional number that is echoed in the "{ready}" message +when using the B<-stay_open> feature. If a I<NUM> is specified, the B<-q> +option no longer suppresses the output "{readyNUM}" message. + +=item B<-list_dir> + +List directories themselves instead of their contents. This option +effectively causes directories to be treated as normal files when reading +and writing. For example, with this option the output of the C<ls -la> +command on Mac/Linux may be approximated by this exiftool command: + + exiftool -list_dir -T -ls-l -api systemtags -fast5 .* * + +(The B<-T> option formats the output in tab-separated columns, B<-ls-l> is a +L<shortcut tag|Image::ExifTool::Shortcuts>, the API SystemTags option is +required to extract some necessary tags, and the B<-fast5> option is added +for speed since only system tags are being extracted.) + +=item B<-srcfile> I<FMT> + +Specify a different source file to be processed based on the name of the +original I<FILE>. This may be useful in some special situations for +processing related preview images or sidecar files. See the B<-w> option +for a description of the I<FMT> syntax. Note that file name I<FMT> strings +for all options are based on the original I<FILE> specified from the command +line, not the name of the source file specified by B<-srcfile>. + +For example, to copy metadata from NEF files to the corresponding JPG +previews in a directory where other JPG images may exist: + + exiftool -ext nef -tagsfromfile @ -srcfile %d%f.jpg dir + +If more than one B<-srcfile> option is specified, the files are tested in +order and the first existing source file is processed. If none of the +source files already exist, then exiftool uses the first B<-srcfile> +specified. + +A I<FMT> of C<@> may be used to represent the original I<FILE>, which may be +useful when specifying multiple B<-srcfile> options (eg. to fall back to +processing the original I<FILE> if no sidecar exists). + +When this option is used, two special UserParam tags (OriginalFileName and +OriginalDirectory) are generated to allow access to the original I<FILE> +name and directory. + +=item B<-stay_open> I<FLAG> + +If I<FLAG> is C<1> or C<True> (case insensitive), causes exiftool keep +reading from the B<-@> I<ARGFILE> even after reaching the end of file. This +feature allows calling applications to pre-load exiftool, thus avoiding the +overhead of loading exiftool for each command. The procedure is as follows: + +1) Execute C<exiftool -stay_open True -@ I<ARGFILE>>, where I<ARGFILE> is the +name of an existing (possibly empty) argument file or C<-> to pipe arguments +from the standard input. + +2) Write exiftool command-line arguments to I<ARGFILE>, one argument per +line (see the B<-@> option for details). + +3) Write C<-execute\n> to I<ARGFILE>, where C<\n> represents a newline +sequence. (Note: You may need to flush your write buffers here if using +buffered output.) ExifTool will then execute the command with the arguments +received up to this point, send a "{ready}" message to stdout when done +(unless the B<-q> or B<-T> option is used), and continue trying to read +arguments for the next command from I<ARGFILE>. To aid in command/response +synchronization, any number appended to the B<-execute> option is echoed in +the "{ready}" message. For example, C<-execute613> results in "{ready613}". +When this number is added, B<-q> no longer suppresses the "{ready}" message. +(Also, see the B<-echo3> and B<-echo4> options for additional ways to pass +signals back to your application.) + +4) Repeat steps 2 and 3 for each command. + +5) Write C<-stay_open\nFalse\n> (or C<-stay_open\n0\n>) to I<ARGFILE> when +done. This will cause exiftool to process any remaining command-line +arguments then exit normally. + +The input I<ARGFILE> may be changed at any time before step 5 above by +writing the following lines to the currently open I<ARGFILE>: + + -stay_open + True + -@ + NEWARGFILE + +This causes I<ARGFILE> to be closed, and I<NEWARGFILE> to be kept open. +(Without the B<-stay_open> here, exiftool would have returned to reading +arguments from I<ARGFILE> after reaching the end of I<NEWARGFILE>.) + +Note: When writing arguments to a disk file there is a delay of up to 0.01 +seconds after writing C<-execute\n> before exiftool starts processing the +command. This delay may be avoided by sending a CONT signal to the exiftool +process immediately after writing C<-execute\n>. (There is no associated +delay when writing arguments via a pipe with C<-@ ->, so the signal is not +necessary when using this technique.) + +=item B<-userParam> I<PARAM[[^]=[VAL]]> + +Set user parameter. I<PARAM> is an arbitrary user parameter name. This is +an interface to the API UserParam option (see the +L<Image::ExifTool Options|Image::ExifTool/Options> documentation), and +provides a method to access user-defined parameters in arguments to the +B<-if> and B<-p> options as if they were any other tag. Appending a hash +tag (C<#>) to I<PARAM> (eg. C<-userParam MyTag#=yes>) also causes the +parameter to be extracted as a normal tag in the UserParam group. Similar +to the B<-api> option, the parameter value is set to 1 if I<=VAL> is +omitted, undef if just I<VAL> is omitted with C<=>, or an empty string if +I<VAL> is omitted with C<^=>. + + exiftool -p '$test from $filename' -userparam test=Hello FILE + +=back + +=head3 Advanced formatting feature + +An advanced formatting feature allows modification of the value of any tag +interpolated within a B<-if> or B<-p> option argument, or a B<-tagsFromFile> +redirection string. Tag names within these strings are prefixed by a C<$> +symbol, and an arbitrary Perl expression may be applied to the tag value by +placing braces around the tag name and inserting the expression after the +name, separated by a semicolon (ie. C<${TAG;EXPR}>). The expression acts on +the value of the tag through the default input variable (C<$_>), and has +access to the full ExifTool API through the current ExifTool object +(C<$self>) and the tag key (C<$tag>). It may contain any valid Perl code, +including translation (C<tr///>) and substitution (C<s///>) operations, but +note that braces within the expression must be balanced. The example below +prints the camera Make with spaces translated to underlines, and multiple +consecutive underlines replaced by a single underline: + + exiftool -p '${make;tr/ /_/;s/__+/_/g}' image.jpg + +An C<@> may be added after the tag name to make the expression act on +individual list items for list-type tags, simplifying list processing. Set +C<$_> to undef to remove an item from the list. As an example, the +following command returns all subjects not containing the string "xxx": + + exiftool -p '${subject@;$_=undef if /xxx/}' image.jpg + +A default expression of C<tr(/\\?*:|"E<lt>E<gt>\0)()d> is assumed if the +expression is empty (ie. C<${TAG;}>). This removes the characters / \ ? * : +| E<lt> E<gt> and null from the printed value. (These characters are +illegal in Windows file names, so this feature is useful if tag values are +used in file names.) + +=head4 Helper functions + +C<DateFmt> + +Simplifies reformatting of individual date/time values. This function acts +on a standard EXIF-formatted date/time value in C<$_> and formats it +according to the specified format string (see the B<-d> option). To avoid +trying to reformat an already-formatted date/time value, a C<#> must be +added to the tag name (as in the example below) if the B<-d> option is also +used. For example: + + exiftool -p '${createdate#;DateFmt("%Y-%m-%d_%H%M%S")}' a.jpg + +C<ShiftTime> + +Shifts EXIF-formatted date/time string by a specified amount. Start with a +leading minus sign to shift backwards in time. See +L<Image::ExifTool::Shift.pl|Image::ExifTool::Shift.pl> for details about +shift syntax. For example, to shift a date/time value back by one year: + + exiftool -p '${createdate;ShiftTime("-1:0:0 0")}' a.jpg + +C<NoDups> + +Removes duplicate items from a list with a separator specified by the +B<-sep> option. This function is most useful when copying list-type tags. +For example, the following command may be used to remove duplicate Keywords: + + exiftool -sep '##' '-keywords<${keywords;NoDups}' a.jpg + +The B<-sep> option is necessary to split the string back into individual +list items when writing to a list-type tag. + +An optional flag argument may be set to 1 to cause C<NoDups> to set C<$_> to +undef if no duplicates existed, thus preventing the file from being +rewritten unnecessarily: + + exiftool -sep '##' '-keywords<${keywords;NoDups(1)}' a.jpg + +Note that function names are case sensitive. + +=head1 WINDOWS UNICODE FILE NAMES + +In Windows, command-line arguments are specified using the current code page +and are recoded automatically to the system code page. This recoding is not +done for arguments in ExifTool arg files, so by default filenames in arg +files use the system code page. Unfortunately, these code pages are not +complete character sets, so not all file names may be represented. + +ExifTool 9.79 and later allow the file name encoding to be specified with +C<-charset filename=CHARSET>, where C<CHARSET> is the name of a valid +ExifTool character set, preferably C<UTF8> (see the B<-charset> option for a +complete list). Setting this triggers the use of Windows wide-character i/o +routines, thus providing support for most Unicode file names (see note 4). +But note that it is not trivial to pass properly encoded file names on the +Windows command line (see L<https://exiftool.org/faq.html#Q18> for details), +so placing them in a UTF-8 encoded B<-@> argfile and using +C<-charset filename=utf8> is recommended if possible. + +A warning is issued if a specified filename contains special characters and +the filename character set was not provided. However, the warning may be +disabled by setting C<-charset filename="">, and ExifTool may still function +correctly if the system code page matches the character set used for the +file names. + +When a directory name is provided, the file name encoding need not be +specified (unless the directory name contains special characters), and +ExifTool will automatically use wide-character routines to scan the +directory. + +The filename character set applies to the I<FILE> arguments as well as +filename arguments of B<-@>, B<-geotag>, B<-o>, B<-p>, B<-srcfile>, +B<-tagsFromFile>, B<-csv>=, B<-j>= and B<->I<TAG>E<lt>=. However, it does +not apply to the B<-config> filename, which always uses the system character +set. The C<-charset filename=> option must come before the B<-@> option to +be effective, but the order doesn't matter with respect to other options. + +Notes: + +1) FileName and Directory tag values still use the same encoding as other +tag values, and are converted to/from the filename character set when +writing/reading if specified. + +2) Unicode support is not yet implemented for other Windows-based systems +like Cygwin. + +3) See L</WRITING READ-ONLY FILES> below for a note about editing read-only +files with Unicode names. + +4) Unicode file names with surrogate pairs (code points over U+FFFF) still +cause problems. + +=head1 WRITING READ-ONLY FILES + +In general, ExifTool may be used to write metadata to read-only files +provided that the user has write permission in the directory. However, +there are three cases where file write permission is also required: + +1) When using the B<-overwrite_original_in_place> option. + +2) When writing only pseudo System tags (eg. FileModifyDate). + +3) On Windows if the file has Unicode characters in its name, and a) the +B<-overwrite_original> option is used, or b) the C<_original> backup already +exists. + +Hidden files in Windows behave as read-only files when attempting to write +any real tags to the file -- an error is generated when using the +B<-overwrite_original_in_place>, otherwise writing should be successful and +the hidden attribute will be removed. But the B<-if> option may be used to +avoid processing hidden files (provided Win32API::File is available): + + exiftool -if "$fileattributes !~ /Hidden/" ... + +=head1 READING EXAMPLES + +B<Note>: Beware when cutting and pasting these examples into your terminal! +Some characters such as single and double quotes and hyphens may have been +changed into similar-looking yet functionally-different characters by the +text formatter used to display this documentation. Also note that Windows +users must use double quotes instead of single quotes as below around +arguments containing special characters. + +=over 5 + +=item exiftool -a -u -g1 a.jpg + +Print all meta information in an image, including duplicate and unknown +tags, sorted by group (for family 1). For performance reasons, this command +may not extract all available metadata. (Metadata in embedded documents, +metadata extracted by external utilities, and metadata requiring excessive +processing time may not be extracted). Add C<-ee3> and C<-api RequestAll=3> +to the command to extract absolutely everything available. + +=item exiftool -common dir + +Print common meta information for all images in C<dir>. C<-common> is a +L<shortcut tag|Image::ExifTool::Shortcuts> representing common EXIF meta +information. + +=item exiftool -T -createdate -aperture -shutterspeed -iso dir > out.txt + +List specified meta information in tab-delimited column form for all images +in C<dir> to an output text file named "out.txt". + +=item exiftool -s -ImageSize -ExposureTime b.jpg + +Print ImageSize and ExposureTime tag names and values. + +=item exiftool -l -canon c.jpg d.jpg + +Print standard Canon information from two image files. + +=item exiftool -r -w .txt -common pictures + +Recursively extract common meta information from files in C<pictures> +directory, writing text output to C<.txt> files with the same names. + +=item exiftool -b -ThumbnailImage image.jpg > thumbnail.jpg + +Save thumbnail image from C<image.jpg> to a file called C<thumbnail.jpg>. + +=item exiftool -b -JpgFromRaw -w _JFR.JPG -ext NEF -r . + +Recursively extract JPG image from all Nikon NEF files in the current +directory, adding C<_JFR.JPG> for the name of the output JPG files. + +=item exiftool -a -b -W %d%f_%t%-c.%s -preview:all dir + +Extract all types of preview images (ThumbnailImage, PreviewImage, +JpgFromRaw, etc.) from files in directory "dir", adding the tag name to the +output preview image file names. + +=item exiftool -d '%r %a, %B %e, %Y' -DateTimeOriginal -S -s -ext jpg . + +Print formatted date/time for all JPG files in the current directory. + +=item exiftool -IFD1:XResolution -IFD1:YResolution image.jpg + +Extract image resolution from EXIF IFD1 information (thumbnail image IFD). + +=item exiftool '-*resolution*' image.jpg + +Extract all tags with names containing the word "Resolution" from an image. + +=item exiftool -xmp:author:all -a image.jpg + +Extract all author-related XMP information from an image. + +=item exiftool -xmp -b a.jpg > out.xmp + +Extract complete XMP data record intact from C<a.jpg> and write it to +C<out.xmp> using the special C<XMP> tag (see the Extra tags in +L<Image::ExifTool::TagNames|Image::ExifTool::TagNames>). + +=item exiftool -p '$filename has date $dateTimeOriginal' -q -f dir + +Print one line of output containing the file name and DateTimeOriginal for +each image in directory C<dir>. + +=item exiftool -ee3 -p '$gpslatitude, $gpslongitude, $gpstimestamp' a.m2ts + +Extract all GPS positions from an AVCHD video. + +=item exiftool -icc_profile -b -w icc image.jpg + +Save complete ICC_Profile from an image to an output file with the same name +and an extension of C<.icc>. + +=item exiftool -htmldump -w tmp/%f_%e.html t/images + +Generate HTML pages from a hex dump of EXIF information in all images from +the C<t/images> directory. The output HTML files are written to the C<tmp> +directory (which is created if it didn't exist), with names of the form +'FILENAME_EXT.html'. + +=item exiftool -a -b -ee -embeddedimage -W Image_%.3g3.%s file.pdf + +Extract embedded JPG and JP2 images from a PDF file. The output images will +have file names like "Image_#.jpg" or "Image_#.jp2", where "#" is the +ExifTool family 3 embedded document number for the image. + +=back + +=head1 WRITING EXAMPLES + +Note that quotes are necessary around arguments which contain certain +special characters such as C<E<gt>>, C<E<lt>> or any white space. These +quoting techniques are shell dependent, but the examples below will work for +most Unix shells. With the Windows cmd shell however, double quotes should +be used (eg. -Comment=E<34>This is a new commentE<34>). + +=over 5 + +=item exiftool -Comment='This is a new comment' dst.jpg + +Write new comment to a JPG image (replaces any existing comment). + +=item exiftool -comment= -o newdir -ext jpg . + +Remove comment from all JPG images in the current directory, writing the +modified images to a new directory. + +=item exiftool -keywords=EXIF -keywords=editor dst.jpg + +Replace existing keyword list with two new keywords (C<EXIF> and C<editor>). + +=item exiftool -Keywords+=word -o newfile.jpg src.jpg + +Copy a source image to a new file, and add a keyword (C<word>) to the +current list of keywords. + +=item exiftool -exposurecompensation+=-0.5 a.jpg + +Decrement the value of ExposureCompensation by 0.5 EV. Note that += with a +negative value is used for decrementing because the -= operator is used for +conditional deletion (see next example). + +=item exiftool -credit-=xxx dir + +Delete Credit information from all files in a directory where the Credit +value was C<xxx>. + +=item exiftool -xmp:description-de='kühl' -E dst.jpg + +Write alternate language for XMP:Description, using HTML character escaping +to input special characters. + +=item exiftool -all= dst.jpg + +Delete all meta information from an image. Note: You should NOT do this to +RAW images (except DNG) since proprietary RAW image formats often contain +information in the makernotes that is necessary for converting the image. + +=item exiftool -all= -comment='lonely' dst.jpg + +Delete all meta information from an image and add a comment back in. (Note +that the order is important: C<-comment='lonely' -all=> would also delete +the new comment.) + +=item exiftool -all= --jfif:all dst.jpg + +Delete all meta information except JFIF group from an image. + +=item exiftool -Photoshop:All= dst.jpg + +Delete Photoshop meta information from an image (note that the Photoshop +information also includes IPTC). + +=item exiftool -r -XMP-crss:all= DIR + +Recursively delete all XMP-crss information from images in a directory. + +=item exiftool '-ThumbnailImageE<lt>=thumb.jpg' dst.jpg + +Set the thumbnail image from specified file (Note: The quotes are necessary +to prevent shell redirection). + +=item exiftool '-JpgFromRawE<lt>=%d%f_JFR.JPG' -ext NEF -r . + +Recursively write JPEG images with filenames ending in C<_JFR.JPG> to the +JpgFromRaw tag of like-named files with extension C<.NEF> in the current +directory. (This is the inverse of the C<-JpgFromRaw> command of the +L</READING EXAMPLES> section above.) + +=item exiftool -DateTimeOriginal-='0:0:0 1:30:0' dir + +Adjust original date/time of all images in directory C<dir> by subtracting +one hour and 30 minutes. (This is equivalent to C<-DateTimeOriginal-=1.5>. +See L<Image::ExifTool::Shift.pl|Image::ExifTool::Shift.pl> for details.) + +=item exiftool -createdate+=3 -modifydate+=3 a.jpg b.jpg + +Add 3 hours to the CreateDate and ModifyDate timestamps of two images. + +=item exiftool -AllDates+=1:30 -if '$make eq E<34>CanonE<34>' dir + +Shift the values of DateTimeOriginal, CreateDate and ModifyDate forward by 1 +hour and 30 minutes for all Canon images in a directory. (The AllDates tag +is provided as a shortcut for these three tags, allowing them to be accessed +via a single tag.) + +=item exiftool -xmp:city=Kingston image1.jpg image2.nef + +Write a tag to the XMP group of two images. (Without the C<xmp:> this tag +would get written to the IPTC group since C<City> exists in both, and IPTC +is preferred by default.) + +=item exiftool -LightSource-='Unknown (0)' dst.tiff + +Delete C<LightSource> tag only if it is unknown with a value of 0. + +=item exiftool -whitebalance-=auto -WhiteBalance=tung dst.jpg + +Set C<WhiteBalance> to C<Tungsten> only if it was previously C<Auto>. + +=item exiftool -comment-= -comment='new comment' a.jpg + +Write a new comment only if the image doesn't have one already. + +=item exiftool -o %d%f.xmp dir + +Create XMP meta information data files for all images in C<dir>. + +=item exiftool -o test.xmp -owner=Phil -title='XMP File' + +Create an XMP data file only from tags defined on the command line. + +=item exiftool '-ICC_Profile<=%d%f.icc' image.jpg + +Write ICC_Profile to an image from a C<.icc> file of the same name. + +=item exiftool -hierarchicalkeywords='{keyword=one,children={keyword=B}}' + +Write structured XMP information. See L<https://exiftool.org/struct.html> +for more details. + +=item exiftool -trailer:all= image.jpg + +Delete any trailer found after the end of image (EOI) in a JPEG file. A +number of digital cameras store a large PreviewImage after the JPEG EOI, and +the file size may be reduced significantly by deleting this trailer. See +the L<JPEG Tags documentation|Image::ExifTool::TagNames/JPEG Tags> for a +list of recognized JPEG trailers. + +=back + +=head1 COPYING EXAMPLES + +These examples demonstrate the ability to copy tag values between files. + +=over 5 + +=item exiftool -tagsFromFile src.cr2 dst.jpg + +Copy the values of all writable tags from C<src.cr2> to C<dst.jpg>, writing +the information to same-named tags in the preferred groups. + +=item exiftool -TagsFromFile src.jpg -all:all dst.jpg + +Copy the values of all writable tags from C<src.jpg> to C<dst.jpg>, +preserving the original tag groups. + +=item exiftool -all= -tagsfromfile src.jpg -exif:all dst.jpg + +Erase all meta information from C<dst.jpg> image, then copy EXIF tags from +C<src.jpg>. + +=item exiftool -exif:all= -tagsfromfile @ -all:all -unsafe bad.jpg + +Rebuild all EXIF meta information from scratch in an image. This technique +can be used in JPEG images to repair corrupted EXIF information which +otherwise could not be written due to errors. The C<Unsafe> tag is a +shortcut for unsafe EXIF tags in JPEG images which are not normally copied. +See the L<tag name documentation|Image::ExifTool::TagNames> for more details +about unsafe tags. + +=item exiftool -Tagsfromfile a.jpg out.xmp + +Copy meta information from C<a.jpg> to an XMP data file. If the XMP data +file C<out.xmp> already exists, it will be updated with the new information. +Otherwise the XMP data file will be created. Only metadata-only files may +be created like this (files containing images may be edited but not +created). See L</WRITING EXAMPLES> above for another technique to generate +XMP files. + +=item exiftool -tagsFromFile a.jpg -XMP:All= -ThumbnailImage= -m b.jpg + +Copy all meta information from C<a.jpg> to C<b.jpg>, deleting all XMP +information and the thumbnail image from the destination. + +=item exiftool -TagsFromFile src.jpg -title -author=Phil dst.jpg + +Copy title from one image to another and set a new author name. + +=item exiftool -TagsFromFile a.jpg -ISO -TagsFromFile b.jpg -comment +dst.jpg + +Copy ISO from one image and Comment from another image to a destination +image. + +=item exiftool -tagsfromfile src.jpg -exif:all --subifd:all dst.jpg + +Copy only the EXIF information from one image to another, excluding SubIFD +tags. + +=item exiftool '-FileModifyDateE<lt>DateTimeOriginal' dir + +Use the original date from the meta information to set the same file's +filesystem modification date for all images in a directory. (Note that +C<-TagsFromFile @> is assumed if no other B<-TagsFromFile> is specified when +redirecting information as in this example.) + +=item exiftool -TagsFromFile src.jpg '-xmp:allE<lt>all' dst.jpg + +Copy all possible information from C<src.jpg> and write in XMP format to +C<dst.jpg>. + +=item exiftool '-Description<${FileName;s/\.[^.]*$//}' dir + +Set the image Description from the file name after removing the extension. +This example uses the L</Advanced formatting feature> to perform a +substitution operation to remove the last dot and subsequent characters from +the file name. + +=item exiftool -@ iptc2xmp.args -iptc:all= a.jpg + +Translate IPTC information to XMP with appropriate tag name conversions, and +delete the original IPTC information from an image. This example uses +iptc2xmp.args, which is a file included with the ExifTool distribution that +contains the required arguments to convert IPTC information to XMP format. +Also included with the distribution are xmp2iptc.args (which performs the +inverse conversion) and a few more .args files for other conversions between +EXIF, IPTC and XMP. + +=item exiftool -tagsfromfile %d%f.CR2 -r -ext JPG dir + +Recursively rewrite all C<JPG> images in C<dir> with information copied from +the corresponding C<CR2> images in the same directories. + +=item exiftool '-keywords+E<lt>make' image.jpg + +Add camera make to list of keywords. + +=item exiftool '-commentE<lt>ISO=$exif:iso Exposure=${shutterspeed}' dir + +Set the Comment tag of all images in C<dir> from the values of the EXIF:ISO +and ShutterSpeed tags. The resulting comment will be in the form "ISO=100 +Exposure=1/60". + +=item exiftool -TagsFromFile src.jpg -icc_profile dst.jpg + +Copy ICC_Profile from one image to another. + +=item exiftool -TagsFromFile src.jpg -all:all dst.mie + +Copy all meta information in its original form from a JPEG image to a MIE +file. The MIE file will be created if it doesn't exist. This technique can +be used to store the metadata of an image so it can be inserted back into +the image (with the inverse command) later in a workflow. + +=item exiftool -o dst.mie -all:all src.jpg + +This command performs exactly the same task as the command above, except +that the B<-o> option will not write to an output file that already exists. + +=item exiftool -b -jpgfromraw -w %d%f_%ue.jpg -execute -b -previewimage -w +%d%f_%ue.jpg -execute -tagsfromfile @ -srcfile %d%f_%ue.jpg +-overwrite_original -common_args --ext jpg DIR + +[Advanced] Extract JpgFromRaw or PreviewImage from all but JPG files in DIR, +saving them with file names like C<image_EXT.jpg>, then add all meta +information from the original files to the extracted images. Here, the +command line is broken into three sections (separated by B<-execute> +options), and each is executed as if it were a separate command. The +B<-common_args> option causes the C<--ext jpg DIR> arguments to be applied +to all three commands, and the B<-srcfile> option allows the extracted JPG +image to be the source file for the third command (whereas the RAW files are +the source files for the other two commands). + +=back + +=head1 RENAMING EXAMPLES + +By writing the C<FileName> and C<Directory> tags, files are renamed and/or +moved to new directories. This can be particularly useful and powerful for +organizing files by date when combined with the B<-d> option. New +directories are created as necessary, but existing files will not be +overwritten. The format codes %d, %f and %e may be used in the new file +name to represent the directory, name and extension of the original file, +and %c may be used to add a copy number if the file already exists (see the +B<-w> option for details). Note that if used within a date format string, +an extra '%' must be added to pass these codes through the date/time parser. +(And further note that in a Windows batch file, all '%' characters must also +be escaped, so in this extreme case '%%%%f' is necessary to pass a simple +'%f' through the two levels of parsing.) See +L<https://exiftool.org/filename.html> for additional documentation and +examples. + +=over 5 + +=item exiftool -filename=new.jpg dir/old.jpg + +Rename C<old.jpg> to C<new.jpg> in directory C<dir>. + +=item exiftool -directory=%e dir + +Move all files from directory C<dir> into directories named by the original +file extensions. + +=item exiftool '-Directory<DateTimeOriginal' -d %Y/%m/%d dir + +Move all files in C<dir> into a directory hierarchy based on year, month and +day of C<DateTimeOriginal>. eg) This command would move the file +C<dir/image.jpg> with a C<DateTimeOriginal> of C<2005:10:12 16:05:56> to +C<2005/10/12/image.jpg>. + +=item exiftool -o . '-Directory<DateTimeOriginal' -d %Y/%m/%d dir + +Same effect as above except files are copied instead of moved. + +=item exiftool '-filename<%f_${model;}.%e' dir + +Rename all files in C<dir> by adding the camera model name to the file name. +The semicolon after the tag name inside the braces causes characters which +are invalid in Windows file names to be deleted from the tag value (see the +L</Advanced formatting feature> for an explanation). + +=item exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir + +Rename all images in C<dir> according to the C<CreateDate> date and time, +adding a copy number with leading '-' if the file already exists (C<%-c>), +and preserving the original file extension (C<%e>). Note the extra '%' +necessary to escape the filename codes (C<%c> and C<%e>) in the date format +string. + +=item exiftool -r '-FileName<CreateDate' -d %Y-%m-%d/%H%M_%%f.%%e dir + +Both the directory and the filename may be changed together via the +C<FileName> tag if the new C<FileName> contains a '/'. The example above +recursively renames all images in a directory by adding a C<CreateDate> +timestamp to the start of the filename, then moves them into new directories +named by date. + +=item exiftool '-FileName<${CreateDate}_$filenumber.jpg' -d %Y%m%d -ext jpg . + +Set the filename of all JPG images in the current directory from the +CreateDate and FileNumber tags, in the form "20060507_118-1861.jpg". + +=back + +=head1 GEOTAGGING EXAMPLES + +ExifTool implements geotagging via 3 special tags: Geotag (which for +convenience is also implemented as an exiftool option), Geosync and Geotime. +The examples below highlight some geotagging features. See +L<https://exiftool.org/geotag.html> for additional documentation. + +=over 5 + +=item exiftool -geotag track.log a.jpg + +Geotag an image (C<a.jpg>) from position information in a GPS track log +(C<track.log>). Since the C<Geotime> tag is not specified, the value of +DateTimeOriginal is used for geotagging. Local system time is assumed +unless DateTimeOriginal contains a timezone. + +=item exiftool -geotag t.log -geotime='2009:04:02 13:41:12-05:00' a.jpg + +Geotag an image with the GPS position for a specific time. + +=item exiftool -geotag log.gpx '-xmp:geotimeE<lt>createdate' dir + +Geotag all images in directory C<dir> with XMP tags instead of EXIF tags, +based on the image CreateDate. + +=item exiftool -geotag a.log -geosync=-20 dir + +Geotag images in directory C<dir>, accounting for image timestamps which +were 20 seconds ahead of GPS. + +=item exiftool -geotag a.log -geosync=1.jpg -geosync=2.jpg dir + +Geotag images using time synchronization from two previously geotagged images +(1.jpg and 2.jpg), synchronizing the image and GPS times using a linear time +drift correction. + +=item exiftool -geotag a.log '-geotimeE<lt>${createdate}+01:00' dir + +Geotag images in C<dir> using CreateDate with the specified timezone. If +CreateDate already contained a timezone, then the timezone specified on the +command line is ignored. + +=item exiftool -geotag= a.jpg + +Delete GPS tags which may have been added by the geotag feature. Note that +this does not remove all GPS tags -- to do this instead use C<-gps:all=>. + +=item exiftool -xmp:geotag= a.jpg + +Delete XMP GPS tags which were added by the geotag feature. + +=item exiftool -xmp:geotag=track.log a.jpg + +Geotag an image with XMP tags, using the time from DateTimeOriginal. + +=item exiftool -geotag a.log -geotag b.log -r dir + +Combine multiple track logs and geotag an entire directory tree of images. + +=item exiftool -geotag 'tracks/*.log' -r dir + +Read all track logs from the C<tracks> directory. + +=item exiftool -p gpx.fmt -d %Y-%m-%dT%H:%M:%SZ dir > out.gpx + +Generate a GPX track log from all images in directory C<dir>. This example +uses the C<gpx.fmt> file included in the full ExifTool distribution package +and assumes that the images in C<dir> have all been previously geotagged. + +=back + +=head1 PIPING EXAMPLES + +=over 5 + +=item cat a.jpg | exiftool - + +Extract information from stdin. + +=item exiftool image.jpg -thumbnailimage -b | exiftool - + +Extract information from an embedded thumbnail image. + +=item cat a.jpg | exiftool -iptc:keywords+=fantastic - > b.jpg + +Add an IPTC keyword in a pipeline, saving output to a new file. + +=item curl -s http://a.domain.com/bigfile.jpg | exiftool -fast - + +Extract information from an image over the internet using the cURL utility. +The B<-fast> option prevents exiftool from scanning for trailer information, +so only the meta information header is transferred. + +=item exiftool a.jpg -thumbnailimage -b | exiftool -comment=wow - | +exiftool a.jpg -thumbnailimage'<=-' + +Add a comment to an embedded thumbnail image. (Why anyone would want to do +this I don't know, but I've included this as an example to illustrate the +flexibility of ExifTool.) + +=back + +=head1 INTERRUPTING EXIFTOOL + +Interrupting exiftool with a CTRL-C or SIGINT will not result in partially +written files or temporary files remaining on the hard disk. The exiftool +application traps SIGINT and defers it until the end of critical processes +if necessary, then does a proper cleanup before exiting. + +=head1 EXIT STATUS + +The exiftool application exits with a status of 0 on success, or 1 if an +error occurred, or 2 if all files failed the B<-if> condition (for any of +the commands if B<-execute> was used). + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey + +This is free software; you can redistribute it and/or modify it under the +same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagNames(3pm)|Image::ExifTool::TagNames>, +L<Image::ExifTool::Shortcuts(3pm)|Image::ExifTool::Shortcuts>, +L<Image::ExifTool::Shift.pl|Image::ExifTool::Shift.pl> + +=cut + +#------------------------------------------------------------------------------ +# end diff --git a/fmt_files/gpx.fmt b/fmt_files/gpx.fmt new file mode 100644 index 0000000..b3e4f75 --- /dev/null +++ b/fmt_files/gpx.fmt @@ -0,0 +1,36 @@ +#------------------------------------------------------------------------------ +# File: gpx.fmt +# +# Description: Example ExifTool print format file to generate a GPX track log +# +# Usage: exiftool -p gpx.fmt -ee3 FILE [...] > out.gpx +# +# Requires: ExifTool version 10.49 or later +# +# Revisions: 2010/02/05 - P. Harvey created +# 2018/01/04 - PH Added IF to be sure position exists +# 2018/01/06 - PH Use DateFmt function instead of -d option +# 2019/10/24 - PH Preserve sub-seconds in GPSDateTime value +# +# Notes: 1) Input file(s) must contain GPSLatitude and GPSLongitude. +# 2) The -ee3 option is to extract the full track from video files. +# 3) The -fileOrder option may be used to control the order of the +# generated track points when processing multiple files. +#------------------------------------------------------------------------------ +#[HEAD]<?xml version="1.0" encoding="utf-8"?> +#[HEAD]<gpx version="1.0" +#[HEAD] creator="ExifTool $ExifToolVersion" +#[HEAD] xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +#[HEAD] xmlns="http://www.topografix.com/GPX/1/0" +#[HEAD] xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd"> +#[HEAD]<trk> +#[HEAD]<number>1</number> +#[HEAD]<trkseg> +#[IF] $gpslatitude $gpslongitude +#[BODY]<trkpt lat="$gpslatitude#" lon="$gpslongitude#"> +#[BODY] <ele>$gpsaltitude#</ele> +#[BODY] <time>${gpsdatetime#;my ($ss)=/\.\d+/g;DateFmt("%Y-%m-%dT%H:%M:%SZ");s/Z/${ss}Z/ if $ss}</time> +#[BODY]</trkpt> +#[TAIL]</trkseg> +#[TAIL]</trk> +#[TAIL]</gpx> diff --git a/fmt_files/gpx_wpt.fmt b/fmt_files/gpx_wpt.fmt new file mode 100644 index 0000000..f1828da --- /dev/null +++ b/fmt_files/gpx_wpt.fmt @@ -0,0 +1,40 @@ +#------------------------------------------------------------------------------ +# File: gpx_wpt.fmt +# +# Description: Example ExifTool print format file to generate GPX waypoints +# with pictures +# +# Usage: exiftool -p gpx_wpt.fmt -ee3 FILE [...] > out.gpx +# +# Requires: ExifTool version 10.49 or later +# +# Revisions: 2010/03/13 - Peter Grimm created +# 2018/01/04 - PH Added IF to be sure position exists +# 2018/01/06 - PH Use DateFmt function instead of -d option +# 2019/10/24 - PH Preserve sub-seconds in GPSDateTime value +# +# Notes: 1) Input file(s) must contain GPSLatitude and GPSLongitude. +# 2) The -ee3 option is to extract the full track from video files. +# 3) The -fileOrder option may be used to control the order of the +# generated track points when processing multiple files. +#------------------------------------------------------------------------------ +#[HEAD]<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +#[HEAD]<gpx version="1.1" +#[HEAD] creator="ExifTool $ExifToolVersion" +#[HEAD] xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +#[HEAD] xmlns="http://www.topografix.com/GPX/1/1" +#[HEAD] xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"> +#[IF] $gpslatitude $gpslongitude +#[BODY]<wpt lat="$gpslatitude#" lon="$gpslongitude#"> +#[BODY] <ele>$gpsaltitude#</ele> +#[BODY] <time>${gpsdatetime#;my ($ss)=/\.\d+/g;DateFmt("%Y-%m-%dT%H:%M:%SZ");s/Z/${ss}Z/ if $ss}</time> +#[BODY] <name>$filename</name> +#[BODY] <link href="$directory/$filename"/> +#[BODY] <sym>Scenic Area</sym> +#[BODY] <extensions> +#[BODY] <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"> +#[BODY] <gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode> +#[BODY] </gpxx:WaypointExtension> +#[BODY] </extensions> +#[BODY]</wpt> +#[TAIL]</gpx> \ No newline at end of file diff --git a/fmt_files/kml.fmt b/fmt_files/kml.fmt new file mode 100644 index 0000000..2323e4b --- /dev/null +++ b/fmt_files/kml.fmt @@ -0,0 +1,59 @@ +#------------------------------------------------------------------------------ +# File: kml.fmt +# +# Description: Example ExifTool print format file for generating a +# Google Earth KML file from a collection of geotagged images +# +# Usage: exiftool -p kml.fmt -r DIR [...] > out.kml +# +# Requires: ExifTool version 10.41 or later +# +# Revisions: 2010/02/05 - P. Harvey created +# 2013/02/05 - PH Fixed camera icon to work with new Google Earth +# 2017/02/02 - PH Organize into folders based on file directory +# 2018/01/04 - PH Added IF to be sure position exists +# 2020/01/11 - F. Kotov Limited image preview size to 500px +# +# Notes: 1) Input files must contain GPSLatitude and GPSLongitude. +# 2) Add the -ee3 option to extract the full track from video files. +# 3) For Google Earth to be able to find the images, the input +# images must be specified using relative paths, and "out.kml" +# must stay in the same directory as where the command was run. +# 4) Google Earth is picky about the case of the image file extension, +# and may not be able to display the image if an upper-case +# extension is used. +# 5) The -fileOrder option may be used to control the order of the +# generated placemarks when processing multiple files. +#------------------------------------------------------------------------------ +#[HEAD]<?xml version="1.0" encoding="UTF-8"?> +#[HEAD]<kml xmlns="http://earth.google.com/kml/2.0"> +#[HEAD] <Document> +#[HEAD] <name>My Photos</name> +#[HEAD] <open>1</open> +#[HEAD] <Style id="Photo"> +#[HEAD] <IconStyle> +#[HEAD] <Icon> +#[HEAD] <href>http://maps.google.com/mapfiles/kml/pal4/icon38.png</href> +#[HEAD] <scale>1.0</scale> +#[HEAD] </Icon> +#[HEAD] </IconStyle> +#[HEAD] </Style> +#[SECT] <Folder> +#[SECT] <name>$main:directory</name> +#[SECT] <open>0</open> +#[IF] $gpslatitude $gpslongitude +#[BODY] <Placemark> +#[BODY] <description><![CDATA[<img src='$main:directory/$main:filename' +#[BODY] style='max-width:500px;max-height:500px;'> ]]> +#[BODY] </description> +#[BODY] <Snippet/> +#[BODY] <name>$filename</name> +#[BODY] <styleUrl>#Photo</styleUrl> +#[BODY] <Point> +#[BODY] <altitudeMode>clampedToGround</altitudeMode> +#[BODY] <coordinates>$gpslongitude#,$gpslatitude#,0</coordinates> +#[BODY] </Point> +#[BODY] </Placemark> +#[ENDS] </Folder> +#[TAIL] </Document> +#[TAIL]</kml> diff --git a/fmt_files/kml_track.fmt b/fmt_files/kml_track.fmt new file mode 100644 index 0000000..6ee25cf --- /dev/null +++ b/fmt_files/kml_track.fmt @@ -0,0 +1,46 @@ +#------------------------------------------------------------------------------ +# File: kml.fmt +# +# Description: Example ExifTool print format file for generating a +# track in Google Earth KML format from a collection of +# geotagged images or timed GPS from video files +# +# Usage: From a collection of images: +# +# exiftool -p kml.fmt -r DIR [...] > out.kml +# +# From video files: +# +# exiftool -p kml.fmt -ee3 FILEorDIR [...] > out.kml +# +# Requires: ExifTool version 10.41 or later +# +# Revisions: 2019/10/29 - P. Harvey created +# +# Notes: 1) Input files must contain GPSLatitude and GPSLongitude. +# 2) The -fileOrder option may be used to control the order of the +# waypoints when processing multiple still-image files, or the +# order of the tracks when processing multiple video files. +#------------------------------------------------------------------------------ +#[HEAD]<?xml version="1.0" encoding="UTF-8"?> +#[HEAD]<kml xmlns="http://earth.google.com/kml/2.0"> +#[HEAD] <Document> +#[HEAD] <name>My Track</name> +#[HEAD] <open>1</open> +#[SECT] <Placemark> +#[SECT] <name>${main:directory;$_=$self->GetValue('FileName') if $self->Options('ExtractEmbedded')}</name> +#[SECT] <Style> +#[SECT] <LineStyle> +#[SECT] <color>#ff4499ff</color> +#[SECT] <width>3</width> +#[SECT] </LineStyle> +#[SECT] </Style> +#[SECT] <LineString> +#[SECT] <altitudeMode>clampToGround</altitudeMode> +#[SECT] <coordinates> +#[BODY]$gpslongitude#,$gpslatitude#,0 +#[ENDS] </coordinates> +#[ENDS] </LineString> +#[ENDS] </Placemark> +#[TAIL] </Document> +#[TAIL]</kml> diff --git a/html/ExifTool.html b/html/ExifTool.html new file mode 100644 index 0000000..71b2226 --- /dev/null +++ b/html/ExifTool.html @@ -0,0 +1,2304 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd"> +<html> +<head> +<title>Image::ExifTool + + + + +

The Image::ExifTool Perl Library Module

+ +

Description

+ +

The Image::ExifTool library provides a set of Perl modules to read and +write meta information in a wide variety of image, audio, video and document +files. This document details the public methods of the ExifTool API.

+ +

Methods

+ +

All ExifTool features are accessed through the methods of the public +interface listed below. Other Image::ExifTool methods and modules should not be +accessed directly because their interface may change with future versions.

+ +

The ExifTool methods should never die or issue a warning to STDERR if called +with the proper arguments (with the exception of +SetNewValue which may send an error message to +STDERR, but only when called in scalar context). Error and warning messages +that occur during processing are stored in the values of the Error and Warning +tags, and are accessible via the GetValue method to +retrieve a single Error or Warning message, or GetInfo to +retrieve any number of them.

+ +

The ExifTool methods are not thread safe.

+ +
+ + + + + +
+ +

Using ExifTool

+ +

The ExifTool module may be used by simply calling the +ImageInfo function:

+ +
+use Image::ExifTool qw(:Public);
+my $info = ImageInfo('image.jpg');
+
+ +

or in a more object-oriented fashion, by creating an ExifTool object:

+ +
+use Image::ExifTool;
+my $exifTool = new Image::ExifTool;
+my $info = $exifTool->ImageInfo('image.jpg');
+
+ +

The object-oriented method allows more flexibility, but is slightly more +complicated. You choose the method that you prefer.

+ +

The $info value returned by ImageInfo in the above +examples is a reference to a hash containing the tag/value pairs. Here is a +simplified example which prints out this information:

+ +
+foreach (keys %$info) {
+    print "$_ => $$info{$_}\n";
+}
+
+ +

See ImageInfo for a more detailed description of the +info hash entries.

+ +

And the technique for writing meta information is equally simple:

+ +
+use Image::ExifTool;
+my $exifTool = new Image::ExifTool;
+$exifTool->SetNewValue(Author => 'Phil Harvey');
+$exifTool->WriteInfo('image.jpg','modified_image.jpg');
+
+ +

Configuration

+ +

User-defined tags can be added via the ExifTool configuration file, or by +defining the %Image::ExifTool::UserDefined hash before calling any ExifTool +functions. See "ExifTool_config" in the ExifTool +distribution for more details.

+ +

By default ExifTool looks for a configuration file named ".ExifTool_config" +first in your home directory, then in the directory of the application script, +but a different directory may be specified by setting the EXIFTOOL_HOME +environment variable, or a different file may be specified by setting the +ExifTool "configFile" variable before using Image::ExifTool. For +example:

+ +
+BEGIN { $Image::ExifTool::configFile = '/Users/phil/myconfig.cfg' }
+use Image::ExifTool;
+
+ +

The configuration feature may also be disabled by setting +"configFile" to an empty string:

+ +
+BEGIN { $Image::ExifTool::configFile = '' }
+use Image::ExifTool;
+
+ +

ImageInfo

+ +

Read image file and return meta information. This is the one-step function for +retrieving meta information from an image. Internally, +ImageInfo calls ExtractInfo +to extract data from the image, GetInfo to generate the +information hash, and GetTagList for the returned tag +list.

+ +
+ + + +
PrototypeImageInfo($;@)
Inputs0) [optional] ExifTool object reference +
1) File name, file reference or scalar reference +
2-N) [optional] list of tag names to find (or tag list reference or + options hash reference, see below) +
ReturnsReference to hash of tag-key/value pairs
+ +

Examples:

+ +
Non object-oriented example showing use of options and returning tag list: +
+use Image::ExifTool qw(ImageInfo);
+my @ioTagList;
+my $info;
+
+$info = ImageInfo('image.jpg', \@ioTagList, {Sort => 'Group0'});
+
+ +
Object-oriented example to read from a file that is already open: +
+my $exifTool = new Image::ExifTool;
+
+$info = $exifTool->ImageInfo(\*FILE_PT, 'Aperture', 'ShutterSpeed', 'ISO');
+
+ +
Extract information from an image in memory: +
+$info = $exifTool->ImageInfo(\$imageData);
+
+ +
Extract information from an embedded thumbnail image: +
+$info = ImageInfo('image.jpg', 'thumbnailimage');
+my $thumbInfo = ImageInfo($$info{ThumbnailImage});
+
+ +
Using an ExifTool object to set the options before calling +ImageInfo: +
+my $filename = shift || die "Please specify filename\n";
+my @ioTagList = qw(filename imagesize xmp:creator exif:* -ifd1:*);
+
+$exifTool->Options(Unknown => 1, DateFormat => '%H:%M:%S %a. %b. %e, %Y');
+$info = $exifTool->ImageInfo($filename, \@ioTagList);
+
+ +

Function Arguments:

+ +

ImageInfo is very flexible about the arguments +passed to it, and interprets them based on their type. It may be called with +one or more arguments. The one required argument is either a SCALAR (the image +file name), a file reference (a reference to the image file) or a SCALAR +reference (a reference to the image in memory). Other arguments are optional. +The order of the arguments is not significant, except that the first SCALAR is +taken to be the file name unless a file reference or scalar reference comes +earlier in the argument list.

+ +

Below is a more detailed explanation of how the ImageInfo +function arguments are interpreted.

+ +
+
ExifTool ref +ImageInfo may be called with an ExifTool object if +desired. Advantages of using the object-oriented form are that options may be +set before calling ImageInfo, and the object may be +used afterward to access member functions. Must be the first argument if used. + +
SCALAR +The first scalar argument is taken to be the file name unless an earlier +argument specified the image data via a file reference (file ref) or data +reference (SCALAR ref). The remaining scalar arguments are names of tags for +requested information. All tags are returned if no tags are specified. +
 
+Tag names are case-insensitive and may be prefixed by optional group names +separated by colons. A group name may begin with a family number (eg. +'1IPTC:Keywords'), to restrict matches to a specific family. In the +tag name, a '?' matches any single character and a '*' +matches zero or more characters. Thus 'GROUP:*' represents all +tags in a specific group. Wildcards may not be used in group names, with the +exception that a group name of '*' may be used to extract all +available instances of a tag regardless of the +Duplicates setting (eg. '*:WhiteBalance'). +Multiple groups may be specified (eg. 'EXIF:Time:*' extracts all +EXIF Time tags). And finally, a leading '-' indicates a tag to be +excluded (eg. '-IFD1:*'), or a trailing '#' causes the +ValueConv value to be returned for this tag. +
 
+Note that keys in the returned information hash and elements of the returned tag +list are not necessarily the same as these tag names because group names are +removed, the case may be changed, and an instance number may be added. For this +reason it is best to use either the keys of the returned hash or the elements of +the returned tag list when accessing the tag values. +
 
+See the TagNames documentation for a +complete list of ExifTool tag names. + +
File ref +A reference to an open image file. If you use this method (or a SCALAR +reference) to access information in an image, the FileName and Directory tags +will not be returned. (Also, the FileSize, FileModifyDate, FilePermissions and +FileAttributes tags will not be returned unless it is a plain file.) Image +processing begins at the current file position, and on return the file position +is unspecified. May be either a standard filehandle or a reference to a +File::RandomAccess object. +
 
+[Advanced: To allow a non-rewindable stream (eg. a network socket) to be +re-read after processing with ExifTool, first wrap the file reference in a +File::RandomAccess object, then pass this object to +ImageInfo. The File::RandomAccess object will buffer +the file if necessary, and may be used to re-read the file after +ImageInfo returns.] + +
SCALAR ref +A reference to image data in memory. + +
ARRAY ref +Reference to a list of tag names. On entry, any elements in the list are added +to the list of requested tags. On return, this list is updated to contain an +ordered list of tag keys for the returned information. +
 
+There will be 1:1 correspondence between the requested tags and the returned +tag keys only if the Duplicates option is 0 and +Sort is 'Input'. (With +Duplicates enabled, there may be more entries in the +returned list of tag keys, and with other Sort settings the +entries may not be in the same order as requested.) If a requested tag doesn't +exist, a tag key is still generated, but the tag value is undefined. + +
HASH ref +Reference to a hash containing the options settings valid for this call only. +See Options documentation below for a list of available +options. Options specified as arguments to ImageInfo +take precedence over Options settings. +
+ +

Return Value:

+ +

ImageInfo returns a reference to a hash of +tag-key/value pairs. The tag keys are identifiers -- essentially case-sensitive +tag names with an appended instance number if multiple tags with the same name +were extracted from the image. Many of the ExifTool functions require a tag key +as an argument. Use GetTagName to get the tag name +for a given tag key. Note that the case of the tag names may not be the same as +requested.

+ +

Values of the returned hash are usually simple scalars, but a scalar +reference is used to indicate binary data and an array reference may be used to +indicate a list. Also, a hash reference may be returned if the +Struct option is used. Lists of values are joined by +commas into a single string only if the PrintConv option is enabled and the +ListJoin option is enabled (which are the defaults). Note that binary values +are not necessarily extracted unless specifically requested, or the Binary +option is enabled and the tag is not specifically excluded. If not extracted the +value is a reference to a string of the form "Binary data ##### +bytes".

+ +

Here is a simple example to print out the information returned by +ImageInfo:

+ +
+foreach (keys %$info) {
+    my $val = $$info{$_};
+    if (ref $val eq 'ARRAY') {
+        $val = join(', ', @$val);
+    } elsif (ref $val eq 'SCALAR') {
+        $val = '(Binary data)';
+    }
+    printf("%-24s : %s\n", $_, $val);
+}
+
+ +

which gives output like this (PrintConv enabled):

+ +
+WhiteBalance             : Auto
+FNumber                  : 3.5
+InteroperabilityOffset   : 936
+XResolution              : 72
+ISO                      : 100
+ThumbnailImage           : (Binary data)
+FlashOn                  : On
+Make                     : FUJIFILM
+ShutterSpeedValue        : 1/64
+ExposureCompensation     : 0
+Sharpness                : Soft
+ResolutionUnit           : inches
+
+ +

Notes:

+ +

ExifTool returns all values as byte strings of encoded characters. Perl wide +characters are not used. See FAQ number 10 for +details about the encodings. By default, most returned strings are encoded in +UTF-8. For these, Encode::decode_utf8() may be used to convert to a sequence of +logical Perl characters.

+ +

As well as tags representing information extracted from the image, the +following Extra tags generated by ExifTool may +be returned:

+ +
+ + + +
ExifToolVersionThe ExifTool version number
ErrorAn error message if the image could not be processed
WarningA warning message if problems were encountered +while processing the image
+ +

new

+

Create a new ExifTool object.

+

Example:

+
+my $exifTool = new Image::ExifTool;
+
+ +

One ExifTool object may be used to process many files, so creating multiple +ExifTool objects usually is not necessary.

+

Note that ExifTool uses AUTOLOAD to load non-member methods, so any class +using Image::ExifTool as a base class must define an AUTOLOAD which calls +Image::ExifTool::DoAutoLoad(). ie)

+ +
+sub AUTOLOAD
+{
+    Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
+}
+
+ +
+The following functions require an ExifTool object as the first argument +
+ +

Options

+

Get/set ExifTool options. This function can be called to set the default +options for an ExifTool object. Options set this way are in effect for all +function calls but may be overridden by options passed as arguments to some +functions. Option names are not case sensitive.

+

The default option values may be changed by defining a +%Image::ExifTool::UserDefined::Options hash. See the +ExifTool_config file in the full ExifTool distribution +for examples. A default of undef has the same behaviour as a value of 0 for +numerical options.

+
+ + + +
PrototypeOptions($$;@)
Inputs0) ExifTool object reference +
1) Parameter name (case-insensitive, see table below) +
2) [optional] Option value if specified (may be undef to clear option) +
3-N) [optional] Additional parameter/value pairs +
ReturnsPrevious value of last specified parameter
+ +

Available options:

+

Note that these API options may be also be used in the +exiftool application via the command-line +-api option.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ExifTool Options
OptionDescriptionValuesDefault
BinaryFlag to extract the value data for all binary tags. + Tag values representing large binary data blocks (eg. ThumbnailImage) + are not necessarily extracted unless this option is set or the tag is + specifically requested by name.0 or 1undef
BlockExtractFlag to extract some directories + (mentioned in the Tag Name documentation) as a block. + + + +
0 =Extract as block only if tag specified by name
1 =Extract as block, and extract contained tags
2 =Extract as block without contained tags
undef
ByteOrderThe byte order for newly created EXIF segments when + writing. Note that if EXIF information already exists, the existing order is + maintained. If ByteOrder is not defined, then the order of the maker notes is + used (if they are being copied), otherwise big-endian ('MM') order is assumed. + This can also be set via the ExifByteOrder tag, + but the ByteOrder option takes precedence if both are set.'MM','II' or undefundef
CharsetCharacter set for encoding character + strings passed to/from ExifTool containing code points above U+007F. Note + that this option affects some types of information when reading/writing the + file and other types when getting/setting tag values, so it must be defined + for both types of access. Charset values listed to the right have aliases + which are given in brackets. Case is not significant. See + FAQ #10 for more information about character sets. + + + + + + + + + + + + + + + + + + + + + + +
UTF8(cp65001, UTF-8)
Latin(cp1252, Latin1)
Latin2(cp1250)
Cyrillic(cp1251, Russian)
Greek(cp1253)
Turkish(cp1254)
Hebrew(cp1255)
Arabic(cp1256)
Baltic(cp1257)
Vietnam(cp1258)
Thai(cp874)
DOSLatinUS(cp437)
DOSLatin1(cp850)
DOSCyrillic(cp866)
MacRoman(cp10000, Mac, Roman)
MacLatin2(cp10029)
MacCyrillic(cp10007)
MacGreek(cp10006)
MacTurkish(cp10081)
MacRomanian(cp10010)
MacIceland(cp10079)
MacCroatian(cp10082)
'UTF8'
CharsetEXIFInternal encoding to use for stored + EXIF "ASCII" string values. May also be set to undef to pass through EXIF + "ASCII" values without recoding. Set to "UTF8" to conform with the MWG + recommendation.(see Charset option)
or undef
undef
CharsetFileNameExternal character set + used when specifying file names. When set in Windows, this triggers use of + Windows Unicode file library routines (requires Win32API::File). May also + be set to an empty string to avoid "encoding not specified" warnings on Windows.(see Charset option)
or undef
undef
CharsetID3Internal encoding to assume for ID3v1 strings. By + the specification ID3v1 strings should be encoded in ISO 8859-1 (essentially + 'Latin'), but some applications may use local encoding instead. This option + allows different encodings to be specified.(see Charset option)'Latin'
CharsetIPTCFallback internal IPTC character set to assume if IPTC information + contains no CodedCharacterSet tag.(see Charset option)'Latin'
CharsetPhotoshopInternal encoding to assume for Photoshop IRB resource names.(see Charset option)'Latin'
CharsetQuickTimeInternal encoding to assume for QuickTime + strings stored with an unspecified encoding.(see Charset option)'MacRoman'
CharsetRIFFInternal encoding to assume for strings in RIFF + metadata (eg. AVI and WAV files). The default value of 0 assumes 'Latin' encoding unless otherwise + specified by the RIFF CSET chunk. Set to undef to pass through strings without recoding.(see Charset option)
or 0 or undef
0
CompactComma-delimited list of settings for writing compact XMP. + Note that 'NoPadding' effects only embedded XMP since padding is never written for + stand-alone XMP files. Also note that 'OneDesc' is not recommended when writing + XMP larger than 64 kB to a JPG file because it interferes with ExifTool's technique + of splitting off large rdf:Description elements into the extended XMP. Case is not + significant for any of these options. Some options have aliases (shown in brackets). + + + + + + + + +
NoPadding =Avoid 2 kB of recommended padding at end of XMP (NoPad)
NoIndent =Avoid spaces to indent lines for readability (NoSpace, NoSpaces)
NoNewline =Avoid unnecessary newlines (NoNewlines)
Shorthand =Use XMP Shorthand format
OneDesc =Combine XMP properties into a single rdf:Description (OneDescr)
AllSpace ='NoPadding,NoIndent,NoNewline'
AllFormat ='Shorthand,OneDesc'
All ='AllSpace,AllFormat'
undef
CompositeFlag to generate Composite tags when extracting information.0 or 11
CompressFlag to write new values in compressed format if possible. + Has no effect unless Compress::Zlib is installed.0 or 1undef
CoordFormatSpecify output format for GPS coordinates.A printf-style format string with specifiers + for degrees, minutes and seconds in that order, however minutes and seconds + may be omitted. If the hemisphere is known, a reference direction (N, S, E + or W) is appended to each printed coordinate, but adding a '+' + to the first format specifier (eg. '%+.6f') prints a signed + coordinate instead. The default for reading is equivalent to a format string + of q{%d deg %d' %.2f"}, but to avoid a loss + of precision the default for copying tags with + SetNewValuesFromFile is + q{%d %d %.8f}. + undef
DateFormatOutput format for date/time values. If date can not + be converted, value is left unchanged unless the StrictDate + option is set. Timezones are ignored. The inversion conversion (ie. when calling + SetNewValue) is performed only if POSIX::strptime + or Time::Piece is installed.See strftime manpage for details. + The default setting of undef causes date/time values to remain in standard EXIF + format (similar to a DateFormat of "%Y:%m:%d %H:%M:%S").undef
DuplicatesFlag to return values from + tags with duplicate names when extracting information.0 or 11
EscapeEscape special characters in extracted values for + HTML or XML. Also unescapes HTML or XML character entities in input values + passed to SetNewValue. HTML, XML or undefundef
ExcludeExclude specified tags when extracting information.Tag name or reference to a list of tag names to + exclude. Case is not significant. Tags may also be excluded by preceding + their name with a '-' in the arguments to ImageInfo.undef
ExtendedXMPThis setting affects the + reading and editing of extended XMP in JPEG images. According to the XMP + specification, extended XMP is only valid if it has the GUID specified by + the HasExtendedXMP tag. ExifTool + 9.95 and earlier would read extended XMP regardless of GUID, but with the + addition of this option in version 9.96 the default behaviour was changed to + conform with the XMP specification (to read only extended XMP with the + proper GUID). This option should be set to 2 to emulate pre-9.96 behaviour + and read all extended XMP. It may also be set to a GUID to read a specific + extended XMP, or 0 to ignore extended XMP entirely. + + + + +
0 =Ignore extended XMP
1 =Valid GUID only
2 =Any GUID
guid =Specific GUID
1
ExtractEmbeddedFlag to extract information from embedded + documents in EPS files, embedded EPS information and JPEG and Jpeg2000 + images in PDF files, embedded MPF images in JPEG and MPO files, timed + metadata in videos, and the resource fork of Mac OS files. A setting of 2 + also causes the H264 video stream in MP4 files to be parsed until the first + SEI message is decoded, or 3 to parse the entire H264 stream in MP4 videos + and the entire M2TS file to look for any unlisted program containing GPS + metadata.0, 1, 2 or 3undef
FastScanFlag to increase speed when reading files by avoiding extraction of some + types of metadata. With this option set to 1, ExifTool will not scan to the + end of a JPEG image to check for an AFCP, CanonVRD, FotoStation, + PhotoMechanic, MIE or PreviewImage trailer. This also stops the parsing + after the first comment in GIF images, and at the audio/video data of + RIFF-format files (AVI, WAV, etc), so any trailing metadata (eg. XMP written + by some utilities) may be missed. Also disables input buffering for some + types of files to reduce memory usage when reading from a non-seekable + stream, and bypasses CRC validation for speed when writing PNG files. When + combined with the ScanForXMP option, prevents scanning for XMP in recognized + file types. With a value of 2, ExifTool will also avoid extracting any EXIF + MakerNote information, and will stop parsing at the IDAT chunk of PNG + images. (By the PNG specification, metadata is allowed after IDAT, but + ExifTool always writes it before because some utilities will ignore it + otherwise.) When set to 3 or higher, only pseudo system tags and FileType are + generated. For 3, the file header is read to provide an educated guess at + FileType. For 4, the file is not read at all and FileType is determined + based on the file's extension. For 5, generation of Composite tags is also + disabled (like setting Composite to 0).0, 1, 2, 3, 4 or 5undef
FilterPerl expression used to filter all returned tag values. Applies to + PrintConv values only. List items are filtered individually.Expression to act on the value of the Perl default variable ($_), + changing the value of this variable as required. The current ExifTool + object may be accessed through $self. The value is not changed if $_ is + set to undef.undef
FilterWPerl expression used to filter PrintConv values when writing.Expression to act on the value of the Perl default variable ($_), + changing the value of this variable as required. The current ExifTool + object may be accessed through $self. The tag is not written if $_ is + set to undef.undef
FixBaseFix maker notes base offset. Allows values to be extracted from maker notes + which have been corrupted by editing with 3rd party software.An integer specifying a value to be added to the + maker notes base offset, or the empty string ('') for ExifTool to take its + best guess at the correct base.undef
GeoMaxIntSecsMaximum interpolation time in seconds for + geotagging. Geotagging is treated as an extrapolation if the Geotime value + lies between two fixes in the same track which are separated by a number of + seconds greater than this. Otherwise, the coordinates are calculated as a + linear interpolation between the nearest fixes on either side of the Geotime + value. Set to 0 to disable interpolation and use the coordinates of the + nearest fix instead (provided it is within GeoMaxExtSecs, otherwise + geotagging fails).A floating point number1800
GeoMaxExtSecsMaximum extrapolation time in seconds for + geotagging. Geotagging fails if the Geotime value lies outside a GPS track + by a number of seconds greater than this. Otherwise, for an extrapolation + the coordinates of the nearest fix are taken (ie. it is assumed that + you weren't moving during this period).A floating point number1800
GeoMaxHDOPMaximum Horizontal (2D) Dilution Of Precision + for geotagging. GPS fixes are ignored if the HDOP is greater than this.A floating point number, or undefundef
GeoMaxPDOPMaximum Position (3D) Dilution Of Precision for + geotagging. GPS fixes are ignored if the PDOP is greater than this.A floating point number, or undefundef
GeoMinSatsMinimum number of satellites for geotagging. + GPS fixes are ignored if the number of acquired satellites is less than this.A positive integer, or undefundef
GeoSpeedRefReference units for writing GPSSpeed when geotagging. + + + +
Kk or km/h= km/h
Mm or mph= mph
(anything else)= knots
undef
GlobalTimeShiftTime shift to apply to all extracted + date/time PrintConv values. Does not affect ValueConv values.Date/time shift string with leading '-' for negative shifts
(see Image::ExifTool::Shift.pl)
undef
Group#Extract tags only for specified groups in family # + (Group0 assumed if # not given).Group name or reference to list of group names. + Group name may begin with '-' to exclude a group. Case IS significant. + See GetGroup for a description of group families, + and GetAllGroups for a list of available groups.undef
HexTagIDsUse hexadecimal instead of decimal for the family 7 + group names of tags with numerical ID's.0 or 1undef
HtmlDumpDump information in hex to a dynamic HTML web page. + Option value sets a limit on the maximum block size. Output file is + specified by the TextOut option. + + + + +
0 =No HTML dump
1 =1 KB size limit
2 =16 KB size limit
3 =Full dump
0
HtmlDumpBaseBase for HTML dump + offsets. If not defined, the EXIF/TIFF base offset is used. + + + +
0 =Absolute offsets
non‑zero =Relative offsets
undef =EXIF/TIFF offsets
undef
IgnoreMinorErrorsFlag to ignore minor errors. Causes minor + errors to be downgraded to warnings, and minor warnings to be ignored. This + option is provided mainly to allow writing of files when minor errors occur, + but by ignoring some minor warnings the behaviour of ExifTool may be changed + to allow some questionable operations to proceed (such as extracting + thumbnail and preview images even if they don't have a recognizable header). + Minor errors/warnings are denoted by "[minor]" at the start of the message, + or "[Minor]" (with a capital "M") for warnings that affect processing when + ignored.0 or 1undef
IgnoreTagsList of tag names to ignore when reading. + This may help in situations where memory is limited because the ignored tag values + are not stored in memory. The tag names are case insensitive and group names + and wildcards are not allowed. A special tag name of "All" may be used to ignore + all tags except those specified by the RequestTags option.List reference, delimited string of names (any delimiter is allowed), or undef to + clear the previous IgnoreTags list.undef
LangLocalized language for exiftool tag descriptions, etc. If the + specified language isn't available, the option is not changed. May be set to + undef to select the built-in default language.Image::ExifTool::Lang module name (eg. 'fr', 'zh_cn'), or 'en' or undef for the default language.'en'
LargeFileSupportFlag to indicate that 64-bit file offsets are supported on this system.0 or 1undef
ListItemReturn only a specific item from + list-type values. A value of 0 returns the first item in each list, 1 returns + the second item, etc. Negative indices may also be used, with -1 representing the + last item in the list. Applies only to the top-level list of nested lists.An integer, or undefundef
ListJoinSeparator used to join the PrintConv value of + multi-item List-type tags into a single string. If not defined, multi-item lists + are returned as a list reference. Does not affect ValueConv values.Any string, or undef', '
ListSplitRegular expression used to split values of list-type tags + into individual items when writing. (eg. Use ',\\s*' to split a comma-separated + list.) Split when writing either PrintConv or ValueConv values.A regular expression pattern, or undefundef
MakerNotesOption to extract MakerNotes and other writable + subdirectories (such as PrintIM) as a data block. Normally when the MakerNotes + are extracted they are rebuilt to include data outside the boundaries of the + original maker note data block, but a value of 2 disables this feature. + + + +
0 =Don't extract writable subdirectories
1 =Extract and rebuild makernotes into self-contained block
2 =Extract without rebuilding makernotes
undef
MDItemTagsFlag to extract the OS X + metadata item tags (see the "mdls" man page and the + MacOS MDItem Tags documentation for more information).0 or 1undef
MissingTagValueValue for missing tags + interpolated in tag name expressions (or tags where the advanced formatting + expression returns undef). If not set, a minor error is issued for missing + values, or the value is set to '' if IgnoreMinorErrors is set.Any string, or undefundef
NoMultiExifRaise error when attempting to write multi-segment + EXIF in a JPEG image.0 or 1undef
NoPDFListFlag to avoid splitting PDF list-type tag + values into separate items.0 or 1undef
PasswordPassword for reading/writing + password-protected PDF documents. Ignored if a password is not required. Character encoding of + the password is determined by the value of the Charset option at processing time.Any stringundef
PrintConvFlag to enable print conversion. Also enables inverse print + conversion for writing.0 or 11
QuickTimeHandlerFlag set to add an 'mdir' + Handler to a newly created + Meta box when adding QuickTime ItemList tags. Adobe Bridge does not add this + Handler, but it is commonly found in samples from other software, and it has been + reported that Apple QuickTime Player and Photos.apps will ignore ItemList tags + if this is missing.0 or 11
QuickTimePadFlag to preserve the padding of + some QuickTime atoms when writing. QuickTime-based Canon CR3 files pad + the values of container atoms with null bytes. This padding is removed by + default when the file is rewritten, but setting this option to 1 adds + padding to preserve the original atom size if the new atom would be smaller + than the original.0 or 1undef
QuickTimeUTCFlag set to assume that QuickTime + date/time values are stored as UTC, causing conversion to local time when they are + extracted and from local time when written. According to the QuickTime + specification date/time values should be UTC, but many digital cameras store + local time instead (presumably because they don't know the time zone), so + the default is to not convert these times (except for Canon CR3 files, which + always use UTC times). This option also disables the autodetection of + incorrect time-zero offsets in QuickTime date/time values, and enforces a + time zero of 1904 as per the QuickTime specification.0 or 1undef
RequestAllFlag to request all tags to be extracted. + This causes some tags to be generated which normally would not be unless specifically + requested (by passing the tag name to ImageInfo or + ExtractInfo). May be set to 2 or 3 to enable generation + of some additional tags as mentioned in the Tag Name documentation.0, 1, 2 or 3undef
RequestTagsList of additional tag and/or group names + to request in the next call to ExtractInfo. This option is + useful only for tags/groups which aren't extracted unless specifically requested. Groups + are requested by adding a colon after the name (eg. "MacOS:"). Names are converted to lower + case as they are added to the list.List reference, delimited string of names + (any delimiter is allowed), or undef to clear the previous RequestTags list.undef
SaveFormatFlag to save EXIF/TIFF format type as the + family 6 group name when extracting information. Without this option set, the + family 6 group names are not generated. See GetGroup + for more details. + 0 or 1undef
SavePathFlag to save the metadata path as the family 5 group + name when extracting information. Without this option set, the family 5 group names + are not generated. See GetGroup for more details. + 0 or 1undef
ScanForXMPFlag to scan all files (even unrecognized + formats) for XMP information unless XMP was already found in the file. When combined with + the FastScan option, only unrecognized file types are scanned for XMP. + 0 or 1undef
SortSpecifies order to sort tags in the returned tag list. + + + + + +
Input =Sort in same order as input tag arguments
File =Sort in order that tags were found in the file
Tag =Sort alphabetically by tag name
Descr =Sort by tag description (with current Lang setting)
Group# =Sort by tag group, + where # is zero or more family numbers separated by colons. If # is not specified, + Group0 is assumed. See GetGroup for a description of group + families.
'Input'
Sort2Secondary sort order used for tags within each group when Sort is 'Group'. + + + +
File =Sort in order that tags were found in the file
Tag =Sort alphabetically by tag name
Descr =Sort by tag description (with current Lang setting)
'File'
StrictDateFlag to return undefined value for + any date which can't be converted when the DateFormat option is used. When + set to 1 while writing a PrintConv date/time value with the DateFormat + option set, the value is written only if POSIX::strptime or Time::Piece is + available and can successfully convert the value. For PNG CreationTime, a + setting of 1 has the additional effect of causing the date/time to be + reformatted according to PNG 1.2 recommendation (RFC-1123) when writing, and + a warning to be issued for any non-standard value when reading (but note + that Windows may not recognize PNG date/time values in standard format). + + + +
undef =Same as 0 for reading/writing or 1 for copying
0 =Return bad date/time values unchanged
1 =Return undef if date/time value can't be converted
undef
StructFlag to return XMP structures as HASH references + instead of flattening into individual tags. This setting has no effect + when writing since both flattened and structured tags may always be written. + See the Structured Information documentation for + more details about structured information. + + + + +
undef =Same as 0 for reading and 2 for copying
0 =Read/copy flattened tags
1 =Read/copy structures
2 =Read/copy both flattened and structured tags, + but flag flattened tags as "unsafe" for copying
undef
SystemTagsFlag to extract the + following additional File System tags: FileAttributes, FileDeviceNumber, + FileInodeNumber, FileHardLinks, FileUserID, FileGroupID, FileDeviceID, + FileBlockSize and FileBlockCount.0 or 1undef
TextOutOutput file for Verbose and HtmlDump options.File reference\*STDOUT
TimeZoneTime zone for local date/time values. (Requires POSIX::tzset, + which may not be available in Windows. A work-around in Windows is to + set TZ=<zone> before running ExifTool.)Any valid TZ string, or undef to use the system time zoneundef
UnknownControl extraction of unknown tags. + + + +
0 =Unknown tags not extracted
1 =Unknown tags are extracted from EXIF + (and other tagged-format) directories
2 =Unknown tags also extracted from binary data blocks
0
UserParamSpecial option to set/get user-defined parameters. + Useful to allow external input into tag name expressions and ValueConv logic. + PARAM is the user-defined parameter name (case insensitive). These parameters + may be accessed in tag name expressions by prefixing the parameter name with a dollar + sign just like normal tags, or via the API by calling Options('UserParam','PARAM'). + Appending a hash tag (#) to the parameter name also causes the parameter + to be extracted as a normal tag (in the UserParam group). If called without + additional arguments, Options('UserParam') returns a reference to the + hash of all user parameters (with lower-case names). + + + +
PARAM-Get parameter
PARAM=-Clear parameter
PARAM^=-Set parameter to empty string
+ + +
PARAM=VALUE-Set parameter
+ + +
hash ref-Set UserParam hash
undef-Clear UserParam hash
+
{ }
ValidateFlag to perform extra metadata validation checks + when reading, causing extra warnings to be generated if problems are found.0 or 1undef
VerbosePrint verbose messages to file specified by TextOut option. + Click here for example outputs. + + + + + + +
0 =No verbose messages
1 =Print tag names and raw values
2 =Add additional tag details
3 =Add hex dump of tag data (with length limits)
4 =Remove length limit on dump of tag values
5 =Remove length limit on dump of JPEG segments
0
WriteModeSet tag write/create mode. The level of the group + differs for different types of metadata. For XMP or IPTC this is the full XMP/IPTC block + (the family 0 group), but for EXIF this is the individual IFD (the family 1 group). + The 'w' and 'c' modes are tested only when SetNewValue + is called, but the 'g' mode is also tested in WriteInfo.A string with one or more of these characters: + + + +
w =Write existing tags
c =Create new tags
g =Create new groups
'wcg'
XAttrTagsFlag to extract the OS X + extended attribute tags (see the "xattr" man page and the + MacOS XAttr Tags documentation for more information).0 or 1undef
XMPAutoConvFlag to enable automatic conversion + when reading unknown XMP tags with values that look like rational numbers or dates.0 or 11
+ +
The level of +the group differs for different types of metadata. For XMP or IPTC this is the +full XMP/IPTC block (the family 0 group), but for EXIF this is the individual +IFD (the family 1 group).
+ +

Examples:

+
+# exclude the 'OwnerName' tag from returned information
+$exifTool->Options(Exclude => 'OwnerName');
+
+ +
+# only get information in EXIF or MakerNotes groups
+$exifTool->Options(Group0 => ['EXIF', 'MakerNotes']);
+
+ +
+# ignore information from IFD1
+$exifTool->Options(Group1 => '-IFD1');
+
+ +
+# sort by groups in family 2, and extract unknown tags
+$exifTool->Options(Sort => 'Group2', Unknown => 1);
+
+ +
+# reset DateFormat option
+$exifTool->Options(DateFormat => undef);
+
+ +
+# do not extract duplicate tag names
+$oldSetting = $exifTool->Options(Duplicates => 0);
+
+ +
+# get current Verbose setting
+$isVerbose = $exifTool->Options('Verbose');
+
+ +
+# set a user parameter
+$exifTool->Options(UserParam => 'MyParam=some value');
+
+ +

ClearOptions

+

Reset all options to their default values. Loads user-defined default +option values from the %Image::ExifTool::UserDefined::Options hash in +the .ExifTool_config file if it exists.

+
+ + +
PrototypeClearOptions()
Inputs0) ExifTool object reference +
+ +

ExtractInfo

+

Extract all meta information from an image.

+
+ + + +
PrototypeExtractInfo($;@)
Inputs0) ExifTool object reference +
1-N) Same as ImageInfo except that a list of tag + keys is not returned if an ARRAY reference is given. +
Returns1 if this was a recognized file format, 0 otherwise
+

Example:

+
+$success = $exifTool->ExtractInfo('image.jpg', \%options);
+
+

The following options are effective in the call to ExtractInfo:

+
+Binary, Charset, CharsetEXIF, CharsetFileName, CharsetID3, CharsetIPTC, +CharsetPhotoshop, CharsetQuickTime, CharsetRIFF, Composite, ExtendedXMP, +ExtractEmbedded, FastScan, FixBase, HtmlDump, HtmlDumpBase, +IgnoreMinorErrors, Lang, LargeFileSupport, MakerNotes, MDItemTags, +NoPDFList, Password, QuickTimeUTC (enforced 1904 time zero), RequestAll, +RequestTags, SaveFormat, SavePath, ScanForXMP, Struct, TextOut, Unknown, +Verbose, XAttrTags and XMPAutoConv. +
+ +

GetInfo

+

GetInfo is called to return meta information +after it has been extracted from the image by a previous call to +ExtractInfo or ImageInfo. +This function may be called repeatedly after a single call to +ExtractInfo or ImageInfo.

+
+ + + +
PrototypeGetInfo($;@)
Inputs0) ExifTool object reference +
1-N) Same as ImageInfo except that an image + can not be specified +
ReturnsReference to information hash, the same as with + ImageInfo
+

Examples:

+
+# get image width and height only
+$info = $exifTool->GetInfo('ImageWidth', 'ImageHeight');
+
+ +
+# get all Error and Warning messages
+$info = $exifTool->GetInfo('Error', 'Warning');
+
+ +
+# get information for all tags in list (list updated with tags found)
+$info = $exifTool->GetInfo(\@ioTagList);
+
+ +
+# get all information in Author or Location groups
+$info = $exifTool->GetInfo({Group2 => ['Author', 'Location']});
+
+

The following options are effective in the call to GetInfo:

+
+Charset, CoordFormat, DateFormat, Duplicates, Escape, Exclude, Filter, Group#, +GlobalTimeShift, Lang, ListItem, ListJoin, PrintConv, QuickTimeUTC (conversion +to local time), Sort (if a tag list reference is given) and StrictDate. +
+ +

WriteInfo

+

Write meta information to a file. The specified source file is rewritten to +the same-type destination file with new information as specified by previous +calls to SetNewValue. The necessary segments and/or +directories are created in the destination file as required to store the +specified information. May be called repeatedly to write the same information +to additional files without the need to call SetNewValue +again.

+ +

ExifTool queues all new values that are assigned via calls to +SetNewValue, then applies them to any number of files +through one or more calls to WriteInfo. These queued +values may be accessed through GetNewValue, and are +completely separate from metadata extracted from files via +ExtractInfo or ImageInfo +and accessed through GetInfo or +GetValue.

+ +

To be clear, it is NOT necessary to call ExtractInfo +or ImageInfo before WriteInfo. +WriteInfo changes only metadata specified by previous +calls to SetNewValue.

+ +
+ + + +
PrototypeWriteInfo($$;$$)
Inputs0) ExifTool object reference +
1) Source file name, file reference, scalar reference, or undef to + create a file from scratch. A reference to a File::RandomAccess object is + also allowed as a source, but in this case the destination is not optional. +
2) [optional] Destination file name, file reference, scalar + reference to write to memory, or undef to overwrite the original file. May + be '-' to write to stdout. +
3) [optional] Destination file type. Ignored if a source + is defined. +
Returns1 if file was written OK, 2 if file was written +but no changes made, 0 on file write error. +
+

The source file name may be undefined to create a file from scratch +(currently only XMP, MIE, ICC, VRD, DR4, EXV and EXIF files can be created +in this way -- see CanCreate for details). +If undefined, the destination file type is required unless the type can be +determined from the extension of the destination file name.

+

If a destination file name is given, the specified file must not exist +because an existing destination file will not be overwritten. Any new +values for FileName, Directory or HardLink are ignored when a destination +file name is specified.

+

The destination file name may be undefined to overwrite the original file +(make sure you have backups!). In this case, if a source file name is +provided, a temporary file is created and renamed to replace the source file +if no errors occurred while writing. Otherwise, if a source file reference +or scalar reference is used, the image is first written to memory then +copied back to replace the original if there were no errors.

+

On Mac OS systems, the file resource fork is preserved if this routine +is called with a source file name.

+

Examples:

+
+# add information to a source file, writing output to new file
+my $result = $exifTool->WriteInfo($srcfile, $dstfile);
+
+ +
+# create XMP data file from scratch
+$exifTool->WriteInfo(undef, $dstfile, 'XMP');
+
+ +
+# overwrite file (you do have backups, right?)
+$exifTool->WriteInfo($srcfile);
+
+ +
+# retrieve error and warning messages
+$errorMessage = $exifTool->GetValue('Error');
+$warningMessage = $exifTool->GetValue('Warning');
+
+

If an error code is returned, an Error tag is set and GetValue('Error') can +be called to obtain the error description. A Warning tag may be set even if +this routine is successful. Calling WriteInfo clears any pre-existing Error +and Warning tags.

+

The following ExifTool options are effective in the call to +WriteInfo:

+
+ByteOrder, Charset, CharsetEXIF, CharsetFileName, CharsetIPTC, Compact, +Compress, FixBase, IgnoreMinorErrors, NoMultiExif, NoPDFList, Password, +QuickTimeHandler, QuickTimePad, Verbose and WriteMode. +
+ +

GetTagList

+

Get a sorted list of tags from the specified information hash or tag list.

+
+ + + +
PrototypeGetTagList($;$$$)
Inputs0) ExifTool object reference +
1) [optional] Reference to info hash or tag list +
2) [optional] Sort order ('Input', 'File', 'Tag', 'Descr' or 'Group#') +
3) [optional] Secondary sort order ('File', 'Tag' or 'Descr') +
ReturnsList of tag keys in specified order
+

Example:

+
+@tags = $exifTool->GetTagList($info, 'Group0');
+
+

If the information hash or tag list reference is not provided, then the list +of found tags from the last call to ImageInfo, +ExtractInfo or GetInfo +is used instead, and the result is the same as if +GetFoundTags was called. If sort order is not +specified, the sort order is taken from the current options settings.

+ +

GetFoundTags

+

Get list of found tags in specified sort order. The found tags are the +tags for the information obtained from the most recent call to +ImageInfo, ExtractInfo +or GetInfo for this object.

+
+ + + +
PrototypeGetFoundTags($;$$)
Inputs0) ExifTool object reference +
1) [optional] Sort order ('Input', 'File', 'Tag', 'Descr' or 'Group#') +
2) [optional] Secondary sort order ('File', 'Tag' or 'Descr') +
ReturnsList of tag keys in the specified order
+

Example:

+
+my @tags = $exifTool->GetFoundTags('File');
+
+ +

GetRequestedTags

+

Get list of requested tags. These are the tags that were specified +in the arguments of the most recent call to ImageInfo, +ExtractInfo or GetInfo, +including tags specified via a tag list reference. They are returned +in the same order that they were specified. Shortcut tags are expanded +in the list.

+
+ + + +
PrototypeGetRequestedTags($)
Inputs0) ExifTool object reference +
ReturnsList of tag keys for requested tags +(empty if no tags specifically requested)
+

Example:

+
+my @requestedTags = $exifTool->GetRequestedTags();
+
+ +

GetValue

+

Get the value of a specified tag. The returned value is either the +human-readable (PrintConv) value, the converted machine-readable (ValueConv) +value, the original raw (Raw) value, or the original rational (Rational) value +for rational formats. If the value type is not specified, the PrintConv value +is returned if the PrintConv option is set, otherwise the ValueConv value is +returned. The PrintConv values are the same as the values returned by +ImageInfo and GetInfo in the +tag/value hash unless the PrintConv option is disabled.

+

Tags which represent lists of multiple values (as may happen with +'Keywords' for example) are handled specially. In scalar context, +the returned PrintConv value for these tags is either a string of values or +a list reference (depending on the ListJoin option setting), and the ValueConv +value is always a list reference. But in list context, +GetValue always returns the list itself.

+

Note that GetValue requires a case-sensitive tag key +as an argument. To retrieve tag information based on a case-insensitive tag name +(with an optional group specifier), use GetInfo +instead.

+
+ + + +
PrototypeGetValue($$;$)
Inputs0) ExifTool object reference +
1) Tag key, or case-sensitive tag name with optional group prefix(es) +
2) [optional] Value type, 'PrintConv', 'ValueConv', 'Both', + 'Raw' or 'Rational' +
 
The default value type is 'PrintConv' if the PrintConv option + is set, otherwise the default is 'ValueConv'. A value type of 'Both' + returns both ValueConv and PrintConv values as a list. 'Rational' returns + the raw rational value as a string fraction for rational types, or undef for + other types. +
Returns +The value of the specified tag. If the tag represents a list of multiple values +and the ListJoin option is enabled then PrintConv returns a string of values, +otherwise a reference to the list is returned in scalar context. The list +itself is returned in list context. (Unless 'Both' values are requested, in +which case two list references are returned, regardless of context.) Values may +also be scalar references to binary data, or hash references if the +Struct option is set.
 
Note: It is possible +for GetValue to return an undefined ValueConv or +PrintConv value (or an empty list in list context) even if the tag exists, since +it is possible for these conversions to yield undefined values. And the +Rational value will be undefined for any non-rational tag. The Raw value should +always exist if the tag exists. +
+

Examples:

+
+# PrintConv example
+my $val = $exifTool->GetValue($tag);
+if (ref $val eq 'SCALAR') {
+    print "$tag = (unprintable value)\n";
+} else {
+    print "$tag = $val\n";
+}
+
+ +
+# ValueConv example
+my $val = $exifTool->GetValue($tag, 'ValueConv');
+if (ref $val eq 'ARRAY') {
+    print "$tag is a list of values\n";
+} elsif (ref $val eq 'SCALAR') {
+    print "$tag represents binary data\n";
+} else {
+    print "$tag is a simple scalar\n";
+}
+
+ +
+# list example
+my @keywords = $exifTool->GetValue('Keywords', 'ValueConv');
+
+

The following options are in effect when GetValue is +called:

+
+Charset, CoordFormat, DateFormat, Escape, Filter, GlobalTimeShift, Lang, +ListItem, ListJoin, PrintConv, QuickTimeUTC (conversion to local time), +StrictDate and TimeZone. +
+ +

SetNewValue

+

Set the new value for a tag. The routine may be called multiple times to set +the values of many tags before using WriteInfo to write +the new values to an image.

+

For list-type tags (like Keywords), either call repeatedly with +the same tag name for each value, or call with a reference to the list of values.

+
+ + + +
PrototypeSetNewValue($;$$%)
Inputs0) ExifTool object reference +
1) [optional] Tag key or tag name, or undef to clear all new + values. The tag name may be prefixed one or more family 0, 1 or 2 group + names with optional leading family numbers, separated by colons (eg. + 'EXIF:Artist', 'XMP:Time:*'), which is equivalent + to using a Group option argument. Also, a '#' may be appended + to the tag name (eg. 'EXIF:Orientation#'), with the same effect + as setting Type to 'ValueConv'. Wildcards ('*' and + '?') may be used in the tag name to assign or delete multiple + tags simultaneously. A tag name of '*' is special when deleting + information, and will delete an entire group even if some individual tags in + the group are not writable, but only if a single family 0 or 1 group name is + specified (otherwise, the tags are deleted individually). Use + GetDeleteGroups to get a list of deletable group + names, and see the TagNames documentation + for a complete list of ExifTool tag names. +
2) [optional] New value for tag. Undefined to delete tag + from file. May be a scalar, scalar reference, list reference to set a list + of values, or hash reference for a structure. Integer values may be + specified as a hexadecimal string (with a leading '0x'), and simple + rational values may be specified in fractional form (eg. '4/10'). Structure + tags may be specified either as a hash reference or a serialized string + (see the last two examples below). +
3-N) [optional] SetNewValue option/value pairs (see below). +
ReturnsScalar context: The number of tags set, and +errors are printed to STDERR. +
List context: The number of tags set, and the error string (undefined if no error). +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
SetNewValue Options
OptionDescriptionValuesDefault
AddValueAdd value to existing list in a file rather than + overwriting the existing values + + + +
0 =Overwrite existing value(s)
1 =Add to existing list, or warn for non-list tags
2 =Add to existing list, or overwrite non-list tags
0
DelValueDelete existing tag from a file if it has the specified + value. For list-type tags this deletes a specified item from the list. For + non-list tags this may be used to conditionally replace a tag by providing a + new value in a separate call to SetNewValue (see + examples below). For structured tags, the entire structure is deleted/replaced + only if all of the specified fields match the existing structure.0 or 10
EditGroupCreate tags in existing groups only. Don't create new group. + Effectively removes the 'g' from the ExifTool WriteMode option for this tag only.0 or 10
EditOnlyEdit tag only if it already exists. Don't create new tag. + Effectively removes the 'c' from the ExifTool WriteMode option for this tag only.0 or 10
GroupSpecifies group name where tag should be written. This + option is superseded by any group specified in the tag name. If not + specified, tag is written to highest priority group as specified by + SetNewGroups. Case is not significantOne or more family 0, 1 or 2 groups with optional leading + family number, separated by colonsundef
NoFlatTreat flattened tags as 'unsafe'0 or 10
NoShortcutDisables default behaviour of looking up tag in + shortcuts if not found otherwise.0 or 10
ProtectedAllow unsafe and protected tags to be writtenBitmask of tag protection levels to write: + + + + + +
0x01 =Write 'unsafe' tags (ie. tags not copied + automatically via SetNewValuesFromFile)
0x02 =Write 'protected' tags (internal use only)
0
ProtectSavedAvoid setting new values which were saved after the Nth + call to SaveNewValues. Has no effect on unsaved values, + or values saved before the Nth call.Nundef
ReplaceReplace previous new values for this tag (ie. replace the values + set in previous calls to SetNewValue). This option + is most commonly used to replace previously-set new values for list-type tags. + + + +
0 =Set new value normally (adds to new values for list-type tags)
1 =Reset any previous new values before setting new value
2 =Reset previous new values only (new value argument is ignored)
0
ShiftShift the tag by the specified value. Currently only date/time tags + and tags with numerical values may be shifted. Value is added if Shift is 1, or subtracted + if Shift is -1. See Image::ExifTool::Shift.pl for details time shift formats. + + + + +
undef = No shift
0 =Shift if shiftable:
+ Positive if AddValue set, or
+ Negative if DelValue set and
+ tag is date/time
1 =Positive shift
-1 =Negative shift
undef
TypeThe type of value being setPrintConv, ValueConv or Raw (default depends on PrintConv Option)PrintConv or ValueConv
+

Examples:

+
+# set a new value for a tag (errors go to STDERR)
+$success = $exifTool->SetNewValue($tag, $value);
+
+ +
+# set a new value and capture any error message
+($success, $errStr) = $exifTool->SetNewValue($tag, $value);
+
+ +
+# delete information for specified tag if it exists in image
+# (also resets AddValue and DelValue options for this tag)
+$exifTool->SetNewValue($tag);
+
+ +
+# reset all values from previous calls to SetNewValue()
+$exifTool->SetNewValue();
+
+ +
+# delete a specific keyword
+$exifTool->SetNewValue('Keywords', $word, DelValue => 1);
+
+ +
+# set keywords (a list-type tag) with two new values
+$exifTool->SetNewValue(Keywords => 'word1');
+$exifTool->SetNewValue(Keywords => 'word2');
+# equivalent, but set both in one call using an array reference
+$exifTool->SetNewValue(Keywords => ['word1','word2']);
+
+ +
+# add a keyword without replacing existing keywords in the file
+$exifTool->SetNewValue(Keywords => $word, AddValue => 1);
+
+ +
+# conditionally add or replace a tag if it didn't exist before
+# or had a specified value ("old value")
+$exifTool->SetNewValue(Description => '', DelValue => 1);
+$exifTool->SetNewValue(Description => 'old value', DelValue => 1);
+$exifTool->SetNewValue(Description => 'new value');
+
+ +
+# set a tag in a specific group
+$exifTool->SetNewValue(Headline => $val, Group => 'XMP');
+$exifTool->SetNewValue('XMP:Headline' => $val);  # (equivalent)
+
+ +
+# shift original date/time back by 2.5 hours
+$exifTool->SetNewValue(DateTimeOriginal => '2:30', Shift => -1);
+
+ +
+# write a tag only if it had a specific value
+# (the order of the following calls is not significant)
+$exifTool->SetNewValue(Title => $oldVal, DelValue => 1);
+$exifTool->SetNewValue(Title => $newVal);
+
+ +
+# write tag by numerical value
+$exifTool->SetNewValue(Orientation => 6, Type => 'ValueConv');
+$exifTool->SetNewValue('Orientation#' => 6);  # (equivalent)
+
+ +
+# delete all but EXIF tags
+$exifTool->SetNewValue('*');  # delete all...
+$exifTool->SetNewValue('EXIF:*', undef, Replace => 2); # ...but EXIF
+
+ +
+
# write structured information as a HASH reference
+$exifTool->SetNewValue('XMP:Flash' => { mode=>'on', fired=>'true', return=>'not' });
+
+ +
+
# write structured information as a serialized string
+$exifTool->SetNewValue('XMP:Flash' => '{mode=on,fired=true,return=not}');
+
(see struct.html for a +description of the structure serialization technique)
+ +

Notes:

+

When deleting groups of tags, the Replace option may be used to exclude +specific groups from a mass delete. However, this technique may not be used to +exclude individual tags from a group delete (unless a family 2 group was +specified in the delete). Instead, use +SetNewValuesFromFile to recover the values +of individual tags after deleting a group.

+

When deleting all tags from a JPEG image, the APP14 "Adobe" information is +not deleted by default because doing so may affect the appearance of the image. +However, this information may be deleted by specifying it explicitly, either by +group (with 'Adobe:*') or as a block (with 'Adobe').

+

The following ExifTool options are effective in the call to +SetNewValue:

+
+Charset, DateFormat, Escape, IgnoreMinorErrors, Lang, ListJoin, ListSplit, +PrintConv, QuickTimeUTC, StrictDate, TimeZone, Verbose and WriteMode. +
+ +

GetNewValue

+

Get the new Raw value for a tag. This is the value set by +SetNewValue that is queued to be written to +file. List-type tags may return multiple values in list context.

+
+ + + +
PrototypeGetNewValue($$)
Inputs0) ExifTool object reference +
1) Tag name (case sensitive, may be prefixed by family 0, 1 or 7 + group names, separated by colons) +
ReturnsList of new Raw tag values, or first value in +list when called in scalar context. The list may be empty either if the tag +isn't being written, or if it is being deleted (ie. if +SetNewValue was called without a value). +
+

Examples:

+
+my $rawVal = $exifTool->GetNewValue($tag);
+
+ +
+my @rawVals = $exifTool->GetNewValue($tag);
+
+ +

SetNewValuesFromFile

+

A very powerful routine that sets new values for tags from information found +in a specified file.

+
+ + + +
PrototypeSetNewValuesFromFile($$;@)
Inputs0) ExifTool object reference +
1) File name, file reference, or scalar reference +
2-N) [optional] List of tag names to set or options hash + references. All writable tags are set if none are specified. The tag names + are not case sensitive, and may be prefixed by one or more family 0, 1, 2 + or 7 group names with optional leading family numbers, separated by colons (eg. + 'exif:iso'). A leading '-' indicates tags to be + excluded (eg. '-comment'), or a trailing '#' causes + the ValueConv value to be copied (same as setting the Type option to + 'ValueConv' for this tag only). Wildcards ('*' and + '?') may be used in the tag name. A tag name of '*' + is commonly used when a group is specified to copy all tags in the group (eg. + 'XMP:*').
 
+ A special feature allows tag names of the form 'DSTTAG<SRCTAG' + (or 'SRCTAG>DSTTAG') to be specified to copy information to a + tag with a different name or a specified group. Both 'SRCTAG' and + 'DSTTAG' may contain wildcards and/or be prefixed by a group name + (eg. 'fileModifyDate<modifyDate' or 'xmp:*<*'), + and/or suffixed by a '#' to disable print conversion. Copied tags + may also be added or deleted from a list with arguments of the form + 'DSTTAG+<SRCTAG' or 'DSTTAG-<SRCTAG'. Tags are + evaluated in order, so exclusions apply only to tags included earlier in the + list. An extension of this feature allows the tag value to be set from a + string containing tag names with leading '$' symbols (eg. + 'Comment<the file is $filename'). Braces '{}' may + be used around the tag name to separate it from subsequent text, and a + '$$' is used to to represent a '$' symbol. The + behaviour for missing tags in expressions is defined by the + MissingTagValue option. The tag value may be + modified via changes to the default input variable ($_) in a Perl + expression placed inside the braces and after a semicolon following the tag + name (see the last example below). A @ may be added after the tag + name (before the semicolon) to make the expression act on individual list items + instead of the concatenated string for list-type tags. Braces within the + expression must be balanced.
 
+ Multiple options hash references may be passed to set different options for + different tags. Options apply to subsequent tags in the argument list. +
ReturnsA hash of information that was set +successfully. May include Warning or Error entries if there were problems +reading the input file. +
+

By default, this routine will commute information between same-named tags in +different groups, allowing information to be translated between images with +different formats. This behaviour may be modified by specifying a group name +for extracted tags (even if '*' is used as a group name), in which +case the information is written to the original group, unless redirected to a +different group. When '*' is used for a group name, by default the +family 1 group of the original tag is preserved, but a different family may be +specified with a leading family number. (For example, specifying +'*:*' copies all information while preserving the original family 1 +groups, while '0*:*' preserves the family 0 group.)

+

SetNewValuesFromFile Options:

+

The options are the same was for SetNewValue, and +are passed directly to SetNewValue internally, +with a few exceptions:

+
    +
  • The Replace option defaults to 1 instead of 0 as with +SetNewValue.
  • +
  • The AddValue or DelValue option is set for individual tags if '+>' or +'->' (or '+<' or '-<') are used.
  • +
  • The Group option is set for tags where a group name is given.
  • +
  • The Protected flag is set to 1 for individually specified tags.
  • +
  • The Type option also applies to extracted tags.
  • +
+

Examples:

+
+# set new values from all information in a file...
+my $info = $exifTool->SetNewValuesFromFile($srcFile);
+# ...then write these values to another image
+my $result = $exifTool->WriteInfo($file2, $outFile);
+
+ +
+# set all new values, preserving original groups
+$exifTool->SetNewValuesFromFile($srcFile, '*:*');
+
+ +
+# set specific information
+$exifTool->SetNewValuesFromFile($srcFile, $tag1, $tag2...);
+
+ +
+# set new value from a different tag in specific group
+$exifTool->SetNewValuesFromFile($src, 'XMP-dc:Subject<IPTC:Keywords');
+
+ +
+# add all IPTC keywords to XMP subject list
+$exifTool->SetNewValuesFromFile($src, 'XMP-dc:Subject+<IPTC:Keywords');
+
+ +
+# set new value from a string involving other tags
+$exifTool->SetNewValuesFromFile($file,
+    'Comment<ISO=$ISO Aperture=$aperture Exposure=$shutterSpeed');
+
+ +
+# set keywords list from the values of multiple tags
+$exifTool->SetNewValuesFromFile($file, { Replace => 0 },
+    'keywords<xmp:subject', 'keywords<filename');
+
+ +
+# copy all EXIF information, preserving the original IFD
+# (without '*.*<' tags would be copied to the preferred EXIF IFD)
+$exifTool->SetNewValuesFromFile($file, '*:*<EXIF:*');
+
+ +
+# copy all tags with names starting with "gps" (note: this is
+# different than "gps:*" because it will also copy XMP GPS tags)
+$exifTool->SetNewValuesFromFile($file, 'gps*');
+
+ +
+# set FileName from Model, translating questionable characters to underlines
+$exifTool->SetNewValuesFromFile($file, 'filename<${model;tr(/\\\\?*:|"<>)(_)}.jpg');
+
+ +

Notes:

+

The PrintConv option applies to this routine, but it normally should be left +on to provide more reliable transfer of information between groups.

+

If a preview image exists, it is not copied. The preview image must be +transferred separately if desired, in a separate call to +WriteInfo

+

When simply copying all information between files of the same type, it is +usually desirable to preserve the original groups by specifying +'*:*' for the tags to set.

+

The Duplicates option is always in effect for tags +extracted from the source file using this routine.

+

The Struct option is enabled by default for tags +extracted by this routine. This allows the hierarchy of complex structures to +be preserved when copying, but the Struct option may be set to 0 to override +this behaviour and copy as flattened tags instead.

+ +

CountNewValues

+

Return the total number of new values set.

+
+ + + +
PrototypeCountNewValues($)
Inputs0) ExifTool object reference +
ReturnsIn scalar context, returns the total number +of tags with new values set. In list context, also returns the number of +"pseudo" tag values which have been set. "Pseudo" tags are tags like FileName +and FileModifyDate which are not contained within the file and can be changed +without rewriting the file.
+

Examples:

+
+my $numSet = $exifTool->CountNewValues();
+
+ +
+my ($numSet, $numPseudo) = $exifTool->CountNewValues();
+
+ +

SaveNewValues

+

Save state of new values to be later restored by RestoreNewValues.

+
+ + + +
PrototypeSaveNewValues($)
Inputs0) ExifTool object reference +
ReturnsCount of the number of times this routine has +been called (N) since the last time the new values were reset.
+

Example:

+
+$exifTool->SaveNewValues();         # save state of new values
+$exifTool->SetNewValue(ISO => 100); # set new value for ISO
+$exifTool->WriteInfo($src, $dst1);  # write ISO plus any previous new values
+$exifTool->RestoreNewValues();      # restore previous new values
+$exifTool->WriteInfo($src, $dst2);  # write previous new values only
+
+ +

RestoreNewValues

+

Restore new values to the settings that existed when +SaveNewValues was last called. May be called +repeatedly after a single call to SaveNewValues. +See SaveNewValues above for an example.

+
+ + +
PrototypeRestoreNewValues($)
Inputs0) ExifTool object reference +
+ +

SetFileModifyDate

+

Write the filesystem modification or creation time from the new value of the +FileModifyDate or FileCreateDate tag.

+
+ + + +
PrototypeSetFileModifyDate($$;$$)
Inputs0) ExifTool object reference +
1) File name +
2) [optional] Base time if applying shift (in days before $^T) +
3) [optional] Tag to write: 'FileModifyDate' (default), or 'FileCreateDate' +
Returns1 if the time was changed, 0 if nothing was +done, or -1 if there was an error setting the time. +
+

Example:

+
+$exifTool->SetNewValue(FileModifyDate => '2000:01:02 03:04:05', Protected => 1);
+my $result = $exifTool->SetFileModifyDate($file);
+
+

Notes:

+

Equivalent to, but more efficient than calling WriteInfo +when only the FileModifyDate or FileCreateDate tag has been set. If a timezone is not +specified, local time is assumed. When shifting, the time of the original +file is used unless the optional base time is specified.

+

The ability to write FileCreateDate is currently restricted to Windows systems only.

+ +

SetFileName

+

Set the file name and directory, or create a hard link to the file. If not +specified, the new file name is derived from the new values of the FileName and +Directory tags, or from the HardLink or SymLink tag if creating a link. If the +FileName tag contains a '/', then the file is renamed into a new +directory. If FileName ends with '/', then it is taken as a +directory name and the file is moved into the new directory. The new value for +the Directory tag takes precedence over any directory specified in FileName.

+
+ + + +
PrototypeSetFileName($$;$$)
Inputs0) ExifTool object reference +
1) Current file name +
2) [optional] New file name +
3) [optional] 'HardLink' or 'SymLink' to create a hard or + symbolic link instead of renaming the file, or 'Test' to test renaming feature + by printing the old and new names instead of changing anything. +
Returns1 on success, 0 if nothing was done, +or -1 if there was an error renaming the file or creating the link. +
+

Examples:

+
+my $result = $exifTool->SetFileName($file);
+
+ +
+my $result = $exifTool->SetFileName($file, $newName);
+
+

Notes:

+

Will not overwrite existing files. New directories are created as +necessary. If the file is successfully renamed, the new file name may be +accessed via $$exifTool{NewName}.

+ +

SetNewGroups

+

Set the order of the preferred groups when adding new information. In +subsequent calls to SetNewValue, new information +will be created in the first valid group of this list. This has an impact +only if the group is not specified when calling +SetNewValue, and if the tag name exists in more than +one group. The default order is EXIF, IPTC, XMP, MakerNotes, QuickTime, +Photoshop, ICC_Profile, CanonVRD, Adobe. Any family 0 group name may be used. +Case is not significant.

+
+ + +
PrototypeSetNewGroups($;@)
Inputs0) ExifTool object reference +
1-N) Groups in order of priority. If no groups are specified, the +priorities are reset to the defaults. +
+

Example:

+
+$exifTool->SetNewGroups('XMP','EXIF','IPTC');
+
+ +

GetNewGroups

+

Get current group priority list.

+
+ + + +
PrototypeGetNewGroups($)
Inputs0) ExifTool object reference +
ReturnsList of group names in order of write +priority. Highest priority first. +
+

Example:

+
+@groups = $exifTool->GetNewGroups();
+
+ +

GetTagID

+

Get the ID for the specified tag. The ID is the IFD tag number in EXIF +information, the property name in XMP information, or the data offset in a +binary data block. For some tags, such as Composite tags where there is no ID, +an empty string is returned. In list context, also returns a language code for +the tag if available and different from the default language (eg. with +alternate language entries for XMP "lang-alt" tags).

+
+ + + +
PrototypeGetTagID($$)
Inputs0) ExifTool object reference +
1) Tag key +
ReturnsIn scalar context, returns the tag ID or '' if +there is no ID for this tag.
In list context, returns the tag ID (or '') and the +language code (or undef).
+

Examples:

+
+my $id = $exifTool->GetTagID($tag);
+
+
+my ($id, $lang) = $exifTool->GetTagID($tag);
+
+ +

GetDescription

+

Get description for specified tag. This function will always return a defined +value. In the case where the description doesn't exist, one is generated from +the tag name.

+
+ + + +
PrototypeGetDescription($$)
Inputs0) ExifTool object reference +
1) Tag key +
ReturnsTag description
+ +

GetGroup

+

Get group name(s) for a specified tag.

+
+ + + +
PrototypeGetGroup($$;$)
Inputs0) ExifTool object reference +
1) Tag key +
2) [optional] Group family number, or string of numbers + separated by colons +
ReturnsGroup name (or '' if tag has no +group). If no group family is specified, returns the name of group in family 0 +when called in scalar context, or the names of groups for all families in list +context. Returns a string of group names separated by colons if the input group +family contains a colon. The string is simplified to remove a leading 'Main:' +and adjacent identical group names unless the family string begins with a colon. +
+

The following families of groups are available:

+
+ + + + + + + + + +
FamilyDescriptionExamples
0Information Type EXIF, XMP, IPTC
1Specific LocationIFD0, XMP-dc
2Category Author, Time
3Document Number Main, Doc1, Doc3-2
4Instance Number Copy1, Copy2, Copy3...
5Metadata Path eg. JPEG-APP1-IFD0-ExifIFD
6EXIF/TIFF Format int8u, int32u, undef, string
7Tag ID ID-271, ID-rights, ID-a9aut
+ +

Families 0 and 1 are based on the file structure, and are similar except that +family 1 is more specific and sub-divides some groups to give more detail about +the specific location where the information was found. For example, the EXIF +group is split up based on the specific IFD (Image File Directory), the +MakerNotes group is divided into groups for each manufacturer, and the XMP group +is separated based on the XMP namespace prefix. Note that only common XMP +namespaces are listed in the GetAllGroups +documentation, but additional namespaces may be present in some XMP data. Also +note that the 'XMP-xmp...' group names may appear in the older form +'XMP-xap...' since these names evolved as the XMP standard was +developed. The ICC_Profile group is broken down to give information about the +specific ICC_Profile tag from which multiple values were extracted. As well, +information extracted from the ICC_Profile header is separated into the +ICC-header group.

+

Family 2 classifies information based on the logical category to which the +information refers.

+

Family 3 gives the document number for tags extracted from embedded documents, +or 'Main' for tags from the main document. (See the +ExtractEmbedded option for extracting tags from embedded +documents.) Nested sub-documents (if they exist) are indicated by numbers +separated with dashes in the group name, to an arbitrary depth. (eg. +'Doc2-3-1' is the 1st sub-sub-document of the +3rd sub-document of the 2nd embedded document of the main +file.) Document numbers are also used to differentiate samples for +timed metadata in videos.

+

Family 4 provides a method for differentiating tags when multiple tags exist +with the same name in the same location. The primary instance of a tag (the tag +extracted when the Duplicates option is disabled and no group is specified) has +no family 4 group name, but additional instances have family 4 group names +of 'Copy1', 'Copy2', 'Copy3', etc. For +convenience, the primary tag may also be accessed using a group name of +'Copy0'.

+

Family 5 is experimental, and gives the complete path for the metadata in +the file. Generated only if the SavePath +option is used when extracting.

+

Family 6 is currently used only for EXIF/TIFF metadata, and gives the format +type of the extracted value. Generated only if the +SaveFormat option is used when extracting.

+

Family 7 is used for tag ID's. The group names are the actual tag ID's with +a leading "ID-" string. Non-numerical tag ID's have characters other than +[-_A-Za-z0-9] converted to hex. Numerical tag ID's are returned in hex if the +HexTagIDs option is set, otherwise decimal is used. +When specifying a family 7 group name, numerical ID's may be in hex (with +leading "0x") or decimal, and non-numerical ID's may or may not have characters +other than [-_A-Za-z0-9] converted to hex. Note that unlike other group names, +the tag ID's in family 7 group names are case sensitive (but the leading "ID-" +is not).

+

See GetAllGroups for lists of group names.

+ +

Examples:

+
+# return family 0 group name (eg. 'EXIF')
+$group = $exifTool->GetGroup($tag, 0);
+
+ +
+# return all groups (eg. qw{EXIF IFD0 Author Main})
+@groups = $exifTool->GetGroup($tag);
+
+ +
+# return groups as a string (eg. 'Main:IFD0:Author')
+$group = $exifTool->GetGroup($tag, ':3:1:2');
+
+ +
+# return groups as a simplified string (eg. 'IFD0:Author')
+$group = $exifTool->GetGroup($tag, '3:1:2');
+
+ +

GetGroups

+

Get list of group names for all tags in specified information hash.

+
+ + + +
PrototypeGetGroups($;$$)
Inputs0) ExifTool object reference +
1) [optional] Information hash reference (default is all extracted info) +
2) [optional] Group family number (default 0) +
Returns +List of group names in alphabetical order. +If information hash is not specified, the group names are returned for +all extracted information. See GetAllGroups for +a list of groups in each family. +
+

Examples:

+
+my @groups = $exifTool->GetGroups($info, $family);
+
+
Example of one way to print information organized by group +
+my $exifTool = new Image::ExifTool;
+$exifTool->ExtractInfo('t/images/ExifTool.jpg');
+
+my $family = 1;
+my @groups = $exifTool->GetGroups($family);
+my $group;
+foreach $group (@groups) {
+    print "---- $group ----\n";
+    my $info = $exifTool->GetInfo({"Group$family" => $group});
+    foreach ($exifTool->GetTagList($info)) {
+        print "$_ : $$info{$_}\n";
+    }
+}
+
+ +

BuildCompositeTags

+

Builds composite tags from required tags. The composite tags are convenience +tags which are derived from the values of other tags. This routine is called +automatically by ImageInfo if the Composite option is set.

+
+ + + +
PrototypeBuildCompositeTags($)
Inputs0) ExifTool object reference +
Returns(none)
+

Notes:

+
    +
  1. Tag values are calculated in alphabetical order unless a tag Require's +or Desire's another composite tag, in which case the calculation is +deferred until after the other tag is calculated.
  2. +
  3. Composite tags may need to read data from the image for their value to be +determined, and for these BuildCompositeTags +must be called while the image is available. This is only a problem if +ImageInfo is called with a filename (as opposed to a +file reference or scalar reference) since in this case the file is closed before +ImageInfo returns. Here the Composite option may be +used so that BuildCompositeTags is called from +within ImageInfo, before the file is closed.
  4. +
+
+The following functions access only static data and are not called with an +ExifTool object +
+ +

The names of all the following functions, plus +ImageInfo, may be imported into the current namespace +with the "Public" tag. When this is done, the functions can be accessed without +the need to prefix the function name with "Image::ExifTool::". For +example:

+
+use Image::ExifTool ':Public';
+$tagName = GetTagName($tag);
+
+ +

GetTagName

+

Get name of tag from tag identifier. This is a convenience function that +strips the embedded instance number, if it exists, from the tag key.

+
+ + + +
PrototypeGetTagName($)
Inputs0) Tag key +
ReturnsTag name
+

Example:

+
+$tagName = Image::ExifTool::GetTagName($tag);
+
+ +

GetShortcuts

+

Get list of tag shortcut names.

+
+ + + +
PrototypeGetShortcuts()
Inputs(none) +
ReturnsList of shortcuts
+ +

GetAllTags

+

Get list of all available tag names.

+
+ + + +
PrototypeGetAllTags(;$)
Inputs0) [optional] Group name, +or string of group names separated by colons +
ReturnsA list of all available tags in alphabetical +order, or all tags in a specified group or intersection of groups. The +group name is case insensitive, and any group in families 0-2 may be used +except for EXIF family 1 groups (ie. the specific IFD). +
+ +

GetWritableTags

+

Get list of all writable tag names.

+
+ + + +
PrototypeGetWritableTags(;$)
Inputs0) [optional] Group name, +or string of group names separated by colons +
ReturnsA list of all writable tags in alphabetical +order. These are the tags for which values may be set through +SetNewValue. If a group name is given, returns +only writable tags in specified group(s). The group name is case insensitive, +and any group in families 0-2 may be used except for EXIF family 1 groups (ie. +the specific IFD). +
+ +

GetAllGroups

+

Get list of all group names in specified family.

+
+ + + + +
PrototypeGetAllGroups($)
Inputs0) Group family number (0-7) +
ReturnsA list of all groups in the specified family in alphabetical order
+

Here is a complete list of groups for each family:

+
+ + + + + + + + + + + + + + + + + +
FamilyGroup Names
0 (Information Type)AFCP, AIFF, APE, APP0, APP1, APP11, APP12, APP13, APP14, APP15, APP3, APP4, +APP5, APP6, APP8, ASF, Audible, CanonVRD, Composite, DICOM, DNG, DV, DjVu, +Ducky, EXE, EXIF, ExifTool, FITS, FLAC, FLIR, File, Flash, FlashPix, Font, +FotoStation, GIF, GIMP, GeoTiff, GoPro, H264, HTML, ICC_Profile, ID3, IPTC, +ISO, ITC, JFIF, JPEG, JSON, JUMBF, Jpeg2000, LNK, Leaf, Lytro, M2TS, MIE, +MIFF, MNG, MOI, MPC, MPEG, MPF, MXF, MakerNotes, Matroska, Meta, Ogg, +OpenEXR, Opus, PDF, PICT, PLIST, PNG, PSP, Palm, Parrot, PanasonicRaw, +PhotoCD, PhotoMechanic, Photoshop, PostScript, PrintIM, QuickTime, RAF, +RIFF, RSRC, RTF, Radiance, Rawzor, Real, Red, SVG, SigmaRaw, Stim, Theora, +Torrent, Trailer, UserParam, VCard, Vorbis, WTV, XML, XMP, ZIP +
1 (Specific Location)AC3, AFCP, AIFF, APE, ASF, AVI1, Adobe, AdobeCM, AdobeDNG, Apple, Audible, +CBOR, CIFF, CameraIFD, Canon, CanonCustom, CanonRaw, CanonVRD, Casio, +Chapter#, Composite, DICOM, DJI, DNG, DV, DjVu, DjVu-Meta, Ducky, EPPIM, +EXE, EXIF, ExifIFD, ExifTool, FITS, FLAC, FLIR, File, Flash, FlashPix, Font, +FotoStation, FujiFilm, FujiIFD, GE, GIF, GIMP, GPS, GeoTiff, GlobParamIFD, +GoPro, GraphConv, H264, HP, HTC, HTML, HTML-dc, HTML-ncc, HTML-office, +HTML-prod, HTML-vw96, HTTP-equiv, ICC-chrm, ICC-clrt, ICC-header, ICC-meas, +ICC-meta, ICC-view, ICC_Profile, ICC_Profile#, ID3, ID3v1, ID3v1_Enh, +ID3v2_2, ID3v2_3, ID3v2_4, IFD0, IFD1, IPTC, IPTC#, ISO, ITC, Insta360, +InteropIFD, ItemList, JFIF, JFXX, JPEG, JPEG-HDR, JPS, JSON, JUMBF, JVC, +Jpeg2000, KDC_IFD, Keys, Kodak, KodakBordersIFD, KodakEffectsIFD, KodakIFD, +KyoceraRaw, LNK, Leaf, LeafSubIFD, Leica, Lyrics3, Lytro, M2TS, MAC, +MIE-Audio, MIE-Camera, MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash, MIE-GPS, +MIE-Geo, MIE-Image, MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, +MIE-Orient, MIE-Preview, MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video, +MIFF, MNG, MOBI, MOI, MPC, MPEG, MPF0, MPImage, MS-DOC, MXF, MacOS, +MakerNotes, MakerUnknown, Matroska, MediaJukebox, Meta, MetaIFD, Microsoft, +Minolta, MinoltaRaw, Motorola, NITF, Nikon, NikonCapture, NikonCustom, +NikonScan, NikonSettings, NineEdits, Nintendo, Ocad, Ogg, Olympus, OpenEXR, +Opus, PDF, PICT, PNG, PNG-pHYs, PSP, Palm, Panasonic, PanasonicRaw, Pentax, +PhaseOne, PhotoCD, PhotoMechanic, Photoshop, PictureInfo, PostScript, +PreviewIFD, PrintIM, ProfileIFD, Qualcomm, QuickTime, RAF, RAF2, RIFF, +RMETA, RSRC, RTF, Radiance, Rawzor, Real, Real-CONT, Real-MDPR, Real-PROP, +Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red, Ricoh, SPIFF, SR2, +SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung, Sanyo, Scalado, Sigma, SigmaRaw, +Sony, SonyIDC, Stim, SubIFD, System, Theora, Torrent, Track#, UserData, +UserParam, VCalendar, VCard, Version0, Vorbis, WTV, XML, XMP, XMP-DICOM, +XMP-Device, XMP-GAudio, XMP-GDepth, XMP-GFocus, XMP-GImage, XMP-GPano, +XMP-GSpherical, XMP-LImage, XMP-MP, XMP-MP1, XMP-PixelLive, XMP-aas, +XMP-acdsee, XMP-album, XMP-apple-fi, XMP-aux, XMP-cc, XMP-cell, +XMP-creatorAtom, XMP-crs, XMP-dc, XMP-dex, XMP-digiKam, XMP-drone-dji, +XMP-dwc, XMP-exif, XMP-exifEX, XMP-expressionmedia, XMP-extensis, XMP-fpv, +XMP-getty, XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro, +XMP-microsoft, XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-pdf, XMP-pdfx, +XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi, XMP-prism, XMP-prl, +XMP-prm, XMP-pur, XMP-rdf, XMP-swf, XMP-tiff, XMP-x, XMP-xmp, XMP-xmpBJ, +XMP-xmpDM, XMP-xmpMM, XMP-xmpNote, XMP-xmpPLUS, XMP-xmpRights, XMP-xmpTPg, +ZIP, iTunes +
2 (Category)Audio, Author, Camera, Device, Document, ExifTool, Image, Location, Other, +Preview, Printing, Time, Unknown, Video +
3 (Document Number)Doc#, Main +
4 (Instance Number)Copy# +
5 (Metadata Path)[experimental] eg. JPEG-APP1-IFD0-ExifIFD +
6 (EXIF/TIFF Format)int8u, string, int16u, int32u, rational64u, int8s, undef, int16s, int32s, +rational64s, float, double, ifd, unicode, complex, int64u, int64s, ifd64
7 (Tag ID)ID-xxx (Where xxx is the tag ID. Numerical ID's are returned in hex with a +leading "0x" if the HexTagIDs option is set, or decimal otherwise. Characters +in non-numerical ID's which are not valid in a group name are returned as 2 +hex digits.)
+

Note: This function may also be called as an ExifTool member function to +allow the HexTagIDs option to be set when retrieving family 7 group names.

+

Example:

+
+@groupList = Image::ExifTool::GetAllGroups($family);
+
+ +

GetDeleteGroups

+

Get list of all deletable group names.

+
+ + + + +
PrototypeGetDelGroups()
InputsNone +
ReturnsA list of deletable group names in +alphabetical order. +
+

Below is a current list of deletable group names.

+
Adobe, AFCP, APP0, APP1, APP10, APP11, APP12, APP13, APP14, APP15, APP2, +APP3, APP4, APP5, APP6, APP7, APP8, APP9, Audio, Author, Camera, CanonVRD, +CIFF, Document, Ducky, EXIF, ExifIFD, ExifTool, File, FlashPix, FotoStation, +GlobParamIFD, GPS, ICC_Profile, IFD0, IFD1, Image, Insta360, InteropIFD, +IPTC, ItemList, JFIF, Jpeg2000, Keys, Location, MakerNotes, Meta, MetaIFD, +Microsoft, MIE, MPF, NikonCapture, Other, PDF, PDF-update, PhotoMechanic, +Photoshop, PNG, PNG-pHYs, Preview, PrintIM, Printing, QuickTime, RMETA, +RSRC, SubIFD, Time, Trailer, UserData, Video, XML, XML-*, XMP, XMP-*
+

To schedule a group for deletion, call SetNewValue +with a tag name like 'EXIF:*' and an undefined tag value.

+

Deleting a family 0 or 1 group will delete the entire corresponding block of +metadata, but deleting a family 2 group (eg. Audio, Author, Camera, etc.) +deletes the individual tags belonging to that category.

+

The 'Trailer' group allows all trailers in JPEG and TIFF-format +images to be deleted at once, including unknown trailers. Note that the JPEG +"APP" groups are special, and are used only to delete application segments which +are not associated with another deletable group. For example, deleting +'APP14:*' will delete other APP14 segments, but not the APP14 +"Adobe" segment.

+

Example:

+
+my @delGroups = Image::ExifTool::GetDelGroups();
+
+ +

GetFileType

+

Get type of file given file name.

+
+ + + + +
PrototypeGetFileType(;$$)
Inputs0) [optional] File name or extension +
1) [optional] Flag to return a description instead of a type. +Default is undef. Set to 0 to also return return types of recognized but +unsupported files (otherwise undef is returned for unsupported files), or 1 to +return file descriptions. +
ReturnsA string, based on the file extension, which +indicates the basic format of the file. Note that some files may be based on +other formats (like many RAW image formats are based on TIFF). In list context, +may return more than one file type if the file may be based on different +formats. Returns undef if files with this extension are not yet supported by +ExifTool. Returns a list of extensions for all supported file types if no input +extension is specified (or all recognized file types if the description flag is +set to 0). Returns a more detailed description of the specific file format when +the description flag is set.
+

Examples:

+
+my $type = Image::ExifTool::GetFileType($filename);
+my $desc = Image::ExifTool::GetFileType($filename, 1);
+
+ +

CanWrite

+

Can the specified file be written?

+
+ + + + +
PrototypeCanWrite($)
Inputs0) File name or extension
ReturnsTrue if ExifTool supports writing files of +this type (based on the file extension).
+

Example:

+
+my $writable = Image::ExifTool::CanWrite($filename);
+
+ +

CanCreate

+

Can the specified file be created?

+
+ + + + +
PrototypeCanCreate($)
Inputs0) File name or extension
ReturnsTrue if ExifTool can create files with this +extension from scratch.
Currently, this can only be done with XMP, MIE, ICC, +VRD, DR4, EXV and EXIF files.
+

Example:

+
+my $creatable = Image::ExifTool::CanCreate($filename);
+
+ +

AddUserDefinedTags

+

Add user-defined tags to an existing tag table at run time. This differs from +the usual technique of creating user-defined tags via the +%Image::ExifTool::UserDefined hash (see the +sample config file), because it allows tags to be added +after a tag table has been initialized.

+
+ + + +
PrototypeAddUserDefinedTags($%)
Inputs0) Destination tag table name +
1-N) Pairs of tag ID / tag information hash references for the new tags +
ReturnsThe number of tags added
+

Example:

+
+use Image::ExifTool ':Public';
+my %tags = (
+    TestTagID1 => { Name => 'TestTagName1' },
+    TestTagID2 => { Name => 'TestTagName2' },
+);
+my $num = AddUserDefinedTags('Image::ExifTool::PDF::Info', %tags);
+
+

Notes:

+

Pre-existing tags with the same ID will be replaced in the destination table. +See lib/Image/ExifTool/README in the full distribution for full details on the +elements of the tag information hash.

+ +
+

<-- Back to ExifTool home page

+ + diff --git a/html/MIE1.1-20070121.pdf b/html/MIE1.1-20070121.pdf new file mode 100644 index 0000000000000000000000000000000000000000..57b64b0bbf18f1ba6d4cfc1d3dda02fca5e99826 GIT binary patch literal 128751 zcmd?Rby!!+*EdWlAsqtJjUb)U(kY>U(kb03ErN76NGK%@O1E@~lyoVfAPv&>%ooMq zIS0;t&V4=idtLYYzJILEeAld5d-lv{ueD|kv#AtB#Ti%_*^sDO7Pc0av$xawTH26U zNtsEl^h}ZX_(+*#4K0oAjY(MmONo?8+{E18&=&kP*R?kkHPp8QmN6v3housqGa_cg)2_cf>vVbQp+dO$w? zB#-K_n^Fr`d)s#8CI{jf=|P+3!LbY`j!AgW17vB`wq^Fttj9|CtO>{oTN1yw^<>^7 z%X`8R*x}NWGApBK!(lh4`r7gd^&VM|+>q2V!<5v1)NY-}%QwU?6^7yDcwO>#1bPLY zs1rV5aLwW>bbT^u7dAC?YsT95D~+U0I=T|2g|oME{^QdHKXXRk4Z)iu#`I8}H zWoZxU?MNYW4<=g9(7;4j*vc769sFh{K-XCiLFT3 z-tdk}IRBaSLn*aE7u64GCvxXU0Ax&C~L>DjUr_DDzPibp- z1>S$>Qt-PDcaOf{(G$uDJjVoc8-rDM-}#qGU*>ksG*P@UVK9}w+Va~+2vc^Q8^0Wt zn_$WFqS+{Wkj;fscJgAi7Q$L#G?1}{mD$&?Z= zuSNuRFpPs>*TR%a+Ud38vs#VQqiT(5Pm#Ozup|zdw9+y7QUkb+%gvf0CzGFrAH>^f zBPuFzBp->p)Q&HY1WD{r<=JDpve~HO7K`pNJ6^|gL9RVU)Nn`B*oUIL<@Lz{j`&rz z#c5*?7JWRLZ*0$4zDO+ZqtUxOkA1Wdj7o&3?~H2{-xD#h(l^mGD$HqxtEi;il;z!W zDH&hCJAThHIJ8e{8|lsD_kv>fD5<@^skCHgie^`rWT$(zZ%o~vfAsA;%?PYl49nb3 z+hXO)QldZJZ@^Knd~2zo%V?ki)4n|XxXoO*qr`-KrcZ;B<7-KD zVt4B-j#ewTy|pp(qL~+2fQKl?3&dwI4+o45UPVOLaC(n6t(3&_U?!qGY{fj)LBX+ENhV&d$<3DNtbD;E5u4->LzOrdnbb`6!cQqO zh9am;PSa?*Rdb4Xh8~&ch}qh1&}{N+$4$oF4mRN$$WO|d|9ZBBJo&ZPZ8&c ztwpj{!X$EG4@si(7fIFQw7ljs4&DaAGx(ljXyeN!0rE~jUK1{6&Wjfn^2R|};N_GO z5fRq4Gc+JQf1Q*_H7{hq`+e#4V)>UwzaUvAjI!N9d~cK9^fn{+hYr=r8dgeEV`NgL zSnhDn@zR`O>-?t*Z2YXp>zbNR8+4phRU8CRkw;lcC)X0Oc6L;8Xjo4j_6NUc`@LF5 zbKiblLQT>pGEql6_hoSPOOYR%pH=(gX6)?hN)WPqrtPiofA*#G1SZ- zeyP(W9(#w(vS)QgVP_RR?Po(Aa!$@CryD&^Q$b(D(TdJ&_T`R-zU-V4YSjyzE*_Dj zFf19NwWq3AulZI4c^>N?Zr=7d#uN15tBetGefjk8OV#Pd2-n%k+U~|CiJz6AM`g{4 z^r&HVg6c4;ALG$rzvs!p*R_q^?Jq~FOlNa>8F7`)->u!g$Y0Mk*$C1;dmk&m z+#VmBa-2wzm8rXdyUpaXRQhAXiGDT9#N;$)yx2|6Wp}1$HNnK>nlH<@F%uK4!ID+a z?9as{V%Xs{RfPmBRTXjW~MGpV7BSUsv^i zEMJJu^ciV$(u=-j0#$=-It2WfevdP&e*;v&RtirdYmil$uvUuNM!8yt%x5utChwG+ z@yes*Y98VeRSVK1eBVo2bsNaduI#OQN`#fP@AGJq@9r>00_;Kzq9z+r`{esN4_ zgN(iPTy#xsD@t^YXDeNF?fTX`(KYd{X3;gI0~2zmlum@jq?BMU0bEv?!$LBOv~^xk z(50kEBk5#HvbCD8kgIaqTF&BQpWl;vYTU{6a;q<5hI`=^O@nP$^Jq8*Gqx=oIhy#I z`273MRe!!Gwu0ng3{_+i?V*zq9dkmKQu8*Hdz4#`I^+WQc&g}aj-!PwW#%J0-2*h# zXeiQtFyKQQ;&mXL%F_WlQ(O8p*0L<|i|B5ok zXI##b3NfJxzRA{UB4`V{@wP1TGz&FYiZqLIa|7++jKl@rF_X@QshxtA(wnUZT8`r) z<(5ydF#5heful(48GDalyq$QmVnmU~@8Ob~G-Sm-dT8m)^Sx#wsfH=lQqZb+~3AnX}F+UzeX!2WlMErOVrpdWF#xWqzvD;P3;YoFv)0!eT zu`8h$FTKKUu{Y!Y<&*9pY8Kj=sE=!vgIb~k(}-NnK0NtkH`Umr@u2Kcz)=aN(SgYbbAtC;(5~in|lri@8aYZZ$@2tyEk*tjCLrR#GG5yJch-0o% zl?pe3x{jPerJv%mYgA=`IiX8NS!j_3CMBRdG z7iAw`d5!7^8RT*sa$$j7?m{lRajuAUXA4@w(CBMaF;KQlISBESGIwA=m&i#cW$6A@ zfqD-!$jkbFNmHb1ZHB$bKripLN8R8d($ZXqAx}lSSXc&m9^|QtSXU`AuUEVy5O(ph z>xdae<43NdJyEZrDYG`q4++6gGnJn1ot7H!p4By4x;etTCQmu*-f-22+i&JyIl*AA zihBsxQRnk>fabM?F-Z3?1EH$o6wbLqYgE|KwoI=O!d(%?ye4I6VIU&bwoFDUQVoW~ zn6C?Y=YD?N60*nZuQCct<6o{4ibrE2*od(P24fb&tXj8VhXi-zQ>5?T$H5`t4l z$9DNX^)}5z%mS0xF!c>8wY60IiZz+i;V11DCzu7EUgWEkyzZ?d$R_Y(?b@$np7aV! z8EJ3sEVpOUx93?bRf=i9UdUSy9MXPWMu874G82wr{Zd4{k@*%r^z$+UIAnoH4Cb#d zg1uZFZU%cDtb6M=S0Qd|iC7As8GD6l7i zz^>F%QGA|uyGHT(REC`yCV#mTp?JCjp}2&KqOnU--0P``xEB|&nJFQ`Q0r=}FtsF| z2pc726pb?S;*E8cU1E((>P(C<RgZA__)j_okgAR^o(JAsaUr}6P$KG+!{QQ`m#Er!ADqkmKZe0 zzL6M|5LY*s7&J6ksAX4TK0aW^SSUMT-P1Z&syU(|JNU+o(UCd1>Z{&z>46#Ju$=2! zVi46}thOC=L3rg?7&S7RPrx|X^js?yo_zz}@IPJ3gll0{B?-&Gi>m=?z-I_RM>K@!DMQtODf!E#u*ys2T!}v@#rlIK;aWIw!9@|g9-yN*&^DjI`@?N2 zB_>2z2FyUHni2-O1Vavj|GDgc#Cop%k_El}R}KEGx3DVhm+}z}g{$xI=LUc2$bUMW zc;mm>bBJC@r=eUcZ9+8d?umJ=PE^-hLmsHyZQG?4qI&;em*boR84h3)p1Yqw?gMdP z3}ECiz{n}UEhgTeg#qIl2n9xzTnJ16LZ2dd<^P7|HK^E~@K~LwTyL(nd3U$RFUcKs zqPhQwsCPf5rLd`A=xA{*jK^W+$1US(3Ht03$O-d*m(%sH-=lQ-+GqG1evgXJi z$UvFtH#n#zwd8TDL`zsH@#%tktc;{|UUsHg6EISUYGh=$0jMac0H`wH3c|yq0jMG|ONE6YG7!N0 zh3l;%DJc!`c+pf82#ZqQ27mztNl?fWjT``gp`v=DE3M>BmqkhSMjsTUAq7KFfDwws zjE0Jg21t<#2=og7|9N4f+EY$i8epf5Xk|GP69@Wqg?RU-6k;Hhl(Yhzq>?u|7%yz- z$Y_9@3^*|_N-A0yFv=LDmqci!Or8u=OXURb9a(breD`o47;cwew_2+|+213QA9G=M zI@2#-YtN)<_!|1nyr=Fv5!$$#;M(`7@|&URhi?kZ<~aGxmfa=`{VZB5OQZ5r%FFy# zKFpPKh9!AU4|m!0@>`qrS1!m;R&!e}qy`m_ff-B&FMX#`GdZabCkP^q)5%GrAq5jq z$N&ZEJd_|WDKk)C3w{Zk1NH|K+(no(D)t{m?z&L#A9=T z_|ygnQgYpaHK+kD02k$ z1Z`YCT*2!Gwa?rN^bZdGw@{VuuZ$(%hQeLDOT<^ay2+ zcgc!yW&_lbHQKlZmAECZs(xwIbrbOhBG>#jQBY9l2#5*WxJ0=_i%L%D9&!h-&o|k) ziM#;yD4?DQ)C+)mpP%*7+`(4dHh44Pv*2#6Ku-{m!}Z%tZs86udUrzi3Dj3Y>gPax zJE#u>^(5_^9Oc@+WI&x5P!~$rHo{Y`{kV6Ro?z6&(05h!iFpI7(NT<1x%SiU-MsJx z=6ZqRlP(GHQ}-x_V7$oSgQA;ALi2uCLi)aRV)}j;AnByJeYNH-hf?j%m(BZMgLmnx z?C@q>pIV|?j=}6rr*v1j9tvyE)E+di`f)i43i7fg6R7uVKWVf4!Yk_jn3a)1^@uS< zX5v%5-`sAzcfV%n9Qp(1+-@H1IJx)6jCt*ud8RXOZA@~;oeVX`({__XWL#4eap!iE zyt4-)cf;KckV2;leIvgP3DCl1>;mkTp#?(axC3~v0<&mJf(@;71mHamFXr{>mk2sq zKA8HHM-u;G{fkx*5ie&KA{^+baX&F3nYf|)%Gx3n zH40X1eI6V+?rhfXdE+Brw|@AZo_<|>QZs?;tN&z;x`OGjEz-uMD%im0x((>7)^?NK2sadfwG+jH-# zE@y1*&U3=kUVc;`>Tw9_T2(Jo+en|DvLRn!k-;Sjwql7bGK#*U1|oe9hs*jd?$I^^ zCK4aO;YvcATLzE_me`EBM1BxcBh?1%10c2TUHWBUV)!SD%yo`paLTn4N=~|7uBxVt zc`PshhycW*{nWJ6v`f!bs;!I}QoogEcWo0t_4dqzW%rQ~nO@EH8iUD58J+DNC$VwI zy7guoll7hYY#Y%g8D0>l_dm z=u#agYrTSinU5_BqXiF#eFfoZiwOFtu7=OjUm~CvO#dbJg(&*DMR1hdjJcBh&mq8@ zu`hikwe0gu6lD-8xn*7=J-3im)z&c&LzIc4e8Zy{2lIxvDXXdjsJH7?0F2sp>Ft0| zdU6y~VcxJ6x~lqTFO}2{Whdz@_B)jkg0T7!g};Sz7-^+4zxSfb4nh-P1Y6m}7F7V-F9B@*B|5hf z0f2&XY)R`-eq%B{~?({h~^5FX;7Nk7Y-y=R{n2>+#k zj<~IYyL&`Ey67Qr4VNjn$l;DQiDJDHu&9@bx&DO*LJ=MCIhU!eqWDDmGW$aG91}Re zbzDh5qlrM^I<6$YO$XpUT7mnxM9mOP1im}zx&>m_s~iiYPa|x=t6Yf}W#CklAx@BzcmC;pPw>Q7 zgpSsvw#;OM=2jWk4guC{HE+#cWjw{TnyUQqG6+n#2AJ@92qtg=CaM4?Iv^lo1R%17 zfJh$_tpK^kc?b-ylz~)VRW;Nxy6N+^Y~Q*VD)M`w?vnFbJ4@| z_!SqR?h>6Nj_%_wy%}&JAn3>kLB|eoEWn)n*{MM8d)dxt0^B$N+<*bvSHT6i`N_Dz z%@71P8nx}s19Z6SD<#f`+^(dZp3|<*ej^pB(+wxqc6*zHvFdab6;1X#Y%z{G#<%iB;VTAk9c$0Xg&fhaq2Ia!XiUM1H5%;cV35|p2SSbU1Ni*0 zx-Y8yr;OJMF)d8)6zr=4N3@pmaenkk(>)>kyeZf(fbruaxU@lx#tL!Z6?9=V-n!D( zUnb^y6@@F<5K-p()<^YV4#xPgwJ+28)L(r^NH5N(-Vv=;^=dkw`WnAk`bz|V9;i%- zY{pzk&mm5zbM4iB*B|JxahIM1gr{IxY-!w(3kInI4AKl3BsVZfn~+fh3_NW!5SH)e zneHjL$vgJW>GG};6SQR$bj;MbJ00!ROnA=J^WJ&7sPaJ`w@4$&qs7CHVt6;wM&?7v zqw%=5Oa|3Le&UMuNq=8=LW$Z*N3AxYte3K)zs$Na!^L?qWkp6@Ig4G0q@Mg@FjQ&s%S1;B;NAW8* z#E0m|37%1!?FJ(~uBY)Ukx$J+JGBxkcH&o>pSG|(4lHt%psgP#dbMxrk`n zzpr-h;4i%2LKjQEzi->UwFABI2X()jLi97&g9v*yRKcx`S9o)14NO1{1-AAd7?6?A z{7+y0yNyTxwlU;U&xil}8W{SuP$9SFzZ7)b3Um*6#*2VJ>s~1@>$|FAL#KJ`2434^ zT*B1pvXjHXo(ZRlR8+xw_w6rV*SfPO806oldh@ic*I##kY3uT(@>{C6VC#=Eo4gcn z!OR~Al@{=~=OWJRj5$Mi4eiy!^iD|)`L;Z_E7^}a&SK^Ub|g-j2rB09>_qqCwiocr zOrMmxTDX zQh)M4GJLJ~m=PcNika4ZxWP>Fl3#2U`)44%xVYOp|Q_ZT)59{m z1x@!D2PcasEk@*_$}Fa1m8B1Zt63Qf8epCSyR4`HC##2j6B;uem~FgkVqPt@v@o+s$aFB2;vni{ zLHa2p84T8udf3>1mZN4t3OZK-sZI-2RJgtfTEgYxUCR{0Nl(LjqlX<0s~p_4f79r| zC1@)KPi*rt`EHhlE-X`Ysp?_3UO{amNPk-eiTST?1<`aK^Roob(qBnP=VtlJ9zlBP zdmi%#gSFr#I$sA;iYvNNT}iqSIDQ37!wD=Mxu8@00g7RMnb-6_`I;E=m1@ona?Ta)nH+B{oUCS7 z2u{`V9v|$+$ycOW2~JK;)}8F@Hg~$?!w$-ixi16+KLat^mPC%mt+;YN>4nWoe)VHr zWWsigk+BZEM}D(gH$CxSA&Y@9rN187%=VO4Z z;AVJ8Q@*5E7!wjuG zQ%W1>S3rJP1K*^+N_>$Ox*SqN!t9HzkRb?CFB9;nX;-izqB?FM$zpJ2tDn_i$}Wfh z7fXWkDZ9EyKYInXnywD^|1r=92>nZtzx?O-{fbZ>61!hS54m6+z(2;%W?eDHzt=F< zH+~={HPgUXd)lCF$;Ahi5!S@Q=6K^X8DzKN#y+Yd7h{NefRlguru8IhwMcZx9QW)O zUJ?5c2U^B@C%-qh^4fdoVMN$NAXvz&f?%QWD-S`Oqef4r&5_k1PgyWXFQ+Hfzj!ht zEVX@+5Biop|GCPDqxH_~v;6=^q+Ea!ltUgpr22DG=y#UrVv|al zFK}I|H3?ruxt4=Bga*fI<|L3Z)%QHjIcfL$1lI@l`p%pc9PG3nNC1^Jt9kXa_C2mkD$K@IXntRQlT1N-__ zvS7h)=uNI;oA68K%4(r797s+H3mbaK(7R714pC2ClN!O&A%V0SFg5@KtO`N22-#F% z!~)5cOY}SaBMTBYm+0rFLR`Qs{Ut)2`vr_{kPyB^=Lz9X!`J&DroDpB1A%!~MYn}3 z=^PlBV?Rhdcy5g@cl4t3=Sxuy>cFC(o8OQP%)f*X)w1X_-&sKj(G9m*z=+jS@ssg8 zgaD7iUnL7dh=MSjB#kWAHbY7Glb+M#Ev6z5x1DwpkICX~UiS98B1KhxesE03 zTQTj++r!gLV;tYMcO{>?hiwtTiyVYz8Xk=MZ!yR{-(skeIGFCXqMSKGYowfE4W^w@ z0{b32ceJ^pixzG!n63J6mDS%n81GAWvtW-ddJL9=7z?gNg%NJ+g2j<;b!^c^XbfE= z?HCKoU>WFCuDy^|1@FDtBR9dAQqd9ry)AEBg}_F{j?*d*gKIZYVxvcHtZ5EO+e)#1 zFO^xUzRE(OzG_*qzKSc_ida3`ijkswgdo~#;s@;vCqY-msv0PV(at!UE7V&oJ+6O3 zJ5y+)Sg%P8Xe7<8re5N}@%byant``&7NQ5c;DJ`{!nRh`%e8mF_TeGO*178*DO;I0 zdXANFV{u^@Be%7^GUgO2*~oaf$gEW#@##{gQFp1AORX> zg7zk39?D?!2D_H7<=O`wyYx)v4Yndj zL!H(z2jz0&N6HiS#to)P#H*?nY-uOC7Si2Y9HrW2RrijRlk5_RV*MEG*Fz}Z9ovtR zXt^J4`H^T_I%g@(w4V+)=kV_D>Z^ala64j6Ir9KNrp*(a7PQ(u4r-}zd7sn>Snc$L zGIUiOY5@G%0sQrfZE}blsHEPQRd;9fx7w)!QO`H9`SFtxSQJA0OAds(0=O-IYFL)C zu>4}{FYMoP*xE)%%74*!af8>8&@H$3x9mk{&Kc*aLN~_1qRSLq#6_!ppn-h_;b{Y` zU2Xx<5)7W=iWU$p=WpuOt$wzAcOor-+p2n*AZZI_uxk(#3qSxCsQ9BE$^bDjO;>sh zu>A;fe~?uLa3zq%CK1?D03k~l;QZR8{+lTP`LL7RLk*B1>g8a|Kh#)~_Y*u3jHT|r zbNM{d`5_|6=_3|4Hdc<`$Biz|BtcFE{+nZpERb`J;9TPGbBgB&mj2yA#q+ioM+g5e zPb#uAG9$74Iz%bX297GS{5nASx91iiXBjVUesP%g;;iF8oTdc_tE>pyam4pd=w0xc zWJd~|7-HhD*ZNaPU`L8^ddtEhk+ zx72Sl->_#1r$X{Re&su|ez0}C>2cbAtb4k~gvQz69zS(jd+P_gmQG9ULF&nE zWrJ(gR6a>xakV|x;!;tW)(6cCc7ocOa6LD-7FOkF&h~o`T91o9PaPj-ldNm?cpmAV zF0Tfu7M*z<^{@*}1ke+CDBAVRR0?WYd{?bGI8=^{V~bO^blLsF6`k~<*7bBrB{u1F zV@Y`Op(W3zp}wY;W%cp9?o;6^lOd&Ox6;W{8^ejH%=ki$v8NTqVKOY5C2#4tc5GFO z5W9XH4_<4ipR_;hZmR`?^G0#K(>R0UnY0n$xJ`_xkadcvP_ZmIDVzj3X^SNI&pT;y zQfzs0(ocZL19)nb80hX)80hIV80ZhEG0=l3Fwo5aPn`-Q{6iFiqyV7)2n5O7kqDAi zfQGwF^Cdod~j-a2f_Ggit~lnO|}59SfT(g z6>>oI{!r_LPYD;3Bif%$UjwHgYb1%`UE;ujrgbF1)}#u9t-A}@Niq6+4GSnx8&tjT zTfa%{&CCeap6stx$giIs={A4QntIott?y8A#}es_a2bbLl4B#Uip9i0)~9-vBu2Nv z?jgt9yC!P8b~TlyIav#N))=cfLpwwFBl(jU3d*5Y!fJRK$?jq^lij@w2%ed&$^Z~2 zGg<3XK$!91|109dF;QeCr7&bAJFm$~=7h>h-p~;yuJF?k&gEbx<8TH<4M>@ptPC$c zT#X_jT&2;6-A+e15lu%}tpkubpj|*xpxs`ahOlGJbyy0$kL2+fcJ*FlEVxARn0B|l zSXkoN;<4-&Rv1_;HX>7EYCg)`;%c>@>gtkto0o#_rxj^I=QJP__*rY{P6S%O)csU9 z=@k`kH`#cOt-HF@5ok!;DQ-&fX!Ge!ZeS+dI5DBa60!WDv~L7>eI^X>(s?E-v@w6b zNtm<(^Co6hTyc13kB_hL8ucA^TVCD%h$F-x6-l_3&w%hG;rP@ZkizI$Qo`u%0HO#> zx^s7{wlk6j?d6?oTP>YRlwmLL7;b$q*>jN~=6Rf(ASz@UA}YiQ(0C+D{#mgJ1|vKw z0-+;eMd}fw!Gk7SiW5-u01H4~B}Q#j`eD}x6J8;oM;(9;$shVn+(Eb!!wHQPNa zCS^9U_u!njzl@$V40A8*>2=!KuO5uJ?KGgJPP4*6T{rI*N*b!u0!uXIvBq-d56rw=kF23ztjxE7LTlNA}m5pj>G(izU7fTfe z&j&nP3j0Ksd2uA@NP^pNl9n0hq*W2ZUjMIPCJ@@cU0q94hy6jij_1v zk%FcYt;UK*U%Ia#T)ifG{v*7QR}nE{4G!`nCj4fjkED|~=70kY9oax~nveZdfV96o z4ej|4NvGGC14!||TVyQXe<+;6d+(z8PsJI$iWvCdE*MMqA4M0^DR%5+@TDp%7 zQ@!RxCRB~(d;SBcMhIUM{Vy07;$DTky8j^hM`gdo)0Xe!!Tho2zrOEp@!$RZcWr-* zL;9P>Xr;w;C|3BbW+cz|b@T3yvT%RgDF+3%uP`_yyP}hd88}>8%tVoSxp;P#u{|tFx4ARu&UP88y_}pr^zbFb2QN#k2LM3 z$-0Nw-@;BymKcAXN)&4_%}0_f19N~b9{skDf^Y`9@XuN$gjYVsdbgr~b0dU-$wDHF zMwgR)j!Eu|F6~bZH2vcKgd3R;=Ia2HzbKIeTyo!VX-Rq=VRjZ2X@6|tU-yP6ySOJr zkAbZ0b8=QtO`)%M3p?@^Ixtd5WY|%la2Frx3oueNS^Ny}va%B~6f{|y7}5GzgDP>n zf-Dw~t6H%JY2iSBeW7mqV8gJpga~_K3nM`*AppZg1`L;P__VCy~tvH($G=DVCI7~!eZD>d}%#c$qst0#NmYS#F(okXC z$l=+SVoRL+-DW4N24-bT@sA{^MD>Vb!cR?MAcbi300#wO_9QfE{}vuF`#tdg;ZhC* z6g>ircLxB9`Oh(5kGTOSdCrxf%DBc%hPj;PW6VkN7bOs`WPUotjG^~@1&}O3mG*zK z{Y%-!Jt2DVfo6Z?64b7a_#Sv)1Ahkv=@*Zjawpry+~m8V-yJwEbd0&F!Yz!N*AFdx z?ER{)V!3H9fB+?u{~Uq2g$D^bu}6YTNRP-Ds^@DuI%!F$uor}jxeP`-|G#4V?`tQN zBTk-HDoLL9+G3e(SP|ik@tn&C@K6f2t+g_}N{~ub2gAWV+ z=c7TaSA5lk^iwx40vcWFs*N6UhT@Xa zrtuiWlO28uOgze}%p}R9JvDUG+-UJ|Xd2)BRxyTX1e(ot+y@BXx4}Q_8}85E4TT>>{#aD|3Klub&UqoV z@dtrymT_Y6yM7%rUZI+ZZz%0+{a;^k3cl%)xaSTxqltU==plg-@0@n*q}L~FJN|>6 zfb{zBY3@VB*&Dej>!q4adCxdCsBV3I3e9Bc^ToPg!>%pl1CH#&531F&d3CrVUQ0^o zu%EKgF;q$G30{@H%$&u>jOd6bh1Ir1iv3}$omRuGr1=9$x&U-8KSbaOM zJJ>oZ$Gtvwli#E?gn6e#l>=q6v3El^_O(|TyNt{SuLBENR%6aQ>Fg@m*5c&*y_(hc z2i|i^HG7ps{gAePa8vkf83(?u*dRA14VS!UB-$_xW-h0Dj0=O{fVMcp_D)$mE@I2m z@>$=9H-yS`rkTTC2_Gi(DBL>^HZr8-anV?k{ZfqWFkfY%STmL*PtOK#jlTewCG|jJ zn@?8&IidkR|ho8v#YrRKWAV>vSC zrSxnW#f0IVG9BxWI$I6wvgOvhACb+coAu$<+buskxTEy1`H|=3dCv5jQnKe5t>%7n z)>NfnKY(YlzD`A$CTR$aKJoAE#k@14dhLx45S@DuG6E{dVZPDPLIV~BK3n8 zwAq8Kj}^UG`gi)u2i$2EyZEwT=pRt9ybYhXk@_-3%e{lg?l&|1plzUPDs9Rx^se!b zNFFou@}OswxN3ExG$hiWaMDvG-O+Bzzh_i!L~hXNZn;x%4~AyNyZAbsD_6+z$KV;? zX`YJbq$~a(-{iSB_50soFvW7H4yZ1DQz69y7n8m*gF%Z@-PR8#J zD(x1s#<{+xpZI3?^GJ;dL|&zhezsYcaQ0S=^K+R%5l_&k8B<6fp@rs1^i#S?+e}pG zR@_YgjGjU66MNzVwY<|uNntOE@#xko@?sR=n+vossV8DoGv&2zrS1A=9iO(Na4z&L~i`}B=69t{b&MCK|JStxNrsO4a z8OuB7cv`a4?`#Z8=8A2>JFj0Vt8Y8b4Rdy~X=X;FCgWOLnWk5s}w-e=dcqY}97B{~)(Rswf(Q$bhvLnpHQ$ECv!gt3PZdZ2QIzS%+U_?4UQI)MaPKqja`jUw1Fncr$2v zh^;YY_Nc2>$@sZUsp(L?f^Fyxidwnu4NLJ{vPQq}QV+L{)3rvwFueSzTvnP#O#M)v zDPOAneiF9CfC&f6q5z`n=Isy01ub(_cd7&$HEwvImb{ ze06fPywwCVa_jm5_If2uz;c6>%gPJXQC&Zn>yA&%d4{QF3Mpy2D@YbHL?Rp;(eeB# zd=km=z_D+?K6Y!EA+CdFzu0 zukkmk#2rG_J9&HO(roKFI@H?bQF^veF9dq2w)eKn6qK))BZdkC1 z)vk@}r8htuD%($Qk0`tTw5o^4aCdR2-j9`Z43*ziyd9gm-2;DQ|8x~G*#Y+258FGI za^iKe$m6#Qnh@W6%Za3?vR|uLug%&+d*p_Yq-vF{Ci;k#=25>LLUx2Muf6m(rh!`U zN8*Rw#BlmO(h0Cn9dwWhT_)NdnNGx~n1^RLeH40(WnxlKTNP2-F<>@O{cTUU3w+_s zv}F{FFKoUg`DXIF=9Sl@4XQ7GAU}_VVX#?I9&C>~=H(`Slxpd#A*dmet6Rz#jyP%~ z5_N_*Hg=nqq6udGIaEmkbgPMpv}Me^b)MZqdF>0APt*0wY=R*eL;CUd3h9-0)T04m zk-qr^^eDKaA4X+N1jm;it&X-dM4QyvH->~OCuoZh7nqDWM4j^9@}_l&v_V&<=2Eqi z5cnutD*2)dKBovy&B>(ib5@neH&glampZ9XWj@oA)v;&6%Mn$<1|l|TbumgJ+s}wr zGk5fs%`C$Dmxo%HKTCSO3=@f8|G0PZZ+3}Te|-`1_bw6Zubq~E@j1)$w*T{Q-Jf1Awu=vT{^8|f`xQ|C)2CI- z;w`KuIMKZtmQ^P!sEtg-Q^Z`Y!Ul_Wx!2a5&5Y6jk)>gNC6{PlIk(?b1@hNX1C1={QyIC@yp9TSdL3tH>gu344L7p#Z55k`LS#QFQN30%gbu=5 ztL|?x#QJzMJNx6!9~dPC!-_iVpA&ps*oLvbhxc*OMOiDW$|-ThtRQbJJmodxVYg~L ze#M{-lk+ZPEb48a^vJC)DulkbN&^~$u&hy4cTD+x<4$_RgHY;JZzy{`+)+~r4^$I+ z{ES=WpuQWCRgYgX{WzB{DT%BLfAZl%fwXdo@MKwJ%$rD#L$c?YJIEtz;AOwV)LVDWaPVUCb0&!hB%d>~YLp zw@76~2gKv`zEtLy8RGD7^zP^qq9L+9&i}siV{{Q;)bInWQ8Bjp!(3&udNR6X=*16V zeu{UsWr91UN0QT#8W+ENb69PBEfZB2en4sH@j$Aef9r=AO5AFa6JG3MNWp=G8rJr` z%5?iXRM+R5<|f4woOiRBwdq3wBt~MSWjWCwt4y1SSPliK7bQ}aKe+B5n#tkE>rnYM)$D5`Y{I2SKqLZJD8uI z#m3!x`GcA`sGFN)mhnDMO+>y~Sz-sd^6O$5|25NqF&d5vHsz57^VH&e!x(9`lc2$G z?Y0LNAC5S`;_r={W3N5F0H8; zpk!6F2FTn%{IW^Nbl+ltCCa%*O8ohYHS~wr1oY#QZCh9sFnb5%2!x8V@76V0o4Q>r>=Ni`*A9si}lB1S`5e@XU|Uns=$b8A`*c zN#`?I$4NX36OY&ydqy0z%V)7ysq$GP--9iNsw*i>^}`Lc4D=$JZyYLJy!YrGWbR!z z9XmTU`uxmD*+HCi|BlC-T)Tm++e(AEE&*bcw~<7Je8scRbP0Id5m1eeICoP&>Z;4z z^Vse`n4ScPhQN>D%Wn0P*usrX8+xIM=G@KA7>QbwR!Ve#TB&olUIf*f%AWOH69WZTqvLoJev(7M^F znTh#1tMWqSn>6veG#KP#W|9TEPOhzs+NArzt3&A56%E?NjnZUjiwiMw4npAWZg!Q& zf5k|40c2a9Z5 z@Vxw8j<~5$2K0V+Wf|1f%UWA??v=8z>Ie9&6s5)@kK(;_kj;g;uH3MvHYHz>x&iAU zjO~LyaC;&89=E`K;(m z@+^#nh@1DBVDu0*+nyogt(y+A10hevFx!wHjpMMpViw!l=mtEyXWF4d)BRcS~mhI~+HSsFsVi@iSl zdNMA_f~xf9LAZH@Ofa|3i8LSD1ILcx)Gfg{238@7>_yBL9(n`Y!4;?vR-vupd-Oc1 zlPHr;14@{b7#qx0xjt*R8ND%=%Y=*HdMCT6EaWB1Yn+6R62ix6F=D8=h`D~sRMjbPfp4%&h)XILaTtyxg+2nyzgg5+wo#%f^Gpk9)40>)DU)i7DY zbj1h5^T>BgJCyKC+EVc2xY}q}K@wz(^@#UGl2mYu7Ug`mC=YbH-;v(0_EVj}=&eq%o!EgL9D=cx z7G6ueUn)|KO1kr`3?t#~Qj?liV3&bX*@`v=+A>ava17U*n;U$|^Yi@2^Zdi+ zLN_uqBbZ=h$Kv7cOb2_t?NWD;7Z4{yeVsyNSi35*LDz#-UcutK;nQW9rM5UMFFtJX zVJ@Y5hv8Yn6ExE3Wah2C$vi9e<=0gACXKY$)9$Jh&@+FLO0{|{$uNS{FQB76aw`hn zJ^Rron7h?@u~v)^t0L&woQuc$3!HnV*@8e+3XnOcX3pY4>#v^X-h1kswJy6|}W zPM`@|6cS~)uNGr{KJb7O$>OlpG?$E8lbc5?Z5=O7CNl~08xSpb%iR;j)_dMrPw;rq zLv%1D(UF3@A|?%*gS8zh$tbPzM%o*z$|l}qKdr|UJyve;84?vaB=72VktTo>{e*Fw zkE|{`p!PZTo}7TQ)GjG%nB;MKVs&PO#_qGajNGXw&)R8Ke1gL62jMDDMEH8e<&Rc% zn@silsndC=>C275q8`hqe(b`FW8FV=xFbOfrx_}@e_(+0Etp8q0x=mm3*9s%`DHh* ziTv%1#Wzk5?|n)5#{ zc>XUFG5*k}8-p!z3sUKTHBm(Gp;V*NN!fLgf(UdpY*ZZtR9Jd4h6tRTnP zjH$kZbi!O$M<_*hcf^WIN1tGxl9Eih1U7IwThLhQ1h&2zZNnEnh1Vgon-q#MOBX8h zg(vBA`3jupZ(u4;bI1u-?^mgwalEoZjY5AxEULcG3g3Xw^-X`o3By-D_oUZcC8ALk84Dj0K0oT-X`D|}E;aEnn_?Sk-TC(MRY2Ae(5@F)K0$91&Nq67k84z6I}4ZIGyWk*!LDzIS_^0ewXx)s@Ec zfuNxUf%PM-bc%ApbV8+9h&C9Ey&46}^m3wkk!lupKP`_reTrE4u&s%M_;uG4l`!q> z3;KShm^;z}HcCIUHIk8bM#98#BaP@fYyBc_40c50*^Z8Nf%(K9%lvb#M*Df^EDMP> z^AO^&#RbK3nLa?kP48Y`y}H=dz?s08+8H_;>!hI!XN4<7wqD>2^|E<)^A(zPVgXI{ zo8+t|570@&IfE?T#Nm93%nRh#k~n#&~n?f6|4p7CaJ5!Ta6@n_J6o@Ch% zIT+mB#v0s^Lq^T4+c$Q55SKu{qufpi+o2n4^3$jJ!##VTWtCI^+`cvm?-N&r{nY7_ zcJU?5*p@{mWcrJQ4!Oe8)_u$tF3l=1!JpY>kmPxY@1#{4&i(kR@RvqG&6Z||pls^N z0Pl2Nmu1cXam~IEq|xN#kIPFK74s@^vT^zc=IoMdfVe zy|jWFV=u9TGOss_BDQU6#dnO7W@I&Y8P@)du3Mhn#hjK(q)?T8$r?{<5x!3wpUO43#@Fpma6_V%xu=LEBDL^>=#A^ zfi`ttHA8h7QXD~1UgznNW{owk{v6vbSs`M#_L;56P&H3V@j3?TVA=Z^tAe&f+$D#3S|#=;v6hrAq583diF!%O~@PI(vF;quBFzAKzwRVD$u{;obYu~gkanM6-4M3~RU$tj2|NO<>*>c9*{$VO!rF_cUtY@PUn zC{6%&&5fKjb^(?YUU6edw?fHIU{1S>{a$Pfv%28x-}_}JRz{RF^-%X1I(IU-!pfF=NOkWOW0jVwkB>kK+@-km%SBZcl2)A4ENmQ znUtqQbD>3R*^<3WWl}g13&eFt5CGrceW_g(3QMRlUxZqRS;*2-*yw~hAI*j4@hC?A<2y#RhNJ%}}Yhbg_r3%5+j&AU(2inr^(k+eUm zyYx)-|By7MzlKnMOVXHrUkdXNN&6)ge^1hWo&5t6{%=Ye%g+Ft={Gw4uW2^Zzd;nH zzlkW7YSNBB1GmmQ)pPo635ITQYcZ_U3SMtFI}ilOK+vhQ)w?6@*xXrQa*OqN z-+-9P5T3Qb?s9dfoA;s2gSK$w)lGWm`O_(Hy%|z^U1R8k$oZV~z zSmt-xL)!xv#!H$uzoHfZ899#YzNrkR~(Q0a; z*k^2BPa|LQkT{36hTOQKG#1a*g3K94+hY3c2;0JGTfgr$$2`+(;5pwv;JzGeGz4j& ze2=->o}+%cC$?w%gwR?v9r@5*a79j)z*ATmueF{3mjJ)yRpVYSM3D_bZ2yR_}G~Jr&bq1Gx z5jJF3`X2gVNa;)B1t=!MRy8(-Y)$5VVL!5>twChLF@3H32Kip2P77pClr^T@%G4&Uttqn zQ!F3kL{*3$d`U5q$pq;Gm5Ct{4pT2sG*`H|?_vPBnx?7=54_GQoYeW@6I1FDSxJ5^ z7h;K($@!dG#-?}7*Le-5V(Y;udAZ_?9JJUj%oyX!6!~~KC6*PI5q86KZANsFQ6`7A zN@$5nD_c@JwUpN){kYgNLp5@eWw2UawYX)zu#m+x?Fo}&q)Lb3mgpk1NhD&cK^$sR z{8XlO)C*lWh@nEC0)#C3qI;xKD1vhK1dzyFGUmq3ba|y9hfnClA4mn--TRzXNS3r5 zrX-OrkF?qLEFgs=SPZxCMbKm&UiXMUb{q{eCm6? zZPYjMnUrn8r_<3K9LJx|NTIlhPZ47kpCD-;YW1$u%vQ*G;q zNFh=e`r7dsWi87yUzUjE`>l@HcPDO3csJhEr@{eTP)x*aW|A{?#l{dZ_b;Hspsn0A ze%gfgu#&>QwdCcX^ZxM`IE1n?$O5XdnvE>-b=5F)Hma%W42aPJT%rCZd0BW2@2*xE zhLj~(%p1ty(Qmz|uN!RiU#`2e>13_PrK;$QQn&{hdS~x?n%@V#vkq^m10hI`3n{aK z)WB2$w!nK5&hG)v2g!Yz#0mU;>92JV?iWD0gXpC2?g=sPdxm;E8uj0D8lYU@thr5M zg|-Udy!kZEJ_jk2+cqD z>6uJ~FeB3Wq>hP|Ts*qtw%KOP+picg9q#lHU&|v&1OMPYTUi$7k?}X*uMV&vC9TG& z;0$Y$dBf*iA#c*6Y^jZWv^sRR3m|8JaDet^V5OZ`3L)fkKm2$WYd9`0kFXB~Eo)SA z3XIkeX2J*T?*zBSwTmj8Um5|(dPCcI%d_s&7vguJNgtQD%23$n22&cz4My7CK%4jU<{4)l>Y59{`qQX$jtXyHH6c%hoM?fMXc*K&1g z^NO$Vogi-Fb|#bg<`$7z<=4R=07Ky_qODlTAW01s?|1Hc$#A9v5C|yXIw1#kQ`4!; zv{l-BQm@=n+_?egjhTm$yHVK8mq=!2KKCvVdsbUeqEQdzpQi(Q)Sr2+ zaw^_uTfI`BQ0luLG+%`izws(qk7FNTzEVVFB1p#&NE@u}e}Zr(N*j|Zi{DoydLo7h zzqQg8t2CCny4sp+8Y%A-Y&Lm0C|R9i?U{|(`EI_uMsG!)2 zNX%p8Mc7zgn=9d^^1{!4PeThz@R_SQhAyNu&pxKh-!u{!vmRRw0UqRYQo;;J41!iP z`4H%;bs<%qP#6PmXGEPuilF@zidQD*4H@92Tg4`2I=qzoGl7y+8XJ(VcvAAY<%^O8 zGO%&`*o(eUJ;v+=UOJVU0AWbHd1!>YrN;wCo7e)*VDNsvx&@{>BTh2-}Og|q+- zMGahb81t$om-?1rrLi=z>raY@j~|np*utFhq2TbdPMjaKI5<9?1Yfx5Q0iA3a3g|h zb$c6y)5*lkBUE9lRZ@2N%N&d3sP3byqwN>vQs@mZH7)@w6G5#g7Mc(=-LMamC?W`5 z5CinXZD9sDo~9XU?8&%@b~?bzu9JFwF&h&qSwB4{B(~XqKLv_j9OW=pD?dJd*j+D;Yqg90+_4ij)@eLW4dziF zjjHRQKRFSXhell4+X?qSkte`I~2aLoPV#9go0qDHTrP;+qPW zrm{m#}$Pylv zO47>UZ#SaZkqPo#S!M;T-kRsEte~*8E>|tF6*jvsQFtsQHVXbj$leJQIIGp`EAB1L zK!M?>!|?zRK>2*jiAGRdI8Rr4KhxEOFHg8v#_ImGON9Zu(uear9hyRQ)3Vy(dGa*E z)SL>wv7eA+7NLo*!2S4M%_zzmWT+-BLSk~E3s|B3c_tb+NXp>n*;WZ6%b~t>=y|6x z*fB++Gy@@c2YrmTNug6oy9?&_gr}xWdYO@ypKpN@>SRJpp8`P-M_dmKxx&9w+Vw6| z#H)hh46kY9JjM5Wmf@M4y}oQYPYE41Ls#N#S=F(9VR)M)@d^mxT)*l$;f#$-Tk7;P z{Q}iVIVe})_+?8poeXc%O2Qd9Ggq+IM#!0=Mw9+39q0Y)$qX;0hZu?iiDt`4*NTLB zopoE@>T^M1LHQ)8SC~DP;pToO)du`Z=f?L4n?b04#@!QhcFF0x3fHE15iDvJ#z!F2)UGX&sou9HeDXNA1|}`lL37p>tgr)u3}dzFyu-srpb8O?1;BTwdsNQp*E1wO8FVouV>~ z&E|PlVoKq($NHZUNskfQKxR>1@ZGjxmaOu$v_Ei9b56gKRl3G<`?`rtq@kRn=L1e- zPE%3}#~ZZ5A2V2&G1PyKq3brBRZ9!r($m(43FhETP>91BkY7eHW0=itm&O(zAA6(< zXzhg`Zb<<8&S4DgJ)~n}%|`U&`#i*`TuT>jHf6VYV5Yv}_Yqi9FIesl~*7GqJdoRbwrMX-SX--jZLYrr^>=SiV`p!;n^PE@#`y; ze+)8$F;3wJqkqAE?+@t}E8b=Q0i6uQKsD-h%k7f%#&pDg7^avn9^y{8NeIV` z_x#1+Shf>&@S3*tuHjpHM_WsD-J-GT)1@_A{`Oba@`&wfUfV3*bHoa?r_>EiCaa0J zsoZ0Bs_7gV>QxkuFh6|kLyu73Pg(-59*sqNl{+IjW2@R zy-}v#rKApo%T7(TJ(_Gh?sRvp;90HHEF^b>1pA2JCQr0n?-SzEWMAFT^6w-RF5s@7 z7QS91O~gB%>SpI)u>`=Qf#p@dT>ENLCrnLiX6It1fBJAEz_5Zr=V$<9f1E($sLCf; zWlg}r<@L1K-|I|@>5a^mozj@_FxUOL2thwZh%?ey3modDP~sWRPdfo{qAOPGlw;l= zOLIHyvE<5Wh#Se^cxvi_FGT?j!he+H#gfg1j|U>92{^5iEHn%V!YEQk4b`}?2n=y$~bH{8*$v;SRp^iLj$`LA7< zzYEOFzq6?Sz?$D>%V{Z~)X|7wlaMY)qRD5~;hN_WAZDTY?T-b8C zjQW*Eg~)U-i4k#}L>dbK3~Yz>8E6~tRuO!&Fry9UXTwx4Lm0o~Gb92I4+bm)aMe2_ zy3LmqZ!_M`e9~b_d~tyhm}`A#`T8sDuD5Jl{-5rr0`~eEjY|7kuQPyix;^Bf``SEe zXtX1RBkKVinv}mr>xFeaWTX1A-R|j&_i-23cB{k3wicAihdOSPmM)jiX0+qr)R@lRAf2q-M2ngj~ z{o*l&tiX+JPFvA$7&B~G0M6iKv@d?+W8WPl?TW>n@`ze6Hlk5ku}&gyk>7R~34cUD zPFW{LB%Fz|u68q**kdlNWT#c+9ZFTho>o^FbUU_IL;k?`6tjiCAl8Jz?)W)YHfy16 z*Y8JYXf);6vf`JuV{Bt5o(h>rHI3)e@2uYwllSQZir?H53Z=&gM(QrjNQ3w?RVqD$ zaGK&~Vz#Rrz>*^90=-m6@*8ilf5~&UC9ua$q*Bws6g-)gWD+;O`3=o3Z3SLqzViKZ zS`srWqn|sCgj2|ZIgncky_BYqG5D;_XP|s#hA1+7Kk>+9+blY$l_g|ro_@cq5HLA6 z!jKxF2dh+bhG27;3M%*@VPiQMB&$m`b>y-w)KFl11ejz)0{vlGG~-c5o6qw{p!DM4 z?4s#&ORtCC>Ng-mQJ-g#(^*$*+=^49z0~^FPIGx`$_mBr zp!D4aiQR3xJsUK6$}(wB+-z+8nXrxy^X9UGX+Y_WRF*~{dcHd&M4unKtj*<5R!%s2 z!L48>cCj;xQ(B3ymlJMdniheXnLx&(hU~I2U(MojthleX&nL|f&L{A>NEj6g*91OQ zmTPtmN1LVC*M_jM(uSQy-Oc%1>_a=(v9g3Qe>cgWPpaErDHYGLv&C;Q;h>yS;+3)$ z4#J(Tmmj)BGoFemad5OGktSij!yySQFo0v{0Y8UfR|YwgAnEu2+GgMFK_fAya!#(~ zKPpm@G*!Dg_I{X+gvDCusIB{{cjaMHo4l-Szfw4nP;+AM9_|&Z9lft4h@1n=+pbb? z^3hs%eFNf*6gk1#qw=c$rs_Mrj))*?x+n?Kd73Pp)g@*X^5-*mJT_@h?Jw+z5m&7V z!8JCypzruxjlMaWi0hboMdmdYU1m)WW3fINDyg(Sj-yxN_BImUgnjJ!XHMWU%;VS;9W+-=$$g%bc? z4aH^KK_#FBRp2F}JBx4s0gU%?DA-;3t+LCWVZQ8!C+t9(p7|9aZTMRHs z#xTz9pqdWC07+OqHHNrSqIQH*rFf|VWCz(2j)`p$`nm$WiS{LFRZaB<#PaAzp730u z=Ni=qeN&$L)iBuy7G>#@m8`%ZV{pK(R;E7FtP~PEr66eaBUSOqizam)X@%(>QS{er zdoiNiWnectmv4TOUd_6&_K4(%eUTmFSA{fdrfE#_k%*ExL!lV-Ya3CgCkIQbWC`Nb zQI3*7S2;(qxda2(;#PO`9!zK3gg~l270brB*Z^g>oiw((&XJH>hkWxkk41Bo5S=#! z<86=CvoV@y^S;nHpusB|1q_LJ+%gKOrF>Gs5K4!TD*F&=3ap+S5gDPq?)nb0^~U$> z7U_S!nf}*n`WMSHvj3wsiusQU`~Na*_OHcs=HKZ454HLw34gEh@ayb4IUflh z=hX5SQ~+9niv@k{bw&hf1dke1T2p(loE?}sHyClWKsPjgrVuwQDuxm^Pe2G;?^$>x z41u?DC{M1>hhd#1A%g^d-@va_V%v_YZX9tY6+`>!f*0YpJVOKE2-Gfi2-0=? zPHkPg1@?@1#!RCgkf3S5v8hezTH$8CudeW<$0VQ3yjD-t@V0DZ^dqMNhfL=0etprN zH2$e66nc8D&Peg-9dH;+H=bQPaKV?bw1#TBSkKE3#sIp3>^qp7WnW!lwWrddd4N%~ z136{irqbcH0^x#C3S3-0R+`L^SPCg@a^>cJt^xrM(_~{HOay6?Z>*(Fg2718Y}Qq_ zb|c=$>6Hn@AS?q^VsI*R?QL$j?NWFk_gw_!9%<6#4^?vuhP~R^J9XW67;j#B;*`HV zi{HMRqxQ`pnGui;N;?otZ4}WI=&PlPYS}8w6L|yu`2OD6SXIg2#(>;^CJ`XtGp4|; zraH%Xp93u--CHm)$WqbbrMKupF=CVr&3{SZ+;BL<3@DP}ycfq!0Jr&d_H-n-x0;*8 z;h4MHEP|7*c1(_|sfF~7esmsxKtNg9i@_7Kf<9-~pG8?a6$5cOU8v`DU)_hpjGTdK zPNsdQ^2xIc}(+Yi$AEn8e8@#5+FiKY=JhqU(HPOvtrsLf0u6uYG zfFJEC?3}<_JwFN#800@UAgiK(-mR;=q@j-L;j?wi=OSK#U4S8bB=y&dmgG<2R7I;6 zR@W2+5y)yOxZ*}4ZXS&6U^PSOGt;^BN8KCas+wS)qf=+olZTta8pLhW*d&TO((ADq;pGcbzw{ zb%k4g?Bcl*pxdt10;f}}eHR_G`HY4DhfgCg);qMO)L`F%mB+ofD1O2sJ+ctRdT;~2 zjv_W>=$HK4F%o9$#ZY?Y!VDUcW4d9N7X8X{-vk zU1cZ@<$$oZ1K+2e>f&wA_FBy{VEX63s9+S%B!NZDf!t$nKhkICM6DqiPFz?RdMc2YQ zkw(PLnT96-6$P^UwnCeITr}w0mvN9KEB;+buwd+i5()>%gs=Mv@_VIqZq}u(r+G6H z{feuqssb|3g9KrsRXyhkZ}H7Z#J;f3!hj+*SyRQDS$W^$t;rZc^BQw#JZRj6={b?j zaH8`p??T05NHc;`+d%cv*1d3$!a&dVRoG(4vbYUhcMHb}9t1TMm-3S5rim&?=h{Uy z^A%&8-+Px0EnpOjE9fxkzui*~f7I<3R8~^xE2Tb`_4#`fk!~;M{k$Am&p;lqJ^;CY zZGO&viF!-MH)M}tYBItToc6WX$v$Ebs(odGCfOPCVR$)xa6lP1Rric`sws;wUA%Ey z*v$QNOHLNz|q!8^nVVcp`A;U`}hfYc|c91p*?ts2#4X^LI^*{9`#{t-swDEvPEh4w; z_O@Ch-^cFjMoqr!Q4ET+#T(xkh1=Jv=C{C}vxmnCvr@!Fr+gepnKM;O8?%n0#dIJ6Gmx6H5NbjX<4 z=_^z9c*e6+pw`0N4t-~au1ah;8uq{R^^e{!s!Km4WR{0ClmqvOh^nO|tqfcF5j02z z5yCe&O7+d4ddL7*Ek^ju*8)^H8eR`;*jjPW$J}{XBI?d?BP{ir8 zh%Ivn?0{PT zU@q$7QlALA7!i#Gcjy6|Hj~Z)N3ZcMX*)c#bTxTZ<@|@z)wKjCqaIkgRB7lprblNs z-gn^6ryGucMO)@SGJbkimOstHAH4hb&BAYz{nIS`t_1uYwEb(`{(rMg;r}@JXZdS; z#&74q@;7IMezh!!eE!+8uwynY2H7qC5HCJo@F10t7P)wsHy$2XP&uj{q$S?uQir>yN9^Lxnvb(c zOgkfQgR0`k_>F>CJX{@uw=UlT7i*#I_8lR(7OSr?MD-RJBPy3##qJnXmHrKGhi0rj z%T=L_DK|mCINZeHN5qAo;dW~cE)l%zotasuKwN;59Oi}}s~^Sl3vdY)x27?;Ve0^$V8P>Qhq@-O<&zs#tY%7Y+ZEemhSzUhcX@dLw>(9CU;I%yn zNq&u07<8>uj~xtWZf|YSrf{EN1h{bPYIeMYYiE;~))6Fb04Ry3zL0%B#AER%)7TZE zAYKFwG><)RAkuS+(AFIXN=p?my^q&caJ4NGk%f}afDfcwiH*1C6Fd3=GGjzbuzS)4 zbA=hyOAHaHQ85yMjPeQ|Q~_PDzy|^*KZ51bhgPAqIRxZ~4NPlQ@9)5;hEenhr{*|8 zA4v3DQZvS=zN_t{N+B@~uwC}8Gn~{MleM&JIQVENd_5lj%F~x9rznJR}BUc|* zSgPvFtCVHDWkY_EJA5&FxH>%v9}n}?zLHkK?S|rn0qf^{#Z-WuhcjC*1dzP)m!8B8 zh1ZSgg9piXkMK_lw%);mZlIF3?7?quAA7SBBWi0>X+07)0OVo=3G zUUT{wpEgae@6iSjKMOi23?+OpI2?wtqDXOoFotIq3??wSa!p&$uVl2!Xj)TnU=)xy zJLCthsy-72O`OPP9f4gsCPhZTCY8opIBQNlF()}_wrb2PFvE&f@}0Zv6L9k(Ybh>% zEyi(?mfj0jnclfWNuquu91l1u_9C|xudyhy6L7A-boF(R6;8SdEtAI>_b#p>mYglE zW7z17*L_su@|`Gs9(@oj9x(I+)#n0PV_0PnT~rAeX^J1~C=A3_1MT{uCQ)#;BV>Pt z-0Du`%q)~w;&F4l(1|SnXhU^A107O>o**fuCY4Nw0_i`OwuyiOcvbnu);W5jZhVVs zpeX5+287!ItiDk90Ia;+fLTo~D~KcsZ}^-5+fh72%-}o=7AXg5GBrY%$ecyNXF2pW z)OAOk+aF=RY+z+c_5&VK!kBJ%_-iEm;uhi#rA%ltJ;(~#dh5{S@=omG%Hk;^s?g@e zJ8$0G?AHbv%=z*pqj1JW<&bAtDwDk`D`^^M{_a?pKz&`6>N?mb`+MxkRUUY^thaol zlGOAGQk6hA;vbPTVD@(QV*?Vnc5d8F>eumfuQJWoNgK~i4lzpjv}sRvnYzHF?+|R} zs!Q2DFFb))Vozplce*g7?|^IpPWRdv&R{3c^6M~di(f@6?(ZwWAB)!@E9MS~>K@@L z=@6YBHuMdGFryglL)b>ov*tvN2eZJ`c$PLlOZH0?j^~Eg6|K*Xq679y?iFK)I6mm> zqP0@WWG`vY+i$6^n5R*8U?V><_cs`C>NPbI@L;a$y;Rr+fJS(Lz@UDo4Ch|rW%>CV zn)cJ-G^uttPI2O%PbIs|CW{i9aaFCfb4PhdYsh_KNt%%A2WsTtoY>beF>T`vU_H%U zwY4%3O1a&hz5(&u$GMQj_NS6pqv$MGYhI(V7ig|C$Z?cwTXnc5@ZkTFqH1fiy|poe z#g1Wt^*Q&W-c`1qR1lqW_RT&XhS1qitz{&PIUeS4Qhy3kyIw<8ZAF)LjSMG)CSP*4 zXm?M}#aa`Q)4+E=vyV#IT5jJ^T#V)+2FBEpVrX)tWf#XVnsidH}vuZ)_VXYYF>6}Uww2{!KM(xI#pwq_fN+TLjf zTOXgA6rbD;t0-q{2LmUnE~YlJ^`((YPpf<(LQnTC!zog(7 zSTp?z)-3;F=7{BYpWL5a>MXyT;QpbNzhvj{f%UJmf3WTU2U_`0V9oM}SNKa^oaJ{) z@E*)d@{RCKaa}X4}pJGhb=cO*A#Cbe83Xx(f1ybra^K%tPHxB5{ zfH%f`yL^N1izkpdM71iN^ET$5CDx##SRb9AGDON%JYFEU3VWt-f}@(3-x;!v%(`fV zeES;`Yc{EPO{9;9kKJ30%+v5i{y{_cTe$USE-T@-p!kbi6J2&Ph|diA3X_&F!OLGA zR%-KhK_^t0g+Vo&_T(H$f;RT0XSa~qmB!F&Xpcot)@Z+l-j$(f}zTAN1(L74YrT8S{w*SMSjbY^{HNq#asqoShGe zT*i|)mXG_()$^U^TL^B#+Z`09$0|}|2_z5FwbdHfc|^bth7SE?Xv;%(4I!0MVX4{} z{^qwzqzAV^dYKu26gn9LFnZrF)5V~uxZtihISc9Vg=DG0&Wh`q^?hVw$PzMYmOG_n zajGEz?Ck>^jFPmVL%5X0@>o2uV2`@jsM?`|wKOtgmqa-^Kq>RnInVFtI&Hk&U0oj= zbIk(z*L4Nk;A!*NaG)3gJC=*3n2lLbVW5aTISyp)5k{+`6Lr{v6s(y{l(5bha_IgF zwzI=CbC0ok(Ur^JDCaHZEsKO}Ln>FS0PTzVVq+@Z#^8A0O~|GWI%4Xb9jfUCB*{_O z`-ELQ8}T=?W}E|(+e1W9$gmT?(7}ly84O$7M|M1vrgKVg)Om`>v0-x$l_;(BSrGLK z)U0Gn<-3_TnsH`U_CSh{2h~@RdcsE^lX5?Zh8~G6iz~kONNl;?Rj)DAaJ#qN6GaD* zX{;T*$#}tCr|n|tC?lt&xdy71T$$#j4bw%L(4~PH5$V&V(WXG9liqG;8<^N_WWlLy z*vi_*y^bf5v3JyKrwZUgi}@hXlkBj z{qb@7_;`9rLw8u{C98Z{#!CuT7o}e!lCauQEgw*+YXYh$z-Om=#EN3G9-`&Z3oky> zV8)krQ5aM0dfI#hAoqJ45!P}9hz9!sRPFIEiMmo)uMfip=ryO4(f*x@Ag z2vNQ>3W^D3LzdeZxwB0WxYr`*Egd!As1hF@J4@YGcSXdG)s9V8M?=|O zdzF2H4BX zfIdlTbbDf@_#?if)+obzhCmW9bUfiyGNYY1t%|1G-|`C z3Ae>6g~>VU20mrn?Rsa!iFEb;h9o4@?gdb-4RO=|^&7dBC^H zH9y=c&PdQfozI=`e0E*vdLnv68FvR?(OfVI?m98&zF>?#{i_4+?L0wlZIagk!dp3o zwk`_Bx)2l*09UI`>J;St?c>OnNuWy0S4B=h?Dl}~as~FT3bqZy^P;E|b@=vTmN~>L z#em5t0Q71Ooy;-bL0?TL?HSVUD_>ymd-{UCmX(s`0`fC5r*Nt}xpn6Qq9f17!Kjas z+>AzS6l9tua;3!NkL~Z-gpCq`p+?%;pE&5W>@+avMrZ;s8HpmW!B zE^`MF1fBsiTrHBpX7Hv10 zkz?UPHD)xdPf9DWoy{7SJ#u8_LS2TZq%Vn-7crnRwR{d;&CA$3-n!zi!iY6_)0=?s zKcvdQ<6_Bug4f^zSr@`zvr$3!`VMP7GUWNM1pP|^f4KryMz%j%=UD!lLI0cL@V{{d zzZ=Z{bOpa7>%T$JEPv(o|Bfs8CnLc6*V6YNocuch_>V>)MO|@S3~qS)o&42W5E+4k zN^{E#2nC@GFLq@$KRl&&qsf$Tl8lis^7dq&di0PEzhVNIL*#V(``ZHRGsrexm;xH8 zcPuD=AiPj5FODDoGbR#N)*2iG6#tzmqXy3NYz_O}vl(0w9S$r$<&F`kc>7fT4|z0V zI57Ut^+3^6hP=LTCX%kGBw%!Juu~>RnUf(WdY0Vy{d;VWq_Y_pf|fotwmB0a2?dQf zmle8@^#W?(qA@-#j9QA%sS^ri$A5YTQp){I8+p1!L*DVY+k~KKP z8K)(H%UBraGQG;s9Fst~k=};;GHEhNvt=$J=iR5#Ss9>*% zHIw|PjgG3-EdhbeNEi=JoSNlh3vP8nAyau}DC$3otl0d*wARh-3l&`_Dus9W3iH$e zWDclYM0qf?^9}A;0TmaLu|XvjBe^q3DtOmXjKp z!23Y?``12?W@*&eveu?V_E*~jr~sH)*cOS%X6Ep+fv=PM)2^h{!&`!-?(c;SqlYl> z#i}rKWEQ$<=i$HrLi}iM{HMbB8$7$WbJwnZoP@TP0=!tEw~SnnI*yC<&OhO|j|P~B zrD;jb9o%BoHPR8}Gv(eQY=HU4MJ> zTZ+vaeG7_NA&bYL$`crbcj4mhY{3hmo_Q>i$Wtu=QaR1r;gCLLS)*bLAtx$=krczg zkQ}XezST0)E#;@7YER6-Gqts?5`Se_9?92=FgH#yHvNI6yQ!5eEuK|D&LKeE(uAiv zIM$o8%ATpE`)~jr(yz)!aJW+$?ETEybD~j#Opi>aM7mHxb0a~!QXY(03SH9xU9%;Z zu=A;ev|GYU**$-a#r~~o(jyp<0e1rji-m*QNyVPr;+0X{gjK04tbNWV{{HT`s3PM$?=8Nlaf1bY83t2x=_ttlT4j81cRZ=K5$lR-I`Zp1 z^8$s6gk8dE`?5Y#N5^s?^;|xV7G`U_)}3Zy^PZrIoSa#gbGgSmuhdXN=QK!KZk-os z{bAJJj{d*}i(}b%`tx$tCgLWsjOAEY{B+61sq|&a*;=uP09;azeEx}K zyh#5M5u-(ZrjD#~0lA$y+z($3)yW-Y^;f>HyU8X3uO##iI<1dDpMJn2-}{d%Pa0|n zYY#Oz5(|6S&RGNT#451nyJ@Pm@Fye?N4&&431IYa23+xa`#qJ+$SG|oIbx9KI&R|o zsNBRKt{U!{A;NyKh5g=@nJ}7d`-6D&IU(kgRd7LYs0S44G}wcfv+ZiM%Eo=0EJUHW zq0Y~RzoL3M-T*Yo@C5%xaQ?_ke_rcB_lMxH{x!P%TY|&-|DG)S^;Z9T82an%|6dr& z`qxtSZ}nmQV;b#0tVyd>8+BM0f$Q9(BFEOVF2UdB)~z`H&^;5dtgr(=vyr^XEx0;ZYy zLWsq?p#Hwxa-#_BCU#Nh50w7eelAKhoFZvGmd4M|v0-(-o`AM&loYF`Z`uIXV0u5d zs*9xHI;M;Gw{h}oCryrBHpJxT$=eMUWL}JyDdxRd z5w*mvF9K+Zs&q!7QsdtI?&Wd0*B)Dw6}mj6u%O*itN4CBz-;k8VA6P834&% zhZug*SXob;X9#Qkg@P86UY4$E{e0#<9E>=n#ViCcBfAoeW+^-WjisgQ@=a*$5xQSR z(SSY^TGTnK2iqx&BBDh~NQBtyF)TA|tsHzNH|l&vB-}#hsbdY!JSov2$_)gqF)rMs1l_5ZPIRJtx<(rWPFa=9F<93Qq*7G zDWP+bjzcvfIA^iQ)5Fy!A{dyC|02^Ec_8(ctgjwzcN@D~3p)1-pommZJebjjQle0k zCjZXl9H6t-m*%aqPKIE~e<8!|=3LaD!`7|J0ITj0%Pb+Y#_l*NI~i=<`fe3!6}7Zq z0*202&$n+y!%yoGoaU>*TCcq^?voG)KhEt>dviD z&a7&WB@__?(>S`%q?+ep zdXI|jn+!TAVms&|;I4`R#nse6<25TWh?cOq&iGXQ48i=K-;0CHn&6wJgcop8{M{8o zp@T3A@JGW-Uv36JTaAb5 zJP)&^;xLZM$sTT{ob8KYnkf(%=$PQV3iD#2k)=FmU>P+OVlXGYwx%o%ZO2B8yn2(; zV|{iIzHCdyZrr4R!I}2XCTOdZ?i(OYG-DsJO>2jw8j81#qd*Vm2t1*=C?7{KqXK=7 z=7_4Bg12}rQ+o+7=|l7$OurW-s`5NyAJ^y&h19mejF~w~Muo(Y7L4Ii^nf$8E!tf| zW(agufi>mm9k`q_mZ4i=-qv0=TJ>3^R7J5vHdBj5x;N_pFxkbrTsA#JWA<2w)mJ-> zM1q1Wz#Jo9T9Ik=G?i|b*WvK-Sjv*1@7Zp{T{ss3FGC{}3{gJYEP4%*3-J75s-GIs zMq9~QS8~inSgz>P1zhHB$tSXLuPL45}dv6mVCYs!_5WQ1K3i;u^6@3D_G46R0;DbaziNtZTdpF!$OFe4Z>ahAwkH z!h5-TAydd=xO|kiCtZgLFAYt{>=>|=k?|{jHeF}ji(|@*F6E=&G29F%!-$eOuhpx2<01~0gR7`3}gjI zp+Z03Qv~llNt#(}=YtAPNMK36=9@rfPU?8eU{iggT;h0+ZSY`b*7VawGLO3+bycij z7HwhZ4~$3rluG?hPG`W8!msgumX!8-wC<#Q^&=z=W@_|&`ng7K;HO1Q5QY&7inatR zXcUrSDVMnx$xut8PNnMe4Qm8ToN*b0D77XEu4=WhUI*+TE{K`IVaDZKvIB?^l* z)=Mw_*;`dboi9sh_ZD-^WVLG$4B$;1~lGQo(9uDsI zkZvb}UN=7>85DUlMu`+<(E0aMFRTlkg^)KK3S8?-I4O~+=`#u0mwpaN2TNm$yI@b{ zyDm35c_8r&@o#6&m8U+RrI#i}kAPv@MMCua_ z_z_1RG!Qfr&tT|?hhp934MN&<2(PkXgX6Tk9=uMaB6HYkHGJ{x{ z-NBFwvDFEsqzw)ssnr)1h)SpRqZZEgUtCnyCl+o^VfL14$EWQ}kSp1pz~@J`)WKKq*&C%=J!hZj zXGtEsT5Ab2(!xe-6e+7JW(l?u8^{Vx_-ii%OtiJhgQ4Ko&TUsy>8E$LhCp}bxK@U9 zu`p*$wC}!Zpurj9jvexqa?V}z(kM!*SFsoa$-!DusdUO^2HXJPI@GV(t=@+;%tXm| zJ}E7GP)ibyF2R}5hLQnYX3?P+oujIWtL^s!qx5O7x3tTFPEgoL_u!c*u?`7PYuCZtn5aU-5a7spw6w`@T zij;V@8-KQZ?aW;)ON1fF<1ds+9;UNEr=RVf4!TiYE8?yPo`vOyj4f!=>unAeg%zHm zB~D2p`#pm5pVXx?RoZrs<>ykZS7b->bO21z zg_J_eCTVwVrga@4kOnF7^HWNsqy_DBpY1qf^#*Pk?A58>27~8aNtmOoT_{gK)axub zE)SCs7T`nQy{SV$GC&_eh~^wjPr5u~KxIux`Y3@*{77vi_A6w8} zoD(;_jn=3*P%WKbOj+n$rFO!Dmam^-zkh^Y!%PcUetiSaZoi~*kU12bZg%fFdiv4( z1?+|@(!H&_5ZDui{d0ApSQ6Z3zDN@^m$te5f`I)d#f_7fHS`^qz^C|A*Czf(mIW)Q zL3&jQ$i!!-q+1qbIbt}+EC_0)0Iih+ji1w8Z*taFcDQQ@fZZ(5vE#Rho>}kg{p9<3 zQqC;uRcEz=t@e){a-ua~BrH~qNZiu(SPcdqB@A;lwM_QOx)PCN8a_Vs%b^Vg4B#Ihmh<#jnDMd9UZ9w7eT_J=;dn5QKUu8%w;7-3cL5{ zoyP^GmRAORu0YZll2ef|1!FvZ(7?^&XCi℞p7RN<%OvDd>ug64DV9OBt7d-FbLE zw?Y&S6gTLqXa=&6JgOegCy>|1s2rQBWy5PttB6_M0&i;C(TIsFP?6hP-NqTb?7ayv z%MvnX*^M7h(LR+NUxYsws-0+ts1+&Fq|m`D-;ri?qf9gWe|USRFu}HMOE+xWwr$%H z8MbZP%&=`E!*+&k+qR9$yKC)p*1hM{SL>l}J%WYO zhRvwOOZ;_1cWerEzoknD#nhQq{oZGVF0nvVXI7Zg)uK9n~NYgZdYjW~9ng zCbR3zqmIyN1x|AH7~Lgla>O*k*=q1BG;vs@HcG+5=8=J5@mx&!v|*Kk!?$s}#Pl><_y4z2f@Bmx{r0=y=3+=gzfrdiatwy9^P`=%bXEEbVCz>R; zg79UYlzvOOB+i!OFeYT;$45}r+;q8$wo0W@Uv~Q`G*zHC-s8etd-UEs2^M{ zDj#62+v@V%wK2F1Qd=vtAKd;+5YA(_)!<{J?kYJ%SM@WVAE&6S9FplImOOeqwF6Rc1qAG zcyQSXXqdB6TeiPj+uj)!BCY~|Q6mr_tLxK)TzgjyK{PXUcW+TWUN)k&etTFw9|QME&g(rbp|}i{nKv{uG|J7l%$Wrz^4)Ae_=n?S+5f9z@^?=9x0w7x?@LqKpPdkFf8vZDsi!uv@?1sF#@n?c zSv3+3Xj2S3AoLknXdOx%jHA;=Lz z3_wy*JKr&6g$3-}g4rqf1IB;vrb?>>rQNcZdg%KaTGsBX89aUIKgj7v!SdY9xKZ^GJzG=U@sMID5@E#B ze0E+}l4D)fgh-S@*HSO@?DQzafkn-Jq~I`8Y+;~7hh-H}e2S{x`JsxlpI<#^kX$i~ zX5!AOtB@rwEO^)#fY9a+t&LSe%BU?#MAKm0Ng;bqUp&X^L{I;s_dycFLuAs`>9)eW zxMG(TKG?OsCAaoYGQ_azOpZm%H)=F(`B2yJk zX(Ldbj4IyYUNn)>eU!}VHOXS;V)gko8$UMBgGuGa??%o+LqSXM0vI<~u6Ct2J)*<# zHmBLZr|LcuGiJJYYi;IY$yy(CD&9@t{EGv<^0wZv=FRAeH(1UMb`0zuMKd*av&%7^J#_7mX6CIVg3d&ugI;|wS%7*VrVv$1xZ&6Q2%`y9g?i<->GMdbjTbD(Sr}!~35s9x{tk!3m zLDv9fFTc+T+<9t1b{Pm$wJM!#$SXaJ%O=Ua;xytSlb_?bKJBCO*P1zLBsq4kOZl0L zBn)SPj*tTe>|@Q()$^8jI^G%AO{`-WK5CFKL1g)I9n^2@wDgsW8~V!Dk-LO3AVwW-V`u! z0!Ic{N^IlLS%?x33&4Hf22UKZgp^lTlH zml7cyGQ7o_H$wGY;?3{EZ`I_yNW=$}lZJ=w-P%nl!Sf}uMf{5b(tU^0O@Z8qC7;Zqh@y0X#A$$1lnmgi#Sj|rnGh&~@Qp@|DhZrSFw4WrdKc-ZfhcMF@A zTij&GQO#A%jcP7E(Y#gEvb>8e88z?q`N^1n%xU9srC@5G!5(G2A4$hTEXmqvDS82@K?Q{P#}$1cDNM<|)M@%y;mJ2b0re1jU5D z-)2(o8@VA4-`nR`W6+KXCXAHWcTb@t>&LqNZWzIk;okg2?64m9RxJ0D0=8Epq9=L@ znbQZU*a+7LK^yDkyo6kmdv*V~0wtTQmPlc8` zNiMn%tu&bpMlT2LJCcTwJj9io7(0s|i(8;S(*+=~Brx9P2)5V|o`t2ymp5!}>B9~> z%XWBGC_Wf18{S$LqSn5-ly#TAi!J7NAKcn@0$myxFlMsF&<1!qVR?Z z1E-FmeGrDUCTZD|e?4CydC{MtB8KwXO$Kb0u5LHX?6;PJP>G4k&NMA2#5&{f~6C4M5^3Y;VAjT`8e+R0$IO|CTAd+MJ%ffjI zjMeD;Ge%D0HED64f=UTQnGH)BQWdH!M?Ag{LzsBKI5SyJ@Y|v}A)|j0dDg<*Bi_LL zej2>MuaUKY1GeF(6N*#Ic=#$rTkz$RPd9Of)DIMl+=gkBO&g%K5!DA(^Rd}PO)Z9I>)A;IEtcpQWXAdyBEmkqFWW^3Rpt6SEetkB2!fVS4D z9t=v6I`I?XeFjvwxrN8Pp7e`P7K-^yUi(RKoS=q#Ky5l6t8y9d$m#Y!%X|;Qj1+b` zo{@b9ddU;SC0WS)YC=(#R?gZg9;W>;Ht%ktaK3 z4H%8Ut1$mmi{?hMG;QUyAqvh8TB&3SBGYz@hH0Kiz$QLt?V+v!>@+>v_@tFgZ~!}K zA^gl!;VOI{P?7T)a6N3{RH>ez7D{eJ4f1W{bXkL+BN-eyQpK0jq-7Vs=`xoUJR;um zx@0M`8kJ2QI{YI$R2Gx4I4g2gTQsA?{>uxqMI{%1cF(l4R()-m|CvKget%7qPYyyu zDKj|4e3Q!|2>ms-TUKDM7rV`$->DrRqNgt+{D#uF$b5rR9(y~}<_Xfi)MfEuEEX|u ziP(wADE>I5@yksIo$~cA=??mnMWBaDyd+^$86@l#4ea$e^N3MK(ElaRacXvk^{06z zs5;U{ch`!pd?~czzzb@aYA1c{R-znDKLZTHyOLfOP5s^Y7er%lxBFf`HH^~0{Q|mK z&|}01rQP0|D4?UV>W;pb$mqM92Dxn$gA^h?FroD?-sCLPBLf@)(`sX_dR{HBmFkl2 zWNAcpCCgnleXI7<9GdoJv-MrI`O=`L!b-OyYb1j166K%~wzLb8HIhjNO|57X8&WOd z!8@8(3;)%uwOE+yYCdAS3`5ngW%5#J^J=P+-l^rCGaK0^=BO*UymfXGaN)B7|9Su? zgZ^yZb)l&ak+k;|OR#x&jV=yLoDMLJ&`vznrPH6aF1cQmEQsvzjET*1@)xYr%gFaI z_b1>TxpJt;hW9-$74;(|AGdzE#;-yDRbu}2wEhcanE!K2FX!J2NB<4V{8x$L{L6mu z9}@GgXZ)X`%)ie5-$WVCf6MCMZ2X*mvDiPTi~T0iVX1tZfSUhxvEiBk(OS$tEd|Nd~9;lJcO31WeOT$PumKAtwotmzXnlJwqR?)wbC*_Zhxd}%uSqip5IfRj-+q~?9ki7(<15fiUX%%KgH3ebNQoFJ=h@r9k z{dt>J!bRPgq)j8~F*EPp_f!3vJ~6tWhe*qMD0|RFa)ll#0=C3@q%fkkX>FyltD)9| zqX}&vEokR3>97Rj&+^ndoQB69ET>14rUoFa<9O1%>+fceB%UVcNLG14ABi$y{o!pc zYVse(KdSNYHCJo$3oZ~zcQ684bTf2XE_aCIFooH%O67I5qj36vd| z5*)+LKaXx-pq-}GQCd3xoV;Z8bDv!Hf}$X|Ro!w$Jf!Y80mN@_d7~_I;D!8P|53-Q&5%=wx& zUKzXc=;6Q$ao}Lhu*+Rsq(vNC`?V266yZHi!?2wrXZS2LR*dH&7xp7T@fohtMwqwsxZ@jeFBxw4IZl^d5P0QxtPx-+07G=)J?5cNJe&qM@X<#d<{Qp#?bF+pCGw z#DjTRq*0-JQ>tg|m&3CB=RyH}=8xQ+`@`w-cZ)2I12?ev>$HuTqdBn{CjQL!CNZ{i zT-_f&0lg8+oIV$OH3|?tMXtcjvIUHO~9+7*W_;| z3)Tvo^)DW}Z4(Hjgm$yj{pNit-SiD22)EAZpS*`~?p!4c`2o0G8HuiM*00S4;AFkl#gp0+6UjA6@g13%FUYr4=94<}YpkIR5z-4A+i za|CBvT@;GfA86w~7bg~xJNZl_MrEQnrcBu1?K+U3~#B}RYdWpF@YfhZg! zj6;z@<2nN{n3v2?Sm{x*XF% z&*BW?-ygMEX+JqR%SxYX6=HSnZS-Ikfs9o)&J-sNl+Kz1N~&Di8cCO!N3{}=NQv8W z#{#d9rC}YNeiiFvK${$C>TA_wJfjMLrO`R0W*iwXGk1{bjCBzAy^MuY$_*{m9~Pyt zr8pPktyfsfKx%`=Vx(}GG&@ngEcnw59Ss{_93R&7BuBZp@g&=VD6O@~sL=jeM4&Qs zE%XCirq!1HZ!Y$~Z6|E3|53hXWcd3`!#}#%j0}G@6aVvO|5a)D2RHkF9{&I1x9^`^ zZAON_|Kk32w;37!`iuRa-;4xI?5yl;1oZ#AyWZI8;f+1`$w@oRIjt-W}$P1Ax@ zW65B=nMS;Mxy6Y*E)xSOK>$t&E-(=QG5`oNz%iwRvO{M|JjU>7yuAJtQHbMK)2TWYfQ~< z;uAoR69%A>7DF4^H?M0ma6K1L;10d2)BTn8yVVaLU_laKCLoet!|#XM85|mbDL+8N zmPV)fm(b0;FblxFUH|rMBZeLWT?qo8A8xKVI=xOJc1RDTJKh}b@ZP)dUc+0cTVF& zg!T!EL=6?W6G2)kHl50_sj20H!$!;I&1nCLn76dCO6BJ2X!r7be;ba$<~P_Y8dd69 zaO(Mn_dAw*|90hX0wb{Gf!Ik6YXx5c#CS#ah239PlOp%U|6SV2aR-Pvz<#Z&Ct*Pk z2>H?rW>0?<0lT9#1F=B>_yw|l^J;qo_rjY7aO4lHkK>N?6i}s)L=kvciz>2PBZzzg z2p^bwL%tM*`m&{K&y8?X>dSWr)x89g10uYm)e{I{4%%?jvH^32%?W@9q!(x>)*R~% zdbi{0J^W7W2cj{N%nl6Vj?ll|hEf@9(P(PSY~DZJf&PKx4W&bD(*ubm0O=eQ*=tyf zqYYKvf87PK1^zq4mnVZ|WcTTW*b_sCT|;)gXNOOV{HnM4m^CoX9JjW$OjLU<_Ryu{}S zr1x*oLb9M+eY&p!M|)Jf(XJf=cWArc!}78{WE{BF!I?X%?hr0Wt_dY%(b|z-qxzj% zw``ct-%K0x>peOc{lh);?p~-LV8qixh%R}uCmaT(#*S319FC78G4ZKlz9E!CfXqXF zJX>V`topbsK(+&)UBDNhHU997RbOCZaiKWQ`+OInxji+A0;)*^+fQV5fh$rM1c0x? zcgPjdYn40|IJj-@2i5T{VqYQRu>jF^^8P?u8Mn-9y~_41&(v;J+#y{}H|WD}J?-i8!t3^AT;Se-+vD7CNJatw+TH1uIM7E-(Z{|rL%#?$ z+I8o^lJ#2!F|!{#0?p~d6E|)#PW#y zNkUS1>z*0j@@fvK8I_WEc=GPos-F^d5BldT{%Ew&|lz<1AQuVvsm+%J)*EwnS? z1JompM+lGfJM|-F?@u&Ac1HgFNkqHgW`Dccsma6q1L6(L(2Lp5Yr}vSpnB|;*mgj4 z8T>frQvHeSLM&w+ARjdTkOXhwYcrr7{=V#x7Vg%Adk2~k#6c@cWCS814iwl2-`2T9 zM;2ViC$J~#baEcfA9_FXwQAv#@vVmsRgaj4r@y%r37FQ<~(?$dL};OcI6zou8g zQn##Cro9%z4R{}K&fw;5w!Lnvnc4NuUKQ_s`|a|jQgjrbP9!EUv4O&Gck+{r-v)Ky z_zT>gu6KrR({eQ{RbAo(o=5Z>oF-?LIkve36LQN}!8*_b&~89=PNk$OpRI3g4Bd}e z8ZWD-YowOny|P0gdwrRq#`e2BO{{)bmDvLytK73ZkC;mfaxE)e^FD*eIrF83RXLf{ z?oQ+pk5hV$P3Xc-N`8mVIi76arrvB{8w_8X&Yu?=+`Eqr)Y&s{x|oARb>dx2b{6jB z)UFYcEp*vojNr!;o}sC)cn-eL7uot_m1dpwYTS~`SNGO9#QF+P#oTkaXAV(2tLmIz zuU^ULzqjmWuDEY7`C|BwQRozW5;)M@oXp$03QEy1+VS@zd&wyl4Pw;7YK zv)WNF2l6*1MmQL{pR)rXOX2XjJ|({{QnzC~!zyG_amqV@`2JoS;*#o7y}+{`hN#4E zcO~XXnS<@ctjCXgPzO4pbfgg^$XT2{T3wTm& z8^9gzXxHANQr~|eRR|I$?=BqjYcc!za$*d_3?FzgqIM%~$;hDpzDNq*+0&k0!H6Mr z<)4|#`GFV#xj>N0j^U|-5t!*##qn5VXqCe6z0xm#rm-;T!-&|J`rEu_JYLaASg9Lt zJX@~u)EpRPAL&P1Xb57=by5Ro8*>W|;wg=tS;4NhcvI>w2f zGyjXyOt=rYEa`mh_5hOk_$c?<95O{kIe~VX*J++oZIJ8RW$q$tBUOi9EzM0CrII)U z+~_f+#lnuX9YGCj>Bx&x_)Jdr1Q+VlLfj7;fYEkyV8Pe=g*|Utn;44E8$7!yY|FXMk^5xsS*Q;g>XZ0SF=WX! zjKXY^XtF-b`t?oQoDa--yT`Q);hCGtn=U9}SsHw`@^?^kyB5?)1UF#(9_$V5m)ob3 zKrQj}%B=OHl46efobRcU+|`!n%4wO;sNZ)>277<@>i$+(Y5Zazb3HuR9}9DXGRg@A zY?X0R5=6d|$G?gNj!NvO2}Fxo+V$(x&!^>@s%Yr2&&Bx+&DH3XOI<1rXQuMu(&g)r zzarXcqzeG_H{T%T+EO;JcXU9ZZ{1*{KFehBy>nq6Ub((rUtxOW{pzK??gJfb3Bpc& z1`i&uc|oA_&+kImqMYy)d&NJb+-RAkkSJ6C6T~WPFM^kNP2iqLE{714V*Ol78&mtG z1a5wfp+!B+9X{o4Cr-a@b%v^m1J}}|%5y^JtgZz==ks}Pds|eWn?jbuqrj&?XCcDl zUtacA?mdhPa7iw`F-%Tvm;4fY3whLW?ogy?P9cAKcL`@pIXg6EHgF5;E!x(9b4N zouH3|%uA~V8t|HsBT7Beio*8bDP)&z;%)Q-u0$!?+<0p!FY+OxN3t0--aL1t-k9$T zU<9MCD(@8%jI1M8EL~J(GDR+L%3;&0^$aVk$&;?G2Rvu_%$b*S-HAA_C~jguy|=NaBegOv+x*PU^rQFDupfyW;MPaGtfR=JbLz>Y3!GirB3|RFruT+nQxj zZ9g?XHuFj%ZHW5^=q&M;^aSn0a6F)VZ9X;xaX|3>rvZO}W0e<#r}doRK`9=EX_GY$ zvIVD^^}o@6AQZTT2(R`Jhqc*-3BKEN<4G@jwqb%qC6FJ*rKRcZ85S8ko?`>r7l=uK z+eg;#r1VHw>QP#I;r1Dv5xI4wlfa zcMK`vS+g&nc^W{z6cX8bE&YYwq*LwfdUHm5tiy@aU+uKXZyRQM_zVBzI=7i(A?^2X zO}<8@)%%O_TKt0CR26N9O38t;`vB<5xUQfWY#a$k7S6ajZ^CT64M8w&L?oNc_EmYpFLtc#LaO!k544c-!jkx_nMJ3tLxqH#bQ{e)IDvY-k8DT zA9nM`l#jO<9s@)=z1LFdpzh~4E1SqF;rJ;OcI6(VVc7I3n?8yGn-F3VS`8GDa&`h! zd9)#^VUb=|02PLt1}_yUBLjkjcv?q7XdZ( zh)DFa@Bg*aH|%%Q)7NMD6lu2o``h3U_i${&y6`SFf;WTr&do4RGs5Vh<6utx+JmK_ zu-ZI*N61J^|`66m)4!fR$!qI!tAa!e)DIyhDo77z{N$(O+eT zgI+AfAYd8VuWuzop{-(16@gsHpc@O;fCyBY=Rv%e>~@qe-iCMfC;9p7;B?t37BHkS z8=l+pUVFzARvOivH8>rP0SND_XXt7)nV!TV-s78Ubb7o^u5>=vTf=nO{H#hcXeriy zlCRFzu(`ip^lc~j!x*lK^?{bh^IbrSWVjMUgCPan(Jk%Lg2mf#?U&FdS}+U7K<(>1($cfz+wP-$?3 zoFD2(`K%lZcc%KO52=O|&$cikH__BT6CTTvJ63Gu0!mJNraL#iW9dkL0O~TouNZI- z!CHx#HgF~uG$NYs*B#YWH(4ePIX~%p#C`k-goGv}qyPc2jwBh9H?Tn;n0d>{%x2N{M*;S!hq^?gVpX60O{8{WD29gjgs0-XKbg;_+36P3u#*QjTrsV6R9QcQ9MSgEZQHian|VK9(u(|RC~#*Sq?Mq>QRgj zi=%7?ZOzBV4%u{|YYb7W64LHt`mtr-6Er*Dv#;eh>SaCHTWO}hq8Se^t0%ErmIz*? zwwGNeMuCtoMj*6t*XkY3AR~q)h$5owU6HbzVO9O(Q-~3$QoB;pK9evsWC*T+id9h? znW(hCWKX>F;SriUd0Tketu}qFw$$!|OkT@#Y{3SfPi_8v1^9JG)~%)s#BmIf18!~S z!7-fV_F`8T<-ri*zHgo!dw6sQQDrcUUR51b_6K*rs5vnnfzU$~dyR zxVpGodinS&`g!4TahecpM0$jDA^E^$NO1nJdVC|*YiYoi%&wr?Z5w%A_=50RaT@Zs zw6}C9lJUa41cIj`{&Pm>EYd1b@}5)KedqD*@nLF$bb0Ys@y8s`^5g+2yr^c@TCctr zg$O2I1*=AiXpZo>z+FCxlp$FHZ1j}LSJy;+Y6HWsJ4GYlqv8OA#ZiT4RMhk8U??p3 z#bsk4pkw{IoVilWWQ|%s19&d%09NbXCvu~n95L7}PM~J75lFU4q-;|Pm4jNrAvDSe zm3kERU)^qa?-v=0Ll*~*iML90SW6QXA1XXf7t4jcy|6VCX%C-=;{`UUHQ60k@2Ql2 z6VdPH!%wM4>~`*ZQ`?uHqk1K5zV!7LTX&P}Y`m<8L-@!xr{UxDt-h0O$9C8AEz?>~ zn={jN9o~6$X8ZSQ+phZ4@YOlne7}f-s)(-jqf;*)ry(jI zs~+v1Y@W8KH!nNJzd@ew4>CuIH{y#p``vl*?1*Fp0-4;6@S1uD$n^9>kLpa}?-e5M z(#mLipsFg+Q`xK~%P>l7ejJKLxr$WGI*>v3k5;73 zp;eAWIa~~%Cc>y%;uO9*C-+d?9DkAis?G9a?iZ)SMqlUxa#-kd{t{&8SH=K$oVV#R?l%#M$$Qu{ zRgI2^wERZ;&CA&v+NT%R_65t=XX&+YSm-`6v0n%~lDv_JeUR8{tR=>p=02PI;?Kq* z>#}@`hUI-96%Nh}nBCB}`Kz|Gg+NQ35+(qyd5z!IrEJS&W|m%f7jX@%TT?&=me5cZ|TH- zgSWZ(Cp|=M;d7^F)*yms018^_v!@h7VH7+BV1Pp6OFy(+v;=Wk0CEI%GhU@mvNfVp zJM%V~>%2eQHCPjB`&4BX!F$AGm&(QmvuY84@zh@rv=ntmv28=kqwIuxC0`qCqJj8( zf{cRz8C+PV9*{#o_j*9mTQsb2=#8MuAyP7xQzMDimr;jE?Vi4!US)=7j?zxRUOdZe zGy6^7@m?LxOzysizmIaux@BB9Zj5f?xAWs%vbkg;PBL)qxV918x!;VRhZM!Wl*im_ z$nZG{(eHq(_tDYcApm6NxWpOsN6D#K^|RM|`pkv$m)|4N@s2|zVS4I#;+{eZgXL+q zm_f*;Mpx3*!XP%ML5f}I*A*Ivg4eYy#)b(Kpo!EEd)T#I{Gb(vTn|O68A4b&r%>IL zfNl6u1B}nBNnHGzI#?jiYud{&Q6VW=*1Rxe8nb4f*O*Q{s||@iL3&|j;A7^GFpLL^ zg9v883TF{lub}XV|HPCP*J|`aZPI%%dcTthS$3fHKK`9Gzf&tq@5f21-2dFq!BiM} zw|nS8S#QvlxjufgY$(2t=-|2X&50^QG4+7vkal zQ`&>ldMbPoo3l`!8KWve%#{aytWAL@PXK8NM2c11oVY-UvSF+_56%#v`_A^Ej|zXR zJ{$vB7{i1*ITawzw_^D@JSOzDF~|Z23x{r+&=MZkdhZRo-Hn|eV=6|&x*==bA$!n_CJrT065=35Vdhgk{u?8M7fB+g zMN7GLiC|%UIupZ~aTb(Zaxu~tL@yX{z5oXShy*U?zEPBjh%@Mj=WPsB9#Edon^Ig^ zzW5R{^mrH@q@F!^7W}aFI?_b$%ekkK1FXZjRC@doU%^DDJg2K5<$_`~E7ir zgahSeexfpjD=`4XfxMQ;V3>pY2*4c;tVKG4c0t9(0BPu%Xf-0IE9j@CK`r{`y za~qASszXW+y(jOeIbCXmEwUeJK_!QVw+6`op$MOrU3!Y*qpFY2VlS>jI>fs2mAR-_ zc~9A`C$*o9iY5Yks0yoUvZf!AQ9YTF#b|~?vYMERE^EbI1+SLJC;Q@}GnNE-iel-a zV2+{@QQZf$mCZ!bQT?UPxgKX(C%n}kUXh87cC8Y6gWSS0S(i_G-ujx)5w@@NPu3u* zlho+TGBJNbsz|(2jN3R73gZ~!X@0jHrMp?3M@bc+$ zFh=sW77|@b|M_#@J6}Y^q-%lV+#zr}9>Jp*UFK)P&aYmtc=8eTvGH_?gt|1V!aDVt zQ+>>&3P?~)IT=rnsGFQd$%^`HG?6mx5>J{!xG1s)j)A6jRzzIc%L>XF=AB-;FcpqM zA1+2s6Ltd~NMI%H#po2HMOE#^#ij~x^Ut)q?9CVT-6m;nOi4p7dKJ}PE%9}7wJPgj zy6_*}cv}S%8k9y;^ACLOSVl(Ra17FNWj#g26Hu2FG5x_vlBdI4^8%Mp#Oix73o(Qq93Da3IwSm(~XpjlJ8krV&n&G~& zUl9@u=WLk>$qo%PL6@`lKS6wZh+R{+OAl*VBFfM#ZhHJnE$hT-k&o>So}3xc%WNYO z+X0FQ)aF_>rNt`Rl9fOldY?`8mg`a6@ zo$Tn#1w92$ox*B~@ek;w1H*c>-(`~biPxM6X z!1h+neRjVG#ezSBZr}XIbLVv*@FQ`bct-!$3(O_wuXz>Y%5i4Jkoq!|6%HK$hFeLj z6A;$#tf3Y-PiV&?@7}4*cRezYWlC=ZRqXc9WzMv+DaYcMdcEcBPN8D`4i7Ji_(0k|RMK*~`o1-n*D&3A);F{doaXKu#gRpN&i z<{Xl4h%KcPROY919eM7{-3;wPr`@E`hUDw`*%@$0J1>2Uby$H{8KxI?>Qzm;RDIHO zmv`Q+oZjKHNUxR9Nphk^r`)YZx4mYDU=+-3d^y=eK19({X}dTqcDaO&^<9;qh3-NB zytUIc{{GV~R?SUQ`{l>xu1g05^R8nY*-%4&{BGUA4a`k2uM$tNIOs%8cobCHSd7Yi z5!OR^1?ljUmWhNcXO>N+xF|Wqy}=}p)e@#lRmMq7$9>mKyPsTtAM$h-+fYLFWkF)N zL>AFZmd{wM+^YU&syhv%wMmLMp}v4d(9|_+>!+mf?96%Y?(davGOL*e&!GIJqx;uK zn#@MfpnyDid4M&M_b4zP5`uQfu<1j15u>EU_)nppbOy4@Y7l(c;4~2$!5w;t7fQZ^ z{lqMl#pql8vSub*TEdEGt$B=<9USf<-2R-2I-@F$FBiP~$c{dS;xky3$zlnd`X6aZ zX^JLGJ1k5zAM&D*qUMWzY`s1%e%C5DbnYN{!OzuK7uwOlQA>9Yer?+5y7|F|C9C{o z2dFw+rvv~?ilo=0Ni1hO|r3pJ?Mr!l>`WMv0BsEm5_z`OP9^0EVPy= zUHKq-()Ho?Lc-!v`pz-9)XA|1{xKH!ro&>mJd3y7<$HmHGUIi>63_863KelQDh|Y1 z)%P%eIs~ZV=tnzFQHl_R4&>U}g`p!%c^aU8^dBY;BnDw&o!G#}P6`#GOOlg5JnVZ2 z(n}6;uFH2y(s8_s!$PW1BIlvLQ>$4vvGP@Fo${?*fnj-#U$!0X(yo*}XWOx7q) zU;efA6GKon_%o(<-Q>_bJMWDUVJOMRi$Gb9kD2A}aGhQV+`0Q@{8?A=E8qKRj(&#C zJ^v2v&xmpu>zLLUbnSN&uNOR(@K^)5Tel|!TcH}Yhm^Ja=&2?SDmeJz*YXSdr+LkD zG(i36n|?%Hbi>PDp@Xu>jikja8syL=2(57-=BImmY|2J3n)V>+5Kr{|p|_HEu)GS6 zq)ri*4k>ae%5bfz6(=hQ#)P4oO)FPsQpH+B9=kpRpmCJoC<23g*hr)s*>7Ji03Jr% z9L7Wj*EP>{6X6F?|NMTSg%UCqPT)lX+;dzUFV?89DEB-RDiE26qRyISHLMgb z(YYPvvItfUQt@z8q^K`Y_;d1*(B%q)^i(?ypeSrexy<-ylf@46JyB_0^|GbGNyII7 zlc)J4D1V#L94qtwSV?b63~E`e)lGx2e4qG!qGobegc&QFN7#&Dxz#o^ZUKAY%;8|@ zmh8Zqbh|nw@8^jR{QaTdv84+miv;C3bu(PRDRC}xzj}410HCSKC{^{cp2dpgisgsX z!#xIXPI^@?o-i0MZpRP5LJOx0;!iKec1c)CnP}|8RTt?qh0Uk6DETg=J@zqXZS=M{ zs}5uN0U6H(7!xShzzJjZw%%n9kkk>h9V;e>H+7QTLTFw5*qY1R_rPwA#*F@Y6mM<1 z$K?fy2np0oQ_;{Jm1#h_VZ!Q_EZ&c;p3vPwysIw2sOtgP{+xY0-Z#Os>sPnX8p*0$1YcsrqS-t4!ccOKFa-jCXGJ?v=#F`k6I zLE3VvOYUtBz7bHXyB<0NdIJ;{&WI4CWj6jeW ze{0z04i+6I92Y;ylGqqhiLTzF;ifK0-TeTAalI9$zB7u)Up?iV8iUWz+Ti9{kL|5J z7id$N3J%7>I@N4->jITyFu>}JbnqD3eiC7(x=*n?YIV3MuZ>wzIz$c6-?=l8YWWjk z-c46N5E}o7$8xOAoIK067*NZ&Q|bM@H*mmeuNUky82&9U{tMl}&`DZ;xGmGe3~wmr z2hw&zPr}ZAz;KY*MMr?hfDa;^7tvAVg1?=>m&)~;02riN>pxgQSGpG#bc{V z7@45rXl>qEsK^IRSczrFjUMR`c6RH6H%d!N-&-t!5Ub##wE365-6dykZd!b1JrbS< zce7D;z0zt|b)gw-A79x(V+~c!8sG8m@D#s)7Js&F9LfB}Cs^K7%oO60>!w_Sr)OQ*RtX8qr#2CNze{>{`JK+r~1+qSEp+Yv4K2?GtBth%BfMW zde7Wbp^}z_5oMQb11K_T@@^MG+&PV9`WUV7Yinn`$grnk-o*n zZMpuf?vmn<{As>CEYH^KRdDqYxL(P6N*>Zi%HRV8khEiET}ZQ7BetEc!+<;g{nvY=% znCurs6>>;tStm8fP70v~oAK~ZJ-N=o^_V6y68VSW`wTmAhi9EmDJjq(>DMmN4p{Ld z_1@k$17vpvT3(chMw2n#k~O{R?EQZNu{qHk{e$4_FoF$)^m;rSHMX_+J8liHk+wCj zxwdt7=vpW1qrE_Qfbdx_Yk4MlvAmSmU|su0^q1bb(pT8ZYVs z>xy|?9C#VhhAnAsUlP#U#)&kPhgw`VnX`^upBxU=zrJGFA^hgK0M7(~){B2MnCUFX zWc7-q6~2j`hN3>UbaG3ZLmuxetyJ`GRIbaw=ZrjC`WAX=z_ttkX#SNPzFIJZoGh91 z-CW41lw^*>mnJPE$-Sx#NvaB)HA+4c<8h#zA!U?R5+R9qh!aRQzyT-9zOl+W!(m&*s6i`FH|04*PUgEhVmG#_EPhUrjk$X2iN3qQd3oi}eUjYiQti!? zk(A&fTHdxL6$dEZb1DMIHzb{qeNgV%T`h+Wy#RjqT1JRKhJnuwCjQd1tcmXwXB^#Z zrgfQ+)VRxC`08B+OK8?D7r}MOHL#Fn*%TV+iPn^&$SMQ7y>(_|g&$b`gRM;2J4r6G zT~k1ra$=$6j;dI}*2Z!Hm;(o{f*uDvMNz$5DJ>$ouzA~Fpeqll0SN<*AYW7f6>G0{ z_&HaEhdNf@zwnt8^tg?=I`l60O1lGqHv3YV>!JDiJD~;B(#Pi}(rL~|I%&HHd%aYa z)-HGTPa@Q}jWZN%zJnCY(9;)!ZHUpfo{$t$Z-(Wk19%NisJGRGiL{owjNU=GUg3r! zpSNx{V~T(`%?EIr+SV1+{~+(3zcY)TJ>iaxj&0kvZQHh;bnK*K+qP}nM#r|3Nq=?k zyz{O*f57}u&#Br~yEfLTv!1o_sYQ1SYfy>F!9sd&+=?kyF8r8E{ctI`ZNk{*7Mn2q z;33GirNhS-^fZ~ZJbC)?>Xy=$;}b;gSvf2R7lKPk4FJd&Z-Al6H8ePEWW>>h>EAdj zJKe@jwCG}PalL`hfbXowKoAw4mUY8mF`mKW{e!)AM-gG_)MX12SZm`NIVVeilS}70 zr|WIsJJ>Q=(F46b6vqjl?ZMoPc*`Tdk{+KhGvPT!Sp=81VV;^7rCa#iUH4!PG;K~5 zqPH6yATbn-17uV8^b5haVa2Q})j?uHnYM}+D9e|ka}DW>&Olq>x1N`b3kn9c4o|tF z()v5JZ8V{5=(ep%xGeO`0r*lHPHMF!*OYz(xL_3uCIvUbqNu|(x(xmJwYB?0?$FDB zi)B1qI;p~Slq0)mBG2>}{=lUJdp%eeyHA2G_7Fvp*S+78++>Gxzxgwr3q71=ba&Hw zWWW7He7fizlAK%wx^VkWpg%`Y@l-`hm}TMsbUu*FNI6oVTxv4rSA*g@Ou|lFG!8QrJUgX@*L8*} zHy|IE=34@;s=)?rhd>(x>&gVF4_#ylYmVF?0>feIGJt{!dx82_^`x9>M{SMr2IU z9(?30WIg+12}eUM&^L23EsE|xEm42B)l`-6G$YOqfPUvc@1aoF5Vg*Q=SK*&YLrii z?y+952!M~}fW#~50$NPFXEiE^{Q>F!sr5HDP{f-QERKUV`$12$O8V>v))=Mi0TGGd|8Pp7f+9lE~0 zH})UmHH7es(9-Ue^_*KYhFz1(ONFr^-@>9g;#91KHYQg8Mjo{hx zFY)YJFAz`zZ-DiI5lEs|1sWOo^`bcaiv>tZf~51qQYA)v%6`d%R0PY;3Mf_}09t~s zs7u$WCaWuR9T)l6E07~sqe$^Heb(JHC+@XQJwUd2(=>1rjNhh4@*F}JILdzACuX4; zO0)&k+Eug`wkM{{IBl^rvh=}}h>T6>IO~k@R<&69oa~*T61TbOE~y!%X&2GYZoRQQ zY86+Q*$+;31-GcCEv}*4Xz=<4Q?}xG7^S%V)&SyS+k5WPx{LaG8hP!5h=lGozz*`f zYn?|U65%g<#01Z0#yHajq9Rzc&J`G25i`8kR$0Gq5aPjc)L{C{Qd@^rSk;2gwXc zE!CQ{2UWIeJ9LD|b-^?CX0TRn7Y*AyDR-%JPWzmhUDnVNMQC?Aq3NNP%h<8XS~KIW zITfW;C%2qVB_6IcvSt4d3;Q5iKV~++rXQpL^?t4%mNPT}k}E{!2ag#;b{aBg3u6T2 zI@I4gIoi3m7$XtK;oPYiD`re-eFF2RxZK`Hd!?x;zO~*TO}L*hr#jWdE?SK8WQPo` zBFT3%gir64oIIOtRZqdTzIT*rKxK|?{R4E&p%)%d&tf`0wtF`NnqjOKUrL@GDqu;b zRbv|o?s#`br==6qiqob(sT>*Zl`s1XqNz{mlR_2(2w{=C;OxRztQ#gU!JCSJpF7wB z-r6*hZKGlxJd|w^Ww}8Og_Sk<*+rUbd-lEX`1MUK70P%4orMBV0n9ZbK{ZSw<(SIx zs%uU}uHpR~!t2Kpj8WrdA&~XVD2RK9u2T*B@oJh&Z$>;oPw z)im&((8o+En4<(K^`PE%Tv{k!azt)zII=sE3o2 zIgjMDN)veikcIc)PDqXQ8$TVk4s|UMCRK*&6@54{Ta8teV{A+TJ!N2rv0p?-R1%@h zf!e0jt@iysq21gVKFa(4CrI~mdR#WK&*ZtJSJhQL&24YdwA<@yPI#!CH}KQjw&!?7 zSo(;nBAr>K@&(jyhmKZKuTqQb7{A}+K^!_*r~#<^-dxG-X_yBY;#b@`P0Rz0?A8xK zC3>_RXAbfrQvY3GDJ7C9Ac3SQgCF0w3gD+L*z@|gp^;iGR&VKcr&c2cYYbxQS-*Hr02Z z6-{BbXI;xH`BT(rd#To1lG}^l8FVsJ0h)wAg?}=ed zjy#3L#mCcM zzTLW+L3z|R`4Ai7RLWxTSaH5vr}7^41=p>rGXIsoTGWr$+8YA~svJF*R8G=Cu(DQO zl4gf2vThcxkV)A0Rrb3vQ%2c9R}O1Zc8C&U+)Is{l#- z-8Ij2k+pX2T^V)gJm83NjQ7uYk@M~ds)6m4RO7fbna@|pxbLQ*R3$_sQ-x1zCmmAL zG0-X)j@RyM?QGU1y+}H9Lg=K*R*I}Q0*CsA>M5&7}3srR4W}U7AJp&6MDUb3M)LO^V$nu<`B0 zYczZOrCCbV{R@mC4e=u@D*~BCI6Z%xm#=R@L*bW$@r{D|)f1*BO_1xPZu4B(iYg1{ z2Qp^x0ZuA?H0b$0^hlgpLj&eVt(_8d2)DjX`1)0AKQ632${eoYr9hADaNcXnp?xrn ztNe}JGvZX9L|Z{(h+fxXUGD`VGi|+rMT>0>VEOo}OoTIGE)0zhGx=$cXvl|JDa+zo zS{b#q#?pj_1E{IDg=kDRf6xo0EOTR{#Z^|#DJE@5wv$_Y0lN_mXe5(jmF{Mr(hyUf z^6y<5YbkWQ0IEfX&l<<@>8ox*x-@9@VltzIKn}EDEVN=Nim=Xj>|8~g225vmWrH;8 z)=au31|^W$8eTjaq7FqL&_fnfDpJN_5$bVGcr^po{AQK(hRJNfuK7XrDSu31ag@D& z7Y#95S#UaKma+8ay@tpmZE52*woAd^synVRayQ^<6Id3%+iw`Bl7Z$^7jE5O`PyJ< zdfK16IElK3WWl~Xe#;8#}_57sdVR02-!EZ^$cI;ptLxCh+HAF0k> zu!Z#<~+N86XKi5b@SHK`Cgv&%?NEqQc`DPJFT14@BjU=!d3#f zsG#JXlrL&;)z`^t$LFXlvlwso0I;Hhh0DXPp^&$ja7~^?sZ1d;MS;jRDUN1pS)ss_ zN4!Hlqb&}CT*gei=VUzEgZQP26=F4}a_Fg#$I1<#pLYYvqIq(VdOcU4CLKcxJv8lQU~ogSp!|M$Ns# z1xDG(r`A;kX!FnvnBjK}=;O+E3b`IBI)W0g?Up_%fk4!?dNJpzjMK1I2V5$VP}~<_ zN?lwTuCOb0V@|OU11USnSKK>mfzpw#n-@0s623i+GEKa7aldrzB+y{wl##;0DEn5< z?AQjnM^6XgMf#TB0i$mO^R*C3LQ0zay-k~rmL}AII;Z{lNAeoj<vBRe~x)cHFo&Xbu_5RY2heG%y62hy|Alz zQhOT(vX%P2AgqvnG|(r!OblA>l%ct3TRi{s9{xODy3;`sf8Dm-CJ*710n$D5;`t3+-{8C%|8)|r4GfoPO060_PsNfCtU_m#Ui9_? z!DwdWBZ??gCbmH1%7BxhRf*rl7r#sYK62{fG z{$7HPITYKo7;>wgtDR$T;e(GQpGuD#{i^xCTN7%S?U5LWT-9JSN8g=Eblfo+XXQ9d z?bM|MeujArN}gnm=j|iadX#2$Bb9_Frks+Fp?o%Cekd=^YDPRktn5>1k@v*}Py$eA zfVB?+mwhd^vU{+<^~Zdlt>)C~(I$jK`IC0&28mg(qS~w>M*rgQkN461z(%n6d|NuL z`H4zVjP-BRNb@MBQSLFf=h|%RjEL5h;W#RcGeM8XDfHd8=Rnm&r*7yEAMZ2a>rwP_ zgv+5@&JX92nBPQv{Uf+F)6aoTLo-m9v6i}qyr#388{SnREu`Ap$K5PbFqW>@1|sfDoWy4g{8A5?!S-3L~t&F?T`+yf`> zGK_k07%`ucBi++m6I|ra`WN8q+7`7DQ%ldG4M-VnPV>tc=a0P(&oYUN*LPw7smp%p zjg{h}$PuoX`R9ZI6Z3O~yBcAM^Pw6Nsln(i9y=#CRqQCK0B2d#$QscDhH?e z+FubrS!*&}LLMaE-PLyV+O+#|@X2RBIMS?m99Mg$#XBe-K@PSRePbntJZ7nu*Bp>K zZyJVuAS$qV!1UUvG`BKtyg%$NCuXN-PL6d6ql;7=!q9c;?x6+tZ=JQ@I(di7A}b7N zH^!Jg8pE3Ugmg`KX-djg1Wig+jMI8y+?WGO(9y>aU*LIhxK5##|NKT)ip^NgpFT2! zn`~S}3#?H`jWKp#1@lh3vpC&K3N}x?U^-GBhck0+1{A4p`*hR=FyKSbM;6l5nTTXQ*`-3e1)7G+4k(oQ!eUL%}khX)Sz6HP)u`HZ;s zx{=)4b>URAkr;`A*ldv+6qC2UGYmWWus=N;VJ|8*-Im zRI5Sf%U6-K*yS+9-w@R(A`^?C`qg?jv>E0%{)oKuXD_Fwk8`=xiL3-nVGR9>@h=KZ+MBvB3$iRT8kbSdONhIaZsj-*O7;ig4YwT*eyzS!=9`$+3MR}w`0t3m9`yewe}ov*bYK#G*_8*4{cAb zn;LD)Rt@r8k-hZgnyOjr>Wt(hu3L6nW9tYW0k_F7(om)i6Bk#Sj$b>Q5aqvDLfq#g zP8fnWqP5FY9bhbjy1*TB4CwOWVf?#dZ0gaBI`u-w_yL6EmUiz(mNdX%CE1b7(B&13V`@DE9Fm z=@{HS@}qukE!Gs7*9>)L3qQZ*1#s@#1eGhPC>4QcH$M%)A6f&tYN>c6o}= zH|KX3-tja=kjp{g#FIu94~HDiI0}rP9OORS1Kk7Rvlv09%KObWKTqn*Tig`)YQ0YhFDnS%H4Br;Rfx$KPe(TpB_L=NkftG6iglgk7P%wu*FH6@lGdnPqFKKsw1z{wW32%Ab)eQq1Pj8DyoZHes%1p@* ztlP*WeMgB1h^lG3P~0zUT3Uza9yBfd5V5xYF?5b?zzN?=c>7{6xS>vmlu@6Ox*>HY z^>p5IzGHA`aA|Nhcscm1@myoMZO6o=-cs_K#}3!YQgJ{S(?oCRBJaepvCcZpnLdFP zVfP&PUQ?OO5PGtX#t74&^y#rRpdl2nrM38q<)?w_TjQ_Zc%0_O=TW`Y{L=SjCD}@i zR^7};?tECyatntN#PecOUwVzi?c;F4$^<}I<^r{T&UWd`6iNTjHYJ4@?tIe+6A^b# zmHo+|>w+Ajfl$xmq&w*X-P|_DVRE5VI$Be!lQxvEZZ0cDP|6lK79!E|&3axMc!b+{ zvkFzmRIlLzl0w6Ck*T$Guq;PmM1+>u>DX3SyE}1IIe_wb&JR&uG^!1Sjy&Dd+asJA zDFx60`)ZAaoXaX#mIJN@^G9n0Kk?(Hn3vwJVPJc&nA|IBg&64+ReU8g=7YF`;{y0) zXomT7UWkoX7mgNo;bMh(ipd2YBwD~D;&|gk{E2obJzx6}5{8U)HG=?Ddfx*T@0`mi zE_&mE5|_XdxsFr)lFcrA0Gx9J!`s@l0Kr-;EE@(+q#*TL?(%_S_k<4QQoUVOmKomk za{0@YLJ!F%3bpl`hQRN zTnsca;kp(DNI>)K^G;*$JOBDY{E+#cX6!^XmgFlq`}`d8K#qYpn+{!ZiY6D`XBicJ zP}(4-auTYIU4eNCV2DS0^~MMz&Q}IPO_L&|o&d!(iC`jZ5*AQ3`Nzbf+Shg`=Q5(D zGWoLk-qG8puCx}9GV0a;m}>2QG_UgK zwoCKn&rO|8Fpjy*#xRa|iqIedLj@aCOURBZOdyvd6 z@#tEO;b{3QY{SKuQzg{0#;OGGi~VI#B@Sb-dW?sKL@3hD!ZDrB*wGoKa7maQLY|U_ zH(w3Trk$ebvr8RuRXAPABrC}zV%<@JCY_~5YF@ggbIVw%SV22002W|6IYb-)1FVdO zpz9G}=!7+Z+mt|Z^P*U!IerztpD`ph66sQcYhDcya%tv>N3$%MCTX!uQPdtT#z3Rb z`M8OP=d0XD=j?A?o>!ag<7Lx!@{<9{#fcp9`N5i!OC%H&ccIR=LVg9!T#8S00)>-B?W_XlYdU%H|u zzy=%fELIc@&Y-57*pUaCQ5lm(u@c=<+rFx?D^`JOkwqq=*7~kD%f`YQiYT`AC*hd( zU@p{7*DP&^4ByB2deCIMHN9lEYD#|GY19wy-+>yWiRn|-VA->)xeE< zq!PZK3o*-nwk}D7L1OVExb!AMdi#>iDZ_s*>zuMEeY}mNEh5ksw}yoFN#qd^9CE?B zf0%-rzw){nDuZs4#2|jTT=uK%BdqI$@^rl7=}>k%PoY3GTrlw&}^&>JMwFROY!j)u`>Xk z4_8K3%BD+QlC>w-`H$1Y54)rDUG;xcjtHEpzU46=A6p9>}ijPHDZ&qj!u z6>APw7ON{!SmF6E7QNKkq3w~*8VUbbu@0dgVOZE|oml~}nhXf$7CO(S| zrfGUvN-)dKbSBB%qCQz+E*dtwPp0>=vb5Y<&EXv$yWtymI~6#Q)A7tO={L&t^oxSF!<0#|f%b z#W0JGJpaJ!d~3Vty=y29Z4AgPN=kgKFe!Ab(!#wMvgK|10j}<$evqZedKT@8^oEEN zbJT06f}+clPf%CoeK0M-oi(YSnN?kNJGGgzdS}e?^g|WSIT5VB7j~5vmCuLDD1dR? z^d2u7p4*lj&qj0gr`gqKN98Lai`Cs*b6X_X#2V2?MKIl>W7|#o&(YYRFief_ej=bUj}rJM2?Dw$``t()B$Jz8jJpp zOa(LiJH9@j>$;shrkN2Zh;D=(A15&zjtg^!jP2z^3@BxY9LR&^m<?i+P7QDiU=7$alQ)yCh*)~a!sZH;56JUo8HX6EfgDIqu05X)(1`}jyMLHhdv6w8 z4O9;(NBQ-<8S4}58tA9S4-G@+>+J}hL7onXm{=Q!P%YxG!|+y?%jR&uy^LF#gNQQW zvZv=0i*yemL8i?#!?nz|lQv0psJgj6xH?m#?yBZfR}2(%5r?G1NQ^61bZOfIoe`+R z%rRX{9+MaSU)4Kyy~>td51dOOP^!p2R%gwuE7i!2Vaj{P!&1Yx89-Cps4*=|ZCmLs zJ)3(zoqyy;Q40leLR5D@R#_44$g7d4|*5SJ}oEIw2-x#%@Sxs4_YvRfAU}3l1lVglte}Gt%4`~ z{XqiJ0L^8osfjet0K>O%#(_!{EP)U>pd$Lk3?YC36(*D!sF~{c48(=noV^rL{b&+_ zYDbwBp@R2QmB@7xQFmxK76`&Eww3e1D&)FKu;mmU6uXZldm+J(oqd_`eS@%otM3j+KSK2Q3EUVblp9(Zf9ELGQ_N)`kk+v8 zjDEK?<=RZ@Sw~6@88L%iKM3ZKS0GnfY&T^3816XaUJPhUQLyh9evY&eg^drG_)Eo}I5s=!!GKPV(naiOu)R=vuOqUM z{b%rH>{RW!7YWp)ORaic#O@I5cT%@MMC41e$KtgVh8+web*i&&#m6D%GY!+KfF@2LhoWRGF z(a99ZSEeQ=Z1EO|Q_rw^EdZq{gKW9ddfx8d(y63}hBDfcMv!El0?)EfO=Y=e*Je}M zY_24f6sBQ3RW0+1@N+47GGKxz zdRy`%`3m4+qwH~OwR|KS9+n}R-xb2_1?Z@yR%Zi(l;a{vRCa>vYciw z!XJM)kv=|DHxV^e+kI~Ya535gi-lX#duC zV#Bz?;-PvHiiIP%6)md9^M*2W4eceO;KVcXDi7)sU@{oa!neIP`s`PaK###NZ zj1D5UHcmpuj)o5Ac22eqc(nYEhQ>Bdc&yBHc(j80c4Efnre;of-@;#`zZzF>e2l{LK5BqN)|KE1LWk{Cq@&Bd2Iu?3*JZ5H=|JePb58s(G z{;gyC7ynoOx7~ML$iMvGx_`_65we`3Bub;o=f1ga>bN#o!e`Tg`yTAPR^B-gR zEB|NA-{t@5`@eYBe~$Zq8}GmS_-*^2`S|Pm-*fWU=U{ZIA& zyYBxfAAjffFKPehCI3IckpITScf>dwIJw(>N0*X=v++N{R0Z@MjsL0q|BJZ4n*R!T z$bWtl6!2*O5pIs(@%1mvWD#=*M<+oueFwb1Q7)zbFM;9v&7&2zF|;)@w=w-2r-uKC zr!B=rh@CgK?5DfWn>Q~X?NW}Xtu}4vEA}IwY4)crrao|dYK<5% zqA6VtSNE^dp6r}Izyd2w-QV~4o6B*ZsS9`oLtSXKd=BQ)zutNU!O3axgs@s~%b20A zULOCXgO|b*Dm9mvJ6-~M9n`W3P-9<5Dxo5oxhnVuzQc}ywIx-x$$X(csK)yKyhW|j zVDY`YTUsUrk2(o>e=T&Z)~wRvKNmK$LjL2eI<397`a0u1j=v4*uK!YJsX{JhLi5Mg z@4f1Pk~8_J%lREuV1HvKcwa8~_X2LIC^+TJ*F!)E89#y0ETl-Of@K3o=PzNA(v`po zl=8_-I|rJ;4G^3^!aQ5F!2YPX@Q|XA`L%g&^b!dPNr|NL!ew<7+S>7@!e6>xBJaGu z0ha&xzH3qvKD+0^c5H8tS7U z{+Z^LICsc{`)+iNWk(!n(6bNewr95BH^iS!3|kdw$a#J0di;b}zTZ>pIxA}D_3Ja3 z+-iu$EgovCfBy%~fV5p?kWb@Y;Dp!x9WSV6Kx^P$o8dU1LtxxACwBQfB{!VG=m7tF%f z3EI~!NTebx{>?bb{0H_{{FeL{=GHQHU%-N~G2SE0BVD8+*{0}d-tsu=zWTWH9^w`I zl~S1R2HKIdKI#RsfC1Ym{*!lS7#gDqsx!1L)MoDoomLABRkb#^i$UP^1wrL@DRk%~tj)VYEyE>Py0aw3q%vPyOgrGzG0eYw3I5*8~giXvSdRc9QB4w7U{M&gc0=}j9C)dQg`C8LjsnVO5Y{$>r{g`U&J z=KKQQeAtgR{1bvIutPC9#m!%l)9i1V@Y6fPUlCCwGj;A%EPu+XX`TJHc`Q|=c+@K^ zJ1%jX&S&R5FnDTKH?NIDkt1rCin>=_(U`(anGTZBvU#;K*Df?;)0?x2=XVAZ`^)n> z=2H#P)9B9Q{V8&1tCh{tXX0`}a>uhP7tK`_aSqJ)@h}r61!%I`IWaLorAjbRv`8l7 zCIQX~#>MVMPU@vQuQPuy&M8>vMnXc?0kgVsYJTASVL&%4azaelAWE|KNiiks&!ClZ zpFBW~JK&}5F4*KhIvZ;>6rC2%v_8PRZN7u2_f3wzQ<`0i)~j7i?oV1eU|#hY81Qk-q$N)fKe9vRW(DYDtQoy6 zV*6^3aqMnz4gCVziF48$QHl^?32j+Xeo@XXTPLgW*z8dGj-kPz0^~6T9@}R znc>PtICKN}q9JE7&!zb>=dt8b`=YynN!=DOQ&266>X{7^59nSVX6xRb2#;Ee+zZ~k z=5>{`5zZ3A8rMgg35_hS;n=+X(bx|9KA5ND58kSv{+LN32k8ETkP3#@fk;H<#+a=~iLw}5yjNNd(Bu(8sytSl{htJ?`SfP6> z)XXEVz&f{CsoDB~!BFT03l1RB1fDD5?P_f&+?#NvXu0tg{Y)T?S0E1-5=;@vta4Ag zcV6%^K{jfdYZ~WhEv~(&jNN82_J;_XTZzq%*d`wfjQa=!)3~=Eqe6sz6N30@mTf&< zg(P&-t#Rp?LmaBz{5y7eb+?7ofF|=R?vw4u*<89~wZ6V6i#*3!A0q^p?Km#(#dAz; z5X@DU*TVsbZwJr!eHJTo8-*^}t==!;&uE>H@LAh|Q5D}6%|WITlvGqsm2#EzWw-W^ zW=71)W{@kzP1DZpZcXO}i@H`XitM$cyBl)daM>5qQj*fEr_E{0N|tow-}Du#cRcCJ zl?rGPVLV&_2!a!r~cNjDMPyK?CfDFAyIFD#i`1o%djugGq+=9PI+c zSBI-kud+Psz#ubLXV0%8g$+xrHFe!bs4f^5>vZ3qc(?j)ttl=?N)KP9*SoHUdhno_ zAM3OTK{K(V$Y}XqHO{jPKo?fid>pIBP^V})1tB3wx(MUgBAMMv8|Z<$Q@dl<{_e=$ zkjBA-jgydqFA$avBeIp(6pM(SOMkNyTEJ|y2xmxxkV=6!2F^r&fLF#8Q>m{1jZ$CG zeq}ti>YUBSfV;{_w*z*b+CSqu^QS&FhEWu@9(vMyU>91j7Ja~k$VD&TuQFGu5M4D1 zbG#A|jjYQb{M2!LU3&1!;4Wc!se0NwmJl3ymdUQq%5hOJw#H~QNZQolD=a{F)B_&( zoKzQp^Mv0u6tr-y(8XM=-fR~JbP12V(W4qfGmWZY75F3NtKxTIXyuROd7*Ym)25Uh zl?Wyr?lGJL{R491()0exH|(dBNbiC751yEU`>Wd4HNxl{)3^FKKI}~hFelpT*N=}l z?;s~vg0th~#O(NX63cd~Q?Abx_c&84moYPbgp?ss)tHxBeT64$#dXza_j9z`O6MK5 zciSfe&C8yb^em5V_ph zs~7wHnM3Vk9W^^8Ho^?#9bwQl6W52`o4i4zy~!sLv&qg5n%g%0a#9IfnERi1kHS!h zq*D*|tUYu|4~^RiGWX*yN_EF`*TRrB1u7Afm%R)f{&fZ*2Iua^jT&UVF_Bhu$OE!( zNCkis;*+81Se(oeyf2EESIDP7RI}DT)i2jOeMcS)$KAcS#ewsttSoM-%hQjh#kgctZ9CfibS z^kuHBD+T5-nO`w@6pGI#r#$e6&Fm{_VU@tVl0I`PBsP)&F)kpM>O!=weTM~;4^M%c zt%JL%{VS- zGI$zyzY+c>!#&?=qQI4-%jEFlUG3B08pHLF^u#=3h{wxW2ERFmU^gy7g+c0uHFR~c z<79R&6LRP2^N=a%L%BY!CVKcf)4 zYJE?A{mIb4*HG#N8K5Xig5Z>E|B#8EHAZ3j9+}j;c+^OXV{E?`ZkH_Zy10T5VW}$!@KO$RTyG9O zJSd*G4AaJd&lrLg?q`828y1_;gkbJ~`enZ3YD^0)@lqZKT5c*d8Vp)d9Nd6JO&V)< z+y_(9Je>u0WEY!=DeGwjHhpkm3>JG|jooOviWDRfs8ty-?tB1crPm-hRa7+aVc`uv z3_4}Z=+4jm+>Isr8-FC8q@m&A7)va*hMZ_+%=lI#t)sG^7>@N}%Qr{Q{aR$KVK_gx z_$Il1_g0047{u+7qv!nlFqc59!I8cXz(aT?xxrQ;J#70a)9kpBuaV0r99O;uHAS^) z-itaz27OW-?Hy|zB{w-XUFAa~^V6u}@ri1k`tcf-h^wqvJxX=U?_nDeu__oS8cRGT5W@x1){o0-Fh$b#yz1NON4_WUS+8x2 zRJhwrrV6T7X1uyxnq9v4DD2Hp&o6}uX6X58Xdum4puV~*AZ`aG^R#)D&G|pv>u8#BX?6yF| z*F;>qm8!>FTW$Iqwm-0ezW_IBnw&ASnY)TOExaagvOZ-mtFd(1eVyKq7sz^;)SXr4 znJ$=2i<{=%+db1Cc|N?)JBzSE+B3b|c$($sWF^xpvaJDy*SR750Q<7&(y1kElKAJk za&*z=y7cta-hv;Z6Q6G#+YZOUjDpl4m!w44A%peJonoF$=iZ47h`T;l>cM0WanRKQ ze95q!ug}_owq=}Z#Mh29rF=YtmIsJ*uf{vG-d>-4+iD>VJMLxSGN0B@X=+|R`_T&A zXA0?_g{s4U)ATzBYXUuixPTpx*(th-JdfGArYzwdqgdQg63|Ge`(>=GicWYfVX%t* z5Sc)t=^)^JNsbi1+6e&QT1Xd)iLNy}xGY3mlzl%Ag>ZVy9E-^^=dHMXdll6MEzvv08#{w87@Hget5G`dpu+>Mh}8<2r&e`P*L5O9s8 zZ28ze9fuIiMU1O%0LI-WY{(xlOS!edNT9{%mU;&=ZtxHTWCcD2(?Uq^1IWXSByy3O$_U%l7=oNV1yz zLAJ0p1r+vkQ>W9Dg)D=4=Si3`C0K``mf2kza!*h)E?LD`(1@oCOyqheA?XA;X`DMZ z2In(r5ai0wkda$;`c?C_Ko+!^{d{^25c`g~f^ha;eY0GR`->u)eT@C!W1xY6A#CAb zy~GIHyLJK^U0jz43jPBHR|{>7s6ftBnV>*UEOjXq)Zu_!xf$U#FD_d{L?UxZq_Q66 z818cP4;AnL7H6Ct$%*qjpyP4bfA8(YR zI(o`<2z5yNJU_lUh9kODc`!V!;f+z3-!FN`Qqzey*}v~?yc{n)#q0y$kbnP2dpBlZ zqmVJt?*Mtv3LQtk7A36G>!Hn+dZ8OjA*2!IyB6u8g1iYWhpv*R6-G|2}jk?Lp z^P2}CQ_?|!CYzkq#-X)4S%qZjqJ$Gf9vujSLVy-WUHu&^BbRdnG}J+ejrp38q*Wy{ z7g>m$H#P3)&Wq3c_?)X{SI4V;nJLb-PNTHnt@2twkn7S_r;@@o0}Pq$7zr+giI!e4 z(ZzB*kFFC>ky?PCX*no6cA8`~v9$!{)jlmnV$3{%`-gzhn}osrXM3p63_IrYSo~lg zS2GdpYVZfJ;ec@vrCmTB0IrovVP*p-F-eUJA>A%~?GJVYzk!p9WP}R7uiW|lFYTCv zQNoF7@Td}q2?7}>UVgH;6jb}TT z!6?&26&wnGdcBzitl7xmp|(8Da23zJfRe6hbpXr&ttPM9)@_>?8x0Q{>$%D!$Xz(_nf4V*==b=gI<%I@O_ldfn|69cM)t##LT$;;r7zSXUc#)`Q*y;2xd2riL{>w?l0DzsS4G;6|D? zQP6F-nVFfH+sw?&w#>}T>^3tqx0#ulncB?E3~lzhzd2`iZ|vMVcQ;~xZG@yMWo5pq zR47Xkl~vE1gx$-RtjI_*$y=xo!+v`jQ!f;ZscmSeXh6X}-Y?yF1TZQ1=3g5--LA$a zt1T|?mVvk>BM;aca)xb~$}}D+rFLwvSf}OS4I`H!l9R5KC!>!fh9^mCT+(TA5g|5% z*GMDn=H!d^IPO~ysy{K(nFip#>@#tK3T*#c{`XezggE<{rYc=!bANb<%@iXVW*sp#jow~^0!K=@2QOYa2?*=+5!i77bRkP^V6njU3q)6WrisC}<>4{~O9QERFSvi!*`@xf=Zd@V!Pyv~v zQuPQ91L_uTP?n)d2(D5U6ZOg_#S?vABfZr)9PJc8J;VA>?Wu3_qF?TV&K|UPWLlAS zo#Hc{K%Zao39>q_AsCy>VRHjzCVBaSE!wVU&+Txt;2Cc*1UiA*%E8Xw{8FuZE8P&A zS68ji4sE_K{b9X?snii)w_WS?mdUiw>^HTJ?2_C=S_NiMowN=p9y@@C@QBf3p!j{M zxMWa`Ri5$Nr=Cc^HWjkBn#7d0zT4^(#ZTn%MmZY*_Ack$Vb#qYMI>W2hOF~Fo{c8z zx4KXC%Pl4paaV}}uOt-HeLts2hX$AHWAJKtW?OxpJy0zyb&dV#!^%<4_k(miFbj+LW3cANmRka4S}4C~B!l(Stdb}jZy zdH)x7E4p^Y)WYWBf+|2=+qrEt8>+wI60PGdkNbrH6SKQ2`^!A$XybS}1k6a36On2r zttpdPs8BQp)}eyWIUu|n1N8e%*)Iwq7{Pu^VZHRWp+TOAP-}8qPS^KyktagKk*x7U zlV9o8SQuhBzQJ;~IojF3#HvZy0N8dV@wJ$~A2HD;<2{5S{uHE(N6CO6$&yIbbnXYM z!3#lQ{=Pt4>0o@t>>kvT1s3;mj7IP}#ej0H0`SYU?B8A0&zhg;^Bf7H#+sHy15|2l z$nE(M4~W9Hnia?WoN-ZT5whq@CoUoYe&GydcGj|pf#uxQX=R3%)tEq-=x2M95+$WX zHhr>E;o7qFiYgO86~`aO)aT$RQiE{=qsZ}J3MYX+=bvP~bcT?N8VM);13o_U_U@__ zTwQ#gs+!Y@NGTyY3|RHoaqQI7mkSPCcG30Z3|iy<#ZlBMCaXG$v6hJB_rLtl-%5QYjKqcPTuJZJ*-5}`Gh6u0B4b<1Ci z0DTX{++}^`_G9YyDIO=u>m;~VsnW~nS$jZ1WywIu3sA=cu8YlDI@^tI{^d;D^9CVu zb$f%9DAJe0pqt$^eTEFP-x0#j5|`K<@)!{j-k%D$Lk-XC*hL}U;dwEzU6Rt3rpR52 z-OW^eIfU)Fb%@thnCAj{L%fmnOVkBk+TCn*suOn_fx0>yxW}d{ldp!z)#q%{HTjA- zTO(8v7r76c8hX+PB4x`7bzW7f2KBH zkz(F4+XuQrd7~OD@|l*U(|P-g9O@XxQb4tgoxQ1zKGmOJyv>wZ?R@}HA&SwKai;)x z0*QvX?phG;?LDUG5>5bXO`_X?^09PA|XW0{VxHc zGVm))6{(H~=!?+G^dDR;nc*w~M8+@ot`qu7wN^$HYBS4wm3a|S7<^>NsbOL zg7sk<6TNvk1}G4%icO$C6eQ*!Khh&_A@QL~C}_T6{9v-*{hAFJKL6&)+HSBtK`B8+ zjq`j%SxNf11lx{NSFug6mBLm81OXR$dtX)A0Rir7lg&eE3x*Mmwa>xs>oX~w9W?xj z>v)|YMpFiRP!;E58J(lH@=Mv`Vd&=IhZ3**eRH|m%EQ-9AsObBbUB#LW<|86)fpb} zybY^{P&=uli**Ld{U>7NTWpS^d1~Wj_d|l7&Vap<%gF*!{E1rD>MJLZl=CGty5lUlbH5!3 z|Lpc7l)Ku85eEWh@^Ng!5$P5t31^z#Oq=J*~$f2)-w zZhOiQi?yM~42xET8Zs23Pr54d1JUs3Mi8LKFA%Z51?CM>qLQQ`#7AhWb#HwoM!x~R zR9PnrNyFTnFe{nGTtxLz=kAOxUdwJ4w0?w{T*yL5nM9$LfBn6^c3~$#vTyXpk?gX? zU2#w2$mriiTG-K0*&K4F5SxVKsq*a>Ofq>mkLcx8gNJ z3YY(luT8b0UL%10G&Q(r=fo(ZYI64U+@VWvE_H&eeshq`pK{idTOeSzdHILW(ACk` z?Hoy4dPAO*zA2SQZ>HZnbZH%s$bo_F47OoPCd2FBQ=T*9mxzNx%`>^!NfrMKy4E8!=z<7Gc&O3VF^d zjpf;kFyfZ*>Kh2lc^ez|vCGS+2Kq(b z1!bi#QBZwcv9q%=0xUXdZjg2$@M7;W^C82Sc|OWuolo`Tx0>tz#{zGSu|1?xI7Q;f zB*7L?t3@2NjL7^9{H{%))YT%InL)TD%jVf_%LZswYGpibH({w|q;$*##ysXp^g3F5 z<#F_wjLIKTmtj09Ucj@{g8zQr*j1WsZ~LDlb{N`89ry(^d=<6;D~O=c(~ygnsc2*u zt8ehN-LqT#VC7QE3&?wAdYOzM824K55jeFM)8z<`6n-lI(LL9BOI+oJXT` z^D^{@obK6-7`~>uwH(>9iYApkDI zvJ$I2W@eeiMbKDj1(i@_+1zo}noz4{M)fPFYU3LE3ffA$AYcdF3Vu1Kj>nkKh|8$C zRr!V<)=a5x>w4GtJ|s)P)66QWRw2p?k@4Hp@5t-=Bw-8kx7 zAb0^)H$oE8JDj^A3<#tt2@OuV^yRb;un?s@zZIFICTrg9le+!$&veG_*^9d8h8;Z} zx}9>W@Y5SyXDt&azSNQlcWPn}F{Qz9apNiNF%m3FN9)o$tL^I+%8cw04J?DzIYk*W zln=22dA4bm>)DdnqWihb+6LJ?Ag30^3WG`=^t}1HB+VEuR0b%;;fsLbM!_0vjk(h* zrQM%M)FQxIs5U9-Xx>;AH}!bOuRs|*7DlAP6tSk5(|*Wga`*hr^+JwE=jM=*bX#!( zMRY@=&(VM!T#cN`#h8hvVw&t@hz`iM{oI0;^N~2aY+Hpi?I_{b(3Ya}K8{vw_vaYU zXY>N{!804zj%qS1Njf9yy045XL0xt=3@CI^!%Dr%6e@|~Y+%?zQ6f<{LA^nFQ~6U* zCi+U-oB5u5!+}Q?=LVF~Wh|J1_ z#I7DS#lpChkz+(D$r=vZ*Y#JG46F0ScU-pnPY?+9{9{y~!vm$utEFx%QA>tnHl;XWIpxsNI5!MkLYB-2Zz4gWA4x6Uj7Jm;gQ7}@FQHZEU)iYE zpc{1}h~nf=TM=Vmyexjl78d>-tw2Ls)_zKwub#WADzWG zt%x!@+so(RS%vo*JSDT3U9?*ate~SXdi-7Z=Nx*^uFTc`tD7szH6_`~gQb_HFO%$Sl59;s2b9y=^gh^{ww84pI?ecOxNKa_tTnj^cX$w+AlE;?d1Bsy@DcEcFvSrj zs!14GdkLCB`~uJr%LJZ@n#<3P`;lD;20F|Ih
h>#g6aoOzkP#A8)SyCW_ZfFwd^^{kNCYa7uXAjIA#0gi=;Qir|k;Jq!dC9GU2&T zWtevIZHv^sRE|e5GVs}q>I0tv`;3_%zQXUBbiE%Cwcwr(_*tB3ugH&GuOIiYp~+DOp3+v$LFc)}vcv$@H&-uR6iNPWt*zd829|5mCnxXZ3R*dE-_u0GYeiGNq7C-wW<-9uODQKH# zjh5Aq>ESq}u}CYGq@9^rgKWxlm2j4(2^c9iDTl}JM4ZDm@T1d(iCN(?Kq^W#q}0?GKi&i zi8e8!Sm=HCH|X(lI9ZYUQ_WLZ>?~HBB)B{_bp{XavpHH(5=x5AD04TLN7Q^@W8@q^ zHO7*->sQz*g~SwmqR@8p4M##Q5sD$K8eP~tV|m89hJ8k}4U-zsJUc65u1m#%+`amr zj!z%ma?mqbsm-0@=yH^V5?mri0!-KQ!KLrr7euG3AKUZi6g@*qPOq!~tGSxxbLxu*nGJqlA!JUklBTjL%O zr)WwN4kgq3BsgjLQm|7HR}gfCT6P62`mn=yC3lsA#-coZI|whO1nxHLW7FM`o`+O? zeVCh`+abU#1RC*ULE8Dpum$FvTuGphsFO#_yAAx-Io9kwY+#y}yp{KP6$a*bs7f}= z#Yti0&^Fe%JYz}> z=I&~v1LWBhnTph@Dv`6J$-AtXt4&3vZA@0qk)`HlsoodNjO84E1eT)q!h!wu*j18K zTRaZRMaz>3wRvyH-?$&q2V^yaxXt{J7g}l?M=gGbrY_|kNG1t7-3_4?50PuSStb<0 z%ZpJnbtt0K^4pCQV@lcX0{_8s1&&QE=Q-J)a`FXPAug%H7vBi;f8(sgQ6K%3A+??> zk%oQ0^5fR^HTS9R8)+v(4Lfhy$N$K!M-fx3n&a0vlbI}~bI@Epp_if4&RW~xtsz!L zkW1kxQZ)jM$_zvkZh2fgTF|&_Z>G43TitWruy3&Q#LXJt{|r~)%!-`XP+};`jnWw4 z9^oG3p2lgwZR|9CoiovUu=2Zxw&*SJ)wzbu=9jGbT@$ck7jr zED|u}6tQN#1d^r~`@s2Tq4K*&(nb?Q%=;E6yWeds4fRro&TSxE>$1`s$dd(3SV^rMNnOP2q zB+U&Y;4R@%28D$A6FVjgY_ovx^(J#?jL#@=?L``N1>Qy9$@+eWbR#dg6i+McvTqaM z#%^rwCgdJ=Uiw?T?D<#lY-DYX*-m4Gpwp?FnC%3-GX(l_Uig@w1SB>Og-}EAs+i~E z8L^c+FMOrJNOd}dBb&A_q-&;^yrd0m0F0z{Z{B?PD9rXI2qoM~1g9WVD;i0j9+43~zA!|A4~Y_P zW~6`Tu;;PIB|5ikL<6s!NRBKfhtF8lZi%cR=9=!AC6zkYxIQd;&4;@YcIk96Jjd$_ z5pa&w4zz%oei3clURanvVVBQ(sK+dc034@pp)oRpxuVb}jWC)6Kx~y}u^Txfe5w|V z6KoW!?=9Ac-hGke`y+%PP zDkRfi=VETiZ!+0 zhUj_Y&hMKLWvNp^7kjdCQW}hs^l%-Viy_%}kr#||ZkZgDL@|t(lx`CY(q$^FOPp4W zV@cm9hfx6DHPgN^kga<1^-M!Tl50wH=ZNY z$4m}YlZ7@Il}C@QlH1$$%b#^tCdZEyo2sYZILcH^Ui(KMCgI?v{9qQ6`?TrM*|1c? zKzbegXcb;b^d-HT#!U&4gi^CC!QVKd#}truBP>&Yc9uvri_%+z^OqR( zy3op;jal#1OsZ|)oOXcX;os`(CO`&f73UII%$+&k5M}A;Zc_)m+7|}Zgg{9|kXxxB zl$DackPvUklF_S%sw;qqDIP3_56n)8iR}~6WtGVE3=?YHAv^c?jimHq#4l>@P(gzQ zN8tc!s-4=j^D6O zti-V)nOy;%^P(^;k*8s`2@Fh zIDL^jLjPu5Wla-pt?g=L7BhKWWsU{o+Qr&Nop$I5 zPd>^rdyR0I@Rd#M{eY)cXoi`4IYv#MiU0BP=1Frg!fP3iK^ zH1s%cCkNw&MH>z!$0r!oYE$}&Z6Utcy-8UYh1o(g;Pq>xb;Sa+R z-6rP8Z^}6cFxZm&c{A2bNb#>sYIO4~Ze$Ro+a0K~K(h3i0_=Nss<26l2?S#+nY`(Mm~^#q7SY{@3DS^97s^oW{tgZ#mm#hb_*-y zO5_e+<2A2mTO!E)`l_OQ9lwXaQ;q1WTWp&fT2)=u@GLJFFSV=MXTQW#Yd<4(Eq|R1*z$03 z%jlf;lpCEZ5pv`gU+R(YYpSP+M7UFXO4C)Ww}e7 z0%+v#BYI|b!(F|t=i5{!uhut@MZ?^mH4-#25>R#jQ!NyI4Ji5cY<$H`^2sMe7}+X&pY0fZt729s*0-83p_BX*-UDO=MZCK%1PHG-Aiy@q*8DKu17HL%yt}Fd zZM?ha{0-g%wEQgI1C#u}y$3u9%6NCl2*!AKMG2(wYvDrkV_JY9HpH~yK?Fw{`A2vS zU=hBG;2@@s5cY*F6aLJjy{SS!iquvkZ7l>}L2YxLAtT`E4M^4}4{&c^_YZiDz#~C# zzqmeoNLJmT%|b4vgtgjjQ0w0PxJs-Z4-K;G1fEkvQ0r6baImJgH>Ot&f50LNlgmXF z4~ZFB;<-&iq@{KuS3SC=GU#TC%A0p43CwUmg1kCKx~h_@ z0k_U|UQuIe1!j@QyrIV~qE6l6$A=N9JyTEb3E|r zmOU>z-xYEDstsGt>;V@S{e1UR4&OL3$hRJ+sJ`9)+0+mq@IA{yy>s(q(d~?rhHpYwX+DvBV&mK>B@4PAZyMG+A zee4SLl+RrLUah;uH4a(G_Auq}U1N!h8gxH+Q$uC*g}n>yB7UvKq6B`4|3e^`+E3D3 zE4pdyPfA|p?R)tR5=S>miIXp*4$++fBGSPX0Ma}8_-*qT!)@|>(+n}TX){@opt6%T zq4R;08@6!-J|kRnA5B((_BMs=ap(_!Beln#Y3}=8$SPkIo6nq9b)TUEu+)}?fIzE@ zqpcnJZ#vv~Nds}Ln>@UM+yf+9;e47T2E9_@z!|~P?AVmRZnid9h%Ibu;N7z*G+@dR z=$^Qvj>=|{(+G{-%ZOAF`{!4zS>UTr`{bq9{tCZ8uK?4I&w#sgLJ3HZ&d*56ZWR4L zAH*I*ugzv@&3u}t?__0-J*6_M?o<9psuy@8v?H&9n|AS9lhQUNn9ft!Q9)|*v&IY{YTzLxm@B2lhn z4TYVBBV3gtW96NZM5m--B|nvx_WiAm@%mN27VdbB$p?&9E_hWYM>p28cw;74wzsUL z+xFm{1)6W0nr`#iI<}$~R@H19MBQE7o8*j@MkxagP__!(yAMqzo%4^3%&8Vd0TN7u z(xE$Pz(bSjiDX|+7ImX!qhhHt1tn>ou%y)1wy6Psoe&x*H6kb}fKspx$sIkgM-n)y z)De3_~xqX z+R>R_YBwPJby(K?!o4lGvRGOY2CX6Lf-=!Z@)RMCC?2)|9uXDE+>+;~8d7QSs3M0B zM;mNeR6=zMw>#woG1XfuC~U!wnK?M?arp$pPycsT56Tmt_RLe)I|&EKgEO zzO0TO?I+Z00OPaE)7%9+{gzIAcPGgwoY#pD(Wf)7Z%)W-?I)i%r`SigkKt$XG%F9? zJBoV9%nYQd*mUwGo!In?JMUJPOb+b3sCtRv<{Mqu)W!L;^fAsxy#&U^TJyn8PV0M% zlV=2j2fjy#zQtMB@Zi*Jr`7=NEq&-k&h>FiyYFq44EolO%h??F<$}5XA&IMWyFb(G zU0Q8C0v<~nbM2SOn?D3H3A)SmXA|R=v>!D(EmU}K?yOqChF(6wNTUtD8n?SIryMAg;hl~wmLT@-wpp)%YTHD zFFEB)&-h1B`KxIBr+)HP{#QTw+y3td{9R}N>dfEuf4BR)?VmPZJNnh`pBVpi?rSIh zsq-JQ%71p^f3+|F+6MK%QRlyl_y3C+f4|@V6i@!^(fZ$jC;!DD`@eZ7e*-K2U%ZpQ z1L*7h|I9o2I&A!JdM95)|NlI|{M$SE`tAP{{y)7FHl{Cy>A&?(7CPNil?PiHbeyM7 zytmqmm*&?_oITRKfjsoo!4d3@@QqSLK#Y*X1cdYbLcx^Lnkfhn3PzG)h%BraM8jUf zu#lq2qP3W&9;g)ZnN7Qz%i2Q*_cxFJaCiIi4y~Rkt93q9sa$aoMItB`tRX}=Fr&-r zuJ_Qo!&&HvL13F!sUN;xMh}7$d?E@?bULExcH6aC--!Qg8Jsb_dtj?bzcW4%a{oyp zk8_pI<@rK$v#7QYA!9Ef@}ONJ4{PKoZxiHTciCsm_URxzXhX3DV>s2OKRa=PT)<`{ zRC3{M##d+eG8u8;m?nmh?m?gE%_ghM{)#SJa5dNCZM^_VXpi#ROqoB37A9jY7pDO0}2`L&hXx!NfI@uz399 z=EcpI00Rm-&J1P{dGuD9GoiAiqO7V^#Q6a>>iq?N6`5pBFf^lVM8tC65Imr=3=*G!?&0wK zd;^1!Ir2HZ~!*FkHy@oZyA*UfI-POeYX}fqHcgort!$ z&~DSlim1pSJpabcu%`Tr2~KX1t>Kp05ES4HNV8Vk)?sL0`D@_ywrw^x;_NdbUnE-1 zDRzCbU*62CG(V((rYoPZx;0}!+J##+qRHD7Z?^nSn&1O&}j`0 z%&5-6C(ul+zl&2s{?dyi{YHsbnM@-q*_C)wo}GUPd+`@_UO&jpQD6!MOx=f9 zjCcnrj|A_QfWZnzIB-O(4Px?c?#l(8%WgnVrKIaLbj;+s5#B4FiaZ9D?ZJ{~?0tl$ zH+%jP&tfQhm0Ex-6wAJ-RxT<{U@MiJpqC$HmQhq4Q4ZRaX-Oo+!EVI&xQhz9v*TS^($Hxg+9R50P53eQR1C49Bx8Z{>rF&B6J__S3t0ET51biW1CI!UIL8yX`s znT(C3*3gwi<0nQaC)m?uPp?-adFJ=AN^zOQ9@ih|dD@pMR$f7kT&_M&tUYVmo>wh1 zz;)-x*4auPu;MwU>+nK)sgXZN>v-FHiP8Bqy1ZX+54c=vh?B3@C72T5nH*dQ9VM9{ zG36OdXUj-wLVRfXtXRxY9nd5eU`&7KTr|XqxVkQ%&Mo7ksjCZopVHh&4FY9Mz)_vD zYzCOtdvcTq0*)c}NG;m?_0=M@`rw{m-(p)rC+&*;$Zt5lm(O(Wa-S;@&vz=){7~m+ z@X-=W{@}-b`_>~draqyX0gkRm^fRqY(hxR?CA>N8A3&dHxv3<#95P=t!+*O3f*R2QDbkITfd= zglJ4uMj_)(fs;4^tM?byv}=>`s$_itPdRI!57a?R_+`qZMMEkk=7vJY*OXcbZvrj0 z>EazNLwOkTYje0Lw)(9lo$|U85O4+C)bh#D%5rXrFA?CgaUNMjAs=4 z9){WU#JZUl;Id{tF6(vO8;0!r4BagHcG}lH@Yxsa3+Q>lFWO0Kfl}K|+ZEcyd|DH+ z$8m(H-ICf56_aTts0JsHP@j~jCbU(1ITww<<3Q1wB5yq2;4PgB0{FbIG`+1{cJ!JR zq+0*Pm3200zXPd$>A|G(o0nfN2Cie%`>sX6;ePIF=pg#Wx$Da!hsO>i~RC{ z2?p72Eijys2K)NWZWR}@uRAouJ7R|D7~y>Q+Z9v;FB>xj=t`xzuHlf0D@&qljxgS^ z#RF~p!fnnon_bM9tAvXKR~Eb*zRUUIm!=Vm7mFK zD!402N;RjyT_g~;jvxQ5UP!Y8y|OIHAA>%9$TiBOp9i9^n6=^le!@y+c{=AL@!ifD zmP#Dy3tC3k6(*%w(C_-Giq;oZQ&+Yt(%cRv*Jk|UR|r%}ri^!QCewOkdigHzW#RQ~ z@kT{{?S+BSJ&Y&EitEx!brbuFUQsPQA`^)89@tU(dF_fn7BLL~bP;7s|J1@NiZS=t|30h-X3*e*QB5RdvFZOaZVe^r07rRrx&V6LyjOX|nlZX$~MQ}trvXf94 zSvN>yQY?ZlmR7R4{lQW&PaJ?8+X*AM zm&dK!iIDLSx1SuY8w~c10)3L{Scx>n*<8DA8Ao7Q@2WiA_M3p8Ch$OT&Jw?4%SE^x znAvvsQhRxu%O?zygTBlI-lh#OZD zbEKXy>eCk_Ht2E!8f)~VRd&jRg-=z8n&|?FHydoD;Lc9{)cL6z{BdS-rkW6q^25U` z5hzrhosFki!=s8Ll1^By5TR)Keb8 ze;OOi?KnuOcc@wZmT<;l6SFM&hH31=SfPFB)C}gp@A?E&-)tJMz7qxZ?9Ds9Ee_1m zzJ#j@X2`SG@Hp}vuUwEk25kJ%y}wsafQ%Q^D`uxn9;R{va1iwp7lOOpG3K6?;Jmu# z?1y%Rxi;K0hdSHw2^i$M0d2yThTbo?=3}&WT(?}laGS`z_RI$|iVJckn2qy{^N31U zkh{~9%dA1`$!X&5B`^ep9RYoKt&ttBL2>G|4V1M~%a?|72M5IFS%FvMx3ui0(F@-! zc;gRim${OCo{x&zWZzR43?o+dY!%P1IMn(ttXgm3xbO7s7u6k?=vF+BW=n*5y#2UB z`zhbhbF^YJb`)slVN)}GqNas%Z-5K<=Qwd2 zS)VaR$H61VylQpY5AUePm+09Tuj|W%;;sRuT33%x)B>fL%)T?VtC#0+t)@?}*H}V; z9R4d;RX@^tIKB%c2N*TC0sY1>n@9Vy?6MeN1=Ufld!=@oZlz#_P8Pjq3J+dtv1SZw zscV^QSvLRcLddM+sY}wF39X?FR<}}RydTeYoF(_IIhhqyY}ELXlp8=>6_0gRUQC`7 zM12h9fJQeS@%sobS|bo`_P%;0ounh3T~9Bh~;_sApy@YL50*}^farPD@-toVrH z_>Wx0Q5gq!oElVMcoJC4=UCK;I`*K;aa!0_=V^+XT{$byiMdM-Oi%JkC#eo&n}|PX z&$R0f2M&jDXSl0tNzKd|6B+jz`xz~OOTdlwru8h~(YhB<3W&D$x6a$}-^kM~@;O<) zT0P@BvRlo6PYYIGz+>9y|AZSCe$q9=;x9bN<}K_Z!ev zUL208Hns9>7#R zk2sfe@s*!9jrWHl5C<=<#a^Cod6cex=q^2q%O7m4?`DVj>%Wqym;HMJm)R%ohOo(H zTXwi@m8sR`XZhwW8Jnb{sANkGVxqEt+?AD^AZ4{+S|1MCEAZ%njIk|iMp zYS8yL!5dw9?wY|E1fLydyl9TK#73w3X=vg8Xzn>B0+yU59|hG$+DbW|2EG#@!nwA1 z-@KG#KS`8uh<4`e*R&*xgHt*c|9zA6te}2puV>C*8B+p^?oksn~xABIsZspmIj)oM#*^ay1A1wN5 zPx?`2I6?%NKt1Ta^1fK;pn$x9NNk82i;KXdxhkXeWTFZy^+*2;Z#e`&NGf65N?8{g zpd^ww+59M}=9F2Iak(%taF16e4lsvI1rN^M78~L0a4UhFh|^OscM17(JWa)orDyCy z&3vE|27S~dABWh+#7aO;-&2$S8mR87Up!$98V#!Q}~8lQbQ zJXM@Y!A44=0T2UGNPS(^PoLq}+@e{-1ehJ=+@dhkTs@i+f)p%uG6TSpvTo7-<5>Z| zMx5!6NPV?=mgD;m!=rT!NzQWF4PM_7DA@5a@asN&SDxoZ|E)oO>J^5Xhjf8J&FaBv zwLi_~xCyptbu30nt7L`5%od^_E=Q;D#6#D!H95BxI*5dqJeT(B##q+l##*VPFv$9A zNhKSvwROaU?HT}H1DSfNN;v&s9HDY#V+kJdf?IjTWO1W=Q!dV_W@iNVpNciKE5Iks z+RS;QKrHJpdv$uBEX4F6@F2Kv=H}4Q;xmz62u}vx4bu5n=jXp&$Ha-QGDBAx;8`tZ zL&@7cgG!07>!>ZRT{`wUY5A^F!sPldu>@kSSd_*3l6KXI_ezVJPKelSUV5CoTAr%4 zX%@{45DfQ&N|tDyin(Jw3iNH&QrM&&0z!I1MJm4)6n-P-V9KS@jBBSVdy;-ERoc3| zvdis=i*O)x{0(Eq!^kPeM9&!m7_5q~2>+nzid$%VgF`-|9Vd&NtwNpn;>7#8kxVNIwIf!wV^P zk^B1LU~shfIK9sNgx(0UF!*=<=@g>-YNW?IS{K1)(nG(C}c7 z90BpAOECiQQS+6(v0T3W9j{q`6HL=K*O&UMY%XPA$4PZ!O?c^dS?;h9FE+dH z&5P!+i&M+hk~d0#w&b&cY`%Ai^Bwn#+>&7>yl-tUN;*M0=SC!3A_uv>sxt+!RA3B z=FYTxst0(V*=S{qyH(DF_n`F<5dk=N!hp7S~1fa%&5sE_Wc zCi18VmGDMd*p;KZsfG`J5N3_%&n=y7O`G1KNV+>5XVcaN22_dZJ9Css@bYR$zI z;mh#scuskA+=@Tw=R{A7{&br$VQ<$+_{(#1`)BJ=_=6FgKwXS%bH@N9=gMokPa_@&Q?n%0R zF-&4@C26qV-ErmmO8Az2dV8afJ{_XH%XcmtF_$y6#}F#dJ$y!6zcAHBO}sBXRz4KQ zbLC5u{Rd@g0Fe#f&Jsd13H#6%|IJ)vW*BRA?=f0Hg%j-n+Zc6p$fAmgr$m=~Km?dG zXk+ALp^J$?0PcXOaS{jsXser>T(}iiGgnYMtrvROz+G8t$L6YgiLQW<*n*T8%?E+p zG!7&~a!$G~HB-|0#Zv^r_#yUVko*M$HAW52LVP&*<5@BKelgX}SqjN_Svy5S){PVs zX0YtyWk}d+A6t!_D#TRSr=A|=LB~jb(`I;??CJa zN44CR4e@WXg)wU|+2Y$I3B)6lGq)@am11Z=*m4)0mvP?@rh7wJ0*7aP1CaSwQy?VdbI@@yh=s?n1Q4f;^)sCo? zix$-_pDUItZjEb=59*ZJ_n9~gA#Hb=Bk&r>Icdb^JqiWBYlS*tea9bTpVvdnoOV5W zwc+Yn2OV-><(I2@!k?_uqf6Y&KQ+74IVDyI`cE|WLG7YrgTT1Z{8Z<(nkv-tp1VTsX``StSR zY!hl>=4IAEq>MVvdN=u@+O<#}s(dXJVm}i5;0a`H_!w=moZ!Rc+mzqtJ1?)n;b7m` z59a4aQGFD0;&)aUjC}Gf{>rLL=F^&Z1ur0K1(-G7K%meHSfv&VHpq?Q%?(r{3>Y#4 zKCeX5B+nS5GKe!R`z+a6lJkMd+O%1Dtu)0+R@zj4?Q?*ZlIDiggS-;RbHWL+7u13u zim4+(&n?jHoAOm6eF`=v^wUjCFowX5Zb@Yt$cRZVzVr`^L9JoF4=Ka{gS~eQ@+62B zJ^yXnwr$(Cr)_iEwr$(Cr)^`}Hl}TE-}`pozPs@@c4Oby{ZJW|QI(mMI43JI^ZbsV zMc%RV1*&r}kN}=1$*$*+TSCbjvH!*WO%NkL0W@TH`@FlbcRvZJuy)wf>)vD<&53e% zCCCc{@QcJ;`Y+kqL}C=2#^x?=&HiMKkZ!|2lU553W_-;rgOnsSZa+K+XVq_Cb9@&# zpRYn$D#+wT;uID_*C_R_EaJs)Q6%2?0t#@moIhS7)R@t6-H(5ff;(>~1&PNK-Z5FW z*AxArZ&!f!b`T-RznFd|%~0}YmNv$_}1QrPNBs*Kg~2O#Unh)8RbU26CUn|ymNtn#FnE+xQt%wnuN?MI~_vZ&7VH4 zp_LAagyprYGO}b2Kyb{?JBwx$ZtpJ^G25or!2fhUs`*p#u-mf#k|8$)KdBi51@S{@ zt(*M5ur~7Dxw?x6cVp%N^8w<&yy_jtBWef2b(Ef!VZw~Wn(N6jfCszeyJ94`0fUl# z-L7kg11y5i&07z8qX~rNt@MeV)4YP`4Ux^h#r$K^2*W?JK78y2-{zJifjtaSH4QN_ z2vRJlaKS>Ai+Q^m8HwfP;z6VOA!MO8BS-vx1}9q^msH8T(E@S_IoRjz)z%M*g^LB)M&TBnI z1K%X^Pe^4Bonwd%E>l{iq^4gGe)mdoyTAN5_L9xK>x%|{7Fkf&-RJ!0uf&_nR_ zSPja~#~r~wPJ8!-O!n2Q`;H95zm4w!nJLW%nGdjB@Q2#(idf=;an=)LWxlo>@ zmL&_J%E5|ZU|ln8lnQxV{jVh9@ods`60TeO58=eT23&??_Ttia#!v8lPxr$7eSnPC zKk}by@R)%fgg-_&wsyYnv1TYs)9Ca&tG(C=NH1x28S3j${(L<;-ok0BfK;C$>Z-u= zW#A~FGnORK8p^*$I%zc`NnlSxQ0~|N1$qOT@@HO}aVxfo^ls_p)Oh=k z3dbO(4eCpmF1txXTfiLaLUCUDp~Hct!PYm}Vu%4*gxPRO!g!zHxY=*F@8ul7xm4@% zo+5}(yuNwHw*z&%jRvIziQ9fzYArob>%$-$NRgA7>f2zl8StH;+NbkbKV@HKy^;3w z(f41wK_qU}>UNHnMYRvD^y~>*q$dvsM5KWA7|C33`~q`>h7)Euxr+IVV7t2eqBZz8 z6ff5HEsQzN-?wMsZSq`wLp>|?V&#G( z;b9OhtISpDH)+$e@Kyz!XLNYcsB=!Pm8U1X#QlK8e8i|mY(>_|rOLjb`@dgC$G&+GrvhTl=L$CgX(*~#z1>Y7q-UaiUwlOPF-Z7Z7eVce#DN8XZy z0Ev%-4qje5AXcS2aPAu>@9VoMZ`7T@S-t;5{hqMWDJ;m>h?5BJGeC;N^5Mh`Z#9UG z_Z)wr*){mHjnFY&|3%x$#!{SI=q~ERx0z?&#Tq5S7 zop#Hta{>Bn(cRA^4>eXPE&vbs{2j~4Ziw!wuZEuzEaV#`!2@=4y+Kzs zi974LN(n9Ojd@Vqio_xP4D+w+0s3VJdT1}-)|fg;{B#^95t&MKsu70d?j18mnKZdKKd%{xN0Pg%J-i?PzV)3S`EQ?b`(5YL&zP zw)3m(43hVvy9H5W74yA#csK;HP%!n3b%gIrT&}VDK2_?kJe#S~eEQ?UQezm5KYVd3 zqBgWlz5dSihivtpC#O0l5ASR0#eG1N2@3NJDDx373#RI6dsN=CF5jM2PD=t^sQ7PE zib#)f?bb!-q9p0Z6nKse?=gt0*QE`?7;<{djn2wQ%x2VYdo(sjHN%UGT_Vt3qF4%}_p`|+R3+kpjOnlWeO z_IhfR*C)J0+Vt(+xMIV>o9fSi7XZnA3?D3h^5P*6a7bQ2h(v#o`!NQ+K|TXDn8KX?RNs`YfZ**G@_8j9PpHym$bP z5(4Luf_Y;H`R_mRYkp_P6CMoRr}T@` zuSazz1ugDL-|G00s>hBxiGx>D8R&i0zX01IyX!%M4fr}nW14^R>k($M<Y1MoPh@$HdCQ%gjzKyvHyiJSY)tF#L3G{Di~*6`x>n94`zii`XV9AK0`NlP(`|2CkcS!s~SD z)SCwig&~+OS&^NLy(p8@7qPDGTYj!#+?(?}GW5#8KRo8J0>24tk>y@dmz%R!rk4=5 z4&>DUz@#@dOX;BBeA_7>PT45+RkXzH#}|}gZind#pnKIK93>%dvBNV)LdBCBP7r-X z=&-QwShR6bJ+ERlHt=NqW?o81O5yK>mHUqK1+d!8erBO`;^Sp2XM;?H*_U5iAcGiK=)94RYnj z7g&kbQ7kyUzV&x@UbR}NL5cogBtvbgS2F#w$^IpnpP|UvRZey5VXnilkPB2)#^XCL z(00&rujUj*uG>3Eu1|Jf*QWRC<0r8O=dP=VAwKL6CsvLbgG-6{q*;3@B+4LTB>*o> zw}jc;B?Z^8YvWGKz$I-nkLCsqzkCX4AO3)aiWT`5=Jr~-W#BMLx^0QH2+I7-3%omHxfUDAb#%nX5%9*E<6$?yx z6j$k~D6V>Sz2-&lx@-4~@+0T#-zq{zd%?E*=9t<3k(yRK)R7(pa-nf?f`3IO<>m=b z6CT*lZcW(Iye{u^Esb8uT#m&c*>Fa=L~E2CiTXy0Z$Mi15wwl-^dlM%0v&eSaklrR zjPup^Bggeh-KpO}<2-}s)*eDGw>v2dD_#WeCA9RdW0B!i@G;aySPzrY!}enwZ_VOl z>h@|TG+Q*^NA&70QlQWugx!VBjp3T4_I`YYB4@dkK)fQM6+w6Cv9BKkAVE(|WvXTh zMabQ#g4 zFoVLZ7o~OMmo{V?hmP#@T6q1|!KTY;uABt?j?Xia*}r(CeZTLk7 zjNLTMrI-l@!(rITSc!UV4ZI*T*ff2X8z6g;z{QuQ4=t}u)LXHG3nGOM%L%0EG29nn z5NP{7S80`0M|FrcZ)cHifZ zqc;c7{NC29NAerYDVnZVAU2m`qgI0#>f3H^{dW97o~A)VQOp)HDqxqsh{tE3nm?x{ zAe|27;#|{P;LjNwjlj=6krMa>0M*q1CAdChT5C;?hLOS>P>D}-8^%mP1%!p3KQ@rT zkE`ZnveCdT1Jqxh^pX$Ch=?(|T7(+sh6(VW8!G*wQCCTdKn4!_-qWF5STPbIxml9l z25ziaQM`9y3K$HO2-qAZsZ)I{g}0)bn_Xm>gbY}qfm2hAhnaEw2{m`(mn&PE5c`6s z9_Kr&+rsN%N)hE#`sz-KCmx&9wel5rqcc%i(v z!{J3%{-GFzf-mg^yDD(aS%rvSkT?FjTEWtA0?bAOXMaF`CyBK9TMv0D0KbG1NzRG) zWrGk>!1vYShCOhmAT9%zp)nQUUO7J^0b~rjb=Z7C;iFyHxuyl^hbWa`A^G>-I9#!8 zsFs+p1@QYw;D`+WK)JpLe26=kqh;{%eB@U?Z;qTgX9EYO!hd@`*LHo5Q#h_4)qQ@3 zW*w`6W=Cyp_%7IQG@pE}`FJn=MK62rmn7v`9h)G~?>dg4_*=cUmDKI!VKh`Ox}LSL z)ndLp7x3-5H=Nt~W{B=gh61I90Yc}-}5szpGiT8{GL z$LC1pi=l4->V~8L%7p6h9AM^jsv&1eE26*o6zC1tN52t( zl9|8a-kAs7tP659KIcaJkQsh1^yQj}(Hm(l5^_H*GZP-k!KrJcLEsNnRNWEH@D;XV z23`1ecOFTv!csr>Pk#1>t_c4_jXEn_bjV)CyP2NR@9D7%IEIOz%$EkT;&>Wt-kL1} zZd#7wDH4u1pO>u?U#Hje0M`-wmYaweTPZfQohi}M{{pzPgbLgdusdu-rECD@1Y`r^ zpJECKA~5(g8+-Nd3<5~8C9?sXsh0J}Dh5=?PV&JQeUQV==^vs1(#4eEl z;=I)f17+(M)^aA3edRT0(CFpgYZNwplI>a1c!@G97k1F?&0&r0POf8`AjLmyF~ zV?f9{4QzoQQU@jm#*}|GVLJhJ8X-gm)%<3!6VOSH@hO`IileiOJD zoIE7qo>GOw$#_LUZ5(tRl9< zh36_?Fg3u>DgGPYL@(L_|MV4PRTjwIjB%IZlHs%ngow3p4KYzug%|k>~T7EWvMK-)lP@fvY6RqAj|v@{&u!M2Ha8k;U34L9h>9 zdg$$uV6OdIv|m(SqmcMp6XZz;#Iwi}bhiNg#UIy|6TTBnMgRvn;FA@Vl-XuEcRZBY)pIexyOwYF*4R+vu(inIR(VmShEx4i2%V@~7nl#!NzY(bZT*_dO))YZ$$G^Wr`XNF7 zE#Zh~YvajGtEp0KAyCJ(rgA)S{KbFI-!jfN?znxg{jB_7x%jO3QWGlD0VfaNzs^$< zhl;JZh++L^vUDyUg`Dk%1Jzs)W$*8(+2Lo$oBLTui?c}te)sdGpbft$iXIx@kjLxZ zsNeewopBoK4? zJEWD0KZRZ~1aAXS?wDX@Xg#b|Z_uYbP**FMd!LCUg-9pFWqgl6hXfHHcm?i@IQj@{ zU%Jz-OD8b{DK7)ipYt%>`KNG~TaZ7DB0LR^b>eD6JMk8O$gqBSVyWz`DK(osiq(;L zvOeZfHTjd2-!KbPeL;j{OvTFRCk}!aB7jAeL8f72X`BvjL2%f5KCQ{Q2@KNy^Rwuu zYQVVg75M#(Sa#Ac$;mP%I#W)(AFoP@JW{v$_|SxN<@u!eyy!j|kAAyEP;WODe}>*9 zfO-3Q!*(e&M=^(?$D}R!vF5)rJl|Q0I1{s%r@0s0y$PQA1 zuwGH-CfT3@>q$amXc5>h6NpDmF^$lZ$+50YJh5eI7lP2^U|A zbw4*NSd#V2<^G`=@ywyK_I+?7g5&Q^Ysl^VpUk$`LTTA%k*L?c3Dd!I;oqO=Td*v= zOYdOjK`kdYho$fHiut8P^^v#nu|X~@4rd!ci*{kZH{luAK)rf^9FE|3j|77F5k%hA zD?vDk+UMvkc7XnES;m_ z!VW`OkAhm zNW6w&x)%tx_C>?t-KKp)GAO6TDK{|KyUd4|!eYO7X`9PV+tF92*G`pQmdy#f1)tL( z)}@5#0{@bqn$0dbblO2na3?{@d?DU zfeH`8lMS@^iu_(|ClbNA?zoT58x65>^-!xMHkcZ!8;2`DCUvvxy?2ZnG@Df9PM_Nt zp5BcG5yiKzgpm0alq%E?GQi%cfgL|+*XP6~m|~%=>@R_uA6@?Uk+0dkpcc<+;6W8m z5@NF8$#!*^aqJ0@f)<`T38cSdy!CNwh#QI!gXM`BD9!Yz_ZDR}USL7t?JftqT zR-yUZ%W(uFj`mydswl&kEKJ$elpHH60;aadxAD{wDkBsN0YUGp+<+Z7JcOoB7a1AZ z*EN;EM*Mc}s^gx-j^7w1kd6d+(ahu40?>ORtHzs|^Mb9lT)!N60(Zg@iUBIXWfHiJ%pQZ)6_ftF+=m-MDJs0|iOkCK7WHWdcMhF(DUi?8l0}cx z?`%L9Cs>g4Nq$u)H)7E_+!9CpYR%Yk26`R>M85m5Y?6Iu7~wv^A%6BT`Y|MYevY^B zIK%wbJ|fwJ4u4Sc+i*3ue<^{? z`$)I#%+Jk~Nb+e;uzskahdvt*bpZDmM?x*^!aKcu>H&<;c zXS@8z@5L`ZVYut6k|$M)z9Tw+89wd}Rsd-W>{I$_E95juo_Y`)IKcduYAB*l2eQA4 zf`WbzBDJ7A4*=ZB6Qcwqd|B|{#+-sUpJw)4)~3etpz|RuEu?~lpzq4ysgetyB3EcO zl#`XHx6xQwE40HDI&QZ7#^tt_( zaU6m?1Wm*G1)SM;B~q|~Y*g2<;ws7v^ND*u!2|RYfMU<{X^+G(E*`0j38nkzu-hrZ zdpbT!1@Ra=I-m#W$pBFgh~1X$)rus4+(}X+khdLW0K8uG8uYRYI2Y>%KZbX&}FWbRIa~3Z~#Pa21#gegQXmR4^Sppu{IDfOnmH z#_d#q44)|E8N1eDj4EsxL0k*+t1xQXK$-z$Z}csS%ZjRfH=g}&NH7u_%si+6 zfrh4tHP2akvW62X&!YTXUyJEd_IGKi^4B(&jP37EY-c?pode|W$TI4|2A9bTwKbRORxjru?C+xhsUbJ^QmRg#0{vaBr!CBsncWC<0Pk$r|GEoGzKU zg{4&;VSF(2=_rUj&81`UEU>hSoj56Bp-n_sjvPQA28fNkoc*Aft3JT+o7;cf$CE0K z=5$^xkIe_^#)MbbkpvMhW6AR@6%$&X5B2hn_^{5~8u0Bkqw!`3bP$bD7Y%JBMokKN zf{$@sggd7$!<7%871E!w*LhtiT-b^ckSo<<&Fk+`6bF%O9A1TTBbfhZKzE5o(96od z#6P1nBYese(!tw_nuS1}Kg;)Z0k$8sA5zsMRB=wgP0&|DX=M}Pb>K4_iO??8AkZK< z8`TLKa~iq=WP!0*NwO|XRs0`%VFt-tG(KlFhUY7xoX|u9@2eAfvy}e~+XHEK8L|{~ zcXGDteSIkG;gO(UekFiRe5?lM)ka7+;O|||mZ%gckt|;{BwRluB1#K{RAe1pF%{mg zH#?Iv+(ZTsJl(^1ca|^g-HSTh)q7Ffo}z3^RFK1FyE(=Yb`uNcjt-|^Vx)~6RLKQ&GUPQ;AUq0< zbpYn$a=9o*FzNv}szsQGAmu@g;5;on82y~!E+m3lV41Bs7S4EU_W&5(JX~O z7%EO>E%ONC^Jzn;ZYYs5biRjin{&@TA^y3G$a9P{TE@ta*zdu2t6wo7E6~1a8Yk;s z&tDc!fkHoa_TYK9cH3RHSBP|zm0>S~@BI3$-koaLz#BR<6Tp9TU)O;81vH0^eow;b z`_Muv^vuYEVGo;!N@Q(kvRK5t(*i@K?N*!T~&yWK86_CTpS>K%5QQW)M# zvWa)^C5mBB1bQy-eFEcESfZ`Q25h_9`k??83* zzi+qQT0t4P?}q)BBR_BOued52L8@N@l}q2Sl>PQx5IQn_MpB;OUw| z>Q2#0G-4`lmg^$-zrIe;T{EX_1j-kjrrw=;ei55H=4b~sl!u*{Epw-SHVM}yk71R9 zL&M%@$dn~FSYh#(EHX!juuvXBt9Rc@v}7ww&*acE@~kPek3ww~F3X7?j-JI>`@fMP zWwirPoW6>{(&JUU004LWC(~_MGMk@)4LZ{v;3T zJ(XmCZ!(IQx$@R5fdGod(MXb(D-A7QXfmLzfc9pk;H<={>*g((j@3I|sJW{3ZRRW( zty51?v!w&uKFiS!)ZTd6gDG;qufBhkS$|M~JEwkleYODYDX+h`o~9Cx+fifO49{B0 z91**u@)P1Che@qGwx+r!|-4IO`2yUsMk)RRyk6?DyfY>{9q!fDbbup{X?>p9BGXE4G`J4>v}T z&Vm#>M7*e~PrU=1w%%HirZd%h9Z$}GO-?vz9(5_SG!Tsi4-c5 z2=GELRzMp9o(?;+54HGNTma&(MDPNlN4_ljO*(6I{tl8E38PNdZ?_(IsC5~v*3=$- zjQ0S=(>lM?GM|XnBPwI2%{;%u0X(H?)93lX*NkZaGv1^rac_lPWl=o@y~+R;qh+AF z(+4j@xGW+S`h^fp8ql2K$s7NLjO{$^i%ZwQYDOu_G;aWyHUKNfIB)TfAtm$iJcY}Z zv|Yycj9QU<%ptINe?HYeRk!%gO_j_A(`FU^zt1|;En1n5#9AdrW;@~EB_Nun_K3f4aN(cY7HpS zd|s#d=*K)vXcqHZP=ZV3zHaetW$yaSxo&>pKf=NtApxl3;w!g@42?NUZMV!+c_dj0 z4`HHH(+8dPJLaAXpN_Q41^cLrZ@Pb<$ap8Dp7>io%Y;#63)dblz!sXqI-23*cDepa zgNhQ`Keu{`*ywl+weOq`i0HI*z-c>k^S*Ki#xA;o-^0EVmjC9rISfIS2Ltt7!)Nvw zZMkGm93c5*P8@z>h&h8zr-VO&3;gT?7cOn>8DY*(&l+Tk5!#V6d1hXn)t!zh%)g|u z@(VH<5ljn69rUnn$K(>aNE@T`$sgzg+KlIoPn8A`2+3~9Jka@s^E@#5M41kVI-hb3 z=7ACNnWBDJ*S_nGaPB^Q%{D~`wk7zX0%iZ63%sc0cVrqoU>-->A#B0v=>n1!p~ss5 zFbiHNF&qo-Ae}ItKOOkT0mJ7`e*KOma_xdjely_jJXcK-UE88N-BbuzJMgH8^_&9I zEu%JwgP~mleD>y7*@S-JAl;BkOY<{ogJu4N_~|K z{xqNGWlhrtxj(I)Drw7IS#+-b`Oz5TpCQ_Wn=bvs4Pyd*#us%pAj=9uNFIiF_`j1 zn1@$MhDb~0BLw?=UPaEaHZfLB$jjU^yTCD%KcVoND|r!{+P*+`pEJg|Ss{5FN-UBS zzrY%UvL;xnt`x!_C1D3r`I{B0`11@eQS#G9%#(*=p^ZxNvIKct#NMbMy;yS(oU$>0 z9`*cJb6(P0w-g~+3A6Nl>^_4cl-&JLQ^sKpYw1FUwzsG-CKUyt-h1%+1M2o6Ob|&y zaS;uPM{2K(uzG2MLRCVfGHS{OzzZyzu7GKNQuG`_?UbR2F<#j!0riBw0N1~WrRWaZ zrJvc#6zgmS{@(@1!OQpH_uRM6BH1@j&^L?;dfE5?gzEL5Af5lDdT}ywaQt_w7ZdaU z0Nqjba4`L0>)6}5h?+VZJ6Sro*gFw22ss;@+PM&Nu>Ej%L<}7yO)bqWTz*n9{KrfG z@q~_e_TQ*p96ul_P7e0}3iT3IQIpgVrxCIL z?PO{CQi%^|2wkRk4E`_OZH;@AHMg$lfC|<5e^{Ls!WPNs&o(C+KQTu?5mYN^jXfBq&e6?DI?iNsna^Z=Uwpo|eqX&^^;}~h0_Fy-3br)2|ZN82XXcx33&LnRV{<(v?q;RwRgf z@Fyh2S0ygsfx&P01Vc$I?|R%DVC16tb355N5#hpqNCV+7T6G=dRXlkO=HkBZ*_5|G zzCk>|0BQMDa;9KzwyoN&97ziLZ}{IA%n$6h!mar~yKiDQ zTucc79`-jT#oc-eNE|~3Tw>(gL|i9{2j@#S!k8vQ`)2a>h-=*;EuiucwD5l{`{Ws< zX_tg~j3D#N^JVdEsJK~BHSP?-5{5jN!5YR*$Msa%a4U7eRGd$!S3&mt z2k?PSbPk#6O6g?dU;Y0XxDna17=l~| za_muNhsNyz!}h6#BcfYUlc7|;Zbf+!xg38A++zqatejrtMN~=vf%FtYMnE6 zzxMz4;3CWKDQ?u5?rjFmLh{COtY#+Q95HQRZ;sJKvr6yE^NyP~5OZMW*yfD4iGD@s zmi>+<#>^&EmIC2E5I?0kBq-c1;+HMGwdg zJ8XZO1L#w{sv@RZR>r(8VyvB@Z7Q} zOZQpgXijQo;-wS!r4)PBunjXdGRgyYjX0`%tSMzcH}&<9nF3`K*N~ZKRn`4+Ya1Ak zw%xe}yhpwD{_{yN?{tG@?)7Z4<8k+&EUHoS2@W&lqB2zJ`+HtBJ%v+~k`)y4HU;~> zx1^M9aRm!P^}2{u&!;g6~M~G?qV)b8bGmhZ&)Dc8mb;ook5m$TDvEC2oQMc)f zmP!gcY}one2s&F`6eZTI%7baMmgPIp*3zk)-9{H(W0CM`>u40DBEA{1tTyR?KNW_u z{4rGjr+c5Jbj(;&utC;U**%>SLsV{k>N+u_Ng{Avf3Vkp41MI_E9M&lJt`d=c5pLm zz5jWQH$Qy*=o{%Ey#?2Sh?eBWoQQSzV_NmQN76dt&4MPN_AhdFs0N7;{k4!Mc`#)r zauU)$GkIIE`Ya}SQAv+edi!h27IvA;QGtgy$&CFK^LC(xL+|{>*&DWE({{ig-#=xh z?P0TwzHnA*%inM)1Gg8CGwBAZF7WnUmAx~Sd#x)?wxjGJ`M`pxK3HbLO5m8nW3 z5?Q241e5TtZZGRnwI^0u=`}cSTD*rGR5i^p7a%aQ$xWZKrME(F`Hp+Y{YJmF zk>O~~I~1JR`uIkbW=xyb`Qt|j$ln1<*wzdyw7uv|U_n9$T9ga~Y>BKHbYe$CGceub zRtioi_N4;OvWv#cEaW})6$YW^OM?erM`bK0%tcb$GS9OG6LAbQWuE%c+1D?JQ_JDf zad2l95%VgPJX7Q`!)9$=Q&5FsgPUm%Y6sm|pS$^y>$uf5R#m(jD1!*DE)=l#gxiHi zO%-!_ScFC6BNYfXl{J|zp05^Aq8R|1Zlij3Z@4DKzk4`0Q(4VnS``{7AVqEtz zW-!wegN;NQN`~0U3KkSCGpsi3cuYLDo@geSbOQ0rZgS?vn|QyGzheWCOnD?sRe;;b zmD+q{AvcA0h-M!QNVl(aU2$+DFNWj%>Y>%J? zx<3WJ$22bG$l(BzPLjsAV$LL6(0(2xQ7PlUlf>g%*{S=bNdNGRg2Pquizu@y_>Zex zhcra;(L|Gb-B7qA$9CMP%_Y^81ehHIsbD~M>NFTvrl7oqW{;j5fRzmYQ_`o2zu5dS zR4T%;awbhp_C=kvm%7DzKF}`tZs=h)#@i1K?bB*g`tJc;8X6wo`;%1tjBzr}p_h#O9Z^;i&Dh@1> z>nKpMGuV9=$=LbznCw|zu5_}t!;Sy#K_L&Knz!sXGih zS!(-}`vQg3h;~X!6Pr1S1?;)q$TY7%xgk6_aeu#Fqp#={^}$Aa*W%b|AkLJDX1q5z z7j}&ksB-75!ny2p(+PvspE^coVNcX!rmL}8m{Id&wqEgv$U;%Ss$cB!EpoOx=nS6h z{Yn85lVnFVo1*U}0^izapNFDTU+=59^wH)qyv^U^ZRDGo96W}u_&V8Klfw71+Eys0 zVIZ^2?7G#z5&txa!Y<6hBcB#V|3Z|4uwXR~Et3koHEDfGp0>B$6( z>Ts1+Pd0Lg&If=>m=-p~Ap$2ZL{_jE3bki2x%daXIQBq#(h(ahC%aayij{*|R)`$mn9H^Q&qykv(I%(7JFIp|qR#AQ( z7Q5Ix!vVjK#ScmTNnjj$jqS}gJ+0nIUU@yz%`NvYW7Ut%NlZ6Ni+Kni(wz$LlF3Z_CWfLZhV2Jf5LC z{klUhyzbN9yVgVZyIhVK?YRNQi^=!A*^ zag3Zk<>P%K?MklDCTr1}SDi;C!zW#)9lzY^6;B*n@Nt8hh-mJ!W$4{>zRUCDX4xe# zYD^Z9Rz2f#kGC^3@9}bQFkbm6G&{22@pd-#br|1CewNQBwT*`H*o=7757@L~{F;h~ z!DmGgdVulu3G(Rm0DA{r9CpoUW7$~ycdU^CnrXavn4b{o-7tSdip5?wh((?YqOAM* zXb?74-s`=~4KqZFHuPzT#GGi-iUpP#lXFNZbykJI`?{Uw_EFqXT72(O!qXUAYv5Iz zl5@8CxwezsJdbk~HK1H_9n9?iP|w-a0W+2qrQ^|6!Jth?3-R z+Blx@5ZL|0mz8nU__6fQ$xx=DB$C4_+!{T!<~&?gUlHisBTwbJ#cm9&T|ympKnYs* zSUYGYki6ate@%-xn{`C8ewh;mRk4pqT6=DR)IaJj2$!$gcq6v(jITozaTRaxACsURs@8pZroHFf`@PwjcB~b}?QguUA%OPcR!vaP- zoeV;hJ4$&1Ms$n`MR*?03QJf_Z^;UZL0RBr;edaU^YXM34N0nQ(UtVfu#B8FXKG@>nkuR5$tW(}l6`g^uU> z1L9r@j5ql*AQ%0PrwT-Te8MagzVS;m&bIE)%Dg10sJ0dfsNTa#ec$1jDARgB)jOI$ z9(sMs#*<7YZ++flX`Y!q)m*!jT)CS`kQ9JSohH~DW6C@?q3Jrx;TgIBLWz-Pm4$C3-d@LmO!fw#=Ac`qQ<`r7At!zSw zM>$Wda7S*U4qT29+9fInM^~ zGMUXTvzKY7_`LVlZDra>J(_sfF`{wAYsG8wG4W!!4m=WGXiKe<+BwES?k|>cYiGGM z689{O{T=NtuyX4wE!H}a++9>*jr`^Cdx`0$ zXG%8{!gLZksZ|(Rn!{Q1#mOmRYOC+?z^PN*`jFxn4-5TjZ?% z*>f1gjOiAbLBkDp!S*=67{ab~Oijw-S5cH#&pyHw2kWE=2ER{=N*(%$N2J!xOvCm} z4-%q;70_X!5+G*0_3GIR(CQ1!kq$F&jzwAb$_Nk2fx=f?_#@5sv5{@vfs;+&D(qgp zowMVzaFr7F|}F<+lS;fa?aOpc2bM_dcl>L-0hd_vqNp?* zoMWzez^_jizcjn0Qn0AJ@$6?)%Q{;i9}b@pq1MX%D8EJ@2G6Db#eG^`XA?3~{CeTo zf{0;N2b=XDbh}JL&(;RBgFoSpzV^6A^8`UT8n`}w(Qq;f#xLl3`{8m>w)leZJC!=F zM1uSfXFV*LWVUbc^l)TTMA5I74eLkw!Ig2l;hmE-vo24Czqo|}S0brm6lCgud@?o$ z;oq#MdUKnZY^CEYVMj01YpTd7=O}IJP42zSvZCsPfwB2Aj5u?tWn=RXG&M%=HQ|_z z`I$Rh%>-J;iA|1hEQA;Kjr1#nHlCL?KYL665Fyo@QsX^yLx+T<)`;x@y~JoI5QWzwnJ;LF%loCe7zkYL|ML%17ZfS!F(uq8z)5m3P4X zfja8K@U(;Ua>C8Kae=U~kK^Cr7ab@wJ6Jm|Lg)00cRg!HYDlGsBJkLu^%vws>kvBm zpnGH-(>TMzjA9$G>uRt44Z4{b{U805r!z>*mAFlq_vLGbO}-Q)(ln(jIbL+$zKyf5xq87RXXG`^7hzwSM7Zsp z`O75S3CYfbiX9rVd==k?cQ1F7s^`mm_SbDR^c~|gGu+E9`9XQv6&o&Z5EHdZTI=VZ zD`h=b%6XICe^6_c$ICC%sFX9Atz<0|meFW6Gpjrf)#cw~k|}-yB>S|``@@L6%OQ$N5rq2vKc_hY5*GcFLlg@9^bZbEZZO~wh4G+L@_>Q=pzxC}QAt@* zWo2nL34JpMeLG`a9S&5kBb?)&QJ{Z+;~727@N?+9J#vkroGvF_qeqFIfLuqYG(JE| zo`3p7rTjtt9seEm{iqy}^5=JIA0YM55zb*6AXF-#W3Z#&{^1knIQ-9CM}PF|s4Wx@ zDz_0T)zBe6(03H>A7yclmpg(VeIBp>U!G6&<6rQO+WfoE|6j*Re)@k(4-}96=??u< zkWY&2e{hHXgP@)CiUJV^D1C6;D~b}LfANZfcyRv3D~j@E{;7YCr)c`qEBZ$|r6aE> z6b?hFlKI#R2;n0RAbvYMh^2jpG;48jxLc-o>p>&NT|EZ=?!KaEgYfja2{3M_|-P>c6d&sX&#V_A*PuuFA(Z90hcHfND zBV!ADX3Ze{>br;v71u0irneD}0l$H$ESX@0B(&p0=78EY5MEf9=Q(>UtbS!P#ScTY z-S2rky?Gccc|+whHznegHEW49U#CyzI#H*p2HoK$z09Bzr>`cj>WQi3jmg$Pk-nkp ztCXSqkSU#ZB!n5cd|jJHn58GTirK2YXyA<}&cYS;yB3OxwGNXn57%R zPKDx;>gAdkEy^4UF4zJMaJ<(&@&P6}s*fINYTaF*53R76`9ftcT$*j`aLI$3-1I`s z5@w%9NEBN!j_AWEhYOQPgM%)O9n1ScBPIz-e0qCtAv*@C5BTnrxK&QC(cK=TQASsC*TykaW`}R(pTCR%lLifWq-bJsOXbMkINXmlLnl+yf1XD{e3@tc+85OG2;vwc%k3o+WI zUhR`-Be$p$U)nXXScDF6nl(7Moaa*f!;OJ3Plw%)*>IgQt|&0ka>A{(=`m ztON;aj?7d0)@<^#(++9wTSl_e^rlLAk2}K!+C0}B8&COaZ1d9?SvgzNb4|-1p;0&7 zJuIqk^u#ZgRyy0e1`iU^I4;#-6fkU3#l51j6@4pafR#<97R537#1$OKRP^;maoEQf zrJq;&dH6Rhwu!a;TFmA=?_mr_oZqM5;!dv}?;GkHs<~%mX5?ySl-vAx0EcS$QLoAr zj`6l@d~tb}NXn2$f3<0365q}Po+iT$Y;229H(8U}DE+=#Gi14085OYIp-I=KCL$ic z$s;LpJ4g=OF|8qphPQ6qZceZFj^kS68WDLCdC%vnYmPCph>BOQCU|LBCB=+X#XPQT zzVTo9vPe0>z+wO3k*FUJ_W5|Ss0c|xnGFX`f+rP3*UrBjVMvxzowLel`xdPE3_C(k znr5h1K9r=&c_3Nel#R)Pl0?wXWBBoGr#o_%K}9c>O`c)*{>HA`Xdkkk?=aZs-*4t{1YTwn- z^wyuz&vgCWXcjdeRa$NDtV~HNma9a1Xuf`U*-7%pxDHpAbJ8E zV(GbDnh7n@Dd%otjuHPS*Y{F`TqVjvwL=M7NLLf4-Bxi|skaGMZC974wN@?lpxflmzI)+(YXv2i zQ^LrIw%<2}g^%p~0i0qP7SVHQHf?|`S{YVY`4M+mDZzwrQbU@=~ny=aH zrrxRMo^J0G4qK+x*t)Vi-?-3|%#qc7KXSkPE`JJnXNeu{UGHZ`Nm*a6l5uPZL^ubI zNgc%6e}7N=rPF9R{eV@&<7sRDEkN8S;PF|V%oKw9Z>d^{4@3ts=H7X;fTV`4;{~JM+;rX}JRe1Z3X_gC_ zxeS9BHaaNyS>g*z$7pkq@vO6%lNEWhPRbwlv?5wq#gxCuJX3s_R$>B8ern*OGPz4e z7X$P(nkXfzpg&wwmNRUvZd!d{wlFTOz4S@zLmQ&E!72BH`!}>y9#D%(e(*;GF$5;h z2nr!pJUDO6Fi*`#+OD?^mqXfxyo~fU_aPe}nJGT$MibjGBE4h91f)oVKQUy4cD8t2 zU&|8|vBcR$Mmq>>Q`r!2!;m4dwJ%#!;-p^OXb%0v*c_blf%2DjYKC0lfxKeT_U)j= zo3ZV5P-KiwNdmoZs7TBEXg;=}&#@N$&56aoVO70n4bo9?NbC2KJhN9n+3BPe5?!AA7TZ4SR zXmVPj51%Zfcfz{A7)RK^X(-}}t=xdfD9#z@w$;!{Oy8?h;;yX4K}I0nn9o1#shuFX z*IlOq!V`(LurSTHB(#t_k`G*9S_r!7Tg2{zA>5>k9$aG_tq=M*vy@Mk13SF-QA z&lz_M@~b3{Y{|lW-fZS!!b(F!f%50oHgVRfrl|8PEIfBUe7;CCh$BGa|A`BpQ(T0%NvpB`m=hl;5?a1a6YF-;Y!l{yV9$f z=h<|WOG*)?WO6dU7{BpJ)YJsxVJ}M*gbLhxBsX{LbQ7*gG#OZp0R;Q$kPuV`dpRv}xCnNa#SJmE;!tc}KeU8F6 z>?1`H7rLvWLPGpTE6;-?V7-npJye6CtXC(^QBX50@&muD5g!TW0MU5^q8@29W3l6MepXuKxh zxqhX$wDSS3*;Gxs@+j@uCZQ{R^{hkQ1SSiKL>*Fcx4`@tgKlAA!V}6=T*P*-?_J#4 z;wsS~#ER~co(b6agjewnn?a%y1wn61G0p+e0d_}{*K(nf zkCRBqdwn1uA)#13eUw~xwHU{*%a*S{Dwh37kSbM&)Av-k%H<;V@C4pVvo{RC@eDM~ z8Ip3vpV1d6jl00nCA+XsxqblVEsSg|7COkb6Wtl%aro*LAz|5YwzK~E4{F9PY5m29 zb#F72;%;pa)X;LP3?FiZPdL%`MDzVm?4 zU3`Y$)gLpUUX&FwVlCkA+iEc8UGQ1QmCD5^+;)q_-N&P0VGDkqRV<=$(TwuS(>$G^ zBEw-^v*1?b26ERwW5s&xL&mDj_qiPA?4>)FRaY@H*pM4(@pL(AgK4Ctl zO-{XzA0Hfip3Ny=wQ%FVAj0RfL10g?Zj?|<_Q*H71P8&K@%2?Ed&Xu}0_3~-7QCr< zME@bR@@MZ7h?EsFzX`u2RBlpeFNAtm!^une8@JQThq4cpZ_Z+yvE~>QXR#aPnZaFR zZq`2<5?|yRYnXB(rm0_ZqS9{A*jBF&S)OD4<@t;6SGdOqONH)K)enq;VU(fwvcn=I z7E&WqrFs}dQogv=dywe{vIWYK*EexVZ@yxcUQb7+-%fW+zu)USdq#hbg$GmcaV7P; z+HxBLK}?rnJr?gceM6Rn$XmDxADHhA>x{jpZl;dV9eTj7tIva*f9I0=LPD{~qLgxz zVe-|v_cjQYo>$f-KQRk!zL98#$aal&D0E&6Sa}nz1#c4JKKDvY_aHznJa*4*>!x53 z<2U^+6&BLoA2=?7gZD_^-B2QPeK5yWtKkY4xYQhlMZ00TX3;vOwuQNbi?8~`W0t}S z@w_NA>etzLPv2q7FF0<^e4nv~=s3KqK;+!-8MeS~SElfT$kqaMe?;bL;S|abotJ(T zXTXhb8+=WyKJ1Mj4eY*tjki6Bxv{Q!kA`_iXoEC?MGM;Ah}bzt?VItSwCoCk!nLQs zirh-`%-bG}k#WQd-3M7$+$Gk)l8p79!Ew3WTUQe9MA)^)VzF?|_Fl3MZnZ6ulL!}D z`Wfi)+@Y|zOV{jyj;eu#=!pH9)J-iVrTkWZtkyQkjF%*Gageu0Jq>l(7~381RzAJy z40)9jP~29wSU8Z|9`LiI51b;NMz0Y{e0g%}p>8{4iqIt9^-n2%n0oz0cNu&kZjT;! zy<~*I#`P~|LZVH?A1Wdf>!(8`u3o3vVM}H6vctd8O&2NREL6QHueTnc5mNug>P67> zO^ZgZ92Gm~bWXv%Hf;LQrM_DmspW6=ubeLu&(r!ux_V)(PfJD9EKs4BLL-hSHMH7|F$Vfs zIFh9?(|yxfvOEuvk%8lYNeH zkd|~!iozTVyn4yerP!$@Y=RRPPBOxo<007WSU$*UQj@TgSjJwCAk0ona_pshH1`2U zF*>`M^(N3KyivL#mu}5eiNB6ml`{t{S=vLYPMxR{My{aqUChPNAU#K}@=P=}vhVY~ zMHBsqNlP1zN-+_m?@cM>oJif&4BDEuP)fC-{D#y_!UU`GF5bmn1}aYa<*_d>Zxe+; zyorThzS8$^$moid6zx|(mo!W4)jcI{l2+Dr%~(a(pTO*tTrT?#-H=c}4>6@8U}%W3zKJ5jxlb-3!0;Tsk0vVBXmL z)n3}ul0An?r}ve0oT`%k6tPp!ze3nQ&SR=1^%fL){=ggC2#Dt5e?J=kW%le-$Xjti z)j;`=FTQApGT4V_!^_JRx0)#M?~{<;`wtE>=~1 zsHVB8pn$mK{dDrVN}A>l`Fg4a_N(^rmlYT@>ixt~)LHw54!fU*m~*u*=h-=AsKKO5 z`;ZD;*OG!RatSoBJlL^aL9pXJeJH-g+)sDD!w=HxWb|WrhT_U>Z)CJo&1=M6x|W2r z3ZoAu7d%(F9{OkB@Klo@mJ4d>@Y+)!`6`^Gemfr@Ls&+KXVKygQ$N!w^1KJ zxa~peNNhdo7l0uUbMGcbU9E7&xCz9*o676k{U_l@f?~XpUIqChT2)EuJI+^*?sH1%u-RvhJTDdA9m&7w@oG=gB!{_ESp-ft;)34&Q!nM zx-z63DmtTD7*8*cRF4RwXKk)y0KnkN$Mo5Ci)jhdV}@+;`=C~(JB#vB64P|qOrc-- zB{8Z)Ma_VuDKo=$i-~PWflkuJ=Fix89gUya$jll)8{kMIoqh>a^|>4Nz=&vmqrx{h_fYxNUIDlt;(w{!5Ph)*80!s)nt=ckvf zkf%|wp9pdPOHnC5Ouu|$V^J~Tpp@FpZ}!CfPeoDCGD0l|$ov;ghKH|NDJDlBJ$Txk zXowpamrQqQ&%wYkuvC>pw#}}()Bnye51&SxL1S=?B=*ZtGucbJ!pnhA1V2f5MrD(g zMJ{<4{-le4vFbLi9a#Ew<*h}twMIYL-dR1VaC;tn$|$LK7kKU6SXDoI$(?266MmOD zTHzVPV9&Q|z8}S`zCKc2bic&S03S-sr4cmhe#4hxv1}h#?ZwX#fs*ef`$Zr##x`tm zvS;gUyd|CL4_($uE{#jR@E$Mw=(RpVT|O{OT{iz>z)#nj$vB^WRI^!l)Na1hT+77P zULm2XOmg9&hVuouQpvYcnN-49B5;rwm1RGcQqlUQxvRc~A75IISguAJ^e!c~gj*K9 zGD|N^XYVz#^&fsH3u}I*`_Z7dn?0I*+*i!E6qhq&t5y6OhZi}6yi|pmPO?FWxmQy3 zdu}1B#;SI{0*b2nTTrLS*7?Y_a8OgveapMq@-i!4^M#i^^0F^H>Gx@alan*X|S2?M^OCRx(>E6_Zsd1 zTsz8^EsQVBy479Qvu42dg{*EYD`=*Do1tmUBs{qI8~+&0szl!;$u> zd`pK;i>w>{3rEnvMaD06=F)W-bv(ZYGD=6jHKgbt%!*m-;WNi8Cwo?yx@lBUXtK6x zeLVQ8HbA60GREk1FK1pwecYsYGNQ7TV)=^&$#+QOI7VPRrnX8-PXD;pEbAJxjK#0+ ziXE258%-lf{(kdfhSkDJqLU03SI-;&nm z%zj+UerZR)0Eup)AiSp_WjQ)I$!`boCu0gOR3t;vVB%=Jecjj~`uNxGe!=rqij^xD zhF4O)wlY<+)3Eb_|`fYlV)iDR|{Hlrziwdi=3E3Fy zn8_&qv+YJ&Uq{c_!tn6q{^zA!FbMF#9d|uLPPv{TN7jbluIE2pcd(<|y8n|E0=>7V z%n)ckyTjH`njru}{bhy#zTCC|Y!IlC0e6jc6)eqlERG<@>=8#Z_g81{>KN+V(sJF^ zu|Zvg1_KtcLjx3Wp&9rJT#A-5*0Tk!LI0-59~UaYhb}&xKa5p>6anr{qe^NWa}Yw0 zX!buh2mL*M7|M92Knq;X20n1$DBGX{EpUtb@Z)z+kGBVy^!_rb{Wc!{m%~H+?mXa= zM^z03IH20&{(Zlb`?o`r=eKF@czZm@{h$9udw`MW4|4MSZV36iS>*5W0gQdv{P8A! zPsqt=jz7lqdx`)v;!&l)yL(7<1=>SeD9|2u@#L(4AxD~;@2lsoaw=I1tr@4&yodbh`Psu(E20_>3AQ&9=avHSyU{G{Dgu*)|gE06heFcJXLy@QIgCmjX zybI$#HNU`|!%^GKlVjtCqnuVJVMq{aCvg(SjewqN1JKW>=m+RxbQmz>r`9|e62gtn z_i$i&LmwNk^qg8h;9&SEc>}})hTdlY?-X6&VD3|T91aFv@PRg7pjE&Hc#;MH?365U zLl8i$EgBvaeo99mL7-Ffh6Dl2C|X%02+#=VFfat2_Fxd8O3>y51w$_jz_@`Zy%YTd z);t9IH~@`!N;jck===vFyfWbUq^z|Irzo1TZC))*J=rjfJ0I4~J2SZ=aQTrhT z+WZ1AV8G~Q0meUt2RpSUgHdV&jn@GAK%na!0LG2JuS3DmWgmbckFR-lHafstpll8! zweJ}}(noDFX}J_EEm0>ipnt$wgzJulfh7P3X6NvmDDVtW40r}M=eBmhmiTag3LL*d OU?>g)!)-Y+oc{xuwCkk+ literal 0 HcmV?d00001 diff --git a/html/Shift.html b/html/Shift.html new file mode 100644 index 0000000..b0ac284 --- /dev/null +++ b/html/Shift.html @@ -0,0 +1,183 @@ + + + + +ExifTool Date/Time Shift Module + + + + + + + +
+ ExifTool Date/Time Shift Module +
+ + + + + +

NAME

+ +

Image::ExifTool::Shift.pl - ExifTool time shifting routines

+ +

DESCRIPTION

+ +

This module contains routines used by ExifTool to shift date and time values.

+ +

METHODS

+ +

ShiftTime

+ +

Shift date/time value

+ +
    use Image::ExifTool;
+    $err = Image::ExifTool::ShiftTime($dateTime, $shift);
+ +
+ +
Inputs:
+
+ +

0) Date/time string in EXIF format (eg. 2016:01:30 11:45:00).

+ +

1) Shift string (see below) with optional leading sign for shift direction.

+ +

2) [optional] Direction of shift (-1 or +1), or 0 or undef to use the sign from the shift string.

+ +

3) [optional] Reference to time-shift hash -- filled in by first call to ShiftTime, and used in subsequent calls to shift date/time values by the same relative amount (see "TRICKY" section below).

+ +

or

+ +

0) Shift string (and $_ contains the input date/time string).

+ +
+
Return value:
+
+ +

Error string, or undef on success and the input date/time string is shifted by the specified amount.

+ +
+
+ +

SHIFT STRING

+ +

Time shifts are applied to standard EXIF-formatted date/time values (eg. 2005:03:14 18:55:00). Date-only and time-only values may also be shifted, and an optional timezone (eg. -05:00) is also supported. Here are some general rules and examples to explain how shift strings are interpreted:

+ +

Date-only values are shifted using the following formats:

+ +
    'Y:M:D'     - shift date by 'Y' years, 'M' months and 'D' days
+    'M:D'       - shift months and days only
+    'D'         - shift specified number of days
+ +

Time-only values are shifted using the following formats:

+ +
    'h:m:s'     - shift time by 'h' hours, 'm' minutes and 's' seconds
+    'h:m'       - shift hours and minutes only
+    'h'         - shift specified number of hours
+ +

Timezone shifts are specified in the following formats:

+ +
    '+h:m'      - shift timezone by 'h' hours and 'm' minutes
+    '-h:m'      - negative shift of timezone hours and minutes
+    '+h'        - shift timezone hours only
+    '-h'        - negative shift of timezone hours only
+ +

A valid shift value consists of one or two arguments, separated by a space. If only one is provided, it is assumed to be a time shift when applied to a time-only or a date/time value, or a date shift when applied to a date-only value. For example:

+ +
    '1'         - shift by 1 hour if applied to a time or date/time
+                  value, or by one day if applied to a date value
+    '2:0'       - shift 2 hours (time, date/time), or 2 months (date)
+    '5:0:0'     - shift 5 hours (time, date/time), or 5 years (date)
+    '0:0:1'     - shift 1 s (time, date/time), or 1 day (date)
+ +

If two arguments are given, the date shift is first, followed by the time shift:

+ +
    '3:0:0 0'         - shift date by 3 years
+    '0 15:30'         - shift time by 15 hours and 30 minutes
+    '1:0:0 0:0:0+5:0' - shift date by 1 year and timezone by 5 hours
+ +

A date shift is simply ignored if applied to a time value or visa versa.

+ +

Numbers specified in shift fields may contain a decimal point:

+ +
    '1.5'       - 1 hour 30 minutes (time, date/time), or 1 day (date)
+    '2.5 0'     - 2 days 12 hours (date/time), 12 hours (time) or
+                  2 days (date)
+ +

And to save typing, a zero is assumed for any missing numbers:

+ +
    '1::'       - shift by 1 hour (time, date/time) or 1 year (date)
+    '26:: 0'    - shift date by 26 years
+    '+:30'      - shift timezone by 30 minutes
+ +

Below are some specific examples applied to real date and/or time values ('Dir' is the applied shift direction: '+' is positive, '-' is negative):

+ +
     Original Value         Shift   Dir    Shifted Value
+    ---------------------  -------  ---  ---------------------
+    '20:30:00'             '5'       +   '01:30:00'
+    '2005:01:27'           '5'       +   '2005:02:01'
+    '2005:01:27 20:30:00'  '5'       +   '2005:01:28 01:30:00'
+    '11:54:00'             '2.5 0'   -   '23:54:00'
+    '2005:11:02'           '2.5 0'   -   '2005:10:31'
+    '2005:11:02 11:54:00'  '2.5 0'   -   '2005:10:30 23:54:00'
+    '2004:02:28 08:00:00'  '1 1.3'   +   '2004:02:29 09:18:00'
+    '07:00:00'             '-5'      +   '07:00:00'
+    '07:00:00+01:00'       '-5'      +   '07:00:00-04:00'
+    '07:00:00Z'            '+2:30'   -   '07:00:00-02:30'
+    '1970:01:01'           '35::'    +   '2005:01:01'
+    '2005:01:01'           '400'     +   '2006:02:05'
+    '10:00:00.00'          '::1.33'  -   '09:59:58.67'
+ +

NOTES

+ +

The format of the original date/time value is not changed when the time shift is applied. This means that the length of the date/time string will not change, and only the numbers in the string will be modified. The only exception to this rule is that a 'Z' timezone is changed to '+00:00' notation if a timezone shift is applied. A timezone will not be added to the date/time string.

+ +

TRICKY

+ +

This module is perhaps more complicated than it needs to be because it is designed to be very flexible in the way time shifts are specified and applied...

+ +

The ability to shift dates by Y years, M months, etc, conflicts with the design goal of maintaining a constant shift for all time values when applying a batch shift. This is because shifting by 1 month can be equivalent to anything from 28 to 31 days, and 1 year can be 365 or 366 days, depending on the starting date.

+ +

The inconsistency is handled by shifting the first tag found with the actual specified shift, then calculating the equivalent time difference in seconds for this shift and applying this difference to subsequent tags in a batch conversion. So if it works as designed, the behaviour should be both intuitive and mathematically correct, and the user shouldn't have to worry about details such as this (in keeping with Perl's "do the right thing" philosophy).

+ +

BUGS

+ +

Due to the use of the standard time library functions, dates are typically limited to the range 1970 to 2038 on 32-bit systems.

+ +

AUTHOR

+ +

Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)

+ +

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

+ +

SEE ALSO

+ +

Image::ExifTool(3pm)

+ + + +
+ ExifTool Date/Time Shift Module +
+ + + + + + diff --git a/html/TagNames/AFCP.html b/html/TagNames/AFCP.html new file mode 100644 index 0000000..ae89e73 --- /dev/null +++ b/html/TagNames/AFCP.html @@ -0,0 +1,54 @@ + + + + +AFCP Tags + + + +

AFCP Tags

+

AFCP stands for AXS File Concatenation Protocol, and is a poorly designed +protocol for appending information to the end of files. This can be used as +an auxiliary technique to store IPTC information in images, but is +incompatible with some file formats.

+ +

ExifTool will read and write (but not create) AFCP IPTC information in JPEG +and TIFF images.

+ +

See +http://web.archive.org/web/20080828211305/http://www.tocarte.com/media/axs_afcp_spec.pdf +for the AFCP specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'IPTC'IPTC---> IPTC Tags
'Nail'ThumbnailImageno 
'PrVw'PreviewImageno 
'TEXT'Textno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 3, 2013 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/AIFF.html b/html/TagNames/AIFF.html new file mode 100644 index 0000000..c236171 --- /dev/null +++ b/html/TagNames/AIFF.html @@ -0,0 +1,160 @@ + + + + +AIFF Tags + + + +

AIFF Tags

+

Tags extracted from Audio Interchange File Format (AIFF) files. See +http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/AIFF.html for +the AIFF specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'(c) 'Copyrightno 
'ANNO'Annotationno 
'APPL'ApplicationDatano 
'AUTH'Authorno 
'COMM'Common---> AIFF Common Tags
'COMT'Comment---> AIFF Comment Tags
'FVER'FormatVersion---> AIFF FormatVers Tags
'ID3 'ID3---> ID3 Tags
'NAME'Nameno 
+ +

AIFF Common Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0NumChannelsno 
1NumSampleFramesno 
3SampleSizeno 
4SampleRateno 
9CompressionTypeno +
'ACE2' = ACE 2-to-1 +
'ACE8' = ACE 8-to-3 +
'ALAW' = A-law +
'G722' = G722 +
'G726' = G726 +
'G728' = G728 +
'GSM ' = GSM +
'MAC3' = MAC 3-to-1 +
'MAC6' = MAC 6-to-1 +
'NONE' = None +
'ULAW' = Mu-law +
'alaw' = a-law +
'sowt' = Little-endian, no compression +
'ulaw' = mu-law
+
11CompressorNameno 
+ +

AIFF Comment Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000CommentTimeno 
0x0001MarkerIDno 
0x0002Commentno 
+ +

AIFF FormatVers Tags

+
+
+ + + + + + + + +
Index4Tag NameWritableValues / Notes
0FormatVersionTimeno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Aug 24, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/APE.html b/html/TagNames/APE.html new file mode 100644 index 0000000..26845a2 --- /dev/null +++ b/html/TagNames/APE.html @@ -0,0 +1,155 @@ + + + + +APE Tags + + + +

APE Tags

+

Tags found in Monkey's Audio (APE) information. Only a few common tags are +listed below, but ExifTool will extract any tag found. ExifTool supports +APEv1 and APEv2 tags, as well as ID3 information in APE files, and will also +read APE metadata from MP3 and MPC files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Album'Albumno 
'Artist'Artistno 
'DURATION'Durationno 
'Genre'Genreno 
'Title'Titleno 
'Tool Name'ToolNameno 
'Tool Version'ToolVersionno 
'Track'Trackno 
'Year'Yearno 
+ +

APE NewHeader Tags

+

APE MAC audio header for version 3.98 or later.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0CompressionLevelno 
2BlocksPerFrameno 
4FinalFrameBlocksno 
6TotalFramesno 
8BitsPerSampleno 
9Channelsno 
10SampleRateno 
+ +

APE OldHeader Tags

+

APE MAC audio header for version 3.97 or earlier.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0APEVersionno 
1CompressionLevelno 
3Channelsno 
4SampleRateno 
10TotalFramesno 
12FinalFrameBlocksno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 7, 2017 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/APP12.html b/html/TagNames/APP12.html new file mode 100644 index 0000000..04ce574 --- /dev/null +++ b/html/TagNames/APP12.html @@ -0,0 +1,189 @@ + + + + +APP12 Tags + + + +

APP12 PictureInfo Tags

+

The JPEG APP12 "Picture Info" segment was used by some older cameras, and +contains ASCII-based meta information. Below are some tags which have been +observed Agfa and Polaroid images, however ExifTool will extract information +from any tags found in this segment.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Aperture'Apertureno 
'ColorMode'ColorModeno 
'ConTake'ConTakeno 
'ExpBias'ExposureCompensationno 
'FNumber'FNumberno 
'FWare'FirmwareVersionno 
'Flash'Flashno0 = Off +
1 = On
'FocusMode'FocusModeno 
'FocusPos'FocusPosno 
'ID'IDno 
'ImageSize'ImageSizeno 
'LightS'LightSno 
'Macro'Macrono0 = Off +
1 = On
'Protect'Protectno 
'Quality'Qualityno 
'Resolution'Resolutionno 
'Serial#'SerialNumberno 
'Shutter'ExposureTimeno 
'StrobeTime'StrobeTimeno 
'TimeDate'DateTimeOriginalno 
'Type'CameraTypeno 
'Version'Versionno 
'Ytarget'YTargetno 
'Zoom'Zoomno 
'ZoomPos'ZoomPosno 
'shtr'ExposureTimeno 
'ylevel'YLevelno 
+ +

APP12 Ducky Tags

+

Photoshop uses the JPEG APP12 "Ducky" segment to store some information in +"Save for Web" images.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001Qualityint32u/ 
0x0002Commentstring/ 
0x0003Copyrightstring/ 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 22, 2011 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/ASF.html b/html/TagNames/ASF.html new file mode 100644 index 0000000..7b1c1a7 --- /dev/null +++ b/html/TagNames/ASF.html @@ -0,0 +1,1067 @@ + + + + +ASF Tags + + + +

ASF Tags

+

The ASF format is used by Windows WMA and WMV files, and DIVX videos. Tag +ID's aren't listed because they are huge 128-bit GUID's that would ruin the +formatting of this table.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
SimpleIndexno 
TimecodeIndexno 
Header---> ASF Header Tags
Datano 
XMP---> XMP Tags
Indexno 
MediaIndexno 
+ +

ASF Header Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Paddingno 
ScriptCommandno 
ContentBranding---> ASF ContentBranding Tags
ContentEncryptionno 
DigitalSignatureno 
ExtendedContentEncryptionno 
HeaderExtension---> ASF HeaderExtension Tags
ContentDescription---> ASF ContentDescr Tags
ErrorCorrectionno 
StreamBitratePropsno 
CodecList---> ASF CodecList Tags
FileProperties---> ASF FileProperties Tags
StreamProperties---> ASF StreamProperties Tags
ExtendedContentDescr---> ASF ExtendedDescr Tags
BitrateMutualExclusionno 
Markerno 
+ +

ASF ContentBranding Tags

+
+
+ + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
BannerImageTypeno0 = None +
1 = Bitmap +
2 = JPEG +
3 = GIF
BannerImageno 
BannerImageURLno 
CopyrightURLno 
+ +

ASF HeaderExtension Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
ExtendedStreamPropsno 
AdvancedContentEncryptionno 
MetadataLibrary---> ASF ExtendedDescr Tags
TimecodeIndexParmsno 
Compatibilityno 
LanguageListno 
AdvancedMutualExclno 
BandwidthSharingno 
Reserved1no 
Metadata---> ASF ExtendedDescr Tags
GroupMutualExclusionno 
StreamPrioritizationno 
IndexParametersno 
+ +

ASF ExtendedDescr Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
ASFLeakyBucketPairsno 
ASFPacketCountno 
ASFSecurityObjectsSizeno 
AlbumArtistno 
AlbumCoverURLno 
AlbumTitleno 
AspectRatioXno 
AspectRatioYno 
AudioFileURLno 
AudioSourceURLno 
Authorno 
AuthorURLno 
AverageLevelno 
BannerImageDatano 
BannerImageTypeno 
BannerImageURLno 
BeatsPerMinuteno 
Bitrateno 
Broadcastno 
BufferAverageno 
Can_Skip_Backwardno 
Can_Skip_Forwardno 
Categoryno 
Codecno 
Composerno 
Conductorno 
ContainerFormatno 
ContentDistributorno 
ContentGroupDescriptionno 
Copyrightno 
CopyrightURLno 
CurrentBitrateno 
DRMno 
DRM_ContentIDno 
DRM_DRMHeaderno 
DRM_DRMHeader_ContentDistributorno 
DRM_DRMHeader_ContentIDno 
DRM_DRMHeader_IndividualizedVersionno 
DRM_DRMHeader_KeyIDno 
DRM_DRMHeader_LicenseAcqURLno 
DRM_DRMHeader_SubscriptionContentIDno 
DRM_IndividualizedVersionno 
DRM_KeyIDno 
DRM_LASignatureCertno 
DRM_LASignatureLicSrvCertno 
DRM_LASignaturePrivKeyno 
DRM_LASignatureRootCertno 
DRM_LicenseAcqURLno 
DRM_V1LicenseAcqURLno 
DVDIDno 
Descriptionno 
Directorno 
Durationno 
EncodedByno 
EncodingSettingsno 
EncodingTimeno 
FileSizeno 
Genreno 
GenreIDno 
HasArbitraryDataStreamno 
HasAttachedImagesno 
HasAudiono 
HasFileTransferStreamno 
HasImageno 
HasScriptno 
HasVideono 
ISRCno 
InitialKeyno 
IsVBRno 
Is_Protectedno 
Is_Trustedno 
Languageno 
Lyricsno 
Lyrics_Synchronisedno 
MCDIno 
MediaClassPrimaryIDno 
MediaClassSecondaryIDno 
MediaCreditsno 
MediaIsDelayno 
MediaIsFinaleno 
MediaIsLiveno 
MediaIsPremiereno 
MediaIsRepeatno 
MediaIsSAPno 
MediaIsStereono 
MediaIsSubtitledno 
MediaIsTapeno 
MediaNetworkAffiliationno 
MediaOriginalBroadcastDateTimeno 
MediaOriginalChannelno 
MediaStationCallSignno 
MediaStationNameno 
ModifiedByno 
Moodno 
NSC_Addressno 
NSC_Descriptionno 
NSC_Emailno 
NSC_Nameno 
NSC_Phoneno 
NumberOfFramesno 
OptimalBitrateno 
OriginalAlbumTitleno 
OriginalArtistno 
OriginalFileNameno 
OriginalLyricistno 
OriginalReleaseTimeno 
OriginalReleaseYearno 
ParentalRatingno 
ParentalRatingReasonno 
PartOfSetno 
PeakBitrateno 
PeakValueno 
Periodno 
Picture---> ASF Picture Tags
PlaylistDelayno 
Producerno 
PromotionURLno 
ProtectionTypeno 
Providerno 
ProviderCopyrightno 
ProviderRatingno 
ProviderStyleno 
Publisherno 
RadioStationNameno 
RadioStationOwnerno 
Ratingno 
Seekableno 
SharedUserRatingno 
Signature_Nameno 
StreamTypeInfono 
Stridableno 
Subtitleno 
SubtitleDescriptionno 
SubscriptionContentIDno 
Textno 
Titleno 
ToolNameno 
ToolVersionno 
Trackno 
TrackNumberno 
UniqueFileIdentifierno 
UserWebURLno 
VBRPeakno 
VideoClosedCaptioningno 
VideoFrameRateno 
VideoHeightno 
VideoWidthno 
WMADRCAverageReferenceno 
WMADRCAverageTargetno 
WMADRCPeakReferenceno 
WMADRCPeakTargetno 
WMCollectionGroupIDno 
WMCollectionIDno 
WMContentIDno 
Writerno 
Yearno 
+ +

ASF Picture Tags

+
+
+ + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
PictureTypeno +
0 = Other +
1 = 32x32 PNG Icon +
2 = Other Icon +
3 = Front Cover +
4 = Back Cover +
5 = Leaflet +
6 = Media +
7 = Lead Artist +
8 = Artist +
9 = Conductor +
10 = Band +
11 = Composer +
12 = Lyricist +
13 = Recording Studio or Location +
14 = Recording Session +
15 = Performance +
16 = Capture from Movie or Video +
17 = Bright(ly) Colored Fish +
18 = Illustration +
19 = Band Logo +
20 = Publisher Logo
+
PictureMIMETypeno 
PictureDescriptionno 
Pictureno 
+ +

ASF ContentDescr Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Titleno 
Authorno 
Copyrightno 
Descriptionno 
Ratingno 
+ +

ASF CodecList Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AudioCodecDescriptionno 
AudioCodecNameno 
OtherCodecDescriptionno 
OtherCodecNameno 
VideoCodecDescriptionno 
VideoCodecNameno 
+ +

ASF FileProperties Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FileIDno 
16FileLengthno 
24CreationDateno 
32DataPacketsno 
40Durationno(called PlayDuration by the ASF spec)
48SendDurationno 
56Prerollno 
64Flagsno 
68MinPacketSizeno 
72MaxPacketSizeno 
76MaxBitrateno 
+ +

ASF StreamProperties Tags

+

Tags with index 54 and greater are conditional based on the StreamType.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0StreamTypeno'35907DE0-E415-11CF-A917-00805F5C442B' = Degradable JPEG +
'3AFB65E2-47EF-40F2-AC2C-70A90D71D343' = Binary +
'59DACFC0-59E6-11D0-A3AC-00A0C90348F6' = Command +
'91BD222C-F21C-497A-8B6D-5AA86BFC0185' = File Transfer +
'B61BE100-5B4E-11CF-A8FD-00805F5C442B' = JFIF +
'BC19EFC0-5B4D-11CF-A8FD-00805F5C442B' = Video +
'F8699E40-5B4D-11CF-A8FD-00805F5C442B' = Audio
16ErrorCorrectionTypeno'20FB5700-5B55-11CF-A8FD-00805F5C442B' = No Error Correction +
'BFC3CD50-618F-11CF-8BB2-00AA00B4E220' = Audio Spread
32TimeOffsetno 
48StreamNumberno 
54AudioCodecID +
ImageWidth
no
no
--> RIFF AudioEncoding Values
56AudioChannelsno 
58AudioSampleRate +
ImageHeight
no
no
 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 15, 2018 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Apple.html b/html/TagNames/Apple.html new file mode 100644 index 0000000..b1ada76 --- /dev/null +++ b/html/TagNames/Apple.html @@ -0,0 +1,97 @@ + + + + +Apple Tags + + + +

Apple Tags

+

Tags extracted from the maker notes of iPhone images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0003RunTime---> Apple RunTime Tags
0x0008AccelerationVectorrational64s[3](XYZ coordinates of the acceleration vector in units of g. As viewed from +the front of the phone, positive X is toward the left side, positive Y is +toward the bottom, and positive Z points into the face of the phone)
0x000aHDRImageTypeint32s3 = HDR Image +
4 = Original Image
0x000bBurstUUIDstring(unique ID for all images in a burst)
0x000cFocusDistanceRangerational64s[2] 
0x0011MediaGroupUUIDstring 
0x0015ImageUniqueIDstring 
+ +

Apple RunTime Tags

+

This PLIST-format information contains the elements of a CMTime structure +representing the amount of time the phone has been running since the last +boot, not including standby time.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'epoch'RunTimeEpochno 
'flags'RunTimeFlagsnoBit 0 = Valid +
Bit 1 = Has been rounded +
Bit 2 = Positive infinity +
Bit 3 = Negative infinity +
Bit 4 = Indefinite
'timescale'RunTimeScaleno 
'value'RunTimeValueno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 6, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Audible.html b/html/TagNames/Audible.html new file mode 100644 index 0000000..dd1cca4 --- /dev/null +++ b/html/TagNames/Audible.html @@ -0,0 +1,178 @@ + + + + +Audible Tags + + + +

Audible Tags

+

ExifTool will extract any information found in the metadata dictionary of +Audible .AA files, even if not listed in the table below.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'_chapter_count'ChapterCountno 
'_cover_art'CoverArtno 
'author'Authorno 
'copyright'Copyrightno 
'pub_date_start'PublishDateStartno 
'pubdate'PublishDateno 
+ +

Audible tags Tags

+

Information found in "tags" atom of Audible M4B audio books.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'cvrx'Audible_cvrx---> Audible cvrx Tags
'meta'Audible_meta---> Audible meta Tags
'tseg'Audible_tseg---> Audible tseg Tags
+ +

Audible cvrx Tags

+

Audible cover art information in M4B audio books.

+
+
+ + + + + + + + + + + +
Tag NameWritableValues / Notes
CoverArtno 
CoverArtTypeno 
+ +

Audible meta Tags

+

Information found in Audible M4B "meta" atom.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ALBUMARTIST'AlbumArtistno 
'Album'Albumno 
'Artist'Artistno 
'Comment'Commentno 
'Genre'Genreno 
'SUBTITLE'Subtitleno 
'TOOL'CreatorToolno 
'Title'Titleno 
'Year'Yearno 
'itunesmediatype'iTunesMediaTypeno 
'track'ChapterNameno 
+ +

Audible tseg Tags

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'meta'Audible_meta2---> Audible meta Tags
'tshd'ChapterNumberno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Apr 30, 2019 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/BMP.html b/html/TagNames/BMP.html new file mode 100644 index 0000000..34dc544 --- /dev/null +++ b/html/TagNames/BMP.html @@ -0,0 +1,234 @@ + + + + +BMP Tags + + + +

BMP Tags

+

There really isn't much meta information in a BMP file as such, just a bit +of image related information.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0BMPVersionno(this is actually the size of the BMP header, but used to determine the BMP +version) +
40 = Windows V3 +
68 = AVI BMP structure? +
108 = Windows V4 +
124 = Windows V5
4ImageWidthno 
8ImageHeightno 
12Planesno 
14BitDepthno 
16Compressionno + +
0 = None +
1 = 8-Bit RLE +
2 = 4-Bit RLE
  3 = Bitfields +
4 = JPEG +
5 = PNG
+
20ImageLengthno 
24PixelsPerMeterXno 
28PixelsPerMeterYno 
32NumColorsno 
36NumImportantColorsno 
40RedMaskno 
44GreenMaskno 
48BlueMaskno 
52AlphaMaskno 
56ColorSpaceno +
0 = Calibrated RGB +
1 = Device RGB +
2 = Device CMYK +
'LINK' = Linked Color Profile +
'MBED' = Embedded Color Profile +
'Win ' = Windows Color Space +
'sRGB' = sRGB
+
60RedEndpointno 
72GreenEndpointno 
84BlueEndpointno 
96GammaRedno 
100GammaGreenno 
104GammaBlueno 
108RenderingIntentno1 = Graphic (LCS_GM_BUSINESS) +
2 = Proof (LCS_GM_GRAPHICS) +
4 = Picture (LCS_GM_IMAGES) +
8 = Absolute Colorimetric (LCS_GM_ABS_COLORIMETRIC)
112ProfileDataOffsetno 
116ProfileSizeno 
+ +

BMP OS2 Tags

+

Information extracted from OS/2-format BMP images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0BMPVersionno(again, the header size is used to determine the BMP version) +
12 = OS/2 V1 +
64 = OS/2 V2
4ImageWidthno 
6ImageHeightno 
8Planesno 
10BitDepthno 
+ +

BMP Extra Tags

+

Extra information extracted from some BMP images.

+
+
+ + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
EmbeddedJPGno 
EmbeddedPNGno 
ICC_Profile---> ICC_Profile Tags
LinkedProfileNameno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Dec 7, 2016 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/BPG.html b/html/TagNames/BPG.html new file mode 100644 index 0000000..bc75d43 --- /dev/null +++ b/html/TagNames/BPG.html @@ -0,0 +1,119 @@ + + + + +BPG Tags + + + +

BPG Tags

+

The information listed below is extracted from BPG (Better Portable +Graphics) images. See http://bellard.org/bpg/ for the specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4PixelFormatno[val >> 13 & 0x7] +
0 = Grayscale +
1 = 4:2:0 (chroma at 0.5, 0.5) +
2 = 4:2:2 (chroma at 0.5, 0) +
3 = 4:4:4 +
4 = 4:2:0 (chroma at 0, 0.5) +
5 = 4:2:2 (chroma at 0, 0)
+
4.1Alphano[val & 0x1004] +
0x0 = No Alpha Plane +
0x4 = Alpha Exists (W color component) +
0x1000 = Alpha Exists (color not premultiplied) +
0x1004 = Alpha Exists (color premultiplied)
4.2BitDepthno[val >> 8 & 0xf]
4.3ColorSpaceno[val >> 4 & 0xf] +
0 = YCbCr (BT 601) +
1 = RGB +
2 = YCgCo +
3 = YCbCr (BT 709) +
4 = YCbCr (BT 2020) +
5 = BT 2020 Constant Luminance
+
4.4Flagsno[val & 0xb] +
Bit 0 = Animation +
Bit 1 = Limited Range +
Bit 3 = Extension Present
6ImageWidthno 
7ImageHeightno 
8ImageLengthno 
+ +

BPG Extensions Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001EXIF---> EXIF Tags
0x0002ICC_Profile---> ICC_Profile Tags
0x0003XMP---> XMP Tags
0x0004ThumbnailBPGno 
0x0005AnimationControl?no 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 24, 2018 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/CBOR.html b/html/TagNames/CBOR.html new file mode 100644 index 0000000..9df9fae --- /dev/null +++ b/html/TagNames/CBOR.html @@ -0,0 +1,62 @@ + + + + +CBOR Tags + + + +

CBOR Tags

+

The tags below are extracted from CBOR (Concise Binary Object +Representation) metadata. The C2PA specification uses this format for some +metadata. As well as these tags, ExifTool will read any existing tags.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AuthorIdentifierno 
AuthorNameno 
DocumentIDno 
Formatno 
InstanceIDno 
Relationshipno 
ThumbnailHashno+ 
ThumbnailURLno 
Titleno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Sep 30, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Canon.html b/html/TagNames/Canon.html new file mode 100644 index 0000000..908569f --- /dev/null +++ b/html/TagNames/Canon.html @@ -0,0 +1,11639 @@ + + + + +Canon Tags + + + +

Canon Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001CanonCameraSettings---> Canon CameraSettings Tags
0x0002CanonFocalLength---> Canon FocalLength Tags
0x0003CanonFlashInfo?no 
0x0004CanonShotInfo---> Canon ShotInfo Tags
0x0005CanonPanorama---> Canon Panorama Tags
0x0006CanonImageTypestring 
0x0007CanonFirmwareVersionstring 
0x0008FileNumberint32u 
0x0009OwnerNamestring 
0x000aUnknownD30---> Canon UnknownD30 Tags
0x000cSerialNumberint32u 
0x000dCanonCameraInfo1D +
CanonCameraInfo1DmkII +
CanonCameraInfo1DmkIIN +
CanonCameraInfo1DmkIII +
CanonCameraInfo1DmkIV +
CanonCameraInfo1DX +
CanonCameraInfo5D +
CanonCameraInfo5DmkII +
CanonCameraInfo5DmkIII +
CanonCameraInfo6D +
CanonCameraInfo7D +
CanonCameraInfo40D +
CanonCameraInfo50D +
CanonCameraInfo60D +
CanonCameraInfo70D +
CanonCameraInfo80D +
CanonCameraInfo450D +
CanonCameraInfo500D +
CanonCameraInfo550D +
CanonCameraInfo600D +
CanonCameraInfo650D +
CanonCameraInfo700D +
CanonCameraInfo750D +
CanonCameraInfo760D +
CanonCameraInfo1000D +
CanonCameraInfo1100D +
CanonCameraInfo1200D +
CanonCameraInfoPowerShot +
CanonCameraInfoPowerShot2 +
CanonCameraInfoUnknown32 +
CanonCameraInfoUnknown16 +
CanonCameraInfoUnknown
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
--> Canon CameraInfo1D Tags +
--> Canon CameraInfo1DmkII Tags +
--> Canon CameraInfo1DmkIIN Tags +
--> Canon CameraInfo1DmkIII Tags +
--> Canon CameraInfo1DmkIV Tags +
--> Canon CameraInfo1DX Tags +
--> Canon CameraInfo5D Tags +
--> Canon CameraInfo5DmkII Tags +
--> Canon CameraInfo5DmkIII Tags +
--> Canon CameraInfo6D Tags +
--> Canon CameraInfo7D Tags +
--> Canon CameraInfo40D Tags +
--> Canon CameraInfo50D Tags +
--> Canon CameraInfo60D Tags +
--> Canon CameraInfo70D Tags +
--> Canon CameraInfo80D Tags +
--> Canon CameraInfo450D Tags +
--> Canon CameraInfo500D Tags +
--> Canon CameraInfo550D Tags +
--> Canon CameraInfo600D Tags +
--> Canon CameraInfo650D Tags +
--> Canon CameraInfo650D Tags +
--> Canon CameraInfo750D Tags +
--> Canon CameraInfo750D Tags +
--> Canon CameraInfo1000D Tags +
--> Canon CameraInfo600D Tags +
--> Canon CameraInfo60D Tags +
--> Canon CameraInfoPowerShot Tags +
--> Canon CameraInfoPowerShot2 Tags +
--> Canon CameraInfoUnknown32 Tags +
--> Canon CameraInfoUnknown16 Tags +
--> Canon CameraInfoUnknown Tags
0x000eCanonFileLengthint32u 
0x000fCustomFunctions1D +
CustomFunctions5D +
CustomFunctions10D +
CustomFunctions20D +
CustomFunctions30D +
CustomFunctions350D +
CustomFunctions400D +
CustomFunctionsD30 +
CustomFunctionsD60 +
CustomFunctionsUnknown
-
-
-
-
-
-
-
-
-
-
--> CanonCustom Functions1D Tags +
--> CanonCustom Functions5D Tags +
--> CanonCustom Functions10D Tags +
--> CanonCustom Functions20D Tags +
--> CanonCustom Functions30D Tags +
--> CanonCustom Functions350D Tags +
--> CanonCustom Functions400D Tags +
--> CanonCustom FunctionsD30 Tags +
--> CanonCustom FunctionsD30 Tags +
--> CanonCustom FuncsUnknown Tags
0x0010CanonModelIDint32u--> Canon CanonModelID Values
0x0011MovieInfo---> Canon MovieInfo Tags
0x0012CanonAFInfo---> Canon AFInfo Tags
0x0013ThumbnailImageValidAreaint16u[4](all zeros for full frame)
0x0015SerialNumberFormatint32u0x90000000 = Format 1 +
0xa0000000 = Format 2
0x001aSuperMacroint16u0 = Off +
1 = On (1) +
2 = On (2)
0x001cDateStampModeint16u(used only in postcard mode) +
0 = Off +
1 = Date +
2 = Date & Time
0x001dMyColors---> Canon MyColors Tags
0x001eFirmwareRevisionint32u 
0x0023Categoriesint32u[2](2 values: 1. always 8, 2. Categories) + +
0x0 = (none) +
Bit 0 = People +
Bit 1 = Scenery +
Bit 2 = Events
  Bit 3 = User 1 +
Bit 4 = User 2 +
Bit 5 = User 3 +
Bit 6 = To Do
+
0x0024FaceDetect1---> Canon FaceDetect1 Tags
0x0025FaceDetect2---> Canon FaceDetect2 Tags
0x0026CanonAFInfo2---> Canon AFInfo2 Tags
0x0027ContrastInfo---> Canon ContrastInfo Tags
0x0028ImageUniqueIDint8u 
0x0029WBInfo---> Canon WBInfo Tags
0x002fFaceDetect3---> Canon FaceDetect3 Tags
0x0035TimeInfo---> Canon TimeInfo Tags
0x0038BatteryTypeundef 
0x003cAFInfo3---> Canon AFInfo2 Tags
0x0081RawDataOffsetno 
0x0083OriginalDecisionDataOffsetint32u* 
0x0090CustomFunctions1D---> CanonCustom Functions1D Tags
0x0091PersonalFunctions---> CanonCustom PersonalFuncs Tags
0x0092PersonalFunctionValues---> CanonCustom PersonalFuncValues Tags
0x0093CanonFileInfo---> Canon FileInfo Tags
0x0094AFPointsInFocus1Dno(EOS 1D -- 5 rows: A1-7, B1-10, C1-11, D1-10, E1-7, center point is C6)
0x0095LensModelstring 
0x0096SerialInfo +
InternalSerialNumber
-
string
--> Canon SerialInfo Tags
0x0097DustRemovalDataundef! 
0x0098CropInfo---> Canon CropInfo Tags
0x0099CustomFunctions2---> CanonCustom Functions2 Tags
0x009aAspectInfo---> Canon AspectInfo Tags
0x00a0ProcessingInfo---> Canon Processing Tags
0x00a1ToneCurveTableno 
0x00a2SharpnessTableno 
0x00a3SharpnessFreqTableno 
0x00a4WhiteBalanceTableno 
0x00a9ColorBalance---> Canon ColorBalance Tags
0x00aaMeasuredColor---> Canon MeasuredColor Tags
0x00aeColorTemperatureint16u 
0x00b0CanonFlags---> Canon Flags Tags
0x00b1ModifiedInfo---> Canon ModifiedInfo Tags
0x00b2ToneCurveMatchingno 
0x00b3WhiteBalanceMatchingno 
0x00b4ColorSpaceint16u1 = sRGB +
2 = Adobe RGB +
65535 = n/a
0x00b6PreviewImageInfo---> Canon PreviewImageInfo Tags
0x00d0VRDOffsetint32u*(offset of VRD "recipe data" if it exists)
0x00e0SensorInfo---> Canon SensorInfo Tags
0x4001ColorData1 +
ColorData2 +
ColorData3 +
ColorData4 +
ColorData5 +
ColorData6 +
ColorData7 +
ColorData8 +
ColorData9 +
ColorData10 +
ColorData11 +
ColorDataUnknown
-
-
-
-
-
-
-
-
-
-
-
-
--> Canon ColorData1 Tags +
--> Canon ColorData2 Tags +
--> Canon ColorData3 Tags +
--> Canon ColorData4 Tags +
--> Canon ColorData5 Tags +
--> Canon ColorData6 Tags +
--> Canon ColorData7 Tags +
--> Canon ColorData8 Tags +
--> Canon ColorData9 Tags +
--> Canon ColorData10 Tags +
--> Canon ColorData11 Tags +
--> Canon ColorDataUnknown Tags
0x4002CRWParam?no 
0x4003ColorInfo---> Canon ColorInfo Tags
0x4005Flavor?no(unknown 49kB block, not copied to JPEG images)
0x4008PictureStyleUserDefint16u[3][Values 0-2] +
--> Canon PictureStyle Values
0x4009PictureStylePCint16u[3][Values 0-2] +
--> Canon PictureStyle Values
0x4010CustomPictureStyleFileNamestring 
0x4013AFMicroAdj---> Canon AFMicroAdj Tags
0x4015VignettingCorr +
VignettingCorrUnknown1 +
VignettingCorrUnknown2
-
-
-
--> Canon VignettingCorr Tags +
--> Canon VignettingCorrUnknown Tags +
--> Canon VignettingCorrUnknown Tags
0x4016VignettingCorr2---> Canon VignettingCorr2 Tags
0x4018LightingOpt---> Canon LightingOpt Tags
0x4019LensInfo---> Canon LensInfo Tags
0x4020AmbienceInfo---> Canon Ambience Tags
0x4021MultiExp---> Canon MultiExp Tags
0x4024FilterInfo---> Canon FilterInfo Tags
0x4025HDRInfo---> Canon HDRInfo Tags
0x4026LogInfo---> Canon LogInfo Tags
0x4028AFConfig---> Canon AFConfig Tags
0x403fRawBurstModeRoll---> Canon RawBurstInfo Tags
+ +

Canon CanonModelID Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueCanonModelID
0x412= EOS M50 / Kiss M
0x801= PowerShot SX740 HS
0x804= PowerShot G5 X Mark II
0x805= PowerShot SX70 HS
0x808= PowerShot G7 X Mark III
0x811= EOS M6 Mark II
0x812= EOS M200
0x1010000= PowerShot A30
0x1040000= PowerShot S300 / Digital IXUS 300 / IXY Digital 300
0x1060000= PowerShot A20
0x1080000= PowerShot A10
0x1090000= PowerShot S110 / Digital IXUS v / IXY Digital 200
0x1100000= PowerShot G2
0x1110000= PowerShot S40
0x1120000= PowerShot S30
0x1130000= PowerShot A40
0x1140000= EOS D30
0x1150000= PowerShot A100
0x1160000= PowerShot S200 / Digital IXUS v2 / IXY Digital 200a
0x1170000= PowerShot A200
0x1180000= PowerShot S330 / Digital IXUS 330 / IXY Digital 300a
0x1190000= PowerShot G3
0x1210000= PowerShot S45
0x1230000= PowerShot SD100 / Digital IXUS II / IXY Digital 30
0x1240000= PowerShot S230 / Digital IXUS v3 / IXY Digital 320
0x1250000= PowerShot A70
0x1260000= PowerShot A60
0x1270000= PowerShot S400 / Digital IXUS 400 / IXY Digital 400
0x1290000= PowerShot G5
0x1300000= PowerShot A300
0x1310000= PowerShot S50
0x1340000= PowerShot A80
0x1350000= PowerShot SD10 / Digital IXUS i / IXY Digital L
0x1360000= PowerShot S1 IS
0x1370000= PowerShot Pro1
0x1380000= PowerShot S70
0x1390000= PowerShot S60
0x1400000= PowerShot G6
0x1410000= PowerShot S500 / Digital IXUS 500 / IXY Digital 500
0x1420000= PowerShot A75
0x1440000= PowerShot SD110 / Digital IXUS IIs / IXY Digital 30a
0x1450000= PowerShot A400
0x1470000= PowerShot A310
0x1490000= PowerShot A85
0x1520000= PowerShot S410 / Digital IXUS 430 / IXY Digital 450
0x1530000= PowerShot A95
0x1540000= PowerShot SD300 / Digital IXUS 40 / IXY Digital 50
0x1550000= PowerShot SD200 / Digital IXUS 30 / IXY Digital 40
0x1560000= PowerShot A520
0x1570000= PowerShot A510
0x1590000= PowerShot SD20 / Digital IXUS i5 / IXY Digital L2
0x1640000= PowerShot S2 IS
0x1650000= PowerShot SD430 / Digital IXUS Wireless / IXY Digital Wireless
0x1660000= PowerShot SD500 / Digital IXUS 700 / IXY Digital 600
0x1668000= EOS D60
0x1700000= PowerShot SD30 / Digital IXUS i Zoom / IXY Digital L3
0x1740000= PowerShot A430
0x1750000= PowerShot A410
0x1760000= PowerShot S80
0x1780000= PowerShot A620
0x1790000= PowerShot A610
0x1800000= PowerShot SD630 / Digital IXUS 65 / IXY Digital 80
0x1810000= PowerShot SD450 / Digital IXUS 55 / IXY Digital 60
0x1820000= PowerShot TX1
0x1870000= PowerShot SD400 / Digital IXUS 50 / IXY Digital 55
0x1880000= PowerShot A420
0x1890000= PowerShot SD900 / Digital IXUS 900 Ti / IXY Digital 1000
0x1900000= PowerShot SD550 / Digital IXUS 750 / IXY Digital 700
0x1920000= PowerShot A700
0x1940000= PowerShot SD700 IS / Digital IXUS 800 IS / IXY Digital 800 IS
0x1950000= PowerShot S3 IS
0x1960000= PowerShot A540
0x1970000= PowerShot SD600 / Digital IXUS 60 / IXY Digital 70
0x1980000= PowerShot G7
0x1990000= PowerShot A530
0x2000000= PowerShot SD800 IS / Digital IXUS 850 IS / IXY Digital 900 IS
0x2010000= PowerShot SD40 / Digital IXUS i7 / IXY Digital L4
0x2020000= PowerShot A710 IS
0x2030000= PowerShot A640
0x2040000= PowerShot A630
0x2090000= PowerShot S5 IS
0x2100000= PowerShot A460
0x2120000= PowerShot SD850 IS / Digital IXUS 950 IS / IXY Digital 810 IS
0x2130000= PowerShot A570 IS
0x2140000= PowerShot A560
0x2150000= PowerShot SD750 / Digital IXUS 75 / IXY Digital 90
0x2160000= PowerShot SD1000 / Digital IXUS 70 / IXY Digital 10
0x2180000= PowerShot A550
0x2190000= PowerShot A450
0x2230000= PowerShot G9
0x2240000= PowerShot A650 IS
0x2260000= PowerShot A720 IS
0x2290000= PowerShot SX100 IS
0x2300000= PowerShot SD950 IS / Digital IXUS 960 IS / IXY Digital 2000 IS
0x2310000= PowerShot SD870 IS / Digital IXUS 860 IS / IXY Digital 910 IS
0x2320000= PowerShot SD890 IS / Digital IXUS 970 IS / IXY Digital 820 IS
0x2360000= PowerShot SD790 IS / Digital IXUS 90 IS / IXY Digital 95 IS
0x2370000= PowerShot SD770 IS / Digital IXUS 85 IS / IXY Digital 25 IS
0x2380000= PowerShot A590 IS
0x2390000= PowerShot A580
0x2420000= PowerShot A470
0x2430000= PowerShot SD1100 IS / Digital IXUS 80 IS / IXY Digital 20 IS
0x2460000= PowerShot SX1 IS
0x2470000= PowerShot SX10 IS
0x2480000= PowerShot A1000 IS
0x2490000= PowerShot G10
0x2510000= PowerShot A2000 IS
0x2520000= PowerShot SX110 IS
0x2530000= PowerShot SD990 IS / Digital IXUS 980 IS / IXY Digital 3000 IS
0x2540000= PowerShot SD880 IS / Digital IXUS 870 IS / IXY Digital 920 IS
0x2550000= PowerShot E1
0x2560000= PowerShot D10
0x2570000= PowerShot SD960 IS / Digital IXUS 110 IS / IXY Digital 510 IS
0x2580000= PowerShot A2100 IS
0x2590000= PowerShot A480
0x2600000= PowerShot SX200 IS
0x2610000= PowerShot SD970 IS / Digital IXUS 990 IS / IXY Digital 830 IS
0x2620000= PowerShot SD780 IS / Digital IXUS 100 IS / IXY Digital 210 IS
0x2630000= PowerShot A1100 IS
0x2640000= PowerShot SD1200 IS / Digital IXUS 95 IS / IXY Digital 110 IS
0x2700000= PowerShot G11
0x2710000= PowerShot SX120 IS
0x2720000= PowerShot S90
0x2750000= PowerShot SX20 IS
0x2760000= PowerShot SD980 IS / Digital IXUS 200 IS / IXY Digital 930 IS
0x2770000= PowerShot SD940 IS / Digital IXUS 120 IS / IXY Digital 220 IS
0x2800000= PowerShot A495
0x2810000= PowerShot A490
0x2820000= PowerShot A3100/A3150 IS
0x2830000= PowerShot A3000 IS
0x2840000= PowerShot SD1400 IS / IXUS 130 / IXY 400F
0x2850000= PowerShot SD1300 IS / IXUS 105 / IXY 200F
0x2860000= PowerShot SD3500 IS / IXUS 210 / IXY 10S
0x2870000= PowerShot SX210 IS
0x2880000= PowerShot SD4000 IS / IXUS 300 HS / IXY 30S
0x2890000= PowerShot SD4500 IS / IXUS 1000 HS / IXY 50S
0x2920000= PowerShot G12
0x2930000= PowerShot SX30 IS
0x2940000= PowerShot SX130 IS
0x2950000= PowerShot S95
0x2980000= PowerShot A3300 IS
0x2990000= PowerShot A3200 IS
0x3000000= PowerShot ELPH 500 HS / IXUS 310 HS / IXY 31S
0x3010000= PowerShot Pro90 IS
0x3010001= PowerShot A800
0x3020000= PowerShot ELPH 100 HS / IXUS 115 HS / IXY 210F
0x3030000= PowerShot SX230 HS
0x3040000= PowerShot ELPH 300 HS / IXUS 220 HS / IXY 410F
0x3050000= PowerShot A2200
0x3060000= PowerShot A1200
0x3070000= PowerShot SX220 HS
0x3080000= PowerShot G1 X
0x3090000= PowerShot SX150 IS
0x3100000= PowerShot ELPH 510 HS / IXUS 1100 HS / IXY 51S
0x3110000= PowerShot S100 (new)
0x3120000= PowerShot ELPH 310 HS / IXUS 230 HS / IXY 600F
0x3130000= PowerShot SX40 HS
0x3140000= IXY 32S
0x3160000= PowerShot A1300
0x3170000= PowerShot A810
0x3180000= PowerShot ELPH 320 HS / IXUS 240 HS / IXY 420F
0x3190000= PowerShot ELPH 110 HS / IXUS 125 HS / IXY 220F
0x3200000= PowerShot D20
0x3210000= PowerShot A4000 IS
0x3220000= PowerShot SX260 HS
0x3230000= PowerShot SX240 HS
0x3240000= PowerShot ELPH 530 HS / IXUS 510 HS / IXY 1
0x3250000= PowerShot ELPH 520 HS / IXUS 500 HS / IXY 3
0x3260000= PowerShot A3400 IS
0x3270000= PowerShot A2400 IS
0x3280000= PowerShot A2300
0x3320000= PowerShot S100V
0x3330000= PowerShot G15
0x3340000= PowerShot SX50 HS
0x3350000= PowerShot SX160 IS
0x3360000= PowerShot S110 (new)
0x3370000= PowerShot SX500 IS
0x3380000= PowerShot N
0x3390000= IXUS 245 HS / IXY 430F
0x3400000= PowerShot SX280 HS
0x3410000= PowerShot SX270 HS
0x3420000= PowerShot A3500 IS
0x3430000= PowerShot A2600
0x3440000= PowerShot SX275 HS
0x3450000= PowerShot A1400
0x3460000= PowerShot ELPH 130 IS / IXUS 140 / IXY 110F
0x3470000= PowerShot ELPH 115/120 IS / IXUS 132/135 / IXY 90F/100F
0x3490000= PowerShot ELPH 330 HS / IXUS 255 HS / IXY 610F
0x3510000= PowerShot A2500
0x3540000= PowerShot G16
0x3550000= PowerShot S120
0x3560000= PowerShot SX170 IS
0x3580000= PowerShot SX510 HS
0x3590000= PowerShot S200 (new)
0x3600000= IXY 620F
0x3610000= PowerShot N100
0x3640000= PowerShot G1 X Mark II
0x3650000= PowerShot D30
0x3660000= PowerShot SX700 HS
0x3670000= PowerShot SX600 HS
0x3680000= PowerShot ELPH 140 IS / IXUS 150 / IXY 130
0x3690000= PowerShot ELPH 135 / IXUS 145 / IXY 120
0x3700000= PowerShot ELPH 340 HS / IXUS 265 HS / IXY 630
0x3710000= PowerShot ELPH 150 IS / IXUS 155 / IXY 140
0x3740000= EOS M3
0x3750000= PowerShot SX60 HS
0x3760000= PowerShot SX520 HS
0x3770000= PowerShot SX400 IS
0x3780000= PowerShot G7 X
0x3790000= PowerShot N2
0x3800000= PowerShot SX530 HS
0x3820000= PowerShot SX710 HS
0x3830000= PowerShot SX610 HS
0x3840000= EOS M10
0x3850000= PowerShot G3 X
0x3860000= PowerShot ELPH 165 HS / IXUS 165 / IXY 160
0x3870000= PowerShot ELPH 160 / IXUS 160
0x3880000= PowerShot ELPH 350 HS / IXUS 275 HS / IXY 640
0x3890000= PowerShot ELPH 170 IS / IXUS 170
0x3910000= PowerShot SX410 IS
0x3930000= PowerShot G9 X
0x3940000= EOS M5
0x3950000= PowerShot G5 X
0x3970000= PowerShot G7 X Mark II
0x3980000= EOS M100
0x3990000= PowerShot ELPH 360 HS / IXUS 285 HS / IXY 650
0x4010000= PowerShot SX540 HS
0x4020000= PowerShot SX420 IS
0x4030000= PowerShot ELPH 190 IS / IXUS 180 / IXY 190
0x4040000= PowerShot G1
0x4040001= PowerShot ELPH 180 IS / IXUS 175 / IXY 180
0x4050000= PowerShot SX720 HS
0x4060000= PowerShot SX620 HS
0x4070000= EOS M6
0x4100000= PowerShot G9 X Mark II
0x4150000= PowerShot ELPH 185 / IXUS 185 / IXY 200
0x4160000= PowerShot SX430 IS
0x4170000= PowerShot SX730 HS
0x4180000= PowerShot G1 X Mark III
0x6040000= PowerShot S100 / Digital IXUS / IXY Digital
0x4007d673= DC19/DC21/DC22
0x4007d674= XH A1
0x4007d675= HV10
0x4007d676= MD130/MD140/MD150/MD160/ZR850
0x4007d777= DC50
0x4007d778= HV20
0x4007d779= DC211
0x4007d77a= HG10
0x4007d77b= HR10
0x4007d77d= MD255/ZR950
0x4007d81c= HF11
0x4007d878= HV30
0x4007d87c= XH A1S
0x4007d87e= DC301/DC310/DC311/DC320/DC330
0x4007d87f= FS100
0x4007d880= HF10
0x4007d882= HG20/HG21
0x4007d925= HF21
0x4007d926= HF S11
0x4007d978= HV40
0x4007d987= DC410/DC411/DC420
0x4007d988= FS19/FS20/FS21/FS22/FS200
0x4007d989= HF20/HF200
0x4007d98a= HF S10/S100
0x4007da8e= HF R10/R16/R17/R18/R100/R106
0x4007da8f= HF M30/M31/M36/M300/M306
0x4007da90= HF S20/S21/S200
0x4007da92= FS31/FS36/FS37/FS300/FS305/FS306/FS307
0x4007dca0= EOS C300
0x4007dda9= HF G25
0x4007dfb4= XC10
0x4007e1c3= EOS C200
0x80000001= EOS-1D
0x80000167= EOS-1DS
0x80000168= EOS 10D
0x80000169= EOS-1D Mark III
0x80000170= EOS Digital Rebel / 300D / Kiss Digital
0x80000174= EOS-1D Mark II
0x80000175= EOS 20D
0x80000176= EOS Digital Rebel XSi / 450D / Kiss X2
0x80000188= EOS-1Ds Mark II
0x80000189= EOS Digital Rebel XT / 350D / Kiss Digital N
0x80000190= EOS 40D
0x80000213= EOS 5D
0x80000215= EOS-1Ds Mark III
0x80000218= EOS 5D Mark II
0x80000219= WFT-E1
0x80000232= EOS-1D Mark II N
0x80000234= EOS 30D
0x80000236= EOS Digital Rebel XTi / 400D / Kiss Digital X
0x80000241= WFT-E2
0x80000246= WFT-E3
0x80000250= EOS 7D
0x80000252= EOS Rebel T1i / 500D / Kiss X3
0x80000254= EOS Rebel XS / 1000D / Kiss F
0x80000261= EOS 50D
0x80000269= EOS-1D X
0x80000270= EOS Rebel T2i / 550D / Kiss X4
0x80000271= WFT-E4
0x80000273= WFT-E5
0x80000281= EOS-1D Mark IV
0x80000285= EOS 5D Mark III
0x80000286= EOS Rebel T3i / 600D / Kiss X5
0x80000287= EOS 60D
0x80000288= EOS Rebel T3 / 1100D / Kiss X50
0x80000289= EOS 7D Mark II
0x80000297= WFT-E2 II
0x80000298= WFT-E4 II
0x80000301= EOS Rebel T4i / 650D / Kiss X6i
0x80000302= EOS 6D
0x80000324= EOS-1D C
0x80000325= EOS 70D
0x80000326= EOS Rebel T5i / 700D / Kiss X7i
0x80000327= EOS Rebel T5 / 1200D / Kiss X70 / Hi
0x80000328= EOS-1D X Mark II
0x80000331= EOS M
0x80000346= EOS Rebel SL1 / 100D / Kiss X7
0x80000347= EOS Rebel T6s / 760D / 8000D
0x80000349= EOS 5D Mark IV
0x80000350= EOS 80D
0x80000355= EOS M2
0x80000382= EOS 5DS
0x80000393= EOS Rebel T6i / 750D / Kiss X8i
0x80000401= EOS 5DS R
0x80000404= EOS Rebel T6 / 1300D / Kiss X80
0x80000405= EOS Rebel T7i / 800D / Kiss X9i
0x80000406= EOS 6D Mark II
0x80000408= EOS 77D / 9000D
0x80000417= EOS Rebel SL2 / 200D / Kiss X9
0x80000421= EOS R5
0x80000422= EOS Rebel T100 / 4000D / 3000D
0x80000424= EOS R
0x80000428= EOS-1D X Mark III
0x80000432= EOS Rebel T7 / 2000D / 1500D / Kiss X90
0x80000433= EOS RP
0x80000435= EOS Rebel T8i / 850D / X10i
0x80000436= EOS SL3 / 250D / Kiss X10
0x80000437= EOS 90D
0x80000450= EOS R3
0x80000453= EOS R6
0x80000464= EOS R7
0x80000465= EOS R10
0x80000467= PowerShot ZOOM
0x80000468= EOS M50 Mark II / Kiss M2
0x80000520= EOS D2000C
0x80000560= EOS D6000C
+ +

Canon PictureStyle Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ValuePictureStyleValuePictureStyleValuePictureStyle
0x0= None0x21= User Def. 10x83= Landscape
0x1= Standard0x22= User Def. 20x84= Neutral
0x2= Portrait0x23= User Def. 30x85= Faithful
0x3= High Saturation0x41= PC 10x86= Monochrome
0x4= Adobe RGB0x42= PC 20x87= Auto
0x5= Low Saturation0x43= PC 30x88= Fine Detail
0x6= CM Set 10x81= Standard0xff= n/a
0x7= CM Set 20x82= Portrait0xffff= n/a
+ +

Canon CameraSettings Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1MacroModeint16s1 = Macro +
2 = Normal
2SelfTimerint16s 
3Qualityint16s + +
-1 = n/a +
1 = Economy +
2 = Normal +
3 = Fine +
4 = RAW
  5 = Superfine +
7 = CRAW +
130 = Light (RAW) +
131 = Standard (RAW)
+
4CanonFlashModeint16s +
-1 = n/a +
0 = Off +
1 = Auto +
2 = On +
3 = Red-eye reduction +
4 = Slow-sync +
5 = Red-eye reduction (Auto) +
6 = Red-eye reduction (On) +
16 = External flash
+
5ContinuousDriveint16s +
0 = Single +
1 = Continuous +
2 = Movie +
3 = Continuous, Speed Priority +
4 = Continuous, Low +
5 = Continuous, High +
6 = Silent Single +
8 = Continuous, High+ +
9 = Single, Silent +
10 = Continuous, Silent
+
7FocusModeint16s + +
0 = One-shot AF +
1 = AI Servo AF +
2 = AI Focus AF +
3 = Manual Focus (3) +
4 = Single +
5 = Continuous
  6 = Manual Focus (6) +
16 = Pan Focus +
256 = AF + MF +
257 = Live View +
512 = Movie Snap Focus +
519 = Movie Servo AF
+
9RecordModeint16s + + +
1 = JPEG +
2 = CRW+THM +
3 = AVI+THM +
4 = TIF +
5 = TIF+JPEG
  6 = CR2 +
7 = CR2+JPEG +
9 = MOV +
10 = MP4 +
11 = CRM
  12 = CR3 +
13 = CR3+JPEG +
14 = HIF +
15 = CR3+HIF
+
10CanonImageSizeint16s + +
-1 = n/a +
0 = Large +
1 = Medium +
2 = Small +
5 = Medium 1 +
6 = Medium 2 +
7 = Medium 3 +
8 = Postcard +
9 = Widescreen +
10 = Medium Widescreen
  14 = Small 1 +
15 = Small 2 +
16 = Small 3 +
128 = 640x480 Movie +
129 = Medium Movie +
130 = Small Movie +
137 = 1280x720 Movie +
142 = 1920x1080 Movie +
143 = 4096x2160 Movie
+
11EasyModeint16s + + +
0 = Full auto +
1 = Manual +
2 = Landscape +
3 = Fast shutter +
4 = Slow shutter +
5 = Night +
6 = Gray Scale +
7 = Sepia +
8 = Portrait +
9 = Sports +
10 = Macro +
11 = Black & White +
12 = Pan focus +
13 = Vivid +
14 = Neutral +
15 = Flash Off +
16 = Long Shutter +
17 = Super Macro +
18 = Foliage +
19 = Indoor +
20 = Fireworks +
21 = Beach +
22 = Underwater +
23 = Snow +
24 = Kids & Pets
  25 = Night Snapshot +
26 = Digital Macro +
27 = My Colors +
28 = Movie Snap +
29 = Super Macro 2 +
30 = Color Accent +
31 = Color Swap +
32 = Aquarium +
33 = ISO 3200 +
34 = ISO 6400 +
35 = Creative Light Effect +
36 = Easy +
37 = Quick Shot +
38 = Creative Auto +
39 = Zoom Blur +
40 = Low Light +
41 = Nostalgic +
42 = Super Vivid +
43 = Poster Effect +
44 = Face Self-timer +
45 = Smile +
46 = Wink Self-timer +
47 = Fisheye Effect +
48 = Miniature Effect +
49 = High-speed Burst
  50 = Best Image Selection +
51 = High Dynamic Range +
52 = Handheld Night Scene +
53 = Movie Digest +
54 = Live View Control +
55 = Discreet +
56 = Blur Reduction +
57 = Monochrome +
58 = Toy Camera Effect +
59 = Scene Intelligent Auto +
60 = High-speed Burst HQ +
61 = Smooth Skin +
62 = Soft Focus +
68 = Food +
84 = HDR Art Standard +
85 = HDR Art Vivid +
93 = HDR Art Bold +
257 = Spotlight +
258 = Night 2 +
259 = Night+ +
260 = Super Night +
261 = Sunset +
263 = Night Scene +
264 = Surface +
265 = Low Light 2
+
12DigitalZoomint16s0 = None +
1 = 2x +
2 = 4x +
3 = Other
13Contrastint16s0 = Normal
14Saturationint16s0 = Normal
15Sharpnessint16s(some models use a range of -2 to +2 where 0 is normal sharpening, and +others use a range of 0 to 7 where 0 is no sharpening)
16CameraISOint16s 
17MeteringModeint16s +
0 = Default +
1 = Spot +
2 = Average +
3 = Evaluative +
4 = Partial +
5 = Center-weighted average
+
18FocusRangeint16s + +
0 = Manual +
1 = Auto +
2 = Not Known +
3 = Macro +
4 = Very Close +
5 = Close
  6 = Middle Range +
7 = Far Range +
8 = Pan Focus +
9 = Super Macro +
10 = Infinity
+
19AFPointint16s +
0x2005 = Manual AF point selection +
0x3000 = None (MF) +
0x3001 = Auto AF point selection +
0x3002 = Right +
0x3003 = Center +
0x3004 = Left +
0x4001 = Auto AF point selection +
0x4006 = Face Detect
+
20CanonExposureModeint16s +
0 = Easy +
1 = Program AE +
2 = Shutter speed priority AE +
3 = Aperture-priority AE +
4 = Manual +
5 = Depth-of-field AE +
6 = M-Dep +
7 = Bulb +
8 = Flexible-priority AE
+
22LensTypeint16u--> Canon LensType Values +
(this value is incorrect for EOS 7D images with lenses of type 256 or greater)
23MaxFocalLengthint16u 
24MinFocalLengthint16u 
25FocalUnitsint16s 
26MaxApertureint16s 
27MinApertureint16s 
28FlashActivityint16s 
29FlashBitsint16s + +
0x0 = (none) +
Bit 0 = Manual +
Bit 1 = TTL +
Bit 2 = A-TTL +
Bit 3 = E-TTL
  Bit 4 = FP sync enabled +
Bit 7 = 2nd-curtain sync used +
Bit 11 = FP sync used +
Bit 13 = Built-in +
Bit 14 = External
+
32FocusContinuousint16s0 = Single +
1 = Continuous +
8 = Manual
33AESettingint16s0 = Normal AE +
1 = Exposure Compensation +
2 = AE Lock +
3 = AE Lock + Exposure Comp. +
4 = No AE
34ImageStabilizationint16s + +
0 = Off +
1 = On +
2 = Shoot Only +
3 = Panning +
4 = Dynamic
  256 = Off (2) +
257 = On (2) +
258 = Shoot Only (2) +
259 = Panning (2) +
260 = Dynamic (2)
+
35DisplayApertureint16s 
36ZoomSourceWidthint16s 
37ZoomTargetWidthint16s 
39SpotMeteringModeint16s0 = Center +
1 = AF Point
40PhotoEffectint16s + +
0 = Off +
1 = Vivid +
2 = Neutral +
3 = Smooth
  4 = Sepia +
5 = B&W +
6 = Custom +
100 = My Color Data
+
41ManualFlashOutputint16s0x0 = n/a +
0x500 = Full +
0x502 = Medium +
0x504 = Low +
0x7fff = n/a
42ColorToneint16s0 = Normal
46SRAWQualityint16s0 = n/a +
1 = sRAW1 (mRAW) +
2 = sRAW2 (sRAW)
+ +

Canon LensType Values

+

Decimal values have been added to differentiate lenses which would otherwise +have the same LensType, and are used by the Composite LensID tag when +attempting to identify the specific lens model.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueLensType
-1= n/a
1= Canon EF 50mm f/1.8
2= Canon EF 28mm f/2.8 or Sigma Lens
2.1= Sigma 24mm f/2.8 Super Wide II
3= Canon EF 135mm f/2.8 Soft
4= Canon EF 35-105mm f/3.5-4.5 or Sigma Lens
4.1= Sigma UC Zoom 35-135mm f/4-5.6
5= Canon EF 35-70mm f/3.5-4.5
6= Canon EF 28-70mm f/3.5-4.5 or Sigma or Tokina Lens
6.1= Sigma 18-50mm f/3.5-5.6 DC
6.2= Sigma 18-125mm f/3.5-5.6 DC IF ASP
6.3= Tokina AF 193-2 19-35mm f/3.5-4.5
6.4= Sigma 28-80mm f/3.5-5.6 II Macro
6.5= Sigma 28-300mm f/3.5-6.3 DG Macro
7= Canon EF 100-300mm f/5.6L
8= Canon EF 100-300mm f/5.6 or Sigma or Tokina Lens
8.1= Sigma 70-300mm f/4-5.6 [APO] DG Macro
8.2= Tokina AT-X 242 AF 24-200mm f/3.5-5.6
9= Canon EF 70-210mm f/4
9.1= Sigma 55-200mm f/4-5.6 DC
10= Canon EF 50mm f/2.5 Macro or Sigma Lens
10.1= Sigma 50mm f/2.8 EX
10.2= Sigma 28mm f/1.8
10.3= Sigma 105mm f/2.8 Macro EX
10.4= Sigma 70mm f/2.8 EX DG Macro EF
11= Canon EF 35mm f/2
13= Canon EF 15mm f/2.8 Fisheye
14= Canon EF 50-200mm f/3.5-4.5L
15= Canon EF 50-200mm f/3.5-4.5
16= Canon EF 35-135mm f/3.5-4.5
17= Canon EF 35-70mm f/3.5-4.5A
18= Canon EF 28-70mm f/3.5-4.5
20= Canon EF 100-200mm f/4.5A
21= Canon EF 80-200mm f/2.8L
22= Canon EF 20-35mm f/2.8L or Tokina Lens
22.1= Tokina AT-X 280 AF Pro 28-80mm f/2.8 Aspherical
23= Canon EF 35-105mm f/3.5-4.5
24= Canon EF 35-80mm f/4-5.6 Power Zoom
25= Canon EF 35-80mm f/4-5.6 Power Zoom
26= Canon EF 100mm f/2.8 Macro or Other Lens
26.1= Cosina 100mm f/3.5 Macro AF
26.2= Tamron SP AF 90mm f/2.8 Di Macro
26.3= Tamron SP AF 180mm f/3.5 Di Macro
26.4= Carl Zeiss Planar T* 50mm f/1.4
26.5= Voigtlander APO Lanthar 125mm F2.5 SL Macro
26.6= Carl Zeiss Planar T 85mm f/1.4 ZE
27= Canon EF 35-80mm f/4-5.6
28= Canon EF 80-200mm f/4.5-5.6 or Tamron Lens
28.1= Tamron SP AF 28-105mm f/2.8 LD Aspherical IF
28.2= Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro
28.3= Tamron AF 70-300mm f/4-5.6 Di LD 1:2 Macro
28.4= Tamron AF Aspherical 28-200mm f/3.8-5.6
29= Canon EF 50mm f/1.8 II
30= Canon EF 35-105mm f/4.5-5.6
31= Canon EF 75-300mm f/4-5.6 or Tamron Lens
31.1= Tamron SP AF 300mm f/2.8 LD IF
32= Canon EF 24mm f/2.8 or Sigma Lens
32.1= Sigma 15mm f/2.8 EX Fisheye
33= Voigtlander or Carl Zeiss Lens
33.1= Voigtlander Ultron 40mm f/2 SLII Aspherical
33.2= Voigtlander Color Skopar 20mm f/3.5 SLII Aspherical
33.3= Voigtlander APO-Lanthar 90mm f/3.5 SLII Close Focus
33.4= Carl Zeiss Distagon T* 15mm f/2.8 ZE
33.5= Carl Zeiss Distagon T* 18mm f/3.5 ZE
33.6= Carl Zeiss Distagon T* 21mm f/2.8 ZE
33.7= Carl Zeiss Distagon T* 25mm f/2 ZE
33.8= Carl Zeiss Distagon T* 28mm f/2 ZE
33.9= Carl Zeiss Distagon T* 35mm f/2 ZE
33.10= Carl Zeiss Distagon T* 35mm f/1.4 ZE
33.11= Carl Zeiss Planar T* 50mm f/1.4 ZE
33.12= Carl Zeiss Makro-Planar T* 50mm f/2 ZE
33.13= Carl Zeiss Makro-Planar T* 100mm f/2 ZE
33.14= Carl Zeiss Apo-Sonnar T* 135mm f/2 ZE
35= Canon EF 35-80mm f/4-5.6
36= Canon EF 38-76mm f/4.5-5.6
37= Canon EF 35-80mm f/4-5.6 or Tamron Lens
37.1= Tamron 70-200mm f/2.8 Di LD IF Macro
37.2= Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro (A20)
37.3= Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical [IF]
37.4= Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical [IF] Macro
38= Canon EF 80-200mm f/4.5-5.6 II
39= Canon EF 75-300mm f/4-5.6
40= Canon EF 28-80mm f/3.5-5.6
41= Canon EF 28-90mm f/4-5.6
42= Canon EF 28-200mm f/3.5-5.6 or Tamron Lens
42.1= Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro (A20)
43= Canon EF 28-105mm f/4-5.6
44= Canon EF 90-300mm f/4.5-5.6
45= Canon EF-S 18-55mm f/3.5-5.6 [II]
46= Canon EF 28-90mm f/4-5.6
47= Zeiss Milvus 35mm f/2 or 50mm f/2
47.1= Zeiss Milvus 50mm f/2 Makro
47.2= Zeiss Milvus 135mm f/2 ZE
48= Canon EF-S 18-55mm f/3.5-5.6 IS
49= Canon EF-S 55-250mm f/4-5.6 IS
50= Canon EF-S 18-200mm f/3.5-5.6 IS
51= Canon EF-S 18-135mm f/3.5-5.6 IS
52= Canon EF-S 18-55mm f/3.5-5.6 IS II
53= Canon EF-S 18-55mm f/3.5-5.6 III
54= Canon EF-S 55-250mm f/4-5.6 IS II
60= Irix 11mm f/4
63= Irix 30mm F1.4 Dragonfly
80= Canon TS-E 50mm f/2.8L Macro
81= Canon TS-E 90mm f/2.8L Macro
82= Canon TS-E 135mm f/4L Macro
94= Canon TS-E 17mm f/4L
95= Canon TS-E 24mm f/3.5L II
103= Samyang AF 14mm f/2.8 EF or Rokinon Lens
103.1= Rokinon SP 14mm f/2.4
103.2= Rokinon AF 14mm f/2.8 EF
106= Rokinon SP / Samyang XP 35mm f/1.2
112= Sigma 28mm f/1.5 FF High-speed Prime or other Sigma Lens
112.1= Sigma 40mm f/1.5 FF High-speed Prime
112.2= Sigma 105mm f/1.5 FF High-speed Prime
117= Tamron 35-150mm f/2.8-4.0 Di VC OSD (A043) or other Tamron Lens
117.1= Tamron SP 35mm f/1.4 Di USD (F045)
124= Canon MP-E 65mm f/2.8 1-5x Macro Photo
125= Canon TS-E 24mm f/3.5L
126= Canon TS-E 45mm f/2.8
127= Canon TS-E 90mm f/2.8 or Tamron Lens
127.1= Tamron 18-200mm f/3.5-6.3 Di II VC (B018)
129= Canon EF 300mm f/2.8L USM
130= Canon EF 50mm f/1.0L USM
131= Canon EF 28-80mm f/2.8-4L USM or Sigma Lens
131.1= Sigma 8mm f/3.5 EX DG Circular Fisheye
131.2= Sigma 17-35mm f/2.8-4 EX DG Aspherical HSM
131.3= Sigma 17-70mm f/2.8-4.5 DC Macro
131.4= Sigma APO 50-150mm f/2.8 [II] EX DC HSM
131.5= Sigma APO 120-300mm f/2.8 EX DG HSM
131.6= Sigma 4.5mm f/2.8 EX DC HSM Circular Fisheye
131.7= Sigma 70-200mm f/2.8 APO EX HSM
131.8= Sigma 28-70mm f/2.8-4 DG
132= Canon EF 1200mm f/5.6L USM
134= Canon EF 600mm f/4L IS USM
135= Canon EF 200mm f/1.8L USM
136= Canon EF 300mm f/2.8L USM
136.1= Tamron SP 15-30mm f/2.8 Di VC USD (A012)
137= Canon EF 85mm f/1.2L USM or Sigma or Tamron Lens
137.1= Sigma 18-50mm f/2.8-4.5 DC OS HSM
137.2= Sigma 50-200mm f/4-5.6 DC OS HSM
137.3= Sigma 18-250mm f/3.5-6.3 DC OS HSM
137.4= Sigma 24-70mm f/2.8 IF EX DG HSM
137.5= Sigma 18-125mm f/3.8-5.6 DC OS HSM
137.6= Sigma 17-70mm f/2.8-4 DC Macro OS HSM | C
137.7= Sigma 17-50mm f/2.8 OS HSM
137.8= Sigma 18-200mm f/3.5-6.3 DC OS HSM [II]
137.9= Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD (B008)
137.10= Sigma 8-16mm f/4.5-5.6 DC HSM
137.11= Tamron SP 17-50mm f/2.8 XR Di II VC (B005)
137.12= Tamron SP 60mm f/2 Macro Di II (G005)
137.13= Sigma 10-20mm f/3.5 EX DC HSM
137.14= Tamron SP 24-70mm f/2.8 Di VC USD
137.15= Sigma 18-35mm f/1.8 DC HSM
137.16= Sigma 12-24mm f/4.5-5.6 DG HSM II
137.17= Sigma 70-300mm f/4-5.6 DG OS
138= Canon EF 28-80mm f/2.8-4L
139= Canon EF 400mm f/2.8L USM
140= Canon EF 500mm f/4.5L USM
141= Canon EF 500mm f/4.5L USM
142= Canon EF 300mm f/2.8L IS USM
143= Canon EF 500mm f/4L IS USM or Sigma Lens
143.1= Sigma 17-70mm f/2.8-4 DC Macro OS HSM
144= Canon EF 35-135mm f/4-5.6 USM
145= Canon EF 100-300mm f/4.5-5.6 USM
146= Canon EF 70-210mm f/3.5-4.5 USM
147= Canon EF 35-135mm f/4-5.6 USM
148= Canon EF 28-80mm f/3.5-5.6 USM
149= Canon EF 100mm f/2 USM
150= Canon EF 14mm f/2.8L USM or Sigma Lens
150.1= Sigma 20mm EX f/1.8
150.2= Sigma 30mm f/1.4 DC HSM
150.3= Sigma 24mm f/1.8 DG Macro EX
150.4= Sigma 28mm f/1.8 DG Macro EX
150.5= Sigma 18-35mm f/1.8 DC HSM | A
151= Canon EF 200mm f/2.8L USM
152= Canon EF 300mm f/4L IS USM or Sigma Lens
152.1= Sigma 12-24mm f/4.5-5.6 EX DG ASPHERICAL HSM
152.2= Sigma 14mm f/2.8 EX Aspherical HSM
152.3= Sigma 10-20mm f/4-5.6
152.4= Sigma 100-300mm f/4
152.5= Sigma 300-800mm f/5.6 APO EX DG HSM
153= Canon EF 35-350mm f/3.5-5.6L USM or Sigma or Tamron Lens
153.1= Sigma 50-500mm f/4-6.3 APO HSM EX
153.2= Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical [IF] Macro
153.3= Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical [IF] Macro (A14)
153.4= Tamron 18-250mm f/3.5-6.3 Di II LD Aspherical [IF] Macro
154= Canon EF 20mm f/2.8 USM or Zeiss Lens
154.1= Zeiss Milvus 21mm f/2.8
154.2= Zeiss Milvus 15mm f/2.8 ZE
154.3= Zeiss Milvus 18mm f/2.8 ZE
155= Canon EF 85mm f/1.8 USM or Sigma Lens
155.1= Sigma 14mm f/1.8 DG HSM | A
156= Canon EF 28-105mm f/3.5-4.5 USM or Tamron Lens
156.1= Tamron SP 70-300mm f/4-5.6 Di VC USD (A005)
156.2= Tamron SP AF 28-105mm f/2.8 LD Aspherical IF (176D)
160= Canon EF 20-35mm f/3.5-4.5 USM or Tamron or Tokina Lens
160.1= Tamron AF 19-35mm f/3.5-4.5
160.2= Tokina AT-X 124 AF Pro DX 12-24mm f/4
160.3= Tokina AT-X 107 AF DX 10-17mm f/3.5-4.5 Fisheye
160.4= Tokina AT-X 116 AF Pro DX 11-16mm f/2.8
160.5= Tokina AT-X 11-20 F2.8 PRO DX Aspherical 11-20mm f/2.8
161= Canon EF 28-70mm f/2.8L USM or Other Lens
161.1= Sigma 24-70mm f/2.8 EX
161.2= Sigma 28-70mm f/2.8 EX
161.3= Sigma 24-60mm f/2.8 EX DG
161.4= Tamron AF 17-50mm f/2.8 Di-II LD Aspherical
161.5= Tamron 90mm f/2.8
161.6= Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical IF (A05)
161.7= Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro
161.8= Tokina AT-X 24-70mm f/2.8 PRO FX (IF)
162= Canon EF 200mm f/2.8L USM
163= Canon EF 300mm f/4L
164= Canon EF 400mm f/5.6L
165= Canon EF 70-200mm f/2.8L USM
166= Canon EF 70-200mm f/2.8L USM + 1.4x
167= Canon EF 70-200mm f/2.8L USM + 2x
168= Canon EF 28mm f/1.8 USM or Sigma Lens
168.1= Sigma 50-100mm f/1.8 DC HSM | A
169= Canon EF 17-35mm f/2.8L USM or Sigma Lens
169.1= Sigma 18-200mm f/3.5-6.3 DC OS
169.2= Sigma 15-30mm f/3.5-4.5 EX DG Aspherical
169.3= Sigma 18-50mm f/2.8 Macro
169.4= Sigma 50mm f/1.4 EX DG HSM
169.5= Sigma 85mm f/1.4 EX DG HSM
169.6= Sigma 30mm f/1.4 EX DC HSM
169.7= Sigma 35mm f/1.4 DG HSM
169.8= Sigma 35mm f/1.5 FF High-Speed Prime | 017
169.9= Sigma 70mm f/2.8 Macro EX DG
170= Canon EF 200mm f/2.8L II USM or Sigma Lens
170.1= Sigma 300mm f/2.8 APO EX DG HSM
170.2= Sigma 800mm f/5.6 APO EX DG HSM
171= Canon EF 300mm f/4L USM
172= Canon EF 400mm f/5.6L USM or Sigma Lens
172.1= Sigma 150-600mm f/5-6.3 DG OS HSM | S
172.2= Sigma 500mm f/4.5 APO EX DG HSM
173= Canon EF 180mm Macro f/3.5L USM or Sigma Lens
173.1= Sigma 180mm EX HSM Macro f/3.5
173.2= Sigma APO Macro 150mm f/2.8 EX DG HSM
173.3= Sigma 10mm f/2.8 EX DC Fisheye
173.4= Sigma 15mm f/2.8 EX DG Diagonal Fisheye
173.5= Venus Laowa 100mm F2.8 2X Ultra Macro APO
174= Canon EF 135mm f/2L USM or Other Lens
174.1= Sigma 70-200mm f/2.8 EX DG APO OS HSM
174.2= Sigma 50-500mm f/4.5-6.3 APO DG OS HSM
174.3= Sigma 150-500mm f/5-6.3 APO DG OS HSM
174.4= Zeiss Milvus 100mm f/2 Makro
174.5= Sigma APO 50-150mm f/2.8 EX DC OS HSM
174.6= Sigma APO 120-300mm f/2.8 EX DG OS HSM
174.7= Sigma 120-300mm f/2.8 DG OS HSM S013
174.8= Sigma 120-400mm f/4.5-5.6 APO DG OS HSM
174.9= Sigma 200-500mm f/2.8 APO EX DG
175= Canon EF 400mm f/2.8L USM
176= Canon EF 24-85mm f/3.5-4.5 USM
177= Canon EF 300mm f/4L IS USM
178= Canon EF 28-135mm f/3.5-5.6 IS
179= Canon EF 24mm f/1.4L USM
180= Canon EF 35mm f/1.4L USM or Other Lens
180.1= Sigma 50mm f/1.4 DG HSM | A
180.2= Sigma 24mm f/1.4 DG HSM | A
180.3= Zeiss Milvus 50mm f/1.4
180.4= Zeiss Milvus 85mm f/1.4
180.5= Zeiss Otus 28mm f/1.4 ZE
180.6= Sigma 24mm f/1.5 FF High-Speed Prime | 017
180.7= Sigma 50mm f/1.5 FF High-Speed Prime | 017
180.8= Sigma 85mm f/1.5 FF High-Speed Prime | 017
180.9= Tokina Opera 50mm f/1.4 FF
180.10= Sigma 20mm f/1.4 DG HSM | A
181= Canon EF 100-400mm f/4.5-5.6L IS USM + 1.4x or Sigma Lens
181.1= Sigma 150-600mm f/5-6.3 DG OS HSM | S + 1.4x
182= Canon EF 100-400mm f/4.5-5.6L IS USM + 2x or Sigma Lens
182.1= Sigma 150-600mm f/5-6.3 DG OS HSM | S + 2x
183= Canon EF 100-400mm f/4.5-5.6L IS USM or Sigma Lens
183.1= Sigma 150mm f/2.8 EX DG OS HSM APO Macro
183.2= Sigma 105mm f/2.8 EX DG OS HSM Macro
183.3= Sigma 180mm f/2.8 EX DG OS HSM APO Macro
183.4= Sigma 150-600mm f/5-6.3 DG OS HSM | C
183.5= Sigma 150-600mm f/5-6.3 DG OS HSM | S
183.6= Sigma 100-400mm f/5-6.3 DG OS HSM
183.7= Sigma 180mm f/3.5 APO Macro EX DG IF HSM
184= Canon EF 400mm f/2.8L USM + 2x
185= Canon EF 600mm f/4L IS USM
186= Canon EF 70-200mm f/4L USM
187= Canon EF 70-200mm f/4L USM + 1.4x
188= Canon EF 70-200mm f/4L USM + 2x
189= Canon EF 70-200mm f/4L USM + 2.8x
190= Canon EF 100mm f/2.8 Macro USM
191= Canon EF 400mm f/4 DO IS or Sigma Lens
191.1= Sigma 500mm f/4 DG OS HSM
193= Canon EF 35-80mm f/4-5.6 USM
194= Canon EF 80-200mm f/4.5-5.6 USM
195= Canon EF 35-105mm f/4.5-5.6 USM
196= Canon EF 75-300mm f/4-5.6 USM
197= Canon EF 75-300mm f/4-5.6 IS USM or Sigma Lens
197.1= Sigma 18-300mm f/3.5-6.3 DC Macro OS HSM
198= Canon EF 50mm f/1.4 USM or Other Lens
198.1= Zeiss Otus 55mm f/1.4 ZE
198.2= Zeiss Otus 85mm f/1.4 ZE
198.3= Zeiss Milvus 25mm f/1.4
198.4= Zeiss Otus 100mm f/1.4
198.5= Zeiss Milvus 35mm f/1.4 ZE
198.6= Yongnuo YN 35mm f/2
199= Canon EF 28-80mm f/3.5-5.6 USM
200= Canon EF 75-300mm f/4-5.6 USM
201= Canon EF 28-80mm f/3.5-5.6 USM
202= Canon EF 28-80mm f/3.5-5.6 USM IV
208= Canon EF 22-55mm f/4-5.6 USM
209= Canon EF 55-200mm f/4.5-5.6
210= Canon EF 28-90mm f/4-5.6 USM
211= Canon EF 28-200mm f/3.5-5.6 USM
212= Canon EF 28-105mm f/4-5.6 USM
213= Canon EF 90-300mm f/4.5-5.6 USM or Tamron Lens
213.1= Tamron SP 150-600mm f/5-6.3 Di VC USD (A011)
213.2= Tamron 16-300mm f/3.5-6.3 Di II VC PZD Macro (B016)
213.3= Tamron SP 35mm f/1.8 Di VC USD (F012)
213.4= Tamron SP 45mm f/1.8 Di VC USD (F013)
214= Canon EF-S 18-55mm f/3.5-5.6 USM
215= Canon EF 55-200mm f/4.5-5.6 II USM
217= Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD
220= Yongnuo YN 50mm f/1.8
224= Canon EF 70-200mm f/2.8L IS USM
225= Canon EF 70-200mm f/2.8L IS USM + 1.4x
226= Canon EF 70-200mm f/2.8L IS USM + 2x
227= Canon EF 70-200mm f/2.8L IS USM + 2.8x
228= Canon EF 28-105mm f/3.5-4.5 USM
229= Canon EF 16-35mm f/2.8L USM
230= Canon EF 24-70mm f/2.8L USM
231= Canon EF 17-40mm f/4L USM or Sigma Lens
231.1= Sigma 12-24mm f/4 DG HSM A016
232= Canon EF 70-300mm f/4.5-5.6 DO IS USM
233= Canon EF 28-300mm f/3.5-5.6L IS USM
234= Canon EF-S 17-85mm f/4-5.6 IS USM or Tokina Lens
234.1= Tokina AT-X 12-28 PRO DX 12-28mm f/4
235= Canon EF-S 10-22mm f/3.5-4.5 USM
236= Canon EF-S 60mm f/2.8 Macro USM
237= Canon EF 24-105mm f/4L IS USM
238= Canon EF 70-300mm f/4-5.6 IS USM
239= Canon EF 85mm f/1.2L II USM or Rokinon Lens
239.1= Rokinon SP 85mm f/1.2
240= Canon EF-S 17-55mm f/2.8 IS USM or Sigma Lens
240.1= Sigma 17-50mm f/2.8 EX DC OS HSM
241= Canon EF 50mm f/1.2L USM
242= Canon EF 70-200mm f/4L IS USM
243= Canon EF 70-200mm f/4L IS USM + 1.4x
244= Canon EF 70-200mm f/4L IS USM + 2x
245= Canon EF 70-200mm f/4L IS USM + 2.8x
246= Canon EF 16-35mm f/2.8L II USM
247= Canon EF 14mm f/2.8L II USM
248= Canon EF 200mm f/2L IS USM or Sigma Lens
248.1= Sigma 24-35mm f/2 DG HSM | A
248.2= Sigma 135mm f/2 FF High-Speed Prime | 017
248.3= Sigma 24-35mm f/2.2 FF Zoom | 017
248.4= Sigma 135mm f/1.8 DG HSM A017
249= Canon EF 800mm f/5.6L IS USM
250= Canon EF 24mm f/1.4L II USM or Sigma Lens
250.1= Sigma 20mm f/1.4 DG HSM | A
250.2= Sigma 20mm f/1.5 FF High-Speed Prime | 017
250.3= Tokina Opera 16-28mm f/2.8 FF
250.4= Sigma 85mm f/1.4 DG HSM A016
251= Canon EF 70-200mm f/2.8L IS II USM
251.1= Canon EF 70-200mm f/2.8L IS III USM
252= Canon EF 70-200mm f/2.8L IS II USM + 1.4x
252.1= Canon EF 70-200mm f/2.8L IS III USM + 1.4x
253= Canon EF 70-200mm f/2.8L IS II USM + 2x
253.1= Canon EF 70-200mm f/2.8L IS III USM + 2x
254= Canon EF 100mm f/2.8L Macro IS USM or Tamron Lens
254.1= Tamron SP 90mm f/2.8 Di VC USD 1:1 Macro (F017)
255= Sigma 24-105mm f/4 DG OS HSM | A or Other Lens
255.1= Sigma 180mm f/2.8 EX DG OS HSM APO Macro
255.2= Tamron SP 70-200mm f/2.8 Di VC USD
368= Sigma 14-24mm f/2.8 DG HSM | A or other Sigma Lens
368.1= Sigma 20mm f/1.4 DG HSM | A
368.2= Sigma 50mm f/1.4 DG HSM | A
368.3= Sigma 40mm f/1.4 DG HSM | A
368.4= Sigma 60-600mm f/4.5-6.3 DG OS HSM | S
368.5= Sigma 28mm f/1.4 DG HSM | A
368.6= Sigma 150-600mm f/5-6.3 DG OS HSM | S
368.7= Sigma 85mm f/1.4 DG HSM | A
368.8= Sigma 105mm f/1.4 DG HSM
368.9= Sigma 14-24mm f/2.8 DG HSM
368.10= Sigma 35mm f/1.4 DG HSM | A
368.11= Sigma 70mm f/2.8 DG Macro
368.12= Sigma 18-35mm f/1.8 DC HSM | A
488= Canon EF-S 15-85mm f/3.5-5.6 IS USM
489= Canon EF 70-300mm f/4-5.6L IS USM
490= Canon EF 8-15mm f/4L Fisheye USM
491= Canon EF 300mm f/2.8L IS II USM or Tamron Lens
491.1= Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)
491.2= Tamron 18-400mm f/3.5-6.3 Di II VC HLD (B028)
491.3= Tamron 100-400mm f/4.5-6.3 Di VC USD (A035)
491.4= Tamron 70-210mm f/4 Di VC USD (A034)
491.5= Tamron 70-210mm f/4 Di VC USD (A034) + 1.4x
491.6= Tamron SP 24-70mm f/2.8 Di VC USD G2 (A032)
492= Canon EF 400mm f/2.8L IS II USM
493= Canon EF 500mm f/4L IS II USM or EF 24-105mm f4L IS USM
493.1= Canon EF 24-105mm f/4L IS USM
494= Canon EF 600mm f/4L IS II USM
495= Canon EF 24-70mm f/2.8L II USM or Sigma Lens
495.1= Sigma 24-70mm f/2.8 DG OS HSM | A
496= Canon EF 200-400mm f/4L IS USM
499= Canon EF 200-400mm f/4L IS USM + 1.4x
502= Canon EF 28mm f/2.8 IS USM or Tamron Lens
502.1= Tamron 35mm f/1.8 Di VC USD (F012)
503= Canon EF 24mm f/2.8 IS USM
504= Canon EF 24-70mm f/4L IS USM
505= Canon EF 35mm f/2 IS USM
506= Canon EF 400mm f/4 DO IS II USM
507= Canon EF 16-35mm f/4L IS USM
508= Canon EF 11-24mm f/4L USM or Tamron Lens
508.1= Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)
624= Sigma 70-200mm f/2.8 DG OS HSM | S or other Sigma Lens
624.1= Sigma 150-600mm f/5-6.3 | C
747= Canon EF 100-400mm f/4.5-5.6L IS II USM or Tamron Lens
747.1= Tamron SP 150-600mm f/5-6.3 Di VC USD G2
748= Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x or Tamron Lens
748.1= Tamron 100-400mm f/4.5-6.3 Di VC USD A035E + 1.4x
748.2= Tamron 70-210mm f/4 Di VC USD (A034) + 2x
749= Tamron 100-400mm f/4.5-6.3 Di VC USD A035E + 2x
750= Canon EF 35mm f/1.4L II USM or Tamron Lens
750.1= Tamron SP 85mm f/1.8 Di VC USD (F016)
750.2= Tamron SP 45mm f/1.8 Di VC USD (F013)
751= Canon EF 16-35mm f/2.8L III USM
752= Canon EF 24-105mm f/4L IS II USM
753= Canon EF 85mm f/1.4L IS USM
754= Canon EF 70-200mm f/4L IS II USM
757= Canon EF 400mm f/2.8L IS III USM
758= Canon EF 600mm f/4L IS III USM
1136= Sigma 24-70mm f/2.8 DG OS HSM | A
4142= Canon EF-S 18-135mm f/3.5-5.6 IS STM
4143= Canon EF-M 18-55mm f/3.5-5.6 IS STM or Tamron Lens
4143.1= Tamron 18-200mm f/3.5-6.3 Di III VC
4144= Canon EF 40mm f/2.8 STM
4145= Canon EF-M 22mm f/2 STM
4146= Canon EF-S 18-55mm f/3.5-5.6 IS STM
4147= Canon EF-M 11-22mm f/4-5.6 IS STM
4148= Canon EF-S 55-250mm f/4-5.6 IS STM
4149= Canon EF-M 55-200mm f/4.5-6.3 IS STM
4150= Canon EF-S 10-18mm f/4.5-5.6 IS STM
4152= Canon EF 24-105mm f/3.5-5.6 IS STM
4153= Canon EF-M 15-45mm f/3.5-6.3 IS STM
4154= Canon EF-S 24mm f/2.8 STM
4155= Canon EF-M 28mm f/3.5 Macro IS STM
4156= Canon EF 50mm f/1.8 STM
4157= Canon EF-M 18-150mm f/3.5-6.3 IS STM
4158= Canon EF-S 18-55mm f/4-5.6 IS STM
4159= Canon EF-M 32mm f/1.4 STM
4160= Canon EF-S 35mm f/2.8 Macro IS STM
4208= Sigma 56mm f/1.4 DC DN | C or other Sigma Lens
4208.1= Sigma 30mm F1.4 DC DN | C
36910= Canon EF 70-300mm f/4-5.6 IS II USM
36912= Canon EF-S 18-135mm f/3.5-5.6 IS USM
61182= Canon RF 50mm F1.2L USM or other Canon RF Lens
61182.1= Canon RF 24-105mm F4L IS USM
61182.2= Canon RF 28-70mm F2L USM
61182.3= Canon RF 35mm F1.8 MACRO IS STM
61182.4= Canon RF 85mm F1.2L USM
61182.5= Canon RF 85mm F1.2L USM DS
61182.6= Canon RF 24-70mm F2.8L IS USM
61182.7= Canon RF 15-35mm F2.8L IS USM
61182.8= Canon RF 24-240mm F4-6.3 IS USM
61182.9= Canon RF 70-200mm F2.8L IS USM
61182.10= Canon RF 85mm F2 MACRO IS STM
61182.11= Canon RF 600mm F11 IS STM
61182.12= Canon RF 600mm F11 IS STM + RF1.4x
61182.13= Canon RF 600mm F11 IS STM + RF2x
61182.14= Canon RF 800mm F11 IS STM
61182.15= Canon RF 800mm F11 IS STM + RF1.4x
61182.16= Canon RF 800mm F11 IS STM + RF2x
61182.17= Canon RF 24-105mm F4-7.1 IS STM
61182.18= Canon RF 100-500mm F4.5-7.1L IS USM
61182.19= Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x
61182.20= Canon RF 100-500mm F4.5-7.1L IS USM + RF2x
61182.21= Canon RF 70-200mm F4L IS USM
61182.22= Canon RF 100mm F2.8L MACRO IS USM
61182.23= Canon RF 50mm F1.8 STM
61182.24= Canon RF 14-35mm F4L IS USM
61182.25= Canon RF-S 18-45mm F4.5-6.3 IS STM
61182.26= Canon RF 100-400mm F5.6-8 IS USM
61182.27= Canon RF 100-400mm F5.6-8 IS USM + RF1.4x
61182.28= Canon RF 100-400mm F5.6-8 IS USM + RF2x
61182.29= Canon RF-S 18-150mm F3.5-6.3 IS STM
61182.30= Canon RF 16mm F2.8 STM
61182.31= Canon RF 400mm F2.8L IS USM
61182.32= Canon RF 400mm F2.8L IS USM + RF1.4x
61182.33= Canon RF 400mm F2.8L IS USM + RF2x
61182.34= Canon RF 600mm F4L IS USM
61182.35= Canon RF 800mm F5.6L IS USM
61182.36= Canon RF 1200mm F8L IS USM
61182.37= Canon RF 5.2mm F2.8L Dual Fisheye 3D VR
61491= Canon CN-E 14mm T3.1 L F
61492= Canon CN-E 24mm T1.5 L F
61494= Canon CN-E 85mm T1.3 L F
61495= Canon CN-E 135mm T2.2 L F
61496= Canon CN-E 35mm T1.5 L F
65535= n/a
+ +

Canon FocalLength Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0FocalTypeint16u1 = Fixed +
2 = Zoom
1FocalLengthint16u 
2FocalPlaneXSize +
FocalPlaneXUnknown?
int16u
int16u
(these focal plane sizes are only valid for some models, and are affected by +digital zoom if applied)
3FocalPlaneYSize +
FocalPlaneYUnknown?
int16u
int16u
 
+ +

Canon ShotInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1AutoISOint16s(actual ISO used = BaseISO * AutoISO / 100)
2BaseISOint16s 
3MeasuredEVint16s(this is the Canon name for what could better be called MeasuredLV, and +should be close to the calculated LightValue for a proper exposure with most +models)
4TargetApertureint16s 
5TargetExposureTimeint16s 
6ExposureCompensationint16s 
7WhiteBalanceint16s--> Canon WhiteBalance Values
8SlowShutterint16s-1 = n/a +
0 = Off +
1 = Night Scene +
2 = On +
3 = None
9SequenceNumberint16s(valid only for some models)
10OpticalZoomCodeint16s(for many PowerShot models, a this is 0-6 for wide-tele zoom)
12CameraTemperatureint16s(newer EOS models only)
13FlashGuideNumberint16s 
14AFPointsInFocusint16s(used by D30, D60 and some PowerShot/Ixus models) + +
0x3000 = None (MF) +
0x3001 = Right +
0x3002 = Center +
0x3003 = Center+Right
  0x3004 = Left +
0x3005 = Left+Right +
0x3006 = Left+Center +
0x3007 = All
+
15FlashExposureCompint16s 
16AutoExposureBracketingint16s-1 = On +
0 = Off +
1 = On (shot 1) +
2 = On (shot 2) +
3 = On (shot 3)
17AEBBracketValueint16s 
18ControlModeint16s0 = n/a +
1 = Camera Local Control +
3 = Computer Remote Control
19FocusDistanceUpperint16u(FocusDistance tags are only extracted if FocusDistanceUpper is non-zero)
20FocusDistanceLowerint16u 
21FNumberint16s 
22ExposureTimeint16s 
23MeasuredEV2int16s 
24BulbDurationint16s 
26CameraTypeint16s0 = n/a +
248 = EOS High-end +
250 = Compact +
252 = EOS Mid-range +
255 = DV Camera
27AutoRotateint16s-1 = n/a +
0 = None +
1 = Rotate 90 CW +
2 = Rotate 180 +
3 = Rotate 270 CW
28NDFilterint16s-1 = n/a +
0 = Off +
1 = On
29SelfTimer2int16s 
33FlashOutputint16s(used only for PowerShot models, this has a maximum value of 500 for models +like the A570IS)
+ +

Canon WhiteBalance Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueWhiteBalanceValueWhiteBalanceValueWhiteBalance
0= Auto8= Shade17= Underwater
1= Daylight9= Manual Temperature (Kelvin)18= Custom 3
2= Cloudy10= PC Set119= Custom 4
3= Tungsten11= PC Set220= PC Set4
4= Fluorescent12= PC Set321= PC Set5
5= Flash14= Daylight Fluorescent23= Auto (ambience priority)
6= Custom15= Custom 1  
7= Black & White16= Custom 2  
+ +

Canon Panorama Tags

+
+
+ + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
2PanoramaFrameNumberint16s 
5PanoramaDirectionint16s0 = Left to Right +
1 = Right to Left +
2 = Bottom to Top +
3 = Top to Bottom +
4 = 2x2 Matrix (Clockwise)
+ +

Canon UnknownD30 Tags

+
+
+ + + + +
Index2Tag NameWritableValues / Notes
[no tags known]
+ +

Canon CameraInfo1D Tags

+

Information in the "CameraInfo" records is tricky to decode because the +encodings are very different than in other Canon records (even sometimes +switching endianness between values within a single camera), plus there is +considerable variation in format from model to model. The first table below +lists CameraInfo tags for the 1D and 1DS.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4ExposureTimeint8u 
10FocalLengthint16u 
13LensTypeint16uRev--> Canon LensType Values
14MinFocalLengthint16u 
16MaxFocalLengthint16u 
65SharpnessFrequencyint8u(1D only) + +
0 = n/a +
1 = Lowest +
2 = Low
  3 = Standard +
4 = High +
5 = Highest
+
66Sharpnessint8s(1D only)
68WhiteBalanceint8u--> Canon WhiteBalance Values +
(1D only)
71SharpnessFrequencyint8u(1DS only) + +
0 = n/a +
1 = Lowest +
2 = Low
  3 = Standard +
4 = High +
5 = Highest
+
72ColorTemperature +
Sharpness
int16u
int8s
(1D only) +
(1DS only)
74WhiteBalanceint8u--> Canon WhiteBalance Values +
(1DS only)
75PictureStyleint8u--> Canon PictureStyle Values +
(1D only, called 'Color Matrix' in owner's manual)
78ColorTemperatureint16u(1DS only)
81PictureStyleint8u--> Canon PictureStyle Values +
(1DS only)
+ +

Canon CameraInfo1DmkII Tags

+

CameraInfo tags for the 1DmkII and 1DSmkII.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4ExposureTimeint8u 
9FocalLengthint16uRev 
12LensTypeint16uRev--> Canon LensType Values
17MinFocalLengthint16uRev 
19MaxFocalLengthint16uRev 
45FocalTypeint8u0 = Fixed +
2 = Zoom
54WhiteBalanceint8u--> Canon WhiteBalance Values
55ColorTemperatureint16uRev 
57CanonImageSizeint16u + +
-1 = n/a +
0 = Large +
1 = Medium +
2 = Small +
5 = Medium 1 +
6 = Medium 2 +
7 = Medium 3 +
8 = Postcard +
9 = Widescreen +
10 = Medium Widescreen
  14 = Small 1 +
15 = Small 2 +
16 = Small 3 +
128 = 640x480 Movie +
129 = Medium Movie +
130 = Small Movie +
137 = 1280x720 Movie +
142 = 1920x1080 Movie +
143 = 4096x2160 Movie
+
102JPEGQualityint8u(a number from 1 to 10)
108PictureStyleint8u--> Canon PictureStyle Values
110Saturationint8s0 = Normal
111ColorToneint8s0 = Normal
114Sharpnessint8s 
115Contrastint8s0 = Normal
117ISOstring[5] 
+ +

Canon CameraInfo1DmkIIN Tags

+

CameraInfo tags for the 1DmkIIN.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4ExposureTimeint8u 
9FocalLengthint16uRev 
12LensTypeint16uRev--> Canon LensType Values
17MinFocalLengthint16uRev 
19MaxFocalLengthint16uRev 
54WhiteBalanceint8u--> Canon WhiteBalance Values
55ColorTemperatureint16uRev 
115PictureStyleint8u--> Canon PictureStyle Values
116Sharpnessint8s 
117Contrastint8s0 = Normal
118Saturationint8s0 = Normal
119ColorToneint8s0 = Normal
121ISOstring[5] 
+ +

Canon CameraInfo1DmkIII Tags

+

CameraInfo tags for the 1DmkIII and 1DSmkIII.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
24CameraTemperatureint8u 
27MacroMagnificationint8u(currently decoded only for the MP-E 65mm f/2.8 1-5x Macro Photo)
29FocalLengthint16uRev 
48CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
67FocusDistanceUpperint16uRev 
69FocusDistanceLowerint16uRev 
94WhiteBalanceint16u--> Canon WhiteBalance Values
98ColorTemperatureint16u 
134PictureStyleint8u--> Canon PictureStyle Values
273LensTypeint16uRev--> Canon LensType Values
275MinFocalLengthint16uRev 
277MaxFocalLengthint16uRev 
310FirmwareVersionstring[6] 
370FileIndexint32u 
374ShutterCountint32u(may be valid only for some 1DmkIII copies, even running the same firmware)
382DirectoryIndexint32u 
682PictureStyleInfo---> Canon PSInfo Tags
1114TimeStamp1int32u(only valid for some versions of the 1DmkIII firmware)
1118TimeStampint32u(valid for the 1DSmkIII and some versions of the 1DmkIII firmware)
+ +

Canon PSInfo Tags

+

Custom picture style information for various models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ContrastStandardint32s0xdeadbeef = n/a
4SharpnessStandardint32s0xdeadbeef = n/a
8SaturationStandardint32s0xdeadbeef = n/a
12ColorToneStandardint32s0xdeadbeef = n/a
16FilterEffectStandard?int32s0xdeadbeef = n/a
20ToningEffectStandard?int32s0xdeadbeef = n/a
24ContrastPortraitint32s0xdeadbeef = n/a
28SharpnessPortraitint32s0xdeadbeef = n/a
32SaturationPortraitint32s0xdeadbeef = n/a
36ColorTonePortraitint32s0xdeadbeef = n/a
40FilterEffectPortrait?int32s0xdeadbeef = n/a
44ToningEffectPortrait?int32s0xdeadbeef = n/a
48ContrastLandscapeint32s0xdeadbeef = n/a
52SharpnessLandscapeint32s0xdeadbeef = n/a
56SaturationLandscapeint32s0xdeadbeef = n/a
60ColorToneLandscapeint32s0xdeadbeef = n/a
64FilterEffectLandscape?int32s0xdeadbeef = n/a
68ToningEffectLandscape?int32s0xdeadbeef = n/a
72ContrastNeutralint32s0xdeadbeef = n/a
76SharpnessNeutralint32s0xdeadbeef = n/a
80SaturationNeutralint32s0xdeadbeef = n/a
84ColorToneNeutralint32s0xdeadbeef = n/a
88FilterEffectNeutral?int32s0xdeadbeef = n/a
92ToningEffectNeutral?int32s0xdeadbeef = n/a
96ContrastFaithfulint32s0xdeadbeef = n/a
100SharpnessFaithfulint32s0xdeadbeef = n/a
104SaturationFaithfulint32s0xdeadbeef = n/a
108ColorToneFaithfulint32s0xdeadbeef = n/a
112FilterEffectFaithful?int32s0xdeadbeef = n/a
116ToningEffectFaithful?int32s0xdeadbeef = n/a
120ContrastMonochromeint32s0xdeadbeef = n/a
124SharpnessMonochromeint32s0xdeadbeef = n/a
128SaturationMonochrome?int32s0xdeadbeef = n/a
132ColorToneMonochrome?int32s0xdeadbeef = n/a
136FilterEffectMonochromeint32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Yellow
  0x2 = Orange +
0x3 = Red +
0x4 = Green
+
140ToningEffectMonochromeint32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Sepia
  0x2 = Blue +
0x3 = Purple +
0x4 = Green
+
144ContrastUserDef1int32s0xdeadbeef = n/a
148SharpnessUserDef1int32s0xdeadbeef = n/a
152SaturationUserDef1int32s0xdeadbeef = n/a
156ColorToneUserDef1int32s0xdeadbeef = n/a
160FilterEffectUserDef1int32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Yellow
  0x2 = Orange +
0x3 = Red +
0x4 = Green
+
164ToningEffectUserDef1int32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Sepia
  0x2 = Blue +
0x3 = Purple +
0x4 = Green
+
168ContrastUserDef2int32s0xdeadbeef = n/a
172SharpnessUserDef2int32s0xdeadbeef = n/a
176SaturationUserDef2int32s0xdeadbeef = n/a
180ColorToneUserDef2int32s0xdeadbeef = n/a
184FilterEffectUserDef2int32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Yellow
  0x2 = Orange +
0x3 = Red +
0x4 = Green
+
188ToningEffectUserDef2int32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Sepia
  0x2 = Blue +
0x3 = Purple +
0x4 = Green
+
192ContrastUserDef3int32s0xdeadbeef = n/a
196SharpnessUserDef3int32s0xdeadbeef = n/a
200SaturationUserDef3int32s0xdeadbeef = n/a
204ColorToneUserDef3int32s0xdeadbeef = n/a
208FilterEffectUserDef3int32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Yellow
  0x2 = Orange +
0x3 = Red +
0x4 = Green
+
212ToningEffectUserDef3int32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Sepia
  0x2 = Blue +
0x3 = Purple +
0x4 = Green
+
216UserDef1PictureStyleint16u--> Canon UserDefStyle Values
218UserDef2PictureStyleint16u--> Canon UserDefStyle Values
220UserDef3PictureStyleint16u--> Canon UserDefStyle Values
+ +

Canon UserDefStyle Values

+

Base style for user-defined picture styles. PC values represent external +picture styles which may be downloaded from Canon and installed in the +camera.

+
+
+ + + + + + + + + + + + + + +
ValueUserDefStyleValueUserDefStyleValueUserDefStyle
0x41= PC 10x82= Portrait0x86= Monochrome
0x42= PC 20x83= Landscape0x87= Auto
0x43= PC 30x84= Neutral  
0x81= Standard0x85= Faithful  
+ +

Canon CameraInfo1DmkIV Tags

+

CameraInfo tags for the EOS 1D Mark IV. Indices shown are for firmware +versions 1.0.x, but they may be different for other firmware versions.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
7HighlightTonePriorityint8u0 = Off +
1 = On
8MeasuredEV2int8u 
9MeasuredEV3int8u 
21FlashMeteringModeint8u0 = E-TTL +
3 = TTL +
4 = External Auto +
5 = External Manual +
6 = Off
25CameraTemperatureint8u 
30FocalLengthint16uRev 
53CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
84FocusDistanceUpperint16uRev 
86FocusDistanceLowerint16uRev 
120WhiteBalanceint16u--> Canon WhiteBalance Values
124ColorTemperatureint16u 
335LensTypeint16uRev--> Canon LensType Values
337MinFocalLengthint16uRev 
339MaxFocalLengthint16uRev 
493FirmwareVersionno 
556FileIndexint32u 
568DirectoryIndexint32u 
872PictureStyleInfo---> Canon PSInfo Tags
+ +

Canon CameraInfo1DX Tags

+

CameraInfo tags for the EOS 1D X. Indices shown are for firmware version +1.0.2, but they may be different for other firmware versions.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
27CameraTemperatureint8u 
35FocalLengthint16uRev 
125CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
140FocusDistanceUpperint16uRev 
142FocusDistanceLowerint16uRev 
188WhiteBalanceint16u--> Canon WhiteBalance Values
192ColorTemperatureint16u 
244PictureStyleint8u--> Canon PictureStyle Values
423LensTypeint16uRev--> Canon LensType Values
425MinFocalLengthint16uRev 
427MaxFocalLengthint16uRev 
640FirmwareVersionno 
720FileIndexint32u 
732DirectoryIndexint32u 
1012PictureStyleInfo---> Canon PSInfo2 Tags
+ +

Canon PSInfo2 Tags

+

Custom picture style information for the EOS 5DmkIII, 60D, 600D and 1100D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ContrastStandardint32s0xdeadbeef = n/a
4SharpnessStandardint32s0xdeadbeef = n/a
8SaturationStandardint32s0xdeadbeef = n/a
12ColorToneStandardint32s0xdeadbeef = n/a
16FilterEffectStandard?int32s0xdeadbeef = n/a
20ToningEffectStandard?int32s0xdeadbeef = n/a
24ContrastPortraitint32s0xdeadbeef = n/a
28SharpnessPortraitint32s0xdeadbeef = n/a
32SaturationPortraitint32s0xdeadbeef = n/a
36ColorTonePortraitint32s0xdeadbeef = n/a
40FilterEffectPortrait?int32s0xdeadbeef = n/a
44ToningEffectPortrait?int32s0xdeadbeef = n/a
48ContrastLandscapeint32s0xdeadbeef = n/a
52SharpnessLandscapeint32s0xdeadbeef = n/a
56SaturationLandscapeint32s0xdeadbeef = n/a
60ColorToneLandscapeint32s0xdeadbeef = n/a
64FilterEffectLandscape?int32s0xdeadbeef = n/a
68ToningEffectLandscape?int32s0xdeadbeef = n/a
72ContrastNeutralint32s0xdeadbeef = n/a
76SharpnessNeutralint32s0xdeadbeef = n/a
80SaturationNeutralint32s0xdeadbeef = n/a
84ColorToneNeutralint32s0xdeadbeef = n/a
88FilterEffectNeutral?int32s0xdeadbeef = n/a
92ToningEffectNeutral?int32s0xdeadbeef = n/a
96ContrastFaithfulint32s0xdeadbeef = n/a
100SharpnessFaithfulint32s0xdeadbeef = n/a
104SaturationFaithfulint32s0xdeadbeef = n/a
108ColorToneFaithfulint32s0xdeadbeef = n/a
112FilterEffectFaithful?int32s0xdeadbeef = n/a
116ToningEffectFaithful?int32s0xdeadbeef = n/a
120ContrastMonochromeint32s0xdeadbeef = n/a
124SharpnessMonochromeint32s0xdeadbeef = n/a
128SaturationMonochrome?int32s0xdeadbeef = n/a
132ColorToneMonochrome?int32s0xdeadbeef = n/a
136FilterEffectMonochromeint32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Yellow
  0x2 = Orange +
0x3 = Red +
0x4 = Green
+
140ToningEffectMonochromeint32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Sepia
  0x2 = Blue +
0x3 = Purple +
0x4 = Green
+
144ContrastAutoint32s0xdeadbeef = n/a
148SharpnessAutoint32s0xdeadbeef = n/a
152SaturationAutoint32s0xdeadbeef = n/a
156ColorToneAutoint32s0xdeadbeef = n/a
160FilterEffectAutoint32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Yellow
  0x2 = Orange +
0x3 = Red +
0x4 = Green
+
164ToningEffectAutoint32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Sepia
  0x2 = Blue +
0x3 = Purple +
0x4 = Green
+
168ContrastUserDef1int32s0xdeadbeef = n/a
172SharpnessUserDef1int32s0xdeadbeef = n/a
176SaturationUserDef1int32s0xdeadbeef = n/a
180ColorToneUserDef1int32s0xdeadbeef = n/a
184FilterEffectUserDef1int32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Yellow
  0x2 = Orange +
0x3 = Red +
0x4 = Green
+
188ToningEffectUserDef1int32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Sepia
  0x2 = Blue +
0x3 = Purple +
0x4 = Green
+
192ContrastUserDef2int32s0xdeadbeef = n/a
196SharpnessUserDef2int32s0xdeadbeef = n/a
200SaturationUserDef2int32s0xdeadbeef = n/a
204ColorToneUserDef2int32s0xdeadbeef = n/a
208FilterEffectUserDef2int32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Yellow
  0x2 = Orange +
0x3 = Red +
0x4 = Green
+
212ToningEffectUserDef2int32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Sepia
  0x2 = Blue +
0x3 = Purple +
0x4 = Green
+
216ContrastUserDef3int32s0xdeadbeef = n/a
220SharpnessUserDef3int32s0xdeadbeef = n/a
224SaturationUserDef3int32s0xdeadbeef = n/a
228ColorToneUserDef3int32s0xdeadbeef = n/a
232FilterEffectUserDef3int32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Yellow
  0x2 = Orange +
0x3 = Red +
0x4 = Green
+
236ToningEffectUserDef3int32s + +
0xdeadbeef = n/a +
0x0 = None +
0x1 = Sepia
  0x2 = Blue +
0x3 = Purple +
0x4 = Green
+
240UserDef1PictureStyleint16u--> Canon UserDefStyle Values
242UserDef2PictureStyleint16u--> Canon UserDefStyle Values
244UserDef3PictureStyleint16u--> Canon UserDefStyle Values
+ +

Canon CameraInfo5D Tags

+

CameraInfo tags for the EOS 5D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
12LensTypeint16uRev--> Canon LensType Values
23CameraTemperatureint8u 
27MacroMagnificationint8s(currently decoded only for the MP-E 65mm f/2.8 1-5x Macro Photo)
39CameraOrientationint8s0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
40FocalLengthint16uRev 
56AFPointsInFocus5Dint16uRev + +
0x0 = (none) +
Bit 0 = Center +
Bit 1 = Top +
Bit 2 = Bottom +
Bit 3 = Upper-left +
Bit 4 = Upper-right +
Bit 5 = Lower-left +
Bit 6 = Lower-right
  Bit 7 = Left +
Bit 8 = Right +
Bit 9 = AI Servo1 +
Bit 10 = AI Servo2 +
Bit 11 = AI Servo3 +
Bit 12 = AI Servo4 +
Bit 13 = AI Servo5 +
Bit 14 = AI Servo6
+
84WhiteBalanceint16u--> Canon WhiteBalance Values
88ColorTemperatureint16u 
108PictureStyleint8u--> Canon PictureStyle Values
147MinFocalLengthint16uRev 
149MaxFocalLengthint16uRev 
151LensTypeint16uRev--> Canon LensType Values
164FirmwareRevisionstring[8] 
172ShortOwnerNamestring[16] 
204DirectoryIndexint32u 
208FileIndexint16u 
232ContrastStandardint8s 
233ContrastPortraitint8s 
234ContrastLandscapeint8s 
235ContrastNeutralint8s 
236ContrastFaithfulint8s 
237ContrastMonochromeint8s 
238ContrastUserDef1int8s 
239ContrastUserDef2int8s 
240ContrastUserDef3int8s 
241SharpnessStandardint8s 
242SharpnessPortraitint8s 
243SharpnessLandscapeint8s 
244SharpnessNeutralint8s 
245SharpnessFaithfulint8s 
246SharpnessMonochromeint8s 
247SharpnessUserDef1int8s 
248SharpnessUserDef2int8s 
249SharpnessUserDef3int8s 
250SaturationStandardint8s 
251SaturationPortraitint8s 
252SaturationLandscapeint8s 
253SaturationNeutralint8s 
254SaturationFaithfulint8s 
255FilterEffectMonochromeint8s + +
-559038737 = n/a +
0 = None +
1 = Yellow
  2 = Orange +
3 = Red +
4 = Green
+
256SaturationUserDef1int8s 
257SaturationUserDef2int8s 
258SaturationUserDef3int8s 
259ColorToneStandardint8s 
260ColorTonePortraitint8s 
261ColorToneLandscapeint8s 
262ColorToneNeutralint8s 
263ColorToneFaithfulint8s 
264ToningEffectMonochromeint8s + +
-559038737 = n/a +
0 = None +
1 = Sepia
  2 = Blue +
3 = Purple +
4 = Green
+
265ColorToneUserDef1int8s 
266ColorToneUserDef2int8s 
267ColorToneUserDef3int8s 
268UserDef1PictureStyleint16u--> Canon UserDefStyle Values
270UserDef2PictureStyleint16u--> Canon UserDefStyle Values
272UserDef3PictureStyleint16u--> Canon UserDefStyle Values
284TimeStampint32u 
+ +

Canon CameraInfo5DmkII Tags

+

CameraInfo tags for the EOS 5D Mark II. Indices shown are for firmware +version 1.0.6, but they may be different for other firmware versions.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
7HighlightTonePriorityint8u0 = Off +
1 = On
21FlashMeteringModeint8u0 = E-TTL +
3 = TTL +
4 = External Auto +
5 = External Manual +
6 = Off
25CameraTemperatureint8u 
27MacroMagnificationint8u(currently decoded only for the MP-E 65mm f/2.8 1-5x Macro Photo)
30FocalLengthint16uRev 
49CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
80FocusDistanceUpperint16uRev 
82FocusDistanceLowerint16uRev 
111WhiteBalanceint16u--> Canon WhiteBalance Values
115ColorTemperatureint16u 
167PictureStyleint8u--> Canon PictureStyle Values
189HighISONoiseReductionint8u0 = Standard +
1 = Low +
2 = Strong +
3 = Off
191AutoLightingOptimizerint8u0 = Standard +
1 = Low +
2 = Strong +
3 = Off
230LensTypeint16uRev--> Canon LensType Values
232MinFocalLengthint16uRev 
234MaxFocalLengthint16uRev 
382FirmwareVersionno 
443FileIndexint32u 
455DirectoryIndexint32u 
759PictureStyleInfo---> Canon PSInfo Tags
+ +

Canon CameraInfo5DmkIII Tags

+

CameraInfo tags for the EOS 5D Mark III. Indices shown are for firmware +versions 1.0.x, but they may be different for other firmware versions.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
27CameraTemperatureint8u 
35FocalLengthint16uRev 
125CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
140FocusDistanceUpperint16uRev 
142FocusDistanceLowerint16uRev 
188WhiteBalanceint16u--> Canon WhiteBalance Values
192ColorTemperatureint16u 
244PictureStyleint8u--> Canon PictureStyle Values
339LensTypeint16uRev--> Canon LensType Values
341MinFocalLengthint16uRev 
343MaxFocalLengthint16uRev 
356LensSerialNumberundef[5] 
572FirmwareVersionno 
652FileIndexint32u 
656FileIndex2int32u 
664DirectoryIndexint32u 
668DirectoryIndex2int32u 
944PictureStyleInfo---> Canon PSInfo2 Tags
+ +

Canon CameraInfo6D Tags

+

CameraInfo tags for the EOS 6D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
27CameraTemperatureint8u 
35FocalLengthint16uRev 
131CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
146FocusDistanceUpperint16uRev 
148FocusDistanceLowerint16uRev 
194WhiteBalanceint16u--> Canon WhiteBalance Values
198ColorTemperatureint16u 
250PictureStyleint8u--> Canon PictureStyle Values
353LensTypeint16uRev--> Canon LensType Values
355MinFocalLengthint16uRev 
357MaxFocalLengthint16uRev 
598FirmwareVersionno 
682FileIndexint32u 
694DirectoryIndexint32u 
966PictureStyleInfo---> Canon PSInfo2 Tags
+ +

Canon CameraInfo7D Tags

+

CameraInfo tags for the EOS 7D. Indices shown are for firmware versions +1.0.x, but they may be different for other firmware versions.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
7HighlightTonePriorityint8u0 = Off +
1 = On
8MeasuredEV2int8u 
9MeasuredEVint8u 
21FlashMeteringModeint8u0 = E-TTL +
3 = TTL +
4 = External Auto +
5 = External Manual +
6 = Off
25CameraTemperatureint8u 
30FocalLengthint16uRev 
53CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
84FocusDistanceUpperint16uRev 
86FocusDistanceLowerint16uRev 
119WhiteBalanceint16u--> Canon WhiteBalance Values
123ColorTemperatureint16u 
175CameraPictureStyleint8u + +
0x21 = User Defined 1 +
0x22 = User Defined 2 +
0x23 = User Defined 3 +
0x81 = Standard +
0x82 = Portrait
  0x83 = Landscape +
0x84 = Neutral +
0x85 = Faithful +
0x86 = Monochrome
+
201HighISONoiseReductionint8u0 = Standard +
1 = Low +
2 = Strong +
3 = Off
274LensTypeint16uRev--> Canon LensType Values
276MinFocalLengthint16uRev 
278MaxFocalLengthint16uRev 
428FirmwareVersionno 
491FileIndexint32u 
503DirectoryIndexint32u 
807PictureStyleInfo---> Canon PSInfo Tags
+ +

Canon CameraInfo40D Tags

+

CameraInfo tags for the EOS 40D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
21FlashMeteringModeint8u0 = E-TTL +
3 = TTL +
4 = External Auto +
5 = External Manual +
6 = Off
24CameraTemperatureint8u 
27MacroMagnificationint8u(currently decoded only for the MP-E 65mm f/2.8 1-5x Macro Photo)
29FocalLengthint16uRev 
48CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
67FocusDistanceUpperint16uRev 
69FocusDistanceLowerint16uRev 
111WhiteBalanceint16u--> Canon WhiteBalance Values
115ColorTemperatureint16u 
214LensTypeint16uRev--> Canon LensType Values
216MinFocalLengthint16uRev 
218MaxFocalLengthint16uRev 
255FirmwareVersionstring[6] 
307FileIndexint32u(combined with DirectoryIndex to give the Composite FileNumber tag)
319DirectoryIndexint32u 
603PictureStyleInfo---> Canon PSInfo Tags
2347LensModelstring[64] 
+ +

Canon CameraInfo50D Tags

+

CameraInfo tags for the EOS 50D. Indices shown are for firmware versions +1.0.x, but they may be different for other firmware versions.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
7HighlightTonePriorityint8u0 = Off +
1 = On
21FlashMeteringModeint8u0 = E-TTL +
3 = TTL +
4 = External Auto +
5 = External Manual +
6 = Off
25CameraTemperatureint8u 
30FocalLengthint16uRev 
49CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
80FocusDistanceUpperint16uRev 
82FocusDistanceLowerint16uRev 
111WhiteBalanceint16u--> Canon WhiteBalance Values
115ColorTemperatureint16u 
167PictureStyleint8u--> Canon PictureStyle Values
189HighISONoiseReductionint8u0 = Standard +
1 = Low +
2 = Strong +
3 = Off
191AutoLightingOptimizerint8u0 = Standard +
1 = Low +
2 = Strong +
3 = Off
234LensTypeint16uRev--> Canon LensType Values
236MinFocalLengthint16uRev 
238MaxFocalLengthint16uRev 
350FirmwareVersionno 
411FileIndexint32u 
423DirectoryIndexint32u 
727PictureStyleInfo---> Canon PSInfo Tags
+ +

Canon CameraInfo60D Tags

+

CameraInfo tags for the EOS 60D and 1200D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
25CameraTemperatureint8u 
30FocalLengthint16uRev 
54CameraOrientationint8u(60D only) +
0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
58CameraOrientationint8u(1200D only) +
0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
85FocusDistanceUpperint16uRev(60D only)
87FocusDistanceLowerint16uRev(60D only)
125ColorTemperatureint16u(60D only)
232LensTypeint16uRev--> Canon LensType Values
234MinFocalLengthint16uRev 
236MaxFocalLengthint16uRev 
409FirmwareVersionno 
473FileIndexint32u(60D only)
485DirectoryIndexint32u(60D only)
761PictureStyleInfo---> Canon PSInfo2 Tags +
(1200D)
801PictureStyleInfo---> Canon PSInfo2 Tags +
(60D)
+ +

Canon CameraInfo70D Tags

+

CameraInfo tags for the EOS 70D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
27CameraTemperatureint8u 
35FocalLengthint16uRev 
132CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
147FocusDistanceUpperint16uRev 
149FocusDistanceLowerint16uRev 
199ColorTemperatureint16u 
358LensTypeint16uRev--> Canon LensType Values
360MinFocalLengthint16uRev 
362MaxFocalLengthint16uRev 
606FirmwareVersionno 
691FileIndexint32u 
703DirectoryIndexint32u 
975PictureStyleInfo---> Canon PSInfo2 Tags
+ +

Canon CameraInfo80D Tags

+

CameraInfo tags for the EOS 80D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
27CameraTemperatureint8u 
35FocalLengthint16uRev 
150CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
165FocusDistanceUpperint16uRev 
167FocusDistanceLowerint16uRev 
314ColorTemperatureint16u 
393LensTypeint16uRev--> Canon LensType Values
395MinFocalLengthint16uRev 
397MaxFocalLengthint16uRev 
1114FirmwareVersionno 
1198FileIndexint32u 
1210DirectoryIndexint32u 
+ +

Canon CameraInfo450D Tags

+

CameraInfo tags for the EOS 450D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
21FlashMeteringModeint8u0 = E-TTL +
3 = TTL +
4 = External Auto +
5 = External Manual +
6 = Off
24CameraTemperatureint8u 
27MacroMagnificationint8u(currently decoded only for the MP-E 65mm f/2.8 1-5x Macro Photo)
29FocalLengthint16uRev 
48CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
67FocusDistanceUpperint16uRev 
69FocusDistanceLowerint16uRev 
111WhiteBalanceint16u--> Canon WhiteBalance Values
115ColorTemperatureint16u 
222LensTypeint16uRev--> Canon LensType Values
263FirmwareVersionstring[6] 
271OwnerNamestring[32] 
307DirectoryIndexint32u 
319FileIndexint32u 
611PictureStyleInfo---> Canon PSInfo Tags
2355LensModelstring[64] 
+ +

Canon CameraInfo500D Tags

+

CameraInfo tags for the EOS 500D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
7HighlightTonePriorityint8u0 = Off +
1 = On
21FlashMeteringModeint8u0 = E-TTL +
3 = TTL +
4 = External Auto +
5 = External Manual +
6 = Off
25CameraTemperatureint8u 
30FocalLengthint16uRev 
49CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
80FocusDistanceUpperint16uRev 
82FocusDistanceLowerint16uRev 
115WhiteBalanceint16u--> Canon WhiteBalance Values
119ColorTemperatureint16u 
171PictureStyleint8u--> Canon PictureStyle Values
188HighISONoiseReductionint8u0 = Standard +
1 = Low +
2 = Strong +
3 = Off
190AutoLightingOptimizerint8u0 = Standard +
1 = Low +
2 = Strong +
3 = Off
246LensTypeint16uRev--> Canon LensType Values
248MinFocalLengthint16uRev 
250MaxFocalLengthint16uRev 
400FirmwareVersionno 
467FileIndexint32u 
479DirectoryIndexint32u 
779PictureStyleInfo---> Canon PSInfo Tags
+ +

Canon CameraInfo550D Tags

+

CameraInfo tags for the EOS 550D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
7HighlightTonePriorityint8u0 = Off +
1 = On
21FlashMeteringModeint8u0 = E-TTL +
3 = TTL +
4 = External Auto +
5 = External Manual +
6 = Off
25CameraTemperatureint8u 
30FocalLengthint16uRev 
53CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
84FocusDistanceUpperint16uRev 
86FocusDistanceLowerint16uRev 
120WhiteBalanceint16u--> Canon WhiteBalance Values
124ColorTemperatureint16u 
176PictureStyleint8u--> Canon PictureStyle Values
255LensTypeint16uRev--> Canon LensType Values
257MinFocalLengthint16uRev 
259MaxFocalLengthint16uRev 
420FirmwareVersionno 
484FileIndexint32u 
496DirectoryIndexint32u 
796PictureStyleInfo---> Canon PSInfo Tags
+ +

Canon CameraInfo600D Tags

+

CameraInfo tags for the EOS 600D and 1100D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
7HighlightTonePriorityint8u0 = Off +
1 = On
21FlashMeteringModeint8u0 = E-TTL +
3 = TTL +
4 = External Auto +
5 = External Manual +
6 = Off
25CameraTemperatureint8u 
30FocalLengthint16uRev 
56CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
87FocusDistanceUpperint16uRev 
89FocusDistanceLowerint16uRev 
123WhiteBalanceint16u--> Canon WhiteBalance Values
127ColorTemperatureint16u 
179PictureStyleint8u--> Canon PictureStyle Values
234LensTypeint16uRev--> Canon LensType Values
236MinFocalLengthint16uRev 
238MaxFocalLengthint16uRev 
411FirmwareVersionno 
475FileIndexint32u 
487DirectoryIndexint32u 
763PictureStyleInfo---> Canon PSInfo2 Tags
+ +

Canon CameraInfo650D Tags

+

CameraInfo tags for the EOS 650D and 700D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
27CameraTemperatureint8u 
35FocalLengthint16uRev 
125CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
140FocusDistanceUpperint16uRev 
142FocusDistanceLowerint16uRev 
188WhiteBalanceint16u--> Canon WhiteBalance Values
192ColorTemperatureint16u 
244PictureStyleint8u--> Canon PictureStyle Values
295LensTypeint16uRev--> Canon LensType Values
297MinFocalLengthint16uRev 
299MaxFocalLengthint16uRev 
539FirmwareVersionno(650D)
544FirmwareVersionno(700D)
624FileIndexint32u(650D)
628FileIndexint32u(700D)
636DirectoryIndexint32u(650D)
640DirectoryIndexint32u(700D)
912PictureStyleInfo---> Canon PSInfo2 Tags
+ +

Canon CameraInfo750D Tags

+

CameraInfo tags for the EOS 750D and 760D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
27CameraTemperatureint8u 
35FocalLengthint16uRev 
150CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
165FocusDistanceUpperint16uRev 
167FocusDistanceLowerint16uRev 
305WhiteBalanceint16u--> Canon WhiteBalance Values
309ColorTemperatureint16u 
361PictureStyleint8u--> Canon PictureStyle Values
388LensTypeint16uRev--> Canon LensType Values
390MinFocalLengthint16uRev 
392MaxFocalLengthint16uRev 
1085FirmwareVersionno 
1097FirmwareVersionno 
+ +

Canon CameraInfo1000D Tags

+

CameraInfo tags for the EOS 1000D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3FNumberint8u 
4ExposureTimeint8u 
6ISOint8u 
21FlashMeteringModeint8u0 = E-TTL +
3 = TTL +
4 = External Auto +
5 = External Manual +
6 = Off
24CameraTemperatureint8u 
27MacroMagnificationint8u(currently decoded only for the MP-E 65mm f/2.8 1-5x Macro Photo)
29FocalLengthint16uRev 
48CameraOrientationint8u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
67FocusDistanceUpperint16uRev 
69FocusDistanceLowerint16uRev 
111WhiteBalanceint16u--> Canon WhiteBalance Values
115ColorTemperatureint16u 
226LensTypeint16uRev--> Canon LensType Values
228MinFocalLengthint16uRev 
230MaxFocalLengthint16uRev 
267FirmwareVersionstring[6] 
311DirectoryIndexint32u 
323FileIndexint32u 
615PictureStyleInfo---> Canon PSInfo Tags
2359LensModelstring[64] 
+ +

Canon CameraInfoPowerShot Tags

+

CameraInfo tags for PowerShot models such as the A450, A460, A550, A560, +A570, A630, A640, A650, A710, A720, G7, G9, S5, SD40, SD750, SD800, SD850, +SD870, SD900, SD950, SD1000, SX100 and TX1.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0ISOint32s 
5FNumberint32s 
6ExposureTimeint32s 
23Rotationint32s 
135CameraTemperatureint32s(A450, A460, A550, A630, A640 and A710)
145CameraTemperatureint32s(A560, A570, A650, A720, G7, G9, S5, SD40, SD750, SD800, SD850, SD870, SD900, +SD950, SD1000, SX100 and TX1)
+ +

Canon CameraInfoPowerShot2 Tags

+

CameraInfo tags for PowerShot models such as the A470, A480, A490, A495, +A580, A590, A1000, A1100, A2000, A2100, A3000, A3100, D10, E1, G10, G11, +S90, S95, SD770, SD780, SD790, SD880, SD890, SD940, SD960, SD970, SD980, +SD990, SD1100, SD1200, SD1300, SD1400, SD3500, SD4000, SD4500, SX1, SX10, +SX20, SX110, SX120, SX130, SX200 and SX210.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1ISOint32s 
6FNumberint32s 
7ExposureTimeint32s 
24Rotationint32s 
153CameraTemperatureint32s(A470, A580, A590, SD770, SD790, SD890 and SD1100)
159CameraTemperatureint32s(A1000, A2000, E1, G10, SD880, SD990, SX1, SX10 and SX110)
164CameraTemperatureint32s(A480, A1100, A2100, D10, SD780, SD960, SD970, SD1200 and SX200)
168CameraTemperatureint32s(A490, A495, A3000, A3100, G11, S90, SD940, SD980, SD1300, SD1400, SD3500, +SD4000, SX20, SX120 and SX210)
261CameraTemperatureint32s(S95, SD4500 and SX130)
+ +

Canon CameraInfoUnknown32 Tags

+

Unknown CameraInfo tags are divided into 3 tables based on format size.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
71CameraTemperatureint32s(S1)
83CameraTemperatureint32s(S2)
91CameraTemperatureint32s(A410, A610, A620, S80, SD30, SD400, SD430, SD450, SD500 and SD550)
92CameraTemperatureint32s(S3)
100CameraTemperatureint32s(A420, A430, A530, A540, A700, SD600, SD630 and SD700)
-3CameraTemperatureint32s(3 entries from end of record for most newer camera models)
+ +

Canon CameraInfoUnknown16 Tags

+
+
+ + + + +
Index2Tag NameWritableValues / Notes
[no tags known]
+ +

Canon CameraInfoUnknown Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
363LensSerialNumberundef[5] 
1473FirmwareVersionno(M50)
+ +

Canon MovieInfo Tags

+

Tags written by some Canon cameras when recording video.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1FrameRateint16u 
2FrameCountint16u 
4FrameCountint32u 
6FrameRaterational32u 
106Durationint32u 
108AudioBitrateint32u 
110AudioSampleRateint32u 
112AudioChannelsint32u 
116VideoCodecundef[4] 
+ +

Canon AFInfo Tags

+

Auto-focus information used by many older Canon models. The values in this +record are sequential, and some have variable sizes based on the value of +NumAFPoints (which may be 1,5,7,9,15,45 or 53). The AFArea coordinates are +given in a system where the image has dimensions given by AFImageWidth and +AFImageHeight, and 0,0 is the image center. The direction of the Y axis +depends on the camera model, with positive Y upwards for EOS models, but +apparently downwards for PowerShot models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SequenceTag NameWritableValues / Notes
0NumAFPointsno 
1ValidAFPointsno(number of AF points valid in the following information)
2CanonImageWidthno 
3CanonImageHeightno 
4AFImageWidthno(size of image in AF coordinates)
5AFImageHeightno 
6AFAreaWidthno 
7AFAreaHeightno 
8AFAreaXPositionsno 
9AFAreaYPositionsno 
10AFPointsInFocusno 
11PrimaryAFPoint +
Canon_AFInfo_0x000b?
no
no
 
12PrimaryAFPointno 
+ +

Canon MyColors Tags

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
2MyColorModeint16u + +
0 = Off +
1 = Positive Film +
2 = Light Skin Tone +
3 = Dark Skin Tone +
4 = Vivid Blue +
5 = Vivid Green +
6 = Vivid Red
  7 = Color Accent +
8 = Color Swap +
9 = Custom +
12 = Vivid +
13 = Neutral +
14 = Sepia +
15 = B&W
+
+ +

Canon FaceDetect1 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
2FacesDetectedint16u 
3FaceDetectFrameSizeint16u[2] 
8Face1Positionint16s[2](X-Y coordinates for the center of each face in the Face Detect frame at the +time of focus lock. "0 0" is the center, and positive X and Y are to the +right and downwards respectively)
10Face2Positionint16s[2] 
12Face3Positionint16s[2] 
14Face4Positionint16s[2] 
16Face5Positionint16s[2] 
18Face6Positionint16s[2] 
20Face7Positionint16s[2] 
22Face8Positionint16s[2] 
24Face9Positionint16s[2] 
+ +

Canon FaceDetect2 Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1FaceWidthint8u 
2FacesDetectedint8u 
+ +

Canon AFInfo2 Tags

+

Newer version of the AFInfo record containing much of the same information +(and coordinate confusion) as the older version. In this record, NumAFPoints +may be 7, 9, 11, 19, 31, 45 or 61, depending on the camera model.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SequenceTag NameWritableValues / Notes
0AFInfoSize?no 
1AFAreaModeno +
0 = Off (Manual Focus) +
1 = AF Point Expansion (surround) +
2 = Single-point AF +
4 = Auto +
5 = Face Detect AF +
6 = Face + Tracking +
7 = Zone AF +
8 = AF Point Expansion (4 point) +
9 = Spot AF +
10 = AF Point Expansion (8 point) +
11 = Flexizone Multi (49 point) +
12 = Flexizone Multi (9 point) +
13 = Flexizone Single +
14 = Large Zone AF
+
2NumAFPointsno 
3ValidAFPointsno(number of AF points valid in the following information)
4CanonImageWidthno 
5CanonImageHeightno 
6AFImageWidthno(size of image in AF coordinates)
7AFImageHeightno 
8AFAreaWidthsno 
9AFAreaHeightsno 
10AFAreaXPositionsno 
11AFAreaYPositionsno 
12AFPointsInFocusno 
13AFPointsSelected +
Canon_AFInfo2_0x000d?
no
no
 
14PrimaryAFPointno 
+ +

Canon ContrastInfo Tags

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
4IntelligentContrastint16u0x0 = Off +
0x8 = On +
0xffff = n/a
+ +

Canon WBInfo Tags

+

WB tags for the Canon G9.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
2WB_GRBGLevelsAutoint32s[4] 
10WB_GRBGLevelsDaylightint32s[4] 
18WB_GRBGLevelsCloudyint32s[4] 
26WB_GRBGLevelsTungstenint32s[4] 
34WB_GRBGLevelsFluorescentint32s[4] 
42WB_GRBGLevelsFluorHighint32s[4] 
50WB_GRBGLevelsFlashint32s[4] 
58WB_GRBGLevelsUnderwaterint32s[4] 
66WB_GRBGLevelsCustom1int32s[4] 
74WB_GRBGLevelsCustom2int32s[4] 
+ +

Canon FaceDetect3 Tags

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
3FacesDetectedint16u 
+ +

Canon TimeInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1TimeZoneint32s 
2TimeZoneCityint32s + + +
0 = n/a +
1 = Chatham Islands +
2 = Wellington +
3 = Solomon Islands +
4 = Sydney +
5 = Adelaide +
6 = Tokyo +
7 = Hong Kong +
8 = Bangkok +
9 = Yangon +
10 = Dhaka +
11 = Kathmandu
  12 = Delhi +
13 = Karachi +
14 = Kabul +
15 = Dubai +
16 = Tehran +
17 = Moscow +
18 = Cairo +
19 = Paris +
20 = London +
21 = Azores +
22 = Fernando de Noronha +
23 = Sao Paulo
  24 = Newfoundland +
25 = Santiago +
26 = Caracas +
27 = New York +
28 = Chicago +
29 = Denver +
30 = Los Angeles +
31 = Anchorage +
32 = Honolulu +
33 = Samoa +
32766 = (not set)
+
3DaylightSavingsint32s0 = Off +
60 = On
+ +

Canon FileInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1FileNumber +
ShutterCount
int32u
int32u
(the location of the upper 4 bits of the directory number is a mystery for +the EOS 30D, so the reported directory number will be incorrect for original +images with a directory number of 164 or greater) +
(there are reports that the ShutterCount changed when loading a settings file +on the 1DSmkII)
3BracketModeint16s0 = Off +
1 = AEB +
2 = FEB +
3 = ISO +
4 = WB
4BracketValueint16s 
5BracketShotNumberint16s 
6RawJpgQualityint16s + +
-1 = n/a +
1 = Economy +
2 = Normal +
3 = Fine +
4 = RAW
  5 = Superfine +
7 = CRAW +
130 = Light (RAW) +
131 = Standard (RAW)
+
7RawJpgSizeint16s + +
-1 = n/a +
0 = Large +
1 = Medium +
2 = Small +
5 = Medium 1 +
6 = Medium 2 +
7 = Medium 3 +
8 = Postcard +
9 = Widescreen +
10 = Medium Widescreen
  14 = Small 1 +
15 = Small 2 +
16 = Small 3 +
128 = 640x480 Movie +
129 = Medium Movie +
130 = Small Movie +
137 = 1280x720 Movie +
142 = 1920x1080 Movie +
143 = 4096x2160 Movie
+
8LongExposureNoiseReduction2int16s(for some modules this gives the long exposure noise reduction applied to the +image, but for other models this just reflects the setting independent of +whether or not it was applied) +
0 = Off +
1 = On (1D) +
3 = On +
4 = Auto
9WBBracketModeint16s0 = Off +
1 = On (shift AB) +
2 = On (shift GM)
12WBBracketValueABint16s 
13WBBracketValueGMint16s 
14FilterEffectint16s0 = None +
1 = Yellow +
2 = Orange +
3 = Red +
4 = Green
15ToningEffectint16s0 = None +
1 = Sepia +
2 = Blue +
3 = Purple +
4 = Green
16MacroMagnificationint16s(currently decoded only for the MP-E 65mm f/2.8 1-5x Macro Photo, and not +valid for all camera models)
19LiveViewShootingint16s0 = Off +
1 = On
20FocusDistanceUpperint16u 
21FocusDistanceLowerint16u 
23ShutterModeint16s0 = Mechanical +
1 = Electronic First Curtain +
2 = Electronic
25FlashExposureLockint16s0 = Off +
1 = On
61RFLensTypeint16u0 = n/a +
257 = Canon RF 50mm F1.2L USM +
258 = Canon RF 24-105mm F4L IS USM +
259 = Canon RF 28-70mm F2L USM +
260 = Canon RF 35mm F1.8 MACRO IS STM +
261 = Canon RF 85mm F1.2L USM +
262 = Canon RF 85mm F1.2L USM DS +
263 = Canon RF 24-70mm F2.8L IS USM +
264 = Canon RF 15-35mm F2.8L IS USM +
265 = Canon RF 24-240mm F4-6.3 IS USM +
266 = Canon RF 70-200mm F2.8L IS USM +
267 = Canon RF 85mm F2 MACRO IS STM +
268 = Canon RF 600mm F11 IS STM +
269 = Canon RF 600mm F11 IS STM + RF1.4x +
270 = Canon RF 600mm F11 IS STM + RF2x +
271 = Canon RF 800mm F11 IS STM +
272 = Canon RF 800mm F11 IS STM + RF1.4x +
273 = Canon RF 800mm F11 IS STM + RF2x +
274 = Canon RF 24-105mm F4-7.1 IS STM +
275 = Canon RF 100-500mm F4.5-7.1L IS USM +
276 = Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x +
277 = Canon RF 100-500mm F4.5-7.1L IS USM + RF2x +
278 = Canon RF 70-200mm F4L IS USM +
279 = Canon RF 100mm F2.8L MACRO IS USM +
280 = Canon RF 50mm F1.8 STM +
281 = Canon RF 14-35mm F4L IS USM +
282 = Canon RF-S 18-45mm F4.5-6.3 IS STM +
283 = Canon RF 100-400mm F5.6-8 IS USM +
284 = Canon RF 100-400mm F5.6-8 IS USM + RF1.4x +
285 = Canon RF 100-400mm F5.6-8 IS USM + RF2x +
286 = Canon RF-S 18-150mm F3.5-6.3 IS STM +
288 = Canon RF 16mm F2.8 STM +
289 = Canon RF 400mm F2.8L IS USM +
290 = Canon RF 400mm F2.8L IS USM + RF1.4x +
291 = Canon RF 400mm F2.8L IS USM + RF2x +
292 = Canon RF 600mm F4L IS USM
+ +

Canon SerialInfo Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
9InternalSerialNumberstring 
+ +

Canon CropInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0CropLeftMarginint16u 
1CropRightMarginint16u 
2CropTopMarginint16u 
3CropBottomMarginint16u 
+ +

Canon AspectInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0AspectRatioint32u + +
0 = 3:2 +
1 = 1:1 +
2 = 4:3 +
7 = 16:9
  8 = 4:5 +
12 = 3:2 (APS-H crop) +
13 = 3:2 (APS-C crop)
+
1CroppedImageWidthint32u 
2CroppedImageHeightint32u 
3CroppedImageLeftint32u 
4CroppedImageTopint32u 
+ +

Canon Processing Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1ToneCurveint16s0 = Standard +
1 = Manual +
2 = Custom
2Sharpnessint16s(all models except the 20D and 350D)
3SharpnessFrequencyint16s + +
0 = n/a +
1 = Lowest +
2 = Low
  3 = Standard +
4 = High +
5 = Highest
+
4SensorRedLevelint16s 
5SensorBlueLevelint16s 
6WhiteBalanceRedint16s 
7WhiteBalanceBlueint16s 
8WhiteBalanceint16s--> Canon WhiteBalance Values
9ColorTemperatureint16s 
10PictureStyleint16s--> Canon PictureStyle Values
11DigitalGainint16s 
12WBShiftABint16s(positive is a shift toward amber)
13WBShiftGMint16s(positive is a shift toward green)
+ +

Canon ColorBalance Tags

+

These tags are used by the 10D and 300D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1WB_RGGBLevelsAutoint16s[4] 
5WB_RGGBLevelsDaylightint16s[4] 
9WB_RGGBLevelsShadeint16s[4] 
13WB_RGGBLevelsCloudyint16s[4] 
17WB_RGGBLevelsTungstenint16s[4] 
21WB_RGGBLevelsFluorescentint16s[4] 
25WB_RGGBLevelsFlashint16s[4] 
29WB_RGGBLevelsCustom +
BlackLevels
int16s[4]
int16s[4]
(black levels for the D60)
33WB_RGGBLevelsKelvinint16s[4] 
37WB_RGGBBlackLevelsint16s[4] 
+ +

Canon MeasuredColor Tags

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
1MeasuredRGGBint16u[4] 
+ +

Canon Flags Tags

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
1ModifiedParamFlagint16s 
+ +

Canon ModifiedInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1ModifiedToneCurveint16s0 = Standard +
1 = Manual +
2 = Custom
2ModifiedSharpnessint16s(1D and 5D only)
3ModifiedSharpnessFreqint16s + +
0 = n/a +
1 = Lowest +
2 = Low
  3 = Standard +
4 = High +
5 = Highest
+
4ModifiedSensorRedLevelint16s 
5ModifiedSensorBlueLevelint16s 
6ModifiedWhiteBalanceRedint16s 
7ModifiedWhiteBalanceBlueint16s 
8ModifiedWhiteBalanceint16s--> Canon WhiteBalance Values
9ModifiedColorTempint16s 
10ModifiedPictureStyleint16s--> Canon PictureStyle Values
11ModifiedDigitalGainint16s 
+ +

Canon PreviewImageInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1PreviewQualityint32u + +
-1 = n/a +
1 = Economy +
2 = Normal +
3 = Fine +
4 = RAW
  5 = Superfine +
7 = CRAW +
130 = Light (RAW) +
131 = Standard (RAW)
+
2PreviewImageLengthint32u* 
3PreviewImageWidthint32u 
4PreviewImageHeightint32u 
5PreviewImageStartint32u* 
+ +

Canon SensorInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1SensorWidthno 
2SensorHeightno 
5SensorLeftBorderno 
6SensorTopBorderno 
7SensorRightBorderno 
8SensorBottomBorderno 
9BlackMaskLeftBorderno(coordinates for the area to the left or right of the image used to calculate +the average black level)
10BlackMaskTopBorderno 
11BlackMaskRightBorderno 
12BlackMaskBottomBorderno 
+ +

Canon ColorData1 Tags

+

These tags are used by the 20D and 350D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
25WB_RGGBLevelsAsShotint16s[4] 
29ColorTempAsShotint16s 
30WB_RGGBLevelsAutoint16s[4] 
34ColorTempAutoint16s 
35WB_RGGBLevelsDaylightint16s[4] 
39ColorTempDaylightint16s 
40WB_RGGBLevelsShadeint16s[4] 
44ColorTempShadeint16s 
45WB_RGGBLevelsCloudyint16s[4] 
49ColorTempCloudyint16s 
50WB_RGGBLevelsTungstenint16s[4] 
54ColorTempTungstenint16s 
55WB_RGGBLevelsFluorescentint16s[4] 
59ColorTempFluorescentint16s 
60WB_RGGBLevelsFlashint16s[4] 
64ColorTempFlashint16s 
65WB_RGGBLevelsCustom1int16s[4] 
69ColorTempCustom1int16s 
70WB_RGGBLevelsCustom2int16s[4] 
74ColorTempCustom2int16s 
75ColorCalib?---> Canon ColorCalib Tags +
(A, B, C, Temperature)
+ +

Canon ColorCalib Tags

+

Camera color calibration data. For the 20D, 350D, 1DmkII and 1DSmkII the +order of the coefficients is A, B, C, Temperature, but for newer models it +is B, C, A, Temperature. These tags are extracted only when the Unknown +option is used.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0CameraColorCalibration01?int16s[4] 
4CameraColorCalibration02?int16s[4] 
8CameraColorCalibration03?int16s[4] 
12CameraColorCalibration04?int16s[4] 
16CameraColorCalibration05?int16s[4] 
20CameraColorCalibration06?int16s[4] 
24CameraColorCalibration07?int16s[4] 
28CameraColorCalibration08?int16s[4] 
32CameraColorCalibration09?int16s[4] 
36CameraColorCalibration10?int16s[4] 
40CameraColorCalibration11?int16s[4] 
44CameraColorCalibration12?int16s[4] 
48CameraColorCalibration13?int16s[4] 
52CameraColorCalibration14?int16s[4] 
56CameraColorCalibration15?int16s[4] 
+ +

Canon ColorData2 Tags

+

These tags are used by the 1DmkII and 1DSmkII.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
24WB_RGGBLevelsAutoint16s[4] 
28ColorTempAutoint16s 
29WB_RGGBLevelsUnknown?int16s[4] 
33ColorTempUnknown?int16s 
34WB_RGGBLevelsAsShotint16s[4] 
38ColorTempAsShotint16s 
39WB_RGGBLevelsDaylightint16s[4] 
43ColorTempDaylightint16s 
44WB_RGGBLevelsShadeint16s[4] 
48ColorTempShadeint16s 
49WB_RGGBLevelsCloudyint16s[4] 
53ColorTempCloudyint16s 
54WB_RGGBLevelsTungstenint16s[4] 
58ColorTempTungstenint16s 
59WB_RGGBLevelsFluorescentint16s[4] 
63ColorTempFluorescentint16s 
64WB_RGGBLevelsKelvinint16s[4] 
68ColorTempKelvinint16s 
69WB_RGGBLevelsFlashint16s[4] 
73ColorTempFlashint16s 
74WB_RGGBLevelsUnknown2?int16s[4] 
78ColorTempUnknown2?int16s 
79WB_RGGBLevelsUnknown3?int16s[4] 
83ColorTempUnknown3?int16s 
84WB_RGGBLevelsUnknown4?int16s[4] 
88ColorTempUnknown4?int16s 
89WB_RGGBLevelsUnknown5?int16s[4] 
93ColorTempUnknown5?int16s 
94WB_RGGBLevelsUnknown6?int16s[4] 
98ColorTempUnknown6?int16s 
99WB_RGGBLevelsUnknown7?int16s[4] 
103ColorTempUnknown7?int16s 
104WB_RGGBLevelsUnknown8?int16s[4] 
108ColorTempUnknown8?int16s 
109WB_RGGBLevelsUnknown9?int16s[4] 
113ColorTempUnknown9?int16s 
114WB_RGGBLevelsUnknown10?int16s[4] 
118ColorTempUnknown10?int16s 
119WB_RGGBLevelsUnknown11?int16s[4] 
123ColorTempUnknown11?int16s 
124WB_RGGBLevelsUnknown12?int16s[4] 
128ColorTempUnknown12?int16s 
129WB_RGGBLevelsUnknown13?int16s[4] 
133ColorTempUnknown13?int16s 
134WB_RGGBLevelsUnknown14?int16s[4] 
138ColorTempUnknown14?int16s 
139WB_RGGBLevelsUnknown15?int16s[4] 
143ColorTempUnknown15?int16s 
144WB_RGGBLevelsPC1int16s[4] 
148ColorTempPC1int16s 
149WB_RGGBLevelsPC2int16s[4] 
153ColorTempPC2int16s 
154WB_RGGBLevelsPC3int16s[4] 
158ColorTempPC3int16s 
159WB_RGGBLevelsUnknown16?int16s[4] 
163ColorTempUnknown16?int16s 
164ColorCalib?---> Canon ColorCalib Tags +
(A, B, C, Temperature)
618RawMeasuredRGGBint32u[4](raw MeasuredRGGB values, before normalization)
+ +

Canon ColorData3 Tags

+

These tags are used by the 1DmkIIN, 5D, 30D and 400D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0ColorDataVersionint16s1 = 1 (1DmkIIN/5D/30D/400D)
63WB_RGGBLevelsAsShotint16s[4] 
67ColorTempAsShotint16s 
68WB_RGGBLevelsAutoint16s[4] 
72ColorTempAutoint16s 
73WB_RGGBLevelsMeasuredint16s[4] 
77ColorTempMeasuredint16s 
78WB_RGGBLevelsDaylightint16s[4] 
82ColorTempDaylightint16s 
83WB_RGGBLevelsShadeint16s[4] 
87ColorTempShadeint16s 
88WB_RGGBLevelsCloudyint16s[4] 
92ColorTempCloudyint16s 
93WB_RGGBLevelsTungstenint16s[4] 
97ColorTempTungstenint16s 
98WB_RGGBLevelsFluorescentint16s[4] 
102ColorTempFluorescentint16s 
103WB_RGGBLevelsKelvinint16s[4] 
107ColorTempKelvinint16s 
108WB_RGGBLevelsFlashint16s[4] 
112ColorTempFlashint16s 
113WB_RGGBLevelsPC1int16s[4] 
117ColorTempPC1int16s 
118WB_RGGBLevelsPC2int16s[4] 
122ColorTempPC2int16s 
123WB_RGGBLevelsPC3int16s[4] 
127ColorTempPC3int16s 
128WB_RGGBLevelsCustomint16s[4] 
132ColorTempCustomint16s 
133ColorCalib?---> Canon ColorCalib Tags +
(B, C, A, Temperature)
196PerChannelBlackLevelint16u[4] 
584FlashOutputint16s 
585FlashBatteryLevelint16s 
586ColorTempFlashDataint16s 
647MeasuredRGGBDataint32u[4](MeasuredRGGB may be derived from these data values)
+ +

Canon ColorData4 Tags

+

These tags are used by the 1DmkIII, 1DSmkIII, 1DmkIV, 5DmkII, 7D, 40D, 50D, +60D, 450D, 500D, 550D, 1000D and 1100D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0ColorDataVersionint16s +
2 = 2 (1DmkIII) +
3 = 3 (40D) +
4 = 4 (1DSmkIII) +
5 = 5 (450D/1000D) +
6 = 6 (50D/5DmkII) +
7 = 7 (500D/550D/7D/1DmkIV) +
9 = 9 (60D/1100D)
+
63ColorCoefs---> Canon ColorCoefs Tags
168ColorCalib?---> Canon ColorCalib Tags +
(B, C, A, Temperature)
231AverageBlackLevelint16u[4] 
640RawMeasuredRGGBint32u[4](raw MeasuredRGGB values, before normalization)
692PerChannelBlackLevelint16u[4] 
696NormalWhiteLevelint16u 
697SpecularWhiteLevelint16u 
698LinearityUpperMarginint16u 
715PerChannelBlackLevelint16u[4] 
719NormalWhiteLevel +
PerChannelBlackLevel
int16u
int16u[4]
 
720SpecularWhiteLevelint16u 
721LinearityUpperMarginint16u 
723NormalWhiteLevelint16u 
724SpecularWhiteLevelint16u 
725LinearityUpperMarginint16u 
+ +

Canon ColorCoefs Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0WB_RGGBLevelsAsShotint16s[4] 
4ColorTempAsShotint16s 
5WB_RGGBLevelsAutoint16s[4] 
9ColorTempAutoint16s 
10WB_RGGBLevelsMeasuredint16s[4] 
14ColorTempMeasuredint16s 
15WB_RGGBLevelsUnknown?int16s[4] 
19ColorTempUnknown?int16s 
20WB_RGGBLevelsDaylightint16s[4] 
24ColorTempDaylightint16s 
25WB_RGGBLevelsShadeint16s[4] 
29ColorTempShadeint16s 
30WB_RGGBLevelsCloudyint16s[4] 
34ColorTempCloudyint16s 
35WB_RGGBLevelsTungstenint16s[4] 
39ColorTempTungstenint16s 
40WB_RGGBLevelsFluorescentint16s[4] 
44ColorTempFluorescentint16s 
45WB_RGGBLevelsKelvinint16s[4] 
49ColorTempKelvinint16s 
50WB_RGGBLevelsFlashint16s[4] 
54ColorTempFlashint16s 
55WB_RGGBLevelsUnknown2?int16s[4] 
59ColorTempUnknown2?int16s 
60WB_RGGBLevelsUnknown3?int16s[4] 
64ColorTempUnknown3?int16s 
65WB_RGGBLevelsUnknown4?int16s[4] 
69ColorTempUnknown4?int16s 
70WB_RGGBLevelsUnknown5?int16s[4] 
74ColorTempUnknown5?int16s 
75WB_RGGBLevelsUnknown6?int16s[4] 
79ColorTempUnknown6?int16s 
80WB_RGGBLevelsUnknown7?int16s[4] 
84ColorTempUnknown7?int16s 
85WB_RGGBLevelsUnknown8?int16s[4] 
89ColorTempUnknown8?int16s 
90WB_RGGBLevelsUnknown9?int16s[4] 
94ColorTempUnknown9?int16s 
95WB_RGGBLevelsUnknown10?int16s[4] 
99ColorTempUnknown10?int16s 
100WB_RGGBLevelsUnknown11?int16s[4] 
104ColorTempUnknown11?int16s 
105WB_RGGBLevelsUnknown12?int16s[4] 
109ColorTempUnknown12?int16s 
110WB_RGGBLevelsUnknown13?int16s[4] 
114ColorTempUnknown13?int16s 
+ +

Canon ColorData5 Tags

+

These tags are used by many EOS M and PowerShot models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0ColorDataVersionint16s-4 = -4 (M100/M5/M6) +
-3 = -3 (M10/M3)
71ColorCoefs +
ColorCoefs2
-
-
--> Canon ColorCoefs Tags +
--> Canon ColorCoefs2 Tags
186ColorCalib2?---> Canon ColorCalib2 Tags
255ColorCalib2?---> Canon ColorCalib2 Tags
264PerChannelBlackLevelint16s[4] 
333PerChannelBlackLevelint16s[4] 
1385NormalWhiteLevelint16u 
1386SpecularWhiteLevelint16u 
+ +

Canon ColorCoefs2 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0WB_RGGBLevelsAsShotint16s[4] 
7ColorTempAsShotint16s 
8WB_RGGBLevelsAutoint16s[4] 
15ColorTempAutoint16s 
16WB_RGGBLevelsMeasuredint16s[4] 
23ColorTempMeasuredint16s 
24WB_RGGBLevelsUnknown?int16s[4] 
31ColorTempUnknown?int16s 
32WB_RGGBLevelsDaylightint16s[4] 
39ColorTempDaylightint16s 
40WB_RGGBLevelsShadeint16s[4] 
47ColorTempShadeint16s 
48WB_RGGBLevelsCloudyint16s[4] 
55ColorTempCloudyint16s 
56WB_RGGBLevelsTungstenint16s[4] 
63ColorTempTungstenint16s 
64WB_RGGBLevelsFluorescentint16s[4] 
71ColorTempFluorescentint16s 
72WB_RGGBLevelsKelvinint16s[4] 
79ColorTempKelvinint16s 
80WB_RGGBLevelsFlashint16s[4] 
87ColorTempFlashint16s 
88WB_RGGBLevelsUnknown2?int16s[4] 
95ColorTempUnknown2?int16s 
96WB_RGGBLevelsUnknown3?int16s[4] 
103ColorTempUnknown3?int16s 
104WB_RGGBLevelsUnknown4?int16s[4] 
111ColorTempUnknown4?int16s 
112WB_RGGBLevelsUnknown5?int16s[4] 
119ColorTempUnknown5?int16s 
120WB_RGGBLevelsUnknown6?int16s[4] 
127ColorTempUnknown6?int16s 
128WB_RGGBLevelsUnknown7?int16s[4] 
135ColorTempUnknown7?int16s 
136WB_RGGBLevelsUnknown8?int16s[4] 
143ColorTempUnknown8?int16s 
144WB_RGGBLevelsUnknown9?int16s[4] 
151ColorTempUnknown9?int16s 
152WB_RGGBLevelsUnknown10?int16s[4] 
159ColorTempUnknown10?int16s 
160WB_RGGBLevelsUnknown11?int16s[4] 
167ColorTempUnknown11?int16s 
168WB_RGGBLevelsUnknown12?int16s[4] 
175ColorTempUnknown12?int16s 
176WB_RGGBLevelsUnknown13?int16s[4] 
183ColorTempUnknown13?int16s 
+ +

Canon ColorCalib2 Tags

+

B, C, A, D, Temperature.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0CameraColorCalibration01?int16s[5] 
5CameraColorCalibration02?int16s[5] 
10CameraColorCalibration03?int16s[5] 
15CameraColorCalibration04?int16s[5] 
20CameraColorCalibration05?int16s[5] 
25CameraColorCalibration06?int16s[5] 
30CameraColorCalibration07?int16s[5] 
35CameraColorCalibration08?int16s[5] 
40CameraColorCalibration09?int16s[5] 
45CameraColorCalibration10?int16s[5] 
50CameraColorCalibration11?int16s[5] 
55CameraColorCalibration12?int16s[5] 
60CameraColorCalibration13?int16s[5] 
65CameraColorCalibration14?int16s[5] 
70CameraColorCalibration15?int16s[5] 
+ +

Canon ColorData6 Tags

+

These tags are used by the EOS 600D and 1200D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0ColorDataVersionint16s10 = 10 (600D/1200D)
63WB_RGGBLevelsAsShotint16s[4] 
67ColorTempAsShotint16s 
68WB_RGGBLevelsAutoint16s[4] 
72ColorTempAutoint16s 
73WB_RGGBLevelsMeasuredint16s[4] 
77ColorTempMeasuredint16s 
78WB_RGGBLevelsUnknown?int16s[4] 
82ColorTempUnknown?int16s 
83WB_RGGBLevelsUnknown2?int16s[4] 
87ColorTempUnknown2?int16s 
88WB_RGGBLevelsUnknown3?int16s[4] 
92ColorTempUnknown3?int16s 
93WB_RGGBLevelsUnknown4?int16s[4] 
97ColorTempUnknown4?int16s 
98WB_RGGBLevelsUnknown5?int16s[4] 
102ColorTempUnknown5?int16s 
103WB_RGGBLevelsDaylightint16s[4] 
107ColorTempDaylightint16s 
108WB_RGGBLevelsShadeint16s[4] 
112ColorTempShadeint16s 
113WB_RGGBLevelsCloudyint16s[4] 
117ColorTempCloudyint16s 
118WB_RGGBLevelsTungstenint16s[4] 
122ColorTempTungstenint16s 
123WB_RGGBLevelsFluorescentint16s[4] 
127ColorTempFluorescentint16s 
128WB_RGGBLevelsKelvinint16s[4] 
132ColorTempKelvinint16s 
133WB_RGGBLevelsFlashint16s[4] 
137ColorTempFlashint16s 
138WB_RGGBLevelsUnknown6?int16s[4] 
142ColorTempUnknown6?int16s 
143WB_RGGBLevelsUnknown7?int16s[4] 
147ColorTempUnknown7?int16s 
148WB_RGGBLevelsUnknown8?int16s[4] 
152ColorTempUnknown8?int16s 
153WB_RGGBLevelsUnknown9?int16s[4] 
157ColorTempUnknown9?int16s 
158WB_RGGBLevelsUnknown10?int16s[4] 
162ColorTempUnknown10?int16s 
163WB_RGGBLevelsUnknown11?int16s[4] 
167ColorTempUnknown11?int16s 
168WB_RGGBLevelsUnknown12?int16s[4] 
172ColorTempUnknown12?int16s 
173WB_RGGBLevelsUnknown13?int16s[4] 
177ColorTempUnknown13?int16s 
178WB_RGGBLevelsUnknown14?int16s[4] 
182ColorTempUnknown14?int16s 
183WB_RGGBLevelsUnknown15?int16s[4] 
187ColorTempUnknown15?int16s 
188ColorCalib?---> Canon ColorCalib Tags +
(B, C, A, Temperature)
251AverageBlackLevelint16u[4] 
404RawMeasuredRGGBint32u[4](raw MeasuredRGGB values, before normalization)
479PerChannelBlackLevelint16u[4] 
483NormalWhiteLevelint16u 
484SpecularWhiteLevelint16u 
485LinearityUpperMarginint16u 
+ +

Canon ColorData7 Tags

+

These tags are used by the EOS 1DX, 5DmkIII, 6D, 7DmkII, 100D, 650D, 700D, +8000D, M and M2.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0ColorDataVersionint16s10 = 10 (1DX/5DmkIII/6D/70D/100D/650D/700D/M/M2) +
11 = 11 (7DmkII/750D/760D/8000D)
63WB_RGGBLevelsAsShotint16s[4] 
67ColorTempAsShotint16s 
68WB_RGGBLevelsAutoint16s[4] 
72ColorTempAutoint16s 
73WB_RGGBLevelsMeasuredint16s[4] 
77ColorTempMeasuredint16s 
78WB_RGGBLevelsUnknown?int16s[4] 
82ColorTempUnknown?int16s 
83WB_RGGBLevelsUnknown2?int16s[4] 
87ColorTempUnknown2?int16s 
88WB_RGGBLevelsUnknown3?int16s[4] 
92ColorTempUnknown3?int16s 
93WB_RGGBLevelsUnknown4?int16s[4] 
97ColorTempUnknown4?int16s 
98WB_RGGBLevelsUnknown5?int16s[4] 
102ColorTempUnknown5?int16s 
103WB_RGGBLevelsUnknown6?int16s[4] 
107ColorTempUnknown6?int16s 
108WB_RGGBLevelsUnknown7?int16s[4] 
112ColorTempUnknown7?int16s 
113WB_RGGBLevelsUnknown8?int16s[4] 
117ColorTempUnknown8?int16s 
118WB_RGGBLevelsUnknown9?int16s[4] 
122ColorTempUnknown9?int16s 
123WB_RGGBLevelsUnknown10?int16s[4] 
127ColorTempUnknown10?int16s 
128WB_RGGBLevelsDaylightint16s[4] 
132ColorTempDaylightint16s 
133WB_RGGBLevelsShadeint16s[4] 
137ColorTempShadeint16s 
138WB_RGGBLevelsCloudyint16s[4] 
142ColorTempCloudyint16s 
143WB_RGGBLevelsTungstenint16s[4] 
147ColorTempTungstenint16s 
148WB_RGGBLevelsFluorescentint16s[4] 
152ColorTempFluorescentint16s 
153WB_RGGBLevelsKelvinint16s[4] 
157ColorTempKelvinint16s 
158WB_RGGBLevelsFlashint16s[4] 
162ColorTempFlashint16s 
163WB_RGGBLevelsUnknown11?int16s[4] 
167ColorTempUnknown11?int16s 
168WB_RGGBLevelsUnknown12?int16s[4] 
172ColorTempUnknown12?int16s 
173WB_RGGBLevelsUnknown13?int16s[4] 
177ColorTempUnknown13?int16s 
178WB_RGGBLevelsUnknown14?int16s[4] 
182ColorTempUnknown14?int16s 
183WB_RGGBLevelsUnknown15?int16s[4] 
187ColorTempUnknown15?int16s 
188WB_RGGBLevelsUnknown16?int16s[4] 
192ColorTempUnknown16?int16s 
193WB_RGGBLevelsUnknown17?int16s[4] 
197ColorTempUnknown17?int16s 
198WB_RGGBLevelsUnknown18?int16s[4] 
202ColorTempUnknown18?int16s 
203WB_RGGBLevelsUnknown19?int16s[4] 
207ColorTempUnknown19?int16s 
208WB_RGGBLevelsUnknown20?int16s[4] 
212ColorTempUnknown20?int16s 
213ColorCalib?---> Canon ColorCalib Tags +
(B, C, A, Temperature)
276AverageBlackLevelint16u[4] 
429RawMeasuredRGGBint32u[4](raw MeasuredRGGB values, before normalization)
504PerChannelBlackLevelint16u[4] 
508NormalWhiteLevelint16u 
509SpecularWhiteLevelint16u 
510LinearityUpperMarginint16u 
619RawMeasuredRGGBint32u[4] 
728PerChannelBlackLevelint16u[4] 
732NormalWhiteLevelint16u 
733SpecularWhiteLevelint16u 
734LinearityUpperMarginint16u 
+ +

Canon ColorData8 Tags

+

These tags are used by the EOS 1DXmkII, 5DS, 5DSR, 5DmkIV, 6DmkII, 77D, 80D, +200D, 800D, 1300D, 2000D, 4000D and 9000D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0ColorDataVersionint16s12 = 12 (1DXmkII/5DS/5DSR) +
13 = 13 (80D/5DmkIV) +
14 = 14 (1300D/2000D/4000D) +
15 = 15 (6DmkII/77D/200D/800D,9000D)
63WB_RGGBLevelsAsShotint16s[4] 
67ColorTempAsShotint16s 
68WB_RGGBLevelsAutoint16s[4] 
72ColorTempAutoint16s 
73WB_RGGBLevelsMeasuredint16s[4] 
77ColorTempMeasuredint16s 
78WB_RGGBLevelsUnknown?int16s[4] 
82ColorTempUnknown?int16s 
83WB_RGGBLevelsUnknown2?int16s[4] 
87ColorTempUnknown2?int16s 
88WB_RGGBLevelsUnknown3?int16s[4] 
92ColorTempUnknown3?int16s 
93WB_RGGBLevelsUnknown4?int16s[4] 
97ColorTempUnknown4?int16s 
98WB_RGGBLevelsUnknown5?int16s[4] 
102ColorTempUnknown5?int16s 
103WB_RGGBLevelsUnknown6?int16s[4] 
107ColorTempUnknown6?int16s 
108WB_RGGBLevelsUnknown7?int16s[4] 
112ColorTempUnknown7?int16s 
113WB_RGGBLevelsUnknown8?int16s[4] 
117ColorTempUnknown8?int16s 
118WB_RGGBLevelsUnknown9?int16s[4] 
122ColorTempUnknown9?int16s 
123WB_RGGBLevelsUnknown10?int16s[4] 
127ColorTempUnknown10?int16s 
128WB_RGGBLevelsUnknown11?int16s[4] 
132ColorTempUnknown11?int16s 
133WB_RGGBLevelsDaylightint16s[4] 
137ColorTempDaylightint16s 
138WB_RGGBLevelsShadeint16s[4] 
142ColorTempShadeint16s 
143WB_RGGBLevelsCloudyint16s[4] 
147ColorTempCloudyint16s 
148WB_RGGBLevelsTungstenint16s[4] 
152ColorTempTungstenint16s 
153WB_RGGBLevelsFluorescentint16s[4] 
157ColorTempFluorescentint16s 
158WB_RGGBLevelsKelvinint16s[4] 
162ColorTempKelvinint16s 
163WB_RGGBLevelsFlashint16s[4] 
167ColorTempFlashint16s 
168WB_RGGBLevelsUnknown12?int16s[4] 
172ColorTempUnknown12?int16s 
173WB_RGGBLevelsUnknown13?int16s[4] 
177ColorTempUnknown13?int16s 
178WB_RGGBLevelsUnknown14?int16s[4] 
182ColorTempUnknown14?int16s 
183WB_RGGBLevelsUnknown15?int16s[4] 
187ColorTempUnknown15?int16s 
188WB_RGGBLevelsUnknown16?int16s[4] 
192ColorTempUnknown16?int16s 
193WB_RGGBLevelsUnknown17?int16s[4] 
197ColorTempUnknown17?int16s 
198WB_RGGBLevelsUnknown18?int16s[4] 
202ColorTempUnknown18?int16s 
203WB_RGGBLevelsUnknown19?int16s[4] 
207ColorTempUnknown19?int16s 
208WB_RGGBLevelsUnknown20?int16s[4] 
212ColorTempUnknown20?int16s 
213WB_RGGBLevelsUnknown21?int16s[4] 
217ColorTempUnknown21?int16s 
218WB_RGGBLevelsUnknown22?int16s[4] 
222ColorTempUnknown22?int16s 
223WB_RGGBLevelsUnknown23?int16s[4] 
227ColorTempUnknown23?int16s 
228WB_RGGBLevelsUnknown24?int16s[4] 
232ColorTempUnknown24?int16s 
233WB_RGGBLevelsUnknown25?int16s[4] 
237ColorTempUnknown25?int16s 
238WB_RGGBLevelsUnknown26?int16s[4] 
242ColorTempUnknown26?int16s 
243WB_RGGBLevelsUnknown27?int16s[4] 
247ColorTempUnknown27?int16s 
248WB_RGGBLevelsUnknown28?int16s[4] 
252ColorTempUnknown28?int16s 
253WB_RGGBLevelsUnknown29?int16s[4] 
257ColorTempUnknown29?int16s 
258WB_RGGBLevelsUnknown30?int16s[4] 
262ColorTempUnknown30?int16s 
263ColorCalib?---> Canon ColorCalib Tags +
(B, C, A, Temperature)
326AverageBlackLevelint16u[4] 
556PerChannelBlackLevelint16u[4](1300D)
560NormalWhiteLevelint16u(1300D)
561SpecularWhiteLevelint16u(1300D)
562LinearityUpperMarginint16u(1300D)
778PerChannelBlackLevelint16u[4](5DS, 5DS R, 77D, 80D and 800D)
782NormalWhiteLevelint16u(5DS, 5DS R, 77D, 80D and 800D)
783SpecularWhiteLevelint16u(5DS, 5DS R, 77D, 80D and 800D)
784LinearityUpperMarginint16u(5DS, 5DS R, 77D, 80D and 800D)
+ +

Canon ColorData9 Tags

+

These tags are used by the M6mkII, M50, M200, EOS R, RP, 90D, 250D and 850D

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0ColorDataVersionint16s16 = 16 (M50) +
17 = 17 (EOS R) +
18 = 18 (EOS RP/250D) +
19 = 19 (90D/850D/M6mkII/M200)
71WB_RGGBLevelsAsShotint16s[4] 
75ColorTempAsShotint16s 
76WB_RGGBLevelsAutoint16s[4] 
80ColorTempAutoint16s 
81WB_RGGBLevelsMeasuredint16s[4] 
85ColorTempMeasuredint16s 
86WB_RGGBLevelsUnknown?int16s[4] 
90ColorTempUnknown?int16s 
91WB_RGGBLevelsUnknown2?int16s[4] 
95ColorTempUnknown2?int16s 
96WB_RGGBLevelsUnknown3?int16s[4] 
100ColorTempUnknown3?int16s 
101WB_RGGBLevelsUnknown4?int16s[4] 
105ColorTempUnknown4?int16s 
106WB_RGGBLevelsUnknown5?int16s[4] 
110ColorTempUnknown5?int16s 
111WB_RGGBLevelsUnknown6?int16s[4] 
115ColorTempUnknown6?int16s 
116WB_RGGBLevelsUnknown7?int16s[4] 
120ColorTempUnknown7?int16s 
121WB_RGGBLevelsUnknown8?int16s[4] 
125ColorTempUnknown8?int16s 
126WB_RGGBLevelsUnknown9?int16s[4] 
130ColorTempUnknown9?int16s 
131WB_RGGBLevelsUnknown10?int16s[4] 
135ColorTempUnknown10?int16s 
136WB_RGGBLevelsDaylightint16s[4] 
140ColorTempDaylightint16s 
141WB_RGGBLevelsShadeint16s[4] 
145ColorTempShadeint16s 
146WB_RGGBLevelsCloudyint16s[4] 
150ColorTempCloudyint16s 
151WB_RGGBLevelsTungstenint16s[4] 
155ColorTempTungstenint16s 
156WB_RGGBLevelsFluorescentint16s[4] 
160ColorTempFluorescentint16s 
161WB_RGGBLevelsKelvinint16s[4] 
165ColorTempKelvinint16s 
166WB_RGGBLevelsFlashint16s[4] 
170ColorTempFlashint16s 
171WB_RGGBLevelsUnknown11?int16s[4] 
175ColorTempUnknown11?int16s 
176WB_RGGBLevelsUnknown12?int16s[4] 
180ColorTempUnknown12?int16s 
181WB_RGGBLevelsUnknown13?int16s[4] 
185ColorTempUnknown13?int16s 
186WB_RGGBLevelsUnknown14?int16s[4] 
190ColorTempUnknown14?int16s 
191WB_RGGBLevelsUnknown15?int16s[4] 
195ColorTempUnknown15?int16s 
196WB_RGGBLevelsUnknown16?int16s[4] 
200ColorTempUnknown16?int16s 
201WB_RGGBLevelsUnknown17?int16s[4] 
205ColorTempUnknown17?int16s 
206WB_RGGBLevelsUnknown18?int16s[4] 
210ColorTempUnknown18?int16s 
211WB_RGGBLevelsUnknown19?int16s[4] 
215ColorTempUnknown19?int16s 
216WB_RGGBLevelsUnknown20?int16s[4] 
220ColorTempUnknown20?int16s 
221WB_RGGBLevelsUnknown21?int16s[4] 
225ColorTempUnknown21?int16s 
226WB_RGGBLevelsUnknown22?int16s[4] 
230ColorTempUnknown22?int16s 
231WB_RGGBLevelsUnknown23?int16s[4] 
235ColorTempUnknown23?int16s 
236WB_RGGBLevelsUnknown24?int16s[4] 
240ColorTempUnknown24?int16s 
241WB_RGGBLevelsUnknown25?int16s[4] 
245ColorTempUnknown25?int16s 
246WB_RGGBLevelsUnknown26?int16s[4] 
250ColorTempUnknown26?int16s 
251WB_RGGBLevelsUnknown27?int16s[4] 
255ColorTempUnknown27?int16s 
256WB_RGGBLevelsUnknown28?int16s[4] 
260ColorTempUnknown28?int16s 
261WB_RGGBLevelsUnknown29?int16s[4] 
265ColorTempUnknown29?int16s 
266ColorCalib?---> Canon ColorCalib Tags
329PerChannelBlackLevelint16u[4] 
796NormalWhiteLevelint16u 
797SpecularWhiteLevelint16u 
798LinearityUpperMarginint16u 
+ +

Canon ColorData10 Tags

+

These tags are used by the R5, R5 and EOS 1DXmkIII.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0ColorDataVersionint16s32 = 32 (1DXmkIII) +
33 = 33 (R5/R6)
85WB_RGGBLevelsAsShotint16s[4] 
89ColorTempAsShotint16s 
90WB_RGGBLevelsAutoint16s[4] 
94ColorTempAutoint16s 
95WB_RGGBLevelsMeasuredint16s[4] 
99ColorTempMeasuredint16s 
100WB_RGGBLevelsUnknown?int16s[4] 
104ColorTempUnknown?int16s 
105WB_RGGBLevelsUnknown2?int16s[4] 
109ColorTempUnknown2?int16s 
110WB_RGGBLevelsUnknown3?int16s[4] 
114ColorTempUnknown3?int16s 
115WB_RGGBLevelsUnknown4?int16s[4] 
119ColorTempUnknown4?int16s 
120WB_RGGBLevelsUnknown5?int16s[4] 
124ColorTempUnknown5?int16s 
125WB_RGGBLevelsUnknown6?int16s[4] 
129ColorTempUnknown6?int16s 
130WB_RGGBLevelsUnknown7?int16s[4] 
134ColorTempUnknown7?int16s 
135WB_RGGBLevelsUnknown8?int16s[4] 
139ColorTempUnknown8?int16s 
140WB_RGGBLevelsUnknown9?int16s[4] 
144ColorTempUnknown9?int16s 
145WB_RGGBLevelsUnknown10?int16s[4] 
149ColorTempUnknown10?int16s 
150WB_RGGBLevelsDaylightint16s[4] 
154ColorTempDaylightint16s 
155WB_RGGBLevelsShadeint16s[4] 
159ColorTempShadeint16s 
160WB_RGGBLevelsCloudyint16s[4] 
164ColorTempCloudyint16s 
165WB_RGGBLevelsTungstenint16s[4] 
169ColorTempTungstenint16s 
170WB_RGGBLevelsFluorescentint16s[4] 
174ColorTempFluorescentint16s 
175WB_RGGBLevelsKelvinint16s[4] 
179ColorTempKelvinint16s 
180WB_RGGBLevelsFlashint16s[4] 
184ColorTempFlashint16s 
185WB_RGGBLevelsUnknown11?int16s[4] 
189ColorTempUnknown11?int16s 
190WB_RGGBLevelsUnknown12?int16s[4] 
194ColorTempUnknown12?int16s 
195WB_RGGBLevelsUnknown13?int16s[4] 
199ColorTempUnknown13?int16s 
200WB_RGGBLevelsUnknown14?int16s[4] 
204ColorTempUnknown14?int16s 
205WB_RGGBLevelsUnknown15?int16s[4] 
209ColorTempUnknown15?int16s 
210WB_RGGBLevelsUnknown16?int16s[4] 
214ColorTempUnknown16?int16s 
215WB_RGGBLevelsUnknown17?int16s[4] 
219ColorTempUnknown17?int16s 
220WB_RGGBLevelsUnknown18?int16s[4] 
224ColorTempUnknown18?int16s 
225WB_RGGBLevelsUnknown19?int16s[4] 
229ColorTempUnknown19?int16s 
230WB_RGGBLevelsUnknown20?int16s[4] 
234ColorTempUnknown20?int16s 
235WB_RGGBLevelsUnknown21?int16s[4] 
239ColorTempUnknown21?int16s 
240WB_RGGBLevelsUnknown22?int16s[4] 
244ColorTempUnknown22?int16s 
245WB_RGGBLevelsUnknown23?int16s[4] 
249ColorTempUnknown23?int16s 
250WB_RGGBLevelsUnknown24?int16s[4] 
254ColorTempUnknown24?int16s 
255WB_RGGBLevelsUnknown25?int16s[4] 
259ColorTempUnknown25?int16s 
260WB_RGGBLevelsUnknown26?int16s[4] 
264ColorTempUnknown26?int16s 
265WB_RGGBLevelsUnknown27?int16s[4] 
269ColorTempUnknown27?int16s 
270WB_RGGBLevelsUnknown28?int16s[4] 
274ColorTempUnknown28?int16s 
275WB_RGGBLevelsUnknown29?int16s[4] 
279ColorTempUnknown29?int16s 
280ColorCalib?---> Canon ColorCalib Tags
343PerChannelBlackLevelint16u[4] 
810NormalWhiteLevelint16u 
811SpecularWhiteLevelint16u 
812LinearityUpperMarginint16u 
+ +

Canon ColorData11 Tags

+

These tags are used by the EOS R3

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0ColorDataVersionint16s34 = 34 (R3)
105WB_RGGBLevelsAsShotint16s[4] 
109ColorTempAsShotint16s 
110WB_RGGBLevelsAutoint16s[4] 
114ColorTempAutoint16s 
115WB_RGGBLevelsMeasuredint16s[4] 
119ColorTempMeasuredint16s 
120WB_RGGBLevelsUnknown?int16s[4] 
124ColorTempUnknown?int16s 
125WB_RGGBLevelsUnknown2?int16s[4] 
129ColorTempUnknown2?int16s 
130WB_RGGBLevelsUnknown3?int16s[4] 
134ColorTempUnknown3?int16s 
135WB_RGGBLevelsUnknown4?int16s[4] 
139ColorTempUnknown4?int16s 
140WB_RGGBLevelsUnknown5?int16s[4] 
144ColorTempUnknown5?int16s 
145WB_RGGBLevelsUnknown6?int16s[4] 
149ColorTempUnknown6?int16s 
150WB_RGGBLevelsUnknown7?int16s[4] 
154ColorTempUnknown7?int16s 
155WB_RGGBLevelsUnknown8?int16s[4] 
159ColorTempUnknown8?int16s 
160WB_RGGBLevelsUnknown9?int16s[4] 
164ColorTempUnknown9?int16s 
165WB_RGGBLevelsUnknown10?int16s[4] 
169ColorTempUnknown10?int16s 
170WB_RGGBLevelsUnknown11?int16s[4] 
174ColorTempUnknown11?int16s 
175WB_RGGBLevelsUnknown11?int16s[4] 
179ColorTempUnknown11?int16s 
180WB_RGGBLevelsUnknown12?int16s[4] 
184ColorTempUnknown12?int16s 
185WB_RGGBLevelsUnknown13?int16s[4] 
189ColorTempUnknown13?int16s 
190WB_RGGBLevelsUnknown14?int16s[4] 
194ColorTempUnknown14?int16s 
195WB_RGGBLevelsUnknown15?int16s[4] 
199ColorTempUnknown15?int16s 
200WB_RGGBLevelsUnknown16?int16s[4] 
204ColorTempUnknown16?int16s 
205WB_RGGBLevelsDaylightint16s[4] 
209ColorTempDaylightint16s 
210WB_RGGBLevelsShadeint16s[4] 
214ColorTempShadeint16s 
215WB_RGGBLevelsCloudyint16s[4] 
219ColorTempCloudyint16s 
220WB_RGGBLevelsTungstenint16s[4] 
224ColorTempTungstenint16s 
225WB_RGGBLevelsFluorescentint16s[4] 
229ColorTempFluorescentint16s 
230WB_RGGBLevelsKelvinint16s[4] 
234ColorTempKelvinint16s 
235WB_RGGBLevelsFlashint16s[4] 
239ColorTempFlashint16s 
240WB_RGGBLevelsUnknown17?int16s[4] 
244ColorTempUnknown17?int16s 
245WB_RGGBLevelsUnknown18?int16s[4] 
249ColorTempUnknown18?int16s 
250WB_RGGBLevelsUnknown19?int16s[4] 
254ColorTempUnknown19?int16s 
255WB_RGGBLevelsUnknown20?int16s[4] 
259ColorTempUnknown20?int16s 
260WB_RGGBLevelsUnknown21?int16s[4] 
264ColorTempUnknown21?int16s 
265WB_RGGBLevelsUnknown22?int16s[4] 
269ColorTempUnknown22?int16s 
270WB_RGGBLevelsUnknown23?int16s[4] 
274ColorTempUnknown23?int16s 
275WB_RGGBLevelsUnknown24?int16s[4] 
279ColorTempUnknown24?int16s 
280WB_RGGBLevelsUnknown25?int16s[4] 
284ColorTempUnknown25?int16s 
285WB_RGGBLevelsUnknown26?int16s[4] 
289ColorTempUnknown26?int16s 
290WB_RGGBLevelsUnknown27?int16s[4] 
294ColorTempUnknown27?int16s 
300ColorCalib?---> Canon ColorCalib Tags
363PerChannelBlackLevelint16u[4] 
640NormalWhiteLevelint16u 
641SpecularWhiteLevelint16u 
642LinearityUpperMarginint16u 
+ +

Canon ColorDataUnknown Tags

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
0ColorDataVersionno 
+ +

Canon ColorInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1Saturationint16s0 = Normal
2ColorToneint16s0 = Normal
3ColorSpaceint16s1 = sRGB +
2 = Adobe RGB
+ +

Canon AFMicroAdj Tags

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1AFMicroAdjModeint32s0 = Disable +
1 = Adjust all by the same amount +
2 = Adjust by lens
2AFMicroAdjValuerational64s 
+ +

Canon VignettingCorr Tags

+

This information is found in images from newer EOS models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0VignettingCorrVersionno 
2PeripheralLightingint16s0 = Off +
1 = On
3DistortionCorrectionint16s0 = Off +
1 = On
4ChromaticAberrationCorrint16s0 = Off +
1 = On
5ChromaticAberrationCorrint16s0 = Off +
1 = On
6PeripheralLightingValueint16s 
9DistortionCorrectionValueint16s 
11OriginalImageWidthint16s(full size of original image before being rotated or scaled in camera)
12OriginalImageHeightint16s 
+ +

Canon VignettingCorrUnknown Tags

+

Vignetting correction from PowerShot models.

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
0VignettingCorrVersionno 
+ +

Canon VignettingCorr2 Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
5PeripheralLightingSettingint32s0 = Off +
1 = On
6ChromaticAberrationSettingint32s0 = Off +
1 = On
7DistortionCorrectionSettingint32s0 = Off +
1 = On
+ +

Canon LightingOpt Tags

+

This information is new in images from the EOS 7D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1PeripheralIlluminationCorrint32s0 = Off +
1 = On
2AutoLightingOptimizerint32s0 = Standard +
1 = Low +
2 = Strong +
3 = Off
3HighlightTonePriorityint32s0 = Off +
1 = On
4LongExposureNoiseReductionint32s0 = Off +
1 = Auto +
2 = On
5HighISONoiseReductionint32s0 = Standard +
1 = Low +
2 = Strong +
3 = Off
+ +

Canon LensInfo Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensSerialNumberundef[5](apparently this is an internal serial number because it doesn't correspond +to the one printed on the lens)
+ +

Canon Ambience Tags

+
+
+ + + + + + + + +
Index4Tag NameWritableValues / Notes
1AmbienceSelectionint32s + + +
0 = Standard +
1 = Vivid +
2 = Warm
  3 = Soft +
4 = Cool +
5 = Intense
  6 = Brighter +
7 = Darker +
8 = Monochrome
+
+ +

Canon MultiExp Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1MultiExposureint32s0 = Off +
1 = On +
2 = On (RAW)
2MultiExposureControlint32s0 = Additive +
1 = Average +
2 = Bright (comparative) +
3 = Dark (comparative)
3MultiExposureShotsint32s 
+ +

Canon FilterInfo Tags

+

Information about creative filter settings.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0101GrainyBWFilterno-1 = Off
0x0201SoftFocusFilterno-1 = Off
0x0301ToyCameraFilterno-1 = Off
0x0401MiniatureFilterno-1 = Off
0x0402MiniatureFilterOrientationno0 = Horizontal +
1 = Vertical
0x0403MiniatureFilterPositionno 
0x0404MiniatureFilterParameterno 
0x0501FisheyeFilterno-1 = Off
0x0601PaintingFilterno-1 = Off
0x0701WatercolorFilterno-1 = Off
+ +

Canon HDRInfo Tags

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1HDRint32s0 = Off +
1 = Auto +
2 = On
2HDREffectint32s0 = Natural +
1 = Art (standard) +
2 = Art (vivid) +
3 = Art (bold) +
4 = Art (embossed)
+ +

Canon LogInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
4CompressionFormatint32s0 = Editing (ALL-I) +
1 = Standard (IPB) +
2 = Light (IPB) +
3 = Motion JPEG +
4 = RAW
6Sharpnessint32s 
7Saturationint32s0 = Normal
8ColorToneint32s0 = Normal
9ColorSpace2int32s0 = BT.709 +
1 = BT.2020 +
2 = CinemaGamut
10ColorMatrixint32s0 = EOS Original +
1 = Neutral
11CanonLogVersionint32s0 = OFF +
1 = CLogV1 +
2 = CLogV2 +
3 = CLogV3
+ +

Canon AFConfig Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1AFConfigToolint32s 
2AFTrackingSensitivityint32s 
3AFAccelDecelTrackingint32s 
4AFPointSwitchingint32s 
5AIServoFirstImageint32s0 = Equal Priority +
1 = Release Priority +
2 = Focus Priority
6AIServoSecondImageint32s0 = Equal Priority +
1 = Release Priority +
2 = Focus Priority +
3 = Release High Priority +
4 = Focus High Priority
7USMLensElectronicMFint32s0 = Enable After AF +
1 = Disable After AF +
2 = Disable in AF Mode
8AFAssistBeamint32s0 = Enable +
1 = Disable +
2 = IR AF Assist Beam Only
9OneShotAFReleaseint32s0 = Focus Priority +
1 = Release Priority
10AutoAFPointSelEOSiTRAFint32s(only valid for some models) +
0 = Enable +
1 = Disable
11LensDriveWhenAFImpossibleint32s0 = Continue Focus Search +
1 = Stop Focus Search
12SelectAFAreaSelectionModeint32s +
Bit 0 = Single-point AF +
Bit 1 = Auto +
Bit 2 = Zone AF +
Bit 3 = AF Point Expansion (4 point) +
Bit 4 = Spot AF +
Bit 5 = AF Point Expansion (8 point)
+
13AFAreaSelectionMethodint32s0 = M-Fn Button +
1 = Main Dial
14OrientationLinkedAFint32s0 = Same for Vert/Horiz Points +
1 = Separate Vert/Horiz Points +
2 = Separate Area+Points
15ManualAFPointSelPatternint32s0 = Stops at AF Area Edges +
1 = Continuous
16AFPointDisplayDuringFocusint32s0 = Selected (constant) +
1 = All (constant) +
2 = Selected (pre-AF, focused) +
3 = Selected (focused) +
4 = Disabled
17VFDisplayIlluminationint32s0 = Auto +
1 = Enable +
2 = Disable
18AFStatusViewfinderint32s(1D X only) +
0 = Show in Field of View +
1 = Show Outside View
19InitialAFPointInServoint32s(1D X only) +
0 = Initial AF Point Selected +
1 = Manual AF Point +
2 = Auto
+ +

Canon RawBurstInfo Tags

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1RawBurstImageNumint32u 
2RawBurstImageCountint32u 
+ +

Canon CTMD Tags

+

Canon Timed MetaData tags found in CR3 images. The ExtractEmbedded option +is automatically applied when reading CR3 files to be able to extract this +information.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001TimeStampno 
0x0004FocalInfo---> Canon FocalInfo Tags
0x0005ExposureInfo---> Canon ExposureInfo Tags
0x0007ExifInfo7---> Canon ExifInfo Tags
0x0008ExifInfo8---> Canon ExifInfo Tags
0x0009ExifInfo9---> Canon ExifInfo Tags
+ +

Canon FocalInfo Tags

+
+
+ + + + + + + + +
Index4Tag NameWritableValues / Notes
0FocalLengthno 
+ +

Canon ExposureInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0FNumberno 
1ExposureTimeno 
2ISOno 
+ +

Canon ExifInfo Tags

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x8769ExifIFD---> EXIF Tags
0x927cMakerNoteCanon---> Canon Tags
+ +

Canon CDI1 Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'IAD1'IAD1---> Canon IAD1 Tags
+ +

Canon IAD1 Tags

+
+
+ + + + +
Index2Tag NameWritableValues / Notes
[no tags known]
+ +

Canon CMP1 Tags

+
+
+ + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
8ImageWidthno 
10ImageHeightno 
+ +

Canon CNOP Tags

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

Canon CNTH Tags

+

Canon-specific QuickTime tags found in the CNTH atom of MOV/MP4 videos from +some cameras.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'CNDA'ThumbnailImageundef(the full THM image, embedded metadata is extracted as the first sub-document)
+ +

Canon uuid Tags

+

Tags extracted from the uuid atom of MP4 videos from cameras such as the +SX280, and CR3 images from cameras such as the EOS M50.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'CCTP'CanonCCTP---> Canon CCTP Tags
'CMT1'IFD0---> EXIF Tags
'CMT2'ExifIFD---> EXIF Tags
'CMT3'MakerNoteCanon---> Canon Tags
'CMT4'GPSInfo---> GPS Tags
'CNCV'CompressorVersionno 
'CNOP'CanonCNOP---> Canon CNOP Tags
'CNTH'CanonCNTH---> Canon CNTH Tags
'THMB'ThumbnailImageno 
+ +

Canon CCTP Tags

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

Canon Skip Tags

+

Information found in the "skip" atom of Canon MOV videos.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'CNDB'Unknown_CNDB?no 
+ +

Canon uuid2 Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'CNOP'CanonVRD---> CanonVRD Tags
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 6, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/CanonCustom.html b/html/TagNames/CanonCustom.html new file mode 100644 index 0000000..0742d7b --- /dev/null +++ b/html/TagNames/CanonCustom.html @@ -0,0 +1,2224 @@ + + + + +CanonCustom Tags + + + +

CanonCustom Functions1D Tags

+

These custom functions are used by all 1D models up to but not including the +Mark III.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0FocusingScreenint8u0 = Ec-N, R +
1 = Ec-A,B,C,CII,CIII,D,H,I,L
1FinderDisplayDuringExposureint8u0 = Off +
1 = On
2ShutterReleaseNoCFCardint8u0 = Yes +
1 = No
3ISOSpeedExpansionint8u0 = No +
1 = Yes
4ShutterAELButtonint8u0 = AF/AE lock stop +
1 = AE lock/AF +
2 = AF/AF lock, No AE lock +
3 = AE/AF, No AE lock
5ManualTvint8u0 = Tv=Main/Av=Control +
1 = Tv=Control/Av=Main +
2 = Tv=Main/Av=Main w/o lens +
3 = Tv=Control/Av=Main w/o lens
6ExposureLevelIncrementsint8u0 = 1/3-stop set, 1/3-stop comp. +
1 = 1-stop set, 1/3-stop comp. +
2 = 1/2-stop set, 1/2-stop comp.
7USMLensElectronicMFint8u0 = Turns on after one-shot AF +
1 = Turns off after one-shot AF +
2 = Always turned off
8LCDPanelsint8u0 = Remain. shots/File no. +
1 = ISO/Remain. shots +
2 = ISO/File no. +
3 = Shots in folder/Remain. shots
9AEBSequenceAutoCancelint8u0 = 0,-,+/Enabled +
1 = 0,-,+/Disabled +
2 = -,0,+/Enabled +
3 = -,0,+/Disabled
10AFPointIlluminationint8u0 = On +
1 = Off +
2 = On without dimming +
3 = Brighter
11AFPointSelectionint8u0 = H=AF+Main/V=AF+Command +
1 = H=Comp+Main/V=Comp+Command +
2 = H=Command only/V=Assist+Main +
3 = H=FEL+Main/V=FEL+Command
12MirrorLockupint8u0 = Disable +
1 = Enable
13AFPointSpotMeteringint8u0 = 45/Center AF point +
1 = 11/Active AF point +
2 = 11/Center AF point +
3 = 9/Active AF point
14FillFlashAutoReductionint8u0 = Enable +
1 = Disable
15ShutterCurtainSyncint8u0 = 1st-curtain sync +
1 = 2nd-curtain sync
16SafetyShiftInAvOrTvint8u0 = Disable +
1 = Enable
17AFPointActivationAreaint8u0 = Single AF point +
1 = Expanded (TTL. of 7 AF points) +
2 = Automatic expanded (max. 13)
18SwitchToRegisteredAFPointint8u0 = Assist + AF +
1 = Assist +
2 = Only while pressing assist
19LensAFStopButtonint8u +
0 = AF stop +
1 = AF start +
2 = AE lock while metering +
3 = AF point: M -> Auto / Auto -> Ctr. +
4 = AF mode: ONE SHOT <-> AI SERVO +
5 = IS start
+
20AIServoTrackingSensitivityint8u0 = Standard +
1 = Slow +
2 = Moderately slow +
3 = Moderately fast +
4 = Fast
21AIServoContinuousShootingint8u0 = Shooting not possible without focus +
1 = Shooting possible without focus
+ +

CanonCustom Functions5D Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0FocusingScreenint8u0 = Ee-A +
1 = Ee-D +
2 = Ee-S
1SetFunctionWhenShootingint8u0 = Default (no function) +
1 = Change quality +
2 = Change Parameters +
3 = Menu display +
4 = Image replay
2LongExposureNoiseReductionint8u0 = Off +
1 = Auto +
2 = On
3FlashSyncSpeedAvint8u0 = Auto +
1 = 1/200 Fixed
4Shutter-AELockint8u0 = AF/AE lock +
1 = AE lock/AF +
2 = AF/AF lock, No AE lock +
3 = AE/AF, No AE lock
5AFAssistBeamint8u0 = Emits +
1 = Does not emit
6ExposureLevelIncrementsint8u0 = 1/3 Stop +
1 = 1/2 Stop
7FlashFiringint8u0 = Fires +
1 = Does not fire
8ISOExpansionint8u0 = Off +
1 = On
9AEBSequenceAutoCancelint8u0 = 0,-,+/Enabled +
1 = 0,-,+/Disabled +
2 = -,0,+/Enabled +
3 = -,0,+/Disabled
10SuperimposedDisplayint8u0 = On +
1 = Off
11MenuButtonDisplayPositionint8u0 = Previous (top if power off) +
1 = Previous +
2 = Top
12MirrorLockupint8u0 = Disable +
1 = Enable
13AFPointSelectionMethodint8u0 = Normal +
1 = Multi-controller direct +
2 = Quick Control Dial direct
14ETTLIIint8u0 = Evaluative +
1 = Average
15ShutterCurtainSyncint8u0 = 1st-curtain sync +
1 = 2nd-curtain sync
16SafetyShiftInAvOrTvint8u0 = Disable +
1 = Enable
17AFPointActivationAreaint8u0 = Standard +
1 = Expanded
18LCDDisplayReturnToShootint8u0 = With Shutter Button only +
1 = Also with * etc.
19LensAFStopButtonint8u +
0 = AF stop +
1 = AF start +
2 = AE lock while metering +
3 = AF point: M -> Auto / Auto -> Ctr. +
4 = ONE SHOT <-> AI SERVO +
5 = IS start
+
20AddOriginalDecisionDataint8u0 = Off +
1 = On
+ +

CanonCustom Functions10D Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
1SetButtonWhenShootingint8u0 = Normal (disabled) +
1 = Image quality +
2 = Change parameters +
3 = Menu display +
4 = Image playback
2ShutterReleaseNoCFCardint8u0 = Yes +
1 = No
3FlashSyncSpeedAvint8u0 = Auto +
1 = 1/200 Fixed
4Shutter-AELockint8u0 = AF/AE lock +
1 = AE lock/AF +
2 = AF/AF lock, No AE lock +
3 = AE/AF, No AE lock
5AFAssistint8u0 = Emits/Fires +
1 = Does not emit/Fires +
2 = Only ext. flash emits/Fires +
3 = Emits/Does not fire
6ExposureLevelIncrementsint8u0 = 1/2 Stop +
1 = 1/3 Stop
7AFPointRegistrationint8u + +
0 = Center +
1 = Bottom +
2 = Right +
3 = Extreme Right
  4 = Automatic +
5 = Extreme Left +
6 = Left +
7 = Top
+
8RawAndJpgRecordingint8u + +
0 = RAW+Small/Normal +
1 = RAW+Small/Fine +
2 = RAW+Medium/Normal
  3 = RAW+Medium/Fine +
4 = RAW+Large/Normal +
5 = RAW+Large/Fine
+
9AEBSequenceAutoCancelint8u0 = 0,-,+/Enabled +
1 = 0,-,+/Disabled +
2 = -,0,+/Enabled +
3 = -,0,+/Disabled
10SuperimposedDisplayint8u0 = On +
1 = Off
11MenuButtonDisplayPositionint8u0 = Previous (top if power off) +
1 = Previous +
2 = Top
12MirrorLockupint8u0 = Disable +
1 = Enable
13AssistButtonFunctionint8u0 = Normal +
1 = Select Home Position +
2 = Select HP (while pressing) +
3 = Av+/- (AF point by QCD) +
4 = FE lock
14FillFlashAutoReductionint8u0 = Enable +
1 = Disable
15ShutterCurtainSyncint8u0 = 1st-curtain sync +
1 = 2nd-curtain sync
16SafetyShiftInAvOrTvint8u0 = Disable +
1 = Enable
17LensAFStopButtonint8u +
0 = AF stop +
1 = AF start +
2 = AE lock while metering +
3 = AF point: M->Auto/Auto->ctr +
4 = One Shot <-> AI servo +
5 = IS start
+
+ +

CanonCustom Functions20D Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0SetFunctionWhenShootingint8u0 = Default (no function) +
1 = Change quality +
2 = Change Parameters +
3 = Menu display +
4 = Image replay
1LongExposureNoiseReductionint8u0 = Off +
1 = On
2FlashSyncSpeedAvint8u0 = Auto +
1 = 1/250 Fixed
3Shutter-AELockint8u0 = AF/AE lock +
1 = AE lock/AF +
2 = AF/AF lock, No AE lock +
3 = AE/AF, No AE lock
4AFAssistBeamint8u0 = Emits +
1 = Does not emit +
2 = Only ext. flash emits
5ExposureLevelIncrementsint8u0 = 1/3 Stop +
1 = 1/2 Stop
6FlashFiringint8u0 = Fires +
1 = Does not fire
7ISOExpansionint8u0 = Off +
1 = On
8AEBSequenceAutoCancelint8u0 = 0,-,+/Enabled +
1 = 0,-,+/Disabled +
2 = -,0,+/Enabled +
3 = -,0,+/Disabled
9SuperimposedDisplayint8u0 = On +
1 = Off
10MenuButtonDisplayPositionint8u0 = Previous (top if power off) +
1 = Previous +
2 = Top
11MirrorLockupint8u0 = Disable +
1 = Enable
12AFPointSelectionMethodint8u0 = Normal +
1 = Multi-controller direct +
2 = Quick Control Dial direct
13ETTLIIint8u0 = Evaluative +
1 = Average
14ShutterCurtainSyncint8u0 = 1st-curtain sync +
1 = 2nd-curtain sync
15SafetyShiftInAvOrTvint8u0 = Disable +
1 = Enable
16LensAFStopButtonint8u +
0 = AF stop +
1 = AF start +
2 = AE lock while metering +
3 = AF point: M -> Auto / Auto -> Ctr. +
4 = ONE SHOT <-> AI SERVO +
5 = IS start
+
17AddOriginalDecisionDataint8u0 = Off +
1 = On
+ +

CanonCustom Functions30D Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
1SetFunctionWhenShootingint8u0 = Default (no function) +
1 = Change quality +
2 = Change Picture Style +
3 = Menu display +
4 = Image replay
2LongExposureNoiseReductionint8u0 = Off +
1 = Auto +
2 = On
3FlashSyncSpeedAvint8u0 = Auto +
1 = 1/250 Fixed
4Shutter-AELockint8u0 = AF/AE lock +
1 = AE lock/AF +
2 = AF/AF lock, No AE lock +
3 = AE/AF, No AE lock
5AFAssistBeamint8u0 = Emits +
1 = Does not emit +
2 = Only ext. flash emits
6ExposureLevelIncrementsint8u0 = 1/3 Stop +
1 = 1/2 Stop
7FlashFiringint8u0 = Fires +
1 = Does not fire
8ISOExpansionint8u0 = Off +
1 = On
9AEBSequenceAutoCancelint8u0 = 0,-,+/Enabled +
1 = 0,-,+/Disabled +
2 = -,0,+/Enabled +
3 = -,0,+/Disabled
10SuperimposedDisplayint8u0 = On +
1 = Off
11MenuButtonDisplayPositionint8u0 = Previous (top if power off) +
1 = Previous +
2 = Top
12MirrorLockupint8u0 = Disable +
1 = Enable
13AFPointSelectionMethodint8u0 = Normal +
1 = Multi-controller direct +
2 = Quick Control Dial direct
14ETTLIIint8u0 = Evaluative +
1 = Average
15ShutterCurtainSyncint8u0 = 1st-curtain sync +
1 = 2nd-curtain sync
16SafetyShiftInAvOrTvint8u0 = Disable +
1 = Enable
17MagnifiedViewint8u0 = Image playback only +
1 = Image review and playback
18LensAFStopButtonint8u +
0 = AF stop +
1 = AF start +
2 = AE lock while metering +
3 = AF point: M -> Auto / Auto -> Ctr. +
4 = ONE SHOT <-> AI SERVO +
5 = IS start
+
19AddOriginalDecisionDataint8u0 = Off +
1 = On
+ +

CanonCustom Functions350D Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0SetButtonCrossKeysFuncint8u0 = Normal +
1 = Set: Quality +
2 = Set: Parameter +
3 = Set: Playback +
4 = Cross keys: AF point select
1LongExposureNoiseReductionint8u0 = Off +
1 = On
2FlashSyncSpeedAvint8u0 = Auto +
1 = 1/200 Fixed
3Shutter-AELockint8u0 = AF/AE lock +
1 = AE lock/AF +
2 = AF/AF lock, No AE lock +
3 = AE/AF, No AE lock
4AFAssistBeamint8u0 = Emits +
1 = Does not emit +
2 = Only ext. flash emits
5ExposureLevelIncrementsint8u0 = 1/3 Stop +
1 = 1/2 Stop
6MirrorLockupint8u0 = Disable +
1 = Enable
7ETTLIIint8u0 = Evaluative +
1 = Average
8ShutterCurtainSyncint8u0 = 1st-curtain sync +
1 = 2nd-curtain sync
+ +

CanonCustom Functions400D Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0SetButtonCrossKeysFuncint8u0 = Set: Picture Style +
1 = Set: Quality +
2 = Set: Flash Exposure Comp +
3 = Set: Playback +
4 = Cross keys: AF point select
1LongExposureNoiseReductionint8u0 = Off +
1 = Auto +
2 = On
2FlashSyncSpeedAvint8u0 = Auto +
1 = 1/200 Fixed
3Shutter-AELockint8u0 = AF/AE lock +
1 = AE lock/AF +
2 = AF/AF lock, No AE lock +
3 = AE/AF, No AE lock
4AFAssistBeamint8u0 = Emits +
1 = Does not emit +
2 = Only ext. flash emits
5ExposureLevelIncrementsint8u0 = 1/3 Stop +
1 = 1/2 Stop
6MirrorLockupint8u0 = Disable +
1 = Enable
7ETTLIIint8u0 = Evaluative +
1 = Average
8ShutterCurtainSyncint8u0 = 1st-curtain sync +
1 = 2nd-curtain sync
9MagnifiedViewint8u0 = Image playback only +
1 = Image review and playback
10LCDDisplayAtPowerOnint8u0 = Display +
1 = Retain power off status
+ +

CanonCustom FunctionsD30 Tags

+

Custom functions for the EOS D30 and D60.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
1LongExposureNoiseReductionint8u0 = Off +
1 = On
2Shutter-AELockint8u0 = AF/AE lock +
1 = AE lock/AF +
2 = AF/AF lock +
3 = AE+release/AE+AF
3MirrorLockupint8u0 = Disable +
1 = Enable
4ExposureLevelIncrementsint8u0 = 1/2 Stop +
1 = 1/3 Stop
5AFAssistint8u0 = Emits/Fires +
1 = Does not emit/Fires +
2 = Only ext. flash emits/Fires +
3 = Emits/Does not fire
6FlashSyncSpeedAvint8u0 = Auto +
1 = 1/200 Fixed
7AEBSequenceAutoCancelint8u0 = 0,-,+/Enabled +
1 = 0,-,+/Disabled +
2 = -,0,+/Enabled +
3 = -,0,+/Disabled
8ShutterCurtainSyncint8u0 = 1st-curtain sync +
1 = 2nd-curtain sync
9LensAFStopButtonint8u0 = AF Stop +
1 = Operate AF +
2 = Lock AE and start timer
10FillFlashAutoReductionint8u0 = Enable +
1 = Disable
11MenuButtonReturnint8u0 = Top +
1 = Previous (volatile) +
2 = Previous
12SetButtonWhenShootingint8u0 = Default (no function) +
1 = Image quality +
2 = Change ISO speed +
3 = Change parameters
13SensorCleaningint8u0 = Disable +
1 = Enable
14SuperimposedDisplayint8u0 = On +
1 = Off
15ShutterReleaseNoCFCardint8u0 = Yes +
1 = No
+ +

CanonCustom FuncsUnknown Tags

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

CanonCustom PersonalFuncs Tags

+

Personal function settings for the EOS-1D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1PF0CustomFuncRegistrationint16u 
2PF1DisableShootingModesint16u 
3PF2DisableMeteringModesint16u 
4PF3ManualExposureMeteringint16u 
5PF4ExposureTimeLimitsint16u 
6PF5ApertureLimitsint16u 
7PF6PresetShootingModesint16u 
8PF7BracketContinuousShootint16u 
9PF8SetBracketShotsint16u 
10PF9ChangeBracketSequenceint16u 
11PF10RetainProgramShiftint16u 
14PF13DrivePriorityint16u 
15PF14DisableFocusSearchint16u 
16PF15DisableAFAssistBeamint16u 
17PF16AutoFocusPointShootint16u 
18PF17DisableAFPointSelint16u 
19PF18EnableAutoAFPointSelint16u 
20PF19ContinuousShootSpeedint16u 
21PF20LimitContinousShotsint16u 
22PF21EnableQuietOperationint16u 
24PF23SetTimerLengthsint16u 
25PF24LightLCDDuringBulbint16u 
26PF25DefaultClearSettingsint16u 
27PF26ShortenReleaseLagint16u 
28PF27ReverseDialRotationint16u 
29PF28NoQuickDialExpCompint16u 
30PF29QuickDialSwitchOffint16u 
31PF30EnlargementModeint16u 
32PF31OriginalDecisionDataint16u 
+ +

CanonCustom PersonalFuncValues Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1PF1Valueint16u 
2PF2Valueint16u 
3PF3Valueint16u 
4PF4ExposureTimeMinint16u 
5PF4ExposureTimeMaxint16u 
6PF5ApertureMinint16u 
7PF5ApertureMaxint16u 
8PF8BracketShotsint16u 
9PF19ShootingSpeedLowint16u 
10PF19ShootingSpeedHighint16u 
11PF20MaxContinousShotsint16u 
12PF23ShutterButtonTimeint16u 
13PF23FELockTimeint16u 
14PF23PostReleaseTimeint16u 
15PF25AEModeint16u 
16PF25MeteringModeint16u 
17PF25DriveModeint16u 
18PF25AFModeint16u 
19PF25AFPointSelint16u 
20PF25ImageSizeint16u 
21PF25WBModeint16u 
22PF25Parametersint16u 
23PF25ColorMatrixint16u 
24PF27Valueint16u 
+ +

CanonCustom Functions2 Tags

+

Beginning with the EOS 1D Mark III, Canon finally created a set of custom +function tags which are (reasonably) consistent across models. The EOS 1D +Mark III has 57 custom function tags divided into four main groups: 1. +Exposure (0x0101-0x010f), 2. Image (0x0201-0x0203), Flash Exposure +(0x0304-0x0306) and Display (0x0407-0x0409), 3. Auto Focus (0x0501-0x050e) +and Drive (0x060f-0x0611), and 4. Operation (0x0701-0x070a) and Others +(0x080b-0x0810). The table below lists tags used by the EOS 1D Mark III, as +well as newer tags and values added by later models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0101ExposureLevelIncrementsint32s(1DmkIII and 1DmkIV) +
0 = 1/3-stop set, 1/3-stop comp. +
1 = 1-stop set, 1/3-stop comp. +
2 = 1/2-stop set, 1/2-stop comp. +
(other models) +
0 = 1/3 Stop +
1 = 1/2 Stop
0x0102ISOSpeedIncrementsint32s0 = 1/3 Stop +
1 = 1 Stop
0x0103ISOSpeedRange +
ISOExpansion
int32s[3]
int32s
(1DmkIII and 1DmkIV) +
[Value 0] +
0 = Disable +
1 = Enable +
(other models) +
0 = Off +
1 = On
0x0104AEBAutoCancelint32s0 = On +
1 = Off
0x0105AEBSequenceint32s(value of 2 not used by 40D, 50D, 60D, 5DmkII and 7D) +
0 = 0,-,+ +
1 = -,0,+ +
2 = +,0,-
0x0106AEBShotCount +
AEBShotCount
int32s
int32s[2]
(EOS 90D) +
2 = 2 shots +
3 = 3 shots +
5 = 5 shots +
7 = 7 shots +
(other models storing a single value) +
0 = 3 shots +
1 = 2 shots +
2 = 5 shots +
3 = 7 shots +
(models storing two values) +
'2 1' = 2 shots +
'3 0' = 3 shots +
'5 2' = 5 shots +
'7 3' = 7 shots
0x0107SpotMeterLinkToAFPointint32s0 = Disable (use center AF point) +
1 = Enable (use active AF point)
0x0108SafetyShiftint32s(value of 2 not used by some models) +
0 = Disable +
1 = Enable (Tv/Av) +
2 = Enable (ISO speed)
0x0109UsableShootingModes +
UsableShootingModes
int32s
int32s[2]
[Value 0] +
0 = Disable +
1 = Enable
0x010aUsableMeteringModes +
UsableMeteringModes
int32s
int32s[2]
[Value 0] +
0 = Disable +
1 = Enable
0x010bExposureModeInManualint32s0 = Specified metering mode +
1 = Evaluative metering +
2 = Partial metering +
3 = Spot metering +
4 = Center-weighted average
0x010cShutterSpeedRange +
ShutterSpeedRange
int32s[3]
int32s[4]
[Value 0] +
0 = Disable +
1 = Enable
0x010dApertureRange +
ApertureRange
int32s[3]
int32s[4]
[Value 0] +
0 = Disable +
1 = Enable
0x010eApplyShootingMeteringModeint32s[8][Value 0] +
0 = Disable +
1 = Enable
0x010fFlashSyncSpeedAvint32s(40D and 1Ds Mark III) +
0 = Auto +
1 = 1/250 Fixed +
(50D, 60D and 7D) +
0 = Auto +
1 = 1/250-1/60 Auto +
2 = 1/250 Fixed +
(450D and 1000D) +
0 = Auto +
1 = 1/200 Fixed +
(1D Mark III and 1Ds Mark III) +
0 = Auto +
1 = 1/300 Fixed +
(1D Mark IV) +
0 = Auto +
1 = 1/300-1/60 Auto +
2 = 1/300 Fixed +
(5D Mark II, 5D Mark III, 500D, 550D, 600D and 1100D) +
0 = Auto +
1 = 1/200-1/60 Auto +
2 = 1/200 Fixed
0x0110AEMicroadjustmentint32s[3][Value 0] +
0 = Disable +
1 = Enable
0x0111FEMicroadjustmentint32s[3][Value 0] +
0 = Disable +
1 = Enable
0x0112SameExposureForNewApertureint32s0 = Disable +
1 = ISO Speed +
2 = Shutter Speed +
(EOS R) +
0 = Disable +
1 = ISO Speed +
2 = ISO Speed/Shutter Speed +
3 = Shutter Speed
0x0113ExposureCompAutoCancelint32s0 = Enable +
1 = Disable
0x0114AELockMeterModeAfterFocusint32sBit 0 = Evaluative +
Bit 1 = Partial +
Bit 2 = Spot +
Bit 3 = Center-weighted
0x0201LongExposureNoiseReductionint32s0 = Off +
1 = Auto +
2 = On
0x0202HighISONoiseReductionint32s(50D, 60D, 500D, 550D, 600D, 1100D, 5DmkII and 7D) +
0 = Standard +
1 = Low +
2 = Strong +
3 = Off +
(other models) +
0 = Off +
1 = On
0x0203HighlightTonePriorityint32s0 = Disable +
1 = Enable
0x0204AutoLightingOptimizerint32s(50D, 500D, 5DmkII and 1DmkIV) +
0 = Standard +
1 = Low +
2 = Strong +
3 = Disable +
(other models) +
0 = Enable +
1 = Disable
0x0304ETTLIIint32s0 = Evaluative +
1 = Average
0x0305ShutterCurtainSyncint32s0 = 1st-curtain sync +
1 = 2nd-curtain sync
0x0306FlashFiringint32s0 = Fires +
1 = Does not fire
0x0407ViewInfoDuringExposureint32s0 = Disable +
1 = Enable
0x0408LCDIlluminationDuringBulbint32s0 = Off +
1 = On
0x0409InfoButtonWhenShootingint32s(1D Mark III) +
0 = Displays camera settings +
1 = Displays shooting functions +
(1D Mark IV) +
0 = Displays shooting functions +
1 = Displays camera settings
0x040aViewfinderWarningsint32s +
Bit 0 = Monochrome +
Bit 1 = WB corrected +
Bit 2 = One-touch image quality +
Bit 3 = ISO expansion +
Bit 4 = Spot metering +
Bit 6 = Noise reduction +
Bit 7 = HDR
+
0x040bLVShootingAreaDisplayint32s0 = Masked +
1 = Outlined
0x040cLVShootingAreaDisplayint32s0 = Masked +
1 = Outlined
0x0501USMLensElectronicMFint32s0 = Enable after one-shot AF +
1 = Disable after one-shot AF +
2 = Disable in AF mode
0x0502AIServoTrackingSensitivityint32s-2 = Slow +
-1 = Medium Slow +
0 = Standard +
1 = Medium Fast +
2 = Fast
0x0503AIServoImagePriorityint32s0 = 1: AF, 2: Tracking +
1 = 1: AF, 2: Drive speed +
2 = 1: Release, 2: Drive speed +
3 = 1: Release, 2: Tracking
0x0504AIServoTrackingMethodint32s0 = Main focus point priority +
1 = Continuous AF track priority
0x0505LensDriveNoAFint32s0 = Focus search on +
1 = Focus search off
0x0506LensAFStopButtonint32s(value of 6 not used by 40D, 50D and 5DmkII) +
0 = AF stop +
1 = AF start +
2 = AE lock +
3 = AF point: M->Auto/Auto->ctr +
4 = One Shot <-> AI servo +
5 = IS start +
6 = Switch to registered AF point +
7 = Spot AF
+
0x0507AFMicroadjustmentint32s[5][Value 0] +
0 = Disable +
1 = Adjust all by same amount +
2 = Adjust by lens
0x0508AFPointAreaExpansionint32s(5D Mark II) +
0 = Disable +
1 = Enable +
(1Ds Mark III) +
0 = Disable +
1 = Enable (left/right Assist AF points) +
2 = Enable (surrounding Assist AF points) +
(other models) +
0 = Disable +
1 = Left/right AF points +
2 = Surrounding AF points +
3 = All 45 points area
0x0509SelectableAFPointint32s(1D Mark IV) +
0 = 45 points +
1 = 19 points +
2 = 11 points +
3 = Inner 9 points +
4 = Outer 9 points +
(other models)
+
0 = 19 points +
1 = Inner 9 points +
2 = Outer 9 points +
3 = 19 Points, Multi-controller selectable +
4 = Inner 9 Points, Multi-controller selectable +
5 = Outer 9 Points, Multi-controller selectable
+
0x050aSwitchToRegisteredAFPointint32s(1D Mark IV) +
0 = Disable +
1 = Switch with multi-controller +
2 = Only while AEL is pressed +
(other models) +
0 = Disable +
1 = Enable
0x050bAFPointAutoSelectionint32s0 = Control-direct:disable/Main:enable +
1 = Control-direct:disable/Main:disable +
2 = Control-direct:enable/Main:enable
0x050cAFPointDisplayDuringFocusint32s(1D models) +
0 = On +
1 = Off +
2 = On (when focus achieved) +
(other models) +
0 = Selected (constant) +
1 = All (constant) +
2 = Selected (pre-AF, focused) +
3 = Selected (focused) +
4 = Disable display
0x050dAFPointBrightnessint32s0 = Normal +
1 = Brighter
0x050eAFAssistBeamint32s(1D Mark IV and 6D) +
0 = Emits +
1 = Does not emit +
2 = IR AF assist beam only +
(other models; values 2-3 not used by 1DmkIII or 5DmkII, value 3 new for 7D) +
0 = Emits +
1 = Does not emit +
2 = Only ext. flash emits +
3 = IR AF assist beam only
0x050fAFPointSelectionMethodint32s(40D, 50D and 5DmkII) +
0 = Normal +
1 = Multi-controller direct +
2 = Quick Control Dial direct +
(60D) +
0 = AF point button: Activate AF Sel; Rear dial: Select AF points +
1 = AF point button: Auto selection; Rear dial: Manual selection
0x0510VFDisplayIllumination +
SuperimposedDisplay
int32s
int32s
(7D) +
0 = Auto +
1 = Enable +
2 = Disable +
(other models) +
0 = On +
1 = Off
0x0511AFDuringLiveViewint32s(40D) +
0 = Disable +
1 = Enable +
(450D and 1000D) +
0 = Disable +
1 = Quick mode +
2 = Live mode
0x0512SelectAFAreaSelectModeint32s[Value 0] +
0 = Disable +
1 = Enable +
2 = Register +
3 = Select AF-modes
0x0513ManualAFPointSelectPatternint32s0 = Stops at AF area edges +
1 = Continuous
0x0514DisplayAllAFPointsint32s0 = Enable +
1 = Disable
0x0515FocusDisplayAIServoAndMFint32s0 = Enable +
1 = Disable
0x0516OrientationLinkedAFPointint32s0 = Same for vertical and horizontal +
1 = Select different AF points
0x0517MultiControllerWhileMeteringint32s0 = Off +
1 = AF point selection
0x0518AccelerationTrackingint32s 
0x0519AIServoFirstImagePriorityint32s-1 = Release priority +
0 = Equal priority +
1 = Focus priority
0x051aAIServoSecondImagePriorityint32s-1 = Shooting speed priority +
0 = Equal priority +
1 = Focus priority
0x051bAFAreaSelectMethodint32s0 = AF area selection button +
1 = Main dial
0x051cAutoAFPointColorTrackingint32s0 = On-Shot AF only +
1 = Disable
0x051dVFDisplayIlluminationint32s[Value 0] +
0 = Auto +
1 = Enable +
2 = Disable +
[Value 1] +
0 = Non-illuminated +
1 = Illuminated
0x051eInitialAFPointAIServoAFint32s0 = Auto +
1 = Initial AF point selected +
2 = Manual AF point
0x060fMirrorLockupint32s(value of 2 not used by some models) +
0 = Disable +
1 = Enable +
2 = Enable: Down with Set
0x0610ContinuousShootingSpeed +
ContinuousShootingSpeed +
ContinuousShootingSpeed
int32s[6]
int32s[5]
int32s[3]
[Value 0] +
0 = Disable +
1 = Enable +
[Value 0] +
0 = Disable +
1 = Enable
0x0611ContinuousShotLimitint32s[2][Value 0] +
0 = Disable +
1 = Enable
0x0612RestrictDriveModes +
RestrictDriveModes
int32s
int32s[2]
[Value 0] +
0 = Disable +
1 = Enable
0x0701Shutter-AELock +
AFAndMeteringButtons +
ShutterButtonAFOnButton
int32s
int32s
int32s
(500D, 550D, 600D, 1000D and 1100D) +
0 = AF/AE lock +
1 = AE lock/AF +
2 = AF/AF lock, No AE lock +
3 = AE/AF, No AE lock +
(250D) +
'0 0' = AF/AE lock +
'1 0' = AE lock/AF +
'2 0' = AF/AF lock, No AE lock +
'3 0' = AE/AF, No AE lock +
(60D) +
0 = Metering start +
1 = Metering + AF start +
2 = AE lock +
3 = AF stop +
4 = No function +
(other models) +
0 = Metering + AF start +
1 = Metering + AF start/AF stop +
2 = Metering start/Meter + AF start +
3 = AE lock/Metering + AF start +
4 = Metering + AF start/disable
0x0702AFOnAELockButtonSwitchint32s0 = Disable +
1 = Enable
0x0703QuickControlDialInMeterint32s0 = Exposure comp/Aperture +
1 = AF point selection +
2 = ISO speed +
3 = AF point selection swapped with Exposure comp +
4 = ISO speed swapped with Exposure comp
0x0704SetButtonWhenShootingint32s(40D, 50D and 5DmkII; value of 5 is new for 50D, and 6 is new for 5DmkII) +
0 = Normal (disabled) +
1 = Image quality +
2 = Picture style +
3 = Menu display +
4 = Image playback +
5 = Quick control screen +
6 = Record movie (Live View)
+(60D) +
0 = Normal (disabled) +
1 = Image quality +
2 = Picture style +
3 = White balance +
4 = Flash exposure compensation +
5 = Viewfinder leveling gauge
+(450D, 550D and 600D; value of 5 is new for 550D) +
0 = Normal (disabled) +
1 = Image quality +
2 = Flash exposure compensation +
3 = LCD monitor On/Off +
4 = Menu display +
5 = ISO speed
+(1100D) +
0 = Normal (disabled) +
1 = Image quality +
2 = Flash exposure compensation +
3 = LCD monitor On/Off +
4 = Menu display +
5 = Depth-of-field preview
+(1000D) +
0 = LCD monitor On/Off +
1 = Image quality +
2 = Flash exposure compensation +
3 = Menu display +
4 = Disabled +
(500D)
+
0 = Quick control screen +
1 = Image quality +
2 = Flash exposure compensation +
3 = LCD monitor On/Off +
4 = Menu display +
5 = Disabled
+(250D) +
(1DmkIII and 1DmkIV)
+
0 = Normal (disabled) +
1 = White balance +
2 = Image size +
3 = ISO speed +
4 = Picture style +
5 = Record func. + media/folder +
6 = Menu display +
7 = Image playback
+
0x0705ManualTvint32s0 = Tv=Main/Av=Control +
1 = Tv=Control/Av=Main
0x0706DialDirectionTvAvint32s0 = Normal +
1 = Reversed
0x0707AvSettingWithoutLensint32s0 = Disable +
1 = Enable
0x0708WBMediaImageSizeSettingint32s0 = Rear LCD panel +
1 = LCD monitor +
2 = Off (disable button)
0x0709LockMicrophoneButtonint32s[Value 0] +
0 = Protect (hold:record memo) +
1 = Record memo (protect:disable) +
2 = Play memo (hold:record memo) +
3 = Rating (protect/memo:disable)
0x070aButtonFunctionControlOffint32s0 = Normal (enable) +
1 = Disable main, Control, Multi-control
0x070bAssignFuncButtonint32s0 = LCD brightness +
1 = Image quality +
2 = Exposure comp./AEB setting +
3 = Image jump with main dial +
4 = Live view function settings
0x070cCustomControlsint32s 
0x070dStartMovieShootingint32s0 = Default (from LV) +
1 = Quick start (FEL button)
0x070eFlashButtonFunctionint32s0 = Raise built-in flash +
1 = ISO speed
0x070fMultiFunctionLockint32s[Value 0] +
0 = Off +
1 = On +
2 = On (quick control dial) +
3 = On (main dial and quick control dial) +
[Value 1] +
Bit 0 = Main dial +
Bit 1 = Quick control dial +
Bit 2 = Multi-controller
0x0710TrashButtonFunctionint32s0 = Normal (set center AF point) +
1 = Depth-of-field preview
0x0711ShutterReleaseWithoutLensint32s0 = Disable +
1 = Enable
0x0712ControlRingRotationint32s0 = Normal +
1 = Reversed
0x0713FocusRingRotationint32s0 = Normal +
1 = Reversed
0x0714RFLensMFFocusRingSensitivityint32s0 = Varies With Rotation Speed +
1 = Linked To Rotation Angle
0x0715CustomizeDialsint32s 
0x080bFocusingScreenint32s(40D, 50D and 60D) +
0 = Ef-A +
1 = Ef-D +
2 = Ef-S +
(5D Mark II) +
0 = Eg-A +
1 = Eg-D +
2 = Eg-S +
(6D) +
0 = Eg-A II +
1 = Eg-D +
2 = Eg-S +
(7D Mark II) +
0 = Eh-A +
1 = Eh-S +
(1DX) +
0 = Ec-CV +
1 = Ec-A,B,D,H,I,L +
(1DmkIII, 1DSmkIII and 1DmkIV) +
0 = Ec-CIV +
1 = Ec-A,B,C,CII,CIII,D,H,I,L +
2 = Ec-S +
3 = Ec-N,R
0x080cTimerLength +
TimerLength
int32s[3]
int32s[4]
[Value 0] +
0 = Disable +
1 = Enable
0x080dShortReleaseTimeLagint32s0 = Disable +
1 = Enable
0x080eAddAspectRatioInfoint32s + +
0 = Off +
1 = 6:6 +
2 = 3:4 +
3 = 4:5
  4 = 6:7 +
5 = 10:12 +
6 = 5:7
+
0x080fAddOriginalDecisionDataint32s0 = Off +
1 = On
0x0810LiveViewExposureSimulationint32s0 = Disable (LCD auto adjust) +
1 = Enable (simulates exposure)
0x0811LCDDisplayAtPowerOnint32s0 = Display +
1 = Retain power off status
0x0812MemoAudioQualityint32s0 = High (48 kHz) +
1 = Low (8 kHz)
0x0813DefaultEraseOptionint32s0 = Cancel selected +
1 = Erase selected +
2 = Erase RAW selected +
3 = Erase non-RAW selected
0x0814RetractLensOnPowerOffint32s0 = Enable +
1 = Disable
0x0815AddIPTCInformationint32s0 = Disable +
1 = Enable
0x0816AudioCompressionint32s0 = Enable +
1 = Disable
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Dec 20, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/CanonRaw.html b/html/TagNames/CanonRaw.html new file mode 100644 index 0000000..021252f --- /dev/null +++ b/html/TagNames/CanonRaw.html @@ -0,0 +1,564 @@ + + + + +CanonRaw Tags + + + +

CanonRaw Tags

+

+These tags apply to CRW-format Canon RAW files and information in the APP0 +"CIFF" segment of JPEG images. When writing CanonRaw/CIFF information, the +length of the information is preserved (and the new information is truncated +or padded as required) unless Writable is resize. Currently, only +JpgFromRaw and ThumbnailImage are allowed to change size. See +canon_raw.html for a description of the Canon CRW +format.

+ +

CRW images also support the addition of a CanonVRD trailer, which in turn +supports XMP. This trailer is created automatically if necessary when +ExifTool is used to write XMP to a CRW image. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000NullRecordundef 
0x0001FreeBytesundef 
0x0032CanonColorInfo1no 
0x0805CanonFileDescription +
UserComment
string[32]
string[256]
 
0x080aCanonRawMakeModel---> CanonRaw MakeModel Tags
0x080bCanonFirmwareVersionstring[32] 
0x080cComponentVersionstring 
0x080dROMOperationModestring[8] 
0x0810OwnerNamestring[32] 
0x0815CanonImageTypestring[32] 
0x0816OriginalFileNamestring[32] 
0x0817ThumbnailFileNamestring[32] 
0x100aTargetImageTypeint16u0 = Real-world Subject +
1 = Written Document
0x1010ShutterReleaseMethodint16u0 = Single Shot +
2 = Continuous Shooting
0x1011ShutterReleaseTimingint16u0 = Priority on shutter +
1 = Priority on focus
0x1016ReleaseSettingint16u 
0x101cBaseISOint16u 
0x1028CanonFlashInfo?int16u[4] 
0x1029CanonFocalLength---> Canon FocalLength Tags
0x102aCanonShotInfo---> Canon ShotInfo Tags
0x102cCanonColorInfo2no 
0x102dCanonCameraSettings---> Canon CameraSettings Tags
0x1030WhiteSample---> CanonRaw WhiteSample Tags
0x1031SensorInfo---> Canon SensorInfo Tags
0x1033CustomFunctions10D +
CustomFunctionsD30 +
CustomFunctionsD60 +
CustomFunctionsUnknown
-
-
-
-
--> CanonCustom Functions10D Tags +
--> CanonCustom FunctionsD30 Tags +
--> CanonCustom FunctionsD30 Tags +
--> CanonCustom FuncsUnknown Tags
0x1038CanonAFInfo---> Canon AFInfo Tags
0x1093CanonFileInfo---> Canon FileInfo Tags
0x10a9ColorBalance---> Canon ColorBalance Tags
0x10aeColorTemperatureint16u 
0x10b4ColorSpaceint16u1 = sRGB +
2 = Adobe RGB +
65535 = Uncalibrated
0x10b5RawJpgInfo---> CanonRaw RawJpgInfo Tags
0x1803ImageFormat---> CanonRaw ImageFormat Tags
0x1804RecordIDint32u 
0x1806SelfTimerTimeint32u 
0x1807TargetDistanceSettingfloat 
0x180bSerialNumber +
UnknownNumber?
int32u
yes
 
0x180eTimeStamp---> CanonRaw TimeStamp Tags
0x1810ImageInfo---> CanonRaw ImageInfo Tags
0x1813FlashInfo---> CanonRaw FlashInfo Tags
0x1814MeasuredEVfloat(this is the Canon name for what could better be called MeasuredLV, and +should be close to the calculated LightValue for a proper exposure with most +models)
0x1817FileNumberint32u 
0x1818ExposureInfo---> CanonRaw ExposureInfo Tags
0x1834CanonModelIDint32u--> Canon CanonModelID Values +
(this is the complete list of model ID numbers, but note that many of these +models do not produce CRW images)
0x1835DecoderTable---> CanonRaw DecoderTable Tags
0x183bSerialNumberFormatint32u0x90000000 = Format 1 +
0xa0000000 = Format 2
0x2005RawDatano 
0x2007JpgFromRawresize^ 
0x2008ThumbnailImageresize^ 
0x2804ImageDescription---> CanonRaw Tags
0x2807CameraObject---> CanonRaw Tags
0x3002ShootingRecord---> CanonRaw Tags
0x3003MeasuredInfo---> CanonRaw Tags
0x3004CameraSpecification---> CanonRaw Tags
0x300aImageProps---> CanonRaw Tags
0x300bExifInformation---> CanonRaw Tags
+ +

CanonRaw MakeModel Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makestring[6] 
6Modelstring 
+ +

CanonRaw WhiteSample Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1WhiteSampleWidthno 
2WhiteSampleHeightno 
3WhiteSampleLeftBorderno 
4WhiteSampleTopBorderno 
5WhiteSampleBitsno 
+ +

CanonRaw RawJpgInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1RawJpgQualityint16u1 = Economy +
2 = Normal +
3 = Fine +
5 = Superfine
2RawJpgSizeint16u0 = Large +
1 = Medium +
2 = Small
3RawJpgWidthint16u 
4RawJpgHeightint16u 
+ +

CanonRaw ImageFormat Tags

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0FileFormatint32u0x10000 = JPEG (lossy) +
0x10002 = JPEG (non-quantization) +
0x10003 = JPEG (lossy/non-quantization toggled) +
0x20001 = CRW
1TargetCompressionRatiofloat 
+ +

CanonRaw TimeStamp Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0DateTimeOriginalint32u 
1TimeZoneCodeint32s 
2TimeZoneInfoint32u(set to 0x80000000 if TimeZoneCode is valid)
+ +

CanonRaw ImageInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0ImageWidthno 
1ImageHeightno 
2PixelAspectRationo 
3Rotationint32s 
4ComponentBitDepthno 
5ColorBitDepthno 
6ColorBWno 
+ +

CanonRaw FlashInfo Tags

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0FlashGuideNumberfloat 
1FlashThresholdfloat 
+ +

CanonRaw ExposureInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0ExposureCompensationfloat 
1ShutterSpeedValuefloat 
2ApertureValuefloat 
+ +

CanonRaw DecoderTable Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0DecoderTableNumberno 
2CompressedDataOffsetno 
3CompressedDataLengthno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Nov 28, 2019 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/CanonVRD.html b/html/TagNames/CanonVRD.html new file mode 100644 index 0000000..da26a3d --- /dev/null +++ b/html/TagNames/CanonVRD.html @@ -0,0 +1,2042 @@ + + + + +CanonVRD Tags + + + +

CanonVRD Tags

+

Canon Digital Photo Professional writes VRD (Recipe Data) information as a +trailer record to JPEG, TIFF, CRW and CR2 images, or as stand-alone VRD or +DR4 files. The tags listed below represent information found in these +records. The complete VRD/DR4 data record may be accessed as a block using +the Extra 'CanonVRD' or 'CanonDR4' tag, but this tag is not extracted or +copied unless specified explicitly.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0xffff00f4EditData---> CanonVRD Edit Tags
0xffff00f5IHLData---> CanonVRD IHL Tags
0xffff00f6XMPundef!--> XMP Tags
0xffff00f7Edit4Data---> CanonVRD Edit4 Tags
+ +

CanonVRD Edit Tags

+

Canon VRD edit information.

+
+
+ + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0VRD1---> CanonVRD Ver1 Tags
1VRDStampTool---> CanonVRD StampTool Tags
2VRD2---> CanonVRD Ver2 Tags
+ +

CanonVRD Ver1 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
2VRDVersionno 
6WBAdjRGGBLevelsint16u[4] 
24WhiteBalanceAdjint16u + +
0 = Auto +
1 = Daylight +
2 = Cloudy +
3 = Tungsten +
4 = Fluorescent
  5 = Flash +
8 = Shade +
9 = Kelvin +
30 = Manual (Click) +
31 = Shot Settings
+
26WBAdjColorTempint16u 
36WBFineTuneActiveint16u + +
0 = No  1 = Yes
+
40WBFineTuneSaturationint16u 
44WBFineTuneToneint16u 
46RawColorAdjint16u0 = Shot Settings +
1 = Faithful +
2 = Custom
48RawCustomSaturationint32s 
52RawCustomToneint32s 
56RawBrightnessAdjint32s 
60ToneCurvePropertyint16u + +
0 = Shot Settings +
1 = Linear +
2 = Custom 1 +
3 = Custom 2
  4 = Custom 3 +
5 = Custom 4 +
6 = Custom 5
+
122DynamicRangeMinint16u 
124DynamicRangeMaxint16u 
272ToneCurveActiveint16u + +
0 = No  1 = Yes
+
275ToneCurveModeint8u0 = RGB +
1 = Luminance
276BrightnessAdjint8s 
277ContrastAdjint8s 
278SaturationAdjint16s 
286ColorToneAdjint32s(in degrees, so -1 is the same as 359)
294LuminanceCurvePointsint16u[21] 
336LuminanceCurveLimitsint16u[4](4 numbers: input and output highlight and shadow points)
345ToneCurveInterpolationint8u0 = Curve +
1 = Straight
352RedCurvePointsint16u[21] 
394RedCurveLimitsint16u[4] 
410GreenCurvePointsint16u[21] 
452GreenCurveLimitsint16u[4] 
468BlueCurvePointsint16u[21] 
510BlueCurveLimitsint16u[4] 
526RGBCurvePointsint16u[21] 
568RGBCurveLimitsint16u[4] 
580CropActiveint16u + +
0 = No  1 = Yes
+
582CropLeftint16u(crop coordinates in original unrotated image)
584CropTopint16u 
586CropWidthint16u 
588CropHeightint16u 
602SharpnessAdjint16u 
608CropAspectRatioint16u +
0 = Free +
1 = 3:2 +
2 = 2:3 +
3 = 4:3 +
4 = 3:4 +
5 = A-size Landscape +
6 = A-size Portrait +
7 = Letter-size Landscape +
8 = Letter-size Portrait +
9 = 4:5 +
10 = 5:4 +
11 = 1:1 +
12 = Circle +
65535 = Custom
+
610ConstrainedCropWidthfloat 
614ConstrainedCropHeightfloat 
618CheckMarkint16u0 = Clear +
1 = 1 +
2 = 2 +
3 = 3
622Rotationint16u0 = 0 +
1 = 90 +
2 = 180 +
3 = 270
624WorkColorSpaceint16u0 = sRGB +
1 = Adobe RGB +
2 = Wide Gamut RGB +
3 = Apple RGB +
4 = ColorMatch RGB
+ +

CanonVRD StampTool Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0StampToolCountno 
+ +

CanonVRD Ver2 Tags

+

Tags added in DPP version 2.0 and later.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
2PictureStyleint16s + +
0 = Standard +
1 = Portrait +
2 = Landscape +
3 = Neutral
  4 = Faithful +
5 = Monochrome +
6 = Unknown? +
7 = Custom
+
3IsCustomPictureStyleint16s + +
0 = No  1 = Yes
+
13StandardRawColorToneint16s 
14StandardRawSaturationint16s 
15StandardRawContrastint16s 
16StandardRawLinearint16s + +
0 = No  1 = Yes
+
17StandardRawSharpnessint16s 
18StandardRawHighlightPointint16s 
19StandardRawShadowPointint16s 
20StandardOutputHighlightPointint16s 
21StandardOutputShadowPointint16s 
22PortraitRawColorToneint16s 
23PortraitRawSaturationint16s 
24PortraitRawContrastint16s 
25PortraitRawLinearint16s + +
0 = No  1 = Yes
+
26PortraitRawSharpnessint16s 
27PortraitRawHighlightPointint16s 
28PortraitRawShadowPointint16s 
29PortraitOutputHighlightPointint16s 
30PortraitOutputShadowPointint16s 
31LandscapeRawColorToneint16s 
32LandscapeRawSaturationint16s 
33LandscapeRawContrastint16s 
34LandscapeRawLinearint16s + +
0 = No  1 = Yes
+
35LandscapeRawSharpnessint16s 
36LandscapeRawHighlightPointint16s 
37LandscapeRawShadowPointint16s 
38LandscapeOutputHighlightPointint16s 
39LandscapeOutputShadowPointint16s 
40NeutralRawColorToneint16s 
41NeutralRawSaturationint16s 
42NeutralRawContrastint16s 
43NeutralRawLinearint16s + +
0 = No  1 = Yes
+
44NeutralRawSharpnessint16s 
45NeutralRawHighlightPointint16s 
46NeutralRawShadowPointint16s 
47NeutralOutputHighlightPointint16s 
48NeutralOutputShadowPointint16s 
49FaithfulRawColorToneint16s 
50FaithfulRawSaturationint16s 
51FaithfulRawContrastint16s 
52FaithfulRawLinearint16s + +
0 = No  1 = Yes
+
53FaithfulRawSharpnessint16s 
54FaithfulRawHighlightPointint16s 
55FaithfulRawShadowPointint16s 
56FaithfulOutputHighlightPointint16s 
57FaithfulOutputShadowPointint16s 
58MonochromeFilterEffectint16s-2 = None +
-1 = Yellow +
0 = Orange +
1 = Red +
2 = Green
59MonochromeToningEffectint16s-2 = None +
-1 = Sepia +
0 = Blue +
1 = Purple +
2 = Green
60MonochromeContrastint16s 
61MonochromeLinearint16s + +
0 = No  1 = Yes
+
62MonochromeSharpnessint16s 
63MonochromeRawHighlightPointint16s 
64MonochromeRawShadowPointint16s 
65MonochromeOutputHighlightPointint16s 
66MonochromeOutputShadowPointint16s 
69UnknownContrast?int16s 
70UnknownLinear?int16s + +
0 = No  1 = Yes
+
71UnknownSharpness?int16s 
72UnknownRawHighlightPoint?int16s 
73UnknownRawShadowPoint?int16s 
74UnknownOutputHighlightPoint?int16s 
75UnknownOutputShadowPoint?int16s 
76CustomColorToneint16s 
77CustomSaturationint16s 
78CustomContrastint16s 
79CustomLinearint16s + +
0 = No  1 = Yes
+
80CustomSharpnessint16s 
81CustomRawHighlightPointint16s 
82CustomRawShadowPointint16s 
83CustomOutputHighlightPointint16s 
84CustomOutputShadowPointint16s 
88CustomPictureStyleDatano(variable-length data structure)
94ChrominanceNoiseReductionint16s(VRDVersion prior to 3.3.0) +
0 = Off +
58 = Low +
100 = High +
(VRDVersion 3.3.0 or later)
+ + + +
0x0 = 0 +
0x10 = 1 +
0x21 = 2 +
0x32 = 3 +
0x42 = 4 +
0x53 = 5
  0x64 = 6 +
0x74 = 7 +
0x85 = 8 +
0x96 = 9 +
0xa6 = 10 +
0xa7 = 11
  0xa8 = 12 +
0xa9 = 13 +
0xaa = 14 +
0xab = 15 +
0xac = 16 +
0xad = 17
  0xae = 18 +
0xaf = 19 +
0xb0 = 20
+
95LuminanceNoiseReductionint16s(VRDVersion prior to 3.3.0) +
0 = Off +
65 = Low +
100 = High +
(VRDVersion 3.3.0 or later)
+ + + +
0x0 = 0 +
0x41 = 1 +
0x64 = 2 +
0x6e = 3 +
0x78 = 4 +
0x82 = 5
  0x8c = 6 +
0x96 = 7 +
0xa0 = 8 +
0xaa = 9 +
0xb4 = 10 +
0xb5 = 11
  0xb6 = 12 +
0xb7 = 13 +
0xb8 = 14 +
0xb9 = 15 +
0xba = 16 +
0xbb = 17
  0xbc = 18 +
0xbd = 19 +
0xbe = 20
+
96ChrominanceNR_TIFF_JPEGint16s(VRDVersion prior to 3.3.0) +
0 = Off +
33 = Low +
100 = High +
(VRDVersion 3.3.0 or later)
+ + + +
0x0 = 0 +
0x10 = 1 +
0x21 = 2 +
0x32 = 3 +
0x42 = 4 +
0x53 = 5
  0x64 = 6 +
0x74 = 7 +
0x85 = 8 +
0x96 = 9 +
0xa6 = 10 +
0xa7 = 11
  0xa8 = 12 +
0xa9 = 13 +
0xaa = 14 +
0xab = 15 +
0xac = 16 +
0xad = 17
  0xae = 18 +
0xaf = 19 +
0xb0 = 20
+
98ChromaticAberrationOnint16s + +
0 = No  1 = Yes
+
99DistortionCorrectionOnint16s + +
0 = No  1 = Yes
+
100PeripheralIlluminationOnint16s + +
0 = No  1 = Yes
+
101ColorBlurint16s + +
0 = No  1 = Yes
+
102ChromaticAberrationint16s 
103DistortionCorrectionint16s 
104PeripheralIlluminationint16s 
105AberrationCorrectionDistanceint16s(100% = infinity)
106ChromaticAberrationRedint16s 
107ChromaticAberrationBlueint16s 
109LuminanceNR_TIFF_JPEGint16s(val = raw / 10)
110AutoLightingOptimizerOnint16s + +
0 = No  1 = Yes
+
111AutoLightingOptimizerint16s100 = Low +
200 = Standard +
300 = Strong +
32767 = n/a
117StandardRawHighlightint16s 
118PortraitRawHighlightint16s 
119LandscapeRawHighlightint16s 
120NeutralRawHighlightint16s 
121FaithfulRawHighlightint16s 
122MonochromeRawHighlightint16s 
123UnknownRawHighlight?int16s 
124CustomRawHighlightint16s 
126StandardRawShadowint16s 
127PortraitRawShadowint16s 
128LandscapeRawShadowint16s 
129NeutralRawShadowint16s 
130FaithfulRawShadowint16s 
131MonochromeRawShadowint16s 
132UnknownRawShadow?int16s 
133CustomRawShadowint16s 
139AngleAdjint32s 
142CheckMark2int16u + +
0 = Clear +
1 = 1 +
2 = 2
  3 = 3 +
4 = 4 +
5 = 5
+
144UnsharpMaskint16s0 = Off +
1 = On
146StandardUnsharpMaskStrengthint16s 
148StandardUnsharpMaskFinenessint16s 
150StandardUnsharpMaskThresholdint16s 
152PortraitUnsharpMaskStrengthint16s 
154PortraitUnsharpMaskFinenessint16s 
156PortraitUnsharpMaskThresholdint16s 
158LandscapeUnsharpMaskStrengthint16s 
160LandscapeUnsharpMaskFinenessint16s 
162LandscapeUnsharpMaskThresholdint16s 
164NeutraUnsharpMaskStrengthint16s 
166NeutralUnsharpMaskFinenessint16s 
168NeutralUnsharpMaskThresholdint16s 
170FaithfulUnsharpMaskStrengthint16s 
172FaithfulUnsharpMaskFinenessint16s 
174FaithfulUnsharpMaskThresholdint16s 
176MonochromeUnsharpMaskStrengthint16s 
178MonochromeUnsharpMaskFinenessint16s 
180MonochromeUnsharpMaskThresholdint16s 
182CustomUnsharpMaskStrengthint16s 
184CustomUnsharpMaskFinenessint16s 
186CustomUnsharpMaskThresholdint16s 
188CustomDefaultUnsharpStrengthint16s 
190CustomDefaultUnsharpFinenessint16s 
192CustomDefaultUnsharpThresholdint16s 
214CropCircleActiveint16s + +
0 = No  1 = Yes
+
215CropCircleXint16s 
216CropCircleYint16s 
217CropCircleRadiusint16s 
220DLOOnint16s + +
0 = No  1 = Yes
+
221DLOSettingint16s 
222DLOShootingDistanceint16s(100% = infinity)
223DLODataLengthno 
224DLOInfo---> CanonVRD DLOInfo Tags
225CameraRawColorToneint16s 
226CameraRawSaturationint16s 
227CameraRawContrastint16s 
228CameraRawLinearint16s + +
0 = No  1 = Yes
+
229CameraRawSharpnessint16s 
230CameraRawHighlightPointint16s 
231CameraRawShadowPointint16s 
232CameraRawOutputHighlightPointint16s 
233CameraRawOutputShadowPointint16s 
+ +

CanonVRD DLOInfo Tags

+

Tags added when DLO (Digital Lens Optimizer) is on.

+
+
+ + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
4DLOSettingAppliedint16s 
5DLOVersionstring[10] 
10DLODatano(variable-length Digital Lens Optimizer data, stored in JPEG-like format)
+ +

CanonVRD IHL Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001IHL_EXIF +
IHL_EXIF?
-
no
--> EXIF Tags +
(extracted as a block if the Unknown option is used, or processed as the +first sub-document with the ExtractEmbedded option)
0x0003ThumbnailImageno 
0x0004PreviewImageno 
0x0005RawCodecVersionno 
0x0006CRCDevelParams?no 
+ +

CanonVRD Edit4 Tags

+

Canon DPP version 4 edit information.

+
+
+ + + + + + + + +
IndexTag NameWritableValues / Notes
0DR4---> CanonVRD DR4 Tags
+ +

CanonVRD DR4 Tags

+

Tags written by Canon DPP version 4 in CanonVRD trailers and DR4 files. Each +tag has three associated flag words which are stored with the directory +entry, some of which are extracted as a separate tag, indicated in the table +below by a decimal appended to the tag ID (.0, .1 or .2).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'header'DR4Header---> CanonVRD DR4Header Tags
0x10002Rotationyes 
0x10003AngleAdjyes 
0x10021CustomPictureStyleyes 
0x10101CheckMarkyes + +
0 = Clear +
1 = 1 +
2 = 2
  3 = 3 +
4 = 4 +
5 = 5
+
0x10200WorkColorSpaceyes1 = sRGB +
2 = Adobe RGB +
3 = Wide Gamut RGB +
4 = Apple RGB +
5 = ColorMatch RGB
0x20001RawBrightnessAdjyes 
0x20101WhiteBalanceAdjyes + +
-1 = Manual (Click) +
0 = Auto +
1 = Daylight +
2 = Cloudy +
3 = Tungsten
  4 = Fluorescent +
5 = Flash +
8 = Shade +
9 = Kelvin +
255 = Shot Settings
+
0x20102WBAdjColorTempyes 
0x20105WBAdjMagentaGreenyes 
0x20106WBAdjBlueAmberyes 
0x20125WBAdjRGGBLevelsyes 
0x20200GammaLinearyes + +
0 = No  1 = Yes
+
0x20301PictureStyleyes + +
0x81 = Standard +
0x82 = Portrait +
0x83 = Landscape +
0x84 = Neutral +
0x85 = Faithful
  0x86 = Monochrome +
0x87 = Auto +
0x88 = Fine Detail +
0xf0 = Shot Settings +
0xff = Custom
+
0x20303ContrastAdjyes 
0x20304ColorToneAdjyes 
0x20305ColorSaturationAdjyes 
0x20306MonochromeToningEffectyes0 = None +
1 = Sepia +
2 = Blue +
3 = Purple +
4 = Green
0x20307MonochromeFilterEffectyes0 = None +
1 = Yellow +
2 = Orange +
3 = Red +
4 = Green
0x20308UnsharpMaskStrengthyes 
0x20309UnsharpMaskFinenessyes 
0x2030aUnsharpMaskThresholdyes 
0x2030bShadowAdjyes 
0x2030cHighlightAdjyes 
0x20310SharpnessAdjyes0 = Sharpness +
1 = Unsharp Mask
0x20310.0SharpnessAdjOnyes + +
0 = No  1 = Yes
+
0x20311SharpnessStrengthyes 
0x20400ToneCurve---> CanonVRD ToneCurve Tags
0x20400.1ToneCurveOriginalyes + +
0 = No  1 = Yes
+
0x20410ToneCurveBrightnessyes 
0x20411ToneCurveContrastyes 
0x20500AutoLightingOptimizeryes0 = Low +
1 = Standard +
2 = Strong
0x20500.0AutoLightingOptimizerOnyes(ignored if gamma is linear) + +
0 = No  1 = Yes
+
0x20600LuminanceNoiseReductionyes 
0x20601ChrominanceNoiseReductionyes 
0x20670ColorMoireReductionyes 
0x20670.0ColorMoireReductionOnyes + +
0 = No  1 = Yes
+
0x20701ShootingDistanceyes(100% = infinity)
0x20702PeripheralIlluminationyes 
0x20702.0PeripheralIlluminationOnyes + +
0 = No  1 = Yes
+
0x20703ChromaticAberrationyes 
0x20703.0ChromaticAberrationOnyes + +
0 = No  1 = Yes
+
0x20704ColorBlurOnyes + +
0 = No  1 = Yes
+
0x20705DistortionCorrectionyes 
0x20705.0DistortionCorrectionOnyes + +
0 = No  1 = Yes
+
0x20706DLOSettingyes 
0x20706.0DLOOnyes + +
0 = No  1 = Yes
+
0x20707ChromaticAberrationRedyes 
0x20708ChromaticAberrationBlueyes 
0x20709DistortionEffectyes0 = Shot Settings +
1 = Emphasize Linearity +
2 = Emphasize Distance +
3 = Emphasize Periphery +
4 = Emphasize Center
0x2070bDiffractionCorrectionOnyes + +
0 = No  1 = Yes
+
0x20900ColorHueyes 
0x20901SaturationAdjyes 
0x20910RedHSLyes 
0x20911OrangeHSLyes 
0x20912YellowHSLyes 
0x20913GreenHSLyes 
0x20914AquaHSLyes 
0x20915BlueHSLyes 
0x20916PurpleHSLyes 
0x20917MagentaHSLyes 
0x20a00GammaInfo---> CanonVRD GammaInfo Tags
0x30101CropAspectRatioyes + + +
0 = Free +
1 = Custom +
2 = 1:1 +
3 = 3:2
  4 = 2:3 +
5 = 4:3 +
6 = 3:4 +
7 = 5:4
  8 = 4:5 +
9 = 16:9 +
10 = 9:16
+
0x30102CropAspectRatioCustomyes 
0xf0100CropInfo---> CanonVRD CropInfo Tags
0xf0500CustomPictureStyleDatayes 
0xf0510StampInfo---> CanonVRD StampInfo Tags
0xf0511DustInfo---> CanonVRD DustInfo Tags
0xf0512LensFocalLengthyes 
+ +

CanonVRD DR4Header Tags

+
+
+ + + + + + + + +
Index4Tag NameWritableValues / Notes
3DR4CameraModelint32u--> Canon CanonModelID Values
+ +

CanonVRD ToneCurve Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0ToneCurveColorSpaceint32u0 = RGB +
1 = Luminance
1ToneCurveShapeint32u0 = Curve +
1 = Straight
3ToneCurveInputRangeint32u[2](255 max)
5ToneCurveOutputRangeint32u[2](255 max)
7RGBCurvePointsint32u[21] 
10ToneCurveXint32u 
11ToneCurveYint32u 
45RedCurvePointsint32u[21] 
83GreenCurvePointsint32u[21] 
121BlueCurvePointsint32u[21] 
+ +

CanonVRD GammaInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index8Tag NameWritableValues / Notes
2GammaContrastdouble 
3GammaColorTonedouble 
4GammaSaturationdouble 
5GammaUnsharpMaskStrengthdouble 
6GammaUnsharpMaskFinenessdouble 
7GammaUnsharpMaskThresholddouble 
8GammaSharpnessStrengthdouble 
9GammaShadowdouble 
10GammaHighlightdouble 
12GammaBlackPointdouble 
13GammaWhitePointdouble 
14GammaMidPointdouble 
15GammaCurveOutputRangedouble[2](16383 max)
+ +

CanonVRD CropInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0CropActiveint32s + +
0 = No  1 = Yes
+
1CropRotatedOriginalWidthint32s 
2CropRotatedOriginalHeightint32s 
3CropXint32s 
4CropYint32s 
5CropWidthint32s 
6CropHeightint32s 
8CropRotationdouble 
10CropOriginalWidthint32s 
11CropOriginalHeightint32s 
+ +

CanonVRD StampInfo Tags

+
+
+ + + + + + + + +
Index4Tag NameWritableValues / Notes
2StampToolCountno 
+ +

CanonVRD DustInfo Tags

+
+
+ + + + + + + + +
Index4Tag NameWritableValues / Notes
2DustDeleteAppliedno + +
0 = No  1 = Yes
+
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Mar 14, 2018 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Casio.html b/html/TagNames/Casio.html new file mode 100644 index 0000000..1b2134f --- /dev/null +++ b/html/TagNames/Casio.html @@ -0,0 +1,1607 @@ + + + + +Casio Tags + + + +

Casio Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001RecordingModeint16u + +
1 = Single Shutter +
2 = Panorama +
3 = Night Scene +
4 = Portrait +
5 = Landscape
  7 = Panorama +
10 = Night Scene +
15 = Portrait +
16 = Landscape
+
0x0002Qualityint16u1 = Economy +
2 = Normal +
3 = Fine
0x0003FocusModeint16u2 = Macro +
3 = Auto +
4 = Manual +
5 = Infinity +
7 = Spot AF
0x0004FlashModeint16u1 = Auto +
2 = On +
3 = Off +
4 = Off +
5 = Red-eye Reduction +
1 = Auto +
2 = On +
3 = Off +
4 = Red-eye Reduction
0x0005FlashIntensityint16u11 = Weak +
12 = Low +
13 = Normal +
14 = High +
15 = Strong
0x0006ObjectDistanceint32u 
0x0007WhiteBalanceint16u + +
1 = Auto +
2 = Tungsten +
3 = Daylight
  4 = Fluorescent +
5 = Shade +
129 = Manual
+
0x000aDigitalZoomint32u + +
0x10000 = Off +
0x10001 = 2x +
0x19999 = 1.6x
  0x20000 = 2x +
0x33333 = 3.2x +
0x40000 = 4x
+
0x000bSharpnessint16u + +
0 = Normal +
1 = Soft +
2 = Hard
  16 = Normal +
17 = +1 +
18 = -1
+
0x000cContrastint16u + +
0 = Normal +
1 = Low +
2 = High
  16 = Normal +
17 = +1 +
18 = -1
+
0x000dSaturationint16u + +
0 = Normal +
1 = Low +
2 = High
  16 = Normal +
17 = +1 +
18 = -1
+
0x0014ISOint16u 
0x0015FirmwareDatestring[18] 
0x0016Enhancementint16u1 = Off +
2 = Red +
3 = Green +
4 = Blue +
5 = Flesh Tones
0x0017ColorFilterint16u + +
1 = Off +
2 = Black & White +
3 = Sepia +
4 = Red +
5 = Green
  6 = Blue +
7 = Yellow +
8 = Pink +
9 = Purple
+
0x0018AFPointint16u(may not be valid for all models) +
1 = Center +
2 = Upper Left +
3 = Upper Right +
4 = Near Left/Right of Center +
5 = Far Left/Right of Center +
6 = Far Left/Right of Center/Bottom +
7 = Top Near-left +
8 = Near Upper/Left +
9 = Top Near-right +
10 = Top Left +
11 = Top Center +
12 = Top Right +
13 = Center Left +
14 = Center Right +
15 = Bottom Left +
16 = Bottom Center +
17 = Bottom Right
+
0x0019FlashIntensityint16u1 = Normal +
2 = Weak +
3 = Strong
0x0e00PrintIM---> PrintIM Tags
+ +

Casio Type2 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0002PreviewImageSizeint16u[2] 
0x0003PreviewImageLengthint32u* 
0x0004PreviewImageStartint32u* 
0x0008QualityModeint16u0 = Economy +
1 = Normal +
2 = Fine
0x0009CasioImageSizeint16u + +
0 = 640x480 +
4 = 1600x1200 +
5 = 2048x1536 +
20 = 2288x1712
  21 = 2592x1944 +
22 = 2304x1728 +
36 = 3008x2008
+
0x000dFocusModeint16u0 = Normal +
1 = Macro
0x0014ISOint16u3 = 50 +
4 = 64 +
6 = 100 +
9 = 200
0x0019WhiteBalanceint16u + +
0 = Auto +
1 = Daylight +
2 = Shade
  3 = Tungsten +
4 = Fluorescent +
5 = Manual
+
0x001dFocalLengthrational64u 
0x001fSaturationint16u0 = Low +
1 = Normal +
2 = High
0x0020Contrastint16u0 = Low +
1 = Normal +
2 = High
0x0021Sharpnessint16u0 = Soft +
1 = Normal +
2 = Hard
0x0e00PrintIM---> PrintIM Tags
0x2000PreviewImageundef 
0x2001FirmwareDatestring[18] 
0x2011WhiteBalanceBiasint16u[2] 
0x2012WhiteBalanceint16u + +
0 = Manual +
1 = Daylight +
2 = Cloudy +
3 = Shade +
4 = Flash?
  6 = Fluorescent +
9 = Tungsten? +
10 = Tungsten +
12 = Flash
+
0x2021AFPointPositionint16u[4]~ 
0x2022ObjectDistanceint32u 
0x2034FlashDistanceint16u 
0x2076SpecialEffectModeint8u[3]'0 0 0' = Off +
'1 0 0' = Makeup +
'2 0 0' = Mist Removal +
'3 0 0' = Vivid Landscape
0x2089FaceInfo1 +
FaceInfo2 +
FaceInfoUnknown?
-
-
yes
--> Casio FaceInfo1 Tags +
--> Casio FaceInfo2 Tags
0x211cFacesDetectedint8u 
0x3000RecordModeint16u +
2 = Program AE +
3 = Shutter Priority +
4 = Aperture Priority +
5 = Manual +
6 = Best Shot +
17 = Movie +
19 = Movie (19) +
20 = YouTube Movie +
'2 0' = Program AE +
'3 0' = Shutter Priority +
'4 0' = Aperture Priority +
'5 0' = Manual +
'6 0' = Best Shot
+
0x3001ReleaseModeint16u1 = Normal +
3 = AE Bracketing +
11 = WB Bracketing +
13 = Contrast Bracketing +
19 = High Speed Burst
0x3002Qualityint16u1 = Economy +
2 = Normal +
3 = Fine
0x3003FocusModeint16u +
0 = Manual +
1 = Focus Lock +
2 = Macro +
3 = Single-Area Auto Focus +
5 = Infinity +
6 = Multi-Area Auto Focus +
8 = Super Macro
+
0x3006HometownCitystring 
0x3007BestShotModeint16u(EX-FC100) + +
0 = Off +
1 = Auto +
2 = Portrait +
3 = Scenery +
4 = Portrait with Scenery +
5 = Children +
6 = Sports +
7 = Pet +
8 = Flower +
9 = Natural Green +
10 = Autumn Leaves
  11 = Sundown +
12 = High Speed Night Scene +
13 = Night Scene Portrait +
14 = Fireworks +
15 = High Speed Anti Shake +
16 = Multi-motion Image +
17 = High Speed Best Selection +
18 = Move Out CS +
19 = Move In CS +
20 = Pre-record Movie +
21 = For YouTube
+(EX-FC150) + +
0 = Off +
1 = Auto +
2 = Expression CS +
3 = Baby CS +
4 = Child CS +
5 = Pet CS +
6 = Sports CS +
7 = Child High Speed Movie +
8 = Pet High Speed Movie +
9 = Sports High Speed Movie +
10 = Lag Correction +
11 = High Speed Lighting +
12 = High Speed Night Scene +
13 = High Speed Night Scene and Portrait +
14 = High Speed Anti Shake
  15 = High Speed Best Selection +
16 = Portrait +
17 = Scenery +
18 = Portrait With Scenery +
19 = Flower +
20 = Natural Green +
21 = Autumn Leaves +
22 = Sundown +
23 = Fireworks +
24 = Multi-motion Image +
25 = Move Out CS +
26 = Move In CS +
27 = Pre-record Movie +
28 = For YouTube
+(EX-FC200S) + +
0 = Off +
1 = Slow Motion Swing (behind) +
2 = Slow Motion Swing (front) +
3 = Self Slow Motion (behind) +
4 = Self Slow Motion (front) +
5 = Swing Burst +
6 = HDR +
7 = HDR Art +
8 = High Speed Night Scene +
9 = High Speed Night Scene and Portrait +
10 = High Speed Anti Shake +
11 = Multi SR Zoom +
12 = Blurred Background +
13 = Wide Shot +
14 = Slide Panorama +
15 = High Speed Best Selection +
16 = Lag Correction +
17 = High Speed CS +
18 = Child CS +
19 = Pet CS +
20 = Sports CS +
21 = Child High Speed Movie +
22 = Pet High Speed Movie
  23 = Sports High Speed Movie +
24 = Portrait +
25 = Scenery +
26 = Portrait with Scenery +
27 = Children +
28 = Sports +
29 = Candlelight Portrait +
30 = Party +
31 = Pet +
32 = Flower +
33 = Natural Green +
34 = Autumn Leaves +
35 = Soft Flowing Water +
36 = Splashing Water +
37 = Sundown +
38 = Fireworks +
39 = Food +
40 = Text +
41 = Collection +
42 = Auction +
43 = Pre-record Movie +
44 = For YouTube
+(EX-FH100) + +
0 = Off +
1 = Expression CS +
2 = Baby CS +
3 = Child CS +
4 = Pet CS +
5 = Sports CS +
6 = Child High Speed Movie +
7 = Pet High Speed Movie +
8 = Sports High Speed Movie +
9 = Lag Correction +
10 = High Speed Lighting +
11 = High Speed Night Scene +
12 = High Speed Night Scene and Portrait +
13 = High Speed Anti Shake
  14 = High Speed Best Selection +
15 = Portrait +
16 = Scenery +
17 = Portrait With Scenery +
18 = Flower +
19 = Natural Green +
20 = Autumn Leaves +
21 = Sundown +
22 = Fireworks +
23 = Multi-motion Image +
24 = Move Out CS +
25 = Move In CS +
26 = Pre-record Movie +
27 = For YouTube
+(EX-G1) + + +
0 = Off +
1 = Auto +
2 = Auto Best Shot +
3 = Dynamic Photo +
4 = Interval Snapshot +
5 = Interval Movie +
6 = Portrait +
7 = Scenery +
8 = Portrait with Scenery
  9 = Underwater +
10 = Beach +
11 = Snow +
12 = Children +
13 = Sports +
14 = Pet +
15 = Flower +
16 = Sundown +
17 = Night Scene
  18 = Night Scene Portrait +
19 = Fireworks +
20 = Food +
21 = For eBay +
22 = Multi-motion Image +
23 = Pre-record Movie +
24 = For YouTube +
25 = Voice Recording
+(EX-S10) + + +
0 = Off +
1 = Auto +
2 = Portrait +
3 = Scenery +
4 = Portrait with Scenery +
5 = Self-portrait (1 person) +
6 = Self-portrait (2 people) +
7 = Children +
8 = Sports +
9 = Candlelight Portrait +
10 = Party +
11 = Pet +
12 = Flower
  13 = Natural Green +
14 = Autumn Leaves +
15 = Soft Flowing Water +
16 = Splashing Water +
17 = Sundown +
18 = Night Scene +
19 = Night Scene Portrait +
20 = Fireworks +
21 = Food +
22 = Text +
23 = Collection +
24 = Auction +
25 = Backlight
  26 = Anti Shake +
27 = High Sensitivity +
28 = Underwater +
29 = Monochrome +
30 = Retro +
31 = Business Cards +
32 = White Board +
33 = Silent +
34 = Pre-record Movie +
35 = For YouTube +
36 = Voice Recording
+(EX-S880) + + +
0 = Off +
1 = Auto +
2 = Portrait +
3 = Scenery +
4 = Portrait with Scenery +
5 = Children +
6 = Sports +
7 = Candlelight Portrait +
8 = Party +
9 = Pet +
10 = Flower +
11 = Natural Green +
12 = Autumn Leaves +
13 = Soft Flowing Water
  14 = Splashing Water +
15 = Sundown +
16 = Night Scene +
17 = Night Scene Portrait +
18 = Fireworks +
19 = Food +
20 = Text +
21 = Collection +
22 = Auction +
23 = Backlight +
24 = Anti Shake +
25 = High Sensitivity +
26 = Monochrome +
27 = Retro
  28 = Twilight +
29 = Layout (2 images) +
30 = Layout (3 images) +
31 = Auto Framing +
32 = Old Photo +
33 = Business Cards +
34 = White Board +
35 = Silent +
36 = Short Movie +
37 = Past Movie +
38 = For YouTube +
39 = Voice Recording
+(EX-Z16) + + +
0 = Off +
1 = Auto +
2 = Portrait +
3 = Scenery +
4 = Portrait with Scenery +
5 = Children +
6 = Sports +
7 = Candlelight Portrait
  8 = Party +
9 = Pet +
10 = Flower +
11 = Soft Flowing Water +
12 = Sundown +
13 = Night Scene +
14 = Night Scene Portrait +
15 = Fireworks
  16 = Food +
17 = Text +
18 = For eBay +
19 = Backlight +
20 = Anti Shake +
21 = High Sensitivity +
22 = For YouTube +
23 = Voice Recording
+(EX-Z9) + + +
0 = Off +
1 = Auto +
2 = Movie +
3 = Portrait +
4 = Scenery +
5 = Children +
6 = Sports +
7 = Candlelight Portrait
  8 = Party +
9 = Pet +
10 = Flower +
11 = Soft Flowing Water +
12 = Sundown +
13 = Night Scene +
14 = Night Scene Portrait +
15 = Fireworks
  16 = Food +
17 = Text +
18 = Auction +
19 = Backlight +
20 = Anti Shake +
21 = High Sensitivity +
22 = For YouTube +
23 = Voice Recording
+(EX-Z80) + + +
0 = Off +
1 = Auto +
2 = Portrait +
3 = Scenery +
4 = Portrait with Scenery +
5 = Pet +
6 = Self-portrait (1 person) +
7 = Self-portrait (2 people) +
8 = Flower +
9 = Food +
10 = Fashion Accessories
  11 = Magazine +
12 = Monochrome +
13 = Retro +
14 = Cross Filter +
15 = Pastel +
16 = Night Scene +
17 = Night Scene Portrait +
18 = Party +
19 = Sports +
20 = Children +
21 = Sundown
  22 = Fireworks +
23 = Underwater +
24 = Backlight +
25 = High Sensitivity +
26 = Auction +
27 = White Board +
28 = Pre-record Movie +
29 = For YouTube +
30 = Voice Recording
+(EX-Z100 and EX-Z200) + + +
0 = Off +
1 = Auto +
2 = Auto Best Shot +
3 = Portrait +
4 = Scenery +
5 = Portrait with Scenery +
6 = Self-portrait (1 person) +
7 = Self-portrait (2 people) +
8 = Children +
9 = Sports +
10 = Candlelight Portrait +
11 = Party +
12 = Pet +
13 = Flower
  14 = Natural Green +
15 = Autumn Leaves +
16 = Soft Flowing Water +
17 = Splashing Water +
18 = Sundown +
19 = Night Scene +
20 = Night Scene Portrait +
21 = Fireworks +
22 = Food +
23 = Text +
24 = Collection +
25 = Auction +
26 = Backlight +
27 = Anti Shake
  28 = High Sensitivity +
29 = Underwater +
30 = Monochrome +
31 = Retro +
32 = Twilight +
33 = ID Photo +
34 = Business Cards +
35 = White Board +
36 = Silent +
37 = Pre-record Movie +
38 = For YouTube +
39 = Voice Recording
+(EX-Z750 JPEG images) + + +
0 = Off +
1 = Portrait +
2 = Scenery +
3 = Portrait with Scenery +
4 = Children +
5 = Sports +
6 = Candlelight Portrait +
7 = Party +
8 = Pet +
9 = Flower +
10 = Natural Green
  11 = Soft Flowing Water +
12 = Splashing Water +
13 = Sundown +
14 = Night Scene +
15 = Night Scene Portrait +
16 = Fireworks +
17 = Food +
18 = Text +
19 = Collection +
20 = Backlight +
21 = Anti Shake
  22 = Pastel +
23 = Illustration +
24 = Cross Filter +
25 = Monochrome +
26 = Retro +
27 = Twilight +
28 = Old Photo +
29 = ID Photo +
30 = Business Cards +
31 = White Board
+(EX-Z750 movies) + + +
0 = Off +
1 = Portrait +
2 = Scenery
  3 = Night Scene +
4 = Fireworks +
5 = Backlight
  6 = Silent
+(EX-Z850 JPEG images) + + +
0 = Off +
1 = Portrait +
2 = Scenery +
3 = Portrait with Scenery +
4 = Children +
5 = Sports +
6 = Candlelight Portrait +
7 = Party +
8 = Pet +
9 = Flower +
10 = Natural Green +
11 = Autumn Leaves
  12 = Soft Flowing Water +
13 = Splashing Water +
14 = Sundown +
15 = Night Scene +
16 = Night Scene Portrait +
17 = Fireworks +
18 = Food +
19 = Text +
20 = Collection +
21 = For eBay +
22 = Backlight +
23 = Anti Shake
  24 = High Sensitivity +
25 = Pastel +
26 = Illustration +
27 = Cross Filter +
28 = Monochrome +
29 = Retro +
30 = Twilight +
31 = ID Photo +
32 = Old Photo +
33 = Business Cards +
34 = White Board
+(EX-Z850 movies) + + +
0 = Off +
1 = Portrait +
2 = Scenery +
3 = Night Scene
  4 = Fireworks +
5 = Backlight +
6 = High Sensitivity +
7 = Silent
  8 = Short Movie +
9 = Past Movie
+(EX-Z1050) + + +
0 = Off +
1 = Auto +
2 = Movie +
3 = Portrait +
4 = Scenery +
5 = Portrait with Scenery +
6 = Children +
7 = Sports +
8 = Candlelight Portrait +
9 = Party +
10 = Pet +
11 = Flower +
12 = Natural Green
  13 = Autumn Leaves +
14 = Soft Flowing Water +
15 = Splashing Water +
16 = Sundown +
17 = Night Scene +
18 = Night Scene Portrait +
19 = Fireworks +
20 = Food +
21 = Text +
22 = Collection +
23 = For eBay +
24 = Backlight +
25 = Anti Shake
  26 = High Sensitivity +
27 = Underwater +
28 = Monochrome +
29 = Retro +
30 = Twilight +
31 = Layout (2 images) +
32 = Layout (3 images) +
33 = Auto Framing +
34 = ID Photo +
35 = Old Photo +
36 = Business Cards +
37 = White Board +
38 = Voice Recording
+(EX-Z1080) + + +
0 = Off +
1 = Auto +
2 = Movie +
3 = Portrait +
4 = Scenery +
5 = Portrait with Scenery +
6 = Children +
7 = Sports +
8 = Candlelight Portrait +
9 = Party +
10 = Pet +
11 = Flower +
12 = Natural Green +
13 = Autumn Leaves
  14 = Soft Flowing Water +
15 = Splashing Water +
16 = Sundown +
17 = Night Scene +
18 = Night Scene Portrait +
19 = Fireworks +
20 = Food +
21 = Text +
22 = Collection +
23 = For eBay +
24 = Backlight +
25 = Anti Shake +
26 = High Sensitivity +
27 = Underwater
  28 = Monochrome +
29 = Retro +
30 = Twilight +
31 = Layout (2 images) +
32 = Layout (3 images) +
33 = Auto Framing +
34 = ID Photo +
35 = Old Photo +
36 = Business Cards +
37 = White Board +
38 = Short Movie +
39 = Past Movie +
40 = For YouTube +
41 = Voice Recording
+(EX-Z1200 JPEG images) + + +
0 = Off +
1 = Portrait +
2 = Scenery +
3 = Portrait with Scenery +
4 = Children +
5 = Sports +
6 = Candlelight Portrait +
7 = Party +
8 = Pet +
9 = Flower +
10 = Natural Green +
11 = Autumn Leaves
  12 = Soft Flowing Water +
13 = Splashing Water +
14 = Sundown +
15 = Night Scene +
16 = Night Scene Portrait +
17 = Fireworks +
18 = Food +
19 = Text +
20 = Collection +
21 = Auction +
22 = Backlight +
23 = High Sensitivity
  24 = Underwater +
25 = Monochrome +
26 = Retro +
27 = Twilight +
28 = Layout (2 images) +
29 = Layout (3 images) +
30 = Auto Framing +
31 = ID Photo +
32 = Old Photo +
33 = Business Cards +
34 = White Board
+(EX-Z1200 movies) + + +
0 = Off +
1 = Portrait +
2 = Scenery +
3 = Night Scene
  4 = Fireworks +
5 = Backlight +
6 = High Sensitivity +
7 = Silent
  8 = Short Movie +
9 = Past Movie
+(EX-Z2000) + + +
0 = Off +
1 = Auto +
2 = Premium Auto +
3 = Dynamic Photo +
4 = Portrait +
5 = Scenery +
6 = Portrait with Scenery +
7 = Children +
8 = Sports +
9 = Candlelight Portrait +
10 = Party +
11 = Pet +
12 = Flower +
13 = Natural Green
  14 = Autumn Leaves +
15 = Soft Flowing Water +
16 = Splashing Water +
17 = Sundown +
18 = Night Scene +
19 = Night Scene Portrait +
20 = Fireworks +
21 = Food +
22 = Text +
23 = Collection +
24 = For eBay +
25 = Backlight +
26 = High Sensitivity +
27 = Oil Painting
  28 = Crayon +
29 = Water Color +
30 = Monochrome +
31 = Retro +
32 = Twilight +
33 = Multi-motion Image +
34 = ID Photo +
35 = Business Cards +
36 = White Board +
37 = Silent +
38 = Pre-record Movie +
39 = For YouTube +
40 = Voice Recording
+(EX-Z2300) + + +
0 = Off +
1 = Auto +
2 = Premium Auto +
3 = Dynamic Photo +
4 = Portrait +
5 = Scenery +
6 = Portrait with Scenery +
7 = Children +
8 = Sports +
9 = Candlelight Portrait +
10 = Party +
11 = Pet +
12 = Flower +
13 = Natural Green
  14 = Autumn Leaves +
15 = Soft Flowing Water +
16 = Splashing Water +
17 = Sundown +
18 = Night Scene +
19 = Night Scene Portrait +
20 = Fireworks +
21 = Food +
22 = Text +
23 = Collection +
24 = Auction +
25 = Backlight +
26 = High Sensitivity +
27 = Oil Painting
  28 = Crayon +
29 = Water Color +
30 = Monochrome +
31 = Retro +
32 = Twilight +
33 = Multi-motion Image +
34 = ID Photo +
35 = Business Cards +
36 = White Board +
37 = Silent +
38 = Pre-record Movie +
39 = For YouTube +
40 = Voice Recording
+(EX-Z3000) + + +
0 = Off +
1 = Portrait +
2 = Scenery
  3 = Portrait With Scenery +
4 = Children +
5 = Sports
  6 = Night Scene
+(EX-ZR100) + +
0 = Off +
1 = Child CS +
2 = Pet CS +
3 = Sports CS +
4 = Child High Speed Movie +
5 = Pet High Speed Movie +
6 = Sports High Speed Movie +
7 = Multi SR Zoom +
8 = Lag Correction +
9 = High Speed Night Scene +
10 = High Speed Night Scene and Portrait +
11 = High Speed Anti Shake +
12 = Portrait +
13 = Scenery +
14 = Portrait with Scenery +
15 = Children +
16 = Sports
  17 = Candlelight Portrait +
18 = Party +
19 = Pet +
20 = Flower +
21 = Natural Green +
22 = Autumn Leaves +
23 = Soft Flowing Water +
24 = Splashing Water +
25 = Sundown +
26 = Fireworks +
27 = Food +
28 = Text +
29 = Collection +
30 = For eBay +
31 = Pre-record Movie +
32 = For YouTube
+(EX-ZR200) + +
0 = Off +
1 = High Speed Night Scene +
2 = High Speed Night Scene and Portrait +
3 = High Speed Anti Shake +
4 = Blurred Background +
5 = Wide Shot +
6 = High Speed Best Selection +
7 = Lag Correction +
8 = Child CS +
9 = Pet CS +
10 = Sports CS +
11 = Child High Speed Movie +
12 = Pet High Speed Movie +
13 = Sports High Speed Movie +
14 = Portrait +
15 = Scenery +
16 = Portrait with Scenery +
17 = Children
  18 = Sports +
19 = Candlelight Portrait +
20 = Party +
21 = Pet +
22 = Flower +
23 = Natural Green +
24 = Autumn Leaves +
25 = Soft Flowing Water +
26 = Splashing Water +
27 = Sundown +
28 = Fireworks +
29 = Food +
30 = Text +
31 = Collection +
32 = Auction +
33 = Pre-record Movie +
34 = For YouTube
+(QV-4000) + + +
0 = Off +
1 = People
  2 = Scenery +
3 = Flower
  4 = Night Scene +
5 = Soft Focus
+(EX-ZR300) + +
1 = High Speed Night Shot +
2 = Blurred Background +
3 = Toy Camera +
4 = Soft Focus +
5 = Light Tone +
6 = Pop +
7 = Sepia +
8 = Monochrome +
9 = Miniature +
10 = Wide Shot +
11 = High Speed Best Selection +
12 = Lag Correction +
13 = High Speed Night Scene +
14 = High Speed Night Scene and Portrait +
15 = High Speed Anti Shake +
16 = Portrait +
17 = Scenery +
18 = Portrait with Scenery
  19 = Children +
20 = Sports +
21 = Candlelight Portrait +
22 = Party +
23 = Pet +
24 = Flower +
25 = Natural Green +
26 = Autumn Leaves +
27 = Soft Flowing Water +
28 = Splashing Water +
29 = Sundown +
30 = Fireworks +
31 = Food +
32 = Text +
33 = Collection +
34 = Auction +
35 = Prerecord (Movie) +
36 = For YouTube
+(other models not yet decoded)
0x3008AutoISOint16u1 = On +
2 = Off +
7 = On (high sensitivity) +
8 = On (anti-shake) +
10 = High Speed
0x3009AFModeint16u + +
0 = Off +
1 = Spot +
2 = Multi
  3 = Face Detection +
4 = Tracking +
5 = Intelligent
+
0x3011Sharpnessundef[2] 
0x3012Contrastundef[2] 
0x3013Saturationundef[2] 
0x3014ISOint16u 
0x3015ColorModeint16u0 = Off +
2 = Black & White +
3 = Sepia
0x3016Enhancementint16u0 = Off +
1 = Scenery +
3 = Green +
5 = Underwater +
9 = Flesh Tones
0x3017ColorFilterint16u + +
0 = Off +
1 = Blue +
3 = Green +
4 = Yellow
  5 = Red +
6 = Purple +
7 = Pink
+
0x301bArtModeint16u +
0 = Normal +
8 = Silent Movie +
39 = HDR +
45 = Premium Auto +
47 = Painting +
49 = Crayon Drawing +
51 = Panorama +
52 = Art HDR +
62 = High Speed Night Shot +
64 = Monochrome +
67 = Toy Camera +
68 = Pop Art +
69 = Light Tone
+
0x301cSequenceNumberint16u 
0x301dBracketSequenceint16u[2] 
0x3020ImageStabilizationint16u +
0 = Off +
1 = On +
2 = Best Shot +
3 = Movie Anti-Shake +
'0 0' = Off +
'0 1' = Off (1) +
'0 3' = CCD Shift +
'2 1' = High Sensitivity +
'2 3' = CCD Shift + High Sensitivity +
'16 0' = Slow Shutter +
'18 0' = Anti-Shake +
'20 0' = High Sensitivity
+
0x302aLightingModeint16u0 = Off +
1 = High Dynamic Range +
5 = Shadow Enhance Low +
6 = Shadow Enhance High
0x302bPortraitRefinerint16u0 = Off +
1 = +1 +
2 = +2
0x3030SpecialEffectLevelint16u 
0x3031SpecialEffectSettingint16u0 = Off +
1 = Makeup +
2 = Mist Removal +
3 = Vivid Landscape +
16 = Art Shot
0x3103DriveModeint16u + +
0 = Single Shot +
1 = Continuous Shooting +
2 = Continuous (2 fps) +
3 = Continuous (3 fps) +
4 = Continuous (4 fps) +
5 = Continuous (5 fps) +
6 = Continuous (6 fps) +
7 = Continuous (7 fps)
  10 = Continuous (10 fps) +
12 = Continuous (12 fps) +
15 = Continuous (15 fps) +
20 = Continuous (20 fps) +
30 = Continuous (30 fps) +
40 = Continuous (40 fps) +
60 = Continuous (60 fps) +
240 = Auto-N
+
0x310bArtModeParametersint8u[3] 
0x4001CaptureFrameRateint16u[n] 
0x4003VideoQualityint16u1 = Standard +
3 = HD (720p) +
4 = Full HD (1080p) +
5 = Low
+ +

Casio FaceInfo1 Tags

+

Face-detect tags extracted from models such as the EX-H5.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FacesDetectedint8u 
1FaceDetectFrameSizeint16u[2] 
13Face1Positionint16u[4](left, top, right and bottom of detected face in coordinates of +FaceDetectFrameSize, with increasing Y downwards)
124Face2Positionint16u[4] 
235Face3Positionint16u[4] 
346Face4Positionint16u[4] 
457Face5Positionint16u[4] 
568Face6Positionint16u[4] 
679Face7Positionint16u[4] 
790Face8Positionint16u[4] 
901Face9Positionint16u[4] 
1012Face10Positionint16u[4] 
+ +

Casio FaceInfo2 Tags

+

Face-detect tags extracted from models such as the EX-H20G and EX-ZR100.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
2FacesDetectedint8u 
4FaceDetectFrameSizeint16u[2] 
8FaceOrientationint8u(orientation of face relative to unrotated image) +
0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW +
3 = Rotate 180
24Face1Positionint16u[4](left, top, right and bottom of detected face in coordinates of +FaceDetectFrameSize, with increasing Y downwards)
76Face2Positionint16u[4] 
128Face3Positionint16u[4] 
180Face4Positionint16u[4] 
232Face5Positionint16u[4] 
284Face6Positionint16u[4] 
336Face7Positionint16u[4] 
388Face8Positionint16u[4] 
440Face9Positionint16u[4] 
492Face10Positionint16u[4] 
+ +

Casio QVCI Tags

+

This information is found in the APP1 QVCI segment of JPEG images from the +Casio QV-7000SX.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
44CasioQualityno1 = Economy +
2 = Normal +
3 = Fine +
4 = Super Fine
55FocalRange?no 
77DateTimeOriginalno 
98ModelTypeno 
114ManufactureIndexno 
124ManufactureCodeno 
+ +

Casio AVI Tags

+

This information is found in Casio GV-10 AVI videos.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0Softwareno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 4, 2014 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Composite.html b/html/TagNames/Composite.html new file mode 100644 index 0000000..176d0bf --- /dev/null +++ b/html/TagNames/Composite.html @@ -0,0 +1,830 @@ + + + + +Composite Tags + + + +

Composite Tags

+

+The values of the composite tags are Derived From the values of other +tags. These are convenience tags which are calculated after all other +information is extracted. Only a few of these tags are writable directly, +the others are changed by writing the corresponding Derived From tags. +User-defined Composite tags, also useful for custom-formatting of tag +values, may created via the ExifTool configuration file. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableDerived FromValues / Notes
AdvancedSceneModenoModel +
SceneMode +
AdvancedSceneType
--> Panasonic AdvancedSceneMode Values
AperturenoFNumber +
ApertureValue
 
AudioBitratenoMPEG:MPEGAudioVersion +
MPEG:SampleRate +
MPEG:VBRBytes +
MPEG:VBRFrames
(calculated for variable-bitrate MPEG audio)
AutoFocusnoNikon:PhaseDetectAF +
Nikon:ContrastDetectAF
0 = Off +
1 = On
AvgBitratenoQuickTime::MediaDataSize +
QuickTime::Duration
 
BlueBalancenoWB_RGGBLevels +
WB_RGBGLevels +
WB_RBGGLevels +
WB_GRBGLevels +
WB_GRGBLevels +
WB_GBRGLevels +
WB_RGBLevels +
WB_GRBLevels +
WB_RBLevels +
WBBlueLevel +
WBGreenLevel
 
CDDBDiscPlayTimenoCDDB1Info 
CDDBDiscTracksnoCDDB1Info 
CFAPatternnoCFARepeatPatternDim +
CFAPattern2
 
CircleOfConfusionnoScaleFactor35efl(calculated as D/1440, where D is the focal plane diagonal in mm. This value +may be incorrect if the image has been resized)
ConditionalFECnoFlashExposureComp +
FlashBits
 
DOFnoFocalLength +
Aperture +
CircleOfConfusion +
FocusDistance +
SubjectDistance +
ObjectDistance +
ApproximateFocusDistance +
FocusDistanceLower +
FocusDistanceUpper
(this value may be incorrect if the image has been resized)
DateCreatednoKodak:YearCreated +
Kodak:MonthDayCreated
 
DateTimeCreatednoIPTC:DateCreated +
IPTC:TimeCreated
 
DateTimeOriginalnoDateTimeCreated +
DateCreated +
TimeCreated
 
DateTimeOriginalnoID3:RecordingTime +
ID3:Year +
ID3:Date +
ID3:Time
 
DepthMapTiffnoDepthMapData +
DepthMapWidth +
DepthMapHeight
 
DigitalCreationDateTimenoIPTC:DigitalCreationDate +
IPTC:DigitalCreationTime
 
DigitalZoomnoCanon:ZoomSourceWidth +
Canon:ZoomTargetWidth +
Canon:DigitalZoom
 
DriveModenoContinuousDrive +
SelfTimer
0 = Continuous Shooting +
1 = Self-timer Operation +
2 = Single-frame Shooting
DurationnoAIFF:SampleRate +
AIFF:NumSampleFrames
 
DurationnoAPE:SampleRate +
APE:TotalFrames +
APE:BlocksPerFrame +
APE:FinalFrameBlocks
 
DurationnoFLAC:SampleRate +
FLAC:TotalSamples
 
DurationnoFileSize +
ID3Size +
MPEG:AudioBitrate +
MPEG:VideoBitrate +
MPEG:VBRFrames +
MPEG:SampleRate +
MPEG:MPEGAudioVersion
 
DurationnoRIFF:FrameRate +
RIFF:FrameCount +
VideoFrameRate +
VideoFrameCount
 
DurationnoRIFF:AvgBytesPerSec +
FileSize +
FrameCount +
VideoFrameCount
 
DurationnoVorbis:NominalBitrate +
FileSize
 
ExtenderStatusnoOlympus:Extender +
Olympus:LensType +
MaxApertureValue
(Olympus cameras have the quirk that they may retain the extender settings +after the extender is removed until the camera is powered off. This tag is +an attempt to represent the actual status of the extender.) +
0 = Not attached +
1 = Attached +
2 = Removed
FOVnoFocalLength +
ScaleFactor35efl +
FocusDistance
(calculated for the long image dimension. This value may be incorrect for +fisheye lenses, or if the image has been resized)
FileNumberyesDirectoryIndex +
FileIndex
 
FlashyesXMP:FlashFired +
XMP:FlashReturn +
XMP:FlashMode +
XMP:FlashFunction +
XMP:FlashRedEyeMode +
XMP:Flash
--> EXIF Flash Values +
(facilitates copying camera flash information between XMP and EXIF)
FlashTypenoFlashBits(may report "Built-in Flash" for some Canon cameras with external flash in +manual mode) +
0 = Built-In Flash +
1 = External
FocalLength35eflnoFocalLength +
ScaleFactor35efl
(this value may be incorrect if the image has been resized)
FocusDistancenoSony:FocusPosition +
FocalLength
(distance in metres = FocusPosition * FocalLength / 1000)
FocusDistance2noSony:FocusPosition2 +
FocalLengthIn35mmFormat
 
GPSAltitudenoGPS:GPSAltitude +
GPS:GPSAltitudeRef +
XMP:GPSAltitude +
XMP:GPSAltitudeRef
 
GPSAltitudenoQuickTime:GPSCoordinates 
GPSAltitudenoQuickTime:LocationInformation 
GPSAltitudeRefnoQuickTime:GPSCoordinates0 = Above Sea Level +
1 = Below Sea Level
GPSAltitudeRefnoQuickTime:LocationInformation0 = Above Sea Level +
1 = Below Sea Level
GPSDateTimenoGPS:GPSDateStamp +
GPS:GPSTimeStamp
 
GPSDateTimenoParrot:GPSLatitude +
Main:CreateDate +
SampleTime
 
GPSDateTimenoSony:GPSDateStamp +
Sony:GPSTimeStamp
 
GPSDestLatitudenoGPS:GPSDestLatitude +
GPS:GPSDestLatitudeRef
 
GPSDestLatitudeRefnoXMP-exif:GPSDestLatitude'N' = North +
'S' = South
GPSDestLongitudenoGPS:GPSDestLongitude +
GPS:GPSDestLongitudeRef
 
GPSDestLongitudeRefnoXMP-exif:GPSDestLongitude'E' = East +
'W' = West
GPSLatitudeyes/GPS:GPSLatitude +
GPS:GPSLatitudeRef
 
GPSLatitudenoQuickTime:GPSCoordinates 
GPSLatitudenoQuickTime:LocationInformation 
GPSLatitudenoSony:GPSLatitude +
Sony:GPSLatitudeRef
 
GPSLatitudeRefnoXMP-exif:GPSLatitude'N' = North +
'S' = South
GPSLongitudeyes/GPS:GPSLongitude +
GPS:GPSLongitudeRef
 
GPSLongitudenoQuickTime:GPSCoordinates 
GPSLongitudenoQuickTime:LocationInformation 
GPSLongitudenoSony:GPSLongitude +
Sony:GPSLongitudeRef
 
GPSLongitudeRefnoXMP-exif:GPSLongitude'E' = East +
'W' = West
GPSPositionyes!GPSLatitude +
GPSLongitude
(when written, writes GPSLatitude, GPSLatitudeRef, GPSLongitude and +GPSLongitudeRef. This tag may be written using the same coordinate +format as provided by Google Maps when right-clicking on a location)
HyperfocalDistancenoFocalLength +
Aperture +
CircleOfConfusion
(this value may be incorrect if the image has been resized)
IDCPreviewImagenoIDCPreviewStart +
IDCPreviewLength
 
ISOnoCanon:CameraISO +
Canon:BaseISO +
Canon:AutoISO
(use CameraISO if numerical, otherwise calculate as BaseISO * AutoISO / 100)
ImageHeightnoIFD0:SensorTopBorder +
IFD0:SensorBottomBorder
 
ImageHeightnoMain:PostScript:ImageData +
PostScript:BoundingBox
 
ImageSizenoImageWidth +
ImageHeight +
ExifImageWidth +
ExifImageHeight +
RawImageCroppedSize
 
ImageWidthnoIFD0:SensorLeftBorder +
IFD0:SensorRightBorder
 
ImageWidthnoMain:PostScript:ImageData +
PostScript:BoundingBox
 
JpgFromRawyesJpgFromRawStart +
JpgFromRawLength
(this tag is writable, and may be used to update existing embedded images, +but not create or delete them)
LensnoCanon:MinFocalLength +
Canon:MaxFocalLength
 
Lens35eflnoCanon:MinFocalLength +
Canon:MaxFocalLength +
Lens +
ScaleFactor35efl
 
LensIDnoLensType +
FocalLength +
MaxAperture +
MaxApertureValue +
MinFocalLength +
MaxFocalLength +
LensModel +
LensFocalRange +
LensSpec +
LensType2 +
LensType3 +
LensFocalLength +
RFLensType
(attempt to identify the actual lens from all lenses with a given LensType. +Applies only to LensType values with a lookup table. May be configured +by adding user-defined lenses)
LensIDnoLensModel +
Lens +
XMP-aux:LensID +
Make
 
LensIDnoNikon:LensIDNumber +
LensFStops +
MinFocalLength +
MaxFocalLength +
MaxApertureAtMinFocal +
MaxApertureAtMaxFocal +
MCUVersion +
Nikon:LensType
--> Nikon LensID Values
LensIDnoRicoh:LensFirmware--> Ricoh LensID Values
LensIDnoXMP-aux:LensID +
Make +
LensInfo +
FocalLength +
LensModel +
MaxApertureValue
(attempt to convert numerical XMP-aux:LensID stored by Adobe applications)
LensSpecnoNikon:Lens +
Nikon:LensType
 
LensTypenoLensTypeMake +
LensTypeModel
--> Olympus LensType Values +
(based on tags found in some Panasonic RW2 images)
LightValuenoAperture +
ShutterSpeed +
ISO
(calculated LV = 2 * log2(Aperture) - log2(ShutterSpeed) - log2(ISO/100); +similar to exposure value but normalized to ISO 100)
MPImagenoMPImageStart +
MPImageLength +
MPImageType
(the first MPF "Large Thumbnail" is extracted as PreviewImage, and the rest +of the embedded MPF images are extracted as MPImage#. The ExtractEmbedded +option may be used to extract information from these embedded images.)
MegapixelsnoImageSize 
OriginalDecisionDatayes!OriginalDecisionDataOffset 
OtherImageyesOtherImageStart +
OtherImageLength
(this tag is writable, and may be used to update existing embedded images, +but not create or delete them)
PeakSpectralSensitivitynoFLIR:PlanckB 
PreviewImageyesPreviewImageStart +
PreviewImageLength +
PreviewImageValid +
PreviewImageStart (1) +
PreviewImageLength (1)
(this tag is writable, and may be used to update existing embedded images, +but not create or delete them)
PreviewImagenoScreenNail 
PreviewImageSizenoPreviewImageWidth +
PreviewImageHeight
 
RedBalancenoWB_RGGBLevels +
WB_RGBGLevels +
WB_RBGGLevels +
WB_GRBGLevels +
WB_GRGBLevels +
WB_GBRGLevels +
WB_RGBLevels +
WB_GRBLevels +
WB_RBLevels +
WBRedLevel +
WBGreenLevel
 
RedEyeReductionnoCanonFlashMode +
FlashBits
0 = Off +
1 = On
RicohPitchnoRicoh:Accelerometer 
RicohRollnoRicoh:Accelerometer 
Rotationyes!QuickTime:MatrixStructure +
QuickTime:HandlerType
(writing this tag updates QuickTime MatrixStructure for all tracks with a +non-zero image size)
RunTimeSincePowerUpnoApple:RunTimeValue +
Apple:RunTimeScale
 
ScaleFactor35eflnoFocalLength +
FocalLengthIn35mmFormat +
Composite:DigitalZoom +
FocalPlaneDiagonal +
SensorSize +
FocalPlaneXSize +
FocalPlaneYSize +
FocalPlaneResolutionUnit +
FocalPlaneXResolution +
FocalPlaneYResolution +
ExifImageWidth +
ExifImageHeight +
CanonImageWidth +
CanonImageHeight +
ImageWidth +
ImageHeight
(this value and any derived values may be incorrect if the image has been +resized)
ShootingModenoCanonExposureMode +
EasyMode +
BulbDuration
 
ShutterCurtainHacknoFlashBits +
ShutterCurtainSync
0 = 1st-curtain sync +
1 = 2nd-curtain sync
ShutterSpeednoExposureTime +
ShutterSpeedValue +
BulbDuration
 
SingleShotDepthMapTiffnoSingleShotDepthMap +
SegWidth +
SegHeight
 
SubSecCreateDateyesEXIF:CreateDate +
SubSecTimeDigitized +
OffsetTimeDigitized
 
SubSecDateTimeOriginalyesEXIF:DateTimeOriginal +
SubSecTimeOriginal +
OffsetTimeOriginal
 
SubSecModifyDateyesEXIF:ModifyDate +
SubSecTime +
OffsetTime
 
ThumbnailImageyesThumbnailOffset +
ThumbnailLength
(this tag is writable, and may be used to update existing thumbnails, but may +only create a thumbnail in IFD1 of certain types of files. Note that for +this and other Composite embedded-image tags the family 0 and 1 groups match +those of the originating tags)
ThumbnailTIFFnoSubfileType +
Compression +
ImageWidth +
ImageHeight +
BitsPerSample +
PhotometricInterpretation +
StripOffsets +
SamplesPerPixel +
RowsPerStrip +
StripByteCounts +
PlanarConfiguration +
Orientation
 
VolumeSizenoISO:VolumeBlockCount +
ISO:VolumeBlockSize
 
WB_RGBLevelsnoKDC_IFD:WhiteBalance +
WB_RGBLevelsAuto +
WB_RGBLevelsFluorescent +
WB_RGBLevelsTungsten +
WB_RGBLevelsDaylight +
WB_RGBLevels4 +
WB_RGBLevels5 +
WB_RGBLevelsShade
 
WB_RGBLevelsnoKodakIFD:WhiteBalance +
WB_RGBMul0 +
WB_RGBMul1 +
WB_RGBMul2 +
WB_RGBMul3 +
WB_RGBCoeffs0 +
WB_RGBCoeffs1 +
WB_RGBCoeffs2 +
WB_RGBCoeffs3 +
KodakIFD:ColorTemperature +
Kodak:WB_RGBLevels
 
WB_RGGBLevelsnoCanon:WhiteBalance +
WB_RGGBLevelsAsShot +
WB_RGGBLevelsAuto +
WB_RGGBLevelsDaylight +
WB_RGGBLevelsCloudy +
WB_RGGBLevelsTungsten +
WB_RGGBLevelsFluorescent +
WB_RGGBLevelsFlash +
WB_RGGBLevelsCustom +
WB_RGGBLevelsShade +
WB_RGGBLevelsKelvin
 
WB_RGGBLevelsnoWB_RGGBLevelsUncorrected +
WB_RGGBLevelsBlack
 
ZoomedPreviewImagenoZoomedPreviewStart +
ZoomedPreviewLength
 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 21, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/DICOM.html b/html/TagNames/DICOM.html new file mode 100644 index 0000000..939c26b --- /dev/null +++ b/html/TagNames/DICOM.html @@ -0,0 +1,15763 @@ + + + + +DICOM Tags + + + +

DICOM Tags

+

The DICOM format is based on the ACR-NEMA specification, but adds a file +header and a number of new tags. ExifTool will extract information from +either type of file. The Tag ID's in the following table are the tag group +and element numbers in hexadecimal, as given in the DICOM specification (see +http://medical.nema.org/). The table below contains tags from the DICOM +2009 and earlier specifications plus some vendor-specific private tags.

+ +

Note that DICOM information may be saved in other file formats using the +XMP DICOM Tags.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0002,0000FileMetaInfoGroupLengthno 
0002,0001FileMetaInfoVersionno 
0002,0002MediaStorageSOPClassUIDno 
0002,0003MediaStorageSOPInstanceUIDno 
0002,0010TransferSyntaxUIDno 
0002,0012ImplementationClassUIDno 
0002,0013ImplementationVersionNameno 
0002,0016SourceApplicationEntityTitleno 
0002,0100PrivateInformationCreatorUIDno 
0002,0102PrivateInformationno 
0004,1130FileSetIDno 
0004,1141FileSetDescriptorFileIDno 
0004,1142SpecificCharacterSetOfFileno 
0004,1200FirstDirectoryRecordOffsetno 
0004,1202LastDirectoryRecordOffsetno 
0004,1212FileSetConsistencyFlagno 
0004,1220DirectoryRecordSequenceno 
0004,1400OffsetOfNextDirectoryRecordno 
0004,1410RecordInUseFlagno 
0004,1420LowerLevelDirectoryEntityOffsetno 
0004,1430DirectoryRecordTypeno 
0004,1432PrivateRecordUIDno 
0004,1500ReferencedFileIDno 
0004,1504MRDRDirectoryRecordOffsetno 
0004,1510ReferencedSOPClassUIDInFileno 
0004,1511ReferencedSOPInstanceUIDInFileno 
0004,1512ReferencedTransferSyntaxUIDInFileno 
0004,151AReferencedRelatedSOPClassUIDInFileno 
0004,1600NumberOfReferencesno 
0008,0000IdentifyingGroupLengthno 
0008,0001LengthToEndno 
0008,0005SpecificCharacterSetno 
0008,0006LanguageCodeSequenceno 
0008,0008ImageTypeno 
0008,0010RecognitionCodeno 
0008,0012InstanceCreationDateno 
0008,0013InstanceCreationTimeno 
0008,0014InstanceCreatorUIDno 
0008,0016SOPClassUIDno 
0008,0018SOPInstanceUIDno 
0008,001ARelatedGeneralSOPClassUIDno 
0008,001BOriginalSpecializedSOPClassUIDno 
0008,0020StudyDateno 
0008,0021SeriesDateno 
0008,0022AcquisitionDateno 
0008,0023ContentDateno 
0008,0024OverlayDateno 
0008,0025CurveDateno 
0008,002AAcquisitionDateTimeno 
0008,0030StudyTimeno 
0008,0031SeriesTimeno 
0008,0032AcquisitionTimeno 
0008,0033ContentTimeno 
0008,0034OverlayTimeno 
0008,0035CurveTimeno 
0008,0040DataSetTypeno 
0008,0041DataSetSubtypeno 
0008,0042NuclearMedicineSeriesTypeno 
0008,0050AccessionNumberno 
0008,0052QueryRetrieveLevelno 
0008,0054RetrieveAETitleno 
0008,0056InstanceAvailabilityno 
0008,0058FailedSOPInstanceUIDListno 
0008,0060Modalityno 
0008,0061ModalitiesInStudyno 
0008,0062SOPClassesInStudyno 
0008,0064ConversionTypeno 
0008,0068PresentationIntentTypeno 
0008,0070Manufacturerno 
0008,0080InstitutionNameno 
0008,0081InstitutionAddressno 
0008,0082InstitutionCodeSequenceno 
0008,0090ReferringPhysicianNameno 
0008,0092ReferringPhysicianAddressno 
0008,0094ReferringPhysicianTelephoneNumberno 
0008,0096ReferringPhysicianIDSequenceno 
0008,0100CodeValueno 
0008,0102CodingSchemeDesignatorno 
0008,0103CodingSchemeVersionno 
0008,0104CodeMeaningno 
0008,0105MappingResourceno 
0008,0106ContextGroupVersionno 
0008,0107ContextGroupLocalVersionno 
0008,010BContextGroupExtensionFlagno 
0008,010CCodingSchemeUIDno 
0008,010DContextGroupExtensionCreatorUIDno 
0008,010FContextIdentifierno 
0008,0110CodingSchemeIDSequenceno 
0008,0112CodingSchemeRegistryno 
0008,0114CodingSchemeExternalIDno 
0008,0115CodingSchemeNameno 
0008,0116ResponsibleOrganizationno 
0008,0117ContextUIDno 
0008,0201TimezoneOffsetFromUTCno 
0008,1000NetworkIDno 
0008,1010StationNameno 
0008,1030StudyDescriptionno 
0008,1032ProcedureCodeSequenceno 
0008,103ESeriesDescriptionno 
0008,1040InstitutionalDepartmentNameno 
0008,1048PhysiciansOfRecordno 
0008,1049PhysiciansOfRecordIDSequenceno 
0008,1050PerformingPhysicianNameno 
0008,1052PerformingPhysicianIDSequenceno 
0008,1060NameOfPhysicianReadingStudyno 
0008,1062PhysicianReadingStudyIDSequenceno 
0008,1070OperatorsNameno 
0008,1072OperatorIDSequenceno 
0008,1080AdmittingDiagnosesDescriptionno 
0008,1084AdmittingDiagnosesCodeSequenceno 
0008,1090ManufacturersModelNameno 
0008,1100ReferencedResultsSequenceno 
0008,1110ReferencedStudySequenceno 
0008,1111ReferencedProcedureStepSequenceno 
0008,1115ReferencedSeriesSequenceno 
0008,1120ReferencedPatientSequenceno 
0008,1125ReferencedVisitSequenceno 
0008,1130ReferencedOverlaySequenceno 
0008,113AReferencedWaveformSequenceno 
0008,1140ReferencedImageSequenceno 
0008,1145ReferencedCurveSequenceno 
0008,114AReferencedInstanceSequenceno 
0008,1150ReferencedSOPClassUIDno 
0008,1155ReferencedSOPInstanceUIDno 
0008,115ASOPClassesSupportedno 
0008,1160ReferencedFrameNumberno 
0008,1161SimpleFrameListno 
0008,1162CalculatedFrameListno 
0008,1163TimeRangeno 
0008,1164FrameExtractionSequenceno 
0008,1195TransactionUIDno 
0008,1197FailureReasonno 
0008,1198FailedSOPSequenceno 
0008,1199ReferencedSOPSequenceno 
0008,1200OtherReferencedStudiesSequenceno 
0008,1250RelatedSeriesSequenceno 
0008,2110LossyImageCompressionno 
0008,2111DerivationDescriptionno 
0008,2112SourceImageSequenceno 
0008,2120StageNameno 
0008,2122StageNumberno 
0008,2124NumberOfStagesno 
0008,2127ViewNameno 
0008,2128ViewNumberno 
0008,2129NumberOfEventTimersno 
0008,212ANumberOfViewsInStageno 
0008,2130EventElapsedTimesno 
0008,2132EventTimerNamesno 
0008,2133EventTimerSequenceno 
0008,2134EventTimeOffsetno 
0008,2135EventCodeSequenceno 
0008,2142StartTrimno 
0008,2143StopTrimno 
0008,2144RecommendedDisplayFrameRateno 
0008,2200TransducerPositionno 
0008,2204TransducerOrientationno 
0008,2208AnatomicStructureno 
0008,2218AnatomicRegionSequenceno 
0008,2220AnatomicRegionModifierSequenceno 
0008,2228PrimaryAnatomicStructureSequenceno 
0008,2229AnatomicStructureOrRegionSequenceno 
0008,2230AnatomicStructureModifierSequenceno 
0008,2240TransducerPositionSequenceno 
0008,2242TransducerPositionModifierSequenceno 
0008,2244TransducerOrientationSequenceno 
0008,2246TransducerOrientationModifierSeqno 
0008,2253AnatomicEntrancePortalCodeSeqTrialno 
0008,2255AnatomicApproachDirCodeSeqTrialno 
0008,2256AnatomicPerspectiveDescrTrialno 
0008,2257AnatomicPerspectiveCodeSeqTrialno 
0008,3001AlternateRepresentationSequenceno 
0008,3010IrradiationEventUIDno 
0008,4000IdentifyingCommentsno 
0008,9007FrameTypeno 
0008,9092ReferencedImageEvidenceSequenceno 
0008,9121ReferencedRawDataSequenceno 
0008,9123CreatorVersionUIDno 
0008,9124DerivationImageSequenceno 
0008,9154SourceImageEvidenceSequenceno 
0008,9205PixelPresentationno 
0008,9206VolumetricPropertiesno 
0008,9207VolumeBasedCalculationTechniqueno 
0008,9208ComplexImageComponentno 
0008,9209AcquisitionContrastno 
0008,9215DerivationCodeSequenceno 
0008,9237GrayscalePresentationStateSequenceno 
0008,9410ReferencedOtherPlaneSequenceno 
0008,9458FrameDisplaySequenceno 
0008,9459RecommendedDisplayFrameRateInFloatno 
0008,9460SkipFrameRangeFlagno 
0009,1001FullFidelityno 
0009,1002SuiteIDno 
0009,1004ProductIDno 
0009,1027ImageActualDateno 
0009,1030ServiceIDno 
0009,1031MobileLocationNumberno 
0009,10E3EquipmentUIDno 
0009,10E6GenesisVersionNowno 
0009,10E7ExamRecordChecksumno 
0009,10E9ActualSeriesDataTimeStampno 
0010,0000PatientGroupLengthno 
0010,0010PatientNameno 
0010,0020PatientIDno 
0010,0021IssuerOfPatientIDno 
0010,0022TypeOfPatientIDno 
0010,0030PatientBirthDateno 
0010,0032PatientBirthTimeno 
0010,0040PatientSexno 
0010,0050PatientInsurancePlanCodeSequenceno 
0010,0101PatientPrimaryLanguageCodeSeqno 
0010,0102PatientPrimaryLanguageCodeModSeqno 
0010,1000OtherPatientIDsno 
0010,1001OtherPatientNamesno 
0010,1002OtherPatientIDsSequenceno 
0010,1005PatientBirthNameno 
0010,1010PatientAgeno 
0010,1020PatientSizeno 
0010,1030PatientWeightno 
0010,1040PatientAddressno 
0010,1050InsurancePlanIdentificationno 
0010,1060PatientMotherBirthNameno 
0010,1080MilitaryRankno 
0010,1081BranchOfServiceno 
0010,1090MedicalRecordLocatorno 
0010,2000MedicalAlertsno 
0010,2110Allergiesno 
0010,2150CountryOfResidenceno 
0010,2152RegionOfResidenceno 
0010,2154PatientTelephoneNumbersno 
0010,2160EthnicGroupno 
0010,2180Occupationno 
0010,21A0SmokingStatusno 
0010,21B0AdditionalPatientHistoryno 
0010,21C0PregnancyStatusno 
0010,21D0LastMenstrualDateno 
0010,21F0PatientReligiousPreferenceno 
0010,2201PatientSpeciesDescriptionno 
0010,2202PatientSpeciesCodeSequenceno 
0010,2203PatientSexNeuteredno 
0010,2210AnatomicalOrientationTypeno 
0010,2292PatientBreedDescriptionno 
0010,2293PatientBreedCodeSequenceno 
0010,2294BreedRegistrationSequenceno 
0010,2295BreedRegistrationNumberno 
0010,2296BreedRegistryCodeSequenceno 
0010,2297ResponsiblePersonno 
0010,2298ResponsiblePersonRoleno 
0010,2299ResponsibleOrganizationno 
0010,4000PatientCommentsno 
0010,9431ExaminedBodyThicknessno 
0011,1010PatientStatusno 
0012,0010ClinicalTrialSponsorNameno 
0012,0020ClinicalTrialProtocolIDno 
0012,0021ClinicalTrialProtocolNameno 
0012,0030ClinicalTrialSiteIDno 
0012,0031ClinicalTrialSiteNameno 
0012,0040ClinicalTrialSubjectIDno 
0012,0042ClinicalTrialSubjectReadingIDno 
0012,0050ClinicalTrialTimePointIDno 
0012,0051ClinicalTrialTimePointDescriptionno 
0012,0060ClinicalTrialCoordinatingCenterno 
0012,0062PatientIdentityRemovedno 
0012,0063DeidentificationMethodno 
0012,0064DeidentificationMethodCodeSequenceno 
0012,0071ClinicalTrialSeriesIDno 
0012,0072ClinicalTrialSeriesDescriptionno 
0012,0084DistributionTypeno 
0012,0085ConsentForDistributionFlagno 
0018,0000AcquisitionGroupLengthno 
0018,0010ContrastBolusAgentno 
0018,0012ContrastBolusAgentSequenceno 
0018,0014ContrastBolusAdministrationRouteno 
0018,0015BodyPartExaminedno 
0018,0020ScanningSequenceno 
0018,0021SequenceVariantno 
0018,0022ScanOptionsno 
0018,0023MRAcquisitionTypeno 
0018,0024SequenceNameno 
0018,0025AngioFlagno 
0018,0026InterventionDrugInformationSeqno 
0018,0027InterventionDrugStopTimeno 
0018,0028InterventionDrugDoseno 
0018,0029InterventionDrugSequenceno 
0018,002AAdditionalDrugSequenceno 
0018,0030Radionuclideno 
0018,0031Radiopharmaceuticalno 
0018,0032EnergyWindowCenterlineno 
0018,0033EnergyWindowTotalWidthno 
0018,0034InterventionDrugNameno 
0018,0035InterventionDrugStartTimeno 
0018,0036InterventionSequenceno 
0018,0037TherapyTypeno 
0018,0038InterventionStatusno 
0018,0039TherapyDescriptionno 
0018,003AInterventionDescriptionno 
0018,0040CineRateno 
0018,0042InitialCineRunStateno 
0018,0050SliceThicknessno 
0018,0060KVPno 
0018,0070CountsAccumulatedno 
0018,0071AcquisitionTerminationConditionno 
0018,0072EffectiveDurationno 
0018,0073AcquisitionStartConditionno 
0018,0074AcquisitionStartConditionDatano 
0018,0075AcquisitionEndConditionDatano 
0018,0080RepetitionTimeno 
0018,0081EchoTimeno 
0018,0082InversionTimeno 
0018,0083NumberOfAveragesno 
0018,0084ImagingFrequencyno 
0018,0085ImagedNucleusno 
0018,0086EchoNumberno 
0018,0087MagneticFieldStrengthno 
0018,0088SpacingBetweenSlicesno 
0018,0089NumberOfPhaseEncodingStepsno 
0018,0090DataCollectionDiameterno 
0018,0091EchoTrainLengthno 
0018,0093PercentSamplingno 
0018,0094PercentPhaseFieldOfViewno 
0018,0095PixelBandwidthno 
0018,1000DeviceSerialNumberno 
0018,1002DeviceUIDno 
0018,1003DeviceIDno 
0018,1004PlateIDno 
0018,1005GeneratorIDno 
0018,1006GridIDno 
0018,1007CassetteIDno 
0018,1008GantryIDno 
0018,1010SecondaryCaptureDeviceIDno 
0018,1011HardcopyCreationDeviceIDno 
0018,1012DateOfSecondaryCaptureno 
0018,1014TimeOfSecondaryCaptureno 
0018,1016SecondaryCaptureDeviceManufacturerno 
0018,1017HardcopyDeviceManufacturerno 
0018,1018SecondaryCaptureDeviceModelNameno 
0018,1019SecondaryCaptureDeviceSoftwareVersno 
0018,101AHardcopyDeviceSoftwareVersionno 
0018,101BHardcopyDeviceModelNameno 
0018,1020SoftwareVersionno 
0018,1022VideoImageFormatAcquiredno 
0018,1023DigitalImageFormatAcquiredno 
0018,1030ProtocolNameno 
0018,1040ContrastBolusRouteno 
0018,1041ContrastBolusVolumeno 
0018,1042ContrastBolusStartTimeno 
0018,1043ContrastBolusStopTimeno 
0018,1044ContrastBolusTotalDoseno 
0018,1045SyringeCountsno 
0018,1046ContrastFlowRateno 
0018,1047ContrastFlowDurationno 
0018,1048ContrastBolusIngredientno 
0018,1049ContrastBolusConcentrationno 
0018,1050SpatialResolutionno 
0018,1060TriggerTimeno 
0018,1061TriggerSourceOrTypeno 
0018,1062NominalIntervalno 
0018,1063FrameTimeno 
0018,1064CardiacFramingTypeno 
0018,1065FrameTimeVectorno 
0018,1066FrameDelayno 
0018,1067ImageTriggerDelayno 
0018,1068MultiplexGroupTimeOffsetno 
0018,1069TriggerTimeOffsetno 
0018,106ASynchronizationTriggerno 
0018,106CSynchronizationChannelno 
0018,106ETriggerSamplePositionno 
0018,1070RadiopharmaceuticalRouteno 
0018,1071RadiopharmaceuticalVolumeno 
0018,1072RadiopharmaceuticalStartTimeno 
0018,1073RadiopharmaceuticalStopTimeno 
0018,1074RadionuclideTotalDoseno 
0018,1075RadionuclideHalfLifeno 
0018,1076RadionuclidePositronFractionno 
0018,1077RadiopharmaceuticalSpecActivityno 
0018,1078RadiopharmaceuticalStartDateTimeno 
0018,1079RadiopharmaceuticalStopDateTimeno 
0018,1080BeatRejectionFlagno 
0018,1081LowRRValueno 
0018,1082HighRRValueno 
0018,1083IntervalsAcquiredno 
0018,1084IntervalsRejectedno 
0018,1085PVCRejectionno 
0018,1086SkipBeatsno 
0018,1088HeartRateno 
0018,1090CardiacNumberOfImagesno 
0018,1094TriggerWindowno 
0018,1100ReconstructionDiameterno 
0018,1110DistanceSourceToDetectorno 
0018,1111DistanceSourceToPatientno 
0018,1114EstimatedRadiographicMagnificationno 
0018,1120GantryDetectorTiltno 
0018,1121GantryDetectorSlewno 
0018,1130TableHeightno 
0018,1131TableTraverseno 
0018,1134TableMotionno 
0018,1135TableVerticalIncrementno 
0018,1136TableLateralIncrementno 
0018,1137TableLongitudinalIncrementno 
0018,1138TableAngleno 
0018,113ATableTypeno 
0018,1140RotationDirectionno 
0018,1141AngularPositionno 
0018,1142RadialPositionno 
0018,1143ScanArcno 
0018,1144AngularStepno 
0018,1145CenterOfRotationOffsetno 
0018,1146RotationOffsetno 
0018,1147FieldOfViewShapeno 
0018,1149FieldOfViewDimensionsno 
0018,1150ExposureTimeno 
0018,1151XRayTubeCurrentno 
0018,1152Exposureno 
0018,1153ExposureInMicroAmpSecno 
0018,1154AveragePulseWidthno 
0018,1155RadiationSettingno 
0018,1156RectificationTypeno 
0018,115ARadiationModeno 
0018,115EImageAreaDoseProductno 
0018,1160FilterTypeno 
0018,1161TypeOfFiltersno 
0018,1162IntensifierSizeno 
0018,1164ImagerPixelSpacingno 
0018,1166Gridno 
0018,1170GeneratorPowerno 
0018,1180CollimatorGridNameno 
0018,1181CollimatorTypeno 
0018,1182FocalDistanceno 
0018,1183XFocusCenterno 
0018,1184YFocusCenterno 
0018,1190FocalSpotsno 
0018,1191AnodeTargetMaterialno 
0018,11A0BodyPartThicknessno 
0018,11A2CompressionForceno 
0018,1200DateOfLastCalibrationno 
0018,1201TimeOfLastCalibrationno 
0018,1210ConvolutionKernelno 
0018,1240UpperLowerPixelValuesno 
0018,1242ActualFrameDurationno 
0018,1243CountRateno 
0018,1244PreferredPlaybackSequencingno 
0018,1250ReceiveCoilNameno 
0018,1251TransmitCoilNameno 
0018,1260PlateTypeno 
0018,1261PhosphorTypeno 
0018,1300ScanVelocityno 
0018,1301WholeBodyTechniqueno 
0018,1302ScanLengthno 
0018,1310AcquisitionMatrixno 
0018,1312InPlanePhaseEncodingDirectionno 
0018,1314FlipAngleno 
0018,1315VariableFlipAngleFlagno 
0018,1316SARno 
0018,1318DB-Dtno 
0018,1400AcquisitionDeviceProcessingDescrno 
0018,1401AcquisitionDeviceProcessingCodeno 
0018,1402CassetteOrientationno 
0018,1403CassetteSizeno 
0018,1404ExposuresOnPlateno 
0018,1405RelativeXRayExposureno 
0018,1450ColumnAngulationno 
0018,1460TomoLayerHeightno 
0018,1470TomoAngleno 
0018,1480TomoTimeno 
0018,1490TomoTypeno 
0018,1491TomoClassno 
0018,1495NumberOfTomosynthesisSourceImagesno 
0018,1500PositionerMotionno 
0018,1508PositionerTypeno 
0018,1510PositionerPrimaryAngleno 
0018,1511PositionerSecondaryAngleno 
0018,1520PositionerPrimaryAngleIncrementno 
0018,1521PositionerSecondaryAngleIncrementno 
0018,1530DetectorPrimaryAngleno 
0018,1531DetectorSecondaryAngleno 
0018,1600ShutterShapeno 
0018,1602ShutterLeftVerticalEdgeno 
0018,1604ShutterRightVerticalEdgeno 
0018,1606ShutterUpperHorizontalEdgeno 
0018,1608ShutterLowerHorizontalEdgeno 
0018,1610CenterOfCircularShutterno 
0018,1612RadiusOfCircularShutterno 
0018,1620VerticesOfPolygonalShutterno 
0018,1622ShutterPresentationValueno 
0018,1623ShutterOverlayGroupno 
0018,1624ShutterPresentationColorCIELabValno 
0018,1700CollimatorShapeno 
0018,1702CollimatorLeftVerticalEdgeno 
0018,1704CollimatorRightVerticalEdgeno 
0018,1706CollimatorUpperHorizontalEdgeno 
0018,1708CollimatorLowerHorizontalEdgeno 
0018,1710CenterOfCircularCollimatorno 
0018,1712RadiusOfCircularCollimatorno 
0018,1720VerticesOfPolygonalCollimatorno 
0018,1800AcquisitionTimeSynchronizedno 
0018,1801TimeSourceno 
0018,1802TimeDistributionProtocolno 
0018,1803NTPSourceAddressno 
0018,2001PageNumberVectorno 
0018,2002FrameLabelVectorno 
0018,2003FramePrimaryAngleVectorno 
0018,2004FrameSecondaryAngleVectorno 
0018,2005SliceLocationVectorno 
0018,2006DisplayWindowLabelVectorno 
0018,2010NominalScannedPixelSpacingno 
0018,2020DigitizingDeviceTransportDirectionno 
0018,2030RotationOfScannedFilmno 
0018,3100IVUSAcquisitionno 
0018,3101IVUSPullbackRateno 
0018,3102IVUSGatedRateno 
0018,3103IVUSPullbackStartFrameNumberno 
0018,3104IVUSPullbackStopFrameNumberno 
0018,3105LesionNumberno 
0018,4000AcquisitionCommentsno 
0018,5000OutputPowerno 
0018,5010TransducerDatano 
0018,5012FocusDepthno 
0018,5020ProcessingFunctionno 
0018,5021PostprocessingFunctionno 
0018,5022MechanicalIndexno 
0018,5024BoneThermalIndexno 
0018,5026CranialThermalIndexno 
0018,5027SoftTissueThermalIndexno 
0018,5028SoftTissueFocusThermalIndexno 
0018,5029SoftTissueSurfaceThermalIndexno 
0018,5030DynamicRangeno 
0018,5040TotalGainno 
0018,5050DepthOfScanFieldno 
0018,5100PatientPositionno 
0018,5101ViewPositionno 
0018,5104ProjectionEponymousNameCodeSeqno 
0018,5210ImageTransformationMatrixno 
0018,5212ImageTranslationVectorno 
0018,6000Sensitivityno 
0018,6011SequenceOfUltrasoundRegionsno 
0018,6012RegionSpatialFormatno 
0018,6014RegionDataTypeno 
0018,6016RegionFlagsno 
0018,6018RegionLocationMinX0no 
0018,601ARegionLocationMinY0no 
0018,601CRegionLocationMaxX1no 
0018,601ERegionLocationMaxY1no 
0018,6020ReferencePixelX0no 
0018,6022ReferencePixelY0no 
0018,6024PhysicalUnitsXDirectionno 
0018,6026PhysicalUnitsYDirectionno 
0018,6028ReferencePixelPhysicalValueXno 
0018,602AReferencePixelPhysicalValueYno 
0018,602CPhysicalDeltaXno 
0018,602EPhysicalDeltaYno 
0018,6030TransducerFrequencyno 
0018,6031TransducerTypeno 
0018,6032PulseRepetitionFrequencyno 
0018,6034DopplerCorrectionAngleno 
0018,6036SteeringAngleno 
0018,6038DopplerSampleVolumeXPosRetiredno 
0018,6039DopplerSampleVolumeXPositionno 
0018,603ADopplerSampleVolumeYPosRetiredno 
0018,603BDopplerSampleVolumeYPositionno 
0018,603CTMLinePositionX0Retiredno 
0018,603DTMLinePositionX0no 
0018,603ETMLinePositionY0Retiredno 
0018,603FTMLinePositionY0no 
0018,6040TMLinePositionX1Retiredno 
0018,6041TMLinePositionX1no 
0018,6042TMLinePositionY1Retiredno 
0018,6043TMLinePositionY1no 
0018,6044PixelComponentOrganizationno 
0018,6046PixelComponentMaskno 
0018,6048PixelComponentRangeStartno 
0018,604APixelComponentRangeStopno 
0018,604CPixelComponentPhysicalUnitsno 
0018,604EPixelComponentDataTypeno 
0018,6050NumberOfTableBreakPointsno 
0018,6052TableOfXBreakPointsno 
0018,6054TableOfYBreakPointsno 
0018,6056NumberOfTableEntriesno 
0018,6058TableOfPixelValuesno 
0018,605ATableOfParameterValuesno 
0018,6060RWaveTimeVectorno 
0018,7000DetectorConditionsNominalFlagno 
0018,7001DetectorTemperatureno 
0018,7004DetectorTypeno 
0018,7005DetectorConfigurationno 
0018,7006DetectorDescriptionno 
0018,7008DetectorModeno 
0018,700ADetectorIDno 
0018,700CDateOfLastDetectorCalibrationno 
0018,700ETimeOfLastDetectorCalibrationno 
0018,7010DetectorExposuresSinceCalibrationno 
0018,7011DetectorExposuresSinceManufacturedno 
0018,7012DetectorTimeSinceLastExposureno 
0018,7014DetectorActiveTimeno 
0018,7016DetectorActiveOffsetFromExposureno 
0018,701ADetectorBinningno 
0018,7020DetectorElementPhysicalSizeno 
0018,7022DetectorElementSpacingno 
0018,7024DetectorActiveShapeno 
0018,7026DetectorActiveDimensionsno 
0018,7028DetectorActiveOriginno 
0018,702ADetectorManufacturerNameno 
0018,702BDetectorManufacturersModelNameno 
0018,7030FieldOfViewOriginno 
0018,7032FieldOfViewRotationno 
0018,7034FieldOfViewHorizontalFlipno 
0018,7040GridAbsorbingMaterialno 
0018,7041GridSpacingMaterialno 
0018,7042GridThicknessno 
0018,7044GridPitchno 
0018,7046GridAspectRationo 
0018,7048GridPeriodno 
0018,704CGridFocalDistanceno 
0018,7050FilterMaterialno 
0018,7052FilterThicknessMinimumno 
0018,7054FilterThicknessMaximumno 
0018,7060ExposureControlModeno 
0018,7062ExposureControlModeDescriptionno 
0018,7064ExposureStatusno 
0018,7065PhototimerSettingno 
0018,8150ExposureTimeInMicroSecno 
0018,8151XRayTubeCurrentInMicroAmpsno 
0018,9004ContentQualificationno 
0018,9005PulseSequenceNameno 
0018,9006MRImagingModifierSequenceno 
0018,9008EchoPulseSequenceno 
0018,9009InversionRecoveryno 
0018,9010FlowCompensationno 
0018,9011MultipleSpinEchono 
0018,9012MultiPlanarExcitationno 
0018,9014PhaseContrastno 
0018,9015TimeOfFlightContrastno 
0018,9016Spoilingno 
0018,9017SteadyStatePulseSequenceno 
0018,9018EchoPlanarPulseSequenceno 
0018,9019TagAngleFirstAxisno 
0018,9020MagnetizationTransferno 
0018,9021T2Preparationno 
0018,9022BloodSignalNullingno 
0018,9024SaturationRecoveryno 
0018,9025SpectrallySelectedSuppressionno 
0018,9026SpectrallySelectedExcitationno 
0018,9027SpatialPresaturationno 
0018,9028Taggingno 
0018,9029OversamplingPhaseno 
0018,9030TagSpacingFirstDimensionno 
0018,9032GeometryOfKSpaceTraversalno 
0018,9033SegmentedKSpaceTraversalno 
0018,9034RectilinearPhaseEncodeReorderingno 
0018,9035TagThicknessno 
0018,9036PartialFourierDirectionno 
0018,9037CardiacSynchronizationTechniqueno 
0018,9041ReceiveCoilManufacturerNameno 
0018,9042MRReceiveCoilSequenceno 
0018,9043ReceiveCoilTypeno 
0018,9044QuadratureReceiveCoilno 
0018,9045MultiCoilDefinitionSequenceno 
0018,9046MultiCoilConfigurationno 
0018,9047MultiCoilElementNameno 
0018,9048MultiCoilElementUsedno 
0018,9049MRTransmitCoilSequenceno 
0018,9050TransmitCoilManufacturerNameno 
0018,9051TransmitCoilTypeno 
0018,9052SpectralWidthno 
0018,9053ChemicalShiftReferenceno 
0018,9054VolumeLocalizationTechniqueno 
0018,9058MRAcquisitionFrequencyEncodeStepsno 
0018,9059Decouplingno 
0018,9060DecoupledNucleusno 
0018,9061DecouplingFrequencyno 
0018,9062DecouplingMethodno 
0018,9063DecouplingChemicalShiftReferenceno 
0018,9064KSpaceFilteringno 
0018,9065TimeDomainFilteringno 
0018,9066NumberOfZeroFillsno 
0018,9067BaselineCorrectionno 
0018,9069ParallelReductionFactorInPlaneno 
0018,9070CardiacRRIntervalSpecifiedno 
0018,9073AcquisitionDurationno 
0018,9074FrameAcquisitionDateTimeno 
0018,9075DiffusionDirectionalityno 
0018,9076DiffusionGradientDirectionSequenceno 
0018,9077ParallelAcquisitionno 
0018,9078ParallelAcquisitionTechniqueno 
0018,9079InversionTimesno 
0018,9080MetaboliteMapDescriptionno 
0018,9081PartialFourierno 
0018,9082EffectiveEchoTimeno 
0018,9083MetaboliteMapCodeSequenceno 
0018,9084ChemicalShiftSequenceno 
0018,9085CardiacSignalSourceno 
0018,9087DiffusionBValueno 
0018,9089DiffusionGradientOrientationno 
0018,9090VelocityEncodingDirectionno 
0018,9091VelocityEncodingMinimumValueno 
0018,9093NumberOfKSpaceTrajectoriesno 
0018,9094CoverageOfKSpaceno 
0018,9095SpectroscopyAcquisitionPhaseRowsno 
0018,9096ParallelReductFactorInPlaneRetiredno 
0018,9098TransmitterFrequencyno 
0018,9100ResonantNucleusno 
0018,9101FrequencyCorrectionno 
0018,9103MRSpectroscopyFOV-GeometrySequenceno 
0018,9104SlabThicknessno 
0018,9105SlabOrientationno 
0018,9106MidSlabPositionno 
0018,9107MRSpatialSaturationSequenceno 
0018,9112MRTimingAndRelatedParametersSeqno 
0018,9114MREchoSequenceno 
0018,9115MRModifierSequenceno 
0018,9117MRDiffusionSequenceno 
0018,9118CardiacTriggerSequenceno 
0018,9119MRAveragesSequenceno 
0018,9125MRFOV-GeometrySequenceno 
0018,9126VolumeLocalizationSequenceno 
0018,9127SpectroscopyAcquisitionDataColumnsno 
0018,9147DiffusionAnisotropyTypeno 
0018,9151FrameReferenceDateTimeno 
0018,9152MRMetaboliteMapSequenceno 
0018,9155ParallelReductionFactorOutOfPlaneno 
0018,9159SpectroscopyOutOfPlanePhaseStepsno 
0018,9166BulkMotionStatusno 
0018,9168ParallelReductionFactSecondInPlaneno 
0018,9169CardiacBeatRejectionTechniqueno 
0018,9170RespiratoryMotionCompTechniqueno 
0018,9171RespiratorySignalSourceno 
0018,9172BulkMotionCompensationTechniqueno 
0018,9173BulkMotionSignalSourceno 
0018,9174ApplicableSafetyStandardAgencyno 
0018,9175ApplicableSafetyStandardDescrno 
0018,9176OperatingModeSequenceno 
0018,9177OperatingModeTypeno 
0018,9178OperatingModeno 
0018,9179SpecificAbsorptionRateDefinitionno 
0018,9180GradientOutputTypeno 
0018,9181SpecificAbsorptionRateValueno 
0018,9182GradientOutputno 
0018,9183FlowCompensationDirectionno 
0018,9184TaggingDelayno 
0018,9185RespiratoryMotionCompTechDescrno 
0018,9186RespiratorySignalSourceIDno 
0018,9195ChemicalShiftsMinIntegrateLimitHzno 
0018,9196ChemicalShiftsMaxIntegrateLimitHzno 
0018,9197MRVelocityEncodingSequenceno 
0018,9198FirstOrderPhaseCorrectionno 
0018,9199WaterReferencedPhaseCorrectionno 
0018,9200MRSpectroscopyAcquisitionTypeno 
0018,9214RespiratoryCyclePositionno 
0018,9217VelocityEncodingMaximumValueno 
0018,9218TagSpacingSecondDimensionno 
0018,9219TagAngleSecondAxisno 
0018,9220FrameAcquisitionDurationno 
0018,9226MRImageFrameTypeSequenceno 
0018,9227MRSpectroscopyFrameTypeSequenceno 
0018,9231MRAcqPhaseEncodingStepsInPlaneno 
0018,9232MRAcqPhaseEncodingStepsOutOfPlaneno 
0018,9234SpectroscopyAcqPhaseColumnsno 
0018,9236CardiacCyclePositionno 
0018,9239SpecificAbsorptionRateSequenceno 
0018,9240RFEchoTrainLengthno 
0018,9241GradientEchoTrainLengthno 
0018,9295ChemicalShiftsMinIntegrateLimitPPMno 
0018,9296ChemicalShiftsMaxIntegrateLimitPPMno 
0018,9301CTAcquisitionTypeSequenceno 
0018,9302AcquisitionTypeno 
0018,9303TubeAngleno 
0018,9304CTAcquisitionDetailsSequenceno 
0018,9305RevolutionTimeno 
0018,9306SingleCollimationWidthno 
0018,9307TotalCollimationWidthno 
0018,9308CTTableDynamicsSequenceno 
0018,9309TableSpeedno 
0018,9310TableFeedPerRotationno 
0018,9311SpiralPitchFactorno 
0018,9312CTGeometrySequenceno 
0018,9313DataCollectionCenterPatientno 
0018,9314CTReconstructionSequenceno 
0018,9315ReconstructionAlgorithmno 
0018,9316ConvolutionKernelGroupno 
0018,9317ReconstructionFieldOfViewno 
0018,9318ReconstructionTargetCenterPatientno 
0018,9319ReconstructionAngleno 
0018,9320ImageFilterno 
0018,9321CTExposureSequenceno 
0018,9322ReconstructionPixelSpacingno 
0018,9323ExposureModulationTypeno 
0018,9324EstimatedDoseSavingno 
0018,9325CTXRayDetailsSequenceno 
0018,9326CTPositionSequenceno 
0018,9327TablePositionno 
0018,9328ExposureTimeInMilliSecno 
0018,9329CTImageFrameTypeSequenceno 
0018,9330XRayTubeCurrentInMilliAmpsno 
0018,9332ExposureInMilliAmpSecno 
0018,9333ConstantVolumeFlagno 
0018,9334FluoroscopyFlagno 
0018,9335SourceToDataCollectionCenterDistno 
0018,9337ContrastBolusAgentNumberno 
0018,9338ContrastBolusIngredientCodeSeqno 
0018,9340ContrastAdministrationProfileSeqno 
0018,9341ContrastBolusUsageSequenceno 
0018,9342ContrastBolusAgentAdministeredno 
0018,9343ContrastBolusAgentDetectedno 
0018,9344ContrastBolusAgentPhaseno 
0018,9345CTDIvolno 
0018,9346CTDIPhantomTypeCodeSequenceno 
0018,9351CalciumScoringMassFactorPatientno 
0018,9352CalciumScoringMassFactorDeviceno 
0018,9353EnergyWeightingFactorno 
0018,9360CTAdditionalXRaySourceSequenceno 
0018,9401ProjectionPixelCalibrationSequenceno 
0018,9402DistanceSourceToIsocenterno 
0018,9403DistanceObjectToTableTopno 
0018,9404ObjectPixelSpacingInCenterOfBeamno 
0018,9405PositionerPositionSequenceno 
0018,9406TablePositionSequenceno 
0018,9407CollimatorShapeSequenceno 
0018,9412XA-XRFFrameCharacteristicsSequenceno 
0018,9417FrameAcquisitionSequenceno 
0018,9420XRayReceptorTypeno 
0018,9423AcquisitionProtocolNameno 
0018,9424AcquisitionProtocolDescriptionno 
0018,9425ContrastBolusIngredientOpaqueno 
0018,9426DistanceReceptorPlaneToDetHousingno 
0018,9427IntensifierActiveShapeno 
0018,9428IntensifierActiveDimensionsno 
0018,9429PhysicalDetectorSizeno 
0018,9430PositionOfIsocenterProjectionno 
0018,9432FieldOfViewSequenceno 
0018,9433FieldOfViewDescriptionno 
0018,9434ExposureControlSensingRegionsSeqno 
0018,9435ExposureControlSensingRegionShapeno 
0018,9436ExposureControlSensRegionLeftEdgeno 
0018,9437ExposureControlSensRegionRightEdgeno 
0018,9440CenterOfCircExposControlSensRegionno 
0018,9441RadiusOfCircExposControlSensRegionno 
0018,9447ColumnAngulationPatientno 
0018,9449BeamAngleno 
0018,9451FrameDetectorParametersSequenceno 
0018,9452CalculatedAnatomyThicknessno 
0018,9455CalibrationSequenceno 
0018,9456ObjectThicknessSequenceno 
0018,9457PlaneIdentificationno 
0018,9461FieldOfViewDimensionsInFloatno 
0018,9462IsocenterReferenceSystemSequenceno 
0018,9463PositionerIsocenterPrimaryAngleno 
0018,9464PositionerIsocenterSecondaryAngleno 
0018,9465PositionerIsocenterDetRotAngleno 
0018,9466TableXPositionToIsocenterno 
0018,9467TableYPositionToIsocenterno 
0018,9468TableZPositionToIsocenterno 
0018,9469TableHorizontalRotationAngleno 
0018,9470TableHeadTiltAngleno 
0018,9471TableCradleTiltAngleno 
0018,9472FrameDisplayShutterSequenceno 
0018,9473AcquiredImageAreaDoseProductno 
0018,9474CArmPositionerTabletopRelationshipno 
0018,9476XRayGeometrySequenceno 
0018,9477IrradiationEventIDSequenceno 
0018,9504XRay3DFrameTypeSequenceno 
0018,9506ContributingSourcesSequenceno 
0018,9507XRay3DAcquisitionSequenceno 
0018,9508PrimaryPositionerScanArcno 
0018,9509SecondaryPositionerScanArcno 
0018,9510PrimaryPositionerScanStartAngleno 
0018,9511SecondaryPositionerScanStartAngleno 
0018,9514PrimaryPositionerIncrementno 
0018,9515SecondaryPositionerIncrementno 
0018,9516StartAcquisitionDateTimeno 
0018,9517EndAcquisitionDateTimeno 
0018,9524ApplicationNameno 
0018,9525ApplicationVersionno 
0018,9526ApplicationManufacturerno 
0018,9527AlgorithmTypeno 
0018,9528AlgorithmDescriptionno 
0018,9530XRay3DReconstructionSequenceno 
0018,9531ReconstructionDescriptionno 
0018,9538PerProjectionAcquisitionSequenceno 
0018,9601DiffusionBMatrixSequenceno 
0018,9602DiffusionBValueXXno 
0018,9603DiffusionBValueXYno 
0018,9604DiffusionBValueXZno 
0018,9605DiffusionBValueYYno 
0018,9606DiffusionBValueYZno 
0018,9607DiffusionBValueZZno 
0018,9701DecayCorrectionDateTimeno 
0018,9715StartDensityThresholdno 
0018,9722TerminationTimeThresholdno 
0018,9725DetectorGeometryno 
0018,9727AxialDetectorDimensionno 
0018,9735PETPositionSequenceno 
0018,9739NumberOfIterationsno 
0018,9740NumberOfSubsetsno 
0018,9751PETFrameTypeSequenceno 
0018,9756ReconstructionTypeno 
0018,9758DecayCorrectedno 
0018,9759AttenuationCorrectedno 
0018,9760ScatterCorrectedno 
0018,9761DeadTimeCorrectedno 
0018,9762GantryMotionCorrectedno 
0018,9763PatientMotionCorrectedno 
0018,9765RandomsCorrectedno 
0018,9767SensitivityCalibratedno 
0018,9801DepthsOfFocusno 
0018,9804ExclusionStartDatetimeno 
0018,9805ExclusionDurationno 
0018,9807ImageDataTypeSequenceno 
0018,9808DataTypeno 
0018,980BAliasedDataTypeno 
0018,A001ContributingEquipmentSequenceno 
0018,A002ContributionDateTimeno 
0018,A003ContributionDescriptionno 
0019,1002NumberOfCellsIInDetectorno 
0019,1003CellNumberAtThetano 
0019,1004CellSpacingno 
0019,100FHorizFrameOfRefno 
0019,1011SeriesContrastno 
0019,1012LastPseqno 
0019,1013StartNumberForBaselineno 
0019,1014EndNumberForBaselineno 
0019,1015StartNumberForEnhancedScansno 
0019,1016EndNumberForEnhancedScansno 
0019,1017SeriesPlaneno 
0019,1018FirstScanRasno 
0019,1019FirstScanLocationno 
0019,101ALastScanRasno 
0019,101BLastScanLocno 
0019,101EDisplayFieldOfViewno 
0019,1023TableSpeedno 
0019,1024MidScanTimeno 
0019,1025MidScanFlagno 
0019,1026DegreesOfAzimuthno 
0019,1027GantryPeriodno 
0019,102AXRayOnPositionno 
0019,102BXRayOffPositionno 
0019,102CNumberOfTriggersno 
0019,102EAngleOfFirstViewno 
0019,102FTriggerFrequencyno 
0019,1039ScanFOVTypeno 
0019,1040StatReconFlagno 
0019,1041ComputeTypeno 
0019,1042SegmentNumberno 
0019,1043TotalSegmentsRequestedno 
0019,1044InterscanDelayno 
0019,1047ViewCompressionFactorno 
0019,104ATotalNoOfRefChannelsno 
0019,104BDataSizeForScanDatano 
0019,1052ReconPostProcflagno 
0019,1057CTWaterNumberno 
0019,1058CTBoneNumberno 
0019,105AAcquisitionDurationno 
0019,105ENumberOfChannelsno 
0019,105FIncrementBetweenChannelsno 
0019,1060StartingViewno 
0019,1061NumberOfViewsno 
0019,1062IncrementBetweenViewsno 
0019,106ADependantOnNoViewsProcessedno 
0019,106BFieldOfViewInDetectorCellsno 
0019,1070ValueOfBackProjectionButtonno 
0019,1071SetIfFatqEstimatesWereUsedno 
0019,1072ZChanAvgOverViewsno 
0019,1073AvgOfLeftRefChansOverViewsno 
0019,1074MaxLeftChanOverViewsno 
0019,1075AvgOfRightRefChansOverViewsno 
0019,1076MaxRightChanOverViewsno 
0019,107DSecondEchono 
0019,107ENumberOfEchoesno 
0019,107FTableDeltano 
0019,1081Contiguousno 
0019,1084PeakSARno 
0019,1085MonitorSARno 
0019,1087CardiacRepetitionTimeno 
0019,1088ImagesPerCardiacCycleno 
0019,108AActualReceiveGainAnalogno 
0019,108BActualReceiveGainDigitalno 
0019,108DDelayAfterTriggerno 
0019,108FSwappfno 
0019,1090PauseIntervalno 
0019,1091PulseTimeno 
0019,1092SliceOffsetOnFreqAxisno 
0019,1093CenterFrequencyno 
0019,1094TransmitGainno 
0019,1095AnalogReceiverGainno 
0019,1096DigitalReceiverGainno 
0019,1097BitmapDefiningCVsno 
0019,1098CenterFreqMethodno 
0019,109BPulseSeqModeno 
0019,109CPulseSeqNameno 
0019,109DPulseSeqDateno 
0019,109EInternalPulseSeqNameno 
0019,109FTransmittingCoilno 
0019,10A0SurfaceCoilTypeno 
0019,10A1ExtremityCoilFlagno 
0019,10A2RawDataRunNumberno 
0019,10A3CalibratedFieldStrengthno 
0019,10A4SATFatWaterBoneno 
0019,10A5ReceiveBandwidthno 
0019,10A7UserData01no 
0019,10A8UserData02no 
0019,10A9UserData03no 
0019,10AAUserData04no 
0019,10ABUserData05no 
0019,10ACUserData06no 
0019,10ADUserData07no 
0019,10AEUserData08no 
0019,10AFUserData09no 
0019,10B0UserData10no 
0019,10B1UserData11no 
0019,10B2UserData12no 
0019,10B3UserData13no 
0019,10B4UserData14no 
0019,10B5UserData15no 
0019,10B6UserData16no 
0019,10B7UserData17no 
0019,10B8UserData18no 
0019,10B9UserData19no 
0019,10BAUserData20no 
0019,10BBUserData21no 
0019,10BCUserData22no 
0019,10BDUserData23no 
0019,10BEProjectionAngleno 
0019,10C0SaturationPlanesno 
0019,10C1SurfaceCoilIntensityno 
0019,10C2SATLocationRno 
0019,10C3SATLocationLno 
0019,10C4SATLocationAno 
0019,10C5SATLocationPno 
0019,10C6SATLocationHno 
0019,10C7SATLocationFno 
0019,10C8SATThicknessR-Lno 
0019,10C9SATThicknessA-Pno 
0019,10CASATThicknessH-Fno 
0019,10CBPrescribedFlowAxisno 
0019,10CCVelocityEncodingno 
0019,10CDThicknessDisclaimerno 
0019,10CEPrescanTypeno 
0019,10CFPrescanStatusno 
0019,10D0RawDataTypeno 
0019,10D2ProjectionAlgorithmno 
0019,10D3ProjectionAlgorithmno 
0019,10D5FractionalEchono 
0019,10D6PrepPulseno 
0019,10D7CardiacPhasesno 
0019,10D8VariableEchoflagno 
0019,10D9ConcatenatedSATno 
0019,10DAReferenceChannelUsedno 
0019,10DBBackProjectorCoefficientno 
0019,10DCPrimarySpeedCorrectionUsedno 
0019,10DDOverrangeCorrectionUsedno 
0019,10DEDynamicZAlphaValueno 
0019,10DFUserDatano 
0019,10E0UserDatano 
0019,10E2VelocityEncodeScaleno 
0019,10F2FastPhasesno 
0019,10F9TransmissionGainno 
0020,0000RelationshipGroupLengthno 
0020,000DStudyInstanceUIDno 
0020,000ESeriesInstanceUIDno 
0020,0010StudyIDno 
0020,0011SeriesNumberno 
0020,0012AcquisitionNumberno 
0020,0013InstanceNumberno 
0020,0014IsotopeNumberno 
0020,0015PhaseNumberno 
0020,0016IntervalNumberno 
0020,0017TimeSlotNumberno 
0020,0018AngleNumberno 
0020,0019ItemNumberno 
0020,0020PatientOrientationno 
0020,0022OverlayNumberno 
0020,0024CurveNumberno 
0020,0026LookupTableNumberno 
0020,0030ImagePositionno 
0020,0032ImagePositionPatientno 
0020,0035ImageOrientationno 
0020,0037ImageOrientationPatientno 
0020,0050Locationno 
0020,0052FrameOfReferenceUIDno 
0020,0060Lateralityno 
0020,0062ImageLateralityno 
0020,0070ImageGeometryTypeno 
0020,0080MaskingImageno 
0020,0100TemporalPositionIdentifierno 
0020,0105NumberOfTemporalPositionsno 
0020,0110TemporalResolutionno 
0020,0200SynchronizationFrameOfReferenceUIDno 
0020,1000SeriesInStudyno 
0020,1001AcquisitionsInSeriesno 
0020,1002ImagesInAcquisitionno 
0020,1003ImagesInSeriesno 
0020,1004AcquisitionsInStudyno 
0020,1005ImagesInStudyno 
0020,1020Referenceno 
0020,1040PositionReferenceIndicatorno 
0020,1041SliceLocationno 
0020,1070OtherStudyNumbersno 
0020,1200NumberOfPatientRelatedStudiesno 
0020,1202NumberOfPatientRelatedSeriesno 
0020,1204NumberOfPatientRelatedInstancesno 
0020,1206NumberOfStudyRelatedSeriesno 
0020,1208NumberOfStudyRelatedInstancesno 
0020,1209NumberOfSeriesRelatedInstancesno 
0020,31xxSourceImageIDsno 
0020,3401ModifyingDeviceIDno 
0020,3402ModifiedImageIDno 
0020,3403ModifiedImageDateno 
0020,3404ModifyingDeviceManufacturerno 
0020,3405ModifiedImageTimeno 
0020,3406ModifiedImageDescriptionno 
0020,4000ImageCommentsno 
0020,5000OriginalImageIdentificationno 
0020,5002OriginalImageIdentNomenclatureno 
0020,9056StackIDno 
0020,9057InStackPositionNumberno 
0020,9071FrameAnatomySequenceno 
0020,9072FrameLateralityno 
0020,9111FrameContentSequenceno 
0020,9113PlanePositionSequenceno 
0020,9116PlaneOrientationSequenceno 
0020,9128TemporalPositionIndexno 
0020,9153TriggerDelayTimeno 
0020,9156FrameAcquisitionNumberno 
0020,9157DimensionIndexValuesno 
0020,9158FrameCommentsno 
0020,9161ConcatenationUIDno 
0020,9162InConcatenationNumberno 
0020,9163InConcatenationTotalNumberno 
0020,9164DimensionOrganizationUIDno 
0020,9165DimensionIndexPointerno 
0020,9167FunctionalGroupPointerno 
0020,9213DimensionIndexPrivateCreatorno 
0020,9221DimensionOrganizationSequenceno 
0020,9222DimensionIndexSequenceno 
0020,9228ConcatenationFrameOffsetNumberno 
0020,9238FunctionalGroupPrivateCreatorno 
0020,9241NominalPercentageOfCardiacPhaseno 
0020,9245NominalPercentOfRespiratoryPhaseno 
0020,9246StartingRespiratoryAmplitudeno 
0020,9247StartingRespiratoryPhaseno 
0020,9248EndingRespiratoryAmplitudeno 
0020,9249EndingRespiratoryPhaseno 
0020,9250RespiratoryTriggerTypeno 
0020,9251RRIntervalTimeNominalno 
0020,9252ActualCardiacTriggerDelayTimeno 
0020,9253RespiratorySynchronizationSequenceno 
0020,9254RespiratoryIntervalTimeno 
0020,9255NominalRespiratoryTriggerDelayTimeno 
0020,9256RespiratoryTriggerDelayThresholdno 
0020,9257ActualRespiratoryTriggerDelayTimeno 
0020,9301ImagePositionVolumeno 
0020,9302ImageOrientationVolumeno 
0020,9308ApexPositionno 
0020,9421DimensionDescriptionLabelno 
0020,9450PatientOrientationInFrameSequenceno 
0020,9453FrameLabelno 
0020,9518AcquisitionIndexno 
0020,9529ContributingSOPInstancesRefSeqno 
0020,9536ReconstructionIndexno 
0021,1003SeriesFromWhichPrescribedno 
0021,1005GenesisVersionNowno 
0021,1007SeriesRecordChecksumno 
0021,1018GenesisVersionNowno 
0021,1019AcqreconRecordChecksumno 
0021,1020TableStartLocationno 
0021,1035SeriesFromWhichPrescribedno 
0021,1036ImageFromWhichPrescribedno 
0021,1037ScreenFormatno 
0021,104AAnatomicalReferenceForScoutno 
0021,104FLocationsInAcquisitionno 
0021,1050GraphicallyPrescribedno 
0021,1051RotationFromSourceXRotno 
0021,1052RotationFromSourceYRotno 
0021,1053RotationFromSourceZRotno 
0021,1054ImagePositionno 
0021,1055ImageOrientationno 
0021,1056IntegerSlopno 
0021,1057IntegerSlopno 
0021,1058IntegerSlopno 
0021,1059IntegerSlopno 
0021,105AIntegerSlopno 
0021,105BFloatSlopno 
0021,105CFloatSlopno 
0021,105DFloatSlopno 
0021,105EFloatSlopno 
0021,105FFloatSlopno 
0021,1081AutoWindowLevelAlphano 
0021,1082AutoWindowLevelBetano 
0021,1083AutoWindowLevelWindowno 
0021,1084ToWindowLevelLevelno 
0021,1090TubeFocalSpotPositionno 
0021,1091BiopsyPositionno 
0021,1092BiopsyTLocationno 
0021,1093BiopsyRefLocationno 
0022,0001LightPathFilterPassThroughWavelenno 
0022,0002LightPathFilterPassBandno 
0022,0003ImagePathFilterPassThroughWavelenno 
0022,0004ImagePathFilterPassBandno 
0022,0005PatientEyeMovementCommandedno 
0022,0006PatientEyeMovementCommandCodeSeqno 
0022,0007SphericalLensPowerno 
0022,0008CylinderLensPowerno 
0022,0009CylinderAxisno 
0022,000AEmmetropicMagnificationno 
0022,000BIntraOcularPressureno 
0022,000CHorizontalFieldOfViewno 
0022,000DPupilDilatedno 
0022,000EDegreeOfDilationno 
0022,0010StereoBaselineAngleno 
0022,0011StereoBaselineDisplacementno 
0022,0012StereoHorizontalPixelOffsetno 
0022,0013StereoVerticalPixelOffsetno 
0022,0014StereoRotationno 
0022,0015AcquisitionDeviceTypeCodeSequenceno 
0022,0016IlluminationTypeCodeSequenceno 
0022,0017LightPathFilterTypeStackCodeSeqno 
0022,0018ImagePathFilterTypeStackCodeSeqno 
0022,0019LensesCodeSequenceno 
0022,001AChannelDescriptionCodeSequenceno 
0022,001BRefractiveStateSequenceno 
0022,001CMydriaticAgentCodeSequenceno 
0022,001DRelativeImagePositionCodeSequenceno 
0022,0020StereoPairsSequenceno 
0022,0021LeftImageSequenceno 
0022,0022RightImageSequenceno 
0022,0030AxialLengthOfTheEyeno 
0022,0031OphthalmicFrameLocationSequenceno 
0022,0032ReferenceCoordinatesno 
0022,0035DepthSpatialResolutionno 
0022,0036MaximumDepthDistortionno 
0022,0037AlongScanSpatialResolutionno 
0022,0038MaximumAlongScanDistortionno 
0022,0039OphthalmicImageOrientationno 
0022,0041DepthOfTransverseImageno 
0022,0042MydriaticAgentConcUnitsSeqno 
0022,0048AcrossScanSpatialResolutionno 
0022,0049MaximumAcrossScanDistortionno 
0022,004EMydriaticAgentConcentrationno 
0022,0055IlluminationWaveLengthno 
0022,0056IlluminationPowerno 
0022,0057IlluminationBandwidthno 
0022,0058MydriaticAgentSequenceno 
0023,1001NumberOfSeriesInStudyno 
0023,1002NumberOfUnarchivedSeriesno 
0023,1010ReferenceImageFieldno 
0023,1050SummaryImageno 
0023,1070StartTimeSecsInFirstAxialno 
0023,1074NoofUpdatesToHeaderno 
0023,107DIndicatesIfTheStudyHasCompleteInfono 
0025,1006LastPulseSequenceUsedno 
0025,1007ImagesInSeriesno 
0025,1010LandmarkCounterno 
0025,1011NumberOfAcquisitionsno 
0025,1014IndicatesNoofUpdatesToHeaderno 
0025,1017SeriesCompleteFlagno 
0025,1018NumberOfImagesArchivedno 
0025,1019LastImageNumberUsedno 
0025,101APrimaryReceiverSuiteAndHostno 
0027,1006ImageArchiveFlagno 
0027,1010ScoutTypeno 
0027,101CVmaMampno 
0027,101DVmaPhaseno 
0027,101EVmaModno 
0027,101FVmaClipno 
0027,1020SmartScanOnOffFlagno 
0027,1030ForeignImageRevisionno 
0027,1031ImagingModeno 
0027,1032PulseSequenceno 
0027,1033ImagingOptionsno 
0027,1035PlaneTypeno 
0027,1036ObliquePlaneno 
0027,1040RASLetterOfImageLocationno 
0027,1041ImageLocationno 
0027,1042CenterRCoordOfPlaneImageno 
0027,1043CenterACoordOfPlaneImageno 
0027,1044CenterSCoordOfPlaneImageno 
0027,1045NormalRCoordno 
0027,1046NormalACoordno 
0027,1047NormalSCoordno 
0027,1048RCoordOfTopRightCornerno 
0027,1049ACoordOfTopRightCornerno 
0027,104ASCoordOfTopRightCornerno 
0027,104BRCoordOfBottomRightCornerno 
0027,104CACoordOfBottomRightCornerno 
0027,104DSCoordOfBottomRightCornerno 
0027,1050TableStartLocationno 
0027,1051TableEndLocationno 
0027,1052RASLetterForSideOfImageno 
0027,1053RASLetterForAnteriorPosteriorno 
0027,1054RASLetterForScoutStartLocno 
0027,1055RASLetterForScoutEndLocno 
0027,1060ImageDimensionXno 
0027,1061ImageDimensionYno 
0027,1062NumberOfExcitationsno 
0028,0000ImagePresentationGroupLengthno 
0028,0002SamplesPerPixelno 
0028,0003SamplesPerPixelUsedno 
0028,0004PhotometricInterpretationno 
0028,0005ImageDimensionsno 
0028,0006PlanarConfigurationno 
0028,0008NumberOfFramesno 
0028,0009FrameIncrementPointerno 
0028,000AFrameDimensionPointerno 
0028,0010Rowsno 
0028,0011Columnsno 
0028,0012Planesno 
0028,0014UltrasoundColorDataPresentno 
0028,0030PixelSpacingno 
0028,0031ZoomFactorno 
0028,0032ZoomCenterno 
0028,0034PixelAspectRationo 
0028,0040ImageFormatno 
0028,0050ManipulatedImageno 
0028,0051CorrectedImageno 
0028,005FCompressionRecognitionCodeno 
0028,0060CompressionCodeno 
0028,0061CompressionOriginatorno 
0028,0062CompressionLabelno 
0028,0063CompressionDescriptionno 
0028,0065CompressionSequenceno 
0028,0066CompressionStepPointersno 
0028,0068RepeatIntervalno 
0028,0069BitsGroupedno 
0028,0070PerimeterTableno 
0028,0071PerimeterValueno 
0028,0080PredictorRowsno 
0028,0081PredictorColumnsno 
0028,0082PredictorConstantsno 
0028,0090BlockedPixelsno 
0028,0091BlockRowsno 
0028,0092BlockColumnsno 
0028,0093RowOverlapno 
0028,0094ColumnOverlapno 
0028,0100BitsAllocatedno 
0028,0101BitsStoredno 
0028,0102HighBitno 
0028,0103PixelRepresentationno0 = Unsigned +
1 = Signed
0028,0104SmallestValidPixelValueno 
0028,0105LargestValidPixelValueno 
0028,0106SmallestImagePixelValueno 
0028,0107LargestImagePixelValueno 
0028,0108SmallestPixelValueInSeriesno 
0028,0109LargestPixelValueInSeriesno 
0028,0110SmallestImagePixelValueInPlaneno 
0028,0111LargestImagePixelValueInPlaneno 
0028,0120PixelPaddingValueno 
0028,0121PixelPaddingRangeLimitno 
0028,0200ImageLocationno 
0028,0300QualityControlImageno 
0028,0301BurnedInAnnotationno 
0028,0400TransformLabelno 
0028,0401TransformVersionNumberno 
0028,0402NumberOfTransformStepsno 
0028,0403SequenceOfCompressedDatano 
0028,0404DetailsOfCoefficientsno 
0028,04x2CoefficientCodingno 
0028,04x3CoefficientCodingPointersno 
0028,0700DCTLabelno 
0028,0701DataBlockDescriptionno 
0028,0702DataBlockno 
0028,0710NormalizationFactorFormatno 
0028,0720ZonalMapNumberFormatno 
0028,0721ZonalMapLocationno 
0028,0722ZonalMapFormatno 
0028,0730AdaptiveMapFormatno 
0028,0740CodeNumberFormatno 
0028,08x0CodeLabelno 
0028,08x2NumberOfTablesno 
0028,08x3CodeTableLocationno 
0028,08x4BitsForCodeWordno 
0028,08x8ImageDataLocationno 
0028,0A02PixelSpacingCalibrationTypeno 
0028,0A04PixelSpacingCalibrationDescriptionno 
0028,1040PixelIntensityRelationshipno 
0028,1041PixelIntensityRelationshipSignno 
0028,1050WindowCenterno 
0028,1051WindowWidthno 
0028,1052RescaleInterceptno 
0028,1053RescaleSlopeno 
0028,1054RescaleTypeno 
0028,1055WindowCenterAndWidthExplanationno 
0028,1056VOI_LUTFunctionno 
0028,1080GrayScaleno 
0028,1090RecommendedViewingModeno 
0028,1100GrayLookupTableDescriptorno 
0028,1101RedPaletteColorTableDescriptorno 
0028,1102GreenPaletteColorTableDescriptorno 
0028,1103BluePaletteColorTableDescriptorno 
0028,1111LargeRedPaletteColorTableDescrno 
0028,1112LargeGreenPaletteColorTableDescrno 
0028,1113LargeBluePaletteColorTableDescrno 
0028,1199PaletteColorTableUIDno 
0028,1200GrayLookupTableDatano 
0028,1201RedPaletteColorTableDatano 
0028,1202GreenPaletteColorTableDatano 
0028,1203BluePaletteColorTableDatano 
0028,1211LargeRedPaletteColorTableDatano 
0028,1212LargeGreenPaletteColorTableDatano 
0028,1213LargeBluePaletteColorTableDatano 
0028,1214LargePaletteColorLookupTableUIDno 
0028,1221SegmentedRedColorTableDatano 
0028,1222SegmentedGreenColorTableDatano 
0028,1223SegmentedBlueColorTableDatano 
0028,1300BreastImplantPresentno 
0028,1350PartialViewno 
0028,1351PartialViewDescriptionno 
0028,1352PartialViewCodeSequenceno 
0028,135ASpatialLocationsPreservedno 
0028,1402DataPathAssignmentno 
0028,1404BlendingLUT1Sequenceno 
0028,1406BlendingWeightConstantno 
0028,1408BlendingLookupTableDatano 
0028,140CBlendingLUT2Sequenceno 
0028,140EDataPathIDno 
0028,140FRGBLUTTransferFunctionno 
0028,1410AlphaLUTTransferFunctionno 
0028,2000ICCProfileno 
0028,2110LossyImageCompressionno 
0028,2112LossyImageCompressionRationo 
0028,2114LossyImageCompressionMethodno 
0028,3000ModalityLUTSequenceno 
0028,3002LUTDescriptorno 
0028,3003LUTExplanationno 
0028,3004ModalityLUTTypeno 
0028,3006LUTDatano 
0028,3010VOILUTSequenceno 
0028,3110SoftcopyVOILUTSequenceno 
0028,4000ImagePresentationCommentsno 
0028,5000BiPlaneAcquisitionSequenceno 
0028,6010RepresentativeFrameNumberno 
0028,6020FrameNumbersOfInterestno 
0028,6022FrameOfInterestDescriptionno 
0028,6023FrameOfInterestTypeno 
0028,6030MaskPointersno 
0028,6040RWavePointerno 
0028,6100MaskSubtractionSequenceno 
0028,6101MaskOperationno 
0028,6102ApplicableFrameRangeno 
0028,6110MaskFrameNumbersno 
0028,6112ContrastFrameAveragingno 
0028,6114MaskSubPixelShiftno 
0028,6120TIDOffsetno 
0028,6190MaskOperationExplanationno 
0028,7FE0PixelDataProviderURLno 
0028,9001DataPointRowsno 
0028,9002DataPointColumnsno 
0028,9003SignalDomainColumnsno 
0028,9099LargestMonochromePixelValueno 
0028,9108DataRepresentationno 
0028,9110PixelMeasuresSequenceno 
0028,9132FrameVOILUTSequenceno 
0028,9145PixelValueTransformationSequenceno 
0028,9235SignalDomainRowsno 
0028,9411DisplayFilterPercentageno 
0028,9415FramePixelShiftSequenceno 
0028,9416SubtractionItemIDno 
0028,9422PixelIntensityRelationshipLUTSeqno 
0028,9443FramePixelDataPropertiesSequenceno 
0028,9444GeometricalPropertiesno 
0028,9445GeometricMaximumDistortionno 
0028,9446ImageProcessingAppliedno 
0028,9454MaskSelectionModeno 
0028,9474LUTFunctionno 
0028,9478MaskVisibilityPercentageno 
0028,9501PixelShiftSequenceno 
0028,9502RegionPixelShiftSequenceno 
0028,9503VerticesOfTheRegionno 
0028,9506PixelShiftFrameRangeno 
0028,9507LUTFrameRangeno 
0028,9520ImageToEquipmentMappingMatrixno 
0028,9537EquipmentCoordinateSystemIDno 
0029,1004LowerRangeOfPixels1ano 
0029,1005LowerRangeOfPixels1bno 
0029,1006LowerRangeOfPixels1cno 
0029,1007LowerRangeOfPixels1dno 
0029,1008LowerRangeOfPixels1eno 
0029,1009LowerRangeOfPixels1fno 
0029,100ALowerRangeOfPixels1gno 
0029,1015LowerRangeOfPixels1hno 
0029,1016LowerRangeOfPixels1ino 
0029,1017LowerRangeOfPixels2no 
0029,1018UpperRangeOfPixels2no 
0029,101ALenOfTotHdrInBytesno 
0029,1026VersionOfTheHdrStructno 
0029,1034AdvantageCompOverflowno 
0029,1035AdvantageCompUnderflowno 
0032,0000StudyGroupLengthno 
0032,000AStudyStatusIDno 
0032,000CStudyPriorityIDno 
0032,0012StudyIDIssuerno 
0032,0032StudyVerifiedDateno 
0032,0033StudyVerifiedTimeno 
0032,0034StudyReadDateno 
0032,0035StudyReadTimeno 
0032,1000ScheduledStudyStartDateno 
0032,1001ScheduledStudyStartTimeno 
0032,1010ScheduledStudyStopDateno 
0032,1011ScheduledStudyStopTimeno 
0032,1020ScheduledStudyLocationno 
0032,1021ScheduledStudyLocationAETitleno 
0032,1030ReasonForStudyno 
0032,1031RequestingPhysicianIDSequenceno 
0032,1032RequestingPhysicianno 
0032,1033RequestingServiceno 
0032,1040StudyArrivalDateno 
0032,1041StudyArrivalTimeno 
0032,1050StudyCompletionDateno 
0032,1051StudyCompletionTimeno 
0032,1055StudyComponentStatusIDno 
0032,1060RequestedProcedureDescriptionno 
0032,1064RequestedProcedureCodeSequenceno 
0032,1070RequestedContrastAgentno 
0032,4000StudyCommentsno 
0038,0004ReferencedPatientAliasSequenceno 
0038,0008VisitStatusIDno 
0038,0010AdmissionIDno 
0038,0011IssuerOfAdmissionIDno 
0038,0016RouteOfAdmissionsno 
0038,001AScheduledAdmissionDateno 
0038,001BScheduledAdmissionTimeno 
0038,001CScheduledDischargeDateno 
0038,001DScheduledDischargeTimeno 
0038,001EScheduledPatientInstitResidenceno 
0038,0020AdmittingDateno 
0038,0021AdmittingTimeno 
0038,0030DischargeDateno 
0038,0032DischargeTimeno 
0038,0040DischargeDiagnosisDescriptionno 
0038,0044DischargeDiagnosisCodeSequenceno 
0038,0050SpecialNeedsno 
0038,0060ServiceEpisodeIDno 
0038,0061IssuerOfServiceEpisodeIDno 
0038,0062ServiceEpisodeDescriptionno 
0038,0100PertinentDocumentsSequenceno 
0038,0300CurrentPatientLocationno 
0038,0400PatientInstitutionResidenceno 
0038,0500PatientStateno 
0038,0502PatientClinicalTrialParticipSeqno 
0038,4000VisitCommentsno 
003A,0004WaveformOriginalityno 
003A,0005NumberOfWaveformChannelsno 
003A,0010NumberOfWaveformSamplesno 
003A,001ASamplingFrequencyno 
003A,0020MultiplexGroupLabelno 
003A,0200ChannelDefinitionSequenceno 
003A,0202WaveformChannelNumberno 
003A,0203ChannelLabelno 
003A,0205ChannelStatusno 
003A,0208ChannelSourceSequenceno 
003A,0209ChannelSourceModifiersSequenceno 
003A,020ASourceWaveformSequenceno 
003A,020CChannelDerivationDescriptionno 
003A,0210ChannelSensitivityno 
003A,0211ChannelSensitivityUnitsSequenceno 
003A,0212ChannelSensitivityCorrectionFactorno 
003A,0213ChannelBaselineno 
003A,0214ChannelTimeSkewno 
003A,0215ChannelSampleSkewno 
003A,0218ChannelOffsetno 
003A,021AWaveformBitsStoredno 
003A,0220FilterLowFrequencyno 
003A,0221FilterHighFrequencyno 
003A,0222NotchFilterFrequencyno 
003A,0223NotchFilterBandwidthno 
003A,0230WaveformDataDisplayScaleno 
003A,0231WaveformDisplayBkgCIELabValueno 
003A,0240WaveformPresentationGroupSequenceno 
003A,0241PresentationGroupNumberno 
003A,0242ChannelDisplaySequenceno 
003A,0244ChannelRecommendDisplayCIELabValueno 
003A,0245ChannelPositionno 
003A,0246DisplayShadingFlagno 
003A,0247FractionalChannelDisplayScaleno 
003A,0248AbsoluteChannelDisplayScaleno 
003A,0300MultiplexAudioChannelsDescrCodeSeqno 
003A,0301ChannelIdentificationCodeno 
003A,0302ChannelModeno 
0040,0001ScheduledStationAETitleno 
0040,0002ScheduledProcedureStepStartDateno 
0040,0003ScheduledProcedureStepStartTimeno 
0040,0004ScheduledProcedureStepEndDateno 
0040,0005ScheduledProcedureStepEndTimeno 
0040,0006ScheduledPerformingPhysiciansNameno 
0040,0007ScheduledProcedureStepDescriptionno 
0040,0008ScheduledProtocolCodeSequenceno 
0040,0009ScheduledProcedureStepIDno 
0040,000AStageCodeSequenceno 
0040,000BScheduledPerformingPhysicianIDSeqno 
0040,0010ScheduledStationNameno 
0040,0011ScheduledProcedureStepLocationno 
0040,0012PreMedicationno 
0040,0020ScheduledProcedureStepStatusno 
0040,0031LocalNamespaceEntityIDno 
0040,0032UniversalEntityIDno 
0040,0033UniversalEntityIDTypeno 
0040,0035IdentifierTypeCodeno 
0040,0036AssigningFacilitySequenceno 
0040,0100ScheduledProcedureStepSequenceno 
0040,0220ReferencedNonImageCompositeSOPSeqno 
0040,0241PerformedStationAETitleno 
0040,0242PerformedStationNameno 
0040,0243PerformedLocationno 
0040,0244PerformedProcedureStepStartDateno 
0040,0245PerformedProcedureStepStartTimeno 
0040,0250PerformedProcedureStepEndDateno 
0040,0251PerformedProcedureStepEndTimeno 
0040,0252PerformedProcedureStepStatusno 
0040,0253PerformedProcedureStepIDno 
0040,0254PerformedProcedureStepDescriptionno 
0040,0255PerformedProcedureTypeDescriptionno 
0040,0260PerformedProtocolCodeSequenceno 
0040,0261PerformedProtocolTypeno 
0040,0270ScheduledStepAttributesSequenceno 
0040,0275RequestAttributesSequenceno 
0040,0280CommentsOnPerformedProcedureStepno 
0040,0281ProcStepDiscontinueReasonCodeSeqno 
0040,0293QuantitySequenceno 
0040,0294Quantityno 
0040,0295MeasuringUnitsSequenceno 
0040,0296BillingItemSequenceno 
0040,0300TotalTimeOfFluoroscopyno 
0040,0301TotalNumberOfExposuresno 
0040,0302EntranceDoseno 
0040,0303ExposedAreano 
0040,0306DistanceSourceToEntranceno 
0040,0307DistanceSourceToSupportno 
0040,030EExposureDoseSequenceno 
0040,0310CommentsOnRadiationDoseno 
0040,0312XRayOutputno 
0040,0314HalfValueLayerno 
0040,0316OrganDoseno 
0040,0318OrganExposedno 
0040,0320BillingProcedureStepSequenceno 
0040,0321FilmConsumptionSequenceno 
0040,0324BillingSuppliesAndDevicesSequenceno 
0040,0330ReferencedProcedureStepSequenceno 
0040,0340PerformedSeriesSequenceno 
0040,0400CommentsOnScheduledProcedureStepno 
0040,0440ProtocolContextSequenceno 
0040,0441ContentItemModifierSequenceno 
0040,050ASpecimenAccessionNumberno 
0040,0512ContainerIdentifierno 
0040,051AContainerDescriptionno 
0040,0550SpecimenSequenceno 
0040,0551SpecimenIdentifierno 
0040,0552SpecimenDescriptionSequenceTrialno 
0040,0553SpecimenDescriptionTrialno 
0040,0554SpecimenUIDno 
0040,0555AcquisitionContextSequenceno 
0040,0556AcquisitionContextDescriptionno 
0040,059ASpecimenTypeCodeSequenceno 
0040,0600SpecimenShortDescriptionno 
0040,06FASlideIdentifierno 
0040,071AImageCenterPointCoordinatesSeqno 
0040,072AXOffsetInSlideCoordinateSystemno 
0040,073AYOffsetInSlideCoordinateSystemno 
0040,074AZOffsetInSlideCoordinateSystemno 
0040,08D8PixelSpacingSequenceno 
0040,08DACoordinateSystemAxisCodeSequenceno 
0040,08EAMeasurementUnitsCodeSequenceno 
0040,09F8VitalStainCodeSequenceTrialno 
0040,1001RequestedProcedureIDno 
0040,1002ReasonForRequestedProcedureno 
0040,1003RequestedProcedurePriorityno 
0040,1004PatientTransportArrangementsno 
0040,1005RequestedProcedureLocationno 
0040,1006PlacerOrderNumber-Procedureno 
0040,1007FillerOrderNumber-Procedureno 
0040,1008ConfidentialityCodeno 
0040,1009ReportingPriorityno 
0040,100AReasonForRequestedProcedureCodeSeqno 
0040,1010NamesOfIntendedRecipientsOfResultsno 
0040,1011IntendedRecipientsOfResultsIDSeqno 
0040,1101PersonIdentificationCodeSequenceno 
0040,1102PersonAddressno 
0040,1103PersonTelephoneNumbersno 
0040,1400RequestedProcedureCommentsno 
0040,2001ReasonForImagingServiceRequestno 
0040,2004IssueDateOfImagingServiceRequestno 
0040,2005IssueTimeOfImagingServiceRequestno 
0040,2006PlacerOrderNum-ImagingServiceReqno 
0040,2007FillerOrderNum-ImagingServiceReqno 
0040,2008OrderEnteredByno 
0040,2009OrderEntererLocationno 
0040,2010OrderCallbackPhoneNumberno 
0040,2016PlacerOrderNum-ImagingServiceReqno 
0040,2017FillerOrderNum-ImagingServiceReqno 
0040,2400ImagingServiceRequestCommentsno 
0040,3001ConfidentialityOnPatientDataDescrno 
0040,4001GenPurposeScheduledProcStepStatusno 
0040,4002GenPurposePerformedProcStepStatusno 
0040,4003GenPurposeSchedProcStepPriorityno 
0040,4004SchedProcessingApplicationsCodeSeqno 
0040,4005SchedProcedureStepStartDateAndTimeno 
0040,4006MultipleCopiesFlagno 
0040,4007PerformedProcessingAppsCodeSeqno 
0040,4009HumanPerformerCodeSequenceno 
0040,4010SchedProcStepModificationDateTimeno 
0040,4011ExpectedCompletionDateAndTimeno 
0040,4015ResultingGenPurposePerfProcStepSeqno 
0040,4016RefGenPurposeSchedProcStepSeqno 
0040,4018ScheduledWorkitemCodeSequenceno 
0040,4019PerformedWorkitemCodeSequenceno 
0040,4020InputAvailabilityFlagno 
0040,4021InputInformationSequenceno 
0040,4022RelevantInformationSequenceno 
0040,4023RefGenPurSchedProcStepTransUIDno 
0040,4025ScheduledStationNameCodeSequenceno 
0040,4026ScheduledStationClassCodeSequenceno 
0040,4027SchedStationGeographicLocCodeSeqno 
0040,4028PerformedStationNameCodeSequenceno 
0040,4029PerformedStationClassCodeSequenceno 
0040,4030PerformedStationGeogLocCodeSeqno 
0040,4031RequestedSubsequentWorkItemCodeSeqno 
0040,4032NonDICOMOutputCodeSequenceno 
0040,4033OutputInformationSequenceno 
0040,4034ScheduledHumanPerformersSequenceno 
0040,4035ActualHumanPerformersSequenceno 
0040,4036HumanPerformersOrganizationno 
0040,4037HumanPerformerNameno 
0040,4040RawDataHandlingno 
0040,8302EntranceDoseInMilliGyno 
0040,9094RefImageRealWorldValueMappingSeqno 
0040,9096RealWorldValueMappingSequenceno 
0040,9098PixelValueMappingCodeSequenceno 
0040,9210LUTLabelno 
0040,9211RealWorldValueLastValueMappedno 
0040,9212RealWorldValueLUTDatano 
0040,9216RealWorldValueFirstValueMappedno 
0040,9224RealWorldValueInterceptno 
0040,9225RealWorldValueSlopeno 
0040,A010RelationshipTypeno 
0040,A027VerifyingOrganizationno 
0040,A030VerificationDateTimeno 
0040,A032ObservationDateTimeno 
0040,A040ValueTypeno 
0040,A043ConceptNameCodeSequenceno 
0040,A050ContinuityOfContentno 
0040,A073VerifyingObserverSequenceno 
0040,A075VerifyingObserverNameno 
0040,A078AuthorObserverSequenceno 
0040,A07AParticipantSequenceno 
0040,A07CCustodialOrganizationSequenceno 
0040,A080ParticipationTypeno 
0040,A082ParticipationDateTimeno 
0040,A084ObserverTypeno 
0040,A088VerifyingObserverIdentCodeSequenceno 
0040,A090EquivalentCDADocumentSequenceno 
0040,A0B0ReferencedWaveformChannelsno 
0040,A120DateTimeno 
0040,A121Dateno 
0040,A122Timeno 
0040,A123PersonNameno 
0040,A124UIDno 
0040,A130TemporalRangeTypeno 
0040,A132ReferencedSamplePositionsno 
0040,A136ReferencedFrameNumbersno 
0040,A138ReferencedTimeOffsetsno 
0040,A13AReferencedDateTimeno 
0040,A160TextValueno 
0040,A168ConceptCodeSequenceno 
0040,A170PurposeOfReferenceCodeSequenceno 
0040,A180AnnotationGroupNumberno 
0040,A195ModifierCodeSequenceno 
0040,A300MeasuredValueSequenceno 
0040,A301NumericValueQualifierCodeSequenceno 
0040,A30ANumericValueno 
0040,A353AddressTrialno 
0040,A354TelephoneNumberTrialno 
0040,A360PredecessorDocumentsSequenceno 
0040,A370ReferencedRequestSequenceno 
0040,A372PerformedProcedureCodeSequenceno 
0040,A375CurrentRequestedProcEvidenceSeqno 
0040,A385PertinentOtherEvidenceSequenceno 
0040,A390HL7StructuredDocumentRefSeqno 
0040,A491CompletionFlagno 
0040,A492CompletionFlagDescriptionno 
0040,A493VerificationFlagno 
0040,A494ArchiveRequestedno 
0040,A496PreliminaryFlagno 
0040,A504ContentTemplateSequenceno 
0040,A525IdenticalDocumentsSequenceno 
0040,A730ContentSequenceno 
0040,B020AnnotationSequenceno 
0040,DB00TemplateIdentifierno 
0040,DB06TemplateVersionno 
0040,DB07TemplateLocalVersionno 
0040,DB0BTemplateExtensionFlagno 
0040,DB0CTemplateExtensionOrganizationUIDno 
0040,DB0DTemplateExtensionCreatorUIDno 
0040,DB73ReferencedContentItemIdentifierno 
0040,E001HL7InstanceIdentifierno 
0040,E004HL7DocumentEffectiveTimeno 
0040,E006HL7DocumentTypeCodeSequenceno 
0040,E010RetrieveURIno 
0040,E011RetrieveLocationUIDno 
0042,0010DocumentTitleno 
0042,0011EncapsulatedDocumentno 
0042,0012MIMETypeOfEncapsulatedDocumentno 
0042,0013SourceInstanceSequenceno 
0042,0014ListOfMIMETypesno 
0043,1001BitmapOfPrescanOptionsno 
0043,1002GradientOffsetInXno 
0043,1003GradientOffsetInYno 
0043,1004GradientOffsetInZno 
0043,1005ImgIsOriginalOrUnoriginalno 
0043,1006NumberOfEPIShotsno 
0043,1007ViewsPerSegmentno 
0043,1008RespiratoryRateBpmno 
0043,1009RespiratoryTriggerPointno 
0043,100ATypeOfReceiverUsedno 
0043,100BPeakRateOfChangeOfGradientFieldno 
0043,100CLimitsInUnitsOfPercentno 
0043,100DPSDEstimatedLimitno 
0043,100EPSDEstimatedLimitInTeslaPerSecondno 
0043,100FSaravgheadno 
0043,1010WindowValueno 
0043,1011TotalInputViewsno 
0043,1012X-RayChainno 
0043,1013DeconKernelParametersno 
0043,1014CalibrationParametersno 
0043,1015TotalOutputViewsno 
0043,1016NumberOfOverrangesno 
0043,1017IBHImageScaleFactorsno 
0043,1018BBHCoefficientsno 
0043,1019NumberOfBBHChainsToBlendno 
0043,101AStartingChannelNumberno 
0043,101BPpscanParametersno 
0043,101CGEImageIntegrityno 
0043,101DLevelValueno 
0043,101EDeltaStartTimeno 
0043,101FMaxOverrangesInAViewno 
0043,1020AvgOverrangesAllViewsno 
0043,1021CorrectedAfterGlowTermsno 
0043,1025ReferenceChannelsno 
0043,1026NoViewsRefChansBlockedno 
0043,1027ScanPitchRationo 
0043,1028UniqueImageIdenno 
0043,1029HistogramTablesno 
0043,102AUserDefinedDatano 
0043,102BPrivateScanOptionsno 
0043,102CEffectiveEchoSpacingno 
0043,102DStringSlopField1no 
0043,102EStringSlopField2no 
0043,102FRawDataTypeno 
0043,1030RawDataTypeno 
0043,1031RACordOfTargetReconCenterno 
0043,1032RawDataTypeno 
0043,1033NegScanspacingno 
0043,1034OffsetFrequencyno 
0043,1035UserUsageTagno 
0043,1036UserFillMapMSWno 
0043,1037UserFillMapLSWno 
0043,1038User25-48no 
0043,1039SlopInt6-9no 
0043,1040TriggerOnPositionno 
0043,1041DegreeOfRotationno 
0043,1042DASTriggerSourceno 
0043,1043DASFpaGainno 
0043,1044DASOutputSourceno 
0043,1045DASAdInputno 
0043,1046DASCalModeno 
0043,1047DASCalFrequencyno 
0043,1048DASRegXmno 
0043,1049DASAutoZerono 
0043,104AStartingChannelOfViewno 
0043,104BDASXmPatternno 
0043,104CTGGCTriggerModeno 
0043,104DStartScanToXrayOnDelayno 
0043,104EDurationOfXrayOnno 
0043,1060SlopInt10-17no 
0043,1061ScannerStudyEntityUIDno 
0043,1062ScannerStudyIDno 
0043,106fScannerTableEntryno 
0044,0001ProductPackageIdentifierno 
0044,0002SubstanceAdministrationApprovalno 
0044,0003ApprovalStatusFurtherDescriptionno 
0044,0004ApprovalStatusDateTimeno 
0044,0007ProductTypeCodeSequenceno 
0044,0008ProductNameno 
0044,0009ProductDescriptionno 
0044,000AProductLotIdentifierno 
0044,000BProductExpirationDateTimeno 
0044,0010SubstanceAdministrationDateTimeno 
0044,0011SubstanceAdministrationNotesno 
0044,0012SubstanceAdministrationDeviceIDno 
0044,0013ProductParameterSequenceno 
0044,0019SubstanceAdminParameterSeqno 
0045,1001NumberOfMacroRowsInDetectorno 
0045,1002MacroWidthAtISOCenterno 
0045,1003DASTypeno 
0045,1004DASGainno 
0045,1005DASTemperatureno 
0045,1006TableDirectionInOrOutno 
0045,1007ZSmoothingFactorno 
0045,1008ViewWeightingModeno 
0045,1009SigmaRowNumberWhichRowsWereUsedno 
0045,100AMinimumDasValueFoundInTheScanDatano 
0045,100BMaximumOffsetShiftValueUsedno 
0045,100CNumberOfViewsShiftedno 
0045,100DZTrackingFlagno 
0045,100EMeanZErrorno 
0045,100FZTrackingMaximumErrorno 
0045,1010StartingViewForRow2ano 
0045,1011NumberOfViewsInRow2ano 
0045,1012StartingViewForRow1ano 
0045,1013SigmaModeno 
0045,1014NumberOfViewsInRow1ano 
0045,1015StartingViewForRow2bno 
0045,1016NumberOfViewsInRow2bno 
0045,1017StartingViewForRow1bno 
0045,1018NumberOfViewsInRow1bno 
0045,1019AirFilterCalibrationDateno 
0045,101AAirFilterCalibrationTimeno 
0045,101BPhantomCalibrationDateno 
0045,101CPhantomCalibrationTimeno 
0045,101DZSlopeCalibrationDateno 
0045,101EZSlopeCalibrationTimeno 
0045,101FCrosstalkCalibrationDateno 
0045,1020CrosstalkCalibrationTimeno 
0045,1021IterboneOptionFlagno 
0045,1022PeristalticFlagOptionno 
0046,0012LensDescriptionno 
0046,0014RightLensSequenceno 
0046,0015LeftLensSequenceno 
0046,0018CylinderSequenceno 
0046,0028PrismSequenceno 
0046,0030HorizontalPrismPowerno 
0046,0032HorizontalPrismBaseno 
0046,0034VerticalPrismPowerno 
0046,0036VerticalPrismBaseno 
0046,0038LensSegmentTypeno 
0046,0040OpticalTransmittanceno 
0046,0042ChannelWidthno 
0046,0044PupilSizeno 
0046,0046CornealSizeno 
0046,0060DistancePupillaryDistanceno 
0046,0062NearPupillaryDistanceno 
0046,0064OtherPupillaryDistanceno 
0046,0075RadiusOfCurvatureno 
0046,0076KeratometricPowerno 
0046,0077KeratometricAxisno 
0046,0092BackgroundColorno 
0046,0094Optotypeno 
0046,0095OptotypePresentationno 
0046,0100AddNearSequenceno 
0046,0101AddIntermediateSequenceno 
0046,0102AddOtherSequenceno 
0046,0104AddPowerno 
0046,0106ViewingDistanceno 
0046,0125ViewingDistanceTypeno 
0046,0135VisualAcuityModifiersno 
0046,0137DecimalVisualAcuityno 
0046,0139OptotypeDetailedDefinitionno 
0046,0146SpherePowerno 
0046,0147CylinderPowerno 
0050,0004CalibrationImageno 
0050,0010DeviceSequenceno 
0050,0014DeviceLengthno 
0050,0015ContainerComponentWidthno 
0050,0016DeviceDiameterno 
0050,0017DeviceDiameterUnitsno 
0050,0018DeviceVolumeno 
0050,0019InterMarkerDistanceno 
0050,001BContainerComponentIDno 
0050,0020DeviceDescriptionno 
0054,0010EnergyWindowVectorno 
0054,0011NumberOfEnergyWindowsno 
0054,0012EnergyWindowInformationSequenceno 
0054,0013EnergyWindowRangeSequenceno 
0054,0014EnergyWindowLowerLimitno 
0054,0015EnergyWindowUpperLimitno 
0054,0016RadiopharmaceuticalInformationSeqno 
0054,0017ResidualSyringeCountsno 
0054,0018EnergyWindowNameno 
0054,0020DetectorVectorno 
0054,0021NumberOfDetectorsno 
0054,0022DetectorInformationSequenceno 
0054,0030PhaseVectorno 
0054,0031NumberOfPhasesno 
0054,0032PhaseInformationSequenceno 
0054,0033NumberOfFramesInPhaseno 
0054,0036PhaseDelayno 
0054,0038PauseBetweenFramesno 
0054,0039PhaseDescriptionno 
0054,0050RotationVectorno 
0054,0051NumberOfRotationsno 
0054,0052RotationInformationSequenceno 
0054,0053NumberOfFramesInRotationno 
0054,0060RRIntervalVectorno 
0054,0061NumberOfRRIntervalsno 
0054,0062GatedInformationSequenceno 
0054,0063DataInformationSequenceno 
0054,0070TimeSlotVectorno 
0054,0071NumberOfTimeSlotsno 
0054,0072TimeSlotInformationSequenceno 
0054,0073TimeSlotTimeno 
0054,0080SliceVectorno 
0054,0081NumberOfSlicesno 
0054,0090AngularViewVectorno 
0054,0100TimeSliceVectorno 
0054,0101NumberOfTimeSlicesno 
0054,0200StartAngleno 
0054,0202TypeOfDetectorMotionno 
0054,0210TriggerVectorno 
0054,0211NumberOfTriggersInPhaseno 
0054,0220ViewCodeSequenceno 
0054,0222ViewModifierCodeSequenceno 
0054,0300RadionuclideCodeSequenceno 
0054,0302AdministrationRouteCodeSequenceno 
0054,0304RadiopharmaceuticalCodeSequenceno 
0054,0306CalibrationDataSequenceno 
0054,0308EnergyWindowNumberno 
0054,0400ImageIDno 
0054,0410PatientOrientationCodeSequenceno 
0054,0412PatientOrientationModifierCodeSeqno 
0054,0414PatientGantryRelationshipCodeSeqno 
0054,0500SliceProgressionDirectionno 
0054,1000SeriesTypeno 
0054,1001Unitsno 
0054,1002CountsSourceno 
0054,1004ReprojectionMethodno 
0054,1100RandomsCorrectionMethodno 
0054,1101AttenuationCorrectionMethodno 
0054,1102DecayCorrectionno 
0054,1103ReconstructionMethodno 
0054,1104DetectorLinesOfResponseUsedno 
0054,1105ScatterCorrectionMethodno 
0054,1200AxialAcceptanceno 
0054,1201AxialMashno 
0054,1202TransverseMashno 
0054,1203DetectorElementSizeno 
0054,1210CoincidenceWindowWidthno 
0054,1220SecondaryCountsTypeno 
0054,1300FrameReferenceTimeno 
0054,1310PrimaryCountsAccumulatedno 
0054,1311SecondaryCountsAccumulatedno 
0054,1320SliceSensitivityFactorno 
0054,1321DecayFactorno 
0054,1322DoseCalibrationFactorno 
0054,1323ScatterFractionFactorno 
0054,1324DeadTimeFactorno 
0054,1330ImageIndexno 
0054,1400CountsIncludedno 
0054,1401DeadTimeCorrectionFlagno 
0060,3000HistogramSequenceno 
0060,3002HistogramNumberOfBinsno 
0060,3004HistogramFirstBinValueno 
0060,3006HistogramLastBinValueno 
0060,3008HistogramBinWidthno 
0060,3010HistogramExplanationno 
0060,3020HistogramDatano 
0062,0001SegmentationTypeno 
0062,0002SegmentSequenceno 
0062,0003SegmentedPropertyCategoryCodeSeqno 
0062,0004SegmentNumberno 
0062,0005SegmentLabelno 
0062,0006SegmentDescriptionno 
0062,0008SegmentAlgorithmTypeno 
0062,0009SegmentAlgorithmNameno 
0062,000ASegmentIdentificationSequenceno 
0062,000BReferencedSegmentNumberno 
0062,000CRecommendedDisplayGrayscaleValueno 
0062,000DRecommendedDisplayCIELabValueno 
0062,000EMaximumFractionalValueno 
0062,000FSegmentedPropertyTypeCodeSequenceno 
0062,0010SegmentationFractionalTypeno 
0064,0002DeformableRegistrationSequenceno 
0064,0003SourceFrameOfReferenceUIDno 
0064,0005DeformableRegistrationGridSequenceno 
0064,0007GridDimensionsno 
0064,0008GridResolutionno 
0064,0009VectorGridDatano 
0064,000FPreDeformationMatrixRegistSeqno 
0064,0010PostDeformationMatrixRegistSeqno 
0066,0001NumberOfSurfacesno 
0066,0002SurfaceSequenceno 
0066,0003SurfaceNumberno 
0066,0004SurfaceCommentsno 
0066,0009SurfaceProcessingno 
0066,000ASurfaceProcessingRationo 
0066,000EFiniteVolumeno 
0066,0010Manifoldno 
0066,0011SurfacePointsSequenceno 
0066,0015NumberOfSurfacePointsno 
0066,0016PointCoordinatesDatano 
0066,0017PointPositionAccuracyno 
0066,0018MeanPointDistanceno 
0066,0019MaximumPointDistanceno 
0066,001BAxisOfRotationno 
0066,001CCenterOfRotationno 
0066,001ENumberOfVectorsno 
0066,001FVectorDimensionalityno 
0066,0020VectorAccuracyno 
0066,0021VectorCoordinateDatano 
0066,0023TrianglePointIndexListno 
0066,0024EdgePointIndexListno 
0066,0025VertexPointIndexListno 
0066,0026TriangleStripSequenceno 
0066,0027TriangleFanSequenceno 
0066,0028LineSequenceno 
0066,0029PrimitivePointIndexListno 
0066,002ASurfaceCountno 
0066,002FAlgorithmFamilyCodeSequno 
0066,0031AlgorithmVersionno 
0066,0032AlgorithmParametersno 
0066,0034FacetSequenceno 
0066,0036AlgorithmNameno 
0070,0001GraphicAnnotationSequenceno 
0070,0002GraphicLayerno 
0070,0003BoundingBoxAnnotationUnitsno 
0070,0004AnchorPointAnnotationUnitsno 
0070,0005GraphicAnnotationUnitsno 
0070,0006UnformattedTextValueno 
0070,0008TextObjectSequenceno 
0070,0009GraphicObjectSequenceno 
0070,0010BoundingBoxTopLeftHandCornerno 
0070,0011BoundingBoxBottomRightHandCornerno 
0070,0012BoundingBoxTextHorizJustificationno 
0070,0014AnchorPointno 
0070,0015AnchorPointVisibilityno 
0070,0020GraphicDimensionsno 
0070,0021NumberOfGraphicPointsno 
0070,0022GraphicDatano 
0070,0023GraphicTypeno 
0070,0024GraphicFilledno 
0070,0040ImageRotationRetiredno 
0070,0041ImageHorizontalFlipno 
0070,0042ImageRotationno 
0070,0050DisplayedAreaTopLeftTrialno 
0070,0051DisplayedAreaBottomRightTrialno 
0070,0052DisplayedAreaTopLeftno 
0070,0053DisplayedAreaBottomRightno 
0070,005ADisplayedAreaSelectionSequenceno 
0070,0060GraphicLayerSequenceno 
0070,0062GraphicLayerOrderno 
0070,0066GraphicLayerRecDisplayGraysclValueno 
0070,0067GraphicLayerRecDisplayRGBValueno 
0070,0068GraphicLayerDescriptionno 
0070,0080ContentLabelno 
0070,0081ContentDescriptionno 
0070,0082PresentationCreationDateno 
0070,0083PresentationCreationTimeno 
0070,0084ContentCreatorNameno 
0070,0086ContentCreatorIDCodeSequenceno 
0070,0100PresentationSizeModeno 
0070,0101PresentationPixelSpacingno 
0070,0102PresentationPixelAspectRationo 
0070,0103PresentationPixelMagRationo 
0070,0306ShapeTypeno 
0070,0308RegistrationSequenceno 
0070,0309MatrixRegistrationSequenceno 
0070,030AMatrixSequenceno 
0070,030CFrameOfRefTransformationMatrixTypeno 
0070,030DRegistrationTypeCodeSequenceno 
0070,030FFiducialDescriptionno 
0070,0310FiducialIdentifierno 
0070,0311FiducialIdentifierCodeSequenceno 
0070,0312ContourUncertaintyRadiusno 
0070,0314UsedFiducialsSequenceno 
0070,0318GraphicCoordinatesDataSequenceno 
0070,031AFiducialUIDno 
0070,031CFiducialSetSequenceno 
0070,031EFiducialSequenceno 
0070,0401GraphicLayerRecomDisplayCIELabValno 
0070,0402BlendingSequenceno 
0070,0403RelativeOpacityno 
0070,0404ReferencedSpatialRegistrationSeqno 
0070,0405BlendingPositionno 
0072,0002HangingProtocolNameno 
0072,0004HangingProtocolDescriptionno 
0072,0006HangingProtocolLevelno 
0072,0008HangingProtocolCreatorno 
0072,000AHangingProtocolCreationDateTimeno 
0072,000CHangingProtocolDefinitionSequenceno 
0072,000EHangingProtocolUserIDCodeSequenceno 
0072,0010HangingProtocolUserGroupNameno 
0072,0012SourceHangingProtocolSequenceno 
0072,0014NumberOfPriorsReferencedno 
0072,0020ImageSetsSequenceno 
0072,0022ImageSetSelectorSequenceno 
0072,0024ImageSetSelectorUsageFlagno 
0072,0026SelectorAttributeno 
0072,0028SelectorValueNumberno 
0072,0030TimeBasedImageSetsSequenceno 
0072,0032ImageSetNumberno 
0072,0034ImageSetSelectorCategoryno 
0072,0038RelativeTimeno 
0072,003ARelativeTimeUnitsno 
0072,003CAbstractPriorValueno 
0072,003EAbstractPriorCodeSequenceno 
0072,0040ImageSetLabelno 
0072,0050SelectorAttributeVRno 
0072,0052SelectorSequencePointerno 
0072,0054SelectorSeqPointerPrivateCreatorno 
0072,0056SelectorAttributePrivateCreatorno 
0072,0060SelectorATValueno 
0072,0062SelectorCSValueno 
0072,0064SelectorISValueno 
0072,0066SelectorLOValueno 
0072,0068SelectorLTValueno 
0072,006ASelectorPNValueno 
0072,006CSelectorSHValueno 
0072,006ESelectorSTValueno 
0072,0070SelectorUTValueno 
0072,0072SelectorDSValueno 
0072,0074SelectorFDValueno 
0072,0076SelectorFLValueno 
0072,0078SelectorULValueno 
0072,007ASelectorUSValueno 
0072,007CSelectorSLValueno 
0072,007ESelectorSSValueno 
0072,0080SelectorCodeSequenceValueno 
0072,0100NumberOfScreensno 
0072,0102NominalScreenDefinitionSequenceno 
0072,0104NumberOfVerticalPixelsno 
0072,0106NumberOfHorizontalPixelsno 
0072,0108DisplayEnvironmentSpatialPositionno 
0072,010AScreenMinimumGrayscaleBitDepthno 
0072,010CScreenMinimumColorBitDepthno 
0072,010EApplicationMaximumRepaintTimeno 
0072,0200DisplaySetsSequenceno 
0072,0202DisplaySetNumberno 
0072,0203DisplaySetLabelno 
0072,0204DisplaySetPresentationGroupno 
0072,0206DisplaySetPresentationGroupDescrno 
0072,0208PartialDataDisplayHandlingno 
0072,0210SynchronizedScrollingSequenceno 
0072,0212DisplaySetScrollingGroupno 
0072,0214NavigationIndicatorSequenceno 
0072,0216NavigationDisplaySetno 
0072,0218ReferenceDisplaySetsno 
0072,0300ImageBoxesSequenceno 
0072,0302ImageBoxNumberno 
0072,0304ImageBoxLayoutTypeno 
0072,0306ImageBoxTileHorizontalDimensionno 
0072,0308ImageBoxTileVerticalDimensionno 
0072,0310ImageBoxScrollDirectionno 
0072,0312ImageBoxSmallScrollTypeno 
0072,0314ImageBoxSmallScrollAmountno 
0072,0316ImageBoxLargeScrollTypeno 
0072,0318ImageBoxLargeScrollAmountno 
0072,0320ImageBoxOverlapPriorityno 
0072,0330CineRelativeToRealTimeno 
0072,0400FilterOperationsSequenceno 
0072,0402FilterByCategoryno 
0072,0404FilterByAttributePresenceno 
0072,0406FilterByOperatorno 
0072,0432SynchronizedImageBoxListno 
0072,0434TypeOfSynchronizationno 
0072,0500BlendingOperationTypeno 
0072,0510ReformattingOperationTypeno 
0072,0512ReformattingThicknessno 
0072,0514ReformattingIntervalno 
0072,0516ReformattingOpInitialViewDirno 
0072,0520RenderingType3Dno 
0072,0600SortingOperationsSequenceno 
0072,0602SortByCategoryno 
0072,0604SortingDirectionno 
0072,0700DisplaySetPatientOrientationno 
0072,0702VOITypeno 
0072,0704PseudoColorTypeno 
0072,0706ShowGrayscaleInvertedno 
0072,0710ShowImageTrueSizeFlagno 
0072,0712ShowGraphicAnnotationFlagno 
0072,0714ShowPatientDemographicsFlagno 
0072,0716ShowAcquisitionTechniquesFlagno 
0072,0717DisplaySetHorizontalJustificationno 
0072,0718DisplaySetVerticalJustificationno 
0074,1000UnifiedProcedureStepStateno 
0074,1002UPSProgressInformationSequenceno 
0074,1004UnifiedProcedureStepProgressno 
0074,1006UnifiedProcedureStepProgressDescrno 
0074,1008UnifiedProcedureStepComURISeqno 
0074,100aContactURIno 
0074,100cContactDisplayNameno 
0074,1020BeamTaskSequenceno 
0074,1022BeamTaskTypeno 
0074,1024BeamOrderIndexno 
0074,1030DeliveryVerificationImageSequenceno 
0074,1032VerificationImageTimingno 
0074,1034DoubleExposureFlagno 
0074,1036DoubleExposureOrderingno 
0074,1038DoubleExposureMetersetno 
0074,103ADoubleExposureFieldDeltano 
0074,1040RelatedReferenceRTImageSequenceno 
0074,1042GeneralMachineVerificationSequenceno 
0074,1044ConventionalMachineVerificationSeqno 
0074,1046IonMachineVerificationSequenceno 
0074,1048FailedAttributesSequenceno 
0074,104AOverriddenAttributesSequenceno 
0074,104CConventionalControlPointVerifySeqno 
0074,104EIonControlPointVerificationSeqno 
0074,1050AttributeOccurrenceSequenceno 
0074,1052AttributeOccurrencePointerno 
0074,1054AttributeItemSelectorno 
0074,1056AttributeOccurrencePrivateCreatorno 
0074,1200ScheduledProcedureStepPriorityno 
0074,1202WorklistLabelno 
0074,1204ProcedureStepLabelno 
0074,1210ScheduledProcessingParametersSeqno 
0074,1212PerformedProcessingParametersSeqno 
0074,1216UPSPerformedProcedureSequenceno 
0074,1220RelatedProcedureStepSequenceno 
0074,1222ProcedureStepRelationshipTypeno 
0074,1230DeletionLockno 
0074,1234ReceivingAEno 
0074,1236RequestingAEno 
0074,1238ReasonForCancellationno 
0074,1242SCPStatusno 
0074,1244SubscriptionListStatusno 
0074,1246UPSListStatusno 
0088,0130StorageMediaFileSetIDno 
0088,0140StorageMediaFileSetUIDno 
0088,0200IconImageSequenceno 
0088,0904TopicTitleno 
0088,0906TopicSubjectno 
0088,0910TopicAuthorno 
0088,0912TopicKeywordsno 
0100,0410SOPInstanceStatusno 
0100,0420SOPAuthorizationDateAndTimeno 
0100,0424SOPAuthorizationCommentno 
0100,0426AuthorizationEquipmentCertNumberno 
0400,0005MACIDNumberno 
0400,0010MACCalculationTransferSyntaxUIDno 
0400,0015MACAlgorithmno 
0400,0020DataElementsSignedno 
0400,0100DigitalSignatureUIDno 
0400,0105DigitalSignatureDateTimeno 
0400,0110CertificateTypeno 
0400,0115CertificateOfSignerno 
0400,0120Signatureno 
0400,0305CertifiedTimestampTypeno 
0400,0310CertifiedTimestampno 
0400,0401DigitalSignaturePurposeCodeSeqno 
0400,0402ReferencedDigitalSignatureSeqno 
0400,0403ReferencedSOPInstanceMACSeqno 
0400,0404MACno 
0400,0500EncryptedAttributesSequenceno 
0400,0510EncryptedContentTransferSyntaxUIDno 
0400,0520EncryptedContentno 
0400,0550ModifiedAttributesSequenceno 
0400,0561OriginalAttributesSequenceno 
0400,0562AttributeModificationDateTimeno 
0400,0563ModifyingSystemno 
0400,0564SourceOfPreviousValuesno 
0400,0565ReasonForTheAttributeModificationno 
1000,xxx0EscapeTripletno 
1000,xxx1RunLengthTripletno 
1000,xxx2HuffmanTableSizeno 
1000,xxx3HuffmanTableTripletno 
1000,xxx4ShiftTableSizeno 
1000,xxx5ShiftTableTripletno 
1010,xxxxZonalMapno 
2000,0010NumberOfCopiesno 
2000,001EPrinterConfigurationSequenceno 
2000,0020PrintPriorityno 
2000,0030MediumTypeno 
2000,0040FilmDestinationno 
2000,0050FilmSessionLabelno 
2000,0060MemoryAllocationno 
2000,0061MaximumMemoryAllocationno 
2000,0062ColorImagePrintingFlagno 
2000,0063CollationFlagno 
2000,0065AnnotationFlagno 
2000,0067ImageOverlayFlagno 
2000,0069PresentationLUTFlagno 
2000,006AImageBoxPresentationLUTFlagno 
2000,00A0MemoryBitDepthno 
2000,00A1PrintingBitDepthno 
2000,00A2MediaInstalledSequenceno 
2000,00A4OtherMediaAvailableSequenceno 
2000,00A8SupportedImageDisplayFormatSeqno 
2000,0500ReferencedFilmBoxSequenceno 
2000,0510ReferencedStoredPrintSequenceno 
2010,0010ImageDisplayFormatno 
2010,0030AnnotationDisplayFormatIDno 
2010,0040FilmOrientationno 
2010,0050FilmSizeIDno 
2010,0052PrinterResolutionIDno 
2010,0054DefaultPrinterResolutionIDno 
2010,0060MagnificationTypeno 
2010,0080SmoothingTypeno 
2010,00A6DefaultMagnificationTypeno 
2010,00A7OtherMagnificationTypesAvailableno 
2010,00A8DefaultSmoothingTypeno 
2010,00A9OtherSmoothingTypesAvailableno 
2010,0100BorderDensityno 
2010,0110EmptyImageDensityno 
2010,0120MinDensityno 
2010,0130MaxDensityno 
2010,0140Trimno 
2010,0150ConfigurationInformationno 
2010,0152ConfigurationInformationDescrno 
2010,0154MaximumCollatedFilmsno 
2010,015EIlluminationno 
2010,0160ReflectedAmbientLightno 
2010,0376PrinterPixelSpacingno 
2010,0500ReferencedFilmSessionSequenceno 
2010,0510ReferencedImageBoxSequenceno 
2010,0520ReferencedBasicAnnotationBoxSeqno 
2020,0010ImageBoxPositionno 
2020,0020Polarityno 
2020,0030RequestedImageSizeno 
2020,0040RequestedDecimate-CropBehaviorno 
2020,0050RequestedResolutionIDno 
2020,00A0RequestedImageSizeFlagno 
2020,00A2DecimateCropResultno 
2020,0110BasicGrayscaleImageSequenceno 
2020,0111BasicColorImageSequenceno 
2020,0130ReferencedImageOverlayBoxSequenceno 
2020,0140ReferencedVOILUTBoxSequenceno 
2030,0010AnnotationPositionno 
2030,0020TextStringno 
2040,0010ReferencedOverlayPlaneSequenceno 
2040,0011ReferencedOverlayPlaneGroupsno 
2040,0020OverlayPixelDataSequenceno 
2040,0060OverlayMagnificationTypeno 
2040,0070OverlaySmoothingTypeno 
2040,0072OverlayOrImageMagnificationno 
2040,0074MagnifyToNumberOfColumnsno 
2040,0080OverlayForegroundDensityno 
2040,0082OverlayBackgroundDensityno 
2040,0090OverlayModeno 
2040,0100ThresholdDensityno 
2040,0500ReferencedImageBoxSequenceno 
2050,0010PresentationLUTSequenceno 
2050,0020PresentationLUTShapeno 
2050,0500ReferencedPresentationLUTSequenceno 
2100,0010PrintJobIDno 
2100,0020ExecutionStatusno 
2100,0030ExecutionStatusInfono 
2100,0040CreationDateno 
2100,0050CreationTimeno 
2100,0070Originatorno 
2100,0140DestinationAEno 
2100,0160OwnerIDno 
2100,0170NumberOfFilmsno 
2100,0500ReferencedPrintJobSequenceno 
2110,0010PrinterStatusno 
2110,0020PrinterStatusInfono 
2110,0030PrinterNameno 
2110,0099PrintQueueIDno 
2120,0010QueueStatusno 
2120,0050PrintJobDescriptionSequenceno 
2120,0070ReferencedPrintJobSequenceno 
2130,0010PrintManagementCapabilitiesSeqno 
2130,0015PrinterCharacteristicsSequenceno 
2130,0030FilmBoxContentSequenceno 
2130,0040ImageBoxContentSequenceno 
2130,0050AnnotationContentSequenceno 
2130,0060ImageOverlayBoxContentSequenceno 
2130,0080PresentationLUTContentSequenceno 
2130,00A0ProposedStudySequenceno 
2130,00C0OriginalImageSequenceno 
2200,0001LabelFromInfoExtractedFromInstanceno 
2200,0002LabelTextno 
2200,0003LabelStyleSelectionno 
2200,0004MediaDispositionno 
2200,0005BarcodeValueno 
2200,0006BarcodeSymbologyno 
2200,0007AllowMediaSplittingno 
2200,0008IncludeNonDICOMObjectsno 
2200,0009IncludeDisplayApplicationno 
2200,000ASaveCompInstancesAfterMediaCreateno 
2200,000BTotalNumberMediaPiecesCreatedno 
2200,000CRequestedMediaApplicationProfileno 
2200,000DReferencedStorageMediaSequenceno 
2200,000EFailureAttributesno 
2200,000FAllowLossyCompressionno 
2200,0020RequestPriorityno 
3002,0002RTImageLabelno 
3002,0003RTImageNameno 
3002,0004RTImageDescriptionno 
3002,000AReportedValuesOriginno 
3002,000CRTImagePlaneno 
3002,000DXRayImageReceptorTranslationno 
3002,000EXRayImageReceptorAngleno 
3002,0010RTImageOrientationno 
3002,0011ImagePlanePixelSpacingno 
3002,0012RTImagePositionno 
3002,0020RadiationMachineNameno 
3002,0022RadiationMachineSADno 
3002,0024RadiationMachineSSDno 
3002,0026RTImageSIDno 
3002,0028SourceToReferenceObjectDistanceno 
3002,0029FractionNumberno 
3002,0030ExposureSequenceno 
3002,0032MetersetExposureno 
3002,0034DiaphragmPositionno 
3002,0040FluenceMapSequenceno 
3002,0041FluenceDataSourceno 
3002,0042FluenceDataScaleno 
3002,0051FluenceModeno 
3002,0052FluenceModeIDno 
3004,0001DVHTypeno 
3004,0002DoseUnitsno 
3004,0004DoseTypeno 
3004,0006DoseCommentno 
3004,0008NormalizationPointno 
3004,000ADoseSummationTypeno 
3004,000CGridFrameOffsetVectorno 
3004,000EDoseGridScalingno 
3004,0010RTDoseROISequenceno 
3004,0012DoseValueno 
3004,0014TissueHeterogeneityCorrectionno 
3004,0040DVHNormalizationPointno 
3004,0042DVHNormalizationDoseValueno 
3004,0050DVHSequenceno 
3004,0052DVHDoseScalingno 
3004,0054DVHVolumeUnitsno 
3004,0056DVHNumberOfBinsno 
3004,0058DVHDatano 
3004,0060DVHReferencedROISequenceno 
3004,0062DVHROIContributionTypeno 
3004,0070DVHMinimumDoseno 
3004,0072DVHMaximumDoseno 
3004,0074DVHMeanDoseno 
3006,0002StructureSetLabelno 
3006,0004StructureSetNameno 
3006,0006StructureSetDescriptionno 
3006,0008StructureSetDateno 
3006,0009StructureSetTimeno 
3006,0010ReferencedFrameOfReferenceSequenceno 
3006,0012RTReferencedStudySequenceno 
3006,0014RTReferencedSeriesSequenceno 
3006,0016ContourImageSequenceno 
3006,0020StructureSetROISequenceno 
3006,0022ROINumberno 
3006,0024ReferencedFrameOfReferenceUIDno 
3006,0026ROINameno 
3006,0028ROIDescriptionno 
3006,002AROIDisplayColorno 
3006,002CROIVolumeno 
3006,0030RTRelatedROISequenceno 
3006,0033RTROIRelationshipno 
3006,0036ROIGenerationAlgorithmno 
3006,0038ROIGenerationDescriptionno 
3006,0039ROIContourSequenceno 
3006,0040ContourSequenceno 
3006,0042ContourGeometricTypeno 
3006,0044ContourSlabThicknessno 
3006,0045ContourOffsetVectorno 
3006,0046NumberOfContourPointsno 
3006,0048ContourNumberno 
3006,0049AttachedContoursno 
3006,0050ContourDatano 
3006,0080RTROIObservationsSequenceno 
3006,0082ObservationNumberno 
3006,0084ReferencedROINumberno 
3006,0085ROIObservationLabelno 
3006,0086RTROIIdentificationCodeSequenceno 
3006,0088ROIObservationDescriptionno 
3006,00A0RelatedRTROIObservationsSequenceno 
3006,00A4RTROIInterpretedTypeno 
3006,00A6ROIInterpreterno 
3006,00B0ROIPhysicalPropertiesSequenceno 
3006,00B2ROIPhysicalPropertyno 
3006,00B4ROIPhysicalPropertyValueno 
3006,00B6ROIElementalCompositionSequenceno 
3006,00B7ROIElementalCompAtomicNumberno 
3006,00B8ROIElementalCompAtomicMassFractionno 
3006,00C0FrameOfReferenceRelationshipSeqno 
3006,00C2RelatedFrameOfReferenceUIDno 
3006,00C4FrameOfReferenceTransformTypeno 
3006,00C6FrameOfReferenceTransformMatrixno 
3006,00C8FrameOfReferenceTransformCommentno 
3008,0010MeasuredDoseReferenceSequenceno 
3008,0012MeasuredDoseDescriptionno 
3008,0014MeasuredDoseTypeno 
3008,0016MeasuredDoseValueno 
3008,0020TreatmentSessionBeamSequenceno 
3008,0021TreatmentSessionIonBeamSequenceno 
3008,0022CurrentFractionNumberno 
3008,0024TreatmentControlPointDateno 
3008,0025TreatmentControlPointTimeno 
3008,002ATreatmentTerminationStatusno 
3008,002BTreatmentTerminationCodeno 
3008,002CTreatmentVerificationStatusno 
3008,0030ReferencedTreatmentRecordSequenceno 
3008,0032SpecifiedPrimaryMetersetno 
3008,0033SpecifiedSecondaryMetersetno 
3008,0036DeliveredPrimaryMetersetno 
3008,0037DeliveredSecondaryMetersetno 
3008,003ASpecifiedTreatmentTimeno 
3008,003BDeliveredTreatmentTimeno 
3008,0040ControlPointDeliverySequenceno 
3008,0041IonControlPointDeliverySequenceno 
3008,0042SpecifiedMetersetno 
3008,0044DeliveredMetersetno 
3008,0045MetersetRateSetno 
3008,0046MetersetRateDeliveredno 
3008,0047ScanSpotMetersetsDeliveredno 
3008,0048DoseRateDeliveredno 
3008,0050TreatmentSummaryCalcDoseRefSeqno 
3008,0052CumulativeDoseToDoseReferenceno 
3008,0054FirstTreatmentDateno 
3008,0056MostRecentTreatmentDateno 
3008,005ANumberOfFractionsDeliveredno 
3008,0060OverrideSequenceno 
3008,0061ParameterSequencePointerno 
3008,0062OverrideParameterPointerno 
3008,0063ParameterItemIndexno 
3008,0064MeasuredDoseReferenceNumberno 
3008,0065ParameterPointerno 
3008,0066OverrideReasonno 
3008,0068CorrectedParameterSequenceno 
3008,006ACorrectionValueno 
3008,0070CalculatedDoseReferenceSequenceno 
3008,0072CalculatedDoseReferenceNumberno 
3008,0074CalculatedDoseReferenceDescriptionno 
3008,0076CalculatedDoseReferenceDoseValueno 
3008,0078StartMetersetno 
3008,007AEndMetersetno 
3008,0080ReferencedMeasuredDoseReferenceSeqno 
3008,0082ReferencedMeasuredDoseReferenceNumno 
3008,0090ReferencedCalculatedDoseRefSeqno 
3008,0092ReferencedCalculatedDoseRefNumberno 
3008,00A0BeamLimitingDeviceLeafPairsSeqno 
3008,00B0RecordedWedgeSequenceno 
3008,00C0RecordedCompensatorSequenceno 
3008,00D0RecordedBlockSequenceno 
3008,00E0TreatmentSummaryMeasuredDoseRefSeqno 
3008,00F0RecordedSnoutSequenceno 
3008,00F2RecordedRangeShifterSequenceno 
3008,00F4RecordedLateralSpreadingDeviceSeqno 
3008,00F6RecordedRangeModulatorSequenceno 
3008,0100RecordedSourceSequenceno 
3008,0105SourceSerialNumberno 
3008,0110TreatmentSessionAppSetupSeqno 
3008,0116ApplicationSetupCheckno 
3008,0120RecordedBrachyAccessoryDeviceSeqno 
3008,0122ReferencedBrachyAccessoryDeviceNumno 
3008,0130RecordedChannelSequenceno 
3008,0132SpecifiedChannelTotalTimeno 
3008,0134DeliveredChannelTotalTimeno 
3008,0136SpecifiedNumberOfPulsesno 
3008,0138DeliveredNumberOfPulsesno 
3008,013ASpecifiedPulseRepetitionIntervalno 
3008,013CDeliveredPulseRepetitionIntervalno 
3008,0140RecordedSourceApplicatorSequenceno 
3008,0142ReferencedSourceApplicatorNumberno 
3008,0150RecordedChannelShieldSequenceno 
3008,0152ReferencedChannelShieldNumberno 
3008,0160BrachyControlPointDeliveredSeqno 
3008,0162SafePositionExitDateno 
3008,0164SafePositionExitTimeno 
3008,0166SafePositionReturnDateno 
3008,0168SafePositionReturnTimeno 
3008,0200CurrentTreatmentStatusno 
3008,0202TreatmentStatusCommentno 
3008,0220FractionGroupSummarySequenceno 
3008,0223ReferencedFractionNumberno 
3008,0224FractionGroupTypeno 
3008,0230BeamStopperPositionno 
3008,0240FractionStatusSummarySequenceno 
3008,0250TreatmentDateno 
3008,0251TreatmentTimeno 
300A,0002RTPlanLabelno 
300A,0003RTPlanNameno 
300A,0004RTPlanDescriptionno 
300A,0006RTPlanDateno 
300A,0007RTPlanTimeno 
300A,0009TreatmentProtocolsno 
300A,000APlanIntentno 
300A,000BTreatmentSitesno 
300A,000CRTPlanGeometryno 
300A,000EPrescriptionDescriptionno 
300A,0010DoseReferenceSequenceno 
300A,0012DoseReferenceNumberno 
300A,0013DoseReferenceUIDno 
300A,0014DoseReferenceStructureTypeno 
300A,0015NominalBeamEnergyUnitno 
300A,0016DoseReferenceDescriptionno 
300A,0018DoseReferencePointCoordinatesno 
300A,001ANominalPriorDoseno 
300A,0020DoseReferenceTypeno 
300A,0021ConstraintWeightno 
300A,0022DeliveryWarningDoseno 
300A,0023DeliveryMaximumDoseno 
300A,0025TargetMinimumDoseno 
300A,0026TargetPrescriptionDoseno 
300A,0027TargetMaximumDoseno 
300A,0028TargetUnderdoseVolumeFractionno 
300A,002AOrganAtRiskFullVolumeDoseno 
300A,002BOrganAtRiskLimitDoseno 
300A,002COrganAtRiskMaximumDoseno 
300A,002DOrganAtRiskOverdoseVolumeFractionno 
300A,0040ToleranceTableSequenceno 
300A,0042ToleranceTableNumberno 
300A,0043ToleranceTableLabelno 
300A,0044GantryAngleToleranceno 
300A,0046BeamLimitingDeviceAngleToleranceno 
300A,0048BeamLimitingDeviceToleranceSeqno 
300A,004ABeamLimitingDevicePositionTolno 
300A,004BSnoutPositionToleranceno 
300A,004CPatientSupportAngleToleranceno 
300A,004ETableTopEccentricAngleToleranceno 
300A,004FTableTopPitchAngleToleranceno 
300A,0050TableTopRollAngleToleranceno 
300A,0051TableTopVerticalPositionToleranceno 
300A,0052TableTopLongitudinalPositionTolno 
300A,0053TableTopLateralPositionToleranceno 
300A,0055RTPlanRelationshipno 
300A,0070FractionGroupSequenceno 
300A,0071FractionGroupNumberno 
300A,0072FractionGroupDescriptionno 
300A,0078NumberOfFractionsPlannedno 
300A,0079NumberFractionPatternDigitsPerDayno 
300A,007ARepeatFractionCycleLengthno 
300A,007BFractionPatternno 
300A,0080NumberOfBeamsno 
300A,0082BeamDoseSpecificationPointno 
300A,0084BeamDoseno 
300A,0086BeamMetersetno 
300A,0088BeamDosePointDepthno 
300A,0089BeamDosePointEquivalentDepthno 
300A,008ABeamDosePointSSDno 
300A,00A0NumberOfBrachyApplicationSetupsno 
300A,00A2BrachyAppSetupDoseSpecPointno 
300A,00A4BrachyApplicationSetupDoseno 
300A,00B0BeamSequenceno 
300A,00B2TreatmentMachineNameno 
300A,00B3PrimaryDosimeterUnitno 
300A,00B4SourceAxisDistanceno 
300A,00B6BeamLimitingDeviceSequenceno 
300A,00B8RTBeamLimitingDeviceTypeno 
300A,00BASourceToBeamLimitingDeviceDistanceno 
300A,00BBIsocenterToBeamLimitingDeviceDistno 
300A,00BCNumberOfLeafJawPairsno 
300A,00BELeafPositionBoundariesno 
300A,00C0BeamNumberno 
300A,00C2BeamNameno 
300A,00C3BeamDescriptionno 
300A,00C4BeamTypeno 
300A,00C6RadiationTypeno 
300A,00C7HighDoseTechniqueTypeno 
300A,00C8ReferenceImageNumberno 
300A,00CAPlannedVerificationImageSequenceno 
300A,00CCImagingDeviceSpecificAcqParamsno 
300A,00CETreatmentDeliveryTypeno 
300A,00D0NumberOfWedgesno 
300A,00D1WedgeSequenceno 
300A,00D2WedgeNumberno 
300A,00D3WedgeTypeno 
300A,00D4WedgeIDno 
300A,00D5WedgeAngleno 
300A,00D6WedgeFactorno 
300A,00D7TotalWedgeTrayWaterEquivThicknessno 
300A,00D8WedgeOrientationno 
300A,00D9IsocenterToWedgeTrayDistanceno 
300A,00DASourceToWedgeTrayDistanceno 
300A,00DBWedgeThinEdgePositionno 
300A,00DCBolusIDno 
300A,00DDBolusDescriptionno 
300A,00E0NumberOfCompensatorsno 
300A,00E1MaterialIDno 
300A,00E2TotalCompensatorTrayFactorno 
300A,00E3CompensatorSequenceno 
300A,00E4CompensatorNumberno 
300A,00E5CompensatorIDno 
300A,00E6SourceToCompensatorTrayDistanceno 
300A,00E7CompensatorRowsno 
300A,00E8CompensatorColumnsno 
300A,00E9CompensatorPixelSpacingno 
300A,00EACompensatorPositionno 
300A,00EBCompensatorTransmissionDatano 
300A,00ECCompensatorThicknessDatano 
300A,00EDNumberOfBolino 
300A,00EECompensatorTypeno 
300A,00F0NumberOfBlocksno 
300A,00F2TotalBlockTrayFactorno 
300A,00F3TotalBlockTrayWaterEquivThicknessno 
300A,00F4BlockSequenceno 
300A,00F5BlockTrayIDno 
300A,00F6SourceToBlockTrayDistanceno 
300A,00F7IsocenterToBlockTrayDistanceno 
300A,00F8BlockTypeno 
300A,00F9AccessoryCodeno 
300A,00FABlockDivergenceno 
300A,00FBBlockMountingPositionno 
300A,00FCBlockNumberno 
300A,00FEBlockNameno 
300A,0100BlockThicknessno 
300A,0102BlockTransmissionno 
300A,0104BlockNumberOfPointsno 
300A,0106BlockDatano 
300A,0107ApplicatorSequenceno 
300A,0108ApplicatorIDno 
300A,0109ApplicatorTypeno 
300A,010AApplicatorDescriptionno 
300A,010CCumulativeDoseReferenceCoefficientno 
300A,010EFinalCumulativeMetersetWeightno 
300A,0110NumberOfControlPointsno 
300A,0111ControlPointSequenceno 
300A,0112ControlPointIndexno 
300A,0114NominalBeamEnergyno 
300A,0115DoseRateSetno 
300A,0116WedgePositionSequenceno 
300A,0118WedgePositionno 
300A,011ABeamLimitingDevicePositionSequenceno 
300A,011CLeafJawPositionsno 
300A,011EGantryAngleno 
300A,011FGantryRotationDirectionno 
300A,0120BeamLimitingDeviceAngleno 
300A,0121BeamLimitingDeviceRotateDirectionno 
300A,0122PatientSupportAngleno 
300A,0123PatientSupportRotationDirectionno 
300A,0124TableTopEccentricAxisDistanceno 
300A,0125TableTopEccentricAngleno 
300A,0126TableTopEccentricRotateDirectionno 
300A,0128TableTopVerticalPositionno 
300A,0129TableTopLongitudinalPositionno 
300A,012ATableTopLateralPositionno 
300A,012CIsocenterPositionno 
300A,012ESurfaceEntryPointno 
300A,0130SourceToSurfaceDistanceno 
300A,0134CumulativeMetersetWeightno 
300A,0140TableTopPitchAngleno 
300A,0142TableTopPitchRotationDirectionno 
300A,0144TableTopRollAngleno 
300A,0146TableTopRollRotationDirectionno 
300A,0148HeadFixationAngleno 
300A,014AGantryPitchAngleno 
300A,014CGantryPitchRotationDirectionno 
300A,014EGantryPitchAngleToleranceno 
300A,0180PatientSetupSequenceno 
300A,0182PatientSetupNumberno 
300A,0183PatientSetupLabelno 
300A,0184PatientAdditionalPositionno 
300A,0190FixationDeviceSequenceno 
300A,0192FixationDeviceTypeno 
300A,0194FixationDeviceLabelno 
300A,0196FixationDeviceDescriptionno 
300A,0198FixationDevicePositionno 
300A,0199FixationDevicePitchAngleno 
300A,019AFixationDeviceRollAngleno 
300A,01A0ShieldingDeviceSequenceno 
300A,01A2ShieldingDeviceTypeno 
300A,01A4ShieldingDeviceLabelno 
300A,01A6ShieldingDeviceDescriptionno 
300A,01A8ShieldingDevicePositionno 
300A,01B0SetupTechniqueno 
300A,01B2SetupTechniqueDescriptionno 
300A,01B4SetupDeviceSequenceno 
300A,01B6SetupDeviceTypeno 
300A,01B8SetupDeviceLabelno 
300A,01BASetupDeviceDescriptionno 
300A,01BCSetupDeviceParameterno 
300A,01D0SetupReferenceDescriptionno 
300A,01D2TableTopVerticalSetupDisplacementno 
300A,01D4TableTopLongitudinalSetupDisplaceno 
300A,01D6TableTopLateralSetupDisplacementno 
300A,0200BrachyTreatmentTechniqueno 
300A,0202BrachyTreatmentTypeno 
300A,0206TreatmentMachineSequenceno 
300A,0210SourceSequenceno 
300A,0212SourceNumberno 
300A,0214SourceTypeno 
300A,0216SourceManufacturerno 
300A,0218ActiveSourceDiameterno 
300A,021AActiveSourceLengthno 
300A,0222SourceEncapsulationNomThicknessno 
300A,0224SourceEncapsulationNomTransmissionno 
300A,0226SourceIsotopeNameno 
300A,0228SourceIsotopeHalfLifeno 
300A,0229SourceStrengthUnitsno 
300A,022AReferenceAirKermaRateno 
300A,022BSourceStrengthno 
300A,022CSourceStrengthReferenceDateno 
300A,022ESourceStrengthReferenceTimeno 
300A,0230ApplicationSetupSequenceno 
300A,0232ApplicationSetupTypeno 
300A,0234ApplicationSetupNumberno 
300A,0236ApplicationSetupNameno 
300A,0238ApplicationSetupManufacturerno 
300A,0240TemplateNumberno 
300A,0242TemplateTypeno 
300A,0244TemplateNameno 
300A,0250TotalReferenceAirKermano 
300A,0260BrachyAccessoryDeviceSequenceno 
300A,0262BrachyAccessoryDeviceNumberno 
300A,0263BrachyAccessoryDeviceIDno 
300A,0264BrachyAccessoryDeviceTypeno 
300A,0266BrachyAccessoryDeviceNameno 
300A,026ABrachyAccessoryDeviceNomThicknessno 
300A,026CBrachyAccessoryDevNomTransmissionno 
300A,0280ChannelSequenceno 
300A,0282ChannelNumberno 
300A,0284ChannelLengthno 
300A,0286ChannelTotalTimeno 
300A,0288SourceMovementTypeno 
300A,028ANumberOfPulsesno 
300A,028CPulseRepetitionIntervalno 
300A,0290SourceApplicatorNumberno 
300A,0291SourceApplicatorIDno 
300A,0292SourceApplicatorTypeno 
300A,0294SourceApplicatorNameno 
300A,0296SourceApplicatorLengthno 
300A,0298SourceApplicatorManufacturerno 
300A,029CSourceApplicatorWallNomThicknessno 
300A,029ESourceApplicatorWallNomTransno 
300A,02A0SourceApplicatorStepSizeno 
300A,02A2TransferTubeNumberno 
300A,02A4TransferTubeLengthno 
300A,02B0ChannelShieldSequenceno 
300A,02B2ChannelShieldNumberno 
300A,02B3ChannelShieldIDno 
300A,02B4ChannelShieldNameno 
300A,02B8ChannelShieldNominalThicknessno 
300A,02BAChannelShieldNominalTransmissionno 
300A,02C8FinalCumulativeTimeWeightno 
300A,02D0BrachyControlPointSequenceno 
300A,02D2ControlPointRelativePositionno 
300A,02D4ControlPoint3DPositionno 
300A,02D6CumulativeTimeWeightno 
300A,02E0CompensatorDivergenceno 
300A,02E1CompensatorMountingPositionno 
300A,02E2SourceToCompensatorDistanceno 
300A,02E3TotalCompTrayWaterEquivThicknessno 
300A,02E4IsocenterToCompensatorTrayDistanceno 
300A,02E5CompensatorColumnOffsetno 
300A,02E6IsocenterToCompensatorDistancesno 
300A,02E7CompensatorRelStoppingPowerRationo 
300A,02E8CompensatorMillingToolDiameterno 
300A,02EAIonRangeCompensatorSequenceno 
300A,02EBCompensatorDescriptionno 
300A,0302RadiationMassNumberno 
300A,0304RadiationAtomicNumberno 
300A,0306RadiationChargeStateno 
300A,0308ScanModeno 
300A,030AVirtualSourceAxisDistancesno 
300A,030CSnoutSequenceno 
300A,030DSnoutPositionno 
300A,030FSnoutIDno 
300A,0312NumberOfRangeShiftersno 
300A,0314RangeShifterSequenceno 
300A,0316RangeShifterNumberno 
300A,0318RangeShifterIDno 
300A,0320RangeShifterTypeno 
300A,0322RangeShifterDescriptionno 
300A,0330NumberOfLateralSpreadingDevicesno 
300A,0332LateralSpreadingDeviceSequenceno 
300A,0334LateralSpreadingDeviceNumberno 
300A,0336LateralSpreadingDeviceIDno 
300A,0338LateralSpreadingDeviceTypeno 
300A,033ALateralSpreadingDeviceDescriptionno 
300A,033CLateralSpreadingDevWaterEquivThickno 
300A,0340NumberOfRangeModulatorsno 
300A,0342RangeModulatorSequenceno 
300A,0344RangeModulatorNumberno 
300A,0346RangeModulatorIDno 
300A,0348RangeModulatorTypeno 
300A,034ARangeModulatorDescriptionno 
300A,034CBeamCurrentModulationIDno 
300A,0350PatientSupportTypeno 
300A,0352PatientSupportIDno 
300A,0354PatientSupportAccessoryCodeno 
300A,0356FixationLightAzimuthalAngleno 
300A,0358FixationLightPolarAngleno 
300A,035AMetersetRateno 
300A,0360RangeShifterSettingsSequenceno 
300A,0362RangeShifterSettingno 
300A,0364IsocenterToRangeShifterDistanceno 
300A,0366RangeShifterWaterEquivThicknessno 
300A,0370LateralSpreadingDeviceSettingsSeqno 
300A,0372LateralSpreadingDeviceSettingno 
300A,0374IsocenterToLateralSpreadingDevDistno 
300A,0380RangeModulatorSettingsSequenceno 
300A,0382RangeModulatorGatingStartValueno 
300A,0384RangeModulatorGatingStopValueno 
300A,038AIsocenterToRangeModulatorDistanceno 
300A,0390ScanSpotTuneIDno 
300A,0392NumberOfScanSpotPositionsno 
300A,0394ScanSpotPositionMapno 
300A,0396ScanSpotMetersetWeightsno 
300A,0398ScanningSpotSizeno 
300A,039ANumberOfPaintingsno 
300A,03A0IonToleranceTableSequenceno 
300A,03A2IonBeamSequenceno 
300A,03A4IonBeamLimitingDeviceSequenceno 
300A,03A6IonBlockSequenceno 
300A,03A8IonControlPointSequenceno 
300A,03AAIonWedgeSequenceno 
300A,03ACIonWedgePositionSequenceno 
300A,0401ReferencedSetupImageSequenceno 
300A,0402SetupImageCommentno 
300A,0410MotionSynchronizationSequenceno 
300A,0412ControlPointOrientationno 
300A,0420GeneralAccessorySequenceno 
300A,0421GeneralAccessoryIDno 
300A,0422GeneralAccessoryDescriptionno 
300A,0423GeneralAccessoryTypeno 
300A,0424GeneralAccessoryNumberno 
300C,0002ReferencedRTPlanSequenceno 
300C,0004ReferencedBeamSequenceno 
300C,0006ReferencedBeamNumberno 
300C,0007ReferencedReferenceImageNumberno 
300C,0008StartCumulativeMetersetWeightno 
300C,0009EndCumulativeMetersetWeightno 
300C,000AReferencedBrachyAppSetupSeqno 
300C,000CReferencedBrachyAppSetupNumberno 
300C,000EReferencedSourceNumberno 
300C,0020ReferencedFractionGroupSequenceno 
300C,0022ReferencedFractionGroupNumberno 
300C,0040ReferencedVerificationImageSeqno 
300C,0042ReferencedReferenceImageSequenceno 
300C,0050ReferencedDoseReferenceSequenceno 
300C,0051ReferencedDoseReferenceNumberno 
300C,0055BrachyReferencedDoseReferenceSeqno 
300C,0060ReferencedStructureSetSequenceno 
300C,006AReferencedPatientSetupNumberno 
300C,0080ReferencedDoseSequenceno 
300C,00A0ReferencedToleranceTableNumberno 
300C,00B0ReferencedBolusSequenceno 
300C,00C0ReferencedWedgeNumberno 
300C,00D0ReferencedCompensatorNumberno 
300C,00E0ReferencedBlockNumberno 
300C,00F0ReferencedControlPointIndexno 
300C,00F2ReferencedControlPointSequenceno 
300C,00F4ReferencedStartControlPointIndexno 
300C,00F6ReferencedStopControlPointIndexno 
300C,0100ReferencedRangeShifterNumberno 
300C,0102ReferencedLateralSpreadingDevNumno 
300C,0104ReferencedRangeModulatorNumberno 
300E,0002ApprovalStatusno 
300E,0004ReviewDateno 
300E,0005ReviewTimeno 
300E,0008ReviewerNameno 
4000,0000TextGroupLengthno 
4000,0010Arbitraryno 
4000,4000TextCommentsno 
4008,0040ResultsIDno 
4008,0042ResultsIDIssuerno 
4008,0050ReferencedInterpretationSequenceno 
4008,0100InterpretationRecordedDateno 
4008,0101InterpretationRecordedTimeno 
4008,0102InterpretationRecorderno 
4008,0103ReferenceToRecordedSoundno 
4008,0108InterpretationTranscriptionDateno 
4008,0109InterpretationTranscriptionTimeno 
4008,010AInterpretationTranscriberno 
4008,010BInterpretationTextno 
4008,010CInterpretationAuthorno 
4008,0111InterpretationApproverSequenceno 
4008,0112InterpretationApprovalDateno 
4008,0113InterpretationApprovalTimeno 
4008,0114PhysicianApprovingInterpretationno 
4008,0115InterpretationDiagnosisDescriptionno 
4008,0117InterpretationDiagnosisCodeSeqno 
4008,0118ResultsDistributionListSequenceno 
4008,0119DistributionNameno 
4008,011ADistributionAddressno 
4008,0200InterpretationIDno 
4008,0202InterpretationIDIssuerno 
4008,0210InterpretationTypeIDno 
4008,0212InterpretationStatusIDno 
4008,0300Impressionsno 
4008,4000ResultsCommentsno 
4FFE,0001MACParametersSequenceno 
50xx,0005CurveDimensionsno 
50xx,0010NumberOfPointsno 
50xx,0020TypeOfDatano 
50xx,0022CurveDescriptionno 
50xx,0030AxisUnitsno 
50xx,0040AxisLabelsno 
50xx,0103DataValueRepresentationno 
50xx,0104MinimumCoordinateValueno 
50xx,0105MaximumCoordinateValueno 
50xx,0106CurveRangeno 
50xx,0110CurveDataDescriptorno 
50xx,0112CoordinateStartValueno 
50xx,0114CoordinateStepValueno 
50xx,1001CurveActivationLayerno 
50xx,2000AudioTypeno 
50xx,2002AudioSampleFormatno 
50xx,2004NumberOfChannelsno 
50xx,2006NumberOfSamplesno 
50xx,2008SampleRateno 
50xx,200ATotalTimeno 
50xx,200CAudioSampleDatano 
50xx,200EAudioCommentsno 
50xx,2500CurveLabelno 
50xx,2600ReferencedOverlaySequenceno 
50xx,2610ReferencedOverlayGroupno 
50xx,3000CurveDatano 
5200,9229SharedFunctionalGroupsSequenceno 
5200,9230PerFrameFunctionalGroupsSequenceno 
5400,0100WaveformSequenceno 
5400,0110ChannelMinimumValueno 
5400,0112ChannelMaximumValueno 
5400,1004WaveformBitsAllocatedno 
5400,1006WaveformSampleInterpretationno 
5400,100AWaveformPaddingValueno 
5400,1010WaveformDatano 
5600,0010FirstOrderPhaseCorrectionAngleno 
5600,0020SpectroscopyDatano 
6000,0000OverlayGroupLengthno 
60xx,0010OverlayRowsno 
60xx,0011OverlayColumnsno 
60xx,0012OverlayPlanesno 
60xx,0015NumberOfFramesInOverlayno 
60xx,0022OverlayDescriptionno 
60xx,0040OverlayTypeno 
60xx,0045OverlaySubtypeno 
60xx,0050OverlayOriginno 
60xx,0051ImageFrameOriginno 
60xx,0052OverlayPlaneOriginno 
60xx,0060OverlayCompressionCodeno 
60xx,0061OverlayCompressionOriginatorno 
60xx,0062OverlayCompressionLabelno 
60xx,0063OverlayCompressionDescriptionno 
60xx,0066OverlayCompressionStepPointersno 
60xx,0068OverlayRepeatIntervalno 
60xx,0069OverlayBitsGroupedno 
60xx,0100OverlayBitsAllocatedno 
60xx,0102OverlayBitPositionno 
60xx,0110OverlayFormatno 
60xx,0200OverlayLocationno 
60xx,0800OverlayCodeLabelno 
60xx,0802OverlayNumberOfTablesno 
60xx,0803OverlayCodeTableLocationno 
60xx,0804OverlayBitsForCodeWordno 
60xx,1001OverlayActivationLayerno 
60xx,1100OverlayDescriptorGrayno 
60xx,1101OverlayDescriptorRedno 
60xx,1102OverlayDescriptorGreenno 
60xx,1103OverlayDescriptorBlueno 
60xx,1200OverlaysGrayno 
60xx,1201OverlaysRedno 
60xx,1202OverlaysGreenno 
60xx,1203OverlaysBlueno 
60xx,1301ROIAreano 
60xx,1302ROIMeanno 
60xx,1303ROIStandardDeviationno 
60xx,1500OverlayLabelno 
60xx,3000OverlayDatano 
60xx,4000OverlayCommentsno 
7Fxx,0000PixelDataGroupLengthno 
7Fxx,0010PixelDatano 
7Fxx,0011VariableNextDataGroupno 
7Fxx,0020VariableCoefficientsSDVNno 
7Fxx,0030VariableCoefficientsSDHNno 
7Fxx,0040VariableCoefficientsSDDNno 
FFFA,FFFADigitalSignaturesSequenceno 
FFFC,FFFCDataSetTrailingPaddingno 
FFFE,E000StartOfItemno 
FFFE,E00DEndOfItemsno 
FFFE,E0DDEndOfSequenceno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 2, 2013 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/DJI.html b/html/TagNames/DJI.html new file mode 100644 index 0000000..ba39227 --- /dev/null +++ b/html/TagNames/DJI.html @@ -0,0 +1,371 @@ + + + + +DJI Tags + + + +

DJI Tags

+

This table lists tags found in the maker notes of images from some DJI +Phantom drones.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001Makestring 
0x0003SpeedXfloat 
0x0004SpeedYfloat 
0x0005SpeedZfloat 
0x0006Pitchfloat 
0x0007Yawfloat 
0x0008Rollfloat 
0x0009CameraPitchfloat 
0x000aCameraYawfloat 
0x000bCameraRollfloat 
+ +

DJI XMP Tags

+

XMP tags used by DJI for images from drones.

+ +

These tags belong to the ExifTool XMP-drone-dji family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AbsoluteAltitudereal 
CalibratedFocalLengthreal 
CalibratedOpticalCenterXreal 
CalibratedOpticalCenterYreal 
CamReversestring 
DewarpDatastring 
DewarpFlagstring 
FlightPitchDegreereal 
FlightRollDegreereal 
FlightXSpeedreal 
FlightYSpeedreal 
FlightYawDegreereal 
FlightZSpeedreal 
GPSLatitudereal/ 
GPSLongitudereal/ 
GPSLongtitudereal 
GimbalPitchDegreereal 
GimbalReversestring 
GimbalRollDegreereal 
GimbalYawDegreereal 
Latitudereal 
Longitudereal 
RelativeAltitudereal 
RtkFlagstring 
RtkStdHgtreal 
RtkStdLatreal 
RtkStdLonreal 
SelfDatastring 
+ +

DJI Info Tags

+

Tags written by some DJI drones.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'FlightDegree(Y,P,R)'FlightDegreeno 
'FlightSpeed(X,Y,Z)'FlightSpeedno 
'GimbalDegree(Y,P,R)'GimbalDegreeno 
'adj_dbg_info'ADJDebugInfono 
'ae_dbg_info'AEDebugInfono 
'ae_histogram_info'AEHistogramInfono 
'ae_liveview_histogram_info'AELiveViewHistogramInfono 
'ae_liveview_local_histogram'AELiveViewLocalHistogramno 
'ae_local_histogram'AELocalHistogramno 
'af_dbg_info'AFDebugInfono 
'awb_dbg_info'AWBDebugInfono 
'hiso'Histogramno 
'hyperlapse_dbg_info'HyperlapsDebugInfono 
'sensor_id'SensorIDno 
'xidiri'Xidirino 
+ +

DJI ThermalParams Tags

+

Thermal parameters extracted from APP4 of DJI RJPEG files from the ZH20T.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
36K1no 
40K2no 
44K3no 
48K4no 
52KFno 
56B1no 
60B2no 
68ObjectDistanceno 
70RelativeHumidityno 
72Emissivityno 
74Reflectionno 
76AmbientTemperatureno 
80D2no 
84KJno 
86DBno 
88KKno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 1, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/DNG.html b/html/TagNames/DNG.html new file mode 100644 index 0000000..8542fa5 --- /dev/null +++ b/html/TagNames/DNG.html @@ -0,0 +1,312 @@ + + + + +DNG Tags + + + +

DNG Tags

+

+The main DNG tags are found in the EXIF table. The tables below define only +information found within structures of these main DNG tag values. See +http://www.adobe.com/products/dng/ for the official DNG specification. +

+

DNG AdobeData Tags

+

This information is found in the "Adobe" DNGPrivateData.

+ +

The maker notes ('MakN') are processed by ExifTool, but some information may +have been lost by the Adobe DNG Converter. This is because the Adobe DNG +Converter (as of version 6.3) doesn't properly handle information referenced +from inside the maker notes that lies outside the original maker notes +block. This information is lost when only the maker note block is copied to +the DNG image. While this doesn't effect all makes of cameras, it is a +problem for some major brands such as Olympus and Sony.

+ +

Other entries in this table represent proprietary information that is +extracted from the original RAW image and restructured to a different (but +still proprietary) Adobe format.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'CRW 'AdobeCRW---> CanonRaw Tags
'Koda'AdobeKoda---> Kodak IFD Tags
'Leaf'AdobeLeaf---> Leaf SubIFD Tags
'MRW 'AdobeMRW---> MinoltaRaw Tags
'MakN'MakerNoteApple +
MakerNoteNikon +
MakerNoteCanon +
MakerNoteCasio +
MakerNoteCasio2 +
MakerNoteDJIInfo +
MakerNoteDJI +
MakerNoteFLIR +
MakerNoteFujiFilm +
MakerNoteGE +
MakerNoteGE2 +
MakerNoteHasselblad +
MakerNoteHP +
MakerNoteHP2 +
MakerNoteHP4 +
MakerNoteHP6 +
MakerNoteISL +
MakerNoteJVC +
MakerNoteJVCText +
MakerNoteKodak1a +
MakerNoteKodak1b +
MakerNoteKodak2 +
MakerNoteKodak3 +
MakerNoteKodak4 +
MakerNoteKodak5 +
MakerNoteKodak6a +
MakerNoteKodak6b +
MakerNoteKodak7 +
MakerNoteKodak8a +
MakerNoteKodak8b +
MakerNoteKodak8c +
MakerNoteKodak9 +
MakerNoteKodak10 +
MakerNoteKodak11 +
MakerNoteKodak12 +
MakerNoteKodakUnknown +
MakerNoteKyocera +
MakerNoteMinolta +
MakerNoteMinolta2 +
MakerNoteMinolta3 +
MakerNoteMotorola +
MakerNoteNikon2 +
MakerNoteNikon3 +
MakerNoteNintendo +
MakerNoteOlympus +
MakerNoteOlympus2 +
MakerNoteOlympus3 +
MakerNoteLeica +
MakerNoteLeica2 +
MakerNoteLeica3 +
MakerNoteLeica4 +
MakerNoteLeica5 +
MakerNoteLeica6 +
MakerNoteLeica7 +
MakerNoteLeica8 +
MakerNoteLeica9 +
MakerNoteLeica10 +
MakerNotePanasonic +
MakerNotePanasonic2 +
MakerNotePanasonic3 +
MakerNotePentax +
MakerNotePentax2 +
MakerNotePentax3 +
MakerNotePentax4 +
MakerNotePentax5 +
MakerNotePentax6 +
MakerNotePhaseOne +
MakerNoteReconyx +
MakerNoteReconyx2 +
MakerNoteReconyx3 +
MakerNoteRicohPentax +
MakerNoteRicoh +
MakerNoteRicoh2 +
MakerNoteRicohText +
MakerNoteSamsung1a +
MakerNoteSamsung1b +
MakerNoteSamsung2 +
MakerNoteSanyo +
MakerNoteSanyoC4 +
MakerNoteSanyoPatch +
MakerNoteSigma +
MakerNoteSony +
MakerNoteSony2 +
MakerNoteSony3 +
MakerNoteSony4 +
MakerNoteSony5 +
MakerNoteSonyEricsson +
MakerNoteSonySRF +
MakerNoteUnknownText +
MakerNoteUnknownBinary +
MakerNoteUnknown
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
--> Apple Tags +
--> Nikon Tags +
--> Canon Tags +
--> Casio Tags +
--> Casio Type2 Tags +
--> DJI Info Tags +
--> DJI Tags +
--> FLIR Tags +
--> FujiFilm Tags +
--> GE Tags +
--> FujiFilm Tags +
--> Unknown Tags +
--> HP Tags +
--> HP Type2 Tags +
--> HP Type4 Tags +
--> HP Type6 Tags +
--> Unknown Tags +
--> JVC Tags +
--> JVC Text Tags +
--> Kodak Tags +
--> Kodak Tags +
--> Kodak Type2 Tags +
--> Kodak Type3 Tags +
--> Kodak Type4 Tags +
--> Kodak Type5 Tags +
--> Kodak Type6 Tags +
--> Kodak Type6 Tags +
--> Kodak Type7 Tags +
--> Kodak Type8 Tags +
--> Kodak Type8 Tags +
--> Kodak Type8 Tags +
--> Kodak Type9 Tags +
--> Kodak Type10 Tags +
--> Kodak Type11 Tags +
--> Kodak Type11 Tags +
--> Kodak Unknown Tags +
--> Unknown Tags +
--> Minolta Tags +
--> Olympus Tags +
(not EXIF-based) +
--> Motorola Tags +
--> Nikon Type2 Tags +
--> Nikon Tags +
--> Nintendo Tags +
--> Olympus Tags +
--> Olympus Tags +
--> Olympus Tags +
--> Panasonic Tags +
--> Panasonic Leica2 Tags +
--> Panasonic Leica3 Tags +
--> Panasonic Leica4 Tags +
--> Panasonic Leica5 Tags +
--> Panasonic Leica6 Tags +
--> Panasonic Leica6 Tags +
--> Panasonic Leica5 Tags +
--> Panasonic Leica9 Tags +
--> Panasonic Tags +
--> Panasonic Tags +
--> Panasonic Type2 Tags +
--> Panasonic Tags +
--> Pentax Tags +
--> Pentax Type2 Tags +
--> Casio Type2 Tags +
--> Pentax Type4 Tags +
--> Pentax Tags +
--> Pentax S1 Tags +
--> PhaseOne Tags +
--> Reconyx Tags +
--> Reconyx Type2 Tags +
--> Reconyx Type3 Tags +
--> Pentax Tags +
--> Ricoh Tags +
--> Ricoh Type2 Tags +
--> Ricoh Text Tags +
(Samsung "STMN" maker notes without PreviewImage) +
--> Samsung Tags +
--> Samsung Type2 Tags +
--> Sanyo Tags +
--> Sanyo Tags +
--> Sanyo Tags +
--> Sigma Tags +
--> Sony Tags +
--> Olympus Tags +
--> Olympus Tags +
--> Sony PIC Tags +
--> Sony Tags +
--> Sony Ericsson Tags +
--> Sony SRF Tags +
(unknown text-based maker notes) +
(unknown binary maker notes) +
--> Unknown Tags
'Pano'AdobePano---> PanasonicRaw Tags
'RAF 'AdobeRAF---> FujiFilm RAF Tags
'SR2 'AdobeSR2---> Sony SR2Private Tags
+ +

DNG OriginalRaw Tags

+

This table defines tags extracted from the DNG OriginalRawFileData +information.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000OriginalRawImageno 
0x0001OriginalRawResourceno 
0x0002OriginalRawFileTypeno 
0x0003OriginalRawCreatorno 
0x0004OriginalTHMImageno 
0x0005OriginalTHMResourceno 
0x0006OriginalTHMFileTypeno 
0x0007OriginalTHMCreatorno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 1, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/DPX.html b/html/TagNames/DPX.html new file mode 100644 index 0000000..246213c --- /dev/null +++ b/html/TagNames/DPX.html @@ -0,0 +1,300 @@ + + + + +DPX Tags + + + +

DPX Tags

+

Tags extracted from DPX (Digital Picture Exchange) images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ByteOrderno'SDPX' = Big-endian +
'XPDS' = Little-endian
8HeaderVersionno 
16DPXFileSizeno 
20DittoKeyno0 = Same +
1 = New
36ImageFileNameno 
136CreateDateno 
160Creatorno 
260Projectno 
460Copyrightno 
660EncryptionKeyno 
768Orientationno +
0 = Horizontal (normal) +
1 = Mirror vertical +
2 = Mirror horizontal +
3 = Rotate 180 +
4 = Mirror horizontal and rotate 270 CW +
5 = Rotate 90 CW +
6 = Rotate 270 CW +
7 = Mirror horizontal and rotate 90 CW
+
770ImageElementsno 
772ImageWidthno 
776ImageHeightno 
780DataSignno0 = Unsigned +
1 = Signed
800ComponentsConfigurationno +
0 = User-defined single component +
1 = Red (R) +
2 = Green (G) +
3 = Blue (B) +
4 = Alpha (matte) +
6 = Luminance (Y) +
7 = Chrominance (Cb, Cr, subsampled by two) +
8 = Depth (Z) +
9 = Composite video +
50 = R, G, B +
51 = R, G, B, Alpha +
52 = Alpha, B, G, R +
100 = Cb, Y, Cr, Y (4:2:2) +
101 = Cb, Y, A, Cr, Y, A (4:2:2:4) +
102 = Cb, Y, Cr (4:4:4) +
103 = Cb, Y, Cr, A (4:4:4:4) +
150 = User-defined 2 component element +
151 = User-defined 3 component element +
152 = User-defined 4 component element +
153 = User-defined 5 component element +
154 = User-defined 6 component element +
155 = User-defined 7 component element +
156 = User-defined 8 component element
+
801TransferCharacteristicno +
0 = User-defined +
1 = Printing density +
2 = Linear +
3 = Logarithmic +
4 = Unspecified video +
5 = SMPTE 274M +
6 = ITU-R 704-4 +
7 = ITU-R 601-5 system B or G (625) +
8 = ITU-R 601-5 system M (525) +
9 = Composite video (NTSC) +
10 = Composite video (PAL) +
11 = Z (depth) - linear +
12 = Z (depth) - homogeneous +
13 = SMPTE ADX +
14 = ITU-R 2020 NCL +
15 = ITU-R 2020 CL +
16 = IEC 61966-2-4 xvYCC +
17 = ITU-R 2100 NCL/PQ +
18 = ITU-R 2100 ICtCp/PQ +
19 = ITU-R 2100 NCL/HLG +
20 = ITU-R 2100 ICtCp/HLG +
21 = RP 431-2:2011 Gama 2.6 +
22 = IEC 61966-2-1 sRGB
+
802ColorimetricSpecificationno +
0 = User-defined +
1 = Printing density +
4 = Unspecified video +
5 = SMPTE 274M +
6 = ITU-R 704-4 +
7 = ITU-R 601-5 system B or G (625) +
8 = ITU-R 601-5 system M (525) +
9 = Composite video (NTSC) +
10 = Composite video (PAL) +
13 = SMPTE ADX +
14 = ITU-R 2020 +
15 = P3D65 +
16 = P3DCI +
17 = P3D60 +
18 = ACES
+
803BitDepthno 
820ImageDescriptionno 
892Image2Descriptionno 
964Image3Descriptionno 
1036Image4Descriptionno 
1108Image5Descriptionno 
1180Image6Descriptionno 
1252Image7Descriptionno 
1324Image8Descriptionno 
1432SourceFileNameno 
1532SourceCreateDateno 
1556InputDeviceNameno 
1588InputDeviceSerialNumberno 
1628AspectRationo 
1724OriginalFrameRateno 
1728ShutterAngleno 
1732FrameIDno 
1764SlateInformationno 
1920TimeCodeno 
1940FrameRateno 
1972Reserved5?no 
2048UserIDno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Sep 22, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/DV.html b/html/TagNames/DV.html new file mode 100644 index 0000000..bddb51b --- /dev/null +++ b/html/TagNames/DV.html @@ -0,0 +1,76 @@ + + + + +DV Tags + + + +

DV Tags

+

The following tags are extracted from DV videos.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AspectRationo 
AudioBitsPerSampleno 
AudioChannelsno 
AudioSampleRateno 
Colorimetryno 
DateTimeOriginalno 
Durationno 
FrameRateno 
ImageHeightno 
ImageWidthno 
TotalBitrateno 
VideoFormatno 
VideoScanTypeno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 3, 2011 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/DarwinCore.html b/html/TagNames/DarwinCore.html new file mode 100644 index 0000000..2b0c4c8 --- /dev/null +++ b/html/TagNames/DarwinCore.html @@ -0,0 +1,1891 @@ + + + + +DarwinCore Tags + + + +

DarwinCore Tags

+

Tags defined in the Darwin Core (dwc) XMP namespace. See +http://rs.tdwg.org/dwc/index.htm for the official specification.

+ +

These tags belong to the ExifTool XMP-dwc family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
DCTermsLocationstruct--> DarwinCore DCTermsLocation Struct
DCContinentstring_(dctermsLocationContinent)
DCCoordinatePrecisionstring_(dctermsLocationCoordinatePrecision)
DCCoordinateUncertaintyInMetersstring_(dctermsLocationCoordinateUncertaintyInMeters)
DCCountrystring_(dctermsLocationCountry)
DCCountryCodestring_(dctermsLocationCountryCode)
DCCountystring_(dctermsLocationCounty)
DCDecimalLatitudestring_(dctermsLocationDecimalLatitude)
DCDecimalLongitudestring_(dctermsLocationDecimalLongitude)
DCFootprintSpatialFitstring_(dctermsLocationFootprintSpatialFit)
DCFootprintSRSstring_(dctermsLocationFootprintSRS)
DCFootprintWKTstring_(dctermsLocationFootprintWKT)
DCGeodeticDatumstring_(dctermsLocationGeodeticDatum)
DCGeoreferencedBystring_(dctermsLocationGeoreferencedBy)
DCGeoreferencedDatestring_(dctermsLocationGeoreferencedDate)
DCGeoreferenceProtocolstring_(dctermsLocationGeoreferenceProtocol)
DCGeoreferenceRemarksstring_(dctermsLocationGeoreferenceRemarks)
DCGeoreferenceSourcesstring_(dctermsLocationGeoreferenceSources)
DCGeoreferenceVerificationStatusstring_(dctermsLocationGeoreferenceVerificationStatus)
DCHigherGeographystring_(dctermsLocationHigherGeography)
DCHigherGeographyIDstring_(dctermsLocationHigherGeographyID)
DCIslandstring_(dctermsLocationIsland)
DCIslandGroupstring_(dctermsLocationIslandGroup)
DCLocalitystring_(dctermsLocationLocality)
DCLocationAccordingTostring_(dctermsLocationLocationAccordingTo)
DCLocationIDstring_(dctermsLocationLocationID)
DCLocationRemarksstring_(dctermsLocationLocationRemarks)
DCMaximumDepthInMetersstring_(dctermsLocationMaximumDepthInMeters)
DCMaximumDistanceAboveSurfaceInMetersstring_(dctermsLocationMaximumDistanceAboveSurfaceInMeters)
DCMaximumElevationInMetersstring_(dctermsLocationMaximumElevationInMeters)
DCMinimumDepthInMetersstring_(dctermsLocationMinimumDepthInMeters)
DCMinimumDistanceAboveSurfaceInMetersstring_(dctermsLocationMinimumDistanceAboveSurfaceInMeters)
DCMinimumElevationInMetersstring_(dctermsLocationMinimumElevationInMeters)
DCMunicipalitystring_(dctermsLocationMunicipality)
DCPointRadiusSpatialFitstring_(dctermsLocationPointRadiusSpatialFit)
DCStateProvincestring_(dctermsLocationStateProvince)
DCVerbatimCoordinatesstring_(dctermsLocationVerbatimCoordinates)
DCVerbatimCoordinateSystemstring_(dctermsLocationVerbatimCoordinateSystem)
DCVerbatimDepthstring_(dctermsLocationVerbatimDepth)
DCVerbatimElevationstring_(dctermsLocationVerbatimElevation)
DCVerbatimLatitudestring_(dctermsLocationVerbatimLatitude)
DCVerbatimLocalitystring_(dctermsLocationVerbatimLocality)
DCVerbatimLongitudestring_(dctermsLocationVerbatimLongitude)
DCVerbatimSRSstring_(dctermsLocationVerbatimSRS)
DCVerticalDatumstring_(dctermsLocationVerticalDatum)
DCWaterBodystring_(dctermsLocationWaterBody)
DCEventstruct--> DarwinCore Event Struct +
(called Event by the spec)
EventDayinteger_ 
EventEarliestDatedate_ 
EventEndDayOfYearinteger_ 
EventDatedate_(EventEventDate)
EventIDstring/_(EventEventID; avoided in favor of XMP-iptcExt:EventID)
EventRemarkslang-alt_(EventEventRemarks)
EventTimestring_(EventEventTime)
EventFieldNotesstring_ 
EventFieldNumberstring_ 
EventHabitatstring_ 
EventLatestDatedate_ 
EventMonthinteger_ 
EventParentEventIDstring_ 
EventSampleSizeUnitstring_ 
EventSampleSizeValuestring_ 
EventSamplingEffortstring_ 
EventSamplingProtocolstring_ 
EventStartDayOfYearinteger_ 
EventVerbatimEventDatestring_ 
EventYearinteger_ 
FossilSpecimenstruct--> DarwinCore MaterialSample Struct
FossilSpecimenMaterialSampleIDstring_ 
GeologicalContextstruct--> DarwinCore GeologicalContext Struct
GeologicalContextBedstring_ 
EarliestAgeOrLowestStagestring_(GeologicalContextEarliestAgeOrLowestStage)
EarliestEonOrLowestEonothemstring_(GeologicalContextEarliestEonOrLowestEonothem)
EarliestEpochOrLowestSeriesstring_(GeologicalContextEarliestEpochOrLowestSeries)
EarliestEraOrLowestErathemstring_(GeologicalContextEarliestEraOrLowestErathem)
EarliestPeriodOrLowestSystemstring_(GeologicalContextEarliestPeriodOrLowestSystem)
GeologicalContextFormationstring_ 
GeologicalContextIDstring_(GeologicalContextGeologicalContextID)
GeologicalContextGroupstring_ 
HighestBiostratigraphicZonestring_(GeologicalContextHighestBiostratigraphicZone)
LatestAgeOrHighestStagestring_(GeologicalContextLatestAgeOrHighestStage)
LatestEonOrHighestEonothemstring_(GeologicalContextLatestEonOrHighestEonothem)
LatestEpochOrHighestSeriesstring_(GeologicalContextLatestEpochOrHighestSeries)
LatestEraOrHighestErathemstring_(GeologicalContextLatestEraOrHighestErathem)
LatestPeriodOrHighestSystemstring_(GeologicalContextLatestPeriodOrHighestSystem)
LithostratigraphicTermsstring_(GeologicalContextLithostratigraphicTerms)
LowestBiostratigraphicZonestring_(GeologicalContextLowestBiostratigraphicZone)
GeologicalContextMemberstring_ 
HumanObservationstruct--> DarwinCore Event Struct
HumanObservationDayinteger_ 
HumanObservationEarliestDatedate_ 
HumanObservationEndDayOfYearinteger_ 
HumanObservationEventDatedate_ 
HumanObservationEventIDstring/_(avoided in favor of XMP-iptcExt:EventID)
HumanObservationEventRemarkslang-alt_ 
HumanObservationEventTimestring_ 
HumanObservationFieldNotesstring_ 
HumanObservationFieldNumberstring_ 
HumanObservationHabitatstring_ 
HumanObservationLatestDatedate_ 
HumanObservationMonthinteger_ 
HumanObservationParentEventIDstring_ 
HumanObservationSampleSizeUnitstring_ 
HumanObservationSampleSizeValuestring_ 
HumanObservationSamplingEffortstring_ 
HumanObservationSamplingProtocolstring_ 
HumanObservationStartDayOfYearinteger_ 
HumanObservationVerbatimEventDatestring_ 
HumanObservationYearinteger_ 
Identificationstruct--> DarwinCore Identification Struct
DateIdentifieddate_(IdentificationDateIdentified)
IdentificationIDstring_(IdentificationIdentificationID)
IdentificationQualifierstring_(IdentificationIdentificationQualifier)
IdentificationReferencesstring_(IdentificationIdentificationReferences)
IdentificationRemarksstring_(IdentificationIdentificationRemarks)
IdentificationVerificationStatusstring_(IdentificationIdentificationVerificationStatus)
IdentifiedBystring_(IdentificationIdentifiedBy)
IdentifiedByIDstring_(IdentificationIdentifiedByID)
TypeStatusstring_(IdentificationTypeStatus)
VerbatimIdentificationstring_(IdentificationVerbatimIdentification)
LivingSpecimenstruct--> DarwinCore MaterialSample Struct
LivingSpecimenMaterialSampleIDstring_ 
MachineObservationstruct--> DarwinCore Event Struct
MachineObservationDayinteger_ 
MachineObservationEarliestDatedate_ 
MachineObservationEndDayOfYearinteger_ 
MachineObservationEventDatedate_ 
MachineObservationEventIDstring/_(avoided in favor of XMP-iptcExt:EventID)
MachineObservationEventRemarkslang-alt_ 
MachineObservationEventTimestring_ 
MachineObservationFieldNotesstring_ 
MachineObservationFieldNumberstring_ 
MachineObservationHabitatstring_ 
MachineObservationLatestDatedate_ 
MachineObservationMonthinteger_ 
MachineObservationParentEventIDstring_ 
MachineObservationSampleSizeUnitstring_ 
MachineObservationSampleSizeValuestring_ 
MachineObservationSamplingEffortstring_ 
MachineObservationSamplingProtocolstring_ 
MachineObservationStartDayOfYearinteger_ 
MachineObservationVerbatimEventDatestring_ 
MachineObservationYearinteger_ 
MaterialSamplestruct--> DarwinCore MaterialSample Struct
MaterialSampleIDstring_(MaterialSampleMaterialSampleID)
MeasurementOrFactstruct--> DarwinCore MeasurementOrFact Struct
MeasurementAccuracystring_(MeasurementOrFactMeasurementAccuracy)
MeasurementDeterminedBystring_(MeasurementOrFactMeasurementDeterminedBy)
MeasurementDeterminedDatedate_(MeasurementOrFactMeasurementDeterminedDate)
MeasurementIDstring_(MeasurementOrFactMeasurementID)
MeasurementMethodstring_(MeasurementOrFactMeasurementMethod)
MeasurementRemarksstring_(MeasurementOrFactMeasurementRemarks)
MeasurementTypestring_(MeasurementOrFactMeasurementType)
MeasurementUnitstring_(MeasurementOrFactMeasurementUnit)
MeasurementValuestring_(MeasurementOrFactMeasurementValue)
Occurrencestruct--> DarwinCore Occurrence Struct
OccurrenceAssociatedMediastring_ 
OccurrenceAssociatedOccurrencesstring_ 
OccurrenceAssociatedReferencesstring_ 
OccurrenceAssociatedSequencesstring_ 
OccurrenceAssociatedTaxastring_ 
OccurrenceBehaviorstring_ 
OccurrenceCatalogNumberstring_ 
OccurrenceDegreeOfEstablishmentstring_ 
OccurrenceDispositionstring_ 
OccurrenceEstablishmentMeansstring_ 
OccurrenceGeoreferenceVerificationStatusstring_ 
OccurrenceIndividualCountstring_ 
OccurrenceIndividualIDstring_ 
OccurrenceLifeStagestring_ 
OccurrenceDetailsstring_(OccurrenceOccurrenceDetails)
OccurrenceIDstring_(OccurrenceOccurrenceID)
OccurrenceRemarksstring_(OccurrenceOccurrenceRemarks)
OccurrenceStatusstring_(OccurrenceOccurrenceStatus)
OccurrenceOrganismQuantitystring_ 
OccurrenceOrganismQuantityTypestring_ 
OccurrenceOtherCatalogNumbersstring_ 
OccurrencePathwaystring_ 
OccurrencePreparationsstring_ 
OccurrencePreviousIdentificationsstring_ 
OccurrenceRecordedBystring_ 
OccurrenceRecordedByIDstring_ 
OccurrenceRecordNumberstring_ 
OccurrenceReproductiveConditionstring_ 
OccurrenceSexstring_ 
Organismstruct--> DarwinCore Organism Struct
OrganismAssociatedOccurrencesstring_ 
OrganismAssociatedOrganismsstring_ 
OrganismIDstring_(OrganismOrganismID)
OrganismNamestring_(OrganismOrganismName)
OrganismRemarksstring_(OrganismOrganismRemarks)
OrganismScopestring_(OrganismOrganismScope)
OrganismPreviousIdentificationsstring_ 
PreservedSpecimenstruct--> DarwinCore MaterialSample Struct
PreservedSpecimenMaterialSampleIDstring_ 
Recordstruct--> DarwinCore Record Struct
RecordBasisOfRecordstring_ 
RecordCollectionCodestring_ 
RecordCollectionIDstring_ 
RecordDataGeneralizationsstring_ 
RecordDatasetIDstring_ 
RecordDatasetNamestring_ 
RecordDynamicPropertiesstring_ 
RecordInformationWithheldstring_ 
RecordInstitutionCodestring_ 
RecordInstitutionIDstring_ 
RecordOwnerInstitutionCodestring_ 
ResourceRelationshipstruct--> DarwinCore ResourceRelationship Struct
RelatedResourceIDstring_(ResourceRelationshipRelatedResourceID)
RelationshipAccordingTostring_(ResourceRelationshipRelationshipAccordingTo)
RelationshipEstablishedDatedate_(ResourceRelationshipRelationshipEstablishedDate)
RelationshipOfResourcestring_(ResourceRelationshipRelationshipOfResource)
RelationshipOfResourceIDstring_(ResourceRelationshipRelationshipOfResourceID)
RelationshipRemarksstring_(ResourceRelationshipRelationshipRemarks)
ResourceIDstring_(ResourceRelationshipResourceID)
ResourceRelationshipIDstring_(ResourceRelationshipResourceRelationshipID)
Taxonstruct--> DarwinCore Taxon Struct
TaxonAcceptedNameUsagestring_ 
TaxonAcceptedNameUsageIDstring_ 
TaxonClassstring_ 
TaxonCultivarEpithetstring_ 
TaxonFamilystring_ 
TaxonGenusstring_ 
TaxonHigherClassificationstring_ 
TaxonInfraspecificEpithetstring_ 
TaxonKingdomstring_ 
TaxonNameAccordingTostring_ 
TaxonNameAccordingToIDstring_ 
TaxonNamePublishedInstring_ 
TaxonNamePublishedInIDstring_ 
TaxonNamePublishedInYearstring_ 
TaxonNomenclaturalCodestring_ 
TaxonNomenclaturalStatusstring_ 
TaxonOrderstring_ 
TaxonOriginalNameUsagestring_ 
TaxonOriginalNameUsageIDstring_ 
TaxonParentNameUsagestring_ 
TaxonParentNameUsageIDstring_ 
TaxonPhylumstring_ 
TaxonScientificNamestring_ 
TaxonScientificNameAuthorshipstring_ 
TaxonScientificNameIDstring_ 
TaxonSpecificEpithetstring_ 
TaxonSubgenusstring_ 
TaxonConceptIDstring_(TaxonTaxonConceptID)
TaxonIDstring_(TaxonTaxonID)
TaxonTaxonomicStatusstring_ 
TaxonRankstring_(TaxonTaxonRank)
TaxonRemarksstring_(TaxonTaxonRemarks)
TaxonVerbatimTaxonRankstring_ 
TaxonVernacularNamelang-alt_ 
+ +

DarwinCore DCTermsLocation Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Continentstring 
CoordinatePrecisionstring 
CoordinateUncertaintyInMetersstring 
Countrystring 
CountryCodestring 
Countystring 
DecimalLatitudestring 
DecimalLongitudestring 
FootprintSRSstring 
FootprintSpatialFitstring 
FootprintWKTstring 
GeodeticDatumstring 
GeoreferenceProtocolstring 
GeoreferenceRemarksstring 
GeoreferenceSourcesstring 
GeoreferenceVerificationStatusstring 
GeoreferencedBystring 
GeoreferencedDatestring 
HigherGeographystring 
HigherGeographyIDstring 
Islandstring 
IslandGroupstring 
Localitystring 
LocationAccordingTostring 
LocationIDstring 
LocationRemarksstring 
MaximumDepthInMetersstring 
MaximumDistanceAboveSurfaceInMetersstring 
MaximumElevationInMetersstring 
MinimumDepthInMetersstring 
MinimumDistanceAboveSurfaceInMetersstring 
MinimumElevationInMetersstring 
Municipalitystring 
PointRadiusSpatialFitstring 
StateProvincestring 
VerbatimCoordinateSystemstring 
VerbatimCoordinatesstring 
VerbatimDepthstring 
VerbatimElevationstring 
VerbatimLatitudestring 
VerbatimLocalitystring 
VerbatimLongitudestring 
VerbatimSRSstring 
VerticalDatumstring 
WaterBodystring 
+ +

DarwinCore Event Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Dayinteger 
EarliestDatedate 
EndDayOfYearinteger 
EventDatedate 
EventIDstring(avoided in favor of XMP-iptcExt:EventID)
EventRemarkslang-alt 
EventTimestring 
FieldNotesstring 
FieldNumberstring 
Habitatstring 
LatestDatedate 
Monthinteger 
ParentEventIDstring 
SampleSizeUnitstring 
SampleSizeValuestring 
SamplingEffortstring 
SamplingProtocolstring 
StartDayOfYearinteger 
VerbatimEventDatestring 
Yearinteger 
+ +

DarwinCore MaterialSample Struct

+
+
+ + + + + + + +
Field NameWritableValues / Notes
MaterialSampleIDstring 
+ +

DarwinCore GeologicalContext Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Bedstring 
EarliestAgeOrLowestStagestring 
EarliestEonOrLowestEonothemstring 
EarliestEpochOrLowestSeriesstring 
EarliestEraOrLowestErathemstring 
EarliestPeriodOrLowestSystemstring 
Formationstring 
GeologicalContextIDstring 
Groupstring 
HighestBiostratigraphicZonestring 
LatestAgeOrHighestStagestring 
LatestEonOrHighestEonothemstring 
LatestEpochOrHighestSeriesstring 
LatestEraOrHighestErathemstring 
LatestPeriodOrHighestSystemstring 
LithostratigraphicTermsstring 
LowestBiostratigraphicZonestring 
Memberstring 
+ +

DarwinCore Identification Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
DateIdentifieddate 
IdentificationIDstring 
IdentificationQualifierstring 
IdentificationReferencesstring 
IdentificationRemarksstring 
IdentificationVerificationStatusstring 
IdentifiedBystring 
IdentifiedByIDstring 
TypeStatusstring 
VerbatimIdentificationstring 
+ +

DarwinCore MeasurementOrFact Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
MeasurementAccuracystring 
MeasurementDeterminedBystring 
MeasurementDeterminedDatedate 
MeasurementIDstring 
MeasurementMethodstring 
MeasurementRemarksstring 
MeasurementTypestring 
MeasurementUnitstring 
MeasurementValuestring 
+ +

DarwinCore Occurrence Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
AssociatedMediastring 
AssociatedOccurrencesstring 
AssociatedReferencesstring 
AssociatedSequencesstring 
AssociatedTaxastring 
Behaviorstring 
CatalogNumberstring 
DegreeOfEstablishmentstring 
Dispositionstring 
EstablishmentMeansstring 
GeoreferenceVerificationStatusstring 
IndividualCountstring 
IndividualIDstring 
LifeStagestring 
OccurrenceDetailsstring 
OccurrenceIDstring 
OccurrenceRemarksstring 
OccurrenceStatusstring 
OrganismQuantitystring 
OrganismQuantityTypestring 
OtherCatalogNumbersstring 
Pathwaystring 
Preparationsstring 
PreviousIdentificationsstring 
RecordNumberstring 
RecordedBystring 
RecordedByIDstring 
ReproductiveConditionstring 
Sexstring 
+ +

DarwinCore Organism Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
AssociatedOccurrencesstring 
AssociatedOrganismsstring 
OrganismIDstring 
OrganismNamestring 
OrganismRemarksstring 
OrganismScopestring 
PreviousIdentificationsstring 
+ +

DarwinCore Record Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
BasisOfRecordstring 
CollectionCodestring 
CollectionIDstring 
DataGeneralizationsstring 
DatasetIDstring 
DatasetNamestring 
DynamicPropertiesstring 
InformationWithheldstring 
InstitutionCodestring 
InstitutionIDstring 
OwnerInstitutionCodestring 
+ +

DarwinCore ResourceRelationship Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
RelatedResourceIDstring 
RelationshipAccordingTostring 
RelationshipEstablishedDatedate 
RelationshipOfResourcestring 
RelationshipOfResourceIDstring 
RelationshipRemarksstring 
ResourceIDstring 
ResourceRelationshipIDstring 
+ +

DarwinCore Taxon Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
AcceptedNameUsagestring 
AcceptedNameUsageIDstring 
Classstring 
CultivarEpithetstring 
Familystring 
Genusstring 
HigherClassificationstring 
InfraspecificEpithetstring 
Kingdomstring 
NameAccordingTostring 
NameAccordingToIDstring 
NamePublishedInstring 
NamePublishedInIDstring 
NamePublishedInYearstring 
NomenclaturalCodestring 
NomenclaturalStatusstring 
Orderstring 
OriginalNameUsagestring 
OriginalNameUsageIDstring 
ParentNameUsagestring 
ParentNameUsageIDstring 
Phylumstring 
ScientificNamestring 
ScientificNameAuthorshipstring 
ScientificNameIDstring 
SpecificEpithetstring 
Subgenusstring 
TaxonConceptIDstring 
TaxonIDstring 
TaxonRankstring 
TaxonRemarksstring 
TaxonomicStatusstring 
VerbatimTaxonRankstring 
VernacularNamelang-alt 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 21, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/DjVu.html b/html/TagNames/DjVu.html new file mode 100644 index 0000000..e90122f --- /dev/null +++ b/html/TagNames/DjVu.html @@ -0,0 +1,314 @@ + + + + +DjVu Tags + + + +

DjVu Tags

+

Information is extracted from the following chunks in DjVu images. See +http://www.djvu.org/ for the DjVu specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ANTa'ANTa---> DjVu Ant Tags
'ANTz'CompressedAnnotation---> DjVu Ant Tags
'FORM'FORM---> DjVu Form Tags
'INCL'IncludedFileIDno 
'INFO'INFO---> DjVu Info Tags
+ +

DjVu Ant Tags

+

Information extracted from annotation chunks.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'metadata'Metadata---> DjVu Meta Tags
'xmp'XMP---> XMP Tags
+ +

DjVu Meta Tags

+

This table lists the standard DjVu metadata tags, but ExifTool will extract +any tags that exist even if they don't appear here. The DjVu v3 +documentation endorses tags borrowed from two standards: 1) BibTeX +bibliography system tags (all lowercase Tag ID's in the table below), and 2) +PDF DocInfo tags (capitalized Tag ID's).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Author'Authorno 
'CreationDate'CreateDateno 
'Creator'Creatorno 
'Keywords'Keywordsno 
'ModDate'ModifyDateno 
'Producer'Producerno 
'Subject'Subjectno 
'Title'Titleno 
'Trapped'Trappedno 
'address'Addressno 
'annote'Annotationno 
'author'Authorno 
'booktitle'BookTitleno 
'chapter'Chapterno 
'crossref'CrossRefno 
'edition'Editionno 
'eprint'EPrintno 
'howpublished'HowPublishedno 
'institution'Institutionno 
'journal'Journalno 
'key'Keyno 
'month'Monthno 
'note'Noteno 
'number'Numberno 
'organization'Organizationno 
'pages'Pagesno 
'publisher'Publisherno 
'school'Schoolno 
'series'Seriesno 
'title'Titleno 
'type'Typeno 
'url'URLno 
'volume'Volumeno 
'year'Yearno 
+ +

DjVu Form Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0SubfileTypeno +
'BM44' = Grayscale IW44 +
'DJVI' = Shared component +
'DJVM' = Multi-page document +
'DJVU' = Single-page image +
'PM44' = Color IW44 +
'THUM' = Thumbnail image
+
+ +

DjVu Info Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ImageWidthno 
2ImageHeightno 
4DjVuVersionno 
6SpatialResolutionno 
8Gammano 
9Orientationno[val & 0x7] +
1 = Horizontal (normal) +
2 = Rotate 180 +
5 = Rotate 90 CW +
6 = Rotate 270 CW
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 24, 2018 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/EXE.html b/html/TagNames/EXE.html new file mode 100644 index 0000000..ee557d4 --- /dev/null +++ b/html/TagNames/EXE.html @@ -0,0 +1,766 @@ + + + + +EXE Tags + + + +

EXE Tags

+

This module extracts information from various types of Windows, MacOS and +Unix executable and library files. The first table below lists information +extracted from the header of Windows PE (Portable Executable) EXE files and +DLL libraries.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0MachineTypeno +
0x14c = Intel 386 or later, and compatibles +
0x14d = Intel i860 +
0x162 = MIPS R3000 +
0x166 = MIPS little endian (R4000) +
0x168 = MIPS R10000 +
0x169 = MIPS little endian WCI v2 +
0x183 = Alpha AXP (old) +
0x184 = Alpha AXP +
0x1a2 = Hitachi SH3 +
0x1a3 = Hitachi SH3 DSP +
0x1a6 = Hitachi SH4 +
0x1a8 = Hitachi SH5 +
0x1c0 = ARM little endian +
0x1c2 = Thumb +
0x1d3 = Matsushita AM33 +
0x1f0 = PowerPC little endian +
0x1f1 = PowerPC with floating point support +
0x200 = Intel IA64 +
0x266 = MIPS16 +
0x268 = Motorola 68000 series +
0x284 = Alpha AXP 64-bit +
0x366 = MIPS with FPU +
0x466 = MIPS16 with FPU +
0xebc = EFI Byte Code +
0x8664 = AMD AMD64 +
0x9041 = Mitsubishi M32R little endian +
0xc0ee = clr pure MSIL
+
2TimeStampno 
9ImageFileCharacteristicsno +
Bit 0 = No relocs +
Bit 1 = Executable +
Bit 2 = No line numbers +
Bit 3 = No symbols +
Bit 4 = Aggressive working-set trim +
Bit 5 = Large address aware +
Bit 7 = Bytes reversed lo +
Bit 8 = 32-bit +
Bit 9 = No debug +
Bit 10 = Removable run from swap +
Bit 11 = Net run from swap +
Bit 12 = System file +
Bit 13 = DLL +
Bit 14 = Uniprocessor only +
Bit 15 = Bytes reversed hi
+
10PETypeno0x107 = ROM Image +
0x10b = PE32 +
0x20b = PE32+
11LinkerVersionno 
12CodeSizeno 
14InitializedDataSizeno 
16UninitializedDataSizeno 
18EntryPointno 
30OSVersionno 
32ImageVersionno 
34SubsystemVersionno 
44Subsystemno +
0 = Unknown +
1 = Native +
2 = Windows GUI +
3 = Windows command line +
5 = OS/2 command line +
7 = POSIX command line +
9 = Windows CE GUI +
10 = EFI application +
11 = EFI boot service +
12 = EFI runtime driver +
13 = EFI ROM +
14 = XBOX
+
+ +

EXE PEVersion Tags

+

Information extracted from the VS_VERSION_INFO structure of Windows PE +files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
2FileVersionNumberno 
4ProductVersionNumberno 
6FileFlagsMaskno 
7FileFlagsno + +
Bit 0 = Debug +
Bit 1 = Pre-release +
Bit 2 = Patched
  Bit 3 = Private build +
Bit 4 = Info inferred +
Bit 5 = Special build
+
8FileOSno +
0x1 = Win16 +
0x2 = PM-16 +
0x3 = PM-32 +
0x4 = Win32 +
0x10000 = DOS +
0x10001 = Windows 16-bit +
0x10004 = Windows 32-bit +
0x20000 = OS/2 16-bit +
0x20002 = OS/2 16-bit PM-16 +
0x30000 = OS/2 32-bit +
0x30003 = OS/2 32-bit PM-32 +
0x40000 = Windows NT +
0x40004 = Windows NT 32-bit
+
9ObjectFileTypeno +
0 = Unknown +
1 = Executable application +
2 = Dynamic link library +
3 = Driver +
4 = Font +
5 = VxD +
7 = Static library
+
10FileSubtypeno 
+ +

EXE PEString Tags

+

Resource strings found in Windows PE files. The TagID's are not shown +because they are the same as the Tag Name. ExifTool will extract any +existing StringFileInfo tags even if not listed in this table.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
BuildDateno 
BuildVersionno 
CharacterSetno(extracted from the StringFileInfo value) +
'0000' = ASCII +
'03A4' = Windows, Japan (Shift - JIS X-0208) +
'03A8' = Windows, Chinese (Simplified) +
'03B5' = Windows, Korea (Shift - KSC 5601) +
'03B6' = Windows, Taiwan (Big5) +
'04B0' = Unicode +
'04E2' = Windows, Latin2 (Eastern European) +
'04E3' = Windows, Cyrillic +
'04E4' = Windows, Latin1 +
'04E5' = Windows, Greek +
'04E6' = Windows, Turkish +
'04E7' = Windows, Hebrew +
'04E8' = Windows, Arabic
+
Commentsno 
CompanyNameno 
Copyrightno 
FileDescriptionno 
FileVersionno 
InternalNameno 
LanguageCodeno--> EXE LanguageCode Values +
(Windows code page; extracted from the StringFileInfo value)
LegalCopyrightno 
LegalTrademarksno 
OriginalFileNameno 
PrivateBuildno 
ProductNameno 
ProductVersionno 
SpecialBuildno 
+ +

EXE LanguageCode Values

+

See https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid +for the full list of Microsoft language codes.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueLanguageCodeValueLanguageCodeValueLanguageCode
'0000'= Neutral'0437'= Georgian'040E'= Hungarian
'0400'= Process default'0438'= Faeroese'040F'= Icelandic
'0401'= Arabic'0439'= Hindi'041A'= Croato-Serbian (Latin)
'0402'= Bulgarian'0440'= Kyrgyz'041B'= Slovak
'0403'= Catalan'0441'= Swahili'041C'= Albanian
'0404'= Chinese (Traditional)'0443'= Uzbek'041D'= Swedish
'0405'= Czech'0444'= Tatar'041E'= Thai
'0406'= Danish'0445'= Bengali'041F'= Turkish
'0407'= German'0446'= Punjabi'042a'= Vietnamese
'0408'= Greek'0447'= Gujarati'042b'= Armenian
'0409'= English (U.S.)'0448'= Oriya'042c'= Azeri
'0410'= Italian'0449'= Tamil'042d'= Basque
'0411'= Japanese'0450'= Mongolian'042e'= Sorbian
'0412'= Korean'0456'= Galician'042f'= Macedonian
'0413'= Dutch'0457'= Konkani'043a'= Maltese
'0414'= Norwegian (Bokml)'0458'= Manipuri'043b'= Saami
'0415'= Polish'0459'= Sindhi'043c'= Gaelic
'0416'= Portuguese (Brazilian)'0460'= Kashmiri'043e'= Malay
'0417'= Rhaeto-Romanic'0461'= Nepali'043f'= Kazak
'0418'= Romanian'0465'= Divehi'044a'= Telugu
'0419'= Russian'0490'= Walon'044b'= Kannada
'0420'= Urdu'0491'= Cornish'044c'= Malayalam
'0421'= Indonesian'0492'= Welsh'044d'= Assamese
'0422'= Ukrainian'0493'= Breton'044e'= Marathi
'0423'= Belarusian'0800'= Neutral 2'044f'= Sanskrit
'0424'= Slovenian'0804'= Chinese (Simplified)'045a'= Syriac
'0425'= Estonian'0807'= German (Swiss)'047f'= Invariant
'0426'= Latvian'0809'= English (British)'048f'= Esperanto
'0427'= Lithuanian'0810'= Italian (Swiss)'080A'= Spanish (Mexican)
'0428'= Maori'0813'= Dutch (Belgian)'080C'= French (Belgian)
'0429'= Farsi'0814'= Norwegian (Nynorsk)'081A'= Serbo-Croatian (Cyrillic)
'0430'= Sutu'0816'= Portuguese'0C07'= German (Austrian)
'0431'= Tsonga'1009'= English (Canadian)'0C09'= English (Australian)
'0432'= Tswana'007F'= Invariant'0C0A'= Spanish (Modern)
'0433'= Venda'040A'= Spanish (Castilian)'0C0C'= French (Canadian)
'0434'= Xhosa'040B'= Finnish'100C'= French (Swiss)
'0435'= Zulu'040C'= French  
'0436'= Afrikaans'040D'= Hebrew  
+ +

EXE MachO Tags

+

Information extracted from Mach-O (Mac OS X) executable files and DYLIB +libraries.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0CPUArchitectureno 
1CPUByteOrderno 
2CPUCountno 
3CPUTypeno+ + +
-1 = Any +
1 = VAX +
2 = ROMP +
4 = NS32032 +
5 = NS32332 +
6 = MC680x0 +
7 = x86 +
8 = MIPS +
9 = NS32532 +
10 = MC98000
  11 = HPPA +
12 = ARM +
13 = MC88000 +
14 = SPARC +
15 = i860 big endian +
16 = i860 little endian +
17 = RS6000 +
18 = PowerPC +
255 = VEO
+
4CPUSubtypeno+ +
'1 0' = VAX (all) +
'1 1' = VAX780 +
'1 2' = VAX785 +
'1 3' = VAX750 +
'1 4' = VAX730 +
'1 5' = UVAXI +
'1 6' = UVAXII +
'1 7' = VAX8200 +
'1 8' = VAX8500 +
'1 9' = VAX8600 +
'1 10' = VAX8650 +
'1 11' = VAX8800 +
'1 12' = UVAXIII +
'2 0' = RT (all) +
'2 1' = RT PC +
'2 2' = RT APC +
'2 3' = RT 135 +
'4 0' = NS32032 (all) +
'4 1' = NS32032 DPC (032 CPU) +
'4 2' = NS32032 SQT +
'4 3' = NS32032 APC FPU (32081) +
'4 4' = NS32032 APC FPA (Weitek) +
'4 5' = NS32032 XPC (532) +
'5 0' = NS32332 (all) +
'5 1' = NS32332 DPC (032 CPU) +
'5 2' = NS32332 SQT +
'5 3' = NS32332 APC FPU (32081) +
'5 4' = NS32332 APC FPA (Weitek) +
'5 5' = NS32332 XPC (532) +
'6 1' = MC680x0 (all) +
'6 2' = MC68040 +
'6 3' = MC68030 +
'7 3' = i386 (all) +
'7 4' = i486 +
'7 5' = i586 +
'7 8' = Pentium III +
'7 9' = Pentium M +
'7 10' = Pentium 4 +
'7 11' = Itanium +
'7 12' = Xeon +
'7 22' = Pentium Pro +
'7 24' = Pentium III M +
'7 26' = Pentium 4 M +
'7 27' = Itanium 2 +
'7 28' = Xeon MP +
'7 40' = Pentium III Xeon +
'7 54' = Pentium II M3 +
'7 86' = Pentium II M5 +
'7 103' = Celeron +
'7 119' = Celeron Mobile +
'7 132' = i486SX +
'8 0' = MIPS (all) +
'8 1' = MIPS R2300 +
'8 2' = MIPS R2600 +
'8 3' = MIPS R2800 +
'8 4' = MIPS R2000a +
'8 5' = MIPS R2000 +
'8 6' = MIPS R3000a +
'8 7' = MIPS R3000 +
'10 0' = MC98000 (all) +
'10 1' = MC98601 +
'11 0' = HPPA (all) +
'11 1' = HPPA 7100LC +
'12 0' = ARM (all) +
'12 1' = ARM A500 ARCH +
'12 2' = ARM A500 +
'12 3' = ARM A440 +
'12 4' = ARM M4 +
'12 5' = ARM A680/V4T +
'12 6' = ARM V6 +
'12 7' = ARM V5TEJ +
'12 8' = ARM XSCALE +
'12 9' = ARM V7 +
'13 0' = MC88000 (all) +
'13 1' = MC88100 +
'13 2' = MC88110 +
'14 0' = SPARC (all) +
'14 1' = SUN 4/260 +
'14 2' = SUN 4/110 +
'15 0' = i860 (all) +
'15 1' = i860 860 +
'16 0' = i860 little (all) +
'16 1' = i860 little +
'17 0' = RS6000 (all) +
'17 1' = RS6000 +
'18 0' = PowerPC (all) +
'18 1' = PowerPC 601 +
'18 2' = PowerPC 602 +
'18 3' = PowerPC 603 +
'18 4' = PowerPC 603e +
'18 5' = PowerPC 603ev +
'18 6' = PowerPC 604 +
'18 7' = PowerPC 604e +
'18 8' = PowerPC 620 +
'18 9' = PowerPC 750 +
'18 10' = PowerPC 7400 +
'18 11' = PowerPC 7450 +
'18 100' = PowerPC 970 +
'255 1' = VEO 1 +
'255 2' = VEO 2
+
5ObjectFileTypeno +
-1 = Static library +
0x1 = Relocatable object +
0x2 = Demand paged executable +
0x3 = Fixed VM shared library +
0x4 = Core +
0x5 = Preloaded executable +
0x6 = Dynamically bound shared library +
0x7 = Dynamic link editor +
0x8 = Dynamically bound bundle +
0x9 = Shared library stub for static linking +
0xa = Debug information +
0xb = x86_64 kexts
+
6ObjectFlagsno +
Bit 0 = No undefs +
Bit 1 = Incrementa link +
Bit 2 = Dyld link +
Bit 3 = Bind at load +
Bit 4 = Prebound +
Bit 5 = Split segs +
Bit 6 = Lazy init +
Bit 7 = Two level +
Bit 8 = Force flat +
Bit 9 = No multi defs +
Bit 10 = No fix prebinding +
Bit 11 = Prebindable +
Bit 12 = All mods bound +
Bit 13 = Subsections via symbols +
Bit 14 = Canonical +
Bit 15 = Weak defines +
Bit 16 = Binds to weak +
Bit 17 = Allow stack execution +
Bit 18 = Dead strippable dylib +
Bit 19 = Root safe +
Bit 20 = No reexported dylibs +
Bit 21 = Random address
+
+ +

EXE PEF Tags

+

Information extracted from PEF (Classic MacOS) executable files and +libraries.

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
2CPUArchitectureno'm68k' = 68000 +
'pwpc' = PowerPC
3PEFVersionno 
4TimeStampno 
+ +

EXE ELF Tags

+

Information extracted from ELF (Unix) executable files and SO libraries.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4CPUArchitectureno1 = 32 bit +
2 = 64 bit
5CPUByteOrderno1 = Little endian +
2 = Big endian
16ObjectFileTypeno0 = None +
1 = Relocatable file +
2 = Executable file +
3 = Shared object file +
4 = Core file
18CPUTypeno0 = None +
1 = AT&T WE 32100 +
2 = SPARC +
3 = i386 +
4 = Motorola 68000 +
5 = Motorola 88000 +
6 = i486 +
7 = i860 +
8 = MIPS R3000 +
10 = MIPS R4000 +
15 = HPPA +
18 = Sun v8plus +
20 = PowerPC +
21 = PowerPC 64-bit +
22 = IBM S/390 +
23 = Cell BE SPU +
42 = SuperH +
43 = SPARC v9 64-bit +
46 = Renesas H8/300,300H,H8S +
50 = HP/Intel IA-64 +
62 = AMD x86-64 +
76 = Axis Communications 32-bit embedded processor +
87 = NEC v850 +
88 = Renesas M32R +
21569 = Fujitsu FR-V +
36902 = Alpha +
36929 = m32r (old) +
36992 = v850 (old) +
41872 = S/390 (old)
+ +

EXE AR Tags

+

Information extracted from static libraries.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
16CreateDateno 
+ +

EXE CHM Tags

+

Tags extracted from Microsoft Compiled HTML files.

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1CHMVersionno 
5LanguageCodeno--> EXE LanguageCode Values
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Mar 19, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/EXIF.html b/html/TagNames/EXIF.html new file mode 100644 index 0000000..19d243c --- /dev/null +++ b/html/TagNames/EXIF.html @@ -0,0 +1,3824 @@ + + + + +EXIF Tags + + + +

EXIF Tags

+

+EXIF stands for "Exchangeable Image File Format". This type of information +is formatted according to the TIFF specification, and may be found in JPG, +TIFF, PNG, JP2, PGF, MIFF, HDP, PSP and XCF images, as well as many +TIFF-based RAW images, and even some AVI and MOV videos.

+ +

The EXIF meta information is organized into different Image File Directories +(IFD's) within an image. The names of these IFD's correspond to the +ExifTool family 1 group names. When writing EXIF information, the default +Group listed below is used unless another group is specified.

+ +

Mandatory tags (indicated by a colon after the Writable type) may be +added automatically with default values when creating a new IFD, and the IFD +is removed automatically when deleting tags if only default-valued mandatory +tags remain.

+ +

The table below lists all EXIF tags. Also listed are TIFF, DNG, HDP and +other tags which are not part of the EXIF specification, but may co-exist +with EXIF tags in some images. Tags which are part of the EXIF 2.32 +specification have an underlined Tag Name in the HTML version of this +documentation. See +https://web.archive.org/web/20190624045241if_/http://www.cipa.jp:80/std/documents/e/DC-008-Translation-2019-E.pdf +for the official EXIF 2.32 specification. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableGroupValues / Notes
0x0001InteropIndexstring!InteropIFD'R03' = R03 - DCF option file (Adobe RGB) +
'R98' = R98 - DCF basic file (sRGB) +
'THM' = THM - DCF thumbnail file
0x0002InteropVersionundef!:InteropIFD 
0x000bProcessingSoftwarestringIFD0(used by ACD Systems Digital Imaging)
0x00feSubfileTypeint32u!IFD0(called NewSubfileType by the TIFF specification) +
0x0 = Full-resolution image +
0x1 = Reduced-resolution image +
0x2 = Single page of multi-page image +
0x3 = Single page of multi-page reduced-resolution image +
0x4 = Transparency mask +
0x5 = Transparency mask of reduced-resolution image +
0x6 = Transparency mask of multi-page image +
0x7 = Transparency mask of reduced-resolution multi-page image +
0x8 = Depth map +
0x9 = Depth map of reduced-resolution image +
0x10 = Enhanced image data +
0x10001 = Alternate reduced-resolution image +
0x10004 = Semantic Mask +
0xffffffff = invalid +
Bit 0 = Reduced resolution +
Bit 1 = Single page +
Bit 2 = Transparency mask +
Bit 3 = TIFF/IT final page +
Bit 4 = TIFF-FX mixed raster content
0x00ffOldSubfileTypeint16u!IFD0(called SubfileType by the TIFF specification) +
1 = Full-resolution image +
2 = Reduced-resolution image +
3 = Single page of multi-page image
0x0100ImageWidthint32u!IFD0 
0x0101ImageHeightint32u!IFD0(called ImageLength by the EXIF spec.)
0x0102BitsPerSampleint16u[n]!IFD0 
0x0103Compressionint16u!:IFD0--> EXIF Compression Values
0x0106PhotometricInterpretationint16u!IFD0 +
0 = WhiteIsZero +
1 = BlackIsZero +
2 = RGB +
3 = RGB Palette +
4 = Transparency Mask +
5 = CMYK +
6 = YCbCr +
8 = CIELab +
9 = ICCLab +
10 = ITULab +
32803 = Color Filter Array +
32844 = Pixar LogL +
32845 = Pixar LogLuv +
32892 = Sequential Color Filter +
34892 = Linear Raw +
51177 = Depth Map +
52527 = Semantic Mask
+
0x0107Thresholdingint16u!IFD01 = No dithering or halftoning +
2 = Ordered dither or halftone +
3 = Randomized dither
0x0108CellWidthint16u!IFD0 
0x0109CellLengthint16u!IFD0 
0x010aFillOrderint16u!IFD01 = Normal +
2 = Reversed
0x010dDocumentNamestringIFD0 
0x010eImageDescriptionstringIFD0 
0x010fMakestringIFD0 
0x0110ModelstringIFD0 
0x0111StripOffsets +
PreviewImageStart +
PreviewImageStart +
JpgFromRawStart
no
int32u*
int32u*
int32u*
-
IFD0
All
SubIFD2
(called StripOffsets in most locations, but it is PreviewImageStart in IFD0 +of CR2 images and various IFD's of DNG images except for SubIFD2 where it is +JpgFromRawStart)
0x0112Orientationint16uIFD0 +
1 = Horizontal (normal) +
2 = Mirror horizontal +
3 = Rotate 180 +
4 = Mirror vertical +
5 = Mirror horizontal and rotate 270 CW +
6 = Rotate 90 CW +
7 = Mirror horizontal and rotate 90 CW +
8 = Rotate 270 CW
+
0x0115SamplesPerPixelint16u!IFD0 
0x0116RowsPerStripint32u!IFD0 
0x0117StripByteCounts +
PreviewImageLength +
PreviewImageLength +
JpgFromRawLength
no
int32u*
int32u*
int32u*
-
IFD0
All
SubIFD2
(called StripByteCounts in most locations, but it is PreviewImageLength in +IFD0 of CR2 images and various IFD's of DNG images except for SubIFD2 where +it is JpgFromRawLength)
0x0118MinSampleValueint16uIFD0 
0x0119MaxSampleValueint16uIFD0 
0x011aXResolutionrational64u:IFD0 
0x011bYResolutionrational64u:IFD0 
0x011cPlanarConfigurationint16u!IFD01 = Chunky +
2 = Planar
0x011dPageNamestringIFD0 
0x011eXPositionrational64uIFD0 
0x011fYPositionrational64uIFD0 
0x0120FreeOffsetsno- 
0x0121FreeByteCountsno- 
0x0122GrayResponseUnitint16uIFD01 = 0.1 +
2 = 0.001 +
3 = 0.0001 +
4 = 1e-05 +
5 = 1e-06
0x0123GrayResponseCurveno- 
0x0124T4Optionsno-Bit 0 = 2-Dimensional encoding +
Bit 1 = Uncompressed +
Bit 2 = Fill bits added
0x0125T6Optionsno-Bit 1 = Uncompressed
0x0128ResolutionUnitint16u:IFD0(the value 1 is not standard EXIF) +
1 = None +
2 = inches +
3 = cm
0x0129PageNumberint16u[2]IFD0 
0x012cColorResponseUnitno- 
0x012dTransferFunctionint16u[768]!IFD0 
0x0131SoftwarestringIFD0 
0x0132ModifyDatestringIFD0(called DateTime by the EXIF spec.)
0x013bArtiststringIFD0(becomes a list-type tag when the MWG module is loaded)
0x013cHostComputerstringIFD0 
0x013dPredictorint16u!IFD0 +
1 = None +
2 = Horizontal differencing +
3 = Floating point +
34892 = Horizontal difference X2 +
34893 = Horizontal difference X4 +
34894 = Floating point X2 +
34895 = Floating point X4
+
0x013eWhitePointrational64u[2]IFD0 
0x013fPrimaryChromaticitiesrational64u[6]IFD0 
0x0140ColorMapno- 
0x0141HalftoneHintsint16u[2]IFD0 
0x0142TileWidthint32u!IFD0 
0x0143TileLengthint32u!IFD0 
0x0144TileOffsetsno- 
0x0145TileByteCountsno- 
0x0146BadFaxLinesno- 
0x0147CleanFaxDatano-0 = Clean +
1 = Regenerated +
2 = Unclean
0x0148ConsecutiveBadFaxLinesno- 
0x014aSubIFD +
A100DataOffset
-
no
-
IFD0
--> EXIF Tags +
(the data offset in original Sony DSLR-A100 ARW images)
0x014cInkSetint16uIFD01 = CMYK +
2 = Not CMYK
0x014dInkNamesno- 
0x014eNumberofInksno- 
0x0150DotRangeno- 
0x0151TargetPrinterstringIFD0 
0x0152ExtraSamplesno-0 = Unspecified +
1 = Associated Alpha +
2 = Unassociated Alpha
0x0153SampleFormatnoSubIFD(SamplesPerPixel values) +
[Values 0-3]
+ +
1 = Unsigned +
2 = Signed +
3 = Float
  4 = Undefined +
5 = Complex int +
6 = Complex float
+
0x0154SMinSampleValueno- 
0x0155SMaxSampleValueno- 
0x0156TransferRangeno- 
0x0157ClipPathno- 
0x0158XClipPathUnitsno- 
0x0159YClipPathUnitsno- 
0x015aIndexedno-0 = Not indexed +
1 = Indexed
0x015bJPEGTablesno- 
0x015fOPIProxyno-0 = Higher resolution image does not exist +
1 = Higher resolution image exists
0x0190GlobalParametersIFD----> EXIF Tags
0x0191ProfileTypeno-0 = Unspecified +
1 = Group 3 FAX
0x0192FaxProfileno- +
0 = Unknown +
1 = Minimal B&W lossless, S +
2 = Extended B&W lossless, F +
3 = Lossless JBIG B&W, J +
4 = Lossy color and grayscale, C +
5 = Lossless color and grayscale, L +
6 = Mixed raster content, M +
7 = Profile T +
255 = Multi Profiles
+
0x0193CodingMethodsno- +
Bit 0 = Unspecified compression +
Bit 1 = Modified Huffman +
Bit 2 = Modified Read +
Bit 3 = Modified MR +
Bit 4 = JBIG +
Bit 5 = Baseline JPEG +
Bit 6 = JBIG color
+
0x0194VersionYearno- 
0x0195ModeNumberno- 
0x01b1Decodeno- 
0x01b2DefaultImageColorno- 
0x01b3T82Optionsno- 
0x01b5JPEGTablesno- 
0x0200JPEGProcno-1 = Baseline +
14 = Lossless
0x0201ThumbnailOffset +
ThumbnailOffset +
ThumbnailOffset +
PreviewImageStart +
PreviewImageStart +
JpgFromRawStart +
JpgFromRawStart +
OtherImageStart +
OtherImageStart +
OtherImageStart
int32u*
int32u*
int32u*
int32u*
int32u*
int32u*
int32u*
int32u*
int32u*
no
IFD1
IFD0
SubIFD
MakerNotes
IFD0
SubIFD
IFD2
SubIFD1
SubIFD2
-
(ThumbnailOffset in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW +images and AVI and MOV videos, and the SubIFD in IFD1 of SRW images; +PreviewImageStart in MakerNotes and IFD0 of ARW and SR2 images; +JpgFromRawStart in SubIFD of NEF images and IFD2 of PEF images; and +OtherImageStart in everything else)
0x0202ThumbnailLength +
ThumbnailLength +
ThumbnailLength +
PreviewImageLength +
PreviewImageLength +
JpgFromRawLength +
JpgFromRawLength +
OtherImageLength +
OtherImageLength +
OtherImageLength
int32u*
int32u*
int32u*
int32u*
int32u*
int32u*
int32u*
int32u*
int32u*
no
IFD1
IFD0
SubIFD
MakerNotes
IFD0
SubIFD
IFD2
SubIFD1
SubIFD2
-
(ThumbnailLength in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW +images and AVI and MOV videos, and the SubIFD in IFD1 of SRW images; +PreviewImageLength in MakerNotes and IFD0 of ARW and SR2 images; +JpgFromRawLength in SubIFD of NEF images, and IFD2 of PEF images; and +OtherImageLength in everything else)
0x0203JPEGRestartIntervalno- 
0x0205JPEGLosslessPredictorsno- 
0x0206JPEGPointTransformsno- 
0x0207JPEGQTablesno- 
0x0208JPEGDCTablesno- 
0x0209JPEGACTablesno- 
0x0211YCbCrCoefficientsrational64u[3]!IFD0 
0x0212YCbCrSubSamplingint16u[2]!IFD0 + +
'1 1' = YCbCr4:4:4 (1 1) +
'1 2' = YCbCr4:4:0 (1 2) +
'1 4' = YCbCr4:4:1 (1 4) +
'2 1' = YCbCr4:2:2 (2 1)
  '2 2' = YCbCr4:2:0 (2 2) +
'2 4' = YCbCr4:2:1 (2 4) +
'4 1' = YCbCr4:1:1 (4 1) +
'4 2' = YCbCr4:1:0 (4 2)
+
0x0213YCbCrPositioningint16u!:IFD01 = Centered +
2 = Co-sited
0x0214ReferenceBlackWhiterational64u[6]IFD0 
0x022fStripRowCountsno- 
0x02bcApplicationNotesint8u!IFD0--> XMP Tags
0x03e7USPTOMiscellaneousno- 
0x1000RelatedImageFileFormatstring!InteropIFD 
0x1001RelatedImageWidthint16u!InteropIFD 
0x1002RelatedImageHeightint16u!InteropIFD(called RelatedImageLength by the DCF spec.)
0x4746Ratingint16u/IFD0 
0x4747XP_DIP_XMLno- 
0x4748StitchInfo----> Microsoft Stitch Tags
0x4749RatingPercentint16u/IFD0 
0x7000SonyRawFileTypeno-0 = Sony Uncompressed 14-bit RAW +
1 = Sony Uncompressed 12-bit RAW +
2 = Sony Compressed RAW +
3 = Sony Lossless Compressed RAW +
4 = Sony Lossless Compressed RAW 2
0x7010SonyToneCurveno- 
0x7031VignettingCorrectionint16s!SubIFD(found in Sony ARW images) +
256 = Off +
257 = Auto +
272 = Auto (ILCE-1) +
511 = No correction params available
0x7032VignettingCorrParamsint16s[17]!SubIFD(found in Sony ARW images)
0x7034ChromaticAberrationCorrectionint16s!SubIFD(found in Sony ARW images) +
0 = Off +
1 = Auto +
255 = No correction params available
0x7035ChromaticAberrationCorrParamsint16s[33]!SubIFD(found in Sony ARW images)
0x7036DistortionCorrectionint16s!SubIFD(found in Sony ARW images) +
0 = Off +
1 = Auto +
17 = Auto fixed by lens +
255 = No correction params available
0x7037DistortionCorrParamsint16s[17]!SubIFD(found in Sony ARW images)
0x74c7SonyCropTopLeftint32u[2]!SubIFD 
0x74c8SonyCropSizeint32u[2]!SubIFD 
0x800dImageIDno- 
0x80a3WangTag1no- 
0x80a4WangAnnotationno- 
0x80a5WangTag3no- 
0x80a6WangTag4no- 
0x80b9ImageReferencePointsno- 
0x80baRegionXformTackPointno- 
0x80bbWarpQuadrilateralno- 
0x80bcAffineTransformMatno- 
0x80e3Matteingno- 
0x80e4DataTypeno- 
0x80e5ImageDepthno- 
0x80e6TileDepthno- 
0x8214ImageFullWidthno- 
0x8215ImageFullHeightno- 
0x8216TextureFormatno- 
0x8217WrapModesno- 
0x8218FovCotno- 
0x8219MatrixWorldToScreenno- 
0x821aMatrixWorldToCamerano- 
0x827dModel2no- 
0x828dCFARepeatPatternDimint16u[2]!SubIFD 
0x828eCFAPattern2int8u[n]!SubIFD 
0x828fBatteryLevelno- 
0x8290KodakIFD----> Kodak IFD Tags +
(used in various types of Kodak images)
0x8298CopyrightstringIFD0(may contain copyright notices for photographer and editor, separated by a +newline. As per the EXIF specification, the newline is replaced by a null +byte when writing to file, but this may be avoided by disabling the print +conversion)
0x829aExposureTimerational64uExifIFD 
0x829dFNumberrational64uExifIFD 
0x82a5MDFileTagno-(tags 0x82a5-0x82ac are used in Molecular Dynamics GEL files)
0x82a6MDScalePixelno- 
0x82a7MDColorTableno- 
0x82a8MDLabNameno- 
0x82a9MDSampleInfono- 
0x82aaMDPrepDateno- 
0x82abMDPrepTimeno- 
0x82acMDFileUnitsno- 
0x830ePixelScaledouble[3]IFD0 
0x8335AdventScaleno- 
0x8336AdventRevisionno- 
0x835cUIC1Tagno- 
0x835dUIC2Tagno- 
0x835eUIC3Tagno- 
0x835fUIC4Tagno- 
0x83bbIPTC-NAAint32u!IFD0--> IPTC Tags
0x847eIntergraphPacketDatano- 
0x847fIntergraphFlagRegistersno- 
0x8480IntergraphMatrixdouble[n]IFD0 
0x8481INGRReservedno- 
0x8482ModelTiePointdouble[n]IFD0 
0x84e0Siteno- 
0x84e1ColorSequenceno- 
0x84e2IT8Headerno- 
0x84e3RasterPaddingno-0 = Byte +
1 = Word +
2 = Long Word +
9 = Sector +
10 = Long Sector
0x84e4BitsPerRunLengthno- 
0x84e5BitsPerExtendedRunLengthno- 
0x84e6ColorTableno- 
0x84e7ImageColorIndicatorno-0 = Unspecified Image Color +
1 = Specified Image Color
0x84e8BackgroundColorIndicatorno-0 = Unspecified Background Color +
1 = Specified Background Color
0x84e9ImageColorValueno- 
0x84eaBackgroundColorValueno- 
0x84ebPixelIntensityRangeno- 
0x84ecTransparencyIndicatorno- 
0x84edColorCharacterizationno- 
0x84eeHCUsageno-0 = CT +
1 = Line Art +
2 = Trap
0x84efTrapIndicatorno- 
0x84f0CMYKEquivalentno- 
0x8546SEMInfostringIFD0(found in some scanning electron microscope images)
0x8568AFCP_IPTC----> IPTC Tags
0x85b8PixelMagicJBIGOptionsno- 
0x85d7JPLCartoIFDno- 
0x85d8ModelTransformdouble[16]IFD0 
0x8602WB_GRGBLevelsno-(found in IFD0 of Leaf MOS images)
0x8606LeafData----> Leaf Tags
0x8649PhotoshopSettings-IFD0--> Photoshop Tags
0x8769ExifOffset-IFD0--> EXIF Tags
0x8773ICC_Profile-IFD0--> ICC_Profile Tags
0x877fTIFF_FXExtensionsno-Bit 0 = Resolution/Image Width +
Bit 1 = N Layer Profile M +
Bit 2 = Shared Data +
Bit 3 = B&W JBIG2 +
Bit 4 = JBIG2 Profile M
0x8780MultiProfilesno- +
Bit 0 = Profile S +
Bit 1 = Profile F +
Bit 2 = Profile J +
Bit 3 = Profile C +
Bit 4 = Profile L +
Bit 5 = Profile M +
Bit 6 = Profile T +
Bit 7 = Resolution/Image Width +
Bit 8 = N Layer Profile M +
Bit 9 = Shared Data +
Bit 10 = JBIG2 Profile M
+
0x8781SharedDatano- 
0x8782T88Optionsno- 
0x87acImageLayerno- 
0x87afGeoTiffDirectoryint16u[0.5]IFD0(these "GeoTiff" tags may read and written as a block, but they aren't +extracted unless specifically requested. Byte order changes are handled +automatically when copying between TIFF images with different byte order)
0x87b0GeoTiffDoubleParamsdouble[0.125]IFD0 
0x87b1GeoTiffAsciiParamsstringIFD0 
0x87beJBIGOptionsno- 
0x8822ExposureProgramint16uExifIFD(the value of 9 is not standard EXIF, but is used by the Canon EOS 7D) +
0 = Not Defined +
1 = Manual +
2 = Program AE +
3 = Aperture-priority AE +
4 = Shutter speed priority AE +
5 = Creative (Slow speed) +
6 = Action (High speed) +
7 = Portrait +
8 = Landscape +
9 = Bulb
+
0x8824SpectralSensitivitystringExifIFD 
0x8825GPSInfo-IFD0--> GPS Tags
0x8827ISOint16u[n]ExifIFD(called ISOSpeedRatings by EXIF 2.2, then PhotographicSensitivity by the EXIF +2.3 spec.)
0x8828Opto-ElectricConvFactorno-(called OECF by the EXIF spec.)
0x8829Interlaceno- 
0x882aTimeZoneOffsetint16s[n]ExifIFD(1 or 2 values: 1. The time zone offset of DateTimeOriginal from GMT in +hours, 2. If present, the time zone offset of ModifyDate)
0x882bSelfTimerModeint16uExifIFD 
0x8830SensitivityTypeint16uExifIFD(applies to EXIF:ISO tag) +
0 = Unknown +
1 = Standard Output Sensitivity +
2 = Recommended Exposure Index +
3 = ISO Speed +
4 = Standard Output Sensitivity and Recommended Exposure Index +
5 = Standard Output Sensitivity and ISO Speed +
6 = Recommended Exposure Index and ISO Speed +
7 = Standard Output Sensitivity, Recommended Exposure Index and ISO Speed
0x8831StandardOutputSensitivityint32uExifIFD 
0x8832RecommendedExposureIndexint32uExifIFD 
0x8833ISOSpeedint32uExifIFD 
0x8834ISOSpeedLatitudeyyyint32uExifIFD 
0x8835ISOSpeedLatitudezzzint32uExifIFD 
0x885cFaxRecvParamsno- 
0x885dFaxSubAddressno- 
0x885eFaxRecvTimeno- 
0x8871FedexEDRno- 
0x888aLeafSubIFD----> Leaf SubIFD Tags
0x9000ExifVersionundef:ExifIFD 
0x9003DateTimeOriginalstringExifIFD(date/time when original image was taken)
0x9004CreateDatestringExifIFD(called DateTimeDigitized by the EXIF spec.)
0x9009GooglePlusUploadCodeundef[n]ExifIFD 
0x9010OffsetTimestringExifIFD(time zone for ModifyDate)
0x9011OffsetTimeOriginalstringExifIFD(time zone for DateTimeOriginal)
0x9012OffsetTimeDigitizedstringExifIFD(time zone for CreateDate)
0x9101ComponentsConfigurationundef[4]!:ExifIFD + +
0 = - +
1 = Y +
2 = Cb +
3 = Cr
  4 = R +
5 = G +
6 = B
+
0x9102CompressedBitsPerPixelrational64u!ExifIFD 
0x9201ShutterSpeedValuerational64sExifIFD(displayed in seconds, but stored as an APEX value)
0x9202ApertureValuerational64uExifIFD(displayed as an F number, but stored as an APEX value)
0x9203BrightnessValuerational64sExifIFD 
0x9204ExposureCompensationrational64sExifIFD(called ExposureBiasValue by the EXIF spec.)
0x9205MaxApertureValuerational64uExifIFD(displayed as an F number, but stored as an APEX value)
0x9206SubjectDistancerational64uExifIFD 
0x9207MeteringModeint16uExifIFD +
0 = Unknown +
1 = Average +
2 = Center-weighted average +
3 = Spot +
4 = Multi-spot +
5 = Multi-segment +
6 = Partial +
255 = Other
+
0x9208LightSourceint16uExifIFD--> EXIF LightSource Values
0x9209Flashint16uExifIFD--> EXIF Flash Values
0x920aFocalLengthrational64uExifIFD 
0x920bFlashEnergyno- 
0x920cSpatialFrequencyResponseno- 
0x920dNoiseno- 
0x920eFocalPlaneXResolutionno- 
0x920fFocalPlaneYResolutionno- 
0x9210FocalPlaneResolutionUnitno-1 = None +
2 = inches +
3 = cm +
4 = mm +
5 = um
0x9211ImageNumberint32uExifIFD 
0x9212SecurityClassificationstringExifIFD'C' = Confidential +
'R' = Restricted +
'S' = Secret +
'T' = Top Secret +
'U' = Unclassified
0x9213ImageHistorystringExifIFD 
0x9214SubjectAreaint16u[n]ExifIFD 
0x9215ExposureIndexno- 
0x9216TIFF-EPStandardIDno- 
0x9217SensingMethodno- +
1 = Monochrome area +
2 = One-chip color area +
3 = Two-chip color area +
4 = Three-chip color area +
5 = Color sequential area +
6 = Monochrome linear +
7 = Trilinear +
8 = Color sequential linear
+
0x923aCIP3DataFileno- 
0x923bCIP3Sheetno- 
0x923cCIP3Sideno- 
0x923fStoNitsno- 
0x927cMakerNoteApple +
MakerNoteNikon +
MakerNoteCanon +
MakerNoteCasio +
MakerNoteCasio2 +
MakerNoteDJIInfo +
MakerNoteDJI +
MakerNoteFLIR +
MakerNoteFujiFilm +
MakerNoteGE +
MakerNoteGE2 +
MakerNoteHasselblad +
MakerNoteHP +
MakerNoteHP2 +
MakerNoteHP4 +
MakerNoteHP6 +
MakerNoteISL +
MakerNoteJVC +
MakerNoteJVCText +
MakerNoteKodak1a +
MakerNoteKodak1b +
MakerNoteKodak2 +
MakerNoteKodak3 +
MakerNoteKodak4 +
MakerNoteKodak5 +
MakerNoteKodak6a +
MakerNoteKodak6b +
MakerNoteKodak7 +
MakerNoteKodak8a +
MakerNoteKodak8b +
MakerNoteKodak8c +
MakerNoteKodak9 +
MakerNoteKodak10 +
MakerNoteKodak11 +
MakerNoteKodak12 +
MakerNoteKodakUnknown +
MakerNoteKyocera +
MakerNoteMinolta +
MakerNoteMinolta2 +
MakerNoteMinolta3 +
MakerNoteMotorola +
MakerNoteNikon2 +
MakerNoteNikon3 +
MakerNoteNintendo +
MakerNoteOlympus +
MakerNoteOlympus2 +
MakerNoteOlympus3 +
MakerNoteLeica +
MakerNoteLeica2 +
MakerNoteLeica3 +
MakerNoteLeica4 +
MakerNoteLeica5 +
MakerNoteLeica6 +
MakerNoteLeica7 +
MakerNoteLeica8 +
MakerNoteLeica9 +
MakerNoteLeica10 +
MakerNotePanasonic +
MakerNotePanasonic2 +
MakerNotePanasonic3 +
MakerNotePentax +
MakerNotePentax2 +
MakerNotePentax3 +
MakerNotePentax4 +
MakerNotePentax5 +
MakerNotePentax6 +
MakerNotePhaseOne +
MakerNoteReconyx +
MakerNoteReconyx2 +
MakerNoteReconyx3 +
MakerNoteRicohPentax +
MakerNoteRicoh +
MakerNoteRicoh2 +
MakerNoteRicohText +
MakerNoteSamsung1a +
MakerNoteSamsung1b +
MakerNoteSamsung2 +
MakerNoteSanyo +
MakerNoteSanyoC4 +
MakerNoteSanyoPatch +
MakerNoteSigma +
MakerNoteSony +
MakerNoteSony2 +
MakerNoteSony3 +
MakerNoteSony4 +
MakerNoteSony5 +
MakerNoteSonyEricsson +
MakerNoteSonySRF +
MakerNoteUnknownText +
MakerNoteUnknownBinary +
MakerNoteUnknown
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
undef
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
ExifIFD
--> Apple Tags +
--> Nikon Tags +
--> Canon Tags +
--> Casio Tags +
--> Casio Type2 Tags +
--> DJI Info Tags +
--> DJI Tags +
--> FLIR Tags +
--> FujiFilm Tags +
--> GE Tags +
--> FujiFilm Tags +
--> Unknown Tags +
--> HP Tags +
--> HP Type2 Tags +
--> HP Type4 Tags +
--> HP Type6 Tags +
--> Unknown Tags +
--> JVC Tags +
--> JVC Text Tags +
--> Kodak Tags +
--> Kodak Tags +
--> Kodak Type2 Tags +
--> Kodak Type3 Tags +
--> Kodak Type4 Tags +
--> Kodak Type5 Tags +
--> Kodak Type6 Tags +
--> Kodak Type6 Tags +
--> Kodak Type7 Tags +
--> Kodak Type8 Tags +
--> Kodak Type8 Tags +
--> Kodak Type8 Tags +
--> Kodak Type9 Tags +
--> Kodak Type10 Tags +
--> Kodak Type11 Tags +
--> Kodak Type11 Tags +
--> Kodak Unknown Tags +
--> Unknown Tags +
--> Minolta Tags +
--> Olympus Tags +
(not EXIF-based) +
--> Motorola Tags +
--> Nikon Type2 Tags +
--> Nikon Tags +
--> Nintendo Tags +
--> Olympus Tags +
--> Olympus Tags +
--> Olympus Tags +
--> Panasonic Tags +
--> Panasonic Leica2 Tags +
--> Panasonic Leica3 Tags +
--> Panasonic Leica4 Tags +
--> Panasonic Leica5 Tags +
--> Panasonic Leica6 Tags +
--> Panasonic Leica6 Tags +
--> Panasonic Leica5 Tags +
--> Panasonic Leica9 Tags +
--> Panasonic Tags +
--> Panasonic Tags +
--> Panasonic Type2 Tags +
--> Panasonic Tags +
--> Pentax Tags +
--> Pentax Type2 Tags +
--> Casio Type2 Tags +
--> Pentax Type4 Tags +
--> Pentax Tags +
--> Pentax S1 Tags +
--> PhaseOne Tags +
--> Reconyx Tags +
--> Reconyx Type2 Tags +
--> Reconyx Type3 Tags +
--> Pentax Tags +
--> Ricoh Tags +
--> Ricoh Type2 Tags +
--> Ricoh Text Tags +
(Samsung "STMN" maker notes without PreviewImage) +
--> Samsung Tags +
--> Samsung Type2 Tags +
--> Sanyo Tags +
--> Sanyo Tags +
--> Sanyo Tags +
--> Sigma Tags +
--> Sony Tags +
--> Olympus Tags +
--> Olympus Tags +
--> Sony PIC Tags +
--> Sony Tags +
--> Sony Ericsson Tags +
--> Sony SRF Tags +
(unknown text-based maker notes) +
(unknown binary maker notes) +
--> Unknown Tags
0x9286UserCommentundefExifIFD 
0x9290SubSecTimestringExifIFD(fractional seconds for ModifyDate)
0x9291SubSecTimeOriginalstringExifIFD(fractional seconds for DateTimeOriginal)
0x9292SubSecTimeDigitizedstringExifIFD(fractional seconds for CreateDate)
0x932fMSDocumentTextno- 
0x9330MSPropertySetStorageno- 
0x9331MSDocumentTextPositionno- 
0x935cImageSourceDataundef!IFD0--> Photoshop DocumentData Tags
0x9400AmbientTemperaturerational64sExifIFD(ambient temperature in degrees C, called Temperature by the EXIF spec.)
0x9401Humidityrational64uExifIFD(ambient relative humidity in percent)
0x9402Pressurerational64uExifIFD(air pressure in hPa or mbar)
0x9403WaterDepthrational64sExifIFD(depth under water in metres, negative for above water)
0x9404Accelerationrational64uExifIFD(directionless camera acceleration in units of mGal, or 10-5 m/s2)
0x9405CameraElevationAnglerational64sExifIFD 
0x9c9bXPTitleint8uIFD0(tags 0x9c9b-0x9c9f are used by Windows Explorer; special characters +in these values are converted to UTF-8 by default, or Windows Latin1 +with the -L option. XPTitle is ignored by Windows Explorer if +ImageDescription exists)
0x9c9cXPCommentint8uIFD0 
0x9c9dXPAuthorint8uIFD0(ignored by Windows Explorer if Artist exists)
0x9c9eXPKeywordsint8uIFD0 
0x9c9fXPSubjectint8uIFD0 
0xa000FlashpixVersionundef:ExifIFD 
0xa001ColorSpaceint16u:ExifIFD(the value of 0x2 is not standard EXIF. Instead, an Adobe RGB image is +indicated by "Uncalibrated" with an InteropIndex of "R03". The values +0xfffd and 0xfffe are also non-standard, and are used by some Sony cameras) +
0x1 = sRGB +
0x2 = Adobe RGB +
0xfffd = Wide Gamut RGB +
0xfffe = ICC Profile +
0xffff = Uncalibrated
0xa002ExifImageWidthint16u:ExifIFD(called PixelXDimension by the EXIF spec.)
0xa003ExifImageHeightint16u:ExifIFD(called PixelYDimension by the EXIF spec.)
0xa004RelatedSoundFilestringExifIFD 
0xa005InteropOffset----> EXIF Tags
0xa010SamsungRawPointersOffsetno- 
0xa011SamsungRawPointersLengthno- 
0xa101SamsungRawByteOrderno- 
0xa102SamsungRawUnknown?no- 
0xa20bFlashEnergyrational64uExifIFD 
0xa20cSpatialFrequencyResponseno- 
0xa20dNoiseno- 
0xa20eFocalPlaneXResolutionrational64uExifIFD 
0xa20fFocalPlaneYResolutionrational64uExifIFD 
0xa210FocalPlaneResolutionUnitint16uExifIFD(values 1, 4 and 5 are not standard EXIF) +
1 = None +
2 = inches +
3 = cm +
4 = mm +
5 = um
0xa211ImageNumberno- 
0xa212SecurityClassificationno- 
0xa213ImageHistoryno- 
0xa214SubjectLocationint16u[2]ExifIFD 
0xa215ExposureIndexrational64uExifIFD 
0xa216TIFF-EPStandardIDno- 
0xa217SensingMethodint16uExifIFD +
1 = Not defined +
2 = One-chip color area +
3 = Two-chip color area +
4 = Three-chip color area +
5 = Color sequential area +
7 = Trilinear +
8 = Color sequential linear
+
0xa300FileSourceundefExifIFD1 = Film Scanner +
2 = Reflection Print Scanner +
3 = Digital Camera +
"\x03\x00\x00\x00" = Sigma Digital Camera
0xa301SceneTypeundefExifIFD1 = Directly photographed
0xa302CFAPatternundefExifIFD 
0xa401CustomRenderedint16uExifIFD(only 0 and 1 are standard EXIF, but other values are used by Apple iOS +devices) +
0 = Normal +
1 = Custom +
2 = HDR (no original saved) +
3 = HDR (original saved) +
4 = Original (for HDR) +
6 = Panorama +
7 = Portrait HDR +
8 = Portrait
+
0xa402ExposureModeint16uExifIFD0 = Auto +
1 = Manual +
2 = Auto bracket
0xa403WhiteBalanceint16uExifIFD0 = Auto +
1 = Manual
0xa404DigitalZoomRatiorational64uExifIFD 
0xa405FocalLengthIn35mmFormatint16uExifIFD(called FocalLengthIn35mmFilm by the EXIF spec.)
0xa406SceneCaptureTypeint16uExifIFD(the value of 4 is non-standard, and used by some Samsung models) +
0 = Standard +
1 = Landscape +
2 = Portrait +
3 = Night +
4 = Other
0xa407GainControlint16uExifIFD0 = None +
1 = Low gain up +
2 = High gain up +
3 = Low gain down +
4 = High gain down
0xa408Contrastint16uExifIFD0 = Normal +
1 = Low +
2 = High
0xa409Saturationint16uExifIFD0 = Normal +
1 = Low +
2 = High
0xa40aSharpnessint16uExifIFD0 = Normal +
1 = Soft +
2 = Hard
0xa40bDeviceSettingDescriptionno- 
0xa40cSubjectDistanceRangeint16uExifIFD0 = Unknown +
1 = Macro +
2 = Close +
3 = Distant
0xa420ImageUniqueIDstringExifIFD 
0xa430OwnerNamestringExifIFD(called CameraOwnerName by the EXIF spec.)
0xa431SerialNumberstringExifIFD(called BodySerialNumber by the EXIF spec.)
0xa432LensInforational64u[4]ExifIFD(4 rational values giving focal and aperture ranges, called LensSpecification +by the EXIF spec.)
0xa433LensMakestringExifIFD 
0xa434LensModelstringExifIFD 
0xa435LensSerialNumberstringExifIFD 
0xa460CompositeImageint16uExifIFD0 = Unknown +
1 = Not a Composite Image +
2 = General Composite Image +
3 = Composite Image Captured While Shooting
0xa461CompositeImageCountint16u[2]ExifIFD(2 values: 1. Number of source images, 2. Number of images used. Called +SourceImageNumberOfCompositeImage by the EXIF spec.)
0xa462CompositeImageExposureTimesundefExifIFD(11 or more values: 1. Total exposure time period, 2. Total exposure of all +source images, 3. Total exposure of all used images, 4. Max exposure time of +source images, 5. Max exposure time of used images, 6. Min exposure time of +source images, 7. Min exposure of used images, 8. Number of sequences, 9. +Number of source images in sequence. 10-N. Exposure times of each source +image. Called SourceExposureTimesOfCompositeImage by the EXIF spec.)
0xa480GDALMetadatastringIFD0 
0xa481GDALNoDatastringIFD0 
0xa500Gammarational64uExifIFD 
0xafc0ExpandSoftwareno- 
0xafc1ExpandLensno- 
0xafc2ExpandFilmno- 
0xafc3ExpandFilterLensno- 
0xafc4ExpandScannerno- 
0xafc5ExpandFlashLampno- 
0xb4c3HasselbladRawImageno- 
0xbc01PixelFormatno-(tags 0xbc** are used in Windows HD Photo (HDP and WDP) images. The actual +PixelFormat values are 16-byte GUID's but the leading 15 bytes, +'6fddc324-4e03-4bfe-b1853-d77768dc9', have been removed below to avoid +unnecessary clutter) +
0x5 = Black & White +
0x8 = 8-bit Gray +
0x9 = 16-bit BGR555 +
0xa = 16-bit BGR565 +
0xb = 16-bit Gray +
0xc = 24-bit BGR +
0xd = 24-bit RGB +
0xe = 32-bit BGR +
0xf = 32-bit BGRA +
0x10 = 32-bit PBGRA +
0x11 = 32-bit Gray Float +
0x12 = 48-bit RGB Fixed Point +
0x13 = 32-bit BGR101010 +
0x15 = 48-bit RGB +
0x16 = 64-bit RGBA +
0x17 = 64-bit PRGBA +
0x18 = 96-bit RGB Fixed Point +
0x19 = 128-bit RGBA Float +
0x1a = 128-bit PRGBA Float +
0x1b = 128-bit RGB Float +
0x1c = 32-bit CMYK +
0x1d = 64-bit RGBA Fixed Point +
0x1e = 128-bit RGBA Fixed Point +
0x1f = 64-bit CMYK +
0x20 = 24-bit 3 Channels +
0x21 = 32-bit 4 Channels +
0x22 = 40-bit 5 Channels +
0x23 = 48-bit 6 Channels +
0x24 = 56-bit 7 Channels +
0x25 = 64-bit 8 Channels +
0x26 = 48-bit 3 Channels +
0x27 = 64-bit 4 Channels +
0x28 = 80-bit 5 Channels +
0x29 = 96-bit 6 Channels +
0x2a = 112-bit 7 Channels +
0x2b = 128-bit 8 Channels +
0x2c = 40-bit CMYK Alpha +
0x2d = 80-bit CMYK Alpha +
0x2e = 32-bit 3 Channels Alpha +
0x2f = 40-bit 4 Channels Alpha +
0x30 = 48-bit 5 Channels Alpha +
0x31 = 56-bit 6 Channels Alpha +
0x32 = 64-bit 7 Channels Alpha +
0x33 = 72-bit 8 Channels Alpha +
0x34 = 64-bit 3 Channels Alpha +
0x35 = 80-bit 4 Channels Alpha +
0x36 = 96-bit 5 Channels Alpha +
0x37 = 112-bit 6 Channels Alpha +
0x38 = 128-bit 7 Channels Alpha +
0x39 = 144-bit 8 Channels Alpha +
0x3a = 64-bit RGBA Half +
0x3b = 48-bit RGB Half +
0x3d = 32-bit RGBE +
0x3e = 16-bit Gray Half +
0x3f = 32-bit Gray Fixed Point
+
0xbc02Transformationno- +
0 = Horizontal (normal) +
1 = Mirror vertical +
2 = Mirror horizontal +
3 = Rotate 180 +
4 = Rotate 90 CW +
5 = Mirror horizontal and rotate 90 CW +
6 = Mirror horizontal and rotate 270 CW +
7 = Rotate 270 CW
+
0xbc03Uncompressedno-0 = No +
1 = Yes
0xbc04ImageTypeno-Bit 0 = Preview +
Bit 1 = Page
0xbc80ImageWidthno- 
0xbc81ImageHeightno- 
0xbc82WidthResolutionno- 
0xbc83HeightResolutionno- 
0xbcc0ImageOffsetno- 
0xbcc1ImageByteCountno- 
0xbcc2AlphaOffsetno- 
0xbcc3AlphaByteCountno- 
0xbcc4ImageDataDiscardno-0 = Full Resolution +
1 = Flexbits Discarded +
2 = HighPass Frequency Data Discarded +
3 = Highpass and LowPass Frequency Data Discarded
0xbcc5AlphaDataDiscardno-0 = Full Resolution +
1 = Flexbits Discarded +
2 = HighPass Frequency Data Discarded +
3 = Highpass and LowPass Frequency Data Discarded
0xc427OceScanjobDescno- 
0xc428OceApplicationSelectorno- 
0xc429OceIDNumberno- 
0xc42aOceImageLogicno- 
0xc44fAnnotationsno- 
0xc4a5PrintIMundefIFD0--> PrintIM Tags
0xc51bHasselbladExifno- 
0xc573OriginalFileNameno-(used by some obscure software)
0xc580USPTOOriginalContentTypeno-0 = Text or Drawing +
1 = Grayscale +
2 = Color
0xc5e0CR2CFAPatternno-1 => '0 1 1 2' = [Red,Green][Green,Blue] +
4 => '1 0 2 1' = [Green,Red][Blue,Green] +
3 => '1 2 0 1' = [Green,Blue][Red,Green] +
2 => '2 1 1 0' = [Blue,Green][Green,Red]
0xc612DNGVersionint8u[4]!IFD0(tags 0xc612-0xcd3b are defined by the DNG specification unless otherwise +noted. See https://helpx.adobe.com/photoshop/digital-negative.html for +the specification)
0xc613DNGBackwardVersionint8u[4]!IFD0 
0xc614UniqueCameraModelstringIFD0 
0xc615LocalizedCameraModelstringIFD0 
0xc616CFAPlaneColornoSubIFD 
0xc617CFALayoutnoSubIFD1 = Rectangular +
2 = Even columns offset down 1/2 row +
3 = Even columns offset up 1/2 row +
4 = Even rows offset right 1/2 column +
5 = Even rows offset left 1/2 column +
6 = Even rows offset up by 1/2 row, even columns offset left by 1/2 column +
7 = Even rows offset up by 1/2 row, even columns offset right by 1/2 column +
8 = Even rows offset down by 1/2 row, even columns offset left by 1/2 column +
9 = Even rows offset down by 1/2 row, even columns offset right by 1/2 column
0xc618LinearizationTableint16u[n]!SubIFD 
0xc619BlackLevelRepeatDimint16u[2]!SubIFD 
0xc61aBlackLevelrational64u[n]!SubIFD 
0xc61bBlackLevelDeltaHrational64s[n]!SubIFD 
0xc61cBlackLevelDeltaVrational64s[n]!SubIFD 
0xc61dWhiteLevelint32u[n]!SubIFD 
0xc61eDefaultScalerational64u[2]!SubIFD 
0xc61fDefaultCropOriginint32u[2]!SubIFD 
0xc620DefaultCropSizeint32u[2]!SubIFD 
0xc621ColorMatrix1rational64s[n]!IFD0 
0xc622ColorMatrix2rational64s[n]!IFD0 
0xc623CameraCalibration1rational64s[n]!IFD0 
0xc624CameraCalibration2rational64s[n]!IFD0 
0xc625ReductionMatrix1rational64s[n]!IFD0 
0xc626ReductionMatrix2rational64s[n]!IFD0 
0xc627AnalogBalancerational64u[n]!IFD0 
0xc628AsShotNeutralrational64u[n]!IFD0 
0xc629AsShotWhiteXYrational64u[2]!IFD0 
0xc62aBaselineExposurerational64s!IFD0 
0xc62bBaselineNoiserational64u!IFD0 
0xc62cBaselineSharpnessrational64u!IFD0 
0xc62dBayerGreenSplitint32u!SubIFD 
0xc62eLinearResponseLimitrational64u!IFD0 
0xc62fCameraSerialNumberstringIFD0 
0xc630DNGLensInforational64u[4]IFD0 
0xc631ChromaBlurRadiusrational64u!SubIFD 
0xc632AntiAliasStrengthrational64u!SubIFD 
0xc633ShadowScalerational64u!IFD0 
0xc634SR2Private +
DNGAdobeData +
MakerNotePentax +
MakerNotePentax5 +
MakerNoteRicohPentax +
MakerNoteDJIInfo +
DNGPrivateData
-
undef!
-
-
-
-
int8u!
IFD0
IFD0
IFD0
IFD0
IFD0
IFD0
IFD0
--> Sony SR2Private Tags +
--> DNG AdobeData Tags +
--> Pentax Tags +
--> Pentax Tags +
--> Pentax Tags +
--> DJI Info Tags
0xc635MakerNoteSafetyint16uIFD00 = Unsafe +
1 = Safe
0xc640RawImageSegmentationno-(used in segmented Canon CR2 images. 3 numbers: 1. Number of segments minus +one; 2. Pixel width of segments except last; 3. Pixel width of last segment)
0xc65aCalibrationIlluminant1int16u!IFD0--> EXIF LightSource Values
0xc65bCalibrationIlluminant2int16u!IFD0--> EXIF LightSource Values
0xc65cBestQualityScalerational64u!SubIFD 
0xc65dRawDataUniqueIDint8u[16]!IFD0 
0xc660AliasLayerMetadatano-(used by Alias Sketchbook Pro)
0xc68bOriginalRawFileNamestring!IFD0 
0xc68cOriginalRawFileDataundef!IFD0--> DNG OriginalRaw Tags
0xc68dActiveAreaint32u[4]!SubIFD 
0xc68eMaskedAreasint32u[n]!SubIFD 
0xc68fAsShotICCProfileundef!IFD0--> ICC_Profile Tags
0xc690AsShotPreProfileMatrixrational64s[n]!IFD0 
0xc691CurrentICCProfileundef!IFD0--> ICC_Profile Tags
0xc692CurrentPreProfileMatrixrational64s[n]!IFD0 
0xc6bfColorimetricReferenceint16u!IFD0 
0xc6c5SRawTypenoIFD0 
0xc6d2PanasonicTitleundefIFD0(proprietary Panasonic tag used for baby/pet name, etc)
0xc6d3PanasonicTitle2undefIFD0(proprietary Panasonic tag used for baby/pet name with age)
0xc6f3CameraCalibrationSigstring!IFD0 
0xc6f4ProfileCalibrationSigstring!IFD0 
0xc6f5ProfileIFD-IFD0--> EXIF Tags
0xc6f6AsShotProfileNamestring!IFD0 
0xc6f7NoiseReductionAppliedrational64u!SubIFD 
0xc6f8ProfileNamestring!IFD0 
0xc6f9ProfileHueSatMapDimsint32u[3]!IFD0 
0xc6faProfileHueSatMapData1float[n]!IFD0 
0xc6fbProfileHueSatMapData2float[n]!IFD0 
0xc6fcProfileToneCurvefloat[n]!IFD0 
0xc6fdProfileEmbedPolicyint32u!IFD00 = Allow Copying +
1 = Embed if Used +
2 = Never Embed +
3 = No Restrictions
0xc6feProfileCopyrightstring!IFD0 
0xc714ForwardMatrix1rational64s[n]!IFD0 
0xc715ForwardMatrix2rational64s[n]!IFD0 
0xc716PreviewApplicationNamestring!IFD0 
0xc717PreviewApplicationVersionstring!IFD0 
0xc718PreviewSettingsNamestring!IFD0 
0xc719PreviewSettingsDigestint8u!IFD0 
0xc71aPreviewColorSpaceint32u!IFD00 = Unknown +
1 = Gray Gamma 2.2 +
2 = sRGB +
3 = Adobe RGB +
4 = ProPhoto RGB
0xc71bPreviewDateTimestring!IFD0 
0xc71cRawImageDigestint8u[16]!IFD0 
0xc71dOriginalRawFileDigestint8u[16]!IFD0 
0xc71eSubTileBlockSizeno- 
0xc71fRowInterleaveFactorno- 
0xc725ProfileLookTableDimsint32u[3]!IFD0 
0xc726ProfileLookTableDatafloat[n]!IFD0 
0xc740OpcodeList1undef!SubIFD + +
1 = WarpRectilinear +
2 = WarpFisheye +
3 = FixVignetteRadial +
4 = FixBadPixelsConstant +
5 = FixBadPixelsList +
6 = TrimBounds +
7 = MapTable
  8 = MapPolynomial +
9 = GainMap +
10 = DeltaPerRow +
11 = DeltaPerColumn +
12 = ScalePerRow +
13 = ScalePerColumn +
14 = WarpRectilinear2
+
0xc741OpcodeList2undef!SubIFD + +
1 = WarpRectilinear +
2 = WarpFisheye +
3 = FixVignetteRadial +
4 = FixBadPixelsConstant +
5 = FixBadPixelsList +
6 = TrimBounds +
7 = MapTable
  8 = MapPolynomial +
9 = GainMap +
10 = DeltaPerRow +
11 = DeltaPerColumn +
12 = ScalePerRow +
13 = ScalePerColumn +
14 = WarpRectilinear2
+
0xc74eOpcodeList3undef!SubIFD + +
1 = WarpRectilinear +
2 = WarpFisheye +
3 = FixVignetteRadial +
4 = FixBadPixelsConstant +
5 = FixBadPixelsList +
6 = TrimBounds +
7 = MapTable
  8 = MapPolynomial +
9 = GainMap +
10 = DeltaPerRow +
11 = DeltaPerColumn +
12 = ScalePerRow +
13 = ScalePerColumn +
14 = WarpRectilinear2
+
0xc761NoiseProfiledouble[n]!SubIFD 
0xc763TimeCodesint8u[n]IFD0 
0xc764FrameRaterational64sIFD0 
0xc772TStoprational64u[n]IFD0 
0xc789ReelNamestringIFD0 
0xc791OriginalDefaultFinalSizeint32u[2]!IFD0 
0xc792OriginalBestQualitySizeint32u[2]!IFD0(called OriginalBestQualityFinalSize by the DNG spec)
0xc793OriginalDefaultCropSizerational64u[2]!IFD0 
0xc7a1CameraLabelstringIFD0 
0xc7a3ProfileHueSatMapEncodingint32u!IFD00 = Linear +
1 = sRGB
0xc7a4ProfileLookTableEncodingint32u!IFD00 = Linear +
1 = sRGB
0xc7a5BaselineExposureOffsetrational64s!IFD0 
0xc7a6DefaultBlackRenderint32u!IFD00 = Auto +
1 = None
0xc7a7NewRawImageDigestint8u[16]!IFD0 
0xc7a8RawToPreviewGaindouble!IFD0 
0xc7aaCacheVersionint32u!SubIFD2 
0xc7b5DefaultUserCroprational64u[4]!SubIFD 
0xc7d5NikonNEFInfo----> Nikon NEFInfo Tags
0xc7e9DepthFormatint16u!IFD0(tags 0xc7e9-0xc7ee added by DNG 1.5.0.0) +
0 = Unknown +
1 = Linear +
2 = Inverse
0xc7eaDepthNearrational64u!IFD0 
0xc7ebDepthFarrational64u!IFD0 
0xc7ecDepthUnitsint16u!IFD00 = Unknown +
1 = Meters
0xc7edDepthMeasureTypeint16u!IFD00 = Unknown +
1 = Optical Axis +
2 = Optical Ray
0xc7eeEnhanceParamsstring!IFD0 
0xcd2dProfileGainTableMapundef!SubIFD 
0xcd2eSemanticNamenoSubIFD 
0xcd30SemanticInstanceIFDnoSubIFD 
0xcd31CalibrationIlluminant3int16u!IFD0--> EXIF LightSource Values
0xcd32CameraCalibration3rational64s[n]!IFD0 
0xcd33ColorMatrix3rational64s[n]!IFD0 
0xcd34ForwardMatrix3rational64s[n]!IFD0 
0xcd35IlluminantData1undef!IFD0 
0xcd36IlluminantData2undef!IFD0 
0xcd37IlluminantData3undef!IFD0 
0xcd38MaskSubAreanoSubIFD 
0xcd39ProfileHueSatMapData3float[n]!IFD0 
0xcd3aReductionMatrix3rational64s[n]!IFD0 
0xcd3bRGBTablesundef!IFD0 
0xea1cPaddingundef!ExifIFD 
0xea1dOffsetSchemaint32s!ExifIFD(Microsoft's ill-conceived maker note offset difference)
0xfde8OwnerNamestring/ExifIFD(tags 0xfde8-0xfdea and 0xfe4c-0xfe58 are generated by Photoshop Camera RAW. +Some names are the same as other EXIF tags, but ExifTool will avoid writing +these unless they already exist in the file)
0xfde9SerialNumberstring/ExifIFD 
0xfdeaLensstring/ExifIFD 
0xfe00KDC_IFD----> Kodak KDC_IFD Tags +
(used in some Kodak KDC images)
0xfe4cRawFilestring/ExifIFD 
0xfe4dConverterstring/ExifIFD 
0xfe4eWhiteBalancestring/ExifIFD 
0xfe51Exposurestring/ExifIFD 
0xfe52Shadowsstring/ExifIFD 
0xfe53Brightnessstring/ExifIFD 
0xfe54Contraststring/ExifIFD 
0xfe55Saturationstring/ExifIFD 
0xfe56Sharpnessstring/ExifIFD 
0xfe57Smoothnessstring/ExifIFD 
0xfe58MoireFilterstring/ExifIFD 
+ +

EXIF Compression Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueCompression
1= Uncompressed
2= CCITT 1D
3= T4/Group 3 Fax
4= T6/Group 4 Fax
5= LZW
6= JPEG (old-style)
7= JPEG
8= Adobe Deflate
9= JBIG B&W
10= JBIG Color
99= JPEG
262= Kodak 262
32766= Next
32767= Sony ARW Compressed
32769= Packed RAW
32770= Samsung SRW Compressed
32771= CCIRLEW
32772= Samsung SRW Compressed 2
32773= PackBits
32809= Thunderscan
32867= Kodak KDC Compressed
32895= IT8CTPAD
32896= IT8LW
32897= IT8MP
32898= IT8BL
32908= PixarFilm
32909= PixarLog
32946= Deflate
32947= DCS
33003= Aperio JPEG 2000 YCbCr
33005= Aperio JPEG 2000 RGB
34661= JBIG
34676= SGILog
34677= SGILog24
34712= JPEG 2000
34713= Nikon NEF Compressed
34715= JBIG2 TIFF FX
34718= Microsoft Document Imaging (MDI) Binary Level Codec
34719= Microsoft Document Imaging (MDI) Progressive Transform Codec
34720= Microsoft Document Imaging (MDI) Vector
34887= ESRI Lerc
34892= Lossy JPEG
34925= LZMA2
34926= Zstd
34927= WebP
34933= PNG
34934= JPEG XR
65000= Kodak DCR Compressed
65535= Pentax PEF Compressed
+ +

EXIF LightSource Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueLightSourceValueLightSourceValueLightSource
0= Unknown12= Daylight Fluorescent20= D55
1= Daylight13= Day White Fluorescent21= D65
2= Fluorescent14= Cool White Fluorescent22= D75
3= Tungsten (Incandescent)15= White Fluorescent23= D50
4= Flash16= Warm White Fluorescent24= ISO Studio Tungsten
9= Fine Weather17= Standard Light A255= Other
10= Cloudy18= Standard Light B  
11= Shade19= Standard Light C  
+ +

EXIF Flash Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueFlash
0x0= No Flash
0x1= Fired
0x5= Fired, Return not detected
0x7= Fired, Return detected
0x8= On, Did not fire
0x9= On, Fired
0xd= On, Return not detected
0xf= On, Return detected
0x10= Off, Did not fire
0x14= Off, Did not fire, Return not detected
0x18= Auto, Did not fire
0x19= Auto, Fired
0x1d= Auto, Fired, Return not detected
0x1f= Auto, Fired, Return detected
0x20= No flash function
0x30= Off, No flash function
0x41= Fired, Red-eye reduction
0x45= Fired, Red-eye reduction, Return not detected
0x47= Fired, Red-eye reduction, Return detected
0x49= On, Red-eye reduction
0x4d= On, Red-eye reduction, Return not detected
0x4f= On, Red-eye reduction, Return detected
0x50= Off, Red-eye reduction
0x58= Auto, Did not fire, Red-eye reduction
0x59= Auto, Fired, Red-eye reduction
0x5d= Auto, Fired, Red-eye reduction, Return not detected
0x5f= Auto, Fired, Red-eye reduction, Return detected
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 1, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Extra.html b/html/TagNames/Extra.html new file mode 100644 index 0000000..8475aa0 --- /dev/null +++ b/html/TagNames/Extra.html @@ -0,0 +1,561 @@ + + + + +Extra Tags + + + +

Extra Tags

+

+The extra tags provide extra features or extra information extracted or +generated by ExifTool that is not directly associated with another tag +group. The Group column lists the family 1 group name when reading. +Tags with a "-" in this column are write-only.

+ +

Tags in the family 1 "System" group are referred to as "pseudo" tags because +they don't represent real metadata in the file. Instead, this information +is stored in the directory structure of the filesystem. The Writable +System "pseudo" tags in this table may be written without modifying the file +itself. The TestName tag is used for dry-run testing before writing +FileName. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableGroupValues / Notes
Adobeyes!Adobe(the JPEG APP14 Adobe segment. Extracted only if specified. See the +JPEG Adobe Tags for more information)
BaseNamenoSystem(file name without extension. Not generated unless specifically requested or +the API RequestAll option is set)
CanonDR4yes!^CanonVRD(the full Canon DPP version 4 DR4 block. This tag is generated only if +specifically requested)
CanonVRDyes!^CanonVRD(the full Canon DPP VRD trailer block. This tag is generated only if +specifically requested)
CommentyesFile(comment embedded in JPEG, GIF89a or PPM/PGM/PBM image)
CurrentIPTCDigestnoFile(MD5 digest of existing IPTC data. All zeros if IPTC exists but Digest::MD5 +is not installed. Only calculated for IPTC in the standard location as +specified by the MWG. ExifTool +automates the handling of this tag in the MWG module -- see the +MWG Composite Tags for details)
Directoryyes!System(the directory of the file as specified in the call to ExifTool, or "." if no +directory was specified. May be written to move the file to another +directory that will be created if doesn't already exist)
EXIFyes!EXIF(the full EXIF data block from JPEG, PNG, JP2, MIE and MIFF images. This tag +is generated only if specifically requested)
EmbeddedVideonoFile 
ErrornoExifTool(returns errors that may have occurred while reading or writing a file. Any +Error will prevent the file from being processed. Minor errors may be +downgraded to warnings with the -m or IgnoreMinorErrors option)
ExifByteOrderyesFile(represents the byte order of EXIF information. May be written to set the +byte order only for newly created EXIF segments) +
'II' = Little-endian (Intel, II) +
'MM' = Big-endian (Motorola, MM)
ExifToolVersionnoExifTool(the version of ExifTool currently running)
ExifUnicodeByteOrderyes-(specifies the byte order to use when writing EXIF Unicode text. The EXIF +specification is particularly vague about this byte ordering, and different +applications use different conventions. By default ExifTool writes Unicode +text in EXIF byte order, but this write-only tag may be used to force a +specific order. Applies to the EXIF UserComment tag when writing special +characters) +
'II' = Little-endian (Intel, II) +
'MM' = Big-endian (Motorola, MM)
FileAccessDatenoSystem(the date/time of last access of the file. Note that this access time is +updated whenever any software, including ExifTool, reads the file)
FileAttributesnoSystem(extracted only if specifically requested or the SystemTags or RequestAll API +option is set. 2 or 3 values: 0. File type, 1. Attribute bits, 2. Windows +attribute bits if Win32API::File is available) +
[Value 0]
+ +
0x0 = Unknown +
0x1000 = FIFO +
0x2000 = Character +
0x3000 = Mux Character +
0x4000 = Directory +
0x5000 = XENIX Named +
0x6000 = Block +
0x7000 = Mux Block
  0x8000 = Regular +
0x9000 = VxFS Compressed +
0xa000 = Symbolic Link +
0xb000 = Solaris Shadow Inode +
0xc000 = Socket +
0xd000 = Solaris Door +
0xe000 = BSD Whiteout
+[Value 1] + +
Bit 9 = Sticky +
Bit 10 = Set Group ID
  Bit 11 = Set User ID
+[Value 2] + +
Bit 0 = Read Only +
Bit 1 = Hidden +
Bit 2 = System +
Bit 3 = Volume Label +
Bit 4 = Directory +
Bit 5 = Archive +
Bit 6 = Device +
Bit 7 = Normal
  Bit 8 = Temporary +
Bit 9 = Sparse File +
Bit 10 = Reparse Point +
Bit 11 = Compressed +
Bit 12 = Offline +
Bit 13 = Not Content Indexed +
Bit 14 = Encrypted
+
FileBlockCountnoSystem(extracted only if specifically requested or the SystemTags or RequestAll API +option is set)
FileBlockSizenoSystem(extracted only if specifically requested or the SystemTags or RequestAll API +option is set)
FileCreateDateyes!System(the filesystem creation date/time. Windows/Mac only. In Windows, the file +creation date/time is preserved by default when writing if Win32API::File +and Win32::API are available. On Mac, this tag is extracted only if it or +the MacOS group is specifically requested or the API RequestAll option is +set to 2 or higher. Requires "setfile" for writing on Mac, which may be +installed by typing xcode-select --install in the Terminal)
FileDeviceIDnoSystem(extracted only if specifically requested or the SystemTags or RequestAll API +option is set)
FileDeviceNumbernoSystem(extracted only if specifically requested or the SystemTags or RequestAll API +option is set)
FileGroupIDyes!System(extracted only if specifically requested or the SystemTags or RequestAll API +option is set. Returns group ID number with the -n option, or name +otherwise. May be written with either group name or number)
FileHardLinksnoSystem(extracted only if specifically requested or the SystemTags or RequestAll API +option is set)
FileInodeChangeDatenoSystem(the date/time when the file's directory information was last changed. +Non-Windows systems only)
FileInodeNumbernoSystem(extracted only if specifically requested or the SystemTags or RequestAll API +option is set)
FileModifyDateyes!System(the filesystem modification date/time. Note that ExifTool may not be able +to handle filesystem dates before 1970 depending on the limitations of the +system's standard libraries)
FileNameyes!System(may be written with a full path name to set FileName and Directory in one +operation. This is such a powerful feature that a TestName tag is provided +to allow dry-run tests before actually writing the file name. See +filename.html for more information on writing the +FileName, Directory and TestName tags)
FilePathnoSystem(absolute path of source file. Not generated unless specifically requested or +the API RequestAll option is set. Does not support Windows Unicode file +names)
FilePermissionsyes!System(r=read, w=write and x=execute permissions for the file owner, group and +others. The ValueConv value is an octal number so bit test operations on +this value should be done in octal, eg. 'oct($filePermissions#) & 0200')
FileSequencenoExifTool(sequence number for each source file when extracting or copying information, +including files that fail the -if condition of the command-line application, +beginning at 0 for the first file. Not generated unless specifically +requested or the API RequestAll option is set)
FileSizenoSystem(note that the print conversion for this tag uses historic prefixes: 1 kB = +1024 bytes, etc.)
FileTypenoFile(a short description of the file type. For many file types this is the just +the uppercase file extension)
FileTypeExtensionnoFile(a common lowercase extension for this file type, or uppercase with the -n +option)
FileUserIDyes!System(extracted only if specifically requested or the SystemTags or RequestAll API +option is set. Returns user ID number with the -n option, or name +otherwise. May be written with either user name or number)
ForceWriteyes-(write-only tag used to force metadata in a file to be rewritten even if no +tag values are changed. May be set to "EXIF", "IPTC", "XMP" or "PNG" to +force the corresponding metadata type to be rewritten, "FixBase" to cause +EXIF to be rewritten only if the MakerNotes offset base was fixed, or "All" +to rewrite all of these metadata types. Values are case insensitive, and +multiple values may be separated with commas, eg. -ForceWrite=exif,xmp)
Geosyncyes-(this write-only tag specifies a time difference to add to Geotime for +synchronization with the GPS clock. For example, set this to "-12" if the +camera clock is 12 seconds faster than GPS time. Input format is +"[+-][[[DD ]HH:]MM:]SS[.ss]". Additional features allow calculation of time +differences and time drifts, and extraction of synchronization times from +image files. See the geotagging documentation for details)
Geotagyes-(this write-only tag is used to define the GPS track log data or track log +file name. Currently supported track log formats are GPX, NMEA RMC/GGA/GLL, +KML, IGC, Garmin XML and TCX, Magellan PMGNTRK, Honeywell PTNTHPR, Winplus +Beacon text, and Bramor gEO log files. May be set to the special value of +"DATETIMEONLY" (all caps) to set GPS date/time tags if no input track points +are available. See geotag.html for details)
Geotimeyes-(this write-only tag is used to define a date/time for interpolating a +position in the GPS track specified by the Geotag tag. Writing this tag +causes GPS information to be written into the EXIF or XMP of the target +files. The local system timezone is assumed if the date/time value does not +contain a timezone. May be deleted to delete associated GPS tags. A group +name of "EXIF" or "XMP" may be specified to write or delete only EXIF or XMP +GPS tags)
HardLinkyes!-(this write-only tag is used to create a hard link with the specified name to +the source file. If the source file is edited, copied, renamed or moved in +the same operation as writing HardLink, then the link is made to the updated +file. Note that subsequent editing of either hard-linked file by exiftool +will break the link unless the -overwrite_original_in_place option is used)
ICC_Profileyes!ICC_Profile(the full ICC_Profile data block. This tag is generated only if specifically +requested)
ID3SizenoFile(size of the ID3 data block)
IPTCyes!IPTC(the full IPTC data block. This tag is generated only if specifically +requested)
ImageHeightnoFile(the height of the image in number of pixels)
ImageWidthnoFile(the width of the image in number of pixels)
JPEGDigestnoFile(an MD5 digest of the JPEG quantization tables is combined with the component +sub-sampling values to generate the value of this tag. The result is +compared to known values in an attempt to deduce the originating software +based only on the JPEG image data. For performance reasons, this tag is +generated only if specifically requested or the API RequestAll option is set +to 3 or higher)
JPEGImageLengthnoFile(byte length of JPEG image without metadata. For performance reasons, this +tag is generated only if specifically requested or the API RequestAll option +is set to 3 or higher)
JPEGQualityEstimatenoFile(an estimate of the IJG JPEG quality setting for the image, calculated from +the quantization tables. For performance reasons, this tag is generated +only if specifically requested or the API RequestAll option is set to 3 or +higher)
MIMETypenoFile(the MIME type of the source file)
MaxValnoFile(maximum pixel value in PPM or PGM image)
NewGUIDnoExifTool(generates a new, random GUID with format +YYYYmmdd-HHMM-SSNN-PPPP-RRRRRRRRRRRR, where Y=year, m=month, d=day, H=hour, +M=minute, S=second, N=file sequence number in hex, P=process ID in hex, and +R=random hex number; without dashes with the -n option. Not generated +unless specifically requested or the API RequestAll option is set)
NownoExifTool(the current date/time. Useful when setting the tag values, eg. +"-modifydate<now". Not generated unless specifically requested or the +API RequestAll option is set)
OtherImagenoFile(other JPEG-format embedded image)
PageCountnoFile(the number of pages in a multi-page TIFF document)
PreviewImageyesFile(JPEG-format embedded preview image)
PreviewPDFnoFile(PDF-format embedded preview image)
PreviewPNGnoFile(PNG-format embedded preview image)
PreviewTIFFnoFile(TIFF-format embedded preview image)
PreviewWMFnoFile(WMF-format embedded preview image)
ProcessingTimenoExifTool(the clock time in seconds taken by ExifTool to extract information from this +file. Not generated unless specifically requested or the RequestAll API +option is set. Requires Time::HiRes)
RAFVersionnoFile(RAF file version number)
ResourceForkSizenoSystem(size of the file's resource fork if it contains data. Mac OS only. If this +tag is generated the ExtractEmbedded option may be used to extract +resource-fork information as a sub-document. When writing, the resource +fork is preserved by default, but it may be deleted with -rsrc:all= on +the command line)
SymLinkyes!-(this write-only tag is used to create a symbolic link with the specified +name to the source file. If the source file is edited, copied, renamed or +moved in the same operation as writing SymLink, then the link is made to the +updated file. The link uses an absolute path unless it is created in the +current working directory. Valid only for file systems that support +symbolic links. Note that subsequent editing of the file via the symbolic +link by exiftool will cause the link to be replaced by the edited file +without changing the original unless the -overwrite_original_in_place option +is used)
TestNameyes!-(this write-only tag may be used instead of FileName for dry-run tests of the +file renaming feature. Writing this tag prints the old and new file names +to the console, but does not affect the file itself)
ThumbnailImagenoFile(JPEG-format embedded thumbnail image)
Traileryes!File(the full JPEG trailer data block. Extracted only if specifically requested +or the API RequestAll option is set to 3 or higher)
ValidatenoExifTool(generated only if specifically requested. Requesting this tag automatically +enables the API Validate option, imposing +additional validation checks when extracting metadata. Returns the number +of errors, warnings and minor warnings encountered. Note that the Validate +feature focuses mainly on validation of EXIF/TIFF metadata) +
'0 0 0' = OK
WarningnoExifTool(returns warnings that may have occurred while reading or writing a file. +Use the -a or Duplicates option to see all warnings if more than one +occurred. Minor warnings may be ignored with the -m or IgnoreMinorErrors +option. Minor warnings with a capital "M" in the "[Minor]" designation +indicate that the processing is affected by ignoring the warning)
XMLnoXML(the XML data block, extracted for some file types)
XMPyes!XMP(the XMP data block, but note that extended XMP in JPEG images may be split +into multiple blocks. This tag is generated only if specifically requested)
XResolutionnoFile(the horizontal pixel resolution)
YResolutionnoFile(the vertical pixel resolution)
ZoneIdentifieryes!System(Windows only. Existence indicates that the file has a Zone.Identifier +alternate data stream, which is used by some Windows browsers to mark +downloaded files as possibly unsafe to run. May be deleted to remove this +stream. Requires Win32API::File)
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Feb 9, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/FITS.html b/html/TagNames/FITS.html new file mode 100644 index 0000000..1bec6f9 --- /dev/null +++ b/html/TagNames/FITS.html @@ -0,0 +1,96 @@ + + + + +FITS Tags + + + +

FITS Tags

+

This table lists some standard Flexible Image Transport System (FITS) tags, +but ExifTool will extract any other tags found. See +https://fits.gsfc.nasa.gov/fits_standard.html for the specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'AUTHOR'Authorno 
'BACKGRND'Backgroundno 
'COMMENT'Commentno(leading spaces are removed if PrintConv is enabled)
'DATE'CreateDateno 
'DATE-END'ObservationDateEndno 
'DATE-OBS'ObservationDateno 
'HISTORY'Historyno(leading spaces are removed if PrintConv is enabled)
'INSTRUME'Instrumentno 
'OBJECT'Objectno 
'OBSERVER'Observerno 
'REFERENC'Referenceno 
'TELESCOP'Telescopeno 
'TIME-END'ObservationTimeEndno 
'TIME-OBS'ObservationTimeno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Feb 23, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/FLAC.html b/html/TagNames/FLAC.html new file mode 100644 index 0000000..5b3ab6a --- /dev/null +++ b/html/TagNames/FLAC.html @@ -0,0 +1,189 @@ + + + + +FLAC Tags + + + +

FLAC Tags

+

Free Lossless Audio Codec (FLAC) meta information. ExifTool also extracts +ID3 information from these files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000StreamInfo---> FLAC StreamInfo Tags
0x0001Padding?no 
0x0002Application?no 
0x0003SeekTable?no 
0x0004VorbisComment---> Vorbis Comments Tags
0x0005CueSheet?no 
0x0006Picture---> FLAC Picture Tags
+ +

FLAC StreamInfo Tags

+

FLAC is big-endian, so bit 0 is the high-order bit in this table.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Bit000-015'BlockSizeMinno 
'Bit016-031'BlockSizeMaxno 
'Bit032-055'FrameSizeMinno 
'Bit056-079'FrameSizeMaxno 
'Bit080-099'SampleRateno 
'Bit100-102'Channelsno 
'Bit103-107'BitsPerSampleno 
'Bit108-143'TotalSamplesno 
'Bit144-271'MD5Signatureno 
+ +

FLAC Picture Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0PictureTypeno +
0 = Other +
1 = 32x32 PNG Icon +
2 = Other Icon +
3 = Front Cover +
4 = Back Cover +
5 = Leaflet +
6 = Media +
7 = Lead Artist +
8 = Artist +
9 = Conductor +
10 = Band +
11 = Composer +
12 = Lyricist +
13 = Recording Studio or Location +
14 = Recording Session +
15 = Performance +
16 = Capture from Movie or Video +
17 = Bright(ly) Colored Fish +
18 = Illustration +
19 = Band Logo +
20 = Publisher Logo
+
1PictureMIMETypeno 
2PictureDescriptionno 
3PictureWidthno 
4PictureHeightno 
5PictureBitsPerPixelno 
6PictureIndexedColorsno 
7PictureLengthno 
8Pictureno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 4, 2017 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/FLIF.html b/html/TagNames/FLIF.html new file mode 100644 index 0000000..9d314d5 --- /dev/null +++ b/html/TagNames/FLIF.html @@ -0,0 +1,85 @@ + + + + +FLIF Tags + + + +

FLIF Tags

+

Information extracted from Free Lossless Image Format files. See +http://flif.info/ for more information.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0ImageTypeno +
1 = Grayscale (non-interlaced) +
3 = RGB (non-interlaced) +
4 = RGBA (non-interlaced) +
'A' = Grayscale (interlaced) +
'C' = RGB (interlaced) +
'D' = RGBA (interlaced) +
'Q' = Grayscale Animation (non-interlaced) +
'S' = RGB Animation (non-interlaced) +
'T' = RGBA Animation (non-interlaced) +
'a' = Grayscale Animation (interlaced) +
'c' = RGB Animation (interlaced) +
'd' = RGBA Animation (interlaced)
+
1BitDepthno0 = Custom +
1 = 8 +
2 = 16
2ImageWidthno 
3ImageHeightno 
4AnimationFramesno 
5Encodingno0 = FLIF16
'eXif'EXIF---> EXIF Tags
'eXmp'XMP---> XMP Tags
'iCCP'ICC_Profile---> ICC_Profile Tags
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Nov 2, 2016 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/FLIR.html b/html/TagNames/FLIR.html new file mode 100644 index 0000000..4939c51 --- /dev/null +++ b/html/TagNames/FLIR.html @@ -0,0 +1,1433 @@ + + + + +FLIR Tags + + + +

FLIR Tags

+

Information extracted from the maker notes of JPEG images from thermal +imaging cameras by FLIR Systems Inc.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001ImageTemperatureMaxrational64u(these temperatures may be in Celsius, Kelvin or Fahrenheit, but there is no +way to tell which)
0x0002ImageTemperatureMinrational64u 
0x0003Emissivityrational64u 
0x0004UnknownTemperature?rational64u 
0x0005CameraTemperatureRangeMax?rational64u 
0x0006CameraTemperatureRangeMin?rational64u 
+ +

FLIR FFF Tags

+

Information extracted from FLIR FFF images and the APP1 FLIR segment of JPEG +images. These tags may also be extracted from the first frame of an FLIR +SEQ file, or all frames if the ExtractEmbedded option is used.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'_header'FFFHeader---> FLIR Header Tags
0x0001RawData---> FLIR RawData Tags
0x0005GainDeadData---> FLIR GainDeadData Tags
0x0006CoarseData---> FLIR CoarseData Tags
0x000eEmbeddedImage---> FLIR EmbeddedImage Tags
0x0020CameraInfo---> FLIR CameraInfo Tags
0x0021MeasurementInfo---> FLIR MeasInfo Tags
0x0022PaletteInfo---> FLIR PaletteInfo Tags
0x0023TextInfo---> FLIR TextInfo Tags
0x0024EmbeddedAudioFileno 
0x0028PaintData---> FLIR PaintData Tags
0x002aPiP---> FLIR PiP Tags
0x002bGPSInfo---> FLIR GPSInfo Tags
0x002cMeterLink---> FLIR MeterLink Tags
0x002eParameterInfo---> FLIR ParamInfo Tags
+ +

FLIR Header Tags

+

Tags extracted from the FLIR FFF/AFF header.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
4CreatorSoftwareno 
+ +

FLIR RawData Tags

+

The thermal image data may be stored either as raw data, or in PNG format. +If stored as raw data, ExifTool adds a TIFF header to allow the data to be +viewed as a TIFF image. If stored in PNG format, the PNG image is extracted +as-is. Note that most FLIR cameras using the PNG format seem to write the +16-bit raw image data in the wrong byte order.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1RawThermalImageWidthno 
2RawThermalImageHeightno 
16RawThermalImageTypeno 
16.1RawThermalImageno 
+ +

FLIR GainDeadData Tags

+

Information found in FFF-format .GAN calibration image files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1GainDeadMapImageWidthno 
2GainDeadMapImageHeightno 
16GainDeadMapImageTypeno 
16.1GainDeadMapImageno 
+ +

FLIR CoarseData Tags

+

Information found in FFF-format .CRS correction image files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1CoarseMapImageWidthno 
2CoarseMapImageHeightno 
16CoarseMapImageTypeno 
16.1CoarseMapImageno 
+ +

FLIR EmbeddedImage Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1EmbeddedImageWidthno 
2EmbeddedImageHeightno 
16EmbeddedImageTypeno("PNG" for PNG image in Y Cb Cr colors, "JPG" for a JPEG image, or "DAT" for +other image data)
16.1EmbeddedImageno 
+ +

FLIR CameraInfo Tags

+

FLIR camera information. The Planck tags are variables used in the +temperature calculation. See +forum/index.php?topic=4898.msg23972#msg23972 +for details.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
32Emissivityno 
36ObjectDistanceno 
40ReflectedApparentTemperatureno 
44AtmosphericTemperatureno 
48IRWindowTemperatureno 
52IRWindowTransmissionno 
60RelativeHumidityno 
88PlanckR1no 
92PlanckBno 
96PlanckFno 
112AtmosphericTransAlpha1no 
116AtmosphericTransAlpha2no 
120AtmosphericTransBeta1no 
124AtmosphericTransBeta2no 
128AtmosphericTransXno 
144CameraTemperatureRangeMaxno 
148CameraTemperatureRangeMinno 
152CameraTemperatureMaxClipno 
156CameraTemperatureMinClipno 
160CameraTemperatureMaxWarnno 
164CameraTemperatureMinWarnno 
168CameraTemperatureMaxSaturatedno 
172CameraTemperatureMinSaturatedno 
212CameraModelno 
244CameraPartNumberno 
260CameraSerialNumberno 
276CameraSoftwareno 
368LensModelno 
400LensPartNumberno 
416LensSerialNumberno 
436FieldOfViewno 
492FilterModelno 
508FilterPartNumberno 
540FilterSerialNumberno 
776PlanckOno 
780PlanckR2no 
784RawValueRangeMinno 
786RawValueRangeMaxno 
824RawValueMedianno 
828RawValueRangeno 
900DateTimeOriginalno 
912FocusStepCountno 
1116FocusDistanceno 
1124FrameRateno 
+ +

FLIR MeasInfo Tags

+

Tags listed below are only for the first measurement tool, however multiple +measurements may be added, and information is extracted for all of them. +Tags for subsequent measurements are generated as required with the prefixes +"Meas2", "Meas3", etc.

+
+
+ + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Meas1Labelno 
Meas1Paramsno(Spot=X,Y; Area=X1,Y1,W,H; Ellipse=XC,YC,X1,Y1,X2,Y2; Line=X1,Y1,X2,Y2)
Meas1Typeno + +
1 = Spot +
2 = Area +
3 = Ellipse +
4 = Line
  5 = Endpoint +
6 = Alarm +
7 = Unused +
8 = Difference
+
+ +

FLIR PaletteInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0PaletteColorsno 
6AboveColorno(Y Cr Cb color components)
9BelowColorno 
12OverflowColorno 
15UnderflowColorno 
18Isotherm1Colorno 
21Isotherm2Colorno 
26PaletteMethodno 
27PaletteStretchno 
48PaletteFileNameno 
80PaletteNameno 
112Paletteno(Y Cr Cb byte values for each palette color)
+ +

FLIR TextInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Label0no 
Label1no 
Label2no 
Label3no 
Value0no 
Value1no 
Value2no 
Value3no 
+ +

FLIR PaintData Tags

+

Information generated by FLIR Tools "Paint colors" tool.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
5PaintImageWidthno 
6PaintImageHeightno 
20PaintImageTypeno 
20.1PaintImageno 
+ +

FLIR PiP Tags

+

FLIR Picture in Picture tags.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0Real2IRno 
2OffsetXno(offset from of insertion point from center)
3OffsetYno 
4PiPX1no(crop size for radiometric image)
5PiPX2no 
6PiPY1no 
7PiPY2no 
+ +

FLIR GPSInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0GPSValidno0 = No +
1 = Yes
4GPSVersionIDno 
8GPSLatitudeRefno'N' = North +
'S' = South
10GPSLongitudeRefno'E' = East +
'W' = West
16GPSLatitudeno 
24GPSLongitudeno 
32GPSAltitudeno 
64GPSDOPno 
68GPSSpeedRefno'K' = km/h +
'M' = mph +
'N' = knots
70GPSTrackRefno'M' = Magnetic North +
'T' = True North
72GPSImgDirectionRefno'M' = Magnetic North +
'T' = True North
76GPSSpeedno 
80GPSTrackno 
84GPSImgDirectionno 
88GPSMapDatumno 
+ +

FLIR MeterLink Tags

+

Tags containing Meterlink humidity meter information.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
26Reading1Unitsno0xd = C +
0x1b = % +
0x1d = Relative +
0x24 = g/kg
28Reading1Descriptionno +
0 = Humidity +
3 = Moisture +
7 = Dew Point +
8 = Air Temperature +
9 = IR Temperature +
11 = Difference Temperature
+
32Reading1Deviceno 
96Reading1Valueno 
126Reading2Unitsno0xd = C +
0x1b = % +
0x1d = rel +
0x24 = g/kg
128Reading2Descriptionno +
0 = Humidity +
3 = Moisture +
7 = Dew Point +
8 = Air Temperature +
9 = IR Temperature +
11 = Difference Temperature
+
132Reading2Deviceno 
196Reading2Valueno 
226Reading3Unitsno0xd = C +
0x1b = % +
0x1d = rel +
0x24 = g/kg
228Reading3Descriptionno +
0 = Humidity +
3 = Moisture +
7 = Dew Point +
8 = Air Temperature +
9 = IR Temperature +
11 = Difference Temperature
+
232Reading3Deviceno 
296Reading3Valueno 
326Reading4Unitsno0xd = C +
0x1b = % +
0x1d = rel +
0x24 = g/kg
328Reading4Descriptionno +
0 = Humidity +
3 = Moisture +
7 = Dew Point +
8 = Air Temperature +
9 = IR Temperature +
11 = Difference Temperature
+
332Reading4Deviceno 
396Reading4Valueno 
+ +

FLIR ParamInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
DateTimeGeneratedno 
Param0no 
Param1no 
Param2no 
Param3no 
+ +

FLIR UserData Tags

+

Tags written by some FLIR cameras in a top-level (!) "udta" atom of MP4 +videos.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'uuid'FLIR_Parts +
FLIR_Serial +
FLIR_Params +
FLIR_UnknownUUID +
FLIR_GPS +
FLIR_MoreInfo +
SoftwareComponents? +
FLIR_Unknown? +
Units +
ThumbnailImage
-
-
-
-
-
-
no
no
no+
no
--> FLIR Parts Tags +
--> FLIR SerialNums Tags +
--> FLIR Params Tags +
--> FLIR UnknownUUID Tags +
--> FLIR GPS_UUID Tags +
--> FLIR MoreInfo Tags
+ +

FLIR Parts Tags

+

Tags extracted from the "uuid" box with ID 43c3993b0f94424b82056b66513f485d +in FLIR MP4 videos.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
4BAHPVer +
BALPVer +
Battery +
BAVPVer +
CamCore +
DetectorBoard +
Detector +
GIDCVer +
GIDPVer +
GIPC_CPLD +
GIPCVer +
GIXIVer +
MainBoard +
Optics +
PartNumber
no
no
no
no
no
no
no
no
no
no
no
no
no
no
no
 
+ +

FLIR SerialNums Tags

+

Tags extracted from the "uuid" box with ID 57f5b93e51e448afa0d9c3ef1b37f712 +in FLIR MP4 videos.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
12UnknownSerial1?no 
45UnknownSerial2?no 
78UnknownSerial3?no 
111UnknownSerial4?no 
123UnknownNumber?no 
126CameraSerialNumberno 
+ +

FLIR Params Tags

+

Tags extracted from the "uuid" box with ID 41e5dcf9e80a41ceadfe7f0c58082c19 +in FLIR MP4 videos.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1ReflectedApparentTemperatureno 
2AtmosphericTemperatureno 
3Emissivityno 
4ObjectDistanceno 
5RelativeHumidityno 
6EstimatedAtmosphericTransno 
7IRWindowTemperatureno 
8IRWindowTransmissionno 
+ +

FLIR UnknownUUID Tags

+

Tags extracted from the "uuid" box with ID 574520502cbb44adae5415e9b839d903 +in FLIR MP4 videos.

+
+
+ + + + +
Index4Tag NameWritableValues / Notes
[no tags known]
+ +

FLIR GPS_UUID Tags

+

Tags extracted from the "uuid" box with ID 7f2e21008b464918afb1de709a74f6f5 +in FLIR MP4 videos.

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1GPSLatitudeno 
2GPSLongitudeno 
3GPSAltitudeno 
+ +

FLIR MoreInfo Tags

+

Tags extracted from the "uuid" box with ID 2b452fdc74354094baee22a6b23a7cf8 +in FLIR MP4 videos.

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
5LensModelno 
11UnknownTemperature1?no 
15UnknownTemperature2?no 
+ +

FLIR AFF Tags

+

Tags extracted from FLIR "AFF" SEQ images.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'_header'AFFHeader---> FLIR Header Tags
0x0001AFF1---> FLIR AFF1 Tags
0x0005AFF5---> FLIR AFF5 Tags
+ +

FLIR AFF1 Tags

+
+
+ + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1SensorWidthno 
2SensorHeightno 
+ +

FLIR AFF5 Tags

+
+
+ + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
19SensorWidthno 
20SensorHeightno 
+ +

FLIR FPF Tags

+

Tags extracted from FLIR Public image Format (FPF) files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
32FPFVersionno 
36ImageDataOffsetno 
40ImageTypeno0 = Temperature +
1 = Temperature Difference +
2 = Object Signal +
3 = Object Signal Difference
42ImagePixelFormatno0 = 2-byte short integer +
1 = 4-byte long integer +
2 = 4-byte float +
3 = 8-byte double
44ImageWidthno 
46ImageHeightno 
48ExternalTriggerCountno 
52SequenceFrameNumberno 
120CameraModelno 
152CameraPartNumberno 
184CameraSerialNumberno 
216CameraTemperatureRangeMinno 
220CameraTemperatureRangeMaxno 
224LensModelno 
256LensPartNumberno 
288LensSerialNumberno 
320FilterModelno 
336FilterPartNumberno 
384FilterSerialNumberno 
480Emissivityno 
484ObjectDistanceno 
488ReflectedApparentTemperatureno 
492AtmosphericTemperatureno 
496RelativeHumidityno 
500ComputedAtmosphericTransno 
504EstimatedAtmosphericTransno 
508ReferenceTemperatureno 
512IRWindowTemperatureno 
516IRWindowTransmissionno 
584DateTimeOriginalno 
676CameraScaleMinno 
680CameraScaleMaxno 
684CalculatedScaleMinno 
688CalculatedScaleMaxno 
692ActualScaleMinno 
696ActualScaleMaxno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 12, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Flash.html b/html/TagNames/Flash.html new file mode 100644 index 0000000..9b18411 --- /dev/null +++ b/html/TagNames/Flash.html @@ -0,0 +1,420 @@ + + + + +Flash Tags + + + +

Flash Tags

+

The information below is extracted from SWF (Shockwave Flash) files. Tags +with string ID's represent information extracted from the file header.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Compressed'Compressedno0 = False +
1 = True
'Duration'Durationno(calculated from FrameRate and FrameCount)
'FlashVersion'FlashVersionno 
'FrameCount'FrameCountno 
'FrameRate'FrameRateno 
'ImageHeight'ImageHeightno 
'ImageWidth'ImageWidthno 
0x0045FlashAttributesnoBit 0 = UseNetwork +
Bit 3 = ActionScript3 +
Bit 4 = HasMetadata
0x004dXMP---> XMP Tags
+ +

Flash FLV Tags

+

Information is extracted from the following packets in FLV (Flash Video) +files.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0008Audio---> Flash Audio Tags
0x0009Video---> Flash Video Tags
0x0012Meta---> Flash Meta Tags
+ +

Flash Audio Tags

+

Information extracted from the Flash Audio header.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Bit0-3'AudioEncodingno +
0 = PCM-BE (uncompressed) +
1 = ADPCM +
2 = MP3 +
3 = PCM-LE (uncompressed) +
4 = Nellymoser 16kHz Mono +
5 = Nellymoser 8kHz Mono +
6 = Nellymoser +
7 = G.711 A-law logarithmic PCM +
8 = G.711 mu-law logarithmic PCM +
10 = AAC +
11 = Speex +
13 = MP3 8-Khz +
15 = Device-specific sound
+
'Bit4-5'AudioSampleRateno 
'Bit6'AudioBitsPerSampleno 
'Bit7'AudioChannelsno1 = 1 (mono) +
2 = 2 (stereo)
+ +

Flash Video Tags

+

Information extracted from the Flash Video header.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Bit4-7'VideoEncodingno + +
1 = JPEG +
2 = Sorensen H.263 +
3 = Screen Video +
4 = On2 VP6
  5 = On2 VP6 Alpha +
6 = Screen Video 2 +
7 = H.264
+
+ +

Flash Meta Tags

+

Below are a few observed FLV Meta tags, but ExifTool will attempt to extract +information from any tag found.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'audiocodecid'AudioCodecIDno 
'audiodatarate'AudioBitrateno 
'audiodelay'AudioDelayno 
'audiosamplerate'AudioSampleRateno 
'audiosamplesize'AudioSampleSizeno 
'audiosize'AudioSizeno 
'bytelength'ByteLengthno 
'canSeekToEnd'CanSeekToEndno 
'canseekontime'CanSeekOnTimeno 
'createdby'CreatedByno 
'creationdate'CreateDateno 
'cuePoints'CuePoint---> Flash CuePoint Tags
'datasize'DataSizeno 
'duration'Durationno 
'filesize'FileSizeBytesno 
'framerate'FrameRateno 
'hasAudio'HasAudiono 
'hasCuePoints'HasCuePointsno 
'hasKeyframes'HasKeyFramesno 
'hasMetadata'HasMetadatano 
'hasVideo'HasVideono 
'height'ImageHeightno 
'httphostheader'HTTPHostHeaderno 
'keyframesFilepositions'KeyFramePositionsno 
'keyframesTimes'KeyFramesTimesno 
'lastkeyframetimestamp'LastKeyFrameTimeno 
'lasttimestamp'LastTimeStampno 
'liveXML'XMP---> XMP Tags
'metadatacreator'MetadataCreatorno 
'metadatadate'MetadataDateno 
'pmsg'Messageno 
'purl'URLno 
'sourcedata'SourceDatano 
'starttime'StartTimeno 
'stereo'Stereono 
'totaldatarate'TotalDataRateno 
'totalduration'TotalDurationno 
'videocodecid'VideoCodecIDno 
'videodatarate'VideoBitrateno 
'videosize'VideoSizeno 
'width'ImageWidthno 
+ +

Flash CuePoint Tags

+

These tag names are added to the CuePoint name to generate complete tag +names like "CuePoint0Name".

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'name'Nameno 
'parameters'Parameter---> Flash Parameter Tags
'time'Timeno 
'type'Typeno 
+ +

Flash Parameter Tags

+

There are no pre-defined parameter tags, but ExifTool will extract any +existing parameters, with tag names like "CuePoint0ParameterXxx".

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 9, 2015 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/FlashPix.html b/html/TagNames/FlashPix.html new file mode 100644 index 0000000..761b39a --- /dev/null +++ b/html/TagNames/FlashPix.html @@ -0,0 +1,1689 @@ + + + + +FlashPix Tags + + + +

FlashPix Tags

+

The FlashPix file format, introduced in 1996, was developed by Kodak, +Hewlett-Packard and Microsoft. Internally the FPX file structure mimics +that of an old DOS disk with fixed-sized "sectors" (usually 512 bytes) and a +"file allocation table" (FAT). No wonder this image format never became +popular. However, some of the structures used in FlashPix streams are part +of the EXIF specification, and are still being used in the APP2 FPXR segment +of JPEG images by some digital cameras from manufacturers such as FujiFilm, +Hewlett-Packard, Kodak and Sanyo.

+ +

ExifTool extracts FlashPix information from both FPX images and the APP2 +FPXR segment of JPEG images. As well, FlashPix information is extracted +from DOC, PPT, XLS (Microsoft Word, PowerPoint and Excel) documents, VSD +(Microsoft Visio) drawings, and FLA (Macromedia/Adobe Flash project) files +since these are based on the same file format as FlashPix (the Windows +Compound Binary File format). Note that ExifTool identifies any +unrecognized Windows Compound Binary file as a FlashPix (FPX) file. See +http://graphcomp.com/info/specs/livepicture/fpx.pdf for the FlashPix +specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
"\x01CompObj"CompObj---> FlashPix CompObj Tags
"\x05Audio Info"AudioInfo---> FlashPix AudioInfo Tags
"\x05Data Object"DataObject---> FlashPix DataObject Tags
"\x05DocumentSummaryInformation"DocumentInfo---> FlashPix DocumentInfo Tags
"\x05Extension List"Extensions---> FlashPix Extensions Tags
"\x05Global Info"GlobalInfo---> FlashPix GlobalInfo Tags
"\x05Image Contents"Image---> FlashPix Image Tags
"\x05Image Info"ImageInfo---> FlashPix ImageInfo Tags
"\x05Operation"Operation---> FlashPix Operation Tags
"\x05Screen Nail"ScreenNailno 
"\x05SummaryInformation"SummaryInfo---> FlashPix SummaryInfo Tags
"\x05Transform"Transform---> FlashPix Transform Tags
'Audio Stream'AudioStreamno 
'BasicFileInfo'BasicFileInfono 
'Contents'Contents---> XMP Tags +
(found in FLA files; may contain XMP)
'Current User'CurrentUserno 
'ICC Profile 0001'ICC_Profile---> ICC_Profile Tags
'IeImg'EmbeddedImageno(embedded images in Scene7 vignette VNT files)
'Preview'PreviewImageno(written by some FujiFilm models)
'Property'PreviewInfo---> FlashPix PreviewInfo Tags
'Subimage 0000 Header'SubimageHdr---> FlashPix SubimageHdr Tags
'WordDocument'WordDocument---> FlashPix WordDocument Tags
+ +

FlashPix CompObj Tags

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0CompObjUserTypeLenno 
1CompObjUserTypeno 
+ +

FlashPix AudioInfo Tags

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

FlashPix DataObject Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x10000DataObjectIDno 
0x10002LockedPropertyListno 
0x10003DataObjectTitleno 
0x10004LastModifierno 
0x10005RevisionNumberno 
0x10006DataCreateDateno 
0x10007DataModifyDateno 
0x10008CreatingApplicationno 
0x10100DataObjectStatusno 
0x10101CreatingTransformno 
0x10102UsingTransformsno 
0x10000000CachedImageHeightno 
0x10000001CachedImageWidthno 
+ +

FlashPix DocumentInfo Tags

+

The DocumentSummaryInformation property set includes a UserDefined property +set for which only the Hyperlinks and HyperlinkBase tags are pre-defined. +However, ExifTool will also extract any other information found in the +UserDefined properties.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0002Categoryno 
0x0003PresentationTargetno 
0x0004Bytesno 
0x0005Linesno 
0x0006Paragraphsno 
0x0007Slidesno 
0x0008Notesno 
0x0009HiddenSlidesno 
0x000aMMClipsno 
0x000bScaleCropno0 = No +
1 = Yes
0x000cHeadingPairsno 
0x000dTitleOfPartsno 
0x000eManagerno 
0x000fCompanyno 
0x0010LinksUpToDateno0 = No +
1 = Yes
0x0011CharCountWithSpacesno 
0x0013SharedDocno0 = No +
1 = Yes
0x0016HyperlinksChangedno0 = No +
1 = Yes
0x0017AppVersionno 
'_PID_HLINKS'Hyperlinksno 
'_PID_LINKBASE'HyperlinkBaseno 
+ +

FlashPix Extensions Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001ExtensionNameno 
0x0002ExtensionClassIDno 
0x0003ExtensionPersistenceno0 = Always Valid +
1 = Invalidated By Modification +
2 = Potentially Invalidated By Modification
0x0004ExtensionCreateDateno 
0x0005ExtensionModifyDateno 
0x0006CreatingApplicationno 
0x0007ExtensionDescriptionno 
0x1000Storage-StreamPathnameno 
0x2000FlashPixStreamPathnameno 
0x2001FlashPixStreamFieldOffsetno 
0x3000PropertySetPathnameno 
0x3001PropertySetIDCodesno 
0x3002PropertyVectorElementsno 
0x4000SubimageResolutionsno 
0x10000000UsedExtensionNumbersno 
+ +

FlashPix GlobalInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x10002LockedPropertyListno 
0x10003TransformedImageTitleno 
0x10004LastModifierno 
0x10100VisibleOutputsno 
0x10101MaximumImageIndexno 
0x10102MaximumTransformIndexno 
0x10103MaximumOperationIndexno 
+ +

FlashPix Image Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x1000000NumberOfResolutionsno 
0x1000002ImageWidthno 
0x1000003ImageHeightno 
0x1000004DefaultDisplayHeightno 
0x1000005DefaultDisplayWidthno 
0x1000006DisplayUnitsno0 = inches +
1 = meters +
2 = cm +
3 = mm
0x2000000SubimageWidthno 
0x2000001SubimageHeightno 
0x2000002SubimageColorno +
'01 0000' = Opacity Only +
'01 0001' = Monochrome +
'01 8000' = Opacity Only (uncalibrated) +
'01 8001' = Monochrome (uncalibrated) +
'03 0002' = YCbCr +
'03 0003' = RGB +
'03 8002' = YCbCr (uncalibrated) +
'03 8003' = RGB (uncalibrated) +
'04 0002' = YCbCr with Opacity +
'04 0003' = RGB with Opacity +
'04 8002' = YCbCr with Opacity (uncalibrated) +
'04 8003' = RGB with Opacity (uncalibrated)
+
0x2000003SubimageNumericalFormatno17 = 8-bit, Unsigned +
18 = 16-bit, Unsigned +
19 = 32-bit, Unsigned
0x2000004DecimationMethodno0 = None (Full-sized Image) +
8 = 8-point Prefilter
0x2000005DecimationPrefilterWidthno 
0x2000007SubimageICC_Profileno 
0x3000001JPEGTablesno 
0x3000002MaxJPEGTableIndexno 
+ +

FlashPix ImageInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x21000000FileSourceno1 = Film Scanner +
2 = Reflection Print Scanner +
3 = Digital Camera +
4 = Video Capture +
5 = Computer Graphics
0x21000001SceneTypeno1 = Original Scene +
2 = Second Generation Scene +
3 = Digital Scene Generation
0x21000002CreationPathVectorno 
0x21000003SoftwareReleaseno 
0x21000004UserDefinedIDno 
0x21000005SharpnessApproximationno 
0x22000000Copyrightno 
0x22000001OriginalImageBrokerno 
0x22000002DigitalImageBrokerno 
0x22000003Authorshipno 
0x22000004IntellectualPropertyNotesno 
0x23000000TestTargetno + +
1 = Color Chart +
2 = Gray Card +
3 = Grayscale +
4 = Resolution Chart
  5 = Inch Scale +
6 = Centimeter Scale +
7 = Millimeter Scale +
8 = Micrometer Scale
+
0x23000002GroupCaptionno 
0x23000003CaptionTextno 
0x23000004Peopleno 
0x23000007Thingsno 
0x2300000aDateTimeOriginalno 
0x2300000bEventsno 
0x2300000cPlacesno 
0x2300000fContentDescriptionNotesno 
0x24000000Makeno 
0x24000001Modelno 
0x24000002SerialNumberno 
0x25000000CreateDateno 
0x25000001ExposureTimeno 
0x25000002FNumberno 
0x25000003ExposureProgramno +
0 = Not Defined +
1 = Manual +
2 = Program AE +
3 = Aperture-priority AE +
4 = Shutter speed priority AE +
5 = Creative (Slow speed) +
6 = Action (High speed) +
7 = Portrait +
8 = Landscape +
9 = Bulb
+
0x25000004BrightnessValueno 
0x25000005ExposureCompensationno 
0x25000006SubjectDistanceno 
0x25000007MeteringModeno +
0 = Unknown +
1 = Average +
2 = Center-weighted average +
3 = Spot +
4 = Multi-spot +
5 = Multi-segment +
6 = Partial +
255 = Other
+
0x25000008LightSourceno +
0 = Unknown +
1 = Daylight +
2 = Fluorescent +
3 = Tungsten (Incandescent) +
4 = Flash +
9 = Fine Weather +
10 = Cloudy +
11 = Shade +
12 = Daylight Fluorescent +
13 = Day White Fluorescent +
14 = Cool White Fluorescent +
15 = White Fluorescent +
16 = Warm White Fluorescent +
17 = Standard Light A +
18 = Standard Light B +
19 = Standard Light C +
20 = D55 +
21 = D65 +
22 = D75 +
23 = D50 +
24 = ISO Studio Tungsten +
255 = Other
+
0x25000009FocalLengthno 
0x2500000aMaxApertureValueno 
0x2500000bFlashno1 = No Flash +
2 = Flash Fired
0x2500000cFlashEnergyno 
0x2500000dFlashReturnno1 = Subject Outside Flash Range +
2 = Subject Inside Flash Range
0x2500000eBackLightno1 = Front Lit +
2 = Back Lit 1 +
3 = Back Lit 2
0x2500000fSubjectLocationno 
0x25000010ExposureIndexno 
0x25000011SpecialEffectsOpticalFilterno + +
1 = None +
2 = Colored +
3 = Diffusion +
4 = Multi-image
  5 = Polarizing +
6 = Split-field +
7 = Star
+
0x25000012PerPictureNotesno 
0x26000000SensingMethodno +
1 = Monochrome area +
2 = One-chip color area +
3 = Two-chip color area +
4 = Three-chip color area +
5 = Color sequential area +
6 = Monochrome linear +
7 = Trilinear +
8 = Color sequential linear
+
0x26000001FocalPlaneXResolutionno 
0x26000002FocalPlaneYResolutionno 
0x26000003FocalPlaneResolutionUnitno1 = None +
2 = inches +
3 = cm +
4 = mm +
5 = um
0x26000004SpatialFrequencyResponseno 
0x26000005CFAPatternno 
0x26000007ISOno 
0x26000008Opto-ElectricConvFactorno 
0x27000000FilmBrandno 
0x27000001FilmCategoryno 
0x27000002FilmSizeno 
0x27000003FilmRollNumberno 
0x27000004FilmFrameNumberno 
0x28000000ScannerMakeno 
0x28000001ScannerModelno 
0x28000002ScannerSerialNumberno 
0x28000003ScanSoftwareno 
0x28000004ScanSoftwareRevisionDateno 
0x28000005ServiceOrganizationNameno 
0x28000006ScanOperatorIDno 
0x28000008ScanDateno 
0x28000009ModifyDateno 
0x2800000aScannerPixelSizeno 
0x29000000OriginalScannedImageSizeno 
0x29000001OriginalDocumentSizeno 
0x29000002OriginalMediumno1 = Continuous Tone Image +
2 = Halftone Image +
3 = Line Art
0x29000003TypeOfOriginalno1 = B&W Print +
2 = Color Print +
3 = B&W Document +
4 = Color Document
+ +

FlashPix Operation Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x10000OperationIDno 
+ +

FlashPix SummaryInfo Tags

+

The Dictionary, CodePage and LocalIndicator tags are common to all FlashPix +property tables, even though they are only listed in the SummaryInfo table.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000Dictionaryno 
0x0001CodePageno37 = IBM EBCDIC US-Canada +
437 = DOS United States +
500 = IBM EBCDIC International +
708 = Arabic (ASMO 708) +
709 = Arabic (ASMO-449+, BCON V4) +
710 = Arabic - Transparent Arabic +
720 = DOS Arabic (Transparent ASMO) +
737 = DOS Greek (formerly 437G) +
775 = DOS Baltic +
850 = DOS Latin 1 (Western European) +
852 = DOS Latin 2 (Central European) +
855 = DOS Cyrillic (primarily Russian) +
857 = DOS Turkish +
858 = DOS Multilingual Latin 1 with Euro +
860 = DOS Portuguese +
861 = DOS Icelandic +
862 = DOS Hebrew +
863 = DOS French Canadian +
864 = DOS Arabic +
865 = DOS Nordic +
866 = DOS Russian (Cyrillic) +
869 = DOS Modern Greek +
870 = IBM EBCDIC Multilingual/ROECE (Latin 2) +
874 = Windows Thai (same as 28605, ISO 8859-15) +
875 = IBM EBCDIC Greek Modern +
932 = Windows Japanese (Shift-JIS) +
936 = Windows Simplified Chinese (PRC, Singapore) +
949 = Windows Korean (Unified Hangul Code) +
950 = Windows Traditional Chinese (Taiwan) +
1026 = IBM EBCDIC Turkish (Latin 5) +
1047 = IBM EBCDIC Latin 1/Open System +
1140 = IBM EBCDIC US-Canada with Euro +
1141 = IBM EBCDIC Germany with Euro +
1142 = IBM EBCDIC Denmark-Norway with Euro +
1143 = IBM EBCDIC Finland-Sweden with Euro +
1144 = IBM EBCDIC Italy with Euro +
1145 = IBM EBCDIC Latin America-Spain with Euro +
1146 = IBM EBCDIC United Kingdom with Euro +
1147 = IBM EBCDIC France with Euro +
1148 = IBM EBCDIC International with Euro +
1149 = IBM EBCDIC Icelandic with Euro +
1200 = Unicode UTF-16, little endian +
1201 = Unicode UTF-16, big endian +
1250 = Windows Latin 2 (Central European) +
1251 = Windows Cyrillic +
1252 = Windows Latin 1 (Western European) +
1253 = Windows Greek +
1254 = Windows Turkish +
1255 = Windows Hebrew +
1256 = Windows Arabic +
1257 = Windows Baltic +
1258 = Windows Vietnamese +
1361 = Korean (Johab) +
10000 = Mac Roman (Western European) +
10001 = Mac Japanese +
10002 = Mac Traditional Chinese +
10003 = Mac Korean +
10004 = Mac Arabic +
10005 = Mac Hebrew +
10006 = Mac Greek +
10007 = Mac Cyrillic +
10008 = Mac Simplified Chinese +
10010 = Mac Romanian +
10017 = Mac Ukrainian +
10021 = Mac Thai +
10029 = Mac Latin 2 (Central European) +
10079 = Mac Icelandic +
10081 = Mac Turkish +
10082 = Mac Croatian +
12000 = Unicode UTF-32, little endian +
12001 = Unicode UTF-32, big endian +
20000 = CNS Taiwan +
20001 = TCA Taiwan +
20002 = Eten Taiwan +
20003 = IBM5550 Taiwan +
20004 = TeleText Taiwan +
20005 = Wang Taiwan +
20105 = IA5 (IRV International Alphabet No. 5, 7-bit) +
20106 = IA5 German (7-bit) +
20107 = IA5 Swedish (7-bit) +
20108 = IA5 Norwegian (7-bit) +
20127 = US-ASCII (7-bit) +
20261 = T.61 +
20269 = ISO 6937 Non-Spacing Accent +
20273 = IBM EBCDIC Germany +
20277 = IBM EBCDIC Denmark-Norway +
20278 = IBM EBCDIC Finland-Sweden +
20280 = IBM EBCDIC Italy +
20284 = IBM EBCDIC Latin America-Spain +
20285 = IBM EBCDIC United Kingdom +
20290 = IBM EBCDIC Japanese Katakana Extended +
20297 = IBM EBCDIC France +
20420 = IBM EBCDIC Arabic +
20423 = IBM EBCDIC Greek +
20424 = IBM EBCDIC Hebrew +
20833 = IBM EBCDIC Korean Extended +
20838 = IBM EBCDIC Thai +
20866 = Russian/Cyrillic (KOI8-R) +
20871 = IBM EBCDIC Icelandic +
20880 = IBM EBCDIC Cyrillic Russian +
20905 = IBM EBCDIC Turkish +
20924 = IBM EBCDIC Latin 1/Open System with Euro +
20932 = Japanese (JIS 0208-1990 and 0121-1990) +
20936 = Simplified Chinese (GB2312) +
20949 = Korean Wansung +
21025 = IBM EBCDIC Cyrillic Serbian-Bulgarian +
21027 = Extended Alpha Lowercase (deprecated) +
21866 = Ukrainian/Cyrillic (KOI8-U) +
28591 = ISO 8859-1 Latin 1 (Western European) +
28592 = ISO 8859-2 (Central European) +
28593 = ISO 8859-3 Latin 3 +
28594 = ISO 8859-4 Baltic +
28595 = ISO 8859-5 Cyrillic +
28596 = ISO 8859-6 Arabic +
28597 = ISO 8859-7 Greek +
28598 = ISO 8859-8 Hebrew (Visual) +
28599 = ISO 8859-9 Turkish +
28603 = ISO 8859-13 Estonian +
28605 = ISO 8859-15 Latin 9 +
29001 = Europa 3 +
38598 = ISO 8859-8 Hebrew (Logical) +
50220 = ISO 2022 Japanese with no halfwidth Katakana (JIS) +
50221 = ISO 2022 Japanese with halfwidth Katakana (JIS-Allow 1 byte Kana) +
50222 = ISO 2022 Japanese JIS X 0201-1989 (JIS-Allow 1 byte Kana - SO/SI) +
50225 = ISO 2022 Korean +
50227 = ISO 2022 Simplified Chinese +
50229 = ISO 2022 Traditional Chinese +
50930 = EBCDIC Japanese (Katakana) Extended +
50931 = EBCDIC US-Canada and Japanese +
50933 = EBCDIC Korean Extended and Korean +
50935 = EBCDIC Simplified Chinese Extended and Simplified Chinese +
50936 = EBCDIC Simplified Chinese +
50937 = EBCDIC US-Canada and Traditional Chinese +
50939 = EBCDIC Japanese (Latin) Extended and Japanese +
51932 = EUC Japanese +
51936 = EUC Simplified Chinese +
51949 = EUC Korean +
51950 = EUC Traditional Chinese +
52936 = HZ-GB2312 Simplified Chinese +
54936 = Windows XP and later: GB18030 Simplified Chinese (4 byte) +
57002 = ISCII Devanagari +
57003 = ISCII Bengali +
57004 = ISCII Tamil +
57005 = ISCII Telugu +
57006 = ISCII Assamese +
57007 = ISCII Oriya +
57008 = ISCII Kannada +
57009 = ISCII Malayalam +
57010 = ISCII Gujarati +
57011 = ISCII Punjabi +
65000 = Unicode (UTF-7) +
65001 = Unicode (UTF-8)
0x0002Titleno 
0x0003Subjectno 
0x0004Authorno 
0x0005Keywordsno 
0x0006Commentsno 
0x0007Templateno 
0x0008LastModifiedByno 
0x0009RevisionNumberno 
0x000aTotalEditTimeno 
0x000bLastPrintedno 
0x000cCreateDateno 
0x000dModifyDateno 
0x000ePagesno 
0x000fWordsno 
0x0010Charactersno 
0x0011ThumbnailClipno 
0x0012Softwareno 
0x0013Securityno0x0 = None +
Bit 0 = Password protected +
Bit 1 = Read-only recommended +
Bit 2 = Read-only enforced +
Bit 3 = Locked for annotations
0x0022CreatedByno 
0x0023DocumentIDno 
0x80000000LocaleIndicatorno 
+ +

FlashPix Transform Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x10000TransformNodeIDno 
0x10001OperationClassIDno 
0x10002LockedPropertyListno 
0x10003TransformTitleno 
0x10004LastModifierno 
0x10005RevisionNumberno 
0x10006TransformCreateDateno 
0x10007TransformModifyDateno 
0x10008CreatingApplicationno 
0x10100InputDataObjectListno 
0x10101OutputDataObjectListno 
0x10102OperationNumberno 
0x10000000ResultAspectRationo 
0x10000001RectangleOfInterestno 
0x10000002Filteringno 
0x10000003SpatialOrientationno 
0x10000004ColorTwistMatrixno 
0x10000005ContrastAdjustmentno 
+ +

FlashPix PreviewInfo Tags

+

Preview information written by some FujiFilm models.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
13PreviewImageWidthno 
23PreviewImageHeightno 
+ +

FlashPix SubimageHdr Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1SubimageWidthno 
2SubimageHeightno 
3SubimageTileCountno 
4SubimageTileWidthno 
5SubimageTileHeightno 
6NumChannelsno 
+ +

FlashPix WordDocument Tags

+

Tags extracted from the Microsoft Word document stream.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000Identificationno0x626a = Word 98 Mac +
0x6a62 = MS Word 97 +
0xa5dc = Word 6.0/7.0 +
0xa5ec = Word 8.0
0x0003LanguageCodeno +
0x400 = None +
0x401 = Arabic +
0x402 = Bulgarian +
0x403 = Catalan +
0x404 = Traditional Chinese +
0x405 = Czech +
0x406 = Danish +
0x407 = German +
0x408 = Greek +
0x409 = English (US) +
0x40a = Spanish (Castilian) +
0x40b = Finnish +
0x40c = French +
0x40d = Hebrew +
0x40e = Hungarian +
0x40f = Icelandic +
0x410 = Italian +
0x411 = Japanese +
0x412 = Korean +
0x413 = Dutch +
0x414 = Norwegian (Bokmal) +
0x415 = Polish +
0x416 = Portuguese (Brazilian) +
0x417 = Rhaeto-Romanic +
0x418 = Romanian +
0x419 = Russian +
0x41a = Croato-Serbian (Latin) +
0x41b = Slovak +
0x41c = Albanian +
0x41d = Swedish +
0x41e = Thai +
0x41f = Turkish +
0x420 = Urdu +
0x421 = Bahasa +
0x422 = Ukrainian +
0x423 = Byelorussian +
0x424 = Slovenian +
0x425 = Estonian +
0x426 = Latvian +
0x427 = Lithuanian +
0x429 = Farsi +
0x42d = Basque +
0x42f = Macedonian +
0x436 = Afrikaans +
0x43e = Malaysian +
0x804 = Simplified Chinese +
0x807 = German (Swiss) +
0x809 = English (British) +
0x80a = Spanish (Mexican) +
0x80c = French (Belgian) +
0x810 = Italian (Swiss) +
0x813 = Dutch (Belgian) +
0x814 = Norwegian (Nynorsk) +
0x816 = Portuguese +
0x81a = Serbo-Croatian (Cyrillic) +
0xc09 = English (Australian) +
0xc0c = French (Canadian) +
0x100c = French (Swiss)
+
0x0005DocFlagsno[val & 0xff0f] + +
Bit 0 = Template +
Bit 1 = AutoText only +
Bit 2 = Complex +
Bit 3 = Has picture +
Bit 8 = Encrypted +
Bit 9 = 1Table
  Bit 10 = Read only +
Bit 11 = Passworded +
Bit 12 = ExtChar +
Bit 13 = Load override +
Bit 14 = Far east +
Bit 15 = Obfuscated
+
9.1Systemno[val & 0x1] +
0 = Windows +
1 = Macintosh
9.2Word97no[val >> 4 & 0x1] +
0 = No +
1 = Yes
+ +

FlashPix DocTable Tags

+

Tags extracted from the Microsoft Word document table.

+
+
+ + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
CommentByno(enable Duplicates option to extract all entries)
DOP---> FlashPix DOP Tags
LastSavedByno(enable Duplicates option to extract history of up to 10 entries)
ModifyDateno 
+ +

FlashPix DOP Tags

+

Microsoft office document properties.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
20CreateDateno 
24ModifyDateno 
28LastPrintedno 
32RevisionNumberno 
34TotalEditTimeno 
38Wordsno 
42Charactersno 
46Pagesno 
48Paragraphsno 
56Linesno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 21, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Font.html b/html/TagNames/Font.html new file mode 100644 index 0000000..72538e5 --- /dev/null +++ b/html/TagNames/Font.html @@ -0,0 +1,486 @@ + + + + +Font Tags + + + +

Font Tags

+

This table contains a collection of tags found in font files of various +formats. ExifTool current recognizes OTF, TTF, TTC, DFONT, PFA, PFB, PFM, +AFM, ACFM and AMFM font files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'AFM'AFM---> Font AFM Tags
'PFM'PFMHeader---> Font PFM Tags
'PSInfo'PSFontInfo---> Font PSInfo Tags
'fontname'FontNameno 
'name'Name---> Font Name Tags
'numfonts'NumFontsno 
'postfont'PostScriptFontNameno 
+ +

Font AFM Tags

+

Tags extracted from Adobe Font Metrics files (AFM, ACFM and AMFM).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Ascender'Ascenderno 
'CapHeight'CapHeightno 
'CharacterSet'CharacterSetno 
'Characters'Charactersno 
'Creation Date'CreateDateno 
'Descender'Descenderno 
'EncodingScheme'EncodingSchemeno 
'EscChar'EscCharno 
'FamilyName'FontFamilyno 
'FontName'FontNameno 
'FullName'FullNameno 
'IsBaseFont'IsBaseFontno 
'IsFixedV'IsFixedVno 
'MappingScheme'MappingSchemeno 
'Notice'Noticeno 
'Version'Versionno 
'Weight'Weightno 
'XHeight'XHeightno 
+ +

Font PFM Tags

+

Tags extracted from the PFM file header.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0PFMVersionno 
6Copyrightno 
66FontTypeno 
68PointSizeno 
70YResolutionno 
72XResolutionno 
74Ascentno 
76InternalLeadingno 
78ExternalLeadingno 
80Italicno 
81Underlineno 
82Strikeoutno 
83Weightno 
85CharacterSetno 
86PixWidthno 
88PixHeightno 
90PitchAndFamilyno 
91AvgWidthno 
93MaxWidthno 
95FirstCharno 
96LastCharno 
97DefaultCharno 
98BreakCharno 
99WidthBytesno 
+ +

Font PSInfo Tags

+

Tags extracted from PostScript font files (PFA and PFB).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Copyright'Copyrightno 
'FSType'FSTypeno 
'FamilyName'FontFamilyno 
'FontName'FontNameno 
'FontType'FontTypeno 
'FullName'FullNameno 
'ItalicAngle'ItalicAngleno 
'Notice'Noticeno 
'UnderlinePosition'UnderlinePositionno 
'UnderlineThickness'UnderlineThicknessno 
'Weight'Weightno 
'isFixedPitch'IsFixedPitchno 
'version'Versionno 
+ +

Font Name Tags

+

The following tags are extracted from the TrueType font "name" table found +in OTF, TTF, TTC and DFONT files. These tags support localized languages by +adding a hyphen followed by a language code to the end of the tag name (eg. +"Copyright-fr" or "License-en-US"). Tags with no language code use the +default language of "en".

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000Copyrightno 
0x0001FontFamilyno 
0x0002FontSubfamilyno 
0x0003FontSubfamilyIDno 
0x0004FontNameno 
0x0005NameTableVersionno 
0x0006PostScriptFontNameno 
0x0007Trademarkno 
0x0008Manufacturerno 
0x0009Designerno 
0x000aDescriptionno 
0x000bVendorURLno 
0x000cDesignerURLno 
0x000dLicenseno 
0x000eLicenseInfoURLno 
0x0010PreferredFamilyno 
0x0011PreferredSubfamilyno 
0x0012CompatibleFontNameno 
0x0013SampleTextno 
0x0014PostScriptFontNameno 
0x0015WWSFamilyNameno 
0x0016WWSSubfamilyNameno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 31, 2012 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/FotoStation.html b/html/TagNames/FotoStation.html new file mode 100644 index 0000000..4149e33 --- /dev/null +++ b/html/TagNames/FotoStation.html @@ -0,0 +1,104 @@ + + + + +FotoStation Tags + + + +

FotoStation Tags

+

The following tables define information found in the FotoWare FotoStation +trailer.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001IPTC---> IPTC Tags
0x0002SoftEdit---> FotoStation SoftEdit Tags
0x0003ThumbnailImageyes 
0x0004PreviewImageyes 
+ +

FotoStation SoftEdit Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0OriginalImageWidthint32s 
1OriginalImageHeightint32s 
2ColorPlanesint32s 
3XYResolutionint32s 
4Rotationint32s(rotations are stored as degrees CCW * 100, but converted to degrees CW by +ExifTool)
6CropLeftint32s 
7CropTopint32s 
8CropRightint32s 
9CropBottomint32s 
11CropRotationint32s 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 20, 2006 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/FujiFilm.html b/html/TagNames/FujiFilm.html new file mode 100644 index 0000000..0bc4bc5 --- /dev/null +++ b/html/TagNames/FujiFilm.html @@ -0,0 +1,1242 @@ + + + + +FujiFilm Tags + + + +

FujiFilm Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000Versionundef 
0x0010InternalSerialNumberstring(this number is unique for most models, and contains the camera model ID and +the date of manufacture)
0x1000Qualitystring 
0x1001Sharpnessint16u +
0x0 = -4 (softest) +
0x1 = -3 (very soft) +
0x2 = -2 (soft) +
0x3 = 0 (normal) +
0x4 = +2 (hard) +
0x5 = +3 (very hard) +
0x6 = +4 (hardest) +
0x82 = -1 (medium soft) +
0x84 = +1 (medium hard) +
0x8000 = Film Simulation +
0xffff = n/a
+
0x1002WhiteBalanceint16u +
0x0 = Auto +
0x1 = Auto (white priority) +
0x2 = Auto (ambiance priority) +
0x100 = Daylight +
0x200 = Cloudy +
0x300 = Daylight Fluorescent +
0x301 = Day White Fluorescent +
0x302 = White Fluorescent +
0x303 = Warm White Fluorescent +
0x304 = Living Room Warm White Fluorescent +
0x400 = Incandescent +
0x500 = Flash +
0x600 = Underwater +
0xf00 = Custom +
0xf01 = Custom2 +
0xf02 = Custom3 +
0xf03 = Custom4 +
0xf04 = Custom5 +
0xff0 = Kelvin
+
0x1003Saturationint16u +
0x0 = 0 (normal) +
0x80 = +1 (medium high) +
0xc0 = +3 (very high) +
0xe0 = +4 (highest) +
0x100 = +2 (high) +
0x180 = -1 (medium low) +
0x200 = Low +
0x300 = None (B&W) +
0x301 = B&W Red Filter +
0x302 = B&W Yellow Filter +
0x303 = B&W Green Filter +
0x310 = B&W Sepia +
0x400 = -2 (low) +
0x4c0 = -3 (very low) +
0x4e0 = -4 (lowest) +
0x500 = Acros +
0x501 = Acros Red Filter +
0x502 = Acros Yellow Filter +
0x503 = Acros Green Filter +
0x8000 = Film Simulation
+
0x1004Contrastint16u +
0x0 = Normal +
0x80 = Medium High +
0x100 = High +
0x180 = Medium Low +
0x200 = Low +
0x8000 = Film Simulation
+
0x1005ColorTemperatureint16u 
0x1006Contrastint16u0x0 = Normal +
0x100 = High +
0x300 = Low
0x100aWhiteBalanceFineTuneint32s[2] 
0x100bNoiseReductionint16u0x40 = Low +
0x80 = Normal +
0x100 = n/a
0x100eNoiseReductionint16u +
0x0 = 0 (normal) +
0x100 = +2 (strong) +
0x180 = +1 (medium strong) +
0x1c0 = +3 (very strong) +
0x1e0 = +4 (strongest) +
0x200 = -2 (weak) +
0x280 = -1 (medium weak) +
0x2c0 = -3 (very weak) +
0x2e0 = -4 (weakest)
+
0x1010FujiFlashModeint16u0x0 = Auto +
0x1 = On +
0x2 = Off +
0x3 = Red-eye reduction +
0x4 = External +
0x10 = Commander +
0x8000 = Not Attached +
0x8120 = TTL +
0x8320 = TTL Auto - Did not fire +
0x9840 = Manual +
0x9860 = Flash Commander +
0x9880 = Multi-flash +
0xa920 = 1st Curtain (front) +
0xaa20 = TTL Slow - 1st Curtain (front) +
0xab20 = TTL Auto - 1st Curtain (front) +
0xad20 = TTL - Red-eye Flash - 1st Curtain (front) +
0xae20 = TTL Slow - Red-eye Flash - 1st Curtain (front) +
0xaf20 = TTL Auto - Red-eye Flash - 1st Curtain (front) +
0xc920 = 2nd Curtain (rear) +
0xca20 = TTL Slow - 2nd Curtain (rear) +
0xcb20 = TTL Auto - 2nd Curtain (rear) +
0xcd20 = TTL - Red-eye Flash - 2nd Curtain (rear) +
0xce20 = TTL Slow - Red-eye Flash - 2nd Curtain (rear) +
0xcf20 = TTL Auto - Red-eye Flash - 2nd Curtain (rear) +
0xe920 = High Speed Sync (HSS)
0x1011FlashExposureComprational64s 
0x1020Macroint16u0 = Off +
1 = On
0x1021FocusModeint16u0 = Auto +
1 = Manual +
65535 = Movie
0x1022AFModeint16u("No" for manual and some AF-multi focus modes) +
0 = No +
1 = Single Point +
256 = Zone +
512 = Wide/Tracking
0x1023FocusPixelint16u[2] 
0x102bPrioritySettings---> FujiFilm PrioritySettings Tags
0x102dFocusSettings---> FujiFilm FocusSettings Tags
0x102eAFCSettings---> FujiFilm AFCSettings Tags
0x1030SlowSyncint16u0 = Off +
1 = On
0x1031PictureModeint16u +
0x0 = Auto +
0x1 = Portrait +
0x2 = Landscape +
0x3 = Macro +
0x4 = Sports +
0x5 = Night Scene +
0x6 = Program AE +
0x7 = Natural Light +
0x8 = Anti-blur +
0x9 = Beach & Snow +
0xa = Sunset +
0xb = Museum +
0xc = Party +
0xd = Flower +
0xe = Text +
0xf = Natural Light & Flash +
0x10 = Beach +
0x11 = Snow +
0x12 = Fireworks +
0x13 = Underwater +
0x14 = Portrait with Skin Correction +
0x16 = Panorama +
0x17 = Night (tripod) +
0x18 = Pro Low-light +
0x19 = Pro Focus +
0x1a = Portrait 2 +
0x1b = Dog Face Detection +
0x1c = Cat Face Detection +
0x30 = HDR +
0x40 = Advanced Filter +
0x100 = Aperture-priority AE +
0x200 = Shutter speed priority AE +
0x300 = Manual
+
0x1032ExposureCountint16u(number of exposures used for this image)
0x1033EXRAutoint16u0 = Auto +
1 = Manual
0x1034EXRModeint16u0x100 = HR (High Resolution) +
0x200 = SN (Signal to Noise priority) +
0x300 = DR (Dynamic Range priority)
0x1040ShadowToneint32s + +
-64 = +4 (hardest) +
-48 = +3 (very hard) +
-32 = +2 (hard) +
-16 = +1 (medium hard)
  0 = 0 (normal) +
16 = -1 (medium soft) +
32 = -2 (soft)
+
0x1041HighlightToneint32s + +
-64 = +4 (hardest) +
-48 = +3 (very hard) +
-32 = +2 (hard) +
-16 = +1 (medium hard)
  0 = 0 (normal) +
16 = -1 (medium soft) +
32 = -2 (soft)
+
0x1044DigitalZoomint32u 
0x1045LensModulationOptimizerint32u0 = Off +
1 = On
0x1047GrainEffectint32s0 = Off +
32 = Weak +
64 = Strong
0x1048ColorChromeEffectint32s0 = Off +
32 = Weak +
64 = Strong
0x1049BWAdjustmentint8s(positive values are warm, negative values are cool)
0x104dCropModeint16u0 = n/a +
1 = Full-frame on GFX +
2 = Sports Finder Mode +
4 = Electronic Shutter 1.25x Crop
0x104eColorChromeFXBlueint32s0 = Off +
32 = Weak +
64 = Strong
0x1050ShutterTypeint16u0 = Mechanical +
1 = Electronic +
2 = Electronic (long shutter speed) +
3 = Electronic Front Curtain
0x1100AutoBracketingint16u(X-T3 only) +
0 = Off +
1 = On +
2 = Pre-shot +
(other models) +
0 = Off +
1 = On +
2 = No flash & flash +
6 = Pixel Shift
0x1101SequenceNumberint16u 
0x1103DriveSettings---> FujiFilm DriveSettings Tags
0x1105PixelShiftShotsint16u 
0x1106PixelShiftOffsetrational64s[2] 
0x1153PanoramaAngleint16u 
0x1154PanoramaDirectionint16u1 = Right +
2 = Up +
3 = Left +
4 = Down
0x1201AdvancedFilterint32u +
0x10000 = Pop Color +
0x20000 = Hi Key +
0x30000 = Toy Camera +
0x40000 = Miniature +
0x50000 = Dynamic Tone +
0x60001 = Partial Color Red +
0x60002 = Partial Color Yellow +
0x60003 = Partial Color Green +
0x60004 = Partial Color Blue +
0x60005 = Partial Color Orange +
0x60006 = Partial Color Purple +
0x70000 = Soft Focus +
0x90000 = Low Key
+
0x1210ColorModeint16u0x0 = Standard +
0x10 = Chrome +
0x30 = B & W
0x1300BlurWarningint16u0 = None +
1 = Blur Warning
0x1301FocusWarningint16u0 = Good +
1 = Out of focus
0x1302ExposureWarningint16u0 = Good +
1 = Bad exposure
0x1304GEImageSizestring(GE models only)
0x1400DynamicRangeint16u1 = Standard +
3 = Wide
0x1401FilmModeint16u0x0 = F0/Standard (Provia) +
0x100 = F1/Studio Portrait +
0x110 = F1a/Studio Portrait Enhanced Saturation +
0x120 = F1b/Studio Portrait Smooth Skin Tone (Astia) +
0x130 = F1c/Studio Portrait Increased Sharpness +
0x200 = F2/Fujichrome (Velvia) +
0x300 = F3/Studio Portrait Ex +
0x400 = F4/Velvia +
0x500 = Pro Neg. Std +
0x501 = Pro Neg. Hi +
0x600 = Classic Chrome +
0x700 = Eterna +
0x800 = Classic Negative +
0x900 = Bleach Bypass +
0xa00 = Nostalgic Neg
0x1402DynamicRangeSettingint16u +
0x0 = Auto +
0x1 = Manual +
0x100 = Standard (100%) +
0x200 = Wide1 (230%) +
0x201 = Wide2 (400%) +
0x8000 = Film Simulation
+
0x1403DevelopmentDynamicRangeint16u 
0x1404MinFocalLengthrational64s 
0x1405MaxFocalLengthrational64s 
0x1406MaxApertureAtMinFocalrational64s 
0x1407MaxApertureAtMaxFocalrational64s 
0x140bAutoDynamicRangeint16u 
0x1422ImageStabilizationint16u[3][Value 0] + +
0 = None +
1 = Optical +
2 = Sensor-shift
  3 = OIS Lens +
258 = IBIS/OIS + DIS +
512 = Digital
+[Value 1] +
0 = Off +
1 = On (mode 1, continuous) +
2 = On (mode 2, shooting only)
0x1425SceneRecognitionint16u +
0x0 = Unrecognized +
0x100 = Portrait Image +
0x103 = Night Portrait +
0x105 = Backlit Portrait +
0x200 = Landscape Image +
0x300 = Night Scene +
0x400 = Macro
+
0x1431Ratingint32u 
0x1436ImageGenerationint16u0 = Original Image +
1 = Re-developed from RAW
0x1438ImageCountint16u(may reset to 0 when new firmware is installed)
0x1443DRangePriorityint16u0 = Auto +
1 = Fixed
0x1444DRangePriorityAutoint16u1 = Weak +
2 = Strong +
3 = Plus
0x1445DRangePriorityFixedint16u1 = Weak +
2 = Strong
0x1446FlickerReductionint32u 
0x1447FirmwareVersionstring 
0x1448FirmwareVersion2string 
0x3803VideoRecordingModeint32u0x0 = Normal +
0x10 = F-log +
0x20 = HLG
0x3804PeripheralLightingint16u0 = Off +
1 = On
0x3806VideoCompressionint16u1 = Log GOP +
2 = All Intra
0x3820FrameRateint16u 
0x3821FrameWidthint16u 
0x3822FrameHeightint16u 
0x3824FullHDHighSpeedRecint32u1 = Off +
2 = On
0x4005FaceElementSelectedint16u[4] 
0x4100FacesDetectedint16u 
0x4103FacePositionsint16u[n](left, top, right and bottom coordinates in full-sized image for each face +detected)
0x4200NumFaceElementsint16u 
0x4201FaceElementTypesint8u[n][Values 0-N] + +
1 = Face +
2 = Left Eye +
3 = Right Eye +
7 = Body +
8 = Head +
11 = Bike +
12 = Body of Car +
13 = Front of Car +
14 = Animal Body +
15 = Animal Head +
16 = Animal Face
  17 = Animal Left Eye +
18 = Animal Right Eye +
19 = Bird Body +
20 = Bird Head +
21 = Bird Left Eye +
22 = Bird Right Eye +
23 = Aircraft Body +
25 = Aircraft Cockpit +
26 = Train Front +
27 = Train Cockpit
+
0x4203FaceElementPositionsint16u[n](left, top, right and bottom coordinates in full-sized image for each face +element)
0x4282FaceRecInfo---> FujiFilm FaceRecInfo Tags
0x8000FileSourcestring 
0x8002OrderNumberint32u 
0x8003FrameNumberint16u 
0xb211Parallaxrational64s(only found in MPImage2 of .MPO images)
+ +

FujiFilm PrioritySettings Tags

+
+
+ + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0.1AF-SPriorityint16u[val & 0xf] +
1 = Release +
2 = Focus
0.2AF-CPriorityint16u[val >> 4 & 0xf] +
1 = Release +
2 = Focus
+ +

FujiFilm FocusSettings Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0.1FocusMode2int32u[val & 0xf] +
0 = AF-M +
1 = AF-S +
2 = AF-C
0.2PreAFint32u[val >> 4 & 0xf] +
0 = Off +
1 = On
0.3AFAreaModeint32u[val >> 8 & 0xf] +
0 = Single Point +
1 = Zone +
2 = Wide/Tracking
0.4AFAreaPointSizeint32u[val >> 12 & 0xf] +
0 = n/a
0.5AFAreaZoneSizeint32u[val >> 16 & 0xf] +
0 = n/a
+ +

FujiFilm AFCSettings Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0AF-CSettingint32u0x102 = Set 1 (multi-purpose) +
0x203 = Set 2 (ignore obstacles) +
0x122 = Set 3 (accelerating subject) +
0x010 = Set 4 (suddenly appearing subject) +
0x123 = Set 5 (erratic motion)
0.1AF-CTrackingSensitivityint32u[val & 0xf]
0.2AF-CSpeedTrackingSensitivityint32u[val >> 4 & 0xf]
0.3AF-CZoneAreaSwitchingint32u[val >> 8 & 0xf] +
0 = Front +
1 = Auto +
2 = Center
+ +

FujiFilm DriveSettings Tags

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0.1DriveModeint32u[val & 0xff] +
0 = Single +
1 = Continuous Low +
2 = Continuous High
0.2DriveSpeedint32u[val >> 24 & 0xff] +
0 = n/a
+ +

FujiFilm FaceRecInfo Tags

+

Face recognition information.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Face1Birthdayno 
Face1CategorynoBit 1 = Partner +
Bit 2 = Family +
Bit 3 = Friend
Face1Nameno 
Face2Birthdayno 
Face2CategorynoBit 1 = Partner +
Bit 2 = Family +
Bit 3 = Friend
Face2Nameno 
Face3Birthdayno 
Face3CategorynoBit 1 = Partner +
Bit 2 = Family +
Bit 3 = Friend
Face3Nameno 
Face4Birthdayno 
Face4CategorynoBit 1 = Partner +
Bit 2 = Family +
Bit 3 = Friend
Face4Nameno 
Face5Birthdayno 
Face5CategorynoBit 1 = Partner +
Bit 2 = Family +
Bit 3 = Friend
Face5Nameno 
Face6Birthdayno 
Face6CategorynoBit 1 = Partner +
Bit 2 = Family +
Bit 3 = Friend
Face6Nameno 
Face7Birthdayno 
Face7CategorynoBit 1 = Partner +
Bit 2 = Family +
Bit 3 = Friend
Face7Nameno 
Face8Birthdayno 
Face8CategorynoBit 1 = Partner +
Bit 2 = Family +
Bit 3 = Friend
Face8Nameno 
+ +

FujiFilm RAF Tags

+

FujiFilm RAF images contain meta information stored in a proprietary +FujiFilm RAF format, as well as EXIF information stored inside an embedded +JPEG preview image. The table below lists tags currently decoded from the +RAF-format information.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0100RawImageFullSizeno(including borders)
0x0110RawImageCropTopLeftno(top margin first, then left margin)
0x0111RawImageCroppedSizeno(including borders)
0x0115RawImageAspectRationo 
0x0121RawImageSizeno 
0x0130FujiLayoutno 
0x0131XTransLayoutno 
0x2000WB_GRGBLevelsAutono 
0x2100WB_GRGBLevelsDaylightno 
0x2200WB_GRGBLevelsCloudyno 
0x2300WB_GRGBLevelsDaylightFluorno 
0x2301WB_GRGBLevelsDayWhiteFluorno 
0x2302WB_GRGBLevelsWhiteFluorescentno 
0x2310WB_GRGBLevelsWarmWhiteFluorno 
0x2311WB_GRGBLevelsLivingRoomWarmWhiteFluorno 
0x2400WB_GRGBLevelsTungstenno 
0x2ff0WB_GRGBLevelsno 
0x9200RelativeExposureno 
0x9650RawExposureBiasno 
0xc000RAFData---> FujiFilm RAFData Tags
+ +

FujiFilm RAFData Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0RawImageWidthno 
4RawImageWidth +
RawImageHeight
no
no
 
8RawImageWidth +
RawImageHeight
no
no
 
12RawImageHeightno 
+ +

FujiFilm IFD Tags

+

Tags found in the FujiIFD information of RAF images from some models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0xf000FujiIFD---> FujiFilm IFD Tags
0xf001RawImageFullWidthno 
0xf002RawImageFullHeightno 
0xf003BitsPerSampleno 
0xf007StripOffsetsno 
0xf008StripByteCountsno 
0xf00aBlackLevelno 
0xf00bGeometricDistortionParamsno 
0xf00cWB_GRBLevelsStandardno 
0xf00dWB_GRBLevelsAutono 
0xf00eWB_GRBLevelsno 
0xf00fChromaticAberrationParamsno 
0xf010VignettingParamsno 
+ +

FujiFilm FFMV Tags

+

Information found in the FFMV atom of MOV videos.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0MovieStreamNameno 
+ +

FujiFilm MOV Tags

+

This information is found in MOV videos from some FujiFilm cameras.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
24Modelno 
46ExposureTimeno 
50FNumberno 
58ExposureCompensationno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 21, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/GE.html b/html/TagNames/GE.html new file mode 100644 index 0000000..bef8ea7 --- /dev/null +++ b/html/TagNames/GE.html @@ -0,0 +1,41 @@ + + + + +GE Tags + + + +

GE Tags

+

This table lists tags found in the maker notes of some General Imaging +camera models.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0202Macroint16u0 = Off +
1 = On
0x0207GEModelstring 
0x0300GEMakestring 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Dec 15, 2010 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/GIF.html b/html/TagNames/GIF.html new file mode 100644 index 0000000..b207b35 --- /dev/null +++ b/html/TagNames/GIF.html @@ -0,0 +1,191 @@ + + + + +GIF Tags + + + +

GIF Tags

+

This table lists information extracted from GIF images. See +http://www.w3.org/Graphics/GIF/spec-gif89a.txt for the official GIF89a +specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Commentyes 
Durationno(duration of a single animation iteration)
Extensions---> GIF Extensions Tags
FrameCountno(number of animated images)
GIFVersionno 
ScreenDescriptor---> GIF Screen Tags
Textno(text displayed in image)
TransparentColorno 
+ +

GIF Extensions Tags

+

Tags extracted from GIF89a application extensions.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ICCRGBG1/012'ICC_Profileyes--> ICC_Profile Tags
'MIDICTRL/Jon'MIDIControl---> GIF MIDIControl Tags
'MIDISONG/Dm7'MIDISongno 
'NETSCAPE/2.0'Animation---> GIF Animation Tags
'XMP Data/XMP'XMPyes--> XMP Tags
+ +

GIF MIDIControl Tags

+

Information extracted from the MIDI control block extension.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0MIDIControlVersionno 
1SequenceNumberno 
2MelodicPolyphonyno 
3PercussivePolyphonyno 
4ChannelUsageno 
6DelayTimeno 
+ +

GIF Animation Tags

+

Information extracted from the "NETSCAPE2.0" animation extension.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
1AnimationIterationsno 
+ +

GIF Screen Tags

+

Information extracted from the GIF logical screen descriptor.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ImageWidthno 
2ImageHeightno 
4.1HasColorMapno[val >> 7 & 0x1] +
0 = No +
1 = Yes
4.2ColorResolutionDepthno[val >> 4 & 0x7]
4.3BitsPerPixelno[val & 0x7]
5BackgroundColorno 
6PixelAspectRationo 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Dec 8, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/GIMP.html b/html/TagNames/GIMP.html new file mode 100644 index 0000000..a822987 --- /dev/null +++ b/html/TagNames/GIMP.html @@ -0,0 +1,159 @@ + + + + +GIMP Tags + + + +

GIMP Tags

+

The GNU Image Manipulation Program (GIMP) writes these tags in its native +XCF (eXperimental Computing Facilty) images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'header'Header---> GIMP Header Tags
0x0011Compressionno0 = None +
1 = RLE Encoding +
2 = Zlib +
3 = Fractal
0x0013Resolution---> GIMP Resolution Tags
0x0014Tattoono 
0x0015Parasites---> GIMP Parasite Tags
0x0016Unitsno1 = Inches +
2 = mm +
3 = Points +
4 = Picas
+ +

GIMP Header Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
9XCFVersionno'file' = 0 +
'v001' = 1 +
'v002' = 2
14ImageWidthno 
18ImageHeightno 
22ColorModeno0 = RGB Color +
1 = Grayscale +
2 = Indexed Color
+ +

GIMP Resolution Tags

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0XResolutionno 
1YResolutionno 
+ +

GIMP Parasite Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'exif-data'ExifData---> EXIF Tags
'gimp-comment'Commentno 
'gimp-image-metadata'XML---> XMP XML Tags
'gimp-metadata'XMP---> XMP Tags
'icc-profile'ICC_Profile---> ICC_Profile Tags
'icc-profile-name'ICCProfileNameno 
'iptc-data'IPTCData---> IPTC Tags
'jpeg-exif-data'JPEGExifData---> EXIF Tags
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Aug 21, 2018 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/GPS.html b/html/TagNames/GPS.html new file mode 100644 index 0000000..9e048d3 --- /dev/null +++ b/html/TagNames/GPS.html @@ -0,0 +1,231 @@ + + + + +GPS Tags + + + +

GPS Tags

+

+These GPS tags are part of the EXIF standard, and are stored in a separate +IFD within the EXIF information.

+ +

ExifTool is very flexible about the input format when writing lat/long +coordinates, and will accept from 1 to 3 floating point numbers (for decimal +degrees, degrees and minutes, or degrees, minutes and seconds) separated by +just about anything, and will format them properly according to the EXIF +specification.

+ +

Some GPS tags have values which are fixed-length strings. For these, the +indicated string lengths include a null terminator which is added +automatically by ExifTool. Remember that the descriptive values are used +when writing (eg. 'Above Sea Level', not '0') unless the print conversion is +disabled (with '-n' on the command line or the PrintConv option in the API, +or by suffixing the tag name with a # character).

+ +

When adding GPS information to an image, it is important to set all of the +following tags: GPSLatitude, GPSLatitudeRef, GPSLongitude, GPSLongitudeRef, +and GPSAltitude and GPSAltitudeRef if the altitude is known. ExifTool will +write the required GPSVersionID tag automatically if new a GPS IFD is added +to an image. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000GPSVersionIDint8u[4]: 
0x0001GPSLatitudeRefstring[2](tags 0x0001-0x0006 used for camera location according to MWG 2.0. ExifTool +will also accept a number when writing GPSLatitudeRef, positive for north +latitudes or negative for south, or a string containing N, North, S or South) +
'N' = North +
'S' = South
0x0002GPSLatituderational64u[3] 
0x0003GPSLongitudeRefstring[2](ExifTool will also accept a number when writing this tag, positive for east +longitudes or negative for west, or a string containing E, East, W or West) +
'E' = East +
'W' = West
0x0004GPSLongituderational64u[3] 
0x0005GPSAltitudeRefint8u(ExifTool will also accept number when writing this tag, with negative +numbers indicating below sea level) +
0 = Above Sea Level +
1 = Below Sea Level
0x0006GPSAltituderational64u 
0x0007GPSTimeStamprational64u[3](UTC time of GPS fix. When writing, date is stripped off if present, and +time is adjusted to UTC if it includes a timezone)
0x0008GPSSatellitesstring 
0x0009GPSStatusstring[2]'A' = Measurement Active +
'V' = Measurement Void
0x000aGPSMeasureModestring[2]2 = 2-Dimensional Measurement +
3 = 3-Dimensional Measurement
0x000bGPSDOPrational64u 
0x000cGPSSpeedRefstring[2]'K' = km/h +
'M' = mph +
'N' = knots
0x000dGPSSpeedrational64u 
0x000eGPSTrackRefstring[2]'M' = Magnetic North +
'T' = True North
0x000fGPSTrackrational64u 
0x0010GPSImgDirectionRefstring[2]'M' = Magnetic North +
'T' = True North
0x0011GPSImgDirectionrational64u 
0x0012GPSMapDatumstring 
0x0013GPSDestLatitudeRefstring[2](tags 0x0013-0x001a used for subject location according to MWG 2.0) +
'N' = North +
'S' = South
0x0014GPSDestLatituderational64u[3] 
0x0015GPSDestLongitudeRefstring[2]'E' = East +
'W' = West
0x0016GPSDestLongituderational64u[3] 
0x0017GPSDestBearingRefstring[2]'M' = Magnetic North +
'T' = True North
0x0018GPSDestBearingrational64u 
0x0019GPSDestDistanceRefstring[2]'K' = Kilometers +
'M' = Miles +
'N' = Nautical Miles
0x001aGPSDestDistancerational64u 
0x001bGPSProcessingMethodundef(values of "GPS", "CELLID", "WLAN" or "MANUAL" by the EXIF spec.)
0x001cGPSAreaInformationundef 
0x001dGPSDateStampstring[11](when writing, time is stripped off if present, after adjusting date/time to +UTC if time includes a timezone. Format is YYYY:mm:dd)
0x001eGPSDifferentialint16u0 = No Correction +
1 = Differential Corrected
0x001fGPSHPositioningErrorrational64u 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Mar 17, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/GeoTiff.html b/html/TagNames/GeoTiff.html new file mode 100644 index 0000000..8555230 --- /dev/null +++ b/html/TagNames/GeoTiff.html @@ -0,0 +1,2301 @@ + + + + +GeoTiff Tags + + + +

GeoTiff Tags

+

+ExifTool extracts the following tags from GeoTIFF images. See +http://www.remotesensing.org/geotiff/spec/geotiffhome.html for the +complete GeoTIFF specification. Also included in the table below are +ChartTIFF tags (see http://www.charttiff.com/whitepapers.shtml). GeoTIFF +tags are not writable individually, but they may be copied en mass via the +block tags GeoTiffDirectory, GeoTiffDoubleParams and GeoTiffAsciiParams. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001GeoTiffVersionno 
0x0400GTModelTypeno1 = Projected +
2 = Geographic +
3 = Geocentric +
32767 = User Defined
0x0401GTRasterTypeno1 = Pixel Is Area +
2 = Pixel Is Point +
32767 = User Defined
0x0402GTCitationno 
0x0800GeographicTypeno +
4001 = Airy 1830 +
4002 = Airy Modified 1849 +
4003 = Australian National Spheroid +
4004 = Bessel 1841 +
4005 = Bessel Modified +
4006 = Bessel Namibia +
4007 = Clarke 1858 +
4008 = Clarke 1866 +
4009 = Clarke 1866 Michigan +
4010 = Clarke 1880 Benoit +
4011 = Clarke 1880 IGN +
4012 = Clarke 1880 RGS +
4013 = Clarke 1880 Arc +
4014 = Clarke 1880 SGA 1922 +
4015 = Everest 1830 1937 Adjustment +
4016 = Everest 1830 1967 Definition +
4017 = Everest 1830 1975 Definition +
4018 = Everest 1830 Modified +
4019 = GRS 1980 +
4020 = Helmert 1906 +
4021 = Indonesian National Spheroid +
4022 = International 1924 +
4023 = International 1967 +
4024 = Krassowsky 1940 +
4025 = NWL9D +
4026 = NWL10D +
4027 = Plessis 1817 +
4028 = Struve 1860 +
4029 = War Office +
4030 = WGS84 +
4031 = GEM10C +
4032 = OSU86F +
4033 = OSU91A +
4034 = Clarke 1880 +
4035 = Sphere +
4120 = Greek +
4121 = GGRS87 +
4123 = KKJ +
4124 = RT90 +
4133 = EST92 +
4201 = Adindan +
4202 = AGD66 +
4203 = AGD84 +
4204 = Ain el Abd +
4205 = Afgooye +
4206 = Agadez +
4207 = Lisbon +
4208 = Aratu +
4209 = Arc 1950 +
4210 = Arc 1960 +
4211 = Batavia +
4212 = Barbados +
4213 = Beduaram +
4214 = Beijing 1954 +
4215 = Belge 1950 +
4216 = Bermuda 1957 +
4217 = Bern 1898 +
4218 = Bogota +
4219 = Bukit Rimpah +
4220 = Camacupa +
4221 = Campo Inchauspe +
4222 = Cape +
4223 = Carthage +
4224 = Chua +
4225 = Corrego Alegre +
4226 = Cote d Ivoire +
4227 = Deir ez Zor +
4228 = Douala +
4229 = Egypt 1907 +
4230 = ED50 +
4231 = ED87 +
4232 = Fahud +
4233 = Gandajika 1970 +
4234 = Garoua +
4235 = Guyane Francaise +
4236 = Hu Tzu Shan +
4237 = HD72 +
4238 = ID74 +
4239 = Indian 1954 +
4240 = Indian 1975 +
4241 = Jamaica 1875 +
4242 = JAD69 +
4243 = Kalianpur +
4244 = Kandawala +
4245 = Kertau +
4246 = KOC +
4247 = La Canoa +
4248 = PSAD56 +
4249 = Lake +
4250 = Leigon +
4251 = Liberia 1964 +
4252 = Lome +
4253 = Luzon 1911 +
4254 = Hito XVIII 1963 +
4255 = Herat North +
4256 = Mahe 1971 +
4257 = Makassar +
4258 = EUREF89 +
4259 = Malongo 1987 +
4260 = Manoca +
4261 = Merchich +
4262 = Massawa +
4263 = Minna +
4264 = Mhast +
4265 = Monte Mario +
4266 = M poraloko +
4267 = NAD27 +
4268 = NAD Michigan +
4269 = NAD83 +
4270 = Nahrwan 1967 +
4271 = Naparima 1972 +
4272 = GD49 +
4273 = NGO 1948 +
4274 = 73 +
4275 = NTF +
4276 = NSWC 9Z 2 +
4277 = OSGB 1936 +
4278 = OSGB70 +
4279 = OS SN80 +
4280 = Padang +
4281 = Palestine 1923 +
4282 = Pointe Noire +
4283 = GDA94 +
4284 = Pulkovo 1942 +
4285 = Qatar +
4286 = Qatar 1948 +
4287 = Qornoq +
4288 = Loma Quintana +
4289 = Amersfoort +
4290 = RT38 +
4291 = SAD69 +
4292 = Sapper Hill 1943 +
4293 = Schwarzeck +
4294 = Segora +
4295 = Serindung +
4296 = Sudan +
4297 = Tananarive +
4298 = Timbalai 1948 +
4299 = TM65 +
4300 = TM75 +
4301 = Tokyo +
4302 = Trinidad 1903 +
4303 = TC 1948 +
4304 = Voirol 1875 +
4305 = Voirol Unifie +
4306 = Bern 1938 +
4307 = Nord Sahara 1959 +
4308 = Stockholm 1938 +
4309 = Yacare +
4310 = Yoff +
4311 = Zanderij +
4312 = MGI +
4313 = Belge 1972 +
4314 = DHDN +
4315 = Conakry 1905 +
4317 = Dealul Piscului 1970 +
4322 = WGS 72 +
4324 = WGS 72BE +
4326 = WGS 84 +
4801 = Bern 1898 Bern +
4802 = Bogota Bogota +
4803 = Lisbon Lisbon +
4804 = Makassar Jakarta +
4805 = MGI Ferro +
4806 = Monte Mario Rome +
4807 = NTF Paris +
4808 = Padang Jakarta +
4809 = Belge 1950 Brussels +
4810 = Tananarive Paris +
4811 = Voirol 1875 Paris +
4812 = Voirol Unifie Paris +
4813 = Batavia Jakarta +
4815 = Greek Athens +
4901 = ATF Paris +
4902 = NDG Paris +
32767 = User Defined
+
0x0801GeogCitationno 
0x0802GeogGeodeticDatumno +
6001 = Airy 1830 +
6002 = Airy Modified 1849 +
6003 = Australian National Spheroid +
6004 = Bessel 1841 +
6005 = Bessel Modified +
6006 = Bessel Namibia +
6007 = Clarke 1858 +
6008 = Clarke 1866 +
6009 = Clarke 1866 Michigan +
6010 = Clarke 1880 Benoit +
6011 = Clarke 1880 IGN +
6012 = Clarke 1880 RGS +
6013 = Clarke 1880 Arc +
6014 = Clarke 1880 SGA 1922 +
6015 = Everest 1830 1937 Adjustment +
6016 = Everest 1830 1967 Definition +
6017 = Everest 1830 1975 Definition +
6018 = Everest 1830 Modified +
6019 = GRS 1980 +
6020 = Helmert 1906 +
6021 = Indonesian National Spheroid +
6022 = International 1924 +
6023 = International 1967 +
6024 = Krassowsky 1960 +
6025 = NWL9D +
6026 = NWL10D +
6027 = Plessis 1817 +
6028 = Struve 1860 +
6029 = War Office +
6030 = WGS84 +
6031 = GEM10C +
6032 = OSU86F +
6033 = OSU91A +
6034 = Clarke 1880 +
6035 = Sphere +
6201 = Adindan +
6202 = Australian Geodetic Datum 1966 +
6203 = Australian Geodetic Datum 1984 +
6204 = Ain el Abd 1970 +
6205 = Afgooye +
6206 = Agadez +
6207 = Lisbon +
6208 = Aratu +
6209 = Arc 1950 +
6210 = Arc 1960 +
6211 = Batavia +
6212 = Barbados +
6213 = Beduaram +
6214 = Beijing 1954 +
6215 = Reseau National Belge 1950 +
6216 = Bermuda 1957 +
6217 = Bern 1898 +
6218 = Bogota +
6219 = Bukit Rimpah +
6220 = Camacupa +
6221 = Campo Inchauspe +
6222 = Cape +
6223 = Carthage +
6224 = Chua +
6225 = Corrego Alegre +
6226 = Cote d Ivoire +
6227 = Deir ez Zor +
6228 = Douala +
6229 = Egypt 1907 +
6230 = European Datum 1950 +
6231 = European Datum 1987 +
6232 = Fahud +
6233 = Gandajika 1970 +
6234 = Garoua +
6235 = Guyane Francaise +
6236 = Hu Tzu Shan +
6237 = Hungarian Datum 1972 +
6238 = Indonesian Datum 1974 +
6239 = Indian 1954 +
6240 = Indian 1975 +
6241 = Jamaica 1875 +
6242 = Jamaica 1969 +
6243 = Kalianpur +
6244 = Kandawala +
6245 = Kertau +
6246 = Kuwait Oil Company +
6247 = La Canoa +
6248 = Provisional S American Datum 1956 +
6249 = Lake +
6250 = Leigon +
6251 = Liberia 1964 +
6252 = Lome +
6253 = Luzon 1911 +
6254 = Hito XVIII 1963 +
6255 = Herat North +
6256 = Mahe 1971 +
6257 = Makassar +
6258 = European Reference System 1989 +
6259 = Malongo 1987 +
6260 = Manoca +
6261 = Merchich +
6262 = Massawa +
6263 = Minna +
6264 = Mhast +
6265 = Monte Mario +
6266 = M poraloko +
6267 = North American Datum 1927 +
6268 = NAD Michigan +
6269 = North American Datum 1983 +
6270 = Nahrwan 1967 +
6271 = Naparima 1972 +
6272 = New Zealand Geodetic Datum 1949 +
6273 = NGO 1948 +
6274 = Datum 73 +
6275 = Nouvelle Triangulation Francaise +
6276 = NSWC 9Z 2 +
6277 = OSGB 1936 +
6278 = OSGB 1970 SN +
6279 = OS SN 1980 +
6280 = Padang 1884 +
6281 = Palestine 1923 +
6282 = Pointe Noire +
6283 = Geocentric Datum of Australia 1994 +
6284 = Pulkovo 1942 +
6285 = Qatar +
6286 = Qatar 1948 +
6287 = Qornoq +
6288 = Loma Quintana +
6289 = Amersfoort +
6290 = RT38 +
6291 = South American Datum 1969 +
6292 = Sapper Hill 1943 +
6293 = Schwarzeck +
6294 = Segora +
6295 = Serindung +
6296 = Sudan +
6297 = Tananarive 1925 +
6298 = Timbalai 1948 +
6299 = TM65 +
6300 = TM75 +
6301 = Tokyo +
6302 = Trinidad 1903 +
6303 = Trucial Coast 1948 +
6304 = Voirol 1875 +
6305 = Voirol Unifie 1960 +
6306 = Bern 1938 +
6307 = Nord Sahara 1959 +
6308 = Stockholm 1938 +
6309 = Yacare +
6310 = Yoff +
6311 = Zanderij +
6312 = Militar Geographische Institut +
6313 = Reseau National Belge 1972 +
6314 = Deutsche Hauptdreiecksnetz +
6315 = Conakry 1905 +
6317 = Dealul Piscului 1970 +
6322 = WGS72 +
6324 = WGS72 Transit Broadcast Ephemeris +
6326 = WGS84 +
6901 = Ancienne Triangulation Francaise +
6902 = Nord de Guerre +
32767 = User Defined
+
0x0803GeogPrimeMeridianno + +
8901 = Greenwich +
8902 = Lisbon +
8903 = Paris +
8904 = Bogota +
8905 = Madrid +
8906 = Rome
  8907 = Bern +
8908 = Jakarta +
8909 = Ferro +
8910 = Brussels +
8911 = Stockholm +
32767 = User Defined
+
0x0804GeogLinearUnitsno--> GeoTiff Units Values
0x0805GeogLinearUnitSizeno 
0x0806GeogAngularUnitsno--> GeoTiff Units Values
0x0807GeogAngularUnitSizeno 
0x0808GeogEllipsoidno +
7001 = Airy 1830 +
7002 = Airy Modified 1849 +
7003 = Australian National Spheroid +
7004 = Bessel 1841 +
7005 = Bessel Modified +
7006 = Bessel Namibia +
7007 = Clarke 1858 +
7008 = Clarke 1866 +
7009 = Clarke 1866 Michigan +
7010 = Clarke 1880 Benoit +
7011 = Clarke 1880 IGN +
7012 = Clarke 1880 RGS +
7013 = Clarke 1880 Arc +
7014 = Clarke 1880 SGA 1922 +
7015 = Everest 1830 1937 Adjustment +
7016 = Everest 1830 1967 Definition +
7017 = Everest 1830 1975 Definition +
7018 = Everest 1830 Modified +
7019 = GRS 1980 +
7020 = Helmert 1906 +
7021 = Indonesian National Spheroid +
7022 = International 1924 +
7023 = International 1967 +
7024 = Krassowsky 1940 +
7025 = NWL 9D +
7026 = NWL 10D +
7027 = Plessis 1817 +
7028 = Struve 1860 +
7029 = War Office +
7030 = WGS 84 +
7031 = GEM 10C +
7032 = OSU86F +
7033 = OSU91A +
7034 = Clarke 1880 +
7035 = Sphere +
32767 = User Defined
+
0x0809GeogSemiMajorAxisno 
0x080aGeogSemiMinorAxisno 
0x080bGeogInvFlatteningno 
0x080cGeogAzimuthUnitsno--> GeoTiff Units Values
0x080dGeogPrimeMeridianLongno 
0x080eGeogToWGS84no 
0x0c00ProjectedCSTypeno +
2100 = GGRS87 Greek Grid +
2176 = ETRS89 Poland CS2000 zone 5 +
2177 = ETRS89 Poland CS2000 zone 7 +
2178 = ETRS89 Poland CS2000 zone 8 +
2180 = ETRS89 Poland CS92 +
2204 = NAD27 Tennessee +
2205 = NAD83 Kentucky North +
2391 = KKJ Finland zone 1 +
2392 = KKJ Finland zone 2 +
2393 = KKJ Finland zone 3 +
2394 = KKJ Finland zone 4 +
2400 = RT90 2 5 gon W +
2600 = Lietuvos Koordinoei Sistema 1994 +
3053 = Hjorsey 1955 Lambert +
3057 = ISN93 Lambert 1993 +
3300 = Estonian Coordinate System of 1992 +
3786 = Popular Visualisation CRS / Mercator +
3857 = WGS 84 / Pseudo-Mercator +
20137 = Adindan UTM zone 37N +
20138 = Adindan UTM zone 38N +
20248 = AGD66 AMG zone 48 +
20249 = AGD66 AMG zone 49 +
20250 = AGD66 AMG zone 50 +
20251 = AGD66 AMG zone 51 +
20252 = AGD66 AMG zone 52 +
20253 = AGD66 AMG zone 53 +
20254 = AGD66 AMG zone 54 +
20255 = AGD66 AMG zone 55 +
20256 = AGD66 AMG zone 56 +
20257 = AGD66 AMG zone 57 +
20258 = AGD66 AMG zone 58 +
20348 = AGD84 AMG zone 48 +
20349 = AGD84 AMG zone 49 +
20350 = AGD84 AMG zone 50 +
20351 = AGD84 AMG zone 51 +
20352 = AGD84 AMG zone 52 +
20353 = AGD84 AMG zone 53 +
20354 = AGD84 AMG zone 54 +
20355 = AGD84 AMG zone 55 +
20356 = AGD84 AMG zone 56 +
20357 = AGD84 AMG zone 57 +
20358 = AGD84 AMG zone 58 +
20437 = Ain el Abd UTM zone 37N +
20438 = Ain el Abd UTM zone 38N +
20439 = Ain el Abd UTM zone 39N +
20499 = Ain el Abd Bahrain Grid +
20538 = Afgooye UTM zone 38N +
20539 = Afgooye UTM zone 39N +
20700 = Lisbon Portuguese Grid +
20822 = Aratu UTM zone 22S +
20823 = Aratu UTM zone 23S +
20824 = Aratu UTM zone 24S +
20973 = Arc 1950 Lo13 +
20975 = Arc 1950 Lo15 +
20977 = Arc 1950 Lo17 +
20979 = Arc 1950 Lo19 +
20981 = Arc 1950 Lo21 +
20983 = Arc 1950 Lo23 +
20985 = Arc 1950 Lo25 +
20987 = Arc 1950 Lo27 +
20989 = Arc 1950 Lo29 +
20991 = Arc 1950 Lo31 +
20993 = Arc 1950 Lo33 +
20995 = Arc 1950 Lo35 +
21100 = Batavia NEIEZ +
21148 = Batavia UTM zone 48S +
21149 = Batavia UTM zone 49S +
21150 = Batavia UTM zone 50S +
21413 = Beijing Gauss zone 13 +
21414 = Beijing Gauss zone 14 +
21415 = Beijing Gauss zone 15 +
21416 = Beijing Gauss zone 16 +
21417 = Beijing Gauss zone 17 +
21418 = Beijing Gauss zone 18 +
21419 = Beijing Gauss zone 19 +
21420 = Beijing Gauss zone 20 +
21421 = Beijing Gauss zone 21 +
21422 = Beijing Gauss zone 22 +
21423 = Beijing Gauss zone 23 +
21473 = Beijing Gauss 13N +
21474 = Beijing Gauss 14N +
21475 = Beijing Gauss 15N +
21476 = Beijing Gauss 16N +
21477 = Beijing Gauss 17N +
21478 = Beijing Gauss 18N +
21479 = Beijing Gauss 19N +
21480 = Beijing Gauss 20N +
21481 = Beijing Gauss 21N +
21482 = Beijing Gauss 22N +
21483 = Beijing Gauss 23N +
21500 = Belge Lambert 50 +
21790 = Bern 1898 Swiss Old +
21817 = Bogota UTM zone 17N +
21818 = Bogota UTM zone 18N +
21891 = Bogota Colombia 3W +
21892 = Bogota Colombia Bogota +
21893 = Bogota Colombia 3E +
21894 = Bogota Colombia 6E +
22032 = Camacupa UTM 32S +
22033 = Camacupa UTM 33S +
22191 = C Inchauspe Argentina 1 +
22192 = C Inchauspe Argentina 2 +
22193 = C Inchauspe Argentina 3 +
22194 = C Inchauspe Argentina 4 +
22195 = C Inchauspe Argentina 5 +
22196 = C Inchauspe Argentina 6 +
22197 = C Inchauspe Argentina 7 +
22332 = Carthage UTM zone 32N +
22391 = Carthage Nord Tunisie +
22392 = Carthage Sud Tunisie +
22523 = Corrego Alegre UTM 23S +
22524 = Corrego Alegre UTM 24S +
22832 = Douala UTM zone 32N +
22992 = Egypt 1907 Red Belt +
22993 = Egypt 1907 Purple Belt +
22994 = Egypt 1907 Ext Purple +
23028 = ED50 UTM zone 28N +
23029 = ED50 UTM zone 29N +
23030 = ED50 UTM zone 30N +
23031 = ED50 UTM zone 31N +
23032 = ED50 UTM zone 32N +
23033 = ED50 UTM zone 33N +
23034 = ED50 UTM zone 34N +
23035 = ED50 UTM zone 35N +
23036 = ED50 UTM zone 36N +
23037 = ED50 UTM zone 37N +
23038 = ED50 UTM zone 38N +
23239 = Fahud UTM zone 39N +
23240 = Fahud UTM zone 40N +
23433 = Garoua UTM zone 33N +
23700 = HD72 EOV +
23846 = ID74 UTM zone 46N +
23847 = ID74 UTM zone 47N +
23848 = ID74 UTM zone 48N +
23849 = ID74 UTM zone 49N +
23850 = ID74 UTM zone 50N +
23851 = ID74 UTM zone 51N +
23852 = ID74 UTM zone 52N +
23853 = ID74 UTM zone 53N +
23886 = ID74 UTM zone 46S +
23887 = ID74 UTM zone 47S +
23888 = ID74 UTM zone 48S +
23889 = ID74 UTM zone 49S +
23890 = ID74 UTM zone 50S +
23891 = ID74 UTM zone 51S +
23892 = ID74 UTM zone 52S +
23893 = ID74 UTM zone 53S +
23894 = ID74 UTM zone 54S +
23947 = Indian 1954 UTM 47N +
23948 = Indian 1954 UTM 48N +
24047 = Indian 1975 UTM 47N +
24048 = Indian 1975 UTM 48N +
24100 = Jamaica 1875 Old Grid +
24200 = JAD69 Jamaica Grid +
24370 = Kalianpur India 0 +
24371 = Kalianpur India I +
24372 = Kalianpur India IIa +
24373 = Kalianpur India IIIa +
24374 = Kalianpur India IVa +
24382 = Kalianpur India IIb +
24383 = Kalianpur India IIIb +
24384 = Kalianpur India IVb +
24500 = Kertau Singapore Grid +
24547 = Kertau UTM zone 47N +
24548 = Kertau UTM zone 48N +
24720 = La Canoa UTM zone 20N +
24721 = La Canoa UTM zone 21N +
24818 = PSAD56 UTM zone 18N +
24819 = PSAD56 UTM zone 19N +
24820 = PSAD56 UTM zone 20N +
24821 = PSAD56 UTM zone 21N +
24877 = PSAD56 UTM zone 17S +
24878 = PSAD56 UTM zone 18S +
24879 = PSAD56 UTM zone 19S +
24880 = PSAD56 UTM zone 20S +
24891 = PSAD56 Peru west zone +
24892 = PSAD56 Peru central +
24893 = PSAD56 Peru east zone +
25000 = Leigon Ghana Grid +
25231 = Lome UTM zone 31N +
25391 = Luzon Philippines I +
25392 = Luzon Philippines II +
25393 = Luzon Philippines III +
25394 = Luzon Philippines IV +
25395 = Luzon Philippines V +
25700 = Makassar NEIEZ +
25932 = Malongo 1987 UTM 32S +
26191 = Merchich Nord Maroc +
26192 = Merchich Sud Maroc +
26193 = Merchich Sahara +
26237 = Massawa UTM zone 37N +
26331 = Minna UTM zone 31N +
26332 = Minna UTM zone 32N +
26391 = Minna Nigeria West +
26392 = Minna Nigeria Mid Belt +
26393 = Minna Nigeria East +
26432 = Mhast UTM zone 32S +
26591 = Monte Mario Italy 1 +
26592 = Monte Mario Italy 2 +
26632 = M poraloko UTM 32N +
26692 = M poraloko UTM 32S +
26703 = NAD27 UTM zone 3N +
26704 = NAD27 UTM zone 4N +
26705 = NAD27 UTM zone 5N +
26706 = NAD27 UTM zone 6N +
26707 = NAD27 UTM zone 7N +
26708 = NAD27 UTM zone 8N +
26709 = NAD27 UTM zone 9N +
26710 = NAD27 UTM zone 10N +
26711 = NAD27 UTM zone 11N +
26712 = NAD27 UTM zone 12N +
26713 = NAD27 UTM zone 13N +
26714 = NAD27 UTM zone 14N +
26715 = NAD27 UTM zone 15N +
26716 = NAD27 UTM zone 16N +
26717 = NAD27 UTM zone 17N +
26718 = NAD27 UTM zone 18N +
26719 = NAD27 UTM zone 19N +
26720 = NAD27 UTM zone 20N +
26721 = NAD27 UTM zone 21N +
26722 = NAD27 UTM zone 22N +
26729 = NAD27 Alabama East +
26730 = NAD27 Alabama West +
26731 = NAD27 Alaska zone 1 +
26732 = NAD27 Alaska zone 2 +
26733 = NAD27 Alaska zone 3 +
26734 = NAD27 Alaska zone 4 +
26735 = NAD27 Alaska zone 5 +
26736 = NAD27 Alaska zone 6 +
26737 = NAD27 Alaska zone 7 +
26738 = NAD27 Alaska zone 8 +
26739 = NAD27 Alaska zone 9 +
26740 = NAD27 Alaska zone 10 +
26741 = NAD27 California I +
26742 = NAD27 California II +
26743 = NAD27 California III +
26744 = NAD27 California IV +
26745 = NAD27 California V +
26746 = NAD27 California VI +
26747 = NAD27 California VII +
26748 = NAD27 Arizona East +
26749 = NAD27 Arizona Central +
26750 = NAD27 Arizona West +
26751 = NAD27 Arkansas North +
26752 = NAD27 Arkansas South +
26753 = NAD27 Colorado North +
26754 = NAD27 Colorado Central +
26755 = NAD27 Colorado South +
26756 = NAD27 Connecticut +
26757 = NAD27 Delaware +
26758 = NAD27 Florida East +
26759 = NAD27 Florida West +
26760 = NAD27 Florida North +
26761 = NAD27 Hawaii zone 1 +
26762 = NAD27 Hawaii zone 2 +
26763 = NAD27 Hawaii zone 3 +
26764 = NAD27 Hawaii zone 4 +
26765 = NAD27 Hawaii zone 5 +
26766 = NAD27 Georgia East +
26767 = NAD27 Georgia West +
26768 = NAD27 Idaho East +
26769 = NAD27 Idaho Central +
26770 = NAD27 Idaho West +
26771 = NAD27 Illinois East +
26772 = NAD27 Illinois West +
26773 = NAD27 Indiana East +
26774 = NAD27 Indiana West +
26775 = NAD27 Iowa North +
26776 = NAD27 Iowa South +
26777 = NAD27 Kansas North +
26778 = NAD27 Kansas South +
26779 = NAD27 Kentucky North +
26780 = NAD27 Kentucky South +
26781 = NAD27 Louisiana North +
26782 = NAD27 Louisiana South +
26783 = NAD27 Maine East +
26784 = NAD27 Maine West +
26785 = NAD27 Maryland +
26786 = NAD27 Massachusetts +
26787 = NAD27 Massachusetts Is +
26788 = NAD27 Michigan North +
26789 = NAD27 Michigan Central +
26790 = NAD27 Michigan South +
26791 = NAD27 Minnesota North +
26792 = NAD27 Minnesota Cent +
26793 = NAD27 Minnesota South +
26794 = NAD27 Mississippi East +
26795 = NAD27 Mississippi West +
26796 = NAD27 Missouri East +
26797 = NAD27 Missouri Central +
26798 = NAD27 Missouri West +
26801 = NAD Michigan Michigan East +
26802 = NAD Michigan Michigan Old Central +
26803 = NAD Michigan Michigan West +
26903 = NAD83 UTM zone 3N +
26904 = NAD83 UTM zone 4N +
26905 = NAD83 UTM zone 5N +
26906 = NAD83 UTM zone 6N +
26907 = NAD83 UTM zone 7N +
26908 = NAD83 UTM zone 8N +
26909 = NAD83 UTM zone 9N +
26910 = NAD83 UTM zone 10N +
26911 = NAD83 UTM zone 11N +
26912 = NAD83 UTM zone 12N +
26913 = NAD83 UTM zone 13N +
26914 = NAD83 UTM zone 14N +
26915 = NAD83 UTM zone 15N +
26916 = NAD83 UTM zone 16N +
26917 = NAD83 UTM zone 17N +
26918 = NAD83 UTM zone 18N +
26919 = NAD83 UTM zone 19N +
26920 = NAD83 UTM zone 20N +
26921 = NAD83 UTM zone 21N +
26922 = NAD83 UTM zone 22N +
26923 = NAD83 UTM zone 23N +
26929 = NAD83 Alabama East +
26930 = NAD83 Alabama West +
26931 = NAD83 Alaska zone 1 +
26932 = NAD83 Alaska zone 2 +
26933 = NAD83 Alaska zone 3 +
26934 = NAD83 Alaska zone 4 +
26935 = NAD83 Alaska zone 5 +
26936 = NAD83 Alaska zone 6 +
26937 = NAD83 Alaska zone 7 +
26938 = NAD83 Alaska zone 8 +
26939 = NAD83 Alaska zone 9 +
26940 = NAD83 Alaska zone 10 +
26941 = NAD83 California 1 +
26942 = NAD83 California 2 +
26943 = NAD83 California 3 +
26944 = NAD83 California 4 +
26945 = NAD83 California 5 +
26946 = NAD83 California 6 +
26948 = NAD83 Arizona East +
26949 = NAD83 Arizona Central +
26950 = NAD83 Arizona West +
26951 = NAD83 Arkansas North +
26952 = NAD83 Arkansas South +
26953 = NAD83 Colorado North +
26954 = NAD83 Colorado Central +
26955 = NAD83 Colorado South +
26956 = NAD83 Connecticut +
26957 = NAD83 Delaware +
26958 = NAD83 Florida East +
26959 = NAD83 Florida West +
26960 = NAD83 Florida North +
26961 = NAD83 Hawaii zone 1 +
26962 = NAD83 Hawaii zone 2 +
26963 = NAD83 Hawaii zone 3 +
26964 = NAD83 Hawaii zone 4 +
26965 = NAD83 Hawaii zone 5 +
26966 = NAD83 Georgia East +
26967 = NAD83 Georgia West +
26968 = NAD83 Idaho East +
26969 = NAD83 Idaho Central +
26970 = NAD83 Idaho West +
26971 = NAD83 Illinois East +
26972 = NAD83 Illinois West +
26973 = NAD83 Indiana East +
26974 = NAD83 Indiana West +
26975 = NAD83 Iowa North +
26976 = NAD83 Iowa South +
26977 = NAD83 Kansas North +
26978 = NAD83 Kansas South +
26979 = NAD83 Kentucky North +
26980 = NAD83 Kentucky South +
26981 = NAD83 Louisiana North +
26982 = NAD83 Louisiana South +
26983 = NAD83 Maine East +
26984 = NAD83 Maine West +
26985 = NAD83 Maryland +
26986 = NAD83 Massachusetts +
26987 = NAD83 Massachusetts Is +
26988 = NAD83 Michigan North +
26989 = NAD83 Michigan Central +
26990 = NAD83 Michigan South +
26991 = NAD83 Minnesota North +
26992 = NAD83 Minnesota Cent +
26993 = NAD83 Minnesota South +
26994 = NAD83 Mississippi East +
26995 = NAD83 Mississippi West +
26996 = NAD83 Missouri East +
26997 = NAD83 Missouri Central +
26998 = NAD83 Missouri West +
27038 = Nahrwan 1967 UTM 38N +
27039 = Nahrwan 1967 UTM 39N +
27040 = Nahrwan 1967 UTM 40N +
27120 = Naparima UTM 20N +
27200 = GD49 NZ Map Grid +
27291 = GD49 North Island Grid +
27292 = GD49 South Island Grid +
27429 = Datum 73 UTM zone 29N +
27500 = ATF Nord de Guerre +
27581 = NTF France I +
27582 = NTF France II +
27583 = NTF France III +
27591 = NTF Nord France +
27592 = NTF Centre France +
27593 = NTF Sud France +
27700 = British National Grid +
28232 = Point Noire UTM 32S +
28348 = GDA94 MGA zone 48 +
28349 = GDA94 MGA zone 49 +
28350 = GDA94 MGA zone 50 +
28351 = GDA94 MGA zone 51 +
28352 = GDA94 MGA zone 52 +
28353 = GDA94 MGA zone 53 +
28354 = GDA94 MGA zone 54 +
28355 = GDA94 MGA zone 55 +
28356 = GDA94 MGA zone 56 +
28357 = GDA94 MGA zone 57 +
28358 = GDA94 MGA zone 58 +
28404 = Pulkovo Gauss zone 4 +
28405 = Pulkovo Gauss zone 5 +
28406 = Pulkovo Gauss zone 6 +
28407 = Pulkovo Gauss zone 7 +
28408 = Pulkovo Gauss zone 8 +
28409 = Pulkovo Gauss zone 9 +
28410 = Pulkovo Gauss zone 10 +
28411 = Pulkovo Gauss zone 11 +
28412 = Pulkovo Gauss zone 12 +
28413 = Pulkovo Gauss zone 13 +
28414 = Pulkovo Gauss zone 14 +
28415 = Pulkovo Gauss zone 15 +
28416 = Pulkovo Gauss zone 16 +
28417 = Pulkovo Gauss zone 17 +
28418 = Pulkovo Gauss zone 18 +
28419 = Pulkovo Gauss zone 19 +
28420 = Pulkovo Gauss zone 20 +
28421 = Pulkovo Gauss zone 21 +
28422 = Pulkovo Gauss zone 22 +
28423 = Pulkovo Gauss zone 23 +
28424 = Pulkovo Gauss zone 24 +
28425 = Pulkovo Gauss zone 25 +
28426 = Pulkovo Gauss zone 26 +
28427 = Pulkovo Gauss zone 27 +
28428 = Pulkovo Gauss zone 28 +
28429 = Pulkovo Gauss zone 29 +
28430 = Pulkovo Gauss zone 30 +
28431 = Pulkovo Gauss zone 31 +
28432 = Pulkovo Gauss zone 32 +
28464 = Pulkovo Gauss 4N +
28465 = Pulkovo Gauss 5N +
28466 = Pulkovo Gauss 6N +
28467 = Pulkovo Gauss 7N +
28468 = Pulkovo Gauss 8N +
28469 = Pulkovo Gauss 9N +
28470 = Pulkovo Gauss 10N +
28471 = Pulkovo Gauss 11N +
28472 = Pulkovo Gauss 12N +
28473 = Pulkovo Gauss 13N +
28474 = Pulkovo Gauss 14N +
28475 = Pulkovo Gauss 15N +
28476 = Pulkovo Gauss 16N +
28477 = Pulkovo Gauss 17N +
28478 = Pulkovo Gauss 18N +
28479 = Pulkovo Gauss 19N +
28480 = Pulkovo Gauss 20N +
28481 = Pulkovo Gauss 21N +
28482 = Pulkovo Gauss 22N +
28483 = Pulkovo Gauss 23N +
28484 = Pulkovo Gauss 24N +
28485 = Pulkovo Gauss 25N +
28486 = Pulkovo Gauss 26N +
28487 = Pulkovo Gauss 27N +
28488 = Pulkovo Gauss 28N +
28489 = Pulkovo Gauss 29N +
28490 = Pulkovo Gauss 30N +
28491 = Pulkovo Gauss 31N +
28492 = Pulkovo Gauss 32N +
28600 = Qatar National Grid +
28991 = RD Netherlands Old +
28992 = RD Netherlands New +
29118 = SAD69 UTM zone 18N +
29119 = SAD69 UTM zone 19N +
29120 = SAD69 UTM zone 20N +
29121 = SAD69 UTM zone 21N +
29122 = SAD69 UTM zone 22N +
29177 = SAD69 UTM zone 17S +
29178 = SAD69 UTM zone 18S +
29179 = SAD69 UTM zone 19S +
29180 = SAD69 UTM zone 20S +
29181 = SAD69 UTM zone 21S +
29182 = SAD69 UTM zone 22S +
29183 = SAD69 UTM zone 23S +
29184 = SAD69 UTM zone 24S +
29185 = SAD69 UTM zone 25S +
29220 = Sapper Hill UTM 20S +
29221 = Sapper Hill UTM 21S +
29333 = Schwarzeck UTM 33S +
29635 = Sudan UTM zone 35N +
29636 = Sudan UTM zone 36N +
29700 = Tananarive Laborde +
29738 = Tananarive UTM 38S +
29739 = Tananarive UTM 39S +
29800 = Timbalai 1948 Borneo +
29849 = Timbalai 1948 UTM 49N +
29850 = Timbalai 1948 UTM 50N +
29900 = TM65 Irish Nat Grid +
30200 = Trinidad 1903 Trinidad +
30339 = TC 1948 UTM zone 39N +
30340 = TC 1948 UTM zone 40N +
30491 = Voirol N Algerie ancien +
30492 = Voirol S Algerie ancien +
30591 = Voirol Unifie N Algerie +
30592 = Voirol Unifie S Algerie +
30600 = Bern 1938 Swiss New +
30729 = Nord Sahara UTM 29N +
30730 = Nord Sahara UTM 30N +
30731 = Nord Sahara UTM 31N +
30732 = Nord Sahara UTM 32N +
31028 = Yoff UTM zone 28N +
31121 = Zanderij UTM zone 21N +
31291 = MGI Austria West +
31292 = MGI Austria Central +
31293 = MGI Austria East +
31300 = Belge Lambert 72 +
31491 = DHDN Germany zone 1 +
31492 = DHDN Germany zone 2 +
31493 = DHDN Germany zone 3 +
31494 = DHDN Germany zone 4 +
31495 = DHDN Germany zone 5 +
31700 = Dealul Piscului 1970 Stereo 70 +
32001 = NAD27 Montana North +
32002 = NAD27 Montana Central +
32003 = NAD27 Montana South +
32005 = NAD27 Nebraska North +
32006 = NAD27 Nebraska South +
32007 = NAD27 Nevada East +
32008 = NAD27 Nevada Central +
32009 = NAD27 Nevada West +
32010 = NAD27 New Hampshire +
32011 = NAD27 New Jersey +
32012 = NAD27 New Mexico East +
32013 = NAD27 New Mexico Cent +
32014 = NAD27 New Mexico West +
32015 = NAD27 New York East +
32016 = NAD27 New York Central +
32017 = NAD27 New York West +
32018 = NAD27 New York Long Is +
32019 = NAD27 North Carolina +
32020 = NAD27 North Dakota N +
32021 = NAD27 North Dakota S +
32022 = NAD27 Ohio North +
32023 = NAD27 Ohio South +
32024 = NAD27 Oklahoma North +
32025 = NAD27 Oklahoma South +
32026 = NAD27 Oregon North +
32027 = NAD27 Oregon South +
32028 = NAD27 Pennsylvania N +
32029 = NAD27 Pennsylvania S +
32030 = NAD27 Rhode Island +
32031 = NAD27 South Carolina N +
32033 = NAD27 South Carolina S +
32034 = NAD27 South Dakota N +
32035 = NAD27 South Dakota S +
32036 = NAD27 Tennessee +
32037 = NAD27 Texas North +
32038 = NAD27 Texas North Cen +
32039 = NAD27 Texas Central +
32040 = NAD27 Texas South Cen +
32041 = NAD27 Texas South +
32042 = NAD27 Utah North +
32043 = NAD27 Utah Central +
32044 = NAD27 Utah South +
32045 = NAD27 Vermont +
32046 = NAD27 Virginia North +
32047 = NAD27 Virginia South +
32048 = NAD27 Washington North +
32049 = NAD27 Washington South +
32050 = NAD27 West Virginia N +
32051 = NAD27 West Virginia S +
32052 = NAD27 Wisconsin North +
32053 = NAD27 Wisconsin Cen +
32054 = NAD27 Wisconsin South +
32055 = NAD27 Wyoming East +
32056 = NAD27 Wyoming E Cen +
32057 = NAD27 Wyoming W Cen +
32058 = NAD27 Wyoming West +
32059 = NAD27 Puerto Rico +
32060 = NAD27 St Croix +
32100 = NAD83 Montana +
32104 = NAD83 Nebraska +
32107 = NAD83 Nevada East +
32108 = NAD83 Nevada Central +
32109 = NAD83 Nevada West +
32110 = NAD83 New Hampshire +
32111 = NAD83 New Jersey +
32112 = NAD83 New Mexico East +
32113 = NAD83 New Mexico Cent +
32114 = NAD83 New Mexico West +
32115 = NAD83 New York East +
32116 = NAD83 New York Central +
32117 = NAD83 New York West +
32118 = NAD83 New York Long Is +
32119 = NAD83 North Carolina +
32120 = NAD83 North Dakota N +
32121 = NAD83 North Dakota S +
32122 = NAD83 Ohio North +
32123 = NAD83 Ohio South +
32124 = NAD83 Oklahoma North +
32125 = NAD83 Oklahoma South +
32126 = NAD83 Oregon North +
32127 = NAD83 Oregon South +
32128 = NAD83 Pennsylvania N +
32129 = NAD83 Pennsylvania S +
32130 = NAD83 Rhode Island +
32133 = NAD83 South Carolina +
32134 = NAD83 South Dakota N +
32135 = NAD83 South Dakota S +
32136 = NAD83 Tennessee +
32137 = NAD83 Texas North +
32138 = NAD83 Texas North Cen +
32139 = NAD83 Texas Central +
32140 = NAD83 Texas South Cen +
32141 = NAD83 Texas South +
32142 = NAD83 Utah North +
32143 = NAD83 Utah Central +
32144 = NAD83 Utah South +
32145 = NAD83 Vermont +
32146 = NAD83 Virginia North +
32147 = NAD83 Virginia South +
32148 = NAD83 Washington North +
32149 = NAD83 Washington South +
32150 = NAD83 West Virginia N +
32151 = NAD83 West Virginia S +
32152 = NAD83 Wisconsin North +
32153 = NAD83 Wisconsin Cen +
32154 = NAD83 Wisconsin South +
32155 = NAD83 Wyoming East +
32156 = NAD83 Wyoming E Cen +
32157 = NAD83 Wyoming W Cen +
32158 = NAD83 Wyoming West +
32161 = NAD83 Puerto Rico Virgin Is +
32201 = WGS72 UTM zone 1N +
32202 = WGS72 UTM zone 2N +
32203 = WGS72 UTM zone 3N +
32204 = WGS72 UTM zone 4N +
32205 = WGS72 UTM zone 5N +
32206 = WGS72 UTM zone 6N +
32207 = WGS72 UTM zone 7N +
32208 = WGS72 UTM zone 8N +
32209 = WGS72 UTM zone 9N +
32210 = WGS72 UTM zone 10N +
32211 = WGS72 UTM zone 11N +
32212 = WGS72 UTM zone 12N +
32213 = WGS72 UTM zone 13N +
32214 = WGS72 UTM zone 14N +
32215 = WGS72 UTM zone 15N +
32216 = WGS72 UTM zone 16N +
32217 = WGS72 UTM zone 17N +
32218 = WGS72 UTM zone 18N +
32219 = WGS72 UTM zone 19N +
32220 = WGS72 UTM zone 20N +
32221 = WGS72 UTM zone 21N +
32222 = WGS72 UTM zone 22N +
32223 = WGS72 UTM zone 23N +
32224 = WGS72 UTM zone 24N +
32225 = WGS72 UTM zone 25N +
32226 = WGS72 UTM zone 26N +
32227 = WGS72 UTM zone 27N +
32228 = WGS72 UTM zone 28N +
32229 = WGS72 UTM zone 29N +
32230 = WGS72 UTM zone 30N +
32231 = WGS72 UTM zone 31N +
32232 = WGS72 UTM zone 32N +
32233 = WGS72 UTM zone 33N +
32234 = WGS72 UTM zone 34N +
32235 = WGS72 UTM zone 35N +
32236 = WGS72 UTM zone 36N +
32237 = WGS72 UTM zone 37N +
32238 = WGS72 UTM zone 38N +
32239 = WGS72 UTM zone 39N +
32240 = WGS72 UTM zone 40N +
32241 = WGS72 UTM zone 41N +
32242 = WGS72 UTM zone 42N +
32243 = WGS72 UTM zone 43N +
32244 = WGS72 UTM zone 44N +
32245 = WGS72 UTM zone 45N +
32246 = WGS72 UTM zone 46N +
32247 = WGS72 UTM zone 47N +
32248 = WGS72 UTM zone 48N +
32249 = WGS72 UTM zone 49N +
32250 = WGS72 UTM zone 50N +
32251 = WGS72 UTM zone 51N +
32252 = WGS72 UTM zone 52N +
32253 = WGS72 UTM zone 53N +
32254 = WGS72 UTM zone 54N +
32255 = WGS72 UTM zone 55N +
32256 = WGS72 UTM zone 56N +
32257 = WGS72 UTM zone 57N +
32258 = WGS72 UTM zone 58N +
32259 = WGS72 UTM zone 59N +
32260 = WGS72 UTM zone 60N +
32301 = WGS72 UTM zone 1S +
32302 = WGS72 UTM zone 2S +
32303 = WGS72 UTM zone 3S +
32304 = WGS72 UTM zone 4S +
32305 = WGS72 UTM zone 5S +
32306 = WGS72 UTM zone 6S +
32307 = WGS72 UTM zone 7S +
32308 = WGS72 UTM zone 8S +
32309 = WGS72 UTM zone 9S +
32310 = WGS72 UTM zone 10S +
32311 = WGS72 UTM zone 11S +
32312 = WGS72 UTM zone 12S +
32313 = WGS72 UTM zone 13S +
32314 = WGS72 UTM zone 14S +
32315 = WGS72 UTM zone 15S +
32316 = WGS72 UTM zone 16S +
32317 = WGS72 UTM zone 17S +
32318 = WGS72 UTM zone 18S +
32319 = WGS72 UTM zone 19S +
32320 = WGS72 UTM zone 20S +
32321 = WGS72 UTM zone 21S +
32322 = WGS72 UTM zone 22S +
32323 = WGS72 UTM zone 23S +
32324 = WGS72 UTM zone 24S +
32325 = WGS72 UTM zone 25S +
32326 = WGS72 UTM zone 26S +
32327 = WGS72 UTM zone 27S +
32328 = WGS72 UTM zone 28S +
32329 = WGS72 UTM zone 29S +
32330 = WGS72 UTM zone 30S +
32331 = WGS72 UTM zone 31S +
32332 = WGS72 UTM zone 32S +
32333 = WGS72 UTM zone 33S +
32334 = WGS72 UTM zone 34S +
32335 = WGS72 UTM zone 35S +
32336 = WGS72 UTM zone 36S +
32337 = WGS72 UTM zone 37S +
32338 = WGS72 UTM zone 38S +
32339 = WGS72 UTM zone 39S +
32340 = WGS72 UTM zone 40S +
32341 = WGS72 UTM zone 41S +
32342 = WGS72 UTM zone 42S +
32343 = WGS72 UTM zone 43S +
32344 = WGS72 UTM zone 44S +
32345 = WGS72 UTM zone 45S +
32346 = WGS72 UTM zone 46S +
32347 = WGS72 UTM zone 47S +
32348 = WGS72 UTM zone 48S +
32349 = WGS72 UTM zone 49S +
32350 = WGS72 UTM zone 50S +
32351 = WGS72 UTM zone 51S +
32352 = WGS72 UTM zone 52S +
32353 = WGS72 UTM zone 53S +
32354 = WGS72 UTM zone 54S +
32355 = WGS72 UTM zone 55S +
32356 = WGS72 UTM zone 56S +
32357 = WGS72 UTM zone 57S +
32358 = WGS72 UTM zone 58S +
32359 = WGS72 UTM zone 59S +
32360 = WGS72 UTM zone 60S +
32401 = WGS72BE UTM zone 1N +
32402 = WGS72BE UTM zone 2N +
32403 = WGS72BE UTM zone 3N +
32404 = WGS72BE UTM zone 4N +
32405 = WGS72BE UTM zone 5N +
32406 = WGS72BE UTM zone 6N +
32407 = WGS72BE UTM zone 7N +
32408 = WGS72BE UTM zone 8N +
32409 = WGS72BE UTM zone 9N +
32410 = WGS72BE UTM zone 10N +
32411 = WGS72BE UTM zone 11N +
32412 = WGS72BE UTM zone 12N +
32413 = WGS72BE UTM zone 13N +
32414 = WGS72BE UTM zone 14N +
32415 = WGS72BE UTM zone 15N +
32416 = WGS72BE UTM zone 16N +
32417 = WGS72BE UTM zone 17N +
32418 = WGS72BE UTM zone 18N +
32419 = WGS72BE UTM zone 19N +
32420 = WGS72BE UTM zone 20N +
32421 = WGS72BE UTM zone 21N +
32422 = WGS72BE UTM zone 22N +
32423 = WGS72BE UTM zone 23N +
32424 = WGS72BE UTM zone 24N +
32425 = WGS72BE UTM zone 25N +
32426 = WGS72BE UTM zone 26N +
32427 = WGS72BE UTM zone 27N +
32428 = WGS72BE UTM zone 28N +
32429 = WGS72BE UTM zone 29N +
32430 = WGS72BE UTM zone 30N +
32431 = WGS72BE UTM zone 31N +
32432 = WGS72BE UTM zone 32N +
32433 = WGS72BE UTM zone 33N +
32434 = WGS72BE UTM zone 34N +
32435 = WGS72BE UTM zone 35N +
32436 = WGS72BE UTM zone 36N +
32437 = WGS72BE UTM zone 37N +
32438 = WGS72BE UTM zone 38N +
32439 = WGS72BE UTM zone 39N +
32440 = WGS72BE UTM zone 40N +
32441 = WGS72BE UTM zone 41N +
32442 = WGS72BE UTM zone 42N +
32443 = WGS72BE UTM zone 43N +
32444 = WGS72BE UTM zone 44N +
32445 = WGS72BE UTM zone 45N +
32446 = WGS72BE UTM zone 46N +
32447 = WGS72BE UTM zone 47N +
32448 = WGS72BE UTM zone 48N +
32449 = WGS72BE UTM zone 49N +
32450 = WGS72BE UTM zone 50N +
32451 = WGS72BE UTM zone 51N +
32452 = WGS72BE UTM zone 52N +
32453 = WGS72BE UTM zone 53N +
32454 = WGS72BE UTM zone 54N +
32455 = WGS72BE UTM zone 55N +
32456 = WGS72BE UTM zone 56N +
32457 = WGS72BE UTM zone 57N +
32458 = WGS72BE UTM zone 58N +
32459 = WGS72BE UTM zone 59N +
32460 = WGS72BE UTM zone 60N +
32501 = WGS72BE UTM zone 1S +
32502 = WGS72BE UTM zone 2S +
32503 = WGS72BE UTM zone 3S +
32504 = WGS72BE UTM zone 4S +
32505 = WGS72BE UTM zone 5S +
32506 = WGS72BE UTM zone 6S +
32507 = WGS72BE UTM zone 7S +
32508 = WGS72BE UTM zone 8S +
32509 = WGS72BE UTM zone 9S +
32510 = WGS72BE UTM zone 10S +
32511 = WGS72BE UTM zone 11S +
32512 = WGS72BE UTM zone 12S +
32513 = WGS72BE UTM zone 13S +
32514 = WGS72BE UTM zone 14S +
32515 = WGS72BE UTM zone 15S +
32516 = WGS72BE UTM zone 16S +
32517 = WGS72BE UTM zone 17S +
32518 = WGS72BE UTM zone 18S +
32519 = WGS72BE UTM zone 19S +
32520 = WGS72BE UTM zone 20S +
32521 = WGS72BE UTM zone 21S +
32522 = WGS72BE UTM zone 22S +
32523 = WGS72BE UTM zone 23S +
32524 = WGS72BE UTM zone 24S +
32525 = WGS72BE UTM zone 25S +
32526 = WGS72BE UTM zone 26S +
32527 = WGS72BE UTM zone 27S +
32528 = WGS72BE UTM zone 28S +
32529 = WGS72BE UTM zone 29S +
32530 = WGS72BE UTM zone 30S +
32531 = WGS72BE UTM zone 31S +
32532 = WGS72BE UTM zone 32S +
32533 = WGS72BE UTM zone 33S +
32534 = WGS72BE UTM zone 34S +
32535 = WGS72BE UTM zone 35S +
32536 = WGS72BE UTM zone 36S +
32537 = WGS72BE UTM zone 37S +
32538 = WGS72BE UTM zone 38S +
32539 = WGS72BE UTM zone 39S +
32540 = WGS72BE UTM zone 40S +
32541 = WGS72BE UTM zone 41S +
32542 = WGS72BE UTM zone 42S +
32543 = WGS72BE UTM zone 43S +
32544 = WGS72BE UTM zone 44S +
32545 = WGS72BE UTM zone 45S +
32546 = WGS72BE UTM zone 46S +
32547 = WGS72BE UTM zone 47S +
32548 = WGS72BE UTM zone 48S +
32549 = WGS72BE UTM zone 49S +
32550 = WGS72BE UTM zone 50S +
32551 = WGS72BE UTM zone 51S +
32552 = WGS72BE UTM zone 52S +
32553 = WGS72BE UTM zone 53S +
32554 = WGS72BE UTM zone 54S +
32555 = WGS72BE UTM zone 55S +
32556 = WGS72BE UTM zone 56S +
32557 = WGS72BE UTM zone 57S +
32558 = WGS72BE UTM zone 58S +
32559 = WGS72BE UTM zone 59S +
32560 = WGS72BE UTM zone 60S +
32601 = WGS84 UTM zone 1N +
32602 = WGS84 UTM zone 2N +
32603 = WGS84 UTM zone 3N +
32604 = WGS84 UTM zone 4N +
32605 = WGS84 UTM zone 5N +
32606 = WGS84 UTM zone 6N +
32607 = WGS84 UTM zone 7N +
32608 = WGS84 UTM zone 8N +
32609 = WGS84 UTM zone 9N +
32610 = WGS84 UTM zone 10N +
32611 = WGS84 UTM zone 11N +
32612 = WGS84 UTM zone 12N +
32613 = WGS84 UTM zone 13N +
32614 = WGS84 UTM zone 14N +
32615 = WGS84 UTM zone 15N +
32616 = WGS84 UTM zone 16N +
32617 = WGS84 UTM zone 17N +
32618 = WGS84 UTM zone 18N +
32619 = WGS84 UTM zone 19N +
32620 = WGS84 UTM zone 20N +
32621 = WGS84 UTM zone 21N +
32622 = WGS84 UTM zone 22N +
32623 = WGS84 UTM zone 23N +
32624 = WGS84 UTM zone 24N +
32625 = WGS84 UTM zone 25N +
32626 = WGS84 UTM zone 26N +
32627 = WGS84 UTM zone 27N +
32628 = WGS84 UTM zone 28N +
32629 = WGS84 UTM zone 29N +
32630 = WGS84 UTM zone 30N +
32631 = WGS84 UTM zone 31N +
32632 = WGS84 UTM zone 32N +
32633 = WGS84 UTM zone 33N +
32634 = WGS84 UTM zone 34N +
32635 = WGS84 UTM zone 35N +
32636 = WGS84 UTM zone 36N +
32637 = WGS84 UTM zone 37N +
32638 = WGS84 UTM zone 38N +
32639 = WGS84 UTM zone 39N +
32640 = WGS84 UTM zone 40N +
32641 = WGS84 UTM zone 41N +
32642 = WGS84 UTM zone 42N +
32643 = WGS84 UTM zone 43N +
32644 = WGS84 UTM zone 44N +
32645 = WGS84 UTM zone 45N +
32646 = WGS84 UTM zone 46N +
32647 = WGS84 UTM zone 47N +
32648 = WGS84 UTM zone 48N +
32649 = WGS84 UTM zone 49N +
32650 = WGS84 UTM zone 50N +
32651 = WGS84 UTM zone 51N +
32652 = WGS84 UTM zone 52N +
32653 = WGS84 UTM zone 53N +
32654 = WGS84 UTM zone 54N +
32655 = WGS84 UTM zone 55N +
32656 = WGS84 UTM zone 56N +
32657 = WGS84 UTM zone 57N +
32658 = WGS84 UTM zone 58N +
32659 = WGS84 UTM zone 59N +
32660 = WGS84 UTM zone 60N +
32701 = WGS84 UTM zone 1S +
32702 = WGS84 UTM zone 2S +
32703 = WGS84 UTM zone 3S +
32704 = WGS84 UTM zone 4S +
32705 = WGS84 UTM zone 5S +
32706 = WGS84 UTM zone 6S +
32707 = WGS84 UTM zone 7S +
32708 = WGS84 UTM zone 8S +
32709 = WGS84 UTM zone 9S +
32710 = WGS84 UTM zone 10S +
32711 = WGS84 UTM zone 11S +
32712 = WGS84 UTM zone 12S +
32713 = WGS84 UTM zone 13S +
32714 = WGS84 UTM zone 14S +
32715 = WGS84 UTM zone 15S +
32716 = WGS84 UTM zone 16S +
32717 = WGS84 UTM zone 17S +
32718 = WGS84 UTM zone 18S +
32719 = WGS84 UTM zone 19S +
32720 = WGS84 UTM zone 20S +
32721 = WGS84 UTM zone 21S +
32722 = WGS84 UTM zone 22S +
32723 = WGS84 UTM zone 23S +
32724 = WGS84 UTM zone 24S +
32725 = WGS84 UTM zone 25S +
32726 = WGS84 UTM zone 26S +
32727 = WGS84 UTM zone 27S +
32728 = WGS84 UTM zone 28S +
32729 = WGS84 UTM zone 29S +
32730 = WGS84 UTM zone 30S +
32731 = WGS84 UTM zone 31S +
32732 = WGS84 UTM zone 32S +
32733 = WGS84 UTM zone 33S +
32734 = WGS84 UTM zone 34S +
32735 = WGS84 UTM zone 35S +
32736 = WGS84 UTM zone 36S +
32737 = WGS84 UTM zone 37S +
32738 = WGS84 UTM zone 38S +
32739 = WGS84 UTM zone 39S +
32740 = WGS84 UTM zone 40S +
32741 = WGS84 UTM zone 41S +
32742 = WGS84 UTM zone 42S +
32743 = WGS84 UTM zone 43S +
32744 = WGS84 UTM zone 44S +
32745 = WGS84 UTM zone 45S +
32746 = WGS84 UTM zone 46S +
32747 = WGS84 UTM zone 47S +
32748 = WGS84 UTM zone 48S +
32749 = WGS84 UTM zone 49S +
32750 = WGS84 UTM zone 50S +
32751 = WGS84 UTM zone 51S +
32752 = WGS84 UTM zone 52S +
32753 = WGS84 UTM zone 53S +
32754 = WGS84 UTM zone 54S +
32755 = WGS84 UTM zone 55S +
32756 = WGS84 UTM zone 56S +
32757 = WGS84 UTM zone 57S +
32758 = WGS84 UTM zone 58S +
32759 = WGS84 UTM zone 59S +
32760 = WGS84 UTM zone 60S +
32767 = User Defined
+
0x0c01PCSCitationno 
0x0c02Projectionno +
10101 = Alabama CS27 East +
10102 = Alabama CS27 West +
10131 = Alabama CS83 East +
10132 = Alabama CS83 West +
10201 = Arizona Coordinate System east +
10202 = Arizona Coordinate System Central +
10203 = Arizona Coordinate System west +
10231 = Arizona CS83 east +
10232 = Arizona CS83 Central +
10233 = Arizona CS83 west +
10301 = Arkansas CS27 North +
10302 = Arkansas CS27 South +
10331 = Arkansas CS83 North +
10332 = Arkansas CS83 South +
10401 = California CS27 I +
10402 = California CS27 II +
10403 = California CS27 III +
10404 = California CS27 IV +
10405 = California CS27 V +
10406 = California CS27 VI +
10407 = California CS27 VII +
10431 = California CS83 1 +
10432 = California CS83 2 +
10433 = California CS83 3 +
10434 = California CS83 4 +
10435 = California CS83 5 +
10436 = California CS83 6 +
10501 = Colorado CS27 North +
10502 = Colorado CS27 Central +
10503 = Colorado CS27 South +
10531 = Colorado CS83 North +
10532 = Colorado CS83 Central +
10533 = Colorado CS83 South +
10600 = Connecticut CS27 +
10630 = Connecticut CS83 +
10700 = Delaware CS27 +
10730 = Delaware CS83 +
10901 = Florida CS27 East +
10902 = Florida CS27 West +
10903 = Florida CS27 North +
10931 = Florida CS83 East +
10932 = Florida CS83 West +
10933 = Florida CS83 North +
11001 = Georgia CS27 East +
11002 = Georgia CS27 West +
11031 = Georgia CS83 East +
11032 = Georgia CS83 West +
11101 = Idaho CS27 East +
11102 = Idaho CS27 Central +
11103 = Idaho CS27 West +
11131 = Idaho CS83 East +
11132 = Idaho CS83 Central +
11133 = Idaho CS83 West +
11201 = Illinois CS27 East +
11202 = Illinois CS27 West +
11231 = Illinois CS83 East +
11232 = Illinois CS83 West +
11301 = Indiana CS27 East +
11302 = Indiana CS27 West +
11331 = Indiana CS83 East +
11332 = Indiana CS83 West +
11401 = Iowa CS27 North +
11402 = Iowa CS27 South +
11431 = Iowa CS83 North +
11432 = Iowa CS83 South +
11501 = Kansas CS27 North +
11502 = Kansas CS27 South +
11531 = Kansas CS83 North +
11532 = Kansas CS83 South +
11601 = Kentucky CS27 North +
11602 = Kentucky CS27 South +
11631 = Kentucky CS83 North +
11632 = Kentucky CS83 South +
11701 = Louisiana CS27 North +
11702 = Louisiana CS27 South +
11731 = Louisiana CS83 North +
11732 = Louisiana CS83 South +
11801 = Maine CS27 East +
11802 = Maine CS27 West +
11831 = Maine CS83 East +
11832 = Maine CS83 West +
11900 = Maryland CS27 +
11930 = Maryland CS83 +
12001 = Massachusetts CS27 Mainland +
12002 = Massachusetts CS27 Island +
12031 = Massachusetts CS83 Mainland +
12032 = Massachusetts CS83 Island +
12101 = Michigan State Plane East +
12102 = Michigan State Plane Old Central +
12103 = Michigan State Plane West +
12111 = Michigan CS27 North +
12112 = Michigan CS27 Central +
12113 = Michigan CS27 South +
12141 = Michigan CS83 North +
12142 = Michigan CS83 Central +
12143 = Michigan CS83 South +
12201 = Minnesota CS27 North +
12202 = Minnesota CS27 Central +
12203 = Minnesota CS27 South +
12231 = Minnesota CS83 North +
12232 = Minnesota CS83 Central +
12233 = Minnesota CS83 South +
12301 = Mississippi CS27 East +
12302 = Mississippi CS27 West +
12331 = Mississippi CS83 East +
12332 = Mississippi CS83 West +
12401 = Missouri CS27 East +
12402 = Missouri CS27 Central +
12403 = Missouri CS27 West +
12431 = Missouri CS83 East +
12432 = Missouri CS83 Central +
12433 = Missouri CS83 West +
12501 = Montana CS27 North +
12502 = Montana CS27 Central +
12503 = Montana CS27 South +
12530 = Montana CS83 +
12601 = Nebraska CS27 North +
12602 = Nebraska CS27 South +
12630 = Nebraska CS83 +
12701 = Nevada CS27 East +
12702 = Nevada CS27 Central +
12703 = Nevada CS27 West +
12731 = Nevada CS83 East +
12732 = Nevada CS83 Central +
12733 = Nevada CS83 West +
12800 = New Hampshire CS27 +
12830 = New Hampshire CS83 +
12900 = New Jersey CS27 +
12930 = New Jersey CS83 +
13001 = New Mexico CS27 East +
13002 = New Mexico CS27 Central +
13003 = New Mexico CS27 West +
13031 = New Mexico CS83 East +
13032 = New Mexico CS83 Central +
13033 = New Mexico CS83 West +
13101 = New York CS27 East +
13102 = New York CS27 Central +
13103 = New York CS27 West +
13104 = New York CS27 Long Island +
13131 = New York CS83 East +
13132 = New York CS83 Central +
13133 = New York CS83 West +
13134 = New York CS83 Long Island +
13200 = North Carolina CS27 +
13230 = North Carolina CS83 +
13301 = North Dakota CS27 North +
13302 = North Dakota CS27 South +
13331 = North Dakota CS83 North +
13332 = North Dakota CS83 South +
13401 = Ohio CS27 North +
13402 = Ohio CS27 South +
13431 = Ohio CS83 North +
13432 = Ohio CS83 South +
13501 = Oklahoma CS27 North +
13502 = Oklahoma CS27 South +
13531 = Oklahoma CS83 North +
13532 = Oklahoma CS83 South +
13601 = Oregon CS27 North +
13602 = Oregon CS27 South +
13631 = Oregon CS83 North +
13632 = Oregon CS83 South +
13701 = Pennsylvania CS27 North +
13702 = Pennsylvania CS27 South +
13731 = Pennsylvania CS83 North +
13732 = Pennsylvania CS83 South +
13800 = Rhode Island CS27 +
13830 = Rhode Island CS83 +
13901 = South Carolina CS27 North +
13902 = South Carolina CS27 South +
13930 = South Carolina CS83 +
14001 = South Dakota CS27 North +
14002 = South Dakota CS27 South +
14031 = South Dakota CS83 North +
14032 = South Dakota CS83 South +
14100 = Tennessee CS27 +
14130 = Tennessee CS83 +
14201 = Texas CS27 North +
14202 = Texas CS27 North Central +
14203 = Texas CS27 Central +
14204 = Texas CS27 South Central +
14205 = Texas CS27 South +
14231 = Texas CS83 North +
14232 = Texas CS83 North Central +
14233 = Texas CS83 Central +
14234 = Texas CS83 South Central +
14235 = Texas CS83 South +
14301 = Utah CS27 North +
14302 = Utah CS27 Central +
14303 = Utah CS27 South +
14331 = Utah CS83 North +
14332 = Utah CS83 Central +
14333 = Utah CS83 South +
14400 = Vermont CS27 +
14430 = Vermont CS83 +
14501 = Virginia CS27 North +
14502 = Virginia CS27 South +
14531 = Virginia CS83 North +
14532 = Virginia CS83 South +
14601 = Washington CS27 North +
14602 = Washington CS27 South +
14631 = Washington CS83 North +
14632 = Washington CS83 South +
14701 = West Virginia CS27 North +
14702 = West Virginia CS27 South +
14731 = West Virginia CS83 North +
14732 = West Virginia CS83 South +
14801 = Wisconsin CS27 North +
14802 = Wisconsin CS27 Central +
14803 = Wisconsin CS27 South +
14831 = Wisconsin CS83 North +
14832 = Wisconsin CS83 Central +
14833 = Wisconsin CS83 South +
14901 = Wyoming CS27 East +
14902 = Wyoming CS27 East Central +
14903 = Wyoming CS27 West Central +
14904 = Wyoming CS27 West +
14931 = Wyoming CS83 East +
14932 = Wyoming CS83 East Central +
14933 = Wyoming CS83 West Central +
14934 = Wyoming CS83 West +
15001 = Alaska CS27 1 +
15002 = Alaska CS27 2 +
15003 = Alaska CS27 3 +
15004 = Alaska CS27 4 +
15005 = Alaska CS27 5 +
15006 = Alaska CS27 6 +
15007 = Alaska CS27 7 +
15008 = Alaska CS27 8 +
15009 = Alaska CS27 9 +
15010 = Alaska CS27 10 +
15031 = Alaska CS83 1 +
15032 = Alaska CS83 2 +
15033 = Alaska CS83 3 +
15034 = Alaska CS83 4 +
15035 = Alaska CS83 5 +
15036 = Alaska CS83 6 +
15037 = Alaska CS83 7 +
15038 = Alaska CS83 8 +
15039 = Alaska CS83 9 +
15040 = Alaska CS83 10 +
15101 = Hawaii CS27 1 +
15102 = Hawaii CS27 2 +
15103 = Hawaii CS27 3 +
15104 = Hawaii CS27 4 +
15105 = Hawaii CS27 5 +
15131 = Hawaii CS83 1 +
15132 = Hawaii CS83 2 +
15133 = Hawaii CS83 3 +
15134 = Hawaii CS83 4 +
15135 = Hawaii CS83 5 +
15201 = Puerto Rico CS27 +
15202 = St Croix +
15230 = Puerto Rico Virgin Is +
15302 = Kentucky CS27 +
15303 = Kentucky CS83 North +
15914 = BLM 14N feet +
15915 = BLM 15N feet +
15916 = BLM 16N feet +
15917 = BLM 17N feet +
16001 = UTM zone 1N +
16002 = UTM zone 2N +
16003 = UTM zone 3N +
16004 = UTM zone 4N +
16005 = UTM zone 5N +
16006 = UTM zone 6N +
16007 = UTM zone 7N +
16008 = UTM zone 8N +
16009 = UTM zone 9N +
16010 = UTM zone 10N +
16011 = UTM zone 11N +
16012 = UTM zone 12N +
16013 = UTM zone 13N +
16014 = UTM zone 14N +
16015 = UTM zone 15N +
16016 = UTM zone 16N +
16017 = UTM zone 17N +
16018 = UTM zone 18N +
16019 = UTM zone 19N +
16020 = UTM zone 20N +
16021 = UTM zone 21N +
16022 = UTM zone 22N +
16023 = UTM zone 23N +
16024 = UTM zone 24N +
16025 = UTM zone 25N +
16026 = UTM zone 26N +
16027 = UTM zone 27N +
16028 = UTM zone 28N +
16029 = UTM zone 29N +
16030 = UTM zone 30N +
16031 = UTM zone 31N +
16032 = UTM zone 32N +
16033 = UTM zone 33N +
16034 = UTM zone 34N +
16035 = UTM zone 35N +
16036 = UTM zone 36N +
16037 = UTM zone 37N +
16038 = UTM zone 38N +
16039 = UTM zone 39N +
16040 = UTM zone 40N +
16041 = UTM zone 41N +
16042 = UTM zone 42N +
16043 = UTM zone 43N +
16044 = UTM zone 44N +
16045 = UTM zone 45N +
16046 = UTM zone 46N +
16047 = UTM zone 47N +
16048 = UTM zone 48N +
16049 = UTM zone 49N +
16050 = UTM zone 50N +
16051 = UTM zone 51N +
16052 = UTM zone 52N +
16053 = UTM zone 53N +
16054 = UTM zone 54N +
16055 = UTM zone 55N +
16056 = UTM zone 56N +
16057 = UTM zone 57N +
16058 = UTM zone 58N +
16059 = UTM zone 59N +
16060 = UTM zone 60N +
16101 = UTM zone 1S +
16102 = UTM zone 2S +
16103 = UTM zone 3S +
16104 = UTM zone 4S +
16105 = UTM zone 5S +
16106 = UTM zone 6S +
16107 = UTM zone 7S +
16108 = UTM zone 8S +
16109 = UTM zone 9S +
16110 = UTM zone 10S +
16111 = UTM zone 11S +
16112 = UTM zone 12S +
16113 = UTM zone 13S +
16114 = UTM zone 14S +
16115 = UTM zone 15S +
16116 = UTM zone 16S +
16117 = UTM zone 17S +
16118 = UTM zone 18S +
16119 = UTM zone 19S +
16120 = UTM zone 20S +
16121 = UTM zone 21S +
16122 = UTM zone 22S +
16123 = UTM zone 23S +
16124 = UTM zone 24S +
16125 = UTM zone 25S +
16126 = UTM zone 26S +
16127 = UTM zone 27S +
16128 = UTM zone 28S +
16129 = UTM zone 29S +
16130 = UTM zone 30S +
16131 = UTM zone 31S +
16132 = UTM zone 32S +
16133 = UTM zone 33S +
16134 = UTM zone 34S +
16135 = UTM zone 35S +
16136 = UTM zone 36S +
16137 = UTM zone 37S +
16138 = UTM zone 38S +
16139 = UTM zone 39S +
16140 = UTM zone 40S +
16141 = UTM zone 41S +
16142 = UTM zone 42S +
16143 = UTM zone 43S +
16144 = UTM zone 44S +
16145 = UTM zone 45S +
16146 = UTM zone 46S +
16147 = UTM zone 47S +
16148 = UTM zone 48S +
16149 = UTM zone 49S +
16150 = UTM zone 50S +
16151 = UTM zone 51S +
16152 = UTM zone 52S +
16153 = UTM zone 53S +
16154 = UTM zone 54S +
16155 = UTM zone 55S +
16156 = UTM zone 56S +
16157 = UTM zone 57S +
16158 = UTM zone 58S +
16159 = UTM zone 59S +
16160 = UTM zone 60S +
16200 = Gauss Kruger zone 0 +
16201 = Gauss Kruger zone 1 +
16202 = Gauss Kruger zone 2 +
16203 = Gauss Kruger zone 3 +
16204 = Gauss Kruger zone 4 +
16205 = Gauss Kruger zone 5 +
17348 = Map Grid of Australia 48 +
17349 = Map Grid of Australia 49 +
17350 = Map Grid of Australia 50 +
17351 = Map Grid of Australia 51 +
17352 = Map Grid of Australia 52 +
17353 = Map Grid of Australia 53 +
17354 = Map Grid of Australia 54 +
17355 = Map Grid of Australia 55 +
17356 = Map Grid of Australia 56 +
17357 = Map Grid of Australia 57 +
17358 = Map Grid of Australia 58 +
17448 = Australian Map Grid 48 +
17449 = Australian Map Grid 49 +
17450 = Australian Map Grid 50 +
17451 = Australian Map Grid 51 +
17452 = Australian Map Grid 52 +
17453 = Australian Map Grid 53 +
17454 = Australian Map Grid 54 +
17455 = Australian Map Grid 55 +
17456 = Australian Map Grid 56 +
17457 = Australian Map Grid 57 +
17458 = Australian Map Grid 58 +
18031 = Argentina 1 +
18032 = Argentina 2 +
18033 = Argentina 3 +
18034 = Argentina 4 +
18035 = Argentina 5 +
18036 = Argentina 6 +
18037 = Argentina 7 +
18051 = Colombia 3W +
18052 = Colombia Bogota +
18053 = Colombia 3E +
18054 = Colombia 6E +
18072 = Egypt Red Belt +
18073 = Egypt Purple Belt +
18074 = Extended Purple Belt +
18141 = New Zealand North Island Nat Grid +
18142 = New Zealand South Island Nat Grid +
19900 = Bahrain Grid +
19905 = Netherlands E Indies Equatorial +
19912 = RSO Borneo +
19926 = Stereo 70 +
32767 = User Defined
+
0x0c03ProjCoordTransno +
1 = Transverse Mercator +
2 = Transverse Mercator Modified Alaska +
3 = Oblique Mercator +
4 = Oblique Mercator Laborde +
5 = Oblique Mercator Rosenmund +
6 = Oblique Mercator Spherical +
7 = Mercator +
8 = Lambert Conf Conic 2SP +
9 = Lambert Conf Conic 1SP +
10 = Lambert Azim Equal Area +
11 = Albers Equal Area +
12 = Azimuthal Equidistant +
13 = Equidistant Conic +
14 = Stereographic +
15 = Polar Stereographic +
16 = Oblique Stereographic +
17 = Equirectangular +
18 = Cassini Soldner +
19 = Gnomonic +
20 = Miller Cylindrical +
21 = Orthographic +
22 = Polyconic +
23 = Robinson +
24 = Sinusoidal +
25 = VanDerGrinten +
26 = New Zealand Map Grid +
27 = Transverse Mercator South Orientated +
28 = Cylindrical Equal Area +
32767 = User Defined
+
0x0c04ProjLinearUnitsno--> GeoTiff Units Values
0x0c05ProjLinearUnitSizeno 
0x0c06ProjStdParallel1no 
0x0c07ProjStdParallel2no 
0x0c08ProjNatOriginLongno 
0x0c09ProjNatOriginLatno 
0x0c0aProjFalseEastingno 
0x0c0bProjFalseNorthingno 
0x0c0cProjFalseOriginLongno 
0x0c0dProjFalseOriginLatno 
0x0c0eProjFalseOriginEastingno 
0x0c0fProjFalseOriginNorthingno 
0x0c10ProjCenterLongno 
0x0c11ProjCenterLatno 
0x0c12ProjCenterEastingno 
0x0c13ProjCenterNorthingno 
0x0c14ProjScaleAtNatOriginno 
0x0c15ProjScaleAtCenterno 
0x0c16ProjAzimuthAngleno 
0x0c17ProjStraightVertPoleLongno 
0x0c18ProjRectifiedGridAngleno 
0x1000VerticalCSTypeno--> GeoTiff VerticalCS Values
0x1001VerticalCitationno 
0x1002VerticalDatumno--> GeoTiff VerticalCS Values
0x1003VerticalUnitsno--> GeoTiff Units Values
0xb799ChartFormatno +
47500 = General +
47501 = Coastal +
47502 = Harbor +
47503 = SailingInternational +
47504 = SmallCraft Route +
47505 = SmallCraftArea +
47506 = SmallCraftFolio +
47507 = Topographic +
47508 = Recreation +
47509 = Index +
47510 = Inset
+
0xb79aChartSourceno 
0xb79bChartSourceEditionno 
0xb79cChartSourceDateno 
0xb79dChartCorrDateno 
0xb79eChartCountryOriginno 
0xb79fChartRasterEditionno 
0xb7a0ChartSoundingDatumno +
47600 = Equatorial Spring Low Water +
47601 = Indian Spring Low Water +
47602 = Lowest Astronomical Tide +
47603 = Lowest Low Water +
47604 = Lowest Normal Low Water +
47605 = Mean Higher High Water +
47606 = Mean High Water +
47607 = Mean High Water Springs +
47608 = Mean Lower Low Water +
47609 = Mean Lower Low Water Springs +
47610 = Mean Low Water +
47611 = Mean Sea Level +
47612 = Tropic Higher High Water +
47613 = Tropic Lower Low Water
+
0xb7a1ChartDepthUnitsno--> GeoTiff Units Values
0xb7a2ChartMagVarno 
0xb7a3ChartMagVarYearno 
0xb7a4ChartMagVarAnnChangeno 
0xb7a5ChartWGSNSShiftno 
0xb7a7InsetNWPixelXno 
0xb7a8InsetNWPixelYno 
0xb7a9ChartContourIntervalno 
+ +

GeoTiff Units Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueUnitsValueUnits
9001= Linear Meter9013= Linear Yard Indian
9002= Linear Foot9014= Linear Fathom
9003= Linear Foot US Survey9015= Linear Mile International Nautical
9004= Linear Foot Modified American9101= Angular Radian
9005= Linear Foot Clarke9102= Angular Degree
9006= Linear Foot Indian9103= Angular Arc Minute
9007= Linear Link9104= Angular Arc Second
9008= Linear Link Benoit9105= Angular Grad
9009= Linear Link Sears9106= Angular Gon
9010= Linear Chain Benoit9107= Angular DMS
9011= Linear Chain Sears9108= Angular DMS Hemisphere
9012= Linear Yard Sears32767= User Defined
+ +

GeoTiff VerticalCS Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueVerticalCSValueVerticalCS
0= Undefined5021= INS ellipsoid
5001= Airy 1830 ellipsoid5022= International 1924 ellipsoid
5002= Airy Modified 1849 ellipsoid5023= International 1967 ellipsoid
5003= ANS ellipsoid5024= Krassowsky 1940 ellipsoid
5004= Bessel 1841 ellipsoid5025= NWL 9D ellipsoid
5005= Bessel Modified ellipsoid5026= NWL 10D ellipsoid
5006= Bessel Namibia ellipsoid5027= Plessis 1817 ellipsoid
5007= Clarke 1858 ellipsoid5028= Struve 1860 ellipsoid
5008= Clarke 1866 ellipsoid5029= War Office ellipsoid
5010= Clarke 1880 Benoit ellipsoid5030= WGS 84 ellipsoid
5011= Clarke 1880 IGN ellipsoid5031= GEM 10C ellipsoid
5012= Clarke 1880 RGS ellipsoid5032= OSU86F ellipsoid
5013= Clarke 1880 Arc ellipsoid5033= OSU91A ellipsoid
5014= Clarke 1880 SGA 1922 ellipsoid5101= Newlyn
5015= Everest 1830 1937 Adjustment ellipsoid5102= North American Vertical Datum 1929
5016= Everest 1830 1967 Definition ellipsoid5103= North American Vertical Datum 1988
5017= Everest 1830 1975 Definition ellipsoid5104= Yellow Sea 1956
5018= Everest 1830 Modified ellipsoid5105= Baltic Sea
5019= GRS 1980 ellipsoid5106= Caspian Sea
5020= Helmert 1906 ellipsoid32767= User Defined
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Aug 10, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/GoPro.html b/html/TagNames/GoPro.html new file mode 100644 index 0000000..b944c70 --- /dev/null +++ b/html/TagNames/GoPro.html @@ -0,0 +1,589 @@ + + + + +GoPro Tags + + + +

GoPro GPMF Tags

+

Tags extracted from the GPMF box of GoPro MP4 videos, the APP6 "GoPro" +segment of JPEG files, and from the "gpmd" timed metadata if the +ExtractEmbedded (-ee) option is enabled. Many more tags exist, but are +currently unknown and extracted only with the Unknown (-u) option. Please +let me know if you discover the meaning of any of these unknown tags. See +https://github.com/gopro/gpmf-parser for details about this format.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ACCL'Accelerometerno(accelerator readings in m/s2)
'ALLD'AutoLowLightDurationno 
'ATTD'Attitudeno 
'ATTR'AttitudeTargetno 
'AUDO'AudioSettingno 
'BPOS'Controller?no 
'CASN'CameraSerialNumberno 
'CSEN'CoyoteSenseno 
'CYTS'CoyoteStatusno 
'DEVC'DeviceContainer---> GoPro GPMF Tags
'DVID'DeviceID?no 
'DVNM'DeviceNameno 
'DZOM'DigitalZoomno'N' = No +
'Y' = Yes
'EISA'ElectronicImageStabilizationno 
'EMPT'Empty?no 
'ESCS'EscapeStatus?no 
'EXPT'MaximumShutterAngleno 
'FACE'FaceDetectedno 
'FCNM'FaceNumbersno 
'FMWR'FirmwareVersionno 
'FWVS'OtherFirmwareno 
'GLPI'GPSPos---> GoPro GLPI Tags
'GPRI'GPSRaw?---> GoPro GPRI Tags
'GPS5'GPSInfo---> GoPro GPS5 Tags
'GPSF'GPSMeasureModeno2 = 2-Dimensional Measurement +
3 = 3-Dimensional Measurement
'GPSP'GPSHPositioningErrorno 
'GPSU'GPSDateTimeno 
'GYRO'Gyroscopeno(gyroscope readings in rad/s)
'ISOE'ISOSpeedsno 
'ISOG'ImageSensorGainno 
'KBAT'BatteryStatus---> GoPro KBAT Tags
'LNED'LocalPositionNEDno 
'MAGN'Magnetometerno 
'MINF'Modelno 
'MTRX'AccelerometerMatrixno 
'MUID'MediaUniqueIDno 
'OREN'AutoRotationno'A' = Auto +
'D' = Down +
'U' = Up
'ORIN'InputOrientationno 
'ORIO'OutputOrientationno 
'PHDR'HDRSettingno 
'PIMN'AutoISOMinno 
'PIMX'AutoISOMaxno 
'PRES'PhotoResolutionno 
'PRTN'ProTuneno'N' = Off +
'Y' = On
'PTCL'ColorModeno 
'PTEV'ExposureCompensationno 
'PTSH'Sharpnessno 
'PTWB'WhiteBalanceno 
'RATE'Rateno 
'RMRK'Commentsno 
'SCAL'ScaleFactor?no 
'SCPR'ScaledPressureno 
'SHUT'ExposureTimesno 
'SIMU'ScaledIMUno 
'SIUN'SIUnits?no 
'SROT'SensorReadoutTimeno 
'STMP'TimeStampno 
'STNM'StreamName?no 
'STRM'NestedSignalStream---> GoPro GPMF Tags
'SYST'SystemTimeno 
'TMPC'CameraTemperatureno 
'TSMP'TotalSamples?no 
'TYPE'StructureType?no 
'UNIF'InputUniformityno 
'UNIT'Units?no 
'VERS'MetadataVersionno 
'VFOV'FieldOfViewno'L' = Linear +
'S' = Super View +
'W' = Wide
'VFRH'VisualFlightRulesHUDno 
'WBAL'ColorTemperaturesno 
'WRGB'WhiteBalanceRGBno 
+ +

GoPro GLPI Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0GPSDateTimeno 
1GPSLatitudeno 
2GPSLongitudeno 
3GPSAltitudeno 
5GPSSpeedXno 
6GPSSpeedYno 
7GPSSpeedZno 
8GPSTrackno 
+ +

GoPro GPRI Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0GPSDateTimeRawno 
1GPSLatitudeRawno 
2GPSLongitudeRawno 
3GPSAltitudeRawno 
6GPSSpeedRawno 
7GPSTrackRawno 
+ +

GoPro GPS5 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0GPSLatitudeno 
1GPSLongitudeno 
2GPSAltitudeno 
3GPSSpeedno 
4GPSSpeed3Dno 
+ +

GoPro KBAT Tags

+

Battery status information found in GoPro Karma videos.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0BatteryCurrentno 
1BatteryCapacityno 
3BatteryTemperatureno 
4BatteryVoltage1no 
5BatteryVoltage2no 
6BatteryVoltage3no 
7BatteryVoltage4no 
8BatteryTimeno 
14BatteryLevelno 
+ +

GoPro fdsc Tags

+

Tags extracted from the MP4 "fdsc" timed metadata when the ExtractEmbedded +(-ee) option is used.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
8FirmwareVersionno 
23SerialNumberno 
87OtherSerialNumberno 
102Modelno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Sep 22, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/H264.html b/html/TagNames/H264.html new file mode 100644 index 0000000..03567c7 --- /dev/null +++ b/html/TagNames/H264.html @@ -0,0 +1,399 @@ + + + + +H264 Tags + + + +

H264 Tags

+

Tags extracted from H.264 video streams. The metadata for AVCHD videos is +stored in this stream.

+
+
+ + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
ImageHeightno 
ImageWidthno 
MDPM---> H264 MDPM Tags
+ +

H264 MDPM Tags

+

The following tags are decoded from the Modified Digital Video Pack Metadata +(MDPM) of the unregistered user data with UUID +17ee8c60f84d11d98cd60800200c9a66 in the H.264 Supplemental Enhancement +Information (SEI). [Yes, this description is confusing, but nothing +compared to the challenge of actually decoding the data!] This information +may exist at regular intervals through the entire video, but only the first +occurrence is extracted unless the ExtractEmbedded (-ee) option is used (in +which case subsequent occurrences are extracted as sub-documents).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0013TimeCodeno(hours:minutes:seconds:frames)
0x0018DateTimeOriginalno(combined with tag 0x19)
0x0070Camera1---> H264 Camera1 Tags
0x0071Camera2---> H264 Camera2 Tags
0x007fShutter---> H264 Shutter Tags
0x00a0ExposureTimeno 
0x00a1FNumberno 
0x00a2ExposureProgramno +
0 = Not Defined +
1 = Manual +
2 = Program AE +
3 = Aperture-priority AE +
4 = Shutter speed priority AE +
5 = Creative (Slow speed) +
6 = Action (High speed) +
7 = Portrait +
8 = Landscape
+
0x00a3BrightnessValueno 
0x00a4ExposureCompensationno 
0x00a5MaxApertureValueno 
0x00a6Flashno--> EXIF Flash Values
0x00a7CustomRenderedno0 = Normal +
1 = Custom
0x00a8WhiteBalanceno0 = Auto +
1 = Manual
0x00a9FocalLengthIn35mmFormatno 
0x00aaSceneCaptureTypeno0 = Standard +
1 = Landscape +
2 = Portrait +
3 = Night
0x00b0GPSVersionIDno 
0x00b1GPSLatitudeRefno'N' = North +
'S' = South
0x00b2GPSLatitudeno(combined with tags 0xb3 and 0xb4)
0x00b5GPSLongitudeRefno'E' = East +
'W' = West
0x00b6GPSLongitudeno(combined with tags 0xb7 and 0xb8)
0x00b9GPSAltitudeRefno0 = Above Sea Level +
1 = Below Sea Level
0x00baGPSAltitudeno 
0x00bbGPSTimeStampno(combined with tags 0xbc and 0xbd)
0x00beGPSStatusno'A' = Measurement Active +
'V' = Measurement Void
0x00bfGPSMeasureModeno2 = 2-Dimensional Measurement +
3 = 3-Dimensional Measurement
0x00c0GPSDOPno 
0x00c1GPSSpeedRefno'K' = km/h +
'M' = mph +
'N' = knots
0x00c2GPSSpeedno 
0x00c3GPSTrackRefno'M' = Magnetic North +
'T' = True North
0x00c4GPSTrackno 
0x00c5GPSImgDirectionRefno'M' = Magnetic North +
'T' = True North
0x00c6GPSImgDirectionno 
0x00c7GPSMapDatumno(combined with tag 0xc8)
0x00caGPSDateStampno(combined with tags 0xcb and 0xcc)
0x00e0MakeModel---> H264 MakeModel Tags
0x00e1RecInfo---> H264 RecInfo Tags +
(Canon only)
0x00e4Modelno(Sony only, combined with tags 0xe5 and 0xe6)
0x00eeFrameInfo---> H264 FrameInfo Tags +
(Canon only)
+ +

H264 Camera1 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ApertureSettingno0xfe = Closed +
0xff = Auto
1Gainno[val & 0xf]
1.1ExposureProgramno[val >> 4 & 0xf] +
0 = Program AE +
1 = Gain +
2 = Shutter speed priority AE +
3 = Aperture-priority AE +
4 = Manual
2.1WhiteBalanceno[val >> 5 & 0x7] +
0 = Auto +
1 = Hold +
2 = 1-Push +
3 = Daylight
3Focusno 
+ +

H264 Camera2 Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
1ImageStabilizationno0x0 = Off +
0x3f = On (0x3f) +
0xbf = Off (0xbf) +
0xff = n/a
+ +

H264 Shutter Tags

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
1.1ExposureTimeno[val & 0x7fff]
+ +

H264 MakeModel Tags

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
0Makeno0x103 = Panasonic +
0x108 = Sony +
0x1011 = Canon +
0x1104 = JVC
+ +

H264 RecInfo Tags

+

Recording information stored by some Canon video cameras.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0RecordingModeno2 = XP+ +
4 = SP +
5 = LP +
6 = FXP +
7 = MXP
+ +

H264 FrameInfo Tags

+

Frame rate information stored by some Canon video cameras.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0CaptureFrameRateno 
1VideoFrameRateno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Feb 3, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/HP.html b/html/TagNames/HP.html new file mode 100644 index 0000000..2e14d74 --- /dev/null +++ b/html/TagNames/HP.html @@ -0,0 +1,156 @@ + + + + +HP Tags + + + +

HP Tags

+

These tables list tags found in the maker notes of some Hewlett-Packard +camera models.

+ +

The first table lists tags found in the EXIF-format maker notes of the +PhotoSmart 720 (also used by the Vivitar ViviCam 3705, 3705B and 3715).

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0e00PrintIM---> PrintIM Tags
+ +

HP Type2 Tags

+

These tags are used by the PhotoSmart E427.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Lens Shading'LensShadingno 
'PreviewImage'PreviewImageno 
'Serial Number'SerialNumberno 
+ +

HP Type4 Tags

+

These tags are used by the PhotoSmart M627.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
12MaxApertureno 
16ExposureTimeno 
20CameraDateTimeno 
52ISOno 
92SerialNumberno 
+ +

HP Type6 Tags

+

These tags are used by the PhotoSmart M425, M525 and M527.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
12FNumberno 
16ExposureTimeno 
20CameraDateTimeno 
52ISOno 
88SerialNumberno 
+ +

HP TDHD Tags

+

These tags are extracted from the APP6 "TDHD" segment of Photosmart R837 +JPEG images. Many other unknown tags exist in is data, and can be seen with +the Unknown (-u) option.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'CMSN'SerialNumberno 
'FWRV'FirmwareVersionno 
'LSLV'LSLV---> HP TDHD Tags
'TDHD'TDHD---> HP TDHD Tags
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised May 31, 2010 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/HTML.html b/html/TagNames/HTML.html new file mode 100644 index 0000000..310e4ef --- /dev/null +++ b/html/TagNames/HTML.html @@ -0,0 +1,667 @@ + + + + +HTML Tags + + + +

HTML Tags

+

Meta information extracted from the header of HTML and XHTML files. This is +a mix of information found in the META elements, XML element, and the +TITLE element.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'abstract'Abstractno 
'author'Authorno 
'classification'Classificationno 
'content-language'ContentLanguageno 
'copyright'Copyrightno 
'dc'DC---> HTML dc Tags
'description'Descriptionno 
'distribution'Distributionno 
'doc-class'DocClassno 
'doc-rights'DocRightsno 
'doc-type'DocTypeno 
'formatter'Formatterno 
'generator'Generatorno 
'generatorversion'GeneratorVersionno 
'googlebot'GoogleBotno 
'http-equiv'HTTP-equiv---> HTML equiv Tags
'keywords'Keywordsno+ 
'mssmarttagspreventparsing'NoMSSmartTagsno 
'ncc'NCC---> HTML ncc Tags
'o'Office---> HTML Office Tags
'originator'Originatorno 
'owner'Ownerno 
'prod'Prod---> HTML prod Tags
'progid'ProgIDno 
'rating'Ratingno 
'refresh'Refreshno 
'resource-type'ResourceTypeno 
'revisit-after'RevisitAfterno 
'robots'Robotsno+ 
'title'Titleno(the only extracted tag which isn't from an HTML META element)
'vw96'VW96---> HTML vw96 Tags
+ +

HTML dc Tags

+

Dublin Core schema tags (also used in XMP).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'contributor'Contributorno+ 
'coverage'Coverageno 
'creator'Creatorno+ 
'date'Dateno+ 
'description'Descriptionno 
'format'Formatno 
'identifier'Identifierno 
'language'Languageno+ 
'publisher'Publisherno+ 
'relation'Relationno+ 
'rights'Rightsno 
'source'Sourceno 
'subject'Subjectno+ 
'title'Titleno 
'type'Typeno+ 
+ +

HTML equiv Tags

+

These tags have a family 1 group name of "HTTP-equiv".

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'cache-control'CacheControlno 
'content-disposition'ContentDispositionno 
'content-language'ContentLanguageno 
'content-script-type'ContentScriptTypeno 
'content-style-type'ContentStyleTypeno 
'content-type'ContentTypeno 
'default-style'DefaultStyleno 
'expires'Expiresno 
'ext-cache'ExtCacheno 
'imagetoolbar'ImageToolbarno 
'lotus'Lotusno 
'page-enter'PageEnterno 
'page-exit'PageExitno 
'pics-label'PicsLabelno 
'pragma'Pragmano 
'refresh'Refreshno 
'reply-to'ReplyTono 
'set-cookie'SetCookieno 
'site-enter'SiteEnterno 
'site-exit'SiteExitno 
'vary'Varyno 
'window-target'WindowTargetno 
+ +

HTML ncc Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'charset'CharacterSetno 
'depth'Depthno 
'files'Filesno 
'footnotes'Footnotesno 
'generator'Generatorno 
'kbytesize'KByteSizeno 
'maxpagenormal'MaxPageNormalno 
'multimediatype'MultimediaTypeno 
'narrator'Narratorno 
'pagefront'PageFrontno 
'pagenormal'PageNormalno 
'pagespecial'PageSpecialno 
'prodnotes'ProdNotesno 
'produceddate'ProducedDateno 
'producer'Producerno 
'revision'Revisionno 
'revisiondate'RevisionDateno 
'setinfo'SetInfono 
'sidebars'Sidebarsno 
'sourcedate'SourceDateno 
'sourceedition'SourceEditionno 
'sourcepublisher'SourcePublisherno 
'sourcerights'SourceRightsno 
'sourcetitle'SourceTitleno 
'tocitems'TOCItemsno 
'totaltime'Durationno 
+ +

HTML Office Tags

+

Tags written by Microsoft Office applications.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Author'Authorno 
'Category'Categoryno 
'Characters'Charactersno 
'CharactersWithSpaces'CharactersWithSpacesno 
'Company'Companyno 
'Created'CreateDateno 
'Description'Descriptionno 
'Keywords'Keywordsno 
'LastAuthor'LastAuthorno 
'LastPrinted'LastPrintedno 
'LastSaved'ModifyDateno 
'Lines'Linesno 
'Manager'Managerno 
'Pages'Pagesno 
'Paragraphs'Paragraphsno 
'Revision'RevisionNumberno 
'Subject'Subjectno 
'Template'Templateno 
'TotalTime'TotalEditTimeno 
'Version'RevisionNumberno 
'Words'Wordsno 
+ +

HTML prod Tags

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'recengineer'RecEngineerno 
'reclocation'RecLocationno 
+ +

HTML vw96 Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'objecttype'ObjectTypeno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 30, 2012 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/ICC_Profile.html b/html/TagNames/ICC_Profile.html new file mode 100644 index 0000000..6204540 --- /dev/null +++ b/html/TagNames/ICC_Profile.html @@ -0,0 +1,1411 @@ + + + + +ICC_Profile Tags + + + +

ICC_Profile Tags

+

ICC profile information is used in many different file types including JPEG, +TIFF, PDF, PostScript, Photoshop, PNG, MIFF, PICT, QuickTime, XCF and some +RAW formats. While the tags listed below are not individually writable, the +entire profile itself can be accessed via the extra 'ICC_Profile' tag, but +this tag is neither extracted nor written unless specified explicitly. See +http://www.color.org/icc_specs2.xalter for the official ICC +specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'A2B0'AToB0no 
'A2B1'AToB1no 
'A2B2'AToB2no 
'A2B3'AToB3no 
'A2M0'AToM0no 
'B2A0'BToA0no 
'B2A1'BToA1no 
'B2A2'BToA2no 
'B2A3'BToA3no 
'B2D0'BToD0no 
'B2D1'BToD1no 
'B2D2'BToD2no 
'B2D3'BToD3no 
'CxF 'CXFno 
'D2B0'DToB0no 
'D2B1'DToB1no 
'D2B2'DToB2no 
'D2B3'DToB3no 
'Header'ProfileHeader---> ICC_Profile Header Tags
'M2A0'MToA0no 
'M2B0'MToB0no 
'M2B1'MToB1no 
'M2B2'MToB2no 
'M2B3'MToB3no 
'M2S0'MToS0no 
'M2S1'MToS1no 
'M2S2'MToS2no 
'M2S3'MToS3no 
'MS00'WCSProfilesno 
'bAB0'BRDFAToB0no 
'bAB1'BRDFAToB1no 
'bAB2'BRDFAToB2no 
'bAB3'BRDFAToB3no 
'bBA0'BRDFBToA0no 
'bBA1'BRDFBToA1no 
'bBA2'BRDFBToA2no 
'bBA3'BRDFBToA3no 
'bBD0'BRDFBToD0no 
'bBD1'BRDFBToD1no 
'bBD2'BRDFBToD2no 
'bBD3'BRDFBToD3no 
'bDB0'BRDFDToB0no 
'bDB1'BRDFDToB1no 
'bDB2'BRDFDToB2no 
'bDB3'BRDFDToB3no 
'bMB0'BRDFMToB0no 
'bMB1'BRDFMToB1no 
'bMB2'BRDFMToB2no 
'bMB3'BRDFMToB3no 
'bMS0'BRDFMToS0no 
'bMS1'BRDFMToS1no 
'bMS2'BRDFMToS2no 
'bMS3'BRDFMToS3no 
'bTRC'BlueTRCno 
'bXYZ'BlueMatrixColumnno 
'bcp0'BRDFColorimetricParam0no 
'bcp1'BRDFColorimetricParam1no 
'bcp2'BRDFColorimetricParam2no 
'bcp3'BRDFColorimetricParam3no 
'bfd 'UCRBGno 
'bkpt'MediaBlackPointno 
'bsp0'BRDFSpectralParam0no 
'bsp1'BRDFSpectralParam1no 
'bsp2'BRDFSpectralParam2no 
'bsp3'BRDFSpectralParam3no 
'c2sp'CustomToStandardPccno 
'calt'CalibrationDateTimeno 
'cept'ColorEncodingParamsno 
'chad'ChromaticAdaptationno 
'chrm'Chromaticity---> ICC_Profile Chromaticity Tags
'ciis'ColorimetricIntentImageStateno 
'clio'ColorantInfoOutno 
'cloo'ColorantOrderOutno 
'clot'ColorantTableOutno 
'clro'ColorantOrderno 
'clrt'ColorantTable---> ICC_Profile ColorantTable Tags
'cprt'ProfileCopyrightno 
'crdi'CRDInfono 
'csnm'ColorSpaceNameno 
'dAB0'DirectionalAToB0no 
'dAB1'DirectionalAToB1no 
'dAB2'DirectionalAToB2no 
'dAB3'DirectionalAToB3no 
'dBA0'DirectionalBToA0no 
'dBA1'DirectionalBToA1no 
'dBA2'DirectionalBToA2no 
'dBA3'DirectionalBToA3no 
'dBD0'DirectionalBToD0no 
'dBD1'DirectionalBToD1no 
'dBD2'DirectionalBToD2no 
'dBD3'DirectionalBToD3no 
'dDB0'DirectionalDToB0no 
'dDB1'DirectionalDToB1no 
'dDB2'DirectionalDToB2no 
'dDB3'DirectionalDToB3no 
'desc'ProfileDescriptionno 
'devs'DeviceSettingsno 
'dmdd'DeviceModelDescno 
'dmnd'DeviceMfgDescno 
'dscm'ProfileDescriptionMLno 
'fpce'FocalPlaneColorimetryEstimatesno 
'gTRC'GreenTRCno 
'gXYZ'GreenMatrixColumnno 
'gamt'Gamutno 
'gdb0'GamutBoundaryDescription0no 
'gdb1'GamutBoundaryDescription1no 
'gdb2'GamutBoundaryDescription2no 
'gdb3'GamutBoundaryDescription3no 
'kTRC'GrayTRCno 
'lumi'Luminanceno 
'mcta'MultiplexTypeArrayno 
'mdv 'MultiplexDefaultValuesno 
'meas'Measurement---> ICC_Profile Measurement Tags
'meta'Metadata---> ICC_Profile Metadata Tags
'miin'MeasurementInputInfono 
'minf'MeasurementInfono 
'mmod'MakeAndModelno 
'ncl2'NamedColor2no 
'ncol'NamedColorno 
'ndin'NativeDisplayInfono 
'nmcl'NamedColorno 
'pre0'Preview0no 
'pre1'Preview1no 
'pre2'Preview2no 
'ps2i'PS2RenderingIntentno 
'ps2s'PostScript2CSAno 
'psd0'PostScript2CRD0no 
'psd1'PostScript2CRD1no 
'psd2'PostScript2CRD2no 
'psd3'PostScript2CRD3no 
'pseq'ProfileSequenceDescno 
'psid'ProfileSequenceIdentifierno 
'psin'ProfileSequenceInfono 
'psvm'PS2CRDVMSizeno 
'rTRC'RedTRCno 
'rXYZ'RedMatrixColumnno 
'resp'OutputResponseno 
'rfnm'ReferenceNameno 
'rhoc'ReflectionHardcopyOrigColorimetryno 
'rig0'PerceptualRenderingIntentGamutno'prmg' = Perceptual Reference Medium Gamut
'rig2'SaturationRenderingIntentGamutno'prmg' = Perceptual Reference Medium Gamut
'rpoc'ReflectionPrintOutputColorimetryno 
's2cp'StandardToCustomPccno 
'sape'SceneAppearanceEstimatesno 
'scoe'SceneColorimetryEstimatesno 
'scrd'ScreeningDescno 
'scrn'Screeningno 
'smap'SurfaceMapno 
'svcn'SpectralViewingConditionsno 
'swpt'SpectralWhitePointno 
'targ'CharTargetno 
'tech'Technologyno +
'AMD ' = Active Matrix Display +
'CRT ' = Cathode Ray Tube Display +
'KPCD' = Photo CD +
'PMD ' = Passive Matrix Display +
'dcam' = Digital Camera +
'dcpj' = Digital Cinema Projector +
'dmpc' = Digital Motion Picture Camera +
'dsub' = Dye Sublimation Printer +
'epho' = Electrophotographic Printer +
'esta' = Electrostatic Printer +
'flex' = Flexography +
'fprn' = Film Writer +
'fscn' = Film Scanner +
'grav' = Gravure +
'ijet' = Ink Jet Printer +
'imgs' = Photo Image Setter +
'mpfr' = Motion Picture Film Recorder +
'mpfs' = Motion Picture Film Scanner +
'offs' = Offset Lithography +
'pjtv' = Projection Television +
'rpho' = Photographic Paper Printer +
'rscn' = Reflective Scanner +
'silk' = Silkscreen +
'twax' = Thermal Wax Printer +
'vidc' = Video Camera +
'vidm' = Video Monitor
+
'vcgt'VideoCardGammano 
'view'ViewingConditions---> ICC_Profile ViewingConditions Tags
'vued'ViewingCondDescno 
'wtpt'MediaWhitePointno 
+ +

ICC_Profile Header Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4ProfileCMMTypeno--> ICC_Profile ManuSig Values
8ProfileVersionno 
12ProfileClassno'abst' = Abstract Profile +
'cenc' = ColorEncodingSpace Profile +
'link' = DeviceLink Profile +
'mid ' = MultiplexIdentification Profile +
'mlnk' = MultiplexLink Profile +
'mntr' = Display Device Profile +
'mvis' = MultiplexVisualization Profile +
'nkpf' = Nikon Input Device Profile (NON-STANDARD!) +
'nmcl' = NamedColor Profile +
'prtr' = Output Device Profile +
'scnr' = Input Device Profile +
'spac' = ColorSpace Conversion Profile
16ColorSpaceDatano 
20ProfileConnectionSpaceno 
24ProfileDateTimeno 
36ProfileFileSignatureno 
40PrimaryPlatformno'APPL' = Apple Computer Inc. +
'MSFT' = Microsoft Corporation +
'SGI ' = Silicon Graphics Inc. +
'SUNW' = Sun Microsystems Inc. +
'TGNT' = Taligent Inc.
44CMMFlagsno 
48DeviceManufacturerno--> ICC_Profile ManuSig Values
52DeviceModelno 
56DeviceAttributesno 
64RenderingIntentno0 = Perceptual +
1 = Media-Relative Colorimetric +
2 = Saturation +
3 = ICC-Absolute Colorimetric
68ConnectionSpaceIlluminantno 
80ProfileCreatorno--> ICC_Profile ManuSig Values
84ProfileIDno 
+ +

ICC_Profile ManuSig Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueManuSig
''=
'4d2p'= Erdt Systems GmbH & Co KG
'AAMA'= Aamazing Technologies, Inc.
'ACER'= Acer Peripherals
'ACLT'= Acolyte Color Research
'ACTI'= Actix Systems, Inc.
'ADAR'= Adara Technology, Inc.
'ADBE'= Adobe Systems Inc.
'ADI '= ADI Systems, Inc.
'AGFA'= Agfa Graphics N.V.
'ALMD'= Alps Electric USA, Inc.
'ALPS'= Alps Electric USA, Inc.
'ALWN'= Alwan Color Expertise
'AMTI'= Amiable Technologies, Inc.
'AOC '= AOC International (U.S.A), Ltd.
'APAG'= Apago
'APPL'= Apple Computer Inc.
'AST '= AST
'AT&T'= AT&T Computer Systems
'BAEL'= BARBIERI electronic
'BRCO'= Barco NV
'BRKP'= Breakpoint Pty Limited
'BROT'= Brother Industries, LTD
'BULL'= Bull
'BUS '= Bus Computer Systems
'C-IT'= C-Itoh
'CAMR'= Intel Corporation
'CANO'= Canon, Inc. (Canon Development Americas, Inc.)
'CARR'= Carroll Touch
'CASI'= Casio Computer Co., Ltd.
'CBUS'= Colorbus PL
'CEL '= Crossfield
'CELx'= Crossfield
'CGS '= CGS Publishing Technologies International GmbH
'CHM '= Rochester Robotics
'CIGL'= Colour Imaging Group, London
'CITI'= Citizen
'CL00'= Candela, Ltd.
'CLIQ'= Color IQ
'CMCO'= Chromaco, Inc.
'CMiX'= CHROMiX
'COLO'= Colorgraphic Communications Corporation
'COMP'= COMPAQ Computer Corporation
'COMp'= Compeq USA/Focus Technology
'CONR'= Conrac Display Products
'CORD'= Cordata Technologies, Inc.
'CPQ '= Compaq Computer Corporation
'CPRO'= ColorPro
'CRN '= Cornerstone
'CTX '= CTX International, Inc.
'CVIS'= ColorVision
'CWC '= Fujitsu Laboratories, Ltd.
'DARI'= Darius Technology, Ltd.
'DATA'= Dataproducts
'DCP '= Dry Creek Photo
'DCRC'= Digital Contents Resource Center, Chung-Ang University
'DELL'= Dell Computer Corporation
'DIC '= Dainippon Ink and Chemicals
'DICO'= Diconix
'DIGI'= Digital
'DL&C'= Digital Light & Color
'DPLG'= Doppelganger, LLC
'DS '= Dainippon Screen
'DSOL'= DOOSOL
'DUPN'= DuPont
'EPSO'= Epson
'ESKO'= Esko-Graphics
'ETRI'= Electronics and Telecommunications Research Institute
'EVER'= Everex Systems, Inc.
'EXAC'= ExactCODE GmbH
'Eizo'= EIZO NANAO CORPORATION
'FALC'= Falco Data Products, Inc.
'FF '= Fuji Photo Film Co.,LTD
'FFEI'= FujiFilm Electronic Imaging, Ltd.
'FNRD'= fnord software
'FORA'= Fora, Inc.
'FORE'= Forefront Technology Corporation
'FP '= Fujitsu
'FPA '= WayTech Development, Inc.
'FUJI'= Fujitsu
'FX '= Fuji Xerox Co., Ltd.
'GCC '= GCC Technologies, Inc.
'GGSL'= Global Graphics Software Limited
'GMB '= Gretagmacbeth
'GMG '= GMG GmbH & Co. KG
'GOLD'= GoldStar Technology, Inc.
'GOOG'= Google
'GPRT'= Giantprint Pty Ltd
'GTMB'= Gretagmacbeth
'GVC '= WayTech Development, Inc.
'GW2K'= Sony Corporation
'HCI '= HCI
'HDM '= Heidelberger Druckmaschinen AG
'HERM'= Hermes
'HITA'= Hitachi America, Ltd.
'HP '= Hewlett-Packard
'HTC '= Hitachi, Ltd.
'HiTi'= HiTi Digital, Inc.
'IBM '= IBM Corporation
'IDNT'= Scitex Corporation, Ltd.
'IEC '= Hewlett-Packard
'IIYA'= Iiyama North America, Inc.
'IKEG'= Ikegami Electronics, Inc.
'IMAG'= Image Systems Corporation
'IMI '= Ingram Micro, Inc.
'INTC'= Intel Corporation
'INTL'= N/A (INTL)
'INTR'= Intra Electronics USA, Inc.
'IOCO'= Iocomm International Technology Corporation
'IPS '= InfoPrint Solutions Company
'IRIS'= Scitex Corporation, Ltd.
'ISL '= Ichikawa Soft Laboratory
'ITNL'= N/A (ITNL)
'IVM '= IVM
'IWAT'= Iwatsu Electric Co., Ltd.
'Idnt'= Scitex Corporation, Ltd.
'Inca'= Inca Digital Printers Ltd.
'Iris'= Scitex Corporation, Ltd.
'JPEG'= Joint Photographic Experts Group
'JSFT'= Jetsoft Development
'JVC '= JVC Information Products Co.
'KART'= Scitex Corporation, Ltd.
'KFC '= KFC Computek Components Corporation
'KLH '= KLH Computers
'KMHD'= Konica Minolta Holdings, Inc.
'KNCA'= Konica Corporation
'KODA'= Kodak
'KYOC'= Kyocera
'Kart'= Scitex Corporation, Ltd.
'LCAG'= Leica Camera AG
'LCCD'= Leeds Colour
'LDAK'= Left Dakota
'LEAD'= Leading Technology, Inc.
'LEXM'= Lexmark International, Inc.
'LINK'= Link Computer, Inc.
'LINO'= Linotronic
'LITE'= Lite-On, Inc.
'Leaf'= Leaf
'Lino'= Linotronic
'MAGC'= Mag Computronic (USA) Inc.
'MAGI'= MAG Innovision, Inc.
'MANN'= Mannesmann
'MICN'= Micron Technology, Inc.
'MICR'= Microtek
'MICV'= Microvitec, Inc.
'MINO'= Minolta
'MITS'= Mitsubishi Electronics America, Inc.
'MITs'= Mitsuba Corporation
'MNLT'= Minolta
'MODG'= Modgraph, Inc.
'MONI'= Monitronix, Inc.
'MONS'= Monaco Systems Inc.
'MORS'= Morse Technology, Inc.
'MOTI'= Motive Systems
'MSFT'= Microsoft Corporation
'MUTO'= MUTOH INDUSTRIES LTD.
'Mits'= Mitsubishi Electric Corporation Kyoto Works
'NANA'= NANAO USA Corporation
'NEC '= NEC Corporation
'NEXP'= NexPress Solutions LLC
'NISS'= Nissei Sangyo America, Ltd.
'NKON'= Nikon Corporation
'NONE'= none
'OCE '= Oce Technologies B.V.
'OCEC'= OceColor
'OKI '= Oki
'OKID'= Okidata
'OKIP'= Okidata
'OLIV'= Olivetti
'OLYM'= OLYMPUS OPTICAL CO., LTD
'ONYX'= Onyx Graphics
'OPTI'= Optiquest
'PACK'= Packard Bell
'PANA'= Matsushita Electric Industrial Co., Ltd.
'PANT'= Pantone, Inc.
'PBN '= Packard Bell
'PFU '= PFU Limited
'PHIL'= Philips Consumer Electronics Co.
'PNTX'= HOYA Corporation PENTAX Imaging Systems Division
'POne'= Phase One A/S
'PREM'= Premier Computer Innovations
'PRIN'= Princeton Graphic Systems
'PRIP'= Princeton Publishing Labs
'QLUX'= Hong Kong
'QMS '= QMS, Inc.
'QPCD'= QPcard AB
'QUAD'= QuadLaser
'QUME'= Qume Corporation
'RADI'= Radius, Inc.
'RDDx'= Integrated Color Solutions, Inc.
'RDG '= Roland DG Corporation
'REDM'= REDMS Group, Inc.
'RELI'= Relisys
'RGMS'= Rolf Gierling Multitools
'RICO'= Ricoh Corporation
'RNLD'= Edmund Ronald
'ROYA'= Royal
'RPC '= Ricoh Printing Systems,Ltd.
'RTL '= Royal Information Electronics Co., Ltd.
'SAMP'= Sampo Corporation of America
'SAMS'= Samsung, Inc.
'SANT'= Jaime Santana Pomares
'SCIT'= Scitex Corporation, Ltd.
'SCRN'= Dainippon Screen
'SDP '= Scitex Corporation, Ltd.
'SEC '= SAMSUNG ELECTRONICS CO.,LTD
'SEIK'= Seiko Instruments U.S.A., Inc.
'SEIk'= Seikosha
'SGUY'= ScanGuy.com
'SHAR'= Sharp Laboratories
'SICC'= International Color Consortium
'SONY'= SONY Corporation
'SPCL'= SpectraCal
'STAR'= Star
'STC '= Sampo Technology Corporation
'Scit'= Scitex Corporation, Ltd.
'Sdp '= Scitex Corporation, Ltd.
'Sony'= Sony Corporation
'TALO'= Talon Technology Corporation
'TAND'= Tandy
'TATU'= Tatung Co. of America, Inc.
'TAXA'= TAXAN America, Inc.
'TDS '= Tokyo Denshi Sekei K.K.
'TECO'= TECO Information Systems, Inc.
'TEGR'= Tegra
'TEKT'= Tektronix, Inc.
'TI '= Texas Instruments
'TMKR'= TypeMaker Ltd.
'TOSB'= TOSHIBA corp.
'TOSH'= Toshiba, Inc.
'TOTK'= TOTOKU ELECTRIC Co., LTD
'TRIU'= Triumph
'TSBT'= TOSHIBA TEC CORPORATION
'TTX '= TTX Computer Products, Inc.
'TVM '= TVM Professional Monitor Corporation
'TW '= TW Casper Corporation
'ULSX'= Ulead Systems
'UNIS'= Unisys
'UTZF'= Utz Fehlau & Sohn
'VARI'= Varityper
'VIEW'= Viewsonic
'VISL'= Visual communication
'VIVO'= Vivo Mobile Communication Co., Ltd
'WANG'= Wang
'WLBR'= Wilbur Imaging
'WTG2'= Ware To Go
'WYSE'= WYSE Technology
'XERX'= Xerox Corporation
'XRIT'= X-Rite
'Z123'= Lavanya's test Company
'ZRAN'= Zoran Corporation
'Zebr'= Zebra Technologies Inc
'appl'= Apple Computer Inc.
'bICC'= basICColor GmbH
'berg'= bergdesign incorporated
'ceyd'= Integrated Color Solutions, Inc.
'clsp'= MacDermid ColorSpan, Inc.
'ds '= Dainippon Screen
'dupn'= DuPont
'ffei'= FujiFilm Electronic Imaging, Ltd.
'flux'= FluxData Corporation
'iris'= Scitex Corporation, Ltd.
'kart'= Scitex Corporation, Ltd.
'lcms'= Little CMS
'lino'= Linotronic
'none'= none
'ob4d'= Erdt Systems GmbH & Co KG
'obic'= Medigraph GmbH
'quby'= Qubyx Sarl
'scit'= Scitex Corporation, Ltd.
'scrn'= Dainippon Screen
'sdp '= Scitex Corporation, Ltd.
'siwi'= SIWI GRAFIKA CORPORATION
'yxym'= YxyMaster GmbH
+ +

ICC_Profile Chromaticity Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
8ChromaticityChannelsno 
10ChromaticityColorantno1 = ITU-R BT.709 +
2 = SMPTE RP145-1994 +
3 = EBU Tech.3213-E +
4 = P22
12ChromaticityChannel1no 
20ChromaticityChannel2no 
28ChromaticityChannel3no 
36ChromaticityChannel4no 
+ +

ICC_Profile ColorantTable Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
8ColorantCountno 
12Colorant1Nameno 
44Colorant1Coordinatesno 
50Colorant2Nameno 
82Colorant2Coordinatesno 
88Colorant3Nameno 
120Colorant3Coordinatesno 
+ +

ICC_Profile Measurement Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
8MeasurementObserverno1 = CIE 1931 +
2 = CIE 1964
12MeasurementBackingno 
24MeasurementGeometryno0 = Unknown +
1 = 0/45 or 45/0 +
2 = 0/d or d/0
28MeasurementFlareno 
32MeasurementIlluminantno + +
1 = D50 +
2 = D65 +
3 = D93 +
4 = F2
  5 = D55 +
6 = A +
7 = Equi-Power (E) +
8 = F8
+
+ +

ICC_Profile Metadata Tags

+

Only these few tags have been pre-defined, but ExifTool will extract any +Metadata tags that exist.

+
+
+ + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
CreatorAppno 
ManufacturerNameno 
MediaColorno 
MediaWeightno 
+ +

ICC_Profile ViewingConditions Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
8ViewingCondIlluminantno 
20ViewingCondSurroundno 
32ViewingCondIlluminantTypeno + +
1 = D50 +
2 = D65 +
3 = D93 +
4 = F2
  5 = D55 +
6 = A +
7 = Equi-Power (E) +
8 = F8
+
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 1, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/ID3.html b/html/TagNames/ID3.html new file mode 100644 index 0000000..607234d --- /dev/null +++ b/html/TagNames/ID3.html @@ -0,0 +1,1679 @@ + + + + +ID3 Tags + + + +

ID3 Tags

+

ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, WAV, AIFF, +OGG, FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple +languages (eg. Comment and Lyrics) are extracted by specifying the tag name, +followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg. +"Comment-spa"). See https://id3.org/ for the official ID3 specification +and http://www.loc.gov/standards/iso639-2/php/code_list.php for a list of +ISO 639-2 language codes.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
ID3v1---> ID3 v1 Tags
ID3v1_Enh---> ID3 v1_Enh Tags
ID3v2_2---> ID3 v2_2 Tags
ID3v2_3---> ID3 v2_3 Tags
ID3v2_4---> ID3 v2_4 Tags
+ +

ID3 v1 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3Titleno 
33Artistno 
63Albumno 
93Yearno 
97Commentno 
125Trackno(v1.1 addition -- last 2 bytes of v1.0 Comment field)
127Genreno(CR and RX are ID3v2 only) + + +
0 = Blues +
1 = Classic Rock +
2 = Country +
3 = Dance +
4 = Disco +
5 = Funk +
6 = Grunge +
7 = Hip-Hop +
8 = Jazz +
9 = Metal +
10 = New Age +
11 = Oldies +
12 = Other +
13 = Pop +
14 = R&B +
15 = Rap +
16 = Reggae +
17 = Rock +
18 = Techno +
19 = Industrial +
20 = Alternative +
21 = Ska +
22 = Death Metal +
23 = Pranks +
24 = Soundtrack +
25 = Euro-Techno +
26 = Ambient +
27 = Trip-Hop +
28 = Vocal +
29 = Jazz+Funk +
30 = Fusion +
31 = Trance +
32 = Classical +
33 = Instrumental +
34 = Acid +
35 = House +
36 = Game +
37 = Sound Clip +
38 = Gospel +
39 = Noise +
40 = Alt. Rock +
41 = Bass +
42 = Soul +
43 = Punk +
44 = Space +
45 = Meditative +
46 = Instrumental Pop +
47 = Instrumental Rock +
48 = Ethnic +
49 = Gothic +
50 = Darkwave +
51 = Techno-Industrial +
52 = Electronic +
53 = Pop-Folk +
54 = Eurodance +
55 = Dream +
56 = Southern Rock +
57 = Comedy +
58 = Cult +
59 = Gangsta Rap +
60 = Top 40 +
61 = Christian Rap +
62 = Pop/Funk +
63 = Jungle +
64 = Native American
  65 = Cabaret +
66 = New Wave +
67 = Psychedelic +
68 = Rave +
69 = Showtunes +
70 = Trailer +
71 = Lo-Fi +
72 = Tribal +
73 = Acid Punk +
74 = Acid Jazz +
75 = Polka +
76 = Retro +
77 = Musical +
78 = Rock & Roll +
79 = Hard Rock +
80 = Folk +
81 = Folk-Rock +
82 = National Folk +
83 = Swing +
84 = Fast-Fusion +
85 = Bebop +
86 = Latin +
87 = Revival +
88 = Celtic +
89 = Bluegrass +
90 = Avantgarde +
91 = Gothic Rock +
92 = Progressive Rock +
93 = Psychedelic Rock +
94 = Symphonic Rock +
95 = Slow Rock +
96 = Big Band +
97 = Chorus +
98 = Easy Listening +
99 = Acoustic +
100 = Humour +
101 = Speech +
102 = Chanson +
103 = Opera +
104 = Chamber Music +
105 = Sonata +
106 = Symphony +
107 = Booty Bass +
108 = Primus +
109 = Porn Groove +
110 = Satire +
111 = Slow Jam +
112 = Club +
113 = Tango +
114 = Samba +
115 = Folklore +
116 = Ballad +
117 = Power Ballad +
118 = Rhythmic Soul +
119 = Freestyle +
120 = Duet +
121 = Punk Rock +
122 = Drum Solo +
123 = A Cappella +
124 = Euro-House +
125 = Dance Hall +
126 = Goa +
127 = Drum & Bass +
128 = Club-House +
129 = Hardcore
  130 = Terror +
131 = Indie +
132 = BritPop +
133 = Afro-Punk +
134 = Polsk Punk +
135 = Beat +
136 = Christian Gangsta Rap +
137 = Heavy Metal +
138 = Black Metal +
139 = Crossover +
140 = Contemporary Christian +
141 = Christian Rock +
142 = Merengue +
143 = Salsa +
144 = Thrash Metal +
145 = Anime +
146 = JPop +
147 = Synthpop +
148 = Abstract +
149 = Art Rock +
150 = Baroque +
151 = Bhangra +
152 = Big Beat +
153 = Breakbeat +
154 = Chillout +
155 = Downtempo +
156 = Dub +
157 = EBM +
158 = Eclectic +
159 = Electro +
160 = Electroclash +
161 = Emo +
162 = Experimental +
163 = Garage +
164 = Global +
165 = IDM +
166 = Illbient +
167 = Industro-Goth +
168 = Jam Band +
169 = Krautrock +
170 = Leftfield +
171 = Lounge +
172 = Math Rock +
173 = New Romantic +
174 = Nu-Breakz +
175 = Post-Punk +
176 = Post-Rock +
177 = Psytrance +
178 = Shoegaze +
179 = Space Rock +
180 = Trop Rock +
181 = World Music +
182 = Neoclassical +
183 = Audiobook +
184 = Audio Theatre +
185 = Neue Deutsche Welle +
186 = Podcast +
187 = Indie Rock +
188 = G-Funk +
189 = Dubstep +
190 = Garage Rock +
191 = Psybient +
255 = None +
'CR' = Cover +
'RX' = Remix
+
+ +

ID3 v1_Enh Tags

+

ID3 version 1 "Enhanced TAG" information (not part of the official spec).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4Title2no 
64Artist2no 
124Album2no 
184Speedno1 = Slow +
2 = Medium +
3 = Fast +
4 = Hardcore
185Genreno 
215StartTimeno 
221EndTimeno 
+ +

ID3 v2_2 Tags

+

ExifTool extracts mainly text-based tags from ID3v2 information. The tags +in the tables below are those extracted by ExifTool, and don't represent a +complete list of available ID3v2 tags.

+ +

ID3 version 2.2 tags. (These are the tags written by iTunes 5.0.)

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'CNT'PlayCounterno 
'COM'Commentno 
'IPL'InvolvedPeopleno 
'ITU'iTunesU?no 
'PCS'Podcast?no 
'PIC'Pictureno(the 3 tags below are also extracted from this PIC frame)
'PIC-1'PictureFormatno 
'PIC-2'PictureTypeno--> ID3 PictureType Values
'PIC-3'PictureDescriptionno 
'POP'Popularimeterno 
'RVA'RelativeVolumeAdjustmentno 
'SLT'SynLyrics---> ID3 SynLyrics Tags
'TAL'Albumno 
'TBP'BeatsPerMinuteno 
'TCM'Composerno 
'TCO'Genreno(uses same lookup table as ID3v1 Genre)
'TCP'Compilationno0 = No +
1 = Yes
'TCR'Copyrightno 
'TDA'Dateno 
'TDY'PlaylistDelayno 
'TEN'EncodedByno 
'TFT'FileTypeno 
'TIM'Timeno 
'TKE'InitialKeyno 
'TLA'Languageno 
'TLE'Lengthno 
'TMT'Mediano 
'TOA'OriginalArtistno 
'TOF'OriginalFileNameno 
'TOL'OriginalLyricistno 
'TOR'OriginalReleaseYearno 
'TOT'OriginalAlbumno 
'TP1'Artistno 
'TP2'Bandno 
'TP3'Conductorno 
'TP4'InterpretedByno 
'TPA'PartOfSetno 
'TPB'Publisherno 
'TRC'ISRCno 
'TRD'RecordingDatesno 
'TRK'Trackno 
'TS2'AlbumArtistSortOrderno 
'TSA'AlbumSortOrderno 
'TSC'ComposerSortOrderno 
'TSI'Sizeno 
'TSP'PerformerSortOrderno 
'TSS'EncoderSettingsno 
'TST'TitleSortOrderno 
'TT1'Groupingno 
'TT2'Titleno 
'TT3'Subtitleno 
'TXT'Lyricistno 
'TXX'UserDefinedTextno 
'TYE'Yearno 
'ULT'Lyricsno 
'WAF'FileURLno 
'WAR'ArtistURLno 
'WAS'SourceURLno 
'WCM'CommercialURLno 
'WCP'CopyrightURLno 
'WPB'PublisherURLno 
'WXX'UserDefinedURLno 
+ +

ID3 PictureType Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
ValuePictureTypeValuePictureTypeValuePictureType
0= Other7= Lead Artist14= Recording Session
1= 32x32 PNG Icon8= Artist15= Performance
2= Other Icon9= Conductor16= Capture from Movie or Video
3= Front Cover10= Band17= Bright(ly) Colored Fish
4= Back Cover11= Composer18= Illustration
5= Leaflet12= Lyricist19= Band Logo
6= Media13= Recording Studio or Location20= Publisher Logo
+ +

ID3 SynLyrics Tags

+

The following tags are extracted from synchronized lyrics/text frames.

+
+
+ + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
SynchronizedLyricsDescriptionno 
SynchronizedLyricsTextno+(each list item has a leading time stamp in square brackets. Time stamps may +be in seconds with format [MM:SS.ss], or MPEG frames with format [FFFF], +depending on how this information was stored)
SynchronizedLyricsTypeno +
0 = Other +
1 = Lyrics +
2 = Text Transcription +
3 = Movement/part Name +
4 = Events +
5 = Chord +
6 = Trivia/"pop-up" Information +
7 = Web Page URL +
8 = Image URL
+
+ +

ID3 v2_3 Tags

+

ID3 version 2.3 tags. Includes some non-standard tags written by other +software.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'APIC'Pictureno(the 3 tags below are also extracted from this APIC frame)
'APIC-1'PictureMIMETypeno 
'APIC-2'PictureTypeno--> ID3 PictureType Values
'APIC-3'PictureDescriptionno 
'COMM'Commentno 
'GRP1'Groupingno 
'IPLS'InvolvedPeopleno 
'ITNU'iTunesU?no 
'MCDI'MusicCDIdentifierno 
'MVIN'MovementNumberno 
'MVNM'MovementNameno 
'OWNE'Ownershipno 
'PCNT'PlayCounterno 
'PCST'Podcast?no 
'POPM'Popularimeterno 
'PRIV'Private---> ID3 Private Tags
'SYLT'SynLyrics---> ID3 SynLyrics Tags
'TALB'Albumno 
'TBPM'BeatsPerMinuteno 
'TCAT'PodcastCategoryno 
'TCMP'Compilationno0 = No +
1 = Yes
'TCOM'Composerno 
'TCON'Genreno(uses same lookup table as ID3v1 Genre)
'TCOP'Copyrightno 
'TDAT'Dateno 
'TDES'PodcastDescriptionno 
'TDLY'PlaylistDelayno 
'TENC'EncodedByno 
'TEXT'Lyricistno 
'TFLT'FileTypeno 
'TGID'PodcastIDno 
'TIME'Timeno 
'TIT1'Groupingno 
'TIT2'Titleno 
'TIT3'Subtitleno 
'TKEY'InitialKeyno 
'TKWD'PodcastKeywordsno 
'TLAN'Languageno 
'TLEN'Lengthno 
'TMED'Mediano 
'TOAL'OriginalAlbumno 
'TOFN'OriginalFileNameno 
'TOLY'OriginalLyricistno 
'TOPE'OriginalArtistno 
'TORY'OriginalReleaseYearno 
'TOWN'FileOwnerno 
'TPE1'Artistno 
'TPE2'Bandno 
'TPE3'Conductorno 
'TPE4'InterpretedByno 
'TPOS'PartOfSetno 
'TPUB'Publisherno 
'TRCK'Trackno 
'TRDA'RecordingDatesno 
'TRSN'InternetRadioStationNameno 
'TRSO'InternetRadioStationOwnerno 
'TSIZ'Sizeno 
'TSO2'AlbumArtistSortOrderno 
'TSOC'ComposerSortOrderno 
'TSRC'ISRCno 
'TSSE'EncoderSettingsno 
'TXXX'UserDefinedTextno 
'TYER'Yearno 
'USER'TermsOfUseno 
'USLT'Lyricsno 
'WCOM'CommercialURLno 
'WCOP'CopyrightURLno 
'WFED'PodcastURLno 
'WOAF'FileURLno 
'WOAR'ArtistURLno 
'WOAS'SourceURLno 
'WORS'InternetRadioStationURLno 
'WPAY'PaymentURLno 
'WPUB'PublisherURLno 
'WXXX'UserDefinedURLno 
'XDOR'OriginalReleaseTimeno 
'XOLY'OlympusDSS---> Olympus DSS Tags
'XSOA'AlbumSortOrderno 
'XSOP'PerformerSortOrderno 
'XSOT'TitleSortOrderno 
+ +

ID3 Private Tags

+

ID3 private (PRIV) tags. ExifTool will decode any private tags found, even +if they do not appear in this table.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AverageLevelno 
PeakValueno 
WM_CollectionGroupIDno 
WM_CollectionIDno 
WM_ContentIDno 
WM_MediaClassPrimaryIDno 
WM_MediaClassSecondaryIDno 
WM_Providerno 
XMP---> XMP Tags
+ +

ID3 v2_4 Tags

+

ID3 version 2.4 tags. Includes some non-standard tags written by other +software.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'APIC'Pictureno(the 3 tags below are also extracted from this APIC frame)
'APIC-1'PictureMIMETypeno 
'APIC-2'PictureTypeno--> ID3 PictureType Values
'APIC-3'PictureDescriptionno 
'COMM'Commentno 
'GRP1'Groupingno 
'ITNU'iTunesU?no 
'MCDI'MusicCDIdentifierno 
'MVIN'MovementNumberno 
'MVNM'MovementNameno 
'OWNE'Ownershipno 
'PCNT'PlayCounterno 
'PCST'Podcast?no 
'POPM'Popularimeterno 
'PRIV'Private---> ID3 Private Tags
'RVA2'RelativeVolumeAdjustmentno 
'SYLT'SynLyrics---> ID3 SynLyrics Tags
'TALB'Albumno 
'TBPM'BeatsPerMinuteno 
'TCAT'PodcastCategoryno 
'TCMP'Compilationno0 = No +
1 = Yes
'TCOM'Composerno 
'TCON'Genreno(uses same lookup table as ID3v1 Genre)
'TCOP'Copyrightno 
'TDEN'EncodingTimeno 
'TDES'PodcastDescriptionno 
'TDLY'PlaylistDelayno 
'TDOR'OriginalReleaseTimeno 
'TDRC'RecordingTimeno 
'TDRL'ReleaseTimeno 
'TDTG'TaggingTimeno 
'TENC'EncodedByno 
'TEXT'Lyricistno 
'TFLT'FileTypeno 
'TGID'PodcastIDno 
'TIPL'InvolvedPeopleno 
'TIT1'Groupingno 
'TIT2'Titleno 
'TIT3'Subtitleno 
'TKEY'InitialKeyno 
'TKWD'PodcastKeywordsno 
'TLAN'Languageno 
'TLEN'Lengthno 
'TMCL'MusicianCreditsno 
'TMED'Mediano 
'TMOO'Moodno 
'TOAL'OriginalAlbumno 
'TOFN'OriginalFileNameno 
'TOLY'OriginalLyricistno 
'TOPE'OriginalArtistno 
'TOWN'FileOwnerno 
'TPE1'Artistno 
'TPE2'Bandno 
'TPE3'Conductorno 
'TPE4'InterpretedByno 
'TPOS'PartOfSetno 
'TPRO'ProducedNoticeno 
'TPUB'Publisherno 
'TRCK'Trackno 
'TRSN'InternetRadioStationNameno 
'TRSO'InternetRadioStationOwnerno 
'TSO2'AlbumArtistSortOrderno 
'TSOA'AlbumSortOrderno 
'TSOC'ComposerSortOrderno 
'TSOP'PerformerSortOrderno 
'TSOT'TitleSortOrderno 
'TSRC'ISRCno 
'TSSE'EncoderSettingsno 
'TSST'SetSubtitleno 
'TXXX'UserDefinedTextno 
'USER'TermsOfUseno 
'USLT'Lyricsno 
'WCOM'CommercialURLno 
'WCOP'CopyrightURLno 
'WFED'PodcastURLno 
'WOAF'FileURLno 
'WOAR'ArtistURLno 
'WOAS'SourceURLno 
'WORS'InternetRadioStationURLno 
'WPAY'PaymentURLno 
'WPUB'PublisherURLno 
'WXXX'UserDefinedURLno 
'XDOR'OriginalReleaseTimeno 
'XOLY'OlympusDSS---> Olympus DSS Tags
'XSOA'AlbumSortOrderno 
'XSOP'PerformerSortOrderno 
'XSOT'TitleSortOrderno 
+ +

ID3 Lyrics3 Tags

+

ExifTool extracts Lyrics3 version 1.00 and 2.00 tags from any file that +supports ID3. See https://id3.org/Lyrics3 for the specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'AUT'Authorno 
'CRC'CRCno 
'EAL'ExtendedAlbumNameno 
'EAR'ExtendedArtistNameno 
'ETT'ExtendedTrackTitleno 
'IMG'AssociatedImageFileno 
'IND'Indicationsno 
'INF'AdditionalInfono 
'LYR'Lyricsno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 1, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/IPTC.html b/html/TagNames/IPTC.html new file mode 100644 index 0000000..be3885c --- /dev/null +++ b/html/TagNames/IPTC.html @@ -0,0 +1,904 @@ + + + + +IPTC Tags + + + +

IPTC Tags

+

+The tags listed below are part of the International Press Telecommunications +Council (IPTC) and the Newspaper Association of America (NAA) Information +Interchange Model (IIM). This is an older meta information format, slowly +being phased out in favor of XMP -- the newer IPTCCore specification uses +XMP format. IPTC information may be found in JPG, TIFF, PNG, MIFF, PS, PDF, +PSD, XCF and DNG images.

+ +

IPTC information is separated into different records, each of which has its +own set of tags. See +http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf for the +official IPTC IIM specification.

+ +

This specification dictates a length for ASCII (string or digits) and +binary (undef) values. These lengths are given in square brackets after +the Writable format name. For tags where a range of lengths is allowed, +the minimum and maximum lengths are separated by a comma within the +brackets. When writing, ExifTool issues a minor warning and truncates the +value if it is longer than allowed by the IPTC specification. Minor errors +may be ignored with the IgnoreMinorErrors (-m) option, allowing longer +values to be written, but beware that values like this may cause problems +for some other IPTC readers. ExifTool will happily read IPTC values of any +length.

+ +

Separate IPTC date and time tags may be written with a combined date/time +value and ExifTool automagically takes the appropriate part of the date/time +string depending on whether a date or time tag is being written. This is +very useful when copying date/time values to IPTC from other metadata +formats.

+ +

IPTC time values include a timezone offset. If written with a value which +doesn't include a timezone then the current local timezone offset is used +(unless written with a combined date/time, in which case the local timezone +offset at the specified date/time is used, which may be different due to +changes in daylight savings time).

+ +

Note that it is not uncommon for IPTC to be found in non-standard locations +in JPEG and TIFF-based images. When reading, the family 1 group name has a +number added for non-standard IPTC ("IPTC2", "IPTC3", etc), but when writing +only "IPTC" may be specified as the group. To keep the IPTC consistent, +ExifTool updates tags in all existing IPTC locations, but will create a new +IPTC group only in the standard location. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RecordTag NameWritableValues / Notes
1IPTCEnvelope---> IPTC EnvelopeRecord Tags
2IPTCApplication---> IPTC ApplicationRecord Tags
3IPTCNewsPhoto---> IPTC NewsPhoto Tags
7IPTCPreObjectData---> IPTC PreObjectData Tags
8IPTCObjectData---> IPTC ObjectData Tags
9IPTCPostObjectData---> IPTC PostObjectData Tags
240IPTCFotoStation---> IPTC FotoStation Tags
+ +

IPTC EnvelopeRecord Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0EnvelopeRecordVersionint16u: 
5Destinationstring[0,1024]+ 
20FileFormatint16u0 = No ObjectData +
1 = IPTC-NAA Digital Newsphoto Parameter Record +
2 = IPTC7901 Recommended Message Format +
3 = Tagged Image File Format (Adobe/Aldus Image data) +
4 = Illustrator (Adobe Graphics data) +
5 = AppleSingle (Apple Computer Inc) +
6 = NAA 89-3 (ANPA 1312) +
7 = MacBinary II +
8 = IPTC Unstructured Character Oriented File Format (UCOFF) +
9 = United Press International ANPA 1312 variant +
10 = United Press International Down-Load Message +
11 = JPEG File Interchange (JFIF) +
12 = Photo-CD Image-Pac (Eastman Kodak) +
13 = Bit Mapped Graphics File [.BMP] (Microsoft) +
14 = Digital Audio File [.WAV] (Microsoft & Creative Labs) +
15 = Audio plus Moving Video [.AVI] (Microsoft) +
16 = PC DOS/Windows Executable Files [.COM][.EXE] +
17 = Compressed Binary File [.ZIP] (PKWare Inc) +
18 = Audio Interchange File Format AIFF (Apple Computer Inc) +
19 = RIFF Wave (Microsoft Corporation) +
20 = Freehand (Macromedia/Aldus) +
21 = Hypertext Markup Language [.HTML] (The Internet Society) +
22 = MPEG 2 Audio Layer 2 (Musicom), ISO/IEC +
23 = MPEG 2 Audio Layer 3, ISO/IEC +
24 = Portable Document File [.PDF] Adobe +
25 = News Industry Text Format (NITF) +
26 = Tape Archive [.TAR] +
27 = Tidningarnas Telegrambyra NITF version (TTNITF DTD) +
28 = Ritzaus Bureau NITF version (RBNITF DTD) +
29 = Corel Draw [.CDR]
22FileVersionint16u 
30ServiceIdentifierstring[0,10] 
40EnvelopeNumberdigits[8] 
50ProductIDstring[0,32]+ 
60EnvelopePrioritydigits[1] +
0 = 0 (reserved) +
1 = 1 (most urgent) +
2 = 2 +
3 = 3 +
4 = 4 +
5 = 5 (normal urgency) +
6 = 6 +
7 = 7 +
8 = 8 (least urgent) +
9 = 9 (user-defined priority)
+
70DateSentdigits[8] 
80TimeSentstring[11] 
90CodedCharacterSetstring[0,32]!(values are entered in the form "ESC X Y[, ...]". The escape sequence for +UTF-8 character coding is "ESC % G", but this is displayed as "UTF8" for +convenience. Either string may be used when writing. The value of this tag +affects the decoding of string values in the Application and NewsPhoto +records. This tag is marked as "unsafe" to prevent it from being copied by +default in a group operation because existing tags in the destination image +may use a different encoding. When creating a new IPTC record from scratch, +it is suggested that this be set to "UTF8" if special characters are a +possibility)
100UniqueObjectNamestring[14,80] 
120ARMIdentifierint16u 
122ARMVersionint16u 
+ +

IPTC ApplicationRecord Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0ApplicationRecordVersionint16u: 
3ObjectTypeReferencestring[3,67] 
4ObjectAttributeReferencestring[4,68]+ 
5ObjectNamestring[0,64] 
7EditStatusstring[0,64] 
8EditorialUpdatedigits[2]01 = Additional language
10Urgencydigits[1] +
0 = 0 (reserved) +
1 = 1 (most urgent) +
2 = 2 +
3 = 3 +
4 = 4 +
5 = 5 (normal urgency) +
6 = 6 +
7 = 7 +
8 = 8 (least urgent) +
9 = 9 (user-defined priority)
+
12SubjectReferencestring[13,236]+ 
15Categorystring[0,3] 
20SupplementalCategoriesstring[0,32]+ 
22FixtureIdentifierstring[0,32] 
25Keywordsstring[0,64]+ 
26ContentLocationCodestring[3]+ 
27ContentLocationNamestring[0,64]+ 
30ReleaseDatedigits[8] 
35ReleaseTimestring[11] 
37ExpirationDatedigits[8] 
38ExpirationTimestring[11] 
40SpecialInstructionsstring[0,256] 
42ActionAdviseddigits[2]01 = Object Kill +
02 = Object Replace +
03 = Object Append +
04 = Object Reference
45ReferenceServicestring[0,10]+ 
47ReferenceDatedigits[8]+ 
50ReferenceNumberdigits[8]+ 
55DateCreateddigits[8] 
60TimeCreatedstring[11] 
62DigitalCreationDatedigits[8] 
63DigitalCreationTimestring[11] 
65OriginatingProgramstring[0,32] 
70ProgramVersionstring[0,10] 
75ObjectCyclestring[1]'a' = Morning +
'b' = Both Morning and Evening +
'p' = Evening
80By-linestring[0,32]+ 
85By-lineTitlestring[0,32]+ 
90Citystring[0,32] 
92Sub-locationstring[0,32] 
95Province-Statestring[0,32] 
100Country-PrimaryLocationCodestring[3] 
101Country-PrimaryLocationNamestring[0,64] 
103OriginalTransmissionReferencestring[0,32](now used as a job identifier)
105Headlinestring[0,256] 
110Creditstring[0,32] 
115Sourcestring[0,32] 
116CopyrightNoticestring[0,128] 
118Contactstring[0,128]+ 
120Caption-Abstractstring[0,2000] 
121LocalCaptionstring[0,256](I haven't found a reference for the format of tags 121, 184-188 and +225-232, so I have just make them writable as strings with +reasonable length. Beware that if this is wrong, other utilities +may not be able to read these tags as written by ExifTool)
122Writer-Editorstring[0,32]+ 
125RasterizedCaptionundef[7360] 
130ImageTypestring[2] 
131ImageOrientationstring[1]'L' = Landscape +
'P' = Portrait +
'S' = Square
135LanguageIdentifierstring[2,3] 
150AudioTypestring[2] +
'0T' = Text Only +
'1A' = Mono Actuality +
'1C' = Mono Question and Answer Session +
'1M' = Mono Music +
'1Q' = Mono Response to a Question +
'1R' = Mono Raw Sound +
'1S' = Mono Scener +
'1V' = Mono Voicer +
'1W' = Mono Wrap +
'2A' = Stereo Actuality +
'2C' = Stereo Question and Answer Session +
'2M' = Stereo Music +
'2Q' = Stereo Response to a Question +
'2R' = Stereo Raw Sound +
'2S' = Stereo Scener +
'2V' = Stereo Voicer +
'2W' = Stereo Wrap
+
151AudioSamplingRatedigits[6] 
152AudioSamplingResolutiondigits[2] 
153AudioDurationdigits[6] 
154AudioOutcuestring[0,64] 
184JobIDstring[0,64] 
185MasterDocumentIDstring[0,256] 
186ShortDocumentIDstring[0,64] 
187UniqueDocumentIDstring[0,128] 
188OwnerIDstring[0,128] 
200ObjectPreviewFileFormatint16u0 = No ObjectData +
1 = IPTC-NAA Digital Newsphoto Parameter Record +
2 = IPTC7901 Recommended Message Format +
3 = Tagged Image File Format (Adobe/Aldus Image data) +
4 = Illustrator (Adobe Graphics data) +
5 = AppleSingle (Apple Computer Inc) +
6 = NAA 89-3 (ANPA 1312) +
7 = MacBinary II +
8 = IPTC Unstructured Character Oriented File Format (UCOFF) +
9 = United Press International ANPA 1312 variant +
10 = United Press International Down-Load Message +
11 = JPEG File Interchange (JFIF) +
12 = Photo-CD Image-Pac (Eastman Kodak) +
13 = Bit Mapped Graphics File [.BMP] (Microsoft) +
14 = Digital Audio File [.WAV] (Microsoft & Creative Labs) +
15 = Audio plus Moving Video [.AVI] (Microsoft) +
16 = PC DOS/Windows Executable Files [.COM][.EXE] +
17 = Compressed Binary File [.ZIP] (PKWare Inc) +
18 = Audio Interchange File Format AIFF (Apple Computer Inc) +
19 = RIFF Wave (Microsoft Corporation) +
20 = Freehand (Macromedia/Aldus) +
21 = Hypertext Markup Language [.HTML] (The Internet Society) +
22 = MPEG 2 Audio Layer 2 (Musicom), ISO/IEC +
23 = MPEG 2 Audio Layer 3, ISO/IEC +
24 = Portable Document File [.PDF] Adobe +
25 = News Industry Text Format (NITF) +
26 = Tape Archive [.TAR] +
27 = Tidningarnas Telegrambyra NITF version (TTNITF DTD) +
28 = Ritzaus Bureau NITF version (RBNITF DTD) +
29 = Corel Draw [.CDR]
201ObjectPreviewFileVersionint16u 
202ObjectPreviewDataundef[0,256000] 
221Prefsstring[0,64](PhotoMechanic preferences)
225ClassifyStatestring[0,64] 
228SimilarityIndexstring[0,32] 
230DocumentNotesstring[0,1024] 
231DocumentHistorystring[0,256] 
232ExifCameraInfostring[0,4096] 
255CatalogSetsstring[0,256]+(written by iView MediaPro)
+ +

IPTC NewsPhoto Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0NewsPhotoVersionint16u: 
10IPTCPictureNumberstring[16](4 numbers: 1-Manufacturer ID, 2-Equipment ID, 3-Date, 4-Sequence)
20IPTCImageWidthint16u 
30IPTCImageHeightint16u 
40IPTCPixelWidthint16u 
50IPTCPixelHeightint16u 
55SupplementalTypeint8u0 = Main Image +
1 = Reduced Resolution Image +
2 = Logo +
3 = Rasterized Caption
60ColorRepresentationint16u0x0 = No Image, Single Frame +
0x100 = Monochrome, Single Frame +
0x300 = 3 Components, Single Frame +
0x301 = 3 Components, Frame Sequential in Multiple Objects +
0x302 = 3 Components, Frame Sequential in One Object +
0x303 = 3 Components, Line Sequential +
0x304 = 3 Components, Pixel Sequential +
0x305 = 3 Components, Special Interleaving +
0x400 = 4 Components, Single Frame +
0x401 = 4 Components, Frame Sequential in Multiple Objects +
0x402 = 4 Components, Frame Sequential in One Object +
0x403 = 4 Components, Line Sequential +
0x404 = 4 Components, Pixel Sequential +
0x405 = 4 Components, Special Interleaving
64InterchangeColorSpaceint8u +
1 = X,Y,Z CIE +
2 = RGB SMPTE +
3 = Y,U,V (K) (D65) +
4 = RGB Device Dependent +
5 = CMY (K) Device Dependent +
6 = Lab (K) CIE +
7 = YCbCr +
8 = sRGB
+
65ColorSequenceint8u 
66ICC_Profileno 
70ColorCalibrationMatrixno 
80LookupTableno 
84NumIndexEntriesint16u 
85ColorPaletteno 
86IPTCBitsPerSampleint8u 
90SampleStructureint8u0 = OrthogonalConstangSampling +
1 = Orthogonal4-2-2Sampling +
2 = CompressionDependent
100ScanningDirectionint8u + +
0 = L-R, Top-Bottom +
1 = R-L, Top-Bottom +
2 = L-R, Bottom-Top +
3 = R-L, Bottom-Top
  4 = Top-Bottom, L-R +
5 = Bottom-Top, L-R +
6 = Top-Bottom, R-L +
7 = Bottom-Top, R-L
+
102IPTCImageRotationint8u0 = 0 +
1 = 90 +
2 = 180 +
3 = 270
110DataCompressionMethodint32u 
120QuantizationMethodint8u +
0 = Linear Reflectance/Transmittance +
1 = Linear Density +
2 = IPTC Ref B +
3 = Linear Dot Percent +
4 = AP Domestic Analogue +
5 = Compression Method Specific +
6 = Color Space Specific +
7 = Gamma Compensated
+
125EndPointsno 
130ExcursionToleranceint8u0 = Not Allowed +
1 = Allowed
135BitsPerComponentint8u 
140MaximumDensityRangeint16u 
145GammaCompensatedValueint16u 
+ +

IPTC PreObjectData Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
10SizeModeno0 = Size Not Known +
1 = Size Known
20MaxSubfileSizeno 
90ObjectSizeAnnouncedno 
95MaximumObjectSizeno 
+ +

IPTC ObjectData Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
10SubFileno+ 
+ +

IPTC PostObjectData Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
10ConfirmedObjectSizeno 
+ +

IPTC FotoStation Tags

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 2, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/ISO.html b/html/TagNames/ISO.html new file mode 100644 index 0000000..1ec6ca6 --- /dev/null +++ b/html/TagNames/ISO.html @@ -0,0 +1,160 @@ + + + + +ISO Tags + + + +

ISO Tags

+

Tags extracted from ISO 9660 disk images.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000BootRecord---> ISO BootRecord Tags
0x0001PrimaryVolume---> ISO PrimaryVolume Tags
+ +

ISO BootRecord Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
7BootSystemno 
39BootIdentifierno 
+ +

ISO PrimaryVolume Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
8Systemno 
40VolumeNameno 
80VolumeBlockCountno 
120VolumeSetDiskCount?no 
124VolumeSetDiskNumber?no 
128VolumeBlockSizeno 
132PathTableSize?no 
140PathTableLocation?no 
174RootDirectoryCreateDateno 
190VolumeSetNameno 
318Publisherno 
446DataPreparerno 
574Softwareno 
702CopyrightFileNameno 
740AbstractFileNameno 
776BibligraphicFileNameno 
813VolumeCreateDateno 
830VolumeModifyDateno 
847VolumeExpirationDateno 
864VolumeEffectiveDateno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Apr 12, 2016 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/ITC.html b/html/TagNames/ITC.html new file mode 100644 index 0000000..00da4e2 --- /dev/null +++ b/html/TagNames/ITC.html @@ -0,0 +1,91 @@ + + + + +ITC Tags + + + +

ITC Tags

+

This information is found in iTunes Cover Flow data files.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'data'ImageDatano(embedded JPEG or PNG image, depending on ImageType)
'itch'Itch---> ITC Header Tags
'item'Item---> ITC Item Tags
+ +

ITC Header Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
16DataTypeno'artw' = Artwork
+ +

ITC Item Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0LibraryIDno 
2TrackIDno 
4DataLocationno'down' = Downloaded Separately +
'locl' = Local Music File
5ImageTypeno 
7ImageWidthno 
8ImageHeightno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Nov 9, 2011 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/JFIF.html b/html/TagNames/JFIF.html new file mode 100644 index 0000000..33a6274 --- /dev/null +++ b/html/TagNames/JFIF.html @@ -0,0 +1,89 @@ + + + + +JFIF Tags + + + +

JFIF Tags

+

+The following information is extracted from the JPEG JFIF header. See +https://www.w3.org/Graphics/JPEG/jfif3.pdf for the JFIF 1.02 +specification. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0JFIFVersionno: 
2ResolutionUnitint8u:0 = None +
1 = inches +
2 = cm
3XResolutionint16u: 
5YResolutionint16u: 
7ThumbnailWidthno 
8ThumbnailHeightno 
9ThumbnailTIFFno(raw RGB thumbnail data, extracted as a TIFF image)
+ +

JFIF Extension Tags

+

Thumbnail images extracted from the JFXX segment.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0010ThumbnailImageno(JPEG-format thumbnail image)
0x0011ThumbnailTIFFno(raw palette-color thumbnail data, extracted as a TIFF image)
0x0013ThumbnailTIFFno(raw RGB thumbnail data, extracted as a TIFF image)
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 21, 2017 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/JPEG.html b/html/TagNames/JPEG.html new file mode 100644 index 0000000..786ae58 --- /dev/null +++ b/html/TagNames/JPEG.html @@ -0,0 +1,674 @@ + + + + +JPEG Tags + + + +

JPEG Tags

+

This table lists information extracted by ExifTool from JPEG images. See +https://www.w3.org/Graphics/JPEG/jfif3.pdf for the JPEG specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'APP0'JFIF +
JFXX +
CIFF +
AVI1 +
Ocad
-
-
-
-
-
--> JFIF Tags +
--> JFIF Extension Tags +
--> CanonRaw Tags +
--> JPEG AVI1 Tags +
--> JPEG Ocad Tags
'APP1'EXIF +
ExtendedXMP +
XMP +
QVCI +
FLIR +
RawThermalImage
-
-
-
-
-
no
--> EXIF Tags +
--> XMP Tags +
--> XMP Tags +
--> Casio QVCI Tags +
--> FLIR FFF Tags +
(thermal image from Parrot Bebop-Pro Thermal drone)
'APP2'ICC_Profile +
FPXR +
MPF +
PreviewImage
-
-
-
no
--> ICC_Profile Tags +
--> FlashPix Tags +
--> MPF Tags +
(Samsung APP2 preview image)
'APP3'Meta +
Stim +
JPS +
ThermalData +
PreviewImage
-
-
-
no
no
--> Kodak Meta Tags +
--> Stim Tags +
--> JPEG JPS Tags +
(DJI raw thermal data) +
(Samsung/HP preview image)
'APP4'Scalado +
FPXR +
ThermalParams +
PreviewImage
-
-
-
no
--> Scalado Tags +
--> FlashPix Tags +
--> DJI ThermalParams Tags +
(continued from APP3)
'APP5'RMETA +
SamsungUniqueID +
ThermalCalibration +
PreviewImage
-
-
no
no
--> Ricoh RMETA Tags +
--> Samsung APP5 Tags +
(DJI thermal calibration data) +
(continued from APP4)
'APP6'EPPIM +
NITF +
HP_TDHD +
GoPro +
DJI_DTAT
-
-
-
-
no
--> JPEG EPPIM Tags +
--> JPEG NITF Tags +
--> HP TDHD Tags +
--> GoPro GPMF Tags +
(DJI Thermal Analysis Tool record)
'APP7'Pentax +
Huawei +
Qualcomm
-
-
-
--> Pentax Tags +
--> Unknown Tags +
--> Qualcomm Tags
'APP8'SPIFF---> JPEG SPIFF Tags
'APP9'MediaJukebox---> JPEG MediaJukebox Tags
'APP10'Commentno(PhotoStudio Unicode comment)
'APP11'JPEG-HDR +
JUMBF
-
-
--> JPEG HDR Tags +
--> Jpeg2000 Tags
'APP12'PictureInfo +
Ducky
-
-
--> APP12 PictureInfo Tags +
--> APP12 Ducky Tags
'APP13'Photoshop +
Adobe_CM
-
-
--> Photoshop Tags +
--> JPEG AdobeCM Tags
'APP14'Adobeyes--> JPEG Adobe Tags
'APP15'GraphicConverter---> JPEG GraphConv Tags
'COM'Commentyes 
'DQT'DefineQuantizationTableno(used to calculate the Extra JPEGDigest tag value)
'SOF'StartOfFrame---> JPEG SOF Tags
'Trailer'AFCP +
CanonVRD +
FotoStation +
PhotoMechanic +
MIE +
Samsung +
EmbeddedVideo +
Insta360 +
NikonApp +
PreviewImage
-
-
-
-
-
-
no
no
no
yes
--> AFCP Tags +
--> CanonVRD Tags +
--> FotoStation Tags +
--> PhotoMechanic Tags +
--> MIE Tags +
--> Samsung Trailer Tags +
(extracted only when ExtractEmbedded option is used) +
(contains editing information in XMP format)
+ +

JPEG AVI1 Tags

+

This information may be found in APP0 of JPEG image data from AVI videos.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0InterleavedFieldno0 = Not Interleaved +
1 = Odd +
2 = Even
+ +

JPEG Ocad Tags

+

Tags extracted from the JPEG APP0 "Ocad" segment (found in Photobucket +images).

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Rev'OcadRevisionno 
+ +

JPEG JPS Tags

+

Tags found in JPEG Stereo (JPS) images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
10JPSSeparationno(stereo only)
11JPSFlagsnoBit 0 = Half height +
Bit 1 = Half width +
Bit 2 = Left field first
12JPSLayoutno(mono) +
0 = Both Eyes +
1 = Left Eye +
2 = Right Eye +
(stereo) +
1 = Interleaved +
2 = Side By Side +
3 = Over Under +
4 = Anaglyph
13JPSTypeno0 = Mono +
1 = Stereo
16JPSCommentno 
+ +

JPEG EPPIM Tags

+

APP6 is used in by the Toshiba PDR-M700 to store a TIFF structure containing +PrintIM information.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
0xc4a5PrintIM---> PrintIM Tags
+ +

JPEG NITF Tags

+

Information in APP6 used by the National Imagery Transmission Format. See +http://www.gwg.nga.mil/ntb/baseline/docs/n010697/bwcguide25aug98.pdf for +the official specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0NITFVersionno 
2ImageFormatno'B' = IMode B
3BlocksPerRowno 
5BlocksPerColumnno 
7ImageColorno0 = Monochrome
8BitDepthno 
9ImageClassno0 = General Purpose +
4 = Tactical Imagery
10JPEGProcessno1 = Baseline sequential DCT, Huffman coding, 8-bit samples +
4 = Extended sequential DCT, Huffman coding, 12-bit samples
11Qualityno 
12StreamColorno0 = Monochrome
13StreamBitDepthno 
14Flagsno 
+ +

JPEG SPIFF Tags

+

This information is found in APP8 of SPIFF-style JPEG images (the "official" +yet rarely used JPEG file format standard: Still Picture Interchange File +Format). See http://www.jpeg.org/public/spiff.pdf for the official +specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0SPIFFVersionno 
2ProfileIDno0 = Not Specified +
1 = Continuous-tone Base +
2 = Continuous-tone Progressive +
3 = Bi-level Facsimile +
4 = Continuous-tone Facsimile
3ColorComponentsno 
6ImageHeightno(at index 4 in specification, but there are 2 extra bytes here in my only +SPIFF sample, version 1.2)
10ImageWidthno 
14ColorSpaceno +
0 = Bi-level +
1 = YCbCr, ITU-R BT 709, video +
2 = No color space specified +
3 = YCbCr, ITU-R BT 601-1, RGB +
4 = YCbCr, ITU-R BT 601-1, video +
8 = Gray-scale +
9 = PhotoYCC +
10 = RGB +
11 = CMY +
12 = CMYK +
13 = YCCK +
14 = CIELab
+
15BitsPerSampleno 
16Compressionno +
0 = Uncompressed, interleaved, 8 bits per sample +
1 = Modified Huffman +
2 = Modified READ +
3 = Modified Modified READ +
4 = JBIG +
5 = JPEG
+
17ResolutionUnitno0 = None +
1 = inches +
2 = cm
18YResolutionno 
22XResolutionno 
+ +

JPEG MediaJukebox Tags

+

Tags found in the XML metadata of the APP9 "Media Jukebox" segment.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Albumno 
Captionno 
Dateno 
Keywordsno 
Nameno 
Peopleno 
Placesno 
Tool_Nameno 
Tool_Versionno 
+ +

JPEG HDR Tags

+

Information extracted from APP11 of a JPEG-HDR image.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'RatioImage'RatioImageno(the embedded JPEG-compressed ratio image)
'alp'Alphano 
'bet'Betano 
'cor'CorrectionMethodno 
'ln0'Ln0no 
'ln1'Ln1no 
's2n'S2nno 
'ver'JPEG-HDRVersionno 
+ +

JPEG AdobeCM Tags

+

The APP13 "Adobe_CM" segment presumably contains color management +information, but the meaning of the data is currently unknown. If anyone +has an idea about what this means, please let me know.

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
0AdobeCMTypeno 
+ +

JPEG Adobe Tags

+

The APP14 "Adobe" segment stores image encoding information for DCT filters. +This segment may be copied or deleted as a block using the Extra "Adobe" +tag, but note that it is not deleted by default when deleting all metadata +because it may affect the appearance of the image.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0DCTEncodeVersionno 
1APP14Flags0no0x0 = (none) +
Bit 15 = Encoded with Blend=1 downsampling
2APP14Flags1no0x0 = (none)
3ColorTransformno0 = Unknown (RGB or CMYK) +
1 = YCbCr +
2 = YCCK
+ +

JPEG GraphConv Tags

+

APP15 is used by GraphicConverter to store JPEG quality.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Q'Qualityno 
+ +

JPEG SOF Tags

+

This information is extracted from the JPEG Start Of Frame segment.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
BitsPerSampleno 
ColorComponentsno 
EncodingProcessno0x0 = Baseline DCT, Huffman coding +
0x1 = Extended sequential DCT, Huffman coding +
0x2 = Progressive DCT, Huffman coding +
0x3 = Lossless, Huffman coding +
0x5 = Sequential DCT, differential Huffman coding +
0x6 = Progressive DCT, differential Huffman coding +
0x7 = Lossless, Differential Huffman coding +
0x9 = Extended sequential DCT, arithmetic coding +
0xa = Progressive DCT, arithmetic coding +
0xb = Lossless, arithmetic coding +
0xd = Sequential DCT, differential arithmetic coding +
0xe = Progressive DCT, differential arithmetic coding +
0xf = Lossless, differential arithmetic coding
ImageHeightno 
ImageWidthno 
YCbCrSubSamplingno(calculated from components table) +
'1 1' = YCbCr4:4:4 (1 1) +
'1 2' = YCbCr4:4:0 (1 2) +
'1 4' = YCbCr4:4:1 (1 4) +
'2 1' = YCbCr4:2:2 (2 1) +
'2 2' = YCbCr4:2:0 (2 2) +
'2 4' = YCbCr4:2:1 (2 4) +
'4 1' = YCbCr4:1:1 (4 1) +
'4 2' = YCbCr4:1:0 (4 2)
+
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 13, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/JSON.html b/html/TagNames/JSON.html new file mode 100644 index 0000000..79b9433 --- /dev/null +++ b/html/TagNames/JSON.html @@ -0,0 +1,58 @@ + + + + +JSON Tags + + + +

JSON Tags

+

Other than a few tags in the table below, JSON tags have not been +pre-defined. However, ExifTool will read any existing tags from basic +JSON-formatted files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
ON1_SettingsData---> PLIST Tags
ON1_SettingsMetadataCreatedno 
ON1_SettingsMetadataModifiedno 
ON1_SettingsMetadataNameno 
ON1_SettingsMetadataPluginIDno 
ON1_SettingsMetadataTimestampno 
ON1_SettingsMetadataUsageno 
ON1_SettingsMetadataVisibleToUserno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 29, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/JVC.html b/html/TagNames/JVC.html new file mode 100644 index 0000000..95a7a6c --- /dev/null +++ b/html/TagNames/JVC.html @@ -0,0 +1,57 @@ + + + + +JVC Tags + + + +

JVC Tags

+

JVC EXIF maker note tags.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0002CPUVersionsno 
0x0003Qualityno0 = Low +
1 = Normal +
2 = Fine
+ +

JVC Text Tags

+

JVC/Victor text-based maker note tags.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'QTY'Qualityno'FINE' = Fine +
'STD' = Normal +
'STND' = Normal
'VER'MakerNoteVersionno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Dec 22, 2005 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Jpeg2000.html b/html/TagNames/Jpeg2000.html new file mode 100644 index 0000000..a320d6d --- /dev/null +++ b/html/TagNames/Jpeg2000.html @@ -0,0 +1,570 @@ + + + + +Jpeg2000 Tags + + + +

Jpeg2000 Tags

+

The tags below are found in JPEG 2000 images and the JUMBF metadata in JPEG +images, but not all of these are extracted. Note that ExifTool currently +writes only EXIF, IPTC and XMP tags in Jpeg2000 images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Exif'EXIF---> EXIF Tags
'asoc'Association---> Jpeg2000 Tags
'bfdb'BinaryDataTypeno(JUMBF, MIME type and optional file name)
'bfil'BinaryFilterno 
'bidb'BinaryDatano(JUMBF)
'bpcc'BitsPerComponentno 
'cbor'CBORData---> CBOR Tags
'cdef'ComponentDefinitionno 
'cgrp'ColorGroupno 
'chck'DigitalSignatureno 
'cmap'ComponentMappingno 
'colr'ColorSpecification---> Jpeg2000 ColorSpec Tags
'comp'Compositionno 
'copt'CompositionOptionsno 
'cref'Cross-Referenceno 
'creg'CodestreamRegistrationno 
'drep'DesiredReproductionsno 
'dtbl'DataReferenceno 
'flst'FragmentListno 
'free'Freeno 
'ftbl'FragmentTableno 
'ftyp'FileType---> Jpeg2000 FileType Tags
'gtso'GraphicsTechnologyStandardOutputno 
'ihdr'ImageHeader---> Jpeg2000 ImageHeader Tags
'inst'InstructionSetno 
'jP 'JP2Signatureno 
'jp2c'ContiguousCodestream +
PreviewImage
no
no
 
'jp2h'JP2Header---> Jpeg2000 Tags
'jp2i'IntellectualProperty---> XMP Tags
'jpch'CodestreamHeader---> Jpeg2000 Tags
'jplh'CompositingLayerHeader---> Jpeg2000 Tags
'json'JSONData---> JSON Tags +
(by default, data in this tag is parsed using the ExifTool JSON module to to +allow individual tags to be accessed when reading, but it may also be +extracted as a block via the "JSONData" tag or by setting the API +BlockExtract option)
'jumb'JUMBFBox---> Jpeg2000 Tags
'jumd'JUMBFDescr---> Jpeg2000 JUMD Tags
'jxlc'JXLCodestreamno(Codestream in JPEG XL image. Currently processed only to determine +ImageSize)
'lbl 'Labelno 
'mdat'MediaDatano 
'mp7b'MPEG7Binaryno 
'nlst'NumberListno 
'opct'Opacityno 
'pclr'Paletteno 
'prfl'Profileno 
'res 'Resolution---> Jpeg2000 Tags
'resc'CaptureResolution---> Jpeg2000 CaptureResolution Tags
'resd'DisplayResolution---> Jpeg2000 DisplayResolution Tags
'roid'ROIDescriptionno 
'rreq'ReaderRequirementsno 
'uinf'UUIDInfo---> Jpeg2000 Tags
'ulst'UUIDListno 
'url 'URLno 
'uuid'UUID-EXIF +
UUID-EXIF2 +
UUID-EXIF_bad +
UUID-IPTC +
UUID-IPTC2 +
UUID-XMP +
UUID-GeoJP2 +
UUID-Photoshop +
UUID-Signature +
UUID-C2PAClaimSignature +
UUID-Unknown
-
-
-
-
-
-
-
-
no
-
no
--> EXIF Tags +
--> EXIF Tags +
--> EXIF Tags +
--> IPTC Tags +
--> IPTC Tags +
--> XMP Tags +
--> EXIF Tags +
--> Photoshop Tags +
--> CBOR Tags
'xml 'XML +
XMP
undef!+
-
(by default, the XML data in this tag is parsed using the ExifTool XMP module +to to allow individual tags to be accessed when reading, but it may also be +extracted as a block via the "XML" tag, which is also how this tag is +written and copied. It may also be extracted as a block by setting the API +BlockExtract option. This is a List-type tag because multiple XML blocks +may exist) +
--> XMP XML Tags +
(used for XMP in JPEG XL files) +
--> XMP Tags
+ +

Jpeg2000 ColorSpec Tags

+

The table below contains tags in the color specification (colr) box. This +box may be rewritten by writing either ICC_Profile, ColorSpace or +ColorSpecData. When writing, any existing colr boxes are replaced with the +newly created colr box.

+ +

NOTE: Care must be taken when writing this color specification because +writing a specification that is incompatible with the image data may make +the image undisplayable.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ColorSpecMethodint8s!(default for writing is 2 when writing ICC_Profile, 1 when writing +ColorSpace, or 4 when writing ColorSpecData) +
1 = Enumerated +
2 = Restricted ICC +
3 = Any ICC +
4 = Vendor Color
1ColorSpecPrecedenceint8s!(default for writing is 0)
2ColorSpecApproximationint8s!(default for writing is 0) +
0 = Not Specified +
1 = Accurate +
2 = Exceptional Quality +
3 = Reasonable Quality +
4 = Poor Quality
3ICC_Profile +
ColorSpace +
ColorSpecData
-
int32u!
undef!
--> ICC_Profile Tags +
+ +
0 = Bi-level +
1 = YCbCr(1) +
3 = YCbCr(2) +
4 = YCbCr(3) +
9 = PhotoYCC +
11 = CMY +
12 = CMYK +
13 = YCCK +
14 = CIELab +
15 = Bi-level(2)
  16 = sRGB +
17 = Grayscale +
18 = sYCC +
19 = CIEJab +
20 = e-sRGB +
21 = ROMM-RGB +
22 = YPbPr(1125/60) +
23 = YPbPr(1250/50) +
24 = e-sYCC
+
+ +

Jpeg2000 FileType Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0MajorBrandno'jp2 ' = JPEG 2000 Image (.JP2) +
'jpm ' = JPEG 2000 Compound Image (.JPM) +
'jpx ' = JPEG 2000 with extensions (.JPX) +
'jxl ' = JPEG XL Image (.JXL)
1MinorVersionno 
2CompatibleBrandsno 
+ +

Jpeg2000 ImageHeader Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ImageHeightno 
4ImageWidthno 
8NumberOfComponentsno 
10BitsPerComponentno 
11Compressionno +
0 = Uncompressed +
1 = Modified Huffman +
2 = Modified READ +
3 = Modified Modified READ +
4 = JBIG +
5 = JPEG +
6 = JPEG-LS +
7 = JPEG 2000 +
8 = JBIG2
+
+ +

Jpeg2000 JUMD Tags

+

Information extracted from the JUMBF description box.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'id'JUMDIDno 
'label'JUMDLabelno 
'sig'JUMDSignatureno 
'toggles'JUMDToggles?noBit 0 = Requestable +
Bit 1 = Label +
Bit 2 = ID +
Bit 3 = Signature
'type'JUMDTypeno 
+ +

Jpeg2000 CaptureResolution Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0CaptureYResolutionno 
4CaptureXResolutionno 
8CaptureYResolutionUnitno--> Jpeg2000 ResolutionUnit Values
9CaptureXResolutionUnitno--> Jpeg2000 ResolutionUnit Values
+ +

Jpeg2000 ResolutionUnit Values

+
+
+ + + + + + + + + + + + + + +
ValueResolutionUnitValueResolutionUnitValueResolutionUnit
-3= km1= 10 cm5= 0.01 mm
-2= 100 m2= cm6= um
-1= 10 m3= mm  
0= m4= 0.1 mm  
+ +

Jpeg2000 DisplayResolution Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0DisplayYResolutionno 
4DisplayXResolutionno 
8DisplayYResolutionUnitno--> Jpeg2000 ResolutionUnit Values
9DisplayXResolutionUnitno--> Jpeg2000 ResolutionUnit Values
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Nov 11, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Kodak.html b/html/TagNames/Kodak.html new file mode 100644 index 0000000..787f1fb --- /dev/null +++ b/html/TagNames/Kodak.html @@ -0,0 +1,5735 @@ + + + + +Kodak Tags + + + +

Kodak Tags

+

+Many Kodak models don't store the maker notes in standard IFD format, and +these formats vary with different models. Some information has been +decoded, but much of the Kodak information remains unknown. +

+

The table below contains the most common set of Kodak tags. The following +Kodak camera models have been tested and found to use these tags: C360, +C663, C875, CX6330, CX6445, CX7330, CX7430, CX7525, CX7530, DC4800, DC4900, +DX3500, DX3600, DX3900, DX4330, DX4530, DX4900, DX6340, DX6440, DX6490, +DX7440, DX7590, DX7630, EasyShare-One, LS420, LS443, LS633, LS743, LS753, +V530, V550, V570, V603, V610, V705, Z650, Z700, Z710, Z730, Z740, Z760 and +Z7590.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0KodakModelstring[8] 
9Qualityint8u1 = Fine +
2 = Normal
10BurstModeint8u0 = Off +
1 = On
12KodakImageWidthint16u 
14KodakImageHeightint16u 
16YearCreatedint16u 
18MonthDayCreatedint8u[2] 
20TimeCreatedint8u[4] 
24BurstMode2?int16u 
27ShutterModeint8u0 = Auto +
8 = Aperture Priority +
32 = Manual?
28MeteringModeint8u0 = Multi-segment +
1 = Center-weighted average +
2 = Spot
29SequenceNumberint8u 
30FNumberint16u 
32ExposureTimeint32u 
36ExposureCompensationint16s 
38VariousModes?int16u 
40Distance1?int32u 
44Distance2?int32u 
48Distance3?int32u 
52Distance4?int32u 
56FocusModeint8u0 = Normal +
2 = Macro
58VariousModes2?int16u 
60PanoramaMode?int16u 
62SubjectDistance?int16u 
64WhiteBalanceint8u0 = Auto +
1 = Flash? +
2 = Tungsten +
3 = Daylight
92FlashModeint8u + +
0x0 = Auto +
0x1 = Fill Flash +
0x2 = Off +
0x3 = Red-Eye
  0x10 = Fill Flash +
0x20 = Off +
0x40 = Red-Eye?
+
93FlashFiredint8u0 = No +
1 = Yes
94ISOSettingint16u 
96ISOint16u 
98TotalZoomint16u 
100DateTimeStampint16u 
102ColorModeint16u + +
0x1 = B&W +
0x2 = Sepia +
0x3 = B&W Yellow Filter +
0x4 = B&W Red Filter +
0x20 = Saturated Color
  0x40 = Neutral Color +
0x100 = Saturated Color +
0x200 = Neutral Color +
0x2000 = B&W +
0x4000 = Sepia
+
104DigitalZoomint16u 
107Sharpnessint8s0 = Normal
+ +

Kodak IFD Tags

+

These tags are found in a separate IFD of JPEG, TIFF, DCR and KDC images +from some older Kodak models such as the DC50, DC120, DCS760C, DCS Pro 14N, +14nx, SLR/n, Pro Back and Canon EOS D2000.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000KodakVersionint8u[4] 
0x0001UnknownEV?rational64u 
0x0003ExposureValuerational64u 
0x03e9OriginalFileNamestring 
0x03eaKodakTagint32u 
0x03ebSensorLeftBorderint16u 
0x03ecSensorTopBorderint16u 
0x03edSensorImageWidthint16u 
0x03eeSensorImageHeightint16u 
0x03efBlackLevelTopint16u 
0x03f0BlackLevelBottomint16u 
0x03f1TextualInfo---> Kodak TextualInfo Tags
0x03f2FlashMode?int16u 
0x03f3FlashCompensationrational64s 
0x03f4WindMode?int16u 
0x03f5FocusMode?int16u 
0x03f8MinAperturerational64u 
0x03f9MaxAperturerational64u 
0x03faWhiteBalanceMode?int16u 
0x03fbWhiteBalanceDetected?int16u 
0x03fcWhiteBalanceint16u 
0x03fdProcessing +
ProcessingParameters
-
no
--> Kodak Processing Tags
0x03feImageAbsoluteXint16s 
0x03ffImageAbsoluteYint16s 
0x0400ApplicationKeyStringstring 
0x0401Timestring 
0x0402GPSStringstring 
0x0403EventLogCapture?no 
0x0404ComponentTable?no 
0x0405CustomIlluminant?int16u 
0x0406CameraTemperature +
CameraTemperature
rational64s
no
 
0x0407AdapterVoltagerational64u 
0x0408BatteryVoltagerational64u 
0x0409DacVoltagesno 
0x040aIlluminantDetectorData?no 
0x040bPixelClockFrequencyint32u 
0x040cCenterPixelint16u[3] 
0x040dBurstCountint16u 
0x040eBlackLevelRoughint16u 
0x040fOffsetMapHorizontal?no 
0x0410OffsetMapVertical?no 
0x0411Histogram?no 
0x0412VerticalClockOverlapsint16u[2] 
0x0413SensorTemperatureno 
0x0414XilinxVersionstring 
0x0415FirmwareVersionint32u 
0x0416BlackLevelRoughAfterint16u 
0x0417BrightRowsTopno 
0x0418EventLogProcessno 
0x0419DacVoltagesFlushno 
0x041aFlashUsedno 
0x041bFlashTypeno 
0x041cSelfTimerno 
0x041dAFModeno 
0x041eLensTypeno 
0x041fImageCropXint16s 
0x0420ImageCropYint16s 
0x0421AdjustedTbnImageWidthno 
0x0422AdjustedTbnImageHeightno 
0x0423IntegrationTimeint32u 
0x0424BracketingModeno 
0x0425BracketingStepno 
0x0426BracketingCounterno 
0x042eHuffmanTableLengthno 
0x042fHuffmanTableValueno 
0x0438MainBoardVersionint32u 
0x0439ImagerBoardVersionint32u 
0x044cFocusEdgeMapno 
0x05e6IdleTimingno 
0x05e7FlushTimingno 
0x05e8IntegrateTimingno 
0x05e9RegisterReadTimingno 
0x05eaFirstLineTransferTimingno 
0x05ebShiftTimingno 
0x05ecNormalLineTransferTimingno 
0x05edTestTransferTimingno 
0x05faMinimumFlushRowsno 
0x05fdImagerPowerOnDelayMsecint32u 
0x05feImagerInitialTimingCodeno 
0x05ffImagerLogicProgramno 
0x0600ImagerBiasSettlingDelayMsecint32u 
0x0604IdleSequenceno 
0x0605FirstFlushSequenceno 
0x0606FinalFlushSequenceno 
0x0607SampleBlackSequenceno 
0x0608TransferSequenceno 
0x060eDacCountsPerVoltno 
0x060fBlackDacChannelno 
0x0610BlackAdCountsPerDacVoltno 
0x0611BlackTargetno 
0x0612BlackDacSettlingMsecno 
0x07d0StandardMatrixDaylightrational64s[9] 
0x07d1StandardMatrixTungstenrational64s[9] 
0x07d2StandardMatrixFluorescentrational64s[9] 
0x07d3StandardMatrixFlashrational64s[9] 
0x07d4StandardMatrixCustomrational64s[9] 
0x07daDeviantMatrixDaylightrational64s[9] 
0x07dbDeviantMatrixTungstenrational64s[9] 
0x07dcDeviantMatrixFluorescentrational64s[9] 
0x07ddDeviantMatrixFlashrational64s[9] 
0x07deDeviantMatrixCustomrational64s[9] 
0x07e4UniqueMatrixDaylightrational64s[9] 
0x07e5UniqueMatrixTungstenrational64s[9] 
0x07e6UniqueMatrixFluorescentrational64s[9] 
0x07e7UniqueMatrixFlashrational64s[9] 
0x07e8UniqueMatrixCustomrational64s[9] 
0x07e9UniqueMatrixAutorational64s[9] 
0x0834StandardWhiteDaylightrational64s[3] 
0x0835StandardWhiteTungstenrational64s[3] 
0x0836StandardWhiteFluorescentrational64s[3] 
0x0837StandardWhiteFlashrational64s[3] 
0x0838StandardWhiteCustomrational64s[3] 
0x083eDeviantWhiteDaylightrational64s[3] 
0x083fDeviantWhiteTungstenrational64s[3] 
0x0840DeviantWhiteFluorescentrational64s[3] 
0x0841DeviantWhiteFlashrational64s[3] 
0x0842DeviantWhiteCustomrational64s[3] 
0x0846ColorTemperatureint16u 
0x0847WB_RGBLevelsAsShotno 
0x0848WB_RGBLevelsDaylightno 
0x0849WB_RGBLevelsTungstenno 
0x084aWB_RGBLevelsFluorescentno 
0x084bWB_RGBLevelsFlashno 
0x084cWB_RGBLevelsCustomno 
0x084dWB_RGBLevelsAutono 
0x0852WB_RGBMulDaylightrational64u[3] 
0x0853WB_RGBMulTungstenrational64u[3] 
0x0854WB_RGBMulFluorescentrational64u[3] 
0x0855WB_RGBMulFlashrational64u[3] 
0x085cWB_RGBCoeffsDaylightno 
0x085dWB_RGBCoeffsTungstenno 
0x085eWB_RGBCoeffsFluorescentno 
0x085fWB_RGBCoeffsFlashno 
0x0898ExposureGainDaylightrational64s 
0x0899ExposureGainTungstenrational64s 
0x089aExposureGainFluorescentrational64s 
0x089bExposureGainFlashrational64s 
0x089cExposureGainCustomrational64s 
0x089dAnalogISOTablerational64u[3] 
0x089eAnalogCaptureISOint32u 
0x089fISOCalibrationGainrational64u 
0x08a0ISOCalibrationGainTableno 
0x08a1ExposureHeadroomFactorno 
0x08abLinearitySplineTagsno 
0x08fcMonitorMatrixrational64s[9] 
0x08fdTonScaleTableno 
0x08feGammarational64u 
0x08ffLogLinTableno 
0x0900LinLogTableno 
0x0901GammaTableno 
0x0902LogScalerational64u 
0x0903BaseISOrational64u 
0x0904LinLogCoringint16u 
0x0905PatternGainConversionTableno 
0x0906DefectCountno 
0x0907DefectListno 
0x0908DefectListPackedno 
0x0909ImageSpaceint16u 
0x090aThumbnailCompressionTableno 
0x090bThumbnailExpansionTableno 
0x090cImageCompressionTableno 
0x090dImageExpansionTableno 
0x090eEighteenPercentPointno 
0x090fDefectIsoCodeint16u 
0x0910BaseISODaylightrational64u 
0x0911BaseISOTungstenrational64u 
0x0912BaseISOFluorescentrational64u 
0x0913BaseISOFlashrational64u 
0x091aMatrixSelectThresholdint16s 
0x091bMatrixSelectKrational64u 
0x091cIlluminantDetectTableno 
0x091dRGTableno 
0x091eMatrixSelectThreshold1int16s 
0x091fMatrixSelectThreshold2int16s 
0x0924PortraitMatrixno 
0x0925PortraitToneScaleTableno 
0x092eEnableSharpeningint16u 
0x092fSharpeningKernelint16s[25] 
0x0930EdgeMapSlopeint16u 
0x0931EdgeMapX1int16u 
0x0932EdgeMapX2int16u 
0x0933KernelDenominatorsint16u[3] 
0x0934EdgeMapX3int16u 
0x0935EdgeMapX4int16u 
0x0936SharpenForThumbnailno 
0x0937EdgeSplineno 
0x0938DownSampleBy2Horno 
0x0939DownSampleBy2Verno 
0x093aDownSampleBy4Horno 
0x093bDownSampleBy4Verno 
0x093cDownSampleBy3Horno 
0x093dDownSampleBy3Verno 
0x093eDownSampleBy6Horno 
0x093fDownSampleBy6Verno 
0x0940DownSampleBy2Hor3MPdcrno 
0x0941DownSampleBy2Ver3MPdcrno 
0x0942ThumbnailResizeRationo 
0x0943AtCaptureUserCropint32u[4] 
0x0944ImageResolutionint32u 
0x0945ImageResolutionJpgint32u 
0x094cUSMParametersLowno 
0x094dUSMParametersMedno 
0x094eUSMParametersHighno 
0x094fUSMParametersHostno 
0x0950EdgeSplineLowno 
0x0951EdgeSplineMedno 
0x0952EdgeSplineHighno 
0x0953USMParametersHost6MPno 
0x0954USMParametersHost3MPno 
0x0960PatternImagerWidthint16u 
0x0961PatternImagerHeightint16u 
0x0962PatternAreaWidthint16u 
0x0963PatternAreaHeightint16u 
0x0964PatternCorrectionGainsno 
0x0965PatternCorrectionOffsetsno 
0x0966PatternXint16u 
0x0967PatternYint16u 
0x0968PatternCorrectionFactorsno 
0x0969PatternCorrectionFactorScaleint16u 
0x096aPatternCropRows1int16u 
0x096bPatternCropRows2int16u 
0x096cPatternCropCols1int16u 
0x096dPatternCropCols2int16u 
0x096ePixelCorrectionGainsno 
0x096fStitchRowsno 
0x0970StitchColumnsno 
0x0971PixelCorrectionScaleint16u 
0x0972PixelCorrectionOffsetint16u 
0x0988LensTableIndexno 
0x0992DiffTileGains602832no 
0x0993DiffTileGains24t852822no 
0x099cTileGainDeterminationTableno 
0x099dNemoBlurKernelno 
0x099eNemoTileSizeno 
0x099fNemoGainFactorsno 
0x09a0NemoDarkLimitno 
0x09a1NemoHighlight12Limitno 
0x09c4ImagerFileProductionLevelint16u 
0x09c5ImagerFileDateCreatedint32u 
0x09c6CalibrationVersionstring 
0x09c7ImagerFileTagsVersionStandardint16u 
0x09c8IFCameraModelstring 
0x09c9CalibrationHistorystring 
0x09caCalibrationLogno 
0x09ceSensorSerialNumberstring 
0x09f6DefectConcealArtCorrectThresno 
0x09f7SglColDCACThres1no 
0x09f8SglColDCACThres2no 
0x09f9SglColDCACTHres3no 
0x0a01DblColDCACThres1no 
0x0a02DblColDCACThres2no 
0x0a0aDefectConcealThresTableno 
0x0a28MonoUniqueMatrixno 
0x0a29MonoMonitorMatrixno 
0x0a2aMonoToneScaleTableno 
0x0a5aOmenInitialScalingno 
0x0a5bOmenInitialRowsno 
0x0a5cOmenInitialColumnsno 
0x0a5dOmenInitialIPFStrengthint32s[4] 
0x0a5eOmenEarlyStrengthint32s[4] 
0x0a5fOmenAutoStrengthint32s[4] 
0x0a60OmenAtCaptureStrengthint32s[4] 
0x0a61OmenAtCaptureModeno 
0x0a62OmenFocalLengthLimitint16s 
0x0a64OmenSurfaceIndexint16s 
0x0a65OmenPercentToRationalLimitsRedno 
0x0a66OmenPercentToRationalLimitsGoRno 
0x0a67OmenPercentToRationalLimitsBlueno 
0x0a68OmenPercentToRationalLimitsGoBno 
0x0a6eOmenEarlyGoBSurfaceno 
0x0a6fOmenEarlyGoBRowsno 
0x0a70OmenEarlyGoBColumnsno 
0x0a73OmenSmoothingKernelno 
0x0a74OmenGradientOffsetno 
0x0a75OmenGradientKernelno 
0x0a76OmenGradientKernelTapsno 
0x0a77OmenRatioClipFactorsno 
0x0a78OmenRatioExclusionFactorsno 
0x0a79OmenGradientExclusionLimitsno 
0x0a7aOmenROICoordinatesno 
0x0a7bOmenROICoefficientsno 
0x0a7cOmenRangeWeightingno 
0x0a7dOmenMeanToStrengthno 
0x0bb8FactoryWhiteGainsDaylightno 
0x0bb9FactoryWhiteOffsetsDaylightno 
0x0bbaDacGainsCoarseno 
0x0bbbDacGainsFineno 
0x0bbcDigitalExposureGainsno 
0x0bbdDigitalExposureBiasesno 
0x0bbeBlackClampno 
0x0bbfChannelCoarseGainAdjustno 
0x0bc0BlackClampOffsetno 
0x0bf4DMPixelThresholdFactorno 
0x0bf5DMWindowThresholdFactorno 
0x0bf6DMTrimFractionno 
0x0bf7DMSmoothRejThreshno 
0x0bf8DMFillRejThreshno 
0x0bf9VMWsizeno 
0x0bfaDMErodeRadiusno 
0x0bfbDMNumPatchesno 
0x0bfcDMNoiseScaleno 
0x0bfeBrightDefectThresholdno 
0x0bffBrightDefectIntegrationMSno 
0x0c00BrightDefectIsoCodeno 
0x0c03TopDarkRow1no 
0x0c04TopDarkRow2no 
0x0c05BottomDarkRow1no 
0x0c06BottomDarkRow2no 
0x0c07LeftDarkCol1no 
0x0c08LeftDarkCol2no 
0x0c09RightDarkCol1no 
0x0c0aRightDarkCol2no 
0x0c0bHMPixThreshno 
0x0c0cHMColThreshno 
0x0c0dHMWsizeno 
0x0c0eHMColRejThreshno 
0x0c0fVMPixThreshno 
0x0c10VMColThreshno 
0x0c11VMNbandsno 
0x0c12VMColDropThreshno 
0x0c13VMPatchResLimitno 
0x0c14MapScaleno 
0x0c1cKlutno 
0x0c1dRimNonlinearityno 
0x0c1eInverseRimNonlinearityno 
0x0c1fRembrandtToneScaleno 
0x0c20RimToNifColorTransformno 
0x0c21RimToNifScaleFactorno 
0x0c22NifNonlinearityno 
0x0c23SBALogTransformno 
0x0c24InverseSBALogTransformno 
0x0c25SBABlackint16u 
0x0c26SBAGrayint16u 
0x0c27SBAWhiteint16u 
0x0c28GaussianWeightsno 
0x0c29SfsBoundaryno 
0x0c2aCoringTableBestno 
0x0c2bCoringTableBetterno 
0x0c2cCoringTableGoodno 
0x0c2dExposureReferenceGainno 
0x0c2eExposureReferenceOffsetno 
0x0c2fSBARedBalanceLutno 
0x0c30SBAGreenBalanceLutno 
0x0c31SBABlueBalanceLutno 
0x0c32SBANeutralBALint32s 
0x0c33SBAGreenMagentaBALint32s 
0x0c34SBAIlluminantBALint32s 
0x0c35SBAAnalysisCompleteint8u 
0x0c36JPEGQTableBestno 
0x0c37JPEGQTableBetterno 
0x0c38JPEGQTableGoodno 
0x0c39RembrandtPortraitToneScaleno 
0x0c3aRembrandtConsumerToneScaleno 
0x0c3bCFAGreenThreshold1no 
0x0c3cCFAGreenThreshold2no 
0x0c3dQTableLarge50Pctno 
0x0c3eQTableLarge67Pctno 
0x0c3fQTableLarge100Pctno 
0x0c40QTableMedium50Pctno 
0x0c41QTableMedium67Pctno 
0x0c42QTableMedium100Pctno 
0x0c43QTableSmall50Pctno 
0x0c44QTableSmall67Pctno 
0x0c45QTableSmall100Pctno 
0x0c46SBAHighGrayint16u 
0x0c47SBALowGrayint16u 
0x0c48CaptureLookint16u 
0x0c49SBAIllOffsetint16s 
0x0c4aSBAGmOffsetint16s 
0x0c4bNifNonlinearity12Bitno 
0x0c4cSharpeningOnno 
0x0c4dNifNonlinearity16Bitno 
0x0c4eRawHistogramno 
0x0c4fRawCFAComponentAveragesno 
0x0c50DisableFlagsPresentno 
0x0c51DelayColsno 
0x0c52DummyColsLeftno 
0x0c53TrashColsRightno 
0x0c54BlackColsRightno 
0x0c55DummyColsRightno 
0x0c56OverClockColsRightno 
0x0c57UnusedBlackRowsTopOutno 
0x0c58TrashRowsBottomno 
0x0c59BlackRowsBottomno 
0x0c5aOverClockRowsBottomno 
0x0c5bBlackColsLeftno 
0x0c5cBlackRowsTopno 
0x0c5dPartialActiveColsLeftno 
0x0c5ePartialActiveColsRightno 
0x0c5fPartialActiveRowsTopno 
0x0c60PartialActiveRowsBottomno 
0x0c61ProcessBorderColsLeftint16u 
0x0c62ProcessBorderColsRightint16u 
0x0c63ProcessBorderRowsTopint16u 
0x0c64ProcessBorderRowsBottomint16u 
0x0c65ActiveColsno 
0x0c66ActiveRowsno 
0x0c67FirstLinesno 
0x0c68UnusedBlackRowsTopInno 
0x0c69UnusedBlackRowsBottomInno 
0x0c6aUnusedBlackRowsBottomOutno 
0x0c6bUnusedBlackColsLeftOutno 
0x0c6cUnusedBlackColsLeftInno 
0x0c6dUnusedBlackColsRightInno 
0x0c6eUnusedBlackColsRightOutno 
0x0c6fCFAOffsetRowsint32u 
0x0c70ShiftColsint16s 
0x0c71CFAOffsetColsint32u 
0x0c76DarkMapScaleno 
0x0c77HMapHandlingno 
0x0c78VMapHandlingno 
0x0c79DarkThresholdno 
0x0c7aDMDitherMatrixint16u 
0x0c7bDMDitherMatrixWidthint16u 
0x0c7cDMDitherMatrixHeightint16u 
0x0c7dMaxPixelValueThresholdint16u 
0x0c7eHoleFillDeltaThresholdint16u 
0x0c7fDarkPedestalint16u 
0x0c80ImageProcessingFileTagsVersionNumberint16u 
0x0c81ImageProcessingFileDateCreatedstring 
0x0c82DoublingMicrovoltsint32s 
0x0c83DarkFrameShortExposureint32u 
0x0c84DarkFrameLongExposureint32u 
0x0c85DarkFrameCountFactorrational64u 
0x0c88HoleFillDarkDeltaThresholdint16u 
0x0c89FarkleWhiteThresholdno 
0x0c8aColumnResetOffsetsno 
0x0c8bColumnGainFactorsno 
0x0c8cChannel0LagKernelno 
0x0c8dChannel1LagKernelno 
0x0c8eChannel2LagKernelno 
0x0c8fChannel3LagKernelno 
0x0c90BluegrassTableno 
0x0c91BluegrassScale1no 
0x0c92BluegrassScale2no 
0x0ce4FinishedFileProcessingRequestno 
0x0ce5FirmwareVersionstring 
0x0ce6HostSoftwareExportVersionno 
0x0ce7HostSoftwareRenderingint32u0 = Normal (sRGB) +
1 = Linear (camera RGB) +
2 = Pro Photo RGB +
3 = Unknown +
4 = Other Profile
0x0dacDCS3XXProcessingInfoIFDno 
0x0dadDCS3XXProcessingInfono 
0x0daeIPAVersionint32u 
0x0db6FinishIPAVersionno 
0x0db7FinishIPFVersionno 
0x0db8FinishFileTypeint32u0 = JPEG Best +
1 = JPEG Better +
2 = JPEG Good +
3 = TIFF RGB
0x0db9FinishResolutionint32u0 = 100% +
1 = 67% +
2 = 50% +
3 = 25%
0x0dbaFinishNoiseint32u0 = Normal +
1 = Strong +
2 = Low
0x0dbbFinishSharpeningint32u0 = None +
1 = High +
2 = Medium +
3 = Low
0x0dbcFinishLookint32u +
0 = Product +
1 = Portrait +
2 = Product Reduced +
3 = Portrait Reduced +
4 = Monochrome Product +
5 = Monochrome Portrait +
6 = Wedding +
7 = Event +
8 = Product Hi Color +
9 = Portrait Hi Color +
10 = Product Hi Color Hold +
11 = Portrait Hi Color Hold +
13 = DCS BW Normal +
14 = DCS BW Wratten 8 +
15 = DCS BW Wratten 25 +
16 = DCS Sepia 1 +
17 = DCS Sepia 2
+
0x0dbdFinishExposureint32u0 = Yes +
1 = No
0x0e0bSigmaScalingFactorLowResrational64u 
0x0e0cSigmaScalingFactorCamerarational64u 
0x0e0dSigmaImpulseParametersint16u[n] 
0x0e0eSigmaNoiseThreshTableV2no 
0x0e0fSigmaSizeTableint16u[n] 
0x0e10DacGainsCoarseAdjPreIF41no 
0x0e11SigmaNoiseFilterCalTableV1no 
0x0e12SigmaNoiseFilterTableV1no 
0x0e13Lin12ToKlut8no 
0x0e14SigmaNoiseFilterTableV1Versionno 
0x0e15Lin12ToKlut12no 
0x0e16Klut12ToLin12no 
0x0e17NifNonlinearity12To16no 
0x0e18SBALog12Transformno 
0x0e19InverseSBALog12Transformno 
0x0e1aToneScale0no 
0x0e1bToneScale1no 
0x0e1cToneScale2no 
0x0e1dToneScale3no 
0x0e1eToneScale4no 
0x0e1fToneScale5no 
0x0e20ToneScale6no 
0x0e21ToneScale7no 
0x0e22ToneScale8no 
0x0e23ToneScale9no 
0x0e24DayMat0no 
0x0e25DayMat1no 
0x0e26DayMat2no 
0x0e27DayMat3no 
0x0e28DayMat4no 
0x0e29DayMat5no 
0x0e2aDayMat6no 
0x0e2bDayMat7no 
0x0e2cDayMat8no 
0x0e2dDayMat9no 
0x0e2eTungMat0no 
0x0e2fTungMat1no 
0x0e30TungMat2no 
0x0e31TungMat3no 
0x0e32TungMat4no 
0x0e33TungMat5no 
0x0e34TungMat6no 
0x0e35TungMat7no 
0x0e36TungMat8no 
0x0e37TungMat9no 
0x0e38FluorMat0no 
0x0e39FluorMat1no 
0x0e3aFluorMat2no 
0x0e3bFluorMat3no 
0x0e3cFluorMat4no 
0x0e3dFluorMat5no 
0x0e3eFluorMat6no 
0x0e3fFluorMat7no 
0x0e40FluorMat8no 
0x0e41FluorMat9no 
0x0e42FlashMat0no 
0x0e43FlashMat1no 
0x0e44FlashMat2no 
0x0e45FlashMat3no 
0x0e46FlashMat4no 
0x0e47FlashMat5no 
0x0e48FlashMat6no 
0x0e49FlashMat7no 
0x0e4aFlashMat8no 
0x0e4bFlashMat9no 
0x0e4cKodakLookstring 
0x0e4dIPFCameraModelstring 
0x0e4eAH2GreenInterpolationThresholdint16u 
0x0e4fResamplingKernelDenominators067int16u[3] 
0x0e50ResamplingKernelDenominators050int16u[3] 
0x0e51ResamplingKernelDenominators100int16u[3] 
0x0e56LookMat0no 
0x0e57LookMat1no 
0x0e58LookMat2no 
0x0e59LookMat3no 
0x0e5aLookMat4no 
0x0e5bLookMat5no 
0x0e5cLookMat6no 
0x0e5dLookMat7no 
0x0e5eLookMat8no 
0x0e5fLookMat9no 
0x0e60CFAInterpolationAlgorithmint16u0 = AH2 +
1 = Karnak
0x0e61CFAInterpolationMetricint16u0 = Linear12 +
1 = KLUT12
0x0e62CFAZipperFixThresholdint16u 
0x0e63NoiseReductionParametersKhufuRGBint16u[9] 
0x0e64NoiseReductionParametersKhufu6MPint16u[9] 
0x0e65NoiseReductionParametersKhufu3MPint16u[9] 
0x0e6aChromaNoiseHighFThreshint32u[2] 
0x0e6bChromaNoiseLowFThreshint32u[2] 
0x0e6cChromaNoiseEdgeMapThreshint32u 
0x0e6dChromaNoiseColorSpaceint32u 
0x0e6eEnableChromaNoiseReductionint16u 
0x0e6fNoiseReductionParametersHostRGBint16u[9] 
0x0e70NoiseReductionParametersHost6MPint16u[9] 
0x0e71NoiseReductionParametersHost3MPint16u[9] 
0x0e72NoiseReductionParametersCameraint16u[6] 
0x0e73NoiseReductionParametersAtCaptureint16u[6] 
0x0e74LCDMatrixrational64s[9] 
0x0e75LCDMatrixChickFixrational64s[9] 
0x0e76LCDMatrixMarvinrational64s[9] 
0x0e7cLCDGammaTableChickFixno 
0x0e7dLCDGammaTableMarvinno 
0x0e7eLCDGammaTableno 
0x0e7fLCDSharpeningF1no 
0x0e80LCDSharpeningF2no 
0x0e81LCDSharpeningF3no 
0x0e82LCDSharpeningF4no 
0x0e83LCDEdgeMapX1no 
0x0e84LCDEdgeMapX2no 
0x0e85LCDEdgeMapX3no 
0x0e86LCDEdgeMapX4no 
0x0e87LCDEdgeMapSlopeno 
0x0e88YCrCbMatrixno 
0x0e89LCDEdgeSplineno 
0x0e92Fac18Perint16u 
0x0e93Fac170Perint16u 
0x0e94Fac100Perint16u 
0x0e9bExtraTickLocationsno 
0x0e9cRGBtoeV0no 
0x0e9dRGBtoeV1no 
0x0e9eRGBtoeV2no 
0x0e9fRGBtoeV3no 
0x0ea0RGBtoeV4no 
0x0ea1RGBtoeV5no 
0x0ea2RGBtoeV6no 
0x0ea3RGBtoeV7no 
0x0ea4RGBtoeV8no 
0x0ea5RGBtoeV9no 
0x0ea6LCDHistLUT0no 
0x0ea7LCDHistLUT1no 
0x0ea8LCDHistLUT2no 
0x0ea9LCDHistLUT3no 
0x0eaaLCDHistLUT4no 
0x0eabLCDHistLUT5no 
0x0eacLCDHistLUT6no 
0x0eadLCDHistLUT7no 
0x0eaeLCDHistLUT8no 
0x0eafLCDHistLUT9no 
0x0eb0LCDLinearClipValueno 
0x0eceLCDStepYvaluesno 
0x0ecfLCDStepYvaluesChickFixno 
0x0ed0LCDStepYvaluesMarvinno 
0x0ed8InterpolationCoefficientsno 
0x0ed9InterpolationCoefficients6MPno 
0x0edaInterpolationCoefficients3MPno 
0x0f00NoiseReductionParametersHostNormalno 
0x0f01NoiseReductionParametersHostStrongno 
0x0f02NoiseReductionParametersHostLowno 
0x0f0aMariahTextureThresholdint16u 
0x0f0bMariahMapLoThresholdint16u 
0x0f0cMariahMapHiThresholdint16u 
0x0f0dMariahChromaBlurSizeint16u 
0x0f0eMariahSigmaThresholdint16u 
0x0f0fMariahThresholdsno 
0x0f10MariahThresholdsNormalno 
0x0f11MariahThresholdsStrongno 
0x0f12MariahThresholdsLowno 
0x0f14KhufuLinearRedMixingCoefficientno 
0x0f15KhufuLinearGreenMixingCoefficientno 
0x0f16KhufuLinearBlueMixingCoefficientno 
0x0f17KhufuUSpaceC2MixingCoefficientno 
0x0f18KhufuSigmaGaussianWeightsno 
0x0f19KhufuSigmaScalingFactors6MPno 
0x0f1aKhufuSigmaScalingFactors3MPno 
0x0f1bKhufuSigmaScalingFactors14MPno 
0x0f32KhufuI0Thresholdsno 
0x0f33KhufuI1Thresholdsno 
0x0f34KhufuI2Thresholdsno 
0x0f35KhufuI3Thresholdsno 
0x0f36KhufuI4Thresholdsno 
0x0f37KhufuI5Thresholdsno 
0x0f3cCondadoDayBVThreshint16u 
0x0f3dCondadoNeuRangeint16u 
0x0f3eCondadoBVFactorint16s 
0x0f3fCondadoIllFactorint16s 
0x0f40CondadoTunThreshint16s 
0x0f41CondadoFluThreshint16s 
0x0f42CondadoDayOffsetsint16s[2] 
0x0f43CondadoTunOffsetsint16s[2] 
0x0f44CondadoFluOffsetsint16s[2] 
0x0f5aERIMMToCRGB0Splineno 
0x0f5bERIMMToCRGB1Splineno 
0x0f5cERIMMToCRGB2Splineno 
0x0f5dERIMMToCRGB3Splineno 
0x0f5eERIMMToCRGB4Splineno 
0x0f5fERIMMToCRGB5Splineno 
0x0f60ERIMMToCRGB6Splineno 
0x0f61ERIMMToCRGB7Splineno 
0x0f62ERIMMToCRGB8Splineno 
0x0f63ERIMMToCRGB9Splineno 
0x0f64CRGBToERIMM0Splineno 
0x0f65CRGBToERIMM1Splineno 
0x0f66CRGBToERIMM2Splineno 
0x0f67CRGBToERIMM3Splineno 
0x0f68CRGBToERIMM4Splineno 
0x0f69CRGBToERIMM5Splineno 
0x0f6aCRGBToERIMM6Splineno 
0x0f6bCRGBToERIMM7Splineno 
0x0f6cCRGBToERIMM8Splineno 
0x0f6dCRGBToERIMM9Splineno 
0x0f6eERIMMNonLinearitySplineno 
0x0f6fDelta12To8Splineno 
0x0f70Delta8To12Splineno 
0x0f71InverseMonitorMatrixno 
0x0f72NifNonlinearityExtno 
0x0f73InvNifNonLinearityno 
0x0f74RIMM13ToERIMM12Splineno 
0x0f78ToneScale0Splineno 
0x0f79ToneScale1Splineno 
0x0f7aToneScale2Splineno 
0x0f7bToneScale3Splineno 
0x0f7cToneScale4Splineno 
0x0f7dToneScale5Splineno 
0x0f7eToneScale6Splineno 
0x0f7fToneScale7Splineno 
0x0f80ToneScale8Splineno 
0x0f81ToneScale9Splineno 
0x0f82ERIMMToneScale0Splineno 
0x0f83ERIMMToneScale1Splineno 
0x0f84ERIMMToneScale2Splineno 
0x0f85ERIMMToneScale3Splineno 
0x0f86ERIMMToneScale4Splineno 
0x0f87ERIMMToneScale5Splineno 
0x0f88ERIMMToneScale6Splineno 
0x0f89ERIMMToneScale7Splineno 
0x0f8aERIMMToneScale8Splineno 
0x0f8bERIMMToneScale9Splineno 
0x0f8cRIMMToCRGB0Splineno 
0x0f8dRIMMToCRGB1Splineno 
0x0f8eRIMMToCRGB2Splineno 
0x0f8fRIMMToCRGB3Splineno 
0x0f90RIMMToCRGB4Splineno 
0x0f91RIMMToCRGB5Splineno 
0x0f92RIMMToCRGB6Splineno 
0x0f93RIMMToCRGB7Splineno 
0x0f94RIMMToCRGB8Splineno 
0x0f95RIMMToCRGB9Splineno 
0x0fa0QTableLarge25Pctno 
0x0fa1QTableMedium25Pctno 
0x0fa2QTableSmall25Pctno 
0x1130NoiseReductionKernelno 
0x1388UserMetaDatano 
0x1389InputProfileundef 
0x138aKodakLookProfileundef 
0x138bOutputProfileundef 
0x1390SourceProfilePrefixstring 
0x1391ToneCurveProfileNamestring 
0x1392InputProfile---> ICC_Profile Tags
0x1393ProcessParametersV2no 
0x1394ReservedBlob2no 
0x1395ReservedBlob3no 
0x1396ReservedBlob4no 
0x1397ReservedBlob5no 
0x1398ReservedBlob6no 
0x1399ReservedBlob7no 
0x139aReservedBlob8no 
0x139bReservedBlob9no 
0x1770ScriptVersionint32u 
0x177aImagerTimingDatano 
0x1784ISOint32u 
0x17a2Scav11Colsno 
0x17a3Scav12Colsno 
0x17a4Scav21Colsno 
0x17a5Scav22Colsno 
0x17a6ActiveCTEMonitor1Colsno 
0x17a7ActiveCTEMonitor2Colsno 
0x17a8ActiveCTEMonitorRowsno 
0x17a9ActiveBuf1Colsno 
0x17aaActiveBuf2Colsno 
0x17abActiveBuf1Rowsno 
0x17acActiveBuf2Rowsno 
0x17c0HRNoiseLinesno 
0x17c1RNoiseLinesno 
0x17c2ANoiseLinesno 
0x17d4ImagerColsint16u 
0x17deImagerRowsint16u 
0x17e8PartialActiveCols1int32u 
0x17f2PartialActiveCols2int32u 
0x17fcPartialActiveRows1int32u 
0x1806PartialActiveRows2int32u 
0x1810ElectricalBlackColumnsint32u 
0x181aResetBlackSegRowsint32u 
0x1838CaptureWidthNormalint32u 
0x1839CaptureHeightNormalint32u 
0x183aCaptureWidthResetBlackSegNormalno 
0x183bCaptureHeightResetBlackSegNormalno 
0x183cDarkRefOffsetNormalno 
0x1842CaptureWidthTestint32u 
0x1843CaptureHeightTestno 
0x1844CaptureWidthResetBlackSegTestno 
0x1845CaptureHeightResetBlackSegTestno 
0x1846DarkRefOffsetTestno 
0x184cImageSegmentStartLineint32u 
0x184dImageSegmentLinesint32u 
0x184eSkipLineTimeint32u 
0x1860FastResetLineTimeint32u 
0x186aNormalLineTimeint32u 
0x1874MinIntegrationRowsint32u 
0x187ePreReadFastResetCountint32u 
0x1888TransferTimeNormalint32u 
0x1889TransferTimeTestint32u 
0x188aQuietTimeint32u 
0x189cOverClockColsint16u 
0x18a6H2ResetBlackPixelsint32u 
0x18b0H3ResetBlackPixelsint32u 
0x18baBlackAcquireRowsint32u 
0x18c4OverClockRowsint16u 
0x18ceH3ResetBlackColumnsint32u 
0x18d8DarkBlackSegRowsint32u 
0x1900CrossbarEnableno 
0x1901FifoenOnePixelDelayint32u 
0x1902ReadoutTypeRequestedint32u 
0x1903ReadoutTypeActualint32u 
0x190aOffsetDacValueint32u 
0x1914TempAmpGainX100int32u 
0x191eVarrayDacNominalValuesint32u[3] 
0x1928VddimDacNominalValuesno 
0x1964C14Configurationint32u 
0x196eTDA1Offsetint32u[3] 
0x196fTDA1Bandwidthint32u 
0x1970TDA1Gainint32u[3] 
0x1971TDA1EdgePolarityint32u 
0x1978TDA2Offsetint32u[3] 
0x1979TDA2Bandwidthint32u 
0x197aTDA2Gainint32u[3] 
0x197bTDA2EdgePolarityint32u 
0x1982TDA3Offsetint32u[3] 
0x1983TDA3Bandwidthint32u 
0x1984TDA3Gainint32u[3] 
0x1985TDA3EdgePolarityint32u 
0x198cTDA4Offsetint32u[3] 
0x198dTDA4Bandwidthint32u 
0x198eTDA4Gainint32u[3] 
0x198fTDA4EdgePolarityint32u 
0xfde8ComLenBlkSizeint16u 
+ +

Kodak TextualInfo Tags

+

Below is a list of tags which have been observed in the Kodak TextualInfo +data, however ExifTool will extract information from any tags found here.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'AF Function'AFModeno 
'Actual Compensation'ActualCompensationno 
'Aperture'Apertureno 
'Auto Bracket'AutoBracketno 
'Brightness Value'BrightnessValueno 
'Camera'CameraModelno 
'Camera body'CameraBodyno 
'Compensation'ExposureCompensationno 
'Date'Dateno 
'Exposure Bias'ExposureBiasno 
'Exposure Mode'ExposureModeno'A' = Aperture Priority +
'B' = Bulb +
'M' = Manual +
'P' = Program +
'S' = Shutter Priority
'Firmware Version'FirmwareVersionno 
'Flash Compensation'FlashExposureCompno 
'Flash Fired'FlashFiredno 
'Flash Sync Mode'FlashSyncModeno 
'Focal Length'FocalLengthno 
'Height'KodakImageHeightno 
'ISO'ISOno 
'ISO Speed'ISOno 
'Image Number'ImageNumberno 
'Lens'Lensno 
'Max Aperture'MaxApertureno 
'Meter Mode'MeterModeno 
'Min Aperture'MinApertureno 
'Popup Flash'PopupFlashno 
'Serial Number'SerialNumberno 
'Shooting Mode'ShootingModeno 
'Shutter'ShutterSpeedno 
'Temperature'Temperatureno 
'Time'Timeno 
'White balance'WhiteBalanceno 
'Width'KodakImageWidthno 
'_other_info'OtherInfono(any other information without a tag name)
+ +

Kodak Processing Tags

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
20WB_RGBLevelsno 
+ +

Kodak Type2 Tags

+

These tags are used by the Kodak DC220, DC260, DC265 and DC290, +Hewlett-Packard PhotoSmart 618, C500 and C912, Pentax EI-200 and EI-2000, +and Minolta EX1500Z.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
8KodakMakerstring[32] 
40KodakModelstring[32] 
108KodakImageWidthint32u 
112KodakImageHeightint32u 
+ +

Kodak Type3 Tags

+

These tags are used by the DC240, DC280, DC3400 and DC5000.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
12YearCreatedint16u 
14MonthDayCreatedint8u[2] 
16TimeCreatedint8u[4] 
30OpticalZoomint16u 
55Sharpnessint8s0 = Normal
56ExposureTimeint32u 
60FNumberint16u 
78ISOint16u 
+ +

Kodak Type4 Tags

+

These tags are used by the DC200 and DC215.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
32OriginalFileNamestring[12] 
+ +

Kodak Type5 Tags

+

These tags are used by the CX4200, CX4210, CX4230, CX4300, CX4310, CX6200 +and CX6230.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
20ExposureTimeint32u 
26WhiteBalanceint8u1 = Daylight +
2 = Flash +
3 = Tungsten
28FNumberint16u 
30ISOint16u 
32OpticalZoomint16u 
34DigitalZoomint16u 
39FlashModeint8u0 = Auto +
1 = On +
2 = Off +
3 = Red-Eye
42ImageRotatedint8u0 = No +
1 = Yes
43Macroint8u0 = On +
1 = Off
+ +

Kodak Type6 Tags

+

These tags are used by the DX3215 and DX3700.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
16ExposureTimeint32u 
20ISOSetting?int32u 
24FNumberint16u 
26ISOint16u 
28OpticalZoomint16u 
30DigitalZoomint16u 
34Flashint16u0 = No Flash +
1 = Fired
+ +

Kodak Type7 Tags

+

The maker notes of models such as the C340, C433, CC533, LS755, V803 and +V1003 seem to start with the camera serial number. The C310, C315, C330, +C643, C743, CD33, CD43, CX7220 and CX7300 maker notes are also decoded using +this table, although the strings for these cameras don't conform to the +usual Kodak serial number format, and instead have the model name followed +by 8 digits.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0SerialNumberstring[16] 
+ +

Kodak Type8 Tags

+

Kodak models such as the ZD710, P712, P850, P880, V1233, V1253, V1275, +V1285, Z612, Z712, Z812, Z885 use standard TIFF IFD format for the maker +notes. In keeping with Kodak's strategy of inconsistent makernotes, models +such as the M380, M1033, M1093, V1073, V1273, Z1012, Z1085 and Z8612 +also use these tags, but these makernotes begin with a TIFF header instead +of an IFD entry count and use relative instead of absolute offsets. There +is a large amount of information stored in these maker notes (apparently +with much duplication), but relatively few tags have so far been decoded.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0xfc00SubIFD0---> Kodak SubIFD0 Tags +
--> Kodak SubIFD0 Tags
0xfc01SubIFD1---> Kodak SubIFD1 Tags +
--> Kodak SubIFD1 Tags
0xfc02SubIFD2---> Kodak SubIFD2 Tags +
--> Kodak SubIFD2 Tags
0xfc03SubIFD3---> Kodak SubIFD3 Tags +
--> Kodak SubIFD3 Tags
0xfc04SubIFD4---> Kodak SubIFD4 Tags +
--> Kodak SubIFD4 Tags
0xfc05SubIFD5---> Kodak SubIFD5 Tags +
--> Kodak SubIFD5 Tags
0xfc06SubIFD6---> Kodak SubIFD6 Tags +
--> Kodak SubIFD6 Tags
0xfcffSubIFD255---> Kodak SubIFD0 Tags
0xff00CameraInfo---> Kodak CameraInfo Tags
+ +

Kodak SubIFD0 Tags

+

SubIFD0 through SubIFD5 tags are written a number of newer Kodak models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0xfa02SceneModeint16u(may not be valid for some models) + +
1 = Sport +
3 = Portrait +
4 = Landscape +
6 = Beach +
7 = Night Portrait +
8 = Night Landscape +
9 = Snow +
10 = Text +
11 = Fireworks +
12 = Macro +
13 = Museum +
16 = Children
  17 = Program +
18 = Aperture Priority +
19 = Shutter Priority +
20 = Manual +
25 = Back Light +
28 = Candlelight +
29 = Sunset +
31 = Panorama Left-right +
32 = Panorama Right-left +
33 = Smart Scene +
34 = High ISO
+
0xfa19SerialNumberstring 
0xfa1dKodakImageWidthint16u 
0xfa1eKodakImageHeightint16u 
0xfa20SensorWidthint16u 
0xfa21SensorHeightint16u 
0xfa23FNumberint16u 
0xfa24ExposureTimeint32u 
0xfa2eISOint16u 
0xfa3dOpticalZoomint16u 
0xfa46ISOint16u 
0xfa51KodakImageWidthint16u 
0xfa52KodakImageHeightint16u 
0xfa54ThumbnailWidthint16u 
0xfa55ThumbnailHeightint16u 
0xfa57PreviewImageWidthint16u 
0xfa58PreviewImageHeightint16u 
+ +

Kodak SubIFD1 Tags

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0027ISOint16u 
0x0028ISOint16u 
+ +

Kodak SubIFD2 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x6002SceneModeUsedint32u + +
0 = Program +
2 = Aperture Priority +
3 = Shutter Priority +
4 = Manual +
5 = Portrait +
6 = Sport +
7 = Children +
8 = Museum +
10 = High ISO +
11 = Text +
12 = Macro
  13 = Back Light +
16 = Landscape +
17 = Night Landscape +
18 = Night Portrait +
19 = Snow +
20 = Beach +
21 = Fireworks +
22 = Sunset +
23 = Candlelight +
28 = Panorama
+
0x6006OpticalZoomint32u 
0x6103MaxApertureint32u 
0xf002SceneModeUsedint32u + +
0 = Program +
2 = Aperture Priority +
3 = Shutter Priority +
4 = Manual +
5 = Portrait +
6 = Sport +
7 = Children +
8 = Museum +
10 = High ISO +
11 = Text +
12 = Macro
  13 = Back Light +
16 = Landscape +
17 = Night Landscape +
18 = Night Portrait +
19 = Snow +
20 = Beach +
21 = Fireworks +
22 = Sunset +
23 = Candlelight +
28 = Panorama
+
0xf006OpticalZoomint32u 
0xf103FNumberint32u 
0xf104ExposureTimeint32u 
0xf105ISOint32u 
+ +

Kodak SubIFD3 Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x1000OpticalZoomint16u 
+ +

Kodak SubIFD4 Tags

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

Kodak SubIFD5 Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x000fOpticalZoomint16u 
+ +

Kodak SubIFD6 Tags

+

SubIFD6 is written by the M580.

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

Kodak CameraInfo Tags

+

These tags are used by the P712, P850 and P880.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0xf900SensorWidthint16u(effective sensor size)
0xf901SensorHeightint16u 
0xf902BayerPatternstring 
0xf903SensorFullWidthint16u(includes black border?)
0xf904SensorFullHeightint16u 
0xf907KodakImageWidthint16u 
0xf908KodakImageHeightint16u 
0xfa00KodakInfoTypestring 
0xfa04SerialNumberstring 
0xfd04FNumberint16u 
0xfd05ExposureTimeint32u 
0xfd06ISOint16u 
+ +

Kodak Type9 Tags

+

These tags are used by the Kodak C140, C180, C913, C1013, M320, M340 and +M550, as well as various cameras marketed by other manufacturers.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
12FNumberint16u 
16ExposureTimeint32u 
20DateTimeOriginalstring[20] 
52ISOint16u 
87FirmwareVersionstring[16](Kodak only)
168UnknownNumberno(Kodak only)
196UnknownNumberno(Kodak only)
+ +

Kodak Type10 Tags

+

Another variation of the IFD-format type, this time with just a byte order +indicator instead of a full TIFF header. These tags are used by the Z980.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0002PreviewImageSizeint16u[2] 
0x0012ExposureTimeint32u 
0x0013FNumberint16u 
0x0014ISOint16u 
0x001dFocalLengthint32u 
+ +

Kodak Type11 Tags

+

These tags are found in models such as the PixPro S-1. They are not +writable because the inconsistency of Kodak maker notes is beginning to get +on my nerves.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0104FirmwareVersionno 
0x0203PictureEffectno0 = None +
3 = Monochrome +
9 = Kodachrome
0x0207KodakModelno 
0x0300KodakMakeno 
0x0308LensSerialNumberno 
0x0309LensModelno 
0x030dLevelMeter?no 
0x0311Pitchno 
0x0312Yawno 
0x0313Rollno 
0x0314CX?no 
0x0315CY?no 
0x0316Rads?no 
+ +

Kodak Unknown Tags

+
+
+ + + + +
Index1Tag NameWritableValues / Notes
[no tags known]
+ +

Kodak Meta Tags

+

These tags are found in the APP3 "Meta" segment of JPEG images from Kodak +cameras such as the DC280, DC3400, DC5000, MC3, M580, Z950 and Z981. The +structure of this segment is similar to the APP1 "Exif" segment, but a +different set of tags is used.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0xc350FilmProductCodeno 
0xc351ImageSourceEKno 
0xc352CaptureConditionsPARno 
0xc353CameraOwnerundef 
0xc354SerialNumberundef 
0xc355UserSelectGroupTitleno 
0xc356DealerIDNumberno 
0xc357CaptureDeviceFIDno 
0xc358EnvelopeNumberno 
0xc359FrameNumberno 
0xc35aFilmCategoryno 
0xc35bFilmGencodeno 
0xc35cModelAndVersionno 
0xc35dFilmSizeno 
0xc35eSBA_RGBShiftsno 
0xc35fSBAInputImageColorspaceno 
0xc360SBAInputImageBitDepthno 
0xc361SBAExposureRecordno 
0xc362UserAdjSBA_RGBShiftsno 
0xc363ImageRotationStatusno 
0xc364RollGuidElementsno 
0xc365MetadataNumberno 
0xc366EditTagArrayno 
0xc367Magnificationno 
0xc36cNativeXResolutionno 
0xc36dNativeYResolutionno 
0xc36eKodakEffectsIFD---> Kodak SpecialEffects Tags
0xc36fKodakBordersIFD---> Kodak Borders Tags
0xc37aNativeResolutionUnitno 
0xc418SourceImageDirectoryno 
0xc419SourceImageFileNameno 
0xc41aSourceImageVolumeNameno 
0xc46cPrintQualityno 
0xc46eImagePrintStatusno 
+ +

Kodak SpecialEffects Tags

+

+The Kodak SpecialEffects and Borders tags are found in sub-IFD's within the +Kodak JPEG APP3 "Meta" segment. +

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000DigitalEffectsVersionno 
0x0001DigitalEffectsNameno 
0x0002DigitalEffectsTypeno 
+ +

Kodak Borders Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000BordersVersionno 
0x0001BorderNameno 
0x0002BorderIDno 
0x0003BorderLocationno 
0x0004BorderTypeno 
0x0008WatermarkTypeno 
+ +

Kodak KDC_IFD Tags

+

These tags are found in a separate IFD of KDC images from some newer Kodak +models such as the P880 and Z1015IS.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0xfa00SerialNumberstring 
0xfa0dWhiteBalanceint8u0 = Auto +
1 = Fluorescent +
2 = Tungsten +
3 = Daylight +
6 = Shade
0xfa25WB_RGBLevelsAutono 
0xfa27WB_RGBLevelsTungstenno 
0xfa28WB_RGBLevelsFluorescentno 
0xfa29WB_RGBLevelsDaylightno 
0xfa2aWB_RGBLevelsShadeno 
+ +

Kodak frea Tags

+

Information stored in the "frea" atom of Kodak PixPro SP360 MP4 videos.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'scra'PreviewImageno 
'thma'ThumbnailImageno 
'tima'Durationno 
'ver 'KodakVersionno 
+ +

Kodak Free Tags

+

Information stored in the "free" atom of Kodak MP4 videos. (VERY bad form +for Kodak to store useful information in an atom intended for unused space!)

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'AprV'ApertureValueno 
'BrtV'BrightnessValueno 
'Expc'ExposureCompensationno 
'Expo'ExposureTimeno 
'FL35'FocalLengthIn35mmFormatno 
'FNum'FNumberno 
'FoLn'FocalLengthno 
'ISOS'ISOno 
'SVer'FirmwareVersionno 
'Scrn'PreviewInfo---> Kodak Scrn Tags
'Seri'SerialNumberno 
'StSV'ShutterSpeedValueno 
+ +

Kodak Scrn Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0PreviewImageWidthno 
1PreviewImageHeightno 
2PreviewImageLengthno 
4PreviewImageno 
+ +

Kodak DcMD Tags

+

Metadata directory found in MOV and MP4 videos from some Kodak cameras.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'CMbo'CameraByteOrderno'II' = Little-endian (Intel, II) +
'MM' = Big-endian (Motorola, MM)
'Cmbo'CameraByteOrderno'II' = Little-endian (Intel, II) +
'MM' = Big-endian (Motorola, MM)
'DcEM'DcEM---> Kodak DcEM Tags
'DcME'DcME---> Kodak DcME Tags
+ +

Kodak DcEM Tags

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

Kodak DcME Tags

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

Kodak MOV Tags

+

This information is found in the TAGS atom of MOV videos from Kodak models +such as the P880.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
22Modelno 
64ModelTypeno 
78ExposureTimeno 
82FNumberno 
90ExposureCompensationno 
112FocalLengthno 
+ +

Kodak pose Tags

+

Streamed orientation information from the PixPro 4KVR360, extracted as +sub-documents when the Duplicates option is used.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Accelerometer'Accelerometerno 
'AngularVelocity'AngularVelocityno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 8, 2019 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/KyoceraRaw.html b/html/TagNames/KyoceraRaw.html new file mode 100644 index 0000000..326b758 --- /dev/null +++ b/html/TagNames/KyoceraRaw.html @@ -0,0 +1,93 @@ + + + + +KyoceraRaw Tags + + + +

KyoceraRaw Tags

+

Tags for Kyocera Contax N Digital RAW images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1FirmwareVersionno 
12Modelno 
25Makeno 
33DateTimeOriginalno 
52ISOno + + + +
7 = 25 +
8 = 32 +
9 = 40 +
10 = 50
  11 = 64 +
12 = 80 +
13 = 100 +
14 = 125
  15 = 160 +
16 = 200 +
17 = 250 +
18 = 320
  19 = 400
+
56ExposureTimeno 
60WB_RGGBLevelsno 
88FNumberno 
104MaxApertureno 
112FocalLengthno 
124Lensno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Feb 17, 2006 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/LIF.html b/html/TagNames/LIF.html new file mode 100644 index 0000000..ecaa368 --- /dev/null +++ b/html/TagNames/LIF.html @@ -0,0 +1,30 @@ + + + + +LIF Tags + + + +

LIF Tags

+

Tags extracted from Leica Image Format (LIF) imaging files. As well as the +tags listed below, all available information is extracted from the +XML-format metadata in the LIF header.

+
+
+ + + + + + + +
Tag NameWritableValues / Notes
TimeStampListno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 22, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/LNK.html b/html/TagNames/LNK.html new file mode 100644 index 0000000..1800fc8 --- /dev/null +++ b/html/TagNames/LNK.html @@ -0,0 +1,479 @@ + + + + +LNK Tags + + + +

LNK Tags

+

Information extracted from MS Shell Link (Windows shortcut) files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0x0014Flagsno +
Bit 0 = IDList +
Bit 1 = LinkInfo +
Bit 2 = Description +
Bit 3 = RelativePath +
Bit 4 = WorkingDir +
Bit 5 = CommandArgs +
Bit 6 = IconFile +
Bit 7 = Unicode +
Bit 8 = NoLinkInfo +
Bit 9 = ExpString +
Bit 10 = SeparateProc +
Bit 12 = DarwinID +
Bit 13 = RunAsUser +
Bit 14 = ExpIcon +
Bit 15 = NoPidAlias +
Bit 17 = RunWithShim +
Bit 18 = NoLinkTrack +
Bit 19 = TargetMetadata +
Bit 20 = NoLinkPathTracking +
Bit 21 = NoKnownFolderTracking +
Bit 22 = NoKnownFolderAlias +
Bit 23 = LinkToLink +
Bit 24 = UnaliasOnSave +
Bit 25 = PreferEnvPath +
Bit 26 = KeepLocalIDList
+
0x0018FileAttributesno + +
Bit 0 = Read-only +
Bit 1 = Hidden +
Bit 2 = System +
Bit 3 = Volume +
Bit 4 = Directory +
Bit 5 = Archive +
Bit 6 = Encrypted? +
Bit 7 = Normal
  Bit 8 = Temporary +
Bit 9 = Sparse +
Bit 10 = Reparse point +
Bit 11 = Compressed +
Bit 12 = Offline +
Bit 13 = Not indexed +
Bit 14 = Encrypted
+
0x001cCreateDateno 
0x0024AccessDateno 
0x002cModifyDateno 
0x0034TargetFileSizeno 
0x0038IconIndexno 
0x003cRunWindowno +
0 = Hide +
1 = Normal +
2 = Show Minimized +
3 = Show Maximized +
4 = Show No Activate +
5 = Show +
6 = Minimized +
7 = Show Minimized No Activate +
8 = Show NA +
9 = Restore +
10 = Show Default
+
0x0040HotKeyno + +
0x0 = (none) +
0x90 = Num Lock +
0x91 = Scroll Lock +
0x100 = Shift +
0x200 = Control
  0x400 = Alt +
'0x30'-'0x39' = 0-9 +
'0x41'-'0x5a' = A-Z +
'0x70'-'0x87' = F1-F24
+
0x10000ItemID---> LNK ItemID Tags
0x20000LinkInfo---> LNK LinkInfo Tags
0x30004Descriptionno 
0x30008RelativePathno 
0x30010WorkingDirectoryno 
0x30020CommandLineArgumentsno 
0x30040IconFileNameno 
0xa0000000UnknownData---> LNK UnknownData Tags
0xa0000001EnvVarData---> LNK UnknownData Tags
0xa0000002ConsoleData---> LNK ConsoleData Tags
0xa0000003TrackerData---> LNK TrackerData Tags
0xa0000004ConsoleFEData---> LNK ConsoleFEData Tags
0xa0000005SpecialFolderData---> LNK UnknownData Tags
0xa0000006DarwinData---> LNK UnknownData Tags
0xa0000007IconEnvData---> LNK UnknownData Tags
0xa0000008ShimData---> LNK UnknownData Tags
0xa0000009PropertyStoreData---> LNK UnknownData Tags
0xa000000bKnownFolderData---> LNK UnknownData Tags
0xa000000cVistaIDListData---> LNK UnknownData Tags
+ +

LNK ItemID Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0032Item0032---> LNK Item0032 Tags
+ +

LNK Item0032 Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
14TargetFileDOSNameno 
+ +

LNK LinkInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
CommonNetworkRelLinkno 
CommonPathSuffixno 
DeviceNameno 
DriveSerialNumberno 
DriveTypeno + +
0 = Unknown +
1 = Invalid Root Path +
2 = Removable Media +
3 = Fixed Disk
  4 = Remote Drive +
5 = CD-ROM +
6 = Ram Disk
+
LocalBasePathno 
NetNameno 
NetProviderTypeno + +
0x1a0000 = AVID +
0x1b0000 = DOCUSPACE +
0x1c0000 = MANGOSOFT +
0x1d0000 = SERNET +
0x1e0000 = RIVERFRONT1 +
0x1f0000 = RIVERFRONT2 +
0x200000 = DECORB +
0x210000 = PROTSTOR +
0x220000 = FJ_REDIR +
0x230000 = DISTINCT +
0x240000 = TWINS +
0x250000 = RDR2SAMPLE +
0x260000 = CSC +
0x270000 = 3IN1 +
0x290000 = EXTENDNET +
0x2a0000 = STAC +
0x2b0000 = FOXBAT
  0x2c0000 = YAHOO +
0x2d0000 = EXIFS +
0x2e0000 = DAV +
0x2f0000 = KNOWARE +
0x300000 = OBJECT_DIRE +
0x310000 = MASFAX +
0x320000 = HOB_NFS +
0x330000 = SHIVA +
0x340000 = IBMAL +
0x350000 = LOCK +
0x360000 = TERMSRV +
0x370000 = SRT +
0x380000 = QUINCY +
0x390000 = OPENAFS +
0x3a0000 = AVID1 +
0x3b0000 = DFS
+
VolumeIDno 
VolumeLabelno 
+ +

LNK UnknownData Tags

+
+
+ + + + +
Index1Tag NameWritableValues / Notes
[no tags known]
+ +

LNK ConsoleData Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
8FillAttributesno 
10PopupFillAttributesno 
12ScreenBufferSizeno 
16WindowSizeno 
20WindowOriginno 
32FontSizeno 
36FontFamilyno + +
0x0 = Don't Care +
0x10 = Roman +
0x20 = Swiss
  0x30 = Modern +
0x40 = Script +
0x50 = Decorative
+
40FontWeightno 
44FontNameno 
108CursorSizeno 
112FullScreenno 
116QuickEditno 
120InsertModeno 
124WindowOriginAutono 
128HistoryBufferSizeno 
132NumHistoryBuffersno 
136RemoveHistoryDuplicatesno 
+ +

LNK TrackerData Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
16MachineIDno 
+ +

LNK ConsoleFEData Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
8CodePageno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Mar 17, 2012 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Leaf.html b/html/TagNames/Leaf.html new file mode 100644 index 0000000..6decf56 --- /dev/null +++ b/html/TagNames/Leaf.html @@ -0,0 +1,872 @@ + + + + +Leaf Tags + + + +

Leaf Tags

+

These tags are found in .MOS images from Leaf digital camera backs as +written by Creo Leaf Capture. They exist within the Leaf-specific directory +structure of EXIF tag 0x8606. The tables below list observed Leaf tags, +however ExifTool will extract any tags found in the Leaf directories even if +they don't appear in these tables.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'JPEG_preview_data'PreviewImageno 
'JPEG_preview_info'PreviewInfono 
'PDA_histogram_data'PDAHistogramno 
'back_serial_number'BackSerialno 
'camera_profile'CameraProfile---> Leaf CameraProfile Tags
'icc_camera_profile'ICC_Profile---> ICC_Profile Tags
'icc_camera_to_tone_matrix'ToneMatrixno 
'icc_camera_to_tone_space_flow'ToneSpaceFlowno 
'icc_rgb_ws_profile'RGB_Profile---> ICC_Profile Tags
'image_offset'ImageOffsetno 
'pattern_ratation_angle'PatternAngleno("ratation" is not a typo)
+ +

Leaf CameraProfile Tags

+

All Tag ID's in the following table have a leading 'CamProf_' which +has been removed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'back_type'CameraBackTypeno 
'capture_profile'CaptureProfile---> Leaf CaptureProfile Tags
'image_profile'ImageProfile---> Leaf ImageProfile Tags
'name'CameraNameno 
'type'CameraTypeno 
'version'CameraProfileVersionno 
+ +

Leaf CaptureProfile Tags

+

All Tag ID's in the following table have a leading 'CaptProf_' which +has been removed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'CCD_rect'CCDRectno 
'CCD_valid_rect'CCDValidRectno 
'CCD_video_rect'CCDVideoRectno 
'back_type'CaptProfBackTypeno 
'center_dark_rect'CenterDarkRectno 
'color_averages'ColorAveragesno 
'color_matrix'ColorMatrixno 
'dark_correction_type'DarkCorrectionTypeno 
'image_bounds'ImageBoundsno 
'image_fields'ImageFieldsno 
'image_offset'ImageOffsetno 
'left_dark_rect'LeftDarkRectno 
'luminance_consts'LuminanceConstsno 
'mosaic_pattern'MosaicPatternno 
'name'CaptProfNameno 
'number_of_planes'NumberOfPlanesno 
'raw_data_rotation'RawDataRotationno 
'reconstruction_type'ReconstructionTypeno 
'right_dark_rect'RightDarkRectno 
'serial_number'CaptureSerialno 
'type'CaptProfTypeno 
'version'CaptProfVersionno 
'xy_offset_info'XYOffsetInfono 
+ +

Leaf ImageProfile Tags

+

All Tag ID's in the following table have a leading 'ImgProf_' which +has been removed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'back_type'ImgProfBackTypeno 
'image_status'ImageStatusno 
'name'ImgProfNameno 
'rotation_angle'RotationAngleno 
'shoot_setup'ShootSetup---> Leaf ShootSetup Tags
'type'ImgProfTypeno 
'version'ImgProfVersionno 
+ +

Leaf ShootSetup Tags

+

All Tag ID's in the following table have a leading 'ShootObj_' which +has been removed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'back_type'ShootObjBackTypeno 
'camera_setup'CameraSetup---> Leaf CameraSetup Tags
'capture_setup'CaptureSetup---> Leaf CaptureSetup Tags
'color_setup'ColorSetup---> Leaf ColorSetup Tags
'look_header'LookHeader---> Leaf LookHeader Tags
'name'ShootObjNameno 
'save_setup'SaveSetup---> Leaf SaveSetup Tags
'type'ShootObjTypeno 
'version'ShootObjVersionno 
+ +

Leaf CameraSetup Tags

+

All Tag ID's in the following table have a leading 'CameraObj_' which +has been removed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ISO_speed'ISOSpeedno 
'back_type'CameraObjBackTypeno 
'camera_type'CameraTypeno 
'lens_ID'LensIDno 
'lens_type'LensTypeno 
'name'CameraObjNameno 
'strobe'Strobeno 
'type'CameraObjTypeno 
'version'CameraObjVersionno 
+ +

Leaf CaptureSetup Tags

+

All Tag ID's in the following table have a leading 'CaptureObj_' which +has been removed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Multi_quality'MultiQualityno 
'back_type'CaptureObjBackTypeno 
'name'CaptureObjNameno 
'neutals'Neutals---> Leaf Neutrals Tags
'selection'Selection---> Leaf Selection Tags
'sharpness'Sharpness---> Leaf Sharpness Tags
'single_quality'SingleQualityno 
'tone_curve'ToneCurve---> Leaf ToneCurve Tags
'type'CaptureObjTypeno 
'version'CaptureObjVersionno 
+ +

Leaf Neutrals Tags

+

All Tag ID's in the following table have a leading 'NeutObj_' which +has been removed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'back_type'NeutObjBackTypeno 
'color_casts'ColorCastsno 
'highlight_end_points'HighlightEndPointsno 
'name'NeutObjNameno 
'neutrals'Neutralsno 
'shadow_end_points'ShadowEndPointsno 
'type'NeutObjTypeno 
'version'NeutObjVersionno 
+ +

Leaf Selection Tags

+

All Tag ID's in the following table have a leading 'SelObj_' which +has been removed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'back_type'SelObjBackTypeno 
'locks'Locksno 
'name'SelObjNameno 
'orientation'Orientationno 
'rect'Rectno 
'resolution'Resolutionno 
'scale'Scaleno 
'type'SelObjTypeno 
'version'SelObjVersionno 
+ +

Leaf Sharpness Tags

+

All Tag ID's in the following table have a leading 'SharpObj_' which +has been removed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'back_type'SharpObjBackTypeno 
'data_len'DataLenno 
'name'SharpObjNameno 
'sharp_info'SharpInfono 
'sharp_method'SharpMethodno 
'type'SharpObjTypeno 
'version'SharpObjVersionno 
+ +

Leaf ToneCurve Tags

+

All Tag ID's in the following table have a leading 'ToneObj_' which +has been removed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'back_type'ToneObjBackTypeno 
'gamma'Gammano 
'name'ToneObjNameno 
'npts'Nptsno 
'tones'Tonesno 
'type'ToneObjTypeno 
'version'ToneObjVersionno 
+ +

Leaf ColorSetup Tags

+

All Tag ID's in the following table have a leading 'ColorObj_' which +has been removed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'back_type'ColorObjBackTypeno 
'color_mode'ColorModeno 
'color_type'ColorTypeno 
'has_ICC'HasICCno 
'input_profile'InputProfileno 
'name'ColorObjNameno 
'output_profile'OutputProfileno 
'type'ColorObjTypeno 
'version'ColorObjVersionno 
+ +

Leaf LookHeader Tags

+

All Tag ID's in the following table have a leading 'LookHead_' which +has been removed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'back_type'LookHeadBackTypeno 
'name'LookHeadNameno 
'type'LookHeadTypeno 
'version'LookHeadVersionno 
+ +

Leaf SaveSetup Tags

+

All Tag ID's in the following table have a leading 'SaveObj_' which +has been removed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'back_type'SaveObjBackTypeno 
'leaf_auto_active'LeafAutoActiveno 
'leaf_auto_base_name'LeafAutoBaseNameno 
'leaf_hot_folder'LeafHotFolderno 
'leaf_open_proc_HDR'LeafOpenProcHDRno 
'leaf_output_file_type'LeafOutputFileTypeno 
'leaf_save_selection'LeafSaveSelectionno 
'name'SaveObjNameno 
'std_auto_active'StdAutoActiveno 
'std_base_name'StdBaseNameno 
'std_hot_folder'StdHotFolderno 
'std_open_in_photoshop'StdOpenInPhotoshopno 
'std_output_bit_depth'StdOutputBitDepthno 
'std_output_color_mode'StdOutputColorModeno 
'std_output_file_type'StdOutputFileTypeno 
'std_oxygen'StdOxygenno 
'std_save_selection'StdSaveSelectionno 
'std_scaled_output'StdScaledOutputno 
'std_sharpen_output'StdSharpenOutputno 
'type'SaveObjTypeno 
'version'SaveObjVersionno 
+ +

Leaf SubIFD Tags

+

Leaf writes a TIFF-format sub-IFD inside IFD0 of a MOS image. No tags in +this sub-IFD are currently known, except for tags 0x8602 and 0x8606 which +really shouldn't be here anyway (so they don't appear in the table below) +because they duplicate references to the same data from tags with the same +ID in IFD0.

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Dec 11, 2019 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Lytro.html b/html/TagNames/Lytro.html new file mode 100644 index 0000000..52b89e4 --- /dev/null +++ b/html/TagNames/Lytro.html @@ -0,0 +1,123 @@ + + + + +Lytro Tags + + + +

Lytro Tags

+

Tag definitions for Lytro Light Field Picture (LFP) files. ExifTool +extracts the full JSON metadata blocks, as well as breaking them down into +individual tags. All available tags are extracted from the JSON metadata, +even if they don't appear in the table below.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AccelerometerTimeno 
AccelerometerXno 
AccelerometerYno 
AccelerometerZno 
CameraTypeno 
DateTimeOriginalno 
EmbeddedImageno(JPEG image embedded in LFP files written by Lytro Desktop)
ExposureTimeno 
FNumberno 
FirmwareVersionno 
FocalLengthno 
FocalPlaneXResolutionno(Y resolution is the same as X resolution)
FrameExposureTimeno 
ISOno 
ImageLimitExposureBiasno 
ImageModulationExposureBiasno 
JSONMetadatano+(the full JSON-format metadata blocks)
LensTemperatureno 
Makeno 
Modelno 
Orientationno1 = Horizontal (normal)
SensorSerialNumberno 
SerialNumberno 
SocTemperatureno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 18, 2014 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/M2TS.html b/html/TagNames/M2TS.html new file mode 100644 index 0000000..0969582 --- /dev/null +++ b/html/TagNames/M2TS.html @@ -0,0 +1,136 @@ + + + + +M2TS Tags + + + +

M2TS Tags

+

The MPEG-2 transport stream is used as a container for many different +audio/video formats (including AVCHD). This table lists information +extracted from M2TS files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AudioStreamTypeno--> M2TS StreamType Values
Durationno(the -fast option may be used to avoid scanning to the end of file to +calculate the Duration)
VideoStreamTypeno--> M2TS StreamType Values
_AC3---> M2TS AC3 Tags
_H264---> H264 Tags
+ +

M2TS StreamType Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueStreamTypeValueStreamType
0x0= Reserved0x13= ISO 14496-1 SL-packetized
0x1= MPEG-1 Video0x14= ISO 13818-6 Synchronized Download Protocol
0x2= MPEG-2 Video0x1b= H.264 (AVC) Video
0x3= MPEG-1 Audio0x24= H.265 (HEVC) Video
0x4= MPEG-2 Audio0x80= DigiCipher II Video
0x5= ISO 13818-1 private sections0x81= A52/AC-3 Audio
0x6= ISO 13818-1 PES private data0x82= HDMV DTS Audio
0x7= ISO 13522 MHEG0x83= LPCM Audio
0x8= ISO 13818-1 DSM-CC0x84= SDDS Audio
0x9= ISO 13818-1 auxiliary0x85= ATSC Program ID
0xa= ISO 13818-6 multi-protocol encap0x86= DTS-HD Audio
0xb= ISO 13818-6 DSM-CC U-N msgs0x87= E-AC-3 Audio
0xc= ISO 13818-6 stream descriptors0x8a= DTS Audio
0xd= ISO 13818-6 sections0x90= PGS Audio
0xe= ISO 13818-1 auxiliary0x91= A52b/AC-3 Audio
0xf= MPEG-2 AAC Audio0x92= DVD_SPU vls Subtitle
0x10= MPEG-4 Video0x94= SDDS Audio
0x11= MPEG-4 LATM AAC Audio0xa0= MSCODEC Video
0x12= MPEG-4 generic0xea= Private ES (VC-1)
+ +

M2TS AC3 Tags

+

Tags extracted from AC-3 audio streams.

+
+
+ + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AudioBitrateno 
AudioChannelsno + +
0 = 1 + 1 +
1 = 1 +
2 = 2 +
3 = 3 +
4 = 2/1 +
5 = 3/1 +
6 = 2/2
  7 = 3/2 +
8 = 1 +
9 = 2 max +
10 = 3 max +
11 = 4 max +
12 = 5 max +
13 = 6 max
+
AudioSampleRateno0 = 48000 +
1 = 44100 +
2 = 32000
SurroundModeno0 = Not indicated +
1 = Not Dolby surround +
2 = Dolby surround
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Mar 17, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/MIE.html b/html/TagNames/MIE.html new file mode 100644 index 0000000..e58125c --- /dev/null +++ b/html/TagNames/MIE.html @@ -0,0 +1,1030 @@ + + + + +MIE Tags + + + +

MIE Tags

+

MIE is a flexible format which may be used as a stand-alone meta information +format, for encapsulation of other files and information, or as a trailer +appended to other file formats. The tables below represent currently +defined MIE tags, however ExifTool will also extract any other information +present in a MIE file.

+ +

When writing MIE information, some special features are supported:

+ +

1) String values may be written as ASCII (ISO 8859-1) or UTF-8. ExifTool +automatically detects the presence of wide characters and treats the string +appropriately. Internally, UTF-8 text may be converted to UTF-16 or UTF-32 +and stored in this format in the file if it is more compact.

+ +

2) All MIE string-value tags support localized text. Localized values are +written by adding a language/country code to the tag name in the form +TAG-xx_YY, where TAG is the tag name, xx is a 2-character lower +case ISO 639-1 language code, and YY is a 2-character upper case ISO +3166-1 alpha 2 country code (eg. Title-en_US). But as usual, the user +interface is case-insensitive, and ExifTool will write the correct case to +the file.

+ +

3) Some numerical MIE tags allow units of measurement to be specified. For +these tags, units may be added in brackets immediately following the value +(eg. 55(mi/h)). If no units are specified, the default units are +written.

+ +

4) ExifTool writes compressed metadata to MIE files if the Compress (-z) +option is used and Compress::Zlib is available.

+ +

See MIE1.1-20070121.pdf for the official MIE +specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'0Type'SubfileTypestring(the capitalized common extension for this type of file. If the extension +has a dot-3 abbreviation, then the longer version is used here. For +instance, JPEG and TIFF are used, not JPG and TIF)
'0Vers'MIEVersionstring(version 1.1 is assumed if not specified)
'1Directory'SubfileDirectorystring(original directory for the file)
'1Name'SubfileNamestring(the file name, including extension if it exists)
'2MIME'SubfileMIMETypestring 
'Meta'Meta---> MIE Meta Tags
'data'SubfileDataundef(the subfile data)
'rsrc'SubfileResourceundef(subfile resource fork if it exists)
'zmd5'MD5Digeststring(16-byte MD5 digest written in binary form or as a 32-character hex-encoded +ASCII string. Value is an MD5 digest of the entire 0MIE group as it would be +with the digest value itself set to all null bytes)
'zmie'TrailerSignatureundef(used as the last element in the main "0MIE" group to identify a MIE trailer +when appended to another type of file. ExifTool will create this tag if set +to any value, but always with an empty data block)
+ +

MIE Meta Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Audio'Audio---> MIE Audio Tags
'Camera'Camera---> MIE Camera Tags
'Document'Document---> MIE Doc Tags
'EXIF'EXIF---> EXIF Tags
'Geo'Geo---> MIE Geo Tags
'ICCProfile'ICC_Profile---> ICC_Profile Tags
'ID3'ID3---> ID3 Tags
'IPTC'IPTC---> IPTC Tags
'Image'Image---> MIE Image Tags
'MakerNotes'MakerNotes---> MIE MakerNotes Tags
'Preview'Preview---> MIE Preview Tags
'Thumbnail'Thumbnail---> MIE Thumbnail Tags
'Video'Video---> MIE Video Tags
'XMP'XMP---> XMP Tags
+ +

MIE Audio Tags

+

For the Audio group (and any other group containing a 'data' element), tags +refer to the contained data if present, otherwise they refer to the main +SubfileData. The 0Type and 1Name elements should exist only if data +is present.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'0Type'RelatedAudioFileTypestring(MP3 if not specified)
'1Name'RelatedAudioFileNamestring 
'Channels'Channelsint8u 
'Compression'AudioCompressionstring 
'Duration'Durationrational64u~ 
'SampleBits'SampleBitsint16u 
'SampleRate'SampleRateint32u 
'data'RelatedAudioFileundef 
+ +

MIE Camera Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Brightness'Brightnessint8s 
'ColorBalance'ColorBalancerational64u[3](RGB scaling factors)
'ColorTemperature'ColorTemperatureint32u 
'Contrast'Contrastint8s 
'DigitalZoom'DigitalZoomrational64u 
'ExposureComp'ExposureCompensationrational64s 
'ExposureMode'ExposureModestring 
'ExposureTime'ExposureTimerational64u 
'FirmwareVersion'FirmwareVersionstring 
'Flash'Flash---> MIE Flash Tags
'FocusMode'FocusModestring 
'ISO'ISOint16u 
'ISOSetting'ISOSettingint16u(0 = Auto, otherwise manual ISO speed setting)
'ImageNumber'ImageNumberint32u 
'ImageQuality'ImageQualitystring(Economy, Normal, Fine, Super Fine or Raw)
'ImageStabilization'ImageStabilizationint8u 
'Lens'Lens---> MIE Lens Tags
'Make'Makestring 
'MeasuredEV'MeasuredEVrational64s 
'Model'Modelstring 
'Orientation'Orientation---> MIE Orient Tags
'OwnerName'OwnerNamestring 
'Saturation'Saturationint8s 
'SensorSize'SensorSizerational64u[2](width and height of active sensor area in mm)
'SerialNumber'SerialNumberstring 
'Sharpness'Sharpnessint8s 
'ShootingMode'ShootingModestring 
+ +

MIE Flash Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ExposureComp'FlashExposureComprational64s 
'Fired'FlashFiredint8u0 = No +
1 = Yes
'GuideNumber'FlashGuideNumberstring 
'Make'FlashMakestring 
'Mode'FlashModestring 
'Model'FlashModelstring 
'SerialNumber'FlashSerialNumberstring 
'Type'FlashTypestring("Internal" or "External")
+ +

MIE Lens Tags

+

All recorded lens parameters (focal length, aperture, etc) include the +effects of the extender if present.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Extender'Extender---> MIE Extender Tags
'FNumber'FNumberrational64u 
'FocalLength'FocalLengthrational64u(all focal lengths in mm)
'FocusDistance'FocusDistancerational64u('m' unless 'ft' specified)
'Make'LensMakestring 
'MaxAperture'MaxAperturerational64u 
'MaxApertureAtMaxFocal'MaxApertureAtMaxFocalrational64u 
'MaxFocalLength'MaxFocalLengthrational64u 
'MinAperture'MinAperturerational64u 
'MinFocalLength'MinFocalLengthrational64u 
'Model'LensModelstring 
'OpticalZoom'OpticalZoomrational64u 
'SerialNumber'LensSerialNumberstring 
+ +

MIE Extender Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Magnification'ExtenderMagnificationrational64s 
'Make'ExtenderMakestring 
'Model'ExtenderModelstring 
'SerialNumber'ExtenderSerialNumberstring 
+ +

MIE Orient Tags

+

These tags describe the camera orientation.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Azimuth'Azimuthrational64s('deg' CW from true north unless 'deg{mag}' specified)
'Declination'Declinationrational64s 
'Elevation'Elevationrational64s 
'RightAscension'RightAscensionrational64s 
'Rotation'Rotationrational64s(CW rotation angle of camera about lens axis)
+ +

MIE Doc Tags

+

Information describing the main document, image or file.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Author'Authorstring 
'Comment'Commentstring 
'Contributors'Contributorsstring+ 
'Copyright'Copyrightstring 
'CreateDate'CreateDatestring 
'EMail'Emailstring 
'Keywords'Keywordsstring+ 
'ModifyDate'ModifyDatestring 
'OriginalDate'DateTimeOriginalstring 
'Phone'PhoneNumberstring 
'References'Referencesstring+ 
'Software'Softwarestring 
'Title'Titlestring 
'URL'URLstring 
+ +

MIE Geo Tags

+

Information related to geographic location.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Address'Addressstring 
'City'Citystring 
'Country'Countrystring 
'GPS'GPS---> MIE GPS Tags
'PostalCode'PostalCodestring 
'State'Statestring(state or province)
'UTM'UTM---> MIE UTM Tags
+ +

MIE GPS Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Altitude'GPSAltituderational64s('m' above sea level unless 'ft' specified)
'Bearing'GPSDestBearingrational64s('deg' CW from true north unless 'deg{mag}' specified)
'DateTime'GPSDateTimestring 
'Datum'GPSMapDatumstring(WGS-84 assumed if not specified)
'Differential'GPSDifferentialint8u0 = No Correction +
1 = Differential Corrected
'Distance'GPSDestDistancerational64s('km' unless 'mi' or 'nmi' specified)
'Heading'GPSTrackrational64s('deg' CW from true north unless 'deg{mag}' specified)
'Latitude'GPSLatituderational64s[n](1 to 3 numbers: degrees, minutes then seconds. South latitudes are stored +as all negative numbers, but may be entered as positive numbers with a +trailing 'S' for convenience. For example, these are all equivalent: "-40 +-30", "-40.5", "40 30 0.00 S")
'Longitude'GPSLongituderational64s[n](1 to 3 numbers: degrees, minutes then seconds. West longitudes are +negative, but may be entered as positive numbers with a trailing 'W')
'MeasureMode'GPSMeasureModeint8u2 = 2-D +
3 = 3-D
'Satellites'GPSSatellitesstring 
'Speed'GPSSpeedrational64s('km/h' unless 'mi/h', 'm/s' or 'kn' specified)
+ +

MIE UTM Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Datum'UTMMapDatumstring(WGS-84 assumed if not specified)
'Easting'UTMEastingstring 
'Northing'UTMNorthingstring 
'Zone'UTMZoneint8s 
+ +

MIE Image Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'0Type'FullSizeImageTypestring(JPEG if not specified)
'1Name'FullSizeImageNamestring 
'BitDepth'BitDepthint16u 
'ColorSpace'ColorSpacestring(standard ColorSpace values are "sRGB" and "Adobe RGB")
'Components'ComponentsConfigurationstring(string composed of R, G, B, Y, Cb and Cr)
'Compression'CompressionRatiorational32u 
'ImageSize'ImageSizeint16u[n](2 or 3 values, for number of XY or XYZ pixels)
'Resolution'Resolutionrational64u[n](1 to 3 values. A single value for equal resolution in all directions, or +separate X, Y and Z values if necessary. Units are '/in' unless '/cm', +'/deg', '/arcmin', '/arcsec' or '' specified)
'data'FullSizeImageundef 
+ +

MIE MakerNotes Tags

+

MIE maker notes are contained within separate groups for each manufacturer +to avoid name conflicts.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Canon'Canon---> MIE Canon Tags
'Casio'Casio---> MIE Unknown Tags
'FujiFilm'FujiFilm---> MIE Unknown Tags
'Kodak'Kodak---> MIE Unknown Tags
'KonicaMinolta'KonicaMinolta---> MIE Unknown Tags
'Nikon'Nikon---> MIE Unknown Tags
'Olympus'Olympus---> MIE Unknown Tags
'Panasonic'Panasonic---> MIE Unknown Tags
'Pentax'Pentax---> MIE Unknown Tags
'Ricoh'Ricoh---> MIE Unknown Tags
'Sigma'Sigma---> MIE Unknown Tags
'Sony'Sony---> MIE Unknown Tags
+ +

MIE Canon Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'VRD'CanonVRD---> CanonVRD Tags
+ +

MIE Unknown Tags

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

MIE Preview Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'0Type'PreviewImageTypestring(JPEG if not specified)
'1Name'PreviewImageNamestring 
'ImageSize'PreviewImageSizeint16u[n](2 or 3 values, for number of XY or XYZ pixels)
'data'PreviewImageundef 
+ +

MIE Thumbnail Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'0Type'ThumbnailImageTypestring(JPEG if not specified)
'1Name'ThumbnailImageNamestring 
'ImageSize'ThumbnailImageSizeint16u[n](2 or 3 values, for number of XY or XYZ pixels)
'data'ThumbnailImageundef 
+ +

MIE Video Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'0Type'RelatedVideoFileTypestring(MOV if not specified)
'1Name'RelatedVideoFileNamestring 
'Codec'Codecstring 
'Duration'Durationrational64u~ 
'data'RelatedVideoFileundef 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Nov 28, 2019 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/MIFF.html b/html/TagNames/MIFF.html new file mode 100644 index 0000000..b8d1e96 --- /dev/null +++ b/html/TagNames/MIFF.html @@ -0,0 +1,197 @@ + + + + +MIFF Tags + + + +

MIFF Tags

+

The MIFF (Magick Image File Format) format allows aribrary tag names to be +used. Only the standard tag names are listed below, however ExifTool will +decode any tags found in the image.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'background-color'BackgroundColorno 
'blue-primary'BluePrimaryno 
'border-color'BorderColorno 
'class'Classno 
'colors'Colorsno 
'colorspace'ColorSpaceno 
'columns'ImageWidthno 
'compression'Compressionno 
'delay'Delayno 
'depth'Depthno 
'dispose'Disposeno 
'gamma'Gammano 
'green-primary'GreenPrimaryno 
'id'IDno 
'iterations'Iterationsno 
'label'Labelno 
'matt-color'MattColorno 
'matte'Matteno 
'montage'Montageno 
'packets'Packetsno 
'page'Pageno 
'profile-APP1'APP1_Profile---> EXIF Tags +
--> XMP Tags
'profile-exif'EXIF_Profile---> EXIF Tags
'profile-icc'ICC_Profile---> ICC_Profile Tags
'profile-iptc'IPTC_Profile---> Photoshop Tags
'profile-xmp'XMP_Profile---> XMP Tags
'red-primary'RedPrimaryno 
'rendering-intent'RenderingIntentno 
'resolution'Resolutionno 
'rows'ImageHeightno 
'scene'Sceneno 
'signature'Signatureno 
'units'Unitsno 
'white-point'WhitePointno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Aug 21, 2011 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/MNG.html b/html/TagNames/MNG.html new file mode 100644 index 0000000..71cf64d --- /dev/null +++ b/html/TagNames/MNG.html @@ -0,0 +1,848 @@ + + + + +MNG Tags + + + +

MNG Tags

+

This table contains definitions for tags found in MNG and JNG images. MNG +is a superset of PNG and JNG, so a MNG image may contain any of these tags +as well as any PNG tags. Conversely, only some of these tags are valid for +JNG images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'BACK'Background---> MNG Background Tags
'BASI'BasisObject---> MNG BasisObject Tags
'CLIP'ClipObjects---> MNG ClipObjects Tags
'CLON'CloneObject---> MNG CloneObject Tags
'DBYK'DropByKeywordno 
'DEFI'DefineObject---> MNG DefineObject Tags
'DHDR'DeltaPNGHeader---> MNG DeltaPNGHeader Tags
'DISC'DiscardObjectsno 
'DROP'DropChunksno 
'FRAM'Frameno 
'JHDR'JNGHeader---> MNG JNGHeader Tags
'LOOP'Loop---> MNG Loop Tags
'MAGN'MagnifyObject---> MNG MagnifyObject Tags
'MHDR'MNGHeader---> MNG MNGHeader Tags
'MOVE'MoveObjects---> MNG MoveObjects Tags
'ORDR'OrderingRestrictionsno 
'PAST'PasteImage---> MNG PasteImage Tags
'PPLT'PartialPaletteno 
'PROM'PromoteParent---> MNG PromoteParent Tags
'SAVE'SaveObjectsno 
'SEEK'SeekPointno 
'SHOW'ShowObjects---> MNG ShowObjects Tags
'TERM'TerminationAction---> MNG TerminationAction Tags
'eXPi'ExportImage---> MNG ExportImage Tags
'fPRI'FramePriority---> MNG FramePriority Tags
'nEED'ResourcesNeededno 
'pHYg'GlobalPixelSize---> PNG PhysicalPixel Tags
+ +

MNG Background Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0BackgroundColorno 
6MandatoryBackgroundno0 = Color and Image Advisory +
1 = Color Mandatory, Image Advisory +
2 = Color Advisory, Image Mandatory +
3 = Color and Image Mandatory
7BackgroundImageIDno 
9BackgroundTilingno0 = No +
1 = Yes
+ +

MNG BasisObject Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ImageWidthno 
4ImageHeightno 
8BitDepthno 
9ColorTypeno0 = Grayscale +
2 = RGB +
3 = Palette +
4 = Grayscale with Alpha +
6 = RGB with Alpha
10Compressionno0 = Deflate/Inflate
11Filterno0 = Adaptive
12Interlaceno0 = Noninterlaced +
1 = Adam7 Interlace
13RedSampleno 
17GreenSampleno 
21BlueSampleno 
25AlphaSampleno 
26Viewableno 
+ +

MNG ClipObjects Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FirstObjectno 
2LastObjectno 
4DeltaTypeno0 = Absolute +
1 = Relative
5ClipBoundaryno 
+ +

MNG CloneObject Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0SourceIDno 
2CloneIDno 
4CloneTypeno0 = Full +
1 = Parital +
2 = Renumber object
5DoNotShowno 
6ConcreteFlagno 
7LocalDeltaTypeno0 = Absolute +
1 = Relative
8DeltaXYno 
+ +

MNG DefineObject Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ObjectIDno 
2DoNotShowno 
3ConcreteFlagno 
4XYLocationno 
12ClippingBoundaryno 
+ +

MNG DeltaPNGHeader Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ObjectIDno 
2ImageTypeno0 = Unspecified +
1 = PNG +
2 = JNG
3DeltaTypeno + +
0 = Full Replacement +
1 = Pixel Addition +
2 = Alpha Addition +
3 = Color Addition
  4 = Pixel Replacement +
5 = Alpha Replacement +
6 = Color Replacement +
7 = No Change
+
4BlockSizeno 
12BlockLocationno 
+ +

MNG JNGHeader Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ImageWidthno 
4ImageHeightno 
8ColorTypeno8 = Gray +
10 = Color +
12 = Gray Alpha +
14 = Color Alpha
9BitDepthno 
10Compressionno8 = Huffman-coded baseline JPEG
11Interlaceno0 = Sequential +
8 = Progressive
12AlphaBitDepthno 
13AlphaCompressionno0 = MNG Grayscale IDAT +
8 = JNG 8-bit Grayscale JDAA
14AlphaFilterno0 = Adaptive MNG (N/A for JPEG)
15AlphaInterlaceno0 = Noninterlaced
+ +

MNG Loop Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0NestLevelno 
1IterationCountno 
5TerminationConditionno +
0 = Deterministic, not cacheable +
1 = Decoder discretion, not cacheable +
2 = User discretion, not cacheable +
3 = External signal, not cacheable +
4 = Deterministic, cacheable +
5 = Decoder discretion, cacheable +
6 = User discretion, cacheable +
7 = External signal, cacheable
+
6IterationMinMaxno 
14SignalNumberno 
+ +

MNG MagnifyObject Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FirstObjectIDno 
2LastObjectIDno 
4XMethodno0 = No Magnification +
1 = Pixel Replication +
2 = Linear Interpolation +
3 = Closest Pixel +
4 = Color Linear Interpolation and Alpha Closest Pixel +
5 = Color Closest Pixel and Alpha Linear Interpolation
5XMagno 
7YMagno 
9LeftMagno 
11RightMagno 
13TopMagno 
15BottomMagno 
17YMethodno0 = No Magnification +
1 = Pixel Replication +
2 = Linear Interpolation +
3 = Closest Pixel +
4 = Color Linear Interpolation and Alpha Closest Pixel +
5 = Color Closest Pixel and Alpha Linear Interpolation
+ +

MNG MNGHeader Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0ImageWidthno 
1ImageHeightno 
2TicksPerSecondno 
3NominalLayerCountno 
4NominalFrameCountno 
5NominalPlayTimeno 
6SimplicityProfileno 
+ +

MNG MoveObjects Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FirstObjectno 
2LastObjectno 
4DeltaTypeno0 = Absolute +
1 = Relative
5DeltaXYno 
+ +

MNG PasteImage Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0DestinationIDno 
2TargetDeltaTypeno0 = Absolute +
1 = Relative
3TargetXYno 
11SourceIDno 
13CompositionModeno0 = Over +
1 = Replace +
2 = Under
14Orientationno0 = Same as source +
2 = Flipped left-right, then up-down +
4 = Flipped left-right +
6 = Flipped up-down +
8 = Tiled
15OffsetOriginno0 = Desination Origin +
1 = Target Origin
16OffsetXYno 
24BoundaryOriginno0 = Desination Origin +
1 = Target Origin
25PastClippingBoundaryno 
+ +

MNG PromoteParent Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0NewColorTypeno 
1NewBitDepthno 
2FillMethodno0 = Bit Replication +
1 = Zero Fill
+ +

MNG ShowObjects Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FirstObjectno 
2LastObjectno 
4ShowModeno 
+ +

MNG TerminationAction Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0TerminationActionno0 = Show Last Frame +
1 = Display Nothing +
2 = Show First Frame +
3 = Repeat Sequence
1IterationEndActionno0 = Show Last Frame +
1 = Display Nothing +
2 = Show First Frame
2Delayno 
6IterationMaxno 
+ +

MNG ExportImage Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0SnapshotIDno 
2SnapshotNameno 
+ +

MNG FramePriority Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0DeltaTypeno0 = Absolute +
1 = Relative
2Priorityno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 25, 2006 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/MOI.html b/html/TagNames/MOI.html new file mode 100644 index 0000000..539d3fd --- /dev/null +++ b/html/TagNames/MOI.html @@ -0,0 +1,61 @@ + + + + +MOI Tags + + + +

MOI Tags

+

MOI files store information about associated MOD or TOD files, and are +written by some JVC, Canon and Panasonic camcorders.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0MOIVersionno 
6DateTimeOriginalno 
14Durationno 
128AspectRationo 
132AudioCodecno0xc1 = AC3 +
0x4001 = MPEG
134AudioBitrateno 
218VideoBitrateno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Dec 15, 2014 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/MPC.html b/html/TagNames/MPC.html new file mode 100644 index 0000000..5bda5eb --- /dev/null +++ b/html/TagNames/MPC.html @@ -0,0 +1,98 @@ + + + + +MPC Tags + + + +

MPC Tags

+

Tags used in Musepack (MPC) audio files. ExifTool also extracts ID3 and APE +information from these files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Bit032-063'TotalFramesno 
'Bit080-081'SampleRateno0 = 44100 +
1 = 48000 +
2 = 37800 +
3 = 32000
'Bit084-087'Qualityno +
1 = Unstable/Experimental +
5 = 0 +
6 = 1 +
7 = 2 (Telephone) +
8 = 3 (Thumb) +
9 = 4 (Radio) +
10 = 5 (Standard) +
11 = 6 (Xtreme) +
12 = 7 (Insane) +
13 = 8 (BrainDead) +
14 = 9 +
15 = 10
+
'Bit088-093'MaxBandno 
'Bit096-111'ReplayGainTrackPeakno 
'Bit112-127'ReplayGainTrackGainno 
'Bit128-143'ReplayGainAlbumPeakno 
'Bit144-159'ReplayGainAlbumGainno 
'Bit179'FastSeekno0 = No +
1 = Yes
'Bit191'Gaplessno0 = No +
1 = Yes
'Bit216-223'EncoderVersionno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Nov 20, 2006 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/MPEG.html b/html/TagNames/MPEG.html new file mode 100644 index 0000000..2523c76 --- /dev/null +++ b/html/TagNames/MPEG.html @@ -0,0 +1,250 @@ + + + + +MPEG Tags + + + +

MPEG Tags

+

+The MPEG format doesn't specify any file-level meta information. In lieu of +this, information is extracted from the first audio and video frame headers +in the file. +

+

MPEG Audio Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Bit11-12'MPEGAudioVersionno0 = 2.5 +
2 = 2 +
3 = 1
'Bit13-14'AudioLayerno1 = 3 +
2 = 2 +
3 = 1
'Bit16-19'AudioBitrateno(version 1, layer 1) +
(version 1, layer 2) +
(version 1, layer 3) +
(version 2 or 2.5, layer 1) +
(version 2 or 2.5, layer 2 or 3)
'Bit20-21'SampleRateno(version 1) +
0 = 44100 +
1 = 48000 +
2 = 32000 +
(version 2) +
0 = 22050 +
1 = 24000 +
2 = 16000 +
(version 2.5) +
0 = 11025 +
1 = 12000 +
2 = 8000
'Bit24-25'ChannelModeno0 = Stereo +
1 = Joint Stereo +
2 = Dual Channel +
3 = Single Channel
'Bit26'MSStereono(layer 3) +
0 = Off +
1 = On
'Bit26-27'ModeExtensionno(layer 1 or 2) +
0 = Bands 4-31 +
1 = Bands 8-31 +
2 = Bands 12-31 +
3 = Bands 16-31
'Bit27'IntensityStereono(layer 3) +
0 = Off +
1 = On
'Bit28'CopyrightFlagno0 = False +
1 = True
'Bit29'OriginalMediano0 = False +
1 = True
'Bit30-31'Emphasisno0 = None +
1 = 50/15 ms +
2 = reserved +
3 = CCIT J.17
+ +

MPEG Video Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Bit00-11'ImageWidthno 
'Bit12-23'ImageHeightno 
'Bit24-27'AspectRationo +
2 => 0.6735 = 0.6735 +
3 => 0.7031 = 16:9, 625 line, PAL +
4 => 0.7615 = 0.7615 +
5 => 0.8055 = 0.8055 +
6 => 0.8437 = 16:9, 525 line, NTSC +
7 => 0.8935 = 0.8935 +
8 => 0.9157 = 4:3, 625 line, PAL, CCIR601 +
9 => 0.9815 = 0.9815 +
1 => 1 = 1:1 +
12 => 1.095 = 4:3, 525 line, NTSC, CCIR601 +
10 => 1.0255 = 1.0255 +
11 => 1.0695 = 1.0695 +
13 => 1.1575 = 1.1575 +
14 => 1.2015 = 1.2015
+
'Bit28-31'FrameRateno 
'Bit32-49'VideoBitrateno 
+ +

MPEG Xing Tags

+

These tags are extracted from the Xing/Info frame.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Encoderno 
LameHeader---> MPEG Lame Tags
LameQualityno 
LameVBRQualityno 
VBRBytesno 
VBRFramesno 
VBRScaleno 
+ +

MPEG Lame Tags

+

Tags extracted from Lame 3.90 or later header.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
9LameMethodno[val & 0xf] + +
1 = CBR +
2 = ABR +
3 = VBR (old/rh) +
4 = VBR (new/mtrh)
  5 = VBR (old/rh) +
6 = VBR +
8 = CBR (2-pass) +
9 = ABR (2-pass)
+
10LameLowPassFilterno 
20LameBitrateno 
24LameStereoModeno[val >> 2 & 0x7] + +
0 = Mono +
1 = Stereo +
2 = Dual Channels +
3 = Joint Stereo
  4 = Forced Joint Stereo +
6 = Auto +
7 = Intensity Stereo
+
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 24, 2018 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/MPF.html b/html/TagNames/MPF.html new file mode 100644 index 0000000..2daea30 --- /dev/null +++ b/html/TagNames/MPF.html @@ -0,0 +1,200 @@ + + + + +MPF Tags + + + +

MPF Tags

+

These tags are part of the CIPA Multi-Picture Format specification, and are +found in the APP2 "MPF" segment of JPEG images. MPImage data referenced +from this segment is stored as a JPEG trailer. The MPF tags are not +writable, however the MPF segment may be deleted as a group (with "MPF:All") +but then the JPEG trailer should also be deleted (with "Trailer:All"). See +https://web.archive.org/web/20190713230858/http://www.cipa.jp/std/documents/e/DC-007_E.pdf +for the official specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0xb000MPFVersionno 
0xb001NumberOfImagesno 
0xb002MPImageList---> MPF MPImage Tags
0xb003ImageUIDListno 
0xb004TotalFramesno 
0xb101MPIndividualNumno 
0xb201PanOrientationno(long integer is split into 4 bytes) +
[Value 2] +
0x0 = [unused] +
0x1 = Start at top right +
0x2 = Start at top left +
0x3 = Start at bottom left +
0x4 = Start at bottom right +
[Value 3]
+
0x1 = Left to right +
0x2 = Right to left +
0x3 = Top to bottom +
0x4 = Bottom to top +
0x10 = Clockwise +
0x20 = Counter clockwise +
0x30 = Zigzag (row start) +
0x40 = Zigzag (column start)
+
0xb202PanOverlapHno 
0xb203PanOverlapVno 
0xb204BaseViewpointNumno 
0xb205ConvergenceAngleno 
0xb206BaselineLengthno 
0xb207VerticalDivergenceno 
0xb208AxisDistanceXno 
0xb209AxisDistanceYno 
0xb20aAxisDistanceZno 
0xb20bYawAngleno 
0xb20cPitchAngleno 
0xb20dRollAngleno 
+ +

MPF MPImage Tags

+

The first MPF "Large Thumbnail" image is extracted as PreviewImage, and the +rest of the embedded MPF images are extracted as MPImage#. The +ExtractEmbedded (-ee) option may be used to extract information from these +embedded images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1MPImageFlagsno[val >> 27 & 0x1f] +
Bit 2 = Representative image +
Bit 3 = Dependent child image +
Bit 4 = Dependent parent image
0.2MPImageFormatno[val >> 24 & 0x7] +
0 = JPEG
0.3MPImageTypeno[val & 0xffffff] +
0x0 = Undefined +
0x10001 = Large Thumbnail (VGA equivalent) +
0x10002 = Large Thumbnail (full HD equivalent) +
0x20001 = Multi-frame Panorama +
0x20002 = Multi-frame Disparity +
0x20003 = Multi-angle +
0x30000 = Baseline MP Primary Image
+
4MPImageLengthno 
8MPImageStartno 
12DependentImage1EntryNumberno 
14DependentImage2EntryNumberno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Nov 27, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/MRC.html b/html/TagNames/MRC.html new file mode 100644 index 0000000..b888513 --- /dev/null +++ b/html/TagNames/MRC.html @@ -0,0 +1,731 @@ + + + + +MRC Tags + + + +

MRC Tags

+

Tags extracted from Medical Research Council (MRC) format imaging files. +See https://www.ccpem.ac.uk/mrc_format/mrc2014.php for the specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0ImageWidthno 
1ImageHeightno 
2ImageDepthno(number of sections. Use ExtractEmbedded option to extract metadata for all +sections)
3ImageModeno +
0 = 8-bit signed integer +
1 = 16-bit signed integer +
2 = 32-bit signed real +
3 = complex 16-bit integer +
4 = complex 32-bit real +
6 = 16-bit unsigned integer
+
4StartPointno 
7GridSizeno 
10CellWidthno(cell size in angstroms)
11CellHeightno 
12CellDepthno 
13CellAlphano 
14CellBetano 
15CellGammano 
16ImageWidthAxisno1 = X +
2 = Y +
3 = Z
17ImageHeightAxisno1 = X +
2 = Y +
3 = Z
18ImageDepthAxisno1 = X +
2 = Y +
3 = Z
19DensityMinno 
20DensityMaxno 
21DensityMeanno 
22SpaceGroupNumberno 
23ExtendedHeaderSizeno 
26ExtendedHeaderTypeno 
27MRCVersionno 
49Originno 
53MachineStampno 
54RMSDeviationno 
55NumberOfLabelsno 
56Label0no 
76Label1no 
96Label2no 
116Label3no 
136Label4no 
156Label5no 
176Label6no 
196Label7no 
216Label8no 
236Label9no 
+ +

MRC FEI12 Tags

+

Tags extracted from FEI1 and FEI2 extended headers.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0MetadataSizeno 
4MetadataVersionno 
8Bitmask1no 
12TimeStampno 
20MicroscopeTypeno 
36MicroscopeIDno 
52Applicationno 
68AppVersionno 
84HighTensionno(volts)
92Doseno(electrons/m2)
100AlphaTiltno 
108BetaTiltno 
116XStageno 
124YStageno 
132ZStageno 
140TiltAxisAngleno 
148DualAxisRotno 
156PixelSizeXno 
164PixelSizeYno 
220Defocusno 
228STEMDefocusno 
236AppliedDefocusno 
244InstrumentModeno1 = TEM +
2 = STEM
248ProjectionModeno1 = Diffraction +
2 = Imaging
252ObjectiveLensno 
268HighMagnificationModeno 
284ProbeModeno1 = Nano +
2 = Micro
288EFTEMOnno0 = No +
1 = Yes
289Magnificationno 
297Bitmask2no 
301CameraLengthno 
309SpotIndexno 
313IlluminationAreano 
321Intensityno 
329ConvergenceAngleno 
337IlluminationModeno 
353WideConvergenceAngleRangeno0 = No +
1 = Yes
354SlitInsertedno0 = No +
1 = Yes
355SlitWidthno 
363AccelVoltOffsetno 
371DriftTubeVoltno 
379EnergyShiftno 
387ShiftOffsetXno 
395ShiftOffsetYno 
403ShiftXno 
411ShiftYno 
419IntegrationTimeno 
427BinningWidthno 
431BinningHeightno 
435CameraNameno 
451ReadoutAreaLeftno 
455ReadoutAreaTopno 
459ReadoutAreaRightno 
463ReadoutAreaBottomno 
467CetaNoiseReductno0 = No +
1 = Yes
468CetaFramesSummedno 
472DirectDetElectronCountingno0 = No +
1 = Yes
473DirectDetAlignFramesno0 = No +
1 = Yes
490Bitmask3no 
518PhasePlateno0 = No +
1 = Yes
519STEMDetectorNameno 
535Gainno 
543Offsetno 
571DwellTimeno 
579FrameTimeno 
587ScanSizeLeftno 
591ScanSizeTopno 
595ScanSizeRightno 
599ScanSizeBottomno 
603FullScanFOV_Xno 
611FullScanFOV_Yno 
619Elementno 
635EnergyIntervalLowerno 
643EnergyIntervalHigherno 
651Methodno 
655IsDoseFractionno0 = No +
1 = Yes
656FractionNumberno 
660StartFrameno 
664EndFrameno 
668InputStackFilenameno 
748Bitmask4no 
752AlphaTiltMinno 
760AlphaTiltMaxno 
768ScanRotationno 
776DiffractionPatternRotationno 
784ImageRotationno 
792ScanModeEnumerationno0 = Other +
1 = Raster +
2 = Serpentine
796AcquisitionTimeStampno 
804DetectorCommercialNameno 
820StartTiltAngleno 
828EndTiltAngleno 
836TiltPerImageno 
844TitlSpeedno 
852BeamCenterXno 
856BeamCenterYno 
860CFEGFlashTimeStampno 
868PhasePlatePositionno 
872ObjectiveApertureno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Apr 22, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/MWG.html b/html/TagNames/MWG.html new file mode 100644 index 0000000..7376f9b --- /dev/null +++ b/html/TagNames/MWG.html @@ -0,0 +1,591 @@ + + + + +MWG Tags + + + +

MWG Tags

+

+The Metadata Working Group (MWG) recommends techniques to allow certain +overlapping EXIF, IPTC and XMP tags to be reconciled when reading, and +synchronized when writing. The MWG Composite tags below are designed to aid +in the implementation of these recommendations. As well, the MWG defines +new XMP tags which are listed in the subsequent tables below. See +https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf +for the official MWG specification. +

+

MWG Composite Tags

+

The table below lists special Composite tags which are used to access other +tags based on the MWG 2.0 recommendations. These tags are only accessible +when explicitly loaded, but this is done automatically by the exiftool +application if MWG is specified as a group for any tag on the command line, +or manually with the -use MWG option. Via the API, the MWG Composite +tags are loaded by calling "Image::ExifTool::MWG::Load()".

+ +

When reading, the value of each MWG tag is Derived From the specified +tags based on the MWG guidelines. When writing, the appropriate associated +tags are written. The value of the IPTCDigest tag is updated automatically +when the IPTC is changed if either the IPTCDigest tag didn't exist +beforehand or its value agreed with the original IPTC digest (indicating +that the XMP is synchronized with the IPTC). IPTC information is written +only if the original file contained IPTC.

+ +

Loading the MWG module activates "strict MWG conformance mode", which has +the effect of causing EXIF, IPTC and XMP in non-standard locations to be +ignored when reading, as per the MWG recommendations. Instead, a "Warning" +tag is generated when non-standard metadata is encountered. This feature +may be disabled by setting $Image::ExifTool::MWG::strict = 0 in the +ExifTool config file (or from your Perl script when using the API). Note +that the behaviour when writing is not changed: ExifTool always creates new +records only in the standard location, but writes new tags to any +EXIF/IPTC/XMP records that exist.

+ +

Contrary to the EXIF specification, the MWG recommends that EXIF "ASCII" +string values be stored as UTF-8. To honour this, the exiftool application +sets the default internal EXIF string encoding to "UTF8" when the MWG module +is loaded, but via the API this must be done manually by setting the +CharsetEXIF option.

+ +

A complication of the MWG specification is that although the MWG:Creator +property may consist of multiple values, the associated EXIF tag +(EXIF:Artist) is only a simple string. To resolve this discrepancy the MWG +recommends a technique which allows a list of values to be stored in a +string by using a semicolon-space separator (with quotes around values if +necessary). When the MWG module is loaded, ExifTool automatically +implements this policy and changes EXIF:Artist to a list-type tag.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableDerived FromValues / Notes
CityyesIPTC:City +
XMP-photoshop:City +
XMP-iptcExt:LocationShownCity +
CurrentIPTCDigest +
IPTCDigest
 
CopyrightyesEXIF:Copyright +
IPTC:CopyrightNotice +
XMP-dc:Rights +
CurrentIPTCDigest +
IPTCDigest
 
CountryyesIPTC:Country-PrimaryLocationName +
XMP-photoshop:Country +
XMP-iptcExt:LocationShownCountryName +
CurrentIPTCDigest +
IPTCDigest
 
CreateDateyesComposite:SubSecCreateDate +
EXIF:CreateDate +
IPTC:DigitalCreationDate +
IPTC:DigitalCreationTime +
XMP-xmp:CreateDate +
CurrentIPTCDigest +
IPTCDigest
("specifies when an image was digitized" - MWG)
Creatoryes+EXIF:Artist +
IPTC:By-line +
XMP-dc:Creator +
CurrentIPTCDigest +
IPTCDigest
 
DateTimeOriginalyesComposite:SubSecDateTimeOriginal +
EXIF:DateTimeOriginal +
IPTC:DateCreated +
IPTC:TimeCreated +
XMP-photoshop:DateCreated +
CurrentIPTCDigest +
IPTCDigest
("specifies when a photo was taken" - MWG)
DescriptionyesEXIF:ImageDescription +
IPTC:Caption-Abstract +
XMP-dc:Description +
CurrentIPTCDigest +
IPTCDigest
 
Keywordsyes+IPTC:Keywords +
XMP-dc:Subject +
CurrentIPTCDigest +
IPTCDigest
 
LocationyesIPTC:Sub-location +
XMP-iptcCore:Location +
XMP-iptcExt:LocationShownSublocation +
CurrentIPTCDigest +
IPTCDigest
 
ModifyDateyesComposite:SubSecModifyDate +
EXIF:ModifyDate +
XMP-xmp:ModifyDate +
CurrentIPTCDigest +
IPTCDigest
("specifies when a file was modified by the user" - MWG)
OrientationyesEXIF:Orientation +
1 = Horizontal (normal) +
2 = Mirror horizontal +
3 = Rotate 180 +
4 = Mirror vertical +
5 = Mirror horizontal and rotate 270 CW +
6 = Rotate 90 CW +
7 = Mirror horizontal and rotate 90 CW +
8 = Rotate 270 CW
+
RatingyesXMP-xmp:Rating 
StateyesIPTC:Province-State +
XMP-photoshop:State +
XMP-iptcExt:LocationShownProvinceState +
CurrentIPTCDigest +
IPTCDigest
 
+ +

MWG Regions Tags

+

Image region metadata defined by the MWG 2.0 specification. These tags +may be accessed without the need to load the MWG Composite tags above. See +https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf +for the official specification.

+ +

These tags belong to the ExifTool XMP-mwg-rs family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
RegionInfostruct--> MWG RegionInfo Struct +
(called Regions by the spec)
RegionAppliedToDimensionsstruct_--> Dimensions Struct +
(RegionsAppliedToDimensions)
RegionAppliedToDimensionsHreal_(RegionsAppliedToDimensionsH)
RegionAppliedToDimensionsUnitstring_(RegionsAppliedToDimensionsUnit)
RegionAppliedToDimensionsWreal_(RegionsAppliedToDimensionsW)
RegionListstruct_+--> MWG RegionStruct Struct +
(RegionsRegionList)
RegionAreastruct_+--> Area Struct +
(RegionsRegionListArea)
RegionAreaDreal_+(RegionsRegionListAreaD)
RegionAreaHreal_+(RegionsRegionListAreaH)
RegionAreaUnitstring_+(RegionsRegionListAreaUnit)
RegionAreaWreal_+(RegionsRegionListAreaW)
RegionAreaXreal_+(RegionsRegionListAreaX)
RegionAreaYreal_+(RegionsRegionListAreaY)
RegionBarCodeValuestring_+(RegionsRegionListBarCodeValue)
RegionDescriptionstring_+(RegionsRegionListDescription)
RegionExtensionsstruct_+--> MWG Extensions Struct +
(RegionsRegionListExtensions)
RegionFocusUsagestring_+(RegionsRegionListFocusUsage) +
'EvaluatedNotUsed' = Evaluated, Not Used +
'EvaluatedUsed' = Evaluated, Used +
'NotEvaluatedNotUsed' = Not Evaluated, Not Used
RegionNamestring_+(RegionsRegionListName)
RegionRotationreal_+(RegionsRegionListRotation; not part of MWG 2.0 spec)
RegionSeeAlsostring_+(RegionsRegionListSeeAlso)
RegionTypestring_+(RegionsRegionListType) +
'BarCode' = BarCode +
'Face' = Face +
'Focus' = Focus +
'Pet' = Pet
+ +

MWG RegionInfo Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
AppliedToDimensionsDimensions--> Dimensions Struct
RegionListMWG RegionStruct+--> MWG RegionStruct Struct
+ +

MWG RegionStruct Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
AreaArea--> Area Struct
BarCodeValuestring 
Descriptionstring 
ExtensionsMWG Extensions--> MWG Extensions Struct
FocusUsagestringEvaluatedNotUsed = Evaluated, Not Used +
EvaluatedUsed = Evaluated, Used +
NotEvaluatedNotUsed = Not Evaluated, Not Used
Namestring 
Rotationreal(not part of MWG 2.0 spec)
TypestringBarCode = BarCode +
Face = Face +
Focus = Focus +
Pet = Pet
SeeAlsostring 
+ +

MWG Extensions Struct

+

This structure may contain any top-level XMP tags, but none have been +pre-defined in ExifTool. Since no flattened tags have been pre-defined, +RegionExtensions is writable only as a structure (eg. +{xmp-dc:creator=me,rating=5}). Fields for this structure are identified +using the standard ExifTool tag name (with optional leading group name, +and/or trailing language code, and/or trailing # symbol to disable print +conversion).

+
+
+ + + + +
Field NameWritableValues / Notes
[no tags known]
+ +

MWG Keywords Tags

+

Hierarchical keywords metadata defined by the MWG 2.0 specification. +ExifTool unrolls keyword structures to an arbitrary depth of 6 to allow +individual levels to be accessed with different tag names, and to avoid +infinite recursion. See +https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf +for the official specification.

+ +

These tags belong to the ExifTool XMP-mwg-kw family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
KeywordInfostruct--> MWG KeywordInfo Struct +
(called Keywords by the spec)
HierarchicalKeywordsstruct_+--> MWG KeywordStruct Struct +
(KeywordsHierarchy)
HierarchicalKeywords1Appliedboolean_+(KeywordsHierarchyApplied)
HierarchicalKeywords1Childrenstruct_+--> MWG KeywordStruct Struct +
(KeywordsHierarchyChildren)
HierarchicalKeywords2Appliedboolean_+(KeywordsHierarchyChildrenApplied)
HierarchicalKeywords2Childrenstruct_+--> MWG KeywordStruct Struct +
(KeywordsHierarchyChildrenChildren)
HierarchicalKeywords3Appliedboolean_+(KeywordsHierarchyChildrenChildrenApplied)
HierarchicalKeywords3Childrenstruct_+--> MWG KeywordStruct Struct +
(KeywordsHierarchyChildrenChildrenChildren)
HierarchicalKeywords4Appliedboolean_+(KeywordsHierarchyChildrenChildrenChildrenApplied)
HierarchicalKeywords4Childrenstruct_+--> MWG KeywordStruct Struct +
(KeywordsHierarchyChildrenChildrenChildrenChildren)
HierarchicalKeywords5Appliedboolean_+(KeywordsHierarchyChildrenChildrenChildrenChildrenApplied)
HierarchicalKeywords5Childrenstruct_+--> MWG KeywordStruct Struct +
(KeywordsHierarchyChildrenChildrenChildrenChildrenChildren)
HierarchicalKeywords6Appliedboolean_+(KeywordsHierarchyChildrenChildrenChildrenChildrenChildrenApplied)
HierarchicalKeywords6string_+(KeywordsHierarchyChildrenChildrenChildrenChildrenChildrenKeyword)
HierarchicalKeywords5string_+(KeywordsHierarchyChildrenChildrenChildrenChildrenKeyword)
HierarchicalKeywords4string_+(KeywordsHierarchyChildrenChildrenChildrenKeyword)
HierarchicalKeywords3string_+(KeywordsHierarchyChildrenChildrenKeyword)
HierarchicalKeywords2string_+(KeywordsHierarchyChildrenKeyword)
HierarchicalKeywords1string_+(KeywordsHierarchyKeyword)
+ +

MWG KeywordInfo Struct

+
+
+ + + + + + + +
Field NameWritableValues / Notes
HierarchyMWG KeywordStruct+--> MWG KeywordStruct Struct
+ +

MWG KeywordStruct Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Appliedboolean 
ChildrenMWG KeywordStruct+--> MWG KeywordStruct Struct
Keywordstring 
+ +

MWG Collections Tags

+

Collections metadata defined by the MWG 2.0 specification. See +https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf +for the official specification.

+ +

These tags belong to the ExifTool XMP-mwg-coll family 1 group.

+
+
+ + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Collectionsstruct+--> MWG CollectionInfo Struct
CollectionNamestring_+(CollectionsCollectionName)
CollectionURIstring_+(CollectionsCollectionURI)
+ +

MWG CollectionInfo Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
CollectionNamestring 
CollectionURIstring 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Apr 1, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/MXF.html b/html/TagNames/MXF.html new file mode 100644 index 0000000..98162f1 --- /dev/null +++ b/html/TagNames/MXF.html @@ -0,0 +1,6674 @@ + + + + +MXF Tags + + + +

MXF Tags

+

Tags extracted from Material Exchange Format files. Tag ID's are not listed +because they are bulky 16-byte binary values.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AAFManufacturerID?no 
AES3PCMDescriptor---> MXF Tags
AFDAndBarData?no 
AGICOAID?no 
AICI?no 
AIFCSummary?no 
ANCPacketCountno 
ANCPayloadByteArrayno 
ANCPayloadSampleCodingno 
ANCPayloadSampleCountno 
ANCWrappingTypeno 
Abstractno 
Abstractno 
AccountingReferenceNumberno 
ActiveFormatDescriptorno 
ActiveLinesperFrameno 
ActiveSamplesperLineno 
ActiveStateno 
Ad-ID?no 
Address---> MXF Tags
AddressLineno 
AddressLineno 
AddressNameValueSets?no 
AddressSets?no 
AdvertisingMaterialReferenceno 
AestheticValueno 
AlphaMaximumRefno 
AlphaMinimumRefno 
AlphaSampleDepthno 
AlphaTransparencyno0 = Not Inverted +
1 = Inverted
AlternateNameno 
AlternateNameno 
Alternates?no 
AnalogDataCodingKindno 
AnalogMetadataCarrierno 
AnalogMonitoringAndControlCodingKindno 
AnalogSystemno 
AnalogVideoSystemNameno 
AnalogVideoSystemName?no 
AnamorphicLensCharacteristicno 
AnchorOffsetno 
AncillaryResourceID?no 
AngleToNorthno 
AngularUnitKindno 
Annotation?no 
Annotation---> MXF Tags
AnnotationCueWordsSet?no 
AnnotationDescriptionno 
AnnotationDescriptionno 
AnnotationKindno 
AnnotationKindno 
AnnotationParticipantSets?no 
AnnotationSets?no 
AnnotationSynopsisno 
AnnotationSynopsisno 
ApplicationEnvironmentIDno 
ApplicationInformationArray?no 
ApplicationNameno 
ApplicationNameno 
ApplicationPlatformno 
ApplicationPlatformno 
ApplicationPlug-InBatch?no 
ApplicationPlug-InInstanceID?no 
ApplicationProductID?no 
ApplicationScheme?no 
ApplicationSchemeBatch?no 
ApplicationSupplierNameno 
ApplicationSupplierNameno 
ApplicationVersionNumberno 
ApplicationVersionStringno 
ApplicationVersionStringno 
ApproximateImageContainerSizeno 
ArchiveIDno 
AssetValueno 
AssignedCategoryNameno 
AssignedCategoryNameno 
AssignedCategoryValueno 
AssignedCategoryValueno 
AssociatedMetadataDefinition?no 
AstronomicalBodyNameno 
AstronomicalBodyNameno 
AudienceAppreciationno 
AudienceRatingno 
AudienceReachno 
AudienceShareno 
AudioAverageBitrateno 
AudioCodingSchemeCodeno 
AudioCodingSchemeID?no 
AudioCodingSchemeNameno 
AudioCompressionAlgorithmno 
AudioDeviceKindno 
AudioDeviceParameterno 
AudioDeviceParameterSettingno 
AudioEnhancementOrModificationDescriptionno 
AudioFirstMix-DownProcessno 
AudioFixedBitrateFlagno 
AudioMonoChannelCountno 
AudioNoiseReductionAlgorithmno 
AudioReferenceLevelno 
AudioReferenceLevelno 
AudioSampleRateno 
AudioSampleRateno 
AudioStereoChannelCountno 
AudioWatermarkKindno 
AuthenticationFlagno 
AuxiliaryBitsModeno 
AvailableRepresentations?no 
AverageBytesPerSecondno 
Award---> MXF Tags
AwardCategoryno 
AwardCategoryno 
AwardNameno 
AwardNameno 
AwardParticipantSets?no 
AwardSets?no 
BICI?no 
BackgroundMusicFlagno 
BankDetailsSet?no 
BeginAnchorno 
BeginAnchorno 
BextCodingHistoryno 
BextCodingHistoryno 
Bitrateno 
BitsPerAudioSampleno 
BitsPerPixelno 
BitsPerPixelno 
BitsPerSampleno 
BlackReferenceLevelno 
BlockAlignno 
BlockContinuityCountno 
BlockStartOffsetno 
BoundingRectangle?no 
BrandMainTitleno 
BrandMainTitleno 
BrandOriginalTitleno 
BrandOriginalTitleno 
Branding---> MXF Tags
BrandingSets?no 
BroadcastChannelno 
BroadcastDateno 
BroadcastMediumCodeno 
BroadcastMediumKindno 
BroadcastOrganizationNameno 
BroadcastOrganizationNameno 
BroadcastRegionno 
BroadcastRegionno 
BroadcastServiceNameno 
BroadcastTimeno 
BroadcasterRightsToCopyno 
BufferDelay?no 
BuildingNameno 
BuildingNameno 
Bypassno 
BypassOverrideno 
ByteOffsetno 
ByteOrderno'II' = Little-endian (Intel, II) +
'MM' = Big-endian (Motorola, MM)
CBEStartOffsetno 
CDCIEssenceDescriptor---> MXF Tags
CISACLegalEntityID?no 
CaptionDescription---> MXF Tags
CaptionDescriptionSets?no 
CaptionKindno 
CaptionKindno 
CaptionTitlesno 
CaptionsDescriptionParticipantSets?no 
CaptionsViaTeletextno 
CaptureAspectRationo 
CaptureFilmFrameRateno 
CaptureGammaEquationno 
CaptureGammaEquationno 
CaptureGammaEquation?no 
CatalogDataStatusno 
CatalogDataStatusno 
CatalogPrefixNumberno 
CatalogingSystemNameno 
CentralTelephoneNumberno 
ChannelAssignment?no 
ChannelCountno 
ChannelHandleno 
ChannelIDno 
ChannelIDsno 
ChannelStatusModeno[Value 0] +
0 = No Channel Status Data +
1 = AES3 Minimum +
2 = AES3 Standard +
3 = Fixed 24 Bytes in FixedChannelStatusData +
4 = Stream of Data in MXF Header Metadata +
5 = Stream of Data Multiplexed within MXF Body
+
CipherAlgorithm?no 
CipherAlgorithmAES128CBC?no 
Citizenshipno 
Citizenshipno 
CityNameno 
CityNameno 
ClassDefinitions?no 
Classification---> MXF Tags
ClassificationAndMarkingSystemno 
ClassificationCommentno 
ClassificationCommentno 
ClassificationNameValueSets?no 
ClassificationReasonno 
ClassificationSets?no 
ClassifiedByno 
ClassifyingCountryCodeno 
ClipCreationDateTimeno 
ClipFramework---> MXF Tags
ClipIDno 
ClipIDArray?no 
ClipKindno 
ClipNumberno 
ClipNumberno 
ClipShotSets?no 
CloneCountno 
ClosedBodyPartition?no 
ClosedCaptionSubtitlesFlagno 
ClosedCompleteBodyPartition?no 
ClosedCompleteHeader---> MXF Header Tags
ClosedGOPIndicatorno 
ClosedHeader---> MXF Header Tags
CodecDefinition?no 
CodecDefinition?no 
CodecDefinitions?no 
CodecEssenceDescriptor?no 
CodecEssenceKinds?no 
CodedContentScanningKindno0 = Unknown +
1 = Progressive +
2 = Interlaced +
3 = Mixed
CodingLawKindno 
CodingLawNameno 
CodingStyleDefault?no 
CollectionNameno 
CollectionNameno 
ColorDescriptorno 
ColorDescriptorno 
ColorFieldCodeno 
ColorPrimariesno 
ColorPrimaries?no 
ColorRangeLevelsno 
ColorSitingno 
ColorimetryCodeno 
ColorimetryCode?no 
CommunicationSets?no 
Communications---> MXF Tags
CompleteFooter?no 
ComponentAttributes?no 
ComponentDataDefinitionno'060e2b34.0401.0101.01030201.01000000' = SMPTE 12M Timecode Track +
'060e2b34.0401.0101.01030201.02000000' = SMPTE 12M Timecode Track with active user bits +
'060e2b34.0401.0101.01030201.03000000' = SMPTE 309M Timecode Track +
'060e2b34.0401.0101.01030201.10000000' = Descriptive Metadata Track +
'060e2b34.0401.0101.01030202.01000000' = Picture Essence Track +
'060e2b34.0401.0101.01030202.02000000' = Sound Essence Track +
'060e2b34.0401.0101.01030202.03000000' = Data Essence Track
ComponentDepthno 
ComponentKLVData?no 
ComponentMaximumRefno 
ComponentMinimumRefno 
ComponentUserComments?no 
ComponentsInSequence?no 
CompositionRendering?no 
ComputedKeyDatano 
ComputedKeyFramesno 
ComputedKeySoundsno 
ComputedKeywordsno 
ComputedKeywordsno 
ComputedObjectKindno 
ComputedObjectKindno 
ComputedStratumKindno 
ConstantBPictureFlagno 
ConsumerRightsToCopyno 
ContactDepartmentNameno 
ContactDepartmentNameno 
ContactID?no 
ContactKindno 
ContactKindno 
ContactNameValueSets?no 
ContactsList---> MXF Tags
ContactsListSet?no 
ContainerDefinitions?no 
ContainerLastModifyDateno 
ContainerVersionno 
ContentClassificationno 
ContentClassificationno 
ContentCodingSystemno 
ContentMaturityDescriptionno 
ContentMaturityGraphicno 
ContentMaturityRatingno 
ContentPackageIndexArray?no 
ContentPackageMetadataLinkno 
ContentStorage?no 
ContentStorageSet---> MXF Tags
ContentValueno 
ContextDescriptionno 
ContiguousDataFlagno 
Contract---> MXF Tags
ContractClauseDescriptionno 
ContractClauseDescriptionno 
ContractDateTimeno 
ContractEntityno 
ContractInstallmentPercentageno 
ContractLineCodeno 
ContractLineNameno 
ContractLineNameno 
ContractParticipantSets?no 
ContractSets?no 
ContractTermsOfBusinessno 
ContractTermsOfBusinessno 
ContractTypeno 
ContractTypeno 
ContractTypeCodeno 
ContractTypeLinkno 
ContributionStatusno 
ContributionStatusno 
ControlPointList?no 
ControlPointTimeno 
CopyCountno 
CopyrightLicenseCountryCodeno 
CopyrightLicenseRegionCodeno 
CopyrightLicenseRegionNameno 
CopyrightOwnerNameno 
CopyrightOwnerNameno 
CopyrightStatusno 
CopyrightStatusno 
CornerLatitudePoint1no 
CornerLatitudePoint1no 
CornerLatitudePoint2no 
CornerLatitudePoint2no 
CornerLatitudePoint3no 
CornerLatitudePoint3no 
CornerLatitudePoint4no 
CornerLatitudePoint4no 
CornerLongitudePoint1no 
CornerLongitudePoint1no 
CornerLongitudePoint2no 
CornerLongitudePoint2no 
CornerLongitudePoint3no 
CornerLongitudePoint3no 
CornerLongitudePoint4no 
CornerLongitudePoint4no 
CountryCodeMethodno 
CountryCodeMethodno 
CountryNameno 
CountryNameno 
CountryNameno 
CountryNameno 
CreateDateno 
CryptographicContext---> MXF Tags
CryptographicContextID?no 
CryptographicContextLink?no 
CryptographicContextObject?no 
CryptographicFramework---> MXF Tags
CryptographicFrameworkLabel?no 
CryptographicKeyID?no 
Csizno 
Cue-InWordsno 
Cue-InWordsno 
Cue-OutWordsno 
Cue-OutWordsno 
CueWords---> MXF Tags
CulturalValueno 
CurrencyCodeno 
CurrencyNameno 
CurrentNumberInSequenceno 
CurrentNumberInSequenceno 
CurrentRepeatNumberno 
CutPointno 
DMFramework---> MXF Tags
DMSegment---> MXF Tags
DMSet---> MXF Tags
DMSourceClip---> MXF Tags
DOI?no 
DVBParentalRatingno 
DataDefinition?no 
DataDefinitions?no 
DataDeviceKindno 
DataDeviceParameterNameno 
DataDeviceParameterSettingno 
DataEnhancementOrModificationDescriptionno 
DataEssenceCodingno 
DataEssenceCodingID?no 
DateTimeDropFrameFlagno 
DateTimeEmbeddedFlagno 
DateTimeKind?no 
DateTimeRateno 
DeclassificationDateno 
DefaultDataValue?no 
DefaultFadeDurationno 
DefaultFadeEditRateno 
DefaultFadeType?no 
DefaultNamespaceURIno 
DefaultNamespaceURIno 
DefaultObject?no 
DefinedNameno 
DefinedNameno 
DefinitionObjectID?no 
DefinitionObjectNameno 
DefinitionObjectNameno 
DegradedEffects?no 
DeltaEntryArray?no 
DerivedFromno 
Descriptionno 
Descriptionno 
DescriptionKindno 
DescriptionKindno 
DescriptiveCommentno 
DescriptiveCommentno 
DescriptiveMetadataApplicationEnvironmentIDno 
DescriptiveMetadataFramework?no 
DescriptiveMetadataPlug-InID?no 
DescriptiveMetadataScheme?no 
DescriptiveMetadataSchemes?no 
DescriptiveMetadataSetReferences?no 
DescriptiveMetadataSets?no 
DescriptiveMetadataTrackIDsno 
DeviceAbsoluteHeadingno 
DeviceAbsolutePositionalAccuracyno 
DeviceAbsoluteSpeedno 
DeviceAltitudeno 
DeviceAltitudeno 
DeviceAssetNumberno 
DeviceDesignationno 
DeviceIDKindno 
DeviceKindno 
DeviceKindno 
DeviceKindCodeno 
DeviceLatitudeno 
DeviceLatitudeno 
DeviceLatitudeno 
DeviceLongitudeno 
DeviceLongitudeno 
DeviceLongitudeno 
DeviceManufacturerNameno 
DeviceManufacturerNameno 
DeviceModelno 
DeviceParameterNameValueSets?no 
DeviceParameters---> MXF Tags
DeviceParametersSets?no 
DeviceRelativeHeadingno 
DeviceRelativePositionXno 
DeviceRelativePositionYno 
DeviceRelativePositionZno 
DeviceRelativePositionalAccuracyno 
DeviceRelativeSpeedno 
DeviceSerialNumberno 
DeviceUsageDescriptionno 
DeviceUsageDescriptionno 
DeviceXDimensionno 
DeviceYDimensionno 
DialNormno 
Dictionary?no 
DictionaryDescriptionno 
DictionaryDescriptionno 
DictionaryIdentifier?no 
DigitalEncodingBitrateno 
DigitalMetadataCarrierno 
DigitalOrAnalogOriginationno 
DigitalVideoFileFormatno 
DirectorNameno 
DiscPartitionCapacityno 
DisplayF2Offsetno 
DisplayHeightno 
DisplayUnitsno 
DisplayUnitsno 
DisplayWidthno 
DisplayXOffsetno 
DisplayYOffsetno 
Ditherno 
DropFrameno 
Durationno 
DynamicSourcePackageID?no 
DynamicSourceTrackIDsno 
E-mailAddressno 
E-mailAddressno 
EPGProgramSynopsisno 
EdgeCodeno 
EdgeCodeFilmGauge?no 
EdgeCodeFormat?no 
EdgeCodeHeader?no 
EdgeCodeStartno 
EditHint?no 
EditRateno 
EditUnitFlagsno 
EditUnitLengthno 
EditingEventCommentno 
EditingEventCommentno 
EffectRendering?no 
ElectrospatialFormulationno 
ElementCountno 
ElementDeltano 
ElementLengthno 
ElementNameListno 
Emphasisno 
EncryptedContainerLabel?no 
EncryptedSourceValue?no 
EncryptedTrackFileID?no 
EndAnchorno 
EndAnchorno 
EnhancementOrModificationDescriptionno 
EnumerationUnderlyingIntegerType?no 
EpisodeEndNumberno 
EpisodeNumberno 
EpisodeNumberno 
EpisodeStartNumberno 
EpisodicItemSets?no 
EssenceContainerArray?no 
EssenceContainerDataSet---> MXF Tags
EssenceContainerFormat?no 
EssenceContainerFormat?no 
EssenceContainers?no 
EssenceData?no 
EssenceDescription?no 
EssenceIsIdentifiedno 
EssenceLengthno 
EssenceLocators?no 
EssenceStreamIDno 
Event---> MXF Tags
EventAbsoluteDurationno 
EventAbsoluteDuration?no 
EventAbsoluteDurationFrameCountno 
EventAnnotationSets?no 
EventElapsedTimeToEndno 
EventElapsedTimeToStartno 
EventEndTimeOffsetno 
EventEndTimecodeOffset?no 
EventIndicationno 
EventIndicationno 
EventOriginno 
EventSets?no 
EventStartno 
EventStartTimeOffsetno 
EventStartTimecodeOffset?no 
EventTrack---> MXF Tags
EventTrackEditRateno 
ExCCIData?no 
ExposedAspectRationo 
ExtendedCaptionsLanguageCodeno 
ExtendedClipIDno 
ExtendedClipIDArray?no 
ExtendedTextLanguageCodeno 
ExtendibleElementNameListno 
FNumberno 
Fade-InDurationno 
Fade-InType?no 
Fade-OutDurationno 
Fade-OutType?no 
FamilyNameno 
FamilyNameno 
FaxNumberno 
FaxNumberno 
FemaleLeadActressNameno 
FestivalNameno 
FestivalNameno 
FieldDominanceno 
FieldFrameTypeCodeno 
FieldOfViewHorizontalno 
FieldOfViewHorizontalno 
FieldOfViewVerticalno 
FieldOfViewVerticalFPno 
FieldRateno 
FileDescriptor---> MXF Tags
FileDescriptors?no 
FileSecurityReportno 
FileSecurityWaveno 
FillerData?no 
FilmBatchNumberno 
FilmBatchNumberno 
FilmCaptureApertureno 
FilmColorProcessno 
FilmFormatNameno 
FilmFormatNameno 
FilmFormatName?no 
FilmGauge?no 
FilmStockKindno 
FilmStockKindno 
FilmStockManufacturerNameno 
FilmStockManufacturerNameno 
FilmTestParameterno 
FilmTestResultno 
FilmTestResult?no 
FilmToVideoTransferDirection?no 
FilmToVideoTransferKind?no 
FilmToVideoTransferPhase?no 
FilteringAppliedno 
FilteringCodeno 
FirstBroadcastFlagno 
FirstGivenNameno 
FirstGivenNameno 
FirstNumberInSequenceno 
FirstNumberInSequenceno 
FirstTransmissionInfono 
FixedArrayElementType?no 
FixedChannelStatusData?no 
FixedUserData?no 
FocalLengthno 
FocalLengthno 
Footer?no 
FormatDescriptorno 
FormatDescriptorno 
FormerFamilyNameno 
FormerFamilyNameno 
FrameCenterElevationno 
FrameCenterLatitudeno 
FrameCenterLatitudeno 
FrameCenterLatitudeno 
FrameCenterLatitudeLongitudeno 
FrameCenterLongitudeno 
FrameCenterLongitudeno 
FrameCenterLongitudeno 
FrameCodeno 
FrameCountno 
FrameCountOffsetno 
FrameLayoutno 
FramePositionalAccuracyno 
FrameRateno 
FrameworkExtendedTextLanguageCodeno 
FrameworkTextLanguageCodeno 
FrameworkThesaurusNameno 
FrameworkThesaurusNameno 
FrameworkTitleno 
FrameworkTitleno 
GenerationCloneNumberno 
GenerationCopyNumberno 
GenerationID?no 
GenericDataEssenceDescriptor---> MXF Tags
GenericPackage---> MXF Tags
GenericPayloads?no 
GenericPictureEssenceDescriptor---> MXF Tags
GenericSoundEssenceDescriptor---> MXF Tags
GenericTrack---> MXF Tags
Genreno 
Genreno 
GeographicAreaNorthwest?no 
GeographicAreaSourceDatumno 
GeographicAreaSoutheast?no 
GeographicLocation?no 
GeographicPolygonCoordinates?no 
GeographicPolygonSourceDatumno 
GeographicalCoordinates?no 
GlobalNumberno 
GraphicKindno 
GraphicUsageKindno 
GraphicUsageKindno 
GroupRelationship---> MXF Tags
GroupSet?no 
GroupSets?no 
GroupSynopsisno 
GroupSynopsisno 
HMACAlgorithmSHA1128?no 
HTMLDOCTYPEno 
HTMLDOCTYPEno 
HTMLMetaDescriptionno 
HTMLMetaDescriptionno 
HardwareAcceleratorFlagno 
HasAudioWatermarkno 
HasVideoWatermarkno 
HeaderByteCountno 
HistoricalValueno 
HonorsAndQualificationsno 
HonorsAndQualificationsno 
HorizontalActionSafePercentageno 
HorizontalDatumno 
HorizontalGraphicsSafePercentageno 
HorizontalSubsamplingno 
IBTN?no 
IEEEDeviceIDno 
IEEEManufacturerIDno 
ISAN?no 
ISBD?no 
ISBN?no 
ISCI?no 
ISMN?no 
ISO3166CountryCodeno 
ISO639-1LanguageCodeno 
ISO639-1LanguageCodeno 
ISO639CaptionsLanguageCodeno 
ISO639TextLanguageCodeno 
ISRC?no 
ISRN?no 
ISSN?no 
ISTC?no 
ISWC?no 
IdenticalGOPIndicatorno 
Identification---> MXF Tags
Identification---> MXF Tags
IdentificationList?no 
IdentificationSets?no 
IdentificationUL?no 
IdentifierIssuingAuthorityno 
IdentifierIssuingAuthorityno 
IdentifierKindno 
IdentifierValueno 
ImageAlignmentOffsetno 
ImageCategoryno 
ImageCoordinateSystemno 
ImageEndOffsetno 
ImageFormatSet?no 
ImageHeightno 
ImageSourceDeviceKindno 
ImageSourceDeviceKindno 
ImageStartOffsetno 
ImageWidthno 
IncludeSyncno 
IndexByteCountno 
IndexDurationno 
IndexEditRateno 
IndexEntryArray?no 
IndexStreamIDno 
IndexTableSegment?no 
IndexingStartPositionno 
IndividualAwardNameno 
InkNumberno 
InputSegment?no 
InputSegmentCountno 
InputSegments?no 
InsertMusicFlagno 
InstallmentNumberno 
InstanceUID?no 
IntegrationIndicationno 
IntegrationIndicationno 
IntellectualPropertyDescriptionno 
IntellectualPropertyDescriptionno 
IntellectualPropertyLicenseCountryCodeno 
IntellectualPropertyLicenseRegionCodeno 
IntellectualPropertyLicenseRegionNameno 
IntellectualPropertyRightsno 
IntellectualPropertyRightsno 
IntendedAFDno 
IntentDescriptorno 
IntentDescriptorno 
InterestedPartyNameno 
Interpolation?no 
InterpolationDefinitions?no 
IsConcreteno 
IsDubbedno 
IsLiveProductionno 
IsLiveTransmissionno 
IsOptionalno 
IsRecordingno 
IsRepeatno 
IsSearchableno 
IsSignedno 
IsUniqueIdentifierno 
IsVoiceoverno 
ItemDesignatorID?no 
ItemIDno 
ItemNameno 
ItemNameno 
ItemValueno 
ItemValueno 
JFIFMarkerDescriptionno 
JFIFMarkerDescriptionno 
JPEG2000PictureSubDescriptor---> MXF Tags
JPEGTableID?no 
JobFunctionCodeno 
JobFunctionNameno 
JobFunctionNameno 
JobTitleno 
JobTitleno 
Jurisdictionno 
Jurisdictionno 
KAGSizeno 
KLVDataDefinitions?no 
KLVDataParentProperties?no 
KLVDataType?no 
KLVDataValue?no 
KLVMetadataSequence?no 
KeyCode?no 
KeyDatano 
KeyDataOrProgramno 
KeyFrameno 
KeyFrameSampleCountno 
KeyFramesno 
KeyPoint---> MXF Tags
KeyPointSets?no 
KeySoundno 
KeySoundsno 
KeyTextno 
KeyTimePointno 
KeypointKindno 
KeypointKindno 
KeypointValueno 
KeypointValueno 
Keywordsno 
Keywordsno 
LUIDno 
LanguageNameno 
LanguageNameno 
LastNumberInSequenceno 
LastNumberInSequenceno 
LayerNumberno 
LeadingLinesno 
LengthSystemNameno 
LengthUnitKindno 
LicenseOptionsDescriptionno 
LineNumberno 
LinkedApplicationPlug-InInstanceID?no 
LinkedDescriptiveFrameworkPlug-InID?no 
LinkedDescriptiveObjectPlug-InID?no 
LinkedGenerationID?no 
LinkedPackageID?no 
LinkedTimecodeTrackID?no 
LinkedTrackIDno 
LinkingNameno 
LinkingNameno 
LocalCreationDateTimeno 
LocalDatumAbsolutePositionAccuracyno 
LocalDatumRelativePositionAccuracyno 
LocalEndDateTimeno 
LocalEventEndDateTimeno 
LocalEventEndDateTimeno 
LocalEventStartDateTimeno 
LocalEventStartDateTimeno 
LocalFestivalDateTimeno 
LocalFilePathno 
LocalFilePathno 
LocalIDno 
LocalLastModifyDateno 
LocalModifyDateno 
LocalStartDateTimeno 
LocalTagEntries?no 
LocalTagUniqueID?no 
LocalTagValueno 
LocalTapeNumberno 
LocalTargetIDno 
LocalTargetIDno 
LocalUserDateTimeno 
Location---> MXF Tags
LocationDescriptionno 
LocationDescriptionno 
LocationKindno 
LocationKindno 
LocationSets?no 
LockedIndicatorno 
LogoFlagno 
LowDelayIndicatorno 
LumaEquationno 
LuminanceSampleRateno 
MIC?no 
MICAlgorithm?no 
MIMECharSetno 
MIMECharSetno 
MIMEEncodingno 
MIMEEncodingno 
MIMEMediaTypeno 
MIMEMediaTypeno 
MPEG2VideoDescriptor---> MXF Tags
MPEG7BiMAccessUnitFrame1?no 
MPEG7BiMAccessUnitFrame2?no 
MPEG7BiMAccessUnitFrame3?no 
MPEG7BiMAccessUnitFrame4?no 
MPEG7BiMAccessUnitFrame5?no 
MPEG7BiMAccessUnitFrame6?no 
MPEG7BiMAccessUnitFrame7?no 
MPEG7BiMAccessUnitFrame8?no 
MPEG7BiMDecoderInitFrame1?no 
MPEG7BiMDecoderInitFrame2?no 
MPEG7BiMDecoderInitFrame3?no 
MPEG7BiMDecoderInitFrame4?no 
MPEG7BiMDecoderInitFrame5?no 
MPEG7BiMDecoderInitFrame6?no 
MPEG7BiMDecoderInitFrame7?no 
MPEG7BiMDecoderInitFrame8?no 
MPEGAudioBitrateno 
MPEGAudioRecodingDataset?no 
MPEGVideoRecodingDataset?no 
MagneticDiskNumberno 
MagneticTrackno 
MainCatalogNumberno 
MainNameno 
MainNameno 
MainSponsorNameno 
MainTitleno 
MainTitleno 
MajorVersionno 
MaleLeadActorNameno 
ManufacturerID?no 
ManufacturerInformationObject?no 
MapDatumUsedno 
MarkInno 
MarkOutno 
MaterialAbsoluteDurationno 
MaterialAbsoluteDuration?no 
MaterialEndTimeOffsetno 
MaterialEndTimecodeOffset?no 
MaterialPackage---> MXF Tags
MaximumAPIVersionno 
MaximumBPictureCountno 
MaximumGOPSizeno 
MaximumSupportedEngineVersionno 
MaximumSupportedPlatformVersionno 
MaximumUseCountno 
MediaLocationno 
MemberNameListno 
MemberTypes?no 
MetadataEncodingSchemeCodeno 
MetadataItemNameno 
MetadataItemNameno 
MetadataServerLocators?no 
MicrophonePlacementTechniquesno 
MinimumAPIVersionno 
MinimumSupportedEngineVersionno 
MinimumSupportedPlatformVersionno 
MinorVersionno 
MissionIDno 
MissionIDno 
MobileTelephoneNumberno 
ModifyDateno 
MonoSourceTrackIDsno 
MultipleDescriptor---> MXF Tags
NITFLayerTargetIDno 
NITFLayerTargetIDno 
NMEADocumentTextno 
NOLACodeno 
NameSuffixno 
NameSuffixno 
NameValue---> MXF Tags
NamespacePrefixno 
NamespacePrefixno 
NamespacePrefixesno 
NamespacePrefixesno 
NamespaceURIno 
NamespaceURIno 
NamespaceURIsno 
NamespaceURIsno 
Nationalityno 
Nationalityno 
NatureOfPersonalityno 
NatureOfPersonalityno 
NetworkLocator---> MXF Tags
NextNumberInSequenceno 
NextNumberInSequenceno 
NielsenStreamIdentifierno 
NominationCategoryno 
NominationCategoryno 
Non-USClassifyingCountryCodeno 
ObjectAreaDimensionno 
ObjectClass?no 
ObjectClassDefinition?no 
ObjectCountryCodeno 
ObjectCountryCodeno 
ObjectCountryCodeMethodno 
ObjectDescriptionno 
ObjectDescriptionno 
ObjectDescriptionCodeno 
ObjectHorizontalAverageDimensionno 
ObjectIdentificationConfidenceno 
ObjectKindno 
ObjectKindno 
ObjectModelVersionno 
ObjectNameno 
ObjectRegionCodeno 
ObjectRegionNameno 
ObjectVerticalAverageDimensionno 
ObliquityAngleno 
OffsetToIndexTableno 
OffsetToIndexTableno 
OffsetToMetadatano 
OffsetToMetadatano 
OpenBodyPartition?no 
OpenCompleteBodyPartition?no 
OpenCompleteHeader---> MXF Header Tags
OpenHeader---> MXF Header Tags
OperatingSystemInterpretationsno 
OperationCategory?no 
OperationDataDefinition?no 
OperationDefinitionID?no 
OperationDefinitions?no 
OperationParameters?no 
OperationalPatternUL?no 
OpticalDiscNumberno 
OpticalTestParameterNameno 
OpticalTestResultno 
OpticalTestResultno 
OpticalTrackno 
Organisation---> MXF Tags
OrganizationCodeno 
OrganizationCodeno 
OrganizationIDno 
OrganizationIDno 
OrganizationIDKindno 
OrganizationIDKindno 
OrganizationKindno 
OrganizationKindno 
OrganizationMainNameno 
OrganizationMainNameno 
OrganizationSets?no 
OrganizationalProgramNumberno 
OrganizationalProgramNumberno 
Originno 
OriginCodeno 
OriginalExtendedSpokenPrimaryLanguageCodeno 
OriginalProducerNameno 
OriginalProducerNameno 
OriginalTitleno 
OriginalTitleno 
OtherGivenNamesno 
OtherGivenNamesno 
OtherValuesno 
PII?no 
POSIXMicrosecondsno 
PURLno 
PackLengthno 
PackageAttributes?no 
PackageID?no 
PackageKLVData?no 
PackageLastModifyDateno 
PackageMarkInPositionno 
PackageMarkOutPositionno 
PackageMarker?no 
PackageNameno 
PackageNameno 
PackageTimelineMarkerRef?no 
PackageTracks?no 
PackageUsageKind?no 
PackageUserComments?no 
Packages?no 
PaddingBitsno 
Palette?no 
PaletteLayout?no 
PanScanInformation?no 
ParameterDataType?no 
ParameterDefinition?no 
ParameterDefinitions?no 
Parameters?no 
ParentClass?no 
Participant---> MXF Tags
ParticipantID?no 
ParticipantOrganizationSets?no 
PartitionMetadata?no 
Passwordno 
Passwordno 
PayeeAccountNameno 
PayeeAccountNumberno 
PayeeAccountSortCodeno 
PayerAccountNameno 
PayerAccountNumberno 
PayerAccountSortCodeno 
PaymentDueDateTimeno 
PaymentsSets?no 
PeakChannelCountno 
PeakEnvelopeno 
PeakEnvelopeBlockSizeno 
PeakEnvelopeData?no 
PeakEnvelopeData?no 
PeakEnvelopeFormatno 
PeakEnvelopeTimestampno 
PeakEnvelopeVersionno 
PeakFrameCountno 
PeakOfPeaksPositionno 
PerceivedDisplayFormatCodeno 
PerceivedDisplayFormatNameno 
PerforationsPerFrameno 
PerforationsPerFrameno 
Person---> MXF Tags
PersonDescriptionno 
PersonDescriptionno 
PersonOrganizationSets?no 
PersonSets?no 
PhysicalInstanceKindno 
PhysicalMediaLength?no 
PhysicalMediaLocationno 
PictureComponentSizing?no 
PictureDisplayRateno 
PictureFormat---> MXF Tags
PixelLayout?no 
PlaceKeywordno 
PlaceKeywordno 
PlaceNameno 
PlaceNameno 
PlaintextOffsetno 
PlatformDesignationno 
PlatformDesignationno 
PlatformHeadingAngleno 
PlatformModelno 
PlatformPitchAngleno 
PlatformRollAngleno 
PlatformSerialNumberno 
Plug-InAPIID?no 
Plug-InCategoryID?no 
Plug-InDefinitions?no 
Plug-InEngineID?no 
Plug-InLocatorSet?no 
Plug-InPlatformID?no 
PointsPerPeakValueno 
PolarCharacteristicno 
PosTableArray?no 
PositionInSequenceno 
PositionTable?no 
PositionTableCountno 
PositionTableIndexingno 
PositionWithinViewportImageXCoordinateno 
PositionWithinViewportImageYCoordinateno 
PostCodeForPostboxno 
PostalCodeno 
PostalCodeno 
PostalTownno 
PostalTownno 
PostboxNumberno 
Preface---> MXF Tags
PresentationAspectRationo 
PresentationGammaEquationno 
PresentationGammaEquation?no 
PresenterNameno 
PreviousNumberInSequenceno 
PreviousNumberInSequenceno 
PreviousRepeatNumberno 
PrimaryExtendedSpokenLanguageCodeno 
PrimaryOriginalLanguageCodeno 
PrimaryPackage?no 
PrimarySpokenLanguageCodeno 
Primer---> MXF Tags
Processing---> MXF Tags
ProcessingSet?no 
ProducerNameno 
ProductFormatno 
ProductFormatno 
ProductionFramework---> MXF Tags
ProductionOrganizationRoleno 
ProductionOrganizationRoleno 
ProductionScriptReferenceno 
ProductionScriptReferenceno 
ProductionSettingPeriodSets?no 
ProfileAndLevelno 
ProgramAwardNameno 
ProgramCommercialMaterialReferenceno 
ProgramIdentifierno 
ProgramIdentifierStringno 
ProgramKindno 
ProgramMaterialClassificationCodeno 
ProgramNumberno 
ProgramSupportMaterialReferenceno 
ProgrammingGroupKindno 
ProgrammingGroupKindno 
ProgrammingGroupTitleno 
ProgrammingGroupTitleno 
ProjectNameno 
ProjectNameno 
ProjectNumberno 
ProjectSet?no 
Projects---> MXF Tags
Properties?no 
PropertyType?no 
Publication---> MXF Tags
PublicationSets?no 
PublishingMediumNameno 
PublishingMediumNameno 
PublishingOrganizationNameno 
PublishingOrganizationNameno 
PublishingRegionNameno 
PublishingRegionNameno 
PublishingServiceNameno 
PublishingServiceNameno 
PulldownFieldDominanceno 
PulldownSequence?no 
PurchaserAccountNameno 
PurchaserAccountNameno 
PurchaserAccountNumberno 
PurchaserIdentificationKindno 
PurchaserIdentificationValueno 
PurchasingDepartmentno 
PurchasingOrganizationNameno 
Purposeno 
Purposeno 
QltyBasicDatano 
QltyBasicDatano 
QltyCueSheetno 
QltyCueSheetno 
QltyEndOfModulationno 
QltyEndOfModulationno 
QltyOperatorCommentno 
QltyOperatorCommentno 
QltyQualityEventno 
QltyQualityEventno 
QltyQualityParameterno 
QltyQualityParameterno 
QltyStartOfModulationno 
QltyStartOfModulationno 
QualityFlagno 
QuantizationDefault?no 
RGBAEssenceDescriptor---> MXF Tags
RIFFChunkData?no 
RIFFChunkIDno 
RIFFChunkLengthno 
RP217DataStreamPIDno 
RP217VideoStreamPIDno 
RandomIndexMetadata?no 
RandomIndexMetadataV10?no 
Ratingno 
RecordedFormatno 
RecordedFormatno 
RecordedTrackNumberno 
RecordingLabelNameno 
RecordingLabelNameno 
ReelOrRollNumberno 
RegionCodeno 
RegionNameno 
RegionNameno 
RegisterActionno 
RegisterAdministrationArray?no 
RegisterAdministrationNotesno 
RegisterAdministrationObject?no 
RegisterApproverNameno 
RegisterChildEntryArray?no 
RegisterCreationTimeno 
RegisterEditorNameno 
RegisterEntryAdministrationObject?no 
RegisterEntryArray?no 
RegisterEntryStatus?no 
RegisterItemDefiningDocumentNameno 
RegisterItemDefinitionno 
RegisterItemHierarchyLevelno 
RegisterItemIntroductionVersionno 
RegisterItemNameno 
RegisterItemNotesno 
RegisterItemOriginatorNameno 
RegisterItemStatusChangeDateTimeno 
RegisterItemSymbol?no 
RegisterItemUL?no 
RegisterKind?no 
RegisterReleaseDateTimeno 
RegisterStatusKind?no 
RegisterUserNameno 
RegisterUserTimeno 
RegisterVersionno 
RegistrantNameno 
RelatedMaterialDescriptionno 
RelatedMaterialDescriptionno 
RelatedMaterialLocators?no 
RelativePositionInSequenceNameno 
RelativePositionInSequenceOffsetno 
RelativeScopeno 
RelativeTrackno 
ReleasableCountryCodeno 
ReleasableCountryCodeno 
RenamedType?no 
ResourceID?no 
RestrictionsonUseno 
ReversePlayno 
ReversedByteOrderno 
Rights---> MXF Tags
RightsCommentno 
RightsCommentno 
RightsConditionDescriptionno 
RightsConditionDescriptionno 
RightsManagementAuthorityno 
RightsManagementAuthorityno 
RightsSets?no 
RightsStartDateTimeno 
RightsStopDateTimeno 
Rightsholderno 
Rightsholderno 
RoleNameno 
RoleNameno 
RoomNumberno 
RoomNumberno 
RoomOrSuiteNameno 
RoomOrSuiteNameno 
RootFormatVersionno 
RootMetaDictionary?no 
RootObjectDirectory?no 
RootPreface?no 
RoundedCaptureFilmFrameRateno 
RoundedTimecodeTimebaseno 
RoundingLawno 
RoundingMethodCodeno 
RoyaltyIncomeInformationno 
RoyaltyPaymentInformationno 
Rsizno 
SDKVersionno 
SICI?no 
SMPTE12MUserDateTime?no 
SMPTE309MUserDateTime?no 
SMPTE337MDataStreamNumberno 
SMPTEUL?no 
SalesContractNumberno 
Salutationno 
Salutationno 
SampleIndex?no 
SampleRateno 
SampledHeightno 
SampledWidthno 
SampledXOffsetno 
SampledYOffsetno 
SamplingHierarchyCodeno 
SamplingStructureCodeno 
ScanningDirectionno 
SceneFramework---> MXF Tags
SceneNumberno 
SceneNumberno 
SceneSettingPeriodSets?no 
SceneShotSets?no 
ScramblingKeyKindno 
ScramblingKeyValueno 
Scripting---> MXF Tags
ScriptingKindno 
ScriptingKindno 
ScriptingLocators?no 
ScriptingSets?no 
ScriptingTextno 
ScriptingTextno 
SeasonEpisodeNumberno 
SeasonEpisodeTitleno 
SecondGivenNameno 
SecondGivenNameno 
SecondaryExtendedSpokenLanguageCodeno 
SecondaryOriginalExtendedSpokenLanguageCodeno 
SecondaryOriginalLanguageCodeno 
SecondarySpokenLanguageCodeno 
SecondaryTitleno 
SecondaryTitleno 
SectorSizeno 
SecurityClassificationno 
SecurityClassificationno 
SecurityClassificationCaveatsno 
SecurityClassificationCaveatsno 
Selected?no 
SensorModeno 
SensorRollAngleno 
SensorSizeno 
SensorTypeno 
SensorTypeCodeno 
Sequence?no 
SequenceOffsetno 
SequenceSet---> MXF Tags
SeriesNumberno 
SeriesNumberno 
SeriesinaSeriesGroupCountno 
SetElementType?no 
SettingCityNameno 
SettingCityNameno 
SettingCountryCodeno 
SettingCountryNameno 
SettingCountryNameno 
SettingDateTimeno 
SettingDescriptionno 
SettingDescriptionno 
SettingPeriod---> MXF Tags
SettingPeriodDescriptionno 
SettingPeriodDescriptionno 
SettingPostalCodeno 
SettingPostalCodeno 
SettingRegionCodeno 
SettingRegionNameno 
SettingRoomNumberno 
SettingRoomNumberno 
SettingStateOrProvinceOrCountyNameno 
SettingStateOrProvinceOrCountyNameno 
SettingStreetNameno 
SettingStreetNameno 
SettingStreetNumberOrBuildingNameno 
SettingStreetNumberOrBuildingNameno 
SettingTownNameno 
SettingTownNameno 
ShimNameno 
ShootingCountryCodeno 
ShootingRegionCodeno 
ShootingRegionNameno 
Shot---> MXF Tags
ShotCommentno 
ShotCommentno 
ShotCommentKindno 
ShotCommentKindno 
ShotCueWordsSet?no 
ShotDescriptionno 
ShotDescriptionno 
ShotDurationno 
ShotListno 
ShotLocationSets?no 
ShotParticipantRoleSets?no 
ShotPersonSets?no 
ShotStartPositionno 
ShotTrackIDsno 
SideNumberno 
Signal-to-NoiseRationo 
SignalFormCodeno 
SignalStandardno 
SignalStandardno 
SignatureTuneFlagno 
SimpleFlaggingCountno 
SingleSequenceFlagno 
Sizeno 
SlantRangeno 
SlateInformationno 
SlateTitleno 
SliceCountno 
SliceNumberno 
SliceOffsetList?no 
Software-OnlySupportFlagno 
SourceClip?no 
SourceContainerFormat?no 
SourceImageCenterXCoordinateno 
SourceImageCenterYCoordinateno 
SourceIndex?no 
SourceKey?no 
SourceLengthno 
SourceOrganizationno 
SourceOrganizationno 
SourcePackage---> MXF Tags
SourcePackageID?no 
SourceSpecies?no 
SourceTrackIDno 
SourceTrackIDsno 
SourceValue?no 
SpeedChangeEffectFlagno 
SplicingMetadata?no 
StartTimeRelativeToReferenceno 
StartTimeRelativeToReferenceno 
StartTimecodeno 
StartTimecodeRelativeToReference?no 
StateOrProvinceOrCountyNameno 
StateOrProvinceOrCountyNameno 
StaticTrack---> MXF Tags
StillFrame?no 
StorageDeviceKindno 
StorageKindno 
StorageKindno 
StorageKindCodeno 
StorageMediaIDno 
StorageMediaKindno 
StoredANCLineNumberno 
StoredF2Offsetno 
StoredVBILineNumberno 
StratumKindno 
StreamData?no 
StreamElementType?no 
StreamIDno 
StreamOffsetno 
StreamPositionIndicatorno 
StreamPositionIndicatorno 
StreamPositionIndicatorno 
StreamPositionIndicatorno 
StreetNameno 
StreetNameno 
StreetNumberno 
StreetNumberno 
StringElementType?no 
StructuralComponent---> MXF Tags
Sub-descriptors?no 
SubDescriptor?no 
SubDescriptors?no 
SubjectAbsoluteHeadingno 
SubjectAbsoluteSpeedno 
SubjectDistanceno 
SubjectNameno 
SubjectNameno 
SubjectRelativeHeadingno 
SubjectRelativePositionalAccuracyno 
SubjectRelativeSpeedno 
SubtitleDatafileFlagno 
SubtitlesPresentno 
SupplementaryNameno 
SupplementaryNameno 
SupplementaryOrganizationNameno 
SupplementaryOrganizationNameno 
SupplierAccountNameno 
SupplierAccountNameno 
SupplierAccountNumberno 
SupplierIdentificationKindno 
SupplierIdentificationValueno 
SupplyContractNumberno 
SupplyingDepartmentNameno 
SupportOrAdministrationStatusno 
SupportOrAdministrationStatusno 
SupportOrganizationRoleno 
SupportOrganizationRoleno 
SystemNameOrNumberno 
TIFFSummary?no 
TaggedValueDefinitions?no 
TaggedValueParentProperties?no 
TakeNumberno 
TapeBatchNumberno 
TapeBatchNumberno 
TapeCapacityno 
TapeFormat?no 
TapeFormulationno 
TapeFormulationno 
TapeManufacturerno 
TapeManufacturerno 
TapePartitionCapacityno 
TapeShellKindno 
TapeShellKindno 
TapeStockno 
TapeStockno 
TargetAudienceno 
TargetAudienceno 
TargetClassOfStrongReference?no 
TargetClassOfWeakReference?no 
TargetSet?no 
TargetWidthno 
TechnicalValueno 
TelephoneNumberno 
TelephoneNumberno 
TeletextSubtitlesAvailableno 
TeletextSubtitlesFlagno 
TemporalOffsetno 
TerminatingFillerDatano 
TextLocator---> MXF Tags
TextlessBlackDurationno 
TextlessMaterialno 
TextualDescriptionKindno 
TextualDescriptionKindno 
Themeno 
Themeno 
ThemeMusicFlagno 
ThesaurusNameno 
ThesaurusNameno 
ThirdGivenNameno 
ThirdGivenNameno 
TimePeriodNameno 
TimePeriodNameno 
TimeSystemOffsetno 
TimeUnitKindno 
TimebaseReferenceTrackIDno 
TimecodeArray?no 
TimecodeComponent---> MXF Tags
TimecodeCreationDateTime?no 
TimecodeEndDateTime?no 
TimecodeEventEndDateTime?no 
TimecodeEventStartDateTime?no 
TimecodeKindno 
TimecodeLastModifyDate?no 
TimecodeModifyDate?no 
TimecodeSourceKindno 
TimecodeStartDateTime?no 
TimecodeStreamData?no 
TimecodeTimebaseno 
TimecodeTimebaseno 
TimecodeUserBitsFlagno 
TimepointValue?no 
TimingBiasCorrectionno 
TimingBiasCorrectionDescriptionno 
TitleKindno 
TitleKindno 
Titles---> MXF Tags
TitlesSets?no 
ToleranceInterpolationMethod?no 
ToleranceMode?no 
ToleranceWindow?no 
ToolkitVersionno 
TotalCurrencyAmountno 
TotalEpisodeCountno 
TotalIncomeno 
TotalLinesperFrameno 
TotalNumberInSequenceno 
TotalPaymentno 
TotalSamplesperLineno 
Track---> MXF Tags
TrackIDno 
TrackNameno 
TrackNameno 
TrackNumberno 
TrackNumberBatchno 
Tracks?no 
TrafficIDno 
TrailingLinesno 
TranscriptReferenceno 
TranscriptReferenceno 
TransferFilmFrameRateno 
TransitionEffect?no 
TransmissionIDno 
TransportStreamIDno 
TripletSequenceNumberno 
TypeDefinitionElementValueListno 
TypeDefinitionExtendibleElementValues?no 
TypeDefinitions?no 
UCSEncodingno 
UPID?no 
UPN?no 
URLno 
URLno 
URLno 
URLno 
URNno 
UTCEndDateTimeno 
UTCEventEndDateTimeno 
UTCEventEndDateTimeno 
UTCEventStartDateTimeno 
UTCEventStartDateTimeno 
UTCInstantDateTimeno 
UTCInstantDateTimeno 
UTCLastModifyDateno 
UTCLastModifyDateno 
UTCStartDateTimeno 
UTCStartDateTimeno 
UTCUserDateTimeno 
UniformDataFlagno 
UnknownBWFChunks?no 
UpstreamAudioCompressionAlgorithmno 
UseDefaultValueno 
UserDataMode?no 
UserNameno 
UserNameno 
UserPositionno 
V10IndexTableSegment?no 
VBEEndOffsetno 
VBIDataDescriptor---> MXF Tags
VBILineCountno 
VBIPayloadByteArrayno 
VBIPayloadSampleCodingno 
VBIPayloadSampleCountno 
VBIWrappingTypeno 
VC-1AverageBitrateno 
VC-1BPictureCountno 
VC-1CodedContentTypeno 
VC-1IdenticalGOPno 
VC-1InitializationMetadata?no 
VC-1Levelno 
VC-1MaximumBitrateno 
VC-1MaximumGOPno 
VC-1Profileno 
VC-1SingleSequenceno 
Value?no 
VariableArrayElementType?no 
VersionNumberno 
VersionNumberStringno 
VersionNumberStringno 
VersionTitleno 
VersionTitleno 
VerticalActionSafePercentageno 
VerticalDatumno 
VerticalGraphicsSafePercentageno 
VerticalSub-samplingno 
VideoAndFilmFrameRelationshipno 
VideoAverageBitrateno 
VideoClipDurationno 
VideoCodingSchemeIDno 
VideoColorKindno 
VideoCompressionAlgorithmno 
VideoDeviceKindno 
VideoDeviceParameterNameno 
VideoDeviceParameterSettingno 
VideoFixedBitrateno 
VideoIndexArray?no 
VideoLineMapno 
VideoNoiseReductionAlgorithmno 
VideoOrImageCompressionAlgorithmno 
VideoPayloadIdentifierno 
VideoPayloadIdentifier2002no 
VideoTestParameterno 
VideoTestResultno 
VideoTestResultno 
VideoWatermarkKindno 
ViewportAspectRationo 
ViewportHeightno 
ViewportImageCenterCCoordinateno 
ViewportImageCenterYCoordinateno 
ViewportWidthno 
VoiceTalentNameno 
WAVESummary?no 
WaveAudioDescriptor---> MXF Tags
Weightingno 
WhiteReferenceLevelno 
Work-in-ProgressFlagno 
WorkingTitleno 
WorkingTitleno 
XMLDocumentText?no 
XMLDocumentTextno 
XMLDocumentTextno 
XMLDocumentText?no 
XOsizno 
XTOsizno 
XTsizno 
Xsizno 
YOsizno 
YTOsizno 
YTsizno 
Ysizno 
+ +

MXF Header Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0MXFVersionno 
24FooterPositionno 
32HeaderSizeno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Apr 1, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/MacOS.html b/html/TagNames/MacOS.html new file mode 100644 index 0000000..55ef51e --- /dev/null +++ b/html/TagNames/MacOS.html @@ -0,0 +1,660 @@ + + + + +MacOS Tags + + + +

MacOS Tags

+

+On MacOS systems, the there are additional MDItem and XAttr Finder tags that +may be extracted. These tags are not extracted by default -- they must be +specifically requested or enabled via an API option. (Except when reading +MacOS "._" files directly, see below.)

+ +

The tables below list some of the tags that may be extracted, but ExifTool +will extract all available information even for tags not listed.

+ +

Tags in these tables are referred to as "pseudo" tags because their +information is not stored in the file itself. As such, Writable tags in +these tables may be changed without having to rewrite the file. +

+

Note that on some filesystems, MacOS creates sidecar files with names that +begin with "._". ExifTool will read these files if specified, and extract +the information listed in the following table without the need for extra +options, but these files are not writable directly.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0002RSRC---> RSRC Tags
0x0009ATTR---> MacOS XAttr Tags
+ +

MacOS XAttr Tags

+

XAttr tags are extracted using the "xattr" utility. They are extracted if +any "XAttr*" tag or the MacOS group is specifically requested, or by setting +the API XAttrTags option to 1 or the API RequestAll option to 2 or higher. +And they are extracted by default from MacOS "._" files when reading +these files directly.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
XAttrAppleMailDateReceivedno 
XAttrAppleMailDateSentno 
XAttrAppleMailIsRemoteAttachmentno 
XAttrFinderInfono 
XAttrLastUsedDateno 
XAttrMDItemDownloadedDateno 
XAttrMDItemFinderCommentno 
XAttrMDItemWhereFromsno 
XAttrMDLabelno 
XAttrQuarantineyes!(quarantine information for files downloaded from the internet. May only be +deleted when writing)
XAttrResourceForkno 
+ +

MacOS MDItem Tags

+

MDItem tags are extracted using the "mdls" utility. They are extracted if +any "MDItem*" tag or the MacOS group is specifically requested, or by +setting the API MDItemTags option to 1 or the API RequestAll option to 2 or +higher. Note that these tags do not necessarily reflect the current +metadata of a file -- it may take some time for the MacOS mdworker daemon to +index the file after a metadata change.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AppleMailDateReceivedno 
AppleMailDateSentno 
AppleMailFlaggedno 
AppleMailIsRemoteAttachmentno 
AppleMailMessageIDno 
AppleMailPriorityno 
AppleMailReadno 
AppleMailRepliedTono 
MDItemAccountHandlesno 
MDItemAccountIdentifierno 
MDItemAcquisitionMakeno 
MDItemAcquisitionModelno 
MDItemAltitudeno 
MDItemApertureno 
MDItemAudioBitRateno 
MDItemAudioChannelCountno 
MDItemAuthorEmailAddressesno 
MDItemAuthorsno 
MDItemBitsPerSampleno 
MDItemBundleIdentifierno 
MDItemCityno 
MDItemCodecsno 
MDItemColorSpaceno 
MDItemCommentno 
MDItemContentCreationDateno 
MDItemContentCreationDateRankingno 
MDItemContentCreationDate_Rankingno 
MDItemContentModificationDateno 
MDItemContentTypeno 
MDItemContentTypeTreeno 
MDItemContributorsno 
MDItemCopyrightno 
MDItemCountryno 
MDItemCreatorno 
MDItemDateAddedno 
MDItemDateAdded_Rankingno 
MDItemDescriptionno 
MDItemDisplayNameno 
MDItemDownloadedDateno 
MDItemDurationSecondsno 
MDItemEXIFGPSVersionno 
MDItemEXIFVersionno 
MDItemEmailConversationIDno 
MDItemEncodingApplicationsno 
MDItemExposureModeno 
MDItemExposureProgramno 
MDItemExposureTimeSecondsno 
MDItemFNumberno 
MDItemFSContentChangeDateno 
MDItemFSCreationDateyes!(file creation date. Requires "setfile" for writing. Note that when +reading, it may take a few seconds after writing a file before this value +reflects the change. However, FileCreateDate is updated immediately)
MDItemFSCreatorCodeno 
MDItemFSFinderFlagsno 
MDItemFSHasCustomIconno 
MDItemFSInvisibleno 
MDItemFSIsExtensionHiddenno 
MDItemFSIsStationeryno 
MDItemFSLabelyes! + +
0 = 0 (none) +
1 = 1 (Gray) +
2 = 2 (Green) +
3 = 3 (Purple)
  4 = 4 (Blue) +
5 = 5 (Yellow) +
6 = 6 (Red) +
7 = 7 (Orange)
+
MDItemFSNameno 
MDItemFSNodeCountno 
MDItemFSOwnerGroupIDno 
MDItemFSOwnerUserIDno 
MDItemFSSizeno 
MDItemFSTypeCodeno 
MDItemFinderCommentyes! 
MDItemFlashOnOffno 
MDItemFocalLengthno 
MDItemGPSDateStampno 
MDItemGPSStatusno 
MDItemGPSTrackno 
MDItemHasAlphaChannelno 
MDItemISOSpeedno 
MDItemIdentifierno 
MDItemImageDirectionno 
MDItemInterestingDateRankingno 
MDItemInterestingDate_Rankingno 
MDItemIsApplicationManagedno 
MDItemIsExistingThreadno 
MDItemIsLikelyJunkno 
MDItemKeywordsno 
MDItemKindno 
MDItemLastUsedDateno 
MDItemLastUsedDate_Rankingno 
MDItemLatitudeno 
MDItemLensModelno 
MDItemLogicalSizeno 
MDItemLongitudeno 
MDItemMailDateReceived_Rankingno 
MDItemMailboxesno 
MDItemMediaTypesno 
MDItemNumberOfPagesno 
MDItemOrientationno 
MDItemOriginApplicationIdentifierno 
MDItemOriginMessageIDno 
MDItemOriginSenderDisplayNameno 
MDItemOriginSenderHandleno 
MDItemOriginSubjectno 
MDItemPageHeightno 
MDItemPageWidthno 
MDItemPhysicalSizeno 
MDItemPixelCountno 
MDItemPixelHeightno 
MDItemPixelWidthno 
MDItemPrimaryRecipientEmailAddressesno 
MDItemProfileNameno 
MDItemRecipientsno 
MDItemRedEyeOnOffno 
MDItemResolutionHeightDPIno 
MDItemResolutionWidthDPIno 
MDItemSecurityMethodno 
MDItemSpeedno 
MDItemStateOrProvinceno 
MDItemStreamableno 
MDItemSubjectno 
MDItemTimestampno 
MDItemTitleno 
MDItemTotalBitRateno 
MDItemUseCountno 
MDItemUsedDatesno 
MDItemUserDownloadedDateno 
MDItemUserDownloadedUserHandleno 
MDItemUserSharedReceivedDateno 
MDItemUserSharedReceivedRecipientno 
MDItemUserSharedReceivedRecipientHandleno 
MDItemUserSharedReceivedSenderno 
MDItemUserSharedReceivedSenderHandleno 
MDItemUserSharedReceivedTransportno 
MDItemUserTagsyes!+(requires "tag" utility for writing -- install with "brew install tag". Note +that user tags may not contain a comma, and that duplicate user tags will +not be written)
MDItemVersionno 
MDItemVideoBitRateno 
MDItemWhereFromsno 
MDItemWhiteBalanceno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 16, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Matroska.html b/html/TagNames/Matroska.html new file mode 100644 index 0000000..4ed142c --- /dev/null +++ b/html/TagNames/Matroska.html @@ -0,0 +1,1117 @@ + + + + +Matroska Tags + + + +

Matroska Tags

+

The following tags are extracted from Matroska multimedia container files. +This container format is used by file types such as MKA, MKV, MKS and WEBM. +For speed, ExifTool extracts tags only up to the first Cluster unless the +Verbose (-v) or Unknown = 2 (-U) option is used. See +http://www.matroska.org/technical/specs/index.html for the official +Matroska specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000ChapterDisplay---> Matroska Tags
0x0003TrackTypeno + +
0x1 = Video +
0x2 = Audio +
0x3 = Complex +
0x10 = Logo
  0x11 = Subtitle +
0x12 = Buttons +
0x20 = Control
+
0x0005ChapterStringno 
0x0006VideoCodecID +
AudioCodecID +
CodecID
no
no
no
 
0x0008TrackDefaultno0 = No +
1 = Yes
0x0009ChapterTrackNumber?no 
0x000eSlices---> Matroska Tags
0x000fChapterTrack---> Matroska Tags
0x0011ChapterTimeStartno 
0x0012ChapterTimeEndno 
0x0016CueRefTime?no 
0x0017CueRefCluster?no 
0x0018ChapterFlagHidden?no 
0x001aVideoScanTypeno0 = Progressive +
1 = Interlaced
0x001bBlockDuration?no 
0x001cTrackLacing?no0 = No +
1 = Yes
0x001fAudioChannelsno 
0x0020BlockGroup---> Matroska Tags
0x0021Block?no 
0x0022BlockVirtual?no 
0x0023SimpleBlock?no 
0x0024CodecState?no 
0x0025BlockAdditional?no 
0x0026BlockMore---> Matroska Tags
0x0027Positionno 
0x002aCodecDecodeAllno0 = No +
1 = Yes
0x002bPrevSizeno 
0x002eTrackEntry---> Matroska Tags
0x002fEncryptedBlock?no 
0x0030ImageWidthno 
0x0033CueTime?no 
0x0035AudioSampleRateno 
0x0036ChapterAtom---> Matroska Tags
0x0037CueTrackPositions---> Matroska Tags
0x0039TrackUsedno0 = No +
1 = Yes
0x003aImageHeightno 
0x003bCuePoint---> Matroska Tags
0x003fCRC-32?no 
0x004bBlockAdditionalID?no 
0x004cLaceNumber?no 
0x004dFrameNumber?no 
0x004eDelay?no 
0x004fClusterDuration?no 
0x0057TrackNumberno 
0x005bCueReference---> Matroska Tags
0x0060Video---> Matroska Tags
0x0061Audio---> Matroska Tags
0x0067TimeCode?no 
0x0068TimeSlice---> Matroska Tags
0x006aCueCodecState?no 
0x006bCueRefCodecState?no 
0x006cVoid?no 
0x006eBlockAddID?no 
0x0071CueClusterPosition?no 
0x0077CueTrack?no 
0x007aReferencePriority?no 
0x007bReferenceBlock?no 
0x007dReferenceVirtual?no 
0x0254ContentCompressionAlgorithmno0 = zlib +
1 = bzlib +
2 = lzo1x +
3 = Header Stripping
0x0255ContentCompressionSettings?no 
0x0282DocTypeno 
0x0285DocTypeReadVersionno 
0x0286EBMLVersionno 
0x0287DocTypeVersionno 
0x02f2EBMLMaxIDLength?no 
0x02f3EBMLMaxSizeLength?no 
0x02f7EBMLReadVersionno 
0x037cChapterLanguageno 
0x037eChapterCountryno 
0x0444SegmentFamily?no 
0x0461DateTimeOriginalno 
0x047aTagLanguageno 
0x0484TagDefaultno0 = No +
1 = Yes
0x0485TagBinaryno 
0x0487TagStringno 
0x0489Durationno 
0x050dChapterProcessPrivate?no 
0x0598ChapterFlagEnabled?no 
0x05a3TagNameno 
0x05b9EditionEntry---> Matroska Tags
0x05bcEditionUID?no 
0x05bdEditionFlagHidden?no 
0x05dbEditionFlagDefault?no 
0x05ddEditionFlagOrdered?no 
0x065cAttachedFileDatano 
0x0660AttachedFileMIMETypeno 
0x066eAttachedFileNameno 
0x0675AttachedFileReferral?no 
0x067eAttachedFileDescriptionno 
0x06aeAttachedFileUIDno 
0x07e1ContentEncryptionAlgorithmno + +
0 = Not Encrypted +
1 = DES +
2 = 3DES
  3 = Twofish +
4 = Blowfish +
5 = AES
+
0x07e2ContentEncryptionKeyID?no 
0x07e3ContentSignature?no 
0x07e4ContentSignatureKeyID?no 
0x07e5ContentSignatureAlgorithmno0 = Not Signed +
1 = RSA
0x07e6ContentSignatureHashAlgorithmno0 = Not Signed +
1 = SHA1-160 +
2 = MD5
0x0d80MuxingAppno 
0x0dbbSeek---> Matroska Tags
0x1031ContentEncodingOrder?no 
0x1032ContentEncodingScope?no 
0x1033ContentEncodingTypeno0 = Compression +
1 = Encryption
0x1034ContentCompression---> Matroska Tags
0x1035ContentEncryption---> Matroska Tags
0x135fCueRefNumber?no 
0x136eTrackNameno 
0x1378CueBlockNumber?no 
0x137fTrackOffset?no 
0x13abSeekID?no 
0x13acSeekPosition?no 
0x13b8Stereo3DModeno 
0x14aaCropBottomno 
0x14b0DisplayWidthno 
0x14b2DisplayUnitno0 = Pixels +
1 = cm +
2 = inches
0x14b3AspectRatioTypeno0 = Free Resizing +
1 = Keep Aspect Ratio +
2 = Fixed
0x14baDisplayHeightno 
0x14bbCropTopno 
0x14ccCropLeftno 
0x14ddCropRightno 
0x15aaTrackForcedno0 = No +
1 = Yes
0x15eeMaxBlockAdditionID?no 
0x1741WritingAppno 
0x1854SilentTracks---> Matroska Tags
0x18d7SilentTrackNumberno 
0x21a7AttachedFile---> Matroska Tags
0x2240ContentEncoding---> Matroska Tags
0x2264AudioBitsPerSampleno 
0x23a2CodecPrivate?no 
0x23c0Targets---> Matroska Tags
0x23c3ChapterPhysicalEquivalentno + +
10 = Index +
20 = Track +
30 = Session +
40 = Layer
  50 = Side +
60 = CD / DVD +
70 = Set / Package
+
0x23c4TagChapterUID?no 
0x23c5TagTrackUID?no 
0x23c6TagAttachmentUID?no 
0x23c9TagEditionUID?no 
0x23caTargetTypeno 
0x2532SignedElement?no 
0x2624TrackTranslate---> Matroska Tags
0x26a5TrackTranslateTrackID?no 
0x26bfTrackTranslateCodecno0 = Matroska Script +
1 = DVD Menu
0x26fcTrackTranslateEditionUID?no 
0x27c8SimpleTag---> Matroska Tags
0x28caTargetTypeValueno 
0x2911ChapterProcessCommand---> Matroska Tags
0x2922ChapterProcessTime?no0 = For Duration of Chapter +
1 = Before Chapter +
2 = After Chapter
0x2924ChapterTranslate---> Matroska Tags
0x2933ChapterProcessData?no 
0x2944ChapterProcess---> Matroska Tags
0x2955ChapterProcessCodecID?no0 = Matroska +
1 = DVD
0x29a5ChapterTranslateID?no 
0x29bfChapterTranslateCodecno0 = Matroska Script +
1 = DVD Menu
0x29fcChapterTranslateEditionUID?no 
0x2d80ContentEncodings---> Matroska Tags
0x2de7MinCache?no 
0x2df8MaxCache?no 
0x2e67ChapterSegmentUID?no 
0x2ebcChapterSegmentEditionUID?no 
0x2fabTrackOverlay?no 
0x3373Tag---> Matroska Tags
0x3384SegmentFileNameno 
0x33a4SegmentUID?no 
0x33c4ChapterUID?no 
0x33c5TrackUID?no 
0x3446TrackAttachmentUIDno 
0x35a1BlockAdditions---> Matroska Tags
0x38b5OutputAudioSampleRateno 
0x3ba9Titleno 
0x3d7bChannelPositions?no 
0x3e5bSignatureElements---> Matroska Tags
0x3e7bSignatureElementList---> Matroska Tags
0x3e8aSignatureAlgono 
0x3e9aSignatureHashno 
0x3ea5SignaturePublicKey?no 
0x3eb5Signature?no 
0x7670Projection---> Matroska Projection Tags
0x2b59cTrackLanguageno 
0x3314fTrackTimecodeScaleno 
0x383e3FrameRateno 
0x3e383VideoFrameRate +
DefaultDuration
no
no
 
0x58688VideoCodecName +
AudioCodecName +
CodecName
no
no
no
 
0x6b240CodecDownloadURLno 
0xad7b1TimecodeScaleno 
0xeb524ColorSpace?no 
0xfb523Gammano 
0x1a9697CodecSettingsno 
0x1b4040CodecInfoURLno 
0x1c83abPrevFileNameno 
0x1cb923PrevUID?no 
0x1e83bbNextFileNameno 
0x1eb923NextUID?no 
0x43a770Chapters---> Matroska Tags
0x14d9b74SeekHead---> Matroska Tags
0x254c367Tags---> Matroska Tags
0x549a966Info---> Matroska Tags
0x654ae6bTracks---> Matroska Tags
0x8538067SegmentHeader---> Matroska Tags
0x941a469Attachments---> Matroska Tags
0xa45dfa3EBMLHeader---> Matroska Tags
0xb538667SignatureSlot---> Matroska Tags
0xc53bb6bCues---> Matroska Tags
0xf43b675Cluster---> Matroska Tags
+ +

Matroska Projection Tags

+

Projection tags defined by the Spherical Video V2 specification. See +https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md +for the specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x7671ProjectionTypeno0 = Rectangular +
1 = Equirectangular +
2 = Cubemap +
3 = Mesh
0x7672EquirectangularProj +
CubemapProj +
ProjectionPrivate
-
-
no
--> QuickTime equi Tags +
--> QuickTime cbmp Tags
0x7673ProjectionPoseYawno 
0x7674ProjectionPosePitchno 
0x7675ProjectionPoseRollno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 12, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Microsoft.html b/html/TagNames/Microsoft.html new file mode 100644 index 0000000..ab3cc6d --- /dev/null +++ b/html/TagNames/Microsoft.html @@ -0,0 +1,2149 @@ + + + + +Microsoft Tags + + + +

Microsoft XMP Tags

+

Microsoft Photo 1.0 schema XMP tags. This is likely not a complete list, +but represents tags which have been observed in sample images. The actual +namespace prefix is "MicrosoftPhoto", but ExifTool shortens this in the +family 1 group name.

+ +

These tags belong to the ExifTool XMP-microsoft family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
CameraSerialNumberstring 
CreatorAppIDstring 
CreatorOpenWithUIOptionsstring 
DateAcquireddate 
FlashManufacturerstring 
FlashModelstring 
ItemSubTypestring 
LastKeywordIPTCstring+ 
LastKeywordXMPstring+ 
LensManufacturerstring 
LensModelstring/ 
RatingPercentstring(called Rating by the spec; XMP-xmp:Rating values of 1,2,3,4 and 5 stars correspond to RatingPercent +values of 1,25,50,75 and 99 respectively)
+ +

Microsoft MP1 Tags

+

Microsoft Photo 1.1 schema XMP tags which have been observed.

+ +

These tags belong to the ExifTool XMP-MP1 family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Brightnessstring/ 
CameraModelIDstring/ 
Contraststring/ 
ExposureCompensationstring/ 
PanoramicStitchCameraMotionstring'3DRotation' = 3D Rotation +
'Affine' = Affine +
'Homography' = Homography +
'RigidScale' = Rigid Scale
PanoramicStitchMapTypestring'Horizontal-Cylindrical' = Horizontal Cylindrical +
'Horizontal-Spherical' = Horizontal Spherical +
'Perspective' = Perspective +
'Vertical-Cylindrical' = Vertical Cylindrical +
'Vertical-Spherical' = Vertical Spherical
PanoramicStitchPhi0real 
PanoramicStitchPhi1real 
PanoramicStitchTheta0real 
PanoramicStitchTheta1real 
PipelineVersionstring 
StreamTypestring 
WhiteBalance0real 
WhiteBalance1real 
WhiteBalance2real 
+ +

Microsoft MP Tags

+

Microsoft Photo 1.2 schema XMP tags which have been observed.

+ +

These tags belong to the ExifTool XMP-MP family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
RegionInfoDateRegionsValiddate_ 
RegionInfoMPstruct--> Microsoft RegionInfo Struct +
(called RegionInfo by the spec)
RegionInfoRegionsstruct_+--> Microsoft Regions Struct
RegionPersonDisplayNamestring_+(RegionInfoRegionsPersonDisplayName)
RegionPersonEmailDigeststring_+(RegionInfoRegionsPersonEmailDigest)
RegionPersonLiveIdCIDstring_+(RegionInfoRegionsPersonLiveIdCID)
RegionPersonSourceIDstring_+(RegionInfoRegionsPersonSourceID)
RegionRectanglestring_+(RegionInfoRegionsRectangle)
+ +

Microsoft RegionInfo Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
DateRegionsValiddate 
RegionsMicrosoft Regions+--> Microsoft Regions Struct
+ +

Microsoft Regions Struct

+

Note that PersonLiveIdCID element is called PersonLiveCID according to the +Microsoft specification, but in practice their software actually writes +PersonLiveIdCID, so ExifTool uses this too.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
PersonDisplayNamestring 
PersonEmailDigeststring 
PersonLiveIdCIDstring 
PersonSourceIDstring 
Rectanglestring 
+ +

Microsoft Stitch Tags

+

Information found in the Microsoft custom EXIF tag 0x4748, as written by +Windows Live Photo Gallery.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0PanoramicStitchVersionint32u 
1PanoramicStitchCameraMotionint32u2 = Rigid Scale +
3 = Affine +
4 = 3D Rotation +
5 = Homography
2PanoramicStitchMapTypeint32u0 = Perspective +
1 = Horizontal Cylindrical +
2 = Horizontal Spherical +
257 = Vertical Cylindrical +
258 = Vertical Spherical
3PanoramicStitchTheta0float 
4PanoramicStitchTheta1float 
5PanoramicStitchPhi0float 
6PanoramicStitchPhi1float 
+ +

Microsoft Xtra Tags

+

Tags found in the Microsoft "Xtra" atom of QuickTime videos. Tag ID's are +not shown because some are unruly GUID's. Currently most of these tags are +not writable because the Microsoft documentation is poor and samples were +not available, but more tags may be made writable in the future if samples +are provided. Note that writable tags in this table are are flagged to +"Avoid", which means that other more common tags will be written instead if +possible unless the Microsoft group is specified explicitly.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Abstractno 
AccountNameno 
AcquisitionTimeno 
AcquisitionTimeDayno 
AcquisitionTimeMonthno 
AcquisitionTimeYearno 
AcquisitionTimeYearMonthno 
AcquisitionTimeYearMonthDayno 
AlbumArtistUnicode/ 
AlbumArtistno 
AlbumArtistSortOrderno 
AlbumCoverURLUnicode/ 
AlbumIDno 
AlbumIDAlbumArtistno 
AlbumTitleUnicode/ 
AlbumTitleno 
AlbumTitleSortOrderno 
AlternateSourceURLno 
Anniversaryno 
Artistno 
AssistantsNameno 
AssistantsPhoneno 
Attachmentsno 
Attributesno 
AudioBitrateno 
AudioFormatno 
AudioSampleRateno 
AudioSampleSizeno 
Authorno 
Authorno 
AuthorSortOrderno 
AuthorURLUnicode/ 
AutoSummaryno 
AverageLevelno 
BccAddressesno 
BccNamesno 
Beats-per-minuteno 
BeatsPerMinuteno 
BillingInformationno 
Birthdayno 
BitDepthno 
Bitrateno 
Bitrateno 
BroadcastDateno 
BusinessAddressno 
BusinessCityno 
BusinessCountry-Regionno 
BusinessFaxno 
BusinessHomePageno 
BusinessPOBoxno 
BusinessPhoneno 
BusinessPostalCodeno 
BusinessStateOrProvinceno 
BusinessStreetno 
BuyNowno 
BuyTicketsno 
CDTrackEnabledno 
CallLettersno 
CallbackNumberno 
CameraMakerno 
CameraManufacturerno 
CameraModelno 
CameraModelno 
CarPhoneno 
CategoryUnicode/+ 
Categoryno 
CcAddressesno 
CcNamesno 
CellPhoneno 
ChannelNumberno 
Channelsno 
Channelsno 
ChapterNumno 
Childrenno 
Cityno 
ClientIDno 
ClosedCaptioningno 
Colorno 
Commentno 
Commentsno 
Companyno 
CompanyMainPhoneno 
Completeno 
ComposerUnicode/ 
Composersno 
Computerno 
ConductorUnicode/+ 
Conductorsno 
ContactNamesno 
ContentDistributorUnicode/ 
ContentDistributorDurationno 
ContentDistributorTypeno 
ContentGroupDescriptionno 
ContentTypeno 
Contributorsno 
ConversationIDno 
Copyrightno 
Copyrightno 
Countno 
Country-Regionno 
Creatorno 
CurrentBitrateno 
DLNAServerUDNno 
DLNASourceURIno 
DRMIndividualizedVersionno 
DRMKeyIDno 
DTCPIPHostno 
DTCPIPPortno 
DVDIDno 
DataRateno 
Dateno 
DateAccessedno 
DateAcquiredvt_filetime/ 
DateArchivedno 
DateCompletedno 
DateCreatedno 
DateImportedno 
DateLastSavedno 
DateModifiedno 
DatePictureTakenno 
DateReceivedno 
DateReleasedno 
DateSentno 
DateVisitedno 
Departmentno 
Descriptionno 
Descriptionno 
Descriptionno 
Dimensionsno 
DirectorUnicode/+ 
Directorsno 
DisplayArtistno 
Divisionno 
DocumentIDno 
DueDateno 
Durationno 
Durationno 
Durationno 
E-mail2no 
E-mail3no 
E-mailAddressno 
E-mailDisplayNameno 
E-mailListno 
EncodedByUnicode/ 
EncodedByno 
EncodingTimedate/ 
EndDateno 
EntryTypeno 
EpisodeNameno 
Eventno 
Eventno 
ExifVersionno 
ExposureBiasno 
ExposureProgramno 
ExposureTimeno 
F-stopno 
FileAsno 
FileCountno 
FileSizeno 
FileTypeno 
FileVersionno 
FirstNameno 
FlagColorno 
FlagStatusno 
FlashModeno 
FocalLengthno 
FocalLength35mmno 
Folderno 
FolderNameno 
FolderPathno 
FormatTagno 
FourCCno 
FrameHeightno 
FrameRateno 
FrameRateno 
FrameWidthno 
Free-busyStatusno 
Frequencyno 
FromAddressesno 
FromNamesno 
FullNameno 
Genderno 
Genreno 
Genreno 
GenreIDno 
GivenNameno 
HasAttachmentsno 
HasFlagno 
Hobbiesno 
HomeAddressno 
HomeCityno 
HomeCountry-Regionno 
HomeFaxno 
HomePOBoxno 
HomePhoneno 
HomePostalCodeno 
HomeStateOrProvinceno 
HomeStreetno 
HorizontalResolutionno 
IMAddressesno 
ISOSpeedno 
Importanceno 
Incompleteno 
InitialKeyUnicode/ 
InitialKeyno 
Initialsno 
IsAttachmentno 
IsCompletedno 
IsDeletedno 
IsNetworkFeedno 
IsOnlineno 
IsProtectedno 
IsRecurringno 
IsVBRno 
JobTitleno 
Keywordsno 
Kindsno 
Labelno 
Languageno 
Languageno 
LastNameno 
LastPrintedno 
LeadPerformerno 
LegalTrademarksno 
LensMakerno 
LensModelno 
LibraryIDno 
LibraryNameno 
LightSourceno 
LinkStatusno 
LinkTargetno 
Locationno 
Locationno 
Lyricsno 
MCDIno 
MailingAddressno 
MaxApertureno 
MediaClassPrimaryIDGUID/'01CD0F29-DA4E-4157-897B-6275D50C4F11' = Audio (not music) +
'D1607DBC-E323-4BE2-86A1-48A42A28441E' = Music +
'DB9830BD-3AB3-4FAB-8A37-1A995F7FF74B' = Video +
'FCF24A76-9A57-4036-990D-E35DD8B244E1' = Other (not audio or video)
MediaClassSecondaryIDGUID/'00000000-0000-0000-0000-000000000000' = Unknown Content +
'00033368-5009-4AC3-A820-5D2D09A4E7C1' = Sound Clip from Game +
'0B710218-8C0C-475E-AF73-4C41C0C8F8CE' = Home Video from Pictures +
'1B824A67-3F80-4E3E-9CDE-F7361B0F5F1B' = Talk Show +
'1FE2E091-4E1E-40CE-B22D-348C732E0B10' = Video News +
'3A172A13-2BD9-4831-835B-114F6A95943F' = Spoken Word +
'44051B5B-B103-4B5C-92AB-93060A9463F0' = Corporate Video +
'6677DB9B-E5A0-4063-A1AD-ACEB52840CF1' = Audio News +
'A9B87FC9-BD47-4BF0-AC4F-655B89F7D868' = Feature Film +
'B76628F4-300D-443D-9CB5-01C285109DAF' = Home Movie +
'BA7F258A-62F7-47A9-B21F-4651C42A000E' = TV Show +
'D6DE1D88-C77C-4593-BFBC-9C61E8C373E3' = Web-based Video +
'E0236BEB-C281-4EDE-A36D-7AF76A3D45B5' = Audio Book +
'E3E689E2-BA8C-4330-96DF-A0EEEFFA6876' = Music Video +
'F24FF731-96FC-4D0F-A2F5-5A3483682B1A' = Song from Game
MediaContentTypesno 
MediaCreatedno 
MediaOriginalBroadcastDateTimeno 
MediaOriginalChannelno 
MediaStationNameno 
MediaTypeno 
MeteringModeno 
MiddleNameno 
Mileageno 
ModifiedByno 
MoodUnicode/ 
Moodno 
MoreInfono 
Nameno 
Nicknameno 
OfficeLocationno 
OfflineAvailabilityno 
OfflineStatusno 
OptionalAttendeeAddressesno 
OptionalAttendeesno 
OrganizerAddressno 
OrganizerNameno 
Orientationno 
OriginalAlbumTitleUnicode/ 
OriginalArtistUnicode/ 
OriginalLyricistUnicode/ 
OtherAddressno 
OtherCityno 
OtherCountry-Regionno 
OtherPOBoxno 
OtherPostalCodeno 
OtherStateOrProvinceno 
OtherStreetno 
Ownerno 
POBoxno 
Pagerno 
Pagesno 
ParentalRatingUnicode/ 
ParentalRatingno 
ParentalRatingReasonno 
PartOfSetno 
PartOfSetno 
PartOfSetno 
Participantsno 
Pathno 
PeakValueno 
PerceivedTypeno 
PeriodUnicode/ 
Periodno 
PersonalTitleno 
PixelAspectRatioXno 
PixelAspectRatioYno 
PlaylistIndexno 
PostalCodeno 
PrimaryE-mailno 
PrimaryPhoneno 
Priorityno 
ProducerUnicode/+ 
Producersno 
ProductNameno 
ProductVersionno 
Professionno 
ProgramDescriptionno 
ProgramModeno 
ProgramNameno 
Projectno 
PromotionURLUnicode/ 
Protectedno 
ProtectionTypeno 
Providerno 
ProviderUnicode/ 
ProviderLogoURLno 
ProviderRatingno 
ProviderStyleno 
ProviderURLno 
PublisherUnicode/ 
Publisherno 
RadioBandno 
RadioFormatno 
Ratingno 
RatingOrgno 
ReadStatusno 
RecordingTimeno 
RecordingTimeno 
RecordingTimeDayno 
RecordingTimeMonthno 
RecordingTimeYearno 
RecordingTimeYearMonthno 
RecordingTimeYearMonthDayno 
ReleaseDateno 
ReleaseDateDayno 
ReleaseDateMonthno 
ReleaseDateYearno 
ReleaseDateYearMonthno 
ReleaseDateYearMonthDayno 
ReminderTimeno 
RequestStateno 
RequiredAttendeeAddressesno 
RequiredAttendeesno 
Rerunno 
Resourcesno 
SAPno 
Saturationno 
SearchRankingno 
SenderAddressno 
SenderNameno 
Sensitivityno 
ShadowFilePathno 
Sharedno 
SharedUserRatingint64u/ 
SharedWithno 
Sizeno 
Slidesno 
Sourceno 
SourceURLno 
SpaceFreeno 
SpaceUsedno 
Spouseno 
StartDateno 
StateOrProvinceno 
StationCallSignno 
StationNameno 
Statusno 
Statusno 
Storeno 
Streetno 
Subjectno 
Subjectno 
SubjectDistanceno 
SubscriptionContentIDno 
SubtitleUnicode/ 
Subtitleno 
SubtitleDescriptionno 
Suffixno 
Summaryno 
Sync01no 
Sync02no 
Sync03no 
Sync04no 
Sync05no 
Sync06no 
Sync07no 
Sync08no 
Sync09no 
Sync10no 
Sync11no 
Sync12no 
Sync13no 
Sync14no 
Sync15no 
Sync16no 
SyncOnlyno 
SyncStateno 
TTY-TTDPhoneno 
TaskOwnerno 
Telexno 
Temporaryno 
Titleno 
Titleno 
TitleNumno 
TitleSortOrderno 
ToAddressesno 
ToDoTitleno 
ToNamesno 
TotalBitrateno 
TotalDurationno 
TotalEditingTimeno 
TotalFileSizeno 
TotalSizeno 
TrackNumberno 
TrackNumberno 
TrackingIDno 
Typeno 
Typeno 
URLno 
UniqueFileIdentifierno 
Untitled0no 
Untitled1no 
Untitled2no 
UserCustom1no 
UserCustom2no 
UserEffectiveRatingno 
UserLastPlayedTimeno 
UserPlayCountno 
UserPlaycountAfternoonno 
UserPlaycountEveningno 
UserPlaycountMorningno 
UserPlaycountNightno 
UserPlaycountWeekdayno 
UserPlaycountWeekendno 
UserRatingno 
UserServiceRatingno 
UserWebURLno 
VerticalResolutionno 
VideoBitrateno 
VideoCompressionno 
VideoFormatno 
VideoFrameRateno 
VideoHeightno 
VideoWidthno 
WMCollectionGroupIDno 
WMCollectionIDno 
WMContentIDno 
WMShadowFileSourceDRMTypeno 
WMShadowFileSourceFileTypeno 
Webpageno 
WhiteBalanceno 
WindowsFileNameno 
WordCountno 
WriterUnicode/ 
Writersno 
Yearno 
Yearno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Mar 17, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Minolta.html b/html/TagNames/Minolta.html new file mode 100644 index 0000000..d634401 --- /dev/null +++ b/html/TagNames/Minolta.html @@ -0,0 +1,2601 @@ + + + + +Minolta Tags + + + +

Minolta Tags

+

+These tags are used by Minolta, Konica/Minolta as well as some Sony cameras. +Minolta doesn't make things easy for decoders because the meaning of some +tags and the location where some information is stored is different for +different camera models. (Take MinoltaQuality for example, which may be +located in 5 different places.) +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000MakerNoteVersionundef[4] 
0x0001MinoltaCameraSettingsOld---> Minolta CameraSettings Tags
0x0003MinoltaCameraSettings---> Minolta CameraSettings Tags
0x0004MinoltaCameraSettings7D---> Minolta CameraSettings7D Tags
0x0010CameraInfoA100---> Minolta CameraInfoA100 Tags
0x0018ISInfoA100 +
ImageStabilization
-
no
--> Minolta ISInfoA100 Tags +
(a block of binary data which exists in DiMAGE A2 (and A1/X1?) images only if +image stabilization is enabled)
0x0020WBInfoA100---> Minolta WBInfoA100 Tags +
(currently decoded only for the Sony A100)
0x0040CompressedImageSizeint32u 
0x0081PreviewImageundef 
0x0088PreviewImageStartint32u* 
0x0089PreviewImageLengthint32u* 
0x0100SceneModeint32u +
0 = Standard +
1 = Portrait +
2 = Text +
3 = Night Scene +
4 = Sunset +
5 = Sports +
6 = Landscape +
7 = Night Portrait +
8 = Macro +
9 = Super Macro +
16 = Auto +
17 = Night View/Portrait +
18 = Sweep Panorama +
19 = Handheld Night Shot +
20 = Anti Motion Blur +
21 = Cont. Priority AE +
22 = Auto+ +
23 = 3D Sweep Panorama +
24 = Superior Auto +
25 = High Sensitivity +
26 = Fireworks +
27 = Food +
28 = Pet +
33 = HDR +
65535 = n/a
+
0x0101ColorModeint32u + +
0 = Natural color +
1 = Black & White +
2 = Vivid color +
3 = Solarization +
4 = Adobe RGB +
5 = Sepia +
9 = Natural +
12 = Portrait
  13 = Natural sRGB +
14 = Natural+ sRGB +
15 = Landscape +
16 = Evening +
17 = Night Scene +
18 = Night Portrait +
132 = Embed Adobe RGB
+(Sony models) + +
0 = Standard +
1 = Vivid +
2 = Portrait +
3 = Landscape +
4 = Sunset +
5 = Night View/Portrait +
6 = B&W +
7 = Adobe RGB +
12 = Neutral +
13 = Clear +
14 = Deep +
15 = Light +
16 = Autumn Leaves
  17 = Sepia +
18 = FL +
19 = Vivid 2 +
20 = IN +
21 = SH +
100 = Neutral +
101 = Clear +
102 = Deep +
103 = Light +
104 = Night View +
105 = Autumn Leaves +
255 = Off +
4294967295 = n/a
+
0x0102MinoltaQualityint32u + +
0 = Raw +
1 = Super Fine +
2 = Fine
  3 = Standard +
4 = Economy +
5 = Extra fine
+
0x0103MinoltaQuality +
MinoltaImageSize
int32u
int32u
(quality for DiMAGE A2/7Hi) + +
0 = Raw +
1 = Super Fine +
2 = Fine
  3 = Standard +
4 = Economy +
5 = Extra fine
+(image size for other models except A200) + +
1 = 1600x1200 +
2 = 1280x960 +
3 = 640x480
  5 = 2560x1920 +
6 = 2272x1704 +
7 = 2048x1536
+
0x0104FlashExposureComprational64s 
0x0105Teleconverterint32u +
0x0 = None +
0x4 = Minolta/Sony AF 1.4x APO (D) (0x04) +
0x5 = Minolta/Sony AF 2x APO (D) (0x05) +
0x48 = Minolta/Sony AF 2x APO (D) +
0x50 = Minolta AF 2x APO II +
0x60 = Minolta AF 2x APO +
0x88 = Minolta/Sony AF 1.4x APO (D) +
0x90 = Minolta AF 1.4x APO II +
0xa0 = Minolta AF 1.4x APO
+
0x0107ImageStabilizationint32u1 = Off +
5 = On
0x0109RawAndJpgRecordingint32u0 = Off +
1 = On
0x010aZoneMatchingint32u0 = ISO Setting Used +
1 = High Key +
2 = Low Key
0x010bColorTemperatureint32u 
0x010cLensTypeint32u--> Minolta LensType Values
0x0111ColorCompensationFilterint32s(ranges from -2 for green to +2 for magenta)
0x0112WhiteBalanceFineTuneint32u 
0x0113ImageStabilizationint32u(valid for Sony A100 only) +
0 = Off +
1 = On
0x0114MinoltaCameraSettings5D +
CameraSettingsA100
-
-
--> Minolta CameraSettings5D Tags +
--> Minolta CameraSettingsA100 Tags
0x0115WhiteBalanceint32u +
0x0 = Auto +
0x1 = Color Temperature/Color Filter +
0x10 = Daylight +
0x20 = Cloudy +
0x30 = Shade +
0x40 = Tungsten +
0x50 = Flash +
0x60 = Fluorescent +
0x70 = Custom
+
0x0e00PrintIM---> PrintIM Tags
0x0f00MinoltaCameraSettings2no 
+ +

Minolta LensType Values

+

Decimal values have been added to differentiate lenses which would otherwise +have the same LensType, and are used by the Composite LensID tag when +attempting to identify the specific lens model. "New" or "II" appear in +brackets if the original version of the lens has the same LensType. Special +logic is employed to identify the attached lens when a Metabones Canon EF +adapter is used.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueLensType
0= Minolta AF 28-85mm F3.5-4.5 New
1= Minolta AF 80-200mm F2.8 HS-APO G
2= Minolta AF 28-70mm F2.8 G
3= Minolta AF 28-80mm F4-5.6
4= Minolta AF 85mm F1.4G
5= Minolta AF 35-70mm F3.5-4.5 [II]
6= Minolta AF 24-85mm F3.5-4.5 [New]
7= Minolta AF 100-300mm F4.5-5.6 APO [New] or 100-400mm or Sigma Lens
7.1= Minolta AF 100-400mm F4.5-6.7 APO
7.2= Sigma AF 100-300mm F4 EX DG IF
8= Minolta AF 70-210mm F4.5-5.6 [II]
9= Minolta AF 50mm F3.5 Macro
10= Minolta AF 28-105mm F3.5-4.5 [New]
11= Minolta AF 300mm F4 HS-APO G
12= Minolta AF 100mm F2.8 Soft Focus
13= Minolta AF 75-300mm F4.5-5.6 (New or II)
14= Minolta AF 100-400mm F4.5-6.7 APO
15= Minolta AF 400mm F4.5 HS-APO G
16= Minolta AF 17-35mm F3.5 G
17= Minolta AF 20-35mm F3.5-4.5
18= Minolta AF 28-80mm F3.5-5.6 II
19= Minolta AF 35mm F1.4 G
20= Minolta/Sony 135mm F2.8 [T4.5] STF
22= Minolta AF 35-80mm F4-5.6 II
23= Minolta AF 200mm F4 Macro APO G
24= Minolta/Sony AF 24-105mm F3.5-4.5 (D) or Sigma or Tamron Lens
24.1= Sigma 18-50mm F2.8
24.2= Sigma 17-70mm F2.8-4.5 DC Macro
24.3= Sigma 20-40mm F2.8 EX DG Aspherical IF
24.4= Sigma 18-200mm F3.5-6.3 DC
24.5= Sigma DC 18-125mm F4-5,6 D
24.6= Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical [IF] Macro
24.7= Sigma 15-30mm F3.5-4.5 EX DG Aspherical
25= Minolta AF 100-300mm F4.5-5.6 APO (D) or Sigma Lens
25.1= Sigma 100-300mm F4 EX (APO (D) or D IF)
25.2= Sigma 70mm F2.8 EX DG Macro
25.3= Sigma 20mm F1.8 EX DG Aspherical RF
25.4= Sigma 30mm F1.4 EX DC
25.5= Sigma 24mm F1.8 EX DG ASP Macro
27= Minolta AF 85mm F1.4 G (D)
28= Minolta/Sony AF 100mm F2.8 Macro (D) or Tamron Lens
28.1= Tamron SP AF 90mm F2.8 Di Macro
28.2= Tamron SP AF 180mm F3.5 Di LD [IF] Macro
29= Minolta/Sony AF 75-300mm F4.5-5.6 (D)
30= Minolta AF 28-80mm F3.5-5.6 (D) or Sigma Lens
30.1= Sigma AF 10-20mm F4-5.6 EX DC
30.2= Sigma AF 12-24mm F4.5-5.6 EX DG
30.3= Sigma 28-70mm EX DG F2.8
30.4= Sigma 55-200mm F4-5.6 DC
31= Minolta/Sony AF 50mm F2.8 Macro (D) or F3.5
31.1= Minolta/Sony AF 50mm F3.5 Macro
32= Minolta/Sony AF 300mm F2.8 G or 1.5x Teleconverter
33= Minolta/Sony AF 70-200mm F2.8 G
35= Minolta AF 85mm F1.4 G (D) Limited
36= Minolta AF 28-100mm F3.5-5.6 (D)
38= Minolta AF 17-35mm F2.8-4 (D)
39= Minolta AF 28-75mm F2.8 (D)
40= Minolta/Sony AF DT 18-70mm F3.5-5.6 (D)
41= Minolta/Sony AF DT 11-18mm F4.5-5.6 (D) or Tamron Lens
41.1= Tamron SP AF 11-18mm F4.5-5.6 Di II LD Aspherical IF
42= Minolta/Sony AF DT 18-200mm F3.5-6.3 (D)
43= Sony 35mm F1.4 G (SAL35F14G)
44= Sony 50mm F1.4 (SAL50F14)
45= Carl Zeiss Planar T* 85mm F1.4 ZA (SAL85F14Z)
46= Carl Zeiss Vario-Sonnar T* DT 16-80mm F3.5-4.5 ZA (SAL1680Z)
47= Carl Zeiss Sonnar T* 135mm F1.8 ZA (SAL135F18Z)
48= Carl Zeiss Vario-Sonnar T* 24-70mm F2.8 ZA SSM (SAL2470Z) or Other Lens
48.1= Carl Zeiss Vario-Sonnar T* 24-70mm F2.8 ZA SSM II (SAL2470Z2)
48.2= Tamron SP 24-70mm F2.8 Di USD
49= Sony DT 55-200mm F4-5.6 (SAL55200)
50= Sony DT 18-250mm F3.5-6.3 (SAL18250)
51= Sony DT 16-105mm F3.5-5.6 (SAL16105)
52= Sony 70-300mm F4.5-5.6 G SSM (SAL70300G) or G SSM II or Tamron Lens
52.1= Sony 70-300mm F4.5-5.6 G SSM II (SAL70300G2)
52.2= Tamron SP 70-300mm F4-5.6 Di USD
53= Sony 70-400mm F4-5.6 G SSM (SAL70400G)
54= Carl Zeiss Vario-Sonnar T* 16-35mm F2.8 ZA SSM (SAL1635Z) or ZA SSM II
54.1= Carl Zeiss Vario-Sonnar T* 16-35mm F2.8 ZA SSM II (SAL1635Z2)
55= Sony DT 18-55mm F3.5-5.6 SAM (SAL1855) or SAM II
55.1= Sony DT 18-55mm F3.5-5.6 SAM II (SAL18552)
56= Sony DT 55-200mm F4-5.6 SAM (SAL55200-2)
57= Sony DT 50mm F1.8 SAM (SAL50F18) or Tamron Lens or Commlite CM-EF-NEX adapter
57.1= Tamron SP AF 60mm F2 Di II LD [IF] Macro 1:1
57.2= Tamron 18-270mm F3.5-6.3 Di II PZD
58= Sony DT 30mm F2.8 Macro SAM (SAL30M28)
59= Sony 28-75mm F2.8 SAM (SAL2875)
60= Carl Zeiss Distagon T* 24mm F2 ZA SSM (SAL24F20Z)
61= Sony 85mm F2.8 SAM (SAL85F28)
62= Sony DT 35mm F1.8 SAM (SAL35F18)
63= Sony DT 16-50mm F2.8 SSM (SAL1650)
64= Sony 500mm F4 G SSM (SAL500F40G)
65= Sony DT 18-135mm F3.5-5.6 SAM (SAL18135)
66= Sony 300mm F2.8 G SSM II (SAL300F28G2)
67= Sony 70-200mm F2.8 G SSM II (SAL70200G2)
68= Sony DT 55-300mm F4.5-5.6 SAM (SAL55300)
69= Sony 70-400mm F4-5.6 G SSM II (SAL70400G2)
70= Carl Zeiss Planar T* 50mm F1.4 ZA SSM (SAL50F14Z)
128= Tamron or Sigma Lens (128)
128.1= Tamron AF 18-200mm F3.5-6.3 XR Di II LD Aspherical [IF] Macro
128.2= Tamron AF 28-300mm F3.5-6.3 XR Di LD Aspherical [IF] Macro
128.3= Tamron AF 28-200mm F3.8-5.6 XR Di Aspherical [IF] Macro
128.4= Tamron SP AF 17-35mm F2.8-4 Di LD Aspherical IF
128.5= Sigma AF 50-150mm F2.8 EX DC APO HSM II
128.6= Sigma 10-20mm F3.5 EX DC HSM
128.7= Sigma 70-200mm F2.8 II EX DG APO MACRO HSM
128.8= Sigma 10mm F2.8 EX DC HSM Fisheye
128.9= Sigma 50mm F1.4 EX DG HSM
128.10= Sigma 85mm F1.4 EX DG HSM
128.11= Sigma 24-70mm F2.8 IF EX DG HSM
128.12= Sigma 18-250mm F3.5-6.3 DC OS HSM
128.13= Sigma 17-50mm F2.8 EX DC HSM
128.14= Sigma 17-70mm F2.8-4 DC Macro HSM
128.15= Sigma 150mm F2.8 EX DG OS HSM APO Macro
128.16= Sigma 150-500mm F5-6.3 APO DG OS HSM
128.17= Tamron AF 28-105mm F4-5.6 [IF]
128.18= Sigma 35mm F1.4 DG HSM
128.19= Sigma 18-35mm F1.8 DC HSM
128.20= Sigma 50-500mm F4.5-6.3 APO DG OS HSM
128.21= Sigma 24-105mm F4 DG HSM | A
128.22= Sigma 30mm F1.4
128.23= Sigma 35mm F1.4 DG HSM | A
128.24= Sigma 105mm F2.8 EX DG OS HSM Macro
128.25= Sigma 180mm F2.8 EX DG OS HSM APO Macro
128.26= Sigma 18-300mm F3.5-6.3 DC Macro HSM | C
128.27= Sigma 18-50mm F2.8-4.5 DC HSM
129= Tamron Lens (129)
129.1= Tamron 200-400mm F5.6 LD
129.2= Tamron 70-300mm F4-5.6 LD
131= Tamron 20-40mm F2.7-3.5 SP Aspherical IF
135= Vivitar 28-210mm F3.5-5.6
136= Tokina EMZ M100 AF 100mm F3.5
137= Cosina 70-210mm F2.8-4 AF
138= Soligor 19-35mm F3.5-4.5
139= Tokina AF 28-300mm F4-6.3
142= Cosina AF 70-300mm F4.5-5.6 MC
146= Voigtlander Macro APO-Lanthar 125mm F2.5 SL
194= Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical [IF]
202= Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro
203= Tamron SP 70-200mm F2.8 Di USD
204= Tamron SP 24-70mm F2.8 Di USD
212= Tamron 28-300mm F3.5-6.3 Di PZD
213= Tamron 16-300mm F3.5-6.3 Di II PZD Macro
214= Tamron SP 150-600mm F5-6.3 Di USD
215= Tamron SP 15-30mm F2.8 Di USD
216= Tamron SP 45mm F1.8 Di USD
217= Tamron SP 35mm F1.8 Di USD
218= Tamron SP 90mm F2.8 Di Macro 1:1 USD (F017)
220= Tamron SP 150-600mm F5-6.3 Di USD G2
224= Tamron SP 90mm F2.8 Di Macro 1:1 USD (F004)
255= Tamron Lens (255)
255.1= Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical
255.2= Tamron AF 18-250mm F3.5-6.3 XR Di II LD
255.3= Tamron AF 55-200mm F4-5.6 Di II LD Macro
255.4= Tamron AF 70-300mm F4-5.6 Di LD Macro 1:2
255.5= Tamron SP AF 200-500mm F5.0-6.3 Di LD IF
255.6= Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical IF
255.7= Tamron SP AF 70-200mm F2.8 Di LD IF Macro
255.8= Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical IF
255.9= Tamron AF 90-300mm F4.5-5.6 Telemacro
18688= Sigma MC-11 SA-E Mount Converter with not-supported Sigma lens
25501= Minolta AF 50mm F1.7
25511= Minolta AF 35-70mm F4 or Other Lens
25511.1= Sigma UC AF 28-70mm F3.5-4.5
25511.2= Sigma AF 28-70mm F2.8
25511.3= Sigma M-AF 70-200mm F2.8 EX Aspherical
25511.4= Quantaray M-AF 35-80mm F4-5.6
25511.5= Tokina 28-70mm F2.8-4.5 AF
25521= Minolta AF 28-85mm F3.5-4.5 or Other Lens
25521.1= Tokina 19-35mm F3.5-4.5
25521.2= Tokina 28-70mm F2.8 AT-X
25521.3= Tokina 80-400mm F4.5-5.6 AT-X AF II 840
25521.4= Tokina AF PRO 28-80mm F2.8 AT-X 280
25521.5= Tokina AT-X PRO [II] AF 28-70mm F2.6-2.8 270
25521.6= Tamron AF 19-35mm F3.5-4.5
25521.7= Angenieux AF 28-70mm F2.6
25521.8= Tokina AT-X 17 AF 17mm F3.5
25521.9= Tokina 20-35mm F3.5-4.5 II AF
25531= Minolta AF 28-135mm F4-4.5 or Other Lens
25531.1= Sigma ZOOM-alpha 35-135mm F3.5-4.5
25531.2= Sigma 28-105mm F2.8-4 Aspherical
25531.3= Sigma 28-105mm F4-5.6 UC
25531.4= Tokina AT-X 242 AF 24-200mm F3.5-5.6
25541= Minolta AF 35-105mm F3.5-4.5
25551= Minolta AF 70-210mm F4 Macro or Sigma Lens
25551.1= Sigma 70-210mm F4-5.6 APO
25551.2= Sigma M-AF 70-200mm F2.8 EX APO
25551.3= Sigma 75-200mm F2.8-3.5
25561= Minolta AF 135mm F2.8
25571= Minolta/Sony AF 28mm F2.8
25581= Minolta AF 24-50mm F4
25601= Minolta AF 100-200mm F4.5
25611= Minolta AF 75-300mm F4.5-5.6 or Sigma Lens
25611.1= Sigma 70-300mm F4-5.6 DL Macro
25611.2= Sigma 300mm F4 APO Macro
25611.3= Sigma AF 500mm F4.5 APO
25611.4= Sigma AF 170-500mm F5-6.3 APO Aspherical
25611.5= Tokina AT-X AF 300mm F4
25611.6= Tokina AT-X AF 400mm F5.6 SD
25611.7= Tokina AF 730 II 75-300mm F4.5-5.6
25611.8= Sigma 800mm F5.6 APO
25611.9= Sigma AF 400mm F5.6 APO Macro
25611.10= Sigma 1000mm F8 APO
25621= Minolta AF 50mm F1.4 [New]
25631= Minolta AF 300mm F2.8 APO or Sigma Lens
25631.1= Sigma AF 50-500mm F4-6.3 EX DG APO
25631.2= Sigma AF 170-500mm F5-6.3 APO Aspherical
25631.3= Sigma AF 500mm F4.5 EX DG APO
25631.4= Sigma 400mm F5.6 APO
25641= Minolta AF 50mm F2.8 Macro or Sigma Lens
25641.1= Sigma 50mm F2.8 EX Macro
25651= Minolta AF 600mm F4 APO
25661= Minolta AF 24mm F2.8 or Sigma Lens
25661.1= Sigma 17-35mm F2.8-4 EX Aspherical
25721= Minolta/Sony AF 500mm F8 Reflex
25781= Minolta/Sony AF 16mm F2.8 Fisheye or Sigma Lens
25781.1= Sigma 8mm F4 EX [DG] Fisheye
25781.2= Sigma 14mm F3.5
25781.3= Sigma 15mm F2.8 Fisheye
25791= Minolta/Sony AF 20mm F2.8 or Tokina Lens
25791.1= Tokina AT-X Pro DX 11-16mm F2.8
25811= Minolta AF 100mm F2.8 Macro [New] or Sigma or Tamron Lens
25811.1= Sigma AF 90mm F2.8 Macro
25811.2= Sigma AF 105mm F2.8 EX [DG] Macro
25811.3= Sigma 180mm F5.6 Macro
25811.4= Sigma 180mm F3.5 EX DG Macro
25811.5= Tamron 90mm F2.8 Macro
25851= Beroflex 35-135mm F3.5-4.5
25858= Minolta AF 35-105mm F3.5-4.5 New or Tamron Lens
25858.1= Tamron 24-135mm F3.5-5.6
25881= Minolta AF 70-210mm F3.5-4.5
25891= Minolta AF 80-200mm F2.8 APO or Tokina Lens
25891.1= Tokina 80-200mm F2.8
25901= Minolta AF 200mm F2.8 G APO + Minolta AF 1.4x APO or Other Lens + 1.4x
25901.1= Minolta AF 600mm F4 HS-APO G + Minolta AF 1.4x APO
25911= Minolta AF 35mm F1.4
25921= Minolta AF 85mm F1.4 G (D)
25931= Minolta AF 200mm F2.8 APO
25941= Minolta AF 3x-1x F1.7-2.8 Macro
25961= Minolta AF 28mm F2
25971= Minolta AF 35mm F2 [New]
25981= Minolta AF 100mm F2
26011= Minolta AF 200mm F2.8 G APO + Minolta AF 2x APO or Other Lens + 2x
26011.1= Minolta AF 600mm F4 HS-APO G + Minolta AF 2x APO
26041= Minolta AF 80-200mm F4.5-5.6
26051= Minolta AF 35-80mm F4-5.6
26061= Minolta AF 100-300mm F4.5-5.6
26071= Minolta AF 35-80mm F4-5.6
26081= Minolta AF 300mm F2.8 HS-APO G
26091= Minolta AF 600mm F4 HS-APO G
26121= Minolta AF 200mm F2.8 HS-APO G
26131= Minolta AF 50mm F1.7 New
26151= Minolta AF 28-105mm F3.5-4.5 xi
26161= Minolta AF 35-200mm F4.5-5.6 xi
26181= Minolta AF 28-80mm F4-5.6 xi
26191= Minolta AF 80-200mm F4.5-5.6 xi
26201= Minolta AF 28-70mm F2.8 G
26211= Minolta AF 100-300mm F4.5-5.6 xi
26241= Minolta AF 35-80mm F4-5.6 Power Zoom
26281= Minolta AF 80-200mm F2.8 HS-APO G
26291= Minolta AF 85mm F1.4 New
26311= Minolta AF 100-300mm F4.5-5.6 APO
26321= Minolta AF 24-50mm F4 New
26381= Minolta AF 50mm F2.8 Macro New
26391= Minolta AF 100mm F2.8 Macro
26411= Minolta/Sony AF 20mm F2.8 New
26421= Minolta AF 24mm F2.8 New
26441= Minolta AF 100-400mm F4.5-6.7 APO
26621= Minolta AF 50mm F1.4 New
26671= Minolta AF 35mm F2 New
26681= Minolta AF 28mm F2 New
26721= Minolta AF 24-105mm F3.5-4.5 (D)
30464= Metabones Canon EF Speed Booster
45671= Tokina 70-210mm F4-5.6
45681= Tokina AF 35-200mm F4-5.6 Zoom SD
45701= Tamron AF 35-135mm F3.5-4.5
45711= Vivitar 70-210mm F4.5-5.6
45741= 2x Teleconverter or Tamron or Tokina Lens
45741.1= Tamron SP AF 90mm F2.5
45741.2= Tokina RF 500mm F8.0 x2
45741.3= Tokina 300mm F2.8 x2
45751= 1.4x Teleconverter
45851= Tamron SP AF 300mm F2.8 LD IF
45861= Tamron SP AF 35-105mm F2.8 LD Aspherical IF
45871= Tamron AF 70-210mm F2.8 SP LD
48128= Metabones Canon EF Speed Booster Ultra
61184= Canon EF Adapter
65280= Sigma 16mm F2.8 Filtermatic Fisheye
65535= E-Mount, T-Mount, Other Lens or no lens
65535.1= Arax MC 35mm F2.8 Tilt+Shift
65535.2= Arax MC 80mm F2.8 Tilt+Shift
65535.3= Zenitar MF 16mm F2.8 Fisheye M42
65535.4= Samyang 500mm Mirror F8.0
65535.5= Pentacon Auto 135mm F2.8
65535.6= Pentacon Auto 29mm F2.8
65535.7= Helios 44-2 58mm F2.0
+ +

Minolta CameraSettings Tags

+

There is some variability in CameraSettings information between different +models (and sometimes even between different firmware versions), so this +information may not be as reliable as it should be. Because of this, tags +in the following tables are set to lower priority to prevent them from +superseding the values of same-named tags in other locations when duplicate +tags are disabled.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1ExposureModeint32u0 = Program +
1 = Aperture Priority +
2 = Shutter Priority +
3 = Manual
2FlashModeint32u0 = Fill flash +
1 = Red-eye reduction +
2 = Rear flash sync +
3 = Wireless +
4 = Off?
3WhiteBalanceint32u~ 
4MinoltaImageSizeint32u + +
0 = Full +
1 = 1600x1200 +
2 = 1280x960 +
3 = 640x480
  6 = 2080x1560 +
7 = 2560x1920 +
8 = 3264x2176
+
5MinoltaQualityint32u + +
0 = Raw +
1 = Super Fine +
2 = Fine
  3 = Standard +
4 = Economy +
5 = Extra Fine
+
6DriveModeint32u + +
0 = Single +
1 = Continuous +
2 = Self-timer +
4 = Bracketing
  5 = Interval +
6 = UHS continuous +
7 = HS continuous
+
7MeteringModeint32u0 = Multi-segment +
1 = Center-weighted average +
2 = Spot
8ISOint32u 
9ExposureTimeint32u 
10FNumberint32u 
11MacroModeint32u0 = Off +
1 = On
12DigitalZoomint32u0 = Off +
1 = Electronic magnification +
2 = 2x
13ExposureCompensationint32u 
14BracketStepint32u0 = 1/3 EV +
1 = 2/3 EV +
2 = 1 EV
16IntervalLengthint32u 
17IntervalNumberint32u 
18FocalLengthint32u 
19FocusDistanceint32u 
20FlashFiredint32u0 = No +
1 = Yes
21MinoltaDateint32u 
22MinoltaTimeint32u 
23MaxApertureint32u 
26FileNumberMemoryint32u0 = Off +
1 = On
27LastFileNumberint32u 
28ColorBalanceRedint32u 
29ColorBalanceGreenint32u 
30ColorBalanceBlueint32u 
31Saturationint32u0 = Normal
32Contrastint32u0 = Normal
33Sharpnessint32u0 = Hard +
1 = Normal +
2 = Soft
34SubjectProgramint32u + +
0 = None +
1 = Portrait +
2 = Text
  3 = Night portrait +
4 = Sunset +
5 = Sports action
+
35FlashExposureCompint32u 
36ISOSettingint32u + +
0 = 100 +
1 = 200 +
2 = 400
  3 = 800 +
4 = Auto +
5 = 64
+
37MinoltaModelIDint32u +
0 = DiMAGE 7, X1, X21 or X31 +
1 = DiMAGE 5 +
2 = DiMAGE S304 +
3 = DiMAGE S404 +
4 = DiMAGE 7i +
5 = DiMAGE 7Hi +
6 = DiMAGE A1 +
7 = DiMAGE A2 or S414
+
38IntervalModeint32u0 = Still Image +
1 = Time-lapse Movie
39FolderNameint32u0 = Standard Form +
1 = Data Form
40ColorModeint32u0 = Natural color +
1 = Black & White +
2 = Vivid color +
3 = Solarization +
4 = Adobe RGB
41ColorFilterint32u 
42BWFilterint32u 
43InternalFlashint32u0 = No +
1 = Fired
44Brightnessint32u 
45SpotFocusPointXint32u 
46SpotFocusPointYint32u 
47WideFocusZoneint32u0 = No zone +
1 = Center zone (horizontal orientation) +
2 = Center zone (vertical orientation) +
3 = Left zone +
4 = Right zone
48FocusModeint32u0 = AF +
1 = MF
49FocusAreaint32u0 = Wide Focus (normal) +
1 = Spot Focus
50DECPositionint32u0 = Exposure +
1 = Contrast +
2 = Saturation +
3 = Filter
51ColorProfileint32u(DiMAGE 7Hi only) +
0 = Not Embedded +
1 = Embedded
52DataImprintint32u(DiMAGE 7Hi only) +
0 = None +
1 = YYYY/MM/DD +
2 = MM/DD/HH:MM +
3 = Text +
4 = Text + ID#
63FlashMeteringint32u0 = ADI (Advanced Distance Integration) +
1 = Pre-flash TTL +
2 = Manual flash control
+ +

Minolta CameraSettings7D Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0ExposureModeint16u + +
0 = Program +
1 = Aperture Priority +
2 = Shutter Priority +
3 = Manual
  4 = Auto +
5 = Program-shift A +
6 = Program-shift S
+
2MinoltaImageSizeint16u0 = Large +
1 = Medium +
2 = Small
3MinoltaQualityint16u0 = RAW +
16 = Fine +
32 = Normal +
34 = RAW+JPEG +
48 = Economy
4WhiteBalanceint16u + +
0 = Auto +
1 = Daylight +
2 = Shade +
3 = Cloudy
  4 = Tungsten +
5 = Fluorescent +
256 = Kelvin +
512 = Manual
+
14FocusModeint16u0 = AF-S +
1 = AF-C +
3 = Manual +
4 = AF-A
16AFPointsint16u + +
0x0 = (none) +
Bit 0 = Center +
Bit 1 = Top +
Bit 2 = Top-right +
Bit 3 = Right
  Bit 4 = Bottom-right +
Bit 5 = Bottom +
Bit 6 = Bottom-left +
Bit 7 = Left +
Bit 8 = Top-left
+
21Flashint16u0 = Off +
1 = On
22FlashModeint16u0 = Normal +
1 = Red-eye reduction +
2 = Rear flash sync
28ISOSettingint16u + +
0 = Auto +
1 = 100 +
3 = 200 +
4 = 400
  5 = 800 +
6 = 1600 +
7 = 3200
+
30ExposureCompensationint16s 
37ColorSpaceint16u0 = Natural sRGB +
1 = Natural+ sRGB +
4 = Adobe RGB
38Sharpnessint16u 
39Contrastint16u 
40Saturationint16u 
45FreeMemoryCardImagesint16u 
63ColorTemperatureint16s 
64HueAdjustmentint16u 
70Rotationint16u72 = Horizontal (normal) +
76 = Rotate 90 CW +
82 = Rotate 270 CW
71FNumberint16u 
72ExposureTimeint16u 
74FreeMemoryCardImagesint16u 
94ImageNumberint16u(this information may appear at index 98 (0x62), depending on firmware +version)
96NoiseReductionint16u0 = Off +
1 = On
98ImageNumber2int16u 
113ImageStabilizationint16u0 = Off +
1 = On
117ZoneMatchingOnint16u0 = Off +
1 = On
+ +

Minolta CameraInfoA100 Tags

+

Camera information for the Sony DSLR-A100.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1AFSensorActiveint8u + +
0 = Top-right +
1 = Bottom-right +
2 = Bottom +
3 = Middle Horizontal
  4 = Center Vertical +
5 = Top +
6 = Top-left +
7 = Bottom-left
+
2AFStatusActiveSensorint16s(the focus status at shutter release. May not reflect the status after +focusing if the image is focused then recomposed) + +
-32768 = Out of Focus  0 = In Focus
+
4AFStatusTop-rightint16s + +
-32768 = Out of Focus  0 = In Focus
+
6AFStatusBottom-rightint16s + +
-32768 = Out of Focus  0 = In Focus
+
8AFStatusBottomint16s + +
-32768 = Out of Focus  0 = In Focus
+
10AFStatusMiddleHorizontalint16s(any of the three horizontal sensors at the middle of the focus frame: Left, +Center or Right) + +
-32768 = Out of Focus  0 = In Focus
+
12AFStatusCenterVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
14AFStatusTopint16s + +
-32768 = Out of Focus  0 = In Focus
+
16AFStatusTop-leftint16s + +
-32768 = Out of Focus  0 = In Focus
+
18AFStatusBottom-leftint16s + +
-32768 = Out of Focus  0 = In Focus
+
20FocusLockedint8u0 = Manual Focus +
4 = No +
16 = Continuous Focus +
64 = Yes
21AFPointint8u + +
0 = Auto +
1 = Center +
2 = Top +
3 = Top-right +
4 = Right
  5 = Bottom-right +
6 = Bottom +
7 = Bottom-left +
8 = Left +
9 = Top-left
+
22AFModeint8u0 = DMF +
1 = AF-S +
2 = AF-C +
3 = AF-A
45AFStatusLeftint16s + +
-32768 = Out of Focus  0 = In Focus
+
47AFStatusCenterHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
49AFStatusRightint16s + +
-32768 = Out of Focus  0 = In Focus
+
51AFAreaModeint8u0 = Wide +
1 = Local +
2 = Spot
+ +

Minolta ISInfoA100 Tags

+

Image stabilization information for the Sony DSLR-A100.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0ImageStabilizationint16u0x0 = Off +
0x2784 = On
+ +

Minolta WBInfoA100 Tags

+

White balance information for the Sony DSLR-A100.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
14DriveModeint8u +
0 = Self-timer 10 sec +
1 = Continuous +
2 = Single-frame Exposure Bracketing +
3 = Continuous Exposure Bracketing +
4 = Self-Timer 2 sec +
5 = Single Frame +
8 = White Balance Bracketing Low +
9 = White Balance Bracketing High
+
16Rotationint8u0 = Horizontal (normal) +
1 = Rotate 270 CW +
2 = Rotate 90 CW
20ImageStabilizationSettingint8u0 = Off +
1 = On
21DynamicRangeOptimizerModeint8u0 = Off +
1 = Standard +
2 = Advanced
42ExposureCompensationModeint8u0 = Ambient and Flash +
1 = Ambient Only
43WBBracketShotNumberint8u 
44WhiteBalanceBracketingint8u0 = Off +
1 = Low +
2 = High
45ExposureBracketShotNumberint8u 
49FlashFunctionint16u +
0x0 = No flash +
0x300 = Built-in flash +
0x1205 = Manual +
0x120e = Strobe +
0x128e = Fill flash, Pre-flash TTL +
0x12ae = Bounce flash +
0x140e = Rear sync, ADI +
0x148e = Fill flash, ADI +
0x1580 = Wireless +
0x178e = HSS
+
52ExposureModeint16u + +
0x0 = Program +
0x1 = Aperture Priority +
0x2 = Shutter Priority +
0x3 = Manual +
0x4 = Auto +
0x5 = Program Shift A +
0x6 = Program Shift S
  0x1013 = Portrait +
0x1023 = Sports +
0x1033 = Sunset +
0x1043 = Night View/Portrait +
0x1053 = Landscape +
0x1083 = Macro
+
54ColorModeint16u + +
0 = Standard +
1 = Vivid +
2 = Portrait +
3 = Landscape
  4 = Sunset +
5 = Night View +
7 = B&W +
8 = Adobe RGB
+
56AverageLVint16u(arithmetic mean of the readings from the 40 honeycomb segments)
60FrameNumberint8u 
150WB_RGBLevelsint16u[3] 
174WB_GBRGLevelsint16u[4] 
192WB_RedLevelsTungstenint16u[7](7 values for adjustments of -3 through +3)
206WB_BlueLevelsTungstenint16u[7] 
220WB_RedLevelsDaylightint16u[7] 
234WB_BlueLevelsDaylightint16u[7] 
248WB_RedLevelsCloudyint16u[7] 
262WB_BlueLevelsCloudyint16u[7] 
276WB_RedLevelsFlashint16u[7] 
290WB_BlueLevelsFlashint16u[7] 
332WB_RedLevelsFluorescentint16u[7](white balance red presets for fluorescent -2 through +4: -2=Fluorescent, +-1=WhiteFluorescent, 0=CoolWhiteFluorescent, +1=DayWhiteFluorescent and ++3=DaylightFluorescent)
346WB_BlueLevelsFluorescentint16u[7] 
360WB_RedLevelsShadeint16u[7] 
374WB_BlueLevelsShadeint16u[7] 
392WB_RedLevel6500Kint16u 
394WB_BlueLevel6500Kint16u 
396WB_RedLevelCustomint16u 
398WB_BlueLevelCustomint16u 
408WB_RedLevel3500Kint16u 
410WB_BlueLevel3500Kint16u 
446WB_RedLevelsKelvinint16u[75](values for 2500-9900 K, in increments of 100 K)
596WB_BlueLevelsKelvinint16u[75] 
772WB_RBLevelsFlashint16u[2] 
776WB_RBLevelsCoolWhiteFint16u[2] 
1000WB_RBLevelsTungstenint16u[2] 
1004WB_RBLevelsDaylightint16u[2] 
1008WB_RBLevelsCloudyint16u[2] 
1012WB_RBLevelsFlashint16u[2] 
1020WB_RedLevelsFluorescentint16u[7] 
1034WB_BlueLevelsFluorescentint16u[7] 
1048WB_RBLevelsShadeint16u[2] 
1056WB_RBLevels6500Kint16u[2] 
1060WB_RBLevelsCustomint16u[2] 
1072WB_RBLevels3500Kint16u[2] 
1320WB_RBLevelsDaylightint16u[2] 
1350WB_RGBLevelsint16u[3] 
1576AEMeteringSegmentsint8u[40](metering values from the 40 honeycomb segments, converted to LV. The first +value is for the outer cell, then the values are given row by row, from top +to bottom, with each row scanned left-to-right. The 21st value is the +middle cell, which gives the spot metering)
1680MeasuredLVint8u(measured light value based on MeteringMode)
1681BrightnessValueint8u 
4172TiffMeteringImageno(13-bit RBGG (?) 40x30 pixels, presumably metering info, converted to a 16-bit +TIFF image;)
18872ExposureTimeint8u 
18874ISOint8u 
18875FocusDistanceint8u 
18877LensTypeint16uRev--> Minolta LensType Values
18880ExposureCompensationint8s 
18881FlashExposureCompint8s 
18882ImageStabilizationint8u0 = Off +
1 = On
18883BrightnessValueint8u 
18885MaxApertureint8u 
18887FNumberint8u 
18908InternalSerialNumberstring[12] 
+ +

Minolta CameraSettings5D Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
10ExposureModeint16u +
0 = Program +
1 = Aperture Priority +
2 = Shutter Priority +
3 = Manual +
4 = Auto? +
4131 = Connected Copying?
+
12MinoltaImageSizeint16u0 = Large +
1 = Medium +
2 = Small
13MinoltaQualityint16u0 = RAW +
16 = Fine +
32 = Normal +
34 = RAW+JPEG +
48 = Economy
14WhiteBalanceint16u + +
0 = Auto +
1 = Daylight +
2 = Cloudy +
3 = Shade +
4 = Tungsten
  5 = Fluorescent +
6 = Flash +
256 = Kelvin +
512 = Manual
+
31Flashint16u0 = Did not fire +
1 = Fired
32FlashModeint16u0 = Normal +
1 = Red-eye reduction +
2 = Rear flash sync
37MeteringModeint16u0 = Multi-segment +
1 = Center-weighted average +
2 = Spot
38ISOSettingint16u +
0 = Auto +
1 = 100 +
3 = 200 +
4 = 400 +
5 = 800 +
6 = 1600 +
7 = 3200 +
8 = 200 (Zone Matching High) +
10 = 80 (Zone Matching Low)
+
47ColorSpaceint16u0 = Natural sRGB +
1 = Natural+ sRGB +
2 = Monochrome +
4 = Adobe RGB (ICC) +
5 = Adobe RGB
48Sharpnessint16u 
49Contrastint16u 
50Saturationint16u 
53ExposureTimeint16u 
54FNumberint16u 
55FreeMemoryCardImagesint16u 
73ColorTemperatureint16s 
74HueAdjustmentint16u 
80Rotationint16u72 = Horizontal (normal) +
76 = Rotate 90 CW +
82 = Rotate 270 CW
83ExposureCompensationint16u 
84FreeMemoryCardImagesint16u 
101Rotationint16u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
110ColorTemperatureint16s 
113PictureFinishint16u + +
0 = Natural +
1 = Natural+ +
2 = Portrait +
3 = Wind Scene +
4 = Evening Scene
  5 = Night Scene +
6 = Night Portrait +
7 = Monochrome +
8 = Adobe RGB +
9 = Adobe RGB (ICC)
+
174ImageNumberint16u 
176NoiseReductionint16u0 = Off +
1 = On
189ImageStabilizationint16u0 = Off +
1 = On
+ +

Minolta CameraSettingsA100 Tags

+

Camera settings information for the Sony DSLR-A100.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0ExposureModeint16u +
0x0 = Program +
0x1 = Aperture Priority +
0x2 = Shutter Priority +
0x3 = Manual +
0x4 = Auto +
0x5 = Program Shift A +
0x6 = Program Shift S +
0x1013 = Portrait +
0x1023 = Sports +
0x1033 = Sunset +
0x1043 = Night View/Portrait +
0x1053 = Landscape +
0x1083 = Macro
+
1ExposureCompensationSettingint16u 
5HighSpeedSyncint16u0 = Off +
1 = On
6ShutterSpeedSettingint16u(used only in M and S exposure modes)
7ApertureSettingint16u(used only in M and A exposure modes)
8ExposureTimeint16u 
9FNumberint16u 
10DriveMode2int16u +
0x0 = Self-timer 10 sec +
0x1 = Continuous +
0x4 = Self-timer 2 sec +
0x5 = Single Frame +
0x8 = White Balance Bracketing Low +
0x9 = White Balance Bracketing High +
0x302 = Single-frame Bracketing Low +
0x303 = Continous Bracketing Low +
0x702 = Single-frame Bracketing High +
0x703 = Continuous Bracketing High
+
11WhiteBalanceint16u + +
0x0 = Auto +
0x1 = Daylight +
0x2 = Cloudy +
0x3 = Shade +
0x4 = Tungsten
  0x5 = Fluorescent +
0x6 = Flash +
0x100 = Kelvin +
0x200 = Manual
+
12FocusModeint16u0 = AF-S +
1 = AF-C +
4 = AF-A +
5 = Manual +
6 = DMF
13AFPointSelectedint16u + +
1 = Center +
2 = Top +
3 = Top-right +
4 = Right +
5 = Bottom-right
  6 = Bottom +
7 = Bottom-left +
8 = Left +
9 = Top-left
+
14AFAreaModeint16u0 = Wide +
1 = Local +
2 = Spot
15FlashModeint16u0 = Auto +
2 = Rear Sync +
3 = Wireless +
4 = Fill Flash
16FlashExposureCompSetint16u 
18MeteringModeint16u0 = Multi-segment +
1 = Center-weighted average +
2 = Spot
19ISOSettingint16u +
0 = Auto +
48 = 100 +
56 = 200 +
64 = 400 +
72 = 800 +
80 = 1600 +
174 = 80 (Zone Matching Low) +
184 = 200 (Zone Matching High)
+
20ZoneMatchingModeint16u0 = Off +
1 = Standard +
2 = Advanced
21DynamicRangeOptimizerint16u(as applied to image) +
0 = Off +
1 = Standard +
2 = Advanced
22ColorModeint16u + +
0 = Standard +
1 = Vivid +
2 = Portrait +
3 = Landscape
  4 = Sunset +
5 = Night Scene +
7 = B&W +
8 = Adobe RGB
+
23ColorSpaceint16u0 = sRGB +
2 = B&W +
5 = Adobe RGB
24Sharpnessint16u0 = Normal
25Contrastint16u0 = Normal
26Saturationint16u0 = Normal
28FlashMeteringint16u0 = ADI (Advanced Distance Integration) +
1 = Pre-flash TTL
29PrioritySetupShutterReleaseint16u0 = AF +
1 = Release
30DriveModeint16u +
0 = Single Frame +
1 = Continuous +
2 = Self-timer +
3 = Continuous Bracketing +
4 = Single-Frame Bracketing +
5 = White Balance Bracketing
+
31SelfTimerTimeint16u0 = 10 s +
4 = 2 s
32ContinuousBracketingint16u0x303 = Low +
0x703 = High
33SingleFrameBracketingint16u0x302 = Low +
0x702 = High
34WhiteBalanceBracketingint16u0x8 = Low +
0x9 = High
35WhiteBalanceSettingint16u +
0x0 = Auto +
0x1 = Preset +
0x2 = Custom +
0x3 = Color Temperature/Color Filter +
0x8001 = Preset +
0x8002 = Custom +
0x8003 = Color Temperature/Color Filter
+
36PresetWhiteBalanceint16u + +
1 = Daylight +
2 = Cloudy +
3 = Shade
  4 = Tungsten +
5 = Fluorescent +
6 = Flash
+
37ColorTemperatureSettingint16u0 = Temperature +
2 = Color Filter
38CustomWBSettingint16u0 = Setup +
1 = Recall
39DynamicRangeOptimizerSettingint16u(as set in camera) +
0 = Off +
1 = Standard +
2 = Advanced
50FreeMemoryCardImagesint16u 
52CustomWBRedLevelint16u 
53CustomWBGreenLevelint16u 
54CustomWBBlueLevelint16u 
55CustomWBErrorint16u0 = OK +
1 = Error
56WhiteBalanceFineTuneint16s 
57ColorTemperatureint16u 
58ColorCompensationFilterint16s(ranges from -2 for green to +2 for magenta)
59SonyImageSizeint16u0 = Standard +
1 = Medium +
2 = Small
60SonyQualityint16u0 = RAW +
32 = Fine +
34 = RAW + JPEG +
48 = Standard
61InstantPlaybackTimeint16u 
62InstantPlaybackSetupint16u0 = Image and Information +
1 = Image Only +
3 = Image and Histogram
63NoiseReductionint16u0 = Off +
1 = On
64EyeStartAFint16u0 = On +
1 = Off
65RedEyeReductionint16u0 = Off +
1 = On
66FlashDefaultint16u0 = Auto +
1 = Fill Flash
67AutoBracketOrderint16u0 = 0 - + +
1 = - 0 +
68FocusHoldButtonint16u0 = Focus Hold +
1 = DOF Preview
69AELButtonint16u0 = Hold +
1 = Toggle +
2 = Spot Hold +
3 = Spot Toggle
70ControlDialSetint16u0 = Shutter Speed +
1 = Aperture
71ExposureCompensationModeint16u0 = Ambient and Flash +
1 = Ambient Only
72AFAssistint16u0 = On +
1 = Off
73CardShutterLockint16u0 = On +
1 = Off
74LensShutterLockint16u0 = On +
1 = Off
75AFAreaIlluminationint16u0 = 0.3 s +
1 = 0.6 s +
2 = Off
76MonitorDisplayOffint16u0 = Automatic +
1 = Manual
77RecordDisplayint16u0 = Auto Rotate +
1 = Horizontal
78PlayDisplayint16u0 = Auto Rotate +
1 = Manual Rotate
80ExposureIndicatorint16u--> Minolta ExposureIndicator Values
81AELExposureIndicatorint16u--> Minolta ExposureIndicator Values +
(also indicates exposure for next shot when bracketing)
82ExposureBracketingIndicatorLastint16u--> Minolta ExposureIndicator Values +
(indicator for last shot when bracketing)
83MeteringOffScaleIndicatorint16u(two flashing triangles when under or over metering scale) +
0 = Within Range +
1 = Under/Over Range +
255 = Out of Range
84FlashExposureIndicatorint16u--> Minolta ExposureIndicator Values
85FlashExposureIndicatorNextint16u--> Minolta ExposureIndicator Values +
(indicator for next shot when bracketing)
86FlashExposureIndicatorLastint16u--> Minolta ExposureIndicator Values +
(indicator for last shot when bracketing)
87ImageStabilizationint16u0 = Off +
1 = On
88FocusModeSwitchint16u0 = AF +
1 = MF
89FlashTypeint16u0 = Off +
1 = Built-in +
2 = External
90Rotationint16u0 = Horizontal (Normal) +
1 = Rotate 270 CW +
2 = Rotate 90 CW
91AELockint16u0 = Off +
1 = On
94ColorTemperatureint16u 
95ColorCompensationFilterint16s(ranges from -2 for green to +2 for magenta)
96BatteryStateint16u3 = Very Low +
4 = Low +
5 = Half Full +
6 = Sufficient Power Remaining
+ +

Minolta ExposureIndicator Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueExposureIndicatorValueExposureIndicatorValueExposureIndicator
0= Not Indicated125= -0.7133= +1.3
1= Under Scale126= -0.5134= +1.5
119= Bottom of Scale127= -0.3135= +1.7
120= -2.0128= 0136= +2.0
121= -1.7129= +0.3253= Top of Scale
122= -1.5130= +0.5254= Over Scale
123= -1.3131= +0.7  
124= -1.0132= +1.0  
+ +

Minolta MMA Tags

+

This information is found in MOV videos from Minolta models such as the +DiMAGE A2, S414 and 7Hi.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
20SoftwareVersionno 
+ +

Minolta MOV1 Tags

+

This information is found in MOV videos from some Konica Minolta models such +as the DiMage Z10 and X50.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
32ModelTypeno 
46ExposureTimeno 
50FNumberno 
58ExposureCompensationno 
80FocalLengthno 
+ +

Minolta MOV2 Tags

+

This information is found in MOV videos from some Minolta models such as the +DiMAGE X and Xt.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
24ModelTypeno 
38ExposureTimeno 
42FNumberno 
50ExposureCompensationno 
72FocalLengthno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 29, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/MinoltaRaw.html b/html/TagNames/MinoltaRaw.html new file mode 100644 index 0000000..f6d325a --- /dev/null +++ b/html/TagNames/MinoltaRaw.html @@ -0,0 +1,332 @@ + + + + +MinoltaRaw Tags + + + +

MinoltaRaw Tags

+

These tags are used in Minolta RAW format (MRW) images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
"\0PRD"MinoltaPRD---> MinoltaRaw PRD Tags
"\0RIF"MinoltaRIF---> MinoltaRaw RIF Tags
"\0TTW"MinoltaTTW---> EXIF Tags
"\0WBG"MinoltaWBG---> MinoltaRaw WBG Tags
+ +

MinoltaRaw PRD Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FirmwareIDstring[8] 
8SensorHeightint16u 
10SensorWidthint16u 
12ImageHeightint16u 
14ImageWidthint16u 
16RawDepthint8u 
17BitDepthint8u 
18StorageMethodint8u82 = Padded +
89 = Linear
23BayerPatternint8u1 = RGGB +
4 = GBRG
+ +

MinoltaRaw RIF Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1Saturationint8s 
2Contrastint8s 
3Sharpnessint8s 
4WBModeint8u~ 
5ProgramModeint8u + +
0 = None +
1 = Portrait +
2 = Text
  3 = Night Portrait +
4 = Sunset +
5 = Sports
+
6ISOSettingint8u +
0 = Auto +
48 = 100 +
56 = 200 +
64 = 400 +
72 = 800 +
80 = 1600 +
174 = 80 (Zone Matching Low) +
184 = 200 (Zone Matching High)
+
7ColorModeint32u[0.25] + +
0 = Natural color +
1 = Black & White +
2 = Vivid color +
3 = Solarization +
4 = Adobe RGB +
5 = Sepia +
9 = Natural +
12 = Portrait
  13 = Natural sRGB +
14 = Natural+ sRGB +
15 = Landscape +
16 = Evening +
17 = Night Scene +
18 = Night Portrait +
132 = Embed Adobe RGB
+(Sony A100) +
0x0 = Standard +
0x1 = Vivid +
0x2 = Portrait +
0x3 = Landscape +
0x4 = Sunset +
0x5 = Night View/Portrait +
0x6 = B&W +
0x7 = Adobe RGB +
0xc = Neutral +
0xd = Clear +
0xe = Deep +
0xf = Light +
0x10 = Autumn Leaves +
0x11 = Sepia +
0x12 = FL +
0x13 = Vivid 2 +
0x14 = IN +
0x15 = SH +
0x64 = Neutral +
0x65 = Clear +
0x66 = Deep +
0x67 = Light +
0x68 = Night View +
0x69 = Autumn Leaves +
0xff = Off +
0xffffffff = n/a
+
8WB_RBLevelsTungstenint16u[2](these WB_RBLevels currently decoded only for the Sony A100)
12WB_RBLevelsDaylightint16u[2] 
16WB_RBLevelsCloudyint16u[2] 
20WB_RBLevelsCoolWhiteFint16u[2] 
24WB_RBLevelsFlashint16u[2] 
28WB_RBLevelsCustomint16u[2] 
32WB_RBLevelsShadeint16u[2] 
36WB_RBLevelsDaylightFint16u[2] 
40WB_RBLevelsDayWhiteFint16u[2] 
44WB_RBLevelsWhiteFint16u[2] 
56ColorFilterint8s(Minolta models)
57BWFilterint8u 
58ZoneMatchingint8u(Minolta models) +
0 = ISO Setting Used +
1 = High Key +
2 = Low Key
59Hueint8s 
60ColorTemperatureint8u(Minolta models)
74ZoneMatchingint8u(Sony models) +
0 = ISO Setting Used +
1 = High Key +
2 = Low Key
76ColorTemperatureint8u(A100)
77ColorFilterint8u(A100)
78ColorTemperatureint8u(A200 and A700)
79ColorFilterint8u(A200 and A700)
80RawDataLengthno(A100)
+ +

MinoltaRaw WBG Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0WBScaleint8u[4] 
4WB_GBRGLevels +
WB_RGGBLevels
int16u[4]
int16u[4]
(DiMAGE A200) +
(other models)
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 29, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Motorola.html b/html/TagNames/Motorola.html new file mode 100644 index 0000000..84a0065 --- /dev/null +++ b/html/TagNames/Motorola.html @@ -0,0 +1,53 @@ + + + + +Motorola Tags + + + +

Motorola Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x5500BuildNumberstring 
0x5501SerialNumberstring 
0x6420CustomRenderedstring 
0x64d0DriveModestring 
0x665eSensorstring 
0x6705ManufactureDatestring 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 21, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Nikon.html b/html/TagNames/Nikon.html new file mode 100644 index 0000000..f483c95 --- /dev/null +++ b/html/TagNames/Nikon.html @@ -0,0 +1,8991 @@ + + + + +Nikon Tags + + + +

Nikon Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001MakerNoteVersionundef[4] 
0x0002ISOint16u[2] 
0x0003ColorModestring 
0x0004Qualitystring 
0x0005WhiteBalancestring 
0x0006Sharpnessstring 
0x0007FocusModestring 
0x0008FlashSettingstring 
0x0009FlashTypestring 
0x000bWhiteBalanceFineTuneint16s[n] 
0x000cWB_RBLevelsrational64u[4] 
0x000dProgramShiftundef[4] 
0x000eExposureDifferenceundef[4] 
0x000fISOSelectionstring 
0x0010DataDumpno 
0x0011PreviewIFD---> Nikon PreviewIFD Tags
0x0012FlashExposureCompundef[4](may be set even if flash does not fire. Does not include the effect of +flash bracketing.)
0x0013ISOSettingint16u[2] 
0x0014ColorBalanceA +
NRWData
-
-
--> Nikon ColorBalanceA Tags +
--> Nikon ColorBalanceB Tags +
--> Nikon ColorBalanceC Tags
0x0016ImageBoundaryint16u[4] 
0x0017ExternalFlashExposureCompundef[4] 
0x0018FlashExposureBracketValueundef[4] 
0x0019ExposureBracketValuerational64s 
0x001aImageProcessingstring 
0x001bCropHiSpeedint16u[7] + +
0 = Off +
1 = 1.3x Crop +
2 = DX Crop +
3 = 5:4 Crop +
4 = 3:2 Crop +
6 = 16:9 Crop +
8 = 2.7x Crop +
9 = DX Movie Crop
  10 = 1.3x Movie Crop +
11 = FX Uncropped +
12 = DX Uncropped +
13 = 2.8x Movie Crop +
14 = 1.4x Movie Crop +
15 = 1.5x Movie Crop +
17 = 1:1 Crop
+
0x001cExposureTuningundef[3] 
0x001dSerialNumberstring!(this value is used as a key to decrypt other information -- writing this tag +causes the other information to be re-encrypted with the new key)
0x001eColorSpaceint16u1 = sRGB +
2 = Adobe RGB
0x001fVRInfo---> Nikon VRInfo Tags
0x0020ImageAuthenticationint8u0 = Off +
1 = On
0x0021FaceDetect---> Nikon FaceDetect Tags
0x0022ActiveD-Lightingint16u + +
0 = Off +
1 = Low +
3 = Normal +
5 = High +
7 = Extra High
  8 = Extra High 1 +
9 = Extra High 2 +
10 = Extra High 3 +
11 = Extra High 4 +
65535 = Auto
+
0x0023PictureControlDataundef!^--> Nikon PictureControl Tags +
--> Nikon PictureControl2 Tags +
--> Nikon PictureControl3 Tags +
--> Nikon PictureControlUnknown Tags
0x0024WorldTime---> Nikon WorldTime Tags
0x0025ISOInfo---> Nikon ISOInfo Tags
0x002aVignetteControlint16u0 = Off +
1 = Low +
3 = Normal +
5 = High
0x002bDistortInfo---> Nikon DistortInfo Tags
0x002cUnknownInfo---> Nikon UnknownInfo Tags
0x0032UnknownInfo2---> Nikon UnknownInfo2 Tags
0x0034ShutterModeint16u +
0 = Mechanical +
16 = Electronic +
48 = Electronic Front Curtain +
64 = Electronic (Movie) +
80 = Auto (Mechanical) +
81 = Auto (Electronic Front Curtain)
+
0x0035HDRInfo---> Nikon HDRInfo Tags
0x0037MechanicalShutterCountint32u 
0x0039LocationInfo---> Nikon LocationInfo Tags
0x003dBlackLevelint16u[4] 
0x003eImageSizeRAWyes1 = Large +
2 = Medium +
3 = Small
0x0045CropAreaint16u[4](left, top, width, height)
0x004eNikonSettingsundef!^--> NikonSettings Tags
0x004fColorTemperatureAutoint16u 
0x0080ImageAdjustmentstring 
0x0081ToneCompstring 
0x0082AuxiliaryLensstring 
0x0083LensTypeint8uBit 0 = MF +
Bit 1 = D +
Bit 2 = G +
Bit 3 = VR +
Bit 4 = 1 +
Bit 5 = FT-1 +
Bit 6 = E +
Bit 7 = AF-P
0x0084Lensrational64u[4] 
0x0085ManualFocusDistancerational64u 
0x0086DigitalZoomrational64u 
0x0087FlashModeint8u +
0 = Did Not Fire +
1 = Fired, Manual +
3 = Not Ready +
7 = Fired, External +
8 = Fired, Commander Mode +
9 = Fired, TTL Mode +
18 = LED Light
+
0x0088AFInfo---> Nikon AFInfo Tags +
--> Nikon AFInfo Tags
0x0089ShootingModeint16u~(for the D70, Bit 5 = Unused LE-NR Slowdown) +
Bit 0 = Continuous +
Bit 1 = Delay +
Bit 2 = PC Control +
Bit 3 = Self-timer +
Bit 4 = Exposure Bracketing +
Bit 5 = Auto ISO +
Bit 6 = White-Balance Bracketing +
Bit 7 = IR Control +
Bit 8 = D-Lighting Bracketing
0x008bLensFStopsundef[4] 
0x008cContrastCurveundef! 
0x008dColorHuestring 
0x008fSceneModestring 
0x0090LightSourcestring 
0x0091ShotInfoD40 +
ShotInfoD80 +
ShotInfoD90 +
ShotInfoD3a +
ShotInfoD3b +
ShotInfoD3X +
ShotInfoD3S +
ShotInfoD300a +
ShotInfoD300b +
ShotInfoD300S +
ShotInfoD700 +
ShotInfoD800 +
ShotInfoD810 +
ShotInfoD850 +
ShotInfoD5000 +
ShotInfoD5100 +
ShotInfoD5200 +
ShotInfoD7000 +
ShotInfoD4 +
ShotInfoD4S +
ShotInfoD5 +
ShotInfoD500 +
ShotInfoD6 +
ShotInfoD610 +
ShotInfoZ7II +
ShotInfoZ9 +
ShotInfo02xx +
ShotInfoUnknown
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
--> Nikon ShotInfoD40 Tags +
--> Nikon ShotInfoD80 Tags +
--> Nikon ShotInfoD90 Tags +
--> Nikon ShotInfoD3a Tags +
--> Nikon ShotInfoD3b Tags +
--> Nikon ShotInfoD3X Tags +
--> Nikon ShotInfoD3S Tags +
--> Nikon ShotInfoD300a Tags +
--> Nikon ShotInfoD300b Tags +
--> Nikon ShotInfoD300S Tags +
--> Nikon ShotInfoD700 Tags +
--> Nikon ShotInfoD800 Tags +
--> Nikon ShotInfoD810 Tags +
--> Nikon ShotInfoD850 Tags +
--> Nikon ShotInfoD5000 Tags +
--> Nikon ShotInfoD5100 Tags +
--> Nikon ShotInfoD5200 Tags +
--> Nikon ShotInfoD7000 Tags +
--> Nikon ShotInfoD4 Tags +
--> Nikon ShotInfoD4S Tags +
--> Nikon ShotInfoD500 Tags +
--> Nikon ShotInfoD500 Tags +
--> Nikon ShotInfoD6 Tags +
--> Nikon ShotInfoD610 Tags +
--> Nikon ShotInfoZ7II Tags +
--> Nikon ShotInfoZ9 Tags +
--> Nikon ShotInfo Tags +
--> Nikon ShotInfo Tags
0x0092HueAdjustmentint16s 
0x0093NEFCompressionint16u--> Nikon NEFCompression Values
0x0094SaturationAdjint16s 
0x0095NoiseReductionstring 
0x0096NEFLinearizationTableundef! 
0x0097ColorBalance0100 +
ColorBalance0102 +
ColorBalance0103 +
ColorBalance0205 +
ColorBalance0209 +
ColorBalance02 +
ColorBalance0211 +
ColorBalance0213 +
ColorBalance0215 +
ColorBalanceUnknown02 +
ColorBalanceUnknown04 +
ColorBalanceUnknown
-
-
-
-
-
-
-
-
-
-
-
-
--> Nikon ColorBalance1 Tags +
--> Nikon ColorBalance2 Tags +
--> Nikon ColorBalance3 Tags +
--> Nikon ColorBalance2 Tags +
--> Nikon ColorBalance4 Tags +
--> Nikon ColorBalance2 Tags +
--> Nikon ColorBalance4 Tags +
--> Nikon ColorBalance2 Tags +
--> Nikon ColorBalance4 Tags +
--> Nikon ColorBalanceUnknown Tags +
--> Nikon ColorBalanceUnknown Tags +
--> Nikon ColorBalanceUnknown Tags
0x0098LensData0100 +
LensData0101 +
LensData0201 +
LensData0204 +
LensData0400 +
LensData0402 +
LensData0403 +
LensData0800 +
LensDataUnknown
-
-
-
-
-
-
-
-
-
--> Nikon LensData00 Tags +
--> Nikon LensData01 Tags +
--> Nikon LensData01 Tags +
--> Nikon LensData0204 Tags +
--> Nikon LensData0400 Tags +
--> Nikon LensData0402 Tags +
--> Nikon LensData0403 Tags +
--> Nikon LensData0800 Tags +
--> Nikon LensDataUnknown Tags
0x0099RawImageCenterint16u[2] 
0x009aSensorPixelSizerational64u[2] 
0x009cSceneAssiststring 
0x009dDateStampModeint16u(feature to imprint date/time on image) +
0 = Off +
1 = Date & Time +
2 = Date +
3 = Date Counter
0x009eRetouchHistoryint16u[10][Values 0-9] + +
0 = None +
3 = B & W +
4 = Sepia +
5 = Trim +
6 = Small Picture +
7 = D-Lighting +
8 = Red Eye +
9 = Cyanotype +
10 = Sky Light +
11 = Warm Tone +
12 = Color Custom +
13 = Image Overlay +
14 = Red Intensifier +
15 = Green Intensifier +
16 = Blue Intensifier +
17 = Cross Screen +
18 = Quick Retouch +
19 = NEF Processing +
23 = Distortion Control +
25 = Fisheye +
26 = Straighten +
29 = Perspective Control
  30 = Color Outline +
31 = Soft Filter +
32 = Resize +
33 = Miniature Effect +
34 = Skin Softening +
35 = Selected Frame +
37 = Color Sketch +
38 = Selective Color +
39 = Glamour +
40 = Drawing +
44 = Pop +
45 = Toy Camera Effect 1 +
46 = Toy Camera Effect 2 +
47 = Cross Process (red) +
48 = Cross Process (blue) +
49 = Cross Process (green) +
50 = Cross Process (yellow) +
51 = Super Vivid +
52 = High-contrast Monochrome +
53 = High Key +
54 = Low Key
+
0x00a0SerialNumberstring 
0x00a2ImageDataSizeint32u 
0x00a5ImageCountint32u 
0x00a6DeletedImageCountint32u 
0x00a7ShutterCountint32u!(includes both mechanical and electronic shutter activations for models with +this feature. This value is used as a key to decrypt other information, and +writing this tag causes the other information to be re-encrypted with the +new key)
0x00a8FlashInfo0100 +
FlashInfo0102 +
FlashInfo0103 +
FlashInfo0106 +
FlashInfo0107 +
FlashInfo0300 +
FlashInfoUnknown
-
-
-
-
-
-
-
--> Nikon FlashInfo0100 Tags +
--> Nikon FlashInfo0102 Tags +
--> Nikon FlashInfo0103 Tags +
--> Nikon FlashInfo0106 Tags +
--> Nikon FlashInfo0107 Tags +
--> Nikon FlashInfo0300 Tags +
--> Nikon FlashInfoUnknown Tags
0x00a9ImageOptimizationstring 
0x00aaSaturationstring 
0x00abVariProgramstring 
0x00acImageStabilizationstring 
0x00adAFResponsestring 
0x00b0MultiExposure---> Nikon MultiExposure Tags +
--> Nikon MultiExposure Tags
0x00b1HighISONoiseReductionint16u + +
0 = Off +
1 = Minimal +
2 = Low +
3 = Medium Low
  4 = Normal +
5 = Medium High +
6 = High
+
0x00b3ToningEffectstring 
0x00b6PowerUpTimeundef(date/time when camera was last powered up)
0x00b7AFInfo2---> Nikon AFInfo2V0400 Tags +
--> Nikon AFInfo2 Tags
0x00b8FileInfo---> Nikon FileInfo Tags +
--> Nikon FileInfo Tags
0x00b9AFTune---> Nikon AFTune Tags
0x00bbRetouchInfo---> Nikon RetouchInfo Tags
0x00bdPictureControlDataundef!^--> Nikon PictureControl Tags
0x00bfSilentPhotographyyes0 = Off +
1 = On
0x00c3BarometerInfo---> Nikon BarometerInfo Tags
0x0e00PrintIM---> PrintIM Tags
0x0e01NikonCaptureDataundef!^--> NikonCapture Tags +
(this data is dropped when copying Nikon MakerNotes since it may be too large +to fit in the EXIF segment of a JPEG image, but it may be copied as a block +into existing Nikon MakerNotes later if desired)
0x0e09NikonCaptureVersionstring^ 
0x0e0eNikonCaptureOffsetsundef^--> Nikon CaptureOffsets Tags
0x0e10NikonScanIFD---> Nikon Scan Tags
0x0e13NikonCaptureEditVersions +
NikonCaptureEditVersions
undef^
undef!^
(the ExtractEmbedded option may be used to decode settings from the stored +edit versions, otherwise this is extracted as a binary data block) +
--> NikonCapture Tags
0x0e1dNikonICCProfileundef!--> ICC_Profile Tags
0x0e1eNikonCaptureOutputundef!^--> Nikon CaptureOutput Tags
0x0e22NEFBitDepthint16u[4]!'0 0 0 0' = n/a (JPEG) +
'8 8 8 0' = 8 x 3 +
'12 0 0 0' = 12 +
'14 0 0 0' = 14 +
'16 16 16 0' = 16 x 3
+ +

Nikon NEFCompression Values

+
+
+ + + + + + + + + + + + + + +
ValueNEFCompressionValueNEFCompression
1= Lossy (type 1)7= Unpacked 12 bits
2= Uncompressed8= Small
3= Lossless9= Packed 12 bits
4= Lossy (type 2)10= Packed 14 bits
5= Striped packed 12 bits13= High Efficiency
6= Uncompressed (reduced to 12 bit)14= High Efficiency*
+ +

Nikon ast Tags

+

Tags used by Nikon NX Studio in Nikon NKSC sidecar files and trailers.

+ +

These tags belong to the ExifTool XMP-ast family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Aboutno 
GPSAltitudeno 
GPSAltitudeRefno0 = Above Sea Level +
1 = Below Sea Level
GPSImgDirectionno 
GPSImgDirectionRefno'M' = Magnetic North +
'T' = True North
GPSLatitudeno 
GPSLatitudeRefno0 = North +
1 = South
GPSLongitudeno 
GPSLongitudeRefno2 = East +
3 = West
GPSMapDatumno 
GPSVersionIDno 
IPTC---> IPTC Tags
Versionno 
XMLPackets---> XMP Tags
+ +

Nikon nine Tags

+

These tags belong to the ExifTool XMP-nine family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Aboutno 
Labelno 
NineEdits---> Nikon NineEdits Tags
Ratingno 
Trimno 
Versionno 
+ +

Nikon NineEdits Tags

+

XML-based tags used to store editing information.

+
+
+ + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
FilterParametersBinaryno 
FilterParametersCustomCustomDatano 
FilterParametersExportExportDatano 
+ +

Nikon sdc Tags

+

These tags belong to the ExifTool XMP-sdc family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Aboutno 
AppNameno 
AppVersionno 
Versionno 
+ +

Nikon PreviewIFD Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x00feSubfileTypeno0x0 = Full-resolution image +
0x1 = Reduced-resolution image +
0x2 = Single page of multi-page image +
0x3 = Single page of multi-page reduced-resolution image +
0x4 = Transparency mask +
0x5 = Transparency mask of reduced-resolution image +
0x6 = Transparency mask of multi-page image +
0x7 = Transparency mask of reduced-resolution multi-page image +
0x8 = Depth map +
0x9 = Depth map of reduced-resolution image +
0x10 = Enhanced image data +
0x10001 = Alternate reduced-resolution image +
0x10004 = Semantic Mask +
0xffffffff = invalid +
Bit 0 = Reduced resolution +
Bit 1 = Single page +
Bit 2 = Transparency mask +
Bit 3 = TIFF/IT final page +
Bit 4 = TIFF-FX mixed raster content
0x0103Compressionno--> EXIF Compression Values
0x011aXResolutionno 
0x011bYResolutionno 
0x0128ResolutionUnitno1 = None +
2 = inches +
3 = cm
0x0201PreviewImageStartint32u* 
0x0202PreviewImageLengthint32u* 
0x0213YCbCrPositioningno1 = Centered +
2 = Co-sited
+ +

Nikon ColorBalanceA Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
624WB_RBLevelsint16u[2]!(as shot)
626WB_RBLevelsAutoint16u[2]! 
628WB_RBLevelsDaylightint16u[14]!(red/blue levels for 0,+3,+2,+1,-1,-2,-3)
642WB_RBLevelsIncandescentint16u[14]! 
656WB_RBLevelsFluorescentint16u[6]!(red/blue levels for fluorescent W,N,D)
662WB_RBLevelsCloudyint16u[14]! 
676WB_RBLevelsFlashint16u[14]! 
690WB_RBLevelsShadeint16u[14]!(not valid for E8700)
+ +

Nikon ColorBalanceB Tags

+

Color balance tags used by the P6000.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4ColorBalanceVersionundef[4] 
5096WB_RGGBLevelsint32u[4]! 
5112WB_RGGBLevelsDaylightint32u[4]! 
5128WB_RGGBLevelsCloudyint32u[4]! 
5160WB_RGGBLevelsTungstenint32u[4]! 
5176WB_RGGBLevelsFluorescentWint32u[4]! 
5192WB_RGGBLevelsFlashint32u[4]! 
5224WB_RGGBLevelsCustomint32u[4]!(all zero if preset WB not used)
5240WB_RGGBLevelsAutoint32u[4]! 
+ +

Nikon ColorBalanceC Tags

+

Color balance tags used by the P1000, P7000, P7100 and B700.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4ColorBalanceVersionundef[4] 
32BlackLevelint16u 
56WB_RGGBLevelsint32u[4]! 
76WB_RGGBLevelsDaylightint32u[4]! 
96WB_RGGBLevelsCloudyint32u[4]! 
116WB_RGGBLevelsShadeint32u[4]!(valid only for some models)
136WB_RGGBLevelsTungstenint32u[4]! 
156WB_RGGBLevelsFluorescentWint32u[4]! 
176WB_RGGBLevelsFluorescentNint32u[4]! 
196WB_RGGBLevelsFluorescentDint32u[4]! 
216WB_RGGBLevelsHTMercuryint32u[4]! 
256WB_RGGBLevelsCustomint32u[4]!(all zero if preset WB not used)
276WB_RGGBLevelsAutoint32u[4]! 
+ +

Nikon VRInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0VRInfoVersionno 
4VibrationReductionint8u0 = n/a +
1 = On +
2 = Off
6VRModeint8u(Z Series cameras thru Decemeber 2021) +
0 = Off +
1 = Sport +
3 = Normal +
0 = Normal +
1 = On (1) +
2 = Active +
3 = Sport
+ +

Nikon FaceDetect Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1FaceDetectFrameSizeint16u[2] 
3FacesDetectedint16u 
4Face1Positionint16u[4](top, left, width and height of face detect area in coordinates of +FaceDetectFrameSize)
8Face2Positionint16u[4] 
12Face3Positionint16u[4] 
16Face4Positionint16u[4] 
20Face5Positionint16u[4] 
24Face6Positionint16u[4] 
28Face7Positionint16u[4] 
32Face8Positionint16u[4] 
36Face9Positionint16u[4] 
40Face10Positionint16u[4] 
44Face11Positionint16u[4] 
48Face12Positionint16u[4] 
+ +

Nikon PictureControl Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0PictureControlVersionno 
4PictureControlNamestring[20] 
24PictureControlBasestring[20] 
48PictureControlAdjustint8u0 = Default Settings +
1 = Quick Adjust +
2 = Full Control
49PictureControlQuickAdjustint8u 
50Sharpnessint8u 
51Contrastint8u 
52Brightnessint8u 
53Saturationint8u 
54HueAdjustmentint8u 
55FilterEffectint8u + +
0x80 = Off +
0x81 = Yellow +
0x82 = Orange
  0x83 = Red +
0x84 = Green +
0xff = n/a
+
56ToningEffectint8u + +
0x80 = B&W +
0x81 = Sepia +
0x82 = Cyanotype +
0x83 = Red +
0x84 = Yellow +
0x85 = Green
  0x86 = Blue-green +
0x87 = Blue +
0x88 = Purple-blue +
0x89 = Red-purple +
0xff = n/a
+
57ToningSaturationint8u 
+ +

Nikon PictureControl2 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0PictureControlVersionno 
4PictureControlNamestring[20] 
24PictureControlBasestring[20] 
48PictureControlAdjustint8u0 = Default Settings +
1 = Quick Adjust +
2 = Full Control
49PictureControlQuickAdjustint8u 
51Sharpnessint8u 
53Clarityint8u 
55Contrastint8u 
57Brightnessint8u 
59Saturationint8u 
61Hueint8u 
63FilterEffectint8u + +
0x80 = Off +
0x81 = Yellow +
0x82 = Orange
  0x83 = Red +
0x84 = Green +
0xff = n/a
+
64ToningEffectint8u + +
0x80 = B&W +
0x81 = Sepia +
0x82 = Cyanotype +
0x83 = Red +
0x84 = Yellow +
0x85 = Green
  0x86 = Blue-green +
0x87 = Blue +
0x88 = Purple-blue +
0x89 = Red-purple +
0xff = n/a
+
65ToningSaturationint8u 
+ +

Nikon PictureControl3 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0PictureControlVersionno 
8PictureControlNamestring[20] 
28PictureControlBasestring[20] 
54PictureControlAdjustint8u0 = Default Settings +
1 = Quick Adjust +
2 = Full Control
55PictureControlQuickAdjustint8u 
57Sharpnessint8u 
59MidRangeSharpnessint8u 
61Clarityint8u 
63Contrastint8u 
65Brightnessint8u 
67Saturationint8u 
69Hueint8u 
71FilterEffectint8u + +
0x80 = Off +
0x81 = Yellow +
0x82 = Orange
  0x83 = Red +
0x84 = Green +
0xff = n/a
+
72ToningEffectint8u + +
0x80 = B&W +
0x81 = Sepia +
0x82 = Cyanotype +
0x83 = Red +
0x84 = Yellow +
0x85 = Green
  0x86 = Blue-green +
0x87 = Blue +
0x88 = Purple-blue +
0x89 = Red-purple +
0xff = n/a
+
73ToningSaturationint8u 
+ +

Nikon PictureControlUnknown Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0PictureControlVersionno 
+ +

Nikon WorldTime Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0TimeZoneint16s 
2DaylightSavingsint8u0 = No +
1 = Yes
3DateDisplayFormatint8u0 = Y/M/D +
1 = M/D/Y +
2 = D/M/Y
+ +

Nikon ISOInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ISOint8u(val = 100 * 2**(raw/12-5))
4ISOExpansionint16u + +
0x0 = Off +
0x101 = Hi 0.3 +
0x102 = Hi 0.5 +
0x103 = Hi 0.7 +
0x104 = Hi 1.0 +
0x105 = Hi 1.3 +
0x106 = Hi 1.5 +
0x107 = Hi 1.7 +
0x108 = Hi 2.0 +
0x109 = Hi 2.3 +
0x10a = Hi 2.5 +
0x10b = Hi 2.7 +
0x10c = Hi 3.0
  0x10d = Hi 3.3 +
0x10e = Hi 3.5 +
0x10f = Hi 3.7 +
0x110 = Hi 4.0 +
0x111 = Hi 4.3 +
0x112 = Hi 4.5 +
0x113 = Hi 4.7 +
0x114 = Hi 5.0 +
0x201 = Lo 0.3 +
0x202 = Lo 0.5 +
0x203 = Lo 0.7 +
0x204 = Lo 1.0
+
6ISO2int8u(val = 100 * 2**(raw/12-5))
10ISOExpansion2int16u + +
0x0 = Off +
0x101 = Hi 0.3 +
0x102 = Hi 0.5 +
0x103 = Hi 0.7 +
0x104 = Hi 1.0 +
0x105 = Hi 1.3 +
0x106 = Hi 1.5
  0x107 = Hi 1.7 +
0x108 = Hi 2.0 +
0x201 = Lo 0.3 +
0x202 = Lo 0.5 +
0x203 = Lo 0.7 +
0x204 = Lo 1.0
+
+ +

Nikon DistortInfo Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0DistortionVersion?no 
4AutoDistortionControlint8u0 = Off +
1 = On +
2 = On (underwater)
+ +

Nikon UnknownInfo Tags

+
+
+ + + + + + + + +
Index4Tag NameWritableValues / Notes
0UnknownInfoVersion?no 
+ +

Nikon UnknownInfo2 Tags

+
+
+ + + + + + + + +
Index4Tag NameWritableValues / Notes
0UnknownInfo2Version?no 
+ +

Nikon HDRInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0HDRInfoVersionstring[4] 
4HDRint8u0 = Off +
1 = On +
48 = Auto
5HDRLevelint8u0 = Auto +
1 = 1 EV +
2 = 2 EV +
3 = 3 EV +
255 = n/a
6HDRSmoothingint8u + +
0 = Off +
1 = Normal +
2 = Low
  3 = High +
48 = Auto +
255 = n/a
+
7HDRLevel2int8u0 = Auto +
1 = 1 EV +
2 = 2 EV +
3 = 3 EV +
255 = n/a
+ +

Nikon LocationInfo Tags

+

Tags written by some Nikon GPS-equipped cameras like the AW100.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LocationInfoVersionundef[4] 
4TextEncodingint8u0 = n/a +
1 = UTF8 +
2 = UTF16
5CountryCodeundef[3] 
8POILevelint8u 
9Locationundef[70] 
+ +

Nikon MakerNotes0x51 Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FirmwareVersionno 
10NEFCompressionint16u[0.5]--> Nikon NEFCompression Values
+ +

Nikon AFInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0AFAreaModeint8u +
0 = Single Area +
1 = Dynamic Area +
2 = Dynamic Area (closest subject) +
3 = Group Dynamic +
4 = Single Area (wide) +
5 = Dynamic Area (wide)
+
1AFPointint8u(in some focus modes this value is not meaningful) + +
0 = Center +
1 = Top +
2 = Bottom +
3 = Mid-left +
4 = Mid-right +
5 = Upper-left
  6 = Upper-right +
7 = Lower-left +
8 = Lower-right +
9 = Far Left +
10 = Far Right
+
2AFPointsInFocusint16u + +
0x0 = (none) +
0x7ff = All 11 Points +
Bit 0 = Center +
Bit 1 = Top +
Bit 2 = Bottom +
Bit 3 = Mid-left +
Bit 4 = Mid-right
  Bit 5 = Upper-left +
Bit 6 = Upper-right +
Bit 7 = Lower-left +
Bit 8 = Lower-right +
Bit 9 = Far Left +
Bit 10 = Far Right
+
+ +

Nikon ShotInfoD40 Tags

+

These tags are extracted from encrypted data in D40 and D40X images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
582ShutterCountint32u 
586.1VibrationReductionint8u[val >> 3 & 0x1] +
0 = Off +
1 = On
729CustomSettingsD40---> NikonCustom SettingsD40 Tags
+ +

Nikon ShotInfoD80 Tags

+

These tags are extracted from encrypted data in D80 images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
586ShutterCountint32u 
590.1Rotationint8u[val & 0x7] +
0 = Horizontal +
1 = Rotate 270 CW +
2 = Rotate 90 CW +
3 = Rotate 180
590.2VibrationReductionint8u[val >> 3 & 0x3] +
0 = Off +
3 = On
590.3FlashFiredint8u[val >> 5 & 0x7] +
Bit 1 = Internal +
Bit 2 = External
708NikonImageSizeint8u[val >> 4 & 0xf] +
0 = Large (10.0 M) +
1 = Medium (5.6 M) +
2 = Small (2.5 M)
708.1ImageQualityint8u[val & 0xf] +
0 = NEF (RAW) +
1 = JPEG Fine +
2 = JPEG Normal +
3 = JPEG Basic +
4 = NEF (RAW) + JPEG Fine +
5 = NEF (RAW) + JPEG Normal +
6 = NEF (RAW) + JPEG Basic
+
748CustomSettingsD80---> NikonCustom SettingsD80 Tags
+ +

Nikon ShotInfoD90 Tags

+

These tags are extracted from encrypted data in images from the D90 with +firmware 1.00.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
693ISO2int8u 
725ShutterCountint32u 
884CustomSettingsD90---> NikonCustom SettingsD90 Tags
+ +

Nikon ShotInfoD3a Tags

+

These tags are extracted from encrypted data in images from the D3 with +firmware 1.00 and earlier.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
598ISO2int8u 
630ShutterCountint32u 
723.1NikonImageSizeint8u[val >> 3 & 0x3] +
0 = Large +
1 = Medium +
2 = Small
723.2ImageQualityint8u[val & 0x7] +
0 = NEF (RAW) + JPEG Fine +
1 = NEF (RAW) + JPEG Norm +
2 = NEF (RAW) + JPEG Basic +
3 = NEF (RAW) +
4 = TIF (RGB) +
5 = JPEG Fine +
6 = JPEG Normal +
7 = JPEG Basic
+
769CustomSettingsD3---> NikonCustom SettingsD3 Tags
+ +

Nikon ShotInfoD3b Tags

+

These tags are extracted from encrypted data in images from the D3 with +firmware 1.10, 2.00, 2.01 and 2.02.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
16ImageAreaint8u0 = FX (36.0 x 23.9 mm) +
1 = DX (23.5 x 15.6 mm) +
2 = 5:4 (30.0 x 23.9 mm)
605ISO2int8u 
637ShutterCountint32u(firmware 1.10)
639ShutterCountint32u(firmware 2.00, 2.01 and 2.02)
650PreFlashReturnStrengthint8u(valid in TTL and TTL-BL flash control modes)
732.1NikonImageSizeint8u[val >> 3 & 0x3] +
0 = Large +
1 = Medium +
2 = Small
732.2ImageQualityint8u[val & 0x7] +
0 = NEF (RAW) + JPEG Fine +
1 = NEF (RAW) + JPEG Norm +
2 = NEF (RAW) + JPEG Basic +
3 = NEF (RAW) +
4 = TIF (RGB) +
5 = JPEG Fine +
6 = JPEG Normal +
7 = JPEG Basic
+
778CustomSettingsD3---> NikonCustom SettingsD3 Tags
+ +

Nikon ShotInfoD3X Tags

+

These tags are extracted from encrypted data in images from the D3X with +firmware 1.00.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
605ISO2int8u 
640ShutterCountint32u 
779CustomSettingsD3X---> NikonCustom SettingsD3 Tags
+ +

Nikon ShotInfoD3S Tags

+

These tags are extracted from encrypted data in images from the D3S with +firmware 1.00 and earlier.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
16ImageAreaint8u0 = FX (36x24) +
1 = DX (24x16) +
2 = 5:4 (30x24) +
3 = 1.2x (30x20)
545ISO2int8u 
578ShutterCountint32u 
718CustomSettingsD3S---> NikonCustom SettingsD3 Tags
+ +

Nikon ShotInfoD300a Tags

+

These tags are extracted from encrypted data in images from the D300 with +firmware 1.00 and earlier.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
604ISO2int8u 
633ShutterCountint32u 
721AFFineTuneAdjint16u + + +
0x0 = 0 +
0x3a = +1 +
0x3b = +2 +
0x3c = +4 +
0x3d = +8 +
0x3e = +16 +
0xc2 = -16 +
0xc3 = -8 +
0xc4 = -4 +
0xc5 = -2 +
0xc6 = -1 +
0x103e = +17 +
0x10c2 = -17 +
0x203d = +9
  0x203e = +18 +
0x20c2 = -18 +
0x20c3 = -9 +
0x303e = +19 +
0x30c2 = -19 +
0x403c = +5 +
0x403d = +10 +
0x403e = +20 +
0x40c2 = -20 +
0x40c3 = -10 +
0x40c4 = -5 +
0x603d = +11 +
0x60c3 = -11 +
0x803b = +3
  0x803c = +6 +
0x803d = +12 +
0x80c3 = -12 +
0x80c4 = -6 +
0x80c5 = -3 +
0xa03d = +13 +
0xa0c3 = -13 +
0xc03c = +7 +
0xc03d = +14 +
0xc0c3 = -14 +
0xc0c4 = -7 +
0xe03d = +15 +
0xe0c3 = -15
+
790CustomSettingsD300---> NikonCustom SettingsD3 Tags
+ +

Nikon ShotInfoD300b Tags

+

These tags are extracted from encrypted data in images from the D300 with +firmware 1.10.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
613ISO2int8u 
644ShutterCountint32u 
732AFFineTuneAdjint16u(firmware version 1.10B) + + +
0x0 = 0 +
0x83e = +11 +
0x8c2 = -11 +
0x203c = +3 +
0x203d = +6 +
0x203e = +12 +
0x20c2 = -12 +
0x20c3 = -6 +
0x20c4 = -3 +
0x383e = +13 +
0x38c2 = -13 +
0x503d = +7 +
0x503e = +14 +
0x50c2 = -14
  0x50c3 = -7 +
0x683e = +15 +
0x68c2 = -15 +
0x803a = +1 +
0x803b = +2 +
0x803c = +4 +
0x803d = +8 +
0x803e = +16 +
0x80c2 = -16 +
0x80c3 = -8 +
0x80c4 = -4 +
0x80c5 = -2 +
0x80c6 = -1 +
0x983e = +17
  0x98c2 = -17 +
0xb03d = +9 +
0xb03e = +18 +
0xb0c2 = -18 +
0xb0c3 = -9 +
0xc83e = +19 +
0xc8c2 = -19 +
0xe03c = +5 +
0xe03d = +10 +
0xe03e = +20 +
0xe0c2 = -20 +
0xe0c3 = -10 +
0xe0c4 = -5
+(other versions) + + +
0x0 = 0 +
0x43e = +13 +
0x4c2 = -13 +
0x183d = +7 +
0x183e = +14 +
0x18c2 = -14 +
0x18c3 = -7 +
0x2c3e = +15 +
0x2cc2 = -15 +
0x403a = +1 +
0x403b = +2 +
0x403c = +4 +
0x403d = +8 +
0x403e = +16
  0x40c2 = -16 +
0x40c3 = -8 +
0x40c4 = -4 +
0x40c5 = -2 +
0x40c6 = -1 +
0x543e = +17 +
0x54c2 = -17 +
0x683d = +9 +
0x683e = +18 +
0x68c2 = -18 +
0x68c3 = -9 +
0x7c3e = +19 +
0x7cc2 = -19 +
0x903c = +5
  0x903d = +10 +
0x903e = +20 +
0x90c2 = -20 +
0x90c3 = -10 +
0x90c4 = -5 +
0xb83d = +11 +
0xb8c3 = -11 +
0xe03b = +3 +
0xe03c = +6 +
0xe03d = +12 +
0xe0c3 = -12 +
0xe0c4 = -6 +
0xe0c5 = -3
+
802CustomSettingsD300---> NikonCustom SettingsD3 Tags
+ +

Nikon ShotInfoD300S Tags

+

These tags are extracted from encrypted data in images from the D300S with +firmware 1.00.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
613ISO2int8u 
646ShutterCountint32u 
804CustomSettingsD300S---> NikonCustom SettingsD3 Tags
+ +

Nikon ShotInfoD700 Tags

+

These tags are extracted from encrypted data in images from the D700 with +firmware 1.02f.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
613ISO2int8u 
647ShutterCountint32u 
804CustomSettingsD700---> NikonCustom SettingsD700 Tags
+ +

Nikon ShotInfoD800 Tags

+

These tags are extracted from encrypted data in images from the D800.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
1216RepeatingFlashOutputExternalint8u 
1218RepeatingFlashRateExternalint8u 
1219RepeatingFlashCountExternalint8u 
1234FlashExposureComp2int8s(includes the effect of flash bracketing)
1242RepeatingFlashRateBuilt-inint8u 
1243RepeatingFlashCountBuilt-inint8u 
1308SequenceNumberint8u 
1531ShutterCountint32u 
1772CustomSettingsD800---> NikonCustom SettingsD800 Tags
+ +

Nikon ShotInfoD810 Tags

+

These tags are extracted from encrypted data in images from the D810. Note +that the indices listed below are for firmware version 1.0, but they may be +different for other firmware versions.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
464SecondarySlotFunctionint8u[val & 0x3] +
0 = Overflow +
2 = Backup +
3 = NEF Primary + JPG Secondary
5974AEBracketingStepsint8u[val & 0xff] + +
0x0 = AE Bracketing Disabled +
0x20 = AE Bracketing Disabled +
0x30 = AE Bracketing Disabled +
0x40 = AE Bracketing Disabled +
0x50 = AE Bracketing Disabled +
0x81 = +3F0.3 +
0x82 = -3F0.3 +
0x83 = +2F0.3 +
0x84 = -2F0.3 +
0x85 = 3F0.3 +
0x86 = 5F0.3 +
0x87 = 7F0.3 +
0x88 = 9F0.3 +
0x91 = +3F0.5 +
0x92 = -3F0.5 +
0x93 = +2F0.5 +
0x94 = -2F0.5 +
0x95 = 3F0.5 +
0x96 = 5F0.5 +
0x97 = 7F0.5 +
0x98 = 9F0.5 +
0xa1 = +3F0.7 +
0xa2 = -3F0.7 +
0xa3 = +2F0.7 +
0xa4 = -2F0.7
  0xa5 = 3F0.7 +
0xa6 = 5F0.7 +
0xa7 = 7F0.7 +
0xa8 = 9F0.7 +
0xb1 = +3F1 +
0xb2 = -3F1 +
0xb3 = +2F1 +
0xb4 = -2F1 +
0xb5 = 3F1 +
0xb6 = 5F1 +
0xb7 = 7F1 +
0xb8 = 9F1 +
0xc1 = +3F2 +
0xc2 = -3F2 +
0xc3 = +2F2 +
0xc4 = -2F2 +
0xc5 = 3F2 +
0xc6 = 5F2 +
0xd1 = +3F3 +
0xd2 = -3F3 +
0xd3 = +2F3 +
0xd4 = -2F3 +
0xd5 = 3F3 +
0xd6 = 5F3
+
5975WBBracketingStepsint8u[val & 0xff] + +
0x0 = WB Bracketing Disabled +
0x1 = b3F 1 +
0x2 = A3F 1 +
0x3 = b2F 1 +
0x4 = A2F 1 +
0x5 = 3F 1 +
0x6 = 5F 1 +
0x7 = 7F 1 +
0x8 = 9F 1 +
0x10 = 0F 2 +
0x11 = b3F 2 +
0x12 = A3F 2 +
0x13 = b2F 2 +
0x14 = A2F 2
  0x15 = 3F 2 +
0x16 = 5F 2 +
0x17 = 7F 2 +
0x18 = 9F 2 +
0x20 = 0F 3 +
0x21 = b3F 3 +
0x22 = A3F 3 +
0x23 = b2F 3 +
0x24 = A2F 3 +
0x25 = 3F 3 +
0x26 = 5F 3 +
0x27 = 7F 3 +
0x28 = 9F 3
+
5982NikonMeteringModeint8u[val & 0x3] +
0 = Matrix +
1 = Center +
2 = Spot +
3 = Highlight
6236ISOAutoShutterTimeint8u[val & 0x3f] + +
0 = 1/4000 s +
1 = 1/3200 s +
2 = 1/2500 s +
3 = 1/2000 s +
4 = 1/1600 s +
5 = 1/1250 s +
6 = 1/1000 s +
7 = 1/800 s +
8 = 1/640 s +
9 = 1/500 s +
10 = 1/400 s +
11 = 1/320 s +
12 = 1/250 s +
13 = 1/200 s +
14 = 1/160 s +
15 = 1/125 s +
16 = 1/100 s +
17 = 1/80 s +
18 = 1/60 s
  19 = 1/50 s +
20 = 1/40 s +
21 = 1/30 s +
22 = 1/15 s +
23 = 1/8 s +
24 = 1/4 s +
25 = 1/2 s +
26 = 1 s +
27 = 2 s +
28 = 4 s +
29 = 8 s +
30 = 15 s +
31 = 30 s +
32 = Auto (Slowest) +
33 = Auto (Slower) +
34 = Auto +
35 = Auto (Faster) +
36 = Auto (Fastest)
+
6237ISOAutoHiLimitint8u[val & 0xff] + +
0x24 = ISO 200 +
0x26 = ISO 250 +
0x27 = ISO 280 +
0x28 = ISO 320 +
0x2a = ISO 400 +
0x2c = ISO 500 +
0x2d = ISO 560 +
0x2e = ISO 640 +
0x30 = ISO 800 +
0x32 = ISO 1000 +
0x33 = ISO 1100 +
0x34 = ISO 1250 +
0x36 = ISO 1600 +
0x38 = ISO 2000 +
0x39 = ISO 2200 +
0x3a = ISO 2500 +
0x3c = ISO 3200 +
0x3e = ISO 4000 +
0x3f = ISO 4500 +
0x40 = ISO 5000 +
0x42 = ISO 6400
  0x44 = ISO 8000 +
0x45 = ISO 9000 +
0x46 = ISO 10000 +
0x48 = ISO 12800 +
0x4a = ISO 16000 +
0x4b = ISO 18000 +
0x4c = ISO 20000 +
0x4e = ISO 25600 +
0x50 = ISO 32000 +
0x51 = ISO 36000 +
0x52 = ISO 40000 +
0x54 = ISO 51200 +
0x56 = ISO Hi 0.3 +
0x57 = ISO Hi 0.5 +
0x58 = ISO Hi 0.7 +
0x5a = ISO Hi 1.0 +
0x60 = ISO Hi 2.0 +
0x66 = ISO Hi 3.0 +
0x6c = ISO Hi 4.0 +
0x72 = ISO Hi 5.0
+
6315CustomSettingsD810---> NikonCustom SettingsD810 Tags
14068RollAnglefixed32u(converted to degrees of clockwise camera roll)
14072PitchAnglefixed32u(converted to degrees of upward camera tilt)
14076YawAnglefixed32u(the camera yaw angle when shooting in portrait orientation)
+ +

Nikon ShotInfoD850 Tags

+

These tags are extracted from encrypted data in images from the D850.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
1937PhotoShootingMenuBankImageAreaint8u[val & 0x7] +
0 = FX (36x24) +
1 = DX (24x16) +
2 = 5:4 (30x24) +
3 = 1.2x (30x20) +
4 = 1:1 (24x24)
4029PhotoShootingMenuBankint8u(valid for JPEG images only) +
[val & 0x3] +
0 = A +
1 = B +
2 = C +
3 = D
4031PrimarySlotint8u[val >> 7 & 0x1] +
0 = XQD Card +
1 = SD Card
4152CustomSettingsD850---> NikonCustom SettingsD850 Tags
12027RollAnglefixed32u(converted to degrees of clockwise camera roll)
12031PitchAnglefixed32u(converted to degrees of upward camera tilt)
12035YawAnglefixed32u(the camera yaw angle when shooting in portrait orientation)
+ +

Nikon ShotInfoD5000 Tags

+

These tags are extracted from encrypted data in images from the D5000 with +firmware 1.00.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
693ISO2int8u 
726ShutterCountint32u 
888CustomSettingsD5000---> NikonCustom SettingsD5000 Tags
+ +

Nikon ShotInfoD5100 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
801ShutterCountint32u 
1031CustomSettingsD5100---> NikonCustom SettingsD5100 Tags
+ +

Nikon ShotInfoD5200 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
3032ShutterCountint32u 
3285CustomSettingsD5200---> NikonCustom SettingsD5200 Tags
+ +

Nikon ShotInfoD7000 Tags

+

These tags are extracted from encrypted data in images from the D7000 with +firmware 1.01b.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
800ShutterCountint32u 
1028CustomSettingsD7000---> NikonCustom SettingsD7000 Tags
+ +

Nikon ShotInfoD4 Tags

+

These tags are extracted from encrypted data in images from the D4.

+
+
+ + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
1873CustomSettingsD4---> NikonCustom SettingsD4 Tags
+ +

Nikon ShotInfoD4S Tags

+

These tags are extracted from encrypted data in images from the D4S.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
464SecondarySlotFunctionint8u[val & 0x3] +
0 = Overflow +
2 = Backup +
3 = NEF Primary + JPG Secondary
5964AEBracketingStepsint8u[val & 0xff] + +
0x0 = AE Bracketing Disabled +
0x20 = AE Bracketing Disabled +
0x30 = AE Bracketing Disabled +
0x40 = AE Bracketing Disabled +
0x50 = AE Bracketing Disabled +
0x81 = +3F0.3 +
0x82 = -3F0.3 +
0x83 = +2F0.3 +
0x84 = -2F0.3 +
0x85 = 3F0.3 +
0x86 = 5F0.3 +
0x87 = 7F0.3 +
0x88 = 9F0.3 +
0x91 = +3F0.5 +
0x92 = -3F0.5 +
0x93 = +2F0.5 +
0x94 = -2F0.5 +
0x95 = 3F0.5 +
0x96 = 5F0.5 +
0x97 = 7F0.5 +
0x98 = 9F0.5 +
0xa1 = +3F0.7 +
0xa2 = -3F0.7 +
0xa3 = +2F0.7 +
0xa4 = -2F0.7
  0xa5 = 3F0.7 +
0xa6 = 5F0.7 +
0xa7 = 7F0.7 +
0xa8 = 9F0.7 +
0xb1 = +3F1 +
0xb2 = -3F1 +
0xb3 = +2F1 +
0xb4 = -2F1 +
0xb5 = 3F1 +
0xb6 = 5F1 +
0xb7 = 7F1 +
0xb8 = 9F1 +
0xc1 = +3F2 +
0xc2 = -3F2 +
0xc3 = +2F2 +
0xc4 = -2F2 +
0xc5 = 3F2 +
0xc6 = 5F2 +
0xd1 = +3F3 +
0xd2 = -3F3 +
0xd3 = +2F3 +
0xd4 = -2F3 +
0xd5 = 3F3 +
0xd6 = 5F3
+
5965WBBracketingStepsint8u[val & 0xff] + +
0x0 = WB Bracketing Disabled +
0x1 = b3F 1 +
0x2 = A3F 1 +
0x3 = b2F 1 +
0x4 = A2F 1 +
0x5 = 3F 1 +
0x6 = 5F 1 +
0x7 = 7F 1 +
0x8 = 9F 1 +
0x10 = 0F 2 +
0x11 = b3F 2 +
0x12 = A3F 2 +
0x13 = b2F 2 +
0x14 = A2F 2
  0x15 = 3F 2 +
0x16 = 5F 2 +
0x17 = 7F 2 +
0x18 = 9F 2 +
0x20 = 0F 3 +
0x21 = b3F 3 +
0x22 = A3F 3 +
0x23 = b2F 3 +
0x24 = A2F 3 +
0x25 = 3F 3 +
0x26 = 5F 3 +
0x27 = 7F 3 +
0x28 = 9F 3
+
6221ReleaseModeint8u[val & 0xff] +
0 = Single Frame +
1 = Continuous High Speed +
3 = Continuous Low Speed +
4 = Timer +
32 = Mirror-Up +
64 = Quiet
+
6301CustomSettingsD4S---> NikonCustom SettingsD4 Tags +
(firmware version 1.00)
6338MultiSelectorLiveViewModeint8u[val >> 6 & 0x3] +
0 = Reset +
1 = Zoom +
3 = None
6378ISOAutoShutterTimeint8u[val & 0x3f] + +
0 = 1/4000 s +
1 = 1/3200 s +
2 = 1/2500 s +
3 = 1/2000 s +
4 = 1/1600 s +
5 = 1/1250 s +
6 = 1/1000 s +
7 = 1/800 s +
8 = 1/640 s +
9 = 1/500 s +
10 = 1/400 s +
11 = 1/320 s +
12 = 1/250 s +
13 = 1/200 s +
14 = 1/160 s +
15 = 1/125 s +
16 = 1/100 s +
17 = 1/80 s +
18 = 1/60 s
  19 = 1/50 s +
20 = 1/40 s +
21 = 1/30 s +
22 = 1/15 s +
23 = 1/8 s +
24 = 1/4 s +
25 = 1/2 s +
26 = 1 s +
27 = 2 s +
28 = 4 s +
29 = 8 s +
30 = 15 s +
31 = 30 s +
32 = Auto (Slowest) +
33 = Auto (Slower) +
34 = Auto +
35 = Auto (Faster) +
36 = Auto (Fastest)
+
6379ISOAutoHiLimitint8u[val & 0xff] + +
0x24 = ISO 200 +
0x26 = ISO 250 +
0x27 = ISO 280 +
0x28 = ISO 320 +
0x2a = ISO 400 +
0x2c = ISO 500 +
0x2d = ISO 560 +
0x2e = ISO 640 +
0x30 = ISO 800 +
0x32 = ISO 1000 +
0x33 = ISO 1100 +
0x34 = ISO 1250 +
0x36 = ISO 1600 +
0x38 = ISO 2000 +
0x39 = ISO 2200 +
0x3a = ISO 2500 +
0x3c = ISO 3200 +
0x3e = ISO 4000 +
0x3f = ISO 4500 +
0x40 = ISO 5000 +
0x42 = ISO 6400
  0x44 = ISO 8000 +
0x45 = ISO 9000 +
0x46 = ISO 10000 +
0x48 = ISO 12800 +
0x4a = ISO 16000 +
0x4b = ISO 18000 +
0x4c = ISO 20000 +
0x4e = ISO 25600 +
0x50 = ISO 32000 +
0x51 = ISO 36000 +
0x52 = ISO 40000 +
0x54 = ISO 51200 +
0x56 = ISO Hi 0.3 +
0x57 = ISO Hi 0.5 +
0x58 = ISO Hi 0.7 +
0x5a = ISO Hi 1.0 +
0x60 = ISO Hi 2.0 +
0x66 = ISO Hi 3.0 +
0x6c = ISO Hi 4.0 +
0x72 = ISO Hi 5.0
+
6461CustomSettingsD4S---> NikonCustom SettingsD4 Tags +
(firmware version 1.01)
13579RollAnglefixed32u(converted to degrees of clockwise camera roll)
13583PitchAnglefixed32u(converted to degrees of upward camera tilt)
13587YawAnglefixed32u(the camera yaw angle when shooting in portrait orientation)
13971Rotationint8u[val >> 4 & 0x3] +
0 = Horizontal +
1 = Rotate 270 CW +
2 = Rotate 90 CW +
3 = Rotate 180
+ +

Nikon ShotInfoD500 Tags

+

These tags are extracted from encrypted data in images from the D5 and D500.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
202Rotationint8u[val & 0x3] +
0 = Horizontal +
1 = Rotate 270 CW +
2 = Rotate 90 CW +
3 = Rotate 180
208Intervalint8u~ 
212IntervalFrameint8u~ 
1506FlickerReductionIndicatorint8u[val & 0x1] +
0 = On +
1 = Off
2004JPGCompressionint8u[val & 0x1] +
0 = Size Priority +
1 = Optimal Quality
2171AEBracketingStepsint8u[val & 0xff] + +
0x0 = AE Bracketing Disabled +
0x20 = AE Bracketing Disabled +
0x30 = AE Bracketing Disabled +
0x40 = AE Bracketing Disabled +
0x50 = AE Bracketing Disabled +
0x81 = +3F0.3 +
0x82 = -3F0.3 +
0x83 = +2F0.3 +
0x84 = -2F0.3 +
0x85 = 3F0.3 +
0x86 = 5F0.3 +
0x87 = 7F0.3 +
0x88 = 9F0.3 +
0x91 = +3F0.5 +
0x92 = -3F0.5 +
0x93 = +2F0.5 +
0x94 = -2F0.5 +
0x95 = 3F0.5 +
0x96 = 5F0.5 +
0x97 = 7F0.5 +
0x98 = 9F0.5 +
0xa1 = +3F0.7 +
0xa2 = -3F0.7 +
0xa3 = +2F0.7 +
0xa4 = -2F0.7
  0xa5 = 3F0.7 +
0xa6 = 5F0.7 +
0xa7 = 7F0.7 +
0xa8 = 9F0.7 +
0xb1 = +3F1 +
0xb2 = -3F1 +
0xb3 = +2F1 +
0xb4 = -2F1 +
0xb5 = 3F1 +
0xb6 = 5F1 +
0xb7 = 7F1 +
0xb8 = 9F1 +
0xc1 = +3F2 +
0xc2 = -3F2 +
0xc3 = +2F2 +
0xc4 = -2F2 +
0xc5 = 3F2 +
0xc6 = 5F2 +
0xd1 = +3F3 +
0xd2 = -3F3 +
0xd3 = +2F3 +
0xd4 = -2F3 +
0xd5 = 3F3 +
0xd6 = 5F3
+
2172WBBracketingStepsint8u[val & 0xff] + +
0x0 = WB Bracketing Disabled +
0x1 = b3F 1 +
0x2 = A3F 1 +
0x3 = b2F 1 +
0x4 = A2F 1 +
0x5 = 3F 1 +
0x6 = 5F 1 +
0x7 = 7F 1 +
0x8 = 9F 1 +
0x10 = 0F 2 +
0x11 = b3F 2 +
0x12 = A3F 2 +
0x13 = b2F 2 +
0x14 = A2F 2
  0x15 = 3F 2 +
0x16 = 5F 2 +
0x17 = 7F 2 +
0x18 = 9F 2 +
0x20 = 0F 3 +
0x21 = b3F 3 +
0x22 = A3F 3 +
0x23 = b2F 3 +
0x24 = A2F 3 +
0x25 = 3F 3 +
0x26 = 5F 3 +
0x27 = 7F 3 +
0x28 = 9F 3
+
2179ADLBracketingStepint8u[val >> 4 & 0xf] + +
0 = Off +
1 = Low +
2 = Normal
  3 = High +
4 = Extra High +
8 = Auto
+
2180ADLBracketingTypeint8u[val & 0xf] +
0 = Off +
1 = 2 Shots +
2 = 3 Shots +
3 = 4 Shots +
4 = 5 Shots
3709PhotoShootingMenuBankint8u[val & 0x3] +
0 = A +
1 = B +
2 = C +
3 = D
3711PrimarySlotint8u(D500 only) +
[val >> 7 & 0x1] +
0 = XQD Card +
1 = SD Card
3713ISOAutoShutterTimeint8u[val & 0x3f] + +
0 = 1/4000 s +
1 = 1/3200 s +
2 = 1/2500 s +
3 = 1/2000 s +
4 = 1/1600 s +
5 = 1/1250 s +
6 = 1/1000 s +
7 = 1/800 s +
8 = 1/640 s +
9 = 1/500 s +
10 = 1/400 s +
11 = 1/320 s +
12 = 1/250 s +
13 = 1/200 s +
14 = 1/160 s +
15 = 1/125 s +
16 = 1/100 s +
17 = 1/80 s +
18 = 1/60 s
  19 = 1/50 s +
20 = 1/40 s +
21 = 1/30 s +
22 = 1/15 s +
23 = 1/8 s +
24 = 1/4 s +
25 = 1/2 s +
26 = 1 s +
27 = 2 s +
28 = 4 s +
29 = 8 s +
30 = 15 s +
31 = 30 s +
32 = Auto (Slowest) +
33 = Auto (Slower) +
34 = Auto +
35 = Auto (Faster) +
36 = Auto (Fastest)
+
3714ISOAutoHiLimitint8u[val & 0xff] + +
0x24 = ISO 200 +
0x26 = ISO 250 +
0x27 = ISO 280 +
0x28 = ISO 320 +
0x2a = ISO 400 +
0x2c = ISO 500 +
0x2d = ISO 560 +
0x2e = ISO 640 +
0x30 = ISO 800 +
0x32 = ISO 1000 +
0x33 = ISO 1100 +
0x34 = ISO 1250 +
0x36 = ISO 1600 +
0x38 = ISO 2000 +
0x39 = ISO 2200 +
0x3a = ISO 2500 +
0x3c = ISO 3200 +
0x3e = ISO 4000 +
0x3f = ISO 4500 +
0x40 = ISO 5000 +
0x42 = ISO 6400
  0x44 = ISO 8000 +
0x45 = ISO 9000 +
0x46 = ISO 10000 +
0x48 = ISO 12800 +
0x4a = ISO 16000 +
0x4b = ISO 18000 +
0x4c = ISO 20000 +
0x4e = ISO 25600 +
0x50 = ISO 32000 +
0x51 = ISO 36000 +
0x52 = ISO 40000 +
0x54 = ISO 51200 +
0x56 = ISO Hi 0.3 +
0x57 = ISO Hi 0.5 +
0x58 = ISO Hi 0.7 +
0x5a = ISO Hi 1.0 +
0x60 = ISO Hi 2.0 +
0x66 = ISO Hi 3.0 +
0x6c = ISO Hi 4.0 +
0x72 = ISO Hi 5.0
+
3716FlickerReductionint8u[val >> 5 & 0x1] +
0 = Enable +
1 = Disable
3716.1PhotoShootingMenuBankImageAreaint8u[val & 0x7] +
0 = FX (36x24) +
1 = DX (24x16) +
2 = 5:4 (30x24) +
3 = 1.2x (30x20) +
4 = 1.3x (18x12)
3819CustomSettingsD5 +
CustomSettingsD500
-
-
--> NikonCustom SettingsD5 Tags +
--> NikonCustom SettingsD500 Tags
11300RollAnglefixed32u(converted to degrees of clockwise camera roll)
11304PitchAnglefixed32u(converted to degrees of upward camera tilt)
11308YawAnglefixed32u(the camera yaw angle when shooting in portrait orientation)
11940NikonMeteringModeint8u(D500 only) +
[val & 0x3] +
0 = Matrix +
1 = Center +
2 = Spot +
3 = Highlight
+ +

Nikon ShotInfoD6 Tags

+

These tags are extracted from encrypted data in images from the D6.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
30220IntervalShootingint16u~ 
49690RollAnglefixed32u(converted to degrees of clockwise camera roll)
49694PitchAnglefixed32u(converted to degrees of upward camera tilt)
49698YawAnglefixed32u(the camera yaw angle when shooting in portrait orientation)
50190Intervalsint32u 
50194ShotsPerIntervalint32u 
50198IntervalExposureSmoothingint8u0 = Off +
1 = On
50200IntervalPriorityint8u0 = Off +
1 = On
50234FocusShiftNumberShotsint8u 
50238FocusShiftStepWidthint8u 
50242FocusShiftIntervalint8u~ 
50246FocusShiftExposureLockint8u0 = Off +
1 = On
50336DiffractionCompensationint8u0 = Off +
1 = On
50342FlashControlModeint8u0 = TTL +
1 = Auto External Flash +
2 = GN (distance priority) +
3 = Manual +
4 = Repeating Flash
50348FlashGNDistance?no + + +
0 = 0 +
1 = 0.1 m +
2 = 0.2 m +
3 = 0.3 m +
4 = 0.4 m +
5 = 0.5 m +
6 = 0.6 m +
7 = 0.7 m +
8 = 0.8 m +
9 = 0.9 m +
10 = 1.0 m +
11 = 1.1 m +
12 = 1.3 m
  13 = 1.4 m +
14 = 1.6 m +
15 = 1.8 m +
16 = 2.0 m +
17 = 2.2 m +
18 = 2.5 m +
19 = 2.8 m +
20 = 3.2 m +
21 = 3.6 m +
22 = 4.0 m +
23 = 4.5 m +
24 = 5.0 m +
25 = 5.6 m
  26 = 6.3 m +
27 = 7.1 m +
28 = 8.0 m +
29 = 9.0 m +
30 = 10.0 m +
31 = 11.0 m +
32 = 13.0 m +
33 = 14.0 m +
34 = 16.0 m +
35 = 18.0 m +
36 = 20.0 m +
255 = n/a
+
50352FlashOutput?int8u 
50362FlashRemoteControl?int8u0 = Group +
1 = Quick Wireless +
2 = Remote Repeating
50366FlashMasterControlModeint8u0 = TTL +
1 = Manual +
2 = Auto +
3 = Off
50368FlashMasterCompensation?int8s 
50372FlashMasterOutput?int8u 
50374FlashWirelessOption?int8u0 = Optical AWL +
1 = Off
50524MovieType?int8u0 = MOV +
1 = MP4
+ +

Nikon ShotInfoD610 Tags

+

These tags are extracted from encrypted data in images from the D610.

+
+
+ + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
1999CustomSettingsD610---> NikonCustom SettingsD610 Tags
+ +

Nikon ShotInfoZ7II Tags

+

These tags are extracted from encrypted data in images from the Z7II.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
30220IntervalShootingint16u~ 
32672PortraitImpressionBalanceint8u[2]~ 
52786RollAnglefixed32u(converted to degrees of clockwise camera roll)
52790PitchAnglefixed32u(converted to degrees of upward camera tilt)
52794YawAnglefixed32u(the camera yaw angle when shooting in portrait orientation)
52918MenuSettingsZ7IIOffsetint8u 
52920MenuSettingsZ7II---> Nikon MenuSettingsZ7II Tags
+ +

Nikon MenuSettingsZ7II Tags

+

These tags are used by the Z5, Z6, Z7, Z6II, Z7II, Z50 and Zfc.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
160IntervalDurationHoursint32u 
164IntervalDurationMinutesint32u 
168IntervalDurationSecondsint32u 
176Intervalsint32u 
180ShotsPerIntervalint32u 
184IntervalExposureSmoothingint8u0 = Off +
1 = On
186IntervalPriorityint8u0 = Off +
1 = On
220FocusShiftNumberShotsint8u 
224FocusShiftStepWidthint8u 
228FocusShiftIntervalint8u~ 
232FocusShiftExposureLockint8u0 = Off +
1 = On
322DiffractionCompensationint8u0 = Off +
1 = On
323AutoDistortionControlint8u0 = Off +
1 = On
326NikonMeteringModeint8u0 = Matrix +
1 = Center +
2 = Spot +
3 = Highlight
328FlashControlModeint8u0 = TTL +
1 = Auto External Flash +
2 = GN (distance priority) +
3 = Manual +
4 = Repeating Flash
334FlashGNDistance?no + + +
0 = 0 +
1 = 0.1 m +
2 = 0.2 m +
3 = 0.3 m +
4 = 0.4 m +
5 = 0.5 m +
6 = 0.6 m +
7 = 0.7 m +
8 = 0.8 m +
9 = 0.9 m +
10 = 1.0 m +
11 = 1.1 m +
12 = 1.3 m
  13 = 1.4 m +
14 = 1.6 m +
15 = 1.8 m +
16 = 2.0 m +
17 = 2.2 m +
18 = 2.5 m +
19 = 2.8 m +
20 = 3.2 m +
21 = 3.6 m +
22 = 4.0 m +
23 = 4.5 m +
24 = 5.0 m +
25 = 5.6 m
  26 = 6.3 m +
27 = 7.1 m +
28 = 8.0 m +
29 = 9.0 m +
30 = 10.0 m +
31 = 11.0 m +
32 = 13.0 m +
33 = 14.0 m +
34 = 16.0 m +
35 = 18.0 m +
36 = 20.0 m +
255 = n/a
+
338FlashOutput?int8u 
346FlashWirelessOption?int8u0 = Off +
1 = Optical AWL +
2 = Optical/Radio AWL +
3 = Radio AWL
348FlashRemoteControl?int8u0 = Group +
1 = Quick Wireless +
2 = Remote Repeating
352FlashMasterControlModeint8u0 = TTL +
1 = Manual +
2 = Auto +
3 = Off
354FlashMasterCompensation?int8s 
358FlashMasterOutput?int8u 
502MovieFrameSize?int8u1 = 1920x1080 +
2 = 3840x2160 +
3 = 7680x4320
504MovieFrameRate?int8u + +
0 = 120p +
1 = 100p +
2 = 60p +
3 = 50p
  4 = 30p +
5 = 25p +
6 = 24p
+
506MovieSlowMotion?int8u0 = Off +
1 = On (4x) +
2 = On (5x)
510MovieType?int8u0 = MOV +
1 = MP4
516MovieISOAutoManualMode?int16u + +
0 = ISO 64 +
1 = ISO 80 +
2 = ISO 100 +
3 = ISO 125 +
4 = ISO 160 +
5 = ISO 200 +
6 = ISO 250 +
7 = ISO 320 +
8 = ISO 400 +
9 = ISO 500 +
10 = ISO 640 +
11 = ISO 800 +
12 = ISO 1000 +
13 = ISO 1250 +
14 = ISO 1600 +
15 = ISO 2000
  16 = ISO 2500 +
17 = ISO 3200 +
18 = ISO 4000 +
19 = ISO 5000 +
20 = ISO 6400 +
21 = ISO 8000 +
22 = ISO 10000 +
23 = ISO 12800 +
24 = ISO 16000 +
25 = ISO 20000 +
26 = ISO 25600 +
27 = ISO Hi 0.3 +
28 = ISO Hi 0.7 +
29 = ISO Hi 1.0 +
32 = ISO Hi 2.0
+
568MovieActiveD-Lighting?int8u0 = Off +
2 = Low +
3 = Normal +
4 = High +
5 = Extra High
572MovieHighISONoiseReduction?int8u0 = Off +
1 = Low +
2 = Normal +
3 = High
574MovieVignetteControl?int8u0 = Off +
1 = Low +
2 = Normal +
3 = High
576MovieVignetteControlSameAsPhoto?int8u0 = No +
1 = Yes
577MovieDiffractionCompensation?int8u0 = Off +
1 = On
578MovieAutoDistortionControl?int8u0 = Off +
1 = On
584MovieFocusMode?int8u0 = Manual +
1 = AF-S +
2 = AF-C +
4 = AF-F
590MovieVibrationReduction?int8u0 = Off +
1 = On (Normal) +
2 = On (Sport)
591MovieVibrationReductionSameAsPhoto?int8u0 = No +
1 = Yes
858HDMIOutputN-Log?int8u0 = Off +
1 = On
+ +

Nikon ShotInfoZ9 Tags

+

These tags are extracted from encrypted data in images from the Z9.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IndexTag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
27800IntervalShootingint16u~ 
30788FocusShiftShootingint8u~ 
60139RollAnglefixed32u(converted to degrees of clockwise camera roll)
60143PitchAnglefixed32u(converted to degrees of upward camera tilt)
60147YawAnglefixed32u(the camera yaw angle when shooting in portrait orientation)
60491MenuSettingsZ9---> Nikon MenuSettingsZ9 Tags
+ +

Nikon MenuSettingsZ9 Tags

+

These tags are used by the Z9.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
140MultipleExposureModeint8u0 = Off +
1 = On (Series) +
2 = On
142MultiExposureShotsint8u 
188Intervalsint32u 
192ShotsPerIntervalint32u 
232FocusShiftNumberShotsint8u 
236FocusShiftStepWidthint8u 
240FocusShiftIntervalint8u~ 
244FocusShiftExposureLock?int8u0 = Off +
1 = On
274PhotoShootingMenuBankint8u0 = A +
1 = B +
2 = C +
3 = D
276ExtendedMenuBanksint8u0 = Off +
1 = On
308PhotoShootingMenuBankImageAreaint8u0 = FX +
1 = DX +
4 = 16:9 +
8 = 1:1
322AutoISOint8u0 = Off +
1 = On
324ISOAutoHiLimit?int16u + +
0 = ISO 64 +
1 = ISO 80 +
2 = ISO 100 +
3 = ISO 125 +
4 = ISO 160 +
5 = ISO 200 +
6 = ISO 250 +
7 = ISO 320 +
8 = ISO 400 +
9 = ISO 500 +
10 = ISO 640 +
11 = ISO 800 +
12 = ISO 1000 +
13 = ISO 1250 +
14 = ISO 1600 +
15 = ISO 2000
  16 = ISO 2500 +
17 = ISO 3200 +
18 = ISO 4000 +
19 = ISO 5000 +
20 = ISO 6400 +
21 = ISO 8000 +
22 = ISO 10000 +
23 = ISO 12800 +
24 = ISO 16000 +
25 = ISO 20000 +
26 = ISO 25600 +
27 = ISO Hi 0.3 +
28 = ISO Hi 0.7 +
29 = ISO Hi 1.0 +
32 = ISO Hi 2.0
+
326ISOAutoFlashLimit?int16u + +
0 = ISO 64 +
1 = ISO 80 +
2 = ISO 100 +
3 = ISO 125 +
4 = ISO 160 +
5 = ISO 200 +
6 = ISO 250 +
7 = ISO 320 +
8 = ISO 400 +
9 = ISO 500 +
10 = ISO 640 +
11 = ISO 800 +
12 = ISO 1000 +
13 = ISO 1250 +
14 = ISO 1600 +
15 = ISO 2000
  16 = ISO 2500 +
17 = ISO 3200 +
18 = ISO 4000 +
19 = ISO 5000 +
20 = ISO 6400 +
21 = ISO 8000 +
22 = ISO 10000 +
23 = ISO 12800 +
24 = ISO 16000 +
25 = ISO 20000 +
26 = ISO 25600 +
27 = ISO Hi 0.3 +
28 = ISO Hi 0.7 +
29 = ISO Hi 1.0 +
32 = ISO Hi 2.0
+
334ISOAutoShutterTimeno + +
-15 = Auto +
-12 = 15 s +
-9 = 8 s +
-6 = 4 s +
-3 = 2 s +
0 = 1 s +
1 = 1/1.3 s +
2 = 1/1.6 s +
3 = 1/2 s +
4 = 1/2.5 s +
5 = 1/3 s +
6 = 1/4 s +
7 = 1/5 s +
8 = 1/6 s +
9 = 1/8 s +
10 = 1/10 s +
11 = 1/13 s +
12 = 1/15 s +
13 = 1/20 s +
14 = 1/25 s +
15 = 1/30 s +
16 = 1/40 s +
17 = 1/50 s +
18 = 1/60 s +
19 = 1/80 s
  20 = 1/100 s +
21 = 1/120 s +
22 = 1/160 s +
23 = 1/200 s +
24 = 1/250 s +
25 = 1/320 s +
26 = 1/400 s +
27 = 1/500 s +
28 = 1/640 s +
29 = 1/800 s +
30 = 1/1000 s +
31 = 1/1250 s +
32 = 1/1600 s +
33 = 1/2000 s +
34 = 1/2500 s +
35 = 1/3200 s +
36 = 1/4000 s +
37 = 1/5000 s +
37.5 = 1/6000 s +
38 = 1/6400 s +
39 = 1/8000 s +
40 = 1/10000 s +
40.5 = 1/12000 s +
41 = 1/13000 s +
42 = 1/16000 s
+
416MovieVignetteControl?int8u0 = Off +
1 = Low +
2 = Normal +
3 = High
418DiffractionCompensationint8u0 = Off +
1 = On
420FlickerReductionShootingint8u0 = Off +
1 = On
424FlashControlModeint8u0 = TTL +
1 = Auto External Flash +
2 = GN (distance priority) +
3 = Manual +
4 = Repeating Flash
426FlashMasterCompensation?int8s 
430FlashGNDistance?no + + +
0 = 0 +
1 = 0.1 m +
2 = 0.2 m +
3 = 0.3 m +
4 = 0.4 m +
5 = 0.5 m +
6 = 0.6 m +
7 = 0.7 m +
8 = 0.8 m +
9 = 0.9 m +
10 = 1.0 m +
11 = 1.1 m +
12 = 1.3 m
  13 = 1.4 m +
14 = 1.6 m +
15 = 1.8 m +
16 = 2.0 m +
17 = 2.2 m +
18 = 2.5 m +
19 = 2.8 m +
20 = 3.2 m +
21 = 3.6 m +
22 = 4.0 m +
23 = 4.5 m +
24 = 5.0 m +
25 = 5.6 m
  26 = 6.3 m +
27 = 7.1 m +
28 = 8.0 m +
29 = 9.0 m +
30 = 10.0 m +
31 = 11.0 m +
32 = 13.0 m +
33 = 14.0 m +
34 = 16.0 m +
35 = 18.0 m +
36 = 20.0 m +
255 = n/a
+
434FlashOutput?int8u 
444FlashRemoteControl?int8u0 = Group +
1 = Quick Wireless +
2 = Remote Repeating
456FlashWirelessOption?int8u0 = Off +
1 = Optical AWL +
2 = Optical/Radio AWL +
3 = Radio AWL
528AFAreaModeint8u + +
1 = Single +
2 = Dynamic +
3 = Wide (S) +
4 = Wide (L)
  5 = 3D +
6 = Auto +
12 = Wide (C1) +
13 = Wide (C2)
+
530VRModeint8u0 = Off +
1 = Normal +
2 = Sport
534BracketSetint8u0 = AE/Flash +
1 = AE +
2 = Flash +
3 = White Balance +
4 = Active-D Lighting
536BracketProgramint8u(AE and/or Flash Bracketing) + +
0 = Disabled +
2 = 2F +
3 = 3F +
4 = 4F
  5 = 5F +
7 = 7F +
9 = 9F
+
538BracketIncrementint8u(AE and/or Flash Bracketing) +
0 = 0.3 +
2 = 0.7 +
3 = 1.0 +
4 = 2.0 +
5 = 3.0
556SecondarySlotFunctionint8u0 = Overflow +
1 = Backup +
2 = NEF Primary + JPG Secondary +
3 = JPG Primary + JPG Secondary
572DXCropAlertint8u0 = Off +
1 = On
574SubjectDetectionint8u0 = Off +
1 = Auto +
2 = People +
3 = Animals +
4 = Vehicles
604MovieImageArea?int8u[val & 0x1] +
0 = FX +
1 = DX
614MovieType?int8u +
1 = H.265 8-bit (MP4) +
2 = H.265 8-bit (MOV) +
3 = H.265 10-bit (MOV) +
4 = ProRes 422 HQ 10-bit (MOV) +
5 = ProRes RAW HQ 12-bit (MOV) +
6 = NRAW 12-bit (NEV)
+
616MovieISOAutoHiLimit?int16u + +
0 = ISO 64 +
1 = ISO 80 +
2 = ISO 100 +
3 = ISO 125 +
4 = ISO 160 +
5 = ISO 200 +
6 = ISO 250 +
7 = ISO 320 +
8 = ISO 400 +
9 = ISO 500 +
10 = ISO 640 +
11 = ISO 800 +
12 = ISO 1000 +
13 = ISO 1250 +
14 = ISO 1600 +
15 = ISO 2000
  16 = ISO 2500 +
17 = ISO 3200 +
18 = ISO 4000 +
19 = ISO 5000 +
20 = ISO 6400 +
21 = ISO 8000 +
22 = ISO 10000 +
23 = ISO 12800 +
24 = ISO 16000 +
25 = ISO 20000 +
26 = ISO 25600 +
27 = ISO Hi 0.3 +
28 = ISO Hi 0.7 +
29 = ISO Hi 1.0 +
32 = ISO Hi 2.0
+
618MovieISOAutoControlManualMode?int8u0 = Off +
1 = On
620MovieISOAutoManualMode?int16u + +
0 = ISO 64 +
1 = ISO 80 +
2 = ISO 100 +
3 = ISO 125 +
4 = ISO 160 +
5 = ISO 200 +
6 = ISO 250 +
7 = ISO 320 +
8 = ISO 400 +
9 = ISO 500 +
10 = ISO 640 +
11 = ISO 800 +
12 = ISO 1000 +
13 = ISO 1250 +
14 = ISO 1600 +
15 = ISO 2000
  16 = ISO 2500 +
17 = ISO 3200 +
18 = ISO 4000 +
19 = ISO 5000 +
20 = ISO 6400 +
21 = ISO 8000 +
22 = ISO 10000 +
23 = ISO 12800 +
24 = ISO 16000 +
25 = ISO 20000 +
26 = ISO 25600 +
27 = ISO Hi 0.3 +
28 = ISO Hi 0.7 +
29 = ISO Hi 1.0 +
32 = ISO Hi 2.0
+
696MovieActiveD-Lighting?int8u0 = Off +
2 = Low +
3 = Normal +
4 = High +
5 = Extra High
698MovieHighISONoiseReduction?int8u0 = Off +
1 = Low +
2 = Normal +
3 = High
704MovieFlickerReductionint8u0 = Auto +
1 = 50Hz +
2 = 60Hz
706MovieMeteringMode?int8u0 = Matrix +
1 = Center +
2 = Spot +
3 = Highlight
708MovieFocusMode?int8u0 = Manual +
1 = AF-S +
2 = AF-C +
4 = AF-F
710MovieAFAreaModeint8u1 = Single +
3 = Wide (S) +
4 = Wide (L) +
6 = Auto +
11 = Subject Tracking
712MovieVRMode?int8u0 = Off +
1 = Normal +
2 = Sport
716MovieElectronicVR?int8u0 = Off +
1 = On
718MovieSoundRecording?int8u0 = Off +
1 = On +
2 = On
720MicrophoneSensitivity?int8u 
722MicrophoneAttenuator?int8u0 = Off +
1 = On
724MicrophoneFrequencyResponse?int8u0 = Wide Range +
1 = Vocal Range
726WindNoiseReduction?int8u0 = Off +
1 = On
748MovieToneMap?int8u0 = SDR +
1 = HLG +
2 = N-Log
754MovieFrameSize?int8u1 = 1920x1080 +
2 = 3840x2160 +
3 = 7680x4320
756MovieFrameRate?int8u + +
0 = 120p +
1 = 100p +
2 = 60p +
3 = 50p
  4 = 30p +
5 = 25p +
6 = 24p
+
762MicrophoneJackPower?int8u0 = Off +
1 = On
763MovieDXCropAlert?int8u0 = Off +
1 = On
764MovieSubjectDetection?int8u0 = Off +
1 = Auto +
2 = People +
3 = Animals +
4 = Vehicles
799CustomSettingsZ9---> NikonCustom SettingsZ9 Tags
1426Language?int8u4 = English +
5 = Spanish +
7 = French
1428TimeZoneint8u +
5 = +09:00 (Tokyo) +
6 = +08:00 (Beijing, Honk Kong, Sinapore) +
10 = +05:45 (Kathmandu) +
11 = +05:30 (New Dehli) +
12 = +05:00 (Islamabad) +
13 = +04:30 (Kabul) +
14 = +04:00 (Abu Dhabi) +
15 = +03:30 (Tehran) +
16 = +03:00 (Moscow, Nairobi) +
17 = +02:00 (Athens, Helsinki) +
18 = +01:00 (Madrid, Paris, Berlin) +
19 = +00:00 (London) +
20 = -01:00 (Azores) +
21 = -02:00 (Fernando de Noronha) +
22 = -03:00 (Buenos Aires, Sao Paulo) +
23 = -03:30 (Newfoundland) +
24 = -04:00 (Manaus, Caracas) +
25 = -05:00 (New York, Toronto, Lima) +
26 = -06:00 (Chicago, Mexico City) +
27 = -07:00 (Denver) +
28 = -08:00 (Los Angeles, Vancouver) +
29 = -09:00 (Anchorage) +
30 = -10:00 (Hawaii)
+
1434MonitorBrightness?no 
1456AFFineTune?int8u0 = Off +
1 = On
1552HDMIOutputResolutionint8u0 = Auto +
1 = 4320p +
2 = 2160p +
3 = 1080p +
5 = 720p
1565SetClockFromLocationData?int8u0 = Off +
1 = On
1572AirplaneMode?int8u0 = Off +
1 = On
1573EmptySlotRelease?int8u0 = Disable Release +
1 = Enable Release
1608EnergySavingMode?int8u0 = Off +
1 = On
1632RecordLocationData?int8u0 = Off +
1 = On
1636USBPowerDelivery?int8u0 = Off +
1 = On
1645SensorShield?int8u0 = Stays Open +
1 = Closes
+ +

Nikon ShotInfo Tags

+

This information is encrypted for ShotInfoVersion 02xx, and some tags are +only valid for specific models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ShotInfoVersionno 
4FirmwareVersionno 
16DistortionControlint8u(P6000) +
0 = Off +
1 = On
102VR_0x66?int8u(D2X, D2Xs (unverified)) +
0 = Off +
1 = On (normal) +
2 = On (active)
106ShutterCountint32u(D2X, D2Xs)
110DeletedImageCountint32u(D2X, D2Xs)
117VibrationReductionint8u(D200) +
0 = Off +
1 = On (1) +
2 = On (2) +
3 = On (3)
130VibrationReductionint8u(D2X, D2Xs) +
0 = Off +
1 = On
343ShutterCountundef[2](D50)
430VibrationReductionint8u(D50) +
0x0 = n/a +
0xc = Off +
0xf = On
589ShutterCountint32u(D60)
+ +

Nikon ColorBalance1 Tags

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
0WB_RBGGLevelsint16u[4]! 
+ +

Nikon ColorBalance2 Tags

+

This information is encrypted for most camera models.

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
0WB_RGGBLevelsint16u[4]! 
+ +

Nikon ColorBalance3 Tags

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
0WB_RGBGLevelsint16u[4]! 
+ +

Nikon ColorBalance4 Tags

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
0WB_GRBGLevelsint16u[4]! 
+ +

Nikon ColorBalanceUnknown Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0ColorBalanceVersionundef[4] 
+ +

Nikon LensData00 Tags

+

This structure is used by the D100, and D1X with firmware version 1.1.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensDataVersionno 
6LensIDNumberint8u(see LensID values below)
7LensFStopsint8u 
8MinFocalLengthint8u 
9MaxFocalLengthint8u 
10MaxApertureAtMinFocalint8u 
11MaxApertureAtMaxFocalint8u 
12MCUVersionint8u 
+ +

Nikon LensData01 Tags

+

Nikon encrypts the LensData information below if LensDataVersion is 0201 or +higher, but the decryption algorithm is known so the information can be +extracted.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensDataVersionno 
4ExitPupilPositionint8u 
5AFApertureint8u 
8FocusPositionint8u 
9FocusDistanceint8u(this focus distance is approximate, and not very accurate for some lenses)
10FocalLengthint8u 
11LensIDNumberint8u(see LensID values below)
12LensFStopsint8u 
13MinFocalLengthint8u 
14MaxFocalLengthint8u 
15MaxApertureAtMinFocalint8u 
16MaxApertureAtMaxFocalint8u 
17MCUVersionint8u 
18EffectiveMaxApertureint8u 
+ +

Nikon LensData0204 Tags

+

Nikon encrypts the LensData information below if LensDataVersion is 0201 or +higher, but the decryption algorithm is known so the information can be +extracted.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensDataVersionno 
4ExitPupilPositionint8u 
5AFApertureint8u 
8FocusPositionint8u 
10FocusDistanceint8u(this focus distance is approximate, and not very accurate for some lenses)
11FocalLengthint8u 
12LensIDNumberint8u(see LensID values below)
13LensFStopsint8u 
14MinFocalLengthint8u 
15MaxFocalLengthint8u 
16MaxApertureAtMinFocalint8u 
17MaxApertureAtMaxFocalint8u 
18MCUVersionint8u 
19EffectiveMaxApertureint8u 
+ +

Nikon LensData0400 Tags

+

Tags extracted from the encrypted lens data of the Nikon 1J1/1V1/1J2.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensDataVersionno 
394LensModelstring[64] 
+ +

Nikon LensData0402 Tags

+

Tags extracted from the encrypted lens data of the Nikon 1J3/1S1/1V2.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensDataVersionno 
395LensModelstring[64] 
+ +

Nikon LensData0403 Tags

+

Tags extracted from the encrypted lens data of the Nikon 1J4/1J5.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensDataVersionno 
684LensModelstring[64] 
+ +

Nikon LensData0800 Tags

+

Tags found in the encrypted LensData from cameras such as the Z6 and Z7.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensDataVersionno 
4ExitPupilPositionint8u 
5AFApertureint8u 
11FocusDistanceint8u(this focus distance is approximate, and not very accurate for some lenses)
12FocalLengthint8u 
13LensIDNumberint8u(see LensID values below)
14LensFStopsint8u 
15MinFocalLengthint8u 
16MaxFocalLengthint8u 
17MaxApertureAtMinFocalint8u 
18MaxApertureAtMaxFocalint8u 
19MCUVersionint8u 
20EffectiveMaxApertureint8u 
48LensIDint16u(tags from here onward used for Nikkor Z lenses only) +
1 = Nikkor Z 24-70mm f/4 S +
2 = Nikkor Z 14-30mm f/4 S +
4 = Nikkor Z 35mm f/1.8 S +
8 = Nikkor Z 58mm f/0.95 S Noct +
9 = Nikkor Z 50mm f/1.8 S +
11 = Nikkor Z DX 16-50mm f/3.5-6.3 VR +
12 = Nikkor Z DX 50-250mm f/4.5-6.3 VR +
13 = Nikkor Z 24-70mm f/2.8 S +
14 = Nikkor Z 85mm f/1.8 S +
15 = Nikkor Z 24mm f/1.8 S +
16 = Nikkor Z 70-200mm f/2.8 VR S +
17 = Nikkor Z 20mm f/1.8 S +
18 = Nikkor Z 24-200mm f/4-6.3 VR +
21 = Nikkor Z 50mm f/1.2 S +
22 = Nikkor Z 24-50mm f/4-6.3 +
23 = Nikkor Z 14-24mm f/2.8 S +
24 = Nikkor Z MC 105mm f/2.8 VR S +
27 = Nikkor Z MC 50mm f/2.8 +
28 = Nikkor Z 100-400mm f/4.5-5.6 VR S +
29 = Nikkor Z 28mm f/2.8 +
30 = Nikkor Z 400mm f/2.8 TC VR S +
31 = Nikkor Z 24-120 f/4 +
32 = Nikkor Z 800mm f/6.3 VR S
+
53LensMountType?int8u0 = F-mount Lens +
1 = Z-mount Lens
54MaxApertureint16u 
56FNumberint16u 
60FocalLengthint16u 
76FocusDistanceRangeWidth?int8u 
78FocusDistanceint16u~ 
86LensDriveEnd?int8u 
90LensPositionAbsolute?int32s 
+ +

Nikon LensDataUnknown Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensDataVersionno 
+ +

Nikon FlashInfo0100 Tags

+

These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and +D200.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FlashInfoVersionno 
4FlashSourceint8u0 = None +
1 = External +
2 = Internal
6ExternalFlashFirmwareint8u[2]--> Nikon FlashFirmware Values
8ExternalFlashFlagsint8u0x0 = (none) +
Bit 0 = Fired +
Bit 2 = Bounce Flash +
Bit 4 = Wide Flash Adapter +
Bit 5 = Dome Diffuser
9.1FlashCommanderModeint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
9.2FlashControlModeint8u[val & 0x7f] +
--> Nikon FlashControlMode Values
10FlashOutput +
FlashCompensation
int8u
int8s
 
11FlashFocalLengthint8u 
12RepeatingFlashRateint8u 
13RepeatingFlashCountint8u 
14FlashGNDistanceint8u--> Nikon FlashGNDistance Values
15FlashGroupAControlModeint8u[val & 0xf] +
--> Nikon FlashControlMode Values
16FlashGroupBControlModeint8u[val & 0xf] +
--> Nikon FlashControlMode Values
17FlashGroupAOutput +
FlashGroupACompensation
int8u
int8s
 
18FlashGroupBOutput +
FlashGroupBCompensation
int8u
int8s
 
+ +

Nikon FlashFirmware Values

+
+
+ + + + + + + + + + + + + + + + + + +
ValueFlashFirmwareValueFlashFirmware
'0 0'= n/a'4 2'= 4.02 (SB-400)
'1 1'= 1.01 (SB-800 or Metz 58 AF-1)'4 4'= 4.04 (SB-400)
'1 3'= 1.03 (SB-800)'5 1'= 5.01 (SB-900)
'2 1'= 2.01 (SB-800)'5 2'= 5.02 (SB-900)
'2 4'= 2.04 (SB-600)'6 1'= 6.01 (SB-700)
'2 5'= 2.05 (SB-600)'7 1'= 7.01 (SB-910)
'3 1'= 3.01 (SU-800 Remote Commander)'14 3'= 14.03 (SB-5000)
'4 1'= 4.01 (SB-400)  
+ +

Nikon FlashControlMode Values

+
+
+ + + + + + + + + + + +
ValueFlashControlModeValueFlashControlModeValueFlashControlMode
0= Off3= Auto Aperture6= Manual
1= iTTL-BL4= Automatic7= Repeating Flash
2= iTTL5= GN (distance priority)  
+ +

Nikon FlashGNDistance Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueFlashGNDistanceValueFlashGNDistanceValueFlashGNDistance
0= 013= 1.4 m26= 6.3 m
1= 0.1 m14= 1.6 m27= 7.1 m
2= 0.2 m15= 1.8 m28= 8.0 m
3= 0.3 m16= 2.0 m29= 9.0 m
4= 0.4 m17= 2.2 m30= 10.0 m
5= 0.5 m18= 2.5 m31= 11.0 m
6= 0.6 m19= 2.8 m32= 13.0 m
7= 0.7 m20= 3.2 m33= 14.0 m
8= 0.8 m21= 3.6 m34= 16.0 m
9= 0.9 m22= 4.0 m35= 18.0 m
10= 1.0 m23= 4.5 m36= 20.0 m
11= 1.1 m24= 5.0 m255= n/a
12= 1.3 m25= 5.6 m  
+ +

Nikon FlashInfo0102 Tags

+

These tags are used by the D3 (firmware 1.x), D40, D40X, D60 and D300 +(firmware 1.00).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FlashInfoVersionno 
4FlashSourceint8u0 = None +
1 = External +
2 = Internal
6ExternalFlashFirmwareint8u[2]--> Nikon FlashFirmware Values
8ExternalFlashFlagsint8uBit 0 = Fired +
Bit 2 = Bounce Flash +
Bit 4 = Wide Flash Adapter +
Bit 5 = Dome Diffuser
9.1FlashCommanderModeint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
9.2FlashControlModeint8u[val & 0x7f] +
--> Nikon FlashControlMode Values
10FlashOutput +
FlashCompensation
int8u
int8s
 
12FlashFocalLengthint8u 
13RepeatingFlashRateint8u 
14RepeatingFlashCountint8u 
15FlashGNDistanceint8u--> Nikon FlashGNDistance Values
16.1FlashGroupAControlModeint8u[val & 0xf] +
--> Nikon FlashControlMode Values +
(note: group A tags may apply to the built-in flash settings for some models)
17.1FlashGroupBControlModeint8u[val >> 4 & 0xf] +
--> Nikon FlashControlMode Values +
(note: group B tags may apply to group A settings for some models)
17.2FlashGroupCControlModeint8u[val & 0xf] +
--> Nikon FlashControlMode Values +
(note: group C tags may apply to group B settings for some models)
18FlashGroupAOutput +
FlashGroupACompensation
int8u
int8s
 
19FlashGroupBOutput +
FlashGroupBCompensation
int8u
int8s
 
20FlashGroupCOutput +
FlashGroupCCompensation
int8u
int8s
 
+ +

Nikon FlashInfo0103 Tags

+

These tags are used by the D3 (firmware 2.x), D3X, D3S, D4, D90, D300 +(firmware 1.10), D300S, D600, D700, D800, D3000, D3100, D3200, D5000, D5100, +D5200, D7000.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FlashInfoVersionno 
4FlashSourceint8u0 = None +
1 = External +
2 = Internal
6ExternalFlashFirmwareint8u[2]--> Nikon FlashFirmware Values
8ExternalFlashFlagsint8uBit 0 = Fired +
Bit 2 = Bounce Flash +
Bit 4 = Wide Flash Adapter +
Bit 5 = Dome Diffuser
9.1FlashCommanderModeint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
9.2FlashControlModeint8u[val & 0x7f] +
--> Nikon FlashControlMode Values
10FlashOutput +
FlashCompensation
int8u
int8s
 
12FlashFocalLengthint8u 
13RepeatingFlashRateint8u 
14RepeatingFlashCountint8u 
15FlashGNDistanceint8u--> Nikon FlashGNDistance Values
16FlashColorFilterint8u--> Nikon FlashColorFilter Values
17.1FlashGroupAControlModeint8u[val & 0xf] +
--> Nikon FlashControlMode Values +
(note: group A tags may apply to the built-in flash settings for some models)
18.1FlashGroupBControlModeint8u[val >> 4 & 0xf] +
--> Nikon FlashControlMode Values +
(note: group B tags may apply to group A settings for some models)
18.2FlashGroupCControlModeint8u[val & 0xf] +
--> Nikon FlashControlMode Values +
(note: group C tags may apply to group B settings for some models)
19FlashGroupAOutput +
FlashGroupACompensation
int8u
int8s
 
20FlashGroupBOutput +
FlashGroupBCompensation
int8u
int8s
 
21FlashGroupCOutput +
FlashGroupCCompensation
int8u
int8s
 
27ExternalFlashCompensationint8s 
29FlashExposureComp3int8s(does not include the effect of flash bracketing)
39FlashExposureComp4int8s(includes the effect of flash bracketing. Valid for repeating flash)
+ +

Nikon FlashColorFilter Values

+
+
+ + + + + + + + + + + +
ValueFlashColorFilterValueFlashColorFilterValueFlashColorFilter
0= None9= TN-A1 or SZ-2TN Incandescent66= Blue
1= FL-GL1 or SZ-2FL Fluorescent10= TN-A267= Yellow
2= FL-GL265= Red68= Amber
+ +

Nikon FlashInfo0106 Tags

+

These tags are used by the Df, D610, D3300, D5300, D7100 and Coolpix A.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FlashInfoVersionno 
4FlashSourceint8u0 = None +
1 = External +
2 = Internal
6ExternalFlashFirmwareint8u[2]--> Nikon FlashFirmware Values
8ExternalFlashFlagsint8uBit 0 = Fired +
Bit 2 = Bounce Flash +
Bit 4 = Wide Flash Adapter +
Bit 5 = Dome Diffuser
9.1FlashCommanderModeint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
9.2FlashControlModeint8u[val & 0x7f] +
--> Nikon FlashControlMode Values
12FlashFocalLengthint8u(only valid if flash pattern is "Standard Illumination")
13RepeatingFlashRateint8u 
14RepeatingFlashCountint8u 
15FlashGNDistanceint8u--> Nikon FlashGNDistance Values
16FlashColorFilterint8u--> Nikon FlashColorFilter Values
17.1FlashGroupAControlModeint8u[val & 0xf] +
--> Nikon FlashControlMode Values
18.1FlashGroupBControlModeint8u[val >> 4 & 0xf] +
--> Nikon FlashControlMode Values
18.2FlashGroupCControlModeint8u[val & 0xf] +
--> Nikon FlashControlMode Values
39FlashOutput +
FlashCompensation
int8u
int8s
 
40FlashGroupAOutput +
FlashGroupACompensation
int8u
int8s
 
41FlashGroupBOutput +
FlashGroupBCompensation
int8u
int8s
 
42FlashGroupCOutput +
FlashGroupCCompensation
int8u
int8s
 
+ +

Nikon FlashInfo0107 Tags

+

These tags are used by the D4S, D750, D810, D5500, D7200 (FlashInfoVersion +0107) and the D5, D500, D850 and D3400 (FlashInfoVersion 0108).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FlashInfoVersionno 
4FlashSourceint8u0 = None +
1 = External +
2 = Internal
6ExternalFlashFirmwareint8u[2]--> Nikon FlashFirmware Values
8.1ExternalFlashZoomOverrideint8u(indicates that the user has overridden the flash zoom distance) +
[val >> 7 & 0x1] +
0 = No +
1 = Yes
8.2ExternalFlashStatusint8u[val & 0x1] +
0 = Flash Not Attached +
1 = Flash Attached
9.1ExternalFlashReadyStateint8u[val & 0x7] +
0 = n/a +
1 = Ready +
6 = Not Ready
10FlashCompensationint8s 
12FlashFocalLengthint8u(only valid if flash pattern is "Standard Illumination")
13RepeatingFlashRateint8u 
14RepeatingFlashCountint8u 
15FlashGNDistanceint8u--> Nikon FlashGNDistance Values
17.1FlashGroupAControlModeint8u[val & 0xf] +
--> Nikon FlashControlMode Values +
(note: group A tags may apply to the built-in flash settings for some models)
18.1FlashGroupBControlModeint8u[val >> 4 & 0xf] +
--> Nikon FlashControlMode Values +
(note: group B tags may apply to group A settings for some models)
18.2FlashGroupCControlModeint8u[val & 0xf] +
--> Nikon FlashControlMode Values +
(note: group C tags may apply to group B settings for some models)
40FlashGroupAOutput +
FlashGroupACompensation
int8u
int8s
 
41FlashGroupBOutput +
FlashGroupBCompensation
int8u
int8s
 
42FlashGroupCOutput +
FlashGroupCCompensation
int8u
int8s
 
+ +

Nikon FlashInfo0300 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FlashInfoVersionno 
4FlashSourceint8u0 = None +
1 = External +
2 = Internal
6ExternalFlashFirmwareint8u[2]--> Nikon FlashFirmware Values
10FlashCompensationint8s 
+ +

Nikon FlashInfoUnknown Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0FlashInfoVersionno 
+ +

Nikon MultiExposure Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0MultiExposureVersionno 
1MultiExposureModeint32u0 = Off +
1 = Multiple Exposure +
2 = Image Overlay +
3 = HDR
2MultiExposureShotsint32u 
3MultiExposureAutoGainint32u0 = Off +
1 = On
+ +

Nikon AFInfo2V0400 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0AFInfo2Versionno 
62AFImageWidthint16u 
64AFImageHeightint16u 
67FocusPositionHorizontalint8u~(the focus points form a 29x17 grid, but the X,Y coordinate values run from 1,1 +to 30,19. The horizontal coordinate 11R (5) and the vertical coordinates 6U +(4) and 2D (12) are not used for some reason)
69FocusPositionVerticalint8u~ 
70AFAreaWidthint16u(size of AF area in AFImage pixels)
72AFAreaHeightint16u 
+ +

Nikon AFInfo2 Tags

+

These tags are written by Nikon DSLR's which have the live view feature.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0AFInfo2Versionno 
4ContrastDetectAFint8u(this is Off for the hybrid AF used in Nikon 1 models) +
0 = Off +
1 = On +
2 = On (2)
5AFAreaModeint8u(ContrastDetectAF Off) +
0 = Single Area +
1 = Dynamic Area +
2 = Dynamic Area (closest subject) +
3 = Group Dynamic +
4 = Dynamic Area (9 points) +
5 = Dynamic Area (21 points) +
6 = Dynamic Area (51 points) +
7 = Dynamic Area (51 points, 3D-tracking) +
8 = Auto-area +
9 = Dynamic Area (3D-tracking) +
10 = Single Area (wide) +
11 = Dynamic Area (wide) +
12 = Dynamic Area (wide, 3D-tracking) +
13 = Group Area +
14 = Dynamic Area (25 points) +
15 = Dynamic Area (72 points) +
16 = Group Area (HL) +
17 = Group Area (VL) +
18 = Dynamic Area (49 points) +
128 = Single +
129 = Auto (41 points) +
130 = Subject Tracking (41 points) +
131 = Face Priority (41 points) +
192 = Pinpoint +
193 = Single +
195 = Wide (S) +
196 = Wide (L) +
197 = Auto
+(ContrastDetectAF On) +
0 = Contrast-detect +
1 = Contrast-detect (normal area) +
2 = Contrast-detect (wide area) +
3 = Contrast-detect (face priority) +
4 = Contrast-detect (subject tracking) +
128 = Single +
129 = Auto (41 points) +
130 = Subject Tracking (41 points) +
131 = Face Priority (41 points) +
192 = Pinpoint +
193 = Single +
194 = Dynamic +
195 = Wide (S) +
196 = Wide (L) +
197 = Auto +
198 = Auto (People) +
199 = Auto (Animal) +
200 = Normal-area AF +
201 = Wide-area AF +
202 = Face-priority AF +
203 = Subject-tracking AF +
204 = Dynamic Area (S) +
205 = Dynamic Area (M) +
206 = Dynamic Area (L) +
207 = 3D-tracking
+
6PhaseDetectAFint8u(PrimaryAFPoint and AFPointsUsed below are only valid when this is On) + +
0 = Off +
1 = On (51-point) +
2 = On (11-point) +
3 = On (39-point) +
4 = On (73-point)
  5 = On (5) +
6 = On (105-point) +
7 = On (153-point) +
8 = On (81-point) +
9 = On (105-point)
+
7PrimaryAFPointint8u(models with 51-point AF -- 5 rows (A-E) and 11 columns (1-11): D3, D3S, D3X, +D4, D4S, D300, D300S, D700, D800, D800e and D810) + + + + +
0 = (none) +
1 = C6 (Center) +
2 = B6 +
3 = A5 +
4 = D6 +
5 = E5 +
6 = C7 +
7 = B7 +
8 = A6 +
9 = D7 +
10 = E6
  11 = C5 +
12 = B5 +
13 = A4 +
14 = D5 +
15 = E4 +
16 = C8 +
17 = B8 +
18 = A7 +
19 = D8 +
20 = E7 +
21 = C9
  22 = B9 +
23 = A8 +
24 = D9 +
25 = E8 +
26 = C10 +
27 = B10 +
28 = A9 +
29 = D10 +
30 = E9 +
31 = C11 +
32 = B11
  33 = D11 +
34 = C4 +
35 = B4 +
36 = A3 +
37 = D4 +
38 = E3 +
39 = C3 +
40 = B3 +
41 = A2 +
42 = D3 +
43 = E2
  44 = C2 +
45 = B2 +
46 = A1 +
47 = D2 +
48 = E1 +
49 = C1 +
50 = B1 +
51 = D1
+(models with 11-point AF: D90, D3000, D3100, D5000 and D5100) + +
0 = (none) +
1 = Center +
2 = Top +
3 = Bottom +
4 = Mid-left +
5 = Upper-left
  6 = Lower-left +
7 = Far Left +
8 = Mid-right +
9 = Upper-right +
10 = Lower-right +
11 = Far Right
+(models with 39-point AF: D600 and D7000) + + + + +
0 = (none) +
1 = C6 (Center) +
2 = B6 +
3 = A2 +
4 = D6 +
5 = E2 +
6 = C7 +
7 = B7
  8 = A3 +
9 = D7 +
10 = E3 +
11 = C5 +
12 = B5 +
13 = A1 +
14 = D5 +
15 = E1
  16 = C8 +
17 = B8 +
18 = D8 +
19 = C9 +
20 = B9 +
21 = D9 +
22 = C10 +
23 = B10
  24 = D10 +
25 = C11 +
26 = B11 +
27 = D11 +
28 = C4 +
29 = B4 +
30 = D4 +
31 = C3
  32 = B3 +
33 = D3 +
34 = C2 +
35 = B2 +
36 = D2 +
37 = C1 +
38 = B1 +
39 = D1
+(Nikon 1 models with older 135-point AF and 73-point phase-detect AF) + + + + +
0 = (none) +
1 = E8 (Center) +
2 = D8 +
3 = C8 +
4 = B8 +
5 = A8 +
6 = F8 +
7 = G8 +
8 = H8 +
9 = I8 +
10 = E9 +
11 = D9 +
12 = C9 +
13 = B9 +
14 = A9 +
15 = F9 +
16 = G9 +
17 = H9 +
18 = I9 +
19 = E7 +
20 = D7 +
21 = C7 +
22 = B7 +
23 = A7 +
24 = F7 +
25 = G7 +
26 = H7 +
27 = I7
  28 = E10 +
29 = D10 +
30 = C10 +
31 = B10 +
32 = A10 +
33 = F10 +
34 = G10 +
35 = H10 +
36 = I10 +
37 = E11 +
38 = D11 +
39 = C11 +
40 = B11 +
41 = A11 +
42 = F11 +
43 = G11 +
44 = H11 +
45 = I11 +
46 = E12 +
47 = D12 +
48 = C12 +
49 = B12 +
50 = A12 +
51 = F12 +
52 = G12 +
53 = H12 +
54 = I12 +
55 = E13
  56 = D13 +
57 = C13 +
58 = B13 +
59 = A13 +
60 = F13 +
61 = G13 +
62 = H13 +
63 = I13 +
64 = E14 +
65 = D14 +
66 = C14 +
67 = B14 +
68 = A14 +
69 = F14 +
70 = G14 +
71 = H14 +
72 = I14 +
73 = E15 +
74 = D15 +
75 = C15 +
76 = B15 +
77 = A15 +
78 = F15 +
79 = G15 +
80 = H15 +
81 = I15 +
82 = E6 +
83 = D6
  84 = C6 +
85 = B6 +
86 = A6 +
87 = F6 +
88 = G6 +
89 = H6 +
90 = I6 +
91 = E5 +
92 = D5 +
93 = C5 +
94 = B5 +
95 = A5 +
96 = F5 +
97 = G5 +
98 = H5 +
99 = I5 +
100 = E4 +
101 = D4 +
102 = C4 +
103 = B4 +
104 = A4 +
105 = F4 +
106 = G4 +
107 = H4 +
108 = I4 +
109 = E3 +
110 = D3 +
111 = C3
  112 = B3 +
113 = A3 +
114 = F3 +
115 = G3 +
116 = H3 +
117 = I3 +
118 = E2 +
119 = D2 +
120 = C2 +
121 = B2 +
122 = A2 +
123 = F2 +
124 = G2 +
125 = H2 +
126 = I2 +
127 = E1 +
128 = D1 +
129 = C1 +
130 = B1 +
131 = A1 +
132 = F1 +
133 = G1 +
134 = H1 +
135 = I1
+(Nikon 1 models with newer 135-point AF and 73-point phase-detect AF -- 9 +rows (B-J) and 15 columns (1-15), inside a grid of 11 rows by 15 columns. +The points are numbered sequentially, with F8 at the center) +
0 = (none) +
82 = F8 (Center) +
(Nikon 1 models with 171-point AF and 105-point phase-detect AF -- 9 rows +(B-J) and 19 columns (2-20), inside a grid of 11 rows by 21 columns. The +points are numbered sequentially, with F11 at the center) +
0 = (none) +
115 = F11 (Center) +
(Nikon models with 153-point AF -- 9 rows (A-I) and 17 columns (1-17): D5, +D500 and D850)
+ + + + +
0 = (none) +
1 = E9 (Center) +
2 = D9 +
3 = C9 +
4 = B9 +
5 = A9 +
6 = F9 +
7 = G9 +
8 = H9 +
9 = I9 +
10 = E10 +
11 = D10 +
12 = C10 +
13 = B10 +
14 = A10 +
15 = F10 +
16 = G10 +
17 = H10 +
18 = I10 +
19 = E11 +
20 = D11 +
21 = C11 +
22 = B11 +
23 = A11 +
24 = F11 +
25 = G11 +
26 = H11 +
27 = I11 +
28 = E8 +
29 = D8 +
30 = C8
  31 = B8 +
32 = A8 +
33 = F8 +
34 = G8 +
35 = H8 +
36 = I8 +
37 = E7 +
38 = D7 +
39 = C7 +
40 = B7 +
41 = A7 +
42 = F7 +
43 = G7 +
44 = H7 +
45 = I7 +
46 = E12 +
47 = D12 +
48 = C12 +
49 = B12 +
50 = A12 +
51 = F12 +
52 = G12 +
53 = H12 +
54 = I12 +
55 = E13 +
56 = D13 +
57 = C13 +
58 = B13 +
59 = A13 +
60 = F13 +
61 = G13
  62 = H13 +
63 = I13 +
64 = E14 +
65 = D14 +
66 = C14 +
67 = B14 +
68 = A14 +
69 = F14 +
70 = G14 +
71 = H14 +
72 = I14 +
73 = E15 +
74 = D15 +
75 = C15 +
76 = B15 +
77 = A15 +
78 = F15 +
79 = G15 +
80 = H15 +
81 = I15 +
82 = E16 +
83 = D16 +
84 = C16 +
85 = B16 +
86 = A16 +
87 = F16 +
88 = G16 +
89 = H16 +
90 = I16 +
91 = E17 +
92 = D17
  93 = C17 +
94 = B17 +
95 = A17 +
96 = F17 +
97 = G17 +
98 = H17 +
99 = I17 +
100 = E6 +
101 = D6 +
102 = C6 +
103 = B6 +
104 = A6 +
105 = F6 +
106 = G6 +
107 = H6 +
108 = I6 +
109 = E5 +
110 = D5 +
111 = C5 +
112 = B5 +
113 = A5 +
114 = F5 +
115 = G5 +
116 = H5 +
117 = I5 +
118 = E4 +
119 = D4 +
120 = C4 +
121 = B4 +
122 = A4 +
123 = F4
  124 = G4 +
125 = H4 +
126 = I4 +
127 = E3 +
128 = D3 +
129 = C3 +
130 = B3 +
131 = A3 +
132 = F3 +
133 = G3 +
134 = H3 +
135 = I3 +
136 = E2 +
137 = D2 +
138 = C2 +
139 = B2 +
140 = A2 +
141 = F2 +
142 = G2 +
143 = H2 +
144 = I2 +
145 = E1 +
146 = D1 +
147 = C1 +
148 = B1 +
149 = A1 +
150 = F1 +
151 = G1 +
152 = H1 +
153 = I1
+(Nikon models with 493-point AF -- 17 rows (A-Q) and 29 columns (1-29), I15 +at the center) +
0 = (none) +
246 = I15 (Center) +
(future models?...) +
0 = (none) +
1 = Center
8AFPointsUsed +
AFPointsUsed +
AFPointsUsed +
AFPointsUsed +
AFPointsUsed +
AFPointsUsed +
AFPointsUsed +
AFPointsUsed +
AFPointsUsed
undef[7]
undef[2]
undef[5]
undef[17]
undef[21]
undef[29]
undef[20]
undef[13]
undef[7]
(models with 51-point AF -- 5 rows: A1-9, B1-11, C1-11, D1-11, E1-9. Center +point is C6) +
(models with 11-point AF)
+ +
0x0 = (none) +
0x7ff = All 11 Points +
Bit 0 = Center +
Bit 1 = Top +
Bit 2 = Bottom +
Bit 3 = Mid-left +
Bit 4 = Upper-left
  Bit 5 = Lower-left +
Bit 6 = Far Left +
Bit 7 = Mid-right +
Bit 8 = Upper-right +
Bit 9 = Lower-right +
Bit 10 = Far Right
+(models with 39-point AF -- 5 rows: A1-3, B1-11, C1-11, D1-11, E1-3. Center +point is C6) +
(older models with 135-point AF -- 9 rows (A-I) and 15 columns (1-15). +Center point is E8. The odd-numbered columns, columns 2 and 14, and the +remaining corner points are not used for 41-point AF mode) +
(newer models with 135-point AF -- 9 rows (B-J) and 15 columns (1-15). Center +point is F8) +
(models with 171-point AF -- 9 rows (B-J) and 19 columns (2-20). Center +point is F10) +
(models with 153-point AF -- 9 rows (A-I) and 17 columns (1-17). Center +point is E9) +
(models with 81-selectable point AF -- 9 rows (A-I) and 9 columns (1-9) for +phase detect AF points. Center point is E5)
10AFPointsUsedundef[14](models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15). Center +point is D8)
16AFImageWidthint16u(this and the following tags are valid only for contrast-detect AF)
18AFImageHeightint16u 
20AFAreaXPositionint16u(center of AF area in AFImage coordinates)
22AFAreaYPositionint16u 
24AFAreaWidthint16u(size of AF area in AFImage coordinates)
26AFAreaHeightint16u 
28ContrastDetectAFInFocus +
AFPointsSelected
int8u
undef[20]
0 = No +
1 = Yes
42AFImageWidthint16u 
44AFImageHeightint16u 
46AFAreaXPositionint16u 
47AFFocusPointXPositionint8u~ 
48AFAreaYPosition +
AFPointsInFocus
int16u
undef[20]
(AF points in focus at the time time image was captured)
49AFFocusPointYPositionint8u~ 
50AFAreaWidthint16u 
52AFAreaHeightint16u 
56PrimaryAFPointint8u(Nikon models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15): D6) + + + + +
0 = (none) +
1 = D8 (Center) +
2 = C8 +
3 = B8 +
4 = A8 +
5 = E8 +
6 = F8 +
7 = G8 +
8 = D9 +
9 = C9 +
10 = B9 +
11 = A9 +
12 = E9 +
13 = F9 +
14 = G9 +
15 = D10 +
16 = C10 +
17 = B10 +
18 = A10 +
19 = E10 +
20 = F10 +
21 = G10
  22 = D7 +
23 = C7 +
24 = B7 +
25 = A7 +
26 = E7 +
27 = F7 +
28 = G7 +
29 = D6 +
30 = C6 +
31 = B6 +
32 = A6 +
33 = E6 +
34 = F6 +
35 = G6 +
36 = D11 +
37 = C11 +
38 = B11 +
39 = A11 +
40 = E11 +
41 = F11 +
42 = G11 +
43 = D12
  44 = C12 +
45 = B12 +
46 = A12 +
47 = E12 +
48 = F12 +
49 = G12 +
50 = D13 +
51 = C13 +
52 = B13 +
53 = A13 +
54 = E13 +
55 = F13 +
56 = G13 +
57 = D14 +
58 = C14 +
59 = B14 +
60 = A14 +
61 = E14 +
62 = F14 +
63 = G14 +
64 = D15 +
65 = C15
  66 = B15 +
67 = A15 +
68 = E15 +
69 = F15 +
70 = G15 +
71 = D5 +
72 = C5 +
73 = B5 +
74 = A5 +
75 = E5 +
76 = F5 +
77 = G5 +
78 = D4 +
79 = C4 +
80 = B4 +
81 = A4 +
82 = E4 +
83 = F4 +
84 = G4 +
85 = D3 +
86 = C3 +
87 = B3
  88 = A3 +
89 = E3 +
90 = F3 +
91 = G3 +
92 = D2 +
93 = C2 +
94 = B2 +
95 = A2 +
96 = E2 +
97 = F2 +
98 = G2 +
99 = D1 +
100 = C1 +
101 = B1 +
102 = A1 +
103 = E1 +
104 = F1 +
105 = G1
+
68PrimaryAFPointint8u + + + + +
0 = (none) +
1 = E9 (Center) +
2 = D9 +
3 = C9 +
4 = B9 +
5 = A9 +
6 = F9 +
7 = G9 +
8 = H9 +
9 = I9 +
10 = E10 +
11 = D10 +
12 = C10 +
13 = B10 +
14 = A10 +
15 = F10 +
16 = G10 +
17 = H10 +
18 = I10 +
19 = E11 +
20 = D11 +
21 = C11 +
22 = B11 +
23 = A11 +
24 = F11 +
25 = G11 +
26 = H11 +
27 = I11 +
28 = E8 +
29 = D8 +
30 = C8
  31 = B8 +
32 = A8 +
33 = F8 +
34 = G8 +
35 = H8 +
36 = I8 +
37 = E7 +
38 = D7 +
39 = C7 +
40 = B7 +
41 = A7 +
42 = F7 +
43 = G7 +
44 = H7 +
45 = I7 +
46 = E12 +
47 = D12 +
48 = C12 +
49 = B12 +
50 = A12 +
51 = F12 +
52 = G12 +
53 = H12 +
54 = I12 +
55 = E13 +
56 = D13 +
57 = C13 +
58 = B13 +
59 = A13 +
60 = F13 +
61 = G13
  62 = H13 +
63 = I13 +
64 = E14 +
65 = D14 +
66 = C14 +
67 = B14 +
68 = A14 +
69 = F14 +
70 = G14 +
71 = H14 +
72 = I14 +
73 = E15 +
74 = D15 +
75 = C15 +
76 = B15 +
77 = A15 +
78 = F15 +
79 = G15 +
80 = H15 +
81 = I15 +
82 = E16 +
83 = D16 +
84 = C16 +
85 = B16 +
86 = A16 +
87 = F16 +
88 = G16 +
89 = H16 +
90 = I16 +
91 = E17 +
92 = D17
  93 = C17 +
94 = B17 +
95 = A17 +
96 = F17 +
97 = G17 +
98 = H17 +
99 = I17 +
100 = E6 +
101 = D6 +
102 = C6 +
103 = B6 +
104 = A6 +
105 = F6 +
106 = G6 +
107 = H6 +
108 = I6 +
109 = E5 +
110 = D5 +
111 = C5 +
112 = B5 +
113 = A5 +
114 = F5 +
115 = G5 +
116 = H5 +
117 = I5 +
118 = E4 +
119 = D4 +
120 = C4 +
121 = B4 +
122 = A4 +
123 = F4
  124 = G4 +
125 = H4 +
126 = I4 +
127 = E3 +
128 = D3 +
129 = C3 +
130 = B3 +
131 = A3 +
132 = F3 +
133 = G3 +
134 = H3 +
135 = I3 +
136 = E2 +
137 = D2 +
138 = C2 +
139 = B2 +
140 = A2 +
141 = F2 +
142 = G2 +
143 = H2 +
144 = I2 +
145 = E1 +
146 = D1 +
147 = C1 +
148 = B1 +
149 = A1 +
150 = F1 +
151 = G1 +
152 = H1 +
153 = I1
+(D3500) + +
0 = (none) +
1 = Center +
2 = Top +
3 = Bottom +
4 = Mid-left +
5 = Upper-left
  6 = Lower-left +
7 = Far Left +
8 = Mid-right +
9 = Upper-right +
10 = Lower-right +
11 = Far Right
+(future models?...) +
0 = (none) +
1 = Center
70AFImageWidthint16u(this and the following tags are valid only for contrast-detect AF)
72AFImageHeightint16u 
74AFAreaXPositionint16u(center of AF area in AFImage coordinates)
76AFAreaYPositionint16u 
78AFAreaWidthint16u(size of AF area in AFImage coordinates)
80AFAreaHeightint16u 
82ContrastDetectAFInFocusint8u0 = No +
1 = Yes
+ +

Nikon FileInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0FileInfoVersionno 
2MemoryCardNumberint16u 
3DirectoryNumberint16u 
4FileNumberint16u 
+ +

Nikon AFTune Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0AFFineTuneint8u0 = Off +
1 = On (1) +
2 = On (2) +
3 = On (Zoom)
1AFFineTuneIndexint8u(index of saved lens)
2AFFineTuneAdjint8s(may only be valid for saved lenses)
3AFFineTuneAdjTeleint8s(only valid for zoom lenses (ie, AFTune=3))
+ +

Nikon RetouchInfo Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0RetouchInfoVersionno 
5RetouchNEFProcessingint8s-1 = Off +
1 = On
+ +

Nikon BarometerInfo Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0BarometerInfoVersionno 
6Altitudeint32s 
+ +

Nikon CaptureOffsets Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001IFD0_Offsetno 
0x0002PreviewIFD_Offsetno 
0x0003SubIFD_Offsetno 
+ +

Nikon Scan Tags

+

This information is written by the Nikon Scan software.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0002FilmTypestring 
0x0040MultiSamplestring 
0x0041BitDepthint16u 
0x0050MasterGainrational64s 
0x0051ColorGainrational64s[3] 
0x0060ScanImageEnhancerint32u0 = Off +
1 = On
0x0100DigitalICEstring 
0x0110ROCInfo---> Nikon ROC Tags
0x0120GEMInfo---> Nikon GEM Tags
0x0200DigitalDEEShadowAdjint32u 
0x0201DigitalDEEThresholdint32u 
0x0202DigitalDEEHighlightAdjint32u 
+ +

Nikon ROC Tags

+
+
+ + + + + + + + +
Index4Tag NameWritableValues / Notes
0DigitalROCint32u 
+ +

Nikon GEM Tags

+
+
+ + + + + + + + +
Index4Tag NameWritableValues / Notes
0DigitalGEMint32u 
+ +

Nikon CaptureOutput Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
2OutputImageWidthint32u 
3OutputImageHeightint32u 
4OutputResolutionint32u 
+ +

Nikon Type2 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0003Qualityyes 
0x0004ColorModeyes 
0x0005ImageAdjustmentyes 
0x0006CCDSensitivityyes 
0x0007WhiteBalanceyes 
0x0008Focusyes 
0x000aDigitalZoomyes 
0x000bConverteryes 
+ +

Nikon NEFInfo Tags

+

As-yet unknown information found in SubIFD1 tag 0xc7d5 of NEF images from +cameras such as the Z6 and Z7, and NRW images from some Coolpix cameras.

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

Nikon NCDT Tags

+

Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from +various Nikon models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'NCDB'NikonNCDB---> Nikon NCDB Tags
'NCHD'MakerNoteVersionno 
'NCM1'PreviewImage1no 
'NCM2'PreviewImage2no 
'NCTG'NikonTags---> Nikon NCTG Tags
'NCTH'ThumbnailImageno 
'NCVW'PreviewImageno 
+ +

Nikon NCDB Tags

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

Nikon NCTG Tags

+

These tags are found in proprietary-format records of the NCTG atom in MOV +videos from some Nikon cameras.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001Makeno 
0x0002Modelno 
0x0003Softwareno 
0x0011CreateDateno 
0x0012DateTimeOriginalno 
0x0013FrameCountno 
0x0016FrameRateno 
0x0019TimeZoneno 
0x0022FrameWidthno 
0x0023FrameHeightno 
0x0032AudioChannelsno 
0x0033AudioBitsPerSampleno 
0x0034AudioSampleRateno 
0x1002NikonDateTimeno 
0x1013ElectronicVRno0 = Off +
1 = On
0x110829aExposureTimeno 
0x110829dFNumberno 
0x1108822ExposureProgramno +
0 = Not Defined +
1 = Manual +
2 = Program AE +
3 = Aperture-priority AE +
4 = Shutter speed priority AE +
5 = Creative (Slow speed) +
6 = Action (High speed) +
7 = Portrait +
8 = Landscape
+
0x1109204ExposureCompensationno 
0x1109207MeteringModeno +
0 = Unknown +
1 = Average +
2 = Center-weighted average +
3 = Spot +
4 = Multi-spot +
5 = Multi-segment +
6 = Partial +
255 = Other
+
0x110920aFocalLengthno 
0x110a431SerialNumberno 
0x110a432LensInfono 
0x110a433LensMakeno 
0x110a434LensModelno 
0x110a435LensSerialNumberno 
0x1200000GPSVersionIDno 
0x1200001GPSLatitudeRefno'N' = North +
'S' = South
0x1200002GPSLatitudeno 
0x1200003GPSLongitudeRefno'E' = East +
'W' = West
0x1200004GPSLongitudeno 
0x1200005GPSAltitudeRefno0 = Above Sea Level +
1 = Below Sea Level
0x1200006GPSAltitudeno 
0x1200007GPSTimeStampno 
0x1200008GPSSatellitesno 
0x1200010GPSImgDirectionRefno'M' = Magnetic North +
'T' = True North
0x1200011GPSImgDirectionno 
0x1200012GPSMapDatumno 
0x120001dGPSDateStampno 
0x2000001MakerNoteVersionno 
0x2000005WhiteBalanceno 
0x2000007FocusModeno 
0x200000bWhiteBalanceFineTuneno 
0x200001bCropHiSpeedno + +
0 = Off +
1 = 1.3x Crop +
2 = DX Crop +
3 = 5:4 Crop +
4 = 3:2 Crop +
6 = 16:9 Crop +
8 = 2.7x Crop +
9 = DX Movie Crop
  10 = 1.3x Movie Crop +
11 = FX Uncropped +
12 = DX Uncropped +
13 = 2.8x Movie Crop +
14 = 1.4x Movie Crop +
15 = 1.5x Movie Crop +
17 = 1:1 Crop
+
0x200001eColorSpaceno1 = sRGB +
2 = Adobe RGB
0x200001fVRInfo---> Nikon VRInfo Tags
0x2000022ActiveD-Lightingno + +
0 = Off +
1 = Low +
3 = Normal +
5 = High +
7 = Extra High
  8 = Extra High 1 +
9 = Extra High 2 +
10 = Extra High 3 +
11 = Extra High 4 +
65535 = Auto
+
0x2000023PictureControlData---> Nikon PictureControl Tags +
--> Nikon PictureControl2 Tags +
--> Nikon PictureControl3 Tags +
--> Nikon PictureControlUnknown Tags
0x2000024WorldTime---> Nikon WorldTime Tags
0x2000025ISOInfo---> Nikon ISOInfo Tags
0x200002aVignetteControlno0 = Off +
1 = Low +
3 = Normal +
5 = High
0x200002cUnknownInfo---> Nikon UnknownInfo Tags
0x2000032UnknownInfo2---> Nikon UnknownInfo2 Tags
0x2000039LocationInfo---> Nikon LocationInfo Tags
0x2000083LensTypenoBit 0 = MF +
Bit 1 = D +
Bit 2 = G +
Bit 3 = VR +
Bit 4 = 1 +
Bit 6 = E
0x2000084Lensno 
0x2000087FlashModeno +
0 = Did Not Fire +
1 = Fired, Manual +
3 = Not Ready +
7 = Fired, External +
8 = Fired, Commander Mode +
9 = Fired, TTL Mode +
18 = LED Light
+
0x2000098LensData0100 +
LensData0101 +
LensData0201 +
LensData0204 +
LensData0400 +
LensData0402 +
LensData0403 +
LensData0800 +
LensDataUnknown
-
-
-
-
-
-
-
-
-
--> Nikon LensData00 Tags +
--> Nikon LensData01 Tags +
--> Nikon LensData01 Tags +
--> Nikon LensData0204 Tags +
--> Nikon LensData0400 Tags +
--> Nikon LensData0402 Tags +
--> Nikon LensData0403 Tags +
--> Nikon LensData0800 Tags +
--> Nikon LensDataUnknown Tags
0x20000a7ShutterCountno 
0x20000a8FlashInfo0100 +
FlashInfo0102 +
FlashInfo0103 +
FlashInfo0106 +
FlashInfo0107 +
FlashInfoUnknown
-
-
-
-
-
-
--> Nikon FlashInfo0100 Tags +
--> Nikon FlashInfo0102 Tags +
--> Nikon FlashInfo0103 Tags +
--> Nikon FlashInfo0106 Tags +
--> Nikon FlashInfo0107 Tags +
--> Nikon FlashInfoUnknown Tags
0x20000abVariProgramno 
0x20000b1HighISONoiseReductionno + +
0 = Off +
1 = Minimal +
2 = Low +
3 = Medium Low
  4 = Normal +
5 = Medium High +
6 = High
+
0x20000b7AFInfo2---> Nikon AFInfo2 Tags
0x20000c3BarometerInfo---> Nikon BarometerInfo Tags
+ +

Nikon MOV Tags

+

This information is found in MOV and QT videos from some Nikon cameras.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
24Modelno 
38ExposureTimeno 
42FNumberno 
50ExposureCompensationno 
68WhiteBalanceno + +
0 = Auto +
1 = Daylight +
2 = Shade
  3 = Fluorescent +
4 = Tungsten +
5 = Manual
+
72FocalLengthno 
175Softwareno 
223ISOno 
+ +

Nikon AVI Tags

+

Nikon-specific RIFF tags found in AVI videos.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'nctg'NikonTags---> Nikon AVITags Tags
'ncth'ThumbnailImageno 
'ncvr'NikonVers---> Nikon AVIVers Tags
'ncvw'PreviewImageno 
+ +

Nikon AVITags Tags

+

These tags and the AVIVer tags below are found in proprietary-format records +of Nikon AVI videos.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0003Makeno 
0x0004Modelno 
0x0005Softwareno 
0x0006Equipmentno 
0x0007Orientationno +
1 = Horizontal (normal) +
2 = Mirror horizontal +
3 = Rotate 180 +
4 = Mirror vertical +
5 = Mirror horizontal and rotate 270 CW +
6 = Rotate 90 CW +
7 = Mirror horizontal and rotate 90 CW +
8 = Rotate 270 CW
+
0x0008ExposureTimeno 
0x0009FNumberno 
0x000aExposureCompensationno 
0x000bMaxApertureValueno 
0x000cMeteringModeno +
0 = Unknown +
1 = Average +
2 = Center-weighted average +
3 = Spot +
4 = Multi-spot +
5 = Multi-segment +
6 = Partial +
255 = Other
+
0x000fFocalLengthno 
0x0010XResolutionno 
0x0011YResolutionno 
0x0012ResolutionUnitno1 = None +
2 = inches +
3 = cm
0x0013DateTimeOriginalno 
0x0014CreateDateno 
0x0016Durationno 
0x0018FocusModeno 
0x001bDigitalZoomno 
0x001dColorModeno 
0x001eSharpnessno 
0x001fWhiteBalanceno 
0x0020NoiseReductionno 
+ +

Nikon AVIVers Tags

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001MakerNoteTypeno 
0x0002MakerNoteVersionno 
+ +

Nikon LensID Values

+

The Nikon LensID is constructed as a Composite tag from the raw hex values +of 8 other tags: LensIDNumber, LensFStops, MinFocalLength, MaxFocalLength, +MaxApertureAtMinFocal, MaxApertureAtMaxFocal, MCUVersion and LensType, in +that order. Multiple lenses with the same LensID are differentiated by +decimal values in the list below. The user-defined "Lenses" list may be +used to specify the lens for ExifTool to choose in these cases (see the +sample config file for details).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueLensID
'00 00 00 00 00 00 00 01'= Manual Lens No CPU
'00 00 00 00 00 00 E1 12'= TC-17E II
'00 00 00 00 00 00 F1 0C'= TC-14E [II] or Sigma APO Tele Converter 1.4x EX DG or Kenko Teleplus PRO 300 DG 1.4x
'00 00 00 00 00 00 F2 18'= TC-20E [II] or Sigma APO Tele Converter 2x EX DG or Kenko Teleplus PRO 300 DG 2.0x
'00 00 48 48 53 53 00 01'= Loreo 40mm F11-22 3D Lens in a Cap 9005
'00 36 1C 2D 34 3C 00 06'= Tamron SP AF 11-18mm f/4.5-5.6 Di II LD Aspherical (IF) (A13)
'00 3C 1F 37 30 30 00 06'= Tokina AT-X 124 AF PRO DX (AF 12-24mm f/4)
'00 3C 2B 44 30 30 00 06'= Tokina AT-X 17-35 F4 PRO FX (AF 17-35mm f/4)
'00 3C 5C 80 30 30 00 0E'= Tokina AT-X 70-200 F4 FX VCM-S (AF 70-200mm f/4)
'00 3E 80 A0 38 3F 00 02'= Tamron SP AF 200-500mm f/5-6.3 Di LD (IF) (A08)
'00 3F 2D 80 2B 40 00 06'= Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) (A14)
'00 3F 2D 80 2C 40 00 06'= Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14)
'00 3F 80 A0 38 3F 00 02'= Tamron SP AF 200-500mm f/5-6.3 Di (A08)
'00 40 11 11 2C 2C 00 00'= Samyang 8mm f/3.5 Fish-Eye
'00 40 18 2B 2C 34 00 06'= Tokina AT-X 107 AF DX Fisheye (AF 10-17mm f/3.5-4.5)
'00 40 2A 72 2C 3C 00 06'= Tokina AT-X 16.5-135 DX (AF 16.5-135mm F3.5-5.6)
'00 40 2B 2B 2C 2C 00 02'= Tokina AT-X 17 AF PRO (AF 17mm f/3.5)
'00 40 2D 2D 2C 2C 00 00'= Carl Zeiss Distagon T* 3.5/18 ZF.2
'00 40 2D 80 2C 40 00 06'= Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)
'00 40 2D 88 2C 40 00 06'= Tamron AF 18-250mm f/3.5-6.3 Di II LD Aspherical (IF) Macro (A18NII)
'00 40 2D 88 2C 40 62 06'= Tamron AF 18-250mm f/3.5-6.3 Di II LD Aspherical (IF) Macro (A18)
'00 40 31 31 2C 2C 00 00'= Voigtlander Color Skopar 20mm F3.5 SLII Aspherical
'00 40 37 80 2C 3C 00 02'= Tokina AT-X 242 AF (AF 24-200mm f/3.5-5.6)
'00 40 64 64 2C 2C 00 00'= Voigtlander APO-Lanthar 90mm F3.5 SLII Close Focus
'00 44 60 98 34 3C 00 02'= Tokina AT-X 840 D (AF 80-400mm f/4.5-5.6)
'00 47 10 10 24 24 00 00'= Fisheye Nikkor 8mm f/2.8 AiS
'00 47 25 25 24 24 00 02'= Tamron SP AF 14mm f/2.8 Aspherical (IF) (69E)
'00 47 3C 3C 24 24 00 00'= Nikkor 28mm f/2.8 AiS
'00 47 44 44 24 24 00 06'= Tokina AT-X M35 PRO DX (AF 35mm f/2.8 Macro)
'00 47 53 80 30 3C 00 06'= Tamron AF 55-200mm f/4-5.6 Di II LD (A15)
'00 48 1C 29 24 24 00 06'= Tokina AT-X 116 PRO DX (AF 11-16mm f/2.8)
'00 48 27 27 24 24 00 00'= Carl Zeiss Distagon T* 2.8/15 ZF.2
'00 48 29 3C 24 24 00 06'= Tokina AT-X 16-28 AF PRO FX (AF 16-28mm f/2.8)
'00 48 29 50 24 24 00 06'= Tokina AT-X 165 PRO DX (AF 16-50mm f/2.8)
'00 48 32 32 24 24 00 00'= Carl Zeiss Distagon T* 2.8/21 ZF.2
'00 48 37 5C 24 24 00 06'= Tokina AT-X 24-70 F2.8 PRO FX (AF 24-70mm f/2.8)
'00 48 3C 3C 24 24 00 00'= Voigtlander Color Skopar 28mm F2.8 SL II
'00 48 3C 60 24 24 00 02'= Tokina AT-X 280 AF PRO (AF 28-80mm f/2.8)
'00 48 3C 6A 24 24 00 02'= Tamron SP AF 28-105mm f/2.8 LD Aspherical IF (176D)
'00 48 50 50 18 18 00 00'= Nikkor H 50mm f/2
'00 48 50 72 24 24 00 06'= Tokina AT-X 535 PRO DX (AF 50-135mm f/2.8)
'00 48 5C 80 30 30 00 0E'= Tokina AT-X 70-200 F4 FX VCM-S (AF 70-200mm f/4)
'00 48 5C 8E 30 3C 00 06'= Tamron AF 70-300mm f/4-5.6 Di LD Macro 1:2 (A17NII)
'00 48 68 68 24 24 00 00'= Series E 100mm f/2.8
'00 48 80 80 30 30 00 00'= Nikkor 200mm f/4 AiS
'00 49 30 48 22 2B 00 02'= Tamron SP AF 20-40mm f/2.7-3.5 (166D)
'00 4C 6A 6A 20 20 00 00'= Nikkor 105mm f/2.5 AiS
'00 4C 7C 7C 2C 2C 00 02'= Tamron SP AF 180mm f/3.5 Di Model (B01)
'00 53 2B 50 24 24 00 06'= Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16)
'00 54 2B 50 24 24 00 06'= Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16NII)
'00 54 38 38 18 18 00 00'= Carl Zeiss Distagon T* 2/25 ZF.2
'00 54 3C 3C 18 18 00 00'= Carl Zeiss Distagon T* 2/28 ZF.2
'00 54 44 44 0C 0C 00 00'= Carl Zeiss Distagon T* 1.4/35 ZF.2
'00 54 44 44 18 18 00 00'= Carl Zeiss Distagon T* 2/35 ZF.2
'00 54 48 48 18 18 00 00'= Voigtlander Ultron 40mm F2 SLII Aspherical
'00 54 50 50 0C 0C 00 00'= Carl Zeiss Planar T* 1.4/50 ZF.2
'00 54 50 50 18 18 00 00'= Carl Zeiss Makro-Planar T* 2/50 ZF.2
'00 54 53 53 0C 0C 00 00'= Zeiss Otus 1.4/55
'00 54 55 55 0C 0C 00 00'= Voigtlander Nokton 58mm F1.4 SLII
'00 54 56 56 30 30 00 00'= Coastal Optical Systems 60mm 1:4 UV-VIS-IR Macro Apo
'00 54 62 62 0C 0C 00 00'= Carl Zeiss Planar T* 1.4/85 ZF.2
'00 54 68 68 18 18 00 00'= Carl Zeiss Makro-Planar T* 2/100 ZF.2
'00 54 68 68 24 24 00 02'= Tokina AT-X M100 AF PRO D (AF 100mm f/2.8 Macro)
'00 54 72 72 18 18 00 00'= Carl Zeiss Apo Sonnar T* 2/135 ZF.2
'00 54 8E 8E 24 24 00 02'= Tokina AT-X 300 AF PRO (AF 300mm f/2.8)
'00 57 50 50 14 14 00 00'= Nikkor 50mm f/1.8 AI
'00 58 64 64 20 20 00 00'= Soligor C/D Macro MC 90mm f/2.5
'01 00 00 00 00 00 02 00'= TC-16A
'01 00 00 00 00 00 08 00'= TC-16A
'01 54 62 62 0C 0C 00 00'= Zeiss Otus 1.4/85
'01 58 50 50 14 14 02 00'= AF Nikkor 50mm f/1.8
'01 58 50 50 14 14 05 00'= AF Nikkor 50mm f/1.8
'02 2F 98 98 3D 3D 02 00'= Sigma APO 400mm F5.6
'02 34 A0 A0 44 44 02 00'= Sigma APO 500mm F7.2
'02 37 5E 8E 35 3D 02 00'= Sigma 75-300mm F4.5-5.6 APO
'02 37 A0 A0 34 34 02 00'= Sigma APO 500mm F4.5
'02 3A 37 50 31 3D 02 00'= Sigma 24-50mm F4-5.6 UC
'02 3A 5E 8E 32 3D 02 00'= Sigma 75-300mm F4.0-5.6
'02 3B 44 61 30 3D 02 00'= Sigma 35-80mm F4-5.6
'02 3B 5C 82 30 3C 02 00'= Sigma Zoom-K 70-210mm F4-5.6
'02 3C B0 B0 3C 3C 02 00'= Sigma APO 800mm F5.6
'02 3F 24 24 2C 2C 02 00'= Sigma 14mm F3.5
'02 3F 3C 5C 2D 35 02 00'= Sigma 28-70mm F3.5-4.5 UC
'02 40 44 5C 2C 34 02 00'= Exakta AF 35-70mm 1:3.5-4.5 MC
'02 40 44 73 2B 36 02 00'= Sigma 35-135mm F3.5-4.5 a
'02 40 5C 82 2C 35 02 00'= Sigma APO 70-210mm F3.5-4.5
'02 42 44 5C 2A 34 02 00'= AF Zoom-Nikkor 35-70mm f/3.3-4.5
'02 42 44 5C 2A 34 08 00'= AF Zoom-Nikkor 35-70mm f/3.3-4.5
'02 46 37 37 25 25 02 00'= Sigma 24mm F2.8 Super Wide II Macro
'02 46 3C 5C 25 25 02 00'= Sigma 28-70mm F2.8
'02 46 5C 82 25 25 02 00'= Sigma 70-210mm F2.8 APO
'02 48 50 50 24 24 02 00'= Sigma Macro 50mm F2.8
'02 48 65 65 24 24 02 00'= Sigma Macro 90mm F2.8
'03 43 5C 81 35 35 02 00'= Soligor AF C/D Zoom UMCS 70-210mm 1:4.5
'03 48 5C 81 30 30 02 00'= AF Zoom-Nikkor 70-210mm f/4
'03 54 68 68 0C 0C 00 00'= Zeiss Otus 1.4/100
'04 48 3C 3C 24 24 03 00'= AF Nikkor 28mm f/2.8
'05 54 50 50 0C 0C 04 00'= AF Nikkor 50mm f/1.4
'06 3F 68 68 2C 2C 06 00'= Cosina AF 100mm F3.5 Macro
'06 54 53 53 24 24 06 00'= AF Micro-Nikkor 55mm f/2.8
'07 36 3D 5F 2C 3C 03 00'= Cosina AF Zoom 28-80mm F3.5-5.6 MC Macro
'07 3E 30 43 2D 35 03 00'= Soligor AF Zoom 19-35mm 1:3.5-4.5 MC
'07 40 2F 44 2C 34 03 02'= Tamron AF 19-35mm f/3.5-4.5 (A10)
'07 40 30 45 2D 35 03 02.1'= Tamron AF 19-35mm f/3.5-4.5 (A10)
'07 40 30 45 2D 35 03 02.2'= Voigtlander Ultragon 19-35mm F3.5-4.5 VMV
'07 40 3C 5C 2C 35 03 00'= Tokina AF 270 II (AF 28-70mm f/3.5-4.5)
'07 40 3C 62 2C 34 03 00'= AF Zoom-Nikkor 28-85mm f/3.5-4.5
'07 46 2B 44 24 30 03 02'= Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical (IF) (A05)
'07 46 3D 6A 25 2F 03 00'= Cosina AF Zoom 28-105mm F2.8-3.8 MC
'07 47 3C 5C 25 35 03 00'= Tokina AF 287 SD (AF 28-70mm f/2.8-4.5)
'07 48 3C 5C 24 24 03 00'= Tokina AT-X 287 AF (AF 28-70mm f/2.8)
'08 40 44 6A 2C 34 04 00'= AF Zoom-Nikkor 35-105mm f/3.5-4.5
'09 48 37 37 24 24 04 00'= AF Nikkor 24mm f/2.8
'0A 48 8E 8E 24 24 03 00'= AF Nikkor 300mm f/2.8 IF-ED
'0A 48 8E 8E 24 24 05 00'= AF Nikkor 300mm f/2.8 IF-ED N
'0B 3E 3D 7F 2F 3D 0E 00'= Tamron AF 28-200mm f/3.8-5.6 (71D)
'0B 3E 3D 7F 2F 3D 0E 02'= Tamron AF 28-200mm f/3.8-5.6D (171D)
'0B 48 7C 7C 24 24 05 00'= AF Nikkor 180mm f/2.8 IF-ED
'0D 40 44 72 2C 34 07 00'= AF Zoom-Nikkor 35-135mm f/3.5-4.5
'0E 48 5C 81 30 30 05 00'= AF Zoom-Nikkor 70-210mm f/4
'0E 4A 31 48 23 2D 0E 02'= Tamron SP AF 20-40mm f/2.7-3.5 (166D)
'0F 58 50 50 14 14 05 00'= AF Nikkor 50mm f/1.8 N
'10 3D 3C 60 2C 3C D2 02'= Tamron AF 28-80mm f/3.5-5.6 Aspherical (177D)
'10 48 8E 8E 30 30 08 00'= AF Nikkor 300mm f/4 IF-ED
'11 48 44 5C 24 24 08 00'= AF Zoom-Nikkor 35-70mm f/2.8
'11 48 44 5C 24 24 15 00'= AF Zoom-Nikkor 35-70mm f/2.8
'12 36 5C 81 35 3D 09 00'= Cosina AF Zoom 70-210mm F4.5-5.6 MC Macro
'12 36 69 97 35 42 09 00'= Soligor AF Zoom 100-400mm 1:4.5-6.7 MC
'12 38 69 97 35 42 09 02'= Promaster Spectrum 7 100-400mm F4.5-6.7
'12 39 5C 8E 34 3D 08 02'= Cosina AF Zoom 70-300mm F4.5-5.6 MC Macro
'12 3B 68 8D 3D 43 09 02'= Cosina AF Zoom 100-300mm F5.6-6.7 MC Macro
'12 3B 98 98 3D 3D 09 00'= Tokina AT-X 400 AF SD (AF 400mm f/5.6)
'12 3D 3C 80 2E 3C DF 02'= Tamron AF 28-200mm f/3.8-5.6 AF Aspherical LD (IF) (271D)
'12 44 5E 8E 34 3C 09 00'= Tokina AF 730 (AF 75-300mm F4.5-5.6)
'12 48 5C 81 30 3C 09 00'= AF Nikkor 70-210mm f/4-5.6
'12 4A 5C 81 31 3D 09 00'= Soligor AF C/D Auto Zoom+Macro 70-210mm 1:4-5.6 UMCS
'13 42 37 50 2A 34 0B 00'= AF Zoom-Nikkor 24-50mm f/3.3-4.5
'14 48 60 80 24 24 0B 00'= AF Zoom-Nikkor 80-200mm f/2.8 ED
'14 48 68 8E 30 30 0B 00'= Tokina AT-X 340 AF (AF 100-300mm f/4)
'14 54 60 80 24 24 0B 00'= Tokina AT-X 828 AF (AF 80-200mm f/2.8)
'15 4C 62 62 14 14 0C 00'= AF Nikkor 85mm f/1.8
'17 3C A0 A0 30 30 0F 00'= Nikkor 500mm f/4 P ED IF
'17 3C A0 A0 30 30 11 00'= Nikkor 500mm f/4 P ED IF
'18 40 44 72 2C 34 0E 00'= AF Zoom-Nikkor 35-135mm f/3.5-4.5 N
'1A 54 44 44 18 18 11 00'= AF Nikkor 35mm f/2
'1B 44 5E 8E 34 3C 10 00'= AF Zoom-Nikkor 75-300mm f/4.5-5.6
'1C 48 30 30 24 24 12 00'= AF Nikkor 20mm f/2.8
'1D 42 44 5C 2A 34 12 00'= AF Zoom-Nikkor 35-70mm f/3.3-4.5 N
'1E 54 56 56 24 24 13 00'= AF Micro-Nikkor 60mm f/2.8
'1E 5D 64 64 20 20 13 00'= Tamron SP AF 90mm f/2.5 (52E)
'1F 54 6A 6A 24 24 14 00'= AF Micro-Nikkor 105mm f/2.8
'20 3C 80 98 3D 3D 1E 02'= Tamron AF 200-400mm f/5.6 LD IF (75D)
'20 48 60 80 24 24 15 00'= AF Zoom-Nikkor 80-200mm f/2.8 ED
'20 5A 64 64 20 20 14 00'= Tamron SP AF 90mm f/2.5 Macro (152E)
'21 40 3C 5C 2C 34 16 00'= AF Zoom-Nikkor 28-70mm f/3.5-4.5
'21 56 8E 8E 24 24 14 00'= Tamron SP AF 300mm f/2.8 LD-IF (60E)
'22 48 72 72 18 18 16 00'= AF DC-Nikkor 135mm f/2
'22 53 64 64 24 24 E0 02'= Tamron SP AF 90mm f/2.8 Macro 1:1 (72E)
'23 30 BE CA 3C 48 17 00'= Zoom-Nikkor 1200-1700mm f/5.6-8 P ED IF
'24 44 60 98 34 3C 1A 02'= Tokina AT-X 840 AF-II (AF 80-400mm f/4.5-5.6)
'24 48 60 80 24 24 1A 02'= AF Zoom-Nikkor 80-200mm f/2.8D ED
'24 54 60 80 24 24 1A 02'= Tokina AT-X 828 AF PRO (AF 80-200mm f/2.8)
'25 44 44 8E 34 42 1B 02'= Tokina AF 353 (AF 35-300mm f/4.5-6.7)
'25 48 3C 5C 24 24 1B 02.1'= Tokina AT-X 270 AF PRO II (AF 28-70mm f/2.6-2.8)
'25 48 3C 5C 24 24 1B 02.2'= Tokina AT-X 287 AF PRO SV (AF 28-70mm f/2.8)
'25 48 44 5C 24 24 1B 02'= AF Zoom-Nikkor 35-70mm f/2.8D
'25 48 44 5C 24 24 3A 02'= AF Zoom-Nikkor 35-70mm f/2.8D
'25 48 44 5C 24 24 52 02'= AF Zoom-Nikkor 35-70mm f/2.8D
'26 3C 54 80 30 3C 1C 06'= Sigma 55-200mm F4-5.6 DC
'26 3C 5C 82 30 3C 1C 02'= Sigma 70-210mm F4-5.6 UC-II
'26 3C 5C 8E 30 3C 1C 02'= Sigma 70-300mm F4-5.6 DG Macro
'26 3C 98 98 3C 3C 1C 02'= Sigma APO Tele Macro 400mm F5.6
'26 3D 3C 80 2F 3D 1C 02'= Sigma 28-300mm F3.8-5.6 Aspherical
'26 3E 3C 6A 2E 3C 1C 02'= Sigma 28-105mm F3.8-5.6 UC-III Aspherical IF
'26 40 27 3F 2C 34 1C 02'= Sigma 15-30mm F3.5-4.5 EX DG Aspherical DF
'26 40 2D 44 2B 34 1C 02'= Sigma 18-35mm F3.5-4.5 Aspherical
'26 40 2D 50 2C 3C 1C 06'= Sigma 18-50mm F3.5-5.6 DC
'26 40 2D 70 2B 3C 1C 06'= Sigma 18-125mm F3.5-5.6 DC
'26 40 2D 80 2C 40 1C 06'= Sigma 18-200mm F3.5-6.3 DC
'26 40 37 5C 2C 3C 1C 02'= Sigma 24-70mm F3.5-5.6 Aspherical HF
'26 40 3C 5C 2C 34 1C 02'= AF Zoom-Nikkor 28-70mm f/3.5-4.5D
'26 40 3C 60 2C 3C 1C 02'= Sigma 28-80mm F3.5-5.6 Mini Zoom Macro II Aspherical
'26 40 3C 65 2C 3C 1C 02'= Sigma 28-90mm F3.5-5.6 Macro
'26 40 3C 80 2B 3C 1C 02'= Sigma 28-200mm F3.5-5.6 Compact Aspherical Hyperzoom Macro
'26 40 3C 80 2C 3C 1C 02'= Sigma 28-200mm F3.5-5.6 Compact Aspherical Hyperzoom Macro
'26 40 3C 8E 2C 40 1C 02'= Sigma 28-300mm F3.5-6.3 Macro
'26 40 7B A0 34 40 1C 02'= Sigma APO 170-500mm F5-6.3 Aspherical RF
'26 41 3C 8E 2C 40 1C 02'= Sigma 28-300mm F3.5-6.3 DG Macro
'26 44 73 98 34 3C 1C 02'= Sigma 135-400mm F4.5-5.6 APO Aspherical
'26 45 68 8E 34 42 1C 02'= Sigma 100-300mm F4.5-6.7 DL
'26 48 11 11 30 30 1C 02'= Sigma 8mm F4 EX Circular Fisheye
'26 48 27 27 24 24 1C 02'= Sigma 15mm F2.8 EX Diagonal Fisheye
'26 48 2D 50 24 24 1C 06'= Sigma 18-50mm F2.8 EX DC
'26 48 31 49 24 24 1C 02'= Sigma 20-40mm F2.8
'26 48 37 56 24 24 1C 02'= Sigma 24-60mm F2.8 EX DG
'26 48 3C 5C 24 24 1C 06'= Sigma 28-70mm F2.8 EX DG
'26 48 3C 5C 24 30 1C 02'= Sigma 28-70mm F2.8-4 DG
'26 48 3C 6A 24 30 1C 02'= Sigma 28-105mm F2.8-4 Aspherical
'26 48 8E 8E 30 30 1C 02'= Sigma APO Tele Macro 300mm F4
'26 54 2B 44 24 30 1C 02'= Sigma 17-35mm F2.8-4 EX Aspherical
'26 54 37 5C 24 24 1C 02'= Sigma 24-70mm F2.8 EX DG Macro
'26 54 37 73 24 34 1C 02'= Sigma 24-135mm F2.8-4.5
'26 54 3C 5C 24 24 1C 02'= Sigma 28-70mm F2.8 EX
'26 58 31 31 14 14 1C 02'= Sigma 20mm F1.8 EX DG Aspherical RF
'26 58 37 37 14 14 1C 02'= Sigma 24mm F1.8 EX DG Aspherical Macro
'26 58 3C 3C 14 14 1C 02'= Sigma 28mm F1.8 EX DG Aspherical Macro
'27 48 8E 8E 24 24 1D 02'= AF-I Nikkor 300mm f/2.8D IF-ED
'27 48 8E 8E 24 24 E1 02'= AF-I Nikkor 300mm f/2.8D IF-ED + TC-17E
'27 48 8E 8E 24 24 F1 02'= AF-I Nikkor 300mm f/2.8D IF-ED + TC-14E
'27 48 8E 8E 24 24 F2 02'= AF-I Nikkor 300mm f/2.8D IF-ED + TC-20E
'27 48 8E 8E 30 30 1D 02'= Tokina AT-X 304 AF (AF 300mm f/4.0)
'27 54 8E 8E 24 24 1D 02'= Tamron SP AF 300mm f/2.8 LD-IF (360E)
'28 3C A6 A6 30 30 1D 02'= AF-I Nikkor 600mm f/4D IF-ED
'28 3C A6 A6 30 30 E1 02'= AF-I Nikkor 600mm f/4D IF-ED + TC-17E
'28 3C A6 A6 30 30 F1 02'= AF-I Nikkor 600mm f/4D IF-ED + TC-14E
'28 3C A6 A6 30 30 F2 02'= AF-I Nikkor 600mm f/4D IF-ED + TC-20E
'2A 54 3C 3C 0C 0C 26 02'= AF Nikkor 28mm f/1.4D
'2B 3C 44 60 30 3C 1F 02'= AF Zoom-Nikkor 35-80mm f/4-5.6D
'2C 48 6A 6A 18 18 27 02'= AF DC-Nikkor 105mm f/2D
'2D 48 80 80 30 30 21 02'= AF Micro-Nikkor 200mm f/4D IF-ED
'2E 48 5C 82 30 3C 22 02'= AF Nikkor 70-210mm f/4-5.6D
'2E 48 5C 82 30 3C 28 02'= AF Nikkor 70-210mm f/4-5.6D
'2F 40 30 44 2C 34 29 02.1'= Tokina AF 235 II (AF 20-35mm f/3.5-4.5)
'2F 40 30 44 2C 34 29 02.2'= Tokina AF 193 (AF 19-35mm f/3.5-4.5)
'2F 48 30 44 24 24 29 02.1'= AF Zoom-Nikkor 20-35mm f/2.8D IF
'2F 48 30 44 24 24 29 02.2'= Tokina AT-X 235 AF PRO (AF 20-35mm f/2.8)
'30 48 98 98 24 24 24 02'= AF-I Nikkor 400mm f/2.8D IF-ED
'30 48 98 98 24 24 E1 02'= AF-I Nikkor 400mm f/2.8D IF-ED + TC-17E
'30 48 98 98 24 24 F1 02'= AF-I Nikkor 400mm f/2.8D IF-ED + TC-14E
'30 48 98 98 24 24 F2 02'= AF-I Nikkor 400mm f/2.8D IF-ED + TC-20E
'31 54 56 56 24 24 25 02'= AF Micro-Nikkor 60mm f/2.8D
'32 53 64 64 24 24 35 02'= Tamron SP AF 90mm f/2.8 [Di] Macro 1:1 (172E/272E)
'32 54 50 50 24 24 35 02'= Sigma Macro 50mm F2.8 EX DG
'32 54 6A 6A 24 24 35 02.1'= AF Micro-Nikkor 105mm f/2.8D
'32 54 6A 6A 24 24 35 02.2'= Sigma Macro 105mm F2.8 EX DG
'33 48 2D 2D 24 24 31 02'= AF Nikkor 18mm f/2.8D
'33 54 3C 5E 24 24 62 02'= Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09)
'34 48 29 29 24 24 32 02'= AF Fisheye Nikkor 16mm f/2.8D
'35 3C A0 A0 30 30 33 02'= AF-I Nikkor 500mm f/4D IF-ED
'35 3C A0 A0 30 30 E1 02'= AF-I Nikkor 500mm f/4D IF-ED + TC-17E
'35 3C A0 A0 30 30 F1 02'= AF-I Nikkor 500mm f/4D IF-ED + TC-14E
'35 3C A0 A0 30 30 F2 02'= AF-I Nikkor 500mm f/4D IF-ED + TC-20E
'36 48 37 37 24 24 34 02'= AF Nikkor 24mm f/2.8D
'37 48 30 30 24 24 36 02'= AF Nikkor 20mm f/2.8D
'38 4C 62 62 14 14 37 02'= AF Nikkor 85mm f/1.8D
'3A 40 3C 5C 2C 34 39 02'= AF Zoom-Nikkor 28-70mm f/3.5-4.5D
'3B 48 44 5C 24 24 3A 02'= AF Zoom-Nikkor 35-70mm f/2.8D N
'3C 48 60 80 24 24 3B 02'= AF Zoom-Nikkor 80-200mm f/2.8D ED
'3D 3C 44 60 30 3C 3E 02'= AF Zoom-Nikkor 35-80mm f/4-5.6D
'3E 48 3C 3C 24 24 3D 02'= AF Nikkor 28mm f/2.8D
'3F 40 44 6A 2C 34 45 02'= AF Zoom-Nikkor 35-105mm f/3.5-4.5D
'41 48 7C 7C 24 24 43 02'= AF Nikkor 180mm f/2.8D IF-ED
'42 54 44 44 18 18 44 02'= AF Nikkor 35mm f/2D
'43 54 50 50 0C 0C 46 02'= AF Nikkor 50mm f/1.4D
'44 44 60 80 34 3C 47 02'= AF Zoom-Nikkor 80-200mm f/4.5-5.6D
'45 3D 3C 60 2C 3C 48 02'= Tamron AF 28-80mm f/3.5-5.6 Aspherical (177D)
'45 40 3C 60 2C 3C 48 02'= AF Zoom-Nikkor 28-80mm f/3.5-5.6D
'45 41 37 72 2C 3C 48 02'= Tamron SP AF 24-135mm f/3.5-5.6 AD Aspherical (IF) Macro (190D)
'46 3C 44 60 30 3C 49 02'= AF Zoom-Nikkor 35-80mm f/4-5.6D N
'47 42 37 50 2A 34 4A 02'= AF Zoom-Nikkor 24-50mm f/3.3-4.5D
'48 38 1F 37 34 3C 4B 06'= Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM
'48 3C 19 31 30 3C 4B 06'= Sigma 10-20mm F4-5.6 EX DC HSM
'48 3C 50 A0 30 40 4B 02'= Sigma 50-500mm F4-6.3 EX APO RF HSM
'48 3C 8E B0 3C 3C 4B 02'= Sigma APO 300-800mm F5.6 EX DG HSM
'48 3C B0 B0 3C 3C 4B 02'= Sigma APO 800mm F5.6 EX HSM
'48 44 A0 A0 34 34 4B 02'= Sigma APO 500mm F4.5 EX HSM
'48 48 24 24 24 24 4B 02'= Sigma 14mm F2.8 EX Aspherical HSM
'48 48 2B 44 24 30 4B 06'= Sigma 17-35mm F2.8-4 EX DG Aspherical HSM
'48 48 68 8E 30 30 4B 02'= Sigma APO 100-300mm F4 EX IF HSM
'48 48 76 76 24 24 4B 06'= Sigma APO Macro 150mm F2.8 EX DG HSM
'48 48 8E 8E 24 24 4B 02'= AF-S Nikkor 300mm f/2.8D IF-ED
'48 48 8E 8E 24 24 E1 02'= AF-S Nikkor 300mm f/2.8D IF-ED + TC-17E
'48 48 8E 8E 24 24 F1 02'= AF-S Nikkor 300mm f/2.8D IF-ED + TC-14E
'48 48 8E 8E 24 24 F2 02'= AF-S Nikkor 300mm f/2.8D IF-ED + TC-20E
'48 4C 7C 7C 2C 2C 4B 02'= Sigma APO Macro 180mm F3.5 EX DG HSM
'48 4C 7D 7D 2C 2C 4B 02'= Sigma APO Macro 180mm F3.5 EX DG HSM
'48 54 3E 3E 0C 0C 4B 06'= Sigma 30mm F1.4 EX DC HSM
'48 54 5C 80 24 24 4B 02'= Sigma 70-200mm F2.8 EX APO IF HSM
'48 54 6F 8E 24 24 4B 02'= Sigma APO 120-300mm F2.8 EX DG HSM
'48 54 8E 8E 24 24 4B 02'= Sigma APO 300mm F2.8 EX DG HSM
'49 3C A6 A6 30 30 4C 02'= AF-S Nikkor 600mm f/4D IF-ED
'49 3C A6 A6 30 30 E1 02'= AF-S Nikkor 600mm f/4D IF-ED + TC-17E
'49 3C A6 A6 30 30 F1 02'= AF-S Nikkor 600mm f/4D IF-ED + TC-14E
'49 3C A6 A6 30 30 F2 02'= AF-S Nikkor 600mm f/4D IF-ED + TC-20E
'4A 40 11 11 2C 0C 4D 02'= Samyang 8mm f/3.5 Fish-Eye CS
'4A 48 1E 1E 24 0C 4D 02'= Samyang 12mm f/2.8 ED AS NCS Fish-Eye
'4A 48 24 24 24 0C 4D 02.1'= Samyang 10mm f/2.8 ED AS NCS CS
'4A 48 24 24 24 0C 4D 02.2'= Samyang AE 14mm f/2.8 ED AS IF UMC
'4A 4C 24 24 1E 6C 4D 06'= Samyang 14mm f/2.4 Premium
'4A 54 29 29 18 0C 4D 02'= Samyang 16mm f/2.0 ED AS UMC CS
'4A 54 62 62 0C 0C 4D 02'= AF Nikkor 85mm f/1.4D IF
'4A 58 30 30 14 0C 4D 02'= Rokinon 20mm f/1.8 ED AS UMC
'4A 60 36 36 0C 0C 4D 02'= Samyang 24mm f/1.4 ED AS UMC
'4A 60 44 44 0C 0C 4D 02'= Samyang 35mm f/1.4 AS UMC
'4A 60 62 62 0C 0C 4D 02'= Samyang AE 85mm f/1.4 AS IF UMC
'4B 3C A0 A0 30 30 4E 02'= AF-S Nikkor 500mm f/4D IF-ED
'4B 3C A0 A0 30 30 E1 02'= AF-S Nikkor 500mm f/4D IF-ED + TC-17E
'4B 3C A0 A0 30 30 F1 02'= AF-S Nikkor 500mm f/4D IF-ED + TC-14E
'4B 3C A0 A0 30 30 F2 02'= AF-S Nikkor 500mm f/4D IF-ED + TC-20E
'4C 40 37 6E 2C 3C 4F 02'= AF Zoom-Nikkor 24-120mm f/3.5-5.6D IF
'4D 3E 3C 80 2E 3C 62 02'= Tamron AF 28-200mm f/3.8-5.6 XR Aspherical (IF) Macro (A03N)
'4D 40 3C 80 2C 3C 62 02'= AF Zoom-Nikkor 28-200mm f/3.5-5.6D IF
'4D 41 3C 8E 2B 40 62 02'= Tamron AF 28-300mm f/3.5-6.3 XR Di LD Aspherical (IF) (A061)
'4D 41 3C 8E 2C 40 62 02'= Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical (IF) (185D)
'4E 48 72 72 18 18 51 02'= AF DC-Nikkor 135mm f/2D
'4F 40 37 5C 2C 3C 53 06'= IX-Nikkor 24-70mm f/3.5-5.6
'50 48 56 7C 30 3C 54 06'= IX-Nikkor 60-180mm f/4-5.6
'52 54 44 44 18 18 00 00'= Zeiss Milvus 35mm f/2
'53 48 60 80 24 24 57 02'= AF Zoom-Nikkor 80-200mm f/2.8D ED
'53 48 60 80 24 24 60 02'= AF Zoom-Nikkor 80-200mm f/2.8D ED
'53 54 50 50 0C 0C 00 00'= Zeiss Milvus 50mm f/1.4
'54 44 5C 7C 34 3C 58 02'= AF Zoom-Micro Nikkor 70-180mm f/4.5-5.6D ED
'54 44 5C 7C 34 3C 61 02'= AF Zoom-Micro Nikkor 70-180mm f/4.5-5.6D ED
'54 54 50 50 18 18 00 00'= Zeiss Milvus 50mm f/2 Macro
'55 54 62 62 0C 0C 00 00'= Zeiss Milvus 85mm f/1.4
'56 3C 5C 8E 30 3C 1C 02'= Sigma 70-300mm F4-5.6 APO Macro Super II
'56 48 5C 8E 30 3C 5A 02'= AF Zoom-Nikkor 70-300mm f/4-5.6D ED
'56 54 68 68 18 18 00 00'= Zeiss Milvus 100mm f/2 Macro
'59 48 98 98 24 24 5D 02'= AF-S Nikkor 400mm f/2.8D IF-ED
'59 48 98 98 24 24 E1 02'= AF-S Nikkor 400mm f/2.8D IF-ED + TC-17E
'59 48 98 98 24 24 F1 02'= AF-S Nikkor 400mm f/2.8D IF-ED + TC-14E
'59 48 98 98 24 24 F2 02'= AF-S Nikkor 400mm f/2.8D IF-ED + TC-20E
'5A 3C 3E 56 30 3C 5E 06'= IX-Nikkor 30-60mm f/4-5.6
'5B 44 56 7C 34 3C 5F 06'= IX-Nikkor 60-180mm f/4.5-5.6
'5D 48 3C 5C 24 24 63 02'= AF-S Zoom-Nikkor 28-70mm f/2.8D IF-ED
'5E 48 60 80 24 24 64 02'= AF-S Zoom-Nikkor 80-200mm f/2.8D IF-ED
'5F 40 3C 6A 2C 34 65 02'= AF Zoom-Nikkor 28-105mm f/3.5-4.5D IF
'60 40 3C 60 2C 3C 66 02'= AF Zoom-Nikkor 28-80mm f/3.5-5.6D
'61 44 5E 86 34 3C 67 02'= AF Zoom-Nikkor 75-240mm f/4.5-5.6D
'63 48 2B 44 24 24 68 02'= AF-S Nikkor 17-35mm f/2.8D IF-ED
'64 00 62 62 24 24 6A 02'= PC Micro-Nikkor 85mm f/2.8D
'65 44 60 98 34 3C 6B 0A'= AF VR Zoom-Nikkor 80-400mm f/4.5-5.6D ED
'66 40 2D 44 2C 34 6C 02'= AF Zoom-Nikkor 18-35mm f/3.5-4.5D IF-ED
'67 48 37 62 24 30 6D 02'= AF Zoom-Nikkor 24-85mm f/2.8-4D IF
'67 54 37 5C 24 24 1C 02'= Sigma 24-70mm F2.8 EX DG Macro
'68 42 3C 60 2A 3C 6E 06'= AF Zoom-Nikkor 28-80mm f/3.3-5.6G
'69 47 5C 8E 30 3C 00 02'= Tamron AF 70-300mm f/4-5.6 Di LD Macro 1:2 (A17N)
'69 48 5C 8E 30 3C 6F 02'= Tamron AF 70-300mm f/4-5.6 LD Macro 1:2 (572D/772D)
'69 48 5C 8E 30 3C 6F 06'= AF Zoom-Nikkor 70-300mm f/4-5.6G
'6A 48 8E 8E 30 30 70 02'= AF-S Nikkor 300mm f/4D IF-ED
'6B 48 24 24 24 24 71 02'= AF Nikkor ED 14mm f/2.8D
'6D 48 8E 8E 24 24 73 02'= AF-S Nikkor 300mm f/2.8D IF-ED II
'6E 48 98 98 24 24 74 02'= AF-S Nikkor 400mm f/2.8D IF-ED II
'6F 3C A0 A0 30 30 75 02'= AF-S Nikkor 500mm f/4D IF-ED II
'70 3C A6 A6 30 30 76 02'= AF-S Nikkor 600mm f/4D IF-ED II
'71 48 64 64 24 24 00 00'= Voigtlander APO-Skopar 90mm F2.8 SL IIs
'72 48 4C 4C 24 24 77 00'= Nikkor 45mm f/2.8 P
'74 40 37 62 2C 34 78 06'= AF-S Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED
'75 40 3C 68 2C 3C 79 06'= AF Zoom-Nikkor 28-100mm f/3.5-5.6G
'76 58 50 50 14 14 7A 02'= AF Nikkor 50mm f/1.8D
'77 44 60 98 34 3C 7B 0E'= Sigma 80-400mm F4.5-5.6 APO DG D OS
'77 44 61 98 34 3C 7B 0E'= Sigma 80-400mm F4.5-5.6 EX OS
'77 48 5C 80 24 24 7B 0E'= AF-S VR Zoom-Nikkor 70-200mm f/2.8G IF-ED
'78 40 37 6E 2C 3C 7C 0E'= AF-S VR Zoom-Nikkor 24-120mm f/3.5-5.6G IF-ED
'79 40 11 11 2C 2C 1C 06'= Sigma 8mm F3.5 EX Circular Fisheye
'79 40 3C 80 2C 3C 7F 06'= AF Zoom-Nikkor 28-200mm f/3.5-5.6G IF-ED
'79 48 3C 5C 24 24 1C 06'= Sigma 28-70mm F2.8 EX DG
'79 48 5C 5C 24 24 1C 06'= Sigma Macro 70mm F2.8 EX DG
'79 54 31 31 0C 0C 4B 06'= Sigma 20mm F1.4 DG HSM | A
'7A 3B 53 80 30 3C 4B 06'= Sigma 55-200mm F4-5.6 DC HSM
'7A 3C 1F 37 30 30 7E 06.1'= AF-S DX Zoom-Nikkor 12-24mm f/4G IF-ED
'7A 3C 1F 37 30 30 7E 06.2'= Tokina AT-X 124 AF PRO DX II (AF 12-24mm f/4)
'7A 3C 1F 3C 30 30 7E 06'= Tokina AT-X 12-28 PRO DX (AF 12-28mm f/4)
'7A 40 2D 50 2C 3C 4B 06'= Sigma 18-50mm F3.5-5.6 DC HSM
'7A 40 2D 80 2C 40 4B 0E'= Sigma 18-200mm F3.5-6.3 DC OS HSM
'7A 47 2B 5C 24 34 4B 06'= Sigma 17-70mm F2.8-4.5 DC Macro Asp. IF HSM
'7A 47 50 76 24 24 4B 06'= Sigma 50-150mm F2.8 EX APO DC HSM
'7A 48 1C 29 24 24 7E 06'= Tokina AT-X 116 PRO DX II (AF 11-16mm f/2.8)
'7A 48 1C 30 24 24 7E 06'= Tokina AT-X 11-20 F2.8 PRO DX (AF 11-20mm f/2.8)
'7A 48 2B 5C 24 34 4B 06'= Sigma 17-70mm F2.8-4.5 DC Macro Asp. IF HSM
'7A 48 2D 50 24 24 4B 06'= Sigma 18-50mm F2.8 EX DC Macro
'7A 48 5C 80 24 24 4B 06'= Sigma 70-200mm F2.8 EX APO DG Macro HSM II
'7A 54 6E 8E 24 24 4B 02'= Sigma APO 120-300mm F2.8 EX DG HSM
'7B 48 37 44 18 18 4B 06'= Sigma 24-35mm F2.0 DG HSM | A
'7B 48 80 98 30 30 80 0E'= AF-S VR Zoom-Nikkor 200-400mm f/4G IF-ED
'7C 54 2B 50 24 24 00 06'= Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16)
'7D 48 2B 53 24 24 82 06'= AF-S DX Zoom-Nikkor 17-55mm f/2.8G IF-ED
'7F 40 2D 5C 2C 34 84 06'= AF-S DX Zoom-Nikkor 18-70mm f/3.5-4.5G IF-ED
'7F 48 2B 5C 24 34 1C 06'= Sigma 17-70mm F2.8-4.5 DC Macro Asp. IF
'7F 48 2D 50 24 24 1C 06'= Sigma 18-50mm F2.8 EX DC Macro
'80 48 1A 1A 24 24 85 06'= AF DX Fisheye-Nikkor 10.5mm f/2.8G ED
'80 48 1C 29 24 24 7A 06'= Tokina atx-i 11-16mm F2.8 CF
'81 34 76 A6 38 40 4B 0E'= Sigma 150-600mm F5-6.3 DG OS HSM | S
'81 54 80 80 18 18 86 0E'= AF-S VR Nikkor 200mm f/2G IF-ED
'82 34 76 A6 38 40 4B 0E'= Sigma 150-600mm F5-6.3 DG OS HSM | C
'82 48 8E 8E 24 24 87 0E'= AF-S VR Nikkor 300mm f/2.8G IF-ED
'83 00 B0 B0 5A 5A 88 04'= FSA-L2, EDG 65, 800mm F13 G
'87 2C 2D 8E 2C 40 4B 0E'= Sigma 18-300mm F3.5-6.3 DC Macro HSM
'88 54 50 50 0C 0C 4B 06'= Sigma 50mm F1.4 DG HSM | A
'89 30 2D 80 2C 40 4B 0E'= Sigma 18-200mm F3.5-6.3 DC Macro OS HS | C
'89 3C 53 80 30 3C 8B 06'= AF-S DX Zoom-Nikkor 55-200mm f/4-5.6G ED
'8A 3C 37 6A 30 30 4B 0E'= Sigma 24-105mm F4 DG OS HSM
'8A 54 6A 6A 24 24 8C 0E'= AF-S VR Micro-Nikkor 105mm f/2.8G IF-ED
'8B 40 2D 80 2C 3C 8D 0E'= AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED
'8B 40 2D 80 2C 3C FD 0E'= AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED [II]
'8B 48 1C 30 24 24 85 06'= Tokina AT-X 11-20 F2.8 PRO DX (AF 11-20mm f/2.8)
'8B 4C 2D 44 14 14 4B 06'= Sigma 18-35mm F1.8 DC HSM
'8C 40 2D 53 2C 3C 8E 06'= AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED
'8C 48 29 3C 24 24 86 06'= Tokina opera 16-28mm F2.8 FF
'8D 44 5C 8E 34 3C 8F 0E'= AF-S VR Zoom-Nikkor 70-300mm f/4.5-5.6G IF-ED
'8D 48 6E 8E 24 24 4B 0E'= Sigma 120-300mm F2.8 DG OS HSM Sports
'8E 3C 2B 5C 24 30 4B 0E'= Sigma 17-70mm F2.8-4 DC Macro OS HSM | C
'8F 40 2D 72 2C 3C 91 06'= AF-S DX Zoom-Nikkor 18-135mm f/3.5-5.6G IF-ED
'8F 48 2B 50 24 24 4B 0E'= Sigma 17-50mm F2.8 EX DC OS HSM
'90 3B 53 80 30 3C 92 0E'= AF-S DX VR Zoom-Nikkor 55-200mm f/4-5.6G IF-ED
'90 40 2D 80 2C 40 4B 0E'= Sigma 18-200mm F3.5-6.3 II DC OS HSM
'91 54 44 44 0C 0C 4B 06'= Sigma 35mm F1.4 DG HSM
'92 2C 2D 88 2C 40 4B 0E'= Sigma 18-250mm F3.5-6.3 DC Macro OS HSM
'92 48 24 37 24 24 94 06'= AF-S Zoom-Nikkor 14-24mm f/2.8G ED
'93 48 37 5C 24 24 95 06'= AF-S Zoom-Nikkor 24-70mm f/2.8G ED
'94 40 2D 53 2C 3C 96 06'= AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED II
'94 48 7C 7C 24 24 4B 0E'= Sigma APO Macro 180mm F2.8 EX DG OS HSM
'95 00 37 37 2C 2C 97 06'= PC-E Nikkor 24mm f/3.5D ED
'95 4C 37 37 2C 2C 97 02'= PC-E Nikkor 24mm f/3.5D ED
'96 38 1F 37 34 3C 4B 06'= Sigma 12-24mm F4.5-5.6 II DG HSM
'96 48 98 98 24 24 98 0E'= AF-S VR Nikkor 400mm f/2.8G ED
'97 3C A0 A0 30 30 99 0E'= AF-S VR Nikkor 500mm f/4G ED
'97 48 6A 6A 24 24 4B 0E'= Sigma Macro 105mm F2.8 EX DG OS HSM
'98 3C A6 A6 30 30 9A 0E'= AF-S VR Nikkor 600mm f/4G ED
'98 48 50 76 24 24 4B 0E'= Sigma 50-150mm F2.8 EX APO DC OS HSM
'99 40 29 62 2C 3C 9B 0E'= AF-S DX VR Zoom-Nikkor 16-85mm f/3.5-5.6G ED
'99 48 76 76 24 24 4B 0E'= Sigma APO Macro 150mm F2.8 EX DG OS HSM
'9A 40 2D 53 2C 3C 9C 0E'= AF-S DX VR Zoom-Nikkor 18-55mm f/3.5-5.6G
'9A 4C 50 50 14 14 9C 06'= Yongnuo YN50mm F1.8N
'9B 00 4C 4C 24 24 9D 06'= PC-E Micro Nikkor 45mm f/2.8D ED
'9B 54 4C 4C 24 24 9D 02'= PC-E Micro Nikkor 45mm f/2.8D ED
'9B 54 62 62 0C 0C 4B 06'= Sigma 85mm F1.4 EX DG HSM
'9C 48 5C 80 24 24 4B 0E'= Sigma 70-200mm F2.8 EX DG OS HSM
'9C 54 56 56 24 24 9E 06'= AF-S Micro Nikkor 60mm f/2.8G ED
'9D 00 62 62 24 24 9F 06'= PC-E Micro Nikkor 85mm f/2.8D
'9D 48 2B 50 24 24 4B 0E'= Sigma 17-50mm F2.8 EX DC OS HSM
'9D 54 62 62 24 24 9F 02'= PC-E Micro Nikkor 85mm f/2.8D
'9E 38 11 29 34 3C 4B 06'= Sigma 8-16mm F4.5-5.6 DC HSM
'9E 40 2D 6A 2C 3C A0 0E'= AF-S DX VR Zoom-Nikkor 18-105mm f/3.5-5.6G ED
'9F 37 50 A0 34 40 4B 0E'= Sigma 50-500mm F4.5-6.3 DG OS HSM
'9F 48 48 48 24 24 A1 06'= Yongnuo YN40mm F2.8N
'9F 54 68 68 18 18 A2 06'= Yongnuo YN100mm F2N
'9F 58 44 44 14 14 A1 06'= AF-S DX Nikkor 35mm f/1.8G
'A0 37 5C 8E 34 3C A2 06'= Sony FE 70-300mm F4.5-5.6 G OSS
'A0 40 2D 53 2C 3C CA 0E'= AF-P DX Nikkor 18-55mm f/3.5-5.6G VR
'A0 40 2D 53 2C 3C CA 8E'= AF-P DX Nikkor 18-55mm f/3.5-5.6G
'A0 40 2D 74 2C 3C BB 0E'= AF-S DX Nikkor 18-140mm f/3.5-5.6G ED VR
'A0 48 2A 5C 24 30 4B 0E'= Sigma 17-70mm F2.8-4 DC Macro OS HSM
'A0 54 50 50 0C 0C A2 06'= AF-S Nikkor 50mm f/1.4G
'A0 56 44 44 14 14 A2 06'= Sony FE 35mm F1.8
'A1 40 18 37 2C 34 A3 06'= AF-S DX Nikkor 10-24mm f/3.5-4.5G ED
'A1 40 2D 53 2C 3C CB 86'= AF-P DX Nikkor 18-55mm f/3.5-5.6G
'A1 41 19 31 2C 2C 4B 06'= Sigma 10-20mm F3.5 EX DC HSM
'A1 48 6E 8E 24 24 DB 4E'= AF-S Nikkor 120-300mm f/2.8E FL ED SR VR
'A1 54 55 55 0C 0C BC 06'= AF-S Nikkor 58mm f/1.4G
'A2 38 5C 8E 34 40 CD 86'= AF-P DX Nikkor 70-300mm f/4.5-6.3G VR
'A2 40 2D 53 2C 3C BD 0E'= AF-S DX Nikkor 18-55mm f/3.5-5.6G VR II
'A2 48 5C 80 24 24 A4 0E'= AF-S Nikkor 70-200mm f/2.8G ED VR II
'A3 38 5C 8E 34 40 CE 0E'= AF-P DX Nikkor 70-300mm f/4.5-6.3G ED
'A3 38 5C 8E 34 40 CE 8E'= AF-P DX Nikkor 70-300mm f/4.5-6.3G ED VR
'A3 3C 29 44 30 30 A5 0E'= AF-S Nikkor 16-35mm f/4G ED VR
'A3 3C 5C 8E 30 3C 4B 0E'= Sigma 70-300mm F4-5.6 DG OS
'A4 40 2D 8E 2C 40 BF 0E'= AF-S DX Nikkor 18-300mm f/3.5-6.3G ED VR
'A4 47 2D 50 24 34 4B 0E'= Sigma 18-50mm F2.8-4.5 DC OS HSM
'A4 48 5C 80 24 24 CF 0E'= AF-S Nikkor 70-200mm f/2.8E FL ED VR
'A4 48 5C 80 24 24 CF 4E'= AF-S Nikkor 70-200mm f/2.8E FL ED VR
'A4 54 37 37 0C 0C A6 06'= AF-S Nikkor 24mm f/1.4G ED
'A5 40 2D 88 2C 40 4B 0E'= Sigma 18-250mm F3.5-6.3 DC OS HSM
'A5 40 3C 8E 2C 3C A7 0E'= AF-S Nikkor 28-300mm f/3.5-5.6G ED VR
'A5 4C 44 44 14 14 C0 06'= AF-S Nikkor 35mm f/1.8G ED
'A5 54 6A 6A 0C 0C D0 06'= AF-S Nikkor 105mm f/1.4E ED
'A5 54 6A 6A 0C 0C D0 46'= AF-S Nikkor 105mm f/1.4E ED
'A6 48 2F 2F 30 30 D1 06'= PC Nikkor 19mm f/4E ED
'A6 48 2F 2F 30 30 D1 46'= PC Nikkor 19mm f/4E ED
'A6 48 37 5C 24 24 4B 06'= Sigma 24-70mm F2.8 IF EX DG HSM
'A6 48 8E 8E 24 24 A8 0E'= AF-S Nikkor 300mm f/2.8G IF-ED VR II
'A6 48 98 98 24 24 C1 0E'= AF-S Nikkor 400mm f/2.8E FL ED VR
'A7 3C 53 80 30 3C C2 0E'= AF-S DX Nikkor 55-200mm f/4-5.6G ED VR II
'A7 40 11 26 2C 34 D2 06'= AF-S Fisheye Nikkor 8-15mm f/3.5-4.5E ED
'A7 40 11 26 2C 34 D2 46'= AF-S Fisheye Nikkor 8-15mm f/3.5-4.5E ED
'A7 49 80 A0 24 24 4B 06'= Sigma APO 200-500mm F2.8 EX DG
'A7 4B 62 62 2C 2C A9 0E'= AF-S DX Micro Nikkor 85mm f/3.5G ED VR
'A8 38 18 30 34 3C D3 0E'= AF-P DX Nikkor 10-20mm f/4.5-5.6G VR
'A8 38 18 30 34 3C D3 8E'= AF-P DX Nikkor 10-20mm f/4.5-5.6G VR
'A8 48 80 98 30 30 AA 0E'= AF-S Zoom-Nikkor 200-400mm f/4G IF-ED VR II
'A8 48 8E 8E 30 30 C3 0E'= AF-S Nikkor 300mm f/4E PF ED VR
'A8 48 8E 8E 30 30 C3 4E'= AF-S Nikkor 300mm f/4E PF ED VR
'A9 48 7C 98 30 30 D4 0E'= AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR
'A9 48 7C 98 30 30 D4 4E'= AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR
'A9 4C 31 31 14 14 C4 06'= AF-S Nikkor 20mm f/1.8G ED
'A9 54 80 80 18 18 AB 0E'= AF-S Nikkor 200mm f/2G ED VR II
'AA 3C 37 6E 30 30 AC 0E'= AF-S Nikkor 24-120mm f/4G ED VR
'AA 48 37 5C 24 24 C5 0E'= AF-S Nikkor 24-70mm f/2.8E ED VR
'AA 48 37 5C 24 24 C5 4E'= AF-S Nikkor 24-70mm f/2.8E ED VR
'AA 48 88 A4 3C 3C D5 0E'= AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR + 1.4x TC
'AA 48 88 A4 3C 3C D5 4E'= AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR + 1.4x TC
'AB 3C A0 A0 30 30 C6 4E'= AF-S Nikkor 500mm f/4E FL ED VR
'AB 44 5C 8E 34 3C D6 0E'= AF-P Nikkor 70-300mm f/4.5-5.6E ED VR
'AB 44 5C 8E 34 3C D6 4E'= AF-P Nikkor 70-300mm f/4.5-5.6E ED VR
'AB 44 5C 8E 34 3C D6 CE'= AF-P Nikkor 70-300mm f/4.5-5.6E ED VR
'AC 38 53 8E 34 3C AE 0E'= AF-S DX Nikkor 55-300mm f/4.5-5.6G ED VR
'AC 3C A6 A6 30 30 C7 4E'= AF-S Nikkor 600mm f/4E FL ED VR
'AC 54 3C 3C 0C 0C D7 06'= AF-S Nikkor 28mm f/1.4E ED
'AC 54 3C 3C 0C 0C D7 46'= AF-S Nikkor 28mm f/1.4E ED
'AD 3C 2D 8E 2C 3C AF 0E'= AF-S DX Nikkor 18-300mm f/3.5-5.6G ED VR
'AD 3C A0 A0 3C 3C D8 0E'= AF-S Nikkor 500mm f/5.6E PF ED VR
'AD 3C A0 A0 3C 3C D8 4E'= AF-S Nikkor 500mm f/5.6E PF ED VR
'AD 48 28 60 24 30 C8 0E'= AF-S DX Nikkor 16-80mm f/2.8-4E ED VR
'AD 48 28 60 24 30 C8 4E'= AF-S DX Nikkor 16-80mm f/2.8-4E ED VR
'AE 3C 80 A0 3C 3C C9 0E'= AF-S Nikkor 200-500mm f/5.6E ED VR
'AE 3C 80 A0 3C 3C C9 4E'= AF-S Nikkor 200-500mm f/5.6E ED VR
'AE 54 62 62 0C 0C B0 06'= AF-S Nikkor 85mm f/1.4G
'AF 4C 37 37 14 14 CC 06'= AF-S Nikkor 24mm f/1.8G ED
'AF 54 44 44 0C 0C B1 06'= AF-S Nikkor 35mm f/1.4G
'B0 4C 50 50 14 14 B2 06'= AF-S Nikkor 50mm f/1.8G
'B1 48 48 48 24 24 B3 06'= AF-S DX Micro Nikkor 40mm f/2.8G
'B2 48 5C 80 30 30 B4 0E'= AF-S Nikkor 70-200mm f/4G ED VR
'B3 4C 62 62 14 14 B5 06'= AF-S Nikkor 85mm f/1.8G
'B4 40 37 62 2C 34 B6 0E'= AF-S Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED VR
'B5 4C 3C 3C 14 14 B7 06'= AF-S Nikkor 28mm f/1.8G
'B6 3C B0 B0 3C 3C B8 0E'= AF-S VR Nikkor 800mm f/5.6E FL ED
'B6 3C B0 B0 3C 3C B8 4E'= AF-S VR Nikkor 800mm f/5.6E FL ED
'B6 48 37 56 24 24 1C 02'= Sigma 24-60mm F2.8 EX DG
'B7 44 60 98 34 3C B9 0E'= AF-S Nikkor 80-400mm f/4.5-5.6G ED VR
'B8 40 2D 44 2C 34 BA 06'= AF-S Nikkor 18-35mm f/3.5-4.5G ED
'BB 48 5C 80 24 24 4B 4E'= Sigma 70-200mm F2.8 DG OS HSM | S
'BF 3C 1B 1B 30 30 01 04'= Irix 11mm f/4 Firefly
'BF 4E 26 26 1E 1E 01 04'= Irix 15mm f/2.4 Firefly
'C1 48 24 37 24 24 4B 46'= Sigma 14-24mm F2.8 DG HSM | A
'C2 4C 24 24 14 14 4B 06'= Sigma 14mm F1.8 DG HSM | A
'C3 34 68 98 38 40 4B 4E'= Sigma 100-400mm F5-6.3 DG OS HSM | C
'C4 4C 73 73 14 14 4B 46'= Sigma 135mm F1.8 DG HSM | A
'C8 54 44 44 0D 0D DF 46'= Tamron SP 35mm f/1.4 Di USD (F045)
'C8 54 62 62 0C 0C 4B 06'= Sigma 85mm F1.4 DG HSM | A
'C8 54 62 62 0C 0C 4B 46'= Sigma 85mm F1.4 DG HSM | A
'C9 3C 44 76 25 31 DF 4E'= Tamron 35-150mm f/2.8-4 Di VC OSD (A043)
'C9 48 37 5C 24 24 4B 4E'= Sigma 24-70mm F2.8 DG OS HSM | A
'CA 3C 1F 37 30 30 4B 46'= Sigma 12-24mm F4 DG HSM | A
'CA 48 27 3E 24 24 DF 4E'= Tamron SP 15-30mm f/2.8 Di VC USD G2 (A041)
'CB 3C 2B 44 24 31 DF 46'= Tamron 17-35mm f/2.8-4 Di OSD (A037)
'CC 44 68 98 34 41 DF 0E'= Tamron 100-400mm f/4.5-6.3 Di VC USD
'CC 4C 50 68 14 14 4B 06'= Sigma 50-100mm F1.8 DC HSM | A
'CD 3D 2D 70 2E 3C 4B 0E'= Sigma 18-125mm F3.8-5.6 DC OS HSM
'CE 34 76 A0 38 40 4B 0E'= Sigma 150-500mm F5-6.3 DG OS APO HSM
'CE 47 37 5C 25 25 DF 4E'= Tamron SP 24-70mm f/2.8 Di VC USD G2 (A032)
'CF 38 6E 98 34 3C 4B 0E'= Sigma APO 120-400mm F4.5-5.6 DG OS HSM
'CF 47 5C 8E 31 3D DF 0E'= Tamron SP 70-300mm f/4-5.6 Di VC USD (A030)
'D2 3C 8E B0 3C 3C 4B 02'= Sigma APO 300-800mm F5.6 EX DG HSM
'DB 40 11 11 2C 2C 1C 06'= Sigma 8mm F3.5 EX DG Circular Fisheye
'DC 48 19 19 24 24 4B 06'= Sigma 10mm F2.8 EX DC HSM Fisheye
'DE 54 50 50 0C 0C 4B 06'= Sigma 50mm F1.4 EX DG HSM
'E0 3C 5C 8E 30 3C 4B 06'= Sigma 70-300mm F4-5.6 APO DG Macro HSM
'E0 40 2D 98 2C 41 DF 4E'= Tamron 18-400mm f/3.5-6.3 Di II VC HLD (B028)
'E1 40 19 36 2C 35 DF 4E'= Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)
'E1 58 37 37 14 14 1C 02'= Sigma 24mm F1.8 EX DG Aspherical Macro
'E2 47 5C 80 24 24 DF 4E'= Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)
'E3 40 76 A6 38 40 DF 0E'= Tamron SP 150-600mm f/5-6.3 Di VC USD G2 (A022)
'E3 40 76 A6 38 40 DF 4E'= Tamron SP 150-600mm f/5-6.3 Di VC USD G2
'E3 54 50 50 24 24 35 02'= Sigma Macro 50mm F2.8 EX DG
'E4 54 64 64 24 24 DF 0E'= Tamron SP 90mm f/2.8 Di VC USD Macro 1:1 (F017)
'E5 4C 62 62 14 14 C9 4E'= Tamron SP 85mm f/1.8 Di VC USD (F016)
'E5 54 6A 6A 24 24 35 02'= Sigma Macro 105mm F2.8 EX DG
'E6 40 2D 80 2C 40 DF 0E'= Tamron 18-200mm f/3.5-6.3 Di II VC (B018)
'E6 41 3C 8E 2C 40 1C 02'= Sigma 28-300mm F3.5-6.3 DG Macro
'E7 4C 4C 4C 14 14 DF 0E'= Tamron SP 45mm f/1.8 Di VC USD (F013)
'E8 4C 44 44 14 14 DF 0E'= Tamron SP 35mm f/1.8 Di VC USD (F012)
'E9 48 27 3E 24 24 DF 0E'= Tamron SP 15-30mm f/2.8 Di VC USD (A012)
'E9 54 37 5C 24 24 1C 02'= Sigma 24-70mm F2.8 EX DG Macro
'EA 40 29 8E 2C 40 DF 0E'= Tamron 16-300mm f/3.5-6.3 Di II VC PZD (B016)
'EA 48 27 27 24 24 1C 02'= Sigma 15mm F2.8 EX Diagonal Fisheye
'EB 40 76 A6 38 40 DF 0E'= Tamron SP AF 150-600mm f/5-6.3 VC USD (A011)
'EC 3E 3C 8E 2C 40 DF 0E'= Tamron 28-300mm f/3.5-6.3 Di VC PZD A010
'ED 40 2D 80 2C 40 4B 0E'= Sigma 18-200mm F3.5-6.3 DC OS HSM
'EE 48 5C 80 24 24 4B 06'= Sigma 70-200mm F2.8 EX APO DG Macro HSM II
'F0 38 1F 37 34 3C 4B 06'= Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM
'F0 3F 2D 8A 2C 40 DF 0E'= Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD (B008)
'F1 44 A0 A0 34 34 4B 02'= Sigma APO 500mm F4.5 EX DG HSM
'F1 47 5C 8E 30 3C DF 0E'= Tamron SP 70-300mm f/4-5.6 Di VC USD (A005)
'F3 48 68 8E 30 30 4B 02'= Sigma APO 100-300mm F4 EX IF HSM
'F3 54 2B 50 24 24 84 0E'= Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical (IF) (B005)
'F4 4C 7C 7C 2C 2C 4B 02'= Sigma APO Macro 180mm F3.5 EX DG HSM
'F4 54 56 56 18 18 84 06'= Tamron SP AF 60mm f/2.0 Di II Macro 1:1 (G005)
'F5 40 2C 8A 2C 40 40 0E'= Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical (IF) Macro (B003)
'F5 48 76 76 24 24 4B 06'= Sigma APO Macro 150mm F2.8 EX DG HSM
'F6 3F 18 37 2C 34 84 06'= Tamron SP AF 10-24mm f/3.5-4.5 Di II LD Aspherical (IF) (B001)
'F6 3F 18 37 2C 34 DF 06'= Tamron SP AF 10-24mm f/3.5-4.5 Di II LD Aspherical (IF) (B001)
'F6 48 2D 50 24 24 4B 06'= Sigma 18-50mm F2.8 EX DC Macro
'F7 53 5C 80 24 24 40 06'= Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)
'F7 53 5C 80 24 24 84 06'= Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)
'F8 54 3E 3E 0C 0C 4B 06'= Sigma 30mm F1.4 EX DC HSM
'F8 54 64 64 24 24 DF 06'= Tamron SP AF 90mm f/2.8 Di Macro 1:1 (272NII)
'F8 55 64 64 24 24 84 06'= Tamron SP AF 90mm f/2.8 Di Macro 1:1 (272NII)
'F9 3C 19 31 30 3C 4B 06'= Sigma 10-20mm F4-5.6 EX DC HSM
'F9 40 3C 8E 2C 40 40 0E'= Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical (IF) Macro (A20)
'FA 54 3C 5E 24 24 84 06'= Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09NII)
'FA 54 3C 5E 24 24 DF 06'= Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09NII)
'FA 54 6E 8E 24 24 4B 02'= Sigma APO 120-300mm F2.8 EX DG HSM
'FB 54 2B 50 24 24 84 06'= Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16NII)
'FB 54 8E 8E 24 24 4B 02'= Sigma APO 300mm F2.8 EX DG HSM
'FC 40 2D 80 2C 40 DF 06'= Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)
'FD 47 50 76 24 24 4B 06'= Sigma 50-150mm F2.8 EX APO DC HSM II
'FE 47 00 00 24 24 4B 06'= Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye
'FE 48 37 5C 24 24 DF 0E'= Tamron SP 24-70mm f/2.8 Di VC USD (A007)
'FE 53 5C 80 24 24 84 06'= Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)
'FE 54 5C 80 24 24 DF 0E'= Tamron SP 70-200mm f/2.8 Di VC USD (A009)
'FE 54 64 64 24 24 DF 0E'= Tamron SP 90mm f/2.8 Di VC USD Macro 1:1 (F004)
'FF 40 2D 80 2C 40 4B 06'= Sigma 18-200mm F3.5-6.3 DC
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 21, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/NikonCapture.html b/html/TagNames/NikonCapture.html new file mode 100644 index 0000000..4debade --- /dev/null +++ b/html/TagNames/NikonCapture.html @@ -0,0 +1,800 @@ + + + + +NikonCapture Tags + + + +

NikonCapture Tags

+

This information is written by the Nikon Capture software in tag 0x0e01 of +the maker notes of NEF images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x8ae85eLCHEditorint8u0 = Off +
1 = On
0x83a1a25HistogramXMLundef 
0xc89224bColorAberrationControlint8u0 = Off +
1 = On
0x116fea21HighlightData---> NikonCapture HighlightData Tags
0x2175eb78D-LightingHQint8u0 = Off +
1 = On
0x2fc08431StraightenAngledouble 
0x374233e0CropData---> NikonCapture CropData Tags
0x39c456acPictureCtrl---> NikonCapture PictureCtrl Tags
0x3cfc73c6RedEyeData---> NikonCapture RedEyeData Tags
0x3d136244EditVersionNamestring 
0x416391c6QuickFixint8u0 = Off +
1 = On
0x56a54260Exposure---> NikonCapture Exposure Tags
0x5f0e7d23ColorBoosterint8u0 = Off +
1 = On
0x6a6e36b6D-LightingHQSelectedint8u0 = No +
1 = Yes
0x753dcbc0NoiseReductionint8u0 = Off +
1 = On
0x76a43200UnsharpMaskint8u0 = Off +
1 = On
0x76a43201Curvesint8u0 = Off +
1 = On
0x76a43202ColorBalanceAdjint8u0 = Off +
1 = On
0x76a43203AdvancedRawint8u0 = Off +
1 = On
0x76a43204WhiteBalanceAdjint8u0 = Off +
1 = On
0x76a43205VignetteControlint8u0 = Off +
1 = On
0x76a43206FlipHorizontalint8u0 = No +
1 = Yes
0x76a43207Rotationint16u 
0x84589434BrightnessData---> NikonCapture Brightness Tags
0x890ff591D-LightingHQData---> NikonCapture DLightingHQ Tags
0x926f13e0NoiseReductionData---> NikonCapture NoiseReduction Tags
0x9ef5f6e0IPTCData---> IPTC Tags
0xab5eca5ePhotoEffectsint8u0 = Off +
1 = On
0xac6bd5c0VignetteControlIntensityint16s 
0xb0384e1ePhotoEffectsData---> NikonCapture PhotoEffects Tags
0xb999a36fColorBoostData---> NikonCapture ColorBoost Tags
0xbf3c6c20WBAdjData---> NikonCapture WBAdjData Tags
0xce5554aaD-LightingHSint8u0 = Off +
1 = On
0xe2173c47PictureControlint8u0 = Off +
1 = On
0xe37b4337D-LightingHSData---> NikonCapture DLightingHS Tags
0xe42b5161UnsharpData---> NikonCapture UnsharpData Tags
0xe9651831PhotoEffectHistoryXMLundef 
0xfe28a44fAutoRedEyeint8u0 = Off +
1 = On
0xfe443a45ImageDustOffint8u0 = Off +
1 = On
+ +

NikonCapture HighlightData Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ShadowProtectionint8s 
1SaturationAdjint8s 
6HighlightProtectionint8s 
+ +

NikonCapture CropData Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
30CropLeftdouble 
38CropTopdouble 
46CropRightdouble 
54CropBottomdouble 
142CropOutputWidthInchesdouble 
150CropOutputHeightInchesdouble 
158CropScaledResolutiondouble 
174CropSourceResolutiondouble 
182CropOutputResolutiondouble 
190CropOutputScaledouble 
198CropOutputWidthdouble 
206CropOutputHeightdouble 
214CropOutputPixelsdouble 
+ +

NikonCapture PictureCtrl Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0PictureControlActiveint8u0 = Off +
1 = On
19PictureControlModestring[16] 
42QuickAdjustint8u 
43SharpeningAdjint8u 
44ContrastAdjint8u 
45BrightnessAdjint8u 
46SaturationAdjint8u 
47HueAdjint8u 
+ +

NikonCapture RedEyeData Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0RedEyeCorrectionint8u0 = Off +
1 = Automatic +
2 = Click on Eyes
+ +

NikonCapture Exposure Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ExposureAdjint16s 
18ExposureAdj2double 
36ActiveD-Lightingint8u0 = Off +
1 = On
37ActiveD-LightingModeint8u + +
0 = Unchanged +
1 = Off +
2 = Low +
3 = Normal
  4 = High +
6 = Extra High +
7 = Extra High 1 +
8 = Extra High 2
+
+ +

NikonCapture Brightness Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0BrightnessAdjdouble 
8EnhanceDarkTonesint8u0 = Off +
1 = On
+ +

NikonCapture DLightingHQ Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0D-LightingHQShadowint32u 
1D-LightingHQHighlightint32u 
2D-LightingHQColorBoostint32u 
+ +

NikonCapture NoiseReduction Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4EdgeNoiseReductionint8u0 = Off +
1 = On
5ColorMoireReductionModeint8u0 = Off +
1 = Low +
2 = Medium +
3 = High
9NoiseReductionIntensityint32u 
13NoiseReductionSharpnessint32u 
17NoiseReductionMethodint16u0 = Faster +
1 = Better Quality +
2 = Better Quality 2013
21ColorMoireReductionint8u0 = Off +
1 = On
23NoiseReductionint8u0 = Off +
1 = On
24ColorNoiseReductionIntensityint32u 
28ColorNoiseReductionSharpnessint32u 
+ +

NikonCapture PhotoEffects Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0PhotoEffectsTypeint8u0 = None +
1 = B&W +
2 = Sepia +
3 = Tinted
4PhotoEffectsRedint16s 
6PhotoEffectsGreenint16s 
8PhotoEffectsBlueint16s 
+ +

NikonCapture ColorBoost Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ColorBoostTypeint8u0 = Nature +
1 = People
1ColorBoostLevelint32u 
+ +

NikonCapture WBAdjData Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0WBAdjRedBalancedouble 
8WBAdjBlueBalancedouble 
16WBAdjModeint8u +
1 = Use Gray Point +
2 = Recorded Value +
3 = Use Temperature +
4 = Calculate Automatically +
5 = Auto2 +
6 = Underwater +
7 = Auto1
+
20WBAdjLightingint16u0x0 = None +
0x100 = Incandescent +
0x200 = Daylight (direct sunlight) +
0x201 = Daylight (shade) +
0x202 = Daylight (cloudy) +
0x300 = Standard Fluorescent (warm white) +
0x301 = Standard Fluorescent (3700K) +
0x302 = Standard Fluorescent (cool white) +
0x303 = Standard Fluorescent (5000K) +
0x304 = Standard Fluorescent (daylight) +
0x305 = Standard Fluorescent (high temperature mercury vapor) +
0x400 = High Color Rendering Fluorescent (warm white) +
0x401 = High Color Rendering Fluorescent (3700K) +
0x402 = High Color Rendering Fluorescent (cool white) +
0x403 = High Color Rendering Fluorescent (5000K) +
0x404 = High Color Rendering Fluorescent (daylight) +
0x500 = Flash +
0x501 = Flash (FL-G1 filter) +
0x502 = Flash (FL-G2 filter) +
0x503 = Flash (TN-A1 filter) +
0x504 = Flash (TN-A2 filter) +
0x600 = Sodium Vapor Lamps
24WBAdjTemperatureint16u 
37WBAdjTintint32s 
+ +

NikonCapture DLightingHS Tags

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0D-LightingHSAdjustmentint32u 
1D-LightingHSColorBoostint32u 
+ +

NikonCapture UnsharpData Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0UnsharpCountint8u 
19Unsharp1Colorint16u + +
0 = RGB +
1 = Red +
2 = Green +
3 = Blue
  4 = Yellow +
5 = Magenta +
6 = Cyan
+
23Unsharp1Intensityint16u 
25Unsharp1HaloWidthint16u 
27Unsharp1Thresholdint8u 
46Unsharp2Colorint16u + +
0 = RGB +
1 = Red +
2 = Green +
3 = Blue
  4 = Yellow +
5 = Magenta +
6 = Cyan
+
50Unsharp2Intensityint16u 
52Unsharp2HaloWidthint16u 
54Unsharp2Thresholdint8u 
73Unsharp3Colorint16u + +
0 = RGB +
1 = Red +
2 = Green +
3 = Blue
  4 = Yellow +
5 = Magenta +
6 = Cyan
+
77Unsharp3Intensityint16u 
79Unsharp3HaloWidthint16u 
81Unsharp3Thresholdint8u 
100Unsharp4Colorint16u + +
0 = RGB +
1 = Red +
2 = Green +
3 = Blue
  4 = Yellow +
5 = Magenta +
6 = Cyan
+
104Unsharp4Intensityint16u 
106Unsharp4HaloWidthint16u 
108Unsharp4Thresholdint8u 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised May 2, 2014 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/NikonCustom.html b/html/TagNames/NikonCustom.html new file mode 100644 index 0000000..5bcf331 --- /dev/null +++ b/html/TagNames/NikonCustom.html @@ -0,0 +1,11654 @@ + + + + +NikonCustom Tags + + + +

NikonCustom Tags

+

+Unfortunately, the NikonCustom settings are stored in a binary data block +which changes from model to model. This means that significant effort must +be spent in decoding these for each model, usually requiring hundreds of +test images from a dedicated Nikon owner. For this reason, the NikonCustom +settings have not been decoded for all models. The tables below list the +custom settings for the currently supported models. +

+

NikonCustom SettingsD40 Tags

+

Custom settings for the Nikon D40.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1Beepint8u[val >> 7 & 0x1] +
0 = On +
1 = Off
0.2AFAssistint8u[val >> 6 & 0x1] +
0 = On +
1 = Off
0.3NoMemoryCardint8u[val >> 5 & 0x1] +
0 = Release Locked +
1 = Enable Release
0.4ImageReviewint8u[val >> 4 & 0x1] +
0 = On +
1 = Off
1.1AutoISOint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
1.2AutoISOMaxint8u[val >> 4 & 0x3] +
1 = 400 +
2 = 800 +
3 = 1600
1.3AutoISOMinShutterSpeedint8u[val & 0x7] + +
0 = 1/125 s +
1 = 1/60 s +
2 = 1/30 s +
3 = 1/15 s
  4 = 1/8 s +
5 = 1/4 s +
6 = 1/2 s +
7 = 1 s
+
2.1ImageReviewTimeint8u[val & 0x7] +
0 = 4 s +
1 = 8 s +
2 = 20 s +
3 = 1 min +
4 = 10 min
3.1MonitorOffTimeint8u[val >> 5 & 0x7] +
0 = 4 s +
1 = 8 s +
2 = 20 s +
3 = 1 min +
4 = 10 min
3.2MeteringTimeint8u[val >> 2 & 0x7] +
0 = 4 s +
1 = 8 s +
2 = 20 s +
3 = 1 min +
4 = 30 min
3.3SelfTimerTimeint8u[val & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
3.4RemoteOnDurationint8u[val >> 6 & 0x3] +
0 = 1 min +
1 = 5 min +
2 = 10 min +
3 = 15 min
4.1AELockButtonint8u[val >> 1 & 0x7] +
0 = AE/AF Lock +
1 = AE Lock Only +
2 = AF Lock Only +
3 = AE Lock (hold) +
4 = AF-ON
4.2AELockint8u[val & 0x1] +
0 = Off +
1 = On
5.1ShootingModeSettingint8u[val >> 4 & 0x7] +
0 = Single Frame +
1 = Continuous +
2 = Self-timer +
3 = Delayed Remote +
4 = Quick-response Remote
5.2TimerFunctionButtonint8u[val & 0x7] +
0 = Shooting Mode +
1 = Image Quality/Size +
2 = ISO +
3 = White Balance +
4 = Self-timer
6.1Meteringint8u[val & 0x3] +
0 = Matrix +
1 = Center-weighted +
2 = Spot
8.1InternalFlashint8u[val >> 4 & 0x1] +
0 = TTL +
1 = Manual
8.2ManualFlashOutputint8u[val & 0x7]
9FlashLevelint8s 
10.1FocusModeSettingint8u[val >> 6 & 0x3] +
0 = Manual +
1 = AF-S +
2 = AF-C +
3 = AF-A
11.1AFAreaModeSettingint8u[val >> 4 & 0x3] +
0 = Single Area +
1 = Dynamic Area +
2 = Closest Subject
+ +

NikonCustom SettingsD80 Tags

+

Custom settings for the Nikon D80.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1Beepint8u[val >> 7 & 0x1] +
0 = On +
1 = Off
0.2AFAssistint8u[val >> 6 & 0x1] +
0 = On +
1 = Off
0.3NoMemoryCardint8u[val >> 5 & 0x1] +
0 = Release Locked +
1 = Enable Release
0.4ImageReviewint8u[val >> 4 & 0x1] +
0 = On +
1 = Off
0.5Illuminationint8u[val >> 3 & 0x1] +
0 = Off +
1 = On
0.6MainDialExposureCompint8u[val >> 2 & 0x1] +
0 = Off +
1 = On
0.7EVStepSizeint8u[val & 0x1] +
0 = 1/3 EV +
1 = 1/2 EV
1.1AutoISOint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
1.2AutoISOMaxint8u[val >> 4 & 0x3] +
0 = 200 +
1 = 400 +
2 = 800 +
3 = 1600
1.3AutoISOMinShutterSpeedint8u[val & 0xf] + +
0 = 1/125 s +
1 = 1/100 s +
2 = 1/80 s +
3 = 1/60 s +
4 = 1/40 s +
5 = 1/30 s
  6 = 1/15 s +
7 = 1/8 s +
8 = 1/4 s +
9 = 1/2 s +
10 = 1 s
+
2.1AutoBracketSetint8u[val >> 6 & 0x3] +
0 = AE & Flash +
1 = AE Only +
2 = Flash Only +
3 = WB Bracketing
2.2AutoBracketOrderint8u[val >> 5 & 0x1] +
0 = 0,-,+ +
1 = -,0,+
3.1MonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 5 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
3.2MeteringTimeint8u[val >> 2 & 0x7] + +
0 = 4 s +
1 = 6 s +
2 = 8 s
  3 = 16 s +
4 = 30 s +
5 = 30 min
+
3.3SelfTimerTimeint8u[val & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
4.1AELockButtonint8u[val >> 1 & 0xf] +
0 = AE/AF Lock +
1 = AE Lock Only +
2 = AF Lock Only +
3 = AE Lock (hold) +
4 = AF-ON +
5 = FV Lock +
6 = Focus Area Selection +
7 = AE-L/AF-L/AF Area +
8 = AE-L/AF Area +
9 = AF-L/AF Area +
10 = AF-ON/AF Area
+
4.2AELockint8u[val & 0x1] +
0 = Off +
1 = On
4.3RemoteOnDurationint8u[val >> 6 & 0x3] +
0 = 1 min +
1 = 5 min +
2 = 10 min +
3 = 15 min
5.1CommandDialsint8u[val >> 7 & 0x1] +
0 = Standard (Main Shutter, Sub Aperture) +
1 = Reversed (Main Aperture, Sub Shutter)
5.2FunctionButtonint8u[val >> 3 & 0xf] + +
0 = ISO Display +
1 = Framing Grid +
2 = AF-area Mode +
3 = Center AF Area +
4 = FV Lock
  5 = Flash Off +
6 = Matrix Metering +
7 = Center-weighted +
8 = Spot Metering
+
6.1GridDisplayint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
6.2ViewfinderWarningint8u[val >> 6 & 0x1] +
0 = On +
1 = Off
6.3CenterWeightedAreaSizeint8u[val >> 2 & 0x3] +
0 = 6 mm +
1 = 8 mm +
2 = 10 mm
6.4ExposureDelayModeint8u[val >> 5 & 0x1] +
0 = Off +
1 = On
6.5MB-D80Batteriesint8u[val & 0x3] +
0 = LR6 (AA Alkaline) +
1 = HR6 (AA Ni-MH) +
2 = FR6 (AA Lithium) +
3 = ZR6 (AA Ni-Mg)
7.1FlashWarningint8u[val >> 7 & 0x1] +
0 = On +
1 = Off
7.2FlashShutterSpeedint8u[val >> 3 & 0xf]
7.3AutoFPint8u[val >> 2 & 0x1] +
0 = Off +
1 = On
7.4ModelingFlashint8u[val >> 1 & 0x1] +
0 = Off +
1 = On
8.1InternalFlashint8u[val >> 6 & 0x3] +
0 = TTL +
1 = Manual +
2 = Repeating Flash +
3 = Commander Mode
8.2ManualFlashOutputint8u[val & 0x7]
9.1RepeatingFlashOutputint8u[val >> 4 & 0x7]
9.2RepeatingFlashCountint8u[val & 0xf]
10.1RepeatingFlashRateint8u[val >> 4 & 0xf]
10.2CommanderChannelint8u[val & 0x3]
11.1CommanderInternalFlashint8u[val >> 6 & 0x3] +
0 = TTL +
1 = Manual +
2 = Off
11.2CommanderGroupAModeint8u[val >> 4 & 0x3] +
0 = TTL +
1 = Auto Aperture +
2 = Manual +
3 = Off
11.3CommanderGroupBModeint8u[val >> 2 & 0x3] +
0 = TTL +
1 = Auto Aperture +
2 = Manual +
3 = Off
12.1CommanderInternalTTLCompint8u[val & 0x1f]
12.2CommanderInternalManualOutputint8u[val >> 5 & 0x7]
13.1CommanderGroupA_TTL-AACompint8u[val & 0x1f]
13.2CommanderGroupAManualOutputint8u[val >> 5 & 0x7]
14.1CommanderGroupB_TTL-AACompint8u[val & 0x1f]
14.2CommanderGroupBManualOutputint8u[val >> 5 & 0x7]
15.1CenterAFAreaint8u[val >> 7 & 0x1] +
0 = Normal Zone +
1 = Wide Zone
15.2FocusAreaSelectionint8u[val >> 2 & 0x1] +
0 = No Wrap +
1 = Wrap
15.3AFAreaIlluminationint8u[val & 0x3] +
0 = Auto +
1 = Off +
2 = On
16.1AFAreaModeSettingint8u[val >> 6 & 0x3] +
0 = Single Area +
1 = Dynamic Area +
2 = Auto-area
+ +

NikonCustom SettingsD90 Tags

+

Custom settings for the D90.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1LightSwitchint8u[val >> 3 & 0x1] +
0 = LCD Backlight +
1 = LCD Backlight and Shooting Information
2.1AFAreaModeSettingint8u[val >> 5 & 0x3] +
0 = Single Area +
1 = Dynamic Area +
2 = Auto-area +
3 = 3D-tracking (11 points)
2.2CenterFocusPointint8u[val >> 4 & 0x1] +
0 = Normal Zone +
1 = Wide Zone
2.3AFAssistint8u[val & 0x1] +
0 = On +
1 = Off
2.4AFPointIlluminationint8u[val >> 1 & 0x3] +
0 = Auto +
1 = On +
2 = Off
2.5FocusPointWrapint8u[val >> 3 & 0x1] +
0 = No Wrap +
1 = Wrap
3.1AELockForMB-D80int8u[val >> 2 & 0x7] +
0 = AE Lock Only +
1 = AF Lock Only +
2 = AE Lock (hold) +
3 = AF-On +
4 = FV Lock +
5 = Focus Point Selection +
7 = AE/AF Lock
+
3.2MB-D80BatteryTypeint8u[val & 0x3] +
0 = LR6 (AA alkaline) +
1 = HR6 (AA Ni-MH) +
2 = FR6 (AA lithium) +
3 = ZR6 (AA Ni-Mn)
4.1Beepint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
4.2GridDisplayint8u[val >> 1 & 0x1] +
0 = Off +
1 = On
4.3ISODisplayint8u[val >> 2 & 0x3] +
0 = Show ISO/Easy ISO +
1 = Show ISO Sensitivity +
3 = Show Frame Count
4.4ViewfinderWarningint8u[val & 0x1] +
0 = On +
1 = Off
4.5NoMemoryCardint8u[val >> 5 & 0x1] +
0 = Release Locked +
1 = Enable Release
5.1ScreenTipsint8u[val >> 2 & 0x1] +
0 = Off +
1 = On
5.2FileNumberSequenceint8u[val >> 3 & 0x1] +
0 = On +
1 = Off
5.3ShootingInfoDisplayint8u[val >> 6 & 0x3] +
0 = Auto +
2 = Manual (dark on light) +
3 = Manual (light on dark)
5.4LCDIlluminationint8u[val >> 5 & 0x1] +
0 = Off +
1 = On
6.1EasyExposureCompint8u[val & 0x1] +
0 = Off +
1 = On
6.2ReverseIndicatorsint8u[val >> 7 & 0x1] +
0 = + 0 - +
1 = - 0 +
7.1ExposureControlStepSizeint8u[val >> 6 & 0x1] +
0 = 1/3 EV +
1 = 1/2 EV
8.1CenterWeightedAreaSizeint8u[val >> 5 & 0x3] +
0 = 6 mm +
1 = 8 mm +
2 = 10 mm
8.2FineTuneOptMatrixMeteringint8u[val & 0xf]
9.1FineTuneOptCenterWeightedint8u[val >> 4 & 0xf]
9.2FineTuneOptSpotMeteringint8u[val & 0xf]
11.1CLModeShootingSpeedint8u[val & 0x7]
11.2ExposureDelayModeint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
13.1AutoBracketSetint8u[val >> 5 & 0x7] +
0 = AE & Flash +
1 = AE Only +
2 = Flash Only +
3 = WB Bracketing +
4 = Active D-Lighting
13.2AutoBracketOrderint8u[val >> 4 & 0x1] +
0 = 0,-,+ +
1 = -,0,+
14.1FuncButtonint8u[val >> 3 & 0xf] +
1 = Framing Grid +
2 = AF-area Mode +
3 = Center Focus Point +
4 = FV Lock +
5 = Flash Off +
6 = Matrix Metering +
7 = Center-weighted Metering +
8 = Spot Metering +
9 = My Menu Top +
10 = + NEF (RAW)
+
16.1OKButtonint8u[val >> 3 & 0x3] +
0 = Not Used +
1 = Select Center Focus Point +
2 = Highlight Active Focus Point +
3 = Not Used
17.1AELockButtonint8u[val >> 3 & 0x7] + +
0 = AE/AF Lock +
1 = AE Lock Only +
2 = AF Lock Only
  3 = AE Lock (hold) +
4 = AF-ON +
5 = FV Lock
+
18.1CommandDialsReverseRotationint8u[val >> 7 & 0x1] +
0 = No +
1 = Yes
18.2ShutterReleaseButtonAE-Lint8u[val >> 1 & 0x1] +
0 = Off +
1 = On
19.1MeteringTimeint8u[val >> 4 & 0xf] + +
0 = 4 s +
1 = 6 s +
2 = 8 s +
3 = 16 s +
4 = 30 s
  5 = 1 min +
6 = 5 min +
7 = 10 min +
8 = 30 min
+
19.2RemoteOnDurationint8u[val & 0x3] +
0 = 1 min +
1 = 5 min +
2 = 10 min +
3 = 15 min
20.1SelfTimerTimeint8u[val >> 6 & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
20.2SelfTimerShotCountint8u[val >> 1 & 0xf]
21.1PlaybackMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
21.2ImageReviewTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
22.1MenuMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
22.2ShootingInfoMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
23.1FlashShutterSpeedint8u[val & 0xf] + +
0 = 1/60 s +
1 = 1/30 s +
2 = 1/15 s +
3 = 1/8 s +
4 = 1/4 s +
5 = 1/2 s
  6 = 1 s +
7 = 2 s +
8 = 4 s +
9 = 8 s +
10 = 15 s +
11 = 30 s
+
24.1InternalFlashint8u[val >> 6 & 0x3] +
0 = TTL +
1 = Manual +
2 = Repeating Flash +
3 = Commander Mode
24.2ManualFlashOutputint8u[val & 0x1f]
25.1RepeatingFlashOutputint8u[val >> 4 & 0x7]
25.2RepeatingFlashCountint8u[val & 0xf]
26.1RepeatingFlashRateint8u[val >> 4 & 0xf]
31.1FlashWarningint8u[val >> 7 & 0x1] +
0 = On +
1 = Off
31.2CommanderInternalTTLCompint8u[val & 0x1f]
31.3ModelingFlashint8u[val >> 5 & 0x1] +
0 = On +
1 = Off
31.4AutoFPint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
32.1CommanderGroupA_TTLCompint8u[val & 0x1f]
33.1CommanderGroupB_TTLCompint8u[val & 0x1f]
34.1LiveViewAFint8u[val >> 6 & 0x3] +
0 = Face Priority +
1 = Wide Area +
2 = Normal Area
+ +

NikonCustom SettingsD3 Tags

+

Custom settings for the D3, D3S, D3X, D300 and D300S.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1CustomSettingsBankint8u[val & 0x3] +
0 = A +
1 = B +
2 = C +
3 = D
0.2CustomSettingsAllDefaultint8u("No" if any custom setting for this bank was changed from the default) +
[val >> 7 & 0x1] +
0 = Yes +
1 = No
1.1AF-CPrioritySelectionint8u[val >> 6 & 0x3] +
0 = Release +
1 = Release + Focus +
2 = Focus
1.2AF-SPrioritySelectionint8u[val >> 5 & 0x1] +
0 = Focus +
1 = Release
1.3AFPointSelectionint8u[val >> 4 & 0x1] +
0 = 51 Points +
1 = 11 Points
1.4DynamicAFAreaint8u[val >> 2 & 0x3] +
0 = 9 Points +
1 = 21 Points +
2 = 51 Points +
3 = 51 Points (3D-tracking)
1.5FocusTrackingLockOnint8u(not D3S) +
[val & 0x3] +
0 = Long +
1 = Normal +
2 = Short +
3 = Off
2.1AFActivationint8u[val >> 7 & 0x1] +
0 = Shutter/AF-On +
1 = AF-On Only
2.2FocusPointWrapint8u[val >> 3 & 0x1] +
0 = No Wrap +
1 = Wrap
2.3AFPointIlluminationint8u(D3) +
[val >> 5 & 0x3] +
0 = On in Continuous Shooting and Manual Focusing +
1 = On During Manual Focusing +
2 = On in Continuous Shooting Modes +
3 = Off +
(D300) +
[val >> 1 & 0x3] +
0 = Auto +
1 = Off +
2 = On
2.4AFPointBrightnessint8u(D3 only) +
[val >> 1 & 0x3] +
0 = Low +
1 = Normal +
2 = High +
3 = Extra High
2.5AFAssistint8u(D300 only) +
[val & 0x1] +
0 = On +
1 = Off
3.1AFOnButtonint8u(D3 only) +
[val & 0x7]
+
0 = AF On +
1 = AE/AF Lock +
2 = AE Lock Only +
3 = AE Lock (reset on release) +
4 = AE Lock (hold) +
5 = AF Lock Only
+
3.2VerticalAFOnButtonint8u(D3 only) +
[val >> 4 & 0x7]
+
0 = AF On +
1 = AE/AF Lock +
2 = AE Lock Only +
3 = AE Lock (reset on release) +
4 = AE Lock (hold) +
5 = AF Lock Only +
7 = Same as AF On
+
3.3AF-OnForMB-D10int8u(D300 only) +
[val >> 4 & 0x7]
+
0 = AF-On +
1 = AE/AF Lock +
2 = AE Lock Only +
3 = AE Lock (reset on release) +
4 = AE Lock (hold) +
5 = AF Lock Only +
6 = Same as FUNC Button
+
4.1FocusTrackingLockOnint8u(D3S only) +
[val & 0x7]
+ +
0 = 5 (Long) +
1 = 4 +
2 = 3 (Normal)
  3 = 2 +
4 = 1 (Short) +
5 = Off
+
4.2AssignBktButtonint8u(D3S only) +
[val >> 3 & 0x1] +
0 = Auto Bracketing +
1 = Multiple Exposure
4.3MultiSelectorLiveViewint8u(D3S only) +
[val >> 6 & 0x3] +
0 = Reset +
1 = Zoom On/Off +
2 = Start Movie Recording +
3 = Not Used
4.4InitialZoomLiveViewint8u(D3S only) +
[val >> 4 & 0x3] +
0 = Low Magnification +
1 = Medium Magnification +
2 = High Magnification
6.1ISOStepSizeint8u[val >> 6 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
6.2ExposureControlStepSizeint8u[val >> 4 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
6.3ExposureCompStepSizeint8u[val >> 2 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
6.4EasyExposureCompensationint8u[val & 0x3] +
0 = Off +
1 = On +
2 = On (auto reset)
7.1CenterWeightedAreaSizeint8u(D3) +
[val >> 5 & 0x7] +
0 = 8 mm +
1 = 12 mm +
2 = 15 mm +
3 = 20 mm +
4 = Average +
(D300) +
[val >> 5 & 0x7] +
0 = 6 mm +
1 = 8 mm +
2 = 10 mm +
3 = 13 mm +
4 = Average
7.2FineTuneOptCenterWeightedint8u[val & 0xf]
8.1FineTuneOptMatrixMeteringint8u[val >> 4 & 0xf]
8.2FineTuneOptSpotMeteringint8u[val & 0xf]
9.1MultiSelectorShootModeint8u[val >> 6 & 0x3] +
0 = Select Center Focus Point +
1 = Highlight Active Focus Point +
2 = Not Used
9.2MultiSelectorPlaybackModeint8u(all models except D3S) +
[val >> 4 & 0x3] +
0 = Thumbnail On/Off +
1 = View Histograms +
2 = Zoom On/Off +
3 = Choose Folder
9.3InitialZoomSettingint8u(D3) +
[val >> 2 & 0x3] +
0 = High Magnification +
1 = Medium Magnification +
2 = Low Magnification +
(D300) +
[val >> 2 & 0x3] +
0 = Low Magnification +
1 = Medium Magnification +
2 = High Magnification
9.4MultiSelectorint8u[val & 0x1] +
0 = Do Nothing +
1 = Reset Meter-off Delay
10.1ExposureDelayModeint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
10.2CLModeShootingSpeedint8u[val & 0x7]
10.3CHModeShootingSpeedint8u(D3 only) +
[val >> 4 & 0x3] +
0 = 9 fps +
1 = 10 fps +
2 = 11 fps
11MaxContinuousReleaseint8u 
12.1ReverseIndicatorsint8u[val >> 5 & 0x1] +
0 = + 0 - +
1 = - 0 +
12.2FileNumberSequenceint8u(D3) +
[val >> 1 & 0x1] +
0 = On +
1 = Off +
(D300) +
[val >> 3 & 0x1] +
0 = On +
1 = Off
12.3RearDisplayint8u(D3 only) +
[val >> 7 & 0x1] +
0 = ISO +
1 = Exposures Remaining
12.4ViewfinderDisplayint8u(D3 only) +
[val >> 6 & 0x1] +
0 = Frame Count +
1 = Exposures Remaining
12.5BatteryOrderint8u(D300 only) +
[val >> 2 & 0x1] +
0 = MB-D10 First +
1 = Camera Battery First
12.6MB-D10Batteriesint8u(D300 only) +
[val & 0x3] +
0 = LR6 (AA alkaline) +
1 = HR6 (AA Ni-MH) +
2 = FR6 (AA lithium) +
3 = ZR6 (AA Ni-Mn)
12.7ScreenTipsint8u[val >> 4 & 0x1] +
0 = On +
1 = Off
13.1Beepint8u[val >> 6 & 0x3] +
0 = High +
1 = Low +
2 = Off
13.2ShootingInfoDisplayint8u[val >> 4 & 0x3] +
0 = Auto +
1 = Auto +
2 = Manual (dark on light) +
3 = Manual (light on dark)
13.3GridDisplayint8u(D300 only) +
[val >> 1 & 0x1] +
0 = Off +
1 = On
13.4ViewfinderWarningint8u(D300 only) +
[val & 0x1] +
0 = On +
1 = Off
13.5MultiSelectorPlaybackModeint8u(D3S only) +
[val & 0x3] +
0 = Thumbnail On/Off +
1 = View Histograms +
2 = Zoom On/Off
14.1PreviewButton +
FuncButton
int8u
int8u
(D3) +
[val >> 3 & 0x1f]
+
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = Flash Off +
9 = Bracketing Burst +
10 = Matrix Metering +
11 = Center-weighted Metering +
12 = Spot Metering +
13 = Virtual Horizon +
15 = Playback +
16 = My Menu Top
+(D300) +
[val >> 3 & 0x1f]
+
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
9 = Flash Off +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top +
16 = + NEF (RAW)
+
14.2PreviewButtonPlusDials +
FuncButtonPlusDials
int8u
int8u
(D3) +
[val & 0x7]
+
0 = None +
1 = Choose Image Area (FX/DX/5:4) +
2 = One Step Speed/Aperture +
3 = Choose Non-CPU Lens Number +
5 = Choose Image Area (FX/DX) +
6 = Shooting Bank Menu +
7 = Dynamic AF Area
+(D300) +
[val & 0x7] +
0 = None +
2 = One Step Speed/Aperture +
3 = Choose Non-CPU Lens Number +
5 = Auto Bracketing +
6 = Dynamic AF Area
15.1FuncButton +
PreviewButton
int8u
int8u
(D3) +
[val >> 3 & 0x1f]
+
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = Flash Off +
9 = Bracketing Burst +
10 = Matrix Metering +
11 = Center-weighted Metering +
12 = Spot Metering +
13 = Virtual Horizon +
15 = Playback +
16 = My Menu Top
+(D300) +
[val >> 3 & 0x1f]
+
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
9 = Flash Off +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top +
16 = + NEF (RAW)
+
15.2FuncButtonPlusDials +
PreviewButtonPlusDials
int8u
int8u
(D3) +
[val & 0x7]
+
0 = None +
1 = Choose Image Area (FX/DX/5:4) +
2 = One Step Speed/Aperture +
3 = Choose Non-CPU Lens Number +
4 = Focus Point Selection +
5 = Choose Image Area (FX/DX) +
6 = Shooting Bank Menu +
7 = Dynamic AF Area
+(D300) +
[val & 0x7] +
0 = None +
2 = One Step Speed/Aperture +
3 = Choose Non-CPU Lens Number +
5 = Auto Bracketing +
6 = Dynamic AF Area
16.1AELockButtonint8u(D3) +
[val >> 3 & 0x1f]
+
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = Flash Off +
9 = Bracketing Burst +
10 = Matrix Metering +
11 = Center-weighted Metering +
12 = Spot Metering +
13 = Virtual Horizon +
14 = AF On +
15 = Playback +
16 = My Menu Top
+(D300) +
[val >> 3 & 0x1f]
+
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF On +
9 = Flash Off +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top +
16 = + NEF (RAW)
+
16.2AELockButtonPlusDialsint8u(D3) +
[val & 0x7]
+
0 = None +
1 = Choose Image Area (FX/DX/5:4) +
2 = One Step Speed/Aperture +
3 = Choose Non-CPU Lens Number +
5 = Choose Image Area (FX/DX) +
6 = Shooting Bank Menu +
7 = Dynamic AF Area
+(D300) +
[val & 0x7] +
0 = None +
3 = Choose Non-CPU Lens Number +
5 = Auto Bracketing +
6 = Dynamic AF Area
17.1CommandDialsReverseRotationint8u[val >> 7 & 0x1] +
0 = No +
1 = Yes
17.2CommandDialsChangeMainSubint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
17.3CommandDialsApertureSettingint8u[val >> 5 & 0x1] +
0 = Sub-command Dial +
1 = Aperture Ring
17.4CommandDialsMenuAndPlaybackint8u[val >> 4 & 0x1] +
0 = Off +
1 = On
17.5LCDIlluminationint8u[val >> 3 & 0x1] +
0 = Off +
1 = On
17.6PhotoInfoPlaybackint8u[val >> 2 & 0x1] +
0 = Info Up-down, Playback Left-right +
1 = Info Left-right, Playback Up-down
17.7ShutterReleaseButtonAE-Lint8u[val >> 1 & 0x1] +
0 = Off +
1 = On
17.8ReleaseButtonToUseDialint8u[val & 0x1] +
0 = No +
1 = Yes
18.1SelfTimerTimeint8u[val >> 3 & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
18.2MonitorOffTimeint8u[val & 0x7] +
0 = 10 s +
1 = 20 s +
2 = 1 min +
3 = 5 min +
4 = 10 min
20.1FlashSyncSpeedint8u(D3) +
[val >> 5 & 0x7]
+ +
0 = 1/250 s (auto FP) +
1 = 1/250 s +
2 = 1/200 s +
3 = 1/160 s
  4 = 1/125 s +
5 = 1/100 s +
6 = 1/80 s +
7 = 1/60 s
+(D300) +
[val >> 4 & 0xf]
+ +
0 = 1/320 s (auto FP) +
1 = 1/250 s (auto FP) +
2 = 1/250 s +
3 = 1/200 s +
4 = 1/160 s
  5 = 1/125 s +
6 = 1/100 s +
7 = 1/80 s +
8 = 1/60 s
+
20.2FlashShutterSpeedint8u[val & 0xf] + +
0 = 1/60 s +
1 = 1/30 s +
2 = 1/15 s +
3 = 1/8 s +
4 = 1/4 s +
5 = 1/2 s
  6 = 1 s +
7 = 2 s +
8 = 4 s +
9 = 8 s +
10 = 15 s +
11 = 30 s
+
21.1AutoBracketSetint8u(D3 and D300) +
[val >> 6 & 0x3] +
0 = AE & Flash +
1 = AE Only +
2 = Flash Only +
3 = WB Bracketing +
(D3S and D300S) +
[val >> 5 & 0x7] +
0 = AE & Flash +
1 = AE Only +
2 = Flash Only +
3 = WB Bracketing +
4 = ADL Bracketing
21.2AutoBracketModeMint8u(D3 and D300) +
[val >> 4 & 0x3] +
0 = Flash/Speed +
1 = Flash/Speed/Aperture +
2 = Flash/Aperture +
3 = Flash Only +
(D3S and D300S) +
[val >> 3 & 0x3] +
0 = Flash/Speed +
1 = Flash/Speed/Aperture +
2 = Flash/Aperture +
3 = Flash Only
21.3AutoBracketOrderint8u(D3 and D300) +
[val >> 3 & 0x1] +
0 = 0,-,+ +
1 = -,0,+ +
(D3S and D300S) +
[val >> 2 & 0x1] +
0 = 0,-,+ +
1 = -,0,+
21.4ModelingFlashint8u[val & 0x1] +
0 = On +
1 = Off
22.1NoMemoryCardint8u[val >> 7 & 0x1] +
0 = Release Locked +
1 = Enable Release
22.2MeteringTimeint8u[val & 0xf] + +
0 = 4 s +
1 = 6 s +
2 = 8 s +
3 = 16 s +
4 = 30 s
  5 = 1 min +
6 = 5 min +
7 = 10 min +
8 = 30 min +
9 = No Limit
+
23.1InternalFlashint8u[val >> 6 & 0x3] +
0 = TTL +
1 = Manual +
2 = Repeating Flash +
3 = Commander Mode
25.1ImageReviewTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
25.2PlaybackMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
26.1MenuMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
26.2ShootingInfoMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
+ +

NikonCustom SettingsD700 Tags

+

Custom settings for the D700.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1CustomSettingsBankint8u[val & 0x3] +
0 = A +
1 = B +
2 = C +
3 = D
0.2CustomSettingsAllDefaultint8u("No" if any custom setting for this bank was changed from the default) +
[val >> 7 & 0x1] +
0 = Yes +
1 = No
1.1AF-CPrioritySelectionint8u[val >> 6 & 0x3] +
0 = Release +
1 = Release + Focus +
2 = Focus
1.2AF-SPrioritySelectionint8u[val >> 5 & 0x1] +
0 = Focus +
1 = Release
1.3AFPointSelectionint8u[val >> 4 & 0x1] +
0 = 51 Points +
1 = 11 Points
1.4DynamicAFAreaint8u[val >> 2 & 0x3] +
0 = 9 Points +
1 = 21 Points +
2 = 51 Points +
3 = 51 Points (3D-tracking)
2.1AFActivationint8u[val >> 7 & 0x1] +
0 = Shutter/AF-On +
1 = AF-On Only
2.2FocusPointWrapint8u[val >> 3 & 0x1] +
0 = No Wrap +
1 = Wrap
2.3AFPointIlluminationint8u[val >> 1 & 0x3] +
0 = Auto +
1 = Off +
2 = On
2.4AFAssistint8u[val & 0x1] +
0 = On +
1 = Off
3.1FocusTrackingLockOnint8u[val & 0x7] + +
0 = 3 Normal +
1 = 4 +
2 = 5 Long
  3 = 2 +
4 = 1 Short +
5 = Off
+
3.2AF-OnForMB-D10int8u[val >> 4 & 0x7] +
0 = AF-On +
1 = AE/AF Lock +
2 = AE Lock Only +
3 = AE Lock (reset on release) +
4 = AE Lock (hold) +
5 = AF Lock Only +
6 = Same as FUNC Button
+
4.1ISOStepSizeint8u[val >> 6 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
4.2ExposureControlStepSizeint8u[val >> 4 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
4.3ExposureCompStepSizeint8u[val >> 2 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
4.4EasyExposureCompensationint8u[val & 0x3] +
0 = Off +
1 = On +
2 = On (auto reset)
5.1CenterWeightedAreaSizeint8u[val >> 4 & 0x7] +
0 = 8 mm +
1 = 12 mm +
2 = 15 mm +
3 = 20 mm +
4 = Average
6.1FineTuneOptMatrixMeteringint8u[val >> 4 & 0xf]
6.2FineTuneOptSpotMeteringint8u[val & 0xf]
7.1ShutterReleaseButtonAE-Lint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
7.2SelfTimerTimeint8u[val >> 4 & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
7.3MeteringTimeint8u[val & 0xf] + +
0 = 4 s +
1 = 6 s +
2 = 8 s +
3 = 16 s +
4 = 30 s
  5 = 1 min +
6 = 5 min +
7 = 10 min +
8 = 30 min +
9 = No Limit
+
8.1PlaybackMonitorOffTimeint8u[val >> 3 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
8.2MenuMonitorOffTimeint8u[val & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
9.1ShootingInfoMonitorOffTimeint8u[val >> 3 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
9.2ImageReviewTimeint8u[val & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
10.1Beepint8u[val >> 6 & 0x3] +
0 = High +
1 = Low +
2 = Off
10.2ShootingInfoDisplayint8u[val >> 4 & 0x3] +
0 = Auto +
1 = Auto +
2 = Manual (dark on light) +
3 = Manual (light on dark)
10.3LCDIlluminationint8u[val >> 3 & 0x1] +
0 = Off +
1 = On
10.4ExposureDelayModeint8u[val >> 2 & 0x1] +
0 = Off +
1 = On
10.5GridDisplayint8u[val >> 1 & 0x1] +
0 = Off +
1 = On
11.1FileNumberSequenceint8u[val >> 6 & 0x1] +
0 = On +
1 = Off
11.2CLModeShootingSpeedint8u[val & 0x7]
12MaxContinuousReleaseint8u 
13.1ScreenTipsint8u[val >> 3 & 0x1] +
0 = On +
1 = Off
13.2BatteryOrderint8u[val >> 2 & 0x1] +
0 = MB-D10 First +
1 = Camera Battery First
13.3MB-D10BatteryTypeint8u[val & 0x3] +
0 = LR6 (AA alkaline) +
1 = HR6 (AA Ni-MH) +
2 = FR6 (AA lithium) +
3 = ZR6 (AA Ni-Mn)
15.1FlashSyncSpeedint8u[val >> 4 & 0xf] + +
0 = 1/320 s (auto FP) +
1 = 1/250 s (auto FP) +
2 = 1/250 s +
3 = 1/200 s +
4 = 1/160 s
  5 = 1/125 s +
6 = 1/100 s +
7 = 1/80 s +
8 = 1/60 s
+
15.2FlashShutterSpeedint8u[val & 0xf] + +
0 = 1/60 s +
1 = 1/30 s +
2 = 1/15 s +
3 = 1/8 s +
4 = 1/4 s +
5 = 1/2 s
  6 = 1 s +
7 = 2 s +
8 = 4 s +
9 = 8 s +
10 = 15 s +
11 = 30 s
+
16.1FlashControlBuilt-inint8u[val >> 6 & 0x3] +
0 = TTL +
1 = Manual +
2 = Repeating Flash +
3 = Commander Mode
16.2ManualFlashOutputint8u[val & 0x1f]
17.1RepeatingFlashOutputint8u[val >> 4 & 0x7]
17.2RepeatingFlashCountint8u[val & 0xf]
18.1RepeatingFlashRateint8u[val >> 4 & 0xf]
18.2CommanderInternalTTLChannelint8u[val & 0x3] +
0 = 1 ch +
1 = 2 ch +
2 = 3 ch +
3 = 4 ch
20.1CommanderInternalTTLCompBuiltinint8u[val & 0x1f]
21.1CommanderInternalTTLCompGroupAint8u[val & 0x1f]
22.1CommanderInternalTTLCompGroupBint8u[val & 0x1f]
26.1AutoBracketSetint8u[val >> 6 & 0x3] +
0 = AE & Flash +
1 = AE Only +
2 = Flash Only +
3 = WB Bracketing
26.2AutoBracketModeMint8u[val >> 4 & 0x3] +
0 = Flash/Speed +
1 = Flash/Speed/Aperture +
2 = Flash/Aperture +
3 = Flash Only
26.3AutoBracketOrderint8u[val >> 3 & 0x1] +
0 = 0,-,+ +
1 = -,0,+
26.4ModelingFlashint8u[val & 0x1] +
0 = On +
1 = Off
27.1MultiSelectorShootModeint8u[val >> 6 & 0x3] +
0 = Select Center Focus Point +
1 = Highlight Active Focus Point +
2 = Not Used
27.2MultiSelectorPlaybackModeint8u[val >> 4 & 0x3] +
0 = Thumbnail On/Off +
1 = View Histograms +
2 = Zoom On/Off +
3 = Choose Folder
27.3InitialZoomSettingint8u[val >> 2 & 0x3] +
0 = Low Magnification +
1 = Medium Magnification +
2 = High Magnification
27.4MultiSelectorint8u[val & 0x1] +
0 = Do Nothing +
1 = Reset Meter-off Delay
28.1FuncButtonint8u[val >> 3 & 0x1f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
9 = Flash Off +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = My Menu Top +
15 = Live View +
16 = + NEF (RAW) +
17 = Virtual Horizon
+
29.1PreviewButtonint8u[val >> 3 & 0x1f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-ON +
9 = Flash Off +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = My Menu Top +
15 = Live View +
16 = + NEF (RAW) +
17 = Virtual Horizon
+
30.1AELockButtonint8u(D300) +
[val >> 3 & 0x1f]
+
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-ON +
9 = Flash Off +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = My Menu Top +
15 = Live View +
16 = + NEF (RAW) +
17 = Virtual Horizon
+
31.1FuncButtonPlusDialsint8u[val >> 4 & 0x7] +
0 = None +
1 = Choose Image Area +
2 = One Step Speed/Aperture +
3 = Choose Non-CPU Lens Number +
5 = Auto bracketing +
6 = Dynamic AF Area +
7 = Shutter speed & Aperture lock
+
31.2PreviewButtonPlusDialsint8u[val & 0x7] +
0 = None +
1 = Choose Image Area +
2 = One Step Speed/Aperture +
3 = Choose Non-CPU Lens Number +
5 = Auto bracketing +
6 = Dynamic AF Area +
7 = Shutter speed & Aperture lock
+
32.1AELockButtonPlusDialsint8u[val >> 4 & 0x7]
33.1CommandDialsReverseRotationint8u[val >> 7 & 0x1] +
0 = No +
1 = Yes
33.2CommandDialsChangeMainSubint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
33.3CommandDialsApertureSettingint8u[val >> 5 & 0x1] +
0 = Sub-command Dial +
1 = Aperture Ring
33.4CommandDialsMenuAndPlaybackint8u[val >> 4 & 0x1] +
0 = Off +
1 = On
33.5ReverseIndicatorsint8u[val >> 3 & 0x1] +
0 = + 0 - +
1 = - 0 +
33.6PhotoInfoPlaybackint8u[val >> 2 & 0x1] +
0 = Off +
1 = On
33.7NoMemoryCardint8u[val >> 1 & 0x1] +
0 = Release Locked +
1 = Enable Release
33.8ReleaseButtonToUseDialint8u[val & 0x1] +
0 = No +
1 = Yes
+ +

NikonCustom SettingsD800 Tags

+

Custom settings for the D800 and D800E.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
12.1AutoBracketingSetint8u[val >> 5 & 0x7] +
0 = AE & Flash +
1 = AE Only +
2 = Flash Only +
3 = WB Bracketing +
4 = Active D-Lighting
12.2AutoBracketOrderint8u[val >> 4 & 0x1] +
0 = 0,-,+ +
1 = -,0,+
12.3AutoBracketingModeint8u[val >> 2 & 0x3] +
0 = Flash/Speed +
1 = Flash/Speed/Aperture +
2 = Flash/Aperture +
3 = Flash Only
22.1FlashSyncSpeedint8u[val >> 4 & 0xf] + +
0 = 1/320 s (auto FP) +
1 = 1/250 s (auto FP) +
2 = 1/250 s +
3 = 1/200 s +
4 = 1/160 s
  5 = 1/125 s +
6 = 1/100 s +
7 = 1/80 s +
8 = 1/60 s
+
22.2FlashShutterSpeedint8u[val & 0xf] + +
0 = 1/60 s +
1 = 1/30 s +
2 = 1/15 s +
3 = 1/8 s +
4 = 1/4 s +
5 = 1/2 s
  6 = 1 s +
7 = 2 s +
8 = 4 s +
9 = 8 s +
10 = 15 s +
11 = 30 s
+
23.1FlashControlBuilt-inint8u[val >> 6 & 0x3] +
0 = TTL +
1 = Manual +
2 = Repeating Flash +
3 = Commander Mode
23.2ManualFlashOutputint8u[val & 0x1f]
24.1RepeatingFlashOutputint8u[val >> 4 & 0x7]
24.2RepeatingFlashCountint8u[val & 0xf]
25.1RepeatingFlashRateint8u[val >> 4 & 0xf]
25.2CommanderChannelint8u[val & 0x3]
27.1CommanderInternalFlashint8u[val >> 6 & 0x3] +
0 = TTL +
1 = Manual +
2 = Off
27.2CommanderInternalManualOutputint8u[val & 0x1f]
28.1CommanderGroupAModeint8u[val >> 6 & 0x3] +
0 = TTL +
1 = Auto Aperture +
2 = Manual +
3 = Off
28.2CommanderGroupAManualOutputint8u[val & 0x1f]
29.1CommanderGroupBModeint8u[val >> 6 & 0x3] +
0 = TTL +
1 = Auto Aperture +
2 = Manual +
3 = Off
29.2CommanderGroupBManualOutputint8u[val & 0x1f]
30.1ModelingFlashint8u[val >> 5 & 0x1] +
0 = On +
1 = Off
30.2CommanderInternalTTLCompint8u[val & 0x1f]
31.1CommanderGroupA_TTL-AACompint8u[val & 0x1f]
32.1CommanderGroupB_TTL-AACompint8u[val & 0x1f]
+ +

NikonCustom SettingsD810 Tags

+

Custom settings for the D810.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1LightSwitchint8u[val >> 3 & 0x1] +
0 = LCD Backlight +
1 = LCD Backlight and Shooting Information
0.2CustomSettingsBankint8u[val & 0x3] +
0 = A +
1 = B +
2 = C +
3 = D
1.1AF-CPrioritySelectionint8u[val >> 6 & 0x3] +
0 = Release +
1 = Release + Focus +
2 = Focus
1.2AF-SPrioritySelectionint8u[val >> 5 & 0x1] +
0 = Focus +
1 = Release
1.3AFPointSelectionint8u[val >> 4 & 0x1] +
0 = 51 Points +
1 = 11 Points
1.4FocusTrackingLockOnint8u[val & 0x7] + +
0 = Off +
1 = 1 (Short) +
2 = 2
  3 = 3 (Normal) +
4 = 4 +
5 = 5 (Long)
+
2.1AFActivationint8u[val >> 7 & 0x1] +
0 = Shutter/AF-On +
1 = AF-On Only
2.2FocusPointWrapint8u[val >> 3 & 0x1] +
0 = No Wrap +
1 = Wrap
2.3AFPointBrightnessint8u[val >> 1 & 0x3] +
0 = Auto +
1 = On +
2 = Off
2.4AFAssistint8u[val & 0x1] +
0 = On +
1 = Off
3.1BatteryOrderint8u[val >> 6 & 0x1] +
0 = MB-D12 First +
1 = Camera Battery First
3.2MB-D12BatteryTypeint8u[val & 0x3] +
0 = LR6 (AA alkaline) +
1 = HR6 (AA Ni-MH) +
2 = FR6 (AA lithium)
4.1Pitchint8u[val >> 6 & 0x1] +
0 = High +
1 = Low
4.2NoMemoryCardint8u[val >> 5 & 0x1] +
0 = Release Locked +
1 = Enable Release
4.3ISODisplayint8u[val >> 2 & 0x3] +
0 = Show ISO/Easy ISO +
1 = Show ISO Sensitivity +
3 = Show Frame Count
4.4GridDisplayint8u[val >> 1 & 0x1] +
0 = On +
1 = Off
5.1ShootingInfoDisplayint8u[val >> 6 & 0x3] +
0 = Not Set +
1 = Auto +
2 = Manual (dark on light) +
3 = Manual (light on dark)
5.2LCDIlluminationint8u[val >> 5 & 0x1] +
0 = Off +
1 = On
5.3ElectronicFront-CurtainShutterint8u[val >> 3 & 0x1] +
0 = Off +
1 = On
5.4ScreenTipsint8u[val >> 2 & 0x1] +
0 = Off +
1 = On
5.5Beepint8u[val & 0x3] +
0 = Off +
1 = Low +
2 = Medium +
3 = High
6.1ReverseIndicatorsint8u[val >> 7 & 0x1] +
0 = + 0 - +
1 = - 0 +
6.2CommandDialsReverseRotationint8u[val >> 3 & 0x3] +
0 = No +
1 = Shutter Speed & Aperture +
2 = Exposure Compensation +
3 = Exposure Compensation, Shutter Speed & Aperture
6.3EasyExposureCompensationint8u[val & 0x3] +
0 = Off +
1 = On +
2 = On (auto reset)
7.1ExposureControlStepSizeint8u[val >> 6 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
7.2ISOStepSizeint8u[val >> 4 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
7.3ExposureCompStepSizeint8u[val >> 2 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
8.1CenterWeightedAreaSizeint8u[val >> 5 & 0x7] +
0 = 8 mm +
1 = 12 mm +
2 = 15 mm +
3 = 20 mm +
4 = Average
8.2FineTuneOptMatrixMeteringint8u[val & 0xf]
9.1FineTuneOptCenterWeightedint8u[val >> 4 & 0xf]
9.2FineTuneOptSpotMeteringint8u[val & 0xf]
10.1MultiSelectorShootModeint8u[val >> 6 & 0x3] +
0 = Select Center Focus Point (Reset) +
1 = Highlight Active Focus Point +
2 = Preset Focus Point (Pre) +
3 = Not Used (None)
10.2MultiSelectorPlaybackModeint8u[val >> 4 & 0x3] +
0 = Thumbnail On/Off +
1 = View Histograms +
2 = Zoom On/Off +
3 = Choose Folder
10.3MultiSelectorint8u[val & 0x1] +
0 = Do Nothing +
1 = Reset Meter-off Delay
11.1ExposureDelayModeint8u[val >> 6 & 0x3] +
0 = Off +
1 = 1 s +
2 = 2 s +
3 = 3 s
11.2CLModeShootingSpeedint8u[val & 0xf]
12.1MaxContinuousReleaseint8u 
13.1AutoBracketSetint8u[val >> 5 & 0x7] +
0 = AE & Flash +
1 = AE Only +
2 = Flash Only +
3 = WB Bracketing +
4 = Active D-Lighting
13.2AutoBracketOrderint8u[val >> 4 & 0x1] +
0 = 0,-,+ +
1 = -,0,+
13.3AutoBracketModeMint8u[val >> 2 & 0x3] +
0 = Flash/Speed +
1 = Flash/Speed/Aperture +
2 = Flash/Aperture +
3 = Flash Only
14.1FuncButtonint8u[val & 0x1f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
19 = Grid Display +
20 = My Menu +
21 = Disable Synchronized Release +
22 = Remote Release Only +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering
+
15.1PreviewButtonint8u[val & 0x1f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
19 = Grid Display +
20 = My Menu +
21 = Disable Synchronized Release +
22 = Remote Release Only +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering
+
16.1AssignBktButtonint8u[val & 0x7] +
0 = Auto Bracketing +
1 = Multiple Exposure +
2 = HDR (high dynamic range) +
3 = None
17.1AELockButtonint8u[val & 0x1f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
19 = Grid Display +
20 = My Menu +
21 = Disable Synchronized Release +
22 = Remote Release Only +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering
+
18.1CommandDialsChangeMainSubint8u[val >> 5 & 0x7] +
0 = Autofocus Off, Exposure Off +
1 = Autofocus Off, Exposure On +
2 = Autofocus Off, Exposure On (Mode A) +
4 = Autofocus On, Exposure Off +
5 = Autofocus On, Exposure On +
6 = Autofocus On, Exposure On (Mode A)
+
18.2CommandDialsMenuAndPlaybackint8u[val >> 3 & 0x3] +
0 = On +
1 = Off +
2 = On (Image Review Excluded)
18.3CommandDialsApertureSettingint8u[val >> 2 & 0x1] +
0 = Sub-command Dial +
1 = Aperture Ring
18.4ShutterReleaseButtonAE-Lint8u[val >> 1 & 0x1] +
0 = Off +
1 = On
18.5ReleaseButtonToUseDialint8u[val & 0x1] +
0 = No +
1 = Yes
19.1StandbyTimerint8u[val >> 4 & 0xf] + + +
0 = 4 s +
1 = 6 s +
3 = 10 s
  5 = 30 s +
6 = 1 min +
7 = 5 min
  8 = 10 min +
9 = 30 min +
10 = No Limit
+
20.1SelfTimerTimeint8u[val >> 6 & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
20.2SelfTimerShotIntervalint8u[val >> 4 & 0x3] +
0 = 0.5 s +
1 = 1 s +
2 = 2 s +
3 = 3 s
20.3SelfTimerShotCountint8u[val & 0xf]
21.1ImageReviewMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 2 s +
1 = 4 s +
3 = 10 s +
4 = 20 s
  5 = 1 min +
6 = 5 min +
7 = 10 min
+
21.2LiveViewMonitorOffTimeint8u[val >> 2 & 0x7] + +
1 = 5 min +
2 = 10 min +
3 = 15 min
  4 = 20 min +
5 = 30 min +
6 = No Limit
+
22.1MenuMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
2 = 10 s +
4 = 20 s
  5 = 1 min +
6 = 5 min +
7 = 10 min
+
22.2ShootingInfoMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 4 s +
2 = 10 s +
4 = 20 s
  5 = 1 min +
6 = 5 min +
7 = 10 min
+
23.1FlashSyncSpeedint8u[val >> 4 & 0xf] + +
0 = 1/320 s (auto FP) +
2 = 1/250 s (auto FP) +
3 = 1/250 s +
5 = 1/200 s +
6 = 1/160 s
  7 = 1/125 s +
8 = 1/100 s +
9 = 1/80 s +
10 = 1/60 s
+
23.2FlashShutterSpeedint8u[val & 0xf] + +
0 = 1/60 s +
1 = 1/30 s +
2 = 1/15 s +
3 = 1/8 s +
4 = 1/4 s +
5 = 1/2 s
  6 = 1 s +
7 = 2 s +
8 = 4 s +
9 = 8 s +
10 = 15 s +
11 = 30 s
+
24.1FlashControlBuilt-inint8u[val >> 6 & 0x3] +
0 = TTL +
1 = Manual +
2 = Repeating Flash +
3 = Commander Mode
31.1ModelingFlashint8u[val >> 5 & 0x1] +
0 = On +
1 = Off
36.1PlaybackMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
37.1MultiSelectorLiveViewint8u[val >> 6 & 0x3] +
0 = Reset +
1 = Zoom +
3 = Not Used
38.1ShutterSpeedLockint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
38.2ApertureLockint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
38.3MovieShutterButtonint8u[val >> 5 & 0x1] +
0 = Take Photo +
1 = Record Movies
38.4FlashExposureCompAreaint8u[val >> 2 & 0x1] +
0 = Entire frame +
1 = Background only
40.1MovieAELockButtonAssignmentint8u[val & 0xf] +
0 = None +
3 = Index Marking +
4 = View Photo Shooting Info +
5 = AE/AF Lock +
6 = AE Lock Only +
7 = AE Lock (hold) +
8 = AF Lock Only
+
41.1MovieFunctionButtonint8u[val >> 4 & 0x7] +
0 = None +
1 = Power Aperture (open) +
3 = Index Marking +
4 = View Photo Shooting Info
41.2MoviePreviewButtonint8u[val & 0x7] +
0 = None +
2 = Power Aperture (open) +
3 = Index Marking +
4 = View Photo Shooting Info
42.1FuncButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area (FX/DX/5:4) +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
8 = Exposure Delay Mode
+
43.1PreviewButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area (FX/DX/5:4) +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
8 = Exposure Delay Mode
+
44.1AELockButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area (FX/DX/5:4) +
2 = Shutter Speed & Aperture Lock +
4 = Choose Non-CPU Lens Number +
8 = Exposure Delay Mode
45.1AssignMovieRecordButtonint8u[val & 0xf] +
0 = None +
1 = Choose Image Area (FX/DX/5:4) +
2 = Shutter Speed & Aperture Lock +
9 = White Balance +
10 = ISO Sensitivity
46.1FineTuneOptHighlightWeightedint8u[val & 0xf]
47.1DynamicAreaAFDisplayint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
47.2AFPointIlluminationint8u[val >> 6 & 0x1] +
0 = Off +
1 = On During Manual Focusing
47.3StoreByOrientationint8u[val >> 3 & 0x3] +
0 = Off +
1 = Focus Point +
2 = Focus Point and AF-area mode
47.4GroupAreaAFIlluminationint8u[val >> 2 & 0x1] +
0 = Squares +
1 = Dots
48.1MatrixMeteringint8u[val >> 7 & 0x1] +
0 = Face Detection On +
1 = Face Detection Off
48.2LiveViewButtonOptionsint8u[val >> 4 & 0x3] +
0 = Enable +
2 = Disable
48.3AFModeRestrictionsint8u[val & 0x3] +
0 = No Restrictions +
1 = AF-C +
2 = AF-S
49.1LimitAFAreaModeSelectionint8u[val >> 1 & 0x3f] +
0x0 = No Restrictions +
Bit 0 = Auto-area +
Bit 1 = Group-area +
Bit 2 = 3D-tracking +
Bit 3 = Dynamic area (51 points) +
Bit 4 = Dynamic area (21 points) +
Bit 5 = Dynamic area (9 points)
+
50.1AF-OnForMB-D12int8u[val & 0x7] + +
0 = AE/AF Lock +
1 = AE Lock Only +
2 = AF Lock Only +
3 = AE Lock (hold)
  4 = AE Lock (reset) +
5 = AF-On +
6 = FV Lock +
7 = Same As Fn Button
+
51.1AssignRemoteFnButtonint8u[val & 0x1f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
7 = AF Lock Only +
8 = AF-On +
16 = +NEF(RAW) +
25 = Live View +
26 = Flash Disable/Enable
+
52.1LensFocusFunctionButtonsint8u[val & 0x3f] +
3 = AE/AF Lock +
4 = AE Lock Only +
7 = AF Lock Only +
21 = Disable Synchronized Release +
22 = Remote Release Only +
24 = Preset focus Point +
26 = Flash Disable/Enable +
32 = AF-Area Mode: Single-point AF +
33 = AF-Area Mode: Dynamic-area AF (9 points) +
34 = AF-Area Mode: Dynamic-area AF (21 points) +
35 = AF-Area Mode: Dynamic-area AF (51 points) +
36 = AF-Area Mode: Group-area AF +
37 = AF-Area Mode: Auto area AF
+
+ +

NikonCustom SettingsD850 Tags

+

Custom settings for the D850.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.2CustomSettingsBankint8u[val & 0x3] +
0 = A +
1 = B +
2 = C +
3 = D
1.1AF-CPrioritySelectionint8u[val >> 6 & 0x3] +
0 = Release +
1 = Release + Focus +
2 = Focus +
3 = Focus + Release
1.2AF-SPrioritySelectionint8u[val >> 5 & 0x1] +
0 = Focus +
1 = Release
1.3AFPointSelectionint8u[val >> 4 & 0x1] +
0 = 55 Points +
1 = 15 Points
1.4Three-DTrackingFaceDetectionint8u[val >> 3 & 0x1] +
0 = Off +
1 = On
1.5BlockShotAFResponseint8u[val & 0x7] +
1 = 1 (Quick) +
2 = 2 +
3 = 3 (Normal) +
4 = 4 +
5 = 5 (Delay)
2.1FocusPointWrapint8u[val >> 3 & 0x1] +
0 = No Wrap +
1 = Wrap
2.2AFPointBrightnessint8u[val >> 1 & 0x3] +
0 = Auto +
1 = On +
2 = Off
4.1ISODisplayint8u[val >> 3 & 0x1] +
0 = Show ISO Sensitivity +
1 = Show Frame Count
4.2GridDisplayint8u[val >> 1 & 0x1] +
0 = On +
1 = Off
5.1LCDIlluminationint8u[val >> 5 & 0x1] +
0 = Off +
1 = On
5.2ElectronicFront-CurtainShutterint8u[val >> 3 & 0x1] +
0 = Off +
1 = On
6.1ReverseIndicatorsint8u[val >> 7 & 0x1] +
0 = + 0 - +
1 = - 0 +
6.2CommandDialsReverseRotationint8u[val >> 3 & 0x3] +
0 = No +
1 = Shutter Speed & Aperture +
2 = Exposure Compensation +
3 = Exposure Compensation, Shutter Speed & Aperture
6.3EasyExposureCompensationint8u[val & 0x3] +
0 = Off +
1 = On +
2 = On (Auto Reset)
7.1ExposureControlStepSizeint8u[val >> 6 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
7.2ISOStepSizeint8u[val >> 4 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
7.3ExposureCompStepSizeint8u[val >> 2 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
8.1CenterWeightedAreaSizeint8u[val >> 5 & 0x7] +
0 = 8 mm +
1 = 12 mm +
2 = 15 mm +
3 = 20 mm +
4 = Average
8.2FineTuneOptMatrixMeteringint8u[val & 0xf]
9.1FineTuneOptCenterWeightedint8u[val >> 4 & 0xf]
9.2FineTuneOptSpotMeteringint8u[val & 0xf]
10.1MultiSelectorShootModeint8u[val >> 5 & 0x7] +
0 = Select Center Focus Point (Reset) +
2 = Preset Focus Point (Pre) +
3 = Highlight Active Focus Point +
4 = Not Used (None)
10.2MultiSelectorPlaybackModeint8u[val >> 2 & 0x3] +
0 = Thumbnail On/Off +
1 = View Histograms +
2 = Zoom On/Off +
3 = Choose Folder
10.3MultiSelectorint8u[val & 0x1] +
0 = Do Nothing +
1 = Reset Meter-off Delay
11.1ExposureDelayModeint8u[val >> 5 & 0x7] + +
0 = Off +
1 = 0.2 s +
2 = 0.5 s
  3 = 1 s +
4 = 2 s +
5 = 3 s
+
11.2CLModeShootingSpeedint8u[val & 0xf]
12.1MaxContinuousReleaseint8u 
13.1AutoBracketOrderint8u[val >> 4 & 0x1] +
0 = 0,-,+ +
1 = -,0,+
13.2AutoBracketModeMint8u[val >> 2 & 0x3] +
0 = Flash/Speed +
1 = Flash/Speed/Aperture +
2 = Flash/Aperture +
3 = Flash Only
14.1Func1Buttonint8u[val & 0x3f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
19 = Grid Display +
20 = My Menu +
22 = Remote Release Only +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 153 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 153 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only) +
56 = AF-Area Mode (Dynamic Area 9 Points) +
57 = AF-Area Mode + AF-On (Dynamic Area 9 Points)
15.1PreviewButtonint8u[val & 0x3f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
19 = Grid Display +
20 = My Menu +
22 = Remote Release Only +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 153 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 153 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only) +
56 = AF-Area Mode (Dynamic Area 9 Points) +
57 = AF-Area Mode + AF-On (Dynamic Area 9 Points)
16.1AssignBktButtonint8u[val & 0x7] +
0 = Auto Bracketing +
1 = Multiple Exposure +
2 = HDR (high dynamic range) +
3 = None
18.1CommandDialsChangeMainSubint8u[val >> 5 & 0x7] +
0 = Autofocus Off, Exposure Off +
1 = Autofocus Off, Exposure On +
2 = Autofocus Off, Exposure On (Mode A) +
4 = Autofocus On, Exposure Off +
5 = Autofocus On, Exposure On +
6 = Autofocus On, Exposure On (Mode A)
+
18.2CommandDialsMenuAndPlaybackint8u[val >> 3 & 0x3] +
0 = On +
1 = Off +
2 = On (Image Review Excluded)
18.3CommandDialsApertureSettingint8u[val >> 2 & 0x1] +
0 = Sub-command Dial +
1 = Aperture Ring
18.4ReleaseButtonToUseDialint8u[val & 0x1] +
0 = No +
1 = Yes
19.1StandbyTimerint8u[val >> 4 & 0xf] + + +
0 = 4 s +
1 = 6 s +
3 = 10 s
  5 = 30 s +
6 = 1 min +
7 = 5 min
  8 = 10 min +
9 = 30 min +
10 = No Limit
+
20.1SelfTimerTimeint8u[val >> 6 & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
20.2SelfTimerShotIntervalint8u[val >> 4 & 0x3] +
0 = 0.5 s +
1 = 1 s +
2 = 2 s +
3 = 3 s
20.3SelfTimerShotCountint8u[val & 0xf]
21.1ImageReviewMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 2 s +
1 = 4 s +
3 = 10 s +
4 = 20 s
  5 = 1 min +
6 = 5 min +
7 = 10 min
+
21.2LiveViewMonitorOffTimeint8u[val >> 2 & 0x7] + +
1 = 5 min +
2 = 10 min +
3 = 15 min
  4 = 20 min +
5 = 30 min +
6 = No Limit
+
22.1MenuMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
2 = 10 s +
4 = 20 s
  5 = 1 min +
6 = 5 min +
7 = 10 min
+
22.2ShootingInfoMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 4 s +
2 = 10 s +
4 = 20 s
  5 = 1 min +
6 = 5 min +
7 = 10 min
+
23.1FlashSyncSpeedint8u[val >> 4 & 0xf] + +
2 = 1/250 s (auto FP) +
3 = 1/250 s +
5 = 1/200 s +
6 = 1/160 s
  7 = 1/125 s +
8 = 1/100 s +
9 = 1/80 s +
10 = 1/60 s
+
23.2FlashShutterSpeedint8u[val & 0xf] + +
0 = 1/60 s +
1 = 1/30 s +
2 = 1/15 s +
3 = 1/8 s +
4 = 1/4 s +
5 = 1/2 s
  6 = 1 s +
7 = 2 s +
8 = 4 s +
9 = 8 s +
10 = 15 s +
11 = 30 s
+
31.1ModelingFlashint8u[val >> 5 & 0x1] +
0 = On +
1 = Off
36.1PlaybackMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
37.1MultiSelectorLiveViewint8u[val >> 6 & 0x3] +
0 = Reset +
1 = Zoom +
3 = Not Used
38.1ShutterSpeedLockint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
38.2ApertureLockint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
38.3MovieShutterButtonint8u[val >> 4 & 0x1] +
0 = Take Photo +
1 = Record Movies
38.4FlashExposureCompAreaint8u[val >> 2 & 0x1] +
0 = Entire Frame +
1 = Background Only
38.5AutoFlashISOSensitivityint8u[val >> 1 & 0x1] +
0 = Subject and Background +
1 = Subject Only
41.1MovieFunc1Buttonint8u[val >> 4 & 0xf] +
0 = None +
2 = Power Aperture (close) +
3 = Index Marking +
4 = View Photo Shooting Info +
11 = Exposure Compensation -
41.2MoviePreviewButtonint8u[val & 0xf] +
0 = None +
1 = Power Aperture (open) +
3 = Index Marking +
4 = View Photo Shooting Info +
10 = Exposure Compensation +
42.1Func1ButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
7 = Photo Shooting Menu Bank +
8 = Exposure Delay Mode
+
43.1PreviewButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
7 = Photo Shooting Menu Bank +
8 = Exposure Delay Mode
+
45.1AssignMovieRecordButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area +
2 = Shutter Speed & Aperture Lock +
7 = Photo Shooting Menu Bank +
11 = Exposure Mode
46.1FineTuneOptHighlightWeightedint8u[val & 0xf]
47.1DynamicAreaAFDisplayint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
47.2AFPointIlluminationint8u[val >> 6 & 0x1] +
0 = Off +
1 = On During Manual Focusing
47.3StoreByOrientationint8u[val >> 3 & 0x3] +
0 = Off +
1 = Focus Point +
2 = Focus Point and AF-area Mode
48.1MatrixMeteringint8u[val >> 7 & 0x1] +
0 = Face Detection On +
1 = Face Detection Off
48.2LiveViewButtonOptionsint8u[val >> 4 & 0x3] +
0 = Enable +
1 = Enable (Standby Timer Active) +
2 = Disable
48.3AFModeRestrictionsint8u[val & 0x3] +
0 = No Restrictions +
1 = AF-C +
2 = AF-S
49.1LimitAFAreaModeSelectionint8u[val >> 1 & 0x3f] +
0x0 = No Restrictions +
Bit 0 = Auto-area +
Bit 1 = Group-area +
Bit 2 = 3D-tracking +
Bit 3 = Dynamic area (153 points) +
Bit 4 = Dynamic area (72 points) +
Bit 5 = Dynamic area (25 points)
+
52.1LensFocusFunctionButtonsint8u[val & 0x3f] +
3 = AE/AF Lock +
4 = AE Lock Only +
7 = AF Lock Only +
8 = AF-On +
24 = Preset Focus Point +
26 = Flash Disable/Enable +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 153 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 153 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only) +
56 = AF-Area Mode (Dynamic Area 9 Points) +
57 = AF-Area Mode + AF-On (Dynamic Area 9 Points)
66.1VerticalMultiSelectorint8u[val & 0xff] +
0x0 = Same as Multi-Selector with Info(U/D) & Playback(R/L) +
0x8 = Same as Multi-Selector with Info(R/L) & Playback(U/D) +
0x80 = Focus Point Selection
67.1AssignMB-D18FuncButtonint8u[val & 0x3f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
18 = Reset Focus Point +
19 = Grid Display +
20 = My Menu +
22 = Remote Release Only +
23 = Preset Focus Point +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 153 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 153 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only) +
54 = Highlight Active Focus Point +
56 = AF-Area Mode (Dynamic Area 9 Points) +
57 = AF-Area Mode + AF-On (Dynamic Area 9 Points)
68.1AssignMB-D18FuncButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
7 = Photo Shooting Menu Bank +
8 = Exposure Delay Mode +
10 = ISO Sensitivity +
11 = Exposure Mode +
12 = Exposure Compensation +
13 = Metering Mode
+
70.1AF-OnButtonint8u[val & 0x3f] +
0 = None +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 153 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 153 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
56 = AF-Area Mode (Dynamic Area 9 Points) +
57 = AF-Area Mode + AF-On (Dynamic Area 9 Points)
71.1SubSelectorint8u[val >> 7 & 0x1] +
0 = Focus Point Selection +
1 = Same as MultiSelector
72.1SubSelectorCenterint8u[val & 0x3f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
18 = Reset Focus Point +
19 = Grid Display +
20 = My Menu +
22 = Remote Release Only +
23 = Preset Focus Point +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 153 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 153 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only) +
54 = Highlight Active Focus Point +
56 = AF-Area Mode (Dynamic Area 9 Points) +
57 = AF-Area Mode + AF-On (Dynamic Area 9 Points)
73.1SubSelectorPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area +
2 = Shutter Speed & Aperture Lock +
4 = Choose Non-CPU Lens Number +
7 = Photo Shooting Menu Bank
74.1AssignMovieSubselectorint8u[val >> 4 & 0xf] +
0 = None +
3 = Index Marking +
4 = View Photo Shooting Info +
5 = AE/AF Lock +
6 = AE Lock (Only) +
7 = AE Lock (Hold) +
8 = AF Lock (Only)
+
75.1AssignMovieFunc1ButtonPlusDialsint8u[val >> 4 & 0x1] +
0 = None +
1 = Choose Image Area
75.2AssignMoviePreviewButtonPlusDialsint8u[val & 0x1] +
0 = None +
1 = Choose Image Area
76.1AssignMovieSubselectorPlusDialsint8u[val >> 4 & 0x1] +
0 = None +
1 = Choose Image Area
77.1SyncReleaseModeint8u[val >> 7 & 0x1] +
0 = No Sync +
1 = Sync
77.2ContinuousModeLiveViewint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
78.1Three-DTrackingWatchAreaint8u[val >> 7 & 0x1] +
0 = Wide +
1 = Normal
78.2SubjectMotionint8u[val >> 5 & 0x3] +
0 = Steady +
1 = Middle +
2 = Erratic
78.3AFActivationint8u[val >> 3 & 0x1] +
0 = Shutter/AF-On +
1 = AF-On Only
78.4ShutterReleaseButtonAE-Lint8u[val & 0x3] +
0 = Off +
1 = On (Half Press) +
2 = On (Burst Mode)
79.1AssignMB-D18AF-OnButtonint8u[val & 0x7f] +
0 = None +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 153 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 153 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
56 = AF-Area Mode (Dynamic Area 9 Points) +
57 = AF-Area Mode + AF-On (Dynamic Area 9 Points) +
100 = Same as Camera AF-On Button
80.1Func2Buttonint8u[val & 0x3f] +
0 = None +
15 = My Menu Top Item +
20 = My Menu +
55 = Rating
82.1AssignMovieFunc2Buttonint8u[val >> 4 & 0x7] +
0 = None +
3 = Index Marking +
4 = View Photo Shooting Info
+ +

NikonCustom SettingsD5000 Tags

+

Custom settings for the D5000.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1AFAreaModeSettingint8u[val >> 5 & 0x3] +
0 = Single Area +
1 = Dynamic Area +
2 = Auto-area +
3 = 3D-tracking (11 points)
0.2AFAssistint8u[val & 0x1] +
0 = On +
1 = Off
2.1Beepint8u[val >> 6 & 0x3] +
0 = Off +
1 = Low +
2 = High
2.2GridDisplayint8u[val >> 1 & 0x1] +
0 = On +
1 = Off
2.3ISODisplayint8u[val >> 3 & 0x1] +
0 = On +
1 = Off
2.4NoMemoryCardint8u[val >> 5 & 0x1] +
0 = Release Locked +
1 = Enable Release
3.1FileNumberSequenceint8u[val >> 3 & 0x1] +
0 = On +
1 = Off
4.1RangeFinderint8u[val >> 4 & 0x1] +
0 = Off +
1 = On
4.2DateImprintint8u[val >> 3 & 0x1] +
0 = Off +
1 = On
4.3ReverseIndicatorsint8u[val >> 7 & 0x1] +
0 = + 0 - +
1 = - 0 +
5.1EVStepSizeint8u[val >> 6 & 0x1] +
0 = 1/3 EV +
1 = 1/2 EV
9.1ExposureDelayModeint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
11.1AutoBracketSetint8u[val >> 6 & 0x3] +
0 = Exposure +
1 = Active D-Lighting +
2 = WB Bracketing
12.1TimerFunctionButtonint8u[val >> 3 & 0x7] + +
0 = Self-timer +
1 = Release Mode +
2 = Image Quality/Size +
3 = ISO
  4 = White Balance +
5 = Active D-Lighting +
6 = + NEF (RAW) +
7 = Auto Bracketing
+
15.1AELockButtonint8u[val >> 3 & 0x7] +
0 = AE/AF Lock +
1 = AE Lock Only +
2 = AF Lock Only +
3 = AE Lock (hold) +
4 = AF-ON
16.1ShutterReleaseButtonAE-Lint8u[val >> 1 & 0x1] +
0 = Off +
1 = On
16.2CommandDialsReverseRotationint8u[val >> 7 & 0x1] +
0 = No +
1 = Yes
17.1MeteringTimeint8u[val >> 4 & 0x7] +
0 = 4 s +
1 = 8 s +
2 = 20 s +
3 = 1 min +
4 = 30 min
17.2RemoteOnDurationint8u[val & 0x3] +
0 = 1 min +
1 = 5 min +
2 = 10 min +
3 = 15 min
18.1SelfTimerTimeint8u[val >> 6 & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
18.2SelfTimerShotCountint8u[val >> 1 & 0xf]
19.1ImageReviewTimeint8u[val >> 5 & 0x7] +
0 = 4 s +
1 = 8 s +
2 = 20 s +
3 = 1 min +
4 = 10 min
20.1PlaybackMenusTimeint8u[val >> 5 & 0x7] +
0 = 8 s +
1 = 12 s +
2 = 20 s +
3 = 1 min +
4 = 10 min
22.1InternalFlashint8u[val >> 6 & 0x3] +
0 = TTL +
1 = Manual
22.2ManualFlashOutputint8u[val & 0x1f]
32.1LiveViewAFint8u[val >> 5 & 0x3] +
0 = Face Priority +
1 = Wide Area +
2 = Normal Area +
3 = Subject Tracking
+ +

NikonCustom SettingsD5100 Tags

+

Custom settings for the D5100.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1AF-CPrioritySelectionint8u[val >> 7 & 0x1] +
0 = Release +
1 = Focus
1.1AFAssistint8u[val & 0x1] +
0 = On +
1 = Off
3.1Beepint8u[val >> 6 & 0x3] +
0 = Off +
1 = Low +
2 = High
3.2NoMemoryCardint8u[val >> 5 & 0x1] +
0 = Release Locked +
1 = Enable Release
3.3ISODisplayint8u[val >> 3 & 0x1] +
0 = On +
1 = Off
4.1FileNumberSequenceint8u[val >> 3 & 0x1] +
0 = On +
1 = Off
5.1RangeFinderint8u[val >> 4 & 0x1] +
0 = Off +
1 = On
5.2ReverseIndicatorsint8u[val >> 7 & 0x1] +
0 = + 0 - +
1 = - 0 +
6.1EVStepSizeint8u[val >> 6 & 0x1] +
0 = 1/3 EV +
1 = 1/2 EV
10.1ExposureDelayModeint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
12.1AutoBracketSetint8u[val >> 6 & 0x3] +
0 = Exposure +
1 = WB Bracketing +
2 = Active D-Lighting
13.1TimerFunctionButtonint8u[val >> 3 & 0x7] + +
0 = Self-timer +
1 = Release Mode +
2 = Image Quality/Size +
3 = ISO
  4 = White Balance +
5 = Active D-Lighting +
6 = + NEF (RAW) +
7 = Auto Bracketing
+
16.1AELockButtonint8u[val >> 3 & 0x7] +
0 = AE/AF Lock +
1 = AE Lock Only +
2 = AF Lock Only +
3 = AE Lock (hold) +
4 = AF-ON
17.1ShutterReleaseButtonAE-Lint8u[val >> 1 & 0x1] +
0 = Off +
1 = On
17.2CommandDialsReverseRotationint8u[val >> 7 & 0x1] +
0 = No +
1 = Yes
18.1MeteringTimeint8u[val >> 4 & 0x7] +
0 = 4 s +
1 = 8 s +
2 = 20 s +
3 = 1 min +
4 = 30 min
18.2RemoteOnDurationint8u[val & 0x3] +
0 = 1 min +
1 = 5 min +
2 = 10 min +
3 = 20 min
19.1SelfTimerTimeint8u[val >> 6 & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
19.2SelfTimerShotCountint8u[val & 0xf]
20.1ImageReviewTimeint8u[val >> 5 & 0x7] +
0 = 4 s +
1 = 8 s +
2 = 20 s +
3 = 1 min +
4 = 10 min
20.2LiveViewMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 3 min +
1 = 5 min +
2 = 10 min
  3 = 15 min +
4 = 20 min +
5 = 30 min
+
21.1PlaybackMenusTimeint8u[val >> 5 & 0x7] +
0 = 8 s +
1 = 12 s +
2 = 20 s +
3 = 1 min +
4 = 10 min
23.1ManualFlashOutputint8u[val & 0x1f]
+ +

NikonCustom SettingsD5200 Tags

+

Custom settings for the D5200.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1AF-CPrioritySelectionint8u[val >> 7 & 0x1] +
0 = Release +
1 = Focus
0.2NumberOfFocusPointsint8u[val >> 4 & 0x1] +
0 = 39 Points +
1 = 11 Points
1.1AFAssistint8u[val & 0x1] +
0 = On +
1 = Off
3.1Beepint8u[val >> 6 & 0x3] +
0 = Off +
1 = Low +
2 = High
3.2NoMemoryCardint8u[val >> 5 & 0x1] +
0 = Release Locked +
1 = Enable Release
3.3ISODisplayint8u[val >> 3 & 0x1] +
0 = On +
1 = Off
4.1FileNumberSequenceint8u[val >> 3 & 0x1] +
0 = On +
1 = Off
5.1RangeFinderint8u[val >> 2 & 0x1] +
0 = Off +
1 = On
5.2ReverseExposureCompDialint8u[val >> 4 & 0x1] +
0 = No +
1 = Yes
5.3ReverseShutterSpeedApertureint8u[val >> 3 & 0x1] +
0 = No +
1 = Yes
5.4ReverseIndicatorsint8u[val >> 7 & 0x1] +
0 = + 0 - +
1 = - 0 +
6.1EVStepSizeint8u[val >> 6 & 0x1] +
0 = 1/3 EV +
1 = 1/2 EV
10.1ExposureDelayModeint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
12.1AutoBracketSetint8u[val >> 6 & 0x3] +
0 = Exposure +
1 = WB Bracketing +
2 = Active D-Lighting
13.1FunctionButtonint8u[val & 0x1f] + +
3 = AE/AF Lock +
4 = AE Lock Only +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-ON +
16 = + NEF (RAW) +
18 = Active D-Lighting
  25 = Live View +
26 = Image Quality +
27 = ISO +
28 = White Balance +
29 = HDR +
30 = Auto Bracketing +
31 = AF-area Mode
+
16.1AELockButtonint8u[val & 0xf] +
3 = AE/AF Lock +
4 = AE Lock Only +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-ON
17.1ShutterReleaseButtonAE-Lint8u[val >> 1 & 0x1] +
0 = Off +
1 = On
18.1StandbyTimerint8u[val >> 5 & 0x7] +
0 = 4 s +
1 = 8 s +
2 = 20 s +
3 = 1 min +
4 = 30 min
18.2RemoteOnDurationint8u[val & 0x3] +
0 = 1 min +
1 = 5 min +
2 = 10 min +
3 = 15 min
19.1SelfTimerTimeint8u[val >> 6 & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
19.2SelfTimerShotCountint8u[val & 0xf]
20.1ImageReviewTimeint8u[val >> 5 & 0x7] +
1 = 4 s +
2 = 8 s +
4 = 20 s +
5 = 1 min +
7 = 10 min
20.2LiveViewMonitorOffTimeint8u[val >> 2 & 0x7] +
1 = 5 min +
2 = 10 min +
3 = 15 min +
4 = 20 min +
5 = 30 min
21.1PlaybackMenusTimeint8u[val >> 5 & 0x7] +
1 = 8 s +
4 = 20 s +
5 = 1 min +
6 = 5 min +
7 = 10 min
23.1InternalFlashint8u[val >> 6 & 0x3] +
0 = TTL +
1 = Manual
23.2ManualFlashOutputint8u[val & 0x1f]
+ +

NikonCustom SettingsD7000 Tags

+

Custom settings for the D7000.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1AF-CPrioritySelectionint8u[val >> 7 & 0x1] +
0 = Release +
1 = Focus
0.2AF-SPrioritySelectionint8u[val >> 5 & 0x1] +
0 = Focus +
1 = Release
0.3NumberOfFocusPointsint8u[val >> 4 & 0x1] +
0 = 39 Points +
1 = 11 Points
0.4FocusTrackingLockOnint8u[val & 0x7] + +
0 = Off +
1 = 1 Short +
2 = 2
  3 = 3 Normal +
4 = 4 +
5 = 5 Long
+
1.1FocusPointWrapint8u[val >> 3 & 0x1] +
0 = No Wrap +
1 = Wrap
1.2AFPointIlluminationint8u[val >> 1 & 0x3] +
0 = Auto +
1 = On +
2 = Off
1.3AFAssistint8u[val & 0x1] +
0 = On +
1 = Off
2.1BatteryOrderint8u[val >> 6 & 0x1] +
0 = MB-D11 First +
1 = Camera Battery First
2.2AF-OnForMB-D11int8u[val >> 2 & 0x7] + +
0 = AE/AF Lock +
1 = AE Lock Only +
2 = AF Lock Only +
3 = AE Lock (hold)
  4 = AF-ON +
5 = FV Lock +
6 = Same as FUNC Button
+
2.3MB-D11BatteryTypeint8u[val & 0x3] +
0 = LR6 (AA alkaline) +
1 = Ni-MH (AA Ni-MH) +
2 = FR6 (AA lithium)
3.1BeepPitchint8u[val >> 6 & 0x3] +
0 = Off +
1 = Low +
2 = High
3.2NoMemoryCardint8u[val >> 5 & 0x1] +
0 = Release Locked +
1 = Enable Release
3.3ISODisplayint8u[val >> 2 & 0x3] +
0 = Show ISO/Easy ISO +
1 = Show ISO Sensitivity +
3 = Show Frame Count
3.4GridDisplayint8u[val >> 1 & 0x1] +
0 = On +
1 = Off
3.5ViewfinderWarningint8u[val & 0x1] +
0 = On +
1 = Off
4.1ShootingInfoDisplayint8u[val >> 6 & 0x3] +
0 = Auto +
2 = Manual (dark on light) +
3 = Manual (light on dark)
4.2LCDIlluminationint8u[val >> 5 & 0x1] +
0 = Off +
1 = On
4.3FileNumberSequenceint8u[val >> 3 & 0x1] +
0 = On +
1 = Off
4.4ScreenTipsint8u[val >> 2 & 0x1] +
0 = Off +
1 = On
4.5BeepVolumeint8u[val & 0x3] +
0 = Off +
1 = 1 +
2 = 2 +
3 = 3
5.1ReverseIndicatorsint8u[val >> 7 & 0x1] +
0 = + 0 - +
1 = - 0 +
5.2EasyExposureCompensationint8u[val & 0x3] +
0 = Off +
1 = On +
2 = On Auto Reset
6.1ExposureControlStepint8u[val >> 6 & 0x1] +
0 = 1/3 EV +
1 = 1/2 EV
6.2ISOSensitivityStepint8u[val >> 4 & 0x1] +
0 = 1/3 EV +
1 = 1/2 EV
7.1CenterWeightedAreaSizeint8u[val >> 5 & 0x7] +
0 = 6 mm +
1 = 8 mm +
2 = 10 mm +
3 = 13 mm +
4 = Average
10.1ExposureDelayModeint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
10.2CLModeShootingSpeedint8u[val & 0x7]
11MaxContinuousReleaseint8u 
12.1AutoBracketSetint8u[val >> 5 & 0x7] +
0 = AE & Flash +
1 = AE Only +
2 = Flash Only +
3 = WB Bracketing +
4 = Active D-Lighting
12.2AutoBracketOrderint8u[val >> 4 & 0x1] +
0 = 0,-,+ +
1 = -,0,+
13.1FuncButtonint8u[val >> 3 & 0x1f] +
0 = Grid Display +
1 = FV Lock +
2 = Flash Off +
3 = Matrix Metering +
4 = Center-weighted Metering +
5 = Spot Metering +
6 = My Menu Top +
7 = + NEF (RAW) +
8 = Active D-Lighting +
9 = Preview +
10 = AE/AF Lock +
11 = AE Lock Only +
12 = AF Lock Only +
13 = AE Lock (hold) +
14 = Bracketing Burst +
15 = Playback +
16 = 1EV Step Speed/Aperture +
17 = Choose Non-CPU Lens +
18 = Virtual Horizon +
19 = Start Movie Recording
+
14.1PreviewButtonint8u[val >> 3 & 0x1f] +
0 = Grid Display +
1 = FV Lock +
2 = Flash Off +
3 = Matrix Metering +
4 = Center-weighted Metering +
5 = Spot Metering +
6 = My Menu Top +
7 = + NEF (RAW) +
8 = Active D-Lighting +
9 = Preview +
10 = AE/AF Lock +
11 = AE Lock Only +
12 = AF Lock Only +
13 = AE Lock (hold) +
14 = Bracketing Burst +
15 = Playback +
16 = 1EV Step Speed/Aperture +
17 = Choose Non-CPU Lens +
18 = Virtual Horizon +
19 = Start Movie Recording
+
15.1OKButtonint8u[val >> 3 & 0x3] +
0 = Off +
1 = Select Center Focus Point +
2 = Highlight Active Focus Point +
3 = Not Used
16.1AELockButtonint8u[val >> 3 & 0x7] + +
0 = AE/AF Lock +
1 = AE Lock Only +
2 = AF Lock Only
  3 = AE Lock (hold) +
4 = AF-ON +
5 = FV Lock
+
17.1CommandDialsReverseRotationint8u[val >> 7 & 0x1] +
0 = No +
1 = Yes
17.2CommandDialsChangeMainSubint8u[val >> 5 & 0x3] +
0 = Off +
1 = On +
2 = On (A mode only)
17.3CommandDialsApertureSettingint8u[val >> 2 & 0x1] +
0 = Sub-command Dial +
1 = Aperture Ring
17.4CommandDialsMenuAndPlaybackint8u[val >> 3 & 0x3] +
0 = On +
1 = Off +
2 = On (Image Review Exclude)
17.5ShutterReleaseButtonAE-Lint8u[val >> 1 & 0x1] +
0 = Off +
1 = On
17.6ReleaseButtonToUseDialint8u[val & 0x1] +
0 = No +
1 = Yes
18.1MeteringTimeint8u[val >> 4 & 0xf] + +
0 = 4 s +
1 = 6 s +
2 = 8 s +
3 = 16 s +
4 = 30 s
  5 = 1 min +
6 = 5 min +
7 = 10 min +
8 = 30 min +
9 = No Limit
+
18.2RemoteOnDurationint8u[val & 0x3] +
0 = 1 min +
1 = 5 min +
2 = 10 min +
3 = 15 min
19.1SelfTimerTimeint8u[val >> 6 & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
19.2SelfTimerIntervalint8u[val >> 4 & 0x3] +
0 = 0.5 s +
1 = 1 s +
2 = 2 s +
3 = 3 s
19.3SelfTimerShotCountint8u[val & 0xf]
20.1ImageReviewTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
20.2LiveViewMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
21.1MenuMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
21.2ShootingInfoMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
22.1FlashSyncSpeedint8u[val >> 4 & 0xf] + +
0 = 1/320 s (auto FP) +
1 = 1/250 s (auto FP) +
2 = 1/250 s +
3 = 1/200 s +
4 = 1/160 s
  5 = 1/125 s +
6 = 1/100 s +
7 = 1/80 s +
8 = 1/60 s
+
22.2FlashShutterSpeedint8u[val & 0xf] + +
0 = 1/60 s +
1 = 1/30 s +
2 = 1/15 s +
3 = 1/8 s +
4 = 1/4 s +
5 = 1/2 s
  6 = 1 s +
7 = 2 s +
8 = 4 s +
9 = 8 s +
10 = 15 s +
11 = 30 s
+
23.1FlashControlBuilt-inint8u[val >> 6 & 0x3] +
0 = TTL +
1 = Manual +
2 = Repeating Flash +
3 = Commander Mode
23.2ManualFlashOutputint8u[val & 0x1f]
24.1RepeatingFlashOutputint8u[val >> 4 & 0x7]
24.2RepeatingFlashCountint8u[val & 0xf]
25.1RepeatingFlashRateint8u[val >> 4 & 0xf]
26.1CommanderInternalTTLCompBuiltinint8u[val & 0x1f]
27.1CommanderInternalTTLCompGroupAint8u[val & 0x1f]
28.1CommanderInternalTTLCompGroupBint8u[val & 0x1f]
30.1FlashWarningint8u[val >> 7 & 0x1] +
0 = On +
1 = Off
30.2ModelingFlashint8u[val >> 5 & 0x1] +
0 = On +
1 = Off
34.1LiveViewAFAreaModeint8u[val >> 5 & 0x3] +
0 = Face-Priority +
1 = NormalArea +
2 = WideArea +
3 = SubjectTracking
34.2LiveViewAFModeint8u[val >> 1 & 0x1] +
0 = AF-C +
1 = AF-F
35.1PlaybackMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
+ +

NikonCustom SettingsD4 Tags

+

Custom settings for the D4 and D4S.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1CustomSettingsBankint8u[val & 0x3] +
0 = A +
1 = B +
2 = C +
3 = D
1.1AF-CPrioritySelectionint8u[val >> 6 & 0x3] +
0 = Release +
1 = Release + Focus +
2 = Focus +
3 = Focus + Release
1.2AF-SPrioritySelectionint8u[val >> 5 & 0x1] +
0 = Focus +
1 = Release
1.3AFPointSelectionint8u[val >> 4 & 0x1] +
0 = 51 Points +
1 = 11 Points
1.4FocusTrackingLockOnint8u[val & 0x7] + +
0 = Off +
1 = 1 (Short) +
2 = 2
  3 = 3 (Normal) +
4 = 4 +
5 = 5 (Long)
+
2.1AFActivationint8u[val >> 7 & 0x1] +
0 = Shutter/AF-On +
1 = AF-On Only
2.2FocusPointWrapint8u[val >> 3 & 0x1] +
0 = No Wrap +
1 = Wrap
4.1Pitchint8u[val >> 6 & 0x1] +
0 = High +
1 = Low
4.2NoMemoryCardint8u[val >> 5 & 0x1] +
0 = Release Locked +
1 = Enable Release
4.3GridDisplayint8u[val >> 1 & 0x1] +
0 = On +
1 = Off
5.1ShootingInfoDisplayint8u[val >> 6 & 0x3] +
1 = Auto +
2 = Manual (dark on light) +
3 = Manual (light on dark)
5.2LCDIlluminationint8u[val >> 5 & 0x1] +
0 = Off +
1 = On
5.3ScreenTipsint8u[val >> 2 & 0x1] +
0 = Off +
1 = On
5.4Beepint8u[val & 0x3] +
0 = Off +
1 = Low +
2 = Medium +
3 = High
6.1ReverseIndicatorsint8u[val >> 7 & 0x1] +
0 = + 0 - +
1 = - 0 +
6.2RearDisplayint8u[val >> 6 & 0x1] +
0 = ISO +
1 = Exposures Remaining
6.3ViewfinderDisplayint8u[val >> 5 & 0x1] +
0 = Frame Count +
1 = Exposures Remaining
6.4CommandDialsReverseRotationint8u[val >> 3 & 0x3] +
0 = No +
1 = Shutter Speed & Aperture +
2 = Exposure Compensation +
3 = Exposure Compensation, Shutter Speed & Aperture
6.5EasyExposureCompensationint8u[val & 0x3] +
0 = Off +
1 = On +
2 = On (auto reset)
7.1ExposureControlStepSizeint8u[val >> 6 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
7.2ISOStepSizeint8u[val >> 4 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
7.3ExposureCompStepSizeint8u[val >> 2 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
8.1CenterWeightedAreaSizeint8u[val >> 5 & 0x7] +
0 = 8 mm +
1 = 12 mm +
2 = 15 mm +
3 = 20 mm +
4 = Average
8.2FineTuneOptMatrixMeteringint8u[val & 0xf]
9.1FineTuneOptCenterWeightedint8u[val >> 4 & 0xf]
9.2FineTuneOptSpotMeteringint8u[val & 0xf]
10.1MultiSelectorShootModeint8u[val >> 6 & 0x3] +
0 = Select Center Focus Point (Reset) +
2 = Preset Focus Point (Pre) +
3 = Not Used (None)
10.2MultiSelectorPlaybackModeint8u[val >> 4 & 0x3] +
0 = Thumbnail On/Off +
1 = View Histograms +
2 = Zoom On/Off +
3 = Choose Folder
10.3MultiSelectorint8u[val & 0x1] +
0 = Do Nothing +
1 = Reset Meter-off Delay
11.1ExposureDelayModeint8u[val >> 6 & 0x3] +
0 = Off +
1 = 1 s +
2 = 2 s +
3 = 3 s
11.2CHModeShootingSpeedint8u[val >> 4 & 0x1] +
0 = 10 fps +
1 = 11 fps
11.3CLModeShootingSpeedint8u[val & 0xf]
12MaxContinuousReleaseint8u 
13.1AutoBracketSetint8u[val >> 5 & 0x7] +
0 = AE & Flash +
1 = AE Only +
2 = Flash Only +
3 = WB Bracketing +
4 = Active D-Lighting
13.2AutoBracketOrderint8u[val >> 4 & 0x1] +
0 = 0,-,+ +
1 = -,0,+
13.3AutoBracketModeMint8u[val >> 2 & 0x3] +
0 = Flash/Speed +
1 = Flash/Speed/Aperture +
2 = Flash/Aperture +
3 = Flash Only
14.1FuncButtonint8u[val >> 3 & 0x1f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
18 = My Menu +
20 = Grid Display +
21 = Disable Synchronized Release +
22 = Remote Release Only +
26 = Flash Disable/Enable
+
14.2FuncButtonPlusDialsint8u[val & 0x7] +
0 = None +
1 = Choose Image Area (FX/DX/5:4) +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
6 = Shooting Bank Menu
+
15.1PreviewButtonint8u[val >> 3 & 0x1f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
18 = My Menu +
20 = Grid Display +
21 = Disable Synchronized Release +
22 = Remote Release Only +
26 = Flash Disable/Enable
+
15.2PreviewButtonPlusDialsint8u[val & 0x7] +
0 = None +
1 = Choose Image Area (FX/DX/5:4) +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
6 = Shooting Bank Menu
+
16.1AssignBktButtonint8u[val & 0x7] +
0 = Auto Bracketing +
1 = Multiple Exposure +
2 = HDR (high dynamic range) +
3 = None
18.1CommandDialsChangeMainSubint8u[val >> 5 & 0x7] +
0 = Autofocus Off, Exposure Off +
1 = Autofocus Off, Exposure On +
2 = Autofocus Off, Exposure On (Mode A) +
4 = Autofocus On, Exposure Off +
5 = Autofocus On, Exposure On +
6 = Autofocus On, Exposure On (Mode A)
+
18.2CommandDialsMenuAndPlaybackint8u[val >> 3 & 0x3] +
0 = On +
1 = Off +
2 = On (Image Review Excluded)
18.3CommandDialsApertureSettingint8u[val >> 2 & 0x1] +
0 = Sub-command Dial +
1 = Aperture Ring
18.4ShutterReleaseButtonAE-Lint8u[val >> 1 & 0x1] +
0 = Off +
1 = On
18.5ReleaseButtonToUseDialint8u[val & 0x1] +
0 = No +
1 = Yes
19.1StandbyTimerint8u[val >> 4 & 0xf] + +
0 = 4 s +
1 = 6 s +
3 = 10 s +
5 = 30 s
  6 = 1 min +
7 = 5 min +
8 = 10 min +
9 = 30 min
+
20.1SelfTimerTimeint8u[val >> 6 & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
20.2SelfTimerShotCountint8u[val & 0xf]
20.3SelfTimerShotIntervalint8u[val >> 4 & 0x3] +
0 = 0.5 s +
1 = 1 s +
2 = 2 s +
3 = 3 s
21.1ImageReviewMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 2 s +
1 = 4 s +
2 = 10 s +
3 = 20 s
  4 = 1 min +
5 = 5 min +
6 = 10 min
+
21.2LiveViewMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 5 min +
1 = 10 min +
2 = 15 min
  3 = 20 min +
4 = 30 min +
5 = No Limit
+
22.1MenuMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
22.2ShootingInfoMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
23.1FlashSyncSpeedint8u[val >> 4 & 0xf] + +
1 = 1/250 s (auto FP) +
2 = 1/250 s +
3 = 1/200 s +
4 = 1/160 s
  5 = 1/125 s +
6 = 1/100 s +
7 = 1/80 s +
8 = 1/60 s
+
23.2FlashShutterSpeedint8u[val & 0xf] + +
0 = 1/60 s +
1 = 1/30 s +
2 = 1/15 s +
3 = 1/8 s +
4 = 1/4 s +
5 = 1/2 s
  6 = 1 s +
7 = 2 s +
8 = 4 s +
9 = 8 s +
10 = 15 s +
11 = 30 s
+
31.1ModelingFlashint8u[val >> 5 & 0x1] +
0 = On +
1 = Off
36.1PlaybackMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
37.1PlaybackZoomint8u[val & 0x1] +
0 = Use Separate Zoom Buttons +
1 = Use Either Zoom Button with Command Dial
38.1ShutterSpeedLockint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
38.2ApertureLockint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
38.3MovieShutterButtonint8u[val >> 4 & 0x3] +
0 = Take Photo +
1 = Record Movies +
2 = Live Frame Grab
38.4FlashExposureCompAreaint8u[val >> 2 & 0x1] +
0 = Entire frame +
1 = Background only
41.1MovieFunctionButtonint8u[val >> 4 & 0x7] +
0 = None +
1 = Power Aperture (open) +
3 = Index Marking +
4 = View Photo Shooting Info
41.2MoviePreviewButtonint8u[val & 0x7] +
0 = None +
2 = Power Aperture (open) +
3 = Index Marking +
4 = View Photo Shooting Info
42.1VerticalMultiSelectorint8u[val >> 5 & 0x3] +
0 = Same as Multi-Selector with Info(U/D) & Playback(R/L) +
1 = Same as Multi-Selector with Info(R/L) & Playback(U/D) +
2 = Focus Point Selection
42.2VerticalFuncButtonint8u[val & 0x1f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
18 = My Menu +
20 = Grid Display +
26 = Flash Disable/Enable
+
43.1VerticalFuncButtonPlusDialsint8u[val >> 4 & 0xf] +
0 = None +
1 = Choose Image Area (FX/DX/5:4) +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
6 = Shooting Bank Menu +
7 = ISO Sensitivity +
8 = Exposure Mode +
9 = Exposure Compensation +
10 = Metering
+
43.2AssignMovieRecordButtonint8u[val & 0x7] +
0 = None +
1 = Choose Image Area (FX/DX/5:4) +
2 = Shutter Speed & Aperture Lock +
3 = ISO Sensitivity +
4 = Shooting Bank Menu
46.1DynamicAreaAFDisplayint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
46.2AFPointIlluminationint8u[val >> 5 & 0x3] +
0 = Off +
1 = On in Continuous Shooting Modes +
2 = On During Manual Focusing +
3 = On in Continuous Shooting and Manual Focusing
46.3StoreByOrientationint8u[val >> 3 & 0x3] +
0 = Off +
1 = Focus Point +
2 = Focus Point and AF-area mode
46.4GroupAreaAFIlluminationint8u[val >> 2 & 0x1] +
0 = Squares +
1 = Dots
46.5AFPointBrightnessint8u[val & 0x3] +
0 = Low +
1 = Normal +
2 = High +
3 = Extra High
47.1AFOnButtonint8u[val >> 4 & 0x7] +
0 = AF On +
1 = AE/AF Lock +
2 = AE Lock Only +
3 = AE Lock (reset on release) +
4 = AE Lock (hold) +
5 = AF Lock Only +
6 = None
+
47.2VerticalAFOnButtonint8u[val & 0x7] +
0 = Same as AF On +
1 = AF On +
2 = AE/AF Lock +
3 = AE Lock Only +
4 = AE Lock (reset on release) +
5 = AE Lock (hold) +
6 = AF Lock Only +
7 = None
+
48.1SubSelectorAssignmentint8u[val >> 7 & 0x1] +
0 = Focus Point Selection +
1 = Same As Multi-selector
48.2MovieSubSelectorAssignmentint8u[val & 0x7] +
0 = None +
1 = Index Marking +
2 = AE/AF Lock +
3 = AE Lock Only +
4 = AE Lock (hold) +
5 = AF Lock Only +
6 = View Photo Shooting Info
+
49.1SubSelectorint8u[val >> 3 & 0x1f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
18 = My Menu +
19 = Reset +
20 = Grid Display +
21 = Disable Synchronized Release +
22 = Remote Release Only +
23 = Preview +
26 = Flash Disable/Enable
+
49.2SubSelectorPlusDialsint8u[val & 0x7] +
0 = None +
1 = Choose Image Area (FX/DX/5:4) +
2 = Shutter Speed & Aperture Lock +
4 = Choose Non-CPU Lens Number +
6 = Shooting Bank Menu
50.1MatrixMeteringint8u(D4S only) +
[val >> 7 & 0x1] +
0 = Face Detection On +
1 = Face Detection Off
50.2LiveViewButtonOptionsint8u(D4S only) +
[val >> 4 & 0x3] +
0 = Enable +
1 = Enable (standby time active) +
2 = Disable
50.3AFModeRestrictionsint8u(D4S only) +
[val & 0x3] +
0 = Off +
1 = AF-C +
2 = AF-S
51.1LimitAFAreaModeSelectionint8u(D4S only) +
[val >> 1 & 0x3f]
+
0x0 = No Restrictions +
Bit 0 = Auto-area +
Bit 1 = Group-area +
Bit 2 = 3D-tracking +
Bit 3 = Dynamic area (51 points) +
Bit 4 = Dynamic area (21 points) +
Bit 5 = Dynamic area (9 points)
+
52.1MovieFunctionButtonPlusDialsint8u[val >> 4 & 0x1] +
0 = None +
1 = Choose Image Area
52.2MoviePreviewButtonPlusDialsint8u[val & 0x1] +
0 = None +
1 = Choose Image Area
53.1MovieSubSelectorAssignmentPlusDialsint8u[val >> 4 & 0x1] +
0 = None +
1 = Choose Image Area
54.1AssignRemoteFnButtonint8u(D4S only) +
[val & 0x1f]
+
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
7 = AF Lock Only +
8 = AF-On +
16 = +NEF(RAW) +
25 = Live View +
26 = Flash Disable/Enable
+
55.1LensFocusFunctionButtonsint8u(D4S only) +
[val & 0x3f]
+
3 = AE/AF Lock +
4 = AE Lock Only +
7 = AF Lock Only +
21 = Disable Synchronized Release +
22 = Remote Release Only +
24 = Preset focus Point +
26 = Flash Disable/Enable +
32 = AF-Area Mode: Single-point AF +
33 = AF-Area Mode: Dynamic-area AF (9 points) +
34 = AF-Area Mode: Dynamic-area AF (21 points) +
35 = AF-Area Mode: Dynamic-area AF (51 points) +
36 = AF-Area Mode: Group-area AF +
37 = AF-Area Mode: Auto area AF
+
+ +

NikonCustom SettingsD5 Tags

+

Custom settings for the D5.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1CustomSettingsBankint8u[val & 0x3] +
0 = A +
1 = B +
2 = C +
3 = D
1.1AF-CPrioritySelectionint8u[val >> 6 & 0x3] +
0 = Release +
1 = Release + Focus +
2 = Focus +
3 = Focus + Release
1.2AF-SPrioritySelectionint8u[val >> 5 & 0x1] +
0 = Focus +
1 = Release
1.3NumberOfFocusPointsint8u[val >> 4 & 0x1] +
0 = 55 Points +
1 = 15 Points
1.4Three-DTrackingFaceDetectionint8u[val >> 3 & 0x1] +
0 = Off +
1 = On
1.5BlockShotAFResponseint8u[val & 0x7]
2.1FocusPointWrapint8u[val >> 3 & 0x1] +
0 = No Wrap +
1 = Wrap
2.2AFPointBrightnessint8u[val >> 1 & 0x3] +
0 = Auto +
1 = On +
2 = Off
4.1ISODisplayint8u[val >> 3 & 0x1] +
0 = Show ISO Sensitivity +
1 = Show Frame Count
4.2GridDisplayint8u[val >> 1 & 0x1] +
0 = On +
1 = Off
5.1LCDIlluminationint8u[val >> 5 & 0x1] +
0 = Off +
1 = On
5.2ElectronicFront-CurtainShutterint8u[val >> 3 & 0x1] +
0 = Off +
1 = On
6.1ReverseIndicatorsint8u[val >> 7 & 0x1] +
0 = + 0 - +
1 = - 0 +
6.2CommandDialsReverseRotationint8u[val >> 3 & 0x3] +
0 = No +
1 = Shutter Speed & Aperture +
2 = Exposure Compensation +
3 = Exposure Compensation, Shutter Speed & Aperture
6.3EasyExposureCompensationint8u[val & 0x3] +
0 = Off +
1 = On +
2 = On (auto reset)
7.1ExposureControlStepSizeint8u[val >> 6 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
7.2ISOStepSizeint8u[val >> 4 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
7.3ExposureCompStepSizeint8u[val >> 2 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
8.1CenterWeightedAreaSizeint8u[val >> 5 & 0x7] +
0 = 8 mm +
1 = 12 mm +
2 = 15 mm +
3 = 20 mm +
4 = Average
8.2FineTuneOptMatrixMeteringint8u[val & 0xf]
9.1FineTuneOptCenterWeightedint8u[val >> 4 & 0xf]
9.2FineTuneOptSpotMeteringint8u[val & 0xf]
10.1MultiSelectorShootModeint8u[val >> 5 & 0x7] +
0 = Select Center Focus Point (Reset) +
1 = Zoom On/Off +
2 = Preset Focus Point (Pre) +
4 = Not Used (None)
10.3MultiSelectorint8u[val & 0x1] +
0 = Do Nothing +
1 = Reset Meter-off Delay
11.1ExposureDelayModeint8u[val >> 6 & 0x3] +
0 = Off +
1 = 1 s +
2 = 2 s +
3 = 3 s
11.2CLModeShootingSpeedint8u[val & 0xf]
12.1MaxContinuousReleaseint8u 
13.1AutoBracketOrderint8u[val >> 4 & 0x1] +
0 = 0,-,+ +
1 = -,0,+
13.2AutoBracketModeMint8u[val >> 2 & 0x3] +
0 = Flash/Speed +
1 = Flash/Speed/Aperture +
2 = Flash/Aperture +
3 = Flash Only
14.1Func1Buttonint8u[val & 0x3f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
19 = Grid Display +
20 = My Menu +
21 = Disable Synchronized Release +
22 = Remote Release Only +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only) +
58 = AF-Area Mode + AF-On (Group Area AF - HL) +
59 = AF-Area Mode + AF-On (Group Area AF - VL)
15.1PreviewButtonint8u[val & 0x3f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
19 = Grid Display +
20 = My Menu +
21 = Disable Synchronized Release +
22 = Remote Release Only +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only) +
58 = AF-Area Mode + AF-On (Group Area AF - HL) +
59 = AF-Area Mode + AF-On (Group Area AF - VL)
16.1AssignBktButtonint8u[val & 0x7] +
0 = Auto Bracketing +
1 = Multiple Exposure +
2 = HDR (high dynamic range) +
3 = None
18.1CommandDialsChangeMainSubint8u[val >> 5 & 0x7] +
0 = Autofocus Off, Exposure Off +
1 = Autofocus Off, Exposure On +
2 = Autofocus Off, Exposure On (Mode A) +
4 = Autofocus On, Exposure Off +
5 = Autofocus On, Exposure On +
6 = Autofocus On, Exposure On (Mode A)
+
18.2CommandDialsMenuAndPlaybackint8u[val >> 3 & 0x3] +
0 = On +
1 = Off +
2 = On (Image Review Excluded)
18.3CommandDialsApertureSettingint8u[val >> 2 & 0x1] +
0 = Sub-command Dial +
1 = Aperture Ring
18.4ReleaseButtonToUseDialint8u[val & 0x1] +
0 = No +
1 = Yes
19.1StandbyTimerint8u[val >> 4 & 0xf] + + +
0 = 4 s +
1 = 6 s +
3 = 10 s
  5 = 30 s +
6 = 1 min +
7 = 5 min
  8 = 10 min +
9 = 30 min +
10 = No Limit
+
20.1SelfTimerTimeint8u[val >> 6 & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
20.2SelfTimerShotIntervalint8u[val >> 4 & 0x3] +
0 = 0.5 s +
1 = 1 s +
2 = 2 s +
3 = 3 s
20.3SelfTimerShotCountint8u[val & 0xf]
21.1ImageReviewMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 2 s +
1 = 4 s +
3 = 10 s +
4 = 20 s
  5 = 1 min +
6 = 5 min +
7 = 10 min
+
21.2LiveViewMonitorOffTimeint8u[val >> 2 & 0x7] + +
1 = 5 min +
2 = 10 min +
3 = 15 min
  4 = 20 min +
5 = 30 min +
6 = No Limit
+
22.1MenuMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
2 = 10 s +
4 = 20 s
  5 = 1 min +
6 = 5 min +
7 = 10 min
+
22.2ShootingInfoMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 4 s +
2 = 10 s +
4 = 20 s
  5 = 1 min +
6 = 5 min +
7 = 10 min
+
23.1FlashSyncSpeedint8u[val >> 4 & 0xf] + +
2 = 1/250 s (auto FP) +
3 = 1/250 s +
5 = 1/200 s +
6 = 1/160 s
  7 = 1/125 s +
8 = 1/100 s +
9 = 1/80 s +
10 = 1/60 s
+
23.2FlashShutterSpeedint8u[val & 0xf] + +
0 = 1/60 s +
1 = 1/30 s +
2 = 1/15 s +
3 = 1/8 s +
4 = 1/4 s +
5 = 1/2 s
  6 = 1 s +
7 = 2 s +
8 = 4 s +
9 = 8 s +
10 = 15 s +
11 = 30 s
+
31.1ModelingFlashint8u[val >> 5 & 0x1] +
0 = On +
1 = Off
36.1PlaybackMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
37.1MultiSelectorLiveViewint8u[val >> 6 & 0x3] +
0 = Reset +
1 = Zoom +
3 = Not Used
38.1ShutterSpeedLockint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
38.2ApertureLockint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
38.3MovieShutterButtonint8u[val >> 4 & 0x1] +
0 = Take Photo +
1 = Record Movies
38.4FlashExposureCompAreaint8u[val >> 2 & 0x1] +
0 = Entire Frame +
1 = Background Only
38.5AutoFlashISOSensitivityint8u[val >> 1 & 0x1] +
0 = Subject and Background +
1 = Subject Only
41.1MovieFunc1Buttonint8u[val >> 4 & 0xf] +
0 = None +
2 = Power Aperture (close) +
3 = Index Marking +
4 = View Photo Shooting Info +
11 = Exposure Compensation -
41.2MoviePreviewButtonint8u[val & 0xf] +
0 = None +
1 = Power Aperture (open) +
3 = Index Marking +
4 = View Photo Shooting Info +
10 = Exposure Compensation +
42.1Func1ButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
7 = Photo Shooting Menu Bank +
8 = Exposure Delay Mode
+
43.1PreviewButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
7 = Photo Shooting Menu Bank +
8 = Exposure Delay Mode
+
45.1AssignMovieRecordButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area +
2 = Shutter Speed & Aperture Lock +
7 = Photo Shooting Menu Bank +
11 = Exposure Mode
46.1FineTuneOptHighlightWeightedint8u[val & 0xf]
47.1DynamicAreaAFDisplayint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
47.2AFPointIlluminationint8u[val >> 6 & 0x1] +
0 = Off +
1 = On During Manual Focusing
47.3StoreByOrientationint8u[val >> 3 & 0x3] +
0 = Off +
1 = Focus Point +
2 = Focus Point and AF-area Mode
48.1MatrixMeteringint8u[val >> 7 & 0x1] +
0 = Face Detection On +
1 = Face Detection Off
48.2LiveViewButtonOptionsint8u[val >> 4 & 0x3] +
0 = Enable +
1 = Enable (Standby Timer Active) +
2 = Disable
48.3AFModeRestrictionsint8u[val & 0x3] +
0 = No Restrictions +
1 = AF-C +
2 = AF-S
49.1LimitAFAreaModeSelectionint8u[val >> 1 & 0x3f] +
0x0 = No Restrictions +
Bit 0 = Auto-area +
Bit 1 = Group-area +
Bit 2 = 3D-tracking +
Bit 3 = Dynamic area (153 points) +
Bit 4 = Dynamic area (72 points) +
Bit 5 = Dynamic area (25 points)
+
52.1LensFocusFunctionButtonsint8u[val & 0x3f] +
3 = AE/AF Lock +
4 = AE Lock Only +
7 = AF Lock Only +
8 = AF-On +
24 = Preset Focus Point +
26 = Flash Disable/Enable +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only)
66.1VerticalMultiSelectorint8u[val & 0xff] +
0x0 = Same as Multi-Selector with Info(U/D) & Playback(R/L) +
0x8 = Same as Multi-Selector with Info(R/L) & Playback(U/D) +
0x80 = Focus Point Selection
67.1VerticalFuncButtonint8u[val & 0x3f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
18 = Reset Focus Point +
19 = Grid Display +
20 = My Menu +
22 = Remote Release Only +
23 = Preset Focus Point +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only) +
54 = Highlight Active Focus Point
68.1VerticalFuncPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
7 = Photo Shooting Menu Bank +
8 = Exposure Delay Mode +
10 = ISO Sensitivity +
11 = Exposure Mode +
12 = Exposure Compensation +
13 = Metering
+
70.1AF-OnButtonint8u[val & 0x3f] +
0 = None +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF)
71.1SubSelectorint8u[val >> 7 & 0x1] +
0 = Focus Point Selection +
1 = Same as MultiSelector
72.1SubSelectorCenterint8u[val & 0x3f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
18 = Reset Focus Point +
19 = Grid Display +
20 = My Menu +
22 = Remote Release Only +
23 = Preset Focus Point +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only) +
54 = Highlight Active Focus Point
73.1SubSelectorPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area +
2 = Shutter Speed & Aperture Lock +
4 = Choose Non-CPU Lens Number +
7 = Photo Shooting Menu Bank
74.1AssignMovieSubselectorint8u[val >> 4 & 0xf] +
0 = None +
3 = Index Marking +
4 = View Photo Shooting Info +
5 = AE/AF Lock +
6 = AE Lock (Only) +
7 = AE Lock (Hold) +
8 = AF Lock (Only)
+
75.1AssignMovieFunc1ButtonPlusDialsint8u[val >> 4 & 0x1] +
0 = None +
1 = Choose Image Area
75.2AssignMoviePreviewButtonPlusDialsint8u[val & 0x1] +
0 = None +
1 = Choose Image Area (DX/1.3x)
76.1AssignMovieSubselectorPlusDialsint8u[val >> 4 & 0x1] +
0 = None +
1 = Choose Image Area
77.1SyncReleaseModeint8u[val >> 7 & 0x1] +
0 = No Sync +
1 = Sync
78.1Three-DTrackingWatchAreaint8u[val >> 7 & 0x1] +
0 = Wide +
1 = Normal
78.2SubjectMotionint8u[val >> 5 & 0x3] +
0 = Steady +
1 = Middle +
2 = Erratic
78.3AFActivationint8u[val >> 3 & 0x1] +
0 = Shutter/AF-On +
1 = AF-On Only
78.4ShutterReleaseButtonAE-Lint8u[val & 0x3] +
0 = Off +
1 = On (Half Press) +
2 = On (Burst Mode)
79.1VerticalAFOnButtonint8u[val & 0x7f] +
0 = None +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
100 = Same as AF-On
80.1Func2Buttonint8u[val & 0x3f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
19 = Grid Display +
20 = My Menu +
21 = Disable Synchronized Release +
22 = Remote Release Only +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only)
81.1Func2ButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
7 = Photo Shooting Menu Bank +
8 = Exposure Delay Mode
+
82.1AssignMovieFunc2Buttonint8u[val >> 4 & 0x7] +
0 = None +
3 = Index Marking +
4 = View Photo Shooting Info
83.1Func3Buttonint8u[val & 0x3] +
0 = None +
1 = Voice Memo +
2 = Rating +
3 = Connect To Network
+ +

NikonCustom SettingsD500 Tags

+

Custom settings for the D500.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1CustomSettingsBankint8u[val & 0x3] +
0 = A +
1 = B +
2 = C +
3 = D
1.1AF-CPrioritySelectionint8u[val >> 6 & 0x3] +
0 = Release +
1 = Release + Focus +
2 = Focus +
3 = Focus + Release
1.2AF-SPrioritySelectionint8u[val >> 5 & 0x1] +
0 = Focus +
1 = Release
1.3NumberOfFocusPointsint8u[val >> 4 & 0x1] +
0 = 55 Points +
1 = 15 Points
1.4Three-DTrackingFaceDetectionint8u[val >> 3 & 0x1] +
0 = Off +
1 = On
1.5BlockShotAFResponseint8u[val & 0x7]
2.1FocusPointWrapint8u[val >> 3 & 0x1] +
0 = No Wrap +
1 = Wrap
2.2AFPointBrightnessint8u[val >> 1 & 0x3] +
0 = Auto +
1 = On +
2 = Off
4.1ISODisplayint8u[val >> 3 & 0x1] +
0 = Show ISO Sensitivity +
1 = Show Frame Count
4.2GridDisplayint8u[val >> 1 & 0x1] +
0 = On +
1 = Off
5.1LCDIlluminationint8u[val >> 5 & 0x1] +
0 = Off +
1 = On
5.2ElectronicFront-CurtainShutterint8u[val >> 3 & 0x1] +
0 = Off +
1 = On
6.1ReverseIndicatorsint8u[val >> 7 & 0x1] +
0 = + 0 - +
1 = - 0 +
6.2CommandDialsReverseRotationint8u[val >> 3 & 0x3] +
0 = No +
1 = Shutter Speed & Aperture +
2 = Exposure Compensation +
3 = Exposure Compensation, Shutter Speed & Aperture
6.3EasyExposureCompensationint8u[val & 0x3] +
0 = Off +
1 = On +
2 = On (auto reset)
7.1ExposureControlStepSizeint8u[val >> 6 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
7.2ISOStepSizeint8u[val >> 4 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
7.3ExposureCompStepSizeint8u[val >> 2 & 0x3] +
0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
8.1CenterWeightedAreaSizeint8u[val >> 5 & 0x7] +
0 = 6 mm +
1 = 8 mm +
2 = 10 mm +
3 = 13 mm +
4 = Average
8.2FineTuneOptMatrixMeteringint8u[val & 0xf]
9.1FineTuneOptCenterWeightedint8u[val >> 4 & 0xf]
9.2FineTuneOptSpotMeteringint8u[val & 0xf]
10.1MultiSelectorShootModeint8u[val >> 5 & 0x7] +
0 = Select Center Focus Point (Reset) +
2 = Preset Focus Point (Pre) +
3 = Highlight Active Focus Point +
4 = Not Used (None)
10.2MultiSelectorPlaybackModeint8u[val >> 2 & 0x3] +
0 = Thumbnail On/Off +
1 = View Histograms +
2 = Zoom On/Off +
3 = Choose Folder
10.3MultiSelectorint8u[val & 0x1] +
0 = Do Nothing +
1 = Reset Meter-off Delay
11.1ExposureDelayModeint8u[val >> 6 & 0x3] +
0 = Off +
1 = 1 s +
2 = 2 s +
3 = 3 s
11.2CLModeShootingSpeedint8u[val & 0xf]
12.1MaxContinuousReleaseint8u 
13.1AutoBracketOrderint8u[val >> 4 & 0x1] +
0 = 0,-,+ +
1 = -,0,+
13.2AutoBracketModeMint8u[val >> 2 & 0x3] +
0 = Flash/Speed +
1 = Flash/Speed/Aperture +
2 = Flash/Aperture +
3 = Flash Only
14.1Func1Buttonint8u[val & 0x3f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
19 = Grid Display +
20 = My Menu +
22 = Remote Release Only +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only)
15.1PreviewButtonint8u[val & 0x3f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
19 = Grid Display +
20 = My Menu +
22 = Remote Release Only +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only)
16.1AssignBktButtonint8u[val & 0x7] +
0 = Auto Bracketing +
1 = Multiple Exposure +
2 = HDR (high dynamic range) +
3 = None
18.1CommandDialsChangeMainSubint8u[val >> 5 & 0x7] +
0 = Autofocus Off, Exposure Off +
1 = Autofocus Off, Exposure On +
2 = Autofocus Off, Exposure On (Mode A) +
4 = Autofocus On, Exposure Off +
5 = Autofocus On, Exposure On +
6 = Autofocus On, Exposure On (Mode A)
+
18.2CommandDialsMenuAndPlaybackint8u[val >> 3 & 0x3] +
0 = On +
1 = Off +
2 = On (Image Review Excluded)
18.3CommandDialsApertureSettingint8u[val >> 2 & 0x1] +
0 = Sub-command Dial +
1 = Aperture Ring
18.4ReleaseButtonToUseDialint8u[val & 0x1] +
0 = No +
1 = Yes
19.1StandbyTimerint8u[val >> 4 & 0xf] + + +
0 = 4 s +
1 = 6 s +
3 = 10 s
  5 = 30 s +
6 = 1 min +
7 = 5 min
  8 = 10 min +
9 = 30 min +
10 = No Limit
+
20.1SelfTimerTimeint8u[val >> 6 & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
20.2SelfTimerShotIntervalint8u[val >> 4 & 0x3] +
0 = 0.5 s +
1 = 1 s +
2 = 2 s +
3 = 3 s
20.3SelfTimerShotCountint8u[val & 0xf]
21.1ImageReviewMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 2 s +
1 = 4 s +
3 = 10 s +
4 = 20 s
  5 = 1 min +
6 = 5 min +
7 = 10 min
+
21.2LiveViewMonitorOffTimeint8u[val >> 2 & 0x7] + +
1 = 5 min +
2 = 10 min +
3 = 15 min
  4 = 20 min +
5 = 30 min +
6 = No Limit
+
22.1MenuMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
2 = 10 s +
4 = 20 s
  5 = 1 min +
6 = 5 min +
7 = 10 min
+
22.2ShootingInfoMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 4 s +
2 = 10 s +
4 = 20 s
  5 = 1 min +
6 = 5 min +
7 = 10 min
+
23.1FlashSyncSpeedint8u[val >> 4 & 0xf] + +
2 = 1/250 s (auto FP) +
3 = 1/250 s +
5 = 1/200 s +
6 = 1/160 s
  7 = 1/125 s +
8 = 1/100 s +
9 = 1/80 s +
10 = 1/60 s
+
23.2FlashShutterSpeedint8u[val & 0xf] + +
0 = 1/60 s +
1 = 1/30 s +
2 = 1/15 s +
3 = 1/8 s +
4 = 1/4 s +
5 = 1/2 s
  6 = 1 s +
7 = 2 s +
8 = 4 s +
9 = 8 s +
10 = 15 s +
11 = 30 s
+
31.1ModelingFlashint8u[val >> 5 & 0x1] +
0 = On +
1 = Off
36.1PlaybackMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
37.1MultiSelectorLiveViewint8u[val >> 6 & 0x3] +
0 = Reset +
1 = Zoom +
3 = Not Used
38.1ShutterSpeedLockint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
38.2ApertureLockint8u[val >> 6 & 0x1] +
0 = Off +
1 = On
38.3MovieShutterButtonint8u[val >> 4 & 0x1] +
0 = Take Photo +
1 = Record Movies
38.4FlashExposureCompAreaint8u[val >> 2 & 0x1] +
0 = Entire Frame +
1 = Background Only
38.5AutoFlashISOSensitivityint8u[val >> 1 & 0x1] +
0 = Subject and Background +
1 = Subject Only
41.1MovieFunc1Buttonint8u[val >> 4 & 0xf] +
0 = None +
2 = Power Aperture (close) +
3 = Index Marking +
4 = View Photo Shooting Info +
11 = Exposure Compensation -
41.2MoviePreviewButtonint8u[val & 0xf] +
0 = None +
1 = Power Aperture (open) +
3 = Index Marking +
4 = View Photo Shooting Info +
10 = Exposure Compensation +
42.1Func1ButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area (DX/1.3x) +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
7 = Photo Shooting Menu Bank +
8 = Exposure Delay Mode
+
43.1PreviewButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area (DX/1.3x) +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
7 = Photo Shooting Menu Bank +
8 = Exposure Delay Mode
+
45.1AssignMovieRecordButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area (DX/1.3x) +
2 = Shutter Speed & Aperture Lock +
7 = Photo Shooting Menu Bank +
11 = Exposure Mode
46.1FineTuneOptHighlightWeightedint8u[val & 0xf]
47.1DynamicAreaAFDisplayint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
47.2AFPointIlluminationint8u[val >> 6 & 0x1] +
0 = Off +
1 = On During Manual Focusing
47.3StoreByOrientationint8u[val >> 3 & 0x3] +
0 = Off +
1 = Focus Point +
2 = Focus Point and AF-area Mode
47.4GroupAreaAFIlluminationint8u[val >> 2 & 0x1] +
0 = Squares +
1 = Dots
48.1MatrixMeteringint8u[val >> 7 & 0x1] +
0 = Face Detection On +
1 = Face Detection Off
48.2LiveViewButtonOptionsint8u[val >> 4 & 0x3] +
0 = Enable +
1 = Enable (Standby Timer Active) +
2 = Disable
48.3AFModeRestrictionsint8u[val & 0x3] +
0 = No Restrictions +
1 = AF-C +
2 = AF-S
49.1LimitAFAreaModeSelectionint8u[val >> 1 & 0x3f] +
0x0 = No Restrictions +
Bit 0 = Auto-area +
Bit 1 = Group-area +
Bit 2 = 3D-tracking +
Bit 3 = Dynamic area (153 points) +
Bit 4 = Dynamic area (72 points) +
Bit 5 = Dynamic area (25 points)
+
52.1LensFocusFunctionButtonsint8u[val & 0x3f] +
3 = AE/AF Lock +
4 = AE Lock Only +
7 = AF Lock Only +
8 = AF-On +
24 = Preset Focus Point +
26 = Flash Disable/Enable +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only)
66.1VerticalMultiSelectorint8u[val & 0xff] +
0x0 = Same as Multi-Selector with Info(U/D) & Playback(R/L) +
0x8 = Same as Multi-Selector with Info(R/L) & Playback(U/D) +
0x80 = Focus Point Selection
67.1AssignMB-D17FuncButtonint8u[val & 0x3f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
18 = Reset Focus Point +
19 = Grid Display +
20 = My Menu +
22 = Remote Release Only +
23 = Preset Focus Point +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only) +
54 = Highlight Active Focus Point
68.1AssignMB-D17FuncButtonPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area (DX/1.3x) +
2 = Shutter Speed & Aperture Lock +
3 = One Step Speed / Aperture +
4 = Choose Non-CPU Lens Number +
5 = Active D-Lighting +
7 = Photo Shooting Menu Bank +
8 = Exposure Delay Mode +
10 = ISO Sensitivity +
11 = Exposure Mode +
12 = Exposure Compensation +
13 = Metering Mode
+
70.1AF-OnButtonint8u[val & 0x3f] +
0 = None +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF)
71.1SubSelectorint8u[val >> 7 & 0x1] +
0 = Focus Point Selection +
1 = Same as MultiSelector
72.1SubSelectorCenterint8u[val & 0x3f] +
0 = None +
1 = Preview +
2 = FV Lock +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
10 = Bracketing Burst +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Playback +
15 = My Menu Top Item +
16 = +NEF(RAW) +
17 = Virtual Horizon +
18 = Reset Focus Point +
19 = Grid Display +
20 = My Menu +
22 = Remote Release Only +
23 = Preset Focus Point +
26 = Flash Disable/Enable +
27 = Highlight-weighted Metering +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
49 = Sync Release (Master Only) +
50 = Sync Release (Remote Only) +
54 = Highlight Active Focus Point
73.1SubSelectorPlusDialsint8u[val & 0xf] +
0 = None +
1 = Choose Image Area (DX/1.3x) +
2 = Shutter Speed & Aperture Lock +
4 = Choose Non-CPU Lens Number +
7 = Photo Shooting Menu Bank
74.1AssignMovieSubselectorint8u[val >> 4 & 0xf] +
0 = None +
3 = Index Marking +
4 = View Photo Shooting Info +
5 = AE/AF Lock +
6 = AE Lock (Only) +
7 = AE Lock (Hold) +
8 = AF Lock (Only)
+
75.1AssignMovieFunc1ButtonPlusDialsint8u[val >> 4 & 0x1] +
0 = None +
1 = Choose Image Area (DX/1.3x)
75.2AssignMoviePreviewButtonPlusDialsint8u[val & 0x1] +
0 = None +
1 = Choose Image Area (DX/1.3x)
76.1AssignMovieSubselectorPlusDialsint8u[val >> 4 & 0x1] +
0 = None +
1 = Choose Image Area (DX/1.3x)
77.1SyncReleaseModeint8u[val >> 7 & 0x1] +
0 = No Sync +
1 = Sync
78.1Three-DTrackingWatchAreaint8u[val >> 7 & 0x1] +
0 = Wide +
1 = Normal
78.2SubjectMotionint8u[val >> 5 & 0x3] +
0 = Steady +
1 = Middle +
2 = Erratic
78.3AFActivationint8u[val >> 3 & 0x1] +
0 = Shutter/AF-On +
1 = AF-On Only
78.4ShutterReleaseButtonAE-Lint8u[val & 0x3] +
0 = Off +
1 = On (Half Press) +
2 = On (Burst Mode)
79.1AssignMB-D17AF-OnButtonint8u[val & 0x7f] +
0 = None +
3 = AE/AF Lock +
4 = AE Lock Only +
5 = AE Lock (reset on release) +
6 = AE Lock (hold) +
7 = AF Lock Only +
8 = AF-On +
36 = AF-Area Mode (Single) +
37 = AF-Area Mode (Dynamic Area 25 Points) +
38 = AF-Area Mode (Dynamic Area 72 Points) +
39 = AF-Area Mode (Dynamic Area 152 Points) +
40 = AF-Area Mode (Group Area AF) +
41 = AF-Area Mode (Auto Area AF) +
42 = AF-Area Mode + AF-On (Single) +
43 = AF-Area Mode + AF-On (Dynamic Area 25 Points) +
44 = AF-Area Mode + AF-On (Dynamic Area 72 Points) +
45 = AF-Area Mode + AF-On (Dynamic Area 152 Points) +
46 = AF-Area Mode + AF-On (Group Area AF) +
47 = AF-Area Mode + AF-On (Auto Area AF) +
100 = Same as Camera AF-On Button
80.1Func2Buttonint8u[val & 0x3f] +
0 = None +
15 = My Menu Top Item +
20 = My Menu +
55 = Rating
82.1AssignMovieFunc2Buttonint8u[val >> 4 & 0x7] +
0 = None +
3 = Index Marking +
4 = View Photo Shooting Info
+ +

NikonCustom SettingsD610 Tags

+

Custom settings for the D610.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1AF-CPrioritySelectionint8u[val >> 7 & 0x1] +
0 = Release +
1 = Focus
0.2AF-SPrioritySelectionint8u[val >> 5 & 0x1] +
0 = Release +
1 = Focus
0.3NumberOfFocusPointsint8u[val >> 4 & 0x1] +
0 = 39 Points +
1 = 11 Points
0.4FocusTrackingLockOnint8u[val & 0x7] + +
0 = Off +
1 = 1 Short +
2 = 2
  3 = 3 Normal +
4 = 4 +
5 = 5 Long
+
1.1FocusPointWrapint8u[val >> 3 & 0x1] +
0 = No Wrap +
1 = Wrap
1.2AFPointIlluminationint8u[val >> 1 & 0x3] +
0 = Auto +
1 = On +
2 = Off
1.3AFAssistint8u[val & 0x1] +
0 = On +
1 = Off
5.1EasyExposureCompensationint8u[val & 0x3] +
0 = Off +
1 = On +
2 = On Auto Reset
6.1ExposureControlStepint8u[val >> 6 & 0x1] +
0 = 1/3 EV +
1 = 1/2 EV
6.2ISOSensitivityStepint8u[val >> 4 & 0x1] +
0 = 1/3 EV +
1 = 1/2 EV
7.1CenterWeightedAreaSizeint8u[val >> 5 & 0x7] +
0 = 8 mm +
1 = 12 mm +
2 = 15 mm +
3 = 20 mm +
4 = Average
7.2FineTuneOptMatrixMeteringint8u[val & 0xf]
8.1FineTuneOptCenterWeightedint8u[val >> 4 & 0xf]
8.2FineTuneOptSpotMeteringint8u[val & 0xf]
17.1ShutterReleaseButtonAE-Lint8u[val >> 1 & 0x1] +
0 = Off +
1 = On
18.1StandbyTimerint8u[val >> 4 & 0xf] + + +
0 = 4 s +
1 = 6 s +
2 = 10 s
  3 = 30 s +
4 = 1 min +
5 = 5 min
  6 = 10 min +
7 = 30 min +
8 = No Limit
+
18.2RemoteOnDurationint8u[val & 0x3] +
0 = 1 min +
1 = 5 min +
2 = 10 min +
3 = 20 min
19.1SelfTimerTimeint8u[val >> 6 & 0x3] +
0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
19.2SelfTimerShotIntervalint8u[val >> 4 & 0x3] +
0 = 0.5 s +
1 = 1 s +
2 = 2 s +
3 = 3 s
19.3SelfTimerShotCountint8u[val & 0xf]
20.1ImageReviewMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 2 s +
1 = 4 s +
2 = 10 s +
3 = 20 s
  4 = 1 min +
5 = 5 min +
6 = 10 min
+
20.2LiveViewMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 5 min +
1 = 10 min +
2 = 15 min
  3 = 20 min +
4 = 30 min +
5 = No Limit
+
21.1MenuMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
21.2ShootingInfoMonitorOffTimeint8u[val >> 2 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
35.1PlaybackMonitorOffTimeint8u[val >> 5 & 0x7] + +
0 = 4 s +
1 = 10 s +
2 = 20 s
  3 = 1 min +
4 = 5 min +
5 = 10 min
+
+ +

NikonCustom SettingsZ9 Tags

+

Custom settings for the Z9.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1CustomSettingsBankint8u0 = A +
1 = B +
2 = C +
3 = D
3AF-CPrioritySelectionint8u0 = Release +
1 = Release + Focus +
3 = Focus
5AF-SPrioritySelectionint8u0 = Release +
1 = Focus
7BlockShotAFResponseint8u1 = 1 (Quick) +
2 = 2 +
3 = 3 (Normal) +
4 = 4 +
5 = 5 (Delayed)
11AFPointSelint8u0 = Use All +
1 = Use Half
13StoreByOrientationint8u0 = Off +
1 = Focus Point +
2 = Focus Point and AF-area mode
15AFActivationint8u0 = AF-On Only +
1 = Shutter/AF-On
16AF-OnOutOfFocusRelease?int8u0 = Disable +
1 = Enable
17LimitAF-AreaModeSelPinpoint?int8u0 = Limit +
1 = No Limit
19LimitAF-AreaModeSelWideAF_S?int8u0 = Limit +
1 = No Limit
20LimitAF-AreaModeSelWideAF_L?int8u0 = Limit +
1 = No Limit
21LimitAFAreaModeSelAuto?int8u0 = Limit +
1 = No Limit
22FocusPointWrap?int8u0 = No Wrap +
1 = Wrap
23ManualFocusPointIllumination?int8u0 = On During Focus Point Selection Only +
1 = On
24DynamicAreaAFAssist?int8u0 = Focus Point Only +
1 = Focus and Surrounding Points
25AF-AssistIlluminatorint8u0 = Off +
1 = On
26ManualFocusRingInAFModeint8u0 = Off +
1 = On
27ExposureControlStepSizeint8u0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
29EasyExposureCompensationint8u0 = Off +
1 = On +
2 = On (auto reset)
31CenterWeightedAreaSizeint8u0 = 8 mm +
1 = 12 mm +
4 = Average
33FineTuneOptMatrixMeteringint8s 
35FineTuneOptCenterWeightedint8s 
37FineTuneOptSpotMeteringint8s 
39FineTuneOptHighlightWeightedint8s 
41ShutterReleaseButtonAE-Lint8u0 = Off +
1 = On (Half Press) +
2 = On (Burst Mode)
43SelfTimerTimeint8u0 = 2 s +
1 = 5 s +
2 = 10 s +
3 = 20 s
45SelfTimerShotCountint8u 
49SelfTimerShotIntervalint8u0 = 0.5 s +
1 = 1 s +
2 = 2 s +
3 = 3 s
51PlaybackMonitorOffTimeint8u + + +
0 = 2 s +
1 = 4 s +
3 = 10 s +
4 = 20 s
  5 = 30 s +
6 = 1 min +
7 = 5 min +
8 = 10 min
  11 = 30 min +
12 = No Limit
+
53MenuMonitorOffTimeint8u + + +
0 = 2 s +
1 = 4 s +
3 = 10 s +
4 = 20 s
  5 = 30 s +
6 = 1 min +
7 = 5 min +
8 = 10 min
  11 = 30 min +
12 = No Limit
+
55ShootingInfoMonitorOffTimeint8u + + +
0 = 2 s +
1 = 4 s +
3 = 10 s +
4 = 20 s
  5 = 30 s +
6 = 1 min +
7 = 5 min +
8 = 10 min
  11 = 30 min +
12 = No Limit
+
57ImageReviewMonitorOffTimeint8u + + +
0 = 2 s +
1 = 4 s +
3 = 10 s +
4 = 20 s
  5 = 30 s +
6 = 1 min +
7 = 5 min +
8 = 10 min
  11 = 30 min +
12 = No Limit
+
59CLModeShootingSpeedint8u 
61MaxContinuousReleaseno 
65SyncReleaseMode?int8u0 = No Sync +
1 = Sync
69LimitSelectableImageAreaDX?int8u0 = Limit +
1 = No Limit
70LimitSelectableImageArea1To1?int8u0 = Limit +
1 = No Limit
71LimitSelectableImageArea16To9?int8u0 = Limit +
1 = No Limit
72FileNumberSequenceint8u0 = Off +
1 = On
73FocusPeakingLevel?int8u0 = High Sensitivity +
1 = Standard Sensitivity +
2 = Low Sensitivity
75FocusPeakingHighlightColor?int8u0 = Red +
1 = Yellow +
2 = Blue +
3 = White
81ContinuousModeDisplayint8u0 = Off +
1 = On
83FlashSyncSpeedno + +
0 = 1/60 s +
1 = 1/80 s +
2 = 1/100 s +
3 = 1/125 s
  4 = 1/160 s +
5 = 1/200 s +
6 = 1/250 s
+
85HighSpeedSyncint8u0 = Off +
1 = On
87FlashShutterSpeedno + + + +
0 = 1 s +
1 = 1/2 s +
2 = 1/4 s
  3 = 1/8 s +
4 = 1/15 s +
5 = 1/30 s
  6 = 1/60 s +
7 = 30 s +
8 = 15 s
  9 = 8 s +
10 = 4 s +
11 = 2 s
+
89FlashExposureCompAreaint8u0 = Entire Frame +
1 = Background Only
91AutoFlashISOSensitivityint8u0 = Subject and Background +
1 = Subject Only
93ModelingFlashint8u0 = Off +
1 = On
95AutoBracketModeMint8u0 = Flash/Speed +
1 = Flash/Speed/Aperture +
2 = Flash/Aperture +
3 = Flash Only +
4 = Flash/ISO
97AutoBracketOrderint8u0 = 0,-,+ +
1 = -,0,+
99Func1Buttonint8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
115Func2Buttonint8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
131AFOnButtonint8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
143SubSelector?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
155AssignMovieRecordButton?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
159LensFunc1Buttonint8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
167LensFunc2Buttonint8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
173LensControlRingint8u0 = None (Disabled) +
1 = Focus (M/A) +
2 = ISO Sensitivity +
3 = Exposure Compensation +
4 = Aperture
175MultiSelectorShootModeint8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
179MultiSelectorPlaybackModeint8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
183ShutterSpeedLockint8u0 = Off +
1 = On
184ApertureLockint8u0 = Off +
1 = On
186CmdDialsReverseRotationint8u0 = No +
1 = Shutter Speed & Aperture +
0 = Exposure Compensation +
1 = Exposure Compensation, Shutter Speed & Aperture
191UseDialWithoutHold?int8u0 = Off +
1 = On
193ReverseIndicators?int8u0 = + 0 - +
1 = - 0 +
195MovieFunc1Buttonint8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
203MovieAF-OnButtonint8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
217MovieMultiSelector?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
221MovieAFSpeedint8u 
223MovieAFSpeedApplyint8u 
225MovieAFTrackingSensitivityint8u + +
0 = 1 (High) +
1 = 2 +
2 = 3 +
3 = 4 (Normal)
  4 = 5 +
5 = 6 +
6 = 7 (Low)
+
257LCDIllumination?int8u0 = Off +
1 = On
258ExtendedShutterSpeedsint8u0 = Off +
1 = On
259SubjectMotionint8u0 = Erratic +
1 = Steady
261FocusPointPersistenceint8u0 = Auto +
1 = Off
263AutoFocusModeRestrictions?int8u0 = AF-S +
1 = AF-C +
2 = Full-time AF +
3 = Manual +
4 = No Restrictions
267CHModeShootingSpeedint8u 
269.1LimitReleaseModeSelCL?int8u[val >> 1 & 0x1] +
0 = Limit +
1 = No Limit
269.2LimitReleaseModeSelCH?int8u[val >> 2 & 0x1] +
0 = Limit +
1 = No Limit
269.3LimitReleaseModeSelC30?int8u[val >> 4 & 0x1] +
0 = Limit +
1 = No Limit
269.4LimitReleaseModeSelC120?int8u[val >> 6 & 0x1] +
0 = Limit +
1 = No Limit
269.5LimitReleaseModeSelSelf?int8u[val >> 7 & 0x1] +
0 = Limit +
1 = No Limit
273FlashBurstPriority?int8u0 = Frame Rate +
1 = Exposure
277VerticalFuncButtonint8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
281Func3Buttonint8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
285VerticalAFOnButtonint8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
293VerticalMultiSelectorPlaybackMode?int8u0 = Image Scroll L/R +
1 = Image Scroll Up/Down
295MovieFunc3Buttonint8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
335LimitAF-AreaModeSelDynamic_S?int8u0 = Limit +
1 = No Limit
336LimitAF-AreaModeSelDynamic_M?int8u0 = Limit +
1 = No Limit
337LimitAF-AreaModeSelDynamic_L?int8u0 = Limit +
1 = No Limit
339LimitAF-AreaModeSel3DTracking?int8u0 = Limit +
1 = No Limit
341PlaybackFlickUp?int8u +
0 = Rating +
1 = Select To Send (PC) +
2 = Select To Send (FTP) +
3 = Protect +
4 = Voice Memo +
5 = None
+
345PlaybackFlickDown?int8u +
0 = Rating +
1 = Select To Send (PC) +
2 = Select To Send (FTP) +
3 = Protect +
4 = Voice Memo +
5 = None
+
349ISOStepSizeint8u0 = 1/3 EV +
1 = 1/2 EV +
2 = 1 EV
355ReverseFocusRingint8u0 = Not Reversed +
1 = Reversed
356EVFImageFrame?int8u0 = Off +
1 = On
357EVFGrid?int8u + + +
0 = 3x3 +
1 = 4x4 +
2 = 2.35:1
  3 = 1.85:1 +
4 = 5:4 +
5 = 4:3
  6 = 1:1 +
7 = 16:9 +
8 = 90%
+
359VirtualHorizonStyle?int8u0 = Type A (Cockpit) +
1 = Type B (Sides)
373Func4Button?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
379AudioButton?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
381QualityButton?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
399VerticalMultiSelector?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
421Func1ButtonPlaybackMode?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
423Func2ButtonPlaybackMode?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
425Func3ButtonPlaybackMode?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
431Func4ButtonPlaybackMode?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
437MovieRecordButtonPlaybackMode?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
439VerticalFuncButtonPlaybackMode?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
441AudioButtonPlaybackMode?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
447QualityButtonPlaybackMode?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
453WhiteBalanceButtonPlaybackMode?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
459CommandDialPlaybackMode?int8u + +
0 = 1 Frame +
1 = 10 Frames +
2 = 50 Frames +
3 = Folder +
4 = Protect
  5 = Photos Only +
6 = Videos Only +
7 = Rating +
8 = Page
+
463SubCommandDialPlaybackMode?int8u + +
0 = 1 Frame +
1 = 10 Frames +
2 = 50 Frames +
3 = Folder +
4 = Protect
  5 = Photos Only +
6 = Videos Only +
7 = Rating +
8 = Page
+
467FocusPointLock?int8u0 = Off +
1 = On
469ControlRingResponseint8u0 = High +
1 = Low
481VerticalMovieFuncButton?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
505VerticalMovieAFOnButton?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
515MovieAFAreaMode?int8u +
0 = None +
1 = Preview +
3 = FV Lock +
4 = AE/AF Lock +
5 = AE Lock Only +
6 = AE Lock (reset on release) +
7 = AE Lock (hold) +
8 = AF Lock Only +
9 = AF-On +
10 = Flash Disable/Enable +
11 = Bracketing Burst +
12 = +NEF(RAW) +
18 = Virtual Horizon +
19 = Synchronized Release +
20 = My Menu +
21 = My Menu Top Item +
22 = Playback +
23 = Rating +
24 = Protect +
25 = Zoom +
26 = Focus Peaking +
28 = Image Area +
30 = Non-CPU Lens +
31 = Active-D Lighting +
33 = 1 Stop Speed/Aperture +
35 = Metering +
36 = Auto Bracketing +
37 = Multiple Exposure +
38 = HDR Overlay +
39 = Picture Control +
40 = Quality +
41 = Focus Mode/AF AreaMode +
42 = Select Center Focus Point +
44 = Record Movie +
47 = Choose Folder +
48 = Power Aperture (Open) +
49 = Power Aperture (Close) +
52 = Microphone Sensitivity +
57 = Preset Focus Point +
58 = AE/AWB Lock (hold) +
59 = AF-AreaMode +
60 = AF-AreaMode + AF-On +
61 = Recall Shooting Functions +
64 = Filtered Playback +
65 = Same as AF-On +
66 = Voice Memo +
70 = Photo Shooting Bank +
73 = Exposure Compensation +
76 = Silent Mode +
78 = LiveView Information +
79 = AWB Lock (hold) +
80 = Grid Display +
81 = Starlight View +
82 = Select To Send (PC) +
83 = Select To Send (FTP) +
85 = Control Lock +
86 = Save Focus Position +
87 = Recall Focus Position +
88 = Recall Shooting Functions (Hold)
+
527HDMIViewAssist?int8u0 = Off +
1 = On
529ZebraPatternToneRange?int8u0 = Off +
1 = Highlights +
2 = Midtones
531MovieZebraPattern?int8u0 = Pattern 1 +
1 = Pattern 2
533MovieHighlightDisplayThreshold?int8u 
535MovieMidtoneDisplayValue?int8u 
537MovieMidtoneDisplayRange?int8u~ 
541MovieEVFGrid?int8u + + +
0 = 3x3 +
1 = 4x4 +
2 = 2.35:1
  3 = 1.85:1 +
4 = 5:4 +
5 = 4:3
  6 = 1:1 +
7 = 16:9 +
8 = 90%
+
549MovieShutterSpeedLock?int8u0 = Off +
1 = On
550MovieFocusPointLock?int8u0 = Off +
1 = On
563MatrixMetering?int8u0 = Face Detection Off +
1 = Face Detection On
564AF-CFocusDisplayint8u0 = Off +
1 = On
565FocusPeakingDisplay?int8u0 = Off +
1 = On
567KeepExposureint8u0 = Off +
1 = Shutter Speed +
2 = ISO
585StarlightView?int8u0 = Off +
1 = On
587EVFWarmDisplayMode?int8u0 = Off +
1 = Mode 1 +
2 = Mode 2
589EVFWarmDisplayBrightness?int8s 
591EVFReleaseIndicator?int8u0 = Off +
1 = Type A (Dark) +
2 = Type B (Border) +
3 = Type C (Sides)
601MovieApertureLock?int8u0 = Off +
1 = On
607FlickAdvanceDirection?int8u0 = Left to Right +
1 = Right to Left
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 1, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/NikonSettings.html b/html/TagNames/NikonSettings.html new file mode 100644 index 0000000..ce2a0ea --- /dev/null +++ b/html/TagNames/NikonSettings.html @@ -0,0 +1,2587 @@ + + + + +NikonSettings Tags + + + +

NikonSettings Tags

+

User settings for newer Nikon models. A number of the tags are marked as +Unknown only to reduce the volume of the normal output.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001ISOAutoHiLimitno(D6) + +
1 = ISO 200 +
2 = ISO 250 +
3 = ISO 280 +
4 = ISO 320 +
5 = ISO 400 +
6 = ISO 500 +
7 = ISO 560 +
8 = ISO 640 +
9 = ISO 800 +
10 = ISO 1000 +
11 = ISO 1100 +
12 = ISO 1250 +
13 = ISO 1600 +
14 = ISO 2000 +
15 = ISO 2200 +
16 = ISO 2500 +
17 = ISO 3200 +
18 = ISO 4000 +
19 = ISO 4500 +
20 = ISO 5000 +
21 = ISO 6400 +
22 = ISO 8000 +
23 = ISO 9000
  24 = ISO 10000 +
25 = ISO 12800 +
26 = ISO 16000 +
27 = ISO 18000 +
28 = ISO 20000 +
29 = ISO 25600 +
30 = ISO 32000 +
31 = ISO 36000 +
32 = ISO 40000 +
33 = ISO 51200 +
34 = ISO 64000 +
35 = ISO 72000 +
36 = ISO 81200 +
37 = ISO 102400 +
38 = ISO Hi 0.3 +
39 = ISO Hi 0.5 +
40 = ISO Hi 0.7 +
41 = ISO Hi 1.0 +
42 = ISO Hi 2.0 +
43 = ISO Hi 3.0 +
44 = ISO Hi 4.0 +
45 = ISO Hi 5.0
+(Z7 and Z7_2) + +
1 = ISO 100 +
2 = ISO 125 +
4 = ISO 160 +
5 = ISO 200 +
6 = ISO 250 +
8 = ISO 320 +
9 = ISO 400 +
10 = ISO 500 +
12 = ISO 640 +
13 = ISO 800 +
14 = ISO 1000 +
16 = ISO 1250 +
17 = ISO 1600 +
18 = ISO 2000 +
20 = ISO 2500
  21 = ISO 3200 +
22 = ISO 4000 +
24 = ISO 5000 +
25 = ISO 6400 +
26 = ISO 8000 +
28 = ISO 10000 +
29 = ISO 12800 +
30 = ISO 16000 +
32 = ISO 20000 +
33 = ISO 25600 +
38 = ISO Hi 0.3 +
39 = ISO Hi 0.5 +
40 = ISO Hi 0.7 +
41 = ISO Hi 1.0 +
42 = ISO Hi 2.0
+
0x0002ISOAutoFlashLimitno(D6) +
1 = Same As Without Flash +
2 = ISO 200 +
3 = ISO 250 +
5 = ISO 320 +
6 = ISO 400 +
7 = ISO 500 +
9 = ISO 640 +
10 = ISO 800 +
11 = ISO 1000 +
13 = ISO 1250 +
14 = ISO 1600 +
15 = ISO 2000 +
17 = ISO 2500 +
18 = ISO 3200 +
19 = ISO 4000 +
21 = ISO 5000 +
22 = ISO 6400 +
23 = ISO 8000 +
25 = ISO 10000 +
26 = ISO 12800 +
27 = ISO 16000 +
29 = ISO 20000 +
30 = ISO 25600 +
31 = ISO 32000 +
33 = ISO 40000 +
34 = ISO 51200 +
35 = ISO 64000 +
36 = ISO 72000 +
37 = ISO 81200 +
38 = ISO 102400 +
39 = ISO Hi 0.3 +
40 = ISO Hi 0.5 +
41 = ISO Hi 0.7 +
42 = ISO Hi 1.0 +
43 = ISO Hi 2.0 +
44 = ISO Hi 3.0 +
45 = ISO Hi 4.0 +
46 = ISO Hi 5.0
+(Z7 and Z7_2) +
1 = Same As Without Flash +
2 = ISO 100 +
3 = ISO 125 +
5 = ISO 160 +
6 = ISO 200 +
7 = ISO 250 +
9 = ISO 320 +
10 = ISO 400 +
11 = ISO 500 +
13 = ISO 640 +
14 = ISO 800 +
15 = ISO 1000 +
17 = ISO 1250 +
18 = ISO 1600 +
19 = ISO 2000 +
21 = ISO 2500 +
22 = ISO 3200 +
23 = ISO 4000 +
25 = ISO 5000 +
26 = ISO 6400 +
27 = ISO 8000 +
29 = ISO 10000 +
30 = ISO 12800 +
31 = ISO 16000 +
33 = ISO 20000 +
34 = ISO 25600 +
39 = ISO Hi 0.3 +
40 = ISO Hi 0.5 +
41 = ISO Hi 0.7 +
42 = ISO Hi 1.0 +
43 = ISO Hi 2.0
+
0x0003ISOAutoShutterTimeno + +
1 = Auto (Slowest) +
2 = Auto (Slower) +
3 = Auto +
4 = Auto (Faster) +
5 = Auto (Fastest) +
6 = 1/4000 s +
7 = 1/3200 s +
8 = 1/2500 s +
9 = 1/2000 s +
10 = 1/1600 s +
11 = 1/1250 s +
12 = 1/1000 s +
13 = 1/800 s +
14 = 1/640 s +
15 = 1/500 s +
16 = 1/400 s +
17 = 1/320 s +
18 = 1/250 s +
19 = 1/200 s +
20 = 1/160 s +
21 = 1/125 s +
22 = 1/100 s +
23 = 1/80 s +
24 = 1/60 s +
25 = 1/50 s +
26 = 1/40 s +
27 = 1/30 s +
28 = 1/25 s +
29 = 1/20 s
  30 = 1/15 s +
31 = 1/13 s +
32 = 1/10 s +
33 = 1/8 s +
34 = 1/6 s +
35 = 1/5 s +
36 = 1/4 s +
37 = 1/3 s +
38 = 1/2.5 s +
39 = 1/2 s +
40 = 1/1.6 s +
41 = 1/1.3 s +
42 = 1 s +
43 = 1.3 s +
44 = 1.6 s +
45 = 2 s +
46 = 2.5 s +
47 = 3 s +
48 = 4 s +
49 = 5 s +
50 = 6 s +
51 = 8 s +
52 = 10 s +
53 = 13 s +
54 = 15 s +
55 = 20 s +
56 = 25 s +
57 = 30 s
+
0x000bFlickerReductionShootingno1 = Enable +
2 = Disable
0x000cFlickerReductionIndicatorno1 = Enable +
2 = Disable
0x000dMovieISOAutoHiLimitno(D6) + +
1 = ISO 200 +
2 = ISO 250 +
3 = ISO 280 +
4 = ISO 320 +
5 = ISO 400 +
6 = ISO 500 +
7 = ISO 560 +
8 = ISO 640 +
9 = ISO 800 +
10 = ISO 1000 +
11 = ISO 1100 +
12 = ISO 1250 +
13 = ISO 1600 +
14 = ISO 2000 +
15 = ISO 2200 +
16 = ISO 2500 +
17 = ISO 3200 +
18 = ISO 4000 +
19 = ISO 4500 +
20 = ISO 5000 +
21 = ISO 6400 +
22 = ISO 8000 +
23 = ISO 9000
  24 = ISO 10000 +
25 = ISO 12800 +
26 = ISO 16000 +
27 = ISO 18000 +
28 = ISO 20000 +
29 = ISO 25600 +
30 = ISO 32000 +
31 = ISO 36000 +
32 = ISO 40000 +
33 = ISO 51200 +
34 = ISO 64000 +
35 = ISO 72000 +
36 = ISO 81200 +
37 = ISO 102400 +
38 = ISO Hi 0.3 +
39 = ISO Hi 0.5 +
40 = ISO Hi 0.7 +
41 = ISO Hi 1.0 +
42 = ISO Hi 2.0 +
43 = ISO Hi 3.0 +
44 = ISO Hi 4.0 +
45 = ISO Hi 5.0
+(Z7 and Z7_2) + +
1 = ISO 200 +
2 = ISO 250 +
4 = ISO 320 +
5 = ISO 400 +
6 = ISO 500 +
8 = ISO 640 +
9 = ISO 800 +
10 = ISO 1000 +
12 = ISO 1250 +
13 = ISO 1600 +
14 = ISO 2000 +
16 = ISO 2500 +
17 = ISO 3200 +
18 = ISO 4000
  20 = ISO 5000 +
21 = ISO 6400 +
22 = ISO 8000 +
24 = ISO 10000 +
25 = ISO 12800 +
26 = ISO 16000 +
28 = ISO 20000 +
29 = ISO 25600 +
34 = ISO Hi 0.3 +
35 = ISO Hi 0.5 +
36 = ISO Hi 0.7 +
37 = ISO Hi 1.0 +
38 = ISO Hi 2.0
+
0x000eMovieISOAutoControlManualModeno1 = On +
2 = Off
0x000fMovieWhiteBalanceSameAsPhotono1 = Yes +
2 = No
0x001dAF-CPrioritySelno(D6) +
1 = Release +
2 = Release + Focus +
3 = Focus + Release +
4 = Focus +
(Z Series cameras thru November 2021) +
1 = Release +
2 = Focus
0x001eAF-SPrioritySelno1 = Release +
2 = Focus
0x0020AFPointSelno(D6) +
1 = 105 Points +
2 = 27 Points +
3 = 15 Points +
(Z Series cameras thru November 2021) +
1 = Use All +
2 = Use Half
0x0022AFActivationno1 = Shutter/AF-On +
2 = AF-On Only
0x0023FocusPointWrapno1 = Wrap +
2 = No Wrap
0x0025ManualFocusPointIlluminationno1 = On +
2 = On During Focus Point Selection Only
0x0026AF-AssistIlluminatorno1 = On +
2 = Off
0x0027ManualFocusRingInAFModeno1 = On +
2 = Off
0x0029ISOStepSizeno1 = 1/3 EV +
2 = 1/2 EV +
3 = 1 EV
0x002aExposureControlStepSizeno1 = 1/3 EV +
2 = 1/2 EV +
3 = 1 EV
0x002bEasyExposureCompensationno1 = On (auto reset) +
2 = On +
3 = Off
0x002cMatrixMeteringno1 = Face Detection On +
2 = Face Detection Off
0x002dCenterWeightedAreaSizeno(D6) +
1 = 8 mm +
2 = 12 mm +
3 = 15 mm +
4 = 20 mm +
5 = Average +
(Z Series cameras thru November 2021) +
1 = 12 mm +
2 = Average
0x002fFineTuneOptMatrixMeteringno 
0x0030FineTuneOptCenterWeightedno 
0x0031FineTuneOptSpotMeteringno 
0x0032FineTuneOptHighlightWeightedno 
0x0033ShutterReleaseButtonAE-Lno1 = On (Half Press) +
2 = On (Burst Mode) +
3 = Off
0x0034StandbyMonitorOffTimeno(D6) + + +
1 = 4 s +
2 = 6 s +
3 = 10 s
  4 = 30 s +
5 = 1 min +
6 = 5 min
  7 = 10 min +
8 = 30 min +
9 = No Limit
+(Z Series cameras thru November 2021) + +
1 = 10 s +
2 = 20 s +
3 = 30 s +
4 = 1 min
  5 = 5 min +
6 = 10 min +
7 = 30 min +
8 = No Limit
+
0x0035SelfTimerTimeno1 = 2 s +
2 = 5 s +
3 = 10 s +
4 = 20 s
0x0036SelfTimerShotCountno 
0x0037SelfTimerShotIntervalno1 = 0.5 s +
2 = 1 s +
3 = 2 s +
4 = 3 s
0x0038PlaybackMonitorOffTimeno + +
1 = 4 s +
2 = 10 s +
3 = 20 s
  4 = 1 min +
5 = 5 min +
6 = 10 min
+
0x0039MenuMonitorOffTimeno + +
1 = 4 s +
2 = 10 s +
3 = 20 s
  4 = 1 min +
5 = 5 min +
6 = 10 min
+
0x003aShootingInfoMonitorOffTimeno + +
1 = 4 s +
2 = 10 s +
3 = 20 s
  4 = 1 min +
5 = 5 min +
6 = 10 min
+
0x003bImageReviewMonitorOffTimeno + +
1 = 2 s +
2 = 4 s +
3 = 10 s +
4 = 20 s
  5 = 1 min +
6 = 5 min +
7 = 10 min
+
0x003cLiveViewMonitorOffTimeno + +
1 = 5 min +
2 = 10 min +
3 = 15 min
  4 = 20 min +
5 = 30 min +
6 = No Limit
+
0x003eCLModeShootingSpeedno 
0x003fMaxContinuousReleaseno 
0x0040ExposureDelayModeno + +
1 = 3 s +
2 = 2 s +
3 = 1 s
  4 = 0.5 s +
5 = 0.2 s +
6 = Off
+
0x0041ElectronicFront-CurtainShutterno1 = On +
2 = Off
0x0042FileNumberSequenceno1 = On +
2 = Off
0x0043FramingGridDisplayno1 = On +
2 = Off
0x0045LCDIlluminationno1 = On +
2 = Off
0x0046OpticalVRno1 = On +
2 = Off
0x0047FlashSyncSpeedno(D6) + +
1 = 1/250 s (auto FP) +
2 = 1/250 s +
3 = 1/200 s +
4 = 1/160 s
  5 = 1/125 s +
6 = 1/100 s +
7 = 1/80 s +
8 = 1/60 s
+(Z Series cameras thru November 2021) + +
1 = 1/200 s (auto FP) +
2 = 1/200 s +
3 = 1/160 s +
4 = 1/125 s
  5 = 1/100 s +
6 = 1/80 s +
7 = 1/60 s
+
0x0048FlashShutterSpeedno + +
1 = 1/60 s +
2 = 1/30 s +
3 = 1/15 s +
4 = 1/8 s
  5 = 1/4 s +
6 = 1/2 s +
7 = 1 s +
8 = 2 s
+
0x0049FlashExposureCompAreano1 = Entire Frame +
2 = Background Only
0x004aAutoFlashISOSensitivityno1 = Subject and Background +
2 = Subject Only
0x0051AssignBktButtonno1 = Auto Bracketing +
2 = Multiple Exposure +
3 = HDR (high dynamic range) +
4 = None
0x0052AssignMovieRecordButtonno(D6) +
1 = Voice Memo +
2 = Photo Shooting Bank +
3 = Exposure Mode +
4 = AF Mode/AF Area Mode +
5 = Image Area +
6 = Shutter/Aperture Lock +
7 = None
+(Z Series cameras thru November 2021) +
1 = AE Lock (hold) +
2 = AE Lock (reset on release) +
3 = Preview +
4 = +NEF(RAW) +
5 = LiveView Info Display On/Off +
6 = Grid Display +
7 = Zoom (Low) +
8 = Zoom (1:1) +
9 = Zoom (High) +
10 = My Menu +
11 = My Menu Top Item +
12 = Image Area +
13 = Image Quality +
14 = White Balance +
15 = Picture Control +
16 = Active-D Lighting +
17 = Metering +
18 = Flash Mode +
19 = Focus Mode +
20 = Auto Bracketing +
21 = Multiple Exposure +
22 = HDR +
23 = Exposure Delay Mode +
24 = Shutter/Aperture Lock +
25 = Non-CPU Lens +
26 = None
+
0x0053MultiSelectorShootModeno(D6) +
1 = Select Center Focus Point +
2 = Preset Focus Point - Press To Recall +
3 = Preset Focus Point - Hold To Recall +
4 = None +
(Z Series cameras thru November 2021) +
1 = Select Center Focus Point +
2 = Zoom (Low) +
3 = Zoom (1:1) +
4 = Zoom (High) +
5 = None
0x0054MultiSelectorPlaybackModeno(D6) + +
1 = Filtered Playback +
2 = View Histograms +
3 = Zoom (Low)
  4 = Zoom (1:1) +
5 = Zoom (High) +
6 = Choose Folder
+(Z Series cameras thru November 2021) + +
1 = Thumbnail On/Off +
2 = View Histograms +
3 = Zoom (Low)
  4 = Zoom (1:1) +
5 = Zoom (High) +
6 = Choose Folder
+
0x0056MultiSelectorLiveViewno1 = Select Center Focus Point +
2 = Zoom (Low) +
3 = Zoom (1:1) +
4 = Zoom (High) +
5 = None
0x0058CmdDialsReverseRotExposureComp?no 
0x0059CmdDialsChangeMainSubExposure?no 
0x005aCmdDialsChangeMainSubno1 = Autofocus On, Exposure On +
2 = Autofocus Off, Exposure On +
1 = Autofocus On, Exposure On (Mode A) +
2 = Autofocus Off, Exposure On (Mode A) +
1 = Autofocus On, Exposure Off +
2 = Autofocus Off, Exposure Off
0x005bCmdDialsMenuAndPlaybackno1 = On +
2 = On (Image Review Excluded) +
3 = Off
0x005cSubDialFrameAdvanceno + +
1 = 10 Frames +
2 = 50 Frames +
3 = Rating +
4 = Protect
  5 = Stills Only +
6 = Movies Only +
7 = Folder
+
0x005dReleaseButtonToUseDialno1 = Yes +
2 = No
0x005eReverseIndicatorsno1 = + 0 - +
2 = - 0 +
0x0062MovieShutterButtonno1 = Take Photo +
2 = Record Movie
0x0063Languageno5 = English +
6 = Spanish +
8 = French +
15 = Portuguese (Br)
0x006cShootingInfoDisplayno(D6) +
1 = Auto +
2 = Manual (dark on light) +
3 = Manual (light on dark) +
(Z Series cameras thru November 2021) +
1 = Manual (dark on light) +
2 = Manual (light on dark)
0x0074FlickAdvanceDirectionno1 = Right to Left +
2 = Left to Right
0x0075HDMIOutputResolutionno + +
1 = Auto +
2 = 2160p +
3 = 1080p +
4 = 1080i
  5 = 720p +
6 = 576p +
7 = 480p
+
0x0077HDMIOutputRangeno1 = Auto +
2 = Limit +
3 = Full
0x0080RemoteFuncButtonno(D6) +
1 = AF-On +
2 = AF Lock Only +
3 = AE Lock (reset on release) +
4 = AE Lock Only +
5 = AE/AF Lock +
6 = FV Lock +
7 = Flash Disable/Enable +
8 = Preview +
9 = +NEF(RAW) +
10 = LiveView Info Display On/Off +
11 = Recall Shooting Functions +
12 = None
+(Z Series cameras thru November 2021) +
1 = AF-On +
2 = AF Lock Only +
3 = AE Lock (reset on release) +
4 = AE Lock Only +
5 = AE/AF Lock +
6 = FV Lock +
7 = Flash Disable/Enable +
8 = Preview +
9 = +NEF(RAW) +
10 = None +
11 = LiveView Info Display On/Off
+
0x008bCmdDialsReverseRotationno1 = No +
2 = Shutter Speed & Aperture +
1 = Exposure Compensation +
2 = Exposure Compensation, Shutter Speed & Aperture
0x008dFocusPeakingHighlightColorno1 = Red +
2 = Yellow +
3 = Blue +
4 = White
0x008eContinuousModeDisplayno1 = On +
2 = Off
0x008fShutterSpeedLockno1 = On +
2 = Off
0x0090ApertureLockno1 = On +
2 = Off
0x0091MovieHighlightDisplayThresholdno + +
1 = 255 +
2 = 248 +
3 = 235 +
4 = 224
  5 = 213 +
6 = 202 +
7 = 191 +
8 = 180
+
0x0092HDMIExternalRecorderno1 = On +
2 = Off
0x0093BlockShotAFResponseno1 = 1 (Quick) +
2 = 2 +
3 = 3 (Normal) +
4 = 4 +
5 = 5 (Delay)
0x0094SubjectMotionno1 = Erratic +
2 = Steady
0x0095Three-DTrackingFaceDetectionno1 = On +
2 = Off
0x0097StoreByOrientationno(D6) +
1 = Focus Point +
2 = Focus Point and AF-area mode +
3 = Off +
(Z Series cameras thru November 2021) +
1 = Focus Point +
2 = Off
0x0099DynamicAreaAFAssistno1 = On +
2 = Off
0x009aExposureCompStepSizeno1 = 1/3 EV +
2 = 1/2 EV +
3 = 1 EV
0x009bSyncReleaseModeno1 = Sync +
2 = No Sync
0x009cModelingFlashno1 = On +
2 = Off
0x009dAutoBracketModeMno1 = Flash/Speed +
2 = Flash/Speed/Aperture +
3 = Flash/Aperture +
4 = Flash Only
0x009ePreviewButtonno +
1 = Preset Focus Point - Press To Recall +
2 = Preset Focus Point - Hold To Recall +
3 = AF-AreaMode S +
4 = AF-AreaMode D9 +
5 = AF-AreaMode D25 +
6 = AF-AreaMode D49 +
7 = AF-AreaMode D105 +
8 = AF-AreaMode 3D +
9 = AF-AreaMode Group +
10 = AF-AreaMode Group C1 +
11 = AF-AreaMode Group C2 +
12 = AF-AreaMode Auto Area +
13 = AF-AreaMode + AF-On S +
14 = AF-AreaMode + AF-On D9 +
15 = AF-AreaMode + AF-On D25 +
16 = AF-AreaMode + AF-On D49 +
17 = AF-AreaMode + AF-On D105 +
18 = AF-AreaMode + AF-On 3D +
19 = AF-AreaMode + AF-On Group +
20 = AF-AreaMode + AF-On Group C1 +
21 = AF-AreaMode + AF-On Group C2 +
22 = AF-AreaMode + AF-On Auto Area +
23 = AF-On +
24 = AF Lock Only +
25 = AE Lock (hold) +
26 = AE/WB Lock (hold) +
27 = AE Lock (reset on release) +
28 = AE Lock Only +
29 = AE/AF Lock +
30 = FV Lock +
31 = Flash Disable/Enable +
32 = Preview +
33 = Recall Shooting Functions +
34 = Bracketing Burst +
35 = Synchronized Release (Master) +
36 = Synchronized Release (Remote) +
39 = +NEF(RAW) +
40 = Grid Display +
41 = Virtual Horizon +
42 = Voice Memo +
43 = Wired LAN +
44 = My Menu +
45 = My Menu Top Item +
46 = Playback +
47 = Filtered Playback +
48 = Photo Shooting Bank +
49 = AF Mode/AF Area Mode +
50 = Image Area +
51 = Active-D Lighting +
52 = Exposure Delay Mode +
53 = Shutter/Aperture Lock +
54 = 1 Stop Speed/Aperture +
55 = Non-CPU Lens +
56 = None
+
0x00a0Func1Buttonno(D6) +
1 = Preset Focus Point - Press To Recall +
2 = Preset Focus Point - Hold To Recall +
3 = AF-AreaMode S +
4 = AF-AreaMode D9 +
5 = AF-AreaMode D25 +
6 = AF-AreaMode D49 +
7 = AF-AreaMode D105 +
8 = AF-AreaMode 3D +
9 = AF-AreaMode Group +
10 = AF-AreaMode Group C1 +
11 = AF-AreaMode Group C2 +
12 = AF-AreaMode Auto Area +
13 = AF-AreaMode + AF-On S +
14 = AF-AreaMode + AF-On D9 +
15 = AF-AreaMode + AF-On D25 +
16 = AF-AreaMode + AF-On D49 +
17 = AF-AreaMode + AF-On D105 +
18 = AF-AreaMode + AF-On 3D +
19 = AF-AreaMode + AF-On Group +
20 = AF-AreaMode + AF-On Group C1 +
21 = AF-AreaMode + AF-On Group C2 +
22 = AF-AreaMode + AF-On Auto Area +
23 = AF-On +
24 = AF Lock Only +
25 = AE Lock (hold) +
26 = AE/WB Lock (hold) +
27 = AE Lock (reset on release) +
28 = AE Lock Only +
29 = AE/AF Lock +
30 = FV Lock +
31 = Flash Disable/Enable +
32 = Preview +
33 = Recall Shooting Functions +
34 = Bracketing Burst +
35 = Synchronized Release (Master) +
36 = Synchronized Release (Remote) +
39 = +NEF(RAW) +
40 = Grid Display +
41 = Virtual Horizon +
42 = Voice Memo +
43 = Wired LAN +
44 = My Menu +
45 = My Menu Top Item +
46 = Playback +
47 = Filtered Playback +
48 = Photo Shooting Bank +
49 = AF Mode/AF Area Mode +
50 = Image Area +
51 = Active-D Lighting +
52 = Exposure Delay Mode +
53 = Shutter/Aperture Lock +
54 = 1 Stop Speed/Aperture +
55 = Non-CPU Lens +
56 = None
+(Z Series cameras thru November 2021) +
1 = AF-On +
2 = AF Lock Only +
3 = AE Lock (hold) +
4 = AE Lock (reset on release) +
5 = AE Lock Only +
6 = AE/AF Lock +
7 = FV Lock +
8 = Flash Disable/Enable +
9 = Preview +
10 = Matrix Metering +
11 = Center-weighted Metering +
12 = Spot Metering +
13 = Highlight-weighted Metering +
14 = Bracketing Burst +
15 = Synchronized Release (Master) +
16 = Synchronized Release (Remote) +
19 = +NEF(RAW) +
20 = Subject Tracking +
21 = Silent Photography +
22 = LiveView Info Display On/Off +
23 = Grid Display +
24 = Zoom (Low) +
25 = Zoom (1:1) +
26 = Zoom (High) +
27 = My Menu +
28 = My Menu Top Item +
29 = Playback +
30 = Protect +
31 = Image Area +
32 = Image Quality +
33 = White Balance +
34 = Picture Control +
35 = Active-D Lighting +
36 = Metering +
37 = Flash Mode +
38 = Focus Mode +
39 = Auto Bracketing +
40 = Multiple Exposure +
41 = HDR +
42 = Exposure Delay Mode +
43 = Shutter/Aperture Lock +
44 = Focus Peaking +
45 = Rating 0 +
46 = Rating 5 +
47 = Rating 4 +
48 = Rating 3 +
49 = Rating 2 +
50 = Rating 1 +
52 = None
+
0x00a2Func2Buttonno(D6) +
1 = Preset Focus Point - Press To Recall +
2 = Preset Focus Point - Hold To Recall +
3 = AF-AreaMode S +
4 = AF-AreaMode D9 +
5 = AF-AreaMode D25 +
6 = AF-AreaMode D49 +
7 = AF-AreaMode D105 +
8 = AF-AreaMode 3D +
9 = AF-AreaMode Group +
10 = AF-AreaMode Group C1 +
11 = AF-AreaMode Group C2 +
12 = AF-AreaMode Auto Area +
13 = AF-AreaMode + AF-On S +
14 = AF-AreaMode + AF-On D9 +
15 = AF-AreaMode + AF-On D25 +
16 = AF-AreaMode + AF-On D49 +
17 = AF-AreaMode + AF-On D105 +
18 = AF-AreaMode + AF-On 3D +
19 = AF-AreaMode + AF-On Group +
20 = AF-AreaMode + AF-On Group C1 +
21 = AF-AreaMode + AF-On Group C2 +
22 = AF-AreaMode + AF-On Auto Area +
23 = AF-On +
24 = AF Lock Only +
25 = AE Lock (hold) +
26 = AE/WB Lock (hold) +
27 = AE Lock (reset on release) +
28 = AE Lock Only +
29 = AE/AF Lock +
30 = FV Lock +
31 = Flash Disable/Enable +
32 = Preview +
33 = Recall Shooting Functions +
34 = Bracketing Burst +
35 = Synchronized Release (Master) +
36 = Synchronized Release (Remote) +
39 = +NEF(RAW) +
40 = Grid Display +
41 = Virtual Horizon +
42 = Voice Memo +
43 = Wired LAN +
44 = My Menu +
45 = My Menu Top Item +
46 = Playback +
47 = Filtered Playback +
48 = Photo Shooting Bank +
49 = AF Mode/AF Area Mode +
50 = Image Area +
51 = Active-D Lighting +
52 = Exposure Delay Mode +
53 = Shutter/Aperture Lock +
54 = 1 Stop Speed/Aperture +
55 = Non-CPU Lens +
56 = None
+(Z Series cameras thru November 2021) +
1 = AF-On +
2 = AF Lock Only +
3 = AE Lock (hold) +
4 = AE Lock (reset on release) +
5 = AE Lock Only +
6 = AE/AF Lock +
7 = FV Lock +
8 = Flash Disable/Enable +
9 = Preview +
10 = Matrix Metering +
11 = Center-weighted Metering +
12 = Spot Metering +
13 = Highlight-weighted Metering +
14 = Bracketing Burst +
15 = Synchronized Release (Master) +
16 = Synchronized Release (Remote) +
19 = +NEF(RAW) +
20 = Subject Tracking +
21 = Silent Photography +
22 = LiveView Info Display On/Off +
23 = Grid Display +
24 = Zoom (Low) +
25 = Zoom (1:1) +
26 = Zoom (High) +
27 = My Menu +
28 = My Menu Top Item +
29 = Playback +
30 = Protect +
31 = Image Area +
32 = Image Quality +
33 = White Balance +
34 = Picture Control +
35 = Active-D Lighting +
36 = Metering +
37 = Flash Mode +
38 = Focus Mode +
39 = Auto Bracketing +
40 = Multiple Exposure +
41 = HDR +
42 = Exposure Delay Mode +
43 = Shutter/Aperture Lock +
44 = Focus Peaking +
45 = Rating 0 +
46 = Rating 5 +
47 = Rating 4 +
48 = Rating 3 +
49 = Rating 2 +
50 = Rating 1 +
52 = None
+
0x00a3AF-OnButtonno(D6) +
1 = AF-AreaMode S +
2 = AF-AreaMode D9 +
3 = AF-AreaMode D25 +
4 = AF-AreaMode D49 +
5 = AF-AreaMode D105 +
6 = AF-AreaMode 3D +
7 = AF-AreaMode Group +
8 = AF-AreaMode Group C1 +
9 = AF-AreaMode Group C2 +
10 = AF-AreaMode Auto Area +
11 = AF-AreaMode + AF-On S +
12 = AF-AreaMode + AF-On D9 +
13 = AF-AreaMode + AF-On D25 +
14 = AF-AreaMode + AF-On D49 +
15 = AF-AreaMode + AF-On D105 +
16 = AF-AreaMode + AF-On 3D +
17 = AF-AreaMode + AF-On Group +
18 = AF-AreaMode + AF-On Group C1 +
19 = AF-AreaMode + AF-On Group C2 +
20 = AF-AreaMode + AF-On Auto Area +
21 = AF-On +
22 = AF Lock Only +
23 = AE Lock (hold) +
24 = AE/WB Lock (hold) +
25 = AE Lock (reset on release) +
26 = AE Lock Only +
27 = AE/AF Lock +
28 = Recall Shooting Functions +
29 = None
+(Z Series cameras thru November 2021) +
1 = Center Focus Point +
2 = AF-On +
3 = AF Lock Only +
4 = AE Lock (hold) +
5 = AE Lock (reset on release) +
6 = AE Lock Only +
7 = AE/AF Lock +
8 = LiveView Info Display On/Off +
9 = Zoom (Low) +
10 = Zoom (1:1) +
11 = Zoom (High) +
12 = None
+
0x00a4SubSelectorno1 = Same as MultiSelector +
2 = Focus Point Selection
0x00a5SubSelectorCenterno(D6) +
1 = Preset Focus Point - Press To Recall +
2 = Preset Focus Point - Hold To Recall +
3 = Center Focus Point +
4 = AF-AreaMode S +
5 = AF-AreaMode D9 +
6 = AF-AreaMode D25 +
7 = AF-AreaMode D49 +
8 = AF-AreaMode D105 +
9 = AF-AreaMode 3D +
10 = AF-AreaMode Group +
11 = AF-AreaMode Group C1 +
12 = AF-AreaMode Group C2 +
13 = AF-AreaMode Auto Area +
14 = AF-AreaMode + AF-On S +
15 = AF-AreaMode + AF-On D9 +
16 = AF-AreaMode + AF-On D25 +
17 = AF-AreaMode + AF-On D49 +
18 = AF-AreaMode + AF-On D105 +
19 = AF-AreaMode + AF-On 3D +
20 = AF-AreaMode + AF-On Group +
21 = AF-AreaMode + AF-On Group C1 +
22 = AF-AreaMode + AF-On Group C2 +
23 = AF-AreaMode + AF-On Auto Area +
24 = AF-On +
25 = AF Lock Only +
26 = AE Lock (hold) +
27 = AE/WB Lock (hold) +
28 = AE Lock (reset on release) +
29 = AE Lock Only +
30 = AE/AF Lock +
31 = FV Lock +
32 = Flash Disable/Enable +
33 = Preview +
34 = Recall Shooting Functions +
35 = Bracketing Burst +
36 = Synchronized Release (Master) +
37 = Synchronized Release (Remote) +
38 = None
+(Z Series cameras thru November 2021) +
1 = Center Focus Point +
2 = AF-On +
3 = AF Lock Only +
4 = AE Lock (hold) +
5 = AE Lock (reset on release) +
6 = AE Lock Only +
7 = AE/AF Lock +
8 = FV Lock +
9 = Flash Disable/Enable +
10 = Preview +
11 = Matrix Metering +
12 = Center-weighted Metering +
13 = Spot Metering +
14 = Highlight-weighted Metering +
15 = Bracketing Burst +
16 = Synchronized Release (Master) +
17 = Synchronized Release (Remote) +
20 = +NEF(RAW) +
21 = LiveView Info Display On/Off +
22 = Grid Display +
23 = Image Area +
24 = Non-CPU Lens +
25 = None
+
0x00a7LensFunc1Buttonno(D6) +
1 = Preset Focus Point - Press To Recall +
2 = Preset Focus Point - Hold To Recall +
3 = AF-AreaMode S +
4 = AF-AreaMode D9 +
5 = AF-AreaMode D25 +
6 = AF-AreaMode D49 +
7 = AF-AreaMode D105 +
8 = AF-AreaMode 3D +
9 = AF-AreaMode Group +
10 = AF-AreaMode Group C1 +
11 = AF-AreaMode Group C2 +
12 = AF-AreaMode Auto Area +
13 = AF-AreaMode + AF-On S +
14 = AF-AreaMode + AF-On D9 +
15 = AF-AreaMode + AF-On D25 +
16 = AF-AreaMode + AF-On D49 +
17 = AF-AreaMode + AF-On D105 +
18 = AF-AreaMode + AF-On 3D +
19 = AF-AreaMode + AF-On Group +
20 = AF-AreaMode + AF-On Group C1 +
21 = AF-AreaMode + AF-On Group C2 +
22 = AF-AreaMode + AF-On Auto Area +
23 = AF-On +
24 = AF Lock Only +
25 = AE Lock Only +
26 = AE/AF Lock +
27 = Flash Disable/Enable +
28 = Recall Shooting Functions +
29 = Synchronized Release (Master) +
30 = Synchronized Release (Remote)
+(Z Series cameras thru November 2021) +
1 = AF-On +
2 = AF Lock Only +
3 = AE Lock (hold) +
4 = AE Lock (reset on release) +
5 = AE Lock Only +
6 = AE/AF Lock +
7 = FV Lock +
8 = Flash Disable/Enable +
9 = Preview +
10 = Matrix Metering +
11 = Center-weighted Metering +
12 = Spot Metering +
13 = Highlight-weighted Metering +
14 = Bracketing Burst +
15 = Synchronized Release (Master) +
16 = Synchronized Release (Remote) +
19 = +NEF(RAW) +
20 = Subject Tracking +
21 = Grid Display +
22 = Zoom (Low) +
23 = Zoom (1:1) +
24 = Zoom (High) +
25 = My Menu +
26 = My Menu Top Item +
27 = Playback +
28 = None
+
0x00a8CmdDialsApertureSettingno1 = Sub-command Dial +
2 = Aperture Ring
0x00a9MultiSelectorno1 = Restart Standby Timer +
2 = Do Nothing
0x00aaLiveViewButtonOptionsno1 = Enable +
2 = Enable (Standby Timer Active) +
3 = Disable
0x00abLightSwitchno1 = LCD Backlight +
2 = LCD Backlight and Shooting Information
0x00b1MoviePreviewButton +
MovieFunc1Button
no
no
(D6) +
1 = Power Aperture (Open) +
2 = Exposure Compensation +
3 = Grid Display +
4 = Zoom (Low) +
5 = Zoom (1:1) +
6 = Zoom (High) +
7 = Image Area +
8 = Microphone Sensitivity +
9 = None
+(Z Series cameras thru November 2021) +
1 = Power Aperture (Open) +
2 = Exposure Compensation +
3 = Subject Tracking +
4 = LiveView Info Display On/Off +
5 = Grid Display +
6 = Zoom (Low) +
7 = Zoom (1:1) +
8 = Zoom (High) +
9 = Protect +
10 = Image Area +
11 = White Balance +
12 = Picture Control +
13 = Active-D Lighting +
14 = Metering +
15 = Focus Mode +
16 = Microphone Sensitivity +
17 = Focus Peaking +
18 = Rating (None) +
19 = Rating (5) +
20 = Rating (4) +
21 = Rating (3) +
22 = Rating (2) +
23 = Rating (1) +
25 = None
+
0x00b3MovieFunc1Button +
MovieFunc2Button
no
no
(D6) +
1 = Power Aperture (Close) +
2 = Exposure Compensation +
3 = Grid Display +
4 = Zoom (Low) +
5 = Zoom (1:1) +
6 = Zoom (High) +
7 = Image Area +
8 = Microphone Sensitivity +
9 = None
+(Z Series cameras thru November 2021) +
1 = Power Aperture (Close) +
2 = Exposure Compensation +
3 = Subject Tracking +
4 = LiveView Info Display On/Off +
5 = Grid Display +
6 = Zoom (Low) +
7 = Zoom (1:1) +
8 = Zoom (High) +
9 = Protect +
10 = Image Area +
11 = White Balance +
12 = Picture Control +
13 = Active-D Lighting +
14 = Metering +
15 = Focus Mode +
16 = Microphone Sensitivity +
17 = Focus Peaking +
18 = Rating (None) +
19 = Rating (5) +
20 = Rating (4) +
21 = Rating (3) +
22 = Rating (2) +
23 = Rating (1) +
25 = None
+
0x00b5MovieFunc2Buttonno +
1 = Grid Display +
2 = Zoom (Low) +
3 = Zoom (1:1) +
4 = Zoom (High) +
5 = Image Area +
6 = Microphone Sensitivity +
7 = None
+
0x00b6AssignMovieSubselectorno(D6) + +
1 = Center Focus Point +
2 = AF Lock Only +
3 = AE Lock (hold) +
4 = AE/WB Lock (hold) +
5 = AE Lock Only +
6 = AE/AF Lock
  7 = Zoom (Low) +
8 = Zoom (1:1) +
9 = Zoom (High) +
10 = Record Movie +
11 = None
+(Z Series cameras thru November 2021) +
1 = Center Focus Point +
2 = AF Lock Only +
3 = AE Lock (hold) +
4 = AE Lock Only +
5 = AE/AF Lock +
6 = LiveView Info Display On/Off +
7 = Grid Display +
8 = Zoom (Low) +
9 = Zoom (1:1) +
10 = Zoom (High) +
11 = Record Movie +
12 = Image Area +
13 = None
+
0x00b8LimitAFAreaModeSelD9?no1 = Limit +
2 = No Limit
0x00b9LimitAFAreaModeSelD25?no1 = Limit +
2 = No Limit
0x00bcLimitAFAreaModeSel3D?no1 = Limit +
2 = No Limit
0x00bdLimitAFAreaModeSelGroup?no1 = Limit +
2 = No Limit
0x00beLimitAFAreaModeSelAuto?no1 = Limit +
2 = No Limit
0x00c1LimitSelectableImageArea5To4?no1 = Limit +
2 = No Limit
0x00c2LimitSelectableImageArea1To1?no1 = Limit +
2 = No Limit
0x00d4PhotoShootingMenuBankno1 = A +
2 = B +
3 = C +
4 = D
0x00d5CustomSettingsBankno1 = A +
2 = B +
3 = C +
4 = D
0x00d6LimitAF-AreaModeSelPinpoint?no1 = Limit +
2 = No Limit
0x00d7LimitAF-AreaModeSelDynamic?no1 = Limit +
2 = No Limit
0x00d8LimitAF-AreaModeSelWideAF_S?no1 = Limit +
2 = No Limit
0x00d9LimitAF-AreaModeSelWideAF_L?no1 = Limit +
2 = No Limit
0x00daLowLightAFno1 = On +
2 = Off
0x00dbLimitSelectableImageAreaDX?no1 = Limit +
2 = No Limit
0x00dcLimitSelectableImageArea5To4?no1 = Limit +
2 = No Limit
0x00ddLimitSelectableImageArea1To1?no1 = Limit +
2 = No Limit
0x00deLimitSelectableImageArea16To9?no1 = Limit +
2 = No Limit
0x00dfApplySettingsToLiveViewno1 = On +
2 = Off
0x00e0FocusPeakingLevelno1 = High Sensitivity +
2 = Standard Sensitivity +
3 = Low Sensitivity +
4 = Off
0x00eaLensControlRingno1 = Aperture +
2 = Exposure Compensation +
3 = ISO Sensitivity +
4 = None (Disabled)
0x00edMovieMultiSelectorno(D6) + +
1 = Center Focus Point +
2 = Zoom (Low) +
3 = Zoom (1:1)
  4 = Zoom (High) +
5 = Record Movie +
6 = None
+ + +
1 = Center Focus Point +
2 = Zoom (Low) +
3 = Zoom (1:1)
  4 = Zoom (High) +
5 = Record Movie +
6 = None
+
0x00eeMovieAFSpeedno 
0x00efMovieAFSpeedApplyno1 = Always +
2 = Only During Recording
0x00f0MovieAFTrackingSensitivityno + +
1 = 1 (High) +
2 = 2 +
3 = 3 +
4 = 4 (Normal)
  5 = 5 +
6 = 6 +
7 = 7 (Low)
+
0x00f1MovieHighlightDisplayPatternno1 = Pattern 1 +
2 = Pattern 2 +
3 = Off
0x00f2SubDialFrameAdvanceRating5?no1 = No +
2 = Yes
0x00f3SubDialFrameAdvanceRating4?no1 = No +
2 = Yes
0x00f4SubDialFrameAdvanceRating3?no1 = No +
2 = Yes
0x00f5SubDialFrameAdvanceRating2?no1 = No +
2 = Yes
0x00f6SubDialFrameAdvanceRating1?no1 = No +
2 = Yes
0x00f7SubDialFrameAdvanceRating0?no1 = No +
2 = Yes
0x00f9MovieAF-OnButtonno +
1 = Center Focus Point +
2 = AF-On +
3 = AF Lock Only +
4 = AE Lock (hold) +
5 = AE Lock Only +
6 = AE/AF Lock +
7 = LiveView Info Display On/Off +
8 = Zoom (Low) +
9 = Zoom (1:1) +
10 = Zoom (High) +
11 = Record Movie +
12 = None
+
0x00fbSecondarySlotFunctionno1 = Overflow +
2 = Backup +
3 = NEF Primary + JPG Secondary +
4 = JPG Primary + JPG Secondary
0x00fcSilentPhotographyno1 = On +
2 = Off
0x00fdExtendedShutterSpeedsno1 = On +
2 = Off
0x0102HDMIBitDepthno1 = 8 Bit +
2 = 10 Bit
0x0103HDMIOutputHDRno2 = On +
3 = Off
0x0104HDMIViewAssistno1 = On +
2 = Off
0x0109BracketSetno1 = AE/Flash +
2 = AE +
3 = Flash +
4 = White Balance +
5 = Active-D Lighting
0x010aBracketProgramno(AE and/or Flash Bracketing) + + +
15 = +3F +
16 = -3F +
17 = +2F
  18 = -2F +
19 = Disabled +
20 = 3F
  21 = 5F +
22 = 7F +
23 = 9F
+(White Balance Bracketing) + + +
1 = B3F +
2 = A3F +
3 = B2F +
4 = A2F
  5 = Disabled +
6 = 3F +
7 = 5F +
8 = 7F
  9 = 9F +
19 = N/A
+(Active-D Bracketing) +
[val & 0xf] +
10 = Disabled +
11 = 2 Exposures +
12 = 3 Exposures +
13 = 4 Exposures +
14 = 5 Exposures
0x010bBracketIncrementno(AE and/or Flash Bracketing enabled) +
1 = 0.3 +
3 = 0.5 +
4 = 1.0 +
5 = 2.0 +
6 = 3.0 +
(White Balance Bracketing enabled)
0x010cBracketIncrementno(Active-D Bracketing enabled) +
0 = Off +
1 = Off, Low +
2 = Off, Normal +
3 = Off, High +
4 = Off, Extra High +
5 = Off, Auto +
6 = Off, Low, Normal +
7 = Off, Low, Normal, High +
8 = Off, Low, Normal, High, Extra High
+
0x010eMonitorBrightnessno 
0x0116GroupAreaC1no + + + +
1 = 1x7 +
2 = 1x5 +
3 = 3x7 +
4 = 3x5 +
5 = 3x3
  6 = 5x7 +
7 = 5x5 +
8 = 5x3 +
9 = 5x1 +
10 = 7x7
  11 = 7x5 +
12 = 7x3 +
13 = 7x1 +
14 = 11x3 +
15 = 11x1
  16 = 15x3 +
17 = 15x1
+
0x0117AutoAreaAFStartingPointno1 = Enable +
2 = Disable
0x0118FocusPointPersistenceno1 = Auto +
2 = Off
0x0119LimitAFAreaModeSelD49?no1 = Limit +
2 = No Limit
0x011aLimitAFAreaModeSelD105?no1 = Limit +
2 = No Limit
0x011bLimitAFAreaModeSelGroupC1?no1 = Limit +
2 = No Limit
0x011cLimitAFAreaModeSelGroupC2?no1 = Limit +
2 = No Limit
0x011dAutoFocusModeRestrictionsno1 = AF-S +
2 = AF-C +
3 = No Limit
0x011eFocusPointBrightnessno1 = Extra High +
2 = High +
3 = Normal +
4 = Low
0x011fCHModeShootingSpeedno 
0x0120CLModeShootingSpeedno 
0x0121QuietShutterShootingSpeedno + +
1 = Single +
2 = 5 fps +
3 = 4 fps
  4 = 3 fps +
5 = 2 fps +
6 = 1 fps
+
0x0122LimitReleaseModeSelCL?no0 = No Limit +
1 = Limit +
2 = No Limit
0x0123LimitReleaseModeSelCH?no0 = No Limit +
1 = Limit +
2 = No Limit
0x0124LimitReleaseModeSelQ?no0 = No Limit +
1 = Limit +
2 = No Limit
0x0125LimitReleaseModeSelTimer?no0 = No Limit +
1 = Limit +
2 = No Limit
0x0126LimitReleaseModeSelMirror-Up?no0 = No Limit +
1 = Limit +
2 = No Limit
0x0127LimitSelectableImageArea16To9?no1 = Limit +
2 = No Limit
0x0128RearControPanelDisplayno1 = Release Mode +
2 = Frame Count
0x0129FlashBurstPriorityno1 = Frame Rate +
2 = Exposure
0x012aRecallShootFuncExposureModeno1 = Off +
2 = On
0x012bRecallShootFuncShutterSpeedno1 = Off +
2 = On
0x012cRecallShootFuncApertureno1 = Off +
2 = On
0x012dRecallShootFuncExposureCompno1 = Off +
2 = On
0x012eRecallShootFuncISOno1 = Off +
2 = On
0x012fRecallShootFuncMeteringModeno1 = Off +
2 = On
0x0130RecallShootFuncWhiteBalanceno1 = Off +
2 = On
0x0131RecallShootFuncAFAreaModeno1 = Off +
2 = On
0x0132RecallShootFuncFocusTrackingno1 = Off +
2 = On
0x0133RecallShootFuncAF-Onno1 = Off +
2 = On
0x0134VerticalFuncButtonno +
1 = Preset Focus Point +
2 = AE Lock (hold) +
3 = AE/WB Lock (hold) +
4 = AE Lock (reset on release) +
5 = FV Lock +
6 = Preview +
7 = +NEF(RAW) +
8 = Grid Display +
9 = Virtual Horizon +
10 = Voice Memo +
11 = Playback +
12 = Filtered Playback +
13 = Photo Shooting Bank +
14 = Exposure Mode +
15 = Exposure Comp +
16 = AF Mode/AF Area Mode +
17 = Image Area +
18 = ISO +
19 = Active-D Lighting +
20 = Metering +
21 = Exposure Delay Mode +
22 = Shutter/Aperture Lock +
23 = 1 Stop Speed/Aperture +
24 = Rating 0 +
25 = Rating 5 +
26 = Rating 4 +
27 = Rating 3 +
28 = Rating 2 +
29 = Rating 1 +
30 = Candidate For Deletion +
31 = Non-CPU Lens +
32 = None
+
0x0135Func3Buttonno +
1 = Voice Memo +
2 = Select To Send +
3 = Wired LAN +
4 = My Menu +
5 = My Menu Top Item +
6 = Filtered Playback +
7 = Rating 0 +
8 = Rating 5 +
9 = Rating 4 +
10 = Rating 3 +
11 = Rating 2 +
12 = Rating 1 +
13 = Candidate For Deletion +
14 = None
+
0x0136VerticalAF-OnButtonno +
1 = AF-AreaMode S +
2 = AF-AreaMode D9 +
3 = AF-AreaMode D25 +
4 = AF-AreaMode D49 +
5 = AF-AreaMode D105 +
6 = AF-AreaMode 3D +
7 = AF-AreaMode Group +
8 = AF-AreaMode Group C1 +
9 = AF-AreaMode Group C2 +
10 = AF-AreaMode Auto Area +
11 = AF-AreaMode + AF-On S +
12 = AF-AreaMode + AF-On D9 +
13 = AF-AreaMode + AF-On D25 +
14 = AF-AreaMode + AF-On D49 +
15 = AF-AreaMode + AF-On D105 +
16 = AF-AreaMode + AF-On 3D +
17 = AF-AreaMode + AF-On Group +
18 = AF-AreaMode + AF-On Group C1 +
19 = AF-AreaMode + AF-On Group C2 +
20 = AF-AreaMode + AF-On Auto Area +
21 = Same as AF-On +
22 = AF-On +
23 = AF Lock Only +
24 = AE Lock (hold) +
25 = AE/WB Lock (hold) +
26 = AE Lock (reset on release) +
27 = AE Lock Only +
28 = AE/AF Lock +
29 = Recall Shooting Functions +
30 = None
+
0x0137VerticalMultiSelectorno1 = Same as MultiSelector +
2 = Focus Point Selection
0x0138MeteringButtonno +
1 = Photo Shooting Bank +
2 = Image Area +
3 = Active-D Lighting +
4 = Metering +
5 = Exposure Delay Mode +
6 = Shutter/Aperture Lock +
7 = 1 Stop Speed/Aperture +
8 = Non-CPU Lens +
9 = None
+
0x0139PlaybackFlickUpno1 = Rating +
2 = Select To Send +
3 = Protect +
4 = Voice Memo +
5 = None
0x013aPlaybackFlickUpRatingno(Meaningful only when PlaybackFlickUp is Rating) +
1 = Rating 5 +
2 = Rating 4 +
3 = Rating 3 +
4 = Rating 2 +
5 = Rating 1 +
6 = Candidate for Deletion
+
0x013bPlaybackFlickDownno1 = Rating +
2 = Select To Send +
3 = Protect +
4 = Voice Memo +
5 = None
0x013cPlaybackFlickDownRatingno(Meaningful only when PlaybackFlickDown is Rating) +
1 = Rating 5 +
2 = Rating 4 +
3 = Rating 3 +
4 = Rating 2 +
5 = Rating 1 +
6 = Candidate for Deletion
+
0x013dMovieFunc3Buttonno1 = Record Movie +
2 = My Menu +
3 = My Menu Top Item +
4 = None
0x0150ShutterTypeno1 = Auto +
2 = Mechanical +
3 = Electronic
0x0151LensFunc2Buttonno +
1 = AF-On +
2 = AF Lock Only +
3 = AE Lock (hold) +
4 = AE Lock (reset on release) +
5 = AE Lock Only +
6 = AE/AF Lock +
7 = FV Lock +
8 = Flash Disable/Enable +
9 = Preview +
10 = Matrix Metering +
11 = Center-weighted Metering +
12 = Spot Metering +
13 = Highlight-weighted Metering +
14 = Bracketing Burst +
15 = Synchronized Release (Master) +
16 = Synchronized Release (Remote) +
19 = +NEF(RAW) +
20 = Subject Tracking +
21 = Grid Display +
22 = Zoom (Low) +
23 = Zoom (1:1) +
24 = Zoom (High) +
25 = My Menu +
26 = My Menu Top Item +
27 = Playback +
28 = None
+
0x0158USBPowerDeliveryno1 = Enable +
2 = Disable
0x0159EnergySavingModeno1 = On +
2 = Off
0x015cBracketingBurstOptionsno1 = Enable +
2 = Disable
0x015ePrimarySlotno1 = CFexpress/XQD Card +
2 = SD Card
0x015fReverseFocusRingno1 = Not Reversed +
2 = Reversed
0x0160VerticalFuncButtonno +
1 = AE Lock (hold) +
2 = AE Lock (reset on release) +
3 = FV Lock +
4 = Preview +
5 = +NEF(RAW) +
6 = Subject Tracking +
7 = Silent Photography +
8 = LiveView Info Display On/Off +
9 = Playback +
10 = Image Area +
11 = Metering +
12 = Flash Mode +
13 = Focus Mode +
14 = Exposure Delay Mode +
15 = Shutter/Aperture Lock +
16 = Exposure Compensation +
17 = ISO Sensitivity +
18 = None
+
0x0161VerticalAFOnButtonno +
1 = Same as AF-On Button +
2 = Select Center Focus Point +
3 = AF-On +
4 = AF Lock Only +
5 = AE Lock (hold) +
6 = AE Lock (reset on release) +
7 = AE Lock Only +
8 = AE/AF Lock +
9 = LiveView Info Display On/Off +
10 = Zoom (Low) +
11 = Zoom (1:1) +
12 = Zoom (High) +
13 = None
+
0x0162VerticalMultiSelectorno1 = Same as MultiSelector +
2 = Focus Point Selection
0x0164VerticalMovieFuncButtonno1 = LiveView Info Display On/Off +
2 = Record Movie +
3 = Exposure Compensation +
4 = ISO +
5 = None
0x0165VerticalMovieAFOnButtonno +
1 = Same as AF-On +
2 = Center Focus Point +
3 = AF-On +
4 = AF Lock Only +
5 = AE Lock (hold) +
6 = AE Lock Only +
7 = AE/AF Lock +
8 = LiveView Info Display On/Off +
9 = Zoom (Low) +
10 = Zoom (1:1) +
11 = Zoom (High) +
12 = Record Movie +
13 = None
+
0x0169LimitAF-AreaModeSelAutoPeople?no1 = Limit +
2 = No Limit
0x016aLimitAF-AreaModeSelAutoAnimals?no1 = Limit +
2 = No Limit
0x016bLimitAF-AreaModeSelWideLPeople?no1 = Limit +
2 = No Limit
0x016cLimitAF-AreaModeSelWideLAnimals?no1 = Limit +
2 = No Limit
0x016dSaveFocusno1 = On +
2 = Off
0x016eAFAreaModeno + +
2 = Single-point +
3 = Dynamic-area +
4 = Wide (S) +
5 = Wide (L) +
6 = Wide (L-people)
  7 = Wide (L-animals) +
8 = Auto +
9 = Auto (People) +
10 = Auto (Animals)
+
0x016fMovieAFAreaModeno + +
1 = Single-point +
2 = Wide (S) +
3 = Wide (L) +
4 = Wide (L-people)
  5 = Wide (L-animals) +
6 = Auto +
7 = Auto (People) +
8 = Auto (Animals)
+
0x0170PreferSubSelectorCenterno1 = Off +
2 = On
0x0171KeepExposureWithTeleconverterno1 = Off +
2 = Shutter Speed +
3 = ISO
0x0174FocusPointSelectionSpeedno1 = Normal +
2 = High +
3 = Very High
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 12, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Nintendo.html b/html/TagNames/Nintendo.html new file mode 100644 index 0000000..d91a226 --- /dev/null +++ b/html/TagNames/Nintendo.html @@ -0,0 +1,64 @@ + + + + +Nintendo Tags + + + +

Nintendo Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x1101CameraInfo---> Nintendo CameraInfo Tags
+ +

Nintendo CameraInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ModelIDundef[4] 
8TimeStampint32u 
24InternalSerialNumberundef[4] 
40Parallaxfloat 
48Categoryint16u0x0 = (none) +
0x1000 = Mii +
0x2000 = Man +
0x4000 = Woman
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Mar 25, 2014 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/OOXML.html b/html/TagNames/OOXML.html new file mode 100644 index 0000000..c82bc7f --- /dev/null +++ b/html/TagNames/OOXML.html @@ -0,0 +1,281 @@ + + + + +OOXML Tags + + + +

OOXML Tags

+

The Office Open XML (OOXML) format was introduced with Microsoft Office 2007 +and is used by file types such as DOCX, PPTX and XLSX. These are +essentially ZIP archives containing XML files. The table below lists some +tags which have been observed in OOXML documents, but ExifTool will extract +any tags found from XML files of the OOXML document properties ("docProps") +directory.

+ +

Tips:

+ +

1) Structural ZIP tags may be ignored (if desired) with --ZIP:all on the +command line.

+ +

2) Tags may be grouped by their document number in the ZIP archive with the +-g3 or -G3 option.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AppVersionno 
Applicationno 
Categoryno 
Charactersno 
CharactersWithSpacesno 
CheckedByno 
Clientno 
Companyno 
CreateDateno 
DateCompletedno 
Departmentno 
Destinationno 
Dispositionno 
Divisionno 
DocSecurityno0 = None +
1 = Password protected +
2 = Read-only recommended +
4 = Read-only enforced +
8 = Locked for annotations
DocumentNumberno 
Editorno 
ForwardTono 
Groupno 
HeadingPairsno 
HiddenSlidesno 
HyperlinkBaseno 
HyperlinksChangedno'false' = No +
'true' = Yes
Keywordsno 
Languageno 
LastModifiedByno 
LastPrintedno 
Linesno 
LinksUpToDateno'false' = No +
'true' = Yes
MMClipsno 
Mailstopno 
Managerno 
Matterno 
ModifyDateno 
Notesno 
Officeno 
Ownerno 
Pagesno 
Paragraphsno 
PresentationFormatno 
Projectno 
Publisherno 
Purposeno 
ReceivedFromno 
RecordedByno 
RecordedDateno 
Referenceno 
RevisionNumberno 
ScaleCropno'false' = No +
'true' = Yes
SharedDocno'false' = No +
'true' = Yes
Slidesno 
Sourceno 
Statusno 
TelephoneNumberno 
Templateno 
TitlesOfPartsno 
TotalEditTimeno 
Typistno 
Wordsno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 29, 2010 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Ogg.html b/html/TagNames/Ogg.html new file mode 100644 index 0000000..853c95b --- /dev/null +++ b/html/TagNames/Ogg.html @@ -0,0 +1,50 @@ + + + + +Ogg Tags + + + +

Ogg Tags

+

ExifTool extracts the following types of information from Ogg files. See +http://www.xiph.org/vorbis/doc/ for the Ogg specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'FLAC'FLAC---> FLAC Tags
'ID3'ID3---> ID3 Tags
'Opus'Opus---> Opus Tags
'theora'Theora---> Theora Tags
'vorbis'Vorbis---> Vorbis Tags
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 14, 2016 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Olympus.html b/html/TagNames/Olympus.html new file mode 100644 index 0000000..30a7a67 --- /dev/null +++ b/html/TagNames/Olympus.html @@ -0,0 +1,3739 @@ + + + + +Olympus Tags + + + +

Olympus Tags

+

+Tags 0x0000 through 0x0103 are used by some older Olympus cameras, and are +the same as Konica/Minolta tags. These tags are also used for some models +from other brands such as Acer, BenQ, Epson, Hitachi, HP, Maginon, Minolta, +Pentax, Ricoh, Samsung, Sanyo, SeaLife, Sony, Supra and Vivitar. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000MakerNoteVersionundef 
0x0001MinoltaCameraSettingsOld---> Minolta CameraSettings Tags
0x0003MinoltaCameraSettings---> Minolta CameraSettings Tags
0x0040CompressedImageSizeint32u 
0x0081PreviewImageDatano 
0x0088PreviewImageStartno 
0x0089PreviewImageLengthno 
0x0100ThumbnailImageundef 
0x0104BodyFirmwareVersionstring 
0x0200SpecialModeint32u[3]~(3 numbers: 1. Shooting mode: 0=Normal, 2=Fast, 3=Panorama; +2. Sequence Number; 3. Panorama Direction: 1=Left-right, +2=Right-left, 3=Bottom-Top, 4=Top-Bottom)
0x0201Qualityint16u~(Quality values are decoded based on the CameraType tag. All types +represent SQ, HQ and SHQ as sequential integers, but in general +SX-type cameras start with a value of 0 for SQ while others start +with 1)
0x0202Macroint16u0 = Off +
1 = On +
2 = Super Macro
0x0203BWModeint16u0 = Off +
1 = On +
6 = (none)
0x0204DigitalZoomrational64u 
0x0205FocalPlaneDiagonalrational64u 
0x0206LensDistortionParamsint16s[6] 
0x0207CameraTypestring--> Olympus CameraType Values
0x0208TextInfo---> Olympus TextInfo Tags
0x0209CameraIDstring 
0x020bEpsonImageWidthint32u 
0x020cEpsonImageHeightint32u 
0x020dEpsonSoftwarestring 
0x0280PreviewImageint8u(found in ERF and JPG images from some Epson models)
0x0300PreCaptureFramesint16u 
0x0301WhiteBoardint16u 
0x0302OneTouchWBint16u0 = Off +
1 = On +
2 = On (Preset)
0x0303WhiteBalanceBracketint16u 
0x0304WhiteBalanceBiasint16u 
0x0400SensorAreaundef[8](found in Epson ERF images)
0x0401BlackLevelint32u[4](found in Epson ERF images)
0x0403SceneModeint16u + +
0 = Normal +
1 = Standard +
2 = Auto +
3 = Intelligent Auto +
4 = Portrait +
5 = Landscape+Portrait +
6 = Landscape +
7 = Night Scene +
8 = Night+Portrait +
9 = Sport +
10 = Self Portrait +
11 = Indoor +
12 = Beach & Snow +
13 = Beach +
14 = Snow +
15 = Self Portrait+Self Timer +
16 = Sunset +
17 = Cuisine +
18 = Documents +
19 = Candle
  20 = Fireworks +
21 = Available Light +
22 = Vivid +
23 = Underwater Wide1 +
24 = Underwater Macro +
25 = Museum +
26 = Behind Glass +
27 = Auction +
28 = Shoot & Select1 +
29 = Shoot & Select2 +
30 = Underwater Wide2 +
31 = Digital Image Stabilization +
32 = Face Portrait +
33 = Pet +
34 = Smile Shot +
35 = Quick Shutter +
43 = Hand-held Starlight +
100 = Panorama +
101 = Magic Filter +
103 = HDR
+
0x0404SerialNumberstring 
0x0405Firmwarestring 
0x0e00PrintIM---> PrintIM Tags
0x0f00DataDumpno 
0x0f01DataDump2no 
0x0f04ZoomedPreviewStartint32u* 
0x0f05ZoomedPreviewLengthint32u* 
0x0f06ZoomedPreviewSizeint16u[2] 
0x1000ShutterSpeedValuerational64s 
0x1001ISOValuerational64s 
0x1002ApertureValuerational64s 
0x1003BrightnessValuerational64s 
0x1004FlashModeint16u2 = On +
3 = Off
0x1005FlashDeviceint16u0 = None +
1 = Internal +
4 = External +
5 = Internal + External
0x1006ExposureCompensationrational64s 
0x1007SensorTemperatureint16s 
0x1008LensTemperatureint16s 
0x1009LightConditionint16u 
0x100aFocusRangeint16u0 = Normal +
1 = Macro
0x100bFocusModeint16u0 = Auto +
1 = Manual
0x100cManualFocusDistancerational64u 
0x100dZoomStepCountint16u 
0x100eFocusStepCountint16u 
0x100fSharpnessint16u0 = Normal +
1 = Hard +
2 = Soft
0x1010FlashChargeLevelint16u 
0x1011ColorMatrixint16u[9] 
0x1012BlackLevelint16u[4] 
0x1013ColorTemperatureBG?int16u 
0x1014ColorTemperatureRG?int16u 
0x1015WBModeint16u[2] + +
1 = Auto +
'1 0' = Auto +
'1 2' = Auto (2) +
'1 4' = Auto (4) +
'2 2' = 3000 Kelvin +
'2 3' = 3700 Kelvin
  '2 4' = 4000 Kelvin +
'2 5' = 4500 Kelvin +
'2 6' = 5500 Kelvin +
'2 7' = 6500 Kelvin +
'2 8' = 7500 Kelvin +
'3 0' = One-touch
+
0x1017RedBalanceint16u[2] 
0x1018BlueBalanceint16u[2] 
0x1019ColorMatrixNumberint16u 
0x101aSerialNumberstring 
0x101bExternalFlashAE1_0?int32u 
0x101cExternalFlashAE2_0?int32u 
0x101dInternalFlashAE1_0?int32u 
0x101eInternalFlashAE2_0?int32u 
0x101fExternalFlashAE1?int32u 
0x1020ExternalFlashAE2?int32u 
0x1021InternalFlashAE1?int32u 
0x1022InternalFlashAE2?int32u 
0x1023FlashExposureComprational64s 
0x1024InternalFlashTableint16u 
0x1025ExternalFlashGValuerational64s 
0x1026ExternalFlashBounceint16u0 = No +
1 = Yes
0x1027ExternalFlashZoomint16u 
0x1028ExternalFlashModeint16u 
0x1029Contrastint16u0 = High +
1 = Normal +
2 = Low
0x102aSharpnessFactorint16u 
0x102bColorControlint16u[6] 
0x102cValidBitsint16u[2] 
0x102dCoringFilterint16u 
0x102eOlympusImageWidthint32u 
0x102fOlympusImageHeightint32u 
0x1030SceneDetectint16u 
0x1031SceneArea?int32u[8] 
0x1033SceneDetectData?int32u[720] 
0x1034CompressionRatiorational64u 
0x1035PreviewImageValidint32u0 = No +
1 = Yes
0x1036PreviewImageStartint32u* 
0x1037PreviewImageLengthint32u* 
0x1038AFResultint16u 
0x1039CCDScanModeint16u0 = Interlaced +
1 = Progressive
0x103aNoiseReductionint16u0 = Off +
1 = On
0x103bFocusStepInfinityint16u 
0x103cFocusStepNearint16u 
0x103dLightValueCenterrational64s 
0x103eLightValuePeripheryrational64s 
0x103fFieldCount?int16u 
0x2010Equipment +
EquipmentIFD
-
-
--> Olympus Equipment Tags +
--> Olympus Equipment Tags
0x2020CameraSettings +
CameraSettingsIFD
-
-
--> Olympus CameraSettings Tags +
--> Olympus CameraSettings Tags
0x2030RawDevelopment +
RawDevelopmentIFD
-
-
--> Olympus RawDevelopment Tags +
--> Olympus RawDevelopment Tags
0x2031RawDev2 +
RawDev2IFD
-
-
--> Olympus RawDevelopment2 Tags +
--> Olympus RawDevelopment2 Tags
0x2040ImageProcessing +
ImageProcessingIFD
-
-
--> Olympus ImageProcessing Tags +
--> Olympus ImageProcessing Tags
0x2050FocusInfo +
FocusInfoIFD +
CameraParameters
-
-
undef
--> Olympus FocusInfo Tags +
--> Olympus FocusInfo Tags
0x2100Olympus2100 +
Olympus2100IFD
-
-
--> Olympus FE Tags +
--> Olympus FE Tags
0x2200Olympus2200 +
Olympus2200IFD
-
-
--> Olympus FE Tags +
--> Olympus FE Tags
0x2300Olympus2300 +
Olympus2300IFD
-
-
--> Olympus FE Tags +
--> Olympus FE Tags
0x2400Olympus2400 +
Olympus2400IFD
-
-
--> Olympus FE Tags +
--> Olympus FE Tags
0x2500Olympus2500 +
Olympus2500IFD
-
-
--> Olympus FE Tags +
--> Olympus FE Tags
0x2600Olympus2600 +
Olympus2600IFD
-
-
--> Olympus FE Tags +
--> Olympus FE Tags
0x2700Olympus2700 +
Olympus2700IFD
-
-
--> Olympus FE Tags +
--> Olympus FE Tags
0x2800Olympus2800 +
Olympus2800IFD
-
-
--> Olympus FE Tags +
--> Olympus FE Tags
0x2900Olympus2900 +
Olympus2900IFD
-
-
--> Olympus FE Tags +
--> Olympus FE Tags
0x3000RawInfo +
RawInfoIFD
-
-
--> Olympus RawInfo Tags +
--> Olympus RawInfo Tags
0x4000MainInfo +
MainInfoIFD
-
-
--> Olympus Tags +
--> Olympus Tags
0x5000UnknownInfo +
UnknownInfoIFD
-
-
--> Olympus UnknownInfo Tags +
--> Olympus UnknownInfo Tags
+ +

Olympus CameraType Values

+

These values are currently decoded only for Olympus models. Models with +Olympus-style maker notes from other brands such as Acer, BenQ, Hitachi, HP, +Premier, Konica-Minolta, Maginon, Ricoh, Rollei, SeaLife, Sony, Supra, +Vivitar are not listed.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueCameraTypeValueCameraTypeValueCameraType
'D4028'= X-2,C-50Z'D4398'= FE45,X40'S0017'= E-30
'D4029'= E-20,E-20N,E-20P'D4401'= XZ-1'S0018'= E-520
'D4034'= C720UZ'D4402'= uT6010,ST6010'S0019'= E-P1
'D4040'= E-1'D4406'= u7010,S7010 / u7020,S7020'S0023'= E-620
'D4041'= E-300'D4407'= FE4010,X930'S0026'= E-P2
'D4083'= C2Z,D520Z,C220Z'D4408'= X560WP'S0027'= E-PL1
'D4106'= u20D,S400D,u400D'D4409'= FE26,X21'S0029'= E-450
'D4120'= X-1'D4410'= FE4000,X920,X925'S0030'= E-600
'D4122'= u10D,S300D,u300D'D4411'= FE46,X41,X42'S0032'= E-P3
'D4125'= AZ-1'D4412'= FE5020,X935'S0033'= E-5
'D4141'= C150,D390'D4413'= uTough-3000'S0034'= E-PL2
'D4193'= C-5000Z'D4414'= StylusTough-6020'S0036'= E-M5
'D4194'= X-3,C-60Z'D4415'= StylusTough-8010'S0038'= E-PL3
'D4199'= u30D,S410D,u410D'D4417'= u5010,S5010'S0039'= E-PM1
'D4205'= X450,D535Z,C370Z'D4418'= u7040,S7040'S0040'= E-PL1s
'D4210'= C160,D395'D4419'= u9010,S9010'S0042'= E-PL5
'D4211'= C725UZ'D4423'= FE4040'S0043'= E-PM2
'D4213'= FerrariMODEL2003'D4424'= FE47,X43'S0044'= E-P5
'D4216'= u15D'D4426'= FE4030,X950'S0045'= E-PL6
'D4217'= u25D'D4428'= FE5030,X965,X960'S0046'= E-PL7
'D4220'= u-miniD,Stylus V'D4430'= u7030,S7030'S0047'= E-M1
'D4221'= u40D,S500,uD500'D4432'= SP600UZ'S0051'= E-M10
'D4231'= FerrariMODEL2004'D4434'= SP800UZ'S0052'= E-M5MarkII
'D4240'= X500,D590Z,C470Z'D4439'= FE4020,X940'S0059'= E-M10MarkII
'D4244'= uD800,S800'D4442'= FE5035'S0061'= PEN-F
'D4256'= u720SW,S720SW'D4448'= FE4050,X970'S0065'= E-PL8
'D4261'= X600,D630,FE5500'D4450'= FE5050,X985'S0067'= E-M1MarkII
'D4262'= uD600,S600'D4454'= u-7050'S0068'= E-M10MarkIII
'D4301'= u810/S810'D4464'= T10,X27'S0076'= E-PL9
'D4302'= u710,S710'D4470'= FE5040,X980'S0080'= E-M1X
'D4303'= u700,S700'D4472'= TG-310'S0085'= E-PL10
'D4304'= FE100,X710'D4474'= TG-610'S0089'= E-M5MarkIII
'D4305'= FE110,X705'D4476'= TG-810'S0092'= E-M1MarkIII
'D4310'= FE-130,X-720'D4478'= VG145,VG140,D715'S0093'= E-P7
'D4311'= FE-140,X-725'D4479'= VG130,D710'S0095'= OM-1
'D4312'= FE150,X730'D4480'= VG120,D705'SR45'= D220
'D4313'= FE160,X735'D4482'= VR310,D720'SR55'= D320L
'D4314'= u740,S740'D4484'= VR320,D725'SR83'= D340L
'D4315'= u750,S750'D4486'= VR330,D730'SR85'= C830L,D340R
'D4316'= u730/S730'D4488'= VG110,D700'SR852'= C860L,D360L
'D4317'= FE115,X715'D4490'= SP-610UZ'SR872'= C900Z,D400Z
'D4321'= SP550UZ'D4492'= SZ-10'SR874'= C960Z,D460Z
'D4322'= SP510UZ'D4494'= SZ-20'SR951'= C2000Z
'D4324'= FE170,X760'D4496'= SZ-30MR'SR952'= C21
'D4326'= FE200'D4498'= SP-810UZ'SR953'= C21T.commu
'D4327'= FE190/X750'D4500'= SZ-11'SR954'= C2020Z
'D4328'= u760,S760'D4504'= TG-615'SR955'= C990Z,D490Z
'D4330'= FE180/X745'D4508'= TG-620'SR956'= C211Z
'D4331'= u1000/S1000'D4510'= TG-820'SR959'= C990ZS,D490Z
'D4332'= u770SW,S770SW'D4512'= TG-1'SR95A'= C2100UZ
'D4333'= FE240/X795'D4516'= SH-21'SR971'= C100,D370
'D4334'= FE210,X775'D4519'= SZ-14'SR973'= C2,D230
'D4336'= FE230/X790'D4520'= SZ-31MR'SX151'= E100RS
'D4337'= FE220,X785'D4521'= SH-25MR'SX351'= C3000Z / C3030Z
'D4338'= u725SW,S725SW'D4523'= SP-720UZ'SX354'= C3040Z
'D4339'= FE250/X800'D4529'= VG170'SX355'= C2040Z
'D4341'= u780,S780'D4531'= XZ-2'SX357'= C700UZ
'D4343'= u790SW,S790SW'D4535'= SP-620UZ'SX358'= C200Z,D510Z
'D4344'= u1020,S1020'D4536'= TG-320'SX374'= C3100Z,C3020Z
'D4346'= FE15,X10'D4537'= VR340,D750'SX552'= C4040Z
'D4348'= FE280,X820,C520'D4538'= VG160,X990,D745'SX553'= C40Z,D40Z
'D4349'= FE300,X830'D4541'= SZ-12'SX556'= C730UZ
'D4350'= u820,S820'D4545'= VH410'SX558'= C5050Z
'D4351'= u1200,S1200'D4546'= XZ-10'SX571'= C120,D380
'D4352'= FE270,X815,C510'D4547'= TG-2'SX574'= C300Z,D550Z
'D4353'= u795SW,S795SW'D4548'= TG-830'SX575'= C4100Z,C4000Z
'D4354'= u1030SW,S1030SW'D4549'= TG-630'SX751'= X200,D560Z,C350Z
'D4355'= SP560UZ'D4550'= SH-50'SX752'= X300,D565Z,C450Z
'D4356'= u1010,S1010'D4553'= SZ-16,DZ-105'SX753'= C750UZ
'D4357'= u830,S830'D4562'= SP-820UZ'SX754'= C740UZ
'D4359'= u840,S840'D4566'= SZ-15'SX755'= C755UZ
'D4360'= FE350WIDE,X865'D4572'= STYLUS1'SX756'= C5060WZ
'D4361'= u850SW,S850SW'D4574'= TG-3'SX757'= C8080WZ
'D4362'= FE340,X855,C560'D4575'= TG-850'SX758'= X350,D575Z,C360Z
'D4363'= FE320,X835,C540'D4579'= SP-100EE'SX759'= X400,D580Z,C460Z
'D4364'= SP570UZ'D4580'= SH-60'SX75A'= AZ-2ZOOM
'D4366'= FE330,X845,C550'D4581'= SH-1'SX75B'= D595Z,C500Z
'D4368'= FE310,X840,C530'D4582'= TG-835'SX75C'= X550,D545Z,C480Z
'D4370'= u1050SW,S1050SW'D4585'= SH-2 / SH-3'SX75D'= IR-300
'D4371'= u1060,S1060'D4586'= TG-4'SX75F'= C55Z,C5500Z
'D4372'= FE370,X880,C575'D4587'= TG-860'SX75G'= C170,D425
'D4374'= SP565UZ'D4591'= TG-870'SX75J'= C180,D435
'D4377'= u1040,S1040'D4593'= TG-5'SX771'= C760UZ
'D4378'= FE360,X875,C570'D4603'= TG-6'SX772'= C770UZ
'D4379'= FE20,X15,C25'D4809'= C2500L'SX773'= C745UZ
'D4380'= uT6000,ST6000'D4842'= E-10'SX774'= X250,D560Z,C350Z
'D4381'= uT8000,ST8000'D4856'= C-1'SX775'= X100,D540Z,C310Z
'D4382'= u9000,S9000'D4857'= C-1Z,D-150Z'SX776'= C460ZdelSol
'D4384'= SP590UZ'DCHC'= D500L'SX777'= C765UZ
'D4385'= FE3010,X895'DCHT'= D600L / D620L'SX77A'= D555Z,C315Z
'D4386'= FE3000,X890'K0055'= AIR-A01'SX851'= C7070WZ
'D4387'= FE35,X30'S0003'= E-330'SX852'= C70Z,C7000Z
'D4388'= u550WP,S550WP'S0004'= E-500'SX853'= SP500UZ
'D4390'= FE5000,X905'S0009'= E-400'SX854'= SP310
'D4391'= u5000'S0010'= E-510'SX855'= SP350
'D4392'= u7000,S7000'S0011'= E-3'SX873'= SP320
'D4396'= FE5010,X915'S0013'= E-410'SX875'= FE180/X745
'D4397'= FE25,X20'S0016'= E-420'SX876'= FE190/X750
+ +

Olympus TextInfo Tags

+

This information is in text format (similar to APP12 information, but with +spaces instead of linefeeds). Below are tags which have been observed, but +any information found here will be extracted, even if the tag is not listed.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Resolution'Resolutionno 
'Type'CameraTypeno--> Olympus CameraType Values
+ +

Olympus Equipment Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000EquipmentVersionundef[4] 
0x0100CameraType2string[6]--> Olympus CameraType Values
0x0101SerialNumberstring[32] 
0x0102InternalSerialNumberstring[32](16 digits: 0-3=model, 4=year, 5-6=month, 8-12=unit number)
0x0103FocalPlaneDiagonalrational64u 
0x0104BodyFirmwareVersionint32u 
0x0201LensTypeint8u[6]--> Olympus LensType Values +
(6 numbers: 1. Make, 2. Unknown, 3. Model, 4. Sub-model, 5-6. Unknown. Only +the Make, Model and Sub-model are used to identify the lens type)
0x0202LensSerialNumberstring[32] 
0x0203LensModelstring 
0x0204LensFirmwareVersionint32u 
0x0205MaxApertureAtMinFocalint16u 
0x0206MaxApertureAtMaxFocalint16u 
0x0207MinFocalLengthint16u 
0x0208MaxFocalLengthint16u 
0x020aMaxApertureint16u 
0x020bLensPropertiesint16u 
0x0301Extenderint8u[6](6 numbers: 1. Make, 2. Unknown, 3. Model, 4. Sub-model, 5-6. Unknown. Only +the Make and Model are used to identify the extender) +
'0 00' = None +
'0 04' = Olympus Zuiko Digital EC-14 1.4x Teleconverter +
'0 08' = Olympus EX-25 Extension Tube +
'0 10' = Olympus Zuiko Digital EC-20 2.0x Teleconverter
0x0302ExtenderSerialNumberstring[32] 
0x0303ExtenderModelstring 
0x0304ExtenderFirmwareVersionint32u 
0x0403ConversionLensstring 
0x1000FlashTypeint16u0 = None +
2 = Simple E-System +
3 = E-System +
4 = E-System (body powered)
0x1001FlashModelint16u + +
0 = None +
1 = FL-20 +
2 = FL-50 +
3 = RF-11 +
4 = TF-22 +
5 = FL-36
  6 = FL-50R +
7 = FL-36R +
9 = FL-14 +
11 = FL-600R +
13 = FL-LM3 +
15 = FL-900R
+
0x1002FlashFirmwareVersionint32u 
0x1003FlashSerialNumberstring[32] 
+ +

Olympus LensType Values

+

The numerical values below are given in hexadecimal. (Prior to ExifTool +9.15 these were in decimal.)

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueLensType
'0 00 00'= None
'0 01 00'= Olympus Zuiko Digital ED 50mm F2.0 Macro
'0 01 01'= Olympus Zuiko Digital 40-150mm F3.5-4.5
'0 01 10'= Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6
'0 02 00'= Olympus Zuiko Digital ED 150mm F2.0
'0 02 10'= Olympus M.Zuiko Digital 17mm F2.8 Pancake
'0 03 00'= Olympus Zuiko Digital ED 300mm F2.8
'0 03 10'= Olympus M.Zuiko Digital ED 14-150mm F4.0-5.6 [II]
'0 04 10'= Olympus M.Zuiko Digital ED 9-18mm F4.0-5.6
'0 05 00'= Olympus Zuiko Digital 14-54mm F2.8-3.5
'0 05 01'= Olympus Zuiko Digital Pro ED 90-250mm F2.8
'0 05 10'= Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6 L
'0 06 00'= Olympus Zuiko Digital ED 50-200mm F2.8-3.5
'0 06 01'= Olympus Zuiko Digital ED 8mm F3.5 Fisheye
'0 06 10'= Olympus M.Zuiko Digital ED 40-150mm F4.0-5.6
'0 07 00'= Olympus Zuiko Digital 11-22mm F2.8-3.5
'0 07 01'= Olympus Zuiko Digital 18-180mm F3.5-6.3
'0 07 10'= Olympus M.Zuiko Digital ED 12mm F2.0
'0 08 01'= Olympus Zuiko Digital 70-300mm F4.0-5.6
'0 08 10'= Olympus M.Zuiko Digital ED 75-300mm F4.8-6.7
'0 09 10'= Olympus M.Zuiko Digital 14-42mm F3.5-5.6 II
'0 10 01'= Kenko Tokina Reflex 300mm F6.3 MF Macro
'0 10 10'= Olympus M.Zuiko Digital ED 12-50mm F3.5-6.3 EZ
'0 11 10'= Olympus M.Zuiko Digital 45mm F1.8
'0 12 10'= Olympus M.Zuiko Digital ED 60mm F2.8 Macro
'0 13 10'= Olympus M.Zuiko Digital 14-42mm F3.5-5.6 II R
'0 14 10'= Olympus M.Zuiko Digital ED 40-150mm F4.0-5.6 R
'0 15 00'= Olympus Zuiko Digital ED 7-14mm F4.0
'0 15 10'= Olympus M.Zuiko Digital ED 75mm F1.8
'0 16 10'= Olympus M.Zuiko Digital 17mm F1.8
'0 17 00'= Olympus Zuiko Digital Pro ED 35-100mm F2.0
'0 18 00'= Olympus Zuiko Digital 14-45mm F3.5-5.6
'0 18 10'= Olympus M.Zuiko Digital ED 75-300mm F4.8-6.7 II
'0 19 10'= Olympus M.Zuiko Digital ED 12-40mm F2.8 Pro
'0 20 00'= Olympus Zuiko Digital 35mm F3.5 Macro
'0 20 10'= Olympus M.Zuiko Digital ED 40-150mm F2.8 Pro
'0 21 10'= Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6 EZ
'0 22 00'= Olympus Zuiko Digital 17.5-45mm F3.5-5.6
'0 22 10'= Olympus M.Zuiko Digital 25mm F1.8
'0 23 00'= Olympus Zuiko Digital ED 14-42mm F3.5-5.6
'0 23 10'= Olympus M.Zuiko Digital ED 7-14mm F2.8 Pro
'0 24 00'= Olympus Zuiko Digital ED 40-150mm F4.0-5.6
'0 24 10'= Olympus M.Zuiko Digital ED 300mm F4.0 IS Pro
'0 25 10'= Olympus M.Zuiko Digital ED 8mm F1.8 Fisheye Pro
'0 26 10'= Olympus M.Zuiko Digital ED 12-100mm F4.0 IS Pro
'0 27 10'= Olympus M.Zuiko Digital ED 30mm F3.5 Macro
'0 28 10'= Olympus M.Zuiko Digital ED 25mm F1.2 Pro
'0 29 10'= Olympus M.Zuiko Digital ED 17mm F1.2 Pro
'0 30 00'= Olympus Zuiko Digital ED 50-200mm F2.8-3.5 SWD
'0 30 10'= Olympus M.Zuiko Digital ED 45mm F1.2 Pro
'0 31 00'= Olympus Zuiko Digital ED 12-60mm F2.8-4.0 SWD
'0 32 00'= Olympus Zuiko Digital ED 14-35mm F2.0 SWD
'0 32 10'= Olympus M.Zuiko Digital ED 12-200mm F3.5-6.3
'0 33 00'= Olympus Zuiko Digital 25mm F2.8
'0 33 10'= Olympus M.Zuiko Digital 150-400mm F4.5 TC1.25x IS Pro
'0 34 00'= Olympus Zuiko Digital ED 9-18mm F4.0-5.6
'0 34 10'= Olympus M.Zuiko Digital ED 12-45mm F4.0 Pro
'0 35 00'= Olympus Zuiko Digital 14-54mm F2.8-3.5 II
'0 35 10'= Olympus M.Zuiko 100-400mm F5.0-6.3
'0 36 10'= Olympus M.Zuiko Digital ED 8-25mm F4 Pro
'1 01 00'= Sigma 18-50mm F3.5-5.6 DC
'1 01 10'= Sigma 30mm F2.8 EX DN
'1 02 00'= Sigma 55-200mm F4.0-5.6 DC
'1 02 10'= Sigma 19mm F2.8 EX DN
'1 03 00'= Sigma 18-125mm F3.5-5.6 DC
'1 03 10'= Sigma 30mm F2.8 DN | A
'1 04 00'= Sigma 18-125mm F3.5-5.6 DC
'1 04 10'= Sigma 19mm F2.8 DN | A
'1 05 00'= Sigma 30mm F1.4 EX DC HSM
'1 05 10'= Sigma 60mm F2.8 DN | A
'1 06 00'= Sigma APO 50-500mm F4.0-6.3 EX DG HSM
'1 06 10'= Sigma 30mm F1.4 DC DN | C
'1 07 00'= Sigma Macro 105mm F2.8 EX DG
'1 07 10'= Sigma 16mm F1.4 DC DN | C (017)
'1 08 00'= Sigma APO Macro 150mm F2.8 EX DG HSM
'1 09 00'= Sigma 18-50mm F2.8 EX DC Macro
'1 10 00'= Sigma 24mm F1.8 EX DG Aspherical Macro
'1 11 00'= Sigma APO 135-400mm F4.5-5.6 DG
'1 12 00'= Sigma APO 300-800mm F5.6 EX DG HSM
'1 13 00'= Sigma 30mm F1.4 EX DC HSM
'1 14 00'= Sigma APO 50-500mm F4.0-6.3 EX DG HSM
'1 15 00'= Sigma 10-20mm F4.0-5.6 EX DC HSM
'1 16 00'= Sigma APO 70-200mm F2.8 II EX DG Macro HSM
'1 17 00'= Sigma 50mm F1.4 EX DG HSM
'2 01 00'= Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.
'2 01 10'= Lumix G Vario 14-45mm F3.5-5.6 Asph. Mega OIS
'2 02 00'= Leica D Summilux 25mm F1.4 Asph.
'2 02 10'= Lumix G Vario 45-200mm F4.0-5.6 Mega OIS
'2 03 00'= Leica D Vario Elmar 14-50mm F3.8-5.6 Asph. Mega OIS
'2 03 01'= Leica D Vario Elmar 14-50mm F3.8-5.6 Asph.
'2 03 10'= Lumix G Vario HD 14-140mm F4.0-5.8 Asph. Mega OIS
'2 04 00'= Leica D Vario Elmar 14-150mm F3.5-5.6
'2 04 10'= Lumix G Vario 7-14mm F4.0 Asph.
'2 05 10'= Lumix G 20mm F1.7 Asph.
'2 06 10'= Leica DG Macro-Elmarit 45mm F2.8 Asph. Mega OIS
'2 07 10'= Lumix G Vario 14-42mm F3.5-5.6 Asph. Mega OIS
'2 08 10'= Lumix G Fisheye 8mm F3.5
'2 09 10'= Lumix G Vario 100-300mm F4.0-5.6 Mega OIS
'2 10 10'= Lumix G 14mm F2.5 Asph.
'2 11 10'= Lumix G 12.5mm F12 3D
'2 12 10'= Leica DG Summilux 25mm F1.4 Asph.
'2 13 10'= Lumix G X Vario PZ 45-175mm F4.0-5.6 Asph. Power OIS
'2 14 10'= Lumix G X Vario PZ 14-42mm F3.5-5.6 Asph. Power OIS
'2 15 10'= Lumix G X Vario 12-35mm F2.8 Asph. Power OIS
'2 16 10'= Lumix G Vario 45-150mm F4.0-5.6 Asph. Mega OIS
'2 17 10'= Lumix G X Vario 35-100mm F2.8 Power OIS
'2 18 10'= Lumix G Vario 14-42mm F3.5-5.6 II Asph. Mega OIS
'2 19 10'= Lumix G Vario 14-140mm F3.5-5.6 Asph. Power OIS
'2 20 10'= Lumix G Vario 12-32mm F3.5-5.6 Asph. Mega OIS
'2 21 10'= Leica DG Nocticron 42.5mm F1.2 Asph. Power OIS
'2 22 10'= Leica DG Summilux 15mm F1.7 Asph.
'2 23 10'= Lumix G Vario 35-100mm F4.0-5.6 Asph. Mega OIS
'2 24 10'= Lumix G Macro 30mm F2.8 Asph. Mega OIS
'2 25 10'= Lumix G 42.5mm F1.7 Asph. Power OIS
'2 26 10'= Lumix G 25mm F1.7 Asph.
'2 27 10'= Leica DG Vario-Elmar 100-400mm F4.0-6.3 Asph. Power OIS
'2 28 10'= Lumix G Vario 12-60mm F3.5-5.6 Asph. Power OIS
'2 29 10'= Leica DG Summilux 12mm F1.4 Asph.
'2 30 10'= Leica DG Vario-Elmarit 12-60mm F2.8-4 Asph. Power OIS
'2 31 10'= Lumix G Vario 45-200mm F4.0-5.6 II
'2 32 10'= Lumix G Vario 100-300mm F4.0-5.6 II
'2 33 10'= Lumix G X Vario 12-35mm F2.8 II Asph. Power OIS
'2 34 10'= Lumix G Vario 35-100mm F2.8 II
'2 35 10'= Leica DG Vario-Elmarit 8-18mm F2.8-4 Asph.
'2 36 10'= Leica DG Elmarit 200mm F2.8 Power OIS
'2 37 10'= Leica DG Vario-Elmarit 50-200mm F2.8-4 Asph. Power OIS
'2 38 10'= Leica DG Vario-Summilux 10-25mm F1.7 Asph.
'2 40 10'= Leica DG Vario-Summilux 25-50mm F1.7 Asph.
'3 01 00'= Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.
'3 02 00'= Leica D Summilux 25mm F1.4 Asph.
'5 01 10'= Tamron 14-150mm F3.5-5.8 Di III
'24 01 10'= Venus Optics Laowa 50mm F2.8 2x Macro
+ +

Olympus CameraSettings Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000CameraSettingsVersionundef[4] 
0x0100PreviewImageValidint32u0 = No +
1 = Yes
0x0101PreviewImageStartint32u* 
0x0102PreviewImageLengthint32u* 
0x0200ExposureModeint16u1 = Manual +
2 = Program +
3 = Aperture-priority AE +
4 = Shutter speed priority AE +
5 = Program-shift
0x0201AELockint16u0 = Off +
1 = On
0x0202MeteringModeint16u +
2 = Center-weighted average +
3 = Spot +
5 = ESP +
261 = Pattern+AF +
515 = Spot+Highlight control +
1027 = Spot+Shadow control
+
0x0203ExposureShiftrational64s 
0x0204NDFilteryes0 = Off +
1 = On
0x0300MacroModeint16u0 = Off +
1 = On +
2 = Super Macro
0x0301FocusModeint16u[n](1 or 2 values) +
[Value 0]
+
0 = Single AF +
1 = Sequential shooting AF +
2 = Continuous AF +
3 = Multi AF +
4 = Face detect +
10 = MF
+[Value 1] +
0x0 = (none) +
Bit 0 = S-AF +
Bit 2 = C-AF +
Bit 4 = MF +
Bit 5 = Face detect +
Bit 6 = Imager AF +
Bit 7 = Live View Magnification Frame +
Bit 8 = AF sensor +
Bit 9 = Starry Sky AF
+
0x0302FocusProcessint16u[n](1 or 2 values) +
[Value 0] +
0 = AF Not Used +
1 = AF Used
0x0303AFSearchint16u0 = Not Ready +
1 = Ready
0x0304AFAreasint32u[64]~(coordinates range from 0 to 255)
0x0305AFPointSelectedrational64s[5](coordinates expressed as a percent)
0x0306AFFineTuneint8u0 = Off +
1 = On
0x0307AFFineTuneAdjint16s[3] 
0x0308FocusBracketStepSizeint8u 
0x0309AISubjectTrackingModeint16u[Value 0] + +
0 = Off +
1 = Motorsports +
2 = Airplanes
  3 = Trains +
4 = Birds +
5 = Dogs & Cats
+[Value 1] +
0 = Object Not Found +
1 = Object Found
0x0400FlashModeint16u + +
0x0 = Off +
Bit 0 = On +
Bit 1 = Fill-in +
Bit 2 = Red-eye
  Bit 3 = Slow-sync +
Bit 4 = Forced On +
Bit 5 = 2nd Curtain
+
0x0401FlashExposureComprational64s 
0x0403FlashRemoteControlint16u + +
0x0 = Off +
0x1 = Channel 1, Low +
0x2 = Channel 2, Low +
0x3 = Channel 3, Low +
0x4 = Channel 4, Low +
0x9 = Channel 1, Mid +
0xa = Channel 2, Mid
  0xb = Channel 3, Mid +
0xc = Channel 4, Mid +
0x11 = Channel 1, High +
0x12 = Channel 2, High +
0x13 = Channel 3, High +
0x14 = Channel 4, High
+
0x0404FlashControlModeint16u[n](3 or 4 values) +
[Value 0] +
0 = Off +
3 = TTL +
4 = Auto +
5 = Manual
0x0405FlashIntensityrational64s[n](3 or 4 values) +
'undef undef undef' = n/a +
'undef undef undef undef' = n/a (x4)
0x0406ManualFlashStrengthrational64s[n](3 or 4 values) +
'undef undef undef' = n/a +
'undef undef undef undef' = n/a (x4)
0x0500WhiteBalance2int16u +
0 = Auto +
1 = Auto (Keep Warm Color Off) +
16 = 7500K (Fine Weather with Shade) +
17 = 6000K (Cloudy) +
18 = 5300K (Fine Weather) +
20 = 3000K (Tungsten light) +
21 = 3600K (Tungsten light-like) +
22 = Auto Setup +
23 = 5500K (Flash) +
33 = 6600K (Daylight fluorescent) +
34 = 4500K (Neutral white fluorescent) +
35 = 4000K (Cool white fluorescent) +
36 = White Fluorescent +
48 = 3600K (Tungsten light-like) +
67 = Underwater +
256 = One Touch WB 1 +
257 = One Touch WB 2 +
258 = One Touch WB 3 +
259 = One Touch WB 4 +
512 = Custom WB 1 +
513 = Custom WB 2 +
514 = Custom WB 3 +
515 = Custom WB 4
+
0x0501WhiteBalanceTemperatureint16u 
0x0502WhiteBalanceBracketint16s 
0x0503CustomSaturationint16s[3]~(3 numbers: 1. CS Value, 2. Min, 3. Max)
0x0504ModifiedSaturationint16u0 = Off +
1 = CM1 (Red Enhance) +
2 = CM2 (Green Enhance) +
3 = CM3 (Blue Enhance) +
4 = CM4 (Skin Tones)
0x0505ContrastSettingint16s[3](value, min, max)
0x0506SharpnessSettingint16s[3](value, min, max)
0x0507ColorSpaceint16u0 = sRGB +
1 = Adobe RGB +
2 = Pro Photo RGB
0x0509SceneModeint16u + +
0 = Standard +
6 = Auto +
7 = Sport +
8 = Portrait +
9 = Landscape+Portrait +
10 = Landscape +
11 = Night Scene +
12 = Self Portrait +
13 = Panorama +
14 = 2 in 1 +
15 = Movie +
16 = Landscape+Portrait +
17 = Night+Portrait +
18 = Indoor +
19 = Fireworks +
20 = Sunset +
21 = Beauty Skin +
22 = Macro +
23 = Super Macro +
24 = Food +
25 = Documents +
26 = Museum +
27 = Shoot & Select +
28 = Beach & Snow +
29 = Self Protrait+Timer +
30 = Candle +
31 = Available Light +
32 = Behind Glass +
33 = My Mode +
34 = Pet +
35 = Underwater Wide1
  36 = Underwater Macro +
37 = Shoot & Select1 +
38 = Shoot & Select2 +
39 = High Key +
40 = Digital Image Stabilization +
41 = Auction +
42 = Beach +
43 = Snow +
44 = Underwater Wide2 +
45 = Low Key +
46 = Children +
47 = Vivid +
48 = Nature Macro +
49 = Underwater Snapshot +
50 = Shooting Guide +
54 = Face Portrait +
57 = Bulb +
59 = Smile Shot +
60 = Quick Shutter +
63 = Slow Shutter +
64 = Bird Watching +
65 = Multiple Exposure +
66 = e-Portrait +
67 = Soft Background Shot +
142 = Hand-held Starlight +
154 = HDR +
197 = Panning +
203 = Light Trails +
204 = Backlight HDR +
205 = Silent +
206 = Multi Focus Shot
+
0x050aNoiseReductionint16u0x0 = (none) +
Bit 0 = Noise Reduction +
Bit 1 = Noise Filter +
Bit 2 = Noise Filter (ISO Boost) +
Bit 3 = Auto
0x050bDistortionCorrectionint16u0 = Off +
1 = On
0x050cShadingCompensationint16u0 = Off +
1 = On
0x050dCompressionFactorrational64u 
0x050fGradationint16s[n](3 or 4 values) +
[Values 0-2] +
'-1 -1 1' = Low Key +
'0 -1 1' = Normal +
'0 0 0' = n/a +
'1 -1 1' = High Key +
[Value 3] +
0 = User-Selected +
1 = Auto-Override
0x0520PictureModeint16u[n](1 or 2 values) +
[Value 0]
+
1 = Vivid +
2 = Natural +
3 = Muted +
4 = Portrait +
5 = i-Enhance +
6 = e-Portrait +
7 = Color Creator +
9 = Color Profile 1 +
10 = Color Profile 2 +
11 = Color Profile 3 +
12 = Monochrome Profile 1 +
13 = Monochrome Profile 2 +
14 = Monochrome Profile 3 +
256 = Monotone +
512 = Sepia
+
0x0521PictureModeSaturationint16s[3](value, min, max)
0x0522PictureModeHue?int16s 
0x0523PictureModeContrastint16s[3](value, min, max)
0x0524PictureModeSharpnessint16s[3](value, min, max)
0x0525PictureModeBWFilterint16s + +
0 = n/a +
1 = Neutral +
2 = Yellow
  3 = Orange +
4 = Red +
5 = Green
+
0x0526PictureModeToneint16s + +
0 = n/a +
1 = Neutral +
2 = Sepia
  3 = Blue +
4 = Purple +
5 = Green
+
0x0527NoiseFilterint16s[3]'-1 -2 1' = Low +
'-2 -2 1' = Off +
'0 -2 1' = Standard +
'0 0 0' = n/a +
'1 -2 1' = High
0x0529ArtFilterint16u[4][Value 0] + +
0 = Off +
1 = Soft Focus +
2 = Pop Art +
3 = Pale & Light Color +
4 = Light Tone +
5 = Pin Hole +
6 = Grainy Film +
9 = Diorama +
10 = Cross Process +
12 = Fish Eye +
13 = Drawing +
14 = Gentle Sepia +
15 = Pale & Light Color II +
16 = Pop Art II +
17 = Pin Hole II +
18 = Pin Hole III +
19 = Grainy Film II +
20 = Dramatic Tone +
21 = Punk
  22 = Soft Focus 2 +
23 = Sparkle +
24 = Watercolor +
25 = Key Line +
26 = Key Line II +
27 = Miniature +
28 = Reflection +
29 = Fragmented +
31 = Cross Process II +
32 = Dramatic Tone II +
33 = Watercolor I +
34 = Watercolor II +
35 = Diorama II +
36 = Vintage +
37 = Vintage II +
38 = Vintage III +
39 = Partial Color +
40 = Partial Color II +
41 = Partial Color III
+
0x052cMagicFilterint16u[4][Value 0] + +
0 = Off +
1 = Soft Focus +
2 = Pop Art +
3 = Pale & Light Color +
4 = Light Tone +
5 = Pin Hole +
6 = Grainy Film +
9 = Diorama +
10 = Cross Process +
12 = Fish Eye +
13 = Drawing +
14 = Gentle Sepia +
15 = Pale & Light Color II +
16 = Pop Art II +
17 = Pin Hole II +
18 = Pin Hole III +
19 = Grainy Film II +
20 = Dramatic Tone +
21 = Punk
  22 = Soft Focus 2 +
23 = Sparkle +
24 = Watercolor +
25 = Key Line +
26 = Key Line II +
27 = Miniature +
28 = Reflection +
29 = Fragmented +
31 = Cross Process II +
32 = Dramatic Tone II +
33 = Watercolor I +
34 = Watercolor II +
35 = Diorama II +
36 = Vintage +
37 = Vintage II +
38 = Vintage III +
39 = Partial Color +
40 = Partial Color II +
41 = Partial Color III
+
0x052dPictureModeEffectint16s[3]'-1 -1 1' = Low +
'0 -1 1' = Standard +
'0 0 0' = n/a +
'1 -1 1' = High
0x052eToneLevelyes[Values 0, 4, 8, 12, 16, 20 and 24] +
-31999 = Highlights +
-31998 = Shadows +
-31997 = Midtones +
0 = 0
0x052fArtFilterEffectint16u[20][Value 0] + +
0x0 = Off +
0x1 = Soft Focus +
0x2 = Pop Art +
0x3 = Pale & Light Color +
0x4 = Light Tone +
0x5 = Pin Hole +
0x6 = Grainy Film +
0x9 = Diorama +
0xa = Cross Process +
0xc = Fish Eye +
0xd = Drawing +
0xe = Gentle Sepia +
0xf = Pale & Light Color II +
0x10 = Pop Art II +
0x11 = Pin Hole II +
0x12 = Pin Hole III +
0x13 = Grainy Film II +
0x14 = Dramatic Tone +
0x15 = Punk
  0x16 = Soft Focus 2 +
0x17 = Sparkle +
0x18 = Watercolor +
0x19 = Key Line +
0x1a = Key Line II +
0x1b = Miniature +
0x1c = Reflection +
0x1d = Fragmented +
0x1f = Cross Process II +
0x20 = Dramatic Tone II +
0x21 = Watercolor I +
0x22 = Watercolor II +
0x23 = Diorama II +
0x24 = Vintage +
0x25 = Vintage II +
0x26 = Vintage III +
0x27 = Partial Color +
0x28 = Partial Color II +
0x29 = Partial Color III
+[Value 4] + +
0x0 = No Effect +
0x8010 = Star Light +
0x8020 = Pin Hole +
0x8030 = Frame +
0x8040 = Soft Focus
  0x8050 = White Edge +
0x8060 = B&W +
0x8080 = Blur Top and Bottom +
0x8081 = Blur Left and Right
+[Value 6] + +
0x0 = No Color Filter +
0x1 = Yellow Color Filter +
0x2 = Orange Color Filter
  0x3 = Red Color Filter +
0x4 = Green Color Filter
+
0x0532ColorCreatorEffectint16s[6] 
0x0537MonochromeProfileSettingsint16s[6][Value 0] + +
0 = No Filter +
1 = Yellow Filter +
2 = Orange Filter +
3 = Red Filter +
4 = Magenta Filter
  5 = Blue Filter +
6 = Cyan Filter +
7 = Green Filter +
8 = Yellow-green Filter
+
0x0538FilmGrainEffectint16s0 = Off +
1 = Low +
2 = Medium +
3 = High
0x0539ColorProfileSettingsint16s[14] 
0x053aMonochromeVignettingint16s(-5 to +5: positive is white vignetting, negative is black vignetting)
0x053bMonochromeColorint16s + +
0 = (none) +
1 = Normal +
2 = Sepia
  3 = Blue +
4 = Purple +
5 = Green
+
0x0600DriveModeint16u[n]~(2, 3 or 5 numbers: 1. Mode, 2. Shot number, 3. Mode bits, 5. Shutter mode)
0x0601PanoramaModeint16u~(2 numbers: 1. Mode, 2. Shot number)
0x0603ImageQuality2int16u1 = SQ +
2 = HQ +
3 = SHQ +
4 = RAW +
5 = SQ (5)
0x0604ImageStabilizationint32u0 = Off +
1 = On, Mode 1 +
2 = On, Mode 2 +
3 = On, Mode 3 +
4 = On, Mode 4
0x0804StackedImageint32u[2] +
'0 0' = No +
'3 2' = ND2 (1EV) +
'3 4' = ND4 (2EV) +
'3 8' = ND8 (3EV) +
'3 16' = ND16 (4EV) +
'3 32' = ND32 (5EV) +
'3 64' = ND64 (6EV) +
'5 4' = HDR1 +
'6 4' = HDR2 +
'8 8' = Tripod high resolution +
'11 12' = Hand-held high resolution (11 12) +
'11 16' = Hand-held high resolution (11 16) +
'1 *' = Live Composite (* images) +
'4 *' = Live Time/Bulb (* images) +
'9 *' = Focus-stacked (* images)
+
0x0900ManometerPressureint16u 
0x0901ManometerReadingint32s[2] 
0x0902ExtendedWBDetectint16u0 = Off +
1 = On
0x0903RollAngleint16s[2](converted to degrees of clockwise camera rotation)
0x0904PitchAngleint16s[2](converted to degrees of upward camera tilt)
0x0908DateTimeUTCstring 
+ +

Olympus RawDevelopment Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000RawDevVersionundef[4] 
0x0100RawDevExposureBiasValuerational64s 
0x0101RawDevWhiteBalanceValueint16u 
0x0102RawDevWBFineAdjustmentint16s 
0x0103RawDevGrayPointint16u[3] 
0x0104RawDevSaturationEmphasisint16s[3] 
0x0105RawDevMemoryColorEmphasisint16u 
0x0106RawDevContrastValueint16s[3] 
0x0107RawDevSharpnessValueint16s[3] 
0x0108RawDevColorSpaceint16u0 = sRGB +
1 = Adobe RGB +
2 = Pro Photo RGB
0x0109RawDevEngineint16u0 = High Speed +
1 = High Function +
2 = Advanced High Speed +
3 = Advanced High Function
0x010aRawDevNoiseReductionint16u0x0 = (none) +
Bit 0 = Noise Reduction +
Bit 1 = Noise Filter +
Bit 2 = Noise Filter (ISO Boost)
0x010bRawDevEditStatusint16u0 = Original +
1 = Edited (Landscape) +
6 = Edited (Portrait) +
8 = Edited (Portrait)
0x010cRawDevSettingsint16u + +
0x0 = (none) +
Bit 0 = WB Color Temp +
Bit 1 = WB Gray Point +
Bit 2 = Saturation +
Bit 3 = Contrast
  Bit 4 = Sharpness +
Bit 5 = Color Space +
Bit 6 = High Function +
Bit 7 = Noise Reduction
+
+ +

Olympus RawDevelopment2 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000RawDevVersionundef[4] 
0x0100RawDevExposureBiasValuerational64s 
0x0101RawDevWhiteBalanceint16u1 = Color Temperature +
2 = Gray Point
0x0102RawDevWhiteBalanceValueint16u 
0x0103RawDevWBFineAdjustmentint16s 
0x0104RawDevGrayPointint16u[3] 
0x0105RawDevContrastValueint16s[3] 
0x0106RawDevSharpnessValueint16s[3] 
0x0107RawDevSaturationEmphasisint16s[3] 
0x0108RawDevMemoryColorEmphasisint16u 
0x0109RawDevColorSpaceint16u0 = sRGB +
1 = Adobe RGB +
2 = Pro Photo RGB
0x010aRawDevNoiseReductionint16u0x0 = (none) +
Bit 0 = Noise Reduction +
Bit 1 = Noise Filter +
Bit 2 = Noise Filter (ISO Boost)
0x010bRawDevEngineint16u0 = High Speed +
1 = High Function
0x010cRawDevPictureModeint16u1 = Vivid +
2 = Natural +
3 = Muted +
256 = Monotone +
512 = Sepia
0x010dRawDevPMSaturationint16s[3] 
0x010eRawDevPMContrastint16s[3] 
0x010fRawDevPMSharpnessint16s[3] 
0x0110RawDevPM_BWFilterint16u1 = Neutral +
2 = Yellow +
3 = Orange +
4 = Red +
5 = Green
0x0111RawDevPMPictureToneint16u1 = Neutral +
2 = Sepia +
3 = Blue +
4 = Purple +
5 = Green
0x0112RawDevGradationint16s[3] 
0x0113RawDevSaturation3int16s[3] 
0x0119RawDevAutoGradationint16u0 = Off +
1 = On
0x0120RawDevPMNoiseFilterint16u 
0x0121RawDevArtFilterint16u[4][Value 0] + +
0 = Off +
1 = Soft Focus +
2 = Pop Art +
3 = Pale & Light Color +
4 = Light Tone +
5 = Pin Hole +
6 = Grainy Film +
9 = Diorama +
10 = Cross Process +
12 = Fish Eye +
13 = Drawing +
14 = Gentle Sepia +
15 = Pale & Light Color II +
16 = Pop Art II +
17 = Pin Hole II +
18 = Pin Hole III +
19 = Grainy Film II +
20 = Dramatic Tone +
21 = Punk
  22 = Soft Focus 2 +
23 = Sparkle +
24 = Watercolor +
25 = Key Line +
26 = Key Line II +
27 = Miniature +
28 = Reflection +
29 = Fragmented +
31 = Cross Process II +
32 = Dramatic Tone II +
33 = Watercolor I +
34 = Watercolor II +
35 = Diorama II +
36 = Vintage +
37 = Vintage II +
38 = Vintage III +
39 = Partial Color +
40 = Partial Color II +
41 = Partial Color III
+
+ +

Olympus ImageProcessing Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000ImageProcessingVersionundef[4] 
0x0100WB_RBLevelsint16u[2] 
0x0102WB_RBLevels3000Kint16u[2] 
0x0103WB_RBLevels3300Kint16u[2] 
0x0104WB_RBLevels3600Kint16u[2] 
0x0105WB_RBLevels3900Kint16u[2] 
0x0106WB_RBLevels4000Kint16u[2] 
0x0107WB_RBLevels4300Kint16u[2] 
0x0108WB_RBLevels4500Kint16u[2] 
0x0109WB_RBLevels4800Kint16u[2] 
0x010aWB_RBLevels5300Kint16u[2] 
0x010bWB_RBLevels6000Kint16u[2] 
0x010cWB_RBLevels6600Kint16u[2] 
0x010dWB_RBLevels7500Kint16u[2] 
0x010eWB_RBLevelsCWB1int16u[2] 
0x010fWB_RBLevelsCWB2int16u[2] 
0x0110WB_RBLevelsCWB3int16u[2] 
0x0111WB_RBLevelsCWB4int16u[2] 
0x0113WB_GLevel3000Kint16u 
0x0114WB_GLevel3300Kint16u 
0x0115WB_GLevel3600Kint16u 
0x0116WB_GLevel3900Kint16u 
0x0117WB_GLevel4000Kint16u 
0x0118WB_GLevel4300Kint16u 
0x0119WB_GLevel4500Kint16u 
0x011aWB_GLevel4800Kint16u 
0x011bWB_GLevel5300Kint16u 
0x011cWB_GLevel6000Kint16u 
0x011dWB_GLevel6600Kint16u 
0x011eWB_GLevel7500Kint16u 
0x011fWB_GLevelint16u 
0x0200ColorMatrixint16u[9] 
0x0300Enhancerint16u 
0x0301EnhancerValuesint16u[7] 
0x0310CoringFilterint16u 
0x0311CoringValuesint16u[7] 
0x0600BlackLevel2int16u[4] 
0x0610GainBaseint16u 
0x0611ValidBitsint16u[2] 
0x0612CropLeftint16u[2] 
0x0613CropTopint16u[2] 
0x0614CropWidthint32u 
0x0615CropHeightint32u 
0x0635UnknownBlock1?undef(large unknown data block in ORF images but not JPG images)
0x0636UnknownBlock2?undef(large unknown data block in ORF images but not JPG images)
0x0805SensorCalibrationint16s[2](2 numbers: 1. Recommended maximum, 2. Calibration midpoint)
0x1010NoiseReduction2int16u0x0 = (none) +
Bit 0 = Noise Reduction +
Bit 1 = Noise Filter +
Bit 2 = Noise Filter (ISO Boost)
0x1011DistortionCorrection2int16u0 = Off +
1 = On
0x1012ShadingCompensation2int16u0 = Off +
1 = On
0x101cMultipleExposureModeint16u[2][Value 0] +
0 = Off +
1 = Live Composite +
2 = On (2 frames) +
3 = On (3 frames)
0x1103UnknownBlock3?undef(large unknown data block in ORF images but not JPG images)
0x1104UnknownBlock4?undef(large unknown data block in ORF images but not JPG images)
0x1112AspectRatioint8u[2] + +
'1 1' = 4:3 +
'1 4' = 1:1 +
'2 1' = 3:2 (RAW) +
'2 2' = 3:2 +
'3 1' = 16:9 (RAW) +
'3 3' = 16:9 +
'4 1' = 1:1 (RAW)
  '4 4' = 6:6 +
'5 5' = 5:4 +
'6 6' = 7:6 +
'7 7' = 6:5 +
'8 8' = 7:5 +
'9 1' = 3:4 (RAW) +
'9 9' = 3:4
+
0x1113AspectFrameint16u[4] 
0x1200FacesDetectedint32u[n](2 or 3 values)
0x1201FaceDetectAreaint16s[n](for models with 2 values in FacesDetected this gives X/Y coordinates in the +FaceDetectFrame for all 4 corners of the face rectangle. For models with 3 +values in FacesDetected this gives X/Y coordinates, size and rotation angle +of the face detect square)
0x1202MaxFacesint32u[3] 
0x1203FaceDetectFrameSizeint16u[6](width/height of the full face detect frame)
0x1207FaceDetectFrameCropint16s[12](X/Y offset and width/height of the cropped face detect frame)
0x1306CameraTemperatureno(this seems to be in degrees C only for some models)
0x1900KeystoneCompensationint8u[2]'0 0' = Off +
'0 1' = On
0x1901KeystoneDirectionint8u[2]0 = Vertical +
1 = Horizontal
0x1906KeystoneValueint16s[3](3 numbers: 1. Keystone Value, 2. Min, 3. Max)
+ +

Olympus FocusInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000FocusInfoVersionundef[4] 
0x0209AutoFocus?int16u0 = Off +
1 = On
0x0210SceneDetectint16u 
0x0211SceneArea?int32u[8] 
0x0212SceneDetectData?int32u[720] 
0x0300ZoomStepCountint16u 
0x0301FocusStepCountint16u 
0x0303FocusStepInfinityint16u 
0x0304FocusStepNearint16u 
0x0305FocusDistancerational64u 
0x0308AFPointint16u(for the E-3, E-5 and E-30 the value is separated into 2 parts: low 5 bits +give AF point, upper bits give AF target selection mode) +
[Value 0]
+ +
0x0 = (none) +
0x1 = Top-left (horizontal) +
0x2 = Top-center (horizontal) +
0x3 = Top-right (horizontal) +
0x4 = Left (horizontal) +
0x5 = Mid-left (horizontal) +
0x6 = Center (horizontal) +
0x7 = Mid-right (horizontal) +
0x8 = Right (horizontal) +
0x9 = Bottom-left (horizontal) +
0xa = Bottom-center (horizontal) +
0xb = Bottom-right (horizontal)
  0xc = Top-left (vertical) +
0xd = Top-center (vertical) +
0xe = Top-right (vertical) +
0xf = Left (vertical) +
0x10 = Mid-left (vertical) +
0x11 = Center (vertical) +
0x12 = Mid-right (vertical) +
0x13 = Right (vertical) +
0x14 = Bottom-left (vertical) +
0x15 = Bottom-center (vertical) +
0x16 = Bottom-right (vertical) +
0x1f = n/a
+[Value 1] + +
0x0 = Single Target +
0x40 = All Target
  0x80 = Dynamic Single Target +
0xe0 = n/a
+(models with 7-point AF) +
[Value 0] +
0x0 = (none) +
0x1 = Center +
[Value 1] +
0x0 = Single Target +
0x40 = All Target +
(other models) +
0 = Left (or n/a) +
1 = Center (horizontal) +
2 = Right +
3 = Center (vertical) +
255 = None
0x0328AFInfo---> Olympus AFInfo Tags
0x1201ExternalFlashint16u[2]'0 0' = Off +
'1 0' = On
0x1203ExternalFlashGuideNumber?rational64s 
0x1204ExternalFlashBounceint16u0 = Bounce or Off +
1 = Direct
0x1205ExternalFlashZoomrational64u 
0x1208InternalFlashint16u[n]0 = Off +
1 = On +
'0 0' = Off +
'1 0' = On
0x1209ManualFlashint16u[2]~(2 numbers: 1. 0=Off, 1=On, 2. Flash strength)
0x120aMacroLEDint16u0 = Off +
1 = On
0x1500SensorTemperatureint16s 
0x1600ImageStabilizationundef~ 
+ +

Olympus AFInfo Tags

+
+
+ + + + +
Index1Tag NameWritableValues / Notes
[no tags known]
+ +

Olympus FE Tags

+

Some FE models write a large number of tags here, but most of this +information remains unknown.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0100BodyFirmwareVersionstring 
+ +

Olympus RawInfo Tags

+

These tags are found only in ORF images of some models (eg. C8080WZ).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000RawInfoVersionundef[4] 
0x0100WB_RBLevelsUsedint16u[2] 
0x0110WB_RBLevelsAutoint16u[2] 
0x0120WB_RBLevelsShadeint16u[2] 
0x0121WB_RBLevelsCloudyint16u[2] 
0x0122WB_RBLevelsFineWeatherint16u[2] 
0x0123WB_RBLevelsTungstenint16u[2] 
0x0124WB_RBLevelsEveningSunlightint16u[2] 
0x0130WB_RBLevelsDaylightFluorint16u[2] 
0x0131WB_RBLevelsDayWhiteFluorint16u[2] 
0x0132WB_RBLevelsCoolWhiteFluorint16u[2] 
0x0133WB_RBLevelsWhiteFluorescentint16u[2] 
0x0200ColorMatrix2int16u[9] 
0x0310CoringFilterint16u 
0x0311CoringValuesint16u[11] 
0x0600BlackLevel2int16u[4] 
0x0601YCbCrCoefficientsno(stored as int16u[6], but extracted as rational32u[3])
0x0611ValidPixelDepthint16u[2] 
0x0612CropLeftint16u 
0x0613CropTopint16u 
0x0614CropWidthint32u 
0x0615CropHeightint32u 
0x1000LightSourceint16u +
0 = Unknown +
16 = Shade +
17 = Cloudy +
18 = Fine Weather +
20 = Tungsten (Incandescent) +
22 = Evening Sunlight +
33 = Daylight Fluorescent +
34 = Day White Fluorescent +
35 = Cool White Fluorescent +
36 = White Fluorescent +
256 = One Touch White Balance +
512 = Custom 1-4
+
0x1001WhiteBalanceCompint16s[3] 
0x1010SaturationSettingint16s[3] 
0x1011HueSettingint16s[3] 
0x1012ContrastSettingint16s[3] 
0x1013SharpnessSettingint16s[3] 
0x2000CMExposureCompensationrational64s 
0x2001CMWhiteBalanceint16u 
0x2002CMWhiteBalanceCompint16s 
0x2010CMWhiteBalanceGrayPointint16u[3] 
0x2020CMSaturationint16s[3] 
0x2021CMHueint16s[3] 
0x2022CMContrastint16s[3] 
0x2023CMSharpnessint16s[3] 
+ +

Olympus UnknownInfo Tags

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

Olympus DSS Tags

+

Information extracted from DSS/DS2 files and the ID3 XOLY frame of MP3 files +written by some Olympus voice recorders.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
12Modelno 
38StartTimeno 
50EndTimeno 
62Durationno 
798Commentno 
+ +

Olympus MOV1 Tags

+

This information is found in MOV videos from Olympus models such as the +D540Z, D595Z, FE100, FE110, FE115, FE170 and FE200.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
24Modelno--> Olympus CameraType Values
38ExposureUnknown?no 
42FNumberno 
50ExposureCompensationno 
72FocalLengthno 
+ +

Olympus MOV2 Tags

+

This information is found in MOV videos from Olympus models such as the +FE120, FE140 and FE190.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
24Modelno(the actual model name, no decoding necessary)
54ExposureTimeno 
58FNumberno 
66ExposureCompensationno 
88FocalLengthno 
193ISOno 
+ +

Olympus MP4 Tags

+

This information is found in MP4 videos from Olympus models such as the +u7040 and u9010.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
24Modelno(oddly different than CameraType values in JPEG images by the same camera) + +
'SG472' = u7040,S7040 +
'SG473' = u9010,S9010 +
'SG475' = SP800UZ +
'SG551' = SZ-30MR +
'SG553' = SP-610UZ
  'SG554' = SZ-10 +
'SG555' = SZ-20 +
'SG573' = SZ-14 +
'SG575' = SP-620UZ
+
40FNumberno 
48ExposureCompensationno 
104MovableInfo---> Olympus MovableInfo Tags
114MovableInfo---> Olympus MovableInfo Tags
+ +

Olympus MovableInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4ISOno 
44EncoderVersionno 
60DecoderVersionno 
131Thumbnail---> Olympus Thumbnail Tags
+ +

Olympus Thumbnail Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1ThumbnailWidthno 
2ThumbnailHeightno 
3ThumbnailLengthno 
4ThumbnailOffsetno 
+ +

Olympus MOV3 Tags

+

QuickTime information found in the TAGS atom of MOV videos from the E-M5.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'OLYM'OlympusAtom---> Olympus OLYM2 Tags
+ +

Olympus OLYM2 Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'prms'MakerNotes---> Olympus prms Tags
'scrn'PreviewInfo---> Olympus scrn2 Tags
'thmb'ThumbInfo---> Olympus thmb2 Tags
+ +

Olympus prms Tags

+

Information extracted from the "prms" atom in MOV videos from Olympus models +such as the OM E-M5.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
18Makeno 
44Modelno--> Olympus CameraType Values
131DateTime1no 
157DateTime2no 
383LensModelno 
+ +

Olympus scrn2 Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
2OlympusPreview---> Olympus scrn Tags
+ +

Olympus scrn Tags

+

Information extracted from the "scrn" atom of Olympus MP4 videos.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0PreviewImageLengthno 
4PreviewImageno(640x480 JPEG preview image)
+ +

Olympus thmb2 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ThumbnailWidthno 
2ThumbnailHeightno 
4ThumbnailLengthno 
8ThumbnailImageno(160x120 JPEG thumbnail image)
+ +

Olympus thmb Tags

+

Information extracted from the "thmb" atom of Olympus MP4 videos.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ThumbnailLengthno 
4ThumbnailImageno(160x120 JPEG thumbnail image)
+ +

Olympus OLYM Tags

+

Tags found in the OLYM atom of MP4 videos from the TG-810.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
14Makeno 
40Modelno--> Olympus CameraType Values
90FNumberno 
127DateTimeOriginalno 
153DateTime2no 
265ThumbnailWidthno 
267ThumbnailHeightno 
+ +

Olympus AVI Tags

+

This information is found in Olympus AVI videos.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
18Makeno 
44Modelno--> Olympus CameraType Values
94FNumberno 
131DateTime1no 
157DateTime2no 
297ThumbInfo---> Olympus thmb2 Tags
+ +

Olympus WAV Tags

+

This information is found in WAV files from Olympus PCM linear recorders +like the LS-5, LS-10, LS-11.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
12Modelno 
28FileNumberno 
38DateTimeOriginalno(time at start of recording)
50DateTimeEndno(time at end of recording)
62RecordingTimeno 
512Durationno 
522Index01no 
532Index02no 
542Index03no 
552Index04no 
562Index05no 
572Index06no 
582Index07no 
592Index08no 
602Index09no 
612Index10no 
622Index11no 
632Index12no 
642Index13no 
652Index14no 
662Index15no 
672Index16no 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 6, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/OpenEXR.html b/html/TagNames/OpenEXR.html new file mode 100644 index 0000000..5f09d1c --- /dev/null +++ b/html/TagNames/OpenEXR.html @@ -0,0 +1,223 @@ + + + + +OpenEXR Tags + + + +

OpenEXR Tags

+

Information extracted from EXR images. See http://www.openexr.com/ for +the official specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'_lay'Layoutno0x0 = Scan Lines +
0x200 = Tiles
'_ver'EXRVersionno 
'adoptedNeutral'AdoptedNeutralno 
'altitude'GPSAltitudeno 
'aperture'Apertureno 
'capDate'DateTimeOriginalno 
'channels'Channelsno 
'chromaticities'Chromaticitiesno 
'comments'Commentsno 
'compression'Compressionno + +
0 = None +
1 = RLE +
2 = ZIPS +
3 = ZIP
  4 = PIZ +
5 = PXR24 +
6 = B44 +
7 = B44A
+
'dataWindow'DataWindowno 
'displayWindow'DisplayWindowno 
'envmap'EnvironmentMapno0 = Latitude/Longitude +
1 = Cube
'expTime'ExposureTimeno 
'focus'FocusDistanceno 
'framesPerSecond'FramesPerSecondno 
'isoSpeed'ISOno 
'keyCode'KeyCodeno 
'latitude'GPSLatitudeno 
'lineOrder'LineOrderno0 = Increasing Y +
1 = Decreasing Y +
2 = Random Y
'longitude'GPSLongitudeno 
'lookModTransform'LookModTransformno 
'multiView'MultiViewno 
'owner'Ownerno 
'pixelAspectRatio'PixelAspectRationo 
'preview'Previewno 
'renderingTransform'RenderingTransformno 
'screenWindowCenter'ScreenWindowCenterno 
'screenWindowWidth'ScreenWindowWidthno 
'tiles'Tilesno 
'timeCode'TimeCodeno 
'utcOffset'TimeZoneno 
'whiteLuminance'WhiteLuminanceno 
'worldToCamera'WorldToCamerano 
'worldToNDC'WorldToNDCno 
'wrapmodes'WrapModesno 
'xDensity'XResolutionno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Dec 14, 2011 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Opus.html b/html/TagNames/Opus.html new file mode 100644 index 0000000..ebb8ab5 --- /dev/null +++ b/html/TagNames/Opus.html @@ -0,0 +1,63 @@ + + + + +Opus Tags + + + +

Opus Tags

+

Information extracted from Ogg Opus files. See +https://www.opus-codec.org/docs/ for the specification.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'OpusHead'Header---> Opus Header Tags
'OpusTags'Comments---> Vorbis Comments Tags
+ +

Opus Header Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0OpusVersionno 
1AudioChannelsno 
4SampleRateno 
8OutputGainno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 14, 2016 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Other.html b/html/TagNames/Other.html new file mode 100644 index 0000000..cd98918 --- /dev/null +++ b/html/TagNames/Other.html @@ -0,0 +1,42 @@ + + + + +Other Tags + + + +

Other PFM Tags

+

Tags extracted from Portable FloatMap images. See +http://www.pauldebevec.com/Research/HDR/PFM/ for the specification.

+
+
+ + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
ByteOrderno 
ColorSpaceno'PF' = RGB +
'Pf' = Monochrome
ImageHeightno 
ImageWidthno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Aug 12, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PCX.html b/html/TagNames/PCX.html new file mode 100644 index 0000000..59d841b --- /dev/null +++ b/html/TagNames/PCX.html @@ -0,0 +1,105 @@ + + + + +PCX Tags + + + +

PCX Tags

+

Tags extracted from PC Paintbrush images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Manufacturerno10 = ZSoft
1Softwareno0 = PC Paintbrush 2.5 +
2 = PC Paintbrush 2.8 (with palette) +
3 = PC Paintbrush 2.8 (without palette) +
4 = PC Paintbrush for Windows +
5 = PC Paintbrush 3.0+
2Encodingno1 = RLE
3BitsPerPixelno 
4LeftMarginno 
6TopMarginno 
8ImageWidthno(adjusted for LeftMargin)
10ImageHeightno(adjusted for TopMargin)
12XResolutionno 
14YResolutionno 
65ColorPlanesno 
66BytesPerLineno 
68ColorModeno0 = n/a +
1 = Color Palette +
2 = Grayscale
70ScreenWidthno 
72ScreenHeightno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 2, 2019 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PDF.html b/html/TagNames/PDF.html new file mode 100644 index 0000000..ac1e18d --- /dev/null +++ b/html/TagNames/PDF.html @@ -0,0 +1,746 @@ + + + + +PDF Tags + + + +

PDF Tags

+

+The tags listed in the PDF tables below are those which are used by ExifTool +to extract meta information, but they are only a small fraction of the total +number of available PDF tags. See +http://www.adobe.com/devnet/pdf/pdf_reference.html for the official PDF +specification.

+ +

ExifTool supports reading and writing PDF documents up to version 1.7 +extension level 3, including support for RC4, AES-128 and AES-256 +encryption. A Password option is provided to allow processing of +password-protected PDF files.

+ +

ExifTool may be used to write native PDF and XMP metadata to PDF files. It +uses an incremental update technique that has the advantages of being both +fast and reversible. If ExifTool was used to modify a PDF file, the +original may be recovered by deleting the PDF-update pseudo-group (with +-PDF-update:all= on the command line). However, there are two main +disadvantages to this technique:

+ +

1) A linearized PDF file is no longer linearized after the update, so it +must be subsequently re-linearized if this is required.

+ +

2) All metadata edits are reversible. While this would normally be +considered an advantage, it is a potential security problem because old +information is never actually deleted from the file. (However, after +running ExifTool the old information may be removed permanently using the +"qpdf" utility with this command: "qpdf --linearize in.pdf out.pdf".) +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Encrypt'Encrypt---> PDF Encrypt Tags
'Info'Info---> PDF Info Tags
'Root'Root---> PDF Root Tags
'_linearized'Linearizedno(flag set if document is linearized for fast web display; not a real Tag ID) +
'false' = No +
'true' = Yes
+ +

PDF Encrypt Tags

+

Tags extracted from the document Encrypt dictionary.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Filter'Encryptionno(extracted value is actually a combination of the Filter, SubFilter, V, R and +Length information from the Encrypt dictionary)
'P'UserAccessno + +
Bit 2 = Print +
Bit 3 = Modify +
Bit 4 = Copy +
Bit 5 = Annotate
  Bit 8 = Fill forms +
Bit 9 = Extract +
Bit 10 = Assemble +
Bit 11 = Print high-res
+
+ +

PDF Info Tags

+

As well as the tags listed below, the PDF specification allows for +user-defined tags to exist in the Info dictionary. These tags, which should +have corresponding XMP-pdfx entries in the XMP of the PDF XML Metadata +object, are also extracted by ExifTool.

+ +

Writable specifies the value format, and may be string, date, +integer, real, boolean or name for PDF tags.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'AAPL:Keywords'AppleKeywordsstring+(keywords written by Apple utilities, although they seem to use PDF:Keywords +when reading)
'Author'Authorstring 
'CreationDate'CreateDatedate 
'Creator'Creatorstring 
'Keywords'Keywordsstring+ 
'ModDate'ModifyDatedate 
'Producer'Producerstring 
'Subject'Subjectstring 
'Title'Titlestring 
'Trapped'Trappedstring! 
+ +

PDF Root Tags

+

This is the PDF document catalog.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'AcroForm'AcroForm---> PDF AcroForm Tags
'Lang'Languageno 
'MarkInfo'MarkInfo---> PDF MarkInfo Tags
'Metadata'Metadata---> PDF Metadata Tags
'PageLayout'PageLayoutno 
'PageMode'PageModeno 
'Pages'Pages---> PDF Pages Tags
'Perms'Perms---> PDF Perms Tags
'Version'PDFVersionno 
+ +

PDF AcroForm Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'_has_xfa'HasXFAno(this tag is defined if a document contains form fields, and is true if it +uses XML Forms Architecture; not a real Tag ID) +
'false' = No +
'true' = Yes
+ +

PDF MarkInfo Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Marked'TaggedPDFno(not a Tagged PDF if this tag is missing) +
'false' = No +
'true' = Yes
+ +

PDF Metadata Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'XML_stream'XMP---> XMP Tags
+ +

PDF Pages Tags

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Count'PageCountno 
'Kids'Kids---> PDF Kids Tags
+ +

PDF Kids Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Kids'Kids---> PDF Kids Tags
'Metadata'Metadata---> PDF Metadata Tags
'PieceInfo'PieceInfo---> PDF PieceInfo Tags
'Resources'Resources---> PDF Resources Tags
+ +

PDF PieceInfo Tags

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'AdobePhotoshop'AdobePhotoshop---> PDF AdobePhotoshop Tags
'Illustrator'Illustrator---> PDF Illustrator Tags
+ +

PDF AdobePhotoshop Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Private'Private---> PDF Private Tags
+ +

PDF Private Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ImageResources'ImageResources---> PDF ImageResources Tags
+ +

PDF ImageResources Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'_stream'_stream---> Photoshop Tags
+ +

PDF Illustrator Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Private'Private---> PDF AIPrivate Tags
+ +

PDF AIPrivate Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'AIMetaData'AIMetaData---> PDF AIMetaData Tags
'AIPDFPrivateData'AIPDFPrivateData---> PostScript Tags
'AIPrivateData'AIPrivateData---> PostScript Tags +
(the ExtractEmbedded option enables information to be extracted from embedded +PostScript documents in the AIPrivateData# and AIPDFPrivateData# streams)
'ContainerVersion'ContainerVersionno 
'CreatorVersion'CreatorVersionno 
'RoundTripVersion'RoundTripVersionno 
+ +

PDF AIMetaData Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'_stream'_stream---> PostScript Tags
+ +

PDF Resources Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ColorSpace'ColorSpace---> PDF ColorSpace Tags
'Properties'Properties---> PDF Properties Tags
'XObject'XObject---> PDF XObject Tags
+ +

PDF ColorSpace Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'CS0'CS0---> PDF DefaultRGB Tags
'Cs1'Cs1---> PDF DefaultRGB Tags
'DefaultCMYK'DefaultCMYK---> PDF DefaultRGB Tags
'DefaultRGB'DefaultRGB---> PDF DefaultRGB Tags
+ +

PDF DefaultRGB Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ICCBased'ICCBased---> PDF ICCBased Tags
+ +

PDF ICCBased Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'_stream'_stream---> ICC_Profile Tags
+ +

PDF Properties Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'MC'MC---> PDF MC Tags +
(the ExtractEmbedded option enables information to be extracted from these +embedded metadata dictionaries)
+ +

PDF MC Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Metadata'Metadata---> PDF Metadata Tags
+ +

PDF XObject Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Im'Im---> PDF Im Tags +
(the ExtractEmbedded option enables information to be extracted from these +embedded images)
+ +

PDF Im Tags

+

Information extracted from embedded images with the ExtractEmbedded option. +The EmbeddedImage and its metadata are extracted only for JPEG and Jpeg2000 +image formats.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ColorSpace'EmbeddedImageColorSpaceno+ 
'Filter'EmbeddedImageFilterno+ 
'Height'EmbeddedImageHeightno 
'Image_stream'EmbeddedImageno 
'Width'EmbeddedImageWidthno 
+ +

PDF Perms Tags

+

Additional document permissions imposed by digital signatures.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'DocMDP'DocMDP---> PDF Signature Tags
'FieldMDP'FieldMDP---> PDF Signature Tags
'UR3'UR3---> PDF Signature Tags
+ +

PDF Signature Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ContactInfo'SignerContactInfono 
'Location'SigningLocationno 
'M'SigningDateno 
'Name'SigningAuthorityno 
'Prop_AuthTime'AuthenticationTimeno 
'Prop_AuthType'AuthenticationTypeno 
'Reason'SigningReasonno 
'Reference'Reference---> PDF Reference Tags
+ +

PDF Reference Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'TransformParams'TransformParams---> PDF TransformParams Tags
+ +

PDF TransformParams Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Action'FieldPermissionsno(FieldMDP signatures only) +
'All' = Disallow changes to all form fields +
'Exclude' = Allow changes to specified form fields +
'Include' = Disallow changes to specified form fields
'Annots'AnnotationUsageRightsno+(possible values are Create, Delete, Modify, Copy, Import and Export; +additional values for UR3 signatures are Online and SummaryView)
'Document'DocumentUsageRightsno+(only possible value is FullSave)
'EF'EmbeddedFileUsageRightsno+(possible values are Create, Delete, Modify and Import)
'Fields'FormFieldsno+(FieldMDP signatures only)
'Form'FormUsageRightsno+(possible values are FillIn, Import, Export, SubmitStandalone and +SpawnTemplate; additional values for UR3 signatures are BarcodePlaintext and +Online)
'FormEX'FormExtraUsageRightsno+(UR signatures only; only possible value is BarcodePlaintext)
'Msg'UsageRightsMessageno 
'P'ModificationPermissionsno(1-3 for DocMDP signatures, default 2; true/false for UR3 signatures, default +false) +
1 = No changes permitted +
2 = Fill forms, Create page templates, Sign +
3 = Fill forms, Create page templates, Sign, Create/Delete/Edit annotations +
'false' = Do not restrict applications to reader permissions +
'true' = Restrict all applications to reader permissions
'Signature'SignatureUsageRightsno+(only possible value is Modify)
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 27, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PGF.html b/html/TagNames/PGF.html new file mode 100644 index 0000000..c064e7b --- /dev/null +++ b/html/TagNames/PGF.html @@ -0,0 +1,81 @@ + + + + +PGF Tags + + + +

PGF Tags

+

The following table lists information extracted from the header of +Progressive Graphics File (PGF) images. As well, information is extracted +from the embedded PNG metadata image if it exists. See +http://www.libpgf.org/ for the PGF specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
3PGFVersionno 
8ImageWidthno 
12ImageHeightno 
16PyramidLevelsno 
17Qualityno 
18BitsPerPixelno 
19ColorComponentsno 
20ColorModeno + +
0 = Bitmap +
1 = Grayscale +
2 = Indexed +
3 = RGB
  4 = CMYK +
7 = Multichannel +
8 = Duotone +
9 = Lab
+
21BackgroundColorno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 26, 2011 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PICT.html b/html/TagNames/PICT.html new file mode 100644 index 0000000..e430514 --- /dev/null +++ b/html/TagNames/PICT.html @@ -0,0 +1,754 @@ + + + + +PICT Tags + + + +

PICT Tags

+

The PICT format contains no true meta information, except for the possible +exception of the LongComment opcode. By default, only ImageWidth, +ImageHeight and X/YResolution are extracted from a PICT image. Tags in the +following table represent image opcodes. Extraction of these tags is +experimental, and is only enabled with the Verbose or Unknown options.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000Nopno 
0x0001ClipRgnno 
0x0002BkPatno 
0x0003TxFontno 
0x0004TxFaceno 
0x0005TxModeno 
0x0006SpExtrano 
0x0007PnSizeno 
0x0008PnModeno 
0x0009PnPatno 
0x000aFillPatno 
0x000bOvSizeno 
0x000cOriginno 
0x000dTxSizeno 
0x000eFgColorno 
0x000fBkColorno 
0x0010TxRationo 
0x0011VersionOpno 
0x0012BkPixPatno 
0x0013PnPixPatno 
0x0014FillPixPatno 
0x0015PnLocHFracno 
0x0016ChExtrano 
0x0017Reservedno 
0x001aRGBFgColno 
0x001bRGBBkColno 
0x001cHiliteModeno 
0x001dHiliteColorno 
0x001eDefHiliteno 
0x001fOpColorno 
0x0020Lineno 
0x0021LineFromno 
0x0022ShortLineno 
0x0023ShortLineFromno 
0x0024Reservedno 
0x0028LongTextno 
0x0029DHTextno 
0x002aDVTextno 
0x002bDHDVTextno 
0x002cFontNameno 
0x002dLineJustifyno 
0x002eGlyphStateno 
0x002fReservedno 
0x0030FrameRectno 
0x0031PaintRectno 
0x0032EraseRectno 
0x0033InvertRectno 
0x0034FillRectno 
0x0035Reservedno 
0x0038FrameSameRectno 
0x0039PaintSameRectno 
0x003aEraseSameRectno 
0x003bInvertSameRectno 
0x003cFillSameRectno 
0x003dReservedno 
0x0040FrameRRectno 
0x0041PaintRRectno 
0x0042EraseRRectno 
0x0043InvertRRectno 
0x0044FillRRectno 
0x0045Reservedno 
0x0048FrameSameRRectno 
0x0049PaintSameRRectno 
0x004aEraseSameRRectno 
0x004bInvertSameRRectno 
0x004cFillSameRRectno 
0x004dReservedno 
0x0050FrameOvalno 
0x0051PaintOvalno 
0x0052EraseOvalno 
0x0053InvertOvalno 
0x0054FillOvalno 
0x0055Reservedno 
0x0058FrameSameOvalno 
0x0059PaintSameOvalno 
0x005aEraseSameOvalno 
0x005bInvertSameOvalno 
0x005cFillSameOvalno 
0x005dReservedno 
0x0060FrameArcno 
0x0061PaintArcno 
0x0062EraseArcno 
0x0063InvertArcno 
0x0064FillArcno 
0x0065Reservedno 
0x0068FrameSameArcno 
0x0069PaintSameArcno 
0x006aEraseSameArcno 
0x006bInvertSameArcno 
0x006cFillSameArcno 
0x006dReservedno 
0x0070FramePolyno 
0x0071PaintPolyno 
0x0072ErasePolyno 
0x0073InvertPolyno 
0x0074FillPolyno 
0x0075Reservedno 
0x0078FrameSamePolyno 
0x0079PaintSamePolyno 
0x007aEraseSamePolyno 
0x007bInvertSamePolyno 
0x007cFillSamePolyno 
0x007dReservedno 
0x0080FrameRgnno 
0x0081PaintRgnno 
0x0082EraseRgnno 
0x0083InvertRgnno 
0x0084FillRgnno 
0x0085Reservedno 
0x0088FrameSameRgnno 
0x0089PaintSameRgnno 
0x008aEraseSameRgnno 
0x008bInvertSameRgnno 
0x008cFillSameRgnno 
0x008dReservedno 
0x0090BitsRectno 
0x0091BitsRgnno 
0x0092Reservedno 
0x0098PackBitsRectno 
0x0099PackBitsRgnno 
0x009aDirectBitsRectno 
0x009bDirectBitsRgnno 
0x009cReservedno 
0x009dReservedno 
0x009eReservedno 
0x009fReservedno 
0x00a0ShortCommentno 
0x00a1LongComment---> Photoshop Tags +
--> ICC_Profile Tags
0x00a2Reservedno 
0x00b0Reservedno 
0x00d0Reservedno 
0x00ffOpEndPicno 
0x0100Reservedno 
0x0200Reservedno 
0x02ffVersionno 
0x0300Reservedno 
0x0bffReservedno 
0x0c00HeaderOpno 
0x0c01Reservedno 
0x7f00Reservedno 
0x8000Reservedno 
0x8100Reservedno 
0x8200CompressedQuickTimeno 
0x8201UncompressedQuickTimeno 
0xffffReservedno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 13, 2006 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PLIST.html b/html/TagNames/PLIST.html new file mode 100644 index 0000000..9643222 --- /dev/null +++ b/html/TagNames/PLIST.html @@ -0,0 +1,87 @@ + + + + +PLIST Tags + + + +

PLIST Tags

+

Apple Property List tags. ExifTool reads both XML and binary-format PLIST +files, and will extract any existing tags even if they aren't listed below. +These tags belong to the family 0 "PLIST" group, but family 1 group may be +either "XML" or "PLIST" depending on whether the format is XML or binary.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'MetaDataList//DateTimeOriginal'DateTimeOriginalno 
'MetaDataList//Duration'Durationno 
'MetaDataList//Geolocation/Latitude'GPSLatitudeno 
'MetaDataList//Geolocation/Longitude'GPSLongitudeno 
'MetaDataList//Geolocation/MapDatum'GPSMapDatumno 
'XMLFileType'XMLFileTypeno 
'cast//name'Castno+ 
'codirectors//name'Codirectorsno+ 
'directors//name'Directorsno+ 
'producers//name'Producersno+ 
'screenwriters//name'Screenwritersno+ 
'studio//name'Studiono+ 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Feb 22, 2013 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PLUS.html b/html/TagNames/PLUS.html new file mode 100644 index 0000000..8280528 --- /dev/null +++ b/html/TagNames/PLUS.html @@ -0,0 +1,2616 @@ + + + + +PLUS Tags + + + +

PLUS XMP Tags

+

PLUS (Picture Licensing Universal System) License Data Format 1.2.1 XMP +tags. Note that all controlled-vocabulary tags in this table (ie. tags with +a fixed set of values) have raw values which begin with +"http://ns.useplus.org/ldf/vocab/", but to reduce clutter this prefix has +been removed from the values shown below. See http://ns.useplus.org/ for +the complete specification.

+ +

These tags belong to the ExifTool XMP-plus family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AdultContentWarningstring'CW-AWR' = Adult Content Warning Required +
'CW-NRQ' = Not Required +
'CW-UNK' = Unknown
CopyrightOwnerstruct+--> CopyrightOwner Struct
CopyrightOwnerIDstring_+(CopyrightOwnerCopyrightOwnerID)
CopyrightOwnerNamestring_+(CopyrightOwnerCopyrightOwnerName)
CopyrightOwnerImageIDstring 
CopyrightRegistrationNumberstring 
CopyrightStatusstring'CS-PRO' = Protected +
'CS-PUB' = Public Domain +
'CS-UNK' = Unknown
CreditLineRequiredstring'CR-CAI' = Credit Adjacent To Image +
'CR-CCA' = Credit in Credits Area +
'CR-COI' = Credit on Image +
'CR-NRQ' = Not Required
Custom1lang-alt+ 
Custom10lang-alt+ 
Custom2lang-alt+ 
Custom3lang-alt+ 
Custom4lang-alt+ 
Custom5lang-alt+ 
Custom6lang-alt+ 
Custom7lang-alt+ 
Custom8lang-alt+ 
Custom9lang-alt+ 
EndUserstruct+--> EndUser Struct
EndUserIDstring_+(EndUserEndUserID)
EndUserNamestring_+(EndUserEndUserName)
FileNameAsDeliveredstring 
FirstPublicationDatedate 
ImageAlterationConstraintsstring+ +
'AL-CLR' = No Colorization +
'AL-CRP' = No Cropping +
'AL-DCL' = No De-Colorization +
'AL-FLP' = No Flipping +
'AL-MRG' = No Merging +
'AL-RET' = No Retouching
+
ImageCreatorstruct+--> ImageCreator Struct
ImageCreatorIDstring_+(ImageCreatorImageCreatorID)
ImageCreatorNamestring_+(ImageCreatorImageCreatorName)
ImageCreatorImageIDstring 
ImageDuplicationConstraintsstring'DP-LIC' = Duplication Only as Necessary Under License +
'DP-NDC' = No Duplication Constraints +
'DP-NOD' = No Duplication
ImageFileConstraintsstring+'IF-MFN' = Maintain File Name +
'IF-MFT' = Maintain File Type +
'IF-MID' = Maintain ID in File Name +
'IF-MMD' = Maintain Metadata
ImageFileFormatAsDeliveredstring'FF-BMP' = Windows Bitmap (BMP) +
'FF-DNG' = Digital Negative (DNG) +
'FF-EPS' = Encapsulated PostScript (EPS) +
'FF-GIF' = Graphics Interchange Format (GIF) +
'FF-JPG' = JPEG Interchange Formats (JPG, JIF, JFIF) +
'FF-OTR' = Other +
'FF-PIC' = Macintosh Picture (PICT) +
'FF-PNG' = Portable Network Graphics (PNG) +
'FF-PSD' = Photoshop Document (PSD) +
'FF-RAW' = Proprietary RAW Image Format +
'FF-TIF' = Tagged Image File Format (TIFF) +
'FF-WMP' = Windows Media Photo (HD Photo)
ImageFileSizeAsDeliveredstring'SZ-G50' = Greater than 50 MB +
'SZ-U01' = Up to 1 MB +
'SZ-U10' = Up to 10 MB +
'SZ-U30' = Up to 30 MB +
'SZ-U50' = Up to 50 MB
ImageSupplierstruct+--> ImageSupplier Struct
ImageSupplierImageIDstring 
ImageSupplierIDstring_+(ImageSupplierImageSupplierID)
ImageSupplierNamestring_+(ImageSupplierImageSupplierName)
ImageTypestring'TY-ILL' = Illustrated Image +
'TY-MCI' = Multimedia or Composited Image +
'TY-OTR' = Other +
'TY-PHO' = Photographic Image +
'TY-VID' = Video
Licenseestruct+--> Licensee Struct
LicenseeImageIDstring 
LicenseeImageNoteslang-alt 
LicenseeIDstring_+(LicenseeLicenseeID)
LicenseeNamestring_+(LicenseeLicenseeName)
LicenseEndDatedate 
LicenseeProjectReferencestring+ 
LicenseeTransactionIDstring+ 
LicenseIDstring 
LicenseStartDatedate 
LicenseTransactionDatedate 
Licensorstruct+--> Licensor Struct
LicensorImageIDstring 
LicensorCitystring_+(LicensorLicensorCity)
LicensorCountrystring_+(LicensorLicensorCountry)
LicensorEmailstring_+(LicensorLicensorEmail)
LicensorExtendedAddressstring_+(LicensorLicensorExtendedAddress)
LicensorIDstring_+(LicensorLicensorID)
LicensorNamestring_+(LicensorLicensorName)
LicensorPostalCodestring_+(LicensorLicensorPostalCode)
LicensorRegionstring_+(LicensorLicensorRegion)
LicensorStreetAddressstring_+(LicensorLicensorStreetAddress)
LicensorTelephone1string_+(LicensorLicensorTelephone1)
LicensorTelephone2string_+(LicensorLicensorTelephone2)
LicensorTelephoneType1string_+(LicensorLicensorTelephoneType1) +
'cell' = Cell +
'fax' = FAX +
'home' = Home +
'pager' = Pager +
'work' = Work
LicensorTelephoneType2string_+(LicensorLicensorTelephoneType2) +
'cell' = Cell +
'fax' = FAX +
'home' = Home +
'pager' = Pager +
'work' = Work
LicensorURLstring_+(LicensorLicensorURL)
LicensorNoteslang-alt 
LicensorTransactionIDstring+ 
MediaConstraintslang-alt 
MediaSummaryCodestring--> PLUS MediaMatrix Values
MinorModelAgeDisclosurestring +
'AG-A15' = Age 15 +
'AG-A16' = Age 16 +
'AG-A17' = Age 17 +
'AG-A18' = Age 18 +
'AG-A19' = Age 19 +
'AG-A20' = Age 20 +
'AG-A21' = Age 21 +
'AG-A22' = Age 22 +
'AG-A23' = Age 23 +
'AG-A24' = Age 24 +
'AG-A25' = Age 25 or Over +
'AG-U14' = Age 14 or Under +
'AG-UNK' = Age Unknown
+
ModelReleaseIDstring+ 
ModelReleaseStatusstring'MR-LMR' = Limited or Incomplete Model Releases +
'MR-NAP' = Not Applicable +
'MR-NON' = None +
'MR-UMR' = Unlimited Model Releases
OtherConditionslang-alt 
OtherConstraintslang-alt 
OtherImageInfolang-alt 
OtherLicenseDocumentsstring+ 
OtherLicenseInfolang-alt 
OtherLicenseRequirementslang-alt 
ProductOrServiceConstraintslang-alt 
PropertyReleaseIDstring+ 
PropertyReleaseStatusstring'PR-LPR' = Limited or Incomplete Property Releases +
'PR-NAP' = Not Applicable +
'PR-NON' = None +
'PR-UPR' = Unlimited Property Releases
RegionConstraintslang-alt 
Reusestring'RE-NAP' = Not Applicable +
'RE-REU' = Repeat Use
TermsAndConditionsTextlang-alt 
TermsAndConditionsURLstring 
PLUSVersionstring(called Version by the spec)
+ +

PLUS MediaMatrix Values

+

The lookup below is used to add human-readable descriptions to Media Matrix +ID's in PLUS Media Summary Codes.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueMediaMatrix
'1IAA'= 1 Usage Item:
'1IAB'= 2 Usage Items:
'1IAC'= 3 Usage Items:
'1IAD'= 4 Usage Items:
'1IAE'= 5 Usage Items:
'1UNA'= Usage Number A
'1UNB'= Usage Number B
'1UNC'= Usage Number C
'1UND'= Usage Number D
'1UNE'= Usage Number E
'2AAA'= Advertising|All Media Types|All Formats|All Distribution Formats
'2AAB'= All Categories|Book|All Book Types|All Distribution Formats
'2AAC'= All Categories|Periodicals|All Periodical Types|All Distribution Formats
'2AAD'= All Categories|Display|All Display Types|All Distribution Formats
'2AAE'= Editorial|All Media Types|All Formats|All Distribution Formats
'2AAG'= All Categories|Product Packaging|All Product Packaging Types|All Distribution Formats
'2AAH'= All Categories|Merchandise|All Merchandise Types|All Distribution Formats
'2AAI'= Internal Company Use|All Media Types|All Formats|All Distribution Formats
'2AAL'= All Categories|Mobile|All Mobile Types|All Distribution Formats
'2AAM'= Motion Picture & TV|All Media Types|All Formats|All Distribution Formats
'2AAN'= All Categories|Television Programming|All Television Programming Types|All Distribution Formats
'2AAP'= Products|All Media Types|All Formats|All Distribution Formats
'2AAR'= All Categories|Point of Purchase|All Point Of Purchase Types|All Distribution Formats
'2AAT'= All Categories|Marketing Materials|All Marketing Material Types|All Distribution Formats
'2AAU'= Personal Use|All Media Types|All Formats|All Distribution Formats
'2AAV'= All Categories|Music Video|All Music Video Types|All Distribution Formats
'2AAX'= All Categories|Motion Picture|All Motion Picture Types|All Distribution Formats
'2AAY'= Advertising|All Media Types|Promotional Reproduction of Licensed Usage in Context|All Distribution Formats
'2ACE'= Advertising|Periodicals|Magazine, Consumer|Internet Website
'2ACT'= Motion Picture & TV|Motion Picture|All Motion Picture Types|All Electronic Distribution Formats
'2ADD'= Products|Merchandise|Address Book|Printed
'2ADH'= Advertising|Point of Purchase|Adhesive Tag|Printed
'2ADS'= Advertising|Periodicals|Magazine, Consumer|Internet Email
'2AFT'= Advertising|Periodicals|Magazine, Trade|Internet Email
'2AGE'= Advertising|Periodicals|Magazine, Trade|Recordable Media
'2AGO'= Advertising|Periodicals|Magazine, Corporate|Internet Email
'2AHA'= Advertising|Periodicals|Magazine, Education|Internet Email
'2AID'= Motion Picture & TV|Motion Picture|Movie Trailer|All Electronic Distribution Formats
'2AIL'= Advertising|Periodicals|Magazine, Custom Published|Internet Email
'2AIM'= Motion Picture & TV|Motion Picture|Short Film|Recordable Media
'2ALB'= Products|Merchandise|Photo Album|Printed
'2ALL'= All Categories|All Media Types|All Formats|All Distribution Formats
'2ALP'= Advertising|Periodicals|Magazine, Custom Published|Recordable Media
'2AMI'= Advertising|Periodicals|Magazine, Custom Published|All Electronic Distribution Formats
'2AMP'= Advertising|Periodicals|Magazine Reprints, All Types|Internet Email
'2ANA'= Advertising|Periodicals|Magazine, All Types|Internet Website
'2ANN'= Advertising|Periodicals|Annual Report|Printed
'2ANT'= Products|Merchandise|Anthology|Printed
'2ANY'= Advertising|Periodicals|Magazine, All Types|Internet Downloadable File
'2APE'= Advertising|Periodicals|Magazine, All Types|Internet Email
'2APP'= Products|Merchandise|Apparel, General Apparel|Printed or Woven
'2APT'= Advertising|Periodicals|Magazine, All Types|All Internet Distribution Formats
'2ARC'= Motion Picture & TV|Motion Picture|Set Decor|Projected Display
'2ARK'= Advertising|Periodicals|Magazine, All Types|All Electronic Distribution Formats
'2ARM'= Advertising|Periodicals|Newspaper, Weekly Supplement|Internet Email
'2ART'= Advertising|Art|Art Display, All Art Types|Printed
'2ASH'= Advertising|Periodicals|Newspaper, Tabloid|Internet Downloadable File
'2ASK'= Motion Picture & TV|Motion Picture|Short Film|All Internet Distribution Formats
'2ATE'= Motion Picture & TV|Motion Picture|Movie Trailer|Projected Display
'2ATM'= Products|Merchandise|Card, ATM Card|Printed
'2ATT'= Products|Merchandise|Card, Phone Card|Printed
'2BAA'= All Categories|Website|All Web Page Types|All Distribution Formats
'2BAB'= Products|Art|Artist's Reference, Tattoo|Printed
'2BAG'= Advertising|Periodicals|All Periodical Types|Printed
'2BAH'= Advertising|Periodicals|Quarterly Report|Printed
'2BAJ'= Products|Merchandise|Computer Software|Recordable Media
'2BAK'= Products|Merchandise|Computer Software|Internet Downloadable File
'2BAL'= Advertising|Periodicals|Quarterly Report|Internet Email
'2BAM'= Advertising|Periodicals|Magazine, Advertorial|Internet Downloadable File
'2BAN'= Advertising|Display|Banner, All Types|Electronic Display
'2BAP'= Advertising|Periodicals|Magazine, Advertorial|Internet Website
'2BAR'= Advertising|Point of Purchase|All Point of Purchase Types|All Electronic Distribution Formats
'2BAS'= Advertising|Periodicals|Annual Report|Recordable Media
'2BAT'= Advertising|Periodicals|Free Standing Insert, All Insert Types|Printed
'2BAU'= Products|Merchandise|Computer Software|Internet Email
'2BAV'= Products|Merchandise|Computer Software|All Internet Distribution Formats
'2BAW'= Products|Merchandise|Diary|Recordable Media
'2BAY'= Advertising|Periodicals|Newspaper, Tabloid|Internet Email
'2BAZ'= Products|Merchandise|Diary|Internet Downloadable File
'2BBA'= Products|Merchandise|Diary|Internet Email
'2BCF'= Products|Merchandise|Retail Calendar, Multi-Page|Recordable Media
'2BCG'= Products|Merchandise|Retail Calendar, Multi-Page|All Electronic Distribution Formats
'2BCH'= Products|Merchandise|Retail Calendar, Multi-Page|All Internet Distribution Formats
'2BCI'= Products|Merchandise|Retail Calendar, Multi-Page|Internet Email
'2BCJ'= Products|Merchandise|Retail Calendar, Multi-Page|Internet Downloadable File
'2BED'= Advertising|Periodicals|Newspaper, All Types|Internet Email
'2BEE'= Editorial|Book|Textbook, Middle Reader|Printed
'2BEG'= Advertising|Book|Retail Book, Directory|Printed
'2BEL'= Advertising|Art|Art Display, All Art Types|Internet Website
'2BEN'= Advertising|Periodicals|Magazine, Advertorial|Printed
'2BER'= Motion Picture & TV|Music Video|All Music Video Types|Recordable Media
'2BES'= Motion Picture & TV|Music Video|All Music Video Types|All Internet Distribution Formats
'2BET'= Motion Picture & TV|Motion Picture|Movie Trailer|All Internet Distribution Formats
'2BEY'= Advertising|Art|Art Display, All Art Types|All Internet Distribution Formats
'2BFH'= Personal Use|Art|Art Display, All Art Types|All Electronic Distribution Formats
'2BFI'= Personal Use|Art|Art Display, All Art Types|All Internet Distribution Formats
'2BFJ'= Personal Use|Art|Art Display, All Art Types|Internet Website
'2BFK'= Personal Use|Art|Art Display, All Art Types|Electronic Display
'2BFN'= Personal Use|Art|Art Display, Display Print|Printed
'2BFP'= Personal Use|Art|Study Print, Educational|Printed
'2BFR'= Personal Use|Website|Web Page, All Types|Internet Website
'2BFS'= Personal Use|Website|Web Page, All Types|Recordable Media
'2BFT'= Personal Use|Website|Web Page, All Types|All Electronic Distribution Formats
'2BFU'= Personal Use|Website|Web Page, All Types|All Internet Distribution Formats
'2BHB'= Internal Company Use|Art|Art Display, Display Print|Printed
'2BHD'= Internal Company Use|Email|All Email Types|Intranet and Extranet Email
'2BHF'= Internal Company Use|Live Presentation|Internal Presentation|Projected Display
'2BHG'= Internal Company Use|Promotional Materials|Corporate Brochure|Recordable Media
'2BHH'= Internal Company Use|Promotional Materials|Corporate Brochure|Intranet and Extranet Downloadable File
'2BHI'= Internal Company Use|Promotional Materials|Corporate Brochure|Intranet and Extranet Email
'2BHK'= Internal Company Use|Promotional Materials|Corporate Calendar|Recordable Media
'2BHL'= Internal Company Use|Promotional Materials|Corporate Calendar|Intranet and Extranet Downloadable File
'2BHM'= Internal Company Use|Promotional Materials|Corporate Calendar|Intranet and Extranet Email
'2BHN'= Internal Company Use|Promotional Materials|Corporate Calendar|Printed
'2BHQ'= Internal Company Use|Promotional Materials|Card, Corporate Card|Printed
'2BHS'= Internal Company Use|Promotional Materials|Card, Corporate Card|Recordable Media
'2BHT'= Internal Company Use|Promotional Materials|Card, Corporate Card|Intranet and Extranet Downloadable File
'2BHU'= Internal Company Use|Promotional Materials|Card, Corporate Card|Intranet and Extranet Email
'2BHV'= Internal Company Use|Promotional Materials|Sales Kit|All Electronic Distribution Formats
'2BHW'= Internal Company Use|Promotional Materials|Training Materials|Printed
'2BHY'= Internal Company Use|Promotional Materials|Corporate Folder|Printed
'2BHZ'= Internal Company Use|Promotional Materials|CD ROM|Recordable Media
'2BIA'= Internal Company Use|Periodicals|Magazine, Custom Published|Recordable Media
'2BIB'= Advertising|Point of Purchase|All Point of Purchase Types|Electronic Display
'2BIC'= Internal Company Use|Periodicals|Magazine, Custom Published|Intranet and Extranet Website
'2BID'= Advertising|Periodicals|Newsletter, All Types|Internet Email
'2BIF'= Internal Company Use|Periodicals|Magazine, Custom Published|Intranet and Extranet Downloadable File
'2BIG'= Advertising|Display|All Display Types|Printed
'2BIH'= Internal Company Use|Periodicals|Magazine, Custom Published|All Electronic Distribution Formats
'2BII'= Internal Company Use|Periodicals|Magazine, Custom Published|All Intranet and Extranet Distribution Formats
'2BIL'= Advertising|Display|Billboard, All Types|Printed
'2BIN'= Advertising|Point of Purchase|All Point of Purchase Types|Printed
'2BIO'= Products|Merchandise|Birthday Book|Printed
'2BIS'= Advertising|Art|Art Display, All Art Types|All Electronic Distribution Formats
'2BIT'= Products|Merchandise|Card, Debit Card|Printed
'2BIZ'= Advertising|Marketing Materials|Card, Business Greeting Card|Printed
'2BJH'= Internal Company Use|Website|Webcast, All Types|Intranet and Extranet Website
'2BJK'= Internal Company Use|Website|Web Page, All Types|All Electronic Distribution Formats
'2BJL'= Internal Company Use|Website|Web Page, All Types|Recordable Media
'2BJN'= Internal Company Use|Website|Web Page, Content Body|Intranet and Extranet Website
'2BLA'= Products|Merchandise|Blank Note Book|Printed
'2BLD'= Advertising|Display|Billboard, Building Wrap|Printed
'2BNK'= Products|Merchandise|Card, Bank Card|Printed
'2BOA'= Editorial|Book|Textbook, Student Edition|Printed
'2BOB'= Advertising|Periodicals|Magazine, Consumer|Printed
'2BOD'= Advertising|Periodicals|All Periodical Types|Internet Downloadable File
'2BOG'= Advertising|Display|All Display Types|Electronic Display
'2BOO'= Editorial|Book|Retail Book, All Types|Printed
'2BOP'= Advertising|Periodicals|Magazine, Advertorial|Internet Email
'2BOS'= Advertising|Art|Art Display, All Art Types|Electronic Display
'2BOT'= Advertising|Point of Purchase|Bottlenecker|Printed
'2BOW'= Advertising|Periodicals|All Periodical Types|Internet Email
'2BOX'= Products|Merchandise|Gift Box|Printed
'2BOY'= Advertising|Art|Art Display, Display Print|Printed
'2BPE'= Advertising|Display|Transit Advertising, Bus Poster|Electronic Display
'2BRA'= Advertising|Display|Banner, Airborne Display|Printed
'2BRO'= Advertising|Display|Banner, All Types|Printed
'2BRR'= Advertising|Display|Banner, Backdrop|Printed
'2BUB'= Advertising|Display|Banner, Background|Printed
'2BUD'= Advertising|Display|Billboard, All Types|Electronic Display
'2BUG'= Editorial|Book|Retail Book, Children's Book|Printed
'2BUN'= Advertising|Marketing Materials|Promo Card|Printed
'2BUR'= Advertising|Display|Billboard, Bulletin|Electronic Display
'2BUS'= Advertising|Display|Transit Advertising, Bus Panel|Printed
'2BUY'= Advertising|Point of Purchase|Floor Graphic|Printed
'2BYE'= Advertising|Display|Billboard, Mobile Billboard|Electronic Display
'2BYS'= Advertising|Display|Billboard, Mobile Billboard|Printed
'2CAL'= Products|Merchandise|Retail Calendar, Multi-Page|Printed
'2CAR'= Advertising|Display|Shopping Cart|Printed
'2CAS'= Advertising|Point of Purchase|Case Card|Printed
'2CDR'= Products|Merchandise|CD ROM|Recordable Media
'2CHK'= Products|Merchandise|Check|Printed
'2CLO'= Products|Merchandise|Retail Calendar, One Page|Printed
'2COU'= Advertising|Point of Purchase|Counter Card|Printed
'2CRD'= Products|Merchandise|Card, Other Card|Printed
'2CRE'= Products|Merchandise|Card, Credit Card|Printed
'2CRT'= Advertising|Display|Shopping Cart|Electronic Display
'2CUS'= Advertising|Periodicals|Magazine, Custom Published|Printed
'2DAB'= Advertising|Display|Billboard, Rotating Billboard|Printed
'2DAD'= Advertising|Display|Billboard, Spectacular|Electronic Display
'2DAG'= Advertising|Display|Billboard, Spectacular|Printed
'2DAH'= Advertising|Display|Billboard, Wallscape|Electronic Display
'2DAK'= Advertising|Display|Billboard, Wallscape|Printed
'2DAL'= Advertising|Display|Event, Stadium Advertising|Electronic Display
'2DAM'= Advertising|Display|Event, Stadium Advertising|Printed
'2DAP'= Advertising|Display|Event, Trade Show Display|Electronic Display
'2DAW'= Advertising|Display|Poster, All Types|Electronic Display
'2DAY'= Products|Product Packaging|All Product Packaging Types|Printed
'2DEB'= Advertising|Periodicals|Magazine, Education|Printed
'2DEE'= Advertising|Periodicals|Wrapper|Printed
'2DEL'= Advertising|Display|Poster, Backlit Print|Printed
'2DEN'= Advertising|Display|Poster, Corporate Poster|Electronic Display
'2DEV'= Advertising|Display|Poster, Corporate Poster|Printed
'2DEW'= Editorial|Book|Trade Book, All Types|Printed
'2DEX'= Advertising|Display|Poster, Display Chrome|Printed
'2DEY'= Advertising|Display|Poster, Door Side Poster|Electronic Display
'2DIA'= Products|Merchandise|Diary|Printed
'2DIB'= Advertising|Display|Poster, Door Side Poster|Printed
'2DID'= Advertising|Display|Poster, Elevator Advertising|Electronic Display
'2DIG'= Motion Picture & TV|Motion Picture|Movie Trailer|Recordable Media
'2DIM'= Personal Use|Personal Review|All Review Types|All Electronic Distribution Formats
'2DIN'= Advertising|Display|Store Display, All Display Types|Electronic Display
'2DIP'= Motion Picture & TV|Motion Picture|All Motion Picture Types|All Internet Distribution Formats
'2DIR'= Editorial|Book|Retail Book, Directory|Printed
'2DIS'= Advertising|Display|Event, Trade Show Display|Printed
'2DIT'= Advertising|Display|Store Display, In-Store Poster|Electronic Display
'2DOC'= Motion Picture & TV|Motion Picture|Documentary Film|All Electronic Distribution Formats
'2DOE'= Advertising|Display|Terminal Advertising, All Types|Electronic Display
'2DOG'= Editorial|Book|Reference Book, All Types|Printed
'2DOL'= Advertising|Display|Terminal Advertising, Bus Stop Advertising|Electronic Display
'2DOM'= Advertising|Display|Terminal Advertising, Bus Stop Advertising|Printed
'2DON'= Advertising|Display|Terminal Advertising, Ferry Terminal Advertising|Electronic Display
'2DOR'= Advertising|Display|Terminal Advertising, Ferry Terminal Advertising|Printed
'2DOS'= Advertising|Display|Terminal Advertising, Shelter Advertising|Electronic Display
'2DOT'= Advertising|Marketing Materials|Artist's Reference, All Types|All Electronic Distribution Formats
'2DOW'= Advertising|Display|Terminal Advertising, Station Poster|Electronic Display
'2DRY'= Advertising|Display|Poster, Restroom Poster|Printed
'2DUB'= Advertising|Display|Terminal Advertising, Station Poster|Printed
'2DUE'= Advertising|Display|Terminal Advertising, Subway Terminal Advertising|Electronic Display
'2DUG'= Advertising|Display|Terminal Advertising, Subway Terminal Advertising|Printed
'2DUH'= Advertising|Periodicals|Magazine, Advertorial|All Electronic Distribution Formats
'2DUI'= Advertising|Display|Terminal Advertising, Train Terminal Advertising|Electronic Display
'2DUN'= Advertising|Display|Terminal Advertising, Train Terminal Advertising|Printed
'2DUO'= Advertising|Marketing Materials|All Marketing Material Types|Recordable Media
'2DUP'= Advertising|Periodicals|Magazine Reprints, All Types|Printed
'2DVA'= Advertising|Marketing Materials|DVD|Recordable Media
'2DVD'= Products|Merchandise|DVD|Recordable Media
'2DVE'= Editorial|Merchandise|DVD|Recordable Media
'2DVI'= Internal Company Use|Promotional Materials|DVD|Recordable Media
'2DVL'= Products|Product Packaging|Packaging For Recordable Media, Liner Notes|Printed
'2DVP'= Products|Product Packaging|Packaging For Recordable Media, All Packaging Types|Printed
'2DYE'= Advertising|Marketing Materials|All Marketing Material Types|Internet Email
'2EAB'= Editorial|Book|Retail Book, Directory|All E-Book Distribution Formats
'2EAC'= Advertising|Book|Retail Book, Directory|E-Book in Internet Website
'2EAD'= Advertising|Book|Retail Book, Directory|E-Book in Internet Downloadable File
'2EAE'= Advertising|Book|Retail Book, Directory|All E-Book Internet Distribution Formats
'2EAF'= Advertising|Book|Retail Book, Directory|E-Book on Recordable Media
'2EAG'= Advertising|Book|Retail Book, Directory|All E-Book Distribution Formats
'2EAH'= Advertising|Book|Textbook, All Types|E-Book in Internet Website
'2EAJ'= Advertising|Book|Textbook, All Types|E-Book in Internet Downloadable File
'2EAK'= Advertising|Book|Textbook, All Types|All E-Book Internet Distribution Formats
'2EAL'= Advertising|Book|Textbook, All Types|E-Book on Recordable Media
'2EAM'= Advertising|Book|Textbook, All Types|All E-Book Distribution Formats
'2EAN'= Advertising|Book|All Book Types|All E-Book Internet Distribution Formats
'2EAP'= Advertising|Book|All Book Types|All E-Book Distribution Formats
'2EAQ'= Editorial|Book|Reference Book, Encyclopedia|E-Book in Internet Website
'2EAR'= Advertising|Live Presentation|All Live Presentation Types|All Electronic Distribution Formats
'2EAT'= Products|Merchandise|Edible Media|Printed
'2EAU'= Editorial|Display|Poster, Educational Poster|Printed
'2EBA'= Editorial|Book|Textbook Ancillary Materials, Lab Manual|E-Book in Internet Downloadable File
'2EBB'= Editorial|Book|Textbook Ancillary Materials, Workbook|E-Book in Internet Downloadable File
'2EBC'= Editorial|Book|Retail Book, All Types|E-Book in Internet Downloadable File
'2EBD'= Editorial|Book|Textbook Ancillary Materials, Teacher's Manual|E-Book in Internet Downloadable File
'2EBE'= Editorial|Book|Retail Book, Children's Book|E-Book in Internet Downloadable File
'2EBF'= Editorial|Book|Retail Book, Concept Book|E-Book in Internet Downloadable File
'2EBG'= Editorial|Book|Retail Book, Directory|E-Book in Internet Downloadable File
'2EBH'= Editorial|Book|Retail Book, Handbook|E-Book in Internet Downloadable File
'2EBI'= Editorial|Book|Retail Book, Hi-lo Book|E-Book in Internet Downloadable File
'2EBJ'= Editorial|Book|Retail Book, Illustrated Book|E-Book in Internet Downloadable File
'2EBK'= Editorial|Book|All Book Types|E-Book in Internet Downloadable File
'2EBL'= Editorial|Book|Retail Book, Illustrated Guide|E-Book in Internet Downloadable File
'2EBM'= Editorial|Book|Retail Book, Manual|E-Book in Internet Downloadable File
'2EBN'= Editorial|Book|Retail Book, Novelty Book|E-Book in Internet Downloadable File
'2EBP'= Editorial|Book|Retail Book, Postcard Book|E-Book in Internet Downloadable File
'2EBQ'= Editorial|Book|Retail Book, Young Adult Book|E-Book in Internet Downloadable File
'2EBR'= Editorial|Book|Textbook, All Types|E-Book in Internet Downloadable File
'2EBS'= Editorial|Book|Textbook, Compendium|E-Book in Internet Downloadable File
'2EBT'= Editorial|Book|Textbook, Middle Reader|E-Book in Internet Downloadable File
'2EBV'= Editorial|Book|Textbook, Student Edition|E-Book in Internet Downloadable File
'2EBW'= Editorial|Book|Textbook Ancillary Materials, Teachers' Edition|E-Book in Internet Downloadable File
'2ECU'= Advertising|Marketing Materials|Artist's Reference, All Types|All Internet Distribution Formats
'2EDH'= Advertising|Marketing Materials|Artist's Reference, All Types|Printed
'2EDU'= Advertising|Marketing Materials|CD ROM|Recordable Media
'2EEL'= Editorial|Book|Textbook, Compendium|Printed
'2EFF'= Advertising|Marketing Materials|Brochure|Internet Downloadable File
'2EFS'= Advertising|Marketing Materials|Brochure|Internet Email
'2EFT'= Advertising|Marketing Materials|Brochure|Recordable Media
'2EFX'= Motion Picture & TV|Motion Picture|Prop|All Electronic Distribution Formats
'2EGA'= Editorial|Book|Textbook, All Types|E-Book in Internet Email
'2EGB'= Editorial|Book|Retail Book, Children's Book|E-Book in Internet Email
'2EGC'= Editorial|Book|Retail Book, Children's Book|All E-Book Distribution Formats
'2EGD'= Editorial|Book|Retail Book, Concept Book|E-Book in Internet Email
'2EGE'= Editorial|Book|Retail Book, Concept Book|All E-Book Distribution Formats
'2EGG'= Advertising|Marketing Materials|Brochure|Printed
'2EGH'= Editorial|Book|Retail Book, Handbook|E-Book in Internet Email
'2EGJ'= Editorial|Book|Retail Book, Handbook|All E-Book Distribution Formats
'2EGK'= Editorial|Book|Retail Book, Hi-lo Book|E-Book in Internet Email
'2EGL'= Editorial|Book|Retail Book, Hi-lo Book|All E-Book Distribution Formats
'2EGM'= Editorial|Book|Retail Book, Illustrated Book|E-Book in Internet Email
'2EGN'= Editorial|Book|Retail Book, Illustrated Book|All E-Book Distribution Formats
'2EGO'= Advertising|Marketing Materials|Coupon|Internet Downloadable File
'2EGP'= Editorial|Book|Retail Book, Illustrated Guide|E-Book in Internet Email
'2EGQ'= Editorial|Book|Retail Book, Illustrated Guide|All E-Book Distribution Formats
'2EGR'= Editorial|Book|Retail Book, Illustrated Guide|All E-Book Distribution Formats
'2EGS'= Editorial|Book|Retail Book, Manual|E-Book in Internet Email
'2EGT'= Editorial|Book|Retail Book, Manual|All E-Book Distribution Formats
'2EGV'= Editorial|Book|Retail Book, Novelty Book|E-Book in Internet Email
'2EGW'= Editorial|Book|Retail Book, Novelty Book|All E-Book Distribution Formats
'2EGY'= Editorial|Book|Retail Book, Postcard Book|E-Book in Internet Email
'2EGZ'= Editorial|Book|Retail Book, Postcard Book|All E-Book Distribution Formats
'2EJA'= Editorial|Book|All Book Types|All E-Book Distribution Formats
'2EJB'= Editorial|Book|Retail Book, Young Adult Book|E-Book in Internet Email
'2EJC'= Editorial|Book|Retail Book, Young Adult Book|All E-Book Distribution Formats
'2EJD'= Editorial|Book|Retail Book, All Types|E-Book in Internet Email
'2EJE'= Editorial|Book|Retail Book, All Types|All E-Book Distribution Formats
'2EJF'= Editorial|Book|Textbook, Compendium|E-Book in Internet Email
'2EJJ'= Editorial|Book|Textbook, Compendium|All E-Book Distribution Formats
'2EJK'= Editorial|Book|Textbook, Middle Reader|E-Book in Internet Email
'2EJL'= Editorial|Book|Textbook, Middle Reader|All E-Book Distribution Formats
'2EJM'= Editorial|Book|Textbook, Student Edition|E-Book in Internet Email
'2EJN'= Editorial|Book|Textbook, Student Edition|All E-Book Distribution Formats
'2EJP'= Editorial|Book|Textbook, All Types|All E-Book Distribution Formats
'2EJQ'= Editorial|Book|Textbook Ancillary Materials, Lab Manual|E-Book in Internet Email
'2EJR'= Editorial|Book|Textbook Ancillary Materials, Lab Manual|All E-Book Distribution Formats
'2EJS'= Editorial|Book|Textbook Ancillary Materials, Teachers' Edition|E-Book in Internet Email
'2EJT'= Editorial|Book|Textbook Ancillary Materials, Teachers' Edition|All E-Book Distribution Formats
'2EJU'= Editorial|Book|All Book Types|E-Book in Internet Email
'2EJV'= Editorial|Book|Textbook Ancillary Materials, Teacher's Manual|E-Book in Internet Email
'2EJW'= Editorial|Book|Textbook Ancillary Materials, Teacher's Manual|All E-Book Distribution Formats
'2EJY'= Editorial|Book|Textbook Ancillary Materials, Workbook|E-Book in Internet Email
'2EJZ'= Editorial|Book|Textbook Ancillary Materials, Workbook|All E-Book Distribution Formats
'2EKA'= Editorial|Book|All Book Types|All E-Book Internet Distribution Formats
'2EKB'= Editorial|Book|Retail Book, Children's Book|All E-Book Internet Distribution Formats
'2EKC'= Editorial|Book|Retail Book, Concept Book|All E-Book Internet Distribution Formats
'2EKD'= Editorial|Book|Retail Book, Handbook|All E-Book Internet Distribution Formats
'2EKE'= Editorial|Book|Retail Book, Hi-lo Book|All E-Book Internet Distribution Formats
'2EKF'= Editorial|Book|Retail Book, Illustrated Book|All E-Book Internet Distribution Formats
'2EKG'= Editorial|Book|Retail Book, Illustrated Guide|All E-Book Internet Distribution Formats
'2EKH'= Editorial|Book|Retail Book, Manual|All E-Book Internet Distribution Formats
'2EKJ'= Editorial|Book|Retail Book, Novelty Book|All E-Book Internet Distribution Formats
'2EKK'= Editorial|Book|Retail Book, Postcard Book|All E-Book Internet Distribution Formats
'2EKL'= Editorial|Book|Retail Book, Young Adult Book|All E-Book Internet Distribution Formats
'2EKM'= Editorial|Book|Retail Book, All Types|All E-Book Internet Distribution Formats
'2EKN'= Editorial|Book|Textbook, Compendium|All E-Book Internet Distribution Formats
'2EKP'= Editorial|Book|Textbook, Middle Reader|All E-Book Internet Distribution Formats
'2EKQ'= Editorial|Book|Textbook, Student Edition|All E-Book Internet Distribution Formats
'2EKR'= Editorial|Book|Textbook, All Types|All E-Book Internet Distribution Formats
'2EKS'= Editorial|Book|Textbook Ancillary Materials, Lab Manual|All E-Book Internet Distribution Formats
'2EKT'= Editorial|Book|Textbook Ancillary Materials, Teachers' Edition|All E-Book Internet Distribution Formats
'2EKU'= Editorial|Book|Textbook Ancillary Materials, Teacher's Manual|All E-Book Internet Distribution Formats
'2EKV'= Editorial|Book|Textbook Ancillary Materials, Workbook|All E-Book Internet Distribution Formats
'2EKW'= Editorial|Book|Artist's Reference, All Types|All E-Book Internet Distribution Formats
'2ELE'= Advertising|Display|Poster, Elevator Advertising|Printed
'2ELF'= Advertising|Marketing Materials|Catalog|Recordable Media
'2ELK'= Editorial|Book|Textbook Ancillary Materials, All Ancillary Types|Printed
'2ELL'= Advertising|Marketing Materials|Catalog|Internet Downloadable File
'2ELM'= Advertising|Book|Textbook, All Types|Printed
'2ELS'= Advertising|Marketing Materials|Catalog|Internet Email
'2EMA'= Advertising|Email|All Email Types|Internet Email
'2EMB'= Editorial|Book|Reference Book, Encyclopedia|E-Book in Internet Downloadable File
'2EMC'= Editorial|Book|Reference Book, Encyclopedia|All E-Book Internet Distribution Formats
'2EMD'= Editorial|Book|Reference Book, Encyclopedia|E-Book on Recordable Media
'2EMF'= Editorial|Book|Reference Book, Telephone Book|E-Book in Internet Website
'2EMG'= Editorial|Book|Reference Book, Telephone Book|E-Book in Internet Downloadable File
'2EMH'= Editorial|Book|Reference Book, Telephone Book|All E-Book Internet Distribution Formats
'2EMI'= Editorial|Book|Reference Book, Telephone Book|E-Book on Recordable Media
'2EMJ'= Editorial|Book|Reference Book, Telephone Book|All E-Book Distribution Formats
'2EMK'= Editorial|Book|Reference Book, All Types|E-Book in Internet Website
'2EML'= Editorial|Book|Reference Book, All Types|E-Book in Internet Downloadable File
'2EMM'= Editorial|Book|Reference Book, All Types|All E-Book Internet Distribution Formats
'2EMN'= Editorial|Book|Reference Book, All Types|E-Book on Recordable Media
'2EMP'= Editorial|Book|Reference Book, All Types|All E-Book Distribution Formats
'2EMQ'= Editorial|Book|Trade Book, All Types|E-Book in Internet Downloadable File
'2EMR'= Editorial|Book|Trade Book, All Types|E-Book in Internet Email
'2EMS'= Editorial|Book|Trade Book, All Types|All E-Book Internet Distribution Formats
'2EMT'= Editorial|Book|Trade Book, All Types|All E-Book Distribution Formats
'2EMU'= Editorial|Book|Textbook, Course Pack|Printed
'2EMV'= Editorial|Book|Artist's Reference, All Types|All E-Book Distribution Formats
'2END'= Advertising|Marketing Materials|Magalog|Internet Downloadable File
'2ENG'= Advertising|Marketing Materials|Coupon|Internet Email
'2ENS'= Advertising|Marketing Materials|Coupon|Recordable Media
'2EON'= Advertising|Marketing Materials|Magalog|Internet Email
'2EPA'= Editorial|Book|All Book Types|E-Book in Internet Website
'2EPB'= Editorial|Book|Retail Book, All Types|E-Book in Internet Website
'2EPC'= Editorial|Book|Retail Book, Children's Book|E-Book in Internet Website
'2EPD'= Editorial|Book|Retail Book, Concept Book|E-Book in Internet Website
'2EPE'= Editorial|Book|Retail Book, Directory|E-Book in Internet Website
'2EPF'= Editorial|Book|Retail Book, Handbook|E-Book in Internet Website
'2EPG'= Editorial|Book|Retail Book, Hi-lo Book|E-Book in Internet Website
'2EPH'= Editorial|Book|Retail Book, Illustrated Book|E-Book in Internet Website
'2EPJ'= Editorial|Book|Retail Book, Illustrated Guide|E-Book in Internet Website
'2EPK'= Editorial|Book|Retail Book, Manual|E-Book in Internet Website
'2EPL'= Editorial|Book|Retail Book, Novelty Book|E-Book in Internet Website
'2EPM'= Editorial|Book|Retail Book, Postcard Book|E-Book in Internet Website
'2EPN'= Editorial|Book|Retail Book, Young Adult Book|E-Book in Internet Website
'2EPP'= Editorial|Book|Textbook, All Types|E-Book in Internet Website
'2EPQ'= Editorial|Book|Textbook, Compendium|E-Book in Internet Website
'2EPR'= Editorial|Book|Textbook, Middle Reader|E-Book in Internet Website
'2EPS'= Editorial|Book|Textbook, Student Edition|E-Book in Internet Website
'2EPT'= Editorial|Book|Textbook Ancillary Materials, Teachers' Edition|E-Book in Internet Website
'2EPV'= Editorial|Book|Trade Book, All Types|E-Book in Internet Website
'2EPW'= Editorial|Book|Textbook Ancillary Materials, Teacher's Manual|E-Book in Internet Website
'2EPY'= Editorial|Book|Textbook Ancillary Materials, Workbook|E-Book in Internet Website
'2EPZ'= Editorial|Book|Textbook Ancillary Materials, Lab Manual|E-Book in Internet Website
'2ERA'= Editorial|Book|Trade Book, All Types|E-Book on Recordable Media
'2ERB'= Editorial|Book|Retail Book, Children's Book|E-Book on Recordable Media
'2ERC'= Editorial|Book|Retail Book, Concept Book|E-Book on Recordable Media
'2ERD'= Editorial|Book|Retail Book, Directory|E-Book on Recordable Media
'2ERF'= Editorial|Book|Retail Book, Handbook|E-Book on Recordable Media
'2ERG'= Editorial|Book|Retail Book, Hi-lo Book|E-Book on Recordable Media
'2ERH'= Editorial|Book|Retail Book, Illustrated Book|E-Book on Recordable Media
'2ERI'= Editorial|Book|Retail Book, Illustrated Guide|E-Book on Recordable Media
'2ERJ'= Editorial|Book|Retail Book, Manual|E-Book on Recordable Media
'2ERK'= Editorial|Book|Retail Book, Novelty Book|E-Book on Recordable Media
'2ERL'= Editorial|Book|Retail Book, Postcard Book|E-Book on Recordable Media
'2ERM'= Editorial|Book|Retail Book, Young Adult Book|E-Book on Recordable Media
'2ERN'= Editorial|Book|Retail Book, All Types|E-Book on Recordable Media
'2ERP'= Editorial|Book|Textbook, Compendium|E-Book on Recordable Media
'2ERQ'= Editorial|Book|Textbook, Middle Reader|E-Book on Recordable Media
'2ERS'= Editorial|Book|Textbook, Student Edition|E-Book on Recordable Media
'2ERT'= Editorial|Book|Textbook, All Types|E-Book on Recordable Media
'2ERU'= Editorial|Book|Textbook Ancillary Materials, Lab Manual|E-Book on Recordable Media
'2ERV'= Editorial|Book|Textbook Ancillary Materials, Teachers' Edition|E-Book on Recordable Media
'2ERW'= Editorial|Book|Textbook Ancillary Materials, Teacher's Manual|E-Book on Recordable Media
'2ERY'= Editorial|Book|Textbook Ancillary Materials, Workbook|E-Book on Recordable Media
'2ERZ'= Editorial|Book|All Book Types|E-Book on Recordable Media
'2ESS'= Advertising|Marketing Materials|Promotional Calendar, Multi-Page|Internet Downloadable File
'2ETA'= Advertising|Marketing Materials|Promotional Calendar, Multi-Page|Internet Email
'2EVE'= Products|Product Packaging|Retail Packaging, All Packaging Types|Printed
'2EWE'= Advertising|Marketing Materials|Promotional Calendar, One Page|All Electronic Distribution Formats
'2EYE'= Advertising|Live Presentation|Panel Presentation|Projected Display
'2FAB'= Internal Company Use|Website|Web Page, Content Body|Recordable Media
'2FAC'= Internal Company Use|Website|Web Page, Content Body|All Electronic Distribution Formats
'2FAD'= Advertising|Display|Poster, Movie Poster|Printed
'2FAH'= Internal Company Use|Website|Web Page, Design Element|Intranet and Extranet Website
'2FAI'= Internal Company Use|Website|Web Page, Design Element|Recordable Media
'2FAJ'= Internal Company Use|Website|Web Page, Design Element|All Electronic Distribution Formats
'2FAN'= Editorial|Periodicals|Newspaper, Tabloid|Printed
'2FAR'= Products|Merchandise|Retail Postcard|Printed
'2FAS'= Advertising|Marketing Materials|Promotional Calendar, One Page|Internet Downloadable File
'2FAT'= Advertising|Display|Poster, All Types|Printed
'2FAX'= Advertising|Marketing Materials|Magalog|Recordable Media
'2FAY'= Advertising|Marketing Materials|Promotional Calendar, One Page|Internet Email
'2FEA'= Motion Picture & TV|Motion Picture|Feature Film|Projected Display
'2FEH'= Advertising|Marketing Materials|Promotional E-card|Recordable Media
'2FEM'= Products|Merchandise|Textiles|Printed or Woven
'2FEN'= Advertising|Marketing Materials|Promotional E-card|Internet Downloadable File
'2FER'= Advertising|Display|Transit Advertising, Ferry Advertising|Printed
'2FET'= Advertising|Marketing Materials|Promotional E-card|Internet Email
'2FEU'= Advertising|Marketing Materials|Promotional E-card|All Internet Distribution Formats
'2FEZ'= Advertising|Merchandise|Apparel, General Apparel|Printed or Woven
'2FIB'= Products|Merchandise|Screen Saver|Internet Downloadable File
'2FID'= Advertising|Merchandise|Apparel, T-Shirts|Printed or Woven
'2FIE'= Advertising|Merchandise|Folder|Printed
'2FIG'= Advertising|Marketing Materials|Catalog|Printed
'2FIL'= Motion Picture & TV|Motion Picture|Feature Film|All Electronic Distribution Formats
'2FIN'= Advertising|Point of Purchase|Kiosk, All Types|Printed
'2FIR'= Advertising|Periodicals|All Periodical Types|Recordable Media
'2FIT'= Motion Picture & TV|Motion Picture|Short Film|All Electronic Distribution Formats
'2FIX'= Motion Picture & TV|Motion Picture|All Motion Picture Types|Projected Display
'2FIZ'= Advertising|Periodicals|All Periodical Types|Internet Website
'2FLU'= Advertising|Periodicals|All Periodical Types|All Electronic Distribution Formats
'2FLY'= Advertising|Marketing Materials|Flyer|Printed
'2FOB'= Advertising|Periodicals|All Periodical Types|All Internet Distribution Formats
'2FOE'= Internal Company Use|Periodicals|Magazine, Custom Published|Internet Email
'2FOG'= Advertising|Display|Store Display, All Display Types|Printed
'2FOH'= Advertising|Periodicals|Annual Report|Internet Downloadable File
'2FOL'= Products|Merchandise|Folder|Printed
'2FON'= Advertising|Periodicals|Annual Report|Internet Website
'2FOP'= Advertising|Periodicals|Annual Report|Internet Email
'2FOU'= Advertising|Periodicals|Annual Report|All Electronic Distribution Formats
'2FOX'= Editorial|Book|Textbook, All Types|Printed
'2FOY'= Advertising|Periodicals|Annual Report|All Internet Distribution Formats
'2FPO'= Internal Company Use|Comp Use|All Comp Types|All Electronic Distribution Formats
'2FRA'= Products|Product Packaging|Picture Frame Insert|Printed
'2FRO'= Internal Company Use|Comp Use|All Comp Types|Printed
'2FRY'= Motion Picture & TV|Motion Picture|Prop|Recordable Media
'2FUB'= Advertising|Periodicals|Belly Band|Printed
'2FUD'= Advertising|Periodicals|Cover Wrap|Printed
'2FUN'= Products|Merchandise|Playing Cards|Printed
'2FUR'= Advertising|Live Presentation|Sales Presentation|Projected Display
'2GAB'= Products|Merchandise|Game, Computer Game|Internet Downloadable File
'2GAD'= Products|Merchandise|Game, All Types|All Internet Distribution Formats
'2GAE'= Products|Merchandise|Game, Computer Game|All Internet Distribution Formats
'2GAG'= Products|Merchandise|Game, Computer Game|Recordable Media
'2GAH'= Products|Merchandise|Game, Computer Game|Internet Email
'2GAL'= Editorial|Display|Gallery Exhibition|Printed
'2GAM'= Products|Merchandise|Game, All Types|All Electronic Distribution Formats
'2GAN'= Products|Merchandise|Game, Computer Game|All Electronic Distribution Formats
'2GAP'= Products|Merchandise|Game, All Types|Printed
'2GAR'= Products|Merchandise|Game, All Types|Recordable Media
'2GAS'= Products|Merchandise|Game, All Types|Internet Email
'2GAT'= Products|Merchandise|Game, All Types|Internet Downloadable File
'2GBM'= Editorial|Book|Textbook, Course Pack|Internet Downloadable File
'2GBN'= Editorial|Book|Textbook, Course Pack|Internet Website
'2GBP'= Editorial|Book|Textbook, Course Pack|All Distribution Formats
'2GBQ'= Editorial|Book|Textbook, Course Pack|All Internet Distribution Formats
'2GBW'= Editorial|Book|Textbook Ancillary Materials, All Ancillary Types|All Distribution Formats
'2GBY'= Editorial|Book|Textbook Ancillary Materials, All Ancillary Types|All Internet Distribution Formats
'2GBZ'= Editorial|Book|Textbook Ancillary Materials, Educational Film Set|Projected Display
'2GDJ'= Editorial|Display|Gallery Exhibition|Electronic Display
'2GDK'= Editorial|Display|Museum Display|Electronic Display
'2GDM'= Editorial|Periodicals|Magazine, All Types|Internet Downloadable File
'2GDP'= Editorial|Periodicals|Magazine, All Types|Internet Website
'2GDQ'= Editorial|Periodicals|Magazine, All Types|Internet Email
'2GDR'= Editorial|Periodicals|Magazine, All Types|Recordable Media
'2GDS'= Editorial|Periodicals|Magazine, All Types|All Electronic Distribution Formats
'2GDT'= Editorial|Periodicals|Magazine, All Types|All Internet Distribution Formats
'2GDV'= Editorial|Periodicals|Magazine, Consumer|Recordable Media
'2GDW'= Editorial|Periodicals|Magazine, Consumer|Internet Website
'2GDY'= Editorial|Periodicals|Magazine, Consumer|Internet Downloadable File
'2GDZ'= Editorial|Periodicals|Magazine, Consumer|All Electronic Distribution Formats
'2GEA'= Editorial|Periodicals|Magazine, Consumer|All Internet Distribution Formats
'2GEC'= Editorial|Periodicals|Magazine, Custom Published|Recordable Media
'2GED'= Internal Company Use|Internal Review|All Review Types|Printed
'2GEE'= Editorial|Book|Textbook Ancillary Materials, Workbook|Printed
'2GEF'= Editorial|Periodicals|Magazine, Custom Published|Internet Website
'2GEG'= Editorial|Periodicals|Magazine, Custom Published|Internet Downloadable File
'2GEH'= Editorial|Periodicals|Magazine, Custom Published|All Electronic Distribution Formats
'2GEI'= Editorial|Periodicals|Magazine, Custom Published|All Internet Distribution Formats
'2GEK'= Editorial|Periodicals|Magazine, Education|Recordable Media
'2GEL'= Products|Merchandise|Screen Saver|Internet Email
'2GEM'= Editorial|Periodicals|Magazine, Consumer|Printed
'2GEN'= Advertising|Periodicals|Magazine, Consumer|Internet Downloadable File
'2GEP'= Editorial|Periodicals|Magazine, Education|Internet Website
'2GEQ'= Editorial|Periodicals|Magazine, Education|Internet Downloadable File
'2GER'= Editorial|Periodicals|Magazine, Education|All Electronic Distribution Formats
'2GES'= Editorial|Periodicals|Magazine, Education|All Internet Distribution Formats
'2GEV'= Editorial|Periodicals|Magazine, Partworks|Internet Website
'2GEW'= Editorial|Periodicals|Magazine, Partworks|Internet Downloadable File
'2GEY'= Advertising|Periodicals|Magazine, Consumer|All Electronic Distribution Formats
'2GEZ'= Editorial|Periodicals|Magazine, Partworks|Recordable Media
'2GFA'= Editorial|Periodicals|Magazine, Partworks|All Electronic Distribution Formats
'2GFB'= Editorial|Periodicals|Magazine, Partworks|All Internet Distribution Formats
'2GFD'= Editorial|Periodicals|Magazine, Trade|Recordable Media
'2GFG'= Editorial|Periodicals|Newsletter|Recordable Media
'2GFH'= Editorial|Periodicals|Newsletter|Internet Website
'2GFI'= Editorial|Periodicals|Newsletter|Internet Downloadable File
'2GFJ'= Editorial|Periodicals|Newsletter|All Electronic Distribution Formats
'2GFK'= Editorial|Periodicals|Newsletter|All Internet Distribution Formats
'2GFM'= Editorial|Periodicals|Newspaper, All Types|Recordable Media
'2GFN'= Editorial|Periodicals|Newspaper, All Types|Internet Website
'2GFP'= Editorial|Periodicals|Newspaper, All Types|Internet Downloadable File
'2GFQ'= Editorial|Periodicals|Newspaper, All Types|All Electronic Distribution Formats
'2GFR'= Editorial|Periodicals|Newspaper, All Types|All Internet Distribution Formats
'2GFS'= Editorial|Periodicals|Newspaper, Weekly Supplement|Recordable Media
'2GFT'= Products|Merchandise|Card, Gift Card|Printed
'2GFU'= Editorial|Periodicals|Newspaper, Weekly Supplement|All Electronic Distribution Formats
'2GFV'= Editorial|Periodicals|Newspaper, Weekly Supplement|All Internet Distribution Formats
'2GFW'= Editorial|Periodicals|Newspaper, Weekly Supplement|Internet Website
'2GFY'= Editorial|Periodicals|Newspaper, Weekly Supplement|Internet Downloadable File
'2GGA'= Editorial|Periodicals|Newspaper, Tabloid|Internet Downloadable File
'2GGD'= Editorial|Periodicals|Scholarly Journal|Recordable Media
'2GGF'= Editorial|Periodicals|Scholarly Journal|Internet Website
'2GGG'= Editorial|Periodicals|Scholarly Journal|Internet Downloadable File
'2GGH'= Editorial|Periodicals|Scholarly Journal|All Electronic Distribution Formats
'2GGI'= Editorial|Periodicals|Scholarly Journal|All Internet Distribution Formats
'2GGM'= Editorial|Merchandise|CD ROM|Recordable Media
'2GHA'= Editorial|Website|Webcast, All Types|Internet Website
'2GHB'= Editorial|Website|Web Page, All Types|Internet Website
'2GHC'= Editorial|Website|Web Page, All Types|Recordable Media
'2GHD'= Editorial|Website|Web Page, All Types|All Electronic Distribution Formats
'2GHF'= Editorial|Website|Web Page, All Types|All Internet Distribution Formats
'2GHG'= Editorial|Website|Web Page, Body Content|Internet Website
'2GHH'= Editorial|Website|Web Page, Body Content|Recordable Media
'2GHI'= Advertising|Periodicals|Magazine, Consumer|Recordable Media
'2GHJ'= Editorial|Website|Web Page, Body Content|All Electronic Distribution Formats
'2GHK'= Editorial|Website|Web Page, Body Content|All Internet Distribution Formats
'2GIB'= Advertising|Periodicals|Magazine, Consumer|All Internet Distribution Formats
'2GID'= Internal Company Use|Internal Review|All Review Types|All Electronic Distribution Formats
'2GIE'= Advertising|Periodicals|Magazine, Corporate|Internet Downloadable File
'2GIF'= Products|Merchandise|Gift Certificate|Printed
'2GIG'= Products|Merchandise|Datebook|Printed
'2GIN'= Advertising|Periodicals|Magazine, Corporate|Internet Website
'2GIP'= Advertising|Periodicals|Magazine, Corporate|Recordable Media
'2GIT'= Advertising|Periodicals|Magazine, Corporate|All Electronic Distribution Formats
'2GNU'= Advertising|Periodicals|Magazine, Corporate|All Internet Distribution Formats
'2GOA'= Internal Company Use|Promotional Materials|Corporate Brochure|Printed
'2GOB'= Advertising|Periodicals|Magazine, Advertorial|All Internet Distribution Formats
'2GOO'= Advertising|Periodicals|Magazine, All Types|Recordable Media
'2GOR'= Advertising|Periodicals|Magazine, Custom Published|Internet Website
'2GOS'= Advertising|Periodicals|Magazine, Custom Published|Internet Downloadable File
'2GOX'= Advertising|Periodicals|Magazine, Custom Published|All Internet Distribution Formats
'2GOY'= Internal Company Use|Art|Art Display, All Art Types|Printed
'2GRE'= Products|Merchandise|Card, Greeting Card|Printed
'2GUL'= Advertising|Periodicals|Magazine, Education|Internet Downloadable File
'2GUM'= Advertising|Periodicals|Magazine, Education|Internet Website
'2GUN'= Advertising|Point of Purchase|Kiosk, Interactive Kiosk|Electronic Display
'2GUT'= Advertising|Marketing Materials|Promotional Calendar, One Page|Recordable Media
'2GUV'= Advertising|Periodicals|Magazine, Education|Recordable Media
'2GUY'= Advertising|Periodicals|Magazine, Education|All Electronic Distribution Formats
'2GYM'= Advertising|Point of Purchase|Kiosk, Interactive Kiosk|Printed
'2GYP'= Advertising|Periodicals|Magazine, Education|All Internet Distribution Formats
'2HAD'= Advertising|Marketing Materials|Promotional Calendar, Multi-Page|Recordable Media
'2HAE'= Advertising|Periodicals|Magazine, Trade|Internet Downloadable File
'2HAG'= Advertising|Periodicals|Magazine, Trade|Internet Website
'2HAH'= Advertising|Periodicals|Magazine, Trade|All Electronic Distribution Formats
'2HAJ'= Advertising|Periodicals|Magazine, Trade|All Internet Distribution Formats
'2HAM'= Advertising|Marketing Materials|All Marketing Material Types|Internet Downloadable File
'2HAN'= Editorial|Book|Retail Book, Handbook|Printed
'2HAO'= Internal Company Use|Art|Art Display, All Art Types|Electronic Display
'2HAP'= Advertising|Periodicals|Magazine Reprints, All Types|Internet Downloadable File
'2HAS'= Advertising|Periodicals|Magazine Reprints, All Types|Internet Website
'2HAT'= Advertising|Periodicals|Magazine, Trade|Printed
'2HAW'= Advertising|Periodicals|Magazine Reprints, All Types|Recordable Media
'2HAY'= Advertising|Periodicals|Magazine Reprints, All Types|All Electronic Distribution Formats
'2HEH'= Advertising|Periodicals|Magazine Reprints, All Types|All Internet Distribution Formats
'2HEM'= Advertising|Display|Billboard, Bulletin|Printed
'2HEN'= Advertising|Periodicals|Newsletter, All Types|All Electronic Distribution Formats
'2HEP'= Advertising|Periodicals|Newsletter, All Types|Internet Downloadable File
'2HER'= Products|Merchandise|Card, Hero Card|Printed
'2HES'= Advertising|Periodicals|Newsletter, All Types|Internet Website
'2HET'= Advertising|Periodicals|Newsletter, All Types|Recordable Media
'2HEW'= Advertising|Periodicals|Newsletter, All Types|All Internet Distribution Formats
'2HEX'= Products|Merchandise|Screen Saver|All Electronic Distribution Formats
'2HEY'= Advertising|Periodicals|Newspaper, All Types|All Electronic Distribution Formats
'2HIC'= Advertising|Periodicals|Newspaper, All Types|All Internet Distribution Formats
'2HID'= Advertising|Periodicals|Newspaper, All Types|Internet Website
'2HIE'= Advertising|Periodicals|Newspaper, All Types|Internet Downloadable File
'2HIL'= Editorial|Book|Retail Book, Hi-lo Book|Printed
'2HIM'= Advertising|Periodicals|Newspaper, All Types|Recordable Media
'2HIP'= Advertising|Periodicals|Free Standing Insert, Advertorial Insert|Printed
'2HIS'= Advertising|Periodicals|Newspaper, Weekly Supplement|All Electronic Distribution Formats
'2HIT'= Motion Picture & TV|Motion Picture|Prop|All Internet Distribution Formats
'2HMM'= Advertising|Periodicals|Newspaper, Weekly Supplement|All Internet Distribution Formats
'2HOB'= Advertising|Periodicals|Newspaper, Weekly Supplement|Internet Website
'2HOD'= Advertising|Periodicals|Newspaper, Weekly Supplement|Internet Downloadable File
'2HOE'= Advertising|Periodicals|Newspaper, Weekly Supplement|Recordable Media
'2HOG'= Advertising|Book|All Book Types|Printed
'2HON'= Advertising|Display|Poster, Movie Poster|Electronic Display
'2HOP'= Motion Picture & TV|Motion Picture|Prop|Projected Display
'2HOT'= Advertising|Display|Terminal Advertising, Airport Display|Printed
'2HOW'= Advertising|Periodicals|Newspaper, Tabloid|All Electronic Distribution Formats
'2HOY'= Advertising|Periodicals|Newspaper, Tabloid|Internet Website
'2HUB'= Products|Merchandise|Double Postcard|Printed
'2HUE'= Advertising|Periodicals|Newspaper, Tabloid|Recordable Media
'2HUG'= Motion Picture & TV|Motion Picture|Set Decor|Recordable Media
'2HUH'= Advertising|Periodicals|Newspaper, Tabloid|All Internet Distribution Formats
'2HUM'= Motion Picture & TV|Motion Picture|Set Decor|All Electronic Distribution Formats
'2HUP'= Advertising|Periodicals|Quarterly Report|Internet Downloadable File
'2HUT'= Advertising|Periodicals|Quarterly Report|Internet Website
'2HYP'= Advertising|Periodicals|Quarterly Report|Recordable Media
'2JAB'= Motion Picture & TV|Motion Picture|Set Decor|All Internet Distribution Formats
'2JAG'= Advertising|Periodicals|Quarterly Report|All Electronic Distribution Formats
'2JAM'= Advertising|Marketing Materials|All Marketing Material Types|Printed
'2JAR'= Advertising|Periodicals|Magazine, Corporate|Printed
'2JAW'= Advertising|Live Presentation|Stage Performance|Projected Display
'2JAY'= Advertising|Periodicals|Newsletter, All Types|Printed
'2JEE'= Advertising|Periodicals|Quarterly Report|All Internet Distribution Formats
'2JET'= Editorial|Periodicals|Newspaper, All Types|Printed
'2JIB'= Advertising|Marketing Materials|Public Relations, All Types|Printed
'2JIG'= Products|Merchandise|Jigsaw Puzzle|Printed
'2JIL'= Products|Merchandise|Jigsaw Puzzle|Recordable Media
'2JIN'= Products|Merchandise|Jigsaw Puzzle|Internet Downloadable File
'2JOB'= Advertising|Marketing Materials|Public Relations, Press Kit|Recordable Media
'2JOE'= Advertising|Marketing Materials|Public Relations, Press Kit|All Electronic Distribution Formats
'2JOG'= Motion Picture & TV|Motion Picture|Documentary Film|Projected Display
'2JOT'= Motion Picture & TV|Motion Picture|In Theater Commercial|Projected Display
'2JOU'= Advertising|Display|Terminal Advertising, Airport Display|Electronic Display
'2JOW'= Advertising|Marketing Materials|Public Relations, Press Kit|All Internet Distribution Formats
'2JOY'= Advertising|Display|Terminal Advertising, All Types|Printed
'2JRN'= Products|Merchandise|Journal|Printed
'2JUG'= Advertising|Point of Purchase|Kiosk, Telephone Kiosk|Printed
'2JUN'= Advertising|Marketing Materials|Public Relations, Press Kit|Internet Downloadable File
'2JUS'= Advertising|Marketing Materials|Public Relations, Press Kit|Internet Email
'2JUT'= Advertising|Marketing Materials|Public Relations, Press Kit|Internet Website
'2JWL'= Advertising|Website|Web Page, Web Interstitial Ad|Internet Website
'2KAB'= Advertising|Marketing Materials|Public Relations, Press Kit|Television Broadcast
'2KAF'= Advertising|Marketing Materials|Public Relations, Press Kit|Printed
'2KAS'= Advertising|Marketing Materials|Public Relations, Press Release|Recordable Media
'2KAT'= Advertising|Marketing Materials|Public Relations, Press Release|Internet Downloadable File
'2KAY'= Advertising|Marketing Materials|Public Relations, Press Release|Internet Email
'2KEA'= Advertising|Marketing Materials|Public Relations, Press Release|Internet Website
'2KEF'= Advertising|Marketing Materials|Public Relations, Press Release|Television Broadcast
'2KEG'= Advertising|Periodicals|Newspaper, Weekly Supplement|Printed
'2KEN'= Advertising|Periodicals|Newspaper, Tabloid|Printed
'2KEP'= Products|Merchandise|Souvenir|Printed
'2KEX'= Advertising|Marketing Materials|Public Relations, Press Release|Printed
'2KID'= Advertising|Marketing Materials|Public Relations, Press Release|All Electronic Distribution Formats
'2KIN'= Editorial|Periodicals|Magazine, Consumer|Internet Email
'2KIO'= Advertising|Point of Purchase|Kiosk, All Types|Electronic Display
'2KIP'= Advertising|Periodicals|Program Advertising|Printed
'2KIT'= Personal Use|Art|Art Display, All Art Types|Printed
'2KOA'= Motion Picture & TV|Television Programming|Artist's Reference, All Types|Projected Display
'2KOB'= Motion Picture & TV|Television Programming|Artist's Reference, All Types|Internet Downloadable File
'2KOI'= Motion Picture & TV|Television Programming|Artist's Reference, All Types|All Internet Distribution Formats
'2KOP'= Motion Picture & TV|Television Programming|Artist's Reference, All Types|Recordable Media
'2KOR'= Motion Picture & TV|Television Programming|Artist's Reference, All Types|All Electronic Distribution Formats
'2KOS'= Motion Picture & TV|Television Programming|Artist's Reference, All Types|Television Broadcast
'2KUE'= Advertising|Website|Web Page, All Types|All Internet Distribution Formats
'2MAB'= Products|Merchandise|Map|All Electronic Distribution Formats
'2MAC'= Advertising|Website|Web Page, All Types|Recordable Media
'2MAD'= Products|Merchandise|Map|Internet Downloadable File
'2MAE'= Advertising|Website|Web Page, All Types|All Electronic Distribution Formats
'2MAG'= Editorial|Periodicals|Magazine, All Types|Printed
'2MAN'= Editorial|Book|Retail Book, Manual|Printed
'2MAP'= Products|Merchandise|Map|Printed
'2MAR'= Advertising|Website|Web Page, Design Element|Internet Website
'2MAS'= Advertising|Website|Web Page, Design Element|Recordable Media
'2MAT'= Products|Merchandise|Placemat|Printed
'2MAW'= Advertising|Website|Web Page, Design Element|All Electronic Distribution Formats
'2MAX'= Advertising|Website|Web Page, Design Element|All Internet Distribution Formats
'2MAY'= Editorial|Periodicals|Magazine, Education|Printed
'2MCH'= Products|Merchandise|Other Merchandise|Printed
'2MED'= Advertising|Website|Web Page, Web Banner Ad|Internet Website
'2MEG'= Advertising|Website|Web Page, Web Banner Ad|Recordable Media
'2MEL'= Editorial|Periodicals|Magazine, Partworks|Printed
'2MEM'= Advertising|Website|Web Page, Web Banner Ad|All Electronic Distribution Formats
'2MEN'= Advertising|Point of Purchase|Menu|Printed
'2MER'= Products|Merchandise|All Merchandise Types|Printed
'2MET'= Products|Merchandise|Map|Internet Email
'2MEW'= Advertising|Website|Web Page, Web Banner Ad|All Internet Distribution Formats
'2MIB'= Advertising|Website|Web Page, Web Interstitial Ad|Recordable Media
'2MID'= Advertising|Website|Web Page, Web Interstitial Ad|All Electronic Distribution Formats
'2MIG'= Advertising|Website|Web Page, Web Interstitial Ad|All Internet Distribution Formats
'2MIL'= Advertising|Website|Webcast, All Types|Internet Website
'2MIM'= Products|Merchandise|Map|All Internet Distribution Formats
'2MIR'= Products|Merchandise|Map|Recordable Media
'2MIX'= Motion Picture & TV|Motion Picture|Artist's Reference, All Types|Recordable Media
'2MMA'= Advertising|Marketing Materials|Bill Insert|Printed
'2MMB'= Advertising|Marketing Materials|Blow In Card|Printed
'2MMC'= Advertising|Marketing Materials|Bound-in Insert|Printed
'2MMD'= Advertising|Marketing Materials|Broadside|Printed
'2MME'= Advertising|Marketing Materials|Buckslip|Printed
'2MMF'= Advertising|Marketing Materials|Business Card|Printed
'2MMG'= Advertising|Marketing Materials|Business Envelope|Printed
'2MMI'= Advertising|Marketing Materials|Business Invitation|Printed
'2MMJ'= Advertising|Marketing Materials|Business Reply Card|Printed
'2MMK'= Advertising|Marketing Materials|Business Reply Envelope|Printed
'2MML'= Advertising|Marketing Materials|Business Stationery|Printed
'2MMM'= Advertising|Marketing Materials|Compliment Slip|Printed
'2MMN'= Advertising|Marketing Materials|Coupon|Printed
'2MMP'= Advertising|Marketing Materials|Coupon Packs|Printed
'2MMQ'= Advertising|Marketing Materials|Flyaway Card|Printed
'2MMR'= Advertising|Marketing Materials|Leaflet|Printed
'2MMS'= Advertising|Marketing Materials|Magalog|Printed
'2MMT'= Advertising|Marketing Materials|One Sheet|Printed
'2MMU'= Advertising|Marketing Materials|Onsert|Printed
'2MMV'= Advertising|Marketing Materials|Polybag|Printed
'2MMW'= Advertising|Marketing Materials|Promotional Calendar, One Page|Printed
'2MMX'= Advertising|Marketing Materials|Promotional Envelope|Printed
'2MMY'= Advertising|Marketing Materials|Sales Kit|Printed
'2MMZ'= Advertising|Marketing Materials|Self Mailer|Printed
'2MOB'= Advertising|Display|Store Display, In-Store Poster|Printed
'2MOG'= Editorial|Book|All Book Types|Printed
'2MOM'= Editorial|Periodicals|Magazine, Trade|Printed
'2MOO'= Advertising|Periodicals|Magazine, All Types|Printed
'2MOP'= Editorial|Periodicals|Magazine, Custom Published|Printed
'2MOR'= Editorial|Book|Artist's Reference, All Types|Printed
'2MOU'= Products|Merchandise|Mouse Pad|Printed
'2MOV'= Motion Picture & TV|Motion Picture|All Motion Picture Types|Recordable Media
'2MOW'= Editorial|Periodicals|Magazine, Trade|Internet Website
'2MPA'= Motion Picture & TV|Motion Picture|All Motion Picture Types|Television Broadcast
'2MPB'= Motion Picture & TV|Music Video|All Music Video Types|Television Broadcast
'2MPC'= Motion Picture & TV|Motion Picture|Artist's Reference, All Types|Television Broadcast
'2MPD'= Motion Picture & TV|Motion Picture|Documentary Film|Television Broadcast
'2MPE'= Motion Picture & TV|Motion Picture|Feature Film|Television Broadcast
'2MPF'= Motion Picture & TV|Motion Picture|Movie Trailer|Television Broadcast
'2MPG'= Motion Picture & TV|Motion Picture|Prop|Television Broadcast
'2MPH'= Motion Picture & TV|Motion Picture|Set Decor|Television Broadcast
'2MPI'= Motion Picture & TV|Motion Picture|Short Film|Television Broadcast
'2MPJ'= Motion Picture & TV|Motion Picture|All Motion Picture Types|Internet Downloadable File
'2MPK'= Motion Picture & TV|Music Video|All Music Video Types|Internet Downloadable File
'2MPL'= Motion Picture & TV|Motion Picture|Artist's Reference, All Types|Internet Downloadable File
'2MPM'= Motion Picture & TV|Motion Picture|Documentary Film|Internet Downloadable File
'2MPN'= Motion Picture & TV|Motion Picture|Feature Film|Internet Downloadable File
'2MPP'= Motion Picture & TV|Motion Picture|Movie Trailer|Internet Downloadable File
'2MPQ'= Motion Picture & TV|Motion Picture|Prop|Internet Downloadable File
'2MPR'= Motion Picture & TV|Motion Picture|Set Decor|Internet Downloadable File
'2MPS'= Motion Picture & TV|Motion Picture|Short Film|Internet Downloadable File
'2MRP'= Products|Merchandise|Plates|Printed
'2MUG'= Products|Merchandise|Mugs|Printed
'2MUS'= Editorial|Display|Museum Display|Printed
'2MUT'= Editorial|Periodicals|Magazine, Trade|Internet Downloadable File
'2NAB'= Editorial|Periodicals|Magazine, Trade|Internet Email
'2NAG'= Editorial|Periodicals|Magazine, Trade|All Internet Distribution Formats
'2NAH'= Editorial|Book|Reference Book, Encyclopedia|All Electronic Distribution Formats
'2NAP'= Motion Picture & TV|Motion Picture|Artist's Reference, All Types|All Electronic Distribution Formats
'2NAY'= Editorial|Book|Reference Book, Encyclopedia|Printed
'2NEL'= Editorial|Periodicals|Newsletter|Internet Email
'2NET'= Internal Company Use|Website|Web Page, All Types|Intranet and Extranet Website
'2NEW'= Advertising|Periodicals|Newspaper, All Types|Printed
'2NIP'= Editorial|Book|Reference Book, Telephone Book|Printed
'2NOB'= Editorial|Periodicals|Magazine, Trade|All Electronic Distribution Formats
'2NOD'= Motion Picture & TV|Motion Picture|Artist's Reference, All Types|All Internet Distribution Formats
'2NOV'= Products|Merchandise|Novelty Products|Printed
'2NOW'= Editorial|Periodicals|Magazine, Education|Internet Email
'2NUN'= Editorial|Periodicals|Magazine, Custom Published|Internet Email
'2NUT'= Advertising|Marketing Materials|Promotional Postcard|Printed
'2TAB'= Editorial|Periodicals|Magazine, Partworks|Internet Email
'2TAD'= Editorial|Periodicals|Scholarly Journal|Internet Email
'2TAE'= Editorial|Book|Retail Book, Coffee Table Book|Printed
'2TAG'= Advertising|Point of Purchase|Hang Tag|Printed
'2TAJ'= Editorial|Periodicals|Newspaper, All Types|Internet Email
'2TAL'= Advertising|Point of Purchase|Shelf Talker|Printed
'2TAN'= Advertising|Display|Terminal Advertising, Shelter Advertising|Printed
'2TAO'= Editorial|Periodicals|Newspaper, Weekly Supplement|Internet Email
'2TAP'= Motion Picture & TV|Motion Picture|Artist's Reference, All Types|Projected Display
'2TAT'= Personal Use|Art|Artist's Reference, Tattoo|Printed
'2TAV'= Editorial|Book|Retail Book, Concept Book|Printed
'2TAX'= Advertising|Display|Transit Advertising, Taxi Advertising|Printed
'2TEA'= Motion Picture & TV|Television Programming|All Television Advertising Types|Internet Downloadable File
'2TEB'= Motion Picture & TV|Television Programming|Commercial|Internet Downloadable File
'2TEC'= Motion Picture & TV|Television Programming|Commercial|All Internet Distribution Formats
'2TED'= Motion Picture & TV|Television Programming|All Television Advertising Types|Recordable Media
'2TEE'= Motion Picture & TV|Television Programming|All Editorial Television Types|Television Broadcast
'2TEF'= Motion Picture & TV|Television Programming|News Program, Flash|Television Broadcast
'2TEG'= Motion Picture & TV|Television Programming|Commercial|Recordable Media
'2TEH'= Motion Picture & TV|Television Programming|Infomercial|Internet Downloadable File
'2TEJ'= Motion Picture & TV|Television Programming|Infomercial|All Internet Distribution Formats
'2TEK'= Motion Picture & TV|Television Programming|Infomercial|Recordable Media
'2TEL'= Motion Picture & TV|Television Programming|On-Air Promotion|Internet Downloadable File
'2TEM'= Motion Picture & TV|Television Programming|On-Air Promotion|All Internet Distribution Formats
'2TEP'= Motion Picture & TV|Television Programming|On-Air Promotion|Recordable Media
'2TEQ'= Motion Picture & TV|Television Programming|All Television Advertising Types|All Internet Distribution Formats
'2TER'= Motion Picture & TV|Television Programming|Documentary Program|Internet Downloadable File
'2TES'= Motion Picture & TV|Television Programming|Documentary Program|All Internet Distribution Formats
'2TET'= Motion Picture & TV|Television Programming|Documentary Program|Recordable Media
'2TEU'= Motion Picture & TV|Television Programming|Educational Program|Internet Downloadable File
'2TEV'= Motion Picture & TV|Television Programming|Educational Program|All Internet Distribution Formats
'2TEW'= Motion Picture & TV|Television Programming|Educational Program|Recordable Media
'2TEX'= Editorial|Periodicals|Newspaper, Tabloid|Internet Website
'2TEY'= Motion Picture & TV|Television Programming|Entertainment Program|Internet Downloadable File
'2TEZ'= Motion Picture & TV|Television Programming|Entertainment Program|All Internet Distribution Formats
'2TIC'= Products|Merchandise|Sticker|Printed
'2TIE'= Editorial|Periodicals|Newspaper, Tabloid|Recordable Media
'2TIN'= Advertising|Point of Purchase|Slip Case|Printed
'2TIP'= Editorial|Periodicals|Newspaper, Tabloid|Internet Email
'2TKT'= Products|Merchandise|Ticket|Printed
'2TLA'= Motion Picture & TV|Television Programming|Entertainment Program|Recordable Media
'2TLB'= Motion Picture & TV|Television Programming|Made For TV Movie|All Internet Distribution Formats
'2TLC'= Motion Picture & TV|Television Programming|Made For TV Movie|Internet Downloadable File
'2TLD'= Motion Picture & TV|Television Programming|Made For TV Movie|Recordable Media
'2TLE'= Motion Picture & TV|Television Programming|News Program|Internet Downloadable File
'2TLF'= Motion Picture & TV|Television Programming|News Program|All Internet Distribution Formats
'2TLG'= Motion Picture & TV|Television Programming|News Program|Recordable Media
'2TLH'= Motion Picture & TV|Television Programming|Non Broadcast Pilot|Recordable Media
'2TLJ'= Motion Picture & TV|Television Programming|Non Broadcast Pilot|Projected Display
'2TLK'= Motion Picture & TV|Television Programming|Non-Profit Program|Internet Downloadable File
'2TLL'= Motion Picture & TV|Television Programming|Non-Profit Program|All Internet Distribution Formats
'2TLM'= Motion Picture & TV|Television Programming|Non-Profit Program|Recordable Media
'2TLN'= Motion Picture & TV|Television Programming|Prop|Internet Downloadable File
'2TLP'= Motion Picture & TV|Television Programming|Prop|All Internet Distribution Formats
'2TLQ'= Motion Picture & TV|Television Programming|Prop|Recordable Media
'2TLR'= Motion Picture & TV|Television Programming|Prop|Television Broadcast
'2TLS'= Motion Picture & TV|Television Programming|Set Decor|Internet Downloadable File
'2TLT'= Motion Picture & TV|Television Programming|Set Decor|All Internet Distribution Formats
'2TLU'= Motion Picture & TV|Television Programming|Set Decor|Recordable Media
'2TLV'= Motion Picture & TV|Television Programming|Set Decor|Television Broadcast
'2TLW'= Motion Picture & TV|Television Programming|All Editorial Television Types|Internet Downloadable File
'2TLY'= Motion Picture & TV|Television Programming|All Editorial Television Types|All Internet Distribution Formats
'2TLZ'= Motion Picture & TV|Television Programming|All Editorial Television Types|Recordable Media
'2TOD'= Products|Merchandise|Screen Saver|All Internet Distribution Formats
'2TOE'= Advertising|Live Presentation|Trade Show Presentation|Projected Display
'2TOM'= Editorial|Periodicals|Newsletter|Printed
'2TON'= Editorial|Periodicals|Newspaper, Tabloid|All Internet Distribution Formats
'2TOP'= Products|Merchandise|Poster, Retail Poster|Printed
'2TOT'= Editorial|Periodicals|Newspaper, Tabloid|All Electronic Distribution Formats
'2TOY'= Products|Merchandise|Toy|Printed
'2TRA'= Advertising|Display|Transit Advertising, All Types|Printed
'2TRB'= Advertising|Display|Transit Advertising, All Types|Electronic Display
'2TRC'= Advertising|Display|Transit Advertising, Bus Panel|Electronic Display
'2TRD'= Products|Merchandise|Trading Cards|Printed
'2TRE'= Advertising|Display|Transit Advertising, Bus Poster|Printed
'2TRF'= Advertising|Display|Transit Advertising, Bus Rear Display|Electronic Display
'2TRG'= Advertising|Display|Transit Advertising, Bus Rear Display|Printed
'2TRH'= Advertising|Display|Transit Advertising, Ferry Advertising|Electronic Display
'2TRI'= Advertising|Display|Transit Advertising, Subway Advertising|Electronic Display
'2TRJ'= Advertising|Display|Transit Advertising, Subway Advertising|Printed
'2TRK'= Advertising|Display|Transit Advertising, Train Advertising|Electronic Display
'2TRL'= Advertising|Display|Transit Advertising, Train Advertising|Printed
'2TRM'= Advertising|Display|Transit Advertising, Bus Wrap|Electronic Display
'2TRN'= Advertising|Display|Transit Advertising, Bus Wrap|Printed
'2TRQ'= Advertising|Display|Transit Advertising, Commercial Vehicles|Printed
'2TRR'= Advertising|Display|Transit Advertising, Commercial Vehicles|Electronic Display
'2TRY'= Motion Picture & TV|Motion Picture|Documentary Film|Recordable Media
'2TST'= Products|Merchandise|Apparel, T-Shirts|Printed or Woven
'2TUA'= Products|Merchandise|Virtual Reality|Recordable Media
'2TUB'= Editorial|Periodicals|Newspaper, Weekly Supplement|Printed
'2TUG'= Motion Picture & TV|Motion Picture|Documentary Film|All Internet Distribution Formats
'2TUX'= Internal Company Use|Periodicals|Magazine, Custom Published|Printed
'2TVA'= Motion Picture & TV|Television Programming|All Television Advertising Types|Television Broadcast
'2TVB'= Motion Picture & TV|Television Programming|All Television Advertising Types|All Electronic Distribution Formats
'2TVC'= Motion Picture & TV|Television Programming|Commercial|Television Broadcast
'2TVD'= Motion Picture & TV|Television Programming|Commercial|All Electronic Distribution Formats
'2TVE'= Motion Picture & TV|Television Programming|Infomercial|Television Broadcast
'2TVF'= Motion Picture & TV|Television Programming|Infomercial|All Electronic Distribution Formats
'2TVG'= Motion Picture & TV|Television Programming|On-Air Promotion|Television Broadcast
'2TVH'= Motion Picture & TV|Television Programming|On-Air Promotion|All Electronic Distribution Formats
'2TVI'= Motion Picture & TV|Television Programming|Documentary Program|Television Broadcast
'2TVJ'= Motion Picture & TV|Television Programming|Documentary Program|All Electronic Distribution Formats
'2TVK'= Motion Picture & TV|Television Programming|Educational Program|Television Broadcast
'2TVL'= Motion Picture & TV|Television Programming|Educational Program|All Electronic Distribution Formats
'2TVM'= Motion Picture & TV|Television Programming|Entertainment Program|Television Broadcast
'2TVN'= Motion Picture & TV|Television Programming|Entertainment Program|All Electronic Distribution Formats
'2TVP'= Motion Picture & TV|Television Programming|Made For TV Movie|All Electronic Distribution Formats
'2TVQ'= Motion Picture & TV|Television Programming|Set Decor|All Electronic Distribution Formats
'2TVR'= Motion Picture & TV|Music Video|All Music Video Types|All Electronic Distribution Formats
'2TVS'= Motion Picture & TV|Television Programming|News Program|Television Broadcast
'2TVT'= Motion Picture & TV|Television Programming|News Program|All Electronic Distribution Formats
'2TVU'= Motion Picture & TV|Television Programming|Non-Profit Program|Television Broadcast
'2TVV'= Motion Picture & TV|Television Programming|Non-Profit Program|All Electronic Distribution Formats
'2TVW'= Motion Picture & TV|Television Programming|Prop|All Electronic Distribution Formats
'2TVY'= Motion Picture & TV|Television Programming|Made For TV Movie|Television Broadcast
'2TVZ'= Motion Picture & TV|Television Programming|All Editorial Television Types|All Electronic Distribution Formats
'2UNL'= Unlicensed|Not Applicable|Not Applicable|Not Applicable
'2WAB'= Editorial|Book|Retail Book, Illustrated Book|Printed
'2WAG'= Motion Picture & TV|Motion Picture|Feature Film|All Internet Distribution Formats
'2WAL'= Products|Merchandise|Wallpaper|Printed
'2WAN'= Internal Company Use|Website|All Website Types|Intranet and Extranet Website
'2WAR'= Products|Merchandise|Computer Software|All Electronic Distribution Formats
'2WAX'= Advertising|Point of Purchase|Table Tent|Printed
'2WEB'= Advertising|Website|Web Page, All Types|Internet Website
'2WED'= Personal Use|Personal Review|All Review Types|Printed
'2WEE'= Products|Merchandise|Stamp|Printed
'2WET'= Advertising|Display|Poster, Restroom Poster|Electronic Display
'2WHA'= Editorial|Book|Retail Book, Illustrated Guide|Printed
'2WHO'= Products|Product Packaging|Wholesale Packaging, All Packaging Types|Printed
'2WIG'= Editorial|Periodicals|Scholarly Journal|Printed
'2WIN'= Motion Picture & TV|Motion Picture|Feature Film|Recordable Media
'2WIT'= Products|Merchandise|Stationery|Printed
'2WIZ'= Motion Picture & TV|Motion Picture|Short Film|Projected Display
'2WRP'= Products|Merchandise|Gift Wrap|Printed
'2WRY'= Products|Merchandise|Screen Saver|Recordable Media
'2YAK'= Editorial|Book|Textbook Ancillary Materials, Teachers' Edition|Printed
'2YAM'= Advertising|Marketing Materials|Promotional Calendar, Multi-Page|Printed
'2YAP'= Editorial|Book|Retail Book, Novelty Book|Printed
'2YEA'= Editorial|Book|Retail Book, Directory|All Electronic Distribution Formats
'2YEN'= Editorial|Book|Retail Book, Postcard Book|Printed
'2YET'= Editorial|Book|Textbook Ancillary Materials, Packaging For Recordable Media|Printed
'2YOK'= Editorial|Book|Retail Book, Young Adult Book|Printed
'2YUM'= Editorial|Book|Textbook Ancillary Materials, Lab Manual|Printed
'2ZAG'= Editorial|Mobile|All Mobile Types|Mobile
'2ZAM'= Products|Mobile|All Mobile Types|Mobile
'2ZAP'= Products|Mobile|Entertainment Programming|Mobile
'2ZEN'= Products|Mobile|Computer Software|Mobile
'2ZIG'= Products|Mobile|Wallpaper|Mobile
'2ZIP'= Products|Mobile|Game, All Types|Mobile
'2ZIT'= Personal Use|Mobile|Wallpaper|Mobile
'2ZOA'= Editorial|Book|Textbook, Course Pack|Recordable Media
'2ZOB'= Personal Use|Mobile|All Mobile Types|Mobile
'2ZOO'= Editorial|Book|Textbook, Course Pack|Internet Email
'2ZOT'= Editorial|Book|Textbook Ancillary Materials, Teacher's Manual|Printed
'2ZUM'= Internal Company Use|Mobile|All Mobile Types|Mobile
'2ZUS'= Advertising|Mobile|All Mobile Types|Mobile
'3PAA'= Any Placements on All Pages
'3PNB'= Multiple Placements on One Side
'3PNC'= Multiple Placements on Back Cover
'3PND'= Single Placement as Chapter Opener
'3PNE'= Single Placement on Front Side
'3PNF'= Single Placement on Front Cover And Back Cover
'3PNH'= Multiple Placements in Body Of Program
'3PNI'= Single Placement as Chapter Opener
'3PNJ'= Multiple Placements on Pop Ups
'3PNK'= Multiple Placements on Front Side
'3PNL'= Multiple Placements on Item
'3PNM'= Single Placement in Body Of Program
'3PNN'= Single Placement on Front Cover
'3PNP'= Single Placement on Both Sides
'3PNQ'= Single Placement in Content Body
'3PNR'= Single Placement on Back Cover
'3PNS'= Multiple Placements on Splash Pages
'3PNT'= Single Placement on Front Page
'3PNU'= Multiple Placements on Home Page
'3PNV'= Multiple Placements on Front Side
'3PNW'= Single Placement in Body Of Program
'3PNX'= Multiple Placements as Flash
'3PNY'= Multiple Placements on Inside Cover
'3PNZ'= Single Placement in Bibliography
'3PPA'= Single Placement on Dust Jacket
'3PPB'= Single Placement in Closing Sequence
'3PPC'= Multiple Placements in Packaging Interior
'3PPD'= Single Placement in Packaging Interior
'3PPE'= Single Placement as Flash
'3PPF'= Multiple Placements on Front Cover
'3PPG'= Single Placement on Splash Page
'3PPH'= Single Placement on Inside
'3PPI'= Multiple Placements on Landing Pages
'3PPJ'= Multiple Placements in Body Of Advertisement
'3PPK'= Single Placement on Inside Cover
'3PPL'= Single Placement on Both Sides
'3PPM'= Multiple Placements on Any Pages
'3PPN'= Multiple Placements in Closing Sequence
'3PPP'= Multiple Placements on Front Cover And Interior Pages
'3PPQ'= Multiple Placements on Home Page And Secondary Pages
'3PPR'= Single Placement in Any Part
'3PPS'= Single Placement on Landing Page
'3PPU'= Single Placement on Title Page
'3PPV'= Multiple Placements on Front Cover
'3PPW'= Single Placement as Forward
'3PPX'= Single Placement on Packaging Exterior|Front
'3PPY'= Single Placement on Home Page
'3PPZ'= Multiple Placements in Body Of Program
'3PQA'= Single Placement as Frontispiece
'3PQB'= Multiple Placements on Wrap Around Cover
'3PQC'= Single Placement on Back Side
'3PQD'= Single Placement on Secondary Page
'3PQE'= Single Placement on Spine
'3PQF'= Single Placements in Bibliography
'3PQG'= Single Placement on Any Interior Page
'3PQH'= Single Placement on Back Cover
'3PQI'= Single Placement on Preface
'3PQJ'= Single Placement on Wrap Around Cover
'3PQK'= Multiple Placements on Both Sides
'3PQL'= Multiple Placements in Closing Sequence
'3PQM'= Multiple Placements on Back Side
'3PQN'= Single Placement as Vignette
'3PQP'= Single Placement on Pop Up
'3PQQ'= Single Placement as Unit Opener
'3PQS'= Multiple Placements on Back Cover
'3PQT'= Single Placement on Table Of Contents
'3PQU'= Single Placement in Closing Sequence
'3PQW'= Multiple Placements on Any Interior Pages
'3PQX'= Single Placement on Any Interior Page
'3PQY'= Single Placement on Front Cover
'3PQZ'= Single Placement on Index
'3PRB'= Single Placement on Front Cover
'3PRC'= Single Placement on Table Of Contents
'3PRD'= Multiple Placements in Content Body
'3PRF'= Multiple Placements on Any Interior Pages
'3PRG'= Multiple Placements on Front Cover And Back Cover
'3PRH'= Single Placement on Any Interior Page
'3PRI'= Single Placement as Colophon
'3PRJ'= Multiple Placements on Front Cover
'3PRK'= Multiple Placements on Inside
'3PRL'= Multiple Placements on Any Interior Pages
'3PRM'= Single Placement on Front Cover And Back Cover
'3PRN'= Single Placement on Any Interior Page
'3PRP'= Single Placement in Body Of Advertisement
'3PRQ'= Single Placement on Screen
'3PRR'= Single Placement in Title Sequence
'3PRS'= Single Placement in Content Body
'3PRT'= Single Placement on Pop Up
'3PRU'= Single Placement on Front Side
'3PRV'= Multiple Placements on Both Sides
'3PRW'= Multiple Placements in Any Part
'3PRY'= Multiple Placements in Content Body
'3PRZ'= Multiple Placements on Front Cover
'3PSA'= Single Placement as Front Matter
'3PSB'= Multiple Placements on Back Side
'3PSC'= Single Placement in Title Sequence
'3PSD'= Multiple Placements on Screen
'3PSF'= Multiple Placements on Back Cover
'3PSH'= Single Placement on Back Cover
'3PSI'= Multiple Placements on Packaging Exterior|Front
'3PSJ'= Single Placement on Front Cover
'3PSK'= Multiple Placements in Title Sequence
'3PSL'= Single Placement on Flap
'3PSM'= Multiple Placements on Any Interior Pages
'3PSN'= Multiple Placements on Back Cover
'3PSP'= Single Placement on Back Cover
'3PSQ'= Single Placement on Back Side
'3PSR'= Single Placement on Inside Cover
'3PSS'= Multiple Placements on Front Cover And Back Cover
'3PST'= Single Placement on Any Interior Page
'3PSU'= Multiple Placements on Inside Cover
'3PSV'= Multiple Placements in Title Sequence
'3PSW'= Single Placement on Item
'3PSY'= Multiple Placements on Any Interior Pages
'3PSZ'= Multiple Placements on Secondary Pages
'3PTA'= Single Placement on One Side
'3PTB'= Single Placement on Front Cover And Interior Page
'3PTC'= Multiple Placements on Dust Jacket
'3PTD'= Single Placements on Interior, Covers and Jacket
'3PTE'= Multiple Placements on Interior, Covers and Jacket
'3PTF'= Single Placement on Section Opener Page
'3PTG'= Multiple Placements on Section Opener Page
'3PTH'= Single Placement on Section Opener and Front Page
'3PTI'= Multiple Placements on Section Opener and Front Page
'3PTJ'= Single Placement on Any Covers And Interior Pages
'3PTK'= Multiple Placements on Any Covers And Interior Pages
'3PTL'= Single Placement on Front Cover And Back Cover
'3PTM'= Multiple Placements on Front Cover And Back Cover
'3PTN'= Multiple Placements on Any Covers And Interior Pages
'3PTP'= Single Placement on Any Cover And Interior Page
'3PTQ'= Single Placement on Any Covers And Interior Pages
'3PTR'= Multiple Placements on Any Covers And Interior Pages
'3PTS'= Single Placement Anywhere On Packaging
'3PTT'= Multiple Placements Anywhere On Packaging
'3PTU'= Multiple Placements in Any Part
'3PTV'= Single Placement in Any Part
'3PTW'= Single Placement on Any Pages
'3PTY'= Single Placement on Home Page And Secondary Pages
'3PTZ'= Multiple Placements on Any Pages
'3PUB'= Multiple Placements in Any Part
'3PUC'= Single Placement in Any Part
'3PUD'= Single Placement on Back Cover Or Interior Page
'3PUF'= Single Placement on Front Cover Or Back Cover
'3PUH'= Multiple Placements on Packaging Exterior|Back or Side
'3PUJ'= Single Placement on Packaging Exterior|Back or Side
'3PUL'= Any Placements
'3PXX'= Not Applicable or None
'4SAA'= Any Size Image|Any Size Media
'4SAB'= Up To 1/2 Area Image|Up To A0 Display
'4SAC'= Up To Full Page Image|Up To Full Page Media
'4SAD'= Up To 1/4 Area Image|Up To 16 Sheet Display
'4SAE'= Up To 14 x 20 Inch Image|Any Size Media
'4SAF'= Up To 1/2 Area Image|Up To 4,800 Square Foot Display
'4SAG'= Up To Full Page Image|Any Size Page
'4SAH'= Up To Full Area Image|Up To 69 x 48 Inch Display
'4SAI'= Up To 1/2 Area Image|Up To 180 x 150 Pixels Ad
'4SAJ'= Up To 1/2 Area Image|Up To 11 x 36 Foot Display
'4SAK'= Up To 1/4 Page Image|Any Size Page
'4SAL'= Up To 1/4 Area Image|Up To Full Area Media
'4SAM'= Up To 1/2 Area Image|Up To B1 Media
'4SAN'= Up To Full Area Image|Up To 10 x 8 Foot Media
'4SAP'= Up To 1/4 Screen Image|Up To 32 Inch Screen
'4SAQ'= Up To 1/2 Area Image|Any Size Display
'4SAR'= Up To Full Area Image|Up To 728 x 90 Pixels Ad
'4SAS'= Up To 1/2 Area Image|Up To 24 x 36 Inch Media
'4SAT'= Up To 75 x 75 cm Image|Up To 100 x 100 cm Media
'4SAU'= Up To 1/2 Area Image|Up To 26 x 241 Inch Display
'4SAV'= Up To 8 x 12 Inch Image|Any Size Media
'4SAW'= Up To 1/2 Area Image|Up To 10,000 Square Foot Display
'4SAX'= Up To 1/2 Area Image|Up To 4 x 8 Foot Media
'4SAY'= Up To 1/2 Area Image|Up To 43 x 62 Inch Display
'4SAZ'= Up To 1/2 Area Image|Up To B0 Display
'4SBA'= Up To 1/2 Area Image|Up To 24 x 30 Inch Display
'4SBC'= Up To 1/4 Area Image|Up To 8 Sheet Display
'4SBD'= Up To Full Area Image|Up To 10,000 Square Foot Display
'4SBE'= Up To 1/2 Screen Image|Up To 63 Inch Screen
'4SBF'= Up To Full Area Image|Any Size Display
'4SBG'= Any Size Image|Up To Full Screen Ad
'4SBH'= Up To Full Area Image|Up To A1 Media
'4SBI'= Up To 1/4 Area Image|Up To 10 x 8 Foot Media
'4SBJ'= Up To 20 x 20 cm Image|Up To 100 x 100 cm Media
'4SBK'= Up To 1/16 Page Image|Any Size Page
'4SBL'= Up To 1/2 Area Image|Up To 8 Sheet Display
'4SBM'= Up To Full Area Image|Up To B0 Media
'4SBN'= Up To 1/8 Page Image|Any Size Page
'4SBP'= Any Size Image|Any Size Page
'4SBQ'= Up To 1/2 Area Image|Up To 40 x 60 Inch Media
'4SBR'= Up To 1/2 Area Image|Up To 30 x 240 Inch Display
'4SBS'= Up To 1/4 Area Image|Up To 83 x 135 Inch Display
'4SBT'= Up To Full Area Image|Up To 30 x 40 Inch Display
'4SBU'= Up To 1/2 Page Image|Up To 2 Page Ad
'4SBV'= Up To 1/2 Area Image|Up To 43 x 126 Inch Display
'4SBW'= Up To 1/2 Area Image|Up To 138 x 53 Inch Media
'4SBX'= Up To Full Area Image|Up To 83 x 135 Inch Display
'4SBY'= Up To 1/2 Area Image|Up To 60 x 40 Inch Display
'4SBZ'= Up To Full Screen Image|Up To 32 Inch Screen
'4SCA'= Up To 1/4 Area Image|Up To 468 x 60 Pixels Ad
'4SCB'= Up To 50 x 50 cm Image|Up To 100 x 100 cm Media
'4SCC'= Up To 1/2 Area Image|Up To B1 Display
'4SCD'= Up To 1/4 Area Image|Up To 48 Sheet Display
'4SCE'= Up To 20 x 20 Inch Image|Up To 40 x 40 Inch Media
'4SCF'= Up To 1/4 Area Image|Up To 300 x 600 Pixels Ad
'4SCG'= Up To 1/2 Area Image|Any Size Item
'4SCH'= Up To 1/4 Page Image|Up To 1/2 Page Ad
'4SCI'= Up To 100 x 100 cm Image|Up To 100 x 100 cm Media
'4SCJ'= Up To 1/4 Area Image|Up To B1 Media
'4SCK'= Up To 1/4 Area Image|Up To 728 x 90 Pixels Ad
'4SCL'= Up To 1/2 Area Image|Up To 30 x 40 Inch Display
'4SCM'= Up To 40 x 60 Inch Image|Any Size Media
'4SCN'= Up To 1/8 Page Image|Up To Full Page Media
'4SCP'= Up To Full Page Image|Up To Full Page Ad
'4SCQ'= Up To 70 x 100 cm Image|Any Size Media
'4SCR'= Up To 1/2 Area Image|Up To 14 x 48 Foot Display
'4SCS'= Up To 1/4 Screen Image|Up To 21 Inch Screen
'4SCT'= Up To 40 x 40 Inch Image|Up To 40 x 40 Inch Media
'4SCU'= Up To 6 x 9 Inch Image|Any Size Media
'4SCV'= Up To 1/2 Page Image|Up To 1/2 Page Ad
'4SCW'= Up To 1/2 Area Image|Up To 728 x 90 Pixels Ad
'4SCX'= Up To Full Area Image|Any Size Display
'4SCY'= Up To Full Screen Image|Up To 15 Inch Screen
'4SCZ'= Up To 1/4 Screen Image|Up To 15 Inch Screen
'4SDA'= Up To 11 x 15 cm Image|Any Size Media
'4SDB'= Up To 20 x 24 Inch Image|Any Size Media
'4SDC'= Up To 50 x 71 cm Image|Any Size Media
'4SDD'= Up To 1/4 Area Image|Up To 4 Sheet Display
'4SDE'= Up To 30 x 40 Inch Image|Any Size Media
'4SDF'= Up To 1/2 Area Image|Up To 96 Sheet Display
'4SDG'= Up To 24 x 30 Inch Image|Any Size Media
'4SDH'= Up To 1/4 Area Image|Up To 27 x 141 Inch Display
'4SDI'= Up To Full Area Image|Up To 12 x 24 Foot Media
'4SDJ'= Up To Full Area Image|Up To 138 x 53 Inch Media
'4SDK'= Up To Full Area Image|Up To 96 Sheet Display
'4SDL'= Up To Full Screen Image|Any Size Screen
'4SDM'= Up To 1/4 Area Image|Up To 27 x 85 Inch Display
'4SDN'= Up To Full Area Image|Up To 40 x 60 Inch Media
'4SDP'= Up To 30x 30 Inch Image|Up To 40 x 40 Inch Media
'4SDQ'= Up To 1/2 Screen Image|Up To 100 Diagonal Foot Screen
'4SDR'= Up To Full Area Image|Up To 26 x 241 Inch Display
'4SDS'= Up To Full Area Image|Up To 1,200 Square Foot Display
'4SDT'= Up To 1/4 Area Image|Up To 46 x 60 Inch Media
'4SDU'= Up To 1/2 Area Image|Up To 4 Sheet Display
'4SDV'= Up To 1/4 Area Image|Up To 40 x 60 Inch Media
'4SDW'= Up To Full Area Image|Up To 43 x 62 Inch Display
'4SDX'= Up To 1/2 Area Image|Up To 10 x 40 Foot Display
'4SDY'= Up To 60 x 85 cm Image|Any Size Media
'4SDZ'= Up To 1/2 Area Image|Up To A0 Media
'4SEA'= Up To 1/4 Area Image|Up To 30 Sheet Display
'4SEB'= Up To Full Screen Image|Up To 21 Inch Screen
'4SEC'= Up To Full Area Image|Up To A0 Display
'4SED'= Up To 1/2 Screen Image|Up To 15 Inch Screen
'4SEE'= Up To 42 x 60 cm Image|Any Size Media
'4SEF'= Up To 1/4 Area Image|Up To A1 Media
'4SEG'= Up To Full Area Image|Up To 300 x 600 Pixels Ad
'4SEH'= Up To 1/4 Area Image|Up To 43 x 126 Inch Display
'4SEI'= Up To 1/4 Area Image|Up To B0 Display
'4SEJ'= Up To 1/2 Page Image|Any Size Page
'4SEK'= Up To 1/4 Screen Image|Up To 63 Inch Screen
'4SEL'= Up To Full Area Image|Up To A0 Media
'4SEM'= Up To 1/4 Screen Image|Up To 100 Diagonal Foot Screen
'4SEN'= Up To 1/2 Area Image|Up To 16 Sheet Display
'4SEP'= Up To 1/2 Area Image|Up To 83 x 135 Inch Display
'4SEQ'= Up To 5 x 5 Inch Image|Up To 40 x 40 Inch Media
'4SER'= Up To 1/2 Area Image|Up To 12 Sheet Display
'4SES'= Up To Full Screen Image|Any Size Screen
'4SET'= Up To Full Area Image|Up To B0 Display
'4SEU'= Up To 1/3 Page Image|Any Size Page
'4SEV'= Up To 21 x 30 cm Image|Any Size Media
'4SEW'= Up To 1/4 Area Image|Up To 48 x 71 Inch Display
'4SEX'= Up To 1/2 Area Image|Up To 46 x 60 Inch Media
'4SEY'= Up To 1/4 Area Image|Up To 10,000 Square Foot Display
'4SEZ'= Up To 16 x 20 Inch Image|Any Size Media
'4SFA'= Up To 1/4 Area Image|Any Size Item
'4SFB'= Up To 1/4 Area Image|Up To 138 x 53 Inch Media
'4SFC'= Up To 15 x 21 cm Image|Any Size Media
'4SFD'= Up To Full Area Image|Up To 30 Sheet Display
'4SFE'= Up To 1/4 Area Image|Any Size Display
'4SFF'= Up To 1/4 Area Image|Any Size Media
'4SFG'= Up To 4 Page Image|Any Size Pages
'4SFH'= Up To 5 x 7 Inch Image|Any Size Media
'4SFI'= Up To 2 Page Image|Any Size Pages
'4SFJ'= Up To 2 Page Image|Any Size Pages
'4SFK'= Up To 1/4 Area Image|Up To 30 x 40 Inch Media
'4SFL'= Up To Full Area Image|Up To 4 Sheet Display
'4SFM'= Up To Full Area Image|Up To 11 x 36 Foot Display
'4SFN'= Up To 1/4 Area Image|Up To 25 x 13 Inch Media
'4SFP'= Up To 11 x 14 Inch Image|Any Size Media
'4SFQ'= Up To 30 x 42 cm Image|Any Size Media
'4SFR'= Up To 2 Page Image|Any Size Ad
'4SFS'= Up To Full Area Image|Up To 8 Sheet Display
'4SFT'= Up To 1/2 Area Image|Up To Full Screen Ad
'4SFU'= Up To Full Area Image|Up To 48 Sheet Display
'4SFV'= Up To 1/2 Screen Image|Up To 21 Inch Screen
'4SFW'= Up To Full Area Image|Up To 48 x 71 Inch Display
'4SFX'= Up To 8 x 10 Inch Image|Any Size Media
'4SFZ'= Up To 1/2 Area Image|Up To 27 x 141 Inch Display
'4SGA'= Up To Full Area Image|Up To 27 x 141 Inch Display
'4SGB'= Up To 1/2 Area Image|Up To 30 x 40 Inch Media
'4SGC'= Up To 1/2 Screen Image|Any Size Screen
'4SGD'= Up To Full Area Image|Up To 468 x 60 Pixels Ad
'4SGE'= Up To Full Area Image|Up To 14 x 48 Foot Display
'4SGF'= Up To 1/4 Page Image|Up To 1/4 Page Ad
'4SGG'= Up To Full Area Image|Up To 46 x 60 Inch Media
'4SGH'= Up To 1/4 Screen Image|Any Size Screen
'4SGI'= Up To Full Area Image|Up To 24 x 30 Inch Display
'4SGJ'= Up To 1/2 Screen Image|Up To 32 Inch Screen
'4SGK'= Up To Full Area Image|Up To 27 x 85 Inch Display
'4SGL'= Up To Full Page Image|Up To 2 Page Ad
'4SGM'= Up To Full Page Image|Any Size Ad
'4SGN'= Up To Full Area Image|Up To 43 x 126 Inch Display
'4SGP'= Any Size Image|Any Size Media
'4SGQ'= Up To 1/2 Area Image|Up To 48 Sheet Display
'4SGR'= Up To Full Area Image|Up To B1 Display
'4SGS'= Up To 1/2 Area Image|Up To 1,200 Square Foot Display
'4SGT'= Up To 1/2 Area Image|Up To B0 Media
'4SGU'= Up To 1/4 Area Image|Up To 14 x 48 Foot Display
'4SGV'= Up To 1/2 Area Image|Up To 25 x 13 Inch Media
'4SGW'= Up To 1/2 Page Image|Any Size Page
'4SGX'= Up To Full Area Image|Up To 4,800 Square Foot Display
'4SGY'= Up To 1/2 Screen Image|Up To 30 Diagonal Foot Screen
'4SGZ'= Up To 3 x 4.5 Inch Image|Any Size Media
'4SHA'= Up To 1/4 Area Image|Up To 10 x 40 Foot Display
'4SIB'= Up To 1/4 Area Image|Up To 69 x 48 Inch Display
'4SIC'= Up To 1/2 Area Image|Up To 27 x 85 Inch Display
'4SID'= Up To Full Area Image|Up To 30 x 240 Inch Display
'4SIE'= Up To 1/4 Screen Image|Up To 30 Diagonal Foot Screen
'4SIF'= Up To Full Area Image|Up To 12 Sheet Display
'4SIG'= Up To 18 x 25 cm Image|Any Size Media
'4SIH'= Up To 1/4 Area Image|Up To 24 x 30 Inch Display
'4SII'= Up To 1/2 Area Image|Up To 468 x 60 Pixels Ad
'4SIJ'= Up To 1/2 Screen Image|Up To 10 Diagonal Foot Screen
'4SIK'= Up To 1/4 Area Image|Up To 24 x 36 Inch Media
'4SIL'= Up To Full Area Image|Up To 60 x 40 Inch Display
'4SIM'= Up To 1/4 Area Image|Up To 12 x 24 Foot Media
'4SIN'= Any Size Image|Any Size Media
'4SIP'= Up To 1/4 Area Image|Up To B0 Media
'4SIQ'= Up To Full Area Image|Up To 24 x 36 Inch Media
'4SIR'= Up To 1/4 Area Image|Up To 26 x 53 Inch Media
'4SIS'= Up To Full Area Image|Up To 16 Sheet Display
'4SIT'= Up To Full Area Image|Up To 2,400 Square Foot Display
'4SIU'= Up To 1/4 Area Image|Up To Full Screen Ad
'4SIV'= Up To 10 x 10 Inch Image|Up To 40 x 40 Inch Media
'4SIW'= Any Size Image|Any Size Pages
'4SIX'= Up To 1/4 Area Image|Up To 11 x 36 Foot Display
'4SIY'= Up To 1/4 Page Image|Up To Full Page Ad
'4SIZ'= Up To 1/2 Page Image|Up To Full Page Media
'4SJA'= Up To 1/16 Page|Any Size Page
'4SJB'= Up To 1/4 Page Image|Any Size Page
'4SJC'= Up To 100 x 142 cm Image|Any Size Media
'4SJD'= Up To 21 x 30 cm Image|Any Size Media
'4SJE'= Up To 38 x 50 Inch Image|Any Size Media
'4SJF'= Up To Full Screen Image|Up To 63 Inch Screen
'4SJG'= Up To 1/4 Area Image|Up To A0 Media
'4SJI'= Up To 1/4 Area Image|Up To 4 x 8 Foot Media
'4SJJ'= Up To 25 x 36 cm Image|Any Size Media
'4SJK'= Any Size Image|Up To Full Card
'4SJL'= Up To 1/4 Area Image|Up To 30 x 240 Inch Display
'4SJM'= Up To 1/2 Area Image|Up To Full Area Media
'4SJN'= Up To Full Area Image|Up To 25 x 13 Inch Media
'4SJP'= Up To 1/4 Area Image|Up To 60 x 40 Inch Display
'4SJQ'= Up To 1/4 Area Image|Up To 4,800 Square Foot Display
'4SJR'= Up To 1/2 Area Image|Up To 50 x 24 Inch Media
'4SJS'= Up To 1/8 Page Image|Any Size Page
'4SJT'= Up To Full Area Image|Up To 180 x 150 Pixels Ad
'4SJU'= Up To 2 Page Image|Any Size Pages
'4SJV'= Up To Full Page Image|Any Size Page
'4SJW'= Up To 40 x 40 cm Image|Up To 100 x 100 cm Media
'4SJX'= Up To 1/4 Area Image|Up To B0 Display
'4SJY'= Up To Full Screen Image|Up To 30 Diagonal Foot Screen
'4SJZ'= Up To 3 Page Image|Any Size Pages
'4SKA'= Up To 1/4 Area Image|Up To 20 x 30 Inch Media
'4SKB'= Up To 11 x 14 Inch Image|Any Size Media
'4SKC'= Up To Full Screen Image|Up To 100 Diagonal Foot Screen
'4SKD'= Up To Full Page Image|Any Size Page
'4SKE'= Up To 1/8 Page Image|Any Size Page
'4SKF'= Up To 1/4 Area Image|Up To 672 Square Foot Display
'4SKG'= Any Size Image|Any Size Screen
'4SKH'= Up To Full Area Image|Up To 50 x 24 Inch Media
'4SKI'= Up To 30 x 30 cm Image|Up To 100 x 100 cm Media
'4SKJ'= Up To 1/2 Area Image|Up To A1 Media
'4SKK'= Up To Full Area Image|Up To B0 Display
'4SKL'= Up To 1/2 Area Image|Up To 26 x 53 Inch Media
'4SKM'= Up To Full Area Image|Up To 26 x 53 Inch Media
'4SKN'= Up To Full Area Image|Up To 20 x 30 Inch Media
'4SKP'= Any Size Image|Any Size Ad
'4SKQ'= Up To 1/4 Area Image|Up To 180 x 150 Pixels Ad
'4SKR'= Up To 1/4 Area Image|Up To 1,200 Square Foot Display
'4SKS'= Up To 1/2 Area Image|Up To 672 Square Foot Display
'4SKT'= Up To 1/4 Area Image|Up To 43 x 62 Inch Display
'4SKU'= Up To 1/2 Area Image|Up To 20 x 30 Inch Media
'4SKV'= Up To Full Area Image|Up To 10 x 40 Foot Display
'4SKW'= Up To 1/4 Area Image|Up To 30 x 40 Inch Display
'4SKX'= Up To 1/4 Area Image|Up To 96 Sheet Display
'4SKY'= Up To 1/2 Area Image|Up To 48 x 71 Inch Display
'4SKZ'= Up To Full Area Image|Up To Full Area Media
'4SLA'= Any Size Image|Any Size Pages
'4SLC'= Up To 1/4 Area Image|Up To 50 x 24 Inch Media
'4SLD'= Up To 1/2 Page Image|Any Size Page
'4SLE'= Up To Full Screen Image|Up To 10 Diagonal Foot Screen
'4SLF'= Up To 8 x 10 Inch Image|Any Size Media
'4SLG'= Up To Full Area Image|Up To 4 x 8 Foot Media
'4SLH'= Up To 30 x 42 cm Image|Any Size Media
'4SLI'= Up To 1/2 Area Image|Up To 10 x 8 Foot Media
'4SLJ'= Up To 1/4 Area Image|Up To 12 Sheet Display
'4SLK'= Up To 1/4 Area Image|Up To 2,400 Square Foot Display
'4SLL'= Up To 1/4 Area Image|Up To A0 Display
'4SLM'= Up To 1/2 Area Image|Up To 300 x 600 Pixels Ad
'4SLN'= Up To Full Area Image|Up To 672 Square Foot Display
'4SLP'= Up To 1/2 Area Image|Up To 30 Sheet Display
'4SLQ'= Up To 1/4 Area Image|Up To B1 Display
'4SLR'= Up To Full Area Image|Any Size Item
'4SLS'= Up To 1/2 Area Image|Up To 12 x 24 Foot Media
'4SLT'= Up To Full Area Image|Up To 30 x 40 Inch Media
'4SLU'= Up To Full Area Image|Up To B1 Media
'4SLV'= Up To 1/4 Page Image|Any Size Page
'4SLW'= Up To 1/4 Page Image|Up To Full Page Media
'4SLX'= Up To 1/2 Area Image|Up To B0 Display
'4SLY'= Up To 1/2 Page Image|Up To Full Page Ad
'4SLZ'= Up To 1/4 Screen Image|Up To 10 Diagonal Foot Screen
'4SMA'= Up To 1/2 Area Image|Up To 2,400 Square Foot Display
'4SMB'= Up To 2 Page Image|Up To 2 Page Ad
'4SMD'= Up To 25 x 36 cm Image|Any Size Media
'4SME'= Up To 13 x 18 cm Image|Any Size Media
'4SMF'= Up To 85 x 119 cm Image|Any Size Media
'4SMG'= Up To 3/4 Page Image|Any Size Page
'4SMH'= Up To 150 x 150 Pixels Image|Any Size Screen
'4SMJ'= Up To 300 x 600 Pixels Image|Any Size Screen
'4SMK'= Up To 1/2 Area Image|Any Size Media
'4SML'= Up To Full Area Image|Any Size Media
'4SMN'= Up To 1/4 Area Image|Any Size Display
'4SMP'= Up To 1/2 Area Image|Any Size Display
'4SMQ'= Up To Full Area Image|Any Size Display
'4SMR'= Up To 1/4 Area Image|Any Size Display
'4SMS'= Up To 1/4 Screen Image|Any Size Screen
'4SMT'= Up To 1/2 Screen Image|Any Size Screen
'4SMU'= Up To Full Screen Image|Any Size Screen
'4SMV'= Any Size Image|Any Size Media
'4SMW'= Up To Full Area Image|Any Size Display
'4SMX'= Up To 1/4 Area Image|Any Size Media
'4SMY'= Up To 1/2 Area Image|Any Size Media
'4SMZ'= Up To Full Area Image|Any Size Media
'4SNG'= Up To 1/2 Area Image|Any Size Display
'4SNO'= Up To Full Area Image|Any Size Display
'4SUL'= Any Sizes
'4SXX'= Not Applicable or None
'5VAA'= All Versions
'5VUG'= Single Edition
'5VUK'= Single Hardcover Edition
'5VUL'= Any Versions
'5VUP'= Single Version
'5VUU'= Multiple Hardcover Editions
'5VUY'= Multiple Versions
'5VUZ'= Single Issue
'5VVB'= Multiple Print Versions
'5VVC'= Single Paperback Edition
'5VVG'= Multiple Editions
'5VVH'= Single Edition in All Binding Formats
'5VVJ'= Multiple Issues
'5VVK'= Multiple Paperback Editions
'5VVL'= Multiple Editions in All Binding Formats
'5VVM'= Single Print Version
'5VXX'= Not Applicable or None
'6QAA'= Any Quantity
'6QAB'= Up To 10,000|Impressions
'6QAC'= Up To 1,000|Copies
'6QAD'= Up To 10,000|Copies
'6QAE'= Up To 100|Displays
'6QAF'= Up To 50,000|Copies
'6QAG'= Up To 500|Displays
'6QAH'= Up To 100,000|Print Run
'6QAI'= Up To 500|Copies
'6QAK'= Up To 10|Copies
'6QAL'= Up To 10|Displays
'6QAM'= Any Quantity Of|Copies
'6QAN'= Up To 50,000|Total Circulation
'6QAP'= Up To 500|Displays
'6QAQ'= Up To 5,000|Print Run
'6QAR'= Up To 3 Million|Print Run
'6QAS'= Up To 1,000|Copies
'6QAT'= Up To 5,000|Total Circulation
'6QAU'= One|Print Run
'6QAV'= Up To 5 Million|Total Circulation
'6QAW'= Up To 5|Copies
'6QAX'= Up To 500,000|Displays
'6QAY'= Up To 1,000|Reprints
'6QAZ'= Up To 100|Print Run
'6QBA'= Up To 1,000|Print Run
'6QBB'= Up To 10,000|Total Circulation
'6QBC'= Up To 2,500|Displays
'6QBD'= Up To 50|Displays
'6QBE'= One|Copy
'6QBF'= Up To 10,000|Reprints
'6QBG'= Up To 250,000|Print Run
'6QBH'= Up To 40,000|Print Run
'6QBI'= Up To 100 Million|Viewers
'6QBK'= Four|Copies
'6QBL'= Five|Copies
'6QBM'= Up To 10 Million|Impressions
'6QBN'= Up To 1 Million|Viewers
'6QBP'= Up To 5|Displays
'6QBQ'= Any Quantity Of|Viewers
'6QBR'= Up To 100,000|Impressions
'6QBS'= Up To 500|Copies
'6QBT'= Up To 25,000|Copies
'6QBU'= One|Copy
'6QBV'= Up To 25,000|Print Run
'6QBW'= Up To 250,000|Displays
'6QBX'= Up To 1 Million|Copies
'6QBY'= Up To 1,000|Displays
'6QBZ'= Up To 100,000|Viewers
'6QCA'= Up To 250|Copies
'6QCB'= Up To 100|Reprints
'6QCC'= Any Quantity Of|Viewers
'6QCD'= Up To 1,000|Total Circulation
'6QCE'= Up To 250|Displays
'6QCF'= Three|Copies
'6QCG'= Up To 50,000|Print Run
'6QCH'= One|Copy
'6QCI'= Up To 500,000|Total Circulation
'6QCJ'= Up To 5 Million|Displays
'6QCK'= Up To 2 Million|Total Circulation
'6QCL'= Up To 3 Million|Total Circulation
'6QCM'= Up To 100|Copies
'6QCN'= Up To 1 Million|Total Circulation
'6QCP'= Up To 10|Copies
'6QCQ'= Up To 10,000|Copies
'6QCR'= Up To 100|Copies
'6QCS'= Up To 100,000|Total Circulation
'6QCT'= Up To 2 Million|Print Run
'6QCU'= Any Quantity Of|Reprints
'6QCV'= Up To 100,000|Viewers
'6QCW'= Up To 5,000|Print Run
'6QCX'= One|Display
'6QCY'= Up To 1 Million|Impressions
'6QCZ'= Up To 1 Million|Print Run
'6QDA'= Up To 10|Print Run
'6QDB'= Up To 1 Million|Displays
'6QDC'= Up To 5 Million|Print Run
'6QDD'= Up To 100|Viewers
'6QDE'= Up To 250,000|Print Run
'6QDF'= Up To 1,000|Copies
'6QDG'= Up To 10|Reprints
'6QDH'= Up To 10|Print Run
'6QDI'= One|Display
'6QDJ'= Up To 500,000|Print Run
'6QDK'= Up To 10 Million|Total Circulation
'6QDL'= Any Quantity Of|Print Run
'6QDM'= Up To 500,000|Copies
'6QDN'= Up To 100,000|Copies
'6QDP'= Up To 50,000|Copies
'6QDQ'= Up To 100,000|Print Run
'6QDR'= Up To 10|Total Circulation
'6QDS'= Up To 25,000|Displays
'6QDT'= Up To 250,000|Total Circulation
'6QDU'= Up To 10 Million|Print Run
'6QDV'= Up To 50|Copies
'6QDW'= Up To 5,000|Copies
'6QDX'= Up To 25|Displays
'6QDY'= Up To 5|Displays
'6QDZ'= Up To 100,000|Displays
'6QEA'= Up To 100|Displays
'6QEB'= Up To 10|Copies
'6QEC'= Up To 10,000|Print Run
'6QED'= Up To 100,000|Copies
'6QEE'= Up To 10,000|Copies
'6QEF'= Up To 25,000|Copies
'6QEG'= Up To 10,000|Print Run
'6QEH'= One|Print Run
'6QEI'= Any Quantity Of|Displays
'6QEJ'= Up To 100|Total Circulation
'6QEK'= Up To 2 Million|Displays
'6QEL'= Up To 25|Displays
'6QEM'= Up To 50|Displays
'6QEN'= Up To 500,000|Print Run
'6QEP'= One|Copy
'6QEQ'= Up To 1,000|Viewers
'6QER'= Any Quantity Of|Copies
'6QES'= Up To 50,000|Displays
'6QET'= Up To 5,000|Displays
'6QEU'= Any Quantity Of|Print Run
'6QEV'= Any Quantity Of|Circulation
'6QEW'= Up To 2,500|Copies
'6QEX'= Two|Copies
'6QEY'= Up To 100|Print Run
'6QEZ'= Up To 10,000|Viewers
'6QFA'= Up To 3 Million|Displays
'6QFB'= Up To 1,000|Print Run
'6QFC'= Up To 5|Copies
'6QFD'= Up To 25,000|Print Run
'6QFE'= Up To 5,000|Copies
'6QFF'= Up To 10,000|Displays
'6QFG'= Up To 250|Displays
'6QFH'= Up To 10,000|Viewers
'6QFI'= One|Reprint
'6QFJ'= Up To 10|Displays
'6QFK'= Up To 250,000|Copies
'6QFL'= Up To 100|Copies
'6QFM'= Any Quantity Of|Impressions
'6QFN'= Any Quantity Of|Copies
'6QFP'= Up To 10 Million|Viewers
'6QFQ'= Any Quantity Of|Displays
'6QFR'= Up To 50,000|Print Run
'6QFS'= Up To 25,000|Total Circulation
'6QFT'= One|Copy
'6QFU'= Up To 25|Total Circulation
'6QFV'= Up To 50|Total Circulation
'6QFW'= Up To 250|Total Circulation
'6QFY'= Up To 500|Total Circulation
'6QFZ'= Up To 2,500|Total Circulation
'6QGB'= Up To 25 Million|Total Circulation
'6QGC'= Up To 50 Million|Total Circulation
'6QGD'= Up To 25|Copies
'6QGE'= Up To 50|Copies
'6QUL'= Any Quantity
'6QXX'= Not Applicable or None
'7DAA'= In Perpetuity
'7DUL'= Any Durations
'7DUQ'= Up To 10 Years
'7DUS'= Up To 6 Months
'7DUT'= Up To 10 Years
'7DUV'= Up To 6 Months
'7DUW'= Up To 1 Year
'7DUY'= Up To 3 Years
'7DUZ'= Up To 5 Years
'7DWB'= Up To 7 Years
'7DWC'= Up To 3 Months
'7DWE'= Up To 2 Years
'7DWG'= Up To 15 Years
'7DWI'= Up To 1 Year
'7DWJ'= Up To 1 Month
'7DWK'= Up To 2 Years
'7DWL'= Up To 1 Week
'7DWM'= In Perpetuity
'7DWP'= Up To 13 Weeks
'7DWR'= In Perpetuity
'7DWS'= Life Of Publication
'7DWT'= Up To 52 Weeks
'7DWU'= Up To 7 Years
'7DWV'= Up To 5 Years
'7DWW'= Up To 6 Months
'7DWY'= Up To 3 Months
'7DWZ'= Up To 2 Years
'7DXA'= Full Term Of Copyright
'7DXB'= Up To 1 Week
'7DXC'= Up To 1 Day
'7DXD'= Up To 1 Year
'7DXE'= Up To 1 Year
'7DXF'= Up To 1 Month
'7DXG'= Up To 10 Years
'7DXH'= Life Of Publication
'7DXI'= In Perpetuity
'7DXK'= Up To 1 Month
'7DXL'= Up To 1 Week
'7DXM'= Up To 1 Year
'7DXP'= Up To 3 Years
'7DXQ'= Up To 1 Year
'7DXR'= Up To 10 Years
'7DXS'= In Perpetuity
'7DXT'= Up To 1 Day
'7DXV'= Up To 15 Years
'7DXW'= Up To 6 Months
'7DXX'= Not Applicable or None
'7DXY'= Up To 15 Years
'7DXZ'= Up To 3 Months
'7DYA'= Up To 5 Years
'7DYB'= Up To 6 Months
'7DYC'= Up To 10 Years
'7DYD'= Up To 5 Years
'7DYE'= Up To 3 Months
'7DYF'= Up To 1 Day
'7DYG'= Up To 1 Day
'7DYI'= Up To 1 Month
'7DYJ'= Up To 2 Weeks
'7DYK'= Up To 2 Years
'7DYL'= Up To 3 Years
'7DYM'= Up To 1 Year
'7DYN'= Up To 5 Years
'7DYP'= Up To 1 Week
'7DYQ'= In Perpetuity
'7DYS'= Life Of Publication
'7DYT'= Up To 26 Weeks
'7DYV'= Life Of Event
'7DYW'= Up To 1 Day
'7DYX'= Up To 6 Months
'7DYY'= Up To 10 Years
'7DYZ'= Up To 1 Day
'7DZA'= Up To 1 Year
'7DZB'= Up To 3 Years
'7DZD'= Up To 1 Week
'7DZF'= Up To 2 Months
'7DZG'= Up To 1 Year
'7DZH'= Up To 2 Years
'7DZJ'= Up To 3 Years
'7DZK'= Up To 5 Years
'7DZL'= Up To 10 Years
'7DZM'= Up To 2 Years
'7DZN'= Up To 3 Years
'7DZP'= Up To 2 Years
'8IAA'= All Industries
'8IAD'= Advertising and Marketing
'8IAE'= Arts and Entertainment
'8IAG'= Agriculture, Farming and Horticulture
'8IAL'= Alcohol
'8IAP'= Consumer Appliances and Electronics
'8IAR'= Architecture and Engineering
'8IAT'= Airline Transportation
'8IAU'= Automotive
'8IAV'= Aviation
'8IBA'= Baby and Childcare
'8IBE'= Beauty and Personal Care
'8IBI'= Biotechnology
'8IBR'= Broadcast Media
'8ICC'= Construction and Contracting
'8ICE'= Communications Equipment and Services
'8ICG'= Counseling
'8ICH'= Chemicals
'8ICO'= Business Consulting and Services
'8IEC'= Ecology, Environmental and Conservation
'8IED'= Education
'8IEM'= Employment Training and Recruitment
'8IEN'= Energy, Utilities and Fuel
'8IEV'= Events and Conventions
'8IFA'= Fashion
'8IFB'= Food and Beverage Processing
'8IFI'= Financial Services and Banking
'8IFL'= Food and Beverage Retail
'8IFO'= Forestry and Wood Products
'8IFR'= Freight and Warehousing
'8IFS'= Food Services
'8IFU'= Furniture
'8IGA'= Games, Toys and Hobbies
'8IGC'= Greeting Card
'8IGI'= Gaming Industry
'8IGL'= Gardening and Landscaping
'8IGO'= Government and Politics
'8IGR'= Graphic Design
'8IHA'= Household Appliances
'8IHC'= Household Cleaning Products
'8IHH'= Hotels and Hospitality
'8IHI'= Heavy Industry
'8IHO'= Home Improvement
'8IHS'= Computer Hardware, Software and Peripherals
'8IIM'= Industry and Manufacturing
'8IIN'= Insurance
'8IIS'= Internet Services
'8IIT'= Information Technologies
'8ILS'= Legal Services
'8IME'= Medical and Healthcare
'8IMM'= Mining and Metals
'8IMS'= Microelectronics and Semiconductors
'8IMU'= Music
'8IMW'= Military and Weapons
'8INP'= Not For Profit, Social, Charitable
'8IOG'= Oil and Gas
'8IOI'= Other Industry
'8IOP'= Office Products
'8IPM'= Publishing Media
'8IPO'= Personal Use Only
'8IPP'= Pet Products and Services
'8IPR'= Public Relations
'8IPS'= Pharmaceuticals and Supplements
'8IPT'= Printing and Reprographics
'8IRE'= Real Estate
'8IRM'= Retail Merchandise
'8IRR'= Religion and Religious Services
'8ISC'= Sciences
'8ISF'= Sports, Fitness and Recreation
'8ISH'= Shipping
'8ISM'= Retail Sales and Marketing
'8ISO'= Software
'8ISS'= Safety and Security
'8ITB'= Tobacco
'8ITE'= Telecommunications
'8ITR'= Travel and Tourism
'8ITX'= Textiles and Apparel
'8IUL'= Any Industries
'8IXX'= Not Applicable or None
'8LAA'= All Languages
'8LAF'= Afrikaans
'8LAR'= Arabic
'8LBO'= Bosnian
'8LBU'= Bulgarian
'8LCA'= Chinese-Cantonese
'8LCH'= Chinese-Mandarin
'8LCP'= Chinese-Other
'8LCR'= Croatian
'8LCZ'= Czech
'8LDA'= Danish
'8LDU'= Dutch
'8LEN'= English
'8LES'= Estonian
'8LFI'= Finnish
'8LFR'= French
'8LGE'= German
'8LGR'= Greek
'8LHE'= Hebrew
'8LHI'= Hindi
'8LHU'= Hungarian
'8LIC'= Icelandic
'8LIG'= Irish Gaelic
'8LIN'= Indonesian
'8LIT'= Italian
'8LJA'= Japanese
'8LKO'= Korean
'8LLA'= Latvian
'8LMG'= Mongolian
'8LNO'= Norwegian
'8LOL'= Any One Language
'8LOT'= Other Language
'8LPO'= Polish
'8LPR'= Portuguese
'8LRO'= Romanian
'8LRU'= Russian
'8LSE'= Serbian
'8LSG'= Scottish Gaelic
'8LSH'= Swahili
'8LSI'= Sindhi
'8LSL'= Slovenian
'8LSP'= Spanish
'8LSV'= Slovakian
'8LSW'= Swedish
'8LSZ'= Swazi
'8LTA'= Tagalog
'8LTH'= Thai
'8LTU'= Turkish
'8LUL'= Any Languages
'8LUR'= Ukrainian
'8LXX'= Not Applicable or None
'8LYI'= Yiddish
'8RAA'= Worldwide
'8RAC'= Latin America and Caribbean|All Latin America and Caribbean
'8RAD'= Europe|Andorra
'8RAE'= Middle East|United Arab Emirates
'8RAF'= Middle East|Afghanistan
'8RAG'= Latin America and Caribbean|Antigua and Barbuda
'8RAH'= Broad International Region|All Spanish Speaking Countries
'8RAI'= Latin America and Caribbean|Anguilla
'8RAJ'= Africa|All Africa
'8RAK'= Africa|All African Mediterranean Countries
'8RAL'= Europe|Albania
'8RAM'= Europe|Armenia
'8RAN'= Latin America and Caribbean|Netherlands Antilles
'8RAO'= Africa|Angola
'8RAP'= Africa|All Central Africa
'8RAQ'= Africa|All Eastern Africa
'8RAR'= Latin America and Caribbean|Argentina
'8RAS'= Oceania|American Samoa
'8RAT'= Europe|Austria
'8RAU'= Oceania|Australia
'8RAV'= Asia|Up To 3 States Or Provinces
'8RAW'= Latin America and Caribbean|Aruba
'8RAX'= Europe|Aland Islands
'8RAY'= Asia|China-Northeast
'8RAZ'= Europe|Azerbaijan
'8RBA'= Europe|Bosnia and Herzegovina
'8RBB'= Latin America and Caribbean|Barbados
'8RBC'= Africa|All Southern Africa
'8RBD'= Asia|Bangladesh
'8RBE'= Europe|Belgium
'8RBF'= Africa|Burkina Faso
'8RBG'= Europe|Bulgaria
'8RBH'= Middle East|Bahrain
'8RBI'= Africa|Burundi
'8RBJ'= Africa|Benin
'8RBK'= Northern America|Canada-British Columbia
'8RBL'= Africa|All Western Africa
'8RBM'= Northern America|Bermuda
'8RBN'= Asia|Brunei Darussalam
'8RBO'= Latin America and Caribbean|Bolivia
'8RBP'= Africa|Ascension Island
'8RBQ'= Other Regions|Antarctica
'8RBR'= Latin America and Caribbean|Brazil
'8RBS'= Latin America and Caribbean|Bahamas
'8RBT'= Asia|Bhutan
'8RBW'= Africa|Botswana
'8RBX'= Middle East|Up To 5 States Or Provinces
'8RBY'= Europe|Belarus
'8RBZ'= Latin America and Caribbean|Belize
'8RCA'= Northern America|Canada
'8RCB'= Other Regions|All Arctic and Arctic Ocean Islands
'8RCC'= Oceania|Cocos, Keeling Islands
'8RCD'= Northern America|Up To 5 States Or Provinces
'8RCE'= Northern America|USA and Canada
'8RCF'= Africa|Central African Republic
'8RCG'= Africa|Congo
'8RCH'= Europe|Switzerland
'8RCI'= Africa|Cote D'Ivoire
'8RCJ'= Northern America|Canada-Ontario
'8RCK'= Oceania|Cook Islands
'8RCL'= Latin America and Caribbean|Chile
'8RCM'= Africa|Cameroon
'8RCN'= Asia|All China
'8RCO'= Latin America and Caribbean|Colombia
'8RCP'= Asia|All Eastern Asia
'8RCR'= Latin America and Caribbean|Costa Rica
'8RCS'= Europe|Serbia and Montenegro
'8RCT'= Oceania|All Oceania
'8RCU'= Latin America and Caribbean|Cuba
'8RCV'= Africa|Cape Verde
'8RCX'= Oceania|Christmas Island
'8RCY'= Europe|Cyprus
'8RCZ'= Europe|Czech Republic
'8RDA'= Asia|Tibet
'8RDB'= Asia|All Asia
'8RDC'= Asia|All Central Asia
'8RDE'= Europe|Germany
'8RDG'= Asia|All Southern Asia
'8RDH'= Asia|All Southeastern Asia
'8RDJ'= Africa|Djibouti
'8RDK'= Europe|Denmark
'8RDM'= Latin America and Caribbean|Dominica
'8RDO'= Latin America and Caribbean|Dominican Republic
'8RDQ'= Other Regions|All British Indian Ocean Territories
'8RDR'= Europe|Croatia
'8RDS'= Europe|Faeroe Islands
'8RDT'= Europe|Vatican City State
'8RDU'= Europe|All Europe
'8RDW'= Europe|All Baltic States
'8RDX'= Europe|All Benelux
'8RDY'= Europe|All Caucasian States
'8RDZ'= Africa|Algeria
'8REA'= Europe|All Eastern Europe
'8REB'= Europe|All European Mediterranean Countries
'8REC'= Latin America and Caribbean|Ecuador
'8RED'= Europe|All Northern Europe
'8REE'= Europe|Estonia
'8REF'= Europe|All Scandinavia
'8REG'= Africa|Egypt
'8REH'= Africa|Western Sahara
'8REI'= Europe|All United Kingdom
'8REJ'= Europe|All Western Europe
'8REK'= Broad International Region|Europe, Middle East and Africa
'8REL'= Europe|All European Union Countries
'8REM'= Europe|England
'8REN'= Europe|Scotland
'8RER'= Africa|Eritrea
'8RES'= Europe|Spain
'8RET'= Africa|Ethiopia
'8REU'= Other Regions|All French Southern Territories
'8REV'= Middle East|Palestinian Authority
'8REX'= Middle East|All Middle East
'8REY'= Middle East|All Middle Eastern Gulf States
'8RFB'= Other Regions|All Northern Atlantic Ocean Islands
'8RFF'= Oceania|Midway Islands
'8RFH'= Oceania|Rapa Nui, Easter Island
'8RFI'= Europe|Finland
'8RFJ'= Oceania|Fiji
'8RFK'= Latin America and Caribbean|Falkland Islands, Malvinas
'8RFL'= Oceania|Tahiti
'8RFM'= Oceania|Micronesia
'8RFP'= Oceania|Wallis and Futuna
'8RFQ'= Latin America and Caribbean|Patagonia
'8RFR'= Europe|France
'8RFS'= Latin America and Caribbean|All South America
'8RFT'= Latin America and Caribbean|All Andean Countries
'8RFU'= Latin America and Caribbean|All Southern Cone
'8RFV'= Latin America and Caribbean|All Amazonia
'8RFW'= Other Regions|All Southern Atlantic Ocean Islands
'8RFX'= Other Regions|All Southern Indian Ocean Islands
'8RFY'= Broad International Region|All Americas
'8RFZ'= Latin America and Caribbean|All Caribbean
'8RGA'= Africa|Gabon
'8RGC'= Latin America and Caribbean|All Central America
'8RGD'= Latin America and Caribbean|Grenada
'8RGE'= Europe|Georgia
'8RGF'= Latin America and Caribbean|French Guiana
'8RGG'= Europe|Guernsey
'8RGH'= Africa|Ghana
'8RGI'= Europe|Gibraltar
'8RGJ'= Northern America|All Northern American Countries
'8RGL'= Northern America|Greenland
'8RGM'= Africa|Gambia
'8RGN'= Africa|Guinea
'8RGP'= Latin America and Caribbean|Guadeloupe
'8RGQ'= Africa|Equatorial Guinea
'8RGR'= Europe|Greece
'8RGT'= Latin America and Caribbean|Guatemala
'8RGU'= Oceania|Guam
'8RGW'= Africa|Guinea-Bissau
'8RGY'= Latin America and Caribbean|Guyana
'8RGZ'= Latin America and Caribbean|Bequia
'8RHA'= Latin America and Caribbean|Bonaire
'8RHB'= Latin America and Caribbean|British Virgin Islands
'8RHC'= Latin America and Caribbean|Curacao
'8RHD'= Latin America and Caribbean|Saba
'8RHE'= Latin America and Caribbean|Saint Barthelemy
'8RHF'= Latin America and Caribbean|Saint Eustatius
'8RHG'= Latin America and Caribbean|Saint Martin
'8RHH'= Latin America and Caribbean|U.S. Virgin Islands
'8RHJ'= Northern America|USA-Central
'8RHK'= Asia|Hong Kong
'8RHN'= Latin America and Caribbean|Honduras
'8RHP'= Northern America|USA-Midwest
'8RHQ'= Northern America|USA
'8RHR'= Northern America|USA-Northeast
'8RHS'= Northern America|USA-Pacific Northwest
'8RHT'= Latin America and Caribbean|Haiti
'8RHU'= Europe|Hungary
'8RHW'= Northern America|USA-Southeast
'8RHX'= Northern America|USA-Southwest
'8RHY'= Northern America|USA-Minor Outlying Islands
'8RIA'= Northern America|USA-West
'8RIB'= Middle East|All Middle Eastern Mediterranean Countries
'8RID'= Asia|Indonesia
'8RIE'= Europe|Ireland
'8RIL'= Middle East|Israel
'8RIM'= Europe|Isle Of Man
'8RIN'= Asia|India
'8RIQ'= Middle East|Iraq
'8RIR'= Middle East|Iran
'8RIS'= Europe|Iceland
'8RIT'= Europe|Italy
'8RJE'= Europe|Jersey
'8RJM'= Latin America and Caribbean|Jamaica
'8RJO'= Middle East|Jordan
'8RJP'= Asia|Japan
'8RKE'= Africa|Kenya
'8RKG'= Asia|Kyrgyzstan
'8RKH'= Asia|Cambodia
'8RKI'= Oceania|Kiribati
'8RKM'= Oceania|Comoros
'8RKN'= Latin America and Caribbean|Saint Kitts and Nevis
'8RKP'= Asia|North Korea
'8RKR'= Asia|South Korea
'8RKW'= Middle East|Kuwait
'8RKY'= Latin America and Caribbean|Cayman Islands
'8RKZ'= Asia|Kazakhstan
'8RLA'= Asia|Laos
'8RLB'= Middle East|Lebanon
'8RLC'= Latin America and Caribbean|Saint Lucia
'8RLI'= Europe|Liechtenstein
'8RLK'= Oceania|Sri Lanka
'8RLR'= Africa|Liberia
'8RLS'= Africa|Lesotho
'8RLT'= Europe|Lithuania
'8RLU'= Europe|Luxembourg
'8RLV'= Europe|Latvia
'8RLY'= Africa|Libyan Arab Jamahiriya
'8RMA'= Africa|Morocco
'8RMC'= Europe|Monaco
'8RMD'= Europe|Moldova
'8RMG'= Oceania|Madagascar
'8RMH'= Oceania|Marshall Islands
'8RMK'= Europe|Macedonia
'8RML'= Africa|Mali
'8RMM'= Asia|Myanmar
'8RMN'= Asia|Mongolia
'8RMO'= Asia|Macao
'8RMP'= Oceania|Northern Mariana Islands
'8RMQ'= Latin America and Caribbean|Martinique
'8RMR'= Africa|Mauritania
'8RMS'= Latin America and Caribbean|Montserrat
'8RMT'= Europe|Malta
'8RMU'= Oceania|Mauritius
'8RMV'= Asia|Maldives
'8RMW'= Africa|Malawi
'8RMX'= Latin America and Caribbean|Mexico
'8RMY'= Asia|Malaysia
'8RMZ'= Africa|Mozambique
'8RNA'= Africa|Namibia
'8RNC'= Oceania|New Caledonia
'8RNE'= Africa|Niger
'8RNF'= Oceania|Norfolk Island
'8RNG'= Africa|Nigeria
'8RNI'= Latin America and Caribbean|Nicaragua
'8RNL'= Europe|Netherlands
'8RNO'= Europe|Norway
'8RNP'= Asia|Nepal
'8RNR'= Oceania|Nauru
'8RNU'= Oceania|Niue
'8RNZ'= Oceania|New Zealand
'8ROM'= Middle East|Oman
'8RPA'= Latin America and Caribbean|Panama
'8RPE'= Latin America and Caribbean|Peru
'8RPF'= Oceania|French Polynesia
'8RPG'= Oceania|Papua New Guinea
'8RPH'= Asia|Philippines
'8RPK'= Asia|Pakistan
'8RPL'= Europe|Poland
'8RPM'= Northern America|Saint Pierre and Miquelon
'8RPN'= Oceania|Pitcairn Islands
'8RPR'= Latin America and Caribbean|Puerto Rico
'8RPT'= Europe|Portugal
'8RPW'= Oceania|Palau
'8RPY'= Latin America and Caribbean|Paraguay
'8RQA'= Middle East|Qatar
'8RQB'= Africa|One Metropolitan Area, Adjoining Cities
'8RQC'= Africa|One Minor City, Up To 250,000 Population
'8RQD'= Asia|One Major City, Over 250,000 Population
'8RQE'= Asia|One Metropolitan Area, Adjoining Cities
'8RQF'= Asia|One Minor City, Up To 250,000 Population
'8RQJ'= Europe|One Major City, Over 250,000 Population
'8RQK'= Europe|One Metropolitan Area, Adjoining Cities
'8RQL'= Europe|One Minor City, Up To 250,000 Population
'8RQM'= Latin America and Caribbean|One Major City, Over 250,000 Population
'8RQN'= Latin America and Caribbean|One Metropolitan Area, Adjoining Cities
'8RQO'= Latin America and Caribbean|One Minor City, Up To 250,000 Population
'8RQP'= Middle East|One Major City, Over 250,000 Population
'8RQR'= Middle East|One Metropolitan Area, Adjoining Cities
'8RQS'= Middle East|One Minor City, Up To 250,000 Population
'8RQT'= Northern America|One Major City, Over 250,000 Population
'8RQU'= Northern America|One Metropolitan Area, Adjoining Cities
'8RQV'= Northern America|One Minor City, Up To 250,000 Population
'8RQW'= Oceania|One Major City, Over 250,000 Population
'8RQX'= Africa|One Major City, Over 250,000 Population
'8RQY'= Oceania|One Metropolitan Area, Adjoining Cities
'8RQZ'= Oceania|One Minor City, Up To 250,000 Population
'8RRB'= Africa|One State Or Province
'8RRC'= Asia|One State Or Province
'8RRE'= Africa|Reunion
'8RRF'= Europe|One State Or Province
'8RRG'= Latin America and Caribbean|One State Or Province
'8RRH'= Middle East|One State Or Province
'8RRJ'= Northern America|One State Or Province
'8RRK'= Oceania|One State Or Province
'8RRO'= Europe|Romania
'8RRU'= Europe|Russian Federation
'8RRW'= Africa|Rwanda
'8RSA'= Middle East|Saudi Arabia
'8RSB'= Oceania|Solomon Islands
'8RSC'= Oceania|Seychelles
'8RSD'= Africa|Sudan
'8RSE'= Europe|Sweden
'8RSG'= Asia|Singapore
'8RSH'= Africa|Saint Helena
'8RSI'= Europe|Slovenia
'8RSK'= Europe|Slovakia
'8RSL'= Africa|Sierra Leone
'8RSM'= Europe|San Marino
'8RSN'= Africa|Senegal
'8RSO'= Africa|Somalia
'8RSR'= Latin America and Caribbean|Suriname
'8RST'= Africa|Sao Tome and Principe
'8RSV'= Latin America and Caribbean|El Salvador
'8RSY'= Middle East|Syria
'8RSZ'= Africa|Swaziland
'8RTC'= Latin America and Caribbean|Turks and Caicos Islands
'8RTD'= Africa|Chad
'8RTG'= Africa|Togo
'8RTH'= Asia|Thailand
'8RTJ'= Asia|Tajikistan
'8RTK'= Oceania|Tokelau
'8RTL'= Asia|Timor-Leste
'8RTM'= Asia|Turkmenistan
'8RTN'= Africa|Tunisia
'8RTO'= Oceania|Tonga
'8RTR'= Middle East|Turkey
'8RTT'= Latin America and Caribbean|Trinidad and Tobago
'8RTV'= Oceania|Tuvalu
'8RTW'= Asia|Taiwan
'8RTZ'= Africa|Tanzania, United Republic Of
'8RUA'= Europe|Ukraine
'8RUB'= Asia|China-East
'8RUC'= Asia|China-North
'8RUD'= Asia|China-South Central
'8RUF'= Asia|China-Southwest
'8RUG'= Africa|Uganda
'8RUH'= Europe|Northern Ireland
'8RUI'= Europe|Wales
'8RUJ'= Latin America and Caribbean|All Latin America
'8RUK'= Northern America|USA-All Territories, Protectorates, Dependencies, Outposts
'8RUL'= Any Regions
'8RUM'= Northern America|Canada-Prairies
'8RUN'= Northern America|Canada-Atlantic Provinces
'8RUP'= Northern America|Canada-Quebec
'8RUQ'= Northern America|Canada-Northern Territories
'8RUR'= Oceania|All Australia and New Zealand
'8RUS'= Oceania|All Oceania excluding Australia and New Zealand
'8RUY'= Latin America and Caribbean|Uruguay
'8RUZ'= Asia|Uzbekistan
'8RVC'= Latin America and Caribbean|Saint Vincent and The Grenadines
'8RVE'= Latin America and Caribbean|Venezuela
'8RVN'= Asia|Viet Nam
'8RVU'= Oceania|Vanuatu
'8RWA'= Broad International Region|Worldwide Excluding Northern America
'8RWB'= Broad International Region|Worldwide Excluding USA
'8RWC'= Broad International Region|Worldwide Excluding USA and Europe
'8RWD'= Broad International Region|Worldwide Excluding Europe
'8RWE'= Broad International Region|Worldwide Excluding USA and UK
'8RWF'= Broad International Region|Worldwide Excluding UK
'8RWG'= Broad International Region|All English Speaking Countries
'8RWH'= Broad International Region|All English Speaking Countries Excluding USA
'8RWI'= Broad International Region|All Spanish Speaking Countries Excluding USA
'8RWJ'= Broad International Region|USA, Canada and Mexico
'8RWS'= Oceania|Samoa
'8RXX'= Not Applicable or None
'8RYB'= Africa|Up To 3 States Or Provinces
'8RYC'= Africa|Up To 5 States Or Provinces
'8RYD'= Asia|Up To 5 States Or Provinces
'8RYE'= Middle East|Yemen
'8RYF'= Europe|Up To 3 States Or Provinces
'8RYG'= Europe|Up To 5 States Or Provinces
'8RYH'= Latin America and Caribbean|Up To 3 States Or Provinces
'8RYI'= Latin America and Caribbean|Up To 5 States Or Provinces
'8RYJ'= Middle East|Up To 3 States Or Provinces
'8RYK'= Northern America|Up To 3 States Or Provinces
'8RYL'= Oceania|Up To 3 States Or Provinces
'8RYM'= Oceania|Up To 5 States Or Provinces
'8RYT'= Africa|Mayotte
'8RZA'= Africa|South Africa
'8RZM'= Africa|Zambia
'8RZW'= Africa|Zimbabwe
'9EIN'= Exclusivity For Industry
'9ELA'= Exclusivity For Language
'9EME'= Exclusivity For Media
'9ENE'= Non-Exclusive
'9ERE'= Exclusivity For Region
'9EXC'= All Exclusive
'9EXX'= Not Applicable or None
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Sep 14, 2016 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PNG.html b/html/TagNames/PNG.html new file mode 100644 index 0000000..14ada9d --- /dev/null +++ b/html/TagNames/PNG.html @@ -0,0 +1,606 @@ + + + + +PNG Tags + + + +

PNG Tags

+

Tags extracted from PNG images. See +http://www.libpng.org/pub/png/spec/1.2/ for the official PNG 1.2 +specification.

+ +

According to the specification, a PNG file should end at the IEND chunk, +however ExifTool will preserve any data found after this when writing unless +it is specifically deleted with -Trailer:All=. When reading, a minor +warning is issued if this trailer exists, and ExifTool will attempt to parse +this data as additional PNG chunks.

+ +

Also according to the PNG specification, there is no restriction on the +location of text-type chunks (tEXt, zTXt and iTXt). However, certain +utilities (including some Apple and Adobe utilities) won't read the XMP iTXt +chunk if it comes after the IDAT chunk, and at least one utility won't read +other text chunks here. For this reason, when writing, ExifTool 11.63 and +later create new text chunks (including XMP) before IDAT, and move existing +text chunks to before IDAT.

+ +

The PNG format contains CRC checksums that are validated when reading with +either the Verbose or Validate option. When writing, these checksums are +validated by default, but the FastScan option may be used to bypass this +check if speed is more of a concern.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'IHDR'ImageHeader---> PNG ImageHeader Tags
'PLTE'Paletteno 
'acTL'AnimationControl---> PNG AnimationControl Tags
'bKGD'BackgroundColorno 
'cHRM'PrimaryChromaticities---> PNG PrimaryChromaticities Tags
'dSIG'DigitalSignatureno 
'eXIf'eXIf---> EXIF Tags +
(this is where ExifTool will create new EXIF)
'fRAc'FractalParametersno 
'gAMA'Gammayes!(ExifTool reports the gamma for decoding the image, which is consistent with +the EXIF convention, but is the inverse of the stored encoding gamma)
'gIFg'GIFGraphicControlExtensionno 
'gIFt'GIFPlainTextExtensionno 
'gIFx'GIFApplicationExtensionno 
'hIST'PaletteHistogramno 
'iCCP'ICC_Profile---> ICC_Profile Tags +
(this is where ExifTool will write a new ICC_Profile. When creating a new +ICC_Profile, the SRGBRendering tag should be deleted if it exists)
'iCCP-name'ProfileNameyes(not a real tag ID, this tag represents the iCCP profile name, and may only +be written when the ICC_Profile is written)
'iDOT'AppleDataOffsetsno 
'iTXt'InternationalText---> PNG TextualData Tags
'oFFs'ImageOffsetno 
'pCAL'PixelCalibrationno 
'pHYs'PhysicalPixel---> PNG PhysicalPixel Tags
'sBIT'SignificantBitsno 
'sCAL'SubjectScale---> PNG SubjectScale Tags
'sPLT'SuggestedPaletteno 
'sRGB'SRGBRenderingyes!(this chunk should not be present if an iCCP chunk exists) +
0 = Perceptual +
1 = Relative Colorimetric +
2 = Saturation +
3 = Absolute Colorimetric
'sTER'StereoImage---> PNG StereoImage Tags
'tEXt'TextualData---> PNG TextualData Tags
'tIME'ModifyDateyes 
'tRNS'Transparencyno 
'tXMP'XMP---> XMP Tags +
(obsolete location specified by a September 2001 XMP draft)
'vpAg'VirtualPage---> PNG VirtualPage Tags
'zTXt'CompressedText---> PNG TextualData Tags
'zxIf'zxIf---> EXIF Tags +
(a once-proposed chunk for compressed EXIF)
+ +

PNG ImageHeader Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ImageWidthno 
4ImageHeightno 
8BitDepthno 
9ColorTypeno0 = Grayscale +
2 = RGB +
3 = Palette +
4 = Grayscale with Alpha +
6 = RGB with Alpha
10Compressionno0 = Deflate/Inflate
11Filterno0 = Adaptive
12Interlaceno0 = Noninterlaced +
1 = Adam7 Interlace
+ +

PNG AnimationControl Tags

+

Tags found in the Animation Control chunk. See +https://wiki.mozilla.org/APNG_Specification for details.

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0AnimationFramesno 
1AnimationPlaysno 
+ +

PNG PrimaryChromaticities Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0WhitePointXno 
1WhitePointYno 
2RedXno 
3RedYno 
4GreenXno 
5GreenYno 
6BlueXno 
7BlueYno 
+ +

PNG TextualData Tags

+

The PNG TextualData format allows arbitrary tag names to be used. The tags +listed below are the only ones that can be written (unless new user-defined +tags are added via the configuration file), however ExifTool will extract +any other TextualData tags that are found. All TextualData tags (including +tags not listed below) are removed when deleting all PNG tags.

+ +

These tags may be stored as tEXt, zTXt or iTXt chunks in the PNG image. By +default ExifTool writes new string-value tags as as uncompressed tEXt, or +compressed zTXt if the Compress (-z) option is used and Compress::Zlib is +available. Alternate language tags and values containing special characters +(unless the Latin character set is used) are written as iTXt, and compressed +if the Compress option is used and Compress::Zlib is available. Raw profile +information is always created as compressed zTXt if Compress::Zlib is +available, or tEXt otherwise. Standard XMP is written as uncompressed iTXt. +User-defined tags may set an 'iTXt' flag in the tag definition to be written +only as iTXt.

+ +

Alternate languages are accessed by suffixing the tag name with a '-', +followed by an RFC 3066 language code (eg. "PNG:Comment-fr", or +"Title-en-US"). See http://www.ietf.org/rfc/rfc3066.txt for the RFC 3066 +specification.

+ +

Some of the tags below are not registered as part of the PNG specification, +but are included here because they are generated by other software such as +ImageMagick.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Artist'Artiststring(unregistered)
'Author'Authorstring 
'Collection'Collectionstring 
'Comment'Commentstring 
'Copyright'Copyrightstring 
'Creation Time'CreationTimestring(stored in RFC-1123 format and converted to/from EXIF format by ExifTool)
'Description'Descriptionstring 
'Disclaimer'Disclaimerstring 
'Document'Documentstring(unregistered)
'Label'Labelstring(unregistered)
'Make'Makestring(unregistered)
'Model'Modelstring(unregistered)
'Raw profile type 8bim'Photoshop_Profile---> Photoshop Tags +
(unregistered)
'Raw profile type APP1'APP1_Profile---> EXIF Tags +
--> XMP Tags +
(unregistered)
'Raw profile type exif'EXIF_Profile---> EXIF Tags +
(unregistered)
'Raw profile type icc'ICC_Profile---> ICC_Profile Tags +
(unregistered)
'Raw profile type icm'ICC_Profile---> ICC_Profile Tags +
(unregistered)
'Raw profile type iptc'IPTC_Profile---> Photoshop Tags +
(unregistered. May be either IPTC IIM or Photoshop IRB format. This is +where ExifTool will add new IPTC, inside a Photoshop IRB container)
'Raw profile type xmp'XMP_Profile---> XMP Tags +
(unregistered)
'Software'Softwarestring 
'Source'Sourcestring 
'TimeStamp'TimeStampstring(unregistered)
'Title'Titlestring 
'URL'URLstring(unregistered)
'Warning'PNGWarningstring 
'XML:com.adobe.xmp'XMP---> XMP Tags +
(unregistered, but this is the location according to the June 2002 or later +XMP specification, and is where ExifTool will add a new XMP chunk if the +image didn't already contain XMP)
'create-date'CreateDatestring(unregistered)
'modify-date'ModDatestring(unregistered)
+ +

PNG PhysicalPixel Tags

+

These tags are found in the PNG pHYs chunk and belong to the PNG-pHYs family +1 group. They are all created together with default values if necessary +when any of these tags is written, and may only be deleted as a group.

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0PixelsPerUnitXint32u(default 2834)
4PixelsPerUnitYint32u(default 2834)
8PixelUnitsint8u(default meters) +
0 = Unknown +
1 = meters
+ +

PNG SubjectScale Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0SubjectUnitsno1 = meters +
2 = radians
1SubjectPixelWidthno 
2SubjectPixelHeightno 
+ +

PNG StereoImage Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0StereoModeno0 = Cross-fuse Layout +
1 = Diverging-fuse Layout
+ +

PNG VirtualPage Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0VirtualImageWidthno 
1VirtualImageHeightno 
2VirtualPageUnitsno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 12, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PSP.html b/html/TagNames/PSP.html new file mode 100644 index 0000000..ba1e5b2 --- /dev/null +++ b/html/TagNames/PSP.html @@ -0,0 +1,161 @@ + + + + +PSP Tags + + + +

PSP Tags

+

Tags extracted from Paint Shop Pro images (PSP, PSPIMAGE, PSPFRAME, +PSPSHAPE, PSPTUBE and TUB extensions).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'FileVersion'FileVersionno 
0x0000ImageInfo---> PSP Image Tags +
--> PSP Image Tags
0x0001CreatorInfo---> PSP Creator Tags
0x000aExtendedInfo---> PSP Ext Tags
+ +

PSP Image Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ImageWidthno 
4ImageHeightno 
8ImageResolutionno 
16ResolutionUnitno0 = None +
1 = inches +
2 = cm
17Compressionno0 = None +
1 = RLE +
2 = LZ77 +
3 = JPEG
19BitsPerSampleno 
21Planesno 
23NumColorsno 
+ +

PSP Creator Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000Titleno 
0x0001CreateDateno 
0x0002ModifyDateno 
0x0003Artistno 
0x0004Copyrightno 
0x0005Descriptionno 
0x0006CreatorAppIDno0 = Unknown +
1 = Paint Shop Pro
0x0007CreatorAppVersionno 
+ +

PSP Ext Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0003EXIFInfo---> EXIF Tags
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 12, 2010 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Palm.html b/html/TagNames/Palm.html new file mode 100644 index 0000000..770b8e9 --- /dev/null +++ b/html/TagNames/Palm.html @@ -0,0 +1,389 @@ + + + + +Palm Tags + + + +

Palm Tags

+

Information extracted from Palm database files (PDB and PRC extensions), +Mobipocket electronic books (MOBI), and Amazon Kindle KF7 and KF8 books (AZW +and AZW3).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0DatabaseNameno 
9CreateDateno 
10ModifyDateno 
11LastBackupDateno 
12ModificationNumberno 
15PalmFileTypeno +
'.pdfADBE' = Adobe Reader +
'BDOCWrdS' = WordSmith +
'BOOKMOBI' = Mobipocket +
'BVokBDIC' = BDicty +
'DATALSdb' = LIST +
'DB99DBOS' = DB (Database program) +
'DataPPrs' = eReader +
'DataPlkr' = Plucker +
'DataSprd' = QuickSheet +
'DataTlMl' = TealMeal +
'DataTlPt' = TealPaint +
'InfoINDB' = InfoView +
'InfoTlIf' = TealInfo +
'JbDbJBas' = JFile +
'JfDbJFil' = JFile Pro +
'Mdb1Mdb1' = MobileDB +
'PNRdPPrs' = eReader +
'PmDBPmDB' = HanDBase +
'SDocSilX' = iSilo 3 +
'SM01SMem' = SuperMemo +
'TEXtREAd' = PalmDOC +
'TEXtTlDc' = TealDoc +
'TdatTide' = Tides +
'ToGoToGo' = iSilo +
'ToRaTRPW' = TomeRaider +
'dataTDBP' = ThinkDB +
'vIMGView' = FireViewer (ImageViewer) +
'zTXTGPlm' = Weasel
+
+ +

Palm MOBI Tags

+

Information extracted from the MOBI header of Mobipocket and Amazon Kindle +KF7 and KF8 files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0Compressionno1 = None +
2 = PalmDOC +
17480 = HUFF/CDIC
1UncompressedTextLengthno 
3Encryptionno0 = None +
1 = Old Mobipocket +
2 = Mobipocket
6MobiTypeno +
2 = Mobipocket Book +
3 = PalmDoc Book +
4 = Audio +
232 = mobipocket? generated by kindlegen1.2 +
248 = KF8: generated by kindlegen2 +
257 = News +
258 = News_Feed +
259 = News_Magazine +
513 = PICS +
514 = WORD +
515 = XLS +
516 = PPT +
517 = TEXT +
518 = HTML
+
7CodePageno1252 = Windows Latin 1 (Western European) +
65001 = Unicode (UTF-8)
9MobiVersionno 
21BookNameno 
26MinimumVersionno 
+ +

Palm EXTH Tags

+

Information extracted from the MOBI extended header.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001DRMServerIDno 
0x0002DRMCommerceIDno 
0x0003DRM_E-BookBaseIDno 
0x0064Authorno 
0x0065Publisherno 
0x0066Imprintno 
0x0067Descriptionno 
0x0068ISBNno 
0x0069Subjectno+ 
0x006aPublishDateno 
0x006bReviewno 
0x006cContributorno 
0x006dRightsno 
0x006eSubjectCodeno 
0x006fBookTypeno 
0x0070Sourceno 
0x0071ASINno 
0x0072BookVersionno 
0x0073SampleFlagno 
0x0074StartReadingno 
0x0075Adultno 
0x0076RetailPriceno 
0x0077RetailPriceCurrencyno 
0x007dResourceCountno 
0x0081KF8CoverURIno 
0x00c8DictionaryShortNameno 
0x00ccCreatorSoftwareno1 = Mobigen +
2 = Mobipocket +
200 = Kindlegen (Windows) +
201 = Kindlegen (Linux) +
202 = Kindlegen (Mac)
0x00cdCreatorMajorVersionno 
0x00ceCreatorMinorVersionno 
0x00cfCreatorBuildNumberno 
0x00d0Watermarkno 
0x00d1Tamper-proofKeysno 
0x0191ClippingLimitno 
0x0192PublisherLimitno 
0x0194TextToSpeechno0 = Enabled +
1 = Disabled
0x0195RentalFlagno 
0x0196RentalExpirationDateno 
0x01f5CDETypeno 
0x01f6LastUpdateTimeno 
0x01f7UpdatedTitleno 
0x01f8ASIN2no 
0x020cLanguageno 
0x020dAlignmentno 
0x0217CreatorBuildNumber2no 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised May 31, 2014 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Panasonic.html b/html/TagNames/Panasonic.html new file mode 100644 index 0000000..873251c --- /dev/null +++ b/html/TagNames/Panasonic.html @@ -0,0 +1,2121 @@ + + + + +Panasonic Tags + + + +

Panasonic Tags

+

+These tags are used in Panasonic/Leica cameras. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001ImageQualityint16u(quality of the main image, which may be in a different file) + +
1 = TIFF +
2 = High +
3 = Normal +
6 = Very High
  7 = RAW +
9 = Motion Picture +
11 = Full HD Movie +
12 = 4k Movie
+
0x0002FirmwareVersionundef(for some camera models such as the FZ30 this may be an internal production +reference number and not the actual firmware version)
0x0003WhiteBalanceint16u + +
1 = Auto +
2 = Daylight +
3 = Cloudy +
4 = Incandescent +
5 = Manual +
8 = Flash +
10 = Black & White
  11 = Manual 2 +
12 = Shade +
13 = Kelvin +
14 = Manual 3 +
15 = Manual 4 +
19 = Auto (cool)
+
0x0007FocusModeint16u + +
1 = Auto +
2 = Manual +
4 = Auto, Focus button +
5 = Auto, Continuous
  6 = AF-S +
7 = AF-C +
8 = AF-F
+
0x000fAFAreaModeint8u[2](DMC-FZ10) +
'0 1' = Spot Mode On +
'0 16' = Spot Mode Off +
(other models)
+
16 = Normal? +
'0 1' = 9-area +
'0 16' = 3-area (high speed) +
'0 23' = 23-area +
'0 49' = 49-area +
'0 225' = 225-area +
'1 0' = Spot Focusing +
'1 1' = 5-area +
'16 0' = 1-area +
'16 16' = 1-area (high speed) +
'32 0' = Tracking +
'32 1' = 3-area (left)? +
'32 2' = 3-area (center)? +
'32 3' = 3-area (right)? +
'64 0' = Face Detect +
'64 1' = Face Detect (animal detect on) +
'64 2' = Face Detect (animal detect off) +
'128 0' = Pinpoint focus +
'240 0' = Tracking
+
0x001aImageStabilizationint16u +
2 = On, Optical +
3 = Off +
4 = On, Mode 2 +
5 = On, Optical Panning +
6 = On, Body-only +
7 = On, Body-only Panning +
9 = Dual IS +
10 = Dual IS Panning +
11 = Dual2 IS +
12 = Dual2 IS Panning
+
0x001cMacroModeint16u1 = On +
2 = Off +
257 = Tele-Macro +
513 = Macro Zoom
0x001fShootingModeint16u + +
1 = Normal +
2 = Portrait +
3 = Scenery +
4 = Sports +
5 = Night Portrait +
6 = Program +
7 = Aperture Priority +
8 = Shutter Priority +
9 = Macro +
10 = Spot +
11 = Manual +
12 = Movie Preview +
13 = Panning +
14 = Simple +
15 = Color Effects +
16 = Self Portrait +
17 = Economy +
18 = Fireworks +
19 = Party +
20 = Snow +
21 = Night Scenery +
22 = Food +
23 = Baby +
24 = Soft Skin +
25 = Candlelight +
26 = Starry Night +
27 = High Sensitivity +
28 = Panorama Assist +
29 = Underwater +
30 = Beach +
31 = Aerial Photo +
32 = Sunset +
33 = Pet +
34 = Intelligent ISO +
35 = Clipboard +
36 = High Speed Continuous Shooting +
37 = Intelligent Auto +
39 = Multi-aspect +
41 = Transform +
42 = Flash Burst
  43 = Pin Hole +
44 = Film Grain +
45 = My Color +
46 = Photo Frame +
48 = Movie +
51 = HDR +
52 = Peripheral Defocus +
55 = Handheld Night Shot +
57 = 3D +
59 = Creative Control +
60 = Intelligent Auto Plus +
62 = Panorama +
63 = Glass Through +
64 = HDR +
66 = Digital Filter +
67 = Clear Portrait +
68 = Silky Skin +
69 = Backlit Softness +
70 = Clear in Backlight +
71 = Relaxing Tone +
72 = Sweet Child's Face +
73 = Distinct Scenery +
74 = Bright Blue Sky +
75 = Romantic Sunset Glow +
76 = Vivid Sunset Glow +
77 = Glistening Water +
78 = Clear Nightscape +
79 = Cool Night Sky +
80 = Warm Glowing Nightscape +
81 = Artistic Nightscape +
82 = Glittering Illuminations +
83 = Clear Night Portrait +
84 = Soft Image of a Flower +
85 = Appetizing Food +
86 = Cute Dessert +
87 = Freeze Animal Motion +
88 = Clear Sports Shot +
89 = Monochrome +
90 = Creative Control +
92 = Handheld Night Shot
+
0x0020Audioint16u1 = Yes +
2 = No +
3 = Stereo
0x0021DataDumpno 
0x0023WhiteBalanceBiasint16s 
0x0024FlashBiasint16s 
0x0025InternalSerialNumberundef[16](this number is unique, and contains the date of manufacture, but is not the +same as the number printed on the camera body)
0x0026PanasonicExifVersionundef 
0x0027VideoFrameRateint16u(only valid for older models) +
0 = n/a
0x0028ColorEffectint16u + +
1 = Off +
2 = Warm +
3 = Cool +
4 = Black & White
  5 = Sepia +
6 = Happy +
8 = Vivid
+
0x0029TimeSincePowerOnint32u(time in 1/100 s from when the camera was powered on to when the image is +written to memory card)
0x002aBurstModeint16u(decoding may be different for some models) +
0 = Off +
1 = On +
2 = Auto Exposure Bracketing (AEB) +
3 = Focus Bracketing +
4 = Unlimited +
8 = White Balance Bracketing +
17 = On (with flash) +
18 = Aperture Bracketing
+
0x002bSequenceNumberint32u 
0x002cContrastModeint16u(this decoding seems to work for some models such as the LC1, LX2, FZ7, FZ8, +FZ18 and FZ50, but may not be correct for other models such as the FX10, G1, L1, +L10 and LC80) +
0x0 = Normal +
0x1 = Low +
0x2 = High +
0x5 = Normal 2 +
0x6 = Medium Low +
0x7 = Medium High +
0xd = High Dynamic +
0x18 = Dynamic Range (film-like) +
0x2e = Match Filter Effects Toy +
0x37 = Match Photo Style L. Monochrome +
0x100 = Low +
0x110 = Normal +
0x120 = High
+(these values are used by the G2, GF1, GF2, GF3, GF5 and GF6) +
0 = -2 +
1 = -1 +
2 = Normal +
3 = +1 +
4 = +2 +
5 = Normal 2 +
7 = Nature (Color Film) +
9 = Expressive +
12 = Smooth (Color Film) or Pure (My Color) +
17 = Dynamic (B&W Film) +
22 = Smooth (B&W Film) +
25 = High Dynamic +
26 = Retro +
27 = Dynamic (Color Film) +
28 = Low Key +
29 = Toy Effect +
32 = Vibrant (Color Film) or Expressive (My Color) +
33 = Elegant (My Color) +
37 = Nostalgic (Color Film) +
41 = Dynamic Art (My Color) +
42 = Retro (My Color) +
45 = Cinema +
47 = Dynamic Mono +
50 = Impressive Art +
51 = Cross Process +
100 = High Dynamic 2 +
101 = Retro 2 +
102 = High Key 2 +
103 = Low Key 2 +
104 = Toy Effect 2 +
107 = Expressive 2 +
112 = Sepia +
117 = Miniature +
122 = Dynamic Monochrome +
127 = Old Days +
132 = Dynamic Monochrome 2 +
135 = Impressive Art 2 +
136 = Cross Process 2 +
137 = Toy Pop +
138 = Fantasy +
256 = Normal 3 +
272 = Standard +
288 = High +
(these values are used by the TZ10 and ZS7) +
0 = Normal +
1 = -2 +
2 = +2 +
5 = -1 +
6 = +1
0x002dNoiseReductionint16u(the encoding for this value is not consistent between models) + +
0 = Standard +
1 = Low (-1) +
2 = High (+1) +
3 = Lowest (-2) +
4 = Highest (+2) +
5 = +5
  6 = +6 +
65531 = -5 +
65532 = -4 +
65533 = -3 +
65534 = -2 +
65535 = -1
+
0x002eSelfTimerint16u +
0 = Off (0) +
1 = Off +
2 = 10 s +
3 = 2 s +
4 = 10 s / 3 pictures +
258 = 2 s after shutter pressed +
266 = 10 s after shutter pressed +
778 = 3 photos after 10 s
+
0x0030Rotationint16u1 = Horizontal (normal) +
3 = Rotate 180 +
6 = Rotate 90 CW +
8 = Rotate 270 CW
0x0031AFAssistLampint16u1 = Fired +
2 = Enabled but Not Used +
3 = Disabled but Required +
4 = Disabled and Not Required
0x0032ColorModeint16u0 = Normal +
1 = Natural +
2 = Vivid
0x0033BabyAgestring(or pet age)
0x0034OpticalZoomModeint16u1 = Standard +
2 = Extended
0x0035ConversionLensint16u1 = Off +
2 = Wide +
3 = Telephoto +
4 = Macro
0x0036TravelDayint16u 
0x0038BatteryLevelint16u + +
1 = Full +
2 = Medium +
3 = Low +
4 = Near Empty
  7 = Near Full +
8 = Medium Low +
256 = n/a
+
0x0039Contrastint16u0 = Normal
0x003aWorldTimeLocationint16u1 = Home +
2 = Destination
0x003bTextStampint16u1 = Off +
2 = On
0x003cProgramISOint16u-1 = n/a +
65534 = Intelligent ISO +
65535 = n/a
0x003dAdvancedSceneTypeint16u(used together with SceneMode to derive Composite AdvancedSceneMode)
0x003eTextStampint16u1 = Off +
2 = On
0x003fFacesDetectedint16u 
0x0040Saturationint16u0 = Normal
0x0041Sharpnessint16u0 = Normal
0x0042FilmModeint16u + +
0 = n/a +
1 = Standard (color) +
2 = Dynamic (color) +
3 = Nature (color) +
4 = Smooth (color)
  5 = Standard (B&W) +
6 = Dynamic (B&W) +
7 = Smooth (B&W) +
10 = Nostalgic +
11 = Vibrant
+
0x0043JPEGQualityint16u0 = n/a (Movie) +
2 = High +
3 = Standard +
6 = Very High +
255 = n/a (RAW only)
0x0044ColorTempKelvinint16u 
0x0045BracketSettingsint16u +
0 = No Bracket +
1 = 3 Images, Sequence 0/-/+ +
2 = 3 Images, Sequence -/0/+ +
3 = 5 Images, Sequence 0/-/+ +
4 = 5 Images, Sequence -/0/+ +
5 = 7 Images, Sequence 0/-/+ +
6 = 7 Images, Sequence -/0/+
+
0x0046WBShiftABint16u(positive is a shift toward blue)
0x0047WBShiftGMint16u(positive is a shift toward green)
0x0048FlashCurtainint16u0 = n/a +
1 = 1st +
2 = 2nd
0x0049LongExposureNoiseReductionint16u1 = Off +
2 = On
0x004bPanasonicImageWidthint32u 
0x004cPanasonicImageHeightint32u 
0x004dAFPointPositionrational64u[2](X Y coordinates of primary AF area center, in the range 0.0 to 1.0)
0x004eFaceDetInfo---> Panasonic FaceDetInfo Tags
0x0051LensTypestring 
0x0052LensSerialNumberstring 
0x0053AccessoryTypestring 
0x0054AccessorySerialNumberstring 
0x0059Transformundef[4](decoded as two 16-bit signed integers) +
'-1 1' = Slim Low +
'-3 2' = Slim High +
'0 0' = Off +
'1 1' = Stretch Low +
'3 2' = Stretch High
0x005dIntelligentExposureint16u(not valid for some models) +
0 = Off +
1 = Low +
2 = Standard +
3 = High
0x0060LensFirmwareVersionundef[4] 
0x0061FaceRecInfo---> Panasonic FaceRecInfo Tags
0x0062FlashWarningint16u0 = No +
1 = Yes (flash required but disabled)
0x0063RecognizedFaceFlags?undef[4] 
0x0065Titleundef 
0x0066BabyNameundef(or pet name)
0x0067Locationundef 
0x0069Countryundef 
0x006bStateundef 
0x006dCityundef(City/Town as stored by some models, or County/Township for others)
0x006fLandmarkundef 
0x0070IntelligentResolutionint8u0 = Off +
1 = Low +
2 = Standard +
3 = High +
4 = Extended
0x0076HDRShotint16u0 = Off +
3 = On
0x0077BurstSpeedint16u(images per second)
0x0079IntelligentD-Rangeint16u0 = Off +
1 = Low +
2 = Standard +
3 = High
0x007cClearRetouchint16u0 = Off +
1 = On
0x0080City2undef(City/Town/Village as stored by some models)
0x0086ManometerPressureint16u 
0x0089PhotoStyleint16u + +
0 = Auto +
1 = Standard or Custom +
2 = Vivid +
3 = Natural +
4 = Monochrome +
5 = Scenery
  6 = Portrait +
8 = Cinelike D +
9 = Cinelike V +
11 = L. Monochrome +
15 = L. Monochrome D
+
0x008aShadingCompensationint16u0 = Off +
1 = On
0x008bWBShiftIntelligentAutoint16u(value is -9 for blue to +9 for amber. Valid for Intelligent-Auto modes)
0x008cAccelerometerZint16u(positive is acceleration upwards)
0x008dAccelerometerXint16u(positive is acceleration to the left)
0x008eAccelerometerYint16u(positive is acceleration backwards)
0x008fCameraOrientationint8u + +
0 = Normal +
1 = Rotate CW +
2 = Rotate 180
  3 = Rotate CCW +
4 = Tilt Upwards +
5 = Tilt Downwards
+
0x0090RollAngleint16u(converted to degrees of clockwise camera rotation)
0x0091PitchAngleint16u(converted to degrees of upward camera tilt)
0x0092WBShiftCreativeControlint8u(WB shift or style strength. Valid for Creative-Control modes)
0x0093SweepPanoramaDirectionint8u0 = Off +
1 = Left to Right +
2 = Right to Left +
3 = Top to Bottom +
4 = Bottom to Top
0x0094SweepPanoramaFieldOfViewint16u 
0x0096TimerRecordingint8u0 = Off +
1 = Time Lapse +
2 = Stop-motion Animation +
3 = Focus Bracketing
0x009dInternalNDFilterrational64u 
0x009eHDRint16u + +
0 = Off +
100 = 1 EV +
200 = 2 EV +
300 = 3 EV
  32868 = 1 EV (Auto) +
32968 = 2 EV (Auto) +
33068 = 3 EV (Auto)
+
0x009fShutterTypeint16u0 = Mechanical +
1 = Electronic +
2 = Hybrid
0x00a1FilterEffectrational64u[0.5] +
'0 0' = Expressive +
'0 2' = Retro +
'0 4' = High Key +
'0 8' = Sepia +
'0 16' = High Dynamic +
'0 32' = Miniature Effect +
'0 1024' = Dynamic Monochrome +
'0 1048576' = Sunshine +
'0 134217728' = Silky Monochrome +
'0 16384' = One Point Color +
'0 2048' = Soft Focus +
'0 2097152' = Bleach Bypass +
'0 256' = Low Key +
'0 32768' = Star Filter +
'0 33554432' = Monochrome +
'0 4096' = Impressive Art +
'0 4194304' = Toy Pop +
'0 512' = Toy Effect +
'0 524288' = Old Days +
'0 67108864' = Rough Monochrome +
'0 8192' = Cross Process +
'0 8388608' = Fantasy
+
0x00a3ClearRetouchValuerational64u 
0x00a7OutputLUTyes(2-column by 432-row binary lookup table of unsigned short values for +converting to 16-bit output (1st column) from 14 bits (2nd column) with +camera contrast)
0x00abTouchAEint16u0 = Off +
1 = On
0x00acMonochromeFilterEffectint16u0 = Off +
1 = Yellow +
2 = Orange +
3 = Red +
4 = Green
0x00adHighlightShadowint16u[2] 
0x00afTimeStampstring 
0x00b3VideoBurstResolutionint16u1 = Off or 4K +
4 = 6K
0x00b4MultiExposureint16u0 = n/a +
1 = Off +
2 = On
0x00b9RedEyeRemovalint16u0 = Off +
1 = On
0x00bbVideoBurstModeint32u +
0x1 = Off +
0x4 = Post Focus +
0x18 = 4K Burst +
0x28 = 4K Burst (Start/Stop) +
0x48 = 4K Pre-burst +
0x108 = Loop Recording +
0x408 = Focus Stacking +
0x810 = 6K Burst +
0x820 = 6K Burst (Start/Stop) +
0x1001 = High Resolution Mode
+
0x00bcDiffractionCorrectionint16u0 = Off +
1 = Auto
0x00bdFocusBracketint16u(positive is further, negative is closer)
0x00beLongExposureNRUsedint16u0 = No +
1 = Yes
0x00bfPostFocusMergingint32u[2]'0 0' = Post Focus Auto Merging or None
0x00c1VideoPreburstint16u0 = No +
1 = 4K or 6K
0x00c4LensTypeMakeint16u 
0x00c5LensTypeModelint16u 
0x00caSensorTypeint16u0 = Multi-aspect +
1 = Standard
0x00d1ISOint32u 
0x00d2MonochromeGrainEffectint16u0 = Off +
1 = Low +
2 = Standard +
3 = High
0x00d6NoiseReductionStrengthrational64s 
0x00e4LensTypeModelint16u 
0x0e00PrintIM---> PrintIM Tags
0x2003TimeInfo---> Panasonic TimeInfo Tags
0x8000MakerNoteVersionundef 
0x8001SceneModeint16u + +
0 = Off +
1 = Normal +
2 = Portrait +
3 = Scenery +
4 = Sports +
5 = Night Portrait +
6 = Program +
7 = Aperture Priority +
8 = Shutter Priority +
9 = Macro +
10 = Spot +
11 = Manual +
12 = Movie Preview +
13 = Panning +
14 = Simple +
15 = Color Effects +
16 = Self Portrait +
17 = Economy +
18 = Fireworks +
19 = Party +
20 = Snow +
21 = Night Scenery +
22 = Food +
23 = Baby +
24 = Soft Skin +
25 = Candlelight +
26 = Starry Night +
27 = High Sensitivity +
28 = Panorama Assist +
29 = Underwater +
30 = Beach +
31 = Aerial Photo +
32 = Sunset +
33 = Pet +
34 = Intelligent ISO +
35 = Clipboard +
36 = High Speed Continuous Shooting +
37 = Intelligent Auto +
39 = Multi-aspect +
41 = Transform +
42 = Flash Burst
  43 = Pin Hole +
44 = Film Grain +
45 = My Color +
46 = Photo Frame +
48 = Movie +
51 = HDR +
52 = Peripheral Defocus +
55 = Handheld Night Shot +
57 = 3D +
59 = Creative Control +
60 = Intelligent Auto Plus +
62 = Panorama +
63 = Glass Through +
64 = HDR +
66 = Digital Filter +
67 = Clear Portrait +
68 = Silky Skin +
69 = Backlit Softness +
70 = Clear in Backlight +
71 = Relaxing Tone +
72 = Sweet Child's Face +
73 = Distinct Scenery +
74 = Bright Blue Sky +
75 = Romantic Sunset Glow +
76 = Vivid Sunset Glow +
77 = Glistening Water +
78 = Clear Nightscape +
79 = Cool Night Sky +
80 = Warm Glowing Nightscape +
81 = Artistic Nightscape +
82 = Glittering Illuminations +
83 = Clear Night Portrait +
84 = Soft Image of a Flower +
85 = Appetizing Food +
86 = Cute Dessert +
87 = Freeze Animal Motion +
88 = Clear Sports Shot +
89 = Monochrome +
90 = Creative Control +
92 = Handheld Night Shot
+
0x8002HighlightWarningint16u0 = Disabled +
1 = No +
2 = Yes
0x8003DarkFocusEnvironmentint16u1 = No +
2 = Yes
0x8004WBRedLevelint16u 
0x8005WBGreenLevelint16u 
0x8006WBBlueLevelint16u 
0x8008TextStampint16u1 = Off +
2 = On
0x8009TextStampint16u1 = Off +
2 = On
0x8010BabyAgestring(or pet age)
0x8012Transformundef[4](decoded as two 16-bit signed integers) +
'-1 1' = Slim Low +
'-3 2' = Slim High +
'0 0' = Off +
'1 1' = Stretch Low +
'3 2' = Stretch High
+ +

Panasonic FaceDetInfo Tags

+

Face detection position information.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0NumFacePositionsint16u(number of detected face positions stored in this record. May be less than +FacesDetected)
1Face1Positionint16u[4](4 numbers: X/Y coordinates of the face center and width/height of face. +Coordinates are relative to an image twice the size of the thumbnail, or 320 +pixels wide)
5Face2Positionint16u[4] 
9Face3Positionint16u[4] 
13Face4Positionint16u[4] 
17Face5Positionint16u[4] 
+ +

Panasonic FaceRecInfo Tags

+

Tags written by cameras with facial recognition. These cameras not only +detect faces in an image, but also recognize specific people based a +user-supplied set of known faces.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FacesRecognizedint16u 
4RecognizedFace1Namestring[20] 
24RecognizedFace1Positionint16u[4](coordinates in same format as face detection tags above)
32RecognizedFace1Agestring[20] 
52RecognizedFace2Namestring[20] 
72RecognizedFace2Positionint16u[4] 
80RecognizedFace2Agestring[20] 
100RecognizedFace3Namestring[20] 
120RecognizedFace3Positionint16u[4] 
128RecognizedFace3Agestring[20] 
+ +

Panasonic TimeInfo Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0PanasonicDateTimeundef[8] 
16TimeLapseShotNumberint32u 
+ +

Panasonic Leica2 Tags

+

These tags are used by the Leica M8.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0300Qualityint16u1 = Fine +
2 = Basic
0x0302UserProfileint32u1 = User Profile 1 +
2 = User Profile 2 +
3 = User Profile 3 +
4 = User Profile 0 (Dynamic)
0x0303SerialNumberint32u 
0x0304WhiteBalanceint16u(values above 0x8000 are converted to Kelvin color temperatures) + +
0 = Auto or Manual +
1 = Daylight +
2 = Fluorescent +
3 = Tungsten
  4 = Flash +
10 = Cloudy +
11 = Shade
+
0x0310LensTypeint32u--> Panasonic LensType Values
0x0311ExternalSensorBrightnessValuerational64s("blue dot" measurement)
0x0312MeasuredLVrational64s(imaging sensor or TTL exposure meter measurement)
0x0313ApproximateFNumberrational64u 
0x0320CameraTemperatureint32s 
0x0321ColorTemperatureint32u 
0x0322WBRedLevelrational64u 
0x0323WBGreenLevelrational64u 
0x0324WBBlueLevelrational64u 
0x0325UV-IRFilterCorrectionint32u0 = Not Active +
1 = Active
0x0330CCDVersionint32u 
0x0331CCDBoardVersionint32u 
0x0332ControllerBoardVersionint32u 
0x0333M16CVersionint32u 
0x0340ImageIDNumberint32u 
+ +

Panasonic LensType Values

+

the LensType value is obtained by splitting the stored value into 2 +integers: The stored value divided by 4, and its lower 2 bits. The second +number is used only if necessary to identify certain manually coded lenses +on the M9, or the focal length of some multi-focal lenses.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueLensTypeValueLensType
1= Elmarit-M 21mm f/2.842= Tri-Elmar-M 28-35-50mm f/4 ASPH.
3= Elmarit-M 28mm f/2.8 (III)43= Summarit-M 35mm f/2.5
4= Tele-Elmarit-M 90mm f/2.8 (II)44= Summarit-M 50mm f/2.5
5= Summilux-M 50mm f/1.4 (II)45= Summarit-M 75mm f/2.5
6= Summicron-M 35mm f/2 (IV)46= Summarit-M 90mm f/2.5
7= Summicron-M 90mm f/2 (II)47= Summilux-M 21mm f/1.4 ASPH.
9= Elmarit-M 135mm f/2.8 (I/II)48= Summilux-M 24mm f/1.4 ASPH.
11= Summaron-M 28mm f/5.649= Noctilux-M 50mm f/0.95 ASPH.
12= Thambar-M 90mm f/2.250= Elmar-M 24mm f/3.8 ASPH.
16= Tri-Elmar-M 16-18-21mm f/4 ASPH.51= Super-Elmar-M 21mm f/3.4 Asph
23= Summicron-M 50mm f/2 (III)52= Apo-Telyt-M 18mm f/3.8 ASPH.
24= Elmarit-M 21mm f/2.8 ASPH.53= Apo-Telyt-M 135mm f/3.4
25= Elmarit-M 24mm f/2.8 ASPH.58= Noctilux-M 75mm f/1.25 ASPH.
26= Summicron-M 28mm f/2 ASPH.'0 0'= Uncoded lens
27= Elmarit-M 28mm f/2.8 (IV)'6 0'= Summilux-M 35mm f/1.4
28= Elmarit-M 28mm f/2.8 ASPH.'9 0'= Apo-Telyt-M 135mm f/3.4
29= Summilux-M 35mm f/1.4 ASPH.'16 1'= Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 16mm)
30= Summicron-M 35mm f/2 ASPH.'16 2'= Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 18mm)
31= Noctilux-M 50mm f/1'16 3'= Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 21mm)
32= Summilux-M 50mm f/1.4 ASPH.'29 0'= Summilux-M 35mm f/1.4 ASPHERICAL
33= Summicron-M 50mm f/2 (IV, V)'31 0'= Noctilux-M 50mm f/1.2
34= Elmar-M 50mm f/2.8'39 0'= Tele-Elmar-M 135mm f/4 (II)
35= Summilux-M 75mm f/1.4'41 3'= Apo-Summicron-M 50mm f/2 ASPH.
36= Apo-Summicron-M 75mm f/2 ASPH.'42 1'= Tri-Elmar-M 28-35-50mm f/4 ASPH. (at 28mm)
37= Apo-Summicron-M 90mm f/2 ASPH.'42 2'= Tri-Elmar-M 28-35-50mm f/4 ASPH. (at 35mm)
38= Elmarit-M 90mm f/2.8'42 3'= Tri-Elmar-M 28-35-50mm f/4 ASPH. (at 50mm)
39= Macro-Elmar-M 90mm f/4'51 2'= Super-Elmar-M 14mm f/3.8 Asph
40= Macro-Adapter M'53 2'= Apo-Telyt-M 135mm f/3.4
41= Apo-Summicron-M 50mm f/2 ASPH.'53 3'= Apo-Summicron-M 50mm f/2 (VI)
+ +

Panasonic Leica3 Tags

+

These tags are used by the Leica R8 and R9 digital backs.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x000bSerialInfo---> Panasonic SerialInfo Tags
0x000dWB_RGBLevelsint16u[3] 
+ +

Panasonic SerialInfo Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
4SerialNumberno 
+ +

Panasonic Leica4 Tags

+

This information is written by the M9.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x3000Subdir3000---> Panasonic Subdir Tags
0x3100Subdir3100---> Panasonic Subdir Tags
0x3400Subdir3400---> Panasonic Subdir Tags
0x3900Subdir3900---> Panasonic Subdir Tags
+ +

Panasonic Subdir Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x300aContrastint32u0 = Low +
1 = Medium Low +
2 = Normal +
3 = Medium High +
4 = High
0x300bSharpeningint32u0 = Off +
1 = Low +
2 = Normal +
3 = Medium High +
4 = High
0x300dSaturationint32u + +
0 = Low +
1 = Medium Low +
2 = Normal +
3 = Medium High
  4 = High +
5 = Black & White +
6 = Vintage B&W
+
0x3033WhiteBalanceint32u +
0 = Auto +
1 = Tungsten +
2 = Fluorescent +
3 = Daylight Fluorescent +
4 = Daylight +
5 = Flash +
6 = Cloudy +
7 = Shade +
8 = Manual +
9 = Kelvin
+
0x3034JPEGQualityint32u94 = Basic +
97 = Fine
0x3036WB_RGBLevelsrational64u[3] 
0x3038UserProfilestring 
0x303aJPEGSizeint32u0 = 5216x3472 +
1 = 3840x2592 +
2 = 2592x1728 +
3 = 1728x1152 +
4 = 1280x864
0x3103SerialNumberstring 
0x3109FirmwareVersionstring 
0x312aBaseISOint32u 
0x312bSensorWidthint32u 
0x312cSensorHeightint32u 
0x312dSensorBitDepthint32u 
0x3402CameraTemperatureint32s 
0x3405LensTypeint32u--> Panasonic LensType Values
0x3406ApproximateFNumberrational64u 
0x3407MeasuredLVint32s(imaging sensor or TTL exposure meter measurement)
0x3408ExternalSensorBrightnessValueint32s("blue dot" measurement)
0x3901Data1---> Panasonic Data1 Tags
0x3902Data2---> Panasonic Data2 Tags
+ +

Panasonic Data1 Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
22LensTypeint32u--> Panasonic LensType Values
+ +

Panasonic Data2 Tags

+
+
+ + + + +
Index1Tag NameWritableValues / Notes
[no tags known]
+ +

Panasonic Leica5 Tags

+

This information is written by the X1, X2, X VARIO and T.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0303LensTypestring(Leica T only)
0x0305SerialNumberint32u 
0x0407OriginalFileNamestring 
0x0408OriginalDirectorystring 
0x040aFocusInfo---> Panasonic FocusInfo Tags
0x040dExposureModeint8u[4]'0 0 0 0' = Program AE +
'1 0 0 0' = Aperture-priority AE +
'1 1 0 0' = Aperture-priority AE (1) +
'2 0 0 0' = Shutter speed priority AE +
'3 0 0 0' = Manual
0x0410ShotInfo---> Panasonic ShotInfo Tags
0x0412FilmModestring 
0x0413WB_RGBLevelsrational64u[3] 
0x0500InternalSerialNumberundef 
+ +

Panasonic FocusInfo Tags

+
+
+ + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0FocusDistanceint16u 
1FocalLengthint16u 
+ +

Panasonic ShotInfo Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0FileIndexint16u 
+ +

Panasonic Leica6 Tags

+

This information is written by the S2 and M (Typ 240), as a trailer in JPEG +images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0300PreviewImageundef(S2 and M (Typ 240))
0x0301UnknownBlock?no(unknown 320kB block, not copied to JPEG images)
0x0303LensTypestring 
0x0304FocusDistanceint32u(focus distance in mm for most models, but cm for others)
0x0311ExternalSensorBrightnessValuerational64s(Leica S only)
0x0312MeasuredLVrational64s(Leica S only)
0x0320FirmwareVersionint8u[4](Leica S only)
0x0321LensSerialNumberint32u(Leica S only)
+ +

Panasonic Leica9 Tags

+

This information is written by the Leica S (Typ 007) and M10 models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0304FocusDistanceint32u(focus distance in mm for most models, but cm for others)
0x0311ExternalSensorBrightnessValuerational64s 
0x0312MeasuredLVrational64s 
0x034cUserProfilestring 
0x0359ISOSelectedint32s0 = Auto
0x035aFNumberint32s 
0x035bCorrelatedColorTempint16u 
0x035cColorTintint16s 
0x035dWhitePointrational64u[2] 
+ +

Panasonic Type2 Tags

+

This type of maker notes is used by models such as the NV-DS65, PV-D2002, +PV-DC3000, PV-DV203, PV-DV401, PV-DV702, PV-L2001, PV-SD4090, PV-SD5000 and +iPalm.

+
+
+ + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0MakerNoteTypeno 
3Gainno 
+ +

Panasonic PANA Tags

+

Tags extracted from the PANA and LEIC user data found in MP4 videos from +various Panasonic and Leica models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
4Modelno 
12Modelno 
16JPEG-likeData---> EXIF Tags
22Modelno 
52Version1no 
62Version2no 
80MakerNoteLeica5---> Panasonic Leica5 Tags
88ThumbnailWidthno(Panasonic models)
90ThumbnailHeightno 
92ThumbnailImageno 
1334ThumbnailWidthno(Leica X Vario)
1338ThumbnailHeightno 
1342ThumbnailLengthno 
1350ThumbnailImageno 
1358ThumbnailWidthno(Leica X Vario)
1362ThumbnailHeightno 
1366ThumbnailLengthno 
1374ThumbnailImageno 
16488ExifData---> EXIF Tags
16512ExifData---> EXIF Tags
0x00200080ExifData---> EXIF Tags
+ +

Panasonic AdvancedSceneMode Values

+

A Composite tag derived from Model, SceneMode and AdvancedSceneType.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueAdvancedSceneModeValueAdvancedSceneMode
'0 1'= Off'59 1'= Expressive
'2 2'= Outdoor Portrait'59 2'= Retro
'2 3'= Indoor Portrait'59 3'= High Key
'2 4'= Creative Portrait'59 4'= Sepia
'3 2'= Nature'59 5'= High Dynamic
'3 3'= Architecture'59 6'= Miniature
'3 4'= Creative Scenery'59 9'= Low Key
'4 2'= Outdoor Sports'59 10'= Toy Effect
'4 3'= Indoor Sports'59 11'= Dynamic Monochrome
'4 4'= Creative Sports'59 12'= Soft
'9 2'= Flower'66 1'= Impressive Art
'9 3'= Objects'66 2'= Cross Process
'9 4'= Creative Macro'66 3'= Color Select
'18 1'= High Sensitivity'66 4'= Star
'20 1'= Fireworks'90 3'= Old Days
'21 2'= Illuminations'90 4'= Sunshine
'21 4'= Creative Night Scenery'90 5'= Bleach Bypass
'26 1'= High-speed Burst (shot 1)'90 6'= Toy Pop
'27 1'= High-speed Burst (shot 2)'90 7'= Fantasy
'29 1'= Snow'90 8'= Monochrome
'30 1'= Starry Sky'90 9'= Rough Monochrome
'31 1'= Beach'90 10'= Silky Monochrome
'36 1'= High-speed Burst (shot 3)'92 1'= Handheld Night Shot
'39 1'= Aerial Photo / Underwater / Multi-aspect'DMC-TZ40 90 1'= Expressive
'45 2'= Cinema'DMC-TZ40 90 2'= Retro
'45 7'= Expressive'DMC-TZ40 90 3'= High Key
'45 8'= Retro'DMC-TZ40 90 4'= Sepia
'45 9'= Pure'DMC-TZ40 90 5'= High Dynamic
'45 10'= Elegant'DMC-TZ40 90 6'= Miniature
'45 12'= Monochrome'DMC-TZ40 90 9'= Low Key
'45 13'= Dynamic Art'DMC-TZ40 90 10'= Toy Effect
'45 14'= Silhouette'DMC-TZ40 90 11'= Dynamic Monochrome
'51 2'= HDR Art'DMC-TZ40 90 12'= Soft
'51 3'= HDR B&W  
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 1, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PanasonicRaw.html b/html/TagNames/PanasonicRaw.html new file mode 100644 index 0000000..06f351d --- /dev/null +++ b/html/TagNames/PanasonicRaw.html @@ -0,0 +1,671 @@ + + + + +PanasonicRaw Tags + + + +

PanasonicRaw Tags

+

These tags are found in IFD0 of Panasonic/Leica RAW, RW2 and RWL images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001PanasonicRawVersionundef 
0x0002SensorWidthno 
0x0003SensorHeightno 
0x0004SensorTopBorderno 
0x0005SensorLeftBorderno 
0x0006SensorBottomBorderno 
0x0007SensorRightBorderno 
0x0008SamplesPerPixelint16u! 
0x0009CFAPatternint16u!0 = n/a +
1 = [Red,Green][Green,Blue] +
2 = [Green,Red][Blue,Green] +
3 = [Green,Blue][Red,Green] +
4 = [Blue,Green][Green,Red]
0x000aBitsPerSampleint16u! 
0x000bCompressionint16u!34316 = Panasonic RAW 1 +
34826 = Panasonic RAW 2 +
34828 = Panasonic RAW 3 +
34830 = Panasonic RAW 4
0x000eLinearityLimitRedint16u 
0x000fLinearityLimitGreenint16u 
0x0010LinearityLimitBlueint16u 
0x0011RedBalanceint16u(found in Digilux 2 RAW images)
0x0012BlueBalanceint16u 
0x0013WBInfo---> PanasonicRaw WBInfo Tags
0x0017ISOint16u 
0x0018HighISOMultiplierRedint16u 
0x0019HighISOMultiplierGreenint16u 
0x001aHighISOMultiplierBlueint16u 
0x001bNoiseReductionParamsundef[n]!(the camera's default noise reduction setup. The first number is the number +of entries, then for each entry there are 4 numbers: an ISO speed, and +noise-reduction strengths the R, G and B channels)
0x001cBlackLevelRedint16u 
0x001dBlackLevelGreenint16u 
0x001eBlackLevelBlueint16u 
0x0024WBRedLevelint16u 
0x0025WBGreenLevelint16u 
0x0026WBBlueLevelint16u 
0x0027WBInfo2---> PanasonicRaw WBInfo2 Tags
0x002dRawFormatint16u! 
0x002eJpgFromRawundef!--> JPEG Tags +
(processed as an embedded document because it contains full EXIF)
0x002fCropTopint16u 
0x0030CropLeftint16u 
0x0031CropBottomint16u 
0x0032CropRightint16u 
0x010fMakestring 
0x0110Modelstring 
0x0111StripOffsetsno 
0x0112Orientationint16u +
1 = Horizontal (normal) +
2 = Mirror horizontal +
3 = Rotate 180 +
4 = Mirror vertical +
5 = Mirror horizontal and rotate 270 CW +
6 = Rotate 90 CW +
7 = Mirror horizontal and rotate 90 CW +
8 = Rotate 270 CW
+
0x0116RowsPerStripno 
0x0117StripByteCountsno 
0x0118RawDataOffsetno 
0x0119DistortionInfo---> PanasonicRaw DistortionInfo Tags
0x011cGammaint16u 
0x0120CameraIFD---> PanasonicRaw CameraIFD Tags
0x0121Multishotint32u0 = Off +
65536 = Pixel Shift
0x02bcApplicationNotesint8u!--> XMP Tags
0x83bbIPTC-NAAint32u!--> IPTC Tags
0x8769ExifOffset---> EXIF Tags
0x8825GPSInfo---> GPS Tags
+ +

PanasonicRaw WBInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0NumWBEntriesint16u 
1WBType1int16u--> EXIF LightSource Values
2WB_RBLevels1int16u[2] 
4WBType2int16u--> EXIF LightSource Values
5WB_RBLevels2int16u[2] 
7WBType3int16u--> EXIF LightSource Values
8WB_RBLevels3int16u[2] 
10WBType4int16u--> EXIF LightSource Values
11WB_RBLevels4int16u[2] 
13WBType5int16u--> EXIF LightSource Values
14WB_RBLevels5int16u[2] 
16WBType6int16u--> EXIF LightSource Values
17WB_RBLevels6int16u[2] 
19WBType7int16u--> EXIF LightSource Values
20WB_RBLevels7int16u[2] 
+ +

PanasonicRaw WBInfo2 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0NumWBEntriesint16u 
1WBType1int16u--> EXIF LightSource Values
2WB_RGBLevels1int16u[3] 
5WBType2int16u--> EXIF LightSource Values
6WB_RGBLevels2int16u[3] 
9WBType3int16u--> EXIF LightSource Values
10WB_RGBLevels3int16u[3] 
13WBType4int16u--> EXIF LightSource Values
14WB_RGBLevels4int16u[3] 
17WBType5int16u--> EXIF LightSource Values
18WB_RGBLevels5int16u[3] 
21WBType6int16u--> EXIF LightSource Values
22WB_RGBLevels6int16u[3] 
25WBType7int16u--> EXIF LightSource Values
26WB_RGBLevels7int16u[3] 
+ +

PanasonicRaw DistortionInfo Tags

+

Lens distortion correction information.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0002DistortionParam02int16s 
0x0004DistortionParam04int16s 
0x0005DistortionScaleint16s 
7.1DistortionCorrectionint16s[val & 0xf] +
0 = Off +
1 = On
0x0008DistortionParam08int16s 
0x0009DistortionParam09int16s 
0x000bDistortionParam11int16s 
0x000cDistortionN?int16s 
+ +

PanasonicRaw CameraIFD Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x1001MultishotOnno0 = No +
1 = Yes
0x1100FocusStepNearno 
0x1101FocusStepCountno 
0x1102FlashFiredno0 = No +
1 = Yes
0x1105ZoomPositionno(in the range 0-255 for most cameras)
0x1200LensAttachedno(many CameraIFD tags are invalid if there is no lens attached) +
0 = No +
1 = Yes
0x1201LensTypeMakeno 
0x1202LensTypeModelno 
0x1203FocalLengthIn35mmFormatno 
0x1301ApertureValueno 
0x1302ShutterSpeedValueno 
0x1303SensitivityValueno 
0x1305HighISOModeno1 = On +
2 = Off
0x1412FacesDetectedno0 = No +
1 = Yes
0x3200WB_CFA0_LevelDaylightno 
0x3201WB_CFA1_LevelDaylightno 
0x3202WB_CFA2_LevelDaylightno 
0x3203WB_CFA3_LevelDaylightno 
0x3300WhiteBalanceSetno--> PanasonicRaw WhiteBalance Values
0x3420WB_RedLevelAutono 
0x3421WB_BlueLevelAutono 
0x3501Orientationno +
1 = Horizontal (normal) +
2 = Mirror horizontal +
3 = Rotate 180 +
4 = Mirror vertical +
5 = Mirror horizontal and rotate 270 CW +
6 = Rotate 90 CW +
7 = Mirror horizontal and rotate 90 CW +
8 = Rotate 270 CW
+
0x3600WhiteBalanceDetectedno--> PanasonicRaw WhiteBalance Values
+ +

PanasonicRaw WhiteBalance Values

+
+
+ + + + + + + + + + + + + + + + + +
ValueWhiteBalanceValueWhiteBalanceValueWhiteBalance
0= Auto5= Flash10= Custom#3
1= Daylight6= n/a11= Custom#4
2= Cloudy7= n/a12= Shade
3= Tungsten8= Custom#113= Kelvin
4= n/a9= Custom#216= AWBc
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 27, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Parrot.html b/html/TagNames/Parrot.html new file mode 100644 index 0000000..f080c92 --- /dev/null +++ b/html/TagNames/Parrot.html @@ -0,0 +1,676 @@ + + + + +Parrot Tags + + + +

Parrot mett Tags

+

Streaming metadata found in Parrot drone videos. See +https://developer.parrot.com/docs/pdraw/metadata.html for the +specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'P1'ParrotV1---> Parrot V1 Tags
'P2'ParrotV2---> Parrot V2 Tags
'P3'ParrotV3---> Parrot V3 Tags
'E1'ParrotTimeStamp---> Parrot TimeStamp Tags
'E2'ParrotFollowMe---> Parrot FollowMe Tags
'E3'ParrotAutomation---> Parrot Automation Tags
'application/arcore-accel'ARCoreAccel---> Parrot ARCoreAccel Tags
'application/arcore-custom-event'ARCoreCustom---> Parrot ARCoreCustom Tags
'application/arcore-gyro'ARCoreGyro---> Parrot ARCoreGyro Tags
'application/arcore-video-0'ARCoreVideo---> Parrot ARCoreVideo Tags
+ +

Parrot V1 Tags

+

Parrot version 1 streaming metadata.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4DroneYawno 
6DronePitchno 
8DroneRollno 
10CameraPanno 
12CameraTiltno 
14FrameViewno 
22ExposureTimeno 
24ISOno 
26WifiRSSIno 
27Batteryno 
28GPSLatitudeno 
32GPSLongitudeno 
36GPSAltitudeno[val >> 8 & 0xffffff]
36.1GPSSatellitesno[val & 0xff]
40AltitudeFromTakeOffno 
44DistanceFromHomeno 
48SpeedXno 
50SpeedYno 
52SpeedZno 
54Binningno[val >> 7 & 0x1]
54.1FlyingStateno[val & 0x7f] + +
0 = Landed +
1 = Taking Off +
2 = Hovering
  3 = Flying +
4 = Landing +
5 = Emergency
+
55Animationno[val >> 7 & 0x1]
55.1PilotingModeno[val & 0x7f] +
0 = Manual +
1 = Return Home +
2 = Flight Plan +
3 = Follow Me
+ +

Parrot V2 Tags

+

Parrot version 2 basic streaming metadata.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4Elevationno(estimated distance from ground)
8GPSLatitudeno 
12GPSLongitudeno 
16GPSAltitudeno[val >> 8 & 0xffffff]
16.1GPSSatellitesno[val & 0xff]
20GPSVelocityNorthno 
22GPSVelocityEastno 
24GPSVelocityDownno 
26AirSpeedno 
28DroneQuaternionno 
36FrameViewno 
44CameraPanno 
46CameraTiltno 
48ExposureTimeno 
50ISOno 
52Binningno[val >> 7 & 0x1]
52.1FlyingStateno[val & 0x7f] + +
0 = Landed +
1 = Taking Off +
2 = Hovering +
3 = Flying +
4 = Landing
  5 = Emergency +
6 = User Takeoff +
7 = Motor Ramping +
8 = Emergency Landing
+
53Animationno[val >> 7 & 0x1]
53.1PilotingModeno[val & 0x7f] +
0 = Manual +
1 = Return Home +
2 = Flight Plan +
3 = Follow Me / Tracking +
4 = Magic Carpet +
5 = Move To
+
54WifiRSSIno 
55Batteryno 
'Groups'Groupsno 
+ +

Parrot V3 Tags

+

Parrot version 3 basic streaming metadata.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4Elevationno(estimated distance from ground)
8GPSLatitudeno 
12GPSLongitudeno 
16GPSAltitudeno[val >> 8 & 0xffffff]
16.1GPSSatellitesno[val & 0xff]
20GPSVelocityNorthno 
22GPSVelocityEastno 
24GPSVelocityDownno 
26AirSpeedno 
28DroneQuaternionno 
36FrameBaseViewno 
44FrameViewno 
52ExposureTimeno 
54ISOno 
56RedBalanceno 
58BlueBalanceno 
60FOVno(horizontal and vertical field of view in degrees)
64LinkGoodputno[val >> 8 & 0xffffff]
64.1LinkQualityno(0-5) +
[val & 0xff]
68WifiRSSIno 
69Batteryno 
70Binningno[val >> 7 & 0x1]
70.1FlyingStateno[val & 0x7f] + +
0 = Landed +
1 = Taking Off +
2 = Hovering +
3 = Flying +
4 = Landing
  5 = Emergency +
6 = User Takeoff +
7 = Motor Ramping +
8 = Emergency Landing
+
71Animationno[val >> 7 & 0x1]
71.1PilotingModeno[val & 0x7f] +
0 = Manual +
1 = Return Home +
2 = Flight Plan +
3 = Follow Me / Tracking +
4 = Magic Carpet +
5 = Move To
+
+ +

Parrot TimeStamp Tags

+

Parrot streaming metadata timestamp extension.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
4TimeStampno 
+ +

Parrot FollowMe Tags

+

Parrot streaming metadata follow-me extension.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4GPSTargetLatitudeno 
8GPSTargetLongitudeno 
12GPSTargetAltitudeno 
16Follow-meModenoBit 0 = Follow-me enabled +
Bit 1 = Follow-me +
Bit 2 = Angle locked
17Follow-meAnimationno0 = None +
1 = Orbit +
2 = Boomerang +
3 = Parabola +
4 = Zenith
+ +

Parrot Automation Tags

+

Parrot streaming metadata automation extension.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4GPSFramingLatitudeno 
8GPSFramingLongitudeno 
12GPSFramingAltitudeno 
16GPSDestLatitudeno 
20GPSDestLongitudeno 
24GPSDestAltitudeno 
28AutomationAnimationno + +
0 = None +
1 = Orbit +
2 = Boomerang +
3 = Parabola +
4 = Dolly Slide +
5 = Dolly Zoom +
6 = Reveal Vertical +
7 = Reveal Horizontal
  8 = Candle +
9 = Flip Front +
10 = Flip Back +
11 = Flip Left +
12 = Flip Right +
13 = Twist Up +
14 = Position Twist Up
+
29AutomationFlagsnoBit 0 = Follow-me enabled +
Bit 1 = Look-at-me enabled +
Bit 2 = Angle locked
+ +

Parrot ARCoreAccel Tags

+

ARCore accelerometer data.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4AccelerometerUnknown?no 
5Accelerometerno 
+ +

Parrot ARCoreCustom Tags

+
+
+ + + + +
Index1Tag NameWritableValues / Notes
[no tags known]
+ +

Parrot ARCoreGyro Tags

+

ARCore accelerometer data.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4GyroscopeUnknown?no 
5Gyroscopeno 
+ +

Parrot ARCoreVideo Tags

+
+
+ + + + +
Index1Tag NameWritableValues / Notes
[no tags known]
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 21, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Pentax.html b/html/TagNames/Pentax.html new file mode 100644 index 0000000..b7553d2 --- /dev/null +++ b/html/TagNames/Pentax.html @@ -0,0 +1,4924 @@ + + + + +Pentax Tags + + + +

Pentax Tags

+

+These tags are used in Pentax/Asahi cameras. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000PentaxVersionint8u[4] 
0x0001PentaxModelTypeint16u 
0x0002PreviewImageSizeint16u[2] 
0x0003PreviewImageLengthint32u* 
0x0004PreviewImageStartint32u* 
0x0005PentaxModelIDint32u--> Pentax PentaxModelID Values
0x0006Dateundef[4](changing either Date or Time will affect ShutterCount decryption)
0x0007Timeundef[3] 
0x0008Qualityint16u + +
0 = Good +
1 = Better +
2 = Best +
3 = TIFF +
4 = RAW
  5 = Premium +
7 = RAW (pixel shift enabled) +
8 = Dynamic Pixel Shift +
65535 = n/a
+
0x0009PentaxImageSizeint16u + +
0 = 640x480 +
1 = Full +
2 = 1024x768 +
3 = 1280x960 +
4 = 1600x1200 +
5 = 2048x1536 +
8 = 2560x1920 or 2304x1728 +
9 = 3072x2304 +
10 = 3264x2448 +
19 = 320x240 +
20 = 2288x1712 +
21 = 2592x1944 +
22 = 2304x1728 or 2592x1944 +
23 = 3056x2296 +
25 = 2816x2212 or 2816x2112 +
27 = 3648x2736
  29 = 4000x3000 +
30 = 4288x3216 +
31 = 4608x3456 +
129 = 1920x1080 +
135 = 4608x2592 +
257 = 3216x3216 +
'0 0' = 2304x1728 +
'4 0' = 1600x1200 +
'5 0' = 2048x1536 +
'8 0' = 2560x1920 +
'32 2' = 960x640 +
'33 2' = 1152x768 +
'34 2' = 1536x1024 +
'35 1' = 2400x1600 +
'36 0' = 3008x2008 or 3040x2024 +
'37 0' = 3008x2000
+
0x000bPictureModeint16u[n](1 or 2 values. Decimal values differentiate Optio 555 modes which are +different from other models) +
[Value 0]
+ +
0 = Program +
0.1 = Av +
1 = Shutter Speed Priority +
1.1 = M +
2 = Program AE +
2.1 = Tv +
3 = Manual +
3.1 = USER +
5 = Portrait +
6 = Landscape +
8 = Sport +
9 = Night Scene +
11 = Soft +
12 = Surf & Snow +
13 = Candlelight +
14 = Autumn +
15 = Macro +
17 = Fireworks +
18 = Text +
19 = Panorama +
20 = 3-D +
21 = Black & White +
22 = Sepia +
23 = Red +
24 = Pink +
25 = Purple +
26 = Blue +
27 = Green +
28 = Yellow +
30 = Self Portrait
  31 = Illustrations +
33 = Digital Filter +
35 = Night Scene Portrait +
37 = Museum +
38 = Food +
39 = Underwater +
40 = Green Mode +
49 = Light Pet +
50 = Dark Pet +
51 = Medium Pet +
53 = Underwater +
54 = Candlelight +
55 = Natural Skin Tone +
56 = Synchro Sound Record +
58 = Frame Composite +
59 = Report +
60 = Kids +
61 = Blur Reduction +
63 = Panorama 2 +
65 = Half-length Portrait +
66 = Portrait 2 +
74 = Digital Microscope +
75 = Blue Sky +
80 = Miniature +
81 = HDR +
83 = Fisheye +
85 = Digital Filter 4 +
221 = P +
255 = PICT
+
0x000cFlashModeint16u[n][Value 0] +
0x0 = Auto, Did not fire +
0x1 = Off, Did not fire +
0x2 = On, Did not fire +
0x3 = Auto, Did not fire, Red-eye reduction +
0x5 = On, Did not fire, Wireless (Master) +
0x100 = Auto, Fired +
0x102 = On, Fired +
0x103 = Auto, Fired, Red-eye reduction +
0x104 = On, Red-eye reduction +
0x105 = On, Wireless (Master) +
0x106 = On, Wireless (Control) +
0x108 = On, Soft +
0x109 = On, Slow-sync +
0x10a = On, Slow-sync, Red-eye reduction +
0x10b = On, Trailing-curtain Sync
+[Value 1] +
0x0 = n/a - Off-Auto-Aperture +
0x3f = Internal +
0x100 = External, Auto +
0x23f = External, Flash Problem +
0x300 = External, Manual +
0x304 = External, P-TTL Auto +
0x305 = External, Contrast-control Sync +
0x306 = External, High-speed Sync +
0x30c = External, Wireless +
0x30d = External, Wireless, High-speed Sync
+
0x000dFocusModeint16u(Pentax models) + +
0 = Normal +
1 = Macro +
2 = Infinity +
3 = Manual +
4 = Super Macro +
5 = Pan Focus +
16 = AF-S (Focus-priority) +
17 = AF-C (Focus-priority)
  18 = AF-A (Focus-priority) +
32 = Contrast-detect (Focus-priority) +
33 = Tracking Contrast-detect (Focus-priority) +
272 = AF-S (Release-priority) +
273 = AF-C (Release-priority) +
274 = AF-A (Release-priority) +
288 = Contrast-detect (Release-priority)
+(Asahi models) +
0 = Normal +
1 = Macro (1) +
2 = Macro (2) +
3 = Infinity
0x000eAFPointSelectedint16u(K-1) +
[Value 0]
+ +
0 = None +
1 = Top-left +
2 = Top Near-left +
3 = Top +
4 = Top Near-right +
5 = Top-right +
6 = Upper Far-left +
7 = Upper-left +
8 = Upper Near-left +
9 = Upper-middle +
10 = Upper Near-right +
11 = Upper-right +
12 = Upper Far-right +
13 = Far Far Left +
14 = Far Left +
15 = Left +
16 = Near-left +
17 = Center +
18 = Near-right +
19 = Right +
20 = Far Right +
21 = Far Far Right +
22 = Lower Far-left +
23 = Lower-left +
24 = Lower Near-left +
25 = Lower-middle +
26 = Lower Near-right +
27 = Lower-right
  28 = Lower Far-right +
29 = Bottom-left +
30 = Bottom Near-left +
31 = Bottom +
32 = Bottom Near-right +
33 = Bottom-right +
263 = Zone Select Upper-left +
264 = Zone Select Upper Near-left +
265 = Zone Select Upper Middle +
266 = Zone Select Upper Near-right +
267 = Zone Select Upper-right +
270 = Zone Select Far Left +
271 = Zone Select Left +
272 = Zone Select Near-left +
273 = Zone Select Center +
274 = Zone Select Near-right +
275 = Zone Select Right +
276 = Zone Select Far Right +
279 = Zone Select Lower-left +
280 = Zone Select Lower Near-left +
281 = Zone Select Lower-middle +
282 = Zone Select Lower Near-right +
283 = Zone Select Lower-right +
65531 = AF Select +
65532 = Face Detect AF +
65533 = Automatic Tracking AF +
65534 = Fixed Center +
65535 = Auto
+[Value 1] + +
0 = Single Point +
1 = Expanded Area 9-point (S)
  3 = Expanded Area 25-point (M) +
5 = Expanded Area 33-point (L)
+(K-3) +
[Value 0]
+ +
0 = None +
1 = Top-left +
2 = Top Near-left +
3 = Top +
4 = Top Near-right +
5 = Top-right +
6 = Upper-left +
7 = Upper Near-left +
8 = Upper-middle +
9 = Upper Near-right +
10 = Upper-right +
11 = Far Left +
12 = Left +
13 = Near-left +
14 = Center +
15 = Near-right +
16 = Right +
17 = Far Right +
18 = Lower-left +
19 = Lower Near-left +
20 = Lower-middle +
21 = Lower Near-right +
22 = Lower-right +
23 = Bottom-left +
24 = Bottom Near-left +
25 = Bottom +
26 = Bottom Near-right +
27 = Bottom-right +
257 = Zone Select Top-left +
258 = Zone Select Top Near-left
  259 = Zone Select Top +
260 = Zone Select Top Near-right +
261 = Zone Select Top-right +
262 = Zone Select Upper-left +
263 = Zone Select Upper Near-left +
264 = Zone Select Upper-middle +
265 = Zone Select Upper Near-right +
266 = Zone Select Upper-right +
267 = Zone Select Far Left +
268 = Zone Select Left +
269 = Zone Select Near-left +
270 = Zone Select Center +
271 = Zone Select Near-right +
272 = Zone Select Right +
273 = Zone Select Far Right +
274 = Zone Select Lower-left +
275 = Zone Select Lower Near-left +
276 = Zone Select Lower-middle +
277 = Zone Select Lower Near-right +
278 = Zone Select Lower-right +
279 = Zone Select Bottom-left +
280 = Zone Select Bottom Near-left +
281 = Zone Select Bottom +
282 = Zone Select Bottom Near-right +
283 = Zone Select Bottom-right +
65531 = AF Select +
65532 = Face Detect AF +
65533 = Automatic Tracking AF +
65534 = Fixed Center +
65535 = Auto
+[Value 1] + +
0 = Single Point +
1 = Expanded Area 9-point (S)
  3 = Expanded Area 25-point (M) +
5 = Expanded Area 27-point (L)
+(other models) +
[Value 0]
+ +
0 = None +
1 = Upper-left +
2 = Top +
3 = Upper-right +
4 = Left +
5 = Mid-left +
6 = Center +
7 = Mid-right +
8 = Right
  9 = Lower-left +
10 = Bottom +
11 = Lower-right +
65531 = AF Select +
65532 = Face Detect AF +
65533 = Automatic Tracking AF +
65534 = Fixed Center +
65535 = Auto
+
0x000fAFPointsInFocus +
AFPointsInFocus
int32u
int16u
(K-3 only) +
0x0 = (none) +
Bit 0 = Top-left +
Bit 1 = Top Near-left +
Bit 2 = Top +
Bit 3 = Top Near-right +
Bit 4 = Top-right +
Bit 5 = Upper-left +
Bit 6 = Upper Near-left +
Bit 7 = Upper-middle +
Bit 8 = Upper Near-right +
Bit 9 = Upper-right +
Bit 10 = Far Left +
Bit 11 = Left +
Bit 12 = Near-left +
Bit 13 = Center +
Bit 14 = Near-right +
Bit 15 = Right +
Bit 16 = Far Right +
Bit 17 = Lower-left +
Bit 18 = Lower Near-left +
Bit 19 = Lower-middle +
Bit 20 = Lower Near-right +
Bit 21 = Lower-right +
Bit 22 = Bottom-left +
Bit 23 = Bottom Near-left +
Bit 24 = Bottom +
Bit 25 = Bottom Near-right +
Bit 26 = Bottom-right
+(other models) +
0x0 = Fixed Center or Multiple +
0x1 = Top-left +
0x2 = Top-center +
0x3 = Top-right +
0x4 = Left +
0x5 = Center +
0x6 = Right +
0x7 = Bottom-left +
0x8 = Bottom-center +
0x9 = Bottom-right +
0xffff = None
+
0x0010FocusPositionint16u(related to focus distance but affected by focal length)
0x0012ExposureTimeint32u 
0x0013FNumberint16u 
0x0014ISOint16u(may be different than EXIF:ISO, which can round to the nearest full stop) + + + +
3 = 50 +
4 = 64 +
5 = 80 +
6 = 100 +
7 = 125 +
8 = 160 +
9 = 200 +
10 = 250 +
11 = 320 +
12 = 400 +
13 = 500 +
14 = 640 +
15 = 800 +
16 = 1000 +
17 = 1250 +
18 = 1600 +
19 = 2000 +
20 = 2500 +
21 = 3200 +
22 = 4000 +
23 = 5000
  24 = 6400 +
25 = 8000 +
26 = 10000 +
27 = 12800 +
28 = 16000 +
29 = 20000 +
30 = 25600 +
31 = 32000 +
32 = 40000 +
33 = 51200 +
34 = 64000 +
35 = 80000 +
36 = 102400 +
37 = 128000 +
38 = 160000 +
39 = 204800 +
40 = 256000 +
41 = 320000 +
42 = 409600 +
43 = 512000 +
44 = 640000
  45 = 819200 +
50 = 50 +
100 = 100 +
200 = 200 +
258 = 50 +
259 = 70 +
260 = 100 +
261 = 140 +
262 = 200 +
263 = 280 +
264 = 400 +
265 = 560 +
266 = 800 +
267 = 1100 +
268 = 1600 +
269 = 2200 +
270 = 3200 +
271 = 4500 +
272 = 6400 +
273 = 9000 +
274 = 12800
  275 = 18000 +
276 = 25600 +
277 = 36000 +
278 = 51200 +
279 = 72000 +
280 = 102400 +
281 = 144000 +
282 = 204800 +
283 = 288000 +
284 = 409600 +
285 = 576000 +
286 = 819200 +
400 = 400 +
800 = 800 +
1600 = 1600 +
3200 = 3200 +
65534 = Auto 2 +
65535 = Auto
+
0x0015LightReadingint16u(calibrated differently for different models. For the Optio WP, add 6 to get +approximate Light Value. May not be valid for some models, eg. Optio S)
0x0016ExposureCompensation +
ExposureCompensation
int16u
int16u[2]
(some models write two values here. The second value is meaning of the +second value is not yet known)
0x0017MeteringModeint16u0 = Multi-segment +
1 = Center-weighted average +
2 = Spot
0x0018AutoBracketingint16u[n](1 or 2 values: exposure bracket step in EV, then extended bracket if +available. Extended bracket values are printed as 'WB-BA', 'WB-GM', +'Saturation', 'Sharpness', 'Contrast', 'Hue' or 'HighLowKey' followed by +'+1', '+2' or '+3' for step size)
0x0019WhiteBalanceint16u + +
0 = Auto +
1 = Daylight +
2 = Shade +
3 = Fluorescent +
4 = Tungsten +
5 = Manual +
6 = Daylight Fluorescent +
7 = Day White Fluorescent +
8 = White Fluorescent
  9 = Flash +
10 = Cloudy +
11 = Warm White Fluorescent +
14 = Multi Auto +
15 = Color Temperature Enhancement +
17 = Kelvin +
65534 = Unknown +
65535 = User-Selected
+
0x001aWhiteBalanceModeint16u +
1 = Auto (Daylight) +
2 = Auto (Shade) +
3 = Auto (Flash) +
4 = Auto (Tungsten) +
6 = Auto (Daylight Fluorescent) +
7 = Auto (Day White Fluorescent) +
8 = Auto (White Fluorescent) +
10 = Auto (Cloudy) +
65534 = Unknown +
65535 = User-Selected
+
0x001bBlueBalanceint16u 
0x001cRedBalanceint16u 
0x001dFocalLengthint32u 
0x001eDigitalZoomint16u 
0x001fSaturationint16u[n](1 or 2 values) +
[Value 0]
+ +
0 = -2 (low) +
1 = 0 (normal) +
2 = +2 (high) +
3 = -1 (medium low) +
4 = +1 (medium high)
  5 = -3 (very low) +
6 = +3 (very high) +
7 = -4 (minimum) +
8 = +4 (maximum) +
65535 = None
+
0x0020Contrastint16u[n](1 or 2 values) +
[Value 0]
+ +
0 = -2 (low) +
1 = 0 (normal) +
2 = +2 (high) +
3 = -1 (medium low) +
4 = +1 (medium high)
  5 = -3 (very low) +
6 = +3 (very high) +
7 = -4 (minimum) +
8 = +4 (maximum) +
65535 = n/a
+
0x0021Sharpnessint16u[n](1 or 2 values) +
[Value 0]
+ +
0 = -2 (soft) +
1 = 0 (normal) +
2 = +2 (hard) +
3 = -1 (medium soft) +
4 = +1 (medium hard)
  5 = -3 (very soft) +
6 = +3 (very hard) +
7 = -4 (minimum) +
8 = +4 (maximum)
+
0x0022WorldTimeLocationint16u0 = Hometown +
1 = Destination
0x0023HometownCityint16u--> Pentax City Values
0x0024DestinationCityint16u--> Pentax City Values
0x0025HometownDSTint16u0 = No +
1 = Yes
0x0026DestinationDSTint16u0 = No +
1 = Yes
0x0027DSPFirmwareVersionundef 
0x0028CPUFirmwareVersionundef 
0x0029FrameNumberint32u 
0x002dEffectiveLV +
EffectiveLV
int16u
int32u
(camera-calculated light value, but includes exposure compensation)
0x0032ImageEditingundef[4] +
'0 0' = None +
'0 0 0 0' = None +
'0 0 0 4' = Digital Filter +
'1 0 0 0' = Resized +
'2 0 0 0' = Cropped +
'4 0 0 0' = Digital Filter 4 +
'6 0 0 0' = Digital Filter 6 +
'8 0 0 0' = Red-eye Correction +
'16 0 0 0' = Frame Synthesis?
+
0x0033PictureModeint8u[3][Values 0-1] + +
'0 0' = Program +
'0 1' = Hi-speed Program +
'0 2' = DOF Program +
'0 3' = MTF Program +
'0 4' = Standard +
'0 5' = Portrait +
'0 6' = Landscape +
'0 7' = Macro +
'0 8' = Sport +
'0 9' = Night Scene Portrait +
'0 10' = No Flash +
'0 11' = Night Scene +
'0 12' = Surf & Snow +
'0 13' = Text +
'0 14' = Sunset +
'0 15' = Kids +
'0 16' = Pet +
'0 17' = Candlelight +
'0 18' = Museum +
'0 19' = Food +
'0 20' = Stage Lighting +
'0 21' = Night Snap +
'0 23' = Blue Sky +
'0 24' = Sunset +
'0 26' = Night Scene HDR +
'0 27' = HDR +
'0 28' = Quick Macro +
'0 29' = Forest +
'0 30' = Backlight Silhouette +
'1 4' = Auto PICT (Standard) +
'1 5' = Auto PICT (Portrait) +
'1 6' = Auto PICT (Landscape) +
'1 7' = Auto PICT (Macro) +
'1 8' = Auto PICT (Sport)
  '2 0' = Program (HyP) +
'2 1' = Hi-speed Program (HyP) +
'2 2' = DOF Program (HyP) +
'2 3' = MTF Program (HyP) +
'2 22' = Shallow DOF (HyP) +
'3 0' = Green Mode +
'4 0' = Shutter Speed Priority +
'5 0' = Aperture Priority +
'6 0' = Program Tv Shift +
'7 0' = Program Av Shift +
'8 0' = Manual +
'9 0' = Bulb +
'10 0' = Aperture Priority, Off-Auto-Aperture +
'11 0' = Manual, Off-Auto-Aperture +
'12 0' = Bulb, Off-Auto-Aperture +
'13 0' = Shutter & Aperture Priority AE +
'15 0' = Sensitivity Priority AE +
'16 0' = Flash X-Sync Speed AE +
'18 0' = Auto Program (Normal) +
'18 1' = Auto Program (Hi-speed) +
'18 2' = Auto Program (DOF) +
'18 3' = Auto Program (MTF) +
'18 22' = Auto Program (Shallow DOF) +
'19 0' = Astrotracer +
'20 22' = Blur Control +
'249 0' = Movie (TAv) +
'250 0' = Movie (TAv, Auto Aperture) +
'251 0' = Movie (Manual) +
'252 0' = Movie (Manual, Auto Aperture) +
'253 0' = Movie (Av) +
'254 0' = Movie (Av, Auto Aperture) +
'255 0' = Movie (P, Auto Aperture) +
'255 4' = Video (4)
+[Value 2] + +
0 = 1/2 EV steps  1 = 1/3 EV steps
+
0x0034DriveModeint8u[4][Value 0] + +
0 = Single-frame +
1 = Continuous +
2 = Continuous (Lo)
  3 = Burst +
4 = Continuous (Medium) +
255 = Video
+[Value 1] + +
0 = No Timer +
1 = Self-timer (12 s) +
2 = Self-timer (2 s)
  15 = Video +
16 = Mirror Lock-up +
255 = n/a
+[Value 2] +
0 = Shutter Button +
1 = Remote Control (3 s delay) +
2 = Remote Control +
4 = Remote Continuous Shooting +
[Value 3]
+
0 = Single Exposure +
1 = Multiple Exposure +
2 = Composite Average +
3 = Composite Additive +
4 = Composite Bright +
8 = Interval Shooting +
10 = Interval Composite Average +
11 = Interval Composite Additive +
12 = Interval Composite Bright +
15 = Interval Movie +
16 = HDR +
32 = HDR Strong 1 +
48 = HDR Strong 2 +
64 = HDR Strong 3 +
80 = HDR Manual +
224 = HDR Auto +
255 = Video
+
0x0035SensorSizeint16u[2](includes masked pixels)
0x0037ColorSpaceint16u0 = sRGB +
1 = Adobe RGB
0x0038ImageAreaOffsetint16u[2] 
0x0039RawImageSizeint16u[2]~ 
0x003cAFPointsInFocusno(*istD only) + +
0x0 = (none) +
Bit 0 = Upper-left +
Bit 1 = Top +
Bit 2 = Upper-right +
Bit 3 = Left +
Bit 4 = Mid-left
  Bit 5 = Center +
Bit 6 = Mid-right +
Bit 7 = Right +
Bit 8 = Lower-left +
Bit 9 = Bottom +
Bit 10 = Lower-right
+
0x003dDataScalingint16u 
0x003ePreviewImageBordersint8u[4](top, bottom, left, right)
0x003fLensRec---> Pentax LensRec Tags
0x0040SensitivityAdjustint16u 
0x0041ImageEditCountint16u 
0x0047CameraTemperatureint8s 
0x0048AELockint16u0 = Off +
1 = On
0x0049NoiseReductionint16u0 = Off +
1 = On
0x004dFlashExposureComp +
FlashExposureComp
int32s
int8s[2]
 
0x004fImageToneint16u + +
0 = Natural +
1 = Bright +
2 = Portrait +
3 = Landscape +
4 = Vibrant +
5 = Monochrome
  6 = Muted +
7 = Reversal Film +
8 = Bleach Bypass +
9 = Radiant +
10 = Cross Processing +
11 = Flat
+
0x0050ColorTemperatureint16u 
0x0053ColorTempDaylightundef[4](0x0053-0x005a are 3 numbers: Kelvin, shift AB, shift GM)
0x0054ColorTempShadeundef[4] 
0x0055ColorTempCloudyundef[4] 
0x0056ColorTempTungstenundef[4] 
0x0057ColorTempFluorescentDundef[4] 
0x0058ColorTempFluorescentNundef[4] 
0x0059ColorTempFluorescentWundef[4] 
0x005aColorTempFlashundef[4] 
0x005cShakeReductionInfo---> Pentax SRInfo Tags +
--> Pentax SRInfo2 Tags
0x005dShutterCountundef[4](Note: May be reset by servicing! Also, does not include shutter actuations +for live view or video recording)
0x0060FaceInfo---> Pentax FaceInfo Tags
0x0062RawDevelopmentProcessint16u +
1 = 1 (K10D,K200D,K2000,K-m) +
3 = 3 (K20D) +
4 = 4 (K-7) +
5 = 5 (K-x) +
6 = 6 (645D) +
7 = 7 (K-r) +
8 = 8 (K-5,K-5II,K-5IIs) +
9 = 9 (Q) +
10 = 10 (K-01,K-30,K-50,K-500) +
11 = 11 (Q10) +
12 = 12 (MX-1,Q-S1,Q7) +
13 = 13 (K-3,K-3II) +
14 = 14 (645Z) +
15 = 15 (K-S1,K-S2) +
16 = 16 (K-1) +
17 = 17 (K-70) +
18 = 18 (KP) +
19 = 19 (GR III) +
20 = 20 (K-3III)
+
0x0067Hueint16u + +
0 = -2 +
1 = Normal +
2 = 2 +
3 = -1 +
4 = 1
  5 = -3 +
6 = 3 +
7 = -4 +
8 = 4 +
65535 = None
+
0x0068AWBInfo---> Pentax AWBInfo Tags
0x0069DynamicRangeExpansionundef[4](called highlight correction by Pentax for the K20D, K-5, K-01 and maybe +other models) +
[Value 0] +
0 = Off +
1 = On +
[Value 1] +
0 = 0 +
1 = Enabled +
2 = Auto
0x006bTimeInfo---> Pentax TimeInfo Tags
0x006cHighLowKeyAdjint16s[2] + + +
'-1 0' = -1 +
'-2 0' = -2 +
'-3 0' = -3
  '-4 0' = -4 +
'0 0' = 0 +
'1 0' = 1
  '2 0' = 2 +
'3 0' = 3 +
'4 0' = 4
+
0x006dContrastHighlightint16s[2] + + +
'-1 0' = -1 +
'-2 0' = -2 +
'-3 0' = -3
  '-4 0' = -4 +
'0 0' = 0 +
'1 0' = 1
  '2 0' = 2 +
'3 0' = 3 +
'4 0' = 4
+
0x006eContrastShadowint16s[2] + + +
'-1 0' = -1 +
'-2 0' = -2 +
'-3 0' = -3
  '-4 0' = -4 +
'0 0' = 0 +
'1 0' = 1
  '2 0' = 2 +
'3 0' = 3 +
'4 0' = 4
+
0x006fContrastHighlightShadowAdjint8u0 = Off +
1 = On
0x0070FineSharpnessint8u[n][Value 0] +
0 = Off +
1 = On +
[Value 1] +
0 = Normal +
2 = Extra fine
0x0071HighISONoiseReductionint8u[Value 0] + +
0 = Off +
1 = Weakest +
2 = Weak
  3 = Strong +
4 = Medium +
255 = Auto
+[Value 1] +
0 = Inactive +
1 = Active +
2 = Active (Weak) +
3 = Active (Strong) +
4 = Active (Medium) +
[Value 2] +
48 = ISO>400 +
56 = ISO>800 +
64 = ISO>1600 +
72 = ISO>3200
0x0072AFAdjustmentint16s 
0x0073MonochromeFilterEffectint16u + +
1 = Green +
2 = Yellow +
3 = Orange +
4 = Red +
5 = Magenta
  6 = Blue +
7 = Cyan +
8 = Infrared +
65535 = None
+
0x0074MonochromeToningint16u + +
0 = -4 +
1 = -3 +
2 = -2 +
3 = -1 +
4 = 0
  5 = 1 +
6 = 2 +
7 = 3 +
8 = 4 +
65535 = None
+
0x0076FaceDetectint8u[2] 
0x0077FaceDetectFrameSizeint16u[2] 
0x0079ShadowCorrectionint8u[n] + +
0 = Off +
1 = On +
2 = Auto 2 +
'0 0' = Off
  '1 1' = Weak +
'1 2' = Normal +
'1 3' = Strong +
'2 4' = Auto
+
0x007aISOAutoParametersint8u[2]'1 0' = Slow +
'2 0' = Standard +
'3 0' = Fast
0x007bCrossProcessint8u + +
0 = Off +
1 = Random +
2 = Preset 1 +
3 = Preset 2
  4 = Preset 3 +
33 = Favorite 1 +
34 = Favorite 2 +
35 = Favorite 3
+
0x007dLensCorr---> Pentax LensCorr Tags
0x007eWhiteLevelint32u 
0x007fBleachBypassToningint16u + +
0 = Off +
1 = Green +
2 = Yellow +
3 = Orange +
4 = Red
  5 = Magenta +
6 = Purple +
7 = Blue +
8 = Cyan +
65535 = n/a
+
0x0080AspectRatioyes0 = 4:3 +
1 = 3:2 +
2 = 16:9 +
3 = 1:1
0x0082BlurControlint8u[4][Value 0] +
0 = Off +
1 = Low +
2 = Medium +
3 = High
0x0085HDRint8u[4][Value 0] + +
0 = Off +
1 = HDR Auto +
2 = HDR 1
  3 = HDR 2 +
4 = HDR 3 +
5 = HDR Advanced
+[Value 1] +
0 = Auto-align Off +
1 = Auto-align On +
[Value 2] +
0 = n/a +
4 = 1 EV +
8 = 2 EV +
12 = 3 EV
0x0087ShutterTypeint8u0 = Normal +
1 = Electronic
0x0088NeutralDensityFilterint8u[n]0 = Off +
1 = On +
'0 2' = Off (0 2) +
'1 2' = On (1 2)
0x008bISOint32u 
0x0092IntervalShootingint16u[2](2 numbers: 1. Shot number 2. Total number of shots) +
'0 0' = Off
0x0095SkinToneCorrection +
SkinToneCorrection
int8s[2]
int8s[3]
'0 0' = Off +
'1 1' = On (type 1) +
'1 2' = On (type 2) +
'0 0 0' = Off
0x0096ClarityControlint8s[2]'0 0' = Off
0x0200BlackPointint16u[4] 
0x0201WhitePointint16u[4] 
0x0203ColorMatrixAint16s[9] 
0x0204ColorMatrixBint16s[9] 
0x0205CameraSettings +
CameraSettingsUnknown
-
-
--> Pentax CameraSettings Tags +
--> Pentax CameraSettingsUnknown Tags
0x0206AEInfo +
AEInfo2 +
AEInfo3 +
AEInfoUnknown
-
-
-
-
--> Pentax AEInfo Tags +
--> Pentax AEInfo2 Tags +
--> Pentax AEInfo3 Tags +
--> Pentax AEInfoUnknown Tags
0x0207LensInfo---> Pentax LensInfo Tags +
--> Pentax LensInfo2 Tags +
--> Pentax LensInfo3 Tags +
--> Pentax LensInfo4 Tags +
--> Pentax LensInfo5 Tags
0x0208FlashInfo +
FlashInfoUnknown
-
-
--> Pentax FlashInfo Tags +
--> Pentax FlashInfoUnknown Tags
0x0209AEMeteringSegmentsint8u[n](measurements from each of the 16 AE metering segments for models such as the +K10D, 77 metering segments for models such as the K-5, and 4050 metering +segments for the K-3, converted to LV)
0x020aFlashMeteringSegmentsint8u[n] 
0x020bSlaveFlashMeteringSegmentsint8u[n](used in wireless control mode)
0x020dWB_RGGBLevelsDaylightint16u[4] 
0x020eWB_RGGBLevelsShadeint16u[4] 
0x020fWB_RGGBLevelsCloudyint16u[4] 
0x0210WB_RGGBLevelsTungstenint16u[4] 
0x0211WB_RGGBLevelsFluorescentDint16u[4] 
0x0212WB_RGGBLevelsFluorescentNint16u[4] 
0x0213WB_RGGBLevelsFluorescentWint16u[4] 
0x0214WB_RGGBLevelsFlashint16u[4] 
0x0215CameraInfo---> Pentax CameraInfo Tags
0x0216BatteryInfo---> Pentax BatteryInfo Tags
0x021bSaturationInfo?no(only in PEF and DNG images)
0x021cColorMatrixA2undef[18] 
0x021dColorMatrixB2undef[18] 
0x021fAFInfo---> Pentax AFInfo Tags
0x0220HuffmanTable?no(found in K10D, K20D and K2000 PEF images)
0x0221KelvinWB---> Pentax KelvinWB Tags
0x0222ColorInfo---> Pentax ColorInfo Tags
0x0224EVStepInfo---> Pentax EVStepInfo Tags
0x0226ShotInfo---> Pentax ShotInfo Tags
0x0227FacePos---> Pentax FacePos Tags
0x0228FaceSize---> Pentax FaceSize Tags
0x0229SerialNumberstring(left blank by some cameras)
0x022aFilterInfo---> Pentax FilterInfo Tags +
--> Pentax FilterInfo Tags
0x022bLevelInfo---> Pentax LevelInfo Tags
0x022dWBLevels---> Pentax WBLevels Tags
0x022eArtiststring 
0x022fCopyrightstring 
0x0230FirmwareVersionstring(only in videos)
0x0231ContrastDetectAFAreaint16u[4](AF area of the most recent contrast-detect focus operation. Coordinates +are left, top, width and height in a 720x480 frame, with Y downwards)
0x0235CrossProcessParamsundef[10] 
0x0239LensInfoQ---> Pentax LensInfoQ Tags
0x023fModelstring 
0x0243PixelShiftInfo---> Pentax PixelShiftInfo Tags
0x0245AFPointInfo---> Pentax AFPointInfo Tags
0x03feDataDumpno 
0x03ffTempInfo +
UnknownInfo
-
-
--> Pentax TempInfo Tags +
--> Pentax UnknownInfo Tags
0x0402ToneCurveyes~ 
0x0403ToneCurvesyes~ 
0x0405UnknownBlock?undef(large unknown data block in PEF/DNG images but not JPG images)
0x0e00PrintIM---> PrintIM Tags
+ +

Pentax PentaxModelID Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValuePentaxModelIDValuePentaxModelIDValuePentaxModelID
0xd= Optio 330/4300x12c28= Optio S70x12e4e= Optio E90
0x12926= Optio 2300x12c2d= Optio L200x12e58= X90
0x12958= Optio 330GS0x12c32= Optio M200x12e6c= K-r
0x12962= Optio 450/5500x12c3c= Optio W200x12e76= K-5
0x1296c= Optio S0x12c46= Optio A200x12e8a= Optio RS1000/RS1500
0x12971= Optio S V1.010x12c78= Optio E300x12e94= Optio RZ10
0x12994= *ist D0x12c7d= Optio E350x12e9e= Optio LS1000
0x129b2= Optio 33L0x12c82= Optio T300x12ebc= Optio WG-1 GPS
0x129bc= Optio 33LF0x12c8c= Optio M300x12ed0= Optio S1
0x129c6= Optio 33WR/43WR/5550x12c91= Optio L300x12ee4= Q
0x129d5= Optio S40x12c96= Optio W300x12ef8= K-01
0x12a02= Optio MX0x12ca0= Optio A300x12f0c= Optio RZ18
0x12a0c= Optio S400x12cb4= Optio E400x12f16= Optio VS20
0x12a16= Optio S4i0x12cbe= Optio M400x12f2a= Optio WG-2 GPS
0x12a34= Optio 300x12cc3= Optio L400x12f48= Optio LS465
0x12a52= Optio S300x12cc5= Optio L360x12f52= K-30
0x12a66= Optio 750Z0x12cc8= Optio Z100x12f5c= X-5
0x12a70= Optio SV0x12cd2= K20D0x12f66= Q10
0x12a75= Optio SVi0x12cd4= Samsung GX200x12f70= K-5 II
0x12a7a= Optio X0x12cdc= Optio S100x12f71= K-5 II s
0x12a8e= Optio S5i0x12ce6= Optio A400x12f7a= Q7
0x12a98= Optio S500x12cf0= Optio V100x12f84= MX-1
0x12aa2= *ist DS0x12cfa= K200D0x12f8e= WG-3 GPS
0x12ab6= Optio MX40x12d04= Optio S120x12f98= WG-3
0x12ac0= Optio S5n0x12d0e= Optio E500x12fa2= WG-10
0x12aca= Optio WP0x12d18= Optio M500x12fb6= K-50
0x12afc= Optio S550x12d22= Optio L500x12fc0= K-3
0x12b10= Optio S5z0x12d2c= Optio V200x12fca= K-500
0x12b1a= *ist DL0x12d40= Optio W600x12fde= WG-4 GPS
0x12b24= Optio S600x12d4a= Optio M600x12fe8= WG-4
0x12b2e= Optio S450x12d68= Optio E60/M900x13006= WG-20
0x12b38= Optio S60x12d72= K20000x13010= 645Z
0x12b4c= Optio WPi0x12d73= K-m0x1301a= K-S1
0x12b56= BenQ DC X6000x12d86= Optio P700x13024= K-S2
0x12b60= *ist DS20x12d90= Optio L700x1302e= Q-S1
0x12b62= Samsung GX-1S0x12d9a= Optio E700x13056= WG-30
0x12b6a= Optio A100x12dae= X700x1307e= WG-30W
0x12b7e= *ist DL20x12db8= K-70x13088= WG-5 GPS
0x12b80= Samsung GX-1L0x12dcc= Optio W800x13092= K-1
0x12b9c= K100D0x12dea= Optio P800x1309c= K-3 II
0x12b9d= K110D0x12df4= Optio WS800x131f0= WG-M2
0x12ba2= K100D Super0x12dfe= K-x0x1320e= GR III
0x12bb0= Optio T10/T200x12e08= 645D0x13222= K-70
0x12be2= Optio W100x12e12= Optio E800x1322c= KP
0x12bf6= Optio M100x12e30= Optio W900x13240= K-1 Mark II
0x12c1e= K10D0x12e3a= Optio I-100x13254= K-3 Mark III
0x12c20= Samsung GX100x12e44= Optio H900x13290= WG-70
+ +

Pentax City Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueCityValueCityValueCityValueCityValueCity
0= Pago Pago15= Halifax30= Jeddah45= Phnom Penh60= Wellington
1= Honolulu16= Buenos Aires31= Tehran46= Ho Chi Minh61= Auckland
2= Anchorage17= Sao Paulo32= Dubai47= Jakarta62= Lima
3= Vancouver18= Rio de Janeiro33= Karachi48= Hong Kong63= Dakar
4= San Francisco19= Madrid34= Kabul49= Perth64= Algiers
5= Los Angeles20= London35= Male50= Beijing65= Helsinki
6= Calgary21= Paris36= Delhi51= Shanghai66= Athens
7= Denver22= Milan37= Colombo52= Manila67= Nairobi
8= Mexico City23= Rome38= Kathmandu53= Taipei68= Amsterdam
9= Chicago24= Berlin39= Dacca54= Seoul69= Stockholm
10= Miami25= Johannesburg40= Yangon55= Adelaide70= Lisbon
11= Toronto26= Istanbul41= Bangkok56= Tokyo71= Copenhagen
12= New York27= Cairo42= Kuala Lumpur57= Guam72= Warsaw
13= Santiago28= Jerusalem43= Vientiane58= Sydney73= Prague
14= Caracus29= Moscow44= Singapore59= Noumea74= Budapest
+ +

Pentax LensRec Tags

+

This record stores the LensType, plus one or two unknown bytes for some +models.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensTypeint8u[2]--> Pentax LensType Values
3ExtenderStatusint8u(not valid if a non-AF lens is used) +
0 = Not attached +
1 = Attached
+ +

Pentax LensType Values

+

The first number gives the series of the lens, and the second identifies the +lens model. Note that newer series numbers may not always be properly +identified by cameras running older firmware versions. Decimal values have +been added to differentiate lenses which would otherwise have the same +LensType, and are used by the Composite LensID tag when attempting to +identify the specific lens model.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueLensType
'0 0'= M-42 or No Lens
'1 0'= K or M Lens
'2 0'= A Series Lens
'3 0'= Sigma
'3 17'= smc PENTAX-FA SOFT 85mm F2.8
'3 18'= smc PENTAX-F 1.7X AF ADAPTER
'3 19'= smc PENTAX-F 24-50mm F4
'3 20'= smc PENTAX-F 35-80mm F4-5.6
'3 21'= smc PENTAX-F 80-200mm F4.7-5.6
'3 22'= smc PENTAX-F FISH-EYE 17-28mm F3.5-4.5
'3 23'= smc PENTAX-F 100-300mm F4.5-5.6 or Sigma Lens
'3 23.1'= Sigma AF 28-300mm F3.5-5.6 DL IF
'3 23.2'= Sigma AF 28-300mm F3.5-6.3 DG IF Macro
'3 23.3'= Tokina 80-200mm F2.8 ATX-Pro
'3 24'= smc PENTAX-F 35-135mm F3.5-4.5
'3 25'= smc PENTAX-F 35-105mm F4-5.6 or Sigma or Tokina Lens
'3 25.1'= Sigma 55-200mm F4-5.6 DC
'3 25.2'= Sigma AF 28-300mm F3.5-5.6 DL IF
'3 25.3'= Sigma AF 28-300mm F3.5-6.3 DL IF
'3 25.4'= Sigma AF 28-300mm F3.5-6.3 DG IF Macro
'3 25.5'= Tokina 80-200mm F2.8 ATX-Pro
'3 26'= smc PENTAX-F* 250-600mm F5.6 ED[IF]
'3 27'= smc PENTAX-F 28-80mm F3.5-4.5 or Tokina Lens
'3 27.1'= Tokina AT-X Pro AF 28-70mm F2.6-2.8
'3 28'= smc PENTAX-F 35-70mm F3.5-4.5 or Tokina Lens
'3 28.1'= Tokina 19-35mm F3.5-4.5 AF
'3 28.2'= Tokina AT-X AF 400mm F5.6
'3 29'= PENTAX-F 28-80mm F3.5-4.5 or Sigma or Tokina Lens
'3 29.1'= Sigma AF 18-125mm F3.5-5.6 DC
'3 29.2'= Tokina AT-X PRO 28-70mm F2.6-2.8
'3 30'= PENTAX-F 70-200mm F4-5.6
'3 31'= smc PENTAX-F 70-210mm F4-5.6 or Tokina or Takumar Lens
'3 31.1'= Tokina AF 730 75-300mm F4.5-5.6
'3 31.2'= Takumar-F 70-210mm F4-5.6
'3 32'= smc PENTAX-F 50mm F1.4
'3 33'= smc PENTAX-F 50mm F1.7
'3 34'= smc PENTAX-F 135mm F2.8 [IF]
'3 35'= smc PENTAX-F 28mm F2.8
'3 36'= Sigma 20mm F1.8 EX DG Aspherical RF
'3 38'= smc PENTAX-F* 300mm F4.5 ED[IF]
'3 39'= smc PENTAX-F* 600mm F4 ED[IF]
'3 40'= smc PENTAX-F Macro 100mm F2.8
'3 41'= smc PENTAX-F Macro 50mm F2.8 or Sigma Lens
'3 41.1'= Sigma 50mm F2.8 Macro
'3 42'= Sigma 300mm F2.8 EX DG APO IF
'3 44'= Sigma or Tamron Lens (3 44)
'3 44.1'= Sigma AF 10-20mm F4-5.6 EX DC
'3 44.2'= Sigma 12-24mm F4.5-5.6 EX DG
'3 44.3'= Sigma 17-70mm F2.8-4.5 DC Macro
'3 44.4'= Sigma 18-50mm F3.5-5.6 DC
'3 44.5'= Sigma 17-35mm F2.8-4 EX DG
'3 44.6'= Tamron 35-90mm F4-5.6 AF
'3 44.7'= Sigma AF 18-35mm F3.5-4.5 Aspherical
'3 46'= Sigma or Samsung Lens (3 46)
'3 46.1'= Sigma APO 70-200mm F2.8 EX
'3 46.2'= Sigma EX APO 100-300mm F4 IF
'3 46.3'= Samsung/Schneider D-XENON 50-200mm F4-5.6 ED
'3 50'= smc PENTAX-FA 28-70mm F4 AL
'3 51'= Sigma 28mm F1.8 EX DG Aspherical Macro
'3 52'= smc PENTAX-FA 28-200mm F3.8-5.6 AL[IF] or Tamron Lens
'3 52.1'= Tamron AF LD 28-200mm F3.8-5.6 [IF] Aspherical (171D)
'3 53'= smc PENTAX-FA 28-80mm F3.5-5.6 AL
'3 247'= smc PENTAX-DA FISH-EYE 10-17mm F3.5-4.5 ED[IF]
'3 248'= smc PENTAX-DA 12-24mm F4 ED AL[IF]
'3 250'= smc PENTAX-DA 50-200mm F4-5.6 ED
'3 251'= smc PENTAX-DA 40mm F2.8 Limited
'3 252'= smc PENTAX-DA 18-55mm F3.5-5.6 AL
'3 253'= smc PENTAX-DA 14mm F2.8 ED[IF]
'3 254'= smc PENTAX-DA 16-45mm F4 ED AL
'3 255'= Sigma Lens (3 255)
'3 255.1'= Sigma 18-200mm F3.5-6.3 DC
'3 255.2'= Sigma DL-II 35-80mm F4-5.6
'3 255.3'= Sigma DL Zoom 75-300mm F4-5.6
'3 255.4'= Sigma DF EX Aspherical 28-70mm F2.8
'3 255.5'= Sigma AF Tele 400mm F5.6 Multi-coated
'3 255.6'= Sigma 24-60mm F2.8 EX DG
'3 255.7'= Sigma 70-300mm F4-5.6 Macro
'3 255.8'= Sigma 55-200mm F4-5.6 DC
'3 255.9'= Sigma 18-50mm F2.8 EX DC
'4 1'= smc PENTAX-FA SOFT 28mm F2.8
'4 2'= smc PENTAX-FA 80-320mm F4.5-5.6
'4 3'= smc PENTAX-FA 43mm F1.9 Limited
'4 6'= smc PENTAX-FA 35-80mm F4-5.6
'4 8'= Irix 150mm F2.8 Macro
'4 9'= Irix 11mm F4 Firefly
'4 10'= Irix 15mm F2.4
'4 12'= smc PENTAX-FA 50mm F1.4
'4 15'= smc PENTAX-FA 28-105mm F4-5.6 [IF]
'4 16'= Tamron AF 80-210mm F4-5.6 (178D)
'4 19'= Tamron SP AF 90mm F2.8 (172E)
'4 20'= smc PENTAX-FA 28-80mm F3.5-5.6
'4 21'= Cosina AF 100-300mm F5.6-6.7
'4 22'= Tokina 28-80mm F3.5-5.6
'4 23'= smc PENTAX-FA 20-35mm F4 AL
'4 24'= smc PENTAX-FA 77mm F1.8 Limited
'4 25'= Tamron SP AF 14mm F2.8
'4 26'= smc PENTAX-FA Macro 100mm F3.5 or Cosina Lens
'4 26.1'= Cosina 100mm F3.5 Macro
'4 27'= Tamron AF 28-300mm F3.5-6.3 LD Aspherical[IF] Macro (185D/285D)
'4 28'= smc PENTAX-FA 35mm F2 AL
'4 29'= Tamron AF 28-200mm F3.8-5.6 LD Super II Macro (371D)
'4 34'= smc PENTAX-FA 24-90mm F3.5-4.5 AL[IF]
'4 35'= smc PENTAX-FA 100-300mm F4.7-5.8
'4 36'= Tamron AF 70-300mm F4-5.6 LD Macro 1:2
'4 37'= Tamron SP AF 24-135mm F3.5-5.6 AD AL (190D)
'4 38'= smc PENTAX-FA 28-105mm F3.2-4.5 AL[IF]
'4 39'= smc PENTAX-FA 31mm F1.8 AL Limited
'4 41'= Tamron AF 28-200mm Super Zoom F3.8-5.6 Aspherical XR [IF] Macro (A03)
'4 43'= smc PENTAX-FA 28-90mm F3.5-5.6
'4 44'= smc PENTAX-FA J 75-300mm F4.5-5.8 AL
'4 45'= Tamron Lens (4 45)
'4 45.1'= Tamron 28-300mm F3.5-6.3 Ultra zoom XR
'4 45.2'= Tamron AF 28-300mm F3.5-6.3 XR Di LD Aspherical [IF] Macro
'4 46'= smc PENTAX-FA J 28-80mm F3.5-5.6 AL
'4 47'= smc PENTAX-FA J 18-35mm F4-5.6 AL
'4 49'= Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical [IF] Macro
'4 51'= smc PENTAX-D FA 50mm F2.8 Macro
'4 52'= smc PENTAX-D FA 100mm F2.8 Macro
'4 55'= Samsung/Schneider D-XENOGON 35mm F2
'4 56'= Samsung/Schneider D-XENON 100mm F2.8 Macro
'4 75'= Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro (A001)
'4 214'= smc PENTAX-DA 35mm F2.4 AL
'4 229'= smc PENTAX-DA 18-55mm F3.5-5.6 AL II
'4 230'= Tamron SP AF 17-50mm F2.8 XR Di II
'4 231'= smc PENTAX-DA 18-250mm F3.5-6.3 ED AL [IF]
'4 237'= Samsung/Schneider D-XENOGON 10-17mm F3.5-4.5
'4 239'= Samsung/Schneider D-XENON 12-24mm F4 ED AL [IF]
'4 242'= smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM (SDM unused)
'4 243'= smc PENTAX-DA 70mm F2.4 Limited
'4 244'= smc PENTAX-DA 21mm F3.2 AL Limited
'4 245'= Samsung/Schneider D-XENON 50-200mm F4-5.6
'4 246'= Samsung/Schneider D-XENON 18-55mm F3.5-5.6
'4 247'= smc PENTAX-DA FISH-EYE 10-17mm F3.5-4.5 ED[IF]
'4 248'= smc PENTAX-DA 12-24mm F4 ED AL [IF]
'4 249'= Tamron XR DiII 18-200mm F3.5-6.3 (A14)
'4 250'= smc PENTAX-DA 50-200mm F4-5.6 ED
'4 251'= smc PENTAX-DA 40mm F2.8 Limited
'4 252'= smc PENTAX-DA 18-55mm F3.5-5.6 AL
'4 253'= smc PENTAX-DA 14mm F2.8 ED[IF]
'4 254'= smc PENTAX-DA 16-45mm F4 ED AL
'5 1'= smc PENTAX-FA* 24mm F2 AL[IF]
'5 2'= smc PENTAX-FA 28mm F2.8 AL
'5 3'= smc PENTAX-FA 50mm F1.7
'5 4'= smc PENTAX-FA 50mm F1.4
'5 5'= smc PENTAX-FA* 600mm F4 ED[IF]
'5 6'= smc PENTAX-FA* 300mm F4.5 ED[IF]
'5 7'= smc PENTAX-FA 135mm F2.8 [IF]
'5 8'= smc PENTAX-FA Macro 50mm F2.8
'5 9'= smc PENTAX-FA Macro 100mm F2.8
'5 10'= smc PENTAX-FA* 85mm F1.4 [IF]
'5 11'= smc PENTAX-FA* 200mm F2.8 ED[IF]
'5 12'= smc PENTAX-FA 28-80mm F3.5-4.7
'5 13'= smc PENTAX-FA 70-200mm F4-5.6
'5 14'= smc PENTAX-FA* 250-600mm F5.6 ED[IF]
'5 15'= smc PENTAX-FA 28-105mm F4-5.6
'5 16'= smc PENTAX-FA 100-300mm F4.5-5.6
'5 98'= smc PENTAX-FA 100-300mm F4.5-5.6
'6 1'= smc PENTAX-FA* 85mm F1.4 [IF]
'6 2'= smc PENTAX-FA* 200mm F2.8 ED[IF]
'6 3'= smc PENTAX-FA* 300mm F2.8 ED[IF]
'6 4'= smc PENTAX-FA* 28-70mm F2.8 AL
'6 5'= smc PENTAX-FA* 80-200mm F2.8 ED[IF]
'6 6'= smc PENTAX-FA* 28-70mm F2.8 AL
'6 7'= smc PENTAX-FA* 80-200mm F2.8 ED[IF]
'6 8'= smc PENTAX-FA 28-70mm F4AL
'6 9'= smc PENTAX-FA 20mm F2.8
'6 10'= smc PENTAX-FA* 400mm F5.6 ED[IF]
'6 13'= smc PENTAX-FA* 400mm F5.6 ED[IF]
'6 14'= smc PENTAX-FA* Macro 200mm F4 ED[IF]
'7 0'= smc PENTAX-DA 21mm F3.2 AL Limited
'7 58'= smc PENTAX-D FA Macro 100mm F2.8 WR
'7 75'= Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro (A001)
'7 201'= smc Pentax-DA L 50-200mm F4-5.6 ED WR
'7 202'= smc PENTAX-DA L 18-55mm F3.5-5.6 AL WR
'7 203'= HD PENTAX-DA 55-300mm F4-5.8 ED WR
'7 204'= HD PENTAX-DA 15mm F4 ED AL Limited
'7 205'= HD PENTAX-DA 35mm F2.8 Macro Limited
'7 206'= HD PENTAX-DA 70mm F2.4 Limited
'7 207'= HD PENTAX-DA 21mm F3.2 ED AL Limited
'7 208'= HD PENTAX-DA 40mm F2.8 Limited
'7 212'= smc PENTAX-DA 50mm F1.8
'7 213'= smc PENTAX-DA 40mm F2.8 XS
'7 214'= smc PENTAX-DA 35mm F2.4 AL
'7 216'= smc PENTAX-DA L 55-300mm F4-5.8 ED
'7 217'= smc PENTAX-DA 50-200mm F4-5.6 ED WR
'7 218'= smc PENTAX-DA 18-55mm F3.5-5.6 AL WR
'7 220'= Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical [IF]
'7 221'= smc PENTAX-DA L 50-200mm F4-5.6 ED
'7 222'= smc PENTAX-DA L 18-55mm F3.5-5.6
'7 223'= Samsung/Schneider D-XENON 18-55mm F3.5-5.6 II
'7 224'= smc PENTAX-DA 15mm F4 ED AL Limited
'7 225'= Samsung/Schneider D-XENON 18-250mm F3.5-6.3
'7 226'= smc PENTAX-DA* 55mm F1.4 SDM (SDM unused)
'7 227'= smc PENTAX-DA* 60-250mm F4 [IF] SDM (SDM unused)
'7 228'= Samsung 16-45mm F4 ED
'7 229'= smc PENTAX-DA 18-55mm F3.5-5.6 AL II
'7 230'= Tamron AF 17-50mm F2.8 XR Di-II LD (Model A16)
'7 231'= smc PENTAX-DA 18-250mm F3.5-6.3 ED AL [IF]
'7 233'= smc PENTAX-DA 35mm F2.8 Macro Limited
'7 234'= smc PENTAX-DA* 300mm F4 ED [IF] SDM (SDM unused)
'7 235'= smc PENTAX-DA* 200mm F2.8 ED [IF] SDM (SDM unused)
'7 236'= smc PENTAX-DA 55-300mm F4-5.8 ED
'7 238'= Tamron AF 18-250mm F3.5-6.3 Di II LD Aspherical [IF] Macro
'7 241'= smc PENTAX-DA* 50-135mm F2.8 ED [IF] SDM (SDM unused)
'7 242'= smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM (SDM unused)
'7 243'= smc PENTAX-DA 70mm F2.4 Limited
'7 244'= smc PENTAX-DA 21mm F3.2 AL Limited
'8 0'= Sigma 50-150mm F2.8 II APO EX DC HSM
'8 3'= Sigma 18-125mm F3.8-5.6 DC HSM
'8 4'= Sigma 50mm F1.4 EX DG HSM
'8 6'= Sigma 4.5mm F2.8 EX DC Fisheye
'8 7'= Sigma 24-70mm F2.8 IF EX DG HSM
'8 8'= Sigma 18-250mm F3.5-6.3 DC OS HSM
'8 11'= Sigma 10-20mm F3.5 EX DC HSM
'8 12'= Sigma 70-300mm F4-5.6 DG OS
'8 13'= Sigma 120-400mm F4.5-5.6 APO DG OS HSM
'8 14'= Sigma 17-70mm F2.8-4.0 DC Macro OS HSM
'8 15'= Sigma 150-500mm F5-6.3 APO DG OS HSM
'8 16'= Sigma 70-200mm F2.8 EX DG Macro HSM II
'8 17'= Sigma 50-500mm F4.5-6.3 DG OS HSM
'8 18'= Sigma 8-16mm F4.5-5.6 DC HSM
'8 20'= Sigma 18-50mm F2.8-4.5 DC HSM
'8 21'= Sigma 17-50mm F2.8 EX DC OS HSM
'8 22'= Sigma 85mm F1.4 EX DG HSM
'8 23'= Sigma 70-200mm F2.8 APO EX DG OS HSM
'8 24'= Sigma 17-70mm F2.8-4 DC Macro OS HSM
'8 25'= Sigma 17-50mm F2.8 EX DC HSM
'8 27'= Sigma 18-200mm F3.5-6.3 II DC HSM
'8 28'= Sigma 18-250mm F3.5-6.3 DC Macro HSM
'8 29'= Sigma 35mm F1.4 DG HSM
'8 30'= Sigma 17-70mm F2.8-4 DC Macro HSM | C
'8 31'= Sigma 18-35mm F1.8 DC HSM
'8 32'= Sigma 30mm F1.4 DC HSM | A
'8 33'= Sigma 18-200mm F3.5-6.3 DC Macro HSM
'8 34'= Sigma 18-300mm F3.5-6.3 DC Macro HSM
'8 59'= HD PENTAX-D FA 150-450mm F4.5-5.6 ED DC AW
'8 60'= HD PENTAX-D FA* 70-200mm F2.8 ED DC AW
'8 61'= HD PENTAX-D FA 28-105mm F3.5-5.6 ED DC WR
'8 62'= HD PENTAX-D FA 24-70mm F2.8 ED SDM WR
'8 63'= HD PENTAX-D FA 15-30mm F2.8 ED SDM WR
'8 64'= HD PENTAX-D FA* 50mm F1.4 SDM AW
'8 65'= HD PENTAX-D FA 70-210mm F4 ED SDM WR
'8 66'= HD PENTAX-D FA 85mm F1.4 ED SDM AW
'8 67'= HD PENTAX-D FA 21mm F2.4 ED Limited DC WR
'8 195'= HD PENTAX DA* 16-50mm F2.8 ED PLM AW
'8 196'= HD PENTAX-DA* 11-18mm F2.8 ED DC AW
'8 197'= HD PENTAX-DA 55-300mm F4.5-6.3 ED PLM WR RE
'8 198'= smc PENTAX-DA L 18-50mm F4-5.6 DC WR RE
'8 199'= HD PENTAX-DA 18-50mm F4-5.6 DC WR RE
'8 200'= HD PENTAX-DA 16-85mm F3.5-5.6 ED DC WR
'8 209'= HD PENTAX-DA 20-40mm F2.8-4 ED Limited DC WR
'8 210'= smc PENTAX-DA 18-270mm F3.5-6.3 ED SDM
'8 211'= HD PENTAX-DA 560mm F5.6 ED AW
'8 215'= smc PENTAX-DA 18-135mm F3.5-5.6 ED AL [IF] DC WR
'8 226'= smc PENTAX-DA* 55mm F1.4 SDM
'8 227'= smc PENTAX-DA* 60-250mm F4 [IF] SDM
'8 232'= smc PENTAX-DA 17-70mm F4 AL [IF] SDM
'8 234'= smc PENTAX-DA* 300mm F4 ED [IF] SDM
'8 235'= smc PENTAX-DA* 200mm F2.8 ED [IF] SDM
'8 241'= smc PENTAX-DA* 50-135mm F2.8 ED [IF] SDM
'8 242'= smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM
'8 255'= Sigma Lens (8 255)
'8 255.1'= Sigma 70-200mm F2.8 EX DG Macro HSM II
'8 255.2'= Sigma 150-500mm F5-6.3 DG APO [OS] HSM
'8 255.3'= Sigma 50-150mm F2.8 II APO EX DC HSM
'8 255.4'= Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye
'8 255.5'= Sigma 50-200mm F4-5.6 DC OS
'8 255.6'= Sigma 24-70mm F2.8 EX DG HSM
'9 0'= 645 Manual Lens
'10 0'= 645 A Series Lens
'11 1'= smc PENTAX-FA 645 75mm F2.8
'11 2'= smc PENTAX-FA 645 45mm F2.8
'11 3'= smc PENTAX-FA* 645 300mm F4 ED [IF]
'11 4'= smc PENTAX-FA 645 45-85mm F4.5
'11 5'= smc PENTAX-FA 645 400mm F5.6 ED [IF]
'11 7'= smc PENTAX-FA 645 Macro 120mm F4
'11 8'= smc PENTAX-FA 645 80-160mm F4.5
'11 9'= smc PENTAX-FA 645 200mm F4 [IF]
'11 10'= smc PENTAX-FA 645 150mm F2.8 [IF]
'11 11'= smc PENTAX-FA 645 35mm F3.5 AL [IF]
'11 12'= smc PENTAX-FA 645 300mm F5.6 ED [IF]
'11 14'= smc PENTAX-FA 645 55-110mm F5.6
'11 16'= smc PENTAX-FA 645 33-55mm F4.5 AL
'11 17'= smc PENTAX-FA 645 150-300mm F5.6 ED [IF]
'11 21'= HD PENTAX-D FA 645 35mm F3.5 AL [IF]
'13 18'= smc PENTAX-D FA 645 55mm F2.8 AL [IF] SDM AW
'13 19'= smc PENTAX-D FA 645 25mm F4 AL [IF] SDM AW
'13 20'= HD PENTAX-D FA 645 90mm F2.8 ED AW SR
'13 253'= HD PENTAX-DA 645 28-45mm F4.5 ED AW SR
'13 254'= smc PENTAX-DA 645 25mm F4 AL [IF] SDM AW
'21 0'= Pentax Q Manual Lens
'21 1'= 01 Standard Prime 8.5mm F1.9
'21 2'= 02 Standard Zoom 5-15mm F2.8-4.5
'21 6'= 06 Telephoto Zoom 15-45mm F2.8
'21 7'= 07 Mount Shield 11.5mm F9
'21 8'= 08 Wide Zoom 3.8-5.9mm F3.7-4
'21 233'= Adapter Q for K-mount Lens
'22 3'= 03 Fish-eye 3.2mm F5.6
'22 4'= 04 Toy Lens Wide 6.3mm F7.1
'22 5'= 05 Toy Lens Telephoto 18mm F8
'31 1'= GR Lens
+ +

Pentax SRInfo Tags

+

Shake reduction information.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0SRResultint8u0x0 = Not stabilized +
Bit 0 = Stabilized +
Bit 6 = Not ready
1ShakeReductionint8u + +
0 = Off +
1 = On +
4 = Off (4) +
5 = On but Disabled +
6 = On (Video)
  7 = On (7) +
15 = On (15) +
39 = On (mode 2) +
135 = On (135) +
167 = On (mode 1)
+
2SRHalfPressTimeint8u(time from when the shutter button was half pressed to when the shutter was +released, including time for focusing. Not valid for some models)
3SRFocalLengthint8u 
+ +

Pentax SRInfo2 Tags

+

Shake reduction information for the K-3.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0SRResult?int8u 
1ShakeReductionint8u +
0 = Off +
1 = On +
4 = Off (AA simulation off) +
5 = On but Disabled +
6 = On (Video) +
7 = On (AA simulation off) +
8 = Off (AA simulation type 1) (8) +
12 = Off (AA simulation type 1) +
15 = On (AA simulation type 1) +
16 = Off (AA simulation type 2) (16) +
20 = Off (AA simulation type 2) +
23 = On (AA simulation type 2)
+
+ +

Pentax FaceInfo Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FacesDetectedint8u 
2FacePositionint8u[2](X/Y coordinates of the center of the main face in percent of frame size, +with positive Y downwards)
+ +

Pentax AWBInfo Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0WhiteBalanceAutoAdjustmentint8u0 = Off +
1 = On
1TungstenAWBint8u0 = Subtle Correction +
1 = Strong Correction
+ +

Pentax TimeInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1WorldTimeLocationint8u[val & 0x1] +
0 = Hometown +
1 = Destination
0.2HometownDSTint8u[val >> 1 & 0x1] +
0 = No +
1 = Yes
0.3DestinationDSTint8u[val >> 2 & 0x1] +
0 = No +
1 = Yes
2HometownCityint8u--> Pentax City Values
3DestinationCityint8u--> Pentax City Values
+ +

Pentax LensCorr Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0DistortionCorrectionint8u0 = Off +
1 = On
1ChromaticAberrationCorrectionint8u0 = Off +
1 = On
2PeripheralIlluminationCorrint8u0 = Off +
1 = On
3DiffractionCorrectionint8u0 = Off +
16 = On
+ +

Pentax CameraSettings Tags

+

Camera settings information written by Pentax DSLR cameras.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0PictureMode2int8u +
0 = Scene Mode +
1 = Auto PICT +
2 = Program AE +
3 = Green Mode +
4 = Shutter Speed Priority +
5 = Aperture Priority +
6 = Program Tv Shift +
7 = Program Av Shift +
8 = Manual +
9 = Bulb +
10 = Aperture Priority, Off-Auto-Aperture +
11 = Manual, Off-Auto-Aperture +
12 = Bulb, Off-Auto-Aperture +
13 = Shutter & Aperture Priority AE +
15 = Sensitivity Priority AE +
16 = Flash X-Sync Speed AE
+
1.1ProgramLineint8u[val & 0x3] +
0 = Normal +
1 = Hi Speed +
2 = Depth +
3 = MTF
1.2EVStepsint8u[val >> 5 & 0x1] +
0 = 1/2 EV Steps +
1 = 1/3 EV Steps
1.3E-DialInProgramint8u[val >> 6 & 0x1] +
0 = Tv or Av +
1 = P Shift
1.4ApertureRingUseint8u[val >> 7 & 0x1] +
0 = Prohibited +
1 = Permitted
2FlashOptionsint8u(the camera flash options settings, set even if the flash is off) +
[val >> 4 & 0xf]
+
0 = Normal +
1 = Red-eye reduction +
2 = Auto +
3 = Auto, Red-eye reduction +
5 = Wireless (Master) +
6 = Wireless (Control) +
8 = Slow-sync +
9 = Slow-sync, Red-eye reduction +
10 = Trailing-curtain Sync
+
2.1MeteringMode2int8u(may not be valid for some models, eg. *ist D) +
[val & 0xf] +
0x0 = Multi-segment +
Bit 0 = Center-weighted average +
Bit 1 = Spot
3AFPointModeint8u[val >> 4 & 0xf] +
0x0 = Auto +
Bit 0 = Select +
Bit 1 = Fixed Center
3.1FocusMode2int8u[val & 0xf] +
0 = Manual +
1 = AF-S +
2 = AF-C +
3 = AF-A
4AFPointSelected2int16u + +
0x0 = Auto +
Bit 0 = Upper-left +
Bit 1 = Top +
Bit 2 = Upper-right +
Bit 3 = Left +
Bit 4 = Mid-left
  Bit 5 = Center +
Bit 6 = Mid-right +
Bit 7 = Right +
Bit 8 = Lower-left +
Bit 9 = Bottom +
Bit 10 = Lower-right
+
6ISOFloorint8u 
7DriveMode2int8u +
0x0 = Single-frame +
Bit 0 = Continuous +
Bit 1 = Continuous (Lo) +
Bit 2 = Self-timer (12 s) +
Bit 3 = Self-timer (2 s) +
Bit 4 = Remote Control (3 s delay) +
Bit 5 = Remote Control +
Bit 6 = Exposure Bracket +
Bit 7 = Multiple Exposure
+
8ExposureBracketStepSizeint8u + +
3 = 0.3 +
4 = 0.5 +
5 = 0.7 +
8 = 1.0
  11 = 1.3 +
12 = 1.5 +
13 = 1.7 +
16 = 2.0
+
9BracketShotNumberint8u + + +
0x0 = n/a +
0x2 = 1 of 2 +
0x3 = 1 of 3 +
0x5 = 1 of 5
  0x12 = 2 of 2 +
0x13 = 2 of 3 +
0x15 = 2 of 5 +
0x23 = 3 of 3
  0x25 = 3 of 5 +
0x35 = 4 of 5 +
0x45 = 5 of 5
+
10WhiteBalanceSetint8u[val >> 4 & 0xf] +
0 = Auto +
1 = Daylight +
2 = Shade +
3 = Cloudy +
4 = Daylight Fluorescent +
5 = Day White Fluorescent +
6 = White Fluorescent +
7 = Tungsten +
8 = Flash +
9 = Manual +
12 = Set Color Temperature 1 +
13 = Set Color Temperature 2 +
14 = Set Color Temperature 3
+
10.1MultipleExposureSetint8u[val & 0xf] +
0 = Off +
1 = On
13RawAndJpgRecordingint8u(K10D only) +
0x1 = JPEG (Best) +
0x4 = RAW (PEF, Best) +
0x5 = RAW+JPEG (PEF, Best) +
0x8 = RAW (DNG, Best) +
0x9 = RAW+JPEG (DNG, Best) +
0x21 = JPEG (Better) +
0x24 = RAW (PEF, Better) +
0x25 = RAW+JPEG (PEF, Better) +
0x28 = RAW (DNG, Better) +
0x29 = RAW+JPEG (DNG, Better) +
0x41 = JPEG (Good) +
0x44 = RAW (PEF, Good) +
0x45 = RAW+JPEG (PEF, Good) +
0x48 = RAW (DNG, Good) +
0x49 = RAW+JPEG (DNG, Good)
+
14.1JpgRecordedPixelsint8u(K10D only) +
[val & 0x3] +
0 = 10 MP +
1 = 6 MP +
2 = 2 MP
14.2LinkAEToAFPointint8u(K-5 only) +
[val & 0x1] +
0 = Off +
1 = On
14.3SensitivityStepsint8u(K-5 only) +
[val >> 1 & 0x1] +
0 = 1 EV Steps +
1 = As EV Steps
14.4ISOAutoint8u(K-5 only) +
[val >> 2 & 0x1] +
0 = Off +
1 = On
16FlashOptions2int8u(K10D only; set even if the flash is off) +
[val >> 4 & 0xf]
+
0 = Normal +
1 = Red-eye reduction +
2 = Auto +
3 = Auto, Red-eye reduction +
5 = Wireless (Master) +
6 = Wireless (Control) +
8 = Slow-sync +
9 = Slow-sync, Red-eye reduction +
10 = Trailing-curtain Sync
+
16.1MeteringMode3int8u(K10D only) +
[val & 0xf] +
0x0 = Multi-segment +
Bit 0 = Center-weighted average +
Bit 1 = Spot
17.1SRActiveint8u(K10D only; SR is active only when ShakeReduction is On, DriveMode is not +Remote or Self-timer, and Internal/ExternalFlashMode is not "On, Wireless") +
[val >> 7 & 0x1] +
0 = No +
1 = Yes
17.2Rotationint8u(K10D only) +
[val >> 5 & 0x3] +
0 = Horizontal (normal) +
1 = Rotate 180 +
2 = Rotate 90 CW +
3 = Rotate 270 CW
17.3ISOSettingint8u(K10D only) +
[val >> 2 & 0x1] +
0 = Manual +
1 = Auto
17.4SensitivityStepsint8u(K10D only) +
[val >> 1 & 0x1] +
0 = 1 EV Steps +
1 = As EV Steps
18TvExposureTimeSettingint8u(K10D only)
19AvApertureSettingint8u(K10D only)
20SvISOSettingint8u(K10D only)
21BaseExposureCompensationint8u(K10D only; exposure compensation without auto bracketing)
+ +

Pentax CameraSettingsUnknown Tags

+

This information has not yet been decoded for models such as the K-01.

+
+
+ + + + +
Index1Tag NameWritableValues / Notes
[no tags known]
+ +

Pentax AEInfo Tags

+

Auto-exposure information for most Pentax models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0AEExposureTimeint8u(val = 24 * 2**((32-raw)/8))
1AEApertureint8u(val = 2**((raw-68)/16))
2AE_ISOint8u(val = 100 * 2**((raw-32)/8))
3AEXvint8u(val = (raw-64)/8)
4AEBXvint8s(val = raw / 8)
5AEMinExposureTimeint8u(val = 24 * 2**((32-raw)/8))
6AEProgramModeint8u + +
0 = M, P or TAv +
1 = Av, B or X +
2 = Tv +
3 = Sv or Green Mode +
8 = Hi-speed Program +
11 = Hi-speed Program (P-Shift) +
16 = DOF Program +
19 = DOF Program (P-Shift) +
24 = MTF Program +
27 = MTF Program (P-Shift) +
35 = Standard +
43 = Portrait +
51 = Landscape +
59 = Macro +
67 = Sport
  75 = Night Scene Portrait +
83 = No Flash +
91 = Night Scene +
99 = Surf & Snow +
104 = Night Snap +
107 = Text +
115 = Sunset +
123 = Kids +
131 = Pet +
139 = Candlelight +
144 = SCN +
147 = Museum +
160 = Program +
184 = Shallow DOF Program +
216 = HDR
+
7AEFlagsno(indices after this are incremented by 1 for some models) +
Bit 3 = AE lock +
Bit 4 = Flash recommended? +
Bit 7 = Aperture wide open
8AEApertureStepsint8u(number of steps the aperture has been stopped down from wide open. There +are roughly 8 steps per F-stop for most lenses, or 18 steps for 645D lenses, +but it varies slightly by lens)
9AEMaxApertureint8u(val = 2**((raw-68)/16))
10AEMaxAperture2int8u(val = 2**((raw-68)/16))
11AEMinApertureint8u(val = 2**((raw-68)/16))
12AEMeteringModeint8u0x0 = Multi-segment +
Bit 4 = Center-weighted average +
Bit 5 = Spot
13AEWhiteBalanceint8u(K7 and Kx) +
[val >> 4 & 0xf]
+
0 = Standard +
1 = Daylight +
2 = Shade +
3 = Cloudy +
4 = Daylight Fluorescent +
5 = Day White Fluorescent +
6 = White Fluorescent +
7 = Tungsten +
8 = Unknown
+
13.1AEMeteringMode2int8u(K7 and Kx, override for an incompatible metering mode setting) +
[val & 0xf] +
0x0 = Multi-segment +
Bit 0 = Center-weighted average +
Bit 1 = Spot
14FlashExposureCompSetint8s(reports the camera setting, unlike tag 0x004d which reports 0 in Green mode +or if flash was on but did not fire. Both this tag and 0x004d report the +setting even if the flash is off)
21LevelIndicatorint8u 
+ +

Pentax AEInfo2 Tags

+

Auto-exposure information for the K-01.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
2AEExposureTimeint8u(val = 24 * 2**((32-raw)/8))
3AEApertureint8u(val = 2**((raw-68)/16))
4AE_ISOint8u(val = 100 * 2**((raw-32)/8))
5AEXvint8u(val = (raw-64)/8)
6AEBXvint8s(val = raw / 8)
8AEErrorint8s 
11AEApertureStepsint8u(number of steps the aperture has been stopped down from wide open. There +are roughly 8 steps per F-stop, but it varies slightly by lens)
15SceneModeint8u + +
0 = Off +
1 = HDR +
4 = Auto PICT +
5 = Portrait +
6 = Landscape +
7 = Macro +
8 = Sport +
9 = Night Scene Portrait +
10 = No Flash +
11 = Night Scene +
12 = Surf & Snow +
14 = Sunset
  15 = Kids +
16 = Pet +
17 = Candlelight +
18 = Museum +
20 = Food +
21 = Stage Lighting +
22 = Night Snap +
25 = Night Scene HDR +
26 = Blue Sky +
27 = Forest +
29 = Backlight Silhouette
+
16AEMaxApertureint8u(val = 2**((raw-68)/16))
17AEMaxAperture2int8u(val = 2**((raw-68)/16))
18AEMinApertureint8u(val = 2**((raw-68)/16))
19AEMinExposureTimeint8u(val = 24 * 2**((32-raw)/8))
+ +

Pentax AEInfo3 Tags

+

Auto-exposure information for the K-3, K-30, K-50 and K-500.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
16AEExposureTimeint8u(val = 24 * 2**((32-raw)/8))
17AEApertureint8u(val = 2**((raw-68)/16))
18AE_ISOint8u(val = 100 * 2**((raw-32)/8))
28AEMaxApertureint8u(val = 2**((raw-68)/16))
29AEMaxAperture2int8u(val = 2**((raw-68)/16))
30AEMinApertureint8u(val = 2**((raw-68)/16))
31AEMinExposureTimeint8u(val = 24 * 2**((32-raw)/8))
+ +

Pentax AEInfoUnknown Tags

+
+
+ + + + +
Index1Tag NameWritableValues / Notes
[no tags known]
+ +

Pentax LensInfo Tags

+

Pentax lens information structure for models such as the *istD.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensTypeint8u[2]--> Pentax LensType Values
3LensData---> Pentax LensData Tags
+ +

Pentax LensInfo2 Tags

+

Pentax lens information structure for models such as the K10D and K20D.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensTypeint8u[4]--> Pentax LensType Values
4LensData---> Pentax LensData Tags
+ +

Pentax LensData Tags

+

Pentax lens data information. Some of these tags require interesting binary +gymnastics to decode them into useful values.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1AutoApertureint8u(not valid for the K-r, K-5 or K-5II) +
[val & 0x1] +
0 = On +
1 = Off
0.2MinApertureint8u(not valid for the K-r, K-5 or K-5II) +
[val >> 1 & 0x3] +
0 = 22 +
1 = 32 +
2 = 45 +
3 = 16
0.3LensFStopsint8u(not valid for the K-r, K-5 or K-5II) +
[val >> 4 & 0x7]
1LensKind?int8u 
2LC1?int8u 
3MinFocusDistanceint8u(minimum focus distance for the lens) +
[val >> 3 & 0x1f]
+ +
0 = 0.13-0.19 m +
1 = 0.20-0.24 m +
2 = 0.25-0.28 m +
3 = 0.28-0.30 m +
4 = 0.35-0.38 m +
5 = 0.40-0.45 m +
6 = 0.49-0.50 m +
7 = 0.6 m +
8 = 0.7 m +
9 = 0.8-0.9 m +
10 = 1.0 m
  11 = 1.1-1.2 m +
12 = 1.4-1.5 m +
13 = 1.5 m +
14 = 2.0 m +
15 = 2.0-2.1 m +
16 = 2.1 m +
17 = 2.2-2.9 m +
18 = 3.0 m +
19 = 4-5 m +
20 = 5.6 m
+
3.1FocusRangeIndexint8u[val & 0x7] + +
0 = 5 +
1 = 4 +
2 = 6 (far) +
3 = 7 (very far)
  4 = 2 +
5 = 3 +
6 = 1 (close) +
7 = 0 (very close)
+
4LC3?int8u 
5LC4?int8u 
6LC5?int8u 
7LC6?int8u 
8LC7?int8u 
9LensFocalLength +
LC8?
int8u
int8u
(focal length of lens alone, without adapter)
10NominalMaxApertureint8u[val >> 4 & 0xf]
10.1NominalMinApertureint8u[val & 0xf]
11LC10?int8u 
12LC11?int8u 
13LC12?int8u(ID's 13-16 are offset by 1 for the K-r, K-5 and K-5II)
14.1MaxApertureint8u(effective wide open aperture for current focal length) +
[val & 0x7f]
15LC14?int8u 
16LC15?int8u 
+ +

Pentax LensInfo3 Tags

+

Pentax lens information structure for 645D.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1LensTypeint8u[4]--> Pentax LensType Values
13LensData---> Pentax LensData Tags
+ +

Pentax LensInfo4 Tags

+

Pentax lens information structure for models such as the K-5 and K-r.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1LensTypeint8u[4]--> Pentax LensType Values
12LensData---> Pentax LensData Tags
+ +

Pentax LensInfo5 Tags

+

Pentax lens information structure for the K-01 and newer models.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1LensTypeint8u[5]--> Pentax LensType Values
15LensData---> Pentax LensData Tags
+ +

Pentax FlashInfo Tags

+

Flash information tags for the K10D, K20D and K200D.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FlashStatusint8u +
0x0 = Off +
0x1 = Off (1) +
0x2 = External, Did not fire +
0x6 = External, Fired +
0x8 = Internal, Did not fire (0x08) +
0x9 = Internal, Did not fire +
0xd = Internal, Fired
+
1InternalFlashModeint8u0x0 = n/a - Off-Auto-Aperture +
0x86 = Fired, Wireless (Control) +
0x95 = Fired, Wireless (Master) +
0xc0 = Fired +
0xc1 = Fired, Red-eye reduction +
0xc2 = Fired, Auto +
0xc3 = Fired, Auto, Red-eye reduction +
0xc6 = Fired, Wireless (Control), Fired normally not as control +
0xc8 = Fired, Slow-sync +
0xc9 = Fired, Slow-sync, Red-eye reduction +
0xca = Fired, Trailing-curtain Sync +
0xf0 = Did not fire, Normal +
0xf1 = Did not fire, Red-eye reduction +
0xf2 = Did not fire, Auto +
0xf3 = Did not fire, Auto, Red-eye reduction +
0xf4 = Did not fire, (Unknown 0xf4) +
0xf5 = Did not fire, Wireless (Master) +
0xf6 = Did not fire, Wireless (Control) +
0xf8 = Did not fire, Slow-sync +
0xf9 = Did not fire, Slow-sync, Red-eye reduction +
0xfa = Did not fire, Trailing-curtain Sync
2ExternalFlashModeint8u +
0x0 = n/a - Off-Auto-Aperture +
0x3f = Off +
0x40 = On, Auto +
0xbf = On, Flash Problem +
0xc0 = On, Manual +
0xc4 = On, P-TTL Auto +
0xc5 = On, Contrast-control Sync +
0xc6 = On, High-speed Sync +
0xcc = On, Wireless +
0xcd = On, Wireless, High-speed Sync +
0xf0 = Not Connected
+
3InternalFlashStrengthint8u(saved from the most recent flash picture, on a scale of about 0 to 100)
4TTL_DA_AUpint8u 
5TTL_DA_ADownint8u 
6TTL_DA_BUpint8u 
7TTL_DA_BDownint8u 
24.1ExternalFlashGuideNumberint8u(val = 2**(raw/16 + 4), with a few exceptions) +
[val & 0x1f]
25ExternalFlashExposureCompint8u + +
0 = n/a +
144 = n/a (Manual Mode) +
164 = -3.0 +
167 = -2.5 +
168 = -2.0 +
171 = -1.5
  172 = -1.0 +
175 = -0.5 +
176 = 0.0 +
179 = 0.5 +
180 = 1.0
+
26ExternalFlashBounceint8u(saved from the most recent external flash picture) +
0 = n/a +
16 = Direct +
48 = Bounce
+ +

Pentax FlashInfoUnknown Tags

+
+
+ + + + +
Index1Tag NameWritableValues / Notes
[no tags known]
+ +

Pentax CameraInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0PentaxModelIDint32u--> Pentax PentaxModelID Values
1ManufactureDateint32u(this value, and the values of the tags below, may change if the camera is +serviced)
2ProductionCodeint32u[2] 
4InternalSerialNumberint32u 
+ +

Pentax BatteryInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0.1PowerSourceint8u[val & 0xf] +
1 = Camera Battery +
2 = Body Battery +
3 = Grip Battery +
4 = External Power Supply
1.1BodyBatteryStateint8u(*istD, K100D, K200D, K10D and K20D) +
[val >> 4 & 0xf] +
1 = Empty or Missing +
2 = Almost Empty +
3 = Running Low +
4 = Full +
(other models except the K110D, K2000 and K-m) +
[val >> 4 & 0xf] +
1 = Empty or Missing +
2 = Almost Empty +
3 = Running Low +
4 = Close to Full +
5 = Full +
(decoding unknown for other models) +
[val >> 4 & 0xf]
1.2GripBatteryState +
GripBatteryState?
int8u
int8u
(K10D and K20D) +
[val & 0xf] +
1 = Empty or Missing +
2 = Almost Empty +
3 = Running Low +
4 = Full +
(decoding unknown for other models) +
[val & 0xf]
2BodyBatteryADNoLoad +
BodyBatteryVoltage1
int8u
int16u
(roughly calibrated for K10D with a new Pentax battery)
3BodyBatteryADLoadint8u(roughly calibrated for K10D with a new Pentax battery)
4GripBatteryADNoLoad +
BodyBatteryVoltage2
int8u
int16u
 
5GripBatteryADLoadint8u 
6BodyBatteryVoltage3int16u(K-5, K-r and 645D only)
8BodyBatteryVoltage4int16u(K-5 and K-r only)
+ +

Pentax AFInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0AFPointsUnknown1?int16u + +
0x0 = (none) +
0x777 = Central 9 points +
0x7ff = All +
Bit 0 = Upper-left +
Bit 1 = Top +
Bit 2 = Upper-right +
Bit 3 = Left
  Bit 4 = Mid-left +
Bit 5 = Center +
Bit 6 = Mid-right +
Bit 7 = Right +
Bit 8 = Lower-left +
Bit 9 = Bottom +
Bit 10 = Lower-right
+
2AFPointsUnknown2?int16u + +
0x0 = Auto +
Bit 0 = Upper-left +
Bit 1 = Top +
Bit 2 = Upper-right +
Bit 3 = Left +
Bit 4 = Mid-left
  Bit 5 = Center +
Bit 6 = Mid-right +
Bit 7 = Right +
Bit 8 = Lower-left +
Bit 9 = Bottom +
Bit 10 = Lower-right
+
4AFPredictorint16s 
6AFDefocusint8u 
7AFIntegrationTimeint8u(times less than 2 ms give a value of 0)
11AFPointsInFocusint8u(models other than the K-1 and K-3. May report two points in focus even +though a single AFPoint has been selected, in which case the selected +AFPoint is the first reported) + +
0 = None +
1 = Lower-left, Bottom +
2 = Bottom +
3 = Lower-right, Bottom +
4 = Mid-left, Center +
5 = Center (horizontal) +
6 = Mid-right, Center +
7 = Upper-left, Top +
8 = Top +
9 = Upper-right, Top +
10 = Right
  11 = Lower-left, Mid-left +
12 = Upper-left, Mid-left +
13 = Bottom, Center +
14 = Top, Center +
15 = Lower-right, Mid-right +
16 = Upper-right, Mid-right +
17 = Left +
18 = Mid-left +
19 = Center (vertical) +
20 = Mid-right
+
509AFHoldint8u(decoded only for the K-3 II) +
0 = Off +
1 = Short +
2 = Medium +
3 = Long
+ +

Pentax KelvinWB Tags

+

White balance Blue/Red gains as a function of color temperature.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
1KelvinWB_Daylightint16u[4] 
5KelvinWB_01int16u[4] 
9KelvinWB_02int16u[4] 
13KelvinWB_03int16u[4] 
17KelvinWB_04int16u[4] 
21KelvinWB_05int16u[4] 
25KelvinWB_06int16u[4] 
29KelvinWB_07int16u[4] 
33KelvinWB_08int16u[4] 
37KelvinWB_09int16u[4] 
41KelvinWB_10int16u[4] 
45KelvinWB_11int16u[4] 
49KelvinWB_12int16u[4] 
53KelvinWB_13int16u[4] 
57KelvinWB_14int16u[4] 
61KelvinWB_15int16u[4] 
65KelvinWB_16int16u[4] 
+ +

Pentax ColorInfo Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
16WBShiftABint8s(positive is a shift toward blue)
17WBShiftGMint8s(positive is a shift toward green)
+ +

Pentax EVStepInfo Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0EVStepsint8u0 = 1/2 EV Steps +
1 = 1/3 EV Steps
1SensitivityStepsint8u0 = 1 EV Steps +
1 = As EV Steps
+ +

Pentax ShotInfo Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
1CameraOrientationint8u(K-5, K-7, K-r and K-x) +
0x10 = Horizontal (normal) +
0x20 = Rotate 180 +
0x30 = Rotate 90 CW +
0x40 = Rotate 270 CW +
0x50 = Upwards +
0x60 = Downwards
+
+ +

Pentax FacePos Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0Face1Positionint16u[2](X/Y coordinates of face center in full-sized image)
2Face2Positionint16u[2] 
4Face3Positionint16u[2] 
6Face4Positionint16u[2] 
8Face5Positionint16u[2] 
10Face6Positionint16u[2] 
12Face7Positionint16u[2] 
14Face8Positionint16u[2] 
16Face9Positionint16u[2] 
18Face10Positionint16u[2] 
20Face11Positionint16u[2] 
22Face12Positionint16u[2] 
24Face13Positionint16u[2] 
26Face14Positionint16u[2] 
28Face15Positionint16u[2] 
30Face16Positionint16u[2] 
32Face17Positionint16u[2] 
34Face18Positionint16u[2] 
36Face19Positionint16u[2] 
38Face20Positionint16u[2] 
40Face21Positionint16u[2] 
42Face22Positionint16u[2] 
44Face23Positionint16u[2] 
46Face24Positionint16u[2] 
48Face25Positionint16u[2] 
50Face26Positionint16u[2] 
52Face27Positionint16u[2] 
54Face28Positionint16u[2] 
56Face29Positionint16u[2] 
58Face30Positionint16u[2] 
60Face31Positionint16u[2] 
62Face32Positionint16u[2] 
+ +

Pentax FaceSize Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0Face1Sizeint16u[2] 
2Face2Sizeint16u[2] 
4Face3Sizeint16u[2] 
6Face4Sizeint16u[2] 
8Face5Sizeint16u[2] 
10Face6Sizeint16u[2] 
12Face7Sizeint16u[2] 
14Face8Sizeint16u[2] 
16Face9Sizeint16u[2] 
18Face10Sizeint16u[2] 
20Face11Sizeint16u[2] 
22Face12Sizeint16u[2] 
24Face13Sizeint16u[2] 
26Face14Sizeint16u[2] 
28Face15Sizeint16u[2] 
30Face16Sizeint16u[2] 
32Face17Sizeint16u[2] 
34Face18Sizeint16u[2] 
36Face19Sizeint16u[2] 
38Face20Sizeint16u[2] 
40Face21Sizeint16u[2] 
42Face22Sizeint16u[2] 
44Face23Sizeint16u[2] 
46Face24Sizeint16u[2] 
48Face25Sizeint16u[2] 
50Face26Sizeint16u[2] 
52Face27Sizeint16u[2] 
54Face28Sizeint16u[2] 
56Face29Sizeint16u[2] 
58Face30Sizeint16u[2] 
60Face31Sizeint16u[2] 
62Face32Sizeint16u[2] 
+ +

Pentax FilterInfo Tags

+

The parameters associated with each type of digital filter are unique, and +these settings are also extracted with the DigitalFilter tag. Information +is not extracted for filters that are "Off" unless the Unknown option is +used.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0SourceDirectoryIndexint16u 
2SourceFileIndexint16u 
5DigitalFilter01undef[17]--> Pentax DigitalFilter Values
22DigitalFilter02undef[17]--> Pentax DigitalFilter Values
39DigitalFilter03undef[17]--> Pentax DigitalFilter Values
56DigitalFilter04undef[17]--> Pentax DigitalFilter Values
73DigitalFilter05undef[17]--> Pentax DigitalFilter Values
90DigitalFilter06undef[17]--> Pentax DigitalFilter Values
107DigitalFilter07undef[17]--> Pentax DigitalFilter Values
124DigitalFilter08undef[17]--> Pentax DigitalFilter Values
141DigitalFilter09undef[17]--> Pentax DigitalFilter Values
158DigitalFilter10undef[17]--> Pentax DigitalFilter Values
175DigitalFilter11undef[17]--> Pentax DigitalFilter Values
192DigitalFilter12undef[17]--> Pentax DigitalFilter Values
209DigitalFilter13undef[17]--> Pentax DigitalFilter Values
226DigitalFilter14undef[17]--> Pentax DigitalFilter Values
243DigitalFilter15undef[17]--> Pentax DigitalFilter Values
260DigitalFilter16undef[17]--> Pentax DigitalFilter Values
277DigitalFilter17undef[17]--> Pentax DigitalFilter Values
294DigitalFilter18undef[17]--> Pentax DigitalFilter Values
311DigitalFilter19undef[17]--> Pentax DigitalFilter Values
328DigitalFilter20undef[17]--> Pentax DigitalFilter Values
+ +

Pentax DigitalFilter Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueDigitalFilterValueDigitalFilterValueDigitalFilter
0= Off10= Toy Camera20= Shading
1= Base Parameter Adjust11= Retro21= Invert Color
2= Soft Focus12= Pastel23= Tone Expansion
3= High Contrast13= Water Color27= Unicolor Bold
4= Color Filter14= HDR28= Bold Monochrome
5= Extract Color16= Miniature29= Replace Color
6= Monochrome17= Starburst254= Custom Filter
7= Slim18= Posterization  
9= Fisheye19= Sketch Filter  
+ +

Pentax LevelInfo Tags

+

Tags decoded from the electronic level information for the K-5. May not be +valid for other models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LevelOrientationint8s[val & 0xf] +
0 = n/a +
1 = Horizontal (normal) +
2 = Rotate 180 +
3 = Rotate 90 CW +
4 = Rotate 270 CW +
9 = Horizontal; Off Level +
10 = Rotate 180; Off Level +
11 = Rotate 90 CW; Off Level +
12 = Rotate 270 CW; Off Level +
13 = Upwards +
14 = Downwards
+
0.1CompositionAdjustint8s[val >> 4 & 0xf] +
0 = Off +
2 = Composition Adjust +
10 = Composition Adjust + Horizon Correction +
12 = Horizon Correction
1RollAngleint8s(converted to degrees of clockwise camera rotation)
2PitchAngleint8s(converted to degrees of upward camera tilt)
5CompositionAdjustXint8s(steps to the right, 1/16 mm per step)
6CompositionAdjustYint8s(steps up, 1/16 mm per step)
7CompositionAdjustRotationint8s(steps clockwise, 1/8 degree per step)
+ +

Pentax WBLevels Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
2WB_RGGBLevelsDaylightint16u[4] 
11WB_RGGBLevelsShadeint16u[4] 
20WB_RGGBLevelsCloudyint16u[4] 
29WB_RGGBLevelsTungstenint16u[4] 
38WB_RGGBLevelsFluorescentDint16u[4] 
47WB_RGGBLevelsFluorescentNint16u[4] 
56WB_RGGBLevelsFluorescentWint16u[4] 
65WB_RGGBLevelsFlashint16u[4] 
74WB_RGGBLevelsFluorescentLint16u[4] 
83WB_RGGBLevelsUnknown?int16u[4] 
92WB_RGGBLevelsUserSelectedint16u[4] 
+ +

Pentax LensInfoQ Tags

+

More lens information stored by the Pentax Q.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
12LensModelstring[30] 
42LensInfostring[20] 
+ +

Pentax PixelShiftInfo Tags

+

Pixel shift information stored by the K-3 II.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0PixelShiftResolutionint8u0 = Off +
1 = On
+ +

Pentax AFPointInfo Tags

+

AF point information written by the K-1.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
2NumAFPointsint16u 
4AFPointsInFocusint8u[9]~ 
4.1AFPointsSelectedint8u[9]~ 
4.2AFPointsSpecialint8u[9]~ 
+ +

Pentax TempInfo Tags

+

A number of additional temperature readings are extracted from this 256-byte +binary-data block in images from models such as the K-01, K-3, K-5, K-50 and +K-500. It is currently not known where the corresponding temperature +sensors are located in the camera.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
12SensorTemperatureint16s 
14SensorTemperature2int16s 
20CameraTemperature4int16s 
22CameraTemperature5int16s 
+ +

Pentax UnknownInfo Tags

+
+
+ + + + +
Index1Tag NameWritableValues / Notes
[no tags known]
+ +

Pentax Type2 Tags

+

These tags are used by the Pentax Optio 330 and 430, and are similar to the +tags used by Casio.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001RecordingModeint16u0 = Auto +
1 = Night Scene +
2 = Manual
0x0002Qualityint16u0 = Good +
1 = Better +
2 = Best
0x0003FocusModeint16u2 = Custom +
3 = Auto
0x0004FlashModeint16u1 = Auto +
2 = On +
4 = Off +
6 = Red-eye reduction
0x0007WhiteBalanceint16u + +
0 = Auto +
1 = Daylight +
2 = Shade
  3 = Tungsten +
4 = Fluorescent +
5 = Manual
+
0x000aDigitalZoomint32u 
0x000bSharpnessint16u0 = Normal +
1 = Soft +
2 = Hard
0x000cContrastint16u0 = Normal +
1 = Low +
2 = High
0x000dSaturationint16u0 = Normal +
1 = Low +
2 = High
0x0014ISOint16u + + +
10 = 100 +
16 = 200 +
50 = 50 +
100 = 100
  200 = 200 +
400 = 400 +
800 = 800 +
1600 = 1600
  3200 = 3200 +
65534 = Auto 2 +
65535 = Auto
+
0x0017ColorFilterint16u1 = Full +
2 = Black & White +
3 = Sepia
0x0e00PrintIM---> PrintIM Tags
0x1000HometownCityCodeundef[4] 
0x1001DestinationCityCodeundef[4] 
+ +

Pentax Type4 Tags

+

The following few tags are extracted from the wealth of information +available in maker notes of the Optio E20 and E25. These maker notes are +stored as ASCII text in a format very similar to some HP models.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'F/W Version'FirmwareVersionno 
+ +

Pentax S1 Tags

+

Tags extracted from the maker notes of AVI videos from the Optio S1.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000MakerNoteVersionno 
+ +

Pentax PENT Tags

+

Tags found in the PENT atom of MOV videos from the Optio WG-2 GPS.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
26Modelno 
56ExposureTimeno 
60FNumberno 
68ExposureCompensationno 
84FocalLengthno 
113DateTime1no 
139DateTime2no 
167ISOno 
199GPSVersionIDno 
207GPSLatitudeRefno'N' = North +
'S' = South
209GPSLatitudeno 
233GPSLongitudeRefno'E' = East +
'W' = West
235GPSLongitudeno 
259GPSAltitudeRefno0 = Above Sea Level +
1 = Below Sea Level
260GPSAltitudeno 
284GPSTimeStampno 
308GPSSatellitesno 
311GPSStatusno'A' = Measurement Active +
'V' = Measurement Void
313GPSMeasureModeno2 = 2-Dimensional Measurement +
3 = 3-Dimensional Measurement
315GPSMapDatumno 
322GPSDateStampno 
371AudioCodecIDno 
2003PreviewImageno(640x480 JPEG preview image)
+ +

Pentax PXTH Tags

+

Tags found in the PXTH atom of MOV videos from the K-01.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0PreviewImageLengthno 
4PreviewImageno(640-pixel-wide JPEG preview)
+ +

Pentax MOV Tags

+

This information is found in MOV videos from cameras such as the Optio WP.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
38ExposureTimeno 
42FNumberno 
50ExposureCompensationno 
68WhiteBalanceno + +
0 = Auto +
1 = Daylight +
2 = Shade
  3 = Fluorescent +
4 = Tungsten +
5 = Manual
+
72FocalLengthno 
175ISOno 
+ +

Pentax Junk Tags

+

Tags found in the JUNK chunk of AVI videos from the RS1000.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
12Modelno 
+ +

Pentax Junk2 Tags

+

This information is found in AVI videos from the Optio RZ18.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
18Makeno 
44Modelno 
94FNumberno 
131DateTime1no 
157DateTime2no 
299ThumbnailWidthno 
301ThumbnailHeightno 
303ThumbnailLengthno 
307ThumbnailImageno(160x120 JPEG thumbnail image)
+ +

Pentax AVI Tags

+

Pentax-specific RIFF tags found in AVI videos.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'hymn'MakerNotes---> Pentax Tags
'mknt'MakerNotes---> Pentax Tags
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 12, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PhaseOne.html b/html/TagNames/PhaseOne.html new file mode 100644 index 0000000..4903d0f --- /dev/null +++ b/html/TagNames/PhaseOne.html @@ -0,0 +1,267 @@ + + + + +PhaseOne Tags + + + +

PhaseOne Tags

+

These tags are extracted from the maker notes of Phase One images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0100CameraOrientationno0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW +
3 = Rotate 180
0x0102SerialNumberstring 
0x0105ISOint32s 
0x0106ColorMatrix1float[9] 
0x0107WB_RGBLevelsfloat[3] 
0x0108SensorWidthint32s 
0x0109SensorHeightint32s 
0x010aSensorLeftMarginint32s 
0x010bSensorTopMarginint32s 
0x010cImageWidthint32s 
0x010dImageHeightint32s 
0x010eRawFormatint32s + +
1 = RAW 1 +
2 = RAW 2 +
3 = IIQ L
  5 = IIQ S +
6 = IIQ Sv2 +
8 = IIQ L16
+
0x010fRawDatano 
0x0110SensorCalibration---> PhaseOne SensorCalibration Tags
0x0112DateTimeOriginalno(may be used as a key to encrypt the raw data)
0x0113ImageNumberint32s 
0x0203Softwarestring 
0x0204Systemstring 
0x0210SensorTemperaturefloat 
0x0211SensorTemperature2float 
0x0212UnknownDate?int32u 
0x021cStripOffsetsno 
0x021dBlackLevelint32s 
0x0222SplitColumnint32s 
0x0223BlackLevelDataint16u[n] 
0x0226ColorMatrix2float[9] 
0x0267AFAdjustmentfloat 
0x0301FirmwareVersionsstring 
0x0400ShutterSpeedValuefloat 
0x0401ApertureValuefloat 
0x0402ExposureCompensationfloat 
0x0403FocalLengthfloat 
0x0410CameraModelstring 
0x0412LensModelstring 
0x0414MaxApertureValuefloat 
0x0415MinApertureValuefloat 
0x0455Viewfinderstring 
+ +

PhaseOne SensorCalibration Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0400SensorDefectsno 
0x0401AllColorFlatField1?no 
0x0407SerialNumberstring 
0x040bRedBlueFlatField?no 
0x0410AllColorFlatField2?no 
0x0416AllColorFlatField3?no 
0x0419LinearizationCoefficients1no 
0x041aLinearizationCoefficients2no 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Apr 13, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PhotoCD.html b/html/TagNames/PhotoCD.html new file mode 100644 index 0000000..af06903 --- /dev/null +++ b/html/TagNames/PhotoCD.html @@ -0,0 +1,403 @@ + + + + +PhotoCD Tags + + + +

PhotoCD Tags

+

Tags extracted from Kodak Photo CD Image Pac (PCD) files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
7SpecificationVersionno 
9AuthoringSoftwareReleaseno 
11ImageMagnificationDescriptorno 
13CreateDateno 
17ModifyDateno 
21ImageMediumno +
0 = Color negative +
1 = Color reversal +
2 = Color hard copy +
3 = Thermal hard copy +
4 = Black and white negative +
5 = Black and white reversal +
6 = Black and white hard copy +
7 = Internegative +
8 = Synthetic image
+
22ProductTypeno 
42ScannerVendorIDno 
62ScannerProductIDno 
78ScannerFirmwareVersionno 
82ScannerFirmwareDateno 
90ScannerSerialNumberno 
110ScannerPixelSizeno 
112ImageWorkstationMakeno 
132CharacterSetno +
1 = 38 characters ISO 646 +
2 = 65 characters ISO 646 +
3 = 95 characters ISO 646 +
4 = 191 characters ISO 8850-1 +
5 = ISO 2022 +
6 = Includes characters not ISO 2375 registered
+
133CharacterEscapeSequence?no 
165PhotoFinisherNameno 
228SceneBalanceAlgorithmRevisionno 
230SceneBalanceAlgorithmCommandno0 = Neutral SBA On, Color SBA On +
1 = Neutral SBA Off, Color SBA Off +
2 = Neutral SBA On, Color SBA Off +
3 = Neutral SBA Off, Color SBA On
325SceneBalanceAlgorithmFilmIDno +
1 = 3M ScotchColor AT 100 +
2 = 3M ScotchColor AT 200 +
3 = 3M ScotchColor HR2 400 +
7 = 3M Scotch HR 200 Gen 2 +
9 = 3M Scotch HR 400 Gen 2 +
16 = Agfa Agfacolor XRS 400 Gen 1 +
17 = Agfa Agfacolor XRG/XRS 400 +
18 = Agfa Agfacolor XRG/XRS 200 +
19 = Agfa Agfacolor XRS 1000 Gen 2 +
20 = Agfa Agfacolor XRS 400 Gen 2 +
21 = Agfa Agfacolor XRS/XRC 100 +
26 = Fuji Reala 100 (JAPAN) +
27 = Fuji Reala 100 Gen 1 +
28 = Fuji Reala 100 Gen 2 +
29 = Fuji SHR 400 Gen 2 +
30 = Fuji Super HG 100 +
31 = Fuji Super HG 1600 Gen 1 +
32 = Fuji Super HG 200 +
33 = Fuji Super HG 400 +
34 = Fuji Super HG 100 Gen 2 +
35 = Fuji Super HR 100 Gen 1 +
36 = Fuji Super HR 100 Gen 2 +
37 = Fuji Super HR 1600 Gen 2 +
38 = Fuji Super HR 200 Gen 1 +
39 = Fuji Super HR 200 Gen 2 +
40 = Fuji Super HR 400 Gen 1 +
43 = Fuji NSP 160S (Pro) +
45 = Kodak Kodacolor VR 100 Gen 2 +
47 = Kodak Gold 400 Gen 3 +
55 = Kodak Ektar 100 Gen 1 +
56 = Kodak Ektar 1000 Gen 1 +
57 = Kodak Ektar 125 Gen 1 +
58 = Kodak Royal Gold 25 RZ +
60 = Kodak Gold 1600 Gen 1 +
61 = Kodak Gold 200 Gen 2 +
62 = Kodak Gold 400 Gen 2 +
65 = Kodak Kodacolor VR 100 Gen 1 +
66 = Kodak Kodacolor VR 1000 Gen 2 +
67 = Kodak Kodacolor VR 1000 Gen 1 +
68 = Kodak Kodacolor VR 200 Gen 1 +
69 = Kodak Kodacolor VR 400 Gen 1 +
70 = Kodak Kodacolor VR 200 Gen 2 +
71 = Kodak Kodacolor VRG 100 Gen 1 +
72 = Kodak Gold 100 Gen 2 +
73 = Kodak Kodacolor VRG 200 Gen 1 +
74 = Kodak Gold 400 Gen 1 +
87 = Kodak Ektacolor Gold 160 +
88 = Kodak Ektapress 1600 Gen 1 PPC +
89 = Kodak Ektapress Gold 100 Gen 1 PPA +
90 = Kodak Ektapress Gold 400 PPB-3 +
92 = Kodak Ektar 25 Professional PHR +
97 = Kodak T-Max 100 Professional +
98 = Kodak T-Max 3200 Professional +
99 = Kodak T-Max 400 Professional +
101 = Kodak Vericolor 400 Prof VPH +
102 = Kodak Vericolor III Pro +
121 = Konika Konica Color SR-G 3200 +
122 = Konika Konica Color Super SR100 +
123 = Konika Konica Color Super SR 400 +
138 = Kodak Gold Unknown +
139 = Kodak Unknown Neg A- Normal SBA +
143 = Kodak Ektar 100 Gen 2 +
147 = Kodak Kodacolor CII +
148 = Kodak Kodacolor II +
149 = Kodak Gold Plus 200 Gen 3 +
150 = Kodak Internegative +10% Contrast +
151 = Agfa Agfacolor Ultra 50 +
152 = Fuji NHG 400 +
153 = Agfa Agfacolor XRG 100 +
154 = Kodak Gold Plus 100 Gen 3 +
155 = Konika Konica Color Super SR200 Gen 1 +
156 = Konika Konica Color SR-G 160 +
157 = Agfa Agfacolor Optima 125 +
158 = Agfa Agfacolor Portrait 160 +
162 = Kodak Kodacolor VRG 400 Gen 1 +
163 = Kodak Gold 200 Gen 1 +
164 = Kodak Kodacolor VRG 100 Gen 2 +
174 = Kodak Internegative +20% Contrast +
175 = Kodak Internegative +30% Contrast +
176 = Kodak Internegative +40% Contrast +
184 = Kodak TMax-100 D-76 CI = .40 +
185 = Kodak TMax-100 D-76 CI = .50 +
186 = Kodak TMax-100 D-76 CI = .55 +
187 = Kodak TMax-100 D-76 CI = .70 +
188 = Kodak TMax-100 D-76 CI = .80 +
189 = Kodak TMax-100 TMax CI = .40 +
190 = Kodak TMax-100 TMax CI = .50 +
191 = Kodak TMax-100 TMax CI = .55 +
192 = Kodak TMax-100 TMax CI = .70 +
193 = Kodak TMax-100 TMax CI = .80 +
195 = Kodak TMax-400 D-76 CI = .40 +
196 = Kodak TMax-400 D-76 CI = .50 +
197 = Kodak TMax-400 D-76 CI = .55 +
198 = Kodak TMax-400 D-76 CI = .70 +
214 = Kodak TMax-400 D-76 CI = .80 +
215 = Kodak TMax-400 TMax CI = .40 +
216 = Kodak TMax-400 TMax CI = .50 +
217 = Kodak TMax-400 TMax CI = .55 +
218 = Kodak TMax-400 TMax CI = .70 +
219 = Kodak TMax-400 TMax CI = .80 +
224 = 3M ScotchColor ATG 400/EXL 400 +
266 = Agfa Agfacolor Optima 200 +
267 = Konika Impressa 50 +
268 = Polaroid Polaroid CP 200 +
269 = Konika Konica Color Super SR200 Gen 2 +
270 = ILFORD XP2 400 +
271 = Polaroid Polaroid Color HD2 100 +
272 = Polaroid Polaroid Color HD2 400 +
273 = Polaroid Polaroid Color HD2 200 +
282 = 3M ScotchColor ATG-1 200 +
284 = Konika XG 400 +
307 = Kodak Universal Reversal B/W +
308 = Kodak RPC Copy Film Gen 1 +
312 = Kodak Universal E6 +
324 = Kodak Gold Ultra 400 Gen 4 +
328 = Fuji Super G 100 +
329 = Fuji Super G 200 +
330 = Fuji Super G 400 Gen 2 +
333 = Kodak Universal K14 +
334 = Fuji Super G 400 Gen 1 +
366 = Kodak Vericolor HC 6329 VHC +
367 = Kodak Vericolor HC 4329 VHC +
368 = Kodak Vericolor L 6013 VPL +
369 = Kodak Vericolor L 4013 VPL +
418 = Kodak Ektacolor Gold II 400 Prof +
430 = Kodak Royal Gold 1000 +
431 = Kodak Kodacolor VR 200 / 5093 +
432 = Kodak Gold Plus 100 Gen 4 +
443 = Kodak Royal Gold 100 +
444 = Kodak Royal Gold 400 +
445 = Kodak Universal E6 auto-balance +
446 = Kodak Universal E6 illum. corr. +
447 = Kodak Universal K14 auto-balance +
448 = Kodak Universal K14 illum. corr. +
449 = Kodak Ektar 100 Gen 3 SY +
456 = Kodak Ektar 25 +
457 = Kodak Ektar 100 Gen 3 CX +
458 = Kodak Ektapress Plus 100 Prof PJA-1 +
459 = Kodak Ektapress Gold II 100 Prof +
460 = Kodak Pro 100 PRN +
461 = Kodak Vericolor HC 100 Prof VHC-2 +
462 = Kodak Prof Color Neg 100 +
463 = Kodak Ektar 1000 Gen 2 +
464 = Kodak Ektapress Plus 1600 Pro PJC-1 +
465 = Kodak Ektapress Gold II 1600 Prof +
466 = Kodak Super Gold 1600 GF Gen 2 +
467 = Kodak Kodacolor 100 Print Gen 4 +
468 = Kodak Super Gold 100 Gen 4 +
469 = Kodak Gold 100 Gen 4 +
470 = Kodak Gold III 100 Gen 4 +
471 = Kodak Funtime 100 FA +
472 = Kodak Funtime 200 FB +
473 = Kodak Kodacolor VR 200 Gen 4 +
474 = Kodak Gold Super 200 Gen 4 +
475 = Kodak Kodacolor 200 Print Gen 4 +
476 = Kodak Super Gold 200 Gen 4 +
477 = Kodak Gold 200 Gen 4 +
478 = Kodak Gold III 200 Gen 4 +
479 = Kodak Gold Ultra 400 Gen 5 +
480 = Kodak Super Gold 400 Gen 5 +
481 = Kodak Gold 400 Gen 5 +
482 = Kodak Gold III 400 Gen 5 +
483 = Kodak Kodacolor 400 Print Gen 5 +
484 = Kodak Ektapress Plus 400 Prof PJB-2 +
485 = Kodak Ektapress Gold II 400 Prof G5 +
486 = Kodak Pro 400 PPF-2 +
487 = Kodak Ektacolor Gold II 400 EGP-4 +
488 = Kodak Ektacolor Gold 400 Prof EGP-4 +
489 = Kodak Ektapress Gold II Multspd PJM +
490 = Kodak Pro 400 MC PMC +
491 = Kodak Vericolor 400 Prof VPH-2 +
492 = Kodak Vericolor 400 Plus Prof VPH-2 +
493 = Kodak Unknown Neg Product Code 83 +
505 = Kodak Ektacolor Pro Gold 160 GPX +
508 = Kodak Royal Gold 200 +
517 = Kodak 4050000000 +
519 = Kodak Gold Plus 100 Gen 5 +
520 = Kodak Gold 800 Gen 1 +
521 = Kodak Gold Super 200 Gen 5 +
522 = Kodak Ektapress Plus 200 Prof +
523 = Kodak 4050 E6 auto-balance +
524 = Kodak 4050 E6 ilum. corr. +
525 = Kodak 4050 K14 +
526 = Kodak 4050 K14 auto-balance +
527 = Kodak 4050 K14 ilum. corr. +
528 = Kodak 4050 Reversal B&W +
532 = Kodak Advantix 200 +
533 = Kodak Advantix 400 +
534 = Kodak Advantix 100 +
535 = Kodak Ektapress Multspd Prof PJM-2 +
536 = Kodak Kodacolor VR 200 Gen 5 +
537 = Kodak Funtime 200 FB Gen 2 +
538 = Kodak Commercial 200 +
539 = Kodak Royal Gold 25 Copystand +
540 = Kodak Kodacolor DA 100 Gen 5 +
545 = Kodak Kodacolor VR 400 Gen 2 +
546 = Kodak Gold 100 Gen 6 +
547 = Kodak Gold 200 Gen 6 +
548 = Kodak Gold 400 Gen 6 +
549 = Kodak Royal Gold 100 Gen 2 +
550 = Kodak Royal Gold 200 Gen 2 +
551 = Kodak Royal Gold 400 Gen 2 +
552 = Kodak Gold Max 800 Gen 2 +
554 = Kodak 4050 E6 high contrast +
555 = Kodak 4050 E6 low saturation high contrast +
556 = Kodak 4050 E6 low saturation +
557 = Kodak Universal E-6 Low Saturation +
558 = Kodak T-Max T400 CN +
563 = Kodak Ektapress PJ100 +
564 = Kodak Ektapress PJ400 +
565 = Kodak Ektapress PJ800 +
567 = Kodak Portra 160NC +
568 = Kodak Portra 160VC +
569 = Kodak Portra 400NC +
570 = Kodak Portra 400VC +
575 = Kodak Advantix 100-2 +
576 = Kodak Advantix 200-2 +
577 = Kodak Advantix Black & White + 400 +
578 = Kodak Ektapress PJ800-2
+
331CopyrightStatusno1 = Restrictions apply +
255 = Not specified
332CopyrightFileNameno 
1538Orientationno[val & 0x3] +
0 = Horizontal (normal) +
1 = Rotate 270 CW +
2 = Rotate 180 +
3 = Rotate 90 CW
1538.1ImageWidthno[val >> 2 & 0x3]
1538.2ImageHeightno[val >> 2 & 0x3]
1538.3CompressionClassno[val >> 5 & 0x3] +
0 = Class 1 - 35mm film; Pictoral hard copy +
1 = Class 2 - Large format film +
2 = Class 3 - Text and graphics, high resolution +
3 = Class 4 - Text and graphics, high dynamic range
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 24, 2018 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PhotoMechanic.html b/html/TagNames/PhotoMechanic.html new file mode 100644 index 0000000..75fd711 --- /dev/null +++ b/html/TagNames/PhotoMechanic.html @@ -0,0 +1,199 @@ + + + + +PhotoMechanic Tags + + + +

PhotoMechanic Tags

+

The Photo Mechanic trailer contains data in an IPTC-format structure, with +soft edit information stored under record number 2.

+
+
+ + + + + + + + +
RecordTag NameWritableValues / Notes
2SoftEdit---> PhotoMechanic SoftEdit Tags
+ +

PhotoMechanic SoftEdit Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
209RawCropLeftint32s 
210RawCropTopint32s 
211RawCropRightint32s 
212RawCropBottomint32s 
213ConstrainedCropWidthint32s 
214ConstrainedCropHeightint32s 
215FrameNumint32s 
216Rotationint32s0 = 0 +
1 = 90 +
2 = 180 +
3 = 270
217CropLeftint32s 
218CropTopint32s 
219CropRightint32s 
220CropBottomint32s 
221Taggedint32s0 = No +
1 = Yes
222ColorClassint32s + +
0 = 0 (None) +
1 = 1 (Winner) +
2 = 2 (Winner alt) +
3 = 3 (Superior) +
4 = 4 (Superior alt)
  5 = 5 (Typical) +
6 = 6 (Typical alt) +
7 = 7 (Extras) +
8 = 8 (Trash)
+
223Ratingint32s 
236PreviewCropLeftint32s 
237PreviewCropTopint32s 
238PreviewCropRightint32s 
239PreviewCropBottomint32s 
+ +

PhotoMechanic XMP Tags

+

Below is a list of the observed PhotoMechanic XMP tags. The actual +namespace prefix is "photomechanic" but ExifTool shortens this in +the family 1 group name.

+ +

These tags belong to the ExifTool XMP-photomech family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
ColorClassinteger + +
0 = 0 (None) +
1 = 1 (Winner) +
2 = 2 (Winner alt) +
3 = 3 (Superior) +
4 = 4 (Superior alt)
  5 = 5 (Typical) +
6 = 6 (Typical alt) +
7 = 7 (Extras) +
8 = 8 (Trash)
+
CountryCodestring/ 
EditStatusstring 
PMVersionstring 
Prefsstring(format is "Tagged:0, ColorClass:1, Rating:2, FrameNum:3")
Taggedboolean'False' = No +
'True' = Yes
TimeCreatedstring/ 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Sep 14, 2016 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Photoshop.html b/html/TagNames/Photoshop.html new file mode 100644 index 0000000..8951e42 --- /dev/null +++ b/html/TagNames/Photoshop.html @@ -0,0 +1,769 @@ + + + + +Photoshop Tags + + + +

Photoshop Tags

+

+Photoshop tags are found in PSD and PSB files, as well as inside embedded +Photoshop information in many other file types (JPEG, TIFF, PDF, PNG to name +a few).

+ +

Many Photoshop tags are marked as Unknown (indicated by a question mark +after the tag name) because the information they provide is not very useful +under normal circumstances. These unknown tags are not extracted unless the +Unknown (-u) option is used. See +http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ for the +official specification

+ +

Photoshop path tags (Tag ID's 0x7d0 to 0xbb5) are not defined by default, +but a config file included in the full ExifTool distribution +(config_files/photoshop_paths.config) contains the tag definitions to allow +access to this information. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x03e8Photoshop2Info?no 
0x03e9MacintoshPrintInfo?no 
0x03eaXMLData?no 
0x03ebPhotoshop2ColorTable?no 
0x03edResolutionInfo---> Photoshop Resolution Tags
0x03eeAlphaChannelsNamesno 
0x03efDisplayInfo?no 
0x03f0PStringCaption?no 
0x03f1BorderInformation?no 
0x03f2BackgroundColor?no 
0x03f3PrintFlags?no 
0x03f4BW_HalftoningInfo?no 
0x03f5ColorHalftoningInfo?no 
0x03f6DuotoneHalftoningInfo?no 
0x03f7BW_TransferFunc?no 
0x03f8ColorTransferFuncs?no 
0x03f9DuotoneTransferFuncs?no 
0x03faDuotoneImageInfo?no 
0x03fbEffectiveBW?no 
0x03fcObsoletePhotoshopTag1?no 
0x03fdEPSOptions?no 
0x03feQuickMaskInfo?no 
0x03ffObsoletePhotoshopTag2?no 
0x0400TargetLayerID?no 
0x0401WorkingPath?no 
0x0402LayersGroupInfo?no 
0x0403ObsoletePhotoshopTag3?no 
0x0404IPTCData---> IPTC Tags
0x0405RawImageMode?no 
0x0406JPEG_Quality---> Photoshop JPEG_Quality Tags
0x0408GridGuidesInfo?no 
0x0409PhotoshopBGRThumbnailundef!(this is a JPEG image, but in BGR format instead of RGB)
0x040aCopyrightFlagint8u0 = False +
1 = True
0x040bURLstring 
0x040cPhotoshopThumbnailundef! 
0x040dGlobalAngleint32u 
0x040eColorSamplersResource?no 
0x040fICC_Profile---> ICC_Profile Tags
0x0410Watermark?no 
0x0411ICC_Untagged?no 
0x0412EffectsVisible?no 
0x0413SpotHalftone?no 
0x0414IDsBaseValue?no 
0x0415UnicodeAlphaNames?no 
0x0416IndexedColorTableCount?no 
0x0417TransparentIndex?no 
0x0419GlobalAltitudeint32u 
0x041aSliceInfo---> Photoshop SliceInfo Tags
0x041bWorkflowURLno 
0x041cJumpToXPEP?no 
0x041dAlphaIdentifiers?no 
0x041eURL_Listno+ 
0x0421VersionInfo---> Photoshop VersionInfo Tags
0x0422EXIFInfo---> EXIF Tags
0x0423ExifInfo2?no 
0x0424XMP---> XMP Tags
0x0425IPTCDigeststring!(this tag indicates provides a way for XMP-aware applications to indicate +that the XMP is synchronized with the IPTC. The MWG recommendation is to +ignore the XMP if IPTCDigest exists and doesn't match the CurrentIPTCDigest. +When writing, special values of "new" and "old" represent the digests of the +IPTC from the edited and original files respectively, and are undefined if +the IPTC does not exist in the respective file. Set this to "new" as an +indication that the XMP is synchronized with the IPTC)
0x0426PrintScaleInfo---> Photoshop PrintScaleInfo Tags
0x0428PixelInfo---> Photoshop PixelInfo Tags
0x0429LayerComps?no 
0x042aAlternateDuotoneColors?no 
0x042bAlternateSpotColors?no 
0x042dLayerSelectionIDs?no 
0x042eHDRToningInfo?no 
0x042fPrintInfo?no 
0x0430LayerGroupsEnabledID?no 
0x0431ColorSamplersResource2?no 
0x0432MeasurementScale?no 
0x0433TimelineInfo?no 
0x0434SheetDisclosure?no 
0x0435DisplayInfo?no 
0x0436OnionSkins?no 
0x0438CountInfo?no 
0x043aPrintInfo2?no 
0x043bPrintStyle?no 
0x043cMacintoshNSPrintInfo?no 
0x043dWindowsDEVMODE?no 
0x043eAutoSaveFilePath?no 
0x043fAutoSaveFormat?no 
0x0440PathSelectionState?no 
0x0bb7ClippingPathNameno 
0x0bb8OriginPathInfo?no 
0x1b58ImageReadyVariables?no 
0x1b59ImageReadyDataSets?no 
0x1f40LightroomWorkflow?no 
0x2710PrintFlagsInfo?no 
+ +

Photoshop Resolution Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0XResolutionint32u 
2DisplayedUnitsXint16u1 = inches +
2 = cm
4YResolutionint32u 
6DisplayedUnitsYint16u1 = inches +
2 = cm
+ +

Photoshop JPEG_Quality Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0PhotoshopQualityint16s 
1PhotoshopFormatno0 = Standard +
1 = Optimized +
257 = Progressive
2ProgressiveScansno1 = 3 Scans +
2 = 4 Scans +
3 = 5 Scans
+ +

Photoshop SliceInfo Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
20SlicesGroupNameno 
24NumSlicesno 
+ +

Photoshop VersionInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4HasRealMergedDatano0 = No +
1 = Yes
5WriterNameno 
9ReaderNameno 
+ +

Photoshop PrintScaleInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0PrintStyleno0 = Centered +
1 = Size to Fit +
2 = User Defined
2PrintPositionno 
10PrintScaleno 
+ +

Photoshop PixelInfo Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
4PixelAspectRationo 
+ +

Photoshop DocumentData Tags

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Layr'Layers---> Photoshop Layers Tags
'Lr16'Layers---> Photoshop Layers Tags
+ +

Photoshop Layers Tags

+

Tags extracted from Photoshop layer information.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'_xbnd'LayerBlendModesno+ + +
'colr' = Color +
'dark' = Darken +
'diff' = Difference +
'diss' = Dissolve +
'div ' = Color Dodge +
'dkCl' = Darker Color +
'fdiv' = Divide +
'fsub' = Subtract +
'hLit' = Hard Light +
'hMix' = Hard Mix +
'hue ' = Hue +
'idiv' = Color Burn +
'lLit' = Linear Light +
'lbrn' = Linear Burn
  'lddg' = Linear Dodge +
'lgCl' = Lighter Color +
'lite' = Lighten +
'lum ' = Luminosity +
'mul ' = Multiply +
'norm' = Normal +
'over' = Overlay +
'pLit' = Pin Light +
'pass' = Pass Through +
'sLit' = Soft Light +
'sat ' = Saturation +
'scrn' = Screen +
'smud' = Exclusion +
'vLit' = Vivid Light
+
'_xcnt'LayerCountno 
'_xnam'LayerNamesno+ 
'_xopc'LayerOpacitiesno+ 
'_xrct'LayerRectanglesno+(top left bottom right)
'luni'LayerUnicodeNamesno+ 
'lyid'LayerIDs?no+ 
'shmd'LayerModifyDatesno+ 
+ +

Photoshop Header Tags

+

This information is found in the PSD file header.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
6NumChannelsno 
7ImageHeightno 
9ImageWidthno 
11BitDepthno 
12ColorModeno + +
0 = Bitmap +
1 = Grayscale +
2 = Indexed +
3 = RGB
  4 = CMYK +
7 = Multichannel +
8 = Duotone +
9 = Lab
+
+ +

Photoshop ImageData Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
0Compressionno0 = Uncompressed +
1 = RLE +
2 = ZIP without prediction +
3 = ZIP with prediction
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 1, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PostScript.html b/html/TagNames/PostScript.html new file mode 100644 index 0000000..9206cfa --- /dev/null +++ b/html/TagNames/PostScript.html @@ -0,0 +1,174 @@ + + + + +PostScript Tags + + + +

PostScript Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'AI12_BuildNumber'AIBuildNumberno 
'AI3_ColorUsage'AIColorUsageno 
'AI5_FileFormat'AIFileFormatno 
'AI5_NumLayers'AINumLayersno 
'AI5_RulerUnits'AIRulerUnitsno + +
0 = Inches +
1 = Millimeters +
2 = Points
  3 = Picas +
4 = Centimeters +
6 = Pixels
+
'AI5_TargetResolution'AITargetResolutionno 
'AI8_CreatorVersion'AICreatorVersionno 
'AI9_ColorModel'AIColorModelno1 = RGB +
2 = CMYK
'Author'Authorstring 
'BeginDocument'EmbeddedFile---> PostScript Tags +
(extracted with ExtractEmbedded option)
'BeginICCProfile'ICC_Profile---> ICC_Profile Tags
'BeginPhotoshop'PhotoshopData---> Photoshop Tags
'BoundingBox'BoundingBoxno 
'Copyright'Copyrightstring 
'CreationDate'CreateDatestring 
'Creator'Creatorstring 
'EmbeddedFileName'EmbeddedFileNameno(not a real tag ID, but the file name from a BeginDocument statement. +Extracted with document metadata when ExtractEmbedded option is used)
'For'Forstring(for whom the document was prepared)
'ImageData'ImageDatano 
'Keywords'Keywordsstring 
'ModDate'ModifyDatestring 
'Pages'Pagesno 
'Routing'Routingstring 
'Subject'Subjectstring 
'TIFFPreview'TIFFPreviewno(not a real tag ID, but used to represent the TIFF preview extracted from DOS +EPS images)
'Title'Titlestring 
'Version'Versionstring 
'begin_xml_packet'XMP---> XMP Tags
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Apr 13, 2018 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/PrintIM.html b/html/TagNames/PrintIM.html new file mode 100644 index 0000000..6c90657 --- /dev/null +++ b/html/TagNames/PrintIM.html @@ -0,0 +1,32 @@ + + + + +PrintIM Tags + + + +

PrintIM Tags

+

+The format of the PrintIM information is known, however no PrintIM tags have +been decoded. Use the Unknown (-u) option to extract PrintIM information. +

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'PrintIMVersion'PrintIMVersionno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Mar 19, 2010 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Qualcomm.html b/html/TagNames/Qualcomm.html new file mode 100644 index 0000000..38226f1 --- /dev/null +++ b/html/TagNames/Qualcomm.html @@ -0,0 +1,4779 @@ + + + + +Qualcomm Tags + + + +

Qualcomm Tags

+

The tags below have been observed in the JPEG APP7 "Qualcomm Camera +Attributes" segment written by some cameras such as the HP iPAQ Voice +Messenger. ExifTool will extract any information found from this segment, +even if it is not listed in this table.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AECAggressivenessno 
AECCurrentExpIndexno 
AECCurrentSensorLumano 
AECEnableno 
AECExposureIndexAdjStepno 
AECHighLumaRegionCountno 
AECHighLumaRegionThresholdno 
AECIndoorIdxno 
AECLumaTargetno 
AECLumaToleranceno 
AECModeno 
AECOdoorIdxno 
AECOutdoorBrightDiscardedno 
AECOutdoorBrightEnableno 
AECOutdoorBrightReductionno 
AECOutdoorBrightThresholdHIno 
AECOutdoorBrightThresholdLOno 
AECOutdoorGammaIndexno 
AECSnapshotDigitalGainno 
AECSnapshotExposureTimeMsno 
AECSnapshotLineCountno 
AECSnapshotSensorGainno 
AECVfeLumano 
AFBoundaryno 
AFCollectEndStatno 
AFEnableno 
AFFarEndno 
AFFineSrchPointsno 
AFFineStepno 
AFFocusTimeno 
AFGrossStepno 
AFModeno 
AFNearEndno 
AFPosDefMacrono 
AFPosDefNormno 
AFPositionno 
AFProcessno 
AFREnableno 
AFRFaster0ExpModno 
AFRFaster0Triggerno 
AFRFaster1ExpModno 
AFRFaster1Triggerno 
AFRFaster2ExpModno 
AFRFaster2Triggerno 
AFRFaster3ExpModno 
AFRFaster3Triggerno 
AFRFaster4ExpModno 
AFRFaster4Triggerno 
AFRPossibleFrameCntno 
AFRSlower0ExpModno 
AFRSlower0Triggerno 
AFRSlower1ExpModno 
AFRSlower1Triggerno 
AFRSlower2ExpModno 
AFRSlower2Triggerno 
AFRSlower3ExpModno 
AFRSlower3Triggerno 
AFRSlower4ExpModno 
AFRSlower4Triggerno 
AFResetLensAfterSnapno 
AFStepsNearFarno 
AFStepsNearInfinityno 
AFTestModeno 
AFTracePositions00no 
AFTracePositions01no 
AFTracePositions02no 
AFTracePositions03no 
AFTracePositions04no 
AFTracePositions05no 
AFTracePositions06no 
AFTracePositions07no 
AFTracePositions08no 
AFTracePositions09no 
AFTracePositions10no 
AFTracePositions11no 
AFTracePositions12no 
AFTracePositions13no 
AFTracePositions14no 
AFTracePositions15no 
AFTracePositions16no 
AFTracePositions17no 
AFTracePositions18no 
AFTracePositions19no 
AFTracePositions20no 
AFTracePositions21no 
AFTracePositions22no 
AFTracePositions23no 
AFTracePositions24no 
AFTracePositions25no 
AFTracePositions26no 
AFTracePositions27no 
AFTracePositions28no 
AFTracePositions29no 
AFTracePositions30no 
AFTracePositions31no 
AFTracePositions32no 
AFTracePositions33no 
AFTracePositions34no 
AFTracePositions35no 
AFTracePositions36no 
AFTracePositions37no 
AFTracePositions38no 
AFTracePositions39no 
AFTracePositions40no 
AFTracePositions41no 
AFTracePositions42no 
AFTracePositions43no 
AFTracePositions44no 
AFTracePositions45no 
AFTracePositions46no 
AFTracePositions47no 
AFTracePositions48no 
AFTracePositions49no 
AFTraceStats00no 
AFTraceStats01no 
AFTraceStats02no 
AFTraceStats03no 
AFTraceStats04no 
AFTraceStats05no 
AFTraceStats06no 
AFTraceStats07no 
AFTraceStats08no 
AFTraceStats09no 
AFTraceStats10no 
AFTraceStats11no 
AFTraceStats12no 
AFTraceStats13no 
AFTraceStats14no 
AFTraceStats15no 
AFTraceStats16no 
AFTraceStats17no 
AFTraceStats18no 
AFTraceStats19no 
AFTraceStats20no 
AFTraceStats21no 
AFTraceStats22no 
AFTraceStats23no 
AFTraceStats24no 
AFTraceStats25no 
AFTraceStats26no 
AFTraceStats27no 
AFTraceStats28no 
AFTraceStats29no 
AFTraceStats30no 
AFTraceStats31no 
AFTraceStats32no 
AFTraceStats33no 
AFTraceStats34no 
AFTraceStats35no 
AFTraceStats36no 
AFTraceStats37no 
AFTraceStats38no 
AFTraceStats39no 
AFTraceStats40no 
AFTraceStats41no 
AFTraceStats42no 
AFTraceStats43no 
AFTraceStats44no 
AFTraceStats45no 
AFTraceStats46no 
AFTraceStats47no 
AFTraceStats48no 
AFTraceStats49no 
AFUndershootProtectno 
AFVfeHorzOffsetno 
AFVfeHorzWidthno 
AFVfeMetricMaxno 
AFVfeVertHeightno 
AFVfeVertOffsetno 
ASF3EdgeDetectno 
ASF3EdgeFilterA11no 
ASF3EdgeFilterA12no 
ASF3EdgeFilterA13no 
ASF3EdgeFilterA21no 
ASF3EdgeFilterA22no 
ASF3EdgeFilterA23no 
ASF3EdgeFilterA31no 
ASF3EdgeFilterA32no 
ASF3EdgeFilterA33no 
ASF3Enableno 
ASF3LowerThresholdno 
ASF3NoiseFilterA11no 
ASF3NoiseFilterA12no 
ASF3NoiseFilterA13no 
ASF3NoiseFilterA21no 
ASF3NoiseFilterA22no 
ASF3NoiseFilterA23no 
ASF3NoiseFilterA31no 
ASF3NoiseFilterA32no 
ASF3NoiseFilterA33no 
ASF3UpperThresholdno 
ASF5BrtLoThresno 
ASF5BrtShrpDegF1no 
ASF5BrtShrpDegF2no 
ASF5BrtSmthPercentno 
ASF5BrtUpThresno 
ASF5Enableno 
ASF5ExposureIndex1no 
ASF5ExposureIndex2no 
ASF5Filter1A11no 
ASF5Filter1A12no 
ASF5Filter1A13no 
ASF5Filter1A14no 
ASF5Filter1A15no 
ASF5Filter1A21no 
ASF5Filter1A22no 
ASF5Filter1A23no 
ASF5Filter1A24no 
ASF5Filter1A25no 
ASF5Filter1A31no 
ASF5Filter1A32no 
ASF5Filter1A33no 
ASF5Filter1A34no 
ASF5Filter1A35no 
ASF5Filter1A41no 
ASF5Filter1A42no 
ASF5Filter1A43no 
ASF5Filter1A44no 
ASF5Filter1A45no 
ASF5Filter1A51no 
ASF5Filter1A52no 
ASF5Filter1A53no 
ASF5Filter1A54no 
ASF5Filter1A55no 
ASF5Filter2A11no 
ASF5Filter2A12no 
ASF5Filter2A13no 
ASF5Filter2A14no 
ASF5Filter2A15no 
ASF5Filter2A21no 
ASF5Filter2A22no 
ASF5Filter2A23no 
ASF5Filter2A24no 
ASF5Filter2A25no 
ASF5Filter2A31no 
ASF5Filter2A32no 
ASF5Filter2A33no 
ASF5Filter2A34no 
ASF5Filter2A35no 
ASF5Filter2A41no 
ASF5Filter2A42no 
ASF5Filter2A43no 
ASF5Filter2A44no 
ASF5Filter2A45no 
ASF5Filter2A51no 
ASF5Filter2A52no 
ASF5Filter2A53no 
ASF5Filter2A54no 
ASF5Filter2A55no 
ASF5FilterModeno 
ASF5LowLoThresno 
ASF5LowShrpDegF1no 
ASF5LowShrpDegF2no 
ASF5LowSmthPrcntno 
ASF5LowUpThresno 
ASF5LumaFilter00no 
ASF5LumaFilter01no 
ASF5LumaFilter02no 
ASF5LumaFilter03no 
ASF5LumaFilter04no 
ASF5LumaFilter05no 
ASF5LumaFilter06no 
ASF5LumaFilter07no 
ASF5LumaFilter08no 
ASF5MaxExposureIndexno 
ASF5NrmLoThresno 
ASF5NrmShrpDegF1no 
ASF5NrmShrpDegF2no 
ASF5NrmSmthPrcntno 
ASF5NrmUpThresno 
ASF5NrmizeFactor1no 
ASF5NrmizeFactor2no 
AWBAggressivenessno 
AWBAgwGridDist2Threshno 
AWBAlgorithmno 
AWBAveBgRationo 
AWBAveRgRationo 
AWBBlueGainAdjRef1no 
AWBBlueGainAdjRef2no 
AWBBlueGainAdjRef3no 
AWBBlueGainAdjRef4no 
AWBBlueGainAdjRef5no 
AWBBlueGainAdjRef6no 
AWBBlueGainAdjRef7no 
AWBBlueGainAdjRef8no 
AWBBlueGainRef1no 
AWBBlueGainRef2no 
AWBBlueGainRef3no 
AWBBlueGainRef4no 
AWBBlueGainRef5no 
AWBBlueGainRef6no 
AWBBlueGainRef7no 
AWBBlueGainRef8no 
AWBCcBiasno 
AWBCompactClusterR2no 
AWBEnableno 
AWBGreenOffsetBgno 
AWBGreenOffsetRgno 
AWBIndoorSampleInfluenceno 
AWBLoVfeC1no 
AWBLoVfeC2no 
AWBLoVfeC3no 
AWBLoVfeC4no 
AWBLoVfeM1no 
AWBLoVfeM2no 
AWBLoVfeM3no 
AWBLoVfeM4no 
AWBLoVfeMaxYno 
AWBLoVfeMinYno 
AWBLowLigColCorEnano 
AWBMaxBGainno 
AWBMaxGGainno 
AWBMaxRGainno 
AWBMinBGainno 
AWBMinGGainno 
AWBMinRGainno 
AWBNormVfeC1no 
AWBNormVfeC2no 
AWBNormVfeC3no 
AWBNormVfeC4no 
AWBNormVfeM1no 
AWBNormVfeM2no 
AWBNormVfeM3no 
AWBNormVfeM4no 
AWBNormVfeMaxYno 
AWBNormVfeMinYno 
AWBOudorVfeC1no 
AWBOudorVfeC2no 
AWBOudorVfeC3no 
AWBOudorVfeC4no 
AWBOudorVfeM1no 
AWBOudorVfeM2no 
AWBOudorVfeM3no 
AWBOudorVfeM4no 
AWBOudorVfeMaxYno 
AWBOudorVfeMinYno 
AWBOutdoorSampleInfluenceno 
AWBPrevWbBgainno 
AWBPrevWbGgainno 
AWBPrevWbRgainno 
AWBRedGainAdjRef1no 
AWBRedGainAdjRef2no 
AWBRedGainAdjRef3no 
AWBRedGainAdjRef4no 
AWBRedGainAdjRef5no 
AWBRedGainAdjRef6no 
AWBRedGainAdjRef7no 
AWBRedGainAdjRef8no 
AWBRedGainRef1no 
AWBRedGainRef2no 
AWBRedGainRef3no 
AWBRedGainRef4no 
AWBRedGainRef5no 
AWBRedGainRef6no 
AWBRedGainRef7no 
AWBRedGainRef8no 
AWBSampleDecisionno 
AWBSnapshotBGainno 
AWBSnapshotRGainno 
AntiBadingPixelClkno 
AntiBadingPixelClkPerLineno 
AntibandingEnableno 
BlckLvlEvenColsno 
BlckLvlOddColsno 
CamMclkHzno 
ChroSupChroThres1no 
ChroSupChroThres2no 
ChroSupLumaThres1no 
ChroSupLumaThres2no 
ChroSupLumaThres3no 
ChroSupLumaThres4no 
ChromSupressno 
ClipToAfRatono 
CurrResolno 
DayltConvChrmA_Mno 
DayltConvChrmA_Pno 
DayltConvChrmB_Mno 
DayltConvChrmB_Pno 
DayltConvChrmC_Mno 
DayltConvChrmC_Pno 
DayltConvChrmD_Mno 
DayltConvChrmD_Pno 
DayltConvChrmKCbno 
DayltConvChrmKCrno 
DayltConvLumaKno 
DayltConvLumaV0no 
DayltConvLumaV1no 
DayltConvLumaV2no 
DefConvChrmA_Mno 
DefConvChrmA_Pno 
DefConvChrmB_Mno 
DefConvChrmB_Pno 
DefConvChrmC_Mno 
DefConvChrmC_Pno 
DefConvChrmD_Mno 
DefConvChrmD_Pno 
DefConvChrmKCbno 
DefConvChrmKCrno 
DefConvLumaKno 
DefConvLumaV0no 
DefConvLumaV1no 
DefConvLumaV2no 
DefCorC0no 
DefCorC1no 
DefCorC2no 
DefCorC3no 
DefCorC4no 
DefCorC5no 
DefCorC6no 
DefCorC7no 
DefCorC8no 
DefCorK0no 
DefCorK1no 
DefCorK2no 
DefLumaGammaModeno 
DefRgbGammaModeno 
DefectPixCorEnableno 
DefectPixMaxThreshno 
DefectPixMinThreshno 
DiscardFrstFrmno 
FrmSkipPttrnno 
GammaEnableno 
HJREnableno 
HJRMaxNumFramesno 
HJROneToTwoOffsetno 
HJRTextureThresholdno 
HJR_NReductionFlatno 
HJR_NReductionTextureno 
IncandConvChrmA_Mno 
IncandConvChrmA_Pno 
IncandConvChrmB_Mno 
IncandConvChrmB_Pno 
IncandConvChrmC_Mno 
IncandConvChrmC_Pno 
IncandConvChrmD_Mno 
IncandConvChrmD_Pno 
IncandConvChrmKCbno 
IncandConvChrmKCrno 
IncandConvLumaKno 
IncandConvLumaV0no 
IncandConvLumaV1no 
IncandConvLumaV2no 
LADetectno 
LAEnableno 
MaxPrviewFpsno 
MaxVideoFpsno 
NghtshtFpsno 
NightshotModeno 
OutlierDistanceno 
PclkInvertno 
PrviewFpsno 
PrviewResolno 
R2ABlueCtbl00no 
R2ABlueCtbl01no 
R2ABlueCtbl02no 
R2ABlueCtbl03no 
R2ABlueCtbl04no 
R2ABlueCtbl05no 
R2ABlueCtbl06no 
R2ABlueCtbl07no 
R2ABlueCtbl08no 
R2ABlueCtbl09no 
R2ABlueCtbl10no 
R2ABlueCtbl11no 
R2ABlueCtbl12no 
R2ABlueCtbl13no 
R2ABlueCtbl14no 
R2ABlueCtbl15no 
R2ABlueCtbl16no 
R2ABlueCtbl17no 
R2ABlueCtbl18no 
R2ABlueCtbl19no 
R2ABlueCtbl20no 
R2ABlueCtbl21no 
R2ABlueCtbl22no 
R2ABlueCtbl23no 
R2ABlueCtbl24no 
R2ABlueCtbl25no 
R2ABlueCtbl26no 
R2ABlueCtbl27no 
R2ABlueCtbl28no 
R2ABlueCtbl29no 
R2ABlueCtbl30no 
R2ABlueCtbl31no 
R2ABlueStbl00no 
R2ABlueStbl01no 
R2ABlueStbl02no 
R2ABlueStbl03no 
R2ABlueStbl04no 
R2ABlueStbl05no 
R2ABlueStbl06no 
R2ABlueStbl07no 
R2ABlueStbl08no 
R2ABlueStbl09no 
R2ABlueStbl10no 
R2ABlueStbl11no 
R2ABlueStbl12no 
R2ABlueStbl13no 
R2ABlueStbl14no 
R2ABlueStbl15no 
R2ABlueStbl16no 
R2ABlueStbl17no 
R2ABlueStbl18no 
R2ABlueStbl19no 
R2ABlueStbl20no 
R2ABlueStbl21no 
R2ABlueStbl22no 
R2ABlueStbl23no 
R2ABlueStbl24no 
R2ABlueStbl25no 
R2ABlueStbl26no 
R2ABlueStbl27no 
R2ABlueStbl28no 
R2ABlueStbl29no 
R2ABlueStbl30no 
R2ABlueStbl31no 
R2ACxno 
R2ACyno 
R2AGreenCtbl00no 
R2AGreenCtbl01no 
R2AGreenCtbl02no 
R2AGreenCtbl03no 
R2AGreenCtbl04no 
R2AGreenCtbl05no 
R2AGreenCtbl06no 
R2AGreenCtbl07no 
R2AGreenCtbl08no 
R2AGreenCtbl09no 
R2AGreenCtbl10no 
R2AGreenCtbl11no 
R2AGreenCtbl12no 
R2AGreenCtbl13no 
R2AGreenCtbl14no 
R2AGreenCtbl15no 
R2AGreenCtbl16no 
R2AGreenCtbl17no 
R2AGreenCtbl18no 
R2AGreenCtbl19no 
R2AGreenCtbl20no 
R2AGreenCtbl21no 
R2AGreenCtbl22no 
R2AGreenCtbl23no 
R2AGreenCtbl24no 
R2AGreenCtbl25no 
R2AGreenCtbl26no 
R2AGreenCtbl27no 
R2AGreenCtbl28no 
R2AGreenCtbl29no 
R2AGreenCtbl30no 
R2AGreenCtbl31no 
R2AGreenStbl00no 
R2AGreenStbl01no 
R2AGreenStbl02no 
R2AGreenStbl03no 
R2AGreenStbl04no 
R2AGreenStbl05no 
R2AGreenStbl06no 
R2AGreenStbl07no 
R2AGreenStbl08no 
R2AGreenStbl09no 
R2AGreenStbl10no 
R2AGreenStbl11no 
R2AGreenStbl12no 
R2AGreenStbl13no 
R2AGreenStbl14no 
R2AGreenStbl15no 
R2AGreenStbl16no 
R2AGreenStbl17no 
R2AGreenStbl18no 
R2AGreenStbl19no 
R2AGreenStbl20no 
R2AGreenStbl21no 
R2AGreenStbl22no 
R2AGreenStbl23no 
R2AGreenStbl24no 
R2AGreenStbl25no 
R2AGreenStbl26no 
R2AGreenStbl27no 
R2AGreenStbl28no 
R2AGreenStbl29no 
R2AGreenStbl30no 
R2AGreenStbl31no 
R2AHeightno 
R2AIntervalsno 
R2ARedCtbl00no 
R2ARedCtbl01no 
R2ARedCtbl02no 
R2ARedCtbl03no 
R2ARedCtbl04no 
R2ARedCtbl05no 
R2ARedCtbl06no 
R2ARedCtbl07no 
R2ARedCtbl08no 
R2ARedCtbl09no 
R2ARedCtbl10no 
R2ARedCtbl11no 
R2ARedCtbl12no 
R2ARedCtbl13no 
R2ARedCtbl14no 
R2ARedCtbl15no 
R2ARedCtbl16no 
R2ARedCtbl17no 
R2ARedCtbl18no 
R2ARedCtbl19no 
R2ARedCtbl20no 
R2ARedCtbl21no 
R2ARedCtbl22no 
R2ARedCtbl23no 
R2ARedCtbl24no 
R2ARedCtbl25no 
R2ARedCtbl26no 
R2ARedCtbl27no 
R2ARedCtbl28no 
R2ARedCtbl29no 
R2ARedCtbl30no 
R2ARedCtbl31no 
R2ARedStbl00no 
R2ARedStbl01no 
R2ARedStbl02no 
R2ARedStbl03no 
R2ARedStbl04no 
R2ARedStbl05no 
R2ARedStbl06no 
R2ARedStbl07no 
R2ARedStbl08no 
R2ARedStbl09no 
R2ARedStbl10no 
R2ARedStbl11no 
R2ARedStbl12no 
R2ARedStbl13no 
R2ARedStbl14no 
R2ARedStbl15no 
R2ARedStbl16no 
R2ARedStbl17no 
R2ARedStbl18no 
R2ARedStbl19no 
R2ARedStbl20no 
R2ARedStbl21no 
R2ARedStbl22no 
R2ARedStbl23no 
R2ARedStbl24no 
R2ARedStbl25no 
R2ARedStbl26no 
R2ARedStbl27no 
R2ARedStbl28no 
R2ARedStbl29no 
R2ARedStbl30no 
R2ARedStbl31no 
R2ATbl00no 
R2ATbl01no 
R2ATbl02no 
R2ATbl03no 
R2ATbl04no 
R2ATbl05no 
R2ATbl06no 
R2ATbl07no 
R2ATbl08no 
R2ATbl09no 
R2ATbl10no 
R2ATbl11no 
R2ATbl12no 
R2ATbl13no 
R2ATbl14no 
R2ATbl15no 
R2ATbl16no 
R2ATbl17no 
R2ATbl18no 
R2ATbl19no 
R2ATbl20no 
R2ATbl21no 
R2ATbl22no 
R2ATbl23no 
R2ATbl24no 
R2ATbl25no 
R2ATbl26no 
R2ATbl27no 
R2ATbl28no 
R2ATbl29no 
R2ATbl30no 
R2ATbl31no 
R2AWidthno 
R2D65BlueCtbl00no 
R2D65BlueCtbl01no 
R2D65BlueCtbl02no 
R2D65BlueCtbl03no 
R2D65BlueCtbl04no 
R2D65BlueCtbl05no 
R2D65BlueCtbl06no 
R2D65BlueCtbl07no 
R2D65BlueCtbl08no 
R2D65BlueCtbl09no 
R2D65BlueCtbl10no 
R2D65BlueCtbl11no 
R2D65BlueCtbl12no 
R2D65BlueCtbl13no 
R2D65BlueCtbl14no 
R2D65BlueCtbl15no 
R2D65BlueCtbl16no 
R2D65BlueCtbl17no 
R2D65BlueCtbl18no 
R2D65BlueCtbl19no 
R2D65BlueCtbl20no 
R2D65BlueCtbl21no 
R2D65BlueCtbl22no 
R2D65BlueCtbl23no 
R2D65BlueCtbl24no 
R2D65BlueCtbl25no 
R2D65BlueCtbl26no 
R2D65BlueCtbl27no 
R2D65BlueCtbl28no 
R2D65BlueCtbl29no 
R2D65BlueCtbl30no 
R2D65BlueCtbl31no 
R2D65BlueStbl00no 
R2D65BlueStbl01no 
R2D65BlueStbl02no 
R2D65BlueStbl03no 
R2D65BlueStbl04no 
R2D65BlueStbl05no 
R2D65BlueStbl06no 
R2D65BlueStbl07no 
R2D65BlueStbl08no 
R2D65BlueStbl09no 
R2D65BlueStbl10no 
R2D65BlueStbl11no 
R2D65BlueStbl12no 
R2D65BlueStbl13no 
R2D65BlueStbl14no 
R2D65BlueStbl15no 
R2D65BlueStbl16no 
R2D65BlueStbl17no 
R2D65BlueStbl18no 
R2D65BlueStbl19no 
R2D65BlueStbl20no 
R2D65BlueStbl21no 
R2D65BlueStbl22no 
R2D65BlueStbl23no 
R2D65BlueStbl24no 
R2D65BlueStbl25no 
R2D65BlueStbl26no 
R2D65BlueStbl27no 
R2D65BlueStbl28no 
R2D65BlueStbl29no 
R2D65BlueStbl30no 
R2D65BlueStbl31no 
R2D65Cxno 
R2D65Cyno 
R2D65GreenCtbl00no 
R2D65GreenCtbl01no 
R2D65GreenCtbl02no 
R2D65GreenCtbl03no 
R2D65GreenCtbl04no 
R2D65GreenCtbl05no 
R2D65GreenCtbl06no 
R2D65GreenCtbl07no 
R2D65GreenCtbl08no 
R2D65GreenCtbl09no 
R2D65GreenCtbl10no 
R2D65GreenCtbl11no 
R2D65GreenCtbl12no 
R2D65GreenCtbl13no 
R2D65GreenCtbl14no 
R2D65GreenCtbl15no 
R2D65GreenCtbl16no 
R2D65GreenCtbl17no 
R2D65GreenCtbl18no 
R2D65GreenCtbl19no 
R2D65GreenCtbl20no 
R2D65GreenCtbl21no 
R2D65GreenCtbl22no 
R2D65GreenCtbl23no 
R2D65GreenCtbl24no 
R2D65GreenCtbl25no 
R2D65GreenCtbl26no 
R2D65GreenCtbl27no 
R2D65GreenCtbl28no 
R2D65GreenCtbl29no 
R2D65GreenCtbl30no 
R2D65GreenCtbl31no 
R2D65GreenStbl00no 
R2D65GreenStbl01no 
R2D65GreenStbl02no 
R2D65GreenStbl03no 
R2D65GreenStbl04no 
R2D65GreenStbl05no 
R2D65GreenStbl06no 
R2D65GreenStbl07no 
R2D65GreenStbl08no 
R2D65GreenStbl09no 
R2D65GreenStbl10no 
R2D65GreenStbl11no 
R2D65GreenStbl12no 
R2D65GreenStbl13no 
R2D65GreenStbl14no 
R2D65GreenStbl15no 
R2D65GreenStbl16no 
R2D65GreenStbl17no 
R2D65GreenStbl18no 
R2D65GreenStbl19no 
R2D65GreenStbl20no 
R2D65GreenStbl21no 
R2D65GreenStbl22no 
R2D65GreenStbl23no 
R2D65GreenStbl24no 
R2D65GreenStbl25no 
R2D65GreenStbl26no 
R2D65GreenStbl27no 
R2D65GreenStbl28no 
R2D65GreenStbl29no 
R2D65GreenStbl30no 
R2D65GreenStbl31no 
R2D65Heightno 
R2D65Intervalsno 
R2D65RedCtbl00no 
R2D65RedCtbl01no 
R2D65RedCtbl02no 
R2D65RedCtbl03no 
R2D65RedCtbl04no 
R2D65RedCtbl05no 
R2D65RedCtbl06no 
R2D65RedCtbl07no 
R2D65RedCtbl08no 
R2D65RedCtbl09no 
R2D65RedCtbl10no 
R2D65RedCtbl11no 
R2D65RedCtbl12no 
R2D65RedCtbl13no 
R2D65RedCtbl14no 
R2D65RedCtbl15no 
R2D65RedCtbl16no 
R2D65RedCtbl17no 
R2D65RedCtbl18no 
R2D65RedCtbl19no 
R2D65RedCtbl20no 
R2D65RedCtbl21no 
R2D65RedCtbl22no 
R2D65RedCtbl23no 
R2D65RedCtbl24no 
R2D65RedCtbl25no 
R2D65RedCtbl26no 
R2D65RedCtbl27no 
R2D65RedCtbl28no 
R2D65RedCtbl29no 
R2D65RedCtbl30no 
R2D65RedCtbl31no 
R2D65RedStbl00no 
R2D65RedStbl01no 
R2D65RedStbl02no 
R2D65RedStbl03no 
R2D65RedStbl04no 
R2D65RedStbl05no 
R2D65RedStbl06no 
R2D65RedStbl07no 
R2D65RedStbl08no 
R2D65RedStbl09no 
R2D65RedStbl10no 
R2D65RedStbl11no 
R2D65RedStbl12no 
R2D65RedStbl13no 
R2D65RedStbl14no 
R2D65RedStbl15no 
R2D65RedStbl16no 
R2D65RedStbl17no 
R2D65RedStbl18no 
R2D65RedStbl19no 
R2D65RedStbl20no 
R2D65RedStbl21no 
R2D65RedStbl22no 
R2D65RedStbl23no 
R2D65RedStbl24no 
R2D65RedStbl25no 
R2D65RedStbl26no 
R2D65RedStbl27no 
R2D65RedStbl28no 
R2D65RedStbl29no 
R2D65RedStbl30no 
R2D65RedStbl31no 
R2D65Tbl00no 
R2D65Tbl01no 
R2D65Tbl02no 
R2D65Tbl03no 
R2D65Tbl04no 
R2D65Tbl05no 
R2D65Tbl06no 
R2D65Tbl07no 
R2D65Tbl08no 
R2D65Tbl09no 
R2D65Tbl10no 
R2D65Tbl11no 
R2D65Tbl12no 
R2D65Tbl13no 
R2D65Tbl14no 
R2D65Tbl15no 
R2D65Tbl16no 
R2D65Tbl17no 
R2D65Tbl18no 
R2D65Tbl19no 
R2D65Tbl20no 
R2D65Tbl21no 
R2D65Tbl22no 
R2D65Tbl23no 
R2D65Tbl24no 
R2D65Tbl25no 
R2D65Tbl26no 
R2D65Tbl27no 
R2D65Tbl28no 
R2D65Tbl29no 
R2D65Tbl30no 
R2D65Tbl31no 
R2D65Widthno 
R2TL84BlueCtbl00no 
R2TL84BlueCtbl01no 
R2TL84BlueCtbl02no 
R2TL84BlueCtbl03no 
R2TL84BlueCtbl04no 
R2TL84BlueCtbl05no 
R2TL84BlueCtbl06no 
R2TL84BlueCtbl07no 
R2TL84BlueCtbl08no 
R2TL84BlueCtbl09no 
R2TL84BlueCtbl10no 
R2TL84BlueCtbl11no 
R2TL84BlueCtbl12no 
R2TL84BlueCtbl13no 
R2TL84BlueCtbl14no 
R2TL84BlueCtbl15no 
R2TL84BlueCtbl16no 
R2TL84BlueCtbl17no 
R2TL84BlueCtbl18no 
R2TL84BlueCtbl19no 
R2TL84BlueCtbl20no 
R2TL84BlueCtbl21no 
R2TL84BlueCtbl22no 
R2TL84BlueCtbl23no 
R2TL84BlueCtbl24no 
R2TL84BlueCtbl25no 
R2TL84BlueCtbl26no 
R2TL84BlueCtbl27no 
R2TL84BlueCtbl28no 
R2TL84BlueCtbl29no 
R2TL84BlueCtbl30no 
R2TL84BlueCtbl31no 
R2TL84BlueStbl00no 
R2TL84BlueStbl01no 
R2TL84BlueStbl02no 
R2TL84BlueStbl03no 
R2TL84BlueStbl04no 
R2TL84BlueStbl05no 
R2TL84BlueStbl06no 
R2TL84BlueStbl07no 
R2TL84BlueStbl08no 
R2TL84BlueStbl09no 
R2TL84BlueStbl10no 
R2TL84BlueStbl11no 
R2TL84BlueStbl12no 
R2TL84BlueStbl13no 
R2TL84BlueStbl14no 
R2TL84BlueStbl15no 
R2TL84BlueStbl16no 
R2TL84BlueStbl17no 
R2TL84BlueStbl18no 
R2TL84BlueStbl19no 
R2TL84BlueStbl20no 
R2TL84BlueStbl21no 
R2TL84BlueStbl22no 
R2TL84BlueStbl23no 
R2TL84BlueStbl24no 
R2TL84BlueStbl25no 
R2TL84BlueStbl26no 
R2TL84BlueStbl27no 
R2TL84BlueStbl28no 
R2TL84BlueStbl29no 
R2TL84BlueStbl30no 
R2TL84BlueStbl31no 
R2TL84Cxno 
R2TL84Cyno 
R2TL84GreenCtbl00no 
R2TL84GreenCtbl01no 
R2TL84GreenCtbl02no 
R2TL84GreenCtbl03no 
R2TL84GreenCtbl04no 
R2TL84GreenCtbl05no 
R2TL84GreenCtbl06no 
R2TL84GreenCtbl07no 
R2TL84GreenCtbl08no 
R2TL84GreenCtbl09no 
R2TL84GreenCtbl10no 
R2TL84GreenCtbl11no 
R2TL84GreenCtbl12no 
R2TL84GreenCtbl13no 
R2TL84GreenCtbl14no 
R2TL84GreenCtbl15no 
R2TL84GreenCtbl16no 
R2TL84GreenCtbl17no 
R2TL84GreenCtbl18no 
R2TL84GreenCtbl19no 
R2TL84GreenCtbl20no 
R2TL84GreenCtbl21no 
R2TL84GreenCtbl22no 
R2TL84GreenCtbl23no 
R2TL84GreenCtbl24no 
R2TL84GreenCtbl25no 
R2TL84GreenCtbl26no 
R2TL84GreenCtbl27no 
R2TL84GreenCtbl28no 
R2TL84GreenCtbl29no 
R2TL84GreenCtbl30no 
R2TL84GreenCtbl31no 
R2TL84GreenStbl00no 
R2TL84GreenStbl01no 
R2TL84GreenStbl02no 
R2TL84GreenStbl03no 
R2TL84GreenStbl04no 
R2TL84GreenStbl05no 
R2TL84GreenStbl06no 
R2TL84GreenStbl07no 
R2TL84GreenStbl08no 
R2TL84GreenStbl09no 
R2TL84GreenStbl10no 
R2TL84GreenStbl11no 
R2TL84GreenStbl12no 
R2TL84GreenStbl13no 
R2TL84GreenStbl14no 
R2TL84GreenStbl15no 
R2TL84GreenStbl16no 
R2TL84GreenStbl17no 
R2TL84GreenStbl18no 
R2TL84GreenStbl19no 
R2TL84GreenStbl20no 
R2TL84GreenStbl21no 
R2TL84GreenStbl22no 
R2TL84GreenStbl23no 
R2TL84GreenStbl24no 
R2TL84GreenStbl25no 
R2TL84GreenStbl26no 
R2TL84GreenStbl27no 
R2TL84GreenStbl28no 
R2TL84GreenStbl29no 
R2TL84GreenStbl30no 
R2TL84GreenStbl31no 
R2TL84Heightno 
R2TL84Intervalsno 
R2TL84RedCtbl00no 
R2TL84RedCtbl01no 
R2TL84RedCtbl02no 
R2TL84RedCtbl03no 
R2TL84RedCtbl04no 
R2TL84RedCtbl05no 
R2TL84RedCtbl06no 
R2TL84RedCtbl07no 
R2TL84RedCtbl08no 
R2TL84RedCtbl09no 
R2TL84RedCtbl10no 
R2TL84RedCtbl11no 
R2TL84RedCtbl12no 
R2TL84RedCtbl13no 
R2TL84RedCtbl14no 
R2TL84RedCtbl15no 
R2TL84RedCtbl16no 
R2TL84RedCtbl17no 
R2TL84RedCtbl18no 
R2TL84RedCtbl19no 
R2TL84RedCtbl20no 
R2TL84RedCtbl21no 
R2TL84RedCtbl22no 
R2TL84RedCtbl23no 
R2TL84RedCtbl24no 
R2TL84RedCtbl25no 
R2TL84RedCtbl26no 
R2TL84RedCtbl27no 
R2TL84RedCtbl28no 
R2TL84RedCtbl29no 
R2TL84RedCtbl30no 
R2TL84RedCtbl31no 
R2TL84RedStbl00no 
R2TL84RedStbl01no 
R2TL84RedStbl02no 
R2TL84RedStbl03no 
R2TL84RedStbl04no 
R2TL84RedStbl05no 
R2TL84RedStbl06no 
R2TL84RedStbl07no 
R2TL84RedStbl08no 
R2TL84RedStbl09no 
R2TL84RedStbl10no 
R2TL84RedStbl11no 
R2TL84RedStbl12no 
R2TL84RedStbl13no 
R2TL84RedStbl14no 
R2TL84RedStbl15no 
R2TL84RedStbl16no 
R2TL84RedStbl17no 
R2TL84RedStbl18no 
R2TL84RedStbl19no 
R2TL84RedStbl20no 
R2TL84RedStbl21no 
R2TL84RedStbl22no 
R2TL84RedStbl23no 
R2TL84RedStbl24no 
R2TL84RedStbl25no 
R2TL84RedStbl26no 
R2TL84RedStbl27no 
R2TL84RedStbl28no 
R2TL84RedStbl29no 
R2TL84RedStbl30no 
R2TL84RedStbl31no 
R2TL84Tbl00no 
R2TL84Tbl01no 
R2TL84Tbl02no 
R2TL84Tbl03no 
R2TL84Tbl04no 
R2TL84Tbl05no 
R2TL84Tbl06no 
R2TL84Tbl07no 
R2TL84Tbl08no 
R2TL84Tbl09no 
R2TL84Tbl10no 
R2TL84Tbl11no 
R2TL84Tbl12no 
R2TL84Tbl13no 
R2TL84Tbl14no 
R2TL84Tbl15no 
R2TL84Tbl16no 
R2TL84Tbl17no 
R2TL84Tbl18no 
R2TL84Tbl19no 
R2TL84Tbl20no 
R2TL84Tbl21no 
R2TL84Tbl22no 
R2TL84Tbl23no 
R2TL84Tbl24no 
R2TL84Tbl25no 
R2TL84Tbl26no 
R2TL84Tbl27no 
R2TL84Tbl28no 
R2TL84Tbl29no 
R2TL84Tbl30no 
R2TL84Tbl31no 
R2TL84Widthno 
RolloffEnableno 
SensorFmtno 
SensorTypeno 
SensrFulHghtno 
SensrFulWdthno 
SensrQtrHghtno 
SensrQtrWdthno 
SnapshotResolno 
TL84ConvChrmA_Mno 
TL84ConvChrmA_Pno 
TL84ConvChrmB_Mno 
TL84ConvChrmB_Pno 
TL84ConvChrmC_Mno 
TL84ConvChrmC_Pno 
TL84ConvChrmD_Mno 
TL84ConvChrmD_Pno 
TL84ConvChrmKCbno 
TL84ConvChrmKCrno 
TL84ConvLumaKno 
TL84ConvLumaV0no 
TL84ConvLumaV1no 
TL84ConvLumaV2no 
VideoFpsno 
YhiYloConvChrmA_Mno 
YhiYloConvChrmA_Pno 
YhiYloConvChrmB_Mno 
YhiYloConvChrmB_Pno 
YhiYloConvChrmC_Mno 
YhiYloConvChrmC_Pno 
YhiYloConvChrmD_Mno 
YhiYloConvChrmD_Pno 
YhiYloConvChrmKCbno 
YhiYloConvChrmKCrno 
YhiYloConvLumaKno 
YhiYloConvLumaV0no 
YhiYloConvLumaV1no 
YhiYloConvLumaV2no 
YhiYloCorC0no 
YhiYloCorC1no 
YhiYloCorC2no 
YhiYloCorC3no 
YhiYloCorC4no 
YhiYloCorC5no 
YhiYloCorC6no 
YhiYloCorC7no 
YhiYloCorC8no 
YhiYloCorK0no 
YhiYloCorK1no 
YhiYloCorK2no 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Feb 20, 2012 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/QuickTime.html b/html/TagNames/QuickTime.html new file mode 100644 index 0000000..3f01e30 --- /dev/null +++ b/html/TagNames/QuickTime.html @@ -0,0 +1,8884 @@ + + + + +QuickTime Tags + + + +

QuickTime Tags

+

+The QuickTime format is used for many different types of audio, video and +image files (most notably, MOV/MP4 videos and HEIC/CR3 images). ExifTool +extracts standard meta information and a variety of audio, video and image +parameters, as well as proprietary information written by many camera +models. Tags with a question mark after their name are not extracted unless +the Unknown option is set.

+ +

When writing, ExifTool creates both QuickTime and XMP tags by default, but +the group may be specified to write one or the other separately. If no +location is specified, newly created QuickTime tags are added in the +ItemList location if +possible, otherwise in +UserData, and +finally in Keys, +but this order may be changed by setting the PREFERRED level of the +appropriate table in the config file (see +example.config in the full distribution for an +example). Note that some tags with the same name but different ID's may +exist in the same location, but the family 7 group names may be used to +differentiate these. ExifTool currently writes only top-level metadata in +QuickTime-based files; it extracts other track-specific and timed metadata, +but can not yet edit tags in these locations (with the exception of +track-level date/time tags).

+ +

Alternate language tags may be accessed for +ItemList and +Keys tags by adding +a 3-character ISO 639-2 language code and an optional ISO 3166-1 alpha 2 +country code to the tag name (eg. "ItemList:Artist-deu" or +"ItemList::Artist-deu-DE"). Most +UserData tags support a +language code, but without a country code. If no language code is specified +when writing, the default language is written and alternate languages for +the tag are deleted. Use the "und" language code to write the default +language without deleting alternate languages. Note that "eng" is treated +as a default language when reading, but not when writing.

+ +

According to the specification, integer-format QuickTime date/time tags +should be stored as UTC. Unfortunately, digital cameras often store local +time values instead (presumably because they don't know the time zone). For +this reason, by default ExifTool does not assume a time zone for these +values. However, if the API QuickTimeUTC option is set, then ExifTool will +assume these values are properly stored as UTC, and will convert them to +local time when extracting.

+ +

When writing string-based date/time tags, the system time zone is added if +the PrintConv option is enabled and no time zone is specified. This is +because Apple software may display crazy values if the time zone is missing +for some tags.

+ +

By default ExifTool will remove null padding from some QuickTime containers +in Canon CR3 files when writing, but the +QuickTimePad option may be used to preserve +the original size by padding with nulls if necessary.

+ +

See +https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/ +for the official specification. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'GPS 'GPSDataList2?no 
'IDIT'DateTimeOriginalstring 
'PICT'PreviewPICTno 
'_htc'HTCInfo---> QuickTime HTCInfo Tags
'ardt'ARDroneFileno 
'frea'Kodak_frea---> Kodak frea Tags
'free'KodakFree +
Pittasoft +
ThumbnailImage +
Free?
-
-
no
no
--> Kodak Free Tags +
--> QuickTime Pittasoft Tags
'ftyp'FileType---> QuickTime FileType Tags
'gps0'GPSTrack---> QuickTime Stream Tags
'gsen'GSensor---> QuickTime Stream Tags
'junk'Junk?no 
'mdat'MediaData?no 
'mdat-offset'MediaDataOffsetno 
'mdat-size'MediaDataSizeno(not a real tag ID, this tag represents the size of the 'mdat' data in bytes +and is used in the AvgBitrate calculation)
'meco'OtherMeta---> QuickTime OtherMeta Tags
'meta'Meta---> QuickTime Meta Tags
'moof'MovieFragment---> QuickTime MovieFragment Tags
'moov'Movie---> QuickTime Movie Tags
'pict'PreviewPICTno 
'pnot'Preview---> QuickTime Preview Tags
'prrt'ARDroneTelemetryno(telemetry information for each video frame: status1, status2, time, pitch, +roll, yaw, speed, altitude)
'sefd'SamsungTrailer---> Samsung Trailer Tags
'skip'CanonSkip +
PreviewImage +
Skip?
-
no
no
--> Canon Skip Tags
'thm 'ThumbnailImageno 
'thum'ThumbnailImageno 
'udat'GPSLogno(parsed to extract GPS separately when ExtractEmbedded is used)
'udta'UserData---> FLIR UserData Tags
'uuid'XMP +
UUID-PROF +
UUID-Flip +
UUID-Canon2 +
SensorData +
SensorData +
PreviewImage +
UUID-Unknown?
-
-
-
-
-
no
no
no
--> XMP Tags +
--> QuickTime Profile Tags +
--> QuickTime Flip Tags +
--> Canon uuid2 Tags +
--> QuickTime Tags360Fly Tags +
(raw 360Fly sensor data without ExtractEmbedded option)
'wide'Wide?no 
+ +

QuickTime HTCInfo Tags

+

Tags written by some HTC camera phones.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'slmt'Unknown_slmt?no 
+ +

QuickTime Pittasoft Tags

+

Tags found in Pittasoft Blackvue dashcam "free" data.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'3gf 'AccelData---> QuickTime Stream Tags
'cprt'Copyrightno 
'gps 'GPSLogno(parsed to extract GPS separately when ExtractEmbedded is used)
'ptnm'OriginalFileNameno 
'ptrh'Ptrh---> QuickTime Pittasoft Tags
'sttm'StartTimeno 
'thum'PreviewImageno 
+ +

QuickTime Stream Tags

+

The tags below are extracted from timed metadata in QuickTime and other +formats of video files when the ExtractEmbedded option is used. Although +most of these tags are combined into the single table below, ExifTool +currently reads 59 different formats of timed GPS metadata from video files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Accelerometerno(3-axis acceleration in units of g)
AccelerometerDatano 
AngularVelocityno 
CTMD---> Canon CTMD Tags
CameraDateTimeno 
Carno 
Distanceno 
ExposureCompensationno 
ExposureTimeno 
FNumberno 
FrameNumberno 
GPSAltitudeno 
GPSDOPno 
GPSDateTimeno 
GPSLatitudeno 
GPSLongitudeno 
GPSSatellitesno 
GPSSpeedno(in km/h unless GPSSpeedRef says otherwise)
GPSSpeedRefno'K' = km/h +
'M' = mph +
'N' = knots
GPSTimeStampno 
GPSTrackno(relative to true north unless GPSTrackRef says otherwise)
GPSTrackRefno'M' = Magnetic North +
'T' = True North
GSensorno 
INSV---> QuickTime INSV_MakerNotes Tags
ISOno 
JpgFromRawno 
KiloCaloriesno 
PreviewInfo---> QuickTime PreviewInfo Tags
RVMI_gReV +
RVMI_sReV
-
-
--> QuickTime RVMI_gReV Tags +
--> QuickTime RVMI_sReV Tags
RawGSensorno 
SampleDateTimeno 
SampleDurationno 
SampleTimeno(sample decoding time)
Textno 
TimeCodeno 
Unknown00?no 
Unknown01?no 
Unknown02?no 
Unknown03?no 
UserLabelno 
VerticalSpeedno 
VideoTimeStampno 
camm0 +
camm1 +
camm2 +
camm3 +
camm4 +
camm5 +
camm6 +
camm7
-
-
-
-
-
-
-
-
--> QuickTime camm0 Tags +
--> QuickTime camm1 Tags +
--> QuickTime camm2 Tags +
--> QuickTime camm3 Tags +
--> QuickTime camm4 Tags +
--> QuickTime camm5 Tags +
--> QuickTime camm6 Tags +
--> QuickTime camm7 Tags
fdsc---> GoPro fdsc Tags
gpmd_Kingslim +
gpmd_Rove +
gpmd_FMAS +
gpmd_GoPro
-
-
-
-
--> QuickTime Stream Tags +
--> QuickTime Stream Tags +
--> QuickTime Stream Tags +
--> GoPro GPMF Tags
marl---> QuickTime marl Tags
mebx---> QuickTime Keys Tags
mett---> Parrot mett Tags
rtmd---> Sony rtmd Tags
tx3g---> QuickTime tx3g Tags
+ +

QuickTime INSV_MakerNotes Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x000aSerialNumberno 
0x0012Modelno 
0x001aFirmwareno 
0x002aParametersno 
+ +

QuickTime PreviewInfo Tags

+

Preview stored by TomTom Bandit ActionCam.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
8PreviewImageno 
+ +

QuickTime RVMI_gReV Tags

+

GPS information extracted from the RVMI box of MOV videos.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4GPSLatitudeno 
8GPSLongitudeno 
16GPSSpeedno 
18GPSTrackno 
+ +

QuickTime RVMI_sReV Tags

+

G-sensor information extracted from the RVMI box of MOV videos.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
4GSensorno 
+ +

QuickTime camm0 Tags

+

The camm0 through camm7 tables define tags extracted from the Google Street +View Camera Motion Metadata of MP4 videos. See +https://developers.google.com/streetview/publish/camm-spec for the +specification.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
4AngleAxisno(angle axis orientation in radians in local coordinate system)
+ +

QuickTime camm1 Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4PixelExposureTimeno 
8RollingShutterSkewTimeno 
+ +

QuickTime camm2 Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
4AngularVelocityno(gyro angular velocity about X, Y and Z axes in rad/s)
+ +

QuickTime camm3 Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
4Accelerationno(acceleration in the X, Y and Z directions in m/s^2)
+ +

QuickTime camm4 Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
4Positionno(X, Y, Z position in local coordinate system)
+ +

QuickTime camm5 Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4GPSLatitudeno 
12GPSLongitudeno 
20GPSAltitudeno 
+ +

QuickTime camm6 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4GPSDateTimeno 
12GPSMeasureModeno0 = No Measurement +
2 = 2-Dimensional Measurement +
3 = 3-Dimensional Measurement
16GPSLatitudeno 
24GPSLongitudeno 
32GPSAltitudeno 
36GPSHorizontalAccuracyno(metres)
40GPSVerticalAccuracyno 
44GPSVelocityEastno(m/s)
48GPSVelocityNorthno 
52GPSVelocityUpno 
56GPSSpeedAccuracyno 
+ +

QuickTime camm7 Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
4MagneticFieldno(microtesla)
+ +

QuickTime marl Tags

+

Tags extracted from the marl ctbx timed metadata of GM cars.

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

QuickTime Keys Tags

+

This directory contains a list of key names which are used to decode tags +written by the "mdta" handler. Also in this table are a few tags found in +timed metadata that are not yet writable by ExifTool. The prefix of +"com.apple.quicktime." has been removed from the TagID's below. These tags +support alternate languages in the same way as the +ItemList tags. Note +that by default, +ItemList and +UserData tags are +preferred when writing, so to create a tag when a same-named tag exists in +either of these tables, either the "Keys" location must be specified (eg. +-Keys:Author=Phil on the command line), or the PREFERRED level must be +changed via the config file.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Encoded_With'EncodedWithyes 
'album'Albumyes 
'apple.photos.variation-identifier'ApplePhotosVariationIdentifierint64s 
'artist'Artistyes 
'artwork'Artworkyes 
'author'Authoryes 
'camera.framereadouttimeinmicroseconds'FrameReadoutTimeyes 
'camera.identifier'CameraIdentifieryes 
'collection.user'UserCollectionyes 
'com.android.version'AndroidVersionyes 
'com.apple.photos.captureMode'CaptureModeyes 
'comment'Commentyes 
'copyright'Copyrightyes 
'creationdate'CreationDateyes 
'description'Descriptionyes 
'detected-face'FaceInfo---> QuickTime FaceInfo Tags
'detected-face.bounds'DetectedFaceBoundsno 
'detected-face.face-id'DetectedFaceIDno 
'detected-face.roll-angle'DetectedFaceRollAngleno 
'detected-face.yaw-angle'DetectedFaceYawAngleno 
'direction.facing'CameraDirectionyes 
'direction.motion'CameraMotionyes 
'director'Directoryes 
'displayname'DisplayNameyes 
'genre'Genreyes 
'information'Informationyes 
'keywords'Keywordsyes 
'live-photo-info'LivePhotoInfono 
'live-photo.auto'LivePhotoAutoint8u 
'live-photo.vitality-score'LivePhotoVitalityScorefloat 
'live-photo.vitality-scoring-version'LivePhotoVitalityScoringVersionint64s 
'location.ISO6709'GPSCoordinatesyes(Google Photos may ignore this if the coorinates have more than 5 digits +after the decimal)
'location.accuracy.horizontal'LocationAccuracyHorizontalyes 
'location.body'LocationBodyyes 
'location.date'LocationDateyes 
'location.name'LocationNameyes 
'location.note'LocationNoteyes 
'location.role'LocationRoleyes0 = Shooting Location +
1 = Real Location +
2 = Fictional Location
'make'Makeyes 
'model'Modelyes 
'player.movie.audio.balance'Balanceyes 
'player.movie.audio.bass'Bassyes 
'player.movie.audio.gain'AudioGainyes 
'player.movie.audio.mute'Muteint8u0 = Off +
1 = On
'player.movie.audio.pitchshift'PitchShiftyes 
'player.movie.audio.treble'Trebleyes 
'player.movie.visual.brightness'Brightnessyes 
'player.movie.visual.color'Coloryes 
'player.movie.visual.contrast'Contrastyes 
'player.movie.visual.tint'Tintyes 
'player.version'PlayerVersionyes 
'producer'Produceryes 
'publisher'Publisheryes 
'rating.user'UserRatingyes 
'software'Softwareyes 
'still-image-time'StillImageTimeno(this tag always has a value of -1; the time of the still image is obtained +from the associated SampleTime)
'title'Titleyes 
'version'Versionyes 
'video-orientation'VideoOrientationno +
1 = Horizontal (normal) +
2 = Mirror horizontal +
3 = Rotate 180 +
4 = Mirror vertical +
5 = Mirror horizontal and rotate 270 CW +
6 = Rotate 90 CW +
7 = Mirror horizontal and rotate 90 CW +
8 = Rotate 270 CW
+
'year'Yearyes 
+ +

QuickTime FaceInfo Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'crec'FaceRec---> QuickTime FaceRec Tags
+ +

QuickTime FaceRec Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'cits'FaceItem---> QuickTime Keys Tags
+ +

QuickTime tx3g Tags

+

Tags extracted from the tx3g sbtl timed metadata of Yuneec drones, and +subtitle text in some other videos.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Alt'GPSAltitudeno 
'DateTime'DateTimeno 
'GimPitch'GimbalPitchno 
'GimRoll'GimbalRollno 
'GimYaw'GimbalYawno 
'Lat'GPSLatitudeno 
'Lon'GPSLongitudeno 
'Pitch'Pitchno 
'Roll'Rollno 
'Text'Textno 
'Yaw'Yawno 
+ +

QuickTime FileType Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0MajorBrandno'3g2a' = 3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-0 V1.0 +
'3g2b' = 3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-A V1.0.0 +
'3g2c' = 3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-B v1.0 +
'3ge6' = 3GPP (.3GP) Release 6 MBMS Extended Presentations +
'3ge7' = 3GPP (.3GP) Release 7 MBMS Extended Presentations +
'3gg6' = 3GPP Release 6 General Profile +
'3gp1' = 3GPP Media (.3GP) Release 1 (probably non-existent) +
'3gp2' = 3GPP Media (.3GP) Release 2 (probably non-existent) +
'3gp3' = 3GPP Media (.3GP) Release 3 (probably non-existent) +
'3gp4' = 3GPP Media (.3GP) Release 4 +
'3gp5' = 3GPP Media (.3GP) Release 5 +
'3gp6' = 3GPP Media (.3GP) Release 6 Streaming Servers +
'3gs7' = 3GPP Media (.3GP) Release 7 Streaming Servers +
'CAEP' = Canon Digital Camera +
'CDes' = Convergent Design +
'F4A ' = Audio for Adobe Flash Player 9+ (.F4A) +
'F4B ' = Audio Book for Adobe Flash Player 9+ (.F4B) +
'F4P ' = Protected Video for Adobe Flash Player 9+ (.F4P) +
'F4V ' = Video for Adobe Flash Player 9+ (.F4V) +
'JP2 ' = JPEG 2000 Image (.JP2) [ISO 15444-1 ?] +
'JP20' = Unknown, from GPAC samples (prob non-existent) +
'KDDI' = 3GPP2 EZmovie for KDDI 3G cellphones +
'M4A ' = Apple iTunes AAC-LC (.M4A) Audio +
'M4B ' = Apple iTunes AAC-LC (.M4B) Audio Book +
'M4P ' = Apple iTunes AAC-LC (.M4P) AES Protected Audio +
'M4V ' = Apple iTunes Video (.M4V) Video +
'M4VH' = Apple TV (.M4V) +
'M4VP' = Apple iPhone (.M4V) +
'MPPI' = Photo Player, MAF [ISO/IEC 23000-3] +
'MSNV' = MPEG-4 (.MP4) for SonyPSP +
'NDAS' = MP4 v2 [ISO 14496-14] Nero Digital AAC Audio +
'NDSC' = MPEG-4 (.MP4) Nero Cinema Profile +
'NDSH' = MPEG-4 (.MP4) Nero HDTV Profile +
'NDSM' = MPEG-4 (.MP4) Nero Mobile Profile +
'NDSP' = MPEG-4 (.MP4) Nero Portable Profile +
'NDSS' = MPEG-4 (.MP4) Nero Standard Profile +
'NDXC' = H.264/MPEG-4 AVC (.MP4) Nero Cinema Profile +
'NDXH' = H.264/MPEG-4 AVC (.MP4) Nero HDTV Profile +
'NDXM' = H.264/MPEG-4 AVC (.MP4) Nero Mobile Profile +
'NDXP' = H.264/MPEG-4 AVC (.MP4) Nero Portable Profile +
'NDXS' = H.264/MPEG-4 AVC (.MP4) Nero Standard Profile +
'ROSS' = Ross Video +
'XAVC' = Sony XAVC +
'aax ' = Audible Enhanced Audiobook (.AAX) +
'avc1' = MP4 Base w/ AVC ext [ISO 14496-12:2005] +
'avif' = AV1 Image File Format (.AVIF) +
'caqv' = Casio Digital Camera +
'crx ' = Canon Raw (.CRX) +
'da0a' = DMB MAF w/ MPEG Layer II aud, MOT slides, DLS, JPG/PNG/MNG images +
'da0b' = DMB MAF, extending DA0A, with 3GPP timed text, DID, TVA, REL, IPMP +
'da1a' = DMB MAF audio with ER-BSAC audio, JPG/PNG/MNG images +
'da1b' = DMB MAF, extending da1a, with 3GPP timed text, DID, TVA, REL, IPMP +
'da2a' = DMB MAF aud w/ HE-AAC v2 aud, MOT slides, DLS, JPG/PNG/MNG images +
'da2b' = DMB MAF, extending da2a, with 3GPP timed text, DID, TVA, REL, IPMP +
'da3a' = DMB MAF aud with HE-AAC aud, JPG/PNG/MNG images +
'da3b' = DMB MAF, extending da3a w/ BIFS, 3GPP timed text, DID, TVA, REL, IPMP +
'dmb1' = DMB MAF supporting all the components defined in the specification +
'dmpf' = Digital Media Project +
'drc1' = Dirac (wavelet compression), encapsulated in ISO base media (MP4) +
'dv1a' = DMB MAF vid w/ AVC vid, ER-BSAC aud, BIFS, JPG/PNG/MNG images, TS +
'dv1b' = DMB MAF, extending dv1a, with 3GPP timed text, DID, TVA, REL, IPMP +
'dv2a' = DMB MAF vid w/ AVC vid, HE-AAC v2 aud, BIFS, JPG/PNG/MNG images, TS +
'dv2b' = DMB MAF, extending dv2a, with 3GPP timed text, DID, TVA, REL, IPMP +
'dv3a' = DMB MAF vid w/ AVC vid, HE-AAC aud, BIFS, JPG/PNG/MNG images, TS +
'dv3b' = DMB MAF, extending dv3a, with 3GPP timed text, DID, TVA, REL, IPMP +
'dvr1' = DVB (.DVB) over RTP +
'dvt1' = DVB (.DVB) over MPEG-2 Transport Stream +
'heic' = High Efficiency Image Format HEVC still image (.HEIC) +
'heix' = High Efficiency Image Format still image (.HEIF) +
'hevc' = High Efficiency Image Format HEVC sequence (.HEICS) +
'isc2' = ISMACryp 2.0 Encrypted File +
'iso2' = MP4 Base Media v2 [ISO 14496-12:2005] +
'iso3' = MP4 Base Media v3 +
'iso4' = MP4 Base Media v4 +
'iso5' = MP4 Base Media v5 +
'iso6' = MP4 Base Media v6 +
'iso7' = MP4 Base Media v7 +
'iso8' = MP4 Base Media v8 +
'iso9' = MP4 Base Media v9 +
'isom' = MP4 Base Media v1 [IS0 14496-12:2003] +
'jpm ' = JPEG 2000 Compound Image (.JPM) [ISO 15444-6] +
'jpx ' = JPEG 2000 with extensions (.JPX) [ISO 15444-2] +
'mif1' = High Efficiency Image Format still image (.HEIF) +
'mj2s' = Motion JPEG 2000 [ISO 15444-3] Simple Profile +
'mjp2' = Motion JPEG 2000 [ISO 15444-3] General Profile +
'mmp4' = MPEG-4/3GPP Mobile Profile (.MP4/3GP) (for NTT) +
'mp21' = MPEG-21 [ISO/IEC 21000-9] +
'mp41' = MP4 v1 [ISO 14496-1:ch13] +
'mp42' = MP4 v2 [ISO 14496-14] +
'mp71' = MP4 w/ MPEG-7 Metadata [per ISO 14496-12] +
'mqt ' = Sony / Mobile QuickTime (.MQV) US Patent 7,477,830 (Sony Corp) +
'msf1' = High Efficiency Image Format sequence (.HEIFS) +
'odcf' = OMA DCF DRM Format 2.0 (OMA-TS-DRM-DCF-V2_0-20060303-A) +
'opf2' = OMA PDCF DRM Format 2.1 (OMA-TS-DRM-DCF-V2_1-20070724-C) +
'opx2' = OMA PDCF DRM + XBS extensions (OMA-TS-DRM_XBS-V1_0-20070529-C) +
'pana' = Panasonic Digital Camera +
'qt ' = Apple QuickTime (.MOV/QT) +
'sdv ' = SD Memory Card Video +
'ssc1' = Samsung stereoscopic, single stream +
'ssc2' = Samsung stereoscopic, dual stream
1MinorVersionno 
2CompatibleBrandsno 
+ +

QuickTime OtherMeta Tags

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'mere'MetaRelation---> QuickTime MetaRelation Tags
'meta'Meta---> QuickTime Meta Tags
+ +

QuickTime MetaRelation Tags

+
+
+ + + + +
Index4Tag NameWritableValues / Notes
[no tags known]
+ +

QuickTime Meta Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'bxml'BinaryXML?no 
'dinf'DataInfo---> QuickTime DataInfo Tags
'free'Free?no 
'hdlr'Handler---> QuickTime Handler Tags
'idat'MetaImageSizeno 
'iinf'ItemInformation---> QuickTime ItemInfo Tags +
--> QuickTime ItemInfo Tags
'iloc'ItemLocationno(parsed, but not extracted as a tag)
'ilst'ItemList---> QuickTime ItemList Tags
'ipmc'IPMPControl?no 
'ipro'ItemProtection?no 
'iprp'ItemProperties---> QuickTime ItemProp Tags
'iref'ItemReference---> QuickTime ItemRef Tags
'keys'Keys---> QuickTime Keys Tags
'pitm'PrimaryItemReferenceno 
'uuid'MetaVersion +
UUID-Unknown?
no
no
 
'xml 'XML---> XMP XML Tags
+ +

QuickTime DataInfo Tags

+

MP4 data information box.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'dref'DataRef---> QuickTime DataRef Tags
+ +

QuickTime DataRef Tags

+

MP4 data reference box.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
"url\0"URLno 
'url 'URLno 
'urn 'URNno 
+ +

QuickTime Handler Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4HandlerClassno'dhlr' = Data Handler +
'mhlr' = Media Handler
8HandlerTypeno + +
'alis' = Alias Data +
'camm' = Camera Metadata +
'crsm' = Clock Reference +
'data' = Data +
'hint' = Hint Track +
'ipsm' = IPMP +
'm7sm' = MPEG-7 Stream +
'mdir' = Metadata +
'mdta' = Metadata Tags +
'meta' = NRT Metadata +
'mjsm' = MPEG-J +
'nrtm' = Non-Real Time Metadata +
'ocsm' = Object Content
  'odsm' = Object Descriptor +
'pict' = Picture +
'priv' = Private +
'psmd' = Panasonic Static Metadata +
'sbtl' = Subtitle +
'sdsm' = Scene Description +
'soun' = Audio Track +
'subp' = Subpicture +
'text' = Text +
'tmcd' = Time Code +
'url ' = URL +
'vide' = Video Track
+
12HandlerVendorIDno--> QuickTime VendorID Values
24HandlerDescriptionno 
+ +

QuickTime VendorID Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
ValueVendorIDValueVendorIDValueVendorID
' KD '= Kodak'ZORA'= Zoran Corporation'olym'= Olympus
'AR.D'= Parrot AR.Drone'appl'= Apple'pana'= Panasonic
'FFMP'= FFmpeg'fe20'= Olympus (fe20)'pent'= Pentax
'GIC '= General Imaging Co.'kdak'= Kodak'pr01'= Olympus (pr01)
'KMPI'= Konica-Minolta'leic'= Leica'sany'= Sanyo
'NIKO'= Nikon'mino'= Minolta  
'SMI '= Sorenson Media Inc.'niko'= Nikon  
+ +

QuickTime ItemInfo Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'infe'ItemInfoEntryno(parsed, but not extracted as a tag)
+ +

QuickTime ItemList Tags

+

This is the preferred location for creating new QuickTime tags. Tags in +this table support alternate languages which are accessed by adding a +3-character ISO 639-2 language code and an optional ISO 3166-1 alpha 2 +country code to the tag name (eg. "ItemList:Title-fra" or +"ItemList::Title-fra-FR"). When creating a new Meta box to contain the +ItemList directory, by default ExifTool adds an 'mdir' (Metadata) Handler +box because Apple software may ignore ItemList tags otherwise, but the API +QuickTimeHandler option may be set to 0 to avoid this.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'----'iTunesInfo---> QuickTime iTunesInfo Tags
'@PST'ParentShortTitlestring 
'@ppi'ParentProductIDstring 
'@pti'ParentTitlestring 
'@sti'ShortTitlestring 
'AACR'Unknown_AACR?string 
'CDEK'Unknown_CDEK?string 
'CDET'Unknown_CDET?string 
'GUID'GUIDstring 
'VERS'ProductVersionstring 
'aART'AlbumArtiststring 
'akID'AppleStoreAccountTypeint8s0 = iTunes +
1 = AOL
'albm'Albumstring/ 
'apID'AppleStoreAccountstring 
'atID'AlbumTitleIDint32s 
'auth'Authorstring 
'catg'Categorystring 
'cnID'AppleStoreCatalogIDint32s 
'covr'CoverArtstring 
'cpil'Compilationint8s0 = No +
1 = Yes
'cprt'Copyrightstring 
'desc'Descriptionstring/ 
'disk'DiskNumberundef 
'dscp'Descriptionstring/ 
'egid'EpisodeGlobalUniqueIDstring 
'geID'GenreIDint32s--> QuickTime GenreID Values
'gnre'Genreundef/ 
'grup'Groupingstring/ 
'gshh'GoogleHostHeaderstring 
'gspm'GooglePingMessagestring 
'gspu'GooglePingURLstring 
'gssd'GoogleSourceDatastring 
'gsst'GoogleStartTimestring 
'gstd'GoogleTrackDurationstring 
'hdvd'HDVideoint8s0 = No +
1 = Yes
'itnu'iTunesUint8s0 = No +
1 = Yes
'keyw'Keywordstring 
'ldes'LongDescriptionstring 
'pcst'Podcastint8s0 = No +
1 = Yes
'perf'Performerstring 
'pgap'PlayGapint8s0 = Insert Gap +
1 = No Gap
'plID'PlayListIDint32s[0.25] 
'prID'ProductIDstring 
'purd'PurchaseDatestring 
'purl'PodcastURLstring 
'rate'RatingPercentstring 
'rldt'ReleaseDatestring 
'rtng'Ratingint8s0 = none +
1 = Explicit +
2 = Clean +
4 = Explicit (old)
'sdes'StoreDescriptionstring 
'sfID'AppleStoreCountryint32s--> QuickTime AppleStoreCountry Values
'shwm'ShowMovementint8s0 = No +
1 = Yes
'soaa'SortAlbumArtiststring 
'soal'SortAlbumstring 
'soar'SortArtiststring 
'soco'SortComposerstring 
'sonm'SortNamestring 
'sosn'SortShowstring 
'stik'MediaTypeint8s + +
0 = Movie (old) +
1 = Normal (Music) +
2 = Audiobook +
5 = Whacked Bookmark +
6 = Music Video +
9 = Movie
  10 = TV Show +
11 = Booklet +
14 = Ringtone +
21 = Podcast +
23 = iTunes U
+
'titl'Titlestring/ 
'tmpo'BeatsPerMinuteint16s 
'trkn'TrackNumberundef 
'tven'TVEpisodeIDstring 
'tves'TVEpisodeint32s 
'tvnn'TVNetworkNamestring 
'tvsh'TVShowstring 
'tvsn'TVSeasonint32u 
'yrrc'Yearstring 
"©ART"Artiststring 
"©alb"Albumstring 
"©ard"ArtDirectorstring 
"©arg"Arrangerstring 
"©aut"Authorstring/ 
"©cmt"Commentstring 
"©com"Composerstring/ 
"©con"Conductorstring 
"©cpy"Copyrightstring/ 
"©day"ContentCreateDatestring 
"©des"Descriptionstring 
"©dir"Directorstring 
"©enc"EncodedBystring 
"©gen"Genrestring 
"©grp"Groupingstring 
"©lyr"Lyricsstring 
"©mvc"MovementCountint16s 
"©mvi"MovementNumberint16s 
"©mvn"MovementNamestring 
"©nam"Titlestring 
"©nrt"Narratorstring 
"©ope"OriginalArtiststring 
"©prd"Producerstring 
"©pub"Publisherstring 
"©sne"SoundEngineerstring 
"©sol"Soloiststring 
"©st3"Subtitlestring 
"©too"Encoderstring 
"©trk"Trackstring 
"©wrk"Workstring 
"©wrt"Composerstring 
"©xpd"ExecutiveProducerstring 
"©xyz"GPSCoordinatesstring 
+ +

QuickTime GenreID Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueGenreID
2= Music|Blues
3= Music|Comedy
4= Music|Children's Music
5= Music|Classical
6= Music|Country
7= Music|Electronic
8= Music|Holiday
9= Music|Classical|Opera
10= Music|Singer/Songwriter
11= Music|Jazz
12= Music|Latino
13= Music|New Age
14= Music|Pop
15= Music|R&B/Soul
16= Music|Soundtrack
17= Music|Dance
18= Music|Hip-Hop/Rap
19= Music|World
20= Music|Alternative
21= Music|Rock
22= Music|Christian & Gospel
23= Music|Vocal
24= Music|Reggae
25= Music|Easy Listening
26= Podcasts
27= Music|J-Pop
28= Music|Enka
29= Music|Anime
30= Music|Kayokyoku
31= Music Videos
32= TV Shows
33= Movies
34= Music
35= iPod Games
36= App Store
37= Tones
38= Books
39= Mac App Store
40= Textbooks
50= Music|Fitness & Workout
51= Music|Pop|K-Pop
52= Music|Karaoke
53= Music|Instrumental
74= Audiobooks|News
75= Audiobooks|Programs & Performances
500= Fitness Music
501= Fitness Music|Pop
502= Fitness Music|Dance
503= Fitness Music|Hip-Hop
504= Fitness Music|Rock
505= Fitness Music|Alt/Indie
506= Fitness Music|Latino
507= Fitness Music|Country
508= Fitness Music|World
509= Fitness Music|New Age
510= Fitness Music|Classical
1001= Music|Alternative|College Rock
1002= Music|Alternative|Goth Rock
1003= Music|Alternative|Grunge
1004= Music|Alternative|Indie Rock
1005= Music|Alternative|New Wave
1006= Music|Alternative|Punk
1007= Music|Blues|Chicago Blues
1009= Music|Blues|Classic Blues
1010= Music|Blues|Contemporary Blues
1011= Music|Blues|Country Blues
1012= Music|Blues|Delta Blues
1013= Music|Blues|Electric Blues
1014= Music|Children's Music|Lullabies
1015= Music|Children's Music|Sing-Along
1016= Music|Children's Music|Stories
1017= Music|Classical|Avant-Garde
1018= Music|Classical|Baroque Era
1019= Music|Classical|Chamber Music
1020= Music|Classical|Chant
1021= Music|Classical|Choral
1022= Music|Classical|Classical Crossover
1023= Music|Classical|Early Music
1024= Music|Classical|Impressionist
1025= Music|Classical|Medieval Era
1026= Music|Classical|Minimalism
1027= Music|Classical|Modern Era
1028= Music|Classical|Opera
1029= Music|Classical|Orchestral
1030= Music|Classical|Renaissance
1031= Music|Classical|Romantic Era
1032= Music|Classical|Wedding Music
1033= Music|Country|Alternative Country
1034= Music|Country|Americana
1035= Music|Country|Bluegrass
1036= Music|Country|Contemporary Bluegrass
1037= Music|Country|Contemporary Country
1038= Music|Country|Country Gospel
1039= Music|Country|Honky Tonk
1040= Music|Country|Outlaw Country
1041= Music|Country|Traditional Bluegrass
1042= Music|Country|Traditional Country
1043= Music|Country|Urban Cowboy
1044= Music|Dance|Breakbeat
1045= Music|Dance|Exercise
1046= Music|Dance|Garage
1047= Music|Dance|Hardcore
1048= Music|Dance|House
1049= Music|Dance|Jungle/Drum'n'bass
1050= Music|Dance|Techno
1051= Music|Dance|Trance
1052= Music|Jazz|Big Band
1053= Music|Jazz|Bop
1054= Music|Easy Listening|Lounge
1055= Music|Easy Listening|Swing
1056= Music|Electronic|Ambient
1057= Music|Electronic|Downtempo
1058= Music|Electronic|Electronica
1060= Music|Electronic|IDM/Experimental
1061= Music|Electronic|Industrial
1062= Music|Singer/Songwriter|Alternative Folk
1063= Music|Singer/Songwriter|Contemporary Folk
1064= Music|Singer/Songwriter|Contemporary Singer/Songwriter
1065= Music|Singer/Songwriter|Folk-Rock
1066= Music|Singer/Songwriter|New Acoustic
1067= Music|Singer/Songwriter|Traditional Folk
1068= Music|Hip-Hop/Rap|Alternative Rap
1069= Music|Hip-Hop/Rap|Dirty South
1070= Music|Hip-Hop/Rap|East Coast Rap
1071= Music|Hip-Hop/Rap|Gangsta Rap
1072= Music|Hip-Hop/Rap|Hardcore Rap
1073= Music|Hip-Hop/Rap|Hip-Hop
1074= Music|Hip-Hop/Rap|Latin Rap
1075= Music|Hip-Hop/Rap|Old School Rap
1076= Music|Hip-Hop/Rap|Rap
1077= Music|Hip-Hop/Rap|Underground Rap
1078= Music|Hip-Hop/Rap|West Coast Rap
1079= Music|Holiday|Chanukah
1080= Music|Holiday|Christmas
1081= Music|Holiday|Christmas: Children's
1082= Music|Holiday|Christmas: Classic
1083= Music|Holiday|Christmas: Classical
1084= Music|Holiday|Christmas: Jazz
1085= Music|Holiday|Christmas: Modern
1086= Music|Holiday|Christmas: Pop
1087= Music|Holiday|Christmas: R&B
1088= Music|Holiday|Christmas: Religious
1089= Music|Holiday|Christmas: Rock
1090= Music|Holiday|Easter
1091= Music|Holiday|Halloween
1092= Music|Holiday|Holiday: Other
1093= Music|Holiday|Thanksgiving
1094= Music|Christian & Gospel|CCM
1095= Music|Christian & Gospel|Christian Metal
1096= Music|Christian & Gospel|Christian Pop
1097= Music|Christian & Gospel|Christian Rap
1098= Music|Christian & Gospel|Christian Rock
1099= Music|Christian & Gospel|Classic Christian
1100= Music|Christian & Gospel|Contemporary Gospel
1101= Music|Christian & Gospel|Gospel
1103= Music|Christian & Gospel|Praise & Worship
1104= Music|Christian & Gospel|Southern Gospel
1105= Music|Christian & Gospel|Traditional Gospel
1106= Music|Jazz|Avant-Garde Jazz
1107= Music|Jazz|Contemporary Jazz
1108= Music|Jazz|Crossover Jazz
1109= Music|Jazz|Dixieland
1110= Music|Jazz|Fusion
1111= Music|Jazz|Latin Jazz
1112= Music|Jazz|Mainstream Jazz
1113= Music|Jazz|Ragtime
1114= Music|Jazz|Smooth Jazz
1115= Music|Latino|Latin Jazz
1116= Music|Latino|Contemporary Latin
1117= Music|Latino|Pop Latino
1118= Music|Latino|Raices
1119= Music|Latino|Urbano latino
1120= Music|Latino|Baladas y Boleros
1121= Music|Latino|Rock y Alternativo
1122= Music|Brazilian
1123= Music|Latino|Musica Mexicana
1124= Music|Latino|Musica tropical
1125= Music|New Age|Environmental
1126= Music|New Age|Healing
1127= Music|New Age|Meditation
1128= Music|New Age|Nature
1129= Music|New Age|Relaxation
1130= Music|New Age|Travel
1131= Music|Pop|Adult Contemporary
1132= Music|Pop|Britpop
1133= Music|Pop|Pop/Rock
1134= Music|Pop|Soft Rock
1135= Music|Pop|Teen Pop
1136= Music|R&B/Soul|Contemporary R&B
1137= Music|R&B/Soul|Disco
1138= Music|R&B/Soul|Doo Wop
1139= Music|R&B/Soul|Funk
1140= Music|R&B/Soul|Motown
1141= Music|R&B/Soul|Neo-Soul
1142= Music|R&B/Soul|Quiet Storm
1143= Music|R&B/Soul|Soul
1144= Music|Rock|Adult Alternative
1145= Music|Rock|American Trad Rock
1146= Music|Rock|Arena Rock
1147= Music|Rock|Blues-Rock
1148= Music|Rock|British Invasion
1149= Music|Rock|Death Metal/Black Metal
1150= Music|Rock|Glam Rock
1151= Music|Rock|Hair Metal
1152= Music|Rock|Hard Rock
1153= Music|Rock|Metal
1154= Music|Rock|Jam Bands
1155= Music|Rock|Prog-Rock/Art Rock
1156= Music|Rock|Psychedelic
1157= Music|Rock|Rock & Roll
1158= Music|Rock|Rockabilly
1159= Music|Rock|Roots Rock
1160= Music|Rock|Singer/Songwriter
1161= Music|Rock|Southern Rock
1162= Music|Rock|Surf
1163= Music|Rock|Tex-Mex
1165= Music|Soundtrack|Foreign Cinema
1166= Music|Soundtrack|Musicals
1167= Music|Comedy|Novelty
1168= Music|Soundtrack|Original Score
1169= Music|Soundtrack|Soundtrack
1171= Music|Comedy|Standup Comedy
1172= Music|Soundtrack|TV Soundtrack
1173= Music|Vocal|Standards
1174= Music|Vocal|Traditional Pop
1175= Music|Jazz|Vocal Jazz
1176= Music|Vocal|Vocal Pop
1177= Music|African|Afro-Beat
1178= Music|African|Afro-Pop
1179= Music|World|Cajun
1180= Music|World|Celtic
1181= Music|World|Celtic Folk
1182= Music|World|Contemporary Celtic
1183= Music|Reggae|Modern Dancehall
1184= Music|World|Drinking Songs
1185= Music|Indian|Indian Pop
1186= Music|World|Japanese Pop
1187= Music|World|Klezmer
1188= Music|World|Polka
1189= Music|World|Traditional Celtic
1190= Music|World|Worldbeat
1191= Music|World|Zydeco
1192= Music|Reggae|Roots Reggae
1193= Music|Reggae|Dub
1194= Music|Reggae|Ska
1195= Music|World|Caribbean
1196= Music|World|South America
1197= Music|Arabic
1198= Music|World|North America
1199= Music|World|Hawaii
1200= Music|World|Australia
1201= Music|World|Japan
1202= Music|World|France
1203= Music|African
1204= Music|World|Asia
1205= Music|World|Europe
1206= Music|World|South Africa
1207= Music|Jazz|Hard Bop
1208= Music|Jazz|Trad Jazz
1209= Music|Jazz|Cool Jazz
1210= Music|Blues|Acoustic Blues
1211= Music|Classical|High Classical
1220= Music|Brazilian|Axe
1221= Music|Brazilian|Bossa Nova
1222= Music|Brazilian|Choro
1223= Music|Brazilian|Forro
1224= Music|Brazilian|Frevo
1225= Music|Brazilian|MPB
1226= Music|Brazilian|Pagode
1227= Music|Brazilian|Samba
1228= Music|Brazilian|Sertanejo
1229= Music|Brazilian|Baile Funk
1230= Music|Alternative|Chinese Alt
1231= Music|Alternative|Korean Indie
1232= Music|Chinese
1233= Music|Chinese|Chinese Classical
1234= Music|Chinese|Chinese Flute
1235= Music|Chinese|Chinese Opera
1236= Music|Chinese|Chinese Orchestral
1237= Music|Chinese|Chinese Regional Folk
1238= Music|Chinese|Chinese Strings
1239= Music|Chinese|Taiwanese Folk
1240= Music|Chinese|Tibetan Native Music
1241= Music|Hip-Hop/Rap|Chinese Hip-Hop
1242= Music|Hip-Hop/Rap|Korean Hip-Hop
1243= Music|Korean
1244= Music|Korean|Korean Classical
1245= Music|Korean|Korean Trad Song
1246= Music|Korean|Korean Trad Instrumental
1247= Music|Korean|Korean Trad Theater
1248= Music|Rock|Chinese Rock
1249= Music|Rock|Korean Rock
1250= Music|Pop|C-Pop
1251= Music|Pop|Cantopop/HK-Pop
1252= Music|Pop|Korean Folk-Pop
1253= Music|Pop|Mandopop
1254= Music|Pop|Tai-Pop
1255= Music|Pop|Malaysian Pop
1256= Music|Pop|Pinoy Pop
1257= Music|Pop|Original Pilipino Music
1258= Music|Pop|Manilla Sound
1259= Music|Pop|Indo Pop
1260= Music|Pop|Thai Pop
1261= Music|Vocal|Trot
1262= Music|Indian
1263= Music|Indian|Bollywood
1264= Music|Indian|Regional Indian|Tamil
1265= Music|Indian|Regional Indian|Telugu
1266= Music|Indian|Regional Indian
1267= Music|Indian|Devotional & Spiritual
1268= Music|Indian|Sufi
1269= Music|Indian|Indian Classical
1270= Music|Russian|Russian Chanson
1271= Music|World|Dini
1272= Music|Turkish|Halk
1273= Music|Turkish|Sanat
1274= Music|World|Dangdut
1275= Music|World|Indonesian Religious
1276= Music|World|Calypso
1277= Music|World|Soca
1278= Music|Indian|Ghazals
1279= Music|Indian|Indian Folk
1280= Music|Turkish|Arabesque
1281= Music|African|Afrikaans
1282= Music|World|Farsi
1283= Music|World|Israeli
1284= Music|Arabic|Khaleeji
1285= Music|Arabic|North African
1286= Music|Arabic|Arabic Pop
1287= Music|Arabic|Islamic
1288= Music|Soundtrack|Sound Effects
1289= Music|Folk
1290= Music|Orchestral
1291= Music|Marching
1293= Music|Pop|Oldies
1294= Music|Country|Thai Country
1295= Music|World|Flamenco
1296= Music|World|Tango
1297= Music|World|Fado
1298= Music|World|Iberia
1299= Music|Russian
1300= Music|Turkish
1301= Podcasts|Arts
1302= Podcasts|Society & Culture|Personal Journals
1303= Podcasts|Comedy
1304= Podcasts|Education
1305= Podcasts|Kids & Family
1306= Podcasts|Arts|Food
1307= Podcasts|Health
1309= Podcasts|TV & Film
1310= Podcasts|Music
1311= Podcasts|News & Politics
1314= Podcasts|Religion & Spirituality
1315= Podcasts|Science & Medicine
1316= Podcasts|Sports & Recreation
1318= Podcasts|Technology
1320= Podcasts|Society & Culture|Places & Travel
1321= Podcasts|Business
1323= Podcasts|Games & Hobbies
1324= Podcasts|Society & Culture
1325= Podcasts|Government & Organizations
1337= Music Videos|Classical|Piano
1401= Podcasts|Arts|Literature
1402= Podcasts|Arts|Design
1404= Podcasts|Games & Hobbies|Video Games
1405= Podcasts|Arts|Performing Arts
1406= Podcasts|Arts|Visual Arts
1410= Podcasts|Business|Careers
1412= Podcasts|Business|Investing
1413= Podcasts|Business|Management & Marketing
1415= Podcasts|Education|K-12
1416= Podcasts|Education|Higher Education
1417= Podcasts|Health|Fitness & Nutrition
1420= Podcasts|Health|Self-Help
1421= Podcasts|Health|Sexuality
1438= Podcasts|Religion & Spirituality|Buddhism
1439= Podcasts|Religion & Spirituality|Christianity
1440= Podcasts|Religion & Spirituality|Islam
1441= Podcasts|Religion & Spirituality|Judaism
1443= Podcasts|Society & Culture|Philosophy
1444= Podcasts|Religion & Spirituality|Spirituality
1446= Podcasts|Technology|Gadgets
1448= Podcasts|Technology|Tech News
1450= Podcasts|Technology|Podcasting
1454= Podcasts|Games & Hobbies|Automotive
1455= Podcasts|Games & Hobbies|Aviation
1456= Podcasts|Sports & Recreation|Outdoor
1459= Podcasts|Arts|Fashion & Beauty
1460= Podcasts|Games & Hobbies|Hobbies
1461= Podcasts|Games & Hobbies|Other Games
1462= Podcasts|Society & Culture|History
1463= Podcasts|Religion & Spirituality|Hinduism
1464= Podcasts|Religion & Spirituality|Other
1465= Podcasts|Sports & Recreation|Professional
1466= Podcasts|Sports & Recreation|College & High School
1467= Podcasts|Sports & Recreation|Amateur
1468= Podcasts|Education|Educational Technology
1469= Podcasts|Education|Language Courses
1470= Podcasts|Education|Training
1471= Podcasts|Business|Business News
1472= Podcasts|Business|Shopping
1473= Podcasts|Government & Organizations|National
1474= Podcasts|Government & Organizations|Regional
1475= Podcasts|Government & Organizations|Local
1476= Podcasts|Government & Organizations|Non-Profit
1477= Podcasts|Science & Medicine|Natural Sciences
1478= Podcasts|Science & Medicine|Medicine
1479= Podcasts|Science & Medicine|Social Sciences
1480= Podcasts|Technology|Software How-To
1481= Podcasts|Health|Alternative Health
1482= Podcasts|Arts|Books
1483= Podcasts|Fiction
1484= Podcasts|Fiction|Drama
1485= Podcasts|Fiction|Science Fiction
1486= Podcasts|Fiction|Comedy Fiction
1487= Podcasts|History
1488= Podcasts|True Crime
1489= Podcasts|News
1490= Podcasts|News|Business News
1491= Podcasts|Business|Management
1492= Podcasts|Business|Marketing
1493= Podcasts|Business|Entrepreneurship
1494= Podcasts|Business|Non-Profit
1495= Podcasts|Comedy|Improv
1496= Podcasts|Comedy|Comedy Interviews
1497= Podcasts|Comedy|Stand-Up
1498= Podcasts|Education|Language Learning
1499= Podcasts|Education|How To
1500= Podcasts|Education|Self-Improvement
1501= Podcasts|Education|Courses
1502= Podcasts|Leisure
1503= Podcasts|Leisure|Automotive
1504= Podcasts|Leisure|Aviation
1505= Podcasts|Leisure|Hobbies
1506= Podcasts|Leisure|Crafts
1507= Podcasts|Leisure|Games
1508= Podcasts|Leisure|Home & Garden
1509= Podcasts|Leisure|Video Games
1510= Podcasts|Leisure|Animation & Manga
1511= Podcasts|Government
1512= Podcasts|Health & Fitness
1513= Podcasts|Health & Fitness|Alternative Health
1514= Podcasts|Health & Fitness|Fitness
1515= Podcasts|Health & Fitness|Nutrition
1516= Podcasts|Health & Fitness|Sexuality
1517= Podcasts|Health & Fitness|Mental Health
1518= Podcasts|Health & Fitness|Medicine
1519= Podcasts|Kids & Family|Education for Kids
1520= Podcasts|Kids & Family|Stories for Kids
1521= Podcasts|Kids & Family|Parenting
1522= Podcasts|Kids & Family|Pets & Animals
1523= Podcasts|Music|Music Commentary
1524= Podcasts|Music|Music History
1525= Podcasts|Music|Music Interviews
1526= Podcasts|News|Daily News
1527= Podcasts|News|Politics
1528= Podcasts|News|Tech News
1529= Podcasts|News|Sports News
1530= Podcasts|News|News Commentary
1531= Podcasts|News|Entertainment News
1532= Podcasts|Religion & Spirituality|Religion
1533= Podcasts|Science
1534= Podcasts|Science|Natural Sciences
1535= Podcasts|Science|Social Sciences
1536= Podcasts|Science|Mathematics
1537= Podcasts|Science|Nature
1538= Podcasts|Science|Astronomy
1539= Podcasts|Science|Chemistry
1540= Podcasts|Science|Earth Sciences
1541= Podcasts|Science|Life Sciences
1542= Podcasts|Science|Physics
1543= Podcasts|Society & Culture|Documentary
1544= Podcasts|Society & Culture|Relationships
1545= Podcasts|Sports
1546= Podcasts|Sports|Soccer
1547= Podcasts|Sports|Football
1548= Podcasts|Sports|Basketball
1549= Podcasts|Sports|Baseball
1550= Podcasts|Sports|Hockey
1551= Podcasts|Sports|Running
1552= Podcasts|Sports|Rugby
1553= Podcasts|Sports|Golf
1554= Podcasts|Sports|Cricket
1555= Podcasts|Sports|Wrestling
1556= Podcasts|Sports|Tennis
1557= Podcasts|Sports|Volleyball
1558= Podcasts|Sports|Swimming
1559= Podcasts|Sports|Wilderness
1560= Podcasts|Sports|Fantasy Sports
1561= Podcasts|TV & Film|TV Reviews
1562= Podcasts|TV & Film|After Shows
1563= Podcasts|TV & Film|Film Reviews
1564= Podcasts|TV & Film|Film History
1565= Podcasts|TV & Film|Film Interviews
1602= Music Videos|Blues
1603= Music Videos|Comedy
1604= Music Videos|Children's Music
1605= Music Videos|Classical
1606= Music Videos|Country
1607= Music Videos|Electronic
1608= Music Videos|Holiday
1609= Music Videos|Classical|Opera
1610= Music Videos|Singer/Songwriter
1611= Music Videos|Jazz
1612= Music Videos|Latin
1613= Music Videos|New Age
1614= Music Videos|Pop
1615= Music Videos|R&B/Soul
1616= Music Videos|Soundtrack
1617= Music Videos|Dance
1618= Music Videos|Hip-Hop/Rap
1619= Music Videos|World
1620= Music Videos|Alternative
1621= Music Videos|Rock
1622= Music Videos|Christian & Gospel
1623= Music Videos|Vocal
1624= Music Videos|Reggae
1625= Music Videos|Easy Listening
1626= Music Videos|Podcasts
1627= Music Videos|J-Pop
1628= Music Videos|Enka
1629= Music Videos|Anime
1630= Music Videos|Kayokyoku
1631= Music Videos|Disney
1632= Music Videos|French Pop
1633= Music Videos|German Pop
1634= Music Videos|German Folk
1635= Music Videos|Alternative|Chinese Alt
1636= Music Videos|Alternative|Korean Indie
1637= Music Videos|Chinese
1638= Music Videos|Chinese|Chinese Classical
1639= Music Videos|Chinese|Chinese Flute
1640= Music Videos|Chinese|Chinese Opera
1641= Music Videos|Chinese|Chinese Orchestral
1642= Music Videos|Chinese|Chinese Regional Folk
1643= Music Videos|Chinese|Chinese Strings
1644= Music Videos|Chinese|Taiwanese Folk
1645= Music Videos|Chinese|Tibetan Native Music
1646= Music Videos|Hip-Hop/Rap|Chinese Hip-Hop
1647= Music Videos|Hip-Hop/Rap|Korean Hip-Hop
1648= Music Videos|Korean
1649= Music Videos|Korean|Korean Classical
1650= Music Videos|Korean|Korean Trad Song
1651= Music Videos|Korean|Korean Trad Instrumental
1652= Music Videos|Korean|Korean Trad Theater
1653= Music Videos|Rock|Chinese Rock
1654= Music Videos|Rock|Korean Rock
1655= Music Videos|Pop|C-Pop
1656= Music Videos|Pop|Cantopop/HK-Pop
1657= Music Videos|Pop|Korean Folk-Pop
1658= Music Videos|Pop|Mandopop
1659= Music Videos|Pop|Tai-Pop
1660= Music Videos|Pop|Malaysian Pop
1661= Music Videos|Pop|Pinoy Pop
1662= Music Videos|Pop|Original Pilipino Music
1663= Music Videos|Pop|Manilla Sound
1664= Music Videos|Pop|Indo Pop
1665= Music Videos|Pop|Thai Pop
1666= Music Videos|Vocal|Trot
1671= Music Videos|Brazilian
1672= Music Videos|Brazilian|Axe
1673= Music Videos|Brazilian|Baile Funk
1674= Music Videos|Brazilian|Bossa Nova
1675= Music Videos|Brazilian|Choro
1676= Music Videos|Brazilian|Forro
1677= Music Videos|Brazilian|Frevo
1678= Music Videos|Brazilian|MPB
1679= Music Videos|Brazilian|Pagode
1680= Music Videos|Brazilian|Samba
1681= Music Videos|Brazilian|Sertanejo
1682= Music Videos|Classical|High Classical
1683= Music Videos|Fitness & Workout
1684= Music Videos|Instrumental
1685= Music Videos|Jazz|Big Band
1686= Music Videos|Pop|K-Pop
1687= Music Videos|Karaoke
1688= Music Videos|Rock|Heavy Metal
1689= Music Videos|Spoken Word
1690= Music Videos|Indian
1691= Music Videos|Indian|Bollywood
1692= Music Videos|Indian|Regional Indian|Tamil
1693= Music Videos|Indian|Regional Indian|Telugu
1694= Music Videos|Indian|Regional Indian
1695= Music Videos|Indian|Devotional & Spiritual
1696= Music Videos|Indian|Sufi
1697= Music Videos|Indian|Indian Classical
1698= Music Videos|Russian|Russian Chanson
1699= Music Videos|World|Dini
1700= Music Videos|Turkish|Halk
1701= Music Videos|Turkish|Sanat
1702= Music Videos|World|Dangdut
1703= Music Videos|World|Indonesian Religious
1704= Music Videos|Indian|Indian Pop
1705= Music Videos|World|Calypso
1706= Music Videos|World|Soca
1707= Music Videos|Indian|Ghazals
1708= Music Videos|Indian|Indian Folk
1709= Music Videos|Turkish|Arabesque
1710= Music Videos|African|Afrikaans
1711= Music Videos|World|Farsi
1712= Music Videos|World|Israeli
1713= Music Videos|Arabic
1714= Music Videos|Arabic|Khaleeji
1715= Music Videos|Arabic|North African
1716= Music Videos|Arabic|Arabic Pop
1717= Music Videos|Arabic|Islamic
1718= Music Videos|Soundtrack|Sound Effects
1719= Music Videos|Folk
1720= Music Videos|Orchestral
1721= Music Videos|Marching
1723= Music Videos|Pop|Oldies
1724= Music Videos|Country|Thai Country
1725= Music Videos|World|Flamenco
1726= Music Videos|World|Tango
1727= Music Videos|World|Fado
1728= Music Videos|World|Iberia
1729= Music Videos|Russian
1730= Music Videos|Turkish
1731= Music Videos|Alternative|College Rock
1732= Music Videos|Alternative|Goth Rock
1733= Music Videos|Alternative|Grunge
1734= Music Videos|Alternative|Indie Rock
1735= Music Videos|Alternative|New Wave
1736= Music Videos|Alternative|Punk
1737= Music Videos|Blues|Acoustic Blues
1738= Music Videos|Blues|Chicago Blues
1739= Music Videos|Blues|Classic Blues
1740= Music Videos|Blues|Contemporary Blues
1741= Music Videos|Blues|Country Blues
1742= Music Videos|Blues|Delta Blues
1743= Music Videos|Blues|Electric Blues
1744= Music Videos|Children's Music|Lullabies
1745= Music Videos|Children's Music|Sing-Along
1746= Music Videos|Children's Music|Stories
1747= Music Videos|Christian & Gospel|CCM
1748= Music Videos|Christian & Gospel|Christian Metal
1749= Music Videos|Christian & Gospel|Christian Pop
1750= Music Videos|Christian & Gospel|Christian Rap
1751= Music Videos|Christian & Gospel|Christian Rock
1752= Music Videos|Christian & Gospel|Classic Christian
1753= Music Videos|Christian & Gospel|Contemporary Gospel
1754= Music Videos|Christian & Gospel|Gospel
1755= Music Videos|Christian & Gospel|Praise & Worship
1756= Music Videos|Christian & Gospel|Southern Gospel
1757= Music Videos|Christian & Gospel|Traditional Gospel
1758= Music Videos|Classical|Avant-Garde
1759= Music Videos|Classical|Baroque Era
1760= Music Videos|Classical|Chamber Music
1761= Music Videos|Classical|Chant
1762= Music Videos|Classical|Choral
1763= Music Videos|Classical|Classical Crossover
1764= Music Videos|Classical|Early Music
1765= Music Videos|Classical|Impressionist
1766= Music Videos|Classical|Medieval Era
1767= Music Videos|Classical|Minimalism
1768= Music Videos|Classical|Modern Era
1769= Music Videos|Classical|Orchestral
1770= Music Videos|Classical|Renaissance
1771= Music Videos|Classical|Romantic Era
1772= Music Videos|Classical|Wedding Music
1773= Music Videos|Comedy|Novelty
1774= Music Videos|Comedy|Standup Comedy
1775= Music Videos|Country|Alternative Country
1776= Music Videos|Country|Americana
1777= Music Videos|Country|Bluegrass
1778= Music Videos|Country|Contemporary Bluegrass
1779= Music Videos|Country|Contemporary Country
1780= Music Videos|Country|Country Gospel
1781= Music Videos|Country|Honky Tonk
1782= Music Videos|Country|Outlaw Country
1783= Music Videos|Country|Traditional Bluegrass
1784= Music Videos|Country|Traditional Country
1785= Music Videos|Country|Urban Cowboy
1786= Music Videos|Dance|Breakbeat
1787= Music Videos|Dance|Exercise
1788= Music Videos|Dance|Garage
1789= Music Videos|Dance|Hardcore
1790= Music Videos|Dance|House
1791= Music Videos|Dance|Jungle/Drum'n'bass
1792= Music Videos|Dance|Techno
1793= Music Videos|Dance|Trance
1794= Music Videos|Easy Listening|Lounge
1795= Music Videos|Easy Listening|Swing
1796= Music Videos|Electronic|Ambient
1797= Music Videos|Electronic|Downtempo
1798= Music Videos|Electronic|Electronica
1799= Music Videos|Electronic|IDM/Experimental
1800= Music Videos|Electronic|Industrial
1801= Music Videos|Hip-Hop/Rap|Alternative Rap
1802= Music Videos|Hip-Hop/Rap|Dirty South
1803= Music Videos|Hip-Hop/Rap|East Coast Rap
1804= Music Videos|Hip-Hop/Rap|Gangsta Rap
1805= Music Videos|Hip-Hop/Rap|Hardcore Rap
1806= Music Videos|Hip-Hop/Rap|Hip-Hop
1807= Music Videos|Hip-Hop/Rap|Latin Rap
1808= Music Videos|Hip-Hop/Rap|Old School Rap
1809= Music Videos|Hip-Hop/Rap|Rap
1810= Music Videos|Hip-Hop/Rap|Underground Rap
1811= Music Videos|Hip-Hop/Rap|West Coast Rap
1812= Music Videos|Holiday|Chanukah
1813= Music Videos|Holiday|Christmas
1814= Music Videos|Holiday|Christmas: Children's
1815= Music Videos|Holiday|Christmas: Classic
1816= Music Videos|Holiday|Christmas: Classical
1817= Music Videos|Holiday|Christmas: Jazz
1818= Music Videos|Holiday|Christmas: Modern
1819= Music Videos|Holiday|Christmas: Pop
1820= Music Videos|Holiday|Christmas: R&B
1821= Music Videos|Holiday|Christmas: Religious
1822= Music Videos|Holiday|Christmas: Rock
1823= Music Videos|Holiday|Easter
1824= Music Videos|Holiday|Halloween
1825= Music Videos|Holiday|Thanksgiving
1826= Music Videos|Jazz|Avant-Garde Jazz
1828= Music Videos|Jazz|Bop
1829= Music Videos|Jazz|Contemporary Jazz
1830= Music Videos|Jazz|Cool Jazz
1831= Music Videos|Jazz|Crossover Jazz
1832= Music Videos|Jazz|Dixieland
1833= Music Videos|Jazz|Fusion
1834= Music Videos|Jazz|Hard Bop
1835= Music Videos|Jazz|Latin Jazz
1836= Music Videos|Jazz|Mainstream Jazz
1837= Music Videos|Jazz|Ragtime
1838= Music Videos|Jazz|Smooth Jazz
1839= Music Videos|Jazz|Trad Jazz
1840= Music Videos|Latin|Alternative & Rock in Spanish
1841= Music Videos|Latin|Baladas y Boleros
1842= Music Videos|Latin|Contemporary Latin
1843= Music Videos|Latin|Latin Jazz
1844= Music Videos|Latin|Latin Urban
1845= Music Videos|Latin|Pop in Spanish
1846= Music Videos|Latin|Raices
1847= Music Videos|Latin|Musica Mexicana
1848= Music Videos|Latin|Salsa y Tropical
1849= Music Videos|New Age|Healing
1850= Music Videos|New Age|Meditation
1851= Music Videos|New Age|Nature
1852= Music Videos|New Age|Relaxation
1853= Music Videos|New Age|Travel
1854= Music Videos|Pop|Adult Contemporary
1855= Music Videos|Pop|Britpop
1856= Music Videos|Pop|Pop/Rock
1857= Music Videos|Pop|Soft Rock
1858= Music Videos|Pop|Teen Pop
1859= Music Videos|R&B/Soul|Contemporary R&B
1860= Music Videos|R&B/Soul|Disco
1861= Music Videos|R&B/Soul|Doo Wop
1862= Music Videos|R&B/Soul|Funk
1863= Music Videos|R&B/Soul|Motown
1864= Music Videos|R&B/Soul|Neo-Soul
1865= Music Videos|R&B/Soul|Soul
1866= Music Videos|Reggae|Modern Dancehall
1867= Music Videos|Reggae|Dub
1868= Music Videos|Reggae|Roots Reggae
1869= Music Videos|Reggae|Ska
1870= Music Videos|Rock|Adult Alternative
1871= Music Videos|Rock|American Trad Rock
1872= Music Videos|Rock|Arena Rock
1873= Music Videos|Rock|Blues-Rock
1874= Music Videos|Rock|British Invasion
1875= Music Videos|Rock|Death Metal/Black Metal
1876= Music Videos|Rock|Glam Rock
1877= Music Videos|Rock|Hair Metal
1878= Music Videos|Rock|Hard Rock
1879= Music Videos|Rock|Jam Bands
1880= Music Videos|Rock|Prog-Rock/Art Rock
1881= Music Videos|Rock|Psychedelic
1882= Music Videos|Rock|Rock & Roll
1883= Music Videos|Rock|Rockabilly
1884= Music Videos|Rock|Roots Rock
1885= Music Videos|Rock|Singer/Songwriter
1886= Music Videos|Rock|Southern Rock
1887= Music Videos|Rock|Surf
1888= Music Videos|Rock|Tex-Mex
1889= Music Videos|Singer/Songwriter|Alternative Folk
1890= Music Videos|Singer/Songwriter|Contemporary Folk
1891= Music Videos|Singer/Songwriter|Contemporary Singer/Songwriter
1892= Music Videos|Singer/Songwriter|Folk-Rock
1893= Music Videos|Singer/Songwriter|New Acoustic
1894= Music Videos|Singer/Songwriter|Traditional Folk
1895= Music Videos|Soundtrack|Foreign Cinema
1896= Music Videos|Soundtrack|Musicals
1897= Music Videos|Soundtrack|Original Score
1898= Music Videos|Soundtrack|Soundtrack
1899= Music Videos|Soundtrack|TV Soundtrack
1900= Music Videos|Vocal|Standards
1901= Music Videos|Vocal|Traditional Pop
1902= Music Videos|Jazz|Vocal Jazz
1903= Music Videos|Vocal|Vocal Pop
1904= Music Videos|African
1905= Music Videos|African|Afro-Beat
1906= Music Videos|African|Afro-Pop
1907= Music Videos|World|Asia
1908= Music Videos|World|Australia
1909= Music Videos|World|Cajun
1910= Music Videos|World|Caribbean
1911= Music Videos|World|Celtic
1912= Music Videos|World|Celtic Folk
1913= Music Videos|World|Contemporary Celtic
1914= Music Videos|World|Europe
1915= Music Videos|World|France
1916= Music Videos|World|Hawaii
1917= Music Videos|World|Japan
1918= Music Videos|World|Klezmer
1919= Music Videos|World|North America
1920= Music Videos|World|Polka
1921= Music Videos|World|South Africa
1922= Music Videos|World|South America
1923= Music Videos|World|Traditional Celtic
1924= Music Videos|World|Worldbeat
1925= Music Videos|World|Zydeco
1926= Music Videos|Christian & Gospel
1928= Music Videos|Classical|Art Song
1929= Music Videos|Classical|Brass & Woodwinds
1930= Music Videos|Classical|Solo Instrumental
1931= Music Videos|Classical|Contemporary Era
1932= Music Videos|Classical|Oratorio
1933= Music Videos|Classical|Cantata
1934= Music Videos|Classical|Electronic
1935= Music Videos|Classical|Sacred
1936= Music Videos|Classical|Guitar
1938= Music Videos|Classical|Violin
1939= Music Videos|Classical|Cello
1940= Music Videos|Classical|Percussion
1941= Music Videos|Electronic|Dubstep
1942= Music Videos|Electronic|Bass
1943= Music Videos|Hip-Hop/Rap|UK Hip-Hop
1944= Music Videos|Reggae|Lovers Rock
1945= Music Videos|Alternative|EMO
1946= Music Videos|Alternative|Pop Punk
1947= Music Videos|Alternative|Indie Pop
1948= Music Videos|New Age|Yoga
1949= Music Videos|Pop|Tribute
1950= Music Videos|Pop|Shows
1951= Music Videos|Cuban
1952= Music Videos|Cuban|Mambo
1953= Music Videos|Cuban|Chachacha
1954= Music Videos|Cuban|Guajira
1955= Music Videos|Cuban|Son
1956= Music Videos|Cuban|Bolero
1957= Music Videos|Cuban|Guaracha
1958= Music Videos|Cuban|Timba
1959= Music Videos|Soundtrack|Video Game
1960= Music Videos|Indian|Regional Indian|Punjabi|Punjabi Pop
1961= Music Videos|Indian|Regional Indian|Bengali|Rabindra Sangeet
1962= Music Videos|Indian|Regional Indian|Malayalam
1963= Music Videos|Indian|Regional Indian|Kannada
1964= Music Videos|Indian|Regional Indian|Marathi
1965= Music Videos|Indian|Regional Indian|Gujarati
1966= Music Videos|Indian|Regional Indian|Assamese
1967= Music Videos|Indian|Regional Indian|Bhojpuri
1968= Music Videos|Indian|Regional Indian|Haryanvi
1969= Music Videos|Indian|Regional Indian|Odia
1970= Music Videos|Indian|Regional Indian|Rajasthani
1971= Music Videos|Indian|Regional Indian|Urdu
1972= Music Videos|Indian|Regional Indian|Punjabi
1973= Music Videos|Indian|Regional Indian|Bengali
1974= Music Videos|Indian|Indian Classical|Carnatic Classical
1975= Music Videos|Indian|Indian Classical|Hindustani Classical
1976= Music Videos|African|Afro House
1977= Music Videos|African|Afro Soul
1978= Music Videos|African|Afrobeats
1979= Music Videos|African|Benga
1980= Music Videos|African|Bongo-Flava
1981= Music Videos|African|Coupe-Decale
1982= Music Videos|African|Gqom
1983= Music Videos|African|Highlife
1984= Music Videos|African|Kuduro
1985= Music Videos|African|Kizomba
1986= Music Videos|African|Kwaito
1987= Music Videos|African|Mbalax
1988= Music Videos|African|Ndombolo
1989= Music Videos|African|Shangaan Electro
1990= Music Videos|African|Soukous
1991= Music Videos|African|Taarab
1992= Music Videos|African|Zouglou
1993= Music Videos|Turkish|Ozgun
1994= Music Videos|Turkish|Fantezi
1995= Music Videos|Turkish|Religious
1996= Music Videos|Pop|Turkish Pop
1997= Music Videos|Rock|Turkish Rock
1998= Music Videos|Alternative|Turkish Alternative
1999= Music Videos|Hip-Hop/Rap|Turkish Hip-Hop/Rap
2000= Music Videos|African|Maskandi
2001= Music Videos|Russian|Russian Romance
2002= Music Videos|Russian|Russian Bard
2003= Music Videos|Russian|Russian Pop
2004= Music Videos|Russian|Russian Rock
2005= Music Videos|Russian|Russian Hip-Hop
2006= Music Videos|Arabic|Levant
2007= Music Videos|Arabic|Levant|Dabke
2008= Music Videos|Arabic|Maghreb Rai
2009= Music Videos|Arabic|Khaleeji|Khaleeji Jalsat
2010= Music Videos|Arabic|Khaleeji|Khaleeji Shailat
2011= Music Videos|Tarab
2012= Music Videos|Tarab|Iraqi Tarab
2013= Music Videos|Tarab|Egyptian Tarab
2014= Music Videos|Tarab|Khaleeji Tarab
2015= Music Videos|Pop|Levant Pop
2016= Music Videos|Pop|Iraqi Pop
2017= Music Videos|Pop|Egyptian Pop
2018= Music Videos|Pop|Maghreb Pop
2019= Music Videos|Pop|Khaleeji Pop
2020= Music Videos|Hip-Hop/Rap|Levant Hip-Hop
2021= Music Videos|Hip-Hop/Rap|Egyptian Hip-Hop
2022= Music Videos|Hip-Hop/Rap|Maghreb Hip-Hop
2023= Music Videos|Hip-Hop/Rap|Khaleeji Hip-Hop
2024= Music Videos|Alternative|Indie Levant
2025= Music Videos|Alternative|Indie Egyptian
2026= Music Videos|Alternative|Indie Maghreb
2027= Music Videos|Electronic|Levant Electronic
2028= Music Videos|Electronic|Electro-Cha'abi
2029= Music Videos|Electronic|Maghreb Electronic
2030= Music Videos|Folk|Iraqi Folk
2031= Music Videos|Folk|Khaleeji Folk
2032= Music Videos|Dance|Maghreb Dance
4000= TV Shows|Comedy
4001= TV Shows|Drama
4002= TV Shows|Animation
4003= TV Shows|Action & Adventure
4004= TV Shows|Classics
4005= TV Shows|Kids & Family
4006= TV Shows|Nonfiction
4007= TV Shows|Reality TV
4008= TV Shows|Sci-Fi & Fantasy
4009= TV Shows|Sports
4010= TV Shows|Teens
4011= TV Shows|Latino TV
4401= Movies|Action & Adventure
4402= Movies|Anime
4403= Movies|Classics
4404= Movies|Comedy
4405= Movies|Documentary
4406= Movies|Drama
4407= Movies|Foreign
4408= Movies|Horror
4409= Movies|Independent
4410= Movies|Kids & Family
4411= Movies|Musicals
4412= Movies|Romance
4413= Movies|Sci-Fi & Fantasy
4414= Movies|Short Films
4415= Movies|Special Interest
4416= Movies|Thriller
4417= Movies|Sports
4418= Movies|Western
4419= Movies|Urban
4420= Movies|Holiday
4421= Movies|Made for TV
4422= Movies|Concert Films
4423= Movies|Music Documentaries
4424= Movies|Music Feature Films
4425= Movies|Japanese Cinema
4426= Movies|Jidaigeki
4427= Movies|Tokusatsu
4428= Movies|Korean Cinema
4429= Movies|Russian
4430= Movies|Turkish
4431= Movies|Bollywood
4432= Movies|Regional Indian
4433= Movies|Middle Eastern
4434= Movies|African
6000= App Store|Business
6001= App Store|Weather
6002= App Store|Utilities
6003= App Store|Travel
6004= App Store|Sports
6005= App Store|Social Networking
6006= App Store|Reference
6007= App Store|Productivity
6008= App Store|Photo & Video
6009= App Store|News
6010= App Store|Navigation
6011= App Store|Music
6012= App Store|Lifestyle
6013= App Store|Health & Fitness
6014= App Store|Games
6015= App Store|Finance
6016= App Store|Entertainment
6017= App Store|Education
6018= App Store|Books
6020= App Store|Medical
6021= App Store|Magazines & Newspapers
6022= App Store|Catalogs
6023= App Store|Food & Drink
6024= App Store|Shopping
6025= App Store|Stickers
6026= App Store|Developer Tools
6027= App Store|Graphics & Design
7001= App Store|Games|Action
7002= App Store|Games|Adventure
7003= App Store|Games|Casual
7004= App Store|Games|Board
7005= App Store|Games|Card
7006= App Store|Games|Casino
7007= App Store|Games|Dice
7008= App Store|Games|Educational
7009= App Store|Games|Family
7011= App Store|Games|Music
7012= App Store|Games|Puzzle
7013= App Store|Games|Racing
7014= App Store|Games|Role Playing
7015= App Store|Games|Simulation
7016= App Store|Games|Sports
7017= App Store|Games|Strategy
7018= App Store|Games|Trivia
7019= App Store|Games|Word
8001= Tones|Ringtones|Alternative
8002= Tones|Ringtones|Blues
8003= Tones|Ringtones|Children's Music
8004= Tones|Ringtones|Classical
8005= Tones|Ringtones|Comedy
8006= Tones|Ringtones|Country
8007= Tones|Ringtones|Dance
8008= Tones|Ringtones|Electronic
8009= Tones|Ringtones|Enka
8010= Tones|Ringtones|French Pop
8011= Tones|Ringtones|German Folk
8012= Tones|Ringtones|German Pop
8013= Tones|Ringtones|Hip-Hop/Rap
8014= Tones|Ringtones|Holiday
8015= Tones|Ringtones|Inspirational
8016= Tones|Ringtones|J-Pop
8017= Tones|Ringtones|Jazz
8018= Tones|Ringtones|Kayokyoku
8019= Tones|Ringtones|Latin
8020= Tones|Ringtones|New Age
8021= Tones|Ringtones|Classical|Opera
8022= Tones|Ringtones|Pop
8023= Tones|Ringtones|R&B/Soul
8024= Tones|Ringtones|Reggae
8025= Tones|Ringtones|Rock
8026= Tones|Ringtones|Singer/Songwriter
8027= Tones|Ringtones|Soundtrack
8028= Tones|Ringtones|Spoken Word
8029= Tones|Ringtones|Vocal
8030= Tones|Ringtones|World
8050= Tones|Alert Tones|Sound Effects
8051= Tones|Alert Tones|Dialogue
8052= Tones|Alert Tones|Music
8053= Tones|Ringtones
8054= Tones|Alert Tones
8055= Tones|Ringtones|Alternative|Chinese Alt
8056= Tones|Ringtones|Alternative|College Rock
8057= Tones|Ringtones|Alternative|Goth Rock
8058= Tones|Ringtones|Alternative|Grunge
8059= Tones|Ringtones|Alternative|Indie Rock
8060= Tones|Ringtones|Alternative|Korean Indie
8061= Tones|Ringtones|Alternative|New Wave
8062= Tones|Ringtones|Alternative|Punk
8063= Tones|Ringtones|Anime
8064= Tones|Ringtones|Arabic
8065= Tones|Ringtones|Arabic|Arabic Pop
8066= Tones|Ringtones|Arabic|Islamic
8067= Tones|Ringtones|Arabic|Khaleeji
8068= Tones|Ringtones|Arabic|North African
8069= Tones|Ringtones|Blues|Acoustic Blues
8070= Tones|Ringtones|Blues|Chicago Blues
8071= Tones|Ringtones|Blues|Classic Blues
8072= Tones|Ringtones|Blues|Contemporary Blues
8073= Tones|Ringtones|Blues|Country Blues
8074= Tones|Ringtones|Blues|Delta Blues
8075= Tones|Ringtones|Blues|Electric Blues
8076= Tones|Ringtones|Brazilian
8077= Tones|Ringtones|Brazilian|Axe
8078= Tones|Ringtones|Brazilian|Baile Funk
8079= Tones|Ringtones|Brazilian|Bossa Nova
8080= Tones|Ringtones|Brazilian|Choro
8081= Tones|Ringtones|Brazilian|Forro
8082= Tones|Ringtones|Brazilian|Frevo
8083= Tones|Ringtones|Brazilian|MPB
8084= Tones|Ringtones|Brazilian|Pagode
8085= Tones|Ringtones|Brazilian|Samba
8086= Tones|Ringtones|Brazilian|Sertanejo
8087= Tones|Ringtones|Children's Music|Lullabies
8088= Tones|Ringtones|Children's Music|Sing-Along
8089= Tones|Ringtones|Children's Music|Stories
8090= Tones|Ringtones|Chinese
8091= Tones|Ringtones|Chinese|Chinese Classical
8092= Tones|Ringtones|Chinese|Chinese Flute
8093= Tones|Ringtones|Chinese|Chinese Opera
8094= Tones|Ringtones|Chinese|Chinese Orchestral
8095= Tones|Ringtones|Chinese|Chinese Regional Folk
8096= Tones|Ringtones|Chinese|Chinese Strings
8097= Tones|Ringtones|Chinese|Taiwanese Folk
8098= Tones|Ringtones|Chinese|Tibetan Native Music
8099= Tones|Ringtones|Christian & Gospel
8100= Tones|Ringtones|Christian & Gospel|CCM
8101= Tones|Ringtones|Christian & Gospel|Christian Metal
8102= Tones|Ringtones|Christian & Gospel|Christian Pop
8103= Tones|Ringtones|Christian & Gospel|Christian Rap
8104= Tones|Ringtones|Christian & Gospel|Christian Rock
8105= Tones|Ringtones|Christian & Gospel|Classic Christian
8106= Tones|Ringtones|Christian & Gospel|Contemporary Gospel
8107= Tones|Ringtones|Christian & Gospel|Gospel
8108= Tones|Ringtones|Christian & Gospel|Praise & Worship
8109= Tones|Ringtones|Christian & Gospel|Southern Gospel
8110= Tones|Ringtones|Christian & Gospel|Traditional Gospel
8111= Tones|Ringtones|Classical|Avant-Garde
8112= Tones|Ringtones|Classical|Baroque Era
8113= Tones|Ringtones|Classical|Chamber Music
8114= Tones|Ringtones|Classical|Chant
8115= Tones|Ringtones|Classical|Choral
8116= Tones|Ringtones|Classical|Classical Crossover
8117= Tones|Ringtones|Classical|Early Music
8118= Tones|Ringtones|Classical|High Classical
8119= Tones|Ringtones|Classical|Impressionist
8120= Tones|Ringtones|Classical|Medieval Era
8121= Tones|Ringtones|Classical|Minimalism
8122= Tones|Ringtones|Classical|Modern Era
8123= Tones|Ringtones|Classical|Orchestral
8124= Tones|Ringtones|Classical|Renaissance
8125= Tones|Ringtones|Classical|Romantic Era
8126= Tones|Ringtones|Classical|Wedding Music
8127= Tones|Ringtones|Comedy|Novelty
8128= Tones|Ringtones|Comedy|Standup Comedy
8129= Tones|Ringtones|Country|Alternative Country
8130= Tones|Ringtones|Country|Americana
8131= Tones|Ringtones|Country|Bluegrass
8132= Tones|Ringtones|Country|Contemporary Bluegrass
8133= Tones|Ringtones|Country|Contemporary Country
8134= Tones|Ringtones|Country|Country Gospel
8135= Tones|Ringtones|Country|Honky Tonk
8136= Tones|Ringtones|Country|Outlaw Country
8137= Tones|Ringtones|Country|Thai Country
8138= Tones|Ringtones|Country|Traditional Bluegrass
8139= Tones|Ringtones|Country|Traditional Country
8140= Tones|Ringtones|Country|Urban Cowboy
8141= Tones|Ringtones|Dance|Breakbeat
8142= Tones|Ringtones|Dance|Exercise
8143= Tones|Ringtones|Dance|Garage
8144= Tones|Ringtones|Dance|Hardcore
8145= Tones|Ringtones|Dance|House
8146= Tones|Ringtones|Dance|Jungle/Drum'n'bass
8147= Tones|Ringtones|Dance|Techno
8148= Tones|Ringtones|Dance|Trance
8149= Tones|Ringtones|Disney
8150= Tones|Ringtones|Easy Listening
8151= Tones|Ringtones|Easy Listening|Lounge
8152= Tones|Ringtones|Easy Listening|Swing
8153= Tones|Ringtones|Electronic|Ambient
8154= Tones|Ringtones|Electronic|Downtempo
8155= Tones|Ringtones|Electronic|Electronica
8156= Tones|Ringtones|Electronic|IDM/Experimental
8157= Tones|Ringtones|Electronic|Industrial
8158= Tones|Ringtones|Fitness & Workout
8159= Tones|Ringtones|Folk
8160= Tones|Ringtones|Hip-Hop/Rap|Alternative Rap
8161= Tones|Ringtones|Hip-Hop/Rap|Chinese Hip-Hop
8162= Tones|Ringtones|Hip-Hop/Rap|Dirty South
8163= Tones|Ringtones|Hip-Hop/Rap|East Coast Rap
8164= Tones|Ringtones|Hip-Hop/Rap|Gangsta Rap
8165= Tones|Ringtones|Hip-Hop/Rap|Hardcore Rap
8166= Tones|Ringtones|Hip-Hop/Rap|Hip-Hop
8167= Tones|Ringtones|Hip-Hop/Rap|Korean Hip-Hop
8168= Tones|Ringtones|Hip-Hop/Rap|Latin Rap
8169= Tones|Ringtones|Hip-Hop/Rap|Old School Rap
8170= Tones|Ringtones|Hip-Hop/Rap|Rap
8171= Tones|Ringtones|Hip-Hop/Rap|Underground Rap
8172= Tones|Ringtones|Hip-Hop/Rap|West Coast Rap
8173= Tones|Ringtones|Holiday|Chanukah
8174= Tones|Ringtones|Holiday|Christmas
8175= Tones|Ringtones|Holiday|Christmas: Children's
8176= Tones|Ringtones|Holiday|Christmas: Classic
8177= Tones|Ringtones|Holiday|Christmas: Classical
8178= Tones|Ringtones|Holiday|Christmas: Jazz
8179= Tones|Ringtones|Holiday|Christmas: Modern
8180= Tones|Ringtones|Holiday|Christmas: Pop
8181= Tones|Ringtones|Holiday|Christmas: R&B
8182= Tones|Ringtones|Holiday|Christmas: Religious
8183= Tones|Ringtones|Holiday|Christmas: Rock
8184= Tones|Ringtones|Holiday|Easter
8185= Tones|Ringtones|Holiday|Halloween
8186= Tones|Ringtones|Holiday|Thanksgiving
8187= Tones|Ringtones|Indian
8188= Tones|Ringtones|Indian|Bollywood
8189= Tones|Ringtones|Indian|Devotional & Spiritual
8190= Tones|Ringtones|Indian|Ghazals
8191= Tones|Ringtones|Indian|Indian Classical
8192= Tones|Ringtones|Indian|Indian Folk
8193= Tones|Ringtones|Indian|Indian Pop
8194= Tones|Ringtones|Indian|Regional Indian
8195= Tones|Ringtones|Indian|Sufi
8196= Tones|Ringtones|Indian|Regional Indian|Tamil
8197= Tones|Ringtones|Indian|Regional Indian|Telugu
8198= Tones|Ringtones|Instrumental
8199= Tones|Ringtones|Jazz|Avant-Garde Jazz
8201= Tones|Ringtones|Jazz|Big Band
8202= Tones|Ringtones|Jazz|Bop
8203= Tones|Ringtones|Jazz|Contemporary Jazz
8204= Tones|Ringtones|Jazz|Cool Jazz
8205= Tones|Ringtones|Jazz|Crossover Jazz
8206= Tones|Ringtones|Jazz|Dixieland
8207= Tones|Ringtones|Jazz|Fusion
8208= Tones|Ringtones|Jazz|Hard Bop
8209= Tones|Ringtones|Jazz|Latin Jazz
8210= Tones|Ringtones|Jazz|Mainstream Jazz
8211= Tones|Ringtones|Jazz|Ragtime
8212= Tones|Ringtones|Jazz|Smooth Jazz
8213= Tones|Ringtones|Jazz|Trad Jazz
8214= Tones|Ringtones|Pop|K-Pop
8215= Tones|Ringtones|Karaoke
8216= Tones|Ringtones|Korean
8217= Tones|Ringtones|Korean|Korean Classical
8218= Tones|Ringtones|Korean|Korean Trad Instrumental
8219= Tones|Ringtones|Korean|Korean Trad Song
8220= Tones|Ringtones|Korean|Korean Trad Theater
8221= Tones|Ringtones|Latin|Alternative & Rock in Spanish
8222= Tones|Ringtones|Latin|Baladas y Boleros
8223= Tones|Ringtones|Latin|Contemporary Latin
8224= Tones|Ringtones|Latin|Latin Jazz
8225= Tones|Ringtones|Latin|Latin Urban
8226= Tones|Ringtones|Latin|Pop in Spanish
8227= Tones|Ringtones|Latin|Raices
8228= Tones|Ringtones|Latin|Musica Mexicana
8229= Tones|Ringtones|Latin|Salsa y Tropical
8230= Tones|Ringtones|Marching Bands
8231= Tones|Ringtones|New Age|Healing
8232= Tones|Ringtones|New Age|Meditation
8233= Tones|Ringtones|New Age|Nature
8234= Tones|Ringtones|New Age|Relaxation
8235= Tones|Ringtones|New Age|Travel
8236= Tones|Ringtones|Orchestral
8237= Tones|Ringtones|Pop|Adult Contemporary
8238= Tones|Ringtones|Pop|Britpop
8239= Tones|Ringtones|Pop|C-Pop
8240= Tones|Ringtones|Pop|Cantopop/HK-Pop
8241= Tones|Ringtones|Pop|Indo Pop
8242= Tones|Ringtones|Pop|Korean Folk-Pop
8243= Tones|Ringtones|Pop|Malaysian Pop
8244= Tones|Ringtones|Pop|Mandopop
8245= Tones|Ringtones|Pop|Manilla Sound
8246= Tones|Ringtones|Pop|Oldies
8247= Tones|Ringtones|Pop|Original Pilipino Music
8248= Tones|Ringtones|Pop|Pinoy Pop
8249= Tones|Ringtones|Pop|Pop/Rock
8250= Tones|Ringtones|Pop|Soft Rock
8251= Tones|Ringtones|Pop|Tai-Pop
8252= Tones|Ringtones|Pop|Teen Pop
8253= Tones|Ringtones|Pop|Thai Pop
8254= Tones|Ringtones|R&B/Soul|Contemporary R&B
8255= Tones|Ringtones|R&B/Soul|Disco
8256= Tones|Ringtones|R&B/Soul|Doo Wop
8257= Tones|Ringtones|R&B/Soul|Funk
8258= Tones|Ringtones|R&B/Soul|Motown
8259= Tones|Ringtones|R&B/Soul|Neo-Soul
8260= Tones|Ringtones|R&B/Soul|Soul
8261= Tones|Ringtones|Reggae|Modern Dancehall
8262= Tones|Ringtones|Reggae|Dub
8263= Tones|Ringtones|Reggae|Roots Reggae
8264= Tones|Ringtones|Reggae|Ska
8265= Tones|Ringtones|Rock|Adult Alternative
8266= Tones|Ringtones|Rock|American Trad Rock
8267= Tones|Ringtones|Rock|Arena Rock
8268= Tones|Ringtones|Rock|Blues-Rock
8269= Tones|Ringtones|Rock|British Invasion
8270= Tones|Ringtones|Rock|Chinese Rock
8271= Tones|Ringtones|Rock|Death Metal/Black Metal
8272= Tones|Ringtones|Rock|Glam Rock
8273= Tones|Ringtones|Rock|Hair Metal
8274= Tones|Ringtones|Rock|Hard Rock
8275= Tones|Ringtones|Rock|Metal
8276= Tones|Ringtones|Rock|Jam Bands
8277= Tones|Ringtones|Rock|Korean Rock
8278= Tones|Ringtones|Rock|Prog-Rock/Art Rock
8279= Tones|Ringtones|Rock|Psychedelic
8280= Tones|Ringtones|Rock|Rock & Roll
8281= Tones|Ringtones|Rock|Rockabilly
8282= Tones|Ringtones|Rock|Roots Rock
8283= Tones|Ringtones|Rock|Singer/Songwriter
8284= Tones|Ringtones|Rock|Southern Rock
8285= Tones|Ringtones|Rock|Surf
8286= Tones|Ringtones|Rock|Tex-Mex
8287= Tones|Ringtones|Singer/Songwriter|Alternative Folk
8288= Tones|Ringtones|Singer/Songwriter|Contemporary Folk
8289= Tones|Ringtones|Singer/Songwriter|Contemporary Singer/Songwriter
8290= Tones|Ringtones|Singer/Songwriter|Folk-Rock
8291= Tones|Ringtones|Singer/Songwriter|New Acoustic
8292= Tones|Ringtones|Singer/Songwriter|Traditional Folk
8293= Tones|Ringtones|Soundtrack|Foreign Cinema
8294= Tones|Ringtones|Soundtrack|Musicals
8295= Tones|Ringtones|Soundtrack|Original Score
8296= Tones|Ringtones|Soundtrack|Sound Effects
8297= Tones|Ringtones|Soundtrack|Soundtrack
8298= Tones|Ringtones|Soundtrack|TV Soundtrack
8299= Tones|Ringtones|Vocal|Standards
8300= Tones|Ringtones|Vocal|Traditional Pop
8301= Tones|Ringtones|Vocal|Trot
8302= Tones|Ringtones|Jazz|Vocal Jazz
8303= Tones|Ringtones|Vocal|Vocal Pop
8304= Tones|Ringtones|African
8305= Tones|Ringtones|African|Afrikaans
8306= Tones|Ringtones|African|Afro-Beat
8307= Tones|Ringtones|African|Afro-Pop
8308= Tones|Ringtones|Turkish|Arabesque
8309= Tones|Ringtones|World|Asia
8310= Tones|Ringtones|World|Australia
8311= Tones|Ringtones|World|Cajun
8312= Tones|Ringtones|World|Calypso
8313= Tones|Ringtones|World|Caribbean
8314= Tones|Ringtones|World|Celtic
8315= Tones|Ringtones|World|Celtic Folk
8316= Tones|Ringtones|World|Contemporary Celtic
8317= Tones|Ringtones|World|Dangdut
8318= Tones|Ringtones|World|Dini
8319= Tones|Ringtones|World|Europe
8320= Tones|Ringtones|World|Fado
8321= Tones|Ringtones|World|Farsi
8322= Tones|Ringtones|World|Flamenco
8323= Tones|Ringtones|World|France
8324= Tones|Ringtones|Turkish|Halk
8325= Tones|Ringtones|World|Hawaii
8326= Tones|Ringtones|World|Iberia
8327= Tones|Ringtones|World|Indonesian Religious
8328= Tones|Ringtones|World|Israeli
8329= Tones|Ringtones|World|Japan
8330= Tones|Ringtones|World|Klezmer
8331= Tones|Ringtones|World|North America
8332= Tones|Ringtones|World|Polka
8333= Tones|Ringtones|Russian
8334= Tones|Ringtones|Russian|Russian Chanson
8335= Tones|Ringtones|Turkish|Sanat
8336= Tones|Ringtones|World|Soca
8337= Tones|Ringtones|World|South Africa
8338= Tones|Ringtones|World|South America
8339= Tones|Ringtones|World|Tango
8340= Tones|Ringtones|World|Traditional Celtic
8341= Tones|Ringtones|Turkish
8342= Tones|Ringtones|World|Worldbeat
8343= Tones|Ringtones|World|Zydeco
8345= Tones|Ringtones|Classical|Art Song
8346= Tones|Ringtones|Classical|Brass & Woodwinds
8347= Tones|Ringtones|Classical|Solo Instrumental
8348= Tones|Ringtones|Classical|Contemporary Era
8349= Tones|Ringtones|Classical|Oratorio
8350= Tones|Ringtones|Classical|Cantata
8351= Tones|Ringtones|Classical|Electronic
8352= Tones|Ringtones|Classical|Sacred
8353= Tones|Ringtones|Classical|Guitar
8354= Tones|Ringtones|Classical|Piano
8355= Tones|Ringtones|Classical|Violin
8356= Tones|Ringtones|Classical|Cello
8357= Tones|Ringtones|Classical|Percussion
8358= Tones|Ringtones|Electronic|Dubstep
8359= Tones|Ringtones|Electronic|Bass
8360= Tones|Ringtones|Hip-Hop/Rap|UK Hip Hop
8361= Tones|Ringtones|Reggae|Lovers Rock
8362= Tones|Ringtones|Alternative|EMO
8363= Tones|Ringtones|Alternative|Pop Punk
8364= Tones|Ringtones|Alternative|Indie Pop
8365= Tones|Ringtones|New Age|Yoga
8366= Tones|Ringtones|Pop|Tribute
8367= Tones|Ringtones|Pop|Shows
8368= Tones|Ringtones|Cuban
8369= Tones|Ringtones|Cuban|Mambo
8370= Tones|Ringtones|Cuban|Chachacha
8371= Tones|Ringtones|Cuban|Guajira
8372= Tones|Ringtones|Cuban|Son
8373= Tones|Ringtones|Cuban|Bolero
8374= Tones|Ringtones|Cuban|Guaracha
8375= Tones|Ringtones|Cuban|Timba
8376= Tones|Ringtones|Soundtrack|Video Game
8377= Tones|Ringtones|Indian|Regional Indian|Punjabi|Punjabi Pop
8378= Tones|Ringtones|Indian|Regional Indian|Bengali|Rabindra Sangeet
8379= Tones|Ringtones|Indian|Regional Indian|Malayalam
8380= Tones|Ringtones|Indian|Regional Indian|Kannada
8381= Tones|Ringtones|Indian|Regional Indian|Marathi
8382= Tones|Ringtones|Indian|Regional Indian|Gujarati
8383= Tones|Ringtones|Indian|Regional Indian|Assamese
8384= Tones|Ringtones|Indian|Regional Indian|Bhojpuri
8385= Tones|Ringtones|Indian|Regional Indian|Haryanvi
8386= Tones|Ringtones|Indian|Regional Indian|Odia
8387= Tones|Ringtones|Indian|Regional Indian|Rajasthani
8388= Tones|Ringtones|Indian|Regional Indian|Urdu
8389= Tones|Ringtones|Indian|Regional Indian|Punjabi
8390= Tones|Ringtones|Indian|Regional Indian|Bengali
8391= Tones|Ringtones|Indian|Indian Classical|Carnatic Classical
8392= Tones|Ringtones|Indian|Indian Classical|Hindustani Classical
8393= Tones|Ringtones|African|Afro House
8394= Tones|Ringtones|African|Afro Soul
8395= Tones|Ringtones|African|Afrobeats
8396= Tones|Ringtones|African|Benga
8397= Tones|Ringtones|African|Bongo-Flava
8398= Tones|Ringtones|African|Coupe-Decale
8399= Tones|Ringtones|African|Gqom
8400= Tones|Ringtones|African|Highlife
8401= Tones|Ringtones|African|Kuduro
8402= Tones|Ringtones|African|Kizomba
8403= Tones|Ringtones|African|Kwaito
8404= Tones|Ringtones|African|Mbalax
8405= Tones|Ringtones|African|Ndombolo
8406= Tones|Ringtones|African|Shangaan Electro
8407= Tones|Ringtones|African|Soukous
8408= Tones|Ringtones|African|Taarab
8409= Tones|Ringtones|African|Zouglou
8410= Tones|Ringtones|Turkish|Ozgun
8411= Tones|Ringtones|Turkish|Fantezi
8412= Tones|Ringtones|Turkish|Religious
8413= Tones|Ringtones|Pop|Turkish Pop
8414= Tones|Ringtones|Rock|Turkish Rock
8415= Tones|Ringtones|Alternative|Turkish Alternative
8416= Tones|Ringtones|Hip-Hop/Rap|Turkish Hip-Hop/Rap
8417= Tones|Ringtones|African|Maskandi
8418= Tones|Ringtones|Russian|Russian Romance
8419= Tones|Ringtones|Russian|Russian Bard
8420= Tones|Ringtones|Russian|Russian Pop
8421= Tones|Ringtones|Russian|Russian Rock
8422= Tones|Ringtones|Russian|Russian Hip-Hop
8423= Tones|Ringtones|Arabic|Levant
8424= Tones|Ringtones|Arabic|Levant|Dabke
8425= Tones|Ringtones|Arabic|Maghreb Rai
8426= Tones|Ringtones|Arabic|Khaleeji|Khaleeji Jalsat
8427= Tones|Ringtones|Arabic|Khaleeji|Khaleeji Shailat
8428= Tones|Ringtones|Tarab
8429= Tones|Ringtones|Tarab|Iraqi Tarab
8430= Tones|Ringtones|Tarab|Egyptian Tarab
8431= Tones|Ringtones|Tarab|Khaleeji Tarab
8432= Tones|Ringtones|Pop|Levant Pop
8433= Tones|Ringtones|Pop|Iraqi Pop
8434= Tones|Ringtones|Pop|Egyptian Pop
8435= Tones|Ringtones|Pop|Maghreb Pop
8436= Tones|Ringtones|Pop|Khaleeji Pop
8437= Tones|Ringtones|Hip-Hop/Rap|Levant Hip-Hop
8438= Tones|Ringtones|Hip-Hop/Rap|Egyptian Hip-Hop
8439= Tones|Ringtones|Hip-Hop/Rap|Maghreb Hip-Hop
8440= Tones|Ringtones|Hip-Hop/Rap|Khaleeji Hip-Hop
8441= Tones|Ringtones|Alternative|Indie Levant
8442= Tones|Ringtones|Alternative|Indie Egyptian
8443= Tones|Ringtones|Alternative|Indie Maghreb
8444= Tones|Ringtones|Electronic|Levant Electronic
8445= Tones|Ringtones|Electronic|Electro-Cha'abi
8446= Tones|Ringtones|Electronic|Maghreb Electronic
8447= Tones|Ringtones|Folk|Iraqi Folk
8448= Tones|Ringtones|Folk|Khaleeji Folk
8449= Tones|Ringtones|Dance|Maghreb Dance
9002= Books|Nonfiction
9003= Books|Romance
9004= Books|Travel & Adventure
9007= Books|Arts & Entertainment
9008= Books|Biographies & Memoirs
9009= Books|Business & Personal Finance
9010= Books|Children & Teens
9012= Books|Humor
9015= Books|History
9018= Books|Religion & Spirituality
9019= Books|Science & Nature
9020= Books|Sci-Fi & Fantasy
9024= Books|Lifestyle & Home
9025= Books|Self-Development
9026= Books|Comics & Graphic Novels
9027= Books|Computers & Internet
9028= Books|Cookbooks, Food & Wine
9029= Books|Professional & Technical
9030= Books|Parenting
9031= Books|Fiction & Literature
9032= Books|Mysteries & Thrillers
9033= Books|Reference
9034= Books|Politics & Current Events
9035= Books|Sports & Outdoors
10001= Books|Lifestyle & Home|Antiques & Collectibles
10002= Books|Arts & Entertainment|Art & Architecture
10003= Books|Religion & Spirituality|Bibles
10004= Books|Self-Development|Spirituality
10005= Books|Business & Personal Finance|Industries & Professions
10006= Books|Business & Personal Finance|Marketing & Sales
10007= Books|Business & Personal Finance|Small Business & Entrepreneurship
10008= Books|Business & Personal Finance|Personal Finance
10009= Books|Business & Personal Finance|Reference
10010= Books|Business & Personal Finance|Careers
10011= Books|Business & Personal Finance|Economics
10012= Books|Business & Personal Finance|Investing
10013= Books|Business & Personal Finance|Finance
10014= Books|Business & Personal Finance|Management & Leadership
10015= Books|Comics & Graphic Novels|Graphic Novels
10016= Books|Comics & Graphic Novels|Manga
10017= Books|Computers & Internet|Computers
10018= Books|Computers & Internet|Databases
10019= Books|Computers & Internet|Digital Media
10020= Books|Computers & Internet|Internet
10021= Books|Computers & Internet|Network
10022= Books|Computers & Internet|Operating Systems
10023= Books|Computers & Internet|Programming
10024= Books|Computers & Internet|Software
10025= Books|Computers & Internet|System Administration
10026= Books|Cookbooks, Food & Wine|Beverages
10027= Books|Cookbooks, Food & Wine|Courses & Dishes
10028= Books|Cookbooks, Food & Wine|Special Diet
10029= Books|Cookbooks, Food & Wine|Special Occasions
10030= Books|Cookbooks, Food & Wine|Methods
10031= Books|Cookbooks, Food & Wine|Reference
10032= Books|Cookbooks, Food & Wine|Regional & Ethnic
10033= Books|Cookbooks, Food & Wine|Specific Ingredients
10034= Books|Lifestyle & Home|Crafts & Hobbies
10035= Books|Professional & Technical|Design
10036= Books|Arts & Entertainment|Theater
10037= Books|Professional & Technical|Education
10038= Books|Nonfiction|Family & Relationships
10039= Books|Fiction & Literature|Action & Adventure
10040= Books|Fiction & Literature|African American
10041= Books|Fiction & Literature|Religious
10042= Books|Fiction & Literature|Classics
10043= Books|Fiction & Literature|Erotica
10044= Books|Sci-Fi & Fantasy|Fantasy
10045= Books|Fiction & Literature|Gay
10046= Books|Fiction & Literature|Ghost
10047= Books|Fiction & Literature|Historical
10048= Books|Fiction & Literature|Horror
10049= Books|Fiction & Literature|Literary
10050= Books|Mysteries & Thrillers|Hard-Boiled
10051= Books|Mysteries & Thrillers|Historical
10052= Books|Mysteries & Thrillers|Police Procedural
10053= Books|Mysteries & Thrillers|Short Stories
10054= Books|Mysteries & Thrillers|British Detectives
10055= Books|Mysteries & Thrillers|Women Sleuths
10056= Books|Romance|Erotic Romance
10057= Books|Romance|Contemporary
10058= Books|Romance|Paranormal
10059= Books|Romance|Historical
10060= Books|Romance|Short Stories
10061= Books|Romance|Suspense
10062= Books|Romance|Western
10063= Books|Sci-Fi & Fantasy|Science Fiction
10064= Books|Sci-Fi & Fantasy|Science Fiction & Literature
10065= Books|Fiction & Literature|Short Stories
10066= Books|Reference|Foreign Languages
10067= Books|Arts & Entertainment|Games
10068= Books|Lifestyle & Home|Gardening
10069= Books|Self-Development|Health & Fitness
10070= Books|History|Africa
10071= Books|History|Americas
10072= Books|History|Ancient
10073= Books|History|Asia
10074= Books|History|Australia & Oceania
10075= Books|History|Europe
10076= Books|History|Latin America
10077= Books|History|Middle East
10078= Books|History|Military
10079= Books|History|United States
10080= Books|History|World
10081= Books|Children & Teens|Children's Fiction
10082= Books|Children & Teens|Children's Nonfiction
10083= Books|Professional & Technical|Law
10084= Books|Fiction & Literature|Literary Criticism
10085= Books|Science & Nature|Mathematics
10086= Books|Professional & Technical|Medical
10087= Books|Arts & Entertainment|Music
10088= Books|Science & Nature|Nature
10089= Books|Arts & Entertainment|Performing Arts
10090= Books|Lifestyle & Home|Pets
10091= Books|Nonfiction|Philosophy
10092= Books|Arts & Entertainment|Photography
10093= Books|Fiction & Literature|Poetry
10094= Books|Self-Development|Psychology
10095= Books|Reference|Almanacs & Yearbooks
10096= Books|Reference|Atlases & Maps
10097= Books|Reference|Catalogs & Directories
10098= Books|Reference|Consumer Guides
10099= Books|Reference|Dictionaries & Thesauruses
10100= Books|Reference|Encyclopedias
10101= Books|Reference|Etiquette
10102= Books|Reference|Quotations
10103= Books|Reference|Words & Language
10104= Books|Reference|Writing
10105= Books|Religion & Spirituality|Bible Studies
10106= Books|Religion & Spirituality|Buddhism
10107= Books|Religion & Spirituality|Christianity
10108= Books|Religion & Spirituality|Hinduism
10109= Books|Religion & Spirituality|Islam
10110= Books|Religion & Spirituality|Judaism
10111= Books|Science & Nature|Astronomy
10112= Books|Science & Nature|Chemistry
10113= Books|Science & Nature|Earth Sciences
10114= Books|Science & Nature|Essays
10115= Books|Science & Nature|History
10116= Books|Science & Nature|Life Sciences
10117= Books|Science & Nature|Physics
10118= Books|Science & Nature|Reference
10119= Books|Self-Development|Self-Improvement
10120= Books|Nonfiction|Social Science
10121= Books|Sports & Outdoors|Baseball
10122= Books|Sports & Outdoors|Basketball
10123= Books|Sports & Outdoors|Coaching
10124= Books|Sports & Outdoors|Extreme Sports
10125= Books|Sports & Outdoors|Football
10126= Books|Sports & Outdoors|Golf
10127= Books|Sports & Outdoors|Hockey
10128= Books|Sports & Outdoors|Mountaineering
10129= Books|Sports & Outdoors|Outdoors
10130= Books|Sports & Outdoors|Racket Sports
10131= Books|Sports & Outdoors|Reference
10132= Books|Sports & Outdoors|Soccer
10133= Books|Sports & Outdoors|Training
10134= Books|Sports & Outdoors|Water Sports
10135= Books|Sports & Outdoors|Winter Sports
10136= Books|Reference|Study Aids
10137= Books|Professional & Technical|Engineering
10138= Books|Nonfiction|Transportation
10139= Books|Travel & Adventure|Africa
10140= Books|Travel & Adventure|Asia
10141= Books|Travel & Adventure|Specialty Travel
10142= Books|Travel & Adventure|Canada
10143= Books|Travel & Adventure|Caribbean
10144= Books|Travel & Adventure|Latin America
10145= Books|Travel & Adventure|Essays & Memoirs
10146= Books|Travel & Adventure|Europe
10147= Books|Travel & Adventure|Middle East
10148= Books|Travel & Adventure|United States
10149= Books|Nonfiction|True Crime
11001= Books|Sci-Fi & Fantasy|Fantasy|Contemporary
11002= Books|Sci-Fi & Fantasy|Fantasy|Epic
11003= Books|Sci-Fi & Fantasy|Fantasy|Historical
11004= Books|Sci-Fi & Fantasy|Fantasy|Paranormal
11005= Books|Sci-Fi & Fantasy|Fantasy|Short Stories
11006= Books|Sci-Fi & Fantasy|Science Fiction & Literature|Adventure
11007= Books|Sci-Fi & Fantasy|Science Fiction & Literature|High Tech
11008= Books|Sci-Fi & Fantasy|Science Fiction & Literature|Short Stories
11009= Books|Professional & Technical|Education|Language Arts & Disciplines
11010= Books|Communications & Media
11011= Books|Communications & Media|Broadcasting
11012= Books|Communications & Media|Digital Media
11013= Books|Communications & Media|Journalism
11014= Books|Communications & Media|Photojournalism
11015= Books|Communications & Media|Print
11016= Books|Communications & Media|Speech
11017= Books|Communications & Media|Writing
11018= Books|Arts & Entertainment|Art & Architecture|Urban Planning
11019= Books|Arts & Entertainment|Dance
11020= Books|Arts & Entertainment|Fashion
11021= Books|Arts & Entertainment|Film
11022= Books|Arts & Entertainment|Interior Design
11023= Books|Arts & Entertainment|Media Arts
11024= Books|Arts & Entertainment|Radio
11025= Books|Arts & Entertainment|TV
11026= Books|Arts & Entertainment|Visual Arts
11027= Books|Biographies & Memoirs|Arts & Entertainment
11028= Books|Biographies & Memoirs|Business
11029= Books|Biographies & Memoirs|Culinary
11030= Books|Biographies & Memoirs|Gay & Lesbian
11031= Books|Biographies & Memoirs|Historical
11032= Books|Biographies & Memoirs|Literary
11033= Books|Biographies & Memoirs|Media & Journalism
11034= Books|Biographies & Memoirs|Military
11035= Books|Biographies & Memoirs|Politics
11036= Books|Biographies & Memoirs|Religious
11037= Books|Biographies & Memoirs|Science & Technology
11038= Books|Biographies & Memoirs|Sports
11039= Books|Biographies & Memoirs|Women
11040= Books|Romance|New Adult
11042= Books|Romance|Romantic Comedy
11043= Books|Romance|Gay & Lesbian
11044= Books|Fiction & Literature|Essays
11045= Books|Fiction & Literature|Anthologies
11046= Books|Fiction & Literature|Comparative Literature
11047= Books|Fiction & Literature|Drama
11049= Books|Fiction & Literature|Fairy Tales, Myths & Fables
11050= Books|Fiction & Literature|Family
11051= Books|Comics & Graphic Novels|Manga|School Drama
11052= Books|Comics & Graphic Novels|Manga|Human Drama
11053= Books|Comics & Graphic Novels|Manga|Family Drama
11054= Books|Sports & Outdoors|Boxing
11055= Books|Sports & Outdoors|Cricket
11056= Books|Sports & Outdoors|Cycling
11057= Books|Sports & Outdoors|Equestrian
11058= Books|Sports & Outdoors|Martial Arts & Self Defense
11059= Books|Sports & Outdoors|Motor Sports
11060= Books|Sports & Outdoors|Rugby
11061= Books|Sports & Outdoors|Running
11062= Books|Self-Development|Diet & Nutrition
11063= Books|Science & Nature|Agriculture
11064= Books|Science & Nature|Atmosphere
11065= Books|Science & Nature|Biology
11066= Books|Science & Nature|Ecology
11067= Books|Science & Nature|Environment
11068= Books|Science & Nature|Geography
11069= Books|Science & Nature|Geology
11070= Books|Nonfiction|Social Science|Anthropology
11071= Books|Nonfiction|Social Science|Archaeology
11072= Books|Nonfiction|Social Science|Civics
11073= Books|Nonfiction|Social Science|Government
11074= Books|Nonfiction|Social Science|Social Studies
11075= Books|Nonfiction|Social Science|Social Welfare
11076= Books|Nonfiction|Social Science|Society
11077= Books|Nonfiction|Philosophy|Aesthetics
11078= Books|Nonfiction|Philosophy|Epistemology
11079= Books|Nonfiction|Philosophy|Ethics
11080= Books|Nonfiction|Philosophy|Language
11081= Books|Nonfiction|Philosophy|Logic
11082= Books|Nonfiction|Philosophy|Metaphysics
11083= Books|Nonfiction|Philosophy|Political
11084= Books|Nonfiction|Philosophy|Religion
11085= Books|Reference|Manuals
11086= Books|Kids
11087= Books|Kids|Animals
11088= Books|Kids|Basic Concepts
11089= Books|Kids|Basic Concepts|Alphabet
11090= Books|Kids|Basic Concepts|Body
11091= Books|Kids|Basic Concepts|Colors
11092= Books|Kids|Basic Concepts|Counting & Numbers
11093= Books|Kids|Basic Concepts|Date & Time
11094= Books|Kids|Basic Concepts|General
11095= Books|Kids|Basic Concepts|Money
11096= Books|Kids|Basic Concepts|Opposites
11097= Books|Kids|Basic Concepts|Seasons
11098= Books|Kids|Basic Concepts|Senses & Sensation
11099= Books|Kids|Basic Concepts|Size & Shape
11100= Books|Kids|Basic Concepts|Sounds
11101= Books|Kids|Basic Concepts|Words
11102= Books|Kids|Biography
11103= Books|Kids|Careers & Occupations
11104= Books|Kids|Computers & Technology
11105= Books|Kids|Cooking & Food
11106= Books|Kids|Arts & Entertainment
11107= Books|Kids|Arts & Entertainment|Art
11108= Books|Kids|Arts & Entertainment|Crafts
11109= Books|Kids|Arts & Entertainment|Music
11110= Books|Kids|Arts & Entertainment|Performing Arts
11111= Books|Kids|Family
11112= Books|Kids|Fiction
11113= Books|Kids|Fiction|Action & Adventure
11114= Books|Kids|Fiction|Animals
11115= Books|Kids|Fiction|Classics
11116= Books|Kids|Fiction|Comics & Graphic Novels
11117= Books|Kids|Fiction|Culture, Places & People
11118= Books|Kids|Fiction|Family & Relationships
11119= Books|Kids|Fiction|Fantasy
11120= Books|Kids|Fiction|Fairy Tales, Myths & Fables
11121= Books|Kids|Fiction|Favorite Characters
11122= Books|Kids|Fiction|Historical
11123= Books|Kids|Fiction|Holidays & Celebrations
11124= Books|Kids|Fiction|Monsters & Ghosts
11125= Books|Kids|Fiction|Mysteries
11126= Books|Kids|Fiction|Nature
11127= Books|Kids|Fiction|Religion
11128= Books|Kids|Fiction|Sci-Fi
11129= Books|Kids|Fiction|Social Issues
11130= Books|Kids|Fiction|Sports & Recreation
11131= Books|Kids|Fiction|Transportation
11132= Books|Kids|Games & Activities
11133= Books|Kids|General Nonfiction
11134= Books|Kids|Health
11135= Books|Kids|History
11136= Books|Kids|Holidays & Celebrations
11137= Books|Kids|Holidays & Celebrations|Birthdays
11138= Books|Kids|Holidays & Celebrations|Christmas & Advent
11139= Books|Kids|Holidays & Celebrations|Easter & Lent
11140= Books|Kids|Holidays & Celebrations|General
11141= Books|Kids|Holidays & Celebrations|Halloween
11142= Books|Kids|Holidays & Celebrations|Hanukkah
11143= Books|Kids|Holidays & Celebrations|Other
11144= Books|Kids|Holidays & Celebrations|Passover
11145= Books|Kids|Holidays & Celebrations|Patriotic Holidays
11146= Books|Kids|Holidays & Celebrations|Ramadan
11147= Books|Kids|Holidays & Celebrations|Thanksgiving
11148= Books|Kids|Holidays & Celebrations|Valentine's Day
11149= Books|Kids|Humor
11150= Books|Kids|Humor|Jokes & Riddles
11151= Books|Kids|Poetry
11152= Books|Kids|Learning to Read
11153= Books|Kids|Learning to Read|Chapter Books
11154= Books|Kids|Learning to Read|Early Readers
11155= Books|Kids|Learning to Read|Intermediate Readers
11156= Books|Kids|Nursery Rhymes
11157= Books|Kids|Government
11158= Books|Kids|Reference
11159= Books|Kids|Religion
11160= Books|Kids|Science & Nature
11161= Books|Kids|Social Issues
11162= Books|Kids|Social Studies
11163= Books|Kids|Sports & Recreation
11164= Books|Kids|Transportation
11165= Books|Young Adult
11166= Books|Young Adult|Animals
11167= Books|Young Adult|Biography
11168= Books|Young Adult|Careers & Occupations
11169= Books|Young Adult|Computers & Technology
11170= Books|Young Adult|Cooking & Food
11171= Books|Young Adult|Arts & Entertainment
11172= Books|Young Adult|Arts & Entertainment|Art
11173= Books|Young Adult|Arts & Entertainment|Crafts
11174= Books|Young Adult|Arts & Entertainment|Music
11175= Books|Young Adult|Arts & Entertainment|Performing Arts
11176= Books|Young Adult|Family
11177= Books|Young Adult|Fiction
11178= Books|Young Adult|Fiction|Action & Adventure
11179= Books|Young Adult|Fiction|Animals
11180= Books|Young Adult|Fiction|Classics
11181= Books|Young Adult|Fiction|Comics & Graphic Novels
11182= Books|Young Adult|Fiction|Culture, Places & People
11183= Books|Young Adult|Fiction|Dystopian
11184= Books|Young Adult|Fiction|Family & Relationships
11185= Books|Young Adult|Fiction|Fantasy
11186= Books|Young Adult|Fiction|Fairy Tales, Myths & Fables
11187= Books|Young Adult|Fiction|Favorite Characters
11188= Books|Young Adult|Fiction|Historical
11189= Books|Young Adult|Fiction|Holidays & Celebrations
11190= Books|Young Adult|Fiction|Horror, Monsters & Ghosts
11191= Books|Young Adult|Fiction|Crime & Mystery
11192= Books|Young Adult|Fiction|Nature
11193= Books|Young Adult|Fiction|Religion
11194= Books|Young Adult|Fiction|Romance
11195= Books|Young Adult|Fiction|Sci-Fi
11196= Books|Young Adult|Fiction|Coming of Age
11197= Books|Young Adult|Fiction|Sports & Recreation
11198= Books|Young Adult|Fiction|Transportation
11199= Books|Young Adult|Games & Activities
11200= Books|Young Adult|General Nonfiction
11201= Books|Young Adult|Health
11202= Books|Young Adult|History
11203= Books|Young Adult|Holidays & Celebrations
11204= Books|Young Adult|Holidays & Celebrations|Birthdays
11205= Books|Young Adult|Holidays & Celebrations|Christmas & Advent
11206= Books|Young Adult|Holidays & Celebrations|Easter & Lent
11207= Books|Young Adult|Holidays & Celebrations|General
11208= Books|Young Adult|Holidays & Celebrations|Halloween
11209= Books|Young Adult|Holidays & Celebrations|Hanukkah
11210= Books|Young Adult|Holidays & Celebrations|Other
11211= Books|Young Adult|Holidays & Celebrations|Passover
11212= Books|Young Adult|Holidays & Celebrations|Patriotic Holidays
11213= Books|Young Adult|Holidays & Celebrations|Ramadan
11214= Books|Young Adult|Holidays & Celebrations|Thanksgiving
11215= Books|Young Adult|Holidays & Celebrations|Valentine's Day
11216= Books|Young Adult|Humor
11217= Books|Young Adult|Humor|Jokes & Riddles
11218= Books|Young Adult|Poetry
11219= Books|Young Adult|Politics & Government
11220= Books|Young Adult|Reference
11221= Books|Young Adult|Religion
11222= Books|Young Adult|Science & Nature
11223= Books|Young Adult|Coming of Age
11224= Books|Young Adult|Social Studies
11225= Books|Young Adult|Sports & Recreation
11226= Books|Young Adult|Transportation
11227= Books|Communications & Media
11228= Books|Military & Warfare
11229= Books|Romance|Inspirational
11231= Books|Romance|Holiday
11232= Books|Romance|Wholesome
11233= Books|Romance|Military
11234= Books|Arts & Entertainment|Art History
11236= Books|Arts & Entertainment|Design
11243= Books|Business & Personal Finance|Accounting
11244= Books|Business & Personal Finance|Hospitality
11245= Books|Business & Personal Finance|Real Estate
11246= Books|Humor|Jokes & Riddles
11247= Books|Religion & Spirituality|Comparative Religion
11255= Books|Cookbooks, Food & Wine|Culinary Arts
11259= Books|Mysteries & Thrillers|Cozy
11260= Books|Politics & Current Events|Current Events
11261= Books|Politics & Current Events|Foreign Policy & International Relations
11262= Books|Politics & Current Events|Local Government
11263= Books|Politics & Current Events|National Government
11264= Books|Politics & Current Events|Political Science
11265= Books|Politics & Current Events|Public Administration
11266= Books|Politics & Current Events|World Affairs
11273= Books|Nonfiction|Family & Relationships|Family & Childcare
11274= Books|Nonfiction|Family & Relationships|Love & Romance
11275= Books|Sci-Fi & Fantasy|Fantasy|Urban
11276= Books|Reference|Foreign Languages|Arabic
11277= Books|Reference|Foreign Languages|Bilingual Editions
11278= Books|Reference|Foreign Languages|African Languages
11279= Books|Reference|Foreign Languages|Ancient Languages
11280= Books|Reference|Foreign Languages|Chinese
11281= Books|Reference|Foreign Languages|English
11282= Books|Reference|Foreign Languages|French
11283= Books|Reference|Foreign Languages|German
11284= Books|Reference|Foreign Languages|Hebrew
11285= Books|Reference|Foreign Languages|Hindi
11286= Books|Reference|Foreign Languages|Italian
11287= Books|Reference|Foreign Languages|Japanese
11288= Books|Reference|Foreign Languages|Korean
11289= Books|Reference|Foreign Languages|Linguistics
11290= Books|Reference|Foreign Languages|Other Languages
11291= Books|Reference|Foreign Languages|Portuguese
11292= Books|Reference|Foreign Languages|Russian
11293= Books|Reference|Foreign Languages|Spanish
11294= Books|Reference|Foreign Languages|Speech Pathology
11295= Books|Science & Nature|Mathematics|Advanced Mathematics
11296= Books|Science & Nature|Mathematics|Algebra
11297= Books|Science & Nature|Mathematics|Arithmetic
11298= Books|Science & Nature|Mathematics|Calculus
11299= Books|Science & Nature|Mathematics|Geometry
11300= Books|Science & Nature|Mathematics|Statistics
11301= Books|Professional & Technical|Medical|Veterinary
11302= Books|Professional & Technical|Medical|Neuroscience
11303= Books|Professional & Technical|Medical|Immunology
11304= Books|Professional & Technical|Medical|Nursing
11305= Books|Professional & Technical|Medical|Pharmacology & Toxicology
11306= Books|Professional & Technical|Medical|Anatomy & Physiology
11307= Books|Professional & Technical|Medical|Dentistry
11308= Books|Professional & Technical|Medical|Emergency Medicine
11309= Books|Professional & Technical|Medical|Genetics
11310= Books|Professional & Technical|Medical|Psychiatry
11311= Books|Professional & Technical|Medical|Radiology
11312= Books|Professional & Technical|Medical|Alternative Medicine
11317= Books|Nonfiction|Philosophy|Political Philosophy
11319= Books|Nonfiction|Philosophy|Philosophy of Language
11320= Books|Nonfiction|Philosophy|Philosophy of Religion
11327= Books|Nonfiction|Social Science|Sociology
11329= Books|Professional & Technical|Engineering|Aeronautics
11330= Books|Professional & Technical|Engineering|Chemical & Petroleum Engineering
11331= Books|Professional & Technical|Engineering|Civil Engineering
11332= Books|Professional & Technical|Engineering|Computer Science
11333= Books|Professional & Technical|Engineering|Electrical Engineering
11334= Books|Professional & Technical|Engineering|Environmental Engineering
11335= Books|Professional & Technical|Engineering|Mechanical Engineering
11336= Books|Professional & Technical|Engineering|Power Resources
11337= Books|Comics & Graphic Novels|Manga|Boys
11338= Books|Comics & Graphic Novels|Manga|Men
11339= Books|Comics & Graphic Novels|Manga|Girls
11340= Books|Comics & Graphic Novels|Manga|Women
11341= Books|Comics & Graphic Novels|Manga|Other
11342= Books|Comics & Graphic Novels|Manga|Yaoi
11343= Books|Comics & Graphic Novels|Manga|Comic Essays
12001= Mac App Store|Business
12002= Mac App Store|Developer Tools
12003= Mac App Store|Education
12004= Mac App Store|Entertainment
12005= Mac App Store|Finance
12006= Mac App Store|Games
12007= Mac App Store|Health & Fitness
12008= Mac App Store|Lifestyle
12010= Mac App Store|Medical
12011= Mac App Store|Music
12012= Mac App Store|News
12013= Mac App Store|Photography
12014= Mac App Store|Productivity
12015= Mac App Store|Reference
12016= Mac App Store|Social Networking
12017= Mac App Store|Sports
12018= Mac App Store|Travel
12019= Mac App Store|Utilities
12020= Mac App Store|Video
12021= Mac App Store|Weather
12022= Mac App Store|Graphics & Design
12201= Mac App Store|Games|Action
12202= Mac App Store|Games|Adventure
12203= Mac App Store|Games|Casual
12204= Mac App Store|Games|Board
12205= Mac App Store|Games|Card
12206= Mac App Store|Games|Casino
12207= Mac App Store|Games|Dice
12208= Mac App Store|Games|Educational
12209= Mac App Store|Games|Family
12210= Mac App Store|Games|Kids
12211= Mac App Store|Games|Music
12212= Mac App Store|Games|Puzzle
12213= Mac App Store|Games|Racing
12214= Mac App Store|Games|Role Playing
12215= Mac App Store|Games|Simulation
12216= Mac App Store|Games|Sports
12217= Mac App Store|Games|Strategy
12218= Mac App Store|Games|Trivia
12219= Mac App Store|Games|Word
13001= App Store|Magazines & Newspapers|News & Politics
13002= App Store|Magazines & Newspapers|Fashion & Style
13003= App Store|Magazines & Newspapers|Home & Garden
13004= App Store|Magazines & Newspapers|Outdoors & Nature
13005= App Store|Magazines & Newspapers|Sports & Leisure
13006= App Store|Magazines & Newspapers|Automotive
13007= App Store|Magazines & Newspapers|Arts & Photography
13008= App Store|Magazines & Newspapers|Brides & Weddings
13009= App Store|Magazines & Newspapers|Business & Investing
13010= App Store|Magazines & Newspapers|Children's Magazines
13011= App Store|Magazines & Newspapers|Computers & Internet
13012= App Store|Magazines & Newspapers|Cooking, Food & Drink
13013= App Store|Magazines & Newspapers|Crafts & Hobbies
13014= App Store|Magazines & Newspapers|Electronics & Audio
13015= App Store|Magazines & Newspapers|Entertainment
13017= App Store|Magazines & Newspapers|Health, Mind & Body
13018= App Store|Magazines & Newspapers|History
13019= App Store|Magazines & Newspapers|Literary Magazines & Journals
13020= App Store|Magazines & Newspapers|Men's Interest
13021= App Store|Magazines & Newspapers|Movies & Music
13023= App Store|Magazines & Newspapers|Parenting & Family
13024= App Store|Magazines & Newspapers|Pets
13025= App Store|Magazines & Newspapers|Professional & Trade
13026= App Store|Magazines & Newspapers|Regional News
13027= App Store|Magazines & Newspapers|Science
13028= App Store|Magazines & Newspapers|Teens
13029= App Store|Magazines & Newspapers|Travel & Regional
13030= App Store|Magazines & Newspapers|Women's Interest
15000= Textbooks|Arts & Entertainment
15001= Textbooks|Arts & Entertainment|Art & Architecture
15002= Textbooks|Arts & Entertainment|Art & Architecture|Urban Planning
15003= Textbooks|Arts & Entertainment|Art History
15004= Textbooks|Arts & Entertainment|Dance
15005= Textbooks|Arts & Entertainment|Design
15006= Textbooks|Arts & Entertainment|Fashion
15007= Textbooks|Arts & Entertainment|Film
15008= Textbooks|Arts & Entertainment|Games
15009= Textbooks|Arts & Entertainment|Interior Design
15010= Textbooks|Arts & Entertainment|Media Arts
15011= Textbooks|Arts & Entertainment|Music
15012= Textbooks|Arts & Entertainment|Performing Arts
15013= Textbooks|Arts & Entertainment|Photography
15014= Textbooks|Arts & Entertainment|Theater
15015= Textbooks|Arts & Entertainment|TV
15016= Textbooks|Arts & Entertainment|Visual Arts
15017= Textbooks|Biographies & Memoirs
15018= Textbooks|Business & Personal Finance
15019= Textbooks|Business & Personal Finance|Accounting
15020= Textbooks|Business & Personal Finance|Careers
15021= Textbooks|Business & Personal Finance|Economics
15022= Textbooks|Business & Personal Finance|Finance
15023= Textbooks|Business & Personal Finance|Hospitality
15024= Textbooks|Business & Personal Finance|Industries & Professions
15025= Textbooks|Business & Personal Finance|Investing
15026= Textbooks|Business & Personal Finance|Management & Leadership
15027= Textbooks|Business & Personal Finance|Marketing & Sales
15028= Textbooks|Business & Personal Finance|Personal Finance
15029= Textbooks|Business & Personal Finance|Real Estate
15030= Textbooks|Business & Personal Finance|Reference
15031= Textbooks|Business & Personal Finance|Small Business & Entrepreneurship
15032= Textbooks|Children & Teens
15033= Textbooks|Children & Teens|Fiction
15034= Textbooks|Children & Teens|Nonfiction
15035= Textbooks|Comics & Graphic Novels
15036= Textbooks|Comics & Graphic Novels|Graphic Novels
15037= Textbooks|Comics & Graphic Novels|Manga
15038= Textbooks|Communications & Media
15039= Textbooks|Communications & Media|Broadcasting
15040= Textbooks|Communications & Media|Digital Media
15041= Textbooks|Communications & Media|Journalism
15042= Textbooks|Communications & Media|Photojournalism
15043= Textbooks|Communications & Media|Print
15044= Textbooks|Communications & Media|Speech
15045= Textbooks|Communications & Media|Writing
15046= Textbooks|Computers & Internet
15047= Textbooks|Computers & Internet|Computers
15048= Textbooks|Computers & Internet|Databases
15049= Textbooks|Computers & Internet|Digital Media
15050= Textbooks|Computers & Internet|Internet
15051= Textbooks|Computers & Internet|Network
15052= Textbooks|Computers & Internet|Operating Systems
15053= Textbooks|Computers & Internet|Programming
15054= Textbooks|Computers & Internet|Software
15055= Textbooks|Computers & Internet|System Administration
15056= Textbooks|Cookbooks, Food & Wine
15057= Textbooks|Cookbooks, Food & Wine|Beverages
15058= Textbooks|Cookbooks, Food & Wine|Courses & Dishes
15059= Textbooks|Cookbooks, Food & Wine|Culinary Arts
15060= Textbooks|Cookbooks, Food & Wine|Methods
15061= Textbooks|Cookbooks, Food & Wine|Reference
15062= Textbooks|Cookbooks, Food & Wine|Regional & Ethnic
15063= Textbooks|Cookbooks, Food & Wine|Special Diet
15064= Textbooks|Cookbooks, Food & Wine|Special Occasions
15065= Textbooks|Cookbooks, Food & Wine|Specific Ingredients
15066= Textbooks|Engineering
15067= Textbooks|Engineering|Aeronautics
15068= Textbooks|Engineering|Chemical & Petroleum Engineering
15069= Textbooks|Engineering|Civil Engineering
15070= Textbooks|Engineering|Computer Science
15071= Textbooks|Engineering|Electrical Engineering
15072= Textbooks|Engineering|Environmental Engineering
15073= Textbooks|Engineering|Mechanical Engineering
15074= Textbooks|Engineering|Power Resources
15075= Textbooks|Fiction & Literature
15076= Textbooks|Fiction & Literature|Latino
15077= Textbooks|Fiction & Literature|Action & Adventure
15078= Textbooks|Fiction & Literature|African American
15079= Textbooks|Fiction & Literature|Anthologies
15080= Textbooks|Fiction & Literature|Classics
15081= Textbooks|Fiction & Literature|Comparative Literature
15082= Textbooks|Fiction & Literature|Erotica
15083= Textbooks|Fiction & Literature|Gay
15084= Textbooks|Fiction & Literature|Ghost
15085= Textbooks|Fiction & Literature|Historical
15086= Textbooks|Fiction & Literature|Horror
15087= Textbooks|Fiction & Literature|Literary
15088= Textbooks|Fiction & Literature|Literary Criticism
15089= Textbooks|Fiction & Literature|Poetry
15090= Textbooks|Fiction & Literature|Religious
15091= Textbooks|Fiction & Literature|Short Stories
15092= Textbooks|Health, Mind & Body
15093= Textbooks|Health, Mind & Body|Fitness
15094= Textbooks|Health, Mind & Body|Self-Improvement
15095= Textbooks|History
15096= Textbooks|History|Africa
15097= Textbooks|History|Americas
15098= Textbooks|History|Americas|Canada
15099= Textbooks|History|Americas|Latin America
15100= Textbooks|History|Americas|United States
15101= Textbooks|History|Ancient
15102= Textbooks|History|Asia
15103= Textbooks|History|Australia & Oceania
15104= Textbooks|History|Europe
15105= Textbooks|History|Middle East
15106= Textbooks|History|Military
15107= Textbooks|History|World
15108= Textbooks|Humor
15109= Textbooks|Language Studies
15110= Textbooks|Language Studies|African Languages
15111= Textbooks|Language Studies|Ancient Languages
15112= Textbooks|Language Studies|Arabic
15113= Textbooks|Language Studies|Bilingual Editions
15114= Textbooks|Language Studies|Chinese
15115= Textbooks|Language Studies|English
15116= Textbooks|Language Studies|French
15117= Textbooks|Language Studies|German
15118= Textbooks|Language Studies|Hebrew
15119= Textbooks|Language Studies|Hindi
15120= Textbooks|Language Studies|Indigenous Languages
15121= Textbooks|Language Studies|Italian
15122= Textbooks|Language Studies|Japanese
15123= Textbooks|Language Studies|Korean
15124= Textbooks|Language Studies|Linguistics
15125= Textbooks|Language Studies|Other Language
15126= Textbooks|Language Studies|Portuguese
15127= Textbooks|Language Studies|Russian
15128= Textbooks|Language Studies|Spanish
15129= Textbooks|Language Studies|Speech Pathology
15130= Textbooks|Lifestyle & Home
15131= Textbooks|Lifestyle & Home|Antiques & Collectibles
15132= Textbooks|Lifestyle & Home|Crafts & Hobbies
15133= Textbooks|Lifestyle & Home|Gardening
15134= Textbooks|Lifestyle & Home|Pets
15135= Textbooks|Mathematics
15136= Textbooks|Mathematics|Advanced Mathematics
15137= Textbooks|Mathematics|Algebra
15138= Textbooks|Mathematics|Arithmetic
15139= Textbooks|Mathematics|Calculus
15140= Textbooks|Mathematics|Geometry
15141= Textbooks|Mathematics|Statistics
15142= Textbooks|Medicine
15143= Textbooks|Medicine|Anatomy & Physiology
15144= Textbooks|Medicine|Dentistry
15145= Textbooks|Medicine|Emergency Medicine
15146= Textbooks|Medicine|Genetics
15147= Textbooks|Medicine|Immunology
15148= Textbooks|Medicine|Neuroscience
15149= Textbooks|Medicine|Nursing
15150= Textbooks|Medicine|Pharmacology & Toxicology
15151= Textbooks|Medicine|Psychiatry
15152= Textbooks|Medicine|Psychology
15153= Textbooks|Medicine|Radiology
15154= Textbooks|Medicine|Veterinary
15155= Textbooks|Mysteries & Thrillers
15156= Textbooks|Mysteries & Thrillers|British Detectives
15157= Textbooks|Mysteries & Thrillers|Hard-Boiled
15158= Textbooks|Mysteries & Thrillers|Historical
15159= Textbooks|Mysteries & Thrillers|Police Procedural
15160= Textbooks|Mysteries & Thrillers|Short Stories
15161= Textbooks|Mysteries & Thrillers|Women Sleuths
15162= Textbooks|Nonfiction
15163= Textbooks|Nonfiction|Family & Relationships
15164= Textbooks|Nonfiction|Transportation
15165= Textbooks|Nonfiction|True Crime
15166= Textbooks|Parenting
15167= Textbooks|Philosophy
15168= Textbooks|Philosophy|Aesthetics
15169= Textbooks|Philosophy|Epistemology
15170= Textbooks|Philosophy|Ethics
15171= Textbooks|Philosophy|Philosophy of Language
15172= Textbooks|Philosophy|Logic
15173= Textbooks|Philosophy|Metaphysics
15174= Textbooks|Philosophy|Political Philosophy
15175= Textbooks|Philosophy|Philosophy of Religion
15176= Textbooks|Politics & Current Events
15177= Textbooks|Politics & Current Events|Current Events
15178= Textbooks|Politics & Current Events|Foreign Policy & International Relations
15179= Textbooks|Politics & Current Events|Local Governments
15180= Textbooks|Politics & Current Events|National Governments
15181= Textbooks|Politics & Current Events|Political Science
15182= Textbooks|Politics & Current Events|Public Administration
15183= Textbooks|Politics & Current Events|World Affairs
15184= Textbooks|Professional & Technical
15185= Textbooks|Professional & Technical|Design
15186= Textbooks|Professional & Technical|Language Arts & Disciplines
15187= Textbooks|Professional & Technical|Engineering
15188= Textbooks|Professional & Technical|Law
15189= Textbooks|Professional & Technical|Medical
15190= Textbooks|Reference
15191= Textbooks|Reference|Almanacs & Yearbooks
15192= Textbooks|Reference|Atlases & Maps
15193= Textbooks|Reference|Catalogs & Directories
15194= Textbooks|Reference|Consumer Guides
15195= Textbooks|Reference|Dictionaries & Thesauruses
15196= Textbooks|Reference|Encyclopedias
15197= Textbooks|Reference|Etiquette
15198= Textbooks|Reference|Quotations
15199= Textbooks|Reference|Study Aids
15200= Textbooks|Reference|Words & Language
15201= Textbooks|Reference|Writing
15202= Textbooks|Religion & Spirituality
15203= Textbooks|Religion & Spirituality|Bible Studies
15204= Textbooks|Religion & Spirituality|Bibles
15205= Textbooks|Religion & Spirituality|Buddhism
15206= Textbooks|Religion & Spirituality|Christianity
15207= Textbooks|Religion & Spirituality|Comparative Religion
15208= Textbooks|Religion & Spirituality|Hinduism
15209= Textbooks|Religion & Spirituality|Islam
15210= Textbooks|Religion & Spirituality|Judaism
15211= Textbooks|Religion & Spirituality|Spirituality
15212= Textbooks|Romance
15213= Textbooks|Romance|Contemporary
15214= Textbooks|Romance|Erotic Romance
15215= Textbooks|Romance|Paranormal
15216= Textbooks|Romance|Historical
15217= Textbooks|Romance|Short Stories
15218= Textbooks|Romance|Suspense
15219= Textbooks|Romance|Western
15220= Textbooks|Sci-Fi & Fantasy
15221= Textbooks|Sci-Fi & Fantasy|Fantasy
15222= Textbooks|Sci-Fi & Fantasy|Fantasy|Contemporary
15223= Textbooks|Sci-Fi & Fantasy|Fantasy|Epic
15224= Textbooks|Sci-Fi & Fantasy|Fantasy|Historical
15225= Textbooks|Sci-Fi & Fantasy|Fantasy|Paranormal
15226= Textbooks|Sci-Fi & Fantasy|Fantasy|Short Stories
15227= Textbooks|Sci-Fi & Fantasy|Science Fiction
15228= Textbooks|Sci-Fi & Fantasy|Science Fiction & Literature
15229= Textbooks|Sci-Fi & Fantasy|Science Fiction & Literature|Adventure
15230= Textbooks|Sci-Fi & Fantasy|Science Fiction & Literature|High Tech
15231= Textbooks|Sci-Fi & Fantasy|Science Fiction & Literature|Short Stories
15232= Textbooks|Science & Nature
15233= Textbooks|Science & Nature|Agriculture
15234= Textbooks|Science & Nature|Astronomy
15235= Textbooks|Science & Nature|Atmosphere
15236= Textbooks|Science & Nature|Biology
15237= Textbooks|Science & Nature|Chemistry
15238= Textbooks|Science & Nature|Earth Sciences
15239= Textbooks|Science & Nature|Ecology
15240= Textbooks|Science & Nature|Environment
15241= Textbooks|Science & Nature|Essays
15242= Textbooks|Science & Nature|Geography
15243= Textbooks|Science & Nature|Geology
15244= Textbooks|Science & Nature|History
15245= Textbooks|Science & Nature|Life Sciences
15246= Textbooks|Science & Nature|Nature
15247= Textbooks|Science & Nature|Physics
15248= Textbooks|Science & Nature|Reference
15249= Textbooks|Social Science
15250= Textbooks|Social Science|Anthropology
15251= Textbooks|Social Science|Archaeology
15252= Textbooks|Social Science|Civics
15253= Textbooks|Social Science|Government
15254= Textbooks|Social Science|Social Studies
15255= Textbooks|Social Science|Social Welfare
15256= Textbooks|Social Science|Society
15257= Textbooks|Social Science|Society|African Studies
15258= Textbooks|Social Science|Society|American Studies
15259= Textbooks|Social Science|Society|Asia Pacific Studies
15260= Textbooks|Social Science|Society|Cross-Cultural Studies
15261= Textbooks|Social Science|Society|European Studies
15262= Textbooks|Social Science|Society|Immigration & Emigration
15263= Textbooks|Social Science|Society|Indigenous Studies
15264= Textbooks|Social Science|Society|Latin & Caribbean Studies
15265= Textbooks|Social Science|Society|Middle Eastern Studies
15266= Textbooks|Social Science|Society|Race & Ethnicity Studies
15267= Textbooks|Social Science|Society|Sexuality Studies
15268= Textbooks|Social Science|Society|Women's Studies
15269= Textbooks|Social Science|Sociology
15270= Textbooks|Sports & Outdoors
15271= Textbooks|Sports & Outdoors|Baseball
15272= Textbooks|Sports & Outdoors|Basketball
15273= Textbooks|Sports & Outdoors|Coaching
15274= Textbooks|Sports & Outdoors|Equestrian
15275= Textbooks|Sports & Outdoors|Extreme Sports
15276= Textbooks|Sports & Outdoors|Football
15277= Textbooks|Sports & Outdoors|Golf
15278= Textbooks|Sports & Outdoors|Hockey
15279= Textbooks|Sports & Outdoors|Motor Sports
15280= Textbooks|Sports & Outdoors|Mountaineering
15281= Textbooks|Sports & Outdoors|Outdoors
15282= Textbooks|Sports & Outdoors|Racket Sports
15283= Textbooks|Sports & Outdoors|Reference
15284= Textbooks|Sports & Outdoors|Soccer
15285= Textbooks|Sports & Outdoors|Training
15286= Textbooks|Sports & Outdoors|Water Sports
15287= Textbooks|Sports & Outdoors|Winter Sports
15288= Textbooks|Teaching & Learning
15289= Textbooks|Teaching & Learning|Adult Education
15290= Textbooks|Teaching & Learning|Curriculum & Teaching
15291= Textbooks|Teaching & Learning|Educational Leadership
15292= Textbooks|Teaching & Learning|Educational Technology
15293= Textbooks|Teaching & Learning|Family & Childcare
15294= Textbooks|Teaching & Learning|Information & Library Science
15295= Textbooks|Teaching & Learning|Learning Resources
15296= Textbooks|Teaching & Learning|Psychology & Research
15297= Textbooks|Teaching & Learning|Special Education
15298= Textbooks|Travel & Adventure
15299= Textbooks|Travel & Adventure|Africa
15300= Textbooks|Travel & Adventure|Americas
15301= Textbooks|Travel & Adventure|Americas|Canada
15302= Textbooks|Travel & Adventure|Americas|Latin America
15303= Textbooks|Travel & Adventure|Americas|United States
15304= Textbooks|Travel & Adventure|Asia
15305= Textbooks|Travel & Adventure|Caribbean
15306= Textbooks|Travel & Adventure|Essays & Memoirs
15307= Textbooks|Travel & Adventure|Europe
15308= Textbooks|Travel & Adventure|Middle East
15309= Textbooks|Travel & Adventure|Oceania
15310= Textbooks|Travel & Adventure|Specialty Travel
15311= Textbooks|Comics & Graphic Novels|Comics
15312= Textbooks|Reference|Manuals
16001= App Store|Stickers|Emoji & Expressions
16003= App Store|Stickers|Animals & Nature
16005= App Store|Stickers|Art
16006= App Store|Stickers|Celebrations
16007= App Store|Stickers|Celebrities
16008= App Store|Stickers|Comics & Cartoons
16009= App Store|Stickers|Eating & Drinking
16010= App Store|Stickers|Gaming
16014= App Store|Stickers|Movies & TV
16015= App Store|Stickers|Music
16017= App Store|Stickers|People
16019= App Store|Stickers|Places & Objects
16021= App Store|Stickers|Sports & Activities
16025= App Store|Stickers|Kids & Family
16026= App Store|Stickers|Fashion
100000= Music|Christian & Gospel
100001= Music|Classical|Art Song
100002= Music|Classical|Brass & Woodwinds
100003= Music|Classical|Solo Instrumental
100004= Music|Classical|Contemporary Era
100005= Music|Classical|Oratorio
100006= Music|Classical|Cantata
100007= Music|Classical|Electronic
100008= Music|Classical|Sacred
100009= Music|Classical|Guitar
100010= Music|Classical|Piano
100011= Music|Classical|Violin
100012= Music|Classical|Cello
100013= Music|Classical|Percussion
100014= Music|Electronic|Dubstep
100015= Music|Electronic|Bass
100016= Music|Hip-Hop/Rap|UK Hip-Hop
100017= Music|Reggae|Lovers Rock
100018= Music|Alternative|EMO
100019= Music|Alternative|Pop Punk
100020= Music|Alternative|Indie Pop
100021= Music|New Age|Yoga
100022= Music|Pop|Tribute
100023= Music|Pop|Shows
100024= Music|Cuban
100025= Music|Cuban|Mambo
100026= Music|Cuban|Chachacha
100027= Music|Cuban|Guajira
100028= Music|Cuban|Son
100029= Music|Cuban|Bolero
100030= Music|Cuban|Guaracha
100031= Music|Cuban|Timba
100032= Music|Soundtrack|Video Game
100033= Music|Indian|Regional Indian|Punjabi|Punjabi Pop
100034= Music|Indian|Regional Indian|Bengali|Rabindra Sangeet
100035= Music|Indian|Regional Indian|Malayalam
100036= Music|Indian|Regional Indian|Kannada
100037= Music|Indian|Regional Indian|Marathi
100038= Music|Indian|Regional Indian|Gujarati
100039= Music|Indian|Regional Indian|Assamese
100040= Music|Indian|Regional Indian|Bhojpuri
100041= Music|Indian|Regional Indian|Haryanvi
100042= Music|Indian|Regional Indian|Odia
100043= Music|Indian|Regional Indian|Rajasthani
100044= Music|Indian|Regional Indian|Urdu
100045= Music|Indian|Regional Indian|Punjabi
100046= Music|Indian|Regional Indian|Bengali
100047= Music|Indian|Indian Classical|Carnatic Classical
100048= Music|Indian|Indian Classical|Hindustani Classical
100049= Music|African|Afro House
100050= Music|African|Afro Soul
100051= Music|African|Afrobeats
100052= Music|African|Benga
100053= Music|African|Bongo-Flava
100054= Music|African|Coupe-Decale
100055= Music|African|Gqom
100056= Music|African|Highlife
100057= Music|African|Kuduro
100058= Music|African|Kizomba
100059= Music|African|Kwaito
100060= Music|African|Mbalax
100061= Music|African|Ndombolo
100062= Music|African|Shangaan Electro
100063= Music|African|Soukous
100064= Music|African|Taarab
100065= Music|African|Zouglou
100066= Music|Turkish|Ozgun
100067= Music|Turkish|Fantezi
100068= Music|Turkish|Religious
100069= Music|Pop|Turkish Pop
100070= Music|Rock|Turkish Rock
100071= Music|Alternative|Turkish Alternative
100072= Music|Hip-Hop/Rap|Turkish Hip-Hop/Rap
100073= Music|African|Maskandi
100074= Music|Russian|Russian Romance
100075= Music|Russian|Russian Bard
100076= Music|Russian|Russian Pop
100077= Music|Russian|Russian Rock
100078= Music|Russian|Russian Hip-Hop
100079= Music|Arabic|Levant
100080= Music|Arabic|Levant|Dabke
100081= Music|Arabic|Maghreb Rai
100082= Music|Arabic|Khaleeji|Khaleeji Jalsat
100083= Music|Arabic|Khaleeji|Khaleeji Shailat
100084= Music|Tarab
100085= Music|Tarab|Iraqi Tarab
100086= Music|Tarab|Egyptian Tarab
100087= Music|Tarab|Khaleeji Tarab
100088= Music|Pop|Levant Pop
100089= Music|Pop|Iraqi Pop
100090= Music|Pop|Egyptian Pop
100091= Music|Pop|Maghreb Pop
100092= Music|Pop|Khaleeji Pop
100093= Music|Hip-Hop/Rap|Levant Hip-Hop
100094= Music|Hip-Hop/Rap|Egyptian Hip-Hop
100095= Music|Hip-Hop/Rap|Maghreb Hip-Hop
100096= Music|Hip-Hop/Rap|Khaleeji Hip-Hop
100097= Music|Alternative|Indie Levant
100098= Music|Alternative|Indie Egyptian
100099= Music|Alternative|Indie Maghreb
100100= Music|Electronic|Levant Electronic
100101= Music|Electronic|Electro-Cha'abi
100102= Music|Electronic|Maghreb Electronic
100103= Music|Folk|Iraqi Folk
100104= Music|Folk|Khaleeji Folk
100105= Music|Dance|Maghreb Dance
40000000= iTunes U
40000001= iTunes U|Business & Economics
40000002= iTunes U|Business & Economics|Economics
40000003= iTunes U|Business & Economics|Finance
40000004= iTunes U|Business & Economics|Hospitality
40000005= iTunes U|Business & Economics|Management
40000006= iTunes U|Business & Economics|Marketing
40000007= iTunes U|Business & Economics|Personal Finance
40000008= iTunes U|Business & Economics|Real Estate
40000009= iTunes U|Engineering
40000010= iTunes U|Engineering|Chemical & Petroleum Engineering
40000011= iTunes U|Engineering|Civil Engineering
40000012= iTunes U|Engineering|Computer Science
40000013= iTunes U|Engineering|Electrical Engineering
40000014= iTunes U|Engineering|Environmental Engineering
40000015= iTunes U|Engineering|Mechanical Engineering
40000016= iTunes U|Music, Art, & Design
40000017= iTunes U|Music, Art, & Design|Architecture
40000019= iTunes U|Music, Art, & Design|Art History
40000020= iTunes U|Music, Art, & Design|Dance
40000021= iTunes U|Music, Art, & Design|Film
40000022= iTunes U|Music, Art, & Design|Design
40000023= iTunes U|Music, Art, & Design|Interior Design
40000024= iTunes U|Music, Art, & Design|Music
40000025= iTunes U|Music, Art, & Design|Theater
40000026= iTunes U|Health & Medicine
40000027= iTunes U|Health & Medicine|Anatomy & Physiology
40000028= iTunes U|Health & Medicine|Behavioral Science
40000029= iTunes U|Health & Medicine|Dentistry
40000030= iTunes U|Health & Medicine|Diet & Nutrition
40000031= iTunes U|Health & Medicine|Emergency Medicine
40000032= iTunes U|Health & Medicine|Genetics
40000033= iTunes U|Health & Medicine|Gerontology
40000034= iTunes U|Health & Medicine|Health & Exercise Science
40000035= iTunes U|Health & Medicine|Immunology
40000036= iTunes U|Health & Medicine|Neuroscience
40000037= iTunes U|Health & Medicine|Pharmacology & Toxicology
40000038= iTunes U|Health & Medicine|Psychiatry
40000039= iTunes U|Health & Medicine|Global Health
40000040= iTunes U|Health & Medicine|Radiology
40000041= iTunes U|History
40000042= iTunes U|History|Ancient History
40000043= iTunes U|History|Medieval History
40000044= iTunes U|History|Military History
40000045= iTunes U|History|Modern History
40000046= iTunes U|History|African History
40000047= iTunes U|History|Asia-Pacific History
40000048= iTunes U|History|European History
40000049= iTunes U|History|Middle Eastern History
40000050= iTunes U|History|North American History
40000051= iTunes U|History|South American History
40000053= iTunes U|Communications & Journalism
40000054= iTunes U|Philosophy
40000055= iTunes U|Religion & Spirituality
40000056= iTunes U|Languages
40000057= iTunes U|Languages|African Languages
40000058= iTunes U|Languages|Ancient Languages
40000061= iTunes U|Languages|English
40000063= iTunes U|Languages|French
40000064= iTunes U|Languages|German
40000065= iTunes U|Languages|Italian
40000066= iTunes U|Languages|Linguistics
40000068= iTunes U|Languages|Spanish
40000069= iTunes U|Languages|Speech Pathology
40000070= iTunes U|Writing & Literature
40000071= iTunes U|Writing & Literature|Anthologies
40000072= iTunes U|Writing & Literature|Biography
40000073= iTunes U|Writing & Literature|Classics
40000074= iTunes U|Writing & Literature|Literary Criticism
40000075= iTunes U|Writing & Literature|Fiction
40000076= iTunes U|Writing & Literature|Poetry
40000077= iTunes U|Mathematics
40000078= iTunes U|Mathematics|Advanced Mathematics
40000079= iTunes U|Mathematics|Algebra
40000080= iTunes U|Mathematics|Arithmetic
40000081= iTunes U|Mathematics|Calculus
40000082= iTunes U|Mathematics|Geometry
40000083= iTunes U|Mathematics|Statistics
40000084= iTunes U|Science
40000085= iTunes U|Science|Agricultural
40000086= iTunes U|Science|Astronomy
40000087= iTunes U|Science|Atmosphere
40000088= iTunes U|Science|Biology
40000089= iTunes U|Science|Chemistry
40000090= iTunes U|Science|Ecology
40000091= iTunes U|Science|Geography
40000092= iTunes U|Science|Geology
40000093= iTunes U|Science|Physics
40000094= iTunes U|Social Science
40000095= iTunes U|Law & Politics|Law
40000096= iTunes U|Law & Politics|Political Science
40000097= iTunes U|Law & Politics|Public Administration
40000098= iTunes U|Social Science|Psychology
40000099= iTunes U|Social Science|Social Welfare
40000100= iTunes U|Social Science|Sociology
40000101= iTunes U|Society
40000103= iTunes U|Society|Asia Pacific Studies
40000104= iTunes U|Society|European Studies
40000105= iTunes U|Society|Indigenous Studies
40000106= iTunes U|Society|Latin & Caribbean Studies
40000107= iTunes U|Society|Middle Eastern Studies
40000108= iTunes U|Society|Women's Studies
40000109= iTunes U|Teaching & Learning
40000110= iTunes U|Teaching & Learning|Curriculum & Teaching
40000111= iTunes U|Teaching & Learning|Educational Leadership
40000112= iTunes U|Teaching & Learning|Family & Childcare
40000113= iTunes U|Teaching & Learning|Learning Resources
40000114= iTunes U|Teaching & Learning|Psychology & Research
40000115= iTunes U|Teaching & Learning|Special Education
40000116= iTunes U|Music, Art, & Design|Culinary Arts
40000117= iTunes U|Music, Art, & Design|Fashion
40000118= iTunes U|Music, Art, & Design|Media Arts
40000119= iTunes U|Music, Art, & Design|Photography
40000120= iTunes U|Music, Art, & Design|Visual Art
40000121= iTunes U|Business & Economics|Entrepreneurship
40000122= iTunes U|Communications & Journalism|Broadcasting
40000123= iTunes U|Communications & Journalism|Digital Media
40000124= iTunes U|Communications & Journalism|Journalism
40000125= iTunes U|Communications & Journalism|Photojournalism
40000126= iTunes U|Communications & Journalism|Print
40000127= iTunes U|Communications & Journalism|Speech
40000128= iTunes U|Communications & Journalism|Writing
40000129= iTunes U|Health & Medicine|Nursing
40000130= iTunes U|Languages|Arabic
40000131= iTunes U|Languages|Chinese
40000132= iTunes U|Languages|Hebrew
40000133= iTunes U|Languages|Hindi
40000134= iTunes U|Languages|Indigenous Languages
40000135= iTunes U|Languages|Japanese
40000136= iTunes U|Languages|Korean
40000137= iTunes U|Languages|Other Languages
40000138= iTunes U|Languages|Portuguese
40000139= iTunes U|Languages|Russian
40000140= iTunes U|Law & Politics
40000141= iTunes U|Law & Politics|Foreign Policy & International Relations
40000142= iTunes U|Law & Politics|Local Governments
40000143= iTunes U|Law & Politics|National Governments
40000144= iTunes U|Law & Politics|World Affairs
40000145= iTunes U|Writing & Literature|Comparative Literature
40000146= iTunes U|Philosophy|Aesthetics
40000147= iTunes U|Philosophy|Epistemology
40000148= iTunes U|Philosophy|Ethics
40000149= iTunes U|Philosophy|Metaphysics
40000150= iTunes U|Philosophy|Political Philosophy
40000151= iTunes U|Philosophy|Logic
40000152= iTunes U|Philosophy|Philosophy of Language
40000153= iTunes U|Philosophy|Philosophy of Religion
40000154= iTunes U|Social Science|Archaeology
40000155= iTunes U|Social Science|Anthropology
40000156= iTunes U|Religion & Spirituality|Buddhism
40000157= iTunes U|Religion & Spirituality|Christianity
40000158= iTunes U|Religion & Spirituality|Comparative Religion
40000159= iTunes U|Religion & Spirituality|Hinduism
40000160= iTunes U|Religion & Spirituality|Islam
40000161= iTunes U|Religion & Spirituality|Judaism
40000162= iTunes U|Religion & Spirituality|Other Religions
40000163= iTunes U|Religion & Spirituality|Spirituality
40000164= iTunes U|Science|Environment
40000165= iTunes U|Society|African Studies
40000166= iTunes U|Society|American Studies
40000167= iTunes U|Society|Cross-cultural Studies
40000168= iTunes U|Society|Immigration & Emigration
40000169= iTunes U|Society|Race & Ethnicity Studies
40000170= iTunes U|Society|Sexuality Studies
40000171= iTunes U|Teaching & Learning|Educational Technology
40000172= iTunes U|Teaching & Learning|Information/Library Science
40000173= iTunes U|Languages|Dutch
40000174= iTunes U|Languages|Luxembourgish
40000175= iTunes U|Languages|Swedish
40000176= iTunes U|Languages|Norwegian
40000177= iTunes U|Languages|Finnish
40000178= iTunes U|Languages|Danish
40000179= iTunes U|Languages|Polish
40000180= iTunes U|Languages|Turkish
40000181= iTunes U|Languages|Flemish
50000024= Audiobooks
50000040= Audiobooks|Fiction
50000041= Audiobooks|Arts & Entertainment
50000042= Audiobooks|Biographies & Memoirs
50000043= Audiobooks|Business & Personal Finance
50000044= Audiobooks|Kids & Young Adults
50000045= Audiobooks|Classics
50000046= Audiobooks|Comedy
50000047= Audiobooks|Drama & Poetry
50000048= Audiobooks|Speakers & Storytellers
50000049= Audiobooks|History
50000050= Audiobooks|Languages
50000051= Audiobooks|Mysteries & Thrillers
50000052= Audiobooks|Nonfiction
50000053= Audiobooks|Religion & Spirituality
50000054= Audiobooks|Science & Nature
50000055= Audiobooks|Sci Fi & Fantasy
50000056= Audiobooks|Self-Development
50000057= Audiobooks|Sports & Outdoors
50000058= Audiobooks|Technology
50000059= Audiobooks|Travel & Adventure
50000061= Music|Spoken Word
50000063= Music|Disney
50000064= Music|French Pop
50000066= Music|German Pop
50000068= Music|German Folk
50000069= Audiobooks|Romance
50000070= Audiobooks|Audiobooks Latino
50000071= Books|Comics & Graphic Novels|Manga|Action
50000072= Books|Comics & Graphic Novels|Manga|Comedy
50000073= Books|Comics & Graphic Novels|Manga|Erotica
50000074= Books|Comics & Graphic Novels|Manga|Fantasy
50000075= Books|Comics & Graphic Novels|Manga|Four Cell Manga
50000076= Books|Comics & Graphic Novels|Manga|Gay & Lesbian
50000077= Books|Comics & Graphic Novels|Manga|Hard-Boiled
50000078= Books|Comics & Graphic Novels|Manga|Heroes
50000079= Books|Comics & Graphic Novels|Manga|Historical Fiction
50000080= Books|Comics & Graphic Novels|Manga|Mecha
50000081= Books|Comics & Graphic Novels|Manga|Mystery
50000082= Books|Comics & Graphic Novels|Manga|Nonfiction
50000083= Books|Comics & Graphic Novels|Manga|Religious
50000084= Books|Comics & Graphic Novels|Manga|Romance
50000085= Books|Comics & Graphic Novels|Manga|Romantic Comedy
50000086= Books|Comics & Graphic Novels|Manga|Science Fiction
50000087= Books|Comics & Graphic Novels|Manga|Sports
50000088= Books|Fiction & Literature|Light Novels
50000089= Books|Comics & Graphic Novels|Manga|Horror
50000090= Books|Comics & Graphic Novels|Comics
50000091= Books|Romance|Multicultural
50000092= Audiobooks|Erotica
50000093= Audiobooks|Light Novels
+ +

QuickTime AppleStoreCountry Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueAppleStoreCountryValueAppleStoreCountry
143441= United States143523= Moldova
143442= France143524= Armenia
143443= Germany143525= Botswana
143444= United Kingdom143526= Bulgaria
143445= Austria143528= Jordan
143446= Belgium143529= Kenya
143447= Finland143530= Macedonia
143448= Greece143531= Madagascar
143449= Ireland143532= Mali
143450= Italy143533= Mauritius
143451= Luxembourg143534= Niger
143452= Netherlands143535= Senegal
143453= Portugal143536= Tunisia
143454= Spain143537= Uganda
143455= Canada143538= Anguilla
143456= Sweden143539= Bahamas
143457= Norway143540= Antigua and Barbuda
143458= Denmark143541= Barbados
143459= Switzerland143542= Bermuda
143460= Australia143543= British Virgin Islands
143461= New Zealand143544= Cayman Islands
143462= Japan143545= Dominica
143463= Hong Kong143546= Grenada
143464= Singapore143547= Montserrat
143465= China143548= St. Kitts and Nevis
143466= Republic of Korea143549= St. Lucia
143467= India143550= St. Vincent and The Grenadines
143468= Mexico143551= Trinidad and Tobago
143469= Russia143552= Turks and Caicos
143470= Taiwan143553= Guyana
143471= Vietnam143554= Suriname
143472= South Africa143555= Belize
143473= Malaysia143556= Bolivia
143474= Philippines143557= Cyprus
143475= Thailand143558= Iceland
143476= Indonesia143559= Bahrain
143477= Pakistan143560= Brunei Darussalam
143478= Poland143561= Nigeria
143479= Saudi Arabia143562= Oman
143480= Turkey143563= Algeria
143481= United Arab Emirates143564= Angola
143482= Hungary143565= Belarus
143483= Chile143566= Uzbekistan
143484= Nepal143568= Azerbaijan
143485= Panama143571= Yemen
143486= Sri Lanka143572= Tanzania
143487= Romania143573= Ghana
143489= Czech Republic143575= Albania
143491= Israel143576= Benin
143492= Ukraine143577= Bhutan
143493= Kuwait143578= Burkina Faso
143494= Croatia143579= Cambodia
143495= Costa Rica143580= Cape Verde
143496= Slovakia143581= Chad
143497= Lebanon143582= Republic of the Congo
143498= Qatar143583= Fiji
143499= Slovenia143584= Gambia
143501= Colombia143585= Guinea-Bissau
143502= Venezuela143586= Kyrgyzstan
143503= Brazil143587= Lao People's Democratic Republic
143504= Guatemala143588= Liberia
143505= Argentina143589= Malawi
143506= El Salvador143590= Mauritania
143507= Peru143591= Federated States of Micronesia
143508= Dominican Republic143592= Mongolia
143509= Ecuador143593= Mozambique
143510= Honduras143594= Namibia
143511= Jamaica143595= Palau
143512= Nicaragua143597= Papua New Guinea
143513= Paraguay143598= Sao Tome and Principe
143514= Uruguay143599= Seychelles
143515= Macau143600= Sierra Leone
143516= Egypt143601= Solomon Islands
143517= Kazakhstan143602= Swaziland
143518= Estonia143603= Tajikistan
143519= Latvia143604= Turkmenistan
143520= Lithuania143605= Zimbabwe
143521= Malta  
+ +

QuickTime iTunesInfo Tags

+

ExifTool will extract any iTunesInfo tags that exist, even if they are not +defined in this table. These tags belong to the family 1 "iTunes" group, +and are not currently writable.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ARTISTS'Artistsno 
'BARCODE'Barcodeno 
'CATALOGNUMBER'CatalogNumberno 
'DISCNUMBER'DiscNumberno 
'Dynamic Range (DR)'DynamicRangeno 
'Dynamic Range (R128)'DynamicRangeR128no 
'Encoding Params'EncodingParams---> QuickTime EncodingParams Tags
'LABEL'Labelno 
'MEDIA'Mediano 
'MOOD'Moodno 
'Peak Level (R128)'PeakLevelR128no 
'Peak Level (Sample)'PeakLevelSampleno 
'RATING'Ratingno 
'SCRIPT'Scriptno 
'TRACKNUMBER'TrackNumberno 
'Volume Level (R128)'VolumeLevelR128no 
'Volume Level (ReplayGain)'ReplayVolumeLevelno 
'iTunEXTC'ContentRatingno(standard | rating | score | reasons)
'iTunMOVI'iTunMOVI---> PLIST Tags
'iTunNORM'VolumeNormalizationno 
'iTunSMPB'iTunSMPBno 
'iTunes_CDDB_1'CDDB1Infono 
'iTunes_CDDB_TrackNumber'CDDBTrackNumberno 
'initialkey'InitialKeyno 
'originaldate'OriginalDateno 
'originalyear'OriginalYearno 
'popularimeter'Popularimeterno 
'replaygain_track_gain'ReplayTrackGainno 
'replaygain_track_peak'ReplayTrackPeakno 
'tool'iTunToolno 
'~length'Lengthno 
+ +

QuickTime EncodingParams Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'abrt'AudioAvailableBitRateRangeno 
'acbf'AudioBitRateControlModeno 
'acef'AudioExtendFrequenciesno 
'brat'AudioCurrentTargetBitRateno 
'cdcv'AudioComponentVersionno 
'cmnc'AudioAvailableNumberChannelsno 
'init'AudioIsInitializedno 
'lmrc'AudioDoesSampleRateConversionno 
'mdel'AudioMinimumDelayModeno 
'mnip'AudioMinimumNumberInputPacketsno 
'mnop'AudioMinimumNumberOutputPacketsno 
'oppr'AudioOutputPrecedenceno 
'pad0'AudioZeroFramesPaddedno 
'pakb'AudioMaximumPacketByteSizeno 
'pakd'AudioRequiresPacketDescriptionno 
'pakf'AudioPacketFrameSizeno 
'prmm'AudioCodecPrimeMethodno 
'srcq'AudioQualitySettingno 
'tbuf'AudioInputBufferSizeno 
'ubuf'AudioUsedInputBufferSizeno 
'ursr'AudioUseRecommendedSampleRateno 
'vbrq'AudioVBRQualityno 
'vers'AudioEncodingParamsVersionno 
'vpk?'AudioHasVariablePacketByteSizesno 
+ +

QuickTime ItemProp Tags

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ipco'ItemPropertyContainer---> QuickTime ItemPropCont Tags
'ipma'ItemPropertyAssociationno(parsed, but not extracted as a tag)
+ +

QuickTime ItemPropCont Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'auxC'AuxiliaryImageTypeno 
'av1C'AV1Configuration---> QuickTime AV1Config Tags
'clap'CleanApertureno(4 numbers: width, height, left and top)
'colr'ICC_Profile +
ColorRepresentation
-
no
--> ICC_Profile Tags
'hvcC'HEVCConfiguration---> QuickTime HEVCConfig Tags
'irot'Rotationint8u! 
'ispe'ImageSpatialExtentno 
'pasp'PixelAspectRatioint32u! 
'pixi'ImagePixelDepthno 
'rloc'RelativeLocationno 
+ +

QuickTime AV1Config Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0AV1ConfigurationVersionno[val & 0x7f]
1SeqProfile?no[val >> 5 & 0x7]
1.1SeqLevelIdx0?no[val & 0x1f]
2SeqTier0?no[val >> 7 & 0x1]
2.1HighBitDepth?no[val >> 6 & 0x1]
2.2TwelveBit?no[val >> 5 & 0x1]
2.3ChromaFormatno(bits: 0x04 = Monochrome, 0x02 = SubSamplingX, 0x01 = SubSamplingY) +
[val >> 2 & 0x7] +
0 = YUV 4:4:4 +
2 = YUV 4:2:2 +
3 = YUV 4:2:0 +
7 = Monochrome 4:0:0
2.4ChromaSamplePositionno[val & 0x3] +
0 = Unknown +
1 = Vertical +
2 = Colocated +
3 = (reserved)
3InitialDelaySamples?no 
+ +

QuickTime HEVCConfig Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0HEVCConfigurationVersionno 
1GeneralProfileSpaceno[val >> 6 & 0x3] +
0 = Conforming
1.1GeneralTierFlagno[val >> 5 & 0x1] +
0 = Main Tier +
1 = High Tier
1.2GeneralProfileIDCno[val & 0x1f] +
0 = No Profile +
1 = Main +
2 = Main 10 +
3 = Main Still Picture +
4 = Format Range Extensions +
5 = High Throughput +
6 = Multiview Main +
7 = Scalable Main +
8 = 3D Main +
9 = Screen Content Coding Extensions +
10 = Scalable Format Range Extensions +
11 = High Throughput Screen Content Coding Extensions
2GenProfileCompatibilityFlagsnoBit 20 = High Throughput Screen Content Coding Extensions +
Bit 21 = Scalable Format Range Extensions +
Bit 22 = Screen Content Coding Extensions +
Bit 23 = 3D Main +
Bit 24 = Scalable Main +
Bit 25 = Multiview Main +
Bit 26 = High Throughput +
Bit 27 = Format Range Extensions +
Bit 28 = Main Still Picture +
Bit 29 = Main 10 +
Bit 30 = Main +
Bit 31 = No Profile
6ConstraintIndicatorFlagsno 
12GeneralLevelIDCno 
13MinSpatialSegmentationIDCno[val & 0xfff]
15ParallelismTypeno[val & 0x3]
16ChromaFormatno[val & 0x3] +
0 = Monochrome +
1 = 4:2:0 +
2 = 4:2:2 +
3 = 4:4:4
17BitDepthLumano[val & 0x7]
18BitDepthChromano[val & 0x7]
19AverageFrameRateno 
21ConstantFrameRateno[val >> 6 & 0x3] +
0 = Unknown +
1 = Constant Frame Rate +
2 = Each Temporal Layer is Constant Frame Rate
21.1NumTemporalLayersno[val >> 3 & 0x7]
21.2TemporalIDNestedno[val >> 2 & 0x1] +
0 = No +
1 = Yes
+ +

QuickTime ItemRef Tags

+

The Item reference entries listed in the table below contain information about +the associations between items in the file. This information is used by +ExifTool, but these entries are not extracted as tags.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'auxl'AuxiliaryImageRefno 
'cdsc'ContentDescribesno 
'dimg'DerivedImageRefno 
'thmb'ThumbnailRefno 
+ +

QuickTime MovieFragment Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'meta'Meta---> QuickTime Meta Tags
'mfhd'MovieFragmentHeader---> QuickTime MovieFragHdr Tags
'traf'TrackFragment---> QuickTime TrackFragment Tags
+ +

QuickTime MovieFragHdr Tags

+
+
+ + + + + + + + +
Index4Tag NameWritableValues / Notes
1MovieFragmentSequenceno 
+ +

QuickTime TrackFragment Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'meta'Meta---> QuickTime Meta Tags
+ +

QuickTime Movie Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'cmov'CompressedMovie---> QuickTime CMovie Tags
'gps 'GPSDataList?no 
'htka'HTCTrack---> QuickTime Track Tags
'iods'InitialObjectDescriptor?no 
'meco'OtherMeta---> QuickTime OtherMeta Tags
'meta'Meta---> QuickTime Meta Tags
'mvhd'MovieHeader---> QuickTime MovieHeader Tags
'trak'Track---> QuickTime Track Tags
'udta'UserData---> QuickTime UserData Tags
'uuid'UUID-USMT +
UUID-Canon +
UUID-Unknown?
-
-
no
--> QuickTime UserMedia Tags +
--> Canon uuid Tags
+ +

QuickTime CMovie Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'dcom'Compressionno 
+ +

QuickTime Track Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'mdia'Media---> QuickTime Media Tags
'meco'OtherMeta---> QuickTime OtherMeta Tags
'meta'Meta---> QuickTime Meta Tags
'tapt'TrackAperture---> QuickTime TrackAperture Tags
'tkhd'TrackHeader---> QuickTime TrackHeader Tags
'tref'TrackRef---> QuickTime TrackRef Tags
'udta'UserData---> QuickTime UserData Tags
'uuid'UUID-USMT +
SphericalVideoXML +
UUID-Unknown?
-
-
no
--> QuickTime UserMedia Tags +
--> XMP Tags
+ +

QuickTime Media Tags

+

MP4 media box.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'hdlr'Handler---> QuickTime Handler Tags
'mdhd'MediaHeader---> QuickTime MediaHeader Tags
'minf'MediaInfo---> QuickTime MediaInfo Tags
+ +

QuickTime MediaHeader Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0MediaHeaderVersionno 
1MediaCreateDateint32u(converted from UTC to local time if the QuickTimeUTC option is set)
2MediaModifyDateint32u(converted from UTC to local time if the QuickTimeUTC option is set)
3MediaTimeScaleno 
4MediaDurationno 
5MediaLanguageCodeno 
+ +

QuickTime MediaInfo Tags

+

MP4 media info box.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'dinf'DataInfo---> QuickTime DataInfo Tags
'gmhd'GenMediaHeader---> QuickTime GenMediaHeader Tags
'hdlr'Handler---> QuickTime Handler Tags
'hmhd'HintHeader---> QuickTime HintHeader Tags
'nmhd'NullMediaHeader?no 
'smhd'AudioHeader---> QuickTime AudioHeader Tags
'stbl'SampleTable---> QuickTime SampleTable Tags
'vmhd'VideoHeader---> QuickTime VideoHeader Tags
+ +

QuickTime GenMediaHeader Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'gmin'GenMediaInfo---> QuickTime GenMediaInfo Tags
'text'Text?no 
'tmcd'TimeCode---> QuickTime TimeCode Tags
+ +

QuickTime GenMediaInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0GenMediaVersionno 
1GenFlagsno 
4GenGraphicsModeno--> QuickTime GraphicsMode Values
6GenOpColorno 
12GenBalanceno 
+ +

QuickTime GraphicsMode Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueGraphicsModeValueGraphicsModeValueGraphicsMode
0x0= srcCopy0xb= patBic0x26= subOver
0x1= srcOr0xc= notPatCopy0x27= addMin
0x2= srcXor0xd= notPatOr0x31= grayishTextOr
0x3= srcBic0xe= notPatXor0x32= hilite
0x4= notSrcCopy0xf= notPatBic0x40= ditherCopy
0x5= notSrcOr0x20= blend0x100= Alpha
0x6= notSrcXor0x21= addPin0x101= White Alpha
0x7= notSrcBic0x22= addOver0x102= Pre-multiplied Black Alpha
0x8= patCopy0x23= subPin0x110= Component Alpha
0x9= patOr0x24= transparent  
0xa= patXor0x25= addMax  
+ +

QuickTime TimeCode Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'tcmi'TCMediaInfo---> QuickTime TCMediaInfo Tags
+ +

QuickTime TCMediaInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4TextFontno0 = System
6TextFaceno + +
0x0 = Plain +
Bit 0 = Bold +
Bit 1 = Italic +
Bit 2 = Underline
  Bit 3 = Outline +
Bit 4 = Shadow +
Bit 5 = Condense +
Bit 6 = Extend
+
8TextSizeno 
12TextColorno 
18BackgroundColorno 
24FontNameno 
+ +

QuickTime HintHeader Tags

+

MP4 hint media header.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
2MaxPDUSizeno 
3AvgPDUSizeno 
4MaxBitrateno 
6AvgBitrateno 
+ +

QuickTime AudioHeader Tags

+

MP4 audio media header.

+
+
+ + + + + + + + +
Index2Tag NameWritableValues / Notes
2Balanceno 
+ +

QuickTime SampleTable Tags

+

MP4 sample table box.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'co64'ChunkOffset64?no 
'cslg'CompositionToDecodeTimelineMapping?no 
'ctts'CompositionTimeToSample?no 
'padb'SamplePaddingBits?no 
'sbgp'SampleToGroup?no 
'sdtp'IdependentAndDisposableSamples?no 
'sgpd'SampleGroupDescription?no 
'stco'ChunkOffset?no 
'stdp'SampleDegradationPriority?no 
'stps'PartialSyncSamplesno 
'stsc'SampleToChunk?no 
'stsd'AudioSampleDesc +
VideoSampleDesc +
HintSampleDesc +
MetaSampleDesc +
OtherSampleDesc
-
-
-
-
-
--> QuickTime AudioSampleDesc Tags +
--> QuickTime ImageDesc Tags +
--> QuickTime HintSampleDesc Tags +
--> QuickTime MetaSampleDesc Tags +
--> QuickTime OtherSampleDesc Tags
'stsh'ShadowSyncSampleTable?no 
'stss'SyncSampleTable?no 
'stsz'SampleSizes?no 
'stts'VideoFrameRate +
TimeToSampleTable?
no
no
(average rate calculated from time-to-sample table for video media)
'stz2'CompactSampleSizes?no 
'subs'Sub-sampleInformation?no 
+ +

QuickTime AudioSampleDesc Tags

+

MP4 audio sample description. This hybrid atom contains both data and child +atoms.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID/IndexTag NameWritableValues / Notes
4AudioFormatno 
20AudioVendorIDno--> QuickTime VendorID Values
24AudioChannelsno 
26AudioBitsPerSampleno 
32AudioSampleRateno 
'chan'AudioChannelLayout---> QuickTime ChannelLayout Tags
'damr'DecodeConfig---> QuickTime DecodeConfig Tags
'pinf'PurchaseInfo---> QuickTime ProtectionInfo Tags
'sinf'ProtectionInfo---> QuickTime ProtectionInfo Tags
'wave'Wave---> QuickTime Wave Tags
+ +

QuickTime ChannelLayout Tags

+

Audio channel layout.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4LayoutFlagsno + +
0 = UseDescriptions +
1 = UseBitmap +
100 = Mono +
101 = Stereo +
102 = StereoHeadphones +
103 = MatrixStereo +
104 = MidSide +
105 = XY +
106 = Binaural +
107 = Ambisonic_B_Format +
108 = Quadraphonic +
109 = Pentagonal +
110 = Hexagonal +
111 = Octagonal +
112 = Cube +
113 = MPEG_3_0_A +
114 = MPEG_3_0_B +
115 = MPEG_4_0_A +
116 = MPEG_4_0_B +
117 = MPEG_5_0_A +
118 = MPEG_5_0_B +
119 = MPEG_5_0_C +
120 = MPEG_5_0_D +
121 = MPEG_5_1_A +
122 = MPEG_5_1_B +
123 = MPEG_5_1_C +
124 = MPEG_5_1_D +
125 = MPEG_6_1_A +
126 = MPEG_7_1_A +
127 = MPEG_7_1_B +
128 = MPEG_7_1_C +
129 = Emagic_Default_7_1 +
130 = SMPTE_DTV +
131 = ITU_2_1 +
132 = ITU_2_2 +
133 = DVD_4 +
134 = DVD_5 +
135 = DVD_6 +
136 = DVD_10 +
137 = DVD_11 +
138 = DVD_18 +
139 = AudioUnit_6_0 +
140 = AudioUnit_7_0 +
141 = AAC_6_0
  142 = AAC_6_1 +
143 = AAC_7_0 +
144 = AAC_Octagonal +
145 = TMH_10_2_std +
146 = TMH_10_2_full +
147 = DiscreteInOrder +
148 = AudioUnit_7_0_Front +
149 = AC3_1_0_1 +
150 = AC3_3_0 +
151 = AC3_3_1 +
152 = AC3_3_0_1 +
153 = AC3_2_1_1 +
154 = AC3_3_1_1 +
155 = EAC_6_0_A +
156 = EAC_7_0_A +
157 = EAC3_6_1_A +
158 = EAC3_6_1_B +
159 = EAC3_6_1_C +
160 = EAC3_7_1_A +
161 = EAC3_7_1_B +
162 = EAC3_7_1_C +
163 = EAC3_7_1_D +
164 = EAC3_7_1_E +
165 = EAC3_7_1_F +
166 = EAC3_7_1_G +
167 = EAC3_7_1_H +
168 = DTS_3_1 +
169 = DTS_4_1 +
170 = DTS_6_0_A +
171 = DTS_6_0_B +
172 = DTS_6_0_C +
173 = DTS_6_1_A +
174 = DTS_6_1_B +
175 = DTS_6_1_C +
176 = DTS_7_0 +
177 = DTS_7_1 +
178 = DTS_8_0_A +
179 = DTS_8_0_B +
180 = DTS_8_1_A +
181 = DTS_8_1_B +
182 = DTS_6_1_D +
183 = AAC_7_1_B +
65535 = Unknown
+
6AudioChannelsno 
8AudioChannelTypesno +
Bit 0 = Left +
Bit 1 = Right +
Bit 2 = Center +
Bit 3 = LFEScreen +
Bit 4 = LeftSurround +
Bit 5 = RightSurround +
Bit 6 = LeftCenter +
Bit 7 = RightCenter +
Bit 8 = CenterSurround +
Bit 9 = LeftSurroundDirect +
Bit 10 = RightSurroundDirect +
Bit 11 = TopCenterSurround +
Bit 12 = VerticalHeightLeft +
Bit 13 = VerticalHeightCenter +
Bit 14 = VerticalHeightRight +
Bit 15 = TopBackLeft +
Bit 16 = TopBackCenter +
Bit 17 = TopBackRight
+
12NumChannelDescriptionsno 
16Channel1Labelno--> QuickTime ChannelLabel Values
20Channel1FlagsnoBit 0 = Rectangular +
Bit 1 = Spherical +
Bit 2 = Meters
24Channel1Coordinatesno(3 numbers: for rectangular coordinates left/right, back/front, down/up; for +spherical coordinates left/right degrees, down/up degrees, distance)
36Channel2Labelno--> QuickTime ChannelLabel Values
40Channel2FlagsnoBit 0 = Rectangular +
Bit 1 = Spherical +
Bit 2 = Meters
44Channel2Coordinatesno 
56Channel3Labelno--> QuickTime ChannelLabel Values
60Channel3FlagsnoBit 0 = Rectangular +
Bit 1 = Spherical +
Bit 2 = Meters
64Channel3Coordinatesno 
76Channel4Labelno--> QuickTime ChannelLabel Values
80Channel4FlagsnoBit 0 = Rectangular +
Bit 1 = Spherical +
Bit 2 = Meters
84Channel4Coordinatesno 
96Channel5Labelno--> QuickTime ChannelLabel Values
100Channel5FlagsnoBit 0 = Rectangular +
Bit 1 = Spherical +
Bit 2 = Meters
104Channel5Coordinatesno 
116Channel6Labelno--> QuickTime ChannelLabel Values
120Channel6FlagsnoBit 0 = Rectangular +
Bit 1 = Spherical +
Bit 2 = Meters
124Channel6Coordinatesno 
136Channel7Labelno--> QuickTime ChannelLabel Values
140Channel7FlagsnoBit 0 = Rectangular +
Bit 1 = Spherical +
Bit 2 = Meters
144Channel7Coordinatesno 
156Channel8Labelno--> QuickTime ChannelLabel Values
160Channel8FlagsnoBit 0 = Rectangular +
Bit 1 = Spherical +
Bit 2 = Meters
164Channel8Coordinatesno 
+ +

QuickTime ChannelLabel Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueChannelLabelValueChannelLabelValueChannelLabel
0= Unused36= RightWide305= ForeignLanguage
1= Left37= LFE2400= Discrete
2= Right38= LeftTotal65536= Discrete_0
3= Center39= RightTotal65537= Discrete_1
4= LFEScreen40= HearingImpaired65538= Discrete_2
5= LeftSurround41= Narration65539= Discrete_3
6= RightSurround42= Mono65540= Discrete_4
7= LeftCenter43= DialogCentricMix65541= Discrete_5
8= RightCenter44= CenterSurroundDirect65542= Discrete_6
9= CenterSurround45= Haptic65543= Discrete_7
10= LeftSurroundDirect100= UseCoordinates65544= Discrete_8
11= RightSurroundDirect200= Ambisonic_W65545= Discrete_9
12= TopCenterSurround201= Ambisonic_X65546= Discrete_10
13= VerticalHeightLeft202= Ambisonic_Y65547= Discrete_11
14= VerticalHeightCenter203= Ambisonic_Z65548= Discrete_12
15= VerticalHeightRight204= MS_Mid65549= Discrete_13
16= TopBackLeft205= MS_Side65550= Discrete_14
17= TopBackCenter206= XY_X65551= Discrete_15
18= TopBackRight207= XY_Y131071= Discrete_65535
33= RearSurroundLeft301= HeadphonesLeft4294967295= Unknown
34= RearSurroundRight302= HeadphonesRight  
35= LeftWide304= ClickTrack  
+ +

QuickTime DecodeConfig Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0EncoderVendorno 
4EncoderVersionno 
+ +

QuickTime ProtectionInfo Tags

+

Child atoms found in "sinf" and/or "pinf" atoms.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'enda'Endiannessno0 = Big-endian (Motorola, MM) +
1 = Little-endian (Intel, II)
'frma'OriginalFormatno 
'schi'SchemeInfo---> QuickTime SchemeInfo Tags
'schm'SchemeType---> QuickTime SchemeType Tags
+ +

QuickTime SchemeInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'cert'Certificateno 
'iviv'InitializationVectorno 
'key 'KeyIDno 
'name'UserNameno 
'righ'Rights---> QuickTime Rights Tags
'user'UserIDno 
+ +

QuickTime Rights Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'aver'VersionRestrictionsno 
'medi'MediaFlagsno 
'mode'ModeFlagsno 
'plat'Platformno 
'song'ItemIDno 
'tool'ItemToolno 
'tran'TransactionIDno 
'veID'ItemVendorIDno 
+ +

QuickTime SchemeType Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4SchemeTypeno 
8SchemeVersionno 
10SchemeURLno 
+ +

QuickTime Wave Tags

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'enda'Endiannessno0 = Big-endian (Motorola, MM) +
1 = Little-endian (Intel, II)
'frma'PurchaseFileFormatno 
+ +

QuickTime ImageDesc Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID/IndexTag NameWritableValues / Notes
2CompressorIDno 
10VendorIDno--> QuickTime VendorID Values
16SourceImageWidthno 
17SourceImageHeightno 
18XResolutionno 
20YResolutionno 
25CompressorNameno 
41BitDepthno 
'CDI1'CDI1---> Canon CDI1 Tags
'CMP1'CMP1---> Canon CMP1 Tags
'JPEG'JPEGInfo?no 
'avcC'AVCConfiguration?no 
'btrt'BitrateInfo---> QuickTime Bitrate Tags
'clap'CleanAperture---> QuickTime CleanAperture Tags
'colr'ColorRepresentationno 
'fiel'VideoFieldOrderno[Value 0] +
1 = Progressive +
2 = 2:1 Interlaced
'gama'Gammano 
'pasp'PixelAspectRationo 
'st3d'Stereoscopic3Dno0 = Monoscopic +
1 = Stereoscopic Top-Bottom +
2 = Stereoscopic Left-Right +
3 = Stereoscopic Stereo-Custom
'sv3d'SphericalVideo---> QuickTime sv3d Tags
+ +

QuickTime Bitrate Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0BufferSizeno 
1MaxBitrateno 
2AverageBitrateno 
+ +

QuickTime CleanAperture Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index8Tag NameWritableValues / Notes
0CleanApertureWidthno 
1CleanApertureHeightno 
2CleanApertureOffsetXno 
3CleanApertureOffsetYno 
+ +

QuickTime sv3d Tags

+

Tags defined by the Spherical Video V2 specification. See +https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md +for the specification.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'proj'Projection---> QuickTime proj Tags
'svhd'MetadataSourceno 
+ +

QuickTime proj Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'cbmp'CubemapProj---> QuickTime cbmp Tags
'equi'EquirectangularProj---> QuickTime equi Tags
'prhd'ProjectionHeader---> QuickTime prhd Tags
+ +

QuickTime cbmp Tags

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1Layoutno 
2Paddingno 
+ +

QuickTime equi Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1ProjectionBoundsTopno 
2ProjectionBoundsBottomno 
3ProjectionBoundsLeftno 
4ProjectionBoundsRightno 
+ +

QuickTime prhd Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1PoseYawDegreesno 
2PosePitchDegreesno 
3PoseRollDegreesno 
+ +

QuickTime HintSampleDesc Tags

+

MP4 hint sample description.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID/IndexTag NameWritableValues / Notes
4HintFormatno 
16HintTrackVersionno 
20MaxPacketSizeno 
'snro'SequenceNumberRandomOffsetno 
'tims'RTPTimeScaleno 
'tsro'TimestampRandomOffsetno 
+ +

QuickTime MetaSampleDesc Tags

+

MP4 metadata sample description.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0004MetaFormatno 
0x0008MetaTypeno 
'btrt'BitrateInfo---> QuickTime Bitrate Tags
'keys'Keys---> QuickTime Keys Tags
+ +

QuickTime OtherSampleDesc Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0004OtherFormatno 
'ftab'FontTableno 
'name'OtherNameno 
+ +

QuickTime VideoHeader Tags

+

MP4 video media header.

+
+
+ + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
2GraphicsModeno--> QuickTime GraphicsMode Values
3OpColorno 
+ +

QuickTime TrackAperture Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'clef'CleanApertureDimensionsno 
'enof'EncodedPixelsDimensionsno 
'prof'ProductionApertureDimensionsno 
+ +

QuickTime TrackHeader Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0TrackHeaderVersionno 
1TrackCreateDateint32u(converted from UTC to local time if the QuickTimeUTC option is set)
2TrackModifyDateint32u(converted from UTC to local time if the QuickTimeUTC option is set)
3TrackIDno 
5TrackDurationno 
8TrackLayerno 
9TrackVolumeno 
10MatrixStructurefixed32s[9]!(writable for the video track via the Composite Rotation tag)
19ImageWidthno 
20ImageHeightno 
+ +

QuickTime TrackRef Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'cdsc'ContentDescribesno 
'chap'ChapterListTrackIDno 
'mpod'ElementaryStreamTrackno 
'tmcd'TimeCodeno 
+ +

QuickTime UserData Tags

+

Tag ID's beginning with the copyright symbol (hex 0xa9) are multi-language +text. Alternate language tags are accessed by adding a dash followed by a +3-character ISO 639-2 language code to the tag name. ExifTool will extract +any multi-language user data tags found, even if they aren't in this table. +Note when creating new tags, +ItemList tags are +preferred over these, so to create the tag when a same-named ItemList tag +exists, either "UserData" must be specified (eg. -UserData:Artist=Monet +on the command line), or the PREFERRED level must be changed via +the config file.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'@day'ContentCreateDatestring/(some stupid Ricoh programmer used the '@' symbol instead of the copyright +symbol in these tag ID's for the Ricoh Theta Z1 and maybe other models)
'@mak'Makestring/ 
'@mod'Modelstring/ 
'@sec'SamsungSec---> Samsung sec Tags
'@swr'SoftwareVersionstring/ 
'@xyz'GPSCoordinatesstring/ 
'AllF'PlayAllFramesint8u 
'CAME'SerialNumberHashstring 
'CNCV'CompressorVersionstring 
'CNFV'FirmwareVersionstring 
'CNMN'Modelstring/ 
'CNOP'CanonCNOP---> Canon CNOP Tags
'CNTH'CanonCNTH---> Canon CNTH Tags
'DcMD'KodakDcMD---> Kodak DcMD Tags
'FFMV'FujiFilmFFMV---> FujiFilm FFMV Tags
'FIRM'FirmwareVersionstring/ 
"FOV\0"FieldOfViewstring 
'GPMF'GoProGPMF---> GoPro GPMF Tags
'GoPr'GoProTypestring 
'INFO'SamsungINFO---> Samsung INFO Tags
'LEIC'LeicaLEIC---> Panasonic PANA Tags
'LENS'LensSerialNumberstring 
'LOOP'LoopStyleint32u1 = Normal +
2 = Palindromic
'Lvlm'LevelMeter?rational64s 
'MMA0'MinoltaMMA0---> Minolta MMA Tags
'MMA1'MinoltaMMA1---> Minolta MMA Tags
'MVTG'FujiFilmMVTG---> EXIF Tags
'NCDT'NikonNCDT---> Nikon NCDT Tags
'PANA'PanasonicPANA---> Panasonic PANA Tags
'PENT'PentaxPENT---> Pentax PENT Tags
'PXMN'MakerNotePentax5b +
MakerNotePentax5c +
MakerNotePentaxUnknown
-
-
string
--> Pentax Tags +
--> Pentax Tags
'PXTH'PentaxPreview---> Pentax PXTH Tags
'QVMI'CasioQVMI---> EXIF Tags
'RMKN'RicohRMKN---> EXIF Tags
'RTHU'PreviewImageno 
'SDLN'PlayModestring 
'SNum'SerialNumberstring/ 
'SelO'PlaySelectionint8u 
'TAGS'FujiFilmTags +
KodakTags +
KonicaMinoltaTags +
MinoltaTags +
NikonTags +
OlympusTags1 +
OlympusTags2 +
OlympusTags3 +
OlympusTags4 +
PentaxTags +
SamsungTags +
SanyoMOV +
SanyoMP4 +
UnknownTags?
-
-
-
-
-
-
-
-
-
-
-
-
-
string
--> FujiFilm MOV Tags +
--> Kodak MOV Tags +
--> Minolta MOV1 Tags +
--> Minolta MOV2 Tags +
--> Nikon MOV Tags +
--> Olympus MOV1 Tags +
--> Olympus MOV2 Tags +
--> Olympus MP4 Tags +
--> Olympus MOV3 Tags +
--> Pentax MOV Tags +
--> Samsung MP4 Tags +
--> Sanyo MOV Tags +
--> Sanyo MP4 Tags
'TTMD'TomTomMetaData---> QuickTime TomTom Tags
'WLOC'WindowLocationint16u 
'XMP_'XMP---> XMP Tags
'Xtra'MicrosoftXtra---> Microsoft Xtra Tags
'_cx_'CX?rational64s 
'_cy_'CY?rational64s 
'_yaw'Yawrational64s/ 
'albm'Albumstring/(used in 3gp videos)
'albr'AlbumArtiststring 
'angl'CameraAnglestring 
'apmd'ApertureModeundef 
'auth'Authorstring/(used in 3gp videos)
'ccid'ContentIDstring 
'cdis'ContentDistributorIDstring 
'chpl'ChapterListno 
'clfn'ClipFileNamestring 
'clid'ClipIDstring 
'clsf'Classificationundef/(string in the form "Entity=XXXX Index=### XXXXX", used in 3gp videos)
'cmid'CameraIDstring 
'cmnm'Modelstring/ 
'coll'CollectionNamestring/(used in 3gp videos)
'cprt'Copyrightstring/(used in 3gp videos)
'cver'CodeVersionstring 
'cvru'CoverURIstring 
'date'DateTimeOriginalstring(Apple Photos has been reported to show a crazy date/time for some MP4 files +containing this tag, but perhaps only if it is missing a time zone)
'dscp'Descriptionstring/(used in 3gp videos)
'gnre'Genrestring/(used in 3gp videos)
'hinf'HintTrackInfo---> QuickTime HintTrackInfo Tags
'hinv'HintVersionstring 
'hnti'HintInfo---> QuickTime HintInfo Tags
'htcb'HTCBinary---> QuickTime HTCBinary Tags
'icnu'IconURIstring 
'infu'InfoURLstring 
'kgtt'TrackTypestring 
'kywd'Keywordsno(not writable because Apple doesn't follow the 3gp specification)
'loci'LocationInformationundef/(string in the form "XXXXX Role=XXX Lat=XXX Lon=XXX Alt=XXX Body=XXX +Notes=XXX", used in 3gp videos)
'lrcu'LyricsURIstring 
'lvlm'LevelMeter?rational64s 
'manu'Makeno 
'mcvr'PreviewImagestring 
'meta'Meta---> QuickTime Meta Tags
'modl'Modelno 
'name'Namestring 
'perf'Performerstring/(used in 3gp videos)
'pmcc'GarminSettingsstring 
'pose'pose---> Kodak pose Tags
'ptch'Pitchrational64s/ 
'ptv 'PrintToVideo---> QuickTime Video Tags
'rads'Rads?rational64s 
'reel'ReelNamestring 
'roll'Rollrational64s/ 
'rtng'Ratingundef/(string in the form "Entity=XXXX Criteria=XXXX XXXXX", used in 3gp videos)
'scen'Scenestring 
'scrn'OlympusPreview---> Olympus scrn Tags
'shot'ShotNamestring 
'slno'SerialNumberstring 
'smta'SamsungSmta---> Samsung smta Tags
'tags'Audible_tags---> Audible tags Tags
'thmb'MakerNotePentax5a +
OlympusThumbnail +
ThumbnailImage +
ThumbnailPNG +
UnknownThumbnail
-
-
string
string
string
--> Pentax Tags +
--> Olympus thmb Tags
'titl'Titlestring/(used in 3gp videos)
'urat'UserRatingundef/(used in 3gp videos)
'uuid'GarminSoftware +
UUID-Unknown?
string
no
 
'vndr'Vendorstring 
'vrot'AccelerometerDatano(accelerometer readings for each frame of the video, expressed as sets of +yaw, pitch and roll angles in degrees)
'yrrc'Yearundef/(used in 3gp videos)
"©ART"Artiststring 
"©TIM"StartTimecodestring 
"©TSC"StartTimeScalestring 
"©TSZ"StartTimeSampleSizestring 
"©alb"Albumstring 
"©arg"Arrangerstring 
"©ark"ArrangerKeywordsstring 
"©cmt"Commentstring 
"©cok"ComposerKeywordsstring 
"©com"Composerstring 
"©cpy"Copyrightstring 
"©day"ContentCreateDatestring 
"©dir"Directorstring 
"©ed1"Edit1string 
"©ed2"Edit2string 
"©ed3"Edit3string 
"©ed4"Edit4string 
"©ed5"Edit5string 
"©ed6"Edit6string 
"©ed7"Edit7string 
"©ed8"Edit8string 
"©ed9"Edit9string 
"©enc"EncoderIDstring 
"©fmt"Formatstring 
"©fpt"Pitchstring 
"©frl"Rollstring 
"©fyw"Yawstring 
"©gen"Genrestring 
"©gpt"CameraPitchstring 
"©grl"CameraRollstring 
"©grp"Groupingstring 
"©gyw"CameraYawstring 
"©inf"Informationstring 
"©isr"ISRCCodestring 
"©lab"RecordLabelNamestring 
"©lal"RecordLabelURLstring 
"©lyr"Lyricsstring 
"©mak"Makestring 
"©mal"MakerURLstring 
"©mdl"Modelstring/(non-standard-format DJI tag)
"©mod"Modelstring 
"©nam"Titlestring 
"©pdk"ProducerKeywordsstring 
"©phg"RecordingCopyrightstring 
"©prd"Producerstring 
"©prf"Performersstring 
"©prk"PerformerKeywordsstring 
"©prl"PerformerURLstring 
"©req"Requirementsstring 
"©snk"SubtitleKeywordsstring 
"©snm"Subtitlestring 
"©src"SourceCreditsstring 
"©swf"SongWriterstring 
"©swk"SongWriterKeywordsstring 
"©swr"SoftwareVersionstring 
"©too"Encoderstring 
"©trk"Trackstring 
"©wrt"Composerstring/ 
"©xsp"SpeedXstring 
"©xyz"GPSCoordinatesstring 
"©ysp"SpeedYstring 
"©zsp"SpeedZstring 
+ +

QuickTime TomTom Tags

+

Tags found in TomTom Bandit Action Cam MP4 videos.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'TTAD'TomTomAD---> QuickTime Stream Tags
'TTHL'TomTomHL?no 
'TTID'TomTomIDno 
'TTVD'TomTomVDno 
'TTVI'TomTomVI?no 
+ +

QuickTime HintTrackInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'dimm'ImmediateDataBytesno 
'dmax'LargestPacketDurationno 
'dmed'MediaTrackBytesno 
'drep'RepeatedDataBytesno 
'maxr'MaxDataRateno 
'npck'NumPacketsno 
'nump'NumPacketsno 
'payt'PayloadTypeno 
'pmax'LargestPacketSizeno 
'tmax'MaxTransmissionTimeno 
'tmin'MinTransmissionTimeno 
'totl'TotalBytesno 
'tpaY'TotalBytesNoRTPHeadersno 
'tpay'TotalBytesNoRTPHeadersno 
'tpyl'TotalBytesNoRTPHeadersno 
'trpY'TotalBytesno 
'trpy'TotalBytesno 
+ +

QuickTime HintInfo Tags

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'rtp 'RealtimeStreamingProtocolno 
'sdp 'StreamingDataProtocolno 
+ +

QuickTime HTCBinary Tags

+
+
+ + + + +
Index4Tag NameWritableValues / Notes
[no tags known]
+ +

QuickTime Video Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0DisplaySizeno0 = Normal +
1 = Double Size +
2 = Half Size +
3 = Full Screen +
4 = Current Size
6SlideShowno0 = No +
1 = Yes
+ +

QuickTime UserMedia Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'MTDT'MetaData---> QuickTime MetaData Tags
+ +

QuickTime MetaData Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001Titleno 
0x0003ProductionDateno 
0x0004Softwareno 
0x0005Productno 
0x000aTrackPropertyno[Value 0] +
0x0 = No presentation +
Bit 0 = Main track +
[Value 1] +
0x0 = No attributes +
Bit 15 = Read only
0x000bTimeZoneno 
0x000cModifyDateno 
+ +

QuickTime MovieHeader Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0MovieHeaderVersionno 
1CreateDateint32u(converted from UTC to local time if the QuickTimeUTC option is set)
2ModifyDateint32u(converted from UTC to local time if the QuickTimeUTC option is set)
3TimeScaleno 
4Durationno 
5PreferredRateno 
6PreferredVolumeno 
9MatrixStructureno 
18PreviewTimeno 
19PreviewDurationno 
20PosterTimeno 
21SelectionTimeno 
22SelectionDurationno 
23CurrentTimeno 
24NextTrackIDno 
+ +

QuickTime Preview Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0PreviewDateint32u(converted from UTC to local time if the QuickTimeUTC option is set)
2PreviewVersionno 
3PreviewAtomTypeno 
5PreviewAtomIndexno 
+ +

QuickTime Profile Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'APRF'AudioProfile---> QuickTime AudioProf Tags
'FPRF'FileGlobalProfile---> QuickTime FileProf Tags
'OLYM'OlympusOLYM---> Olympus OLYM Tags
'VPRF'VideoProfile---> QuickTime VideoProf Tags
+ +

QuickTime AudioProf Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0AudioProfileVersion?no 
1AudioTrackIDno 
2AudioCodecno 
3AudioCodecInfo?no 
4AudioAttributesnoBit 0 = Encrypted +
Bit 1 = Variable bitrate +
Bit 2 = Dual mono
5AudioAvgBitrateno 
6AudioMaxBitrateno 
7AudioSampleRateno 
8AudioChannelsno 
+ +

QuickTime FileProf Tags

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0FileProfileVersion?no 
1FileFunctionFlagsnoBit 28 = Fragmented +
Bit 29 = Additional tracks +
Bit 30 = Edited
+ +

QuickTime VideoProf Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0VideoProfileVersion?no 
1VideoTrackIDno 
2VideoCodecno 
3VideoCodecInfo?no 
4VideoAttributesnoBit 0 = Encrypted +
Bit 1 = Variable bitrate +
Bit 2 = Variable frame rate +
Bit 3 = Interlaced
5VideoAvgBitrateno 
6VideoMaxBitrateno 
7VideoAvgFrameRateno 
8VideoMaxFrameRateno 
9VideoSizeno 
10PixelAspectRationo 
+ +

QuickTime Flip Tags

+

Found in MP4 files from Flip Video cameras.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1PreviewImageWidthno 
2PreviewImageHeightno 
13PreviewImageLengthno 
14SerialNumberno 
28PreviewImageno 
+ +

QuickTime Tags360Fly Tags

+

Timed metadata found in MP4 videos from the 360Fly.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001Accel360Fly---> QuickTime Accel360Fly Tags
0x0002Gyro360Fly---> QuickTime Gyro360Fly Tags
0x0003Mag360Fly---> QuickTime Mag360Fly Tags
0x0005GPS360Fly---> QuickTime GPS360Fly Tags
0x0006Rot360Fly---> QuickTime Rot360Fly Tags
0x00faFusion360Fly---> QuickTime Fusion360Fly Tags
+ +

QuickTime Accel360Fly Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1AccelMode?no 
2SampleTimeno 
10AccelYPRno 
+ +

QuickTime Gyro360Fly Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1GyroMode?no 
2SampleTimeno 
10GyroYPRno 
+ +

QuickTime Mag360Fly Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1MagMode?no 
2SampleTimeno 
10MagnetometerXYZno 
+ +

QuickTime GPS360Fly Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1GPSMode?no 
2SampleTimeno 
10GPSLatitudeno 
14GPSLongitudeno 
18GPSAltitudeno 
22GPSSpeedno(converted to km/hr)
24GPSTrackno 
26Accelerationno 
+ +

QuickTime Rot360Fly Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1RotMode?no 
2SampleTimeno 
10RotationXYZno 
+ +

QuickTime Fusion360Fly Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1FusionMode?no 
2SampleTimeno 
10FusionYPRno 
+ +

QuickTime ImageFile Tags

+

Tags used in QTIF QuickTime Image Files.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'idat'ImageDatano 
'idsc'ImageDescription---> QuickTime ImageDesc Tags
'iicc'ICC_Profile---> ICC_Profile Tags
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 21, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/RIFF.html b/html/TagNames/RIFF.html new file mode 100644 index 0000000..dac8cd8 --- /dev/null +++ b/html/TagNames/RIFF.html @@ -0,0 +1,1663 @@ + + + + +RIFF Tags + + + +

RIFF Tags

+

The RIFF container format is used various types of fines including AVI, WAV, +WEBP, LA, OFR, PAC and WV. According to the EXIF specification, Meta +information is embedded in two types of RIFF LIST chunks: INFO and +exif, and information about the audio content is stored in the fmt +chunk. As well as this information, some video information and proprietary +manufacturer-specific information is also extracted.

+ +

Large AVI videos may be a concatenation of two or more RIFF chunks. For +these files, information is extracted from subsequent RIFF chunks as +sub-documents, but the Duration is calculated for the full video.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ALPH'ALPH---> RIFF ALPH Tags
'ANIM'ANIM---> RIFF ANIM Tags
'ANMF'ANMF---> RIFF ANMF Tags
'CSET'CharacterSet---> RIFF CSET Tags
'EXIF'EXIF +
UnknownEXIF
-
no
(WebP files) +
--> EXIF Tags +
--> EXIF Tags
'ICCP'ICC_Profile---> ICC_Profile Tags +
(WebP files)
'IDIT'DateTimeOriginalno 
'JUNK'OlympusJunk +
CasioJunk +
RicohJunk +
PentaxJunk +
PentaxJunk2 +
LucasJunk +
TextJunk
-
-
-
-
-
-
no
--> Olympus AVI Tags +
--> EXIF Tags +
--> Ricoh AVI Tags +
--> Pentax Junk Tags +
--> Pentax Junk2 Tags +
--> QuickTime Stream Tags
'JUNQ'OldXMPno 
'LIST_INF0'Info---> RIFF Info Tags
'LIST_INFO'Info---> RIFF Info Tags
'LIST_Tdat'Tdat---> RIFF Tdat Tags
'LIST_adtl'AssociatedDataList---> RIFF Tags
'LIST_exif'Exif---> RIFF Exif Tags
'LIST_hdrl'Hdrl---> RIFF Hdrl Tags
'LIST_hydt'PentaxData---> Pentax AVI Tags
'LIST_ncdt'NikonData---> Nikon AVI Tags
'LIST_pntx'PentaxData2---> Pentax AVI Tags
'SGLT'BikeBroAccel---> QuickTime Stream Tags
'SLLT'BikeBroGPS---> QuickTime Stream Tags
'VP8 'VP8Bitstream---> RIFF VP8 Tags
'VP8L'VP8L---> RIFF VP8L Tags
'VP8X'VP8X---> RIFF VP8X Tags
'XMP 'XMP---> XMP Tags +
(WebP files)
'_PMX'XMP---> XMP Tags +
(AVI and WAV files)
'aXML'AXML---> XMP XML Tags
'afsp'Afspno 
'bext'BroadcastExtension---> RIFF BroadcastExt Tags
'cue 'CuePointsno(config_files/cutepointlist.config from full distribution will decode this +and generate a list of cue points with labels)
'ds64'DataSize64---> RIFF DS64 Tags
'fact'NumberOfSamplesno 
'fmt 'AudioFormat---> RIFF AudioFormat Tags
'gps0'GPSTrack---> QuickTime Stream Tags
'gsen'GSensor---> QuickTime Stream Tags
'iXML'IXML---> XMP XML Tags
'id3 'ID3---> ID3 Tags
'inst'Instrument---> RIFF Instrument Tags
'labl'CuePointLabelno 
'list'ListTypeno 
'ltxt'LabeledTextno(CuePointID Length Purpose Country Language Dialect Codepage Text)
'note'CuePointNoteno 
'olym'Olym---> Olympus WAV Tags
'plst'Playlistno 
'smpl'Sampler---> RIFF Sampler Tags
'tx_USER'UserText---> RIFF UserText Tags
'tx_Unknown'Textno(streamed text, extracted when the ExtractEmbedded option is used)
+ +

RIFF ALPH Tags

+

WebP alpha chunk.

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0AlphaPreprocessingno[val & 0x3] +
0 = none +
1 = Level Reduction
0.1AlphaFilteringno[val & 0x3] +
0 = none +
1 = Horizontal +
2 = Vertical +
3 = Gradient
0.2AlphaCompressionno[val & 0x3] +
0 = none +
1 = Lossless
+ +

RIFF ANIM Tags

+

WebP animation chunk.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0BackgroundColorno 
4AnimationLoopCountno 
+ +

RIFF ANMF Tags

+

WebP animation frame chunk.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
12Durationno(extracted as the sum of durations of all animation frames)
+ +

RIFF CSET Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0CodePageno 
1CountryCodeno 
2LanguageCodeno 
3Dialectno 
+ +

RIFF Info Tags

+

RIFF INFO tags found in AVI video and WAV audio files. Tags which are part +of the EXIF 2.3 specification have an underlined Tag Name in the HTML +version of this documentation. Other tags are found in AVI files generated +by some software.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'AGES'Ratedno 
'CMNT'Commentno 
'CODE'EncodedByno 
'COMM'Commentsno 
'DIRC'Directoryno 
'DISP'SoundSchemeTitleno 
'DTIM'DateTimeOriginalno 
'GENR'Genreno 
'IARL'ArchivalLocationno 
'IART'Artistno 
'IAS1'FirstLanguageno 
'IAS2'SecondLanguageno 
'IAS3'ThirdLanguageno 
'IAS4'FourthLanguageno 
'IAS5'FifthLanguageno 
'IAS6'SixthLanguageno 
'IAS7'SeventhLanguageno 
'IAS8'EighthLanguageno 
'IAS9'NinthLanguageno 
'IBSU'BaseURLno 
'ICAS'DefaultAudioStreamno 
'ICDS'CostumeDesignerno 
'ICMS'Commissionedno 
'ICMT'Commentno 
'ICNM'Cinematographerno 
'ICNT'Countryno 
'ICOP'Copyrightno 
'ICRD'DateCreatedno 
'ICRP'Croppedno 
'IDIM'Dimensionsno 
'IDIT'DateTimeOriginalno 
'IDPI'DotsPerInchno 
'IDST'DistributedByno 
'IEDT'EditedByno 
'IENC'EncodedByno 
'IENG'Engineerno 
'IGNR'Genreno 
'IKEY'Keywordsno 
'ILGT'Lightnessno 
'ILGU'LogoURLno 
'ILIU'LogoIconURLno 
'ILNG'Languageno 
'IMBI'MoreInfoBannerImageno 
'IMBU'MoreInfoBannerURLno 
'IMED'Mediumno 
'IMIT'MoreInfoTextno 
'IMIU'MoreInfoURLno 
'IMUS'MusicByno 
'INAM'Titleno 
'IPDS'ProductionDesignerno 
'IPLT'NumColorsno 
'IPRD'Productno 
'IPRO'ProducedByno 
'IRIP'RippedByno 
'IRTD'Ratingno 
'ISBJ'Subjectno 
'ISFT'Softwareno 
'ISGN'SecondaryGenreno 
'ISHP'Sharpnessno 
'ISMP'TimeCodeno 
'ISRC'Sourceno 
'ISRF'SourceFormno 
'ISTD'ProductionStudiono 
'ISTR'Starringno 
'ITCH'Technicianno 
'ITRK'TrackNumberno 
'IWMU'WatermarkURLno 
'IWRI'WrittenByno 
'LANG'Languageno 
'LOCA'Locationno 
'PRT1'Partno 
'PRT2'NumberOfPartsno 
'RATE'Rateno 
'STAR'Starringno 
'STAT'Statisticsno[Value 3] +
0 = Bad +
1 = OK
'TAPE'TapeNameno 
'TCDO'EndTimecodeno 
'TCOD'StartTimecodeno 
'TITL'Titleno 
'TLEN'Lengthno 
'TORG'Organizationno 
'TRCK'TrackNumberno 
'TURL'URLno 
'TVER'Versionno 
'VMAJ'VegasVersionMajorno 
'VMIN'VegasVersionMinorno 
'YEAR'Yearno 
+ +

RIFF Tdat Tags

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

RIFF Exif Tags

+

These tags are part of the EXIF 2.3 specification for WAV audio files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ecor'Makeno 
'emdl'Modelno 
'emnt'MakerNotesno 
'erel'RelatedImageFileno 
'etim'TimeCreatedno 
'eucm'UserCommentno 
'ever'ExifVersionno 
+ +

RIFF Hdrl Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'IDIT'DateTimeOriginalno 
'ISMP'TimeCodeno 
'LIST_odml'OpenDML---> RIFF OpenDML Tags
'LIST_strl'Stream---> RIFF Stream Tags
'avih'AVIHeader---> RIFF AVIHeader Tags
+ +

RIFF OpenDML Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'dmlh'ExtendedAVIHeader---> RIFF ExtAVIHdr Tags
+ +

RIFF ExtAVIHdr Tags

+
+
+ + + + + + + + +
Index4Tag NameWritableValues / Notes
0TotalFrameCountno 
+ +

RIFF Stream Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'strd'StreamData---> RIFF StreamData Tags
'strf'AudioFormat +
VideoFormat
-
-
--> RIFF AudioFormat Tags +
--> BMP Tags
'strh'StreamHeader---> RIFF StreamHeader Tags
'strn'StreamNameno 
+ +

RIFF StreamData Tags

+

This chunk is used to store proprietary information in AVI videos from some +cameras. The first 4 characters of the data are used as the Tag ID below.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'AVIF'AVIF---> EXIF Tags
'CASI'CasioData---> Casio AVI Tags
'Zora'VendorNameno 
'unknown'UnknownDatano 
+ +

RIFF AudioFormat Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0Encodingno--> RIFF AudioEncoding Values
1NumChannelsno 
2SampleRateno 
4AvgBytesPerSecno 
7BitsPerSampleno 
+ +

RIFF AudioEncoding Values

+

These "TwoCC" audio encoding codes are used in RIFF and ASF files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueAudioEncoding
0x1= Microsoft PCM
0x2= Microsoft ADPCM
0x3= Microsoft IEEE float
0x4= Compaq VSELP
0x5= IBM CVSD
0x6= Microsoft a-Law
0x7= Microsoft u-Law
0x8= Microsoft DTS
0x9= DRM
0xa= WMA 9 Speech
0xb= Microsoft Windows Media RT Voice
0x10= OKI-ADPCM
0x11= Intel IMA/DVI-ADPCM
0x12= Videologic Mediaspace ADPCM
0x13= Sierra ADPCM
0x14= Antex G.723 ADPCM
0x15= DSP Solutions DIGISTD
0x16= DSP Solutions DIGIFIX
0x17= Dialoic OKI ADPCM
0x18= Media Vision ADPCM
0x19= HP CU
0x1a= HP Dynamic Voice
0x20= Yamaha ADPCM
0x21= SONARC Speech Compression
0x22= DSP Group True Speech
0x23= Echo Speech Corp.
0x24= Virtual Music Audiofile AF36
0x25= Audio Processing Tech.
0x26= Virtual Music Audiofile AF10
0x27= Aculab Prosody 1612
0x28= Merging Tech. LRC
0x30= Dolby AC2
0x31= Microsoft GSM610
0x32= MSN Audio
0x33= Antex ADPCME
0x34= Control Resources VQLPC
0x35= DSP Solutions DIGIREAL
0x36= DSP Solutions DIGIADPCM
0x37= Control Resources CR10
0x38= Natural MicroSystems VBX ADPCM
0x39= Crystal Semiconductor IMA ADPCM
0x3a= Echo Speech ECHOSC3
0x3b= Rockwell ADPCM
0x3c= Rockwell DIGITALK
0x3d= Xebec Multimedia
0x40= Antex G.721 ADPCM
0x41= Antex G.728 CELP
0x42= Microsoft MSG723
0x43= IBM AVC ADPCM
0x45= ITU-T G.726
0x50= Microsoft MPEG
0x51= RT23 or PAC
0x52= InSoft RT24
0x53= InSoft PAC
0x55= MP3
0x59= Cirrus
0x60= Cirrus Logic
0x61= ESS Tech. PCM
0x62= Voxware Inc.
0x63= Canopus ATRAC
0x64= APICOM G.726 ADPCM
0x65= APICOM G.722 ADPCM
0x66= Microsoft DSAT
0x67= Microsoft DSAT DISPLAY
0x69= Voxware Byte Aligned
0x70= Voxware AC8
0x71= Voxware AC10
0x72= Voxware AC16
0x73= Voxware AC20
0x74= Voxware MetaVoice
0x75= Voxware MetaSound
0x76= Voxware RT29HW
0x77= Voxware VR12
0x78= Voxware VR18
0x79= Voxware TQ40
0x7a= Voxware SC3
0x7b= Voxware SC3
0x80= Soundsoft
0x81= Voxware TQ60
0x82= Microsoft MSRT24
0x83= AT&T G.729A
0x84= Motion Pixels MVI MV12
0x85= DataFusion G.726
0x86= DataFusion GSM610
0x88= Iterated Systems Audio
0x89= Onlive
0x8a= Multitude, Inc. FT SX20
0x8b= Infocom ITS A/S G.721 ADPCM
0x8c= Convedia G729
0x8d= Not specified congruency, Inc.
0x91= Siemens SBC24
0x92= Sonic Foundry Dolby AC3 APDIF
0x93= MediaSonic G.723
0x94= Aculab Prosody 8kbps
0x97= ZyXEL ADPCM
0x98= Philips LPCBB
0x99= Studer Professional Audio Packed
0xa0= Malden PhonyTalk
0xa1= Racal Recorder GSM
0xa2= Racal Recorder G720.a
0xa3= Racal G723.1
0xa4= Racal Tetra ACELP
0xb0= NEC AAC NEC Corporation
0xff= AAC
0x100= Rhetorex ADPCM
0x101= IBM u-Law
0x102= IBM a-Law
0x103= IBM ADPCM
0x111= Vivo G.723
0x112= Vivo Siren
0x120= Philips Speech Processing CELP
0x121= Philips Speech Processing GRUNDIG
0x123= Digital G.723
0x125= Sanyo LD ADPCM
0x130= Sipro Lab ACEPLNET
0x131= Sipro Lab ACELP4800
0x132= Sipro Lab ACELP8V3
0x133= Sipro Lab G.729
0x134= Sipro Lab G.729A
0x135= Sipro Lab Kelvin
0x136= VoiceAge AMR
0x140= Dictaphone G.726 ADPCM
0x150= Qualcomm PureVoice
0x151= Qualcomm HalfRate
0x155= Ring Zero Systems TUBGSM
0x160= Microsoft Audio1
0x161= Windows Media Audio V2 V7 V8 V9 / DivX audio (WMA) / Alex AC3 Audio
0x162= Windows Media Audio Professional V9
0x163= Windows Media Audio Lossless V9
0x164= WMA Pro over S/PDIF
0x170= UNISYS NAP ADPCM
0x171= UNISYS NAP ULAW
0x172= UNISYS NAP ALAW
0x173= UNISYS NAP 16K
0x174= MM SYCOM ACM SYC008 SyCom Technologies
0x175= MM SYCOM ACM SYC701 G726L SyCom Technologies
0x176= MM SYCOM ACM SYC701 CELP54 SyCom Technologies
0x177= MM SYCOM ACM SYC701 CELP68 SyCom Technologies
0x178= Knowledge Adventure ADPCM
0x180= Fraunhofer IIS MPEG2AAC
0x190= Digital Theater Systems DTS DS
0x200= Creative Labs ADPCM
0x202= Creative Labs FASTSPEECH8
0x203= Creative Labs FASTSPEECH10
0x210= UHER ADPCM
0x215= Ulead DV ACM
0x216= Ulead DV ACM
0x220= Quarterdeck Corp.
0x230= I-Link VC
0x240= Aureal Semiconductor Raw Sport
0x241= ESST AC3
0x250= Interactive Products HSX
0x251= Interactive Products RPELP
0x260= Consistent CS2
0x270= Sony SCX
0x271= Sony SCY
0x272= Sony ATRAC3
0x273= Sony SPC
0x280= TELUM Telum Inc.
0x281= TELUMIA Telum Inc.
0x285= Norcom Voice Systems ADPCM
0x300= Fujitsu FM TOWNS SND
0x301= Fujitsu (not specified)
0x302= Fujitsu (not specified)
0x303= Fujitsu (not specified)
0x304= Fujitsu (not specified)
0x305= Fujitsu (not specified)
0x306= Fujitsu (not specified)
0x307= Fujitsu (not specified)
0x308= Fujitsu (not specified)
0x350= Micronas Semiconductors, Inc. Development
0x351= Micronas Semiconductors, Inc. CELP833
0x400= Brooktree Digital
0x401= Intel Music Coder (IMC)
0x402= Ligos Indeo Audio
0x450= QDesign Music
0x500= On2 VP7 On2 Technologies
0x501= On2 VP6 On2 Technologies
0x680= AT&T VME VMPCM
0x681= AT&T TCP
0x700= YMPEG Alpha (dummy for MPEG-2 compressor)
0x8ae= ClearJump LiteWave (lossless)
0x1000= Olivetti GSM
0x1001= Olivetti ADPCM
0x1002= Olivetti CELP
0x1003= Olivetti SBC
0x1004= Olivetti OPR
0x1100= Lernout & Hauspie
0x1101= Lernout & Hauspie CELP codec
0x1102= Lernout & Hauspie SBC codec
0x1103= Lernout & Hauspie SBC codec
0x1104= Lernout & Hauspie SBC codec
0x1400= Norris Comm. Inc.
0x1401= ISIAudio
0x1500= AT&T Soundspace Music Compression
0x181c= VoxWare RT24 speech codec
0x181e= Lucent elemedia AX24000P Music codec
0x1971= Sonic Foundry LOSSLESS
0x1979= Innings Telecom Inc. ADPCM
0x1c07= Lucent SX8300P speech codec
0x1c0c= Lucent SX5363S G.723 compliant codec
0x1f03= CUseeMe DigiTalk (ex-Rocwell)
0x1fc4= NCT Soft ALF2CD ACM
0x2000= FAST Multimedia DVM
0x2001= Dolby DTS (Digital Theater System)
0x2002= RealAudio 1 / 2 14.4
0x2003= RealAudio 1 / 2 28.8
0x2004= RealAudio G2 / 8 Cook (low bitrate)
0x2005= RealAudio 3 / 4 / 5 Music (DNET)
0x2006= RealAudio 10 AAC (RAAC)
0x2007= RealAudio 10 AAC+ (RACP)
0x2500= Reserved range to 0x2600 Microsoft
0x3313= makeAVIS (ffvfw fake AVI sound from AviSynth scripts)
0x4143= Divio MPEG-4 AAC audio
0x4201= Nokia adaptive multirate
0x4243= Divio G726 Divio, Inc.
0x434c= LEAD Speech
0x564c= LEAD Vorbis
0x5756= WavPack Audio
0x674f= Ogg Vorbis (mode 1)
0x6750= Ogg Vorbis (mode 2)
0x6751= Ogg Vorbis (mode 3)
0x676f= Ogg Vorbis (mode 1+)
0x6770= Ogg Vorbis (mode 2+)
0x6771= Ogg Vorbis (mode 3+)
0x7000= 3COM NBX 3Com Corporation
0x706d= FAAD AAC
0x7a21= GSM-AMR (CBR, no SID)
0x7a22= GSM-AMR (VBR, including SID)
0xa100= Comverse Infosys Ltd. G723 1
0xa101= Comverse Infosys Ltd. AVQSBC
0xa102= Comverse Infosys Ltd. OLDSBC
0xa103= Symbol Technologies G729A
0xa104= VoiceAge AMR WB VoiceAge Corporation
0xa105= Ingenient Technologies Inc. G726
0xa106= ISO/MPEG-4 advanced audio Coding
0xa107= Encore Software Ltd G726
0xa109= Speex ACM Codec xiph.org
0xdfac= DebugMode SonicFoundry Vegas FrameServer ACM Codec
0xe708= Unknown -
0xf1ac= Free Lossless Audio Codec FLAC
0xfffe= Extensible
0xffff= Development
+ +

RIFF StreamHeader Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0StreamTypeno'auds' = Audio +
'iavs' = Interleaved Audio+Video +
'mids' = MIDI +
'txts' = Text +
'vids' = Video
1AudioCodec +
VideoCodec +
Codec
no
no
no
 
5AudioSampleRate +
VideoFrameRate +
StreamSampleRate
no
no
no
 
8AudioSampleCount +
VideoFrameCount +
StreamSampleCount
no
no
no
 
10Qualityno 
11SampleSizeno 
+ +

RIFF AVIHeader Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0FrameRateno 
1MaxDataRateno 
4FrameCountno 
6StreamCountno 
8ImageWidthno 
9ImageHeightno 
+ +

RIFF VP8 Tags

+

This chunk is found in simple-format (lossy) WebP files. See +https://developers.google.com/speed/webp/docs/riff_container for the WebP +container specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0VP8Versionno[val >> 1 & 0x7] +
0 = 0 (bicubic reconstruction, normal loop) +
1 = 1 (bilinear reconstruction, simple loop) +
2 = 2 (bilinear reconstruction, no loop) +
3 = 3 (no reconstruction, no loop)
6ImageWidthno[val & 0x3fff]
6.1HorizontalScaleno[val >> 14 & 0x3]
8ImageHeightno[val & 0x3fff]
8.1VerticalScaleno[val >> 14 & 0x3]
+ +

RIFF VP8L Tags

+

This chunk is found in lossless WebP files.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1ImageWidthno 
2ImageHeightno 
+ +

RIFF VP8X Tags

+

This chunk is found in extended WebP files.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4ImageWidthno 
6ImageHeightno 
+ +

RIFF BroadcastExt Tags

+

Information found in the Broadcast Audio Extension chunk (see +http://tech.ebu.ch/docs/tech/tech3285.pdf).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Descriptionno 
256Originatorno 
288OriginatorReferenceno 
320DateTimeOriginalno 
338TimeReferenceno(first sample count since midnight)
346BWFVersionno 
348BWF_UMIDno 
602CodingHistoryno 
+ +

RIFF DS64 Tags

+

64-bit data sizes for MBWF/RF64 files. See +https://tech.ebu.ch/docs/tech/tech3306-2009.pdf for the specification.

+
+
+ + + + + + + + + + + + + + + + + + +
Index8Tag NameWritableValues / Notes
0RIFFSize64no 
1DataSize64no 
2NumberOfSamples64no 
+ +

RIFF Instrument Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0UnshiftedNoteno 
1FineTuneno 
2Gainno 
3LowNoteno 
4HighNoteno 
5LowVelocityno 
6HighVelocityno 
+ +

RIFF Sampler Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0Manufacturerno 
1Productno 
2SamplePeriodno 
3MIDIUnityNoteno 
4MIDIPitchFractionno 
5SMPTEFormatno0 = none +
24 = 24 fps +
25 = 25 fps +
29 = 29 fps +
30 = 30 fps
6SMPTEOffsetno(HH:MM:SS:FF)
7NumSampleLoopsno 
8SamplerDataLenno 
9SamplerDatano 
+ +

RIFF UserText Tags

+

Tags decoded from the USER-format txts stream written by Momento M6 dashcam. +Extracted only if the ExtractEmbedded option is used.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
28GPSAltitudeno 
40Accelerometerno 
56GPSSpeedno 
60GPSLatitudeno 
64GPSLongitudeno 
68GPSDateTimeno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Aug 12, 2021 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/RSRC.html b/html/TagNames/RSRC.html new file mode 100644 index 0000000..ca4d28b --- /dev/null +++ b/html/TagNames/RSRC.html @@ -0,0 +1,75 @@ + + + + +RSRC Tags + + + +

RSRC Tags

+

Tags extracted from Mac OS resource files, DFONT files and "._" sidecar +files. These tags may also be extracted from the resource fork of any file +in OS X, either by adding "/..namedfork/rsrc" to the filename to process the +resource fork alone, or by using the ExtractEmbedded (-ee) option to process +the resource fork as a sub-document of the main file. When writing, +ExifTool preserves the Mac OS resource fork by default, but it may deleted +with -rsrc:all= on the command line.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'8BIM'PhotoshopInfo---> Photoshop Tags
'POST_0x01f5'PostscriptFont---> PostScript Tags
'STR _0xbff3'ApplicationMissingMsgno 
'STR _0xbff4'CreatorApplicationno 
'STR#_0x0080'Keywordsno 
'TEXT_0x0080'Descriptionno 
'sfnt'Font---> Font Name Tags
'usro_0x0000'OpenWithApplicationno 
'vers_0x0001'ApplicationVersionno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 15, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/RTF.html b/html/TagNames/RTF.html new file mode 100644 index 0000000..7458ff1 --- /dev/null +++ b/html/TagNames/RTF.html @@ -0,0 +1,151 @@ + + + + +RTF Tags + + + +

RTF Tags

+

This table lists standard tags of the RTF information group, but ExifTool +will also extract any non-standard tags found in this group. As well, +ExifTool will extract any custom properties that are found. See +http://www.microsoft.com/en-ca/download/details.aspx?id=10725 for the +specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'author'Authorno 
'buptim'BackupTimeno 
'category'Categoryno 
'comment'Commentno 
'company'Companyno 
'copyright'Copyrightno 
'creatim'CreateDateno 
'doccomm'Commentsno 
'edmins'TotalEditTimeno 
'hlinkbase'HyperlinkBaseno 
'id'InternalIDNumberno 
'keywords'Keywordsno 
'manager'Managerno 
'nofchars'Charactersno 
'nofcharsws'CharactersWithSpacesno(according to the 2007 Microsoft RTF specification this is clearly the number +of characters NOT including spaces, but Microsoft Word writes this as the +number WITH spaces, so ExifTool names this tag according to the de facto +standard)
'nofpages'Pagesno 
'nofwords'Wordsno 
'operator'LastModifiedByno 
'printim'LastPrintedno 
'revtim'ModifyDateno 
'subject'Subjectno 
'title'Titleno 
'vern'InternalVersionNumberno 
'version'RevisionNumberno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 30, 2012 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Radiance.html b/html/TagNames/Radiance.html new file mode 100644 index 0000000..d15c913 --- /dev/null +++ b/html/TagNames/Radiance.html @@ -0,0 +1,93 @@ + + + + +Radiance Tags + + + +

Radiance Tags

+

Information extracted from Radiance RGBE HDR images. Tag ID's are all +uppercase as stored in the file, but converted to lowercase by when +extracting to avoid conflicts with internal ExifTool variables. See +http://radsite.lbl.gov/radiance/refer/filefmts.pdf and +http://www.graphics.cornell.edu/online/formats/rgbe/ for the +specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'_command'Commandno 
'_comment'Commentno 
'_orient'Orientationno +
'+X +Y' = Rotate 90 CW +
'+X -Y' = Mirror horizontal and rotate 270 CW +
'+Y +X' = Mirror vertical +
'+Y -X' = Rotate 180 +
'-X +Y' = Mirror horizontal and rotate 90 CW +
'-X -Y' = Rotate 270 CW +
'-Y +X' = Horizontal (normal) +
'-Y -X' = Mirror horizontal
+
'colorcorr'ColorCorrectionno 
'exposure'Exposureno(divide pixel values by this to get watts/steradian/meter^2)
'format'Formatno 
'gamma'Gammano 
'pixaspect'PixelAspectRationo 
'primaries'ColorPrimariesno 
'software'Softwareno 
'view'Viewno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 29, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Rawzor.html b/html/TagNames/Rawzor.html new file mode 100644 index 0000000..bf2f117 --- /dev/null +++ b/html/TagNames/Rawzor.html @@ -0,0 +1,46 @@ + + + + +Rawzor Tags + + + +

Rawzor Tags

+

Rawzor files store compressed images of other formats. As well as the +information listed below, exiftool uncompresses and extracts the meta +information from the original image.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
CompressionFactorno 
OriginalFileSizeno 
OriginalFileTypeno 
RawzorCreatorVersionno 
RawzorRequiredVersionno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 8, 2010 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Real.html b/html/TagNames/Real.html new file mode 100644 index 0000000..bc2a2eb --- /dev/null +++ b/html/TagNames/Real.html @@ -0,0 +1,781 @@ + + + + +Real Tags + + + +

Real Tags

+

+ExifTool recognizes three basic types of Real audio/video files: 1) +RealMedia (RM, RV and RMVB), 2) RealAudio (RA), and 3) Real Metafile (RAM +and RPM). +

+

Real Media Tags

+

These Tag ID's are Chunk ID's used in RealMedia and RealVideo (RM, RV and +RMVB) files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'CONT'CONT---> Real ContentDescr Tags
'MDPR'MDPR---> Real MediaProps Tags
'PROP'PROP---> Real Properties Tags
'RJMD'RJMD---> Real Metadata Tags
+ +

Real ContentDescr Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SequenceTag NameWritableValues / Notes
0TitleLen?no 
1Titleno 
2AuthorLen?no 
3Authorno 
4CopyrightLen?no 
5Copyrightno 
6CommentLen?no 
7Commentno 
+ +

Real MediaProps Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SequenceTag NameWritableValues / Notes
0StreamNumberno 
1StreamMaxBitrateno 
2StreamAvgBitrateno 
3StreamMaxPacketSizeno 
4StreamAvgPacketSizeno 
5StreamStartTimeno 
6StreamPrerollno 
7StreamDurationno 
8StreamNameLen?no 
9StreamNameno 
10StreamMimeLen?no 
11StreamMimeTypeno 
12FileInfoLen?no 
13FileInfoLen2?no 
14FileInfoVersionno 
15PhysicalStreams?no 
16PhysicalStreamNumbers?no 
17DataOffsets?no 
18NumRules?no 
19PhysicalStreamNumberMap?no 
20NumProperties?no 
21FileInfoProperties---> Real FileInfo Tags
+ +

Real FileInfo Tags

+

The following tags have been observed in the FileInfo properties, but any +other existing information will also be extracted.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Audiences'Audiencesno 
'Audio Format'AudioFormatno 
'Content Rating'ContentRatingno +
0 = No Rating +
1 = All Ages +
2 = Older Children +
3 = Younger Teens +
4 = Older Teens +
5 = Adult Supervision Recommended +
6 = Adults Only
+
'Creation Date'CreateDateno 
'Description'Descriptionno 
'File ID'FileIDno 
'Generated By'Softwareno 
'Indexable'Indexableno0 = False +
1 = True
'Keywords'Keywordsno 
'Modification Date'ModifyDateno 
'Target Audiences'TargetAudiencesno 
'Video Quality'VideoQualityno 
'audioMode'AudioModeno 
'videoMode'VideoModeno 
+ +

Real Properties Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SequenceTag NameWritableValues / Notes
0MaxBitrateno 
1AvgBitrateno 
2MaxPacketSizeno 
3AvgPacketSizeno 
4NumPacketsno 
5Durationno 
6Prerollno 
7IndexOffset?no 
8DataOffset?no 
9NumStreamsno 
10FlagsnoBit 0 = Allow Recording +
Bit 1 = Perfect Play +
Bit 2 = Live +
Bit 3 = Allow Download
+ +

Real Metadata Tags

+

The tags below represent information which has been observed in the Real +Metadata format, but ExifTool will extract any information it finds in this +format. (As far as I can tell from the referenced documentation, string +values should be plain text, but this is not the case for the only sample +file I have been able to obtain containing this information. These tags +could also be split into separate sub-directories, but this will wait until +I have better documentation or a more complete set of samples.)

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Album/Name'AlbumNameno 
'Track/Category'TrackCategoryno 
'Track/Comments'TrackCommentsno 
'Track/Lyrics'TrackLyricsno 
+ +

Real Audio Tags

+

Tags in the following table reference information extracted from various +versions of RealAudio (RA) files.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'.ra3'RA3---> Real AudioV3 Tags
'.ra4'RA4---> Real AudioV4 Tags
'.ra5'RA5---> Real AudioV5 Tags
+ +

Real AudioV3 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SequenceTag NameWritableValues / Notes
0Channelsno 
1Unknown?no 
2BytesPerMinuteno 
3AudioBytesno 
4TitleLen?no 
5Titleno 
6ArtistLen?no 
7Artistno 
8CopyrightLen?no 
9Copyrightno 
10CommentLen?no 
11Commentno 
+ +

Real AudioV4 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SequenceTag NameWritableValues / Notes
0FourCC1?no 
1AudioFileSize?no 
2Version2?no 
3HeaderSize?no 
4CodecFlavorID?no 
5CodedFrameSize?no 
6AudioBytesno 
7BytesPerMinuteno 
8Unknown?no 
9SubPacketH?no 
10AudioFrameSizeno 
11SubPacketSize?no 
12Unknown?no 
13SampleRateno 
14Unknown?no 
15BitsPerSampleno 
16Channelsno 
17FourCC2Len?no 
18FourCC2?no 
19FourCC3Len?no 
20FourCC3?no 
21Unknown?no 
22Unknown?no 
23TitleLen?no 
24Titleno 
25ArtistLen?no 
26Artistno 
27CopyrightLen?no 
28Copyrightno 
29CommentLen?no 
30Commentno 
+ +

Real AudioV5 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SequenceTag NameWritableValues / Notes
0FourCC1?no 
1AudioFileSize?no 
2Version2?no 
3HeaderSize?no 
4CodecFlavorID?no 
5CodedFrameSize?no 
6AudioBytesno 
7BytesPerMinuteno 
8Unknown?no 
9SubPacketH?no 
10FrameSize?no 
11SubPacketSize?no 
12SampleRateno 
13SampleRate2?no 
14BitsPerSampleno 
15Channelsno 
16Genr?no 
17FourCC3?no 
+ +

Real Metafile Tags

+

Tags representing information extracted from Real Audio Metafile and +RealMedia Plug-in Metafile (RAM and RPM) files.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'txt'Textno 
'url'URLno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 29, 2010 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Reconyx.html b/html/TagNames/Reconyx.html new file mode 100644 index 0000000..7f50dd8 --- /dev/null +++ b/html/TagNames/Reconyx.html @@ -0,0 +1,396 @@ + + + + +Reconyx Tags + + + +

Reconyx Tags

+

The following tags are extracted from the maker notes of Reconyx Hyperfire +cameras such as the HC500, HC600 and PC900.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0MakerNoteVersionno 
1FirmwareVersionno 
4FirmwareDateint16u[2] 
6TriggerModestring[2]'C' = CodeLoc Not Entered +
'E' = External Sensor +
'M' = Motion Detection +
'T' = Time Lapse
7Sequenceint16u[2] 
9EventNumberint16u[2] 
11DateTimeOriginalint16u[6] 
18MoonPhaseint16u + +
0 = New +
1 = New Crescent +
2 = First Quarter +
3 = Waxing Gibbous
  4 = Full +
5 = Waning Gibbous +
6 = Last Quarter +
7 = Old Crescent
+
19AmbientTemperatureFahrenheitint16s 
20AmbientTemperatureint16s 
21SerialNumberundef[30] 
36Contrastint16u 
37Brightnessint16u 
38Sharpnessint16u 
39Saturationint16u 
40InfraredIlluminatorint16u0 = Off +
1 = On
41MotionSensitivityint16u 
42BatteryVoltageint16u 
43UserLabelstring[22] 
+ +

Reconyx Type2 Tags

+

Tags extracted from models such as the UltraFire.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
24FirmwareVersionundef[7] 
31Micro1Versionundef[7] 
38BootLoaderVersionundef[7] 
45Micro2Versionundef[7] 
52TriggerModeundef[1]'M' = Motion Detection +
'P' = Point and Shoot +
'T' = Time Lapse
53Sequenceint8u[2] 
55EventNumberint32u 
59DateTimeOriginalint8u[7] 
66DayOfWeekint8u + +
0 = Sunday +
1 = Monday +
2 = Tuesday +
3 = Wednesday
  4 = Thursday +
5 = Friday +
6 = Saturday
+
67MoonPhaseint8u + +
0 = New +
1 = New Crescent +
2 = First Quarter +
3 = Waxing Gibbous
  4 = Full +
5 = Waning Gibbous +
6 = Last Quarter +
7 = Old Crescent
+
68AmbientTemperatureFahrenheitint16s 
70AmbientTemperatureint16s 
72Illuminationint8u0 = Off +
1 = On
73BatteryVoltageint16u 
75SerialNumberstring[15] 
90UserLabelstring[21] 
+ +

Reconyx Type3 Tags

+

Tags extracted from models such as the HF2 PRO.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
16FileNumberint16u 
18DirectoryNumberint16u 
42FirmwareVersionint16u[3] 
48FirmwareDateint16u[2] 
52TriggerModestring[2]'M' = Motion Detection +
'P' = Point and Shoot +
'T' = Time Lapse
54Sequenceint16u[2] 
58EventNumberint16u[2] 
62DateTimeOriginalint16u[6] 
74DayOfWeekint16u + +
0 = Sunday +
1 = Monday +
2 = Tuesday +
3 = Wednesday
  4 = Thursday +
5 = Friday +
6 = Saturday
+
76MoonPhaseint16u + +
0 = New +
1 = New Crescent +
2 = First Quarter +
3 = Waxing Gibbous
  4 = Full +
5 = Waning Gibbous +
6 = Last Quarter +
7 = Old Crescent
+
78AmbientTemperatureFahrenheitint16s 
80AmbientTemperatureint16s 
82Contrastint16u 
84Brightnessint16u 
86Sharpnessint16u 
88Saturationint16u 
90Flashint16u0 = Off +
1 = On
92AmbientInfraredint16u 
94AmbientLightint16u 
96MotionSensitivityint16u 
98BatteryVoltageint16u 
100BatteryVoltageAvgint16u 
102BatteryTypeint16u 
104UserLabelstring[22] 
126SerialNumberunicode[15] 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Mar 7, 2019 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Red.html b/html/TagNames/Red.html new file mode 100644 index 0000000..d2e2e80 --- /dev/null +++ b/html/TagNames/Red.html @@ -0,0 +1,292 @@ + + + + +Red Tags + + + +

Red Tags

+

Tags extracted from Redcode R3D video files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'RED1'Red1Header---> Red RED1 Tags
'RED2'Red2Header---> Red RED2 Tags
0x1000StartEdgeCodeno 
0x1001StartTimecodeno 
0x1002OtherDate1no 
0x1003OtherDate2no 
0x1004OtherDate3no 
0x1005DateTimeOriginalno 
0x1006SerialNumberno 
0x1019CameraTypeno 
0x101aReelNumberno 
0x101bTakeno 
0x1023DateCreatedno 
0x1024TimeCreatedno 
0x1025FirmwareVersionno 
0x1029ReelTimecodeno 
0x102aStorageTypeno 
0x1030StorageFormatDateno 
0x1031StorageFormatTimeno 
0x1032StorageSerialNumberno 
0x1033StorageModelno 
0x1036AspectRationo 
0x1042Revisionno 
0x1056OriginalFileNameno 
0x106eLensMakeno 
0x106fLensNumberno 
0x1070LensModelno 
0x1071Modelno 
0x107cCameraOperatorno 
0x1086VideoFormatno 
0x1096Filterno 
0x10a0Brainno 
0x10a1Sensorno 
0x200dColorTemperatureno 
0x204bRGBCurvesno 
0x2066OriginalFrameRateno 
0x4037CropAreano 
0x403bISOno 
0x406aFNumberno 
0x406bFocalLengthno 
0x606cFocusDistanceno 
+ +

Red RED1 Tags

+

Redcode version 1 header.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
7RedcodeVersionno 
54ImageWidthno 
58ImageHeightno 
62FrameRateno 
67OriginalFileNameno 
+ +

Red RED2 Tags

+

Redcode version 2 header.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
7RedcodeVersionno 
76ImageWidthno 
80ImageHeightno 
86FrameRateno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 30, 2018 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Ricoh.html b/html/TagNames/Ricoh.html new file mode 100644 index 0000000..b8e6d9c --- /dev/null +++ b/html/TagNames/Ricoh.html @@ -0,0 +1,812 @@ + + + + +Ricoh Tags + + + +

Ricoh Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001MakerNoteTypestring 
0x0002FirmwareVersionstring 
0x0005SerialNumber +
InternalSerialNumber
undef[16]
undef[16]
(the serial number stamped on the camera begins with 2 model-specific letters +followed by the last 8 digits of this value. For the GXR, this is the +serial number of the lens unit)
0x0e00PrintIM---> PrintIM Tags
0x1000RecordingFormatint16u2 = JPEG +
3 = DNG
0x1001ImageInfo +
ExposureProgram
-
int16u
--> Ricoh ImageInfo Tags +
(GR) +
+
1 = Auto +
2 = Program AE +
3 = Aperture-priority AE +
4 = Shutter speed priority AE +
5 = Shutter/aperture priority AE +
6 = Manual +
7 = Movie
+
0x1002DriveModeint16u(valid only for some models) +
0 = Single-frame +
1 = Continuous +
8 = AF-priority Continuous
0x1003Sharpness +
WhiteBalance
int32u
int16u
0 = Sharp +
1 = Normal +
2 = Soft +
(GR)
+
0 = Auto +
1 = Multi-P Auto +
2 = Daylight +
3 = Cloudy +
4 = Incandescent 1 +
5 = Incandescent 2 +
6 = Daylight Fluorescent +
7 = Neutral White Fluorescent +
8 = Cool White Fluorescent +
9 = Warm White Fluorescent +
10 = Manual +
11 = Kelvin +
12 = Shade
+
0x1004WhiteBalanceFineTuneint16u(2 numbers: amount of adjustment towards Amber and Green. Not valid for all +models)
0x1006FocusModeint16u + +
1 = Manual +
2 = Multi AF +
3 = Spot AF +
4 = Snap +
5 = Infinity
  7 = Face Detect +
8 = Subject Tracking +
9 = Pinpoint AF +
10 = Movie
+
0x1007AutoBracketingint16u + +
0 = Off +
9 = AE +
11 = WB +
16 = DR
  17 = Contrast +
18 = WB2 +
19 = Effect
+
0x1009MacroModeint16u0 = Off +
1 = On
0x100aFlashModeint16u +
0 = Off +
1 = Auto, Fired +
2 = On +
3 = Auto, Fired, Red-eye reduction +
4 = Slow Sync +
5 = Manual +
6 = On, Red-eye reduction +
7 = Synchro, Red-eye reduction +
8 = Auto, Did not fire
+
0x100bFlashExposureComprational64s 
0x100cManualFlashOutputrational64s + + +
-288 = 1/64 +
-240 = 1/32 +
-216 = 1/22 +
-192 = 1/16
  -168 = 1/11 +
-144 = 1/8 +
-120 = 1/5.6 +
-96 = 1/4
  -72 = 1/2.8 +
-48 = 1/2 +
-24 = 1/1.4 +
0 = Full
+
0x100dFullPressSnapint16u0 = Off +
1 = On
0x100eDynamicRangeExpansionint16u0 = Off +
3 = Weak +
4 = Medium +
5 = Strong
0x100fNoiseReductionint16u0 = Off +
1 = Weak +
2 = Medium +
3 = Strong
0x1010ImageEffectsint16u + +
0 = Standard +
1 = Vivid +
3 = Black & White +
5 = B&W Toning Effect +
6 = Setting 1 +
7 = Setting 2 +
9 = High-contrast B&W
  10 = Cross Process +
11 = Positive Film +
12 = Bleach Bypass +
13 = Retro +
15 = Miniature +
17 = High Key
+
0x1011Vignettingint16u0 = Off +
1 = Low +
2 = Medium +
3 = High
0x1012Contrastint32u2147483647 = MAX
0x1013Saturationint32u 
0x1014Sharpnessint32u 
0x1015ToningEffectint16u + +
0 = Off +
1 = Sepia +
2 = Red +
3 = Green
  4 = Blue +
5 = Purple +
6 = B&W +
7 = Color
+
0x1016HueAdjustint16u + +
0 = Off +
1 = Basic +
2 = Magenta +
3 = Yellow
  4 = Normal +
5 = Warm +
6 = Cool
+
0x1017WideAdapterint16u0 = Not Attached +
2 = Attached
0x1018CropModeint16u0 = Off +
1 = On (35mm) +
2 = On (47mm)
0x1019NDFilterint16u0 = Off +
1 = On
0x101aWBBracketShotNumberint16u 
0x1200AFStatusint16u0 = Out of Focus +
1 = In Focus
0x1201AFAreaXPosition1int32u(manual AF area position in a 1280x864 image)
0x1202AFAreaYPosition1int32u 
0x1203AFAreaXPositionint32u(manual AF area position in the full image)
0x1204AFAreaYPositionint32u 
0x1205AFAreaModeint16u0 = Auto +
2 = Manual
0x1307ColorTempKelvinint32u 
0x1308ColorTemperatureint32u 
0x1500FocalLengthrational64u 
0x1601SensorWidthint32u 
0x1602SensorHeightint32u 
0x1603CroppedImageWidthint32u 
0x1604CroppedImageHeightint32u 
0x2001RicohSubdir +
RicohSubdirIFD +
RicohRR1Subdir
-
-
-
--> Ricoh Subdir Tags +
--> Ricoh Subdir Tags +
--> Ricoh Subdir Tags
0x4001ThetaSubdir---> Ricoh ThetaSubdir Tags
+ +

Ricoh ImageInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0RicohImageWidthint16u 
2RicohImageHeightint16u 
6RicohDateint8u[7] 
28PreviewImageStartint16u* 
30PreviewImageLengthint16u* 
32FlashModeint8u0 = Off +
1 = Auto +
2 = On
33Macroint8u0 = Off +
1 = On
34Sharpnessint8u0 = Sharp +
1 = Normal +
2 = Soft
38WhiteBalanceint8u + +
0 = Auto +
1 = Daylight +
2 = Cloudy +
3 = Tungsten
  4 = Fluorescent +
5 = Manual +
7 = Detail +
9 = Multi-pattern Auto
+
39ISOSettingint8u + + +
0 = Auto +
1 = 64 +
2 = 100 +
4 = 200
  6 = 400 +
7 = 800 +
8 = 1600 +
9 = Auto
  10 = 3200 +
11 = 100 (Low)
+
40Saturationint8u + +
0 = High +
1 = Normal +
2 = Low +
3 = B&W
  6 = Toning Effect +
9 = Vivid +
10 = Natural
+
+ +

Ricoh Subdir Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0004ManufactureDate1string[20] 
0x0005ManufactureDate2string[20] 
0x001aFaceInfo---> Ricoh FaceInfo Tags
0x0029FirmwareInfo---> Ricoh FirmwareInfo Tags
0x002aNoiseReductionint32u0 = Off +
1 = Weak +
2 = Strong +
3 = Max
0x002cSerialInfo---> Ricoh SerialInfo Tags
+ +

Ricoh FaceInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
181FacesDetectedint8u 
182FaceDetectFrameSizeint16u[2] 
188Face1Positionint16u[4](left, top, width and height of detected face in coordinates of +FaceDetectFrameSize with increasing Y downwards)
200Face2Positionint16u[4] 
212Face3Positionint16u[4] 
224Face4Positionint16u[4] 
236Face5Positionint16u[4] 
248Face6Positionint16u[4] 
260Face7Positionint16u[4] 
272Face8Positionint16u[4] 
+ +

Ricoh FirmwareInfo Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0FirmwareRevisionstring[12] 
12FirmwareRevision2string[12] 
+ +

Ricoh SerialInfo Tags

+

This information is found in images from the GXR.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0BodyFirmwarestring[16] 
16BodySerialNumberstring[16] 
32LensFirmwarestring[16] 
48LensSerialNumberstring[16] 
+ +

Ricoh ThetaSubdir Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0003Accelerometerrational64s[2] 
0x0004Compassrational64u 
0x000aTimeZonestring 
+ +

Ricoh Type2 Tags

+

Tags written by models such as the Ricoh HZ15 and the Pentax XG-1. These +are not writable due to numerous formatting errors as written by these +cameras.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0207RicohModelno 
0x0300RicohMakeno 
+ +

Ricoh Text Tags

+

Some Ricoh DC and RDC models use a text-based format for their maker notes +instead of the IFD format used by the Caplio models. Below is a list of known +tags in this information.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Bg'BlueGainno 
'Gg'GreenGainno 
'Rev'FirmwareVersionno 
'Rg'RedGainno 
'Rv'FirmwareVersionno 
+ +

Ricoh RMETA Tags

+

The Ricoh Caplio Pro G3 has the ability to add custom fields to the APP5 +"RMETA" segment of JPEG images. While only a few observed tags have been +defined below, ExifTool will extract any information found here.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Azimuth'Azimuthno + + + +
1 = N +
2 = NNE +
3 = NE +
4 = ENE
  5 = E +
6 = ESE +
7 = SE +
8 = SSE
  9 = S +
10 = SSW +
11 = SW +
12 = WSW
  13 = W +
14 = WNW +
15 = NW +
16 = NNW
+
'Condition'Conditionno1 = Good +
2 = Fair +
3 = Poor +
4 = Damaged
'Lit'Litno1 = Yes +
2 = No
'Location'Locationno1 = Verge +
2 = Gantry +
3 = Central reservation +
4 = Roundabout
'Sign type'SignTypeno1 = Directional +
2 = Warning +
3 = Information
'_audio'SoundFileno(audio data recorded in JPEG images by the G700SE)
'_barcode'Barcodesno+ 
+ +

Ricoh AVI Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'mnrt'MakerNoteRicoh---> Ricoh Tags
'rdc2'RicohRDC2?no 
'thum'ThumbnailImageno 
'ucmt'Commentno 
+ +

Ricoh LensID Values

+

Lens units available for the GXR, used by the Ricoh Composite LensID tag. Note +that unlike lenses for all other makes of cameras, the focal lengths in these +model names have already been scaled to include the 35mm crop factor.

+
+
+ + + + + + + + +
ValueLensIDValueLensID
'RL1'= GR Lens A12 50mm F2.5 Macro'RL5'= GR Lens A12 28mm F2.5
'RL2'= Ricoh Lens S10 24-70mm F2.5-4.4 VC'RL6'= Ricoh Lens A16 24-85mm F3.5-5.5
'RL3'= Ricoh Lens P10 28-300mm F3.5-5.6 VC'RL8'= Mount A12
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 27, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Samsung.html b/html/TagNames/Samsung.html new file mode 100644 index 0000000..080e173 --- /dev/null +++ b/html/TagNames/Samsung.html @@ -0,0 +1,1137 @@ + + + + +Samsung Tags + + + +

Samsung Tags

+

Tags found in the binary "STMN" format maker notes written by a number of +Samsung models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0MakerNoteVersionundef[8] 
2PreviewImageStartint32u* 
3PreviewImageLengthint32u* 
11SamsungIFD---> Samsung IFD Tags
+ +

Samsung IFD Tags

+

This is a standard-format IFD found in the maker notes of some Samsung +models, except that the entry count is a 4-byte integer and the offsets are +relative to the end of the IFD. Currently, no tags in this IFD are known, +so the Unknown (-u) or Verbose (-v) option must be used to see this +information.

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +

Samsung Type2 Tags

+

Tags found in the EXIF-format maker notes of newer Samsung models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001MakerNoteVersionundef[4] 
0x0002DeviceTypeint32u0x1000 = Compact Digital Camera +
0x2000 = High-end NX Camera +
0x3000 = HXM Video Camera +
0x12000 = Cell Phone +
0x300000 = SMX Video Camera
0x0003SamsungModelIDint32u0x100101c = NX10 +
0x1001226 = HMX-S15BP +
0x1001233 = HMX-Q10 +
0x1001234 = HMX-H304 +
0x100130c = NX100 +
0x1001327 = NX11 +
0x170104b = ES65, ES67 / VLUU ES65, ES67 / SL50 +
0x170104e = ES70, ES71 / VLUU ES70, ES71 / SL600 +
0x1701052 = ES73 / VLUU ES73 / SL605 +
0x1701055 = ES25, ES27 / VLUU ES25, ES27 / SL45 +
0x1701300 = ES28 / VLUU ES28 +
0x1701303 = ES74,ES75,ES78 / VLUU ES75,ES78 +
0x2001046 = PL150 / VLUU PL150 / TL210 / PL151 +
0x2001048 = PL100 / TL205 / VLUU PL100 / PL101 +
0x2001311 = PL120,PL121 / VLUU PL120,PL121 +
0x2001315 = PL170,PL171 / VLUUPL170,PL171 +
0x200131e = PL210, PL211 / VLUU PL210, PL211 +
0x2701317 = PL20,PL21 / VLUU PL20,PL21 +
0x2a0001b = WP10 / VLUU WP10 / AQ100 +
0x3000000 = Various Models (0x3000000) +
0x3a00018 = Various Models (0x3a00018) +
0x400101f = ST1000 / ST1100 / VLUU ST1000 / CL65 +
0x4001022 = ST550 / VLUU ST550 / TL225 +
0x4001025 = Various Models (0x4001025) +
0x400103e = VLUU ST5500, ST5500, CL80 +
0x4001041 = VLUU ST5000, ST5000, TL240 +
0x4001043 = ST70 / VLUU ST70 / ST71 +
0x400130a = Various Models (0x400130a) +
0x400130e = ST90,ST91 / VLUU ST90,ST91 +
0x4001313 = VLUU ST95, ST95 +
0x4a00015 = VLUU ST60 +
0x4a0135b = ST30, ST65 / VLUU ST65 / ST67 +
0x5000000 = Various Models (0x5000000) +
0x5001038 = Various Models (0x5001038) +
0x500103a = WB650 / VLUU WB650 / WB660 +
0x500103c = WB600 / VLUU WB600 / WB610 +
0x500133e = WB150 / WB150F / WB152 / WB152F / WB151 +
0x5a0000f = WB5000 / HZ25W +
0x5a0001e = WB5500 / VLUU WB5500 / HZ50W +
0x6001036 = EX1 +
0x700131c = VLUU SH100, SH100 +
0x27127002 = SMX-C20N
0x0011OrientationInfo---> Samsung OrientationInfo Tags
0x0020SmartAlbumColorint16u[2]'0 0' = n/a +
[Value 0]
+ +
0 = Red +
1 = Yellow +
2 = Green +
3 = Blue
  4 = Magenta +
5 = Black +
6 = White +
7 = Various
+
0x0021PictureWizardint16u--> Samsung PictureWizard Tags
0x0030LocalLocationNamestring 
0x0031LocationNamestring 
0x0035PreviewIFD---> Nikon PreviewIFD Tags +
--> Nikon PreviewIFD Tags
0x0040RawDataByteOrderyes0 = Little-endian (Intel, II) +
1 = Big-endian (Motorola, MM)
0x0041WhiteBalanceSetupint32u0 = Auto +
1 = Manual
0x0043CameraTemperaturerational64s 
0x0050RawDataCFAPatternyes0 = Unchanged +
1 = Swap +
65535 = Roll
0x0100FaceDetectint16u0 = Off +
1 = On
0x0120FaceRecognitionint32u0 = Off +
1 = On
0x0123FaceNamestring 
0xa001FirmwareNamestring 
0xa002SerialNumberstring 
0xa003LensTypeint16u[n][Value 0] +
0 = Built-in or Manual Lens +
1 = Samsung NX 30mm F2 Pancake +
2 = Samsung NX 18-55mm F3.5-5.6 OIS +
3 = Samsung NX 50-200mm F4-5.6 ED OIS +
4 = Samsung NX 20-50mm F3.5-5.6 ED +
5 = Samsung NX 20mm F2.8 Pancake +
6 = Samsung NX 18-200mm F3.5-6.3 ED OIS +
7 = Samsung NX 60mm F2.8 Macro ED OIS SSA +
8 = Samsung NX 16mm F2.4 Pancake +
9 = Samsung NX 85mm F1.4 ED SSA +
10 = Samsung NX 45mm F1.8 +
11 = Samsung NX 45mm F1.8 2D/3D +
12 = Samsung NX 12-24mm F4-5.6 ED +
13 = Samsung NX 16-50mm F2-2.8 S ED OIS +
14 = Samsung NX 10mm F3.5 Fisheye +
15 = Samsung NX 16-50mm F3.5-5.6 Power Zoom ED OIS +
20 = Samsung NX 50-150mm F2.8 S ED OIS +
21 = Samsung NX 300mm F2.8 ED OIS
0xa004LensFirmwarestring 
0xa005InternalLensSerialNumberstring 
0xa010SensorAreasint32u[8](full and valid sensor areas)
0xa011ColorSpaceint16u0 = sRGB +
1 = Adobe RGB
0xa012SmartRangeint16u0 = Off +
1 = On
0xa013ExposureCompensationrational64s 
0xa014ISOint32u 
0xa018ExposureTimerational64u 
0xa019FNumberrational64u 
0xa01aFocalLengthIn35mmFormatint32u 
0xa020EncryptionKeyint32u[11]!(key used to decrypt the tags below)
0xa021WB_RGGBLevelsUncorrectedint32u[4](these tags not corrected for WB_RGGBLevelsBlack)
0xa022WB_RGGBLevelsAutoint32u[4] 
0xa023WB_RGGBLevelsIlluminator1int32u[4] 
0xa024WB_RGGBLevelsIlluminator2int32u[4] 
0xa025HighlightLinearityLimitint32u 
0xa028WB_RGGBLevelsBlackint32s[4] 
0xa030ColorMatrixint32s[9] 
0xa031ColorMatrixSRGBint32s[9] 
0xa032ColorMatrixAdobeRGBint32s[9] 
0xa033CbCrMatrixDefaultint32s[4] 
0xa034CbCrMatrixint32s[4] 
0xa035CbCrGainDefaultint32u[2] 
0xa036CbCrGainint32u[2] 
0xa040ToneCurveSRGBDefaultint32u[23](first value gives the number of tone curve entries. This is followed by an +array of X coordinates then an array of Y coordinates)
0xa041ToneCurveAdobeRGBDefaultint32u[23] 
0xa042ToneCurveSRGBint32u[23] 
0xa043ToneCurveAdobeRGBint32u[23] 
0xa048RawData?int32s[12] 
0xa050Distortion?int32s[8] 
0xa051ChromaticAberration?int16u[22] 
0xa052Vignetting?int16u[15] 
0xa053VignettingCorrection?int16u[15] 
0xa054VignettingSetting?int16u[15] 
+ +

Samsung OrientationInfo Tags

+

Camera orientation information written by the Gear 360 (SM-C200).

+
+
+ + + + + + + + + + + + + + + + + + +
Index8Tag NameWritableValues / Notes
0YawAngle?rational64s(always zero)
1PitchAnglerational64s(upward tilt of rear camera in degrees)
2RollAnglerational64s(clockwise rotation of rear camera in degrees)
+ +

Samsung PictureWizard Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0PictureWizardModeint16u + + +
0 = Standard +
1 = Vivid +
2 = Portrait +
3 = Landscape +
4 = Forest
  5 = Retro +
6 = Cool +
7 = Calm +
8 = Classic +
9 = Custom1
  10 = Custom2 +
11 = Custom3 +
255 = n/a
+
1PictureWizardColorint16u 
2PictureWizardSaturationint16u 
3PictureWizardSharpnessint16u 
4PictureWizardContrastint16u 
+ +

Samsung APP5 Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ssuniqueid'UniqueIDno 
+ +

Samsung Trailer Tags

+

Tags extracted from the trailer of JPEG images written when using certain +features (such as "Sound & Shot" or "Shot & More") from Samsung models such +as the Galaxy S4 and Tab S, and from the 'sefd' atom in HEIC images from the +Samsung S10+.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
DepthMapData +
DepthMapData2
no
no
 
DepthMapNameno 
DualCameraImageno 
DualCameraImageNameno 
DualShotExtra---> Samsung DualShotExtra Tags
EmbeddedAudioFileno 
EmbeddedAudioFileNameno 
EmbeddedImage +
EmbeddedImage2
no
no
 
EmbeddedImageNameno 
EmbeddedVideoFileno 
EmbeddedVideoTypeno 
MCCDatano202 = Greece +
204 = Netherlands +
206 = Belgium +
208 = France +
212 = Monaco +
213 = Andorra +
214 = Spain +
216 = Hungary +
218 = Bosnia & Herzegov. +
219 = Croatia +
220 = Serbia +
221 = Kosovo +
222 = Italy +
226 = Romania +
228 = Switzerland +
230 = Czech Rep. +
231 = Slovakia +
232 = Austria +
234 = United Kingdom +
235 = United Kingdom +
238 = Denmark +
240 = Sweden +
242 = Norway +
244 = Finland +
246 = Lithuania +
247 = Latvia +
248 = Estonia +
250 = Russian Federation +
255 = Ukraine +
257 = Belarus +
259 = Moldova +
260 = Poland +
262 = Germany +
266 = Gibraltar +
268 = Portugal +
270 = Luxembourg +
272 = Ireland +
274 = Iceland +
276 = Albania +
278 = Malta +
280 = Cyprus +
282 = Georgia +
283 = Armenia +
284 = Bulgaria +
286 = Turkey +
288 = Faroe Islands +
289 = Abkhazia +
290 = Greenland +
292 = San Marino +
293 = Slovenia +
294 = Macedonia +
295 = Liechtenstein +
297 = Montenegro +
302 = Canada +
308 = St. Pierre & Miquelon +
310 = United States / Guam +
311 = United States / Guam +
312 = United States +
316 = United States +
330 = Puerto Rico +
334 = Mexico +
338 = Jamaica +
340 = French Guiana / Guadeloupe / Martinique +
342 = Barbados +
344 = Antigua and Barbuda +
346 = Cayman Islands +
348 = British Virgin Islands +
350 = Bermuda +
352 = Grenada +
354 = Montserrat +
356 = Saint Kitts and Nevis +
358 = Saint Lucia +
360 = St. Vincent & Gren. +
362 = Bonaire, Sint Eustatius and Saba / Curacao / Netherlands Antilles +
363 = Aruba +
364 = Bahamas +
365 = Anguilla +
366 = Dominica +
368 = Cuba +
370 = Dominican Republic +
372 = Haiti +
374 = Trinidad and Tobago +
376 = Turks and Caicos Islands / US Virgin Islands +
400 = Azerbaijan +
401 = Kazakhstan +
402 = Bhutan +
404 = India +
405 = India +
410 = Pakistan +
412 = Afghanistan +
413 = Sri Lanka +
414 = Myanmar (Burma) +
415 = Lebanon +
416 = Jordan +
417 = Syrian Arab Republic +
418 = Iraq +
419 = Kuwait +
420 = Saudi Arabia +
421 = Yemen +
422 = Oman +
424 = United Arab Emirates +
425 = Israel / Palestinian Territory +
426 = Bahrain +
427 = Qatar +
428 = Mongolia +
429 = Nepal +
430 = United Arab Emirates +
431 = United Arab Emirates +
432 = Iran +
434 = Uzbekistan +
436 = Tajikistan +
437 = Kyrgyzstan +
438 = Turkmenistan +
440 = Japan +
441 = Japan +
450 = South Korea +
452 = Viet Nam +
454 = Hongkong, China +
455 = Macao, China +
456 = Cambodia +
457 = Laos P.D.R. +
460 = China +
466 = Taiwan +
467 = North Korea +
470 = Bangladesh +
472 = Maldives +
502 = Malaysia +
505 = Australia +
510 = Indonesia +
514 = Timor-Leste +
515 = Philippines +
520 = Thailand +
525 = Singapore +
528 = Brunei Darussalam +
530 = New Zealand +
537 = Papua New Guinea +
539 = Tonga +
540 = Solomon Islands +
541 = Vanuatu +
542 = Fiji +
544 = American Samoa +
545 = Kiribati +
546 = New Caledonia +
547 = French Polynesia +
548 = Cook Islands +
549 = Samoa +
550 = Micronesia +
552 = Palau +
553 = Tuvalu +
555 = Niue +
602 = Egypt +
603 = Algeria +
604 = Morocco +
605 = Tunisia +
606 = Libya +
607 = Gambia +
608 = Senegal +
609 = Mauritania +
610 = Mali +
611 = Guinea +
612 = Ivory Coast +
613 = Burkina Faso +
614 = Niger +
615 = Togo +
616 = Benin +
617 = Mauritius +
618 = Liberia +
619 = Sierra Leone +
620 = Ghana +
621 = Nigeria +
622 = Chad +
623 = Central African Rep. +
624 = Cameroon +
625 = Cape Verde +
626 = Sao Tome & Principe +
627 = Equatorial Guinea +
628 = Gabon +
629 = Congo, Republic +
630 = Congo, Dem. Rep. +
631 = Angola +
632 = Guinea-Bissau +
633 = Seychelles +
634 = Sudan +
635 = Rwanda +
636 = Ethiopia +
637 = Somalia +
638 = Djibouti +
639 = Kenya +
640 = Tanzania +
641 = Uganda +
642 = Burundi +
643 = Mozambique +
645 = Zambia +
646 = Madagascar +
647 = Reunion +
648 = Zimbabwe +
649 = Namibia +
650 = Malawi +
651 = Lesotho +
652 = Botswana +
653 = Swaziland +
654 = Comoros +
655 = South Africa +
657 = Eritrea +
659 = South Sudan +
702 = Belize +
704 = Guatemala +
706 = El Salvador +
708 = Honduras +
710 = Nicaragua +
712 = Costa Rica +
714 = Panama +
716 = Peru +
722 = Argentina Republic +
724 = Brazil +
730 = Chile +
732 = Colombia +
734 = Venezuela +
736 = Bolivia +
738 = Guyana +
740 = Ecuador +
744 = Paraguay +
746 = Suriname +
748 = Uruguay +
750 = Falkland Islands (Malvinas) +
901 = International Networks / Satellite Networks
SingleShotDepthMapno 
SingleShotMeta---> Samsung SingleShotMeta Tags
SurroundShotVideono 
SurroundShotVideoNameno 
TimeStampno 
+ +

Samsung DualShotExtra Tags

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
16DepthMapWidthno(index varies depending on model)
17DepthMapHeightno(index varies depending on model)
+ +

Samsung SingleShotMeta Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'beautyColorLevel'BeautyColorLevelno 
'beautyRetouchLevel'BeautyRetouchLevelno 
'blurStrength'BlurStrengthno 
'bokehShape'BokehShapeno 
'colorpopStrength'ColorpopStrengthno 
'depthHWHeight'DepthHWHeightno 
'depthHWWidth'DepthHWWidthno 
'depthSWHeight'DepthSWHeightno 
'depthSWWidth'DepthSWWidthno 
'deviceOrientation'DeviceOrientationno 
'effectStrength'EffectStrengthno 
'effectType'EffectTypeno 
'flipStatus'FlipStatusno 
'inputHeight'InputHeightno 
'inputWidth'InputWidthno 
'isArtBokeh'IsArtBokehno 
'lensFacing'LensFacingno 
'monoStrength'MonoStrengthno 
'objectOrientation'ObjectOrientationno 
'outputHeight'OutputHeightno 
'outputWidth'OutputWidthno 
'perfMode'PerfModeno 
'segHeight'SegHeightno 
'segWidth'SegWidthno 
'sidelightStrength'SidelightStrengthno 
'spinStrength'SpinStrengthno 
'vintageStrength'VintageStrengthno 
'zoomStrength'ZoomStrengthno 
+ +

Samsung sec Tags

+

This information is found in the @sec atom of Samsung MP4 videos from models +such as the WB30F.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
32Modelno 
512ThumbnailWidthno 
516ThumbnailHeightno 
520ThumbnailLengthno 
524ThumbnailImageno(the THM image, embedded metadata is extracted as the first sub-document)
+ +

Samsung INFO Tags

+

This information is found in MP4 videos from Samsung models such as the +SMX-C20N.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'EFCT'Effectno 
'QLTY'Qualityno 
+ +

Samsung MP4 Tags

+

This information is found in Samsung MP4 videos from models such as the +WP10.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
24Modelno 
46ExposureTimeno 
50FNumberno 
58ExposureCompensationno 
106ISOno 
125Softwareno 
244Thumbnail---> Samsung Thumbnail Tags
+ +

Samsung Thumbnail Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1ThumbnailWidthno 
2ThumbnailHeightno 
3ThumbnailLengthno 
4ThumbnailOffsetno 
+ +

Samsung smta Tags

+

This information is found in the smta atom of Samsung MP4 videos from models +such as the Galaxy S4.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'svss'SamsungSvss---> Samsung svss Tags
+ +

Samsung svss Tags

+

This information is found in the svss atom of Samsung MP4 videos from models +such as the Galaxy S4.

+
+
+ + + + +
Tag IDTag NameWritableValues / Notes
[no tags known]
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 1, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Sanyo.html b/html/TagNames/Sanyo.html new file mode 100644 index 0000000..36d6e74 --- /dev/null +++ b/html/TagNames/Sanyo.html @@ -0,0 +1,367 @@ + + + + +Sanyo Tags + + + +

Sanyo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x00ffMakerNoteOffsetint32u 
0x0100SanyoThumbnailundef 
0x0200SpecialModeint32u[3] 
0x0201SanyoQualityint16u +
0x0 = Normal/Very Low +
0x1 = Normal/Low +
0x2 = Normal/Medium Low +
0x3 = Normal/Medium +
0x4 = Normal/Medium High +
0x5 = Normal/High +
0x6 = Normal/Very High +
0x7 = Normal/Super High +
0x100 = Fine/Very Low +
0x101 = Fine/Low +
0x102 = Fine/Medium Low +
0x103 = Fine/Medium +
0x104 = Fine/Medium High +
0x105 = Fine/High +
0x106 = Fine/Very High +
0x107 = Fine/Super High +
0x200 = Super Fine/Very Low +
0x201 = Super Fine/Low +
0x202 = Super Fine/Medium Low +
0x203 = Super Fine/Medium +
0x204 = Super Fine/Medium High +
0x205 = Super Fine/High +
0x206 = Super Fine/Very High +
0x207 = Super Fine/Super High
+
0x0202Macroint16u0 = Normal +
1 = Macro +
2 = View +
3 = Manual
0x0204DigitalZoomrational64u 
0x0207SoftwareVersionyes 
0x0208PictInfoyes 
0x0209CameraIDyes 
0x020eSequentialShotint16u0 = None +
1 = Standard +
2 = Best +
3 = Adjust Exposure
0x020fWideRangeint16u0 = Off +
1 = On
0x0210ColorAdjustmentModeint16u0 = Off +
1 = On
0x0213QuickShotint16u0 = Off +
1 = On
0x0214SelfTimerint16u0 = Off +
1 = On
0x0216VoiceMemoint16u0 = Off +
1 = On
0x0217RecordShutterReleaseint16u0 = Record while down +
1 = Press start, press stop
0x0218FlickerReduceint16u0 = Off +
1 = On
0x0219OpticalZoomOnint16u0 = Off +
1 = On
0x021bDigitalZoomOnint16u0 = Off +
1 = On
0x021dLightSourceSpecialint16u0 = Off +
1 = On
0x021eResavedint16u0 = No +
1 = Yes
0x021fSceneSelectint16u + +
0 = Off +
1 = Sport +
2 = TV +
3 = Night
  4 = User 1 +
5 = User 2 +
6 = Lamp
+
0x0223ManualFocusDistance +
FaceInfo
rational64u
-
Sanyo FaceInfo
0x0224SequenceShotIntervalint16u0 = 5 frames/s +
1 = 10 frames/s +
2 = 15 frames/s +
3 = 20 frames/s
0x0225FlashModeint16u0 = Auto +
1 = Force +
2 = Disabled +
3 = Red eye
0x0e00PrintIM---> PrintIM Tags
0x0f00DataDumpno 
+ +

Sanyo FaceInfo Tags

+
+
+ + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0FacesDetectedint32u 
4FacePositionint32u[4](left, top, right and bottom coordinates of detected face in an unrotated +640-pixel-wide image, with increasing Y downwards)
+ +

Sanyo MOV Tags

+

This information is found in Sanyo MOV videos.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
24Modelno 
38ExposureTimeno 
42FNumberno 
50ExposureCompensationno 
68WhiteBalanceno + +
0 = Auto +
1 = Daylight +
2 = Shade
  3 = Fluorescent +
4 = Tungsten +
5 = Manual
+
72FocalLengthno 
+ +

Sanyo MP4 Tags

+

This information is found in Sanyo MP4 videos.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Makeno 
24Modelno 
50FNumberno 
58ExposureCompensationno 
106ISOno 
209Softwareno(these tags are shifted up by 1 byte for some models like the HD1A)
210Softwareno 
241Thumbnail---> Sanyo Thumbnail Tags
242Thumbnail---> Sanyo Thumbnail Tags
+ +

Sanyo Thumbnail Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1ThumbnailWidthno 
2ThumbnailHeightno 
3ThumbnailLengthno 
4ThumbnailOffsetno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Apr 30, 2019 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Scalado.html b/html/TagNames/Scalado.html new file mode 100644 index 0000000..00da437 --- /dev/null +++ b/html/TagNames/Scalado.html @@ -0,0 +1,46 @@ + + + + +Scalado Tags + + + +

Scalado Tags

+

Tags extracted from the JPEG APP4 "SCALADO" segment found in images from +HTC, LG and Samsung phones. (Presumably written by Scalado mobile software, +http://www.scalado.com/.)

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'HGHT'PreviewImageHeightno 
'QUAL'PreviewQualityno 
'SPMO'DataLength?no 
'WDTH'PreviewImageWidthno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Sep 13, 2013 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Shortcuts.html b/html/TagNames/Shortcuts.html new file mode 100644 index 0000000..de34fa7 --- /dev/null +++ b/html/TagNames/Shortcuts.html @@ -0,0 +1,302 @@ + + + + +Shortcuts Tags + + + +

Shortcuts Tags

+

+Shortcut tags are convenience tags that represent one or more other tag +names. They are used like regular tags to read and write the information +for a specified set of tags.

+ +

The shortcut tags below have been pre-defined, but user-defined shortcuts +may be added via the %Image::ExifTool::UserDefined::Shortcuts lookup in the +~/.ExifTool_config file. See the Image::ExifTool::Shortcuts documentation +for more details. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableRefers ToValues / Notes
AllDatesyesDateTimeOriginal +
CreateDate +
ModifyDate
(contrary to the shortcut name, this represents only the common EXIF +date/time tags. To access all date/time tags, use Time:All instead)
CanonyesFileName +
Model +
DateTimeOriginal +
ShootingMode +
ShutterSpeed +
Aperture +
MeteringMode +
ExposureCompensation +
ISO +
Lens +
FocalLength +
ImageSize +
Quality +
Flash +
FlashType +
ConditionalFEC +
RedEyeReduction +
ShutterCurtainHack +
WhiteBalance +
FocusMode +
Contrast +
Sharpness +
Saturation +
ColorTone +
ColorSpace +
LongExposureNoiseReduction +
FileSize +
FileNumber +
DriveMode +
OwnerName +
SerialNumber
 
ColorSpaceTagsyesExifIFD:ColorSpace +
ExifIFD:Gamma +
InteropIFD:InteropIndex +
ICC_Profile
(standard tags which carry color space information. Useful for preserving +color space when deleting all other metadata)
CommonyesFileName +
FileSize +
Model +
DateTimeOriginal +
ImageSize +
Quality +
FocalLength +
ShutterSpeed +
Aperture +
ISO +
WhiteBalance +
Flash
 
CommonIFD0yesIFD0:ImageDescription +
IFD0:Make +
IFD0:Model +
IFD0:Software +
IFD0:ModifyDate +
IFD0:Artist +
IFD0:Copyright +
IFD0:Rating +
IFD0:RatingPercent +
IFD0:DNGLensInfo +
IFD0:PanasonicTitle +
IFD0:PanasonicTitle2 +
IFD0:XPTitle +
IFD0:XPComment +
IFD0:XPAuthor +
IFD0:XPKeywords +
IFD0:XPSubject
(common metadata tags found in IFD0 of TIFF-format images. Used to simpify +deletion of all metadata from these images. See +FAQ number 7 for details)
LargeTagsyesCanonVRD +
DLOData +
EXIF +
ICC_Profile +
IDCPreviewImage +
ImageData +
IPTC +
JpgFromRaw +
OriginalRawImage +
OtherImage +
PreviewImage +
ThumbnailImage +
TIFFPreview +
XML +
XMP +
ZoomedPreviewImage
(large binary data tags which may be excluded to reduce memory usage if +memory limitations are a problem)
MakerNotesyesMakerNotes +
MakerNoteApple +
MakerNoteCanon +
MakerNoteCasio +
MakerNoteCasio2 +
MakerNoteDJI +
MakerNoteDJIInfo +
MakerNoteFLIR +
MakerNoteFujiFilm +
MakerNoteGE +
MakerNoteGE2 +
MakerNoteHasselblad +
MakerNoteHP +
MakerNoteHP2 +
MakerNoteHP4 +
MakerNoteHP6 +
MakerNoteISL +
MakerNoteJVC +
MakerNoteJVCText +
MakerNoteKodak1a +
MakerNoteKodak1b +
MakerNoteKodak2 +
MakerNoteKodak3 +
MakerNoteKodak4 +
MakerNoteKodak5 +
MakerNoteKodak6a +
MakerNoteKodak6b +
MakerNoteKodak7 +
MakerNoteKodak8a +
MakerNoteKodak8b +
MakerNoteKodak8c +
MakerNoteKodak9 +
MakerNoteKodak10 +
MakerNoteKodak11 +
MakerNoteKodak12 +
MakerNoteKodakUnknown +
MakerNoteKyocera +
MakerNoteMinolta +
MakerNoteMinolta2 +
MakerNoteMinolta3 +
MakerNoteMotorola +
MakerNoteNikon +
MakerNoteNikon2 +
MakerNoteNikon3 +
MakerNoteNintendo +
MakerNoteOlympus +
MakerNoteOlympus2 +
MakerNoteOlympus3 +
MakerNoteLeica +
MakerNoteLeica2 +
MakerNoteLeica3 +
MakerNoteLeica4 +
MakerNoteLeica5 +
MakerNoteLeica6 +
MakerNoteLeica7 +
MakerNoteLeica8 +
MakerNoteLeica9 +
MakerNoteLeica10 +
MakerNotePanasonic +
MakerNotePanasonic2 +
MakerNotePanasonic3 +
MakerNotePentax +
MakerNotePentax2 +
MakerNotePentax3 +
MakerNotePentax4 +
MakerNotePentax5 +
MakerNotePentax6 +
MakerNotePhaseOne +
MakerNoteReconyx +
MakerNoteReconyx2 +
MakerNoteReconyx3 +
MakerNoteRicoh +
MakerNoteRicoh2 +
MakerNoteRicohPentax +
MakerNoteRicohText +
MakerNoteSamsung1a +
MakerNoteSamsung1b +
MakerNoteSamsung2 +
MakerNoteSanyo +
MakerNoteSanyoC4 +
MakerNoteSanyoPatch +
MakerNoteSigma +
MakerNoteSony +
MakerNoteSony2 +
MakerNoteSony3 +
MakerNoteSony4 +
MakerNoteSony5 +
MakerNoteSonyEricsson +
MakerNoteSonySRF +
MakerNoteUnknownText +
MakerNoteUnknownBinary +
MakerNoteUnknown
(useful when copying tags between files to either copy the maker notes as a +block or prevent it from being copied)
NikonyesModel +
SubSecDateTimeOriginal +
ShutterCount +
LensSpec +
FocalLength +
ImageSize +
ShutterSpeed +
Aperture +
ISO +
NoiseReduction +
ExposureProgram +
ExposureCompensation +
WhiteBalance +
WhiteBalanceFineTune +
ShootingMode +
Quality +
MeteringMode +
FocusMode +
ImageOptimization +
ToneComp +
ColorHue +
ColorSpace +
HueAdjustment +
Saturation +
Sharpness +
Flash +
FlashMode +
FlashExposureComp
 
UnsafeyesIFD0:YCbCrPositioning +
IFD0:YCbCrCoefficients +
IFD0:TransferFunction +
ExifIFD:ComponentsConfiguration +
ExifIFD:CompressedBitsPerPixel +
InteropIFD:InteropIndex +
InteropIFD:InteropVersion +
InteropIFD:RelatedImageWidth +
InteropIFD:RelatedImageHeight
(Unsafe tags in JPEG images which are normally not copied. Defined here +as a shortcut to use when rebuilding JPEG EXIF from scratch. See +FAQ number 20 for more information)
ls-lyesFilePermissions +
FileHardLinks +
FileUserID +
FileGroupID +
FileSize# +
FileModifyDate +
FileName
(mimics columns shown by Unix "ls -l" command. Includes some tags which are +extracted only if the API SystemTags option +is enabled)
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 1, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Sigma.html b/html/TagNames/Sigma.html new file mode 100644 index 0000000..6fc1f76 --- /dev/null +++ b/html/TagNames/Sigma.html @@ -0,0 +1,710 @@ + + + + +Sigma Tags + + + +

Sigma Tags

+

These tags are written by Sigma/Foveon cameras. In the early days Sigma was +a class leader by releasing their maker note specification to the public, +but since then they have deviated from this standard and newer camera models +are less than consistent about their metadata formats.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0002SerialNumberstring 
0x0003DriveModestring 
0x0004ResolutionModestring 
0x0005AFModestring 
0x0006FocusSettingstring 
0x0007WhiteBalancestring 
0x0008ExposureModestring'A' = Aperture-priority AE +
'M' = Manual +
'P' = Program AE +
'S' = Shutter speed priority AE
0x0009MeteringModestring8 = Multi-segment +
'A' = Average +
'C' = Center-weighted average
0x000aLensFocalRangestring 
0x000bColorSpacestring 
0x000cExposureCompensation +
ExposureAdjust?
string
rational64s
 
0x000dContrast +
Contrast
string
rational64s
 
0x000eShadow +
Shadow
string
rational64s
 
0x000fHighlight +
Highlight
string
rational64s
 
0x0010Saturation +
Saturation
string
rational64s
 
0x0011Sharpness +
Sharpness
string
rational64s
 
0x0012X3FillLight +
X3FillLight
string
rational64s
 
0x0014ColorAdjustment +
ColorAdjustment
string
rational64s[3]
 
0x0015AdjustmentModestring 
0x0016Qualitystring 
0x0017Firmwarestring 
0x0018Softwarestring 
0x0019AutoBracketstring 
0x001aPreviewImageStart +
ChrominanceNoiseReduction
int32u*
string
(Sigma Photo Pro writes ChrominanceNoiseReduction here, but various +models use this for PreviewImageStart)
0x001bPreviewImageLength +
LuminanceNoiseReduction
int32u*
string
(Sigma Photo Pro writes LuminanceNoiseReduction here, but various models use +this for PreviewImageLength)
0x001cPreviewImageSize +
PreviewImageStart
int16u[2]
int32u*
(PreviewImageStart for the SD1 and Merrill/Quattro models, and +PreviewImageSize for others)
0x001dMakerNoteVersion +
PreviewImageLength
undef
int32u*
(PreviewImageLength for the SD1 and Merrill/Quattro models, and +MakerNoteVersion for others)
0x001ePreviewImageSizeint16u[2](only valid for some models)
0x001fAFPoint +
MakerNoteVersion
string
undef
(MakerNoteVersion for the SD1 and Merrill/Quattro models, and AFPoint for +others)
0x0022FileFormatstring(models other than the SD1 and Merrill/Quattro models)
0x0024Calibrationstring(models other than the SD1 and Merrill/Quattro models)
0x0026FileFormatstring(some newer models only)
0x0027LensType +
LensType
string
int16u
(some newer models only) +
--> Sigma LensType Values +
(some other models like the fp) +
--> Sigma LensType Values
0x002aLensFocalRangerational64u[2](some newer models only)
0x002bLensMaxApertureRangerational64u[2](some newer models only)
0x002cColorModeint32u(not valid for some models) + +
0 = n/a +
1 = Sepia +
2 = B&W +
3 = Standard +
4 = Vivid
  5 = Neutral +
6 = Portrait +
7 = Landscape +
8 = FOV Classic Blue
+
0x0030LensApertureRange +
Calibration
string
string
(Calibration for the SD1 and Merrill/Quattro models, and LensApertureRange +for others. Note that LensApertureRange changes with focal length, and some +models report the maximum aperture here)
0x0031FNumberrational64u(models other than the SD1 and Merrill/Quattro models)
0x0032ExposureTimerational64u(models other than the SD1 and Merrill/Quattro models)
0x0033ExposureTime2string(models other than the SD1, SD9, SD15 and Merrill/Quattro models)
0x0034BurstShotint32u(models other than the SD1 and Merrill/Quattro models)
0x0035ExposureCompensationrational64s(models other than the SD1 and Merrill/Quattro models)
0x0039SensorTemperaturestring(models other than the SD1 and Merrill/Quattro models)
0x003aFlashExposureComprational64s(models other than the SD1 and Merrill/Quattro models)
0x003bFirmwarestring(models other than the SD1 and Merrill/Quattro models)
0x003cWhiteBalancestring(models other than the SD1 and Merrill/Quattro models)
0x003dPictureModestring(same as ColorMode, but "Standard" when ColorMode is Sepia or B&W)
0x0048LensApertureRangestring(some newer models only)
0x0049FNumberrational64u(some newer models only)
0x004aExposureTimerational64u(some newer models only)
0x004bExposureTime2string(SD1 and DP Merrill models only) +
(DP Quattro models only)
0x004dExposureCompensationrational64s(some newer models only)
0x0055SensorTemperaturestring(some newer models only)
0x0056FlashExposureComprational64s(some newer models only)
0x0057Firmware2string(some newer models only)
0x0058WhiteBalancestring(some newer models only)
0x0059DigitalFilterstring(some newer models only)
0x0084Modelstring 
0x0086ISOint16u 
0x0087ResolutionModestring 
0x0088WhiteBalancestring 
0x008cFirmwarestring 
0x011fCameraCalibrationfloat[9] 
0x0120WBSettings---> Sigma WBSettings Tags
0x0121WBSettings2---> Sigma WBSettings2 Tags
+ +

Sigma LensType Values

+

Sigma LensType values are hexadecimal numbers stored as a string (without +the leading "0x"). Decimal values have been added to differentiate lenses +which would otherwise have the same LensType, and are used by the Composite +LensID tag when attempting to identify the specific lens model.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueLensTypeValueLensType
0x10= Sigma 50mm F2.8 EX DG MACRO0x549= Sigma 28-70mm F2.8 EX DG
0x10.1= Sigma 70mm F2.8 EX DG Macro0x566= Sigma 70-200mm F2.8 EX IF APO
0x10.2= Sigma 105mm F2.8 EX DG Macro0x567= Sigma 70-200mm F2.8 EX IF HSM APO
0x16= Sigma 18-50mm F3.5-5.6 DC0x568= Sigma 70-200mm F2.8 EX DG IF HSM APO
0x103= Sigma 180mm F3.5 EX IF HSM APO Macro0x569= Sigma 70-200 F2.8 EX DG HSM APO Macro
0x104= Sigma 150mm F2.8 EX DG HSM APO Macro0x571= Sigma 24-70mm F2.8 IF EX DG HSM
0x105= Sigma 180mm F3.5 EX DG HSM APO Macro0x572= Sigma 70-300mm F4-5.6 DG OS
0x106= Sigma 150mm F2.8 EX DG OS HSM APO Macro0x576= Sigma 24-70mm F2.8 DG OS HSM | A
0x107= Sigma 180mm F2.8 EX DG OS HSM APO Macro0x579= Sigma 70-200mm F2.8 EX DG HSM APO Macro
0x129= Sigma Lens (0x129)0x580= Sigma 18-50mm F2.8 EX DC
0x129.1= Sigma 14mm F2.8 EX Aspherical0x581= Sigma 18-50mm F2.8 EX DC Macro
0x129.2= Sigma 30mm F1.40x582= Sigma 18-50mm F2.8 EX DC HSM Macro
0x131= Sigma Lens (0x131)0x583= Sigma 17-50mm F2.8 EX DC OS HSM
0x131.1= Sigma 17-70mm F2.8-4.5 DC Macro0x588= Sigma 24-35mm F2 DG HSM | A
0x131.2= Sigma 70-200mm F2.8 APO EX HSM0x589= Sigma APO 70-200mm F2.8 EX DG OS HSM
0x131.3= Sigma 120-300mm F2.8 APO EX IF HSM0x594= Sigma 300-800mm F5.6 EX HSM IF APO
0x134= Sigma 100-300mm F4 EX DG HSM APO0x595= Sigma 300-800mm F5.6 EX DG APO HSM
0x135= Sigma 120-300mm F2.8 EX DG HSM APO0x597= Sigma 200-500mm F2.8 APO EX DG
0x136= Sigma 120-300mm F2.8 EX DG OS HSM APO0x5a8= Sigma 70-300mm F4-5.6 APO DG Macro (Motorized)
0x137= Sigma 120-300mm F2.8 DG OS HSM | S0x5a9= Sigma 70-300mm F4-5.6 DG Macro (Motorized)
0x143= Sigma 600mm F8 Mirror0x605= Sigma 24-70mm F3.5-5.6 ASP HF
0x145= Sigma Lens (0x145)0x633= Sigma 28-70mm F2.8-4 HS
0x145.1= Sigma 15-30mm F3.5-4.5 EX DG Aspherical0x634= Sigma 28-70mm F2.8-4 DG
0x145.2= Sigma 18-50mm F2.8 EX DG0x635= Sigma 24-105mm F4 DG OS HSM | A
0x145.3= Sigma 20-40mm F2.8 EX DG0x644= Sigma 28-80mm F3.5-5.6 ASP HF Macro
0x150= Sigma 30mm F1.4 DC HSM0x659= Sigma 28-80mm F3.5-5.6 Mini Zoom Macro II ASP
0x152= Sigma Lens (0x152)0x661= Sigma 28-105mm F2.8-4 IF ASP
0x152.1= Sigma APO 800mm F5.6 EX DG HSM0x663= Sigma 28-105mm F3.8-5.6 IF UC-III ASP
0x152.2= Sigma 12-24mm F4.5-5.6 EX DG ASP HSM0x664= Sigma 28-105mm F2.8-4 IF DG ASP
0x152.3= Sigma 10-20mm F4-5.6 EX DC HSM0x667= Sigma 24-135mm F2.8-4.5 IF ASP
0x165= Sigma 70-200mm F2.8 EX0x668= Sigma 17-70mm F2.8-4 DC Macro OS HSM
0x169= Sigma 18-50mm F2.8 EX DC0x669= Sigma 17-70mm F2.8-4.5 DC HSM Macro
0x183= Sigma 500mm F4.5 EX HSM APO0x684= Sigma 55-200mm F4-5.6 DC
0x184= Sigma 500mm F4.5 EX DG HSM APO0x686= Sigma 50-200mm F4-5.6 DC OS HSM
0x185= Sigma 500mm F4 DG OS HSM | S0x689= Sigma 17-70mm F2.8-4.5 DC Macro
0x194= Sigma 300mm F2.8 EX HSM APO0x690= Sigma 50-150mm F2.8 EX DC HSM APO
0x195= Sigma 300mm F2.8 EX DG HSM APO0x691= Sigma 50-150mm F2.8 EX DC APO HSM II
0x200= Sigma 12-24mm F4.5-5.6 EX DG ASP HSM0x692= Sigma APO 50-150mm F2.8 EX DC OS HSM
0x201= Sigma 10-20mm F4-5.6 EX DC HSM0x693= Sigma 50-100mm F1.8 DC HSM | A
0x202= Sigma 10-20mm F3.5 EX DC HSM0x709= Sigma 28-135mm F3.8-5.6 IF ASP Macro
0x203= Sigma 8-16mm F4.5-5.6 DC HSM0x723= Sigma 135-400mm F4.5-5.6 ASP APO
0x204= Sigma 12-24mm F4.5-5.6 DG HSM II0x725= Sigma 80-400mm F4.5-5.6 EX OS
0x205= Sigma 12-24mm F4 DG HSM | A0x726= Sigma 80-400mm F4.5-5.6 EX DG OS APO
0x210= Sigma 18-35mm F1.8 DC HSM | A0x727= Sigma 135-400mm F4.5-5.6 DG ASP APO
0x240= Sigma 135mm F1.8 DG HSM | A0x728= Sigma 120-400mm F4.5-5.6 DG APO OS HSM
0x256= Sigma 105mm F2.8 EX Macro0x729= Sigma 100-400mm F5-6.3 DG OS HSM | C
0x257= Sigma 105mm F2.8 EX DG Macro0x730= Sigma 60-600mm F4.5-6.3 DG OS HSM | S
0x258= Sigma 105mm F2.8 EX DG OS HSM Macro0x733= Sigma 170-500mm F5-6.3 ASP APO
0x259= Sigma 105mm F1.4 DG HSM | A0x734= Sigma 170-500mm F5-6.3 DG ASP APO
0x270= Sigma 70mm F2.8 EX DG Macro0x735= Sigma 50-500mm F4-6.3 EX RF HSM APO
0x271= Sigma 70mm F2.8 DG Macro | A0x736= Sigma 50-500mm F4-6.3 EX DG HSM APO
0x300= Sigma 30mm F1.4 EX DC HSM0x737= Sigma 150-500mm F5-6.3 APO DG OS HSM
0x301= Sigma 30mm F1.4 DC HSM | A0x738= Sigma 50-500mm F4.5-6.3 APO DG OS HSM
0x302= Sigma 30mm F1.4 DC DN | C0x740= Sigma 150-600mm F5-6.3 DG OS HSM | S
0x310= Sigma 50mm F1.4 EX DG HSM0x745= Sigma 150-600mm F5-6.3 DG OS HSM | C
0x311= Sigma 50mm F1.4 DG HSM | A0x777= Sigma 18-200mm F3.5-6.3 DC
0x320= Sigma 85mm F1.4 EX DG HSM0x77d= Sigma 18-200mm F3.5-6.3 DC (Motorized)
0x321= Sigma 85mm F1.4 DG HSM | A0x785= Sigma 28-200mm F3.5-5.6 DL ASP IF HZM Macro
0x330= Sigma 30mm F2.8 EX DN0x787= Sigma 28-200mm F3.5-5.6 Compact ASP HZ Macro
0x340= Sigma 35mm F1.4 DG HSM0x789= Sigma 18-125mm F3.5-5.6 DC
0x345= Sigma 50mm F2.8 EX Macro0x790= Sigma 28-300mm F3.5-6.3 DL ASP IF HZM
0x346= Sigma 50mm F2.8 EX DG Macro0x793= Sigma 28-300mm F3.5-6.3 Macro
0x350= Sigma 60mm F2.8 DN | A0x794= Sigma 28-200mm F3.5-5.6 DG Compact ASP HZ Macro
0x400= Sigma 19mm F2.8 EX DN0x795= Sigma 28-300mm F3.5-6.3 DG Macro
0x401= Sigma 24mm F1.4 DG HSM | A0x823= Sigma 1.4X TC EX APO
0x411= Sigma 20mm F1.8 EX DG ASP RF0x824= Sigma 1.4X Teleconverter EX APO DG
0x412= Sigma 20mm F1.4 DG HSM | A0x853= Sigma 18-125mm F3.8-5.6 DC OS HSM
0x432= Sigma 24mm F1.8 EX DG ASP Macro0x861= Sigma 18-50mm F2.8-4.5 DC OS HSM
0x440= Sigma 28mm F1.8 EX DG ASP Macro0x870= Sigma 2.0X Teleconverter TC-2001
0x450= Sigma 14mm F1.8 DH HSM | A0x875= Sigma 2.0X TC EX APO
0x461= Sigma 14mm F2.8 EX ASP HSM0x876= Sigma 2.0X Teleconverter EX APO DG
0x475= Sigma 15mm F2.8 EX Diagonal FishEye0x879= Sigma 1.4X Teleconverter TC-1401
0x476= Sigma 15mm F2.8 EX DG Diagonal Fisheye0x880= Sigma 18-250mm F3.5-6.3 DC OS HSM
0x477= Sigma 10mm F2.8 EX DC HSM Fisheye0x882= Sigma 18-200mm F3.5-6.3 II DC OS HSM
0x483= Sigma 8mm F4 EX Circular Fisheye0x883= Sigma 18-250mm F3.5-6.3 DC Macro OS HSM
0x484= Sigma 8mm F4 EX DG Circular Fisheye0x884= Sigma 17-70mm F2.8-4 DC OS HSM Macro | C
0x485= Sigma 8mm F3.5 EX DG Circular Fisheye0x885= Sigma 18-200mm F3.5-6.3 DC OS HSM Macro | C
0x486= Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye0x886= Sigma 18-300mm F3.5-6.3 DC OS HSM Macro | C
0x504= Sigma 70-300mm F4-5.6 Macro Super0x888= Sigma 18-200mm F3.5-6.3 DC OS
0x505= Sigma APO 70-300mm F4-5.6 Macro Super0x890= Sigma Mount Converter MC-11
0x506= Sigma 70-300mm F4-5.6 APO Macro Super II0x929= Sigma 60mm F2.8 DN | A
0x507= Sigma 70-300mm F4-5.6 DL Macro Super II0x1003= Sigma 19mm F2.8
0x508= Sigma 70-300mm F4-5.6 DG APO Macro0x1004= Sigma 30mm F2.8
0x509= Sigma 70-300mm F4-5.6 DG Macro0x1005= Sigma 50mm F2.8 Macro
0x510= Sigma 17-35 F2.8-4 EX DG ASP0x1006= Sigma 19mm F2.8
0x512= Sigma 15-30mm F3.5-4.5 EX DG ASP DF0x1007= Sigma 30mm F2.8
0x513= Sigma 20-40mm F2.8 EX DG0x1008= Sigma 50mm F2.8 Macro
0x519= Sigma 17-35 F2.8-4 EX ASP HSM0x1009= Sigma 14mm F4
0x520= Sigma 100-300mm F4.5-6.7 DL0x6001= Sigma 150-600mm F5-6.3 DG OS HSM | S
0x521= Sigma 18-50mm F3.5-5.6 DC Macro0x6003= Sigma 45mm F2.8 DG DN | C
0x527= Sigma 100-300mm F4 EX IF HSM0x6006= Sigma 50mm F1.4 DG HSM | A
0x529= Sigma 120-300mm F2.8 EX HSM IF APO0x8005= Sigma 35mm F1.4 DG HSM | A
0x545= Sigma 28-70mm F2.8 EX ASP DF0x8009= Sigma 18-35mm F1.8 DC HSM | A
0x547= Sigma 24-60mm F2.8 EX DG0x8900= Sigma 70-300mm F4-5.6 DG OS
0x548= Sigma 24-70mm F2.8 EX DG Macro0xa100= Sigma 24-70mm F2.8 DG Macro
+ +

Sigma WBSettings Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0WB_RGBLevelsAutofloat[3] 
3WB_RGBLevelsDaylightfloat[3] 
6WB_RGBLevelsShadefloat[3] 
9WB_RGBLevelsOvercastfloat[3] 
12WB_RGBLevelsIncandescentfloat[3] 
15WB_RGBLevelsFluorescentfloat[3] 
18WB_RGBLevelsFlashfloat[3] 
21WB_RGBLevelsCustom1float[3] 
24WB_RGBLevelsCustom2float[3] 
27WB_RGBLevelsCustom3float[3] 
+ +

Sigma WBSettings2 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
0WB_RGBLevelsUnknown0?float[3] 
3WB_RGBLevelsUnknown1?float[3] 
6WB_RGBLevelsUnknown2?float[3] 
9WB_RGBLevelsUnknown3?float[3] 
12WB_RGBLevelsUnknown4?float[3] 
15WB_RGBLevelsUnknown5?float[3] 
18WB_RGBLevelsUnknown6?float[3] 
21WB_RGBLevelsUnknown7?float[3] 
24WB_RGBLevelsUnknown8?float[3] 
27WB_RGBLevelsUnknown9?float[3] 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Dec 11, 2019 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/SigmaRaw.html b/html/TagNames/SigmaRaw.html new file mode 100644 index 0000000..1e62ff0 --- /dev/null +++ b/html/TagNames/SigmaRaw.html @@ -0,0 +1,439 @@ + + + + +SigmaRaw Tags + + + +

SigmaRaw Tags

+

These tags are used in Sigma and Foveon RAW (.X3F) images. Metadata is also +extracted from the JpgFromRaw image if it exists (all models but the SD9 and +SD10). Currently, metadata may only be written to the embedded JpgFromRaw.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Header'Header---> SigmaRaw Header Tags
'Header4'Header4---> SigmaRaw Header4 Tags
'HeaderExt'HeaderExt---> SigmaRaw HeaderExt Tags
'IMA2'PreviewImage +
JpgFromRaw
no
no
 
'IMAG'PreviewImageno 
'PROP'Properties---> SigmaRaw Properties Tags
+ +

SigmaRaw Header Tags

+

Information extracted from the header of an X3F file.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001FileVersionno 
0x0002ImageUniqueIDno 
0x0006MarkBitsno 
0x0007ImageWidthno 
0x0008ImageHeightno 
0x0009Rotationno 
0x000aWhiteBalanceno 
0x0012SceneCaptureTypeno 
+ +

SigmaRaw Header4 Tags

+

Header information for version 4.0 or greater X3F.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1FileVersionno 
10ImageWidthno 
11ImageHeightno 
12Rotationno 
+ +

SigmaRaw HeaderExt Tags

+

Extended header data found in version 2.1 and 2.2 files

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000Unusedno 
0x0001ExposureAdjustno 
0x0002Contrastno 
0x0003Shadowno 
0x0004Highlightno 
0x0005Saturationno 
0x0006Sharpnessno 
0x0007RedAdjustno 
0x0008GreenAdjustno 
0x0009BlueAdjustno 
0x000aX3FillLightno 
+ +

SigmaRaw Properties Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'AEMODE'MeteringModeno8 = 8-segment +
'A' = Average +
'C' = Center-weighted average
'AFAREA'AFAreano 
'AFINFOCUS'AFInFocusno 
'AFMODE'FocusModeno 
'APERTURE'FNumberno 
'AP_DESC'ApertureDisplayedno 
'BRACKET'BracketShotno 
'BURST'BurstShotno 
'CAMMANUF'Makeno 
'CAMMODEL'Modelno 
'CAMNAME'CameraNameno 
'CAMSERIAL'SerialNumberno 
'CM_DESC'SceneCaptureTypeno 
'COLORSPACE'ColorSpaceno 
'DRIVE'DriveModeno + +
'10S' = 10 s Timer +
'2S' = 2 s Timer +
'AB' = Auto Bracket +
'MULTI' = Multi Shot
  'OFF' = Off +
'SINGLE' = Single Shot +
'UP' = Mirror Up
+
'EVAL_STATE'EvalStateno 
'EXPCOMP'ExposureCompensationno 
'EXPNET'NetExposureCompensationno 
'EXPTIME'IntegrationTimeno 
'FIRMVERS'FirmwareVersionno 
'FLASH'FlashModeno 
'FLASHEXPCOMP'FlashExpCompno 
'FLASHPOWER'FlashPowerno 
'FLASHTTLMODE'FlashTTLModeno 
'FLASHTYPE'FlashTypeno 
'FLENGTH'FocalLengthno 
'FLEQ35MM'FocalLengthIn35mmFormatno 
'FOCUS'Focusno'AF' = Auto-focus Locked +
'M' = Manual +
'NO LOCK' = Auto-focus Didn't Lock
'IMAGEBOARDID'ImageBoardIDno 
'IMAGERBOARDID'ImagerBoardIDno 
'IMAGERTEMP'SensorTemperatureno 
'ISO'ISOno 
'LENSARANGE'LensApertureRangeno 
'LENSFRANGE'LensFocalRangeno 
'LENSMODEL'LensTypeno--> Sigma LensType Values
'PMODE'ExposureProgramno'A' = Aperture Priority +
'M' = Manual +
'P' = Program +
'S' = Shutter Priority
'RESOLUTION'Qualityno'HI' = High +
'LOW' = Low +
'MED' = Medium
'SENSORID'SensorIDno 
'SHUTTER'ExposureTimeno 
'SH_DESC'ShutterSpeedDisplayedno 
'TIME'DateTimeOriginalno 
'VERSION_BF'VersionBFno 
'WB_DESC'WhiteBalanceno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 2, 2014 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Sony.html b/html/TagNames/Sony.html new file mode 100644 index 0000000..9fe3e80 --- /dev/null +++ b/html/TagNames/Sony.html @@ -0,0 +1,11835 @@ + + + + +Sony Tags + + + +

Sony Tags

+

The following information has been decoded from the MakerNotes of Sony +cameras. Some of these tags have been inherited from the Minolta +MakerNotes.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0010CameraInfo +
CameraInfo2 +
CameraInfo3 +
CameraInfoUnknown
-
-
-
-
--> Sony CameraInfo Tags +
--> Sony CameraInfo2 Tags +
--> Sony CameraInfo3 Tags +
--> Sony CameraInfoUnknown Tags
0x0020FocusInfo +
MoreInfo
-
-
--> Sony FocusInfo Tags +
--> Sony MoreInfo Tags
0x0102Qualityint32u +
0 = RAW +
1 = Super Fine +
2 = Fine +
3 = Standard +
4 = Economy +
5 = Extra Fine +
6 = RAW + JPEG/HEIF +
7 = Compressed RAW +
8 = Compressed RAW + JPEG +
9 = Light +
4294967295 = n/a
+
0x0104FlashExposureComprational64s 
0x0105Teleconverterint32u +
0x0 = None +
0x4 = Minolta/Sony AF 1.4x APO (D) (0x04) +
0x5 = Minolta/Sony AF 2x APO (D) (0x05) +
0x48 = Minolta/Sony AF 2x APO (D) +
0x50 = Minolta AF 2x APO II +
0x60 = Minolta AF 2x APO +
0x88 = Minolta/Sony AF 1.4x APO (D) +
0x90 = Minolta AF 1.4x APO II +
0xa0 = Minolta AF 1.4x APO
+
0x0112WhiteBalanceFineTuneint32u 
0x0114CameraSettings +
CameraSettings2 +
CameraSettings3 +
CameraSettingsUnknown
-
-
-
-
--> Sony CameraSettings Tags +
--> Sony CameraSettings2 Tags +
--> Sony CameraSettings3 Tags +
--> Sony CameraSettingsUnknown Tags
0x0115WhiteBalanceint32u +
0x0 = Auto +
0x1 = Color Temperature/Color Filter +
0x10 = Daylight +
0x20 = Cloudy +
0x30 = Shade +
0x40 = Tungsten +
0x50 = Flash +
0x60 = Fluorescent +
0x70 = Custom +
0x80 = Underwater
+
0x0116ExtraInfo +
ExtraInfo2 +
ExtraInfo3
-
-
-
--> Sony ExtraInfo Tags +
--> Sony ExtraInfo2 Tags +
--> Sony ExtraInfo3 Tags
0x0e00PrintIM---> PrintIM Tags
0x1000MultiBurstModeundef(MultiBurst tags valid only for models with this feature, like the F88) +
0 = Off +
1 = On
0x1001MultiBurstImageWidthint16u 
0x1002MultiBurstImageHeightint16u 
0x1003Panorama---> Sony Panorama Tags
0x2001PreviewImageundef(HD-size preview in JPEG images from almost all DSLR/SLT/ILCA/NEX/ILCE.)
0x2002Ratingint32u 
0x2004Contrastint32s 
0x2005Saturationint32s 
0x2006Sharpnessint32s 
0x2007Brightnessint32s 
0x2008LongExposureNoiseReductionint32u +
0x0 = Off +
0x1 = On (unused) +
0x10001 = On (dark subtracted) +
0xffff0000 = Off (65535) +
0xffff0001 = On (65535) +
0xffffffff = n/a
+
0x2009HighISONoiseReductionint16u + +
0 = Off +
1 = Low +
2 = Normal
  3 = High +
256 = Auto +
65535 = n/a
+
0x200aHDRint32u(stored as a 32-bit integer, but read as two 16-bit integers) +
[Value 0]
+ + +
0x0 = Off +
0x1 = Auto +
0x10 = 1.0 EV +
0x11 = 1.5 EV +
0x12 = 2.0 EV
  0x13 = 2.5 EV +
0x14 = 3.0 EV +
0x15 = 3.5 EV +
0x16 = 4.0 EV +
0x17 = 4.5 EV
  0x18 = 5.0 EV +
0x19 = 5.5 EV +
0x1a = 6.0 EV
+[Value 1] +
0x0 = Uncorrected image +
0x1 = HDR image (good) +
0x2 = HDR image (fail 1) +
0x3 = HDR image (fail 2)
0x200bMultiFrameNoiseReductionint32u(may not be valid for RS100) +
0 = Off +
1 = On +
255 = n/a
0x200ePictureEffectint16u +
0 = Off +
1 = Toy Camera +
2 = Pop Color +
3 = Posterization +
4 = Posterization B/W +
5 = Retro Photo +
6 = Soft High Key +
7 = Partial Color (red) +
8 = Partial Color (green) +
9 = Partial Color (blue) +
10 = Partial Color (yellow) +
13 = High Contrast Monochrome +
16 = Toy Camera (normal) +
17 = Toy Camera (cool) +
18 = Toy Camera (warm) +
19 = Toy Camera (green) +
20 = Toy Camera (magenta) +
32 = Soft Focus (low) +
33 = Soft Focus +
34 = Soft Focus (high) +
48 = Miniature (auto) +
49 = Miniature (top) +
50 = Miniature (middle horizontal) +
51 = Miniature (bottom) +
52 = Miniature (left) +
53 = Miniature (middle vertical) +
54 = Miniature (right) +
64 = HDR Painting (low) +
65 = HDR Painting +
66 = HDR Painting (high) +
80 = Rich-tone Monochrome +
97 = Water Color +
98 = Water Color 2 +
112 = Illustration (low) +
113 = Illustration +
114 = Illustration (high)
+
0x200fSoftSkinEffectint32u0 = Off +
1 = Low +
2 = Mid +
3 = High +
4294967295 = n/a
0x2010Tag2010a +
Tag2010b +
Tag2010c +
Tag2010d +
Tag2010e +
Tag2010f +
Tag2010g +
Tag2010h +
Tag2010i
-
-
-
-
-
-
-
-
-
--> Sony Tag2010a Tags +
--> Sony Tag2010b Tags +
--> Sony Tag2010c Tags +
--> Sony Tag2010d Tags +
--> Sony Tag2010e Tags +
--> Sony Tag2010f Tags +
--> Sony Tag2010g Tags +
--> Sony Tag2010h Tags +
--> Sony Tag2010i Tags
0x2011VignettingCorrectionint32u0 = Off +
2 = Auto +
4294967295 = n/a
0x2012LateralChromaticAberrationint32u0 = Off +
2 = Auto +
4294967295 = n/a
0x2013DistortionCorrectionSettingint32u0 = Off +
2 = Auto +
4294967295 = n/a
0x2014WBShiftAB_GMint32s[2](2 numbers: 1. positive is a shift toward amber, 2. positive is a shift +toward magenta)
0x2016AutoPortraitFramedint16u("Yes" if this image was created by the Auto Portrait Framing feature) +
0 = No +
1 = Yes
0x2017FlashActionint32u0 = Did not fire +
1 = Flash Fired +
2 = External Flash Fired +
3 = Wireless Controlled Flash Fired
0x201aElectronicFrontCurtainShutterint32u0 = Off +
1 = On
0x201bFocusModeint8u + +
0 = Manual +
2 = AF-S +
3 = AF-C
  4 = AF-A +
6 = DMF +
7 = AF-D
+
0x201cAFAreaModeSettingint8u(SLT models) +
0 = Wide +
4 = Local +
8 = Zone +
9 = Spot +
(NEX, ILCE and some DSC models)
+
0 = Wide +
1 = Center +
3 = Flexible Spot +
4 = Flexible Spot (LA-EA4) +
9 = Center (LA-EA4) +
11 = Zone +
12 = Expanded Flexible Spot
+(ILCA models) +
0 = Wide +
4 = Flexible Spot +
8 = Zone +
9 = Center +
12 = Expanded Flexible Spot
0x201dFlexibleSpotPositionint16u[2](X and Y coordinates of the AF point, valid only when AFAreaMode is Flexible +Spot)
0x201eAFPointSelectedint8u(SLT models or ILCE with LA-EA2/EA4) + +
0 = Auto +
1 = Center +
2 = Top +
3 = Upper-right +
4 = Right +
5 = Lower-right +
6 = Bottom +
7 = Lower-left +
8 = Left +
9 = Upper-left
  10 = Far Right +
11 = Far Left +
12 = Upper-middle +
13 = Near Right +
14 = Lower-middle +
15 = Near Left +
16 = Upper Far Right +
17 = Lower Far Right +
18 = Lower Far Left +
19 = Upper Far Left
+(ILCA-68 and ILCA-77M2) + + + + +
-1 = Auto +
0 = A5 +
1 = A6 +
2 = A7 +
3 = B2 +
4 = B3 +
5 = B4 +
6 = B5 +
7 = B6 +
8 = B7 +
9 = B8 +
10 = B9 +
11 = B10 +
12 = C1 +
13 = C2 +
14 = C3
  15 = C4 +
16 = C5 +
17 = C6 +
18 = C7 +
19 = C8 +
20 = C9 +
21 = C10 +
22 = C11 +
23 = D1 +
24 = D2 +
25 = D3 +
26 = D4 +
27 = D5 +
28 = D6 +
29 = D7 +
30 = D8
  31 = D9 +
32 = D10 +
33 = D11 +
34 = E1 +
35 = E2 +
36 = E3 +
37 = E4 +
38 = E5 +
39 = E6 (Center) +
40 = E7 +
41 = E8 +
42 = E9 +
43 = E10 +
44 = E11 +
45 = F1 +
46 = F2
  47 = F3 +
48 = F4 +
49 = F5 +
50 = F6 +
51 = F7 +
52 = F8 +
53 = F9 +
54 = F10 +
55 = F11 +
56 = G1 +
57 = G2 +
58 = G3 +
59 = G4 +
60 = G5 +
61 = G6 +
62 = G7
  63 = G8 +
64 = G9 +
65 = G10 +
66 = G11 +
67 = H2 +
68 = H3 +
69 = H4 +
70 = H5 +
71 = H6 +
72 = H7 +
73 = H8 +
74 = H9 +
75 = H10 +
76 = I5 +
77 = I6 +
78 = I7
+(ILCA-99M2 when AFAreaModeSetting is not Zone) + + + +
0 = Auto +
93 = A5 (93) +
94 = A6 (94) +
95 = A7 (95) +
106 = B2 (106) +
107 = B3 (107) +
108 = B4 (108) +
110 = B5 (110) +
111 = B6 (111) +
112 = B7 (112) +
114 = B8 (114) +
115 = B9 (115) +
116 = B10 (116) +
122 = C1 (122) +
123 = C2 (123) +
124 = C3 (124) +
125 = C4 (125) +
127 = C5 (127) +
128 = C6 (128) +
129 = C7 (129)
  131 = C8 (131) +
132 = C9 (132) +
133 = C10 (133) +
134 = C11 (134) +
139 = D1 (139) +
140 = D2 (140) +
141 = D3 (141) +
142 = D4 (142) +
144 = D5 (144) +
145 = D6 (145) +
146 = D7 (146) +
148 = D8 (148) +
149 = D9 (149) +
150 = D10 (150) +
151 = D11 (151) +
156 = E1 (156) +
157 = E2 (157) +
158 = E3 (158) +
159 = E4 (159) +
161 = E5 (161)
  162 = E6 (162, Center) +
163 = E7 (163) +
165 = E8 (165) +
166 = E9 (166) +
167 = E10 (167) +
168 = E11 (168) +
173 = F1 (173) +
174 = F2 (174) +
175 = F3 (175) +
176 = F4 (176) +
178 = F5 (178) +
179 = F6 (179) +
180 = F7 (180) +
182 = F8 (182) +
183 = F9 (183) +
184 = F10 (184) +
185 = F11 (185) +
190 = G1 (190) +
191 = G2 (191) +
192 = G3 (192)
  193 = G4 (193) +
195 = G5 (195) +
196 = G6 (196) +
197 = G7 (197) +
199 = G8 (199) +
200 = G9 (200) +
201 = G10 (201) +
202 = G11 (202) +
208 = H2 (208) +
209 = H3 (209) +
210 = H4 (210) +
212 = H5 (212) +
213 = H6 (213) +
214 = H7 (214) +
216 = H8 (216) +
217 = H9 (217) +
218 = H10 (218) +
229 = I5 (229) +
230 = I6 (230) +
231 = I7 (231)
+(ILCA models when AFAreaModeSetting is set to Zone) + +
0 = n/a +
1 = Top Left Zone +
2 = Top Zone +
3 = Top Right Zone +
4 = Left Zone
  5 = Center Zone +
6 = Right Zone +
7 = Bottom Left Zone +
8 = Bottom Zone +
9 = Bottom Right Zone
+(NEX and ILCE models) + +
0 = n/a +
1 = Center Zone +
2 = Top Zone +
3 = Right Zone +
4 = Left Zone
  5 = Bottom Zone +
6 = Bottom Right Zone +
7 = Bottom Left Zone +
8 = Top Left Zone +
9 = Top Right Zone
+
0x2020AFPointsUsedno(SLT models, or NEX/ILCE with A-mount lenses) + +
0x0 = (none) +
Bit 0 = Center +
Bit 1 = Top +
Bit 2 = Upper-right +
Bit 3 = Right +
Bit 4 = Lower-right +
Bit 5 = Bottom +
Bit 6 = Lower-left +
Bit 7 = Left +
Bit 8 = Upper-left
  Bit 9 = Far Right +
Bit 10 = Far Left +
Bit 11 = Upper-middle +
Bit 12 = Near Right +
Bit 13 = Lower-middle +
Bit 14 = Near Left +
Bit 15 = Upper Far Right +
Bit 16 = Lower Far Right +
Bit 17 = Lower Far Left +
Bit 18 = Upper Far Left
+(ILCA models) + + + +
0x0 = (none) +
Bit 0 = A5 +
Bit 1 = A6 +
Bit 2 = A7 +
Bit 3 = B2 +
Bit 4 = B3 +
Bit 5 = B4 +
Bit 6 = B5 +
Bit 7 = B6 +
Bit 8 = B7 +
Bit 9 = B8 +
Bit 10 = B9 +
Bit 11 = B10 +
Bit 12 = C1 +
Bit 13 = C2 +
Bit 14 = C3 +
Bit 15 = C4 +
Bit 16 = C5 +
Bit 17 = C6 +
Bit 18 = C7
  Bit 19 = C8 +
Bit 20 = C9 +
Bit 21 = C10 +
Bit 22 = C11 +
Bit 23 = D1 +
Bit 24 = D2 +
Bit 25 = D3 +
Bit 26 = D4 +
Bit 27 = D5 +
Bit 28 = D6 +
Bit 29 = D7 +
Bit 30 = D8 +
Bit 31 = D9 +
Bit 32 = D10 +
Bit 33 = D11 +
Bit 34 = E1 +
Bit 35 = E2 +
Bit 36 = E3 +
Bit 37 = E4 +
Bit 38 = E5
  Bit 39 = E6 +
Bit 40 = E7 +
Bit 41 = E8 +
Bit 42 = E9 +
Bit 43 = E10 +
Bit 44 = E11 +
Bit 45 = F1 +
Bit 46 = F2 +
Bit 47 = F3 +
Bit 48 = F4 +
Bit 49 = F5 +
Bit 50 = F6 +
Bit 51 = F7 +
Bit 52 = F8 +
Bit 53 = F9 +
Bit 54 = F10 +
Bit 55 = F11 +
Bit 56 = G1 +
Bit 57 = G2 +
Bit 58 = G3
  Bit 59 = G4 +
Bit 60 = G5 +
Bit 61 = G6 +
Bit 62 = G7 +
Bit 63 = G8 +
Bit 64 = G9 +
Bit 65 = G10 +
Bit 66 = G11 +
Bit 67 = H2 +
Bit 68 = H3 +
Bit 69 = H4 +
Bit 70 = H5 +
Bit 71 = H6 +
Bit 72 = H7 +
Bit 73 = H8 +
Bit 74 = H9 +
Bit 75 = H10 +
Bit 76 = I5 +
Bit 77 = I6 +
Bit 78 = I7
+
0x2021AFTrackingint8u0 = Off +
1 = Face tracking +
2 = Lock On AF
0x2022FocalPlaneAFPointsUsedno(On-sensor/focal-plane phase AF points for ILCE with hybrid AF) +
0x0 = (none) +
0x0 = (none)
0x2023MultiFrameNREffectint32u0 = Normal +
1 = High
0x2026WBShiftAB_GM_Preciseint32s[2]~(2 numbers: 1. positive is a shift toward amber, 2. positive is a shift +toward magenta)
0x2027FocusLocationint16u[4] 
0x2028VariableLowPassFilterint16u[2]'0 0' = n/a +
'1 0' = Off +
'1 1' = Standard +
'1 2' = High +
'65535 65535' = n/a
0x2029RAWFileTypeint16u0 = Compressed RAW +
1 = Uncompressed RAW +
2 = Lossless Compressed RAW +
65535 = n/a
0x202aTag202a---> Sony Tag202a Tags
0x202bPrioritySetInAWBint8u0 = Standard +
1 = Ambience +
2 = White
0x202cMeteringMode2int16u +
0x100 = Multi-segment +
0x200 = Center-weighted average +
0x301 = Spot (Standard) +
0x302 = Spot (Large) +
0x400 = Average +
0x500 = Highlight
+
0x202dExposureStandardAdjustmentrational64s 
0x202eQualityint16u[2] +
'0 0' = n/a +
'0 1' = Standard +
'0 2' = Fine +
'0 3' = Extra Fine +
'0 4' = Light +
'1 0' = RAW +
'1 1' = RAW + Standard +
'1 2' = RAW + Fine +
'1 3' = RAW + Extra Fine +
'1 4' = RAW + Light
+
0x202fPixelShiftInfoundef'00000000 0 0 0x0' = n/a
0x2031SerialNumberstring 
0x2032Shadowsint32s 
0x2033Highlightsint32s 
0x2034Fadeint32s 
0x2035SharpnessRangeint32s 
0x2036Clarityint32s 
0x2037FocusFrameSizeno(width and height of FocusFrame, centered on FocusLocation)
0x2039JPEG-HEIFSwitchint16u0 = JPEG +
1 = HEIF +
65535 = n/a
0x3000ShotInfo---> Sony ShotInfo Tags
0x900bTag900b---> Sony Tag900b Tags
0x9050Tag9050a +
Tag9050b +
Tag9050c
-
-
-
--> Sony Tag9050a Tags +
--> Sony Tag9050b Tags +
--> Sony Tag9050c Tags
0x9400Tag9400a +
Tag9400b +
Tag9400c
-
-
-
--> Sony Tag9400a Tags +
--> Sony Tag9400b Tags +
--> Sony Tag9400c Tags
0x9401Tag9401---> Sony Tag9401 Tags
0x9402Tag9402---> Sony Tag9402 Tags
0x9403Tag9403---> Sony Tag9403 Tags
0x9404Tag9404a +
Tag9404b +
Tag9404c
-
-
-
--> Sony Tag9404a Tags +
--> Sony Tag9404b Tags +
--> Sony Tag9404c Tags
0x9405Tag9405a +
Tag9405b
-
-
--> Sony Tag9405a Tags +
--> Sony Tag9405b Tags
0x9406Tag9406---> Sony Tag9406 Tags
0x940aTag940a---> Sony Tag940a Tags
0x940cTag940c---> Sony Tag940c Tags
0x940eAFInfo +
Tag940e
-
-
--> Sony AFInfo Tags +
--> Sony Tag940e Tags
0x9416Sony_0x9416---> Sony Tag9416 Tags
0xb000FileFormatint8u[4] + +
'0 0 0 2' = JPEG +
'1 0 0 0' = SR2 +
'2 0 0 0' = ARW 1.0 +
'3 0 0 0' = ARW 2.0 +
'3 1 0 0' = ARW 2.1 +
'3 2 0 0' = ARW 2.2
  '3 3 0 0' = ARW 2.3 +
'3 3 1 0' = ARW 2.3.1 +
'3 3 2 0' = ARW 2.3.2 +
'3 3 3 0' = ARW 2.3.3 +
'3 3 5 0' = ARW 2.3.5 +
'4 0 0 0' = ARW 4.0
+
0xb001SonyModelIDint16u + +
2 = DSC-R1 +
256 = DSLR-A100 +
257 = DSLR-A900 +
258 = DSLR-A700 +
259 = DSLR-A200 +
260 = DSLR-A350 +
261 = DSLR-A300 +
262 = DSLR-A900 (APS-C mode) +
263 = DSLR-A380/A390 +
264 = DSLR-A330 +
265 = DSLR-A230 +
266 = DSLR-A290 +
269 = DSLR-A850 +
270 = DSLR-A850 (APS-C mode) +
273 = DSLR-A550 +
274 = DSLR-A500 +
275 = DSLR-A450 +
278 = NEX-5 +
279 = NEX-3 +
280 = SLT-A33 +
281 = SLT-A55 / SLT-A55V +
282 = DSLR-A560 +
283 = DSLR-A580 +
284 = NEX-C3 +
285 = SLT-A35 +
286 = SLT-A65 / SLT-A65V +
287 = SLT-A77 / SLT-A77V +
288 = NEX-5N +
289 = NEX-7 +
290 = NEX-VG20E +
291 = SLT-A37 +
292 = SLT-A57 +
293 = NEX-F3 +
294 = SLT-A99 / SLT-A99V +
295 = NEX-6 +
296 = NEX-5R +
297 = DSC-RX100 +
298 = DSC-RX1 +
299 = NEX-VG900 +
300 = NEX-VG30E +
302 = ILCE-3000 / ILCE-3500 +
303 = SLT-A58 +
305 = NEX-3N +
306 = ILCE-7 +
307 = NEX-5T +
308 = DSC-RX100M2
  309 = DSC-RX10 +
310 = DSC-RX1R +
311 = ILCE-7R +
312 = ILCE-6000 +
313 = ILCE-5000 +
317 = DSC-RX100M3 +
318 = ILCE-7S +
319 = ILCA-77M2 +
339 = ILCE-5100 +
340 = ILCE-7M2 +
341 = DSC-RX100M4 +
342 = DSC-RX10M2 +
344 = DSC-RX1RM2 +
346 = ILCE-QX1 +
347 = ILCE-7RM2 +
350 = ILCE-7SM2 +
353 = ILCA-68 +
354 = ILCA-99M2 +
355 = DSC-RX10M3 +
356 = DSC-RX100M5 +
357 = ILCE-6300 +
358 = ILCE-9 +
360 = ILCE-6500 +
362 = ILCE-7RM3 +
363 = ILCE-7M3 +
364 = DSC-RX0 +
365 = DSC-RX10M4 +
366 = DSC-RX100M6 +
367 = DSC-HX99 +
369 = DSC-RX100M5A +
371 = ILCE-6400 +
372 = DSC-RX0M2 +
374 = DSC-RX100M7 +
375 = ILCE-7RM4 +
376 = ILCE-9M2 +
378 = ILCE-6600 +
379 = ILCE-6100 +
380 = ZV-1 +
381 = ILCE-7C +
382 = ZV-E10 +
383 = ILCE-7SM3 +
384 = ILCE-1 +
385 = ILME-FX3 +
386 = ILCE-7RM3A +
387 = ILCE-7RM4A +
388 = ILCE-7M4
+
0xb020CreativeStylestring +
'AdobeRGB' = Adobe RGB +
'Autumnleaves' = Autumn Leaves +
'BW' = B&W +
'Clear' = Clear +
'Deep' = Deep +
'FL' = FL +
'IN' = IN +
'Landscape' = Landscape +
'Light' = Light +
'Neutral' = Neutral +
'Nightview' = Night View/Portrait +
'None' = None +
'Portrait' = Portrait +
'Real' = Real +
'SH' = SH +
'Sepia' = Sepia +
'Standard' = Standard +
'Sunset' = Sunset +
'VV2' = Vivid 2 +
'Vivid' = Vivid
+
0xb021ColorTemperatureint32u 
0xb022ColorCompensationFilterint32u(negative is green, positive is magenta)
0xb023SceneModeint32u + +
0 = Standard +
1 = Portrait +
2 = Text +
3 = Night Scene +
4 = Sunset +
5 = Sports +
6 = Landscape +
7 = Night Portrait +
8 = Macro +
9 = Super Macro +
16 = Auto +
17 = Night View/Portrait +
18 = Sweep Panorama
  19 = Handheld Night Shot +
20 = Anti Motion Blur +
21 = Cont. Priority AE +
22 = Auto+ +
23 = 3D Sweep Panorama +
24 = Superior Auto +
25 = High Sensitivity +
26 = Fireworks +
27 = Food +
28 = Pet +
33 = HDR +
65535 = n/a
+
0xb024ZoneMatchingint32u0 = ISO Setting Used +
1 = High Key +
2 = Low Key
0xb025DynamicRangeOptimizerint32u + +
0 = Off +
1 = Standard +
2 = Advanced Auto +
3 = Auto +
8 = Advanced Lv1 +
9 = Advanced Lv2 +
10 = Advanced Lv3
  11 = Advanced Lv4 +
12 = Advanced Lv5 +
16 = Lv1 +
17 = Lv2 +
18 = Lv3 +
19 = Lv4 +
20 = Lv5
+
0xb026ImageStabilizationint32u0 = Off +
1 = On +
4294967295 = n/a
0xb027LensTypeint32u--> Sony LensType Values
0xb028MinoltaMakerNote---> Minolta Tags
0xb029ColorModeint32u + +
0 = Standard +
1 = Vivid +
2 = Portrait +
3 = Landscape +
4 = Sunset +
5 = Night View/Portrait +
6 = B&W +
7 = Adobe RGB +
12 = Neutral +
13 = Clear +
14 = Deep +
15 = Light +
16 = Autumn Leaves
  17 = Sepia +
18 = FL +
19 = Vivid 2 +
20 = IN +
21 = SH +
100 = Neutral +
101 = Clear +
102 = Deep +
103 = Light +
104 = Night View +
105 = Autumn Leaves +
255 = Off +
4294967295 = n/a
+
0xb02aLensSpecint8u[8](like LensInfo, but also specifies lens features: DT, E, ZA, G, SSM, SAM, +OSS, STF, Reflex, Macro and Fisheye)
0xb02bFullImageSizeint32u[2] 
0xb02cPreviewImageSizeint32u[2] 
0xb040Macroint16u0 = Off +
1 = On +
2 = Close Focus +
65535 = n/a
0xb041ExposureModeint16u + +
0 = Program AE +
1 = Portrait +
2 = Beach +
3 = Sports +
4 = Snow +
5 = Landscape +
6 = Auto +
7 = Aperture-priority AE +
8 = Shutter speed priority AE +
9 = Night Scene / Twilight +
10 = Hi-Speed Shutter +
11 = Twilight Portrait +
12 = Soft Snap/Portrait +
13 = Fireworks +
14 = Smile Shutter +
15 = Manual
  18 = High Sensitivity +
19 = Macro +
20 = Advanced Sports Shooting +
29 = Underwater +
33 = Food +
34 = Sweep Panorama +
35 = Handheld Night Shot +
36 = Anti Motion Blur +
37 = Pet +
38 = Backlight Correction HDR +
39 = Superior Auto +
40 = Background Defocus +
41 = Soft Skin +
42 = 3D Image +
65535 = n/a
+
0xb042FocusModeint16u(not valid for all models) +
1 = AF-S +
2 = AF-C +
4 = Permanent-AF +
65535 = n/a
0xb043AFAreaModeint16u(older models) + +
0 = Default +
1 = Multi +
2 = Center +
3 = Spot +
4 = Flexible Spot
  6 = Touch +
14 = Tracking +
15 = Face Tracking +
65535 = n/a
+(DSC-HX9V generation cameras) +
0 = Multi +
1 = Center +
2 = Spot +
3 = Flexible Spot +
10 = Selective (for Miniature effect) +
14 = Tracking +
15 = Face Tracking +
255 = Manual
+
0xb044AFIlluminatorint16u0 = Off +
1 = Auto +
65535 = n/a
0xb047JPEGQualityint16u0 = Standard +
1 = Fine +
2 = Extra Fine +
65535 = n/a
0xb048FlashLevelint16s + + +
-32768 = Low +
-9 = -9/3 +
-6 = -6/3 +
-5 = -5/3 +
-4 = -4/3 +
-3 = -3/3
  -2 = -2/3 +
-1 = -1/3 +
0 = Normal +
1 = +1/3 +
2 = +2/3 +
3 = +3/3
  4 = +4/3 +
5 = +5/3 +
6 = +6/3 +
9 = +9/3 +
128 = n/a +
32767 = High
+
0xb049ReleaseModeint16u +
0 = Normal +
2 = Continuous +
5 = Exposure Bracketing +
6 = White Balance Bracketing +
8 = DRO Bracketing +
65535 = n/a
+
0xb04aSequenceNumberint16u(shot number in continuous burst) +
0 = Single +
65535 = n/a
0xb04bAnti-Blurint16u0 = Off +
1 = On (Continuous) +
2 = On (Shooting) +
65535 = n/a
0xb04eFocusModeint16u(valid for DSC-HX9V generation and newer) +
0 = Manual +
2 = AF-S +
3 = AF-C +
5 = Semi-manual +
6 = DMF
0xb04fDynamicRangeOptimizerint16u0 = Off +
1 = Standard +
2 = Plus
0xb050HighISONoiseReduction2int16u(DSC models only) +
0 = Normal +
1 = High +
2 = Low +
3 = Off +
65535 = n/a
0xb052IntelligentAutoint16u0 = Off +
1 = On +
2 = Advanced
0xb054WhiteBalanceint16u(decoding of the Fluorescent settings matches the EXIF standard, which is +different than the names used by Sony for some models) +
0 = Auto +
4 = Custom +
5 = Daylight +
6 = Cloudy +
7 = Cool White Fluorescent +
8 = Day White Fluorescent +
9 = Daylight Fluorescent +
10 = Incandescent2 +
11 = Warm White Fluorescent +
14 = Incandescent +
15 = Flash +
17 = Underwater 1 (Blue Water) +
18 = Underwater 2 (Green Water) +
19 = Underwater Auto
+
+ +

Sony LensType Values

+

Decimal values have been added to differentiate lenses which would otherwise +have the same LensType, and are used by the Composite LensID tag when +attempting to identify the specific lens model. "New" or "II" appear in +brackets if the original version of the lens has the same LensType. Special +logic is employed to identify the attached lens when a Metabones Canon EF +adapter is used.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueLensType
0= Minolta AF 28-85mm F3.5-4.5 New
1= Minolta AF 80-200mm F2.8 HS-APO G
2= Minolta AF 28-70mm F2.8 G
3= Minolta AF 28-80mm F4-5.6
4= Minolta AF 85mm F1.4G
5= Minolta AF 35-70mm F3.5-4.5 [II]
6= Minolta AF 24-85mm F3.5-4.5 [New]
7= Minolta AF 100-300mm F4.5-5.6 APO [New] or 100-400mm or Sigma Lens
7.1= Minolta AF 100-400mm F4.5-6.7 APO
7.2= Sigma AF 100-300mm F4 EX DG IF
8= Minolta AF 70-210mm F4.5-5.6 [II]
9= Minolta AF 50mm F3.5 Macro
10= Minolta AF 28-105mm F3.5-4.5 [New]
11= Minolta AF 300mm F4 HS-APO G
12= Minolta AF 100mm F2.8 Soft Focus
13= Minolta AF 75-300mm F4.5-5.6 (New or II)
14= Minolta AF 100-400mm F4.5-6.7 APO
15= Minolta AF 400mm F4.5 HS-APO G
16= Minolta AF 17-35mm F3.5 G
17= Minolta AF 20-35mm F3.5-4.5
18= Minolta AF 28-80mm F3.5-5.6 II
19= Minolta AF 35mm F1.4 G
20= Minolta/Sony 135mm F2.8 [T4.5] STF
22= Minolta AF 35-80mm F4-5.6 II
23= Minolta AF 200mm F4 Macro APO G
24= Minolta/Sony AF 24-105mm F3.5-4.5 (D) or Sigma or Tamron Lens
24.1= Sigma 18-50mm F2.8
24.2= Sigma 17-70mm F2.8-4.5 DC Macro
24.3= Sigma 20-40mm F2.8 EX DG Aspherical IF
24.4= Sigma 18-200mm F3.5-6.3 DC
24.5= Sigma DC 18-125mm F4-5,6 D
24.6= Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical [IF] Macro
24.7= Sigma 15-30mm F3.5-4.5 EX DG Aspherical
25= Minolta AF 100-300mm F4.5-5.6 APO (D) or Sigma Lens
25.1= Sigma 100-300mm F4 EX (APO (D) or D IF)
25.2= Sigma 70mm F2.8 EX DG Macro
25.3= Sigma 20mm F1.8 EX DG Aspherical RF
25.4= Sigma 30mm F1.4 EX DC
25.5= Sigma 24mm F1.8 EX DG ASP Macro
27= Minolta AF 85mm F1.4 G (D)
28= Minolta/Sony AF 100mm F2.8 Macro (D) or Tamron Lens
28.1= Tamron SP AF 90mm F2.8 Di Macro
28.2= Tamron SP AF 180mm F3.5 Di LD [IF] Macro
29= Minolta/Sony AF 75-300mm F4.5-5.6 (D)
30= Minolta AF 28-80mm F3.5-5.6 (D) or Sigma Lens
30.1= Sigma AF 10-20mm F4-5.6 EX DC
30.2= Sigma AF 12-24mm F4.5-5.6 EX DG
30.3= Sigma 28-70mm EX DG F2.8
30.4= Sigma 55-200mm F4-5.6 DC
31= Minolta/Sony AF 50mm F2.8 Macro (D) or F3.5
31.1= Minolta/Sony AF 50mm F3.5 Macro
32= Minolta/Sony AF 300mm F2.8 G or 1.5x Teleconverter
33= Minolta/Sony AF 70-200mm F2.8 G
35= Minolta AF 85mm F1.4 G (D) Limited
36= Minolta AF 28-100mm F3.5-5.6 (D)
38= Minolta AF 17-35mm F2.8-4 (D)
39= Minolta AF 28-75mm F2.8 (D)
40= Minolta/Sony AF DT 18-70mm F3.5-5.6 (D)
41= Minolta/Sony AF DT 11-18mm F4.5-5.6 (D) or Tamron Lens
41.1= Tamron SP AF 11-18mm F4.5-5.6 Di II LD Aspherical IF
42= Minolta/Sony AF DT 18-200mm F3.5-6.3 (D)
43= Sony 35mm F1.4 G (SAL35F14G)
44= Sony 50mm F1.4 (SAL50F14)
45= Carl Zeiss Planar T* 85mm F1.4 ZA (SAL85F14Z)
46= Carl Zeiss Vario-Sonnar T* DT 16-80mm F3.5-4.5 ZA (SAL1680Z)
47= Carl Zeiss Sonnar T* 135mm F1.8 ZA (SAL135F18Z)
48= Carl Zeiss Vario-Sonnar T* 24-70mm F2.8 ZA SSM (SAL2470Z) or Other Lens
48.1= Carl Zeiss Vario-Sonnar T* 24-70mm F2.8 ZA SSM II (SAL2470Z2)
48.2= Tamron SP 24-70mm F2.8 Di USD
49= Sony DT 55-200mm F4-5.6 (SAL55200)
50= Sony DT 18-250mm F3.5-6.3 (SAL18250)
51= Sony DT 16-105mm F3.5-5.6 (SAL16105)
52= Sony 70-300mm F4.5-5.6 G SSM (SAL70300G) or G SSM II or Tamron Lens
52.1= Sony 70-300mm F4.5-5.6 G SSM II (SAL70300G2)
52.2= Tamron SP 70-300mm F4-5.6 Di USD
53= Sony 70-400mm F4-5.6 G SSM (SAL70400G)
54= Carl Zeiss Vario-Sonnar T* 16-35mm F2.8 ZA SSM (SAL1635Z) or ZA SSM II
54.1= Carl Zeiss Vario-Sonnar T* 16-35mm F2.8 ZA SSM II (SAL1635Z2)
55= Sony DT 18-55mm F3.5-5.6 SAM (SAL1855) or SAM II
55.1= Sony DT 18-55mm F3.5-5.6 SAM II (SAL18552)
56= Sony DT 55-200mm F4-5.6 SAM (SAL55200-2)
57= Sony DT 50mm F1.8 SAM (SAL50F18) or Tamron Lens or Commlite CM-EF-NEX adapter
57.1= Tamron SP AF 60mm F2 Di II LD [IF] Macro 1:1
57.2= Tamron 18-270mm F3.5-6.3 Di II PZD
58= Sony DT 30mm F2.8 Macro SAM (SAL30M28)
59= Sony 28-75mm F2.8 SAM (SAL2875)
60= Carl Zeiss Distagon T* 24mm F2 ZA SSM (SAL24F20Z)
61= Sony 85mm F2.8 SAM (SAL85F28)
62= Sony DT 35mm F1.8 SAM (SAL35F18)
63= Sony DT 16-50mm F2.8 SSM (SAL1650)
64= Sony 500mm F4 G SSM (SAL500F40G)
65= Sony DT 18-135mm F3.5-5.6 SAM (SAL18135)
66= Sony 300mm F2.8 G SSM II (SAL300F28G2)
67= Sony 70-200mm F2.8 G SSM II (SAL70200G2)
68= Sony DT 55-300mm F4.5-5.6 SAM (SAL55300)
69= Sony 70-400mm F4-5.6 G SSM II (SAL70400G2)
70= Carl Zeiss Planar T* 50mm F1.4 ZA SSM (SAL50F14Z)
128= Tamron or Sigma Lens (128)
128.1= Tamron AF 18-200mm F3.5-6.3 XR Di II LD Aspherical [IF] Macro
128.2= Tamron AF 28-300mm F3.5-6.3 XR Di LD Aspherical [IF] Macro
128.3= Tamron AF 28-200mm F3.8-5.6 XR Di Aspherical [IF] Macro
128.4= Tamron SP AF 17-35mm F2.8-4 Di LD Aspherical IF
128.5= Sigma AF 50-150mm F2.8 EX DC APO HSM II
128.6= Sigma 10-20mm F3.5 EX DC HSM
128.7= Sigma 70-200mm F2.8 II EX DG APO MACRO HSM
128.8= Sigma 10mm F2.8 EX DC HSM Fisheye
128.9= Sigma 50mm F1.4 EX DG HSM
128.10= Sigma 85mm F1.4 EX DG HSM
128.11= Sigma 24-70mm F2.8 IF EX DG HSM
128.12= Sigma 18-250mm F3.5-6.3 DC OS HSM
128.13= Sigma 17-50mm F2.8 EX DC HSM
128.14= Sigma 17-70mm F2.8-4 DC Macro HSM
128.15= Sigma 150mm F2.8 EX DG OS HSM APO Macro
128.16= Sigma 150-500mm F5-6.3 APO DG OS HSM
128.17= Tamron AF 28-105mm F4-5.6 [IF]
128.18= Sigma 35mm F1.4 DG HSM
128.19= Sigma 18-35mm F1.8 DC HSM
128.20= Sigma 50-500mm F4.5-6.3 APO DG OS HSM
128.21= Sigma 24-105mm F4 DG HSM | A
128.22= Sigma 30mm F1.4
128.23= Sigma 35mm F1.4 DG HSM | A
128.24= Sigma 105mm F2.8 EX DG OS HSM Macro
128.25= Sigma 180mm F2.8 EX DG OS HSM APO Macro
128.26= Sigma 18-300mm F3.5-6.3 DC Macro HSM | C
128.27= Sigma 18-50mm F2.8-4.5 DC HSM
129= Tamron Lens (129)
129.1= Tamron 200-400mm F5.6 LD
129.2= Tamron 70-300mm F4-5.6 LD
131= Tamron 20-40mm F2.7-3.5 SP Aspherical IF
135= Vivitar 28-210mm F3.5-5.6
136= Tokina EMZ M100 AF 100mm F3.5
137= Cosina 70-210mm F2.8-4 AF
138= Soligor 19-35mm F3.5-4.5
139= Tokina AF 28-300mm F4-6.3
142= Cosina AF 70-300mm F4.5-5.6 MC
146= Voigtlander Macro APO-Lanthar 125mm F2.5 SL
194= Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical [IF]
202= Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro
203= Tamron SP 70-200mm F2.8 Di USD
204= Tamron SP 24-70mm F2.8 Di USD
212= Tamron 28-300mm F3.5-6.3 Di PZD
213= Tamron 16-300mm F3.5-6.3 Di II PZD Macro
214= Tamron SP 150-600mm F5-6.3 Di USD
215= Tamron SP 15-30mm F2.8 Di USD
216= Tamron SP 45mm F1.8 Di USD
217= Tamron SP 35mm F1.8 Di USD
218= Tamron SP 90mm F2.8 Di Macro 1:1 USD (F017)
220= Tamron SP 150-600mm F5-6.3 Di USD G2
224= Tamron SP 90mm F2.8 Di Macro 1:1 USD (F004)
255= Tamron Lens (255)
255.1= Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical
255.2= Tamron AF 18-250mm F3.5-6.3 XR Di II LD
255.3= Tamron AF 55-200mm F4-5.6 Di II LD Macro
255.4= Tamron AF 70-300mm F4-5.6 Di LD Macro 1:2
255.5= Tamron SP AF 200-500mm F5.0-6.3 Di LD IF
255.6= Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical IF
255.7= Tamron SP AF 70-200mm F2.8 Di LD IF Macro
255.8= Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical IF
255.9= Tamron AF 90-300mm F4.5-5.6 Telemacro
1868= Sigma MC-11 SA-E Mount Converter with not-supported Sigma lens
2550= Minolta AF 50mm F1.7
2551= Minolta AF 35-70mm F4 or Other Lens
2551.1= Sigma UC AF 28-70mm F3.5-4.5
2551.2= Sigma AF 28-70mm F2.8
2551.3= Sigma M-AF 70-200mm F2.8 EX Aspherical
2551.4= Quantaray M-AF 35-80mm F4-5.6
2551.5= Tokina 28-70mm F2.8-4.5 AF
2552= Minolta AF 28-85mm F3.5-4.5 or Other Lens
2552.1= Tokina 19-35mm F3.5-4.5
2552.2= Tokina 28-70mm F2.8 AT-X
2552.3= Tokina 80-400mm F4.5-5.6 AT-X AF II 840
2552.4= Tokina AF PRO 28-80mm F2.8 AT-X 280
2552.5= Tokina AT-X PRO [II] AF 28-70mm F2.6-2.8 270
2552.6= Tamron AF 19-35mm F3.5-4.5
2552.7= Angenieux AF 28-70mm F2.6
2552.8= Tokina AT-X 17 AF 17mm F3.5
2552.9= Tokina 20-35mm F3.5-4.5 II AF
2553= Minolta AF 28-135mm F4-4.5 or Other Lens
2553.1= Sigma ZOOM-alpha 35-135mm F3.5-4.5
2553.2= Sigma 28-105mm F2.8-4 Aspherical
2553.3= Sigma 28-105mm F4-5.6 UC
2553.4= Tokina AT-X 242 AF 24-200mm F3.5-5.6
2554= Minolta AF 35-105mm F3.5-4.5
2555= Minolta AF 70-210mm F4 Macro or Sigma Lens
2555.1= Sigma 70-210mm F4-5.6 APO
2555.2= Sigma M-AF 70-200mm F2.8 EX APO
2555.3= Sigma 75-200mm F2.8-3.5
2556= Minolta AF 135mm F2.8
2557= Minolta/Sony AF 28mm F2.8
2558= Minolta AF 24-50mm F4
2560= Minolta AF 100-200mm F4.5
2561= Minolta AF 75-300mm F4.5-5.6 or Sigma Lens
2561.1= Sigma 70-300mm F4-5.6 DL Macro
2561.2= Sigma 300mm F4 APO Macro
2561.3= Sigma AF 500mm F4.5 APO
2561.4= Sigma AF 170-500mm F5-6.3 APO Aspherical
2561.5= Tokina AT-X AF 300mm F4
2561.6= Tokina AT-X AF 400mm F5.6 SD
2561.7= Tokina AF 730 II 75-300mm F4.5-5.6
2561.8= Sigma 800mm F5.6 APO
2561.9= Sigma AF 400mm F5.6 APO Macro
2561.10= Sigma 1000mm F8 APO
2562= Minolta AF 50mm F1.4 [New]
2563= Minolta AF 300mm F2.8 APO or Sigma Lens
2563.1= Sigma AF 50-500mm F4-6.3 EX DG APO
2563.2= Sigma AF 170-500mm F5-6.3 APO Aspherical
2563.3= Sigma AF 500mm F4.5 EX DG APO
2563.4= Sigma 400mm F5.6 APO
2564= Minolta AF 50mm F2.8 Macro or Sigma Lens
2564.1= Sigma 50mm F2.8 EX Macro
2565= Minolta AF 600mm F4 APO
2566= Minolta AF 24mm F2.8 or Sigma Lens
2566.1= Sigma 17-35mm F2.8-4 EX Aspherical
2572= Minolta/Sony AF 500mm F8 Reflex
2578= Minolta/Sony AF 16mm F2.8 Fisheye or Sigma Lens
2578.1= Sigma 8mm F4 EX [DG] Fisheye
2578.2= Sigma 14mm F3.5
2578.3= Sigma 15mm F2.8 Fisheye
2579= Minolta/Sony AF 20mm F2.8 or Tokina Lens
2579.1= Tokina AT-X Pro DX 11-16mm F2.8
2581= Minolta AF 100mm F2.8 Macro [New] or Sigma or Tamron Lens
2581.1= Sigma AF 90mm F2.8 Macro
2581.2= Sigma AF 105mm F2.8 EX [DG] Macro
2581.3= Sigma 180mm F5.6 Macro
2581.4= Sigma 180mm F3.5 EX DG Macro
2581.5= Tamron 90mm F2.8 Macro
2585= Minolta AF 35-105mm F3.5-4.5 New or Tamron Lens
2585.1= Beroflex 35-135mm F3.5-4.5
2585.2= Tamron 24-135mm F3.5-5.6
2588= Minolta AF 70-210mm F3.5-4.5
2589= Minolta AF 80-200mm F2.8 APO or Tokina Lens
2589.1= Tokina 80-200mm F2.8
2590= Minolta AF 200mm F2.8 G APO + Minolta AF 1.4x APO or Other Lens + 1.4x
2590.1= Minolta AF 600mm F4 HS-APO G + Minolta AF 1.4x APO
2591= Minolta AF 35mm F1.4
2592= Minolta AF 85mm F1.4 G (D)
2593= Minolta AF 200mm F2.8 APO
2594= Minolta AF 3x-1x F1.7-2.8 Macro
2596= Minolta AF 28mm F2
2597= Minolta AF 35mm F2 [New]
2598= Minolta AF 100mm F2
2601= Minolta AF 200mm F2.8 G APO + Minolta AF 2x APO or Other Lens + 2x
2601.1= Minolta AF 600mm F4 HS-APO G + Minolta AF 2x APO
2604= Minolta AF 80-200mm F4.5-5.6
2605= Minolta AF 35-80mm F4-5.6
2606= Minolta AF 100-300mm F4.5-5.6
2607= Minolta AF 35-80mm F4-5.6
2608= Minolta AF 300mm F2.8 HS-APO G
2609= Minolta AF 600mm F4 HS-APO G
2612= Minolta AF 200mm F2.8 HS-APO G
2613= Minolta AF 50mm F1.7 New
2615= Minolta AF 28-105mm F3.5-4.5 xi
2616= Minolta AF 35-200mm F4.5-5.6 xi
2618= Minolta AF 28-80mm F4-5.6 xi
2619= Minolta AF 80-200mm F4.5-5.6 xi
2620= Minolta AF 28-70mm F2.8 G
2621= Minolta AF 100-300mm F4.5-5.6 xi
2624= Minolta AF 35-80mm F4-5.6 Power Zoom
2628= Minolta AF 80-200mm F2.8 HS-APO G
2629= Minolta AF 85mm F1.4 New
2631= Minolta AF 100-300mm F4.5-5.6 APO
2632= Minolta AF 24-50mm F4 New
2638= Minolta AF 50mm F2.8 Macro New
2639= Minolta AF 100mm F2.8 Macro
2641= Minolta/Sony AF 20mm F2.8 New
2642= Minolta AF 24mm F2.8 New
2644= Minolta AF 100-400mm F4.5-6.7 APO
2662= Minolta AF 50mm F1.4 New
2667= Minolta AF 35mm F2 New
2668= Minolta AF 28mm F2 New
2672= Minolta AF 24-105mm F3.5-4.5 (D)
3046= Metabones Canon EF Speed Booster
4567= Tokina 70-210mm F4-5.6
4568= Tokina AF 35-200mm F4-5.6 Zoom SD
4570= Tamron AF 35-135mm F3.5-4.5
4571= Vivitar 70-210mm F4.5-5.6
4574= 2x Teleconverter or Tamron or Tokina Lens
4574.1= Tamron SP AF 90mm F2.5
4574.2= Tokina RF 500mm F8.0 x2
4574.3= Tokina 300mm F2.8 x2
4575= 1.4x Teleconverter
4585= Tamron SP AF 300mm F2.8 LD IF
4586= Tamron SP AF 35-105mm F2.8 LD Aspherical IF
4587= Tamron AF 70-210mm F2.8 SP LD
4812= Metabones Canon EF Speed Booster Ultra
6118= Canon EF Adapter
6528= Sigma 16mm F2.8 Filtermatic Fisheye
6553= E-Mount, T-Mount, Other Lens or no lens
6553.1= Arax MC 35mm F2.8 Tilt+Shift
6553.2= Arax MC 80mm F2.8 Tilt+Shift
6553.3= Zenitar MF 16mm F2.8 Fisheye M42
6553.4= Samyang 500mm Mirror F8.0
6553.5= Pentacon Auto 135mm F2.8
6553.6= Pentacon Auto 29mm F2.8
6553.7= Helios 44-2 58mm F2.0
18688= Sigma MC-11 SA-E Mount Converter with not-supported Sigma lens
25501= Minolta AF 50mm F1.7
25511= Minolta AF 35-70mm F4 or Other Lens
25511.1= Sigma UC AF 28-70mm F3.5-4.5
25511.2= Sigma AF 28-70mm F2.8
25511.3= Sigma M-AF 70-200mm F2.8 EX Aspherical
25511.4= Quantaray M-AF 35-80mm F4-5.6
25511.5= Tokina 28-70mm F2.8-4.5 AF
25521= Minolta AF 28-85mm F3.5-4.5 or Other Lens
25521.1= Tokina 19-35mm F3.5-4.5
25521.2= Tokina 28-70mm F2.8 AT-X
25521.3= Tokina 80-400mm F4.5-5.6 AT-X AF II 840
25521.4= Tokina AF PRO 28-80mm F2.8 AT-X 280
25521.5= Tokina AT-X PRO [II] AF 28-70mm F2.6-2.8 270
25521.6= Tamron AF 19-35mm F3.5-4.5
25521.7= Angenieux AF 28-70mm F2.6
25521.8= Tokina AT-X 17 AF 17mm F3.5
25521.9= Tokina 20-35mm F3.5-4.5 II AF
25531= Minolta AF 28-135mm F4-4.5 or Other Lens
25531.1= Sigma ZOOM-alpha 35-135mm F3.5-4.5
25531.2= Sigma 28-105mm F2.8-4 Aspherical
25531.3= Sigma 28-105mm F4-5.6 UC
25531.4= Tokina AT-X 242 AF 24-200mm F3.5-5.6
25541= Minolta AF 35-105mm F3.5-4.5
25551= Minolta AF 70-210mm F4 Macro or Sigma Lens
25551.1= Sigma 70-210mm F4-5.6 APO
25551.2= Sigma M-AF 70-200mm F2.8 EX APO
25551.3= Sigma 75-200mm F2.8-3.5
25561= Minolta AF 135mm F2.8
25571= Minolta/Sony AF 28mm F2.8
25581= Minolta AF 24-50mm F4
25601= Minolta AF 100-200mm F4.5
25611= Minolta AF 75-300mm F4.5-5.6 or Sigma Lens
25611.1= Sigma 70-300mm F4-5.6 DL Macro
25611.2= Sigma 300mm F4 APO Macro
25611.3= Sigma AF 500mm F4.5 APO
25611.4= Sigma AF 170-500mm F5-6.3 APO Aspherical
25611.5= Tokina AT-X AF 300mm F4
25611.6= Tokina AT-X AF 400mm F5.6 SD
25611.7= Tokina AF 730 II 75-300mm F4.5-5.6
25611.8= Sigma 800mm F5.6 APO
25611.9= Sigma AF 400mm F5.6 APO Macro
25611.10= Sigma 1000mm F8 APO
25621= Minolta AF 50mm F1.4 [New]
25631= Minolta AF 300mm F2.8 APO or Sigma Lens
25631.1= Sigma AF 50-500mm F4-6.3 EX DG APO
25631.2= Sigma AF 170-500mm F5-6.3 APO Aspherical
25631.3= Sigma AF 500mm F4.5 EX DG APO
25631.4= Sigma 400mm F5.6 APO
25641= Minolta AF 50mm F2.8 Macro or Sigma Lens
25641.1= Sigma 50mm F2.8 EX Macro
25651= Minolta AF 600mm F4 APO
25661= Minolta AF 24mm F2.8 or Sigma Lens
25661.1= Sigma 17-35mm F2.8-4 EX Aspherical
25721= Minolta/Sony AF 500mm F8 Reflex
25781= Minolta/Sony AF 16mm F2.8 Fisheye or Sigma Lens
25781.1= Sigma 8mm F4 EX [DG] Fisheye
25781.2= Sigma 14mm F3.5
25781.3= Sigma 15mm F2.8 Fisheye
25791= Minolta/Sony AF 20mm F2.8 or Tokina Lens
25791.1= Tokina AT-X Pro DX 11-16mm F2.8
25811= Minolta AF 100mm F2.8 Macro [New] or Sigma or Tamron Lens
25811.1= Sigma AF 90mm F2.8 Macro
25811.2= Sigma AF 105mm F2.8 EX [DG] Macro
25811.3= Sigma 180mm F5.6 Macro
25811.4= Sigma 180mm F3.5 EX DG Macro
25811.5= Tamron 90mm F2.8 Macro
25851= Beroflex 35-135mm F3.5-4.5
25858= Minolta AF 35-105mm F3.5-4.5 New or Tamron Lens
25858.1= Tamron 24-135mm F3.5-5.6
25881= Minolta AF 70-210mm F3.5-4.5
25891= Minolta AF 80-200mm F2.8 APO or Tokina Lens
25891.1= Tokina 80-200mm F2.8
25901= Minolta AF 200mm F2.8 G APO + Minolta AF 1.4x APO or Other Lens + 1.4x
25901.1= Minolta AF 600mm F4 HS-APO G + Minolta AF 1.4x APO
25911= Minolta AF 35mm F1.4
25921= Minolta AF 85mm F1.4 G (D)
25931= Minolta AF 200mm F2.8 APO
25941= Minolta AF 3x-1x F1.7-2.8 Macro
25961= Minolta AF 28mm F2
25971= Minolta AF 35mm F2 [New]
25981= Minolta AF 100mm F2
26011= Minolta AF 200mm F2.8 G APO + Minolta AF 2x APO or Other Lens + 2x
26011.1= Minolta AF 600mm F4 HS-APO G + Minolta AF 2x APO
26041= Minolta AF 80-200mm F4.5-5.6
26051= Minolta AF 35-80mm F4-5.6
26061= Minolta AF 100-300mm F4.5-5.6
26071= Minolta AF 35-80mm F4-5.6
26081= Minolta AF 300mm F2.8 HS-APO G
26091= Minolta AF 600mm F4 HS-APO G
26121= Minolta AF 200mm F2.8 HS-APO G
26131= Minolta AF 50mm F1.7 New
26151= Minolta AF 28-105mm F3.5-4.5 xi
26161= Minolta AF 35-200mm F4.5-5.6 xi
26181= Minolta AF 28-80mm F4-5.6 xi
26191= Minolta AF 80-200mm F4.5-5.6 xi
26201= Minolta AF 28-70mm F2.8 G
26211= Minolta AF 100-300mm F4.5-5.6 xi
26241= Minolta AF 35-80mm F4-5.6 Power Zoom
26281= Minolta AF 80-200mm F2.8 HS-APO G
26291= Minolta AF 85mm F1.4 New
26311= Minolta AF 100-300mm F4.5-5.6 APO
26321= Minolta AF 24-50mm F4 New
26381= Minolta AF 50mm F2.8 Macro New
26391= Minolta AF 100mm F2.8 Macro
26411= Minolta/Sony AF 20mm F2.8 New
26421= Minolta AF 24mm F2.8 New
26441= Minolta AF 100-400mm F4.5-6.7 APO
26621= Minolta AF 50mm F1.4 New
26671= Minolta AF 35mm F2 New
26681= Minolta AF 28mm F2 New
26721= Minolta AF 24-105mm F3.5-4.5 (D)
30464= Metabones Canon EF Speed Booster
45671= Tokina 70-210mm F4-5.6
45681= Tokina AF 35-200mm F4-5.6 Zoom SD
45701= Tamron AF 35-135mm F3.5-4.5
45711= Vivitar 70-210mm F4.5-5.6
45741= 2x Teleconverter or Tamron or Tokina Lens
45741.1= Tamron SP AF 90mm F2.5
45741.2= Tokina RF 500mm F8.0 x2
45741.3= Tokina 300mm F2.8 x2
45751= 1.4x Teleconverter
45851= Tamron SP AF 300mm F2.8 LD IF
45861= Tamron SP AF 35-105mm F2.8 LD Aspherical IF
45871= Tamron AF 70-210mm F2.8 SP LD
48128= Metabones Canon EF Speed Booster Ultra
61184= Canon EF Adapter
65280= Sigma 16mm F2.8 Filtermatic Fisheye
65535= E-Mount, T-Mount, Other Lens or no lens
65535.1= Arax MC 35mm F2.8 Tilt+Shift
65535.2= Arax MC 80mm F2.8 Tilt+Shift
65535.3= Zenitar MF 16mm F2.8 Fisheye M42
65535.4= Samyang 500mm Mirror F8.0
65535.5= Pentacon Auto 135mm F2.8
65535.6= Pentacon Auto 29mm F2.8
65535.7= Helios 44-2 58mm F2.0
+ +

Sony CameraInfo Tags

+

Camera information for the A700, A850 and A900.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensSpecundef[8] 
20FocusModeSettingint8u(FocusModeSetting for the A700, A850 and A900) +
0 = Manual +
1 = AF-S +
2 = AF-C +
3 = AF-A +
4 = DMF
21AFPointSelectedint8u + +
0 = Auto +
1 = Center +
2 = Top +
3 = Upper-right +
4 = Right +
5 = Lower-right
  6 = Bottom +
7 = Lower-left +
8 = Left +
9 = Upper-left +
10 = Far Right +
11 = Far Left
+
25AFPointint8u + +
0 = Upper-left +
1 = Left +
2 = Lower-left +
3 = Far Left +
4 = Bottom Assist-left +
5 = Bottom +
6 = Bottom Assist-right +
7 = Center (7) +
8 = Center (horizontal) +
9 = Center (9) +
10 = Center (10) +
11 = Center (11)
  12 = Center (12) +
13 = Center (vertical) +
14 = Center (14) +
15 = Top Assist-left +
16 = Top +
17 = Top Assist-right +
18 = Far Right +
19 = Upper-right +
20 = Right +
21 = Lower-right +
22 = Center F2.8
+
30AFStatusActiveSensorint16s + +
-32768 = Out of Focus  0 = In Focus
+
32AFStatusUpper-leftint16s + +
-32768 = Out of Focus  0 = In Focus
+
34AFStatusLeftint16s + +
-32768 = Out of Focus  0 = In Focus
+
36AFStatusLower-leftint16s + +
-32768 = Out of Focus  0 = In Focus
+
38AFStatusFarLeftint16s + +
-32768 = Out of Focus  0 = In Focus
+
40AFStatusBottomAssist-leftint16s + +
-32768 = Out of Focus  0 = In Focus
+
42AFStatusBottomint16s + +
-32768 = Out of Focus  0 = In Focus
+
44AFStatusBottomAssist-rightint16s + +
-32768 = Out of Focus  0 = In Focus
+
46AFStatusCenter-7int16s + +
-32768 = Out of Focus  0 = In Focus
+
48AFStatusCenter-horizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
50AFStatusCenter-9int16s + +
-32768 = Out of Focus  0 = In Focus
+
52AFStatusCenter-10int16s + +
-32768 = Out of Focus  0 = In Focus
+
54AFStatusCenter-11int16s + +
-32768 = Out of Focus  0 = In Focus
+
56AFStatusCenter-12int16s + +
-32768 = Out of Focus  0 = In Focus
+
58AFStatusCenter-verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
60AFStatusCenter-14int16s + +
-32768 = Out of Focus  0 = In Focus
+
62AFStatusTopAssist-leftint16s + +
-32768 = Out of Focus  0 = In Focus
+
64AFStatusTopint16s + +
-32768 = Out of Focus  0 = In Focus
+
66AFStatusTopAssist-rightint16s + +
-32768 = Out of Focus  0 = In Focus
+
68AFStatusFarRightint16s + +
-32768 = Out of Focus  0 = In Focus
+
70AFStatusUpper-rightint16s + +
-32768 = Out of Focus  0 = In Focus
+
72AFStatusRightint16s + +
-32768 = Out of Focus  0 = In Focus
+
74AFStatusLower-rightint16s + +
-32768 = Out of Focus  0 = In Focus
+
76AFStatusCenterF2-8int16s + +
-32768 = Out of Focus  0 = In Focus
+
304AFMicroAdjValueint8u 
305AFMicroAdjModeint8u[val >> 7 & 0x1] +
0 = Off +
1 = On
305.1AFMicroAdjRegisteredLensesint8u(number of registered lenses with a non-zero AFMicroAdjValue) +
[val & 0x7f]
+ +

Sony CameraInfo2 Tags

+

Camera information for the DSLR-A200, A230, A290, A300, A330, A350, A380 and +A390.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensSpecundef[8] 
20AFPointSelectedint8u + +
0 = Auto +
1 = Center +
2 = Top +
3 = Upper-right +
4 = Right
  5 = Lower-right +
6 = Bottom +
7 = Lower-left +
8 = Left +
9 = Upper-left
+
21FocusModeSettingint8u(FocusModeSetting for other models) +
0 = Manual +
1 = AF-S +
2 = AF-C +
3 = AF-A +
4 = DMF
24AFPointint8u + +
0 = Top-right +
1 = Bottom-right +
2 = Bottom +
3 = Middle Horizontal
  4 = Center Vertical +
5 = Top +
6 = Top-left +
7 = Bottom-left
+
27AFStatusActiveSensorint16s + +
-32768 = Out of Focus  0 = In Focus
+
29AFStatusTop-rightint16s + +
-32768 = Out of Focus  0 = In Focus
+
31AFStatusBottom-rightint16s + +
-32768 = Out of Focus  0 = In Focus
+
33AFStatusBottomint16s + +
-32768 = Out of Focus  0 = In Focus
+
35AFStatusMiddleHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
37AFStatusCenterVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
39AFStatusTopint16s + +
-32768 = Out of Focus  0 = In Focus
+
41AFStatusTop-leftint16s + +
-32768 = Out of Focus  0 = In Focus
+
43AFStatusBottom-leftint16s + +
-32768 = Out of Focus  0 = In Focus
+
45AFStatusLeftint16s + +
-32768 = Out of Focus  0 = In Focus
+
47AFStatusCenterHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
49AFStatusRightint16s + +
-32768 = Out of Focus  0 = In Focus
+
+ +

Sony CameraInfo3 Tags

+

Camera information stored by the A33, A35, A55, A450, A500, A550, A560, +A580, NEX-3/5/5C/C3 and VG10E. Some tags are valid only for some of these +models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0LensSpecundef[8] 
14FocalLengthint16u 
16FocalLengthTeleZoomint16u 
20AFPointSelectedint8u + +
0 = Auto +
1 = Center +
2 = Top +
3 = Upper-right +
4 = Right
  5 = Lower-right +
6 = Bottom +
7 = Lower-left +
8 = Left +
9 = Upper-left
+
21FocusModeint8u0 = Manual +
1 = AF-S +
2 = AF-C +
3 = AF-A
24AFPointint8u + +
0 = Top-right +
1 = Bottom-right +
2 = Bottom +
3 = Middle Horizontal
  4 = Center Vertical +
5 = Top +
6 = Top-left +
7 = Bottom-left
+
25FocusStatusint8u(not valid with Contrast AF or for NEX models) +
0 = Manual - Not confirmed (0) +
4 = Manual - Not confirmed (4) +
16 = AF-C - Confirmed +
24 = AF-C - Not Confirmed +
64 = AF-S - Confirmed
27AFStatusActiveSensorint16s + +
-32768 = Out of Focus  0 = In Focus
+
28AFPointSelectedint8u(not valid for Contrast AF) + +
0 = Auto +
1 = Center +
2 = Top +
3 = Upper-right +
4 = Right +
5 = Lower-right +
6 = Bottom +
7 = Lower-left
  8 = Left +
9 = Upper-left +
10 = Far Right +
11 = Far Left +
12 = Upper-middle +
13 = Near Right +
14 = Lower-middle +
15 = Near Left
+
29FocusMode +
AFStatusTop-right
int8u
int16s
0 = Manual +
1 = AF-S +
2 = AF-C +
3 = AF-A
+ +
-32768 = Out of Focus  0 = In Focus
+
31AFStatusBottom-rightint16s + +
-32768 = Out of Focus  0 = In Focus
+
32AFPointint8u(the AF sensor used for focusing. Not valid for Contrast AF) + +
0 = Upper-left +
1 = Left +
2 = Lower-left +
3 = Far Left +
4 = Top (horizontal) +
5 = Near Right +
6 = Center (horizontal) +
7 = Near Left +
8 = Bottom (horizontal) +
9 = Top (vertical)
  10 = Center (vertical) +
11 = Bottom (vertical) +
12 = Far Right +
13 = Upper-right +
14 = Right +
15 = Lower-right +
16 = Upper-middle +
17 = Lower-middle +
255 = (none)
+
33AFStatusActiveSensor +
AFStatusBottom
int16s
int16s
+ +
-32768 = Out of Focus  0 = In Focus
+ + +
-32768 = Out of Focus  0 = In Focus
+
35AFStatus15 +
AFStatusMiddleHorizontal
-
int16s
--> Sony AFStatus15 Tags +
+ +
-32768 = Out of Focus  0 = In Focus
+
37AFStatusCenterVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
39AFStatusTopint16s + +
-32768 = Out of Focus  0 = In Focus
+
41AFStatusTop-leftint16s + +
-32768 = Out of Focus  0 = In Focus
+
43AFStatusBottom-leftint16s + +
-32768 = Out of Focus  0 = In Focus
+
45AFStatusLeftint16s + +
-32768 = Out of Focus  0 = In Focus
+
47AFStatusCenterHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
49AFStatusRightint16s + +
-32768 = Out of Focus  0 = In Focus
+
+ +

Sony AFStatus15 Tags

+

AF Status information for models with 15-point AF.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0AFStatusUpper-leftint16s + +
-32768 = Out of Focus  0 = In Focus
+
2AFStatusLeftint16s + +
-32768 = Out of Focus  0 = In Focus
+
4AFStatusLower-leftint16s + +
-32768 = Out of Focus  0 = In Focus
+
6AFStatusFarLeftint16s + +
-32768 = Out of Focus  0 = In Focus
+
8AFStatusTopHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
10AFStatusNearRightint16s + +
-32768 = Out of Focus  0 = In Focus
+
12AFStatusCenterHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
14AFStatusNearLeftint16s + +
-32768 = Out of Focus  0 = In Focus
+
16AFStatusBottomHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
18AFStatusTopVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
20AFStatusCenterVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
22AFStatusBottomVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
24AFStatusFarRightint16s + +
-32768 = Out of Focus  0 = In Focus
+
26AFStatusUpper-rightint16s + +
-32768 = Out of Focus  0 = In Focus
+
28AFStatusRightint16s + +
-32768 = Out of Focus  0 = In Focus
+
30AFStatusLower-rightint16s + +
-32768 = Out of Focus  0 = In Focus
+
32AFStatusUpper-middleint16s + +
-32768 = Out of Focus  0 = In Focus
+
34AFStatusLower-middleint16s + +
-32768 = Out of Focus  0 = In Focus
+
+ +

Sony CameraInfoUnknown Tags

+
+
+ + + + +
Index1Tag NameWritableValues / Notes
[no tags known]
+ +

Sony FocusInfo Tags

+

More camera settings and focus information decoded for models such as the +A200, A230, A290, A300, A330, A350, A380, A390, A700, A850 and A900.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
14DriveMode2int8u(A230, A290, A330, A380 and A390) +
0x1 = Single Frame +
0x2 = Continuous High +
0x4 = Self-timer 10 sec +
0x5 = Self-timer 2 sec, Mirror Lock-up +
0x7 = Continuous Bracketing +
0xa = Remote Commander +
0xb = Continuous Self-timer
+(A200, A300, A350, A700, A850 and A900) +
0x1 = Single Frame +
0x2 = Continuous High +
0x4 = Self-timer 10 sec +
0x5 = Self-timer 2 sec, Mirror Lock-up +
0x6 = Single-frame Bracketing +
0x7 = Continuous Bracketing +
0xa = Remote Commander +
0xb = Mirror Lock-up +
0x12 = Continuous Low +
0x18 = White Balance Bracketing Low +
0x19 = D-Range Optimizer Bracketing Low +
0x28 = White Balance Bracketing High +
0x29 = D-Range Optimizer Bracketing High
+
16Rotationint8u0 = Horizontal (normal) +
1 = Rotate 270 CW +
2 = Rotate 90 CW
20ImageStabilizationSettingint8u0 = Off +
1 = On
21DynamicRangeOptimizerModeint8u0 = Off +
1 = Standard +
2 = Advanced Auto +
3 = Advanced Level
43BracketShotNumberint8u(WB and DRO bracketing)
44WhiteBalanceBracketingint8u0 = Off +
1 = Low +
2 = High
45BracketShotNumber2int8u 
46DynamicRangeOptimizerBracketint8u0 = Off +
1 = Low +
2 = High
47ExposureBracketShotNumberint8u 
63ExposureProgramint8u--> Sony ExposureProgram Values
65CreativeStyleint8u + +
1 = Standard +
2 = Vivid +
3 = Portrait +
4 = Landscape +
5 = Sunset +
6 = Night View/Portrait +
8 = B&W
  9 = Adobe RGB +
11 = Neutral +
12 = Clear +
13 = Deep +
14 = Light +
15 = Autumn Leaves +
16 = Sepia
+
109ISOSettingint8u 
111ISOint8u 
119DynamicRangeOptimizerModeint8u0 = Off +
1 = Standard +
2 = Advanced Auto +
3 = Advanced Level
121DynamicRangeOptimizerLevelint8u 
2118ShutterCountint32u(only valid for some DSLR models)
2491FocusPositionint8u(only valid for some DSLR models)
4368TiffMeteringImageno(13-bit RBGG (?) 40x30 pixels, presumably metering info, extracted as a +16-bit TIFF image;)
+ +

Sony ExposureProgram Values

+
+
+ + + + + + + + + + + + + + + + + +
ValueExposureProgramValueExposureProgramValueExposureProgram
0= Auto8= Program Shift A19= Night Portrait
1= Manual9= Program Shift S20= Landscape
2= Program AE16= Portrait21= Macro
3= Aperture-priority AE17= Sports35= Auto No Flash
4= Shutter speed priority AE18= Sunset  
+ +

Sony MoreInfo Tags

+

More camera settings information decoded for the A450, A500, A550, A560, +A580, A33, A35, A55, NEX-3/5/C3 and VG10E.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001MoreSettings---> Sony MoreSettings Tags
0x0002FaceInfo +
FaceInfoA
-
-
--> Sony FaceInfo Tags +
--> Sony FaceInfoA Tags
0x0107TiffMeteringImageno(10-bit RGB data from the 1200 AE metering segments, extracted as a 16-bit +TIFF image)
0x0201MoreInfo0201---> Sony MoreInfo0201 Tags
0x0401MoreInfo0401---> Sony MoreInfo0401 Tags
+ +

Sony MoreSettings Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1DriveMode2int8u +
0x10 = Single Frame +
0x21 = Continuous High +
0x22 = Continuous Low +
0x30 = Speed Priority Continuous +
0x51 = Self-timer 10 sec +
0x52 = Self-timer 2 sec, Mirror Lock-up +
0x71 = Continuous Bracketing 0.3 EV +
0x75 = Continuous Bracketing 0.7 EV +
0x91 = White Balance Bracketing Low +
0x92 = White Balance Bracketing High +
0xc0 = Remote Commander
+
2ExposureProgramint8u--> Sony ExposureProgram2 Values
3MeteringModeint8u1 = Multi-segment +
2 = Center-weighted average +
3 = Spot
4DynamicRangeOptimizerSettingint8u1 = Off +
16 = On (Auto) +
17 = On (Manual)
5DynamicRangeOptimizerLevelint8u 
6ColorSpaceint8u1 = sRGB +
2 = Adobe RGB
7CreativeStyleSettingint8u + +
16 = Standard +
32 = Vivid +
64 = Portrait
  80 = Landscape +
96 = B&W +
160 = Sunset
+
8ContrastSettingint8s 
9SaturationSettingint8s 
10SharpnessSettingint8s 
13WhiteBalanceSettingint8u--> Sony WhiteBalanceSetting Values
14ColorTemperatureSettingint8u 
15ColorCompensationFilterSetint8s(negative is green, positive is magenta)
16FlashModeint8u + +
1 = Flash Off +
16 = Autoflash +
17 = Fill-flash
  18 = Slow Sync +
19 = Rear Sync +
20 = Wireless
+
17LongExposureNoiseReductionint8u1 = Off +
16 = On
18HighISONoiseReductionint8u16 = Low +
17 = High +
19 = Auto
19FocusModeint8u17 = AF-S +
18 = AF-C +
19 = AF-A +
32 = Manual +
48 = DMF
21MultiFrameNoiseReductionint8u0 = n/a +
1 = Off +
16 = On +
255 = None
22HDRSettingint8u1 = Off +
16 = On (Auto) +
17 = On (Manual)
23HDRLevelint8u + + +
33 = 1 EV +
34 = 1.5 EV +
35 = 2 EV
  36 = 2.5 EV +
37 = 3 EV +
38 = 3.5 EV
  39 = 4 EV +
40 = 5 EV +
41 = 6 EV
+
24ViewingModeint8u16 = ViewFinder +
33 = Focus Check Live View +
34 = Quick AF Live View
25FaceDetectionint8u1 = Off +
16 = On
26CustomWB_RBLevelsint16uRev[2] 
30BrightnessValue +
ExposureCompensationSet
int8u
int8u
(A450, A500 and A550) +
(other models)
31ISO +
FlashExposureCompSet
int8u
int8u
(A450, A500 and A550) +
(other models)
32FNumber +
LiveViewAFMethod
int8u
int8u
(A450, A500 and A550) +
(other models except the NEX-3/5/5C) +
0 = n/a +
1 = Phase-detect AF +
2 = Contrast AF
33ExposureTime +
ISO
int8u
int8u
(A450, A500 and A550) +
(NEX-3/5/5C)
34FNumberint8u(NEX-3/5/5C only)
35FocalLength2 +
ExposureTime
int8u
int8u
(A450, A500 and A550) +
(NEX-3/5/5C)
36ExposureCompensation2int16s(A450, A500 and A550)
37FocalLength2 +
ISO
int8u
int8u
(NEX-3/5/5C) +
(other models except the A450, A500 and A550)
38FlashExposureCompSet2 +
ExposureCompensation2 +
FNumber
int16s
int16s
int8u
(A450, A500 and A550) +
(NEX-3/5/5C) +
(other models)
39ExposureTimeint8u(models other than the A450, A500, A550 and NEX-3/5/5C)
40Orientation2int8u(A450, A500 and A550) +
1 = Horizontal (normal) +
2 = Rotate 180 +
6 = Rotate 90 CW +
8 = Rotate 270 CW
41FocusPosition2 +
FocalLength2
int8u
int8u
(A450, A500 and A550) +
(other models except the NEX-3/5/5C)
42FlashAction +
ExposureCompensation2
int8u
int16s
(A450, A500 and A550) +
0 = Did not fire +
1 = Fired +
(other models except the NEX-3/5/5C)
43FocusPosition2int8u(NEX-3/5/5C only)
44FocusMode2 +
FlashAction +
FlashExposureCompSet2
int8u
int8u
int16s
(A450, A500 and A550) +
0 = AF +
1 = MF +
(NEX-3/5/5C FlashAction2) +
0 = Did not fire +
1 = Fired +
(other models FlashExposureCompSet2)
46FocusMode2 +
Orientation2
int8u
int8u
(NEX-3/5/5C) +
0 = AF +
1 = MF +
(other models except the A450, A500 and A550) +
1 = Horizontal (normal) +
2 = Rotate 180 +
6 = Rotate 90 CW +
8 = Rotate 270 CW
47FocusPosition2int8u(models other than the A450, A500, A550 and NEX-3/5/5C)
48FlashActionint8u(models other than the A450, A500, A550 and NEX-3/5/5C) +
0 = Did not fire +
1 = Fired
50FocusMode2int8u(models other than the A450, A500, A550 and NEX-3/5/5C) +
0 = AF +
1 = MF
119FlashAction2int8u0 = Did not fire +
2 = External Flash fired (2) +
3 = Built-in Flash fired +
4 = External Flash fired (4)
120FlashActionExternalint8u121 = Fired +
122 = Fired +
136 = Did not fire
124FlashActionExternalint8u136 = Did not fire +
167 = Fired +
182 = Fired, HSS
130FlashStatusint8u0 = None +
2 = External
134FlashStatusint8u0 = None +
1 = Built-in +
2 = External
+ +

Sony ExposureProgram2 Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueExposureProgram2ValueExposureProgram2ValueExposureProgram2
1= Program AE52= Sports129= Pop Color
2= Aperture-priority AE53= Sunset130= Posterization
3= Shutter speed priority AE54= Night view131= Posterization B/W
4= Manual55= Night view/portrait132= Retro Photo
5= Cont. Priority AE56= Handheld Night Shot133= High-key
16= Auto57= 3D Sweep Panorama134= Partial Color Red
17= Auto (no flash)64= Auto 2135= Partial Color Green
18= Auto+65= Auto 2 (no flash)136= Partial Color Blue
49= Portrait80= Sweep Panorama137= Partial Color Yellow
50= Landscape96= Anti Motion Blur138= High Contrast Monochrome
51= Macro128= Toy Camera  
+ +

Sony WhiteBalanceSetting Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueWhiteBalanceSettingValueWhiteBalanceSetting
0x10= Auto (-3)0x45= Cloudy (+2)
0x11= Auto (-2)0x46= Cloudy (+3)
0x12= Auto (-1)0x50= Tungsten (-3)
0x13= Auto (0)0x51= Tungsten (-2)
0x14= Auto (+1)0x52= Tungsten (-1)
0x15= Auto (+2)0x53= Tungsten (0)
0x16= Auto (+3)0x54= Tungsten (+1)
0x20= Daylight (-3)0x55= Tungsten (+2)
0x21= Daylight (-2)0x56= Tungsten (+3)
0x22= Daylight (-1)0x60= Fluorescent (-3)
0x23= Daylight (0)0x61= Fluorescent (-2)
0x24= Daylight (+1)0x62= Fluorescent (-1)
0x25= Daylight (+2)0x63= Fluorescent (0)
0x26= Daylight (+3)0x64= Fluorescent (+1)
0x30= Shade (-3)0x65= Fluorescent (+2)
0x31= Shade (-2)0x66= Fluorescent (+3)
0x32= Shade (-1)0x70= Flash (-3)
0x33= Shade (0)0x71= Flash (-2)
0x34= Shade (+1)0x72= Flash (-1)
0x35= Shade (+2)0x73= Flash (0)
0x36= Shade (+3)0x74= Flash (+1)
0x40= Cloudy (-3)0x75= Flash (+2)
0x41= Cloudy (-2)0x76= Flash (+3)
0x42= Cloudy (-1)0xa3= Custom
0x43= Cloudy (0)0xf3= Color Temperature/Color Filter
0x44= Cloudy (+1)  
+ +

Sony FaceInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0FacesDetectedint16s-1 = n/a
1Face1Positionint16u[4](re-ordered and scaled to return the top, left, height and width of detected +face, with coordinates relative to the full-sized unrotated image and +increasing Y downwards)
6Face2Positionint16u[4] 
11Face3Positionint16u[4] 
16Face4Positionint16u[4] 
21Face5Positionint16u[4] 
26Face6Positionint16u[4] 
31Face7Positionint16u[4] 
36Face8Positionint16u[4] 
+ +

Sony FaceInfoA Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
3FacesDetectedno 
11PotentialFace1Positionint16u[4] 
21PotentialFace2Positionint16u[4] 
31PotentialFace3Positionint16u[4] 
41PotentialFace4Positionint16u[4] 
51PotentialFace5Positionint16u[4] 
61PotentialFace6Positionint16u[4] 
71PotentialFace7Positionint16u[4] 
81PotentialFace8Positionint16u[4] 
91Face1Positionint16u[4] 
101Face2Positionint16u[4] 
111Face3Positionint16u[4] 
121Face4Positionint16u[4] 
+ +

Sony MoreInfo0201 Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
283ImageCountint32u(not valid for the A450, A500 or A550)
293ShutterCountint32u(not valid for the A450, A500 or A550)
330ShutterCountint32u(A450, A500 and A550 only)
+ +

Sony MoreInfo0401 Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
1102ShotNumberSincePowerUpint32u(Not valid for the NEX-3 or NEX-5)
+ +

Sony CameraSettings Tags

+

Camera settings for the A200, A300, A350, A700, A850 and A900.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0ExposureTimeint16u 
1FNumberint16u 
2HighSpeedSyncint16u0 = Off +
1 = On
3ExposureCompensationSetint16u 
4DriveModeint16u[val & 0xff] +
0x1 = Single Frame +
0x2 = Continuous High +
0x4 = Self-timer 10 sec +
0x5 = Self-timer 2 sec, Mirror Lock-up +
0x6 = Single-frame Bracketing +
0x7 = Continuous Bracketing +
0xa = Remote Commander +
0xb = Mirror Lock-up +
0x12 = Continuous Low +
0x18 = White Balance Bracketing Low +
0x19 = D-Range Optimizer Bracketing Low +
0x28 = White Balance Bracketing High +
0x29 = D-Range Optimizer Bracketing High
+
5WhiteBalanceSettingint16u +
2 = Auto +
4 = Daylight +
5 = Fluorescent +
6 = Tungsten +
7 = Flash +
16 = Cloudy +
17 = Shade +
18 = Color Temperature/Color Filter +
32 = Custom 1 +
33 = Custom 2 +
34 = Custom 3
+
6WhiteBalanceFineTuneint16u 
7ColorTemperatureSetint16u 
8ColorCompensationFilterSetint16u(negative is green, positive is magenta)
12ColorTemperatureCustomint16u 
13ColorCompensationFilterCustomint16u(negative is green, positive is magenta)
15WhiteBalanceint16u + +
2 = Auto +
4 = Daylight +
5 = Fluorescent +
6 = Tungsten +
7 = Flash
  12 = Color Temperature +
13 = Color Filter +
14 = Custom +
16 = Cloudy +
17 = Shade
+
16FocusModeSettingint16u0 = Manual +
1 = AF-S +
2 = AF-C +
3 = AF-A +
4 = DMF
17AFAreaModeint16u0 = Wide +
1 = Local +
2 = Spot
18AFPointSettingint16u + +
1 = Center +
2 = Top +
3 = Upper-right +
4 = Right +
5 = Lower-right +
6 = Bottom
  7 = Lower-left +
8 = Left +
9 = Upper-left +
10 = Far Right +
11 = Far Left
+
19FlashModeint16u + +
0 = Autoflash +
2 = Rear Sync +
3 = Wireless
  4 = Fill-flash +
5 = Flash Off +
6 = Slow Sync
+
20FlashExposureCompSetint16u 
21MeteringModeint16u1 = Multi-segment +
2 = Center-weighted average +
4 = Spot
22ISOSettingint16u 
24DynamicRangeOptimizerModeint16u0 = Off +
1 = Standard +
2 = Advanced Auto +
3 = Advanced Level
25DynamicRangeOptimizerLevelint16u 
26CreativeStyleint16u + +
1 = Standard +
2 = Vivid +
3 = Portrait +
4 = Landscape +
5 = Sunset +
6 = Night View/Portrait +
8 = B&W
  9 = Adobe RGB +
11 = Neutral +
12 = Clear +
13 = Deep +
14 = Light +
15 = Autumn Leaves +
16 = Sepia
+
27ColorSpaceint16u0 = sRGB +
1 = Adobe RGB +
5 = Adobe RGB (A700)
28Sharpnessint16u 
29Contrastint16u 
30Saturationint16u 
31ZoneMatchingValueint16u 
34Brightnessint16u 
35FlashControlint16u0 = ADI +
1 = Pre-flash TTL +
2 = Manual
40PrioritySetupShutterReleaseint16u0 = AF +
1 = Release
41AFIlluminatorint16u0 = Auto +
1 = Off
42AFWithShutterint16u0 = On +
1 = Off
43LongExposureNoiseReductionint16u0 = Off +
1 = On
44HighISONoiseReductionint16u0 = Normal +
1 = Low +
2 = High +
3 = Off
45ImageStyleint16u + +
1 = Standard +
2 = Vivid +
3 = Portrait +
4 = Landscape +
5 = Sunset +
7 = Night View/Portrait +
8 = B&W +
9 = Adobe RGB
  11 = Neutral +
129 = StyleBox1 +
130 = StyleBox2 +
131 = StyleBox3 +
132 = StyleBox4 +
133 = StyleBox5 +
134 = StyleBox6
+
46FocusModeSwitchint16u0 = AF +
1 = Manual
47ShutterSpeedSettingint16u(used in M, S and Program Shift S modes)
48ApertureSettingint16u(used in M, A and Program Shift A modes)
60ExposureProgramint16u--> Sony ExposureProgram Values
61ImageStabilizationSettingint16u0 = Off +
1 = On
62FlashActionint16u0 = Did not fire +
1 = Fired +
2 = External Flash, Did not fire +
3 = External Flash, Fired
63Rotationint16u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
64AELockint16u1 = Off +
2 = On
76FlashAction2int16u +
1 = Fired, Autoflash +
2 = Fired, Fill-flash +
3 = Fired, Rear Sync +
4 = Fired, Wireless +
5 = Did not fire +
6 = Fired, Slow Sync +
17 = Fired, Autoflash, Red-eye reduction +
18 = Fired, Fill-flash, Red-eye reduction +
34 = Fired, Fill-flash, HSS
+
77FocusModeint16u0 = Manual +
1 = AF-S +
2 = AF-C +
3 = AF-A +
4 = DMF
80BatteryStateint16u2 = Empty +
3 = Very Low +
4 = Low +
5 = Sufficient +
6 = Full
81BatteryLevelint16u 
83FocusStatusint16u0x0 = Not confirmed +
0x4 = Not confirmed, Tracking +
Bit 0 = Confirmed +
Bit 1 = Failed +
Bit 2 = Tracking
84SonyImageSizeint16u1 = Large +
2 = Medium +
3 = Small
85AspectRatioint16u1 = 3:2 +
2 = 16:9
86Qualityint16u + +
0 = RAW +
2 = CRAW +
16 = Extra Fine +
32 = Fine
  34 = RAW + JPEG +
35 = CRAW + JPEG +
48 = Standard
+
88ExposureLevelIncrementsint16u33 = 1/3 EV +
50 = 1/2 EV
106RedEyeReductionint16u0 = Off +
1 = On
154FolderNumberint16u[val & 0x3ff]
155ImageNumberint16u[val & 0x3fff]
+ +

Sony CameraSettings2 Tags

+

Camera settings for the A230, A290, A330, A380 and A390.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
0ExposureTimeint16u 
1FNumberint16u 
2HighSpeedSyncint16u0 = Off +
1 = On
3ExposureCompensationSetint16u 
4WhiteBalanceSettingint16u +
2 = Auto +
4 = Daylight +
5 = Fluorescent +
6 = Tungsten +
7 = Flash +
16 = Cloudy +
17 = Shade +
18 = Color Temperature/Color Filter +
32 = Custom 1 +
33 = Custom 2 +
34 = Custom 3
+
5WhiteBalanceFineTuneint16u 
6ColorTemperatureSetint16u 
7ColorCompensationFilterSetint16u(negative is green, positive is magenta)
8CustomWB_RGBLevelsint16u[3] 
11ColorTemperatureCustomint16u 
12ColorCompensationFilterCustomint16u(negative is green, positive is magenta)
14WhiteBalanceint16u + +
2 = Auto +
4 = Daylight +
5 = Fluorescent +
6 = Tungsten +
7 = Flash
  12 = Color Temperature +
13 = Color Filter +
14 = Custom +
16 = Cloudy +
17 = Shade
+
15FocusModeSettingint16u0 = Manual +
1 = AF-S +
2 = AF-C +
3 = AF-A
16AFAreaModeint16u0 = Wide +
1 = Local +
2 = Spot
17AFPointSettingint16u + +
1 = Center +
2 = Top +
3 = Upper-right +
4 = Right +
5 = Lower-right
  6 = Bottom +
7 = Lower-left +
8 = Left +
9 = Upper-left
+
18FlashExposureCompSetint16u 
19MeteringModeint16u1 = Multi-segment +
2 = Center-weighted average +
4 = Spot
20ISOSettingint16u 
22DynamicRangeOptimizerModeint16u0 = Off +
1 = Standard +
2 = Advanced Auto +
3 = Advanced Level
23DynamicRangeOptimizerLevelint16u 
24CreativeStyleint16u + +
1 = Standard +
2 = Vivid +
3 = Portrait +
4 = Landscape
  5 = Sunset +
6 = Night View/Portrait +
8 = B&W
+
25Sharpnessint16u 
26Contrastint16u 
27Saturationint16u 
31FlashControlint16u0 = ADI +
1 = Pre-flash TTL +
2 = Manual
37LongExposureNoiseReductionint16u0 = Off +
1 = On
38HighISONoiseReductionint16u0 = Off +
1 = Low +
2 = Normal +
3 = High
39ImageStyleint16u + +
1 = Standard +
2 = Vivid +
3 = Portrait +
4 = Landscape
  5 = Sunset +
7 = Night View/Portrait +
8 = B&W
+
40ShutterSpeedSettingint16u(used in M, S and Program Shift S modes)
41ApertureSettingint16u(used in M, A and Program Shift A modes)
60ExposureProgramint16u--> Sony ExposureProgram Values
61ImageStabilizationSettingint16u0 = Off +
1 = On
62FlashActionint16u0 = Did not fire +
1 = Fired +
2 = External Flash, Did not fire +
3 = External Flash, Fired
63Rotationint16u0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW
64AELockint16u1 = Off +
2 = On
76FlashAction2int16u +
1 = Fired, Autoflash +
2 = Fired, Fill-flash +
3 = Fired, Rear Sync +
4 = Fired, Wireless +
5 = Did not fire +
6 = Fired, Slow Sync +
17 = Fired, Autoflash, Red-eye reduction +
18 = Fired, Fill-flash, Red-eye reduction +
34 = Fired, Fill-flash, HSS
+
77FocusModeint16u0 = Manual +
1 = AF-S +
2 = AF-C +
3 = AF-A
83FocusStatusint16u0x0 = Not confirmed +
0x4 = Not confirmed, Tracking +
Bit 0 = Confirmed +
Bit 1 = Failed +
Bit 2 = Tracking
84SonyImageSizeint16u1 = Large +
2 = Medium +
3 = Small
85AspectRatioint16u1 = 3:2 +
2 = 16:9
86Qualityint16u + +
0 = RAW +
2 = CRAW +
16 = Extra Fine +
32 = Fine
  34 = RAW + JPEG +
35 = CRAW + JPEG +
48 = Standard
+
88ExposureLevelIncrementsint16u33 = 1/3 EV +
50 = 1/2 EV
126DriveModeint16u[val & 0xff] +
1 = Single Frame +
2 = Continuous High +
4 = Self-timer 10 sec +
5 = Self-timer 2 sec, Mirror Lock-up +
7 = Continuous Bracketing +
10 = Remote Commander +
11 = Continuous Self-timer
+
127FlashModeint16u + +
0 = Autoflash +
2 = Rear Sync +
3 = Wireless
  4 = Fill-flash +
5 = Flash Off +
6 = Slow Sync
+
131ColorSpaceint16u5 = Adobe RGB +
6 = sRGB
+ +

Sony CameraSettings3 Tags

+

Camera settings for models such as the A33, A35, A55, A450, A500, A550, +A560, A580, NEX-3, NEX-5, NEX-C3 and NEX-VG10E.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ShutterSpeedSettingint8u(used only in M and S exposure modes)
1ApertureSettingint8u(used only in M and A exposure modes)
2ISOSettingint8u0 = Auto +
254 = n/a
3ExposureCompensationSetint8u 
4DriveModeSettingint8u +
0x10 = Single Frame +
0x21 = Continuous High +
0x22 = Continuous Low +
0x30 = Speed Priority Continuous +
0x51 = Self-timer 10 sec +
0x52 = Self-timer 2 sec, Mirror Lock-up +
0x71 = Continuous Bracketing 0.3 EV +
0x75 = Continuous Bracketing 0.7 EV +
0x91 = White Balance Bracketing Low +
0x92 = White Balance Bracketing High +
0xc0 = Remote Commander
+
5ExposureProgramint8u--> Sony ExposureProgram2 Values
6FocusModeSettingint8u17 = AF-S +
18 = AF-C +
19 = AF-A +
32 = Manual +
48 = DMF
7MeteringModeint8u1 = Multi-segment +
2 = Center-weighted average +
3 = Spot
9SonyImageSizeint8u + +
21 = Large (3:2) +
22 = Medium (3:2) +
23 = Small (3:2)
  25 = Large (16:9) +
26 = Medium (16:9) +
27 = Small (16:9)
+
10AspectRatioint8u4 = 3:2 +
8 = 16:9
11Qualityint8u2 = RAW +
4 = RAW + JPEG +
6 = Fine +
7 = Standard
12DynamicRangeOptimizerSettingint8u1 = Off +
16 = On (Auto) +
17 = On (Manual)
13DynamicRangeOptimizerLevelint8u 
14ColorSpaceint8u1 = sRGB +
2 = Adobe RGB
15CreativeStyleSettingint8u + +
16 = Standard +
32 = Vivid +
64 = Portrait
  80 = Landscape +
96 = B&W +
160 = Sunset
+
16ContrastSettingint8s 
17SaturationSettingint8s 
18SharpnessSettingint8s 
22WhiteBalanceSettingint8u--> Sony WhiteBalanceSetting Values
23ColorTemperatureSettingint8u 
24ColorCompensationFilterSetint8s(negative is green, positive is magenta)
25CustomWB_RGBLevelsint16uRev[3] 
32FlashModeint8u + +
1 = Flash Off +
16 = Autoflash +
17 = Fill-flash
  18 = Slow Sync +
19 = Rear Sync +
20 = Wireless
+
33FlashControlint8u1 = ADI Flash +
2 = Pre-flash TTL
35FlashExposureCompSetint8u 
36AFAreaModeint8u1 = Wide +
2 = Spot +
3 = Local +
4 = Flexible
37LongExposureNoiseReductionint8u1 = Off +
16 = On
38HighISONoiseReductionint8u16 = Low +
17 = High +
19 = Auto
39SmileShutterModeint8u17 = Slight Smile +
18 = Normal Smile +
19 = Big Smile
40RedEyeReductionint8u1 = Off +
16 = On
45HDRSettingint8u1 = Off +
16 = On (Auto) +
17 = On (Manual)
46HDRLevelint8u + + +
33 = 1 EV +
34 = 1.5 EV +
35 = 2 EV
  36 = 2.5 EV +
37 = 3 EV +
38 = 3.5 EV
  39 = 4 EV +
40 = 5 EV +
41 = 6 EV
+
47ViewingModeint8u16 = ViewFinder +
33 = Focus Check Live View +
34 = Quick AF Live View
48FaceDetectionint8u1 = Off +
16 = On
49SmileShutterint8u1 = Off +
16 = On
50SweepPanoramaSizeint8u1 = Standard +
2 = Wide
51SweepPanoramaDirectionint8u1 = Right +
2 = Left +
3 = Up +
4 = Down
52DriveModeint8u +
0x10 = Single Frame +
0x21 = Continuous High +
0x22 = Continuous Low +
0x30 = Speed Priority Continuous +
0x51 = Self-timer 10 sec +
0x52 = Self-timer 2 sec, Mirror Lock-up +
0x71 = Continuous Bracketing 0.3 EV +
0x75 = Continuous Bracketing 0.7 EV +
0x91 = White Balance Bracketing Low +
0x92 = White Balance Bracketing High +
0xc0 = Remote Commander +
0xd1 = Continuous - HDR +
0xd2 = Continuous - Multi Frame NR +
0xd3 = Continuous - Handheld Night Shot +
0xd4 = Continuous - Anti Motion Blur +
0xd5 = Continuous - Sweep Panorama +
0xd6 = Continuous - 3D Sweep Panorama
+
53MultiFrameNoiseReductionint8u0 = n/a +
1 = Off +
16 = On +
255 = None
54LiveViewAFSettingint8u0 = n/a +
1 = Phase-detect AF +
2 = Contrast AF
56PanoramaSize3Dint8u0 = n/a +
1 = Standard +
2 = Wide +
3 = 16:9
131AFButtonPressedint8u1 = No +
16 = Yes
132LiveViewMeteringint8u0 = n/a +
16 = 40 Segment +
32 = 1200-zone Evaluative
133ViewingMode2int8u0 = n/a +
16 = Viewfinder +
33 = Focus Check Live View +
34 = Quick AF Live View
134AELockint8u1 = On +
2 = Off
135FlashStatusBuilt-inint8u1 = Off +
2 = On
136FlashStatusExternalint8u1 = None +
2 = Off +
3 = On
139LiveViewFocusModeint8u0 = n/a +
1 = AF +
16 = Manual
153LensMountint8u1 = Unknown +
16 = A-mount +
17 = E-mount
268SequenceNumberint8u0 = Single +
255 = n/a
276FolderNumberint32u[val >> 14 & 0x3ff]
276.1ImageNumberint32u[val & 0x3fff]
512ShotNumberSincePowerUp2int32u(same as ShotNumberSincePowerUp for single-shot images, but includes all +shots of the current image in multi-shot modes like HDR, panorama, and +multi-frame noise reduction)
643AFButtonPressedint8u1 = No +
16 = Yes
644LiveViewMeteringint8u0 = n/a +
16 = 40 Segment +
32 = 1200-zone Evaluative
645ViewingMode2int8u0 = n/a +
16 = Viewfinder +
33 = Focus Check Live View +
34 = Quick AF Live View
646AELockint8u1 = On +
2 = Off
647FlashStatusBuilt-inint8u(A450, A500 and A550) +
1 = Off +
2 = On
648FlashStatusExternalint8u(A450, A500 and A550) +
1 = None +
2 = Off +
3 = On
651LiveViewFocusModeint8u0 = n/a +
1 = AF +
16 = Manual
780SequenceNumberint8u(A450, A500 and A550) +
0 = Single +
255 = n/a
788ImageNumberint16u(A450, A500 and A550) +
[val & 0x3fff]
790FolderNumberint16u(A450, A500 and A550) +
[val & 0x3ff]
1008LensE-mountVersionint16u 
1011LensFirmwareVersionint16u~ 
1015LensType2int16u--> Sony LensType2 Values
1024ImageNumberint16u(A450, A500 and A550) +
[val & 0x3fff]
1026FolderNumberint16u(A450, A500 and A550) +
[val & 0x3ff]
+ +

Sony LensType2 Values

+

Lens type numbers for Sony E-mount lenses used by NEX/ILCE models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueLensType2
0= Unknown E-mount lens or other lens
0.1= Sigma 19mm F2.8 [EX] DN
0.2= Sigma 30mm F2.8 [EX] DN
0.3= Sigma 60mm F2.8 DN
0.4= Sony E 18-200mm F3.5-6.3 OSS LE
0.5= Tamron 18-200mm F3.5-6.3 Di III VC
0.6= Tokina FiRIN 20mm F2 FE AF
0.7= Tokina FiRIN 20mm F2 FE MF
0.8= Zeiss Touit 12mm F2.8
0.9= Zeiss Touit 32mm F1.8
0.10= Zeiss Touit 50mm F2.8 Macro
0.11= Zeiss Loxia 50mm F2
0.12= Zeiss Loxia 35mm F2
1= Sony LA-EA1 or Sigma MC-11 Adapter
2= Sony LA-EA2 Adapter
3= Sony LA-EA3 Adapter
6= Sony LA-EA4 Adapter
7= Sony LA-EA5 Adapter
44= Metabones Canon EF Smart Adapter
78= Metabones Canon EF Smart Adapter Mark III or Other Adapter
184= Metabones Canon EF Speed Booster Ultra
234= Metabones Canon EF Smart Adapter Mark IV
239= Metabones Canon EF Speed Booster
24593= LA-EA4r MonsterAdapter
32784= Sony E 16mm F2.8
32785= Sony E 18-55mm F3.5-5.6 OSS
32786= Sony E 55-210mm F4.5-6.3 OSS
32787= Sony E 18-200mm F3.5-6.3 OSS
32788= Sony E 30mm F3.5 Macro
32789= Sony E 24mm F1.8 ZA or Samyang AF 50mm F1.4
32789.1= Samyang AF 50mm F1.4
32790= Sony E 50mm F1.8 OSS or Samyang AF 14mm F2.8
32790.1= Samyang AF 14mm F2.8
32791= Sony E 16-70mm F4 ZA OSS
32792= Sony E 10-18mm F4 OSS
32793= Sony E PZ 16-50mm F3.5-5.6 OSS
32794= Sony FE 35mm F2.8 ZA or Samyang Lens
32794.1= Samyang AF 24mm F2.8
32794.2= Samyang AF 35mm F2.8
32795= Sony FE 24-70mm F4 ZA OSS
32796= Sony FE 85mm F1.8 or Viltrox PFU RBMH 85mm F1.8
32796.1= Viltrox PFU RBMH 85mm F1.8
32797= Sony E 18-200mm F3.5-6.3 OSS LE
32798= Sony E 20mm F2.8
32799= Sony E 35mm F1.8 OSS
32800= Sony E PZ 18-105mm F4 G OSS
32801= Sony FE 12-24mm F4 G
32802= Sony FE 90mm F2.8 Macro G OSS
32803= Sony E 18-50mm F4-5.6
32804= Sony FE 24mm F1.4 GM
32805= Sony FE 24-105mm F4 G OSS
32807= Sony E PZ 18-200mm F3.5-6.3 OSS
32808= Sony FE 55mm F1.8 ZA
32810= Sony FE 70-200mm F4 G OSS
32811= Sony FE 16-35mm F4 ZA OSS
32812= Sony FE 50mm F2.8 Macro
32813= Sony FE 28-70mm F3.5-5.6 OSS
32814= Sony FE 35mm F1.4 ZA
32815= Sony FE 24-240mm F3.5-6.3 OSS
32816= Sony FE 28mm F2
32817= Sony FE PZ 28-135mm F4 G OSS
32819= Sony FE 100mm F2.8 STF GM OSS
32820= Sony E PZ 18-110mm F4 G OSS
32821= Sony FE 24-70mm F2.8 GM
32822= Sony FE 50mm F1.4 ZA
32823= Sony FE 85mm F1.4 GM or Samyang AF 85mm F1.4
32823.1= Samyang AF 85mm F1.4
32824= Sony FE 50mm F1.8
32826= Sony FE 21mm F2.8 (SEL28F20 + SEL075UWC)
32827= Sony FE 16mm F3.5 Fisheye (SEL28F20 + SEL057FEC)
32828= Sony FE 70-300mm F4.5-5.6 G OSS
32829= Sony FE 100-400mm F4.5-5.6 GM OSS
32830= Sony FE 70-200mm F2.8 GM OSS
32831= Sony FE 16-35mm F2.8 GM
32848= Sony FE 400mm F2.8 GM OSS
32849= Sony E 18-135mm F3.5-5.6 OSS
32850= Sony FE 135mm F1.8 GM
32851= Sony FE 200-600mm F5.6-6.3 G OSS
32852= Sony FE 600mm F4 GM OSS
32853= Sony E 16-55mm F2.8 G
32854= Sony E 70-350mm F4.5-6.3 G OSS
32855= Sony FE C 16-35mm T3.1 G
32858= Sony FE 35mm F1.8
32859= Sony FE 20mm F1.8 G
32860= Sony FE 12-24mm F2.8 GM
32862= Sony FE 50mm F1.2 GM
32863= Sony FE 14mm F1.8 GM
32864= Sony FE 28-60mm F4-5.6
32865= Sony FE 35mm F1.4 GM
32866= Sony FE 24mm F2.8 G
32867= Sony FE 40mm F2.5 G
32868= Sony FE 50mm F2.5 G
32871= Sony FE PZ 16-35mm F4 G
32873= Sony E PZ 10-20mm F4 G
32874= Sony FE 70-200mm F2.8 GM OSS II
32875= Sony FE 24-70mm F2.8 GM II
32876= Sony E 11mm F1.8
32877= Sony E 15mm F1.4 G
33072= Sony FE 70-200mm F2.8 GM OSS + 1.4X Teleconverter
33073= Sony FE 70-200mm F2.8 GM OSS + 2X Teleconverter
33076= Sony FE 100mm F2.8 STF GM OSS (macro mode)
33077= Sony FE 100-400mm F4.5-5.6 GM OSS + 1.4X Teleconverter
33078= Sony FE 100-400mm F4.5-5.6 GM OSS + 2X Teleconverter
33079= Sony FE 400mm F2.8 GM OSS + 1.4X Teleconverter
33080= Sony FE 400mm F2.8 GM OSS + 2X Teleconverter
33081= Sony FE 200-600mm F5.6-6.3 G OSS + 1.4X Teleconverter
33082= Sony FE 200-600mm F5.6-6.3 G OSS + 2X Teleconverter
33083= Sony FE 600mm F4 GM OSS + 1.4X Teleconverter
33084= Sony FE 600mm F4 GM OSS + 2X Teleconverter
49201= Zeiss Touit 12mm F2.8
49202= Zeiss Touit 32mm F1.8
49203= Zeiss Touit 50mm F2.8 Macro
49216= Zeiss Batis 25mm F2
49217= Zeiss Batis 85mm F1.8
49218= Zeiss Batis 18mm F2.8
49219= Zeiss Batis 135mm F2.8
49220= Zeiss Batis 40mm F2 CF
49232= Zeiss Loxia 50mm F2
49233= Zeiss Loxia 35mm F2
49234= Zeiss Loxia 21mm F2.8
49235= Zeiss Loxia 85mm F2.4
49236= Zeiss Loxia 25mm F2.4
49457= Tamron 28-75mm F2.8 Di III RXD
49458= Tamron 17-28mm F2.8 Di III RXD
49459= Tamron 35mm F2.8 Di III OSD M1:2
49460= Tamron 24mm F2.8 Di III OSD M1:2
49461= Tamron 20mm F2.8 Di III OSD M1:2
49462= Tamron 70-180mm F2.8 Di III VXD
49463= Tamron 28-200mm F2.8-5.6 Di III RXD
49464= Tamron 70-300mm F4.5-6.3 Di III RXD
49465= Tamron 17-70mm F2.8 Di III-A VC RXD
49466= Tamron 150-500mm F5-6.7 Di III VC VXD
49467= Tamron 11-20mm F2.8 Di III-A RXD
49468= Tamron 18-300mm F3.5-6.3 Di III-A VC VXD
49469= Tamron 35-150mm F2-F2.8 Di III VXD
49470= Tamron 28-75mm F2.8 Di III VXD G2
49473= Tokina atx-m 85mm F1.8 FE or Viltrox lens
49473.1= Viltrox 23mm F1.4 E
49473.2= Viltrox 56mm F1.4 E
49712= Tokina FiRIN 20mm F2 FE AF
49713= Tokina FiRIN 100mm F2.8 FE MACRO
50480= Sigma 30mm F1.4 DC DN | C
50481= Sigma 50mm F1.4 DG HSM | A
50482= Sigma 18-300mm F3.5-6.3 DC MACRO OS HSM | C + MC-11
50483= Sigma 18-35mm F1.8 DC HSM | A + MC-11
50484= Sigma 24-35mm F2 DG HSM | A + MC-11
50485= Sigma 24mm F1.4 DG HSM | A + MC-11
50486= Sigma 150-600mm F5-6.3 DG OS HSM | C + MC-11
50487= Sigma 20mm F1.4 DG HSM | A + MC-11
50488= Sigma 35mm F1.4 DG HSM | A
50489= Sigma 150-600mm F5-6.3 DG OS HSM | S + MC-11
50490= Sigma 120-300mm F2.8 DG OS HSM | S + MC-11
50492= Sigma 24-105mm F4 DG OS HSM | A + MC-11
50493= Sigma 17-70mm F2.8-4 DC MACRO OS HSM | C + MC-11
50495= Sigma 50-100mm F1.8 DC HSM | A + MC-11
50499= Sigma 85mm F1.4 DG HSM | A
50501= Sigma 100-400mm F5-6.3 DG OS HSM | C + MC-11
50503= Sigma 16mm F1.4 DC DN | C
50507= Sigma 105mm F1.4 DG HSM | A
50508= Sigma 56mm F1.4 DC DN | C
50512= Sigma 70-200mm F2.8 DG OS HSM | S + MC-11
50513= Sigma 70mm F2.8 DG MACRO | A
50514= Sigma 45mm F2.8 DG DN | C
50515= Sigma 35mm F1.2 DG DN | A
50516= Sigma 14-24mm F2.8 DG DN | A
50517= Sigma 24-70mm F2.8 DG DN | A
50518= Sigma 100-400mm F5-6.3 DG DN OS | C
50521= Sigma 85mm F1.4 DG DN | A
50522= Sigma 105mm F2.8 DG DN MACRO | A
50523= Sigma 65mm F2 DG DN | C
50524= Sigma 35mm F2 DG DN | C
50525= Sigma 24mm F3.5 DG DN | C
50526= Sigma 28-70mm F2.8 DG DN | C
50527= Sigma 150-600mm F5-6.3 DG DN OS | S
50528= Sigma 35mm F1.4 DG DN | A
50529= Sigma 90mm F2.8 DG DN | C
50530= Sigma 24mm F2 DG DN | C
50531= Sigma 18-50mm F2.8 DC DN | C
50532= Sigma 20mm F2 DG DN | C
50533= Sigma 16-28mm F2.8 DG DN | C
50992= Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III
50993= Voigtlander HELIAR-HYPER WIDE 10mm F5.6
50994= Voigtlander ULTRA WIDE-HELIAR 12mm F5.6 III
50995= Voigtlander MACRO APO-LANTHAR 65mm F2 Aspherical
50996= Voigtlander NOKTON 40mm F1.2 Aspherical
50997= Voigtlander NOKTON classic 35mm F1.4
50998= Voigtlander MACRO APO-LANTHAR 110mm F2.5
50999= Voigtlander COLOR-SKOPAR 21mm F3.5 Aspherical
51000= Voigtlander NOKTON 50mm F1.2 Aspherical
51001= Voigtlander NOKTON 21mm F1.4 Aspherical
51002= Voigtlander APO-LANTHAR 50mm F2 Aspherical
51003= Voigtlander NOKTON 35mm F1.2 Aspherical SE
51006= Voigtlander APO-LANTHAR 35mm F2 Aspherical
51504= Samyang AF 50mm F1.4
51505= Samyang AF 14mm F2.8 or Samyang AF 35mm F2.8
51505.1= Samyang AF 35mm F2.8
51507= Samyang AF 35mm F1.4
51508= Samyang AF 45mm F1.8
51510= Samyang AF 18mm F2.8 or Samyang AF 35mm F1.8
51510.1= Samyang AF 35mm F1.8
51512= Samyang AF 75mm F1.8
51513= Samyang AF 35mm F1.8
51514= Samyang AF 24mm F1.8
51515= Samyang AF 12mm F2.0
51516= Samyang AF 24-70mm F2.8
51517= Samyang AF 50mm F1.4 II
51518= Samyang AF 135mm F1.8
+ +

Sony CameraSettingsUnknown Tags

+
+
+ + + + +
Index2Tag NameWritableValues / Notes
[no tags known]
+ +

Sony ExtraInfo Tags

+

Extra hardware information for the A850 and A900.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1BatteryTemperatureint8u 
2BatteryUnknown?no 
8BatteryVoltage?no 
10ImageStabilization2?int8u191 = On (191) +
207 = On (207) +
210 = On (210) +
213 = On +
246 = Off
12BatteryLevelint8u 
26ExtraInfoVersionint8u[4] 
+ +

Sony ExtraInfo2 Tags

+

Extra hardware information for the A230/290/330/380/390.

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4BatteryLevelint8u 
18ImageStabilizationint8u0 = Off +
64 = On
+ +

Sony ExtraInfo3 Tags

+

Extra hardware information for the A33, A35, A55, A450, A500, A550, A560, +A580 and NEX-3/5/C3/VG10.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0BatteryUnknown?int16u 
2BatteryTemperatureint8u 
4BatteryLevelint8u 
6BatteryVoltage1int16u 
8BatteryVoltage2int16u 
17ImageStabilizationint8u0 = Off +
64 = On
20BatteryState +
ExposureProgram +
ModeDialPosition
int8u
int8u
int8u
(BatteryState for SLT models) +
1 = Empty +
2 = Low +
3 = Half full +
4 = Almost full +
5 = Full +
(ExposureProgram for the A450, A500 and A550)
+
241 = Landscape +
243 = Aperture-priority AE +
245 = Portrait +
246 = Auto +
247 = Program AE +
249 = Macro +
252 = Sunset +
253 = Sports +
255 = Manual
+(ModeDialPosition for other DSLR models) +
248 = No Flash +
249 = Aperture-priority AE +
250 = SCN +
251 = Shutter speed priority AE +
252 = Auto +
253 = Program AE +
254 = Panorama +
255 = Manual
+
22MemoryCardConfiguration +
CameraOrientation
int8u
int8u
244 = MemoryStick in use, SD card present +
245 = MemoryStick in use, SD slot empty +
252 = SD card in use, MemoryStick present +
254 = SD card in use, MemoryStick slot empty +
[val >> 6 & 0x3] +
0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW +
3 = Rotate 180
24CameraOrientationint8u[val >> 4 & 0x3] +
0 = Horizontal (normal) +
1 = Rotate 90 CW +
2 = Rotate 270 CW +
3 = Rotate 180
+ +

Sony Panorama Tags

+

Tags found in panorama images from various Sony DSC, NEX, SLT and DSLR +cameras. The width/height values of these tags are not affected by camera +rotation -- the width is always the longer dimension.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index4Tag NameWritableValues / Notes
1PanoramaFullWidthint32u 
2PanoramaFullHeightint32u 
3PanoramaDirectionint32u0 = Left or Up +
1 = Right or Down
4PanoramaCropLeftint32u 
5PanoramaCropTopint32u 
6PanoramaCropRightint32u 
7PanoramaCropBottomint32u 
8PanoramaFrameWidthint32u 
9PanoramaFrameHeightint32u 
10PanoramaSourceWidthint32u 
11PanoramaSourceHeightint32u 
+ +

Sony Tag2010a Tags

+

Valid for NEX-5N.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1200MeterInfo?---> Sony MeterInfo Tags
4392ReleaseMode3int8u +
0 = Normal +
1 = Continuous +
2 = Bracketing +
4 = Continuous - Burst +
5 = Continuous - Speed/Advance Priority +
6 = Normal - Self-timer +
9 = Single Burst Shooting
+
4396ReleaseMode2int8u--> Sony ReleaseMode2 Values
4404SelfTimerint8u0 = Off +
1 = Self-timer 10 s +
2 = Self-timer 2 s
4408FlashModeint8u + +
0 = Autoflash +
1 = Fill-flash +
2 = Flash Off
  3 = Slow Sync +
4 = Rear Sync +
6 = Wireless
+
4414StopsAboveBaseISOint16u 
4416BrightnessValueint16u 
4420DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
4424HDRSettingint8u + +
0 = Off +
1 = HDR Auto +
3 = HDR 1 EV +
5 = HDR 2 EV
  7 = HDR 3 EV +
9 = HDR 4 EV +
11 = HDR 5 EV +
13 = HDR 6 EV
+
4428ExposureCompensationint16s 
4446PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
4447PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
4451PictureEffect2int8u--> Sony PictureEffect2 Values
4464Quality2int8u0 = JPEG +
1 = RAW +
2 = RAW + JPEG
4468MeteringModeint8u0 = Multi-segment +
2 = Center-weighted average +
3 = Spot +
4 = Average +
5 = Highlight
4469ExposureProgramint8u--> Sony ExposureProgram3 Values
4476WB_RGBLevelsint16u[3] 
+ +

Sony ReleaseMode2 Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueReleaseMode2ValueReleaseMode2
0= Normal16= Continuous - 3D Image
1= Continuous17= Continuous - Burst 2
2= Continuous - Exposure Bracketing18= Normal - iAuto+
3= DRO or White Balance Bracketing19= Continuous - Speed/Advance Priority
5= Continuous - Burst20= Continuous - Multi Frame NR
6= Single Frame - Capture During Movie23= Single-frame - Exposure Bracketing
7= Continuous - Sweep Panorama26= Continuous Low
8= Continuous - Anti-Motion Blur, Hand-held Twilight27= Continuous - High Sensitivity
9= Continuous - HDR28= Smile Shutter
10= Continuous - Background defocus29= Continuous - Tele-zoom Advance Priority
13= Continuous - 3D Sweep Panorama146= Single Frame - Movie Capture
15= Continuous - High Resolution Sweep Panorama  
+ +

Sony PictureEffect2 Values

+
+
+ + + + + + + + + + + + + + + + + +
ValuePictureEffect2ValuePictureEffect2ValuePictureEffect2
0= Off5= Soft High Key10= Rich-tone Monochrome
1= Toy Camera6= Partial Color11= Miniature
2= Pop Color7= High Contrast Monochrome12= Water Color
3= Posterization8= Soft Focus13= Illustration
4= Retro Photo9= HDR Painting  
+ +

Sony ExposureProgram3 Values

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueExposureProgram3ValueExposureProgram3ValueExposureProgram3
0= Program AE11= Twilight Portrait27= Gourmet
1= Aperture-priority AE12= Sunset28= Pet
2= Shutter speed priority AE14= Action (High speed)29= Macro
3= Manual16= Sports30= Backlight Correction HDR
4= Auto17= Handheld Night Shot33= Sweep Panorama
5= iAuto18= Anti Motion Blur36= Background Defocus
6= Superior Auto19= High Sensitivity37= Soft Skin
7= iAuto+21= Beach42= 3D Image
8= Portrait22= Snow43= Cont. Priority AE
9= Landscape23= Fireworks45= Document
10= Twilight26= Underwater46= Party
+ +

Sony MeterInfo Tags

+

Information possibly related to metering. Extracted only if the Unknown +option is used.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0MeterInfo1Row1int32u[27] 
108MeterInfo1Row2int32u[27] 
216MeterInfo1Row3int32u[27] 
324MeterInfo1Row4int32u[27] 
432MeterInfo1Row5int32u[27] 
540MeterInfo1Row6int32u[27] 
648MeterInfo1Row7int32u[27] 
756MeterInfo2Row1int32u[33] 
888MeterInfo2Row2int32u[33] 
1020MeterInfo2Row3int32u[33] 
1152MeterInfo2Row4int32u[33] 
1284MeterInfo2Row5int32u[33] 
1416MeterInfo2Row6int32u[33] 
1548MeterInfo2Row7int32u[33] 
1680MeterInfo2Row8int32u[33] 
1812MeterInfo2Row9int32u[33] 
+ +

Sony Tag2010b Tags

+

Valid for SLT-A65/A77, NEX-7/VG20E.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0SequenceImageNumberint32u(number of images captured in burst sequence)
4SequenceFileNumberint32u(file number in burst sequence)
8ReleaseMode2int32u--> Sony ReleaseMode2 Values
438SonyDateTimeundef[7] 
804DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
1204MeterInfo?---> Sony MeterInfo Tags
4392ReleaseMode3int8u +
0 = Normal +
1 = Continuous +
2 = Bracketing +
4 = Continuous - Burst +
5 = Continuous - Speed/Advance Priority +
6 = Normal - Self-timer +
9 = Single Burst Shooting
+
4396ReleaseMode2int8u--> Sony ReleaseMode2 Values
4404SelfTimerint8u0 = Off +
1 = Self-timer 10 s +
2 = Self-timer 2 s
4408FlashModeint8u + +
0 = Autoflash +
1 = Fill-flash +
2 = Flash Off
  3 = Slow Sync +
4 = Rear Sync +
6 = Wireless
+
4414StopsAboveBaseISOint16u 
4416BrightnessValueint16u 
4420DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
4424HDRSettingint8u + +
0 = Off +
1 = HDR Auto +
3 = HDR 1 EV +
5 = HDR 2 EV
  7 = HDR 3 EV +
9 = HDR 4 EV +
11 = HDR 5 EV +
13 = HDR 6 EV
+
4428ExposureCompensationint16s 
4450PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
4451PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
4455PictureEffect2int8u--> Sony PictureEffect2 Values
4468Quality2int8u0 = JPEG +
1 = RAW +
2 = RAW + JPEG
4472MeteringModeint8u0 = Multi-segment +
2 = Center-weighted average +
3 = Spot +
4 = Average +
5 = Highlight
4473ExposureProgramint8u--> Sony ExposureProgram3 Values
4480WB_RGBLevelsint16u[3] 
4632SonyISOint16u 
6691DistortionCorrParamsint16s[16] 
+ +

Sony Tag2010c Tags

+

Valid for SLT-A37/A57 and NEX-F3.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0SequenceImageNumberint32u(number of images captured in burst sequence)
4SequenceFileNumberint32u(file number in burst sequence)
8ReleaseMode2int32u--> Sony ReleaseMode2 Values
512DigitalZoomRatioint8u 
528SonyDateTimeundef[7] 
768DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
1168MeterInfo?---> Sony MeterInfo Tags
4356ReleaseMode3int8u +
0 = Normal +
1 = Continuous +
2 = Bracketing +
4 = Continuous - Burst +
5 = Continuous - Speed/Advance Priority +
6 = Normal - Self-timer +
9 = Single Burst Shooting
+
4360ReleaseMode2int8u--> Sony ReleaseMode2 Values
4368SelfTimerint8u0 = Off +
1 = Self-timer 10 s +
2 = Self-timer 2 s
4372FlashModeint8u + +
0 = Autoflash +
1 = Fill-flash +
2 = Flash Off
  3 = Slow Sync +
4 = Rear Sync +
6 = Wireless
+
4378StopsAboveBaseISOint16u 
4380BrightnessValueint16u 
4384DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
4388HDRSettingint8u + +
0 = Off +
1 = HDR Auto +
3 = HDR 1 EV +
5 = HDR 2 EV
  7 = HDR 3 EV +
9 = HDR 4 EV +
11 = HDR 5 EV +
13 = HDR 6 EV
+
4392ExposureCompensationint16s 
4414PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
4415PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
4419PictureEffect2int8u--> Sony PictureEffect2 Values
4432Quality2int8u0 = JPEG +
1 = RAW +
2 = RAW + JPEG
4436MeteringModeint8u0 = Multi-segment +
2 = Center-weighted average +
3 = Spot +
4 = Average +
5 = Highlight
4437ExposureProgramint8u--> Sony ExposureProgram3 Values
4444WB_RGBLevelsint16u[3] 
4596SonyISOint16u 
+ +

Sony Tag2010d Tags

+

Valid for DSC-HX10V/HX20V/HX200V/TX66/TX200V/TX300V/WX50/WX100/WX150, but +not valid for panorama images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0SequenceImageNumberint32u(number of images captured in burst sequence)
4SequenceFileNumberint32u(file number in burst sequence)
8ReleaseMode2int32u--> Sony ReleaseMode2 Values
510SonyDateTimeundef[7] 
892DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
1292MeterInfo?---> Sony MeterInfo Tags
4480ReleaseMode3int8u +
0 = Normal +
1 = Continuous +
2 = Bracketing +
4 = Continuous - Burst +
5 = Continuous - Speed/Advance Priority +
6 = Normal - Self-timer +
9 = Single Burst Shooting
+
4484ReleaseMode2int8u--> Sony ReleaseMode2 Values
4492SelfTimerint8u0 = Off +
1 = Self-timer 10 s +
2 = Self-timer 2 s
4496FlashModeint8u + +
0 = Autoflash +
1 = Fill-flash +
2 = Flash Off
  3 = Slow Sync +
4 = Rear Sync +
6 = Wireless
+
4502StopsAboveBaseISOint16u 
4504BrightnessValueint16u 
4508DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
4512HDRSettingint8u + +
0 = Off +
1 = HDR Auto +
3 = HDR 1 EV +
5 = HDR 2 EV
  7 = HDR 3 EV +
9 = HDR 4 EV +
11 = HDR 5 EV +
13 = HDR 6 EV
+
4538PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
4539PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
4543PictureEffect2int8u--> Sony PictureEffect2 Values
4560MeteringModeint8u0 = Multi-segment +
2 = Center-weighted average +
3 = Spot +
4 = Average +
5 = Highlight
4561ExposureProgramint8u--> Sony ExposureProgram3 Values
4568WB_RGBLevelsint16u[3] 
4720SonyISOint16u 
+ +

Sony Tag2010e Tags

+

Valid for SLT-A58/A99, ILCE-3000/3500, NEX-3N/5R/5T/6/VG30E/VG900, +DSC-RX100, DSC-RX1/RX1R. Also valid for DSC-HX300/HX50V/TX30/WX60/WX200/ +WX300, but not for panorama images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0SequenceImageNumberint32u(number of images captured in burst sequence)
4SequenceFileNumberint32u(file number in burst sequence)
8ReleaseMode2int32u--> Sony ReleaseMode2 Values
540DigitalZoomRatioint8u 
556SonyDateTimeundef[7] 
808DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
1208MeterInfo?---> Sony MeterInfo Tags
4444ReleaseMode3int8u +
0 = Normal +
1 = Continuous +
2 = Bracketing +
4 = Continuous - Burst +
5 = Continuous - Speed/Advance Priority +
6 = Normal - Self-timer +
9 = Single Burst Shooting
+
4448ReleaseMode2int8u--> Sony ReleaseMode2 Values
4456SelfTimerint8u0 = Off +
1 = Self-timer 10 s +
2 = Self-timer 2 s
4460FlashModeint8u + +
0 = Autoflash +
1 = Fill-flash +
2 = Flash Off
  3 = Slow Sync +
4 = Rear Sync +
6 = Wireless
+
4466StopsAboveBaseISOint16u 
4468BrightnessValueint16u 
4472DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
4476HDRSettingint8u + +
0 = Off +
1 = HDR Auto +
3 = HDR 1 EV +
5 = HDR 2 EV
  7 = HDR 3 EV +
9 = HDR 4 EV +
11 = HDR 5 EV +
13 = HDR 6 EV
+
4480ExposureCompensationint16s 
4502PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
4503PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
4507PictureEffect2int8u--> Sony PictureEffect2 Values
4520Quality2int8u0 = JPEG +
1 = RAW +
2 = RAW + JPEG
4524MeteringModeint8u0 = Multi-segment +
2 = Center-weighted average +
3 = Spot +
4 = Average +
5 = Highlight
4525ExposureProgramint8u--> Sony ExposureProgram3 Values
4532WB_RGBLevelsint16u[3] 
4692SonyISOint16u 
4696SonyISOint16u 
4728FocalLengthint16u 
4730MinFocalLengthint16u 
4732MaxFocalLengthint16u 
4736SonyISOint16u 
6256DistortionCorrParamsint16s[16] 
6289LensFormatint8u0 = Unknown +
1 = APS-C +
2 = Full-frame
6290LensMountint8u0 = Unknown +
1 = A-mount +
2 = E-mount
6291LensType2int16u--> Sony LensType2 Values
6294LensTypeint16u--> Sony LensType Values
6296DistortionCorrParamsPresentint8u0 = No +
1 = Yes
6297DistortionCorrParamsNumberint8u11 = 11 (APS-C) +
16 = 16 (Full-frame)
+ +

Sony Tag2010f Tags

+

Valid for DSC-RX100M2, DSC-QX10/QX100.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4ReleaseMode2int32u--> Sony ReleaseMode2 Values
80DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
480MeterInfo?---> Sony MeterInfo Tags
4116ReleaseMode3int8u +
0 = Normal +
1 = Continuous +
2 = Bracketing +
4 = Continuous - Burst +
5 = Continuous - Speed/Advance Priority +
6 = Normal - Self-timer +
9 = Single Burst Shooting
+
4120ReleaseMode2int8u--> Sony ReleaseMode2 Values
4128SelfTimerint8u0 = Off +
1 = Self-timer 10 s +
2 = Self-timer 2 s
4132FlashModeint8u + +
0 = Autoflash +
1 = Fill-flash +
2 = Flash Off
  3 = Slow Sync +
4 = Rear Sync +
6 = Wireless
+
4138StopsAboveBaseISOint16u 
4140BrightnessValueint16u 
4144DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
4148HDRSettingint8u + +
0 = Off +
1 = HDR Auto +
3 = HDR 1 EV +
5 = HDR 2 EV
  7 = HDR 3 EV +
9 = HDR 4 EV +
11 = HDR 5 EV +
13 = HDR 6 EV
+
4152ExposureCompensationint16s 
4174PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
4175PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
4179PictureEffect2int8u--> Sony PictureEffect2 Values
4192Quality2int8u0 = JPEG +
1 = RAW +
2 = RAW + JPEG
4196MeteringModeint8u0 = Multi-segment +
2 = Center-weighted average +
3 = Spot +
4 = Average +
5 = Highlight
4197ExposureProgramint8u--> Sony ExposureProgram3 Values
4204WB_RGBLevelsint16u[3] 
4404FocalLengthint16u 
4406MinFocalLengthint16u 
4408MaxFocalLengthint16u 
4412SonyISOint16u 
+ +

Sony Tag2010g Tags

+

Valid for DSC-HX60V/HX350/HX400V/QX30/RX10/RX100M3/WX220/WX350, +ILCE-7/7R/7S/7M2/5000/5100/6000/QX1, ILCA-68/77M2.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4ReleaseMode2int32u--> Sony ReleaseMode2 Values
80DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
524ReleaseMode3int8u +
0 = Normal +
1 = Continuous +
2 = Bracketing +
4 = Continuous - Burst +
5 = Continuous - Speed/Advance Priority +
6 = Normal - Self-timer +
9 = Single Burst Shooting
+
528ReleaseMode2int8u--> Sony ReleaseMode2 Values
536SelfTimerint8u0 = Off +
1 = Self-timer 10 s +
2 = Self-timer 2 s
540FlashModeint8u + +
0 = Autoflash +
1 = Fill-flash +
2 = Flash Off
  3 = Slow Sync +
4 = Rear Sync +
6 = Wireless
+
546StopsAboveBaseISOint16u 
548BrightnessValueint16u 
552DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
556HDRSettingint8u + +
0 = Off +
1 = HDR Auto +
3 = HDR 1 EV +
5 = HDR 2 EV
  7 = HDR 3 EV +
9 = HDR 4 EV +
11 = HDR 5 EV +
13 = HDR 6 EV
+
560ExposureCompensationint16s 
582PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
583PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
587PictureEffect2int8u--> Sony PictureEffect2 Values
600Quality2int8u0 = JPEG +
1 = RAW +
2 = RAW + JPEG
604MeteringModeint8u0 = Multi-segment +
2 = Center-weighted average +
3 = Spot +
4 = Average +
5 = Highlight
605ExposureProgramint8u--> Sony ExposureProgram3 Values
612WB_RGBLevelsint16u[3] 
812FocalLengthint16u 
814MinFocalLengthint16u 
816MaxFocalLengthint16u 
836SonyISOint16u 
904MeterInfo?---> Sony MeterInfo Tags
6300DistortionCorrParamsint16s[16] 
6333LensFormatint8u0 = Unknown +
1 = APS-C +
2 = Full-frame
6334LensMountint8u0 = Unknown +
1 = A-mount +
2 = E-mount
6335LensType2int16u--> Sony LensType2 Values
6338LensTypeint16u--> Sony LensType Values
6340DistortionCorrParamsPresentint8u0 = No +
1 = Yes
6341DistortionCorrParamsNumberint8u11 = 11 (APS-C) +
16 = 16 (Full-frame)
+ +

Sony Tag2010h Tags

+

Valid for DSC-HX80/HX90V/RX0/RX1RM2/RX10M2/RX10M3/RX100M4/RX100M5/WX500, +ILCE-6300/6500/7RM2/7SM2, ILCA-99M2.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4ReleaseMode2int32u--> Sony ReleaseMode2 Values
80DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
524ReleaseMode3int8u +
0 = Normal +
1 = Continuous +
2 = Bracketing +
4 = Continuous - Burst +
5 = Continuous - Speed/Advance Priority +
6 = Normal - Self-timer +
9 = Single Burst Shooting
+
528ReleaseMode2int8u--> Sony ReleaseMode2 Values
536SelfTimerint8u0 = Off +
1 = Self-timer 5 or 10 s +
2 = Self-timer 2 s
540FlashModeint8u + +
0 = Autoflash +
1 = Fill-flash +
2 = Flash Off
  3 = Slow Sync +
4 = Rear Sync +
6 = Wireless
+
546StopsAboveBaseISOint16u 
548BrightnessValueint16u 
552DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
556HDRSettingint8u + +
0 = Off +
1 = HDR Auto +
3 = HDR 1 EV +
5 = HDR 2 EV
  7 = HDR 3 EV +
9 = HDR 4 EV +
11 = HDR 5 EV +
13 = HDR 6 EV
+
560ExposureCompensationint16s 
582PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
583PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
587PictureEffect2int8u--> Sony PictureEffect2 Values
600Quality2int8u0 = JPEG +
1 = RAW +
2 = RAW + JPEG
604MeteringModeint8u0 = Multi-segment +
2 = Center-weighted average +
3 = Spot +
4 = Average +
5 = Highlight
605ExposureProgramint8u--> Sony ExposureProgram3 Values
612WB_RGBLevelsint16u[3] 
812FocalLengthint16u 
814MinFocalLengthint16u 
816MaxFocalLengthint16u 
838SonyISOint16u 
904MeterInfo?---> Sony MeterInfo Tags
920MeterInfo?---> Sony MeterInfo Tags
6348DistortionCorrParamsint16s[16] 
6381LensFormatint8u0 = Unknown +
1 = APS-C +
2 = Full-frame
6382LensMountint8u0 = Unknown +
1 = A-mount +
2 = E-mount
6383LensType2int16u--> Sony LensType2 Values
6386LensTypeint16u--> Sony LensType Values
6388DistortionCorrParamsPresentint8u0 = No +
1 = Yes
6389DistortionCorrParamsNumberint8u11 = 11 (APS-C) +
16 = 16 (Full-frame)
+ +

Sony Tag2010i Tags

+

Valid for ILCE-6100/6400/6600/7C/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M6/ +RX100M5A/RX100M7/HX99.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4ReleaseMode2int32u--> Sony ReleaseMode2 Values
78DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
516ReleaseMode3int8u +
0 = Normal +
1 = Continuous +
2 = Bracketing +
4 = Continuous - Burst +
5 = Continuous - Speed/Advance Priority +
6 = Normal - Self-timer +
9 = Single Burst Shooting
+
520ReleaseMode2int8u--> Sony ReleaseMode2 Values
528SelfTimerint8u0 = Off +
1 = Self-timer 5 or 10 s +
2 = Self-timer 2 s
529FlashModeint8u + +
0 = Autoflash +
1 = Fill-flash +
2 = Flash Off
  3 = Slow Sync +
4 = Rear Sync +
6 = Wireless
+
535StopsAboveBaseISOint16u 
537BrightnessValueint16u 
539DynamicRangeOptimizerint8u + +
0 = Off +
1 = Auto +
3 = Lv1 +
4 = Lv2
  5 = Lv3 +
6 = Lv4 +
7 = Lv5 +
8 = n/a
+
543HDRSettingint8u + +
0 = Off +
1 = HDR Auto +
3 = HDR 1 EV +
5 = HDR 2 EV
  7 = HDR 3 EV +
9 = HDR 4 EV +
11 = HDR 5 EV +
13 = HDR 6 EV
+
547ExposureCompensationint16s 
567PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
568PictureProfileint8u +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
572PictureEffect2int8u--> Sony PictureEffect2 Values
583Quality2int8u0 = JPEG +
1 = RAW +
2 = RAW + JPEG
587MeteringModeint8u0 = Multi-segment +
2 = Center-weighted average +
3 = Spot +
4 = Average +
5 = Highlight
588ExposureProgramint8u--> Sony ExposureProgram3 Values
594WB_RGBLevelsint16u[3] 
778FocalLengthint16u 
780MinFocalLengthint16u 
782MaxFocalLengthint16u 
800SonyISOint16u 
877MeterInfo?---> Sony MeterInfo9 Tags
6096DistortionCorrParamsint16s[16] 
6129LensFormatint8u0 = Unknown +
1 = APS-C +
2 = Full-frame
6130LensMountint8u0 = Unknown +
1 = A-mount +
2 = E-mount
6131LensType2int16u--> Sony LensType2 Values
6134LensTypeint16u--> Sony LensType Values
6136DistortionCorrParamsPresentint8u0 = No +
1 = Yes
6137DistortionCorrParamsNumberint8u11 = 11 (APS-C) +
16 = 16 (Full-frame)
+ +

Sony MeterInfo9 Tags

+

Information possibly related to metering. Extracted only if the Unknown +option is used.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0MeterInfo1Row1no 
90MeterInfo1Row2no 
180MeterInfo1Row3no 
270MeterInfo1Row4no 
360MeterInfo1Row5no 
450MeterInfo1Row6no 
540MeterInfo1Row7no 
630MeterInfo2Row1no 
740MeterInfo2Row2no 
850MeterInfo2Row3no 
960MeterInfo2Row4no 
1070MeterInfo2Row5no 
1180MeterInfo2Row6no 
1290MeterInfo2Row7no 
1400MeterInfo2Row8no 
1510MeterInfo2Row9no 
+ +

Sony Tag202a Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1FocalPlaneAFPointsUsedint8u 
2FocalPlaneAFPointAreaint16u[2] 
6FocalPlaneAFPointLocation1int16u[2] 
10FocalPlaneAFPointLocation2int16u[2] 
14FocalPlaneAFPointLocation3int16u[2] 
18FocalPlaneAFPointLocation4int16u[2] 
22FocalPlaneAFPointLocation5int16u[2] 
26FocalPlaneAFPointLocation6int16u[2] 
30FocalPlaneAFPointLocation7int16u[2] 
34FocalPlaneAFPointLocation8int16u[2] 
38FocalPlaneAFPointLocation9int16u[2] 
42FocalPlaneAFPointLocation10int16u[2] 
46FocalPlaneAFPointLocation11int16u[2] 
50FocalPlaneAFPointLocation12int16u[2] 
54FocalPlaneAFPointLocation13int16u[2] 
58FocalPlaneAFPointLocation14int16u[2] 
62FocalPlaneAFPointLocation15int16u[2] 
+ +

Sony ShotInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
2FaceInfoOffsetno 
6SonyDateTimestring[20] 
26SonyImageHeightint16u 
28SonyImageWidthint16u 
48FacesDetectedint16u 
50FaceInfoLengthno 
52MetaVersionstring[16] 
72FaceInfo1---> Sony FaceInfo1 Tags
94FaceInfo2---> Sony FaceInfo2 Tags
+ +

Sony FaceInfo1 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Face1Positionint16u[4](top, left, height and width of detected face. Coordinates are relative to +the full-sized unrotated image, with increasing Y downwards)
32Face2Positionint16u[4] 
64Face3Positionint16u[4] 
96Face4Positionint16u[4] 
128Face5Positionint16u[4] 
160Face6Positionint16u[4] 
192Face7Positionint16u[4] 
224Face8Positionint16u[4] 
+ +

Sony FaceInfo2 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Face1Positionint16u[4](top, left, height and width of detected face. Coordinates are relative to +the full-sized unrotated image, with increasing Y downwards)
37Face2Positionint16u[4] 
74Face3Positionint16u[4] 
111Face4Positionint16u[4] 
148Face5Positionint16u[4] 
185Face6Positionint16u[4] 
222Face7Positionint16u[4] 
259Face8Positionint16u[4] 
+ +

Sony Tag900b Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
2FacesDetectedno + + +
0 = 0 +
33 = 5 +
57 = 2
  77 = 4 +
93 = 3 +
98 = 1
  115 = 8 +
168 = 6 +
241 = 7
+
189FaceDetectionno0 = Off +
98 = On
+ +

Sony Tag9050a Tags

+

Data for tags 0x9050, 0x94xx and 0x2010 is encrypted by a simple +substitution cipher, but the deciphered values are listed below.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0SonyMaxApertureint8u 
1SonyMinApertureint8u 
32Shutterint16u[3]'0 0 0' = Silent / Electronic (0 0 0)
49FlashStatusint8u +
0 = No Flash present +
2 = Flash Inhibited +
64 = Built-in Flash present +
65 = Built-in Flash Fired +
66 = Built-in Flash Inhibited +
128 = External Flash present +
129 = External Flash Fired
+
50ShutterCountint32u(total number of image exposures made by the camera, modulo 65536 for some +models)
58SonyExposureTimeint16u 
60SonyFNumberint16u 
63ReleaseMode2int8u--> Sony ReleaseMode2 Values
76ShutterCount2int32u 
81SonyDateTime2undef[6] 
103ReleaseMode2int8u--> Sony ReleaseMode2 Values
124InternalSerialNumberint8u[4]~ 
240InternalSerialNumberint8u[5] 
261LensMountint8u0 = Unknown +
1 = A-mount +
2 = E-mount
262LensFormatint8u0 = Unknown +
1 = APS-C +
2 = Full-frame
263LensType2int16u--> Sony LensType2 Values
265LensTypeint16u--> Sony LensType Values +
(SLT models, and NEX with A-mount lenses)
267DistortionCorrParamsPresentint8u0 = No +
1 = Yes
276APS-CSizeCaptureint8u0 = Off +
1 = On
277LensSpecFeaturesundef[2] 
278LensSpecFeaturesundef[2] 
416ShutterCount3int32u 
426ShutterCount3int32u 
445ShutterCount3int32u 
+ +

Sony Tag9050b Tags

+

Valid from July 2015 for ILCE-6100/6300/6400/6500/6600/7C/7M3/7RM2/7RM3/7RM4/ +7SM2/9/9M2, ILCA-99M2.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0SonyMaxApertureint8u 
1SonyMinApertureint8u 
38Shutterint16u[3]'0 0 0' = Silent / Electronic (0 0 0)
57FlashStatusint8u +
0 = No Flash present +
2 = Flash Inhibited +
64 = Built-in Flash present +
65 = Built-in Flash Fired +
66 = Built-in Flash Inhibited +
128 = External Flash present +
129 = External Flash Fired
+
58ShutterCountint32u(total number of image exposures made by the camera)
70SonyExposureTimeint16u 
72SonyFNumberint16u 
75ReleaseMode2int8u--> Sony ReleaseMode2 Values
80ShutterCount2int32u 
82ShutterCount2int32u 
88ShutterCount2int32u 
97SonyTimeMinSecno 
107ReleaseMode2int8u--> Sony ReleaseMode2 Values
109ReleaseMode2int8u--> Sony ReleaseMode2 Values
115ReleaseMode2int8u--> Sony ReleaseMode2 Values
136InternalSerialNumberint8u[6]~ 
261LensMountint8u0 = Unknown +
1 = A-mount +
2 = E-mount
262LensFormatint8u0 = Unknown +
1 = APS-C +
2 = Full-frame
263LensType2int16u--> Sony LensType2 Values
265LensTypeint16u--> Sony LensType Values +
(SLT models, and NEX with A-mount lenses)
267DistortionCorrParamsPresentint8u0 = No +
1 = Yes
276APS-CSizeCaptureint8u0 = Off +
1 = On
278LensSpecFeaturesundef[2] 
415ShutterCount3int32u 
459ShutterCount3int32u 
461ShutterCount3int32u 
491APS-CSizeCaptureint8u0 = Off +
1 = On
493LensSpecFeaturesundef[2] 
494APS-CSizeCaptureint8u0 = Off +
1 = On
496LensSpecFeaturesundef[2] 
538APS-CSizeCaptureint8u0 = Off +
1 = On
540LensSpecFeatures +
APS-CSizeCapture
undef[2]
int8u
0 = Off +
1 = On
542LensSpecFeaturesundef[2] 
+ +

Sony Tag9050c Tags

+

Valid from July 2020 for ILCE-1/7SM3, ILME-FX3.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
38Shutterint16u[3]'0 0 0' = Silent / Electronic (0 0 0)
57FlashStatusint8u +
0 = No Flash present +
2 = Flash Inhibited +
64 = Built-in Flash present +
65 = Built-in Flash Fired +
66 = Built-in Flash Inhibited +
128 = External Flash present +
129 = External Flash Fired
+
58ShutterCountint32u~(total number of image exposures made by the camera)
70SonyExposureTimeint16u 
72SonyFNumberint16u 
75ReleaseMode2int8u--> Sony ReleaseMode2 Values
80ShutterCount2int32u 
102SonyExposureTimeint16u 
104SonyFNumberint16u 
107ReleaseMode2int8u--> Sony ReleaseMode2 Values
136InternalSerialNumberint8u[6]~ 
138InternalSerialNumberint8u[6]~ 
+ +

Sony Tag9400a Tags

+

Valid for many DSC, NEX and SLT models

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
8SequenceImageNumberint32u(number of images captured in burst sequence)
12SequenceFileNumberint32u(file number in burst sequence)
16ReleaseMode2int8u--> Sony ReleaseMode2 Values
18DigitalZoomint8u0 = No +
1 = Yes
26ShotNumberSincePowerUpint32u 
34SequenceLengthint8u +
0 = Continuous +
1 = 1 shot +
2 = 2 shots +
3 = 3 shots +
4 = 4 shots +
5 = 5 shots +
6 = 6 shots +
10 = 10 shots +
100 = Continuous - iSweep Panorama +
200 = Continuous - Sweep Panorama
+
40CameraOrientationint8u1 = Horizontal (normal) +
3 = Rotate 180 +
6 = Rotate 90 CW +
8 = Rotate 270 CW
41Quality2int8u0 = JPEG +
1 = RAW +
2 = RAW + JPEG +
3 = JPEG + MPO
68SonyImageHeightint16u~ 
82ModelReleaseYearint8u~ 
+ +

Sony Tag9400b Tags

+

Valid for NEX-3N, ILCE-3000/3500, SLT-A58, DSC-WX60, DSC-WX300, DSC-RX100M2, +DSC-HX50V, DSC-QX10/QX100.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
8SequenceImageNumberint32u(number of images captured in burst sequence)
12SequenceFileNumberint32u(file number in burst sequence)
16ReleaseMode2int8u--> Sony ReleaseMode2 Values
18DigitalZoomint8u0 = No +
1 = Yes
22ShotNumberSincePowerUpint32u 
30SequenceLengthint8u +
0 = Continuous +
1 = 1 shot +
2 = 2 shots +
3 = 3 shots +
4 = 4 shots +
5 = 5 shots +
6 = 6 shots +
10 = 10 shots +
100 = Continuous - iSweep Panorama +
200 = Continuous - Sweep Panorama
+
36CameraOrientationint8u1 = Horizontal (normal) +
3 = Rotate 180 +
6 = Rotate 90 CW +
8 = Rotate 270 CW
37Quality2int8u0 = JPEG +
1 = RAW +
2 = RAW + JPEG +
3 = JPEG + MPO
63SonyImageHeightint16u~ 
70ModelReleaseYearint8u~ 
+ +

Sony Tag9400c Tags

+

Valid for DSC-HX60V/HX80/HX90V/HX99/HX350/HX400V/QX30/RX0/RX1RM2/RX10/ +RX10M2/RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/WX220/ +WX350/WX500, ILCE-1/7/7C/7R/7S/7M2/7M3/7RM2/7RM3/7RM4/7SM2/7SM3/9/9M2/5000/ +5100/6000/6100/6300/6400/6500/6600/QX1, ILCA-68/77M2/99M2.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
9ReleaseMode2int8u--> Sony ReleaseMode2 Values
10ShotNumberSincePowerUpint32u(valid only for some models)
18SequenceImageNumberint32u(number of images captured in burst sequence)
22SequenceLengthint8u +
0 = Continuous +
1 = 1 shot +
2 = 2 shots +
3 = 3 shots +
4 = 4 shots +
5 = 5 shots +
6 = 6 shots +
7 = 7 shots +
9 = 9 shots +
10 = 10 shots +
12 = 12 shots +
16 = 16 shots +
100 = Continuous - iSweep Panorama +
200 = Continuous - Sweep Panorama
+
26SequenceFileNumberint32u(file number in burst sequence)
30SequenceLengthint8u + +
0 = Continuous +
1 = 1 file +
2 = 2 files +
3 = 3 files
  5 = 5 files +
7 = 7 files +
9 = 9 files +
10 = 10 files
+
41CameraOrientationint8u1 = Horizontal (normal) +
3 = Rotate 180 +
6 = Rotate 90 CW +
8 = Rotate 270 CW
42Quality2int8u0 = JPEG +
1 = RAW +
2 = RAW + JPEG +
3 = JPEG + MPO +
1 = JPEG +
2 = RAW +
3 = RAW + JPEG +
4 = HEIF +
6 = RAW + HEIF
71SonyImageHeightint16u~ 
83ModelReleaseYearint8u~ 
+ +

Sony Tag9401 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1176ISOInfo---> Sony ISOInfo Tags
1181ISOInfo---> Sony ISOInfo Tags
1185ISOInfo---> Sony ISOInfo Tags
1186ISOInfo---> Sony ISOInfo Tags
1437ISOInfo---> Sony ISOInfo Tags
1588ISOInfo---> Sony ISOInfo Tags
1590ISOInfo---> Sony ISOInfo Tags
1612ISOInfo---> Sony ISOInfo Tags
1619ISOInfo---> Sony ISOInfo Tags
1656ISOInfo---> Sony ISOInfo Tags
1720ISOInfo---> Sony ISOInfo Tags
1758ISOInfo---> Sony ISOInfo Tags
1767ISOInfo---> Sony ISOInfo Tags
+ +

Sony ISOInfo Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0ISOSettingint8u 
2ISOAutoMinint8u 
4ISOAutoMaxint8u 
+ +

Sony Tag9402 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4AmbientTemperatureint8s 
22FocusModeint8u[val & 0x7f] +
0 = Manual +
2 = AF-S +
3 = AF-C +
4 = AF-A +
6 = DMF
23AFAreaModeint8u +
0 = Multi +
1 = Center +
2 = Spot +
3 = Flexible Spot +
10 = Selective (for Miniature effect) +
11 = Zone +
12 = Expanded Flexible Spot +
14 = Tracking +
15 = Face Tracking +
20 = Animal Eye Tracking +
255 = Manual
+
45FocusPosition2int8u 
+ +

Sony Tag9403 Tags

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
5CameraTemperatureint8s 
+ +

Sony Tag9404a Tags

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
11ExposureProgramint8u--> Sony ExposureProgram3 Values
13IntelligentAutoint8u0 = Off +
1 = On
25LensZoomPositionint16u 
+ +

Sony Tag9404b Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
12ExposureProgramint8u--> Sony ExposureProgram3 Values
14IntelligentAutoint8u0 = Off +
1 = On
30LensZoomPositionint16u 
32FocusPosition2int8u 
+ +

Sony Tag9404c Tags

+
+
+ + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
11ExposureProgramint8u--> Sony ExposureProgram3 Values
13IntelligentAutoint8u0 = Off +
1 = On
+ +

Sony Tag9405a Tags

+

Valid for SLT, NEX, ILCE-3000/3500 and several DSC models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
1536DistortionCorrParamsPresentint8u0 = No +
1 = Yes
1537DistortionCorrectionint8u0 = None +
1 = Applied
1539LensFormatint8u0 = Unknown +
1 = APS-C +
2 = Full-frame
1540LensMountint8u0 = Unknown +
1 = A-mount +
2 = E-mount
1541LensType2int16u--> Sony LensType2 Values +
(E-mount lenses)
1544LensTypeint16u--> Sony LensType Values +
(A-mount lenses on SLT and NEX)
1610VignettingCorrParamsint16s[16] 
1642ChromaticAberrationCorrParamsint16s[32] 
1738DistortionCorrParamsint16s[16] 
+ +

Sony Tag9405b Tags

+

Valid for DSC-HX60V/HX80/HX90V/HX99/HX350/HX400V/QX30/RX0/RX10/RX10M2/ +RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/WX220/WX350, +ILCE-7/7M2/7M3/7R/7RM2/7RM3/7RM4/7S/7SM2/9/9M2/5000/5100/6000/6100/6300/ +6400/6500/6600/QX1, ILCA-68/77M2/99M2.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
4SonyISOint16u 
6BaseISOint16u 
10StopsAboveBaseISOint16u 
14SonyExposureTime2int16u 
16ExposureTimerational32u 
20SonyFNumberint16u 
22SonyMaxApertureValueint16u 
36SequenceImageNumberint32u(number of images captured in burst sequence)
52ReleaseMode2int8u--> Sony ReleaseMode2 Values
62SonyImageWidthMaxint16u 
64SonyImageHeightMaxint16u 
66HighISONoiseReductionint8u0 = Off +
1 = Low +
2 = Normal +
3 = High
68LongExposureNoiseReductionint8u0 = Off +
1 = On
70PictureEffect2int8u--> Sony PictureEffect2 Values
72ExposureProgramint8u--> Sony ExposureProgram3 Values
74CreativeStyleint8u +
0 = Standard +
1 = Vivid +
2 = Neutral +
3 = Portrait +
4 = Landscape +
5 = B&W +
6 = Clear +
7 = Deep +
8 = Light +
9 = Sunset +
10 = Night View/Portrait +
11 = Autumn Leaves +
13 = Sepia
+
82Sharpnessint8s 
90DistortionCorrParamsPresentint8u0 = No +
1 = Yes
91DistortionCorrectionint8u0 = None +
1 = Applied
93LensFormatint8u0 = Unknown +
1 = APS-C +
2 = Full-frame
94LensMountint8u0 = Unknown +
1 = A-mount +
2 = E-mount
96LensType2int16u--> Sony LensType2 Values +
(E-mount lenses)
98LensTypeint16u--> Sony LensType Values +
(A-mount lenses on SLT and NEX)
100DistortionCorrParamsint16s[16] 
834LensZoomPositionint16u 
842VignettingCorrParamsint16s[16] 
846LensZoomPositionint16u 
848VignettingCorrParamsint16s[16] 
858LensZoomPositionint16u 
860VignettingCorrParamsint16s[16] 
872VignettingCorrParamsint16s[16] 
892ChromaticAberrationCorrParamsint16s[32] 
900ChromaticAberrationCorrParamsint16s[32] 
924ChromaticAberrationCorrParamsint16s[32] 
944ChromaticAberrationCorrParamsint16s[32] 
952ChromaticAberrationCorrParamsint16s[32] 
+ +

Sony Tag9406 Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
5BatteryTemperatureint8u 
6BatteryLevelGrip1int8u 
7BatteryLevelint8u 
8BatteryLevelGrip2int8u 
+ +

Sony Tag940a Tags

+

These tags are currently extracted for SLT models only.

+
+
+ + + + + + + + +
Index1Tag NameWritableValues / Notes
4AFPointsSelectedint32u + +
0x0 = (none) +
0x7801 = Center Zone +
0x1821c = Right Zone +
0x3ffff = (all LA-EA4) +
0x605c0 = Left Zone +
0x7fffffff = (all) +
0xffffffff = n/a +
Bit 0 = Center +
Bit 1 = Top +
Bit 2 = Upper-right +
Bit 3 = Right +
Bit 4 = Lower-right +
Bit 5 = Bottom
  Bit 6 = Lower-left +
Bit 7 = Left +
Bit 8 = Upper-left +
Bit 9 = Far Right +
Bit 10 = Far Left +
Bit 11 = Upper-middle +
Bit 12 = Near Right +
Bit 13 = Lower-middle +
Bit 14 = Near Left +
Bit 15 = Upper Far Right +
Bit 16 = Lower Far Right +
Bit 17 = Lower Far Left +
Bit 18 = Upper Far Left
+
+ +

Sony Tag940c Tags

+

E-mount cameras only.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
8LensMount2int8u0 = Unknown +
1 = A-mount (1) +
4 = E-mount +
5 = A-mount (5)
9LensType3int16u--> Sony LensType2 Values
11CameraE-mountVersionint16u 
13LensE-mountVersionint16u 
20LensFirmwareVersionint16u~ 
+ +

Sony AFInfo Tags

+

These tags are currently extracted for SLT models only.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
2AFTypeint8u1 = 15-point +
2 = 19-point +
3 = 79-point
4AFStatusActiveSensorint16s + +
-32768 = Out of Focus  0 = In Focus
+
5FocusModeint8u(ILCA models only) +
0 = Manual +
2 = AF-S +
3 = AF-C +
4 = AF-A +
6 = DMF
7AFPointint8u(models with 15-point AF) + +
0 = Upper-left +
1 = Left +
2 = Lower-left +
3 = Far Left +
4 = Top (horizontal) +
5 = Near Right +
6 = Center (horizontal) +
7 = Near Left +
8 = Bottom (horizontal)
  9 = Top (vertical) +
10 = Center (vertical) +
11 = Bottom (vertical) +
12 = Far Right +
13 = Upper-right +
14 = Right +
15 = Lower-right +
16 = Upper-middle +
17 = Lower-middle
+(models with 19-point AF) + +
0 = Upper Far Left +
1 = Upper-left (horizontal) +
2 = Far Left (horizontal) +
3 = Left (horizontal) +
4 = Lower Far Left +
5 = Lower-left (horizontal) +
6 = Upper-left (vertical) +
7 = Left (vertical) +
8 = Lower-left (vertical) +
9 = Far Left (vertical) +
10 = Top (horizontal) +
11 = Near Right +
12 = Center (horizontal) +
13 = Near Left +
14 = Bottom (horizontal)
  15 = Top (vertical) +
16 = Upper-middle +
17 = Center (vertical) +
18 = Lower-middle +
19 = Bottom (vertical) +
20 = Upper Far Right +
21 = Upper-right (horizontal) +
22 = Far Right (horizontal) +
23 = Right (horizontal) +
24 = Lower Far Right +
25 = Lower-right (horizontal) +
26 = Far Right (vertical) +
27 = Upper-right (vertical) +
28 = Right (vertical) +
29 = Lower-right (vertical)
+
8AFPointInFocusint8u(models with 15-point AF) + +
0 = Upper-left +
1 = Left +
2 = Lower-left +
3 = Far Left +
4 = Top (horizontal) +
5 = Near Right +
6 = Center (horizontal) +
7 = Near Left +
8 = Bottom (horizontal) +
9 = Top (vertical)
  10 = Center (vertical) +
11 = Bottom (vertical) +
12 = Far Right +
13 = Upper-right +
14 = Right +
15 = Lower-right +
16 = Upper-middle +
17 = Lower-middle +
255 = (none)
+(models with 19-point AF) + +
0 = Upper Far Left +
1 = Upper-left (horizontal) +
2 = Far Left (horizontal) +
3 = Left (horizontal) +
4 = Lower Far Left +
5 = Lower-left (horizontal) +
6 = Upper-left (vertical) +
7 = Left (vertical) +
8 = Lower-left (vertical) +
9 = Far Left (vertical) +
10 = Top (horizontal) +
11 = Near Right +
12 = Center (horizontal) +
13 = Near Left +
14 = Bottom (horizontal) +
15 = Top (vertical)
  16 = Upper-middle +
17 = Center (vertical) +
18 = Lower-middle +
19 = Bottom (vertical) +
20 = Upper Far Right +
21 = Upper-right (horizontal) +
22 = Far Right (horizontal) +
23 = Right (horizontal) +
24 = Lower Far Right +
25 = Lower-right (horizontal) +
26 = Far Right (vertical) +
27 = Upper-right (vertical) +
28 = Right (vertical) +
29 = Lower-right (vertical) +
255 = (none)
+
9AFPointAtShutterReleaseint8u(models with 15-point AF) + +
0 = Upper-left +
1 = Left +
2 = Lower-left +
3 = Far Left +
4 = Top (horizontal) +
5 = Near Right +
6 = Center (horizontal) +
7 = Near Left +
8 = Bottom (horizontal) +
9 = Top (vertical)
  10 = Center (vertical) +
11 = Bottom (vertical) +
12 = Far Right +
13 = Upper-right +
14 = Right +
15 = Lower-right +
16 = Upper-middle +
17 = Lower-middle +
30 = (out of focus)
+(models with 19-point AF) + +
0 = Upper Far Left +
1 = Upper-left (horizontal) +
2 = Far Left (horizontal) +
3 = Left (horizontal) +
4 = Lower Far Left +
5 = Lower-left (horizontal) +
6 = Upper-left (vertical) +
7 = Left (vertical) +
8 = Lower-left (vertical) +
9 = Far Left (vertical) +
10 = Top (horizontal) +
11 = Near Right +
12 = Center (horizontal) +
13 = Near Left +
14 = Bottom (horizontal) +
15 = Top (vertical)
  16 = Upper-middle +
17 = Center (vertical) +
18 = Lower-middle +
19 = Bottom (vertical) +
20 = Upper Far Right +
21 = Upper-right (horizontal) +
22 = Far Right (horizontal) +
23 = Right (horizontal) +
24 = Lower Far Right +
25 = Lower-right (horizontal) +
26 = Far Right (vertical) +
27 = Upper-right (vertical) +
28 = Right (vertical) +
29 = Lower-right (vertical) +
30 = (out of focus)
+
10AFAreaModeint8u0 = Wide +
1 = Spot +
2 = Local +
3 = Zone
11FocusModeint8u + +
0 = Manual +
2 = AF-S +
3 = AF-C
  4 = AF-A +
6 = DMF +
7 = AF-D
+
16AFPointsUsedint8u[10] + + +
0x0 = (none) +
Bit 0 = A5 +
Bit 1 = A6 +
Bit 2 = A7 +
Bit 3 = B2 +
Bit 4 = B3 +
Bit 5 = B4 +
Bit 6 = B5 +
Bit 7 = B6 +
Bit 8 = B7 +
Bit 9 = B8 +
Bit 10 = B9 +
Bit 11 = B10 +
Bit 12 = C1 +
Bit 13 = C2 +
Bit 14 = C3 +
Bit 15 = C4 +
Bit 16 = C5 +
Bit 17 = C6 +
Bit 18 = C7 +
Bit 19 = C8 +
Bit 20 = C9 +
Bit 21 = C10 +
Bit 22 = C11 +
Bit 23 = D1 +
Bit 24 = D2 +
Bit 25 = D3
  Bit 26 = D4 +
Bit 27 = D5 +
Bit 28 = D6 +
Bit 29 = D7 +
Bit 30 = D8 +
Bit 31 = D9 +
Bit 32 = D10 +
Bit 33 = D11 +
Bit 34 = E1 +
Bit 35 = E2 +
Bit 36 = E3 +
Bit 37 = E4 +
Bit 38 = E5 +
Bit 39 = E6 +
Bit 40 = E7 +
Bit 41 = E8 +
Bit 42 = E9 +
Bit 43 = E10 +
Bit 44 = E11 +
Bit 45 = F1 +
Bit 46 = F2 +
Bit 47 = F3 +
Bit 48 = F4 +
Bit 49 = F5 +
Bit 50 = F6 +
Bit 51 = F7 +
Bit 52 = F8
  Bit 53 = F9 +
Bit 54 = F10 +
Bit 55 = F11 +
Bit 56 = G1 +
Bit 57 = G2 +
Bit 58 = G3 +
Bit 59 = G4 +
Bit 60 = G5 +
Bit 61 = G6 +
Bit 62 = G7 +
Bit 63 = G8 +
Bit 64 = G9 +
Bit 65 = G10 +
Bit 66 = G11 +
Bit 67 = H2 +
Bit 68 = H3 +
Bit 69 = H4 +
Bit 70 = H5 +
Bit 71 = H6 +
Bit 72 = H7 +
Bit 73 = H8 +
Bit 74 = H9 +
Bit 75 = H10 +
Bit 76 = I5 +
Bit 77 = I6 +
Bit 78 = I7
+
17AFStatus15 +
AFStatus19
-
-
--> Sony AFStatus15 Tags +
--> Sony AFStatus19 Tags
55AFPointint8u + +
0 = B4 +
1 = C4 +
2 = D4 +
3 = E4 +
4 = F4 +
5 = G4 +
6 = H4 +
7 = B3 +
8 = C3 +
9 = D3 +
10 = E3 +
11 = F3 +
12 = G3 +
13 = H3 +
14 = B2 +
15 = C2 +
16 = D2 +
17 = E2 +
18 = F2 +
19 = G2 +
20 = H2 +
21 = C1 +
22 = D1 +
23 = E1 +
24 = F1 +
25 = G1 +
26 = A7 Vertical +
27 = A6 Vertical +
28 = A5 Vertical +
29 = C7 Vertical +
30 = C6 Vertical +
31 = C5 Vertical +
32 = E7 Vertical +
33 = E6 Center Vertical +
34 = E5 Vertical +
35 = G7 Vertical +
36 = G6 Vertical +
37 = G5 Vertical +
38 = I7 Vertical +
39 = I6 Vertical +
40 = I5 Vertical +
41 = A7 +
42 = B7 +
43 = C7 +
44 = D7 +
45 = E7 +
46 = F7 +
47 = G7
  48 = H7 +
49 = I7 +
50 = A6 +
51 = B6 +
52 = C6 +
53 = D6 +
54 = E6 Center +
55 = F6 +
56 = G6 +
57 = H6 +
58 = I6 +
59 = A5 +
60 = B5 +
61 = C5 +
62 = D5 +
63 = E5 +
64 = F5 +
65 = G5 +
66 = H5 +
67 = I5 +
68 = C11 +
69 = D11 +
70 = E11 +
71 = F11 +
72 = G11 +
73 = B10 +
74 = C10 +
75 = D10 +
76 = E10 +
77 = F10 +
78 = G10 +
79 = H10 +
80 = B9 +
81 = C9 +
82 = D9 +
83 = E9 +
84 = F9 +
85 = G9 +
86 = H9 +
87 = B8 +
88 = C8 +
89 = D8 +
90 = E8 +
91 = F8 +
92 = G8 +
93 = H8 +
94 = E6 Center F2.8 +
255 = (none)
+
56AFPointInFocusint8u + +
0 = B4 +
1 = C4 +
2 = D4 +
3 = E4 +
4 = F4 +
5 = G4 +
6 = H4 +
7 = B3 +
8 = C3 +
9 = D3 +
10 = E3 +
11 = F3 +
12 = G3 +
13 = H3 +
14 = B2 +
15 = C2 +
16 = D2 +
17 = E2 +
18 = F2 +
19 = G2 +
20 = H2 +
21 = C1 +
22 = D1 +
23 = E1 +
24 = F1 +
25 = G1 +
26 = A7 Vertical +
27 = A6 Vertical +
28 = A5 Vertical +
29 = C7 Vertical +
30 = C6 Vertical +
31 = C5 Vertical +
32 = E7 Vertical +
33 = E6 Center Vertical +
34 = E5 Vertical +
35 = G7 Vertical +
36 = G6 Vertical +
37 = G5 Vertical +
38 = I7 Vertical +
39 = I6 Vertical +
40 = I5 Vertical +
41 = A7 +
42 = B7 +
43 = C7 +
44 = D7 +
45 = E7 +
46 = F7 +
47 = G7
  48 = H7 +
49 = I7 +
50 = A6 +
51 = B6 +
52 = C6 +
53 = D6 +
54 = E6 Center +
55 = F6 +
56 = G6 +
57 = H6 +
58 = I6 +
59 = A5 +
60 = B5 +
61 = C5 +
62 = D5 +
63 = E5 +
64 = F5 +
65 = G5 +
66 = H5 +
67 = I5 +
68 = C11 +
69 = D11 +
70 = E11 +
71 = F11 +
72 = G11 +
73 = B10 +
74 = C10 +
75 = D10 +
76 = E10 +
77 = F10 +
78 = G10 +
79 = H10 +
80 = B9 +
81 = C9 +
82 = D9 +
83 = E9 +
84 = F9 +
85 = G9 +
86 = H9 +
87 = B8 +
88 = C8 +
89 = D8 +
90 = E8 +
91 = F8 +
92 = G8 +
93 = H8 +
94 = E6 Center F2.8 +
255 = (none)
+
57AFPointAtShutterReleaseint8u + +
0 = B4 +
1 = C4 +
2 = D4 +
3 = E4 +
4 = F4 +
5 = G4 +
6 = H4 +
7 = B3 +
8 = C3 +
9 = D3 +
10 = E3 +
11 = F3 +
12 = G3 +
13 = H3 +
14 = B2 +
15 = C2 +
16 = D2 +
17 = E2 +
18 = F2 +
19 = G2 +
20 = H2 +
21 = C1 +
22 = D1 +
23 = E1 +
24 = F1 +
25 = G1 +
26 = A7 Vertical +
27 = A6 Vertical +
28 = A5 Vertical +
29 = C7 Vertical +
30 = C6 Vertical +
31 = C5 Vertical +
32 = E7 Vertical +
33 = E6 Center Vertical +
34 = E5 Vertical +
35 = G7 Vertical +
36 = G6 Vertical +
37 = G5 Vertical +
38 = I7 Vertical +
39 = I6 Vertical +
40 = I5 Vertical +
41 = A7 +
42 = B7 +
43 = C7 +
44 = D7 +
45 = E7 +
46 = F7 +
47 = G7
  48 = H7 +
49 = I7 +
50 = A6 +
51 = B6 +
52 = C6 +
53 = D6 +
54 = E6 Center +
55 = F6 +
56 = G6 +
57 = H6 +
58 = I6 +
59 = A5 +
60 = B5 +
61 = C5 +
62 = D5 +
63 = E5 +
64 = F5 +
65 = G5 +
66 = H5 +
67 = I5 +
68 = C11 +
69 = D11 +
70 = E11 +
71 = F11 +
72 = G11 +
73 = B10 +
74 = C10 +
75 = D10 +
76 = E10 +
77 = F10 +
78 = G10 +
79 = H10 +
80 = B9 +
81 = C9 +
82 = D9 +
83 = E9 +
84 = F9 +
85 = G9 +
86 = H9 +
87 = B8 +
88 = C8 +
89 = D8 +
90 = E8 +
91 = F8 +
92 = G8 +
93 = H8 +
94 = E6 Center F2.8 +
95 = (none)
+
58AFAreaModeint8u0 = Wide +
1 = Center +
2 = Flexible Spot +
3 = Zone +
4 = Expanded Flexible Spot
59AFStatusActiveSensorint16s + +
-32768 = Out of Focus  0 = In Focus
+
67ExposureProgramint8u--> Sony ExposureProgram3 Values
80AFMicroAdjint8s 
125AFStatus79---> Sony AFStatus79 Tags
366AFPointsUsedint32u(SLT models only) + +
0x0 = (none) +
Bit 0 = Center +
Bit 1 = Top +
Bit 2 = Upper-right +
Bit 3 = Right +
Bit 4 = Lower-right +
Bit 5 = Bottom +
Bit 6 = Lower-left +
Bit 7 = Left +
Bit 8 = Upper-left
  Bit 9 = Far Right +
Bit 10 = Far Left +
Bit 11 = Upper-middle +
Bit 12 = Near Right +
Bit 13 = Lower-middle +
Bit 14 = Near Left +
Bit 15 = Upper Far Right +
Bit 16 = Lower Far Right +
Bit 17 = Lower Far Left +
Bit 18 = Upper Far Left
+
381AFMicroAdjint8s 
382ExposureProgramint8u--> Sony ExposureProgram3 Values
+ +

Sony AFStatus19 Tags

+

AF Status information for models with 19-point AF.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0AFStatusUpperFarLeftint16s + +
-32768 = Out of Focus  0 = In Focus
+
2AFStatusUpper-leftHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
4AFStatusFarLeftHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
6AFStatusLeftHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
8AFStatusLowerFarLeftint16s + +
-32768 = Out of Focus  0 = In Focus
+
10AFStatusLower-leftHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
12AFStatusUpper-leftVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
14AFStatusLeftVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
16AFStatusLower-leftVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
18AFStatusFarLeftVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
20AFStatusTopHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
22AFStatusNearRightint16s + +
-32768 = Out of Focus  0 = In Focus
+
24AFStatusCenterHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
26AFStatusNearLeftint16s + +
-32768 = Out of Focus  0 = In Focus
+
28AFStatusBottomHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
30AFStatusTopVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
32AFStatusUpper-middleint16s + +
-32768 = Out of Focus  0 = In Focus
+
34AFStatusCenterVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
36AFStatusLower-middleint16s + +
-32768 = Out of Focus  0 = In Focus
+
38AFStatusBottomVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
40AFStatusUpperFarRightint16s + +
-32768 = Out of Focus  0 = In Focus
+
42AFStatusUpper-rightHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
44AFStatusFarRightHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
46AFStatusRightHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
48AFStatusLowerFarRightint16s + +
-32768 = Out of Focus  0 = In Focus
+
50AFStatusLower-rightHorizontalint16s + +
-32768 = Out of Focus  0 = In Focus
+
52AFStatusFarRightVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
54AFStatusUpper-rightVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
56AFStatusRightVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
58AFStatusLower-rightVerticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
+ +

Sony AFStatus79 Tags

+

AF Status information for models with 79-point AF.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0AFStatus_00_B4int16s + +
-32768 = Out of Focus  0 = In Focus
+
2AFStatus_01_C4int16s + +
-32768 = Out of Focus  0 = In Focus
+
4AFStatus_02_D4int16s + +
-32768 = Out of Focus  0 = In Focus
+
6AFStatus_03_E4int16s + +
-32768 = Out of Focus  0 = In Focus
+
8AFStatus_04_F4int16s + +
-32768 = Out of Focus  0 = In Focus
+
10AFStatus_05_G4int16s + +
-32768 = Out of Focus  0 = In Focus
+
12AFStatus_06_H4int16s + +
-32768 = Out of Focus  0 = In Focus
+
14AFStatus_07_B3int16s + +
-32768 = Out of Focus  0 = In Focus
+
16AFStatus_08_C3int16s + +
-32768 = Out of Focus  0 = In Focus
+
18AFStatus_09_D3int16s + +
-32768 = Out of Focus  0 = In Focus
+
20AFStatus_10_E3int16s + +
-32768 = Out of Focus  0 = In Focus
+
22AFStatus_11_F3int16s + +
-32768 = Out of Focus  0 = In Focus
+
24AFStatus_12_G3int16s + +
-32768 = Out of Focus  0 = In Focus
+
26AFStatus_13_H3int16s + +
-32768 = Out of Focus  0 = In Focus
+
28AFStatus_14_B2int16s + +
-32768 = Out of Focus  0 = In Focus
+
30AFStatus_15_C2int16s + +
-32768 = Out of Focus  0 = In Focus
+
32AFStatus_16_D2int16s + +
-32768 = Out of Focus  0 = In Focus
+
34AFStatus_17_E2int16s + +
-32768 = Out of Focus  0 = In Focus
+
36AFStatus_18_F2int16s + +
-32768 = Out of Focus  0 = In Focus
+
38AFStatus_19_G2int16s + +
-32768 = Out of Focus  0 = In Focus
+
40AFStatus_20_H2int16s + +
-32768 = Out of Focus  0 = In Focus
+
42AFStatus_21_C1int16s + +
-32768 = Out of Focus  0 = In Focus
+
44AFStatus_22_D1int16s + +
-32768 = Out of Focus  0 = In Focus
+
46AFStatus_23_E1int16s + +
-32768 = Out of Focus  0 = In Focus
+
48AFStatus_24_F1int16s + +
-32768 = Out of Focus  0 = In Focus
+
50AFStatus_25_G1int16s + +
-32768 = Out of Focus  0 = In Focus
+
52AFStatus_26_A7_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
54AFStatus_27_A6_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
56AFStatus_28_A5_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
58AFStatus_29_C7_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
60AFStatus_30_C6_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
62AFStatus_31_C5_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
64AFStatus_32_E7_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
66AFStatus_33_E6_Center_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
68AFStatus_34_E5_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
70AFStatus_35_G7_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
72AFStatus_36_G6_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
74AFStatus_37_G5_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
76AFStatus_38_I7_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
78AFStatus_39_I6_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
80AFStatus_40_I5_Verticalint16s + +
-32768 = Out of Focus  0 = In Focus
+
82AFStatus_41_A7int16s + +
-32768 = Out of Focus  0 = In Focus
+
84AFStatus_42_B7int16s + +
-32768 = Out of Focus  0 = In Focus
+
86AFStatus_43_C7int16s + +
-32768 = Out of Focus  0 = In Focus
+
88AFStatus_44_D7int16s + +
-32768 = Out of Focus  0 = In Focus
+
90AFStatus_45_E7int16s + +
-32768 = Out of Focus  0 = In Focus
+
92AFStatus_46_F7int16s + +
-32768 = Out of Focus  0 = In Focus
+
94AFStatus_47_G7int16s + +
-32768 = Out of Focus  0 = In Focus
+
96AFStatus_48_H7int16s + +
-32768 = Out of Focus  0 = In Focus
+
98AFStatus_49_I7int16s + +
-32768 = Out of Focus  0 = In Focus
+
100AFStatus_50_A6int16s + +
-32768 = Out of Focus  0 = In Focus
+
102AFStatus_51_B6int16s + +
-32768 = Out of Focus  0 = In Focus
+
104AFStatus_52_C6int16s + +
-32768 = Out of Focus  0 = In Focus
+
106AFStatus_53_D6int16s + +
-32768 = Out of Focus  0 = In Focus
+
108AFStatus_54_E6_Centerint16s + +
-32768 = Out of Focus  0 = In Focus
+
110AFStatus_55_F6int16s + +
-32768 = Out of Focus  0 = In Focus
+
112AFStatus_56_G6int16s + +
-32768 = Out of Focus  0 = In Focus
+
114AFStatus_57_H6int16s + +
-32768 = Out of Focus  0 = In Focus
+
116AFStatus_58_I6int16s + +
-32768 = Out of Focus  0 = In Focus
+
118AFStatus_59_A5int16s + +
-32768 = Out of Focus  0 = In Focus
+
120AFStatus_60_B5int16s + +
-32768 = Out of Focus  0 = In Focus
+
122AFStatus_61_C5int16s + +
-32768 = Out of Focus  0 = In Focus
+
124AFStatus_62_D5int16s + +
-32768 = Out of Focus  0 = In Focus
+
126AFStatus_63_E5int16s + +
-32768 = Out of Focus  0 = In Focus
+
128AFStatus_64_F5int16s + +
-32768 = Out of Focus  0 = In Focus
+
130AFStatus_65_G5int16s + +
-32768 = Out of Focus  0 = In Focus
+
132AFStatus_66_H5int16s + +
-32768 = Out of Focus  0 = In Focus
+
134AFStatus_67_I5int16s + +
-32768 = Out of Focus  0 = In Focus
+
136AFStatus_68_C11int16s + +
-32768 = Out of Focus  0 = In Focus
+
138AFStatus_69_D11int16s + +
-32768 = Out of Focus  0 = In Focus
+
140AFStatus_70_E11int16s + +
-32768 = Out of Focus  0 = In Focus
+
142AFStatus_71_F11int16s + +
-32768 = Out of Focus  0 = In Focus
+
144AFStatus_72_G11int16s + +
-32768 = Out of Focus  0 = In Focus
+
146AFStatus_73_B10int16s + +
-32768 = Out of Focus  0 = In Focus
+
148AFStatus_74_C10int16s + +
-32768 = Out of Focus  0 = In Focus
+
150AFStatus_75_D10int16s + +
-32768 = Out of Focus  0 = In Focus
+
152AFStatus_76_E10int16s + +
-32768 = Out of Focus  0 = In Focus
+
154AFStatus_77_F10int16s + +
-32768 = Out of Focus  0 = In Focus
+
156AFStatus_78_G10int16s + +
-32768 = Out of Focus  0 = In Focus
+
158AFStatus_79_H10int16s + +
-32768 = Out of Focus  0 = In Focus
+
160AFStatus_80_B9int16s + +
-32768 = Out of Focus  0 = In Focus
+
162AFStatus_81_C9int16s + +
-32768 = Out of Focus  0 = In Focus
+
164AFStatus_82_D9int16s + +
-32768 = Out of Focus  0 = In Focus
+
166AFStatus_83_E9int16s + +
-32768 = Out of Focus  0 = In Focus
+
168AFStatus_84_F9int16s + +
-32768 = Out of Focus  0 = In Focus
+
170AFStatus_85_G9int16s + +
-32768 = Out of Focus  0 = In Focus
+
172AFStatus_86_H9int16s + +
-32768 = Out of Focus  0 = In Focus
+
174AFStatus_87_B8int16s + +
-32768 = Out of Focus  0 = In Focus
+
176AFStatus_88_C8int16s + +
-32768 = Out of Focus  0 = In Focus
+
178AFStatus_89_D8int16s + +
-32768 = Out of Focus  0 = In Focus
+
180AFStatus_90_E8int16s + +
-32768 = Out of Focus  0 = In Focus
+
182AFStatus_91_F8int16s + +
-32768 = Out of Focus  0 = In Focus
+
184AFStatus_92_G8int16s + +
-32768 = Out of Focus  0 = In Focus
+
186AFStatus_93_H8int16s + +
-32768 = Out of Focus  0 = In Focus
+
188AFStatus_94_E6_Center_F2-8int16s + +
-32768 = Out of Focus  0 = In Focus
+
+ +

Sony Tag940e Tags

+

E-mount models.

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
6662TiffMeteringImageWidthno 
6663TiffMeteringImageHeightno 
6664TiffMeteringImageno(13(?)-bit intensity data from 1320 (1200) metering segments, extracted as a +16-bit TIFF image)
+ +

Sony Tag9416 Tags

+

Valid for the ILCE-1/7M4/7SM3, ILME-FX3.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0Tag9416_0000no 
4SonyISOno 
6StopsAboveBaseISOno 
10SonyExposureTime2no 
12ExposureTimeno 
16SonyFNumber2no 
18SonyMaxApertureValueno 
29SequenceImageNumberno(number of images captured in burst sequence)
53ExposureProgramno--> Sony ExposureProgram3 Values
72LensMountno0 = Unknown +
1 = A-mount +
2 = E-mount +
3 = A-mount (3)
73LensFormatno0 = Unknown +
1 = APS-C +
2 = Full-frame
74LensMountno0 = Unknown +
1 = A-mount +
2 = E-mount
75LensType2no--> Sony LensType2 Values
77LensTypeno--> Sony LensType Values
79DistortionCorrParamsno 
112PictureProfileno +
0 = Gamma Still - Standard/Neutral (PP2) +
1 = Gamma Still - Portrait +
3 = Gamma Still - Night View/Portrait +
4 = Gamma Still - B&W/Sepia +
5 = Gamma Still - Clear +
6 = Gamma Still - Deep +
7 = Gamma Still - Light +
8 = Gamma Still - Vivid +
9 = Gamma Still - Real +
10 = Gamma Movie (PP1) +
22 = Gamma ITU709 (PP3 or PP4) +
24 = Gamma Cine1 (PP5) +
25 = Gamma Cine2 (PP6) +
26 = Gamma Cine3 +
27 = Gamma Cine4 +
28 = Gamma S-Log2 (PP7) +
29 = Gamma ITU709 (800%) +
31 = Gamma S-Log3 (PP8 or PP9) +
33 = Gamma HLG2 (PP10) +
34 = Gamma HLG3 +
37 = FL +
38 = VV2 +
39 = IN +
40 = SH
+
113FocalLengthno 
115MinFocalLengthno 
117MaxFocalLengthno 
2191VignettingCorrParamsno 
2193VignettingCorrParamsno 
2324ChromaticAberrationCorrParamsno 
2326ChromaticAberrationCorrParamsno 
+ +

Sony PIC Tags

+

The TextInfo data is extracted as a block to preserve the formatting, and +some of the more interesting information is extracted as separate tags.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'BC:'Barcodeno 
'BarCode:'Barcodeno 
'Capt:'SensorTemperatureno 
'FWVer:'FirmwareVersionno 
'IFD'PIC_IFD---> Sony Tags
'Temp:'CameraTemperatureno 
'Temp:Clbt:'BoardTemperatureno 
'TextInfo1'TextInfo1no 
'TextInfo2'TextInfo2no 
'VR Enable C:'VibrationReductionno0 = Off +
1 = On
'barcode:'Barcodeno 
+ +

Sony Ericsson Tags

+

Maker notes found in images from some Sony Ericsson phones.

+
+
+ + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0201PreviewImageStartint32u*(a small 320x200 preview image)
0x0202PreviewImageLengthint32u* 
0x2000MakerNoteVersionundef[4] 
+ +

Sony SRF Tags

+

The maker notes in SRF (Sony Raw Format) images contain 7 IFD's with family +1 group names SRF0 through SRF6. SRF0 and SRF1 use the tags in this table, +while SRF2 through SRF5 use the tags in the next table, and SRF6 uses +standard EXIF tags. All information other than SRF0 is encrypted, but +thanks to Dave Coffin the decryption algorithm is known. SRF images are +written by the Sony DSC-F828 and DSC-V3.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000SRF2Keyno(key to decrypt maker notes from the start of SRF2)
0x0001DataKeyno(key to decrypt the rest of the file from the end of the maker notes)
+ +

Sony SRF2 Tags

+

These tags are found in the SRF2 through SRF5 IFD's.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0002SRF6Offsetno 
0x0003SRFDataOffset?no 
0x0004RawDataOffsetno 
0x0005RawDataLengthno 
0x0043MaxApertureAtMaxFocalno 
0x0044MaxApertureAtMinFocalno 
0x0045MinFocalLengthno 
0x0046MaxFocalLengthno 
0x00c0WBRedDaylightno 
0x00c1WBGreenDaylightno 
0x00c2WBBlueDaylightno 
0x00c3WBRedCloudyno 
0x00c4WBGreenCloudyno 
0x00c5WBBlueCloudyno 
0x00c6WBRedFluorescentno 
0x00c7WBGreenFluorescentno 
0x00c8WBBlueFluorescentno 
0x00c9WBRedTungstenno 
0x00caWBGreenTungstenno 
0x00cbWBBlueTungstenno 
0x00ccWBRedFlashno 
0x00cdWBGreenFlashno 
0x00ceWBBlueFlashno 
0x00d0WBRedAsShotno 
0x00d1WBGreenAsShotno 
0x00d2WBBlueAsShotno 
+ +

Sony SR2Private Tags

+

The SR2 format uses the DNGPrivateData tag to reference a private IFD +containing these tags. SR2 images are written by the Sony DSC-R1, but +this information is also written to ARW images by other models.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x7200SR2SubIFDOffsetno 
0x7201SR2SubIFDLengthno 
0x7221SR2SubIFDKeyno(key to decrypt SR2SubIFD)
0x7240IDC_IFD---> SonyIDC Tags
0x7241IDC2_IFD---> SonyIDC Tags
0x7250MRWInfo---> MinoltaRaw Tags
+ +

Sony SR2SubIFD Tags

+

Tags in the encrypted SR2SubIFD

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x7300BlackLevelint16u[4]! 
0x7302WB_GRBGLevelsAutoint16s[4]! 
0x7303WB_GRBGLevelsint16s[4]! 
0x7310BlackLevelint16u[4]! 
0x7312WB_RGGBLevelsAutoint16s[4]! 
0x7313WB_RGGBLevelsint16s[4]! 
0x7480WB_RGBLevelsDaylightint16s[4]! 
0x7481WB_RGBLevelsCloudyint16s[4]! 
0x7482WB_RGBLevelsTungstenint16s[4]! 
0x7483WB_RGBLevelsFlashint16s[4]! 
0x7484WB_RGBLevels4500Kint16s[4]! 
0x7486WB_RGBLevelsFluorescentint16s[4]! 
0x74a0MaxApertureAtMaxFocalno 
0x74a1MaxApertureAtMinFocalno 
0x74a2MaxFocalLengthno 
0x74a3MinFocalLengthno 
0x74c0SR2DataIFD---> Sony SR2DataIFD Tags
0x7800ColorMatrixno 
0x7820WB_RGBLevelsDaylightint16s[3]! 
0x7821WB_RGBLevelsCloudyint16s[3]! 
0x7822WB_RGBLevelsTungstenint16s[3]! 
0x7823WB_RGBLevelsFlashint16s[3]! 
0x7824WB_RGBLevels4500Kint16s[3]! 
0x7825WB_RGBLevelsShadeint16s[3]! 
0x7826WB_RGBLevelsFluorescentint16s[3]! 
0x7827WB_RGBLevelsFluorescentP1int16s[3]! 
0x7828WB_RGBLevelsFluorescentP2int16s[3]! 
0x7829WB_RGBLevelsFluorescentM1int16s[3]! 
0x782aWB_RGBLevels8500Kint16s[3]! 
0x782bWB_RGBLevels6000Kint16s[3]! 
0x782cWB_RGBLevels3200Kint16s[3]! 
0x782dWB_RGBLevels2500Kint16s[3]! 
0x787fWhiteLevelint16u[3]! 
0x797dVignettingCorrParamsno 
0x7980ChromaticAberrationCorrParamsno 
0x7982DistortionCorrParamsno 
+ +

Sony SR2DataIFD Tags

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x7770ColorModeno 
+ +

Sony PMP Tags

+

These tags are written in the proprietary-format header of PMP images from +the DSC-F1.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
8JpgFromRawStartno(OK, not really a RAW file, but this mechanism is used to allow extraction of +the JPEG image from a PMP file)
12JpgFromRawLengthno 
22SonyImageWidthno 
24SonyImageHeightno 
27Orientationno0 = Horizontal (normal) +
1 = Rotate 270 CW +
2 = Rotate 180 +
3 = Rotate 90 CW
29ImageQualityno8 = Snap Shot +
23 = Standard +
51 = Fine
52Commentno 
76DateTimeOriginalno 
84ModifyDateno 
102ExposureTimeno 
106FNumberno 
108ExposureCompensationno 
112FocalLengthno 
118Flashno0 = No Flash +
1 = Fired
+ +

Sony rtmd Tags

+

These tags are extracted from the 'rtmd' timed metadata of MP4 videos from +some models when the ExtractEmbedded option is used.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x8000FNumberno 
0x8109ExposureTimeno 
0x810aMasterGainAdjustmentno 
0x810bISOno 
0x810cElectricalExtenderMagnificationno 
0x8500GPSVersionIDno 
0x8501GPSLatitudeRefno'N' = North +
'S' = South
0x8502GPSLatitudeno 
0x8503GPSLongitudeRefno'E' = East +
'W' = West
0x8504GPSLongitudeno 
0x8507GPSTimeStampno 
0x8509GPSStatusno'A' = Measurement Active +
'V' = Measurement Void
0x850aGPSMeasureModeno2 = 2-Dimensional Measurement +
3 = 3-Dimensional Measurement
0x8512GPSMapDatumno 
0x851dGPSDateStampno 
0xe303WhiteBalanceno + +
1 = Incandescent +
2 = Fluorescent +
4 = Daylight
  5 = Cloudy +
6 = Custom +
255 = Preset
+
0xe304DateTimeno 
0xe43bPitchRollYawno 
0xe44bAccelerometerno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 21, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/SonyIDC.html b/html/TagNames/SonyIDC.html new file mode 100644 index 0000000..c277dc7 --- /dev/null +++ b/html/TagNames/SonyIDC.html @@ -0,0 +1,339 @@ + + + + +SonyIDC Tags + + + +

SonyIDC Tags

+

Tags written by the Sony Image Data Converter utility in ARW images.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0201IDCPreviewStartint32u* 
0x0202IDCPreviewLengthint32u* 
0x8000IDCCreativeStyleint32u + +
1 = Camera Setting +
2 = Standard +
3 = Real +
4 = Vivid +
5 = Adobe RGB +
6 = A100 Standard +
7 = Neutral +
8 = Portrait +
9 = Landscape
  10 = Clear +
11 = Deep +
12 = Light +
13 = Sunset +
14 = Night View +
15 = Autumn Leaves +
16 = B&W +
17 = Sepia
+
0x8001CreativeStyleWasChangedint32u(set if the creative style was ever changed) +
0 = No +
1 = Yes
0x8002PresetWhiteBalanceint32u +
1 = Camera Setting +
2 = Color Temperature +
3 = Specify Gray Point +
4 = Daylight +
5 = Cloudy +
6 = Shade +
7 = Cool White Fluorescent +
8 = Day Light Fluorescent +
9 = Day White Fluorescent +
10 = Warm White Fluorescent +
11 = Tungsten +
12 = Flash +
13 = Auto
+
0x8013ColorTemperatureAdjint16u 
0x8014PresetWhiteBalanceAdjint32s 
0x8015ColorCorrectionint32s 
0x8016SaturationAdjint32s 
0x8017ContrastAdjint32s 
0x8018BrightnessAdjint32s 
0x8019HueAdjint32s 
0x801aSharpnessAdjint32s 
0x801bSharpnessOvershootint32s 
0x801cSharpnessUndershootint32s 
0x801dSharpnessThresholdint32s 
0x801eNoiseReductionModeint16u0 = Off +
1 = On
0x8021GrayPointint16u[4] 
0x8022D-RangeOptimizerModeint16u0 = Off +
1 = Auto +
2 = Manual
0x8023D-RangeOptimizerValueint32s 
0x8024D-RangeOptimizerHighlightint32s 
0x8026HighlightColorDistortReductint16u0 = Standard +
1 = Advanced
0x8027NoiseReductionValueint32s 
0x8028EdgeNoiseReductionint32s 
0x8029ColorNoiseReductionint32s 
0x802dD-RangeOptimizerShadowint32s 
0x8030PeripheralIllumCentralRadiusint32s 
0x8031PeripheralIllumCentralValueint32s 
0x8032PeripheralIllumPeriphValueint32s 
0x8040DistortionCompensationint32s-1 = n/a +
1 = On +
2 = Off
0x9000ToneCurveBrightnessXint16u[n] 
0x9001ToneCurveRedXint16u[n] 
0x9002ToneCurveGreenXint16u[n] 
0x9003ToneCurveBlueXint16u[n] 
0x9004ToneCurveBrightnessYint16u[n] 
0x9005ToneCurveRedYint16u[n] 
0x9006ToneCurveGreenYint16u[n] 
0x9007ToneCurveBlueYint16u[n] 
0x900dChromaticAberrationCorrectionint32s1 = On +
2 = Off
0x900eInclinationCorrectionint32u0 = Off +
1 = On
0x900fInclinationAngleint32s 
0x9010Croppingint32u0 = Off +
1 = On
0x9011CropAreaint32u[4] 
0x9012PreviewImageSizeint32u[2] 
0x9013PxShiftPeriphEdgeNRint32s0 = Off +
1 = On
0x9014PxShiftPeriphEdgeNRValueint32s 
0x9017WhitesAdjint32s 
0x9018BlacksAdjint32s 
0x9019HighlightsAdjint32s 
0x901aShadowsAdjint32s 
0xd000CurrentVersionint32u 
0xd001VersionIFD---> SonyIDC Tags +
(there is one VersionIFD for each entry in the "Version Stack")
0xd100VersionCreateDatestring(date/time when this entry was created in the "Version Stack")
0xd101VersionModifyDatestring 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Aug 21, 2018 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Stim.html b/html/TagNames/Stim.html new file mode 100644 index 0000000..480504d --- /dev/null +++ b/html/TagNames/Stim.html @@ -0,0 +1,201 @@ + + + + +Stim Tags + + + +

Stim Tags

+

These tags are part of the CIPA Stereo Still Image specification, and are +found in the APP3 "Stim" segment of JPEG images. See +https://web.archive.org/web/20190718152459/http://www.cipa.jp/std/documents/e/DC-006_E.pdf +for the official specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0000StimVersionno 
0x0001ApplicationDatano 
0x0002ImageArrangementno0 = Parallel View Alignment +
1 = Cross View Alignment
0x0003ImageRotationno1 = None
0x0004ScalingFactorno 
0x0005CropXSizeno 
0x0006CropYSizeno 
0x0007CropX---> Stim CropX Tags
0x0008CropY---> Stim CropY Tags
0x0009ViewTypeno0 = No Pop-up Effect +
1 = Pop-up Effect
0x000aRepresentativeImageno0 = Left Viewpoint +
1 = Right Viewpoint
0x000bConvergenceBaseImageno0 = Left Viewpoint +
1 = Right Viewpoint +
255 = Equivalent for Both Viewpoints
0x000cAssumedDisplaySizeno 
0x000dAssumedDistanceViewno 
0x000eRepresentativeDisparityNearno 
0x000fRepresentativeDisparityFarno 
0x0010InitialDisplayEffectno0 = Off +
1 = On
0x0011ConvergenceDistanceno 
0x0012CameraArrangementIntervalno 
0x0013ShootingCountno 
+ +

Stim CropX Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0CropXCommonOffsetno0 = Common Offset Setting +
1 = Individual Offset Setting
2CropXViewpointNumberno 
3CropXOffsetno 
7CropXViewpointNumber2no 
8CropXOffset2no 
+ +

Stim CropY Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0CropYCommonOffsetno0 = Common Offset Setting +
1 = Individual Offset Setting
2CropYViewpointNumberno 
3CropYOffsetno 
7CropYViewpointNumber2no 
8CropYOffset2no 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Nov 27, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Text.html b/html/TagNames/Text.html new file mode 100644 index 0000000..f6c0b74 --- /dev/null +++ b/html/TagNames/Text.html @@ -0,0 +1,76 @@ + + + + +Text Tags + + + +

Text Tags

+

Although basic text files contain no metadata, the following tags are +determined from a simple analysis of the data in TXT and CSV files. +Statistics are generated only for 8-bit encodings, but the FastScan (-fast) +option may be used to limit processing to the first 64 kB in which case some +tags are not produced. To avoid long processing delays, ExifTool will issue +a minor warning and process only the first 64 kB of any file larger than 20 +MB unless the IgnoreMinorErrors (-m) +option is used.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
ByteOrderMarkno0 = No +
1 = Yes
ColumnCountno 
Delimiterno'' = (none) +
"\x09" = Tab +
',' = Comma +
';' = Semicolon
LineCountno 
MIMEEncodingno 
Newlinesno'' = (none) +
"\x0a" = Unix LF +
"\x0d" = Macintosh CR +
"\x0d\x0a" = Windows CRLF
Quotingno'' = (none) +
'"' = Double quotes +
''' = Single quotes
RowCountno 
WordCountno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Feb 14, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Theora.html b/html/TagNames/Theora.html new file mode 100644 index 0000000..7353c42 --- /dev/null +++ b/html/TagNames/Theora.html @@ -0,0 +1,103 @@ + + + + +Theora Tags + + + +

Theora Tags

+

Information extracted from Ogg Theora video files. See +http://www.theora.org/doc/Theora.pdf for the Theora specification.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0080Identification---> Theora Identification Tags
0x0081Comments---> Vorbis Comments Tags
+ +

Theora Identification Tags

+

Tags extracted from the Theora identification header.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0TheoraVersionno 
7ImageWidthno 
10ImageHeightno 
13XOffsetno 
14YOffsetno 
15FrameRateno 
23PixelAspectRationo 
29ColorSpaceno0 = Undefined +
1 = Rec. 470M +
2 = Rec. 470BG
30NominalVideoBitrateno0 = Unspecified
33Qualityno 
34PixelFormatno0 = 4:2:0 +
2 = 4:2:2 +
3 = 4:4:4
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 16, 2011 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Torrent.html b/html/TagNames/Torrent.html new file mode 100644 index 0000000..1209465 --- /dev/null +++ b/html/TagNames/Torrent.html @@ -0,0 +1,189 @@ + + + + +Torrent Tags + + + +

Torrent Tags

+

Below are tags commonly found in BitTorrent files. As well as these tags, +any other existing tags will be extracted. For convenience, list items are +expanded into individual tags with an index in the tag name, but only the +tags with index "1" are listed in the tables below. See +https://wiki.theory.org/BitTorrentSpecification for the BitTorrent +specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'announce'Announceno 
'announce-list'AnnounceList1no 
'comment'Commentno 
'created by'Creatorno 
'creation date'CreateDateno 
'encoding'Encodingno 
'info'Info---> Torrent Info Tags +
(extracted as a structure with the Struct option)
'url-list'URLList1no 
+ +

Torrent Info Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'file-duration'File1Durationno 
'file-media'File1Mediano 
'files'Files---> Torrent Files Tags
'length'Lengthno 
'md5sum'MD5Sumno 
'name'Nameno 
'name.utf-8'NameUTF-8no 
'piece length'PieceLengthno 
'pieces'Piecesno(concatenation of 20-byte SHA-1 digests for each piece)
'private'Privateno 
'profiles'Profiles---> Torrent Profiles Tags
+ +

Torrent Files Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'length'File1Lengthno 
'md5sum'File1MD5Sumno 
'path'File1Pathno 
'path.utf-8'File1PathUTF-8no 
+ +

Torrent Profiles Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'acodec'Profile1AudioCodecno 
'height'Profile1Heightno 
'vcodec'Profile1VideoCodecno 
'width'Profile1Widthno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 24, 2019 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Unknown.html b/html/TagNames/Unknown.html new file mode 100644 index 0000000..7edcad6 --- /dev/null +++ b/html/TagNames/Unknown.html @@ -0,0 +1,32 @@ + + + + +Unknown Tags + + + +

Unknown Tags

+

+The following tags are decoded in unsupported maker notes. Use the Unknown +(-u) option to display other unknown tags. +

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0e00PrintIM---> PrintIM Tags
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Apr 11, 2006 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/VCard.html b/html/TagNames/VCard.html new file mode 100644 index 0000000..e3faa3a --- /dev/null +++ b/html/TagNames/VCard.html @@ -0,0 +1,529 @@ + + + + +VCard Tags + + + +

VCard Tags

+

This table lists common vCard tags, but ExifTool will also extract any other +vCard tags found. Tag names may have "Pref" added to indicate the preferred +instance of a vCard property, and other "TYPE" parameters may also added to +the tag name. VCF files may contain multiple vCard entries which are +distinguished by the ExifTool family 3 group name (document number). See +http://tools.ietf.org/html/rfc6350 for the vCard 4.0 specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Adr'Addressno 
'Anniversary'Anniversaryno 
'Bday'Birthdayno 
'Email'Emailno 
'Fn'FormattedNameno 
'Gender'Genderno 
'Geo'Geolocationno 
'Impp'IMPPno 
'Lang'Languageno 
'Logo'Logono 
'N'Nameno 
'Nickname'Nicknameno 
'Note'Noteno 
'Org'Organizationno 
'Photo'Photono 
'Prodid'Softwareno 
'Rev'Revisionno 
'Sound'Soundno 
'Tel'Telephoneno 
'Title'JobTitleno 
'Tz'TimeZoneno 
'Uid'UIDno 
'Url'URLno 
'Version'VCardVersionno 
'X-abdate'ABDateno 
'X-ablabel'ABLabelno 
'X-abrelatednames'ABRelatedNamesno 
'X-abuid'AB_UIDno 
'X-aim'AIMno 
'X-icq'ICQno 
'X-socialprofile'SocialProfileno 
+ +

VCard VCalendar Tags

+

The VCard module is also used to process iCalendar ICS files since they use +a format similar to vCard. The following table lists standard iCalendar +tags, but any existing tags will be extracted. Top-level iCalendar +components (eg. Event, Todo, Timezone, etc.) are used for the family 1 group +names, and embedded components (eg. Alarm) are added as a prefix to the tag +name. See http://tools.ietf.org/html/rfc5545 for the official iCalendar +2.0 specification.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'Acknowledged'Acknowledgedno 
'Action'Actionno 
'Attach'Attachmentno 
'Attendee'Attendeeno 
'Calscale'CalendarScaleno 
'Categories'Categoriesno 
'Class'Classificationno 
'Comment'Commentno 
'Completed'DateTimeCompletedno 
'Contact'Contactno 
'Created'DateCreatedno 
'Description'Descriptionno 
'Dtend'DateTimeEndno 
'Dtstamp'DateTimeStampno 
'Dtstart'DateTimeStartno 
'Due'DateTimeDueno 
'Duration'Durationno 
'Exdate'ExceptionDateTimesno 
'Freebusy'FreeBusyTimeno 
'Geo'Geolocationno 
'Last-modified'ModifyDateno 
'Location'Locationno 
'Method'Methodno 
'Organizer'Organizerno 
'Percent-complete'PercentCompleteno 
'Priority'Priorityno 
'Prodid'Softwareno 
'Rdate'RecurrenceDateTimesno 
'Recurrence-id'RecurrenceIDno 
'Related-to'RelatedTono 
'Repeat'Repeatno 
'Request-status'RequestStatusno 
'Resources'Resourcesno 
'Rrule'RecurrenceRuleno 
'Sequence'SequenceNumberno 
'Status'Statusno 
'Summary'Summaryno 
'Transp'TimeTransparencyno 
'Trigger'Triggerno 
'Tzid'TimezoneIDno 
'Tzname'TimezoneNameno 
'Tzoffsetfrom'TimezoneOffsetFromno 
'Tzoffsetto'TimezoneOffsetTono 
'Tzurl'TimeZoneURLno 
'Uid'UIDno 
'Url'URLno 
'Version'VCalendarVersionno 
'X-apple-calendar-color'CalendarColorno 
'X-apple-default-alarm'DefaultAlarmno 
'X-apple-local-default-alarm'LocalDefaultAlarmno 
'X-microsoft-cdo-alldayevent'AllDayEventno 
'X-microsoft-cdo-appt-sequence'AppointmentSequenceno 
'X-microsoft-cdo-busystatus'BusyStatusno 
'X-microsoft-cdo-importance'Importanceno0 = Low +
1 = Normal +
2 = High
'X-microsoft-cdo-insttype'InstanceTypeno0 = Non-recurring Appointment +
1 = Recurring Appointment +
2 = Single Instance of Recurring Appointment +
3 = Exception to Recurring Appointment
'X-microsoft-cdo-intendedstatus'IntendedBusyStatusno 
'X-microsoft-cdo-ownerapptid'OwnerAppointmentIDno 
'X-microsoft-disallow-counter'DisallowCounterProposalno 
'X-microsoft-donotforwardmeeting'DoNotForwardMeetingno 
'X-microsoft-locations'MeetingLocationsno 
'X-wr-alarmuid'AlarmUIDno 
'X-wr-caldesc'CalendarDescriptionno 
'X-wr-calname'CalendarNameno 
'X-wr-relcalid'CalendarIDno 
'X-wr-timezone'TimeZone2no 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Oct 22, 2018 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/Vorbis.html b/html/TagNames/Vorbis.html new file mode 100644 index 0000000..2b7ff8b --- /dev/null +++ b/html/TagNames/Vorbis.html @@ -0,0 +1,244 @@ + + + + +Vorbis Tags + + + +

Vorbis Tags

+

Information extracted from Ogg Vorbis files. See +http://www.xiph.org/vorbis/doc/ for the Vorbis specification.

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
0x0001Identification---> Vorbis Identification Tags
0x0003Comments---> Vorbis Comments Tags
+ +

Vorbis Comments Tags

+

The tags below are only some common tags found in the Vorbis comments of Ogg +Vorbis and Ogg FLAC audio files, however ExifTool will extract values from +any tag found, even if not listed here.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'ACTOR'Actorno 
'ALBUM'Albumno 
'ARTIST'Artistno+ 
'COMMENT'Commentno 
'COMPOSER'Composerno 
'CONTACT'Contactno+ 
'COPYRIGHT'Copyrightno 
'COVERART'CoverArtno(base64-encoded image)
'COVERARTMIME'CoverArtMIMETypeno 
'DATE'Dateno 
'DESCRIPTION'Descriptionno 
'DIRECTOR'Directorno 
'ENCODED_BY'EncodedByno 
'ENCODED_USING'EncodedUsingno 
'ENCODER'Encoderno 
'ENCODER_OPTIONS'EncoderOptionsno 
'GENRE'Genreno 
'ISRC'ISRCNumberno 
'LICENSE'Licenseno 
'LOCATION'Locationno 
'METADATA_BLOCK_PICTURE'Picture---> FLAC Picture Tags
'ORGANIZATION'Organizationno 
'PERFORMER'Performerno+ 
'PRODUCER'Producerno 
'REPLAYGAIN_ALBUM_GAIN'ReplayGainAlbumGainno 
'REPLAYGAIN_ALBUM_PEAK'ReplayGainAlbumPeakno 
'REPLAYGAIN_TRACK_GAIN'ReplayGainTrackGainno 
'REPLAYGAIN_TRACK_PEAK'ReplayGainTrackPeakno 
'TITLE'Titleno 
'TRACKNUMBER'TrackNumberno 
'VERSION'Versionno 
'vendor'Vendorno(from comment header)
+ +

Vorbis Identification Tags

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0VorbisVersionno 
4AudioChannelsno 
5SampleRateno 
9MaximumBitrateno 
13NominalBitrateno 
17MinimumBitrateno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jul 14, 2016 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/WTV.html b/html/TagNames/WTV.html new file mode 100644 index 0000000..fb260f1 --- /dev/null +++ b/html/TagNames/WTV.html @@ -0,0 +1,381 @@ + + + + +WTV Tags + + + +

WTV Tags

+

Tags found in Windows recorded TV (WTV) videos.

+
+
+ + + + + + + + +
Tag IDTag NameWritableValues / Notes
'table.0.entries.legacy_attrib'Metdata---> WTV Metadata Tags
+ +

WTV Metadata Tags

+

ExifTool will extract any tag found, even if not in this table.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
ATSCContentno + +
0 = No  1 = Yes
+
ActualSoftPostPaddingno 
ActualSoftPrePaddingno 
Bitrate?no(unknown units)
BrandingImageIDno 
BrandingNameno 
ContentProtectedno + +
0 = No  1 = Yes
+
ContentProtectedPercentno 
DTVContentno + +
0 = No  1 = Yes
+
Durationno 
EncodeTimeno 
EndTimeno 
ExpirationDate?no 
ExpirationSpan?no(unknown units)
Genreno 
HDContentno + +
0 = No  1 = Yes
+
HardPostPaddingno 
HardPrePaddingno 
InBandRatingAttributesno 
InBandRatingLevelno 
InBandRatingSystemno 
KeepUntilno 
Languageno 
MediaClassPrimaryIDno 
MediaClassSecondaryIDno 
MediaCreditsno 
MediaIsDelayno + +
0 = No  1 = Yes
+
MediaIsFinaleno + +
0 = No  1 = Yes
+
MediaIsLiveno + +
0 = No  1 = Yes
+
MediaIsMovieno + +
0 = No  1 = Yes
+
MediaIsPremiereno + +
0 = No  1 = Yes
+
MediaIsRepeatno + +
0 = No  1 = Yes
+
MediaIsSAPno + +
0 = No  1 = Yes
+
MediaIsSportno + +
0 = No  1 = Yes
+
MediaIsStereono + +
0 = No  1 = Yes
+
MediaIsSubtitledno + +
0 = No  1 = Yes
+
MediaIsTapeno + +
0 = No  1 = Yes
+
MediaNetworkAffiliationno 
MediaOriginalBroadcastDateTimeno 
MediaOriginalChannelno 
MediaOriginalChannelSubNumberno 
MediaOriginalRunTimeno 
MediaStationCallSignno 
MediaStationNameno 
MediaThumbAspectRatioXno 
MediaThumbAspectRatioYno 
MediaThumbHeightno 
MediaThumbRatingAttributesno 
MediaThumbRatingLevelno 
MediaThumbRatingSystemno 
MediaThumbRetno 
MediaThumbStrideno 
MediaThumbTimeStamp?no(unknown units)
MediaThumbWidthno 
OriginalReleaseTimeno 
OriginalSoftPostPaddingno 
OriginalSoftPrePaddingno 
ParentalRatingno 
ParentalRatingReasonno 
ProgramIDno 
Providerno 
ProviderCopyrightno 
ProviderRatingno 
Qualityno 
RequestIDno 
ScheduleItemIDno 
SeriesUIDno 
ServiceIDno 
Subtitleno 
SubtitleDescriptionno 
Titleno 
VideoClosedCaptioningno + +
0 = No  1 = Yes
+
Watchedno + +
0 = No  1 = Yes
+
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jun 5, 2018 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/XMP.html b/html/TagNames/XMP.html new file mode 100644 index 0000000..161dc84 --- /dev/null +++ b/html/TagNames/XMP.html @@ -0,0 +1,19437 @@ + + + + +XMP Tags + + + +

XMP Tags

+

+XMP stands for "Extensible Metadata Platform", an XML/RDF-based metadata +format which is being pushed by Adobe. Information in this format can be +embedded in many different image file types including JPG, JP2, TIFF, GIF, +EPS, PDF, PSD, IND, INX, PNG, DJVU, SVG, PGF, MIFF, XCF, CRW, DNG and a +variety of proprietary TIFF-based RAW images, as well as MOV, AVI, ASF, WMV, +FLV, SWF and MP4 videos, and WMA and audio formats supporting ID3v2 +information.

+ +

The XMP Tag ID's aren't listed because in most cases they are identical +to the Tag Name (aside from differences in case). Tags with different +ID's are mentioned in the Notes column of the HTML version of this +document.

+ +

All XMP information is stored as character strings. The Writable column +specifies the information format: string is an unformatted string, +integer is a string of digits (possibly beginning with a '+' or '-'), +real is a floating point number, rational is entered as a floating +point number but stored as two integer strings separated by a '/' +character, date is a date/time string entered in the format "YYYY:mm:dd +HH:MM:SS[.ss][+/-HH:MM]", boolean is either "True" or "False" (but "true" +and "false" may be written as a ValueConv value for compatibility with +non-conforming applications), struct indicates a structured tag, and +lang-alt is a tag that supports alternate languages.

+ +

When reading, struct tags are extracted only if the Struct (-struct) +option is used. Otherwise the corresponding Flattened tags, indicated by +an underline (_) after the Writable type, are extracted. When +copying, by default both structured and flattened tags are available, but +the flattened tags are considered "unsafe" so they aren't copied unless +specified explicitly. The Struct option may be disabled by setting Struct +to 0 via the API or with --struct on the command line to copy only flattened +tags, or enabled by setting Struct to 1 via the API or with -struct on the +command line to copy only as structures. When writing, the Struct option +has no effect, and both structured and flattened tags may be written. See +struct.html for more details.

+ +

Individual languages for lang-alt tags are accessed by suffixing the tag +name with a '-', followed by an RFC 3066 language code (eg. "XMP:Title-fr", +or "Rights-en-US"). (See http://www.ietf.org/rfc/rfc3066.txt for the RFC +3066 specification.) A lang-alt tag with no language code accesses the +"x-default" language, but causes other languages for this tag to be deleted +when writing. The "x-default" language code may be specified when writing +to preserve other existing languages (eg. "XMP-dc:Description-x-default"). +When reading, "x-default" is not specified.

+ +

The XMP tags are organized according to schema Namespace in the following +tables. The ExifTool family 1 group names are derived from the namespace +prefixes by adding a leading "XMP-" (eg. "XMP-dc"). A few of the longer +prefixes have been shortened (as mentioned in the documentation below) to +avoid excessively long ExifTool group names. The tags of any namespace may +be deleted as a group by specifying the family 1 group name (eg. +"-XMP-dc:all=" on the command line). This includes namespaces which are not +pre-defined by ExifTool.

+ +

In cases where a tag name exists in more than one namespace, less common +namespaces are avoided when writing. However, a specific namespace may be +written by providing a family 1 group name for the tag (eg. XMP-crs:Contrast +or XMP-exif:Contrast). When deciding on which tags to add to an image, +using standard schemas such as dc, xmp, +iptcCore and iptcExt is +recommended if possible.

+ +

For structures, the heading of the first column is Field Name. Field +names are very similar to tag names, except they are used to identify fields +inside structures instead of stand-alone tags. See +the Field Name section of the Structured Information documentation for more +details.

+ +

ExifTool will extract XMP information even if it is not listed in these +tables, but other tags are not writable unless added as user-defined tags in +the ExifTool config file. For example, the pdfx namespace doesn't have a +predefined set of tag names because it is used to store application-defined +PDF information, so although this information will be extracted, it is only +writable if the corresponding user-defined tags have been created.

+ +

The tables below list tags from the official XMP specification (with an +underlined Namespace in the HTML version of this documentation), as well +as extensions from various other sources. See +http://www.adobe.com/devnet/xmp/ for the official XMP specification. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamespaceWritableValues / Notes
aas---> XMP aas Tags
acdsee---> XMP acdsee Tags
album---> XMP Album Tags
apple-fi---> XMP apple_fi Tags
ast---> Nikon ast Tags
aux---> XMP aux Tags
cc---> XMP cc Tags
cell---> XMP cell Tags
crd---> XMP crd Tags
creatorAtom---> XMP creatorAtom Tags
crs---> XMP crs Tags
dc---> XMP dc Tags
Device---> XMP Device Tags
dex---> XMP dex Tags
DICOM---> XMP DICOM Tags
digiKam---> XMP digiKam Tags
drone-dji---> DJI XMP Tags
dwc---> DarwinCore Tags
exif---> XMP exif Tags
exifEX---> XMP exifEX Tags
expressionmedia---> XMP ExpressionMedia Tags
extensis---> XMP extensis Tags
fpv---> XMP fpv Tags
GAudio---> XMP GAudio Tags
GCamera---> XMP GCamera Tags
GCreations---> XMP GCreations Tags
GDepth---> XMP GDepth Tags
getty---> XMP GettyImages Tags
GFocus---> XMP GFocus Tags
GImage---> XMP GImage Tags
GPano---> XMP GPano Tags
GSpherical---> XMP GSpherical Tags
ics---> XMP ics Tags
iptcCore---> XMP iptcCore Tags
iptcExt---> XMP iptcExt Tags
LImage---> XMP LImage Tags
lr---> XMP Lightroom Tags
mediapro---> XMP MediaPro Tags
microsoft---> Microsoft XMP Tags
MP---> Microsoft MP Tags
MP1---> Microsoft MP1 Tags
mwg-coll---> MWG Collections Tags
mwg-kw---> MWG Keywords Tags
mwg-rs---> MWG Regions Tags
nine---> Nikon nine Tags
pdf---> XMP pdf Tags
pdfx---> XMP pdfx Tags
photomech---> PhotoMechanic XMP Tags
photoshop---> XMP photoshop Tags
PixelLive---> XMP PixelLive Tags
plus---> PLUS XMP Tags
pmi---> XMP pmi Tags
prism---> XMP prism Tags
prl---> XMP prl Tags
prm---> XMP prm Tags
pur---> XMP pur Tags
rdf---> XMP rdf Tags
sdc---> Nikon sdc Tags
swf---> XMP swf Tags
tiff---> XMP tiff Tags
x---> XMP x Tags
xmp---> XMP xmp Tags
xmpBJ---> XMP xmpBJ Tags
xmpDM---> XMP xmpDM Tags
xmpMM---> XMP xmpMM Tags
xmpNote---> XMP xmpNote Tags
xmpPLUS---> XMP xmpPLUS Tags
xmpRights---> XMP xmpRights Tags
xmpTPg---> XMP xmpTPg Tags
+ +

XMP aas Tags

+

Apple Adjustment Settings used by iPhone/iPad.

+ +

These tags belong to the ExifTool XMP-aas family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AffineAreal 
AffineBreal 
AffineCreal 
AffineDreal 
AffineXreal 
AffineYreal 
CropHinteger/ 
CropWinteger/ 
CropXinteger/ 
CropYinteger/ 
Curve0xreal 
Curve0yreal 
Curve1xreal 
Curve1yreal 
Curve2xreal 
Curve2yreal 
Curve3xreal 
Curve3yreal 
Curve4xreal 
Curve4yreal 
FaceBalanceOrigIreal 
FaceBalanceOrigQreal 
FaceBalanceStrengthreal 
FaceBalanceWarmthreal 
Highlightsreal/ 
Shadowsreal/ 
Vibrancereal/ 
+ +

XMP acdsee Tags

+

ACD Systems ACDSee namespace tags.

+ +

(A note to software developers: Re-inventing your own private tags instead +of using the equivalent tags in standard XMP namespaces defeats one of the +most valuable features of metadata: interoperability. Your applications +mumble to themselves instead of speaking out for the rest of the world to +hear.)

+ +

These tags belong to the ExifTool XMP-acdsee family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Authorstring/ 
Captionstring/ 
Categoriesstring/ 
Collectionsstring/ 
DateTimedate/ 
DPPlang-alt/(newer version of XML raw processing settings)
EditStatusstring/ 
FixtureIdentifierstring/ 
Keywordsstring/+ 
Notesstring/ 
ObjectCyclestring/ 
OriginatingProgramstring/ 
Ratingreal/ 
Rawrppusedboolean/ 
ReleaseDatestring/ 
ReleaseTimestring/ 
RPPlang-alt/(raw processing settings in XML format)
Snapshotsstring/+ 
Taggedboolean/ 
+ +

XMP Album Tags

+

Adobe Album namespace tags.

+ +

These tags belong to the ExifTool XMP-album family 1 group.

+
+
+ + + + + + + +
Tag NameWritableValues / Notes
Notesstring 
+ +

XMP apple_fi Tags

+

Face information tags written by the Apple iPhone 5 inside the mwg-rs +RegionExtensions.

+ +

These tags belong to the ExifTool XMP-apple-fi family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AngleInfoRollinteger 
AngleInfoYawinteger 
ConfidenceLevelinteger 
FaceIDinteger 
TimeStampinteger 
+ +

XMP aux Tags

+

Adobe-defined auxiliary EXIF tags. This namespace existed in the XMP +specification until it was dropped in 2012, presumably due to the +introduction of the EXIF 2.3 for XMP specification and the exifEX namespace +at this time. For this reason, tags below with equivalents in the +exifEX namespace are avoided when writing.

+ +

These tags belong to the ExifTool XMP-aux family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
ApproximateFocusDistancerational 
DistortionCorrectionAlreadyAppliedboolean 
Firmwarestring 
FlashCompensationrational 
ImageNumberstring 
IsMergedHDRboolean 
IsMergedPanoramaboolean 
LateralChromaticAberrationCorrectionAlreadyAppliedboolean 
Lensstring 
LensDistortInfostring 
LensIDstring 
LensInfostring/(4 rational values giving focal and aperture ranges)
LensSerialNumberstring/ 
NeutralDensityFactorstring 
OwnerNamestring/ 
SerialNumberstring/ 
VignetteCorrectionAlreadyAppliedboolean 
+ +

XMP cc Tags

+

Creative Commons namespace tags. Note that the CC specification for XMP is +non-existent, so ExifTool must make some assumptions about the format of the +specific properties in XMP (see http://creativecommons.org/ns).

+ +

These tags belong to the ExifTool XMP-cc family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AttributionNamestring 
AttributionURLstring 
DeprecatedOndate 
Jurisdictionstring 
LegalCodestring 
Licensestring 
MorePermissionsstring 
Permitsstring+'cc:DerivativeWorks' = Derivative Works +
'cc:Distribution' = Distribution +
'cc:Reproduction' = Reproduction +
'cc:Sharing' = Sharing
Prohibitsstring+'cc:CommercialUse' = Commercial Use +
'cc:HighIncomeNationUse' = High Income Nation Use
Requiresstring+ +
'cc:Attribution' = Attribution +
'cc:Copyleft' = Copyleft +
'cc:LesserCopyleft' = Lesser Copyleft +
'cc:Notice' = Notice +
'cc:ShareAlike' = Share Alike +
'cc:SourceCode' = Source Code
+
UseGuidelinesstring 
+ +

XMP cell Tags

+

Location tags written by some Sony Ericsson phones.

+ +

These tags belong to the ExifTool XMP-cell family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
CellTowerIDstring(called cellid by the spec)
CellGlobalIDstring(called cgi by the spec)
LocationAreaCodestring(called lac by the spec)
MobileCountryCodestring(called mcc by the spec)
MobileNetworkCodestring(called mnc by the spec)
CellRstring(called r by the spec)
+ +

XMP crd Tags

+

Adobe Camera Raw Defaults tags.

+ +

These tags belong to the ExifTool XMP-crd family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AlreadyAppliedboolean/ 
AutoBrightnessboolean/ 
AutoContrastboolean/ 
AutoExposureboolean/ 
AutoLateralCAinteger/ 
AutoShadowsboolean/ 
AutoToneboolean/ 
AutoToneDigeststring/ 
AutoToneDigestNoSatstring/ 
AutoWhiteVersioninteger/ 
Blacks2012integer/ 
BlueHueinteger/ 
BlueSaturationinteger/ 
Brightnessinteger/ 
CameraModelRestrictionstring/ 
CameraProfilestring/ 
CameraProfileDigeststring/ 
ChromaticAberrationBinteger/ 
ChromaticAberrationRinteger/ 
CircularGradientBasedCorrectionsstruct+--> Correction Struct
CircGradBasedCorrActiveboolean/_(CircularGradientBasedCorrectionsCorrectionActive)
CircGradBasedCorrAmountreal/_(CircularGradientBasedCorrectionsCorrectionAmount)
CircGradBasedCorrMasksstruct_+--> CorrectionMask Struct +
(CircularGradientBasedCorrectionsCorrectionMasks)
CircGradBasedCorrMaskAlphareal/_(CircularGradientBasedCorrectionsCorrectionMasksAlpha)
CircGradBasedCorrMaskAnglereal/_(CircularGradientBasedCorrectionsCorrectionMasksAngle)
CircGradBasedCorrMaskBottomreal/_(CircularGradientBasedCorrectionsCorrectionMasksBottom)
CircGradBasedCorrMaskCenterValuereal/_(CircularGradientBasedCorrectionsCorrectionMasksCenterValue)
CircGradBasedCorrMaskCenterWeightreal/_(CircularGradientBasedCorrectionsCorrectionMasksCenterWeight)
CircGradBasedCorrMaskRangestruct_+--> CorrRangeMask Struct +
(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMask; called CorrectionRangeMask by the spec)
CircGradBasedCorrMaskRangeAreaModelsstruct_+--> AreaModels Struct +
(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels)
CircGradBasedCorrMaskRangeAreaModelsComponentsstring/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents)
CircGradBasedCorrMaskRangeAreaModelsColorSampleInfostring/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
CircGradBasedCorrMaskRangeColorAmountreal/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount)
CircGradBasedCorrMaskRangeDepthFeatherreal/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather)
CircGradBasedCorrMaskRangeDepthMaxreal/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax)
CircGradBasedCorrMaskRangeDepthMinreal/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin)
CircGradBasedCorrMaskRangeInvertboolean/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert)
CircGradBasedCorrMaskRangeLumFeatherreal/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather)
CircGradBasedCorrMaskRangeLuminanceDepthSampleInfostring/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo)
CircGradBasedCorrMaskRangeLumMaxreal/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax)
CircGradBasedCorrMaskRangeLumMinreal/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin)
CircGradBasedCorrMaskRangeLumRangestring/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange)
CircGradBasedCorrMaskRangeSampleTypeinteger/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType)
CircGradBasedCorrMaskRangeTypestring/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskType)
CircGradBasedCorrMaskRangeVersionstring/_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion)
CircGradBasedCorrMaskDabsstring/_(CircularGradientBasedCorrectionsCorrectionMasksDabs)
CircGradBasedCorrMaskFeatherreal/_(CircularGradientBasedCorrectionsCorrectionMasksFeather)
CircGradBasedCorrMaskFlippedboolean/_(CircularGradientBasedCorrectionsCorrectionMasksFlipped)
CircGradBasedCorrMaskFlowreal/_(CircularGradientBasedCorrectionsCorrectionMasksFlow)
CircGradBasedCorrMaskFullXreal/_(CircularGradientBasedCorrectionsCorrectionMasksFullX)
CircGradBasedCorrMaskFullYreal/_(CircularGradientBasedCorrectionsCorrectionMasksFullY)
CircGradBasedCorrMaskInputDigeststring/_(CircularGradientBasedCorrectionsCorrectionMasksInputDigest)
CircGradBasedCorrMaskLeftreal/_(CircularGradientBasedCorrectionsCorrectionMasksLeft)
CircGradBasedCorrMaskMaskActiveboolean/_(CircularGradientBasedCorrectionsCorrectionMasksMaskActive)
CircGradBasedCorrMaskMaskBlendModeinteger/_(CircularGradientBasedCorrectionsCorrectionMasksMaskBlendMode)
CircGradBasedCorrMaskMaskDigeststring/_(CircularGradientBasedCorrectionsCorrectionMasksMaskDigest)
CircGradBasedCorrMaskMaskInvertedboolean/_(CircularGradientBasedCorrectionsCorrectionMasksMaskInverted)
CircGradBasedCorrMaskMaskNamestring/_(CircularGradientBasedCorrectionsCorrectionMasksMaskName)
CircGradBasedCorrMaskMasksstruct_+--> CorrectionMask Struct +
(CircularGradientBasedCorrectionsCorrectionMasksMasks)
CircGradBasedCorrMaskMasksAlphareal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksAlpha)
CircGradBasedCorrMaskMasksAnglereal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksAngle)
CircGradBasedCorrMaskMasksBottomreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksBottom)
CircGradBasedCorrMaskMasksCenterValuereal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksCenterValue)
CircGradBasedCorrMaskMasksCenterWeightreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksCenterWeight)
CircGradBasedCorrMaskMasksDabsstring/_+(CircularGradientBasedCorrectionsCorrectionMasksMasksDabs)
CircGradBasedCorrMaskMasksFeatherreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksFeather)
CircGradBasedCorrMaskMasksFlippedboolean/_(CircularGradientBasedCorrectionsCorrectionMasksMasksFlipped)
CircGradBasedCorrMaskMasksFlowreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksFlow)
CircGradBasedCorrMaskMasksFullXreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksFullX)
CircGradBasedCorrMaskMasksFullYreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksFullY)
CircGradBasedCorrMaskMasksInputDigeststring/_(CircularGradientBasedCorrectionsCorrectionMasksMasksInputDigest)
CircGradBasedCorrMaskMasksLeftreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksLeft)
CircGradBasedCorrMaskMasksMaskActiveboolean/_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskActive)
CircGradBasedCorrMaskMasksMaskBlendModeinteger/_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskBlendMode)
CircGradBasedCorrMaskMasksMaskDigeststring/_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskDigest)
CircGradBasedCorrMaskMasksMaskInvertedboolean/_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskInverted)
CircGradBasedCorrMaskMasksMaskNamestring/_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskName)
CircGradBasedCorrMaskMasksMaskSubTypestring/_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskSubType)
CircGradBasedCorrMaskMasksMaskSyncIDstring/_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskSyncID)
CircGradBasedCorrMaskMasksValuereal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskValue)
CircGradBasedCorrMaskMasksMaskVersionstring/_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskVersion)
CircGradBasedCorrMaskMasksMidpointreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksMidpoint)
CircGradBasedCorrMaskMasksOriginstring/_(CircularGradientBasedCorrectionsCorrectionMasksMasksOrigin)
CircGradBasedCorrMaskMasksPerimeterValuereal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksPerimeterValue)
CircGradBasedCorrMaskMasksRadiusreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksRadius)
CircGradBasedCorrMaskMasksReferencePointstring/_(CircularGradientBasedCorrectionsCorrectionMasksMasksReferencePoint)
CircGradBasedCorrMaskMasksRightreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksRight)
CircGradBasedCorrMaskMasksRoundnessreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksRoundness)
CircGradBasedCorrMaskMasksSizeXreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksSizeX)
CircGradBasedCorrMaskMasksSizeYreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksSizeY)
CircGradBasedCorrMaskMasksTopreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksTop)
CircGradBasedCorrMaskMaskSubTypestring/_(CircularGradientBasedCorrectionsCorrectionMasksMaskSubType)
CircGradBasedCorrMaskMasksVersioninteger/_(CircularGradientBasedCorrectionsCorrectionMasksMasksVersion)
CircGradBasedCorrMaskMasksWhatstring/_(CircularGradientBasedCorrectionsCorrectionMasksMasksWhat)
CircGradBasedCorrMaskMasksWholeImageAreastring/_(CircularGradientBasedCorrectionsCorrectionMasksMasksWholeImageArea)
CircGradBasedCorrMaskMasksXreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksX)
CircGradBasedCorrMaskMasksYreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksY)
CircGradBasedCorrMaskMaskSyncIDstring/_(CircularGradientBasedCorrectionsCorrectionMasksMaskSyncID)
CircGradBasedCorrMaskMasksZeroXreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksZeroX)
CircGradBasedCorrMaskMasksZeroYreal/_(CircularGradientBasedCorrectionsCorrectionMasksMasksZeroY)
CircGradBasedCorrMaskValuereal/_(CircularGradientBasedCorrectionsCorrectionMasksMaskValue)
CircGradBasedCorrMaskMaskVersionstring/_(CircularGradientBasedCorrectionsCorrectionMasksMaskVersion)
CircGradBasedCorrMaskMidpointreal/_(CircularGradientBasedCorrectionsCorrectionMasksMidpoint)
CircGradBasedCorrMaskOriginstring/_(CircularGradientBasedCorrectionsCorrectionMasksOrigin)
CircGradBasedCorrMaskPerimeterValuereal/_(CircularGradientBasedCorrectionsCorrectionMasksPerimeterValue)
CircGradBasedCorrMaskRadiusreal/_(CircularGradientBasedCorrectionsCorrectionMasksRadius)
CircGradBasedCorrMaskReferencePointstring/_(CircularGradientBasedCorrectionsCorrectionMasksReferencePoint)
CircGradBasedCorrMaskRightreal/_(CircularGradientBasedCorrectionsCorrectionMasksRight)
CircGradBasedCorrMaskRoundnessreal/_(CircularGradientBasedCorrectionsCorrectionMasksRoundness)
CircGradBasedCorrMaskSizeXreal/_(CircularGradientBasedCorrectionsCorrectionMasksSizeX)
CircGradBasedCorrMaskSizeYreal/_(CircularGradientBasedCorrectionsCorrectionMasksSizeY)
CircGradBasedCorrMaskTopreal/_(CircularGradientBasedCorrectionsCorrectionMasksTop)
CircGradBasedCorrMaskVersioninteger/_(CircularGradientBasedCorrectionsCorrectionMasksVersion)
CircGradBasedCorrMaskWhatstring/_(CircularGradientBasedCorrectionsCorrectionMasksWhat)
CircGradBasedCorrMaskWholeImageAreastring/_(CircularGradientBasedCorrectionsCorrectionMasksWholeImageArea)
CircGradBasedCorrMaskXreal/_(CircularGradientBasedCorrectionsCorrectionMasksX)
CircGradBasedCorrMaskYreal/_(CircularGradientBasedCorrectionsCorrectionMasksY)
CircGradBasedCorrMaskZeroXreal/_(CircularGradientBasedCorrectionsCorrectionMasksZeroX)
CircGradBasedCorrMaskZeroYreal/_(CircularGradientBasedCorrectionsCorrectionMasksZeroY)
CircGradBasedCorrCorrectionNamestring/_+(CircularGradientBasedCorrectionsCorrectionName)
CircGradBasedCorrRangeMaskstruct_+--> CorrRangeMask Struct +
(CircularGradientBasedCorrectionsCorrectionRangeMask; called CorrectionRangeMask by the spec)
CircGradBasedCorrRangeMaskAreaModelsstruct_+--> AreaModels Struct +
(CircularGradientBasedCorrectionsCorrectionRangeMaskAreaModels)
CircGradBasedCorrRangeMaskAreaModelsComponentsstring/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents)
CircGradBasedCorrRangeMaskAreaModelsColorSampleInfostring/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
CircGradBasedCorrRangeMaskColorAmountreal/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskColorAmount)
CircGradBasedCorrRangeMaskDepthFeatherreal/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskDepthFeather)
CircGradBasedCorrRangeMaskDepthMaxreal/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskDepthMax)
CircGradBasedCorrRangeMaskDepthMinreal/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskDepthMin)
CircGradBasedCorrRangeMaskInvertboolean/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskInvert)
CircGradBasedCorrRangeMaskLumFeatherreal/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskLumFeather)
CircGradBasedCorrRangeMaskLuminanceDepthSampleInfostring/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo)
CircGradBasedCorrRangeMaskLumMaxreal/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskLumMax)
CircGradBasedCorrRangeMaskLumMinreal/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskLumMin)
CircGradBasedCorrRangeMaskLumRangestring/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskLumRange)
CircGradBasedCorrRangeMaskSampleTypeinteger/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskSampleType)
CircGradBasedCorrRangeMaskTypestring/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskType)
CircGradBasedCorrRangeMaskVersionstring/_+(CircularGradientBasedCorrectionsCorrectionRangeMaskVersion)
CircGradBasedCorrCorrectionSyncIDstring/_+(CircularGradientBasedCorrectionsCorrectionSyncID)
CircGradBasedCorrBlacks2012real/_(CircularGradientBasedCorrectionsLocalBlacks2012)
CircGradBasedCorrBrightnessreal/_(CircularGradientBasedCorrectionsLocalBrightness)
CircGradBasedCorrClarityreal/_(CircularGradientBasedCorrectionsLocalClarity)
CircGradBasedCorrClarity2012real/_(CircularGradientBasedCorrectionsLocalClarity2012)
CircGradBasedCorrContrastreal/_(CircularGradientBasedCorrectionsLocalContrast)
CircGradBasedCorrContrast2012real/_(CircularGradientBasedCorrectionsLocalContrast2012)
CircGradBasedCorrDefringereal/_(CircularGradientBasedCorrectionsLocalDefringe)
CircGradBasedCorrDehazereal/_(CircularGradientBasedCorrectionsLocalDehaze)
CircGradBasedCorrExposurereal/_(CircularGradientBasedCorrectionsLocalExposure)
CircGradBasedCorrExposure2012real/_(CircularGradientBasedCorrectionsLocalExposure2012)
CircGradBasedCorrHighlights2012real/_(CircularGradientBasedCorrectionsLocalHighlights2012)
CircGradBasedCorrHuereal/_(CircularGradientBasedCorrectionsLocalHue)
CircGradBasedCorrLuminanceNoisereal/_(CircularGradientBasedCorrectionsLocalLuminanceNoise)
CircGradBasedCorrMoirereal/_(CircularGradientBasedCorrectionsLocalMoire)
CircGradBasedCorrSaturationreal/_(CircularGradientBasedCorrectionsLocalSaturation)
CircGradBasedCorrShadows2012real/_(CircularGradientBasedCorrectionsLocalShadows2012)
CircGradBasedCorrSharpnessreal/_(CircularGradientBasedCorrectionsLocalSharpness)
CircGradBasedCorrTemperaturereal/_(CircularGradientBasedCorrectionsLocalTemperature)
CircGradBasedCorrTexturereal/_(CircularGradientBasedCorrectionsLocalTexture)
CircGradBasedCorrTintreal/_(CircularGradientBasedCorrectionsLocalTint)
CircGradBasedCorrToningHuereal/_(CircularGradientBasedCorrectionsLocalToningHue)
CircGradBasedCorrToningSaturationreal/_(CircularGradientBasedCorrectionsLocalToningSaturation)
CircGradBasedCorrWhites2012real/_(CircularGradientBasedCorrectionsLocalWhites2012)
CircGradBasedCorrWhatstring/_(CircularGradientBasedCorrectionsWhat)
Clarityinteger/ 
Clarity2012integer/ 
ClipboardAspectRatiointeger/ 
ClipboardOrientationinteger/ 
Clusterstring/ 
ColorGradeBlendinginteger/ 
ColorGradeGlobalHueinteger/ 
ColorGradeGlobalLuminteger/ 
ColorGradeGlobalSatinteger/ 
ColorGradeHighlightLuminteger/ 
ColorGradeMidtoneHueinteger/ 
ColorGradeMidtoneLuminteger/ 
ColorGradeMidtoneSatinteger/ 
ColorGradeShadowLuminteger/ 
ColorNoiseReductioninteger/ 
ColorNoiseReductionDetailinteger/ 
ColorNoiseReductionSmoothnessinteger/ 
CompatibleVersionstring/ 
ContactInfostring/ 
Contrastinteger/ 
Contrast2012integer/ 
Converterstring/ 
ConvertToGrayscaleboolean/ 
Copyrightstring/ 
CropAnglereal/ 
CropBottomreal/ 
CropConstrainToWarpinteger/ 
CropHeightreal/ 
CropLeftreal/ 
CropRightreal/ 
CropTopreal/ 
CropUnitinteger/0 = pixels +
1 = inches +
2 = cm
CropUnitsinteger/0 = pixels +
1 = inches +
2 = cm
CropWidthreal/ 
DefaultAutoGrayboolean/ 
DefaultAutoToneboolean/ 
DefaultsSpecificToISOboolean/ 
DefaultsSpecificToSerialboolean/ 
Defringeinteger/ 
DefringeGreenAmountinteger/ 
DefringeGreenHueHiinteger/ 
DefringeGreenHueLointeger/ 
DefringePurpleAmountinteger/ 
DefringePurpleHueHiinteger/ 
DefringePurpleHueLointeger/ 
Dehazereal/ 
Descriptionlang-alt/ 
DNGIgnoreSidecarsboolean/ 
Exposurereal/ 
Exposure2012real/ 
FillLightinteger/ 
GradientBasedCorrectionsstruct+--> Correction Struct
GradientBasedCorrActiveboolean/_(GradientBasedCorrectionsCorrectionActive)
GradientBasedCorrAmountreal/_(GradientBasedCorrectionsCorrectionAmount)
GradientBasedCorrMasksstruct_+--> CorrectionMask Struct +
(GradientBasedCorrectionsCorrectionMasks)
GradientBasedCorrMaskAlphareal/_(GradientBasedCorrectionsCorrectionMasksAlpha)
GradientBasedCorrMaskAnglereal/_(GradientBasedCorrectionsCorrectionMasksAngle)
GradientBasedCorrMaskBottomreal/_(GradientBasedCorrectionsCorrectionMasksBottom)
GradientBasedCorrMaskCenterValuereal/_(GradientBasedCorrectionsCorrectionMasksCenterValue)
GradientBasedCorrMaskCenterWeightreal/_(GradientBasedCorrectionsCorrectionMasksCenterWeight)
GradientBasedCorrMaskRangestruct_+--> CorrRangeMask Struct +
(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMask; called CorrectionRangeMask by the spec)
GradientBasedCorrMaskRangeAreaModelsstruct_+--> AreaModels Struct +
(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels)
GradientBasedCorrMaskRangeAreaModelsComponentsstring/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents)
GradientBasedCorrMaskRangeAreaModelsColorSampleInfostring/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
GradientBasedCorrMaskRangeColorAmountreal/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount)
GradientBasedCorrMaskRangeDepthFeatherreal/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather)
GradientBasedCorrMaskRangeDepthMaxreal/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax)
GradientBasedCorrMaskRangeDepthMinreal/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin)
GradientBasedCorrMaskRangeInvertboolean/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert)
GradientBasedCorrMaskRangeLumFeatherreal/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather)
GradientBasedCorrMaskRangeLuminanceDepthSampleInfostring/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo)
GradientBasedCorrMaskRangeLumMaxreal/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax)
GradientBasedCorrMaskRangeLumMinreal/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin)
GradientBasedCorrMaskRangeLumRangestring/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange)
GradientBasedCorrMaskRangeSampleTypeinteger/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType)
GradientBasedCorrMaskRangeTypestring/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskType)
GradientBasedCorrMaskRangeVersionstring/_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion)
GradientBasedCorrMaskDabsstring/_(GradientBasedCorrectionsCorrectionMasksDabs)
GradientBasedCorrMaskFeatherreal/_(GradientBasedCorrectionsCorrectionMasksFeather)
GradientBasedCorrMaskFlippedboolean/_(GradientBasedCorrectionsCorrectionMasksFlipped)
GradientBasedCorrMaskFlowreal/_(GradientBasedCorrectionsCorrectionMasksFlow)
GradientBasedCorrMaskFullXreal/_(GradientBasedCorrectionsCorrectionMasksFullX)
GradientBasedCorrMaskFullYreal/_(GradientBasedCorrectionsCorrectionMasksFullY)
GradientBasedCorrMaskInputDigeststring/_(GradientBasedCorrectionsCorrectionMasksInputDigest)
GradientBasedCorrMaskLeftreal/_(GradientBasedCorrectionsCorrectionMasksLeft)
GradientBasedCorrMaskMaskActiveboolean/_(GradientBasedCorrectionsCorrectionMasksMaskActive)
GradientBasedCorrMaskMaskBlendModeinteger/_(GradientBasedCorrectionsCorrectionMasksMaskBlendMode)
GradientBasedCorrMaskMaskDigeststring/_(GradientBasedCorrectionsCorrectionMasksMaskDigest)
GradientBasedCorrMaskMaskInvertedboolean/_(GradientBasedCorrectionsCorrectionMasksMaskInverted)
GradientBasedCorrMaskMaskNamestring/_(GradientBasedCorrectionsCorrectionMasksMaskName)
GradientBasedCorrMaskMasksstruct_+--> CorrectionMask Struct +
(GradientBasedCorrectionsCorrectionMasksMasks)
GradientBasedCorrMaskMasksAlphareal/_(GradientBasedCorrectionsCorrectionMasksMasksAlpha)
GradientBasedCorrMaskMasksAnglereal/_(GradientBasedCorrectionsCorrectionMasksMasksAngle)
GradientBasedCorrMaskMasksBottomreal/_(GradientBasedCorrectionsCorrectionMasksMasksBottom)
GradientBasedCorrMaskMasksCenterValuereal/_(GradientBasedCorrectionsCorrectionMasksMasksCenterValue)
GradientBasedCorrMaskMasksCenterWeightreal/_(GradientBasedCorrectionsCorrectionMasksMasksCenterWeight)
GradientBasedCorrMaskMasksDabsstring/_+(GradientBasedCorrectionsCorrectionMasksMasksDabs)
GradientBasedCorrMaskMasksFeatherreal/_(GradientBasedCorrectionsCorrectionMasksMasksFeather)
GradientBasedCorrMaskMasksFlippedboolean/_(GradientBasedCorrectionsCorrectionMasksMasksFlipped)
GradientBasedCorrMaskMasksFlowreal/_(GradientBasedCorrectionsCorrectionMasksMasksFlow)
GradientBasedCorrMaskMasksFullXreal/_(GradientBasedCorrectionsCorrectionMasksMasksFullX)
GradientBasedCorrMaskMasksFullYreal/_(GradientBasedCorrectionsCorrectionMasksMasksFullY)
GradientBasedCorrMaskMasksInputDigeststring/_(GradientBasedCorrectionsCorrectionMasksMasksInputDigest)
GradientBasedCorrMaskMasksLeftreal/_(GradientBasedCorrectionsCorrectionMasksMasksLeft)
GradientBasedCorrMaskMasksMaskActiveboolean/_(GradientBasedCorrectionsCorrectionMasksMasksMaskActive)
GradientBasedCorrMaskMasksMaskBlendModeinteger/_(GradientBasedCorrectionsCorrectionMasksMasksMaskBlendMode)
GradientBasedCorrMaskMasksMaskDigeststring/_(GradientBasedCorrectionsCorrectionMasksMasksMaskDigest)
GradientBasedCorrMaskMasksMaskInvertedboolean/_(GradientBasedCorrectionsCorrectionMasksMasksMaskInverted)
GradientBasedCorrMaskMasksMaskNamestring/_(GradientBasedCorrectionsCorrectionMasksMasksMaskName)
GradientBasedCorrMaskMasksMaskSubTypestring/_(GradientBasedCorrectionsCorrectionMasksMasksMaskSubType)
GradientBasedCorrMaskMasksMaskSyncIDstring/_(GradientBasedCorrectionsCorrectionMasksMasksMaskSyncID)
GradientBasedCorrMaskMasksValuereal/_(GradientBasedCorrectionsCorrectionMasksMasksMaskValue)
GradientBasedCorrMaskMasksMaskVersionstring/_(GradientBasedCorrectionsCorrectionMasksMasksMaskVersion)
GradientBasedCorrMaskMasksMidpointreal/_(GradientBasedCorrectionsCorrectionMasksMasksMidpoint)
GradientBasedCorrMaskMasksOriginstring/_(GradientBasedCorrectionsCorrectionMasksMasksOrigin)
GradientBasedCorrMaskMasksPerimeterValuereal/_(GradientBasedCorrectionsCorrectionMasksMasksPerimeterValue)
GradientBasedCorrMaskMasksRadiusreal/_(GradientBasedCorrectionsCorrectionMasksMasksRadius)
GradientBasedCorrMaskMasksReferencePointstring/_(GradientBasedCorrectionsCorrectionMasksMasksReferencePoint)
GradientBasedCorrMaskMasksRightreal/_(GradientBasedCorrectionsCorrectionMasksMasksRight)
GradientBasedCorrMaskMasksRoundnessreal/_(GradientBasedCorrectionsCorrectionMasksMasksRoundness)
GradientBasedCorrMaskMasksSizeXreal/_(GradientBasedCorrectionsCorrectionMasksMasksSizeX)
GradientBasedCorrMaskMasksSizeYreal/_(GradientBasedCorrectionsCorrectionMasksMasksSizeY)
GradientBasedCorrMaskMasksTopreal/_(GradientBasedCorrectionsCorrectionMasksMasksTop)
GradientBasedCorrMaskMaskSubTypestring/_(GradientBasedCorrectionsCorrectionMasksMaskSubType)
GradientBasedCorrMaskMasksVersioninteger/_(GradientBasedCorrectionsCorrectionMasksMasksVersion)
GradientBasedCorrMaskMasksWhatstring/_(GradientBasedCorrectionsCorrectionMasksMasksWhat)
GradientBasedCorrMaskMasksWholeImageAreastring/_(GradientBasedCorrectionsCorrectionMasksMasksWholeImageArea)
GradientBasedCorrMaskMasksXreal/_(GradientBasedCorrectionsCorrectionMasksMasksX)
GradientBasedCorrMaskMasksYreal/_(GradientBasedCorrectionsCorrectionMasksMasksY)
GradientBasedCorrMaskMaskSyncIDstring/_(GradientBasedCorrectionsCorrectionMasksMaskSyncID)
GradientBasedCorrMaskMasksZeroXreal/_(GradientBasedCorrectionsCorrectionMasksMasksZeroX)
GradientBasedCorrMaskMasksZeroYreal/_(GradientBasedCorrectionsCorrectionMasksMasksZeroY)
GradientBasedCorrMaskValuereal/_(GradientBasedCorrectionsCorrectionMasksMaskValue)
GradientBasedCorrMaskMaskVersionstring/_(GradientBasedCorrectionsCorrectionMasksMaskVersion)
GradientBasedCorrMaskMidpointreal/_(GradientBasedCorrectionsCorrectionMasksMidpoint)
GradientBasedCorrMaskOriginstring/_(GradientBasedCorrectionsCorrectionMasksOrigin)
GradientBasedCorrMaskPerimeterValuereal/_(GradientBasedCorrectionsCorrectionMasksPerimeterValue)
GradientBasedCorrMaskRadiusreal/_(GradientBasedCorrectionsCorrectionMasksRadius)
GradientBasedCorrMaskReferencePointstring/_(GradientBasedCorrectionsCorrectionMasksReferencePoint)
GradientBasedCorrMaskRightreal/_(GradientBasedCorrectionsCorrectionMasksRight)
GradientBasedCorrMaskRoundnessreal/_(GradientBasedCorrectionsCorrectionMasksRoundness)
GradientBasedCorrMaskSizeXreal/_(GradientBasedCorrectionsCorrectionMasksSizeX)
GradientBasedCorrMaskSizeYreal/_(GradientBasedCorrectionsCorrectionMasksSizeY)
GradientBasedCorrMaskTopreal/_(GradientBasedCorrectionsCorrectionMasksTop)
GradientBasedCorrMaskVersioninteger/_(GradientBasedCorrectionsCorrectionMasksVersion)
GradientBasedCorrMaskWhatstring/_(GradientBasedCorrectionsCorrectionMasksWhat)
GradientBasedCorrMaskWholeImageAreastring/_(GradientBasedCorrectionsCorrectionMasksWholeImageArea)
GradientBasedCorrMaskXreal/_(GradientBasedCorrectionsCorrectionMasksX)
GradientBasedCorrMaskYreal/_(GradientBasedCorrectionsCorrectionMasksY)
GradientBasedCorrMaskZeroXreal/_(GradientBasedCorrectionsCorrectionMasksZeroX)
GradientBasedCorrMaskZeroYreal/_(GradientBasedCorrectionsCorrectionMasksZeroY)
GradientBasedCorrCorrectionNamestring/_+(GradientBasedCorrectionsCorrectionName)
GradientBasedCorrRangeMaskstruct_+--> CorrRangeMask Struct +
(GradientBasedCorrectionsCorrectionRangeMask; called CorrectionRangeMask by the spec)
GradientBasedCorrRangeMaskAreaModelsstruct_+--> AreaModels Struct +
(GradientBasedCorrectionsCorrectionRangeMaskAreaModels)
GradientBasedCorrRangeMaskAreaModelsComponentsstring/_+(GradientBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents)
GradientBasedCorrRangeMaskAreaModelsColorSampleInfostring/_+(GradientBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
GradientBasedCorrRangeMaskColorAmountreal/_+(GradientBasedCorrectionsCorrectionRangeMaskColorAmount)
GradientBasedCorrRangeMaskDepthFeatherreal/_+(GradientBasedCorrectionsCorrectionRangeMaskDepthFeather)
GradientBasedCorrRangeMaskDepthMaxreal/_+(GradientBasedCorrectionsCorrectionRangeMaskDepthMax)
GradientBasedCorrRangeMaskDepthMinreal/_+(GradientBasedCorrectionsCorrectionRangeMaskDepthMin)
GradientBasedCorrRangeMaskInvertboolean/_+(GradientBasedCorrectionsCorrectionRangeMaskInvert)
GradientBasedCorrRangeMaskLumFeatherreal/_+(GradientBasedCorrectionsCorrectionRangeMaskLumFeather)
GradientBasedCorrRangeMaskLuminanceDepthSampleInfostring/_+(GradientBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo)
GradientBasedCorrRangeMaskLumMaxreal/_+(GradientBasedCorrectionsCorrectionRangeMaskLumMax)
GradientBasedCorrRangeMaskLumMinreal/_+(GradientBasedCorrectionsCorrectionRangeMaskLumMin)
GradientBasedCorrRangeMaskLumRangestring/_+(GradientBasedCorrectionsCorrectionRangeMaskLumRange)
GradientBasedCorrRangeMaskSampleTypeinteger/_+(GradientBasedCorrectionsCorrectionRangeMaskSampleType)
GradientBasedCorrRangeMaskTypestring/_+(GradientBasedCorrectionsCorrectionRangeMaskType)
GradientBasedCorrRangeMaskVersionstring/_+(GradientBasedCorrectionsCorrectionRangeMaskVersion)
GradientBasedCorrCorrectionSyncIDstring/_+(GradientBasedCorrectionsCorrectionSyncID)
GradientBasedCorrBlacks2012real/_(GradientBasedCorrectionsLocalBlacks2012)
GradientBasedCorrBrightnessreal/_(GradientBasedCorrectionsLocalBrightness)
GradientBasedCorrClarityreal/_(GradientBasedCorrectionsLocalClarity)
GradientBasedCorrClarity2012real/_(GradientBasedCorrectionsLocalClarity2012)
GradientBasedCorrContrastreal/_(GradientBasedCorrectionsLocalContrast)
GradientBasedCorrContrast2012real/_(GradientBasedCorrectionsLocalContrast2012)
GradientBasedCorrDefringereal/_(GradientBasedCorrectionsLocalDefringe)
GradientBasedCorrDehazereal/_(GradientBasedCorrectionsLocalDehaze)
GradientBasedCorrExposurereal/_(GradientBasedCorrectionsLocalExposure)
GradientBasedCorrExposure2012real/_(GradientBasedCorrectionsLocalExposure2012)
GradientBasedCorrHighlights2012real/_(GradientBasedCorrectionsLocalHighlights2012)
GradientBasedCorrHuereal/_(GradientBasedCorrectionsLocalHue)
GradientBasedCorrLuminanceNoisereal/_(GradientBasedCorrectionsLocalLuminanceNoise)
GradientBasedCorrMoirereal/_(GradientBasedCorrectionsLocalMoire)
GradientBasedCorrSaturationreal/_(GradientBasedCorrectionsLocalSaturation)
GradientBasedCorrShadows2012real/_(GradientBasedCorrectionsLocalShadows2012)
GradientBasedCorrSharpnessreal/_(GradientBasedCorrectionsLocalSharpness)
GradientBasedCorrTemperaturereal/_(GradientBasedCorrectionsLocalTemperature)
GradientBasedCorrTexturereal/_(GradientBasedCorrectionsLocalTexture)
GradientBasedCorrTintreal/_(GradientBasedCorrectionsLocalTint)
GradientBasedCorrToningHuereal/_(GradientBasedCorrectionsLocalToningHue)
GradientBasedCorrToningSaturationreal/_(GradientBasedCorrectionsLocalToningSaturation)
GradientBasedCorrWhites2012real/_(GradientBasedCorrectionsLocalWhites2012)
GradientBasedCorrWhatstring/_(GradientBasedCorrectionsWhat)
GrainAmountinteger/ 
GrainFrequencyinteger/ 
GrainSeedinteger/ 
GrainSizeinteger/ 
GrayMixerAquainteger/ 
GrayMixerBlueinteger/ 
GrayMixerGreeninteger/ 
GrayMixerMagentainteger/ 
GrayMixerOrangeinteger/ 
GrayMixerPurpleinteger/ 
GrayMixerRedinteger/ 
GrayMixerYellowinteger/ 
GreenHueinteger/ 
GreenSaturationinteger/ 
Grouplang-alt/ 
HasCropboolean/ 
HasSettingsboolean/ 
Highlight2012integer/ 
HighlightRecoveryinteger/ 
Highlights2012integer/ 
HueAdjustmentAquainteger/ 
HueAdjustmentBlueinteger/ 
HueAdjustmentGreeninteger/ 
HueAdjustmentMagentainteger/ 
HueAdjustmentOrangeinteger/ 
HueAdjustmentPurpleinteger/ 
HueAdjustmentRedinteger/ 
HueAdjustmentYellowinteger/ 
IncrementalTemperatureinteger/ 
IncrementalTintinteger/ 
JPEGHandlingstring/ 
LensManualDistortionAmountinteger/ 
LensProfileChromaticAberrationScaleinteger/ 
LensProfileDigeststring/ 
LensProfileDistortionScaleinteger/ 
LensProfileEnableinteger/ 
LensProfileFilenamestring/ 
LensProfileIsEmbeddedboolean/ 
LensProfileMatchKeyCameraModelNamestring/ 
LensProfileMatchKeyExifMakestring/ 
LensProfileMatchKeyExifModelstring/ 
LensProfileMatchKeyIsRawboolean/ 
LensProfileMatchKeyLensIDstring/ 
LensProfileMatchKeyLensInfostring/ 
LensProfileMatchKeyLensNamestring/ 
LensProfileMatchKeySensorFormatFactorreal/ 
LensProfileNamestring/ 
LensProfileSetupstring/ 
LensProfileVignettingScaleinteger/ 
Lookstruct--> Look Struct
LookAmountstring/_ 
LookClusterstring/_ 
LookCopyrightstring/_ 
LookGrouplang-alt/_ 
LookNamestring/(NOT a flattened tag!)
LookParametersstruct_--> LookParms Struct
LookParametersCameraProfilestring/_ 
LookParametersClarity2012string/_ 
LookParametersConvertToGrayscalestring/_ 
LookParametersLookTablestring/_ 
LookParametersProcessVersionstring/_ 
LookParametersToneCurvePV2012string/_+ 
LookParametersToneCurvePV2012Bluestring/_+ 
LookParametersToneCurvePV2012Greenstring/_+ 
LookParametersToneCurvePV2012Redstring/_+ 
LookParametersVersionstring/_ 
LookSupportsAmountstring/_ 
LookSupportsMonochromestring/_ 
LookSupportsOutputReferredstring/_ 
LookUUIDstring/_ 
LuminanceAdjustmentAquainteger/ 
LuminanceAdjustmentBlueinteger/ 
LuminanceAdjustmentGreeninteger/ 
LuminanceAdjustmentMagentainteger/ 
LuminanceAdjustmentOrangeinteger/ 
LuminanceAdjustmentPurpleinteger/ 
LuminanceAdjustmentRedinteger/ 
LuminanceAdjustmentYellowinteger/ 
LuminanceNoiseReductionContrastinteger/ 
LuminanceNoiseReductionDetailinteger/ 
LuminanceSmoothinginteger/ 
MaskGroupBasedCorrectionsstruct+--> Correction Struct
MaskGroupBasedCorrActiveboolean/_(MaskGroupBasedCorrectionsCorrectionActive)
MaskGroupBasedCorrAmountreal/_(MaskGroupBasedCorrectionsCorrectionAmount)
MaskGroupBasedCorrMaskstruct_+--> CorrectionMask Struct +
(MaskGroupBasedCorrectionsCorrectionMasks)
MaskGroupBasedCorrMaskAlphareal/_(MaskGroupBasedCorrectionsCorrectionMasksAlpha)
MaskGroupBasedCorrMaskAnglereal/_(MaskGroupBasedCorrectionsCorrectionMasksAngle)
MaskGroupBasedCorrMaskBottomreal/_(MaskGroupBasedCorrectionsCorrectionMasksBottom)
MaskGroupBasedCorrMaskCenterValuereal/_(MaskGroupBasedCorrectionsCorrectionMasksCenterValue)
MaskGroupBasedCorrMaskCenterWeightreal/_(MaskGroupBasedCorrectionsCorrectionMasksCenterWeight)
MaskGroupBasedCorrMaskRangestruct_+--> CorrRangeMask Struct +
(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMask; called CorrectionRangeMask by the spec)
MaskGroupBasedCorrMaskRangeAreaModelsstruct_+--> AreaModels Struct +
(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels)
MaskGroupBasedCorrMaskRangeAreaModelsComponentsstring/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents)
MaskGroupBasedCorrMaskRangeAreaModelsColorSampleInfostring/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
MaskGroupBasedCorrMaskRangeColorAmountreal/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount)
MaskGroupBasedCorrMaskRangeDepthFeatherreal/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather)
MaskGroupBasedCorrMaskRangeDepthMaxreal/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax)
MaskGroupBasedCorrMaskRangeDepthMinreal/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin)
MaskGroupBasedCorrMaskRangeInvertboolean/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert)
MaskGroupBasedCorrMaskRangeLumFeatherreal/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather)
MaskGroupBasedCorrMaskRangeLuminanceDepthSampleInfostring/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo)
MaskGroupBasedCorrMaskRangeLumMaxreal/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax)
MaskGroupBasedCorrMaskRangeLumMinreal/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin)
MaskGroupBasedCorrMaskRangeLumRangestring/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange)
MaskGroupBasedCorrMaskRangeSampleTypeinteger/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType)
MaskGroupBasedCorrMaskRangeTypestring/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskType)
MaskGroupBasedCorrMaskRangeVersionstring/_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion)
MaskGroupBasedCorrMaskDabsstring/_+(MaskGroupBasedCorrectionsCorrectionMasksDabs)
MaskGroupBasedCorrMaskFeatherreal/_(MaskGroupBasedCorrectionsCorrectionMasksFeather)
MaskGroupBasedCorrMaskFlippedboolean/_(MaskGroupBasedCorrectionsCorrectionMasksFlipped)
MaskGroupBasedCorrMaskFlowreal/_(MaskGroupBasedCorrectionsCorrectionMasksFlow)
MaskGroupBasedCorrMaskFullXreal/_(MaskGroupBasedCorrectionsCorrectionMasksFullX)
MaskGroupBasedCorrMaskFullYreal/_(MaskGroupBasedCorrectionsCorrectionMasksFullY)
MaskGroupBasedCorrMaskInputDigeststring/_(MaskGroupBasedCorrectionsCorrectionMasksInputDigest)
MaskGroupBasedCorrMaskLeftreal/_(MaskGroupBasedCorrectionsCorrectionMasksLeft)
MaskGroupBasedCorrMaskMaskActiveboolean/_(MaskGroupBasedCorrectionsCorrectionMasksMaskActive)
MaskGroupBasedCorrMaskMaskBlendModeinteger/_(MaskGroupBasedCorrectionsCorrectionMasksMaskBlendMode)
MaskGroupBasedCorrMaskMaskDigeststring/_(MaskGroupBasedCorrectionsCorrectionMasksMaskDigest)
MaskGroupBasedCorrMaskMaskInvertedboolean/_(MaskGroupBasedCorrectionsCorrectionMasksMaskInverted)
MaskGroupBasedCorrMaskMaskNamestring/_(MaskGroupBasedCorrectionsCorrectionMasksMaskName)
MaskGroupBasedCorrMaskMasksstruct_+--> CorrectionMask Struct +
(MaskGroupBasedCorrectionsCorrectionMasksMasks)
MaskGroupBasedCorrMaskMasksAlphareal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksAlpha)
MaskGroupBasedCorrMaskMasksAnglereal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksAngle)
MaskGroupBasedCorrMaskMasksBottomreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksBottom)
MaskGroupBasedCorrMaskMasksCenterValuereal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksCenterValue)
MaskGroupBasedCorrMaskMasksCenterWeightreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksCenterWeight)
MaskGroupBasedCorrMaskMasksDabsstring/_+(MaskGroupBasedCorrectionsCorrectionMasksMasksDabs)
MaskGroupBasedCorrMaskMasksFeatherreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksFeather)
MaskGroupBasedCorrMaskMasksFlippedboolean/_(MaskGroupBasedCorrectionsCorrectionMasksMasksFlipped)
MaskGroupBasedCorrMaskMasksFlowreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksFlow)
MaskGroupBasedCorrMaskMasksFullXreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksFullX)
MaskGroupBasedCorrMaskMasksFullYreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksFullY)
MaskGroupBasedCorrMaskMasksInputDigeststring/_(MaskGroupBasedCorrectionsCorrectionMasksMasksInputDigest)
MaskGroupBasedCorrMaskMasksLeftreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksLeft)
MaskGroupBasedCorrMaskMasksMaskActiveboolean/_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskActive)
MaskGroupBasedCorrMaskMasksMaskBlendModeinteger/_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskBlendMode)
MaskGroupBasedCorrMaskMasksMaskDigeststring/_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskDigest)
MaskGroupBasedCorrMaskMasksMaskInvertedboolean/_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskInverted)
MaskGroupBasedCorrMaskMasksMaskNamestring/_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskName)
MaskGroupBasedCorrMaskMasksMaskSubTypestring/_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskSubType)
MaskGroupBasedCorrMaskMasksMaskSyncIDstring/_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskSyncID)
MaskGroupBasedCorrMaskMasksValuereal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskValue)
MaskGroupBasedCorrMaskMasksMaskVersionstring/_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskVersion)
MaskGroupBasedCorrMaskMasksMidpointreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksMidpoint)
MaskGroupBasedCorrMaskMasksOriginstring/_(MaskGroupBasedCorrectionsCorrectionMasksMasksOrigin)
MaskGroupBasedCorrMaskMasksPerimeterValuereal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksPerimeterValue)
MaskGroupBasedCorrMaskMasksRadiusreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksRadius)
MaskGroupBasedCorrMaskMasksReferencePointstring/_(MaskGroupBasedCorrectionsCorrectionMasksMasksReferencePoint)
MaskGroupBasedCorrMaskMasksRightreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksRight)
MaskGroupBasedCorrMaskMasksRoundnessreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksRoundness)
MaskGroupBasedCorrMaskMasksSizeXreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksSizeX)
MaskGroupBasedCorrMaskMasksSizeYreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksSizeY)
MaskGroupBasedCorrMaskMasksTopreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksTop)
MaskGroupBasedCorrMaskMaskSubTypestring/_(MaskGroupBasedCorrectionsCorrectionMasksMaskSubType)
MaskGroupBasedCorrMaskMasksVersioninteger/_(MaskGroupBasedCorrectionsCorrectionMasksMasksVersion)
MaskGroupBasedCorrMaskMasksWhatstring/_(MaskGroupBasedCorrectionsCorrectionMasksMasksWhat)
MaskGroupBasedCorrMaskMasksWholeImageAreastring/_(MaskGroupBasedCorrectionsCorrectionMasksMasksWholeImageArea)
MaskGroupBasedCorrMaskMasksXreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksX)
MaskGroupBasedCorrMaskMasksYreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksY)
MaskGroupBasedCorrMaskMaskSyncIDstring/_(MaskGroupBasedCorrectionsCorrectionMasksMaskSyncID)
MaskGroupBasedCorrMaskMasksZeroXreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksZeroX)
MaskGroupBasedCorrMaskMasksZeroYreal/_(MaskGroupBasedCorrectionsCorrectionMasksMasksZeroY)
MaskGroupBasedCorrMaskValuereal/_(MaskGroupBasedCorrectionsCorrectionMasksMaskValue)
MaskGroupBasedCorrMaskMaskVersionstring/_(MaskGroupBasedCorrectionsCorrectionMasksMaskVersion)
MaskGroupBasedCorrMaskMidpointreal/_(MaskGroupBasedCorrectionsCorrectionMasksMidpoint)
MaskGroupBasedCorrMaskOriginstring/_(MaskGroupBasedCorrectionsCorrectionMasksOrigin)
MaskGroupBasedCorrMaskPerimeterValuereal/_(MaskGroupBasedCorrectionsCorrectionMasksPerimeterValue)
MaskGroupBasedCorrMaskRadiusreal/_(MaskGroupBasedCorrectionsCorrectionMasksRadius)
MaskGroupBasedCorrMaskReferencePointstring/_(MaskGroupBasedCorrectionsCorrectionMasksReferencePoint)
MaskGroupBasedCorrMaskRightreal/_(MaskGroupBasedCorrectionsCorrectionMasksRight)
MaskGroupBasedCorrMaskRoundnessreal/_(MaskGroupBasedCorrectionsCorrectionMasksRoundness)
MaskGroupBasedCorrMaskSizeXreal/_(MaskGroupBasedCorrectionsCorrectionMasksSizeX)
MaskGroupBasedCorrMaskSizeYreal/_(MaskGroupBasedCorrectionsCorrectionMasksSizeY)
MaskGroupBasedCorrMaskTopreal/_(MaskGroupBasedCorrectionsCorrectionMasksTop)
MaskGroupBasedCorrMaskVersioninteger/_(MaskGroupBasedCorrectionsCorrectionMasksVersion)
MaskGroupBasedCorrMaskWhatstring/_(MaskGroupBasedCorrectionsCorrectionMasksWhat)
MaskGroupBasedCorrMaskWholeImageAreastring/_(MaskGroupBasedCorrectionsCorrectionMasksWholeImageArea)
MaskGroupBasedCorrMaskXreal/_(MaskGroupBasedCorrectionsCorrectionMasksX)
MaskGroupBasedCorrMaskYreal/_(MaskGroupBasedCorrectionsCorrectionMasksY)
MaskGroupBasedCorrMaskZeroXreal/_(MaskGroupBasedCorrectionsCorrectionMasksZeroX)
MaskGroupBasedCorrMaskZeroYreal/_(MaskGroupBasedCorrectionsCorrectionMasksZeroY)
MaskGroupBasedCorrCorrectionNamestring/_+(MaskGroupBasedCorrectionsCorrectionName)
MaskGroupBasedCorrRangeMaskstruct_+--> CorrRangeMask Struct +
(MaskGroupBasedCorrectionsCorrectionRangeMask; called CorrectionRangeMask by the spec)
MaskGroupBasedCorrRangeMaskAreaModelsstruct_+--> AreaModels Struct +
(MaskGroupBasedCorrectionsCorrectionRangeMaskAreaModels)
MaskGroupBasedCorrRangeMaskAreaModelsComponentsstring/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents)
MaskGroupBasedCorrRangeMaskAreaModelsColorSampleInfostring/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
MaskGroupBasedCorrRangeMaskColorAmountreal/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskColorAmount)
MaskGroupBasedCorrRangeMaskDepthFeatherreal/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskDepthFeather)
MaskGroupBasedCorrRangeMaskDepthMaxreal/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskDepthMax)
MaskGroupBasedCorrRangeMaskDepthMinreal/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskDepthMin)
MaskGroupBasedCorrRangeMaskInvertboolean/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskInvert)
MaskGroupBasedCorrRangeMaskLumFeatherreal/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskLumFeather)
MaskGroupBasedCorrRangeMaskLuminanceDepthSampleInfostring/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo)
MaskGroupBasedCorrRangeMaskLumMaxreal/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskLumMax)
MaskGroupBasedCorrRangeMaskLumMinreal/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskLumMin)
MaskGroupBasedCorrRangeMaskLumRangestring/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskLumRange)
MaskGroupBasedCorrRangeMaskSampleTypeinteger/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskSampleType)
MaskGroupBasedCorrRangeMaskTypestring/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskType)
MaskGroupBasedCorrRangeMaskVersionstring/_+(MaskGroupBasedCorrectionsCorrectionRangeMaskVersion)
MaskGroupBasedCorrCorrectionSyncIDstring/_+(MaskGroupBasedCorrectionsCorrectionSyncID)
MaskGroupBasedCorrBlacks2012real/_(MaskGroupBasedCorrectionsLocalBlacks2012)
MaskGroupBasedCorrBrightnessreal/_(MaskGroupBasedCorrectionsLocalBrightness)
MaskGroupBasedCorrClarityreal/_(MaskGroupBasedCorrectionsLocalClarity)
MaskGroupBasedCorrClarity2012real/_(MaskGroupBasedCorrectionsLocalClarity2012)
MaskGroupBasedCorrContrastreal/_(MaskGroupBasedCorrectionsLocalContrast)
MaskGroupBasedCorrContrast2012real/_(MaskGroupBasedCorrectionsLocalContrast2012)
MaskGroupBasedCorrDefringereal/_(MaskGroupBasedCorrectionsLocalDefringe)
MaskGroupBasedCorrDehazereal/_(MaskGroupBasedCorrectionsLocalDehaze)
MaskGroupBasedCorrExposurereal/_(MaskGroupBasedCorrectionsLocalExposure)
MaskGroupBasedCorrExposure2012real/_(MaskGroupBasedCorrectionsLocalExposure2012)
MaskGroupBasedCorrHighlights2012real/_(MaskGroupBasedCorrectionsLocalHighlights2012)
MaskGroupBasedCorrHuereal/_(MaskGroupBasedCorrectionsLocalHue)
MaskGroupBasedCorrLuminanceNoisereal/_(MaskGroupBasedCorrectionsLocalLuminanceNoise)
MaskGroupBasedCorrMoirereal/_(MaskGroupBasedCorrectionsLocalMoire)
MaskGroupBasedCorrSaturationreal/_(MaskGroupBasedCorrectionsLocalSaturation)
MaskGroupBasedCorrShadows2012real/_(MaskGroupBasedCorrectionsLocalShadows2012)
MaskGroupBasedCorrSharpnessreal/_(MaskGroupBasedCorrectionsLocalSharpness)
MaskGroupBasedCorrTemperaturereal/_(MaskGroupBasedCorrectionsLocalTemperature)
MaskGroupBasedCorrTexturereal/_(MaskGroupBasedCorrectionsLocalTexture)
MaskGroupBasedCorrTintreal/_(MaskGroupBasedCorrectionsLocalTint)
MaskGroupBasedCorrToningHuereal/_(MaskGroupBasedCorrectionsLocalToningHue)
MaskGroupBasedCorrToningSaturationreal/_(MaskGroupBasedCorrectionsLocalToningSaturation)
MaskGroupBasedCorrWhites2012real/_(MaskGroupBasedCorrectionsLocalWhites2012)
MaskGroupBasedCorrWhatstring/_(MaskGroupBasedCorrectionsWhat)
MoireFilterstring/'Off' = Off +
'On' = On
Namelang-alt/ 
NegativeCacheLargePreviewSizeinteger/ 
NegativeCacheMaximumSizereal/ 
NegativeCachePathstring/ 
OverrideLookVignetteboolean/ 
PaintBasedCorrectionsstruct+--> Correction Struct
PaintCorrectionActiveboolean/_(PaintBasedCorrectionsCorrectionActive)
PaintCorrectionAmountreal/_(PaintBasedCorrectionsCorrectionAmount)
PaintBasedCorrectionMasksstruct_+--> CorrectionMask Struct +
(PaintBasedCorrectionsCorrectionMasks)
PaintCorrectionMaskAlphareal/_(PaintBasedCorrectionsCorrectionMasksAlpha)
PaintCorrectionMaskAnglereal/_(PaintBasedCorrectionsCorrectionMasksAngle)
PaintCorrectionMaskBottomreal/_(PaintBasedCorrectionsCorrectionMasksBottom)
PaintCorrectionMaskCenterValuereal/_(PaintBasedCorrectionsCorrectionMasksCenterValue)
PaintCorrectionMaskCenterWeightreal/_(PaintBasedCorrectionsCorrectionMasksCenterWeight)
PaintCorrectionMaskRangestruct_+--> CorrRangeMask Struct +
(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMask; called CorrectionRangeMask by the spec)
PaintCorrectionMaskRangeAreaModelsstruct_+--> AreaModels Struct +
(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels)
PaintCorrectionMaskRangeAreaModelsComponentsstring/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents)
PaintCorrectionMaskRangeAreaModelsColorSampleInfostring/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
PaintCorrectionMaskRangeColorAmountreal/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount)
PaintCorrectionMaskRangeDepthFeatherreal/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather)
PaintCorrectionMaskRangeDepthMaxreal/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax)
PaintCorrectionMaskRangeDepthMinreal/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin)
PaintCorrectionMaskRangeInvertboolean/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert)
PaintCorrectionMaskRangeLumFeatherreal/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather)
PaintCorrectionMaskRangeLuminanceDepthSampleInfostring/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo)
PaintCorrectionMaskRangeLumMaxreal/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax)
PaintCorrectionMaskRangeLumMinreal/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin)
PaintCorrectionMaskRangeLumRangestring/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange)
PaintCorrectionMaskRangeSampleTypeinteger/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType)
PaintCorrectionMaskRangeTypestring/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskType)
PaintCorrectionMaskRangeVersionstring/_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion)
PaintCorrectionMaskDabsstring/_(PaintBasedCorrectionsCorrectionMasksDabs)
PaintCorrectionMaskFeatherreal/_(PaintBasedCorrectionsCorrectionMasksFeather)
PaintCorrectionMaskFlippedboolean/_(PaintBasedCorrectionsCorrectionMasksFlipped)
PaintCorrectionMaskFlowreal/_(PaintBasedCorrectionsCorrectionMasksFlow)
PaintCorrectionMaskFullXreal/_(PaintBasedCorrectionsCorrectionMasksFullX)
PaintCorrectionMaskFullYreal/_(PaintBasedCorrectionsCorrectionMasksFullY)
PaintCorrectionMaskInputDigeststring/_(PaintBasedCorrectionsCorrectionMasksInputDigest)
PaintCorrectionMaskLeftreal/_(PaintBasedCorrectionsCorrectionMasksLeft)
PaintCorrectionMaskMaskActiveboolean/_(PaintBasedCorrectionsCorrectionMasksMaskActive)
PaintCorrectionMaskMaskBlendModeinteger/_(PaintBasedCorrectionsCorrectionMasksMaskBlendMode)
PaintCorrectionMaskMaskDigeststring/_(PaintBasedCorrectionsCorrectionMasksMaskDigest)
PaintCorrectionMaskMaskInvertedboolean/_(PaintBasedCorrectionsCorrectionMasksMaskInverted)
PaintCorrectionMaskMaskNamestring/_(PaintBasedCorrectionsCorrectionMasksMaskName)
PaintCorrectionMaskMasksstruct_+--> CorrectionMask Struct +
(PaintBasedCorrectionsCorrectionMasksMasks)
PaintCorrectionMaskMasksAlphareal/_(PaintBasedCorrectionsCorrectionMasksMasksAlpha)
PaintCorrectionMaskMasksAnglereal/_(PaintBasedCorrectionsCorrectionMasksMasksAngle)
PaintCorrectionMaskMasksBottomreal/_(PaintBasedCorrectionsCorrectionMasksMasksBottom)
PaintCorrectionMaskMasksCenterValuereal/_(PaintBasedCorrectionsCorrectionMasksMasksCenterValue)
PaintCorrectionMaskMasksCenterWeightreal/_(PaintBasedCorrectionsCorrectionMasksMasksCenterWeight)
PaintCorrectionMaskMasksDabsstring/_+(PaintBasedCorrectionsCorrectionMasksMasksDabs)
PaintCorrectionMaskMasksFeatherreal/_(PaintBasedCorrectionsCorrectionMasksMasksFeather)
PaintCorrectionMaskMasksFlippedboolean/_(PaintBasedCorrectionsCorrectionMasksMasksFlipped)
PaintCorrectionMaskMasksFlowreal/_(PaintBasedCorrectionsCorrectionMasksMasksFlow)
PaintCorrectionMaskMasksFullXreal/_(PaintBasedCorrectionsCorrectionMasksMasksFullX)
PaintCorrectionMaskMasksFullYreal/_(PaintBasedCorrectionsCorrectionMasksMasksFullY)
PaintCorrectionMaskMasksInputDigeststring/_(PaintBasedCorrectionsCorrectionMasksMasksInputDigest)
PaintCorrectionMaskMasksLeftreal/_(PaintBasedCorrectionsCorrectionMasksMasksLeft)
PaintCorrectionMaskMasksMaskActiveboolean/_(PaintBasedCorrectionsCorrectionMasksMasksMaskActive)
PaintCorrectionMaskMasksMaskBlendModeinteger/_(PaintBasedCorrectionsCorrectionMasksMasksMaskBlendMode)
PaintCorrectionMaskMasksMaskDigeststring/_(PaintBasedCorrectionsCorrectionMasksMasksMaskDigest)
PaintCorrectionMaskMasksMaskInvertedboolean/_(PaintBasedCorrectionsCorrectionMasksMasksMaskInverted)
PaintCorrectionMaskMasksMaskNamestring/_(PaintBasedCorrectionsCorrectionMasksMasksMaskName)
PaintCorrectionMaskMasksMaskSubTypestring/_(PaintBasedCorrectionsCorrectionMasksMasksMaskSubType)
PaintCorrectionMaskMasksMaskSyncIDstring/_(PaintBasedCorrectionsCorrectionMasksMasksMaskSyncID)
PaintCorrectionMaskMasksValuereal/_(PaintBasedCorrectionsCorrectionMasksMasksMaskValue)
PaintCorrectionMaskMasksMaskVersionstring/_(PaintBasedCorrectionsCorrectionMasksMasksMaskVersion)
PaintCorrectionMaskMasksMidpointreal/_(PaintBasedCorrectionsCorrectionMasksMasksMidpoint)
PaintCorrectionMaskMasksOriginstring/_(PaintBasedCorrectionsCorrectionMasksMasksOrigin)
PaintCorrectionMaskMasksPerimeterValuereal/_(PaintBasedCorrectionsCorrectionMasksMasksPerimeterValue)
PaintCorrectionMaskMasksRadiusreal/_(PaintBasedCorrectionsCorrectionMasksMasksRadius)
PaintCorrectionMaskMasksReferencePointstring/_(PaintBasedCorrectionsCorrectionMasksMasksReferencePoint)
PaintCorrectionMaskMasksRightreal/_(PaintBasedCorrectionsCorrectionMasksMasksRight)
PaintCorrectionMaskMasksRoundnessreal/_(PaintBasedCorrectionsCorrectionMasksMasksRoundness)
PaintCorrectionMaskMasksSizeXreal/_(PaintBasedCorrectionsCorrectionMasksMasksSizeX)
PaintCorrectionMaskMasksSizeYreal/_(PaintBasedCorrectionsCorrectionMasksMasksSizeY)
PaintCorrectionMaskMasksTopreal/_(PaintBasedCorrectionsCorrectionMasksMasksTop)
PaintCorrectionMaskMaskSubTypestring/_(PaintBasedCorrectionsCorrectionMasksMaskSubType)
PaintCorrectionMaskMasksVersioninteger/_(PaintBasedCorrectionsCorrectionMasksMasksVersion)
PaintCorrectionMaskMasksWhatstring/_(PaintBasedCorrectionsCorrectionMasksMasksWhat)
PaintCorrectionMaskMasksWholeImageAreastring/_(PaintBasedCorrectionsCorrectionMasksMasksWholeImageArea)
PaintCorrectionMaskMasksXreal/_(PaintBasedCorrectionsCorrectionMasksMasksX)
PaintCorrectionMaskMasksYreal/_(PaintBasedCorrectionsCorrectionMasksMasksY)
PaintCorrectionMaskMaskSyncIDstring/_(PaintBasedCorrectionsCorrectionMasksMaskSyncID)
PaintCorrectionMaskMasksZeroXreal/_(PaintBasedCorrectionsCorrectionMasksMasksZeroX)
PaintCorrectionMaskMasksZeroYreal/_(PaintBasedCorrectionsCorrectionMasksMasksZeroY)
PaintCorrectionMaskValuereal/_(PaintBasedCorrectionsCorrectionMasksMaskValue)
PaintCorrectionMaskMaskVersionstring/_(PaintBasedCorrectionsCorrectionMasksMaskVersion)
PaintCorrectionMaskMidpointreal/_(PaintBasedCorrectionsCorrectionMasksMidpoint)
PaintCorrectionMaskOriginstring/_(PaintBasedCorrectionsCorrectionMasksOrigin)
PaintCorrectionMaskPerimeterValuereal/_(PaintBasedCorrectionsCorrectionMasksPerimeterValue)
PaintCorrectionMaskRadiusreal/_(PaintBasedCorrectionsCorrectionMasksRadius)
PaintCorrectionMaskReferencePointstring/_(PaintBasedCorrectionsCorrectionMasksReferencePoint)
PaintCorrectionMaskRightreal/_(PaintBasedCorrectionsCorrectionMasksRight)
PaintCorrectionMaskRoundnessreal/_(PaintBasedCorrectionsCorrectionMasksRoundness)
PaintCorrectionMaskSizeXreal/_(PaintBasedCorrectionsCorrectionMasksSizeX)
PaintCorrectionMaskSizeYreal/_(PaintBasedCorrectionsCorrectionMasksSizeY)
PaintCorrectionMaskTopreal/_(PaintBasedCorrectionsCorrectionMasksTop)
PaintCorrectionMaskVersioninteger/_(PaintBasedCorrectionsCorrectionMasksVersion)
PaintCorrectionMaskWhatstring/_(PaintBasedCorrectionsCorrectionMasksWhat)
PaintCorrectionMaskWholeImageAreastring/_(PaintBasedCorrectionsCorrectionMasksWholeImageArea)
PaintCorrectionMaskXreal/_(PaintBasedCorrectionsCorrectionMasksX)
PaintCorrectionMaskYreal/_(PaintBasedCorrectionsCorrectionMasksY)
PaintCorrectionMaskZeroXreal/_(PaintBasedCorrectionsCorrectionMasksZeroX)
PaintCorrectionMaskZeroYreal/_(PaintBasedCorrectionsCorrectionMasksZeroY)
PaintCorrectionCorrectionNamestring/_+(PaintBasedCorrectionsCorrectionName)
PaintCorrectionRangeMaskstruct_+--> CorrRangeMask Struct +
(PaintBasedCorrectionsCorrectionRangeMask; called CorrectionRangeMask by the spec)
PaintCorrectionRangeMaskAreaModelsstruct_+--> AreaModels Struct +
(PaintBasedCorrectionsCorrectionRangeMaskAreaModels)
PaintCorrectionRangeMaskAreaModelsComponentsstring/_+(PaintBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents)
PaintCorrectionRangeMaskAreaModelsColorSampleInfostring/_+(PaintBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
PaintCorrectionRangeMaskColorAmountreal/_+(PaintBasedCorrectionsCorrectionRangeMaskColorAmount)
PaintCorrectionRangeMaskDepthFeatherreal/_+(PaintBasedCorrectionsCorrectionRangeMaskDepthFeather)
PaintCorrectionRangeMaskDepthMaxreal/_+(PaintBasedCorrectionsCorrectionRangeMaskDepthMax)
PaintCorrectionRangeMaskDepthMinreal/_+(PaintBasedCorrectionsCorrectionRangeMaskDepthMin)
PaintCorrectionRangeMaskInvertboolean/_+(PaintBasedCorrectionsCorrectionRangeMaskInvert)
PaintCorrectionRangeMaskLumFeatherreal/_+(PaintBasedCorrectionsCorrectionRangeMaskLumFeather)
PaintCorrectionRangeMaskLuminanceDepthSampleInfostring/_+(PaintBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo)
PaintCorrectionRangeMaskLumMaxreal/_+(PaintBasedCorrectionsCorrectionRangeMaskLumMax)
PaintCorrectionRangeMaskLumMinreal/_+(PaintBasedCorrectionsCorrectionRangeMaskLumMin)
PaintCorrectionRangeMaskLumRangestring/_+(PaintBasedCorrectionsCorrectionRangeMaskLumRange)
PaintCorrectionRangeMaskSampleTypeinteger/_+(PaintBasedCorrectionsCorrectionRangeMaskSampleType)
PaintCorrectionRangeMaskTypestring/_+(PaintBasedCorrectionsCorrectionRangeMaskType)
PaintCorrectionRangeMaskVersionstring/_+(PaintBasedCorrectionsCorrectionRangeMaskVersion)
PaintCorrectionCorrectionSyncIDstring/_+(PaintBasedCorrectionsCorrectionSyncID)
PaintCorrectionBlacks2012real/_(PaintBasedCorrectionsLocalBlacks2012)
PaintCorrectionBrightnessreal/_(PaintBasedCorrectionsLocalBrightness)
PaintCorrectionClarityreal/_(PaintBasedCorrectionsLocalClarity)
PaintCorrectionClarity2012real/_(PaintBasedCorrectionsLocalClarity2012)
PaintCorrectionContrastreal/_(PaintBasedCorrectionsLocalContrast)
PaintCorrectionContrast2012real/_(PaintBasedCorrectionsLocalContrast2012)
PaintCorrectionDefringereal/_(PaintBasedCorrectionsLocalDefringe)
PaintCorrectionDehazereal/_(PaintBasedCorrectionsLocalDehaze)
PaintCorrectionExposurereal/_(PaintBasedCorrectionsLocalExposure)
PaintCorrectionExposure2012real/_(PaintBasedCorrectionsLocalExposure2012)
PaintCorrectionHighlights2012real/_(PaintBasedCorrectionsLocalHighlights2012)
PaintCorrectionHuereal/_(PaintBasedCorrectionsLocalHue)
PaintCorrectionLuminanceNoisereal/_(PaintBasedCorrectionsLocalLuminanceNoise)
PaintCorrectionMoirereal/_(PaintBasedCorrectionsLocalMoire)
PaintCorrectionSaturationreal/_(PaintBasedCorrectionsLocalSaturation)
PaintCorrectionShadows2012real/_(PaintBasedCorrectionsLocalShadows2012)
PaintCorrectionSharpnessreal/_(PaintBasedCorrectionsLocalSharpness)
PaintCorrectionTemperaturereal/_(PaintBasedCorrectionsLocalTemperature)
PaintCorrectionTexturereal/_(PaintBasedCorrectionsLocalTexture)
PaintCorrectionTintreal/_(PaintBasedCorrectionsLocalTint)
PaintCorrectionToningHuereal/_(PaintBasedCorrectionsLocalToningHue)
PaintCorrectionToningSaturationreal/_(PaintBasedCorrectionsLocalToningSaturation)
PaintCorrectionWhites2012real/_(PaintBasedCorrectionsLocalWhites2012)
PaintCorrectionWhatstring/_(PaintBasedCorrectionsWhat)
ParametricDarksinteger/ 
ParametricHighlightsinteger/ 
ParametricHighlightSplitinteger/ 
ParametricLightsinteger/ 
ParametricMidtoneSplitinteger/ 
ParametricShadowsinteger/ 
ParametricShadowSplitinteger/ 
PerspectiveAspectinteger/ 
PerspectiveHorizontalinteger/ 
PerspectiveRotatereal/ 
PerspectiveScaleinteger/ 
PerspectiveUprightinteger/ 
PerspectiveVerticalinteger/ 
PerspectiveXreal/ 
PerspectiveYreal/ 
PostCropVignetteAmountinteger/ 
PostCropVignetteFeatherinteger/ 
PostCropVignetteHighlightContrastinteger/ 
PostCropVignetteMidpointinteger/ 
PostCropVignetteRoundnessinteger/ 
PostCropVignetteStyleinteger/ 
PresetTypestring/ 
ProcessVersionstring/ 
RangeMaskstruct--> RangeMask Struct +
(called RangeMaskMapInfo by the spec)
RangeMaskMapInfostruct_--> MapInfo Struct +
(RangeMaskMapInfoRangeMaskMapInfo)
RangeMaskMapInfoLabMaxstring/_(RangeMaskMapInfoRangeMaskMapInfoLabMax)
RangeMaskMapInfoLabMinstring/_(RangeMaskMapInfoRangeMaskMapInfoLabMin)
RangeMaskMapInfoLumEqstring/_+(RangeMaskMapInfoRangeMaskMapInfoLumEq)
RangeMaskMapInfoRGBMaxstring/_(RangeMaskMapInfoRangeMaskMapInfoRGBMax)
RangeMaskMapInfoRGBMinstring/_(RangeMaskMapInfoRangeMaskMapInfoRGBMin)
RawFileNamestring/ 
RedEyeInfostring/+ 
RedHueinteger/ 
RedSaturationinteger/ 
RetouchAreasstruct+--> RetouchArea Struct
RetouchAreaFeatherreal/_(RetouchAreasFeather)
RetouchAreaMasksstruct_+--> CorrectionMask Struct +
(RetouchAreasMasks)
RetouchAreaMaskAlphareal/_(RetouchAreasMasksAlpha)
RetouchAreaMaskAnglereal/_(RetouchAreasMasksAngle)
RetouchAreaMaskBottomreal/_(RetouchAreasMasksBottom)
RetouchAreaMaskCenterValuereal/_(RetouchAreasMasksCenterValue)
RetouchAreaMaskCenterWeightreal/_(RetouchAreasMasksCenterWeight)
RetouchAreaMaskRangestruct_+--> CorrRangeMask Struct +
(RetouchAreasMasksCorrectionRangeMask; called CorrectionRangeMask by the spec)
RetouchAreaMaskRangeAreaModelsstruct_+--> AreaModels Struct +
(RetouchAreasMasksCorrectionRangeMaskAreaModels)
RetouchAreaMaskRangeAreaModelsComponentsstring/_+(RetouchAreasMasksCorrectionRangeMaskAreaModelsAreaComponents)
RetouchAreaMaskRangeAreaModelsColorSampleInfostring/_+(RetouchAreasMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
RetouchAreaMaskRangeColorAmountreal/_+(RetouchAreasMasksCorrectionRangeMaskColorAmount)
RetouchAreaMaskRangeDepthFeatherreal/_+(RetouchAreasMasksCorrectionRangeMaskDepthFeather)
RetouchAreaMaskRangeDepthMaxreal/_+(RetouchAreasMasksCorrectionRangeMaskDepthMax)
RetouchAreaMaskRangeDepthMinreal/_+(RetouchAreasMasksCorrectionRangeMaskDepthMin)
RetouchAreaMaskRangeInvertboolean/_+(RetouchAreasMasksCorrectionRangeMaskInvert)
RetouchAreaMaskRangeLumFeatherreal/_+(RetouchAreasMasksCorrectionRangeMaskLumFeather)
RetouchAreaMaskRangeLuminanceDepthSampleInfostring/_+(RetouchAreasMasksCorrectionRangeMaskLuminanceDepthSampleInfo)
RetouchAreaMaskRangeLumMaxreal/_+(RetouchAreasMasksCorrectionRangeMaskLumMax)
RetouchAreaMaskRangeLumMinreal/_+(RetouchAreasMasksCorrectionRangeMaskLumMin)
RetouchAreaMaskRangeLumRangestring/_+(RetouchAreasMasksCorrectionRangeMaskLumRange)
RetouchAreaMaskRangeSampleTypeinteger/_+(RetouchAreasMasksCorrectionRangeMaskSampleType)
RetouchAreaMaskRangeTypestring/_+(RetouchAreasMasksCorrectionRangeMaskType)
RetouchAreaMaskRangeVersionstring/_+(RetouchAreasMasksCorrectionRangeMaskVersion)
RetouchAreaMaskDabsstring/_(RetouchAreasMasksDabs)
RetouchAreaMaskFeatherreal/_(RetouchAreasMasksFeather)
RetouchAreaMaskFlippedboolean/_(RetouchAreasMasksFlipped)
RetouchAreaMaskFlowreal/_(RetouchAreasMasksFlow)
RetouchAreaMaskFullXreal/_(RetouchAreasMasksFullX)
RetouchAreaMaskFullYreal/_(RetouchAreasMasksFullY)
RetouchAreaMaskInputDigeststring/_(RetouchAreasMasksInputDigest)
RetouchAreaMaskLeftreal/_(RetouchAreasMasksLeft)
RetouchAreaMaskMaskActiveboolean/_(RetouchAreasMasksMaskActive)
RetouchAreaMaskMaskBlendModeinteger/_(RetouchAreasMasksMaskBlendMode)
RetouchAreaMaskMaskDigeststring/_(RetouchAreasMasksMaskDigest)
RetouchAreaMaskMaskInvertedboolean/_(RetouchAreasMasksMaskInverted)
RetouchAreaMaskMaskNamestring/_(RetouchAreasMasksMaskName)
RetouchAreaMaskMasksstruct_+--> CorrectionMask Struct +
(RetouchAreasMasksMasks)
RetouchAreaMaskMasksAlphareal/_(RetouchAreasMasksMasksAlpha)
RetouchAreaMaskMasksAnglereal/_(RetouchAreasMasksMasksAngle)
RetouchAreaMaskMasksBottomreal/_(RetouchAreasMasksMasksBottom)
RetouchAreaMaskMasksCenterValuereal/_(RetouchAreasMasksMasksCenterValue)
RetouchAreaMaskMasksCenterWeightreal/_(RetouchAreasMasksMasksCenterWeight)
RetouchAreaMaskMasksDabsstring/_+(RetouchAreasMasksMasksDabs)
RetouchAreaMaskMasksFeatherreal/_(RetouchAreasMasksMasksFeather)
RetouchAreaMaskMasksFlippedboolean/_(RetouchAreasMasksMasksFlipped)
RetouchAreaMaskMasksFlowreal/_(RetouchAreasMasksMasksFlow)
RetouchAreaMaskMasksFullXreal/_(RetouchAreasMasksMasksFullX)
RetouchAreaMaskMasksFullYreal/_(RetouchAreasMasksMasksFullY)
RetouchAreaMaskMasksInputDigeststring/_(RetouchAreasMasksMasksInputDigest)
RetouchAreaMaskMasksLeftreal/_(RetouchAreasMasksMasksLeft)
RetouchAreaMaskMasksMaskActiveboolean/_(RetouchAreasMasksMasksMaskActive)
RetouchAreaMaskMasksMaskBlendModeinteger/_(RetouchAreasMasksMasksMaskBlendMode)
RetouchAreaMaskMasksMaskDigeststring/_(RetouchAreasMasksMasksMaskDigest)
RetouchAreaMaskMasksMaskInvertedboolean/_(RetouchAreasMasksMasksMaskInverted)
RetouchAreaMaskMasksMaskNamestring/_(RetouchAreasMasksMasksMaskName)
RetouchAreaMaskMasksMaskSubTypestring/_(RetouchAreasMasksMasksMaskSubType)
RetouchAreaMaskMasksMaskSyncIDstring/_(RetouchAreasMasksMasksMaskSyncID)
RetouchAreaMaskMasksValuereal/_(RetouchAreasMasksMasksMaskValue)
RetouchAreaMaskMasksMaskVersionstring/_(RetouchAreasMasksMasksMaskVersion)
RetouchAreaMaskMasksMidpointreal/_(RetouchAreasMasksMasksMidpoint)
RetouchAreaMaskMasksOriginstring/_(RetouchAreasMasksMasksOrigin)
RetouchAreaMaskMasksPerimeterValuereal/_(RetouchAreasMasksMasksPerimeterValue)
RetouchAreaMaskMasksRadiusreal/_(RetouchAreasMasksMasksRadius)
RetouchAreaMaskMasksReferencePointstring/_(RetouchAreasMasksMasksReferencePoint)
RetouchAreaMaskMasksRightreal/_(RetouchAreasMasksMasksRight)
RetouchAreaMaskMasksRoundnessreal/_(RetouchAreasMasksMasksRoundness)
RetouchAreaMaskMasksSizeXreal/_(RetouchAreasMasksMasksSizeX)
RetouchAreaMaskMasksSizeYreal/_(RetouchAreasMasksMasksSizeY)
RetouchAreaMaskMasksTopreal/_(RetouchAreasMasksMasksTop)
RetouchAreaMaskMaskSubTypestring/_(RetouchAreasMasksMaskSubType)
RetouchAreaMaskMasksVersioninteger/_(RetouchAreasMasksMasksVersion)
RetouchAreaMaskMasksWhatstring/_(RetouchAreasMasksMasksWhat)
RetouchAreaMaskMasksWholeImageAreastring/_(RetouchAreasMasksMasksWholeImageArea)
RetouchAreaMaskMasksXreal/_(RetouchAreasMasksMasksX)
RetouchAreaMaskMasksYreal/_(RetouchAreasMasksMasksY)
RetouchAreaMaskMaskSyncIDstring/_(RetouchAreasMasksMaskSyncID)
RetouchAreaMaskMasksZeroXreal/_(RetouchAreasMasksMasksZeroX)
RetouchAreaMaskMasksZeroYreal/_(RetouchAreasMasksMasksZeroY)
RetouchAreaMaskValuereal/_(RetouchAreasMasksMaskValue)
RetouchAreaMaskMaskVersionstring/_(RetouchAreasMasksMaskVersion)
RetouchAreaMaskMidpointreal/_(RetouchAreasMasksMidpoint)
RetouchAreaMaskOriginstring/_(RetouchAreasMasksOrigin)
RetouchAreaMaskPerimeterValuereal/_(RetouchAreasMasksPerimeterValue)
RetouchAreaMaskRadiusreal/_(RetouchAreasMasksRadius)
RetouchAreaMaskReferencePointstring/_(RetouchAreasMasksReferencePoint)
RetouchAreaMaskRightreal/_(RetouchAreasMasksRight)
RetouchAreaMaskRoundnessreal/_(RetouchAreasMasksRoundness)
RetouchAreaMaskSizeXreal/_(RetouchAreasMasksSizeX)
RetouchAreaMaskSizeYreal/_(RetouchAreasMasksSizeY)
RetouchAreaMaskTopreal/_(RetouchAreasMasksTop)
RetouchAreaMaskVersioninteger/_(RetouchAreasMasksVersion)
RetouchAreaMaskWhatstring/_(RetouchAreasMasksWhat)
RetouchAreaMaskWholeImageAreastring/_(RetouchAreasMasksWholeImageArea)
RetouchAreaMaskXreal/_(RetouchAreasMasksX)
RetouchAreaMaskYreal/_(RetouchAreasMasksY)
RetouchAreaMaskZeroXreal/_(RetouchAreasMasksZeroX)
RetouchAreaMaskZeroYreal/_(RetouchAreasMasksZeroY)
RetouchAreaMethodstring/_(RetouchAreasMethod)
RetouchAreaOffsetYreal/_(RetouchAreasOffsetY)
RetouchAreaOpacityreal/_(RetouchAreasOpacity)
RetouchAreaSeedinteger/_(RetouchAreasSeed)
RetouchAreaSourceStatestring/_(RetouchAreasSourceState)
RetouchAreaSourceXreal/_(RetouchAreasSourceX)
RetouchAreaSpotTypestring/_(RetouchAreasSpotType)
RetouchInfostring/+ 
Saturationinteger/ 
SaturationAdjustmentAquainteger/ 
SaturationAdjustmentBlueinteger/ 
SaturationAdjustmentGreeninteger/ 
SaturationAdjustmentMagentainteger/ 
SaturationAdjustmentOrangeinteger/ 
SaturationAdjustmentPurpleinteger/ 
SaturationAdjustmentRedinteger/ 
SaturationAdjustmentYellowinteger/ 
Shadowsinteger/ 
Shadows2012integer/ 
ShadowTintinteger/ 
SharpenDetailinteger/ 
SharpenEdgeMaskinginteger/ 
SharpenRadiusreal/ 
Sharpnessinteger/ 
ShortNamelang-alt/ 
Smoothnessinteger/ 
SortNamelang-alt/ 
SplitToningBalanceinteger/(also used for newer ColorGrade settings)
SplitToningHighlightHueinteger/(also used for newer ColorGrade settings)
SplitToningHighlightSaturationinteger/(also used for newer ColorGrade settings)
SplitToningShadowHueinteger/(also used for newer ColorGrade settings)
SplitToningShadowSaturationinteger/(also used for newer ColorGrade settings)
SupportsAmountboolean/ 
SupportsColorboolean/ 
SupportsHighDynamicRangeboolean/ 
SupportsMonochromeboolean/ 
SupportsNormalDynamicRangeboolean/ 
SupportsOutputReferredboolean/ 
SupportsSceneReferredboolean/ 
ColorTemperatureinteger/(called Temperature by the spec)
Textureinteger/ 
TIFFHandlingstring/ 
Tintinteger/ 
ToggleStyleAmountinteger/ 
ToggleStyleDigeststring/ 
ToneCurvestring/+ 
ToneCurveBluestring/+ 
ToneCurveGreenstring/+ 
ToneCurveNamestring/'Custom' = Custom +
'Linear' = Linear +
'Medium Contrast' = Medium Contrast +
'Strong Contrast' = Strong Contrast
ToneCurveName2012string/ 
ToneCurvePV2012string/+ 
ToneCurvePV2012Bluestring/+ 
ToneCurvePV2012Greenstring/+ 
ToneCurvePV2012Redstring/+ 
ToneCurveRedstring/+ 
ToneMapStrengthreal/ 
UprightCenterModeinteger/ 
UprightCenterNormXreal/ 
UprightCenterNormYreal/ 
UprightDependentDigeststring/ 
UprightFocalLength35mmreal/ 
UprightFocalModeinteger/ 
UprightFourSegmentsCountinteger/ 
UprightPreviewboolean/ 
UprightTransform_0string/ 
UprightTransform_1string/ 
UprightTransform_2string/ 
UprightTransform_3string/ 
UprightTransform_4string/ 
UprightTransform_5string/ 
UprightTransformCountinteger/ 
UprightVersioninteger/ 
UUIDstring/ 
Versionstring/ 
Vibranceinteger/ 
VignetteAmountinteger/ 
VignetteMidpointinteger/ 
Whatstring/ 
WhiteBalancestring/ +
'As Shot' = As Shot +
'Auto' = Auto +
'Cloudy' = Cloudy +
'Custom' = Custom +
'Daylight' = Daylight +
'Flash' = Flash +
'Fluorescent' = Fluorescent +
'Shade' = Shade +
'Tungsten' = Tungsten
+
Whites2012integer/ 
+ +

XMP Correction Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
CorrectionActiveboolean 
CorrectionAmountreal 
CorrectionMasksCorrectionMask+--> CorrectionMask Struct
CorrectionNamestring 
CorrRangeMaskCorrRangeMask(called CorrectionRangeMask by the spec) +
--> CorrRangeMask Struct
CorrectionSyncIDstring 
LocalBlacks2012real 
LocalBrightnessreal 
LocalClarityreal 
LocalClarity2012real 
LocalContrastreal 
LocalContrast2012real 
LocalDefringereal 
LocalDehazereal 
LocalExposurereal 
LocalExposure2012real 
LocalHighlights2012real 
LocalHuereal 
LocalLuminanceNoisereal 
LocalMoirereal 
LocalSaturationreal 
LocalShadows2012real 
LocalSharpnessreal 
LocalTemperaturereal 
LocalTexturereal 
LocalTintreal 
LocalToningHuereal 
LocalToningSaturationreal 
LocalWhites2012real 
Whatstring 
+ +

XMP CorrectionMask Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Alphareal 
Anglereal 
Bottomreal 
CenterValuereal 
CenterWeightreal 
CorrRangeMaskCorrRangeMask(called CorrectionRangeMask by the spec) +
--> CorrRangeMask Struct
Dabsstring+ 
Featherreal 
Flippedboolean 
Flowreal 
FullXreal 
FullYreal 
InputDigeststring 
Leftreal 
MaskActiveboolean 
MaskBlendModeinteger 
MaskDigeststring 
MaskInvertedboolean 
MaskNamestring 
MaskSubTypestring 
MaskSyncIDstring 
MaskValuereal 
MaskVersionstring 
MasksCorrectionMask--> CorrectionMask Struct
Midpointreal 
Originstring 
PerimeterValuereal 
Radiusreal 
ReferencePointstring 
Rightreal 
Roundnessreal 
SizeXreal 
SizeYreal 
Topreal 
Versioninteger 
Whatstring 
WholeImageAreastring 
Xreal 
Yreal 
ZeroXreal 
ZeroYreal 
+ +

XMP CorrRangeMask Struct

+

Called CorrectionRangeMask by the spec.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
AreaModelsAreaModels+--> AreaModels Struct
ColorAmountreal 
DepthFeatherreal 
DepthMaxreal 
DepthMinreal 
Invertboolean 
LumFeatherreal 
LumMaxreal 
LumMinreal 
LumRangestring 
LuminanceDepthSampleInfostring 
SampleTypeinteger 
Typestring 
Versionstring 
+ +

XMP AreaModels Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
AreaComponentsstring+ 
ColorRangeMaskAreaSampleInfostring 
+ +

XMP Look Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Amountstring 
Clusterstring 
Copyrightstring 
Grouplang-alt 
Namestring 
ParametersLookParms--> LookParms Struct
SupportsAmountstring 
SupportsMonochromestring 
SupportsOutputReferredstring 
UUIDstring 
+ +

XMP LookParms Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
CameraProfilestring 
Clarity2012string 
ConvertToGrayscalestring 
LookTablestring 
ProcessVersionstring 
ToneCurvePV2012string+ 
ToneCurvePV2012Bluestring+ 
ToneCurvePV2012Greenstring+ 
ToneCurvePV2012Redstring+ 
Versionstring 
+ +

XMP RangeMask Struct

+

This structure is actually called RangeMaskMapInfo, but it only contains one +element which is a RangeMaskMapInfo structure (Yes, really!). So these are +renamed to RangeMask and MapInfo respectively to avoid confusion and +redundancy in the tag names.

+
+
+ + + + + + + +
Field NameWritableValues / Notes
RangeMaskMapInfoMapInfo--> MapInfo Struct
+ +

XMP MapInfo Struct

+

Called RangeMaskMapInfo by the specification, the same as the containing +structure.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
LabMaxstring 
LabMinstring 
LumEqstring+ 
RGBMaxstring 
RGBMinstring 
+ +

XMP RetouchArea Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Featherreal 
MasksCorrectionMask+--> CorrectionMask Struct
Methodstring 
OffsetYreal 
Opacityreal 
Seedinteger 
SourceStatestring 
SourceXreal 
SpotTypestring 
+ +

XMP creatorAtom Tags

+

Adobe creatorAtom tags, written by After Effects.

+ +

These tags belong to the ExifTool XMP-creatorAtom family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AeProjectLinkstruct--> AEProjectLink Struct
AeProjectLinkCompositionIDstring_ 
AeProjectLinkFullPathstring_ 
AeProjectLinkRenderOutputModuleIndexstring_ 
AeProjectLinkRenderQueueItemIDstring_ 
AeProjectLinkRenderTimeStampinteger_ 
MacAtomstruct--> MacAtom Struct
MacAtomApplicationCodestring_ 
MacAtomInvocationAppleEventstring_ 
MacAtomPosixProjectPathstring_ 
WindowsAtomstruct--> WindowsAtom Struct
WindowsAtomExtensionstring_ 
WindowsAtomInvocationFlagsstring_ 
WindowsAtomUncProjectPathstring_ 
+ +

XMP AEProjectLink Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
CompositionIDstring 
FullPathstring 
RenderOutputModuleIndexstring 
RenderQueueItemIDstring 
RenderTimeStampinteger 
+ +

XMP MacAtom Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
ApplicationCodestring 
InvocationAppleEventstring 
PosixProjectPathstring 
+ +

XMP WindowsAtom Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Extensionstring 
InvocationFlagsstring 
UncProjectPathstring 
+ +

XMP crs Tags

+

Photoshop Camera Raw namespace tags. It is a shame that Adobe pollutes the +metadata space with these incredibly bulky image editing parameters.

+ +

These tags belong to the ExifTool XMP-crs family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AlreadyAppliedboolean 
AutoBrightnessboolean 
AutoContrastboolean 
AutoExposureboolean 
AutoLateralCAinteger 
AutoShadowsboolean 
AutoToneboolean 
AutoToneDigeststring 
AutoToneDigestNoSatstring 
AutoWhiteVersioninteger 
Blacks2012integer 
BlueHueinteger 
BlueSaturationinteger 
Brightnessinteger 
CameraModelRestrictionstring 
CameraProfilestring 
CameraProfileDigeststring 
ChromaticAberrationBinteger 
ChromaticAberrationRinteger 
CircularGradientBasedCorrectionsstruct+--> Correction Struct
CircGradBasedCorrActiveboolean_(CircularGradientBasedCorrectionsCorrectionActive)
CircGradBasedCorrAmountreal_(CircularGradientBasedCorrectionsCorrectionAmount)
CircGradBasedCorrMasksstruct_+--> CorrectionMask Struct +
(CircularGradientBasedCorrectionsCorrectionMasks)
CircGradBasedCorrMaskAlphareal_(CircularGradientBasedCorrectionsCorrectionMasksAlpha)
CircGradBasedCorrMaskAnglereal_(CircularGradientBasedCorrectionsCorrectionMasksAngle)
CircGradBasedCorrMaskBottomreal_(CircularGradientBasedCorrectionsCorrectionMasksBottom)
CircGradBasedCorrMaskCenterValuereal_(CircularGradientBasedCorrectionsCorrectionMasksCenterValue)
CircGradBasedCorrMaskCenterWeightreal_(CircularGradientBasedCorrectionsCorrectionMasksCenterWeight)
CircGradBasedCorrMaskRangestruct_+--> CorrRangeMask Struct +
(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMask; called CorrectionRangeMask by the spec)
CircGradBasedCorrMaskRangeAreaModelsstruct_+--> AreaModels Struct +
(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels)
CircGradBasedCorrMaskRangeAreaModelsComponentsstring_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents)
CircGradBasedCorrMaskRangeAreaModelsColorSampleInfostring_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
CircGradBasedCorrMaskRangeColorAmountreal_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount)
CircGradBasedCorrMaskRangeDepthFeatherreal_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather)
CircGradBasedCorrMaskRangeDepthMaxreal_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax)
CircGradBasedCorrMaskRangeDepthMinreal_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin)
CircGradBasedCorrMaskRangeInvertboolean_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert)
CircGradBasedCorrMaskRangeLumFeatherreal_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather)
CircGradBasedCorrMaskRangeLuminanceDepthSampleInfostring_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo)
CircGradBasedCorrMaskRangeLumMaxreal_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax)
CircGradBasedCorrMaskRangeLumMinreal_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin)
CircGradBasedCorrMaskRangeLumRangestring_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange)
CircGradBasedCorrMaskRangeSampleTypeinteger_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType)
CircGradBasedCorrMaskRangeTypestring_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskType)
CircGradBasedCorrMaskRangeVersionstring_+(CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion)
CircGradBasedCorrMaskDabsstring_(CircularGradientBasedCorrectionsCorrectionMasksDabs)
CircGradBasedCorrMaskFeatherreal_(CircularGradientBasedCorrectionsCorrectionMasksFeather)
CircGradBasedCorrMaskFlippedboolean_(CircularGradientBasedCorrectionsCorrectionMasksFlipped)
CircGradBasedCorrMaskFlowreal_(CircularGradientBasedCorrectionsCorrectionMasksFlow)
CircGradBasedCorrMaskFullXreal_(CircularGradientBasedCorrectionsCorrectionMasksFullX)
CircGradBasedCorrMaskFullYreal_(CircularGradientBasedCorrectionsCorrectionMasksFullY)
CircGradBasedCorrMaskInputDigeststring_(CircularGradientBasedCorrectionsCorrectionMasksInputDigest)
CircGradBasedCorrMaskLeftreal_(CircularGradientBasedCorrectionsCorrectionMasksLeft)
CircGradBasedCorrMaskMaskActiveboolean_(CircularGradientBasedCorrectionsCorrectionMasksMaskActive)
CircGradBasedCorrMaskMaskBlendModeinteger_(CircularGradientBasedCorrectionsCorrectionMasksMaskBlendMode)
CircGradBasedCorrMaskMaskDigeststring_(CircularGradientBasedCorrectionsCorrectionMasksMaskDigest)
CircGradBasedCorrMaskMaskInvertedboolean_(CircularGradientBasedCorrectionsCorrectionMasksMaskInverted)
CircGradBasedCorrMaskMaskNamestring_(CircularGradientBasedCorrectionsCorrectionMasksMaskName)
CircGradBasedCorrMaskMasksstruct_+--> CorrectionMask Struct +
(CircularGradientBasedCorrectionsCorrectionMasksMasks)
CircGradBasedCorrMaskMasksAlphareal_(CircularGradientBasedCorrectionsCorrectionMasksMasksAlpha)
CircGradBasedCorrMaskMasksAnglereal_(CircularGradientBasedCorrectionsCorrectionMasksMasksAngle)
CircGradBasedCorrMaskMasksBottomreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksBottom)
CircGradBasedCorrMaskMasksCenterValuereal_(CircularGradientBasedCorrectionsCorrectionMasksMasksCenterValue)
CircGradBasedCorrMaskMasksCenterWeightreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksCenterWeight)
CircGradBasedCorrMaskMasksDabsstring_+(CircularGradientBasedCorrectionsCorrectionMasksMasksDabs)
CircGradBasedCorrMaskMasksFeatherreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksFeather)
CircGradBasedCorrMaskMasksFlippedboolean_(CircularGradientBasedCorrectionsCorrectionMasksMasksFlipped)
CircGradBasedCorrMaskMasksFlowreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksFlow)
CircGradBasedCorrMaskMasksFullXreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksFullX)
CircGradBasedCorrMaskMasksFullYreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksFullY)
CircGradBasedCorrMaskMasksInputDigeststring_(CircularGradientBasedCorrectionsCorrectionMasksMasksInputDigest)
CircGradBasedCorrMaskMasksLeftreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksLeft)
CircGradBasedCorrMaskMasksMaskActiveboolean_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskActive)
CircGradBasedCorrMaskMasksMaskBlendModeinteger_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskBlendMode)
CircGradBasedCorrMaskMasksMaskDigeststring_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskDigest)
CircGradBasedCorrMaskMasksMaskInvertedboolean_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskInverted)
CircGradBasedCorrMaskMasksMaskNamestring_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskName)
CircGradBasedCorrMaskMasksMaskSubTypestring_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskSubType)
CircGradBasedCorrMaskMasksMaskSyncIDstring_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskSyncID)
CircGradBasedCorrMaskMasksValuereal_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskValue)
CircGradBasedCorrMaskMasksMaskVersionstring_(CircularGradientBasedCorrectionsCorrectionMasksMasksMaskVersion)
CircGradBasedCorrMaskMasksMidpointreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksMidpoint)
CircGradBasedCorrMaskMasksOriginstring_(CircularGradientBasedCorrectionsCorrectionMasksMasksOrigin)
CircGradBasedCorrMaskMasksPerimeterValuereal_(CircularGradientBasedCorrectionsCorrectionMasksMasksPerimeterValue)
CircGradBasedCorrMaskMasksRadiusreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksRadius)
CircGradBasedCorrMaskMasksReferencePointstring_(CircularGradientBasedCorrectionsCorrectionMasksMasksReferencePoint)
CircGradBasedCorrMaskMasksRightreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksRight)
CircGradBasedCorrMaskMasksRoundnessreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksRoundness)
CircGradBasedCorrMaskMasksSizeXreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksSizeX)
CircGradBasedCorrMaskMasksSizeYreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksSizeY)
CircGradBasedCorrMaskMasksTopreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksTop)
CircGradBasedCorrMaskMaskSubTypestring_(CircularGradientBasedCorrectionsCorrectionMasksMaskSubType)
CircGradBasedCorrMaskMasksVersioninteger_(CircularGradientBasedCorrectionsCorrectionMasksMasksVersion)
CircGradBasedCorrMaskMasksWhatstring_(CircularGradientBasedCorrectionsCorrectionMasksMasksWhat)
CircGradBasedCorrMaskMasksWholeImageAreastring_(CircularGradientBasedCorrectionsCorrectionMasksMasksWholeImageArea)
CircGradBasedCorrMaskMasksXreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksX)
CircGradBasedCorrMaskMasksYreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksY)
CircGradBasedCorrMaskMaskSyncIDstring_(CircularGradientBasedCorrectionsCorrectionMasksMaskSyncID)
CircGradBasedCorrMaskMasksZeroXreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksZeroX)
CircGradBasedCorrMaskMasksZeroYreal_(CircularGradientBasedCorrectionsCorrectionMasksMasksZeroY)
CircGradBasedCorrMaskValuereal_(CircularGradientBasedCorrectionsCorrectionMasksMaskValue)
CircGradBasedCorrMaskMaskVersionstring_(CircularGradientBasedCorrectionsCorrectionMasksMaskVersion)
CircGradBasedCorrMaskMidpointreal_(CircularGradientBasedCorrectionsCorrectionMasksMidpoint)
CircGradBasedCorrMaskOriginstring_(CircularGradientBasedCorrectionsCorrectionMasksOrigin)
CircGradBasedCorrMaskPerimeterValuereal_(CircularGradientBasedCorrectionsCorrectionMasksPerimeterValue)
CircGradBasedCorrMaskRadiusreal_(CircularGradientBasedCorrectionsCorrectionMasksRadius)
CircGradBasedCorrMaskReferencePointstring_(CircularGradientBasedCorrectionsCorrectionMasksReferencePoint)
CircGradBasedCorrMaskRightreal_(CircularGradientBasedCorrectionsCorrectionMasksRight)
CircGradBasedCorrMaskRoundnessreal_(CircularGradientBasedCorrectionsCorrectionMasksRoundness)
CircGradBasedCorrMaskSizeXreal_(CircularGradientBasedCorrectionsCorrectionMasksSizeX)
CircGradBasedCorrMaskSizeYreal_(CircularGradientBasedCorrectionsCorrectionMasksSizeY)
CircGradBasedCorrMaskTopreal_(CircularGradientBasedCorrectionsCorrectionMasksTop)
CircGradBasedCorrMaskVersioninteger_(CircularGradientBasedCorrectionsCorrectionMasksVersion)
CircGradBasedCorrMaskWhatstring_(CircularGradientBasedCorrectionsCorrectionMasksWhat)
CircGradBasedCorrMaskWholeImageAreastring_(CircularGradientBasedCorrectionsCorrectionMasksWholeImageArea)
CircGradBasedCorrMaskXreal_(CircularGradientBasedCorrectionsCorrectionMasksX)
CircGradBasedCorrMaskYreal_(CircularGradientBasedCorrectionsCorrectionMasksY)
CircGradBasedCorrMaskZeroXreal_(CircularGradientBasedCorrectionsCorrectionMasksZeroX)
CircGradBasedCorrMaskZeroYreal_(CircularGradientBasedCorrectionsCorrectionMasksZeroY)
CircGradBasedCorrCorrectionNamestring_+(CircularGradientBasedCorrectionsCorrectionName)
CircGradBasedCorrRangeMaskstruct_+--> CorrRangeMask Struct +
(CircularGradientBasedCorrectionsCorrectionRangeMask; called CorrectionRangeMask by the spec)
CircGradBasedCorrRangeMaskAreaModelsstruct_+--> AreaModels Struct +
(CircularGradientBasedCorrectionsCorrectionRangeMaskAreaModels)
CircGradBasedCorrRangeMaskAreaModelsComponentsstring_+(CircularGradientBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents)
CircGradBasedCorrRangeMaskAreaModelsColorSampleInfostring_+(CircularGradientBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
CircGradBasedCorrRangeMaskColorAmountreal_+(CircularGradientBasedCorrectionsCorrectionRangeMaskColorAmount)
CircGradBasedCorrRangeMaskDepthFeatherreal_+(CircularGradientBasedCorrectionsCorrectionRangeMaskDepthFeather)
CircGradBasedCorrRangeMaskDepthMaxreal_+(CircularGradientBasedCorrectionsCorrectionRangeMaskDepthMax)
CircGradBasedCorrRangeMaskDepthMinreal_+(CircularGradientBasedCorrectionsCorrectionRangeMaskDepthMin)
CircGradBasedCorrRangeMaskInvertboolean_+(CircularGradientBasedCorrectionsCorrectionRangeMaskInvert)
CircGradBasedCorrRangeMaskLumFeatherreal_+(CircularGradientBasedCorrectionsCorrectionRangeMaskLumFeather)
CircGradBasedCorrRangeMaskLuminanceDepthSampleInfostring_+(CircularGradientBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo)
CircGradBasedCorrRangeMaskLumMaxreal_+(CircularGradientBasedCorrectionsCorrectionRangeMaskLumMax)
CircGradBasedCorrRangeMaskLumMinreal_+(CircularGradientBasedCorrectionsCorrectionRangeMaskLumMin)
CircGradBasedCorrRangeMaskLumRangestring_+(CircularGradientBasedCorrectionsCorrectionRangeMaskLumRange)
CircGradBasedCorrRangeMaskSampleTypeinteger_+(CircularGradientBasedCorrectionsCorrectionRangeMaskSampleType)
CircGradBasedCorrRangeMaskTypestring_+(CircularGradientBasedCorrectionsCorrectionRangeMaskType)
CircGradBasedCorrRangeMaskVersionstring_+(CircularGradientBasedCorrectionsCorrectionRangeMaskVersion)
CircGradBasedCorrCorrectionSyncIDstring_+(CircularGradientBasedCorrectionsCorrectionSyncID)
CircGradBasedCorrBlacks2012real_(CircularGradientBasedCorrectionsLocalBlacks2012)
CircGradBasedCorrBrightnessreal_(CircularGradientBasedCorrectionsLocalBrightness)
CircGradBasedCorrClarityreal_(CircularGradientBasedCorrectionsLocalClarity)
CircGradBasedCorrClarity2012real_(CircularGradientBasedCorrectionsLocalClarity2012)
CircGradBasedCorrContrastreal_(CircularGradientBasedCorrectionsLocalContrast)
CircGradBasedCorrContrast2012real_(CircularGradientBasedCorrectionsLocalContrast2012)
CircGradBasedCorrDefringereal_(CircularGradientBasedCorrectionsLocalDefringe)
CircGradBasedCorrDehazereal_(CircularGradientBasedCorrectionsLocalDehaze)
CircGradBasedCorrExposurereal_(CircularGradientBasedCorrectionsLocalExposure)
CircGradBasedCorrExposure2012real_(CircularGradientBasedCorrectionsLocalExposure2012)
CircGradBasedCorrHighlights2012real_(CircularGradientBasedCorrectionsLocalHighlights2012)
CircGradBasedCorrHuereal_(CircularGradientBasedCorrectionsLocalHue)
CircGradBasedCorrLuminanceNoisereal_(CircularGradientBasedCorrectionsLocalLuminanceNoise)
CircGradBasedCorrMoirereal_(CircularGradientBasedCorrectionsLocalMoire)
CircGradBasedCorrSaturationreal_(CircularGradientBasedCorrectionsLocalSaturation)
CircGradBasedCorrShadows2012real_(CircularGradientBasedCorrectionsLocalShadows2012)
CircGradBasedCorrSharpnessreal_(CircularGradientBasedCorrectionsLocalSharpness)
CircGradBasedCorrTemperaturereal_(CircularGradientBasedCorrectionsLocalTemperature)
CircGradBasedCorrTexturereal_(CircularGradientBasedCorrectionsLocalTexture)
CircGradBasedCorrTintreal_(CircularGradientBasedCorrectionsLocalTint)
CircGradBasedCorrToningHuereal_(CircularGradientBasedCorrectionsLocalToningHue)
CircGradBasedCorrToningSaturationreal_(CircularGradientBasedCorrectionsLocalToningSaturation)
CircGradBasedCorrWhites2012real_(CircularGradientBasedCorrectionsLocalWhites2012)
CircGradBasedCorrWhatstring_(CircularGradientBasedCorrectionsWhat)
Clarityinteger 
Clarity2012integer 
ClipboardAspectRatiointeger 
ClipboardOrientationinteger 
Clusterstring 
ColorGradeBlendinginteger 
ColorGradeGlobalHueinteger 
ColorGradeGlobalLuminteger 
ColorGradeGlobalSatinteger 
ColorGradeHighlightLuminteger 
ColorGradeMidtoneHueinteger 
ColorGradeMidtoneLuminteger 
ColorGradeMidtoneSatinteger 
ColorGradeShadowLuminteger 
ColorNoiseReductioninteger 
ColorNoiseReductionDetailinteger 
ColorNoiseReductionSmoothnessinteger 
CompatibleVersionstring 
ContactInfostring 
Contrastinteger/ 
Contrast2012integer 
Converterstring 
ConvertToGrayscaleboolean 
Copyrightstring/ 
CropAnglereal 
CropBottomreal 
CropConstrainToWarpinteger 
CropHeightreal 
CropLeftreal 
CropRightreal 
CropTopreal 
CropUnitinteger0 = pixels +
1 = inches +
2 = cm
CropUnitsinteger0 = pixels +
1 = inches +
2 = cm
CropWidthreal 
DefaultAutoGrayboolean 
DefaultAutoToneboolean 
DefaultsSpecificToISOboolean 
DefaultsSpecificToSerialboolean 
Defringeinteger 
DefringeGreenAmountinteger 
DefringeGreenHueHiinteger 
DefringeGreenHueLointeger 
DefringePurpleAmountinteger 
DefringePurpleHueHiinteger 
DefringePurpleHueLointeger 
Dehazereal 
Descriptionlang-alt/ 
DNGIgnoreSidecarsboolean 
Exposurereal 
Exposure2012real 
FillLightinteger 
GradientBasedCorrectionsstruct+--> Correction Struct
GradientBasedCorrActiveboolean_(GradientBasedCorrectionsCorrectionActive)
GradientBasedCorrAmountreal_(GradientBasedCorrectionsCorrectionAmount)
GradientBasedCorrMasksstruct_+--> CorrectionMask Struct +
(GradientBasedCorrectionsCorrectionMasks)
GradientBasedCorrMaskAlphareal_(GradientBasedCorrectionsCorrectionMasksAlpha)
GradientBasedCorrMaskAnglereal_(GradientBasedCorrectionsCorrectionMasksAngle)
GradientBasedCorrMaskBottomreal_(GradientBasedCorrectionsCorrectionMasksBottom)
GradientBasedCorrMaskCenterValuereal_(GradientBasedCorrectionsCorrectionMasksCenterValue)
GradientBasedCorrMaskCenterWeightreal_(GradientBasedCorrectionsCorrectionMasksCenterWeight)
GradientBasedCorrMaskRangestruct_+--> CorrRangeMask Struct +
(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMask; called CorrectionRangeMask by the spec)
GradientBasedCorrMaskRangeAreaModelsstruct_+--> AreaModels Struct +
(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels)
GradientBasedCorrMaskRangeAreaModelsComponentsstring_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents)
GradientBasedCorrMaskRangeAreaModelsColorSampleInfostring_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
GradientBasedCorrMaskRangeColorAmountreal_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount)
GradientBasedCorrMaskRangeDepthFeatherreal_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather)
GradientBasedCorrMaskRangeDepthMaxreal_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax)
GradientBasedCorrMaskRangeDepthMinreal_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin)
GradientBasedCorrMaskRangeInvertboolean_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert)
GradientBasedCorrMaskRangeLumFeatherreal_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather)
GradientBasedCorrMaskRangeLuminanceDepthSampleInfostring_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo)
GradientBasedCorrMaskRangeLumMaxreal_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax)
GradientBasedCorrMaskRangeLumMinreal_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin)
GradientBasedCorrMaskRangeLumRangestring_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange)
GradientBasedCorrMaskRangeSampleTypeinteger_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType)
GradientBasedCorrMaskRangeTypestring_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskType)
GradientBasedCorrMaskRangeVersionstring_+(GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion)
GradientBasedCorrMaskDabsstring_(GradientBasedCorrectionsCorrectionMasksDabs)
GradientBasedCorrMaskFeatherreal_(GradientBasedCorrectionsCorrectionMasksFeather)
GradientBasedCorrMaskFlippedboolean_(GradientBasedCorrectionsCorrectionMasksFlipped)
GradientBasedCorrMaskFlowreal_(GradientBasedCorrectionsCorrectionMasksFlow)
GradientBasedCorrMaskFullXreal_(GradientBasedCorrectionsCorrectionMasksFullX)
GradientBasedCorrMaskFullYreal_(GradientBasedCorrectionsCorrectionMasksFullY)
GradientBasedCorrMaskInputDigeststring_(GradientBasedCorrectionsCorrectionMasksInputDigest)
GradientBasedCorrMaskLeftreal_(GradientBasedCorrectionsCorrectionMasksLeft)
GradientBasedCorrMaskMaskActiveboolean_(GradientBasedCorrectionsCorrectionMasksMaskActive)
GradientBasedCorrMaskMaskBlendModeinteger_(GradientBasedCorrectionsCorrectionMasksMaskBlendMode)
GradientBasedCorrMaskMaskDigeststring_(GradientBasedCorrectionsCorrectionMasksMaskDigest)
GradientBasedCorrMaskMaskInvertedboolean_(GradientBasedCorrectionsCorrectionMasksMaskInverted)
GradientBasedCorrMaskMaskNamestring_(GradientBasedCorrectionsCorrectionMasksMaskName)
GradientBasedCorrMaskMasksstruct_+--> CorrectionMask Struct +
(GradientBasedCorrectionsCorrectionMasksMasks)
GradientBasedCorrMaskMasksAlphareal_(GradientBasedCorrectionsCorrectionMasksMasksAlpha)
GradientBasedCorrMaskMasksAnglereal_(GradientBasedCorrectionsCorrectionMasksMasksAngle)
GradientBasedCorrMaskMasksBottomreal_(GradientBasedCorrectionsCorrectionMasksMasksBottom)
GradientBasedCorrMaskMasksCenterValuereal_(GradientBasedCorrectionsCorrectionMasksMasksCenterValue)
GradientBasedCorrMaskMasksCenterWeightreal_(GradientBasedCorrectionsCorrectionMasksMasksCenterWeight)
GradientBasedCorrMaskMasksDabsstring_+(GradientBasedCorrectionsCorrectionMasksMasksDabs)
GradientBasedCorrMaskMasksFeatherreal_(GradientBasedCorrectionsCorrectionMasksMasksFeather)
GradientBasedCorrMaskMasksFlippedboolean_(GradientBasedCorrectionsCorrectionMasksMasksFlipped)
GradientBasedCorrMaskMasksFlowreal_(GradientBasedCorrectionsCorrectionMasksMasksFlow)
GradientBasedCorrMaskMasksFullXreal_(GradientBasedCorrectionsCorrectionMasksMasksFullX)
GradientBasedCorrMaskMasksFullYreal_(GradientBasedCorrectionsCorrectionMasksMasksFullY)
GradientBasedCorrMaskMasksInputDigeststring_(GradientBasedCorrectionsCorrectionMasksMasksInputDigest)
GradientBasedCorrMaskMasksLeftreal_(GradientBasedCorrectionsCorrectionMasksMasksLeft)
GradientBasedCorrMaskMasksMaskActiveboolean_(GradientBasedCorrectionsCorrectionMasksMasksMaskActive)
GradientBasedCorrMaskMasksMaskBlendModeinteger_(GradientBasedCorrectionsCorrectionMasksMasksMaskBlendMode)
GradientBasedCorrMaskMasksMaskDigeststring_(GradientBasedCorrectionsCorrectionMasksMasksMaskDigest)
GradientBasedCorrMaskMasksMaskInvertedboolean_(GradientBasedCorrectionsCorrectionMasksMasksMaskInverted)
GradientBasedCorrMaskMasksMaskNamestring_(GradientBasedCorrectionsCorrectionMasksMasksMaskName)
GradientBasedCorrMaskMasksMaskSubTypestring_(GradientBasedCorrectionsCorrectionMasksMasksMaskSubType)
GradientBasedCorrMaskMasksMaskSyncIDstring_(GradientBasedCorrectionsCorrectionMasksMasksMaskSyncID)
GradientBasedCorrMaskMasksValuereal_(GradientBasedCorrectionsCorrectionMasksMasksMaskValue)
GradientBasedCorrMaskMasksMaskVersionstring_(GradientBasedCorrectionsCorrectionMasksMasksMaskVersion)
GradientBasedCorrMaskMasksMidpointreal_(GradientBasedCorrectionsCorrectionMasksMasksMidpoint)
GradientBasedCorrMaskMasksOriginstring_(GradientBasedCorrectionsCorrectionMasksMasksOrigin)
GradientBasedCorrMaskMasksPerimeterValuereal_(GradientBasedCorrectionsCorrectionMasksMasksPerimeterValue)
GradientBasedCorrMaskMasksRadiusreal_(GradientBasedCorrectionsCorrectionMasksMasksRadius)
GradientBasedCorrMaskMasksReferencePointstring_(GradientBasedCorrectionsCorrectionMasksMasksReferencePoint)
GradientBasedCorrMaskMasksRightreal_(GradientBasedCorrectionsCorrectionMasksMasksRight)
GradientBasedCorrMaskMasksRoundnessreal_(GradientBasedCorrectionsCorrectionMasksMasksRoundness)
GradientBasedCorrMaskMasksSizeXreal_(GradientBasedCorrectionsCorrectionMasksMasksSizeX)
GradientBasedCorrMaskMasksSizeYreal_(GradientBasedCorrectionsCorrectionMasksMasksSizeY)
GradientBasedCorrMaskMasksTopreal_(GradientBasedCorrectionsCorrectionMasksMasksTop)
GradientBasedCorrMaskMaskSubTypestring_(GradientBasedCorrectionsCorrectionMasksMaskSubType)
GradientBasedCorrMaskMasksVersioninteger_(GradientBasedCorrectionsCorrectionMasksMasksVersion)
GradientBasedCorrMaskMasksWhatstring_(GradientBasedCorrectionsCorrectionMasksMasksWhat)
GradientBasedCorrMaskMasksWholeImageAreastring_(GradientBasedCorrectionsCorrectionMasksMasksWholeImageArea)
GradientBasedCorrMaskMasksXreal_(GradientBasedCorrectionsCorrectionMasksMasksX)
GradientBasedCorrMaskMasksYreal_(GradientBasedCorrectionsCorrectionMasksMasksY)
GradientBasedCorrMaskMaskSyncIDstring_(GradientBasedCorrectionsCorrectionMasksMaskSyncID)
GradientBasedCorrMaskMasksZeroXreal_(GradientBasedCorrectionsCorrectionMasksMasksZeroX)
GradientBasedCorrMaskMasksZeroYreal_(GradientBasedCorrectionsCorrectionMasksMasksZeroY)
GradientBasedCorrMaskValuereal_(GradientBasedCorrectionsCorrectionMasksMaskValue)
GradientBasedCorrMaskMaskVersionstring_(GradientBasedCorrectionsCorrectionMasksMaskVersion)
GradientBasedCorrMaskMidpointreal_(GradientBasedCorrectionsCorrectionMasksMidpoint)
GradientBasedCorrMaskOriginstring_(GradientBasedCorrectionsCorrectionMasksOrigin)
GradientBasedCorrMaskPerimeterValuereal_(GradientBasedCorrectionsCorrectionMasksPerimeterValue)
GradientBasedCorrMaskRadiusreal_(GradientBasedCorrectionsCorrectionMasksRadius)
GradientBasedCorrMaskReferencePointstring_(GradientBasedCorrectionsCorrectionMasksReferencePoint)
GradientBasedCorrMaskRightreal_(GradientBasedCorrectionsCorrectionMasksRight)
GradientBasedCorrMaskRoundnessreal_(GradientBasedCorrectionsCorrectionMasksRoundness)
GradientBasedCorrMaskSizeXreal_(GradientBasedCorrectionsCorrectionMasksSizeX)
GradientBasedCorrMaskSizeYreal_(GradientBasedCorrectionsCorrectionMasksSizeY)
GradientBasedCorrMaskTopreal_(GradientBasedCorrectionsCorrectionMasksTop)
GradientBasedCorrMaskVersioninteger_(GradientBasedCorrectionsCorrectionMasksVersion)
GradientBasedCorrMaskWhatstring_(GradientBasedCorrectionsCorrectionMasksWhat)
GradientBasedCorrMaskWholeImageAreastring_(GradientBasedCorrectionsCorrectionMasksWholeImageArea)
GradientBasedCorrMaskXreal_(GradientBasedCorrectionsCorrectionMasksX)
GradientBasedCorrMaskYreal_(GradientBasedCorrectionsCorrectionMasksY)
GradientBasedCorrMaskZeroXreal_(GradientBasedCorrectionsCorrectionMasksZeroX)
GradientBasedCorrMaskZeroYreal_(GradientBasedCorrectionsCorrectionMasksZeroY)
GradientBasedCorrCorrectionNamestring_+(GradientBasedCorrectionsCorrectionName)
GradientBasedCorrRangeMaskstruct_+--> CorrRangeMask Struct +
(GradientBasedCorrectionsCorrectionRangeMask; called CorrectionRangeMask by the spec)
GradientBasedCorrRangeMaskAreaModelsstruct_+--> AreaModels Struct +
(GradientBasedCorrectionsCorrectionRangeMaskAreaModels)
GradientBasedCorrRangeMaskAreaModelsComponentsstring_+(GradientBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents)
GradientBasedCorrRangeMaskAreaModelsColorSampleInfostring_+(GradientBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
GradientBasedCorrRangeMaskColorAmountreal_+(GradientBasedCorrectionsCorrectionRangeMaskColorAmount)
GradientBasedCorrRangeMaskDepthFeatherreal_+(GradientBasedCorrectionsCorrectionRangeMaskDepthFeather)
GradientBasedCorrRangeMaskDepthMaxreal_+(GradientBasedCorrectionsCorrectionRangeMaskDepthMax)
GradientBasedCorrRangeMaskDepthMinreal_+(GradientBasedCorrectionsCorrectionRangeMaskDepthMin)
GradientBasedCorrRangeMaskInvertboolean_+(GradientBasedCorrectionsCorrectionRangeMaskInvert)
GradientBasedCorrRangeMaskLumFeatherreal_+(GradientBasedCorrectionsCorrectionRangeMaskLumFeather)
GradientBasedCorrRangeMaskLuminanceDepthSampleInfostring_+(GradientBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo)
GradientBasedCorrRangeMaskLumMaxreal_+(GradientBasedCorrectionsCorrectionRangeMaskLumMax)
GradientBasedCorrRangeMaskLumMinreal_+(GradientBasedCorrectionsCorrectionRangeMaskLumMin)
GradientBasedCorrRangeMaskLumRangestring_+(GradientBasedCorrectionsCorrectionRangeMaskLumRange)
GradientBasedCorrRangeMaskSampleTypeinteger_+(GradientBasedCorrectionsCorrectionRangeMaskSampleType)
GradientBasedCorrRangeMaskTypestring_+(GradientBasedCorrectionsCorrectionRangeMaskType)
GradientBasedCorrRangeMaskVersionstring_+(GradientBasedCorrectionsCorrectionRangeMaskVersion)
GradientBasedCorrCorrectionSyncIDstring_+(GradientBasedCorrectionsCorrectionSyncID)
GradientBasedCorrBlacks2012real_(GradientBasedCorrectionsLocalBlacks2012)
GradientBasedCorrBrightnessreal_(GradientBasedCorrectionsLocalBrightness)
GradientBasedCorrClarityreal_(GradientBasedCorrectionsLocalClarity)
GradientBasedCorrClarity2012real_(GradientBasedCorrectionsLocalClarity2012)
GradientBasedCorrContrastreal_(GradientBasedCorrectionsLocalContrast)
GradientBasedCorrContrast2012real_(GradientBasedCorrectionsLocalContrast2012)
GradientBasedCorrDefringereal_(GradientBasedCorrectionsLocalDefringe)
GradientBasedCorrDehazereal_(GradientBasedCorrectionsLocalDehaze)
GradientBasedCorrExposurereal_(GradientBasedCorrectionsLocalExposure)
GradientBasedCorrExposure2012real_(GradientBasedCorrectionsLocalExposure2012)
GradientBasedCorrHighlights2012real_(GradientBasedCorrectionsLocalHighlights2012)
GradientBasedCorrHuereal_(GradientBasedCorrectionsLocalHue)
GradientBasedCorrLuminanceNoisereal_(GradientBasedCorrectionsLocalLuminanceNoise)
GradientBasedCorrMoirereal_(GradientBasedCorrectionsLocalMoire)
GradientBasedCorrSaturationreal_(GradientBasedCorrectionsLocalSaturation)
GradientBasedCorrShadows2012real_(GradientBasedCorrectionsLocalShadows2012)
GradientBasedCorrSharpnessreal_(GradientBasedCorrectionsLocalSharpness)
GradientBasedCorrTemperaturereal_(GradientBasedCorrectionsLocalTemperature)
GradientBasedCorrTexturereal_(GradientBasedCorrectionsLocalTexture)
GradientBasedCorrTintreal_(GradientBasedCorrectionsLocalTint)
GradientBasedCorrToningHuereal_(GradientBasedCorrectionsLocalToningHue)
GradientBasedCorrToningSaturationreal_(GradientBasedCorrectionsLocalToningSaturation)
GradientBasedCorrWhites2012real_(GradientBasedCorrectionsLocalWhites2012)
GradientBasedCorrWhatstring_(GradientBasedCorrectionsWhat)
GrainAmountinteger 
GrainFrequencyinteger 
GrainSeedinteger 
GrainSizeinteger 
GrayMixerAquainteger 
GrayMixerBlueinteger 
GrayMixerGreeninteger 
GrayMixerMagentainteger 
GrayMixerOrangeinteger 
GrayMixerPurpleinteger 
GrayMixerRedinteger 
GrayMixerYellowinteger 
GreenHueinteger 
GreenSaturationinteger 
Grouplang-alt/ 
HasCropboolean 
HasSettingsboolean 
Highlight2012integer 
HighlightRecoveryinteger 
Highlights2012integer 
HueAdjustmentAquainteger 
HueAdjustmentBlueinteger 
HueAdjustmentGreeninteger 
HueAdjustmentMagentainteger 
HueAdjustmentOrangeinteger 
HueAdjustmentPurpleinteger 
HueAdjustmentRedinteger 
HueAdjustmentYellowinteger 
IncrementalTemperatureinteger 
IncrementalTintinteger 
JPEGHandlingstring 
LensManualDistortionAmountinteger 
LensProfileChromaticAberrationScaleinteger 
LensProfileDigeststring 
LensProfileDistortionScaleinteger 
LensProfileEnableinteger 
LensProfileFilenamestring 
LensProfileIsEmbeddedboolean 
LensProfileMatchKeyCameraModelNamestring 
LensProfileMatchKeyExifMakestring 
LensProfileMatchKeyExifModelstring 
LensProfileMatchKeyIsRawboolean 
LensProfileMatchKeyLensIDstring 
LensProfileMatchKeyLensInfostring 
LensProfileMatchKeyLensNamestring 
LensProfileMatchKeySensorFormatFactorreal 
LensProfileNamestring 
LensProfileSetupstring 
LensProfileVignettingScaleinteger 
Lookstruct--> Look Struct
LookAmountstring_ 
LookClusterstring_ 
LookCopyrightstring_ 
LookGrouplang-alt_ 
LookNamestring(NOT a flattened tag!)
LookParametersstruct_--> LookParms Struct
LookParametersCameraProfilestring_ 
LookParametersClarity2012string_ 
LookParametersConvertToGrayscalestring_ 
LookParametersLookTablestring_ 
LookParametersProcessVersionstring_ 
LookParametersToneCurvePV2012string_+ 
LookParametersToneCurvePV2012Bluestring_+ 
LookParametersToneCurvePV2012Greenstring_+ 
LookParametersToneCurvePV2012Redstring_+ 
LookParametersVersionstring_ 
LookSupportsAmountstring_ 
LookSupportsMonochromestring_ 
LookSupportsOutputReferredstring_ 
LookUUIDstring_ 
LuminanceAdjustmentAquainteger 
LuminanceAdjustmentBlueinteger 
LuminanceAdjustmentGreeninteger 
LuminanceAdjustmentMagentainteger 
LuminanceAdjustmentOrangeinteger 
LuminanceAdjustmentPurpleinteger 
LuminanceAdjustmentRedinteger 
LuminanceAdjustmentYellowinteger 
LuminanceNoiseReductionContrastinteger 
LuminanceNoiseReductionDetailinteger 
LuminanceSmoothinginteger 
MaskGroupBasedCorrectionsstruct+--> Correction Struct
MaskGroupBasedCorrActiveboolean_(MaskGroupBasedCorrectionsCorrectionActive)
MaskGroupBasedCorrAmountreal_(MaskGroupBasedCorrectionsCorrectionAmount)
MaskGroupBasedCorrMaskstruct_+--> CorrectionMask Struct +
(MaskGroupBasedCorrectionsCorrectionMasks)
MaskGroupBasedCorrMaskAlphareal_(MaskGroupBasedCorrectionsCorrectionMasksAlpha)
MaskGroupBasedCorrMaskAnglereal_(MaskGroupBasedCorrectionsCorrectionMasksAngle)
MaskGroupBasedCorrMaskBottomreal_(MaskGroupBasedCorrectionsCorrectionMasksBottom)
MaskGroupBasedCorrMaskCenterValuereal_(MaskGroupBasedCorrectionsCorrectionMasksCenterValue)
MaskGroupBasedCorrMaskCenterWeightreal_(MaskGroupBasedCorrectionsCorrectionMasksCenterWeight)
MaskGroupBasedCorrMaskRangestruct_+--> CorrRangeMask Struct +
(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMask; called CorrectionRangeMask by the spec)
MaskGroupBasedCorrMaskRangeAreaModelsstruct_+--> AreaModels Struct +
(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels)
MaskGroupBasedCorrMaskRangeAreaModelsComponentsstring_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents)
MaskGroupBasedCorrMaskRangeAreaModelsColorSampleInfostring_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
MaskGroupBasedCorrMaskRangeColorAmountreal_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount)
MaskGroupBasedCorrMaskRangeDepthFeatherreal_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather)
MaskGroupBasedCorrMaskRangeDepthMaxreal_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax)
MaskGroupBasedCorrMaskRangeDepthMinreal_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin)
MaskGroupBasedCorrMaskRangeInvertboolean_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert)
MaskGroupBasedCorrMaskRangeLumFeatherreal_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather)
MaskGroupBasedCorrMaskRangeLuminanceDepthSampleInfostring_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo)
MaskGroupBasedCorrMaskRangeLumMaxreal_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax)
MaskGroupBasedCorrMaskRangeLumMinreal_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin)
MaskGroupBasedCorrMaskRangeLumRangestring_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange)
MaskGroupBasedCorrMaskRangeSampleTypeinteger_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType)
MaskGroupBasedCorrMaskRangeTypestring_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskType)
MaskGroupBasedCorrMaskRangeVersionstring_+(MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion)
MaskGroupBasedCorrMaskDabsstring_+(MaskGroupBasedCorrectionsCorrectionMasksDabs)
MaskGroupBasedCorrMaskFeatherreal_(MaskGroupBasedCorrectionsCorrectionMasksFeather)
MaskGroupBasedCorrMaskFlippedboolean_(MaskGroupBasedCorrectionsCorrectionMasksFlipped)
MaskGroupBasedCorrMaskFlowreal_(MaskGroupBasedCorrectionsCorrectionMasksFlow)
MaskGroupBasedCorrMaskFullXreal_(MaskGroupBasedCorrectionsCorrectionMasksFullX)
MaskGroupBasedCorrMaskFullYreal_(MaskGroupBasedCorrectionsCorrectionMasksFullY)
MaskGroupBasedCorrMaskInputDigeststring_(MaskGroupBasedCorrectionsCorrectionMasksInputDigest)
MaskGroupBasedCorrMaskLeftreal_(MaskGroupBasedCorrectionsCorrectionMasksLeft)
MaskGroupBasedCorrMaskMaskActiveboolean_(MaskGroupBasedCorrectionsCorrectionMasksMaskActive)
MaskGroupBasedCorrMaskMaskBlendModeinteger_(MaskGroupBasedCorrectionsCorrectionMasksMaskBlendMode)
MaskGroupBasedCorrMaskMaskDigeststring_(MaskGroupBasedCorrectionsCorrectionMasksMaskDigest)
MaskGroupBasedCorrMaskMaskInvertedboolean_(MaskGroupBasedCorrectionsCorrectionMasksMaskInverted)
MaskGroupBasedCorrMaskMaskNamestring_(MaskGroupBasedCorrectionsCorrectionMasksMaskName)
MaskGroupBasedCorrMaskMasksstruct_+--> CorrectionMask Struct +
(MaskGroupBasedCorrectionsCorrectionMasksMasks)
MaskGroupBasedCorrMaskMasksAlphareal_(MaskGroupBasedCorrectionsCorrectionMasksMasksAlpha)
MaskGroupBasedCorrMaskMasksAnglereal_(MaskGroupBasedCorrectionsCorrectionMasksMasksAngle)
MaskGroupBasedCorrMaskMasksBottomreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksBottom)
MaskGroupBasedCorrMaskMasksCenterValuereal_(MaskGroupBasedCorrectionsCorrectionMasksMasksCenterValue)
MaskGroupBasedCorrMaskMasksCenterWeightreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksCenterWeight)
MaskGroupBasedCorrMaskMasksDabsstring_+(MaskGroupBasedCorrectionsCorrectionMasksMasksDabs)
MaskGroupBasedCorrMaskMasksFeatherreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksFeather)
MaskGroupBasedCorrMaskMasksFlippedboolean_(MaskGroupBasedCorrectionsCorrectionMasksMasksFlipped)
MaskGroupBasedCorrMaskMasksFlowreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksFlow)
MaskGroupBasedCorrMaskMasksFullXreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksFullX)
MaskGroupBasedCorrMaskMasksFullYreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksFullY)
MaskGroupBasedCorrMaskMasksInputDigeststring_(MaskGroupBasedCorrectionsCorrectionMasksMasksInputDigest)
MaskGroupBasedCorrMaskMasksLeftreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksLeft)
MaskGroupBasedCorrMaskMasksMaskActiveboolean_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskActive)
MaskGroupBasedCorrMaskMasksMaskBlendModeinteger_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskBlendMode)
MaskGroupBasedCorrMaskMasksMaskDigeststring_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskDigest)
MaskGroupBasedCorrMaskMasksMaskInvertedboolean_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskInverted)
MaskGroupBasedCorrMaskMasksMaskNamestring_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskName)
MaskGroupBasedCorrMaskMasksMaskSubTypestring_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskSubType)
MaskGroupBasedCorrMaskMasksMaskSyncIDstring_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskSyncID)
MaskGroupBasedCorrMaskMasksValuereal_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskValue)
MaskGroupBasedCorrMaskMasksMaskVersionstring_(MaskGroupBasedCorrectionsCorrectionMasksMasksMaskVersion)
MaskGroupBasedCorrMaskMasksMidpointreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksMidpoint)
MaskGroupBasedCorrMaskMasksOriginstring_(MaskGroupBasedCorrectionsCorrectionMasksMasksOrigin)
MaskGroupBasedCorrMaskMasksPerimeterValuereal_(MaskGroupBasedCorrectionsCorrectionMasksMasksPerimeterValue)
MaskGroupBasedCorrMaskMasksRadiusreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksRadius)
MaskGroupBasedCorrMaskMasksReferencePointstring_(MaskGroupBasedCorrectionsCorrectionMasksMasksReferencePoint)
MaskGroupBasedCorrMaskMasksRightreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksRight)
MaskGroupBasedCorrMaskMasksRoundnessreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksRoundness)
MaskGroupBasedCorrMaskMasksSizeXreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksSizeX)
MaskGroupBasedCorrMaskMasksSizeYreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksSizeY)
MaskGroupBasedCorrMaskMasksTopreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksTop)
MaskGroupBasedCorrMaskMaskSubTypestring_(MaskGroupBasedCorrectionsCorrectionMasksMaskSubType)
MaskGroupBasedCorrMaskMasksVersioninteger_(MaskGroupBasedCorrectionsCorrectionMasksMasksVersion)
MaskGroupBasedCorrMaskMasksWhatstring_(MaskGroupBasedCorrectionsCorrectionMasksMasksWhat)
MaskGroupBasedCorrMaskMasksWholeImageAreastring_(MaskGroupBasedCorrectionsCorrectionMasksMasksWholeImageArea)
MaskGroupBasedCorrMaskMasksXreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksX)
MaskGroupBasedCorrMaskMasksYreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksY)
MaskGroupBasedCorrMaskMaskSyncIDstring_(MaskGroupBasedCorrectionsCorrectionMasksMaskSyncID)
MaskGroupBasedCorrMaskMasksZeroXreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksZeroX)
MaskGroupBasedCorrMaskMasksZeroYreal_(MaskGroupBasedCorrectionsCorrectionMasksMasksZeroY)
MaskGroupBasedCorrMaskValuereal_(MaskGroupBasedCorrectionsCorrectionMasksMaskValue)
MaskGroupBasedCorrMaskMaskVersionstring_(MaskGroupBasedCorrectionsCorrectionMasksMaskVersion)
MaskGroupBasedCorrMaskMidpointreal_(MaskGroupBasedCorrectionsCorrectionMasksMidpoint)
MaskGroupBasedCorrMaskOriginstring_(MaskGroupBasedCorrectionsCorrectionMasksOrigin)
MaskGroupBasedCorrMaskPerimeterValuereal_(MaskGroupBasedCorrectionsCorrectionMasksPerimeterValue)
MaskGroupBasedCorrMaskRadiusreal_(MaskGroupBasedCorrectionsCorrectionMasksRadius)
MaskGroupBasedCorrMaskReferencePointstring_(MaskGroupBasedCorrectionsCorrectionMasksReferencePoint)
MaskGroupBasedCorrMaskRightreal_(MaskGroupBasedCorrectionsCorrectionMasksRight)
MaskGroupBasedCorrMaskRoundnessreal_(MaskGroupBasedCorrectionsCorrectionMasksRoundness)
MaskGroupBasedCorrMaskSizeXreal_(MaskGroupBasedCorrectionsCorrectionMasksSizeX)
MaskGroupBasedCorrMaskSizeYreal_(MaskGroupBasedCorrectionsCorrectionMasksSizeY)
MaskGroupBasedCorrMaskTopreal_(MaskGroupBasedCorrectionsCorrectionMasksTop)
MaskGroupBasedCorrMaskVersioninteger_(MaskGroupBasedCorrectionsCorrectionMasksVersion)
MaskGroupBasedCorrMaskWhatstring_(MaskGroupBasedCorrectionsCorrectionMasksWhat)
MaskGroupBasedCorrMaskWholeImageAreastring_(MaskGroupBasedCorrectionsCorrectionMasksWholeImageArea)
MaskGroupBasedCorrMaskXreal_(MaskGroupBasedCorrectionsCorrectionMasksX)
MaskGroupBasedCorrMaskYreal_(MaskGroupBasedCorrectionsCorrectionMasksY)
MaskGroupBasedCorrMaskZeroXreal_(MaskGroupBasedCorrectionsCorrectionMasksZeroX)
MaskGroupBasedCorrMaskZeroYreal_(MaskGroupBasedCorrectionsCorrectionMasksZeroY)
MaskGroupBasedCorrCorrectionNamestring_+(MaskGroupBasedCorrectionsCorrectionName)
MaskGroupBasedCorrRangeMaskstruct_+--> CorrRangeMask Struct +
(MaskGroupBasedCorrectionsCorrectionRangeMask; called CorrectionRangeMask by the spec)
MaskGroupBasedCorrRangeMaskAreaModelsstruct_+--> AreaModels Struct +
(MaskGroupBasedCorrectionsCorrectionRangeMaskAreaModels)
MaskGroupBasedCorrRangeMaskAreaModelsComponentsstring_+(MaskGroupBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents)
MaskGroupBasedCorrRangeMaskAreaModelsColorSampleInfostring_+(MaskGroupBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
MaskGroupBasedCorrRangeMaskColorAmountreal_+(MaskGroupBasedCorrectionsCorrectionRangeMaskColorAmount)
MaskGroupBasedCorrRangeMaskDepthFeatherreal_+(MaskGroupBasedCorrectionsCorrectionRangeMaskDepthFeather)
MaskGroupBasedCorrRangeMaskDepthMaxreal_+(MaskGroupBasedCorrectionsCorrectionRangeMaskDepthMax)
MaskGroupBasedCorrRangeMaskDepthMinreal_+(MaskGroupBasedCorrectionsCorrectionRangeMaskDepthMin)
MaskGroupBasedCorrRangeMaskInvertboolean_+(MaskGroupBasedCorrectionsCorrectionRangeMaskInvert)
MaskGroupBasedCorrRangeMaskLumFeatherreal_+(MaskGroupBasedCorrectionsCorrectionRangeMaskLumFeather)
MaskGroupBasedCorrRangeMaskLuminanceDepthSampleInfostring_+(MaskGroupBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo)
MaskGroupBasedCorrRangeMaskLumMaxreal_+(MaskGroupBasedCorrectionsCorrectionRangeMaskLumMax)
MaskGroupBasedCorrRangeMaskLumMinreal_+(MaskGroupBasedCorrectionsCorrectionRangeMaskLumMin)
MaskGroupBasedCorrRangeMaskLumRangestring_+(MaskGroupBasedCorrectionsCorrectionRangeMaskLumRange)
MaskGroupBasedCorrRangeMaskSampleTypeinteger_+(MaskGroupBasedCorrectionsCorrectionRangeMaskSampleType)
MaskGroupBasedCorrRangeMaskTypestring_+(MaskGroupBasedCorrectionsCorrectionRangeMaskType)
MaskGroupBasedCorrRangeMaskVersionstring_+(MaskGroupBasedCorrectionsCorrectionRangeMaskVersion)
MaskGroupBasedCorrCorrectionSyncIDstring_+(MaskGroupBasedCorrectionsCorrectionSyncID)
MaskGroupBasedCorrBlacks2012real_(MaskGroupBasedCorrectionsLocalBlacks2012)
MaskGroupBasedCorrBrightnessreal_(MaskGroupBasedCorrectionsLocalBrightness)
MaskGroupBasedCorrClarityreal_(MaskGroupBasedCorrectionsLocalClarity)
MaskGroupBasedCorrClarity2012real_(MaskGroupBasedCorrectionsLocalClarity2012)
MaskGroupBasedCorrContrastreal_(MaskGroupBasedCorrectionsLocalContrast)
MaskGroupBasedCorrContrast2012real_(MaskGroupBasedCorrectionsLocalContrast2012)
MaskGroupBasedCorrDefringereal_(MaskGroupBasedCorrectionsLocalDefringe)
MaskGroupBasedCorrDehazereal_(MaskGroupBasedCorrectionsLocalDehaze)
MaskGroupBasedCorrExposurereal_(MaskGroupBasedCorrectionsLocalExposure)
MaskGroupBasedCorrExposure2012real_(MaskGroupBasedCorrectionsLocalExposure2012)
MaskGroupBasedCorrHighlights2012real_(MaskGroupBasedCorrectionsLocalHighlights2012)
MaskGroupBasedCorrHuereal_(MaskGroupBasedCorrectionsLocalHue)
MaskGroupBasedCorrLuminanceNoisereal_(MaskGroupBasedCorrectionsLocalLuminanceNoise)
MaskGroupBasedCorrMoirereal_(MaskGroupBasedCorrectionsLocalMoire)
MaskGroupBasedCorrSaturationreal_(MaskGroupBasedCorrectionsLocalSaturation)
MaskGroupBasedCorrShadows2012real_(MaskGroupBasedCorrectionsLocalShadows2012)
MaskGroupBasedCorrSharpnessreal_(MaskGroupBasedCorrectionsLocalSharpness)
MaskGroupBasedCorrTemperaturereal_(MaskGroupBasedCorrectionsLocalTemperature)
MaskGroupBasedCorrTexturereal_(MaskGroupBasedCorrectionsLocalTexture)
MaskGroupBasedCorrTintreal_(MaskGroupBasedCorrectionsLocalTint)
MaskGroupBasedCorrToningHuereal_(MaskGroupBasedCorrectionsLocalToningHue)
MaskGroupBasedCorrToningSaturationreal_(MaskGroupBasedCorrectionsLocalToningSaturation)
MaskGroupBasedCorrWhites2012real_(MaskGroupBasedCorrectionsLocalWhites2012)
MaskGroupBasedCorrWhatstring_(MaskGroupBasedCorrectionsWhat)
MoireFilterstring'Off' = Off +
'On' = On
Namelang-alt/ 
NegativeCacheLargePreviewSizeinteger 
NegativeCacheMaximumSizereal 
NegativeCachePathstring 
OverrideLookVignetteboolean 
PaintBasedCorrectionsstruct+--> Correction Struct
PaintCorrectionActiveboolean_(PaintBasedCorrectionsCorrectionActive)
PaintCorrectionAmountreal_(PaintBasedCorrectionsCorrectionAmount)
PaintBasedCorrectionMasksstruct_+--> CorrectionMask Struct +
(PaintBasedCorrectionsCorrectionMasks)
PaintCorrectionMaskAlphareal_(PaintBasedCorrectionsCorrectionMasksAlpha)
PaintCorrectionMaskAnglereal_(PaintBasedCorrectionsCorrectionMasksAngle)
PaintCorrectionMaskBottomreal_(PaintBasedCorrectionsCorrectionMasksBottom)
PaintCorrectionMaskCenterValuereal_(PaintBasedCorrectionsCorrectionMasksCenterValue)
PaintCorrectionMaskCenterWeightreal_(PaintBasedCorrectionsCorrectionMasksCenterWeight)
PaintCorrectionMaskRangestruct_+--> CorrRangeMask Struct +
(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMask; called CorrectionRangeMask by the spec)
PaintCorrectionMaskRangeAreaModelsstruct_+--> AreaModels Struct +
(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels)
PaintCorrectionMaskRangeAreaModelsComponentsstring_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents)
PaintCorrectionMaskRangeAreaModelsColorSampleInfostring_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
PaintCorrectionMaskRangeColorAmountreal_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount)
PaintCorrectionMaskRangeDepthFeatherreal_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather)
PaintCorrectionMaskRangeDepthMaxreal_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax)
PaintCorrectionMaskRangeDepthMinreal_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin)
PaintCorrectionMaskRangeInvertboolean_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert)
PaintCorrectionMaskRangeLumFeatherreal_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather)
PaintCorrectionMaskRangeLuminanceDepthSampleInfostring_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo)
PaintCorrectionMaskRangeLumMaxreal_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax)
PaintCorrectionMaskRangeLumMinreal_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin)
PaintCorrectionMaskRangeLumRangestring_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange)
PaintCorrectionMaskRangeSampleTypeinteger_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType)
PaintCorrectionMaskRangeTypestring_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskType)
PaintCorrectionMaskRangeVersionstring_+(PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion)
PaintCorrectionMaskDabsstring_(PaintBasedCorrectionsCorrectionMasksDabs)
PaintCorrectionMaskFeatherreal_(PaintBasedCorrectionsCorrectionMasksFeather)
PaintCorrectionMaskFlippedboolean_(PaintBasedCorrectionsCorrectionMasksFlipped)
PaintCorrectionMaskFlowreal_(PaintBasedCorrectionsCorrectionMasksFlow)
PaintCorrectionMaskFullXreal_(PaintBasedCorrectionsCorrectionMasksFullX)
PaintCorrectionMaskFullYreal_(PaintBasedCorrectionsCorrectionMasksFullY)
PaintCorrectionMaskInputDigeststring_(PaintBasedCorrectionsCorrectionMasksInputDigest)
PaintCorrectionMaskLeftreal_(PaintBasedCorrectionsCorrectionMasksLeft)
PaintCorrectionMaskMaskActiveboolean_(PaintBasedCorrectionsCorrectionMasksMaskActive)
PaintCorrectionMaskMaskBlendModeinteger_(PaintBasedCorrectionsCorrectionMasksMaskBlendMode)
PaintCorrectionMaskMaskDigeststring_(PaintBasedCorrectionsCorrectionMasksMaskDigest)
PaintCorrectionMaskMaskInvertedboolean_(PaintBasedCorrectionsCorrectionMasksMaskInverted)
PaintCorrectionMaskMaskNamestring_(PaintBasedCorrectionsCorrectionMasksMaskName)
PaintCorrectionMaskMasksstruct_+--> CorrectionMask Struct +
(PaintBasedCorrectionsCorrectionMasksMasks)
PaintCorrectionMaskMasksAlphareal_(PaintBasedCorrectionsCorrectionMasksMasksAlpha)
PaintCorrectionMaskMasksAnglereal_(PaintBasedCorrectionsCorrectionMasksMasksAngle)
PaintCorrectionMaskMasksBottomreal_(PaintBasedCorrectionsCorrectionMasksMasksBottom)
PaintCorrectionMaskMasksCenterValuereal_(PaintBasedCorrectionsCorrectionMasksMasksCenterValue)
PaintCorrectionMaskMasksCenterWeightreal_(PaintBasedCorrectionsCorrectionMasksMasksCenterWeight)
PaintCorrectionMaskMasksDabsstring_+(PaintBasedCorrectionsCorrectionMasksMasksDabs)
PaintCorrectionMaskMasksFeatherreal_(PaintBasedCorrectionsCorrectionMasksMasksFeather)
PaintCorrectionMaskMasksFlippedboolean_(PaintBasedCorrectionsCorrectionMasksMasksFlipped)
PaintCorrectionMaskMasksFlowreal_(PaintBasedCorrectionsCorrectionMasksMasksFlow)
PaintCorrectionMaskMasksFullXreal_(PaintBasedCorrectionsCorrectionMasksMasksFullX)
PaintCorrectionMaskMasksFullYreal_(PaintBasedCorrectionsCorrectionMasksMasksFullY)
PaintCorrectionMaskMasksInputDigeststring_(PaintBasedCorrectionsCorrectionMasksMasksInputDigest)
PaintCorrectionMaskMasksLeftreal_(PaintBasedCorrectionsCorrectionMasksMasksLeft)
PaintCorrectionMaskMasksMaskActiveboolean_(PaintBasedCorrectionsCorrectionMasksMasksMaskActive)
PaintCorrectionMaskMasksMaskBlendModeinteger_(PaintBasedCorrectionsCorrectionMasksMasksMaskBlendMode)
PaintCorrectionMaskMasksMaskDigeststring_(PaintBasedCorrectionsCorrectionMasksMasksMaskDigest)
PaintCorrectionMaskMasksMaskInvertedboolean_(PaintBasedCorrectionsCorrectionMasksMasksMaskInverted)
PaintCorrectionMaskMasksMaskNamestring_(PaintBasedCorrectionsCorrectionMasksMasksMaskName)
PaintCorrectionMaskMasksMaskSubTypestring_(PaintBasedCorrectionsCorrectionMasksMasksMaskSubType)
PaintCorrectionMaskMasksMaskSyncIDstring_(PaintBasedCorrectionsCorrectionMasksMasksMaskSyncID)
PaintCorrectionMaskMasksValuereal_(PaintBasedCorrectionsCorrectionMasksMasksMaskValue)
PaintCorrectionMaskMasksMaskVersionstring_(PaintBasedCorrectionsCorrectionMasksMasksMaskVersion)
PaintCorrectionMaskMasksMidpointreal_(PaintBasedCorrectionsCorrectionMasksMasksMidpoint)
PaintCorrectionMaskMasksOriginstring_(PaintBasedCorrectionsCorrectionMasksMasksOrigin)
PaintCorrectionMaskMasksPerimeterValuereal_(PaintBasedCorrectionsCorrectionMasksMasksPerimeterValue)
PaintCorrectionMaskMasksRadiusreal_(PaintBasedCorrectionsCorrectionMasksMasksRadius)
PaintCorrectionMaskMasksReferencePointstring_(PaintBasedCorrectionsCorrectionMasksMasksReferencePoint)
PaintCorrectionMaskMasksRightreal_(PaintBasedCorrectionsCorrectionMasksMasksRight)
PaintCorrectionMaskMasksRoundnessreal_(PaintBasedCorrectionsCorrectionMasksMasksRoundness)
PaintCorrectionMaskMasksSizeXreal_(PaintBasedCorrectionsCorrectionMasksMasksSizeX)
PaintCorrectionMaskMasksSizeYreal_(PaintBasedCorrectionsCorrectionMasksMasksSizeY)
PaintCorrectionMaskMasksTopreal_(PaintBasedCorrectionsCorrectionMasksMasksTop)
PaintCorrectionMaskMaskSubTypestring_(PaintBasedCorrectionsCorrectionMasksMaskSubType)
PaintCorrectionMaskMasksVersioninteger_(PaintBasedCorrectionsCorrectionMasksMasksVersion)
PaintCorrectionMaskMasksWhatstring_(PaintBasedCorrectionsCorrectionMasksMasksWhat)
PaintCorrectionMaskMasksWholeImageAreastring_(PaintBasedCorrectionsCorrectionMasksMasksWholeImageArea)
PaintCorrectionMaskMasksXreal_(PaintBasedCorrectionsCorrectionMasksMasksX)
PaintCorrectionMaskMasksYreal_(PaintBasedCorrectionsCorrectionMasksMasksY)
PaintCorrectionMaskMaskSyncIDstring_(PaintBasedCorrectionsCorrectionMasksMaskSyncID)
PaintCorrectionMaskMasksZeroXreal_(PaintBasedCorrectionsCorrectionMasksMasksZeroX)
PaintCorrectionMaskMasksZeroYreal_(PaintBasedCorrectionsCorrectionMasksMasksZeroY)
PaintCorrectionMaskValuereal_(PaintBasedCorrectionsCorrectionMasksMaskValue)
PaintCorrectionMaskMaskVersionstring_(PaintBasedCorrectionsCorrectionMasksMaskVersion)
PaintCorrectionMaskMidpointreal_(PaintBasedCorrectionsCorrectionMasksMidpoint)
PaintCorrectionMaskOriginstring_(PaintBasedCorrectionsCorrectionMasksOrigin)
PaintCorrectionMaskPerimeterValuereal_(PaintBasedCorrectionsCorrectionMasksPerimeterValue)
PaintCorrectionMaskRadiusreal_(PaintBasedCorrectionsCorrectionMasksRadius)
PaintCorrectionMaskReferencePointstring_(PaintBasedCorrectionsCorrectionMasksReferencePoint)
PaintCorrectionMaskRightreal_(PaintBasedCorrectionsCorrectionMasksRight)
PaintCorrectionMaskRoundnessreal_(PaintBasedCorrectionsCorrectionMasksRoundness)
PaintCorrectionMaskSizeXreal_(PaintBasedCorrectionsCorrectionMasksSizeX)
PaintCorrectionMaskSizeYreal_(PaintBasedCorrectionsCorrectionMasksSizeY)
PaintCorrectionMaskTopreal_(PaintBasedCorrectionsCorrectionMasksTop)
PaintCorrectionMaskVersioninteger_(PaintBasedCorrectionsCorrectionMasksVersion)
PaintCorrectionMaskWhatstring_(PaintBasedCorrectionsCorrectionMasksWhat)
PaintCorrectionMaskWholeImageAreastring_(PaintBasedCorrectionsCorrectionMasksWholeImageArea)
PaintCorrectionMaskXreal_(PaintBasedCorrectionsCorrectionMasksX)
PaintCorrectionMaskYreal_(PaintBasedCorrectionsCorrectionMasksY)
PaintCorrectionMaskZeroXreal_(PaintBasedCorrectionsCorrectionMasksZeroX)
PaintCorrectionMaskZeroYreal_(PaintBasedCorrectionsCorrectionMasksZeroY)
PaintCorrectionCorrectionNamestring_+(PaintBasedCorrectionsCorrectionName)
PaintCorrectionRangeMaskstruct_+--> CorrRangeMask Struct +
(PaintBasedCorrectionsCorrectionRangeMask; called CorrectionRangeMask by the spec)
PaintCorrectionRangeMaskAreaModelsstruct_+--> AreaModels Struct +
(PaintBasedCorrectionsCorrectionRangeMaskAreaModels)
PaintCorrectionRangeMaskAreaModelsComponentsstring_+(PaintBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents)
PaintCorrectionRangeMaskAreaModelsColorSampleInfostring_+(PaintBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
PaintCorrectionRangeMaskColorAmountreal_+(PaintBasedCorrectionsCorrectionRangeMaskColorAmount)
PaintCorrectionRangeMaskDepthFeatherreal_+(PaintBasedCorrectionsCorrectionRangeMaskDepthFeather)
PaintCorrectionRangeMaskDepthMaxreal_+(PaintBasedCorrectionsCorrectionRangeMaskDepthMax)
PaintCorrectionRangeMaskDepthMinreal_+(PaintBasedCorrectionsCorrectionRangeMaskDepthMin)
PaintCorrectionRangeMaskInvertboolean_+(PaintBasedCorrectionsCorrectionRangeMaskInvert)
PaintCorrectionRangeMaskLumFeatherreal_+(PaintBasedCorrectionsCorrectionRangeMaskLumFeather)
PaintCorrectionRangeMaskLuminanceDepthSampleInfostring_+(PaintBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo)
PaintCorrectionRangeMaskLumMaxreal_+(PaintBasedCorrectionsCorrectionRangeMaskLumMax)
PaintCorrectionRangeMaskLumMinreal_+(PaintBasedCorrectionsCorrectionRangeMaskLumMin)
PaintCorrectionRangeMaskLumRangestring_+(PaintBasedCorrectionsCorrectionRangeMaskLumRange)
PaintCorrectionRangeMaskSampleTypeinteger_+(PaintBasedCorrectionsCorrectionRangeMaskSampleType)
PaintCorrectionRangeMaskTypestring_+(PaintBasedCorrectionsCorrectionRangeMaskType)
PaintCorrectionRangeMaskVersionstring_+(PaintBasedCorrectionsCorrectionRangeMaskVersion)
PaintCorrectionCorrectionSyncIDstring_+(PaintBasedCorrectionsCorrectionSyncID)
PaintCorrectionBlacks2012real_(PaintBasedCorrectionsLocalBlacks2012)
PaintCorrectionBrightnessreal_(PaintBasedCorrectionsLocalBrightness)
PaintCorrectionClarityreal_(PaintBasedCorrectionsLocalClarity)
PaintCorrectionClarity2012real_(PaintBasedCorrectionsLocalClarity2012)
PaintCorrectionContrastreal_(PaintBasedCorrectionsLocalContrast)
PaintCorrectionContrast2012real_(PaintBasedCorrectionsLocalContrast2012)
PaintCorrectionDefringereal_(PaintBasedCorrectionsLocalDefringe)
PaintCorrectionDehazereal_(PaintBasedCorrectionsLocalDehaze)
PaintCorrectionExposurereal_(PaintBasedCorrectionsLocalExposure)
PaintCorrectionExposure2012real_(PaintBasedCorrectionsLocalExposure2012)
PaintCorrectionHighlights2012real_(PaintBasedCorrectionsLocalHighlights2012)
PaintCorrectionHuereal_(PaintBasedCorrectionsLocalHue)
PaintCorrectionLuminanceNoisereal_(PaintBasedCorrectionsLocalLuminanceNoise)
PaintCorrectionMoirereal_(PaintBasedCorrectionsLocalMoire)
PaintCorrectionSaturationreal_(PaintBasedCorrectionsLocalSaturation)
PaintCorrectionShadows2012real_(PaintBasedCorrectionsLocalShadows2012)
PaintCorrectionSharpnessreal_(PaintBasedCorrectionsLocalSharpness)
PaintCorrectionTemperaturereal_(PaintBasedCorrectionsLocalTemperature)
PaintCorrectionTexturereal_(PaintBasedCorrectionsLocalTexture)
PaintCorrectionTintreal_(PaintBasedCorrectionsLocalTint)
PaintCorrectionToningHuereal_(PaintBasedCorrectionsLocalToningHue)
PaintCorrectionToningSaturationreal_(PaintBasedCorrectionsLocalToningSaturation)
PaintCorrectionWhites2012real_(PaintBasedCorrectionsLocalWhites2012)
PaintCorrectionWhatstring_(PaintBasedCorrectionsWhat)
ParametricDarksinteger 
ParametricHighlightsinteger 
ParametricHighlightSplitinteger 
ParametricLightsinteger 
ParametricMidtoneSplitinteger 
ParametricShadowsinteger 
ParametricShadowSplitinteger 
PerspectiveAspectinteger 
PerspectiveHorizontalinteger 
PerspectiveRotatereal 
PerspectiveScaleinteger 
PerspectiveUprightinteger 
PerspectiveVerticalinteger 
PerspectiveXreal 
PerspectiveYreal 
PostCropVignetteAmountinteger 
PostCropVignetteFeatherinteger 
PostCropVignetteHighlightContrastinteger 
PostCropVignetteMidpointinteger 
PostCropVignetteRoundnessinteger 
PostCropVignetteStyleinteger 
PresetTypestring 
ProcessVersionstring 
RangeMaskstruct--> RangeMask Struct +
(called RangeMaskMapInfo by the spec)
RangeMaskMapInfostruct_--> MapInfo Struct +
(RangeMaskMapInfoRangeMaskMapInfo)
RangeMaskMapInfoLabMaxstring_(RangeMaskMapInfoRangeMaskMapInfoLabMax)
RangeMaskMapInfoLabMinstring_(RangeMaskMapInfoRangeMaskMapInfoLabMin)
RangeMaskMapInfoLumEqstring_+(RangeMaskMapInfoRangeMaskMapInfoLumEq)
RangeMaskMapInfoRGBMaxstring_(RangeMaskMapInfoRangeMaskMapInfoRGBMax)
RangeMaskMapInfoRGBMinstring_(RangeMaskMapInfoRangeMaskMapInfoRGBMin)
RawFileNamestring 
RedEyeInfostring+ 
RedHueinteger 
RedSaturationinteger 
RetouchAreasstruct+--> RetouchArea Struct
RetouchAreaFeatherreal_(RetouchAreasFeather)
RetouchAreaMasksstruct_+--> CorrectionMask Struct +
(RetouchAreasMasks)
RetouchAreaMaskAlphareal_(RetouchAreasMasksAlpha)
RetouchAreaMaskAnglereal_(RetouchAreasMasksAngle)
RetouchAreaMaskBottomreal_(RetouchAreasMasksBottom)
RetouchAreaMaskCenterValuereal_(RetouchAreasMasksCenterValue)
RetouchAreaMaskCenterWeightreal_(RetouchAreasMasksCenterWeight)
RetouchAreaMaskRangestruct_+--> CorrRangeMask Struct +
(RetouchAreasMasksCorrectionRangeMask; called CorrectionRangeMask by the spec)
RetouchAreaMaskRangeAreaModelsstruct_+--> AreaModels Struct +
(RetouchAreasMasksCorrectionRangeMaskAreaModels)
RetouchAreaMaskRangeAreaModelsComponentsstring_+(RetouchAreasMasksCorrectionRangeMaskAreaModelsAreaComponents)
RetouchAreaMaskRangeAreaModelsColorSampleInfostring_+(RetouchAreasMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo)
RetouchAreaMaskRangeColorAmountreal_+(RetouchAreasMasksCorrectionRangeMaskColorAmount)
RetouchAreaMaskRangeDepthFeatherreal_+(RetouchAreasMasksCorrectionRangeMaskDepthFeather)
RetouchAreaMaskRangeDepthMaxreal_+(RetouchAreasMasksCorrectionRangeMaskDepthMax)
RetouchAreaMaskRangeDepthMinreal_+(RetouchAreasMasksCorrectionRangeMaskDepthMin)
RetouchAreaMaskRangeInvertboolean_+(RetouchAreasMasksCorrectionRangeMaskInvert)
RetouchAreaMaskRangeLumFeatherreal_+(RetouchAreasMasksCorrectionRangeMaskLumFeather)
RetouchAreaMaskRangeLuminanceDepthSampleInfostring_+(RetouchAreasMasksCorrectionRangeMaskLuminanceDepthSampleInfo)
RetouchAreaMaskRangeLumMaxreal_+(RetouchAreasMasksCorrectionRangeMaskLumMax)
RetouchAreaMaskRangeLumMinreal_+(RetouchAreasMasksCorrectionRangeMaskLumMin)
RetouchAreaMaskRangeLumRangestring_+(RetouchAreasMasksCorrectionRangeMaskLumRange)
RetouchAreaMaskRangeSampleTypeinteger_+(RetouchAreasMasksCorrectionRangeMaskSampleType)
RetouchAreaMaskRangeTypestring_+(RetouchAreasMasksCorrectionRangeMaskType)
RetouchAreaMaskRangeVersionstring_+(RetouchAreasMasksCorrectionRangeMaskVersion)
RetouchAreaMaskDabsstring_(RetouchAreasMasksDabs)
RetouchAreaMaskFeatherreal_(RetouchAreasMasksFeather)
RetouchAreaMaskFlippedboolean_(RetouchAreasMasksFlipped)
RetouchAreaMaskFlowreal_(RetouchAreasMasksFlow)
RetouchAreaMaskFullXreal_(RetouchAreasMasksFullX)
RetouchAreaMaskFullYreal_(RetouchAreasMasksFullY)
RetouchAreaMaskInputDigeststring_(RetouchAreasMasksInputDigest)
RetouchAreaMaskLeftreal_(RetouchAreasMasksLeft)
RetouchAreaMaskMaskActiveboolean_(RetouchAreasMasksMaskActive)
RetouchAreaMaskMaskBlendModeinteger_(RetouchAreasMasksMaskBlendMode)
RetouchAreaMaskMaskDigeststring_(RetouchAreasMasksMaskDigest)
RetouchAreaMaskMaskInvertedboolean_(RetouchAreasMasksMaskInverted)
RetouchAreaMaskMaskNamestring_(RetouchAreasMasksMaskName)
RetouchAreaMaskMasksstruct_+--> CorrectionMask Struct +
(RetouchAreasMasksMasks)
RetouchAreaMaskMasksAlphareal_(RetouchAreasMasksMasksAlpha)
RetouchAreaMaskMasksAnglereal_(RetouchAreasMasksMasksAngle)
RetouchAreaMaskMasksBottomreal_(RetouchAreasMasksMasksBottom)
RetouchAreaMaskMasksCenterValuereal_(RetouchAreasMasksMasksCenterValue)
RetouchAreaMaskMasksCenterWeightreal_(RetouchAreasMasksMasksCenterWeight)
RetouchAreaMaskMasksDabsstring_+(RetouchAreasMasksMasksDabs)
RetouchAreaMaskMasksFeatherreal_(RetouchAreasMasksMasksFeather)
RetouchAreaMaskMasksFlippedboolean_(RetouchAreasMasksMasksFlipped)
RetouchAreaMaskMasksFlowreal_(RetouchAreasMasksMasksFlow)
RetouchAreaMaskMasksFullXreal_(RetouchAreasMasksMasksFullX)
RetouchAreaMaskMasksFullYreal_(RetouchAreasMasksMasksFullY)
RetouchAreaMaskMasksInputDigeststring_(RetouchAreasMasksMasksInputDigest)
RetouchAreaMaskMasksLeftreal_(RetouchAreasMasksMasksLeft)
RetouchAreaMaskMasksMaskActiveboolean_(RetouchAreasMasksMasksMaskActive)
RetouchAreaMaskMasksMaskBlendModeinteger_(RetouchAreasMasksMasksMaskBlendMode)
RetouchAreaMaskMasksMaskDigeststring_(RetouchAreasMasksMasksMaskDigest)
RetouchAreaMaskMasksMaskInvertedboolean_(RetouchAreasMasksMasksMaskInverted)
RetouchAreaMaskMasksMaskNamestring_(RetouchAreasMasksMasksMaskName)
RetouchAreaMaskMasksMaskSubTypestring_(RetouchAreasMasksMasksMaskSubType)
RetouchAreaMaskMasksMaskSyncIDstring_(RetouchAreasMasksMasksMaskSyncID)
RetouchAreaMaskMasksValuereal_(RetouchAreasMasksMasksMaskValue)
RetouchAreaMaskMasksMaskVersionstring_(RetouchAreasMasksMasksMaskVersion)
RetouchAreaMaskMasksMidpointreal_(RetouchAreasMasksMasksMidpoint)
RetouchAreaMaskMasksOriginstring_(RetouchAreasMasksMasksOrigin)
RetouchAreaMaskMasksPerimeterValuereal_(RetouchAreasMasksMasksPerimeterValue)
RetouchAreaMaskMasksRadiusreal_(RetouchAreasMasksMasksRadius)
RetouchAreaMaskMasksReferencePointstring_(RetouchAreasMasksMasksReferencePoint)
RetouchAreaMaskMasksRightreal_(RetouchAreasMasksMasksRight)
RetouchAreaMaskMasksRoundnessreal_(RetouchAreasMasksMasksRoundness)
RetouchAreaMaskMasksSizeXreal_(RetouchAreasMasksMasksSizeX)
RetouchAreaMaskMasksSizeYreal_(RetouchAreasMasksMasksSizeY)
RetouchAreaMaskMasksTopreal_(RetouchAreasMasksMasksTop)
RetouchAreaMaskMaskSubTypestring_(RetouchAreasMasksMaskSubType)
RetouchAreaMaskMasksVersioninteger_(RetouchAreasMasksMasksVersion)
RetouchAreaMaskMasksWhatstring_(RetouchAreasMasksMasksWhat)
RetouchAreaMaskMasksWholeImageAreastring_(RetouchAreasMasksMasksWholeImageArea)
RetouchAreaMaskMasksXreal_(RetouchAreasMasksMasksX)
RetouchAreaMaskMasksYreal_(RetouchAreasMasksMasksY)
RetouchAreaMaskMaskSyncIDstring_(RetouchAreasMasksMaskSyncID)
RetouchAreaMaskMasksZeroXreal_(RetouchAreasMasksMasksZeroX)
RetouchAreaMaskMasksZeroYreal_(RetouchAreasMasksMasksZeroY)
RetouchAreaMaskValuereal_(RetouchAreasMasksMaskValue)
RetouchAreaMaskMaskVersionstring_(RetouchAreasMasksMaskVersion)
RetouchAreaMaskMidpointreal_(RetouchAreasMasksMidpoint)
RetouchAreaMaskOriginstring_(RetouchAreasMasksOrigin)
RetouchAreaMaskPerimeterValuereal_(RetouchAreasMasksPerimeterValue)
RetouchAreaMaskRadiusreal_(RetouchAreasMasksRadius)
RetouchAreaMaskReferencePointstring_(RetouchAreasMasksReferencePoint)
RetouchAreaMaskRightreal_(RetouchAreasMasksRight)
RetouchAreaMaskRoundnessreal_(RetouchAreasMasksRoundness)
RetouchAreaMaskSizeXreal_(RetouchAreasMasksSizeX)
RetouchAreaMaskSizeYreal_(RetouchAreasMasksSizeY)
RetouchAreaMaskTopreal_(RetouchAreasMasksTop)
RetouchAreaMaskVersioninteger_(RetouchAreasMasksVersion)
RetouchAreaMaskWhatstring_(RetouchAreasMasksWhat)
RetouchAreaMaskWholeImageAreastring_(RetouchAreasMasksWholeImageArea)
RetouchAreaMaskXreal_(RetouchAreasMasksX)
RetouchAreaMaskYreal_(RetouchAreasMasksY)
RetouchAreaMaskZeroXreal_(RetouchAreasMasksZeroX)
RetouchAreaMaskZeroYreal_(RetouchAreasMasksZeroY)
RetouchAreaMethodstring_(RetouchAreasMethod)
RetouchAreaOffsetYreal_(RetouchAreasOffsetY)
RetouchAreaOpacityreal_(RetouchAreasOpacity)
RetouchAreaSeedinteger_(RetouchAreasSeed)
RetouchAreaSourceStatestring_(RetouchAreasSourceState)
RetouchAreaSourceXreal_(RetouchAreasSourceX)
RetouchAreaSpotTypestring_(RetouchAreasSpotType)
RetouchInfostring+ 
Saturationinteger/ 
SaturationAdjustmentAquainteger 
SaturationAdjustmentBlueinteger 
SaturationAdjustmentGreeninteger 
SaturationAdjustmentMagentainteger 
SaturationAdjustmentOrangeinteger 
SaturationAdjustmentPurpleinteger 
SaturationAdjustmentRedinteger 
SaturationAdjustmentYellowinteger 
Shadowsinteger 
Shadows2012integer 
ShadowTintinteger 
SharpenDetailinteger 
SharpenEdgeMaskinginteger 
SharpenRadiusreal 
Sharpnessinteger/ 
ShortNamelang-alt 
Smoothnessinteger 
SortNamelang-alt 
SplitToningBalanceinteger(also used for newer ColorGrade settings)
SplitToningHighlightHueinteger(also used for newer ColorGrade settings)
SplitToningHighlightSaturationinteger(also used for newer ColorGrade settings)
SplitToningShadowHueinteger(also used for newer ColorGrade settings)
SplitToningShadowSaturationinteger(also used for newer ColorGrade settings)
SupportsAmountboolean 
SupportsColorboolean 
SupportsHighDynamicRangeboolean 
SupportsMonochromeboolean 
SupportsNormalDynamicRangeboolean 
SupportsOutputReferredboolean 
SupportsSceneReferredboolean 
ColorTemperatureinteger(called Temperature by the spec)
Textureinteger 
TIFFHandlingstring 
Tintinteger 
ToggleStyleAmountinteger 
ToggleStyleDigeststring 
ToneCurvestring+ 
ToneCurveBluestring+ 
ToneCurveGreenstring+ 
ToneCurveNamestring'Custom' = Custom +
'Linear' = Linear +
'Medium Contrast' = Medium Contrast +
'Strong Contrast' = Strong Contrast
ToneCurveName2012string 
ToneCurvePV2012string+ 
ToneCurvePV2012Bluestring+ 
ToneCurvePV2012Greenstring+ 
ToneCurvePV2012Redstring+ 
ToneCurveRedstring+ 
ToneMapStrengthreal 
UprightCenterModeinteger 
UprightCenterNormXreal 
UprightCenterNormYreal 
UprightDependentDigeststring 
UprightFocalLength35mmreal 
UprightFocalModeinteger 
UprightFourSegmentsCountinteger 
UprightPreviewboolean 
UprightTransform_0string 
UprightTransform_1string 
UprightTransform_2string 
UprightTransform_3string 
UprightTransform_4string 
UprightTransform_5string 
UprightTransformCountinteger 
UprightVersioninteger 
UUIDstring/ 
Versionstring 
Vibranceinteger 
VignetteAmountinteger 
VignetteMidpointinteger 
Whatstring 
WhiteBalancestring/ +
'As Shot' = As Shot +
'Auto' = Auto +
'Cloudy' = Cloudy +
'Custom' = Custom +
'Daylight' = Daylight +
'Flash' = Flash +
'Fluorescent' = Fluorescent +
'Shade' = Shade +
'Tungsten' = Tungsten
+
Whites2012integer 
+ +

XMP dc Tags

+

Dublin Core namespace tags.

+ +

These tags belong to the ExifTool XMP-dc family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Contributorstring+ 
Coveragestring 
Creatorstring+ 
Datedate+ 
Descriptionlang-alt 
Formatstring 
Identifierstring 
Languagestring+ 
Publisherstring+ 
Relationstring+ 
Rightslang-alt 
Sourcestring/ 
Subjectstring+ 
Titlelang-alt 
Typestring+ 
+ +

XMP Device Tags

+

Google depth-map Device tags. See +https://developer.android.com/training/camera2/Dynamic-depth-v1.0.pdf for +the specification.

+ +

These tags belong to the ExifTool XMP-Device family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AppInfostruct--> AppInfo Struct
AppInfoApplicationstring_ 
AppInfoItemURIstring_ 
AppInfoVersionstring_ 
Camerasstruct+--> DeviceCameras Struct
Camerastruct_+--> DeviceCamera Struct +
(CamerasCamera)
CameraAppInfostruct_+--> AppInfo Struct +
(CamerasCameraAppInfo)
CameraAppInfoApplicationstring_+(CamerasCameraAppInfoApplication)
CameraAppInfoItemURIstring_+(CamerasCameraAppInfoItemURI)
CameraAppInfoVersionstring_+(CamerasCameraAppInfoVersion)
CameraDepthMapstruct_+--> DeviceDepthMap Struct +
(CamerasCameraDepthMap)
CameraDepthMapConfidenceURIstring_+(CamerasCameraDepthMapConfidenceURI)
CameraDepthMapDepthURIstring_+(CamerasCameraDepthMapDepthURI)
CameraDepthMapFarreal_+(CamerasCameraDepthMapFar)
CameraDepthMapFocalTablestring_+(CamerasCameraDepthMapFocalTable)
CameraDepthMapFocalTableEntryCountinteger_+(CamerasCameraDepthMapFocalTableEntryCount)
CameraDepthMapFormatstring_+(CamerasCameraDepthMapFormat)
CameraDepthMapItemSemanticstring_+(CamerasCameraDepthMapItemSemantic)
CameraDepthMapMeasureTypestring_+(CamerasCameraDepthMapMeasureType)
CameraDepthMapNearreal_+(CamerasCameraDepthMapNear)
CameraDepthMapSoftwarestring_+(CamerasCameraDepthMapSoftware)
CameraDepthMapUnitsstring_+(CamerasCameraDepthMapUnits)
CameraImagestruct_+--> DeviceImage Struct +
(CamerasCameraImage)
CameraImageItemSemanticstring_+(CamerasCameraImageItemSemantic)
CameraImageItemURIstring_+(CamerasCameraImageItemURI)
CameraImagingModelstruct_+--> DeviceImagingModel Struct +
(CamerasCameraImagingModel)
CameraImagingModelDistortionstring_+(CamerasCameraImagingModelDistortion)
CameraImagingModelDistortionCountinteger_+(CamerasCameraImagingModelDistortionCount)
CameraImagingModelFocalLengthXreal_+(CamerasCameraImagingModelFocalLengthX)
CameraImagingModelFocalLengthYreal_+(CamerasCameraImagingModelFocalLengthY)
CameraImagingModelImageHeightinteger_+(CamerasCameraImagingModelImageHeight)
CameraImagingModelImageWidthinteger_+(CamerasCameraImagingModelImageWidth)
CameraImagingModelPixelAspectRatioreal_+(CamerasCameraImagingModelPixelAspectRatio)
CameraImagingModelPrincipalPointXreal_+(CamerasCameraImagingModelPrincipalPointX)
CameraImagingModelPrincipalPointYreal_+(CamerasCameraImagingModelPrincipalPointY)
CameraImagingModelSkewreal_+(CamerasCameraImagingModelSkew)
CameraLightEstimatestruct_+--> DeviceLightEstimate Struct +
(CamerasCameraLightEstimate)
CameraLightEstimateColorCorrectionBreal_+(CamerasCameraLightEstimateColorCorrectionB)
CameraLightEstimateColorCorrectionGreal_+(CamerasCameraLightEstimateColorCorrectionG)
CameraLightEstimateColorCorrectionRreal_+(CamerasCameraLightEstimateColorCorrectionR)
CameraLightEstimatePixelIntensityreal_+(CamerasCameraLightEstimatePixelIntensity)
CameraPointCloudstruct_+--> DevicePointCloud Struct +
(CamerasCameraPointCloud)
CameraPointCloudMetricboolean_+(CamerasCameraPointCloudMetric)
CameraPointCloudPointCloudinteger_+(CamerasCameraPointCloudPointCloud)
CameraPointCloudPointsstring_+(CamerasCameraPointCloudPoints)
CameraPosestruct_+--> Pose Struct +
(CamerasCameraPose)
CameraPosePositionXreal_+(CamerasCameraPosePositionX)
CameraPosePositionYreal_+(CamerasCameraPosePositionY)
CameraPosePositionZreal_+(CamerasCameraPosePositionZ)
CameraPoseRotationWreal_+(CamerasCameraPoseRotationW)
CameraPoseRotationXreal_+(CamerasCameraPoseRotationX)
CameraPoseRotationYreal_+(CamerasCameraPoseRotationY)
CameraPoseRotationZreal_+(CamerasCameraPoseRotationZ)
CameraPoseTimestampinteger_+(CamerasCameraPoseTimestamp)
CameraTraitstring_+(CamerasCameraTrait)
CameraVendorInfostruct_+--> VendorInfo Struct +
(CamerasCameraVendorInfo)
CameraVendorInfoManufacturerstring_+(CamerasCameraVendorInfoManufacturer)
CameraVendorInfoModelstring_+(CamerasCameraVendorInfoModel)
CameraVendorInfoNotesstring_+(CamerasCameraVendorInfoNotes)
Containerstruct--> DeviceContainer Struct
ContainerDirectorystruct_+--> DeviceDirectory Struct
ContainerDirectoryItemstruct_+--> DeviceItem Struct
ContainerDirectoryItemDataURIstring_+ 
ContainerDirectoryItemLengthinteger_+ 
ContainerDirectoryItemMimestring_+ 
ContainerDirectoryItemPaddinginteger_+ 
EarthPosstruct--> EarthPose Struct
EarthPosAltitudereal_ 
EarthPosLatitudereal_ 
EarthPosLongitudereal_ 
EarthPosRotationWreal_ 
EarthPosRotationXreal_ 
EarthPosRotationYreal_ 
EarthPosRotationZreal_ 
EarthPosTimestampinteger_ 
Planesstruct+--> DevicePlanes Struct
Planestruct_+--> DevicePlane Struct +
(PlanesPlane)
PlaneBoundarystring_+(PlanesPlaneBoundary)
PlaneBoundaryVertexCountinteger_+(PlanesPlaneBoundaryVertexCount)
PlaneExtentXreal_+(PlanesPlaneExtentX)
PlaneExtentZreal_+(PlanesPlaneExtentZ)
PlanePosestruct_+--> Pose Struct +
(PlanesPlanePose)
PlanePosePositionXreal_+(PlanesPlanePosePositionX)
PlanePosePositionYreal_+(PlanesPlanePosePositionY)
PlanePosePositionZreal_+(PlanesPlanePosePositionZ)
PlanePoseRotationWreal_+(PlanesPlanePoseRotationW)
PlanePoseRotationXreal_+(PlanesPlanePoseRotationX)
PlanePoseRotationYreal_+(PlanesPlanePoseRotationY)
PlanePoseRotationZreal_+(PlanesPlanePoseRotationZ)
PlanePoseTimestampinteger_+(PlanesPlanePoseTimestamp)
Posestruct--> Pose Struct
PosePositionXreal_ 
PosePositionYreal_ 
PosePositionZreal_ 
PoseRotationWreal_ 
PoseRotationXreal_ 
PoseRotationYreal_ 
PoseRotationZreal_ 
PoseTimestampinteger_ 
Profilesstruct+--> DeviceProfiles Struct
Profilestruct_+--> DeviceProfile Struct +
(ProfilesProfile)
ProfileCameraIndicesinteger_+(ProfilesProfileCameraIndices)
ProfileTypestring_+(ProfilesProfileType)
VendorInfostruct--> VendorInfo Struct
VendorInfoManufacturerstring_ 
VendorInfoModelstring_ 
VendorInfoNotesstring_ 
+ +

XMP AppInfo Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Applicationstring 
ItemURIstring 
Versionstring 
+ +

XMP DeviceCameras Struct

+
+
+ + + + + + + +
Field NameWritableValues / Notes
CameraDeviceCamera--> DeviceCamera Struct
+ +

XMP DeviceCamera Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
AppInfoAppInfo--> AppInfo Struct
DepthMapDeviceDepthMap--> DeviceDepthMap Struct
ImageDeviceImage--> DeviceImage Struct
ImagingModelDeviceImagingModel--> DeviceImagingModel Struct
LightEstimateDeviceLightEstimate--> DeviceLightEstimate Struct
PointCloudDevicePointCloud--> DevicePointCloud Struct
PosePose--> Pose Struct
Traitstring 
VendorInfoVendorInfo--> VendorInfo Struct
+ +

XMP DeviceDepthMap Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
ConfidenceURIstring 
DepthURIstring 
Farreal 
FocalTablestring 
FocalTableEntryCountinteger 
Formatstring 
ItemSemanticstring 
MeasureTypestring 
Nearreal 
Softwarestring 
Unitsstring 
+ +

XMP DeviceImage Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
ItemSemanticstring 
ItemURIstring 
+ +

XMP DeviceImagingModel Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Distortionstring 
DistortionCountinteger 
FocalLengthXreal 
FocalLengthYreal 
ImageHeightinteger 
ImageWidthinteger 
PixelAspectRatioreal 
PrincipalPointXreal 
PrincipalPointYreal 
Skewreal 
+ +

XMP DeviceLightEstimate Struct

+
+
+ + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
ColorCorrectionBreal 
ColorCorrectionGreal 
ColorCorrectionRreal 
PixelIntensityreal 
+ +

XMP DevicePointCloud Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Metricboolean 
PointCloudinteger 
Pointsstring 
+ +

XMP Pose Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
PositionXreal 
PositionYreal 
PositionZreal 
RotationWreal 
RotationXreal 
RotationYreal 
RotationZreal 
Timestampinteger 
+ +

XMP VendorInfo Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Manufacturerstring 
Modelstring 
Notesstring 
+ +

XMP DeviceContainer Struct

+
+
+ + + + + + + +
Field NameWritableValues / Notes
DirectoryDeviceDirectory+--> DeviceDirectory Struct
+ +

XMP DeviceDirectory Struct

+
+
+ + + + + + + +
Field NameWritableValues / Notes
ItemDeviceItem--> DeviceItem Struct
+ +

XMP DeviceItem Struct

+
+
+ + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
DataURIstring 
Lengthinteger 
Mimestring 
Paddinginteger 
+ +

XMP EarthPose Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Altitudereal 
Latitudereal 
Longitudereal 
RotationWreal 
RotationXreal 
RotationYreal 
RotationZreal 
Timestampinteger 
+ +

XMP DevicePlanes Struct

+
+
+ + + + + + + +
Field NameWritableValues / Notes
PlaneDevicePlane--> DevicePlane Struct
+ +

XMP DevicePlane Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Boundarystring 
BoundaryVertexCountinteger 
ExtentXreal 
ExtentZreal 
PosePose--> Pose Struct
+ +

XMP DeviceProfiles Struct

+
+
+ + + + + + + +
Field NameWritableValues / Notes
ProfileDeviceProfile--> DeviceProfile Struct
+ +

XMP DeviceProfile Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
CameraIndicesinteger+ 
Typestring 
+ +

XMP dex Tags

+

Description Explorer namespace tags. These tags are not very common. The +Source and Rating tags are avoided when writing due to name conflicts with +other XMP tags. (see http://www.optimasc.com/products/fileid/)

+ +

These tags belong to the ExifTool XMP-dex family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
CRC32integer 
FFIDstring 
LicenseTypestring +
'adware' = Adware +
'commercial' = Commercial +
'demo' = Demo +
'freeware' = Freeware +
'open source' = Open Source +
'public domain' = Public Domain +
'shareware' = Shareware +
'unknown' = Unknown
+
OSinteger 
Ratingstring/ 
Revisionstring 
ShortDescriptionlang-alt 
Sourcestring/ 
+ +

XMP DICOM Tags

+

DICOM namespace tags. These XMP tags allow some DICOM information to be +stored in files of other than DICOM format. See the +DICOM Tags documentation for a list +of tags available in DICOM-format files.

+ +

These tags belong to the ExifTool XMP-DICOM family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
EquipmentInstitutionstring 
EquipmentManufacturerstring 
PatientBirthDatedate(called PatientDOB by the spec)
PatientIDstring 
PatientNamestring 
PatientSexstring 
SeriesDateTimedate 
SeriesDescriptionstring 
SeriesModalitystring 
SeriesNumberstring 
StudyDateTimedate 
StudyDescriptionstring 
StudyIDstring 
StudyPhysicianstring 
+ +

XMP digiKam Tags

+

DigiKam namespace tags.

+ +

These tags belong to the ExifTool XMP-digiKam family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
CaptionsAuthorNameslang-alt 
CaptionsDateTimeStampslang-alt 
ColorLabelstring 
ImageHistorystring/(different format from EXIF:ImageHistory)
ImageUniqueIDstring/ 
LensCorrectionSettingsstring 
PickLabelstring 
TagsListstring+ 
+ +

XMP exif Tags

+

EXIF namespace for EXIF tags. See +https://web.archive.org/web/20180921145139if_/http://www.cipa.jp:80/std/documents/e/DC-010-2017_E.pdf +for the specification.

+ +

These tags belong to the ExifTool XMP-exif family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
ApertureValuerational 
BrightnessValuerational 
CFAPatternstruct--> CFAPattern Struct
CFAPatternColumnsinteger_ 
CFAPatternRowsinteger_ 
CFAPatternValuesinteger_+ 
ColorSpaceinteger1 = sRGB +
2 = Adobe RGB +
65535 = Uncalibrated
ComponentsConfigurationinteger+ + +
0 = - +
1 = Y +
2 = Cb +
3 = Cr
  4 = R +
5 = G +
6 = B
+
CompressedBitsPerPixelrational 
Contrastinteger0 = Normal +
1 = Low +
2 = High
CustomRenderedinteger0 = Normal +
1 = Custom
DateTimeDigitizeddate 
DateTimeOriginaldate 
DeviceSettingDescriptionstruct--> DeviceSettings Struct
DeviceSettingDescriptionColumnsinteger_ 
DeviceSettingDescriptionRowsinteger_ 
DeviceSettingDescriptionSettingsstring_+ 
DigitalZoomRatiorational 
ExifVersionstring 
ExposureCompensationrational(called ExposureBiasValue by the spec)
ExposureIndexrational 
ExposureModeinteger0 = Auto +
1 = Manual +
2 = Auto bracket
ExposurePrograminteger +
0 = Not Defined +
1 = Manual +
2 = Program AE +
3 = Aperture-priority AE +
4 = Shutter speed priority AE +
5 = Creative (Slow speed) +
6 = Action (High speed) +
7 = Portrait +
8 = Landscape
+
ExposureTimerational 
FileSourceinteger1 = Film Scanner +
2 = Reflection Print Scanner +
3 = Digital Camera
Flashstruct--> Flash Struct
FlashEnergyrational 
FlashFiredboolean_'False' = False +
'True' = True
FlashFunctionboolean_'False' = False +
'True' = True
FlashModeinteger_0 = Unknown +
1 = On +
2 = Off +
3 = Auto
FlashpixVersionstring 
FlashRedEyeModeboolean_'False' = False +
'True' = True
FlashReturninteger_0 = No return detection +
2 = Return not detected +
3 = Return detected
FNumberrational 
FocalLengthrational 
FocalLengthIn35mmFormatinteger(called FocalLengthIn35mmFilm by the spec)
FocalPlaneResolutionUnitinteger(values 1, 4 and 5 are not standard EXIF) +
1 = None +
2 = inches +
3 = cm +
4 = mm +
5 = um
FocalPlaneXResolutionrational 
FocalPlaneYResolutionrational 
GainControlinteger0 = None +
1 = Low gain up +
2 = High gain up +
3 = Low gain down +
4 = High gain down
GPSAltituderational 
GPSAltitudeRefinteger0 = Above Sea Level +
1 = Below Sea Level
GPSAreaInformationstring 
GPSDestBearingrational 
GPSDestBearingRefstring'M' = Magnetic North +
'T' = True North
GPSDestDistancerational 
GPSDestDistanceRefstring'K' = Kilometers +
'M' = Miles +
'N' = Nautical Miles
GPSDestLatitudestring 
GPSDestLongitudestring 
GPSDifferentialinteger0 = No Correction +
1 = Differential Corrected
GPSDOPrational 
GPSHPositioningErrorrational 
GPSImgDirectionrational 
GPSImgDirectionRefstring'M' = Magnetic North +
'T' = True North
GPSLatitudestring 
GPSLongitudestring 
GPSMapDatumstring 
GPSMeasureModeinteger2 = 2-Dimensional Measurement +
3 = 3-Dimensional Measurement
GPSProcessingMethodstring 
GPSSatellitesstring 
GPSSpeedrational 
GPSSpeedRefstring'K' = km/h +
'M' = mph +
'N' = knots
GPSStatusstring'A' = Measurement Active +
'V' = Measurement Void
GPSDateTimedate(called GPSTimeStamp by the spec; a date/time tag called GPSTimeStamp by the XMP specification. This tag is +renamed here to prevent direct copy from EXIF:GPSTimeStamp which is a +time-only tag. Instead, the value of this tag should be taken from +Composite:GPSDateTime when copying from EXIF)
GPSTrackrational 
GPSTrackRefstring'M' = Magnetic North +
'T' = True North
GPSVersionIDstring 
ImageUniqueIDstring 
ISOinteger+(called ISOSpeedRatings by the spec)
LightSourcestring--> EXIF LightSource Values
MakerNotestring 
MaxApertureValuerational 
MeteringModeinteger +
1 = Average +
2 = Center-weighted average +
3 = Spot +
4 = Multi-spot +
5 = Multi-segment +
6 = Partial +
255 = Other
+
NativeDigeststring 
Opto-ElectricConvFactorstruct--> OECF Struct +
(called OECF by the spec)
OECFColumnsinteger_ 
OECFNamesstring_+ 
OECFRowsinteger_ 
OECFValuesrational_+ 
ExifImageWidthinteger(called PixelXDimension by the spec)
ExifImageHeightinteger(called PixelYDimension by the spec)
RelatedSoundFilestring 
Saturationinteger0 = Normal +
1 = Low +
2 = High
SceneCaptureTypeinteger0 = Standard +
1 = Landscape +
2 = Portrait +
3 = Night
SceneTypeinteger1 = Directly photographed
SensingMethodinteger(values 1 and 6 are not standard EXIF) +
1 = Monochrome area +
2 = One-chip color area +
3 = Two-chip color area +
4 = Three-chip color area +
5 = Color sequential area +
6 = Monochrome linear +
7 = Trilinear +
8 = Color sequential linear
+
Sharpnessinteger0 = Normal +
1 = Soft +
2 = Hard
ShutterSpeedValuerational 
SpatialFrequencyResponsestruct--> OECF Struct
SpatialFrequencyResponseColumnsinteger_ 
SpatialFrequencyResponseNamesstring_+ 
SpatialFrequencyResponseRowsinteger_ 
SpatialFrequencyResponseValuesrational_+ 
SpectralSensitivitystring 
SubjectAreainteger+ 
SubjectDistancerational 
SubjectDistanceRangeinteger0 = Unknown +
1 = Macro +
2 = Close +
3 = Distant
SubjectLocationinteger+ 
UserCommentlang-alt 
WhiteBalanceinteger0 = Auto +
1 = Manual
+ +

XMP CFAPattern Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Columnsinteger 
Rowsinteger 
Valuesinteger+ 
+ +

XMP DeviceSettings Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Columnsinteger 
Rowsinteger 
Settingsstring+ 
+ +

XMP Flash Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
FiredbooleanFalse = False +
True = True
FunctionbooleanFalse = False +
True = True
Modeinteger0 = Unknown +
1 = On +
2 = Off +
3 = Auto
RedEyeModebooleanFalse = False +
True = True
Returninteger0 = No return detection +
2 = Return not detected +
3 = Return detected
+ +

XMP OECF Struct

+
+
+ + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Columnsinteger 
Namesstring+ 
Rowsinteger 
Valuesrational+ 
+ +

XMP exifEX Tags

+

EXIF tags added by the EXIF 2.32 for XMP specification (see +https://cipa.jp/std/documents/download_e.html?DC-010-2020_E).

+ +

These tags belong to the ExifTool XMP-exifEX family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Accelerationrational 
SerialNumberstring(called BodySerialNumber by the spec)
CameraElevationAnglerational 
OwnerNamestring(called CameraOwnerName by the spec)
CompositeImageinteger0 = Unknown +
1 = Not a Composite Image +
2 = General Composite Image +
3 = Composite Image Captured While Shooting
CompositeImageCountinteger+ 
CompositeImageExposureTimesstruct--> CompImageExp Struct
CompImageMaxExposureAllrational_(CompositeImageExposureTimesMaxExposureTimesOfAll)
CompImageMaxExposureUsedrational_(CompositeImageExposureTimesMaxExposureTimesOfUsed)
CompImageMinExposureAllrational_(CompositeImageExposureTimesMinExposureTimesOfAll)
CompImageMinExposureUsedrational_(CompositeImageExposureTimesMinExposureTimesOfUsed)
CompImageImagesPerSequenceinteger_(CompositeImageExposureTimesNumberOfImagesInSequences)
CompImageNumSequencesinteger_(CompositeImageExposureTimesNumberOfSequences)
CompImageSumExposureAllrational_(CompositeImageExposureTimesSumOfExposureTimesOfAll)
CompImageSumExposureUsedrational_(CompositeImageExposureTimesSumOfExposureTimesOfUsed)
CompImageTotalExposurePeriodrational_(CompositeImageExposureTimesTotalExposurePeriod)
CompImageValuesrational_+(CompositeImageExposureTimesValues)
Gammarational 
Humidityrational 
InteropIndexstring(called InteroperabilityIndex by the spec) +
'R03' = R03 - DCF option file (Adobe RGB) +
'R98' = R98 - DCF basic file (sRGB) +
'THM' = THM - DCF thumbnail file
ISOSpeedinteger 
ISOSpeedLatitudeyyyinteger 
ISOSpeedLatitudezzzinteger 
LensMakestring 
LensModelstring 
LensSerialNumberstring 
LensInforational+(called LensSpecification by the spec; unfortunately the EXIF 2.3 for XMP specification defined this new tag +instead of using the existing XMP-aux:LensInfo)
PhotographicSensitivityinteger 
Pressurerational 
RecommendedExposureIndexinteger 
SensitivityTypeinteger0 = Unknown +
1 = Standard Output Sensitivity +
2 = Recommended Exposure Index +
3 = ISO Speed +
4 = Standard Output Sensitivity and Recommended Exposure Index +
5 = Standard Output Sensitivity and ISO Speed +
6 = Recommended Exposure Index and ISO Speed +
7 = Standard Output Sensitivity, Recommended Exposure Index and ISO Speed
StandardOutputSensitivityinteger 
AmbientTemperaturerational(called Temperature by the spec)
WaterDepthrational 
+ +

XMP CompImageExp Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
MaxExposureTimesOfAllrational 
MaxExposureTimesOfUsedrational 
MinExposureTimesOfAllrational 
MinExposureTimesOfUsedrational 
NumberOfImagesInSequencesinteger 
NumberOfSequencesinteger 
SumOfExposureTimesOfAllrational 
SumOfExposureTimesOfUsedrational 
TotalExposurePeriodrational 
Valuesrational+ 
+ +

XMP ExpressionMedia Tags

+

Microsoft Expression Media namespace tags. These tags are avoided when +writing due to name conflicts with tags in other schemas.

+ +

These tags belong to the ExifTool XMP-expressionmedia family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
CatalogSetsstring/+ 
Eventstring/ 
Peoplestring/+ 
Statusstring/ 
+ +

XMP extensis Tags

+

Tags used by Extensis Portfolio.

+ +

These tags belong to the ExifTool XMP-extensis family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Approvedboolean 
ApprovedBystring 
ClientNamestring 
JobNamestring 
JobStatusstring 
RoutedTostring 
RoutingNotesstring 
WorkToDostring 
+ +

XMP fpv Tags

+

Fast Picture Viewer tags (see +http://www.fastpictureviewer.com/help/#rtfcomments).

+ +

These tags belong to the ExifTool XMP-fpv family 1 group.

+
+
+ + + + + + + +
Tag NameWritableValues / Notes
RichTextCommentstring 
+ +

XMP GAudio Tags

+

These tags belong to the ExifTool XMP-GAudio family 1 group.

+
+
+ + + + + + + + + + + +
Tag NameWritableValues / Notes
AudioDatastring(called Data by the spec)
AudioMimeTypestring(called Mime by the spec)
+ +

XMP GCamera Tags

+

Camera information found in Google panorama images.

+ +

These tags belong to the ExifTool XMP-GCamera family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
BurstIDstring 
BurstPrimarystring 
DisableAutoCreationstring+ 
HDRPMakerNotestring(called hdrp_makernote by the spec)
MicroVideointeger 
MicroVideoOffsetinteger 
MicroVideoPresentationTimestampUsinteger 
MicroVideoVersioninteger 
PortraitNotestring 
PortraitRequeststring(High Definition Render Pipeline (HDRP) data)
PortraitVersionstring 
SpecialTypeIDstring+ 
+ +

XMP GCreations Tags

+

Google creations tags.

+ +

These tags belong to the ExifTool XMP-GCreations family 1 group.

+
+
+ + + + + + + +
Tag NameWritableValues / Notes
CameraBurstIDstring 
+ +

XMP GDepth Tags

+

Google depthmap information. See +https://developers.google.com/depthmap-metadata/ for the specification.

+ +

These tags belong to the ExifTool XMP-GDepth family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Confidencestring/ 
ConfidenceMimestring/ 
DepthImagestring/(called Data by the spec)
Farreal/ 
Formatstring/'RangeInverse' = RangeInverse +
'RangeLinear' = RangeLinear
ImageHeightreal/ 
ImageWidthreal/ 
Manufacturerstring/ 
MeasureTypestring/'OpticalAxis' = OpticalAxis +
'OpticalRay' = OpticalRay
Mimestring/ 
Modelstring/ 
Nearreal/ 
Softwarestring/ 
Unitsstring/ 
+ +

XMP GettyImages Tags

+

The actual Getty Images namespace prefix is "GettyImagesGIFT", which is the +prefix recorded in the file, but ExifTool shortens this for the family 1 +group name.

+ +

These tags belong to the ExifTool XMP-getty family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AssetIDstring 
CallForImagestring 
CameraFilenamestring 
CameraMakeModelstring/ 
CameraSerialNumberstring/ 
Compositionstring 
ExclusiveCoveragestring 
GIFTFtpPrioritystring 
ImageRankstring 
MediaEventIdDatestring 
OriginalCreateDateTimedate/ 
OriginalFileNamestring 
ParentMediaEventIDstring 
ParentMEIDstring 
Personalitystring+ 
PrimaryFTPstring+ 
RoutingDestinationsstring+ 
RoutingExclusionsstring+ 
SecondaryFTPstring+ 
TimeShotstring 
+ +

XMP GFocus Tags

+

Focus information found in Google depthmap images.

+ +

These tags belong to the ExifTool XMP-GFocus family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
BlurAtInfinityreal 
FocalDistancereal 
FocalPointXreal 
FocalPointYreal 
+ +

XMP GImage Tags

+

These tags belong to the ExifTool XMP-GImage family 1 group.

+
+
+ + + + + + + + + + + +
Tag NameWritableValues / Notes
ImageDatastring(called Data by the spec)
ImageMimeTypestring(called Mime by the spec)
+ +

XMP GPano Tags

+

Panorama tags written by Google Photosphere. See +https://developers.google.com/panorama/metadata/ for the specification.

+ +

These tags belong to the ExifTool XMP-GPano family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
CaptureSoftwarestring 
CroppedAreaImageHeightPixelsreal 
CroppedAreaImageWidthPixelsreal 
CroppedAreaLeftPixelsreal 
CroppedAreaTopPixelsreal 
ExposureLockUsedboolean 
FirstPhotoDatedate 
FullPanoHeightPixelsreal 
FullPanoWidthPixelsreal 
InitialCameraDollyreal 
InitialHorizontalFOVDegreesreal 
InitialVerticalFOVDegreesreal 
InitialViewHeadingDegreesreal 
InitialViewPitchDegreesreal 
InitialViewRollDegreesreal 
LargestValidInteriorRectHeightreal 
LargestValidInteriorRectLeftreal 
LargestValidInteriorRectTopreal 
LargestValidInteriorRectWidthreal 
LastPhotoDatedate 
PoseHeadingDegreesreal 
PosePitchDegreesreal 
PoseRollDegreesreal 
ProjectionTypestring 
SourcePhotosCountinteger 
StitchingSoftwarestring 
UsePanoramaViewerboolean 
+ +

XMP GSpherical Tags

+

Not actually XMP. These RDF/XML tags are used in Google spherical MP4 +videos. These tags are written into the video track of MOV/MP4 files, and +not at the top level like other XMP tags. See +https://github.com/google/spatial-media/blob/master/docs/spherical-video-rfc.md +for the specification.

+ +

These tags belong to the ExifTool XMP-GSpherical family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
CroppedAreaImageHeightPixelsinteger/ 
CroppedAreaImageWidthPixelsinteger/ 
CroppedAreaLeftPixelsinteger/ 
CroppedAreaTopPixelsinteger/ 
FullPanoHeightPixelsinteger/ 
FullPanoWidthPixelsinteger/ 
InitialViewHeadingDegreesreal/ 
InitialViewPitchDegreesreal/ 
InitialViewRollDegreesreal/ 
ProjectionTypestring/ 
SourceCountinteger/ 
Sphericalboolean/ 
StereoModestring/ 
Stitchedboolean/ 
StitchingSoftwarestring/ 
TimeStampinteger/ 
+ +

XMP ics Tags

+

Tags used by IDimager. Nested TagStructure structures are unrolled to an +arbitrary depth of 6 to avoid infinite recursion.

+ +

These tags belong to the ExifTool XMP-ics family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AppVersionstring/ 
ImageRefstring 
SubVersionsstruct+--> SubVersion Struct
SubVersionFileNamestring_+(SubVersionsFileName)
SubVersionReferencestring_+(SubVersionsVersRef)
TagStructurestruct+--> TagStructure Struct
LabelName1string_+(TagStructureLabelName)
ParentReference1string_+(TagStructureParentReference)
Reference1string_+(TagStructureReference)
SubLabels1struct_+--> TagStructure Struct +
(TagStructureSubLabels)
LabelName2string_+(TagStructureSubLabelsLabelName)
ParentReference2string_+(TagStructureSubLabelsParentReference)
Reference2string_+(TagStructureSubLabelsReference)
SubLabels2struct_+--> TagStructure Struct +
(TagStructureSubLabelsSubLabels)
LabelName3string_+(TagStructureSubLabelsSubLabelsLabelName)
ParentReference3string_+(TagStructureSubLabelsSubLabelsParentReference)
Reference3string_+(TagStructureSubLabelsSubLabelsReference)
SubLabels3struct_+--> TagStructure Struct +
(TagStructureSubLabelsSubLabelsSubLabels)
LabelName4string_+(TagStructureSubLabelsSubLabelsSubLabelsLabelName)
ParentReference4string_+(TagStructureSubLabelsSubLabelsSubLabelsParentReference)
Reference4string_+(TagStructureSubLabelsSubLabelsSubLabelsReference)
SubLabels4struct_+--> TagStructure Struct +
(TagStructureSubLabelsSubLabelsSubLabelsSubLabels)
LabelName5string_+(TagStructureSubLabelsSubLabelsSubLabelsSubLabelsLabelName)
ParentReference5string_+(TagStructureSubLabelsSubLabelsSubLabelsSubLabelsParentReference)
Reference5string_+(TagStructureSubLabelsSubLabelsSubLabelsSubLabelsReference)
SubLabels5struct_+--> TagStructure Struct +
(TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabels)
LabelName6string_+(TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsLabelName)
ParentReference6string_+(TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsParentReference)
Reference6string_+(TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsReference)
TimeStampdate/ 
+ +

XMP SubVersion Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
FileNamestring 
VersRefstring 
+ +

XMP TagStructure Struct

+
+
+ + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
LabelNamestring 
ParentReferencestring 
Referencestring 
SubLabelsTagStructure+--> TagStructure Struct
+ +

XMP iptcCore Tags

+

IPTC Core namespace tags. The actual IPTC Core namespace prefix is +"Iptc4xmpCore", which is the prefix recorded in the file, but ExifTool +shortens this for the family 1 group name. (see +http://www.iptc.org/IPTC4XMP/)

+ +

These tags belong to the ExifTool XMP-iptcCore family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AltTextAccessibilitylang-alt 
CountryCodestring 
CreatorContactInfostruct--> ContactInfo Struct
CreatorCitystring_(CreatorContactInfoCiAdrCity)
CreatorCountrystring_(CreatorContactInfoCiAdrCtry)
CreatorAddressstring_(CreatorContactInfoCiAdrExtadr)
CreatorPostalCodestring_(CreatorContactInfoCiAdrPcode)
CreatorRegionstring_(CreatorContactInfoCiAdrRegion)
CreatorWorkEmailstring_(CreatorContactInfoCiEmailWork)
CreatorWorkTelephonestring_(CreatorContactInfoCiTelWork)
CreatorWorkURLstring_(CreatorContactInfoCiUrlWork)
ExtDescrAccessibilitylang-alt 
IntellectualGenrestring 
Locationstring 
Scenestring+ 
SubjectCodestring+ 
+ +

XMP ContactInfo Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
CiAdrCitystring 
CiAdrCtrystring 
CiAdrExtadrstring 
CiAdrPcodestring 
CiAdrRegionstring 
CiEmailWorkstring 
CiTelWorkstring 
CiUrlWorkstring 
+ +

XMP iptcExt Tags

+

This table contains tags defined by the IPTC Extension schema version 1.6. +The actual namespace prefix is "Iptc4xmpExt", but ExifTool shortens this for +the family 1 group name. (see +http://www.iptc.org/standards/photo-metadata/iptc-standard/)

+ +

These tags belong to the ExifTool XMP-iptcExt family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AboutCvTermstruct+--> CVTermDetails Struct
AboutCvTermCvIdstring_+ 
AboutCvTermIdstring_+(AboutCvTermCvTermId)
AboutCvTermNamelang-alt_+(AboutCvTermCvTermName)
AboutCvTermRefinedAboutstring_+(AboutCvTermCvTermRefinedAbout)
AdditionalModelInformationstring(called AddlModelInfo by the spec)
ArtworkOrObjectstruct+--> ArtworkOrObjectDetails Struct
ArtworkCircaDateCreatedstring!_+(ArtworkOrObjectAOCircaDateCreated)
ArtworkContentDescriptionlang-alt_+(ArtworkOrObjectAOContentDescription)
ArtworkContributionDescriptionlang-alt_+(ArtworkOrObjectAOContributionDescription)
ArtworkCopyrightNoticestring_+(ArtworkOrObjectAOCopyrightNotice)
ArtworkCreatorstring_+(ArtworkOrObjectAOCreator)
ArtworkCreatorIDstring_+(ArtworkOrObjectAOCreatorId)
ArtworkCopyrightOwnerIDstring_+(ArtworkOrObjectAOCurrentCopyrightOwnerId)
ArtworkCopyrightOwnerNamestring_+(ArtworkOrObjectAOCurrentCopyrightOwnerName)
ArtworkLicensorIDstring_+(ArtworkOrObjectAOCurrentLicensorId)
ArtworkLicensorNamestring_+(ArtworkOrObjectAOCurrentLicensorName)
ArtworkDateCreateddate_+(ArtworkOrObjectAODateCreated)
ArtworkPhysicalDescriptionlang-alt_+(ArtworkOrObjectAOPhysicalDescription)
ArtworkSourcestring_+(ArtworkOrObjectAOSource)
ArtworkSourceInventoryNostring_+(ArtworkOrObjectAOSourceInvNo)
ArtworkSourceInvURLstring_+(ArtworkOrObjectAOSourceInvURL)
ArtworkStylePeriodstring_+(ArtworkOrObjectAOStylePeriod)
ArtworkTitlelang-alt_+(ArtworkOrObjectAOTitle)
AudioBitrateinteger 
AudioBitrateModestring'fixed' = Fixed +
'variable' = Variable
AudioBitsPerSampleinteger 
AudioChannelCountinteger 
CircaDateCreatedstring 
ContainerFormatstruct--> Entity Struct
ContainerFormatIdentifierstring_+ 
ContainerFormatNamelang-alt_ 
Contributorstruct+--> EntityWithRole Struct
ContributorIdentifierstring_+ 
ContributorNamelang-alt_+ 
ContributorRolestring_+ 
CopyrightYearinteger 
Creatorstruct+--> EntityWithRole Struct
CreatorIdentifierstring_+ 
CreatorNamelang-alt_+ 
CreatorRolestring_+ 
ControlledVocabularyTermstring+(called CVterm by the spec; deprecated by version 1.2)
DataOnScreenstruct+--> TextRegion Struct
DataOnScreenRegionstruct_+--> Area Struct
DataOnScreenRegionDreal_+ 
DataOnScreenRegionHreal_+ 
DataOnScreenRegionTextstring_+ 
DataOnScreenRegionUnitstring_+ 
DataOnScreenRegionWreal_+ 
DataOnScreenRegionXreal_+ 
DataOnScreenRegionYreal_+ 
DigitalImageGUIDstring(called DigImageGUID by the spec)
DigitalSourceFileTypestring(now deprecated -- replaced by DigitalSourceType)
DigitalSourceTypestring 
Dopesheetlang-alt 
DopesheetLinkstruct+--> QualifiedLink Struct
DopesheetLinkLinkstring_+ 
DopesheetLinkLinkQualifierstring_+ 
EmbdEncRightsExprstruct+--> EEREDetails Struct
EmbeddedEncodedRightsExprstring_+(EmbdEncRightsExprEncRightsExpr)
EmbeddedEncodedRightsExprTypestring_+(EmbdEncRightsExprRightsExprEncType)
EmbeddedEncodedRightsExprLangIDstring_+(EmbdEncRightsExprRightsExprLangId)
Episodestruct--> EpisodeOrSeason Struct
EpisodeIdentifierstring_ 
EpisodeNamestring_ 
EpisodeNumberstring_ 
Eventlang-alt 
ShownEventstruct+--> Entity Struct +
(called EventExt by the spec)
ShownEventIdentifierstring_+(EventExtIdentifier)
ShownEventNamelang-alt_+(EventExtName)
EventIDstring+ 
ExternalMetadataLinkstring+ 
FeedIdentifierstring 
Genrestruct+--> CVTermDetails Struct
GenreCvIdstring_+ 
GenreCvTermIdstring_+ 
GenreCvTermNamelang-alt_+ 
GenreCvTermRefinedAboutstring_+ 
Headlinelang-alt/ 
ImageRegionstruct+--> ImageRegion Struct
ImageRegionNamelang-alt_+ 
ImageRegionCtypestruct_+--> Entity Struct +
(ImageRegionRCtype)
ImageRegionCtypeIdentifierstring_+(ImageRegionRCtypeIdentifier)
ImageRegionCtypeNamelang-alt_+(ImageRegionRCtypeName)
ImageRegionBoundarystruct_+--> RegionBoundary Struct +
(ImageRegionRegionBoundary)
ImageRegionBoundaryHreal_+(ImageRegionRegionBoundaryRbH)
ImageRegionBoundaryRxreal_+(ImageRegionRegionBoundaryRbRx)
ImageRegionBoundaryShapestring_+(ImageRegionRegionBoundaryRbShape) +
'circle' = Circle +
'polygon' = Polygon +
'rectangle' = Rectangle
ImageRegionBoundaryUnitstring_+(ImageRegionRegionBoundaryRbUnit) +
'pixel' = Pixel +
'relative' = Relative
ImageRegionBoundaryVerticesstruct_+--> BoundaryPoint Struct +
(ImageRegionRegionBoundaryRbVertices)
ImageRegionBoundaryVerticesXreal_+(ImageRegionRegionBoundaryRbVerticesRbX)
ImageRegionBoundaryVerticesYreal_+(ImageRegionRegionBoundaryRbVerticesRbY)
ImageRegionBoundaryWreal_+(ImageRegionRegionBoundaryRbW)
ImageRegionBoundaryXreal_+(ImageRegionRegionBoundaryRbX)
ImageRegionBoundaryYreal_+(ImageRegionRegionBoundaryRbY)
ImageRegionIDstring_+(ImageRegionRId)
ImageRegionRolestruct_+--> Entity Struct +
(ImageRegionRRole)
ImageRegionRoleIdentifierstring_+(ImageRegionRRoleIdentifier)
ImageRegionRoleNamelang-alt_+(ImageRegionRRoleName)
IPTCLastEditeddate 
LinkedEncRightsExprstruct+--> LEREDetails Struct
LinkedEncodedRightsExprstring_+(LinkedEncRightsExprLinkedRightsExpr)
LinkedEncodedRightsExprTypestring_+(LinkedEncRightsExprRightsExprEncType)
LinkedEncodedRightsExprLangIDstring_+(LinkedEncRightsExprRightsExprLangId)
LocationCreatedstruct+--> LocationDetails Struct
LocationCreatedCitystring_+ 
LocationCreatedCountryCodestring_+ 
LocationCreatedCountryNamestring_+ 
LocationCreatedGPSAltituderational_+ 
LocationCreatedGPSLatitudestring_+ 
LocationCreatedGPSLongitudestring_+ 
LocationCreatedIdentifierstring_+ 
LocationCreatedLocationIdstring_+ 
LocationCreatedLocationNamelang-alt_+ 
LocationCreatedProvinceStatestring_+ 
LocationCreatedSublocationstring_+ 
LocationCreatedWorldRegionstring_+ 
LocationShownstruct+--> LocationDetails Struct
LocationShownCitystring_+ 
LocationShownCountryCodestring_+ 
LocationShownCountryNamestring_+ 
LocationShownGPSAltituderational_+ 
LocationShownGPSLatitudestring_+ 
LocationShownGPSLongitudestring_+ 
LocationShownIdentifierstring_+ 
LocationShownLocationIdstring_+ 
LocationShownLocationNamelang-alt_+ 
LocationShownProvinceStatestring_+ 
LocationShownSublocationstring_+ 
LocationShownWorldRegionstring_+ 
MaxAvailHeightinteger 
MaxAvailWidthinteger 
ModelAgeinteger+ 
OrganisationInImageCodestring+ 
OrganisationInImageNamestring+ 
PersonHeardstruct+--> Entity Struct
PersonHeardIdentifierstring_+ 
PersonHeardNamelang-alt_+ 
PersonInImagestring+ 
PersonInImageWDetailsstruct+--> PersonDetails Struct
PersonInImageCharacteristicstruct_+--> CVTermDetails Struct +
(PersonInImageWDetailsPersonCharacteristic)
PersonInImageCvTermCvIdstring_+(PersonInImageWDetailsPersonCharacteristicCvId)
PersonInImageCvTermIdstring_+(PersonInImageWDetailsPersonCharacteristicCvTermId)
PersonInImageCvTermNamelang-alt_+(PersonInImageWDetailsPersonCharacteristicCvTermName)
PersonInImageCvTermRefinedAboutstring_+(PersonInImageWDetailsPersonCharacteristicCvTermRefinedAbout)
PersonInImageDescriptionlang-alt_+(PersonInImageWDetailsPersonDescription)
PersonInImageIdstring_+(PersonInImageWDetailsPersonId)
PersonInImageNamelang-alt_+(PersonInImageWDetailsPersonName)
PlanningRefstruct+--> EntityWithRole Struct
PlanningRefIdentifierstring_+ 
PlanningRefNamelang-alt_+ 
PlanningRefRolestring_+ 
ProductInImagestruct+--> ProductDetails Struct
ProductInImageDescriptionlang-alt_+(ProductInImageProductDescription)
ProductInImageGTINstring_+(ProductInImageProductGTIN)
ProductInImageNamelang-alt_+(ProductInImageProductName)
PublicationEventstruct+--> PublicationEvent Struct
PublicationEventDatedate_+ 
PublicationEventIdentifierstring_+ 
PublicationEventNamestring_+ 
Ratingstruct+--> Rating Struct
RatingRegionstruct_+--> LocationDetails Struct +
(RatingRatingRegion)
RatingRegionCitystring_+(RatingRatingRegionCity)
RatingRegionCountryCodestring_+(RatingRatingRegionCountryCode)
RatingRegionCountryNamestring_+(RatingRatingRegionCountryName)
RatingRegionGPSAltituderational_+(RatingRatingRegionGPSAltitude)
RatingRegionGPSLatitudestring_+(RatingRatingRegionGPSLatitude)
RatingRegionGPSLongitudestring_+(RatingRatingRegionGPSLongitude)
RatingRegionIdentifierstring_+(RatingRatingRegionIdentifier)
RatingRegionLocationIdstring_+(RatingRatingRegionLocationId)
RatingRegionLocationNamelang-alt_+(RatingRatingRegionLocationName)
RatingRegionProvinceStatestring_+(RatingRatingRegionProvinceState)
RatingRegionSublocationstring_+(RatingRatingRegionSublocation)
RatingRegionWorldRegionstring_+(RatingRatingRegionWorldRegion)
RatingScaleMaxValuestring_+(RatingRatingScaleMaxValue)
RatingScaleMinValuestring_+(RatingRatingScaleMinValue)
RatingSourceLinkstring_+(RatingRatingSourceLink)
RatingValuestring_+(RatingRatingValue)
RatingValueLogoLinkstring_+(RatingRatingValueLogoLink)
RecDevicestruct--> Device Struct
RecDeviceAttLensDescriptionstring_ 
RecDeviceManufacturerstring_ 
RecDeviceModelNamestring_ 
RecDeviceOwnersDeviceIdstring_ 
RecDeviceSerialNumberstring_ 
RegistryIDstruct+--> RegistryEntryDetails Struct
RegistryEntryRolestring_+(RegistryIdRegEntryRole)
RegistryItemIDstring_+(RegistryIdRegItemId)
RegistryOrganisationIDstring_+(RegistryIdRegOrgId)
ReleaseReadyboolean 
Seasonstruct--> EpisodeOrSeason Struct
SeasonIdentifierstring_ 
SeasonNamestring_ 
SeasonNumberstring_ 
Seriesstruct--> Series Struct
SeriesIdentifierstring_ 
SeriesNamestring_ 
Snapshotstruct+--> LinkedImage Struct +
(called SnapshotLink by the spec)
SnapshotFormatstring_+(SnapshotLinkFormat)
SnapshotHeightPixelsinteger_+(SnapshotLinkHeightPixels)
SnapshotImageRolestring_+(SnapshotLinkImageRole)
SnapshotLinkstring_+(SnapshotLinkLink)
SnapshotLinkQualifierstring_+(SnapshotLinkLinkQualifier)
SnapshotUsedVideoFramestruct_+--> Timecode Struct +
(SnapshotLinkUsedVideoFrame)
SnapshotUsedVideoFrameTimeFormatstring_+(SnapshotLinkUsedVideoFrameTimeFormat) +
'23976Timecode' = 23.976 fps +
'24Timecode' = 24 fps +
'25Timecode' = 25 fps +
'2997DropTimecode' = 29.97 fps (drop) +
'2997NonDropTimecode' = 29.97 fps (non-drop) +
'30Timecode' = 30 fps +
'50Timecode' = 50 fps +
'5994DropTimecode' = 59.94 fps (drop) +
'5994NonDropTimecode' = 59.94 fps (non-drop) +
'60Timecode' = 60 fps
+
SnapshotUsedVideoFrameTimeValuestring_+(SnapshotLinkUsedVideoFrameTimeValue)
SnapshotUsedVideoFrameValueinteger_+(SnapshotLinkUsedVideoFrameValue; only in XMP 2008 spec; an error?)
SnapshotWidthPixelsinteger_+(SnapshotLinkWidthPixels)
StorylineIdentifierstring+ 
StreamReadystring'false' = False +
'true' = True +
'unknown' = Unknown
StylePeriodstring 
SupplyChainSourcestruct+--> Entity Struct
SupplyChainSourceIdentifierstring_+ 
SupplyChainSourceNamelang-alt_+ 
TemporalCoveragestruct--> TemporalCoverage Struct
TemporalCoverageFromdate_(TemporalCoverageTempCoverageFrom)
TemporalCoverageTodate_(TemporalCoverageTempCoverageTo)
Transcriptlang-alt 
TranscriptLinkstruct+--> QualifiedLink Struct
TranscriptLinkLinkstring_+ 
TranscriptLinkLinkQualifierstring_+ 
VideoBitrateinteger 
VideoBitrateModestring'fixed' = Fixed +
'variable' = Variable
VideoDisplayAspectRatiorational 
VideoEncodingProfilestring 
VideoShotTypestruct+--> Entity Struct
VideoShotTypeIdentifierstring_+ 
VideoShotTypeNamelang-alt_+ 
VideoStreamsCountinteger 
VisualColorstring(called VisualColour by the spec) +
'bw-monochrome' = Monochrome +
'colour' = Color
WorkflowTagstruct--> CVTermDetails Struct
WorkflowTagCvIdstring_ 
WorkflowTagCvTermIdstring_ 
WorkflowTagCvTermNamelang-alt_ 
WorkflowTagCvTermRefinedAboutstring_ 
+ +

XMP CVTermDetails Struct

+
+
+ + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
CvIdstring 
CvTermIdstring 
CvTermNamelang-alt 
CvTermRefinedAboutstring 
+ +

XMP ArtworkOrObjectDetails Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
AOCircaDateCreatedstring 
AOContentDescriptionlang-alt 
AOContributionDescriptionlang-alt 
AOCopyrightNoticestring 
AOCreatorstring+ 
AOCreatorIdstring+ 
AOCurrentCopyrightOwnerIdstring 
AOCurrentCopyrightOwnerNamestring 
AOCurrentLicensorIdstring 
AOCurrentLicensorNamestring 
AODateCreateddate 
AOPhysicalDescriptionlang-alt 
AOSourcestring 
AOSourceInvNostring 
AOSourceInvURLstring 
AOStylePeriodstring+ 
AOTitlelang-alt 
+ +

XMP Entity Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
Identifierstring+ 
Namelang-alt 
+ +

XMP EntityWithRole Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Identifierstring+ 
Namelang-alt 
Rolestring+ 
+ +

XMP TextRegion Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
RegionArea--> Area Struct
RegionTextstring 
+ +

XMP Area Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Dreal 
Hreal 
Unitstring 
Wreal 
Xreal 
Yreal 
+ +

XMP QualifiedLink Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
Linkstring 
LinkQualifierstring 
+ +

XMP EEREDetails Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
EncRightsExprstring 
RightsExprEncTypestring 
RightsExprLangIdstring 
+ +

XMP EpisodeOrSeason Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Identifierstring 
Namestring 
Numberstring 
+ +

XMP ImageRegion Struct

+

This structure is new in the IPTC Extension version 1.5 specification. As +well as the fields defined below, this structure may contain any top-level +XMP tags, but since they aren't pre-defined the only way to add these tags +is to write ImageRegion as a structure with these tags as new fields.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Namelang-alt 
RegionBoundaryRegionBoundary--> RegionBoundary Struct
RCtypeEntity+--> Entity Struct
RIdstring 
RRoleEntity+--> Entity Struct
+ +

XMP RegionBoundary Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
RbHreal 
RbRxreal 
RbShapestringcircle = Circle +
polygon = Polygon +
rectangle = Rectangle
RbUnitstringpixel = Pixel +
relative = Relative
RbVerticesBoundaryPoint+--> BoundaryPoint Struct
RbWreal 
RbXreal 
RbYreal 
+ +

XMP BoundaryPoint Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
RbXreal 
RbYreal 
+ +

XMP LEREDetails Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
LinkedRightsExprstring 
RightsExprEncTypestring 
RightsExprLangIdstring 
+ +

XMP LocationDetails Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Citystring 
CountryCodestring 
CountryNamestring 
GPSAltituderational 
GPSLatitudestring 
GPSLongitudestring 
Identifierstring+ 
LocationIdstring+ 
LocationNamelang-alt 
ProvinceStatestring 
Sublocationstring 
WorldRegionstring 
+ +

XMP PersonDetails Struct

+
+
+ + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
PersonCharacteristicCVTermDetails+--> CVTermDetails Struct
PersonDescriptionlang-alt 
PersonIdstring+ 
PersonNamelang-alt 
+ +

XMP ProductDetails Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
ProductDescriptionlang-alt 
ProductGTINstring 
ProductNamelang-alt 
+ +

XMP PublicationEvent Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Datedate 
Identifierstring 
Namestring 
+ +

XMP Rating Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
RatingRegionLocationDetails+--> LocationDetails Struct
RatingScaleMaxValuestring 
RatingScaleMinValuestring 
RatingSourceLinkstring 
RatingValuestring 
RatingValueLogoLinkstring 
+ +

XMP Device Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
AttLensDescriptionstring 
Manufacturerstring 
ModelNamestring 
OwnersDeviceIdstring 
SerialNumberstring 
+ +

XMP RegistryEntryDetails Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
RegEntryRolestring 
RegItemIdstring 
RegOrgIdstring 
+ +

XMP Series Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
Identifierstring 
Namestring 
+ +

XMP LinkedImage Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
HeightPixelsinteger 
ImageRolestring 
Linkstring 
LinkQualifierstring+ 
UsedVideoFrameTimecode--> Timecode Struct
WidthPixelsinteger 
Formatstring 
+ +

XMP Timecode Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
TimeFormatstring23976Timecode = 23.976 fps +
24Timecode = 24 fps +
25Timecode = 25 fps +
2997DropTimecode = 29.97 fps (drop) +
2997NonDropTimecode = 29.97 fps (non-drop) +
30Timecode = 30 fps +
50Timecode = 50 fps +
5994DropTimecode = 59.94 fps (drop) +
5994NonDropTimecode = 59.94 fps (non-drop) +
60Timecode = 60 fps
TimeValuestring 
Valueinteger(only in XMP 2008 spec; an error?)
+ +

XMP TemporalCoverage Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
TempCoverageFromdate 
TempCoverageTodate 
+ +

XMP LImage Tags

+

Tags written by RED smartphones.

+ +

These tags belong to the ExifTool XMP-LImage family 1 group.

+
+
+ + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
MajorVersionstring 
MinorVersionstring 
RightAlbedostring(Right stereoscopic image)
+ +

XMP Lightroom Tags

+

Adobe Lightroom "lr" namespace tags.

+ +

These tags belong to the ExifTool XMP-lr family 1 group.

+
+
+ + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
HierarchicalSubjectstring+ 
PrivateRTKInfostring 
WeightedFlatSubjectstring+ 
+ +

XMP MediaPro Tags

+

iView MediaPro namespace tags.

+ +

These tags belong to the ExifTool XMP-mediapro family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
CatalogSetsstring+ 
Eventstring/(avoided due to conflict with XMP-iptcExt:Event)
Locationstring/(avoided due to conflict with XMP-iptcCore:Location)
Peoplestring+ 
Statusstring 
UserFieldsstring+ 
+ +

XMP pdf Tags

+

Adobe PDF namespace tags. The official XMP specification defines only +Keywords, PDFVersion, Producer and Trapped. The other tags are included +because they have been observed in PDF files, but some are avoided when +writing due to name conflicts with other XMP namespaces.

+ +

These tags belong to the ExifTool XMP-pdf family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Authorstring 
Copyrightstring/ 
CreationDatedate 
Creatorstring/ 
Keywordsstring 
Markedboolean/ 
ModDatedate 
PDFVersionstring 
Producerstring 
Subjectstring/ 
Titlestring/ 
Trappedstring'False' = False +
'True' = True +
'Unknown' = Unknown
+ +

XMP pdfx Tags

+

PDF extension tags. This namespace is used to store application-defined PDF +information, so there are no pre-defined tags. User-defined tags must be +created to enable writing of XMP-pdfx information.

+ +

These tags belong to the ExifTool XMP-pdfx family 1 group.

+
+
+ + + + +
Tag NameWritableValues / Notes
[no tags known]
+ +

XMP photoshop Tags

+

Adobe Photoshop namespace tags.

+ +

These tags belong to the ExifTool XMP-photoshop family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AuthorsPositionstring 
CaptionWriterstring 
Categorystring 
Citystring 
ColorModeinteger + +
0 = Bitmap +
1 = Grayscale +
2 = Indexed +
3 = RGB
  4 = CMYK +
7 = Multichannel +
8 = Duotone +
9 = Lab
+
Countrystring 
Creditstring 
DateCreateddate 
DocumentAncestorsstring+ 
EmbeddedXMPDigeststring 
Headlinestring 
Historystring 
ICCProfileNamestring(called ICCProfile by the spec)
Instructionsstring 
LegacyIPTCDigeststring 
SidecarForExtensionstring 
Sourcestring 
Statestring 
SupplementalCategoriesstring+ 
TextLayersstruct+--> Layer Struct
TextLayerNamestring_+(TextLayersLayerName)
TextLayerTextstring_+(TextLayersLayerText)
TransmissionReferencestring(Now used as a job identifier)
Urgencyinteger(should be in the range 1-8 to conform with the XMP spec) +
0 = 0 (reserved) +
1 = 1 (most urgent) +
2 = 2 +
3 = 3 +
4 = 4 +
5 = 5 (normal urgency) +
6 = 6 +
7 = 7 +
8 = 8 (least urgent) +
9 = 9 (user-defined priority)
+
+ +

XMP Layer Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
LayerNamestring 
LayerTextstring 
+ +

XMP PixelLive Tags

+

PixelLive namespace tags. These tags are not writable because they are very +uncommon and I haven't been able to locate a reference which gives the +namespace URI.

+ +

These tags belong to the ExifTool XMP-PixelLive family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Authorno 
Commentsno 
Copyrightno 
Dateno 
Genreno 
Titleno 
+ +

XMP pmi Tags

+

PRISM Metadata for Images 3.0 namespace tags. (see +http://www.prismstandard.org/)

+ +

These tags belong to the ExifTool XMP-pmi family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Colorstring/ + +
'bw' = BW +
'color' = Color +
'duotone' = Duotone
  'quadtone' = Quadtone +
'sepia' = Sepia +
'tritone' = Tritone
+
ContactInfostring/ 
DisplayNamestring/ 
DistributorProductIDstring/ 
EventAliasstring/ 
EventEndstring/ 
EventStartstring/ 
EventSubtypestring/ 
EventTypestring/ 
Fieldstring/ 
Framingstring/ 
Locationstring/ 
Makestring/ 
Manufacturerstring/ 
Modelstring/ 
ModelYearstring/ 
ObjectDescriptionstring/ 
ObjectSubtypestring/ 
ObjectTypestring/ 
Orientationstring/'horizontal' = Horizontal +
'vertical' = Vertical
PositionDescriptorstring/ 
ProductIDstring/ 
ProductIDTypestring/ 
Seasonstring/'fall' = Fall +
'spring' = Spring +
'summer' = Summer +
'winter' = Winter
SequenceNamestring/ 
SequenceNumberstring/ 
SequenceTotalNumberstring/ 
Settingstring/ 
ShootIDstring/ 
SlideshowNamestring/ 
SlideshowNumberinteger/ 
SlideshowTotalNumberinteger/ 
Viewpointstring/ 
VisualTechniquestring/ 
+ +

XMP prism Tags

+

Publishing Requirements for Industry Standard Metadata 3.0 namespace +tags. (see http://www.prismstandard.org/)

+ +

These tags belong to the ExifTool XMP-prism family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AcademicFieldstring/ 
AggregateIssueNumberinteger/ 
AggregationTypestring/+ 
AlternateTitlestruct+--> prismAlternateTitle Struct
AlternateTitleA-langstring/_+ 
AlternateTitleA-platformstring/_+ 
AlternateTitleTextstring/_+ 
BlogTitlestring/ 
BlogURLstring/ 
BookEditionstring/ 
ByteCountinteger/ 
Channelstruct+--> prismChannel Struct
ChannelA-langstring/_+ 
ChannelChannelstring/_+ 
ChannelSubchannel1string/_+ 
ChannelSubchannel2string/_+ 
ChannelSubchannel3string/_+ 
ChannelSubchannel4string/_+ 
ComplianceProfilestring/'three' = Three
ContentTypestring/ 
CopyrightYearstring/ 
CorporateEntitystring/+ 
CoverDatedate/ 
CoverDisplayDatestring/ 
CreationDatedate/ 
DateRecieveddate/ 
Devicestring/ 
Distributorstring/ 
DOIstring/ 
Editionstring/ 
EIssnstring/ 
EndingPagestring/ 
Eventstring/+ 
Genrestring/+ 
HasAlternativestring/+ 
HasCorrectionstruct--> prismHasCorrection Struct
HasCorrectionA-langstring/_ 
HasCorrectionA-platformstring/_ 
HasCorrectionTextstring/_ 
HasTranslationstring/+ 
Industrystring/+ 
IsAlternativeOfstring/+ 
ISBNstring/+ 
IsCorrectionOfstring/+ 
ISSNstring/ 
IssueIdentifierstring/ 
IssueNamestring/ 
IssueTeaserstring/ 
IssueTypestring/ 
IsTranslationOfstring/ 
Keywordstring/+ 
KillDatestruct--> prismKillDate Struct
KillDateA-platformstring/_ 
KillDateDatedate/_ 
Linkstring/+ 
Locationstring/+ 
ModificationDatedate/ 
NationalCatalogNumberstring/ 
Numberstring/ 
Objectstring/+ 
OffSaleDatestruct+--> prismOffSaleDate Struct
OffSaleDateA-platformstring/_+ 
OffSaleDateDatedate/_+ 
OnSaleDatestruct+--> prismOnSaleDate Struct
OnSaleDateA-platformstring/_+ 
OnSaleDateDatedate/_+ 
OnSaleDaystruct+--> prismOnSaleDay Struct
OnSaleDayA-platformstring/_+ 
OnSaleDayDaystring/_+ 
Organizationstring/+ 
OriginPlatformstring/+ +
'broadcast' = Broadcast +
'email' = E-Mail +
'mobile' = Mobile +
'other' = Other +
'print' = Print +
'recordableMedia' = Recordable Media +
'web' = Web
+
PageCountinteger/ 
PageProgressionDirectionstring/'LTR' = Left to Right +
'RTL' = Right to Left
PageRangestring/+ 
Personstring/ 
Platformstring/ 
ProductCodestring/ 
Professionstring/ 
PublicationDatestruct+--> prismPublicationDate Struct
PublicationDateA-platformstring/_+ 
PublicationDateDatedate/_+ 
PublicationDisplayDatestruct+--> prismPublicationDate Struct
PublicationDisplayDateA-platformstring/_+ 
PublicationDisplayDateDatedate/_+ 
PublicationNamestring/ 
PublishingFrequencystring/ 
Ratingstring/ 
SamplePageRangestring/ 
Sectionstring/ 
SellingAgencystring/ 
SeriesNumberinteger/ 
SeriesTitlestring/ 
Sportstring/ 
StartingPagestring/ 
Subsection1string/ 
Subsection2string/ 
Subsection3string/ 
Subsection4string/ 
Subtitlestring/ 
SupplementDisplayIDstring/ 
SupplementStartingPagestring/ 
SupplementTitlestring/ 
Teaserstring/+ 
Tickerstring/+ 
TimePeriodstring/ 
URLstruct+--> prismUrl Struct
URLA-platformstring/_+ 
URLUrlstring/_+ 
UspsNumberstring/ 
VersionIdentifierstring/ 
Volumestring/ 
WordCountinteger/ 
+ +

XMP prismAlternateTitle Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
A-langstring 
A-platformstring 
Textstring 
+ +

XMP prismChannel Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
A-langstring 
Channelstring 
Subchannel1string 
Subchannel2string 
Subchannel3string 
Subchannel4string 
+ +

XMP prismHasCorrection Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
A-langstring 
A-platformstring 
Textstring 
+ +

XMP prismKillDate Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
A-platformstring 
Datedate 
+ +

XMP prismOffSaleDate Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
A-platformstring 
Datedate 
+ +

XMP prismOnSaleDate Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
A-platformstring 
Datedate 
+ +

XMP prismOnSaleDay Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
A-platformstring 
Daystring 
+ +

XMP prismPublicationDate Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
A-platformstring 
Datedate 
+ +

XMP prismUrl Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
A-platformstring 
Urlstring 
+ +

XMP prl Tags

+

PRISM Rights Language 2.1 namespace tags. These tags have been deprecated +since the release of the PRISM Usage Rights 3.0. (see +http://www.prismstandard.org/)

+ +

These tags belong to the ExifTool XMP-prl family 1 group.

+
+
+ + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Geographystring/+ 
Industrystring/+ 
Usagestring/+ 
+ +

XMP prm Tags

+

PRISM Recipe Metadata 3.0 namespace tags. (see +http://www.prismstandard.org/)

+ +

These tags belong to the ExifTool XMP-prm family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
CookingEquipmentstring/ 
CookingMethodstring/ 
Coursestring/ 
Cuisinestring/ 
DietaryNeedsstring/ 
DishTypestring/ 
Durationstring/ 
IngredientExclusionstring/ 
MainIngredientstring/ 
Mealstring/ 
RecipeEndingPagestring/ 
RecipePageRangestring/ 
RecipeSourcestring/ 
RecipeStartingPagestring/ 
RecipeTitlestring/ 
ServingSizestring/ 
SkillLevelstring/ 
SpecialOccasionstring/ 
Yieldstring/ 
+ +

XMP pur Tags

+

PRISM Usage Rights 3.0 namespace tags. (see +http://www.prismstandard.org/)

+ +

These tags belong to the ExifTool XMP-pur family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AdultContentWarningstring/+ 
Agreementstring/+ 
Copyrightlang-alt/ 
CreditLinestring/+ 
EmbargoDatedate/+ 
ExclusivityEndDatedate/+ 
ExpirationDatedate/+ 
ImageSizeRestrictionstring/ 
OptionEndDatedate/+ 
Permissionsstring/+ 
Restrictionsstring/+ 
ReuseProhibitedboolean/ 
RightsAgentstring/ 
RightsOwnerstring/ 
+ +

XMP rdf Tags

+

Most RDF attributes are handled internally, but the "about" attribute is +treated specially to allow it to be set to a specific value if required.

+ +

These tags belong to the ExifTool XMP-rdf family 1 group.

+
+
+ + + + + + + +
Tag NameWritableValues / Notes
Aboutstring! 
+ +

XMP swf Tags

+

Adobe SWF namespace tags.

+ +

These tags belong to the ExifTool XMP-swf family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
BackgroundAlphainteger(called bgalpha by the spec)
ForwardLockboolean 
MaxStorageinteger 
Typestring/ 
+ +

XMP tiff Tags

+

EXIF namespace for TIFF tags. See +https://web.archive.org/web/20180921145139if_/http://www.cipa.jp:80/std/documents/e/DC-010-2017_E.pdf +for the specification.

+ +

These tags belong to the ExifTool XMP-tiff family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Artiststring 
BitsPerSampleinteger+ 
Compressioninteger--> EXIF Compression Values
Copyrightlang-alt 
DateTimedate 
ImageDescriptionlang-alt 
ImageHeightinteger(called ImageLength by the spec)
ImageWidthinteger 
Makestring 
Modelstring 
NativeDigeststring/ 
Orientationinteger +
1 = Horizontal (normal) +
2 = Mirror horizontal +
3 = Rotate 180 +
4 = Mirror vertical +
5 = Mirror horizontal and rotate 270 CW +
6 = Rotate 90 CW +
7 = Mirror horizontal and rotate 90 CW +
8 = Rotate 270 CW
+
PhotometricInterpretationinteger +
0 = WhiteIsZero +
1 = BlackIsZero +
2 = RGB +
3 = RGB Palette +
4 = Transparency Mask +
5 = CMYK +
6 = YCbCr +
8 = CIELab +
9 = ICCLab +
10 = ITULab +
32803 = Color Filter Array +
32844 = Pixar LogL +
32845 = Pixar LogLuv +
32892 = Sequential Color Filter +
34892 = Linear Raw +
51177 = Depth Map +
52527 = Semantic Mask
+
PlanarConfigurationinteger1 = Chunky +
2 = Planar
PrimaryChromaticitiesrational+ 
ReferenceBlackWhiterational+ 
ResolutionUnitinteger(the value 1 is not standard EXIF) +
1 = None +
2 = inches +
3 = cm
SamplesPerPixelinteger 
Softwarestring 
TransferFunctioninteger+ 
WhitePointrational+ 
XResolutionrational 
YCbCrCoefficientsrational+ 
YCbCrPositioninginteger1 = Centered +
2 = Co-sited
YCbCrSubSamplinginteger+(while technically this is a list-type tag, for compatibility with its EXIF +counterpart it is written and read as a simple string) +
'1 1' = YCbCr4:4:4 (1 1) +
'1 2' = YCbCr4:4:0 (1 2) +
'1 4' = YCbCr4:4:1 (1 4) +
'2 1' = YCbCr4:2:2 (2 1) +
'2 2' = YCbCr4:2:0 (2 2) +
'2 4' = YCbCr4:2:1 (2 4) +
'4 1' = YCbCr4:1:1 (4 1) +
'4 2' = YCbCr4:1:0 (4 2)
+
YResolutionrational 
+ +

XMP x Tags

+

The "x" namespace is used for the "xmpmeta" wrapper, and may contain an +"xmptk" attribute that is extracted as the XMPToolkit tag. When writing, +the XMPToolkit tag is generated automatically by ExifTool unless +specifically set to another value.

+ +

These tags belong to the ExifTool XMP-x family 1 group.

+
+
+ + + + + + + +
Tag NameWritableValues / Notes
XMPToolkitstring!(called xmptk by the spec)
+ +

XMP xmp Tags

+

XMP namespace tags. If the older "xap", "xapBJ", "xapMM" or "xapRights" +namespace prefixes are found, they are translated to the newer "xmp", +"xmpBJ", "xmpMM" and "xmpRights" prefixes for use in family 1 group names.

+ +

These tags belong to the ExifTool XMP-xmp family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Advisorystring+(deprecated)
Authorstring/(non-standard)
BaseURLstring 
CreateDatedate 
CreatorToolstring 
Descriptionlang-alt/(non-standard)
Formatstring/(non-standard)
Identifierstring/+ 
Keywordsstring/(non-standard)
Labelstring 
MetadataDatedate 
ModifyDatedate 
Nicknamestring 
PageInfostruct+--> PageInfo Struct
PageImageFormatstring_+(PageInfoFormat)
PageImageHeightinteger_+(PageInfoHeight)
PageImagestring_+(PageInfoImage)
PageImagePageNumberinteger_+(PageInfoPageNumber)
PageImageWidthinteger_+(PageInfoWidth)
Ratingreal(a value from 0 to 5, or -1 for "rejected")
RatingPercentreal/(non-standard)
Thumbnailsstruct+--> Thumbnail Struct
ThumbnailFormatstring_+(ThumbnailsFormat)
ThumbnailHeightinteger_+(ThumbnailsHeight)
ThumbnailImagestring/_+(ThumbnailsImage)
ThumbnailWidthinteger_+(ThumbnailsWidth)
Titlelang-alt/(non-standard)
+ +

XMP PageInfo Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
PageNumberinteger 
Formatstring 
Heightinteger 
Imagestring 
Widthinteger 
+ +

XMP Thumbnail Struct

+
+
+ + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Formatstring 
Heightinteger 
Imagestring 
Widthinteger 
+ +

XMP xmpBJ Tags

+

XMP Basic Job Ticket namespace tags.

+ +

These tags belong to the ExifTool XMP-xmpBJ family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
JobRefstruct+--> JobRef Struct
JobRefIdstring_+ 
JobRefNamestring_+ 
JobRefUrlstring_+ 
+ +

XMP JobRef Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Idstring 
Namestring 
Urlstring 
+ +

XMP xmpDM Tags

+

XMP Dynamic Media namespace tags.

+ +

These tags belong to the ExifTool XMP-xmpDM family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
AbsPeakAudioFilePathstring 
Albumstring 
AltTapeNamestring 
AltTimecodestruct--> Timecode Struct
AltTimecodeTimeFormatstring_ +
'23976Timecode' = 23.976 fps +
'24Timecode' = 24 fps +
'25Timecode' = 25 fps +
'2997DropTimecode' = 29.97 fps (drop) +
'2997NonDropTimecode' = 29.97 fps (non-drop) +
'30Timecode' = 30 fps +
'50Timecode' = 50 fps +
'5994DropTimecode' = 59.94 fps (drop) +
'5994NonDropTimecode' = 59.94 fps (non-drop) +
'60Timecode' = 60 fps
+
AltTimecodeTimeValuestring_ 
AltTimecodeValueinteger_(only in XMP 2008 spec; an error?)
Artiststring/ 
AudioChannelTypestring +
5.1 = 5.1 +
7.1 = 7.1 +
'16 Channel' = 16 Channel +
'Mono' = Mono +
'Other' = Other +
'Stereo' = Stereo
+
AudioCompressorstring 
AudioModDatedate 
AudioSampleRateinteger 
AudioSampleTypestring +
'16Int' = 16-bit integer +
'24Int' = 24-bit integer +
'32Float' = 32-bit float +
'32Int' = 32-bit integer +
'8Int' = 8-bit integer +
'Compressed' = Compressed +
'Other' = Other +
'Packed' = Packed
+
BeatSpliceParamsstruct--> BeatSpliceStretch Struct
BeatSpliceParamsRiseInDecibelreal_ 
BeatSpliceParamsRiseInTimeDurationstruct_--> Time Struct
BeatSpliceParamsRiseInTimeDurationScalerational_ 
BeatSpliceParamsRiseInTimeDurationValueinteger_ 
BeatSpliceParamsUseFileBeatsMarkerboolean_ 
CameraAnglestring 
CameraLabelstring 
CameraModelstring 
CameraMovestring 
Clientstring 
DMCommentstring(called comment by the spec)
Composerstring 
ContributedMediastruct+--> Media Struct
ContributedMediaDurationstruct_+--> Time Struct
ContributedMediaDurationScalerational_+ 
ContributedMediaDurationValueinteger_+ 
ContributedMediaManagedboolean_+ 
ContributedMediaPathstring_+ 
ContributedMediaStartTimestruct_+--> Time Struct
ContributedMediaStartTimeScalerational_+ 
ContributedMediaStartTimeValueinteger_+ 
ContributedMediaTrackstring_+ 
ContributedMediaWebStatementstring_+ 
Copyrightstring/ 
Directorstring 
DirectorPhotographystring 
DiscNumberstring 
Durationstruct--> Time Struct
DurationScalerational_ 
DurationValueinteger_ 
Engineerstring 
FileDataRaterational 
Genrestring 
Goodboolean 
Instrumentstring 
IntroTimestruct--> Time Struct
IntroTimeScalerational_ 
IntroTimeValueinteger_ 
Keystring + + +
'A' = A +
'A#' = A# +
'B' = B +
'C' = C
  'C#' = C# +
'D' = D +
'D#' = D# +
'E' = E
  'F' = F +
'F#' = F# +
'G' = G +
'G#' = G#
+
LogCommentstring 
Loopboolean 
Lyricsstring 
Markersstruct+--> Marker Struct
MarkersCommentstring_+ 
MarkersCuePointParamsstruct_+--> CuePointParam Struct
MarkersCuePointParamsKeystring_+ 
MarkersCuePointParamsValuestring_+ 
MarkersCuePointTypestring_+ 
MarkersDurationstring_+ 
MarkersLocationstring_+ 
MarkersNamestring_+ 
MarkersProbabilityreal_+ 
MarkersSpeakerstring_+ 
MarkersStartTimestring_+ 
MarkersTargetstring_+ 
MarkersTypestring_+ 
MetadataModDatedate 
NumberOfBeatsreal 
OutCuestruct--> Time Struct
OutCueScalerational_ 
OutCueValueinteger_ 
PartOfCompilationboolean 
ProjectNamestring 
ProjectRefstruct--> ProjectLink Struct
ProjectRefPathstring_ 
ProjectRefTypestring_'audio' = Audio +
'custom' = Custom +
'movie' = Movie +
'still' = Still Image
PullDownstring + +
'SSWWW' = SSWWW +
'SWWWS' = SWWWS +
'SWWWW' = SWWWW +
'WSSWW' = WSSWW +
'WSWWW' = WSWWW
  'WWSSW' = WWSSW +
'WWSWW' = WWSWW +
'WWWSS' = WWWSS +
'WWWSW' = WWWSW +
'WWWWS' = WWWWS
+
RelativePeakAudioFilePathstring 
RelativeTimestampstruct--> Time Struct
RelativeTimestampScalerational_ 
RelativeTimestampValueinteger_ 
ReleaseDatedate 
ResampleParamsstruct--> ResampleStretch Struct
ResampleParamsQualitystring_'High' = High +
'Low' = Low +
'Medium' = Medium
ScaleTypestring'Both' = Both +
'Major' = Major +
'Minor' = Minor +
'Neither' = Neither
Scenestring/ 
ShotDatedate 
ShotDaystring 
ShotLocationstring 
ShotNamestring 
ShotNumberstring 
ShotSizestring 
SpeakerPlacementstring 
StartTimecodestruct--> Timecode Struct
StartTimecodeTimeFormatstring_ +
'23976Timecode' = 23.976 fps +
'24Timecode' = 24 fps +
'25Timecode' = 25 fps +
'2997DropTimecode' = 29.97 fps (drop) +
'2997NonDropTimecode' = 29.97 fps (non-drop) +
'30Timecode' = 30 fps +
'50Timecode' = 50 fps +
'5994DropTimecode' = 59.94 fps (drop) +
'5994NonDropTimecode' = 59.94 fps (non-drop) +
'60Timecode' = 60 fps
+
StartTimecodeTimeValuestring_ 
StartTimecodeValueinteger_(only in XMP 2008 spec; an error?)
StartTimeSampleSizeinteger 
StartTimeScalestring 
StretchModestring'Beat Splice' = Beat Splice +
'Fixed length' = Fixed length +
'Hybrid' = Hybrid +
'Resample' = Resample +
'Time-Scale' = Time-Scale
TakeNumberinteger 
TapeNamestring 
Temporeal 
TimeScaleParamsstruct--> TimeScaleStretch Struct
TimeScaleParamsFrameOverlappingPercentagereal_ 
TimeScaleParamsFrameSizereal_ 
TimeScaleParamsQualitystring_'High' = High +
'Low' = Low +
'Medium' = Medium
TimeSignaturestring + + +
'12/8' = 12/8 +
'2/4' = 2/4 +
'3/4' = 3/4
  '4/4' = 4/4 +
'5/4' = 5/4 +
'6/8' = 6/8
  '7/4' = 7/4 +
'9/8' = 9/8 +
'other' = other
+
TrackNumberinteger 
Tracksstruct+--> Track Struct
TracksFrameRatestring_+ 
TracksMarkersstruct_+--> Marker Struct
TracksMarkersCommentstring_+ 
TracksMarkersCuePointParamsstruct_+--> CuePointParam Struct
TracksMarkersCuePointParamsKeystring_+ 
TracksMarkersCuePointParamsValuestring_+ 
TracksMarkersCuePointTypestring_+ 
TracksMarkersDurationstring_+ 
TracksMarkersLocationstring_+ 
TracksMarkersNamestring_+ 
TracksMarkersProbabilityreal_+ 
TracksMarkersSpeakerstring_+ 
TracksMarkersStartTimestring_+ 
TracksMarkersTargetstring_+ 
TracksMarkersTypestring_+ 
TracksTrackNamestring_+ 
TracksTrackTypestring_+ 
VideoAlphaModestring'none' = None +
'pre-multiplied' = Pre-multiplied +
'straight' = Straight
VideoAlphaPremultipleColorstruct--> Colorant Struct
VideoAlphaPremultipleColorAinteger_ 
VideoAlphaPremultipleColorBinteger_ 
VideoAlphaPremultipleColorBlackreal_ 
VideoAlphaPremultipleColorBlueinteger_ 
VideoAlphaPremultipleColorCyanreal_ 
VideoAlphaPremultipleColorGrayinteger_ 
VideoAlphaPremultipleColorGreeninteger_ 
VideoAlphaPremultipleColorLreal_ 
VideoAlphaPremultipleColorMagentareal_ 
VideoAlphaPremultipleColorModestring_'CMYK' = CMYK +
'LAB' = Lab +
'RGB' = RGB
VideoAlphaPremultipleColorRedinteger_ 
VideoAlphaPremultipleColorSwatchNamestring_ 
VideoAlphaPremultipleColorTintinteger_(not part of 2010 XMP specification)
VideoAlphaPremultipleColorTypestring_ 
VideoAlphaPremultipleColorYellowreal_ 
VideoAlphaUnityIsTransparentboolean 
VideoColorSpacestring'CCIR-601' = CCIR-601 +
'CCIR-709' = CCIR-709 +
'sRGB' = sRGB
VideoCompressorstring 
VideoFieldOrderstring'Lower' = Lower +
'Progressive' = Progressive +
'Upper' = Upper
VideoFrameRatereal 
VideoFrameSizestruct--> Dimensions Struct
VideoFrameSizeHreal_ 
VideoFrameSizeUnitstring_ 
VideoFrameSizeWreal_ 
VideoModDatedate 
VideoPixelAspectRatiorational 
VideoPixelDepthstring +
'16Int' = 16-bit integer +
'24Int' = 24-bit integer +
'32Float' = 32-bit float +
'32Int' = 32-bit integer +
'8Int' = 8-bit integer +
'Other' = Other
+
+ +

XMP BeatSpliceStretch Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
RiseInDecibelreal 
RiseInTimeDurationTime--> Time Struct
UseFileBeatsMarkerboolean 
+ +

XMP Time Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
Scalerational 
Valueinteger 
+ +

XMP Media Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
DurationTime--> Time Struct
Managedboolean 
Pathstring 
StartTimeTime--> Time Struct
Trackstring 
WebStatementstring 
+ +

XMP Marker Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Commentstring 
CuePointParamsCuePointParam+--> CuePointParam Struct
CuePointTypestring 
Durationstring 
Locationstring 
Namestring 
Probabilityreal 
Speakerstring 
StartTimestring 
Targetstring 
Typestring 
+ +

XMP CuePointParam Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
Keystring 
Valuestring 
+ +

XMP ProjectLink Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
Pathstring 
Typestringaudio = Audio +
custom = Custom +
movie = Movie +
still = Still Image
+ +

XMP ResampleStretch Struct

+
+
+ + + + + + + +
Field NameWritableValues / Notes
QualitystringHigh = High +
Low = Low +
Medium = Medium
+ +

XMP TimeScaleStretch Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
FrameOverlappingPercentagereal 
FrameSizereal 
QualitystringHigh = High +
Low = Low +
Medium = Medium
+ +

XMP Track Struct

+
+
+ + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
FrameRatestring 
MarkersMarker+--> Marker Struct
TrackNamestring 
TrackTypestring 
+ +

XMP Colorant Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Ainteger 
Binteger 
Lreal 
Blackreal 
Blueinteger 
Cyanreal 
Grayinteger 
Greeninteger 
Magentareal 
ModestringCMYK = CMYK +
LAB = Lab +
RGB = RGB
Redinteger 
SwatchNamestring 
Tintinteger(not part of 2010 XMP specification)
Typestring 
Yellowreal 
+ +

XMP Dimensions Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Hreal 
Unitstring 
Wreal 
+ +

XMP xmpMM Tags

+

XMP Media Management namespace tags.

+ +

These tags belong to the ExifTool XMP-xmpMM family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
DerivedFromstruct--> ResourceRef Struct
DerivedFromAlternatePathsstring_+ 
DerivedFromDocumentIDstring_ 
DerivedFromFilePathstring_ 
DerivedFromFromPartstring_ 
DerivedFromInstanceIDstring_ 
DerivedFromLastModifyDatedate_ 
DerivedFromLastURLstring_ 
DerivedFromLinkCategorystring_ 
DerivedFromLinkFormstring_ 
DerivedFromManagerstring_ 
DerivedFromManagerVariantstring_ 
DerivedFromManageTostring_ 
DerivedFromManageUIstring_ 
DerivedFromMaskMarkersstring_'All' = All +
'None' = None
DerivedFromOriginalDocumentIDstring_ 
DerivedFromPartMappingstring_ 
DerivedFromPlacedResolutionUnitstring_ 
DerivedFromPlacedXResolutionstring_ 
DerivedFromPlacedYResolutionstring_ 
DerivedFromRenditionClassstring_ 
DerivedFromRenditionParamsstring_ 
DerivedFromToPartstring_ 
DerivedFromVersionIDstring_ 
DocumentIDstring 
Historystruct+--> ResourceEvent Struct
HistoryActionstring_+ 
HistoryChangedstring_+ 
HistoryInstanceIDstring_+ 
HistoryParametersstring_+ 
HistorySoftwareAgentstring_+ 
HistoryWhendate_+ 
Ingredientsstruct+--> ResourceRef Struct
IngredientsAlternatePathsstring_+ 
IngredientsDocumentIDstring_+ 
IngredientsFilePathstring_+ 
IngredientsFromPartstring_+ 
IngredientsInstanceIDstring_+ 
IngredientsLastModifyDatedate_+ 
IngredientsLastURLstring_+ 
IngredientsLinkCategorystring_+ 
IngredientsLinkFormstring_+ 
IngredientsManagerstring_+ 
IngredientsManagerVariantstring_+ 
IngredientsManageTostring_+ 
IngredientsManageUIstring_+ 
IngredientsMaskMarkersstring_+'All' = All +
'None' = None
IngredientsOriginalDocumentIDstring_+ 
IngredientsPartMappingstring_+ 
IngredientsPlacedResolutionUnitstring_+ 
IngredientsPlacedXResolutionstring_+ 
IngredientsPlacedYResolutionstring_+ 
IngredientsRenditionClassstring_+ 
IngredientsRenditionParamsstring_+ 
IngredientsToPartstring_+ 
IngredientsVersionIDstring_+ 
InstanceIDstring 
LastURLstring 
ManagedFromstruct--> ResourceRef Struct
ManagedFromAlternatePathsstring_+ 
ManagedFromDocumentIDstring_ 
ManagedFromFilePathstring_ 
ManagedFromFromPartstring_ 
ManagedFromInstanceIDstring_ 
ManagedFromLastModifyDatedate_ 
ManagedFromLastURLstring_ 
ManagedFromLinkCategorystring_ 
ManagedFromLinkFormstring_ 
ManagedFromManagerstring_ 
ManagedFromManagerVariantstring_ 
ManagedFromManageTostring_ 
ManagedFromManageUIstring_ 
ManagedFromMaskMarkersstring_'All' = All +
'None' = None
ManagedFromOriginalDocumentIDstring_ 
ManagedFromPartMappingstring_ 
ManagedFromPlacedResolutionUnitstring_ 
ManagedFromPlacedXResolutionstring_ 
ManagedFromPlacedYResolutionstring_ 
ManagedFromRenditionClassstring_ 
ManagedFromRenditionParamsstring_ 
ManagedFromToPartstring_ 
ManagedFromVersionIDstring_ 
Managerstring 
ManagerVariantstring 
ManageTostring 
ManageUIstring 
Manifeststruct+--> ManifestItem Struct
ManifestLinkFormstring_+ 
ManifestPlacedResolutionUnitstring_+ 
ManifestPlacedXResolutionreal_+ 
ManifestPlacedYResolutionreal_+ 
ManifestReferencestruct_+--> ResourceRef Struct
ManifestReferenceAlternatePathsstring_+ 
ManifestReferenceDocumentIDstring_+ 
ManifestReferenceFilePathstring_+ 
ManifestReferenceFromPartstring_+ 
ManifestReferenceInstanceIDstring_+ 
ManifestReferenceLastModifyDatedate_+ 
ManifestReferenceLastURLstring_+ 
ManifestReferenceLinkCategorystring_+ 
ManifestReferenceLinkFormstring_+ 
ManifestReferenceManagerstring_+ 
ManifestReferenceManagerVariantstring_+ 
ManifestReferenceManageTostring_+ 
ManifestReferenceManageUIstring_+ 
ManifestReferenceMaskMarkersstring_+'All' = All +
'None' = None
ManifestReferenceOriginalDocumentIDstring_+ 
ManifestReferencePartMappingstring_+ 
ManifestReferencePlacedResolutionUnitstring_+ 
ManifestReferencePlacedXResolutionstring_+ 
ManifestReferencePlacedYResolutionstring_+ 
ManifestReferenceRenditionClassstring_+ 
ManifestReferenceRenditionParamsstring_+ 
ManifestReferenceToPartstring_+ 
ManifestReferenceVersionIDstring_+ 
OriginalDocumentIDstring 
Pantrystruct+--> PantryItem Struct
PantryInstanceIDstring_ 
PreservedFileNamestring 
RenditionClassstring 
RenditionOfstruct--> ResourceRef Struct
RenditionOfAlternatePathsstring_+ 
RenditionOfDocumentIDstring_ 
RenditionOfFilePathstring_ 
RenditionOfFromPartstring_ 
RenditionOfInstanceIDstring_ 
RenditionOfLastModifyDatedate_ 
RenditionOfLastURLstring_ 
RenditionOfLinkCategorystring_ 
RenditionOfLinkFormstring_ 
RenditionOfManagerstring_ 
RenditionOfManagerVariantstring_ 
RenditionOfManageTostring_ 
RenditionOfManageUIstring_ 
RenditionOfMaskMarkersstring_'All' = All +
'None' = None
RenditionOfOriginalDocumentIDstring_ 
RenditionOfPartMappingstring_ 
RenditionOfPlacedResolutionUnitstring_ 
RenditionOfPlacedXResolutionstring_ 
RenditionOfPlacedYResolutionstring_ 
RenditionOfRenditionClassstring_ 
RenditionOfRenditionParamsstring_ 
RenditionOfToPartstring_ 
RenditionOfVersionIDstring_ 
RenditionParamsstring 
SaveIDinteger 
Subjectstring/+(undocumented)
VersionIDstring 
Versionsstruct+--> Version Struct
VersionsCommentsstring_+ 
VersionsEventstruct_+--> ResourceEvent Struct
VersionsEventActionstring_+ 
VersionsEventChangedstring_+ 
VersionsEventInstanceIDstring_+ 
VersionsEventParametersstring_+ 
VersionsEventSoftwareAgentstring_+ 
VersionsEventWhendate_+ 
VersionsModifierstring_+ 
VersionsModifyDatedate_+ 
VersionsVersionstring_+ 
+ +

XMP ResourceRef Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
AlternatePathsstring+ 
DocumentIDstring 
FilePathstring 
FromPartstring 
InstanceIDstring 
LastModifyDatedate 
LastURLstring 
LinkCategorystring 
LinkFormstring 
ManageTostring 
ManageUIstring 
Managerstring 
ManagerVariantstring 
MaskMarkersstringAll = All +
None = None
OriginalDocumentIDstring 
PartMappingstring 
PlacedResolutionUnitstring 
PlacedXResolutionstring 
PlacedYResolutionstring 
RenditionClassstring 
RenditionParamsstring 
ToPartstring 
VersionIDstring 
+ +

XMP ResourceEvent Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Actionstring 
Changedstring 
InstanceIDstring 
Parametersstring 
SoftwareAgentstring 
Whendate 
+ +

XMP ManifestItem Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
LinkFormstring 
PlacedResolutionUnitstring 
PlacedXResolutionreal 
PlacedYResolutionreal 
ReferenceResourceRef--> ResourceRef Struct
+ +

XMP PantryItem Struct

+

This structure must have an InstanceID field, but may also contain any other +XMP properties.

+
+
+ + + + + + + +
Field NameWritableValues / Notes
InstanceIDstring 
+ +

XMP Version Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
Commentsstring 
EventResourceEvent--> ResourceEvent Struct
Modifierstring 
ModifyDatedate 
Versionstring 
+ +

XMP xmpNote Tags

+

XMP Note namespace tags.

+ +

These tags belong to the ExifTool XMP-xmpNote family 1 group.

+
+
+ + + + + + + +
Tag NameWritableValues / Notes
HasExtendedXMPstring*(this tag is protected so it is not writable directly. Instead, it is set +automatically to the GUID of the extended XMP when writing extended XMP to a +JPEG image)
+ +

XMP xmpPLUS Tags

+

XMP Picture Licensing Universal System (PLUS) tags as written by some older +Adobe applications. See PLUS XMP Tags +for the current PLUS tags.

+ +

These tags belong to the ExifTool XMP-xmpPLUS family 1 group.

+
+
+ + + + + + + + + + + +
Tag NameWritableValues / Notes
CreditLineReqboolean/ 
ReuseAllowedboolean/ 
+ +

XMP xmpRights Tags

+

XMP Rights Management namespace tags.

+ +

These tags belong to the ExifTool XMP-xmpRights family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Certificatestring 
Markedboolean 
Ownerstring+ 
UsageTermslang-alt 
WebStatementstring 
+ +

XMP xmpTPg Tags

+

XMP Paged-Text namespace tags.

+ +

These tags belong to the ExifTool XMP-xmpTPg family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Colorantsstruct+--> Colorant Struct
ColorantAinteger_+(ColorantsA)
ColorantBinteger_+(ColorantsB)
ColorantBlackreal_+(ColorantsBlack)
ColorantBlueinteger_+(ColorantsBlue)
ColorantCyanreal_+(ColorantsCyan)
ColorantGrayinteger_+(ColorantsGray)
ColorantGreeninteger_+(ColorantsGreen)
ColorantLreal_+(ColorantsL)
ColorantMagentareal_+(ColorantsMagenta)
ColorantModestring_+(ColorantsMode) +
'CMYK' = CMYK +
'LAB' = Lab +
'RGB' = RGB
ColorantRedinteger_+(ColorantsRed)
ColorantSwatchNamestring_+(ColorantsSwatchName)
ColorantTintinteger_+(ColorantsTint; not part of 2010 XMP specification)
ColorantTypestring_+(ColorantsType)
ColorantYellowreal_+(ColorantsYellow)
Fontsstruct+--> Font Struct
ChildFontFilesstring_+(FontsChildFontFiles)
FontCompositeboolean_+(FontsComposite)
FontFacestring_+(FontsFontFace)
FontFamilystring_+(FontsFontFamily)
FontFileNamestring_+(FontsFontFileName)
FontNamestring_+(FontsFontName)
FontTypestring_+(FontsFontType)
FontVersionstring_+(FontsVersionString)
HasVisibleOverprintboolean 
HasVisibleTransparencyboolean 
MaxPageSizestruct--> Dimensions Struct
MaxPageSizeHreal_ 
MaxPageSizeUnitstring_ 
MaxPageSizeWreal_ 
NPagesinteger 
PlateNamesstring+ 
SwatchGroupsstruct+--> SwatchGroup Struct
SwatchGroupsColorantsstruct_+--> Colorant Struct
SwatchColorantAinteger_+(SwatchGroupsColorantsA)
SwatchColorantBinteger_+(SwatchGroupsColorantsB)
SwatchColorantBlackreal_+(SwatchGroupsColorantsBlack)
SwatchColorantBlueinteger_+(SwatchGroupsColorantsBlue)
SwatchColorantCyanreal_+(SwatchGroupsColorantsCyan)
SwatchColorantGrayinteger_+(SwatchGroupsColorantsGray)
SwatchColorantGreeninteger_+(SwatchGroupsColorantsGreen)
SwatchColorantLreal_+(SwatchGroupsColorantsL)
SwatchColorantMagentareal_+(SwatchGroupsColorantsMagenta)
SwatchColorantModestring_+(SwatchGroupsColorantsMode) +
'CMYK' = CMYK +
'LAB' = Lab +
'RGB' = RGB
SwatchColorantRedinteger_+(SwatchGroupsColorantsRed)
SwatchColorantSwatchNamestring_+(SwatchGroupsColorantsSwatchName)
SwatchColorantTintinteger_+(SwatchGroupsColorantsTint; not part of 2010 XMP specification)
SwatchColorantTypestring_+(SwatchGroupsColorantsType)
SwatchColorantYellowreal_+(SwatchGroupsColorantsYellow)
SwatchGroupNamestring_+(SwatchGroupsGroupName)
SwatchGroupTypeinteger_+(SwatchGroupsGroupType)
+ +

XMP Font Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
ChildFontFilesstring+ 
Compositeboolean 
FontFacestring 
FontFamilystring 
FontFileNamestring 
FontNamestring 
FontTypestring 
VersionStringstring 
+ +

XMP SwatchGroup Struct

+
+
+ + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
ColorantsColorant+--> Colorant Struct
GroupNamestring 
GroupTypeinteger 
+ +

XMP XML Tags

+
+
+ + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'dc'dc---> XMP dc Tags
'lastUpdate'LastUpdateno 
+ +

XMP SVG Tags

+

SVG (Scalable Vector Graphics) image tags. By default, only the top-level +SVG and Metadata tags are extracted from these images, but all graphics tags +may be extracted by setting the Unknown option to 2 (-U on the command +line). The SVG tags are not part of XMP as such, but are included with the +XMP module for convenience. (see http://www.w3.org/TR/SVG11/)

+ +

These tags belong to the ExifTool XMP-svg family 1 group.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag IDTag NameWritableValues / Notes
'height'ImageHeightno 
'id'IDno 
'metadataId'MetadataIDno 
'version'SVGVersionno 
'width'ImageWidthno 
+ +

XMP CopyrightOwner Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
CopyrightOwnerIDstring 
CopyrightOwnerNamestring 
+ +

XMP EndUser Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
EndUserIDstring 
EndUserNamestring 
+ +

XMP ImageCreator Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
ImageCreatorIDstring 
ImageCreatorNamestring 
+ +

XMP ImageSupplier Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
ImageSupplierIDstring 
ImageSupplierNamestring 
+ +

XMP Licensee Struct

+
+
+ + + + + + + + + + + +
Field NameWritableValues / Notes
LicenseeIDstring 
LicenseeNamestring 
+ +

XMP Licensor Struct

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameWritableValues / Notes
LicensorCitystring 
LicensorCountrystring 
LicensorEmailstring 
LicensorExtendedAddressstring 
LicensorIDstring 
LicensorNamestring 
LicensorPostalCodestring 
LicensorRegionstring 
LicensorStreetAddressstring 
LicensorTelephone1string 
LicensorTelephone2string 
LicensorTelephoneType1stringcell = Cell +
fax = FAX +
home = Home +
pager = Pager +
work = Work
LicensorTelephoneType2stringcell = Cell +
fax = FAX +
home = Home +
pager = Pager +
work = Work
LicensorURLstring 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 12, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/ZIP.html b/html/TagNames/ZIP.html new file mode 100644 index 0000000..ccf41c2 --- /dev/null +++ b/html/TagNames/ZIP.html @@ -0,0 +1,211 @@ + + + + +ZIP Tags + + + +

ZIP Tags

+

The following tags are extracted from ZIP archives. ExifTool also extracts +additional meta information from compressed documents inside some ZIP-based +files such Office Open XML (DOCX, PPTX and XLSX), Open Document (ODB, ODC, +ODF, ODG, ODI, ODP, ODS and ODT), iWork (KEY, PAGES, NUMBERS), Capture One +Enhanced Image Package (EIP), Adobe InDesign Markup Language (IDML), +Electronic Publication (EPUB), and Sketch design files (SKETCH). The +ExifTool family 3 groups may be used to organize ZIP tags by embedded +document number (ie. the exiftool -g3 option).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index2Tag NameWritableValues / Notes
2ZipRequiredVersionno 
3ZipBitFlagno 
4ZipCompressionno +
0 = None +
1 = Shrunk +
2 = Reduced with compression factor 1 +
3 = Reduced with compression factor 2 +
4 = Reduced with compression factor 3 +
5 = Reduced with compression factor 4 +
6 = Imploded +
7 = Tokenized +
8 = Deflated +
9 = Enhanced Deflate using Deflate64(tm) +
10 = Imploded (old IBM TERSE) +
12 = BZIP2 +
14 = LZMA (EFS) +
18 = IBM TERSE (new) +
19 = IBM LZ77 z Architecture (PFS) +
96 = JPEG recompressed +
97 = WavPack compressed +
98 = PPMd version I, Rev 1
+
5ZipModifyDateno 
7ZipCRCno 
9ZipCompressedSizeno 
11ZipUncompressedSizeno 
15ZipFileNameno 
'_com'ZipFileCommentno 
+ +

ZIP GZIP Tags

+

These tags are extracted from GZIP (GNU ZIP) archives, but currently only +for the first file in the archive.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
2Compressionno8 = Deflated
3FlagsnoBit 0 = Text +
Bit 1 = CRC16 +
Bit 2 = ExtraFields +
Bit 3 = FileName +
Bit 4 = Comment
4ModifyDateno 
8ExtraFlagsno0 = (none) +
2 = Maximum Compression +
4 = Fastest Algorithm
9OperatingSystemno +
0 = FAT filesystem (MS-DOS, OS/2, NT/Win32) +
1 = Amiga +
2 = VMS (or OpenVMS) +
3 = Unix +
4 = VM/CMS +
5 = Atari TOS +
6 = HPFS filesystem (OS/2, NT) +
7 = Macintosh +
8 = Z-System +
9 = CP/M +
10 = TOPS-20 +
11 = NTFS filesystem (NT) +
12 = QDOS +
13 = Acorn RISCOS +
255 = unknown
+
10ArchivedFileNameno 
11Commentno 
+ +

ZIP RAR Tags

+

These tags are extracted from RAR archive files.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
0CompressedSizeno 
4UncompressedSizeno 
8OperatingSystemno0 = MS-DOS +
1 = OS/2 +
2 = Win32 +
3 = Unix
13ModifyDateno 
18PackingMethodno + +
0x30 = Stored +
0x31 = Fastest +
0x32 = Fast
  0x33 = Normal +
0x34 = Good Compression +
0x35 = Best Compression
+
25ArchivedFileNameno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Jan 12, 2022 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/ZISRAW.html b/html/TagNames/ZISRAW.html new file mode 100644 index 0000000..79eefe6 --- /dev/null +++ b/html/TagNames/ZISRAW.html @@ -0,0 +1,41 @@ + + + + +ZISRAW Tags + + + +

ZISRAW Tags

+

As well as the header information listed below, ExifTool also extracts the +top-level XML-based metadata from Zeiss Integrated Software RAW (ZISRAW) CZI +files.

+
+
+ + + + + + + + + + + + + + + + + + +
Index1Tag NameWritableValues / Notes
32ZISRAWVersionno 
48PrimaryFileGUIDno 
64FileGUIDno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Aug 10, 2020 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/iWork.html b/html/TagNames/iWork.html new file mode 100644 index 0000000..af4d31b --- /dev/null +++ b/html/TagNames/iWork.html @@ -0,0 +1,50 @@ + + + + +iWork Tags + + + +

iWork Tags

+

The Apple iWork '09 file format is a ZIP archive containing XML files +similar to the Office Open XML (OOXML) format. Metadata tags in iWork +files are extracted even if they don't appear below.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tag NameWritableValues / Notes
Authorno 
Commentno 
Copyrightno 
Keywordsno 
Projectsno+ 
Titleno 
+ +
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Last revised Nov 11, 2009 +

<-- ExifTool Tag Names

+ + diff --git a/html/TagNames/index.html b/html/TagNames/index.html new file mode 100644 index 0000000..befc85d --- /dev/null +++ b/html/TagNames/index.html @@ -0,0 +1,243 @@ + + + + +ExifTool Tag Names + + + +

ExifTool Tag Names

+

+The tables listed below give the names of all tags recognized by ExifTool. +They contain a total of 25816 tags, with 16503 unique tag names. +

+
+
+ + +
Tag Table Index
+JPEG
+EXIF
+IPTC
+XMP
+GPS
+GeoTiff
+PLUS
+ICC_Profile
+PrintIM
+Photoshop
+Apple
+NikonSettings
+Canon
+CanonCustom
+CanonVRD
+Casio
+DJI
+FLIR
+FujiFilm
+GE
+HP
+JVC
+Kodak
+Leaf
+Minolta
+Motorola
+Nikon
+NikonCustom
+NikonCapture
+Nintendo
+Olympus
+Panasonic
+Pentax
+PhaseOne
+Reconyx
+Sanyo
+Samsung
+Ricoh
+Sigma
+Sony
+SonyIDC
+Unknown
+DNG
+CanonRaw
+KyoceraRaw
+MinoltaRaw
+PanasonicRaw
+SigmaRaw
+Lytro
+JFIF
+FlashPix
+MPF
+Stim
+Scalado
+GoPro
+Qualcomm
+Jpeg2000
+JSON
+CBOR
+PLIST
+APP12
+AFCP
+DarwinCore
+FotoStation
+PhotoMechanic
+Microsoft
+GIMP
+MIE
+GIF
+BMP
+BPG
+PICT
+PNG
+MNG
+FLIF
+DjVu
+DPX
+OpenEXR
+ZISRAW
+MRC
+LIF
+MIFF
+PCX
+PGF
+PSP
+PhotoCD
+Radiance
+PFM
+PDF
+PostScript
+ID3
+ITC
+FLAC
+Ogg
+Vorbis
+Opus
+Theora
+APE
+Audible
+MPC
+MPEG
+M2TS
+H264
+QuickTime
+Parrot
+Matroska
+MOI
+MXF
+DV
+Flash
+Real
+Red
+RIFF
+AIFF
+ASF
+WTV
+DICOM
+FITS
+HTML
+Palm
+Torrent
+EXE
+LNK
+Font
+VCard
+Text
+RSRC
+Rawzor
+ZIP
+RTF
+OOXML
+iWork
+ISO
+MacOS
+Extra
+Composite
+Shortcuts
+MWG +
+

+Tag ID, Index# or Sequence is given in the first column of each +table. A Tag ID is the computer-readable equivalent of a tag name, and +is the identifier that is actually stored in the file. Index# refers to +the offset of a value when found at a fixed position within a data block +(# is the multiplier for calculating a byte offset: 1, 2, 4 or +8). These offsets may have a decimal part which is used only to +differentiate tags with values stored at the same position. (Note that +writable tags within binary data blocks are not individually deletable, +and the usual alternative is to set them to a value of zero.) Sequence +gives the order of values for a serial data stream.

+ +

A Tag Name is the handle by which the information is accessed in +ExifTool. In some instances, more than one name may correspond to a single +tag ID. In these cases, the actual name used depends on the context in +which the information is found. Case is not significant for tag names. A +question mark (?) after a tag name indicates that the information is +either not understood, not verified, or not very useful -- these tags are +not extracted by ExifTool unless the Unknown (-u) option is enabled. Be +aware that some tag names are different than the descriptions printed out by +default when extracting information with exiftool. To see the tag names +instead of the descriptions, use exiftool -s.

+ +

The Writable column indicates whether the tag is writable by ExifTool. +Anything but a no in this column means the tag is writable. A yes +indicates writable information that is either unformatted or written using +the existing format. Other expressions give details about the format of the +stored value, and vary depending on the general type of information. The +format name may be followed by a number in square brackets to indicate the +number of values written, or the number of characters in a fixed-length +string (including a null terminator which is added if required).

+ +

A plus sign (+) after an entry in the Writable column indicates a +List tag which supports multiple values and allows individual values to +be added and deleted. A slash (/) indicates a tag that ExifTool will +Avoid when writing. These will be edited but not created if another +same-named tag may be created instead. To create these tags, the group +should be specified. A tilde (~) indicates a tag this is writable only +when the print conversion is disabled (by setting PrintConv to 0, using the +-n option, or suffixing the tag name with a # character). An exclamation +point (!) indicates a tag that is considered Unsafe to write under +normal circumstances. These tags are not written unless specified +explicitly (ie. not when wildcards or "all" are used), and care should be +taken when editing them manually since they may affect the way an image is +rendered. An asterisk (*) indicates a Protected tag which is not +writable directly, but is written automatically by ExifTool (often when a +corresponding Composite or +Extra tag is written). A colon +(:) indicates a Mandatory tag which may be added automatically when +writing. Normally MakerNotes tags may not be deleted individually, but a +caret (^) indicates a Deletable MakerNotes tag.

+ +

The HTML version of these tables also lists possible Values for +discrete-valued tags, as well as Notes for some tags. The Values are +listed with the computer-readable values on the left of the equals sign +(=), and the human-readable values on the right. The human-readable +values are used by default when reading and writing, but the +computer-readable values may be accessed by disabling the value conversion +with the -n option on the command line, by setting the PrintConv option to 0 +in the API, or or on a per-tag basis by adding a hash (#) after the tag +name.

+ +

Note: If you are familiar with common meta-information tag names, you may +find that some ExifTool tag names are different than expected. The usual +reason for this is to make the tag names more consistent across different +types of meta information. To determine a tag name, either consult this +documentation or run exiftool -s on a file containing the information in +question.

+ +

(This documentation is the result of years of research, testing and +reverse engineering, and is the most complete metadata tag list available +anywhere on the internet. It is provided not only for ExifTool users, but +more importantly as a public service to help augment the collective +knowledge, and is often used as a primary source of information in the +development of other metadata software. Please help keep this documentation +as accurate and complete as possible, and feed any new discoveries back to +ExifTool. A big thanks to everyone who has helped with this so far!) +

+
+(This document generated automatically by Image::ExifTool::BuildTagLookup) +
Created Feb 15, 2005 +
Last revised Jul 21, 2022 +

<-- Back to ExifTool home page

+ + diff --git a/html/TagNames/style.css b/html/TagNames/style.css new file mode 100644 index 0000000..0a0a5fb --- /dev/null +++ b/html/TagNames/style.css @@ -0,0 +1,31 @@ +body { color: black; background: white; margin-top: 0; + font-family: helvetica; font-size: .9em } +code { color: #840; font-family: monospace; white-space: nowrap } + +table.frame { background: #fb7 } /* frame color */ +table.frame td { padding: 0 } /* frame padding */ +table.frame tr { background: white }/* main cell color */ +table.inner { background: white } /* table cell borders */ +table.inner th { padding: 2px } /* header padding */ +table.inner td { padding: 2px } /* cell padding */ +table.sep td { padding: 0 2px; /* separate table values */ + font-size: smaller } +table.cols tr { background: transparent } +table.cols td { padding: 0; /* PrintConvColumns table */ + font-size: smaller } +table tr { vertical-align: top } /* universal text alignment */ +table tr.b { background: #feb } /* alternate cell color */ +table td.b { background: #feb } /* alternate cell color */ +table tr.h { background: #fb7 } /* table header */ +table td.c { text-align: center } /* centered text cells */ +table td.r { text-align: right } /* numerical tag ID's */ +table td.n { white-space: nowrap } /* to avoid wrapping some tag names */ + +h2 { margin: .6em 0 .6em 0 }/* table headings */ +h2.top { margin: .3em 0 .6em 0 }/* top heading */ +p { margin: 1em 1em } /* paragraph text */ +p.lf { margin: 1em 0 } /* text footer */ + +span.n { color: #666 } /* notes text color */ +span.s { font-size: smaller } /* small values/notes text */ +span.l { font-size: larger } /* index table heading */ diff --git a/html/ancient_history.html b/html/ancient_history.html new file mode 100644 index 0000000..e50a67e --- /dev/null +++ b/html/ancient_history.html @@ -0,0 +1,11077 @@ + + + + ExifTool Ancient History + + + + + +

ExifTool Ancient History

+ +

Note: This page gives the history of older exiftool versions. See +history.html for the recent history.

+ +Apr. 22, 2021 - Version 12.25 +
    +
  • JPEG XL support is now official +
  • Added read support for Medical Research Council (MRC) image files +
  • Added ability to write a number of 3gp tags in video files +
  • Added a new Sony PictureProfile value (thanks Jos Roost) +
  • Added a new Sony LensType (thanks LibRaw) +
  • Added a new Nikon LensID (thanks Niels Kristian Bech Jensen) +
  • Added a new Canon LensType +
  • Decode more GPS information from Blackvue dashcam videos +
  • Decode a couple of new NikonSettings tags (thanks Warren Hatch) +
  • Decode a few new RIFF tags +
  • Improved Validate option to add minor warning if standard XMP is missing + xpacket wrapper +
  • Avoid decoding some large arrays in DNG images to improve performance unless + the -m option is used +
  • Patched bug that could give runtime warning when trying to write an empty + XMP structure +
  • Fixed decoding of ImageWidth/Height for JPEG XL images +
  • Fixed problem were Microsoft Xtra tags couldn't be deleted +
+ +Apr. 13, 2021 - Version 12.24 +
    +
  • Added a new PhaseOne RawFormat value (thanks LibRaw) +
  • Decode a new Sony tag (thanks Jos Roost) +
  • Decode a few new Panasonic and FujiFilm tags (thanks LibRaw and Greybeard) +
  • Updated acdsee.config in distribution (thanks StarGeek) +
  • Recognize AutoCAD DXF files +
  • More work on experimental JUMBF read support +
  • More work on experimental JPEG XL read/write support +
  • Patched security vulnerability in DjVu reader +
+ +Apr. 1, 2021 - Version 12.23 +
    +
  • Added support for Olympus ORI files +
  • Added experimental read/write support for JPEG XL images +
  • Added experimental read support for JUMBF metadata in JPEG and Jpeg2000 + images +
  • Added built-in support for parsing GPS track from Denver ACG-8050 videos + with the -ee option +
  • Added a some new Sony lenses (thanks Jos Roost and LibRaw) +
  • Changed priority of Samsung trailer tags so the first DepthMapImage takes + precedence when -a is not used +
  • Improved identification of M4A audio files +
  • Patched to avoid escaping ',' in "Binary data" message when -struct is used +
  • Removed Unknown flag from MXF VideoCodingSchemeID tag +
  • Fixed -forcewrite=EXIF to apply to EXIF in binary header of EPS files +
  • API Changes: + +
+ +Mar. 17, 2021 - Version 12.22 +
    +
  • Added a few new Sony LensTypes and a new SonyModelID (thanks Jos Roost and + LibRaw) +
  • Added Extra BaseName tag +
  • Added a new CanonModelID (thanks LibRaw) +
  • Decode timed GPS from unlisted programs in M2TS videos with the -ee3 option +
  • Decode more Sony rtmd tags +
  • Decode some tags for the Sony ILME-FX3 (thanks Jos Roost) +
  • Allow negative values to be written to XMP-aux:LensID +
  • Recognize HEVC video program in M2TS files +
  • Enhanced -b option so --b suppresses tags with binary data +
  • Improved flexibility when writing GPS coordinates: +
      +
    • Now pulls latitude and longitude from a combined GPSCoordinates string +
    • Recognize full word "South" and "West" to write negative coordinates +
    +
  • Improved warning when trying to write an integer QuickTime date/time tag and + Time::Local is not available +
  • Convert GPSSpeed from mph to km/h in timed GPS from Garmin MP4 videos +
+ +Feb. 24, 2021 - Version 12.21 +
    +
  • Added a few new iOS QuickTime tags +
  • Decode a couple more Sony rtmd tags +
  • Patch to avoid possible "Use of uninitialized value" warning when attempting + to write QuickTime date/time tags with an invalid value +
  • Fixed problem writing Microsoft Xtra tags +
  • Fixed Windows daylight savings time patch for file times that was broken in + 12.19 (however directory times will not yet handle DST properly) +
+ +Feb. 23, 2021 - Version 12.20 +
    +
  • Added ability to write some Microsoft Xtra tags in MOV/MP4 videos +
  • Added two new Canon LensType values (thanks Norbert Wasser) +
  • Added a new Nikon LensID +
  • Fixed problem reading FITS comments that start before column 11 +
+ +Feb. 18, 2021 - Version 12.19 +
    +
  • Added -list_dir option +
  • Added the "ls-l" Shortcut tag +
  • Extract Comment and History from FITS files +
  • Enhanced FilePermissions to include device type (similar to "ls -l") +
  • Changed the name of Apple ContentIdentifier tag to MediaGroupUUID + (thanks Neal Krawetz) +
  • Fixed a potential "substr outside of string" runtime error when reading + corrupted EXIF +
  • Fixed edge case where NikonScanIFD may not be copied properly when copying + MakerNotes to another file +
  • API Changes: +
      +
    • Added ability to read/write System tags of directories +
    • Enhanced GetAllGroups() to support family 7 and take optional ExifTool + reference +
    • Changed QuickTimeHandler option default to 1 +
    +
+ +Feb. 9, 2021 - Version 12.18 +
    +
  • Added a new SonyModelID +
  • Decode a number of Sony tags for the ILCE-1 (thanks Jos Roost) +
  • Decode a couple of new Canon tags (thanks LibRaw) +
  • Patched to read differently formatted UserData:Keywords as written by iPhone +
  • Patched to tolerate out-of-order Nikon MakerNote IFD entries when obtaining + tags necessary for decryption +
  • Fixed a few possible Condition warnings for some NikonSettings tags +
+ +Feb. 3, 2021 - Version 12.17 +
    +
  • Added a new Canon FocusMode value +
  • Added a new FujiFilm FilmMode value +
  • Added a number of new XMP-crs tags (thanks Herb) +
  • Decode a new H264 MDPM tag +
  • Allow non-conforming lower-case XMP boolean "true" and "false" values to be + written, but only when print conversion is disabled +
  • Improved Validate option to warn about non-capitalized boolean XMP values +
  • Improved logic for setting GPSLatitude/LongitudeRef values when writing +
  • Changed -json and -php options so the -a option is implied even without the + -g option +
  • Avoid extracting audio/video data from AVI videos when -ee -u is used +
  • Patched decoding of Canon ContinuousShootingSpeed for newer firmware + versions of the EOS-1DXmkIII +
  • Re-worked LensID patch of version 12.00 (github issue #51) +
  • Fixed a few typos in newly-added NikonSettings tags (thanks Herb) +
  • Fixed problem where group could not be specified for PNG-pHYs tags when + writing +
+ +Jan. 21, 2021 - Version 12.16 (production release) +
    +
  • Extract another form of video subtitle text +
  • Enhanced -ee option with -ee2 and -ee3 to allow parsing of the H264 video + stream in MP4 files +
  • Changed a Nikon FlashMode value +
  • Fixed problem that caused a failed DPX test on Strawberry Perl +
  • API Changes: + +
+ +Jan. 18, 2021 - Version 12.15 (production release) +
    +
  • Added a couple of new Sony LensType values (thanks LibRaw and Jos Roost) +
  • Added a new Nikon FlashMode value (thanks Mike) +
  • Decode NikonSettings (thanks Warren Hatch) +
  • Decode thermal information from DJI RJPEG images +
  • Fixed extra newline in -echo3 and -echo4 outputs added in version 12.10 +
  • Fixed out-of-memory problem when writing some very large PNG files under + Windows +
+ +Jan. 6, 2021 - Version 12.14 +
    +
  • Added support for 2 more types of timed GPS in video files (that makes 49 + different formats now supported) +
  • Added validity check for PDF trailer dictionary Size +
  • Added a new Pentax LensType +
  • Extract metadata from Jpeg2000 Association box +
  • Changed -g:XX:YY and -G:XX:YY options to show empty strings for non-existent + groups +
  • Patched to issue warning and avoid writing date/time values with a zero + month or day number +
  • Patched to avoid runtime warnings if trying to set FileName to an empty + string +
  • Fixed issue that could cause GPS test number 12 to fail on some systems +
  • Fixed problem extracting XML as a block from Jpeg2000 images, and extract + XML tags in the XML group instead of XMP +
+ +Dec. 24, 2020 - Version 12.13 +
    +
  • Added -i HIDDEN option to ignore files with names that start with "." +
  • Added a few new Nikon ShutterMode values (thanks Jan Škoda) +
  • Added ability to write Google GCamera MicroVideo XMP tags +
  • Add time zone automatically to most string-based QuickTime date/time tags + when writing unless the PrintConv option is disabled +
  • Decode a new Sony tag (thanks LibRaw) +
  • Changed behaviour when writing only pseudo tags to return an error and avoid + writing any other tags if writing FileName fails +
  • Print "X image files read" message even if only 1 file is read when at least + one other file has failed the -if condition +
+ +Dec. 4, 2020 - Version 12.12 +
    +
  • Added ability to geotag from DJI CSV log files +
  • Added a new CanonModelID +
  • Added a couple of new Sony LensType values (thanks LibRaw) +
  • Enhanced -csvDelim option to allow "\t", "\n", "\r" and "\\" +
  • Unescape "\b" and "\f" in imported JSON values +
  • Fixed bug introduced in 12.10 which generated a "Not an integer" warning + when attempting to shift some QuickTime date/time tags +
  • Fixed shared-write permission problem with -@ argfile when using -stay_open + and a filename containing special characters on Windows +
+ +Nov. 27, 2020 - Version 12.11 +
    +
  • Added -csvDelim option +
  • Added new Canon and Olympus LensType values (thanks LibRaw) +
  • Added a warning if ICC_Profile is deleted from an image (github issue #63) +
  • EndDir() function for -if option now works when -fileOrder is used +
  • Changed FileSize conversion to use binary prefixes since that is how the + conversion is currently done (eg. MiB instead of MB) +
  • Patched -csv option so columns aren't resorted when using -G option and one + of the tags is missing from a file +
  • Fixed incompatiblity with Google Photos when writing UserData:GPSCoordinates + to MP4 videos +
  • Fixed problem where the tags available in a -p format string were limited to + the same as the -if[NUM] option when NUM was specified +
  • Fixed incorrect decoding of SourceFileIndex/SourceDirectoryIndex for Ricoh + models +
+ +Nov. 12, 2020 - Version 12.10 +
    +
  • Added -validate test for proper TIFF magic number in JPEG EXIF header +
  • Added support for Nikon Z7 LensData version 0801 +
  • Added a new XMP-GPano tag +
  • Decode ColorData for the Canon EOS 1DXmkIII (thanks LibRaw) +
  • Decode more tags for the Sony ILCE-7SM3 (thanks Jos Roost) +
  • Automatically apply QuickTimeUTC option for CR3 files +
  • Improved decoding of XAttrMDLabel from MacOS files +
  • Ignore time zones when writing date/time values and using the -d option +
  • Enhanced -echo3 and -echo4 options to allow exit status to be returned +
  • Changed -execute so the -q option no longer suppresses the "{ready}" message + when a synchronization number is used (eg. -execute123) +
+ +Oct. 29, 2020 - Version 12.09 +
    +
  • Added ability to copy CanonMakerNotes from CR3 images to other file types +
  • Added read support for ON1 presets file (.ONP) +
  • Added two new CanonModelID values +
  • Added trailing "/" when writing QuickTime:GPSCoordinates +
  • Added a number of new XMP-crs tags +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Added a new Nikon Z lens (thanks LibRaw) +
  • Added a new Canon LensType +
  • Decode ColorData for Canon EOS R5/R6 +
  • Decode a couple of new HEIF tags +
  • Decode FirmwareVersion for Canon M50 +
  • Improved decoding of Sony CreativeStyle tags (thanks Jos Roost) +
  • Improved parsing of Radiance files to recognize comments +
  • Renamed GIF AspectRatio tag to PixelAspectRatio +
  • Patched EndDir() feature so subdirectories are always processed when -r is + used (previously, EndDir() would end processing of a directory completely) +
  • Yet another tweak to the EventTime formatting rules (also allow time-only + values with fractional seconds and a time zone) +
  • Avoid loading GoPro module unnecessarily when reading MP4 videos from some + other cameras +
  • Fixed problem with an incorrect naming of CodecID tags in some MKV videos +
  • Fixed verbose output to avoid "adding" messages for existing flattened XMP + tags +
+ +Oct. 15, 2020 - Version 12.08 +
    +
  • Added read support for MacOS "._" sidecar files +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Recognize Mac OS X xattr files +
  • Extract ThumbnailImage from MP4 videos of more dashcam models +
  • Improved decoding of a number of Sony tags (thanks Jos Roost) +
  • Fixed problem where the special -if EndDir() function didn't work properly + for directories after the one in which it was initially called +
  • Patched to read DLL files which don't have a .rsrc section (thanks Hank) +
  • Patched to support new IGC date format when geotagging +
  • Patched to read DLL files with an invalid size in the header +
+ +Oct. 2, 2020 - Version 12.07 +
    +
  • Added support for GoPro .360 videos +
  • Added some new Canon RF and Nikkor Z lenses (thanks LibRaw) +
  • Added some new Sony LensType and CreativeStyle values and decode some + ILCE-7C tags (thanks Jos Roost) +
  • Added a number of new Olympus SceneMode values (thanks Herb) +
  • Added a new Nikon LensID +
  • Decode more timed metadata from Insta360 videos (thanks Thomas Allen) +
  • Decode timed GPS from videos of more Garmin dashcam models +
  • Decode a new GoPro video tag +
  • Reformat time-only EventTime values when writing and prevent arbitrary + strings from being written +
  • Patched to accept backslashes in SourceFile entries for -csv option +
+ +Sept. 11, 2020 - Version 12.06 +
    +
  • Added read support for Lyrics3 metadata (and fixed problem where APE + metadata may be ignored if Lyrics3 exists) +
  • Added a new Panasonic VideoBurstMode value (thanks Klaus Homeister) +
  • Added a new Olympus MultipleExposureMode value +
  • Added a new Nikon LensID +
  • Added back conversions for XMP-dwc EventTime that were removed in 12.04 with + a patch to allow time-only values +
  • Decode GIF AspectRatio +
  • Decode Olympus FocusBracketStepSize (thanks Karsten) +
  • Extract PNG iDOT chunk in Binary format with the name AppleDataOffsets +
  • Process PNG images which do not start with mandatory IHDR chunk +
+ +Aug. 24, 2020 - Version 12.05 +
    +
  • Added a new Panasonic SelfTimer value (thanks Herb) +
  • Decode a few more DPX tags (thanks Harry Mallon) +
  • Extract AIFF APPL tag as ApplicationData +
  • Fixed bug writing QuickTime ItemList 'gnre' Genre values +
  • Fixed an incorrect value for Panasonic VideoBurstResolution (thanks Herb) +
  • Fixed problem when applying a time shift to some invalid makernote date/time + values +
+ +Aug. 10, 2020 - Version 12.04 +
    +
  • Added read support for Zeiss ZISRAW CZI files +
  • Added some new values for a couple of Olympus tags (thanks Sebastian) +
  • Decode a number of new tags for the Sony ILCE-7SM3 (thanks Jos Roost) +
  • Removed formatting restrictions on XMP-dwc:EventTime to allow a time-only + value to be written +
  • Moved new QuckTime ItemList tags added in version 12.02 to the proper group + (they were incorrectly added to the Keys group) +
  • Improved QuickTime -v3 output to show default language codes +
  • Patched -lang option to work for the values of somet tags with coded + translations +
  • Patched the format of a number of QuickTime tags when writing for improved + compatibility with iTunes and AtomicParsley +
  • Patched to write a default QuickTime language code of 0x0000 (null) instead + of 0x55c4 ('und') +
+ +July 29, 2020 - Version 12.03 +
    +
  • Added family 7 group names to allow tag ID's to be specified when reading + and writing +
  • Fixed a couple of typos in tag values (thanks Herb) +
  • API Changes: + +
  • Internal Changes: +
      +
    • Changed Composite tag ID's to use "-" instead of "::" as a separator +
    +
+ +July 27, 2020 - Version 12.02 +
    +
  • Added support for a number of new QuickTime ItemList tags +
  • Added support for writing XMP-xmp:RatingPercent +
  • Added a new Sony LensType (thanks Jos Roost and LibRaw) +
  • Added a new Pentax LensType (thanks James O'Neill) +
  • Decode barcodes from Ricoh APP5 RMETA segment +
  • Decode a few new QuickTime tags written by Ricoh and Garmin cameras +
  • Decode timed GPS from Sony A7R IV MP4 videos +
  • Decode timed GPS from 70mai dashcam videos +
  • Decode a few new Panasonic tags (thanks Klaus Homeister) +
  • Decode altitude and more accurate latitude/longitude from Transcend Driver + Pro 230 MP4 videos +
  • Improved decoding of some Canon EOS 1DXmkIII custom functions +
  • Allow integer QuickTime TrackNumber and DiskNumber values +
  • Relax validity check of QuickTime:ContentCreateDate when writing with -n +
  • Removed "Com" from the start of some unknown QuickTime ItemList tag names +
  • Patched CanonCustom decoding for bug in Canon EOS-1DX firmware +
  • Changed QuickTime CleanAperture tags decode as signed rationals +
+ +June 24, 2020 - Version 12.01 +
    +
  • Added a new NEFCompression value (thanks Warren Hatch) +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Decode timed GPS from Rove Stealth 4K dashcam videos +
  • Fixed bug which would corrupt TIFF images with 16-bit image data offsets + when writing (these are very rare) +
+ +June 11, 2020 - Version 12.00 (production release) +
    +
  • Added two new Olympus LensTypes (thanks Don Komarechka for one) +
  • Added two new Sony LensType values (thanks Jos Roost) +
  • Added a few new Nikon LensID's (thanks Mathieu Carbou) +
  • Added support for the Sony ZV-1 (thanks Jos Roost) +
  • Added a new CanonModelID (thanks Jos Roost) +
  • Added missing MimeType values for HEICS and HEIFS files +
  • Added definitions for a number of new XMP-crs tags +
  • Recognize WOFF and WOFF2 font files +
  • Decode streaming GPS from Roadhawk, EEEkit and 360Fly MP4 videos +
  • Decode a number of new tags for the Nikon D6 (thanks Warren Hatch) +
  • Decode a couple more AF tags for the D500/D850 +
  • Decode a number of new Panasonic tags +
  • Improved Composite LensID logic (thanks Matt Stancliff) +
  • Enhanced -v option to state when a directory has 0 entries +
  • Removed a couple of incorrect Validate warnings for bilevel TIFF images +
  • Drop ContrastCurve tag when copying from NEF to JPEG +
  • Changed -csv output to add "Unknown" group name to column headings for + missing tags when -f and -G options are used +
  • Patched to support new XMP LensID format for Nikon cameras as written by + Apple Photos (thanks Mattsta) +
  • Fixed problem extracting metadata from Sigma DP2 Quattro X3F files +
  • Fixed End() and EndDir() functions so they work when writing and when the -v + option is used +
  • Fixed problem recognizing some PGM files +
  • Fixed bug in offsets for some Photoshop information in -v3 output +
  • Fixed problem writing a list containing empty elements inside an XMP + structure +
  • API Changes: + +
+ +May 11, 2020 - Version 11.99 +
    +
  • Added a new Nikon LensID (thanks Mykyta Kozlov) +
  • Added a new Canon LensType +
  • Added a newn PentaxModelID +
  • Decode a few new QuickTime tags +
  • Decode new ID3 Grouping tag +
  • Decode a few more MinoltaRaw tags (thanks LibRaw) +
  • Fixed runtime warning which could occur when reading corrupted RTF files +
  • Fixed another potential pitfall in M2TS Duration calculation +
  • Fixed problem extracting some unknown QuickTime:Keys tags +
  • Fixed problem decoding Nikon D850 orientation tags +
  • Fixed bug where TIFF image data may not be padded to an even number of bytes +
+ +May 1, 2020 - Version 11.98 +
    +
  • Added a new Nikon LensID (thanks Warren Hatch) +
  • Added a new Sony LensType (thanks LibRaw) +
  • Added a new Canon LensType +
  • Patched to extract EXIF with an "Exif\0\0" header from WebP images +
  • Enhanced -efile option and added to the documentation +
  • Minor tweak to -htmlDump output (disallow locking of empty selection) +
  • Fixed problem determining Duration of some M2TS videos +
+ +Apr. 27, 2020 - Version 11.97 +
    +
  • Added experimental -efile option (undocumented) +
  • Decode NMEA GGA sentence from streaming GPS of some dashcam videos +
+ +Apr. 24, 2020 - Version 11.96 +
    +
  • Decode streaming GPS from Lucas LK-7900 Ace AVI videos +
  • Changed new Exit/ExitDir function names to End/EndDir +
  • Fixed inconsistencies when using "-use mwg" together with the -wm option +
+ +Apr. 23, 2020 - Version 11.95 +
    +
  • Added Exit() and ExitDir() functions for use in -if conditions (NOTE: these + function names changed to End() and EndDir() in ExifTool 11.96) +
  • Enhanced -geotag feature to support a more flexible input CSV file format +
  • Enhanced -if and API Filter options to allow access to ExifTool object via + $self +
  • Fixed problem reading HEIC Exif with a missing header +
+ +Apr. 17, 2020 - Version 11.94 +
    +
  • Added support for QuickTime ItemList:GPSCoordinates +
  • Added additional Validate test for overlapping EXIF values +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Added a new Nikon LensID +
  • Decode a few more Nikon tags (thanks Warren Hatch) +
  • Decode Pentax ShutterType +
  • Changed color of locked highlighted selection in -htmlDump output +
  • Fixed problem reading PDF files written by Microsoft Print-to-PDF +
  • Fixed problem where -X output would produce invalid XML for MP4 files + containing an HTCTrack +
+ +Apr. 3, 2020 - Version 11.93 +
    +
  • Added new config file to the distribution for writing Pix4D XMP-Camera tags + (config_files/pix4d.config) +
  • Added support for the DOSCyrillic (cp866) character set +
  • Added IO::String to the Windows EXE version +
  • Improved identification of Canon RF lenses (thanks LibRaw) +
  • Enhanced -htmlDump output to add "File offset" entry for EXIF tags and + ability lock highlighted selection by clicking the mouse +
  • Enhanced -srcfile option to generate OriginalFileName and OriginalDirectory + UserParam tags +
  • Patched HEIC writer to add missing pitm box if necessary +
  • Fixed problem adding back EXIF after deleting it from HEIC file +
  • Fixed minor problem with incorrect number of bytes being reported for + invalid header in corrupt files +
  • API Changes: +
      +
    • Enhanced UserParam option to allow parameters to be extracted as if + they were normal tags +
    +
+ +Mar. 19, 2020 - Version 11.92 +
    +
  • Added a new Nikon LensID (thanks Wolfgang Exler) +
  • Decode a few new Leica tags (thanks Tim Gray) +
  • Decode AccelerometerData from Samsung Gear 360 videos +
  • Fixed a couple of problems decoding timed GPS metadata from NextBase dashcam + videos +
  • Fixed problem where -X option could produce invalid XML when reading + corrupted XMP +
+ +Mar. 5, 2020 - Version 11.91 +
    +
  • Added undocumented -xpath option for use by alternate Windows version +
  • Decode a couple of new Panasonic tags +
  • Documented -ec option (available since version 11.54) +
  • Reverted -htmlDump fix of 11.90 because it broke more than it fixed, and + instead applied a targeted patch to fix this problem for RW2 files +
+ +Mar. 3, 2020 - Version 11.90 +
    +
  • Added a new Sony LensType (thanks LibRaw and Jos Roost) +
  • Added two new Olympus LensType values +
  • Added a new Canon LensType +
  • Added some new Canon RecordMode values +
  • Added some new QuickTime GeneralProfileIDC values +
  • Added new values for a couple of FujiFilm tags +
  • Added a number of new QuickTime GenreID values +
  • Decode Nikon Z6/Z7 phase-detect AF points (thanks Andy Dragon) +
  • Patched to avoid possible "Undefined subroutine" error in MacOS 10.15 +
  • Fixed incorrect offsets in -htmlDump output for some file types +
+ +Feb. 25, 2020 - Version 11.89 +
    +
  • Added support for Exif 2.32 for XMP +
  • Recognize the HIF file extension +
  • Improved verbose output for QuickTime iref items +
  • Patched to create new GPS metadata in Canon CR3 images using a default byte + order that is the same as existing EXIF boxes +
  • Patched to add missing newline that could occur in XMP with the API Compact + Shorthand option +
+ +Feb. 20, 2020 - Version 11.88 +
    +
  • Added write support for new Google depth-map XMP tags +
  • Added config_files/depthmap.config to the distribution +
  • Added minor error when attempting to write FFF images due to incompatibility + with Hasselblad Phocus software +
  • Patched to avoid "Invalid iloc offset size" error when writing some + QuickTime-based files +
  • Fixed incorrect ColumnCount for CSV files +
  • Fixed various spelling errors (thanks Jens Schleusener) +
  • Fixed bug writing QuickTime:Rotation in HEIC files +
+ +Feb. 13, 2020 - Version 11.87 +
    +
  • Added read support for CSV files +
  • Added "--" option to indicate the end of options +
  • Added ability to read/write/copy/delete the JPEG trailer as a block +
  • Added new Olympus CameraType and LensType values (thanks LibRaw) +
  • Decode a few more FujiFilm tags +
  • Enhanced -fast option (API FastScan) to bypass PNG CRC validation when + writing +
+ +Feb. 4, 2020 - Version 11.86 +
    +
  • Added support for DNG version 1.5 +
  • Added config_files/acdsee.config to the full distribution (thanks StarGeek) +
  • Added a new Sony LensType (thanks Jos Roost and LibRaw) +
  • Decode two more bits from Nikon LensType (thanks LibRaw) +
  • Decode QuickTime MovieFragmentSequence +
  • Patched HEIC writer to add missing iref box if necessary +
  • Fixed typo in a Canon LensType value +
  • API Changes: +
      +
    • Patched ImageInfo() to recognize a stringified object as a file name +
    +
+ +Jan. 28, 2020 - Version 11.85 (production release) +
    +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Added a new Olympus CameraType (thanks LibRaw) +
  • Added a two new Pentax LensType values +
  • Added a new FujiFilm FocusMode +
  • Decode timed GPS from Akaso dashcam MOV videos +
  • Decode Insta360 trailer from INSP images and made Insta360 a deletable group +
  • Patched kml.fmt file to limit maximum image size (thanks Fedor Kotov) +
  • Fixed problem decoding values from Leica M10 and S maker notes +
+ +Jan. 10, 2020 - Version 11.84 +
    +
  • Decode accelerometer data from timed metadata of more dashcam videos +
  • Decode Canon G9 white balance tags (thanks LibRaw) +
  • Recognize INSP files +
+ +Jan. 9, 2020 - Version 11.83 +
    +
  • Added a couple of new XMP-crs tags (thanks Herb) +
  • Fixed bug introduced in 11.82 with the -php -D output +
  • Fixed problem where some flattened XMP tags could be written when they + should be avoided +
+ +Jan. 8, 2020 - Version 11.82 +
    +
  • Added a new Canon LensType +
  • Added a new CanonModelID (thanks LibRaw) +
  • Added ability to process SubDirectories in QuickTime Keys tags +
  • Removed minor error when writing PDF 2.0 files (github issue #30) +
  • Fixed problem where trailing null bytes were removed from binary values in + the -php output when the -b option was used +
+ +Jan. 2, 2020 - Version 11.81 +
    +
  • Added a new Nikon LensID +
  • Added two new CanonModelID's (thanks LibRaw) +
  • Decode AVIF AV1 configuration record +
  • Changed names of QuickTime MovieData tags to "MediaData" +
  • Patched to use 4-digit years in Time::Local calls +
  • Patched Composite sub-second date/time tags to do additional validation of + source EXIF date/time tags before adding sub seconds +
  • Fixed problem where -json output could produce invalid JSON when -struct was + used and the structure field names contained special characters (github + issue #32) +
  • Fixed spelling in a Panasonic SceneMode value (thanks Hubert) +
+ +Dec. 17, 2019 - Version 11.80 +
    +
  • Added a new Canon LensType +
  • Added a new Nikon Z LensID (thanks LibRaw) +
  • Added a few new Sony LensType values (thanks Jos Roost) +
  • Attempt to improve reliability of Samsung DepthMapWidth/Height decoding +
  • Updated a number of Canon-mount Tamron lens names to include the Tamron + model number +
  • Patched MOV/MP4 writer to allow a small amount of garbage at the end of a + file to be deleted when writing with the -m option +
  • Fixed bug where some Composite tags may not have taken priority over other + tags as they should have +
+ +Dec. 12, 2019 - Version 11.79 +
    +
  • Added support for AVIF files +
  • Added new Canon, Sigma and Sony LensType values (thanks LibRaw) +
  • Made PDF 2.0 writable at your own risk with the -m option (github issue #30) +
  • Enhanced -validate feature to warn about duplicate languages in an XMP + lang-alt list +
  • Fixed inconsistency between documentation and ExifTool capabilities for + "Writable" status of some tags +
+ +Dec. 5, 2019 - Version 11.78 +
    +
  • Added a new Nikon LensID (thanks Chris) +
  • Added two new FujiFilm SceneRecognition values +
  • Patched to avoid crash in Windows when writing a negative epoch time using + the "-d %s" option +
  • Fixed problem editing MIE tags when using the "-wm w" option +
+ +Nov. 27, 2019 - Version 11.77 +
    +
  • Added a new Nikon LensID (thanks Joe Schönberg) +
  • Added a number of new Olympus LensType values (thanks LibRaw) +
  • Added a new Canon LensType +
  • Decode timed GPS from Ambarella A12 dash cam MP4 videos +
  • Decode a number of new Sigma tags (thanks LibRaw) +
  • Decode a couple of new PanasonicRaw tags (thanks LibRaw) +
  • Enhanced -fileOrder option to add -fast feature +
+ +Nov. 12, 2019 - Version 11.76 +
    +
  • Added support for the Sony ILCE-9M2 (thanks Jos Roost) +
  • Added a couple of new XMP-GCamera tags +
  • Added MIMEType values for some formats that previously reported + "application/unknown" +
  • Enhanced -geotag feature to write pitch to CameraElevationAngle if available +
  • Improved determination of MIMEEncoding for TXT files +
+ +Nov. 4, 2019 - Version 11.75 +
    +
  • Added ability to read some basic characteristics of TXT files +
  • Added kml_track.fmt to the fmt_files of the full distribution +
  • Added built-in support for decoding GPS from the four video subtitle text + formats that were previously handled by separate config files, and removed + these config files from the distribution +
  • Derive GPSDateTime from CreateDate and SampleTime if not already available + when extracting timed GPS metadata from QuickTime-format videos +
  • Changed family 2 groups of some Extra tags +
+ +Oct. 29, 2019 - Version 11.74 +
    +
  • Added support for new XMP IPTC Extension version 1.5 tags +
  • Added a new Nikon LensID (thanks LibRaw) +
  • Decode GPS track from Auto-Vox dashcam MOV videos +
  • Improved Russian translations (thanks Andrei Korzhyts and Alexander) +
  • Enhanced convert_regions.config to support new IPTC Extension 1.5 ImageRegion +
  • Changed the way the FlatName element works when used in a structure element + (the structure name is now added as a prefix to the flattened tag name) +
  • Patched gpx.fmt and gpx_wpt.fmt to support sub-seconds in GPSDateTime value +
+ +Oct. 23, 2019 - Version 11.73 +
    +
  • Decode timed metadata from Parrot drone videos +
  • Patched dji.config file to properly handle time zones +
  • Fixed bug which caused runtime error when reading timed metadata from Cobra + Dash Cam AVI videos +
+ +Oct. 22, 2019 - Version 11.72 +
    +
  • Added warning messages for corrupted Photoshop document data +
  • Added a new Olympus CameraType +
  • Added a new Canon LensType +
  • Decode more Sigma tags +
  • Improved Russian translations (thanks Alexander) +
  • Updated decoding of some CanonCustom settings for recent models +
  • Documented DNG OpcodeList values +
+ +Oct. 16, 2019 - Version 11.71 +
    +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Added a few new Nikon Z LensID's +
  • Added a simple print conversion for DNG OpcodeList tags (note that due to + this, these tags must now be copied using the -n option) +
  • Fixed problems determining some video parameters for DV files +
  • Changed behaviour of -sep option when writing empty list items +
  • API Changes: + +
+ +Oct. 10, 2019 - Version 11.70 (production release) +
    +
  • Added a new CanonModelID (thanks Laurent Clévy) +
  • Improved identification of Office Open XML files (github issue #27) +
  • Removed RAF version check when writing FujiFilm RAF files +
  • Limited the number of accelerometer records that ExifTool will read by + default with the -ee option from INSV files to avoid excessive processing + times and memory usage +
  • Patched Windows version to allow reading of shared files with Unicode names + (thanks Eriksson) +
  • Patched to avoid converting some bad GPS coordinates (thanks Csaba Toth) +
  • Fixed verbose output to include YCbCrSubSampling for JPEG files +
  • Fixed conversion and group names for the new FujiFilm tag added in 11.68 +
  • Fixed format of GeoTiffDirectory and GeoTiffDoubleParams when writing +
+ +Oct. 2, 2019 - Version 11.69 +
    +
  • Fixed bug introduced in version 11.66 where the sign was lost when writing + coordinate values between 0 and -1 to QuickTime:GPSCoordinates +
+ +Oct. 1, 2019 - Version 11.68 +
    +
  • Added read support for yet another type of streaming GPS in MP4 videos +
  • Added a number of new FujiFlashMode values +
  • Decode a new FujiFilm tag +
  • Made NikonCaptureOffsets and NikonCaptureVersion deletable +
  • Enhanced tag name documentation to indicate deletable MakerNotes tags +
+ +Sept. 30, 2019 - Version 11.67 +
    +
  • Added config_files/thinkware.config to the distribution +
  • Fixed bug decoding negative GPS coordinates from INSV videos +
+ +Sept. 30, 2019 - Version 11.66 +
    +
  • Added a new Nikon LensID (thanks LibRaw) +
  • Added a few new Canon LensType values (thanks LibRaw and Tom Lachecki) +
  • Decode a few more Hasselblad tags (thanks LibRaw) +
  • Decode a new Canon tag (thanks Laurent Clévy) +
  • Decode more Samsung trailer tags +
  • Extract BWF iXML, aXML and UMID from RIFF-format files +
  • Extract ICC_Profile from more types of PDF files +
  • Enhanced %s of the -W option to recognize the PICT format +
  • Recognize MacOS alias files +
  • Changed name of Ricoh CropMode35mm tag and added a new value (thanks LibRaw) +
  • Minor change to a Minolta lens name (thanks Jos Roost) +
  • Fixed problem where NikonCapture information couldn't be deleted from an NEF +
  • Fixed problem identifying some SVG files +
  • Fixed typo in a CanonModelID value (thanks Dmitry) +
  • Fixed bug which could result in "Internal error: no list index" warning when + creating nested XMP lang-alt lists +
  • Fixed the names of a few Tamron lenses for Nikon (thanks Tom Lachecki) +
  • Fixed problem extracting Layer information from some PSD files +
  • Fixed writing of QuickTime GPSCoordinates to use the correct number of + digits before the decimal point for latitude and longitude +
+ +Aug. 29, 2019 - Version 11.65 +
    +
  • Added new SonyModelID and Sony LensType values (thanks LibRaw and Jos Roost) +
  • Added support for some new Sony models (thanks Jos Roost) +
  • Added a couple of new CanonModelID values (thanks LibRaw) +
  • Added a new Canon ColorDataVersion value +
  • Enhanced FastScan option so a setting of 2 stops processing PNG images at + the IDAT chunk when reading +
  • Preserve order of nested lang-alt list entries when -struct option is used +
+ +Aug. 28, 2019 - Version 11.64 +
    +
  • Added a new Canon LensType (thanks LibRaw) +
  • Added a new Nikon LensID (thanks Bruno) +
  • Added config file for converting streaming GPS from BlueSkySea dashcam +
  • Decode FocusDistance for Nikon Z6/Z7 +
  • Documented groups in families 5 and 6 (available but undocumented since + Exiftool version 8.22 and 11.50 respectively) +
  • Fixed some ordering problems when writing/copying nested XMP lang-alt lists +
  • Fixed some minor quirks with QuickTime language codes (thanks Hayo Baan) +
  • Fixed a CanonModelID value (thanks Dmitry) +
  • API Changes: + +
+ +Aug. 20, 2019 - Version 11.63 - "PNG Early Text" +
    +
  • Added a few new Sigma lenses (thanks LibRaw) +
  • Improved handling of Canon CNTH atom in MOV/MP4 videos +
  • Changed PNG writer to place all text chunks before IDAT (not just XMP) + (github issue #23) +
  • Issue minor warning for any text chunk after PNG IDAT (not just XMP) +
  • Enhanced ForceWrite feature to allow "PNG" to be specified (to move existing + text chunks to before IDAT without editing any metadata) +
  • Removed Windows "surrogate" warning for files that wouldn't be processed + anyway +
  • Fixed some entries in the Minolta LensType list (thanks Jos Roost) +
  • Fixed identification of a Sony lens (thanks Jos Roost) +
+ +Aug. 15, 2019 - Version 11.62 +
    +
  • Added a number of new Canon, Pentax, Sony and Sigma lenses (thanks LibRaw) +
  • Removed some extraneous verbose warnings when geotagging +
  • Removed Minolta LensType value for a non-existent lens (thanks LibRaw) +
  • Patched problem writing some simple qualified XMP values +
  • Patched to avoid writing files in Windows with Unicode surrogate characters + in their name unless the -overwrite_original_in_place option is used +
  • Fixed an incorrect Pentax LensType (thanks LibRaw) +
  • Fixed family 2 group names of some XMP-exifEX and XMP Composite tags +
+ +Aug. 7, 2019 - Version 11.61 +
    +
  • Added a new FujiFilm CropMode (thanks LibRaw) +
  • Added a few new proprietary CustomRendered values (thanks Jeffrey Friedl) +
  • Added a new Nikon LensID and fixed a Canon LensType (thanks LibRaw) +
  • Added a new CanonModelID +
  • Decode more Sony DSC-RX100M7 tags (thanks Jos Roost) +
  • Write standard EXIF to PNG even if non-standard EXIF already exists +
  • Changed a Minolta/Sony LensType (thanks LibRaw) +
  • Changed Composite GPS reference direction tags to be derived from only the + XMP-exif GPS coordinate tags (and not other XMP GPS coordinates) +
  • Reverted a PNG Validation check that was removed from 11.60 +
  • Patched to avoid problems overriding new values when writing thumbnail and + preview images +
+ +July 30, 2019 - Version 11.60 +
    +
  • Added a few new Sigma LensType values (thanks LibRaw) +
  • Updated Sony makernote decoding for the DSC-RX100M7 (thanks Jos Roost) +
  • Various internal improvements to PNG reader/writer +
  • Fixed bug in RIFF decoder that could cause an "undefined subroutine" error + (thanks Hayo Baan) +
  • Fixed problem writing some QuickTime tags if the PREFERRED levels were + changed via the config file +
  • Install Changes: +
      +
    • Properly erase all temporary files after validation tests +
    +
+ +July 25, 2019 - Version 11.59 +
    +
  • Added a new SonyModelID (thanks LibRaw) +
  • Changed block delete to allow subsequent writing of tags from the same group + (like a group delete) +
  • Minor changes to warnings and verbose output when writing PNG images +
  • Fixed potential runtime warning on an error rewriting XMP in a PNG image +
+ +July 25, 2019 - Version 11.58 +
    +
  • Added a number of new Canon and Sony LensType values (thanks LibRaw) +
  • Decode NikonMeteringMode for the D500 +
  • Decode LensID for Nikon Z lenses +
  • Extract RawThermalImage from Parrot Bebop-Pro Thermal images +
  • Validate PNG CRC values when writing or using the Validate option +
  • Improved Russian translation (thanks Andrei Korzhyts) +
  • Improved identification of some Tamron lenses for Canon cameras +
  • Changed name of D810MeteringMode tag to NikonMeteringMode +
  • Patched writing of XMP in PNG images to always come before IDAT, and warn if + XMP comes after IDAT when reading +
  • Fixed problem replacing multiple lang-alt default-language structure + elements in lists of XMP structures (behaviour for other languages still not + ideal) +
  • API Changes: +
      +
    • Removed PNGEarlyXMP option +
    • Fixed problem introduced in 11.54 which caused Options('UserParam') to + return undef +
    +
  • Internal Changes: +
      +
    • A block delete of EXIF, XMP, IPTC, etc now sets the group delete flag +
    +
+ +July 19, 2019 - Version 11.57 +
    +
  • Improved decoding of some tags for the Sony ILCE-7RM4 (thanks Jos Roost) +
  • Minor change to a Sony lens name +
  • Fixed format of a number of 8-bit integer QuickTime tags when writing +
  • Fixed problem replacing multiple structure elements in lists of XMP + structures +
+ +July 18, 2019 - Version 11.56 +
    +
  • Added support for the Sony ILCE-7RM4 (thanks Jos Roost) +
  • Added a new SonyModelID (thanks LibRaw) +
  • Added a few new Sony/Minolta LensType values (thanks LibRaw and Jos Roost) +
  • Decode some new Nikon and Motorola tags (thanks Neal Krawetz) +
  • Decode a couple more ColorData tags for some Canon models +
  • Extract PreviewImage from DNG files which don't have a .DNG extension +
  • Extract Huawei APP7 maker notes with the Unknown (-u) option +
  • Internal change in LensID logic for Sony E-type lenses +
+ +July 12, 2019 - Version 11.55 +
    +
  • Added write support for XMP-crs:Texture and XMP-drs tags +
  • Added a number of new Panasonic NoiseReduction values +
  • Added definition for a new Kodak tag (thanks LibRaw) +
  • Added a couple of new Panasonic AFAreaMode values (thanks Daniel Beichl) +
  • Added a couple of new Sony/Minolta LensTypes (thanks Jos Roost and LibRaw) +
  • Added a new CanonModelID +
  • Decode HEVCConfiguration record from HEIC images +
  • Decode a new Panasonic tag +
  • Decode a new QuickTime tag +
  • Changed internal handling of Composite tag ID's to include module name +
  • Removed "FE" designation from Samyang E-mount lenses +
  • Dropped Validate warning about missing GPSProcessingMethod tag +
+ +July 2, 2019 - Version 11.54 +
    +
  • Added new Canon and Sony/Minolta LensType values (thanks LibRaw) +
  • Added a number of new Sony/Minolta LensType values (thanks Jos Roost) +
  • Added "Unknown" value for new EXIF CompositeImage tag +
  • Added ability to write GSpherical tags in video track of MOV/MP4 files +
  • Added support for geotagging from GPS/IMU CSV-format files +
  • Improved Russian translation (thanks Alexander) +
  • Improved Validate feature to check ExifVersion/GPSVersionID numbers +
  • Accept unsigned numbers when setting GPSAltitudeRef from a numerical value +
  • Fixed decoding of DepthMapWidth/Height for some Samsung live-focus images +
  • Fixed a couple of incorrect/incomplete CanonModelID values (thanks LibRaw) +
  • Fixed problem identifying some Canon lenses when used on a Sony camera with + a Metabones adapter +
  • API Changes: +
      +
    • Added FilterW option +
    • Enhanced Compact option to improve flexibility and include features of + XMPShorthand option +
    • Removed XMPShorthand option from documentation +
    +
+ +June 24, 2019 - Version 11.53 - "Exif 2.32" +
    +
  • Added support for the new tags of the Exif 2.32 specification +
  • Added a new SamsungModelID (thanks LibRaw) +
  • Added warning if extracting ZIP file contents without the -a option +
  • Added ability to extract EmbeddedVideo from the trailer of Android JPEG + images with the ExtractEmbedded option +
  • Decode timed GPS from Cobra Dash Cam AVI videos +
  • Decode a new GoPro tag +
  • Enhanced -struct option to allow extraction of structured Torrent Info +
  • Improved error handling when an unexpected terminator is encountered while + writing a QuickTime-format file +
  • Renamed one of the Nikon Saturation tags to "SaturationAdj" +
  • Removed warning message when writing FujiFilm RAFVersion 0240 and 0261 files +
  • Fixed encoding problem when writing some QuickTime UserData tags with + strings containing special characters +
  • API Changes: + +
+ +June 17, 2019 - Version 11.52 +
    +
  • Added a few new Nikon CropHiSpeed values (thanks Hayo Baan) +
  • Added a new Nikon LensID (thanks Yves) +
  • Fixed problem where reading a large, corrupt AIFF file may could take an + excessively long time +
  • API Changes: +
      +
    • Enhanced Compact option to add levels 3, 4 and 5 (github issue #16) +
    +
+ +June 13, 2019 - Version 11.51 +
    +
  • Decode Canon DistortionCorrection tags +
  • Removed a minor EXIF warning when processing EPS files with a DOS header +
  • Fixed bug which caused an error when rewriting some EPS files multiple times +
+ +June 11, 2019 - Version 11.50 (production release) +
    +
  • Added a new Canon LensType and two new Sony LensTypes (thanks LibRaw) +
  • Added tiff_version and rotate_regions config files to the distribution +
  • Added two new QuickTime Keys tags and made some existing Keys unwritable +
  • Improved Composite LensID logic to make better use of EXIF LensModel +
  • Improved logic when writing BinaryData tags to allow multiple interdependent + tags to be written in a single command +
  • Improved -htmldump output to show names of Unknown tags +
  • Allow advanced formatting expressions to access the current tag key ($tag) +
  • Remove escaped nulls from -json string values +
  • Reverted change in ExifTool 11.38 so that Composite GPS reference directions + are generated again even if the EXIF versions of these tags already exist +
  • Fixed an incorrect FlashPix CodePage conversion +
+ +June 5, 2019 - Version 11.49 +
    +
  • Added inverse print conversion for one of the QuickTime ItemList Genre tags +
  • Avoid creating a few obscure QuickTime UserData tags when writing +
  • Fixed problem where some QuickTime groups were not being created when + writing QuickTime tags without specifying a group +
  • Fixed problem where QuickTime Keys tags could be duplicated when writing an + existing alternate-language tag +
  • Fixed problem were QuickTime Keys alternate-language tags would not be + written when deleting the corresponding default-language tag in the same + command +
  • Fixed some inconsistencies when writing QuickTime tags using the -wm + (WriteMode) option +
  • Fixed an incorrect Pentax Sigma LensType value +
+ +June 1, 2019 - Version 11.48 +
    +
  • Added write support for Google GCamera and GCreation XMP tags +
  • Renamed XMP-GDepth "Data" tag to "DepthImage" +
  • Fixed bug where some QuickTime UserData tags could be duplicated when + writing +
+ +May 31, 2019 - Version 11.47 +
    +
  • Fixed problem which resulted in a warning for one of the CanonVRD tests on + some platforms +
+ +May 31, 2019 - Version 11.46 - "CR3 update" +
    +
  • Added ability to write CanonVRD tags in CR3 images +
  • Decode a couple more tags from Canon CR3 images +
  • Enhanced Validate option to check for duplicate QuickTime atoms +
  • Relaxed constraints when writing IPTC date tags to allow use of separators + other than a colon +
  • Fixed CR3 writing to update CTBO table with any changed offsets or sizes + (although this table doesn't seem to be used by any RAW viewer, it may be + used in-camera to improve response time when browsing images) +
+ +May 29, 2019 - Version 11.45 +
    +
  • CORRUPTION WARNING: Patched problem where Canon DPP would destroy a CR3 + image if the file had previously been edited by DPP then Exiftool
    + (If you have edited any CR3 images with ExifTool that had been previously + edited by DPP, then re-edit with ExifTool 11.45 or later to restructure the + file so DPP doesn't destroy it if used later to edit the file again) +
  • Added ability to create and delete QuickTime Keys tags +
  • Added sample config file (mini0806.config) to generate GPS tags from + subtitle Text in Mini 0806 dashcam videos +
  • Added new Canon and Nikon lenses (thanks LibRaw) +
  • Added a new Olympus CameraType (thanks LibRaw) +
  • Decode CanonVRD tags from CR3 images +
  • Improved handling of QuickTime language tags when writing +
  • Fixed bug introduced in 11.38 which could cause "Use of uninitialized value" + runtime warning when reading XMP GPS tags +
  • Fixed bug where QuickTime tags could be written when another group was + specified +
  • API Changes: + +
+ +May 21, 2019 - Version 11.44 +
    +
  • Added ability to extract XMP as a block from XMP files +
  • Prevent ExifIFD from being deleted from any RAW file type +
  • Fixed problem where some Canon tags couldn't be written in CR3 files +
  • Fixed problem reading QuickTime Keys tags with a space in the tag ID +
  • Fixed incorrect family 1 group when reading some QuickTime Keys tags +
+ +May 17, 2019 - Version 11.43 - "Write HEIC and CR3" +
    +
  • Added ability to write/create EXIF and write ICC_Profile in HEIC images +
  • Added ability to write/create EXIF and write MakerNotes in CR3 images + (one might hope/expect EXIF to be stored in the same location for HEIC and + CR3 since they are both based on the QuickTime file format, but in fact they + couldn't be more different, and both are much more complicated than + necessary, which of course follows the seemingly established practice of + intentional obfuscation and zero standardization in video metadata) +
  • Added support for QuickTime ItemList:Author and Keys:DisplayName tags +
  • Prevent MakerNotes from being deleted from any RAW file type +
  • Fixed writing of XMP in HEIC files to conform with the HEIC specification + (obviously, Apple couldn't put this XMP in the same place as any other + QuickTime-based file format, because Apple is, after all, king of "Let's + reinvent the wheel!") +
  • Fixed problem where API WriteMode option wouldn't always prevent groups from + being created when group creation was disabled +
+ +May 13, 2019 - Version 11.42 +
    +
  • Added ability to edit ThumbnailImage in Canon MOV videos +
  • Improved verbose hex dump for HEIC files +
  • Fixed another "Chunk offset outside movie data" error when writing some HEIC + files +
+ +May 9, 2019 - Version 11.41 +
    +
  • Added write support and improved language handling for 3GP QuickTime tags +
  • Fixed format problems writing some binary values to QuickTime tags +
  • Fixed some language translations (thanks Herbert Kauer) +
+ +May 7, 2019 - Version 11.40 +
    +
  • Added a new Canon LensType +
  • Added a new value for EXIF:SceneCaptureType used by some Samsung cameras +
  • Fixed QuickTime writing to preserve existing same-named default-language + tags in other groups when writing a default language tag +
+ +May 3, 2019 - Version 11.39 - "Create QuickTime tags" +
    +
  • Added ability to create new QuickTime tags in MOV/MP4 videos +
  • Added two new Canon LensTypes and a new CanonModelID (thanks LibRaw) +
  • Added a few new Sony/Minolta LensType values (thanks Jos Roost) +
  • Added a number of new QuickTime GenreID values +
  • Added range check on date/time values when writing +
  • Decode Canon EOS D60 black levels +
  • Split off some QuickTime tags into different family 1 groups +
  • Fixed "Chunk offset outside movie data" error when writing some HEIC files +
  • Fixed decoding of Pentax AutoBracketing for K-1 and K-5 (github issue #15) +
  • Fixed some QuickTime family 2 group names +
  • Fixed bug introduced in 11.38 that broke extraction of thumbnail images from + Canon MOV videos +
+ +Apr. 24, 2019 - Version 11.38 +
    +
  • Added Extra JPEGImageLength tag +
  • Added nksc.config to the sample config files +
  • Added a couple more Sony/Minolta LensTypes (thanks Jos Roost) +
  • Added a couple of new Sigma LensType values +
  • Decode a couple more tags from Pittasoft dashcam videos +
  • Decode two new FLIR tags (thanks Corinne Berthier) +
  • Decode a new ERF tag, and fix wrong format for some others (thanks LibRaw) +
  • Improved decoding of Sigma maker notes for some models +
  • Enhanced Composite tag logic to allow a scalar Inhibit entry +
  • Enhanced XMP processing to support readable subdirectories embedded in a tag +
  • Updated some language translations +
  • Patched Composite GPS reference direction tags to prevent them from being + created if these tags already exist +
  • Fixed problem reading some odd PDF files +
+ +Apr. 17, 2019 - Version 11.37 +
    +
  • Added a new Sony AFAreaMode (thanks Jos Roost) +
  • Decode GPS and other tags from Pittasoft Blackvue dashcam videos +
  • Improved decoding of FujiFilm FlickerReduction +
  • Ignore any garbage before an NMEA sentence when geotagging +
  • Fixed bug which could result in loss of timed GPS metadata when writing MP4 + videos +
+ +Apr. 15, 2019 - Version 11.36 +
    +
  • Added a number of new MacOS tags +
  • Added a new CanonModelID (thanks Laurent Clévy) +
  • Added some new Canon EasyMode and AFAreaMode values +
  • Added two new Canon AspectRatio values (thanks LibRaw) +
  • Decode a new Nikon tag (thanks LibRaw) +
  • Decode some new FujiFilm tags +
  • Updated Sony maker notes for the DSC-RX0M2 (thanks Jos Roost) +
  • Hide the Nikon ShotInfo offset tags +
  • Fixed problem decoding NikonCustom settings for some D810 firmware versions +
  • Fixed typo in a warning message (thanks Hayo Baan) +
+ +Apr. 9, 2019 - Version 11.35 +
    +
  • Added print conversion for MDItemFSLabel +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Added an additional -validate check for PNG images +
  • Decode a few more FujiFilm RAF tags (thanks LibRaw) +
  • Decode a couple more QuickTime tags +
  • Allow "Copy0" to be specified as a group name for the copy number of the + primary tag when extracting information +
  • Improved the Composite ImageSize tag to report the RawImageCroppedSize for + FujiFilm RAF images +
  • Changed Composite ImageSize tag to use a space instead of "x" as a separator + when the -n option is used +
  • Fixed problem writing user-defined PhaseOne SensorCalibration tags +
  • Fixed problem where a List-type tag may not be split into individual items + with the -sep option when using the advanced-formatting "@" feature +
  • API Changes: +
      +
    • Patched a potential pitfall if calling code used both the old List and + ListSep options at the same time as the new ListJoin option +
    +
+ +Apr. 4, 2019 - Version 11.34 +
    +
  • Added a couple of new Canon LensType values (thanks LibRaw for one) +
  • Added a new CanonExposureMode value (thanks Arnold van Oostrum) +
  • Added support for FujiFilm X-H1 Ver2.01 RAF images +
  • Decode a couple of new Sony tags (thanks LibRaw) +
  • Improved decoding of Sony Shutter tag (thanks Jos Roost) +
  • Improved identification of some Sony lenses (thanks Jos Roost) +
  • Improved parsing of streamed metadata from TomTom Bandit videos +
  • Improved warning for truncated QuickTime atom +
  • Accept wider range of formats when writing QuickTime:GPSCoordinates +
  • API Changes: +
      +
    • Changed SetFileName() 'Link' option name to 'HardLink' (but still allow + 'Link' for backward compatibility) +
    +
+ +Mar. 28, 2019 - Version 11.33 +
    +
  • Added write support for HEIC/HEIF files +
  • Added new write-only SymLink tag for creating symbolic links +
  • Made EXIF GDALMetadata and GDALNoData writable +
  • Enhanced writing capabilities for MOV/MP4 videos +
  • Enhanced -validate option to add more IPTC checks +
  • Updated decoding of Sony ILCE-9 maker notes for firmware version 5.00 + (thanks Jos Roost) +
  • Fixed problem reading streamed metadata from some TomTom Bandit videos +
  • API Changes: +
      +
    • Added SymLink option to SetFileName() +
    +
+ +Mar. 14, 2019 - Version 11.32 +
    +
  • Added a new Nikon LensID (thanks Kenneth Cochran) +
  • Added a couple of new QuickTime HandlerType values +
  • Decode streamed metadata from DuDuBell M1 and VSYS M6L dashcam videos +
  • Attempt to improve Nikon lens identification +
  • API Changes: +
      +
    • Added new single-argument version of ShiftTime() +
    +
+ +Mar. 7, 2019 - Version 11.31 +
    +
  • Added read support for FITS images +
  • Another try at removing spaces from some DICOM values (github issues #10/12) +
+ +Mar. 6, 2019 - Version 11.30 (production release) +
    +
  • Added a new Sony/Minolta LensType (thanks Jos Roost) +
  • Decode streaming metadata from TomTom Bandit Action Cam MP4 videos +
  • Decode Reconyx HF2 PRO maker notes +
  • Decode ColorData for some new Canon models (thanks LibRaw) +
  • Enhanced -geotag feature to set AmbientTemperature if available +
  • Remove non-significant spaces from some DICOM values (github issues #10/12) +
  • Fixed possible "'x' outside of string" error when reading corrupted EXIF +
  • Fixed incorrect write group for GeoTIFF tags added in version 11.24 +
+ +Feb. 28, 2019 - Version 11.29 +
    +
  • Added support for Ricoh GR III maker notes +
  • Added a new Canon LensType (thanks Claude Jolicoeur) +
  • Added a new XMP-crs tag (github issue #8) +
  • Enhanced -csv option to output base64-encoded binary data when combined with + -b or when the -charset option is used and the text has invalid characters + (github issue #11) +
  • Remove trailing space from even-length DICOM values (github issue #9) +
  • Patched to avoid "Hexadecimal number > 0xffffffff non-portable" warning + (github issue #6) +
  • Fixed meta charset attribute in -htmlDump output +
+ +Feb. 21, 2019 - Version 11.28 +
    +
  • Added support for reading INSV video and decode streaming GPS +
  • Added a new Pentax LensType (thanks Louis Granboulan) +
  • Added a new FujiFilm ImageStabilization value +
  • Allow exiftool to be run via a symbolic link on Mac/Linux +
  • Reverted INDD patch of version 11.27 (ie. raise error again on incorrectly + terminated INDD object list) +
  • Changed handling of temporary documentation file in Windows version +
+ +Feb. 14, 2019 - Version 11.27 +
    +
  • Added support for more XMP-dji-drone tags +
  • Added new Olympus CameraType and LensType values (thanks LibRaw) +
  • Added a new Canon LensType (thanks LibRaw) +
  • Added a new CanonModelID +
  • Decode yet another type of GPS from DashCam videos +
  • Allow FileName to be written when only case is changed on case-insensitive + filesystems +
  • Improved identification of some iWork file types +
  • Recognize the LRV file extension +
  • Changed Windows version to use the parent folder of PAR_GLOBAL_TEMP for the + temporary documentation file +
  • Don't raise an error if an INDD object list is terminated by spaces instead + of nulls +
  • Fixed some problems with new -htmldump IFD highlighting feature +
  • Fixed bug introduced in 11.24 with "-o -.EXT" feature +
+ +Jan. 21, 2019 - Version 11.26 +
    +
  • Added a new Nikon LensID (thanks LibRaw) +
  • Decode more tags for the Sony ICLE-6400 (thanks Jos Roost and LibRaw) +
  • Enhanced -htmldump feature to highlight IFD when mousing over IFD offset +
+ +Jan. 15, 2019 - Version 11.25 +
    +
  • Added a new Sony/Minolta LensType (thanks LibRaw) +
  • Added a new Nikon LensID +
  • Decode Leica D-Lux7 maker notes +
  • Decode more Nikon AF tags for newer models +
  • Decode Samsung Type2 maker notes with lower case Make +
  • Decode another Sony tag (thanks Jos Roost) +
  • Improved decoding of Nikon LensType +
  • Improved time shift feature to fix some incorrectly formatted date/time + values +
  • Renamed some Sony ImageCount tags to ShutterCount (thanks Jos Roost) +
  • Fixed problem reading back metadata written to some odd PDF files +
+ +Jan. 8, 2019 - Version 11.24 +
    +
  • Compatibility Notice: Changed the meaning of '-' and '+' modifiers for %C + formatting code (does not affect lower-case %c code) +
  • Decode a number of new Nikon tags (thanks Michael Tapes for samples) +
  • Added new Olympus FlashType and FlashModel values (thanks Per) +
  • Added a new Canon LensType +
  • Added a new Nikon LensID +
  • Made more GeoTIFF tags writable +
  • Handle XMP rdf:value when reading +
  • Improved warning when trying to read a file with a zero-length name +
  • Fixed decoding of PictureControl tags for Nikon Z-7 +
  • Fixed problem writing date/time values with " DST" designator at end of + date/time string +
  • Fixed problem in Windows which could cause ExifTool to abort due to a + Win32::FindFile error if a file name contained surrogate Unicode characters +
+ +Dec. 21, 2018 - Version 11.23 +
    +
  • Recognize DWG and DWF files +
  • Minor improvement to some -validate warnings +
  • Tolerate leading UTF-8 byte order mark (BOM) at start of JSON files +
  • Fixed problem recognizing some streaming camm metadata in QuickTime videos +
+ +Dec. 13, 2018 - Version 11.22 +
    +
  • Added read support for PC Paintbrush (PCX) files +
  • Added two new Sony/Minolta LensTypes (thanks Jos Roost and LibRaw) +
  • Decode LensData tags for some newer Nikon models +
  • Decode ColorData for the Canon EOS R (thanks LibRaw) +
  • Recognize DCX files +
+ +Dec. 7, 2018 - Version 11.21 +
    +
  • Added a new Sony/Minolta LensType (thanks Jos Roost) +
  • Added a new Olympus FlashModel (thanks Michael Meissner) +
  • Improved decoding of FujiFilm InternalSerialNumber (thanks LibRaw) +
  • Minor improvements to decoding of GPS from some dashcam videos +
  • Made XMP-getty:Personality a List-type tag +
  • Made it an error to use the -o option or write FileName or Directory tags + when using the TestName dry-run feature +
  • Fixed problem using -E with other character sets when writing +
+ +Nov. 20, 2018 - Version 11.20 +
    +
  • Added a new Panasonic WhiteBalance value +
  • Added a new Nikon LensID (thanks LibRaw) +
  • Decode streaming GPS from MOV videos for another dashcam model +
  • Improved -E option to support character sets other than UTF-8 +
+ +Nov. 14, 2018 - Version 11.19 +
    +
  • Added -fast4 option +
  • Enhanced -if option to allow arbitrary Perl expressions instead of just + logic expressions +
  • API Changes: + +
+ +Nov. 12, 2018 - Version 11.18 +
    +
  • Decode a new Nikon tag (thanks Richard Butler) +
  • Decode a new FujiFilm tag +
  • Updated decoding of Sony maker notes for newer models (thanks Jos Roost) +
  • Enhanced -if option to allow fast processing pass to evaluate the condition +
  • Improved warning for unknown JPEG APP segment +
+ +Nov. 4, 2018 - Version 11.17 +
    +
  • Added a new Canon LensType (thanks Norbert Wasser) +
  • Added a new Sony/Minolta LensType and a new SonyModelID (thanks LibRaw) +
  • Decode GPS from Garmin Dashcam videos +
  • Changed type of J2C files from a JPEG 2000 image to a JPEG 2000 codestream +
+ +Oct. 26, 2018 - Version 11.16 +
    +
  • Decode FLIR GPS information +
  • Decode 3D image from RED Hydrogen smartphone +
  • Minor improvements to decoding of new FujiFilm tags +
  • Fixed problem where writing Shortcut tags with the -E option would double + unescape the HTML entities +
+ +Oct. 25, 2018 - Version 11.15 +
    +
  • Added a couple of new Canon LensType values (thanks LibRaw and Andrew Shieh) +
  • Added a new Nikon LensID +
  • Added definitions for a few more VCard tags +
  • Added a new FujiFilm ShutterType value +
  • Decode some new FujiFilm tags (thanks Richard Butler) +
  • Store XMP GPS coordinates with two extra digits of precision and trim + trailing zeros +
  • Improved technique for handling rounding errors in times and GPS seconds +
  • Removed "Undersized IFD0 StripByteCounts" minor warning when writing ORF + files since this is a "feature" of most Olympus models +
  • Warn about undefined EXIF values with -validate option +
  • Changed the way Mask-ed values are decoded (do bit shift automatically) +
  • Changed FujiFilm HighISONoiseReduction tag to just "NoiseReduction", and + avoid extracting historic NoiseReduction tag if value is "n/a" +
  • Fixed potential problem reading GeoTiff tags with multiple SHORT values +
  • API Changes: + +
+ +Oct. 16, 2018 - Version 11.14 +
    +
  • Added more TIFF Compression values +
  • Added more AIFF CompressionType values +
  • Added more Nikon NEFCompression values (thanks LibRaw) +
  • Added a new Canon RecordMode +
  • Decode some new Canon custom functions +
  • Patched "Invalid VignettingCorrUnknown2 data" warning for EOS R CR3 images +
  • Fixed bug were any argument beginning with "-progress" on the command line + was interpreted as the -progress option +
+ +Oct. 9, 2018 - Version 11.13 +
    +
  • Decode GPS from NextBase 512G dashcam MOV videos (different than 512GW) +
  • Added a new Canon LensType (thanks LibRaw) +
  • Minor improvements to verbose dump of streaming GPS metadata +
  • Reverted change of version 10.71 which resulted in Windows not recognizing + PNG CreationTime as written by ExifTool (added this feature to the API + StrictDate option instead) +
  • Improved decoding of Nikon CropHiSpeed (thanks LibRaw) +
  • Improved -fast option to reduce memory usage when reading JPG, PNG, + QuickTime-based and RIFF-based files via a sequential stream +
  • Fixed DOF calculation to use ApproximateFocusDistance if available +
  • API Changes: +
      +
    • Enhanced StrictDate option to reformat PNG CreateTime according to PNG + specification +
    +
+ +Oct. 2, 2018 - Version 11.12 +
    +
  • Added a new Sony/Minolta LensType (thanks LibRaw and Jos Roost) +
  • Added a new Nikon LensID +
  • Decode a few new Sony SRF2 tags (thanks LibRaw) +
  • Decode GPS from NextBase 512GW dashcam MOV videos +
  • Validate MS-DOC FIB before extracting contained tags +
  • Fixed bug extracting GPSSpeed for some dashcam models +
+ +Sept. 27, 2018 - Version 11.11 (production release) +
    +
  • Added ARQ to the list of supported file types +
  • Added support for GIMP XCF version 4 and later +
  • Added a new QuickTime HandlerType value +
  • Added read support for Apple AAE files +
  • Added a new CanonModelID and some new Canon LensType values (thanks LibRaw) +
  • Added a number of new Nikon LensID values (thanks Robert Rottmerhusen) +
  • Added a new Sony/Minolta LensType (thanks LibRaw) +
  • Decode more Sony IDC tags (thanks Jos Roost) +
  • Decode some new Panasonic tags (thanks Klaus Homeister) +
  • Decode more tags from Nikon MOV videos +
  • Decode a new Nikon tag (thanks LibRaw) +
  • Decode a large number of new Kodak IFD tags (thanks Jim McGarvey) +
  • Decode streaming GPS from videos of more dashcam and drone models +
  • Decode more tags from Microsoft Word DOC files +
  • Updated arg_files/iptcCore.args for IPTC Extension version 1.4 +
  • Patched to read corrupted MakN data written by buggy Adobe Camera Raw +
  • Downgraded "Undersized StripByteCounts" error for some RAW file types +
  • Fixed incorrect decoding of embedded GPS in Rexing V1P dashcam videos +
  • Fixed incorrect format for DNGPrivateData +
  • Fixed potential error when deleting maker notes from some images +
  • Fixed problem decoding Apple PLIST information from some files +
  • Fixed bug in Windows with CR/LF sequences in list values of the -X output +
  • Fixed some inconsistencies in detecting file name conflicts when writing the + TestName tag +
+ +Aug. 17, 2018 - Version 11.10 +
    +
  • Added support for Canon 1DX firmware 2.1.0 +
  • Added a new Canon LensType (thanks LibRaw) +
  • Added a new Nikon LensID (thanks LibRaw) +
  • Added a new CanonModelID +
  • Decode more tags for newer Sony DSC models (thanks Jos Roost) +
  • Decode some new SonyIDC tags (thanks Jos Roost) +
  • Decode a number of new Panasonic tags (thanks Klaus Homeister) +
  • Improved validation of XMP namespaces +
  • Changed "File not found" messages to "Error: File not found" +
  • Fixed problem editing tags in Canon DR4 directory +
+ +Aug. 13, 2018 - Version 11.09 +
    +
  • Added new Pentax and Canon LensType values +
  • Decode Google Camera Motion metadata from MP4 videos +
  • Decode more PanasonicRaw tags (thanks Klaus Homeister) +
  • Removed warning when multiple Word document LastSavedBy tags exist and the + Duplicates option wasn't enabled (added Note in tag name docs instead) +
+ +Aug. 1, 2018 - Version 11.08 +
    +
  • Decode more tags from Microsoft Word documents, including LastSavedBy +
  • Decode image file characteristics from Windows EXE files +
  • Decode more PanasonicRaw tags (thanks Klaus Homeister) +
  • Changed names of new Samsung trailer tags +
  • Fixed potential problems converting C-style escaped strings +
  • Fixed new "#[CSTR]" feature to work with -stay_open option +
+ +July 27, 2018 - Version 11.07 +
    +
  • Added "#[CSTR]" feature to -@ argfile +
  • Added some new Sony LensType values (thanks Jos Roost) +
  • Decode more tags from Samsung trailer +
  • Decode an undocumented DNG tag +
  • Decode some new Panasonic tags (thanks Klaus Homeister) +
  • Improved/fixed a few Validate warnings +
  • Made MakerNote "Bad SubDirectory start" warnings minor +
  • Fixed NoDups() function to work with special characters as list separators +
+ +July 6, 2018 - Version 11.06 +
    +
  • Fixed "undefined value" bug when reading ImageSourceData from a JPEG file +
+ +July 5, 2018 - Version 11.05 +
    +
  • Added a number of new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Fixed out-of-memory problem when writing some large TIFF images in Windows +
+ +July 4, 2018 - Version 11.04 +
    +
  • Added a check on TIFF image data size when writing or using Validate option +
  • Added a few new Sony lenses (thanks LibRaw) +
  • Added a new Nikon LensType +
  • Improved validation of XMP with Validate option +
  • Drop PhaseOne tags larger than 8 kB when copying PhaseOne maker notes to + another file +
  • Fixed out-of-memory problem when reading some large TIFF images in Windows +
+ +June 21, 2018 - Version 11.03 +
    +
  • Added support for new Exif 2.31 for XMP tags +
  • Added support for another FujiFilm X-T1 firmware version +
  • Decode more Panasonic tags (thanks Klaus Homeister) +
+ +June 13, 2018 - Version 11.02 +
    +
  • Added support for a different format of Apple iWorks files +
  • Added undocumented API FixCorruptedMOV option to allow fixing MOV videos + with multiple 'mdat' atoms which were corrupted by ExifTool +
  • Decode more QuickTime tags +
  • Decode more PanasonicRaw tags (thanks Klaus Homeister) +
  • Improved decoding of makernotes in ARW images from Hasselblad cameras + (thanks LibRaw) +
  • Fixed some problems writing multi-segment EXIF in JPEG images +
+ +June 11, 2018 - Version 11.01 (production release) +
    +
  • Added a new ProfileCMMType (thanks Neal Krawetz) +
  • Added a Validate warning about non-standard EXIF or XMP in PNG images +
  • Added a new Canon LensType +
  • Decode a couple more PanasonicRaw tags (thanks Klaus Homeister) +
  • Patched to avoid adding tags to QuickTime videos with multiple 'mdat' atoms + --> avoids potential corruption of these videos! +
+ +June 7, 2018 - Version 11.00 (production release) +
    +
  • Added read support for WTV and DVR-MS videos +
  • Added print conversions for some ASF date/time tags +
  • Added a new SonyModelID (thanks LibRaw) +
  • Decode a new PanasonicRaw tag (thanks Klaus Homeister) +
  • Decode some new Sony RX100 VI tags (thanks LibRaw and Jos Roost) +
  • Made Padding and OffsetSchema tags "unsafe" so they aren't copied by default +
+ +May 29, 2018 - Version 10.99 +
    +
  • Decode layer information from Photoshop ImageSourceData in TIFF images +
  • Updated to the IPTC video metadata 1.2 specification +
  • Patched DateFmt() utility function to apply GlobalTimeShift if used +
  • Improved error message when trying to write a file with a wrong extension +
  • Fixed unnecessary warning when setting FileCreateDate in Windows +
+ +May 22, 2018 - Version 10.98 +
    +
  • Added additional Validate checks for JPEG thumbnail tags +
  • Added a new Canon LensType (thanks LibRaw) +
  • Decode a number of new Nikon ColorBalance tags (thanks LibRaw) +
  • Disable extraction of Nikon D850 PhotoShootingMenuBank from NEF images + (apparently not valid in this type of file) +
  • Fixed problem with writable user-defined Composite tags introduced in 10.16 +
  • Fixed unnecessary Validate warning about missing GPSVersionID +
  • Fixed incorrect "wrong IFD" Validate warnings in CR3 images +
+ +May 17, 2018 - Version 10.97 - "Multi-segment EXIF" +
    +
  • Added read/write support for multi-segment EXIF in JPEG images +
  • Added a number of new Canon LensType values (thanks LibRaw) +
  • Added support for Panasonic DC-FT7 makernotes and metadata in MP4 videos +
  • Decode a number of new Nikon WB tags (thanks LibRaw) +
  • Improved warning message when attempting to write to an invalid tag name +
  • Enhanced Validate feature to perform more tests on TIFF and JPEG images
    + [The Validate feature is no longer considered experimental] +
+ +May 9, 2018 - Version 10.96 +
    +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Added a few new Panasonic lenses (thanks LibRaw) +
  • Added Composite tags for GPSDestLatitudeRef and GPSDestLongitudeRef +
  • Decode maker notes from Kodak PixPro AZ901 +
  • Extract Preview images from iWork files +
  • Improved identification of Apple iWork files +
  • Fixed arg_files to handle GPS destination reference directions +
+ +May 4, 2018 - Version 10.95 +
    +
  • Added new Nikon LensID's (thanks Warren Hatch, LibRaw and Jami Bradley) +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Decode a new Samsung tag (thanks LibRaw) +
  • Decode Photoshop Lr16 layer information +
  • Decode more Leica tags (thanks LibRaw) +
  • Updated DarwinCore tags to current specification +
  • Improved validation of JPEG files +
  • Disabled writing of buggy Samsung EK-GN120 SRW files +
  • Fixed conversion for Nikon D850 ExposureDelayMode (thanks Jami Bradley) +
  • Fixed "x outside string" error when reading a truncated zip file +
  • Fixed "uninitialized value" error when writing a corrupted JPEG image +
+ +Apr. 19, 2018 - Version 10.94 +
    +
  • Added read/write support for Canon CRM files +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Added a new CanonModelID +
  • Decode a new Samsung tag (thanks LibRaw) +
  • Fixed AIColorModel conversion +
+ +Apr. 13, 2018 - Version 10.93 +
    +
  • Added a new Canon Quality value (thanks Norbert Wasser) +
  • Added a new Pentax Quality value (thanks LibRaw) +
  • Decode some new Sony ARW tags (thanks Jos Roost) +
  • Decode some AI-specific tags from PDF and PostScript files +
  • Decode a new QuickTime tag +
  • Enhanced -geotag option to support NMEA from GLONASS and other systems +
  • Fixed bug decoding seconds of ZIP file timestamps (thanks Lars Wallenborn) +
+ +Apr. 19, 2018 - Version 10.92 +
    +
  • Decode GPS from videos of more camera models +
  • Tolerate white space before header in PDF files +
+ +Apr. 9, 2018 - Version 10.91 +
    +
  • Added read/write support for MacOS FileCreateDate (writing this is the same + as MDItemFSCreationDate, but reading uses a different mechanism which + doesn't have the delayed-update issue of MDItemFSCreationDate) +
  • Added ability to write MacOS MDItemUserTags (requires "tag" utility) +
  • Decode a new Sony tag (thanks LibRaw) +
  • Properly un-escape quotes in extracted MacOS MDItem values +
  • Fixed another subtle order-of-operations anomaly +
  • API Changes: +
      +
    • Enhanced GetValue() to accept a tag name with group prefix(es) +
    +
+ +Apr. 5, 2018 - Version 10.90 +
    +
  • Improved decoding of Sony PictureProfile (thanks Jos Roost) +
  • Fixed problem introduced in 10.61 with order of command-line operations when + mixing copied values with assigned values +
+ +Apr. 2, 2018 - Version 10.89 +
    +
  • Added ability to rotate MP4/MOV videos by writing Rotation angle +
  • Added two new Sony PictureProfile values (thanks Albert Shan) +
  • Decode more Nikon tags +
  • Updated some values of the QuickTime MediaType tag +
+ +Mar. 27, 2018 - Version 10.88 +
    +
  • Added example config file (dji.config) to generate Composite GPS and other + tags from Text metadata embedded in DJI drone videos +
  • Added a new PentaxModelID +
  • Documented new advanced-formatting "@" feature which has existed since + version 10.53 but not fully functional until 10.87 +
  • Decode a new Sony tag (thanks LibRaw) +
  • User-defined Composite tags now show up in the -list output +
  • Improved speed for generating Composite SubDoc tags with -ee option +
  • Fixed problem creating writable UserDefined Composite tags +
  • Fixed an incorrect PRISM tag name +
+ +Mar. 20, 2018 - Version 10.87 +
    +
  • Added a new FujiFilm ShutterType value (thanks Albert Shan) +
  • Decode more timed metadata from CR3 images +
  • Decode Samsung DualShot depth map +
  • Decode a new Canon tag +
  • Improved decoding of some Canon color information (thanks LibRaw) +
  • Fixed print conversion of ID3v2 Genre values with multiple genres +
+ +Mar. 15, 2018 - Version 10.86 +
    +
  • Decode timed GPS and accelerometer data from BikeBro AVI videos +
  • Decode a new Sony tag and add a new value to another tag (thanks Jos Roost) +
  • Decode GPSAltitude from some videos with the -ee option +
  • Decode some new tags from Kodak PixPro 4KVR360 JPEG images and MP4 videos +
  • Decode GPS information from CR3 images +
  • Fixed unnecessary warnings when Validate option used on CR3 images +
+ +Mar. 14, 2018 - Version 10.85 +
    +
  • Decode GPSTrack from MOV videos of more dashcam models +
  • Decode a few new CanonVRD tags for DPP 4.8.20 +
  • Decode a new Sony tag (thanks Jos Roost) +
  • Decode a few more Canon tags (thanks LibRaw) +
  • Improved processing speed when using the -ee option on some video files +
  • Fixed incorrect names for a couple of CanonVRD HSL tags +
  • Fixed problem where UTF-8 validation missed some invalid sequences +
  • Fixed bug introduced in 10.84 with GPSPosition when -n option is used +
+ +Mar. 12, 2018 - Version 10.84 +
    +
  • Decode GPS from MOV videos of more dashcam models with -ee option +
  • Decode a new Sony tag (thanks Jos Roost) +
  • Convert GPS speeds extracted from MOV videos with the -ee option to km/h +
  • Avoid converting empty GPS coordinates to 0.000000 +
  • Fixed some bugs extracting Novatek GPS from MP4 videos +
+ +Mar. 7, 2018 - Version 10.83 +
    +
  • Added read support for Sketch design files +
  • Added Light LRI files to the list of recognized file types +
  • Added a new Canon LensType (thanks LibRaw) +
  • Decode a couple of new Sony tags (thanks Jos Roost) +
  • Extract JpgFromRaw image from CR3 images +
  • Improved warning message when attempting to write a tag in a specific group + that isn't writable +
  • Changed group name of JSON tags from "File" to "JSON" +
  • Fixed some incorrect offsets in -v3 output for CR3 images +
+ +Mar. 1, 2018 - Version 10.82 +
    +
  • Added support for Canon's new CR3 raw file format +
  • Added a few new CanonModelID/SonyModelID values (thanks LibRaw) +
  • Added support for the Sony ILCE-7M3 (thanks Jos Roost) +
  • Decode timed GPS information from Insta360 MP4 videos with the -ee option +
  • Write XMP before idat in MOV/MP4/CR3 files if possible +
  • Fixed "'x' outside of string" runtime error when reading some Sony images +
  • Fixed problem with some hex dumps going to the console when -v3 was combined + with the -w option +
+ +Feb. 26, 2018 - Version 10.81 +
    +
  • Added new values for a few Panasonic tags (thanks Bernd-Michael Kemper) +
  • Added a new Canon, Olympus and Sony LensTypes (thanks LibRaw) +
  • Added a new PanasonicRaw Compression type (thanks LibRaw) +
  • Added definitions for a number of new MacOS tags +
  • Decode CameraInfo for Canon 5DmkIII firmware 1.3.5 +
  • Removed INX from list of writable files (-listwf option output) +
  • Fixed problem introduced in version 10.16 that could cause a "Can't create" + error when using the -o option to write certain types of files +
  • Fixed problem introduced in version 10.34 resulting in a "Can't delete all + meta information" error when writing .PS files +
+ +Feb. 22, 2018 - Version 10.80 (production release) +
    +
  • Added read/write support for Reconyx UltraFire maker notes +
  • Added a new Sony/Minolta lens (thanks Jos Roost) +
  • Decode a new PanasonicRaw tag (thanks LibRaw) +
  • Extract ImageWidth/Height for main image of an HEIC file +
  • Internal changes: +
      +
    • Changed TimeNow() make ExifTool object optional +
    +
+ +Feb. 11, 2018 - Version 10.79 +
    +
  • Added a new Olympus CameraType (thanks LibRaw) +
  • Added a new XMP-microsoft tag (thanks José Oliver-Didier) +
  • Decode a new GoPro QuickTime tag +
  • Convert nulls IPTC:DocumentHistory to newlines +
  • Removed all null terminators from JSON and PHP output +
  • Fixed writing of GPSDateStamp and GPSTimeStamp to be able to set to "now" +
  • Internal changes: +
      +
    • Changed TimeNow() to require ExifTool object as first argument +
    +
+ +Jan. 31, 2018 - Version 10.78 +
    +
  • Added a few new values for some Olympus tags (thanks John) +
  • Decode GoPro APP6 metadata in JPEG images and more GoPro MP4 tags +
  • Decode more Red tags, and improved decoding of others +
  • Decode face detection information from timed metadata with the -ee option +
  • Fixed problem writing shorthand XMP containing CDATA sections +
  • Fixed problem copying XMP-acdsee:Snapshots +
  • Fixed decoding of a few Panasonic RAW tags (thanks Klaus Homeister) +
+ +Jan. 26, 2018 - Version 10.77 +
    +
  • Added read support for Redcode R3D RAW videos +
  • Enhanced -sep option to specify separator and terminator for binary output +
  • Removed null terminator from JSON output of ICC_Profile:CharTarget +
  • Improved error messages to help diagnosing some types of corrupted files +
  • Return an exit status of 2 instead of 1 if all files fail the -if condition +
  • Fixed decoding of QuickTime chapter names +
  • Fixed incorrect MimeType for RMD files +
  • Fixed problem where exit status of 1 was returned when writing with a -if + condition if any of the files failed the condition +
+ +Jan. 22, 2018 - Version 10.76 +
    +
  • Added ability to write shorthand XMP with the -z option +
  • Added write support for Google XMP GFocus tags +
  • Improved decoding of GoPro timed metadata +
  • Renamed ASF PlayDuration to Duration +
  • Fixed problem where fractional seconds were ignored when geotagging from an + NMEA track log with no date stamps +
  • Fixed runtime warning when reading XMP with an empty structure in a list +
  • API Changes: + +
+ +Jan. 12, 2018 - Version 10.75 +
    +
  • Added another Sony/Minolta lens (thanks Jos Roost) +
  • Decode more QuickTime tags +
  • Decode a number of new tags from GoPro Hero6 MP4 videos +
  • Enhanded "Unknown file type" error to indicate if "File is empty" or "File + header is all binary zeros" +
  • Improved decoding of some Sony tags (thanks Jos Roost) +
  • Improved decoding of QuickTime timed metadata +
  • Marked ArtworkCircaDateCreated as "unsafe" for writing to avoid it being + added when attempting to shift all date/time tags +
  • Fixed bug which could cause runtime error when reading some old Sony maker + notes (thanks Tamas Lovag) +
+ +Jan. 8, 2018 - Version 10.74 +
    +
  • Added a new Sony/Minolta lens (thanks Jos Roost) +
  • Added print conversion for ICC_Profile DeviceManufacturer and ProfileCreator +
  • Added informational warning when the ExtractEmbedded option may be useful +
  • Improved experimental Validate feature for RAW files +
  • Fixed bug in experimental Validate feature that could cause out-of-memory + error when combined with "-use mwg" +
+ +Jan. 5, 2018 - Version 10.73 +
    +
  • Added read/write support for GoPro RAW (GPR) files +
  • Added a new Sony/Minolta lens (thanks Sylvain) +
  • Improved conversions for GPS tags extracted from video streams +
+ +Jan. 4, 2018 - Version 10.72 +
    +
  • Added IF feature to -p option +
  • Decode streamed GPS position and other streamed metadata from MP4 videos + when the -ee option is used +
  • Fixed problem geotagging GPSAltitude from some GPX files +
+ +Jan. 2, 2018 - Version 10.71 +
    +
  • Decode some more ICC_Profile tags (thanks Eef Vreeland) +
  • Decode MechanicalShutterCount for Nikon D850 (thanks Xavier Jubier) +
  • Convert PNG:CreationTime values to/from standard date format +
  • Fixed problem loading default config file from application directory +
  • Fixed problem reading XMP where a namespace is defined after an attribute + which uses the namespace +
+ +Dec. 27, 2017 - Version 10.70 +
    +
  • Search application directory for -config file +
  • Improved robustness of JSON import +
  • Enhancements to experimental Validate feature +
  • Fixed bug introduced in 10.69 which could result in hang when writing + multi-segment JPEG metadata +
+ +Dec. 18, 2017 - Version 10.69 +
    +
  • Added "OK" UserParam for use in -if conditions +
  • Allow writing an empty JPEG Comment +
  • Check for proper location of Photoshop metadata with -validate or -use mwg +
  • Exit status now set to 1 if command was aborted due to invalid arguments +
  • Translate "UTF8" to appropriate escape sequence when writing + IPTC:CodedCharacterSet with the -n option +
  • Improved "Not a valid TIFF" error message to be more specific about the file + type for TIFF-based formats +
  • Fixed problem parsing Honeywell PTNTHPR NMEA sentences from some GPS devices +
+ +Dec. 5, 2017 - Version 10.68 +
    +
  • Added ability to set tag values and API options to an empty string using + "^=" on the command line +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Added a new Nikon LensID +
  • Decode more tags from some newer Leica models +
  • Decode a new Apple tag +
  • Fixed indeterminate order of extracted XMP structures +
+ +Nov. 16, 2017 - Version 10.67 +
    +
  • Fixed problem introduced in 10.66 with -execute not returning the command + number in the "{ready}" message when -stay_open was used +
  • API Changes: + +
+ +Nov. 14, 2017 - Version 10.66 +
    +
  • Added a new Canon LensType (thanks Norbert Wasser) +
  • Updated en-ca and en-gb language translations +
  • Minor format change to experimental Validate feature return value +
  • Prevent JFIF from being added to a JPEG containing Adobe APP14 +
  • Changed a number of Canon LensType strings to add "USM" to L model names +
  • Patched for compatibility with Time::Piece version 1.29_04 and later, and + improved error handling when writing formatted date/time values +
  • Fixed bug in Composite MWG CreateDate and DateTimeOriginal tags which could + cause existing tags to be hidden when not using the -a option +
  • Fixed problem using '#' suffix not properly fixed in 10.65 +
  • Fixed problem decoding Nikon D810 MultiExposure tags +
+ +Oct. 31, 2017 - Version 10.65 +
    +
  • Added support for DOSLatinUS (cp437) and DOSLatin1 (cp850) character sets +
  • Added Extra ForceWrite tag for forcing metadata in a file to be rewritten +
  • Added write support for RAF images from some newer FujiFilm models +
  • Added a new SonyModelID, Sony LensType and Olympus LensTypes (thanks LibRaw) +
  • Added a new Pentax LensType +
  • Added a new Nikon LensID +
  • Decode more Sony tags for new models (thanks Jos Roost) +
  • Decode Nikon D850 ShotInfo tags and custom settings (thanks Warren Hatch) +
  • Decode Nikon D850 ColorTemperatureAuto (thanks LibRaw) +
  • Decode Photoshop LayerModifyDates and LayerIDs +
  • Improved decoding of Nikon D5/D500/D810 ShotInfo tags +
  • Allow advanced formatting expressions to return a list reference +
  • Fixed problem in Composite:GPSAltitude when derived from an "undef" altitude +
  • Fixed bug which could result in runtime warning when excluding some tags + from being extracted +
+ +Oct. 17, 2017 - Version 10.64 +
    +
  • Added a new Nikon LensID +
  • Added a new SonyModelID +
  • Added a new CanonModelID (thanks LibRaw) +
  • Added some new non-standard CustomRendered values +
  • Decode FrameRate from FLIR SEQ files (thanks Sebastian Häni) +
  • Enhanced shift feature to be able to shift some not-so-simple numerical + values (eg. GPSLatitude) with -TAG+=VALUE syntax +
  • Fixed problem with possible malformed UTF-8 when writing IPTC values that + require truncation +
  • Fixed incorrect Writable type for XMP-GSpherical:TimeStamp +
  • Fixed incorrect family 2 group name for Nikon HDRInfo tags +
+ +Oct. 4, 2017 - Version 10.63 +
    +
  • Added a number of new Canon LensTypes (thanks Norbert Wasser for some) +
  • Added a new CanonModelID +
  • Added a new Olympus CameraType +
  • Decode MD5Signature in FLAC StreamInfo (thanks Tim Eliseo) +
  • Improved decoding of HEIC/HEIF metadata +
  • Removed useless write support for QuickTime date/time tags in HEIC/HEIF + images +
  • Fixed "Incorrect XMP stream length" problem when writing some INDD files +
+ +Sept. 28, 2017 - Version 10.62 +
    +
  • Added preliminary support for HEIC/HEIF images +
  • Added support for Google depthmap metadata (XMP-GDepth) +
  • Added some new Sony/Minolta lenses (thanks LibRaw and Jos Roost) +
  • Added a new CanonModelID (thanks Norbert Wasser) +
  • Added a new Nikon LensID (thanks Michael Tapes) +
  • Decode a new Sony tag (thanks Jos Roost) +
  • Decode some new Nikon tags (thanks Warren Hatch) +
  • Decode maker notes from Leica TL2 +
  • Enhanced ID3 -v2 output to show frame flags +
  • Fixed problem decoding Nikon D810 camera tilt angles +
  • Fixed problem where SphericalVideoXML metadata was deleted when writing XMP + to a QuickTime-format file containing this information +
+ +Aug. 18, 2017 - Version 10.61 +
    +
  • Added a new Canon LensType (thanks LibRaw) +
  • Added a number of new Sigma, Nikon and Sony lenses (thanks Jos Roost) +
  • Added a new Nikon LensID (thanks Yang You) +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Decode Panasonic FocusDistance (thanks David Ellsworth) +
  • Updated to the IPTC video metadata 1.1 specification +
  • Restored the ability to delete JpgFromRaw from RAW images (broken in 10.38) +
  • Fixed problem decoding maker notes from Pentax K-70 AVI videos +
  • Fixed problem conditionally replacing a tag if the value to be deleted was + taken from another tag while the new value was assigned directly +
+ +July 21, 2017 - Version 10.60 +
    +
  • Added two new Sony/Minolta LensTypes (thanks Jos Roost) +
  • Added a new Pentax LensType (thanks Dieter Pearcey) +
  • Added new Composite UniquePathPoints tag to photoshop_paths.config +
  • Extract raw-data JFIF/JFXX thumbnails as ThumbnailTIFF +
  • Improved Sony LensSpec conversion +
  • Updated German translations (thanks Herbert Kauer) +
  • Set family 1 group name of JFXX ThumbnailImage to JFXX instead of JFIF +
  • Fixed problem with %C no longer incrementing properly +
+ +July 7, 2017 - Version 10.59 +
    +
  • Added a new Canon LensType (thanks LibRaw) +
  • Added a new Nikon LensID +
  • Added "wrong extension" warning to experimental Validate feature +
  • Decode Pentax maker notes in Q-S1 AVI videos +
  • Updated iptc2exif.args and exif2iptc.args to support new EXIF OffsetTime + tags (thanks Herb) +
  • Patched potential problem with "Use of uninitialized value $pos" error when + importing malformed JSON data +
  • Patched to avoid runtime warning due to invalid Nikon ShutterCount value +
  • Raise an error if -b is used with the -csv option +
  • Changed PNG exIf chunk name to eXIf +
  • Fixed bug introduced in 10.26 which could cause hang when %C is used in an + output file name +
  • Fixed MWG:DateTimeOriginal and MWG:CreateDate to return XMP when EXIF and + IPTC don't exist +
+ +June 29, 2017 - Version 10.58 +
    +
  • Added read support for RIFF-format MBWF/RF64 files +
  • Added write support for dji-drone XMP tags +
  • Added a new Canon LensType (thanks Steve Bates) +
  • Added a few new Sony/Minolta LensType values (thanks Jos Roost) +
  • Added a couple of new CanonModelID values (thanks LibRaw and Norbert Wasser) +
  • Decode some new FujiFilm tags (thanks Chris Schucker) +
  • Enhanced FileSize print conversion to show in "GB" for large files +
  • Fixed "outside of string in unpack" errors when reading some corrupted + EXE/ICC files +
  • Fixed problem extracting GIF MIDISong metadata +
+ +June 20, 2017 - Version 10.57 +
    +
  • Added a new Canon LensType (thanks Norbert Wasser) +
  • Added write support for PNG Collection tag +
  • Added a few new CanonModelID values +
  • Added some new Pentax ShakeReduction values +
  • Removed ability to create PNG zxIf chunks +
  • Documented -progress:%b feature (added in 10.26) +
  • No longer report FileType, FileTypeExtension or MIMEType for JPEG/TIFF + images with an unknown header +
  • Relaxed case requirement for "SourceFile" header in CSV and JSON import +
  • Fixed decoding of Pentax ExposureCompensation for newer Ricoh models +
  • Fixed some incorrect "Wrong IFD" messages with experimental Validate feature +
  • Fixed a couple of Sony/Minolta lens names (thanks Jos Roost) +
  • Fixed "Error reading PreviewImage" warning for some Sony models +
+ +June 6, 2017 - Version 10.56 +
    +
  • Removed ordering constraints between Geotag/Geosync and Geotime assignments + on the command line +
  • Removed debugging print statement left in photoshop_paths.config +
+ +June 5, 2017 - Version 10.55 (production release) +
    +
  • Added support for GIF multimedia extensions +
  • Added a couple of new Sony/Minolta lenses (thanks Chris) +
  • Added a new Nikon LensID (thanks Jakob Dettner) +
  • Added new Composite TotalPathPoints tag to photoshop_paths.config +
  • Decode a number of new Sony tags and updated some others (thanks Jos Roost) +
  • Decode a new Pentax tag and fixed decoding of another (thanks Andras + Salamon) +
  • Updated iptcCore.args for new IPTC specification +
  • Changed description of a couple of AVI Model tags to match EXIF +
  • Patched tests to avoid failures with Perl 5.25.11 due to missing "." in @INC +
  • Fixed an incorrect warning from the experimental Validate feature +
+ +May 26, 2017 - Version 10.54 +
    +
  • Added support for Google XMP GImage and GAudio tags +
  • Added a new Olympus CameraType (thanks LibRaw) +
  • Added a two new Sony lenses and decode more ILCE-9 tags (thanks Jos Roost) +
  • Added new values to some Pentax tags (thanks Andras Salamon) +
  • Added a new Canon LensType +
  • Added an additional checks to the experimental Validate feature +
  • Improved user-defined FileTypes feature to provide more flexibility +
  • Enhanced -ext option to allow specific files extensions to be processed + along with supported files +
  • API Changes: + +
+ +May 17, 2017 - Version 10.53 +
    +
  • Added support for "MeSa" Photoshop IRB resource +
  • Made XMP-GSpherical tags writable +
  • Improved German translations (thanks Jobi) +
+ +May 12, 2017 - Version 10.52 +
    +
  • Added some new values to a number of FujiFilm tags and changed some others + (thanks Albert Shan) +
  • Decode a number of new Sony tags for the ILCE-9 (thanks Jos Roost) +
  • Made SonyISO writable +
  • Changed behaviour of advanced formatting expression for Shortcut tags so it + now applies to the combined value rather than individual constituent values +
  • Minor changes to some Pentax print conversions +
  • Fixed problem using new NoDups utility with Shortcut tags +
+ +May 2, 2017 - Version 10.51 +
    +
  • Added "NoDups" utility function for use in advanced formatting expressions +
  • Added a new Pentax LensType (thanks JohnK) +
  • Added some new Pentax DriveMode values (thanks Andras Salamon) +
  • Enhanced -ver option to report Perl include directories with -v2 +
  • Improved warning message when advanced formatting expression returns undef +
  • Minor change to a few FujiFilm print conversion strings (thanks Albert Shan) +
  • Changed behaviour when interpolating Shortcut tags in a string (the values + are now separated according to the -sep option setting instead of simply + being concatenated) +
  • Patched to allow file times to be set on systems where futimes is not + available +
+ +Apr. 20, 2017 - Version 10.50 (production release) +
    +
  • Decode a new Pentax tag (thanks Andras Salamon) +
  • Improved decoding of Olympus DriveMode (thanks Herbert Kauer) +
  • Improved handling of errors from utime when setting file times +
  • Fixed potential hang problem when reading corrupted QuickTime metadata +
  • Fixed problem deleting duplicate EXIF tags when writing other tags at the + same time +
+ +Apr. 10, 2017 - Version 10.49 +
    +
  • Added "DateFmt" utility function for use in advanced formatting expressions +
  • Added a new Sony/Minolta LensType (thanks LibRaw) +
  • Decode a new Panasonic tag +
  • Fixed problem decoding Sony VariableLowPassFilter values (thanks Jos Roost) +
  • Fixed problem setting XMP:About when creating new XMP in a file +
  • Fixed an incorrect Pentax DriveMode value (thanks Andras Salamon) +
  • API Changes +
      +
    • Allow access to the advanced formatting expression via a new ExifTool + "FMT_EXPR" member variable +
    +
+ +Apr. 3, 2017 - Version 10.48 +
    +
  • Added some new FujiFlashMode values (thanks Albert Shan) +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Added a new Canon LensType (thanks LibRaw) +
  • Added a new CanonModelID and minor changes to some others (thanks Dmitry) +
  • Decode two Pentax tags and added a number of new values for other Pentax + tags (thanks Andras Salamon) +
  • Decode a new Sony tag (thanks Jos Roost) +
  • Improvements to the experimental Validate feature +
  • Fixed problem which could cause hang when reading bad PPT documents +
+ +Mar. 20, 2017 - Version 10.47 +
    +
  • Added read support for JSON-format files +
  • Added two new Sony/Minolta lenses (thanks Jos Roost) +
  • Added a number of new Pentax tag values +
  • Decode a new Canon CR2 tag (thanks Ed Hannon) +
  • Decode WB information for Canon 800D (thanks LibRaw) +
  • Improved config_files/photoshop_paths.config to indicate start of paths +
  • Attempt to validate new file names in Windows before renaming images +
  • Experimental Validate feature no longer warns about Windows XP tags +
  • Fixed problem extracting layer information from very large PSD/PSB files +
+ +Mar. 8, 2017 - Version 10.46 +
    +
  • Moved Mac System tags from the Extra table into a new MacOS group and added + ability to extract them by requesting the MacOS group +
  • Updated QuickTime GenreID list (thanks François Bonzon) +
  • Fixed "Invalid xref" problem when reading some PDF files +
  • Fixed error in Minolta lens list (thanks Jos Roost) +
  • Fixed minor problem with -U option generating Unknown tags for some known + bytes in variable-sized strings +
  • API Changes: +
      +
    • Enhanced RequestTags option to allow groups to be requested +
    +
+ +Mar. 2, 2017 - Version 10.45 +
    +
  • Added ability to write a number of Mac OS X system tags (including the file + creation date!) +
  • Added ability to extract OS X extended attributes ("XAttr" tags) +
  • API Changes: + +
+ +Feb. 24, 2017 - Version 10.44 +
    +
  • Added a few new CanonModelID values and a new Canon LensType +
  • Added two new Nikon lenses (thanks Rolf Probst) +
  • Added a few new Sony/Minolta lenses (thanks Jos Roost) +
  • Added two new Sony MeteringMode values (thanks Jos Roost) +
  • Improved verbose dump of Photoshop Layer information +
  • Patched to allow "FileName encoding not specified" warnings to be avoided by + setting -charset filename="" +
  • Fixed problem in photoshop_paths.config printing some paths +
+ +Feb. 16, 2017 - Version 10.43 +
    +
  • Restrict writing of EXIF:FlashEnergy to a single value as per EXIF spec +
  • Reverted format change of Sony ImageCount tag +
  • Changed PNG new eXIF/zXIF chunk names to "exIf" and "zxIf" until the + proposed chunks are accepted (of course, while maintaining backward + compatibility for reading/updating the other chunks) +
  • Lowered priority of XMP-pdf:Keywords so it doesn't take precedence over + PDF:Keywords when the Duplicates option is not used +
  • Improved config_files/convert_regions.config to handle the case where the + RegionInfoMP is missing a Rectangle +
+ +Feb. 10, 2017 - Version 10.42 +
    +
  • Added ability to read/write PNG eXIF and zXIF chunks, and made these the + place where new EXIF is created in PNG images (zXIF if the -z option is + used, or eXIF otherwise) +
  • Added ability to copy Photoshop OriginPathInfo with photoshop_paths.config +
  • Made FileUserID and FileGroupID writable +
  • Changed format for a Sony ImageCount tag +
  • Improvements to experimental Validate feature +
  • Fixed incorrect XMP swf namespace URI +
  • Fixed problem using new -p section feature when combined with -w or -ee +
  • Fixed formatting problem in -listx output when -lang option was used +
  • Fixed problem where UserComment wasn't removed if found in IFD0 when writing + it to the correct IFD +
+ +Feb. 1, 2017 - Version 10.41 +
    +
  • Added an experimental metadata validation feature (invoked either by + requesting the new Extra Validate tag or by setting the API Validate option) +
  • Added support for PSDT file extension +
  • Added age.config to the distribution +
  • Added a new Sony lens (thanks Jos Roost) +
  • Added a new PentaxModelID (thanks Louis Granboulan) +
  • Enhanced -p option to allow files to be grouped in sections +
  • Made makernote offset warning minor +
  • Relaxed parsing of NMEA GGA sentence so comma after the geoid units is now + optional +
  • Patched problem extracting value of an unsafe binary tag with the -b option + when specified using -TAG# instead of -TAG with -n +
  • API Changes: +
      +
    • Added experimental Validate option +
    +
+ +Jan. 14, 2017 - Version 10.40 (production release) +
    +
  • Fixed tests that were failing on some platforms +
+ +Jan. 13, 2017 - Version 10.39 +
    +
  • Added Perl version and Unicode settings to -ver -v output +
  • Added a new Sony LensType2 value +
  • Added a new Canon LensType (thanks Norbert Wasser) +
  • More improvements to sample time_zone.config file (thanks Hayo Baan) +
  • Fixed problem with MWG date/time tags introduced in version 10.34 +
  • Fixed problem setting the value of a tag from a binary file when the + PERL_UNICODE environment or the perl -C option is used to force UTF-8 + treatment of @ARGV elements +
+ +Jan. 5, 2017 - Version 10.38 +
    +
  • Added a couple of new XMP-ics tags +
  • Added a new Nikon LensID (thanks Ken Cochran) +
  • Decode a couple more PhaseOne tags +
  • Increased priority of Sony 0x0115 WhiteBalance when reading +
  • Range check QuickTime date/time values when writing +
  • Apply CharsetPhotoshop setting to decoding of Photoshop LayerNames +
  • Improved identification of Nikon NRW images +
  • Minor improvements to verbose dump of FLIR information +
  • Improvements to sample time_zone.config file (thanks Hayo Baan) +
  • Removed trailing null in -b output for GPSDateStamp +
  • Changed "TAG is not supported" warning when writing to "TAG is not defined" +
  • Changed groups of Composite Preview/Thumbnail/JpgFromRaw/etc images to match + the tags from which they are derived +
  • Changed description of Composite Nikon LensSpec tag to match the tag name +
  • Fixed problems reading/writing PreviewImage from some DNG files +
+ +Dec. 19, 2016 - Version 10.37 +
    +
  • Decode more information from BMP V4 and V5 images +
  • Added a few new FujiFlashMode values (thanks Albert Shan) +
  • Changed -geotime default to use unconverted value of DateTimeOriginal +
  • Changed a couple of Sony Voigtlander LensType strings (thanks Jos Roost) +
  • Warn about invalid tag names used on the command line +
  • Generate default-language version of QuickTime tags even if the same-named + tag already exists in another group +
  • Fixed bug reading some Photoshop layer information +
  • Fixed problems in sample config file time_zone.config (thanks Hayo Baan) +
+ +Nov. 24, 2016 - Version 10.36 (production release) +
    +
  • Added 3D Studio MAX files to the list of supported file types +
  • Decode more Sony tags (thanks Jos Roost) +
  • Decode a couple more FlashPix tags +
  • Minor changes to some of the new IPTC Extension tags +
  • Fixed problem reading some FlashPix (Windows Compound Binary Format) files +
+ +Nov. 21, 2016 - Version 10.35 +
    +
  • Fixed bug in Windows version introduced in 10.32 which could cause ExifTool + to exit with an error if the -lang option was used +
+ +Nov. 21, 2016 - Version 10.34 +
    +
  • Added support for new IPTC Extension version 1.3 + video metadata XMP tags +
  • Added missing print conversion for PreviewDateTime +
  • Decode a few new FujiFilm tags (thanks Zilvinas Brobliauskas) +
  • Enhanced MWG date/time tags to support new EXIF time offsets +
  • Patched loophole in WriteMode which would allow creation of new metadata + files when creation of new groups was disallowed +
  • Fixed problem where some EXIF date/time tags may not shifted when shifting + all date/time tags with "-time:all-=VAL" for ExifTool version 10.28-10.33 or + when the MWG feature was used +
+ +Nov. 11, 2016 - Version 10.33 +
    +
  • Windows EXE version is 32-bit again, and packaged with Perl 5.24.0 +
  • Fixed encoding problem with EXIF:Copyright when writing MWG tags using an + alternate EXIF charset +
+ +Nov. 9, 2016 - Version 10.32 +
    +
  • WARNING: The Windows EXE version for this release is 64-bit (and packaged + with Perl 5.22.2 instead of 5.24.0) +
  • Time::Piece may now be used as an alternative to POSIX::strptime for parsing + date/time values when writing, and is included in the Windows package +
  • Added a number of new XMP tags (thanks StarGeek) +
  • Added support for a few new Sony cameras (thanks Jos Roost) +
  • Added new Nikon LensID (thanks Tanel) +
  • Decode a new Nikon tag (thanks Warren Hatch) +
  • Decode FLIF encoding type +
  • Decode a new Samsung tag (thanks Klaus Homeister) +
  • Ignore -filter option for a tag if it returns an undefined value +
+ +Oct. 19, 2016 - Version 10.31 +
    +
  • Added write support for FLIF images +
  • Added support for animated PNG images +
  • Added a few new SamsungModelID values +
  • Added a new Canon LensType +
  • Added a new Sony/Minolta LensType (thanks Jos Roost) +
  • Decode more Samsung tags (thanks Klaus Homeister and Sreerag Raghavan) +
  • Decode more Nikon tags (thanks Warren Hatch) +
  • Changed "TAG does not exist" warning when writing to "TAG is not supported" +
  • Fixed problem importing information from CSV or JSON databases for files + with special characters in their name +
+ +Oct. 13, 2016 - Version 10.30 +
    +
  • Added read support for FLIF images +
  • Added a couple of new Minolta/Sony LensType values (thanks Jos Roost) +
  • Added a new SonyModelID (thanks LibRaw and Jos Roost) +
  • Added a new digiKam XMP tag +
  • Decode a new Apple tag (thanks Neal Krawetz) +
  • Decode a few new FujiFilm tags (thanks Chris Schucker) +
  • Decode more Nikon D5 custom settings (thanks Warren Hatch) +
  • Decode a couple more Samsung tags (thanks Klaus Homeister) +
  • Improved decoding of Nikon D500/D5 ShotInfo information +
  • Enhanced -ver option to output system information when -v is added +
  • Minor change to parsing of -@ argfile (comment lines may may no longer have + spaces before the "#") +
  • Patched Jpeg2000 reader to read bad UUID-EXIF boxes +
  • Lowered priority of unknown XMP tags when reading +
  • Fixed problem in new xmp2exif.args date/time arguments introduced in 10.28 +
  • Fixed potential "Use of uninitialized value" warning when decoding + compressed PNG iTXt chunk +
+ +Oct. 5, 2016 - Version 10.29 +
    +
  • Added a couple of new Sony LensType values (thanks LibRaw) +
  • Decode a few new Sony tags +
  • Decode a few new FLIR tags +
  • Decode some new Nikon D5 tags (thanks Warren Hatch) +
  • Decode a new Apple tag +
  • Enhanced -geotag option to allow tagging from KML placemarks with a TimeSpan +
  • Enhanced -d option (and API DateFormat option) to perform inverse date/time + conversion when writing if the POSIX::strptime module is available. If + POSIX::strptime is not available then the behaviour is like older versions + (ie. the date/time is not converted) unless the API StrictDate option is set + in which case a warning is issued and the tag is not written +
+ +Sept. 27, 2016 - Version 10.28 - "Exif 2.31" +
    +
  • Added support for new Exif 2.31 tags +
  • Added some new Canon LensType values (thanks Norbert Wasser for one) +
  • Added a new Olympus LensType (thanks LibRaw and Niels Kristian Bech Jensen) +
  • Added a new Sony LensType and SonyModelID (thanks Jos Roost) +
  • Added a new Pentax LensType +
  • Added fotoware.config and bibble.config files to the distribution +
  • Made Composite SubSecDateTimeOriginal, SubSecCreateDate and SubSecModifyDate + tags writable, and expanded to include new Exif 2.31 time zone tags +
  • Fixed problem writing user-defined structured tag elements with a dot (.) in + their tag ID +
+ +Sept. 23, 2016 - Version 10.27 +
    +
  • Added a new CanonModelID (thanks LibRaw) +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Added a few new NikonLensID's (thanks Yang You and Robert Rottmerhusen) +
  • Added a couple of new Olympus LensType values (thanks LibRaw and Niels + Kristian Bech Jensen) +
  • Added a new Olympus CameraType +
  • Decode some Canon 80D, 750D, 760D and 1200D CameraInfo tags +
  • Changed writing of some ExposureTime and ExposureCompensation tags to allow + the exact numerator and denominator of the stored rational value to be + specified +
  • Fixed Timecode printout in -v3 output for M2TS videos (thanks Ken Neighbors) +
  • Fixed some problems with the new "-progress:TITLE" feature +
  • Fixed problem where "_exiftool_tmp" file could be left around after a failed + write attempt +
  • Fixed potential "isn't numeric" runtime error when reading a PDF file with + the -ee option +
+ +Sept. 15, 2016 - Version 10.26 +
    +
  • Added read support for GSpherical metadata in MP4 videos +
  • Added a few new XMP-xmpMM tags and a new XMP-crs tag +
  • Added some new Minolta/Sony lenses (thanks Jos Roost) +
  • Added two new CanonModelID's (thanks Norbert Wasser and Laurent Clévy) +
  • Added two new Canon LensType's (thanks Norbert Wasser) +
  • Decode a number of Nikon D610 custom settings (thanks Tor) +
  • Removed a questionable Samsung tag +
  • Marked TestName tag as "unsafe" for writing +
  • Enhanced -progress option with ability to set console window title +
  • Changed behaviour of %C to increment for each processed file as documented + (was incrementing for each output file created) +
  • Patched to recreate XMP in the standard location of PNG images when deleting + certain non-standard XMP as a group and recreating in one step +
  • Fixed runtime warning when writing 0 to MinoltaRaw ISOSetting +
  • Fixed problem writing SRW images from some newer Samsung models +
+ +Aug. 3, 2016 - Version 10.25 +
    +
  • Added a new Pentax PictureMode (thanks Louis Granboulan) +
  • Added a new Nikon LensID (thanks LibRaw) +
  • Decode a new Samsung tag (thanks LibRaw) +
  • Decode a few more Canon tags (thanks Anton Reiser) +
  • Removed "Avoid" flag for XMP-crs:ColorTemperature +
  • Changed the format of a number of XMP-GPano tags from integer to real +
  • Fixed incorrect tag ID's for some obscure Island Graphics EXIF tags +
  • Fixed decoding of some UTF-8 DNG tags which may be stored in BYTE format +
+ +July 27, 2016 - Version 10.24 +
    +
  • Added support for DJI Phantom maker notes +
  • Added a few more XMP-crs tags +
  • Added ability to write DNG OpcodeList tags +
  • Added a new Sony/Minolta LensType (thanks Jos Roost) +
  • Added a few new FujiFilm Saturation values +
  • Added a new FujiFlashMode value and fixed an incorrect Italian translation + (thanks Massimo Sanna, ApolloOne) +
  • Decode more Pentax tags (thanks Louis Granboulan) +
  • Changed -config option to search the current directory first for the config + file (patches problem introduced in ExifTool 10.21 for Windows where the + working directory might not be searched when using the -config option) +
  • Changed print conversion of ProcessingTime to show 3 significant digits +
  • Fixed bug decoding PanasonicRaw DistortionInfo in DNG images +
+ +July 14, 2016 - Version 10.23 +
    +
  • Added read support for Ogg Opus audio files +
  • Added ability to geotag only GPS date/time if no position information is + available by setting Geotag to "DATETIMEONLY" (all caps) +
  • Added "-charset RIFF" option +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Decode a number of new Canon tags (thanks Kai Harrekilde-Petersen) +
  • Changed handling of special characters in RIFF-format files (eg. AVI, WAV) +
  • Changed MIME type of OGG files to audio/ogg (was audio/x-ogg) +
  • Minor change to wording of new Nikon D80 Rotation tag for consistency +
  • API Changes: + +
+ +July 7, 2016 - Version 10.22 +
    +
  • Added read support for BPG images +
  • Minor changes to a few of the new Nikon tags +
  • Fixed problem in Windows version where not all 10.21 updates were included + in the release +
+ +June 29, 2016 - Version 10.21 +
    +
  • WARNING: The Windows EXE package for this release was built on Windows 10 + using Perl 5.24 instead of Windows XP and Perl 5.8 -- please watch for + problems and report anything that you find +
  • Added a new Minolta/Sony LensType (thanks LibRaw) +
  • Added a new element to the XMP Colorant structure +
  • Added a new Pentax lens (thanks Louis Granboulan) +
  • Decode Nikon D5/D500 AF information (thanks Michael Tapes for samples) +
  • Decode a number of new Olympus tags (thanks Daniel Pollock) +
  • Decode a number of new Nikon tags (thanks Warren Hatch) +
  • Decode Pentax K-1 AF points (thanks Louis Granboulan) +
  • Extract a new DPX tag +
  • Patched to avoid writing an empty structure field for an undefined value +
+ +June 13, 2016 - Version 10.20 (production release) +
    +
  • Added a few new Sigma LensTypes (thanks LibRaw and Jos Roost) +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Added two new Canon LensTypes (thanks Jos Roost and Norbert Wasser) +
  • Added a couple of new PentaxModelID's (thanks Louis Granboulan for one) +
  • Added a new Pentax LensType (thanks Louis Granboulan) +
  • Added a few new Olympus PictureMode values (thanks Daniel Pollock) +
  • Added a few more XMP tags +
  • Decode a new Nikon video tag (thanks Hayo Baan) +
  • Patched to allow protected binary data tags to be extracted when -b is + combined with -php or -X if the tag is specifically requested +
  • Fixed bug introduced in version 9.96 where extended XMP is ignored if the + MWG module is used +
  • Fixed problem where the MWG module wasn't loaded automatically if there were + MWG tags in the argument to the -p option +
  • Fixed column alignment of alternate-language output (requires + Unicode::LineBreak to be installed) +
  • Fixed problem writing Sigma:LensFocalRange +
+ +May 31, 2016 - Version 10.19 +
    +
  • Added a few new Sony and Sigma LensType values (thanks Jos Roost) +
  • Decode more Nikon tags (thanks Warren Hatch) +
  • Fixed an incorrect Sigma LensType (thanks LibRaw) +
  • Fixed decoding of D500 custom settings for NEF images (thanks Warren Hatch) +
+ +May 27, 2016 - Version 10.18 +
    +
  • Added a number of new Sigma LensTypes (thanks LibRaw) +
  • Added a few new Sony/Minolta lenses (thanks Jos Roost) +
  • Added ability to write FilePermissions +
  • Decode NikonCustom settings for the D500 (thanks Warren Hatch) +
  • Decode PLUS MediaSummaryCode values +
  • Use hexadecimal for Sigma LensType values +
  • Changed -fileOrder option to sort numbers in strings numerically +
  • Fixed typo in Samsung lens name +
+ +May 16, 2016 - Version 10.17 +
    +
  • Added support for Leica X-U (Typ 113) maker notes +
  • Added a new Pentax LensType (thanks Louis Granboulan) +
  • Added a number of new Sony lenses (thanks Jos Roost) +
  • Added a new Canon LensType (thanks Mees Dekker) +
  • Extract TIFF-format thumbnails and previews +
  • Patched to ignore XML entities inside comments +
  • Fixed inconsistent conversion of PreviewColorSpace values +
  • Fixed writing of TargetPrinter tag +
  • Fixed bug introduced in 10.16 which which could cause a runtime warning when + using the -o option and not writing any "real" tags +
+ +May 3, 2016 - Version 10.16 +
    +
  • Added %D, %F and %E filename format codes +
  • Added a new Minolta lens (thanks Jos Roost) +
  • Decode Photoshop Compression mode +
  • Decode Nikon MultiExposure information for the D5 +
  • Updated decoding of Sony tags for ILCA-68 (thanks Jos Roost) +
  • Fixed bug adding back XMP tags after deleting all XMP from MOV/MP4 files +
  • Fixed problem using -o option when reading from stdin (ie. FILE is "-") +
  • Fixed problem where user-defined Composite tags may not always override + pre-defined Composite tags with the same name, and added feature to allow + the user to specify whether they should override existing tags or not +
+ +Apr. 20, 2016 - Version 10.15 (production release) +
    +
  • Added .a and .o to the list of supported file types +
  • Added a few new Sony/Minolta lenses (thanks Jos Roost and LibRaw) +
  • Decode more Photoshop tags (thanks Taylor Bangs for some) +
  • Decode more information from static library (.a) files +
  • Decode a few more tags from GoPro MP4 videos (thanks Calvin Hass) +
  • Decode ColorData for Canon EOS 1300D (thanks LibRaw) +
  • Updated Sony decoding for newer models (thanks Jos Roost) +
  • Fixed bug where ScaleFactor35efl could be calculated incorrectly for Canon + images from some models which have had their EXIF rebuilt +
+ +Apr. 8, 2016 - Version 10.14 +
    +
  • Added read support for ISO 9660 disk images +
  • Added a few new Nikon ISOExpansion values (thanks LibRaw) +
  • Added a few new Olympus LensType values (thanks Niels Kristian Bech Jensen) +
  • Added a couple of new SonyModelID values (thanks LibRaw for one) +
  • Added a new Olympus CameraType +
  • Added config_files/gps2utm.config to the distribution +
  • Decode Canon ColorData for the EOS 80D (thanks LibRaw) +
  • Decode a few new Samsung tags (thanks François) +
  • Decode a new Fuji tag (thanks Frank Markesteijn) +
  • Calculate Duration for APE audio files +
  • Tightened constraints on M2TS file recognition +
  • Improved verbose dump of ID3 information +
  • Changed XMP-acdsee:Snapshots to a Binary data tag +
  • Fixed bug which prevented writing of various Sony FocalLength tags +
  • API Changes: +
      +
    • Fixed bug where FileModifyDate wasn't set properly when WriteInfo() was + called without a destination file name and other "real" tags were + written at the same time +
    +
+ +Mar. 12, 2016 - Version 10.13 +
    +
  • Added a few new Canon LensType values (thanks Niels Kristian Bech Jensen and + LibRaw) +
  • Added a new CanonModelID +
  • Added a number of new Nikon RetouchHistory modes +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Changed a couple of Sigma "| C" lens names for consistency +
  • API Changes: +
      +
    • Fixed bug which could cause the API Filter option to be ignored for some + tags when copying tags with the Composite option set +
    +
+ +Mar. 4, 2016 - Version 10.12 +
    +
  • Added a new PentaxModelID and SonyModelID (thanks LibRaw) +
  • Added a number of new CanonModelID values (thanks Norbert Wasser for one) +
  • Added a new Olypus LensType (thanks Niels Kristian Bech Jensen) +
  • Added two new Pentax LensType values +
  • Added a few new Nikon LensID values and updated some others +
  • Added a new Canon LensType (thanks Norbert Wasser) +
  • Decode a new Nikon tag +
  • Decode a new CanonCustom tag for the EOS 80D +
  • Improved decoding of SonyRawFileType (thanks Jos Roost and LibRaw) +
  • Changed "Optimised" to "Optimized" in a Photoshop tag value +
  • Fixed warning that could be generated by the Canon FileNumber conversion +
+ +Feb. 17, 2016 - Version 10.11 +
    +
  • Added a couple of new Olympus CameraType values (thanks LibRaw for one) +
  • Added some new ACDSee XMP tags (thanks Malus) +
  • Added a few more XMP-crs tags +
  • Added a new CanonModelID (thanks Norbert Wasser) +
  • Added a couple of new Sony LensType values (thanks Jos Roost and LibRaw) +
  • Added support for PDF ASCII85Decode filter +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Decode a new Canon tag (thanks Juha Iso-Sipilä) +
  • Decode a few more Photoshop tags +
  • Convert MDItem date/time values to local time +
  • Patched to read incorrectly written DJI GPSCoordinates in MOV videos +
+ +Jan. 22, 2016 - Version 10.10 (production release) +
    +
  • Added a new Olympus LensType (thanks Niels Kristian Bech Jensen) +
  • Added a couple of new Olympus FlashModel values +
  • Added a new Nikon LensID +
  • Added a new Pentax LensType +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Decode H264:DateTimeOriginal DST flag, and add " DST" to time string if set +
  • Decode a few more CanonCustom settings +
  • Fixed problem creating user-defined XMP structure elements with names + containing characters which are illegal in tag names +
  • Improved mechanism for generating tags which must be specifically requested + when copying or used in -if or -p expressions +
  • Improved warning in Windows if help documentation file can't be created +
  • Patched Composite:FileNumber to handle case where Canon:FileNumber is 10000 +
  • Patched reading FujiFilm RawImageWidth/Height for new X-Pro2 RAF images +
  • Fixed problem reading PDF objects which begin with a comment line +
  • Fixed problem which could result in ExifTool corrupting a PDF file when + writing +
  • API Changes: +
      +
    • Added RequestTags option +
    • No longer generate MDItem tags when RequestAll option is set +
    +
+ +Jan. 4, 2016 - Version 10.09 +
    +
  • Added ability to extract OS X system metadata ("MDItem" tags) +
  • Added a value conversion for GoogleTrackDuration +
  • Enhanced the -i option to allow full path names to be specified +
  • Fixed a potential runtime error when writing corrupted JPEG images +
  • API Changes: + +
+ +Dec. 22, 2015 - Version 10.08 +
    +
  • Added ability to write empty XMP structures +
  • Added write support for PhaseOne MakerNotes tags in IIQ files +
  • Added a new Nikon LensID (thanks David Püschel) +
  • Decode a new Olympus tag and improved decoding of DriveMode +
  • Minor improvements to HtmlDump of PhaseOne IIQ and PDF files +
  • Patched to allow overwriting of empty XMP written by some PhaseOne cameras +
  • Fixed bug in HtmlDump feature that could cause a "substr outside of string" + error +
  • API Changes: +
      +
    • Changed API QuickTimeUTC option to also enforce proper time zero +
    +
+ +Nov. 26, 2015 - Version 10.07 +
    +
  • Fixed problem with warnings on some systems about unimplemented functions + for FileGroupID and FileUserID when -p or -if were used +
+ +Nov. 26, 2015 - Version 10.06 +
    +
  • Added a new Canon LensType (thanks LibRaw) +
  • Added a new Pentax LensType (thanks Louis Granboulan) +
  • Added a couple of new XMP-digiKam tags +
  • Added a new CanonModelID +
  • Added a new ACDSee XMP tag (thanks Malus) +
  • Decode a new Canon tag +
  • Improved a few lens names (thanks Jos Roost) +
  • Patched to remove trailing null when reading improperly written QuickTime + strings +
  • Fixed bug where SystemTags weren't available for use with the -p and -if + options +
+ +Nov. 6, 2015 - Version 10.05 +
    +
  • Added new Canon and Sony LensType values +
  • Added some new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added a new PentaxModelID +
  • Added preliminary support for Motorola maker notes +
  • Changed format of XMP-photoshop:DocumentAncestors to write a simple Bag of + strings rather than structures (since this is what the Adobe software + writes, contrary to their own XMP specification) +
  • Fixed problem where HASH references may be exposed when copying a list of + structures to a non-list-type tag +
  • API Changes: +
      +
    • Added Filter option +
    • Changed GetNewValues method name to GetNewValue (GetNewValues still + works for backward compatibility) +
    +
+ +Oct. 28, 2015 - Version 10.04 + + +Oct. 21, 2015 - Version 10.03 +
    +
  • Added support for JPEG 2000 extended-length boxes +
  • Added a few new Canon LensType and CanonModelID values +
  • Added a new Nikon LensID (thanks LibRaw) +
  • Added ExifTool version number as a comment in -listx output +
  • Added support for Leica SL (Typ 601) maker notes +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Decode more Sony tags for some new models (thanks Jos Roost) +
  • Decode a new Pentax tag +
  • Patched for invalid makernote entry written by Sony ILCE-7M2 v1.21 +
  • Patched problem reading EXE resources with a missing null terminator +
  • Updated Windows distribution package to use latest version of PAR +
+ +Sept. 17, 2015 - Version 10.02 +
    +
  • Added ability to read PNG chunks after the normal PNG end of file (IEND) +
  • Added ability to delete a PNG trailer (with -trailer:all=) +
  • Added some new Nikon LensID's (thanks Robert Rottmerhusen and LibRaw) +
  • Added a few new Canon LensType's (thanks Jos Roost and LibRaw) +
  • Added a new Pentax LensType (thanks Niels Kristian Bech Jensen) +
  • Decode some new PanasonicRaw tags (thanks Andrew) +
  • Decode a new Pentax tag +
  • Enhanced -m option to allow IPTC values which are too short to be written +
+ +Sept. 3, 2015 - Version 10.01 +
    +
  • Added a new Olympus CameraType +
  • Added a new Canon LensType (thanks Norbert Wasser) +
  • Added a few new QuickTime GenreID values (thanks François Bonzon) +
  • Decode a new Pentax tag +
  • Leica programmers should all be ashamed of the complete shambles of metadata + they have created +
  • Minor change to the name of a Sigma lens for Canon +
  • Improved recognition of Pentax lens adapter +
  • Implemented NoPDFList for -b option of Windows version too +
  • Renamed a few Sony tags and improved decoding of others (thanks Jos Roost) +
  • Renamed a few Pentax tags +
  • Fixed problem importing structured information from -X option output +
  • Fixed round-off errors in value and typo in name of CanonVRD:GammaWhitePoint +
  • Fixed test failures if Encode, POSIX or Time::Local modules are missing +
+ +Aug. 18, 2015 - Version 10.00 (production release) + + +July 23, 2015 - Version 9.99 +
    +
  • Added support for the Leica Q (Typ 116) maker notes +
  • Added two new SonyModelID's (thanks Jos Roost for one) +
  • Added two new Sony LensType2 values (thanks Jos Roost) +
  • Added a new Pentax LensType +
  • Extract a number of new File System tags when API SystemTags option is set +
  • Decode a new FujiFilm tag (thanks TonyB) +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Disabled writing of XMP to PostScript-format Adobe Illustrator files +
  • SourceFile values in -csv and -json input/output are now converted to/from + filename character set (set by -charset filename option) when + reading/writing +
  • Renamed Flash:FileAttributes to FlashAttributes +
  • Renamed FujiFilm:AFPointSet to AFMode and improved decoding +
  • Fixed problem where a partial command could be executed if the -stay_open + option was used and the command is aborted due to an error in arguments +
  • Fixed problem with OS X installer on El Capitan (now installs in + /usr/local/bin instead of /usr/bin) +
  • API Changes: + +
+ +June 26, 2015 - Version 9.98 +
    +
  • Added read support for DSS and DS2 file formats +
  • Added write support for XMP-mwg-rs:Rotation (seen in XMP from LR6) +
  • Added a new Sigma LensType (thanks Niels Kristian Bech Jensen) +
  • Decode Pentax DiffractionCorrection +
  • Decode Olympus ID3 XOLY frame +
  • Decode a few more Sony tags +
  • Improved reliability of decoding Nikon D810 ShotInfo and custom settings +
  • Changed name of Pentax VignettingCorrection to PeripheralIlluminationCorr +
  • Fixed problem with user parameters in tag name expressions when copying +
+ +June 2, 2015 - Version 9.97 +
    +
  • Added a new Pentax Quality value +
  • Added a new Panasonic AdvancedSceneMode (thanks Horst Wandres) +
  • Minor improvement to lens identification logic based on XMP information +
  • Changed a few DR4 tag names +
  • Fixed improper scoping of XMP namespace prefixes (so conflicting prefixes + are now properly resolved) +
+ +May 20, 2015 - Version 9.96 +
    +
  • Added support for CanonVRD version 4 information and DR4 files +
  • Added two new Canon LensType values (thanks Norbert Wasser) +
  • Added two new Olympus LensType values (thanks Niels Kristian Bech Jensen) +
  • Added a new Minolta/Sony LensType and fixed another one (thanks Jos Roost) +
  • Added a new Nikon LensID (thanks John Helour) +
  • Added a few new QuickTime tags +
  • Added a new PentaxModelID and a new Pentax PictureMode +
  • Added a few new XMP-aux tags +
  • Decode a couple more DPX tags +
  • Decode NikonCustom tags for D810 firmware version 1.02 +
  • Improved -htmlDump output for extended XMP and some other JPEG segments +
  • Improved a Canon lens name +
  • Documented the -userParam command-line option (which has existed since 9.90) +
  • Changed default behaviour to ignore extended XMP with an incorrect GUID (as + per the XMP specification) +
  • Changed the case of a few tag names for consistency +
  • Patched problem with Sony cameras giving incorrect LensInfo for some third + party lenses, leading to an incorrect LensID by ExifTool (thanks Jos Roost) +
  • Patched problem where GPS minutes or seconds could round up to 60 +
  • Fixed picasa_faces.config to rotate regions if necessary for RAW file types + (thanks Stargeek) +
  • API Changes: + +
+ +May 9, 2015 - Version 9.95 +
    +
  • Added a few new Minolta/Sony lenses (thanks Jos Roost) +
  • Added config_files/photoshop_paths.config to the full distribution +
  • Avoid rebuilding maker notes when using -tagsFromFile with -fast2 option +
  • Validate tag names when redirecting (ie. "-DSTTAG<SRCTAG") +
+ +May 3, 2015 - Version 9.94 +
    +
  • Added Geotag support for Bramor gEO log files +
  • Added support for iCalendar ICS files +
  • Added support for Leica M Monochrom (Type 246) maker notes +
  • Added new "Preview" group for all embedded preview images +
  • Added a new PentaxModelID (thanks Louis Granboulan) +
  • Added a new Canon LensType (thanks Niels Kristian Bech Jensen) +
  • Added tag name to "Invalid EXIF text encoding" warning +
  • Decode ColorData for Canon EOS 5DS and EOS 5DS R (thanks LibRaw) +
  • Changed ListItem option so that it also applies when copying tags +
  • Enhanced FileTypeExtension to return an uppercase extension when the print + conversion is disabled (eg. the -n option) +
  • Fixed incorrect FileTypeExtension for virtual device drivers +
  • Fixed an improperly formatted warning for duplicate PDF entries +
  • Fixed bug creating extended XMP in JPEG images when deleting all XMP and + adding back in the same step +
+ +Apr. 25, 2015 - Version 9.93 +
    +
  • Added FileTypeExtension tag +
  • Added a few new CanonModelID values +
  • Added a new Olympus CameraType +
  • Added a few new Minolta/Sony lenses (thanks Jos Roost) +
  • Updated arg_files/iptcCore.args for IPTC Extension version 1.2 tags +
  • Improved VCard parsing/decoding +
  • Improved -fast3 file identification logic +
  • Remove "px" string from SVG ImageWidth/Height tags +
  • Changed DOF calculation to use ApproximateFocusDistance +
  • Fixed missing FileType for MOI files +
  • Fixed potential "Internal Error" bug when writing XMP structures +
+ +Apr. 11, 2015 - Version 9.92 +
    +
  • Added support for PRISM pmi and prm tags, and updated to PRISM 3.0 +
  • Added read support for Audible .AA files +
  • Added support for Adobe XMP-creatorAtom tags +
  • Added a couple of new XMP-xmpDM tags +
  • Added a new CanonModelID and a new Ricoh WhiteBalance (thanks LibRaw) +
  • Added a new Olympus CameraType +
  • Added a new Nikon LensID (thanks Jürgen Sahlberg) +
  • Updated to XMP PLUS 1.2.1 specification +
  • Enhanced DOF calculation to use AverageFocusDistance or + FocusDistanceUpper/Lower if available +
  • Patched to tolerate different version numbers in XMP namespace URI's +
+ +Apr. 7, 2015 - Version 9.91 +
    +
  • Added read support for VCard files +
  • Added support for AAX files +
  • Added --sort option +
  • Added a number of new QuickTime GenreID values (thanks François Bonzon) +
  • Added new Canon, Nikon, Olympus and Samsung lenses (thanks LibRaw and Niels + Kristian Bech Jensen) +
  • Added a new Olympus CameraType +
  • Added a new Sony FlashMode value +
  • Decode a new Apple makernote tag +
  • Decode a number of new QuickTime tags found in Audible audio books +
  • Improved the naming of a FujiFilm tag (thanks LibRaw) +
  • Removed "not yet tested" warning when writing FujiFilm RAF version 0200 +
  • Renamed distribution file config_files/ExifTool_config to example.config +
  • Increased maximum metadata atom size for QuickTime files and added warning + if an atom is larger than the limit +
  • Changed writing of filesystem date/time tags to override the -P option +
  • Fixed problem writing FileCreateDate in Windows when the -o option was used +
+ +Mar. 14, 2015 - Version 9.90 (production release) +
    +
  • Added config_files/picasa_faces.config to the distribution (thanks StarGeek) +
  • Added a few new Minolta/Sony and Nikon lenses (thanks LibRaw) +
  • Added new Canon and Sigma lenses (thanks Niels Kristian Bech Jensen) +
  • Decode Nikon D810 custom settings (thanks Warren Hatch) +
  • Decode a few new Nikon tags +
  • Fixed superfluous "Open '' failed" warning which could occur in Windows +
  • Fixed problem reading multi-valued Microsoft Xtra tags +
  • Fixed problem on Windows using -overwrite_original_in_place with Unicode + file names +
+ +Mar. 7, 2015 - Version 9.89 +
    +
  • Added some new Minolta/Sony LensType values (thanks Jos Roost and LibRaw) +
  • Fixed Windows case-sensitivity and sort-order problems when using wildcards + in file names on the command line +
  • API Changes: + +
+ +Feb. 28, 2015 - Version 9.88 +
    +
  • Decode a few more ID3 tags +
  • Improved decoding of some Pentax tags +
  • Extended -list and -listw options to include flattened tags +
  • Patched to recognize ID3v2.3 tags in ID3v2.4 metadata and visa versa +
  • Patched byte ordering problems with Nikon FileInfo tags for the D5500 +
  • Fixed bug where other groups were ignored when multiple groups were + specified when writing and one of those groups was a specific EXIF IFD (eg. + -ExifIFD:Time:all= ignored the Time constraint) +
+ +Feb. 24, 2015 - Version 9.87 +
    +
  • Added a number of new Sigma LensType values (thanks LibRaw) +
  • Fixed bug introduced in the Windows version of 9.85 where "*.*" on the + command line matched "." and "..", causing unexpected files to be processed +
  • Fixed problem extracting some Microsoft tags from MP4/MOV videos +
+ +Feb. 22, 2015 - Version 9.86 +
    +
  • Added check for valid filename encoding when using wildcards in Windows +
  • Added support for Sigma X3F version 4.1 images +
  • Added a number of new Sigma LensType values (thanks LibRaw and Niels + Kristian Bech Jensen) +
  • Added a new Canon LensType (thanks Michael Tapes) +
  • Added a new Leica LensType (thanks LibRaw) +
  • Added a new Olympus CameraType +
  • Decode a couple more FujiFilm RAF tags (thanks Frank Markesteijn) +
  • Always preserve FileCreateDate when writing on Windows if Win32::API and + Win32API::File are available +
  • Changed names of and properly decode new Olympus Pitch/Roll tags +
  • Changed rounding method for rational values in an attempt to fix failed + tests on FreeBSD 10.1 and Perl 5.20.1 with uselongdouble enabled +
  • Resolved issue with duplicate SamsungModelID values +
+ +Feb. 14, 2015 - Version 9.85 +
    +
  • Added support for Ricoh WG-M1 maker notes +
  • Added a few new Pentax LensType's (thanks Louis Granboulan) +
  • Decode a couple of new Pentax tags (thanks Louis Granboulan) +
  • Enhanced JSON import so an object with a missing SourceFile has the same + effect as a SourceFile of "*". +
  • Changed MIMEType for executable script files +
  • Patched remaining known problems involving Windows Unicode file names + (creating directories and using wildcards should now work) +
  • Patched long-standing Windows daylight-savings-time bug, and removed the + dependency on Win32API::File::Time (reported file times should now be + correct, but may disagree with the Windows "dir" command) +
  • Fixed decoding of FLIR:PlanckO (thanks Tomas) +
+ +Feb. 10, 2015 - Version 9.84 +
    +
  • Added a new CanonModelID +
  • Added a new Pentax LensType and PentaxModelID (thanks Louis Granboulan) +
  • Fixed bug introduced in 9.83 that broke the -P option on Windows +
+ +Feb. 7, 2015 - Version 9.83 +
    +
  • Added support for new IPTC Extension version 1.2 XMP tags +
  • Added support for Leica X (Typ 113) maker notes +
  • Added read support for ChartTIFF tags +
  • Added a few new Canon LensType values (thanks Norbert Wasser for two) +
  • Added a few new Nikon LensID's (thanks David Püschel, Robert + Rottmerhusen and Niels) +
  • Added a number of new Olympus ArtFilterEffect values (thanks Phiber) +
  • Added some new Olympus AspectRatio values (thanks Herb) +
  • Added a new PentaxModelID +
  • Added a new Olympus CameraType (thanks LibRaw) +
  • Added new values for various Canon tags +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Decode a couple more Nikon ShootingMode bits (thanks Leegong) +
  • Updated to Nov 2014 XMP specification +
  • Patched incompatibility between Windows Unicode update and Perl 5.005 +
+ +Jan. 15, 2015 - Version 9.82 +
    +
  • Added support for Windows Unicode names for input CSV and JSON files +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Improved checks and warnings for invalid file name encoding on Windows +
  • Improved Polish translations (thanks Kacper Perschke) +
  • Changed exif2xmp.args and xmp2exif.args files (available in the full + ExifTool distribution) to avoid using non-standard XMP namespaces +
  • Fixed problem setting file times for Windows Unicode file names +
+ +Jan. 12, 2015 - Version 9.81 +
    +
  • Added Composite:Megapixels tag +
  • Added a few new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Fixed problem in Windows using Unicode file names with the -o option +
+ +Jan. 7, 2015 - Version 9.80 +
    +
  • Added a few new Canon and Minolta/Sony LensType values (thanks LibRaw) +
  • Added a few new CanonModelID's +
  • Decode a few new Canon tags +
  • Suppress warning for Canon 7DmkIII VignettingCorrUnknown2 data format +
  • Fixed runtime warning when piping an MOI file to exiftool +
  • Fixed bug in -fileOrder option introduced in version 9.79 +
  • Fixed bug using Windows Unicode file names with -tagsFromFile option +
+ +Jan. 4, 2015 - Version 9.79 - Windows Unicode file names +
    +
  • Added support for Windows Unicode file names (but note that support still + isn't complete -- some things like setting FileModifyDate or creating a + directory with a Unicode name still need work) +
  • Added read support for MOI files +
  • Added a few more Canon LensType's (thanks LibRaw and Martin) +
  • Added a new Nikon LensID +
  • Added a couple of new Panasonic ImageQuality values +
  • Decode a new FujiFilm tag and added a new FilmMode value +
  • Allow zero-length group names to be specified (which provides a method to + directly access the 0th copy of a duplicate tag using the empty family 4 + group name by specifying "4:TAG") +
  • Fixed invalid Samsung tag name +
  • Fixed writing of XMP:ExposureCompensation with fractional values +
  • API Changes: + +
+ +Dec. 13, 2014 - Version 9.78 +
    +
  • Added a new Nikon LensID and a new Canon LensType (thanks LibRaw) +
  • Decode a new unknown atom in Canon MOV videos +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Decode a number of new Samsung tags +
  • Improved MakerNote compatibility when writing by adding the same amount of + padding after the MakerNote IFD as that written by the specific camera model +
  • Changed the DNG BaselineExposureOffset to a signed rational (contrary to the + DNG 1.4 specification, which specifies an unsigned RATIONAL, but obviously + Adobe meant for it to store negative values) +
  • Changed name of new QuickTime Rating tag to RatingPercent +
  • Fixed problem introduced in 9.64 where multiple list values from some tags + in ZIP-based files were extracted as separate tags instead of as a list when + the -struct option was used, and implemented a different patch to just + suppress the structure warnings without changing the 9.63 behaviour +
  • Fixed problem where some EXIF information in MOV videos could be corrupted + when writing +
+ +Nov. 28, 2014 - Version 9.77 +
    +
  • Added FilePath tag (generated only if specified and Cwd is available) +
  • Added a new Panasonic ShootingMode (thanks Horst Wandres) +
  • Added a new FujiFilm WhiteBalance value +
  • Added a new QuickTime vendor ID +
  • Added a new Pentax RawDevelopmentProcess value +
  • Decode a few new QuickTime tags +
  • Decode some new tags in Kodak SP360 MP4 videos +
  • Fixed bug that could cause a runtime error when parsing a Canon EOS 40D + image which had been edited by Nikon Capture software +
  • Fixed bug which could produce invalid XML in the -X output when -struct was + also used +
+ +Nov. 15, 2014 - Version 9.76 (production release) +
    +
  • Added support for the LFR format (same as LFP) +
  • Added support for Samsung models which write 2 values for LensType +
  • Added a new Samsung LensType (thanks Nick Livchits) +
  • Added a few new Nikon LensID's (thanks David Püschel) +
  • Added a new PentaxModelID +
  • Added some new Olympus WhiteBalance2 values (thanks LibRaw) +
  • Added a new EXIF:Compression value +
  • Decode a new FujiFilm tag +
  • Decode a few more private TIFF tags +
  • Improved warning message if "DIR" or "FILE" is used literally on the command + line +
  • Improved "-j -b" output to encode any non-UTF8 values as Base64 +
  • Enhanced -fast option (API FastScan option) to allow file processing to be + bypassed entirely +
  • Changed conversions for a couple of Nikon 1 AF tags for consistency +
  • Changed reported FileType for LNK, KEY, KTH, NUMBERS, NMBTEMPLATE and PAGES + files to match extension +
  • Fixed problems adding new XMP and deleting old XMP from MP4 videos +
  • Fixed problem writing FileModifyDate/FileCreateDate when + -overwrite_original_in_place is used +
+ +Nov. 2, 2014 - Version 9.75 +
    +
  • Added support for FLIR version 101 metadata +
  • Added a new Olympus LensType (thanks Niels Kristian Bech Jensen) +
  • Added a new Pentax LensType (thanks Louis Granboulan) +
  • Added a new Samsung LensType +
  • Decode a few more Nikon D4S tags (thanks Warren Hatch) +
  • Decode a few more Sony tags (thanks Jos Roost) +
  • Decode a new FujiFilm tag +
  • Improved formula for calculating Sony:FocusDistance2 (thanks Jos Roost) +
  • Changed XMP parsing to impose standard namespace prefixes, thus avoiding + (some) problems reading the ugly XMP generated by Microsoft products +
  • Fixed decoding of Nikon FileInfo tags for recent DSLR models +
+ +Oct. 15, 2014 - Version 9.74 +
    +
  • Added a number of new QuickTime GenreID values (thanks François Bonzon) +
  • Added support for some newer Sony cameras (thanks Jos Roost) +
  • Decode more Nikon D4S custom settings (thanks Warren Hatch) +
  • Improved lens identification logic for XMP metadata (thanks Jos Roost) +
  • Fixed typo in Condition for a few D3 NikonCustom tags +
  • Fixed bug which could cause a "Use of uninitialized value $val" runtime + error when reading XML +
+ +Oct. 13, 2014 - Version 9.73 +
    +
  • Added a new CanonModelID (thanks LibRaw and Niels Kristian Bech Jensen) +
  • Added a few new Canon and Sony lenses (thanks Jos Roost) +
  • Delete unknown PNG TextualData tags when deleting all PNG tags +
  • Decode AF points for Canon PowerShot G1X Mark II +
  • Decode a number of Pentax, Olympus, Panasonic and Sony tags (thanks LibRaw) +
  • Decode a few more Nikon NCTG tags in MOV videos (thanks Stuart Bennett) +
  • Decode Nikon D4S custom settings (thanks Warren Hatch) +
  • Decode some makernote tags in Sony Xperia Z3 images +
  • Make PhotoshopThumbnail and PhotoshopBGRThumbnail writable (but "unsafe") +
  • Changed order of operations so flattened tags always take precedence over + structured tags when writing a mix of both types of tags +
  • Fixed potential bug decoding some Nikon 1 AF points +
+ +Sept. 26, 2014 - Version 9.72 +
    +
  • Added a few new Pentax ISO values +
  • Added a new CanonModelID and SonyModelID (thanks LibRaw) +
  • Added a new Canon LensType +
  • Decode AF points for some newer Nikon 1 cameras (thanks Chris Reimold for + his help, and Graham Woolf for the samples) +
  • Improved verbose output for recently decoded Samsung trailer +
  • Fixed Samsung trailer writer to properly update offsets in the QDIO block +
+ +Sept. 20, 2014 - Version 9.71 +
    +
  • Added a couple of mew CanonModelID's (thanks LibRaw) +
  • Added a couple of new Nikon LensID's (thanks Robert Rottmerhusen and LibRaw) +
  • Added minor warning when deleting all PDF metadata (because it isn't really + deleted) +
  • Added a new Samsung LensType +
  • Added a new Sony/Minolta LensType (thanks Marcus Holland-Moritz) +
  • Decode "Sound & Shot" trailer written by some Samsung Galaxy models +
  • Decode a number of new Sony tags including FocusDistance2 (thanks Jos Roost) +
  • Decode a number of new Canon and Kodak tags (thanks LibRaw) +
  • Decode a new EXIF tag +
  • Decode a few new CanonCustom tags +
  • Recognize the JPE file extension +
  • Fixed swapped CanonCustom AEMicroadjustment/FEMicroadjustment tag names +
  • Fixed bug in -listItem option which sometimes prevented it from working +
  • Fixed interference by -sep option when writing structured tags +
  • API Changes: + +
+ +Sept. 3, 2014 - Version 9.70 (production release) +
    +
  • Added read support for Pentax 645Z makernotes in MOV videos +
  • Added a new Canon LensType (thanks Norbert Wasser) +
  • Added a new SonyModelID (thanks LibRaw) +
  • Added a new Pentax LensType (thanks Dominique Schrekling) +
  • Added a new PentaxModelID +
  • Added a new Olympus CameraType (thanks LibRaw) +
  • Decode a number of new Sony tags and values (thanks Jos Roost) +
  • Decode a new Panasonic tag +
  • Decode another QuickTime tag +
  • Updated Nikon ISOExpansion values for new models (thanks LibRaw) +
  • Improved verbose dump for LFP images +
  • Patched to repair incorrect list types in XMP structures when writing +
  • Patched to avoid MPEG Layer 3 check for files with a "MUS" extension +
  • Fixed incorrect behaviour of -addTagsFromFile when adding list items from + multiple variable-named source files +
+ +July 27, 2014 - Version 9.69 +
    +
  • Added ability to write PNG PhysicalPixel (PNG-pHYs) tags +
  • Added a few new Panasonic ContrastMode values +
  • Added minor warning when creating EXIF or IPTC in PNG images +
  • Decode a few more Sony tags and values (thanks Jos Roost) +
  • Fixed problem writing Olympus:LensType +
  • API Changes: +
      +
    • Shift.pl now autoloads when ShiftTime() is called +
    • The 3rd argument to ShiftTime() is now optional +
    +
+ +July 19, 2014 - Version 9.68 +
    +
  • Added read support for Lytro LFP files +
  • Added a new Olympus LensType (thanks Niels Kristian Bech Jensen) +
  • Added support for the maker notes of some recent Ricoh/Pentax models +
  • Allow Composite tag to have no Require'd or Desire'd tags +
  • Improved -geotag verbose output +
  • Changed so XMP tags take priority when reading QuickTime-format files +
  • Changed PSD file description to "Photoshop Document" +
  • Fixed problem where -geotag option could fail if -v4 was used +
  • Fixed problem writing SonyDateTime2 +
+ +July 6, 2014 - Version 9.67 +
    +
  • Added support for Sigma X3F version 4.0 files from the DP2 Quattro +
  • Added support for Sony XAVC video files +
  • Added a new Nikon PhaseDetectAF value +
  • Added conversion for Casio EX-ZR300 BestShotMode (thanks Manfred) +
  • Decode more proprietary information from some Panasonic/Leica MP4 videos +
  • Fixed inaccuracies in decoding some SigmaRaw tags from the X3F header +
+ +July 1, 2014 - Version 9.66 +
    +
  • Added read support for Kodak PixPro S-1 maker notes +
  • Added new Canon, Pentax and Sigma LensTypes (thanks LibRaw for the Canon) +
  • Added support for Sigma DP2 Quattro maker notes +
  • Decode AFMicroAdj for Sony A77M2 +
  • Improved decoding of Pentax K-3 AFPointSelected (thanks Dan) +
  • Swap "GPS track start/end" labels in -geotag -v2 output if track is stored + in reverse chronological order +
  • Changed handling of IPTC groups so that standard IPTC always has a family 1 + group name of "IPTC", and takes priority over non-standard IPTC when + duplicates are not allowed +
  • Patched to recognize incorrect XMP URI's written by Nikon NX2 +
  • Fixed problem with possible duplication of lens names when attempting to + identify lens used by a Nikon camera from a Photoshop-mangled image +
  • Fixed problem parsing some NMEA sentences, and added support for GPZDA +
  • Fixed typo in a CanonCustom value +
  • Fixed bug where standard IPTC may be incorrectly written into a proprietary + PhotoMechanic IPTC-format SoftEdit record +
+ +June 20, 2014 - Version 9.65 +
    +
  • Added a new Olympus LensType (thanks Niels Kristian Bech Jensen) +
  • Added a print conversion for Unknown ICC_Profile MeasurementGeometry +
  • Added LargeTags shortcut +
  • Avoid loading data for some tags with large binary data values if they were + specifically excluded by the command +
  • Improved memory handling when processing CanonVRD information +
  • Patched potential "subscript -1" runtime error when reading EPS files +
+ +June 14, 2014 - Version 9.64 +
    +
  • Added write-only TestName tag for dry-run tests of file renaming feature +
  • Added a few new Olympus CameraType values +
  • Added a new new Nikon LensID's +
  • Added a new Canon LensType +
  • Patched to avoid structure warnings when copying tags from ZIP-based files +
  • Patched to deal with incorrect byte ordering in FlashPix date/time values + written by some cameras +
  • Fixed problem using advanced formatting feature in a -if condition +
  • Fixed problem parsing Canon VignettingCorr for some newer PowerShot models +
  • API Changes: +
      +
    • Added 'Test' option to SetFileName() +
    +
+ +May 31, 2014 - Version 9.63 +
    +
  • Added basic read support for EPUB and MOBI electronic books +
  • Added ability to combine -lang option with -listx to extract only one language +
  • Remove leading XML comment from XMP if it exists when writing as a block +
  • Another attempt to patch problem obtaining a consistent "full path" for + source files when importing a CSV database in Windows +
+ +May 24, 2014 - Version 9.62 +
    +
  • Added message about SourceFile names to -v2 output when importing a database + with -csv= or -json= +
  • Added patch to allow extraction of some incorrectly written FlashPix tags +
  • Extract a couple of new FlashPix tags for some FujiFilm models +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Changed -n option for GPSTimeStamp to return nanosecond precision +
+ +May 18, 2014 - Version 9.61 +
    +
  • Added ability to combine -l with -listf, -listr or -listwf to add + descriptions of the file type +
  • Added a few new Canon LensType values (thanks Norbert Wasser and Mark) +
  • Extract AE metering segments again for the Pentax K-3 +
  • Decode a number of new FujiFilm RAF tags (thanks LibRaw) +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Changed the case of some AF point values for consistency +
  • Fixed an incorrect Olympus FocusMode value +
  • Fixed problem introduced in 9.60 where a "LensID argument isn't numeric" + warning could occur under some conditions +
  • Fixed quirk where ExifTool could incorrectly report that a file was changed + when conditionally deleting a non-existent tag as a block +
+ +May 11, 2014 - Version 9.60 (production release) +
    +
  • Added a few new values for some Pentax tags +
  • Added a new QuickTime Rating value (thanks François Bonzon) +
  • Added a new SonyModelID (thanks LibRaw) +
  • Added a new Canon and a new Pentax LensType +
  • Decode a number of new tags from WebP extended-format files +
  • Decode a couple more Nikon tags +
  • Decode a new Canon 300D tag (thanks LibRaw) +
  • Decode a new Sony tag (thanks Jos Roost) +
  • Updated Sony maker note decoding for ILCA-77M2 (thanks Jos Roost) +
  • Renamed QuickTime ©day atom to ContentCreateDate (was previously named + Year or CreateDate depending on its location) +
  • Changed a number of "Unknown (-1)" values to "n/a" (thanks Herbert Kauer) +
  • Minor change to some German translations (thanks Herbert Kauer) +
  • Patched spec file for building RPM under Redhat 6 (thanks Norbert de Rooy) +
  • Fixed a problem writing 3-character Nikon CountryCode values +
  • Fixed problem when importing CSV files in Windows where an appropriate + SourceFile entry may not be found if the file specification does not match + exactly but the absolute path is the same +
+ +May 3, 2014 - Version 9.59 +
    +
  • Added support for Leica T maker notes +
  • Added a few new Olympus CameraType values +
  • Added a number of new AppleStoreCountry values (thanks François Bonzon) +
  • Added a print conversion for QuickTime GenreID (thanks François Bonzon) +
  • Added more values for some NikonCapture tags (thanks LibRaw) +
  • Improved decoding for a number of Sony tags (thanks Jos Roost) +
  • Improved decoding of some Olympus tags (thanks Herbert Kauer) +
  • Improved writing of GPSAltitudeRef to recognize any signed number +
  • Patched problem where some QuickTime UTF-8 values were being decoded + incorrectly +
+ +Apr. 19, 2014 - Version 9.58 +
    +
  • Added verbose warning and HtmlDump flag for out-of-sequence EXIF tag ID's +
  • Improved decoding of NikonCapture WBAdjLighting (thanks LibRaw) +
  • Improved German translations (thanks Herbert Kauer) +
  • Fixed -v3 to report absolute offsets for RIFF and NikonCapture information +
  • Fixed problem in Windows version which caused ExifTool to exit with an error + when importing from a CSV file with a non-existent SourceFile entry +
+ +Apr. 12, 2014 - Version 9.57 +
    +
  • Added a Composite tag to calculate Duration for AIFF files +
  • Added a couple of new Canon lenses +
  • Added a new value for NikonCapture:WBAdjLighting (thanks LibRaw) +
  • Added a new Olympus CameraType (thanks LibRaw) +
  • Decode a couple more Canon tags +
  • Improved French translations (thanks Alphonse Philippe) +
  • Patched to correctly sort out-of-sequence GPS IFD entries +
  • Fixed possible "uninitialized value" runtime error when reading corrupted + CanonCustom2 information +
  • Fixed unnecessary warning when writing an image with zero-length maker notes +
  • Fixed incorrect family 2 group for XMP-exif:GPSImgDirectionRef +
+ +Apr. 5, 2014 - Version 9.56 +
    +
  • Added new Canon and Pentax LensType values +
  • Added a couple more Canon ContinuousDrive modes +
  • Added a new Sigma ColorMode +
  • Decode some new QuickTime tags written by the HTC One (M8) in MP4 videos +
  • Decode telemetry information from AR Drone videos +
  • Extract PreviewImage from GoPro JPG files +
  • Improved German translations (thanks Herbert Kauer) +
  • Improved French translations (thanks Alphonse Philippe) +
  • Updated en_ca and en_gb translations +
  • Patched to avoid "excessive count" warning for a 16-bit TransferFunction +
  • Fixed decoding of Canon AEBShotCount for some models +
+ +Mar. 29, 2014 - Version 9.55 +
    +
  • Added new write-only HardLink tag for creating hard links +
  • Added support for Leica S maker notes +
  • Added support for Nintendo maker notes +
  • Added limited read support for FLIR "AFF" SEQ images +
  • Added a new Pentax LensType (thanks Bruce Rusk) +
  • Added two new NEFCompression values (thanks LibRaw) +
  • Added a few new CanonModelID values +
  • Added a new Sony LensType2 (thanks Jos Roost) +
  • Added some unknown Sony tags possibly related to metering (thanks Jos Roost) +
  • Decode orientation information for Ricoh Theta (thanks Paulo Costa) +
  • Decrypt Nikon ColorBalanceUnknown data for -U and -v2+ options +
  • Updated recognition of Metabones Canon adapters on Sony cameras to support + new adapter firmware versions +
  • Improved verbose messages when reading GPS track logs +
  • Changed writing of EXIF:Copyright to allow newline conversion to be avoided + by disabling print conversion +
  • Fixed an incorrect French translation (thanks Alphonse Philippe) +
  • API Changes: +
      +
    • Fixed problem where Directory tag wasn't written if any "real" tags were + changed when calling WriteInfo() +
    +
+ +Mar. 1, 2014 - Version 9.54 +
    +
  • Added a new Pentax LensType +
  • Decode a few more FLIR tags +
  • Generate missing default language tags for alternate-language QuickTime tags + without them +
  • Improved identification of some file sub-types based on filename extension +
  • Fixed bug extracting alternate-language QuickTime tags with numerical ID's + when processing multiple files in a single command +
  • Fixed potential problem when using some of the recently added options with + the -stay_open feature +
  • Fixed problem loading a config file with a single quote in the file name +
  • Fixed problem writing a shortcut tag when the target tag has a group name +
  • Fixed problem recognizing HTML files with a leading UTF-8 BOM +
+ +Feb. 22, 2014 - Version 9.53 (production release) +
    +
  • Added user-defined file types feature +
  • Added support for a few more XMP-expressionmedia tags +
  • Decode CameraTemperature from a few new Canon models +
  • Decode another Sony tag (thanks Jos Roost) +
  • Recognize the JXR extension +
  • Changed wording of IPTC "Unrecognized data" warning +
  • Patched round-off error problem in seconds of some date/time values +
  • Fixed problem creating EXV files with the -o option +
  • Fixed problem conditionally replacing Extra block-type tags +
+ +Feb. 17, 2014 - Version 9.52 +
    +
  • Fixed bug introduced in 9.44 which resulted in incorrect maker note offsets + when copying maker notes from DNG images of some Pentax models +
+ +Feb. 15, 2014 - Version 9.51 +
    +
  • Added a number of new CanonModelID values +
  • Added a new Sony/Minolta LensType (thanks Jos Roost) +
  • Added a new Panasonic BurstMode +
  • Added a new Pentax LensType +
  • Added new ColorSpaceTags shortcut +
  • Decode a number of new PanasonicRaw tags (thanks LibRaw) +
  • Decode ColorData tags for the new Canon EOS 1200D +
  • Improved Sony maker note decoding for some newer models (thanks Jos Roost) +
  • Fixed conversion of XMP:LensID for Pentax lenses on Ricoh-branded cameras +
+ +Feb. 8, 2014 - Version 9.50 +
    +
  • Added support for Exiv2 EXV metadata files +
  • Added ability to read/write/copy GeoTiff tags as a block +
  • Added ability to combine -b with -j to write base64-encoded binary data in + JSON output format +
  • Added a new Nikon LensID +
  • Added a new Sony/Minolta LensType (thanks Jos Roost) +
  • Added new Extra ProcessingTime tag +
  • Added a new Olympus CameraType +
  • Added header signature to .EXIF files +
  • Decode a new Olympus tag (thanks LibRaw) +
  • Improved conversion of some Canon RecordMode values +
  • Improved decoding of tags for Hasselblad Stellar (thanks Jos Roost) +
  • Fixed -htmlDump offsets for information extracted from some embedded images +
  • Fixed hemisphere problem in Composite GPS tags derived from + QuickTime:LocationInformation +
  • API Changes: +
      +
    • Option names are now case insensitive +
    +
+ +Feb. 1, 2014 - Version 9.49 +
    +
  • Added new Olympus and Samsung LensType values, and fixed an Olympus lens + name (thanks Niels Kristian Bech Jensen) +
  • Added another Polish tag translation (thanks Kacper Perschke) +
  • Added a new Panasonic ColorEffect value +
  • Decode a new FujiFilm tag (thanks LibRaw) +
  • Adjusted scaling factor for H264 ExposureTime values (thanks Francois) +
+ +Jan. 25, 2014 - Version 9.48 +
    +
  • Added a new GeoTiff tag +
  • Added a couple of new Canon LensType values +
  • Added a few new XMP DarwinCore tags +
  • Updated Sony MakerNotes for the ILCE-5000 (thanks Jos Roost) +
  • Improved Polish translations (thanks Kacper Perschke) +
  • Fixed problem writing RicohSubdirIFD in GR images +
  • Fixed runtime error when writing PNG image with a TIFF-format EXIF profile +
+ +Jan. 18, 2014 - Version 9.47 +
    +
  • Added read support for JPEG-HDR APP11 information +
  • Added read support for Media Jukebox APP9 information +
  • Added a new Olympus LensType (thanks Niels Kristian Bech Jensen) +
  • Added a few new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added a new Minolta/Sony LensType and fixed some Tamron lens names (thanks + Jos Roost) +
  • Decode more FLIR tags (thanks Tomas) +
  • Patched for quirk in Kodak PixPro AZ362 maker notes +
+ +Jan. 11, 2014 - Version 9.46 (production release) +
    +
  • Added a few Nikon lenses (thanks Niels for two) +
  • Added a few new XMP-xmpDM tags (thanks Mats Peterson) +
  • Added a new Pentax DriveMode (thanks Doug O'Brien) +
  • Added a new Olympus lens (thanks Niels Kristian Bech Jensen) +
  • Decode a number of new QuickTime tags +
  • Decode a few new Canon filter tags +
  • Improved -d option to properly handle time zones with %s and %z +
  • Improved conversions for Panasonic Composite AdvancedSceneMode +
  • Changed a few Tamron lens strings (thanks Niels Kristian Bech Jensen) +
  • Patched to avoid round-off errors in seconds of filesystem time tags +
  • Fixed extraction of CompressorID for some MOV videos +
+ +Dec. 21, 2013 - Version 9.45 +
    +
  • Added details about movie data offset in MOV verbose dump +
  • Added a new Pentax WhiteBalance value +
  • Added a new Sony/Minolta LensType (thanks Jos Roost) +
  • Decode a new QuickTime tag +
  • Prevent illegal tag names to be generated from user-defined XMP tags +
  • Patched to allow reading some improperly formatted EXIF UserComment values +
  • Fixed problem where reading some large M2TS files could take a loooong time +
+ +Dec. 11, 2013 - Version 9.44 +
    +
  • Added a new Pentax WhiteBalance value +
  • Added back the K-3 SRResult tag, but make it Unknown and with no print + conversion +
  • Fixed problem copying the maker notes of some recent Pentax models +
+ +Dec. 8, 2013 - Version 9.43 +
    +
  • Added a new Olympus CameraType +
  • Added new Canon and Pentax LensType values +
  • Added a new Panasonic ShootingMode +
  • Added a new CanonModelID +
  • Decode a number of new Sony Tags (thanks Jos Roost) +
  • Decode a new Pentax tag +
  • Fixed decoding of a few Pentax tags for newer models +
  • Fixed decoding of CameraTemperature for Olympus Stylus 1 +
  • Fixed bug when writing QuickTime date/time tags with QuickTimeUTC option set +
+ +Dec. 1, 2013 - Version 9.42 +
    +
  • Added a new Canon LensType (thanks Norbert Wasser) +
  • Added a new Pentax LensType (thanks Louis Granboulan) +
  • Added a new Sony LensType (thanks Fredrik Agert) +
  • Added a new Nikon LensID (thanks LibRaw) +
  • Added a new Olympus CameraType +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Decode a number of new Panasonic tags (thanks Thomas Modes) +
  • Decode a few new Pentax tags (thanks Klaus Homeister and others) +
  • Improved Olympus SensorTemperature calibration (thanks Eric Sibert) +
  • Patched decoding of EXIF:UserComment to tolerate invalid character code + written by Canon Zoombrowser EX 4.5 +
  • Patched to allow GPS information to be extracted from incorrectly formatted + EXIF written by Windows Phone OS 7.5 (observed in some HTC and Nokia phones) +
  • Fixed runtime warnings which could occur when -j or -php combined with -f +
+ +Nov. 16, 2013 - Version 9.41 +
    +
  • Added the ability to use multiple group qualifiers on tag names when writing + and copying (eg. "-QuickTime:Time:All=now") +
  • Added ability to geotag from Google Location Services KML files +
  • Added a new Pentax LensType (thanks Louis Granboulan) +
  • Added a new Canon LensType (thanks David Monro) +
  • Added a new Sony LensType2 (thanks Jos Roost) +
  • Decode a bunch more Nikon, Canon, Sony and FujiFilm WhiteBalance tags + (thanks LibRaw) +
  • Extract information from the new Pentax APP7 segment +
+ +Nov. 8, 2013 - Version 9.40 - "Write QuickTime" +
    +
  • Added ability to write XMP and edit date/time tags in QuickTime-format files + (eg. MOV, MP4) +
  • Added -api option to allow API options to be set via the command line +
  • Added ability to specify family 2 group name when writing +
  • Added write support for a number of new XMP tags +
  • Added a new Nikon LensID +
  • Added new Canon and Minolta/Sony LensType values (thanks Jos Roost) +
  • Added a few of the new values defined in the DICOM 2011 specification +
  • Add standard XMP to a PNG image when writing, even if XMP already exists in + another non-standard chunk +
  • Decode a few more Sony tags (thanks Jos Roost) +
  • Decode a few more QuickTime tags +
  • Decode a few more Panasonic tags (thanks Thomas Modes) +
  • Extract EXIF information from WEBP images +
  • Extract a few more unknown tags in Samsung MP4 videos +
  • Extract ProfileName from the PNG iCCP chunk +
  • Improved error message if no matches found when writing to tag(s) specified + by wildcards +
  • Improved XML output so EXIF tags now report a count (if constant, and > 1) +
  • Avoid writing a few XMP-crs tags which have XMP-exifEX equivalents unless + specified explicitly +
  • Patched POD documentation in MIE.pm to remove non-ASCII characters +
  • Fixed bug adding back XMP tags in PDF files after deleting all in the same + command (also made XMP the preferred group when writing PDF files) +
  • Fixed bug extracting some font information from QuickTime videos +
  • Fixed inconsistencies in behaviour when extracting XML as a block from + JPEG2000 images +
  • Fixed problem where FileName was changed when using -srcfile option and + writing only the Directory +
  • API Changes: +
      +
    • Added the PNGEarlyXMP option +
    +
  • Internal Changes: +
      +
    • Changed all "$exifTool" variable names to "$et" throughout -- my + apologies to the diff engines +
    +
+ +Oct. 19, 2013 - Version 9.39 +
    +
  • Added a new PentaxCameraID and some new LensTypes (thanks Louis Granboulan) +
  • Added a new Nikon LensID +
  • Added a new Panasonic ShutterType +
  • Additions and improvements to Pentax makernote decoding for K-3 +
  • Decode a number of new tags including purchase information from MP4 videos +
  • Decode FLIR information acquired by Extech MeterLink meters (thanks Tomas) +
  • Decode more Sony tags (thanks Jos Roost) +
  • Patched to suppress the run-time "No such file or directory" error that has + been seen when using the -csv option on Windows systems +
+ +Oct. 7, 2013 - Version 9.38 +
    +
  • Added read support for DPX images +
  • Added a new Pentax LensType +
  • Added a few new CanonModelID values +
  • Added a new XMP-apple-fi tag +
  • Decode a few more Canon tags (thanks Tomasz Kawecki) +
  • Decode a few more Sony tags (thanks Jos Roost) +
  • Improved the names of a few Apple tags (thanks Neal Krawetz) and added new + Composite tag +
  • Tolerate NMEA sentences with missing degrees written by some crappy software +
  • Changed Duration conversion to print number of days if more than 24 hours +
+ +Sept. 14, 2013 - Version 9.37 +
    +
  • Added support for maker notes from Apple iPhone5 iOS 7 +
  • Added two more Torrent tags +
  • Added a new Pentax DigitalFilter +
  • Added new Olympus CameraType and LensType values +
  • Decode a couple more Olympus tags +
  • More improvements to Sony decoding (thanks Jos Roost) +
  • Improved decoding of Scalado JPEG APP4 information +
  • Fixed problem where a PreviewImage could be reported in either the File or + Composite group, depending on the details of the command +
+ +Sept. 7, 2013 - Version 9.36 +
    +
  • Added read support for BitTorrent description files (bencode format) +
  • Added a couple of new Nikon LensID's (thanks Jürgen Sahlberg) +
  • Added support for PNG 8bim raw profile +
  • Added or fixed a few Pentax LensType values (thanks Louis Granboulan) +
  • Added ability to delete DNGAdobeData and DNGPrivateData +
  • Decode more Sony tags and improved decoding of others (thanks Jos Roost) +
  • Decode a number of new FujiFilm tags and fixed 2 incorrect Saturation values +
  • Decode a number of Canon CameraInfo tags for the 70D (thanks Tomasz Kawecki) +
  • Patched to issue minor warning and extract only the first 1000 values from + XMP list-type tags containing more than 1000 items (all values may be + extracted by ignoring this warning with the -m option) +
  • Patched decoding of PNG IPTC raw profile to allow either IIM or IRB data +
  • Flagged ImageSourceData as "unsafe" (avoids excessive memory usage when + copying all tags because this data may be larger than the image itself for + Photoshop TIFF images) +
  • Disabled feature introduced in version 9.14 which allowed multiple tags + (specified by wildcards) to be copied into a single list. This feature had + the unintended side-effect of generating duplicate list items when copying + list-type tags if there were multiple source tags with the same name. If + necessary, -addTagsFromFile may still be used to copy the values of multiple + tags into a single list. +
+ +Aug. 17, 2013 - Version 9.35 +
    +
  • Added a new Canon LensType (thanks Oliver) +
  • Added two new Olympus CameraType values +
  • Added some new Pentax LensType values (thanks Louis Granboulan) +
  • Added a new RIFF StreamType value +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Decode CameraTemperature from more Canon models +
  • Extract thumbnail information from Leica X VARIO MP4 videos +
  • Improved decoding of Pentax LensData (thanks Louis Granboulan) +
  • Patched to avoid a warning for the messed-up Leica M maker notes +
  • Changed a few Pentax Samsung/Schneider lens names for consistency +
  • Changed "Can't delete" message to indicate if the tag is Permanent +
  • Fixed the case of a few tag names (thanks Romain) +
+ +July 27, 2013 - Version 9.34 +
    +
  • Added support for Ricoh GR maker notes (in MOV videos too) +
  • Added a new Olympus LensType (thanks Niels Kristian Bech Jensen) +
  • Added a new Canon LensType (thanks Norbert Wasser) +
  • Added support for Sony DSC-TF1 maker notes (thanks Jos Roost) +
  • Added patch for messed up Leica M (Typ 240) MakerNote trailer +
  • Added a few new CanonModelID's and a few new PentaxModelID's +
  • Added some new XMP-crs tags written by LR5 +
  • Added a few new Nikon LensID's +
  • Decode a number of new Ricoh GR tags (thanks Tim Gray) +
  • Recognize the Nikon SB-700 external flash +
  • Updated MWG location tags to conform with the MWG 2.0 specification (but + continue writing legacy IPTC Core location tags) +
  • Removed "[Minor]" designation from "excessive count" warning if count is + greater than 2M +
  • Avoid processing multiple EXIF IFD's if only one should exist +
+ +July 13, 2013 - Version 9.33 +
    +
  • Added support for EXIF UTF-16 Unicode text (previously treated as UCS-2) +
  • Added support for Leica X Vario maker notes +
  • Added a couple of new SonyModelID values (thanks Jos Roost) +
  • Added a new CanonModelID and a new Olympus CameraType +
  • Added a new Canon LensType +
  • Added a new Olympus LensType (thanks Niels Kristian Bech Jensen) +
  • Decode some new Panasonic tags and added values for others (thanks Thomas) +
  • Improved decoding of Olympus RawDevArtFilter +
  • Improved decoding of some Sony tags for the RX100M2 +
  • Changed application to always return an error status when exiting if an + error was encountered when extracting information +
+ +June 22, 2013 - Version 9.32 +
    +
  • Added support for "Exif 2.3 for XMP" tags +
  • Added a few new Olympus LensTypes (thanks Niels Kristian Bech Jensen) +
  • Added a few new PentaxModelID's +
  • Added two new Samsung LensType values (thanks Pascal de Bruijn) +
  • Decode a new Olympus tag +
  • Fixed problem extracting audio comments from Ricoh G700SE images +
  • Fixed a non-conforming CanonModelID string +
+ +June 8, 2013 - Version 9.31 +
    +
  • Added a number of new Photoshop tags (but marked as Unknown) +
  • Added a few new values for some Olympus tags +
  • Added conversion for Olympus SensorTemperature +
  • Added two new CanonModelID's +
  • Added support for Reconyx firmware 4.0.0 +
  • Decode a number of new QuickTime and FLIR tags in MP4 videos +
  • Decode more Sony tags (thanks Jos Roost) +
  • Decode a new Olympus tag +
  • The API List option may now be used in the config file for the same effect + as -sep when combined with the -X, -j or -php option on the command line +
  • Fixed problem where some QuickTime string values could have terminating NULL + characters, which caused problems when renaming files using these tags +
+ +May 25, 2013 - Version 9.30 +
    +
  • Added a new Canon LensType +
  • Decode many Canon 700D CameraInfo tags +
  • Also delete null characters with the default advanced formatting filter +
  • Tolerate leading whitespace in HTML files +
  • Fixed decoding of Canon 650D CameraInfo FocalLength +
  • Fixed bug in new advanced formatting feature which gave incorrect + output when used in the -p option for processing multiple files +
+ +May 18, 2013 - Version 9.29 +
    +
  • Added another H264 Model value (thanks Rob Lewis) +
  • Added support for Canon 5DmkIII firmware version 1.2.1 +
  • Added recognition of IBM AVC video files +
  • Added a new CanonModelID +
  • Decode more FLIR tags (thanks Tomas) +
  • Decode H264 MDPM TimeCode +
  • More improvements to Sony LensType decoding (thanks Jos Roost) +
  • Extract information from the ASF Metadata Library in WMV files +
  • Extract ColorBalanceVersion for unknown Nikon ColorBalance information +
  • Updated some ID3 Genre names (thanks Mats Peterson) +
  • Fixed warning when using -p with a string containing a newline +
  • Fixed some incorrect Pentax Q LensType values +
+ +Apr. 21, 2013 - Version 9.28 +
    +
  • Added the ability to delete unknown JPEG APP segments by segment name +
  • Added a bunch of new ID3 Genre values (thanks Mats Peterson) +
  • Decode a few more Sony tags (thanks Jos Roost) +
  • Decode a few more tricky FLIR tags (thanks Tomas) +
  • Improved Dutch language translation (thanks Peter van der Laan) +
  • Patched to avoid warning in images where the AFMicroAdj data has been + truncated by Canon DPP +
  • Fixed -tagsFromFile and -v so they may now be used when writing via pipes +
  • Fixed writing of Panasonic LensType tags that were broken in the 9.15 update +
  • Fixed incorrect case for list type of XMP DocumentAncestors and TextLayers +
  • API Changes: +
      +
    • Allow a File::RandomAccess reference as an input to WriteInfo() +
    +
  • +
+ +Apr. 15, 2013 - Version 9.27 (production release) +
    +
  • Fixed "ARRAY ref" runtime error introduced in 9.25 that could occur when + using the -X option +
  • Fixed runtime warning which could occur when conditionally deleting XMP + structure +
+ +Apr. 13, 2013 - Version 9.26 +
    +
  • Added read support for FLIR FFF and FPF images and decode more FLIR tags +
  • Added some new Pentax LensType's and Nikon LensID's +
  • Added a few new Panasonic ContrastMode values +
  • Decode a number of Canon 6D tags +
  • Allow CanonRaw tags to be written using "CIFF" as a group name +
  • Improved decoding of Canon ColorData information for newer EOS models +
  • Improved decoding of a number of Sony tags (thanks Jos Roost) +
  • Removed index number from duplicate Composite TagID's in XML output +
  • Fixed byte-order problem for a few Nikon D5200 and D7100 tags +
  • Fixed incompatibility with old-style (pre-8.46) XMP user-defined structure + definitions +
+ +Apr. 6, 2013 - Version 9.25 (production release) +
    +
  • Added read support for FLIR thermal image metadata in JPEG images +
  • Added write support for DNG version 1.4 images +
  • Added a new Pentax DriveMode value and a new Pentax LensType +
  • Added two new Olympus CameraType values +
  • Added print conversion for XMP Flash tags to provide alternate language + support +
  • Decode a few more Nikon and Pentax tags +
  • Decode more Sony tags (thanks Jos Roost) +
  • Decode more Panasonic tags and changed decoding of others +
  • Enhanced -j and -php options to work with -D, -H and -l +
  • Improved German translations (thanks Herbert Kauer) +
  • Patched decoding of QuickTime date/time tags to accommodate Samsung and Sony + cameras that use an incorrect time zero of 1970 instead of 1904. This patch + will only work for videos produced before 2036, so hopefully Samsung and + Sony will fix this problem at their end before then (care to place a wager?) +
  • Fixed issues when using "-wm cg" and writing metadata as a block +
  • Fixed possible "division by zero" error when reading undefined XMP rational +
+ +Mar. 23, 2013 - Version 9.24 +
    +
  • Added ability to overwrite plus append output files (-w+!) +
  • Added support for Sigma X3F version 3.0 images +
  • Added a few new values for some Pentax tags +
  • Added a few new CanonModelID's +
  • Decode Nikon D5100 and D5200 custom settings plus a few other Nikon tags +
  • Allow the value for missing tags extracted with the -f option to be + configured via the API MissingTagValue setting (default is still "-") +
  • Improved decoding of Sony LensSpec (again, thanks Jos Roost) +
  • Fixed bug reading QuickTime extended-size atoms +
+ +Mar. 10, 2013 - Version 9.23 +
    +
  • Added -W (-tagOut) and -Wext (-tagOutExt) options to allow multiple tags + to be extracted to separate output files from a single source file +
  • Added append feature to -w (-w+) +
  • Added ability to extract SoundFile from Ricoh RMETA +
  • Added more SonyModelID and Sony LensType values and improved Sony LensType + decoding (thanks Jos Roost) +
  • Added a new Olympus LensType (thanks Niels Kristian Bech Jensen) +
  • Added another Pentax LensType +
  • Decode more Nikon flash information (thanks Alyda Gilmore for the samples) +
  • Decode Pentax Kelvin white balance tags (thanks Klaus Homeister) +
  • Extract PDF embedded image color space +
  • Improved Spanish translations (thanks Emilio Sancha) +
  • More patches to avoid "APP1 segment too large" errors when copying all tags + from some RAW images +
+ +Mar. 2, 2013 - Version 9.22 +
    +
  • Fixed problem extracting metadata from encrypted embedded JPEG images in PDF + files and added the ability to extract JPEG 2000 information too +
+ +Mar. 2, 2013 - Version 9.21 +
    +
  • Added ability to extract embedded images and their metadata from PDF files +
  • Added read support for binary-format PLIST files +
  • Added support for Sigma DP3 Merrill maker notes +
  • Added a few new Sigma LensType values +
  • Added a new FujiFilm PictureMode value +
  • Decode a number of new Pentax tags (thanks Klaus Homeister) +
  • Decode more Sony tags (thanks Jos Roost) +
  • Decode some new Nikon D800 tags (thanks Alyda Gilmore for the samples) +
  • Decode a number of new tags in 3GP videos +
  • Decode Pentax CameraType +
  • Made a few more DNG tags writable (but protected) +
  • Fixed problem reading XREF table of some PDF files +
  • API Changes: +
      +
    • The CombineInfo() routine is now deprecated because it is likely that + nobody ever used it. If anyone actually uses this, please let me know +
    +
  • +
+ +Feb. 20, 2013 - Version 9.20 +
    +
  • NOTICE: This release fixes a problem in the 9.19 Windows version that could + cause ExifTool to crash when writing metadata to some files (it seems that + one of the files in the 9.19 Windows package was corrupted) +
  • Added a new PentaxModelID +
  • Added write support for a few Getty Images XMP tags +
  • Decode Sony AFAreaModeSetting (thanks Jos Roost) +
+ +Feb. 20, 2013 - Version 9.19 +
    +
  • Added read support for Phase One IIQ maker notes +
  • Added a couple of new Minolta Teleconverter values +
  • Patched problem which could result in runtime warning when extracting + information from a file with an incorrectly formatted PreviewImage pointer +
  • Improved handling of unknown maker notes when writing to reduce the chance + of corruption (fixes problem of corrupted SilverFast maker notes) +
  • Fixed bug in HtmlDump where unused bytes at end of MakerNotes were not shown + if they came at the end of a TIFF-format file +
+ +Feb. 16, 2013 - Version 9.18 +
    +
  • Decode more AF information for Sony SLT models (thanks Andy Johnson for the + samples) +
  • Recognize CameraInfo and ColorData information from newer Canon 1DX firmware +
  • Organized support files in full Perl distribution into separate directories +
  • Improved German and Spanish translations (thanks Herbert Kauer and Emilio + Sancha) +
  • Fixed inconsistency where a priority tag could be hidden by a same-named tag + in the same group when using the -j or -X option combined with -g or -G +
  • Fixed problem in standard tests that could cause ExifTool test 25 to fail +
+ +Feb. 9, 2013 - Version 9.17 +
    +
  • Added PLIST and MODD to the list of supported file extensions +
  • Added track name to UserData tags within QuickTime tracks +
  • Added a new Pentax LensType (thanks Pietu Pohjalainen) +
  • Added a new Canon LensType +
  • Decode binary data in PLIST and MODD files +
  • Decode new Canon 1DX CustomFunctions +
  • Issue a minor warning and ignore duplicate PDF Info dictionaries unless the + -m option is used +
  • Improved date/time parsing when writing to allow single-digit fields +
  • Improved decoding/naming of a few Sony tags (thanks Jos Roost) +
  • Improved German translations (thanks Herbert Kauer) +
  • Changed a few PLIST tag names +
  • Fixed decoding of Olympus CameraType for some models +
  • Fixed problem calculating AvgBitrate for some video files +
  • Fixed problem writing Canon:LensSerialNumber +
+ +Feb. 2, 2013 - Version 9.16 +
    +
  • Added support for DarwinCore XMP tags +
  • Added support for CinemaDNG tags +
  • Added basic support for parsing XML PLIST information, and use this to + extract tags from QuickTime iTunesInfo Data +
  • Added a new Pentax lens (thanks Niels Kristian Bech Jensen) +
  • Added some new Sony E-mount lenses (thanks Jos Roost) +
  • Added a new NEFBitDepth value (thanks Jos Roost) +
  • Added a new CanonModelID +
  • Decode a few more Sony tags (thanks Jos Roost) +
  • Improved decoding of QuickTime iTunesInfo tags +
  • Improved Spanish translations (thanks Emilio Sancha) +
  • Improved handling of errors in Perl expression of new formatting feature +
  • Improved -p option to also handle structures +
  • Changed a number of Sigma lens names for Olympus to conform with official + Sigma model names (thanks Niels Kristian Bech Jensen) +
  • Moved the MWG XMP tags documentation to the MWG page +
  • Patched to allow reading GPX track logs with no version number +
  • Fixed problem reading an ID3 POPM frame with a missing counter +
  • Fixed bug which could cause "uninitialized value" runtime warning when + reading Nikon maker notes with an empty RetouchHistory +
  • API Changes: +
      +
    • Compatibility Notice: The MWG Composite tags are no longer automatically + loaded just by using the MWG module. Image::ExifTool::MWG::Load() must + now be called explicitly to load these tags +
    +
+ +Jan. 27, 2013 - Version 9.15 +
    +
  • Added advanced formatting feature to -p and -tagsFromFile options +
  • Added -echo3 and -echo4 options +
  • Added a few more Olympus LensType values, removed one, changed some lens + names for consistency (all thanks Niels Kristian Bech Jensen), and use + hexadecimal instead of decimal for numerical LensType values +
  • Added a number of new Sony E-mount lenses +
  • Added a new Tamron lens for Sony (thanks Marcin Krol) +
  • Trim trailing spaces from Panasonic LensType strings +
  • Fixed bug which could cause "Can't call method GetMarkerPointers" runtime + warning when writing certain types of corrupted images +
  • Fixed problem copying PrevewImage from some corrupted files +
  • Fixed problem identifying a Sigma lens for Nikon at some focal lengths +
  • API Changes: +
      +
    • Added AddUserDefinedTags() method +
    • Added formatting feature for tag values in SetNewValuesFromFile() +
    +
+ +Jan. 18, 2013 - Version 9.14 +
    +
  • Added -wm (-writeMode) option to provide control over tag write/create mode +
  • Added ability to use wildcards in target tag names when writing +
  • Added ability to read/write Jpeg2000 XML tag as a block +
  • Added ability to delete MPF segment (with -MPF:All=) +
  • Added a number of new Olympus lenses (thanks Niels Kristian Bech Jensen) +
  • Added a new Nikon LensID (thanks Robert Rottmerhusen) +
  • Added a number of new Pentax LensType's (thanks Alan Robinson for one) +
  • Added a few new CanonModelID's and Canon LensType's +
  • Decode ID3v2 POPM and OWNE frames +
  • Decode new Canon 6D CustomFunctions +
  • Improved calculation of ScaleFactor35efl for Canon cameras +
  • Changed priority of PDF Info tags so tags from most recent Info dictionary + take precedence (to partially accommodate the questionable Acrobat Pro + incremental update technique) +
  • Changed some verbose warnings when attempting to write "unsafe" tags +
  • Changed behaviour so that "unsafe" tags are not copied for any tag specified + using a wildcard (previously this was the behaviour for a tag name of 'all' + or '*', but not names like 'gps*') +
  • Fixed bug where a Composite tag could sometimes not be generated when the + -struct option was used if the tag was derived from an XMP List-type tag +
  • Fixed problem conditionally deleting GIF Comment and MIE tags +
  • Fixed decoding of RawImageWidth/Height from FujiFilm X-E1 RAF images +
  • API Changes: + +
+ +Jan. 10, 2013 - Version 9.13 (production release) +
    +
  • Added basic validation of ExifVersion and FlashpixVersion tags when writing +
  • Fixed problem where MPF PreviewImage was lost when editing metadata in JPEG + images from the Nikon D4, D600 or D800 +
+ +Jan. 2, 2013 - Version 9.12 (production release) +
    +
  • Fixed problem introduced in 9.10 preserving file modification date/time when + some options are used +
+ +Jan. 2, 2013 - Version 9.11 (production release) +
    +
  • Improved decoding of some Sony tags +
  • Changed 3 tag names to avoid a leading digit to fix XML validation problem +
  • Fixed bug introduced in 9.04 that could double-encipher some Sony MakerNote + information when writing (affected files are fixed by writing any tag with + ExifTool 9.11) +
+ +Dec. 29, 2012 - Version 9.10 +
    +
  • Added write support for a few new XMP-crs and XMP-photomech tags +
  • Added a new Samsung LensType (thanks Jaroslav Stepanek) +
  • Added a new Pentax LensType (thanks Helmut Schütz) +
  • Added a new Canon LensType +
  • Decode Sony A99 FocusMode (thanks Michael Tapes for the samples) +
  • Tolerate (but warn about) up to 4 bytes of garbage at start of EXIF segment +
  • Changed -P option to also preserve FileCreateDate on Windows (requires + Win32API::File::Time) +
  • Changed "[minor]" warning messages to capitalize the "M" (ie. "[Minor]") if + processing is affected when the warning is ignored +
  • Patched to avoid problem of slow processing with some corrupted EXIF +
+ +Dec. 15, 2012 - Version 9.09 +
    +
  • Added a few new Google XMP GPano tags +
  • Added a new Olympus CameraType +
  • Added a couple of new Minolta LensTypes +
  • Added two new Nikon LensID's (thanks David Püschel and Robert + Rottmerhusen) +
  • Decode Nikon D7000 AFPointsUsed and make this tag writable +
  • Decode a new Olympus tag (thanks Christoph Anton Mitterer) +
  • Renamed one of the FujiFilm RAF RawImageWidth/Height pairs to + RawImageFullWidth/Height +
  • Changed -stay_open when combined with -q to flush output after each command + (as already done without -q) (requires IO::Handle) +
  • Fixed problem shifting FileCreateDate when writing other "real" tags in the + same command +
+ +Nov. 26, 2012 - Version 9.08 +
    +
  • Fixed bug introduced in 9.07 that broke writing of FileModifyDate +
+ +Nov. 24, 2012 - Version 9.07 +
    +
  • Added ability to read/write FileCreateDate (Windows only) +
  • Added ability to read FileInodeChangeDate (non-Windows only) +
  • Added support for new tags in DNG 1.4 specification +
  • Added support for Google Photosphere GPano XMP tags +
  • Added a couple of new Olympus filter effects +
  • Changed a Panasonic LensType (thanks Olaf Ulrich) +
  • API Changes: +
      +
    • Enhanced SetFileModifyDate() to write FileCreateDate (Windows only) +
    +
+ +Nov. 17, 2012 - Version 9.06 +
    +
  • Added support for Nikon maker notes in images from any camera make (as + written by Capture NX2) +
  • Added support for FujiFilm X-E1 RAF images +
  • Added a new Olympus CameraType +
  • Added a new PentaxModelID and a new Pentax LensType +
  • Extract FileCreateDate (Windows) and FileInodeChangeDate (other systems) +
  • Fixed bug decoding UTF-16 ID3 synchronized lyrics +
+ +Nov. 10, 2012 - Version 9.05 +
    +
  • Added ability to read APE metadata from MP3 audio files +
  • Decode ID3 synchronized lyrics/text information +
  • Decode maker notes in Leica V-LUX40 MP4 videos +
  • Decode Sony A99 AFPointSelected (thanks Michael Tapes for the samples) +
  • Improved decoding of some Sony tags (thanks Jos Roost) +
  • API Changes: +
      +
    • Removed GeoNoInterpolate option (just set GeoMaxIntSecs to 0 instead) +
    +
+ +Nov. 3, 2012 - Version 9.04 (production release) +
    +
  • Added two new Sony LensType values (thanks Matthias Paul) +
  • Added a few new Canon LensType values +
  • Added a couple of new PentaxModelID's and decode some new K-5 II values +
  • Added support for some new XMP tags written by the Apple iPhone 5 +
  • Added a new Olympus CameraType +
  • Decode more Sony tags/values (thanks Jos Roost) +
  • Decode Nikon HDRInfo (thanks Stefan) +
  • Decode some FlashInfo tags for new Nikon models +
  • Decode a few WM ID3 tags (some documentation on these would be nice) +
  • Fixed bug which could cause truncated/garbage ID3v2 strings to be returned +
  • Fixed -globalTimeShift option to also work when copying tags +
  • Fixed decoding of Nikon AFFineTuneAdj for FirmwareVersion 1.10B (thanks + Michael Tapes for the samples for this and the A77) +
  • Fixed problem where a few tags (FileSequence, NewGUID and Now) were not + available for use with the -p option +
  • API Changes: +
      +
    • Added RequestAll and GeoNoInterpolate options +
    • Fixed problem in SetNewValue when setting the Raw value of some tags +
    +
+ +Oct. 13, 2012 - Version 9.03 +
    +
  • Added new feature to provide control over directory levels in %d strings +
  • Added ability to write OtherImage in NEF images +
  • Added a new Pentax LensType +
  • Added a few new CanonModelID's (thanks Laurent Clévy) +
  • Added a new Nikon LensID (thanks Geert De Soete) +
  • Added a few new Olympus CameraType values +
  • Decode some new CameraInfo tags for the Canon EOS 650D +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Improved decoding of some Sigma tags for the DP1/DP2 Merrill +
  • Give priority to EXIF tags over SigmaRaw tags X3F images +
  • Changed Samsung lens names to include "NX" (thanks Jaroslav Stepanek) +
  • Fixed misleading verbose "TAG is not writable" messages when copying + list-type tags +
  • API Changes: +
      +
    • Enhanced GetValue() to allow return of 'Rational' value +
    +
+ +Sept. 6, 2012 - Version 9.02 +
    +
  • Added a new Nikon LensID (thanks Joseph Heled) +
  • Added a new EXIF SubFileType value used in DNG images +
  • Added write support for Apple Adjustment Settings XMP tags (XMP-aas) +
  • Added a couple of new Samsung LensType values (thanks Jaroslav Stepanek) +
  • Added a couple of new Canon LensType values and a new CanonModelID +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Enhanced "-o -" feature to allow output file type to be specified +
  • Extract last file access time as FileAccessDate +
  • Allow tags to be set from files which are zero bytes in size +
  • Made ProfileHueSatMap tags Binary if they are too long +
  • Changed names of some PanasonicRaw DistortionInfo tags +
  • Changed decoding for a Sony ExposureMode value +
  • Fixed hang/crash that could occur when writing to an image with corrupted + Sony MoreInfo data (eg. SLT-A55V JPEG corrupted by GIMP) +
+ +Aug. 25, 2012 - Version 9.01 (production release) +
    +
  • Added a couple of new CanonModelID values +
  • Added a couple of new Canon LensType values (thanks Pascal de Bruijn) +
  • Added a new PentaxModelID and a few new Pentax PictureMode values +
  • Decode a new Pentax ISO tag +
  • Improved -listx output for XMP structure tags +
  • Fixed "unexpected end of file" problems with some compressed MIE files +
+ +Aug. 18, 2012 - Version 9.00 +
    +
  • Added support for PDF encryption V5.6 (new in Adobe Reader X) +
  • Added a few new XMP-cc tags and changed a few others to rdf:resource type +
  • Added a new Sony LensType and values for other Sony tags (thanks Jos Roost) +
  • Added a new Nikon LensID +
  • Added a new Panasonic LensType (thanks Olaf Ulrich) +
  • Added patch to fix simple XMP tags written incorrectly as lang-alt type +
  • Decode some Panasonic RW2 lens distortion correction tags +
  • Decode some WEBP image characteristics from the VP8 bitstream +
  • Decode more Leica MakerNote information +
  • Calculate CurrentIPTCDigest for IPTC in PostScript files +
  • Changed the names of a couple of WBShift tags +
  • Improved parsing of -if expressions to interpret a dash after a tag name as + a minus sign instead of part of the tag name +
  • Patched problem with conditional deletion of an incorrectly null-terminated + JPEG Comment +
  • Fixed hang bug when reading unsupported Microsoft Xtra information in MOV + videos +
+ +Aug. 3, 2012 - Version 8.99 +
    +
  • Added patch to avoid "Error renaming temporary file" errors in Windows +
  • Decode some new Sony tags and values (thanks Mike Reit and Jos Roost) +
  • Improved Italian translation (thanks Michele Locati) +
  • Improved decoding of H264 ImageStabilization +
  • Changed names of PanasonicRaw ImageWidth/Height tags, and added new + Composite tags to calculate actual size of RW2 images +
  • Fixed "Corrupted Ricoh RMETA data" warning for images from some Ricoh models +
  • Fixed problem writing information to some EPS images +
+ +July 28, 2012 - Version 8.98 +
    +
  • Added a new Pentax LensType and two new PentaxModelID's +
  • Added a new CanonModelID and a new Olympus CameraType +
  • Added a new Composite Duration tag for Vorbis audio files +
  • Added more elements to Microsoft Regions XMP structure and fixed tag name + documentation for this +
  • Decode a number of new Sony tags (thanks Jos Roost) +
  • Changed name of Minolta BatteryLevel tag to BatteryState +
  • Patched problem with conditional deletion of IPTC string-type tags which are + incorrectly null terminated (eg. written by Picasa 2.0) +
  • Fixed problem copying Canon 5DmkIII MakerNotes from CR2 to JPEG images +
  • Fixed runtime error when writing some images with corrupted EXIF +
+ +July 6, 2012 - Version 8.97 +
    +
  • Added a new Canon LensType +
  • Added support for GPX attitude information as written by Arduino +
  • Added write support for XMP-expressionmedia:CatalogSets +
  • Made CFARepeatPatternDim and CFAPattern2 writable but protected +
  • Minor improvement to decoding of Sony FaceInfo +
  • Fixed problem reading some GPX track logs +
+ +June 30, 2012 - Version 8.96 +
    +
  • Added -globalTimeShift option +
  • Added new values for a couple of Nikon tags (thanks Michael Relt) +
  • Added a few new Sony PictureEffect values +
  • Added a new Olympus LensType +
  • Decode a new Sony A100 tag and improved/renamed some others (thanks Igal + Milchtaich) +
  • Changed -restore_original and -delete_original options to scan directories + only for writable file types +
  • Enhanced -srcfile option to allow multiple source files to be specified +
  • Patched possible round-off problem when extracting rational values +
  • Fixed bug which could cause runtime error when reading some HTML files and + improved reliability when extracting HTML "meta" tags +
  • API Changes: + +
+ +June 16, 2012 - Version 8.95 +
    +
  • Added a few new Sony PictureEffect values +
  • Added a new Olympus lens type (thanks Niels Kristian Bech Jensen) +
  • Improved decoding of Canon IntelligentContrast +
  • Improved user-defined lens logic to attempt to choose the best matching + user-defined lens if more than one is possible +
+ +June 9, 2012 - Version 8.94 +
    +
  • Added ability to read/write IPTC as a block +
  • Added a few Nikon LensID's (thanks Mike Pollock and Robert Rottmerhusen) +
  • Added a new Olympus LensType (thanks Brad Grier) +
  • Added new values for a few Olympus tags +
  • Decode more Sony tags (thanks Jos Roost and Igal Milchtaich) +
  • Decode Canon IntelligentContrast and add a new CanonModelID +
  • Changed names of Canon Sort/LongFocal tags to Min/MaxFocalLength +
+ +May 26, 2012 - Version 8.93 +
    +
  • Added some new Nikon RetouchHistory values +
  • Added a couple of new Pentax LensType values +
  • Added some new Olympus MagicFilter and LensType values +
  • Added a new CanonModelID +
  • Decode more Sony tags (thanks Jos Roost) +
  • Decode some MakerNote information in Olympus E-M5 MOV videos +
  • Decode a couple more Canon tags +
  • Patched to overcome formatting problems in Samsung NX200 JPEG maker notes +
+ +May 12, 2012 - Version 8.92 +
    +
  • Added read support for PCD (Kodak Photo CD Image Pac) files +
  • Added Geotag support for Winplus Beacon text-format GPS log files +
  • Added support for Leica X2 MakeNotes +
  • Added NewGUID tag +
  • Decode Panasonic ManometerPressure tag (thanks Christoph Mitterer) +
  • Decode more Sony tags (thanks Jos Roost) +
  • Changed a few Canon-mount Tokina lens model names for consistency +
+ +May 5, 2012 - Version 8.91 +
    +
  • Added -progress option +
  • Added support for XMP fpv namespace +
  • Added a new Canon EasyMode value and fixed an incorrect one +
  • Added a couple of new Canon LensTypes +
  • Decode a number of new tags for the Canon 1DX and 5DmkIII +
  • Improved the names of a few Sony tags (thanks Jos Roost) +
  • Fixed -sep option to apply to interpolated tag values in a string when + copying +
+ +Apr. 28, 2012 - Version 8.90 (production release) +
    +
  • Added ability to fix double-UTF-encoded embedded XMP +
  • Added a warning for invalid XMP +
  • Added a new Minolta/Sony LensType (thanks Matthias) +
  • Added a new values for some Canon tags +
  • Decode ColorBalance information for a few more Nikon models +
  • Ignore trailing whitespace when writing converted values +
  • Enhanced the -z option to avoid writing the 2424 bytes of padding in XMP +
  • Improved decoding of some Sony MakerNotes tags (thanks Jos Roost) +
  • Improved "best guess" for fixing corrupted makernote offsets of some Sony + models +
+ +Apr. 21, 2012 - Version 8.89 +
    +
  • Added new Nikon and Ricoh LensID's +
  • Added a new Olympus CameraType +
  • Added new Canon LensType, EasyMode and CanonModelID values +
  • Added new Pentax PictureMode and PentaxModelID values +
  • Added support for IDimager XMP tags +
  • Added a number of new XMP-crs tags used by LR4 +
  • Decode a few more QuickTime tags +
  • More improvements decoding Minolta/Sony CameraSettings (thanks Jos Roost) +
  • Enhanced -ext option to allow files with any extension to be processed +
  • Increased maximum number of SubIFD's to accommodate some DNG 1.4 images +
  • Lowered priority of JPEG APP12 PictureInfo tags when reading +
  • Created mechanism to allow self-referential XMP structures +
+ +Apr. 15, 2012 - Version 8.88 +
    +
  • Added a new Canon LensType (thanks Gerald Erdmann) +
  • Decode a number of new Olympus tags and values +
  • Decode a few more QuickTime tags +
  • Many more improvements and additions to Sony decoding (thanks Jos Roost) +
  • Changed Ricoh InternalSerialNumber to also convert numerical value +
  • Removed the ability to create IFD1 in TIFF-format images (you shouldn't + really do this anyway) +
  • Fixed incorrect IFD number in some error messages when writing +
+ +Apr. 9, 2012 - Version 8.87 +
    +
  • Added a new PentaxModelID +
  • Added new values for some Panasonic tags +
  • Added a couple of new Canon LensTypes +
  • Decode a few more Sony tags and values (thanks Jos Roost) +
  • Decode more CanonVRD tags +
  • Decode makernotes from Pentax WG-2 GPS MOV videos +
  • Changed Panasonic AdvancedSceneMode to a Composite tag +
  • Fixed problem introduced in 8.70 where excluding groups from deletion didn't + work when copying back tags in the same command +
  • Fixed problem repairing incorrect makernotes offsets in JPEG images from + Sony SLT and NEX cameras +
+ +Apr. 3, 2012 - Version 8.86 +
    +
  • Added a few new values for some Panasonic tags +
  • Added a new CanonModelID and a new Canon LensType +
  • Added a new Nikon LensID +
  • Decode more Sony CameraSettings3 information (thanks Jos Roost) +
  • Decode another Canon 5D tag +
  • Decode some new CanonVRD DLO tags +
  • Changed decoding of CanonVRD VRDVersion tag +
  • Changed formatting of a Pentax LensType for consistency with other lenses +
  • Patched decoding of Reconyx:DateTimeOriginal to accommodate values written + with an incorrect byte order by some models +
+ +Mar. 25, 2012 - Version 8.85 (production release) +
    +
  • Added a couple more Olympus CameraType values +
  • Added two new Pentax LensType's and a PentaxModelID +
  • Decode a number of new Sony CameraSettings3 tags (thanks Jos Roost) +
  • Decode a few new Pentax K-01 tags +
  • Decode new custom functions of the Canon 5D Mark III +
  • Recognize another non-standard APP1 XMP header +
  • Increased unrolled depth of XMP-mwg-kw:HierarchicalKeywords from 4 to 6 +
  • Extended "-charset exif=CHARSET" to also apply to EXIF UserComment when + stored as ASCII +
  • Changed name of Olympus MaxApertureAtCurrentFocal to to MaxAperture +
  • Patched to avoid possibility of unnecessary "references previous directory" + warning when the length of one directory is zero +
+ +Mar. 17, 2012 - Version 8.84 +
    +
  • Added a few more SonyModelID's (thanks Jos Roost) +
  • Added a new CanonModelID and a number of new Canon LensType values +
  • Added a new Minolta/Sony LensType +
  • Decode CameraTemperature for a number of new Canon PowerShot models +
  • Decode information from PANA atom of Panasonic DMC-FT20 MP4 videos +
  • Decode a bit more of the Casio MakerNotes +
  • Improved Polish translations for EXIF information (thanks Kacper Perschke) +
  • Changed some warning messages for invalid IFD entries +
  • Patched to allow writing of Sony MakerNotes containing invalid IFD entries +
+ +Mar. 13, 2012 - Version 8.83 +
    +
  • Added a new SonyModelID and a new Nikon LensID (thanks Gregg Lee and Jos + Roost) +
  • Added Finnish translations (thanks Jens Duttke and Jarkko Mäkineva) +
  • Fixed the Composite:LensID problem properly this time (with any luck) +
+ +Mar. 13, 2012 - Version 8.82 +
    +
  • Added ability to extract information from PostScript-type DFONT files +
  • Added a new Minolta/Sony LensType (thanks Jos Roost) +
  • Improved geotagging of orientation information when extrapolating past end + of track +
  • Changed behaviour while copying information to allow flattened tags to be + specified without the need to use the --struct option +
  • Removed unnecessary warning when writing PreviewImage to Ricoh DNG file +
  • Fixed problem introduced in 8.81 which prevented generation of the Composite + LensID for Nikon images when duplicate tags were disabled +
  • API Changes: +
      +
    • Added NoFlat option to SetNewValues() +
    • Changed Struct option to allow copying of both structured and flattened + tags at the same time +
    +
+ +Mar. 9, 2012 - Version 8.81 +
    +
  • Added some new Canon, Pentax and Sony/Minolta LensType's +
  • Added a few new FujiFilm PictureMode values (thanks Kai Lappalainen) +
  • Added some new FujiFilm FilmMode values +
  • Added a couple of new CanonModelID values +
  • Added local timezone message to -v2 geotagging output +
  • Made all Pentax LensType tags writable +
  • Improved Composite LensID logic to use Sony LensSpec value if available +
  • Fixed problem opening files with path names that begin with "&" +
+ +Feb. 25, 2012 - Version 8.80 +
    +
  • Added a new Olympus CameraType +
  • Improved geotagging to tolerate out-of-sequence and missing NMEA sentences +
  • Increased the maximum XMP tag ID length to 250 characters to allow very deep + user-defined structure hierarchies +
+ +Feb. 20, 2012 - Version 8.79 +
    +
  • Avoid deleting the JPEG APP14 Adobe segment when deleting all metadata +
  • Added ability to read/write/create JPEG APP14 Adobe segment as a block +
  • Added some new CanonModelID values +
  • Added another Panasonic WhiteBalance value (thanks PeterK) +
  • Decode Panasonic ColorTempKelvin tag +
  • Decode information from Qualcomm APP7 JPEG segment +
  • Extract PreviewImage for a few more uncommon camera models +
  • Strengthened MP3 file recognition to avoid mis-identification of some files +
  • Fixed problems reading "sfnt" resource in some DFONT files +
  • Fixed problems writing some LensType values for 3rd-party lenses +
+ +Feb. 11, 2012 - Version 8.78 +
    +
  • Added basic read support for a few obscure audio formats (LA, OFR, PAC, WV) +
  • Added a couple more Canon LensType values +
  • Decode some new Kodak tags in MP4 videos +
  • Patched timezone problem on MirBSD due to leap-second "feature" of this OS +
  • Fixed problem converting Adobe XMP LensID's for Pentax lenses +
  • Fixed runtime warning due to conflict with some Vorbis tag ID's +
  • Fixed problem which could result in duplicate columns in -csv output when + used with -f and the "#" suffix on a tag name +
  • API Changes: + +
+ +Jan. 27, 2012 - Version 8.77 (production release) +
    +
  • Added some new and updated some existing Sony/Minolta LensType values +
  • Added two missing Minolta Teleconverter values +
  • Added a new Canon LensType +
  • Decode Olympus ArtFilterEffect +
  • Enhanced -c (CoordFormat) option to allow signed coordinate output +
  • Changed -sort option to always sort -json and -X outputs by tag name +
  • Minor change to an Olympus LensType name (thanks Niels Kristian Bech Jensen) +
  • Fixed problem geotagging orientation information from PTNTHPR sentence +
  • Fixed decoding of negative Pentax EffectiveLV values +
  • Fixed typo in an Olympus LensType +
+ +Jan. 18, 2012 - Version 8.76 +
    +
  • Added -sort option to sort output by tag name or description +
  • Added support for FujiFilm RAF version 1.03 images and downgraded RAF + version error to a warning +
  • Added a number of new Minolta/Sony LensType's +
  • Added a new CanonModelID +
  • Decode FocusPosition for Sony A850 and calculate Composite FocusDistance +
  • Decode IFD found in some Samsung Type1 maker notes +
  • Patched Olympus test to fix failure on some platforms +
  • Patched -json output to filter out invalid UTF-8 characters +
  • API Changes: +
      +
    • Added Sort2 option and 'Descr' setting for Sort option +
    • Added secondary sort option to GetFoundTags() and GetTagList() +
    • Changed name of Sort 'Alpha' setting to 'Tag' (but 'Alpha' still works + for backward compatibility) +
    +
+ +Jan. 8, 2012 - Version 8.75 (production release) +
    +
  • Added -php output option (thanks Marcel) +
  • Decode another AIFF tag and handle character encoding in AIFF text values +
  • Recognize PHP files +
  • Enhanced Geotag feature to write speed/track from NMEA GPRMC sentence, and + orientation information from Honeywell NMEA PTNTHPR sentence +
  • Changed verbose XMP output to print raw values +
  • Lowered default priority of "avoided" tags so they don't override other + same-named tags when reading with duplicate tags disabled +
  • Patched tests to ignore MirBSD leap-second unconformity +
  • Patched ZIP module to avoid failed tests with Perl 5.6.2 on GNU/Linux 2.6 +
  • Fixed problem reading xref table of some PDF files created by PScript5.dll +
  • Fixed problem reading RicohSubdir from AVI videos of the GR Digital 4 +
+ +Dec. 28, 2011 - Version 8.74 +
    +
  • Added read/write support for Hasselblad FFF images +
  • Added iptcCore.args convenience file to the distribution package +
  • Catch CONT signal to allow calling applications to trigger an immediate + response (avoiding a delay of up to 0.01 sec) after writing arguments to a + -stay_open ARGFILE +
  • Protect against some infinite loops that could be created when using some of + the advanced exiftool options +
  • Improved decoding of Samsung PictureWizard (thanks Pascal de Bruijn) +
  • Improved handling of bad IFD entries in -htmlDump output +
  • Changed print conversion of EXIF:FNumber and XMP:FNumber to use 2 decimal + digits for values less than 1.0, and disable conversion for invalid values +
  • Tightened up the -stay_open feature to fix a few potential problems +
  • Fixed bug using -csv+= or -json+= for non-list-type tags +
  • Fixed problem deleting unknown makernotes as a block +
  • API Changes: +
      +
    • Enhanced SetNewValue() AddValue option to allow this option to be + ignored for non-list tags +
    +
+ +Dec. 16, 2011 - Version 8.73 +
    +
  • Added read support for OpenEXR and Radiance RGBE images +
  • Added a couple of new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added a new PentaxModelID +
  • Added a new Olympus CameraType +
  • Created new FileSequence tag for use in batch processing +
  • Decode maker notes from Pentax Optio RZ18 AVI videos +
  • Tolerate unrecognized IPTC records (but still issue warning) +
  • Changed ScaleFactor35efl calculation to also use Pentax SensorSize +
  • Minor changes to two Samsung lens names (thanks Pascal de Bruijn) +
+ +Dec. 8, 2011 - Version 8.72 +
    +
  • Added support for reading XMP from INX files +
  • Added PDF HasXFA tag +
  • Added a new XMP Colorants field (not in 2010 XMP specification) +
  • Decode Casio BestShotMode for yet more cameras +
  • Decode a few more Casio ImageStabilization values +
  • Decode a few more Olympus tags and added conversion for CameraType +
  • Protect against reading insanely large XMP (> 300 MB) in INDD files +
  • Extract large (> 64 kB) unknown XMP tags as binary data +
  • Reduced memory requirements for XMP processing (by 1/10) +
  • Fixed another place where empty XMP structures could hide (in lists) +
+ +Nov. 19, 2011 - Version 8.71 +
    +
  • Added two new Olympus LensType values (thanks Martin Hilbers) +
  • Avoid recreating duplicate groups when deleting whole groups and adding back + tags in the same step +
  • Fixed problem where the QuickTime -charset option didn't work for some tags +
  • Fixed bug introduced in 8.69 which could cause excessive memory usage when + reading QuickTime videos with the -u option +
  • Fixed problem where existing empty XMP structure couldn't be deleted or + overwritten as a structured tag +
+ +Nov. 15, 2011 - Version 8.70 +
    +
  • Compatibility Notice: Changed order of operations when batch processing with + -tagsFromFile option to be consistent with non-batch mode +
  • Added -listItem option +
  • Added read support for IDML files +
  • Added a new Canon LensType (thanks Jon Charnas) +
  • Added a couple of new Samsung LensType's (thanks Tae-Sun Park) +
  • Added support for another DigiKam XMP tag +
  • Decode a couple more ID3 tags +
  • Decode Casio BestShotMode for more cameras +
  • Improved decoding of Casio AFMode +
  • Extract unknown FLAC blocks as binary data +
  • Changed ITC:ImageType to make "numerical" value more friendly +
  • Changed priority of two unreliable Samsung tags +
  • Fixed bug where ExifTool could produce improperly formatted XMP when writing + structure elements to a previously empty XMP structure (the empty XMP + structure was not being properly deleted). Affected XMP may be repaired by + re-writing any element of the structure with this version of ExifTool +
  • API Changes: +
      +
    • Added ProtectSaved option to SetNewValue() and return save count from + SaveNewValues() +
    +
+ +Nov. 9, 2011 - Version 8.69 +
    +
  • IMPORTANT: Fixed bug which could corrupt GIF images when writing a Comment + to a GIF image containing XMP metadata +
  • Added ability to read/write ICC_Profile in GIF images +
  • Added ability to specify internal encoding of EXIF "ASCII" strings and + QuickTime strings +
  • Added a new DigiKam XMP tag +
  • Documented -echo option (has been an undocumented feature since 6.86) +
  • Decode a number of new Sony tags +
  • Decode a few new Pentax tags and added a few new values +
  • Decode a few new QuickTime and ID3 tags +
  • Decode Casio BestShotMode for a number of models +
  • Improved validity checking of ICC_Profile segments in JPEG image +
  • Tolerate UTF-8 byte order mark (BOM) in input CSV and JSON files +
  • No longer trim trailing spaces from arguments in -@ argfiles +
  • Upgraded Windows executable version to use PAR 1.002 +
  • Changed priority of the Sony DynamicRangeOptimizer tags +
  • Changed MWG feature to use UTF8 encoding for EXIF strings by default +
  • Changed the -b option to avoid loading large binary values for tags that + have been excluded with the -x option or --TAG +
  • Changed Canon AFMicroAdjActive to AFMicroAdjMode and improved decoding +
  • Fixed problem where the PreviewImage could be lost when writing to images + from some newer Sony cameras +
  • Fixed problem reporting duplicate information when -if used with -TAG# +
  • Fixed incorrectly written XMP-tiff:YCbCrSubSampling tag +
  • Fixed problem opening files with names beginning and/or ending with some + characters such as SPACE, '>', '<' and '|'; however file names ending + with '|' are still not allowed +
  • API Changes: +
      +
    • Added CharsetEXIF and CharsetQuickTime options +
    +
+ +Oct. 21, 2011 - Version 8.68 +
    +
  • Added a new CanonModelID and a new SonyModelID +
  • Added new Canon and Pentax LensType's +
  • Decode more makernote information from Nikon MOV videos +
  • Improved decoding of Sony LensSpec and enabled writing of this tag +
  • Overhauled Minolta/Sony LensType list for consistency with official Sony + lens names and removed a couple of anomalous entries (thanks Jos Roost) +
  • Fixed problem with negative temperatures in Reconyx makernotes +
  • Fixed bug which could cause runtime warnings when -f used with -X and -l +
  • Fixed some minor problems when using -X with MWG option +
  • Fixed issue where some missing tags could be printed when -f option was used + in combination with wildcard tag names +
+ +Oct. 13, 2011 - Version 8.67 +
    +
  • Added a new Canon LensType (thanks Norbert Wasser) +
  • Decode tags from FujiIFD in HS10 and X100 RAF images +
  • Decode LocationInfo tags from Nikon maker notes +
  • Decode GPS tags from Nikon MOV videos +
  • Decode information from Microsoft "Xtra" atom in QuickTime files +
  • Decode Sony LensSpec information (thanks Jos Roost) +
  • Use more specific MakerNotes names in warning messages and verbose output +
  • Updated Canon CustomFunctions for the EOS 600D and 1100D +
  • Improved handling of some corrupted RIFF files +
  • Improved decoding of Samsung manual lens types (thanks Pascal de Bruijn) +
  • Changed "No writable tags found" warning to "No writable tags set from" +
  • Fixed problem handling resource forks in newer versions of OS X +
  • Fixed problem writing XMP as a block to Jpeg2000 images +
  • Fixed problem which could cause XMP and IPTC to be ignored when using MWG + feature with TIFF images and performing multiple operations in a single + command +
+ +Oct. 3, 2011 - Version 8.66 +
    +
  • Added the ability to use "$GROUP:all" in -if and -p expressions (evaluates + to "1" if any tag exists in the specified group, or "0" otherwise) +
  • Added a new Sony/Minolta LensType (thanks Florian Knorn) +
  • Added list of recommended modules to Perl installation +
  • Decode ColorBalance information for a few new Nikon models +
  • Updated Canon CustomFunctions for the EOS 600D and 1100D +
  • Fixed problem writing "now" to MWG date/time tags +
+ +Sept. 24, 2011 - Version 8.65 (production release) +
    +
  • Added a few new CanonModelID's +
  • Added a new Sony/Minolta LensType +
  • Added a new Canon LensType (thanks Klaus Reinfeld) +
  • Added a number of new Olympus ArtFilter/MagicFilter values +
  • Included new .args files in distribution: exif2iptc.args and iptc2exif.args +
  • Enhanced writing of date/time tags to recognize "now" for the current time +
  • Improved decoding of H264 Gain +
  • Minor improvement to -htmlDump for some invalid IFD entries +
  • Allow PostScript date/time tags to be written without the -n option +
  • Allow NikonCapture:ExposureAdj2 to be written without the -n option +
  • Fixed problem introduced in version 8.62 where DateTimeOriginal in IFD0 of + NEF images was no longer updated when shifting times +
  • Fixed problem where keywords could be duplicated when exporting to XMP while + using the MWG module +
  • Fixed problem reading PDF images with extra whitespace before xref table +
  • Fixed format problem in CSV output for filenames containing a comma or quote +
  • Fixed problem reading concatenated AVI videos +
+ +Sept. 10, 2011 - Version 8.64 +
    +
  • Added 2 new ACDSee XMP tags (thanks Hannes Leubbers) +
  • Added a new Sony FileFormat value +
  • Added a new CanonModelID +
  • Added a few new Pentax DigitalFilter and ImageTone values +
  • Enhanced -execute option to allow a command ID number to be added +
  • Enhanced -csv and -json import features to also key on canonical SourceFile + path (requires Cwd module) +
  • Improved Composite LensID logic for some Sony cameras +
  • Fixed misleading error message when using -if option on file that doesn't + exist +
  • Fixed problems decoding a number of inconsistent tags in the Sigma SD1 maker + notes +
+ +Aug. 27, 2011 - Version 8.63 +
    +
  • Added support for a number of new Open Document file extensions +
  • Added a few new CanonModelID and SonyModelID values +
  • Added a new Ricoh GXR LensID +
  • Added a new Sony/Minolta LensType (thanks Mladen Sever) +
  • Added patch to read the improperly formatted DateTimeOriginal in AVI videos + written by the Kodak Easyshare Sport camera +
  • API Changes: + +
+ +Aug. 21, 2011 - Version 8.62 - "JPEG2000 Update" +
    +
  • Added read support for JPEG2000 codestream format (J2C) +
  • Added a few new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added a few new Pentax LensType's +
  • Added a few new Sony/Minolta LensType's (thanks Wolfram for 2 of these) +
  • Added two new Sony Teleconverter values (thanks Wolfram) +
  • Decode a few more JPEG2000 UUID's written by Adobe JPEG2000 plugin +
  • Decode additional JPEG2000 ColorSpecification information +
  • Recognize a few more JPEG2000 file extensions +
  • Updated some CanonModelID's +
  • Tolerate extra comma at end of line in imported -csv files +
  • Changed name of Kodak Type9 SerialNumber tag to UnknownNumber +
  • Fixed bug which in rare situations could result in an erroneous "IFD pointer + references previous IFD" warning +
  • Fixed another memory leak when writing and removed circular references from + ExifTool object to prevent future bugs like this +
  • Fixed problem in Windows where values in the -X (XML) output containing + CR+LF were converted to CR+CR+LF +
  • Fixed superfluous warning which could occur when using += to decrement a + numerical tag +
  • Fixed an incorrectly spelt Pentax city name (thanks John Francis) +
+ +July 16, 2011 - Version 8.61 +
    +
  • Added the ability to increment/decrement tags with numerical values using += +
  • Added support for Extensis Portfolio XMP tags plus a number of non-standard + and/or undocumented XMP-xmp and XMP-xmpMM tags +
  • Added read support for Microsoft Compiled HTML (CHM) format +
  • Added read support for Ogg Video (OGV) files +
  • Added new LensType values for Pentax (thanks Heike Herrmann), Sony/Minolta + (thanks Fabio Suprani and Florian Knorn), Nikon (thanks Jens Kriese), + Olympus and Sigma cameras +
  • Added a new QuickTime VendorID +
  • Recognize DEX (Dalvik Executable) files +
  • Identify Windows 64-bit EXE/DLL files and relax EXE validation +
  • Validate date/time values when reading NMEA GPS log files +
  • Changed decoding of CFAPattern to return a string of numbers with -n option +
  • Extract all unknown makernote blocks as undef, regardless of actual format +
  • Improved print conversion of Pentax ShakeReduction +
  • Fixed problem processing some Ogg files with multiple streams +
  • Fixed incorrect namespace URI for stArea (used by MWG 2.0 regions) +
  • Fixed problem with spaces in -geotag path when using wildcards +
  • Fixed problem writing PDF:Keywords list items individually if they contain + special characters +
  • API Changes: +
      +
    • Enhanced SetNewValue() to allow increment/decrement of numerical tags +
    +
+ +June 25, 2011 - Version 8.60 (production release) +
    +
  • Added Composite Flash tag to facilitate copying of flash information between + XMP and EXIF +
  • Added new Pentax and Canon LensType values and fixed a Pentax lens name +
  • Added a few new Leica LensType's (thanks Olaf Ulrich) +
  • Added a new PentaxModelID +
  • Enhanced GPSDateStamp conversion to tolerate null separators (Casio EX-H20G) +
  • Made DNG LinearizationCurve and Nikon ContrastCurve writable but protected +
  • Renamed Nikon LinearizationTable to NEFLinearizationTable and made writable + but protected +
  • Removed Leica M8 FrameSelector tag since it seems to have evolved into an + extension of the LensType tag for newer lenses +
  • Fixed problem with order of operations when using multiple -if options +
+ +June 11, 2011 - Version 8.59 +
    +
  • Added new Composite:LensID derived from XMP-aux:LensID +
  • Added new PentaxModelID and CanonModelID values +
  • Added a new Pentax LensType (thanks Artur) +
  • Decode maker notes in Pentax Optio S1 AVI videos +
  • Extract PreviewWMF from DOCX files +
  • Recognize WMF images +
  • Fixed decoding of CanonVRD WBAdjRGBLevels and renamed to WBAdjRGGBLevels +
+ +June 2, 2011 - Version 8.58 +
    +
  • Decode a number of CameraInfo tags for the Canon EOS 600D and 1100D +
  • Improved speed by a factor of 2 when reading M2TS videos +
  • Fixed memory leak with -stay_open feature when writing +
+ +May 26, 2011 - Version 8.57 +
    +
  • Added a couple of new Canon LensType values +
  • Added a few new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added format string to -v2 output for IPTC tags +
  • Added extra logic to avoid misidentifying unknown IFD-style maker notes +
  • Decode custom settings for Nikon D700 and D7000 +
  • Fixed problem recognizing NikonCaptureData for ViewNX version 2.1.1 +
+ +Apr. 16, 2011 - Version 8.56 +
    +
  • Added a new Canon LensType (thanks Rodolfo Borges) +
  • Decode EXIF information in FujiFilm HS20EXR MOV videos +
  • Decode NikonCaptureEditVersions when ExtractEmbedded option is used + (previously called NikonCaptureHistory) +
  • Decode another Samsung tag (thanks Tae-Sun Park) +
  • Recognize CaptureOne ".newer" COS files +
  • Reverted JSON output to pre-8.51 behaviour by removing '#' suffix from tag + names when print conversion is disabled on a per-tag basis +
  • Fixed bug introduced in 8.32 interpreting some expressions when copying tags +
+ +Apr. 11, 2011 - Version 8.55 +
    +
  • Added write support for FujiFilm RAF version 0716 images +
  • Added support for a number of new LR3 XMP tags (thanks Wolfgang Guelcker) +
  • Decode some more Samsung tags (thanks Tae-Sun Park) +
  • Improved handling of incorrectly formatted XMP +
  • Recognize a few alternate PS and EPS file extensions (thanks Jeff Harmon) +
  • Reverted a few Pentax macro lens names (less consistent, but at least they + match the official Pentax names) +
  • Fixed problem reading some XMP custom properties +
  • Fixed minor problem in HtmlDump output for Canon MakerNotes footer +
+ +Apr. 2, 2011 - Version 8.54 +
    +
  • Added a number of new values for various tags +
  • Added a new Nikon LensID +
  • Decode a number of encrypted Samsung SRW tags (thanks Tae-Sun Park) +
  • Enhanced -s option so allow a number to be specified +
  • Fixed problem reading some Casio EX-Z35 MakerNote values +
+ +Mar. 27, 2011 - Version 8.53 +
    +
  • Added a new Olympus LensType +
  • Added a new Nikon LensID +
  • Added a new PentaxModelID value +
  • Decode new Pentax MakerNotes format of Optio WG-1 GPS +
  • Decode Casio, Ricoh and Sanyo face detection information (thanks Jeffrey + Friedl and Emilio for samples) +
  • Decode FujiFilm face recognition information (thanks Jeffrey Friedl) +
  • Decode a new FujiFilm tag for GE models +
  • Allow writing GPSLatitudeRef/GPSLongitudeRef with a signed number +
  • Return proper FileType for M4P audio files +
  • Combined Canon FaceDetectFrameWidth/FaceDetectFrameHeight tags into + FaceDetectFrameSize for consistency with other makes +
  • API Changes: +
      +
    • Fixed problem when specifying family 1 group in call to SetNewValue() + when tags were previously extracted with ExtractInfo() +
    +
+ +Mar. 20, 2011 - Version 8.52 +
    +
  • Added -listr option and mechanism to recognize some unsupported file types +
  • Added read support for VSD (Microsoft Visio Drawing) files +
  • Added a new Pentax LensType and improved consistency of macro lens names +
  • Added another CanonModelID +
  • Calculate Duration for M2TS (AVCHD) videos +
  • Decode a new FujiFilm tag +
  • Recognize .TS extension +
  • Recognize FotoStation IPTC record 240 +
  • Attempt to better identify FPX-format MSOffice documents with incorrect file + extensions +
  • Fixed bug applying time shift to Nikon PowerUpTime +
  • API Changes: +
      +
    • Enhanced GetNewValues() to allow group name to be specified +
    • Allow description flag to be set to '0' when calling GetFileType() to + return types of recognized-yet-unsupported files +
    +
+ +Mar. 12, 2011 - Version 8.51 +
    +
  • Added -csv option for import/export of CSV database files +
  • Added ability to import JSON files +
  • Added read support for APP1 "Ocad" segment +
  • Added a new Nikon LensID (thanks Robert Rottmerhusen) +
  • Decode more Reconyx MakerNotes tags (thanks Robert Hass of Reconyx!) +
  • Report the number of encryption bits in the PDF:Encryption tag value +
  • Allow empty group name when specifying a tag +
  • Improved decoding of Olympus ArtFilter and MagicFilter tags +
  • Improved exception handling to continue with next -execute command after + aborting a command due to a serious error +
  • Fixed problem reading indexed PGF images +
+ +Mar. 1, 2011 - Version 8.50 (production release) +
    +
  • Added Composite tags to convert QuickTime GPS information +
  • Added a couple new Sony PMP Orientation values (thanks Mike Battilana) +
  • Added a couple of new Nikon LensID's (thanks Rolando Ruzic) +
  • Added a new Canon LensType (thanks Gerald Kapounek) +
  • Decode new Nikon, Olympus, Pentax and Sony face detection tags (thanks + Jeffrey Friedl) +
  • Decode Ricoh FirmwareRevision tags +
  • Allow GPSLatitudeRef and GPSLongitudeRef to be written with a GPS coordinate + containing a N/S/E/W designator +
  • Removed Canon20D shortcut and changed Canon shortcut +
  • Removed LEGRIA/VIXIA/iVIS from CanonModelID names +
  • Renumbered Canon FacePosition tags to start at Face1Position +
+ +Feb. 12, 2011 - Version 8.49 +
    +
  • Added a number of new values for various Canon tags +
  • Added a new Pentax LensType +
  • Added ability to write Nikon PowerUpTime tag +
  • Added a number of MachO CPUSubtype's and improved handling of 64-bit flag +
  • Decode ColorData for the Canon EOS 600D and 1100D +
  • Decode a few new Sony tags +
  • Set document number for FlashPix tags extracted from embedded documents +
  • Attempted to patch OS X 10.6 quirk where FileModifyDate may not be preserved + for some files when -P is combined with -overwrite_original_in_place +
+ +Feb. 3, 2011 - Version 8.48 +
    +
  • Added a new Canon LensType value +
  • Changed order of stored information when rewriting existing IPTC tags (to + make the order of items in list-type tags consistent with XMP when deleting + and adding back values in the same command) +
  • Fixed problems with format of binary data in lists for some output options +
+ +Jan. 29, 2011 - Version 8.47 +
    +
  • Added -args option +
  • Added read support for PGF (Progressive Graphics File) images +
  • Added write support for Phase One IIQ images +
  • Added ability to write XMP-xmpMM:Pantry +
  • Added print conversions for a number of closed-choice XMP properties +
  • Added some new CanonModelID's +
  • Included new argument files in distribution: pdf2xmp.args and xmp2pdf.args +
  • Avoid copying TIFF trailers containing nothing but zeros when rewriting +
  • Handle binary data in serialized structure output +
  • Moved BMP tags to the File group +
  • Fixed bug reading/writing some IPTC binary data tags +
  • Fixed problem copying XMP:Thumbnails structure +
  • Fixed conversion of MXF:ByteOrder value +
  • Fixed potential "Undefined subroutine ConvertStruct" crash bug +
  • API Changes: +
      +
    • Fixed bug introduced in 8.46 when calling GetValue(xxx,'Raw') +
    +
+ +Jan. 22, 2011 - Version 8.46 +
    +
  • Simplified definition of user-defined XMP structures: flattened tags are now + automatically generated, and UserDefined::xmpStruct is no longer needed (but + backward compatibility is maintained with the old-style definitions) +
  • Added ability to handle multi-dimensional arrays in structured output +
  • Added a new Canon LensType (thanks Jean-Michel Dubois) +
  • Added some new XMP-xmpMM tags +
  • Enabled writing of a number of XMP-crs tags +
  • Decode Reconyx TriggerMode tag +
  • Relaxed structure validation to allow a structure to be written even if + there were errors with some fields +
  • Patched problem with formatting of very large numbers in JSON (-j) output +
  • Fixed a few problems reading and writing structured information +
  • Fixed bug which could cause hang with some user-defined tag definitions +
+ +Jan. 12, 2011 - Version 8.45 +
    +
  • Fixed a couple of minor bugs with the new -struct option +
+ +Jan. 12, 2011 - Version 8.44 - "Structured XMP" +
    +
  • Added ability to specify XMP structures when writing (yet another Christmas + vacation spent adding a significant new feature to ExifTool) +
  • Added support for new XMP tags in the MWG 2.0 specification +
  • Added read support for DV video files +
  • Added support for Reconyx maker notes +
  • Added option to overwrite existing text output files (-w!) +
  • Added ability to ignore symbolic directory links with "-i SYMLINKS" +
  • Added support for Sony Ericsson XMP cell phone location tags +
  • Added a few new CanonModelID's +
  • Added a new Minolta/Sony LensType (thanks Jean-Michel Dubois) +
  • Added a new Olympus LensType +
  • Added print conversion for all Bitrate tags +
  • Decode a couple new RIFF tags +
  • Decode CameraTemperature for a few new Canon PowerShot models +
  • Improved -struct option to work with all text output formats +
  • Changed behaviour of XMP lang-alt lists to conform to the July 2010 + specification (x-default item is no longer mandatory) +
  • Renamed AudioSampleBits tags to AudioBitsPerSample +
  • Renamed XMP-crs:Temperature tag to ColorTemperature +
  • Minor change to behaviour when replacing values in XMP lists: new list + items are now all inserted in place of the first deleted item (previously + new items were inserted one-by-one into the holes left by deleted items) +
  • Fixed bug writing alternate languages for XMP-iptcExt:ArtworkTitle tag +
  • Fixed problem where console echo was disabled when using -k option from a + bash script +
  • Attempted to patch problem of -b option affecting newline sequence for + subsequent -execute commands in Windows +
  • API Changes: +
      +
    • SetNewValue() now accepts structured values (as HASH references or + serialized strings) +
    • Struct option now has 3 settings (undef, 0 and 1) +
    +
+ +Dec. 21, 2010 - Version 8.43 +
    +
  • Added read support for MXF (Material Exchange Format) files +
  • Added support for GE (General Imaging) maker notes +
  • Added a couple of new Pentax LensType's +
  • Added a couple of new CanonModelID's +
  • Added a few more values to Casio UnknownMode +
  • Recognize 3GPP and 3GP2 file extensions +
  • Improved handling of character encoding errors +
  • Changed Duration format to always include hours for times > 1 minute +
  • Fixed minor quirk in HtmlDump output +
  • Fixed race condition with -stay_open when reading options requiring + additional arguments from the argfile +
+ +Dec. 11, 2010 - Version 8.42 +
    +
  • Added a couple more Samsung LensType values +
  • Added a few new Canon EasyMode values and a Canon LensType value +
  • Added a new PentaxModelID +
  • Decode some new H264 tags (thanks Dave Nicholson) +
  • Decode JUNK chunk in Pentax RS1000 AVI videos +
  • Flush console output before "{ready}" message when using -stay_open +
  • Improved decoding of some Canon and Pentax tags (thanks Dave Nicholson) +
  • Fixed problem copying makernotes from Nikon NRW image to JPEG +
  • Fixed incorrect decoding of some AEInfo tags for newer Pentax DSLR's +
+ +Dec. 3, 2010 - Version 8.41 +
    +
  • Added a new PentaxModelID +
  • Added a few new values for some Canon tags +
  • Added some non-standard values to a few XMP-exif tags +
  • Decode a new Ricoh tag and added a LensID +
  • Decode more Pentax K-5 tags and values +
  • Improved decoding of Battery tags for various Pentax DSLR models +
  • Fixed bug where time could be wrong by up to 2 seconds when shifting + multiple date/time values containing fractional seconds +
+ +Nov. 21, 2010 - Version 8.40 (production release) +
    +
  • Added -restore_original and -delete_original options +
  • Added new Canon, Pentax and Sony LensType values +
  • Decode more Pentax K-5 tags +
  • Decode a number of new tags in Nikon D7000 MOV videos +
  • Decode FocusDistance tags for the Canon EOS 60D +
  • Decode a few new Panasonic tags +
  • Decode a few maker note tags from Flip Video MP4 files +
  • Extract PDF PageMode and PageLayout tags +
  • Changed family 2 group names for a number of PDF tags +
  • Changed Canon LensType strings for a few lenses with updated models +
  • Patched problem reading GPX files which contain no newlines +
+ +Nov. 12, 2010 - Version 8.39 +
    +
  • Added read support for RAR archive files +
  • Added warning for non-standard XMP APP1 header in JPEG images +
  • Added a new Canon LensType (thanks Rolando Ruzic) +
  • Decode more Olympus WAV tags +
  • Decode a few more PDF document property tags +
  • Decode a new Canon tag +
  • Extract firmware revision letter with Nikon FirmwareVersion +
  • Improved decoding of some Pentax tags +
  • Changed names of a couple of Pentax tags +
  • Changed name of ASF:FileSize to FileLength to avoid conflict +
  • Fixed problem creating output files on network drives in Windows +
  • Fixed bug where MWG module wasn't loaded automatically when -execute was + used +
+ +Nov. 7, 2010 - Version 8.38 +
    +
  • Added support for Nikon D3 firmware 2.02 +
  • Decode many new Pentax K-5 tags and improved decoding of others +
  • Decode a few more Nikon D3 and D3S settings (thanks Warren Hatch) +
  • Decode some new Olympus WAV tags (thanks Tomasz Kawecki) +
  • Decode a few new Canon DPP 3.9.2 tags +
  • Decode PDF digital signature permission information +
  • Improved recognition of Adobe Illustrator PS-format AI files +
  • Disable writing XMP to Adobe Illustrator version 8 and older EPS files +
+ +Oct. 31, 2010 - Version 8.37 +
    +
  • Added ability to switch ARGFILE while -stay_open is active +
  • Fixed a couple of bugs with the new -stay_open option +
  • Fixed problem with -E option that caused double-escaping of Composite tags +
+ +Oct. 30, 2010 - Version 8.36 +
    +
  • Added ability to read/write metadata in Sigma X3F images containing a + JpgFromRaw (eg. all Sigma models except the SD9 and SD10) +
  • Added -stay_open option to avoid startup delay when called from other + applications +
  • Added a new Pentax LensType (thanks Hubert Meier) +
  • Decode a couple of new tags written by Sigma Photo Pro +
  • Changed family 0 group name for SonyIDC tags to "MakerNotes" +
  • Improved Composite:LensID to use LensModel if available when LensType is + "Unknown" +
  • Fixed problem extracting ThumbnailImage from some FujiFilm RAF images +
  • Fixed problem calculating Red/BlueBalance for some newer Nikon models +
+ +Oct. 23, 2010 - Version 8.35 - "PDF Encryption" +
    +
  • Added support for PDF AES-128 and AES-256 encryption (requires Digest::SHA + for AES-256 support) +
  • Added -password option for processing password-protected PDF documents +
  • Added write support for a couple more FujiFilm RAF versions +
  • Added a number of new Olympus SceneMode values +
  • Added a few new SonyModelID's +
  • Added a new Nikon LensID (thanks marten) +
  • Added a Canon LensType and fixed an incorrect one (thanks Andreas Huggel) +
  • Decode a number of new Canon tags +
  • Decode a few new Nikon D3S settings (thanks Warren Hatch) +
  • Extract PDF UserAccess +
  • Extract Olympus ZoomedPreviewImage +
  • Updated decoding of Olympus AFPoint for recent E-models +
  • Avoid writing mandatory IPTC tags unless another IPTC tag actually changes + (eg. trying to delete a non-existent IPTC tag will no longer have the side + effect of generating mandatory IPTC tags) +
  • Improved language translations +
  • Improved error message when trying to write a file with the wrong extension +
  • Renamed a couple of Olympus tags +
  • Fixed problem reading/writing PDF tags from some encrypted stream objects +
  • API Changes: + +
+ +Oct. 7, 2010 - Version 8.34 +
    +
  • Added read support for XCF and WebP images and WebM videos +
  • Added a couple of new PentaxModelID's +
  • Decode a number of new Canon 60D MakerNotes tags (thanks Bogdan for + LensSerialNumber) +
  • Decode FrameCount from MakerNotes in Nikon MOV videos +
  • Decode Ambience and some video tags from Canon +
  • Decode more Canon EOS 1D Mark IV CameraInfo tags +
  • Updated decoding of Pentax HighISONoiseReduction for newer models +
  • Changed description of Canon SerialNumber tags +
  • Fixed problem with extra comma in JSON output when -w option was used +
+ +Oct. 3, 2010 - Version 8.33 +
    +
  • Added ability to specify numerator and denominator of rational values +
  • Decode more Canon custom picture style settings (thanks Tom Kawecki) +
  • Decode Samsung MP4 "TAGS" information from WP10 videos +
  • Decode thumbnail image and maker notes from Canon S95 MOV videos +
  • Decode Microsoft Photo 1.1 EXIF and XMP information +
  • Fixed problem copying tags dynamically from files with read errors +
  • Fixed problem setting FileName with a Windows UNC path (leading "\\") +
+ +Sept. 25, 2010 - Version 8.32 +
    +
  • Added the ability to use wildcards ('?' and '*') in tag names when + extracting or copying information +
  • Added a number of new CanonModelID's +
  • Decode a few more QuickTime tags and improved decoding of others +
  • Decode UserDefPictureStyle tags for more Canon cameras (thanks Tom Kawecki) +
  • Extract unknown text-based maker notes under new MakerNoteUnknownText tag +
  • Tested writing of PDF 1.7 files and removed warning for this version +
  • Identify Canon MakerNote footer in HtmlDump of DNG images +
  • Updated MimeType for PSD, AVI, AIFF plus a number of raw file formats +
  • Changed FileType for Adobe Illustrator (AI) files +
  • Fixed "Can't handle XMP attribute 'rdf:xmlns'" error when writing some XMP +
+ +Sept. 17, 2010 - Version 8.31 - "CRW+XMP" +
    +
  • Added ability to read/write XMP inside CanonVRD, which finally provides a + technique to write XMP in CRW images! (thanks Mike Kobzar for help testing) +
  • Added a couple of new Canon LensType's and CanonModelID's +
  • Added a number of new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added a new Sony LensType (thanks Mladen Sever) +
  • Treat 'eng' as a default language in ID3v2 information +
  • Recognize AIT file extension (AI file) +
  • Fixed problem where ExifTool could refuse to write PDF files containing + XMP-pdf:PDFVersion information +
+ +Sept. 11, 2010 - Version 8.30 +
    +
  • Added a couple of new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added a couple more Sigma LensType values +
  • Added a few more tag values for the new Sony SLT-A33, SLT-A55V and DSLR-A560 +
  • Added a few more values for various Casio tags +
  • Added a new Canon LensType (thanks Guido) +
  • Decode Panasonic ContrastMode for the TZ10/ZS7 +
  • Decode some Canon CameraInfo tags for the 60D +
  • Updated Canon custom functions for the 60D +
  • Updated Flash video to add some new values and decode some new tags +
  • Updated QuickTime decoding for new track and movie header formats +
  • Named a couple of unknown Canon tags +
  • Made Nikon PictureControl and NikonCaptureOutput directories block writable +
  • Fixed problem geotagging when any coordinate was exactly zero +
  • Fixed typo in Canon AFAssistBeam converted value +
  • Fixed problem displaying exiftool documentation on OS/2 (thanks Ilya + Zakharevich) +
+ +Aug. 22, 2010 - Version 8.29 +
    +
  • Added a few new CanonModelID's +
  • Added verbose messages for "unsafe" and "protected" tags which are not + copied +
  • Decode CameraTemperature for a few new Canon models +
  • Decode a few new Panasonic tags (thanks Zdenĕk Mihula) +
  • Decode a number of new 3rd party RIFF tags +
  • Recognize Casio-type maker notes in Concord cameras +
  • Handle "CDATA" sections in XML/XMP +
  • Fixed problem that could cause value to be added twice when writing MWG + list-type tags without specifying a group +
  • Fixed bug extracting altitude from GPX files containing "rtept" nodes which + could result in an altitude being associated with the next GPS fix +
  • Fixed problem deleting PreviewImage from MIE files +
+ +Aug. 14, 2010 - Version 8.28 +
    +
  • Added ability to specify Photoshop encoding (-charset Photoshop=CHARSET) +
  • Added support for maker notes of some Sony Ericsson phones +
  • Improved conversion for SigmaRaw:FocalLengthIn35mmFormat (thanks Niels + Kristian Bech Jensen) +
  • Fixed bug in calculation of AvgBitrate for QuickTime videos (thanks Mats + Peterson) +
  • Improved error handling when reading Matroska files +
  • Fixed -GROUP:geotag= to allow multiple geotag groups to be deleted + separately +
+ +July 31, 2010 - Version 8.27 +
    +
  • Added support for QuickTime localized languages and character encodings +
  • Added support for alternate language ICC_Profile tags +
  • Added a new XMP-swf tag +
  • Added a new Sony LensType (thanks Mladen Sever) +
  • Added ability to specify any group (not only family 0 and 1) for source tag + when copying +
  • Decode a number of new QuickTime tags +
  • Decode MakerNoteKodak9 maker notes in a few non-Kodak cameras +
  • Extract NikonCaptureHistory and drop when copying Nikon MakerNotes +
  • Calculate AvgBitrate for QuickTime movies +
  • Fixed names of a few recently added ICC_Profile tags (thanks Jeff Harmon) +
  • Fixed bug calculating duration of AVI videos for which FrameCount is zero +
  • Fixed tag ID for XMP-iptcExt:AdditionalModelInformation +
  • Fixed decoding of ShiftJIS character set +
+ +July 20, 2010 - Version 8.26 +
    +
  • Decode a number of new ICC_Profile tags added in approved revisions to the + specification +
  • Drop NikonCaptureData when copying Nikon MakerNotes (it may be too large for + a JPEG APP1 segment when copying from an NEF image) +
  • Made NikonCaptureData writable as a block and NikonCapture a deletable group +
  • Minor addition to tooltip for HtmlDump of offset values +
  • Fixed problem writing to an incorrectly-typed XMP list (patch for LR3 bug) +
  • Fixed problem setting file ownership on OS/2 systems when writing (thanks + Ilya Zakharevich) +
  • Fixed incorrect ICC_Profile tag name (thanks Jeff Harmon) +
+ +July 13, 2010 - Version 8.25 (production release) +
    +
  • Added CommonIFD0 shortcut tag to help when deleting metata from TIFF images +
  • Added a new Pentax LensType and fixed an incorrect one +
  • Added a new Panasonic ColorMode +
  • Decode FLAC picture metadata +
  • Changed ASF Preview tags to be consistent with ID3 and FLAC Picture tags +
  • Patched problem with funny dash character in cut-n-paste from documentation + on some systems (by allowing the funny dash in command-line arguments) +
  • Fixed misleading warning message which could appear when writing MWG tags +
  • Fixed typo in an ID3 tag name (thanks Mats Peterson) +
  • Fixed an incorrect Sony lens name (thanks Stephen Bishop) +
  • Fixed problem misidentifying some other RAW files as Epson ERF +
+ +June 30, 2010 - Version 8.24 +
    +
  • Added ability to write some Kodak APP3 Meta tags +
  • Added a few new Olympus LensType's and new values for a couple of other tags +
  • Added support for yet another Kodak MakerNote variation (M580) +
  • Added conversion for OOXML DocSecurity tag (thanks Jeff Harmon) +
  • Added another Nikon ExternalFlashFlags value (thanks Warren Hatch) +
  • Decode more Canon VRD tags (thanks Gert Kello) and changed some tag names +
  • Decode a couple of new Canon 7D tags (thanks Vesa Kivisto) +
  • Decode a few more Sigma tags +
  • Decode HTML tags written by Microsoft Office +
  • Decode some MakerNotes tags from Samsung MP4 videos +
  • Allow RFC 8601 date/time values to be written without seconds +
  • Fixed conversion for Kodak Meta:SerialNumber +
  • Changed conversion of Canon FocusDistanceUpper/Lower tags to add units (m) +
  • Changed the names of some Nikon FlashExposureComp tags +
  • Changed name of RTF CharactersNoWhiteSpace tag to CharactersWithSpaces to + conform with what Microsoft does with their software as opposed to what they + say in their RTF specification +
  • Changed a few FlashPix tags for better consistency with OOXML and RTF +
  • Properly convert OOXML Unicode character entities +
  • Fixed problem writing some Sigma MakerNote tags +
  • Fixed problem writing incorrect value for "Uncalibrated" XMP:ColorSpace +
  • Fixed bug where some unknown Canon values were extracted twice with -U +
+ +June 20, 2010 - Version 8.23 +
    +
  • Added write support for FujiFilm RAF images from the HS10 and S100FS +
  • Added read support for RTF files +
  • Added read support for FPXR in JPEG APP4 as written by some HP cameras +
  • Added ability to copy files of any type (now does a straight copy instead of + processing the file if no new values are set for any "real" tag) +
  • Added new values for CanonModelID, PentaxModelID and SonyModelID +
  • Added a new Ricoh LensID +
  • Added conversion for "Off" and "On" values when writing EXIF:Flash +
  • Added a new Canon LensType and changed the name of one Sigma lens +
  • Decode more Canon VRD tags and update to DPP 3.8 (thanks Gert Kello) +
  • Decode FujiFilm AutoDynamicRange +
  • Changed some DNG tags to make them writable (but "unsafe") +
+ +June 9, 2010 - Version 8.22 +
    +
  • Implemented PNG alternate language tags and special character translations +
  • Added print conversion for XMP-photoshop:ColorMode +
  • Decode some new Pentax 645D tags/values and added more PentaxModelID's +
  • Changed family 1 group names for Matroska Chapters +
  • Changed frame rate conversions to round to 3 decimal points +
  • Enable summary messages when -b is combined with -w +
  • Assume local system timezone on specified date (instead of current local + timezone) when writing an IPTC time tag with a date/time value which doesn't + include a timezone +
  • Fixed conversion of Matroska:ChapterTimeStart/End values +
  • Fixed an incorrect Panasonic Lens name (thanks Michael Byczkowski) +
+ +June 2, 2010 - Version 8.21 +
    +
  • Added read support for Matroska multimedia files (MKA, MKV and MKS) +
  • Added a new PentaxModelID (Optio E80) +
  • Decode some information from Casio EX-7000SX APP1 "QVCI", HP Photosmart + R837 APP6 "TDHD" JPEG segments +
  • Extract more Samsung and HP PreviewImages hidden in other JPEG APP segments +
  • Extract unknown tags with numerical ID's by default when -v option is used +
  • Updated default GPSVersionID to 2.3.0.0 when writing +
  • Fixed bug geotagging from KML file (lat/long were swapped) +
+ +May 26, 2010 - Version 8.20 - "Exif 2.3" +
    +
  • Added read support for Open Document files (ODP, ODS, ODT) +
  • Added Composite:AudioBitrate tag for VBR MPEG audio +
  • Added support for IPTC:CatalogSets written by iView MediaPro +
  • Decode Olympus MagicFilter tag and add a two new SceneMode values +
  • Decode a few new Sony tags written by NEX models +
  • Decode a number of new Sony A100 tags (thanks Igal Milchtaich) +
  • Decode some information from MPEG audio LAME header +
  • Updated to Exif 2.3 specification (!!) +
  • Allow date/time tags to be shifted by the values of other tags when using + the -tagsFromFile feature +
  • Fixed formatting of QuickTime:CreateDate as written by iPhone +
  • Fixed problem conditionally replacing some blank EXIF tags and alternate + language tags in XMP +
+ +May 11, 2010 - Version 8.19 +
    +
  • Added ability to read/write Samsung PreviewImage trailer +
  • Added two new PentaxModelID's (Optio H90 and W90) +
  • Added a new Canon LensType +
  • Added a new CanonModelID +
  • Decode more Sony tags/values (thanks Michael Reitinger) +
  • Decode more Leica M9 tags (thanks Michael Byczkowski and Carl Bretteville) +
  • Updated to XMP April 2010 specification +
  • Avoid extracting Sony DSLR-A100 tags which have "n/a" values +
  • Improved German language translations (thanks Herbert Kauer) +
  • Improved efficiency of Composite tag calculations +
  • Made RSRC a deletable group +
  • Tolerate extra white space at the start of an XMP file +
  • Changed MWG logic to ignore blank EXIF tags +
  • Changed a few print conversion strings to improve interoperability +
  • Changed XMP namespace prefix 'prismusagerights' to 'pur' as per most recent + PRISM specification +
  • Patched memory problem in Windows when processing very large EPS files +
  • Fixed a couple of incorrectly named Sony Panorama tags +
  • Fixed bug which could prevent file from being updated when deleting + mandatory tags and adding back tags in other locations +
+ +Apr. 16, 2010 - Version 8.18 +
    +
  • Added read support for Sony DSC-F1 PMP images +
  • Added a new Nikon LensID (thanks Jeffrey Friedl) +
  • Decode a number of new Sony tags (thanks Michael Reitinger) +
  • Decode a few more Leica M9 tags (thanks Michael Byczkowski) +
  • Preserve original file permissions and ownership when writing +
  • Made Canon DustRemovalData writable +
  • Changed some Pentax WhiteBalance strings for consistency +
  • Patched potential security problem when writing values +
  • Fixed bug extracting unsynchronized ID3v2.4 information +
+ +Apr. 9, 2010 - Version 8.17 +
    +
  • Added a new Sony ExposureMode (thanks Michael Reitinger) +
  • Decode Casio DriveMode (thanks Robert Chi) +
  • Decode CameraTemperature for more Canon EOS models (thanks Vesa Kivisto) +
  • Updated to the DICOM 2009 specification (Note: Changed some DICOM tag names) +
  • Improved conversions for XMP:LensInfo, EXIF:DNGLensInfo and Nikon:Lens +
  • Changed case of some Canon DriveMode strings +
  • Fixed divide-by-zero error when Geotagging from a track with only one point +
  • Fixed incorrect ImageHeight reported for top-to-bottom BMP images +
  • API Changes: +
      +
    • Fixed a problem passing options to Image::ExifTool::TagInfoXML::Write() +
    +
+ +Mar. 31, 2010 - Version 8.16 +
    +
  • Preserve Mac OS resource fork when writing (OS X only) +
  • Added a number of new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Decode a couple more Mac OS resources +
  • Decode Olympus LensModel tag (thanks Martin Hilbers) +
  • Extract PrintIMVersion tag from PrintIM information +
  • Separate extraction of Leica FrameSelector information from LensType tag +
  • Recognize Bitstream PFA/PFB font files +
  • Patched ActivePerl 5.10 bug which could cause Perl crash during Geotag tests +
  • Fixed another Geotag test that fails due to round-off errors on some systems +
+ +Mar. 18, 2010 - Version 8.15 (production release) +
    +
  • Added read support for Macintosh resource files: +
      +
    • Generate ResourceForkSize tag if data exists in a file's resource fork +
    • Enhanced -ee option to process resource fork as a sub-document +
    +
  • Added a new PentaxModelID (Optio I-10) +
  • Decode Panasonic DMC-ZS7 landmark tags +
  • Fixed decoding of Pentax Optio 555 PictureMode and added a number of new + values (thanks Ralf Medow) +
+ +Mar. 16, 2010 - Version 8.14 +
    +
  • Added some new Canon AFMode values for the EOS 7D (thanks Dieter Steiner) + and renamed tag to AFAreaMode +
  • Decode ColorData and some new MOV tags for the production Canon EOS 550D +
  • Decode Panasonic IntelligentResolution tag +
  • Allow times with timezones in GPX track logs +
  • Improved handling of maker notes in Olympus MP4 videos +
  • Changed H264 GPS tags to the GPS group +
  • Fixed date/time format error in reverse geotagging GPX example +
  • Fixed problem introduced in version 8.09 where XMP:GPSLatitude/GPSLongitude + require the -a option to be extracted +
  • API Changes: +
      +
    • Fixed bug where some options (Charset, Escape, Exclude and Lang) weren't + activated properly when set via options hash in calls to some functions +
    • Fixed some potential problems when used with mod_perl +
    +
+ +Mar. 5, 2010 - Version 8.13 +
    +
  • Added read/write support for Samsung SRW images and decode some NX10 maker + note tags (thanks Tae-Sun Park) +
  • Added new values for some Sony tags (thanks Michael Reitinger) +
  • Added a new Canon LensType +
  • Decode maker notes in Nikon Coolpix S8000 MOV videos +
  • Decode a number of obscure TIFF FX tags +
  • Implemented list-type behaviour for MWG:Creator tag +
  • More improvements to German translations (thanks Herbert Kauer) +
  • Changed name of NikonPreview group to PreviewIFD +
  • Fixed problem which prevented ThumbnailImage from being written to ARW, SR2 + and PEF images +
+ +Feb. 26, 2010 - Version 8.12 +
    +
  • Added a number of missing ProgramMode values for the Sony DSLR-A330 +
  • Added XMP-iptcCore:DigitalSourceType (IPTC Extension version 1.1) +
  • Added a couple more Nikon LensID's (thanks Jens Kriese and Robert + Rottmerhusen) +
  • Improved German language tag descriptions (thanks Herbert Kauer) +
  • Improved identification of some RAW file types +
  • Moved MPF PreviewImage into the Composite group +
  • Fixed some problems in HtmlDump output +
  • Fixed problem copying makernotes as a block into DNGAdobeData +
+ +Feb. 20, 2010 - Version 8.11 +
    +
  • Added support for Leica S2 maker notes +
  • Added a bunch of new CanonModelID's +
  • Decode MacroMagnification for more Canon models (MP-E 65mm only) +
  • Decode a number of Canon CameraInfo tags for the 1DmkIV and 550D +
  • Updated CanonCustom tags for the 550D +
  • Improved parsing of Canon OriginalDecisionData +
  • Improved decoding of Canon CameraInfo LensType +
  • Improved decoding of some Sigma tags +
  • Recognize a number of new Paint Shop Pro file extensions +
  • Prevent a directory from being recreated in the wrong location when deleting + a group and adding back information in the same step +
  • Changed -fileOrder option to sort numbers numerically +
  • Fixed bug in -fileOrder option when directory names are specified +
  • Fixed problem extracting information from some Panasonic AVCHD videos +
  • Fixed some minor compatibility problems with Perl 5.11 +
  • Fixed problem which could result in runtime error when using MWG feature +
  • Fixed an inconsistency in the way duplicate tags were handled in the grouped + JSON (-j -g) and short XML (-X -s) output formats +
+ +Feb. 8, 2010 - Version 8.10 (production release) +
    +
  • Added read/write support for Photoshop PSB file format +
  • Added -fileOrder option to provide control over file processing order +
  • Added a few new Sony/Minolta LensTypes (thanks Marcin Krol) +
  • Added more Nikon LensID's (thanks Robert Rottmerhusen) +
  • Decode metadata from all frames in AVCHD H.264 video with -ee option +
  • Decode more H.264 tags and improved decoding of others +
  • Improved decoding of some Olympus E-P1 tags +
  • Improved handling of some types of unknown maker notes +
  • Enhanced -p option to support output file headers and footers, and to parse + embedded documents as separate input files when combined with -ee +
  • Relaxed validation of PFM files to accommodate incorrect device type string + written by FontForge software +
  • API Changes: +
      +
    • Enhanced GetFileType() to return descriptions for more file types +
    +
+ +Jan. 29, 2010 - Version 8.09 +
    +
  • Added a number of new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Decode GPS position and some camera settings from AVCHD (.M2TS) video +
  • Decode a few new PhotoMechanic tags +
  • Decode MacroMagnification for the Canon MP-E 65mm f/2.8 1-5x Macro Photo + lens in EOS 5DmkII and 40D images +
  • Delete multiple Photoshop segments in JPEG images when deleting all + Photoshop information and adding some back in one step +
  • Print warning message in Windows when there are no matching files to process +
  • Changed print conversion for PSP CreatorAppVersion +
  • Fixed problem rewriting NikonCapture information written by NX2 +
+ +Jan. 25, 2010 - Version 8.08 +
    +
  • Added read support for Paint Shop Pro images (PSP and PSPIMAGE) +
  • Added ability to decode a number of new character sets including JIS, and + completely overhauled character encoding routines +
  • Fixed problem reading old OS/2-format BMP images +
+ +Jan. 19, 2010 - Version 8.07 +
    +
  • Added read support for a number of font file formats (OTF, TTF, TTC, PFA, + PFB, PFM, DFONT, AFM, ACFM and AMFM) +
  • Added (experimental) read support for FLA files +
  • Added a few new Sony LensType's (thanks Sander Stols) +
  • Added a new Canon LensType (thanks Mark Berger) +
  • Set BigTIFF MIME type to "image/x-tiff-big" (unofficial) +
  • Fixed bug in GPS time drift correction when dates are specified for both GPS + and image times +
  • Fixed problem reading some IGC GPS logs +
+ +Jan. 12, 2010 - Version 8.06 +
    +
  • Added a few new CanonModelID's +
  • Fixed a bug introduced in 8.05 which broke rewriting of XMP in MWG mode +
+ +Jan. 10, 2010 - Version 8.05 - "Strict MWG" +
    +
  • Improved MWG conformance by ignoring non-standard EXIF, IPTC and XMP when + the MWG module is loaded +
  • CurrentIPTCDigest tag is now only generated for IPTC in the standard + location (as specified by the MWG recommendation) +
  • Added support for 3rd party trailers on ARW images +
  • Changed names of Sony IDC date/time tags and decode the last unknown IDC tag +
  • Fixed "-TAG-= -TAG=VALUE" syntax to work with shiftable (date/time) tags + and tags with conversions +
  • Fixed incorrect tag format when writing some PhotoMechanic tags +
  • Fixed problem where some tags couldn't be written in Olympus ORF images +
+ +Jan. 7, 2010 - Version 8.04 - "Write ARW" +
    +
  • Added write support for Sony ARW and SR2 images (at long last!) +
      +
    • WARNING: Some Adobe utilities (Photoshop Camera Raw 5.6, DNG Converter + 5.6, LightRoom 2.6) have a bug which causes the tone curve to be + incorrect for edited ARW images from some Sony cameras (A500, A550, + A700, A850, A900 and maybe others) +
    +
  • Compatibility Notice: Embedded JPEG in ARW and SR2 images is now extracted + as PreviewImage instead of JpgFromRaw +
  • Added read/write support for Sony IDC tags +
  • Added support for Leica X1 maker notes and decode a few tags +
  • Added support for DigiKam XMP schema +
  • Added a new Minolta/Sony LensType (thanks Jean-Michel Dubois) +
  • Decode Nikon D90 AFAreaModeSetting +
  • Decode Nikon NEFBitDepth (thanks Warren Hatch) +
  • Decode a few new Sony SRF, Casio AVI and MSOffice TIFF tags +
  • Enhanced Geosync tag to allow GPS time-drift correction +
  • Fixed Nikon D3 FlashSyncSpeed values (thanks Warren Hatch) +
+ +Dec. 19, 2009 - Version 8.03 +
    +
  • Added a new Nikon ExternalFlashFlags value (thanks Warren Hatch) +
  • Implemented -charset id3=CHARSET option in Windows version too (oops!) +
  • Improved heuristic for guessing EXIF "Unicode" string byte order +
  • Improved decoding of some obscure QuickTime tags +
  • Renamed Casio SelfTimer tag to ReleaseMode and added new values +
  • Fixed problem converting numerical M4P Genre values +
+ +Dec. 15, 2009 - Version 8.02 +
    +
  • Added MIME types for Apple iWork file formats +
  • Added bitmask to -v2 output for applicable tags +
  • Added a new Canon LensType and fixed an incorrect one (thanks Hugh + Griffiths) +
  • Added a few new Ricoh Saturation values (written by GXR) +
  • Added ability to specify character set for ID3v1 information +
  • Added French translations for some Nikon tags (thanks Harry Nizard) +
  • Extract FilePermissions information +
  • Decode Nikon D90 custom settings +
  • Decode a few more Nikon tags and removed AutoBracketRelease (thanks Warren + Hatch) +
  • Decode a few more GIF tags (and changed groups of some others) +
  • Decode some information from JPEG APP4 "SCALADO" segment +
  • Updated DICOM decoding to latest (2008) specification +
  • Enhanced -fast option to allow MakerNote information to be skipped +
  • Changed -v0 to enable output autoflushing for STDERR as well as STDOUT +
  • Improved decoding of some QuickTime tags (fixes M4P Genre problem) +
  • API Changes: +
      +
    • Added CharsetID3 option +
    • Changed name of IPTCCharset option to CharsetIPTC (but IPTCCharset may + still be used for backward compatibility) +
    +
+ +Dec. 1, 2009 - Version 8.01 +
    +
  • Compatibility Notice: Extract full-sized preview from X3F images as + JpgFromRaw instead of PreviewImage +
  • Added support for the new X3F version 2.3 files written by the Sigma DP2 +
  • Added support for a few more XMP-acdsee tags +
  • Decode Nikon D3 custom settings (thanks Warren Hatch) and extrapolate to + D3S, D3X and D300S +
  • Decode the few remaining Nikon D300 custom settings (thanks Stuart Solomon + for providing sample images) +
  • Decode Nikon D5000 custom settings +
  • Decode Nikon FlashColorFilter tag (thanks Warren Hatch) +
  • Decode a few more PNG tags +
  • Created a new family 1 group for Nikon custom settings +
  • Improved write conversions for EXIF Contrast, Saturation and Sharpness +
  • Fixed problem with %f and %e when the source file has no extension +
  • Fixed problem decoding Nikon D3 flash group B and C intensities +
  • Fixed missing MIME type for XLT files +
+ +Nov. 20, 2009 - Version 8.00 (production release) +
    +
  • Added read support for Apple iWork '09 files (Keynote, Pages and Numbers) +
  • Added ability to write Nikon SerialNumber and ShutterCount tags +
  • Added a few new Nikon LensID's and changed Tamron lens names to include + model number (thanks Robert Rottmerhusen) +
  • Decode a number of new Nikon tags (thanks Warren Hatch for much of this) +
  • Decode a few new Sony tags and improved others (thanks Igal Milchtaich) +
  • Decode a few new Ricoh tags, renamed RicohDateTime1/2, Revision and + MakerNoteVersion tags, and added some print conversions +
  • Decode Parallax in FujiFilm MPO MPImage2 images (thanks John Goodman) +
  • Decode Canon EOS 1D Mark IV custom functions +
  • Decode a number of new tags in MPEG-4 videos +
  • Decode a large number of private GE DICOM tags +
  • Decode a few more tags in AVI videos and attempt to fix problem calculating + duration when multiple video streams exist +
  • Enhanced -ee option to extract information from embedded MPF images +
  • Improved Nikon LensID conversion to recognize user-defined lenses +
  • Improved decoding of a few Olympus tags (ArtFilter, FaceDetect and + FocusProcess) +
  • Improved handling of warnings when processing corrupted ZIP files +
  • Improved recognition of Canon teleconverters in Composite LensID tag +
  • Added patch for Leica M8 bug which writes incorrect format for EXIF + ExposureCompensation and ShutterSpeedValue +
  • Changed prefix of unknown Leica M9 tags from LeicaSubdir to Leica_Subdir +
  • Fixed problem writing encrypted Nikon WB Levels +
  • Fixed problems reading PDF tags written by OS X 10.6 utilities +
  • Fixed problem where the -charset option didn't work properly for some XML + character entities when reading XMP +
+ +Nov. 6, 2009 - Version 7.99 +
    +
  • Added read support for Office Open XML files and improved recognition of + many MS Office file types +
  • Added read support for Phase One IIQ and Capture One COS and EIP files +
  • Added read support for GZIP information (first archived file only) +
  • Added a new Canon LensType (thanks Karsten Söte) +
  • Added a new Nikon LensID (thanks Geert De Soete) +
  • Decode a few new Sony tags +
  • Decode MakerNotes in Pentax AVI videos +
  • Decode SerialNumber for newer Pentax cameras +
  • Decode Canon FlashMeteringMode for most EOS models +
  • Disabled some Sony A230 CameraInfo tags which weren't valid for this model +
  • Give names to a number of unknown QuickTime atoms +
  • Recognize VOB file extension (but audio information in MPEG private stream + is not yet decoded) +
  • Tolerate extra white space in GPX attributes when geotagging (fixes problem + reading GlobalSat GPX files) +
  • Minor improvements to FlashPix decoding +
  • Changed names of all ZIP tags to avoid name conflicts with other tags +
  • Changed Composite ImageSize to use ExifImageWidth/Height for CR2 images +
  • Changed names of QuickTime image and video track description + ImageWidth/Height tags to SourceImageWidth/Height +
  • Fixed problems when -if option was combined with -v or -htmlDump +
  • Fixed problem parsing NMEA track logs where coordinates have the wrong + number of digits due to missing leading zeros (Holux M-241) +
  • Fixed an incorrect Pentax LensType +
+ +Oct. 28, 2009 - Version 7.98 +
    +
  • Implemented MWG support via a plug-in module ("-use MWG") +
  • Added -config and -use options +
  • Added ability to read Sony Vegas tags in AVI videos +
  • Added a couple of new Canon LensType's +
  • Added a new Panasonic ShootingMode (thanks Joerg) +
  • Added a new PentaxModelID (Optio P80) +
  • Added a new CanonModelID +
  • Added a few new Canon 1D Mark IV custom functions values +
  • Added warning for superfluous tag names on the command line when writing +
  • Decode a few more tags for the Canon EOS 5D and 7D +
  • Decode a number of new tags in Quicktime-based files (including MP4 and JP2) +
  • Impose length limit on IPTC values when writing as per spec. (for backward + compatibility, the length check may be disabled with the -m option) +
  • Improved checks for invalid EXIF offsets and changed some warning messages +
  • Improved decoding for a few Canon tags (and renamed NoiseReduction tag) +
  • Improved date/time formatting to accept date-only values +
  • Implemented print conversion for ID3 date/time tags +
  • Enhanced writing of Photoshop:IPTCDigest to allow a special value of 'old' + to represent the digest of the IPTC from the original file +
  • Updated iptc2xmp.args and xmp2iptc.args to handle IPTC + DigitalCreationDate/Time +
  • Recognize a number of Sigma LensType's in X3F images +
  • Recognize a large number of additional audio/video file extensions +
  • Minor improvements to -htmldump output +
  • Minor changes to some application warning messages +
  • Fixed problem writing Canon CameraTemperature tags +
  • Fixed "Error reading Info object" warning when reading a PDF file after + deleting all PDF tags +
  • API Changes: +
      +
    • Added ability to specify config file via $Image::ExifTool::configFile +
    • Added EditGroup option for SetNewValue() +
    +
+ +Oct. 13, 2009 - Version 7.97 +
    +
  • Added ability to disable print conversion on a per-tag basis by suffixing + the tag name with a '#' character +
  • Added a new PentaxModelID (Optio WS80) +
  • Decode a few more Sony tags +
  • Decode a number of new Casio tags and values +
  • Decode CameraTemperature for Canon PowerShot models (thanks Vesa Kivisto) +
  • Improved warning messages for the -ext option +
  • Improved DOF calculation to use ObjectDistance if SubjectDistance and + FocusDistance are not available +
  • Improved -X output to support more of the new -charset encodings +
  • Made Composite:FileNumber writable +
  • Use more detailed makernote directory names in EXIF warning messages +
  • Decreased priority of tags in IFD1 of JPEG images to avoid taking precedence + over tags from IFD0 or ExifIFD +
  • Changed print conversion strings for TIFF SampleFormat tag +
  • Renamed Casio ObjectDistance tag to FocusDistance +
  • Fixed invalid character in a Minolta/Sony LensType string +
  • Fixed bug decoding NITFVersion tag +
  • Fixed bug where binary data was returned without the -b option when using an + expression involving tag names for some tags such as ThumbnailImage +
  • Fixed two problems which could result in runtime warnings when: +
      +
    • reading truncated ICC_Profile information +
    • using -htmldump on an image containing invalid EXIF offsets +
    +
  • API Changes: +
      +
    • Added ability to disable print conversion by suffixing tag name with '#' +
    • Changed name of BigTIFF 'ifd8' format to 'ifd64' for consistency +
    +
+ +Oct. 2, 2009 - Version 7.96 +
    +
  • Added new Geosync tag to allow geotagging of images with timestamps which + are not pre-synchronized to GPS time +
  • Added patch to avoid crash bug in Canon DPP software when OwnerName is set + to a value that is exactly 3 characters long (doh!) +
  • Added a few new Olympus LensType's (thanks Godfrey DiGiorgi) +
  • Added a couple more Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added minor warning when fixing invalid counts in Kodak MakerNotes +
  • Decode a few new tags and values for the Panasonic GF1 +
  • Improved parsing of command-line arguments to remove order dependencies of + certain options +
  • Minor improvement to decoding of Olympus FaceDetect tag +
  • Changed "Error reading PreviewImage from file" to a minor warning +
  • Changed conversion of Canon MeasuredEV to correspond more closely to + LightValue (by adding 5 to the MeasuredEV value, which seems to be good for + all EOS models, but it may be high by up to 1 EV for some PowerShot models) +
  • Fixed problems decoding some CameraInfo tags for the Canon 7D with the new + production firmware (1.0.7) +
  • Fixed problems writing some CameraInfo tags for the Canon 50D and 5DmkII +
+ +Sept. 24, 2009 - Version 7.95 +
    +
  • Added read support for LNK (Windows shortcut) file metadata +
  • Added patch to fix incorrect count written by a number of recent Kodak + cameras to some tags in SubIFD3 of the MakerNotes +
  • Added a few more Sony/Minolta LensType's +
  • Added a couple more Canon LensType's (thanks Norbert Wasser) +
  • Added a PentaxModelID for the new K-x +
  • Decode a couple more Canon VignettingCorr tags +
  • Improved Canon FocusDistance conversions to indicate "inf" for maximum value +
  • Improved DOF calculation to use SubjectDistance if FocusDistance is not + available +
  • Changed -fast, -scanForXMP and -unknown options to also apply when copying + tags with -tagsFromFile +
+ +Sept. 11, 2009 - Version 7.94 +
    +
  • Added support for Leica M9 makernote format and decode a few new tags +
  • Added a few new Leica LensType's +
  • Added support for IGC GPS track logs (thanks Lionel Genet) +
  • Added a number of alternate Macintosh character sets and changed a couple of + character set names for -charset option +
  • Decode even more Sony A100 tags (thanks Igal Milchtaich!) +
  • Improved handling of FlashPix character translations +
  • Changed a couple of Sony and Minolta AF tag names to be more consistent +
+ +Sept. 5, 2009 - Version 7.93 +
    +
  • Added a new CanonModelID +
  • Added a couple of new Nikon LensType's (thanks Robert Rottmerhusen) +
  • Added a few new Pentax LensType's +
  • Decode a number of new tags for the Canon EOS 7D +
  • Calculate Duration for WAV audio files +
  • Allow exponents when writing GPS coordinates (eg. "-gpslatitude=7.657e+01") +
  • Print available character sets if no CHARSET is given for -charset option +
  • Improved -v3 and -htmldump output to show MPF image data +
  • Fixed -E option to work with tag descriptions when -lang option used +
  • Fixed problem reading large FlashPix-format documents +
  • API Changes: + +
+ +Aug. 29, 2009 - Version 7.92 +
    +
  • Fixed new "-charset iptc=CHARSET" feature to work with -tagsFromFile +
+ +Aug. 29, 2009 - Version 7.91 +
    +
  • Added -charset option and support for additional Windows and Mac character + sets. Character sets now supported are: UTF-8, Latin1, Latin2, Cyrillic, + Greek, Turkish, Hebrew, Arabic, Baltic, Vietnam, Thai and MacRoman +
  • Fixed problem with some duplicate Nikon LensID's +
  • Fixed incorrect Duration calculation for multi-channel FLAC audio files +
  • Compatibility Notice: Removed "CreatorContactInfo" shortcuts which were + added to ease the transition when some Iptc4xmpCore tag names were changed + in version 7.45 +
  • API Changes: + +
+ +Aug. 24, 2009 - Version 7.90 +
    +
  • Added -ex (-escapeXML) option +
  • Added a few more Minolta M42-type lenses (thanks Lukasz Stelmach) +
  • Added a number of new CanonModelID's +
  • Decode more Sony A100 tags (thanks Igal Milchtaich) +
  • Decode a few more Kodak WhiteBalance tags +
  • Decode a couple more JPEG APP segments +
  • Internal changes to Composite tag calculation algorithm +
  • Patched problem with renaming files on OS/2 that caused failed tests +
+ +Aug. 18, 2009 - Version 7.89 (production release) +
    +
  • IMPORTANT: Not quite done with NRW fixes -- fixed similar bug which could + corrupt NRW images when writing new values larger than 10 MB +
+ +Aug. 17, 2009 - Version 7.88 (production release) +
    +
  • IMPORTANT: Fixed bug introduced in version 7.77 which causes Nikon NRW + images to be corrupted when writing +
  • Decode a number of Sony A100 Camera Settings tags (thanks Igal Milchtaich) +
  • Improved accuracy of some CameraInfo values for Canon PowerShot models +
  • Tolerate blank lines in PDF xref tables +
  • Fixed problem where -E didn't escape values when copying with -tagsFromFile +
  • Fixed bug identifying AF Micro-Nikkor 105mm f/2.8D lens +
+ +Aug. 14, 2009 - Version 7.87 +
    +
  • Added a new Sony lens (thanks Lukasz Stelmach) +
  • Added a few new Pentax City and PictureMode values (thanks Niels Kristian + Bech Jensen) +
  • Added lookup for XMP-photoshop:Urgency +
  • Added a few new Nikon RetouchHistory values +
  • Decode a number of new Sony tags for the A700 (thanks Rüdiger Lange) +
  • Decode Canon PeripheralLighting tags +
  • Decode Olympus AFFineTuneAdj (thanks Yrjo Rauste) +
  • Extract System tags from unknown file types +
  • Enhanced -E option to work when writing, and when used in combination with + other options such as -p +
  • Tolerate white space around "=" in XMP attributes (allowed by XML spec) +
  • Improved error handling when parsing bad EXIF IFD entries +
  • API Changes: + +
+ +July 25, 2009 - Version 7.86 +
    +
  • Added support for reading Garmin TCX track logs with the -geotag option +
  • Added a number of new Canon, Olympus and Pentax LensType's +
  • Enabled writing of .AI (Adobe Illustrator) files +
  • Minor changes to DICOM decoding +
+ +July 21, 2009 - Version 7.85 +
    +
  • Added a new Sony LensType +
  • Added a new Pentax LensType (thanks Albert Bogner) +
  • Added a new PentaxModelID value (Optio W80) +
  • Added a few new JPEGDigest values (thanks Franz Buchinger) +
  • Added check for proper support of IFD-format value types +
  • Decode Nikon D300 firmware 1.10 camera settings (thanks Stuart Solomon) +
  • Improved handling of Olympus makernotes for recent models and fixed error + messages resulting from makernote format changes in Stylus 550WP images +
  • Improved geotagging by allowing different NMEA sentences with slightly + different timestamps (within 10 seconds) in the same fix +
  • Fixed decoding of some CameraSettings tags for the new Sony A330 and A380 +
  • API Changes: + +
+ +July 16, 2009 - Version 7.84 (Windows only) +
    +
  • Fixed bug in -geotag option of Windows version when using wildcards in the + GPS track filename +
+ +July 13, 2009 - Version 7.83 +
    +
  • Added preliminary read support for M2TS/AVCHD video files (much pain for + little gain) +
  • Added family 4 group names (instance number) to provide a technique for + differentiating same-named tags extracted from the same location via the + command-line application +
  • Added a new family 1 group ("System") to differentiate tags obtained from + the file system +
  • Added a couple of new Canon LensType values +
  • Decode ID3 Picture attributes +
  • Decode ICC_Profile ColorantTableOut +
  • Changed application to return a value of 1 if all files fail condition +
  • Made the IPTC CodedCharacterSet tag "unsafe" to copy by default (since this + could result in incorrect encoding for existing IPTC in the destination + image) +
  • Fixed bug handing some non-standard offset formats when writing EXIF +
  • Fixed problem with MakerNote warnings for Samsung WB500 +
  • Fixed problem reading Leica M8 makernotes when copied between JPEG and DNG + images +
  • Fixed problem extracting ThumbnailImage from Sanyo VPC-FH1 MP4 videos +
  • Fixed problem extracting ThumbnailImage from some Sony DSLR-A100 ARW images + (due to a bug in some A100 firmware versions which results in incorrect + ThumbnailOffset values) +
+ +July 2, 2009 - Version 7.82 (production release) +
    +
  • Added a new Canon LensType (thanks Norbert Wasser) +
  • Decode another Nikon AVI tag +
  • A number of improvements, bug fixes and additions to ID3 decoding +
+ +June 28, 2009 - Version 7.81 +
    +
  • Added a few missing print conversions to Nikon, Kyocera and FlashPix + date/time tags +
+ +June 26, 2009 - Version 7.80 +
    +
  • IMPORTANT: Fixed bug introduced in 7.77 which had the potential to corrupt + TIFF-format images when writing to an image containing a SubIFD tag larger + than 10 MB (not that I've ever seen one of these in the wild) +
  • Added support for DNG version 1.3 +
  • Decode makernotes in Nikon AVI videos +
  • Decode QuickTime MatrixStructure tag and added Composite Rotation tag to + calculate the rotation of the QuickTime video track +
  • Updated CanonCustom tags for the EOS 500D +
  • The -fast option now stops parsing of WAV and AVI files at audio/video data +
  • API Changes: +
      +
    • Improved handling of $/ by localizing internally +
    +
+ +June 20, 2009 - Version 7.79 +
    +
  • Added read/write support for Adobe InDesign files (.IND, .INDD, .INDT) +
  • Added ability to geotag with KML files (Note: each Placemark must contain a + TimeStamp for this to work) +
  • Added undocumented XMP-xmp PagInfo tags written by Adobe InDesign +
  • Added conversion for MPF:PanOrientation +
  • Many improvements and additions to Olympus and Panasonic makernote decoding +
  • Improved logic of -scanForXMP option +
  • Recognize MPO file extension (Extended Multi-Picture format) +
  • Distinguish between infinite (inf) and undefined (undef) rational values +
  • Changed namespace prefixes for xapG and xapGImg to match current XMP spec +
  • Changed print conversion for Casio AFPointPosition +
  • Made "Error reading value" warning minor when reading makernotes values +
  • Allow all tags to be deleted from an XMP file +
  • Fixed group names for a few Panasonic and Sony makernote tags +
+ +June 13, 2009 - Version 7.78 +
    +
  • Added read support for the new CIPA standards: Multi Picture Format (MPF) + and Stereo Still Image format (Stim) +
  • Added support for Kodak type 10 makernotes (Z980) +
  • Added a new Pentax LensType and a new Nikon LensID (thanks Jens Duttke) +
  • Added %C format code for output file names +
  • Decode a number of camera settings from Sony DSLR images +
+ +June 7, 2009 - Version 7.77 +
    +
  • Added -struct option for JSON (-j) and XML (-X) outputs +
  • Added 2 new Pentax LensType's and a PentaxModelID (thanks Jens Duttke) +
  • Decode large preview in APP2 of images from newer Samsung models +
  • Extract FujiFilm PreviewImage from improperly written FPXR segment +
  • Improved decoding of Nikon WB levels for some models +
  • Reduced memory usage when writing DNG and some other RAW image files +
  • Changed format of Canon D30 SerialNumber to remove the hyphen and add + leading 0's if less than 9 characters (now same format as printed on camera) +
  • Changed writing of GPSTimeStamp and GPSDateStamp to adjust date/time to UTC + if it contains a timezone, and added timezone ("Z") to Composite:GPSDateTime +
  • Suppress "Unlisted FPXR segment (index 255)" warning from some Kodak images +
  • Suppress "Unrecognized MakerNotes" warning for Samsung STMN-type maker notes +
  • Made "Unrecognized MakerNotes" a minor warning +
  • Fixed problems reading/writing large PreviewImage in some Sony JPEG images +
  • Fixed problem decoding some base64 values in XML files +
  • API Changes: + +
+ +May 20, 2009 - Version 7.76 +
    +
  • Added support for Leica RWL raw images (just RW2 with a different name -- + Panasonic is pulling the same dumb stunt as Nikon with NRW) +
  • Added ability to specify geotagging parameters via config file +
  • Added two new Canon LensType's (thanks Jose Oliver-Didier) +
  • Added a couple more Panasonic FilmMode values +
  • Added bitmapped value lookups to -listx output +
  • Decode Panasonic face recognition information (DMC-TZ7) +
  • Decode some new FujiFilm face detection tags +
  • Implemented language translations for bitmapped values +
  • Enhanced -geotag option to allow wildcards in track file name +
  • Minor changes to Nikon AF point decoding +
  • Allow empty string when writing unknown values (ie. "Unknown ()") +
  • Pad numerical IPTC values with zeros if necessary when writing +
  • Fixed problem with -geotag feature interpolating in some NMEA logs +
  • API Changes: +
      +
    • Added GeoMaxHDOP, GeoMaxPDOP, GeoMaxIntSecs and GeoMaxExtSecs options +
    +
+ +May 9, 2009 - Version 7.75 +
    +
  • Added a few new translations (thanks Jens Duttke et al) +
  • Added warning when stream mode data is encountered in a ZIP file (this + is currently not supported) +
  • Added a couple of new Nikon ActiveD-Lighting values (thanks Werner Kober) +
  • Added and changed some Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added ability to specify user-defined option defaults in config file +
  • Added write support for FujiFilm S5Pro firmware 1.11 RAF images +
  • Decode AF point information for more Nikon models (thanks Werner Kober) +
  • Improvements to new geotagging feature +
  • Changed language code for simplified Chinese from "zh_s" to "zh_cn" +
  • Changed user-defined shortcuts to Image::ExifTool::UserDefined::Shortcuts +
  • Limit PrintConv precision of Composite GPSAltitude to 1 decimal place +
  • API Changes: +
      +
    • Changed WriteInfo() to use a temporary file instead of a memory buffer + when a source file name is given with no destination file +
    • Attempt (yet again) to fix problems when UTF-8 encoded strings are + passed to exiftool functions +
    +
+ +Apr. 10, 2009 - Version 7.74 +
    +
  • Added geotagging feature and new -geotag option (guess who finally bought a + hand-held GPS!) +
  • Added a few new Casio RecordMode values +
  • Decode FujiFilm EXRAuto and EXRMode tags (FinePix F200EXR) +
  • Decode Olympus ArtFilter tag +
  • Allow EXIF ISO to have multiple values as per EXIF spec +
  • Improved XMP-exif and XMP-tiff list-type tags to allow copying from EXIF +
  • Changed handling of ComponentsConfiguration to facilitate copying between + EXIF and XMP +
  • Changed name of EXIF tag 0x9214 from SubjectLocation to SubjectArea to match + EXIF specification +
  • Changed behaviour when writing pre-existing EXIF tags to use the standard + EXIF field type instead of preserving the existing type (fixes problem + rewriting some incorrectly typed EXIF tags) +
  • Fixed error if a shift value is not given when shifting a date/time tag +
  • Fixed makernote offsets error message when writing Pentax Optio WP images +
  • API Changes: +
      +
    • Added EditOnly option to SetNewValue() +
    +
+ +Mar. 31, 2009 - Version 7.73 +
    +
  • Added write support for Panasonic RW2 images (including IPTC and XMP) +
  • Added ability to write IPTC and XMP to Panasonic/Leica RAW images and fixed + bug introduced in version 7.64 which disabled write support for these images +
  • Added a new Canon EasyMode value (thanks Irwin Poche) +
  • Added a number of new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added CanonModelID for the new 500D +
  • Decode many CameraInfo and ColorData tags for the Canon EOS 500D +
  • Decode track-level 'meta' atom in MOV videos +
  • Enhanced Canon Composite:ShootingMode logic to distinguish Bulb mode +
  • Improved decoding of Canon TargetExposureTime +
  • Changed name of Panasonic RW2 PreviewImage to JpgFromRaw +
  • Fixed bug where JPEGDigest wasn't generated for some images +
  • Fixed problem where -F didn't permanently fix makernote offsets for some + images when writing +
  • Fixed bug decoding Canon RawMeasuredRGGB and MeasuredRGGBData which resulted + in a failed test on 64-bit systems +
+ +Mar. 20, 2009 - Version 7.72 +
    +
  • Added a new Minolta/Sony LensType (thanks Jens Duttke) +
  • Added support for localized language descriptions of "lang-alt" tags +
  • Added support for Nikon NRW files (please just kill me now) +
  • Added two new PentaxModelID's and a new PentaxImageSize +
  • Decode Pentax PEF HuffmanTable as Unknown Binary tag +
  • Decode Leaf and Kodak records in DNGAdobeData information +
  • Made "Empty PrintIM data" a minor warning +
  • Minor improvement to Canon lens recognition logic +
  • Changed Composite:LensID to also return a value for Olympus lenses +
  • Changed copying behaviour to preserve the specific location (family 1 group) + when source group is specified and destination group is "all" or "*" + (eg. "-exif:all>all:all" now preserves the IFD of each tag) +
  • Fixed a number of incorrect Minolta/Sony lens names (thanks Olaf Ulrich) +
  • Fixed bug rewriting MIE trailers on TIFF images +
+ +Mar. 12, 2009 - Version 7.71 +
    +
  • Added a new Pentax LensType (thanks Akos Szalkai) +
  • Added a new Canon LensType (thanks Kurt Garloff) +
  • Added new PentaxModelID for the Optio P70 +
  • Added XMP list-type flag (Alt, Bag or Seq) to "-f -listx" output +
  • Decode a number of new Canon tags (thanks Vesa Kivisto) +
  • Removed unreliable Canon Composite FlashOn tag (use Flash instead) +
  • Removed Nikon FlashModel tag and replaced it with ExternalFlashFirmware +
  • Changed tags in Canon "ColorBalance" tables to signed integer and renamed + the tables to "ColorData" +
  • Changed formatting for Canon FocalUnits +
  • Changes to -X output: +
      +
    • Now uses 'rdf:datatype' instead of 'et:encoding' (thanks Alexander Vonk) +
    • Improved long (-l) output to produce valid RDF/XML, and added 'et:val' +
    +
  • Improved handling of unknown XMP lang-alt tags +
  • Fixed family 2 group names for a few tags +
+ +Feb. 26, 2009 - Version 7.70 +
    +
  • Added a few new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added a number of new CanonModelID's +
  • Added ability to use -f before -listx to output 'flags' attribute +
  • Added xml:lang attribute to -X output (when used with -t, -H or -D) to + identify alternate language entries for XMP lang-alt tags +
  • Decode Canon ImageUniqueID and added a new EasyMode value +
  • Created "unsafe" shortcut used when rebuilding JPEG EXIF metadata from + scratch +
  • Changed Olympus lens "pre-release" designation to "release 1" +
  • Changed exiftool to continue after encountering "Error opening directory" +
  • Enhanced makernote-offset-fix logic to account for problems like those + caused by bugs in Picasa and ACDSee +
  • API Changes: +
      +
    • Enhanced GetTagID() to also return language code in list context +
    +
+ +Feb. 17, 2009 - Version 7.69 +
    +
  • Added a new Nikon LensID (thanks Jens Kriese) +
  • Added a new Pentax LensType (thanks Jens Duttke) +
  • Added Extra JPEGDigest tag +
  • Recognize new Panasonic APP2 MPF information written by FX40 +
  • Improved -@ option to allow a UTF-8 BOM at the start of the input file +
  • Augmented -listx output to include indexed value conversions +
  • Changed Japanese and Chinese language codes to 'ja' and 'zh' (ISO 639-1) +
  • Fixed a few problems with some CanonCustom tags +
+ +Feb. 13, 2009 - Version 7.68 +
    +
  • Added French translations for XMP and Composite tags (thanks Jean Piquemal) +
  • Decode Panasonic AdvancedSceneMode, added a few more SceneMode values, and + fixed incorrect format for TextStamp +
  • Decode a missing Canon 1DmkII custom function +
  • Changed Czech language code to 'cs' (as per ISO 639-1) +
  • Relaxed XMP date/time validation to allow writing year-only and year-month + values (YYYY and YYYY:MM) without requiring the -n option +
  • More work on language translations (this will be ongoing) +
  • Fixed problem shifting XMP date/time values with missing seconds +
  • Fixed some family 1 group names in -listx output +
+ +Feb. 9, 2009 - Version 7.67 (production release) +
    +
  • IMPORTANT: Fixed bug introduced in version 7.01 which could cause corruption + of TIFF-format images in very rare situations when adding tags to an image + containing very large (> 10 MB) binary data blocks +
+ +Feb. 7, 2009 - Version 7.66 +
    +
  • Improved language support +
  • Changed conversion for a couple of the EXIF Flash values +
  • Removed trailing white space from Make and Model values +
  • Removed null terminators that may be left on some string values +
  • Fixed problem with family 1 group names for QuickTime Date tags +
  • Fixed problem with invalid names being generated for some unknown tags +
  • Fixed decoding of ASF PreviewMimeType and PreviewDescription +
  • Fixed formatting problems with -j output when combined with some options +
+ +Feb. 5, 2009 - Version 7.65 +
    +
  • Added -j option for JSON (JavaScript Object Notation) output format +
  • Improved French language translation for File group (thanks Jean Piquemal) +
  • Enhanced -listx option to give short output when used after -s +
  • Renamed "tagid" attribute to "id" in -X output to match -listx output +
  • Fixed bug introduced in 7.64 which resulted in runtime warning when + extracting non-existent tags with the -f option +
  • Fixed problem which could cause runtime error with -listx option on some + systems +
+ +Feb. 3, 2009 - Version 7.64 - "Babel fish" +
    +
  • Added -listx and -lang options +
  • Added preliminary support for the following languages (thanks Jens!): +
      +
    • en [default] +
    • ch_s (thanks Haibing Zhong) [renamed 'zh_cn' in 7.75] +
    • cz (thanks Petr Michálek) [renamed 'cs' in 7.68] +
    • de (thanks Jens Duttke) +
    • en_ca (for those of us who like to see "colour" spelled properly) +
    • en_gb (correct "colour" plus a few other quirks) +
    • es (thanks Santiago del Brío González) +
    • fr (thanks Bernard Guillotin) +
    • it (thanks Emilio Dati) +
    • jp (thanks Kazunari Nishina) [renamed 'ja' in 7.69] +
    • nl (thanks Peter Moonen and Herman Beld) +
    • pl (thanks Przemyslaw Sulek) +
    +
  • Added support for new XMP Windows Live Photo Gallery tags +
  • Decode two new Panasonic tags and improved decoding of some others +
  • Decode a few new 3rd party EXIF and IPTC tags +
  • Enhanced -X output by adding -t feature for tag table information +
  • Improved decoding of Photoshop ClippingPathName and remove Unknown flag +
  • Renamed Panasonic EXIF "Title" tag to "PanasonicTitle" and improved decoding +
  • Fixed problem which could cause crash if reading corrupted images on Windows +
  • Fixed inconsistencies rewriting XMP which uses extra rdf:Description + elements instead of rdf:parseType='Resource' attribute +
  • Fixed decoding of Nikon D40 RemoteOnDuration +
  • API Changes: + +
+ +Jan. 23, 2009 - Version 7.63 +
    +
  • Added new Composite tags: SubSecCreateDate and SubSecModifyDate +
  • Decode Sony DSLR WB_RGBLevels tags (thanks Andrey Tverdokhleb) +
  • Decode a few more NikonScan tags (thanks Brendt Wohlberg) +
  • Included new argument files in distribution: xmp2exif.args and exif2xmp.args +
  • Improved decoding of PentaxModelID for K-m and K2000 +
  • Minor change to decoding of Canon 1DmkIII ISOSpeedRange +
  • Downgrade "MRW format error" to a warning when reading ARW images containing + MRW information that has been corrupted by the Sony IDC utility +
  • Renamed Kodak SubSecTime tag to Time +
  • Changed Composite DateTimeCreated tag to use only IPTC tags +
  • Changed name of Sony/Minolta MRW WBLevels tag to reflect ordering of color + components +
  • Fixed problems recognizing some MP3 files +
+ +Jan. 16, 2009 - Version 7.62 +
    +
  • Decode a number of new tags for recent Canon EOS models +
  • Decode ID3v2.3 Compilation tag (written by iTunes) +
  • Added a number of new ID3 genre's and improved ID3v2 genre conversion +
  • Avoid converting MIE ISO 8859-1 string values +
  • Enhanced XML output (-X) to work with binary data (-b) option and encode + values in base64 if necessary +
  • Fixed problem with invalid UTF-8 when writing XMP or using -X (XML) option +
+ +Jan. 10, 2009 - Version 7.61 +
    +
  • Added a new Pentax LensType and a new PentaxModelID (thanks Denis Bourez) +
  • Added ability to copy makernotes from Pentax or Samsung native DNG image +
  • Decode makernotes in Samsung GX model DNG images +
  • Decode CameraTemperature for Canon EOS cameras with Live View (thanks + Karl-Heinz Klotz) +
  • Decode a number of Canon 5DmkII CameraInfo tags +
  • Included 2 new argument files in distribution: xmp2gps.args and gps2xmp.args +
  • Prevent writing of TIFF images containing the obsolete (and unsupported) + TIFF 6.0 JPEG extensions +
  • Fixed bug which could result in runtime warning when writing makernotes as a + block +
+ +Jan. 6, 2009 - Version 7.60 (production release) +
    +
  • Decode a few more Nikon D700 FlashInfo tags (thanks Jens Duttke) +
  • Defined (empty) XMP-pdfx tag table, mainly for documentation purposes +
  • Fixed problem where the behaviour of -tagsFromFile changed to that of + -addTagsFromFile if the first specified tag was an exclusion +
  • Fixed XMP writer to allow a namespace to be deleted after a mass copy +
  • Fixed bug introduced in 7.58 which could cause hang when using -tagsFromFile +
+ +Dec. 23, 2008 - Version 7.59 +
    +
  • Removed file size limit when setting tag value from contents of a file +
+ +Dec. 22, 2008 - Version 7.58 +
    +
  • Added new Canon, Nikon and Olympus lenses (thanks Jan Boelsma and Geert De + Soete) +
  • Added write support for FujiFilm S5000 Ver3.00 and S9500 Ver1.01 RAF images +
  • Extract RAFVersion tag from FujiFilm RAF images +
  • Decode ColorBalance information for PowerShot G10 +
  • Decode Sharpness for Canon EOS 50D +
  • More improvements to Canon 50D and 5DmkII makernote decoding +
  • Attempt to identify unknown Nikon lenses which exist in LensID list with a + different LensIDNumber (to patch Sigma lens renumbering debacle) +
  • Removed limit of 1000 items in an XMP list-type tag when writing +
  • Increased maximum size of file from 16MB to 100MB when setting tag value + from the contents of a file +
  • Improved performance when extracting a large number of same-named tags +
  • Fixed bug which resulted in "segment too large" error message when rewriting + multi-segment XMP if XMP was edited but nothing was actually changed +
+ +Dec. 11, 2008 - Version 7.57 +
    +
  • Added read support for Panasonic RW2 raw images (and extract meta + information from embedded PreviewImage as Doc1) +
  • Added new Pentax K-m PictureModes and new PentaxModelID for the Optio S12 +
  • Decode ColorBalance information for Canon 50D and 5DmkII +
  • Decode Panasonic RAW/RW2 information from DNG images +
  • Decode Canon SRAWQuality tag +
  • Recognize DCP (DNG Camera Profile) files +
  • Updated Canon CustomFunctions for the EOS 5D Mark II +
  • Changed name of "OtherImage" tags to "JpgFromRaw" in IFD0 of SR2 and ARW + images, and to "ThumbnailImage" in IFD0 of MRW images +
  • Changed EXIF DeviceSettingDescription and ProfileLookTableData to binary + data tags +
  • Fixed problem reading/writing ThumbnailImage in Minolta A200 MRW images +
  • Fixed ColorBalance2 tags for AsShot and Auto modes of Canon 1DmkII/1DSmkII +
+ +Dec. 2, 2008 - Version 7.56 +
    +
  • Decode CompressorVersion from Canon 5D Mark II videos +
  • Fixed family 1 group classifications for tags in QuickTime video tracks +
  • Fixed problem with new -sep feature when separator contained spaces +
+ +Dec. 2, 2008 - Version 7.55 +
    +
  • Added a number of new CanonVRD tags for DPP 3.4/3.5 (thanks Bogdan) +
  • Added a new FocusMode for the Pentax K-m +
  • Added a new Nikon LensID (thanks Niels Kristian) +
  • Decode some tags from Kodak C1013 maker notes (type 9) +
  • Enhanced -sep option to allow list-type tag values to be split when writing +
  • API Changes: + +
+ +Nov. 26, 2008 - Version 7.54 +
    +
  • Added a few old XMP-crs tags that were missed +
  • Show numerator and denominator for rational EXIF values in verbose mode +
  • Changed htmldump tooltip font +
  • Fixed bugs in HTML reader that could cause runtime error or hang +
+ +Nov. 19, 2008 - Version 7.53 +
    +
  • Added read/write support for EXIF files +
  • Added ability to write EXIF as a block (finally!) +
  • Added ability to write CanonVRD information to MIE files +
  • Added timezone to "Now" tag value +
  • Added a new CanonModelID (FS100) +
  • Added write support for ACDSee XMP tags (XMP-acdsee:RPP) +
  • Added a few new XMP-cc tags +
  • Decode CameraOrientation for a number of Canon EOS models (thanks Bogdan) +
  • Allow XMP to be copied as a block with -tagsFromFile option +
  • Highlight odd value offsets in -htmldump output +
  • Improved htmldump tooltip display +
  • Minor improvements to MIE reader +
  • API Changes: +
      +
    • The full XMP block is now extracted with the Binary option, so the XMP + block is marked as "unsafe" and the Protected flag must be set (as with + other writable blocks) when calling SetNewValue() +
    +
+ +Nov. 4, 2008 - Version 7.52 +
    +
  • Added ability to extract AI private data from PDF files +
  • Added extract embedded option (-ee, -extractEmbedded) +
  • Added new group family 3 and ability to specify multiple group names for a + single tag when extracting information +
  • Added a new Sony lens and decode two new Sony tags (thanks Jens Duttke) +
  • Added a few new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added a new Olympus LensType (thanks Michael Meissner) +
  • Decode a few new Nikon tags (thanks Jens Duttke) +
  • Enhanced command line parsing to allow long names for most options +
  • Improved verbose output when writing makernotes +
  • Allow writing of empty string values in EXIF information +
  • Fixed problem rewriting XMP lists that contained no entries +
  • Fixed bug writing JpgFromRaw and ThumbnailImage to CRW files that could make + the image unreadable by Canon utilities (affected images may be repaired by + rewriting the same tag with this version of exiftool) +
  • Fixed bug where some Canon MakerNote values could not be written +
  • Fixed bug introduced in version 7.49 that broke the use of wildcards in + filenames for the Windows version +
  • API Changes: +
      +
    • Enhanced a number of functions to accept multiple group names separated + by colons +
    +
+ +Oct. 27, 2008 - Version 7.51 (production release) +
    +
  • Fixed problems which caused failed test or warning with Perl 5.6 or older + (does do not affect Mac or Windows versions) +
  • Fixed Windows application so help is displayed when run with no options +
+ +Oct. 26, 2008 - Version 7.50 (production release) "XMP 2008" +
    +
  • Added a number of new XMP tags from new XMP specification released Oct. 17 +
  • Added support for extended XMP segment in JPEG images (as per new XMP spec) +
  • Added a number of new Minolta/Sony lenses (thanks Jens Duttke) +
  • Added a new Canon LensType (thanks Andreas Huggel and Pascal de Bruijn) +
  • Added new PRISM 2.1 XMP tags +
  • Added ability to read/write x:xmptk attribute (via XMP-x:XMPToolkit tag) +
  • Added ability to specify user-defined Lenses +
  • Decode XMP in ASF (WMA/WMV), FLV, SWF and MP4 audio and video files +
  • Preserve byte order of EXIF information when copying to MIE file +
  • Allow byte order for newly created MIE files to be set by ExifByteOrder tag + (and API ByteOrder option) +
  • Allow backslashes in filenames on non-Windows-like systems +
  • Removed 's' from XMP-xmp:Thumbnails tag names and set Avoid flag for + XMP-xmp:ThumbnailImage +
  • Fixed definitions of some XMP-xmpDM tags +
  • Fixed some PDF reader bugs (thanks Leonhard Zachl for one patch) +
  • API Changes: + +
+ +Oct. 16, 2008 - Version 7.49 +
    +
  • Added new PentaxModelID for K-m/K2000 plus a new LensID used by K-m +
  • Added --a option and made -a the default behaviour for the -X option +
  • Added ability to read/write XMP-rdf:about attribute +
  • Added new "Resource" flag which may be set in user-defined XMP tags to write + a value as an rdf:resource instead of a normal string +
  • Allow decimal (real) values to be written to XMP-xmp:Rating (contrary to + current XMP specification, but as per MWG recommendation) +
  • Fixed file renaming bug in Windows that caused the file to be moved into the + current directory instead of leaving it in the original directory when the + source file was specified using backslashes as directory separators +
+ +Oct. 14, 2008 - Version 7.48 +
    +
  • Added support for XMP PRISM 2.0 schema tags +
  • Added two more ZIP compression types +
  • Added conversions for XMP-plus date tags +
  • Changed conversion of all Digest tags to make the -n value readable +
  • Changed some error handling to avoid generating console warnings +
+ +Oct. 11, 2008 - Version 7.47 - "Jumbo" +
    +
  • Added -X option to output extracted information in XML format +
  • Added -listwf option to list extensions of writable files +
  • Added a number of new Nikon and Pentax LensTypes (thanks Robert + Rottmerhusen, Jens Duttke and Bozi) +
  • Decode Canon 1000D custom functions +
  • Decode a number of new tags written by Nikon Capture NX 2 +
  • Decode many FlashInfo tags for the Nikon D90 and D700 +
  • Implemented character set translation for MIE information (-L option) +
  • Improved speed when scanning unknown file to determine FileType +
  • Fixed bug where some writable EXIF tags gave a "not writable" message when + reading tag value from a dynamic file (eg. "-TAG<=%f.txt") +
  • Fixed problem double-escaping characters when -h and -S were used together +
  • Fixed decoding of Nikon FlashModel for SU-800 Remote Commander +
  • Fixed swapped Nikon FlashGroupBControlMode/FlashGroupCControlMode tags +
  • Fixed bug reading PDF files that could cause "Argument isn't numeric in + subtraction" warning (note that writing PDF files with this problem could + cause format errors which may be fixed by reverting with "-pdf-update:all=") +
  • API Changes: +
      +
    • Fixed CanWrite() to be consistent with documentation +
    +
+ +Oct. 2, 2008 - Version 7.46 +
    +
  • Fixed bug which could cause a runtime warning when writing images in a + directory containing an unrecognized file type +
  • Fixed an IPTC-XMP test that failed in other time zones (this was a test + problem, not an exiftool bug) +
+ +Oct. 1, 2008 - Version 7.45 +
    +
  • Added support for new XMP IPTC Extension 1.0 tags (rev 2) +
  • Added a few more TIFF Compression values (for MDI files) +
  • Decode a few new Nikon Flash tags +
  • Decode Canon 50D custom functions +
  • Calculate CurrentIPTCDigest tag (if Digest::MD5 is available) +
  • Renamed Photoshop CaptionDigest tag back to IPTCDigest again +
  • Avoid touching IPTC data block when only Photoshop information is changed +
  • Allow IPTCDigest to be set to the special value of 'new', representing the + new IPTC digest of the output file +
  • Updated iptc2xmp.args and xmp2iptc.args to write IPTCDigest as per MWG + recommendation +
  • Allow zone-less date/time values in XMP (as per MWG and upcoming XMP spec) +
  • Allow brackets in $$ and $/ expressions (eg. ${$} and ${/} now work) +
  • Changed decoding of EXIF:Copyright to allow two separate strings as per spec +
  • Changed a number of XMP Iptc4xmpCore tag names and added a corresponding set + of aliases (shortcuts) for backward compatibility +
  • Changed some XMP xmpTPg tag names +
  • Fixed problem extracting lists from other information types in MIE files +
+ +Sept. 26, 2008 - Version 7.44 +
    +
  • Added read support for DjVu images +
  • Added two new Sony LensType's (thanks Mladen Sever) +
  • Added a new Pentax LensType (thanks Jens Duttke) +
  • Decode a few new Canon 450D and 1000D tags (thanks Bogdan) +
+ +Sept. 17, 2008 - Version 7.43 +
    +
  • Added two new Pentax LensTypes (thanks Jens Duttke and Anton Bondar) +
  • Added PentaxModelID's for the Optio E60 and M60 +
  • Added a number of new CanonModelID's +
  • Extract XMP from MOV and AVI videos (as written by Adobe CS3 Bridge) +
  • Decode information from QuickTime HintInfo atoms (hinf and hnti) +
  • Decode Canon 50D/5DmkII AutoLightingOptimizer +
  • Enable writing of ThumbnailImage in CR2 images +
  • Avoid extracting invalid Canon FocusDistance tags +
  • Improved handling of timezones in date/time values (fixes failed EXE test) +
+ +Sept. 11, 2008 - Version 7.42 +
    +
  • Added read support for Windows, MacOS and Unix executable and library files +
  • Added read support for ZIP and RWZ (Rawzor) compressed files +
  • Added a number of new XMP tags written by PS Elements 4.0 (thanks Drew + Holland) and LightRoom 2.0 +
  • Added new Sony, Canon and Nikon LensTypes (thanks Jens Duttke and Werner + Kober) +
  • Decode a few new Canon CameraInfo tags for the 40D, 50D, 450D and 1000D + (thanks D.J. Cristi) +
  • Decode Nikon D90 LensData +
  • Define version number etc. in properties of exiftool Windows executable +
  • Improved handling of corrupted makernote offsets when writing +
  • Fixed problem where FileType could be incorrect for a TIFF-based file with + the wrong extension +
+ +Aug. 28, 2008 - Version 7.41 +
    +
  • Added new Composite LensID tag and changed a number of LensType values in + an attempt to disambiguate Canon, Pentax, Minolta and Sony 3rd party lenses +
  • Added -sep option to specify separator for values in list-type tags +
  • Added a new Nikon LensID (thanks Jens Duttke) +
  • Added CanonModelID values for new models (SX110, A1000, A2000, E1, 50D) +
  • Decode some CameraInfo tags of the Canon EOS 450D and 1000D (thanks Bogdan) +
  • Decode a few new tags in Kodak MOV videos +
  • Updated CanonVRD decoding for version 3.40 (DPP 3.4.1, thanks Bogdan) +
  • Allow writable EXIF properties to be overridden by user-defined tags +
  • Relaxed PDF parsing to allow xref tables with zero entries +
  • Renamed Sigma LensID tag to LensType +
  • Changed PDF update structure to better conform with PDF specification +
  • Changed conversion of Olympus ManometerReading values +
  • Reverted back to Perl 5.8 for Windows EXE version (fixes problem running + exiftool.exe using a non-standard TEMP directory) +
  • Patched DST problem in Windows when "Automatically adjust clock for daylight + savings time" is used in Windows Date and Time settings +
  • Fixed problems in the QuickTime parser that could cause exiftool to hang +
  • Fixed bug which could cause an error to be reported when writing a DNG image + containing ProfileIFD information +
  • API Changes: + +
+ +Aug. 17, 2008 - Version 7.40 +
    +
  • Fixed -p option in Windows executable version (caused by packaging problem + with Perl 5.10 release) +
+ +July 30, 2008 - Version 7.39 +
    +
  • Added a number of new Canon LensType values (thanks Rich Taylor) +
  • Added a new Pentax LensType (thanks Jens Duttke) +
  • Added a new Sony LensType (thanks Mladen Sever) +
  • Added support for writing invalid IFD entries used by some Kodak Z cameras +
  • Updated Canon CustomFunctions for EOS 450D +
  • Made a few more DNG tags writable +
  • Renamed CIFF TvValue and AvValue tags to ShutterSpeedValue and ApertureValue + and added conversions (to seconds and F-number) as with EXIF tags +
+ +July 18, 2008 - Version 7.38 +
    +
  • Same as version 7.37 except that Windows executable is packaged with Perl + 5.10.0 instead of 5.8.7 -- this fixes a problem with FileModifyDate and DST +
+ +July 16, 2008 - Version 7.37 +
    +
  • Added -addTagsFromFile option (variant of -tagsFromFile which allows copying + multiple tags into the values of a single list-type tag) +
  • Added a new Sony LensID (thanks Jens Duttke) +
  • Added PentaxModelID for the Optio W60 +
  • Added a couple of new YCbCrSubSampling values (thanks Jens Duttke) and made + values consistent across different types of meta information +
  • Decoded Canon Categories tag (thanks Darryl Zurn) +
  • Reduced priority of XMP-xmp date/time tags so the EXIF tags are preferred +
  • Fixed problem where time may be duplicated in Composite:DateTimeCreated +
  • API Changes: +
      +
    • Added ability to pass options to SetNewValuesFromFile +
    +
+ +July 8, 2008 - Version 7.36 +
    +
  • Added a new Nikon LensID (thanks Jens Duttke) +
  • Fixed bug introduced in 7.33 where a SubIFD error was erroneously reported + when writing an already edited NEF image +
+ +July 6, 2008 - Version 7.35 +
    +
  • Added two new Nikon LensIDs (thanks Geert De Soete and Jens Duttke) +
  • Added XMP-pdf:Trapped tag +
  • Added Composite:GPSAltitude tag (like Composite:GPSLatitude/GPSLongitude) +
  • Added a couple of new PentaxModelID values +
  • Decode Canon 450D Sharpness tag (thanks Bogdan) +
  • Decode Nikon D300 AFAreaMode and AutoFocus tags (thanks Jens Duttke) +
  • Extract Pentax SaturationInfo as an Unknown tag (thanks Dave Nicholson) +
  • Renamed Canon LensType string tag (ID 0x0095) to LensModel +
  • Changed JFIFVersion print conversion to match the formatting used in the + JFIF specification +
  • Fixed a Minolta LensID entry for Tamron lenses +
  • Fixed problem excluding XMP family 1 groups from deletion in some file types +
+ +June 28, 2008 - Version 7.34 +
    +
  • Added names for a few more of the Unknown Photoshop tags +
  • Added support for XMP files with leading XML comments +
  • Added support for older XMP "x:xapmeta", and XMP without "x:xmpmeta" element +
  • Changed priority of XMP:Source tags when writing so XMP-photoshop:Source is + now preferred over XMP-dc:Source +
  • Renamed Photoshop IPTCDigest to CaptionDigest and removed Unknown status +
  • Improved parsing of IPTC time values when writing, and assume the local + timezone (if available) instead of UTC when a timezone is not specified +
  • Improved handling of lists that exist in multiple groups in the same file +
  • Disabled shifting of list-type date/time tags (allows += to add list items) +
  • Reduced priority of XMP-exif and XMP-tiff tags so these values don't + override more reliable EXIF and TIFF tags when extracting information + without specifying a group +
  • Fixed quirk where exiftool could add an extra padding byte to the makernotes +
  • Fixed incorrect tag ID that prevented ImageStabilization from being decoded + in Sony DSLR-A100 images (thanks Ger Vermeulen) +
  • Fixed problem where error/warning messages could be duplicated for + subsequent files when copying tags from multiple files +
+ +June 21, 2008 - Version 7.33 +
    +
  • WARNING: Older ExifTool versions will not properly rewrite DNG 1.2 images + which contain multiple color profiles +
  • Added DNGVersion check to avoid future problems with major DNG revisions +
  • Added support for new DNG version 1.2.0.0 tags +
  • Added support for XMP PLUS License Data Format 1.2.0 tags +
  • Added a new Pentax LensType (thanks Peter) +
  • Added a new Canon LensType +
  • Added support for user-defined XMP structures +
  • Decode a few new Sony tags (thanks Marcus Holland-Moritz) +
  • Decode Nikon Capture NX 2 NikonICCProfile information (thanks Jens Duttke) +
  • Extract MP3 VBR and ID3Size tags +
  • Improved accuracy of MP3 Duration calculation (account for VBR and ID3Size) +
+ +June 12, 2008 - Version 7.32 +
    +
  • Added a new Pentax LensType (thanks yeryry) +
  • Decode ColorBalance information for Canon 450D and 1000D +
  • Fixed names of a few NikonCapture D-LightingHQ tags (thanks Jens Duttke) +
  • Fixed bug where a list-type tag was not created when simultaneously adding + and deleting values from the list +
+ +June 10, 2008 - Version 7.31 +
    +
  • Added proper support for special characters in PDF text strings +
  • Added support for a number of new XMP tags written by Adobe Lightroom 1.4 +
  • Added ability to write XMP-xmp:ThumbnailsImage +
  • Added Photoshop IPTCDigest tag +
  • Added two new Nikon LensID's (thanks Jens Duttke) +
  • Added a new Pentax LensType (thanks Bogdan) +
  • Added a new CanonModelID for the EOS 1000D +
  • Decode a few new Pentax tags (thanks Dave Nicholson) +
  • Increased precision of GPS coordinates when copying with -tagsFromFile +
  • Fixed problem which could result in "Argument isn't numeric" runtime warning + when attempting to write an Unknown value to a bitmapped tag +
+ +May 31, 2008 - Version 7.30 (production release) +
    +
  • Adjusted MakerNote error checks to be a compromise between 7.28 and 7.29 +
  • Fixed various htmlDump problems +
  • Fixed bug which could cause runtime warnings when attempting to write + certain types of unsupported images +
+ +May 28, 2008 - Version 7.29 +
    +
  • Renamed Pentax ModelRevision tag to ProductionCode and improved print + conversion to indicate if camera has been serviced +
  • Added check to prevent EXIF tags from being written to JPEG images if they + would obviously exceed the maximum JPEG segment size limit +
  • Relaxed error checks when writing JPEG images to allow MakerNotes to be + rebuilt if the MakerNote IFD is not contained within the MakerNotes data +
  • Fixed decoding of Pentax ExternalFlashGuideNumber when AF360 is used with + the wide angle panel +
  • Fixed unnecessary "Multiple new values for IFD0 tag 0x927c" warning which + could occur when copying MakerNotes from some images +
+ +May 26, 2008 - Version 7.28 +
    +
  • Added new Canon CustomFunctions values from the EOS 1DmkIII firmware update, + and a new CanonExposureMode value (thanks David Pitcher) +
  • Added a new Olympus LensType (thanks Виктор Лушников) +
  • Decode Pentax ExternalFlashBounce tag (thanks Cvetan Ivanov) +
  • Renamed Pentax ExternalFlashZoom tag to ExternalFlashGuideNumber and + improved decoding (thanks Cvetan Ivanov) +
  • Fixed bug which could prevent maker notes from being copied when copying all + tags from a file containing a PreviewImage +
  • Fixed problems decoding some Sony ARW images +
  • Fixed problem writing some makernote values in sub-IFD's +
  • Fixed "APP1 segment too large" problem where PreviewImage was not dropped + as it should have been when copying all tags from some RAW images +
+ +May 24, 2008 - Version 7.27 - "GIF+XMP" +
    +
  • Added ability to read/write XMP in GIF images +
  • Added ability to write to GIF87a images (by upgrading them to GIF89a) +
  • Added GIFVersion tag +
  • Improved decoding of Canon 1DmkIII/1DSmkIII TimeStamp tags +
  • Changed print conversion of EXIF/XMP GPSStatus tags to make more sense +
  • Fixed bug introduced in version 7.22 that could cause exiftool to abort with + an "'x' outside string" error when processing some DNG images +
  • API Changes: +
      +
    • Extract FileSize information from images passed as a scalar reference +
    +
+ +May 21, 2008 - Version 7.26 +
    +
  • Added write support for FujiFilm FinePix S5 Pro V1.04 RAF images +
  • Added support for new Kodak TIFF-format maker notes used by the Z1085 +
  • Added new Pentax and Nikon LensType's (thanks Jens Duttke, Dave Nicholson + and Robert Rottmerhusen) +
  • Added some new Minolta LensID's (thanks Thomas Käßner) +
  • Added new CanonModelID's and a 1DmkIII TimeStamp (thanks Ger Vermeulen) +
  • Decode a number of new Pentax K10D tags (thanks Dave Nicholson) +
  • Decode Panasonic Title tag (thanks Jens Duttke) +
  • Recognize a few more uncommon top-level QuickTime atoms +
  • Changed decoding of some Olympus tags for new E-520 +
  • Changed warning when empty PrintIM data is encountered (eg. as written in + Sony A700 ARW files when Adobe RGB color mode is used) +
  • Dropped Canon PreviewFocalPlaneX/YResolution tags since they never really + existed (thanks Ger Vermeulen for pointing out the Canon bug which lead to + this false assumption) +
  • Fixed duplicate tag problem with Pentax LensData when -U option used +
  • Fixed bug which could cause a runtime warning when copying Nikon maker notes +
  • Fixed bug in exiftool application which could cause all tags to be copied + instead of just the specified tags when creating an output XMP or MIE file + and using the -tagsFromFile option +
+ +Apr. 18, 2008 - Version 7.25 (production release) +
    +
  • Added read support for DIVX video files +
  • Added a new Nikon LensID (thanks Tanel Kuusk) +
  • Decode a number of new Pentax K10D tags and values (thanks Dave Nicholson) +
  • Decode a few new Nikon tags (thanks Jens Duttke) +
  • Decode Nikon VignetteControl tag found in D3 images with new 1.10 firmware + (thanks Alexandre Naaman) +
  • Improved formatting of video duration times +
  • Improved print conversion for video Compression values +
  • Apply print conversion for XMP:FocalLengthIn35mmFormat to add "mm" +
  • Fixed MIME type of JPEG 2000 images +
  • Fixed problem decoding new Nikon D300 AFPrioritySelection tags +
  • API Changes: +
      +
    • Fixed CanWrite so it returns false for non-writable TIFF-based files +
    +
+ +Apr. 10, 2008 - Version 7.24 +
    +
  • Added read support for SVG (Scalable Vector Graphics) images +
  • Added support for non-standard Apple iPhone PNG images +
  • Added support for ISL maker note format +
  • Added a couple of new Olympus LensType's +
  • Added a few new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added values for various Sony tags (thanks Jens Duttke) +
  • Decode Nikon D300 custom settings (thanks Jens Duttke) +
  • Decode Nikon D300 AFFineTuneAdj (thanks Neil Nappe) +
  • Decode a number of new Pentax tags and values (thanks Jens Duttke) +
  • Decode a number of new QuickTime tags, including 'mdta' information +
  • Decode a missing Custom Function for Canon 450D +
  • Avoid extracting any unknown tag in binary data tables when -u option used +
  • Avoid writing Canon 1D/1DS RAW images masquerading as TIF (writing 1D + RAW images is not yet supported) +
  • Improved parsing of AFCP ThumbnailImage and PreviewImage +
  • Downgraded errors in the NikonScan and NikonPreview IFD's to allow writing + of images with these problems without requiring the -m option +
+ +Mar. 27, 2008 - Version 7.23 +
    +
  • Decode a number of new Pentax K20D/K200D tags and values +
  • Fixed bug introduced in 7.18 which caused "Error parsing XMP" warning when + deleting all XMP and writing new XMP tags in the same step +
+ +Mar. 25, 2008 - Version 7.22 +
    +
  • Added support for Olympus-style Sony makernotes (DSC-S45/500/650/700/750) +
  • Added %c 'n' modifier to number output files from 1 instead of 0 +
  • Added Extra "Now" tag used for setting a tag value to the current date/time +
  • Added a new Nikon LensID (thanks Jens Duttke) +
  • Added ability to specify byte order for EXIF Unicode text and fixed problem + where text wasn't always written in EXIF byte order by default +
  • Added a new Canon LensType (thanks Hal Williamson) +
  • Added a few new CanonModelID values +
  • Decode a new Pentax K20D tag and add a few new values to other tags (thanks + Jens Duttke) +
  • Recognize non-standard Nikon ICC Profile files +
  • Improved error checking when writing a JPEG image with a bad IFD +
  • Fixed bug where IFD0 could be deleted when writing JPEG with a bad IFD1 +
  • Fixed some Olympus LensType names for Leica lenses +
  • Fixed problem extracting some writable directories as a block +
  • Fixed bug which could cause "Not an ARRAY" error when reading PDF files +
+ +Mar. 12, 2008 - Version 7.21 (production release) +
    +
  • Added support for Leica M8 maker notes (in both DNG and JPEG images) +
  • Added ability to write encrypted Nikon makernote information (!!) +
  • Added a new Olympus Leica lens (thanks Chris Shaw) +
  • Decode a couple of new Canon 40D and 1DmkIII tags (thanks Chris Huebsch) +
  • Decode Adobe RAF data in DNG images +
  • Decode a few new Nikon D3 and D300 tags (thanks Jens Duttke) +
  • Calculate VideoFrameRate for QuickTime MOV videos +
  • Marked DNG OriginalRawFileName and OriginalRawFileData as "unsafe" to copy +
  • Changed decoding of Casio BestShotMode +
  • Renamed Nikon NEFCurve tags (thanks Jens Duttke) +
  • Patched problem parsing OriginalDecisionData for the Canon EOS 5D +
+ +Mar. 7, 2008 - Version 7.20 +
    +
  • Added a few new Minolta LensID's +
  • Added two more TIFF-IT tags to the EXIF table +
  • Added a number of new RIFF and ASF Audio Encoding values +
  • Added a new new values for some Canon tags (thanks Dave Nicholson) +
  • Decode a number of new Pentax K10D tags (thanks Dave Nicholson) +
  • Decode a number of new MP4/QuickTime tags +
  • Decode makernotes in Casio, Kodak, Minolta, Olympus and Ricoh AVI and MOV + videos +
  • Improved decoding of Casio maker notes and decode a few new tags (thanks + Jens Duttke) +
  • Removed incorrect CanonD30 ColorTemperature and ColorMatrix tags +
  • Fixed Location translation in iptc2xmp.args and xmp2iptc.args +
  • Fixed problem decoding some Nikon tags in images edited by Capture NX +
  • Fixed decoding of InternalSerialNumber for Canon 5D +
  • Fixed decoding of Nikon D3 color balance information +
  • Fixed decoding of Minolta 7D FocusMode (thanks Jens Duttke) +
+ +Feb. 25, 2008 - Version 7.19 +
    +
  • Added a new Pentax LensType and some new Panasonic NoiseReduction values + (thanks Jens Duttke) +
  • Decode Nikon D40 and D40X custom settings plus a couple of other tags +
  • Decode a couple of new Pentax K10D tags (thanks Dave Nicholson) +
  • Improved reliability of Canon FocalPlaneXSize and FocalPlaneYSize tags +
  • Recognize HP Type2 maker notes in images from other makes +
  • Write TIFF ApplicationNotes in 'int8u' format as per XMP specification +
  • Made TIFF ApplicationNotes writable as a block +
  • Changed HtmlDump to show actual IFD format if different than read format +
  • Changed some MeteringMode strings to be more consistent +
  • Fixed problem adding back JFIF information after deleting JFIF group +
+ +Feb. 21, 2008 - Version 7.18 +
    +
  • Added ability to exclude XMP family 1 groups from deletion +
  • Added patch to recognize new Ricoh R50 maker notes +
  • Added a new Minolta LensID (thanks Jens Duttke) +
  • Decode AFPointsUsed for Nikon D3 and D300 (thanks Jens Duttke) +
  • Decode a couple of new Pentax K10D tags (thanks Dave Nicholson) +
  • Improved decoding of Nikon FlashInfo tags (thanks Jens Duttke) +
  • Renamed Olympus FlashExposureCompensation tag to FlashExposureComp +
  • Patched problem with Perl 5.10.x which broke conversion of UTF8 strings +
  • Fixed problem where an ExposureTime of 1 second was ignored in CRW images +
  • Fixed problem where special characters were not handled properly when using + the -L option while copying IPTC tags +
  • Fixed bug which could cause a runtime error when attempting to write JFIF + information after deleting JFIF:all in the same step +
+ +Feb. 16, 2008 - Version 7.17 +
    +
  • Extract duplicate tags when -p option is used +
  • Fixed bug introduced in 7.00 which broke the use of group family numbers and + groups ending with a digit in tag format strings (eg. "$IFD0:Model") +
+ +Feb. 14, 2008 - Version 7.16 +
    +
  • Added a couple of new Pentax LensTypes (thanks Jens Duttke) +
  • Added a few more EXIF:Compression values +
  • Decode color balance levels in Leaf MOS images +
  • Decode a number of new tags from JPEG, TIFF, KDC and DCR images of older + Kodak models +
  • Improved decoding of TIFF SampleFormat tag +
  • Made a number of DNG tags "unsafe" so they aren't copied by default +
  • Allow JPEG EXIF segment to be deleted and a new EXIF segment to be created + with a different byte order in a single command +
  • Attempted to improve reliability of ScaleFactor35efl calculation for newer + Canon models +
  • Fixed a couple more places where we still needed a space before "mm" +
  • Fixed problem with LightValue calculation which caused failed tests for Perl + 5.6.2 on Darwin +
+ +Feb. 5, 2008 - Version 7.15 (production release) +
    +
  • Added a few new CanonModelID's and PentaxModelID's +
  • Added support for new Pentax K20D/K200D values for some tags +
  • Added a few new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Decode a few new Sigma tags, including PreviewImage +
  • Decode a few more tags in Canon CRW images (thanks Dave Nicholson) +
  • Improved Sony ARW parsing (fix some problems and extract more tags) +
  • Improved handling of timezone when writing EXIF and XMP information (the + timezone is now added to XMP date/time values and removed from EXIF + date/time values if necessary unless the -n option is used) +
  • Recognize a few more FLV AudioEncoding and VideoEncoding values +
  • Allow "pseudo" tags to be copied from unrecognized file types +
  • Made FileModifyDate an "unsafe" tag so it isn't copied unless specified +
  • Changed all "sec" units to "s" with a leading space for consistency +
  • Fixed bug introduced in version 6.91 that could prevent some XMP date/time + tags from being written when copying with "-all:all" +
+ +Jan. 25, 2008 - Version 7.14 +
    +
  • Added read support for Kodak KDC raw images +
  • Added ability to read/write Canon OriginalDecisionData in JPEG, CR2 and DNG + images +
  • Added ValueConv translations for some of the new Nikon PictureControl tags +
  • Decode a number of new Nikon tags (thanks Jens Duttke and Gregor Dorlars) +
  • Decode Canon CR2Segmentation tag +
  • Decode a new Canon CustomFunction of the EOS 450D +
  • Improved handling of mandatory tags in EXIF information +
  • Changed all FocalLength print conversions to add a space before "mm" +
  • Renamed Canon Self-timer tags to SelfTimer for consistency +
  • Fixed some problem with -htmlDump for some types of trailer information +
  • Fixed problem which could give a runtime warning when attempting to delete a + permanent tag +
+ +Jan. 17, 2008 - Version 7.13 +
    +
  • Decode a couple more Nikon and Sony tags +
  • Decode Windows HD Photo "Padding" tag +
  • Recognize HDP (Windows HD Photo) file extension +
  • Designated EXIF CompressedBitsPerPixel and ComponentsConfiguration as + "unsafe" tags so they aren't copied by -tagsFromFile by default +
  • Changed priority of new Nikon D3/D300 ISO tag +
  • Changed Canon LensType for a Tamron lens (thanks Monica Wallek) +
  • Fixed incorrect TagID for new Panasonic Sharpness tag +
+ +Jan. 15, 2008 - Version 7.12 +
    +
  • Added read support for ITC (iTunes Cover Flow) files +
  • Added ability to deal with corrupted IPTC written by Nikon Capture NX +
  • Added a few new Canon LensType's (thanks Steve Balcombe) +
  • Decode a number of new Nikon D3/D300 tags (thanks Gregor Dorlars) +
  • Decode a number of new FujiFilm and Panasonic tags and values +
  • Decode ColorBalance information for the Canon 40D, 1DmkIII and 1DSmkIII +
  • Improved decoding of Nikon D80 VibrationReduction tag (thanks Jens Duttke) +
  • Renamed Pentax WBShiftBA and WBShiftGM tags to WBShiftAB and WBShiftMG (now + more consistent with Pentax software, but inconsistent with Canon naming) +
  • Fixed a CanonImageHeight tag which was incorrectly named CanonImageWidth +
+ +Jan. 10, 2008 - Version 7.11 +
    +
  • Decode a number of new Canon tags and improved decoding of many old tags +
  • Renamed EXIF:RelatedImageLength to RelatedImageHeight (hopefully all + ImageWidth/Height tag names are now consistent) +
+ +Jan. 7, 2008 - Version 7.10 +
    +
  • Added support for escape sequences and continuation comments in EPS files +
  • Added ability to read/write Sony A700 PreviewImage (tag 0x2001) +
  • Added a new Sony ColorMode value (thanks Philippe Devaux) +
  • Decode a number of new Minolta tags +
  • Improved handling of newlines when writing PDF information +
  • Improved decoding of Canon 40D and 1DmkIII FocusDistance tags (thanks + Wolfgang Hoffmann) +
  • Fixed problem creating multiple output meta files with some commands +
  • Fixed problem deleting XMP by value for strings with escaped characters +
  • Fixed bug when trying to write output image to console with "-o -" +
  • Fixed problem where %c (copy number) was changed when the new file name + should have been the same as the source file +
+ +Jan. 3, 2008 - Version 7.09 +
    +
  • Decode Canon ThumbnailImageValidArea +
  • Improved decoding of some Olympus tags (thanks Frank Ledwon) +
  • Improved decoding of some Pentax tags (thanks Dave Nicholson) +
  • Improved error messages when writing PDF files +
  • Changed XMP-cc namespace URI (spec apparently changed for some reason) +
  • Changed Photoshop XMLData to a binary data tag +
  • Changed conversion strings for Canon ModifiedSharpnessFrequency values +
  • Changed Olympus NoiseReduction "ISO Boost" value back to "Noise Filter (ISO + Boost)" +
  • Fixed minor problem writing PDF cross-reference stream after multiple edits +
  • Fixed problem redirecting some verbose output to an output text file +
+ +Dec. 21, 2007 - Version 7.08 +
    +
  • Added write support for PDF files which use only cross-reference streams +
  • Added a number of new Olympus tags, and changed names of some existing tags +
  • Fixed problem decoding some PDF cross-reference streams +
  • Fixed bug introduced in 7.07 which broke copying between two list-type tags +
+ +Dec. 18, 2007 - Version 7.07 +
    +
  • Added ability to write XMP and PDF information to PDF files, with revert + capability! (use "-PDF-update:all=" to undo all exiftool edits) +
  • Added PDF:AppleKeywords tag (written by Apple Preview) +
  • Added Composite FOV (Field Of View) tag +
  • Added a few more Minolta/Sony LensID's +
  • Added new Canon and Pentax LensType's (thanks Magne Nilsen and Jens Duttke) +
  • Added "Nothing changed" message in verbose mode for files that weren't + changed when writing +
  • Added minor warning when invalid IFD entries are removed during writing (you + will get this, for instance, when ExifTool fixes the entry count problem in + Canon EOS 40D firmware 1.0.4 maker notes) +
  • Patched Canon 40D firmware 1.0.4 problem for JPEG images too +
  • Decode specified "unknown" zero values for four EXIF tags (ExposureProgram, + LightSource, MeteringMode and SubjectDistanceRange) instead of handling as a + truly unknown value (if this makes sense) +
  • Extract PreviewImage from newer Panasonic RAW images (thanks Jens Duttke) +
  • Recognize Pentax-type Kodak maker notes (eg. Easyshare 883) +
  • Made "Entries out of sequence" a minor warning since this problem is fixed +
  • Allow decimal seconds to be written in time values without needing to use -n +
  • Improved parsing of PDF files +
  • Improved behaviour when copying list-type tags to to non-List tags +
  • Improved exiftool summary message for files that were copied without changes +
  • Adjusted Pentax K10D battery percentage calibration +
  • Changed names of Pentax FirmwareID tags +
  • Fixed runtime warning that could occur with some invalid tag names +
  • Fixed problem decoding Pentax:LensCodes for some images (thanks Jens Duttke) +
  • API Changes: +
      +
    • Also allow File::RandomAccess reference as argument to ImageInfo() +
    +
+ +Dec. 7, 2007 - Version 7.06 +
    +
  • Permanently fix MakerNote offsets with -F option when writing +
  • A few more Pentax tag improvements (thanks Dave and Jens) +
+ +Dec. 6, 2007 - Version 7.05 +
    +
  • Patched problem rewriting Canon 40D CR2 images caused by bug in the 40D + firmware 1.0.4 which writes an improperly formatted MakerNote IFD +
  • More improvements in decoding Pentax K10D tags (thanks Dave Nicholson) +
  • Translate non-standard XMP namespace prefixes +
  • Changed a couple of Kodak Meta tags to Binary data type +
  • Renamed Pentax MeasuredLV to EffectiveLV (thanks Jens Duttke) +
+ +Dec. 3, 2007 - Version 7.04 +
    +
  • COMPATIBILITY WARNING: Renamed EXIF:ExifImageLength to ExifImageHeight and + XMP:GPSTimeStamp to GPSDateTime +
  • Added write support Minolta A200 MRW images +
  • Added read support for Hasselblad 3FR raw images +
  • Added a few new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added a new Canon LensType (thanks Bogdan) +
  • Added ability to insert a newline using "$/" in a print format string +
  • Decode some new FujiFilm and Pentax tags (thanks Jens Duttke) +
  • Decode some new Pentax and Canon tags (thanks Dave Nicholson) +
  • Recognize a few new Olympus lenses (thanks Michael Meissner) +
  • Improved decoding of Sony ARW images and added support for A700 +
  • Improved warnings for HtmlDump option +
  • Improved string parsing when writing date/time tags +
  • Fixed problem extracting Canon CRW RGGB values from DNG images +
+ +Nov. 17, 2007 - Version 7.03 +
    +
  • Fixed problem deleting XMP family 1 groups from JPEG images +
+ +Nov. 16, 2007 - Version 7.02 +
    +
  • Added ability to delete XMP family 1 groups (eg. "-XMP-crss:all=") +
  • Fixed problem writing XMP as a block to XMP file +
+ +Nov. 15, 2007 - Version 7.01 +
    +
  • Added ability to write FujiFilm RAF images (thanks Jens Duttke) +
  • Added -T option (equivalent to -t -S -q -f) +
  • Decode a number of new Pentax tags and values (thanks Dave Nicholson) +
  • Decode a new Canon LensType value (thanks Bogdan) +
  • Decode the not-so-accurate FocusDistanceUpper and FocusDistanceLower in + Canon EOS 1DmkIII and 40D images (thanks Heiko Hinrichs) +
  • Allow FileSource tag to be assigned values outside the EXIF standard +
  • Made ImageSourceData a protected tag +
  • Avoid loading huge binary data blocks into memory unless necessary (avoids + out-of-memory problem when processing huge, layered Photoshop TIFF images) +
  • Improved HtmlDump speed and memory usage by not loading "snipped" data +
  • Improved decoding of Nikon ShootingMode +
  • Various improvements and bug fixes when reading FujiFilm RAF information +
  • Fixed problem decoding CRW images where ImageWidth wasn't extracted with -U +
+ +Oct. 23, 2007 - Version 7.00 (production release) +
    +
  • IMPORTANT: Fixed problem writing ORF images from newer Olympus cameras which + could lead to errors when the image is opened by another utility (affected + images may be repaired by rewriting with this version of ExifTool) +
  • Added -ScanForXMP option +
  • Added ability to extract ID3v2 PRIV tags (including XMP) and the ID3:MCDI + tag (plus unknown ID3v2 tags with the -u option) +
  • Added new PentaxModelID's for Optio V10 and A40 +
  • Added support for Casio-like and HP-like Pentax maker notes +
  • Added ICC_Profile WCSProfiles tag (thanks Jens Duttke) +
  • Added ability to write and create CanonVRD as a block +
  • Added ability to shift GPSTimeStamp tag +
  • Added ability to write DNG AsShotICCProfile and CurrentICCProfile tags +
  • Decode VRDOffset tag in Canon MakerNotes +
  • Shortcuts may now be used in redirections and expressions, and with group + names +
  • Improved decoding of CanonVRD information (also decode new DPP 3.0 tags and + fixed a problem which could give a "Possibly corrupt CanonVRD" warning) +
  • Improved decoding of FujiFilm RAF images, and extract JPEG Preview +
  • Improved handling of Pentax Casio-style maker notes +
  • Improved conversion for Pentax K10D AFPointsInFocus +
  • Enhanced Composite tag syntax to simplify user-defined tag definitions +
  • Changed decoding of Nikon VibrationReduction 0x0075 tag +
  • Changed a number of Pentax and Casio tags to improve consistency +
  • Dump unsupported files with -htmlDump only if -u option is used +
  • Fixed problem which could cause a virtual hang when writing large EPS files +
  • Fixed problem of misleading error messages when attempting to write + unsupported file formats +
  • Fixed problem outputting list-type tags with -b option +
  • Fixed bug where the "image files created" count could miss some files +
  • Fixed problem where "Error rebuilding maker notes" warning could be issued + in cases where the maker notes do not need rebuilding +
+ +Oct. 6, 2007 - Version 6.99 +
    +
  • Added support for IView MediaPro XMP tags +
  • Added ability to read multiple comments from GIF89a images +
  • Added some new PentaxModelID's (Optio L20, T20, Z10) +
  • Added minor warning for unknown JPEG APP segments when -u option is used +
  • Extract information from JPEG APP13 "Adobe_CM" segment +
  • Improved -htmlDump output to show TIFF image data and trailer (the TIFF dump + is now complete) +
  • Improved decoding of Minolta WhiteBalance for some DiMAGE models +
  • Improved decoding of Panasonic FirmwareVersion when -n option is used +
  • Increased precision of 64-bit rational conversion from 7 to 10 digits +
  • Fixed problem which caused failed tests with Perl 5.005_05 +
  • Fixed problem where some groups could not easily be excluded when deleting + all other information (eg. "-all= --exif:all" now behaves as expected) +
  • Fixed problem decoding ICC Profile "dtim" format values +
  • Fixed typo in a Minolta FlashMetering value (thanks Jens Duttke) +
  • Fixed problem in API which could result in a UTF-8 encoded file not being + properly identified if it was passed as a scalar reference to WriteInfo() +
+ +Sept. 23, 2007 - Version 6.98 +
    +
  • Added ExifByteOrder tag (writable to set byte order for new Exif segments) +
  • Added CanonModelID for new EOS-1Ds Mark III +
  • Added value conversions for Pentax AEFlashTv, AEXv and AEBXv tags +
  • Decode Pentax ShutterCount (with help from Jens Duttke) +
  • Decode Pentax AFPointsInFocus for newer DSLR models (thanks Jens Duttke) +
  • Improved decoding of a Pentax LensType (thanks Jens Duttke) +
  • Renamed Pentax AutoAFPoint to AFPointsInFocus and improved conversion +
  • Renamed Pentax AEDump to AEMeteringSegments and converted values to + approximate LV equivalent units +
  • Fixed problem where some warnings were not being properly handled when + attempting to write an invalid value to some tags +
+ +Sept. 14, 2007 - Version 6.97 +
    +
  • Added support for Canon EOS 40D Custom Functions +
  • Added ability to decode new Nikon D3 and D300 LensData +
  • Added a few new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Decode Olympus NoiseFilter tag (thanks Ioannis Panagiotopoulos) +
  • Decode a few new Nikon ShotInfo tags (thanks Jens Duttke) +
  • Improved decoding of Canon AF point information +
  • Improved decoding of Nikon HighISONoiseReduction +
  • Renamed Nikon VRState to VibrationReduction +
  • Fixed typo which prevented some Olympus MakerNote tags from being written +
+ +Sept. 5, 2007 - Version 6.96 +
    +
  • Added ability to read/write XMP alternate languages +
  • Added ability to create new GPS information in Panasonic RAW images +
  • Added a few new PentaxModelID's (Optio E40, M40 and S10) +
  • Added a couple of new Pentax LensType's (thanks Jens Duttke) +
  • Added a new Olympus Sigma LensType (thanks Jens Duttke) +
  • Added EOS 40D CanonModelID and prepared for new 40D custom functions +
  • Decode a large number of new Canon tags +
  • Decode SerialNumber from previously unknown maker notes of some Kodak models +
  • Decode Olympus ImageStabilization tag (thanks Jens Birch) +
  • Improved decoding of Canon Self-timer and AFPoint values +
  • Improved decoding of some tags for high end Canon EOS models +
  • Renamed Pentax LensCoefficients to LensCodes and print 16 values +
  • Renamed Panasonic ImageStabilizer to ImageStabilization +
  • Renamed all AFPointsUsed tags to AFPointsInFocus +
  • Fixed decoding of ICC_Profile DeviceAttributes +
+ +Aug. 21, 2007 - Version 6.95 +
    +
  • Added support for new Kodak IFD-format makernotes used by the P712, P850, + P880, Z612 and Z712 +
  • Added a few new Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added LensType's for 2 new Pentax DA* lenses (thanks Jens Duttke) +
  • Added 2 new FujiFilm S5 WhiteBalance values (thanks Paul Samuelson) +
  • Added a number of new CanonModelID's +
  • Extract TIFFPreview from DOS EPS images +
  • Decode a number of new Panasonic tags, and added a number of new SceneMode's +
  • Decode FujiFilm S5 ColorTemperature tag (thanks Paul Samuelson) +
  • Improved handling of unknown XMP list-type tags +
  • Suppress EPS 'unterminated Document data' warning +
  • Fixed decoding of ASCII-type Panasonic FirmwareVersion +
  • Fixed bug calculating leap years for years outside the range 1601-2399 +
  • API Changes: +
      +
    • Changed WriteInfo() behaviour to be more consistent when editing file in + place and a new FileName is specified (original file is now deleted) +
    • Improved warning message when trying to write an 'unsafe' tag +
    +
+ +July 26, 2007 - Version 6.94 +
    +
  • Added a few new XMP-crs tags +
  • Added ability to create a new Photoshop IRB record in TIFF-format images +
  • Added a few new EXIF:Compression values (thanks Jens Duttke) +
  • Added a number of new Panasonic/Leica tags, and changed the names of some + Panasonic tags, including reverting FirmwareVersion (thanks Jens Duttke) +
  • Added test for Unknown (Bulb) Pentax ExposureTime value (thanks Jens Duttke) +
  • Added a new Nikon LensID (thanks Vladimir Sauta) +
  • Avoid extracting information from documents embedded in EPS images + (this is temporary; eventually I want to figure out a way to allow this + information to be extracted separately) +
  • Decode Red/BlueBalance from Leica Digilux 2 RAW images (thanks Jens Duttke) +
  • Changed conversion for Sony A100 Rotation tag to conform to EXIF:Rotation +
  • Changed decoding of one of the Pentax ExternalFlashBounce tags (thanks + Michael Meissner) +
  • Extract EncodingProcess, BitsPerSample, ColorComponents and YCbCrSubSampling + from JPEG SOF segment +
  • Show raw horizontal/vertical widths in the converted YCbCrSubSampling value +
  • Improved conversion of some Pentax tags (thanks Jens Duttke) +
  • Avoid loading data blocks larger than 16MB from QuickTime images +
  • Allow PDF:Keywords to be comma-delimited +
  • Fixed problem where a tag would be removed from both IFD0 and ExifIFD even + if only IFD0 or ExifIFD was specified +
  • Fixed problem with byte order mark showing up in output when decoding + hex-encoded Unicode values from PDF images +
  • Fixed problem where ExifTool could hang when reading corrupted ASF files +
  • Fixed possible problem with infinite recursion in FlashPix-format files +
+ +July 6, 2007 - Version 6.93 +
    +
  • Added read support for BigTIFF images (with extensions BTF, TIF and TIFF) +
  • Added a number of new Olympus tags and fixed decoding of a few others + (thanks Jens Duttke) +
  • Added a number of new SigmaRaw tags (found in SD14 X3F images) +
  • Changed conversion for Canon LensType 152 (used by various Sigma models) +
  • Fixed problem editing XMP containing new "Camera Raw Saved Settings" + properties (written by Adobe Lightroom) +
+ +June 29, 2007 - Version 6.92 +
    +
  • Added read support for FLV (Flash Video) files +
  • Added read support for EXIF and IPTC and write support for EXIF, IPTC and + XMP in JPEG 2000 images +
  • Added read/write support for Sinar CS1 raw images +
  • Added read support for Kodak DCR and K25 raw images +
  • Added ability to read/write improperly byte-swapped IPTC information +
  • Added check for infinity value of Casio ObjectDistance +
  • Added a new Nikon LensID (thanks Bruce Stevens) +
  • Improved decoding of APP12 "Ducky" segment (thanks Heinrich Giesen) and + added write/create support +
  • Improved handling of warning messages when setting new values +
  • Changed print conversion for Olympus PictureModeSaturation, + PictureModeContrast and PictureModeSharpness to label min and max values +
  • Fixed problem introduced in 6.91 when writing some EPS images +
  • Fixed group names for Pentax CameraInfo tags +
  • Fixed bug which could result in negative Canon SerialNumber values +
  • Fixed decoding of some Canon EOS 1DmkIII custom function values +
  • Fixed problem copying subdirectories in new-style Olympus maker notes +
  • Fixed problem of missing last character when decoding ID3 Unicode strings +
  • Fixed problems decoding some ID3 URL values +
  • Fixed inconsistency where the -if option may have used a different tag than + the one normally extracted when a group name was specified and multiple + matching tags existed in the group +
+ +June 5, 2007 - Version 6.91 +
    +
  • Added support for new XMP-lr, XMP-photoshop and XMP-DICOM tags of PS CS3 +
  • Added new Sigma lens to Pentax LensID list +
  • Added a few new Nikon and Canon LensID's (thanks Jens Duttke) +
  • Added Canon IXY Digital 810 IS to CanonModelID +
  • Recognize Photoshop "AgHg" resource type +
  • Removed "warnings" dependency in exiftool application +
  • Updated XMP:FileSource values to match EXIF:FileSource +
  • Greatly improved processing speed for some large EPS images +
  • Improved handling of XMP date/time formatting +
  • Officially support writing of MEF images +
  • Applied patch to convert Pentax LensType for changes in K10D firmware 1.2 +
  • Fixed decoding of Pentax BatteryBodyGripStates (thanks Jens Duttke) +
+ +May 10, 2007 - Version 6.90 (production release) +
    +
  • Added CanonModelID values for new PowerShot S5 IS and SD850 IS +
  • Encode IPTC values in default CodedCharacterSet when writing new values at + the same time as deleting the existing CodedCharacterSet +
  • Renamed Nikon FirmwareVersion to MakerNoteVersion and Panasonic + FirmwareVersion to ProductionVersion (thanks Jens Duttke) +
  • Allow EXIF GPS coordinates to be negative when writing (take absolute value) +
  • Revert "$evalWarning" fix (false alarm) +
+ +May 7, 2007 - Version 6.89 +
    +
  • Added support for maker notes of some Hewlett-Packard models +
  • Decode Pentax ImageProcessing tag +
  • Fixed problem which gave "$evalWarning" errors on some systems +
+ +May 2, 2007 - Version 6.88 +
    +
  • Added read support for Mamiya MEF images +
  • Implement long overdue change to standardize FocalPlaneResolutionUnit values +
  • Decode Panasonic BabyAge + some new ShootingMode values (thanks Jens Duttke) +
  • Improved recognition of maker notes for some camera models +
  • Fixed bug that could cause an incorrect "tag is not writable" warning +
  • Fixed problems converting WDP PixelFormat values +
  • Fixed decoding of Canon 350D AFPointsUsed (thanks Bogdan) +
  • API Changes: +
      +
    • Added option to allow makernote block to be extracted without rebuilding +
    +
+ +Apr. 26, 2007 - Version 6.87 +
    +
  • Added read/write/delete support for recognized trailers in PSD images +
  • Added PhotoMechanic IPTC:Prefs tag +
  • Added ability to decode double-UTF-encoded XMP files +
  • Added a few more Canon, Pentax and Nikon lens types (thanks Hayo Baan and + Robert Rottmerhusen for Nikon entries) +
  • Added ability to create new user-defined MIE groups +
  • Decode a new Nikon lens tag: ExitPupilPosition (thanks Robert Rottmerhusen) +
  • Increased precision (from 20m to 2mm) when writing XMP GPS coordinates +
  • Renamed Panasonic SpotMode tag to AFMode and improved decoding +
  • The -e (Composite) option now also applies when copying tags +
  • Minor changes to IPTC verbose output and error handling +
  • Minor changes to a few warning messages +
  • Avoid converting XMP values as rational or date if tag is known and not + specified with these formats +
  • Identify CR2 header and Canon MakerNote footer in -htmlDump output +
  • Reverted change from version 6.85 to once again allow JPEG thumbnails to be + written to TIFF-type images (perfectly valid for many TIFF-based RAW formats + even though it isn't technically correct in a proper TIFF) +
  • Added test to check for invalid encoding when Image::ExifTool is loaded +
  • Fixed problem shifting Canon:TimeStamp tag +
  • Fixed failed FlashPix test on Cygwin Perl 5.8.2 (roundoff errors again) +
  • Fixed problem where some types of write errors could result in exiftool + reporting that a file was updated when it wasn't +
+ +Apr. 10, 2007 - Version 6.86 +
    +
  • Added -execute, -srcfile and -common_args options to allow complex + processing with multiple commands in a single invocation +
  • Added ability to write Panasonic RAW files +
  • Added Panasonic ConversionLens tag +
  • Improved decoding of Panasonic/Leica Contrast and SpotMode tags +
  • Changed -@ to insert arguments at the current position in the command line + (rather than at the end) +
  • Once again automatically fix Canon maker note offsets (this feature was + removed in 6.84 due to a bug bug report that turned out to be a false alarm) +
  • Fixed bug in -if option which could incorrectly cause a failed condition + when using expressions containing multiple tags with proper-case names +
  • Fixed problem extracting binary data when -if option was used +
  • Fixed bug which caused error when setting CodedCharacterSet to "UTF8" +
  • Fixed decoding of InternalSerialNumber for FujiFilm FinePix F40fd +
  • Fixed problem using "-TAG+<=FMT" or "-TAG-<=FMT" on command line +
+ +Apr. 3, 2007 - Version 6.85 +
    +
  • Prevent JPEG thumbnail image from being written to TIFF-type images +
  • Fixed a couple of problems decoding Canon EOS 1D Mark III tags +
  • Fixed bug which generated an error message when rewriting maker notes in + Adobe-edited Pentax K10D native DNG images +
+ +Mar. 30, 2007 - Version 6.84 +
    +
  • Added a number of new XMP-crs tags, plus new XMP-lr (Adobe Lightroom) group +
  • No longer automatically fix Canon makernote offsets (but still use makernote + footer if present to calculate recommended fix) +
  • Fixed problem where some errors were not properly counted in the summary + statistics with the -overwrite_original_in_place option +
  • Fixed problem parsing XMP shorthand format for values containing '=' symbol +
+ +Mar. 24, 2007 - Version 6.83 +
    +
  • Automatically fix corrupted makernote offsets when reading images from Canon + models which include a makernote offset footer +
  • Added CanonModelID and CameraType values for 2 new Canon DV cameras +
  • Renamed SPIFF ResolutionUnits tag to ResolutionUnit +
  • Fixed formatting of GPSTimeStamp value +
+ +Mar. 20, 2007 - Version 6.82 +
    +
  • Added read/write support for new Canon EOS-1D Mark III custom functions +
  • Made a few makernotes warnings minor when writing +
  • Append "mm" to FocalLengthIn25mmFormat value +
  • Fixed problem which could cause "uninitialized value" warning when writing +
  • Fixed problem writing Canon EOS D60 custom functions +
+ +Mar. 17, 2007 - Version 6.81 +
    +
  • Added l/u modifiers for lower/uppercase in filename format codes (eg. "%le") +
  • Added equivalent IXY names to CanonModelID for PowerShot SD750 and SD1000 +
  • Added a few new Pentax ModelID's (Optio E30, T30, W30, A30) +
  • Allow non-encrypted Nikon ColorBalance values to be written +
  • Fixed problem where some encrypted Nikon information was not properly + protected against writing +
+ +Mar. 14, 2007 - Version 6.80 +
    +
  • Added Olympus ManometerReading tag +
  • Added ability to edit private IPTC and XMP information found inside + PhotoshopSettings record of TIFF images +
  • Renamed NikonShotInfoVers tag to ShotInfoVersion and added + MultiExposureVersion tag +
  • Search further in MPEG file to look for first audio/video frame headers +
  • Use default resolution information from JPEG JFIF segment for mandatory EXIF + resolution tags when creating new EXIF segment +
  • Enhanced %c format code so %+c adds an underline before the copy number +
+ +Mar. 7, 2007 - Version 6.79 +
    +
  • Translate special characters in ID3 information when reading +
  • Improved conversions for GPSTimeStamp and GPSDateStamp when writing so they + can be set from a normal date/time tag (eg. "-gpstimestamp<createdate") +
  • Added support for Nikon D40X plus a new LensID (thanks Robert Rottmerhusen) +
  • Added a new Canon LensType (thanks Warren Stockton) +
  • Removed D70Boring shortcut tag +
  • Fixed minor problem in HtmlDump of MakerNotes header introduced in 6.78 +
  • Fixed problem decoding second Pentax K10D LensType value for some lenses +
+ +Feb. 28, 2007 - Version 6.78 +
    +
  • Decode Nikon D200 multi-exposure tags +
  • Decode Canon BlackLevel tag and added a few new CanonModelID's +
  • Added support for new Olympus u760 maker note format (finally Olympus fixes + the major blunders of their older maker note design!) +
  • Added support for the rare Canon EOS K236 (variation of EOS 400D) +
  • Improved decoding of Canon EOS 1D Mark III tags +
  • Included PDF version of MIE format specification in distribution +
  • Reformat invalid EXIF date/time values when writing (unless -n option used) +
  • Minor updates to some Pentax tags for Optio M30 +
+ +Feb. 20, 2007 - Version 6.77 - "XML/HTML special characters" +
    +
  • Translate numeric character references when reading XMP +
  • Translate all HTML 4 character references to UTF-8 when reading HTML +
  • Translate all non-ASCII characters to HTML character entities with -h or -E +
  • Added full UTF-8 translation support when run with Perl pre-5.6.1 +
  • Decode a few new Sigma SD14 tags +
  • Decode a couple more Nikon tags (thanks Greg Troxel) +
+ +Feb. 16, 2007 - Version 6.76 (production release) +
    +
  • Added patch for Perl 5.6.x bug which caused an HTML test to fail +
  • Added a few new Pentax tags and fixed a LensType value (thanks Axel Kellner) +
+ +Feb. 14, 2007 - Version 6.75 (production release) +
    +
  • Added read support for DOC, XLS and PPT documents +
  • Added Composite GPS tags to facilitate copying GPS between EXIF and XMP +
  • Added patch for problems in Sanyo J1, J2, J4, S1, S3 and S4 maker notes +
  • Added new Microsoft OffsetSchema tag (new, ill-conceived PhotoInfo tag) +
  • Decode more Pentax tags and improved decoding for some K10D tags +
  • Shortened tag name of HTML:MSSmartTagsPreventParsing to NoMSSmartTags +
  • Fixed oversight to allow new IPTC and XMP records to be added to ORF images +
  • Fixed problem extracting RIFF MakerNotes by tag name +
  • Fixed problem with drag-n-drop of Windows files on a network drive +
  • Fixed problem copying GPSAltitude from EXIF to XMP +
+ +Feb. 2, 2007 - Version 6.74 +
    +
  • Added support for chained SubIFD's in TIFF images +
  • Updated GeoTiff support for new definitions in libgeotiff-1.2.3 +
  • Fixed problem when rewriting unknown records in Adobe DNGPrivateData +
  • Fixed bug introduced in 6.47 that could prevent Photoshop EXIF CameraRAW + tags from being extracted properly +
+ +Jan. 31, 2007 - Version 6.73 +
    +
  • Added read support for meta information in HTML and XHTML documents +
  • Added ability to write certain EXIF tags (eg. UserComment) as Unicode +
  • Added character set translation for XMP information; the -L option now works + for all common meta information formats! (see updated FAQ #10 for details) +
  • Added a few more XMP-microsoft tags (thanks Kees Moerman) +
  • Decode FirmwareRevision found in some Canon PowerShot models +
  • Preserve date/time tags that exist in the wrong EXIF IFD when shifting times +
  • Fixed bug which could result in an incorrect value for the Directory tag +
  • Fixed problem parsing XMP with BOM introduced in 6.71 +
+ +Jan. 25, 2007 - Version 6.72 +
    +
  • Added XMP-microsoft:LastKeywordIPTC tag +
  • Renamed new MicrosoftPhoto Rating2 tag to RatingPercent +
  • Fixed problem where rdf:about attribute could be lost when writing XMP +
+ +Jan. 24, 2007 - Version 6.71 +
    +
  • Decode a lot of new Pentax DSLR information (thanks Cvetan Ivanov) +
  • Patched Microsoft Photo bugs in XMP formatting +
  • Patched Microsoft Photo bug in EXIF Unicode text byte ordering +
  • Added support for XMP-microsoft tags and 2 new Microsoft EXIF tags +
  • Added a few new XMP tags (NativeDigest, ColorMode and ICCProfileName) +
  • Added ability to add or delete copied tags from list (eg. "-SRCTAG+>DSTTAG") +
  • Added a few more Canon EasyMode values (thanks Samson Tai) +
  • Added CanonModelID values for new A450, A460 and A550 +
  • Changed the -if option so the condition automatically fails if the + expression generates a warning (use -v to show the warning) +
  • Specified LF character (0x0a) for MIE text newline sequence +
  • Catch warnings if perldoc doesn't exist when running with no arguments +
  • Minor tweaks/fixes to htmldump output +
+ +Jan. 19, 2007 - Version 6.70 - "IPTC Character Coding" +
    +
  • Translate coded characters in IPTC string values (UTF8 and Latin only), and + assume Latin encoding if no CodedCharacterSet (see FAQ #10 for details) +
  • Enhanced IPTC:CodedCharacterSet print conversion so "ESC % G" is now printed + as "UTF8" (either may be used when writing) +
  • Specified ISO 8859-1 character set for MIE ASCII string values +
  • Added warnings for UTF-8 conversion errors +
  • Decode a few new Pentax tags +
  • Decode maker notes in Pentax DNG images +
+ +Jan. 8, 2007 - Version 6.69 +
    +
  • Decode information in NikonScanIFD +
  • Enhanced -p option to allow expressions to be used +
  • The -p option no longer suppresses error and warning messages +
  • Made ImageSourceData writable +
  • Reduced font size of htmldump output +
  • Fixed "Argument isn't numeric" error when reading an image with a missing + IFD offset +
+ +Jan. 3, 2007 - Version 6.68 +
    +
  • Added mechanism to allow Composite tags to be writable +
  • Recognize XMP sidecar files that begin with a UTF BOM (byte order mark) +
  • Changed TIFF ImageSourceData tag to a Binary data type +
  • Fixed problem which could cause warning when writing XMP in PNG images +
  • Fixed bug when shifting times in an XMP sidecar file that caused an invalid + date/time to be written if the tag didn't previously exist +
  • Fixed problem where writing to a JPEG image containing a PreviewImage could + report that the file was updated even if nothing was changed +
+ +Dec. 30, 2006 - Version 6.67 - "Adobe DNGPrivateData" +
    +
  • Added ability to write MakerNote information written by Adobe DNG Converter +
  • Added ability to copy Adobe MakerNote and CRW information from DNG images +
  • Added ability to read/write Adobe CRW and MRW information in DNG images +
  • Added ability to read Adobe SR2 information in DNG images +
  • Added a few more Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added ability to delete a specific MIE document in multi-document files +
  • Improved handling of tags in multi-document MIE files +
  • Improved verbose and htmlDump output for unknown JPEG trailers +
  • Improved handling of ignored minor errors when writing MakerNotes +
  • Decode Panasonic LensType tag +
  • Changed description for Canon:OwnerName tag +
  • Minor changes to HtmlDump output +
  • Fixed parsing of XMP date/time values with no seconds +
+ +Dec. 20, 2006 - Version 6.66 (production release) +
    +
  • Added a few more Pentax K10D PictureMode's (thanks Axel Kellner) +
  • Added a few new Nikon LensID's and Olympus LensType's +
  • Added Canon 1D PictureStyle's +
  • Updated CanonModelID strings for a few new models +
  • Changed tagID for MIE:GPSDifferential +
  • Minor change to MIE specification for unknown data formats (MIE 1.1) +
+ +Dec. 15, 2006 - Version 6.65 - "MIE 1.0" +
    +
  • Added ability to read/write MIE trailers in JPEG and TIFF images +
  • Added a number of new MIE tags and changed some existing tags +
  • Added support for units in MIE values +
  • Added new Pentax K10D PictureMode's (thanks Axel Kellner) +
  • Avoid creating non-native groups in MIE, PNG and EPS images unless necessary +
  • Fixed problem with -P option so it now works when -o option is used +
  • Fixed bug where 'all' was replaced with '*' in redirection expressions +
  • Fixed "APP1 segment too large" error when copying all tags from some Canon + CR2 images to a JPEG (fixed initially in 6.08, but broken again in 6.47) +
+ +Dec. 8, 2006 - Version 6.64 +
    +
  • Added Nikon ImageAuthentication tag (thanks Jeffrey Friedl) +
  • Added Canon RecordMode and OpticalZoomCode and Composite DigitalZoom tag +
  • Applied FocalUnits scaling to Canon ShortFocal, LongFocal and + ScaledFocalLength tags, and renamed ScaledFocalLength to FocalLength +
  • Allow (but ignore) leading family number on tag group when writing +
  • Fixed calculation of 35mm scaling factor when Canon digital zoom is applied +
  • Fixed bug which could cause "'x' outside of string" error when reading Nikon + images with the -U option +
+ +Dec. 6, 2006 - Version 6.63 +
    +
  • Changed the sense of the '-' modifier for the new '%c' format code +
+ +Dec. 6, 2006 - Version 6.62 +
    +
  • Added '%c' format code to add copy number if output file exists +
  • Added a couple of new Nikon LensID's (Werner Kober, Robert Rottmerhusen) +
  • Made -htmlDump tag names purple if actual offset differs from stored offset +
+ +Dec. 4, 2006 - Version 6.61 +
    +
  • MakerNotes offsets are now permanently fixed when the makernotes are copied + using -tagsFromFile with the -F option +
  • Fixed typo in MakerNoteSanyoC4 tag name of MakerNotes shortcut +
  • Minor improvements to htmldump style +
+ +Dec. 2, 2006 - Version 6.60 +
    +
  • Added -k option of stand-alone version to regular distribution +
  • Fixed bug adding/deleting XMP tags in a list (introduced in 6.50) +
  • Fixed decoding of Canon 5D LongExposureNoiseReduction +
  • Fixed problem writing AFCP where incorrect offset could be written +
  • Fixed bug in -p option which caused it to abort if all tag names were + contained in braces (thanks Joel Becker) +
  • Stand-alone Windows executable: +
      +
    • Print application documentation after "No file specified" warning +
    +
+ +Nov. 30, 2006 - Version 6.59 +
    +
  • Do not delete IFD1 when deleting all meta information from a TIFF image +
  • Added a couple of new CanonImageSize values: "Postcard" and "Widescreen" +
  • Added a few new Olympus LensType's (thanks Lilo Huang for one) +
  • Improved handling of invalid date values +
  • Fixed "divide by zero" warning if FocalPlaneXYResolution is "inf" +
  • Fixed incorrect "unknown trailer" verbose message when writing JPEG images +
  • Stand-alone Windows executable: +
      +
    • Allow quoting of options embedded in executable name +
    +
+ +Nov. 25, 2006 - Version 6.58 +
    +
  • Added a few more Nikon LensID's (thanks Robert Rottmerhusen) +
  • Added missing print conversion for RIFF DateTimeOriginal +
  • Improved HTML 4.01 compliance of -htmlDump output +
  • Lowered priority of ID3v1 tags so ID3v2 takes precedence if both exist +
  • Minor change to names of some Vorbis and APE tags +
  • Made Ogg file type all capitals +
  • Patched problem which could cause ExifTool to die if input file is corrupt +
  • Fixed GPSDOP description (GPS Dilution of Precision, thanks Greg Troxel) +
  • Fixed problem which could generate a run-time error when attempting to write + to a corrupted JPEG image +
  • API Changes: +
      +
    • GetFileType() may now also be used to return a file description +
    +
+ +Nov. 19, 2006 - Version 6.57 (production release) +
    +
  • Missing tags in -p and redirection expressions are now set to an empty + string ('') by default, or a dash ('-') if the -f option is used +
  • Added ability to use %f,%d,%e tokens in "-TAG<=FILE" argument +
  • Added new Nikon LensID (thanks Werner Kober) +
  • Set missing tags to '' instead of '-' in redirected expressions if -m used +
  • Renamed LV tag to LightValue +
  • Improved decoding of Sony DSLR-A100 maker notes +
  • Attempted to clarify date/time shift documentation in Shift.pl +
  • Fixed bug which could result in CanonVRD information not being recognized +
  • Fixed bug in new SetResourceName feature of user-defined Photoshop tags +
  • First release of stand-alone Windows executable +
  • API Changes: + +
+ +Nov. 15, 2006 - Version 6.56 - "Audio Update" +
    +
  • Added read support for a number of audio file formats: Ogg Vorbis, + Ogg FLAC, FLAC, APE (Monkey's Audio) and MPC (Musepack) +
  • Improved parsing of ID3 v2.3 and v2.4 information +
  • Added a number of new Pentax *istD tags (thanks Douglas O'Brien) +
  • Added ability to print processed file names when writing (-v0 option) +
  • Patched problem with makernotes offsets in Sanyo C4 images +
  • Fixed problem that prevented some Olympus RAW files from being written +
  • Fixed bug where XMP values could be improperly converted as a rational +
+ +Nov. 8, 2006 - Version 6.55 +
    +
  • Added read/write support for Canon VRD (Recipe Data) files and trailers +
  • Changed name of CanonDPP module and group to CanonVRD +
+ +Nov. 3, 2006 - Version 6.54 +
    +
  • Added write support for ORF (Olympus RAW) images +
  • Added Panasonic TravelDay tag (thanks Marcel Coenen) +
  • Show Photoshop resource block names in verbose output, and preserve these + names when copying tags from file +
  • Changed write format of Nikon WhiteBalanceFineTune from int16u to int16s + (thanks Giridhar Appaji Nag) +
  • Allow Flags to be used in UserDefined tags +
  • Added trailer signature to MIE format specification +
  • Fixed problem with the -list and -listw options (dynamically loaded tags + weren't appearing in the list) +
+ +Nov. 1, 2006 - Version 6.53 +
    +
  • IMPORTANT: Fixed bug introduced in 6.51 which could result in a corrupted + image (!!) when rewriting TIFF-format files containing an unknown trailer + (this includes all TIFF-based RAW formats except CR2). The good news is + that unknown trailers should be very uncommon, and nobody has reported any + problems yet, so with any luck I caught this before it affected anyone. But + please update immediately to 6.53 if you downloaded 6.51 or 6.52. +
+ +Nov. 1, 2006 - Version 6.52 +
    +
  • Added read/write support for trailers in CRW images +
  • Dropped historic support for obsolete -group# option +
+ +Oct. 31, 2006 - Version 6.51 - "Trailer Update" +
    +
  • Improved handling of trailers in JPEG and TIFF-format images: +
      +
    • Added read/write support for PhotoMechanic and FotoStation trailers +
    • Recognize and handle Canon DPP trailers +
    • Added AFCP trailer read/write support for TIFF (previously JPEG only) +
    • Added ability to read/write multiple trailers in the same image +
    • Trailers are now dumped with verbose and htmlDump options +
    • Trailers are now deleted when deleting all tags +
    • Added ability to delete trailers individually by group or altogether + with "-Trailer:all=" +
    +
  • Changed reading/writing XMP in PNG images to conform with XMP specification + (but continue to support the XMP profile format used previously) +
  • Avoid writing duplicate XMP tags in less common namespaces +
  • More consistent handling of unknown IPTC tags +
  • Added -listd option to list deletable groups +
  • IPTC time-only tags may now be set from date/time values (this already + worked for date-only tags) +
  • Fixed problem rewriting international text (iTXt) chunks in PNG images +
  • API Changes: +
      +
    • Added GetDeleteGroups() routine +
    +
+ +Oct. 26, 2006 - Version 6.50 +
    +
  • Changed name of new "-eval" option to "-if" +
  • Added read support for PhotoStudio Unicode comment (thanks Dec Anisimov) +
  • Recognize the "PHUT" Photoshop IRB resource type (thanks Dec Anisimov) +
  • Extract PhotoshopBGRThumbnail image from Photoshop information +
  • Write PNG compressed text for new tags when -z option is used +
  • Added ability to write PNG:ModifyDate +
  • Don't print Olympus LensType "release" if used to differentiate lenses +
  • Changed TagName documentation to show actual format written instead of + format used to interpret the data (which differs only for a few odd tags) +
  • Fixed bug in PNG writer which could cause duplicate tags to be written +
  • Fixed minor problem in HtmlDump output +
  • Fixed logic bug when writing XMP using += or -= +
+ +Oct. 21, 2006 - Version 6.49 +
    +
  • Added -eval option for conditional batch processing [changed to -if in 6.50] +
  • Allow .ExifTool_config file to be placed in application directory +
  • Decode copyright information from JPEG APP12 "Ducky" segment +
  • Decode Casio FirmwareDate +
  • Added IFD0 ProcessingSoftware tag (0x000b, written by ACD Systems) +
  • Added print conversion for InteropIndex +
  • Write InteropVersion automatically when creating a new InteropIFD +
  • Made RelatedImageFileFormat writable +
  • Protect all InteropIFD tags from being copied by default with -TagsFromFile +
  • Renamed XMP ExifImageHeight to ExifImageLength (to correspond with EXIF tag) +
+ +Oct. 19, 2006 - Version 6.48 +
    +
  • Decode Minolta 7D FlashExposureComp (thanks Jeffery Small) +
  • Decode InternalSerialNumber from newer FujiFilm models +
  • Improved decoding of new Pentax PictureMode tag (thanks Doug O'Brien) +
  • Updated CustomFunctions in Canon CRW images and recognize CIFF extension +
  • Added a couple new Pentax LensType's (thanks Barney Garrett) +
  • Changed "AdobeRGB" to "Adobe RGB" in all ColorSpace values for consistency +
  • Fixed bug in recent update to extract large preview from Epson JPEG images +
  • Fixed problem in -htmldump output introduced in 6.46 +
  • Various documentation improvements and updates +
+ +Oct. 15, 2006 - Version 6.47 +
    +
  • Decode JPEG APP6 "EPPIM" segment used in Toshiba images +
  • Process PICT images to extract JPEG preview when -u option is used +
  • Added OtherImage composite tag +
  • Added PentaxModelID for K110D and a new K110D PictureMode tag +
  • Fixed problem extracting CoverArt from some MP4 audio files +
  • Fixed problem decoding Canon BulbDuration (affects Composite ShutterSpeed) +
  • Fixed problem reading/writing large Epson preview image in R-D1 JPEG images + and allow large (>64kB) preview images for all make/models +
+ +Oct. 11, 2006 - Version 6.46 +
    +
  • The "-ext" option now overrides internal file selection rules +
  • Expand filename wildcards on Windows command line (thanks Marjolein Katsma) +
  • Enhanced warnings when copying information to a specific tag +
  • Changed family 0 group name: GPS->EXIF +
  • Changed family 1 group names: APP12->PictureInfo,GraphicConverter->GraphConv +
  • Added a couple of new Pentax LensType's +
  • Added JPEG.pm module (mainly for documentation purposes) +
  • Fixed bug when re-writing NEF files which caused new preview image written + by Nikon Capture 4.4.0 to be lost +
  • Fixed bug which could cause problems if a user-defined composite tag is + created with the same name as an existing tag +
+ +Oct. 6, 2006 - Version 6.45 +
    +
  • Added ability to create JFIF segment +
  • Decode information in JPEG APP8 "SPIFF", APP12 "Ducky", and APP15 + GraphicConverter segments +
  • Improved html dump feature to dump all JPEG APP segments +
  • Decode maker notes in FujiFilm AVI videos +
  • Renamed Nikon AFMode tag to AFAreaMode (thanks Tobias Briseno) +
  • Changed "Image Quality" description to "Quality" +
  • Added option to allow the htmlDump base offset to be specified +
  • Changed EV tag name to LV since this is technically more correct +
  • Print warnings if syntax problems are found in .ExifTool_config file +
  • Use HOMEDRIVE and HOMEPATH (Windows cmd shell environment variables) for + .ExifTool_config path if neither EXIFTOOL_HOME nor HOME are available +
  • Fixed some problems which were causing failed tests when using ActivePerl +
  • User-defined Composite tags now override composite tags of the same name +
  • Added a few more PentaxModelID's (K10D, A20, M20, W20) +
+ +Oct. 2, 2006 - Version 6.44 +
    +
  • Now deletes all JPEG APP segments when deleting all information +
  • Decode Ricoh APP5 RMETA information (custom fields in Caplio Pro G3 images) +
  • Decode AVI Audio/Video stream headers +
  • Recognize and preserve PhotoMechanic trailer when editing TIFF-based images +
  • Added ability to delete JFIF, CIFF, Meta and FlashPix groups +
  • Added ability to exclude groups when deleting all information +
  • Added a number of new Canon, Nikon, Pentax, Sony and Minolta tags +
  • Added description for GPSDOP tag (GPS Degree Of Precision) +
+ +Sept. 26, 2006 - Version 6.43 +
    +
  • Added read support for M4A audio files +
  • Simplified and documented technique for adding user-defined Composite tags +
  • Issue minor warning when a tag used in an expression doesn't exist, instead + of silently inserting a '-' (use -m option for previous behaviour) +
+ +Sept. 21, 2006 - Version 6.42 (production release) +
    +
  • Re-worked Sony and Minolta LensID lists and added a number of new lenses +
  • Extract maker note information from Sanyo MOV and MP4 videos +
  • Recognize ARW extension of Sony Alpha-100 RAW images +
  • Improved extraction of PreviewImage from damaged Minolta images +
+ +Sept. 18, 2006 - Version 6.41 +
    +
  • Fixed calculation of Canon ISO in some images and renamed ShotISO to BaseISO +
  • Minor improvement to order of operations when deleting multiple groups and + adding back information in batch mode +
+ +Sept. 14, 2006 - Version 6.40 +
    +
  • Added ability to delete a group and write back information in one step +
      +
    • Compatibility Warning: This changes previous behaviour when adding and + deleting information in the same operation if new tag values are set + after a group has been flagged for deletion +
    +
  • Fixed problem writing to specific MIE groups +
  • Minor improvements to verbose output while writing +
  • Added a few new CanonModelID's (PowerShot G7, SD900, SD800IS, SD40) +
+ +Sept. 12, 2006 - Version 6.37 +
    +
  • Decode Sony LensID's (thanks Thomas Bodenmann) +
  • Added another Canon LensType +
  • Added shortcut MakerNotes tag to represent the maker notes tags from all + manufacturers (useful when copying tags between files) +
  • Improved MPEG decoding and calculate approx. Duration based on avg. bitrate +
  • Issue a minor error when rewriting an empty IFD (previously this was fatal) +
  • Print 2 decimal points of MeasuredEV (avoids round-off errors resulting in + failed tests on some systems) +
+ +Sept. 6, 2006 - Version 6.36 (production release) +
    +
  • Added a few more Canon LensType's +
  • Improved decoding of Canon 400D ExposureTime and FileNumber +
  • Decode AFPointsUsed for PowerShot models with 9 AF points +
  • Fixed decoding of Canon 5D PictureStyle +
+ +Sept. 5, 2006 - Version 6.35 +
    +
  • Added Canon NumAFPoints tag +
  • Added support for Canon 400D custom functions +
  • Renamed Canon AFPointsUsed20D to AFPointsUsed and decode for 30D and 400D +
  • Changed phrasing in a text string to bypass bug in rpm build causing it to + obtain incorrect dependencies +
+ +Sept. 3, 2006 - Version 6.34 +
    +
  • Removed empirical offset from Canon:MeasuredEV +
+ +Sept. 1, 2006 - Version 6.33 +
    +
  • Added Composite:EV and Canon:MeasuredEV tags [comments welcome] +
+ +Sept. 1, 2006 - Version 6.32 +
    +
  • Decode a new value of "Auto High" for Canon CameraISO +
  • Added new Canon AutoISO tag, renamed Canon:ISO tag to ShotISO, and added a + new composite ISO tag to give the ISO that was actually used +
  • Decode CanonModelID's for recently announced Canon cameras (400D, etc) +
  • Decode PentaxModelID for Optio S7 +
  • XMP Changes: +
      +
    • Added support for rdf:nodeID attribute in XMP information +
    • Changed XMP file MIME type from application/xmp to application/rdf+xml + to correspond with XMP specification +
    • Write 'rdf:about' instead of 'about' (unqualified use now deprecated) +
    • Don't write blank-line padding (as per XMP spec) for .XMP files +
    • Fixed problem extracting XMP information from some EPS files +
    • Fixed typos in some (not commonly used) XMP namespace URI's +
    +
  • Fixed FocalLength conversion for some Pentax-built BenQ and Samsung models +
+ +Aug. 23, 2006 - Version 6.31 +
    +
  • Decode a number of new values for FujiFilm PictureMode (thanks Michael + Meissner) +
  • Properly parse AVI DateTimeOriginal tag when month name is all capitals +
  • Improved compatibility when running "exiftool" with no arguments (thanks + Jesse Zhang) +
  • Added support for Nikon D80 lens information and recognize a new lens + (thanks Robert Rottmerhusen) +
  • Improvements to Pentax maker note decoding (thanks Ger Vermeulen) +
  • Fixed problem when extracting information from image in memory when the + UTF-8 flag is set for the image data (fixes install on RHEL 3) +
+ +July 28, 2006 - Version 6.30 +
    +
  • Added ability to read/write APP0 CIFF segment (found in Canon PowerShot A5 + and PowerShot Pro 70 images) +
  • Improved decoding of Canon 30D FileNumber (was ShutterCount) +
  • Made EXIF tags ImageNumber and ImageHistory writable +
  • Fixed decoding of TargetExposureTime for Canon 20D/250D and ExposureTime + for Kiss Digital N +
  • Fixed problem processing GIF images which don't contain a color table +
  • Fixed bug in EXIF tag name documentation introduced in 6.12 where ExifIFD + group was not properly shown +
  • Fixed typo in exiftool pod documentation ("GROUP:TAG" was reversed) +
+ +July 24, 2006 - Version 6.29 (production release) +
    +
  • Added XMP-xmpMM:PreservedFileName tag (used by Photoshop CS) +
  • Fixed problem reading TIFF images which don't start at the beginning of the + file +
+ +July 12, 2006 - Version 6.28 +
    +
  • Fixed bug introduced in 6.04 which prevented PNG tags from being deleted +
  • Improved decoding of Canon PictureStyle information +
+ +July 7, 2006 - Version 6.27 +
    +
  • Decode a number of new tags in Canon, Casio, FujiFilm, Minolta, Nikon, + Panasonic, Pentax, Ricoh and Sony and maker notes +
  • Improved recognition of various Minolta maker note formats +
  • Added a number of new Nikon Capture tags +
  • Added support for XML-formatted XMP files +
  • Properly handle mixed linefeed characters in PostScript images +
  • Improved formatting of DICOM date/time values +
  • Added "Actual Offset" entry to HtmlDump tooltip information +
+ +June 27, 2006 - Version 6.26 +
    +
  • Avoid creating new SubIFD when copying all tags with "-all:all" from a RAW + or TIFF image (this gave problems if image was subsequently edited by PSCS2) +
  • Fixed decoding of a few Nikon LensID strings +
  • Minor fixes and changes to htmlDump and verbose output +
  • Added a new Pentax LensType (thanks Kazumichi Kawabata) +
+ +June 19, 2006 - Version 6.25 +
    +
  • Added read/write support for WDP (Windows Media Photo) images +
  • Improved algorithm to recognize maker notes offsets which need fixing +
  • Properly handle maker notes which have value offsets relative to the + individual IFD entries (Kyocera, Rollei and some Konica and Toshiba models) +
  • Decode a couple of new Sigma lens values in Canon LensType +
  • Decreased block size for buffered files to improve performance over slow + pipes +
+ +June 9, 2006 - Version 6.24 +
    +
  • Added -fast option to avoid scanning to the end of JPEG images to check for + an AFCP or PreviewImage trailer +
  • Recognize PS files which start with %!Adobe-PS instead of %!PS +
  • Improved FlashPix verbose output +
  • API Changes: + +
+ +June 7, 2006 - Version 6.23 +
    +
  • Added new feature allowing tag-name expressions to be used with the + -TagsFromFile option +
+ +June 5, 2006 - Version 6.22 +
    +
  • Added read support for FPX (FlashPix) images and FPXR (FlashPix Ready) + JPEG APP2 meta information +
  • Added AllDates shortcut tag to allow DateTimeOriginal, CreateDate and + ModifyDate to all be written via a single tag +
  • Added shortcuts to tag name documentation +
  • Return "0000:00:00 00:00:00" instead of "1970:01:01 00:00:00" as the string + representation of numerical times with a value of zero +
+ +May 26, 2006 - Version 6.21 +
    +
  • Changed CR2 identification logic to properly identify CR2 images which have + been edited by PhotoMechanic +
+ +May 24, 2006 - Version 6.20 +
    +
  • Added read support for Real audio/video (RA, RM, RV, RMVB, RAM, RPM) files +
  • Downgraded "Error reading value..." message from an error to a warning +
  • Fixed bug where IgnoreMinorErrors option could get set when writing images + with NikonCapture information +
  • Fixed two ID3 tag names which contained spaces +
  • Fixed problem parsing DateTimeOriginal in Casio EX-Z30 AVI files (thanks + Joachim Loehr) +
  • Fixed problem with apostrophes in HTML documentation for some browsers +
  • API Changes: +
      +
    • Can now call Options() with undefined value to set option value to undef +
    +
+ +May 16, 2006 - Version 6.19 +
    +
  • Added read support for SWF (Shockwave Flash) files +
+ +May 15, 2006 - Version 6.18 +
    +
  • Added read support for MPEG audio/video files +
  • Decode audio information in MP3 files +
  • Print Nikon:LensPosition in hex +
+ +May 12, 2006 - Version 6.17 (production release) +
    +
  • Fixed problem with rpmbuild on Mandriva 2006.0 (thanks Niels Kristian) +
  • Fixed typo in iptc2xmp.args and xmp2iptc.args which prevented the XMP + Instructions from being copied properly (thanks Mark Tate) +
  • Handle byte order mark in unicode EXIF strings +
+ +May 8, 2006 - Version 6.16 +
    +
  • Write %ADO_ContainsXMP comment when adding XMP to EPS images +
  • Don't issue DSC warning when writing Adobe version 3.1 EPS images +
  • Added separate table for decoding tags in IFD0 of Panasonic RAW images +
  • Improvements to Nikon AF point decoding (thanks Roger Larsson) +
  • Allow .ExifTool_config directory to be specified by setting the + EXIFTOOL_HOME environment variable +
  • Made all maker note write errors minor so they can be ignored if necessary, + allowing information to be written to images with corrupted maker notes +
  • Minor change to perl-Image-ExifTool.spec to fix problem with rpmbuild + (thanks Volker Kuhlmann) +
  • Fixed bug which could cause incorrect date to be calculated when shifting + date/time values +
+ +Apr. 20, 2006 - Version 6.15 +
    +
  • Changes to MIE specification involving string lists and alternate languages +
+ +Apr. 18, 2006 - Version 6.14 +
    +
  • Fixed some problems with EPS writer and removed beta testing status (thanks + to Tim Kordick for help with testing) +
  • Created new MIE meta information format [Note: The MIE module is fully + functional but the MIE format specification is still in development] +
  • Added print conversion for SpatialFrequencyResponse +
  • Extended meaning of -z option when writing to allow compressed information + to be written to MIE files +
  • Added Minolta FlashMetering tag +
  • API Changes: +
      +
    • Added 'Compress' option +
    +
+ +Apr. 9, 2006 - Version 6.13 +
    +
  • Fixed problem with writing FileName that caused format codes not to be + properly expanded if the specified filename already existed +
  • Standardized reported FileType for ACR, AIFC, CRW, JP2, PS and PSD files +
  • Allow 2 values to be written for EXIF TimeZoneOffset and make EXIF + SecurityClassification writable +
+ +Apr. 5, 2006 - Version 6.12 +
    +
  • Avoid printing garbage for DNG maker note information that was not copied + properly by the Adobe DNG converter (affects converted ORF images) +
  • Disabled "Possibly incorrect maker notes offsets" warning for a number of + Olympus models +
  • Fixed bug introduced in 6.04 which could cause endless loop (eeek!) when + writing tags with PostScript equivalents +
  • Fixed error reading some DICOM images +
+ +Apr. 3, 2006 - Version 6.11 +
    +
  • Added a few new Pentax LensType's +
  • Fixed bug rewriting MOS images (this bug introduced in version 5.95 caused + an error message and prevented the file from being rewritten) +
+ +Mar. 31, 2006 - Version 6.10 +
    +
  • Added ability to use filename format codes %d, %f and %e in values written + to FileName and Directory tags +
  • Fixed problem of odd filenames being generated when setting FileName from an + invalid date/time tag +
  • Removed debugging print statement forgotten in Olympus code of 6.07 (oops) +
  • API Changes: + +
+ +Mar. 30, 2006 - Version 6.09 +
    +
  • Made FileName and Directory writable (enabling a whole new functionality!) +
  • Added ability to write DOS-style EPS images [Note: still in beta testing] +
  • Increased precision of Composite Red/BlueBalance print conversion +
  • When combining the -o and -overwrite_original options, the original file is + now erased if the new file is written successfully +
  • Added a new Nikon lens (thanks Werner Kober) +
  • API Changes: +
      +
    • Added SetFileName() routine +
    • In list context, CountNewValues() now also returns a "pseudo" tag count +
    +
+ +Mar. 25, 2006 - Version 6.08 +
    +
  • Made YCbCrCoefficients and YCbCrPositioning protected when writing +
  • Decode some new Nikon-specific tags in QuickTime videos from Nikon cameras +
  • Calculate Red/BlueBalance for Olympus images +
  • Fixed "APP1 segment too large" problem when copying all tags from Canon + EOS-5D or EOS-30D CR2 image to JPEG image +
  • Fixed problem running "exiftool" with no arguments in Windows cmd shell +
+ +Mar. 22, 2006 - Version 6.07 +
    +
  • Added a number of new Olympus tags (thanks Frank Ledwon) +
  • Decode Adobe JPEG APP14 segment (thanks Didier Giet) +
  • Made Rotation writable in CRW images +
  • Changed some FujiFilm WhiteBalance strings +
  • No longer return multiple tags when a group is specified unless the + duplicates option is enabled or the group name is 'all' or '*' +
+ +Mar. 20, 2006 - Version 6.06 +
    +
  • Added validity check for Canon FocalPlaneX/YSize which resulted in incorrect + values of FocalLength35efl being calculated for some PowerShot models +
  • Made Opto-ElectricConvFactor value binary +
+ +Mar. 18, 2006 - Version 6.05 +
    +
  • Improved JPEG writer to tolerate any segment ordering +
  • Fixed Olympus ExtenderStatus to work with E-330 (thanks Mark Dapoz) +
+ +Mar. 15, 2006 - Version 6.04 +
    +
  • Added write support for EPS and PS images [Note: still in beta testing -- + must currently use the -m option to enable writing to EPS images] +
  • Added ability to write ICC_Profile data as a block +
  • Added read/write support for ICC and ICM color profile files +
  • Added read/write support for ERF (Epson Raw Format) images +
  • Added a couple of new Olympus tags and LensType's (thanks Mark Dapoz) +
  • Added ability to scan past unknown header to find JPEG or TIFF image +
  • Added Canon EOS 30D custom functions +
  • Renamed Panasonic SerialNumber tag to InternalSerialNumber +
  • Renamed Canon 5D PictureNumber tag to ImageNumber +
  • Improved MRW reading and writing +
  • Decode a number of new Minolta tags and changed names of some existing tags +
  • Decode some type-specific data in ASF StreamProperties, including video + ImageWidth and ImageHeight +
  • Extract a few more PostScript tags and derive ImageWidth and ImageHeight for + PostScript documents +
  • Some improvements to Panasonic decoding (thanks Tels) +
  • API Changes: +
      +
    • 'Unsafe' tags are now copied by SetNewValuesFromFile() if specified + explicitly +
    +
  • Internal Changes: +
      +
    • SubDirectory tags are no longer Writable by default in WRITABLE tables +
    +
+ +Mar. 2, 2006 - Version 6.03 +
    +
  • Added print conversion for CFAPlaneColor +
  • Decode CFAPattern as written incorrectly in ASCII by some Panasonic cameras +
  • Added recently announced Canon cameras to CanonModelID list +
  • API Changes: +
      +
    • Added ability to prefix tag name with group in arguments to ImageInfo() + (read/write symmetry is now improved since this feature already existed + in the write routines, and now group names can be used in shortcuts) +
    • Changed order of filtering for Group# option and tag exclusions to be + applied after extracting tags specified in calls to ImageInfo() +
    +
+ +Feb. 26, 2006 - Version 6.02 +
    +
  • Fixed problem rewriting Photoshop IRB resources as written by some + applications (eg. PixVue) +
  • Improved decoding of AVI files to increase speed and extract more tags +
  • Added -overwrite_original_in_place option +
  • Added a number of new XMP tags and bring XMP support up to new + specification, plus a few undocumented XMP-aux tags (thanks Lou Salkind) +
  • Added support for large DNG preview image (with JpgFromRaw tag) +
  • Added ability to decode DNG Adobe MakerNotes +
  • Added SEMInfo tag (thanks Robert Mucke) +
  • Decode (but don't rewrite) old PS APP13 "Adobe_Photoshop2.5:" segment +
+ +Feb. 20, 2006 - Version 6.01 +
    +
  • Added back RedBalance and BlueBalance as composite tags +
  • Fixed potential problem in File::RandomAccess which could cause a "substr + outside of string" warning +
+ +Feb. 19, 2006 - Version 6.00 (production release) +
    +
  • Added read support for Sony SR2 raw images (but most tags still unknown) +
  • Added read support for Kyocera Contax N Digital RAW images +
  • Added ability to write or delete shortcuts which reference multiple tags + (previously only shortcuts referencing a single tag were writable) +
  • Changed descriptions of FNumber, ExposureTime, ISO, DateTimeOriginal, + CreateDate and ModifyDate to more closely match their tag names +
  • Separated Canon and Nikon Red/BlueBalance information into individual + components with tag names like WB_RGGBLevels +
  • Decoded a number of new Canon tags for EOS models, including ColorBalance + tables, 20D AF points and SensorInfo (thanks Rainer Honle) +
  • Fixed incorrect decoding of EOS 10D/300D color balance modes +
  • More additions and minor fixes to Canon decoding +
  • Made EOS-1D personal functions writable +
  • Added ability to write bitmasks at the PrintConv level +
  • Set MIME type for all RAW image formats to "image/x-raw" +
  • The -f option is no longer implied when -S and -s are combined +
  • Fixed bug introduced in 5.99 which broke the "-tagsFromFile @" feature +
  • Fixed problem with offsets in verbose dump of CRW images +
  • Fixed problem with some tags in Canon images not printing without -a option +
  • Fixed problem with validation of Canon PictureInfo for images rotated by + Canon ZoomBrowser EX (thanks Joshua Bixby) +
+ +Feb. 1, 2006 - Version 5.99 +
    +
  • Major additions to Canon maker note decoding, including EOS-1D personal + functions (thanks Rainer Honle for decoding many 5D tags) +
  • Added Canon maker note footer when rewriting Canon maker notes +
  • Attempt to fix problem where ScaleFactor35efl was calculated incorrectly for + some Canon images +
  • Reduce memory usage and speed up writing of large TIFF images +
  • Fixed problem with binary data offsets in verbose dump +
  • Fixed problem writing Comment if 'File' group specified +
  • Fixed bug which could cause formatting error in htmlDump output +
+ +Jan. 22, 2006 - Version 5.98 +
    +
  • Enhanced FMT syntax for -o, -w and -tagsFromFile options +
  • Decode maker notes of Samsung DX-1S +
  • Added ability to list tags in a specific group +
  • Recognize maker notes of a few more Kodak models +
  • Added a few more Canon LensType's +
  • Added missing semicolons in HtmlDump JavaScript output +
+ +Jan. 16, 2006 - Version 5.97 +
    +
  • Added support for Canon 5D custom functions (thanks Rainer Honle) +
  • Added support for Canon 1DmkII and 350D custom functions +
  • General fixes and improvements to Canon custom functions +
  • Renamed ICC_Profile Copyright to ProfileCopyright +
  • Report all extraction errors when copying only specified tags from file +
  • Avoid issuing "Error rebuilding maker notes" warning when copying maker + notes that don't require rebuilding +
+ +Jan. 14, 2006 - Version 5.96 +
    +
  • Fixed problem where XMP information could be lost when writing PSD images +
+ +Jan. 12, 2006 - Version 5.95 +
    +
  • Decode AIFF SampleRate +
  • Fixed problem where FileType was being set twice for AIFF files +
  • Patched problem reading some file types through Windows cmd shell pipeline +
  • Properly identify CR2 images read via pipes (previously identified as TIFF) +
  • Improved formatting of printed values for some DNG tags +
  • Fixed problem with EXIF format of some tags when writing +
  • Changed 'rational' format names to match full bit size of value +
+ +Jan. 10, 2006 - Version 5.94 +
    +
  • Fixed problem extracting OriginalRawImage from little-endian DNG images +
  • Fixed problem where "unreferenced bytes" error could be incorrectly issued + when deleting all EXIF from a TIFF image +
+ +Jan. 9, 2006 - Version 5.93 +
    +
  • Added ability to write JFIF information +
+ +Jan. 9, 2006 - Version 5.92 +
    +
  • Added ability to extract and decompress original raw image from DNG +
  • Fixed problem extracting information from some image types in pipelines +
  • Decode more information in PSD images +
+ +Jan. 7, 2006 - Version 5.91 +
    +
  • Added write support for PSD images +
  • Made a couple more Photoshop tags writable +
+ +Jan. 6, 2006 - Version 5.90 +
    +
  • Added read support for AIFF audio files +
  • Made Photoshop:XResolution and Photoshop:YResolution writable +
  • Fixed problem with processing some RIFF files +
  • Added a new Canon LensType +
  • API Changes: +
      +
    • SetNewValue() now accepts an ARRAY reference for setting list-type tags + such as Keywords, or a SCALAR reference for binary data, so it may now + be called directly with any value returned by GetValue(). +
    +
+ +Jan. 3, 2006 - Version 5.89 +
    +
  • Recognize Panasonic Type 2 maker notes +
  • Changed Nikon LensID to a composite tag to allow better decoding of + non-Nikon lenses, and added a bunch of new lenses to the list +
+ +Jan. 1, 2006 - Version 5.88 +
    +
  • Added ability to read and write AFCP information in JPEG images +
  • Added read support for WMV video and WMA audio files (ASF format files) +
  • Added EXIF tags 0x82a5-0x82ac +
  • Fixed TagID of IntergraphPacketData tag +
  • Fixed problem in rewriting some types of JVC maker notes +
  • Renamed WAV module to RIFF +
+ +Dec. 22, 2005 - Version 5.87 (production release) +
    +
  • Added support for JVC maker notes +
  • Extract a number of new DNG tags plus DNG JPEG preview image +
  • Renamed DNGCameraSerialNumber tag to CameraSerialNumber +
+ +Dec. 20, 2005 - Version 5.86 +
    +
  • Added support for AVI and MP4 videos +
  • Improved decoding of Olympus maker notes +
  • Improved APP12 decoding +
  • Improved CanonPictureInfo validation to work with more PowerShot models +
  • Display Canon 1D serial numbers with 6 digits +
  • Decode maker notes of Nikon D1 +
  • Combining -t with -S now gives a single-line tab-delimited list of values +
  • Extract preview image for Samsung Digimax i5 +
+ +Dec. 13, 2005 - Version 5.85 +
    +
  • Added ability to read and write XMP files which don't have an xpacket header +
  • Fixed problem deleting entire XMP data block using '-xmp=' syntax +
  • More minor HtmlDump improvements +
+ +Dec. 12, 2005 - Version 5.84 +
    +
  • Minor improvements to HtmlDump output +
+ +Dec. 12, 2005 - Version 5.83 +
    +
  • Added -F option to allow maker notes offsets to be fixed +
  • Added -htmlDump option to generate a verbose HTML-based hex dump of EXIF + and/or TIFF information (cool new diagnostic tool) +
  • Attempt to validate maker notes offsets and issue warning if they look wrong +
  • Fixed problem rewriting PreviewImage in some Olympus and Pentax images +
  • Increased speed for extracting large preview images +
  • Improved synthetic maker notes when coping tags from CRW file +
  • Display absolute offsets for EXIF values in very very verbose mode +
  • Verbose option output is now written to file if -w option used +
  • Speed up rewriting of some TIFF images when using ActivePerl 5.8.x for + Windows (image strips are now copied in a single block if they are + contiguous in the file to avoid ActivePerl bug which causes extremely poor + performance when concatenating a large number of memory blocks) +
  • Added a couple of new Nikon and Pentax lens ID's (thanks Robert Rottmerhusen + and David Buret) +
  • Decode PrintIM information in Casio QV-4000 +
  • Fixed Decoding of Canon EOS D60 serial numbers to agree with Canon utilities +
  • API Changes: +
      +
    • Added HtmlDump and TextOut options +
    +
+ +Nov. 26, 2005 - Version 5.82 +
    +
  • Fixed bug which caused error rewriting Minolta MRW images +
  • Added MRW write test +
  • Improved MRW verbose output +
+ +Nov. 24, 2005 - Version 5.81 +
    +
  • Changed writing of TIFF so that existing IPTC will be rewritten as int32u + whenever IPTC is edited, regardless of original format type. This allows + files to be 'fixed' even if IPTC was previously another format (now we get + to see if there is any software out there that barfs on int32u's...) +
  • Changed the -s option so tag names are displayed instead of descriptions + (now similar to the -S option, but values are aligned in a column) +
  • Remove padding at the end of IPTC record when writing +
  • Fixed problem which was generating a warning with ActivePerl 5.6.1 +
+ +Nov. 22, 2005 - Version 5.80 +
    +
  • Changed writing of new TIFF IPTC information to make it visible in Nikon + Capture (for some reason requires int32u format) +
  • Installed patch for building of ExifTool RPMS on Mandriva Linux (thanks + Niels Kristian) +
+ +Nov. 22, 2005 - Version 5.79 +
    +
  • Fixed problem which could render XMP information unreadable by Photoshop + when editing some XMP written by Photoshop CS2 +
+ +Nov. 21, 2005 - Version 5.78 +
    +
  • Fixed problem which could generate an error when adding IFD1 to an image +
+ +Nov. 18, 2005 - Version 5.77 (production release) +
    +
  • Allow integer tag values to be specified in hex (with leading '0x') +
  • Fixed problem which generated warnings about symbol "@indent" in Nikon.pm + when using older versions of Perl (observed with 5.6.1) +
+ +Nov. 16, 2005 - Version 5.76 +
    +
  • Tolerate extra null padding at end of TIFF images (as written by Photoshop + CS) when rewriting TIFF images +
  • Minor improvements to DICOM image processing +
  • Updated FAQ +
+ +Nov. 14, 2005 - Version 5.75 +
    +
  • Fixed problem decompressing deflated DICOM images +
+ +Nov. 14, 2005 - Version 5.74 +
    +
  • Added read support for DICOM (DCM, DC3, DIC, DICM) and ACR-NEMA (ACR) + medical image files +
  • Decode a lot more Nikon Capture information and add write ability +
  • Updated Nikon makernote decoding for D200 and new AF-S Nikkor 18-200 lens + (thanks Werner Kober) +
  • Added a number of new Canon LensType's (thanks Volker Gering) +
  • Recognize file types even if they have the wrong extension +
+ +Nov. 7, 2005 - Version 5.73 +
    +
  • Added ability to shift date/time tag values +
  • Extract Red/BlueBalance tags for Nikon D2Hs, D50 and D2X +
  • Decode Nikon Capture Data to extract IPTC information and Rotation +
  • Added a new Olympus LensType (thanks Michael Meissner) +
+ +Oct. 28, 2005 - Version 5.72 +
    +
  • Added ability to create XMP data files. This is more significant than it + sounds: The -o option may now be used to generate XMP files from + information in any other format, or even to create an XMP file from nothing + more than tags defined on the command line. +
  • Added printout of number of directories created with -w and -o options +
  • Improved error handling +
  • Effectively set preferred group to 'XMP' when writing XMP data files +
  • Fixed problem rewriting maker notes of some Pentax cameras +
  • API Changes: +
      +
    • Added CanWrite() and CanCreate() functions +
    • Allow WriteInfo() source file to be undefined to create new file +
    • Allow WriteInfo() output file to be undefined to edit file in place +
    • Added extra argument to WriteInfo() to specify output file type +
    +
+ +Oct. 24, 2005 - Version 5.71 +
    +
  • Added ability to read/write .XMP data files +
  • Added -listf option to print list of recognized file types +
  • Changed "-group#" option to "-listg#" (but still support old -group#) +
  • Moved Kodak APP3 "Meta" tags from EXIF to a new Kodak "Meta" group +
+ +Oct. 23, 2005 - Version 5.70 +
    +
  • Significant internal changes to improve speed and reduce memory usage +
  • Fixed a bug introduced in version 5.63 which caused incorrect XMP GPS + coordinates to be returned +
  • Changed handling of Kodak date records +
  • API Changes: +
      +
    • Added ability to access original 'Raw' values via GetValue() +
    • GetValue() now returns empty array in list context if value is undefined +
    • Values are now converted as they are requested, so the PrintConv option + now applies to GetInfo() and GetValue() instead of ExtractInfo() +
    +
+ +Oct. 19, 2005 - Version 5.69 +
    +
  • Changed UTF-8 bug fix introduced in 5.67 to improve portability and allow it + to work with Perl versions back to 5.6 +
  • Changed some offsets in verbose output from relative to absolute addressing +
  • Improved APP12 decoding +
  • Changed technique for rounding off extracted rational values +
  • API Changes: +
      +
    • Changed handling of floating point numbers to tolerate locales where a + comma is used instead of a decimal point +
    +
+ +Oct. 17, 2005 - Version 5.68 +
    +
  • Added support for reading Sigma RAW (X3F) images +
+ +Oct. 13, 2005 - Version 5.67 (production release) +
    +
  • Added support for reading PICT images +
  • Fixed a problem when writing information via the ExifTool API if using Perl + 5.8 or later and passing a UTF-8 encoded string to SetNewValue(). The + problem generated an error which prevented the file from being written +
  • Fixed timezone problem in timestamps of QuickTime images which was causing + a failed test +
+ +Oct. 10, 2005 - Version 5.66 +
    +
  • Enhanced -tagsFromFile option to allow %d, %f and %e in filenames +
  • Extract a few more tags from Canon EOS 5D images +
  • Allow multiple ICC_Profiles to be extracted from same image and add a number + to the group1 name for subsequent profiles to make the tag locations unique +
  • Changed Photoshop PixelsPerInchX/Y and QuickTime DotsPerInchX/Y tag names to + X/YResolution. Neither has a corresponding ResolutionUnit tag, so inches + should be assumed if no resolution unit is present +
  • Added tests of Nikon, Sony and PDF decryption algorithms +
+ +Oct. 7, 2005 - Version 5.65 +
    +
  • Added read support for QuickTime MOV videos (and QTIF images if anyone + cares) +
  • Extract maker note information from Sony SRF raw images +
  • Improved Jpeg2000 decoding +
  • Decode a few more Photoshop tags +
  • Issue an error if there is extra data after the normal end of file when + rewriting TIFF images (avoids possible data loss if attempting to write an + unsupported RAW image with a TIFF-like data structure) +
  • Added ability to replace existing tags with user defined tags +
  • Denote minor errors/warnings by adding '[minor]' to the message (these are + the errors which can be ignored with the -m option) +
  • Fixed problem of missing LeafSubIFD when rewriting MOS images +
  • Removed hack to write Leaf maker note information at start of image +
+ +Sept. 30, 2005 - Version 5.64 +
    +
  • Improved writing of Canon CR2 images to preserve CR2 header and editing + information written by Canon Digital Photo Professional software +
  • Extract information from JPEG APP0 JFIF segments +
  • Added support for extracting Creo Leaf meta information from MOS images +
  • Added ability to define new tags in .ExifTool_config file and added a sample + ExifTool_config file to the distribution +
  • Extended the -w option to allow an expression to be specified +
  • Allow tag aliases to be used when writing +
  • Changed print conversion of FileSize tag +
  • Internal changes to tag lookup to improve speed when writing information +
  • Decode Photoshop resolution information +
+ +Sept. 21, 2005 - Version 5.63 +
    +
  • Added read support for MP3 and WAV audio files (Oops... ExifTool has + expanded beyond its "Image" roots!) +
  • Added write support for PNG and MRW (Minolta RAW) images +
  • Improved decoding of PNG profile information and added a few new PNG tags +
  • Changes to handling of GPS coordinates: +
      +
    • Added -c (CoordFormat) option to format output of GPS coordinates +
    • Added GPSPosition composite tag +
    • GPS coordinates now show as decimal degrees with the -n option +
    • Much more flexible about the input coordinate format when writing +
    • Enforce proper formatting of XMP GPS coordinates +
    +
  • Added XMP-xmp Rating and Label tags, and a few missing XMP-exif GPS tags +
  • Added new XMP-dex group +
  • Added two new lenses to the Minolta LensID list (thanks Pedro Corte-Real) +
  • Added a new lens to the Olympus list (thanks Shingo Noguchi) +
+ +Sept. 7, 2005 - Version 5.62 +
    +
  • Fixed problem reading FujiFilm maker notes from RAF images +
  • Extract comments from PPM/PGM/PBM images and add write support +
  • Extract maker notes from Nikon Coolscan scanner images +
+ +Sept. 3, 2005 - Version 5.61 +
    +
  • Added read support for PBM, PGM and PPM file formats +
  • Added read support for RAF (FujiFilm RAW) file format +
+ +Sept. 2, 2005 - Version 5.60 +
    +
  • Fixed bug where tag was deleted if TAG+=VALUE used for a non-list type tag +
  • Fixed problem where reading some CRW files could generate a "Use of + uninitialized value in concatenation" warning +
  • Restructured XMP to separate tags by namespace +
  • Added XMP-xmpTPg, XMP-cc, XMP-xmpPLUS and XMP-PixelLive groups +
  • Improved logic for editing XMP list-type tags +
  • Removed SubDirectory tags from -list option output +
  • More updates to Pentax LensType list +
  • Changed Nikon FileSystemVersion tag name to FirmwareVersion +
  • Added NikonCaptureData and NikonCaptureVersion tags +
+ +Aug. 24, 2005 - Version 5.55 (production release) +
    +
  • Added patch to fix word ordering when unpacking doubles on ARM systems with + little-endian byte order but big-endian word order (thanks Riku Voipio) +
  • Added another lens to the Pentax LensType list +
+ +Aug. 22, 2005 - Version 5.54 +
    +
  • Fixed problem introduced in version 5.50 which broke ability to delete + groups of information +
  • Added a couple of new Pentax LensType's +
  • Renamed Olympus Lens tag to LensType +
+ +July 29, 2005 - Version 5.53 +
    +
  • Added -ext option to allow files to be processed or excluded from processing + based on their extension +
  • Added MimeType tag +
  • Convert PDF UTF-16 character strings to UTF-8 (or Windows Latin1 if '-L' + option used) +
+ +July 28, 2005 - Version 5.52 +
    +
  • Removed warning message when writing CR2 files that was intended only for + Canon 1D TIFF files +
+ +July 27, 2005 - Version 5.51 +
    +
  • Assume '-TagsFromFile @' for any redirected tags (eg. '-SRCTAG>DSTTAG' or + '-DSTTAG<SRCTAG') which are specified without a prior '-TagsFromFile' +
+ +July 27, 2005 - Version 5.50 +
    +
  • Don't rewrite entire file if only FileModifyDate is being changed +
  • API Changes: +
      +
    • Added CountNewValues() and SetFileModifyDate() +
    +
+ +July 26, 2005 - Version 5.49 +
    +
  • Decode encrypted PDF documents +
  • Extract metadata from individual PDF pages +
  • Speed up parsing of PDF files which use cross-reference streams +
  • Improvements to verbose PDF output +
  • Updated Nikon LensID's (thanks Robert Rottmerhusen) +
  • Minor changes to Canon LensType strings (thanks Michael Tiemann) +
+ +July 21, 2005 - Version 5.48 +
    +
  • Fixed parsing of XMP-pdf CreationDate and ModDate tags +
+ +July 21, 2005 - Version 5.47 +
    +
  • Fixed problem where existing item in list was getting overwritten when + adding to XMP lists with '-TAG+=VALUE' syntax +
  • Improved verbose output for PDF files and recurse into all Kids dictionaries +
  • Don't print warnings when setting the values of non-priority tags unless + verbose +
  • Added support for PDF-like Adobe Illustrator (.AI) files +
+ +July 19, 2005 - Version 5.46 (production release) +
    +
  • Fixed bug which could cause CRW file to be corrupted under some conditions + when writing and rewriting the same file +
  • Added new Canon MaxAperture tag and a few more Canon LensType's (thanks + Michael Tiemann) +
  • Changed PDF decoding to follow 'Next' links at the same level to avoid deep + recursion in long linked lists +
+ +July 19, 2005 - Version 5.45 +
    +
  • Set FileType tags properly for newly added formats +
  • Added Canon TargetAperture and TargetExposureTime and decode Canon 1D Mark + II lens information structure (thanks Michael Tiemann) +
  • Decode more Canon lenses and Canon TargetImageType +
  • Changed Priority of Error and Warning tags so that first message takes + precedence +
  • Fixed problem where Nikon D70 files grew by 20 bytes each time they were + written +
  • Minor changes to BMP tags +
  • Added support for AI (Adobe Illustrator) file format +
  • Added BMP, PDF, Photoshop and PostScript tests +
+ +July 16, 2005 - Version 5.44 +
    +
  • Added read support for BMP (and DIB) images +
+ +July 16, 2005 - Version 5.43 +
    +
  • Allow shortcut tags to be used with -tagsFromFile +
+ +July 15, 2005 - Version 5.42 +
    +
  • Added ability to read PostScript (EPS and PS) and PDF images +
  • Decode PhotoshopSettings in TIFF images +
+ +July 8, 2005 - Version 5.41 +
    +
  • Added ability to read Photoshop PSD images +
+ +July 8, 2005 - Version 5.40 +
    +
  • Improved decoding of Minolta MRW files to support new cameras +
  • Changed Minolta ImageQuality values to conform with Minolta terminology + (thanks to Niels Kristian Bech Jensen) +
  • Write Windows XP tags to IFD0 instead of ExifIFD (they worked fine in the + ExifIFD, but Windows writes them to IFD0 so they really should go there) +
  • Really quiet option (-q -q) still suppresses warnings, but no longer + suppresses errors +
+ +July 6, 2005 - Version 5.39 +
    +
  • Using -b option now disables -h, -H and -g options +
  • Decode Canon Panorama information +
  • Improved maker note decoding for some Minolta camera models +
  • Changed base offset for Casio EX-Z3 to fix problems decoding some maker note + information (it looks like the samples from dpreview.com I had used to code + this originally had been corrupted by 3rd party software because new samples + downloaded from another web site didn't have the same problem) +
  • Improved validation of PreviewImage +
+ +July 4, 2005 - Version 5.38 +
    +
  • Translate older 'xap' XMP namespace prefixes (xap, xapRights, xapMM and + xapBJ) to their newer 'xmp' counterparts (xmp, xmpRights, xmpMM and xmpBJ) + when generating XMP family 1 group names +
  • Added Minolta LensID (thanks to Shingo Noguchi) +
  • Other changes to Minolta tags (and fix incorrect spellings of Konica, thanks + Niels Kristian Bech Jensen) +
  • Updated Nikon LensID's (thanks Robert Rottmerhusen) +
+ +June 29, 2005 - Version 5.37 +
    +
  • Removed unknown status from Photoshop CopyrightFlag and made it writable +
  • Decode a new Canon EasyMode value +
+ +June 28, 2005 - Version 5.36 +
    +
  • Added new composite tags: DOF, CircleOfConfusion and HyperfocalDistance +
  • Minor changes to simplify and improve generated XMP when writing +
  • Convert FocusDistance tag values to meters +
  • Reject ScaleFactor35efl if outside reasonable limits +
  • Added a few more Nikon LensID's (thanks Robert Rottmerhusen) +
  • Ignore white space around '=' sign of arguments in '-@' file +
+ +June 24, 2005 - Version 5.35 +
    +
  • Added support for MNG and JNG images +
  • Added a few new PNG tags +
+ +June 21, 2005 - Version 5.34 +
    +
  • Decode ASCII-based APP12 information (tested with Agfa and Polaroid images) +
  • Decode remaining PNG chunks in original spec except for IDAT (image data) +
  • Only generate FileSize and FileModifyDate tags for plain files +
+ +June 16, 2005 - Version 5.33 +
    +
  • Changed print conversions for Contrast, Saturation and Sharpness throughout + to be more consistent and to better conform with the EXIF specification +
  • Decode Minolta Dimage Z2 MinoltaImageSize +
+ +June 15, 2005 - Version 5.32 (production release) +
    +
  • Changes to a few PNG and MIFF tag names +
  • Improved PNG/MIFF documentation +
+ +June 14, 2005 - Version 5.31 +
    +
  • Decode compressed information in PNG images if Compress::Zlib is available +
  • Decode profile information (including EXIF, XMP, IPTC and ICC_Profile + information) from PNG and MIFF images +
  • Updated Nikon LensID strings and decode D50 lens info (thanks Robert + Rottmerhusen) +
+ +June 10, 2005 - Version 5.30 +
    +
  • Added PNG and MIFF read support +
  • Decode Nikon SensorPixelSize +
+ +June 9, 2005 - Version 5.27 +
    +
  • Added -q option +
+ +June 8, 2005 - Version 5.26 +
    +
  • Automatically fix out-of-sequence entries in IFD when writing to comply with + the TIFF specification (but not in maker notes) +
  • Create new EXIF information using the same byte order as the maker notes + when using -tagsFromFile to copy maker notes to a file which previously + contained no EXIF information +
  • Fixed problem which could copy corrupted maker notes if using multiple + -tagsFromFile options in a single command +
  • Changed Orientation "Rotate 90 CCW" to "Rotate 270 CW", and changed Canon + AutoRotate strings to match +
  • Made StripOffsets and StripByteCounts binary data if output is too long +
  • Allow "-TagsFromFile '-TAG<SRCTAG'" as well as the current '-SRCTAG>TAG' +
  • Recognize some more Nikon lenses +
  • API Changes: +
      +
    • Added ByteOrder option to specify byte ordering when creating new EXIF + segment in a JPEG file +
    +
+ +June 3, 2005 - Version 5.25 (production release) +
    +
  • Fixed problem with writing IPTC Time tags +
  • Changed Composite ShutterSpeed to ignore bulb duration if it is negative +
  • API Changes: +
      +
    • Allow tag name to be prefixed by group in calls to SetNewValue() +
    +
+ +June 1, 2005 - Version 5.24 +
    +
  • Added new "XMP" tag to allow read/write of XMP data as a block +
  • Added numbers to subsequent SubIFD group names to allow tags in various + SubIFD's to be accessed individually +
  • Give priority to tags in full resolution image (whichever TIFF directory + this is in) +
  • Renamed ExifData tag to EXIF (but didn't make it writable as a block like + XMP) +
  • Recognize maker notes from more Konica Minolta cameras +
  • Extract PreviewImage for Samsung Digimax V700, Kenox V10 and Digimax V10 +
  • Changed validation of CanonPictureInfo to work with more PowerShot cameras + (Note: for these cameras, CanonImageHeightAsShot may not be meaningful) +
  • Added a number of new IPTC ApplicationRecord tags +
  • Added Nikon ExposureDifference tag +
  • Removed trailing white space in values printed by exiftool +
+ +May 27, 2005 - Version 5.23 +
    +
  • Changed behaviour of -tagsfromfile slightly so that '-GROUP:TAG>DSTTAG' now + commutes information between different groups unless a destination group is + specified +
  • Improved reliability of calculating offsets in Pentax maker notes +
+ +May 26, 2005 - Version 5.22 +
    +
  • Fixed problem with new '-tagsFromFile @' feature which occurred when + simultaneously copying tags and writing new values to multiple target files + (the new values were only getting written to the first file) +
+ +May 25, 2005 - Version 5.21 +
    +
  • Allow target file to be specified by '@' with -TagsFromFile option +
  • Fixed bug which caused internal error when using -TagsFromFile option to + copy PrintIM information to a file that already contained PrintIM data +
  • Fixed problem which broke the (now deprecated) -allTagsFromFile=FILE syntax +
  • Fixed problem decoding Pentax Date for some Optio cameras +
  • Fixed problem in GeoTiff decoding which could cause some tags to be missed +
  • Decode a number of new Pentax tags (using my new Optio WP!) +
  • Made Photoshop URL writable +
  • Limit length of JPEG segment dump at Verbose=4, and add Verbose=5 level +
  • API Changes: +
      +
    • Added SaveNewValues() and RestoreNewValues() +
    +
+ +May 20, 2005 - Version 5.20 +
    +
  • Give names to many Photoshop tags, but leave them marked as 'Unknown' so + they aren't extracted under normal circumstances (must use the -u option) +
  • Read/write Kyocera maker notes properly (although Kyocera information + remains unknown) +
  • Changed installation tests to tolerate rounding-off errors or format + differences in floating point numbers +
+ +May 17, 2005 - Version 5.19 +
    +
  • Added -overwrite_original option +
+ +May 16, 2005 - Version 5.18 (production release) +
    +
  • Added -@ option and two utility files (iptc2xmp.args and xmp2iptc.args) to + use with this option for translating between IPTC and XMP tag names +
  • Disable normal console output if -v option used and no tags specified +
  • Repair incorrect first byte of MRW preview images when extracting +
  • More tweaking of -TagsFromFile order of operations +
+ +May 14, 2005 - Version 5.17 +
    +
  • Allow 'All' to be used as a group name with '-TagsFromFile' option to + preserve original tag groups (eg. '-all:all') +
  • PrintIM information is now copied with -TagsFromFile +
  • Decode EXIF:Gamma tag +
  • Decode Canon 350D FileNumber +
  • Made a few more tags writable +
  • Don't rewrite TIFF files which could be Canon 1D RAW files since this + format currently isn't supported (can use the -m option to write anyway, + which will remove the RAW image data if this is a 1D file) +
  • Don't add null terminator to UserComment, GPSProcessingMethod or + GPSAreaInformation +
  • Improved logic for handling command line tag names and exclusions, + especially when associated with the -TagsFromFile option +
+ +May 10, 2005 - Version 5.16 +
    +
  • Decode a number of new Nikon lens-related tags (thanks again Robert + Rottmerhusen) +
  • Various other improvements +
+ +May 7, 2005 - Version 5.15 +
    +
  • Added powerful new information redirection feature to -TagsFromFile option +
  • Added writable File:FileModifyDate tag which represents the filesystem + date/time of last modification +
  • Allow '*' to also be used as well as 'all' to represent all tags, although + this feature is not documented for the command-line options because 'all' is + more convenient since '*' must be quoted to prevent shell globbing +
+ +May 5, 2005 - Version 5.11 +
    +
  • Fixed problem where the proper tags weren't excluded from being extracted if + -GROUP:All and --TAG options are used together on the command line +
+ +May 5, 2005 - Version 5.10 +
    +
  • Changed -AllTagsFromFile option to -TagsFromFile and allow copied tags to be + specified on the command line. (-AllTagsFromFile is preserved as an alias + to -TagsFromFile for backward compatibility.) +
  • Allow -GROUP:All and --GROUP:All on command line to extract or exclude all + tags in specified group +
  • Allow family 1 group names to be used when deleting groups with -GROUP:All= +
  • Added composite CFAPattern derived from CFARepeatPatternDim and CFAPattern2 +
  • Fixed problem where tags which can exist in both IFD0 and ExifIFD weren't + being properly removed from one IFD when written to the other +
  • Added FAQ +
+ +May 2, 2005 - Version 5.06 +
    +
  • Made a few more EXIF tags writable +
  • No longer add null-terminator to JPEG comment (was confusing xv) +
+ +Apr. 20, 2005 - Version 5.05 (production release) +
    +
  • Added Nikon LensFStops tag (thanks to Robert Rottmerhusen) +
  • Reliability improvements for writing maker notes information +
  • exiftool now returns error status if there were errors reading/writing files +
+ +Apr. 18, 2005 - Version 5.04 +
    +
  • Fixed problem where maker notes of Olympus C2500L could get corrupted when + writing +
+ +Apr. 18, 2005 - Version 5.03 +
    +
  • ExifTool now requires Perl version 5.004 or higher (previously 5.002 was OK) +
  • Restrict the size of preview images where data is referenced directly as + the value data of an IFD entry (only affects Casio images) +
  • Fixed problems rewriting some Casio maker notes +
  • Change priority of orientation (and a number of other tags which may appear + in IFD1) so value in IFD0 takes precedence of value in IFD1 if it exists +
  • API Changes: +
      +
    • Allow any file reference, not only GLOB references, to be used in + function calls +
    +
+ +Apr. 16, 2005 - Version 5.02 +
    +
  • Fixed problem rewriting Pentax *istD preview image +
+ +Apr. 15, 2005 - Version 5.01 +
    +
  • Major speed improvements for writing large JPEG files with preview images +
  • Fixed problem rewriting preview in Olympus E-1 and E-300 images +
  • Old large preview is now properly removed when writing new small preview +
  • Allow PreviewImage to be deleted (ie. set length to zero) +
  • Don't extract images that have zero length +
  • Deleting MakerNotes group now works in conjunction with -allTagsFromFile +
  • Change image validation again to only validate images for tags that were + specifically requested +
  • Separate lookups by manufacturer for Olympus lens information +
+ +Apr. 14, 2005 - Version 5.00 +
    +
  • ALL MAJOR PLANNED WRITING FEATURES NOW IMPLEMENTED! +
  • Finally solved problem of writing large preview images in JPEG files +
  • -AllTagsFromFile now sets PreviewImage to 'dummy' if it exists in the maker + notes to avoid writing a large preview to the destination file (now you have + to do this manually afterwards if this is what you want) +
  • Fixed problem rewriting Olympus E1 maker note subdirectories +
  • Only validate extracted images when Binary (-b) option is used +
  • Rename Olympus PreviewImageAvailable to PreviewImageValid, and check/set + this tag when reading/writing the preview image +
  • Change priority of X/YResolution tags so IFD0 value takes precedence +
  • Changes to Olympus Lens decoding +
+ +Apr. 11, 2005 - Version 4.95 +
    +
  • Added ability to delete all meta information, or all information in a group +
  • Create some mandatory IPTC tags automatically when writing IPTC information +
  • Decoded a bunch more Olympus tags (thanks to Frank Ledwon) +
  • Decoded a couple more Canon 1D MkII tags (thanks to Denny Priebe) +
  • Fixed problem where Sony maker notes could be corrupted when rewriting file +
  • Fixed problem that could cause wrong tag description to be printed for + missing tags when the -f option is used +
  • Account for different encoding of Canon ExposureTime in 20D and 350D, and + lower priority of Canon ExposureTime and FNumber so regular EXIF values take + precedence because it appears these values may be model dependent (I hate it + when that happens) +
+ +Apr. 6, 2005 - Version 4.94 +
    +
  • Added support for Kodak DX3215 and DX3700 +
  • Improved Kodak decoding and changed some Kodak tag names +
  • Improved logic to guard against cyclical recursion in EXIF directories +
  • Allow tags to be edited in IFD2, IFD3, etc... +
  • Patched problem when writing Canon 350D images due to probable bug in 350D + firmware (version 1.0.1) that writes an incorrect ThumbnailLength in IFD1 +
+ +Apr. 2, 2005 - Version 4.93 (production release) +
    +
  • Added IPTC XMP Core support +
  • Added support for Kodak CX4200 plus other minor Kodak changes +
  • Made Kodak maker notes writable +
  • Minor changes to Olympus tag names and decoding +
  • Split HTML TagNames documentation into separate files +
+ +Mar. 31, 2005 - Version 4.92 +
    +
  • Added support for Kodak and Ricoh cameras +
  • Decode still more Olympus E-1/E-300 tags (thanks Markku Hänninen) +
  • Added 'Directory' tag +
  • Decode a few more Pentax tags (thanks to John Francis) +
  • Allow newlines in tag values on command line when writing +
  • Fixed problem rewriting makernotes with sub directories (eg. Olympus) +
+ +Mar. 28, 2005 - Version 4.91 +
    +
  • Decode yet more Olympus E-1/E-300 tags (thanks Markku Hänninen) +
  • Changed decoding of Olympus E-300 Quality tag +
  • Patched bug in Olympus maker notes that was causing ExifTool to report an + error when reading ORF files +
  • Fixed problem where strings weren't being properly truncated at the null + terminator if there was a newline after the terminator +
  • Improved decoding for some Nikon tags (thanks Tom Christiansen) +
  • Added Nikon shortcut +
  • Added composite SubSecDateTimeOriginal tag +
  • Fixed problem where CRW file without file extension wasn't being identified + properly +
  • Fixed problem extracting thumbnail from some (specifically Olympus) images +
  • Changed verbose output to always show original EXIF format +
  • Skip over EXIF entries with unknown format instead of aborting (while + reading only) +
  • Recognize TIFF field type 13 +
+ +Mar. 24, 2005 - Version 4.90 +
    +
  • Extract Olympus PreviewImage, and decode a bunch more Olympus tags +
  • Improvements to documentation +
+ +Mar. 23, 2005 - Version 4.89 +
    +
  • Decode subdirectories in Olympus maker notes (now much more information is + extracted for E-1 and E-300 cameras, although most is still unknown) +
+ +Mar. 22, 2005 - Version 4.88 +
    +
  • Convert exiftool help to POD format +
+ +Mar. 15, 2005 - Version 4.87 (production release) +
    +
  • Added notes to TagNames documentation +
+ +Mar. 11, 2005 - Version 4.86 +
    +
  • Extract PreviewImage from CR2 files +
  • Create mandatory GPS tags when adding new GPS directory +
  • Bring IPTC newsphoto support up to spec (as if anyone uses this crap) +
  • Fixed problem when setting 8-bit integer IPTC values +
+ +Mar. 10, 2005 - Version 4.85 +
    +
  • Create most mandatory EXIF entries automatically when a new EXIF directory + is created +
  • Fixed problem which caused an error when adding XMP information to a TIFF + file which didn't previously contain XMP +
  • Made '=' optional with -AllTagsFromFile option +
  • Fixed problem with verbose dump of zero-length directory (eg. Sony F717 + maker notes) +
+ +Mar. 9, 2005 - Version 4.84 +
    +
  • Interpret Olympus ImageQuality of 6 as RAW +
  • Remove validation of TIFF identifier to allow forward compatibility with + untested RAW file formats (ORF files in particular seem to fiddle with this + identifier) +
+ +Mar. 8, 2005 - Version 4.83 +
    +
  • Extract ThumbnailImage from Canon CRW files written by some cameras +
  • Recognize ORF files from Olympus C5060WZ (and hopefully some others too!) +
+ +Mar. 7, 2005 - Version 4.82 +
    +
  • Made a number of new EXIF tags writable, but classify them as 'unsafe' so + they aren't copied over with the -AllTagsFromFile option +
  • Recognize a number of new and very uncommon EXIF tags +
  • Remove copy number from tag name when using the -S option +
  • Interpret Photoshop XMP:ColorSpace value of 4294967295 as 'Uncalibrated' +
+ +Mar. 4, 2005 - Version 4.81 +
    +
  • Added user-definable shortcuts +
  • Fixed problem with XMP:Identifier (should have existed in both XMP-dc and + XMP-xmp) +
+ +Mar. 2, 2005 - Version 4.80 +
    +
  • The -n option now prints binary data values as "Binary data #### bytes" +
  • API Changes: (NOTE: Change in API behaviour for binary data values) +
      +
    • Changed returned ValueConv values so that binary data is now returned as + a SCALAR reference, the same as with PrintConv values +
    +
+ +Mar. 1, 2005 - Version 4.73 (production release) +
    +
  • Minor changes to XMP parsing to increase speed and improve validation +
+ +Feb. 28, 2005 - Version 4.72 +
    +
  • Extract info from UTF-16 and UTF-32 encoded XMP +
  • Convert EXIF text fields if encoded in Unicode +
  • Fixed a few incorrect XP character translation codes +
  • Fixed name of Nikon ColorBalanceD2H tag +
+ +Feb. 25, 2005 - Version 4.71 +
    +
  • Fixed bug introduced in 4.70 which caused error when transferring + information using -AllTagsFromFile from a RAW file to a JPEG file +
+ +Feb. 24, 2005 - Version 4.70 +
    +
  • Allow family 1 group name to be specified for any tag while writing +
  • Fixed problem with writing Nikon PreviewImage to NEF files +
+ +Feb. 23, 2005 - Version 4.67 +
    +
  • Added -L option to allow XP characters to be converted to Latin character + set instead of UTF-8. (Now XP characters can be displayed properly in + terminal windows which use either the UTF-8 or WinLatin1 character set.) +
  • Make JpgFromRaw image writable in Nikon NEF files +
+ +Feb. 21, 2005 - Version 4.66 +
    +
  • Recognize JPEG 2000 XMP UUID information +
  • Extract Meta information from JPEG APP3 +
  • Yet more playing with XP characters (this has been a learning process for + me). Now special characters show up properly in my OSX terminal window, and + the reverse translation works so now they get written properly as well (for + Perl 5.6.1 or greater anyway... Earlier versions don't have the required + UTF-8 support to handle these special characters) +
  • Improvements to TagNames documentation (including changing format names to + make them more consistent across different types of meta information) +
+ +Feb. 18, 2005 - Version 4.65 +
    +
  • Fixed problem in translating XP characters +
+ +Feb. 17, 2005 - Version 4.64 (production release) +
    +
  • Added new tag name documentation (replaces old tag lists) +
  • Made a few more DNG tags writable +
+ +Feb. 15, 2005 - Version 4.63 +
    +
  • Remove null terminators in ICC_Profile 'desc' strings +
  • Treat Olympus CameraID as a string (why wasn't it written this way?) +
  • Added print conversion for EXIF:CFAPattern +
+ +Feb. 14, 2005 - Version 4.62 +
    +
  • Convert XPTitle, XPComment, XPKeywords etc from XP character codes and add + write support for these tags +
  • Decode JPEG 2000 Resolution, Label and URL information +
  • Another try at patching 3 digit exponent situation which causes failed tests + on MSWin32-x86 +
  • Removed .J2K from recognized extensions (since apparently this is a raw JP2 + codestream, and doesn't contain any metadata that ExifTool can extract) +
+ +Feb. 14, 2005 - Version 4.61 +
    +
  • Don't print filename line when -p option used +
  • JPEG 2000 improvements +
  • Also recognize .JPX and .J2K extensions +
+ +Feb. 11, 2005 - Version 4.60 +
    +
  • Added support for reading the JPEG 2000 (.JP2) files +
  • Improved warnings on errors while setting tag values +
+ +Feb. 10, 2005 - Version 4.54 +
    +
  • Added ColorTemperature tag for many Canon models +
  • Added AutoRotate for Canon 10D and 300D +
  • Lowered priority of Nikon ISO so that EXIF ISO is used instead if both exist +
  • Changed names of PentaxISO and Casio ISOSetting to ISO, and lowered priority + as with Nikon ISO +
  • Made Photoshop EXIF Camera RAW tags writable +
+ +Feb. 7, 2005 - Version 4.53 (production release) +
    +
  • Added FileNumber for Canon 20D (decoded by Juha Eskelinen) +
  • Removed CanonA0Tag +
+ +Feb. 4, 2005 - Version 4.52 +
    +
  • Added another CanonRaw test +
  • Changes to Canon CRW documentation +
+ +Feb. 4, 2005 - Version 4.51 +
    +
  • Finally found documentation for Canon CRW files (CIFF format)!! +
  • Changed CanonRaw to bring code up to CIFF specification +
  • Added a bunch more CanonRaw tags +
  • Updated Canon CRW documentation +
+ +Feb. 2, 2005 - Version 4.50 +
    +
  • Allow writing to specific IFD +
  • Allow permanent tags (eg. MakerNotes tags) 'deleted' by setting them to an + empty string if '' is a valid value for the tag +
  • Added test for rewriting Nikon D70 information +
  • Added missing inverse conversion routines for GPS tags (now they are all + writable) +
  • Decoded a few more Canon and CanonRaw tags +
  • Added -z option to extract information from images in compressed files +
  • Improved CanonRaw verbose output +
  • Remove garbage after null terminator in CanonRaw string-type tags +
+ +Jan. 30, 2005 - Version 4.45 +
    +
  • Added a few more Canon tags +
  • Fixed bug with divide by zero error (in Perl, '0.0' is a true value -- doh!) +
+ +Jan. 30, 2005 - Version 4.44 +
    +
  • Sort entries in synthesized Canon MakerNotes directory +
  • Interpret Canon custom functions for models other than 10D in CRW files +
+ +Jan. 29, 2005 - Version 4.43 +
    +
  • Synthesize Canon MakerNotes information when using -allTagsFromFile for a + CRW file +
  • Decode WhiteBalance table in Canon maker notes +
  • Rename CanonRaw CanonFileType tag to CanonImageType +
+ +Jan. 28, 2005 - Version 4.42 +
    +
  • Fixed problem where multiple IPTC tags could be created if replacing + specific IPTC tag values with 'TAG-=VALUE' +
  • Made EXIF SceneType writable +
  • Renamed Nikon ISOUsed tag to ISO +
  • Added documentation of Canon RAW (CRW) file format +
+ +Jan. 27, 2005 - Version 4.41 +
    +
  • Added write support for Canon exposure parameters +
  • Change validation of CanonPictureInfo to get it working for Canon 20D +
+ +Jan. 26, 2005 - Version 4.40 +
    +
  • Added ability to write Canon RAW (CRW) files. With this format you aren't + allowed to add or delete any new tags (just as with the MakerNotes), except + for JpgFromRaw, which I like to be able to delete to save disk space +
  • Added validation of JpgFromRaw images +
  • Relax filtering on non-ASCII characters by exiftool script to allow + high-ASCII characters to be printed +
  • Changed the tense of Orientation values to try to make the meaning more + clear. This tag can be a bit confusing. It gives the rotation that must be + applied to the image to view it properly (hence the rotation of the camera + when the picture was taken). +
  • Patched problem which was causing failed tests on some platforms (floating + point format has 3 digits in exponent on Perl 5.8.5 MSWin32-x86, grrrr...) +
  • API Changes: +
      +
    • Added 'Compact' option to not write blank padding as per XMP and IPTC + specs +
    +
+ +Jan. 24, 2005 - Version 4.36 (production release) +
    +
  • Added support for reading Olympus Raw Format (ORF) +
+ +Jan. 23, 2005 - Version 4.35 +
    +
  • Moved a couple of the informational warnings to verbose mode +
  • Suppress warnings an non-critical errors with -m option +
  • Made a few more of the EXIF tags writable +
  • Made model-dependent tags Pentax FocalLength and Olympus Quality writable +
  • Added ability to write CanonCustom tags +
  • Added range check for integer values +
+ +Jan. 21, 2005 - Version 4.34 +
    +
  • Fixed problem when writing Canon maker notes with -allTagsFromFile +
  • Added -o option to write to different file or directory +
  • Added handler to clean up temporary file on Ctrl-C +
  • Re-wrote routine to rationalize floating point values (it is slower now, but + produces much prettier fractions) +
  • Other minor improvements to writer code +
+ +Jan. 19, 2005 - Version 4.33 +
    +
  • Added check at higher level and return warning if trying to delete + information from maker notes +
  • Make GPS latitude and longitude a bit more flexible about the format they + accept when writing +
  • Updates to documentation +
+ +Jan. 19, 2005 - Version 4.32 +
    +
  • Now rewrites Casio EX-Z3 maker notes properly (well, not actually + 'properly', but the way they were written in the first place, which is + wrong) +
  • Added warning when writing information if original IFD entries were not in + the proper sequence, which is a violation of EXIF specs. (And surprise, + you'll never guess who does this too... Yup, the EX-Z3.) +
  • Fixed parsing problem with GPSProcessingMethod and GPSAreaInformation +
  • No longer truncates 'undef' values at first null character +
  • Changed all DataDump tags to binary data types +
  • Changed some warning messages +
  • Documented the -m option (it's now official, even though it's been there + since version 4.10) +
  • Added some more writer tests +
+ +Jan. 18, 2005 - Version 4.31 +
    +
  • Now also copies over preview image in Nikon NEF files +
+ +Jan. 18, 2005 - Version 4.30 +
    +
  • Now copies over preview images in EXIF data (large, external previews still + not copied) +
  • Account for funny offsets in Casio EX-Z3 maker notes while extracting data + (but haven't figured out how to handle them when writing) +
  • Fixed bug introduced in 4.20 that broke extraction of Canon PreviewImage +
+ +Jan. 17, 2005 - Version 4.23 +
    +
  • Improve handling of unrecognized maker notes when writing +
+ +Jan. 17, 2005 - Version 4.22 +
    +
  • Added check in -AllTagsFromFile to test for pointers in the maker notes + directory running outside the maker notes data. If they do, a warning is + issued and the maker notes are rebuilt properly before copying. +
  • Fixed problem which could corrupt some values when editing maker notes +
+ +Jan. 17, 2005 - Version 4.21 +
    +
  • Added Olympus Red/BlueBalance +
+ +Jan. 17, 2005 - Version 4.20 +
    +
  • Added ability to edit MakerNotes! +
  • Added more validation when writing IPTC information +
  • Fixed display of Nikon FlashExposureComp for negative values +
  • Fixed problem where the large JPEG image in Nikon and Pentax raw files was + misidentified as the ThumbnailImage. It is now extracted as JpgFromRaw. + This allows all 3 JPEG images contained in Pentax PEF files to be extracted: + ThumbnailImage, PreviewImage and JpgFromRaw. +
  • Fixed problem on systems that use backslashes in directory names that + prevented exiftool from finding its libraries if not installed +
  • Changed many Pentax tag names to remove "Pentax" prefix and conform more to + the other tag names (moving information between files of different formats + is much easier if tags have standardized names): +
      +
    • PentaxPictureMode => PictureMode +
    • PentaxFocusMode => FocusMode +
    • PentaxWhiteBalance => WhiteBalance +
    • PentaxAEMetering => MeteringMode +
    • PentaxFocalLength => FocalLength +
    • PentaxZoom => DigitalZoom +
    • PentaxSaturation => Saturation +
    • PentaxContrast => Contrast +
    • PentaxSharpness => Sharpness +
    +
  • Fixed FocalLength conversion for Pentax Optio S +
  • Fixed printout of Nikon FileSystemVersion for older Nikon models +
  • More improvements to reliabilty of preview image extraction +
  • Fixed Quality for Olympus E-1 +
+ +Jan. 12, 2005 - Version 4.15 +
    +
  • Added Pentax LensType and RawImageSize tags +
  • Change printing of some unknown values to hexadecimal +
  • Now recognizes Nikon PEF files +
  • More reliable extraction of preview and thumbnail images, particularly for + the various models of Pentax cameras +
  • Added decoding of the Canon 20D custom functions and a new Canon20D shortcut + (thanks to Christian Koller) +
  • Improved write logic for EXIF information +
  • Improved logic in determining byte ordering of maker notes +
+ +Jan. 10, 2005 - Version 4.14 +
    +
  • Fixed problem introduced in 4.13 that messed up new 4.12 features. doh. + (and added test to keep this from happening again!). +
  • No longer store bad directory data as a tag (dump in verbose output instead) +
+ +Jan. 9, 2005 - Version 4.13 +
    +
  • Added check on size of new ThumbnailImage so ExifTool doesn't try to write + an image that is too large (>60k) into the JPEG EXIF APP1 segment +
+ +Jan. 9, 2005 - Version 4.12 +
    +
  • -AllTagsFromFile option now copies over the maker notes +
  • Changed some misleading warning messages +
+ +Jan. 8, 2005 - Version 4.11 +
    +
  • Improved validation of tag values with -AllTagsFromFile option +
+ +Jan. 7, 2005 - Version 4.10 +
    +
  • Added ability to write EXIF, IPTC and XMP tags in JPEG and TIFF files! +
  • Allow Photoshop APP13 data to span multiple segments (read and write) +
  • Added -TAG+=VALUE, -TAG-=VALUE and -TAG<=VALUE syntaxes +
  • Added -GROUP:TAG syntax to allow tag group to be specified +
  • Added powerful -AllTagsFromFile=SRCFILE option to copy all tags from file +
  • Added -listw option to list all writable tags +
  • Added -E option to escape output values for HTML +
  • Fixed -w option to only replace extension after last '.' in filename if more + than one '.' +
  • Unescape XMP character codes when extracting values (and escape again when + writing) +
  • Now processes all IFD's of TIFF imags (not just IFD0) +
  • Added data length check in hex dump of verbose option +
  • Allow group name to be specified as prefix to tag name on command line +
  • Renamed a few Nikon tags: FlashExposureComp to FlashExposureBracketValue, + FEC to FlashExposureComp, and ShutterReleaseMode to ShootingMode +
  • Extract Nikon preview image +
  • Changed descriptions for Aperture and Shutter Speed to drop the Av/Tv + Canonism +
  • Improved logic to recognize more types of unknown maker notes +
  • Recognize a couple more values of the Canon WhiteBalance tag +
  • Renamed IPTC 'SupplementalCategory' to 'SupplementalCategories' +
  • Handle timezone in times +
  • API Changes: +
      +
    • Fixed problem where first tag name passed to GetInfo() was ignored +
    • The values returned by ImageInfo() and GetInfo() may contain array + references to indicate lists of values if PrintConv is disabled +
    • Added a bunch of new stuff... +
    +
+ +Dec. 15, 2004 - Version 4.05 +
    +
  • Added a couple of Nikon tags (thanks Brian Ristuccia) +
  • Now preserves original file by renaming to "NAME_original" when writing + information +
  • Don't preserve file time by default when writing. Added -P option to do + this. +
  • Changes to spec file +
+ +Dec. 11, 2004 - Version 4.04 +
    +
  • Fixed problem which could corrupt JPEG images when adding comments (Note: if + done, the damage can reversed by removing the comments with the same version + of ExifTool that added them.) +
+ +Dec. 6, 2004 - Version 4.03 +
    +
  • Major overhaul of verbose message output +
  • Change -v option to allow verbose level to be specified (eg. -v3 = very very + verbose) +
  • Added a new Nikon tag (thanks Thomas Walter) +
  • Count images which were unchanged when writing tags +
  • Changed FileType 'JPG' to 'JPEG' +
+ +Dec. 2, 2004 - Version 4.02 +
    +
  • Fixed problem with rewriting some JPEG images +
  • Preserve original file modification time when updating tags in a file +
  • Report of number of files updated +
  • API Changes: +
      +
    • Changed arguments of WriteInfo() and allow scalar and file references to + be used +
    +
+ +Dec. 1, 2004 - Version 4.01 +
    +
  • Changed -o option to -w to avoid confusion since we now write image files + too +
  • Added warning if specified image file doesn't exist +
+ +Dec. 1, 2004 - Version 4.00 +
    +
  • Started down the road of adding write support: +
      +
    • Allow writing of Comment tag to JPEG and GIF files +
    +
  • API for write functions still under development and is likely to change +
  • Clean up formatting of Nikon string tags (fix case and remove trailing + spaces) +
+ +Nov. 30, 2004 - Version 3.96 +
    +
  • Changed JPEG read routine to speed things up a bit +
  • Added a few more ICC_Profile tags +
+ +Nov. 25, 2004 - Version 3.95 +
    +
  • Improved compatibility with old Perl versions (now runs, albeit with + warnings, on 5.003) +
+ +Nov. 25, 2004 - Version 3.94 (production release) +
    +
  • Patched problem with reading XMP data using Perl 5.6.x (Perl bug) +
  • Put lib directory first in exiftool include list to take precedence over + installed versions +
  • Continue trying to parse JPEG image after an unrecognized APP1 segment +
+ +Nov. 24, 2004 - Version 3.93 (production release) +
    +
  • Final round of ICC_Profile updates +
  • Increase precision of extracted rational values +
  • Internal Changes: +
      +
    • Build in better support for all data formats +
    • Standardize data format names +
    • Clean up and streamline data read routine +
    +
+ +Nov. 22, 2004 - Version 3.92 +
    +
  • Fixed problem with -p option when multiple files are specified +
  • Enhancements to ICC_Profile information, including extracting information + from profile header +
  • Subdivide ICC_Profile group in family 1 +
  • Added Minolta ImageStabilization tag +
+ +Nov. 20, 2004 - Version 3.91 +
    +
  • Fixed problem where some tags were not extracted properly from Canon CR2 + files +
  • Internal Changes: +
      +
    • Cleaned up and simplified pointer calculations and dirInfo members +
    +
+ +Nov. 20, 2004 - Version 3.90 +
    +
  • Extract information from ICC Profiles +
  • Extract undocumented IFD0 Photoshop tags +
  • Added support for Minolta RAW (MRW) file format +
  • Added support for Konica-Minolta cameras +
  • Improved decoding for Minolta maker notes +
  • Extract (the sometimes misleading) EXIF WhiteBalance tag even if + WhiteBalance was extracted from the maker notes if the Duplicates option is + set. (Previously it was only extracted as an Unknown tag in this case.) +
  • API Changes: +
      +
    • Return list of all tags in image if GetFoundTags() or GetTagList() are + called before ImageInfo() or GetInfo() +
    +
+ +Nov. 15, 2004 - Version 3.85 +
    +
  • Extract a couple more Photoshop tags (including PhotoshopQuality) +
  • All XMP lists now comma separated (previously, 'alt' lists were separated by + '|') +
  • API Changes: +
      +
    • GetValue() now returns reference to array if values form a list and + ValueConv is specified +
    +
+ +Nov. 12, 2004 - Version 3.84 +
    +
  • Added test of GetTagID() +
  • Fixed bug in GetTagID() which was causing special tags to get overwritten +
+ +Nov. 12, 2004 - Version 3.83 +
    +
  • Added -D and -H command line options +
  • API Changes: +
      +
    • Added GetTagID() +
    +
+ +Nov. 11, 2004 - Version 3.82 (production release) +
    +
  • Improved diagnostic output for failed tests in installation +
+ +Nov. 11, 2004 - Version 3.81 +
    +
  • Updated Olympus module to also support Epson cameras +
  • Moved MakerNotes code into separate module +
  • Added tests for Sony and Unknown maker notes +
+ +Nov. 10, 2004 - Version 3.80 +
    +
  • Added support for Panasonic/Leica cameras +
  • Updated Pentax module to also support Asahi cameras +
  • Decode a couple more Minolta camera model types +
+ +Nov. 4, 2004 - Version 3.74 (production release) +
    +
  • Properly localize $_ in public Image::ExifTool subroutines +
+ +Nov. 3, 2004 - Version 3.73 +
    +
  • Changes to tests to avoid false failures on MSWin32-x86-multi-thread 4.0 +
+ +Nov. 1, 2004 - Version 3.72 (production release) +
    +
  • Fixed minor bug in generation of family 1 XMP group names +
  • Changes to Photoshop family 2 groups +
+ +Oct. 30, 2004 - Version 3.71 +
    +
  • Switched group families 0 and 1 so the general location is now the default +
  • Fixed bug when sorting by order of group for any family other than 0 +
  • Added test 17 to ExifTool.t +
+ +Oct. 29, 2004 - Version 3.70 +
    +
  • Major improvements to XMP parsing +
  • Divided XMP group in family 0 based on the XMP namespace prefix +
  • Changed a few long tables to binary type +
  • Recognize some new YCbCrSubSampling values +
  • Display DNG LocalizedCameraModel in plain text +
  • Patched problem in FileSource reported by Sigma cameras +
  • Added information about tag format to verbose hex dump +
+ +Oct. 22, 2004 - Version 3.61 +
    +
  • Added support for DNG file format +
  • Added and updated a number of EXIF tags for FAX and other uncommon images +
  • Added Photoshop URL tag +
  • Attempt to extract image from files with unrecognized extensions assuming + TIFF format +
  • Added "Image format error" if the image type is recognized but the format is + bad +
  • Changed "Unknown file type" error to "Unknown image type" +
  • Moved POD documentation into separate .pod files +
  • Started referencing sources for tag definitions in the source code +
+ +Oct. 1, 2004 - Version 3.60 (production release) - initial CPAN release! +
    +
  • Changed group family 0 to divide EXIF group into individual IFD groups +
  • Fixed typos in some Casio tag names +
  • API Changes: +
      +
    • Changed name of File::RandomAccessFile to File::RandomAccess +
    • Changed default setting of Duplicates to 1 +
    +
+ +Sept. 21, 2004 - Version 3.51 +
    +
  • Improvements to interpretation of Nikon D70 ISO settings +
+ +Sept. 16, 2004 - Version 3.50 +
    +
  • Fixed problem with duplicate tags showing up without the -a option +
  • Changed Nikon DataDump to a binary type +
  • Added D70Boring shortcut +
+ +Sept. 14, 2004 - Version 3.49 +
    +
  • Changed installation to also install the 'exiftool' script +
+ +Sept. 13, 2004 - Version 3.48 +
    +
  • Changed UserComment to skip first 8 bytes since the comments come after an 8 + byte character code +
+ +Sept. 10, 2004 - Version 3.47 +
    +
  • Added support for second type of Casio maker notes (MakerNoteCasio2) +
+ +Sept. 1, 2004 - Version 3.46 +
    +
  • Fixed minor bug in PrintConv of FileNumber for CanonRaw files +
+ +June 3, 2004 - Version 3.45 +
    +
  • Recognize Canon 1D Mk II raw files (.CR2) +
    (Note: Not properly decoding maker notes from these files yet) +
+ +May 28, 2004 - Version 3.44 +
    +
  • Improved validity check of Sony maker notes +
+ +May 18, 2004 - Version 3.43 +
    +
  • A couple more changes to the Nikon maker notes +
+ +May 17, 2004 - Version 3.42 +
    +
  • Additions to Nikon maker notes for values derived from D70 +
+ +Apr. 28, 2004 - Version 3.41 +
    +
  • Fixed some errors when running on older Perl versions +
+ +Apr. 7, 2004 - Version 3.40 +
    +
  • Try to extract data from unrecognized maker notes (assuming standard EXIF + format) +
  • Added tests for different maker notes +
+ +Apr. 6, 2004 - Version 3.37 +
    +
  • Added support for Sigma maker notes +
  • Remember to add new files to MANIFEST so they get included in release. Doh +
+ +Apr. 6, 2004 - Version 3.36 +
    +
  • Added support for Sanyo and Minolta maker notes +
  • Added skeleton for interpreting Sony maker notes +
  • Interpret Pentax PrintIM +
+ +Apr. 6, 2004 - Version 3.35 +
    +
  • Added support for Nikon PrintIM +
  • Changed names of duplicate EXIF tags +
+ +Apr. 5, 2004 - Version 3.34 +
    +
  • Added all missing tag definitions from TIFF 6 standard +
  • Added a few more EXIF tag definitions +
  • Interpret PrintIM IFD +
  • Fixed interpretation of Interoperability IFD +
  • Fixed potential endless loop bug introduced in version 3.33 +
+ +Apr. 5, 2004 - Version 3.33 +
    +
  • Parse SubIFD of Nikon NEF file (now extracts raw image size and thumbnail + image) +
+ +Apr. 2, 2004 - Version 3.32 +
    +
  • Changes to some Nikon tag names +
  • Added Nikon Saturation +
  • Documentation improvements +
+ +Mar. 31, 2004 - Version 3.31 +
    +
  • Now recognizes NEF (Nikon Electronic image Format) files +
+ +Mar. 29, 2004 - Version 3.30 +
    +
  • Removed -w option +
  • Fixed problem with some XMP tags being put in the EXIF group +
  • More minor speed improvements +
  • API Changes: +
      +
    • GetDescription() now requires an ExifTool object reference +
    • Removed WarnDuplicateDescriptions() +
    +
+ +Mar. 26, 2004 - Version 3.27 +
    +
  • Optimized a few routines to speed things up a bit +
  • API Changes: +
      +
    • Changed GetDescription() documentation to indicate it is called with an + ExifTool object (this is still optional, but will be mandatory with the + next version) +
    +
+ +Mar. 25, 2004 - Version 3.26 +
    +
  • Don't generate warning if end of IPTC block is padded with nulls +
+ +Mar. 19, 2004 - Version 3.25 +
    +
  • Fixed problem with 'Input' sort order +
+ +Mar. 19, 2004 - Version 3.24 +
    +
  • Only return PreviewImage if it is a valid JPG (otherwise set 'Warning') +
+ +Mar. 16, 2004 - Version 3.23 +
    +
  • API Changes: +
      +
    • Added GetGroups() +
    • GetGroup() now returns group names for all families if used in list + context and family not specified +
    +
+ +Mar. 12, 2004 - Version 3.22 +
    +
  • API Changes: +
      +
    • Changed GetInfo() to return list of tags like ImageInfo() if list + reference provided +
    • Fixed bug that caused GetInfo() to ignore specified tags +
    +
+ +Mar. 11, 2004 - Version 3.21 +
    +
  • Fixed problem with Composite group in family 1 +
  • Changed case of Exif to EXIF in family 1 +
  • -group option now lists Composite group as it should +
  • Internal Changes: +
      +
    • Cleaned up handling of function arguments +
    +
+ +Mar. 10, 2004 - Version 3.20 +
    +
  • Added -group option +
  • Added group families 1 and 2 +
  • Can now specify excluded tags with leading '-' (replaces -x option) +
  • API Changes: +
      +
    • Added ClearOptions(), ExtractInfo(), GetInfo(), CombineInfo(), + GetTagList() and GetAllGroups() +
    • Removed IsVerbose() function (use Options('Verbose') instead) +
    • Allow groups to be excluded by specifying leading '-' on group name +
    • ImageInfo() and GetInfo() now use specified group order to set tag + precedence if Duplicates option is not set +
    • Change default value of Duplicates option back to 0 +
    +
+ +Mar. 1, 2004 - Version 3.15 +
    +
  • Changed format of all date and time tags to EXIF standard +
  • Added some composite date/time tags +
  • Fixed date formatting so -d option should now work with all combined + date/time tags +
  • Other minor changes to GPS information +
  • Improvements to TIFF processing +
  • Set value to "Undefined" if PrintConv evaluates to undefined value +
  • Added -G option +
  • API Changes: +
      +
    • Changed all option names: shortened and changed to mixed case (sorry!) +
    +
  • Internal changes: +
      +
    • Standardized arguments to all processing procedures +
    • Made call to processing procedure more automatic +
    • Removed TABLE_TYPE tag and added PROCESS_PROC +
    • Added ProcessTagTable() member function +
    +
+ +Feb. 27, 2004 - Version 3.14 +
    +
  • Added GPS tag conversions and GPS test +
  • Values that can't be converted now show up simply as "Unknown (X)" +
+ +Feb. 26, 2004 - Version 3.13 +
    +
  • Print out errors from exiftool script (since Image::ExifTool no longer + prints them) +
  • Added more tests +
  • Failed tests now leave ".failed" file in "t" directory for post mortem +
+ +Feb. 25, 2004 - Version 3.12 +
    +
  • Moved all image-related warnings to new Warning tag +
+ +Feb. 25, 2004 - Version 3.11 +
    +
  • Added GeoTiff support +
  • Added -x option +
  • Improvements to documentation +
  • Improve XMP parsing for 'Bag' elements +
  • Capitalize first letter of XMP tag descriptions +
  • Patch problem with APP13 resource written by older Photoshop versions +
  • API Changes: +
      +
    • Added EXCLUDE and GROUP# options +
    • Change default value of SAVE_DUPLICATES option to 1 +
    +
+ +Feb. 20, 2004 - Version 3.10 +
    +
  • Restructuring only -- the behaviour of the exiftool script was not changed +
  • Moved html documentation to new html directory +
  • API Changes: +
      +
    • Conform to standard Perl module mechanics: +
        +
      • Changed ExifTool package name to Image::ExifTool +
      • Added Makefile.PL and other standard files +
      • Added Perl pod documentation +
      • Added standard test files +
      • Moved modules into lib directory +
      • Changed "TagTables" directory name to "ExifTool" +
      +
    • Added extra parameter in new RandomAccessFile +
    +
+ +Feb. 20, 2004 - Version 3.05 +
    +
  • Fixed problem where output files (-o) weren't written if -p option used +
+ +Feb. 19, 2004 - Version 3.04 +
    +
  • Added -U option to allow display of unknown values in Canon binary data + blocks +
  • Made unknown tag names more specific when -u or -U option used +
  • Added RawData and DecoderTable tags (for Canon RAW file) +
+ +Feb. 17, 2004 - Version 3.03 +
    +
  • Fixed RandomAccessFile package name (should have been + File::RandomAccessFile) +
  • Added IxusAFPoint tag to Canon maker notes (thanks Michael Rommel) +
  • Avoid scanning past end of Canon binary data blocks +
  • API Changes: +
      +
    • GetFoundTags() and GetRequestedTags() now return list instead of list + reference +
    +
+ +Feb. 16, 2004 - Version 3.02 +
    +
  • Improved handling of Pentax maker notes +
+ +Feb. 15, 2004 - Version 3.01 +
    +
  • API Changes: +
      +
    • Added GetValue() function +
    • Completed API documentation +
    +
+ +Feb. 13, 2004 - Version 3.00 +
    +
  • Removed -all option (it is now the default -- specify -common for previous + default behaviour) +
  • Added -a option to allow printout of duplicate tag values +
  • API Changes: +
      +
    • I am finally happy with the API, so future major changes are less likely + (hence the major version number) +
    • No longer return ARRAY reference for list of tags (Instead, tag values + are joined in a comma separated list if tag 'List' flag is set) +
    • Added SAVE_DUPLICATES option +
    • Added BuildCompositeTags() to EXPORT_OK list +
    • GetFoundTags() now sorts tags in specified order +
    • GetDescriptions() longer returns undef if the description doesn't exist +
    +
+ +Feb. 12, 2004 - Version 2.71 +
    +
  • Still more playing with Pentax maker notes +
  • More API Changes: +
      +
    • Added RandomAccessFile.pm +
    • All image file i/o now done through a RandomAccessFile object +
      --> allows proper piping and use of string i/o +
    • Allow scalar reference to be passed to ImageInfo() (for string i/o) +
    +
+ +Feb. 11, 2004 - Version 2.70 +
    +
  • More tweaking of Pentax maker notes +
  • Changed API to be more object oriented: +
      +
    • Removed SetVerbose(), ExtractUnknown(), SetDateFormat(), + EnablePrintConversion(), EnableCompositeTags() +
    • Added Options() to replace above functions +
    • Changed WarnDuplicateTags() to WarnDuplicateDescriptions() +
    • Added GetFoundTags() and GetRequestedTags() +
    • Many functions now take ExifTool object reference as first argument +
    • ImageInfo() no longer returns reference to ExifTool object when used in + list context (you have to use "new ExifTool" and the OO form of + ImageInfo() if you want the object) +
    +
+ +Feb. 10, 2004 - Version 2.62 +
    +
  • Added -u option to allow display of unknown tags +
  • Major changes to Pentax maker notes (still needs work) (thanks Wayne Smith) +
+ +Feb. 09, 2004 - Version 2.61 +
    +
  • Allow file reference to be passed to ImageInfo() +
  • Allow file to be read from standard input by specifying "-" as file name +
  • Added FileType tag +
+ +Feb. 07, 2004 - Version 2.60 +
    +
  • Improve IPTC parsing and add support for more IPTC data types +
  • Read Photoshop APP13 records properly +
  • Added -g option +
  • Move shortcuts into separate module +
  • Changes to API: +
      +
    • Removed LoadAllTables() and added GetAllTags() +
    • Removed GetDescriptions() and added GetDescription() +
    • Changed GetShortcuts() to return a list +
    • Added tag groups and GetGroup() function +
    • Return object data from ImageInfo() for use in GetGroup() +
    +
+ +Jan. 30, 2004 - Version 2.51 +
    +
  • Speed up JPG reading code +
  • API no longer returns references to image-specific static data +
  • Added ExifToolVersion tag +
+ +Jan. 29, 2004 - Version 2.50 +
    +
  • Changed API to return binary data as SCALAR reference and + list of values as ARRAY reference (thanks Dan Heller for the suggestions) +
  • Attempt to make case of tag descriptions more consistent +
+ +Jan. 28, 2004 - Version 2.41 +
    +
  • Scan photoshop JPG 0xe1 garbage for possible XMP information +
+ +Jan. 27, 2004 - Version 2.40 +
    +
  • Improved handling of XMP data +
  • Changed output format and added -l option +
+ +Jan. 21, 2004 - Version 2.36 +
    +
  • Don't output trailing linefeed when -b option used +
+ +Jan. 19, 2004 - Version 2.35 +
    +
  • Changes to verbose output +
  • Added TagTables::CanonRaw::CleanRaw() as an API utility function +
+ +Jan. 16, 2004 - Version 2.34 +
    +
  • Added 'Validate' check for Canon data fields +
  • Changed ScaleFactor35efl to use FocalLengthIn35mmFormat if available +
+ +Jan. 15, 2004 - Version 2.33 +
    +
  • Added ScaleFactor35efl, FocalLength35efl, Lens35efl +
  • Allow Composite tags to Require/Desire each other +
  • Changed FlashType to use FlashBits instead of CanonFlashMode +
+ +Jan. 13, 2004 - Version 2.32 +
    +
  • Added -d (date format) option +
  • Added -p (print format file) option +
+ +Jan. 9, 2004 - Version 2.31 +
    +
  • Exif WhiteBalance no longer overrides maker-specific WhiteBalance +
+ +Jan. 8, 2004 - Version 2.30 +
    +
  • Added support for IPTC format information +
+ +Jan. 6, 2004 - Version 2.25 +
    +
  • Fixed problem with ImageInfo() function prototype +
  • Fixed printout of JpgFromRaw message (doesn't affect JPG extraction) +
  • Set output files to binmode (including STDOUT) if -b option used (thanks + David Anson) +
+ +Jan. 1, 2004 - Version 2.24 +
    +
  • Fixed -list option to show all available tag names +
+ +Dec. 18, 2003 - Version 2.23 +
    +
  • Changed "Disable" routines to "Enable" +
+ +Dec. 17, 2003 - Version 2.22 +
    +
  • Fixed make/model tags which I broke with a recent change +
  • Removed null terminator from returned strings +
+ +Dec. 16, 2003 - Version 2.21 +
    +
  • Fixed problem with decoding some Nikon maker notes +
  • General improvements and tweaks to the code +
+ +Dec. 14, 2003 - Version 2.20 +
    +
  • Now extracts preview image from 300D JPG files (PreviewImage) +
  • Changed ThumbnailData tag name to ThumbnailImage +
+ +Dec. 12, 2003 - Version 2.10 +
    +
  • ExifTool::ImageInfo now returns reference to hash instead of hash +
+ +Dec. 10, 2003 - Version 2.01 +
    +
  • Minor fixes for reading of RAW files +
+ +Dec. 09, 2003 - Version 2.00 +
    +
  • Added support for Olympus, Casio and Nikon cameras +
  • Now recognizes GPS information +
  • Moved config information to TagTables modules +
  • Restructured API +
+ +Dec. 05, 2003 - Version 1.72 +
    +
  • Changes to composite Aperture and ShutterSpeed decisions +
+ +Dec. 05, 2003 - Version 1.71 +
    +
  • Read 10D Custom functions from CRW file too (thanks dpophyte) +
+ +Dec. 05, 2003 - Version 1.70 +
    +
  • Added custom functions for 10D and 1D +
+ +Dec. 04, 2003 - Version 1.62 +
    +
  • Decode known flash bits +
+ +Dec. 04, 2003 - Version 1.61 +
    +
  • Override ShutterSpeed with BulbDuration if available +
  • Change -s option to add tab-separated list +
+ +Dec. 03, 2003 - Version 1.60 +
    +
  • Big improvements in reading Canon RAW files +
+ +Nov. 29, 2003 - Version 1.50 +
    +
  • Added ability to extract JPG from RAW +
  • Added ExifData tag to allow entire EXIF block to be dumped +
+ +Nov. 26, 2003 - Version 1.40 +
    +
  • Split up config files to speed things up +
  • Added ability to extract binary data +
  • Added ThumbnailData tag (to allow extracting JPG thumbnails) +
+ +Nov. 25, 2003 - Version 1.30 +
    +
  • Added experimental Canon RAW (CRW) file support +
+ +Nov. 22, 2003 - Version 1.20 +
    +
  • Now reads TIFF files too +
+ +Nov. 20, 2003 - Version 1.12 +
    +
  • Don't translate Photoshop Brightness, etc +
+ +Nov. 20, 2003 - Version 1.11 +
    +
  • Attempt to fix problem on hp +
  • Clean up code a bit +
  • Added '-ver' command-line option +
+ +Nov. 20, 2003 - Version 1.10 +
    +
  • Added support for XMP format +
+ +Nov. 19, 2003 - Version 1.00 +
    +
  • Initial release (extracts information from JPEG and GIF images, with Canon, + FujiFilm and Pentax makernote support) +
+ +
+

<-- Back to recent history

+ + diff --git a/html/canon_raw.html b/html/canon_raw.html new file mode 100644 index 0000000..9b3c82f --- /dev/null +++ b/html/canon_raw.html @@ -0,0 +1,368 @@ + + + +The Canon RAW (CRW) File Format + + + + +

The Canon RAW (CRW) File Format

+ +

This is a description of the Canon CRW file format. CRW files are written in +Camera Image File Format (CIFF). The original Canon CIFF specification can be +downloaded from http://xyrion.org/ciff/ +(which I finally discovered after writing this document!). Note that Canon has +three different RAW formats, with newer models producing a +TIFF-based CR2 or +QuickTime-based CR3 as opposed +to the CIFF-based CRW format documented here.

+ +

Comments about the CRW Format

+ +

The Canon CRW file format is a joy to work with. It has a structure that is +fundamentally similar to TIFF, with directories that point to data within the +file. But a major improvement over TIFF is that the offsets are not absolute, +they are relative to the start of the data block for each directory. This +allows subdirectories within a file to be moved or copied to another file +without having to adjust the offsets, which is fantastic because it means that +rewriter software doesn't have to understand the complete format in order to be +able to successfully rewrite the file.

+ +

Also, the data comes before the directories in the file, which is the natural +way to write information and minimizes the amount memory needed to buffer the +data (unlike EXIF, which is typically the reverse).

+ +
+A short rant about TIFF inadequacies: +
TIFF format on the other hand, really sucks in comparison (this includes +JPEG too, since JPEG uses TIFF format to store the EXIF information). The main +problems are the use of absolute offsets and the ambiguity between integers and +pointers (such as those used for custom IFD's). Because absolute offsets +require adjusting whenever anything is moved in the file, the format of ALL +contained data structures must be understood to properly edit the file. This +results in an impossible situation when presented with undocumented custom +structures like those used in the maker notes written by modern digital cameras. +This is why it is so common for image editors to either scramble the maker notes +or discard them completely. The official TIFF recommendation is to discard +unknown information when rewriting the image (as Photoshop does), but for many, +including myself, this option is simply unacceptable. +
+ +

The bottom line is that rewriting a Canon CRW file is about 20 times easier, +and much less prone to errors than rewriting a TIFF or JPEG.

+ +

CRW (CIFF) Format Specification

+

File Header

+

A Canon CRW file starts with the following byte sequence:

+
+ + + + + + + + + + + + +
OffsetNumber
of bytes
ValueNameDescription
02"II"ByteOrder"II" means Intel (little-endian) order, which is the only order I've +seen since Canon is using x86 processors in its current cameras, but +presumably this could be "MM" for future models. +
240x0000001aHeaderLength32-bit integer giving the length of the CRW file header. For +current camera models the header is 26 bytes long.
68"HEAPCCDR"SignatureThis series of characters identifies the file as a Canon CRW +file. The signature is "HEAPJPGM" for CIFF information in APP0 of JPEG images.
1440x00010002CRWVersion32-bit integer giving the major (high 16 bits) and minor +(low 16 bits) CRW file version numbers. The version is 1.2 for current cameras.
1880ReservedTwo 32-bit integers, currently set to zero.
+ +

Directory Block Structure

+

The root directory block begins immediately after the file header (at the position +specified by HeaderLength), and ends at the end of the file. The structure +of this block is as follows:

+
+ + + + + + + + + + + + +
Offset
within block
Number
of bytes
ValueNameDescription
0S-
-
-
-
-
ValueDataThe value data referenced by offsets in the directory
S2NDirCount16-bit integer giving the number of directory entries
S + 2N * 10-
-
-
DirEntriesThe CRW directory entries
S + 2 + N*10any-OtherData(be aware there may be other data hiding here)
BlockSize - 44SDirStart32-bit integer giving the size of the ValueData
+ +

To parse a CRW directory block, first read the 4 bytes at the end of the +block to get the location (S) of DirCount. Next read DirCount to +determine the number of entries (N) in the directory, then read the directory +entries.

+ +

The ValueData may contain complete subdirectory blocks, each of which +has the same format as specified above (and these subdirectories may themselves +contain sub-subdirectories...). For these subdirectories, BlockSize is +given by the Size specified in the corresponding directory entry. For +the root directory, BlockSize is the length of the file.

+ +

The OtherData normally does not exist (eg. the DirEntries +usually end at the DirStart pointer), but this is not always the case: +Canon Digital Photo Professional uses this area in the root directory block to +store VRD data in edited CRW images. (Note +that VRD supports embedded XMP, which provides a technique to store modern +metadata in CRW images!)

+ +

CRW Directory Entry Format

+

The CRW directory consists of N 10-byte entries. The format of each entry is +as follows:

+
+ + + + + + + + +
Offset
within entry
Number
of bytes
NameDescription
02Tag16-bit integer identifying the type of data
24Size32-bit integer giving the number of bytes in the value data
64Offset32-bit integer offset that gives the number of bytes from the start of the + ValueData block to the start of the value data for this directory entry
+ +

Data values with lengths shorter than 8 bytes may be stored in the directory +Size and Offset fields. For these values the DataLocation +bits in the Tag are set to 0x4000 (see DataLocation table +below).

+ +

Data stored in the ValueData block must be aligned on even 2-byte +boundaries, yielding Offsets which are divisible by 2. To achieve this, +records with an odd number of bytes must be padded with a zero byte.

+ +

Tag Bits

+

The 16-bit Tag value is composed of 3 bit fields, as follows:

+
+ + + + + + + +
BitsMaskNameDescription
14-150xc000DataLocationSpecifies the location of the data
11-130x3800DataFormatIdentifies the information format
0-100x07ffTagIndexIndex to identify the specific type of information
+ +

DataLocation

+

Value data may either be stored in the ValueData block, or within the +Size and Offset fields of the directory entry if it is less than 8 +bytes long. The DataLocation bits specify where the value is stored:

+
+ + + + + + +
DataLocationWhereDescription
0x0000ValueDataValues are stored in the ValueData block, at the specified Offset + and Size
0x4000DirectoryValues are stored in the Size and Offset fields + of the directory entry. Values stored here are limited to a maximum size of 8 bytes.
0x8000
0xc000
?-
+ +

DataFormat

+

Three Tag bits are used to specify the data format:

+
+ + + + + + + + + + + + + + + +
DataFormatAlignmentDescription
0x00001-ByteA series of bytes
0x08001-ByteA null-terminated ASCII string
0x10002-ByteA series of 16-bit integers
0x18004-ByteA series of 32-bit integers or floats
0x20001-ByteA structure which is a mixture of formats
0x2800
0x3000
1-ByteA subdirectory block
0x3800?-
+ +

TagID = DataFormat + TagIndex

+

Together, the DataFormat and TagIndex fields form a TagID +which can be used to identify tags within the CRW file. The following is a list +of known TagID values and their corresponding tag numbers in the EXIF +maker notes when found in a JPEG or TIFF image. Also listed is the TagID of the +SubDirectory where the information is found. The Size listed +below is an observed size of the value data, and is not necessarily expected to +remain constant for all camera models.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TagIDEXIFSubDirNameSizeDescription
1-Byte Alignment
0x0000-anyNullRecord0This is a null directory entry
0x0001-anyFreeBytesvariesUnused bytes in the ValueData
0x0006-0x300b-8-
0x0032-0x300bCanonColorInfo1768 or 2048Block of color information (format unknown)
0x0036-0x300b?varies-
0x003f-0x300b?5120-
0x0040-0x300b?256-
0x0041-0x300b?256-
ASCII Strings
0x0805-0x2804CanonFileDescription32Description of the file format. + eg) "EOS DIGITAL REBEL CMOS RAW"
0x0805-0x300aUserComment256User comment (usually blank)
0x080a-0x2807CanonRawMakeModel32Two end-to-end null-terminated ASCII strings giving the camera make and model. + eg) "Canon","Canon EOS DIGITAL REBEL"
0x080b0x070x3004CanonFirmwareVersion32Firmware version. eg) "Firmware Version 1.1.1"
0x080c-?ComponentVersion?-
0x080d-0x3004ROMOperationMode4eg) The string "USA" for 300D's sold in North America
0x08100x090x2807OwnerName32Owner's name. eg) "Phil Harvey"
0x08150x060x2804CanonImageType32Type of file. eg) "CRW:EOS DIGITAL REBEL CMOS RAW"
0x0816-0x300aOriginalFileName32Original file name. eg) "CRW_1834.CRW"
0x0817-0x300aThumbnailFileName32Thumbnail file name. eg) "CRW_1834.THM"
2-Byte Alignment
0x100a-0x300aTargetImageType20=real-world subject, 1=written document
0x1010-0x3002ShutterReleaseMethod20=single shot, 1=continuous shooting
0x1011-0x3002ShutterReleaseTiming20=priority on shutter, 1=priority on focus
0x1014-0x3002-8-
0x1016-0x3002ReleaseSetting2-
0x101c-0x3004BaseISO2The camera body's base ISO sensitivity
0x1026-0x300a-6-
0x10280x030x300bCanonFlashInfo?8Unknown information, flash related
0x10290x020x300bFocalLength8Four 16 bit integers: 0) unknown, 1) focal length in mm, 2-3) sensor width + and height in units of 1/1000 inch
0x102a0x040x300bCanonShotInfovariesData block giving shot information
0x102c-0x300bCanonColorInfo2256Data block of color information (format unknown)
0x102d0x010x300bCanonCameraSettingsvariesData block giving camera settings
0x1030-0x300bWhiteSample102 or 118White sample information with encrypted 8x8 sample data
0x1031-0x300bSensorInfo34Sensor size and resolution information
0x10330x0f0x300bCanonCustomFunctionsvariesData block giving Canon custom settings
0x10380x120x300bCanonAFInfovariesData block giving AF-specific information
0x10390x130x300b?8-
0x103c-0x300b?156-
0x107f-0x300b-varies-
0x10930x930x300bCanonFileInfo18Data block giving file-specific information
0x10a80xa80x300b?20-
0x10a90xa90x300bColorBalance82Table of 16-bit integers. The first integer (like many other data blocks) is + the number of bytes in the record. This is followed by red, green1, green2 and blue + levels for WhiteBalance settings: auto, daylight, shade, cloudy, tungsten, + fluorescent, flash, custom and kelvin. The final 4 entries appear to be some sort of + baseline red, green1, green2 and blue levels.
0x10aa0xaa0x300b?10-
0x10ad-0x300b?62-
0x10ae0xae0x300bColorTemperature216-bit integer giving the color temperature
0x10af-0x300b?2-
0x10b40xb40x300bColorSpace216-bit integer specifying the color space + (1=sRGB, 2=Adobe RGB, 0xffff=uncalibrated)
0x10b50xb50x300bRawJpgInfo10Data block giving embedded JPG information
0x10c00xc00x300b?26-
0x10c10xc10x300b?26-
0x10c2-0x300b?884-
4-Byte Alignment
0x1803-0x300aImageFormat832-bit integer specifying image format (0x20001 for CRW), followed + by 32-bit float giving target compression ratio
0x1804-0x300aRecordID4The number of pictures taken since the camera was manufactured
0x1805-0x3002-8-
0x1806-0x3002SelfTimerTime432-bit integer giving self-timer time in milliseconds
0x1807-0x3002TargetDistanceSetting432-bit float giving target distance in mm
0x180b0x0c0x3004SerialNumber4The camera body number for EOS models. eg) 00560012345
0x180e-0x300aTimeStamp1232-bit integer giving the time in seconds when the picture was taken, + followed by a 32-bit timezone in seconds
0x1810-0x300aImageInfo28Data block containing image information, including rotation
0x1812-0x3004-40-
0x1813-0x3002FlashInfo8Two 32-bit floats: The flash guide number and the flash threshold
0x1814-0x3003MeasuredEV432-bit float giving the measured EV
0x18170x080x300aFileNumber432-bit integer giving the number of this file. eg) 1181834
0x1818-0x3002ExposureInfo12Three 32-bit floats: Exposure compensation, Tv, Av
0x1819-0x300b-64-
0x18340x100x300bCanonModelID4Unsigned 32-bit integer giving unique model ID
0x1835-0x300bDecoderTable16RAW decoder table information
0x183b0x150x300bSerialNumberFormat432-bit integer (0x90000000=format 1, 0xa0000000=format 2)
Mixed Data Records
0x2005-rootRawDatavariesThe raw data itself (the bulk of the CRW file)
0x2007-rootJpgFromRawvariesThe embedded JPEG image (2048x1360 pixels for the 300D with Canon firmware)
0x2008-rootThumbnailImagevariesThumbnail image (JPEG, 160x120 pixels)
SubDirectory Blocks
0x2804-0x300aImageDescriptionvariesThe image description subdirectory
0x2807-0x300aCameraObjectvariesThe camera object subdirectory
0x3002-0x300aShootingRecordvariesThe shooting record subdirectory
0x3003-0x300aMeasuredInfovariesThe measured information subdirectory
0x3004-0x2807CameraSpecificationvariesThe camera specification subdirectory
0x300a-rootImagePropsvariesThe main subdirectory containing all meta information
0x300b-0x300aExifInformationvariesThe subdirectory containing most of the JPEG/TIFF EXIF information
+ +

Revisions

+

Mar. 21, 2018 - Added mention of the CR3 file format

+

Sep. 20, 2010 - Added note about XMP support in the VRD data

+

Feb. 12, 2009 - Moved a couple of entries in the TagID table that were in +the wrong section

+

Feb. 4, 2008 - Added a number of unknown TagID's, decode some tags in the +WhiteSample and DecoderTable data blocks, and fix incorrect SubDir for +SerialNumber tag

+

Nov. 16, 2007 - Added a number of unknown blocks

+

Sep. 12, 2007 - Change name of CanonPictureInfo record to CanonAFInfo

+

Nov. 28, 2006 - Highlight the possibility of OtherData existing in the +directory block

+
+Please e-mail me if you find any errors or omissions in this document. My +address is philharvey66 at gmail.com - Thanks! +

Created Jan. 28, 2005 +
Last revised Mar. 21, 2018

+

<-- Back to ExifTool home page

+ + diff --git a/html/commentary.html b/html/commentary.html new file mode 100644 index 0000000..985df21 --- /dev/null +++ b/html/commentary.html @@ -0,0 +1,336 @@ + + + +Commentary on Meta Information Formats + + + + + + +

Commentary on Meta Information Formats
+(or "Why this or that Format Sucks")

+ + +

EXIF / TIFF

+

EXIF uses the TIFF format to store information. The biggest problem with +this format is that all pointers are absolute (ie. relative to the start of +the file). This means that the pointers need fixing up if the position of +any information changes. This is significant because pointers are often +hidden inside proprietary structures which should remain opaque (such as +maker notes). The result is that some EXIF information is easily corrupted +when editing a file. This problem is ignored by many software packages. +Much effort was required in the development of ExifTool to avoid the loss of +information such as this.

+ +

A significant problem is that an IFD (image file directory) pointer has +the same format code as a long integer, so information in any non-recognized +IFD is lost when the image is rewritten. There is a seldom-used format +code of 13 that has been proposed to indicate an IFD, but this is not part +of the EXIF/TIFF specification and is not in common usage. [Hey! +Olympus has just started using this code for the IFD's in the maker notes of +their new Camera models! - 2007/03/08]

+ +

Also, it was wrong to specify a count instead of a size for each +directory entry because this makes it impossible to add new format types +without requiring that older readers simply discard data of unknown type +(since the data size isn't known, the old readers don't know how to copy the +data).

+ +

All these shortcomings make TIFF a very non-extensible format which by +design will result in the loss of non-standard information.

+ +

And we don't learn from our mistakes (OK, maybe some of us can, but +apparently not big corporations like Adobe or Microsoft), because the new +DNG and WDP formats are TIFF-based too.

+ +

The EXIF specification also has some significant shortcomings to add to the +TIFF problems, like minimal special character abilities, no language support, +and no way to specify time zone.

+ + +

EXIF Maker Notes

+

Maker notes are a can of worms. The EXIF specification unfortunately +made no mention about the information format of the maker notes. If +properly designed, the specification would have provided a maker note IFD +tag to allow IFD-style maker notes to be used. Many manufacturers +implemented it this way, but each with a different technique and many with +odd quirks. This deficiency combined with +problems in the TIFF (EXIF) format mean that most software will quite +unknowingly scramble your maker notes when an image is rewritten. To +prevent this, specific knowledge about files written by individual +manufacturers is necessary, and of course the manufacturers are not prone to +divulging this information to the public so it must all be reverse +engineered.

+ +

The official TIFF recommendation is to delete unknown information when +rewriting an image[1], and this irresponsible +strategy has been adopted by some applications such as Adobe Photoshop, +resulting in a total loss of maker note information. This is very +unfortunate because even corrupted maker notes contain useful information, +and smart utilities (like ExifTool) are often able to recover the +information from damaged maker notes.

+ + +

JPEG

+

The JPEG format acts only as a container for meta information, and +defines no meta information format itself. But it sucks just a as a +container format because it limits the maximum contiguous block size to +64kB. This causes problems because many cameras store more than 64kB of +additional information in their JPEG images. Usually, this is due to the +medium-sized JPEG image that many cameras embed for preview purposes. It +would have been nice if there was a standard way to embed this preview in +JPEG images (without the 64kB limitation). [Update: In February +2009 CIPA released the MPF format specification which allows storage of +preview images larger than 64kB, but unfortunately this specification +has problems of its own.]

+ +

Aside: The EXIF specification could have easily allowed the information +to span multiple JPEG segments, which would have been smart, but still wouldn't +have solved the problem entirely since it could result in a non-contiguous +preview image (this would be a problem for cameras since they typically want to +use this image for quick review of pictures, and re-mapping the image into a +contiguous memory space would be costly). [According to the November +2014 XMP specification (part 3, page 13), Adobe allows multi-segment EXIF, and +this is supported by ExifTool 10.97 and later.]

+ + +

IPTC IIM

+

IPTC IIM earns a few points because it is the easiest to process of the +common meta information formats. However, the format is overly restrictive +and not very extensible. Format information and human-readable tag names +are not part of the specification, so it is not possible to meaningfully +interpret unknown values. Also, there are many interdependencies between +tags that make it very annoying for writing, and the special character +support is ill-conceived.

+ + +

XMP

+

The XMP format is a good example of a designed-by-committee +specification. It is based on XML, which is much more complicated than +necessary and tries to make everyone happy by providing a multitude of +format styles and features (shorthand format, etc, etc). This makes it very +difficult to properly implement the complete specification. Not even the +Adobe software supports all of the format options of their own XMP +specification. And the format is exceedingly verbose, wasting disk space, +bandwidth and time.

+ +

Also, XMP only supports textual information. Binary information must be +text-encoded if stored in XMP. This makes it very bulky, slow and +completely unsuitable for storage of binary information.

+ +

Mainly because of the complexity of the specification, and despite +Adobe's best efforts, XMP still isn't very well supported by meta +information editing tools. The best hope for small application developers +is to link against an off-the-shelf XMP or XML library. Apparently Adobe +realizes this and is now providing an XMP development kit, but this solution +is only useful for those platforms and computer languages that they choose +to support.

+ + +

PDF

+

...and I thought XMP was too complicated. PDF is just insane. Because +of this, it is unlikely that ExifTool will ever support this format for +writing. [Dec. 18, 2007 Update: I have just added PDF write support +using the incremental update feature of PDF. It was still a bit of work, but +somewhat simpler (and MUCH faster!) than rewriting the entire PDF. But there +are disadvantages: The resulting PDF is not "linearized", and there are privacy +and security issues with leaving old metadata in the file.]

+ + +

PNG

+

PNG sucks because meta information can be stored only in text format. +This was a huge mistake, and as a work-around software (eg. ImageMagick) +must encode binary information in ASCII-hex, then compress it to offset the +increase in size, and store it as a compressed text block. This adds +unnecessary complexity, greatly slows down processing, and makes it much +harder to develop software which supports PNG meta information. +[July 2017: PNG adopts eXIf chunk to allow EXIF metadata to be +stored in native binary format. This is useful, but still doesn't allow storage +of arbitrary binary metadata.]

+ + +

PICT

+

The PICT format just plain sucks. It is one of the worst-designed image +formats in existence, second only to FlashPix. I don't believe that it was +originally designed as a file format. Instead it appears to have emerged +from the internal Apple QuickDraw structures. The files are not designed to +be processed by any software other than the Mac OS. Intimate knowledge of +the QuickDraw structures is required just to parse the PICT image, even if +the reader doesn't care about the contained information. Because of this, +PICT images are very fragile and a simple data error or programming bug will +invalidate an entire image. Possibly for these reasons the PICT format +never gained popularity outside the Apple world. Also, the concept of meta +information is all but ignored in the PICT design.

+ + +

FlashPix

+

Oh. My. God. Don't get me started on this one. Let's just say that basing +an image file format on the File Allocation Table (FAT) structure of a floppy +disk with fixed 512-byte sectors is monumentally idiotic. Microsoft Word, +Excel and PowerPoint documents also use this insane format.

+ + +

DICOM Medical Images

+

The DICOM format is reasonably well designed. The UID's are cumbersome, +but achieve their purpose. The biggest bungle in the design is the implicit +VR syntax, which presumably exists for historical reasons to provide +backward compatibility with pre-existing ACR-NEMA images. The DICOM +specification document is horrible and obviously written by committee, and +was possibly the single largest impediment to implementing support for this +format.

+ +

Technical: The files would be easier to parse if the transfer syntax +became effective immediately after the transfer syntax data element instead +of at the end of the meta information group. Also, the deflated data should +have contained the zlib header, as in PNG and PDF images. This would make +it easier to read and allow CRC validation of the datastream. -- Can you +tell I wrote this just after adding DICOM support to ExifTool?

+ + +

AVCHD (.M2TS) (added 2009-10-29)

+

This format is used in .M2TS video files (and Blu-Ray HD DVD's). It is +painfully obvious that this was never designed as a storage format. It uses +MPEG-2 transport stream (M2TS) container, which is a communications protocol +and never should have been used for storage. The M2TS format is based on a +188-byte packet size which makes no sense for modern filesystems. And to +make things worse, metadata in AVCHD files is stored in the H.264 video +stream (!!) which uses insane and convoluted data structures such as the +variable-bit-length exponential-Golomb which are painful and inefficient to +parse in software, and as far as I can tell the format for the metadata +stored in these streams is proprietary and undocumented.

+ + +

ISO Considered Harmless

+

This is not a meta information format, but since many format +specifications are imprisoned by the ISO it deserves mentioning...

+ +

In my experience, the International Standards Organization is extremely +counter-productive. Their goal is to promote standardization, but by +charging too much money for copies of the standards documents they defeat +their own purpose. The effect is that small companies and individuals +developing software (including open source software such as ExifTool) do not +have access to the official standard. Instead, software is often based on +old, obsolete documents or drafts which are sometimes publicly available, or +on 3rd party descriptions which are often incomplete. To sum things up: ISO +sucks.

+ +
+

OK. So all those formats suck. What doesn't?

+ + +

Canon CRW Images (CIFF format)

+

This format uses a directory structure similar to TIFF, but all offsets +are relative and unknown information can handled properly when rewriting. +Because of this, it is much more extensible than TIFF, but the format is +still limited by 16-bit integer tag ID's among other TIFF weaknesses. It +isn't great, but at least it doesn't suck.

+ + +

QuickTime Videos

+

The Apple QuickTime MOV format is very nice format. (Which is a breath +of fresh air after the Apple PICT travesty.) It was a smart move to use +this format for the MP4 specification. I would only change 2 things about +this format: 1) Use longer tag names instead of the current 4 characters (I +know that 4 characters is convenient because it can be used as an integer in +lookup tables, but it would be nice if the tag names were a bit more +meaningful). 2) Add a format code to the Atom definition so simple unknown +information could be decoded properly. These changes would allow some +unknown information to be interpreted, which would make it possible for +information added by 3rd parties to be useful.

+ +

... but there are some significant problems with the QuickTime specification:

+ +

0) The biggest problem with some QuickTime-based files (ie. MOV, MP4, +HEIC) is that atoms may store absolute offsets into the media data, and +these pointers are easily invalidated by editing the file. This puts a huge +burdon on the editing application to update all necessary pointers, and +makes it much, much harder than it should be to edit these files (it takes +significant effort to just determine which atoms may containing pointers).

+ +

1) The metadata organization is a mess because tags may be stored in more +than one location (eg. UserData vs. InfoList), and conflicting metadata +directories may exist, even in the same location (as written by iTunes).

+ +

2) The length of 'udta' text strings with language codes is written +incorrectly by many (most?) utilities, including Apple iTunes. The language +strings are supposed to use a "small integer atom format" where the first +two bytes give the size of the string including the length word and language +codes. But often the size doesn't include these 4 bytes, which sort of +defeats the purpose of the multiple languages because it is difficult to +parse past the first entry if you don't know the size.

+ +

3) Cameras without time zone information are forced to write date/time +tags as local time, even though the specification says these should be UTC. +This leads to an unresolvable inconsistency in the time offset because +one can not distinguish between these two cases.

+ + +

My Format (Meta Information Encapsulation, or "MIE")

+

Now it is time to put my money where my mouth is: I have designed a +format which doesn't suck. It is called "MIE", which stands for Meta +Information Encapsulation.

+ +

The MIE format is hierarchical like QuickTime, but it uses meaningful tag +names and specifies a data format for all values. As well, this format +offers a number of other features:

+ +
    +
  • Can be used as a wrapper around any type of file, as a trailer appended + to other formats, or as a stand-alone meta information format +
  • Extensible +
  • Compact +
  • Meaningful tag ID's +
  • Streamable (and single-pass writing possible) +
  • Relocatable data elements (ie. no fixed offsets) +
  • Relatively simple to implement reader/writer +
  • Supports large data lengths (up to 4GB*4GB) +
  • Localized text feature +
  • Built-in support for numerical units of measure +
  • Multiple documents in a single file +
+ +

The specification for this format can be found +here, and is implemented in +Image::ExifTool::MIE.pm

+ +

OK. Flame away. I can take it.

+ + +

References

+ +
    +
  1. http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf, page 26
  2. +
+ +
+Created Nov. 15, 2005
+Last revised Feb 4, 2020 +

<-- Back to ExifTool home page

+ + diff --git a/html/config.html b/html/config.html new file mode 100644 index 0000000..8526d0a --- /dev/null +++ b/html/config.html @@ -0,0 +1,377 @@ + + +example.config + + + +
+#------------------------------------------------------------------------------
+# File:         example.config
+#
+# Description:  Example user configuration file for Image::ExifTool
+#
+# Notes:        This example file shows how to define your own shortcuts and
+#               add new EXIF, IPTC, XMP, PNG, MIE and Composite tags, as well
+#               as how to specify preferred lenses for the LensID tag, and
+#               define new file types and default ExifTool option values.
+#
+#               Note that unknown tags may be extracted even if they aren't
+#               defined, but tags must be defined to be written.  Also note
+#               that it is possible to override an existing tag definition
+#               with a user-defined tag.
+#
+#               To activate this file, rename it to ".ExifTool_config" and
+#               place it in your home directory or the exiftool application
+#               directory.  (On Mac and some Windows systems this must be done
+#               via the command line since the GUI's may not allow filenames to
+#               begin with a dot.  Use the "rename" command in Windows or "mv"
+#               on the Mac.)  This causes ExifTool to automatically load the
+#               file when run.  Your home directory is determined by the first
+#               defined of the following environment variables:
+#
+#                   1.  EXIFTOOL_HOME
+#                   2.  HOME
+#                   3.  HOMEDRIVE + HOMEPATH
+#                   4.  (the current directory)
+#
+#               Alternatively, the -config option of the exiftool application
+#               may be used to load a specific configuration file (note that
+#               this must be the first option on the command line):
+#
+#                   exiftool -config example.config ...
+#
+#               This example file defines the following 16 new tags as well as
+#               a number of Shortcut and Composite tags:
+#
+#                   1.  EXIF:NewEXIFTag
+#                   2.  GPS:GPSPitch
+#                   3.  GPS:GPSRoll
+#                   4.  IPTC:NewIPTCTag
+#                   5.  XMP-xmp:NewXMPxmpTag
+#                   6.  XMP-exif:GPSPitch
+#                   7.  XMP-exif:GPSRoll
+#                   8.  XMP-xxx:NewXMPxxxTag1
+#                   9.  XMP-xxx:NewXMPxxxTag2
+#                  10.  XMP-xxx:NewXMPxxxTag3
+#                  11.  XMP-xxx:NewXMPxxxStruct
+#                  12.  PNG:NewPngTag1
+#                  13.  PNG:NewPngTag2
+#                  14.  PNG:NewPngTag3
+#                  15.  MIE-Meta:NewMieTag1
+#                  16.  MIE-Test:NewMieTag2
+#
+#               For detailed information on the definition of tag tables and
+#               tag information hashes, see lib/Image/ExifTool/README.
+#------------------------------------------------------------------------------
+
+# Shortcut tags are used when extracting information to simplify
+# commonly used commands.  They can be used to represent groups
+# of tags, or to provide an alias for a tag name.
+%Image::ExifTool::UserDefined::Shortcuts = (
+    MyShortcut => ['exif:createdate','exposuretime','aperture'],
+    MyAlias => 'FocalLengthIn35mmFormat',
+);
+
+# NOTE: All tag names used in the following tables are case sensitive.
+
+# The %Image::ExifTool::UserDefined hash defines new tags to be added
+# to existing tables.
+%Image::ExifTool::UserDefined = (
+    # All EXIF tags are added to the Main table, and WriteGroup is used to
+    # specify where the tag is written (default is ExifIFD if not specified):
+    'Image::ExifTool::Exif::Main' => {
+        # Example 1.  EXIF:NewEXIFTag
+        0xd000 => {
+            Name => 'NewEXIFTag',
+            Writable => 'int16u',
+            WriteGroup => 'IFD0',
+        },
+        # add more user-defined EXIF tags here...
+    },
+    # the Geotag feature writes these additional GPS tags if available:
+    'Image::ExifTool::GPS::Main' => {
+        # Example 2.  GPS:GPSPitch
+        0xd000 => {
+            Name => 'GPSPitch',
+            Writable => 'rational64s',
+        },
+        # Example 3.  GPS:GPSRoll
+        0xd001 => {
+            Name => 'GPSRoll',
+            Writable => 'rational64s',
+        },
+    },
+    # IPTC tags are added to a specific record type (eg. application record):
+    # (Note: IPTC tag ID's are limited to the range 0-255)
+    'Image::ExifTool::IPTC::ApplicationRecord' => {
+        # Example 4.  IPTC:NewIPTCTag
+        160 => {
+            Name => 'NewIPTCTag',
+            Format => 'string[0,16]',
+        },
+        # add more user-defined IPTC ApplicationRecord tags here...
+    },
+    # XMP tags may be added to existing namespaces:
+    'Image::ExifTool::XMP::xmp' => {
+        # Example 5.  XMP-xmp:NewXMPxmpTag
+        NewXMPxmpTag => { Groups => { 2 => 'Author' } },
+        # add more user-defined XMP-xmp tags here...
+    },
+    # special Geotag tags for XMP-exif:
+    'Image::ExifTool::XMP::exif' => {
+        # Example 6.  XMP-exif:GPSPitch
+        GPSPitch => { Writable => 'rational', Groups => { 2 => 'Location' } },
+        # Example 7.  XMP-exif:GPSRoll
+        GPSRoll  => { Writable => 'rational', Groups => { 2 => 'Location' } },
+    },
+    # new XMP namespaces (eg. xxx) must be added to the Main XMP table:
+    'Image::ExifTool::XMP::Main' => {
+        # namespace definition for examples 8 to 11
+        xxx => { # <-- must be the same as the NAMESPACE prefix
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::UserDefined::xxx',
+                # (see the definition of this table below)
+            },
+        },
+        # add more user-defined XMP namespaces here...
+    },
+    # new PNG tags are added to the PNG::TextualData table:
+    'Image::ExifTool::PNG::TextualData' => {
+        # Example 12.  PNG:NewPngTag1
+        NewPngTag1 => { },
+        # Example 13.  PNG:NewPngTag2
+        NewPngTag2 => { iTXt => 1 }, # (force this tag to be written as iTXt)
+        # Example 14.  PNG:NewPngTag3
+        NewPngTag3 => { },
+    },
+    # add a new MIE tag (NewMieTag1) and group (MIE-Test) to MIE-Meta
+    # (Note: MIE group names must NOT end with a number)
+    'Image::ExifTool::MIE::Meta' => {
+        # Example 15.  MIE-Meta:NewMieTag1
+        NewMieTag1 => {
+            Writable => 'rational64u',
+            Units => [ 'cm', 'in' ],
+        },
+        # new MIE "Test" group for example 16
+        Test => {
+            SubDirectory => {
+                TagTable => 'Image::ExifTool::UserDefined::MIETest',
+                DirName => 'MIE-Test',
+            },
+        },
+    },
+    # Composite tags are added to the Composite table:
+    'Image::ExifTool::Composite' => {
+        # Composite tags have values that are derived from the values of
+        # other tags.  The Require/Desire elements below specify constituent
+        # tags that must/may exist, and the keys of these hashes are used as
+        # indices in the @val array of the ValueConv expression to access the
+        # numerical (-n) values of these tags.  Print-converted values are
+        # accessed via the @prt array.  All Require'd tags must exist for
+        # the Composite tag to be evaluated.  If no Require'd tags are
+        # specified, then at least one of the Desire'd tags must exist.  See
+        # the Composite table in Image::ExifTool::Exif for more examples,
+        # and lib/Image/ExifTool/README for all of the details.
+        BaseName => {
+            Require => {
+                0 => 'FileName',
+            },
+            # remove the extension from FileName
+            ValueConv => '$val[0] =~ /(.*)\./ ? $1 : $val[0]',
+        },
+        # the next few examples demonstrate simplifications which may be
+        # used if only one tag is Require'd or Desire'd:
+        # 1) the Require lookup may be replaced with a simple tag name
+        # 2) "$val" may be used to represent "$val[0]" in the expression
+        FileExtension => {
+            Require => 'FileName',
+            ValueConv => '$val=~/\.([^.]*)$/; $1',
+        },
+        # override CircleOfConfusion tag to use D/1750 instead of D/1440
+        CircleOfConfusion => {
+            Require => 'ScaleFactor35efl',
+            Groups => { 2 => 'Camera' },
+            ValueConv => 'sqrt(24*24+36*36) / ($val * 1750)',
+            # an optional PrintConv may be used to format the value
+            PrintConv => 'sprintf("%.3f mm",$val)',
+        },
+        # generate a description for this file type
+        FileTypeDescription => {
+            Require => 'FileType',
+            ValueConv => 'GetFileType($val,1) || $val',
+        },
+        # calculate physical image size based on resolution
+        PhysicalImageSize => {
+            Require => {
+                0 => 'ImageWidth',
+                1 => 'ImageHeight',
+                2 => 'XResolution',
+                3 => 'YResolution',
+                4 => 'ResolutionUnit',
+            },
+            ValueConv => '$val[0]/$val[2] . " " . $val[1]/$val[3]',
+            # (the @prt array contains print-formatted values)
+            PrintConv => 'sprintf("%.1fx%.1f $prt[4]", split(" ",$val))',
+        },
+        # [advanced] select largest JPEG preview image
+        BigImage => {
+            Groups => { 2 => 'Preview' },
+            Desire => {
+                0 => 'JpgFromRaw',
+                1 => 'PreviewImage',
+                2 => 'OtherImage',
+                # (DNG and A100 ARW may be have 2 PreviewImage's)
+                3 => 'PreviewImage (1)',
+                # (if the MPF has 2 previews, MPImage3 could be the larger one)
+                4 => 'MPImage3',
+            },
+            # ValueConv may also be a code reference
+            # Inputs: 0) reference to list of values, 1) ExifTool object
+            ValueConv => sub {
+                my $val = shift;
+                my ($image, $bigImage, $len, $bigLen);
+                foreach $image (@$val) {
+                    next unless ref $image eq 'SCALAR';
+                    # check for JPEG image (or "Binary data" if -b not used)
+                    next unless $$image =~ /^(\xff\xd8\xff|Binary data (\d+))/;
+                    $len = $2 || length $$image; # get image length
+                    # save largest image
+                    next if defined $bigLen and $bigLen >= $len;
+                    $bigLen = $len;
+                    $bigImage = $image;
+                }
+                return $bigImage;
+            },
+        },
+        # **** ADD ADDITIONAL COMPOSITE TAG DEFINITIONS HERE ****
+    },
+);
+
+# This is a basic example of the definition for a new XMP namespace.
+# This table is referenced through a SubDirectory tag definition
+# in the %Image::ExifTool::UserDefined definition above.
+# The namespace prefix for these tags is 'xxx', which corresponds to
+# an ExifTool family 1 group name of 'XMP-xxx'.
+%Image::ExifTool::UserDefined::xxx = (
+    GROUPS => { 0 => 'XMP', 1 => 'XMP-xxx', 2 => 'Image' },
+    NAMESPACE => { 'xxx' => 'http://ns.myname.com/xxx/1.0/' },
+    WRITABLE => 'string', # (default to string-type tags)
+    # Example 8.  XMP-xxx:NewXMPxxxTag1 (an alternate-language tag)
+    # - replace "NewXMPxxxTag1" with your own tag name (eg. "MyTag")
+    NewXMPxxxTag1 => { Writable => 'lang-alt' },
+    # Example 9.  XMP-xxx:NewXMPxxxTag2 (a string tag in the Author category)
+    NewXMPxxxTag2 => { Groups => { 2 => 'Author' } },
+    # Example 10.  XMP-xxx:NewXMPxxxTag3 (an unordered List-type tag)
+    NewXMPxxxTag3 => { List => 'Bag' },
+    # Example 11.  XMP-xxx:NewXMPxxxStruct (a structured tag)
+    # - example structured XMP tag
+    NewXMPxxxStruct => {
+        # the "Struct" entry defines the structure fields
+        Struct => {
+            # optional namespace prefix and URI for structure fields
+            # (required only if different than NAMESPACE above)
+            # --> multiple entries may exist in this namespace lookup,
+            # with the last one alphabetically being the default for
+            # the fields, but each field may have a "Namespace"
+            # element to specify which prefix to use
+            NAMESPACE => { 'test' => 'http://x.y.z/test/' },
+            # optional structure name (used for warning messages only)
+            STRUCT_NAME => 'MyStruct',
+            # optional rdf:type property for the structure
+            TYPE => 'http://x.y.z/test/xystruct',
+            # structure fields (very similar to tag definitions)
+            X => { Writable => 'integer' },
+            Y => { Writable => 'integer' },
+            # a nested structure...
+            Things => {
+                List => 'Bag',
+                Struct => {
+                    NAMESPACE => { thing => 'http://x.y.z/thing/' },
+                    What  => { },
+                    Where => { },
+                },
+            },
+        },
+        List => 'Seq', # structures may also be elements of a list
+    },
+    # Each field in the structure has a corresponding flattened tag that is
+    # generated automatically with an ID made from a concatenation of the
+    # original structure tag ID and the field name (after capitalizing the
+    # first letter of the field name if necessary).  The Name and/or
+    # Description of these flattened tags may be changed if desired, but all
+    # other tag properties are taken from the structure field definition.
+    # The "Flat" flag must be used when setting the Name or Description of a
+    # flattened tag.  For example:
+    NewXMPxxxStructX => { Name => 'SomeOtherName', Flat => 1 },
+);
+
+# Adding a new MIE group requires a few extra definitions
+use Image::ExifTool::MIE;
+%Image::ExifTool::UserDefined::MIETest = (
+    %Image::ExifTool::MIE::tableDefaults,   # default MIE table entries
+    GROUPS      => { 0 => 'MIE', 1 => 'MIE-Test', 2 => 'Document' },
+    WRITE_GROUP => 'MIE-Test',
+    # Example 16.  MIE-Test:NewMieTag2
+    NewMieTag2  => { },     # new user-defined tag in MIE-Test group
+);
+
+# A special 'Lenses' list can be defined to give priority to specific lenses
+# in the logic to determine a lens model for the Composite:LensID tag
+@Image::ExifTool::UserDefined::Lenses = (
+    'Sigma AF 10-20mm F4-5.6 EX DC',
+    'Tokina AF193-2 19-35mm f/3.5-4.5',
+);
+
+# User-defined file types to recognize
+%Image::ExifTool::UserDefined::FileTypes = (
+    XXX => { # <-- the extension of the new file type (case insensitive)
+        # BaseType specifies the format upon which this file is based (case
+        # sensitive).  If BaseType is defined, then the file will be fully
+        # supported, and in this case the Magic pattern should not be defined
+        BaseType => 'TIFF',
+        MIMEType => 'image/x-xxx',
+        Description => 'My XXX file type',
+        # if the BaseType is writable by ExifTool, then the new file type
+        # will also be writable unless otherwise specified, like this:
+        Writable => 0,
+    },
+    YYY => {
+        # without BaseType, the file will be recognized but not supported
+        Magic => '0123abcd',    # regular expression to match at start of file
+        MIMEType => 'application/test',
+        Description => 'My YYY file type',
+    },
+    ZZZ => {
+        # if neither BaseType nor Magic are defined, the file will be
+        # recognized by extension only.  MIMEType will be application/unknown
+        # unless otherwise specified
+        Description => 'My ZZZ file type',
+    },
+    # if only BaseType is specified, then the following simplified syntax
+    # may be used.  In this example, files with extension "TTT" will be
+    # processed as JPEG files
+    TTT => 'JPEG',
+);
+
+# Change default location for writing QuickTime tags so Keys is preferred
+# (by default, the PREFERRED levels are: ItemList=2, UserData=1, Keys=0)
+use Image::ExifTool::QuickTime;
+$Image::ExifTool::QuickTime::Keys{PREFERRED} = 3;
+
+# Specify default ExifTool option values
+# (see the Options function documentation for available options)
+%Image::ExifTool::UserDefined::Options = (
+    CoordFormat => '%.6f',  # change default GPS coordinate format
+    Duplicates => 1,        # make -a default for the exiftool app
+    GeoMaxHDOP => 4,        # ignore GPS fixes with HDOP > 4
+    RequestAll => 3,        # request additional tags not normally generated
+);
+
+#------------------------------------------------------------------------------
+1;  #end
+
+
+

# <-- Back to ExifTool home page

+ + diff --git a/html/data_members.html b/html/data_members.html new file mode 100644 index 0000000..722d296 --- /dev/null +++ b/html/data_members.html @@ -0,0 +1,316 @@ + + + +ExifTool Object Data Members + + + +

ExifTool Object Data Members

+ +

The following table lists the data members of the ExifTool object. (If this +was C++, these would be documented next to the definitions in the header file, +but this is Perl, so I couldn't do that...)

+ +

Aside from the variables defined below, there may be other temporary +variables added by individual modules. Temporary variables are identified by at +least one lower case letter in their name, and are deleted automatically before +reading or writing each new image. Make, Model and CameraType are temporary +variables like this, but these three are special because they are initialized to +an empty string instead of being deleted at the start of processing for each +image, which allows them to be tested without having to check for an undefined +value.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
ADD_DIRSHash of parent directories for each directory added during + writing (Note: entry may exist but be undefined for top-level + directory!) To avoid adding a directory twice, entries may be + deleted from this lookup, but only AFTER WriteDirectory() is called.
BASEAbsolute position of current image in containing file + (for example, when processing JPEG image in FujiFilm RAF file)
BOTHReference to HASH of ValueConv/PrintConv arrays, saved for + tags when GetValue is called for 'Both' values, and used to avoid having to + recalculate both values again (which speeds up building the Composite tags + because often the same tag is Require'd by multiple Composite tags).
CameraTypeCamera type used for decoding some Olympus tags
CHANGEDNumber of tags changed during writing
CHARSETLookup table for current Charset setting
CHECK_WARNUsed to return CHECK_PROC warnings
COMP_KEYSLookup for tag keys used in Composite tags
CompressionCompression for current EXIF IFD (or '' if no Compression tag). + Valid only in EXIF directories for tags after 0x0103.
CUR_LANGHash reference for localized language lookup corresponding + to current 'Lang' options setting.
CUR_WRITE_GROUPCurrent family 1 group while writing. Currently + used only when writing QuickTime tracks.
DEL_GROUPHash of groups to delete. Value is 1 to delete group + completely, or 2 if tags were added back after deleting the group. May + have a leading "-" if excluded from a delete.
DEL_PREVIEWFlag to delete preview from after JPEG EOI
DemoteErrorsErrors are demoted to warnings and this count is + incremented if non-zero to begin with
DIR_COUNTHash reference for counters of various types of directories (ICC, IPTC,...)
DIR_NAMEName of directory currently being processed
DOC_COUNTNumber of top-level embedded sub-documents processed while + extracting, or 0 if none were processed
DOC_NUMCurrent document number while extracting (0, '' or undef for the + main document). May contain a hyphen for sub-subdocuments (eg. '2-3-2').
DoneID3Set to 1 if audio file was scanned for ID3, + or 2 if there was an ID3v1 trailer found
DropTagsFlag to exclude "Drop" tags when writing
DUPL_TAGHash of last used tag key index numbers for each duplicate tag.
EDIT_DIRSHash of parent directories for each directory edited during + writing (Note: entry may exist but be undefined for top-level + directory!)
EndUsed by application to signal end of processing
EndDirUsed by application to signal end of the current directory
ESCAPE_PROCRoutine for XML or HTML escaping if Escape option is set
EXCL_TAG_LOOKUPHash for looking up excluded tags (keys are lower case tag names without group)
EXCL_XMP_LOOKUPHash for looking up excluded "XMP-xxx:yyy" tags (keys are lower case including group). + "XMP-xxx" may be any ExifTool family 1 XMP group name, or "XMP-all" for any XMP group. "yyy" may + be any XMP property name (NOT ExifTool tag name), or "all" for all tags in a group
EXIF_DATAEXIF data block (valid while reading from file)
EXIF_POSPosition of EXIF data in file
FILENAMEName of input file while extracting (only if we opened it, '' otherwise)
FILE_ORDERHash of numbers to give the sequence the tags were + extracted from file, keyed by tag key
FILE_EXTUpper-case file extension (JPG, PEF, AVI, etc...) May be undefined if + file has no extension.
FILE_SEQUENCEFile sequence number when extracting information
FILE_TYPERoot file format type (JPEG, TIFF, RIFF, etc...)
FileTypeActual identified file type
FIRST_EXIF_POSPosition of first EXIF in file
FMT_EXPRThe current advanced formatting expression when interpolating tag + values in a string. This member allows the formatting expression to be accessed in + the ValueConv function of user-defined Composite tags, which provided a mechanism for + arguments to be passed to the ValueConv function.
FORCE_WRITEHash reference for metadata types that are being forced to be + rewritten (see Extra ForceWrite tag)
FOUND_DIRNames of directories found in file (used by Validate feature)
FOUND_TAGSFound tags with proper case and order
GLOBAL_TIME_OFFSETTime offset hash for first shifted date/time value of GlobalTimeShift option
HTML_DUMPReference to HtmlDump object when using HtmlDump feature
INDENTIndent string for verbose output
IN_RESOURCEFlag indicates we are processing the resource fork of a Mac OS file
IO_TAG_LISTList for output of requested tags in proper case and order
IsWritingFlag set to indicate that metadata is being written to this file
LIST_TAGSHash of tag keys by tagInfo reference for active list-type + tags. This hash is cleared at the start of processing for each directory. + Not used during when writing.
LOW_PRIORITY_DIRLookup based on directory name for directories where + undefined Priority tags get set to Priority 0 (eg. PreviewIFD in all images, + and IFD1 in JPEG images). This is equivalent to setting PRIORITY to 0 for + the tag table only for a specific directory name. A '*' entry in the lookup + causes the priority of tags in any directory to be lowered.
MakeCamera make set during reading and writing
MAKER_NOTE_BYTE_ORDERByte order of extracted maker notes if extracted + as a block.
MAKER_NOTE_INFOUsed by Image::ExifTool::CanonRaw as temporary storage for + maker note information when synthesizing maker notes from CRW file with the + MakerNotes option.
MAKER_NOTE_FIXUPFixup information for maker notes extracted with the MakerNotes + option (unless MakerNotes option is 2). Used by SetNewValuesFromFile() to adjust offsets + in maker note IFD
ModelCamera model name set during reading and writing
MOVED_KEYTag key of last tag replaced by a higher priority tag + in a call to FoundTag().
NEW_VALUEHash of new value information keyed by tag info reference. + Elements of new value information hash are: + + + + + + +
TagInfo-tag information reference
DelValue-list of specific values to delete
Value-list of values to add
IsCreating-must be set for the tag to be added, otherwise just + changed if it already exists. A value of 2 will create a new tag if its group already + exists, but won't add a new group
Next-reference to next new value hash in linked list + if there is more than one new value hash (for writing to different groups) for this + tagInfo
Save-flag set by call to SaveNewValues() if this value + should be saved
NewIPTCDigestMD5 digest for most recently written IPTC data (undefined if IPTC doesn't + exist or if it was deleted). Calculated only if a value of 'new' is being written/deleted + to/from the Photoshop:IPTCDigest tag
NO_LISTSet if List tags shouldn't be accumulated into a list. Undefined to + accumulate lists as usual, or 0 to accumulate lists in TAG_EXTRA "NoList" element (and + set a TAG_EXTRA "NoListDel" flag for tags that wouldn't have been created).
NO_STRUCTSet if structures shouldn't be restored for this metadata. Used + to avoid restoring structures for non-XMP (eg. XML) information.
NO_STRUCT_WARNSet if structures warnings should be ignored when rebuilding + structures (for questionable XML).
NO_UNKNOWNDon't generate unknown tags automatically even if Unknown option is set
NUM_FOUNDNumber of tags found
OldIPTCDigestMD5 digest for original IPTC data (undefined if IPTC didn't + exist). Calculated only if a value of 'old' is being written/deleted to/from the + Photoshop:IPTCDigest tag
OPTIONSExifTool options
PATHList reference to SubDirectory path. eg) + [qw(JPEG APP13 Photoshop IPTC)]
PDF_CAPTUREUsed by PDF module to store information when writing
PreferredGroupPreferred family 1 group for writing tags to the current file. + Not defined to use the default group priorities. Set in call to InitWriteDirs().
PREVIEW_INFOInformation about preview image used while writing JPEG + images only. This is a reference to a hash with the following entries: + + + + + + + + +
Absolute-flag set if PreviewImage pointer is relative to the + start of file
BaseShift-shift for base of pointer offsets
Data-data for PreviewImage to be written (may either be data + for the old or new image, or 'LOAD_PREVIEW' to indicate that the data must be loaded from outside + the EXIF segment)
Fixup-[mandatory] fixup for PreviewImage pointers when writing JPEG images
IsShort-flag indicates PreviewImage pointers + are 2-byte (instead of 4-byte) integers
IsTrailer-flag indicates image should always be written as a JPEG + trailer, even if it fits inside the APP1 EXIF segment (as with Samsung STMN maker notes)
Relative-flag to indicate that pointer offsets are relative
PRIORITYHash of tag Priority values for current tag, keyed by tag name (not tag key!)
PRIORITY_DIRName of priority directory (ie. the IFD for the full resolution image)
PROCESSEDReference to hash of address/directory names which were processed + during reading and/or writing
RAFRandom access file object for reading from input file
RATIONALHash of rational values as a string fraction keyed by tag key
RecreatedDirectories recreated when writing (used to prevent recreating + multiple directories of the same type)
REQUESTED_TAGSList of requested tags in original case
REQ_TAG_LOOKUPHash for looking up requested tags (keys are lower case tag names)
SAVE_COUNTCounts number of times SaveNewValues() has been called
SAVE_DEL_GROUPHash of saved DEL_GROUP entries
SAVE_NEW_VALUEHash of new value information which was overwritten after + a call to SaveNewValues()
SaveFormatHash reference to check which TIFF format types were used + in the file. Valid only if the (undocumented) SaveFormat option is used.
SET_GROUP0Value to use for family 0 group name when new tags + are found
SET_GROUP1Value to use for family 1 group name when new tags + are found. May start with a '+' sign to add to existing group name
SubfileTypeSubfileType for current EXIF IFD (or '' if no SubfileType tag). + Valid only in EXIF directories for tags after 0x00fe.
TAG_EXTRAHash of extra tag information keyed by tag key. Current extra +information may include: + + + + +
G0-override for family 0 group name
G1-dynamic family 1 group name (eg. IFD name or XMP + namespace), with a leading '+' to add value to the existing group 1 name
G3-number for embedded documents (eg. 1, 2, etc)
TAG_INFOHash of tagInfo hash references, keyed by tag key
TAGS_FROM_FILEFlag used during extraction when called from SetNewValuesFromFile(). + Test this flag when extracting tags that are not normally extracted.
TIFF_ENDLocation of end of regular TIFF file set by WriteExif()
TIFF_TYPEType of TIFF data, only set if FILE_TYPE is TIFF. Valid values + are APP1, APP3, TIFF, CR2, MRW, JP2, JPX, NEF, PEF, ORF, DNG, etc.
ValidateFlag to do extra validation checks
VALUEHash of raw tag values keyed by tag key
WARNED_ONCEHash of warning messages that have been issued once already
WRITE_GROUPSList of write groups in order of priority
WRITE_PRIORITYHash of write priority values keyed by group name
WRITTENHash of tags written (currently used only for filesystem date/time tags)
XMP_CAPTUREHash of tag information (value, attribute hash) keyed by XMP + property path, used by XMP module during writing
XMP_ERRORError string used by XMP module during writing
XMP_NSHash of URI's keyed by namespace prefix, used by XMP module + during writing to remember all used namespaces
+
+

<-- Back to ExifTool home page

+ + diff --git a/html/exiftool_pod.html b/html/exiftool_pod.html new file mode 100644 index 0000000..c8ea571 --- /dev/null +++ b/html/exiftool_pod.html @@ -0,0 +1,2053 @@ + + + + +exiftool Application Documentation + + + + + + + +
+ exiftool Application Documentation +
+ + + + + +

NAME

+ +

exiftool - Read and write meta information in files

+ +

SYNOPSIS

+ +

Reading

+ +

exiftool [OPTIONS] [-TAG...] [--TAG...] FILE...

+ +

Writing

+ +

exiftool [OPTIONS] -TAG[+-<]=[VALUE]... FILE...

+ +

Copying

+ +

exiftool [OPTIONS] -tagsFromFile SRCFILE [-[DSTTAG<]SRCTAG...] FILE...

+ +

Other

+ +

exiftool [ -ver | -list[w|f|r|wf|g[NUM]|d|x] ]

+ +

For specific examples, see the EXAMPLES sections below.

+ +

This documentation is displayed if exiftool is run without an input FILE when one is expected.

+ +

DESCRIPTION

+ +

A command-line interface to Image::ExifTool, used for reading and writing meta information in a variety of file types. FILE is one or more source file names, directory names, or - for the standard input. Metadata is read from source files and printed in readable form to the console (or written to output text files with -w).

+ +

To write or delete metadata, tag values are assigned using -TAG=[VALUE], and/or the -geotag, -csv= or -json= options. To copy or move metadata, the -tagsFromFile feature is used. By default the original files are preserved with _original appended to their names -- be sure to verify that the new files are OK before erasing the originals. Once in write mode, exiftool will ignore any read-specific options.

+ +

Note: If FILE is a directory name then only supported file types in the directory are processed (in write mode only writable types are processed). However, files may be specified by name, or the -ext option may be used to force processing of files with any extension. Hidden files in the directory are also processed. Adding the -r option causes subdirectories to be processed recursively, but subdirectories with names beginning with "." are skipped unless -r. is used.

+ +

Below is a list of file types and meta information formats currently supported by ExifTool (r = read, w = write, c = create):

+ +
  File Types
+  ------------+-------------+-------------+-------------+------------
+  360   r/w   | DR4   r/w/c | JNG   r/w   | O     r     | RAW   r/w
+  3FR   r     | DSS   r     | JP2   r/w   | ODP   r     | RIFF  r
+  3G2   r/w   | DV    r     | JPEG  r/w   | ODS   r     | RSRC  r
+  3GP   r/w   | DVB   r/w   | JSON  r     | ODT   r     | RTF   r
+  A     r     | DVR-MS r    | JXL   r     | OFR   r     | RW2   r/w
+  AA    r     | DYLIB r     | K25   r     | OGG   r     | RWL   r/w
+  AAE   r     | EIP   r     | KDC   r     | OGV   r     | RWZ   r
+  AAX   r/w   | EPS   r/w   | KEY   r     | ONP   r     | RM    r
+  ACR   r     | EPUB  r     | LA    r     | OPUS  r     | SEQ   r
+  AFM   r     | ERF   r/w   | LFP   r     | ORF   r/w   | SKETCH r
+  AI    r/w   | EXE   r     | LIF   r     | ORI   r/w   | SO    r
+  AIFF  r     | EXIF  r/w/c | LNK   r     | OTF   r     | SR2   r/w
+  APE   r     | EXR   r     | LRV   r/w   | PAC   r     | SRF   r
+  ARQ   r/w   | EXV   r/w/c | M2TS  r     | PAGES r     | SRW   r/w
+  ARW   r/w   | F4A/V r/w   | M4A/V r/w   | PBM   r/w   | SVG   r
+  ASF   r     | FFF   r/w   | MACOS r     | PCD   r     | SWF   r
+  AVI   r     | FITS  r     | MAX   r     | PCX   r     | THM   r/w
+  AVIF  r/w   | FLA   r     | MEF   r/w   | PDB   r     | TIFF  r/w
+  AZW   r     | FLAC  r     | MIE   r/w/  | PDF   r/w   | TORRENT r
+  BMP   r     | FLIF  r/w   | MIFF  r   c | PEF   r/w   | TTC   r
+  BPG   r     | FLV   r     | MKA   r     | PFA   r     | TTF   r
+  BTF   r     | FPF   r     | MKS   r     | PFB   r     | TXT   r
+  CHM   r     | FPX   r     | MKV   r     | PFM   r     | VCF   r
+  COS   r     | GIF   r/w   | MNG   r/w   | PGF   r     | VRD   r/w/c
+  CR2   r/w   | GPR   r/w   | MOBI  r     | PGM   r/w   | VSD   r
+  CR3   r/w   | GZ    r     | MODD  r     | PLIST r     | WAV   r
+  CRM   r/w   | HDP   r/w   | MOI   r     | PICT  r     | WDP   r/w
+  CRW   r/w   | HDR   r     | MOS   r/w   | PMP   r     | WEBP  r
+  CS1   r/w   | HEIC  r/w   | MOV   r/w   | PNG   r/w   | WEBM  r
+  CSV   r     | HEIF  r/w   | MP3   r     | PPM   r/w   | WMA   r
+  CZI   r     | HTML  r     | MP4   r/w   | PPT   r     | WMV   r
+  DCM   r     | ICC   r/w/c | MPC   r     | PPTX  r     | WTV   r
+  DCP   r/w   | ICS   r     | MPG   r     | PS    r/w   | WV    r
+  DCR   r     | IDML  r     | MPO   r/w   | PSB   r/w   | X3F   r/w
+  DFONT r     | IIQ   r/w   | MQV   r/w   | PSD   r/w   | XCF   r
+  DIVX  r     | IND   r/w   | MRC   r     | PSP   r     | XLS   r
+  DJVU  r     | INSP  r/w   | MRW   r/w   | QTIF  r/w   | XLSX  r
+  DLL   r     | INSV  r     | MXF   r     | R3D   r     | XMP   r/w/c
+  DNG   r/w   | INX   r     | NEF   r/w   | RA    r     | ZIP   r
+  DOC   r     | ISO   r     | NKSC  r/w   | RAF   r/w   |
+  DOCX  r     | ITC   r     | NRW   r/w   | RAM   r     |
+  DPX   r     | J2C   r     | NUMBERS r   | RAR   r     |
+
+  Meta Information
+  ----------------------+----------------------+---------------------
+  EXIF           r/w/c  |  CIFF           r/w  |  Ricoh RMETA    r
+  GPS            r/w/c  |  AFCP           r/w  |  Picture Info   r
+  IPTC           r/w/c  |  Kodak Meta     r/w  |  Adobe APP14    r
+  XMP            r/w/c  |  FotoStation    r/w  |  MPF            r
+  MakerNotes     r/w/c  |  PhotoMechanic  r/w  |  Stim           r
+  Photoshop IRB  r/w/c  |  JPEG 2000      r    |  DPX            r
+  ICC Profile    r/w/c  |  DICOM          r    |  APE            r
+  MIE            r/w/c  |  Flash          r    |  Vorbis         r
+  JFIF           r/w/c  |  FlashPix       r    |  SPIFF          r
+  Ducky APP12    r/w/c  |  QuickTime      r    |  DjVu           r
+  PDF            r/w/c  |  Matroska       r    |  M2TS           r
+  PNG            r/w/c  |  MXF            r    |  PE/COFF        r
+  Canon VRD      r/w/c  |  PrintIM        r    |  AVCHD          r
+  Nikon Capture  r/w/c  |  FLAC           r    |  ZIP            r
+  GeoTIFF        r/w/c  |  ID3            r    |  (and more)
+ +

OPTIONS

+ +

Case is not significant for any command-line option (including tag and group names), except for single-character options when the corresponding upper-case option exists. Many single-character options have equivalent long-name versions (shown in brackets), and some options have inverses which are invoked with a leading double-dash. Unrecognized options are interpreted as tag names (for this reason, multiple single-character options may NOT be combined into one argument). Contrary to standard practice, options may appear after source file names on the exiftool command line.

+ +

Option Overview

+ +

Tag operations

+ +
  -TAG or --TAG                    Extract or exclude specified tag
+  -TAG[+-^]=[VALUE]                Write new value for tag
+  -TAG[+-]<=DATFILE                Write tag value from contents of file
+  -TAG[+-]<SRCTAG                  Copy tag value (see -tagsFromFile)
+
+  -tagsFromFile SRCFILE            Copy tag values from file
+  -x TAG      (-exclude)           Exclude specified tag
+ +

Input-output text formatting

+ +
  -args       (-argFormat)         Format metadata as exiftool arguments
+  -b          (-binary)            Output metadata in binary format
+  -c FMT      (-coordFormat)       Set format for GPS coordinates
+  -charset [[TYPE=]CHARSET]        Specify encoding for special characters
+  -csv[[+]=CSVFILE]                Export/import tags in CSV format
+  -csvDelim STR                    Set delimiter for CSV file
+  -d FMT      (-dateFormat)        Set format for date/time values
+  -D          (-decimal)           Show tag ID numbers in decimal
+  -E,-ex,-ec  (-escape(HTML|XML|C))Escape tag values for HTML, XML or C
+  -f          (-forcePrint)        Force printing of all specified tags
+  -g[NUM...]  (-groupHeadings)     Organize output by tag group
+  -G[NUM...]  (-groupNames)        Print group name for each tag
+  -h          (-htmlFormat)        Use HTML formatting for output
+  -H          (-hex)               Show tag ID numbers in hexadecimal
+  -htmlDump[OFFSET]                Generate HTML-format binary dump
+  -j[[+]=JSONFILE] (-json)         Export/import tags in JSON format
+  -l          (-long)              Use long 2-line output format
+  -L          (-latin)             Use Windows Latin1 encoding
+  -lang [LANG]                     Set current language
+  -listItem INDEX                  Extract specific item from a list
+  -n          (--printConv)        No print conversion
+  -p FMTFILE  (-printFormat)       Print output in specified format
+  -php                             Export tags as a PHP Array
+  -s[NUM]     (-short)             Short output format
+  -S          (-veryShort)         Very short output format
+  -sep STR    (-separator)         Set separator string for list items
+  -sort                            Sort output alphabetically
+  -struct                          Enable output of structured information
+  -t          (-tab)               Output in tab-delimited list format
+  -T          (-table)             Output in tabular format
+  -v[NUM]     (-verbose)           Print verbose messages
+  -w[+|!] EXT (-textOut)           Write (or overwrite!) output text files
+  -W[+|!] FMT (-tagOut)            Write output text file for each tag
+  -Wext EXT   (-tagOutExt)         Write only specified file types with -W
+  -X          (-xmlFormat)         Use RDF/XML output format
+ +

Processing control

+ +
  -a          (-duplicates)        Allow duplicate tags to be extracted
+  -e          (--composite)        Do not generate composite tags
+  -ee[NUM]    (-extractEmbedded)   Extract information from embedded files
+  -ext[+] EXT (-extension)         Process files with specified extension
+  -F[OFFSET]  (-fixBase)           Fix the base for maker notes offsets
+  -fast[NUM]                       Increase speed when extracting metadata
+  -fileOrder[NUM] [-]TAG           Set file processing order
+  -i DIR      (-ignore)            Ignore specified directory name
+  -if[NUM] EXPR                    Conditionally process files
+  -m          (-ignoreMinorErrors) Ignore minor errors and warnings
+  -o OUTFILE  (-out)               Set output file or directory name
+  -overwrite_original              Overwrite original by renaming tmp file
+  -overwrite_original_in_place     Overwrite original by copying tmp file
+  -P          (-preserve)          Preserve file modification date/time
+  -password PASSWD                 Password for processing protected files
+  -progress[:[TITLE]]              Show file progress count
+  -q          (-quiet)             Quiet processing
+  -r[.]       (-recurse)           Recursively process subdirectories
+  -scanForXMP                      Brute force XMP scan
+  -u          (-unknown)           Extract unknown tags
+  -U          (-unknown2)          Extract unknown binary tags too
+  -wm MODE    (-writeMode)         Set mode for writing/creating tags
+  -z          (-zip)               Read/write compressed information
+ +

Other options

+ +
  -@ ARGFILE                       Read command-line arguments from file
+  -k          (-pause)             Pause before terminating
+  -list[w|f|wf|g[NUM]|d|x]         List various exiftool capabilities
+  -ver                             Print exiftool version number
+  --                               End of options
+ +

Special features

+ +
  -geotag TRKFILE                  Geotag images from specified GPS log
+  -globalTimeShift SHIFT           Shift all formatted date/time values
+  -use MODULE                      Add features from plug-in module
+ +

Utilities

+ +
  -delete_original[!]              Delete "_original" backups
+  -restore_original                Restore from "_original" backups
+ +

Advanced options

+ +
  -api OPT[[^]=[VAL]]              Set ExifTool API option
+  -common_args                     Define common arguments
+  -config CFGFILE                  Specify configuration file name
+  -echo[NUM] TEXT                  Echo text to stdout or stderr
+  -efile[NUM][!] ERRFILE           Save names of files with errors
+  -execute[NUM]                    Execute multiple commands on one line
+  -list_dir                        List directories, not their contents
+  -srcfile FMT                     Process a different source file
+  -stay_open FLAG                  Keep reading -@ argfile even after EOF
+  -userParam PARAM[[^]=[VAL]]      Set user parameter (API UserParam opt)
+ +

Option Details

+ +

Tag operations

+ +
+ +
-TAG
+
+ +

Extract information for the specified tag (eg. -CreateDate). Multiple tags may be specified in a single command. A tag name is the handle by which a piece of information is referenced. See Image::ExifTool::TagNames for documentation on available tag names. A tag name may include leading group names separated by colons (eg. -EXIF:CreateDate, or -Doc1:XMP:Creator), and each group name may be prefixed by a digit to specify family number (eg. -1IPTC:City). Use the -listg option to list available group names by family.

+ +

A special tag name of All may be used to indicate all meta information (ie. -All). This is particularly useful when a group name is specified to extract all information in a group (but beware that unless the -a option is also used, some tags in the group may be suppressed by same-named tags in other groups). The wildcard characters ? and * may be used in a tag name to match any single character and zero or more characters respectively. These may not be used in a group name, with the exception that a group name of * (or All) may be used to extract all instances of a tag (as if -a was used). Note that arguments containing wildcards must be quoted on the command line of most systems to prevent shell globbing.

+ +

A # may be appended to the tag name to disable the print conversion on a per-tag basis (see the -n option). This may also be used when writing or copying tags.

+ +

If no tags are specified, all available information is extracted (as if -All had been specified).

+ +

Note: Descriptions, not tag names, are shown by default when extracting information. Use the -s option to see the tag names instead.

+ +
+
--TAG
+
+ +

Exclude specified tag from extracted information. Same as the -x option. Group names and wildcards are permitted as described above for -TAG. Once excluded from the output, a tag may not be re-included by a subsequent option. May also be used following a -tagsFromFile option to exclude tags from being copied (when redirecting to another tag, it is the source tag that should be excluded), or to exclude groups from being deleted when deleting all information (eg. -all= --exif:all deletes all but EXIF information). But note that this will not exclude individual tags from a group delete (unless a family 2 group is specified, see note 4 below). Instead, individual tags may be recovered using the -tagsFromFile option (eg. -all= -tagsfromfile @ -artist).

+ +

To speed processing when reading XMP, exclusions in XMP groups also bypass processing of the corresponding XMP property and any contained properties. For example, --xmp-crs:all may speed processing significantly in cases where a large number of XMP-crs tags exist. To use this feature to bypass processing of a specific XMP property, the property name must be used instead of the ExifTool tag name (eg. --xmp-crs:dabs). Also, XMP-all may be used to to indicate any XMP namespace (eg. <C--xmp-all:dabs>).

+ +
+
-TAG[+-^]=[VALUE]
+
+ +

Write a new value for the specified tag (eg. -comment=wow), or delete the tag if no VALUE is given (eg. -comment=). += and -= are used to add or remove existing entries from a list, or to shift date/time values (see Image::ExifTool::Shift.pl and note 6 below for more details). += may also be used to increment numerical values (or decrement if VALUE is negative), and -= may be used to conditionally delete or replace a tag (see "WRITING EXAMPLES" for examples). ^= is used to write an empty string instead of deleting the tag when no VALUE is given, but otherwise it is equivalent to =, but note that the caret must be quoted on the Windows command line.

+ +

TAG may contain one or more leading family 0, 1, 2 or 7 group names, prefixed by optional family numbers, and separated colons. If no group name is specified, the tag is created in the preferred group, and updated in any other location where a same-named tag already exists. The preferred group in JPEG and TIFF-format images is the first group in the following list where TAG is valid: 1) EXIF, 2) IPTC, 3) XMP.

+ +

The wildcards * and ? may be used in tag names to assign the same value to multiple tags. When specified with wildcards, "Unsafe" tags are not written. A tag name of All is equivalent to * (except that it doesn't require quoting, while arguments with wildcards do on systems with shell globbing), and is often used when deleting all metadata (ie. -All=) or an entire group (eg. -XMP-dc:All=, see note 4 below). Note that not all groups are deletable, and that the JPEG APP14 "Adobe" group is not removed by default with -All= because it may affect the appearance of the image. However, color space information is removed, so the colors may be affected (but this may be avoided by copying back the tags defined by the ColorSpaceTags shortcut). Use the -listd option for a complete list of deletable groups, and see note 5 below regarding the "APP" groups. Also, within an image some groups may be contained within others, and these groups are removed if the containing group is deleted:

+ +
  JPEG Image:
+  - Deleting EXIF or IFD0 also deletes ExifIFD, GlobParamIFD,
+    GPS, IFD1, InteropIFD, MakerNotes, PrintIM and SubIFD.
+  - Deleting ExifIFD also deletes InteropIFD and MakerNotes.
+  - Deleting Photoshop also deletes IPTC.
+
+  TIFF Image:
+  - Deleting EXIF only removes ExifIFD which also deletes
+    InteropIFD and MakerNotes.
+ +

Notes:

+ +

1) Many tag values may be assigned in a single command. If two assignments affect the same tag, the latter takes precedence (except for list-type tags, for which both values are written).

+ +

2) In general, MakerNotes tags are considered "Permanent", and may be edited but not created or deleted individually. This avoids many potential problems, including the inevitable compatibility problems with OEM software which may be very inflexible about the information it expects to find in the maker notes.

+ +

3) Changes to PDF files by ExifTool are reversible (by deleting the update with -PDF-update:all=) because the original information is never actually deleted from the file. So ExifTool alone may not be used to securely edit metadata in PDF files.

+ +

4) Specifying -GROUP:all= deletes the entire group as a block only if a single family 0 or 1 group is specified. Otherwise all deletable tags in the specified group(s) are removed individually, and in this case is it possible to exclude individual tags from a mass delete. For example, -time:all --Exif:Time:All removes all deletable Time tags except those in the EXIF. This difference also applies if family 2 is specified when deleting all groups. For example, -2all:all= deletes tags individually, while -all:all= deletes entire blocks.

+ +

5) The "APP" group names ("APP0" through "APP15") are used to delete JPEG application segments which are not associated with another deletable group. For example, specifying -APP14:All= will NOT delete the APP14 "Adobe" segment because this is accomplished with -Adobe:All.

+ +

6) When shifting a value, the shift is applied to the original value of the tag, overriding any other values previously assigned to the tag on the same command line. To shift a date/time value and copy it to another tag in the same operation, use the -globalTimeShift option.

+ +

Special feature: Integer values may be specified in hexadecimal with a leading 0x, and simple rational values may be specified as fractions.

+ +
+
-TAG<=DATFILE or -TAG<=FMT
+
+ +

Set the value of a tag from the contents of file DATFILE. The file name may also be given by a FMT string where %d, %f and %e represent the directory, file name and extension of the original FILE (see the -w option for more details). Note that quotes are required around this argument to prevent shell redirection since it contains a < symbol. If DATFILE/FMT is not provided, the effect is the same as -TAG=, and the tag is simply deleted. +<= or -<= may also be used to add or delete specific list entries, or to shift date/time values.

+ +
+
-tagsFromFile SRCFILE or FMT
+
+ +

Copy tag values from SRCFILE to FILE. Tag names on the command line after this option specify the tags to be copied, or excluded from the copy. Wildcards are permitted in these tag names. If no tags are specified, then all possible tags (see note 1 below) from the source file are copied to same-named tags in the preferred location of the output file (the same as specifying -all). More than one -tagsFromFile option may be used to copy tags from multiple files.

+ +

By default, this option will update any existing and writable same-named tags in the output FILE, but will create new tags only in their preferred groups. This allows some information to be automatically transferred to the appropriate group when copying between images of different formats. However, if a group name is specified for a tag then the information is written only to this group (unless redirected to another group, see below). If All is used as a group name, then the specified tag(s) are written to the same family 1 group they had in the source file (ie. the same specific location, like ExifIFD or XMP-dc). For example, the common operation of copying all writable tags to the same specific locations in the output FILE is achieved by adding -all:all. A different family may be specified by adding a leading family number to the group name (eg. -0all:all preserves the same general location, like EXIF or XMP).

+ +

SRCFILE may be the same as FILE to move information around within a single file. In this case, @ may be used to represent the source file (ie. -tagsFromFile @), permitting this feature to be used for batch processing multiple files. Specified tags are then copied from each file in turn as it is rewritten. For advanced batch use, the source file name may also be specified using a FMT string in which %d, %f and %e represent the directory, file name and extension of FILE. (eg. the current FILE would be represented by %d%f.%e, with the same effect as @). See the -w option for FMT string examples.

+ +

A powerful redirection feature allows a destination tag to be specified for each copied tag. With this feature, information may be written to a tag with a different name or group. This is done using "'-DSTTAG<SRCTAG'" or "'-SRCTAG>DSTTAG'" on the command line after -tagsFromFile, and causes the value of SRCTAG to be copied from SRCFILE and written to DSTTAG in FILE. Has no effect unless SRCTAG exists in SRCFILE. Note that this argument must be quoted to prevent shell redirection, and there is no = sign as when assigning new values. Source and/or destination tags may be prefixed by a group name and/or suffixed by #. Wildcards are allowed in both the source and destination tag names. A destination group and/or tag name of All or * writes to the same family 1 group and/or tag name as the source. If no destination group is specified, the information is written to the preferred group. Whitespace around the > or < is ignored. As a convenience, -tagsFromFile @ is assumed for any redirected tags which are specified without a prior -tagsFromFile option. Copied tags may also be added or deleted from a list with arguments of the form "'-SRCTAG+<DSTTAG'" or "'-SRCTAG-<DSTTAG'" (but see Note 5 below).

+ +

An extension of the redirection feature allows strings involving tag names to be used on the right hand side of the < symbol with the syntax "'-DSTTAG<STR'", where tag names in STR are prefixed with a $ symbol. See the -p option and the "Advanced formatting feature" section for more details about this syntax. Strings starting with a = sign must insert a single space after the < to avoid confusion with the <= operator which sets the tag value from the contents of a file. A single space at the start of the string is removed if it exists, but all other whitespace in the string is preserved. See note 8 below about using the redirection feature with list-type stags, shortcuts or when using wildcards in tag names.

+ +

See "COPYING EXAMPLES" for examples using -tagsFromFile.

+ +

Notes:

+ +

1) Some tags (generally tags which may affect the appearance of the image) are considered "Unsafe" to write, and are only copied if specified explicitly (ie. no wildcards). See the tag name documentation for more details about "Unsafe" tags.

+ +

2) Be aware of the difference between excluding a tag from being copied (--TAG), and deleting a tag (-TAG=). Excluding a tag prevents it from being copied to the destination image, but deleting will remove a pre-existing tag from the image.

+ +

3) The maker note information is copied as a block, so it isn't affected like other information by subsequent tag assignments on the command line, and individual makernote tags may not be excluded from a block copy. Also, since the PreviewImage referenced from the maker notes may be rather large, it is not copied, and must be transferred separately if desired.

+ +

4) The order of operations is to copy all specified tags at the point of the -tagsFromFile option in the command line. Any tag assignment to the right of the -tagsFromFile option is made after all tags are copied. For example, new tag values are set in the order One, Two, Three then Four with this command:

+ +
    exiftool -One=1 -tagsFromFile s.jpg -Two -Four=4 -Three d.jpg
+ +

This is significant in the case where an overlap exists between the copied and assigned tags because later operations may override earlier ones.

+ +

5) The normal behaviour of copied tags differs from that of assigned tags for list-type tags and conditional replacements because each copy operation on a tag overrides any previous operations. While this avoids duplicate list items when copying groups of tags from a file containing redundant information, it also prevents values of different tags from being copied into the same list when this is the intent. So a -addTagsFromFile option is provided which allows copying of multiple tags into the same list. eg)

+ +
    exiftool -addtagsfromfile @ '-subject<make' '-subject<model' ...
+ +

Similarly, -addTagsFromFile must be used when conditionally replacing a tag to prevent overriding earlier conditions.

+ +

Other than these differences, the -tagsFromFile and -addTagsFromFile options are equivalent.

+ +

6) The -a option (allow duplicate tags) is always in effect when copying tags from SRCFILE, but the highest priority tag is always copied last so it takes precedence.

+ +

7) Structured tags are copied by default when copying tags. See the -struct option for details.

+ +

8) With the redirection feature, copying a tag directly (ie. "'-DSTTAG<SRCTAG'") is not the same as interpolating its value inside a string (ie. "'-DSTTAG<$SRCTAG'") for list-type tags, shortcut tags, tag names containing wildcards, or UserParam variables. When copying directly, the values of each matching source tag are copied individually to the destination tag (as if they were separate assignments). However, when interpolated inside a string, list items and the values of shortcut tags are concatenated (with a separator set by the -sep option), and wildcards are not allowed. Also, UserParam variables are available only when interpolated in a string. Another difference is that a minor warning is generated if a tag doesn't exist when interpolating its value in a string (with $), but isn't when copying the tag directly.

+ +

Finally, the behaviour is different when a destination tag or group of All is used. When copying directly, a destination group and/or tag name of All writes to the same family 1 group and/or tag name as the source. But when interpolated in a string, the identity of the source tags are lost and the value is written to all possible groups/tags. For example, the string form must be used in the following command since the intent is to set the value of all existing date/time tags from CreateDate:

+ +
    exiftool '-time:all<$createdate' -wm w FILE
+ +
+
-x TAG (-exclude)
+
+ +

Exclude the specified tag. There may be multiple -x options. This has the same effect as --TAG on the command line. See the --TAG documentation above for a complete description.

+ +
+
+ +

Input-output text formatting

+ +

Note that trailing spaces are removed from extracted values for most output text formats. The exceptions are -b, -csv, -j and -X.

+ +
+ +
-args (-argFormat)
+
+ +

Output information in the form of exiftool arguments, suitable for use with the -@ option when writing. May be combined with the -G option to include group names. This feature may be used to effectively copy tags between images, but allows the metadata to be altered by editing the intermediate file (out.args in this example):

+ +
    exiftool -args -G1 --filename --directory src.jpg > out.args
+    exiftool -@ out.args -sep ', ' dst.jpg
+ +

Note: Be careful when copying information with this technique since it is easy to write tags which are normally considered "Unsafe". For instance, the FileName and Directory tags are excluded in the example above to avoid renaming and moving the destination file. Also note that the second command above will produce warning messages for any tags which are not writable.

+ +

As well, the -sep option should be used as in the second command above to maintain separate list items when writing metadata back to image files, and the -struct option may be used when extracting to preserve structured XMP information.

+ +
+
-b, --b (-binary, --binary)
+
+ +

Output requested metadata in binary format without tag names or descriptions (-b or -binary). This option is mainly used for extracting embedded images or other binary data, but it may also be useful for some text strings since control characters (such as newlines) are not replaced by '.' as they are in the default output. By default, list items are separated by a newline when extracted with the -b option, but this may be changed (see the -sep option for details). May be combined with -j, -php or -X to extract binary data in JSON, PHP or XML format, but note that "Unsafe" tags are not extracted as binary unless they are specified explicitly or the API RequestAll option is set to 3 or higher.

+ +

With a leading double dash (--b or --binary), tags which contain binary data are suppressed in the output when reading.

+ +
+
-c FMT (-coordFormat)
+
+ +

Set the print format for GPS coordinates. FMT uses the same syntax as a printf format string. The specifiers correspond to degrees, minutes and seconds in that order, but minutes and seconds are optional. For example, the following table gives the output for the same coordinate using various formats:

+ +
            FMT                  Output
+    -------------------    ------------------
+    "%d deg %d' %.2f"\"    54 deg 59' 22.80"  (default for reading)
+    "%d %d %.8f"           54 59 22.80000000  (default for copying)
+    "%d deg %.4f min"      54 deg 59.3800 min
+    "%.6f degrees"         54.989667 degrees
+ +

Notes:

+ +

1) To avoid loss of precision, the default coordinate format is different when copying tags using the -tagsFromFile option.

+ +

2) If the hemisphere is known, a reference direction (N, S, E or W) is appended to each printed coordinate, but adding a + to the format specifier (eg. %+.6f) prints a signed coordinate instead.

+ +

3) This print formatting may be disabled with the -n option to extract coordinates as signed decimal degrees.

+ +
+
-charset [[TYPE=]CHARSET]
+
+ +

If TYPE is ExifTool or not specified, this option sets the ExifTool character encoding for output tag values when reading and input values when writing, with a default of UTF8. If no CHARSET is given, a list of available character sets is returned. Valid CHARSET values are:

+ +
    CHARSET     Alias(es)        Description
+    ----------  ---------------  ----------------------------------
+    UTF8        cp65001, UTF-8   UTF-8 characters (default)
+    Latin       cp1252, Latin1   Windows Latin1 (West European)
+    Latin2      cp1250           Windows Latin2 (Central European)
+    Cyrillic    cp1251, Russian  Windows Cyrillic
+    Greek       cp1253           Windows Greek
+    Turkish     cp1254           Windows Turkish
+    Hebrew      cp1255           Windows Hebrew
+    Arabic      cp1256           Windows Arabic
+    Baltic      cp1257           Windows Baltic
+    Vietnam     cp1258           Windows Vietnamese
+    Thai        cp874            Windows Thai
+    DOSLatinUS  cp437            DOS Latin US
+    DOSLatin1   cp850            DOS Latin1
+    DOSCyrillic cp866            DOS Cyrillic
+    MacRoman    cp10000, Roman   Macintosh Roman
+    MacLatin2   cp10029          Macintosh Latin2 (Central Europe)
+    MacCyrillic cp10007          Macintosh Cyrillic
+    MacGreek    cp10006          Macintosh Greek
+    MacTurkish  cp10081          Macintosh Turkish
+    MacRomanian cp10010          Macintosh Romanian
+    MacIceland  cp10079          Macintosh Icelandic
+    MacCroatian cp10082          Macintosh Croatian
+ +

TYPE may be FileName to specify the encoding of file names on the command line (ie. FILE arguments). In Windows, this triggers use of wide-character i/o routines, thus providing support for Unicode file names. See the "WINDOWS UNICODE FILE NAMES" section below for details.

+ +

Other values of TYPE listed below are used to specify the internal encoding of various meta information formats.

+ +
    TYPE       Description                                  Default
+    ---------  -------------------------------------------  -------
+    EXIF       Internal encoding of EXIF "ASCII" strings    (none)
+    ID3        Internal encoding of ID3v1 information       Latin
+    IPTC       Internal IPTC encoding to assume when        Latin
+                IPTC:CodedCharacterSet is not defined
+    Photoshop  Internal encoding of Photoshop IRB strings   Latin
+    QuickTime  Internal encoding of QuickTime strings       MacRoman
+    RIFF       Internal encoding of RIFF strings            0
+ +

See https://exiftool.org/faq.html#Q10 for more information about coded character sets, and the Image::ExifTool Options for more details about the -charset settings.

+ +
+
-csv[[+]=CSVFILE]
+
+ +

Export information in CSV format, or import information if CSVFILE is specified. When importing, the CSV file must be in exactly the same format as the exported file. The first row of the CSVFILE must be the ExifTool tag names (with optional group names) for each column of the file, and values must be separated by commas. A special "SourceFile" column specifies the files associated with each row of information (and a SourceFile of "*" may be used to define default tags to be imported for all files which are combined with any tags specified for the specific SourceFile processed). The -csvDelim option may be used to change the input/output field delimiter if something other than a comma is required.

+ +

The following examples demonstrate basic use of the -csv option:

+ +
    # generate CSV file with common tags from all images in a directory
+    exiftool -common -csv dir > out.csv
+
+    # update metadata for all images in a directory from CSV file
+    exiftool -csv=a.csv dir
+ +

When importing, empty values are ignored unless the -f option is used and the API MissingTagValue is set to an empty string (in which case the tag is deleted). Also, FileName and Directory columns are ignored if they exist (ie. ExifTool will not attempt to write these tags with a CSV import), but all other columns are imported. To force a tag to be deleted, use the -f option and set the value to "-" in the CSV file (or to the MissingTagValue if this API option was used). Multiple databases may be imported in a single command.

+ +

When exporting a CSV file, the -g or -G option adds group names to the tag headings. If the -a option is used to allow duplicate tag names, the duplicate tags are only included in the CSV output if the column headings are unique. Adding the -G4 option ensures a unique column heading for each tag. The -b option may be added to output binary data, encoded in base64 if necessary (indicated by ASCII "base64:" as the first 7 bytes of the value). Values may also be encoded in base64 if the -charset option is used and the value contains invalid characters.

+ +

When exporting specific tags, the CSV columns are arranged in the same order as the specified tags provided the column headings exactly match the specified tag names, otherwise the columns are sorted in alphabetical order.

+ +

When importing from a CSV file, only files specified on the command line are processed. Any extra entries in the CSV file are ignored.

+ +

List-type tags are stored as simple strings in a CSV file, but the -sep option may be used to split them back into separate items when importing.

+ +

Special feature: -csv+=CSVFILE may be used to add items to existing lists. This affects only list-type tags. Also applies to the -j option.

+ +

Note that this option is fundamentally different than all other output format options because it requires information from all input files to be buffered in memory before the output is written. This may result in excessive memory usage when processing a very large number of files with a single command. Also, it makes this option incompatible with the -w option. When processing a large number of files, it is recommended to either use the JSON (-j) or XML (-X) output format, or use -p to generate a fixed-column CSV file instead of using the -csv option.

+ +
+
-csvDelim STR
+
+ +

Set the delimiter for separating CSV entries for CSV file input/output via the -csv option. STR may contain "\t", "\n", "\r" and "\\" to represent TAB, LF, CR and '\' respectively. A double quote is not allowed in the delimiter. Default is ','.

+ +
+
-d FMT (-dateFormat)
+
+ +

Set the format for date/time tag values. The FMT string may contain formatting codes beginning with a percent character (%) to represent the various components of a date/time value. The specifics of the FMT syntax are system dependent -- consult the strftime man page on your system for details. The default format is equivalent to "%Y:%m:%d %H:%M:%S". This option has no effect on date-only or time-only tags and ignores timezone information if present. ExifTool adds a %f format code to represent fractional seconds, and supports an optional width to specify the number of digits after the decimal point (eg. %3f would give something like .437). Only one -d option may be used per command. Requires POSIX::strptime or Time::Piece for the inversion conversion when writing.

+ +
+
-D (-decimal)
+
+ +

Show tag ID number in decimal when extracting information.

+ +
+
-E, -ex, -ec (-escapeHTML, -escapeXML, -escapeC)
+
+ +

Escape characters in output tag values for HTML (-E), XML (-ex) or C (-ec). For HTML, all characters with Unicode code points above U+007F are escaped as well as the following 5 characters: & (&amp;) ' (&#39;) " (&quot;) > (&gt;) and < (&lt;). For XML, only these 5 characters are escaped. The -E option is implied with -h, and -ex is implied with -X. For C, all control characters and the backslash are escaped. The inverse conversion is applied when writing tags.

+ +
+
-f (-forcePrint)
+
+ +

Force printing of tags even if their values are not found. This option only applies when specific tags are requested on the command line (ie. not with wildcards or by -all). With this option, a dash (-) is printed for the value of any missing tag, but the dash may be changed via the API MissingTagValue option. May also be used to add a 'flags' attribute to the -listx output, or to allow tags to be deleted when writing with the -csv=CSVFILE feature.

+ +
+
-g[NUM][:NUM...] (-groupHeadings)
+
+ +

Organize output by tag group. NUM specifies a group family number, and may be 0 (general location), 1 (specific location), 2 (category), 3 (document number), 4 (instance number), 5 (metadata path), 6 (EXIF/TIFF format) or 7 (tag ID). -g0 is assumed if a family number is not specified. May be combined with other options to add group names to the output. Multiple families may be specified by separating them with colons. By default the resulting group name is simplified by removing any leading Main: and collapsing adjacent identical group names, but this can be avoided by placing a colon before the first family number (eg. -g:3:1). Use the -listg option to list group names for a specified family. The API SavePath and SaveFormat options are automatically enabled if the respective family 5 or 6 group names are requested. See the API GetGroup documentation for more information.

+ +
+
-G[NUM][:NUM...] (-groupNames)
+
+ +

Same as -g but print group name for each tag. -G0 is assumed if NUM is not specified. May be combined with a number of other options to add group names to the output. Note that NUM may be added wherever -G is mentioned in the documentation. See the -g option above for details.

+ +
+
-h (-htmlFormat)
+
+ +

Use HTML table formatting for output. Implies the -E option. The formatting options -D, -H, -g, -G, -l and -s may be used in combination with -h to influence the HTML format.

+ +
+
-H (-hex)
+
+ +

Show tag ID number in hexadecimal when extracting information.

+ +
+
-htmlDump[OFFSET]
+
+ +

Generate a dynamic web page containing a hex dump of the EXIF information. This can be a very powerful tool for low-level analysis of EXIF information. The -htmlDump option is also invoked if the -v and -h options are used together. The verbose level controls the maximum length of the blocks dumped. An OFFSET may be given to specify the base for displayed offsets. If not provided, the EXIF/TIFF base offset is used. Use -htmlDump0 for absolute offsets. Currently only EXIF/TIFF and JPEG information is dumped, but the -u option can be used to give a raw hex dump of other file formats.

+ +
+
-j[[+]=JSONFILE] (-json)
+
+ +

Use JSON (JavaScript Object Notation) formatting for console output, or import JSON file if JSONFILE is specified. This option may be combined with -g to organize the output into objects by group, or -G to add group names to each tag. List-type tags with multiple items are output as JSON arrays unless -sep is used. By default XMP structures are flattened into individual tags in the JSON output, but the original structure may be preserved with the -struct option (this also causes all list-type XMP tags to be output as JSON arrays, otherwise single-item lists would be output as simple strings). The -a option is implied when -json is used, but entries with identical JSON names are suppressed in the output. (-G4 may be used to ensure that all tags have unique JSON names.) Adding the -D or -H option changes tag values to JSON objects with "val" and "id" fields, and adding -l adds a "desc" field, and a "num" field if the numerical value is different from the converted "val". The -b option may be added to output binary data, encoded in base64 if necessary (indicated by ASCII "base64:" as the first 7 bytes of the value), and -t may be added to include tag table information (see -t for details). The JSON output is UTF-8 regardless of any -L or -charset option setting, but the UTF-8 validation is disabled if a character set other than UTF-8 is specified.

+ +

If JSONFILE is specified, the file is imported and the tag definitions from the file are used to set tag values on a per-file basis. The special "SourceFile" entry in each JSON object associates the information with a specific target file. An object with a missing SourceFile or a SourceFile of "*" defines default tags for all target files which are combined with any tags specified for the specific SourceFile processed. The imported JSON file must have the same format as the exported JSON files with the exception that the -g option is not compatible with the import file format (use -G instead). Additionally, tag names in the input JSON file may be suffixed with a # to disable print conversion.

+ +

Unlike CSV import, empty values are not ignored, and will cause an empty value to be written if supported by the specific metadata type. Tags are deleted by using the -f option and setting the tag value to "-" (or to the MissingTagValue setting if this API option was used). Importing with -j+=JSONFILE causes new values to be added to existing lists.

+ +
+
-l (-long)
+
+ +

Use long 2-line Canon-style output format. Adds a description and unconverted value (if it is different from the converted value) to the XML, JSON or PHP output when -X, -j or -php is used. May also be combined with -listf, -listr or -listwf to add descriptions of the file types.

+ +
+
-L (-latin)
+
+ +

Use Windows Latin1 encoding (cp1252) for output tag values instead of the default UTF-8. When writing, -L specifies that input text values are Latin1 instead of UTF-8. Equivalent to -charset latin.

+ +
+
-lang [LANG]
+
+ +

Set current language for tag descriptions and converted values. LANG is de, fr, ja, etc. Use -lang with no other arguments to get a list of available languages. The default language is en if -lang is not specified. Note that tag/group names are always English, independent of the -lang setting, and translation of warning/error messages has not yet been implemented. May also be combined with -listx to output descriptions in one language only.

+ +

By default, ExifTool uses UTF-8 encoding for special characters, but the the -L or -charset option may be used to invoke other encodings. Note that ExifTool uses Unicode::LineBreak if available to help preserve the column alignment of the plain text output for languages with a variable-width character set.

+ +

Currently, the language support is not complete, but users are welcome to help improve this by submitting their own translations. To submit a translation, follow these steps (you must have Perl installed for this):

+ +

1. Download and unpack the latest Image-ExifTool full distribution.

+ +

2. 'cd' into the Image-ExifTool directory.

+ +

3. Run this command to make an XML file of the desired tags (eg. EXIF):

+ +
   ./exiftool -listx -exif:all > out.xml
+ +

4. Copy this text into a file called 'import.pl' in the exiftool directory:

+ +
    push @INC, 'lib';
+    require Image::ExifTool::TagInfoXML;
+    my $file = shift or die "Expected XML file name\n";
+    $Image::ExifTool::TagInfoXML::makeMissing = shift;
+    Image::ExifTool::TagInfoXML::BuildLangModules($file,8);
+ +

5. Run the 'import.pl' script to Import the XML file, generating the 'MISSING' entries for your language (eg. Russian):

+ +
   perl import.pl out.xml ru
+ +

6. Edit the generated language module lib/Image/ExifTool/Lang/ru.pm, and search and replace all 'MISSING' strings in the file with your translations.

+ +

7. Email the module ('ru.pm' in this example) to philharvey66 at gmail.com

+ +

8. Thank you!!

+ +
+
-listItem INDEX
+
+ +

For list-type tags, this causes only the item with the specified index to be extracted. INDEX is 0 for the first item in the list. Negative indices may also be used to reference items from the end of the list. Has no effect on single-valued tags. Also applies to tag values when copying from a tag, and in -if conditions.

+ +
+
-n (--printConv)
+
+ +

Disable print conversion for all tags. By default, extracted values are converted to a more human-readable format, but the -n option disables this conversion, revealing the machine-readable values. For example:

+ +
    > exiftool -Orientation -S a.jpg
+    Orientation: Rotate 90 CW
+    > exiftool -Orientation -S -n a.jpg
+    Orientation: 6
+ +

The print conversion may also be disabled on a per-tag basis by suffixing the tag name with a # character:

+ +
    > exiftool -Orientation# -Orientation -S a.jpg
+    Orientation: 6
+    Orientation: Rotate 90 CW
+ +

These techniques may also be used to disable the inverse print conversion when writing. For example, the following commands all have the same effect:

+ +
    > exiftool -Orientation='Rotate 90 CW' a.jpg
+    > exiftool -Orientation=6 -n a.jpg
+    > exiftool -Orientation#=6 a.jpg
+ +
+
-p FMTFILE or STR (-printFormat)
+
+ +

Print output in the format specified by the given file or string. The argument is interpreted as a string unless a file of that name exists, in which case the string is loaded from the contents of the file. Tag names in the format file or string begin with a $ symbol and may contain leading group names and/or a trailing # (to disable print conversion). Case is not significant. Braces {} may be used around the tag name to separate it from subsequent text. Use $$ to represent a $ symbol, and $/ for a newline.

+ +

Multiple -p options may be used, each contributing a line (or more) of text to the output. Lines beginning with #[HEAD] and #[TAIL] are output before the first processed file and after the last processed file respectively. Lines beginning with #[SECT] and #[ENDS] are output before and after each section of files. A section is defined as a group of consecutive files with the same section header (eg. files are grouped by directory if #[SECT] contains $directory). Lines beginning with #[BODY] and lines not beginning with # are output for each processed file. Lines beginning with #[IF] are not output, but all BODY lines are skipped if any tag on an IF line doesn't exist. Other lines beginning with # are ignored. (To output a line beginning with #, use #[BODY]#.) For example, this format file:

+ +
    # this is a comment line
+    #[HEAD]-- Generated by ExifTool $exifToolVersion --
+    File: $FileName - $DateTimeOriginal
+    (f/$Aperture, ${ShutterSpeed}s, ISO $EXIF:ISO)
+    #[TAIL]-- end --
+ +

with this command:

+ +
    exiftool -p test.fmt a.jpg b.jpg
+ +

produces output like this:

+ +
    -- Generated by ExifTool 12.44 --
+    File: a.jpg - 2003:10:31 15:44:19
+    (f/5.6, 1/60s, ISO 100)
+    File: b.jpg - 2006:05:23 11:57:38
+    (f/8.0, 1/13s, ISO 100)
+    -- end --
+ +

The values of List-type tags with multiple items and Shortcut tags representing multiple tags are joined according the the -sep option setting when interpolated in the string.

+ +

When -ee (-extractEmbedded) is combined with -p, embedded documents are effectively processed as separate input files.

+ +

If a specified tag does not exist, a minor warning is issued and the line with the missing tag is not printed. However, the -f option may be used to set the value of missing tags to '-' (but this may be configured via the API MissingTagValue option), or the -m option may be used to ignore minor warnings and leave the missing values empty. Alternatively, -q -q may be used to simply suppress the warning messages.

+ +

The "Advanced formatting feature" may be used to modify the values of individual tags with the -p option.

+ +
+
-php
+
+ +

Format output as a PHP Array. The -g, -G, -D, -H, -l, -sep and -struct options combine with -php, and duplicate tags are handled in the same way as with the -json option. As well, the -b option may be added to output binary data, and -t may be added to include tag table information (see -t for details). Here is a simple example showing how this could be used in a PHP script:

+ +
    <?php
+    eval('$array=' . `exiftool -php -q image.jpg`);
+    print_r($array);
+    ?>
+ +
+
-s[NUM] (-short)
+
+ +

Short output format. Prints tag names instead of descriptions. Add NUM or up to 3 -s options for even shorter formats:

+ +
    -s1 or -s        - print tag names instead of descriptions
+    -s2 or -s -s     - no extra spaces to column-align values
+    -s3 or -s -s -s  - print values only (no tag names)
+ +

Also effective when combined with -t, -h, -X or -listx options.

+ +
+
-S (-veryShort)
+
+ +

Very short format. The same as -s2 or two -s options. Tag names are printed instead of descriptions, and no extra spaces are added to column-align values.

+ +
+
-sep STR (-separator)
+
+ +

Specify separator string for items in list-type tags. When reading, the default is to join list items with ", ". When writing, this option causes values assigned to list-type tags to be split into individual items at each substring matching STR (otherwise they are not split by default). Space characters in STR match zero or more whitespace characters in the value.

+ +

Note that an empty separator ("") is allowed, and will join items with no separator when reading, or split the value into individual characters when writing.

+ +

For pure binary output (-b used without -j, -php or -X), the first -sep option specifies a list-item separator, and a second -sep option specifies a terminator for the end of the list (or after each value if not a list). In these strings, \n, \r and \t may be used to represent a newline, carriage return and tab respectively. By default, binary list items are separated by a newline, and no terminator is added.

+ +
+
-sort, --sort
+
+ +

Sort output by tag description, or by tag name if the -s option is used. When sorting by description, the sort order will depend on the -lang option setting. Without the -sort option, tags appear in the order they were specified on the command line, or if not specified, the order they were extracted from the file. By default, tags are organized by groups when combined with the -g or -G option, but this grouping may be disabled with --sort.

+ +
+
-struct, --struct
+
+ +

Output structured XMP information instead of flattening to individual tags. This option works well when combined with the XML (-X) and JSON (-j) output formats. For other output formats, XMP structures and lists are serialized into the same format as when writing structured information (see https://exiftool.org/struct.html for details). When copying, structured tags are copied by default unless --struct is used to disable this feature (although flattened tags may still be copied by specifying them individually unless -struct is used). These options have no effect when assigning new values since both flattened and structured tags may always be used when writing.

+ +
+
-t (-tab)
+
+ +

Output a tab-delimited list of description/values (useful for database import). May be combined with -s to print tag names instead of descriptions, or -S to print tag values only, tab-delimited on a single line. The -t option may be combined with -j, -php or -X to add tag table information (table, tag id, and index for cases where multiple conditional tags exist with the same ID).

+ +
+
-T (-table)
+
+ +

Output tag values in table form. Equivalent to -t -S -q -f.

+ +
+
-v[NUM] (-verbose)
+
+ +

Print verbose messages. NUM specifies the level of verbosity in the range 0-5, with higher numbers being more verbose. If NUM is not given, then each -v option increases the level of verbosity by 1. With any level greater than 0, most other options are ignored and normal console output is suppressed unless specific tags are extracted. Using -v0 causes the console output buffer to be flushed after each line (which may be useful to avoid delays when piping exiftool output), and prints the name of each processed file when writing and the new file name when renaming, moving or copying. Verbose levels above -v0 do not flush after each line. Also see the -progress option.

+ +
+
-w[+|!] EXT or FMT (-textOut)
+
+ +

Write console output to files with names ending in EXT, one for each source file. The output file name is obtained by replacing the source file extension (including the '.') with the specified extension (and a '.' is added to the start of EXT if it doesn't already contain one). Alternatively, a FMT string may be used to give more control over the output file name and directory. In the format string, %d, %f and %e represent the directory, filename and extension of the source file, and %c represents a copy number which is automatically incremented if the file already exists. %d includes the trailing '/' if necessary, but %e does not include the leading '.'. For example:

+ +
    -w %d%f.txt       # same effect as "-w txt"
+    -w dir/%f_%e.out  # write files to "dir" as "FILE_EXT.out"
+    -w dir2/%d%f.txt  # write to "dir2", keeping dir structure
+    -w a%c.txt        # write to "a.txt" or "a1.txt" or "a2.txt"...
+ +

Existing files will not be changed unless an exclamation point is added to the option name (ie. -w! or -textOut!) to overwrite the file, or a plus sign (ie. -w+ or -textOut+) to append to the existing file. Both may be used (ie. -w+! or -textOut+!) to overwrite output files that didn't exist before the command was run, and append the output from multiple source files. For example, to write one output file for all source files in each directory:

+ +
    exiftool -filename -createdate -T -w+! %d/out.txt -r DIR
+ +

Capitalized format codes %D, %F, %E and %C provide slightly different alternatives to the lower case versions. %D does not include the trailing '/', %F is the full filename including extension, %E includes the leading '.', and %C increments the count for each processed file (see below).

+ +

Notes:

+ +

1) In a Windows BAT file the % character is represented by %%, so an argument like %d%f.txt is written as %%d%%f.txt.

+ +

2) If the argument for -w does not contain a valid format code (eg. %f), then it is interpreted as a file extension, but there are three different ways to create a single output file from multiple source files:

+ +
    # 1. Shell redirection
+    exiftool FILE1 FILE2 ... > out.txt
+
+    # 2. With the -w option and a zero-width format code
+    exiftool -w+! %0fout.txt FILE1 FILE2 ...
+
+    # 3. With the -W option (see the -W option below)
+    exiftool -W+! out.txt FILE1 FILE2 ...
+ +

Advanced features:

+ +

A substring of the original file name, directory or extension may be taken by specifying a field width immediately following the '%' character. If the width is negative, the substring is taken from the end. The substring position (characters to ignore at the start or end of the string) may be given by a second optional value after a decimal point. For example:

+ +
    Input File Name     Format Specifier    Output File Name
+    ----------------    ----------------    ----------------
+    Picture-123.jpg     %7f.txt             Picture.txt
+    Picture-123.jpg     %-.4f.out           Picture.out
+    Picture-123.jpg     %7f.%-3f            Picture.123
+    Picture-123a.jpg    Meta%-3.1f.txt      Meta123.txt
+ +

(Note that special characters may have a width of greater than one.)

+ +

For %d and %D, the field width/position specifiers may be applied to the directory levels instead of substring position by using a colon instead of a decimal point in the format specifier. For example:

+ +
    Source Dir     Format   Result       Notes
+    ------------   ------   ----------   ------------------
+    pics/2012/02   %2:d     pics/2012/   take top 2 levels
+    pics/2012/02   %-:1d    pics/2012/   up one directory level
+    pics/2012/02   %:1d     2012/02/     ignore top level
+    pics/2012/02   %1:1d    2012/        take 1 level after top
+    pics/2012/02   %-1:D    02           bottom level folder name
+    /Users/phil    %:2d     phil/        ignore top 2 levels
+ +

(Note that the root directory counts as one level when an absolute path is used as in the last example above.)

+ +

For %c, these modifiers have a different effects. If a field width is given, the copy number is padded with zeros to the specified width. A leading '-' adds a dash before the copy number, and a '+' adds an underline. By default, the copy number is omitted from the first file of a given name, but this can be changed by adding a decimal point to the modifier. For example:

+ +
    -w A%-cZ.txt      # AZ.txt, A-1Z.txt, A-2Z.txt ...
+    -w B%5c.txt       # B.txt, B00001.txt, B00002.txt ...
+    -w C%.c.txt       # C0.txt, C1.txt, C2.txt ...
+    -w D%-.c.txt      # D-0.txt, D-1.txt, D-2.txt ...
+    -w E%-.4c.txt     # E-0000.txt, E-0001.txt, E-0002.txt ...
+    -w F%-.4nc.txt    # F-0001.txt, F-0002.txt, F-0003.txt ...
+    -w G%+c.txt       # G.txt, G_1.txt G_2.txt ...
+    -w H%-lc.txt      # H.txt, H-b.txt, H-c.txt ...
+    -w I.%.3uc.txt    # I.AAA.txt, I.AAB.txt, I.AAC.txt ...
+ +

A special feature allows the copy number to be incremented for each processed file by using %C (upper case) instead of %c. This allows a sequential number to be added to output file names, even if the names are different. For %C, a copy number of zero is not omitted as it is with %c. A leading '-' causes the number to be reset at the start of each new directory, and '+' has no effect. The number before the decimal place gives the starting index, the number after the decimal place gives the field width. The following examples show the output filenames when used with the command exiftool rose.jpg star.jpg jet.jpg ...:

+ +
    -w %C%f.txt       # 0rose.txt, 1star.txt, 2jet.txt
+    -w %f-%10C.txt    # rose-10.txt, star-11.txt, jet-12.txt
+    -w %.3C-%f.txt    # 000-rose.txt, 001-star.txt, 002-jet.txt
+    -w %57.4C%f.txt   # 0057rose.txt, 0058star.txt, 0059jet.txt
+ +

All format codes may be modified by 'l' or 'u' to specify lower or upper case respectively (ie. %le for a lower case file extension). When used to modify %c or %C, the numbers are changed to an alphabetical base (see example H above). Also, %c and %C may be modified by 'n' to count using natural numbers starting from 1, instead of 0 (see example F above).

+ +

This same FMT syntax is used with the -o and -tagsFromFile options, although %c and %C are only valid for output file names.

+ +
+
-W[+|!] FMT (-tagOut)
+
+ +

This enhanced version of the -w option allows a separate output file to be created for each extracted tag. See the -w option documentation above for details of the basic functionality. Listed here are the differences between -W and -w:

+ +

1) With -W, a new output file is created for each extracted tag.

+ +

2) -W supports four additional format codes: %t, %g and %s represent the tag name, group name, and suggested extension for the output file (based on the format of the data), and %o represents the value of the OriginalRawFileName or OriginalFileName tag from the input file (including extension). The %g code may be followed by a single digit to specify the group family number (eg. %g1), otherwise family 0 is assumed. The substring width/position/case specifiers may be used with these format codes in exactly the same way as with %f and %e.

+ +

3) The argument for -W is interpreted as a file name if it contains no format codes. (For -w, this would be a file extension.) This change allows a simple file name to be specified, which, when combined with the append feature, provides a method to write metadata from multiple source files to a single output file without the need for shell redirection. For example, the following pairs of commands give the same result:

+ +
    # overwriting existing text file
+    exiftool test.jpg > out.txt     # shell redirection
+    exiftool test.jpg -W+! out.txt  # equivalent -W option
+
+    # append to existing text file
+    exiftool test.jpg >> out.txt    # shell redirection
+    exiftool test.jpg -W+ out.txt   # equivalent -W option
+ +

4) Adding the -v option to -W sends a list of the tags and output file names to the console instead of giving a verbose dump of the entire file. (Unless appending all output to one file for each source file by using -W+ with an output file FMT that does not contain %t, %g, %s or %o.)

+ +

5) Individual list items are stored in separate files when -W is combined with -b, but note that for separate files to be created %c or %C must be used in FMT to give the files unique names.

+ +
+
-Wext EXT, --Wext EXT (-tagOutExt)
+
+ +

This option is used to specify the type of output file(s) written by the -W option. An output file is written only if the suggested extension matches EXT. Multiple -Wext options may be used to write more than one type of file. Use --Wext to write all but the specified type(s).

+ +
+
-X (-xmlFormat)
+
+ +

Use ExifTool-specific RDF/XML formatting for console output. Implies the -a option, so duplicate tags are extracted. The formatting options -b, -D, -H, -l, -s, -sep, -struct and -t may be used in combination with -X to affect the output, but note that the tag ID (-D, -H and -t), binary data (-b) and structured output (-struct) options are not effective for the short output (-s). Another restriction of -s is that only one tag with a given group and name may appear in the output. Note that the tag ID options (-D, -H and -t) will produce non-standard RDF/XML unless the -l option is also used.

+ +

By default, -X outputs flattened tags, so -struct should be added if required to preserve XMP structures. List-type tags with multiple values are formatted as an RDF Bag, but they are combined into a single string when -s or -sep is used. Using -L changes the XML encoding from "UTF-8" to "windows-1252". Other -charset settings change the encoding only if there is a corresponding standard XML character set. The -b option causes binary data values to be written, encoded in base64 if necessary. The -t option adds tag table information to the output (see -t for details).

+ +

Note: This output is NOT the same as XMP because it uses dynamically-generated property names corresponding to the ExifTool tag names with ExifTool family 1 group names as namespaces, and not the standard XMP properties and namespaces. To write XMP instead, use the -o option with an XMP extension for the output file.

+ +
+
+ +

Processing control

+ +
+ +
-a, --a (-duplicates, --duplicates)
+
+ +

Allow (-a) or suppress (--a) duplicate tag names to be extracted. By default, duplicate tags are suppressed when reading unless the -ee or -X options are used or the Duplicates option is enabled in the configuration file. When writing, this option allows multiple Warning messages to be shown. Duplicate tags are always extracted when copying.

+ +
+
-e (--composite)
+
+ +

Extract existing tags only -- don't generate composite tags.

+ +
+
-ee[NUM] (-extractEmbedded)
+
+ +

Extract information from embedded documents in EPS files, embedded EPS information and JPEG and Jpeg2000 images in PDF files, embedded MPF images in JPEG and MPO files, streaming metadata in AVCHD videos, and the resource fork of Mac OS files. Implies the -a option. Use -g3 or -G3 to identify the originating document for extracted information. Embedded documents containing sub-documents are indicated with dashes in the family 3 group name. (eg. Doc2-3 is the 3rd sub-document of the 2nd embedded document.) Note that this option may increase processing time substantially, especially for PDF files with many embedded images or videos with streaming metadata.

+ +

When used with -ee, the -p option is evaluated for each embedded document as if it were a separate input file. This allows, for example, generation of GPS track logs from timed metadata in videos. See https://exiftool.org/geotag.html#Inverse for examples.

+ +

Setting NUM to 2 causes the H264 video stream in MP4 videos to be parsed until the first Supplemental Enhancement Information (SEI) message is decoded, or 3 to parse the entire H624 stream and decode all SEI information. For M2TS videos, a setting of 3 causes the entire file to be parsed in search of unlisted programs which may contain timed GPS.

+ +
+
-ext[+] EXT, --ext EXT (-extension)
+
+ +

Process only files with (-ext) or without (--ext) a specified extension. There may be multiple -ext and --ext options. A plus sign may be added (ie. -ext+) to add the specified extension to the normally processed files. EXT may begin with a leading '.', which is ignored. Case is not significant. "*" may be used to process files with any extension (or none at all), as in the last three examples:

+ +
    exiftool -ext JPG DIR             # process only JPG files
+    exiftool --ext cr2 --ext dng DIR  # supported files but CR2/DNG
+    exiftool -ext+ txt DIR            # supported files plus TXT
+    exiftool -ext "*" DIR             # process all files
+    exiftool -ext "*" --ext xml DIR   # process all but XML files
+    exiftool -ext "*" --ext . DIR     # all but those with no ext
+ +

Using this option has two main advantages over specifying *.EXT on the command line: 1) It applies to files in subdirectories when combined with the -r option. 2) The -ext option is case-insensitive, which is useful when processing files on case-sensitive filesystems.

+ +

Note that all files specified on the command line will be processed regardless of extension unless the -ext option is used.

+ +
+
-F[OFFSET] (-fixBase)
+
+ +

Fix the base for maker notes offsets. A common problem with some image editors is that offsets in the maker notes are not adjusted properly when the file is modified. This may cause the wrong values to be extracted for some maker note entries when reading the edited file. This option allows an integer OFFSET to be specified for adjusting the maker notes base offset. If no OFFSET is given, ExifTool takes its best guess at the correct base. Note that exiftool will automatically fix the offsets for images which store original offset information (eg. newer Canon models). Offsets are fixed permanently if -F is used when writing EXIF to an image. eg)

+ +
    exiftool -F -exif:resolutionunit=inches image.jpg
+ +
+
-fast[NUM]
+
+ +

Increase speed of extracting information. With -fast (or -fast1), ExifTool will not scan to the end of a JPEG image to check for an AFCP or PreviewImage trailer, or past the first comment in GIF images or the audio/video data in WAV/AVI files to search for additional metadata. These speed benefits are small when reading images directly from disk, but can be substantial if piping images through a network connection. For more substantial speed benefits, -fast2 also causes exiftool to avoid extracting any EXIF MakerNote information. -fast3 avoids extracting metadata from the file, and returns only pseudo System tags, but still reads the file header to obtain an educated guess at FileType. -fast4 doesn't even read the file header, and returns only System tags and a FileType based on the file extension. -fast5 also disables generation of the Composite tags (like -e). Has no effect when writing.

+ +

Note that a separate -fast setting may be used for evaluation of a -if condition, or when ordering files with the -fileOrder option. See the -if and -fileOrder options for details.

+ +
+
-fileOrder[NUM] [-]TAG
+
+ +

Set file processing order according to the sorted value of the specified TAG. For example, to process files in order of date:

+ +
    exiftool -fileOrder DateTimeOriginal DIR
+ +

Additional -fileOrder options may be added for secondary sort keys. Numbers are sorted numerically, and all other values are sorted alphabetically. Files missing the specified tag are sorted last. The sort order may be reversed by prefixing the tag name with a - (eg. -fileOrder -createdate). Print conversion of the sorted values is disabled with the -n option, or a # appended to the tag name. Other formatting options (eg. -d) have no effect on the sorted values. Note that the -fileOrder option can have a large performance impact since it involves an additional processing pass of each file, but this impact may be reduced by specifying a NUM for the -fast level used during the metadata-extraction phase. For example, -fileOrder4 may be used if TAG is a pseudo System tag. If multiple -fileOrder options are used, the extraction is done at the lowest -fast level. Note that files are sorted across directory boundaries if multiple input directories are specified.

+ +
+
-i DIR (-ignore)
+
+ +

Ignore specified directory name. DIR may be either an individual folder name, or a full path. If a full path is specified, it must match the Directory tag exactly to be ignored. Use multiple -i options to ignore more than one directory name. A special DIR value of SYMLINKS (case sensitive) may be specified to avoid recursing into directories which are symbolic links when the -r option is used. As well, a value of HIDDEN (case sensitive) may be used to ignore files with names that start with a "." (ie. hidden files on Unix systems) when scanning a directory.

+ +
+
-if[NUM] EXPR
+
+ +

Specify a condition to be evaluated before processing each FILE. EXPR is a Perl-like logic expression containing tag names prefixed by $ symbols. It is evaluated with the tags from each FILE in turn, and the file is processed only if the expression returns true. Unlike Perl variable names, tag names are not case sensitive and may contain a hyphen. As well, tag names may have a leading group names separated by colons, and/or a trailing # character to disable print conversion. The expression $GROUP:all evaluates to 1 if any tag exists in the specified GROUP, or 0 otherwise (see note 2 below). When multiple -if options are used, all conditions must be satisfied to process the file. Returns an exit status of 2 if all files fail the condition. Below are a few examples:

+ +
    # extract shutterspeed from all Canon images in a directory
+    exiftool -shutterspeed -if '$make eq "Canon"' dir
+
+    # add one hour to all images created on or after Apr. 2, 2006
+    exiftool -alldates+=1 -if '$CreateDate ge "2006:04:02"' dir
+
+    # set EXIF ISO value if possible, unless it is set already
+    exiftool '-exif:iso<iso' -if 'not $exif:iso' dir
+
+    # find images containing a specific keyword (case insensitive)
+    exiftool -if '$keywords =~ /harvey/i' -filename dir
+ +

Adding NUM to the -if option causes a separate processing pass to be executed for evaluating EXPR at a -fast level given by NUM (see the -fast option documentation for details). Without NUM, only one processing pass is done at the level specified by the -fast option. For example, using -if5 is possible if EXPR uses only pseudo System tags, and may significantly speed processing if enough files fail the condition.

+ +

The expression has access to the current ExifTool object through $self, and the following special functions are available to allow short-circuiting of the file processing. Both functions have a return value of 1. Case is significant for function names.

+ +
    End()    - end processing after this file
+    EndDir() - end processing of files in this directory (not
+               compatible with the B<-fileOrder> option)
+ +

Notes:

+ +

1) The -n and -b options also apply to tags used in EXPR.

+ +

2) Some binary data blocks are not extracted unless specified explicitly. These tags are not available for use in the -if condition unless they are also specified on the command line. The alternative is to use the $GROUP:all syntax. (eg. Use $exif:all instead of $exif in EXPR to test for the existence of EXIF tags.)

+ +

3) Tags in the string are interpolated the same way as with -p before the expression is evaluated. In this interpolation, $/ is converted to a newline and $$ represents a single $ symbol (so Perl variables, if used, require a double $).

+ +

4) The condition may only test tags from the file being processed. To process one file based on tags from another, two steps are required. For example, to process XMP sidecar files in directory DIR based on tags from the associated NEF:

+ +
    exiftool -if EXPR -p '$directory/$filename' -ext nef DIR > nef.txt
+    exiftool -@ nef.txt -srcfile %d%f.xmp ...
+ +

5) The -a option has no effect on the evaluation of the expression, and the values of duplicate tags are accessible only by specifying a group name (such as a family 4 instance number, eg. $Copy1:TAG, $Copy2:TAG, etc).

+ +

6) A special "OK" UserParam is available to test the success of the previous command when -execute was used, and may be used like any other tag in the condition (ie. "$OK").

+ +
+
-m (-ignoreMinorErrors)
+
+ +

Ignore minor errors and warnings. This enables writing to files with minor errors and disables some validation checks which could result in minor warnings. Generally, minor errors/warnings indicate a problem which usually won't result in loss of metadata if ignored. However, there are exceptions, so ExifTool leaves it up to you to make the final decision. Minor errors and warnings are indicated by "[minor]" at the start of the message. Warnings which affect processing when ignored are indicated by "[Minor]" (with a capital "M"). Note that this causes missing values in -tagsFromFile, -p and -if strings to be set to an empty string rather than an undefined value.

+ +
+
-o OUTFILE or FMT (-out)
+
+ +

Set the output file or directory name when writing information. Without this option, when any "real" tags are written the original file is renamed to FILE_original and output is written to FILE. When writing only FileName and/or Directory "pseudo" tags, -o causes the file to be copied instead of moved, but directories specified for either of these tags take precedence over that specified by the -o option.

+ +

OUTFILE may be - to write to stdout. The output file name may also be specified using a FMT string in which %d, %f and %e represent the directory, file name and extension of FILE. Also, %c may be used to add a copy number. See the -w option for FMT string examples.

+ +

The output file is taken to be a directory name if it already exists as a directory or if the name ends with '/'. Output directories are created if necessary. Existing files will not be overwritten. Combining the -overwrite_original option with -o causes the original source file to be erased after the output file is successfully written.

+ +

A special feature of this option allows the creation of certain types of files from scratch, or with the metadata from another type of file. The following file types may be created using this technique:

+ +
    XMP, EXIF, EXV, MIE, ICC/ICM, VRD, DR4
+ +

The output file type is determined by the extension of OUTFILE (specified as -.EXT when writing to stdout). The output file is then created from a combination of information in FILE (as if the -tagsFromFile option was used), and tag values assigned on the command line. If no FILE is specified, the output file may be created from scratch using only tags assigned on the command line.

+ +
+
-overwrite_original
+
+ +

Overwrite the original FILE (instead of preserving it by adding _original to the file name) when writing information to an image. Caution: This option should only be used if you already have separate backup copies of your image files. The overwrite is implemented by renaming a temporary file to replace the original. This deletes the original file and replaces it with the edited version in a single operation. When combined with -o, this option causes the original file to be deleted if the output file was successfully written (ie. the file is moved instead of copied).

+ +
+
-overwrite_original_in_place
+
+ +

Similar to -overwrite_original except that an extra step is added to allow the original file attributes to be preserved. For example, on a Mac this causes the original file creation date, type, creator, label color, icon, Finder tags, other extended attributes and hard links to the file to be preserved (but note that the Mac OS resource fork is always preserved unless specifically deleted with -rsrc:all=). This is implemented by opening the original file in update mode and replacing its data with a copy of a temporary file before deleting the temporary. The extra step results in slower performance, so the -overwrite_original option should be used instead unless necessary.

+ +

Note that this option reverts to the behaviour of the -overwrite_original option when also writing the FileName and/or Directory tags.

+ +
+
-P (-preserve)
+
+ +

Preserve the filesystem modification date/time (FileModifyDate) of the original file when writing. Note that some filesystems store a creation date (ie. FileCreateDate on Windows and Mac systems) which is not affected by this option. This creation date is preserved on Windows systems where Win32API::File and Win32::API are available regardless of this setting. For other systems, the -overwrite_original_in_place option may be used if necessary to preserve the creation date. The -P option is superseded by any value written to the FileModifyDate tag.

+ +
+
-password PASSWD
+
+ +

Specify password to allow processing of password-protected PDF documents. If a password is required but not given, a warning is issued and the document is not processed. This option is ignored if a password is not required.

+ +
+
-progress[:[TITLE]]
+
+ +

Show the progress when processing files. Without a colon, the -progress option adds a progress count in brackets after the name of each processed file, giving the current file number and the total number of files to be processed. Implies the -v0 option, causing the names of processed files to also be printed when writing. When combined with the -if option, the total count includes all files before the condition is applied, but files that fail the condition will not have their names printed.

+ +

If followed by a colon (ie. -progress:), the console window title is set according to the specified TITLE string. If no TITLE is given, a default TITLE string of "ExifTool %p%%" is assumed. In the string, %f represents the file name, %p is the progress as a percent, %r is the progress as a ratio, %##b is a progress bar of width "##" (20 characters if "##" is omitted), and %% is a % character. May be combined with the normal -progress option to also show the progress count in console messages. (Note: For this feature to function correctly on Mac/Linux, stderr must go to the console.)

+ +
+
-q (-quiet)
+
+ +

Quiet processing. One -q suppresses normal informational messages, and a second -q suppresses warnings as well. Error messages can not be suppressed, although minor errors may be downgraded to warnings with the -m option, which may then be suppressed with -q -q.

+ +
+
-r[.] (-recurse)
+
+ +

Recursively process files in subdirectories. Only meaningful if FILE is a directory name. Subdirectories with names beginning with "." are not processed unless "." is added to the option name (ie. -r. or -recurse.). By default, exiftool will also follow symbolic links to directories if supported by the system, but this may be disabled with -i SYMLINKS (see the -i option for details). Combine this with -ext options to control the types of files processed.

+ +
+
-scanForXMP
+
+ +

Scan all files (even unsupported formats) for XMP information unless found already. When combined with the -fast option, only unsupported file types are scanned. Warning: It can be time consuming to scan large files.

+ +
+
-u (-unknown)
+
+ +

Extract values of unknown tags. Add another -u to also extract unknown information from binary data blocks. This option applies to tags with numerical tag ID's, and causes tag names like "Exif_0xc5d9" to be generated for unknown information. It has no effect on information types which have human-readable tag ID's (such as XMP), since unknown tags are extracted automatically from these formats.

+ +
+
-U (-unknown2)
+
+ +

Extract values of unknown tags as well as unknown information from some binary data blocks. This is the same as two -u options.

+ +
+
-wm MODE (-writeMode)
+
+ +

Set mode for writing/creating tags. MODE is a string of one or more characters from the list below. The default write mode is wcg.

+ +
    w - Write existing tags
+    c - Create new tags
+    g - create new Groups as necessary
+ +

For example, use -wm cg to only create new tags (and avoid editing existing ones).

+ +

The level of the group is the SubDirectory level in the metadata structure. For XMP or IPTC this is the full XMP/IPTC block (the family 0 group), but for EXIF this is the individual IFD (the family 1 group).

+ +
+
-z (-zip)
+
+ +

When reading, causes information to be extracted from .gz and .bz2 compressed images (only one image per archive; requires gzip and bzip2 to be available). When writing, causes compressed information to be written if supported by the metadata format (eg. compressed textual metadata in PNG), disables the recommended padding in embedded XMP (saving 2424 bytes when writing XMP in a file), and writes XMP in shorthand format -- the equivalent of setting the API Compress=1 and Compact="NoPadding,Shorthand".

+ +
+
+ +

Other options

+ +
+ +
-@ ARGFILE
+
+ +

Read command-line arguments from the specified file. The file contains one argument per line (NOT one option per line -- some options require additional arguments, and all arguments must be placed on separate lines). Blank lines and lines beginning with # are ignored (unless they start with #[CSTR], in which case the rest of the line is treated as a C string, allowing standard C escape sequences such as "\n" for a newline). White space at the start of a line is removed. Normal shell processing of arguments is not performed, which among other things means that arguments should not be quoted and spaces are treated as any other character. ARGFILE may exist relative to either the current directory or the exiftool directory unless an absolute pathname is given.

+ +

For example, the following ARGFILE will set the value of Copyright to "Copyright YYYY, Phil Harvey", where "YYYY" is the year of CreateDate:

+ +
    -d
+    %Y
+    -copyright<Copyright $createdate, Phil Harvey
+ +

Arguments in ARGFILE behave exactly the same as if they were entered at the location of the -@ option on the command line, with the exception that the -config and -common_args options may not be used in an ARGFILE.

+ +
+
-k (-pause)
+
+ +

Pause with the message -- press any key -- or -- press RETURN -- (depending on your system) before terminating. This option is used to prevent the command window from closing when run as a Windows drag and drop application.

+ +
+
-list, -listw, -listf, -listr, -listwf, -listg[NUM], -listd, -listx
+
+ +

Print a list of all valid tag names (-list), all writable tag names (-listw), all supported file extensions (-listf), all recognized file extensions (-listr), all writable file extensions (-listwf), all tag groups [in a specified family] (-listg[NUM]), all deletable tag groups (-listd), or an XML database of tag details including language translations (-listx). The -list, -listw and -listx options may be followed by an additional argument of the form -GROUP:All to list only tags in a specific group, where GROUP is one or more family 0-2 group names (excepting EXIF IFD groups) separated by colons. With -listg, NUM may be given to specify the group family, otherwise family 0 is assumed. The -l option may be combined with -listf, -listr or -listwf to add file descriptions to the list. The -lang option may be combined with -listx to output descriptions in a single language. Here are some examples:

+ +
    -list               # list all tag names
+    -list -EXIF:All     # list all EXIF tags
+    -list -xmp:time:all # list all XMP tags relating to time
+    -listw -XMP-dc:All  # list all writable XMP-dc tags
+    -listf              # list all supported file extensions
+    -listr              # list all recognized file extensions
+    -listwf             # list all writable file extensions
+    -listg1             # list all groups in family 1
+    -listd              # list all deletable groups
+    -listx -EXIF:All    # list database of EXIF tags in XML format
+    -listx -XMP:All -s  # list short XML database of XMP tags
+ +

When combined with -listx, the -s option shortens the output by omitting the descriptions and values (as in the last example above), and -f adds a 'flags' attribute if applicable. The flags are formatted as a comma-separated list of the following possible values: Avoid, Binary, List, Mandatory, Permanent, Protected, Unknown and Unsafe (see the Tag Name documentation). For XMP List tags, the list type (Alt, Bag or Seq) is added to the flags, and flattened structure tags are indicated by a Flattened flag.

+ +

Note that none of the -list options require an input FILE.

+ +
+
-ver
+
+ +

Print exiftool version number. The -v option may be added to print addition system information (see the README file of the full distribution for more details about optional libraries), or -v2 to also list the Perl include directories.

+ +
+
--
+
+ +

Indicates the end of options. Any remaining arguments are treated as file names, even if they begin with a dash (-).

+ +
+
+ +

Special features

+ +
+ +
-geotag TRKFILE
+
+ +

Geotag images from the specified GPS track log file. Using the -geotag option is equivalent to writing a value to the Geotag tag. The GPS position is interpolated from the track at a time specified by the value written to the Geotime tag. If Geotime is not specified, the value is copied from DateTimeOriginal# (the # is added to copy the unformatted value, avoiding potential conflicts with the -d option). For example, the following two commands are equivalent:

+ +
    exiftool -geotag trk.log image.jpg
+    exiftool -geotag trk.log "-Geotime<DateTimeOriginal#" image.jpg
+ +

When the Geotime value is converted to UTC, the local system timezone is assumed unless the date/time value contains a timezone. Writing Geotime causes the following tags to be written (provided they can be calculated from the track log, and they are supported by the destination metadata format): GPSLatitude, GPSLatitudeRef, GPSLongitude, GPSLongitudeRef, GPSAltitude, GPSAltitudeRef, GPSDateStamp, GPSTimeStamp, GPSDateTime, GPSTrack, GPSTrackRef, GPSSpeed, GPSSpeedRef, GPSImgDirection, GPSImgDirectionRef, GPSPitch, GPSRoll, AmbientTemperature and CameraElevationAngle. By default, tags are created in EXIF, and updated in XMP only if they already exist. However, EXIF:Geotime or XMP:Geotime may be specified to write only EXIF or XMP tags respectively. Note that GPSPitch and GPSRoll are non-standard, and require user-defined tags in order to be written.

+ +

The Geosync tag may be used to specify a time correction which is applied to each Geotime value for synchronization with GPS time. For example, the following command compensates for image times which are 1 minute and 20 seconds behind GPS:

+ +
    exiftool -geosync=+1:20 -geotag a.log DIR
+ +

Advanced Geosync features allow a linear time drift correction and synchronization from previously geotagged images. See "geotag.html" in the full ExifTool distribution for more information.

+ +

Multiple -geotag options may be used to concatenate GPS track log data. Also, a single -geotag option may be used to load multiple track log files by using wildcards in the TRKFILE name, but note that in this case TRKFILE must be quoted on most systems (with the notable exception of Windows) to prevent filename expansion. For example:

+ +
    exiftool -geotag "TRACKDIR/*.log" IMAGEDIR
+ +

Currently supported track file formats are GPX, NMEA RMC/GGA/GLL, KML, IGC, Garmin XML and TCX, Magellan PMGNTRK, Honeywell PTNTHPR, Bramor gEO, Winplus Beacon TXT, and GPS/IMU CSV files. See "GEOTAGGING EXAMPLES" for examples. Also see "geotag.html" in the full ExifTool distribution and the Image::ExifTool Options for more details and for information about geotag configuration options.

+ +
+
-globalTimeShift SHIFT
+
+ +

Shift all formatted date/time values by the specified amount when reading. Does not apply to unformatted (-n) output. SHIFT takes the same form as the date/time shift when writing (see Image::ExifTool::Shift.pl for details), with a negative shift being indicated with a minus sign (-) at the start of the SHIFT string. For example:

+ +
    # return all date/times, shifted back by 1 hour
+    exiftool -globalTimeShift -1 -time:all a.jpg
+
+    # set the file name from the shifted CreateDate (-1 day) for
+    # all images in a directory
+    exiftool "-filename<createdate" -globaltimeshift "-0:0:1 0:0:0" \
+        -d %Y%m%d-%H%M%S.%%e dir
+ +
+
-use MODULE
+
+ +

Add features from specified plug-in MODULE. Currently, the MWG module is the only plug-in module distributed with exiftool. This module adds read/write support for tags as recommended by the Metadata Working Group. As a convenience, -use MWG is assumed if the MWG group is specified for any tag on the command line. See the MWG Tags documentation for more details. Note that this option is not reversible, and remains in effect until the application terminates, even across the -execute option.

+ +
+
+ +

Utilities

+ +
+ +
-restore_original
+
+ +
+
-delete_original[!]
+
+ +

These utility options automate the maintenance of the _original files created by exiftool. They have no effect on files without an _original copy. The -restore_original option restores the specified files from their original copies by renaming the _original files to replace the edited versions. For example, the following command restores the originals of all JPG images in directory DIR:

+ +
    exiftool -restore_original -ext jpg DIR
+ +

The -delete_original option deletes the _original copies of all files specified on the command line. Without a trailing ! this option prompts for confirmation before continuing. For example, the following command deletes a.jpg_original if it exists, after asking "Are you sure?":

+ +
    exiftool -delete_original a.jpg
+ +

These options may not be used with other options to read or write tag values in the same command, but may be combined with options such -ext, -if, -r, -q and -v.

+ +
+
+ +

Advanced options

+ +

Among other things, the advanced options allow complex processing to be performed from a single command without the need for additional scripting. This may be particularly useful for implementations such as Windows drag-and-drop applications. These options may also be used to improve performance in multi-pass processing by reducing the overhead required to load exiftool for each invocation.

+ +
+ +
-api OPT[[^]=[VAL]]
+
+ +

Set ExifTool API option. OPT is an API option name. The option value is set to 1 if =VAL is omitted. If VAL is omitted, the option value is set to undef if = is used, or an empty string with ^=. See Image::ExifTool Options for a list of available API options. This overrides API options set via the config file.

+ +
+
-common_args
+
+ +

Specifies that all arguments following this option are common to all executed commands when -execute is used. This and the -config option are the only options that may not be used inside a -@ ARGFILE. Note that by definition this option and its arguments MUST come after all other options on the command line.

+ +
+
-config CFGFILE
+
+ +

Load specified configuration file instead of the default ".ExifTool_config". If used, this option must come before all other arguments on the command line and applies to all -execute'd commands. The CFGFILE must exist relative to the current working directory or the exiftool application directory unless an absolute path is specified. Loading of the default config file may be disabled by setting CFGFILE to an empty string (ie. ""). See https://exiftool.org/config.html and config_files/example.config in the full ExifTool distribution for details about the configuration file syntax.

+ +
+
-echo[NUM] TEXT
+
+ +

Echo TEXT to stdout (-echo or -echo1) or stderr (-echo2). Text is output as the command line is parsed, before the processing of any input files. NUM may also be 3 or 4 to output text (to stdout or stderr respectively) after processing is complete. For -echo3 and -echo4, "${status}" may be used in the TEXT string to represent the numerical exit status of the command (see "EXIT STATUS").

+ +
+
-efile[NUM][!] ERRFILE
+
+ +

Save the names of files giving errors (NUM missing or 1), files that were unchanged (NUM is 2), files that fail the -if condition (NUM is 4), or any combination thereof by summing NUM (eg. -efile3 is the same has having both -efile and -efile2 options with the same ERRFILE). By default, file names are appended to any existing ERRFILE, but ERRFILE is overwritten if an exclamation point is added to the option (eg. -efile!). Saves the name of the file specified by the -srcfile option if applicable.

+ +
+
-execute[NUM]
+
+ +

Execute command for all arguments up to this point on the command line (plus any arguments specified by -common_args). The result is as if the commands were executed as separate command lines (with the exception of the -config and -use options which remain in effect for subsequent commands). Allows multiple commands to be executed from a single command line. NUM is an optional number that is echoed in the "{ready}" message when using the -stay_open feature. If a NUM is specified, the -q option no longer suppresses the output "{readyNUM}" message.

+ +
+
-list_dir
+
+ +

List directories themselves instead of their contents. This option effectively causes directories to be treated as normal files when reading and writing. For example, with this option the output of the ls -la command on Mac/Linux may be approximated by this exiftool command:

+ +
    exiftool -list_dir -T -ls-l -api systemtags -fast5 .* *
+ +

(The -T option formats the output in tab-separated columns, -ls-l is a shortcut tag, the API SystemTags option is required to extract some necessary tags, and the -fast5 option is added for speed since only system tags are being extracted.)

+ +
+
-srcfile FMT
+
+ +

Specify a different source file to be processed based on the name of the original FILE. This may be useful in some special situations for processing related preview images or sidecar files. See the -w option for a description of the FMT syntax. Note that file name FMT strings for all options are based on the original FILE specified from the command line, not the name of the source file specified by -srcfile.

+ +

For example, to copy metadata from NEF files to the corresponding JPG previews in a directory where other JPG images may exist:

+ +
    exiftool -ext nef -tagsfromfile @ -srcfile %d%f.jpg dir
+ +

If more than one -srcfile option is specified, the files are tested in order and the first existing source file is processed. If none of the source files already exist, then exiftool uses the first -srcfile specified.

+ +

A FMT of @ may be used to represent the original FILE, which may be useful when specifying multiple -srcfile options (eg. to fall back to processing the original FILE if no sidecar exists).

+ +

When this option is used, two special UserParam tags (OriginalFileName and OriginalDirectory) are generated to allow access to the original FILE name and directory.

+ +
+
-stay_open FLAG
+
+ +

If FLAG is 1 or True (case insensitive), causes exiftool keep reading from the -@ ARGFILE even after reaching the end of file. This feature allows calling applications to pre-load exiftool, thus avoiding the overhead of loading exiftool for each command. The procedure is as follows:

+ +

1) Execute exiftool -stay_open True -@ ARGFILE, where ARGFILE is the name of an existing (possibly empty) argument file or - to pipe arguments from the standard input.

+ +

2) Write exiftool command-line arguments to ARGFILE, one argument per line (see the -@ option for details).

+ +

3) Write -execute\n to ARGFILE, where \n represents a newline sequence. (Note: You may need to flush your write buffers here if using buffered output.) ExifTool will then execute the command with the arguments received up to this point, send a "{ready}" message to stdout when done (unless the -q or -T option is used), and continue trying to read arguments for the next command from ARGFILE. To aid in command/response synchronization, any number appended to the -execute option is echoed in the "{ready}" message. For example, -execute613 results in "{ready613}". When this number is added, -q no longer suppresses the "{ready}" message. (Also, see the -echo3 and -echo4 options for additional ways to pass signals back to your application.)

+ +

4) Repeat steps 2 and 3 for each command.

+ +

5) Write -stay_open\nFalse\n (or -stay_open\n0\n) to ARGFILE when done. This will cause exiftool to process any remaining command-line arguments then exit normally.

+ +

The input ARGFILE may be changed at any time before step 5 above by writing the following lines to the currently open ARGFILE:

+ +
    -stay_open
+    True
+    -@
+    NEWARGFILE
+ +

This causes ARGFILE to be closed, and NEWARGFILE to be kept open. (Without the -stay_open here, exiftool would have returned to reading arguments from ARGFILE after reaching the end of NEWARGFILE.)

+ +

Note: When writing arguments to a disk file there is a delay of up to 0.01 seconds after writing -execute\n before exiftool starts processing the command. This delay may be avoided by sending a CONT signal to the exiftool process immediately after writing -execute\n. (There is no associated delay when writing arguments via a pipe with -@ -, so the signal is not necessary when using this technique.)

+ +
+
-userParam PARAM[[^]=[VAL]]
+
+ +

Set user parameter. PARAM is an arbitrary user parameter name. This is an interface to the API UserParam option (see the Image::ExifTool Options documentation), and provides a method to access user-defined parameters in arguments to the -if and -p options as if they were any other tag. Appending a hash tag (#) to PARAM (eg. -userParam MyTag#=yes) also causes the parameter to be extracted as a normal tag in the UserParam group. Similar to the -api option, the parameter value is set to 1 if =VAL is omitted, undef if just VAL is omitted with =, or an empty string if VAL is omitted with ^=.

+ +
    exiftool -p '$test from $filename' -userparam test=Hello FILE
+ +
+
+ +

Advanced formatting feature

+ +

An advanced formatting feature allows modification of the value of any tag interpolated within a -if or -p option argument, or a -tagsFromFile redirection string. Tag names within these strings are prefixed by a $ symbol, and an arbitrary Perl expression may be applied to the tag value by placing braces around the tag name and inserting the expression after the name, separated by a semicolon (ie. ${TAG;EXPR}). The expression acts on the value of the tag through the default input variable ($_), and has access to the full ExifTool API through the current ExifTool object ($self) and the tag key ($tag). It may contain any valid Perl code, including translation (tr///) and substitution (s///) operations, but note that braces within the expression must be balanced. The example below prints the camera Make with spaces translated to underlines, and multiple consecutive underlines replaced by a single underline:

+ +
    exiftool -p '${make;tr/ /_/;s/__+/_/g}' image.jpg
+ +

An @ may be added after the tag name to make the expression act on individual list items for list-type tags, simplifying list processing. Set $_ to undef to remove an item from the list. As an example, the following command returns all subjects not containing the string "xxx":

+ +
    exiftool -p '${subject@;$_=undef if /xxx/}' image.jpg
+ +

A default expression of tr(/\\?*:|"<>\0)()d is assumed if the expression is empty (ie. ${TAG;}). This removes the characters / \ ? * : | < > and null from the printed value. (These characters are illegal in Windows file names, so this feature is useful if tag values are used in file names.)

+ +

Helper functions

+ +

DateFmt

+ +

Simplifies reformatting of individual date/time values. This function acts on a standard EXIF-formatted date/time value in $_ and formats it according to the specified format string (see the -d option). To avoid trying to reformat an already-formatted date/time value, a # must be added to the tag name (as in the example below) if the -d option is also used. For example:

+ +
    exiftool -p '${createdate#;DateFmt("%Y-%m-%d_%H%M%S")}' a.jpg
+ +

ShiftTime

+ +

Shifts EXIF-formatted date/time string by a specified amount. Start with a leading minus sign to shift backwards in time. See Image::ExifTool::Shift.pl for details about shift syntax. For example, to shift a date/time value back by one year:

+ +
    exiftool -p '${createdate;ShiftTime("-1:0:0 0")}' a.jpg
+ +

NoDups

+ +

Removes duplicate items from a list with a separator specified by the -sep option. This function is most useful when copying list-type tags. For example, the following command may be used to remove duplicate Keywords:

+ +
    exiftool -sep '##' '-keywords<${keywords;NoDups}' a.jpg
+ +

The -sep option is necessary to split the string back into individual list items when writing to a list-type tag.

+ +

An optional flag argument may be set to 1 to cause NoDups to set $_ to undef if no duplicates existed, thus preventing the file from being rewritten unnecessarily:

+ +
    exiftool -sep '##' '-keywords<${keywords;NoDups(1)}' a.jpg
+ +

Note that function names are case sensitive.

+ +

WINDOWS UNICODE FILE NAMES

+ +

In Windows, command-line arguments are specified using the current code page and are recoded automatically to the system code page. This recoding is not done for arguments in ExifTool arg files, so by default filenames in arg files use the system code page. Unfortunately, these code pages are not complete character sets, so not all file names may be represented.

+ +

ExifTool 9.79 and later allow the file name encoding to be specified with -charset filename=CHARSET, where CHARSET is the name of a valid ExifTool character set, preferably UTF8 (see the -charset option for a complete list). Setting this triggers the use of Windows wide-character i/o routines, thus providing support for most Unicode file names (see note 4). But note that it is not trivial to pass properly encoded file names on the Windows command line (see https://exiftool.org/faq.html#Q18 for details), so placing them in a UTF-8 encoded -@ argfile and using -charset filename=utf8 is recommended if possible.

+ +

A warning is issued if a specified filename contains special characters and the filename character set was not provided. However, the warning may be disabled by setting -charset filename="", and ExifTool may still function correctly if the system code page matches the character set used for the file names.

+ +

When a directory name is provided, the file name encoding need not be specified (unless the directory name contains special characters), and ExifTool will automatically use wide-character routines to scan the directory.

+ +

The filename character set applies to the FILE arguments as well as filename arguments of -@, -geotag, -o, -p, -srcfile, -tagsFromFile, -csv=, -j= and -TAG<=. However, it does not apply to the -config filename, which always uses the system character set. The -charset filename= option must come before the -@ option to be effective, but the order doesn't matter with respect to other options.

+ +

Notes:

+ +

1) FileName and Directory tag values still use the same encoding as other tag values, and are converted to/from the filename character set when writing/reading if specified.

+ +

2) Unicode support is not yet implemented for other Windows-based systems like Cygwin.

+ +

3) See "WRITING READ-ONLY FILES" below for a note about editing read-only files with Unicode names.

+ +

4) Unicode file names with surrogate pairs (code points over U+FFFF) still cause problems.

+ +

WRITING READ-ONLY FILES

+ +

In general, ExifTool may be used to write metadata to read-only files provided that the user has write permission in the directory. However, there are three cases where file write permission is also required:

+ +

1) When using the -overwrite_original_in_place option.

+ +

2) When writing only pseudo System tags (eg. FileModifyDate).

+ +

3) On Windows if the file has Unicode characters in its name, and a) the -overwrite_original option is used, or b) the _original backup already exists.

+ +

Hidden files in Windows behave as read-only files when attempting to write any real tags to the file -- an error is generated when using the -overwrite_original_in_place, otherwise writing should be successful and the hidden attribute will be removed. But the -if option may be used to avoid processing hidden files (provided Win32API::File is available):

+ +
    exiftool -if "$fileattributes !~ /Hidden/" ...
+ +

READING EXAMPLES

+ +

Note: Beware when cutting and pasting these examples into your terminal! Some characters such as single and double quotes and hyphens may have been changed into similar-looking yet functionally-different characters by the text formatter used to display this documentation. Also note that Windows users must use double quotes instead of single quotes as below around arguments containing special characters.

+ +
+ +
exiftool -a -u -g1 a.jpg
+
+ +

Print all meta information in an image, including duplicate and unknown tags, sorted by group (for family 1). For performance reasons, this command may not extract all available metadata. (Metadata in embedded documents, metadata extracted by external utilities, and metadata requiring excessive processing time may not be extracted). Add -ee3 and -api RequestAll=3 to the command to extract absolutely everything available.

+ +
+
exiftool -common dir
+
+ +

Print common meta information for all images in dir. -common is a shortcut tag representing common EXIF meta information.

+ +
+
exiftool -T -createdate -aperture -shutterspeed -iso dir > out.txt
+
+ +

List specified meta information in tab-delimited column form for all images in dir to an output text file named "out.txt".

+ +
+
exiftool -s -ImageSize -ExposureTime b.jpg
+
+ +

Print ImageSize and ExposureTime tag names and values.

+ +
+
exiftool -l -canon c.jpg d.jpg
+
+ +

Print standard Canon information from two image files.

+ +
+
exiftool -r -w .txt -common pictures
+
+ +

Recursively extract common meta information from files in pictures directory, writing text output to .txt files with the same names.

+ +
+
exiftool -b -ThumbnailImage image.jpg > thumbnail.jpg
+
+ +

Save thumbnail image from image.jpg to a file called thumbnail.jpg.

+ +
+
exiftool -b -JpgFromRaw -w _JFR.JPG -ext NEF -r .
+
+ +

Recursively extract JPG image from all Nikon NEF files in the current directory, adding _JFR.JPG for the name of the output JPG files.

+ +
+
exiftool -a -b -W %d%f_%t%-c.%s -preview:all dir
+
+ +

Extract all types of preview images (ThumbnailImage, PreviewImage, JpgFromRaw, etc.) from files in directory "dir", adding the tag name to the output preview image file names.

+ +
+
exiftool -d '%r %a, %B %e, %Y' -DateTimeOriginal -S -s -ext jpg .
+
+ +

Print formatted date/time for all JPG files in the current directory.

+ +
+
exiftool -IFD1:XResolution -IFD1:YResolution image.jpg
+
+ +

Extract image resolution from EXIF IFD1 information (thumbnail image IFD).

+ +
+
exiftool '-*resolution*' image.jpg
+
+ +

Extract all tags with names containing the word "Resolution" from an image.

+ +
+
exiftool -xmp:author:all -a image.jpg
+
+ +

Extract all author-related XMP information from an image.

+ +
+
exiftool -xmp -b a.jpg > out.xmp
+
+ +

Extract complete XMP data record intact from a.jpg and write it to out.xmp using the special XMP tag (see the Extra tags in Image::ExifTool::TagNames).

+ +
+
exiftool -p '$filename has date $dateTimeOriginal' -q -f dir
+
+ +

Print one line of output containing the file name and DateTimeOriginal for each image in directory dir.

+ +
+
exiftool -ee3 -p '$gpslatitude, $gpslongitude, $gpstimestamp' a.m2ts
+
+ +

Extract all GPS positions from an AVCHD video.

+ +
+
exiftool -icc_profile -b -w icc image.jpg
+
+ +

Save complete ICC_Profile from an image to an output file with the same name and an extension of .icc.

+ +
+
exiftool -htmldump -w tmp/%f_%e.html t/images
+
+ +

Generate HTML pages from a hex dump of EXIF information in all images from the t/images directory. The output HTML files are written to the tmp directory (which is created if it didn't exist), with names of the form 'FILENAME_EXT.html'.

+ +
+
exiftool -a -b -ee -embeddedimage -W Image_%.3g3.%s file.pdf
+
+ +

Extract embedded JPG and JP2 images from a PDF file. The output images will have file names like "Image_#.jpg" or "Image_#.jp2", where "#" is the ExifTool family 3 embedded document number for the image.

+ +
+
+ +

WRITING EXAMPLES

+ +

Note that quotes are necessary around arguments which contain certain special characters such as >, < or any white space. These quoting techniques are shell dependent, but the examples below will work for most Unix shells. With the Windows cmd shell however, double quotes should be used (eg. -Comment="This is a new comment").

+ +
+ +
exiftool -Comment='This is a new comment' dst.jpg
+
+ +

Write new comment to a JPG image (replaces any existing comment).

+ +
+
exiftool -comment= -o newdir -ext jpg .
+
+ +

Remove comment from all JPG images in the current directory, writing the modified images to a new directory.

+ +
+
exiftool -keywords=EXIF -keywords=editor dst.jpg
+
+ +

Replace existing keyword list with two new keywords (EXIF and editor).

+ +
+
exiftool -Keywords+=word -o newfile.jpg src.jpg
+
+ +

Copy a source image to a new file, and add a keyword (word) to the current list of keywords.

+ +
+
exiftool -exposurecompensation+=-0.5 a.jpg
+
+ +

Decrement the value of ExposureCompensation by 0.5 EV. Note that += with a negative value is used for decrementing because the -= operator is used for conditional deletion (see next example).

+ +
+
exiftool -credit-=xxx dir
+
+ +

Delete Credit information from all files in a directory where the Credit value was xxx.

+ +
+
exiftool -xmp:description-de='k&uuml;hl' -E dst.jpg
+
+ +

Write alternate language for XMP:Description, using HTML character escaping to input special characters.

+ +
+
exiftool -all= dst.jpg
+
+ +

Delete all meta information from an image. Note: You should NOT do this to RAW images (except DNG) since proprietary RAW image formats often contain information in the makernotes that is necessary for converting the image.

+ +
+
exiftool -all= -comment='lonely' dst.jpg
+
+ +

Delete all meta information from an image and add a comment back in. (Note that the order is important: -comment='lonely' -all= would also delete the new comment.)

+ +
+
exiftool -all= --jfif:all dst.jpg
+
+ +

Delete all meta information except JFIF group from an image.

+ +
+
exiftool -Photoshop:All= dst.jpg
+
+ +

Delete Photoshop meta information from an image (note that the Photoshop information also includes IPTC).

+ +
+
exiftool -r -XMP-crss:all= DIR
+
+ +

Recursively delete all XMP-crss information from images in a directory.

+ +
+
exiftool '-ThumbnailImage<=thumb.jpg' dst.jpg
+
+ +

Set the thumbnail image from specified file (Note: The quotes are necessary to prevent shell redirection).

+ +
+
exiftool '-JpgFromRaw<=%d%f_JFR.JPG' -ext NEF -r .
+
+ +

Recursively write JPEG images with filenames ending in _JFR.JPG to the JpgFromRaw tag of like-named files with extension .NEF in the current directory. (This is the inverse of the -JpgFromRaw command of the "READING EXAMPLES" section above.)

+ +
+
exiftool -DateTimeOriginal-='0:0:0 1:30:0' dir
+
+ +

Adjust original date/time of all images in directory dir by subtracting one hour and 30 minutes. (This is equivalent to -DateTimeOriginal-=1.5. See Image::ExifTool::Shift.pl for details.)

+ +
+
exiftool -createdate+=3 -modifydate+=3 a.jpg b.jpg
+
+ +

Add 3 hours to the CreateDate and ModifyDate timestamps of two images.

+ +
+
exiftool -AllDates+=1:30 -if '$make eq "Canon"' dir
+
+ +

Shift the values of DateTimeOriginal, CreateDate and ModifyDate forward by 1 hour and 30 minutes for all Canon images in a directory. (The AllDates tag is provided as a shortcut for these three tags, allowing them to be accessed via a single tag.)

+ +
+
exiftool -xmp:city=Kingston image1.jpg image2.nef
+
+ +

Write a tag to the XMP group of two images. (Without the xmp: this tag would get written to the IPTC group since City exists in both, and IPTC is preferred by default.)

+ +
+
exiftool -LightSource-='Unknown (0)' dst.tiff
+
+ +

Delete LightSource tag only if it is unknown with a value of 0.

+ +
+
exiftool -whitebalance-=auto -WhiteBalance=tung dst.jpg
+
+ +

Set WhiteBalance to Tungsten only if it was previously Auto.

+ +
+
exiftool -comment-= -comment='new comment' a.jpg
+
+ +

Write a new comment only if the image doesn't have one already.

+ +
+
exiftool -o %d%f.xmp dir
+
+ +

Create XMP meta information data files for all images in dir.

+ +
+
exiftool -o test.xmp -owner=Phil -title='XMP File'
+
+ +

Create an XMP data file only from tags defined on the command line.

+ +
+
exiftool '-ICC_Profile<=%d%f.icc' image.jpg
+
+ +

Write ICC_Profile to an image from a .icc file of the same name.

+ +
+
exiftool -hierarchicalkeywords='{keyword=one,children={keyword=B}}'
+
+ +

Write structured XMP information. See https://exiftool.org/struct.html for more details.

+ +
+
exiftool -trailer:all= image.jpg
+
+ +

Delete any trailer found after the end of image (EOI) in a JPEG file. A number of digital cameras store a large PreviewImage after the JPEG EOI, and the file size may be reduced significantly by deleting this trailer. See the JPEG Tags documentation for a list of recognized JPEG trailers.

+ +
+
+ +

COPYING EXAMPLES

+ +

These examples demonstrate the ability to copy tag values between files.

+ +
+ +
exiftool -tagsFromFile src.cr2 dst.jpg
+
+ +

Copy the values of all writable tags from src.cr2 to dst.jpg, writing the information to same-named tags in the preferred groups.

+ +
+
exiftool -TagsFromFile src.jpg -all:all dst.jpg
+
+ +

Copy the values of all writable tags from src.jpg to dst.jpg, preserving the original tag groups.

+ +
+
exiftool -all= -tagsfromfile src.jpg -exif:all dst.jpg
+
+ +

Erase all meta information from dst.jpg image, then copy EXIF tags from src.jpg.

+ +
+
exiftool -exif:all= -tagsfromfile @ -all:all -unsafe bad.jpg
+
+ +

Rebuild all EXIF meta information from scratch in an image. This technique can be used in JPEG images to repair corrupted EXIF information which otherwise could not be written due to errors. The Unsafe tag is a shortcut for unsafe EXIF tags in JPEG images which are not normally copied. See the tag name documentation for more details about unsafe tags.

+ +
+
exiftool -Tagsfromfile a.jpg out.xmp
+
+ +

Copy meta information from a.jpg to an XMP data file. If the XMP data file out.xmp already exists, it will be updated with the new information. Otherwise the XMP data file will be created. Only metadata-only files may be created like this (files containing images may be edited but not created). See "WRITING EXAMPLES" above for another technique to generate XMP files.

+ +
+
exiftool -tagsFromFile a.jpg -XMP:All= -ThumbnailImage= -m b.jpg
+
+ +

Copy all meta information from a.jpg to b.jpg, deleting all XMP information and the thumbnail image from the destination.

+ +
+
exiftool -TagsFromFile src.jpg -title -author=Phil dst.jpg
+
+ +

Copy title from one image to another and set a new author name.

+ +
+
exiftool -TagsFromFile a.jpg -ISO -TagsFromFile b.jpg -comment dst.jpg
+
+ +

Copy ISO from one image and Comment from another image to a destination image.

+ +
+
exiftool -tagsfromfile src.jpg -exif:all --subifd:all dst.jpg
+
+ +

Copy only the EXIF information from one image to another, excluding SubIFD tags.

+ +
+
exiftool '-FileModifyDate<DateTimeOriginal' dir
+
+ +

Use the original date from the meta information to set the same file's filesystem modification date for all images in a directory. (Note that -TagsFromFile @ is assumed if no other -TagsFromFile is specified when redirecting information as in this example.)

+ +
+
exiftool -TagsFromFile src.jpg '-xmp:all<all' dst.jpg
+
+ +

Copy all possible information from src.jpg and write in XMP format to dst.jpg.

+ +
+
exiftool '-Description<${FileName;s/\.[^.]*$//}' dir
+
+ +

Set the image Description from the file name after removing the extension. This example uses the "Advanced formatting feature" to perform a substitution operation to remove the last dot and subsequent characters from the file name.

+ +
+
exiftool -@ iptc2xmp.args -iptc:all= a.jpg
+
+ +

Translate IPTC information to XMP with appropriate tag name conversions, and delete the original IPTC information from an image. This example uses iptc2xmp.args, which is a file included with the ExifTool distribution that contains the required arguments to convert IPTC information to XMP format. Also included with the distribution are xmp2iptc.args (which performs the inverse conversion) and a few more .args files for other conversions between EXIF, IPTC and XMP.

+ +
+
exiftool -tagsfromfile %d%f.CR2 -r -ext JPG dir
+
+ +

Recursively rewrite all JPG images in dir with information copied from the corresponding CR2 images in the same directories.

+ +
+
exiftool '-keywords+<make' image.jpg
+
+ +

Add camera make to list of keywords.

+ +
+
exiftool '-comment<ISO=$exif:iso Exposure=${shutterspeed}' dir
+
+ +

Set the Comment tag of all images in dir from the values of the EXIF:ISO and ShutterSpeed tags. The resulting comment will be in the form "ISO=100 Exposure=1/60".

+ +
+
exiftool -TagsFromFile src.jpg -icc_profile dst.jpg
+
+ +

Copy ICC_Profile from one image to another.

+ +
+
exiftool -TagsFromFile src.jpg -all:all dst.mie
+
+ +

Copy all meta information in its original form from a JPEG image to a MIE file. The MIE file will be created if it doesn't exist. This technique can be used to store the metadata of an image so it can be inserted back into the image (with the inverse command) later in a workflow.

+ +
+
exiftool -o dst.mie -all:all src.jpg
+
+ +

This command performs exactly the same task as the command above, except that the -o option will not write to an output file that already exists.

+ +
+
exiftool -b -jpgfromraw -w %d%f_%ue.jpg -execute -b -previewimage -w %d%f_%ue.jpg -execute -tagsfromfile @ -srcfile %d%f_%ue.jpg -overwrite_original -common_args --ext jpg DIR
+
+ +

[Advanced] Extract JpgFromRaw or PreviewImage from all but JPG files in DIR, saving them with file names like image_EXT.jpg, then add all meta information from the original files to the extracted images. Here, the command line is broken into three sections (separated by -execute options), and each is executed as if it were a separate command. The -common_args option causes the --ext jpg DIR arguments to be applied to all three commands, and the -srcfile option allows the extracted JPG image to be the source file for the third command (whereas the RAW files are the source files for the other two commands).

+ +
+
+ +

RENAMING EXAMPLES

+ +

By writing the FileName and Directory tags, files are renamed and/or moved to new directories. This can be particularly useful and powerful for organizing files by date when combined with the -d option. New directories are created as necessary, but existing files will not be overwritten. The format codes %d, %f and %e may be used in the new file name to represent the directory, name and extension of the original file, and %c may be used to add a copy number if the file already exists (see the -w option for details). Note that if used within a date format string, an extra '%' must be added to pass these codes through the date/time parser. (And further note that in a Windows batch file, all '%' characters must also be escaped, so in this extreme case '%%%%f' is necessary to pass a simple '%f' through the two levels of parsing.) See https://exiftool.org/filename.html for additional documentation and examples.

+ +
+ +
exiftool -filename=new.jpg dir/old.jpg
+
+ +

Rename old.jpg to new.jpg in directory dir.

+ +
+
exiftool -directory=%e dir
+
+ +

Move all files from directory dir into directories named by the original file extensions.

+ +
+
exiftool '-Directory<DateTimeOriginal' -d %Y/%m/%d dir
+
+ +

Move all files in dir into a directory hierarchy based on year, month and day of DateTimeOriginal. eg) This command would move the file dir/image.jpg with a DateTimeOriginal of 2005:10:12 16:05:56 to 2005/10/12/image.jpg.

+ +
+
exiftool -o . '-Directory<DateTimeOriginal' -d %Y/%m/%d dir
+
+ +

Same effect as above except files are copied instead of moved.

+ +
+
exiftool '-filename<%f_${model;}.%e' dir
+
+ +

Rename all files in dir by adding the camera model name to the file name. The semicolon after the tag name inside the braces causes characters which are invalid in Windows file names to be deleted from the tag value (see the "Advanced formatting feature" for an explanation).

+ +
+
exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir
+
+ +

Rename all images in dir according to the CreateDate date and time, adding a copy number with leading '-' if the file already exists (%-c), and preserving the original file extension (%e). Note the extra '%' necessary to escape the filename codes (%c and %e) in the date format string.

+ +
+
exiftool -r '-FileName<CreateDate' -d %Y-%m-%d/%H%M_%%f.%%e dir
+
+ +

Both the directory and the filename may be changed together via the FileName tag if the new FileName contains a '/'. The example above recursively renames all images in a directory by adding a CreateDate timestamp to the start of the filename, then moves them into new directories named by date.

+ +
+
exiftool '-FileName<${CreateDate}_$filenumber.jpg' -d %Y%m%d -ext jpg .
+
+ +

Set the filename of all JPG images in the current directory from the CreateDate and FileNumber tags, in the form "20060507_118-1861.jpg".

+ +
+
+ +

GEOTAGGING EXAMPLES

+ +

ExifTool implements geotagging via 3 special tags: Geotag (which for convenience is also implemented as an exiftool option), Geosync and Geotime. The examples below highlight some geotagging features. See https://exiftool.org/geotag.html for additional documentation.

+ +
+ +
exiftool -geotag track.log a.jpg
+
+ +

Geotag an image (a.jpg) from position information in a GPS track log (track.log). Since the Geotime tag is not specified, the value of DateTimeOriginal is used for geotagging. Local system time is assumed unless DateTimeOriginal contains a timezone.

+ +
+
exiftool -geotag t.log -geotime='2009:04:02 13:41:12-05:00' a.jpg
+
+ +

Geotag an image with the GPS position for a specific time.

+ +
+
exiftool -geotag log.gpx '-xmp:geotime<createdate' dir
+
+ +

Geotag all images in directory dir with XMP tags instead of EXIF tags, based on the image CreateDate.

+ +
+
exiftool -geotag a.log -geosync=-20 dir
+
+ +

Geotag images in directory dir, accounting for image timestamps which were 20 seconds ahead of GPS.

+ +
+
exiftool -geotag a.log -geosync=1.jpg -geosync=2.jpg dir
+
+ +

Geotag images using time synchronization from two previously geotagged images (1.jpg and 2.jpg), synchronizing the image and GPS times using a linear time drift correction.

+ +
+
exiftool -geotag a.log '-geotime<${createdate}+01:00' dir
+
+ +

Geotag images in dir using CreateDate with the specified timezone. If CreateDate already contained a timezone, then the timezone specified on the command line is ignored.

+ +
+
exiftool -geotag= a.jpg
+
+ +

Delete GPS tags which may have been added by the geotag feature. Note that this does not remove all GPS tags -- to do this instead use -gps:all=.

+ +
+
exiftool -xmp:geotag= a.jpg
+
+ +

Delete XMP GPS tags which were added by the geotag feature.

+ +
+
exiftool -xmp:geotag=track.log a.jpg
+
+ +

Geotag an image with XMP tags, using the time from DateTimeOriginal.

+ +
+
exiftool -geotag a.log -geotag b.log -r dir
+
+ +

Combine multiple track logs and geotag an entire directory tree of images.

+ +
+
exiftool -geotag 'tracks/*.log' -r dir
+
+ +

Read all track logs from the tracks directory.

+ +
+
exiftool -p gpx.fmt -d %Y-%m-%dT%H:%M:%SZ dir > out.gpx
+
+ +

Generate a GPX track log from all images in directory dir. This example uses the gpx.fmt file included in the full ExifTool distribution package and assumes that the images in dir have all been previously geotagged.

+ +
+
+ +

PIPING EXAMPLES

+ +
+ +
cat a.jpg | exiftool -
+
+ +

Extract information from stdin.

+ +
+
exiftool image.jpg -thumbnailimage -b | exiftool -
+
+ +

Extract information from an embedded thumbnail image.

+ +
+
cat a.jpg | exiftool -iptc:keywords+=fantastic - > b.jpg
+
+ +

Add an IPTC keyword in a pipeline, saving output to a new file.

+ +
+
curl -s http://a.domain.com/bigfile.jpg | exiftool -fast -
+
+ +

Extract information from an image over the internet using the cURL utility. The -fast option prevents exiftool from scanning for trailer information, so only the meta information header is transferred.

+ +
+
exiftool a.jpg -thumbnailimage -b | exiftool -comment=wow - | exiftool a.jpg -thumbnailimage'<=-'
+
+ +

Add a comment to an embedded thumbnail image. (Why anyone would want to do this I don't know, but I've included this as an example to illustrate the flexibility of ExifTool.)

+ +
+
+ +

INTERRUPTING EXIFTOOL

+ +

Interrupting exiftool with a CTRL-C or SIGINT will not result in partially written files or temporary files remaining on the hard disk. The exiftool application traps SIGINT and defers it until the end of critical processes if necessary, then does a proper cleanup before exiting.

+ +

EXIT STATUS

+ +

The exiftool application exits with a status of 0 on success, or 1 if an error occurred, or 2 if all files failed the -if condition (for any of the commands if -execute was used).

+ +

AUTHOR

+ +

Copyright 2003-2022, Phil Harvey

+ +

This is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

+ +

SEE ALSO

+ +

Image::ExifTool(3pm), Image::ExifTool::TagNames(3pm), Image::ExifTool::Shortcuts(3pm), Image::ExifTool::Shift.pl

+ + + +
+ exiftool Application Documentation +
+ + + + + + diff --git a/html/faq.html b/html/faq.html new file mode 100644 index 0000000..1e1a29e --- /dev/null +++ b/html/faq.html @@ -0,0 +1,1768 @@ + + + + ExifTool FAQ + + + + + + +

ExifTool FAQ

+ + +

1. "Is there a forum for discussing ExifTool issues?"

+ +
+ExifTool issues can be discussed on the ExifTool forum at +https://exiftool.org/forum/ +
+ + +

2. "How do I determine the tag name for some information?"

+ +
When you run exiftool, by default it prints descriptions, not tag +names, for the information it extracts. These descriptions are in English +unless the -lang option is used to select another language. Note +that descriptions often contain spaces between words, but tag names never do. +Also, tag names are always English, regardless of the -lang +setting. To print the tag names instead instead of descriptions, use the +-s option when extracting information. eg) +
exiftool -s image.jpg
+Valid characters in tag names are A-Z, a-z, +0-9, _ and -. See the +tag name documentation for a complete list of +available tag names.
+ +
Tag names may be optionally prefixed by a group name to specify a +particular information type or location. Use the -g0, +-g1, etc (or -G0, -G1, etc) options when +extracting information to see the corresponding group names. See the Tag Groups section of the ExifTool home page for +more information.
+ + +

3a. "ExifTool reports the wrong value or doesn't extract a tag", +
3b. "ExifTool doesn't write a tag properly", or +
3c. "Other software can't read information written by ExifTool"

+ +
[Also see FAQ number 23 for reasons why +ExifTool may not write some tags to certain file types.]
+ +
First, make sure you are looking at the right information. Use +ExifTool with a command like this to extract all information from the file, +along with the location it was written: + +
exiftool -a -G1 -s c:\images\test.jpg
+ +In this command, -a allows duplicate tags to be extracted, +-G1 shows the family 1 group name (ie. the location) of each tag, +and -s shows the tag names instead of their descriptions. +(Substitute the path name of your file in place of +"c:\images\test.jpg".)
+ +
When duplicate tags exist, only one is extracted unless the +-a option is used. Beware that options like -EXIF:all +select all EXIF tags from the extracted tags, so EXIF tags hidden by duplicate +tags in other locations will not appear in the output for +-EXIF:all. For example, the command + +
exiftool -gps:all image.jpg
+ +will NOT necessarily extract all EXIF GPS tags because some may have been +suppressed by same-named tags in other groups. To be sure all EXIF GPS tags are +extracted, the -a option must be used: + +
exiftool -a -gps:all image.jpg
+ +[But note that GPS information may be stored in metadata formats +other than just EXIF, so restricting the command to the EXIF "GPS" group may +miss GPS information in other formats. The following command is better suited +to extract all GPS from a wide variety of file formats:] + +
exiftool -a "-gps*" -ee video.mp4
+ +If you are having problems with other software reading information written by +ExifTool, if possible try first writing the information from the other software, +then use ExifTool (with the -a and -G1 options) to +determine where the information was written. Once you know where it should go, +you can use ExifTool to write to this location. You can read or write +information in a specific location by prefixing the tag name on the command line +with the desired group name. eg.) "-ExifIFD:DateTimeOriginal" +
+ +
This problem may also occur if contradictory information exists in +different meta information formats within the same file. For example, often XMP +will be ignored if IPTC exists and the Photoshop:IPTCDigest does not agree with +the IPTC content. The +Metadata Working Group +recommends techniques to keep the EXIF, IPTC and XMP metadata synchronized. +These recommendations are implemented by the ExifTool +MWG tags. For maximum compatibility with the +widest range of applications, it is suggested that these MWG tags be used +whenever possible.
+ +
One final note: When writing, the -v2 option may be +useful because it provides details about what ExifTool is writing, and where. +
+ + +

4. "ExifTool reports more than one shutter speed or aperture value, and +they are slightly different"

+ +
+There are a number of different ways that aperture and shutter speed information +are stored in many images. The standard EXIF values (EXIF:FNumber and +EXIF:ExposureTime) should correspond to the values displayed by your camera, but +these values may have been rounded off by the camera and/or ExifTool. (You can +use the -n option to avoid rounding by ExifTool and show the full +value in decimal form.) The corresponding EXIF APEX values (EXIF:ApertureValue +and EXIF:ShutterSpeedValue) may be different due to their own round-off errors. +If available, the MakerNotes values may be the most accurate because they +haven't been rounded off to nice even values for display, so with these you may +see odd values like 1/102 instead of 1/100, etc. +
+ + +

5. "How do I format date and time information for writing?"

+ +
All information (including date/time information) is written in the +same format as it is read out. When reading, ExifTool converts all date and +time information to standard EXIF format, so this is also the way it is +specified when writing. The standard EXIF date/time format is +"YYYY:mm:dd HH:MM:SS", and some meta information formats such as +XMP also allow sub-seconds and a timezone to be specified. The timezone format +is "+HH:MM", "-HH:MM" or "Z". For +example: + +
exiftool -xmp:dateTimeOriginal="2005:10:23 20:06:34.33-05:00" a.jpg
+
+ +When writing XMP or other information types which allow incomplete date/time +values, the following input formats are also accepted: + +
YYYY
+YYYY:mm
+YYYY:mm:dd
+YYYY:mm:dd HH:MM
+
+ +Having said this, ExifTool is very flexible about the actual format of input +date/time values when writing, and will attempt to reformat any values into the +standard format unless the -n option is used. Any separators may +be used (or in fact, none at all). The first 4 consecutive digits found in the +value are interpreted as the year, then next 2 digits are the month, and so on. +[The year must be 4 digits. Other fields are expected to be 2 +digits, but a single digit is allowed if the subsequent character is a +non-digit.] For EXIF date/time values, all 6 date/time fields must exist +("YYYYmmddHHMMSS"), but XMP date/time values require only the year +("YYYY"). This feature facilitates useful operations such as +setting date/time tags from a date embedded in the file name. For example, the +command + +
exiftool "-alldates<filename" c:\images
+ +will set the common date/time tags from the file name for all images in the +directory "c:\images". This will work for any file name which +matches the above criteria (eg. "IMG_20110927_103000.jpg"). +[AllDates is a shortcut for 3 tag names: DateTimeOriginal, +CreateDate and ModifyDate. See the Shortcuts +Tags documentation for more information.]
+ +
The -d option provides additional flexibility in +parsing strings when writing date/time tags with ExifTool 10.32 or later if +POSIX::strptime or Time::Piece is installed (use "exiftool -ver -v" +to check the installed packages). The format of the -d argument is +the same for reading and writing.
+ +
Special feature: A value of "now" may be used to +represent the current time when writing any date/time tag. For example: +
exiftool -xmp:dateTimeOriginal=now a.jpg
+[There is also a Now tag which may +be used for a similar purpose by copying its value to another tag, but copying +tags adds an extra read stage to the processing which is best avoided if +performance is an issue.] +
+ + +

6. "I get 'Can't convert TAG (not in PrintConv)' errors when +writing a tag"

+ +
+By default, ExifTool applies a print conversion (PrintConv) to extracted +information to make the output more human-readable. Some conversions involve +lookup tables which are documented in the Values column of the +tag name documentation. For example, the +GPSAltitudeRef tag defines the following conversions: +
0 = Above Sea Level
+1 = Below Sea Level
+
+For this tag, a value of '0' is printed as 'Above Sea Level', and '1' is printed +as 'Below Sea Level'. Reading and writing with ExifTool is symmetrical [with +the possible exception of list-type tags -- see FAQ number 17 +below], so a value that is printed as 'Above Sea Level' must also be written in +that form. (In other words, the inverse print conversion is applied when writing +values.) For example, to write GPSAltitudeRef you can type: +
exiftool -gpsaltituderef="Above Sea Level" image.jpg
+
+or any unambiguous short form may be used and ExifTool will know what you mean, eg) +
exiftool -gpsaltituderef=above image.jpg
+
+Alternatively, the print conversion can be disabled for all tags with the +-n option, or for individual tags by suffixing the tag name with a +'#' character. In either case the printed value of GPSAltitudeRef +will be '0' or '1' when extracting information, and the value is written in the +same way. So following two commands have exactly the same effect as above: +
exiftool -gpsaltituderef=0 -n image.jpg
+exiftool -gpsaltituderef#=0 image.jpg
+
+Integer values may also be specified in hexadecimal (with a leading '0x'). For +example, the following commands are all equivalent: +
exiftool -flash=1 -n image.jpg
+exiftool -flash=0x1 -n image.jpg
+exiftool -flash#=1 image.jpg
+exiftool -flash#=0x1 image.jpg
+exiftool -flash=fired image.jpg
+
+Programmers: These techniques look like this when calling Image::ExifTool +functions from a Perl script: +
$exifTool->SetNewValue(flash => 1, Type => 'ValueConv');
+$exifTool->SetNewValue(flash => 0x1, Type => 'ValueConv');
+$exifTool->SetNewValue('flash#' => 1);
+$exifTool->SetNewValue('flash#' => 0x1);
+$exifTool->SetNewValue(flash => 'fired');
+
+ + +

7. "I can't delete all EXIF information from a TIFF file using +'exiftool -exif:all= img.tif'"

+ +
This is because of the way a TIFF file is structured. With a JPEG +image, this command removes IFD0 (the main Image File Directory) as well as any +subdirectories, thus removing all EXIF information. But with the TIFF format, +the main image itself is stored in IFD0, so deleting this directory would +destroy the image. The same is true for any TIFF-based RAW file such as DNG, +CR2, NEF, etc. For these types of files, ExifTool just deletes the ExifIFD +subdirectory, so any information stored in other directories is preserved (BUT +NOTE THAT WITH PROPRIETARY RAW FORMATS THIS MAY DELETE INFORMATION THAT IS +NECESSARY FOR PROPER RENDERING OF THE IMAGE). +
+ +
Use "exiftool -a -G1 -s img.tif" to see where the +information is stored. Any tags remaining in other IFD's must be deleted +individually from a TIFF-format file if desired. For convenience, a CommonIFD0 +shortcut tag is provided to simplify the +deletion of common metadata tags from IFD0 by adding "-CommonIFD0=" +to the command line. +
+ + +

8a. "All maker note information is lost if I change the Make or Model tag", or +
8b. "I can't copy maker note information to an image", or +
8c. "I can't view a RAW image after changing the model tag"

+ +
+The Make and Model tags are used by some image utilities (including ExifTool) to +determine the format of the maker note information. Deleting or changing either +of these tags may prevent these utilities from recognizing or properly +interpreting the maker notes (which, for a RAW image, may mean that the image +can no longer be properly rendered). Also beware that the maker notes +information may be damaged if an image is edited when the maker notes are not +properly recognized. So it is a good idea not to edit the Make and Model tags in +the first place.
+ +
If you really want to delete the Make and Model information, you +might as well delete the maker notes too. You can do this with either of the +following commands: +
exiftool -make= -model= -makernotes:all= image.jpg
+exiftool -make= -model= -makernotes= image.jpg
+
+For the same reason, maker notes can not be copied to an image with an +incompatible Make or Model. To do this, the Make and Model tags must also be +copied. eg) +
exiftool -tagsfromfile src.jpg -makernotes -make -model dst.jpg
+
+(Note that in this case the "-makernotes:all" syntax does not work +because it attempts to copy the maker note tags individually. Since maker note +tags may not be created individually, they must instead be copied as a block +with "-makernotes".) +
+ + +

9a. "The information is different when I copy all tags to a new file", or +
9b. "The tag locations change when I use -tagsfromfile +to copy information"

+ +
+This feature is explained under the -tagsFromFile option in +the exiftool application documentation, but the +question is common enough that it is discussed here in more detail.
+ +
By default, ExifTool will store information in preferred locations +when either writing new information or copying information between files. This +freedom allows ExifTool to write or copy information to files of different +formats without requiring the user to know details about where the information +is stored.
+ +
The preferred general locations for information written to JPEG +images are 1) EXIF, 2) IPTC and 3) XMP. As an example, information extracted +from the maker notes will be preferentially written (on a tag-by-tag basis) in +EXIF format when copying information between two JPEG images. But if a specific +tag doesn't exist in EXIF, then the tag is written to the first valid group in +the order specified above. The advantage of "translating" the information to +EXIF is that it then becomes readable by applications which only support +standard EXIF. The disadvantage is that you don't get an exact copy of the +original information structure.
+ +
But ExifTool gives you the ability to customize this behaviour to +write the information to wherever you want. This is done by specifying a group +name for the tag(s) to be copied. This applies even if the group name is +"all", in which case the original family 1 group is preserved. So +to copy all information and preserve the original structure, use this syntax: + +
exiftool -tagsfromfile src.jpg -all:all dst.jpg
+
+ +In this command, since no destination tag was specified, the destination is the +same as the source (ie. "-all:all>all:all"), so the information is +copied to the same family 1 group.
+ +
Here are some examples to show you the type of control you have over +where the information is written. All commands in each example are equivalent: + +
# copy all tags to preferred groups (no destination group)
+exiftool -tagsfromfile src.jpg dst.jpg
+exiftool -tagsfromfile src.jpg -all dst.jpg
+exiftool -tagsfromfile src.jpg "-all>all" dst.jpg
+exiftool -tagsfromfile src.jpg "-all:all>all" dst.jpg
+
+# copy all tags, preserving family 1 group (destination group 'all')
+exiftool -tagsfromfile src.jpg -all:all dst.jpg
+exiftool -tagsfromfile src.jpg "-all>all:all" dst.jpg
+exiftool -tagsfromfile src.jpg "-all:all>all:all" dst.jpg
+
+# copy all tags to EXIF group (destination group 'exif')
+# [the destination family 1 group is the preferred EXIF IFD]
+exiftool -tagsfromfile src.jpg "-all>exif:all" dst.jpg
+exiftool -tagsfromfile src.jpg "-all:all>exif:all" dst.jpg
+
+# copy XMP tags to XMP group (destination group 'xmp')
+# [the destination family 1 group is the preferred XMP namespace]
+exiftool -tagsfromfile src.jpg "-xmp:all" dst.jpg
+exiftool -tagsfromfile src.jpg "-xmp:all>xmp:all" dst.jpg
+
+# copy XMP tags, preserving family 1 group (destination group 'all')
+exiftool -tagsfromfile src.jpg "-xmp:all>all:all" dst.jpg
+
+# copy XMP tags to preferred groups (no destination group)
+exiftool -tagsfromfile src.jpg "-xmp:all>all" dst.jpg
+
+# copy XMP tags to EXIF only (destination group 'exif')
+# [the destination family 1 group is the preferred EXIF IFD]
+exiftool -tagsfromfile src.jpg "-xmp:all>exif:all" dst.jpg
+
+ +The same rules illustrated above also apply when copying individual tags.
+ +
Note: If no destination group is specified, a new tag is created if +necessary only in the preferred group, but if the same tag already exists in +another group, then this information is also updated. (Otherwise inconsistent +values for the same information would exist in different locations. Of course, +you can always generate inconsistencies like this if you really want to by +specifically writing contradictory information to different groups.) +
+ +
Certain types of meta information (such as EXIF, IPTC, XMP and +ICC_Profile) may also be copied as a block. This technique copies all +meta information, even if ExifTool doesn't have the ability to write some +individual tags contained in the block. For all block types except EXIF, the +metadata is copied byte-for-byte from the original image. With EXIF however, +the metadata may be restructured to ensure that it is self-contained. Also note +that EXIF may not be written as a block to TIFF-based file formats. Beware that +any existing metadata of this type in the destination file will be +overwritten by the new block. + +
# copy EXIF as a block between same-named JPG files in different directories
+exiftool -tagsfromfile SRCDIR/%f.%e -exif -ext jpg DSTDIR
+
+# copy XMP as a block from one file to another
+exiftool -tagsfromfile src.jpg -xmp dst.cr2
+
+ + +

10. "How does ExifTool handle coded character sets?"

+ + + + +
[Also see FAQ number 18 for help with +special characters in a Windows console.]
+ +
Certain meta information formats allow coded character sets other +than plain ASCII. When reading, most known encodings are converted to the +external character set according to the exiftool "-charset CHARSET" +or -L option, or to UTF‑8 by default. When writing, the +inverse conversion is performed. Alternatively, special characters may be +converted to/from HTML character entities with the -E option. +
+ +
A distinction is made between the external character set +visible to the ExifTool user, and the internal character used to store +text in the metadata of a file. These character sets may be specified +separately as follows: +
  1. The external character set for tag values passed to/from +ExifTool is UTF‑8 by default, but it may be changed through any of these +command-line options: +
    -charset CHARSET   or   +-charset exiftool=CHARSET   or   -L +
    +The encoding of file and directory names (eg. the FILE argument on +the command line) is different. By default, these names are passed straight +through to the standard C I/O routines without recoding. On Mac/Linux these +routines expect UTF‑8, but on Windows they use the system code page (which +is dependent on your system settings). However, as of ExifTool 9.79, the +external filename encoding may be specified: +
    -charset filename=CHARSET
    +When this is done, file and directory names are converted from the specified +encoding to one appropriate for system I/O routines. In Windows, this also has +the effect of enabling Unicode filename support via the special Windows +wide-character I/O routines if the required Perl modules are available +(these are included in the Windows executable version of ExifTool). See +WINDOWS UNICODE FILE NAMES +in the application documentation for more details.

  2. +
  3. The internal character set for strings stored in file metadata may be +specified for some metadata types: +
    -charset TYPE=CHARSET
    +(where TYPE is "exif", "iptc", +"id3", "photoshop", "quicktime" or +"riff")
+ +Valid CHARSET values are (with aliases given in brackets, case is +not significant): + +
+ + + + + + + + + + + +
UTF8(cp65001, UTF‑8)DOSLatinUS(cp437)
Latin(cp1252, Latin1)DOSLatin1(cp850)
Latin2(cp1250)DOSCyrillic(cp866)
Cyrillic(cp1251, Russian)     MacRoman(cp10000, Mac, Roman)
Greek(cp1253)MacLatin2(cp10029)
Turkish(cp1254)MacCyrillic(cp10007)
Hebrew(cp1255)MacGreek(cp10006)
Arabic(cp1256)MacTurkish(cp10081)
Baltic(cp1257)MacRomanian(cp10010)
Vietnam(cp1258)MacIceland(cp10079)
Thai(cp874)MacCroatian(cp10082)
+ +The -L option is equivalent to "-charset Latin", +"-charset Latin1" and "-charset cp1252".
+ +
Type-specific details are given below about the special character +handling for EXIF, IPTC, XMP, PNG, ID3, PDF, Photoshop, QuickTime, AIFF, RIFF, +MIE and Vorbis information:
+ + + +
EXIF: Most textual information in EXIF is +stored in ASCII format (called "string" in the +EXIF Tags documentation). By default ExifTool +does not convert these strings. However, it is not uncommon for applications to +write UTF‑8 or other encodings where ASCII is expected. To deal with +these, ExifTool allows the internal EXIF string encoding to be specified with +"-charset exif=CHARSET", which causes EXIF string values to be +converted from the specified character set when reading, and stored with this +character set when writing. The +MWG recommends using +UTF‑8 encoding for EXIF strings, and in keeping with this the +"-use mwg" feature sets the default internal EXIF string encoding +to UTF‑8 (ie. "-charset exif=utf8"), but note that this will +have no effect unless the external encoding is also set to something other than +the default of UTF‑8.
+ +
A few EXIF tags (UserComment, GPSProcessingMethod and +GPSAreaInformation) support a designated internal text encoding, with values +stored as ASCII, Unicode (UCS‑2) or JIS. When reading these tags, ExifTool +converts Unicode and JIS to the external character set specified by the +-charset or -L option, or to UTF‑8 by default. +ASCII text is not converted. When writing, text is stored as ASCII unless the +string contains special characters, in which case it is converted from the +external character set (UTF‑8 by default), and stored as Unicode. ExifTool +writes Unicode in native EXIF byte ordering by default, but the byte order may +be specified by setting the ExifUnicodeByteOrder tag (see the +Extra Tags documentation).
+ +
The EXIF "XP" tags (XPTitle, XPComment, etc) are always stored +internally as little-endian Unicode (UCS‑2), and are read and written +using the specified external character set.
+ + + +
IPTC: +The value of the IPTC:CodedCharacterSet tag determines how the internal IPTC +string values are interpreted. If CodedCharacterSet exists and has a value of +"UTF8" (or "ESC % G") then string values are +assumed to be stored as UTF‑8. Otherwise the internal IPTC encoding is +assumed to be Windows Latin1 (cp1252), but this can be changed with +"-charset iptc=CHARSET". When reading, these strings are converted +to UTF‑8 by default, or to the external character set specified by the +-charset or -L option. When writing, the inverse +conversions are performed. No conversion is done if the internal (IPTC) and +external (ExifTool) character sets are the same. Note that ISO 2022 character +set shifting is not supported. Instead, a warning is issued and the string is +not converted if an ISO 2022 shift code is encountered. See the +IPTC IIM +specification for more information about IPTC character coding.
+ +
ExifTool may be used to convert IPTC values to a different internal +encoding. To do this, all IPTC tags must be rewritten along with the desired +value of CodedCharacterSet. For example, the following command changes the +internal IPTC encoding to UTF‑8 (from Windows Latin1 unless +CodedCharacterSet was already "UTF8"): +
exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 a.jpg
+
or from Windows Latin2 (cp1250) to UTF‑8: +
exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 -charset iptc=latin2 a.jpg
+
and this command changes it back from UTF‑8 to Windows Latin1 (cp1252): +
exiftool -tagsfromfile @ -iptc:all -codedcharacterset= a.jpg
+
or to Windows Latin2: +
exiftool -tagsfromfile @ -iptc:all -codedcharacterset= -charset iptc=latin2 a.jpg
+
Note that unless CodedCharacterSet is UTF‑8, applications have no +reliable way to determine the IPTC character encoding. For this reason, it is +recommended that CodedCharacterSet be set to "UTF8" when creating +new IPTC.
+ +
Refers to the older +IPTC IIM format. +The more recent +IPTC +Photo Metadata Standard actually uses the XMP format (see below). +
+ + + +
XMP: Exiftool reads XMP encoded as +UTF‑8, UTF‑16 or UTF‑32, and converts them all to UTF‑8 +internally. Also, all XML character entity references and numeric character +references are converted. When writing, ExifTool always encodes XMP as +UTF‑8, converting the following 5 characters to XML character references: +& < > ' ". By default no further conversion is +performed, however the -charset or -L option may be +used to convert text to/from a specified external character set when +reading/writing.
+ +
PNG: +PNG TextualData tags are stored as +tEXt, zTXt and iTXt chunks in PNG images. The tEXt and zTXt chunks use ISO +8859-1 encoding, while iTXt uses UTF‑8. When reading, ExifTool converts +all PNG textual data to the external character set specified by the +-charset or -L option, or to UTF‑8 by default. +When writing, ExifTool generates a tEXt chunk (or zTXt with the -z +option) if the text doesn't contain special characters or if Latin encoding is +specified (-L or -charset latin); otherwise an iTXt +chunk is used and the text is converted from the specified external character +set and stored as UTF‑8.
+ +
JPEG Comment: The encoding for the JPEG +Comment (COM segment) is not specified, so ExifTool reads/writes this text +without conversion.
+ +
ID3: The ID3v1 specification officially +supports only ISO 8859‑1 encoding (a subset of Windows Latin1), although +some applications may incorrectly use other character sets. By default ExifTool +converts ID3v1 text from Latin to the external character set specified by the +-charset or -L option, or to UTF‑8 by default. +However, the internal ID3v1 charset may be specified with +"-charset id3=CHARSET". The encoding for ID3v2 information is +stored in the file, so ExifTool converts ID3v2 text from this encoding to the +external character set specified by -charset or -L, or +to UTF‑8 by default. ExifTool does not currently write ID3 +information.
+ +
PDF: PDF text strings are stored in either +PDFDocEncoding (similar to Windows Latin1) or Unicode (UCS‑2). When +reading, ExifTool converts to the external character set specified by the +-charset or -L option, or to UTF‑8 by default. +When writing, ExifTool encodes input text from the specified character set as +Unicode only if the string contains special characters, otherwise PDFDocEncoding +is used.
+ +
Photoshop: Some Photoshop resource +names are stored as Pascal strings with unknown encoding. By default, ExifTool +assumes MacRoman encoding and converts this to UTF‑8, but the internal and +external character sets may be specified with +"-charset Photoshop=CHARSET" and "-charset CHARSET" +respectively.
+ +
QuickTime: QuickTime text strings may +be stored in a variety of poorly documented formats, and ExifTool does its best +to decode these according to the -charset option setting. For some +QuickTime strings where the internal encoding is not known, ExifTool assumes a +default encoding of MacRoman, but this may be changed with +"-charset QuickTime=CHARSET".
+ +
AIFF: AIFF strings are assumed to be +stored in MacRoman, and are converted according to the -charset +option when reading.
+ +
RIFF: The internal encoding of RIFF +strings (eg. in AVI and WAV files) is assumed to be Latin unless otherwise +specified by the RIFF CSET chunk or the "-charset RIFF=CHARSET" +option.
+ +
MIE: MIE strings are stored as either +UTF‑8 or ISO 8859‑1. When reading, UTF‑8 strings are converted +according to the -charset or -L option, and ISO +8859‑1 strings are never converted. When writing, input strings are +converted from the specified character set to UTF‑8. The resulting +strings are stored as UTF‑8 if they contain multi-byte UTF‑8 +character sequences, otherwise they are stored as ISO 8859‑1.
+ +
Vorbis: Vorbis comments are stored as +UTF‑8, and are converted to the character set specified by +-charset or -L when reading.
+ +
+Programmers: ExifTool returns all values as byte strings of encoded +characters. Perl wide characters are not used. The encoding is UTF‑8 by +default, but valid UTF‑8 can not be guaranteed for all values, so the +caller must validate the encoding if necessary. The encodings described above +are set by the various Charset options of +the API. +

Note: Some settings of the system PERL_UNICODE environment +variable may be incompatible with ExifTool's character handling. +
+ + + + + +

11. "My user-defined tags don't work"

+ +
+For examples of how to add user-defined tags, see the +ExifTool_config file in the ExifTool distribution. +It may be useful to activate this file as a test before trying to implement +your own config file. To activate this file, copy it to your HOME +directory then rename it to ".ExifTool_config". +
Note: The config file must be renamed at the +command line because neither the Windows nor Mac GUI allow a file name to +begin with a ".". To do this in Windows, run "cmd.exe" and type +the following (pressing ENTER at the end of each line): +
cd %HOMEPATH%
+rename ExifTool_config .ExifTool_config
+
+or on a Mac, open the "Terminal" application (from the /Applications/Utilities +folder) and type this command then press RETURN: +
mv ExifTool_config .ExifTool_config
+
+ +With the sample config file installed, you should be able to write the example +tags. A command like this: +
exiftool -v2 -NewXMPxmpTag=test FILE
+should print this as the first line of its output: +
Writing XMP-xmp:NewXMPxmpTag
+
+If this doesn't work, the most common problem is that the +".ExifTool_config" configuration file isn't getting loaded. In +this case, there are a few things you can try: +
    +
  1. Make sure the config file name is correct. It must be +".ExifTool_config" (note the leading ".", and the +capital "T").
  2. +
  3. Set either the HOME or the EXIFTOOL_HOME environment variable +to the name of the directory where you put your ".ExifTool_config" +file.
  4. +
  5. Put the config file in the same directory as the exiftool app. (Also, be +sure the config filename starts with a dot! See the note above for help +renaming the config file.)
  6. +
  7. If you can't get the config file to load automatically, you can try loading +it manually with the exiftool -config CFGFILE option. (Note: +This must be the first option on the command line.) This allows loading +of a config file with any name.
  8. +
+
+ +
If necessary, you can verify that ExifTool is loading your config +file by adding the following line to your file: + +
print "LOADED!\n";
+
+ +If you see a "LOADED!" message when you run exiftool, but your new +tags still don't work, make sure you are using the proper tag name and that the +file you are writing can support this type of information.
+ +
Note that all tag names in the config file are case +sensitive. Specifically, the case must be correct for tag names in +Composite tag Require/Desire entries. Also note that XMP tag names are +generated automatically by capitalizing the tag ID unless the tag definition +contains a "Name" entry.
+ +
Programmers: To specify the config file directory from within +a Perl script when using the ExifTool API, set the EXIFTOOL_HOME +environment variable before loading the ExifTool module: +
BEGIN { $ENV{EXIFTOOL_HOME} = '/config_file_directory' }
+use Image::ExifTool;
+
+Also see the Configuration section of the +ExifTool API documentation for techniques to use a config file with another +name, or to disable the config file feature. +
+ + +

12. "How do I export information from exiftool to a database?"

+ +
[See FAQ number 26 for help with the reverse +-- importing metadata from a database.]
+ +
+It is often easiest to export information formatted as a tab-delimited or +comma-separated list of values using the exiftool -T or +-csv option. As well, the -r option is useful for +recursing through all images in a hierarchy of directories. For example: + +
exiftool -T -r -filename -exposuremode -ISO t/images > out.txt
+
+ +This command recursively processes all images in the "t/images" +directory, extracting FileName, ExposureMode and ISO tags, and writing the +output to a tab-delimited text file called "out.txt". After the +command has executed, "out.txt" will look something like this: + +
Canon.jpg       Manual  100
+Casio.jpg       -       64
+Nikon.jpg       -       100
+OlympusE1.jpg   Auto    400
+
+ +One limitation of the -T option is that a list of tags to extract +must be specified. Otherwise, all information is extracted from each input +file, and the columns would contain values from random tags.
+ +
The -csv (comma separated values) option solves this +dilemma by pre-extracting information from all input files, then producing a +sorted list of available tag names as the first row of the output, and +organizing the information into columns for each tag. As well, a first column +labelled "SourceFile" is generated. These features make it practical to use the +-csv option for extracting all information from multiple images. +For example, this command: + +
exiftool -csv -r t/images > out.csv
+ +gives an output like this: + +
SourceFile,AEBBracketValue,AELock,AFAreaHeight,AFAreaMode,AFAreas,[...]
+t/images/Canon.jpg,0,,151,,,[...]
+t/images/Casio.jpg,,,,,,[...]
+t/images/Nikon.jpg,,,,Single Area,,[...]
+t/images/OlympusE1.jpg,,Off,,,"Center (121,121)-(133,133)",[...]
+
+ +Note that the number of columns in the -csv output may be very +large if all information is extracted. Missing tags are indicated by empty +strings as in the example above, or by dashes if the -f option is +used.
+ +
It should be possible to import these files directly into most +database applications. On the command line, any list of tag names may be used, +and any number of file or directory names may be specified. (Hint: If your +command line starts to get too long, you may want to look into using the +-@ option and/or the ShortCut +feature).
+ +
In Windows, a .BAT file containing the exiftool command may be used +to give drag and drop functionality. Dropping a folder on the following .BAT +file will create "out.txt" in the folder: + +
echo "FileName<tab>Aperture<tab>ISO" > %1\out.txt
+exiftool -T -r -filename -aperture -ISO %1 >> %1\out.txt
+
+ +The "echo" command was included to add column headings to the +output. (The tab character in the echo command, indicated by +"<tab>", may be generated in Mac/Linux shells with CTRL-v +then TAB, or in a Windows cmd shell with TAB when cmd.exe is run with the +/f:off option to disable tab completion.) +
+ +
Other possible export formats include RDF/XML (with the the +-X option), or JSON (with the -j option). These +methods allow transfer of more complex data sets (including structured +information with the -struct option), but require that the +importing software supports these formats.
+ +
Finally, the -p option may be used to generate any +arbitrary output format. For example, the following format file +(let's call it "my.fmt") may be used to emulate a CSV-formatted +output: + +
#[HEAD]FileName,Aperture,ISO
+$filename,$aperture,$iso
+
+ +with a command like this: + +
exiftool -f -r -p my.fmt t/images > out.csv
+
+ +But note that any values containing commas, quotes or some other special +characters may mess up the CSV formatting. If this is a possibility, the +-api filter option may be added to the command to quote values +if necessary. For example: + +
# in Windows
+exiftool -api filter="$_ = qq{""$_""} if s/""/""""/g or /(^\s+|\s+$)/ or /[,\n\r]/" ...
+
+# in Mac/Linux
+exiftool -api filter='$_ = qq{"$_"} if s/"/""/g or /(^\s+|\s+$)/ or /[,\n\r]/' ...
+ +The -p option argument may also be a format string instead of a +file name. The following command has the same effect as above except that the +row of headings is not printed (Note: Use single quotes as below on Mac/Linux, +or double quotes instead on Windows): + +
exiftool -f -r -p '$filename,$aperture,$iso' t/images > out.csv
+
+ +With the -f option, the value of any missing tag is printed as a +dash (or the value of the +API MissingTagValue option, if set). +Without this option, missing tags generate a minor warning and the line in the +-p output is not printed. The -m option may be used +to ignore minor warnings, which causes these lines to be printed with an empty +value for missing tags.
+ +
+See the -p option in the application +documentation for more information about this feature. +
+ + +

13a. "Why is my file smaller after I use ExifTool to write information?", or +
13b. "Why do some Offset tags change value when I write other tags?", or +
13c. "How does editing a file with ExifTool affect image quality?"

+ +
+There are various specific reasons why this can happen, but the general answer +is: When ExifTool writes an image, the meta information may be restructured in +such a way that it takes less space than in the original file, or so that some +tags are stored at different offsets in the file.
+ +
The EXIF/TIFF standard allows for blocks of unreferenced data to +exist in an image. Some digital cameras write JPEG or TIFF-based RAW files +which contain large blocks of unused data, usually filled with binary zeros. +The reason for this could be to simplify camera algorithms by allowing +variable-sized information to be written at fixed offsets in the output image. +When ExifTool rewrites an image it does not copy these unused blocks. This can +result in a significant reduction in file size for some images. [The +-htmlDump option may be used to view the file structure if you are +interested in seeing these unused data blocks -- use a command like +"exiftool -htmlDump a.jpg > out.html", then open +out.html in your web browser. Unused data blocks are +brown in this output.]
+ +
Also, the size of an XMP record may easily shrink or grow when it is +rewritten, even if no meta information is changed. This is partly due to the +fact that the XMP specification recommends a few KB of padding at the end of the +record (ExifTool adds 2424 bytes by default, but this padding is omitted if the +-z command-line option or the +API Compact NoPadding setting is used), and +partly due to the flexibility of the XMP format which allows the information to +be written in various styles, some of which are more compact than others (the +-z option and the API Compact +settings also cause a more compact form to be written).
+ +
You may also notice that the values of some "offset" tags (like +ThumbnailOffset and PreviewImageStart) may change when the file is rewritten. +This is normal, and simply indicates that the associated data is now stored at a +different position within the file.
+ +
ExifTool does not modify the image data itself, so editing a file +with ExifTool is "lossless" as far as the image is concerned.
+ + +

14a. "What format do I use for writing GPS coordinates?", or
+14b. "How do I change the format of extracted GPS coordinates?"

+ +
ExifTool is very flexible in the formats allowed for entering GPS +coordinates. Any string containing between 1 and 3 floating point numbers is +valid. The numbers represent degrees, (and optionally) minutes and +seconds with any number of decimal places.
+ +
For EXIF GPS coordinates, the reference direction is specified +separately with the EXIF:GPSLatitudeRef or EXIF:GPSLongitudeRef tag. +GPSLatitudeRef may be written with a string containing "N", +"North", "S" or "South", or with a signed +coordinate value (positive for the northern hemisphere or negative for the +south). GPSLongitudeRef accepts similar values, but for E/East (positive) and +W/West (negative).
+ +
For XMP GPS coordinates, the reference direction is specified within +the XMP:GPSLatitude or XMP:GPSLongitude value, with west longitudes and south +latitudes being specified either by negative coordinate values or by ending the +string with "W" or "S".
+ +
Here are some examples of equivalent ways to specify a GPS +latitude in both EXIF and XMP: + +
exiftool -exif:gpslatitude="42 30 0.00" -exif:gpslatituderef=S a.jpg
+exiftool -exif:gpslatitude="42 deg 30.00 min" -exif:gpslatituderef=S a.jpg
+exiftool -exif:gpslatitude=42.5 -exif:gpslatituderef=S a.jpg
+
+exiftool -xmp:gpslatitude="42 30 0.00 S" a.jpg
+exiftool -xmp:gpslatitude=42.50S a.jpg
+exiftool -xmp:gpslatitude=-42.5 a.jpg
+
+ +Similar styles may be used for longitude. ExifTool will convert any of these +coordinate styles to the proper format for the specific tag used. +
+ +
ExifTool 12.22 and later allow combined lat/lon GPSCoordinates +values to be written to GPSLatitude and GPSLongitude, and the appropriate +latitude or longitude part will be pulled from the input string.
+ +
When reading, by default ExifTool reports coordinates in the format +
DDD deg MM' SS.SS"
+where DDD is degrees, MM is minutes, and SS.SS +is seconds. The -n option may be used to change this to decimal +degrees, or any arbitrary format may be specified with the -c +command-line option (see the application documentation), +or the API CoordFormat option. +
+ + +

15. "I get MakerNote warnings or errors when reading or writing information"

+ +
Problems like this may be caused by image editing software which +doesn't properly update offsets in the MakerNotes when rewriting an image. These +offsets are used as pointers to reference tag values and structures within the +metadata, and errors like this may lead to missing or incorrect values for some +MakerNotes tags. In many cases, ExifTool will detect this type of problem and +issue a warning like this when reading (or an error when writing): + +
Warning: [minor] Possibly incorrect maker notes offsets (fix by -340?)
+
+ +[Be aware that if multiple warnings occur, the -a +option must be used to see them all, since by default only one warning is +displayed per file.]
+ +
This is a particularly insidious problem that is sometimes difficult +for ExifTool to correct automagically, so it requires some operator +intervention. If this warning occurs, you have a few alternatives:
+ +
1) Use the -F option to allow ExifTool to attempt to +fix the incorrect offsets. If ExifTool was correct in its diagnosis, then this +option will fix the incorrect offsets. This is usually the appropriate choice +if this problem was caused by editing the image with other +software.
+ +
2) Use the -m option to ignore the warning (or downgrade +the error to a warning when writing). This causes ExifTool to honour the +existing maker note offsets, and may be the correct choice if images straight +out of the camera have this problem.
+ +
Often, the first choice (-F) is the right thing to do, +but this depends on many factors, so it is best to try both methods then compare +the resulting maker note information to see which works best for your +situation.
+ +
When writing, -F applies a permanent correction to the +maker notes. Note that some MakerNote information may be lost permanently +if the proper correction is not applied when writing images with this +problem.
+ +
3) The third alternative is to adjust the maker note offsets by a +specific amount. This is done by appending an integer to the -F +option. For example, with the warning above (where ExifTool suggests "fix by +-340?"), -F would be equivalent to -F-340. See the +-F option documentation for +more details. This advanced feature may require some technical knowledge about +the structure of EXIF information (and here, ExifTool's -htmlDump +feature may be very useful for visualizing this structure).
+ +
Other types of MakerNote errors may also prevent the file from +being written. However, most MakerNote errors are designated as minor, +which allows them to be ignored by using the -m option. For +example: + +
Error: [minor] Bad format (65535) for MakerNotes entry 17
+
+ +Using -m will downgrade the minor error to a warning, allowing the +file to be written, but some MakerNote information may be lost when ignoring +errors like this.
+ +
You may also get one of these warnings when reading or writing a +file containing unknown maker notes: + +
Warning: [minor] Unrecognized MakerNotes
+Warning: [minor] Maker notes could not be parsed
+ +These warnings indicate that ExifTool didn't recognize the maker notes in a +file, so it couldn't extract any information from them when reading, or had to +copy the maker notes as a block when writing. If the maker notes contain +absolute offsets then this could result in corrupted makernote information when +writing, but this is very unlikely.
+ + +

16. "Why doesn't ExifTool rename my AVI files?"

+ +
By default, ExifTool only processes writable file +types when any +tag is being written and a +directory name is specified on the command line. To force exiftool to process +other files, they must either be listed on the command line by name, or be +specified using the -ext or -ext+ option, something +like this: + +
# process AVI files in addition to other writable file types
+exiftool -ext+ AVI -d pics/%Y/%m "-directory<dateTimeOriginal" DIR
+
+# process only AVI and JPG files
+exiftool -ext AVI -ext JPG -d pics/%Y/%m "-directory<dateTimeOriginal" DIR
+
+ +When -ext is used, only files with the specified extension(s) are +processed, however -ext+ may be used to add to the list of normally +processed files (as in the first example above). Multiple -ext or +-ext+ options may be used in the same command (as in the second +example above) to process any number of different file types, or +-ext "*" may be used to process files with any extension (or none at all). +
+ +
The +-listwf option may be used to list the extensions of all writable +file types, or see here for a table of +supported file types. +
This includes "pseudo" tags like +FileName, Directory, FileModifyDate and FileCreateDate.
+ + +

17. "List-type tags do not behave as expected"

+ +
Tags indicated by a plus sign (+) in the +tag name documentation are list-type tags. +Two examples of common list-type tags are +IPTC:Keywords and +XMP:Subject. These tags may contain multiple +items which are combined into a single string when reading. (By default, +extracted list items are separated by a comma and a space, but the +-sep option may be used to change this.) When writing, separate +items are assigned individually. For example, the following command writes +three keywords to all writable files in directory DIR, replacing +any previously existing keywords: + +
exiftool -keywords=one -keywords=two -keywords=three DIR
+
+ +List items are assigned separately as above, NOT all together, because this +would represent a single keyword: + +
exiftool -keywords="one, two, three" test.jpg  (WRONG!)
+
+ +The -sep option may be used to split values of list-type tags into +separate items when writing. For example, + +
exiftool -sep ", " -keywords="one, two, three" DIR
+
+ +will store three separate keywords, the same as the first example above. This +feature may also be used to split a tag value into separate items if it was +originally stored incorrectly as a single string: + +
exiftool -sep ", " -tagsfromfile @ -keywords test.jpg
+
+ +However, sometimes it is desirable to have list items which contain a comma, and +this is allowed: + +
exiftool -contributor="Harvey, Phil" -contributor="Marley, Bob" a.jpg
+
+ +But to distinguish these entries when extracting information, a different list +separator or a different output format must be used. For instance, the +following command uses "//" to separate list items, + +
exiftool -contributor -sep "//" a.jpg
+
+ +and produces an output like this: + +
Contributor  : Harvey, Phil//Marley, Bob
+
+ +Alternatively, the -j, -php and -X +options use an output format which preserves the structure of a +list (if -sep is NOT used).
+ +
Note that the writing examples above overwrite any values which +already existed in the original file for these tags. Instead, to add or delete +items from an existing list, use "+=" or "-=" in place +of "=". For example: + +
exiftool -keywords+="add this" -keywords-="remove this" DIR
+
+ +With commands like this, new items are added to the list in place of the first +deleted item, or at the end of the list if no items were removed.
+ +
Note: Using "=" is equivalent to "+=" in +any command where the same List-type tag is set with "+=" or +"-=" in another assignment. (ie. existing items will be preserved +unless specifically deleted with "-=".) [For non +List-type tags, "+=" has a different meaning, and is used to +increment numerical values or shift dates.]
+ +
To prevent duplication when adding new +items, specific items can be deleted then added back again in the same +command. For example, the following command adds the keywords "one" and "two", +ensuring that they are not duplicated if they already existed in the keywords of +an image: + +
exiftool -keywords-=one -keywords+=one -keywords-=two -keywords+=two DIR
+
+ +When copying list tags using the -tagsFromFile feature, +items are copied individually to form proper lists if the tag is copied directly +(note that -tagsFromFile @ is implied by the "<" +operation in this and the following commands, causing tags to be copied from the +original file): + +
exiftool "-keywords<subject" DIR
+ +However, this is not the case if the tag is interpolated within a format string +(ie. has a leading "$" symbol), like this + +
exiftool "-keywords<$subject" DIR  (WRONG!)
+ +but here the -sep option may be used to split the list back into +separate items: + +
exiftool "-keywords<$subject" -sep "//" DIR
+ +Note there is a complication when copying multiple tags to a single list +tag: Here, any assignment to a tag overrides earlier assignments to the same +tag in the command. For instance, this command: + +
exiftool "-keywords<filename" "-keywords<comment" DIR  (WRONG!)
+
+ +writes only the value from the Comment tag. This may seem strange, but it prevents +duplicate items from being added to a list when copying a group of tags from a +file containing duplicate information. Alternatively, the +-addTagsFromFile option may be used to accumulate items when +copying from multiple tags: + +
exiftool -addTagsFromFile @ "-keywords<filename" "-keywords<comment" DIR
+
+ +Note that as with "=" in the first three examples above, the +"<" operation of this command overwrites any Keywords that +existed previously in the original file. To add to or remove from the existing +keywords, use "+<" or "-<". +
+ + +

18a. "Special characters don't display properly in my Windows console", or +
18b. "I'm having problems with special characters on the Windows command line"

+ +
The Windows cmd.exe console uses an MS-DOS encoding by default +(cp437 or something similar, depending on your region). The exiftool +-charset option may be used to encode the exiftool output for a +specific Windows code page, which may help display some special characters, but +instead it may be better to switch the console to UTF‑8 (the native +ExifTool character encoding). This is especially useful if you are using the +-lang option to translate exiftool output to another language. To +change the the Windows console to UTF‑8, follow these steps: + +
  1. Run "cmd.exe" to open a Windows console (select "Run..." from the +Start menu and enter "cmd").
  2. +
  3. Change the font in the console Properties to any True Type font (eg. "TT +Lucida Console").
  4. +
  5. Type "chcp 65001" then press ENTER at the command prompt.
  6. +
+ +The console should now be able to display UTF‑8 characters (cp65001). But +note that the TT Lucida Console font shipped with Windows, at least my version, +may not be very complete, and doesn't seem to contain Japanese or Chinese +characters.
+ +
To permanently set the font, select "Save properties for future +windows" when changing the font Properties. Also, you can automatically run +"chcp 65001" every time "cmd.exe" is launched by changing the +Windows Registry for the Command Processor: Run "regedit" and put "chcp +65001" into Data field for "HKEY_LOCAL_MACHINE\Software\Microsoft\Command +Processor\Autorun". (Unfortunately, I haven't been able to figure out how to +change the code page for exiftool when launched via the Windows GUI. If anyone +can figure out how to do this, please let me know.) +
+ +
Note that Windows will recode arguments on the command +line from the current console code page to the system code page, so the +ExifTool -charset should be set to the system code page for +command-line arguments. However, this technique may yield unexpected results +since not all characters may be represented using the system code page. To get +around this limitation, arguments may be read from an ExifTool argument file +using the -@ option. UTF‑8 encoding is recommended for the +argument file, and with this you would also set -charset filename=utf8 +if using special characters in filename arguments within the file.
+ +
Another way to bypass the console/command-line encoding problems for +individual tag values is to extract/write to/from a separate text file and use a +UTF‑8 aware text editor to view/edit the text. For example: + +
# extracting...
+exiftool image.jpg > out.txt
+
+# writing...
+exiftool "-subject<=subject.txt" image.jpg
+ + +

19. "How do I change the format of an extracted tag value?"

+ +
The exiftool application has built-in options which allow you to +display numeric values (-n), escape special HTML characters +(-E), and change the date/time (-d) and GPS coordinate +(-c) formats, but sometimes more control is needed over the +formatting of a value...
+ +
The -p and -tagsFromFile options provide +an advanced translation feature that allows arbitrary Perl expressions to be +used to modify tag values. The basic syntax is this: + +
${TAG;EXPR}
+ +where TAG is the tag name, and EXPR is a Perl +expression acting on the default input variable ($_), which is +initially the original value of the tag. For example, the following command +sets the FileName from Artist, translating spaces to underlines: + +
exiftool '-filename<${artist;tr/ /_/}.%e' image.jpg
+ +(Note: Use single quotes as above in Mac/Linux, or double quotes instead +in Windows.)
+ +
Another technique is to create a user-defined Composite tag to do +the reformatting. Here is a basic config file that reformats the Artist tag to +provide a new MyArtist tag with the same character translation as the example +above: + +
%Image::ExifTool::UserDefined = (
+   'Image::ExifTool::Composite' => {
+       MyArtist => {
+           Require => 'Artist',
+           ValueConv => '$val =~ tr/ /_/; $val',
+       },
+   },
+);
+1; # end
+
+ +With this config file, an Artist value of "Phil Harvey" yields a corresponding +MyArtist value of "Phil_Harvey". The ValueConv string may be any valid Perl +expression, and is evaluated to obtain the value for the new tag. In this +expression, $val represents the ValueConv value of the Require'd +tag.
+ +
To activate the config file, it must be named +".ExifTool_config" and placed either in your home directory or in +the same directory as the exiftool application. Note that the file name begins +with a ".", so if you are in Windows or on a Mac you may need to +rename the file from the command line since the GUI might not like file names +beginning with a ".". [An alternative is to load the +config file with the -config option -- see the +application documentation +for details.]
+ +
User-defined Composite tags have many other features, including the +ability to combine the values of multiple tags. See the +config file documentation for more details about +user-defined tags, and lib/Image/ExifTool/README in the full distribution for a +complete description of ValueConv features. Also, a +quick +search of the ExifTool forum should reveal a number of user-defined tag +examples, and there are other good (and often more complex) examples which can +be found in the %Image::ExifTool::Exif::Composite hash of the +lib/Image/ExifTool/Exif.pm source code. +
+ + +

20a. "ExifTool won't write an image due to errors", or +
20b. "How do I repair corrupted EXIF?"

+ +
Minor errors may be ignored using the -m option +(FAQ 15 discusses this with respect to MakerNote errors), but +sometimes there are more serious errors which can't be ignored. ExifTool may be +used to fix metadata problems in JPEG images by deleting all metadata and +rebuilding it from scratch. The command looks like this: + +
exiftool -all= -tagsfromfile @ -all:all -unsafe -icc_profile bad.jpg
+
+ +where "bad.jpg" is the name of the image that requires fixing. This +command deletes all metadata then copies all writable tags that can be extracted +from the original image to the same locations in the updated image. The +"Unsafe" tag is a shortcut +for unsafe EXIF tags in JPEG images which are not normally copied. JPEG images +may also contain an ICC color profile which should be preserved. The +"ICC_Profile" tag is also marked as unsafe, but is not part of the +EXIF so it isn't covered by the "Unsafe" shortcut and must be +specified separately.
+ +
After repairing an image like this you should be able to write to it +without errors, but note that some metadata from the original image may have +been lost in the process.
+ +
Note: ExifTool will not modify the JPEG image data, so if the +image itself is corrupted (eg. if you get a message saying "Not a valid JPEG"), +then ExifTool can not be used to repair the image. Also, ExifTool may not +be used like this to repair TIFF-based files or RAW files -- the risk of image +corruption is too great because the image is stored in the same IFD as the +metadata in these files.
+ +
If there are also MakerNote problems in the file, you may want to +add the -F option to the command. See FAQ 15 +for details. For example, to rebuild the EXIF only and fix the MakerNote +offsets you could do this: + +
exiftool -exif:all= -tagsfromfile @ -exif:all -unsafe -thumbnailimage -F bad.jpg
+
+ +Advanced: The byte order of the newly created EXIF is set by the value of +the ExifByteOrder tag. Since this tag does not belong to the EXIF group, it is +not copied with -exif:all above (but would be copied with +-all:all as in the first example). If ExifByteOrder is not set +then the byte order is determined by the ordering of the MakerNotes if they are +copied, otherwise big-endian ("MM") byte order is used by default. +ExifByteOrder may be set to a specific value to force a particular byte order +when creating new EXIF (eg. "-ExifByteOrder=II" for little-endian). +
+ + +

21. "How do I read/write values containing newline characters?"

+ +
When reading, by default exiftool converts all control characters to +"." to avoid messing up the output formatting, so newlines will appear as a "." +in the output. The -b option may be used to bypass all output +formatting (except that a line-feed character is inserted between items in a +list), but this may not be appropriate when the values of many tags must be +extracted. In this case, the formatted output (-p), JSON +(-j), XML (-X) and PHP (-php) options +provide alternative output formats which preserve newlines in values.
+ +
Alternatively, the API Filter option +may be used to apply an arbitrary filter to all extracted values. For example, +the following command changes newlines to "\n": + +
exiftool -api filter="s/\n/\\n/g" FILE
+ +When writing, there are a number of options: + +
    +
  1. In many shells, a newline may be inserted directly in the command +line: +

    Bourne shells (press RETURN inside a quoted string)

    +
    exiftool -comment="line 1
    +line 2" image.jpg
    +
    +

    (Also, in Bourne shells the character sequence $'\n' +may be used for a newline.)

    +

    C shells (press "\" then RETURN inside a quoted string)

    +
    exiftool -comment="line 1\
    +line 2" image.jpg
    +
    +[Unfortunately the Windows cmd shell provides no method to get a +newline (CR/LF in Windows) into the command line. A linefeed (LF) may be +inserted with CTRL-T, but I have found no way to insert a carriage return +(CR).]

    +
  2. +
  3. Use the -ec or -E option to allow C-style escape +sequences or HTML character entities (Note: +In Windows a newline is "\r\n" or "&#xd;&#xa;" +instead of just "\n" or "&#xa;"). For example, +using C-style escape sequences: +
    exiftool -ec "-comment=line 1\nline 2" image.jpg
    +or using HTML character entities: +
    exiftool -E "-comment=line 1&#xa;line 2" image.jpg
    +
  4. +
  5. Write the tag from the contents of a separate text file: +
    exiftool "-comment<=file.txt" image.jpg
    +
  6. +
  7. Use $/ in a redirection expression: (Note: Single quotes +must be used in Mac/Linux shells around arguments containing a dollar sign, +but double quotes are used instead in Windows. Also note that this technique +is slower since the implied -tagsFromFile adds an extra unnecessary +processing pass to read tags from the file, but most of this delay may be +avoided with the -fast3 option.) +
    exiftool '-comment<line 1$/line 2' image.jpg
    +
  8. +
  9. Use the "#[CSTR]" feature to allow C-style escape sequences +for a specific line in a -@ argfile. For example, this command: +
    exiftool -@ test.args image.jpg
    +with this "test.args" file: +
    #[CSTR]-comment=line 1\nline 2
  10. +
+
+ + +

22. "In what order are command-line assignments applied when writing?"

+ +
When writing, tag assignments on the command line are queued and +applied together as each target file is processed. In general, assignments +later on the command line override earlier assignments (ie. they are evaluated +left-to-right), but there are exceptions: +
  1. When writing list-type tags (eg. -keywords=one), new values +are accumulated rather than overriding earlier assignments.
     
  2. +
  3. When copying values to list-type tags (eg. +"-keywords<filename"), new values are accumulated only if +-addTagsFromFile is used, otherwise they override earlier +assignments if -tagsFromFile is used or implied.
     
  4. +
  5. Tags copied with the -tagsFromFile option are assigned in +order, and all together at the point in the command line where the +-tagsFromFile option is located, regardless of whether these tags +are specified immediately after the -tagsFromFile option or later +on the command line. Remember that "-tagsFromFile @" is implied +unless another file is specified when redirecting information with arguments +like "-DSTTAG<SRCTAG".
Note: When copying tag values, +adding to lists, or shifting date/time values, the source value is always the +original value found in the file, regardless of any previous assignments. For +example, the following command sets Subject to the original value of Title in +the file (NOT to "test"): +
exiftool -title=test "-subject<title" a.jpg
+ + +

23a. "Why do I get '0 image files updated' when writing?", or
+23b. "ExifTool doesn't write some tags to a file"

+ +
There are a few reasons why this may happen: + +
  1. The value of the tag is not being set correctly.
+ +This may be due to a tag value which can't be converted, in which case you +should warning like this (note: you may need to use the -v3 option +to see the warning if other same-named tags are being set properly by the same +assignment): +
Warning: Can't convert IFD0:Orientation (not in PrintConv)
+
+You get this warning if you write an invalid value to a tag which accepts only +specific values. See the "Values" column in the appropriate table of the +tag name documentation for a list of valid +values for these types of tags. The value conversion may also be bypassed with +the -n option, allowing numerical values to be written directly. +See FAQ number 6 for more details. + +
  1. The information type isn't supported by the format of the +target file.
+ +Warnings are NOT generated when a tag isn't written because it is +normal that many tags can't be written when copying between files of different +formats.
+ +
Tags are not written if the format of the target file doesn't +support the specific type of meta information. For example, CRW images do not +support EXIF or IPTC metadata. See the +Supported File Types table for an indication +of the tags supported by your file. If the tags aren't supported for your file +type, then a metadata sidecar file is an +alternative.
+ +
Also note that MakerNotes tags can not be created or deleted +individually, so they can only be written if they already exist in a +file. The entire MakerNotes must be created or deleted as a block (see +FAQ number 8 for details). + +
  1. A time value is being shifted but the specified tag doesn't +exist.
+ +For example, -datetimeoriginal+=1 will have no effect unless +the DateTimeOriginal tag exists in the image.
+ + +

24. "When I write a file the date/time gets reset to today's date"

+ +
You should be aware of the difference between date/time values +stored in the metadata of the file itself and date/time values stored in the +filesystem (ie. in the disk directory information). A command like this may be +used to extract all date/time information with an indication of where it is +stored: + +
exiftool -time:all -a -G0:1 -s c:\images\test.jpg
+ +and should give an output something like this: + +
[File:System]   FileModifyDate                  : 2009:10:05 20:40:36-04:00
+[File:System]   FileAccessDate                  : 2009:10:07 09:22:12-04:00
+[File:System]   FileCreateDate                  : 2009:10:05 20:40:36-04:00
+[EXIF:IFD0]     ModifyDate                      : 2003:10:31 15:44:19
+[EXIF:ExifIFD]  DateTimeOriginal                : 2003:10:31 15:44:19
+[EXIF:ExifIFD]  CreateDate                      : 2003:10:31 15:44:19
+ +The -G0:1 option causes the family 0 and 1 group names to be +reported in square brackets for each tag. Tags labelled "File:System" +are "pseudo" tags stored in the filesystem, while the others are real +tags stored in the metadata of the file.
+ +
ExifTool's default behaviour is to set all filesystem times to +the current date/time when any "real" tag is written, but the +-P option may be used to preserve the original FileModifyDate. +FileAccessDate represents the time the file was last accessed, and is set to the +current date/time whenever any software (including ExifTool) accesses the +file.
+ +
On systems where a filesystem creation date is maintained, ExifTool +also sets this to the current date/time when the file is edited. On Windows the +creation date is readable/writable through the FileCreateDate tag (see the +Extra Tags documentation), and is preserved +with the -P option. On MacOS, FileCreateDate is available but +extracted only if specified explicitly, and is writable only if "setfile" is +available. The -P option does not preserve the creation date when +editing a file on Mac systems, but the -overwrite_original_in_place +option may be used to preserve all Finder information including the creation +date, or the FileCreateDate may be copied back specifically (ie. +-tagsfromfile @ -FileCreateDate). On Linux, the file creation date +is not stored.
+ +
For example, commands like this act on common metadata tags, setting +the filesystem modification date/time to the current date/time: + +
# common metadata date/time tags are incremented by 1 hour, while
+# FileModifyDate is set to the current date/time
+exiftool -alldates+=1 c:\images
+ +[The AllDates tag is a shortcut which represents the 3 common +metadata date/time tags: DateTimeOriginal, CreateDate and +ModifyDate.]
+ +
However, FileModifyDate may be preserved with the -P +option: + +
# FileModifyDate is not changed
+exiftool -alldates+=1 -P c:\images
+ +ExifTool also allows FileModifyDate to be written, which provides full control +over the filesystem modification date/time when writing: + +
# FileModifyDate is incremented by 1 hour
+exiftool -alldates+=1 -filemodifydate+=1 c:\images
+
+# FileModifyDate is set from the value of DateTimeOriginal
+# (before DateTimeOriginal is incremented by 1 hour)
+exiftool -alldates+=1 "-filemodifydate<datetimeoriginal" c:\images
+
+ + +

25. "Can ExifTool be used as an image validator?"

+ +
ExifTool is not designed as an image validator but it does have a +-validate feature which enables extra validation checks, mainly for +JPEG and TIFF-format images (officially released in version 10.97, May 2018, +but continually being improved). Here is an example command to apply these +validation checks to a JPEG image: + +
exiftool -validate -warning -error -a test.jpg
+ +Note there are other packages specifically designed for file validation, for +example: JHOVE.
+ + +

26. "How do I import information from a database?"

+ +
[See FAQ number 12 for help with the reverse +-- exporting metadata to a database.]
+ +
ExifTool has the ability to import metadata from CSV and JSON format +database files for writing to output image files. For example, the following +commands use imported metadata to write to all image files in a directory. + +
# import from CSV file
+exiftool -csv="c:\Users\Phil\test.csv" "c:\Users\Phil\Images"
+
+# import from JSON file
+exiftool -json="c:\Users\Phil\test.json" "c:\Users\Phil\Images"
+ +For the above commands, the input CSV or JSON file must have the same format as +the output from these commands: + +
# export to CSV file
+exiftool -csv "c:\Users\Phil\Images" > "c:\Users\Phil\test.csv"
+
+# export to JSON file
+exiftool -json "c:\Users\Phil\Images" > "c:\Users\Phil\test.json"
+ +Specifically, the first row of the CSV file must contain the tag names. +The first column must be a special "SourceFile" column, containing the names of +the associated image files, with paths specified in the same way as on the +command line. The JSON file contains similar entries, but is not structured in +row/column format.
+ +
For each image file specified on the command line, all tags for the +database entry with the corresponding SourceFile name are written (with the +exception of the FileName and Directory tags, which are ignored). A special +SourceFile name of "*" may be used to match any image file. A warning is issued +and nothing is written if a specified file does not match any SourceFile entry +in the database.
+ +
Tag names may be prefixed by a group name to write to a specific +group (using the same format as when -G or -G1 is +added to the export command). To delete a tag, set the tag value to "-" (or the +MissingTagValue if this API option +was used) and use the -f option when importing. Tags with an empty +value are ignored in a CSV import, or set to an empty string in a JSON import +(unless -f is used and the +API MissingTagValue option is set to +an empty string, in which case the tag is deleted).
+ +
See the -csv or -j option in the +application documentation +for more details.
+ + +

27. "My ExifTool command doesn't work from a Windows .BAT file"

+ +
In a Windows .BAT file the "%" character is +significant, so all "%" characters in ExifTool commands must be +changed to "%%". For example, this command line: + +
exiftool "-FileName<CreateDate" -d "%Y%m%d_%H%M%S.%%e" image.jpg
+ +must be changed to this in a .BAT file: + +
exiftool "-FileName<CreateDate" -d "%%Y%%m%%d_%%H%%M%%S.%%%%e" image.jpg
+
+ + +

28. "How do I copy a shifted date/time value?"

+ +
The -TAG+= and -TAG-= arguments always act +on the existing tag value, so they can not be used to shift a new +tag value without running a second command. For example, this is wrong +because the copy operation is superseded by the shift, and the result is that +the existing DateTimeOriginal is shifted back by two hours: + +
exiftool "-datetimeoriginal<filemodifydate" -datetimeoriginal-=2 image.jpg  (WRONG!)
+
+ +The -globalTimeShift option fills this niche -- it shifts all +date/time tags by the specified amount when reading or copying, allowing a +shifted date/time value to be copied to another tag. So this is the proper +technique for shifting a date/time value when copying: + +
exiftool "-datetimeoriginal<filemodifydate" -globaltimeshift -2 image.jpg
+ +An alternative is to use the ShiftTime function of the +advanced formatting feature: + +
exiftool '-datetimeoriginal<${filemodifydate;ShiftTime("-2")}' image.jpg
+ +(Note: Swap the single and double quotes when running this command under Windows.) +
+Programmers: Here are the equivalent ExifTool API function calls: +
# using the GlobalTimeShift option
+$exiftool->Options(GlobalTimeShift => '-2');
+$exifTool->SetNewValuesFromFile($src, 'datetimeoriginal<filemodifydate');
+
+# using ShiftTime in an advanced formatting expression
+$exifTool->SetNewValuesFromFile($src, 'datetimeoriginal<${filemodifydate;ShiftTime("-2")}');
+
+ + +

29. "My options don't work in a -@ ARGFILE"

+ +
The ExifTool application has the ability to read options from an +ARGFILE using the -@ option. The parsing of these arguments is +different from the command line. Arguments in this file are separated by +newline characters instead of spaces. Also, arguments should not be quoted. +For example, on the command line you may have: + +
-d "%Y:%m:%d %H:%M:%S"
+ +but in an ARGFILE, this should be + +
-d
+%Y:%m:%d %H:%M:%S
+ + +

30. "How do I extract absolutely all metadata from a file?"

+ +
By default, duplicate tags, unknown tags, embedded tags, and System +tags that require external utilities are not extracted. The main reason for +this is performance; extracting these tags will significantly increase +processing time for some files. The following command extracts everything +possible with ExifTool: + +
exiftool -ee3 -U -G3:1 -api requestall=3 -api largefilesupport FILE
+ +(The -G3:1 option is included in the above command only to give an +indication of where the metadata was stored.)
+ + +

31. "Why does ExifTool rewrite the entire file when I am only changing one small thing?"

+ +
Generally it is possible in theory to edit existing fixed-length tags without having to rewrite an entire file, but ExifTool doesn't do this for 3 reasons: + +
    +
  1. The algorithm to do this would be completely different than the more general +and powerful case where you want to be able to add/delete tags and/or write +values with different lengths. Plus, implementing this feature would be a lot +of work, and it would only be useful in certain situations.
  2. +
  3. Some file formats (like MP4) allow metadata to be written at the beginning +or the end of a file. Writing it at the end of the file could avoid the need to +rewrite the entire starting section, but metadata is more useful at the start of +a file because then other programs (especially ones that stream the file over +the internet) don't have to read through the entire file to find the metadata. +Also, some software won't read metadata that comes at the end of a file +(probably for this reason).
  4. +
  5. ExifTool is designed to allow files to be read/written via pipes, which are +not seekable, so in-place editing is not possible with these files and again, +like 1, two completely different algorithms would be required.
  6. +
+ +
+Last revised Jun 11, 2022 +

<-- Back to ExifTool home page

+ + diff --git a/html/filename.html b/html/filename.html new file mode 100644 index 0000000..6c07279 --- /dev/null +++ b/html/filename.html @@ -0,0 +1,379 @@ + + + + FileName and Directory tags + + + + +

Writing "FileName" and "Directory" tags

+ +

By writing the FileName and/or Directory pseudo tags, ExifTool +can be used to rename and/or move images into directories according to any +information contained in the image. This is a powerful feature when combined +with the -tagsFromFile ability to copy the values from other tags. +The most common use of this feature is to organize images by date/time, but any +other tag value may also be used.

+ +

Writing the Directory tag moves a file to a specified directory. The +directory is created if it doesn't already exist.

+ +

Writing the FileName tag renames a file. If the new FileName +has a directory specification (ie. contains a '/' character), then +the file is also moved to the specified directory (see +example 6 below), and the directory is created if necessary. +Existing files will not be overwritten (but see "Warning" below).

+ +

The write-only TestName tag provides a mechanism for dry-run testing +of the rename feature. Writing TestName displays the old and new names +without making any changes to the files. (Note that there is no corresponding +test tag for Directory, but TestName supports a full path name +just like FileName, so the directory may be tested as well.)

+ +

When writing the FileName, Directory or TestName tag, +%d, %f and %e may be used to represent +the directory, name and extension of the original file (in a similar way to the +-o, -w and -tagsFromFile options). Also, +%c may be used to add a copy number to the output file name to +avoid collisions with existing file names. Note that these codes must be escaped +with an extra % if used within a date format string. Modifiers may +also be used to change the default behaviour of these format codes. See the +-w option in the application +documentation for details.

+ +

When organizing files by date/time, the -d (date format) option +is essential for specifying a format for the date/time tag(s) used to generate +the new file and/or directory name. The examples below demonstrate the use of +this feature. Also, a list of of common date format codes +is provided for reference.

+ +
Advanced feature: The write-only +HardLink tag may be written using a technique similar to FileName. +Instead of renaming or moving the file, writing HardLink creates a hard +link with the specified name. This feature allows files to be organized without +affecting the originals. See the Extra Tags +documentation for more information.
+ +

Notes:

+ +

Writing the FileName and/or Directory tags alone causes the +file to be renamed or moved, not copied. However, if any "real" tags are +written at the same time, then the file is rewritten to the new destination and +the original file is left unchanged. (Only writable system tags may be set +without causing the file to be rewritten.) If desired, the +-overwrite_original option may be used to remove the original copy +when the file is rewritten.

+ +

Conversely, the -o option may be used to force exiftool to +always create a copy of the file, even if no meta-information tags are written. +This is true even if the -o option is superseded by writing the +Directory tag, or through a FileName which includes a directory +specification. (See example 5 below. Also see +example 11 for the directory precedence rules.)

+ +

If the -d option is used, the unformatted date/time value must +be valid (ie. in the form "YYYY:mm:dd HH:MM:SS"), otherwise the +date formatting will fail and the file will not be renamed or moved (but this may +be changed via the API StrictDate option).

+ +

Also note that the -d formatting applies to date/time tags used +in -if conditions unless the print conversion is disabled by adding +a # suffix to the tag name.

+ +

In a Windows batch file, all % characters must be escaped as +%%. This can result in extreme format codes like +%%%%f when using the -d option.

+ +
Warning: +Writing illegal file names in Windows can have unpredictable results and +may result in data loss. Illegal characters in Windows file names are: +
    / \ ? * : | " < >
+Any tag used in generating a file name which may contain these characters must +first be filtered to remove or translate these characters. A special feature +allows these characters to be removed from a tag value by adding a semicolon +inside the braces after a tag name. For example: +
    exiftool "-filename<${model;}.%e" c:\images
+This advanced formatting feature may also be used to do arbitrary reformatting +of any tag value used in a format string. See the -p option in the +application documentation for more details. +
+ +

Examples

+ + +
 0. +exiftool -d %Y%m%d_%H%M%%-c.%%e "-testname<CreateDate" DIR +
+
+The TestName tag is used for dry-run testing of the file renaming +feature. The above command is identical to that of the next example except that +TestName is written instead of FileName. So instead of renaming +the files, this command prints the old and new file names without actually +changing anything. For example: +
> exiftool -d %Y%m%d_%H%M%%-c.%%e "-testname<CreateDate" tmp
+'tmp/a.jpg' --> 'tmp/20031031_1544.jpg'
+'tmp/b.jpg' --> 'tmp/20010519_1836.jpg'
+    1 directories scanned
+    0 image files updated
+    2 image files unchanged
+
+ + +
 1. +exiftool -d %Y%m%d_%H%M%%-c.%%e "-filename<CreateDate" DIR +
+
+Rename all images in directory 'DIR' to names like +'20060327_1058-2.jpg', with individual file names derived from the +value of the CreateDate (plus a copy number with a leading '-' if a +file with the same name already exists), and with the same extension as the +original image. [Note that copying tag values with '<' implies +'-tagsfromfile @' unless otherwise specified. See the +-tagsFromFile description in the +application documentation for details.] +

FAQ: "Why doesn't this command rename my files?"

+

There are 2 common reasons for this:

+

a) When a directory name is specified, this command will only rename "writable" +files in the directory. Use 'exiftool -listwf' to list the +extensions of currently writable file types. The -ext option may +be used to rename other file types (eg. '-ext avi').

+

b) For this command to work, the CreateDate tag must exist in the source +file. Use 'exiftool -createdate FILE' to see if a file contains +this information. If it doesn't, you may need to use another date/time tag such +as DateTimeOriginal or FileModifyDate. To see all available date/time tags in a +file (and their locations), use 'exiftool -a -G1 -s -time:all FILE'.

+
+ + +
 2. +exiftool -d %Y-%m-%d "-directory<datetimeoriginal" image.jpg +
+
+Move 'image.jpg' into a directory with a name given by +DateTimeOriginal, in the form '2006-03-27'. +
+ + +
 3. +exiftool '-filename<%f_$imagesize.%e' dir +
+
+This example uses an expression to add the image size to the name of all images +in directory 'dir'. For example, this would rename a 640x480 image +called 'image.jpg' to 'image_640x480.jpg'. (Note that +the single quotes are necessary in Unix shells due to the '$' +symbol, but double quotes must be used instead when running in a Windows cmd shell.) +
+ + +
 4. +exiftool -r -directory=%e_images/%d pics +
+
+Recursively move all images based in directory 'pics' to +separate directory trees organized by file extension. For instance, in this +example the file 'pics/toys/new_car.jpg' is moved to +'jpg_images/pics/toys/new_car.jpg'. +
+ + +
 5. +exiftool -r -o %e_images/%d pics
+exiftool -r -o . -directory=%e_images/%d pics +
+
+Both of these commands have the same effect as example 4 above except that +images are copied instead of moved since the -o option was used. +The output directory specified by the -o option is overridden in +the second example by writing the Directory tag. This technique of using +-o with a dummy directory name is necessary when you want the files +to be copied instead of moved and the directory name is derived from the value +of other tags (eg. '-directory<createDate'). (Because the +values of other tags may not be used with the -o option.) +
+ + +
 6. +exiftool -r -d %Y/%m/%d/image_%H%M%S.%%e "-filename<filemodifydate" DIR +
+
+Recursively rename all images in 'DIR' and any contained +subdirectories to the form 'image_HHMMSS.EXT' (where +'ext' is the original file extension), and move them into a new +directory hierarchy based on date of file modification, with path names like +'2006/03/27/image_105859.jpg'. +
+ +

The following examples demonstrate the interaction of this feature with +other ExifTool options:

+ + +
 7. +exiftool -filename=new.jpg dir/image.jpg +
+
+Rename 'dir/image.jpg' to 'dir/new.jpg'. +
+ + +
 8. +exiftool -filename=new.jpg -comment=xxx dir/image.jpg +
+
+Copy 'dir/image.jpg', add a new comment, and write output to +'dir/new.jpg'. The original file 'dir/image.jpg' is +not changed. +
+ + +
 9. +exiftool -filename=new.jpg -comment=xxx -overwrite_original dir/image.jpg +
+
+Rewrite 'dir/image.jpg', adding a new comment and writing output to +'dir/new.jpg'. The original file 'dir/image.jpg' is +removed. +
+ + +
10. +exiftool -o tmp/ -filename=new.jpg image.jpg
+exiftool -o tmp/xxx.jpg -filename=new.jpg image.jpg
+exiftool -o tmp/new.jpg image.jpg +
+
+A file name or directory specified via the FileName or Directory +tag takes precedence over that specified by the -o option, so these +three commands all have the same effect: 'tmp/new.jpg' is created +without changing 'image.jpg'. Note that in the first command, the +trailing '/' on 'tmp/' is necessary if the +'tmp' directory doesn't already exist, otherwise 'tmp' +would be taken as a file name and 'new.jpg' would be created in the +current directory. As illustrated in example 4 above, the file is rewritten +instead of simply being renamed when the '-o' option is used. +
+ + +
11. +exiftool -directory=dir1 -filename=dir2/out.jpg -o dir3/ dir4/image.jpg +
+
+This example demonstrates the priorities of directory names specified using +different techniques. The output directory is taken from the first directory +specified from the following list: 1) the Directory tag, 2) the +directory part of the FileName tag, 3) the directory part of the +-o option, or 4) the source directory, in that order. The order of +the arguments on the command line is not significant. In this example, the +target file is copied (not moved, because the -o option was used) +to 'dir1/image.jpg'.
+
Note that both the FileName tag and the -o +option may be used without a directory specification, in which case the +directory with the next highest priority is used. Also note that if +-o specifies a directory, then the directory name must end with a +'/' or the directory must already exist, otherwise ExifTool will +interpret the last part as a file name. (eg. '-o images/test' +specifies the 'images' directory unless the +'images/test' directory already exists, while '-o +images/test/' unambiguously specifies the 'images/test' +directory.) +
+ + +
12. +exiftool -d %Y/%m "-directory<filemodifydate" "-directory<createdate" "-directory<datetimeoriginal" . +
+
Move image files from the current directory (.) into a +directory hierarchy based on year/month. In this command the Directory tag is +set from multiple other date/time tags. ExifTool evaluates the command-line +arguments left to right, and latter assignments to the same tag override earlier +ones, so the Directory for each image is ultimately set by the rightmost copy +argument that is valid for that image. Specifically, Directory is set from +DateTimeOriginal if it exists, otherwise CreateDate if it exists, and finally +FileModifyDate (which always exists) is used as a fallback.
+ + +
13. +exiftool -d %Y '-filename<$createdate/${model;}/${createdate#;DateFmt("%Y-%m-%d_%H%M%S")}.%e' pics +
+
Multiple date/time formatting codes become necessary when other +tags are place between date/time fields. The DateFmt helper +function is provided for this reason, and is applied to the unformatted tag +value (ie. tag name ending with '#') to achieve a different +date/time formatting in the same string. (Note that the single quotes are +necessary in Unix shells due to the '$' symbol, but double quotes +must be used instead when running in a Windows cmd shell.)
+ +

Common Date Format Codes

+

Date format codes are used in the argument to the -d option to +represent components of the date/time string. The codes listed below are common +to most systems, but additional codes may be available on your specific system +-- see your strftime man page for details. The default EXIF date/time +formatting is equivalent to '%Y:%m:%d %H:%M:%S'.

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
%a- abbreviated locale weekday name
%A- full locale weekday name
%b- abbreviated locale month name
%B- full locale month name
%c- preferred locale date/time representation
%d- day of month (01-31)
%f- fractional seconds (see note 1 below)
%H- hour on a 24-hour clock (00-23)
%I- hour on a 12-hour clock (01-12)
%j- day of year (001-366)
%m- month number (01-12)
%M- minute (00-59)
%p- 'AM' or 'PM'
%s- number of seconds since the Epoch, UTC (see note 2 below)
%S- seconds (00-59)
%w- weekday number (0-6)
%W- week number of the year (00-53)
%x- preferred locale date representation
%X- preferred locale time representation
%y- 2-digit year (00-99)
%Y- 4-digit year (eg. 2006)
%z- time zone in the form +/-hhmm (see note 2 below)
%Z- system time zone name (see note 3 below)
%%- a literal '%' character
+

ExifTool file name format codes may be used inside a date format +string when a date/time tag is used to set the value of the FileName or +Directory tags via the command-line interface. In this case, an extra +'%' must be added to pass the format code through the date/time +parser:

+
+ + + + +
%%d- original file directory (including trailing "/" if necessary)
%%f- original file name (without the extension)
%%e- original file extension (not including the ".")
%%c- copy number (output files only)
+

See the -w option in the exiftool +application documentation for details about special features available +with these name format codes.

+

Notes:

+
    +
  1. The %f format code is an ExifTool-specific enhancement and +supports an optional number of digits after the decimal point. For example, +%3f gives fractional seconds with 3 digits (eg. ".123"). The value +is rounded to the specified number of digits, and the date/time value is +incremented by one second if the rounding would overflow to the next second, +even if the number of decimal digits is zero (ie. %0f). Without +%f, the fractional seconds are simply discarded and no rounding is +performed.

  2. +
  3. The %s and %z format codes use the time zone +specified by the date/time value. If the date/time value does not include a +time zone specification, then it is interpreted as a local time in the system +time zone. These format codes are parsed by ExifTool, so they should work on +all systems.

  4. +
  5. The %Z format code ignores any time zone specified in the +date/time value, and returns the system time-zone name for the given date/time +interpreted as a local system time.
  6. +
+
+

<-- Back to ExifTool home page

+ + diff --git a/html/geotag.html b/html/geotag.html new file mode 100644 index 0000000..0565250 --- /dev/null +++ b/html/geotag.html @@ -0,0 +1,726 @@ + + + + Geotagging with ExifTool + + + + + +

Geotagging with ExifTool

+

The ExifTool geotagging feature adds GPS tags to images based on data from a +GPS track log file. The GPS track log file is loaded, and linear interpolation +is used to determine the GPS position at the time of the image, then the +following tags are written to the image (if the corresponding information +is available):

+ +
GPSLatitude        GPSLongitude      GPSAltitude          GPSDateStamp
+GPSLatitudeRef     GPSLongitudeRef   GPSAltitudeRef       GPSTimeStamp
+GPSTrack           GPSSpeed          GPSImgDirection      GPSPitch        
+GPSTrackRef        GPSSpeedRef       GPSImgDirectionRef   GPSRoll
+AmbientTemperature CameraElevationAngle
+
+ +
Note: GPSPitch and GPSRoll are not standard tags, and +must be user-defined.
+ +

Currently supported GPS track log file formats:

+ +
    +
  • GPX
  • +
  • NMEA (RMC, GGA, GLL and GSA sentences)
  • +
  • KML
  • +
  • IGC (glider format)
  • +
  • Garmin XML and TCX
  • +
  • Magellan eXplorist PMGNTRK
  • +
  • Honeywell PTNTHPR (see Orientation)
  • +
  • Bramor gEO log
  • +
  • Winplus Beacon .TXT
  • +
  • Google Takeout .JSON
  • +
  • GPS/IMU .CSV
  • +
  • DJI .CSV
  • +
  • ExifTool .CSV file
  • +
+ + +

Implementation

+ +

Geotagging is accomplished in ExifTool through the use of three special +write-only Extra tags: +Geotag, Geosync and Geotime.

+ + +

Geotag

+ +

The Geotag tag is used to define the GPS track log data. The +geotagging feature is activated by assigning the name of a track log file to +this tag. As an example, the following command line adds GPS tags to all images +in the "/Users/Phil/Pictures" directory based on GPS positions stored in the +track log file "track.log" in the current directory:

+ +
exiftool -geotag=track.log /Users/Phil/Pictures
+
+ +

For convenience (and to make this feature more prominent in the +documentation), the exiftool application also provides a -geotag +option, so this command is equivalent to the one above:

+ +
exiftool -geotag track.log /Users/Phil/Pictures
+
+ +

Multiple GPS log files may be loaded simultaneously by using more than one +-geotag option or -geotag= assignment in the same +command, or by using wildcards in the filename argument of the +-geotag option. This allows batch processing of images spanning +different tracks with a single command. When using wildcards the argument may +need to be quoted on some systems to prevent shell globbing, but note that +wildcards are not supported with the -geotag= syntax. See the +examples below.

+ +

Deleting the Geotag tag (with -geotag=) causes the +GPS tags written by the -geotag feature to be deleted.

+ +

A special feature allows writing of only GPS date/time tags when there is no +position available by specifying a log file name of "DATETIMEONLY" (all +capitals).

+ +
Programmers: You may write either a GPS log file name +or the GPS log data as the value for Geotag. If the value contains +a newline or a null byte it is assumed to be data, otherwise it is taken as a +file name.
+ + +

Geosync

+ +

The Geosync tag is needed only when the image timestamps are not +properly synchronized with GPS time. The value written to Geosync +may take a number of different forms, but the basic format is that of a simple +time difference which is added to Geotime before interpolating the +GPS position in the track log. This time difference may be of the form "SS", +"MM:SS", "HH:MM:SS" or "DD HH:MM:SS" (where SS=seconds, MM=minutes, HH=hours and +DD=days), and a leading "+" or "-" may be added for positive or negative +differences (positive if the GPS time was ahead of the camera clock). +Fractional seconds are allowed (eg. "SS.ss").

+ +

For example, "-geosync=-1:20" specifies that synchronization +with GPS time is achieved by subtracting 1 minute and 20 seconds from the +Geotime value. See the Time Synchronization Tip +below for more details.

+ +
Note that a single decimal value is interpreted as +seconds when written to Geosync. This is different from of other +date/time shift values where a single value is normally taken as hours. +
+ +

The Geosync value may also be specified using 3 different +formats which provide a GPS time and a corresponding camera clock time. While +these formats may be used for a simple (constant) time synchronization offset, +they are necessary when performing a clock drift correction (with multiple +synchronization points), and are described below.

+ +

Camera clock drift correction:

+ +

A more advanced Geosync feature allows the GPS time and the +image time to be specified together, facilitating a time drift correction if +more than one synchronization point is provided. For this, the value written to +Geosync takes one of the following forms:

+ +
+ + + + + + +
FormatNotes
FILEBoth GPS and image timestamps are extracted from the +specified file. eg) -geosync=image.jpg
GPSTIME@FILEGPS time is taken from the +Geosync value and the image timestamp is extracted from the +specified file. eg) -geosync="12:58:05@image.jpg"
GPSTIME@IMGTIMEBoth GPS and image timestamps are +taken from the Geosync value. eg) +-geosync="12:58:05@2010:01:02 12:25:26"
+ +

The values of GPSTIME and IMGTIME specified on the command line +may contain a date, but it is not necessary.

+ +

Notes:

+
    +
  1. If either the GPS or the image timestamp does not contain a date, the two +timestamps are assumed to be on days which place them within 12 hours of each +other.
  2. +
  3. If neither the GPS nor the image timestamps contain a date, this +synchronization point may only be used for constant time offset (ie. no time +drift correction will be applied).
  4. +
  5. Both the GPS and the image times are assumed to be local unless another +timezone is specified (unless taken from GPSTimeStamp which is UTC).
  6. +
  7. Both the GPS and the image time values may contain decimal seconds.
  8. +
  9. The applied value of the time drift correction is calculated from a +piecewise linear interpolation/extrapolation between the synchronization points +if more than one Geosync value is defined.
  10. +
  11. When extracting from file, timestamps are taken from the first available of +the following tags: +
      +
    • Image timestamp: SubSecDateTimeOriginal, SubSecCreateDate, SubSecModifyDate, +DateTimeOriginal, CreateDate, ModifyDate, FileModifyDate
    • +
    • GPS timestamp: GPSDateTime, GPSTimeStamp
    • +
  12. +
+ + +

Geotime

+ +

The Geotime tag specifies the point in time for which the GPS +position is calculated (by interpolating between fixes in the GPS track log). +Unless a group is specified, exiftool writes the generated tags to the default +groups. If a value for Geotime is not given, it is taken from +unformatted value of DateTimeOriginal for each image (as if +"-Geotime<DateTimeOriginal#" had been specified), but the value +may be copied from any other date/time tag or set directly from a date/time +string.

+ +

If the date/time tag does not include a timezone then one may be added (eg. +"-Geotime<${CreateDate}-05:00"), otherwise the local system time +is assumed. Decimal seconds are supported in the time value.

+ +

By default, GPS tags are created in EXIF and the corresponding +XMP tags are updated only if they already exist. However, an EXIF or XMP group +name may be specified to force writing only to the specified location. For +example, writing XMP:Geotime or EXIF:Geotime will +write the generated GPS tags only to XMP or EXIF respectively. Note that when +written to XMP, the GPSLatitudeRef and GPSLongitudeRef +tags are not used, and the XMP GPSDateTime tag is written instead +of the separate EXIF GPSDateStamp and GPSTimeStamp +tags.

+ +

See the Examples section below for sample command +lines illustrating various aspects of the geotagging feature.

+ +
Programmers: Note that Geotime must always +be specified when geotagging via the API (the default value of +DateTimeOriginal# is implemented by the application). Also, +Geotime must be set after both Geotag and +Geosync (the exiftool application reorders the assignments to +ensure this). +
+ + +

ExifTool CSV Log File Format

+ +

ExifTool supports input log files in CSV format with the first row containing +headings in the form of ExifTool tag names or descriptions. Valid column +headings are:

+ +
+ + + + + + + + + + + + +
Column HeadingDescription
GPSDateTimeDate and time in standard EXIF format, or other +format specified by the -d option if used.
Time is assumed to be +in UTC unless the values contain another time zone
GPSDateStampDate in standard EXIF format
GPSTimeStampTime in EXIF format. UTC is assumed unless +the values include a time zone
GPSLatitudeLatitude in flexible ExifTool format (see FAQ 14)
GPSLongitudeLongitude in flexible ExifTool format (see FAQ 14)
GPSLatitudeRefString beginning with "S" for southern coordinates (used only if GPSLatitude isn't signed or doesn't specify hemisphere)
GPSLongitudeRefString beginning with "W" for western coordinates (used only if GPSLongitude isn't signed or doesn't specify hemisphere)
GPSAltitudeAltitude in meters relative to sea level (negative for below sea level)
GPSTrackCompass heading in degrees true
GPSPitch or
CameraElevationAngle
Pitch angle in degrees with positive pitch upwards
GPSRollRoll angle in degrees
+ +

Required columns are GPSDateTime (or GPSDateStamp and GPSTimeStamp), +GPSLatitude and GPSLongitude. All other columns are optional, and unrecognized +columns are ignored.

+ + +

Examples

+ + +

1. Geotag all images in the "c:\images" directory from position information in a +GPS track log ("c:\gps logs\track.log"). Since the Geotime time is +not specified, the value of DateTimeOriginal# is used. Local +system time is assumed unless DateTimeOriginal# contains a +timezone:

+ +
exiftool -geotag "c:\gps logs\track.log" c:\images
+ + +

2. Geotag all images in directory "dir" from the GPS positions in "track.log" +(in the current directory), for a camera clock that was running 25 seconds +slower than the GPS clock:

+ +
exiftool -geotag track.log -geosync=+25 dir
+ + +

3. Geotag an image with the GPS position for a specific time:

+ +
exiftool -geotag t.log -geotime="2009:04:02 13:41:12-05:00" a.jpg
+ + +

4. Geotag all images in directory "dir" with XMP tags instead of EXIF tags, +based on the image CreateDate:

+ +
exiftool -geotag log.gpx "-xmp:geotime<createdate" dir
+ + +

5. Geotag images in "dir" using CreateDate with the specified +timezone. If CreateDate already contained a timezone, then the +timezone specified on the command line is ignored. (Note that in Windows, +double quotes (") must be used instead of single quotes +(') around the -geotime argument in the next 2 +commands):

+ +
exiftool -geotag a.log '-geotime<${createdate}+01:00' dir
+ + +

6. Geotag images for which the camera clock was set to UTC (+00:00), using +the time from DateTimeOriginal:

+ +
exiftool -geotag trk.gpx '-geotime<${DateTimeOriginal}+00:00' dir
+ + +

7. Delete GPS tags which were added by the geotag feature. (Note that this does +not remove all GPS tags -- to do this instead use -gps:all=):

+ +
exiftool -geotag= a.jpg
+ + +

8. Delete XMP GPS tags which were added by the geotag feature:

+ +
exiftool -xmp:geotag= a.jpg
+ + +

9. Geotag an image with XMP tags, using the time from +DateTimeOriginal:

+ +
exiftool -xmp:geotag=track.log a.jpg
+ + +

10. Combine multiple track logs and geotag an entire directory tree of +images:

+ +
exiftool -geotag a.log -geotag b.log -r dir
+ + +

11. Use wildcards to load multiple track files (the quotes are necessary for most +operating systems to prevent filename expansion):

+ +
exiftool -geotag "logs/*.log" dir
+ + +

12. Geotag from a sub-second date/time value with a sub-second time synchronization +(only possible if the EXIF sub-second time stamps are available):

+ +
exiftool -Geotag a.log -Geosync=+13.42 "-Geotime<SubSecDateTimeOriginal" dir
+
+ + +

13. Geotag images with a piecewise linear time drift correction using the GPS +time synchronization from three already-geotagged images:

+ +
exiftool -geotag a.log -geosync=1.jpg -geosync=2.jpg -geosync=3.jpg dir
+
+ + +

Options

+ +

Geotagging may be configured via the following ExifTool options. These +options may be set using either the -api option of the command-line +application, the Options() function of the API, or the +%Image::ExifTool::UserDefined::Options hash of the config file. (See the +sample config file for details about how to use the +config file.)

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
OptionDescriptionValuesDefault
GeoMaxIntSecsMaximum interpolation time in seconds for geotagging. Geotagging is + treated as an extrapolation if the Geotime value lies between two fixes in + the same track which are separated by a number of seconds greater than this. + Otherwise, the coordinates are calculated as a linear interpolation between + the nearest fixes on either side of the Geotime value. Set to 0 to disable + interpolation and use the coordinates of the nearest fix instead (provided + it is within GeoMaxExtSecs, otherwise geotagging fails).A floating point number1800
GeoMaxExtSecsMaximum extrapolation time in seconds for geotagging. Geotagging fails + if the Geotime value lies outside a GPS track by a number of seconds greater + than this. Otherwise, the coordinates of the nearest fix are taken.A floating point number1800
GeoMaxHDOPMaximum Horizontal (2D) Dilution Of Precision for geotagging. GPS fixes are + ignored if the HDOP is greater than this.A floating point number, or undef to disableundef
GeoMaxPDOPMaximum Position (3D) Dilution Of Precision for geotagging. GPS fixes are + ignored if the PDOP is greater than this.A floating point number, or undef to disableundef
GeoMinSatsMinimum number of satellites for geotagging. GPS fixes are ignored if the + number of acquired satellites is less than this.A positive integer, or undef to disableundef
GeoSpeedRefReference units for writing GPSSpeed when geotagging. + + + +
Kk or km/h= km/h
Mm or mph= mph
(anything else)= knots
undef
+ + +

Orientation

+ +

ExifTool reads orientation information from the PTNTHPR sentence generated by +some Honeywell digital compasses. This is a proprietary NMEA sentence which +contains information about heading, pitch and roll angles. When this +information is available, the heading is written to GPSImgDirection (and +GPSImgDirectionRef is set to "T"), and pitch to CameraElevationAngle, but no +standard tag exists for roll. Regardless, ExifTool attempts to write +GPSRoll (and GPSPitch). For these tags to be written, appropriate +user-defined tags must be created. Below is a simple config file which +defines the necessary EXIF GPS tags. Corresponding XMP-exif tags may also be +created. See the config file documentation for +more information.

+ +
%Image::ExifTool::UserDefined = (
+    'Image::ExifTool::GPS::Main' => {
+        0xd000 => {
+            Name => 'GPSPitch',
+            Writable => 'rational64s',
+        },
+        0xd001 => {
+            Name => 'GPSRoll',
+            Writable => 'rational64s',
+        },
+    },
+);
+1; #end
+
+ + +

Troubleshooting

+ + +

1. "No track points found in GPS file"

+ +
If you see the above message, either exiftool does not yet support +your track log file format, or your track log does not contain the necessary +position/timestamp information. For instance, in KML files each Placemark must +contain a TimeStamp. If you believe your track log contains the necessary +information, please send me a sample file and I will add support for this +format.
+ + +

2. "No writable tags set" or "0 image files updated"

+ +
If you see these without any other warning messages, it is likely +that Geotime didn't get set properly.
+ +
Be sure that the necessary date/time tag exists in your image for +copying to Geotime. Unless otherwise specified, the required tag +is DateTimeOriginal. The following command may be used to list the +names and values of all available date/time tags in an image: + +
exiftool -s -time:all image.jpg
+
+ +Even if there is no metadata in the image you may be able to set +Geotime from the filesystem modification date for the image (which +will appear as FileModifyDate in the output of the above command). +In this case you may also want to include the -P option to preserve +the original value of FileModifyDate: + +
exiftool -geotag track.gpx "-geotime<filemodifydate" -P image.jpg
+
+ +Without the -P option, FileModifyDate is set to the +current date/time when the file is rewritten.
+ + +

3. "Warning: Time is too far before track in File:Geotime (ValueConvInv)"

+ +
If you see a warning like this, you may have a time zone problem, +or a time synchronization issue. Keep in mind that GPS times are in UTC, but +the camera times are typically in your local time zone.
+ +
To see more details about what ExifTool is doing, try adding the +-v2 option to your command. You should then see messages like +this if the GPS track log was loaded successfully: + +
Loaded 372 points from GPS track log file 'my_track.log'
+  GPS track start: 2009:03:30 19:45:25 UTC
+  GPS track end:   2009:04:03 11:16:04 UTC
+
+ +If the number of points loaded and start/end times seem reasonable, then +the problem is likely in the time synchronization. Also printed will be the +UTC time for the image: + +
  Geotime value:   2009:04:03 10:57:01 UTC (local timezone is -05:00)
+
+ +The "Geotime value" must lie within 1/2 hour of a valid GPS fix in the track log +for a position to be calculated. (1/2 hour is the default, but this can be +configured via the geotagging Options.) The time +calibration relies on proper synchronization between the GPS time and your +camera's clock. If a timezone is not specified, the local system time zone (as +set by the shell's TZ environment variable) is printed in the above message and +used to convert the Geotime value to UTC. You should specify the +timezone for Geotime if your images were taken in a different +timezone (see Examples above). If the camera clock was +wrong, the Geosync tag may be used to apply a time correction, or +the ExifTool time shift feature may be used to adjust the image times before +geotagging -- see the Time Synchronization tip below for +examples.
+ + +

Tips

+ + +

1. Time Synchronization

+ +
One way to accurately synchronize your images with GPS time is to +take a picture of the time displayed on your GPS unit while you are out +shooting. Then after you download your images you can use this image to +synchronize the image timestamps for geotagging. This is done by using an image +viewer to read the time from the GPS display in the image, and exiftool to +extract DateTimeOriginal from the file. For example, if the time in +the GPS display reads 19:32:21 UTC and DateTimeOriginal is +14:31:49, then for this image the camera clock was 32 seconds slow (assuming +that the timezone of the camera clock was -05:00). There +are various ways to use this time synchronization to improve your geotagging +accuracy:
+ +
A) Use the Geosync tag to specify the time difference +while geotagging. Using this technique the existing image timestamps will not +be corrected, but the GPSTimeStamp tag created by the geotagging +process will contain the correct GPS time: + +
exiftool -geosync=+00:00:32 -geotag my_gps.log C:\Images
+
+or equivalently, +
exiftool -geosync=19:32:21Z@14:31:49-05:00 -geotag my_gps.log C:\Images
+
+ +(Note that this technique may also be used for a more advanced time +drift correction. See the Geosync section above for +details)
+ +
B) First fix the image timestamps by shifting them to synchronize +with GPS time, then geotag using the corrected timestamps: + +
exiftool -alldates+=00:00:32 C:\Images
+exiftool -geotag my_gps.log C:\Images
+
+ +C) Do both in the same command: + +
exiftool -alldates+=00:00:32 -geosync=+00:00:32 -geotag my_gps.log C:\Images
+
+ +The examples above assume that your track log file (my_gps.log) +is in the current directory, that the images were downloaded to the +C:\Images directory, and that the computer and camera clocks are +in the same timezone.
+ +
+ +

Inverse Geotagging

+ +

ExifTool also has the ability to create a GPS track file from a series of +geotagged images. The -p option may be used to output files in +any number of formats. This section gives examples for creating GPX and KML +output files from a set of geotagged images, or from a geotagged video file. +(But note that the -ee3 option must be added to the commands below +to extract the full track from a video file.)

+ + +

Creating a GPX track log

+ +

The following print format file may be used to generate a GPX track log from +one or more geotagged images:

+ +
#------------------------------------------------------------------------------
+# File:         gpx.fmt
+#
+# Description:  Example ExifTool print format file to generate a GPX track log
+#
+# Usage:        exiftool -p gpx.fmt -ee3 FILE [...] > out.gpx
+#
+# Requires:     ExifTool version 10.49 or later
+#
+# Revisions:    2010/02/05 - P. Harvey created
+#               2018/01/04 - PH Added IF to be sure position exists
+#               2018/01/06 - PH Use DateFmt function instead of -d option
+#               2019/10/24 - PH Preserve sub-seconds in GPSDateTime value
+#
+# Notes:     1) Input file(s) must contain GPSLatitude and GPSLongitude.
+#            2) The -ee3 option is to extract the full track from video files.
+#            3) The -fileOrder option may be used to control the order of the
+#               generated track points when processing multiple files.
+#------------------------------------------------------------------------------
+#[HEAD]<?xml version="1.0" encoding="utf-8"?>
+#[HEAD]<gpx version="1.0"
+#[HEAD] creator="ExifTool $ExifToolVersion"
+#[HEAD] xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+#[HEAD] xmlns="http://www.topografix.com/GPX/1/0"
+#[HEAD] xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
+#[HEAD]<trk>
+#[HEAD]<number>1</number>
+#[HEAD]<trkseg>
+#[IF]  $gpslatitude $gpslongitude
+#[BODY]<trkpt lat="$gpslatitude#" lon="$gpslongitude#">
+#[BODY]  <ele>$gpsaltitude#</ele>
+#[BODY]  <time>${gpsdatetime#;my ($ss)=/\.\d+/g;DateFmt("%Y-%m-%dT%H:%M:%SZ");s/Z/${ss}Z/ if $ss}</time>
+#[BODY]</trkpt>
+#[TAIL]</trkseg>
+#[TAIL]</trk>
+#[TAIL]</gpx>
+
+ +

This example assumes that the GPSLatitude, +GPSLongitude, GPSAltitude and GPSDateTime +tags are all available in each processed FILE. Warnings will be +generated for missing tags. The output GPX format will invalid if any +GPSLatitude or GPSLongitude tags are missing, but will +be OK for missing GPSAltitude or GPSDateTime tags.

+ +

Note that the order of track points in the output GPX file will be the same +as the order of processing the input files, which may not be chronological +depending on how the files are named. The -fileOrder option may be +used to force processing of files in a particular order. For example, the +following command processes files in order of increasing GPSDateTime: +

+ +
exiftool -fileOrder gpsdatetime -p gpx.fmt /Users/Phil/Pictures > out.gpx
+
+ +

Since no directory was specified for gpx.fmt, this file must +exist in the current directory when the above command is executed. (If the +gpx.fmt file can't be found then the -p argument is +interpreted as a string instead of a file name, and the text +"gpx.fmt" is sent to the output, which isn't what we want.)

+ +

The -if option may be added to ensure that only files containing +GPS information are processed. For example, the following command creates +"out.gpx" in the current directory from all pictures containing +GPSDateTime information in directory "pics" and its +sub-directories:

+ +
exiftool -r -if '$gpsdatetime' -fileOrder gpsdatetime -p gpx.fmt pics > out.gpx
+
+ +

Note: In Windows, double quotes (") must be used instead of +single quotes (') around the -if argument above.

+ +

The "fmt_files" directory of the full exiftool distribution contains this +sample format file ("gpx.fmt") as well as a sample which creates GPX waypoints +with pictures ("gpx_wpt.fmt").

+ + +

Creating a Google Earth KML file

+ +

Below is an example of a print format file which generates a Google Earth KML +file from a collection of geotagged images. This example uses the SECT feature added +in ExifTool 10.41 to divide the placemarks into folders based on directory name:

+ +
#------------------------------------------------------------------------------
+# File:         kml.fmt
+#
+# Description:  Example ExifTool print format file for generating a
+#               Google Earth KML file from a collection of geotagged images
+#
+# Usage:        exiftool -p kml.fmt -r DIR [...] > out.kml
+#
+# Requires:     ExifTool version 10.41 or later
+#
+# Revisions:    2010/02/05 - P. Harvey created
+#               2013/02/05 - PH Fixed camera icon to work with new Google Earth
+#               2017/02/02 - PH Organize into folders based on file directory
+#               2018/01/04 - PH Added IF to be sure position exists
+#               2020/01/11 - F. Kotov Limited image preview size to 500px
+#
+# Notes:     1) Input files must contain GPSLatitude and GPSLongitude.
+#            2) Add the -ee3 option to extract the full track from video files.
+#            3) For Google Earth to be able to find the images, the input
+#               images must be specified using relative paths, and "out.kml"
+#               must stay in the same directory as where the command was run.
+#            4) Google Earth is picky about the case of the image file extension,
+#               and may not be able to display the image if an upper-case
+#               extension is used.
+#            5) The -fileOrder option may be used to control the order of the
+#               generated placemarks when processing multiple files.
+#------------------------------------------------------------------------------
+#[HEAD]<?xml version="1.0" encoding="UTF-8"?>
+#[HEAD]<kml xmlns="http://earth.google.com/kml/2.0">
+#[HEAD]  <Document>
+#[HEAD]    <name>My Photos</name>
+#[HEAD]    <open>1</open>
+#[HEAD]    <Style id="Photo">
+#[HEAD]      <IconStyle>
+#[HEAD]        <Icon>
+#[HEAD]          <href>http://maps.google.com/mapfiles/kml/pal4/icon38.png</href>
+#[HEAD]          <scale>1.0</scale>
+#[HEAD]        </Icon>
+#[HEAD]      </IconStyle>
+#[HEAD]    </Style>
+#[SECT]    <Folder>
+#[SECT]      <name>$main:directory</name>
+#[SECT]      <open>0</open>
+#[IF]  $gpslatitude $gpslongitude
+#[BODY]      <Placemark>
+#[BODY]        <description><![CDATA[<img src='$main:directory/$main:filename'
+#[BODY]          style='max-width:500px;max-height:500px;'> ]]>
+#[BODY]        </description>
+#[BODY]        <Snippet/>
+#[BODY]        <name>$filename</name>
+#[BODY]        <styleUrl>#Photo</styleUrl>
+#[BODY]        <Point>
+#[BODY]          <altitudeMode>clampedToGround</altitudeMode>
+#[BODY]          <coordinates>$gpslongitude#,$gpslatitude#,0</coordinates>
+#[BODY]        </Point>
+#[BODY]      </Placemark>
+#[ENDS]    </Folder>
+#[TAIL]  </Document>
+#[TAIL]</kml>
+
+ +

This example file is included in the "fmt_files" directory of the full +ExifTool distribution. See +this +forum post for more useful tips about creating KML files.

+ +
+Created Apr. 2, 2009
+Last revised Sept. 23, 2021 +

<-- Back to ExifTool home page

+ + diff --git a/html/history.html b/html/history.html new file mode 100644 index 0000000..7ad999a --- /dev/null +++ b/html/history.html @@ -0,0 +1,379 @@ + + + + ExifTool Version History + + + + +

ExifTool Version History

+ +

RSS feed: https://exiftool.org/rss.xml

+ +

Note: The most recent production release is Version 12.42. (Other versions are +considered development releases, and are not uploaded to MetaCPAN.)

+ + + + +July 21, 2022 - Version 12.44 +
    +
  • Added a few new Sony lenses (thanks Jos Roost) +
  • Decode Accelerometer and Gyroscope data from ARCore videos +
  • Decode a couple of new Motorola tags (thanks Neal Krawetz) +
  • Decode FujiFilm FirmwareVersion (thanks Justin Arkinson) +
  • Decode MetaType for timed metadata in videos +
  • Decode a number of new Nikon Z tags (thanks Warren Hatch) +
  • Extract more types of embedded images from FlashPix-format files +
  • Made Composite GPSLatitude and GPSLongitude writable for setting GPS + coordinates and reference directions with one assignment +
  • Fixed bug introduced in 12.39 which broke extraction of timed GPS from some + INNOVV videos +
  • Fixed bug introduced in 12.43 which broke extraction of timed GPSDateTime + from Insta360 videos +
+ +July 6, 2022 - Version 12.43 +
    +
  • Added the ability to geotag from Google Takeout JSON files +
  • Added a few new Canon RF LensType values and a couple of new CanonModelID's + (thanks Norbert Wasser) +
  • Added new values to a couple of FujiFilm tags (thanks Greybeard) +
  • Added a new Nikon LensID (thanks BertJan Bakker) +
  • Recognize Autodesk Revit files (but don't yet support reading metadata) +
  • Decode DriveSerialNumber from LNK files (github #145) +
  • Decode Apple FocusDistanceRange (thanks Neal Krawetz) +
  • Made a number of Sony SR2SubIFD tags writable +
  • Tolerate dashes instead of colons as date separators in -geotag CSV files +
  • Patched to read new format accelerometer data from Insta360 files +
  • Patched to avoid outputting some Unknown tags when the -validate option is + used after a previously -execute'd command used the -u option +
  • Fixed names of Canon G9 WB levels tags (changed from GRGB to GRBG) (thanks + Christoph) +
  • Fixed typo in new Olympus AISubjectTrackingMode value +
  • Fixed "use of undefined value" warning when reading DJI metadata +
  • API Changes: + +
+ +June 1, 2022 - Version 12.42 (production release) +
    +
  • Added support for reading maker notes from Panasonic DC-GH6 videos +
  • Added conversion for Samsung MCCData +
  • Added a new Nikon LensID (thanks Chris) +
  • Added a few new Canon LensType values +
  • Added a couple of new Olympus StackedImage values (thanks Eberhard) +
  • Added a few new values for some Nikon Settings tags (thanks Warren Hatch) +
  • Added a "lang:" element to the -json output for alternate language tags when + -D, -H or -t is used +
  • Update DNG writer to not issue an error when writing DNG 1.6 files +
  • Decode information from DJI "ae_dbg_info" maker notes +
  • Decode Olympus AISubjectTrackingMode +
  • Changed ExifTool FileSize print conversion to use kB/MB/GB units instead of + KiB/MiB/GiB +
  • Changed "is not shiftable" warning to appear in -v (instead of just -v3) + output +
  • Patched to allow PDF Encrypt object to be "null" +
  • Fixed bug reading ICC_Profile 'meta' tags +
+ +Apr. 7, 2022 - Version 12.41 +
    +
  • Added support for "OM SYSTEM" maker notes +
  • Added 2 new Sony LensType values (thanks Jos Roost) +
  • Added some new Canon lenses (thanks LibRaw) +
  • Added a new Nikon LensID (thanks Bert Ligtvoet) +
  • Added a new Canon ContinuousDrive value (thanks Wolfgang Gülcker) +
  • Enhanced -v0 option to also print new file name when renaming, moving or + copying a file +
  • Updated xmp2exif.args and exif2xmp.args helper files to reflect the IPTC + Photometadata Mapping Guidelines version 2202.1 +
  • Made "Invalid Xxx data" a minor warning for MakerNote data +
  • Patched to allow writing of MP4 videos which have other tracks with a + missing sample description entry +
  • Patched MacOS version to specify directory for external utilities (setfile, + xattr, stat, mdls and osascript from /usr/bin, and tag from /usr/local/bin) +
  • Fixed long-standing problem where Windows version could behave differently + for -if conditions containing undefined tags +
  • Fixed problem where -W+! combined with -j or -X produced invalid JSON or XML + when processing multiple files +
  • Fixed potential "uninitialized value $time in division" runtime warning when + reading MP4 videos +
+ +Feb. 9, 2022 - Version 12.40 +
    +
  • Added PageCount tag to return the number of pages in a multi-page TIFF +
  • Added a new Nikon LensID (thanks Wolfgang Exler) +
  • Added a few more Sony LensTypes (thanks Jos Roost) +
  • Decode some new Canon tags (thanks Mark Reid) +
  • Decode another Nikon Z9 tag (thanks Warren Hatch) +
  • Decode Nikon NKSC GPSImgDirection (thanks Olaf) +
  • Improved handling of empty XMP structures in lists +
  • Tolerate leading UTF-8 BOM in -geotag log files +
  • Updated photoshop_paths.config to include WorkingPath +
  • Patched to allow writing of MP4 videos which have url tracks with a missing + sample description entry +
  • Fixed deep recursion error when reading multi-page TIFF images with more + than 100 pages +
  • Fixed potential deep recursion runtime error when writing nested XMP + structures +
  • Fixed warning which could be generated when writing new + Composite:GPSCoordinates tag +
  • Fixed description of GPR (General Purpose RAW) file type +
  • Fixed typo in the name of a new Nikon tag (thanks Herb) +
+ +Jan. 13, 2022 - Version 12.39 +
    +
  • Added a new Pentax LensType (thanks Christian Shulz) +
  • Added a couple of new Nikon LensID's +
  • Added support for Nikon NKSC sidecar files +
  • Decode another type of timed GPS from MP4 videos +
  • Decode more tags for the Nikon Z7 and Z9 (thanks Warren Hatch) +
  • Decode a couple more FLIR tags +
  • Extract ZIP file comments +
  • Made PNG ProfileName, SRGBRendering and Gamma writable +
  • Patched to avoid possible problem running "more" to show documentation in + Windows version +
  • Fixed problem writing Composite:GPSPosition with coordinates in DMS format, + and made this tag protected when writing +
  • Fixed bug where invalid date/time tags could be written to PNG files when + attempting to shift a non-existent date/time tag +
  • Fixed spelling of a few Matroska tag names (thanks Martin Hoppenheit) +
+ +Dec. 20, 2021 - Version 12.38 +
    +
  • Decode a number of new tags for the Nikon Z9 (thanks Warren Hatch) +
  • Patched incorrect decoding of AEBShotCount for the Canon EOS 90D +
  • Patched EXR reader to support long tag names +
  • Patched security issue (thanks Joe Lothan) +
  • Fixed an incorrect tag ID for a new Nikon MakerNote tag (github #108) +
  • Fixed XMP-exif:GPSMeasureMode conversions to match EXIF +
  • Fixed problem where some namespaces may be undeclared in the -X output when + using the -struct option +
+ +Dec. 8, 2021 - Version 12.37 +
    +
  • Decode timed GPS from Vantrue S1 dashcam MP4 videos +
  • Decode ColorData tags for the Canon EOS R3 (thanks LibRaw) +
  • Decode more makernotes tags for Nikon Z cameras (thanks Warren Hatch) +
  • Extract TransparentColor from GIF images +
  • Improved parsing of input time values for GPSTimeStamp to properly handle a + "." separator +
  • Improved warning when incorrectly using "<" instead of "=" to assign a tag + value +
  • Shortened a few of the new obscenely-long XMP-crs tag names +
  • Avoid writing XMP-dwc:EventID and XMP-tiff:NativeDigest +
  • Avoid printing same structure twice in -j and -X output when -l is used +
  • Fixed typo in a QuickTime tag name (thanks Hubert) +
  • Fixed two XMP-crs tag names and typo in a NikonSettings value (thanks Herb) +
  • Fixed patch of version 12.25 to avoid writing XMP which contains an + undefined namespace +
+ +Nov. 16, 2021 - Version 12.36 +
    +
  • IMPORTANT: Fixed bug introduced in 12.35 which corrupted JPEG 2000 images + when removing all metadata with -all= +
  • Added feature to bypass processing of specified XMP namespaces and + properties (to improve performance in cases where the XMP suffers from + Adobe-editing bloat) +
  • Added a number of new XMP tags used by Lightroom 11.0 +
  • Decode a number of new Nikon tags (thanks Warren Hatch) +
  • Made the Composite GPSPosition tag writable +
  • Fixed erroneous "Skipped unknown bytes after JPEG SOS" warning +
  • Fixed group for new writable Jpeg2000 color tags in -listx output +
  • Fixed problem finding files in Windows when using wildcards in file name and + a drive letter with no slash +
+ +Nov. 11, 2021 - Version 12.35 +
    +
  • Added ability to write ICC_Profile (and other color specifications) to + Jpeg2000 images +
  • Added %o code to -W option format string +
  • Added %f code to -d option for fractional seconds +
  • Added a couple of new Sony LensType values (thanks Jos Roost) +
  • Added a new CanonModelID (thanks Norbert Wasser) +
  • Added a new Nikon LensID +
  • Decode more Nikon MakerNotes tags for some new models (thanks Warren Hatch) +
  • Extract ThumbnailImage from some DJI drone videos +
  • Enhanced -ee option to extract metadata from all frames in a SEQ file +
  • Patched to avoid possible "Use of uninitialized value" runtime warning +
  • Fixed a couple of misspelt new ICC_Profile tag names (thanks Herb) +
  • Fixed problem generating the correct file extension when extracting + OriginalRawImage from a DNG file using the -W option with the %s format code +
  • Fixed bug introduced in 11.91 where exiftool couldn't find its libraries + when run via a soft link. Also changed to look for config file in the link + target directory instead of the directory of the link itself +
+ +Oct. 27, 2021 - Version 12.34 +
    +
  • Added support for ICC.2:2019 (Profile version 5.0.0 - iccMAX) color profiles +
  • Added ability to detect/delete a Windows Zone.Identifier alternate data + stream (ADS) via the new ZoneIdentifier tag (thanks Alex Xu) +
  • Added support for the Sony ILCE-7M4 (thanks Jos Roost) +
  • Added a new Sony lens (thanks LibRaw and Jos Roost) +
  • Added a new SonyModelID (thanks LibRaw) +
  • Added a new Canon RF lens (thanks Norbert Wasser) +
  • Improved handling of some SVG files +
  • Patched -overwrite_original_in_place option to open the output file in + update mode rather than write mode (to allow some write optimizations on + certain filesystems) (thanks Joel Low) +
  • Fixed case of tag ID for new XMP-iptcExt:EventID (thanks Michael Steidl) +
  • Fixed problem extracting ICC_Profile information from some PDF files +
  • API Changes: + +
+ +Oct. 16, 2021 - Version 12.33 +
    +
  • Added support for DNG version 1.6.0.0 +
  • Added two new Sony LensType values (thanks Jos Roost and LibRaw) +
  • Added some new elements to the XMP-crs:Look structure (thanks Herb) +
  • Added a few new IPTC XMP tags (thanks Michael Steidl) +
  • Added a new Canon RF lens (thanks Norbert Wasser) +
  • Decode Canon ShutterMode (thanks John Moyer) +
  • Extract LensModel from some Olympus MOV videos +
  • Generate MediaDataOffset/Size for MOV videos with zero-sized MDAT chunk +
  • Improvements to CBOR reader, including hex dump with -v3 option +
  • Recognize Final Cut Pro XML files +
  • Allow binary data of Protected tags to be extracted with the -X -j and -php + options with -b by setting the API RequestAll option to 3 +
  • Changed name of "Canon EF 80-200mm f/4.5-5.6" lens with LensType 38 to add + "II" to the name (Exiv2 issue 1906) +
  • Fixed runtime warning when processing files with a .DIR extension +
+ +Sept. 30, 2021 - Version 12.32 +
    +
  • Added support for CBOR-format metadata in JUMBF (note that JUMBF support is + still experimental) +
  • Added a new Nikon LensID +
  • Added a new Pentax LensType +
  • Decode timed GPS for two more dashcam formats +
  • Support reference direction columns in -geotag CSV input +
  • Removed generation of GPSSpeedRef and GPSTrackRef tags in timed metadata for + most dashcam formats when speed is km/h and track is relative to true north +
  • Patched to allow writing of console output to named pipes +
  • Fixed formatting of InternalSerialNumber for some Panasonic cameras +
  • Fixed bug in arg_files/xmp2exif.args support file +
+ +Sept. 22, 2021 - Version 12.31 +
    +
  • Added a new SonyModelID and a couple of new Sony lenses (thanks Jos Roost) +
  • Added a new Canon LensType (thanks Chris Skopec) +
  • Added Composite GPSLatitude/Longitude tags for Sony videos to combine the + reference hemispheres as with the Composite tags for EXIF GPS +
  • Decode DPX AspectRatio +
  • Decode more GoPro MP4 tags +
  • Extract ICC_Profile from CS0 object in PDF files +
  • Extract encrypted GPS from Akaso V1 dashcam videos (can't yet decrypt) +
  • Improved handling of QuickTime iTunesInfo tags, and created new "iTunes" + family 1 group for these +
  • Patched so NoPDFList option also applies when writing +
  • Patched to allow user-defined PNG TextualData tags to be written only as iTXt +
  • Patched PDF reader to avoid concatenating values of multiple List-type tags + into a single tag +
+ +Aug. 12, 2021 - Version 12.30 (production release) +
    +
  • Added read support for Portable FloatMap (PFM) images (this was a bit of a + pain because they have the same file extension as Printer Font Metrix files) +
  • Added a few new Nikon LensID values (thanks LibRaw) +
  • Added a new Canon LensType +
  • Added a new Olympus CameraType (thanks LibRaw) +
  • Added minor warning about unknown data between JPEG segments +
  • Added a couple of new NikonSettings tags (thanks Warren Hatch) +
  • Added a new Sony LensType (thanks Jos Roost) +
  • Decode 'id3 ' chunk in WAV audio files +
  • Decode timed GPS from concatenated Garmin dashcam videos +
  • Decode SamsungTrailer information from sefd atom in HEIC images +
  • Decode more Sony MakerNote tags for the ZV-E10 (thanks Jos Roost) +
  • Decode DepthMapTiff from JPEG images of more Samsung models +
  • Decode timed GPS from M2TS videos of yet another type of dashcam +
  • Extract PreviewImage from Xaiomi MP4 videos +
  • Changed name of second EmbeddedImage in Samsung trailer to EmbeddedImage2 +
  • Improved Dutch translations for GPS tags (thanks Peter Dubbelman) +
  • Allow ICC_Profile to be "deleted" from AVIF files (actually, the profile + isn't really deleted. Instead, a zero-length profile is written to allow a + profile to be added back later since QuickTime item property containers + currently can't be created) +
  • Patched to remove 2 GB size limit when reading Photoshop ImageSourceData +
+ +July 9, 2021 - Version 12.29 +
    +
  • Added a few new Nikon and Olympus lenses (thanks LibRaw) +
  • Improved a QuickTime "File format error" message to be more meaningful, and + made it a minor error +
  • Changed PNG writer to add EXIF before IDAT +
  • Some changes the way JUMBF metadata is handled +
  • Patched to read timed GPS from a different type of INSV videos +
  • Patched a security issue +
  • Fixed problem where ExifTool could hang when processing mebx timed metadata +
+ +June 22, 2021 - Version 12.28 +
    +
  • Added read support for Leica Image File (LIF) images +
  • Added a new Olympus LensType (thanks LibRaw) +
  • Decode another Panasonic tag (thanks LibRaw) +
  • Decode more timed metadata from Sony MP4 videos +
  • Attempt to shorten tag names for metadata in CZI files +
  • Allow full QuickTime Keys tag ID's in UserDefined tags (fixes backward + incompatibility introduced in 12.02) +
  • Patched to handle special characters in Torrent tag values +
+ +June 9, 2021 - Version 12.27 +
    +
  • Added a new SonyModelID value +
  • Added two new Nikon LensID values (thanks Daniel) +
  • Added a new Pentax RawDevelopmentProcess value +
  • Added a few new Sony LensType values (thanks Jos Roost) +
  • Added warning if IPTCDigest is not current +
  • Decode a couple more Pentax tags (thanks LibRaw) +
  • Decode streaming GPS from Novatek INNOVV MP4 and TS videos +
  • Improved tag names in config_files/covert_regions.config (thanks StarGeek) +
  • Changed MIME types for MS Office macro-enabled formats to add the .12 +
  • Patched Canon LensID logic to properly identify the Canon RF 24-105mm F4 L + IS USM lens +
  • Patched decoding of camm6 GPSDateTime to use a flexible epoch because other + apps don't seem to use a consistent time zero +
  • Fixed family 7 group names for QuickTime Keys tags +
  • Fixed problem reading BeatsPerMinute from some MP4 files +
  • Fixed hemisphere problem when extracting GPS from 70mai dashcam videos +
+ +May 20, 2021 - Version 12.26 (production release) +
    +
  • Added support for JPEG Stereo (JPS) images +
  • Added a new Sony LensType (thanks LibRaw) +
  • Added a new PentaxModelID (thanks LibRaw) +
  • Changed ExifTool namespace URI to use exiftool.org instead of exiftool.ca in + the -X option output (exiftool.ca is still recognized when reading XML) +
  • Improved handling of large-array warnings in -htmldump output +
  • Changed handling of escaped characters in #[CSTR] lines of -@ argfile +
  • Patched security vulnerability in argument of -lang option +
  • Fixed problem which could cause a "Wide character" warning and generate a + corrupted output file when writing some illegal values +
+ +History of older versions (back to Nov. 19, 2003 - Version 1.00) -->

+ +
+

<-- Back to ExifTool home page

+ + diff --git a/html/htmldump.html b/html/htmldump.html new file mode 100644 index 0000000..db84f5e --- /dev/null +++ b/html/htmldump.html @@ -0,0 +1,769 @@ + + + + +HTML Dump (t/images/FujiFilm.jpg) + + + +

ExifTool HtmlDump Option

+

Below is an example of the ExifTool HtmlDump output (the exiftool +"-htmlDump" option). Move your cursor over the data to highlight +individual blocks and reveal tool tips for extra information. (You must have +JavaScript enabled.)

+ +

The command used to generate the output below was:

+ +
exiftool -htmldump t/images/FujiFilm.jpg > out.html
+ +

In this output, normal +data blocks are light or dark green, +unused blocks are brown, and double-referenced blocks are +red or pink. A +blue tag name indicates the value is referenced by an +offset in the IFD (ie. the value is longer than 4 bytes), +purple indicates that the actual offset differs from the +recorded offset, and a red name indicates an invalid +offset. Odd offsets are flagged with "(odd)" and +out-of-sequence tag ID's are indicated by "(seq)" because +the TIFF specification states that values must begin on a (2-byte) word boundary +and that IFD entries must be in order of increasing tag ID. All data in the +maker notes value block is underlined.

+ +

Clicking the mouse locks current the highlighted entry, and clicking again +unlocks it.

+ +

Currently, only TIFF/EXIF and JPEG meta information is dumped. The leftmost +column of the output gives the offset in hex relative to the start of the TIFF +header (by default). For a TIFF image this is at the start of the file, but for +a JPEG image it is 10 bytes after the start of the APP1 EXIF segment. However, +this base offset can be specified on the command line with "-htmlDump#" (eg. +"-htmlDump0" for absolute offsets), or via the API with the "HtmlDumpBase" +option.

+ + + +
-000c
+ 0000
+ 000a
+ 0016
+ 0022
+ 002e
+ 003a
+ 0046
+ 0052
+ 005e
+ 006a
+ 0076
+ 0082
+ 008e
+ 0090
+ 00a0
+ 00b0
+ 00c0
+ 00d0
+ 00e0
+ 00f0
+ 0100
+ 0106
+ 0112
+ 011e
+ 012a
+ 0136
+ 0142
+ 014e
+ 015a
+ 0166
+ 0172
+ 017e
+ 018a
+ 0196
+ 01a2
+ 01ae
+ 01ba
+ 01c6
+ 01d2
+ 01de
+ 01ea
+ 01f6
+ 0202
+ 020e
+ 021a
+ 0226
+ 0232
+ 023e
+ 024a
+ 0256
+ 0260
+ 0270
+ 0280
+ 0290
+ 02a0
+ 02b0
+ 02c0
+ 02d0
+ 02dc
+ 02e8
+ 02f4
+ 0300
+ 030c
+ 0318
+ 0324
+ 0330
+ 033c
+ 0348
+ 0354
+ 0360
+ 036c
+ 0378
+ 0384
+ 0390
+ 03a0
+ 03aa
+ 03b6
+ 03c2
+ 03c8
+ 03d4
+ 03e0
+ 03ec
+ 03f8
+ 0404
+ 0410
+ 041c
+ 0428
+ 0430
+ 0440
+ 0450
+ 0460
+ 0470
+ 0480
+ 0490
+ 04a0
+ 04b0
+ 04c0
+ 04d0
+ 04e0
+ 04f0
+ 0500
+ 0510
+ 0520
+ 0530
+ 0540
+ 0550
+
            ff d8 ff e1  04 60 45 78 69 66 00 00
+49 49 2a 00 08 00 00 00  0b 00
+0f 01 02 00 09 00 00 00  92 00 00 00
+10 01 02 00 10 00 00 00  9c 00 00 00
+12 01 03 00 01 00 00 00  01 00 00 00
+1a 01 05 00 01 00 00 00  ac 00 00 00
+1b 01 05 00 01 00 00 00  b4 00 00 00
+28 01 03 00 01 00 00 00  02 00 00 00
+31 01 02 00 27 00 00 00  bc 00 00 00
+32 01 02 00 14 00 00 00  e4 00 00 00
+13 02 03 00 01 00 00 00  02 00 00 00
+98 82 02 00 0b 00 00 00  f8 00 00 00
+69 87 04 00 01 00 00 00  04 01 00 00
+                                           c6 03
+00 00 46 55 4a 49 46 49  4c 4d 00 00 46 69 6e 65
+50 69 78 32 34 30 30 5a  6f 6f 6d 00 48 00 00 00
+01 00 00 00 48 00 00 00  01 00 00 00 44 69 67 69
+74 61 6c 20 43 61 6d 65  72 61 20 46 69 6e 65 50
+69 78 32 34 30 30 5a 6f  6f 6d 20 56 65 72 31 2e
+37 30 00 00 32 30 30 31  3a 30 35 3a 31 39 20 31
+38 3a 33 36 3a 34 31 00  20 20 20 20 20 20 20 20
+20 20 00 00 1c 00
+9d 82 05 00 01 00 00 00  5a 02 00 00
+22 88 03 00 01 00 00 00  02 00 00 00
+27 88 03 00 01 00 00 00  64 00 00 00
+00 90 07 00 04 00 00 00  30 32 31 30
+03 90 02 00 14 00 00 00  62 02 00 00
+04 90 02 00 14 00 00 00  76 02 00 00
+01 91 07 00 04 00 00 00  01 02 03 00
+02 91 05 00 01 00 00 00  8a 02 00 00
+01 92 0a 00 01 00 00 00  92 02 00 00
+02 92 05 00 01 00 00 00  9a 02 00 00
+03 92 0a 00 01 00 00 00  a2 02 00 00
+04 92 0a 00 01 00 00 00  aa 02 00 00
+05 92 05 00 01 00 00 00  b2 02 00 00
+07 92 03 00 01 00 00 00  05 00 00 00
+09 92 03 00 01 00 00 00  01 00 00 00
+0a 92 05 00 01 00 00 00  ba 02 00 00
+7c 92 07 00 d6 00 00 00  c2 02 00 00
+00 a0 07 00 04 00 00 00  30 31 30 30
+01 a0 03 00 01 00 00 00  01 00 00 00
+02 a0 04 00 01 00 00 00  40 06 00 00
+03 a0 04 00 01 00 00 00  b0 04 00 00
+05 a0 04 00 01 00 00 00  a8 03 00 00
+0e a2 05 00 01 00 00 00  98 03 00 00
+0f a2 05 00 01 00 00 00  a0 03 00 00
+10 a2 03 00 01 00 00 00  03 00 00 00
+17 a2 03 00 01 00 00 00  02 00 00 00
+00 a3 07 00 01 00 00 00  03 00 00 00
+01 a3 07 00 01 00 00 00  01 00 00 00
+                  00 00  00 00 5e 01 00 00 64 00
+00 00 32 30 30 31 3a 30  35 3a 31 39 20 31 38 3a
+33 36 3a 34 31 00 32 30  30 31 3a 30 35 3a 31 39
+20 31 38 3a 33 36 3a 34  31 00 10 00 00 00 0a 00
+00 00 58 02 00 00 64 00  00 00 68 01 00 00 64 00
+00 00 c8 00 00 00 64 00  00 00 00 00 00 00 64 00
+00 00 68 01 00 00 64 00  00 00 58 02 00 00 64 00
+00 00 46 55 4a 49 46 49  4c 4d 0c 00 00 00 0f 00
+00 00 07 00 04 00 00 00  30 31 33 30
+00 10 02 00 08 00 00 00  c6 00 00 00
+01 10 03 00 01 00 00 00  03 00 00 00
+02 10 03 00 01 00 00 00  00 00 00 00
+10 10 03 00 01 00 00 00  03 00 00 00
+11 10 0a 00 01 00 00 00  ce 00 00 00
+20 10 03 00 01 00 00 00  00 00 00 00
+21 10 03 00 01 00 00 00  00 00 00 00
+30 10 03 00 01 00 00 00  00 00 00 00
+31 10 03 00 01 00 00 00  00 00 00 00
+00 11 03 00 01 00 00 00  00 00 00 00
+00 12 03 00 01 00 00 00  00 00 00 00
+00 13 03 00 01 00 00 00  00 00 00 00
+01 13 03 00 01 00 00 00  00 00 00 00
+02 13 03 00 01 00 00 00  00 00 00 00
+            00 00 00 00  4e 4f 52 4d 41 4c 20 00
+00 00 00 00 0a 00 00 00  ed 0b 00 00 01 00 00 00
+ed 0b 00 00 01 00 00 00  02 00
+01 00 02 00 04 00 00 00  52 39 38 00
+02 00 07 00 04 00 00 00  30 31 30 30
+      00 00 00 00 08 00
+03 01 03 00 01 00 00 00  06 00 00 00
+12 01 03 00 01 00 00 00  01 00 00 00
+1a 01 05 00 01 00 00 00  2c 04 00 00
+1b 01 05 00 01 00 00 00  34 04 00 00
+28 01 03 00 01 00 00 00  02 00 00 00
+01 02 04 00 01 00 00 00  3c 04 00 00
+02 02 04 00 01 00 00 00  1c 00 00 00
+13 02 03 00 01 00 00 00  02 00 00 00
+                         00 00 00 00 48 00 00 00
+01 00 00 00 48 00 00 00  01 00 00 00 3c 44 75 6d
+6d 79 20 74 68 75 6d 62  6e 61 69 6c 20 69 6d 61
+67 65 20 64 61 74 61 3e  ff db 00 84 00 14 10 10
+19 12 19 27 17 17 27 32  26 1f 26 32 2e 26 26 26
+26 2e 3e 35 35 35 35 35  3e 44 41 41 41 41 41 41
+44 44 44 44 44 44 44 44  44 44 44 44 44 44 44 44
+44 44 44 44 44 44 44 44  44 44 44 44 44 01 15 19
+19 20 1c 20 26 18 18 26  36 26 20 26 36 44 36 2b
+2b 36 44 44 44 42 35 42  44 44 44 44 44 44 44 44
+44 44 44 44 44 44 44 44  44 44 44 44 44 44 44 44
+44 44 44 44 44 44 44 44  44 44 44 44 44 44 ff c0
+00 11 08 00 08 00 08 03  01 22 00 02 11 01 03 11
+01 ff c4 00 4b 00 01 01  00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 06  01 01 00 00 00 00 00 00
+00 00 00 00 00 00 00 00  00 00 10 01 00 00 00 00
+00 00 00 00 00 00 00 00  00 00 00 00 11 01 00 00
+00 00 00 00 00 00 00 00  00 00 00 00 00 00 ff da
+00 0c 03 01 00 02 11 03  11 00 3f 00 b3 00 1f ff
+d9
+
    .....`Exif..
+II*.......
+............
+............
+............
+............
+............
+(...........
+1...'.......
+2...........
+............
+............
+i...........
+              ..
+..FUJIFILM..Fine
+Pix2400Zoom.H...
+....H.......Digi
+tal Camera FineP
+ix2400Zoom Ver1.
+70..2001:05:19 1
+8:36:41.        
+  ....
+........Z...
+"...........
+'.......d...
+........0210
+........b...
+........v...
+............
+............
+............
+............
+............
+............
+............
+............
+............
+............
+|...........
+........0100
+............
+........@...
+............
+............
+............
+............
+............
+............
+............
+............
+      ....^...d.
+..2001:05:19 18:
+36:41.2001:05:19
+ 18:36:41.......
+..X...d...h...d.
+......d.......d.
+..h...d...X...d.
+..FUJIFILM......
+........0130
+............
+............
+............
+............
+............
+ ...........
+!...........
+0...........
+1...........
+............
+............
+............
+............
+............
+    ....NORMAL .
+................
+..........
+........R98.
+........0100
+  ......
+............
+............
+........,...
+........4...
+(...........
+........<...
+............
+............
+        ....H...
+....H.......<Dum
+my thumbnail ima
+ge data>........
+...'..'2&.&2.&&&
+&.>55555>DAAAAAA
+DDDDDDDDDDDDDDDD
+DDDDDDDDDDDDD...
+. . &..&6& &6D6+
++6DDDB5BDDDDDDDD
+DDDDDDDDDDDDDDDD
+DDDDDDDDDDDDDD..
+........."......
+....K...........
+................
+................
+................
+................
+..........?.....
+.
+
JPEG header APP1 header Exif header
+TIFF header IFD0 entries
+IFD0-00 Make
+IFD0-01 Model
+IFD0-02 Orientation
+IFD0-03 XResolution
+IFD0-04 YResolution
+IFD0-05 ResolutionUnit
+IFD0-06 Software
+IFD0-07 ModifyDate
+IFD0-08 YCbCrPositioning
+IFD0-09 Copyright
+IFD0-10 ExifOffset
+Next IFD
+Make value [pad byte]
+Model value
+XResolution value YResolution value
+Software value
+
+[pad byte]
+ModifyDate value
+Copyright value [pad byte] ExifIFD entries
+ExifIFD-00 FNumber
+ExifIFD-01 ExposureProgram
+ExifIFD-02 ISO
+ExifIFD-03 ExifVersion
+ExifIFD-04 DateTimeOriginal
+ExifIFD-05 CreateDate
+ExifIFD-06 ComponentsConfiguration
+ExifIFD-07 CompressedBitsPerPixel
+ExifIFD-08 ShutterSpeedValue
+ExifIFD-09 ApertureValue
+ExifIFD-10 BrightnessValue
+ExifIFD-11 ExposureCompensation
+ExifIFD-12 MaxApertureValue
+ExifIFD-13 MeteringMode
+ExifIFD-14 Flash
+ExifIFD-15 FocalLength
+ExifIFD-16 MakerNotes
+ExifIFD-17 FlashpixVersion
+ExifIFD-18 ColorSpace
+ExifIFD-19 ExifImageWidth
+ExifIFD-20 ExifImageHeight
+ExifIFD-21 InteropOffset
+ExifIFD-22 FocalPlaneXResolution
+ExifIFD-23 FocalPlaneYResolution
+ExifIFD-24 FocalPlaneResolutionUnit
+ExifIFD-25 SensingMethod
+ExifIFD-26 FileSource
+ExifIFD-27 SceneType
+Next IFD
+FNumber value
+DateTimeOriginal value
+CreateDate value
+CompressedBitsPerPixel value ShutterSpeedValue value
+ApertureValue value BrightnessValue value
+ExposureCompensation value MaxApertureValue value
+FocalLength value MakerNotes header MakerNoteFujiFilm entries
+MakerNotes-00 Version
+MakerNotes-01 Quality
+MakerNotes-02 Sharpness
+MakerNotes-03 WhiteBalance
+MakerNotes-04 FujiFlashMode
+MakerNotes-05 FlashExposureComp
+MakerNotes-06 Macro
+MakerNotes-07 FocusMode
+MakerNotes-08 SlowSync
+MakerNotes-09 PictureMode
+MakerNotes-10 AutoBracketing
+MakerNotes-11 Tag 0x1200
+MakerNotes-12 BlurWarning
+MakerNotes-13 FocusWarning
+MakerNotes-14 ExposureWarning
+Next IFD Quality value
+FlashExposureComp value FocalPlaneXResolution value
+FocalPlaneYResolution value InteropIFD entries
+InteropIFD-00 InteropIndex
+InteropIFD-01 InteropVersion
+Next IFD IFD1 entries
+IFD1-00 Compression
+IFD1-01 Orientation
+IFD1-02 XResolution
+IFD1-03 YResolution
+IFD1-04 ResolutionUnit
+IFD1-05 ThumbnailOffset
+IFD1-06 ThumbnailLength
+IFD1-07 YCbCrPositioning
+Next IFD
+XResolution value YResolution value
+(IFD1:Thumbnail data)
+[JPEG DQT]
+
+
+
+
+
+
+
+[JPEG SOF0]
+
+[JPEG DHT]
+
+
+
+[JPEG Image Data]
+JPEG EOI
+
+
+
+
JPEG header
SOI Marker
(2 bytes)
+
APP1 header
Data size: 1118 bytes
(4 bytes)
+
Exif header
APP1 data type: Exif
(6 bytes)
+
TIFF header
Byte order: Little endian
Identifier: 0x002a
IFD0 offset: 0x0008
(8 bytes)
+
IFD0 entries
Entry count: 11
(2 bytes)
+
IFD0-00 Make
Tag ID: 0x010f
Format: string[9]
Size: 9 bytes
Value offset: 0x0092
Value: FUJIFILM
+
IFD0-01 Model
Tag ID: 0x0110
Format: string[16]
Size: 16 bytes
Value offset: 0x009c
Value: FinePix2400Zoom
+
IFD0-02 Orientation
Tag ID: 0x0112
Format: int16u[1]
Size: 2 bytes
Value: 1
+
IFD0-03 XResolution
Tag ID: 0x011a
Format: rational64u[1]
Size: 8 bytes
Value offset: 0x00ac
Value: 72 (72/1)
+
IFD0-04 YResolution
Tag ID: 0x011b
Format: rational64u[1]
Size: 8 bytes
Value offset: 0x00b4
Value: 72 (72/1)
+
IFD0-05 ResolutionUnit
Tag ID: 0x0128
Format: int16u[1]
Size: 2 bytes
Value: 2
+
IFD0-06 Software
Tag ID: 0x0131
Format: string[39]
Size: 39 bytes
Value offset: 0x00bc
Value: Digital Camera FinePix2400Zo[...]
+
IFD0-07 ModifyDate
Tag ID: 0x0132
Format: string[20]
Size: 20 bytes
Value offset: 0x00e4
Value: 2001:05:19 18:36:41
+
IFD0-08 YCbCrPositioning
Tag ID: 0x0213
Format: int16u[1]
Size: 2 bytes
Value: 2
+
IFD0-09 Copyright
Tag ID: 0x8298
Format: string[11] read as undef[11]
Size: 11 bytes
Value offset: 0x00f8
Value: .
+
IFD0-10 ExifOffset
Tag ID: 0x8769
Format: int32u[1]
Size: 4 bytes
Value: 0x0104
+
Next IFD
IFD1 offset: 0x03c6
(4 bytes)
+
ExifIFD entries
Entry count: 28
(2 bytes)
+
ExifIFD-00 FNumber
Tag ID: 0x829d
Format: rational64u[1]
Size: 8 bytes
Value offset: 0x025a
Value: 3.5 (350/100)
+
ExifIFD-01 ExposureProgram
Tag ID: 0x8822
Format: int16u[1]
Size: 2 bytes
Value: 2
+
ExifIFD-02 ISO
Tag ID: 0x8827
Format: int16u[1]
Size: 2 bytes
Value: 100
+
ExifIFD-03 ExifVersion
Tag ID: 0x9000
Format: undef[4]
Size: 4 bytes
Value: 0210
+
ExifIFD-04 DateTimeOriginal
Tag ID: 0x9003
Format: string[20]
Size: 20 bytes
Value offset: 0x0262
Value: 2001:05:19 18:36:41
+
ExifIFD-05 CreateDate
Tag ID: 0x9004
Format: string[20]
Size: 20 bytes
Value offset: 0x0276
Value: 2001:05:19 18:36:41
+
ExifIFD-06 ComponentsConfiguration
Tag ID: 0x9101
Format: undef[4] read as int8u[4]
Size: 4 bytes
Value: 1 2 3 0
+
ExifIFD-07 CompressedBitsPerPixel
Tag ID: 0x9102
Format: rational64u[1]
Size: 8 bytes
Value offset: 0x028a
Value: 1.6 (16/10)
+
ExifIFD-08 ShutterSpeedValue
Tag ID: 0x9201
Format: rational64s[1]
Size: 8 bytes
Value offset: 0x0292
Value: 6 (600/100)
+
ExifIFD-09 ApertureValue
Tag ID: 0x9202
Format: rational64u[1]
Size: 8 bytes
Value offset: 0x029a
Value: 3.6 (360/100)
+
ExifIFD-10 BrightnessValue
Tag ID: 0x9203
Format: rational64s[1]
Size: 8 bytes
Value offset: 0x02a2
Value: 2 (200/100)
+
ExifIFD-11 ExposureCompensation
Tag ID: 0x9204
Format: rational64s[1]
Size: 8 bytes
Value offset: 0x02aa
Value: 0 (0/100)
+
ExifIFD-12 MaxApertureValue
Tag ID: 0x9205
Format: rational64u[1]
Size: 8 bytes
Value offset: 0x02b2
Value: 3.6 (360/100)
+
ExifIFD-13 MeteringMode
Tag ID: 0x9207
Format: int16u[1]
Size: 2 bytes
Value: 5
+
ExifIFD-14 Flash
Tag ID: 0x9209
Format: int16u[1]
Size: 2 bytes
Value: 0x1
+
ExifIFD-15 FocalLength
Tag ID: 0x920a
Format: rational64u[1]
Size: 8 bytes
Value offset: 0x02ba
Value: 6 (600/100)
+
ExifIFD-16 MakerNotes
Tag ID: 0x927c
Format: undef[214]
Size: 214 bytes
Value offset: 0x02c2
Value: FUJIFILM..............0130..[...]
+
ExifIFD-17 FlashpixVersion
Tag ID: 0xa000
Format: undef[4]
Size: 4 bytes
Value: 0100
+
ExifIFD-18 ColorSpace
Tag ID: 0xa001
Format: int16u[1]
Size: 2 bytes
Value: 0x1
+
ExifIFD-19 ExifImageWidth
Tag ID: 0xa002
Format: int32u[1]
Size: 4 bytes
Value: 1600
+
ExifIFD-20 ExifImageHeight
Tag ID: 0xa003
Format: int32u[1]
Size: 4 bytes
Value: 1200
+
ExifIFD-21 InteropOffset
Tag ID: 0xa005
Format: int32u[1]
Size: 4 bytes
Value: 0x03a8
+
ExifIFD-22 FocalPlaneXResolution
Tag ID: 0xa20e
Format: rational64u[1]
Size: 8 bytes
Value offset: 0x0398
Value: 3053 (3053/1)
+
ExifIFD-23 FocalPlaneYResolution
Tag ID: 0xa20f
Format: rational64u[1]
Size: 8 bytes
Value offset: 0x03a0
Value: 3053 (3053/1)
+
ExifIFD-24 FocalPlaneResolutionUnit
Tag ID: 0xa210
Format: int16u[1]
Size: 2 bytes
Value: 3
+
ExifIFD-25 SensingMethod
Tag ID: 0xa217
Format: int16u[1]
Size: 2 bytes
Value: 2
+
ExifIFD-26 FileSource
Tag ID: 0xa300
Format: undef[1]
Size: 1 bytes
Value: 3
+
ExifIFD-27 SceneType
Tag ID: 0xa301
Format: undef[1]
Size: 1 bytes
Value: 1
+
Next IFD
Next IFD offset: 0x0000
(4 bytes)
+
MakerNotes header
MakerNoteFujiFilm
(12 bytes)
+
MakerNoteFujiFilm entries
Entry count: 15
(2 bytes)
+
MakerNotes-00 Version
Tag ID: 0x0000
Format: undef[4]
Size: 4 bytes
Value: 0130
+
MakerNotes-01 Quality
Tag ID: 0x1000
Format: string[8]
Size: 8 bytes
Value offset: 0x00c6
Actual offset: 0x0388
Offset base: 0x02c2
Value: NORMAL
+
MakerNotes-02 Sharpness
Tag ID: 0x1001
Format: int16u[1]
Size: 2 bytes
Value: 0x3
+
MakerNotes-03 WhiteBalance
Tag ID: 0x1002
Format: int16u[1]
Size: 2 bytes
Value: 0x0
+
MakerNotes-04 FujiFlashMode
Tag ID: 0x1010
Format: int16u[1]
Size: 2 bytes
Value: 0x3
+
MakerNotes-05 FlashExposureComp
Tag ID: 0x1011
Format: rational64s[1]
Size: 8 bytes
Value offset: 0x00ce
Actual offset: 0x0390
Offset base: 0x02c2
Value: 0 (0/10)
+
MakerNotes-06 Macro
Tag ID: 0x1020
Format: int16u[1]
Size: 2 bytes
Value: 0
+
MakerNotes-07 FocusMode
Tag ID: 0x1021
Format: int16u[1]
Size: 2 bytes
Value: 0
+
MakerNotes-08 SlowSync
Tag ID: 0x1030
Format: int16u[1]
Size: 2 bytes
Value: 0
+
MakerNotes-09 PictureMode
Tag ID: 0x1031
Format: int16u[1]
Size: 2 bytes
Value: 0x0
+
MakerNotes-10 AutoBracketing
Tag ID: 0x1100
Format: int16u[1]
Size: 2 bytes
Value: 0
+
MakerNotes-11 Tag 0x1200
Tag ID: 0x1200
Format: int16u[1]
Size: 2 bytes
Value: 0
+
MakerNotes-12 BlurWarning
Tag ID: 0x1300
Format: int16u[1]
Size: 2 bytes
Value: 0
+
MakerNotes-13 FocusWarning
Tag ID: 0x1301
Format: int16u[1]
Size: 2 bytes
Value: 0
+
MakerNotes-14 ExposureWarning
Tag ID: 0x1302
Format: int16u[1]
Size: 2 bytes
Value: 0
+
Next IFD
Next IFD offset: 0x0000
(4 bytes)
+
InteropIFD entries
Entry count: 2
(2 bytes)
+
InteropIFD-00 InteropIndex
Tag ID: 0x0001
Format: string[4]
Size: 4 bytes
Value: R98
+
InteropIFD-01 InteropVersion
Tag ID: 0x0002
Format: undef[4]
Size: 4 bytes
Value: 0100
+
Next IFD
Next IFD offset: 0x0000
(4 bytes)
+
IFD1 entries
Entry count: 8
(2 bytes)
+
IFD1-00 Compression
Tag ID: 0x0103
Format: int16u[1]
Size: 2 bytes
Value: 6
+
IFD1-01 Orientation
Tag ID: 0x0112
Format: int16u[1]
Size: 2 bytes
Value: 1
+
IFD1-02 XResolution
Tag ID: 0x011a
Format: rational64u[1]
Size: 8 bytes
Value offset: 0x042c
Value: 72 (72/1)
+
IFD1-03 YResolution
Tag ID: 0x011b
Format: rational64u[1]
Size: 8 bytes
Value offset: 0x0434
Value: 72 (72/1)
+
IFD1-04 ResolutionUnit
Tag ID: 0x0128
Format: int16u[1]
Size: 2 bytes
Value: 2
+
IFD1-05 ThumbnailOffset
Tag ID: 0x0201
Format: int32u[1]
Size: 4 bytes
Value: 0x043c
+
IFD1-06 ThumbnailLength
Tag ID: 0x0202
Format: int32u[1]
Size: 4 bytes
Value: 28
+
IFD1-07 YCbCrPositioning
Tag ID: 0x0213
Format: int16u[1]
Size: 2 bytes
Value: 2
+
Next IFD
IFD2 offset: 0x0000
(4 bytes)
+
(IFD1:Thumbnail data)
Size: 28 bytes
+
[JPEG DQT]
(134 bytes)
+
[JPEG SOF0]
(19 bytes)
+
[JPEG DHT]
(77 bytes)
+
[JPEG Image Data]
(17 bytes)
+
JPEG EOI
(2 bytes)
+ diff --git a/html/idiosyncracies.html b/html/idiosyncracies.html new file mode 100644 index 0000000..1e3aaac --- /dev/null +++ b/html/idiosyncracies.html @@ -0,0 +1,293 @@ + + + +Maker Note Idio(t)syncrasies + + + +

Maker Note Idio(t)syncrasies

+ +

It really is surprising how stupid some (...many, ...most?) manufacturers +seem to be when it comes to writing what should be a fairly simple file +format.

+ +

One positive thing is that most manufacturers seem to have standardized on an +EXIF-like IFD (Image File Directory) structure for their maker notes. But many +problems arise because of a fundamental design flaw in the EXIF/TIFF format. +Values longer than 4 bytes are stored at a location referenced by an offset from +an absolute position in the file (where offset 0 is the start of the EXIF/TIFF +information).

+ +

The difficulty is that these offsets must be recalculated when a file is +rewritten, but in general this is not possible (particularly for the maker +notes) because the format of all information is not known. Some manufacturers +have attempted to avoid this problem using offsets which are relative to the +start of the maker note IFD instead of the usual start of EXIF. This is a good +idea if implemented properly, but this is not done consistently. (And some +manufacturers are not even consistent about how the offsets are calculated from +one camera model to the next!)

+ +
Technical aside: +
If EXIF were designed properly, all offsets would +be relative to 4 bytes after the end of the IFD, which is the normal position +for values to be stored, and all value data for the IFD would be stored in a +block at this location. If this was done, an entire IFD could be relocated +easily without causing problems.
+ +

Below is a list of idiosyncrasies in files written by the digital cameras or +software from various manufacturers. Many of these quirks relate to the offset +problem mentioned above.

+ +
+ +

Canon: The 350D (firmware 1.0.1) gets the size of the thumbnail image +wrong and reports it to be 10 bytes too long. This can cause the reported +thumbnail image data to run off the end of the APP1 segment. A bug in version +1.0.4 of the 40D firmware causes it to write a maker note entry count that is +one greater than it should be.

+ +

Casio: The preview image is referenced by two different offsets (the +PreviewImage tag plus a PreviewImageStart/PreviewImageLength pair). Also, the +offset for the PrintIM information is relative to the start of the IFD entry +even though other offsets aren't.

+ +

Concord: Some models write PrintIM information with an entry-based +offset like Casio.

+ +

General Electric: A number of GE cameras store zero offsets for some +maker note tags (possibly to indicate that the tags do not exist), and other +offsets are 12 bytes too high for some models (like the A1230, E1035 and G2). +

+ +

Hewlett-Packard: The PhotoSmart 720 (one of the few HP models to use +EXIF-format maker notes) uses a format code of 5 (rational64u) for tag 0x0204, +but stores a rational32u value. Other models show about as much standardization +as the Kodak point-and-shoot lineup. Also, some models (C945, M22, M23, R507, +R607, R707, R717, R725, R727, R817, R818, R827, R927 and R960) write the EXIF +ComponentsConfiguration incorrectly as ASCII characters (like the Leica M8 and +M9).

+ +

Kodak: Professional DCS Photo Desk software writes a cyclical EXIF +directory such that the InteropIFD pointer points back to IFD0. +Point-and-shoot models show little standardization in maker note format. +Some models with IFD-format maker notes store incorrect count values for +a number of tags (this is particularly nasty), and may contain blank IFD +entries which are filled with 0xff's (not zeros like other makes).

+ +

Konica: The KD-300Z writes all maker notes offsets relative to the +start of the individual IFD entry.

+ +

Kyocera: A number of models write all maker notes offsets relative +to the start of the individual IFD entry.

+ +

Leica: Leica is hands-down the most inconsistent +company when it comes to writing makernote information. Various models use +different signatures and different bases for the offsets for the maker notes. As +well as this, they do a number of really peculiar things with in their +metadata.

+ +

The M8 and M9 write the EXIF ComponentsConfiguration value in +ASCII instead of binary. The M8 writes EXIF ExposureCompensation and +ShutterSpeedValue incorrectly as a unsigned rationals when they should be +signed. This leads to crazy values like "+65536" for small negative exposure +compensations, and "0 s" for long exposure times. (NOTE: These are all EXIF +idiosyncrasies since the values are in the standard EXIF, not the maker +notes.) In DNG images, the M8 uses maker note offsets relative to the +start of the maker notes in JPEG images (very reasonable), but relative to +the end of the maker note header in DNG images. I think this was a mistake +because this is changed in M9 DNG images to be the same as JPEG images.

+ +

2010-02-20: The Leica S2 maker note format is the MOST idiotic I have seen, and has the +following peculiarities:

+ +
    +
  • It is stored as a trailer after the JPEG EOI (but referenced from a pointer +inside the APP1 EXIF segment).
  • +
  • Most of the offsets in this MakerNote IFD are relative to the start of the +file instead of the EXIF TIFF header (which is particularly cruel because they +are broken if other software simply adds a leading JFIF segment, but there is no +simple way to detect that this has happened. Normally this could be detected by +analyzing the pointers, but this doesn't work here because all of the unused +data in the Leica maker notes make normal pointer assumptions impossible).
  • +
  • The PreviewImage offset is relative to the start of the MakerNote data +(which is MUCH more reasonable, but using two different offset bases in the same +directory is yet another level of idiocy).
  • +
  • In DNG images the maker notes use an absolute base offset. Yet again +different from the M8 and M9. Consistency isn't Leica's strong suit.
  • +
+ +

2013-07-27: Strike that. The most idiotic award now goes to the Leica M (Typ 240), which +adds these quirks (firmware 1.1.0.2):

+ +
    +
  • Tag 0x0301 has the same offset as the PreviewImage in the maker note IFD, +although it looks like the data for this tag probably comes after the +PreviewImage.
  • +
  • Tag 0x0302 has an invalid offset (0xffffffff).
  • +
+ +

2015-09-03: OK, I give up on Leica. The new Leica S (Typ 007) attains a new level of +stupidity by storing the preview image in the JPG file using a completely +nonsensical technique (in IFD2 of the EXIF segment, with the data being stored +outside the EXIF segment after the JPEG EOI), as well as various other brainless +blunders. [@Leica: Try reading the MPF specification.]

+ +

Minolta: An obvious bug in the firmware of the Z2 writes an incorrect +offset for the 'MinoltaCameraSettings2' information -- it writes the offset of +the offset itself instead of the offset of the value (hahaha!). Other +offsets are correct.

+ +

Nikon: D2H NEF files have huge blocks with all zero data (3.7 MB in +my test file!).

+ +

Olympus: The E-1 and E-300 have subdirectories in the maker notes, but +not only does the data size of these subdirectories exclude the subdirectory +value data, but also it is 2 bytes too small for the directory information +itself (doh! -- they forgot to include the entry count). Similarly, the stored +size of the maker note data block is too small for many models, which results +in a loss of data if the maker notes are copied as a block when an image is +rewritten.

+ +

Pentax: The Optio 330 uses an offset for the PrintIM information which +is relative to the start of the IFD entry (hmmm, like some Casio models...). +Also, preview image offsets in the maker notes are given relative to the EXIF +base rather than the maker note base (like all other maker notes offsets).

+ +

The Optio 550, 555, 33WR and 43WR all specify a PrintIM directory at a the +same offset of 0x29a with length 40 bytes, but the only PrintIM information in +the file is nowhere near that offset and is 128 bytes long. Also for these +models, tag 0x002e has a constant value of 0x6a6 even though its position +changes. Finally, all of these models plus the Optio WP waste many kilobytes of +space in each image with large unused data blocks in the EXIF information.

+ +

The Optio 330RS and 430RS double reference the preview image information.

+ +

Note that the worst problems are with the Optio 230, 330, and 430, which +carry the Asahi brand name.

+ +

Photoshop and Nikon Capture: Both of these packages write TIFF IPTC +information as 'int32u' (or 'LONG'). This is wrong +(see +reference). Nikon Capture goes one step further and simply ignores IPTC +that is written correctly as 'undef' or 'int8u'. (So for compatibility, +ExifTool also writes this incorrectly as 'int32u'.) Photoshop completely +deletes the maker notes when an image is edited.

+ +

Ricoh: There is an IFD subdirectory in the Ricoh maker notes of both the +Caplio RR30 and RR1. The RR30 uses standard EXIF offsets (relative to the start +of the EXIF data), but for the RR1 the offsets are relative to the start of the +subdirectory. The G700 uses MPF offsets relative to the start of the file, +instead of the start of the MPF segment as per the MPF spec. The HX15 uses +a standard EXIF maker note structure, but there are 2 extra padding bytes +between the IFD entry count and the 1st IFD entry. The HZ15 and Pentax XG-1 (by +Ricoh) both have an extra 2 bytes after the IFD entry counts. All value offsets +are erroneously 0 for the HZ15, and there are other problems with the offsets +stored by the XG-1.

+ +

Rollei: The DK4010 writes all maker notes offsets relative to the +start of the individual IFD entry.

+ +

Sanyo: The offsets written in the maker notes of the J1, J2, J3, S1, +S3 and S4 have very little to do with reality. Apparently the Sanyo +programmers have no understanding of the concept of an IFD offset.

+ +

Skanhex: With some Skanhex models (SX-210Z3, SX-330Z3, SX3300, +SX410Z3), the 264-byte makernotes block contains no useful information, and +overlaps values from the ExifIFD. For these models there is also a large block +(typically 1195 bytes) of unreferenced information in the EXIF data immediately +following the IteropIFD. This block begins with the character sequence +"SKANH\0", and contains exactly the same information in all 20 of my sample +images that contain this block (except for a variable amount of padding at the +end with 0xff bytes). These quirks also affect some Gateway, Jenoptik, Medion, +Samsung and Yakumo models built by Skanhex.

+ +

Toshiba: The PDR-3310 writes all maker notes offsets relative to the +start of the individual IFD entry. (very similar to Konica KD-300Z)

+ +
+

RAW file Idiosyncrasies

+ +

Minolta MRW: The A200 stores the thumbnail image offset in IFD0 +relative to the start of file, while all other offsets are relative to the start +of the TIFF header, which is 48 bytes into the file. Also, the A200 stores the +StripOffsets and the StripByteCounts values in the wrong byte order.

+ +

Sony ARW: The maker notes of ARW images are not self-contained, so +some information is lost when the images are rewritten by other software +(including the Adobe DNG converter). The A100 with firmware 1.00 sets the high +word of the thumbnail image offset to zero, but it should sometimes be 0x0001. +(This problem is fixed for firmware 1.01.) Also with the A100, the +JpgFromRawLength stored in IFD0 may be wrong (although this value is also stored +in the MakerNotes and is correct here). As well, much information in these +images is encrypted, which complicates things somewhat. Even the Sony IDC +utility can't properly rewrite ARW files -- it corrupts the embedded MRW record +when used to edit ARW images. Even funnier: IDC v3.0 will crash when loading +some original A100 firmware 1.00 images, but no longer crashes if the images are +first edited with ExifTool (probably because ExifTool fixes the above mentioned +problems when it rewrites the image).

+ +

Hasselblad FFF: Many Hasselblad camera models +write TIFF-format FFF raw files which contain a double-referenced +reduced-resolution image that is referenced from both IFD0 and IFD1.Immediately +following the data for this image is an unreferenced data block that the +Hasselblad Phocus software uses for an updated preview to reflect the raw +development settings. This unreferenced data is lost if the FFF file is edited +using a TIFF-compatible algorithm, which results in the Phocus no longer +updating the preview when the settings are changed.

+ +

Leica DNG: The makernote offsets for the M8 are relative to the start +of the makernote IFD in JPEG images, but relative to the start of the makernote +header (8 bytes earlier) in DNG images. [2009-09-09: This is fixed for the +M9 which has offsets relative to the start of the makernote header for both JPEG +and DNG.]

+ +

Nikon NEF: Aside from the encryption that Nikon uses to try to hide +some information in their maker notes, the NEF files in general seem fairly well +behaved. Even so, the Nikon Transfer utility (version 1.3) still manages to +corrupt some information in the 0th SubIFD when it is used to process NEF +images. (Beware that other Nikon utilities may have this same problem if they +use the same NEF writing routines.) But luckly the lost information isn't very +important. (Only a few tags from the embedded full-sized preview image are +lost: XResolution, YResolution and YCbCrPositioning.) Also, Nikon Transfer and +Nikon Capture both write an incorrect size for the maker notes, which could +cause loss of MakerNote information if the file is edited by other software (but +this isn't a problem with ExifTool, which will fix this type of problem +automatically when writing).

+ +

Nikon NRW: Nikon should have just called this NEF with a different +version number -- there should be no need to pollute the universe with zillions +of unnecessary file extensions. Oh right, they weren't smart enough to include +a file identifier containing a version number in their NEF images -- Doh! In +these images, CFAPattern2 is written incorrectly with UNDEFINED instead of BYTE +format.

+ +

Phase One IIQ: Many values are referenced from more than one location +in the TIFF structure of these images. For instance, the IFD0 strip data +actually exists within the MakerNotes data block. This is a poor design, and +leads to duplicated information when the image is rewritten.

+ +

Ricoh DNG: The GR Digital IV (firmware 1.14) stores an incorrect +length for the JPEG preview in SubIFD1.

+ +

Samsung SRW: Yet another TIFF-based raw image with no proper file +identifier. In these images the thumbnail is stored inside a SubIFD of IFD1 +instead of directly in IFD1 (dumb, dumb...). Also, the NX200 (firmware +NX200_011181) uses a base offset for the X/YResolution values that is different +from the PreviewImageStart pointer, both in the MakerNotes PreviewIFD. (Note +that the NX100 uses the same base for both, so this is certainly a firmware bug +for the NX200. [2012-06-21: This problem now also affects the EX1, NX20 and +WB2000] [2013-07-25: Add the NX2000 to this list])

+ +

2018-04-30: The Samsung EK-GN120 has many +problems in the makernote offsets. Most of the offsets are based on the start of +the maker notes, but the PreviewIFD is offset is wrong by 36 bytes, and some +offsets in the PreviewIFD are based on the start of the maker notes while others +are absolute. What a mess!

+ +
+Created Mar. 25, 2005 +
Last revised Feb. 24, 2020 +

<-- Back to ExifTool home page

+ + diff --git a/html/index.html b/html/index.html new file mode 100644 index 0000000..810327e --- /dev/null +++ b/html/index.html @@ -0,0 +1,1534 @@ + + + +ExifTool by Phil Harvey + + + + + + + + + + + + + +

ExifTool by Phil Harvey

+

Read, Write and Edit Meta Information!

+

Also available --> Utility to fix Nikon NEF images corrupted by Nikon software

+

Note: If exiftool.org goes down, it is because of the crappy DreamHost +web hosting which disables an "unlimited traffic" web site if a single bot hammers +the site with a moderate load. An alternate ExifTool homepage is available at +http://exiftool.sourceforge.net/

+ + + +
+ +Download Version 12.44 (4.8 MB) - +July 21, 2022
+ +

ExifTool is a platform-independent Perl +library plus a command-line application for +reading, writing and editing meta information in a +wide variety of files. +ExifTool supports many different metadata formats including +EXIF, +GPS, +IPTC, +XMP, +JFIF, +GeoTIFF, +ICC Profile, +Photoshop IRB, +FlashPix, +AFCP and +ID3, +Lyrics3, +as well as the maker notes of many digital cameras by +Canon, +Casio, +DJI, +FLIR, +FujiFilm, +GE, +GoPro, +HP, +JVC/Victor, +Kodak, +Leaf, +Minolta/Konica-Minolta, +Motorola, +Nikon, +Nintendo, +Olympus/Epson, +Panasonic/Leica, +Pentax/Asahi, +Phase One, +Reconyx, +Ricoh, +Samsung, +Sanyo, +Sigma/Foveon and +Sony.

+ +

ExifTool is also available as a stand-alone Windows executable and a +MacOS package: (Note that these versions contain the executable +only, and do not include the HTML documentation or other files of the full +distribution above.)

+ +
+Windows Executable: + + exiftool-12.44.zip (6.4 MB)
+ +

The stand-alone Windows executable does not require Perl. Just +download and un-zip the archive then double-click on +"exiftool(-k).exe" to read the application documentation, +drag-and-drop files and folders to view meta information, or rename to +"exiftool.exe" for command-line use. Runs on all versions +of Windows.

+ +

(Note: Oliver Betz provides an +alternate ExifTool Windows installer +that avoids some problems of the self-extracting archive version above. Please post +here +if you have any problems/comments with this version.)

+ +
+MacOS Package: + + ExifTool-12.44.dmg (3.1 MB)
+ +

The MacOS package installs the ExifTool command-line application and +libraries in /usr/local/bin. After installing, type "exiftool" in a +Terminal window to run exiftool and read the application documentation.

+ +

Read the installation instructions for help +installing ExifTool on Windows, MacOS and Unix systems.

+ + + +

Features

+ + +

A Note to Unix Power-Users

If you feel +the need to use "find" or "awk" in conjunction with ExifTool, then you probably +haven't discovered the full power of ExifTool. Read about the -ext, +-if, -p and -tagsFromFile options in the +application documentation. (This is +common mistake number 3.)
+ +

What People are Saying about ExifTool

+
+"In my experience, nothing but nothing is as complete, powerful, and flexible as +Phil Harvey's exiftool ... I've never seen anything that's in the same ballpark for power." +- dpreview forum
+
"While there are a lot of image tools available, nothing comes close for accessing/updating +the metadata like ExifTool" - merg's blog
+
"Fast, reliable and amazingly comprehensive ..." +- CPAN ratings
+
"... the one piece of free software that gets the most +detailed exif data of /any/ tool I've found." +- gnome mail archives +
+ +
"ExifTool makes every other EXIF reader (and writer) than I've +seen, including the camera manufacturers' readers, look lame." +- photo.net Nikon forum +
+
"Insanely great tool with a long learning curve ..." - +Adobe Forums +
+
"ExifTool has been outstanding in our custom used Tesla image gallery build. +We are able to aggregate image meta from our user base and incorporate this into development +iterations to continually optimize our platform..." +- Find My Electric
+
"... it's super awesome, it's super reliable and after many years of +development it's still being updated!" - +P_W999 blog +
+
"... it is the mother of all EXIF utilities; the BFG of meta-data +extraction; the Pan Galactic Gargle Blaster of EXIF tools ... This thing will +suck the last bit of metadata out of whatever image file you throw at it!" - +Open Photography Forums +
+
"... it is total fucking gibberish to me." - +Reddit Linux Questions +
+ +

Supported File Types

+

ExifTool can Read, Write and/or Create files in the following formats. +Also listed are the support levels for EXIF, IPTC, XMP, ICC_Profile and other metadata types +for each file format.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File TypeSupportDescriptionEXIFIPTCXMPICC1Other
360R/WGoPro 360 video (QuickTime-based)R/W3R/W3R/W/C-R/W/C QuickTime, R GoPro
3FRRHasselblad RAW (TIFF-based)RRRR-
3G2, 3GP2R/W3rd Gen. Partnership Project 2 a/v (QuickTime-based)R/W3R/W3R/W/C-R/W/C QuickTime
3GP, 3GPPR/W3rd Gen. Partnership Project a/v (QuickTime-based)R/W3R/W3R/W/C-R/W/C QuickTime
ARUnix static library code Archive----R EXE
AARAudible Audiobook----R Audible
AAERApple edit information (XML PLIST-based)----R PLIST
AAXR/WAudible Enhanced Audiobook (QuickTime-based)R/W3R/W3R/W/C-R/W/C QuickTime
ACRRAmerican College of Radiology ACR-NEMA (DICOM-like)----R DICOM
AFM, ACFM, AMFMRAdobe [Composite/Multiple Master] Font Metrics----R Font
AI, AITR/WAdobe Illustrator [Template] (PS or PDF)R/W/C4R/W/C4R/W/C5R/W/C4R/W/C PDF PostScript, R Photoshop
AIFF, AIF, AIFCRAudio Interchange File Format [Compressed]----R AIFF ID3 Lyrics3
APERMonkey's Audio----R APE ID3 Lyrics3
ARQR/WSony Alpha Pixel-Shift RAW (TIFF-based)R/W/CR/W/CR/W/CR/W/CR/W Sony SonyIDC
ARWR/WSony Alpha RAW (TIFF-based)R/W/CR/W/CR/W/CR/W/CR/W Sony SonyIDC
ASFRMicrosoft Advanced Systems Format--R-R ASF
AVIRAudio Video Interleaved (RIFF-based)R3-R-R RIFF
AVIFR/WAV1 Image File Format (QuickTime-based)R/W/C-R/W/CR/WR/W QuickTime
BMP, DIBRWindows BitMaP / Device Independent Bitmap----R BMP
BPGRBetter Portable GraphicsR-RRR BPG
BTFRBigTIFF (64-bit Tagged Image File Format)RRRR-
CHMRMicrosoft Compiled HTML format----R EXE
COSRCapture One Settings (XML-based)----R XML
CR2R/WCanon RAW 2 (TIFF-based) (CR2 spec)R/W/CR/W/CR/W/CR/W/CR/W Canon, R/W/C CanonVRD2
CR3R/WCanon RAW 3 (QuickTime-based) (CR3 spec)R/W/C-R/W/C-R/W Canon QuickTime, R/W/C CanonVRD2
CRMR/WCanon RAW Movie (QuickTime-based)R/W/C-R/W/C-R/W Canon QuickTime
CRW, CIFFR/WCanon RAW Camera Image File Format (CRW spec)--R/W/C-R/W CanonRaw, R/W/C CanonVRD2
CS1R/WSinar CaptureShop 1-shot RAW (PSD-based)R/W/CR/W/CR/W/CR/W/CR Photoshop
CSVRComma-Separated Values----R Text
CZIRZeiss Integrated Software RAW (ZISRAW)----R ZISRAW, R XML
DCM, DC3, DIC, DICMRDICOM - Digital Imaging and Communications in Medicine----R DICOM
DCPR/WDNG Camera Profile (DNG-like)R/W/CR/W/CR/W/CR/W/C-
DCRRKodak Digital Camera RAW (TIFF-based)RRRR-
DFONTRMacintosh Data Fork Font----R Font
DIVXRDivX media format (ASF-based)--R-R ASF
DJVU, DJVRDjVu image (AIFF-like)--R-R DJVU
DNGR/WDigital Negative (TIFF-based)R/W/CR/W/CR/W/CR/W/C-
DOC, DOTRMicrosoft Word Document/Template (FPX-like)--RRR FlashPix
DOCX, DOCMROffice Open XML Document [Macro-enabled]----R XML ZIP
DOTX, DOTMROffice Open XML Document Template [Macro-enabled]----R XML ZIP
DPXRDigital Picture Exchange----R DPX
DR4R/W/C2Canon DPP version 4 Recipe----R/W/C CanonVRD2
DSS, DS2RDigital Speech Standard [2]----R Olympus
DYLIBRMacOS Mach-O executable and library files----R EXE
DVRDigital Video----R DV
DVBR/WDigital Video Broadcasting (QuickTime-based)R/W3R/W3R/W/C-R/W/C QuickTime
DVR-MSRMicrosoft Digital Video Recording (ASF-based)--R-R ASF
EIPRCapture One Enhanced Image Package (ZIP-based)R---R XML ZIP
EPS, EPSF, PSR/W[Encapsulated] PostScript FormatR/W/CR/W/CR/W/CR/W/CR/W/C PostScript, R Photoshop
EPUBRElectronic Publication (ZIP/XML-based)----R XML ZIP
ERFR/WEpson RAW Format (TIFF-based)R/W/CR/W/CR/W/CR/W/CR/W Olympus
EXE, DLLRDOS/Windows executable and library files----R EXE
EXIFR/W/CExchangeable Image File Format metadata (TIFF-based)R/W/C----
EXRROpen EXR (Extended Range)----R OpenEXR
EXVR/W/CExiv2 metadata file (JPEG-based)R/W/CR/W/CR/W/CR/W/CSupported JPEG Meta Information
F4A, F4B, F4P, F4VR/WAdobe Flash Player 9+ Audio/Video (QuickTime-based)R/W3R/W3R/W/C-R/W/C QuickTime
FFFR/W6Hasselblad Flexible File Format (TIFF-based)R/W/CR/W/CR/W/CR/W/C-
FFFRFLIR Systems thermal image File Format----R FLIR
FITSRFlexible Image Transport System----R FITS
FLARMacromedia/Adobe Flash project (FPX-like)--RRR FlashPix
FLACRFree Lossless Audio Codec----R FLAC ID3 Lyrics3
FLIFR/WFree Lossless Image FormatR/W/C-R/W/CR/W/CR FLIF
FLVRFlash Video--R-R Flash
FPFRFLIR Public image Format----R FLIR
FPXRFlashPix image--RRR FlashPix
GIFR/WCompuserve Graphics Interchange Format--R/W/CR/W/CR/W/C GIF
GPRR/WGoPro RAW (DNG-based)R/W/CR/W/CR/W/CR/W/C-
GZ, GZIPRGNU ZIP compressed archive----R ZIP
HDP, WDP, JXRR/WWindows HD Photo / Media Photo / JPEG XR (TIFF-based)R/W/CR/W/CR/W/CR/W/C-
HDRRRadiance RGBE High Dynamic-Range----R Radiance
HEIC, HEIF, HIFR/WHigh Efficiency Image Format (QuickTime-based)R/W/C-R/W/CR/WR/W QuickTime
HTML, HTM, XHTMLR[Extensible] HyperText Markup Language----R HTML
ICC, ICMR/W/C1International Color Consortium color profile---R/W/C-
ICS, ICALRiCalendar Schedule----R VCalendar
IDMLRAdobe InDesign Markup Language (ZIP/XML-based)----R XML ZIP
IIQR/WPhase One Intelligent Image Quality RAW (TIFF-based)R/W/CR/W/CR/W/CR/W/CR/W PhaseOne
IND, INDD, INDTR/WAdobe InDesign Document/Template--R/W/C--
INSPR/WInsta360 Picture (JPEG-based)R/W/CR/W/CR/W/CR/W/CSupported JPEG Meta Information
INSVRInsta360 Video (QuickTime-based)--R-R QuickTime
INXRAdobe InDesign Interchange (XML-based)--R--
ISORISO 9660 disk image----R ISO
ITCRiTunes Cover Flow artwork----R ITC
J2C, J2K, JPCRJPEG 2000 codestreamR3R3RRR Jpeg2000 Photoshop3
JP2, JPF, JPM, JPXR/WJPEG 2000 image [Compound/Extended]R/W/C3R/W/C3R/W/CRR/W/C Jpeg2000, R Photoshop3
JPEG, JPG, JPER/WJoint Photographic Experts Group imageR/W/CR/W/CR/W/CR/W/CSupported JPEG Meta Information
JSONRJavaScript Object Notation----R JSON
JXLR/WJPEG XL (codestream and ISO BMFF)R/W/C-R/W/C--
K25RKodak DC25 RAW (TIFF-based)RRRR-
KDCRKodak Digital Camera RAW (TIFF-based)RRRRR Kodak
KEY, KTHRApple iWork '09 Keynote presentation/Theme----R XML ZIP
LARLossless Audio (RIFF-based)R3-R-R RIFF
LFP, LFRRLytro Light Field Picture----R Lytro
LIFRLeica Image File----R LIF
LNKRMicrosoft Shell Link (Windows shortcut)----R LNK
LRVR/WLow-Resolution Video (QuickTime-based)R/W3R/W3R/W/C-R/W/C QuickTime
M2TS, MTS, M2T, TSRMPEG-2 Transport Stream (used for AVCHD video)----R M2TS H264
M4A, M4B, M4P, M4VR/WMPEG-4 Audio/Video (QuickTime-based)R/W3R/W3R/W/C-R/W/C QuickTime
MACOSRMacOS "._" sidecar file (may have any extension)----R XAttr RSRC
MAXR3D Studio MAX (FPX-like)--RRR FlashPix
MEFR/WMamiya (RAW) Electronic Format (TIFF-based)R/W/CR/W/CR/W/CR/W/C-
MIER/W/CMeta Information Encapsulation (MIE specification)R/W/CR/W/CR/W/CR/W/CR/W/C MIE
MIFF, MIFRMagick Image File FormatRRRRR MIFF Photoshop
MKA, MKV, MKSRMatroska Audio/Video/Subtitle----R Matroska
MOBI, AZW, AZW3RMobipocket electronic book (Palm-based)----R Palm MOBI
MODDRSony Picture Motion metadata (XML PLIST-based)----R PLIST
MOIRMOD Information file----R MOI
MOSR/WCreo Leaf Mosaic (TIFF-based)R/W/CR/W/CR/W/CR/W/CR Leaf
MOV, QTR/WApple QuickTime MovieR/W3R/W3R/W/C-R/W/C QuickTime
MP3RMPEG-1 layer 3 audio----R MPEG ID3 Lyrics3 APE
MP4R/WMotion Picture Experts Group version 4 (QuickTime-based)R/W3R/W3R/W/C-R/W/C QuickTime
MPCRMusepack Audio----R MPC ID3 Lyrics3 APE
MPEG, MPG, M2VRMotion Picture Experts Group version 1 or 2----R MPEG ID3 Lyrics3
MPOR/WExtended Multi-Picture format (JPEG with MPF extensions)R/W/CR/W/CR/W/CR/W/CSupported JPEG Meta Information
MQVR/WSony Mobile QuickTime VideoR/W3R/W3R/W/C-R/W/C QuickTime
MRWR/WMinolta RAWR/W/CR/W/CR/W/CR/W/CR/W MinoltaRaw Minolta
MRCRMedical Research Council----R MRC
MXFRMaterial Exchange Format----R MXF
NEFR/WNikon (RAW) Electronic Format (TIFF-based)R/W/CR/W/CR/W/CR/W/CR/W Nikon NikonCapture
NKSCR/WNikon Sidecar (XMP-based)--R/W/C--
NMBTEMPLATERApple iWork '09 Numbers Template----R XML ZIP
NRWR/WNikon RAW (2) (TIFF-based)R/W/CR/W/CR/W/CR/W/CR/W Nikon NikonCapture
NUMBERSRApple iWork '09 Numbers spreadsheet----R XML ZIP
ORUnix compiled code Object----R EXE
ODB, ODC, ODF, ODG,
ODI, ODP, ODS, ODT
ROpen Document Database/Chart/Formula/Graphics/
Image/Presentation/Spreadsheet/Text (ZIP/XML-based)
----R XML ZIP
OFRROptimFROG audio (RIFF-based)R3-R-R RIFF
OGG, OGVROgg bitstream container----R FLAC ID3 Lyrics3 Theora Vorbis
ONPRON1 Presets----R JSON PLIST
OPUSROgg Opus audio----R FLAC ID3 Lyrics3 Opus Vorbis
ORF, ORIR/WOlympus RAW Format (TIFF-based)R/W/CR/W/CR/W/CR/W/CR/W Olympus
OTFROpen Type Font----R Font
PACRLossless Predictive Audio Compression (RIFF-based)R3-R-R RIFF
PAGESRApple iWork '09 Pages document----R XML ZIP
PCDRKodak Photo CD Image Pac----R PhotoCD
PCXRPC Paintbrush----R PCX
PDB, PRCRPalm Database----R Palm
PDFR/W7Adobe Portable Document FormatR3R3R/W/CR3R/W/C PDF, R Photoshop
PEFR/WPentax (RAW) Electronic Format (TIFF-based)R/W/CR/W/CR/W/CR/W/CR/W Pentax
PFA, PFBRPostScript Font ASCII/Binary----R Font
PFMRPrinter Font Metrics----R Font
PFMRPortable FloatMap----R PFM
PGFRProgressive Graphics File----R PGF PNG
PICT, PCTRApple Picture file---RR PICT Photoshop
PLISTRApple Property List (binary and XML formats)----R PLIST
PMPRSony DSC-F1 Cyber-Shot image----R Sony
PNG, JNG, MNGR/WPortable/JPEG/Multiple-image Network GraphicsR/W/C3R/W/C3R/W/CR/W/CR/W/C PNG
PPM, PBM, PGMR/WPortable Pixel/Bit/Gray Map----R PPM, R/W/C Comment
PPT, PPS, POTRPowerPoint Presentation/Slideshow/Template (FPX-like)--RRR FlashPix
POTX, POTMROffice Open XML Presentation Template [Macro-enabled]----R XML ZIP
PPAX, PPAMROffice Open XML Presentation Addin [Macro-enabled]----R XML ZIP
PPSX, PPSMROffice Open XML Presentation Slideshow [Macro-enabled]----R XML ZIP
PPTX, PPTMROffice Open XML Presentation [Macro-enabled]----R XML ZIP
PSD, PSB, PSDTR/WPhotoShop Document / Large Document / TemplateR/W/CR/W/CR/W/CR/W/CR Photoshop
PSP, PSPIMAGERPaint Shop ProR---R PSP
QTIF, QTI, QIFR/WQuickTime Image FileR/W3R/W3R/W/C-R/W/C QuickTime
R3DRRedcode RAW video----R Red
RARReal Audio----R Real ID3 Lyrics3
RAFR/WFujiFilm RAW FormatR/W/CR/W/CR/W/CR/W/CR/W FujiFilm
RAM, RPMRReal Audio/Plug-in Metafile----R Real
RARRRAR Archive----R ZIP
RAWRKyocera Contax N Digital RAW----R KyoceraRaw
RAWR/WPanasonic RAW (TIFF-based)R/W/CR/W/CR/W/CR/W/CR/W PanasonicRaw Panasonic
RIFF, RIFRResource Interchange File FormatR3-R-R RIFF
RM, RV, RMVBRReal Media/Video [Variable Bitrate]----R Real
RSRCRMac OS Resource----R RSRC Photoshop PostScript Font
RTFRRich Text Format----R RTF
RW2R/WPanasonic RAW 2 (TIFF-based)R/W/CR/W/CR/W/CR/W/CR/W PanasonicRaw Panasonic
RWLR/WLeica RAW (TIFF-based)R/W/CR/W/CR/W/CR/W/CR/W PanasonicRaw Panasonic
RWZRRawzor compressed imageRRRRR Rawzor
SEQRFLIR Systems image Sequence----R FLIR
SKETCHRSketch design file----R JSON ZIP
SORUnix ELF executable and Shared Object files----R EXE
SR2R/WSony RAW 2 (TIFF-based)R/W/CR/W/CR/W/CR/W/CR/W Sony
SRFRSony RAW Format (TIFF-based)RRRRR Sony
SRWR/WSamsung RAW format (TIFF-based)R/W/CR/W/CR/W/CR/W/CR/W Samsung
SVGRScalable Vector Graphics (XML-based)----R SVG
SWFRShockwave Flash--R-R Flash
THMR/WThumbnail image (JPEG)R/W/CR/W/CR/W/CR/W/CSupported JPEG Meta Information
THMXROffice Open XML Theme----R XML ZIP
TIFF, TIFR/WTagged Image File FormatR/W/CR/W/CR/W/CR/W/CR/W/C GeoTIFF1, R/W Trailers
TTF, TTCRTrue Type Font/Collection----R Font
TORRENTRBitTorrent description file----R Torrent
TXTRText files----R Text
VCF, VCARDRVirtual Card----R VCard
VOBRVideo Object (MPEG-based)----R MPEG
VRDR/W/C2Canon DPP Recipe Data--R/W/C-R/W/C CanonVRD2
VSDRMicrosoft Visio Drawing (FPX-like)--RRR FlashPix
WAVRWindows digital audio WAVeform (RIFF-based)R3-R-R RIFF
WEBMRGoogle Web Movie (Matroska-based)----R Matroska
WEBPRGoogle Web Picture (RIFF-based)R3-R-R RIFF
WMA, WMVRWindows Media Audio/Video (ASF-based)--R-R ASF
WTVRWindows recorded TV show----R WTV
WVRWavePack lossless audio (RIFF-based)R3-R-R RIFF
X3FR/WSigma/Foveon RAWR/W/CR/W/CR/W/CR/W/CR/W Sigma, R SigmaRaw
XCFRGIMP native image formatRRRRR GIMP
XLS, XLTRMicrosoft Excel Spreadsheet/Template (FPX-like)--RRR FlashPix
XLSX, XLSM, XLSBROffice Open XML Spreadsheet [Macro-enabled/Binary]----R XML ZIP
XLTX, XLTMROffice Open XML Spreadsheet Template [Macro-enabled]----R XML ZIP
XMPR/W/CExtensible Metadata Platform sidecar file--R/W/C--
ZIPRZIP archive----R ZIP
1 Block write only, +2 Block create only, +3 Non-standard format, +4 Only writable for PostScript-format file type, +5 Only writable for PDF-format file type, +6 Only writable when ignoring minor errors due to Phocus incompatibility, +7 Old metdata is never actually deleted
+

Supported JPEG Meta Information

+

ExifTool can Read, Write and/or Create the following types +of meta information in JPEG images:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
JPEG Meta InformationSupportDescription
APP0 - JFIFR/W/CJPEG File Interchange Format
APP0 - JFXXRExtended JFIF
APP0 - CIFFR/WCamera Image File Format (used by some Canon models)
APP0 - AVI1RJPEG AVI information
APP0 - OcadRPhotobucket Ocad segment
APP1 - EXIFR/W/CExchangeable Image File Format (multi-segment)
APP1 - XMPR/W/CExtensible Metadata Platform (multi-segment)
APP1 - QVCIRCasio QV-7000SX QVCI information
APP1 - FLIRRFLIR thermal imaging data (multi-segment)
APP1 - RawThermalImageRThermal image from Parrot Bebop-Pro Thermal drone
APP2 - ICCR/W/CInternational Color Consortium (multi-segment)
APP2 - FPXRRFlashPix Ready (multi-segment)
APP2 - MPFRMulti-Picture Format
APP2 - PreviewImageRSamsung/GE APP2 preview image (multi-segment)
APP3 - Kodak MetaR/WKodak Meta information (EXIF-like)
APP3 - StimRStereo Still Image format
APP3 - JPSRJPEG Stereo image
APP3 - ThermalDataRThermal data from DJI RJPEG file (multi-segment)
APP3 - PreviewImageRSamsung/HP preview image (multi-segment)
APP4 - ScaladoR(presumably written by Scalado mobile software)
APP4 - ThermalParamsRThermal parameters from DJI RJPEG file
APP4 - FPXRRFlashPix Ready in non-standard location (multi-segment)
APP4 - PreviewImageR(continued from APP3)
APP5 - Ricoh RMETARRicoh custom fields
APP5 - Samsung UniqueIDRSamsung Unique ID
APP5 - ThermalCalibrationRThermal calibration data from DJI RJPEG file
APP5 - PreviewImageR(continued from APP4)
APP6 - EPPIMRToshiba PrintIM
APP6 - NITFRNational Imagery Transmission Format
APP6 - HP TDHDRHewlett-Packard Photosmart R837 TDHD information
APP6 - GoProRGoPro Metadata Format (GPMF) information
APP6 - DJI DTATRDJI Thermal Analysis Tool record (JSON format)
APP7 - PentaxRPentax APP7 maker notes
APP7 - QualcommRQualcomm Camera Attributes
APP7 - HuaweiRHuawei APP7 maker notes (extract with Unknown option)
APP8 - SPIFFRStill Picture Interchange File Format
APP9 - Media JukeboxRMedia Jukebox XML information
APP10 - CommentRPhotoStudio Unicode Comment
APP11 - JPEG-HDRRJPEG-HDR compressed ratio image
APP11 - JUMBFRJpeg Universal Metadata Box Format (multi-segment)
APP12 - Picture InfoRASCII-based Picture Information
APP12 - DuckyR/W/CPhotoshop "Save for Web"
APP13 - Photoshop IRBR/W/CImage Resource Block (multi-segment, includes IPTC)
APP13 - Adobe CMRAdobe Color Management
APP14 - AdobeR/W/CAdobe DCT filter
APP15 - GraphicConverterRGraphicConverter quality
COMR/W/CJPEG Comment (multi-segment)
DQTR(used to calculate the Extra:JPEGDigest tag value)
SOFRJPEG Start Of Frame
JPEG Trailer 1SupportDescription
AFCP trailerR/WAXS File Concatenation Protocol (includes IPTC)
CanonVRD trailerR/W/CCanon DPP Recipe Data (includes DR4)
FotoStation trailerR/WFotoWare FotoStation (includes IPTC)
PhotoMechanic trailerR/WCamera Bits Photo Mechanic
MIE trailerR/WMeta Information Encapsulation
Samsung trailerRSamsung Galaxy trailer
Insta360 trailerRInsta360 trailer found in INSP files
NikonApp trailerRNikon trailer added by NX Studio to NEF/NRW files
PreviewImage trailerR/W/C(preview image written after JPEG EOI)
EmbeddedVideo trailerR(extracted only with ExtractEmbedded option)
1 All trailers except Samsung, Insta360, PreviewImage and EmbeddedVideo also have +R/W support in TIFF images, and the NikonApp trailer is used in NEF/NRW files.
+ +

System Requirements

+ +

Requires Perl 5.004 or later. No other libraries or software required, but +some optional Perl modules may be added to enable certain ExifTool features (for +details, see the DEPENDENCIES section of the README file included in the full +distribution).

+ +

Windows users: A stand-alone Windows executable +version of ExifTool is available which doesn't require Perl. You can also use +the pure Perl version if you already have Perl installed. (You can get a good, +free Perl interpreter from +activeperl.com.)

+ +

Everyone else (Mac, Unix, etc): Don't worry, you already have +Perl installed.

+ +

Running ExifTool

+ +

The exiftool application provides a +convenient command-line interface for the +Image::ExifTool Perl package (both included in the +full distribution). Once you have downloaded and extracted the distribution, you +can immediately run exiftool (without building or installing) by typing +"DIR/exiftool FILE" (or +"perl DIR/exiftool FILE" in Windows), where +DIR is the exiftool directory and FILE +is the name of an image file, including directory name. Read the +installation instructions or the README file included +in the full distribution for help installing ExifTool.

+ +

Many command-line options are available to allow you to access a wide range +of features. Run exiftool with no arguments for a +complete list of available options with +examples.

+ +

Running in Windows

+ +

i) From the command line:

+ +

The Perl application ("exiftool") is run by typing "perl +exiftool". Alternately, you may be able to rename it to +"exiftool.pl" and type "exiftool.pl", but this +requires that the proper Windows associations have been made for the the +".pl" extension.

+ +

The stand-alone version ("exiftool(-k).exe") should be +renamed to "exiftool.exe" to allow it to be run by typing +"exiftool" at the command line.

+ +

If the exiftool executable ("exiftool.pl" or +"exiftool.exe") is not in the current directory or your system +PATH, then its directory must be specified on the command line (eg. by typing +"c:\path_to_exiftool\exiftool.pl" or +"c:\path_to_exiftool\exiftool").

+ +

Note that when typing commands in the "cmd.exe" shell, you should use double +quotes instead of single quotes as shown in some examples.

+ +

ii) Stand-alone version in the Windows GUI:

+ +

Double-click on "exiftool(-k).exe" to read the application +documentation, or drag-and-drop files and folders to run exiftool on the +selected files.

+ +

Simple options may be added inside brackets in the name of the stand-alone +executable. (But note that the characters /\?*:|"<> may not +be used because they are invalid in Windows file names.) In this way, the +behaviour of the drag-and-drop application can be customized. For example:

+ +
+ + + + + + + + + +
Executable NameOperation
exiftool(-k).exe
Print meta information in window and pause before terminating.
exiftool(-k -a -u -g1 -w txt).exe
Generate output ".txt" files with detailed meta information.
exiftool(-k -o %d%f.xmp).exe
Generate sidecar ".xmp" files.
exiftool(-copyright='Phil Harvey').exe
Add copyright information (and don't pause before terminating).
+ +

Hint: Options may also be added to the "Target" property of a Windows +shortcut for the executable. Using a shortcut has 3 advantages over adding +options in the file name: 1) different shortcuts may be created without +requiring multiple copies of the executable, 2) characters which are invalid +in file names may be used, and 3) the shortcuts can be given more meaningful +(and convenient) file names.

+ +

As well, it may be useful to increase the window and buffer sizes to display +more information: Right-click on the window's title bar then select +"Properties" from the menu and change the window layout settings.

+ +

Example Output

+ +
+
+> exiftool -h -canon t/images/Canon.jpg
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File NameCanon.jpg
Camera Model NameCanon EOS DIGITAL REBEL
Date/Time Original2003:12:04 06:46:52
Shooting ModeBulb
Shutter Speed4
Aperture14.0
Metering ModeCenter-weighted average
Exposure Compensation0
ISO100
Lens18.0 - 55.0 mm
Focal Length34.0 mm
Image Size8x8
QualityRAW
FlashNo Flash
White BalanceAuto
Focus ModeManual Focus (3)
Contrast+1
Sharpness+1
Saturation+1
Color ToneNormal
Color SpacesRGB
File Size2.6 kB
File Number118-1861
Drive ModeContinuous Shooting
Owner NamePhil Harvey
Serial Number0560018150
+
+> exiftool -lang de -h -canon t/images/Canon.jpg
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DateinameCanon.jpg
KameramodellCanon EOS DIGITAL REBEL
Erstellungsdatum/-uhrzeit2003:12:04 06:46:52
AufnahmemodusBulb
Belichtungsdauer4
Blende14.0
BelichtungsmessmethodeMittenbetont
Belichtungskorrektur0
ISO-Empfindlichkeit100
Objektiv18.0 - 55.0 mm
Brennweite34.0 mm
Bildgröße8x8
QualitätRAW
BlitzmodusBlitz wurde nicht ausgelöst
WeißabgleichAutomatisch
Fokus-ModusManueller Fokus (3)
Kontrast+1
Schärfe+1
Farbsättigung+1
FarbtonNormal
FarbraumsRGB
Dateigröße2.6 kB
Dateinummer118-1861
AufnahmeartSerienaufnahme
Name des BesitzersPhil Harvey
Seriennummer0560018150
+
+
+ +

Verbose and HtmlDump Output

+ +

The Verbose (-v) and HtmlDump (-htmlDump) options print additional +information that can be very useful for debugging or when decoding new tags.

+ +

Tag Names Explained

+ +

A tag name is a "handle" that is used to refer to a specific piece of meta +information. Tag names are entered on the command line with a leading +'-', in the order you want them displayed. Case is not +significant. The tag name may be prefixed by a group name +(separated by a colon) to identify a specific information type or location. A +special tag name of "All" may be used to represent all tags, or all +tags in a specified group. For example:

+ +
+exiftool -filename -imagesize -exif:fnumber -xmp:all image.jpg
+
+ +

A complete list of ExifTool Tag Names +accompanies this documentation. As well, current lists of available tag names +and writable tag names may be obtained using the exiftool -list and +-listw options. But perhaps the easiest way to determine a tag name +is to use the -s option to print the tag names instead of +descriptions for all information in a file. It may also be helpful to use the +-G option to display the group names, and the -H or +-D option to print the numerical tag ID's for reference.

+ +

Notes:

+ +
  1. Tag names sometimes differ from their descriptions. Use the +-s command-line option to see the actual tag names instead of the +descriptions shown when extracting information.
  2. +
  3. When extracting information, tags will not appear in the output unless they +exist in the file, even if they are specified on the command line. The +-f option may be used to force all specified tags to be displayed +(not including tags specified with wildcards or by -GROUP:all).
  4. +
  5. Information for a given tag name may occur in multiple locations within a +single file. By default these duplicate tags are suppressed, but the -a +option may be used to extract all tags.
  6. +
  7. Tag names may be suffixed by a '#' character to disable the +print conversion on a per-tag basis. See the +-n option in the application +documentation for more information.
  8. +
+ +

Shortcut Tags

+

Shortcut tags represent one or more other tags, and are used like any other +tag when reading, writing or copying information.

+ +

ExifTool defines a few shortcut tags +in the Image::ExifTool::Shortcuts module, and allows users to define their own +shortcuts in a configuration file called +".ExifTool_config" in their home directory or exiftool application +directory. Here is a simple example that defines two shortcuts:

+ +
+%Image::ExifTool::UserDefined::Shortcuts = (
+    MyShortcut => ['createdate','exposuretime','aperture'],
+    MyAlias => 'FocalLengthIn35mmFormat',
+);
+
+ +

In this example, MyShortcut is a shortcut for the CreateDate, ExposureTime +and Aperture tags, and MyAlias is a shortcut for FocalLengthIn35mmFormat.

+ +

The current shortcuts may be listed with the -list option.

+ +

The ~/.ExifTool_config file may also be used to define new tags. +For more information about the configuration file, see the +sample configuration file included with the ExifTool +distribution.

+ +

Windows tip: You may have difficulty generating a filename beginning +with a '.' in the Windows GUI, but it can be done with the +"rename" command at the cmd.exe prompt.

+ +

Tag Groups

+ +

ExifTool classifies tags into groups in various families. Here is a list +of the group names in each family:

+ +
+ + + + + + + + + + + + + + + + + +
FamilyGroup Names
0 (Information Type)AFCP, AIFF, APE, APP0, APP1, APP11, APP12, APP13, APP14, APP15, APP3, APP4, +APP5, APP6, APP8, ASF, Audible, CanonVRD, Composite, DICOM, DNG, DV, DjVu, +Ducky, EXE, EXIF, ExifTool, FITS, FLAC, FLIR, File, Flash, FlashPix, Font, +FotoStation, GIF, GIMP, GeoTiff, GoPro, H264, HTML, ICC_Profile, ID3, IPTC, +ISO, ITC, JFIF, JPEG, JSON, JUMBF, Jpeg2000, LNK, Leaf, Lytro, M2TS, MIE, +MIFF, MNG, MOI, MPC, MPEG, MPF, MXF, MakerNotes, Matroska, Meta, Ogg, +OpenEXR, Opus, PDF, PICT, PLIST, PNG, PSP, Palm, Parrot, PanasonicRaw, +PhotoCD, PhotoMechanic, Photoshop, PostScript, PrintIM, QuickTime, RAF, +RIFF, RSRC, RTF, Radiance, Rawzor, Real, Red, SVG, SigmaRaw, Stim, Theora, +Torrent, Trailer, UserParam, VCard, Vorbis, WTV, XML, XMP, ZIP +
1 (Specific Location)AC3, AFCP, AIFF, APE, ASF, AVI1, Adobe, AdobeCM, AdobeDNG, Apple, Audible, +CBOR, CIFF, CameraIFD, Canon, CanonCustom, CanonRaw, CanonVRD, Casio, +Chapter#, Composite, DICOM, DJI, DNG, DV, DjVu, DjVu-Meta, Ducky, EPPIM, +EXE, EXIF, ExifIFD, ExifTool, FITS, FLAC, FLIR, File, Flash, FlashPix, Font, +FotoStation, FujiFilm, FujiIFD, GE, GIF, GIMP, GPS, GeoTiff, GlobParamIFD, +GoPro, GraphConv, H264, HP, HTC, HTML, HTML-dc, HTML-ncc, HTML-office, +HTML-prod, HTML-vw96, HTTP-equiv, ICC-chrm, ICC-clrt, ICC-header, ICC-meas, +ICC-meta, ICC-view, ICC_Profile, ICC_Profile#, ID3, ID3v1, ID3v1_Enh, +ID3v2_2, ID3v2_3, ID3v2_4, IFD0, IFD1, IPTC, IPTC#, ISO, ITC, Insta360, +InteropIFD, ItemList, JFIF, JFXX, JPEG, JPEG-HDR, JPS, JSON, JUMBF, JVC, +Jpeg2000, KDC_IFD, Keys, Kodak, KodakBordersIFD, KodakEffectsIFD, KodakIFD, +KyoceraRaw, LNK, Leaf, LeafSubIFD, Leica, Lyrics3, Lytro, M2TS, MAC, +MIE-Audio, MIE-Camera, MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash, MIE-GPS, +MIE-Geo, MIE-Image, MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, +MIE-Orient, MIE-Preview, MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video, +MIFF, MNG, MOBI, MOI, MPC, MPEG, MPF0, MPImage, MS-DOC, MXF, MacOS, +MakerNotes, MakerUnknown, Matroska, MediaJukebox, Meta, MetaIFD, Microsoft, +Minolta, MinoltaRaw, Motorola, NITF, Nikon, NikonCapture, NikonCustom, +NikonScan, NikonSettings, NineEdits, Nintendo, Ocad, Ogg, Olympus, OpenEXR, +Opus, PDF, PICT, PNG, PNG-pHYs, PSP, Palm, Panasonic, PanasonicRaw, Pentax, +PhaseOne, PhotoCD, PhotoMechanic, Photoshop, PictureInfo, PostScript, +PreviewIFD, PrintIM, ProfileIFD, Qualcomm, QuickTime, RAF, RAF2, RIFF, +RMETA, RSRC, RTF, Radiance, Rawzor, Real, Real-CONT, Real-MDPR, Real-PROP, +Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red, Ricoh, SPIFF, SR2, +SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung, Sanyo, Scalado, Sigma, SigmaRaw, +Sony, SonyIDC, Stim, SubIFD, System, Theora, Torrent, Track#, UserData, +UserParam, VCalendar, VCard, Version0, Vorbis, WTV, XML, XMP, XMP-DICOM, +XMP-Device, XMP-GAudio, XMP-GDepth, XMP-GFocus, XMP-GImage, XMP-GPano, +XMP-GSpherical, XMP-LImage, XMP-MP, XMP-MP1, XMP-PixelLive, XMP-aas, +XMP-acdsee, XMP-album, XMP-apple-fi, XMP-aux, XMP-cc, XMP-cell, +XMP-creatorAtom, XMP-crs, XMP-dc, XMP-dex, XMP-digiKam, XMP-drone-dji, +XMP-dwc, XMP-exif, XMP-exifEX, XMP-expressionmedia, XMP-extensis, XMP-fpv, +XMP-getty, XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro, +XMP-microsoft, XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-pdf, XMP-pdfx, +XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi, XMP-prism, XMP-prl, +XMP-prm, XMP-pur, XMP-rdf, XMP-swf, XMP-tiff, XMP-x, XMP-xmp, XMP-xmpBJ, +XMP-xmpDM, XMP-xmpMM, XMP-xmpNote, XMP-xmpPLUS, XMP-xmpRights, XMP-xmpTPg, +ZIP, iTunes +
2 (Category)Audio, Author, Camera, Device, Document, ExifTool, Image, Location, Other, +Preview, Printing, Time, Unknown, Video +
3 (Document Number)Doc#, Main +
4 (Instance Number)Copy# +
5 (Metadata Path)[experimental] eg. JPEG-APP1-IFD0-ExifIFD +
6 (EXIF/TIFF Format)int8u, string, int16u, int32u, rational64u, int8s, undef, int16s, int32s, +rational64s, float, double, ifd, unicode, complex, int64u, int64s, ifd64
7 (Tag ID)ID-xxx (where xxx is the tag ID. Numerical ID's are given in hex with a +leading "0x" if the HexTagIDs API option +is set, as are characters in non-numerical ID's which are not valid in a group +name. Note that unlike other group names, family 7 group names are case +sensitive.)
+ +

The exiftool output can be organized based on these groups using the +-g or -G option (ie. -g1 to see family 1 +groups, or -g3:1 to see both family 3 and family 1 group names in +the output. See the -g option in the exiftool application +documentation for more details, and the GetGroup +function in the ExifTool library for a description of the group families. Note +that when writing, only family 0, 1, 2 and 7 group names may be used.

+ +

Writing Meta Information

+ +

When writing information, ExifTool preserves the original file by adding +"_original" to the file name. Be sure to keep a copy of the +original, or thoroughly validate the new file before erasing the original. +(Read here for some ramblings on the subject of +writing meta information.)

+ +

Syntax

+ +

Tag values are written rather than being extracted if any tag name ends with +a '=' symbol (or if the -tagsFromFile or +-geotag options are used). The '=' may be prefixed by +'+', '-' or '<' to add a value, remove +a value or set a value from file. The following table outlines the different +write syntaxes:

+ +
+ + + + + + + + + +
SyntaxResult
-TAG=Deletes all occurrences of TAG
-all=Deletes all meta information!
-GROUP:TAG=Deletes TAG only in specified group
-GROUP:all=Deletes all information in specified group
-[GROUP:]TAG=VALUESets value of TAG (only in GROUP if specified)
-[GROUP:]TAG+=VALUEAdds item to a list, shifts a date/time, or increments a number
-[GROUP:]TAG-=VALUERemoves item from a list, shifts a date/time, or deletes TAG if it has the specified value
-[GROUP:]TAG<=FILESets tag value from contents of specified file
See the Writer Limitations for some limitations of this feature.
+ +

Quotes are required around VALUE if it contains spaces or other +special characters, and around the whole argument if the '<=' +syntax is used (to prevent shell redirection).

+ +

A special feature allows the print conversion to be disabled on a per-tag +basis by suffixing any tag name (including 'all') with the +'#' character. This has the same effect as the +-n option, but for a single tag. See the +-n option in the application +documentation for more details.

+ +

Note: Changes to PDF files are reversible because the original +metadata is never actually deleted from these files. See the +PDF Tags documentation for details.

+ +

Group Priorities

+ +

ExifTool prioritizes the following types of meta information when writing:

+ +
+1) EXIF,   2) IPTC,   3) XMP +
+ +

Many tag names are valid for more than one of these groups. If a group name is +not specified when writing information, then the information is added only to +the highest priority group for which the tag name is valid (however, the +information is updated in all groups where the tag already existed). The +priority of the groups is given by the list above. Specifically, this means that +new information is added preferentially to the EXIF group, or to the IPTC group +if no corresponding EXIF tag exists, or finally to the XMP group.

+ +

Alternatively, information may be written to a specific group only, bypassing +these priorities, by providing a group name for the tag. The +"Writing Meta Information" section above gave the syntax +rules for exiftool command-line arguments to do this. Any family 0, 1, 2 or 7 group +name may be used when writing information, although not all groups are writable.

+ +

The "-tagsFromFile" Option

+ +

A special ExifTool option allows copying tags from one file to another. The +command-line syntax for doing this is +"-tagsFromFile SRCFILE". Any tags specified after this +option on the command line are extracted from source file and written to the +destination file. If no tags are specified, then all writable tags are copied. +This option is very simple, yet very powerful. Depending on the formats of the +source and destination files, some of tags read may not be valid in the +destination file, in which case they aren't written.

+ +

This option may also be used to transfer information between different tags +within a single image or between different images. See the +-tagsFromFile +option in the application documentation for more details.

+ +

Writer Limitations

+
    +
  • ExifTool will not rewrite a file if it detects a significant problem +with the file format.
  • +
  • ExifTool has been tested with a wide range of different images, but since it +is not possible to test it with every known image type, there is the possibility +that it will corrupt some files. Be sure to keep backups of your files.
  • +
  • Even though ExifTool does some validation of the information written, it is +still possible to write illegal values which may cause problems when +reading the images with other software. So take care to validate the +information you are writing.
  • +
  • ExifTool is not guaranteed to remove metadata completely from a file +when attempting to delete all metadata. For JPEG images, all APP segments +(except Adobe APP14, which is not removed +by default) and trailers are removed which effectively removes all metadata, but +for other formats the results are less complete: +
      +
    • JPEG - APP segments (except Adobe APP14) and trailers are removed.
    • +
    • TIFF - XMP, IPTC, ICC_Profile and the ExifIFD are removed, but some EXIF may remain in IFD0. (The CommonIFD0 + Shortcut tag is provided to simplify removal of common metadata tags from IFD0.)
    • +
    • PNG - Only XMP, EXIF, ICC_Profile and native PNG textual data chunks are removed.
    • +
    • PDF - The original metadata is never actually removed.
    • +
    • PS - Only XMP and some native PostScript tags may be deleted.
    • +
    • MOV/MP4 - Most top-level metadata is removed.
    • +
    • RAW formats - It is not recommended to remove all metadata from RAW images +because this will likely remove some proprietary information that is necessary +for proper rendering of the image.
    • +
  • +
+ +

Known Problems

+
    +
  • [2020-02-18] +Hasselblad Phocus software will no longer update the small preview or +thumbnail images of FFF files edited by ExifTool. This is perhaps due to +some unreferenced preview information +in the file that is lost when edited by ExifTool, but this does not seem to have +any other effect. +[ExifTool 11.88 and later issue a minor error when attempting to +write FFF files, but this problem seems to be fixed in Phocus v3.5.4]
  • +
  • [2019-05-29] +Canon Digital Photo Professional 4 (DPP4) will destroy a CR3 image +when editing if it had previously been edited by DPP4 followed by ExifTool. +[ExifTool 11.45 fixes this by structuring the CR3 to make it safe +for editing with DPP4, and may be used to restructure files written by older +ExifTool versions.]
  • +
  • [2018-09-27] +The Sony Imaging Edge applications give an error when trying to open +ARW or ARQ images edited by ExifTool, although other RAW image +utilities including Sony IDC (Sony's older RAW image converter), Adobe +Photoshop, Lightroom and DNG Converter, Apple Preview, dcraw, Capture One, +Affinity Photo, and LibRaw's SonyPixelShift2DNG have no problems with these.
  • +
  • [2016-08-03] +Some antivirus software has been known to cause problems for the Windows +version of ExifTool. Norton Antivirus may delete ExifTool when it is run, +Windows Defender may slow down launching of ExifTool or hang it altogether, +and Bitdefender Antivirus may block ExifTool from writing files. +Presumably this is due to the way the ExifTool package for Windows works -- it +unpacks executable files into a temporary directory and runs from there, which +apparently may be seen as a threat by antivirus software. A work-around is to +add ExifTool to the exclusion list of the antivirus software.
  • +
  • [2016-05-27] +Adobe Camera Raw and DNG Converter 9.5.1 fail to recognize edited +Samsung SRW images from some models (NX30, NX300, NX2000 and EK-GN120). +[This problem was fixed for the NX models in ExifTool 10.26, and +writing of EK-GN120 files was disabled in ExifTool 10.95]
  • +
  • In Windows, ExifTool will not process files with Unicode characters +in the file name. This is due to an underlying lack of support for Unicode +filenames in the Windows standard C I/O libraries. [This deficiency +was addressed in ExifTool 9.79, and ExifTool now supports Windows Unicode file +names with some exceptions. See the +WINDOWS UNICODE FILE NAMES +section of the application documentation for details.]
  • +
  • [2013-11-08] +Apple Spotlight and Preview (OS X 10.8.5) and Adobe Photoshop +CC (version 14.0) ignore XMP in PNG images if it comes after the image +data, which is where ExifTool adds new XMP. This should be considered as a bug +in the Apple and Adobe software since XMP is allowed to exist after the image +data according to the XMP and PNG specifications. [ExifTool 9.40 +provides the PNGEarlyXMP API option to allow writing XMP before the IDAT chunk, +but there are caveats associated with its use. ExifTool 11.58 and later remove +this option and always write XMP before IDAT, and 11.63 and later write all +text chunks before IDAT.]
  • +
  • [2013-04-21] +Memory available to ExifTool in the Windows EXE version is limited to +a few hundred MB. This limitation has been known to cause unreasonably long +processing times (almost 7 minutes) for some large EPS files (> 200 MB) which +are processed much faster by the Perl version (< 6 seconds).
  • +
  • [2010-01-12] +There is a bug in a number of Adobe utilities which causes some +edited Sony ARW images to be displayed with the wrong tone curve. This +problem has been observed in Photoshop CS4 Camera Raw 5.6, DNG Converter 5.6 and +Lightroom 2.6 with ARW images from the A500, A550, A700, A850 and A900. Other +software such as the Sony IDC utility, Apple RAW utilities, dcraw and Capture +One have no problems with edited images. [This bug is fixed in +Camera Raw 6.3 and LR 3.3]
  • +
  • [2007-07-06] +There is a bug in the Apple RAW file support (OS X 10.4.11) which +prevents some edited Pentax PEF images from being displayed properly. +Other software such as the Pentax Silkypix software and dcraw have no problems +with these images. [This bug is fixed in OS X 10.5.4]
  • +
+ +

Security Issues

+

Some ExifTool options (-config, -if, +-p, -api filter, -api filterw and +copying arguments like "-DSTTAG<STR") have the ability to +execute Perl code from external files or within command-line arguments. This +may be a security problem if ExifTool is executed from another application that +blindly passes untrusted file names on the command line (since they may be +interpreted as ExifTool options if they begin with a dash). To be secure the +calling application must either place file names after the "--" +option, or ensure that input file names do not start with a dash (U+002D) or a +Unicode minus sign (U+2212). One way to accomplish this is to prefix input file +names with a known directory name, eg.) "./FILENAME".

+

As well, untrusted window title strings should not be using with the +-progress:TITLE option.

+ +

Date/Time Shift Feature

+ +

Have you ever forgotten to set the date/time on your digital camera before +taking a bunch of pictures? ExifTool has a time shift feature that makes it +easy to apply a batch fix to the timestamps of the images (eg. change the "Date +Picture Taken" reported by Windows Explorer). Say for example that your camera +clock was reset to 2000:01:01 00:00:00 when you put in a new battery at +2005:11:03 10:48:00. Then all of the pictures you took subsequently have +timestamps that are wrong by 5 years, 10 months, 2 days, 10 hours and 48 +minutes. To fix this, put all of the images in the same directory +("DIR") and run exiftool:

+ +
+exiftool "-DateTimeOriginal+=5:10:2 10:48:0" DIR
+
+ +

The example above changes only the DateTimeOriginal tag, but any writable date +or time tag can be shifted, and multiple tags may be written with a single +command line. Commonly, in JPEG images, the DateTimeOriginal, CreateDate and +ModifyDate values must all be changed. For convenience, a +Shortcut tag called AllDates has been defined to +represent these three tags. So, for example, if you forgot to set your camera +clock back 1 hour at the end of daylight savings time in the fall, you can fix +the images with:

+ +
+exiftool -AllDates-=1 DIR
+
+ +

See +Image::ExifTool::Shift.pl +(download in PDF format) +for details about the syntax of the time shift string.

+ +

Note: Not all date/time information is covered by the AllDates +shortcut. Specifically, the filesystem date/time tags are not included, and this +command will reset FileModifyDate to the current date/time as it should when the +file is modified, unless either the -P option is used, or +FileModifyDate is set to something else. To shift FileModifyDate along with the +other tags, add -FileModifyDate-=1 to the command above.

+ +

Renaming and/or Moving Files

+ +

By writing a new value to the FileName and/or Directory tags, +files can be renamed and/or moved to different directories. This can be a very +powerful tool in combination with the -d (date format) option for +organizing images by date/time. For example, the following command renames all +images in directory "DIR" according to the individual file's +creation date in the form "YYYYmmdd_HHMMSS.ext".

+ +
+exiftool "-FileName<CreateDate" -d "%Y%m%d_%H%M%S.%%e" DIR
+
+ +

Or a new directory can be specified by setting the value of the Directory +tag. For example, the following command moves all images originally in +directory "DIR" into a directory hierarchy organized by +year/month/day:

+ +
+exiftool "-Directory<DateTimeOriginal" -d "%Y/%m/%d" DIR
+
+ +

Read here for more details about this powerful +feature.

+ +

Improving Performance

+ +

There is a significant overhead in loading ExifTool, so performance may be +greatly improved by taking advantage of ExifTool's batch processing capabilities +(the ability to process multiple files or entire directories with a single +command) to reduce the number of executed commands when performing complex +operations or processing multiple files. +[One exiftool user + +documented a 60x speed increase by processing a large number of files with a single +command instead of running exiftool separately on each file.] Also, the +-execute option may be used to perform multiple independent +operations with a single invocation of exiftool, and together with the +-stay_open option provides a method for calling applications to +avoid this startup overhead.

+ +

It has also been observed that the loading time of ExifTool for Windows +increases significantly when Windows Defender is active. Disabling Windows +Defender may speed things up significantly.

+ +

The processing speed of ExifTool can be improved when extracting information +by reducing the amount of work that it must do. Decrease the number of +extracted tags by specifying them individually (-TAG) or by group +(-GROUP:all), and disable the composite tags (-e) and +the print conversions (-n) if these features aren't required. Note +that the exclude options (-x or --TAG) are not very +efficient, and may have a negative impact on performance if a large number of +tags are excluded individually. The exception is XMP groups, which are bypassed +in processing so they are never even extracted -- specifying +--XMP-crs:all and -XMP-crd:all may speed processing +significantly by avoiding processing of bulky Adobe image-editing information.

+ +

The -fast option can significantly increase speed when +extracting information from JPEG images which are piped across a slow network +connection. However, with this option any information in a JPEG trailer is not +extracted. For more substantial speed benefits, -fast2 may be +used to also avoid extracting MakerNote information if this is not required, +or -fast4 if only pseudo System tags are required.

+ +

When writing, avoid copying tags (with -tagsFromFile) or using +the -if or -fileOrder option because these will add +the extra step of extracting tags from the file. Without these the write +operation is accomplished with a single pass of each file.

+ +
However, +note that when the -csv option is used, information from all files +is buffered in memory before the CSV output is written. This may be very memory +intensive and result in poor performance when reading a large number of files in +a single command.
+ +

The Image::ExifTool Perl Library Module

+ +

The "exiftool" script provides a command-line interface to the +Image::ExifTool Perl library module which is part of the ExifTool distribution. +The Image::ExifTool module can be used in any Perl script to provide easy access +to meta information. Here is an example of a very simple script that uses +Image::ExifTool to print out all recognized meta information in a file:

+ +
+#!/usr/bin/perl -w
+use Image::ExifTool ':Public';
+my $file = shift or die "Please specify filename";
+my $info = ImageInfo($file);
+foreach (keys %$info) {
+    print "$_ : $info->{$_}\n";
+}
+
+ +

Note that some tag values may be returned as SCALAR references indicating +binary data. The simple script above does not handle this case.

+ +

See the Image::ExifTool Documentation for more details.

+ +

Additional Documentation and Resources

+ + +

User-contributed Documentation

+ + +

Related Utilities

+ +

Below are some free utilities which take advantage of the ExifTool engine:

+ +

Windows

+ + +

MacOS

+
    +
  • Download +a stand-alone PPC droplet to extract preview images from RAW files (thanks to Brett Gross)
  • +
  • Download +three droplets to extract information [exiftool must be installed] (thanks to Rob Lewis)
  • + +
  • MacMetaMod: Droplet for adding Keywords to images
  • +
  • GPSPhotoLinker: Geotagging on the Mac
  • + +
  • PhotoGPSEditor and PhotoInfoEditor: Geocoding utilities
  • +
  • MetaDataMover (source): GUI-based automator utility for moving/renaming images
  • +
  • CS1ToCR2: Utility that uses Sony GPS-CS1 log files to add GPS information to CR2 images
  • + +
  • Geotagger: Droplet for inserting GPS coordinates in your photos
  • +
  • Raw Photo Processor: Raw converter for MacOS
  • +
  • GraphicConverter: Full-featured image editor [noteworthy, but not free]
  • +
  • GeoTag: Geotagging application for iPhone and MacOS
  • +
  • ImageFuser: Fuses multiple exposures of a scene into one image with improved detail/exposure
  • +
  • GeoNamesTagger: Docklet to easily update image metadata with location specific information
  • +
  • SetEXIFData: Add/modify EXIF data in images
  • +
  • GeoTagster: Geotagging from GPX files ($0.99 paid app)
  • +
  • Exif Photoworker: Smart rename and organize your photos and videos in a few clicks
  • +
  • MetaImage: Reads, writes and edits your image metadata in a familiar interface
  • +
+ +

Linux

+
    +
  • rawimage: A kfile plugin and thumbnail image handler for RAW formats
  • + + +
  • Hugin: Panorama photo stitcher
  • +
  • FotoPreProcessor: PyQt4-based frontend for exiftool to graphically edit metadata
  • +
  • ExZenToo: Script for basic ExifTool GUI using Zenity
  • +
  • PDFMted: A set of bash scripts for easy viewing and editing of PDF metadata
  • +
  • exiftool-zsh-completion: zsh completion for exiftool
  • +
  • Image MetaWriter: Batch processing Linux command-line program for adding metadata to images
  • +
+ +

Android

+ + +

Multi-Platform

+
    +
  • ImageIngester: Windows and MacOS image workflow automator
  • +
  • gpsPhoto: Geotag your images from a GPS (GPX) track log
  • +
  • renrot: Perl utility to perform various processing tasks on images
  • +
  • GPicSync: Windows/Linux utility to geocode photos from a GPX track log and create KML files
  • +
  • FlickFleck: Tool to transfer images from memory card, rotate, rename, and organize by date
  • + +
  • Geotag: Open source Java-based geotagging application
  • +
  • PhotoGrok: Java-based GUI front-end for ExifTool to display images organized by any EXIF tag
  • +
  • XnView: View and convert graphic files
  • +
  • Mapivi: Open-source and cross-platform picture manager
  • +
  • ResourceSpace: Open source digital asset management system
  • +
  • fix_corrupted_nef: Utility to fix Nikon D4/D600/D800/D800E NEF images corrupted by Nikon Transfer 1
  • +
  • pyExifToolGUI: Python-based graphical frontend for ExifTool
  • +
  • jExifToolGUI: Java-based graphical frontend for ExifTool
  • +
  • MDQC: AVPreserve tool for metadata quality control across large numbers of digital assets
  • +
  • FastPhotoTagger: Add metadata to images (requires Java runtime engine)
  • +
  • Digi-libris: Metadata centric software for the automatic organization of your own catalogue
  • +
  • FreezeFrame: Photo/video library manager (requires Java 8)
  • +
+ +

Online

+ + +

Lightroom Plugins

+ + +

Programming

+
    +
  • C++ ExifTool: Performance-oriented C++ interface for the exiftool application (by Phil Harvey)
  • +
  • Download sample AppleScript to extract tags into AppleScript record (thanks to Rob Lewis)
  • +
  • Download example of a simple Visual C++ wrapper for exiftool (thanks Mark Borg and 黃瑞昌)
  • +
  • Download C# version of simple exiftool wrapper (thanks Willem Semmelink)
  • +
  • Example C# code for running ExifTool with the -stay_open option
  • +
  • Download Visual Basic 6.0 example script v1.01 for reading tags with exiftool (thanks Michael Wandel)
  • +
  • Sample VB.NET subroutine to extract a preview image (thanks Claus Beckmann)
  • +
  • Sample VBA for Mac code to extract start timecode from a WAV file (thanks Adam Newns)
  • +
  • tagInfoSql: SQLite database of ExifTool tag repository, including Perl script (thanks Wernfried)
  • +
  • ExifToolIO: .NET wrapper for ExifTool, optimized for speed (using VB.NET)
  • +
  • ExifToolWrapper: .NET wrapper for ExifTool (using C#)
  • +
  • MiniExiftool: Ruby library wrapper for ExifTool
  • +
  • exiftoolr: Ruby wrapper for ExifTool
  • +
  • pyexiftool: Python wrapper for ExifTool
  • +
  • PyExifInfo: Another Python wrapper for ExifTool
  • +
  • PHPExiftool: PHP wrapper for ExifTool (in development)
  • +
  • ExifTool_PHP_StayOpen: ExifTool PHP fast processing script using -stayOpen and Gearman
  • +
  • Moss: Collection of Java utilities which includes an exiftool interface
  • +
  • im4java: Java interface to ImageMagick, ExifTool, and other image utilities
  • +
  • Java ExifTool: Enhanced Java Integration for ExifTool
  • +
  • J-ExifTool: Open-source, cross platform Java7 library to read/write Exif tags in images
  • +
  • exiftool-vendored: Blazing-fast, cross-platform Node.js access to ExifTool
  • +
  • How to call ExifTool from Delphi, by Bogdan Hrastnik
  • +
  • Qt5 and Qt6 interface for ExifTool, by Philippe Vianney-Liaud
  • +
  • exiftoolr: ExifTool functionality from R
  • +
+ +

Other Links

+ + +

Boldly Go where No Man has Gone Before...

+ +

There is still much unknown information in the maker notes for many camera +models. (To see this information, run exiftool with the -U +option.) In this area, ExifTool is very much a collaborative effort, and +development relies heavily on the input from camera owners to help decode new +meta information. If you manage to figure out what any of it means, send me an +e-mail (philharvey66 at gmail.com) and I'll add your new discoveries to +ExifTool. Many thanks to all who have helped so far...

+ +

Acknowledgements

+ +

Thanks to everyone who has sent in bug reports, comments, or suggestions, and +special thanks to the following people for their valuable input and/or additions +to the code:

+ +
    +
  • Malcolm Wotton for his help with the D30 Custom Functions
  • +
  • David Anson for his help sorting out binary file problems on Windows
  • +
  • Leon Booyens for his suggestions
  • +
  • Dan Heller for his bug reports, detailed suggestions and guidance
  • +
  • Wayne Smith for his help figuring out the Pentax maker notes
  • +
  • Michael Rommel for his bug fixes and additions to the Canon maker notes
  • +
  • Joseph Heled for help figuring out some of the Nikon D70 maker notes
  • +
  • Joachim Loehr for adding the Casio type 2 maker notes
  • +
  • Greg Troxel for his suggestions and for adding ExifTool to pkgsrc
  • +
  • Thomas Walter for figuring out some Nikon tags
  • +
  • Brian Ristuccia for more information about some Nikon tags
  • +
  • Christian Koller for decoding the 20D custom functions
  • +
  • Matt Madrid for his testing and feedback
  • +
  • Tom Christiansen for his help decoding some Nikon tags
  • +
  • Markku Hänninen for help decoding tags for the Olympus E-1
  • +
  • Frank Ledwon for decoding many new Olympus tags
  • +
  • Robert Rottmerhusen for decoding many tricky Nikon lens data tags
  • +
  • Michael Tiemann for decoding a number of new Canon tags
  • +
  • Albert Bogner for his image samples, testing and useful suggestions
  • +
  • Rainer Hönle for decoding a number of new Canon 5D tags
  • +
  • Nilesh Patel for his help with the web page layout
  • +
  • Jens Duttke for his suggestions, bug reports and help decoding new tags
  • +
  • Dave Nicholson for decoding new tags in Pentax and Canon maker notes
  • +
  • Bogdan Hrastnik for his feedback, decoding efforts, user support and ExifTool GUI
  • +
  • Igal Milchtaich for decoding many Sony A100 tags
  • +
  • Laurent Clévy for his work analyzing Canon RAW images
  • +
  • Warren Hatch for decoding many Nikon tags
  • +
  • Jos Roost for decoding many Sony tags for various models
  • +
  • Iliah Borg and LibRaw for decoding many raw development tags
  • +
  • Bryan K. Williams and Hayo Baan for their help with the ExifTool Forum
  • +
+ +

License

+ +

This is free software; you can redistribute it and/or modify it under the +same terms as Perl itself.

+ +

Donate

+ +

ExifTool is free, but due to popular request I am providing a way for +those who feel the need to send me some money. It is really not necessary, +but thank you very much if you decide to make a contribution:

+
+ + + + +
+
+ + + + + + +$ + +
+
+
+

(Your generous donations have provided the funds used to register +exiftool.org and pay for web site hosting, and for the Mac Mini used to generate +distribution files, run the necessary Windows virtual machine, and maintain +source-code and forum backups.)

+ +

Contact Me

+ +

If you have any comments, suggestions or questions, please post to the +ExifTool Forum so +other people may benefit from your experiences. (I check the forum at least as +often as my email.) Otherwise, if you must contact me directly, my e-mail +address is on the first line of the README file in the full distribution. +Thanks.   - Phil Harvey

+ + + + diff --git a/html/install.html b/html/install.html new file mode 100644 index 0000000..581de5a --- /dev/null +++ b/html/install.html @@ -0,0 +1,266 @@ + + + +Installing ExifTool + + + +

Installing ExifTool

+ +
Note: ExifTool does not need +to be installed to run. Just download and extract either the full Perl +distribution on Mac/Linux, or the Windows EXE version on Windows, and run it +directly. [But note that if you move the Perl "exiftool" +application, you must also move its "lib" directory to the same location. This +doesn't apply to the Windows version which unpacks the libraries into a +temporary directory.]

However, the benefits of installation are: +
  • Makes ExifTool available to all users.
  • +
  • Saves typing on the command line (by placing "exiftool" in your PATH).
  • +
  • Installs the ExifTool documentation and API libraries (full Perl version only).
  • +
+ +

See the appropriate section below with instructions for installing or +uninstalling ExifTool on your specific platform:

+ + + +

Also see these instructions for help running +ExifTool.

+ +
+

Windows

+ +

In Windows, there is a choice of two different versions of ExifTool to +install. The Perl distribution requires Perl to be installed on your system. +(A good, free Perl interpreter can be downloaded from +activeperl.com.)

+

If you don't already have Perl, it is easier to install the stand-alone ExifTool +executable, but note that the stand-alone version doesn't include the HTML +documentation or some other files of the full distribution.

+ +

Stand-Alone Executable

+
    +
  1. Download the Windows Executable from the ExifTool home page. +
    (The file you download should be named "exiftool-12.44.zip".)
  2. +
  3. Extract "exiftool(-k).exe" from the +".zip" file, and place it on your Desktop. +
    (Double-click on "exiftool-12.44.zip" to open +the archive, then drag "exiftool(-k).exe" to your Desktop.)
  4. +
+

You can now double-click on "exiftool(-k).exe" to read the +application documentation, or drag-and-drop files and folders to run exiftool on +selected files. To install exiftool for use from the command line, +continue with the following steps:

+
    +
  1. Rename "exiftool(-k).exe" to "exiftool.exe". +
    (or "exiftool(-k)" to "exiftool" if file name +extensions are hidden on your system)
  2. +
  3. Move "exiftool.exe" to the "C:\WINDOWS" directory +(or any other directory in your PATH).
  4. +
+

You can now run exiftool by typing "exiftool" at the command +prompt. (To get to the command prompt, select "Run..." from the Windows "Start" +menu, then type "cmd" and press Return.)

+

Notes:

+
    +
  1. In Windows 7, running exiftool may require administrator privileges. If +necessary, this may be enabled by right clicking on exiftool, then selecting +"Run this program as administrator" from the Compatibility settings.
  2. +
  3. Windows 10 users have sometimes reported that exiftool hangs when run. +This may be due to Windows Defender blocking or slowing down exiftool. To solve +this, either disable Windows Defender or add an exclusion for exiftool (but note +that exiftool may still run more slowly if you just add an exclusion).
  4. +
  5. Occasionally users have reported that exiftool gives errors when running +this version for this first time. It is possible this may happen if the +installation process gets interrupted. In this case, follow the Uninstalling +instructions below then re-install exiftool. Be sure that you have sufficient +disk space in your TEMP directory for exiftool to unpack about 12 MB of +temporary files -- these are the Perl libraries used by the exiftool application +which are unpacked the first time exiftool is run.
  6. +
+

Uninstalling:

+
    +
  1. Drag "exiftool(-k).exe" (or "C:\WINDOWS\exiftool.exe") +into the Recycle bin.
  2. +
  3. Drag the directory "par-XXX" from your temporary directory to +the Recycle bin. Here "XXX" is your user name (in ASCII-hex for +ExifTool 10.21 or later) and the location of the temporary directory depends on +the value of the TEMP environment variable (typically +"C:\Documents and Settings\USER\Local Settings\Temp" +for Windows XP, or "C:\Users\USER\AppData\Local\Temp" for Windows 7 +or later). Alternately, this command may be used to delete these files: +
    for /D %d in (%TEMP%\par-*) do rmdir /s /q %d
    +
  4. +
+

Full Perl Distribution

+

You must have Perl installed to use this version. (A free version of Perl +can be downloaded from +activeperl.com.)

+
    +
  1. Download the Image-ExifTool distribution from the ExifTool home page +
    (The file you download should be named "Image-ExifTool-12.44.tar.gz".)
  2. +
  3. Extract the ExifTool files from the archive. +
    (The archive is a gzipped tar file, and can be opened with +various Windows utilities, including WinZip.)
  4. +
  5. Rename "exiftool" to "exiftool.pl" +in the exiftool distribution.
  6. +
  7. Move "exiftool.pl" and the "lib" +directory from the exiftool distribution to "C:\WINDOWS" +(or any other directory in your PATH).
  8. +
+

Now, if you have made the proper Windows associations for the +".pl" extension (an option in the ActivePerl installation), you +can run exiftool by typing "exiftool.pl" at the +"cmd.exe" prompt. Otherwise you should type +"perl c:\windows\exiftool.pl".

+

Uninstalling:

+
    +
  1. Drag "C:\WINDOWS\exiftool.pl" and +"C:\WINDOWS\lib" into the Recycle bin. You should first confirm +that "C:\WINDOWS\lib" contains only the "File" +and "Image" sub-directories. Do not delete it if it +contains anything else.
  2. +
+ +
+

MacOS

+ +

If you have installed the BSDSDK package from the Xcode Developer Tools +(ie. if you have the "make" utility), you should +follow the install procedure for Unix platforms in the next +section instead of the steps below. The Unix install has the advantage of making +the ExifTool library available for your Perl scripts, as well as installing the +man pages and POD documentation.

+

Otherwise, you have a choice of two packages to install: The MacOS package, or +the full Perl distribution. Both of the procedures below install the ExifTool +files in the same location. Installing from the MacOS package is easier, but the +full distribution includes HTML documentation and some other files not included +in the MacOS package. Both versions run natively on PPC and Intel Macs.

+ +

MacOS Package

+
    +
  1. Download the ExifTool MacOS Package from the ExifTool home page. +
    (The file you download should be named "ExifTool-12.44.dmg".)
  2. +
  3. Install as a normal MacOS package. +
    (Open the disk image, double-click on the install package, and follow the instructions. +See the second item in the Notes section below if you are stopped with an "unidentified developer" message.) +
  4. +
+

You can now run exiftool by typing "exiftool" in a Terminal window.

+

If this doesn't work, then it is likely you have an older version of MacOS for which +/usr/local/bin isn't in the default PATH. To fix this, add the following line to your +~/.profile settings using a text editor:

+
export PATH=$PATH:/usr/local/bin
+ +

Full Perl Distribution

+
    +
  1. Download the Image-ExifTool distribution from the ExifTool home page +to your Desktop. +
    (The file you download should be named "Image-ExifTool-12.44.tar.gz".)
  2. +
  3. Launch the Terminal application from the Utilities folder in your Applications folder.
  4. +
  5. In the Terminal window, type the following: +
        cd ~/Desktop
    +    tar -xzf Image-ExifTool-12.44.tar.gz
    +    cd Image-ExifTool-12.44
    +    sudo cp -r exiftool lib /usr/local/bin
    +
    +(Note: The last step above will require you to enter your +password.)
  6. +
+

You can now run exiftool by typing "exiftool" in a Terminal window.

+ +

Notes:

  • Both MacOS installation techniques outlined above place +exiftool and its lib directory in /usr/local/bin, while the standard Unix +"make install" described below puts "exiftool" in +/usr/local/bin and the individual libraries in /Library/Perl/#.#.#, where "#.#.#" is +your Perl version. If both sets of libraries exist, /usr/local/bin/lib takes +precedence for exiftool, but /Library/Perl/#.#.# is the default for any other +Perl scripts.
  • +
  • In MacOS 10.8 or later, you may see this message when you try to open the install package: +
    "ExifTool-12.44.pkg" can't be opened because it is from an +unidentified developer.
    The solution is to control-click on the pkg +then select "Open" from the pop-up menu instead of just double-clicking. An alternative +is to lower the security settings by changing "Allow applications downloaded from" to +"Anywhere" in the General "Security & Privacy" System Preferences. +(Read here or +here +for a full description.)
+ +

Uninstalling

+
    +
  1. Launch the "Terminal" application from the Applications Utilities folder.
  2. +
  3. Type "open /usr/local/bin" (without the quotes) in the Terminal +window, then press RETURN. (This opens a folder that you normally can't access +from MacOS.)
  4. +
  5. Drag "exiftool" and "lib" into the trash from the +"bin" folder you opened. You should first confirm that +"lib" contains only two sub-folders: "File" and +"Image". If it contains anything else, don't trash it because you +have the wrong "lib" folder.
  6. +
+ +
+

Unix Platforms

+ +
    +
  1. Download the Image-ExifTool distribution from the ExifTool home page +
    (The file you download should be named "Image-ExifTool-12.44.tar.gz".)
  2. +
  3. Unpack the distribution and make it your current directory by typing: +
        cd <your download directory>
    +    gzip -dc Image-ExifTool-12.44.tar.gz | tar -xf -
    +    cd Image-ExifTool-12.44
    +
    +(At this point you may run exiftool by typing +"./exiftool <image file name>".)
  4. +
  5. Test and install ExifTool by typing: +
    +    perl Makefile.PL
    +    make test
    +    sudo make install
    +
    +(Note: The "make test" step is not required, but +useful because it runs a full suite of tests to verify that ExifTool is working +properly on your system. The "sudo make install" command requires +that you have su access, and will prompt for your password. This will make +ExifTool and its documentation accessible to all users on your system. If you +don't have su access, you can run ExifTool in your own account by moving +"exiftool" and its "lib" directory to any convenient +location, preferably somewhere in your PATH.)
  6. +
+

You can now run exiftool by typing "exiftool". Also, you can +consult the ExifTool documentation with commands like:

+
perldoc exiftool
+perldoc Image::ExifTool
+perldoc Image::ExifTool::TagNames
+
+

or

+
man exiftool
+man Image::ExifTool
+man Image::ExifTool::TagNames
+
+ +

Uninstalling

+
    +
  1. Type "sudo make uninstall" from the distribution directory. +
    (Note: Unfortunately, newer systems may give an "Uninstall +is unsafe and deprecated" message even though uninstalling ExifTool is safe +because it has no dependencies. If this happens, the necessary commands to +remove the installed files will be listed, and these commands must be run +manually.)
  2. +
+ +
+

<-- Back to ExifTool home page

+ + diff --git a/html/metafiles.html b/html/metafiles.html new file mode 100644 index 0000000..e4693e6 --- /dev/null +++ b/html/metafiles.html @@ -0,0 +1,323 @@ + + + + Metadata Sidecar Files + + + + + + +

Metadata Sidecar Files

+ +

Metadata for images and other file types may be stored in a separate metadata +file. These are the only files that exiftool can create from scratch. A common +example of this is the XMP "sidecar" file (which is discussed in the next +section in some detail). Other supported metadata file types are EXIF, MIE, +EXV, ICC and VRD. As well, ExifTool supports XML-format output, which can also +be used to generate metadata sidecar files.

+ +
+ +

XMP Sidecar Files

+ +

There are a number of different ways to generate an XMP sidecar file with +exiftool, and the method you choose depends on your circumstances and +preferences. Below are a number of example commands which write an output XMP +file from information in a source file of any type.

+ +

1. Copy same-named tags from all information types to preferred locations in XMP:

+

(SRC.EXT is the source file name and +extension, and DST is the destination file name)

+
exiftool -tagsfromfile SRC.EXT DST.xmp
+ +

2. Rewrite source file to destination XMP file:

+

(same effect as above, but the command will exit with an error if the output XMP file already exists)

+
exiftool SRC.EXT -o DST.xmp
+ +

3. Copy XMP, preserving original locations:

+

(ie. copies XMP tags only to the same namespaces in the destination file)

+
exiftool -tagsfromfile SRC.EXT -all:all DST.xmp
+

Advanced: Notice that -all:all is used above instead of +-xmp:all even though only XMP tags will be copied (since the destination +is an XMP file). This is because -all:all preserves the family 1 group +(ie. XMP namespace) while -xmp:all would copy tags to the preferred XMP +namespace, which may be different for XMP tags that exist in multiple namespaces. +To get the best of both worlds, "-all:all<xmp:all" may be used to +avoid the inefficiencies of assigning tags which aren't copied, while still +preserving the family 1 group.

+ +

4. Rewrite source to XMP file, preserving locations:

+

(same effect as above, but the command will fail if the XMP file already exists)

+
exiftool SRC.EXT -o DST.xmp -all:all
+ +

5. Generate XMP from EXIF and IPTC using standard tag name mappings:

+

(the .args files are available in the full ExifTool distribution)

+
exiftool -tagsfromfile SRC.EXT -@ exif2xmp.args -@ iptc2xmp.args DST.xmp
+ +

6. Copy XMP as a block to an XMP file:

+

(writing as a block is the only way to transfer unknown or non-writable XMP tags)

+
exiftool -tagsfromfile SRC.EXT -xmp DST.xmp
+

Note that this will not deal with extended XMP segments in JPEG +images if they exist.

+ +

7. Extract XMP as a block and write to output XMP file: (same effect as above)

+
exiftool -xmp -b SRC.EXT > DST.xmp
+

As with the previous command, this command will not copy extended XMP +segments in JPEG images, but in this case the -a option may be +added to also extract extended XMP blocks. However, the result would be a +non-standard XMP file that ExifTool could read but other utilities may not.

+ +

8. Extract XMP as a block to an output text file with .xmp extension:

+

(same effect as above, but the destination file name will be the same +as the source file, and this command will fail if the XMP file exists while the +previous command will overwrite an existing file)

+
exiftool -xmp -b -w xmp SRC.EXT
+

The advantage of this command is that it may be applied to multiple +source files or entire directories.

+ +

9. Restore all XMP tags from an XMP sidecar file to XMP in a JPG image:

+
exiftool -tagsfromfile SRC.xmp -all:all DST.jpg
+ +

10. Restore XMP as a block from an XMP sidecar file to a JPG image:

+

(same effect as above except that any non-writable XMP tags would be +copied by this command, and the 2 kB of padding recommended by the XMP +specification is not added when copying as a block)

+
exiftool -tagsfromfile SRC.xmp -xmp DST.jpg
+

or equivalently

+
exiftool "-xmp<=SRC.xmp" DST.jpg
+ +

Batch Processing

+ +

Multiple files may be processed in a single command by specifying multiple +file and/or directory names on the command line. The examples below demonstrate +how to process all files with a specific extension in an entire directory tree.

+ +

11. Create XMP sidecar files for all files with extension EXT in a +directory tree:

+

(when batch-generating sidecar files from many images, the -o +form of the command is easier to use, but can not be used to modify +existing XMP files)

+
exiftool -ext EXT -o %d%f.xmp -r DIR
+

where DIR is the name of the directory containing +the images. The -r option causes sub-directories to be recursively +processed. Multiple -ext options may be used to process different +file types in a single command. With this command, same-named tags from any type +of metadata will be written to the preferred XMP namespace in the output XMP +file. To copy only XMP tags, -xmp:all may be added to the command. +(See example 14 for more about this.)

+ +

12. Copy tags to sidecar files that already exist:

+

(same as above, but copies only to existing XMP files)

+
exiftool -ext xmp -tagsfromfile %d%f.EXT -r DIR
+

This command will add tags from the source files to information that +already exists in the XMP files, but note that this command searches for the XMP +files instead of the image files, so it will not generate new XMP sidecar files +if some images don't have them. For this, the advanced (ie. tricky and +confusing to use) -srcfile option comes in handy:

+ +

13. Copy tags to sidecar files, generating new files if necessary:

+

(same as above, but also creates new XMP files if they don't exist)

+
exiftool -ext EXT -tagsfromfile @ -srcfile %d%f.xmp -r DIR
+

Note that as with the previous two commands, this command will +commute metadata from other groups to the preferred location in XMP.

+ +

14. Copy only XMP tags to the same namespace in sidecar files:

+

(same as above, but copies only XMP and preserves specific tag locations)

+
exiftool -ext EXT -tagsfromfile @ "-all:all<xmp:all" -srcfile %d%f.xmp -r DIR
+

In this command, if "-xmp:all" was used instead of +"-all:all<xmp:all", then all XMP tags would have been copied to +their preferred namespaces in the sidecar file. But by writing to the +destination group of "all", the specific location (ie. XMP +namespace) of each tag is preserved.

+ +

15. Copy XMP from sidecar files back to the same locations in the source files:

+

(the inverse of the previous command)

+
exiftool -ext EXT -tagsfromfile %d%f.xmp -all:all -r DIR
+

Here, +-all:all copies all metadata (in this case only XMP, since the +sidecar XMP file contains no other types) to the same specific locations in the +target files (extension EXT).

+ +

16. Write a tag to XMP sidecar if it exists, or the original file otherwise:

+
exiftool -ext EXT -artist="Phil" -srcfile %d%f.xmp -srcfile @ DIR
+

When multiple -srcfile options are used, the first +existing file is processed. If none of the specified source files exists, then +the first one in the list is created (however, this won't happen with this +example since one of the specified source files is "@", which +represents the original file name).

+ +

17. Create XMP sidecar file in another directory:

+
exiftool -ext EXT -o DSTDIR/%f.xmp -r SRCDIR
+

By specifying a directory name instead of %d, this +command writes XMP files to DSTDIR instead of the original +source directory. The same technique may be used in any of the above commands to +write XMP to a sidecar file in a different directory.

+ +

Via the API

+ +

By specifying different tags in the +SetNewValuesFromFile +call, the above examples numbered 1-6 are programmed like this:

+ +
+$exifTool->SetNewValuesFromFile('SRC.EXT', @tags_to_copy);
+$exifTool->WriteInfo(undef, 'DST.xmp');
+
+ +

and examples 7 and 8 use this general technique:

+ +
+my $info = ImageInfo('SRC.EXT', 'xmp');
+die "No XMP" unless $$info{XMP};
+open FILE, '>DST.xmp';
+print FILE ${$$info{XMP}};
+close FILE;
+
+ +
+ +

ExifTool XML Files

+ +

Closely related to the XMP sidecar file is the XML file written using the +exiftool -X option. This file is RDF/XML format like XMP, but uses +exiftool-specific namespaces to give an exact mapping for all exiftool tag +names. This type of file is better suited to general information +storage/recovery since it facilitates copying of more original metadata than an +XMP file, but it doesn't have the portability of an XMP file or the ability to +store native-format data like a MIE or EXV file, and ExifTool can not be used to +edit XML files as it can with other metadata files. Below are example commands +demonstrating the use of exiftool XML files.

+ +

Create an exiftool XML sidecar file:

+
exiftool -X a.jpg > a.xml
+ +

Restore original meta information from exiftool XML file:

+
exiftool -tagsfromfile a.xml -all:all a.jpg
+ +

The -X option also supports extracting binary data when +-b is added. For example, the above command may be modified to +also store the binary MakerNotes block like this:

+
exiftool -X -b -makernotes -all a.jpg > a.xml
+

Note that we needed to add -makernotes because it isn't +extracted as a block unless requested, and since we specified a tag to extract +we also needed to add -all to continue extracting other tags as +well. Restoring the original metadata from this file is the same as in the +previous example.

+ +

Via the API

+ +

There is no way to automatically produce a sidecar exiftool XML file via the +API since this function is accomplished with an output formatting option of the +exiftool application. However, the the API may be used to read and copy tags +from an exiftool XML file just like any other file format. When reading +ExifTool XML files, all tags except those in the ExifTool, +File and Composite groups are extracted with their +original family 1 groups to facilitate copying of these tags back into their +original locations in an image.

+ +
+ +

EXIF Files

+ +

EXIF files store EXIF information in the same TIFF-based format as the EXIF +APP1 segment of a JPEG image, but without the "Exif\0\0" header. The three +commands below illustrate techniques for copying the entire EXIF block from a +source image (SRCFILE) to an output EXIF file +(out.exif):

+ +
exiftool -exif -b SRCFILE > out.exif
+
+exiftool -tagsfromfile SRCFILE -exif out.exif
+
+exiftool -o out.exif -exif SRCFILE
+ +

The Extra EXIF tag used in each of the +above commands (the "-exif" argument) represents the EXIF metadata +in the form of a binary data block. JPEG, PNG, JP2, MIE and MIFF files all +support storage of EXIF data blocks in this format, although exiftool does not +currently write MIFF images.

+ +

Tags may also be copied individually to and from an EXIF file, but remember +that this will not copy "unsafe" tags unless they are specified explicitly. The +following command creates an EXIF file from the metadata in a source file:

+ +
exiftool -o out.exif -all -unsafe SRCFILE
+
+ +

This technique works for any type of source file, provided the file contains +at least one tag with the same name as an EXIF tag. Below is an example of how +to apply this to all files in a directory:

+ +
exiftool -o %d%f.exif -all -unsafe DIR
+
+ +
+ +

MIE Files

+ +

The MIE file format allows storage of +native binary meta information, and is the best option for saving metadata from +a file in its original format. Here are two examples that copy all individual +tags plus the ICC Profile to a MIE sidecar file:

+ +
exiftool -tagsfromfile a.jpg -all:all -icc_profile a.mie
+
exiftool -o a.mie -all:all -icc_profile a.jpg
+ +

And the following command performs the inverse operation, restoring metadata +in a JPG image from a MIE file:

+ +
exiftool -tagsfromfile a.mie -all:all -icc_profile a.jpg
+ +

Information can also be copied in block form to a MIE file. This allows +preservation of the original data structure as well as unknown and non-writable +tags. The command below copies the full EXIF segment as a block from a JPEG +image,

+ +
exiftool -tagsfromfile a.jpg -exif a.mie
+ +

which is functionally different from copying all writable EXIF tags +individually with a command more like this

+ +
exiftool -tagsfromfile a.jpg -exif:all a.mie
+ +

Block-writable tags are listed in the +Extra Tags documentation.

+ +

MIE files also have the ability to store information in compressed format with +the -z option (provided Compress::Zlib is installed on your system), +which may be useful if disk space is at a premium.

+ +
+ +

EXV Files

+ +

EXV files are used by Exiv2, and are +basically a JPEG file without the image data, so they may be used as a metadata +file to contain any information supported by the JPEG format (EXIF, XMP, IPTC, +etc.). ExifTool has full read, write and create support for this format.

+ +
+Created Nov 12, 2008
+Last revised July 31, 2019 +

<-- Back to ExifTool home page

+ + diff --git a/html/mistakes.html b/html/mistakes.html new file mode 100644 index 0000000..5fff45f --- /dev/null +++ b/html/mistakes.html @@ -0,0 +1,155 @@ + + + + Common ExifTool Mistakes + + + + + +

Common Mistakes when using ExifTool

+ + +

1. Missing Duplicate Tags

+
By default, ExifTool will suppress duplicate tags in the output. +Often this is desirable but sometimes one can be fooled into thinking +that information doesn't exist when it is just hidden by another tag +with the same name. For instance, the following command won't necessarily +return all of the EXIF tags: +
exiftool -exif:all image.jpg
+
+To avoid this problem, use the -a option. +
+ + +

2. Over-use of Wildcards in File Names (eg. "*.*")

+
It is often preferable to specify a directory name (eg. ".") instead +of using wildcards (eg. "*.*") for a number of reasons: +
    +
  1. "*.*" will process any file with a "." in the name. This includes files +that ExifTool should not normally process (like the "_original" backup files for +example). By specifying a directory name instead, ExifTool will process only +supported file types. Or the -ext option may be used to process +specific file types.
  2. +
  3. "*.*" will process any sub-directories which contain "." +in the name. This may be unexpected.
  4. +
  5. The -r option (to recursively process sub-directories) is only +effective when a directory name is specified, so it doesn't work when +"*.*" is specified (unless the first-level directories have a "." +in the name, as mentioned in point b above).
  6. +
  7. Arguments like "*.jpg" are a problem on systems with +case-sensitive file names (like OS X and Linux) because JPG images with +uppercase extensions will be missed. It is better to avoid this problem and use +"-ext jpg ." to process all JPG images in the current directory +because this technique is case-insensitive.
  8. +
  9. This can be a security problem on systems where the shell automatically +expands wildcards (eg. Mac and Linux) because a malicious arrangement of file +names could potentially have unwanted effects since they may be interpreted as +ExifTool options (see Security Issues).
  10. +
  11. There are problems using wildcards to match files with Unicode characters in +their names on Windows systems.
  12. +
+
+ + +

3. Over-scripting

+ +
Often users write shell scripts to do some specific batch processing +when the exiftool application already has the ability to do this either without +scripting or with a greatly simplified script. This includes the ability to +recursively scan sub-directories for a specific file extension (case insensitive), +rename files from metadata values, and move files to different directories. +
+ +
For example, this Unix script (from +here): + +
find -name '*.jpg' | while read PIC; do
+DATE=$(exiftool -p '$DateTimeOriginal' $PIC |
+sed 's/[: ]//g')
+touch -t $(echo $DATE | sed 's/\(..$\)/\.\1/') $PIC
+mv -i $PIC $(dirname $PIC)/$DATE.jpg
+done
+
+ +may be replaced with this single command: +
exiftool -d %Y%m%d "-filename<datetimeoriginal" "-filemodifydate<datetimeoriginal#" -ext jpg -r .
+ +Running as a single command is much faster because the startup time of loading +ExifTool is significant.
+ + +

4. Writing/Copying Multiple Tags

+
Any number of tags may be specified on a single command line, but +often people execute a separate command to write or copy each tag, which is very +inefficient. Combining all of the tag assignments into a single command avoids +the significant overhead of launching exiftool for the subsequent commands. For +example: +
exiftool -artist=phil -modifydate=now -tagsfromfile %d%f.xmp -xmp:title -xmp:description -ext jpg c:\images
+
+The -@ option may be used to read command-line arguments from a +file, and may be useful in situations where there are a large number of +arguments.
+ + +

5. Errors and Inefficiencies when Redirecting Tags

+ +
The syntax to redirect tags when copying is "-DSTTAG<SRCTAG", +but the syntax also allows a string containing tag names (prefixed by $) +to be used in place of SRCTAG. Three common mistakes when using this +syntax are: +
    +
  1. Adding a leading "-" before the SRCTAG. (eg. +"-EXIF:Artist<-XMP:Creator") This is wrong, and the tag will +not be copied. (It should be "-EXIF:Artist<XMP:Creator".)
  2. +
  3. Adding a leading "$" when copying a simple tag. (eg. +"-comment<$filename"). This is usually not necessary (see +exception below) and it is less efficient for ExifTool to process the source +string than it is to copy the tag directly. Also, values of list-type and +shortcut tags are concatenated in the string rather than being copied +individually, and wildcards are not allowed. Another difference is that a minor +warning is generated if a tag doesn't exist when interpolating its value in a +string (with "$"), but isn't when copying the tag directly.
  4. +
  5. Using "=" instead of "<" to copy a tag, or +using "<" instead of "=" to assign a value. +
    "<" is used for copying, in which case the +source (right-hand-side) operand is interpreted as either +
      +
    1. a tag name (if the operand does not contain a "$" symbol), or
    2. +
    3. a string containing tag names prefixed by "$" symbols (if the operand contains a "$" symbol).
    4. +
    +"=" is used to assign a simple tag value, and the source operand is +a string that is written directly to the destination tag.
    +(And the combination "<=" is used to assign a tag value from the contents of a file.)
    +
  6. +
+An exception to rule "b" above occurs when trying to copy the value of one tag +to a group of different tags, for example: +
exiftool "-time:all<datetimeoriginal" FILE  (WRONG!)
+The above command doesn't work because the destination tag name of "All" writes +to the tag with the same name as the source (ie. only "DateTimeOriginal"). However, +when interpolated in a string the identity of the source tag is lost, so the +following command will write to all tags in the Time group: +
exiftool "-time:all<$datetimeoriginal" FILE
+(Note that single quotes would be necessary in the above command under Mac/Linux.) +
+ +
+Last revised Mar. 11, 2021 +

<-- Back to ExifTool home page

+ + diff --git a/html/overview.png b/html/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..2d7113e7e955fb1ca396cabd88bf95bf6e0d43e8 GIT binary patch literal 27207 zcmd>kWmgqcLtXL0}SrL-8}>+1PD$b=l}r*m*DR13{KEsg9dkAo_F2* z`Tl@=R`=?)y8G!sIG{GL5=|j2ZyDsB&P)jhX8?tgC9pjd^^K=RMz!& zKzCCz@PvcIB=~QKhs(?+g@Z$c1AYX_zrMcSz1hLR-SqU`@bF!8^Bov`mza1L5_0F~ zcV}*Xr>}pfq;$v4eaFmvM@o7J2X}7gcJQCa!NJnfL38&(P4fYy<^T*n$N(QiCmw`E zAGrA);Nor`+-)vxZVpdxb`Ng?ftzq}OPhB~(@RU;-Am?nOZxgt+}ul~q|*lnZ%>}C zshL(%nx>%{UfLXfGiK&tQqo~KxbCI9?&&v=yKXnP=FQFKrOoE)yXNWX<~OFp)6M$& z&BDSp-NQA_%{59&km+g2@HC|R4$}O#bweO`kT)|ohe%69xVa(B%n)2$2pSrAcsQfE zJENvK19F!EsmXvqGTuyIKSNkJgPHlQ>4~_w(O^h)1~@t+BihX^+T1)E4K3s?B+-c> z(a~>#2??q3%gFEx3GsU~Aka@*+K(CR$IR?UO6nG!=oWJ4=62_1=jNsabQ2bKLqoF* z39+-gv$L}^_wzG%yEA`-v`aL%3o*BIGY10A;o$V`-1POq`ugVjq@+MQJD~X;P(K3* zyaNLDmEOXyAFZTsuB5N8q@*ORbSJG;Bdr9HRsu>(Z%Q*S2}>&p3*WtkL0DK?_|0f& zxJgNwg@u`!n`xNuXqdU*f=WYUM?=F*1Ghv09iZNlE=kNojC#-{c}i z!@Wa8!-Ye8Q}|7*|6lAuo^<`Kt?*u2>e_J9drLNOa5kIDasZHD_HoWs`Oe^vA+`OX zv9tFT%blhTdXohbv8zhVSj4xzu|BN@j8U6M6T7&6#sL#M?l%yzx z+X9yD*P3D#DJKKg+UnjcL zm5Nuy-WFR1Ok~4}DFs`Lb-j9n*ROqWyfG$jSNMWWrRM!GC$!+u3aLd3rDXP_2dl`c zu{s8<030?6)Z$~WeEu8lz?y%FP!t^gqm7im-wyrY=#T)oepQxJ!GoHW_S>(|;!RYG zm|=d^`xyiVpEA-!@ODCqIHASLJ}EzBgX|xxBpQ6E9=-LQKARi7=KjiZLBl(z8f#98 zdM^1>DSm=eB-ZEgIb_pl5z3`kLpin->6&YW6WhWv6Xja~=Ioxd>_g0+ZkbL|LoJ_Z z!g5~Ps8Sbw&bL{TTxhl&C1KXfnqi(+(V0j-reqZzzg1$y8U3_aYs;T68B*~o-Lyfs zX}D4oFMat=U<~=7veFFdZ9%Hc$gf&AHjrTkP^LJ1NJ~=rtiP*3nUtOBM0ve|5q?G~R&Qd}&HW59R33Sz6UBAz2D*5ue(=?*yrgzVgC z4T9B&ilKh)pOcE)xe@-3?x*`<$7M4})1j}pJr25Rs38^cA3QRy9Q2{x|E(u9YNr3j zx;Us99qGW*e!ky;Ry#t)C3mq;&rVz>JQ-9SJN!V9)>^_{lyxOQ;{V`p!b$e`-4rP! z&#ge|%J16v0Rz9U8pfN*W8DZnDC0LKJj7+@Es2u)gwRuItMnWHCfa^m%aon4(yf?Y zi5oR6LRMXF!5XPD&I&P&0c`ZlZ>(|$-WG&6YrkKzPh}Ow8kDs8Q6Khy&C4)YZ-rP{ zhr755IiM|Nve2(J#5f$ClvDgcoz2Vrw1l{NK8NbhS-Y|v6j7MywZ8W%^QD;&2-3+CoC=uSY< z&f01t1!9w_jAZiYSMuF$i0#)m@N9s1z7M~*aQ@3#S5Wr_j0fP67}V{~MEuVAZ?>Sd zPV_G{+L+3U;YYbBVtlRq_+dV46?}lo+I4wSu!@;4DpZY%y5{J0Rqtc9nPoH&RbC~J z$sBdwLWPVWZ3jjl#f3R0dD1Ue`9ozoXka7>n3OTBSby7!8?Ae0BF>Z*D0a++S)3^o zRyx&b9sr*;lSRKj{{1jBKYXu*yn**nTY{)A!c++#F!)I{kORXf6)m7#f6Gq+AJE-; zN%X>~jP$2d5hADO3KNaEx&nC?TtP|l>e|E962F-8M6l;}#A{)-q>Vq8V`2FDc(SI>w2WI=GP>(xeY_1+{nu<1P;YJ7rE~2U z-3TrWH9^YC7yXDg^hNVXZHe~&n3$|Iy58J`vqSkgPO7rlYJkxB^4)0HY#H-z;ZOpp zNl&I5fuBf~eNsMR0=b^VJ;`P3iy92m`^b=#b!8SWdiMyvV(dxsK6!$u0@b$HtV*4u z(Z={0VWLp^`f-foxL&a5DIQkqBIojgC$}*c z`XX*3$5P#_`*xrO62VQzFS_qP^5pw)%V)*ZMWN}y2ODx;DJxeT72Ylu;3!p62Ost6 zUESAbX=`>qMf3<%^dYTGsdMlOivLd7ESJ1@|8`%%msw^JZVK8F@rtenm@ zAL10%1n+Koe~>h~$NgG3#DxCreIO3!nCY?Gjc5zk8Kmgd`c%uXl}Gc#yFjPZY+o^p zvx5%5EOa;uf6)aoxCD3^sZA{@`J!L;wBELf8#6d5U_(RL&!_;ueDqRhB@4IVl`_b_*_TBYjiN!zyTw?i56n_J zxisrUtN1XIqEz-nZC23cDL!ja^Xpt;)QbeFsd+#b2DuluP|br01JqTlC|rA+E_YeT zL_=%OH3k2uB8lkvqNe1_&y5@TS%rgKG@Wh=eMoT3liJ_vWdD~%{boAn3wGyL=ziY3 zR96sBzPkf}3VX*KJ%p+G>~-JcUc5B|dVJ43q7ySrVgivnl0+VEQs{J+Jzi4Zip%@t z=}5czLj(uQ=GNKB$Ab_YnU6HwdXvauINTV9_wyj~vn8NdeQsSjFXUl!Gcu0LwOptPLi%L86&-ZX(p(1Cz!k&H&4sUyQ)t!PcmX`0n zr-?(##7JYh{X$Ng7My?#b0u+j2Im3Y{d+3;8ns7>l|@tzTzf}Kt-ao1&%D0Y8oy-v zXXbILWqg>^L?R@PRMGWc;(#is7J)jK`;VNzRYY7^mtdPIaKPUdu-?Pwd=08kuMq_y z8oX1Om_T!v6mo6k7WsUPC9eP6I2}s1PXa+>5B9c=zGJDK8aPG@6U*oD#lJ=q!4q|G zn@0>h4L0iEN}ig{2YR^VBv>5?|{7*Do?A$}neup$j83VH!p~DnxF|{GG!0`cx3;Kt?=Q5cSO}1%pvB#^T{x$ng@npHdHHgzKfG^l4aKi-e1!xRW}C=X5<~zO49yJSnxv)3LDP+&&vSp*>Fo|q<_YJY!3vJ+snmFe~TX^r*6As8PgX`p~X0+c=0A=UOnK@3RN z@O#Nx{VOJDG}t-#NH`#=BfurGB!7z@Dc8I0%l$rG{l>N<*K899YnQwMw}J5C(C&pv zZNtOtfsU)%q?H;zr>SlYo)Jk_oJVjTCC$~4yL=k8j?v-Je3Yy_xzV>_AFF!vr!p_X z9+}$Ev~$D*-{1tF-h2JzWDQ@!iSr{gf&1g2h?SF-cX6;wtH1mj^I2+WHHLJ#Gprif zs0XSjAf}Wf-;Y#kA8}AcW`Ggmi`Got6nRO!FcI>^Z2daV5IQr*Ft20_m^(J~+W#8< z-EW7QJXWGA!-oZz{F@YCMpVrLrq=@>lM9G9;zj68XZhdAB!bxlpEHxLhAyD{-G*?< z!>Y%YU-`g1=`kJ3|SSCO>9#sBjx_lxPOk=t#hNm0UYvLV=7S5Sa#FjE2>8 z-EYu;Dv&?<^0OKM2Oy@*N!T0oYA^xxM7Jyd7jTig9qZx#kPy>5(dz(z9qrd-wm#@M ze;g~;&R6bon13L1P zVf1Dd5L=Kcu-CG7i!1&WAK#g%U|oQn^W^!VHh~p2$Mo;WXwKAY%GKqFdJaT?A4P7d z{~|d~y1F-S!|E*mIUD%wXUUa6i79hER~ZIuu*4uzd~Nu3-sf?DI`ZQ=C591fr1{75 zTBEjwUZkW&vDagb?J$%Rl`P>^>ZL8^loHA9Qvi*MUDECkH7nTOX#~YSav+Z7UPPvo z-0e=#%2Y_(Y_F~dw-^_6Ym|){?Yfk(+9Ak#sY;Bi%2(Oml?Lh}b$)a9(#5HqUj^?< z@i!E$5p!xWoA}V#xF5&P8oKs=(ZA--|25A;8=|#fATUi{F7~m}JXw%2(H9Aj{EQP$ zGn_RR22AOTIAm&XSy^6}gZw$2itQkPbrHpAV(^b5;&JZnRr8bo&>U;9IdjICpTcO6 zQfG)ZM$QuEi8;keV%KgYh6OmqCi;pW$S`&yP)eO7j8y%ry0MWtad_M-?POESZ)EuV zq!X_Bie4dL8!QVk9NW1vLr>kh z)NjxmNQu}H=X9j6^z z$--=SgqBM#@7xc5?)@u%bbmGB(OWbVdgCR-aifdkF7wG-}G)N8Yo3XnhU z0}icco|pHAqjz?%(`GKbp6hd`^@;?}aF`TRNn(OVJ#6_&6u_C_? z+<)e@|lU@nU>)HZ|E-u~3BjN7qQ@E7CD_o?JNg^mqcL`~L zS1T#E5`9%Yei#u#Z=3+KW=;8;BCVc=YhlG2kU7nhLE{(in#Ry|R2c+D7}N-u1jHmB z5W-7Ir#QMYtuOD@2VdV7Jzrmsa}r#4hP{U(+g9%u9E~_zmP~&SFveDCfz?BGVug!( zJ9;Djs6p$QC-fcg-d?MLDy)E7U%RsCCV4ni^FWLrA00!|tw+}z+rIXkLrb7dZlK|v$3f6b}yZy zSA?Z&R!DU!D4+Kl=KLXXFbqHNs1bJYW3-BjP z&{nXiV?+2TDZf_UdWd-{g3&+DM5je;SOGVT{E4~3+_l86gmABxnBE5C*=H3;^g1|m z0Fd*6RNZbfI4B?(^EI%&d7<$B%vQao?qkeZFhQ86AOZ9~65_DUAHsf-6905FbL8XQ zo`9E7vrjTt93S>{8?IP7856D>1(m=5Op%X;>}^V0 zrcCt(8p<7g(q?;<>Cy_gK;PRo4+*?mCJVUNf42|8l?o4$Y8s-?6 zVrFAUxZ$ealpgRT1k(O&Ig`>2=PPS?NzBQ--?%d;gvZ35WQ#TIJUP^^)UUG6$rkimwOW*S{)#)G}9`z{{% zt>ERy)INbjG%gE1Tiqd8%Op78(0HR#oJxTrjh!m4w|5ktj%VT<(Xt;WJEl)+^ zT<0#8k=zgnjTuu&82j=#3JBuZdRWC&xmYWU;}1MECk%C>)tMu`uBU`poLqlL5WrKA z$l>gKXkx88B-F^~#Ea|I#lih%)sqZXNp017DbsPWPn{1Z$1Hq5-y-VC#&A?JwtG3h za;VDZ0xv}fy#L2kfXr`-D)+5?Yo!jQYHIQU_Q`-u+{8i+f9F1Jc-((p z#DUdf3z&v-$&*2{4G8@e#Bn6+OjBH-#j3x-;Wu7;Z1GQ4_ z5;-gIsqvMK--F0dwJpdw5V6#VoQplz*f1L^Y_lztl$cb*R(St>36@h`Mvu>6cbx4) z{HmGNgdKd+o2BYF(DcxEu`PS70#BFkq>lq>51JGatumt>s}?@J;9Ygv4;j_^T8E5^tx+uMk}Dq>)$tF!e1j;SYgSv-h9I*m5WBgF1lIx@ro z!Sv~SkLQE_Upxq1eZO`GaB;(f0;`SoBSkNShfJ`zGAd+~N{wbUtWwu;)((z%ao4l$ zyZxfntQ$Jyz^Jaxzpr#uHGS4V9+WFLimBJe_YDtRr2zG)Je%t*cQf88)}JWI)^A&@-xi; zGB31f{D<>`S1sT0`0OVk*DI_t83ij0-wduOo#0K zGiA76ybQ*2x{p^--3yZ*1_e5dl+bzaPqO?X^I119Soge^KGx6kumZruqZmo9f5o+9 zW|bi_aP*VXw28kC>@(eLF3(YhGIcJbPs#OZMY&%(DGsSImVIsAkA|3kigA<8--Q@KH@%re@nU|!HN+%P8TQ|Q zHX9=s#}Ex}Z(Pc_GHBYEd}sW7Tz`FFdO9r;sF4S!V`#D{bt8RU<%JJ2bp0(S?m%X& zrgAaT@%-FD2;o8#p)wi-`|u;05THK|CKeJRPqh*X?3xqs zAO|cwVqbWXs)g$$j{IzJ3o>2a2Qtweb&GB>$S!s-;}aK3HH0Nl>3@zB4oa}mycYY9 zlilibV@^)Z2roUt+OOPC*qRy}J+koq6X<7j!VP+qwkz!s)Le@Pzl>f+!9H%&^*iA( z6H9e6$5hSr+0Z%C#T@x&8__Q)x6hA{kM=;K;{fb>zISEuHPRXlrydqDVU=!F=APoM zDVeWM6wQSyYopsscIW=*7lh;maaGB-->7AG)@FkEEWHqIMMaYMsIC`?0|M4UIXNwO zKt$AHHFv+u%M%Vi5ae`;Imm&(NI=qMEcW{ArXfG;&qckaLTP<$4*We#o_j?Hh2RgO zI0`M(he|gpP|B*}HC2P2@cqCKiy4aPMpKQY?;*gTe3Nd*Jyo+n#GTf>a5l{K5z}$1 z{=*j>E%1f;!d8XlI~Wg;5ZM%8@`(@`ztwK(;C`otgzxMFEAPV*J^}nd?Tm#mocO>7 zyeZNTxi$Jnn{&&a9Ob`q>?WF&OIz7vyX*>GT0KKI9111xfHcZ~Rt7+8(uXy8NM{iNFXVQ7_)GYA4Fg0#35_y1*0Ee$BC$RD@FZAU|P^^R?5Gp9zqST6Fv*hRQ z*(%$M53H?HT}q!nkqk3gM$W-;J+NRj-yaHdN`)Z4|8szSBb7g+nNN9JJUU*8fGYJn zc|FM-2axZX&q$_$;b-FnQ5pW-$5a3~(O0lN>@Sh>WS1;7c&F1d^nqAP1*Ne6`tI*y@m;ZPQVa3wMaBK+N*n$Ad{A)@g|8`8?Y!O(WDya@O(egVnQ`@h6rOXor{)h>zG{DsKc3uP2bHF= zP>{A3Ube%3w z%n_3~%+9t;QD2@eaW-CGe5D30q17(x5na5pLbzSRp5PA!FQBXHTBJe5@a>O)MgF)L zcP7wsPiGK|@!83SN&UiEW!FxNxs-h9QMO-v$ysWyA6JU@OAGka<~`QaQF3a=8V0*N z58s-yAKe;HLr`H@z;3>wd1Y62!gnus`HOpu+55^8GaTQNyZiZ)jR^}I|9Q$(nJV|M zV#SeW%mXQ;qosLe52V{Ga`a)3mjDy>7BF2njxK@3b?hz6g_6H6?|E^^8`eK5J-y3= zr{#o=z}v3Z+(zHguhg9;Q9m=3rlXax&<$;`pk>lUXB**e19Ona*Jcc0uva>#liRJU zo&}FDd$iGfFo$Jrbi#x`2W#4-tw!I^5PAnv9XQwSIAnIjFjX=A5G7S!TJCp!VeMNU z!&H9CkJI~b&~NHHgol#Fdt0}Hq)>bghafQVzqj(!Y^yO#wrFMg&Kr%D+-1{1l(D18 z1($Y5Ex>I79h-bB`v@V8WXeijXDHwVTS}A7cc&9o%;-21u|(D9nUQ^A>6)be&eh** z(2JWZl+_$XjF%K7IbVW`$Ge6OpSCX{MFa0}Kwg0l(p-2Kh|)7I`2Em|m!)Mu7cdj1 zxoyY>0ogiC-h$#3O%6WlOc$6$h?jaA<_Ytyw|*tTESO~1{LO$*D~lZfegM!Tfr1xj z^{0npq<5_+5V~g{WWMDH{Lnhhgf@h<+QecOm*|@F6dHUnR6zkr5k~}~`^o+-fcryW zS6+tQ0mge**5zm~Zr6`WRA%YyQlUf!9H>P;(exF-vNJp_p!y(01_jFxv~V$%>~c)z zopUjK69lBV@)U}Ql#&6%{V3ii7W1Q&c}q@*GXULZV;pT=U430|QCn;~K_l-9w!tX&xSmwb$&a7@qNtHHlI|K4k_0__#pM0K zXT<_+L4&$2&NAEmQUJ~XNk1;Au&k>&PcrsjLIPc<;03gK={uiN^N6)DpmO9$1Mf(7 zJOAdYSj6&Ml5G|CZxug9@|4R1tjF8qg%KTaUFpervF9dG=QkSo-}7scK(?2n<~|*+ zdt;opEV`Dr{O;%q4qm^*3TK5?{e4mx_)@$r(?KsH$Yjtxr7@yu5A=?w7TZS|kxTNL zNLDt$j+KiFXyIDg!J0&V{$ah;YPj+#(G$?Qw%PHSSj31hLU`>jmpGr7dZQQ7ct1o- zNd$P`{y|{yT>|1lm_9DHzt)~@I|;4qCi*8@_i40!@}8=qe_*`#x!VTn&C$`E(7)}d z4fOWWv%E&_3q_ji#;>b5Sz-yKjrR-2is4Y7nVES$npR~ucJdlUnG?{#K-2=lTfzPp z6C1}VIVp!{k~;^#=uQ|vG-B}O6!XR}+;dBgvdKCPCmh{_GmMMro*lo48SQO0@ClK- zIc51Hv3pgS8OtvQNL((T0bwXB8Ey{Z{y>-)C*^xudw)FMI|y=z4*}};b5^9f|4qz@ zubjEN#vcuQKgpWIri$c_CAnBzk&T_7omq&pv?Vfwe*2%{efh`yU5yxoP!xAcaU&`= zJ!Yf@L(&nWHr^a|qBKSuq;%+QCWt%^8#e%AdzdLTk>p}NJgGLd576v~eQt@##Ymo# zVZp!;Qz<}q2bOI`q{)ni1!VlDMlK>zA6)ff1{l%m=U7dnb=7cuFP*1ScZLgfG#GB- z=OF12RP0?beyTsfVhwEaKl^fJi3en)22FavQ0Fzm&!y*ugEwL^rPa+T_d1cl+n$JxkOwAC=d$M{^gCkqG+<^&HCiMds#E6!E$HX9(6Ctquo@u}}TO?s^ z22edE-~{Xv!;Hn+d*#AD`C6It{Hz6@)SbR2@R1XMyCztRP+`KrK36=IOMFa*OVbAJ zTA|0nLweF}0oRx22jGV^nHc?#G3&n;;9<4QBZ%@;31(}?z~ztpqv>ai+}5|}al53}*aZ?|I_%by)IS4t?37^0Lpwj_5prm5BmLTY zT84jQU>tIYCcq{@$y|DC@#+65AVcYLK|)8J#c;cGjnbv1gcqw!1^&s9$cae)B!G6#_?(vHc7cpRmM)wWF9h2<8fU% zW)OS?m2?lKv<&%Mj+7Jg5Nf)XF`Q!2pkT`8wd*_<`U53!%bNw?ifUVCe_ zhCju!P|faXjfJm>%&{M+KQ10WLCf>;hP-^a!dd!`U4FM24FEX40Q4v&7?T+(Ui^5?JIs~FC*AujrDz!QFO?mCQ0pCiT}#H*Qu$BhxBmRp z`;HYXc*?Q!QAdEHnotWHG&n9Q7KxdfP0?-Q%05TF`w&>@B;X6l;9YHNSnrScl67;= z#Y{`Vsf7k|cajObyFbsgyFhsCU<@idJ*~^aflV}I==iXeakc}Qvv%e2iFPhmw!ZSB zt{WbvdvdP!t%_;%ZTs|3iCQWqTLyTiz+EA z4p9`3ahvidhM?4^OV^}=>2kdYvs~!NZDZD| z*=UE2tH6#X3)}RQ(U0e+rY@7y$6(FnPu^+fsY+R9OqKJ*VYo>R@k%H14U8CGoR@$c z?ZLC_uH`P(Kdn=9;Wm@q*DF_hf3&EBe>6>9emEMjsTy3wc5oCH_=;s=g@NS*&1~QLJp~2+!+1TbI$0;2@6!TrS6;q;(kZDE)wF?B>7CGOHSm;W zz@^C}rlUAWIX6n2+&*HFSfDS{O0Ee!uH(HH`ub!VMemBFAALz_RPml*MTIHqL0PRR zxP1FQoaCG8RAnJ~3m+EM8@^!xp`WtkaVoE>q7w_kIJfA!$T|S6#`*Bco`u2>v25tqoSz-n8&@(%%E~wui9^FC?WR18Ten<`;c!@oL09I#664pfMmxm- zs0!mBuDUK7q+Uz99(R_e3fFjaak(4(d%^Fo1HQ8U)RQ%lx<>+vqVaQxyGKeJ-8z{@Z&^TJ#U5ppk9T&d@Xdfjlc=Tj!l}^Yz|MebNiw5~+q829Fk1BB0Ec_7xq+?r*I9Q4SEB;tiMFw4L%JSt)`*rz2 zvnjKs7PMFm2U7TYLyJ?7xGL^80e?Uiy;iz%#6w;`4QH-k*iJ4@)m=y*J)A|^@({Wu zuGu5TDh}(>^W(jqCa(XD=oGO19vd7Y$r6%hceBOpD_H;$v|{zH1b4bu-+$P3K92~9 zTwk$Lrw5kOF;ac<>=OuSm1fI&46Y*!3Pvhp_R&J#5G@h!Kw9$vZ!-q1JR$_e9!_9p zsMtwD>?_|x=SMnopD(m707M*$i|j+YepoVn9;PwIicQmE>y0YS-Sfg+$oZrYU!R-C z1H}W0R}_?wj39ETSvBmVZso+mqXduu{+!eHxgWdqNR&7)FV@<8p^ zv!91I0l=;?r#Elgzpi$@&}4jju45y4v-lG|v zz2uywcsC}vnD`Ih+=(~%WpX6tI%BWuMu^|SK|L*edU0Qn*L=v7`vs6?n9qeunk94&?#3)rlHr=$0oh7hx3_{6j$Bn zZ8?$0CpEQ^kn=^+@p1t<2|a2a9$2Qs9!y(q8T{ICXO`4&(R3nVcW-}T5dLNcqyI`alnf&dbe z?o3kF18`*7M}|7^(=2LmXdss*&Qn4FMjrN)p(@(3r#}yUI3X>8MIr$$sauO{5v6hO zrKJ4b>-tb7a6w8cfMLXQB*+(HkP-#pfPXZMoDPqH5RKJPlc7k31*k@xJCbi^PWG>P zSQH7oMIv8WB+ba*aFF}cWk2L$BISfT=zR0fr|yl-H{34>#3y2uyASqwvRx?GTkufo zPe6@%^jv$)u;dEIPC{5gtko%Mc+b#jE4-$-?$}oX2`7qH& zL%*fC4EL5d(n&m>sSEE9Ze$m~1jA6JKLD5^aB9*UqR^H~IdvXTv)Qnd@5! z+p5BEXGCda#~;EX@^M=9wtsL|HN2~T?S+;(^bcK|?E@ynHk+g%XD@s%$VwTR%kf~m zJ|#;ZOfu|))IsU23w0WPZ?2?zbA*=8faoQ{n_eMNDT8dulaZT8%CLq?C?=myuJyFh=_!Mm4 zW3eqS1K~Oh_NO!&iO!^CET{}2t&MtEV8hvkl!D$Gzqs4yuZ|TCQieit1G=ZhO?Na_ z3Nu3`;d~4suP_nLM$t@&+cqvw9;>PMEkp~`*^-IxBUxeCe`@+qK!}OGP#DYSGEbf^ z0gUO-8l8Ul;jpSkrb9wHVF{#Oe%53>gU0!BtdFtjHG zGy@NhAiulXa>P&WY6VnFM_Ag|v!U}mtT~~h4?loLw|BqVo_vsD@5e}B;42=6kJf>p zI(HufRtVpKZ15PjPnB0=f`cS~2RSGRg;j&C^YZYb47Lt7?FoC18M7+ zF5JHIAOjE1Dxu@q$17ZO-n$~h2!ZvJYT8XpU$>?T61o~b*_eqpn!Hs zxFki)T{nT6jFR2NJKT@t3O?vy-J(oe?fWB$`o%8}0MYMMmjoE`%yrfaFC>57GivL! z%V@kPGmBfG#26U3o%gT4I!~=cf}lH99Th(9>o6kEwN=5^6BG_Uc+fe)ny$nWu|fOH zi8a`kHPvECo|$}Ur}GVySxuR50QNxbTG1oYAS9KIukNn^BZ{X5a{a$2-IFCOMcC^wQ-398ylS4mdJA)r^R%L_NL86+cYx$#c~?b2dR)a{5`^+U@tL zJ!!l)o%gcAZ5qX(P?fHO(ZlXGb!nm={GZ$sJksal8HqM@PbL7h(rlf-rNqzx0!Yko z?g|0a_q8*!4|G7Y`n8{h10nZk6nAQ|d;i3ClyQPG$y1W?IhS?h2NDpaG0Xx5+J8s` zpXTR`cCj-iB!oH9hy&sLXDTcIo+mWZPAA;(OcP2DcwVL+jbQoSnJxkt4&usPP9net zW(y#<;Bx#@wk2mJscrdQWf-RGo}w0|9%=$k8B-rL|0K-5`+hgX0oxut70Q}}t+Y~T z`1Em7!4fgTvF4&X9W~T}H2NL*OT=num;_NcYyp<;0S8%XKe#sWRk|IAdz_Qf#*#Mv zNf5yTdY-;>oOy9yAUvj^TMFl4C;&Phg1BKVaAg$u!o3dM*CEt|xVq}3ZSC7TRxwc32R?OB%BVYTjD+8!6=7C7&@-S8N@ViUfti=SKG27jMjlswzV`*1t#q3!G4z^qoLD)|5r`SZys66r+bh!dQI)TmZb5 z$UJMcXp2_Zo^LVT29Aj1Eh&9Oo5Un1yPJ5TIw~HKr9`3WbRS;Vp*uAb3L57=`&|Ah zVwuVY0eG;jWIoKWx^yERy#4+k+2x4X&UBcIMlJ?J?N0lThJz6(X~rFKfDMU(9Q zB$%{Eo%VUF*uXKs!)a`F!=HBRye9VdFxC;QTBTl(Dz}*N)z=Q)0Zr1fv@n?B-xwS zC+MV4gCAH>SQyLLb=8K?tIZl#irRO7r8jY5I2g$R4gJh7PQKM&C$O?fc{ZO0f`H`< z^{GvTA-~a|Q5{|WA!P-@en+P!vOgNd%%QfQ`fLE&t{_XfU33$8r$`Wik|MOA*Bb{) z?n%0hTXENI#qE15^Hh(U%`5^PFNbAiAxffEKL1;BT=nV1p2p+tqcSCtNTI4owD`eB<&407$Fro*6=F&eYzbK{RQAw5vGeuE0>Bg>N) zi3M~BUJDj3Mj&Q5r{8kpxhC$RrCPYp%zoXz#~Xq)wB75{{NzrX=Q#mSN;im4q7%!C zm6(|1$dhUD9Qodpq(n@*LCoYnGuzx+aAg`2Cpd8{b}wB9nwkj>c;Zn5KmP(RbbU2! z1@(dyxDp7U{u6of_DvH$$r6$C$x`ZO62FPHgX8g`QOEgvM~^){539m>jF++r_T{gV zfvm*km)xTYJgu@E14KHoAG$FK4sYkF1$2K4JucoaxCCnd0ARsfu1vf(3R#iOs3B2i zzJ+H6kMDKtwW@!fp`;-=1fX0q|95ph0NXof-58yUxGPDqQcBSu4l4Z!!30vD(Fw_Z#{ehe+Y$%VhxdeBvBK+xk8JaC> zeN_*H)S{Q}h6Z>WgE^1xT?BYv9)ndMDAQn;e*}v4O67p6ly|JkzROt9y!G`L6N9{8 zGV`YIBotAi#nMsH($UJO&V@&d#4}Z$=j|BpIom=Xq?($Vtb>v<=B0rf?q<>Vs7iZ{ zX$yrb#{VEZoxuAwyZ4Y_TH%i8tXWA_YX=&Lynb;t+g>0yBx-2atDo`n7BJQT2XcfE zZw3$XrBV4)8)Zl2API3{zBGKIW`JN95xCuS(Dfq%O-9$Qr8cEG!eCXk3y))~t8Fty z>*1|!?-o&HxQq!po8RVH4+0+IH6Q13dE}6Qu+j>7;6HL;aFMjc3+MHhgAJ3Y*bMU> zg%mJCDmgXn-Y}_-Wux<@76<2rG-G3V1HvMKMy=RQO4@9*YzLwVEGcZo)Z$f#2*N4E zEe{7{fvN#Crx7fJ@e0W+=s_^v`AezXSJRM{{OA?nujelAo#|yeV+a1Ot(cz)1k2Tm>uqy zG(co}=bfKz*Pn;RQjFxm&j!fP*j%IKo{AJTm*qnEfB&wUW`}JR#Plg7L%+jl0%IHA zC7%WNK6)%X;YkY4Q`hnhtTTAQJ7cWRpRn?YBh$a|RS5dO6@D)rqKLA*`DXwJA@M7Q z_)3;Cbr9{2YgbNXZ$fTW62F4O9`TbxH-g@*C<7W8YEQ^ngnj0hPXm8NguK@D zwUp6hP_jzIxU?BVJ*Tb+A1-Z#ZYBCsY6@cj;c7z4UtZV~E>H@`pr}rpCM6>}zF?~B zz)FPh4=Qn*!||v92)2s^CuX0F`e&J=K~CtBC*4mkr=IHb_sLoLbINR%tQ0c@Aw0Uu z-6x-(j%)w(uIteTF*xt19O~+ENh(CwiPz|Fr z|F}+p5zA^TqYaJaNZ{XYd|x5p%t)&b2)l8JruTnO^xZz7R&I$Io{8TN(*<{bZ_a7C zxFB_CmNo{cMEy^-edt@mp7O3yL|@>Y%HHnPN$-F1V1q~bCe^Gh=;6gXlyl7W1_>zV zC3*E@T_fjifBz!3^JKsm2L4zG-Z{eumj8qNpSZ1#&<$sFinmLBdcEV8Eg^JF`h@$R zo{`0O*qnD~^ZuravSD|C;T!5e!Py?|AfXmnJ?VGx+94lk?58Qhot5iwz82n-m5b3= zn^~YOmO8J-YkH#^P1C1tx3_1;#iq_f9MNWkuB#F2tB;U4G4Z1`X}RY1`h}gpyBH=z zW!<F2pNsvwaJ$1@@;qFDFum>>h!uR9WlF8k9WRA&CDg^UHp+8vn&C|)T znuwMZwH_vf3g{LKT+fh(YcgeHg^eT*f@QJJRzY2pss~Nx==4f^B}fd`r1XcA-@UG2 z1g~Lx5uu(UN)8A1iz8%u=|KmrWun{bt!dg;BT8#U9>ygcQpFAowjF(@ccuijS6IyVJo4E+EzbPaKN*i- z%U24u6`{jKhqC6NoFU4$8el=XZ8Y_JuqPI>?GR^fQ~%x@({V9=rs;R>3z%Z*<;feXA(Je%O!K1`LqrT zHQtjCaO`c z?N`<>}AzGj@ejkGb$Nve39*rP}%em-7bcj0CxI^dcNxg&1g7|e$)SDp)Ia0OKat2H}Y zdbvey%K|JcKn}WpJD-4T=5I8xEn^L4wj*s_l;zWfM^B8PDz7)ZEn83K zS9!C48%!9!$C)n-`N~K2HpWYBfEe2rMf{SNsQn0x6k$N%4qQdQ(L>O6g!48|BKLwO$QdUK4M7u_{CF zk#MpPahdOA&bPp{g-GpE z!GRa4#kzrd(AC;3Ay^1)ZYPty$}PDD!e4`+>+WkDI;@{eT>zxBVDy-I!>n#P)5D$d zmR)0?(Yps}YV0Ck0Y>(d&NLAkho!oUGLlXQ_MxcJYET?Am+tn{`WJIrXa*iM3UzT*^nuGV z_x#O1XHZ4GwuP>hBFu8?iZlURMQi8w>2@JY{kC1LSZmQzb}E8Munez!Z=ak*+#}xX z4G{=?rN!>ZAYCyfCl~?y0A$C9z0SAxxoVRU`fasnb@V$(8Pp5SU*O=zMslo8dukxC z$TlX~7IRI}LVqxkTj0EX|Cv)Ny9YDWAP%B#;+2ADX@xbd*{WnG0t;BM-Kr%ocsQY| zkj8*OV)e#58j$2S@KE2n&ebfGy*R)9>V*p&gPo4c>tIipGWvm@;A*^mC0OC6`+WC<$dY3p+ z-jDTATFlkyk?XYEb>J;!&+^u^yBJJ=rH&o~y=3xweCaEtv z>NGfY8bj*&y`YZ@-_!m2Q8pheHC4ClO6bimc41J|Ip2cgt3UJ4o-2#DCk+IFs@3_Udk2c=n~5jTY#Y z^7qcu<`-eEhH{}nz1t>6`q^C=vc&o_pKGb0fE3lx++Ir_knGYzawTDfoX#zPV-ubj z2cqm8Jon~SyCe*#?BT^ooDdjBEfNwI|awETWdruU>Hv7+6^zjk=e)s5L~H{ zVg34=drydvZ~5%M54ll_zkx*cZXOeoj1TNgOW9>mS=Nxl<|IM`Kmqi6G@ejF-okm z({Jvxi~1^=Y_9jt-oT`>HyB}pzJr)d;UO)*cHA^lLVyG!*U#9?cEceG@@7{^TjN=P#7^-HFXU1<)xe8GByKPsNA+w{o<*bsZzL zW#s(eo*&sX_6&KR>kA=8WPF~j~-vp zfhJ1ZFZsyNPiBhSbp;~DgRaX-2S@;BPehEhGOYu0)y54$pimh0KWz9A>!~-wf?5?jVA?`ahS%!K-Ga~J zbYRQ~gbwOsWW^SL^S2N7CY0sTJ7lH$l{AQ}orDuwC#N`4_zkP8TeEVSVya9vio(~3 z@cs*iNgrGDG_`M#-L;YC2?WN#O#e+28IJS|9fG~`M+@Cq%+QZ{BK`yBDRv4 zuj44mQY@(CO$v$_VHHREdP-k7ltL7&6@9V&c&Q6eb4yD$wa4ufI_*|)GKsd(G^|TK zcgAvj8hn$c5XsSpI^Z#YOr)O;dtQZGTwNe;v%QbOSJ{JvK|C*6$sE+#G*@PI^ntPK z1O30)66?fd=rWx#g3PnF`n@j8x{Pil@>GH3XB^m9+|Qrd>jR;@G=;o4)af2|aDs|hy^wc7M}0$)ooBoi z^Bp0z^J5WXZ~x$P;xQt;R{TkkZG3Y0!uiG7&Y9qwaHgoeo_^>t4|QQ6NUA7ZOC1zb z`!>WUfuw|GEgJ=GfYOV9b0kK#9m(PY_W=nvJfyt+fr|fa&8!`n9wFJV;JfVqfrSq&7;)3q+Q7s;$>F z01fr~vyK`iaHyQr6rzbkuVwbZ`nWuXq6tnCg5_%+uTp_2&>gxO?!Iq4RA9Fp1oQtF_hc~kTGfpEBe@~ z83-U%t>d?5rsFiq#-LYS2lr6N#lPXGv%F^C7I##i|TUs%zD6a&V$4crnG zM{}#6f;^RWRVzdr5v3THja=8v3SAF7x9y(pX2dW_XiF-ck>ui{B(p-W=q;J00PNMs zkZ)nn#IQe$dsQvEPU@l4RjC`ZxpXqIW5~Z-(y8~}Rr$!bN&Am91*GE^c7Y2fg%M$< z$q1@wif@b>nevF1g!W5yulzz)VmGfGxz4=TD;|WLrTjBa-c2dLs>~%rhl=E`pLlG1Z8Q9q=yGqVN#%*{UZn!g6&B z*wN012n%{hg;AXunlLS5nHC!7amNoUWr87ao2f^g)JluCeSGiWDr+*%70UDSw$T3~ zK6a|C!b|mEDfZ)yG-O_>`ir88i}=x!Vl@CH-+FRu`zMM3q;B?smA*eC96&PX9aj}u zvIvrautY263EYF({9j(*fWzWQb17K{;N^_qjrSkS{*|x=6T(uX!fhTIC_D4DGIELt zU|M(kXVG}GYOioV!i+1jiUTP@DK)2Bs{fvVYO&zBF08K*HkcswyM3)<;wW~KIQN-` z3QTHUC3#P2I>{)Z)LE!DZBa4;r(cxNijQ=U|4{^>6IL_=hiONpziw>dUfb?WyT!G*tx|V= zKPrlim=VELb7m-*>5Qo4w-O)bcz1?Z6o#cAYA7y3|4mVs!Ah^}W$Mrq*5rt2QV*H7 z+s9*r;2EPQ9A^&P$(^Wv>mN_LZ(rUy|CSY-lABAk(eJJ>L_9&Po*VF$aDi29rsL9h z77JwMy$Hd&_I!Qt)6MWxvnPn}fnUnK!#Wxk?Cn5A6N&;Eu_?&HNj@DT?TmR)jx@PK zAmnQxm&HSth`R&~$Y3xLHdeS`PXQvDQmiJoP)uIt$(El#zAW6gjgTLvPZ%x+{;+MP ztubCpU7~6JP(9cM{hJA~U<;UFhrsS05p+p9a&D(P@6d_WJQedO1V3!hP2e|X+Tz_D zAmCu31Zx+&xtcBErISmSdZT!aVIM*oM6_rzPQW{LQ%)VR?c>jh5A&FKKKTo&Jk}JW z$bH@OW?BxW?k3=fk#>DI=N*!0512P|1SL@TU@5teciHK;X zF^jPH{n$dOxhzQcuBN9_2J*q2?Utj;id> zcTUOz)@~vc2$FF{0b1R)vvQnf&D%SlMk_PrAYj&20cM(N^_GItiqi%tUAwhcFabr#}RYuN%F9@-V7wx;_OtcBp*fY`=(l?-!?ihe=;* z!nyZ`g$PS4x8^Z()U#|jBV+FJ1iklG;AOW&$_oy+acN+hLuZrz6lc-S)59wHHS?F4 zLDwlfC7LmwK==GO0X z3?Tat-#s4!uJ6}gd1^xQ0|%u255W#dtSoB)C>r^a`Yg?WZm9(C3e_5%c9Alj4yYOT z!<)HP9R@iG%!#ON!@ue7pOh!|pzcn}9!^zf6d&mZi)qr1EIo^TaH&JIbjk)P(?NW8 z^KW(M?;N?OiXcQq&W=QLXGXRO(20= zG&RQlH{`C*yJpevkY`nKDMv~bIHfG0eNsE&ud+U%lkMpzL);Ce{T9Z7{vsScEeB5C zcjF2Yu&~IQ^G0Hnfy22jW=Gn##aEU-D8clb<-1E8$>i`f|Mz*S`0&6r^}q z9_F%#Qmn38^@TVsKGi&WsINbi975;(nr#=Yn|Pw1=;-snB^cfhDj#*c@Jelh0zS{n zax}=S*Stu3&UG{m={m79G{yZ<7@~NVtC?zI>MM}Oqh}-vOIAcZOoCr-iBCVeMxV$? z>s%P}B^-d#cxcde?l_v=tq05@R9AQtuDViz_tT+7vLB!4){CT~5R$F?dM*)VP<CbbTSF6oU)8sPe5REkV4isax6QFnnkwS&TBK z1}X=I@!TZ}*?C!fuYTravQGN%2g0sHi`Q$wf_RKJ^?mlNw1CxtA`(|`$M8c-axa;> zJvykf`(0PWf?43Qum%6f%b+-+$~^ETN9&k?v=u#YJIf*Ow?ygttz`Mqe?W{Et;;Chk;wAnfmidyfk8u3Ro380R-8?-tcy0@n1WW)iUjj+VIBSdwr_^%u^D0 z^N8meBjM82PQDvU`p~yZ#l9tfg-hR8n3Fu%R~^e{UFW_{(=3kPl?>0|$upi%q6XA= z?D`l#639ui_RPRxk3zH(wRfYd%@Qs=2D^usd4?U{rMI7pw}b2NC59dW<-O0V$XSjL zAqjA0-jeM_ZOx{J-uFDLvW|e@BdKFG$jrYVICVaTR}AM1Ljzbxrk8!9uW?P)g(T^G zi=fABLwftPy@5`sJG%RT=(5zNs876~x2f@oi7DD~Oww_s$f48lU$%>Mrmy~0-B3Lr ztsUp3M5iW{V6ja;b{d2xXtz1X-|qoc%PUgKWa2@nMlMK&`B9xu-6Rc7V?te?@tN34 z(U9NDpgrbeV_B8oyPB>Zdc!(30|GujkJmW~v3X)@uG$Y&Vx?yp>!*7AZV8prlIjwl zNwMd@K0=sWe;Eo1iI~6R{e!B>+G#{d*>E&bhu8S1RXAMco znq|l^kh{>B$6!s#kLrEmp##=xQ`Ydl>p0jRNsbc~d4=`d?-Q3})%?iqCPS6g#JKA& z6+&*{S|Ox)HFX_waK&(b(&kY50wrXET)ofyp<$gH3V(6CDGnhuZG{Rh1{!By)M{8q z%k#~xj>Ez6#;d_hA2R03&CNY{VaZzs`eqifJbEtnUCq)l9gfIxJsk&oARQR)pL!uK z1Zd!4Q`=otJKlM-8KBSRC|s%)__@+2yg4mfc-3Ia^$ARVn33Hx6I_ysjhmH5UZe+6 zy6q}>_N|%CQKFPkCO6mwNPRhHma-#C$z!euWrfww=MCt*EqD%wWax_-C+ZNg1u`F9 zQNP~2ftv=8m_}tzrE)q?c_X)p-PmU8(=#$2cP{L>Mwv#l3EJ-rnYP#a(HZV9>0pU% zeO#KNNgmqJgczuSqPbntY1Y;+9#u;>ZJQ|?AH7N4+D|*am1S<`RwYW$`qt871+rcy zkt?Jz+N(}z5WMyP;6Bf97tUQGhl#WHE_rr_u(p$8e10*Er<`=UwDrqHh2L2_<@t8> zvwt;Oz@dBP0&qUy<Sv>`x!ziZ@lfS2S!Y_UC2Hoiapq<=)gK0&B1|*c z21k6FpfCQpd!44T^$hi;a%v5kIEI<>gR3+=N00}dt;w3anl18b`HJyzvHo#-rSgUT z>*v!%owCspJ$~!e1PH;ze$ih_gj`?_@*KW+T6_aab|K?z*qIufKGU^CH!ee|Q`x+` zS4YdLbwTK+SE=(yN9evYUR+dg7@ng6I_&XFrG5@bWp&GCEl>U<`O|Q)RTT7#IKFHqZ>P3^3w_dhD{@p5;mO;N9RZ)p!AZ*-!x1cZl zd+*O2LyhDwwrw7c%e#6Ot%mlyA-a0un42h{(xLDUIM&~w;sf!!jI-EnLMN&@20iHG z3|^LWn6>yu-$Y!#2LJEsYwTD&&~zC2oJ-hLg`+d2%nwEX4iyq8tADJfdm+TGR>c>3 zEZ4NEY4RG}!rX4k^G97G42!<#cjBn9gDslSOLy)1nZ^4{4z=2V~sviF2mb)f`ZyT2^ zYd(aEbho4+Ka5w^r_LVSKAP|kFbDLIYquRXCHjgIs}R$cJF2*wks&A7Gf&nP^GZ6# zZG6bNX8NAm6Y|9JGH3W}`(Sg&s-%A0;F0+Fq@NUhHZANix)Hzi6NC-$mIu<=Z-kh+EB`m@QcOFRc=P(eTErRr<%Yc@=$}xfC@sTH@z>oF2lsNh1+# zMCEqs1sLG87k#)`N&PxEu-73r$g z{Y{C4g?anCJ=xncqVJW)-}HU8BQ!u4`a5JM`#V~a=yCxcD@Iz&}ex`G7ej)mdn zZ1P75s1c#PZ!BPHIs4jLYN6;jh`S@q7u{DJ;ad3jBT57q7BN7cgndWO@lUt7xQ+I( zw2pm9C6+S&zSO^p8yZuvNPx)e#>B_AB^TL4S+O99;@CY5Bi%jrcnql_kifAbOFUYF z5=wdA=ga$KQi2CUX4u>Wj?5d6Ml^JpYejbQ8N7%9hf30|Gv;yop`75)Z;7^Lx39criuoI;E zEHjmb8$8;kENuP4!|Lc2c%hRYu=7IyY0MWy*y>@CQRjTUX7$?pkkE4RRP_aM7y&iO zJk+1_ANM8Kz@^iKzNHMgxXWR(`b&p2W@aR3^UT0|{`Z!@!P=a8b~zAh6HO1_HxflQ z`S`|NpDW!xiRUyxb#EwDRtgTIhvhF3h?h)b)R$!)?!DR!KBXN#D6zn;_O2ffH@}-! zLvSk&(&T3oDlw_5v^9kpuS|5fH(S7$*uGAhEvI2_q)=qr2)9TjNW5+knC4l{Tl(t( z^Z(ACMB-P3slskq?r0}dG6LlrUi!?^s8sQM5FN8L8WOMe-Mr{XXF~1rDU8LL@_7-rA9ioPWV}Je6Y#gO z58P58RG9$d)Tet#cwn>Fd|~?U%y^;q5|`|Czh=oZCf4cWp7~rzz6>Wm452Q?0Um!q z;H%m8sk7Cz*GH)F?O3La^& zpN}K4(JBDDWn0hO(xk&ted*%QFO4RtD8V + + + Problems with current Metadata Standards + + + + + + +

Problems with current Metadata Standards

+ +

It seems that all metadata standards have their own unique problems. This +page documents some significant structural problems found in some current +metadata and file format specifications, and gives possible solutions to these +problems. [Also see my Commentary on Meta +Information Formats.]

+ + +

TIFF 6.0 [1]

+ +

A significant problem of the 1992 TIFF 6.0 specification is that there is no +way to distinguish an IFD (image file directory) offset from a simple integer +value. As a result, new IFD's may not be created without risking corruption of +the files by unaware software. This is not only a problem for proprietary maker +notes which commonly use a TIFF IFD structure, but is also a problem for +extensibility of TIFF-based RAW image formats (as demonstrated by the DNG 1.3 +specification -- see below).

+ +

A simple solution:

+ +

Use a TIFF field type of 13 (IFD) instead of 4 (LONG) for IFD offsets. +This was first proposed in 1995 by Adobe in their PageMaker +6.0 TIFF Technical Notes[2], +but unfortunately it never found its way into the TIFF specification. Even so, +Olympus Optical Co. has shown some intelligence and is using this field type in +the maker notes of their recent digital cameras. +

+ +

Another useful addition: (added 2009-09-27)

+ +

A number of camera and cell phone manufacturers (Concord, Kodak, Motorola, +Nokia, Olympus, Pentax, Ricoh, Samsung and Sony) leave blank IFD entries in the +maker notes of images from some models. Presumably this simplifies the embedded +software by allowing the output file structure to be kept constant even when the +number of maker note IFD entries changes. It could be useful if this feature +was added explicitly to the official TIFF specification by defining a field type +of 0 as a "free IFD entry" to be ignored. (Note that this ability already +exists implicitly at a certain level in the specification, which states: +"Readers should skip over fields containing an unexpected field +type".)

+ + +

DNG 1.3 [3]

+ +

With the DNG 1.3 specification of June 2009, Adobe added a new Camera Profile +IFD referenced by an offset using the standard (and unfortunate) TIFF LONG field +type. This means that the new Profile IFD will be lost if the file is rewritten +by any software which does not have explicit knowledge of the 1.3 specification. +But to make things worse, Adobe didn't even use a standard IFD format for the +data. Instead, the IFD begins with a TIFF-style header and uses relative instead +of absolute offsets. This would have been a good idea if the IFD was stored as +the value of an UNDEFINED tag rather than referenced from a LONG offset. (If +done this way, the new information would have been preserved if the file was +rewritten by unaware software.) But as implemented it just adds to the pain of +parsing the file by requiring even more specialized code to be written in +support of the DNG 1.3 format.

+ +

A simple solution:

+ +

Sack the Adobe developers who were responsible for this, and use field type +13 (as recommended above for TIFF 6.0) and a standard TIFF IFD structure when +adding new IFD's in the future.

+ + +

EXIF 2.3 [4]

+ +

The EXIF specification has been the standard for digital camera metadata for +many years, and while the digital camera technology has advanced significantly +in these years, the EXIF specification has not. There are a number of +significant problems with the EXIF specification which have never been +addressed.

+ +

Some current problems with the EXIF specification are:

+ +
    +
  1. Maker note data structure has no restrictions and is easily invalidated when +editing EXIF.
  2. +
  3. No facility for storing the time zone for date/time values. [finally +added to Exif 2.31 spec.]
  4. +
  5. Very limited support for alternate character sets (essentially only the +UserComment tag has this feature).
  6. +
  7. No alternate language support.
  8. +
  9. Byte ordering for "Unicode" text strings, and the meaning of "Unicode" +itself is not clearly specified.
  10. +
  11. Mandatory tags are unnecessary and painful to implement.
  12. +
  13. ApertureValue and MaxApertureValue are stored as unsigned RATIONAL, which +means that lenses with F numbers faster than 1.0 (with equivalent APEX values of +less than zero) can not be represented.
  14. +
  15. MaxApertureValue is defined as "The smallest F number of the lens". This +definition is unclear in the case of zoom lenses where the maximum aperture +varies across the zoom range. Some manufacturers (Canon, Nikon, Sony) store the +maximum aperture at the specific focal length, but others (Olympus, Pentax) +store the absolute maximum aperture of the lens.
  16. +
  17. EXIF is not extensible, and is missing definitions for storing some +information that could be very useful to camera owners (eg. camera pitch/roll +angles, sensor temperature, face detection, auto-focus points, image +stabilization, flash exposure compensation, etc). [Some of these tags +were added in the Exif 2.31 specification.]
  18. +
  19. 0xffffffff in the numerator or denominator of some rational-value tags is +used to indicate an unknown or infinite value. This is completely unnecessary +and not supported by many applications because it requires extra tag-specific +logic to be implemented.
  20. +
  21. The total size of EXIF metadata in JPEG images is limited to 65527 bytes +or less.
  22. +
+ +

Simple solutions:

+ +
    +
  1. Specify that maker note data must be self-contained (ie. must not exceed the +bounds of the maker note value data), and must be relocatable (ie. must not use +absolute offsets). [I would have suggested defining a new maker note tag +with field type 13 (IFD) which references a standard format IFD, but I am afraid +that no camera maker would ever jump on board with this suggestion now that they +have already been seduced by the dark side.]
  2. +
  3. Change the specification to allow an optional time zone of the format +"-05:00" to be appended to the date/time string values.
  4. +
  5. Change the specification to allow UTF-8 in ASCII-type values as recommended +by the MWG[5].
  6. +
  7. No simple solution for this. XMP[6] +is the only reasonable alternative if alternate language support is +required.
  8. +
  9. Specify that the Unicode byte order must be the same as the EXIF byte +ordering. (This is the only reasonable choice, but for some reason both +Microsoft and Apple seem to write Unicode using the native processor byte +ordering. regardless of the EXIF byte order.) Also, it should be made clear +that by "Unicode" the EXIF specification actually means UCS-2, although updating +this to allow UTF-16 surrogate pairs may be a good idea.
  10. +
  11. Define reasonable fallback values for required tags which are missing.
  12. +
  13. Allow ApertureValue and MaxApertureValue to be stored as signed SRATIONAL.
  14. +
  15. Define whether MaxApertureValue is taken at the current focal length of +a zoom lens, or over the entire zoom range.
  16. +
  17. Expand the standard to include additional useful information available from +modern digital cameras.
  18. +
  19. Use a rational value of 1/0 to indicate infinity, and 0/0 to indicate an +unknown/undefined value.
  20. +
  21. Allow EXIF to span multiple JPEG segments. Multiple consecutive EXIF +segments are simply concatenated into a single data block when reading. +[Apparently Adobe has been doing this for years[11], +and this ability was added to ExifTool in version 10.97.]
  22. +
+ + +

Microsoft "OffsetSchema" Tag [7]

+ +

In February 2007 Microsoft proposed a new PhotoInfo tag called "OffsetSchema" +(hex. 0xEA1D, dec. 59933) in an attempt to patch a deficiency in the EXIF maker +note specification (see point 1 in EXIF 2.2 section above). This tag represents +the offset difference between the original maker note location in the EXIF and +the new location after editing, and is designed to allow the maker note tag +values to be accessed after the location of the maker notes is changed by +editing the EXIF. [Bless their little hearts for trying to improve this +situation, but while the idea is good the implementation is flawed and +ultimately unworkable.]

+ +

There are two main problems with the implementation, and the second is a show +stopper:

+ +
1. For this new tag to be available to a single-pass metadata reader, it +must come before the maker note data (hex. 0x927C, dec. 37500). But +since the EXIF/TIFF format specifies that tags must be stored in numerical +order, the maker note tag (hex. 0x927C) comes before the OffsetSchema tag +(hex. 0xEA1D).
+ +
2. The OffsetSchema tag will be invalidated by any software that +rewrites the EXIF and moves the maker notes without properly updating the tag. +In an ideal world all application developers would release an updated version +of their software which treats the OffsetSchema properly, and all users would +update to this new version. But since this is the real world it just won't +happen, which makes the value of OffsetSchema unreliable. Too bad, because this +wouldn't have been a problem if Microsoft had specified that the new tag +represented the original offset of the maker notes instead of the difference +from the original position. With this change, the tag wouldn't need updating +when the EXIF is edited, and the information would be much more reliable. The +only problem here would be editing software that explicitly changes the maker +note offsets. However, software with this ability is rare, and it is more +reasonable to ask that the OffsetSchema tag simply be deleted by any software +that updates the maker note offsets. (Software must be fairly advanced in the +first place if it parses the proprietary maker note data structures and changes +these offsets.)
+ +

A simple solution:

+ +

Create a new tag which comes before the maker notes (hex. 0x927B, dec. 37499 +would be good) and represents the original offset of the maker notes.

+ + +

JPEG File Interchange Format [8]

+ +

The JPEG File Interchange Format version 1.02 was released in 1992. The +biggest structural problem with this standard is that metadata in these files in +is stored in segments which have a maximum size of 65533 bytes. This limit has +necessitated a number of creative solutions, each creating complications and +problems of their own. [See my comments on the PreviewImage problem for example.]

+ +

A simple solution:

+ +

Since the value of the segment size word includes the 2 bytes of the segment +size word itself, a value of 0 or 1 is not allowed by the current JPEG standard. +The standard could be enhanced so a value of 1 indicates an extended JPEG +segment where the 2-byte size word (with value 0x0001) is followed immediately +by a 4-byte integer giving the size of the extended JPEG segment. This would +allow segment sizes of up to 4294967291 bytes (assuming the size includes these +4 bytes). Further, a value of 0 could be defined for an 8-byte integer if one +really wanted to support huge metadata segments. Either change to an existing +JPEG would break all current JPEG reader/writers, but the change is trivial and +could easily be implemented.

+ +

An alternative solution:

+ +

Define a new application marker segment which uses a 4-byte size word. This +technique is already used for the extended JPEG2000 codestream MCT, MCC and MIC +marker segments.

+ +

Another solution: [implemented in ExifTool 10.97]

+ +

We can work around this limitation for EXIF metadata by allowing it to span +multiple segments using the same technique as for Photoshop APP13 metadata.

+ + +

Multi-Picture Format (MPF) [9]

+ +

In February 2009 CIPA[10] released a +"Multi-Picture Format" standard for storing large images in JPEG files. This +format is yet another attempt to bypass the JPEG segment-size limit (see above) +to store large preview images. But again, there is a significant problem with +this standard: Pointers in the new APP2 MPF segment use offsets relative to the +start of the MPF header in this segment to reference image data after the JPEG +EOI. Unfortunately, these offsets are quickly broken if any data after the MPF +segment changes length. This problem could have been avoided if offsets had +been specified relative to the end of file, but it is too late for this now that +the specification is public. However, another problem is that information after +the JPEG EOI is often discarded by software when the file is edited.

+ +

A possible work-around:

+ +

Enforce the rule that the MPF APP2 segment must come after all other APP +segments. (It would have been smart if this was specified in the CIPA standard, +but sadly this wasn't the case.) If this is done, then metadata in the remaining +APP segments (EXIF, IPTC, XMP, etc) can safely be edited without breaking the +MPF offsets. I suggest that all metadata editors employ this strategy, +regardless of the segment order specified in the standard (which says that the +MPF APP2 segment must come immediately after the EXIF APP1 segment).

+ +

Unfortunately this work-around has the same problems as the Microsoft +OffsetSchema tag because the MPF information may easily be invalidated by an +unaware editor, and it doesn't address the problem of losing data stored after +the JPEG EOI.

+ +

A simple solution:

+ +

Change the JPEG specification to allow larger segments (as mentioned above in +the JPEG section), and change the MPF specification to store all information +inside a JPEG segment.

+ +

[2014-04-29: CIPA has changed the location of these standards documents, +so the URL's referenced here are now broken.]

+ + +

References

+ +
    +
  1. http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf
  2. +
  3. http://partners.adobe.com/public/developer/en/tiff/TIFFPM6.pdf
  4. +
  5. http://www.adobe.com/products/dng/pdfs/dng_spec_1_3_0_0.pdf
  6. +
  7. http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-008-2010_E.pdf
  8. +
  9. https://web.archive.org/web/20180822085951/http://metadataworkinggroup.com/pdf/mwg_guidance.pdf
  10. +
  11. http://www.adobe.com/devnet/xmp/
  12. +
  13. http://support.microsoft.com/kb/927527
  14. +
  15. http://www.jpeg.org/public/jfif.pdf
  16. +
  17. http://www.cipa.jp/english/hyoujunka/kikaku/pdf/DC-X007-KEY_E.pdf
  18. +
  19. http://www.cipa.jp/english/hyoujunka/kikaku/cipa_e_kikaku_list.html
  20. +
  21. XMP Specification part 3 November 2014, p. 13
  22. +
+
+Created Sep 17, 2009
+Last revised May 16, 2018 +

<-- Back to ExifTool home page

+ + diff --git a/html/struct.html b/html/struct.html new file mode 100644 index 0000000..6a13ed8 --- /dev/null +++ b/html/struct.html @@ -0,0 +1,431 @@ + + + + Structured Information + + + + + +

Structured Information

+ +

ExifTool has the ability to read and write XMP structures through the use of +either structured or flattened tags. The ability to write via structured +input was added in ExifTool version 8.44; older versions accepted only flattened +tags as input.

+ +

To illustrate the concept of a flattened tag, the XMP-exif:Flash +structure contains Fired and Mode fields (among +others). The flattened tags corresponding to these structure fields are +XMP-exif:FlashFired and XMP-exif:FlashMode. In the +XMP Tags documentation, flattened tags are +indicated by an underline (_) after the Writable type.

+ +

This page describes various techniques used to read and write XMP structures +using both structured and flattened tags.

+ + +

Reading

+ +

When reading, structures are flattened by default, and ExifTool +returns one "flattened" tag for each field in the structure:

+ +
+
> exiftool -xmp:all a.xmp
+XMP Toolkit                     : Image::ExifTool 8.44
+Flash Fired                     : True
+Flash Mode                      : On
+Flash Return                    : Return not detected
+
+ +

But the -struct option may be used to give structured +output. In this mode structures are returned instead of separate +"flattened" tags:

+ +
+
> exiftool -struct -xmp:all a.xmp
+XMP Toolkit                     : Image::ExifTool 8.44
+Flash                           : {Fired=True,Mode=On,Return=Return not detected}
+
+ +

(Note: As illustrated in the example above, structures are +serialized for console output by the ExifTool +application. However, via the API with the Struct option, +they are returned as Perl HASH references.)

+ +

The -struct option may also be combined with the JSON +(-j), PHP (-php) or XML (-X) output +formats to provide a structured format which may be more compatible with other +applications.

+ + +

Writing

+ +

When writing, flattened tags and structures may be used interchangeably. +For example, the following commands all have the same effect.

+ +
+
exiftool -flashmode=on -flashreturn=not -flashfired=true a.xmp
+exiftool -xmp:flash="{mode=on,fired=true}" -flashreturn=not a.xmp
+exiftool -xmp:flash="{mode=on,fired=true,return=not}" a.xmp
+
+ +

(Note: Structures must be serialized when +writing via the command-line application, in the same format as when reading with +the -struct option.)

+ +

An advantage of writing in structured form is that it can be easier to +achieve the desired hierarchy with complex structures or when there are multiple +structures in a list. For example, this command adds a new hierarchical keyword +to the XMP-mwg-kw:HierarchicalKeywords list:

+ +
+
exiftool -hierarchicalkeywords+="{keyword=cat,children={keyword=Siamese}}" a.jpg
+
+ +

But the flattened tags may be more convenient for adding or replacing a +single field in an existing structure because writing as a structure would +require that the entire structure be replaced. For example, the following command +adds a new second-level keyword to an existing HierarchicalKeywords structure:

+ +
+
exiftool -hierarchicalkeywords2+="Persian" a.jpg
+
+ +

Tricky: There is one drawback when using this technique to add new +fields to existing structures in lists: New fields are added to the first +structure which doesn't already contain the corresponding field. So before +adding a new field to a arbitrary structure, dummy fields must first be added to +all earlier structures in the list which are missing this field. However, the +alternative of adding a new field by writing structured information also has its +drawbacks. Here, although a specific structure in a list can easily be targeted +through any unique combination of field values, the drawback is that the entire +structure must be replaced (see Deleting / Replacing +below).

+ +

The flattened tag names may also be used to write structures at any level +in a complex hierarchy. The following example writes a third-level +structure inside a HierarchicalKeywords structure:

+ +
+
exiftool -hierarchicalkeywords2Children='{Keyword=Tabby,Applied=true}' a.jpg
+
+ +

(Note: Containing structures are created as necessary. In this +case, the HierarchicalKeywords and top-level KeywordInfo structures would be +created if they didn't already exist.)

+ +

The order of structure fields is not significant, so they may be read +in a different order than written, unlike arrays which maintain the same order. +To give a predictable output, fields in structured information are sorted in +alphabetical order of field name by ExifTool when reading and writing.

+ +

If there are errors converting some fields of the input structure, +other fields are still written and a warning is issued (but only one warning per +structure is reported). This also applies when copying structured information +except that the -v3 option must be used to see the warnings when +copying.

+ +

Programmers: Structured information is written and read as Perl HASH +references via the ExifTool API, but it may also be written as a serialized +string. The following two techniques are equivalent:

+ +
+
# as a HASH reference
+$exifTool->SetNewValue('XMP:Flash' => { mode=>'on', fired=>'true', return=>'not' });
+
+# as a serialized string
+$exifTool->SetNewValue('XMP:Flash' => '{mode=on,fired=true,return=not}');
+
+ + +

Copying

+ +

By default, tags are copied as structures, but flattened tag names +may still be copied by specifying them explicitly. (Flattened +tags are treated as "unsafe" for copying so they are not copied by default +unless the Struct feature is disabled; see below.) Copying as structures +allows the hierarchy of complex structures to be preserved.

+ +
+
# this copies all XMP information as structures
+# (flattened tags are not copied by default...)
+exiftool -tagsfromfile src.jpg -xmp:all dst.jpg
+
+# ... but flattened tags may be copied individually.  Here the
+# first level hierarchical keywords are copied to the Subject tag
+# (this may be done in the same command as one that copies structures)
+exiftool -tagsfromfile src.jpg "-subject<hierarchicalkeywords1" dst.jpg
+
+ +

Note that when copying a specific structure, only the top-level structures +may be specified:

+ +
+
# this copies the complete keyword hierarchy
+exiftool -tagsfromfile src.jpg -keywordinfo dst.jpg
+
+# WRONG because HierarchicalKeywords is NOT a top-level structure!
+exiftool -tagsfromfile src.jpg -hierarchicalkeywords dst.jpg
+
+ +

The copy-as-structure feature may be disabled with --struct on +the command line, or by setting the Struct option +to 0 via the API. When this is done, only flattened tags are copied, and +structures may not be specified. Conversely, if the structure option is enabled +(by setting the Struct option to 1 via the API, +or with -struct on the command line), only structures are copied, +and flattened tags may not be specified.

+ +

(Note: ExifTool 8.43 and earlier copied as flattened tags only, but +copying as structures has been the default since the ability to write structured +information was introduced in version 8.44. An enhancement in version 8.82 +allowed flattened tags to be copied explicitly without the need to disable the +Struct option.)

+ + +

Deleting / Replacing

+ +

A complete structure is deleted by specifying one or more matching +fields. All fields must match for the structure to be deleted. For example, +the following command deletes all HierarchicalKeywords structures which have the +Keyword "Terrier" at the second level:

+ +
+
exiftool -hierarchicalkeywords-="{Children={Keyword=Terrier}}" a.jpg
+
+ +

Structure fields may also be deleted individually using the flattened +tag names. The following command deletes only the matching fields from the +second-level of all HierarchicalKeywords structures:

+ +
+
exiftool -hierarchicalkeywords2-="Terrier" a.jpg
+
+ +

Individual structure fields may NOT be deleted by writing a structure +with an empty field. Instead, a command like this overwrites the entire +structure with a new structure containing an empty field:

+ +
+
exiftool -CreatorContactInfo="{CiAdrCity=}" a.jpg  # WRONG!
+
+ +

When deleting and adding back items in lists in the same command, new items +are inserted at the point in the list where the first item was removed, or at +the end of the list if no items were deleted. This applies to lists of +structures as well as simple lists of string values, and provides a mechanism to +replace a specific structure or field.

+ + +

Field Names

+ +

Structure field names use a format very similar to tag names in +ExifTool. The following table lists some similarities and differences +between tag names and structure field names:

+ +
+ + + + + + + + + +
FeatureExampleTag NamesField Names
Case InsensitivityTitle, title, TITLEYesYes
Alternate Language SuffixTitle-deYesYes
Numerical Value SuffixMode#YesYes
Group Name PrefixXMP-dc:TitleYesNo
+ Except that group name prefixes are +allowed in structures which support arbitrary XMP fields (eg. +Region Extensions) +
+ + +

Serialization

+ +Structures are serialized when reading or writing from the command line. +However, serialization is not done when reading via the API, and is optional when +writing via the API. The serialization algorithm is as follows: + +
    +
  1. Escape the following characters in string values (structure field values and +list items) by adding a leading pipe symbol (|): +
      +
    • pipe symbols (|) and commas (,) anywhere in the string
    • +
    • closing curly brackets (}) anywhere in structure field values
    • +
    • closing square brackets (]) anywhere in list items
    • +
    • an opening curly ({) or square ([) +bracket, or whitespace character (SPACE, TAB, CR or LF) if it appears at the +beginning of the string
    • +
    +(Note: Any other character may be escaped by adding +a leading pipe symbol without effect.)
  2. +
  3. Enclose structures in curly brackets. Use an equal sign (=) +to separate field names from their corresponding values, and a comma between +structure fields.
  4. +
  5. Enclose lists in square brackets, with a comma between list items.
  6. +
  7. Optional whitespace padding may be added anywhere except inside a structure +field name, or inside or after a string value, and an optional comma may be +added after the last field in a structure.
  8. +
+ +

For example, with this command:

+ +
+
exiftool "-RegionInfo<=INFILE" a.xmp
+
+ +

and the INFILE below, structured information is written to XMP-mwg-rs:RegionInfo.

+ +
+
{
+  AppliedToDimensions =
+  {
+     W = 4288,
+     H = 2848,
+     Unit = pixel,
+  },
+  RegionList =
+  [
+    {
+      Area =
+      {
+        W = 0.15, H = 0.17, X = 0.3, Y = 0.4,
+        Unit = normalized,
+      },
+      Description = A Physics Icon {relatively speaking|},
+      Name = Albert Einstein,
+      Type = Face,
+      Extensions = {
+        XMP-xmpRights:UsageTerms = copyright Phil Harvey,
+        XMP-xmpRights:UsageTerms-fr = droit d'auteur Phil Harvey,
+      },
+      SeeAlso = dc:subject,
+    },
+    {
+      Area =
+      {
+        W = 0.06, H = 0.09, X = 0.5, Y = 0.6,
+        Unit = normalized,
+      },
+      Description = this is a test|, what did you expect?,
+      Type = Focus,
+      FocusUsage = Evaluated|, Used,
+    }
+  ],
+}
+
+ +

In this example, white space has been added in all allowed locations for +demonstration purposes and to improve readability. Also, optional commas have +been added after the last field of each structure. (Note that a comma may NOT +be added after the last item in a list because this would be interpreted as an +additional list item consisting of a zero-length string.)

+ + +

Examples

+ +

Here is an example of an advanced console session showing some commands which +manipulate a complex list of structures (see the +XMP-iptcExt tag documentation for details +about the ArtworkOrObject structure tags used):

+ +
+
# 1. Create a XMP-iptcExt:ArtworkOrObject structure using flattened tags
+> exiftool -artworktitle="a title" a.xmp
+    1 image files created
+
+# -- Read back as flattened tags (-S is used just to shorten the output)
+> exiftool -xmp-iptcext:all -S a.xmp
+ArtworkTitle: a title
+
+# -- Read back as a structure
+> exiftool -xmp-iptcext:all -S -struct a.xmp
+ArtworkOrObject: [{AOTitle=a title}]
+
+# 2. Write another field to the structure as a flattened tag
+> exiftool -artworkcreator=phil a.xmp
+    1 image files updated
+
+# -- Note that the structure now has a new field
+> exiftool -xmp-iptcext:all -S -struct a.xmp
+ArtworkOrObject: [{AOCreator=[phil],AOTitle=a title}]
+
+# 3. Add another creator using the "+=" operator
+> exiftool -artworkcreator+=joe a.xmp
+    1 image files updated
+
+# -- It was added to the first AOCreator list
+> exiftool -xmp-iptcext:all -S -struct a.xmp
+ArtworkOrObject: [{AOCreator=[phil,joe],AOTitle=a title}]
+
+# 4. Add another artwork title
+> exiftool -artworktitle+="another one" a.xmp
+    1 image files updated
+
+# -- This created a new ArtworkOrObject structure in the list of structures
+# (AOTitle itself is not a list, so a new structure must be created)
+> exiftool -xmp-iptcext:all -S -struct a.xmp
+ArtworkOrObject: [{AOCreator=[phil,joe],AOTitle=a title},{AOTitle=another one}]
+
+# 5. Simply write a different title (do not add with "+=")
+> exiftool -artworktitle="different" a.xmp
+    1 image files updated
+
+# -- This deleted all existing AOTitle fields and wrote back only one
+# (if the second ArtworkOrObject structure had contained more fields, they would have been
+# preserved, and the second structure would still exist, but without an AOTitle field)
+> exiftool -xmp-iptcext:all -S -struct a.xmp
+ArtworkOrObject: [{AOCreator=[phil,joe],AOTitle=different}]
+
+# 6. Add a completely new structure to the list
+# (this is very difficult to do properly using flattened tags)
+> exiftool -artworkorobject+="{aotitle=help,aocreator=[paul,ringo]}" a.xmp
+    1 image files updated
+
+# -- The new structure was added with the specified fields
+> exiftool -xmp-iptcext:all -S -struct a.xmp
+ArtworkOrObject: [{AOCreator=[phil,joe],AOTitle=different},{AOCreator=[paul,ringo],AOTitle=help}]
+
+# -- See how the relationships are lost when reading as flattened tags
+> exiftool -xmp-iptcext:all -S a.xmp
+ArtworkCreator: phil, joe, paul, ringo
+ArtworkTitle: different, help
+
+# 7. Delete all structures containing a specific field value
+> exiftool -artworkorobject-="{AOCreator=phil}" a.xmp
+    1 image files updated
+
+# -- The ArtworkOrObject list now contains only one structure
+> exiftool -xmp-iptcext:all -S -struct a.xmp
+ArtworkOrObject: [{AOCreator=[paul,ringo],AOTitle=help}]
+ + +

User-Defined Structures

+ +

User-defined XMP structure tags may be created via the ExifTool config file. +See the NewXMPxxxStruct tag definition in the XMP-xxx +examples of the sample config file for more details.

+ +
+Last revised Sept. 7, 2016 +

<-- Back to ExifTool home page

+ + diff --git a/html/style.css b/html/style.css new file mode 100644 index 0000000..e2fb232 --- /dev/null +++ b/html/style.css @@ -0,0 +1,31 @@ +body { font-family: helvetica; font-size: .9em; + color: black; background: white } +a:link { color: blue } +a:visited { color: #508 } +a:active { color: red } +.blk { color: black } +.red { color: #c00 } +.grn { color: #080 } +.blu { color: blue } +.com { color: #a00 } +.aside { color: #864 } +.lt { color: #666 } +.lg { font-size: larger } +.sm { font-size: smaller } +.up { margin: 0 0 .5em 0 } +p { margin: 1em 1em } +p.lf { margin: 1em 0 } +.code { color: #800; } +code { color: #800; font-family: monaco, monospace; + font-size: 1em; white-space: nowrap } +pre { font-family: monaco, monospace; font-size: 1em } +div.index { float: right; clear: both; + border-left: 1px solid gray; + margin: .5em 0 .5em .5em; padding: 0 .5em } +table.box { padding: .2em; background: #ddd } +table.norm { border-collapse: collapse; + border: 1px solid gray; } +table.norm th { border: 1px solid gray; background: #ddd } +table.norm td { border: 1px solid gray; padding: 2px 4px } +table.clear td { border: 0; padding: 0 2px } +table.tight td { padding: 1px 4px } diff --git a/html/under.html b/html/under.html new file mode 100644 index 0000000..d93d169 --- /dev/null +++ b/html/under.html @@ -0,0 +1,165 @@ + + + + Under the Hood + + + + + + +

"Under the Hood" of ExifTool

+ +

This page is a work in progress, and will be used to explain some details +of ExifTool's inner workings.

+ + +

Overview of ExifTool

+ +

Below is a diagram showing the flow of information for the exiftool +application. Indicated outside the boxes on the diagram are some command-line +options associated with the various stages of processing. All of these options +are directly associated with options or function calls available via the API +(Application Programming Interface), with the exception of the output text +formatting which is handled at the application level.

+ +
ExifTool Overview
+ +

The information flow is separated into two distinct modes: 1) +Reading or extracting information, and 2) +Writing or editing. The application runs in +read mode by default, but switches to write mode +if a new value is assigned to any tag (via "-TAG=", +"-tagsFromFile", "-geotag", "-csv=" or +"-json=" on the command line).

+ + +

Value Conversions

+

When ExifTool reads or writes the value of a tag, there are 3 separate +conversions applied to each value, resulting in 4 different levels for the value +of each tag. By default, users interact only with the human-readable +("PrintConv") value, but other levels are exposed through various exiftool +options:

+ +
  1. The "PrintConv" value is the final human-readable value +which has been converted for display. Often, the "PrintConv" conversion will +translate numbers into words for better readability. The -lang +(Lang) option is used to specify the language for this conversion, and the +-c and -d (CoordFormat and DateFormat) options specify +this formatting for GPS coordinates and date/time values.
+ +
  1. For numerical values, the "ValueConv" value is a +machine-readable value suitable for use in calculations, typically converted to +standard units (eg. degrees, meters, or seconds). For date/time values the +standard EXIF date/time format is used ("YYYY:mm:dd HH:MM:SS" plus decimal +seconds and time zone if they exist). For tags which are a closed choice of +string, this is the stored value of the string. The ValueConv value is +returned for all tags when the -n option is used, or for individual +tags by suffixing the tag name with a # character.
+ +
  1. The "Raw" value is the value after initial formatting is +applied to the binary data from the file. Most tags have no separate "ValueConv" +conversion, so for these tags the "Raw" value is the same as the "ValueConv" +value. Values stored in rational form also have a "Rational" value. Both +Raw and Rational values may be seen by using the -v option.
+ +
  1. The "Binary" value is the actual binary data stored in the +file. This data is displayed in hexadecimal form with the -v3 +option, or by using the -htmlDump feature. Note that this value is +not related to the -b (-binary) option, which actually +returns the "ValueConv" value and is used for tags where this value can not be +presented in a simple text format. The Writable column in the +Tag Name documentation +gives the format of this binary data for writable tags.
+ +

Below are some examples of these different values for a few tags:

+ +
+ + + + + + + + + + + + + + +
Tag3. PrintConv2. ValueConv1. Raw (Rational)0. Binary
EXIF:OrientationHorizontal (normal)11
00 01
EXIF:GPSLatitude45 deg 20' 11.00"45.336388888888945 20 11
(45/1 20/1 11/1)
00 00 00 2d 00 00 00 01
00 00 00 14 00 00 00 01
00 00 00 0b 00 00 00 01
XMP:GPSLatitude45 deg 20' 11.00"45.336388888888945,20.183333N"45,20.183333N"
EXIF:ExposureTime1/300.033333333330.03333333333
(1/30)
00 00 00 01 00 00 00 1e
EXIF:ShutterSpeedValue1/300.03333333346291764.90689059
(19868/4049)
00 00 4d 9c 00 00 0f d1
EXIF:ModifyDate(set by -d option)2016:11:25 11:56:392016:11:25 11:56:39"2016:11:25 11:56:39\0"
XMP:ModifyDate(set by -d option)2016:11:25 11:56:39.00-05:002016-11-25T11:56:39.00-05:00"2016-11-25T11:56:39.00-05:00"
+ + +

Underlying Philosophies

+ +

You have the right to know about the metadata contained in your images. A main +goal of the Exiftool project is to make this information freely available, both to +the general public and as a resource for other developers.

+ +

In the design of exiftool, there have been a number of underlying philosophies +which have helped to influence the overall development:

+ +
    +
  1. Make Image::ExifTool as independent as possible + from other libraries to make it portable and easy to install. (Portable to + a wide range of systems and Perl versions.)
  2. +
  3. Keep the interface simple for simple tasks (sometimes at the expense of making + it more complicated for complex tasks).
  4. +
  5. The API functions should be isolated from + the details of the metadata formats (otherwise the interface turns into a giant + hairball, like the metadata).
  6. +
  7. Maintain flexibility to allow users the freedom to do what they want.
  8. +
  9. Design the code to be efficient for batch processing, even if it increases the + initial overhead.
  10. +
  11. When writing files, remember 3 things: 1) data integrity, 2) data integrity, and + 3) data integrity. If you can't do it right, don't do it at all.
  12. +
  13. If possible, recognize file types by their structure, not by their extension.
  14. +
  15. Maintain backward compatibility when making changes to the ExifTool API or + command line application.
  16. +
+ + +

Why Write ExifTool in Perl?

+ +

At the start of ExifTool development, Perl, Python and C++ were all considered as +possible languages for the project. It was recognized that the project would require +considerable effort, and the choice of language could heavily influence the amount of +work necessary. Python was a strong contender, but was discounted due to a personal +preference for C-like syntax. Perl was chosen over C++ for the main reason that +it would be less work to develop and support the project. Looking back, this was +definitely the right choice, and there was the added benefit of a strong +infrastructure in support of +testing and +distributing Perl software.

+ +

Perl 5 is very mature and extremely stable, so there is almost zero time wasted +dealing with compilation issues. Compare this to C++, where a majority of +development time for a large project may be spent in this area. Also, Perl's +built-in regular expressions are fantastically useful for all of the string +manipulations necessary for a metadata library. The biggest problem with Perl is +its lack of support for Windows Unicode file names.

+ +

The bottom line is that most of the development time is spent dealing with the +mechanics of metadata, with the result that ExifTool is full-featured metadata +library. With one main developer (Phil Harvey) and 250 thousand lines of code (as of +Jan 2019), this is a real accomplishment.

+ +
+Created Jun. 24, 2009
+Last revised Nov. 1, 2021 +

<-- Back to ExifTool home page

+ + diff --git a/html/verbose.html b/html/verbose.html new file mode 100644 index 0000000..10badda --- /dev/null +++ b/html/verbose.html @@ -0,0 +1,211 @@ + + + + ExifTool Verbose Option + + + + +

ExifTool Verbose Option

+ +

With the Verbose option enabled, ExifTool prints a verbose log to the console as +it extracts the meta information from a file, or writes information to a file.

+ +

The -v option of the exiftool application allows control of the Verbose +setting. A number between 0 and 5 may be specified with the -v option to set a +specific Verbose level. For example, -v2 sets Verbose = 2. Without a number, +-v increments the current Verbose level by one. Multiple -v options are allowed, +so the following two examples give the same result:

+ +
+exiftool -v -v -v t/images/Canon.jpg
+
+exiftool -v3 t/images/Canon.jpg
+
+ +

Below are example outputs for different Verbose settings when extracting +information.

+ +

Verbose = 1

+

Prints tag names and extracted values. These are the raw values straight +from the file, before any conversions are applied. Also printed are details of +the file and directory structure:

+ +
+  ExifToolVersion = 10.00
+  FileName = Canon.jpg
+  Directory = t/images
+  FileSize = 2697
+  FileModifyDate = 1159902631
+  FileAccessDate = 1439991906
+  FileInodeChangeDate = 1439903472
+  FilePermissions = 33188
+  FileType = JPEG
+  FileTypeExtension = JPG
+  MIMEType = image/jpeg
+JPEG APP1 (2442 bytes):
+  ExifByteOrder = II
+  + [IFD0 directory with 9 entries]
+  | 0)  Make = Canon
+  | 1)  Model = Canon EOS DIGITAL REBEL
+  | 2)  Orientation = 1
+  | 3)  XResolution = 180 (180/1)
+  | 4)  YResolution = 180 (180/1)
+  | 5)  ResolutionUnit = 2
+  | 6)  ModifyDate = 2003:12:04 06:46:52
+  | 7)  YCbCrPositioning = 1
+  | 8)  ExifOffset (SubDirectory) -->
+  | + [ExifIFD directory with 31 entries]
+  | | 0)  ExposureTime = 4 (4/1)
+  | | 1)  FNumber = 14 (14/1)
+  | | 2)  ISO = 100
+  | | 3)  ExifVersion = 0221
+  | | 4)  DateTimeOriginal = 2003:12:04 06:46:52
+  [etc...]
+
+ +

Verbose = 2

+

Prints all of the information from Verbose = 1, plus additional information +about the tag ID, data size and format:

+ +
+  ExifToolVersion = 10.00
+  FileName = Canon.jpg
+  Directory = t/images
+  FileSize = 2697
+  FileModifyDate = 1159902631
+  FileAccessDate = 1439991927
+  FileInodeChangeDate = 1439903472
+  FilePermissions = 33188
+  FileType = JPEG
+  FileTypeExtension = JPG
+  MIMEType = image/jpeg
+JPEG APP1 (2442 bytes):
+  ExifByteOrder = II
+  + [IFD0 directory with 9 entries]
+  | 0)  Make = Canon
+  |     - Tag 0x010f (6 bytes, string[6])
+  | 1)  Model = Canon EOS DIGITAL REBEL
+  |     - Tag 0x0110 (24 bytes, string[24])
+  | 2)  Orientation = 1
+  |     - Tag 0x0112 (2 bytes, int16u[1])
+  | 3)  XResolution = 180 (180/1)
+  |     - Tag 0x011a (8 bytes, rational64u[1])
+  | 4)  YResolution = 180 (180/1)
+  |     - Tag 0x011b (8 bytes, rational64u[1])
+  | 5)  ResolutionUnit = 2
+  |     - Tag 0x0128 (2 bytes, int16u[1])
+  | 6)  ModifyDate = 2003:12:04 06:46:52
+  |     - Tag 0x0132 (20 bytes, string[20])
+  | 7)  YCbCrPositioning = 1
+  |     - Tag 0x0213 (2 bytes, int16u[1])
+  | 8)  ExifOffset (SubDirectory) -->
+  |     - Tag 0x8769 (4 bytes, int32u[1])
+  | + [ExifIFD directory with 31 entries]
+  | | 0)  ExposureTime = 4 (4/1)
+  | |     - Tag 0x829a (8 bytes, rational64u[1])
+  | | 1)  FNumber = 14 (14/1)
+  | |     - Tag 0x829d (8 bytes, rational64u[1])
+  | | 2)  ISO = 100
+  | |     - Tag 0x8827 (2 bytes, int16u[1])
+  | | 3)  ExifVersion = 0221
+  | |     - Tag 0x9000 (4 bytes, undef[4])
+  | | 4)  DateTimeOriginal = 2003:12:04 06:46:52
+  | |     - Tag 0x9003 (20 bytes, string[20])
+  [etc...]
+
+ +

Verbose = 3

+

Adds a hex dump of the binary data associated with each tag. The hex offsets +are relative to the start of the file, unlike the default HtmlDump output where +offsets are relative to the start of the TIFF header (the native base for +TIFF/EXIF offsets). If the data is very long, only the first few lines of the +dump are printed:

+ +
+  ExifToolVersion = 10.00
+  FileName = Canon.jpg
+  Directory = t/images
+  FileSize = 2697
+  FileModifyDate = 1159902631
+  FileAccessDate = 1439991933
+  FileInodeChangeDate = 1439903472
+  FilePermissions = 33188
+  FileType = JPEG
+  FileTypeExtension = JPG
+  MIMEType = image/jpeg
+JPEG APP1 (2442 bytes):
+    0006: 45 78 69 66 00 00 49 49 2a 00 08 00 00 00 09 00 [Exif..II*.......]
+    0016: 0f 01 02 00 06 00 00 00 7a 00 00 00 10 01 02 00 [........z.......]
+    0026: 18 00 00 00 80 00 00 00 12 01 03 00 01 00 00 00 [................]
+    0036: 01 00 00 00 1a 01 05 00 01 00 00 00 98 00 00 00 [................]
+    0046: 1b 01 05 00 01 00 00 00 a0 00 00 00 28 01 03 00 [............(...]
+    0056: 01 00 00 00 02 00 00 00 32 01 02 00 14 00 00 00 [........2.......]
+    0066: a8 00 00 00 13 02 03 00 01 00 00 00 01 00 00 00 [................]
+    [snip 2330 bytes]
+  ExifByteOrder = II
+  + [IFD0 directory with 9 entries]
+  | 0)  Make = Canon
+  |     - Tag 0x010f (6 bytes, string[6]):
+  |         0086: 43 61 6e 6f 6e 00                               [Canon.]
+  | 1)  Model = Canon EOS DIGITAL REBEL
+  |     - Tag 0x0110 (24 bytes, string[24]):
+  |         008c: 43 61 6e 6f 6e 20 45 4f 53 20 44 49 47 49 54 41 [Canon EOS DIGITA]
+  |         009c: 4c 20 52 45 42 45 4c 00                         [L REBEL.]
+  | 2)  Orientation = 1
+  |     - Tag 0x0112 (2 bytes, int16u[1]):
+  |         0036: 01 00                                           [..]
+  | 3)  XResolution = 180 (180/1)
+  |     - Tag 0x011a (8 bytes, rational64u[1]):
+  |         00a4: b4 00 00 00 01 00 00 00                         [........]
+  | 4)  YResolution = 180 (180/1)
+  |     - Tag 0x011b (8 bytes, rational64u[1]):
+  |         00ac: b4 00 00 00 01 00 00 00                         [........]
+  | 5)  ResolutionUnit = 2
+  |     - Tag 0x0128 (2 bytes, int16u[1]):
+  |         005a: 02 00                                           [..]
+  | 6)  ModifyDate = 2003:12:04 06:46:52
+  |     - Tag 0x0132 (20 bytes, string[20]):
+  |         00b4: 32 30 30 33 3a 31 32 3a 30 34 20 30 36 3a 34 36 [2003:12:04 06:46]
+  |         00c4: 3a 35 32 00                                     [:52.]
+  | 7)  YCbCrPositioning = 1
+  |     - Tag 0x0213 (2 bytes, int16u[1]):
+  |         0072: 01 00                                           [..]
+  | 8)  ExifOffset (SubDirectory) -->
+  |     - Tag 0x8769 (4 bytes, int32u[1]):
+  |         007e: bc 00 00 00                                     [....]
+  | + [ExifIFD directory with 31 entries]
+  | | 0)  ExposureTime = 4 (4/1)
+  | |     - Tag 0x829a (8 bytes, rational64u[1]):
+  | |         0242: 04 00 00 00 01 00 00 00                         [........]
+  | | 1)  FNumber = 14 (14/1)
+  | |     - Tag 0x829d (8 bytes, rational64u[1]):
+  | |         024a: 0e 00 00 00 01 00 00 00                         [........]
+  | | 2)  ISO = 100
+  | |     - Tag 0x8827 (2 bytes, int16u[1]):
+  | |         00ea: 64 00                                           [d.]
+  | | 3)  ExifVersion = 0221
+  | |     - Tag 0x9000 (4 bytes, undef[4]):
+  | |         00f6: 30 32 32 31                                     [0221]
+  | | 4)  DateTimeOriginal = 2003:12:04 06:46:52
+  | |     - Tag 0x9003 (20 bytes, string[20]):
+  | |         0252: 32 30 30 33 3a 31 32 3a 30 34 20 30 36 3a 34 36 [2003:12:04 06:46]
+  | |         0262: 3a 35 32 00                                     [:52.]
+  [etc...]
+
+ +

Verbose = 4 and Verbose = 5

+

These Verbose levels give similar output to Verbose = 3, except that with level +4 there is no limit on the length of data dumps of tag values, and with level 5 +the limit is also removed for dumps of JPEG segments. Note that the output may +be very long at these levels.

+ +
+

<-- Back to ExifTool home page

+ + diff --git a/html/writing.html b/html/writing.html new file mode 100644 index 0000000..d2e3e62 --- /dev/null +++ b/html/writing.html @@ -0,0 +1,239 @@ + + + + Writing Meta Information + + + + + +

Writing Meta Information

+ +

Abstract

+

Writing meta information is more complicated than it may appear at first +glance, which may be one reason why there are very few utilities around that do +it. ExifTool uses tag names to identify the different pieces of meta information +that can be extracted from a file. There are thousands of different tags that +ExifTool recognizes, and many of these tag names are common between different +metadata formats (the WhiteBalance tag is the worst offender, and can be found +in 65 different places [ExifTool 10.64]), and sometimes the information can even +be stored in different places within a single format. Couple this with the fact +that many manufacturers store meta information in undocumented formats which +must be reverse engineered (and each of which have their particular quirks), and +you have a very complex situation.

+ +

ExifTool attempts to simplify this situation as much as possible by making +reasonable decisions about where to write the information you specify, yet it +maintains flexibility by allowing you to configure its priorities if necessary, +or even override the decision making process entirely.

+ + +

Background

+

For a long time, I resisted adding write abilities to ExifTool even though it +was an oft-requested feature. My concerns in adding this feature were:

+
    +
  1. It would complicate the ExifTool interface and make it too confusing for +typical users.
  2. +
  3. It would complicate the code enough to slow down processing for normal use.
  4. +
  5. It would take a LOT of work to implement.
  6. +
+

After thinking about this for a while, I was finally able to come up with some +solutions:

+ +

1. I designed an interface that I think is easy to use for people who +don't want to know the details of the file structure, yet powerful enough for +people who want to do very specific things to the information.

+ +

2. I isolated all of the writing code as much as possible into separate files +which autoload as required. This keeps the compilation fast for people who +don't require the write feature. Also, I have left the reading routines +unchanged, so they aren't slowed down by the extra code needed when writing +information. Unfortunately, this meant I couldn't borrow a lot of code from the +read routines (even more work for me!), but it had the advantage that I could +perform additional optimizations in the write routines that I couldn't do +otherwise. Although the startup costs of this implementation are fairly high +(for writing only), it should be quite fast for batch writing of multiple files.

+ +

3. I decided to bite the bullet and invest the time required (...guess what I +did for my Christmas vacation!). Although I thought that a big project like +this would be better suited to C++ (faster execution and a broader potential +user base), after programming this so far in Perl I have grown to really +appreciate the automatic memory handling and other great features of Perl such +as hash lookups and incredible flexibility in text manipulations afforded by +regular expressions.

+ + +

Current Implementation

+

Currently, ExifTool can write most of the EXIF tags that anyone could reasonably +want to change (but some tags are protected because they describe physical +characteristics of the image that you can not change with ExifTool, eg. +Compression). Also, all of the GPS, IPTC and XMP information and most of the +MakerNotes information can be edited. This gives you great power, but with +great power, comes great responsibility...

+ +

It is possible for you to write nonsense into a file, which could cause other +image readers to throw up their hands in despair and refuse to read the image. +For this reason, it is best to always preserve the original copy of your image +file. The "exiftool" script does this for you automatically by renaming the +original file and always working on a copy.

+ +

The writing logic for ExifTool is the reverse of the reading logic. You +provide human-readable values and ExifTool will perform the conversions for you. +For instance, you can set "WhiteBalance" to "Daylight" and ExifTool will change +the value of WhiteBalance in the image wherever the tag is found provided that +"Daylight" is a valid value for that location. ExifTool will even do some simple +matching so that you could even just set it to "day", and ExifTool will search +through the valid values and will choose the one that contains the string "day". +If the value is ambiguous, the tag will not be set. If no tags can be set with +the specified value, ExifTool returns an error message.

+ +

The tag values can also be specified at a numerical level by disabling the +print conversions that are normally applied. This can be done on a tag-by-tag +basis or on a global basis through either the application or the API.

+ +

As well as changing tag values wherever they are found in the image, exiftool +will also create the tag in the preferred group if it didn't exist there before. +By default, the preferred group is the first of the following where the tag is +found: 1) EXIF, 2) IPTC, 3) XMP. Alternatively, the desired group (in family 0 +or 1) can be specified so ExifTool only writes the tag to a single location. For +example, with the command line interface, this is done using an argument like +"-EXIF:WhiteBalance=Manual".

+ +

If a tag is added to a group that doesn't exist, the new group is created in +the file, and required mandatory tags may be created. Conversely, if the last +non-mandatory tag is deleted from a group, the group is removed from the file.

+ + +

Mandatory Tags

+ +

The EXIF and IPTC standards both specify some mandatory tags. ExifTool will +automatically create many of these mandatory tags as required when writing new +information (and remove them again when deleting information if only mandatory +tags remain). However, some mandatory tags (particularly in the IPTC +information) can not be easily added automatically, so it is left up to the user +to add these tags if required.

+ +
+Rant: Let me say that the whole concept of mandatory tags is flawed. +Instead of mandatory tags, the standard should specify default values to be +assumed if the tags don't exist. A robust reader has to do this anyway, so it +is redundant to require that this information must be written. In the case +where there is no simple default value, the reader must be able to deal with the +missing tag, otherwise it places the burden on the writer to magically pull a +reasonable value out of thin air. Of course, you may say that the writer could +get this information from the user, but conditions like this add an unnecessary +level complexity to the user interface. +
+ + +

The JPEG Segment Size Limitation

+ +

An unfortunate aspect of the JPEG format is that the size of a single segment +is limited to less than 64 kB. With the 2-byte size word at the start of each +segment, this leaves 65533 bytes for data. The EXIF specification states that +the data must fit within a single APP1 segment (which results in the +preview image problem discussed below), however APP13 Photoshop and +APP2 ICC Profile and FPXR information may span multiple segments. This +multi-segment information is handled properly by ExifTool.

+ +

JPEG comments may also exceed the size of a single COM segment. If +necessary, comments are automatically split into separate segments when writing. +However, when reading they are not joined together because some utilities store +distinctly different comments in separate segments. To extract all JPEG +comments into a single file, and combine any comments that may have been split +into multiple segments, use "exiftool -a -b -comment src.jpg > +comment.out".

+ + +

The Preview Image Problem

+ +

Writing the preview image in JPEG files poses many problems of its own. These +problems stem from the fact that the JPEG standard is inadequate for storing +large preview images due to the 64kB limit on segment size as mentioned above. +(Note that TIFF images don't have this problem since they have a 4GB limit.) +Some manufacturers get around this by appending the preview after the normal end +of the JPEG file (JPEG EOI), but this causes complications because it means that +the preview image pointers in the EXIF information now point outside the EXIF +segment. This is truly unfortunate because it greatly complicates things for +image writing software. Most other software can't deal with a preview image and +will simply remove a preview like this when rewriting the file.

+ +

However, as of ExifTool version 5, the preview images are handled properly +when writing EXIF information in JPEG files. But for reasons of efficiency, the +EXIF segment is not edited when writing information if no EXIF tags are being +changed (eg. if only XMP or IPTC information is being edited). In this case, +the preview image pointers could be invalidated because the length of the data +between the EXIF segment (which comes near the start of the file) and the +preview image (at the end of the file) is likely to change. ExifTool gets +around this when reading JPEG images by looking for the preview at the end of +the file and updating pointers if necessary, but the preview image may not be +readable by other software (it should be noted though that very few image +readers even know the preview image exists). However, the preview pointers in +such a file can be fixed if necessary by simply using ExifTool to edit any EXIF +information.

+ +

2009-05-26: New Samsung cameras recently started embedding preview +images larger than 64 kB, and of course they created a new technique to do so. +If they were smart, they would have developed a simple technique that could be +used by others in the future, but of course they were stupid, and didn't think +that far ahead. (Such is the normal path of dumb camera manufacturers when it +comes to metadata.)

+ +

The new Samsung models simply split the preview and write it to separate APP2 +segments with no header. If they had written a header (like "PREVIEW\0" for +example), then the technique could be portable and useful. But they didn't. +Without a header, the data can not easily be distinguished from other random APP2 +data, so this technique is not generally useful. Of course, there are +disadvantages with splitting up a preview into separate JPEG segments, so this +technique in general is not ideal.

+ +

2009-06-12: +CIPA +has recently released a "Multi-Picture Format" standard for storing large +images in JPEG files. Again, there is a big problem with this standard: It +uses offsets that are relative to the start of the MPF header (in the new MPF +APP2 segment) to reference images after the JPEG EOI. These offsets will +quickly be broken if any data after the MPF segment changes length. This +problem could have been avoided if offsets had been specified relative to the +end of file, but it is too late for this now that the specification is +public.

+ +

The only workable alternative I can see is to enforce the rule that the MPF +APP2 segment must come after all other APP segments. (It would have been smart +if this was specified in the CIPA standard, but sadly this isn't the case.) If +this is done, then metadata in the remaining APP segments (EXIF, IPTC, XMP, etc) +can safely be edited without breaking the MPF offsets. I suggest that all +metadata editors employ this strategy, regardless of the segment order specified +in the standard (which says that the MPF APP2 segment must come immediately +after the EXIF APP1 segment).

+ + +

IFD0/ExifIFD Ambiguity

+ +

ExifTool has a preferred location (IFD) where it writes all EXIF tags. +However, a number of tags are written to different locations by various digital +cameras or image editors. Specifically, the following tags have been observed +in both IFD0 and ExifIFD: Make, Model, Software, Artist, DateTimeOriginal, +SensingMethod, CustomRendered, ExposureMode, WhiteBalance, DigitalZoomRatio and +SceneCaptureType. To handle this ambiguity, ExifTool will delete the tag if it +exists in IFD0 when it is written to ExifIFD, and vice versa.

+ +
+Created Dec. 30, 2004
+Last revised Oct. 4, 2010 +

<-- Back to ExifTool home page

+ + diff --git a/lib/File/RandomAccess.pm b/lib/File/RandomAccess.pm new file mode 100644 index 0000000..d6e11aa --- /dev/null +++ b/lib/File/RandomAccess.pm @@ -0,0 +1,418 @@ +#------------------------------------------------------------------------------ +# File: RandomAccess.pm +# +# Description: Buffer to support random access reading of sequential file +# +# Revisions: 02/11/2004 - P. Harvey Created +# 02/20/2004 - P. Harvey Added flag to disable SeekTest in new() +# 11/18/2004 - P. Harvey Fixed bug with seek relative to end of file +# 01/02/2005 - P. Harvey Added DEBUG code +# 01/09/2006 - P. Harvey Fixed bug in ReadLine() when using +# multi-character EOL sequences +# 02/20/2006 - P. Harvey Fixed bug where seek past end of file could +# generate "substr outside string" warning +# 06/10/2006 - P. Harvey Decreased $CHUNK_SIZE from 64k to 8k +# 11/23/2006 - P. Harvey Limit reads to < 0x80000000 bytes +# 11/26/2008 - P. Harvey Fixed bug in ReadLine when reading from a +# scalar with a multi-character newline +# 01/24/2009 - PH Protect against reading too much at once +# 10/04/2018 - PH Added NoBuffer option +# +# Notes: Calls the normal file i/o routines unless SeekTest() fails, in +# which case the file is buffered in memory to allow random access. +# SeekTest() is called automatically when the object is created +# unless specified. +# +# May also be used for string i/o (just pass a scalar reference) +# +# Legal: Copyright (c) 2003-2022 Phil Harvey (philharvey66 at gmail.com) +# This library is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +#------------------------------------------------------------------------------ + +package File::RandomAccess; + +use strict; +require 5.002; +require Exporter; + +use vars qw($VERSION @ISA @EXPORT_OK); +$VERSION = '1.11'; +@ISA = qw(Exporter); + +sub Read($$$); + +# constants +my $CHUNK_SIZE = 8192; # size of chunks to read from file (must be power of 2) +my $SKIP_SIZE = 65536; # size to skip when fast-forwarding over sequential data +my $SLURP_CHUNKS = 16; # read this many chunks at a time when slurping + +#------------------------------------------------------------------------------ +# Create new RandomAccess object +# Inputs: 0) reference to RandomAccess object or RandomAccess class name +# 1) file reference or scalar reference +# 2) flag set if file is already random access (disables automatic SeekTest) +sub new($$;$) +{ + my ($that, $filePt, $isRandom) = @_; + my $class = ref($that) || $that; + my $self; + + if (ref $filePt eq 'SCALAR') { + # string i/o + $self = { + BUFF_PT => $filePt, + BASE => 0, + POS => 0, + LEN => length($$filePt), + TESTED => -1, + }; + bless $self, $class; + } else { + # file i/o + my $buff = ''; + $self = { + FILE_PT => $filePt, # file pointer + BUFF_PT => \$buff, # reference to file data + BASE => 0, # location of start of buffer in file + POS => 0, # current position in buffer + LEN => 0, # length of data in buffer + TESTED => 0, # 0=untested, 1=passed, -1=failed (requires buffering) + }; + bless $self, $class; + $self->SeekTest() unless $isRandom; + } + return $self; +} + +#------------------------------------------------------------------------------ +# Enable DEBUG code +# Inputs: 0) reference to RandomAccess object +sub Debug($) +{ + my $self = shift; + $self->{DEBUG} = { }; +} + +#------------------------------------------------------------------------------ +# Perform seek test and turn on buffering if necessary +# Inputs: 0) reference to RandomAccess object +# Returns: 1 if seek test passed (ie. no buffering required) +# Notes: Must be done before any other i/o +sub SeekTest($) +{ + my $self = shift; + unless ($self->{TESTED}) { + my $fp = $self->{FILE_PT}; + if (seek($fp, 1, 1) and seek($fp, -1, 1)) { + $self->{TESTED} = 1; # test passed + } else { + $self->{TESTED} = -1; # test failed (requires buffering) + } + } + return $self->{TESTED} == 1 ? 1 : 0; +} + +#------------------------------------------------------------------------------ +# Get current position in file +# Inputs: 0) reference to RandomAccess object +# Returns: current position in file +sub Tell($) +{ + my $self = shift; + my $rtnVal; + if ($self->{TESTED} < 0) { + $rtnVal = $self->{POS} + $self->{BASE}; + } else { + $rtnVal = tell($self->{FILE_PT}); + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Seek to position in file +# Inputs: 0) reference to RandomAccess object +# 1) position, 2) whence (0 or undef=from start, 1=from cur pos, 2=from end) +# Returns: 1 on success +# Notes: When buffered, this doesn't quite behave like seek() since it will return +# success even if you seek outside the limits of the file. However if you +# do this, you will get an error on your next Read(). +sub Seek($$;$) +{ + my ($self, $num, $whence) = @_; + $whence = 0 unless defined $whence; + my $rtnVal; + if ($self->{TESTED} < 0) { + my $newPos; + if ($whence == 0) { + $newPos = $num - $self->{BASE}; # from start of file + } elsif ($whence == 1) { + $newPos = $num + $self->{POS}; # relative to current position + } elsif ($self->{NoBuffer} and $self->{FILE_PT}) { + $newPos = -1; # (can't seek relative to end if no buffering) + } else { + $self->Slurp(); # read whole file into buffer + $newPos = $num + $self->{LEN}; # relative to end of file + } + if ($newPos >= 0) { + $self->{POS} = $newPos; + $rtnVal = 1; + } + } else { + $rtnVal = seek($self->{FILE_PT}, $num, $whence); + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Read from the file +# Inputs: 0) reference to RandomAccess object, 1) buffer, 2) bytes to read +# Returns: Number of bytes read +sub Read($$$) +{ + my $self = shift; + my $len = $_[1]; + my $rtnVal; + + # protect against reading too much at once + # (also from dying with a "Negative length" error) + if ($len & 0xf8000000) { + return 0 if $len < 0; + # read in smaller blocks because Windows attempts to pre-allocate + # memory for the full size, which can lead to an out-of-memory error + my $maxLen = 0x4000000; # (MUST be less than bitmask in "if" above) + my $num = Read($self, $_[0], $maxLen); + return $num if $num < $maxLen; + for (;;) { + $len -= $maxLen; + last if $len <= 0; + my $l = $len < $maxLen ? $len : $maxLen; + my $buff; + my $n = Read($self, $buff, $l); + last unless $n; + $_[0] .= $buff; + $num += $n; + last if $n < $l; + } + return $num; + } + # read through our buffer if necessary + if ($self->{TESTED} < 0) { + # purge old data before reading in NoBuffer mode + $self->Purge() or return 0 if $self->{NoBuffer}; + my $buff; + my $newPos = $self->{POS} + $len; + # number of bytes to read from file + my $num = $newPos - $self->{LEN}; + if ($num > 0 and $self->{FILE_PT}) { + # read data from file in multiples of $CHUNK_SIZE + $num = (($num - 1) | ($CHUNK_SIZE - 1)) + 1; + $num = read($self->{FILE_PT}, $buff, $num); + if ($num) { + ${$self->{BUFF_PT}} .= $buff; + $self->{LEN} += $num; + } + } + # number of bytes left in data buffer + $num = $self->{LEN} - $self->{POS}; + if ($len <= $num) { + $rtnVal = $len; + } elsif ($num <= 0) { + $_[0] = ''; + return 0; + } else { + $rtnVal = $num; + } + # return data from our buffer + $_[0] = substr(${$self->{BUFF_PT}}, $self->{POS}, $rtnVal); + $self->{POS} += $rtnVal; + } else { + # read directly from file + $_[0] = '' unless defined $_[0]; + $rtnVal = read($self->{FILE_PT}, $_[0], $len) || 0; + } + if ($self->{DEBUG}) { + my $pos = $self->Tell() - $rtnVal; + unless ($self->{DEBUG}->{$pos} and $self->{DEBUG}->{$pos} > $rtnVal) { + $self->{DEBUG}->{$pos} = $rtnVal; + } + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Read a line from file (end of line is $/) +# Inputs: 0) reference to RandomAccess object, 1) buffer +# Returns: Number of bytes read +sub ReadLine($$) +{ + my $self = shift; + my $rtnVal; + my $fp = $self->{FILE_PT}; + + if ($self->{TESTED} < 0) { + my ($num, $buff); + $self->Purge() or return 0 if $self->{NoBuffer}; + my $pos = $self->{POS}; + if ($fp) { + # make sure we have some data after the current position + while ($self->{LEN} <= $pos) { + $num = read($fp, $buff, $CHUNK_SIZE); + return 0 unless $num; + ${$self->{BUFF_PT}} .= $buff; + $self->{LEN} += $num; + } + # scan and read until we find the EOL (or hit EOF) + for (;;) { + $pos = index(${$self->{BUFF_PT}}, $/, $pos); + if ($pos >= 0) { + $pos += length($/); + last; + } + $pos = $self->{LEN}; # have scanned to end of buffer + $num = read($fp, $buff, $CHUNK_SIZE) or last; + ${$self->{BUFF_PT}} .= $buff; + $self->{LEN} += $num; + } + } else { + # string i/o + $pos = index(${$self->{BUFF_PT}}, $/, $pos); + if ($pos < 0) { + $pos = $self->{LEN}; + $self->{POS} = $pos if $self->{POS} > $pos; + } else { + $pos += length($/); + } + } + # read the line from our buffer + $rtnVal = $pos - $self->{POS}; + $_[0] = substr(${$self->{BUFF_PT}}, $self->{POS}, $rtnVal); + $self->{POS} = $pos; + } else { + $_[0] = <$fp>; + if (defined $_[0]) { + $rtnVal = length($_[0]); + } else { + $rtnVal = 0; + } + } + if ($self->{DEBUG}) { + my $pos = $self->Tell() - $rtnVal; + unless ($self->{DEBUG}->{$pos} and $self->{DEBUG}->{$pos} > $rtnVal) { + $self->{DEBUG}->{$pos} = $rtnVal; + } + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Read whole file into buffer (without changing read pointer) +# Inputs: 0) reference to RandomAccess object +sub Slurp($) +{ + my $self = shift; + my $fp = $self->{FILE_PT} || return; + # read whole file into buffer (in large chunks) + my ($buff, $num); + while (($num = read($fp, $buff, $CHUNK_SIZE * $SLURP_CHUNKS)) != 0) { + ${$self->{BUFF_PT}} .= $buff; + $self->{LEN} += $num; + } +} + +#------------------------------------------------------------------------------ +# Purge internal buffer [internal use only] +# Inputs: 0) reference to RandomAccess object +# Returns: 1 on success, or 0 if current buffer position is negative +# Notes: This is called only in NoBuffer mode +sub Purge($) +{ + my $self = shift; + return 1 unless $self->{FILE_PT}; + return 0 if $self->{POS} < 0; # error if we can't read from here + if ($self->{POS} > $CHUNK_SIZE) { + my $purge = $self->{POS} - ($self->{POS} % $CHUNK_SIZE); + if ($purge >= $self->{LEN}) { + # read up to current position in 64k chunks, discarding as we go + while ($self->{POS} > $self->{LEN}) { + $self->{BASE} += $self->{LEN}; + $self->{POS} -= $self->{LEN}; + ${$self->{BUFF_PT}} = ''; + $self->{LEN} = read($self->{FILE_PT}, ${$self->{BUFF_PT}}, $SKIP_SIZE); + last if $self->{LEN} < $SKIP_SIZE; + } + } elsif ($purge > 0) { + ${$self->{BUFF_PT}} = substr ${$self->{BUFF_PT}}, $purge; + $self->{BASE} += $purge; + $self->{POS} -= $purge; + $self->{LEN} -= $purge; + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Set binary mode +# Inputs: 0) reference to RandomAccess object +sub BinMode($) +{ + my $self = shift; + binmode($self->{FILE_PT}) if $self->{FILE_PT}; +} + +#------------------------------------------------------------------------------ +# Close the file and free the buffer +# Inputs: 0) reference to RandomAccess object +sub Close($) +{ + my $self = shift; + + if ($self->{DEBUG}) { + local $_; + if ($self->Seek(0,2)) { + $self->{DEBUG}->{$self->Tell()} = 0; # set EOF marker + my $last; + my $tot = 0; + my $bad = 0; + foreach (sort { $a <=> $b } keys %{$self->{DEBUG}}) { + my $pos = $_; + my $len = $self->{DEBUG}->{$_}; + if (defined $last and $last < $pos) { + my $bytes = $pos - $last; + $tot += $bytes; + $self->Seek($last); + my $buff; + $self->Read($buff, $bytes); + my $warn = ''; + if ($buff =~ /[^\0]/) { + $bad += ($pos - $last); + $warn = ' - NON-ZERO!'; + } + printf "0x%.8x - 0x%.8x (%d bytes)$warn\n", $last, $pos, $bytes; + } + my $cur = $pos + $len; + $last = $cur unless defined $last and $last > $cur; + } + print "$tot bytes missed"; + $bad and print ", $bad non-zero!"; + print "\n"; + } else { + warn "File::RandomAccess DEBUG not working (file already closed?)\n"; + } + delete $self->{DEBUG}; + } + # close the file + if ($self->{FILE_PT}) { + close($self->{FILE_PT}); + delete $self->{FILE_PT}; + } + # reset the buffer + my $emptyBuff = ''; + $self->{BUFF_PT} = \$emptyBuff; + $self->{BASE} = 0; + $self->{LEN} = 0; + $self->{POS} = 0; +} + +#------------------------------------------------------------------------------ +1; # end diff --git a/lib/File/RandomAccess.pod b/lib/File/RandomAccess.pod new file mode 100644 index 0000000..edfbbe0 --- /dev/null +++ b/lib/File/RandomAccess.pod @@ -0,0 +1,250 @@ +#------------------------------------------------------------------------------ +# File: RandomAccess.pod -- Documentation for File::RandomAccess +# +# Description: Buffer to support random access reading of sequential file +# +# Legal: Copyright (c) 2003-2022 Phil Harvey (philharvey66 at gmail.com) +# This library is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +#------------------------------------------------------------------------------ + +=head1 NAME + +File::RandomAccess - Random access reads of sequential file or scalar + +=head1 SYNOPSIS + + use File::RandomAccess; + + $raf = new File::RandomAccess(\*FILE, $disableSeekTest); + + $raf = new File::RandomAccess(\$data); + + $err = $raf->Seek($pos); + $num = $raf->Read($buff, $bytes); + +=head1 DESCRIPTION + +Allows random access to sequential file by buffering the file if necessary. +Also allows access to data in memory to be accessed as if it were a file. + +=head1 METHODS + +=over 4 + +=item B + +Creates a new RandomAccess object given a file reference or +reference to data in memory. + + # Read from open file or pipe + $raf = new File::RandomAccess(\*FILE); + + # Read from data in memory + $raf = new File::RandomAccess(\$data); + +=over 4 + +=item Inputs: + +0) Reference to RandomAccess object or RandomAccess class name. + +1) File reference or scalar reference. + +2) Flag set if file is already random access (disables automatic SeekTest). + +=item Returns: + +Reference to RandomAccess object. + +=back + +=item B + +Performs test seek() on file to determine if buffering is necessary. If +the seek() fails, then the file is buffered to allow random access. +B() is automatically called from B unless specified. + + $result = $raf->SeekTest(); + +=over 4 + +=item Inputs: + +0) Reference to RandomAccess object. + +=item Returns: + +1 if seek test passed (ie. no buffering required). + +=item Notes: + +Must be called before any other i/o. + +=back + +=item B + +Get current position in file + + $pos = $raf->Tell(); + +=over 4 + +=item Inputs: + +0) Reference to RandomAccess object. + +=item Returns: + +Current position in file + +=back + +=item B + +Seek to specified position in file. When buffered, this doesn't quite +behave like seek() since it returns success even if you seek outside the +limits of the file. + + $success = $raf->Seek($pos, 0); + +=over 4 + +=item Inputs: + +0) Reference to RandomAccess object. + +1) Position. + +2) Whence (0=from start, 1=from cur pos, 2=from end). + +=item Returns: + +1 on success, 0 otherwise + +=back + +=item B + +Read data from the file. + + $num = $raf->Read($buff, 1024); + +=over 4 + +=item Inputs: + +0) Reference to RandomAccess object. + +1) Buffer. + +2) Number of bytes to read. + +=item Returns: + +Number of bytes actually read. + +=back + +=item B + +Read a line from file (end of line is $/). + +=over 4 + +=item Inputs: + +0) Reference to RandomAccess object. + +1) Buffer. + +=item Returns: + +Number of bytes read. + +=back + +=item B + +Read whole file into buffer, without changing read pointer. + +=over 4 + +=item Inputs: + +0) Reference to RandomAccess object. + +=item Returns: + +Nothing. + +=back + +=item B + +Set binary mode for file. + +=over 4 + +=item Inputs: + +0) Reference to RandomAccess object. + +=item Returns: + +Nothing. + +=back + +=item B + +Close the file and free the buffer. + +=over 4 + +=item Inputs: + +0) Reference to RandomAccess object. + +=item Returns: + +Nothing. + +=back + +=back + +=head1 OPTIONS + +=over 4 + +=item B + +Avoid buffering sequential files. + + $raf->{NoBuffer} = 1; + +When this option is set, old data is purged from the internal buffer before +a read operation on a sequential file. In this mode, memory requirements +may be significantly reduced when reading sequential files, but seeking +backward is limited to within the size of the internal buffer (which will be +at least as large as the last returned data block), and seeking relative to +the end of file is not allowed. + +=back + +=head1 AUTHOR + +Copyright 2003-2022 Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L + +=cut + +# end diff --git a/lib/Image/ExifTool.pm b/lib/Image/ExifTool.pm new file mode 100644 index 0000000..28d6b3a --- /dev/null +++ b/lib/Image/ExifTool.pm @@ -0,0 +1,8971 @@ +#------------------------------------------------------------------------------ +# File: ExifTool.pm +# +# Description: Read and write meta information +# +# URL: https://exiftool.org/ +# +# Revisions: Nov. 12/2003 - P. Harvey Created +# (See html/history.html for revision history) +# +# Legal: Copyright (c) 2003-2022, Phil Harvey (philharvey66 at gmail.com) +# This library is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +#------------------------------------------------------------------------------ + +package Image::ExifTool; + +use strict; +require 5.004; # require 5.004 for UNIVERSAL::isa (otherwise 5.002 would do) +require Exporter; +use File::RandomAccess; +use overload; + +use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes + %allTables @tableOrder $exifAPP1hdr $xmpAPP1hdr $xmpExtAPP1hdr + $psAPP13hdr $psAPP13old @loadAllTables %UserDefined $evalWarning + %noWriteFile %magicNumber @langs $defaultLang %langName %charsetName + %mimeType $swapBytes $swapWords $currentByteOrder %unpackStd + %jpegMarker %specialTags %fileTypeLookup $testLen $exeDir + %static_vars); + +$VERSION = '12.44'; +$RELEASE = ''; +@ISA = qw(Exporter); +%EXPORT_TAGS = ( + # all public non-object-oriented functions: + Public => [qw( + ImageInfo GetTagName GetShortcuts GetAllTags GetWritableTags + GetAllGroups GetDeleteGroups GetFileType CanWrite CanCreate + AddUserDefinedTags + )], + # exports not part of the public API, but used by ExifTool modules: + DataAccess => [qw( + ReadValue GetByteOrder SetByteOrder ToggleByteOrder Get8u Get8s Get16u + Get16s Get32u Get32s Get64u GetFloat GetDouble GetFixed32s Write + WriteValue Tell Set8u Set8s Set16u Set32u Set64u Set64s + )], + Utils => [qw(GetTagTable TagTableKeys GetTagInfoList AddTagToTable HexDump)], + Vars => [qw(%allTables @tableOrder @fileTypes)], +); + +# set all of our EXPORT_TAGS in EXPORT_OK +Exporter::export_ok_tags(keys %EXPORT_TAGS); + +# test for problems that can arise if encoding.pm is used +{ my $t = "\xff"; die "Incompatible encoding!\n" if ord($t) != 0xff; } + +# The following functions defined in Image::ExifTool::Writer.pl are declared +# here so their prototypes will be available. These Writer routines will be +# autoloaded when any of them is called. +sub SetNewValue($;$$%); +sub SetNewValuesFromFile($$;@); +sub GetNewValue($$;$); +sub GetNewValues($$;$); +sub CountNewValues($); +sub SaveNewValues($); +sub RestoreNewValues($); +sub WriteInfo($$;$$); +sub SetFileModifyDate($$;$$$); +sub SetFileName($$;$$$); +sub SetSystemTags($$); +sub GetAllTags(;$); +sub GetWritableTags(;$); +sub GetAllGroups($;$); +sub GetNewGroups($); +sub GetDeleteGroups(); +sub AddUserDefinedTags($%); +# non-public routines below +sub InsertTagValues($$$;$$$); +sub IsWritable($); +sub IsSameFile($$$); +sub IsRawType($); +sub GetNewFileName($$); +sub LoadAllTables(); +sub GetNewTagInfoList($;$); +sub GetNewTagInfoHash($@); +sub GetLangInfo($$); +sub Get64s($$); +sub Get64u($$); +sub GetFixed64s($$); +sub GetExtended($$); +sub Set64u(@); +sub Set64s(@); +sub DecodeBits($$;$); +sub EncodeBits($$;$$); +sub Filter($$$); +sub HexDump($;$%); +sub DumpTrailer($$); +sub DumpUnknownTrailer($$); +sub VerboseInfo($$$%); +sub VerboseValue($$$;$); +sub VPrint($$@); +sub Rationalize($;$); +sub Write($@); +sub WriteTrailerBuffer($$$); +sub AddNewTrailers($;@); +sub Tell($); +sub WriteValue($$;$$$$); +sub WriteDirectory($$$;$); +sub WriteBinaryData($$$); +sub CheckBinaryData($$$); +sub WriteTIFF($$$); +sub PackUTF8(@); +sub UnpackUTF8($); +sub SetPreferredByteOrder($;$); +sub CopyBlock($$$); +sub CopyFileAttrs($$$); +sub TimeNow(;$$); +sub NewGUID(); +sub MakeTiffHeader($$$$;$$); + +# other subroutine definitions +sub SplitFileName($); +sub EncodeFileName($$;$); +sub Open($*$;$); +sub Exists($$); +sub IsDirectory($$); +sub Rename($$$); +sub Unlink($@); +sub SetFileTime($$;$$$$); +sub DoEscape($$); +sub ConvertFileSize($); +sub ParseArguments($;@); #(defined in attempt to avoid mod_perl problem) +sub ReadValue($$$;$$$); + +# list of main tag tables to load in LoadAllTables() (sub-tables are recursed +# automatically). Note: They will appear in this order in the documentation +# unless tweaked in BuildTagLookup::GetTableOrder(). +@loadAllTables = qw( + PhotoMechanic Exif GeoTiff CanonRaw KyoceraRaw Lytro MinoltaRaw PanasonicRaw + SigmaRaw JPEG GIMP Jpeg2000 GIF BMP BMP::OS2 BMP::Extra BPG BPG::Extensions + PICT PNG MNG FLIF DjVu DPX OpenEXR ZISRAW MRC LIF MRC::FEI12 MIFF PCX PGF + PSP PhotoCD Radiance Other::PFM PDF PostScript Photoshop::Header + Photoshop::Layers Photoshop::ImageData FujiFilm::RAF FujiFilm::IFD + Samsung::Trailer Sony::SRF2 Sony::SR2SubIFD Sony::PMP ITC ID3 ID3::Lyrics3 + FLAC Ogg Vorbis APE APE::NewHeader APE::OldHeader Audible MPC MPEG::Audio + MPEG::Video MPEG::Xing M2TS QuickTime QuickTime::ImageFile QuickTime::Stream + QuickTime::Tags360Fly Matroska MOI MXF DV Flash Flash::FLV Real::Media + Real::Audio Real::Metafile Red RIFF AIFF ASF WTV DICOM FITS MIE JSON HTML + XMP::SVG Palm Palm::MOBI Palm::EXTH Torrent EXE EXE::PEVersion EXE::PEString + EXE::MachO EXE::PEF EXE::ELF EXE::AR EXE::CHM LNK Font VCard Text + VCard::VCalendar RSRC Rawzor ZIP ZIP::GZIP ZIP::RAR RTF OOXML iWork ISO + FLIR::AFF FLIR::FPF MacOS MacOS::MDItem FlashPix::DocTable +); + +# alphabetical list of current Lang modules +@langs = qw(cs de en en_ca en_gb es fi fr it ja ko nl pl ru sv tr zh_cn zh_tw); + +$defaultLang = 'en'; # default language + +# language names +%langName = ( + cs => 'Czech (ÄŒeÅ¡tina)', + de => 'German (Deutsch)', + en => 'English', + en_ca => 'Canadian English', + en_gb => 'British English', + es => 'Spanish (Español)', + fi => 'Finnish (Suomi)', + fr => 'French (Français)', + it => 'Italian (Italiano)', + ja => 'Japanese (日本語)', + ko => 'Korean (한국어)', + nl => 'Dutch (Nederlands)', + pl => 'Polish (Polski)', + ru => 'Russian (РуÑÑкий)', + sv => 'Swedish (Svenska)', + 'tr'=> 'Turkish (Türkçe)', + zh_cn => 'Simplified Chinese (简体中文)', + zh_tw => 'Traditional Chinese (ç¹é«”中文)', +); + +# recognized file types, in the order we test unknown files +# Notes: 1) There is no need to test for like types separately here +# 2) Put types with weak file signatures at end of list to avoid false matches +# 3) PLIST must be in this list for the binary PLIST format, although it may +# cause a file to be checked twice for XML +@fileTypes = qw(JPEG EXV CRW DR4 TIFF GIF MRW RAF X3F JP2 PNG MIE MIFF PS PDF + PSD XMP BMP BPG PPM RIFF AIFF ASF MOV MPEG Real SWF PSP FLV OGG + FLAC APE MPC MKV MXF DV PMP IND PGF ICC ITC FLIR FLIF FPF LFP + HTML VRD RTF FITS XCF DSS QTIF FPX PICT ZIP GZIP PLIST RAR BZ2 + CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font RSRC M2TS + MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard LRI R3D AA PDB + PFM2 MRC LIF JXL MOI ISO ALIAS JSON MP3 DICOM PCD TXT); + +# file types that we can write (edit) +my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM EPS + X3F PS PDF ICC VRD DR4 JP2 JXL EXIF AI AIT IND MOV EXV FLIF); +my %writeTypes; # lookup for writable file types (hash filled if required) + +# file extensions that we can't write for various base types +%noWriteFile = ( + TIFF => [ qw(3FR DCR K25 KDC SRF) ], + XMP => [ qw(SVG INX) ], + JP2 => [ qw(J2C JPC) ], + MOV => [ qw(INSV) ], +); + +# file types that we can create from scratch +# - must update CanCreate() documentation if this list is changed! +my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV); + +# file type lookup for all recognized file extensions (upper case) +# (if extension may be more than one type, the type is a list where +# the writable type should come first if it exists) +%fileTypeLookup = ( + '360' => ['MOV', 'GoPro 360 video'], + '3FR' => ['TIFF', 'Hasselblad RAW format'], + '3G2' => ['MOV', '3rd Gen. Partnership Project 2 audio/video'], + '3GP' => ['MOV', '3rd Gen. Partnership Project audio/video'], + '3GP2'=> '3G2', + '3GPP'=> '3GP', + A => ['EXE', 'Static library'], + AA => ['AA', 'Audible Audiobook'], + AAE => ['PLIST','Apple edit information'], + AAX => ['MOV', 'Audible Enhanced Audiobook'], + ACR => ['DICOM','American College of Radiology ACR-NEMA'], + ACFM => ['Font', 'Adobe Composite Font Metrics'], + AFM => ['Font', 'Adobe Font Metrics'], + AMFM => ['Font', 'Adobe Multiple Master Font Metrics'], + AI => [['PDF','PS'], 'Adobe Illustrator'], + AIF => 'AIFF', + AIFC => ['AIFF', 'Audio Interchange File Format Compressed'], + AIFF => ['AIFF', 'Audio Interchange File Format'], + AIT => 'AI', + ALIAS=> ['ALIAS','MacOS file alias'], + APE => ['APE', "Monkey's Audio format"], + APNG => ['PNG', 'Animated Portable Network Graphics'], + ARW => ['TIFF', 'Sony Alpha RAW format'], + ARQ => ['TIFF', 'Sony Alpha Pixel-Shift RAW format'], + ASF => ['ASF', 'Microsoft Advanced Systems Format'], + AVC => ['AVC', 'Advanced Video Connection'], # (extensions are actually _AU,_AD,_IM,_ID) + AVI => ['RIFF', 'Audio Video Interleaved'], + AVIF => ['MOV', 'AV1 Image File Format'], + AZW => 'MOBI', # (see http://wiki.mobileread.com/wiki/AZW) + AZW3 => 'MOBI', + BMP => ['BMP', 'Windows Bitmap'], + BPG => ['BPG', 'Better Portable Graphics'], + BTF => ['BTF', 'Big Tagged Image File Format'], #(unofficial) + BZ2 => ['BZ2', 'BZIP2 archive'], + CHM => ['CHM', 'Microsoft Compiled HTML format'], + CIFF => ['CRW', 'Camera Image File Format'], + COS => ['COS', 'Capture One Settings'], + CR2 => ['TIFF', 'Canon RAW 2 format'], + CR3 => ['MOV', 'Canon RAW 3 format'], + CRM => ['MOV', 'Canon RAW Movie'], + CRW => ['CRW', 'Canon RAW format'], + CS1 => ['PSD', 'Sinar CaptureShop 1-Shot RAW'], + CSV => ['TXT', 'Comma-Separated Values'], + CZI => ['CZI', 'Zeiss Integrated Software RAW'], + DC3 => 'DICM', + DCM => 'DICM', + DCP => ['TIFF', 'DNG Camera Profile'], + DCR => ['TIFF', 'Kodak Digital Camera RAW'], + DCX => ['DCX', 'Multi-page PC Paintbrush'], + DEX => ['DEX', 'Dalvik Executable format'], + DFONT=> ['Font', 'Macintosh Data fork Font'], + DIB => ['BMP', 'Device Independent Bitmap'], + DIC => 'DICM', + DICM => ['DICOM','Digital Imaging and Communications in Medicine'], + DIR => ['DIR', 'Directory'], + DIVX => ['ASF', 'DivX media format'], + DJV => 'DJVU', + DJVU => ['AIFF', 'DjVu image'], + DLL => ['EXE', 'Windows Dynamic Link Library'], + DNG => ['TIFF', 'Digital Negative'], + DOC => ['FPX', 'Microsoft Word Document'], + DOCM => [['ZIP','FPX'], 'Office Open XML Document Macro-enabled'], + # Note: I have seen a password-protected DOCX file which was FPX-like, so I assume + # that any other MS Office file could be like this too. The only difference is + # that the ZIP and FPX formats are checked first, so if this is wrong, no biggie. + DOCX => [['ZIP','FPX'], 'Office Open XML Document'], + DOT => ['FPX', 'Microsoft Word Template'], + DOTM => [['ZIP','FPX'], 'Office Open XML Document Template Macro-enabled'], + DOTX => [['ZIP','FPX'], 'Office Open XML Document Template'], + DPX => ['DPX', 'Digital Picture Exchange' ], + DR4 => ['DR4', 'Canon VRD version 4 Recipe'], + DS2 => ['DSS', 'Digital Speech Standard 2'], + DSS => ['DSS', 'Digital Speech Standard'], + DV => ['DV', 'Digital Video'], + DVB => ['MOV', 'Digital Video Broadcasting'], + 'DVR-MS'=>['ASF', 'Microsoft Digital Video recording'], + DWF => ['DWF', 'Autodesk drawing (Design Web Format)'], + DWG => ['DWG', 'AutoCAD Drawing'], + DYLIB=> ['EXE', 'Mach-O Dynamic Link Library'], + DXF => ['DXF', 'AutoCAD Drawing Exchange Format'], + EIP => ['ZIP', 'Capture One Enhanced Image Package'], + EPS => ['EPS', 'Encapsulated PostScript Format'], + EPS2 => 'EPS', + EPS3 => 'EPS', + EPSF => 'EPS', + EPUB => ['ZIP', 'Electronic Publication'], + ERF => ['TIFF', 'Epson Raw Format'], + EXE => ['EXE', 'Windows executable file'], + EXR => ['EXR', 'Open EXR'], + EXIF => ['EXIF', 'Exchangable Image File Metadata'], + EXV => ['EXV', 'Exiv2 metadata'], + F4A => ['MOV', 'Adobe Flash Player 9+ Audio'], + F4B => ['MOV', 'Adobe Flash Player 9+ audio Book'], + F4P => ['MOV', 'Adobe Flash Player 9+ Protected'], + F4V => ['MOV', 'Adobe Flash Player 9+ Video'], + FFF => [['TIFF','FLIR'], 'Hasselblad Flexible File Format'], + FIT => 'FITS', + FITS => ['FITS', 'Flexible Image Transport System'], + FLAC => ['FLAC', 'Free Lossless Audio Codec'], + FLA => ['FPX', 'Macromedia/Adobe Flash project'], + FLIF => ['FLIF', 'Free Lossless Image Format'], + FLIR => ['FLIR', 'FLIR File Format'], # (not an actual extension) + FLV => ['FLV', 'Flash Video'], + FPF => ['FPF', 'FLIR Public image Format'], + FPX => ['FPX', 'FlashPix'], + GIF => ['GIF', 'Compuserve Graphics Interchange Format'], + GPR => ['TIFF', 'General Purpose RAW'], # https://gopro.github.io/gpr/ + GZ => 'GZIP', + GZIP => ['GZIP', 'GNU ZIP compressed archive'], + HDP => ['TIFF', 'Windows HD Photo'], + HDR => ['HDR', 'Radiance RGBE High Dynamic Range'], + HEIC => ['MOV', 'High Efficiency Image Format still image'], + HEIF => ['MOV', 'High Efficiency Image Format'], + HIF => 'HEIF', + HTM => 'HTML', + HTML => ['HTML', 'HyperText Markup Language'], + ICAL => 'ICS', + ICC => ['ICC', 'International Color Consortium'], + ICM => 'ICC', + ICS => ['VCard','iCalendar Schedule'], + IDML => ['ZIP', 'Adobe InDesign Markup Language'], + IIQ => ['TIFF', 'Phase One Intelligent Image Quality RAW'], + IND => ['IND', 'Adobe InDesign'], + INDD => ['IND', 'Adobe InDesign Document'], + INDT => ['IND', 'Adobe InDesign Template'], + INSV => ['MOV', 'Insta360 Video'], + INSP => ['JPEG', 'Insta360 Picture'], + INX => ['XMP', 'Adobe InDesign Interchange'], + ISO => ['ISO', 'ISO 9660 disk image'], + ITC => ['ITC', 'iTunes Cover Flow'], + J2C => ['JP2', 'JPEG 2000 codestream'], + J2K => 'J2C', + JNG => ['PNG', 'JPG Network Graphics'], + JP2 => ['JP2', 'JPEG 2000 file'], + # JP4? - looks like a JPEG but the image data is different + JPC => 'J2C', + JPE => 'JPEG', + JPEG => ['JPEG', 'Joint Photographic Experts Group'], + JPF => 'JP2', + JPG => 'JPEG', + JPM => ['JP2', 'JPEG 2000 compound image'], + JPS => ['JPEG', 'JPEG Stereo image'], + JPX => ['JP2', 'JPEG 2000 with extensions'], + JSON => ['JSON', 'JavaScript Object Notation'], + JXL => ['JXL', 'JPEG XL'], + JXR => ['TIFF', 'JPEG XR'], + K25 => ['TIFF', 'Kodak DC25 RAW'], + KDC => ['TIFF', 'Kodak Digital Camera RAW'], + KEY => ['ZIP', 'Apple Keynote presentation'], + KTH => ['ZIP', 'Apple Keynote Theme'], + LA => ['RIFF', 'Lossless Audio'], + LFP => ['LFP', 'Lytro Light Field Picture'], + LFR => 'LFP', # (Light Field RAW) + LIF => ['LIF', 'Leica Image File'], + LNK => ['LNK', 'Windows shortcut'], + LRI => ['LRI', 'Light RAW'], + LRV => ['MOV', 'Low-Resolution Video'], + M2T => 'M2TS', + M2TS => ['M2TS', 'MPEG-2 Transport Stream'], + M2V => ['MPEG', 'MPEG-2 Video'], + M4A => ['MOV', 'MPEG-4 Audio'], + M4B => ['MOV', 'MPEG-4 audio Book'], + M4P => ['MOV', 'MPEG-4 Protected'], + M4V => ['MOV', 'MPEG-4 Video'], + MAX => ['FPX', '3D Studio MAX'], + MEF => ['TIFF', 'Mamiya (RAW) Electronic Format'], + MIE => ['MIE', 'Meta Information Encapsulation format'], + MIF => 'MIFF', + MIFF => ['MIFF', 'Magick Image File Format'], + MKA => ['MKV', 'Matroska Audio'], + MKS => ['MKV', 'Matroska Subtitle'], + MKV => ['MKV', 'Matroska Video'], + MNG => ['PNG', 'Multiple-image Network Graphics'], + MOBI => ['PDB', 'Mobipocket electronic book'], + MODD => ['PLIST','Sony Picture Motion metadata'], + MOI => ['MOI', 'MOD Information file'], + MOS => ['TIFF', 'Creo Leaf Mosaic'], + MOV => ['MOV', 'Apple QuickTime movie'], + MP3 => ['MP3', 'MPEG-1 Layer 3 audio'], + MP4 => ['MOV', 'MPEG-4 video'], + MPC => ['MPC', 'Musepack Audio'], + MPEG => ['MPEG', 'MPEG-1 or MPEG-2 audio/video'], + MPG => 'MPEG', + MPO => ['JPEG', 'Extended Multi-Picture format'], + MQV => ['MOV', 'Sony Mobile Quicktime Video'], + MRC => ['MRC', 'Medical Research Council image'], + MRW => ['MRW', 'Minolta RAW format'], + MTS => 'M2TS', + MXF => ['MXF', 'Material Exchange Format'], + # NDPI => ['TIFF', 'Hamamatsu NanoZoomer Digital Pathology Image'], + NEF => ['TIFF', 'Nikon (RAW) Electronic Format'], + NEWER => 'COS', + NKSC => ['XMP', 'Nikon Sidecar'], + + NMBTEMPLATE => ['ZIP','Apple Numbers Template'], + NRW => ['TIFF', 'Nikon RAW (2)'], + NUMBERS => ['ZIP','Apple Numbers spreadsheet'], + O => ['EXE', 'Relocatable Object'], + ODB => ['ZIP', 'Open Document Database'], + ODC => ['ZIP', 'Open Document Chart'], + ODF => ['ZIP', 'Open Document Formula'], + ODG => ['ZIP', 'Open Document Graphics'], + ODI => ['ZIP', 'Open Document Image'], + ODP => ['ZIP', 'Open Document Presentation'], + ODS => ['ZIP', 'Open Document Spreadsheet'], + ODT => ['ZIP', 'Open Document Text file'], + OFR => ['RIFF', 'OptimFROG audio'], + OGG => ['OGG', 'Ogg Vorbis audio file'], + OGV => ['OGG', 'Ogg Video file'], + ONP => ['JSON', 'ON1 Presets'], + OPUS => ['OGG', 'Ogg Opus audio file'], + ORF => ['ORF', 'Olympus RAW format'], + ORI => 'ORF', + OTF => ['Font', 'Open Type Font'], + PAC => ['RIFF', 'Lossless Predictive Audio Compression'], + PAGES => ['ZIP', 'Apple Pages document'], + PBM => ['PPM', 'Portable BitMap'], + PCD => ['PCD', 'Kodak Photo CD Image Pac'], + PCT => 'PICT', + PCX => ['PCX', 'PC Paintbrush'], + PDB => ['PDB', 'Palm Database'], + PDF => ['PDF', 'Adobe Portable Document Format'], + PEF => ['TIFF', 'Pentax (RAW) Electronic Format'], + PFA => ['Font', 'PostScript Font ASCII'], + PFB => ['Font', 'PostScript Font Binary'], + PFM => [['Font','PFM2'], 'Printer Font Metrics'], # (description is overridden for Portable FloatMap images) + PGF => ['PGF', 'Progressive Graphics File'], + PGM => ['PPM', 'Portable Gray Map'], + PHP => ['PHP', 'PHP Hypertext Preprocessor'], + PHP3 => 'PHP', + PHP4 => 'PHP', + PHP5 => 'PHP', + PHPS => 'PHP', + PHTML=> 'PHP', + PICT => ['PICT', 'Apple PICTure'], + PLIST=> ['PLIST','Apple Property List'], + PMP => ['PMP', 'Sony DSC-F1 Cyber-Shot PMP'], # should stand for Proprietery Metadata Package ;) + PNG => ['PNG', 'Portable Network Graphics'], + POT => ['FPX', 'Microsoft PowerPoint Template'], + POTM => [['ZIP','FPX'], 'Office Open XML Presentation Template Macro-enabled'], + POTX => [['ZIP','FPX'], 'Office Open XML Presentation Template'], + PPAM => [['ZIP','FPX'], 'Office Open XML Presentation Addin Macro-enabled'], + PPAX => [['ZIP','FPX'], 'Office Open XML Presentation Addin'], + PPM => ['PPM', 'Portable Pixel Map'], + PPS => ['FPX', 'Microsoft PowerPoint Slideshow'], + PPSM => [['ZIP','FPX'], 'Office Open XML Presentation Slideshow Macro-enabled'], + PPSX => [['ZIP','FPX'], 'Office Open XML Presentation Slideshow'], + PPT => ['FPX', 'Microsoft PowerPoint Presentation'], + PPTM => [['ZIP','FPX'], 'Office Open XML Presentation Macro-enabled'], + PPTX => [['ZIP','FPX'], 'Office Open XML Presentation'], + PRC => ['PDB', 'Palm Database'], + PS => ['PS', 'PostScript'], + PS2 => 'PS', + PS3 => 'PS', + PSB => ['PSD', 'Photoshop Large Document'], + PSD => ['PSD', 'Photoshop Document'], + PSDT => ['PSD', 'Photoshop Document Template'], + PSP => ['PSP', 'Paint Shop Pro'], + PSPFRAME => 'PSP', + PSPIMAGE => 'PSP', + PSPSHAPE => 'PSP', + PSPTUBE => 'PSP', + QIF => 'QTIF', + QT => 'MOV', + QTI => 'QTIF', + QTIF => ['QTIF', 'QuickTime Image File'], + R3D => ['R3D', 'Redcode RAW Video'], + RA => ['Real', 'Real Audio'], + RAF => ['RAF', 'FujiFilm RAW Format'], + RAM => ['Real', 'Real Audio Metafile'], + RAR => ['RAR', 'RAR Archive'], + RAW => [['RAW','TIFF'], 'Kyocera Contax N Digital RAW or Panasonic RAW'], + RIF => 'RIFF', + RIFF => ['RIFF', 'Resource Interchange File Format'], + RM => ['Real', 'Real Media'], + RMVB => ['Real', 'Real Media Variable Bitrate'], + RPM => ['Real', 'Real Media Plug-in Metafile'], + RSRC => ['RSRC', 'Mac OS Resource'], + RTF => ['RTF', 'Rich Text Format'], + RV => ['Real', 'Real Video'], + RW2 => ['TIFF', 'Panasonic RAW 2'], + RWL => ['TIFF', 'Leica RAW'], + RWZ => ['RWZ', 'Rawzor compressed image'], + SEQ => ['FLIR', 'FLIR image Sequence'], + SKETCH => ['ZIP', 'Sketch design file'], + SO => ['EXE', 'Shared Object file'], + SR2 => ['TIFF', 'Sony RAW Format 2'], + SRF => ['TIFF', 'Sony RAW Format'], + SRW => ['TIFF', 'Samsung RAW format'], + SVG => ['XMP', 'Scalable Vector Graphics'], + SWF => ['SWF', 'Shockwave Flash'], + TAR => ['TAR', 'TAR archive'], + THM => ['JPEG', 'Thumbnail'], + THMX => [['ZIP','FPX'], 'Office Open XML Theme'], + TIF => 'TIFF', + TIFF => ['TIFF', 'Tagged Image File Format'], + TORRENT => ['Torrent', 'BitTorrent description file'], + TS => 'M2TS', + TTC => ['Font', 'True Type Font Collection'], + TTF => ['Font', 'True Type Font'], + TUB => 'PSP', + TXT => ['TXT', 'Text file'], + VCARD=> ['VCard','Virtual Card'], + VCF => 'VCARD', + VOB => ['MPEG', 'Video Object'], + VRD => ['VRD', 'Canon VRD Recipe Data'], + VSD => ['FPX', 'Microsoft Visio Drawing'], + WAV => ['RIFF', 'WAVeform (Windows digital audio)'], + WDP => ['TIFF', 'Windows Media Photo'], + WEBM => ['MKV', 'Google Web Movie'], + WEBP => ['RIFF', 'Google Web Picture'], + WMA => ['ASF', 'Windows Media Audio'], + WMF => ['WMF', 'Windows Metafile Format'], + WMV => ['ASF', 'Windows Media Video'], + WV => ['RIFF', 'WavePack lossless audio'], + X3F => ['X3F', 'Sigma RAW format'], + MACOS=> ['MacOS','MacOS ._ sidecar file'], + XCF => ['XCF', 'GIMP native image format'], + XHTML=> ['HTML', 'Extensible HyperText Markup Language'], + XLA => ['FPX', 'Microsoft Excel Add-in'], + XLAM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Add-in Macro-enabled'], + XLS => ['FPX', 'Microsoft Excel Spreadsheet'], + XLSB => [['ZIP','FPX'], 'Office Open XML Spreadsheet Binary'], + XLSM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Macro-enabled'], + XLSX => [['ZIP','FPX'], 'Office Open XML Spreadsheet'], + XLT => ['FPX', 'Microsoft Excel Template'], + XLTM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Template Macro-enabled'], + XLTX => [['ZIP','FPX'], 'Office Open XML Spreadsheet Template'], + XMP => ['XMP', 'Extensible Metadata Platform'], + WOFF => ['Font', 'Web Open Font Format'], + WOFF2=> ['Font', 'Web Open Font Format2'], + WTV => ['WTV', 'Windows recorded TV show'], + ZIP => ['ZIP', 'ZIP archive'], +); + +# typical extension for each file type (if different than FileType) +# - case is not significant +my %fileTypeExt = ( + 'Canon 1D RAW' => 'tif', + DICOM => 'dcm', + FLIR => 'fff', + GZIP => 'gz', + JPEG => 'jpg', + M2TS => 'mts', + MPEG => 'mpg', + TIFF => 'tif', + VCard => 'vcf', +); + +# descriptions for file types not found in above file extension lookup +my %fileDescription = ( + DICOM => 'Digital Imaging and Communications in Medicine', + XML => 'Extensible Markup Language', + 'Win32 EXE' => 'Windows 32-bit Executable', + 'Win32 DLL' => 'Windows 32-bit Dynamic Link Library', + 'Win64 EXE' => 'Windows 64-bit Executable', + 'Win64 DLL' => 'Windows 64-bit Dynamic Link Library', +); + +# MIME types for applicable file types above +# (missing entries default to 'application/unknown', but note that other MIME +# types may be specified by some modules, eg. QuickTime.pm and RIFF.pm) +%mimeType = ( + '3FR' => 'image/x-hasselblad-3fr', + AA => 'audio/audible', + AAE => 'application/vnd.apple.photos', + AI => 'application/vnd.adobe.illustrator', + AIFF => 'audio/x-aiff', + ALIAS=> 'application/x-macos', + APE => 'audio/x-monkeys-audio', + APNG => 'image/apng', + ASF => 'video/x-ms-asf', + ARW => 'image/x-sony-arw', + BMP => 'image/bmp', + BPG => 'image/bpg', + BTF => 'image/x-tiff-big', #(NC) (ref http://www.asmail.be/msg0055371937.html) + BZ2 => 'application/bzip2', + 'Canon 1D RAW' => 'image/x-raw', # (uses .TIF file extension) + CHM => 'application/x-chm', + COS => 'application/octet-stream', #PH (NC) + CR2 => 'image/x-canon-cr2', + CR3 => 'image/x-canon-cr3', + CRM => 'video/x-canon-crm', + CRW => 'image/x-canon-crw', + CSV => 'text/csv', + CZI => 'image/x-zeiss-czi', #PH (NC) + DCP => 'application/octet-stream', #PH (NC) + DCR => 'image/x-kodak-dcr', + DCX => 'image/dcx', + DEX => 'application/octet-stream', + DFONT=> 'application/x-dfont', + DICOM=> 'application/dicom', + DIVX => 'video/divx', + DJVU => 'image/vnd.djvu', + DNG => 'image/x-adobe-dng', + DOC => 'application/msword', + DOCM => 'application/vnd.ms-word.document.macroEnabled.12', + DOCX => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + DOT => 'application/msword', + DOTM => 'application/vnd.ms-word.template.macroEnabledTemplate', + DOTX => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + DPX => 'image/x-dpx', + DR4 => 'application/octet-stream', #PH (NC) + DS2 => 'audio/x-ds2', + DSS => 'audio/x-dss', + DV => 'video/x-dv', + 'DVR-MS' => 'video/x-ms-dvr', + DWF => 'model/vnd.dwf', + DWG => 'image/vnd.dwg', + DXF => 'application/dxf', + EIP => 'application/x-captureone', #(NC) + EPS => 'application/postscript', + ERF => 'image/x-epson-erf', + EXE => 'application/octet-stream', + EXR => 'image/x-exr', + EXV => 'image/x-exv', + FFF => 'image/x-hasselblad-fff', + FITS => 'image/fits', + FLA => 'application/vnd.adobe.fla', + FLAC => 'audio/flac', + FLIF => 'image/flif', + FLIR => 'image/x-flir-fff', #PH (NC) + FLV => 'video/x-flv', + Font => 'application/x-font-type1', # covers PFA, PFB and PFM (not sure about PFM) + FPF => 'image/x-flir-fpf', #PH (NC) + FPX => 'image/vnd.fpx', + GIF => 'image/gif', + GPR => 'image/x-gopro-gpr', + GZIP => 'application/x-gzip', + HDP => 'image/vnd.ms-photo', + HDR => 'image/vnd.radiance', + HTML => 'text/html', + ICC => 'application/vnd.iccprofile', + ICS => 'text/calendar', + IDML => 'application/vnd.adobe.indesign-idml-package', + IIQ => 'image/x-raw', + IND => 'application/x-indesign', + INX => 'application/x-indesign-interchange', #PH (NC) + ISO => 'application/x-iso9660-image', + ITC => 'application/itunes', + J2C => 'image/x-j2c', #PH (NC) + JNG => 'image/jng', + JP2 => 'image/jp2', + JPEG => 'image/jpeg', + JPM => 'image/jpm', + JPS => 'image/x-jps', + JPX => 'image/jpx', + JSON => 'application/json', + JXL => 'image/jxl', #PH (NC) + JXR => 'image/jxr', + K25 => 'image/x-kodak-k25', + KDC => 'image/x-kodak-kdc', + KEY => 'application/x-iwork-keynote-sffkey', + LFP => 'image/x-lytro-lfp', #PH (NC) + LIF => 'image/x-lif', + LNK => 'application/octet-stream', + LRI => 'image/x-light-lri', + M2T => 'video/mpeg', + M2TS => 'video/m2ts', + MAX => 'application/x-3ds', + MEF => 'image/x-mamiya-mef', + MIE => 'application/x-mie', + MIFF => 'application/x-magick-image', + MKA => 'audio/x-matroska', + MKS => 'application/x-matroska', + MKV => 'video/x-matroska', + MNG => 'video/mng', + MOBI => 'application/x-mobipocket-ebook', + MOI => 'application/octet-stream', #PH (NC) + MOS => 'image/x-raw', + MOV => 'video/quicktime', + MP3 => 'audio/mpeg', + MP4 => 'video/mp4', + MPC => 'audio/x-musepack', + MPEG => 'video/mpeg', + MRC => 'image/x-mrc', + MRW => 'image/x-minolta-mrw', + MXF => 'application/mxf', + NEF => 'image/x-nikon-nef', + NKSC => 'application/x-nikon-nxstudio', + NRW => 'image/x-nikon-nrw', + NUMBERS => 'application/x-iwork-numbers-sffnumbers', + ODB => 'application/vnd.oasis.opendocument.database', + ODC => 'application/vnd.oasis.opendocument.chart', + ODF => 'application/vnd.oasis.opendocument.formula', + ODG => 'application/vnd.oasis.opendocument.graphics', + ODI => 'application/vnd.oasis.opendocument.image', + ODP => 'application/vnd.oasis.opendocument.presentation', + ODS => 'application/vnd.oasis.opendocument.spreadsheet', + ODT => 'application/vnd.oasis.opendocument.text', + OGG => 'audio/ogg', + OGV => 'video/ogg', + ONP => 'application/on1', + ORF => 'image/x-olympus-orf', + OTF => 'application/x-font-otf', + PAGES=> 'application/x-iwork-pages-sffpages', + PBM => 'image/x-portable-bitmap', + PCD => 'image/x-photo-cd', + PCX => 'image/pcx', + PDB => 'application/vnd.palm', + PDF => 'application/pdf', + PEF => 'image/x-pentax-pef', + PFA => 'application/x-font-type1', # (needed if handled by PostScript module) + PGF => 'image/pgf', + PGM => 'image/x-portable-graymap', + PHP => 'application/x-httpd-php', + PICT => 'image/pict', + PLIST=> 'application/xml', # (binary PLIST format is 'application/x-plist', recognized at run time) + PMP => 'image/x-sony-pmp', #PH (NC) + PNG => 'image/png', + POT => 'application/vnd.ms-powerpoint', + POTM => 'application/vnd.ms-powerpoint.template.macroEnabled.12', + POTX => 'application/vnd.openxmlformats-officedocument.presentationml.template', + PPAM => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', + PPAX => 'application/vnd.openxmlformats-officedocument.presentationml.addin', # (NC, PH invented) + PPM => 'image/x-portable-pixmap', + PPS => 'application/vnd.ms-powerpoint', + PPSM => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', + PPSX => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + PPT => 'application/vnd.ms-powerpoint', + PPTM => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', + PPTX => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + PS => 'application/postscript', + PSD => 'application/vnd.adobe.photoshop', + PSP => 'image/x-paintshoppro', #(NC) + QTIF => 'image/x-quicktime', + R3D => 'video/x-red-r3d', #PH (invented) + RA => 'audio/x-pn-realaudio', + RAF => 'image/x-fujifilm-raf', + RAM => 'audio/x-pn-realaudio', + RAR => 'application/x-rar-compressed', + RAW => 'image/x-raw', + RM => 'application/vnd.rn-realmedia', + RMVB => 'application/vnd.rn-realmedia-vbr', + RPM => 'audio/x-pn-realaudio-plugin', + RSRC => 'application/ResEdit', + RTF => 'text/rtf', + RV => 'video/vnd.rn-realvideo', + RW2 => 'image/x-panasonic-rw2', + RWL => 'image/x-leica-rwl', + RWZ => 'image/x-rawzor', #(duplicated in Rawzor.pm) + SEQ => 'image/x-flir-seq', #PH (NC) + SKETCH => 'application/sketch', + SR2 => 'image/x-sony-sr2', + SRF => 'image/x-sony-srf', + SRW => 'image/x-samsung-srw', + SVG => 'image/svg+xml', + SWF => 'application/x-shockwave-flash', + TAR => 'application/x-tar', + THMX => 'application/vnd.ms-officetheme', + TIFF => 'image/tiff', + Torrent => 'application/x-bittorrent', + TTC => 'application/x-font-ttf', + TTF => 'application/x-font-ttf', + TXT => 'text/plain', + VCard=> 'text/vcard', + VRD => 'application/octet-stream', #PH (NC) + VSD => 'application/x-visio', + WDP => 'image/vnd.ms-photo', + WEBM => 'video/webm', + WMA => 'audio/x-ms-wma', + WMF => 'application/x-wmf', + WMV => 'video/x-ms-wmv', + WTV => 'video/x-ms-wtv', + X3F => 'image/x-sigma-x3f', + XCF => 'image/x-xcf', + XLA => 'application/vnd.ms-excel', + XLAM => 'application/vnd.ms-excel.addin.macroEnabled.12', + XLS => 'application/vnd.ms-excel', + XLSB => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', + XLSM => 'application/vnd.ms-excel.sheet.macroEnabled.12', + XLSX => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + XLT => 'application/vnd.ms-excel', + XLTM => 'application/vnd.ms-excel.template.macroEnabled.12', + XLTX => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + XML => 'application/xml', + XMP => 'application/rdf+xml', + ZIP => 'application/zip', +); + +# module names for processing routines of each file type +# - undefined entries default to same module name as file type +# - module name '' defaults to Image::ExifTool +# - module name '0' indicates a recognized but unsupported file +my %moduleName = ( + AA => 'Audible', + ALIAS=> 0, + AVC => 0, + BTF => 'BigTIFF', + BZ2 => 0, + CRW => 'CanonRaw', + CHM => 'EXE', + COS => 'CaptureOne', + CZI => 'ZISRAW', + DEX => 0, + DOCX => 'OOXML', + DCX => 0, + DIR => 0, + DR4 => 'CanonVRD', + DSS => 'Olympus', + DWF => 0, + DWG => 0, + DXF => 0, + EPS => 'PostScript', + EXIF => '', + EXR => 'OpenEXR', + EXV => '', + ICC => 'ICC_Profile', + IND => 'InDesign', + FLV => 'Flash', + FPF => 'FLIR', + FPX => 'FlashPix', + GZIP => 'ZIP', + HDR => 'Radiance', + JP2 => 'Jpeg2000', + JPEG => '', + JXL => 'Jpeg2000', + LFP => 'Lytro', + LRI => 0, + MOV => 'QuickTime', + MKV => 'Matroska', + MP3 => 'ID3', + MRW => 'MinoltaRaw', + OGG => 'Ogg', + ORF => 'Olympus', + PDB => 'Palm', + PCD => 'PhotoCD', + PFM2 => 'Other', + PHP => 0, + PMP => 'Sony', + PS => 'PostScript', + PSD => 'Photoshop', + QTIF => 'QuickTime', + R3D => 'Red', + RAF => 'FujiFilm', + RAR => 'ZIP', + RAW => 'KyoceraRaw', + RWZ => 'Rawzor', + SWF => 'Flash', + TAR => 0, + TIFF => '', + TXT => 'Text', + VRD => 'CanonVRD', + WMF => 0, + X3F => 'SigmaRaw', + XCF => 'GIMP', +); + +$testLen = 1024; # number of bytes to read when testing for magic number + +# quick "magic number" file test used to avoid loading module unnecessarily: +# - regular expression evaluated on first $testLen bytes of file +# - must match beginning at first byte in file +# - this test must not be more stringent than module logic +%magicNumber = ( + AA => '.{4}\x57\x90\x75\x36', + AIFF => '(FORM....AIF[FC]|AT&TFORM)', + ALIAS=> "book\0\0\0\0mark\0\0\0\0", + APE => '(MAC |APETAGEX|ID3)', + ASF => '\x30\x26\xb2\x75\x8e\x66\xcf\x11\xa6\xd9\x00\xaa\x00\x62\xce\x6c', + AVC => '\+A\+V\+C\+', + Torrent => 'd\d+:\w+', + BMP => 'BM', + BPG => "BPG\xfb", + BTF => '(II\x2b\0|MM\0\x2b)', + BZ2 => 'BZh[1-9]\x31\x41\x59\x26\x53\x59', + CHM => 'ITSF.{20}\x10\xfd\x01\x7c\xaa\x7b\xd0\x11\x9e\x0c\0\xa0\xc9\x22\xe6\xec', + CRW => '(II|MM).{4}HEAP(CCDR|JPGM)', + CZI => 'ZISRAWFILE\0{6}', + DCX => '\xb1\x68\xde\x3a', + DEX => "dex\n035\0", + DICOM=> '(.{128}DICM|\0[\x02\x04\x06\x08]\0[\0-\x20]|[\x02\x04\x06\x08]\0[\0-\x20]\0)', + DOCX => 'PK\x03\x04', + DPX => '(SDPX|XPDS)', + DR4 => 'IIII\x04\0\x04\0', + DSS => '(\x02dss|\x03ds2)', + DV => '\x1f\x07\0[\x3f\xbf]', # (not tested if extension recognized) + DWF => '\(DWF V\d', + DWG => 'AC10\d{2}\0', + DXF => '\s*0\s+\0?\s*SECTION\s+2\s+HEADER', + EPS => '(%!PS|%!Ad|\xc5\xd0\xd3\xc6)', + EXE => '(MZ|\xca\xfe\xba\xbe|\xfe\xed\xfa[\xce\xcf]|[\xce\xcf]\xfa\xed\xfe|Joy!peff|\x7fELF|#!\s*/\S*bin/|!\x0a)', + EXIF => '(II\x2a\0|MM\0\x2a)', + EXR => '\x76\x2f\x31\x01', + EXV => '\xff\x01Exiv2', + FITS => 'SIMPLE = {20}T', + FLAC => '(fLaC|ID3)', + FLIF => 'FLIF[0-\x6f][0-2]', + FLIR => '[AF]FF\0', + FLV => 'FLV\x01', + Font => '((\0\x01\0\0|OTTO|true|typ1)[\0\x01]|ttcf\0[\x01\x02]\0\0|\0[\x01\x02]|' . + '(.{6})?%!(PS-(AdobeFont-|Bitstream )|FontType1-)|Start(Comp|Master)?FontMetrics|wOF[F2])', + FPF => 'FPF Public Image Format\0', + FPX => '\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1', + GIF => 'GIF8[79]a', + GZIP => '\x1f\x8b\x08', + HDR => '#\?(RADIANCE|RGBE)\x0a', + HTML => '(\xef\xbb\xbf)?\s*(?i)<(!DOCTYPE\s+HTML|HTML|\?xml)', # (case insensitive) + ICC => '.{12}(scnr|mntr|prtr|link|spac|abst|nmcl|nkpf|cenc|mid |mlnk|mvis)(XYZ |Lab |Luv |YCbr|Yxy |RGB |GRAY|HSV |HLS |CMYK|CMY |[2-9A-F]CLR|nc..|\0{4}){2}', + IND => '\x06\x06\xed\xf5\xd8\x1d\x46\xe5\xbd\x31\xef\xe7\xfe\x74\xb7\x1d', + # ISO => signature is at byte 32768 + ITC => '.{4}itch', + JP2 => '(\0\0\0\x0cjP( |\x1a\x1a)\x0d\x0a\x87\x0a|\xff\x4f\xff\x51\0)', + JPEG => '\xff\xd8\xff', + JSON => '(\xef\xbb\xbf)?\s*(\[\s*)?\{\s*"[^"]*"\s*:', + JXL => '\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl ', + LFP => '\x89LFP\x0d\x0a\x1a\x0a', + LIF => '\x70\0{3}.{4}\x2a.{4}<\0', + LNK => '.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46', + LRI => 'LELR \0', + M2TS => '(....)?\x47', + MIE => '~[\x10\x18]\x04.0MIE', + MIFF => 'id=ImageMagick', + MKV => '\x1a\x45\xdf\xa3', + MOV => '.{4}(free|skip|wide|ftyp|pnot|PICT|pict|moov|mdat|junk|uuid)', # (duplicated in WriteQuickTime.pl !!) + # MP3 => difficult to rule out + MPC => '(MP\+|ID3)', + MOI => 'V6', + MPEG => '\0\0\x01[\xb0-\xbf]', + MRC => '.{64}[\x01\x02\x03]\0\0\0[\x01\x02\x03]\0\0\0[\x01\x02\x03]\0\0\0.{132}MAP[\0 ](\x44\x44|\x44\x41|\x11\x11)\0\0', + MRW => '\0MR[MI]', + MXF => '\x06\x0e\x2b\x34\x02\x05\x01\x01\x0d\x01\x02', # (not tested if extension recognized) + OGG => '(OggS|ID3)', + ORF => '(II|MM)', + # PCD => signature is at byte 2048 + PCX => '\x0a[\0-\x05]\x01[\x01\x02\x04\x08].{64}[\0-\x02]', + PDB => '.{60}(\.pdfADBE|TEXtREAd|BVokBDIC|DB99DBOS|PNRdPPrs|DataPPrs|vIMGView|PmDBPmDB|InfoINDB|ToGoToGo|SDocSilX|JbDbJBas|JfDbJFil|DATALSdb|Mdb1Mdb1|BOOKMOBI|DataPlkr|DataSprd|SM01SMem|TEXtTlDc|InfoTlIf|DataTlMl|DataTlPt|dataTDBP|TdatTide|ToRaTRPW|zTXTGPlm|BDOCWrdS)', + PDF => '\s*%PDF-\d+\.\d+', + PFM => 'P[Ff]\x0a\d+ \d+\x0a[-+0-9.]+\x0a', + PGF => 'PGF', + PHP => '<\?php\s', + PICT => '(.{10}|.{522})(\x11\x01|\x00\x11)', + PLIST=> '(bplist0|\s*<|\xfe\xff\x00)', + PMP => '.{8}\0{3}\x7c.{112}\xff\xd8\xff\xdb', + PNG => '(\x89P|\x8aM|\x8bJ)NG\r\n\x1a\n', + PPM => 'P[1-6]\s+', + PS => '(%!PS|%!Ad|\xc5\xd0\xd3\xc6)', + PSD => '8BPS\0[\x01\x02]', + PSP => 'Paint Shop Pro Image File\x0a\x1a\0{5}', + QTIF => '.{4}(idsc|idat|iicc)', + R3D => '\0\0..RED(1|2)', + RAF => 'FUJIFILM', + RAR => 'Rar!\x1a\x07\0', + RAW => '(.{25}ARECOYK|II|MM)', + Real => '(\.RMF|\.ra\xfd|pnm://|rtsp://|http://)', + RIFF => '(RIFF|LA0[234]|OFR |LPAC|wvpk|RF64)', # RIFF plus other variants + RSRC => '(....)?\0\0\x01\0', + RTF => '[\n\r]*\\{[\n\r]*\\\\rtf', + RWZ => 'rawzor', + SWF => '[FC]WS[^\0]', + TAR => '.{257}ustar( )?\0', # (this doesn't catch old-style tar files) + TXT => '(\xff\xfe|(\0\0)?\xfe\xff|(\xef\xbb\xbf)?[\x07-\x0d\x20-\x7e\x80-\xfe]*$)', + TIFF => '(II|MM)', # don't test magic number (some raw formats are different) + VCard=> '(?i)BEGIN:(VCARD|VCALENDAR)\r\n', + VRD => 'CANON OPTIONAL DATA\0', + WMF => '(\xd7\xcd\xc6\x9a\0\0|\x01\0\x09\0\0\x03)', + WTV => '\xb7\xd8\x00\x20\x37\x49\xda\x11\xa6\x4e\x00\x07\xe9\x5e\xad\x8d', + X3F => 'FOVb', + MacOS=> '\0\x05\x16\x07\0.\0\0Mac OS X ', + XCF => 'gimp xcf ', + XMP => '\0{0,3}(\xfe\xff|\xff\xfe|\xef\xbb\xbf)?\0{0,3}\s*<', + ZIP => 'PK\x03\x04', +); + +# file types with weak magic number recognition +my %weakMagic = ( MP3 => 1 ); + +# file types that are determined by the process proc when FastScan == 3 +# (when done, the process proc must exit after SetFileType if FastScan is 3) +my %processType = map { $_ => 1 } qw(JPEG TIFF XMP AIFF EXE Font PS Real VCard TXT); + +# Compact/XMPShorthand option settings +my %compactOpt = ( + nopadding => 'NoPadding', noindent => 'NoIndent', nonewline => 'NoNewline', + shorthand => 'Shorthand', onedesc => 'OneDesc', + all => ['NoPadding','NoIndent','NoNewline','Shorthand','OneDesc'], + allspace => ['NoPadding','NoIndent','NoNewline'], allformat => ['Shorthand','OneDesc'], + # aliases to cover anticipated user typos + nonewlines => 'NoNewline', nospace => 'NoIndent', nospaces => 'NoIndent', + nopad => 'NoPadding', onedescr => 'OneDesc', + # allow numerical settings for backward compatibility + 0 => 'None', + 1 => 'NoPadding', + 2 => ['NoPadding','NoIndent'], + 3 => ['NoPadding','NoIndent','OneDesc'], + 4 => ['NoPadding','NoIndent','OneDesc','NoNewline'], + 5 => ['NoPadding','NoIndent','OneDesc','NoNewline','Shorthand'], +); +my %xmpShorthandOpt = ( 0 => 'None', 1 => 'Shorthand', 2 => ['Shorthand','OneDesc'] ); + +# lookup for valid character set names (keys are all lower case) +%charsetName = ( + # Charset setting alias(es) + # ------------------------- -------------------------------------------- + utf8 => 'UTF8', cp65001 => 'UTF8', 'utf-8' => 'UTF8', + latin => 'Latin', cp1252 => 'Latin', latin1 => 'Latin', + latin2 => 'Latin2', cp1250 => 'Latin2', + cyrillic => 'Cyrillic', cp1251 => 'Cyrillic', russian => 'Cyrillic', + greek => 'Greek', cp1253 => 'Greek', + turkish => 'Turkish', cp1254 => 'Turkish', + hebrew => 'Hebrew', cp1255 => 'Hebrew', + arabic => 'Arabic', cp1256 => 'Arabic', + baltic => 'Baltic', cp1257 => 'Baltic', + vietnam => 'Vietnam', cp1258 => 'Vietnam', + thai => 'Thai', cp874 => 'Thai', + doslatinus => 'DOSLatinUS', cp437 => 'DOSLatinUS', + doslatin1 => 'DOSLatin1', cp850 => 'DOSLatin1', + doscyrillic => 'DOSCyrillic', cp866 => 'DOSCyrillic', + macroman => 'MacRoman', cp10000 => 'MacRoman', mac => 'MacRoman', roman => 'MacRoman', + maclatin2 => 'MacLatin2', cp10029 => 'MacLatin2', + maccyrillic => 'MacCyrillic', cp10007 => 'MacCyrillic', + macgreek => 'MacGreek', cp10006 => 'MacGreek', + macturkish => 'MacTurkish', cp10081 => 'MacTurkish', + macromanian => 'MacRomanian', cp10010 => 'MacRomanian', + maciceland => 'MacIceland', cp10079 => 'MacIceland', + maccroatian => 'MacCroatian', cp10082 => 'MacCroatian', +); + +# default family 0 group priority for writing +# (NOTE: tags in groups not specified here will not be written unless +# overridden by the module or specified when writing) +my @defaultWriteGroups = qw( + EXIF IPTC XMP MakerNotes QuickTime Photoshop ICC_Profile CanonVRD Adobe +); + +# group hash for ExifTool-generated tags +my %allGroupsExifTool = ( 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'ExifTool' ); + +# special tag names (not used for tag info) +%specialTags = map { $_ => 1 } qw( + TABLE_NAME SHORT_NAME PROCESS_PROC WRITE_PROC CHECK_PROC + GROUPS FORMAT FIRST_ENTRY TAG_PREFIX PRINT_CONV + WRITABLE TABLE_DESC NOTES IS_OFFSET IS_SUBDIR + EXTRACT_UNKNOWN NAMESPACE PREFERRED SRC_TABLE PRIORITY + AVOID WRITE_GROUP LANG_INFO VARS DATAMEMBER + SET_GROUP1 PERMANENT INIT_TABLE +); + +# headers for various segment types +$exifAPP1hdr = "Exif\0\0"; +$xmpAPP1hdr = "http://ns.adobe.com/xap/1.0/\0"; +$xmpExtAPP1hdr = "http://ns.adobe.com/xmp/extension/\0"; +$psAPP13hdr = "Photoshop 3.0\0"; +$psAPP13old = 'Adobe_Photoshop2.5:'; + +sub DummyWriteProc { return 1; } + +# lookup for user lenses defined in @Image::ExifTool::UserDefined::Lenses +%Image::ExifTool::userLens = ( ); + +# queued plug-in tags to add to lookup +@Image::ExifTool::pluginTags = ( ); +%Image::ExifTool::pluginTags = ( ); + +my %systemTagsNotes = ( + Notes => q{ + extracted only if specifically requested or the L or L API + option is set + }, +); + +# tag information for preview image -- this should be used for all +# PreviewImage tags so they are handled properly when reading/writing +%Image::ExifTool::previewImageTagInfo = ( + Name => 'PreviewImage', + Writable => 'undef', + # a value of 'none' is ok... + WriteCheck => '$val eq "none" ? undef : $self->CheckImage(\$val)', + DataTag => 'PreviewImage', + # accept either scalar or scalar reference + RawConv => '$self->ValidateImage(ref $val ? $val : \$val, $tag)', + # we allow preview image to be set to '', but we don't want a zero-length value + # in the IFD, so set it temporarily to 'none'. Note that the length is <= 4, + # so this value will fit in the IFD so the preview fixup won't be generated. + ValueConvInv => '$val eq "" and $val="none"; $val', +); + +# extra tags that aren't truly EXIF tags, but are generated by the script +# Note: any tag in this list with a name corresponding to a Group0 name is +# used to write the entire corresponding directory as a block. +%Image::ExifTool::Extra = ( + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + VARS => { NO_ID => 1 }, # tag ID's aren't meaningful for these tags + WRITE_PROC => \&DummyWriteProc, + Error => { + Priority => 0, + Groups => \%allGroupsExifTool, + Notes => q{ + returns errors that may have occurred while reading or writing a file. Any + Error will prevent the file from being processed. Minor errors may be + downgraded to warnings with the -m or L option + }, + }, + Warning => { + Priority => 0, + Groups => \%allGroupsExifTool, + Notes => q{ + returns warnings that may have occurred while reading or writing a file. + Use the -a or L option to see all warnings if more than one + occurred. Minor warnings may be ignored with the -m or L + option. Minor warnings with a capital "M" in the "[Minor]" designation + indicate that the processing is affected by ignoring the warning + }, + }, + Comment => { + Notes => 'comment embedded in JPEG, GIF89a or PPM/PGM/PBM image', + Writable => 1, + WriteGroup => 'Comment', + Priority => 0, # to preserve order of JPEG COM segments + }, + Directory => { + Groups => { 1 => 'System', 2 => 'Other' }, + Notes => q{ + the directory of the file as specified in the call to ExifTool, or "." if no + directory was specified. May be written to move the file to another + directory that will be created if doesn't already exist + }, + Writable => 1, + WritePseudo => 1, + DelCheck => q{"Can't delete"}, + Protected => 1, + RawConv => '$self->ConvertFileName($val)', + # translate backslashes in directory names and add trailing '/' + ValueConvInv => '$_ = $self->InverseFileName($val); m{[^/]$} and $_ .= "/"; $_', + }, + FileName => { + Groups => { 1 => 'System', 2 => 'Other' }, + Writable => 1, + WritePseudo => 1, + DelCheck => q{"Can't delete"}, + Protected => 1, + Notes => q{ + may be written with a full path name to set FileName and Directory in one + operation. This is such a powerful feature that a TestName tag is provided + to allow dry-run tests before actually writing the file name. See + L for more information on writing the + FileName, Directory and TestName tags + }, + RawConv => '$self->ConvertFileName($val)', + ValueConvInv => '$self->InverseFileName($val)', + }, + BaseName => { + Groups => { 1 => 'System', 2 => 'Other' }, + Notes => q{ + file name without extension. Not generated unless specifically requested or + the API L option is set + }, + }, + FilePath => { + Groups => { 1 => 'System', 2 => 'Other' }, + Notes => q{ + absolute path of source file. Not generated unless specifically requested or + the API L option is set. Does not support Windows Unicode file + names + }, + }, + TestName => { + Writable => 1, + WritePseudo => 1, + DelCheck => q{"Can't delete"}, + Protected => 1, + WriteOnly => 1, + Notes => q{ + this write-only tag may be used instead of FileName for dry-run tests of the + file renaming feature. Writing this tag prints the old and new file names + to the console, but does not affect the file itself + }, + ValueConvInv => '$self->InverseFileName($val)', + }, + FileSequence => { + Groups => { 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'Other' }, + Notes => q{ + sequence number for each source file when extracting or copying information, + including files that fail the -if condition of the command-line application, + beginning at 0 for the first file. Not generated unless specifically + requested or the API L option is set + }, + }, + FileSize => { + Groups => { 1 => 'System', 2 => 'Other' }, + Notes => q{ + note that the print conversion for this tag uses historic prefixes: 1 kB = + 1024 bytes, etc. + }, + PrintConv => \&ConvertFileSize, + }, + ResourceForkSize => { + Groups => { 1 => 'System', 2 => 'Other' }, + Notes => q{ + size of the file's resource fork if it contains data. Mac OS only. If this + tag is generated the L option may be used to extract + resource-fork information as a sub-document. When writing, the resource + fork is preserved by default, but it may be deleted with C<-rsrc:all=> on + the command line + }, + PrintConv => \&ConvertFileSize, + }, + ZoneIdentifier => { + Groups => { 1 => 'System', 2 => 'Other' }, + Notes => q{ + Windows only. Existence indicates that the file has a Zone.Identifier + alternate data stream, which is used by some Windows browsers to mark + downloaded files as possibly unsafe to run. May be deleted to remove this + stream. Requires Win32API::File + }, + Writable => 1, + WritePseudo => 1, + Protected => 1, + }, + FileType => { + Groups => { 2 => 'Other' }, + Notes => q{ + a short description of the file type. For many file types this is the just + the uppercase file extension + }, + }, + FileTypeExtension => { + Groups => { 2 => 'Other' }, + Notes => q{ + a common lowercase extension for this file type, or uppercase with the -n + option + }, + PrintConv => 'lc $val', + }, + FileModifyDate => { + Description => 'File Modification Date/Time', + Notes => q{ + the filesystem modification date/time. Note that ExifTool may not be able + to handle filesystem dates before 1970 depending on the limitations of the + system's standard libraries + }, + Groups => { 1 => 'System', 2 => 'Time' }, + Writable => 1, + WritePseudo => 1, + DelCheck => q{"Can't delete"}, + # all writable pseudo-tags must be protected so -tagsfromfile fails with + # unrecognized files unless a pseudo tag is specified explicitly + Protected => 1, + Shift => 'Time', + ValueConv => 'ConvertUnixTime($val,1)', + ValueConvInv => 'GetUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + FileAccessDate => { + Description => 'File Access Date/Time', + Notes => q{ + the date/time of last access of the file. Note that this access time is + updated whenever any software, including ExifTool, reads the file + }, + Groups => { 1 => 'System', 2 => 'Time' }, + ValueConv => 'ConvertUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + FileCreateDate => { + Description => 'File Creation Date/Time', + Notes => q{ + the filesystem creation date/time. Windows/Mac only. In Windows, the file + creation date/time is preserved by default when writing if Win32API::File + and Win32::API are available. On Mac, this tag is extracted only if it or + the MacOS group is specifically requested or the API L option is + set to 2 or higher. Requires "setfile" for writing on Mac, which may be + installed by typing C in the Terminal + }, + Groups => { 1 => 'System', 2 => 'Time' }, + Writable => 1, + WritePseudo => 1, + DelCheck => q{"Can't delete"}, + Protected => 1, # all writable pseudo-tags must be protected! + Shift => 'Time', + ValueConv => '$^O eq "darwin" ? $val : ConvertUnixTime($val,1)', + ValueConvInv => q{ + return GetUnixTime($val,1) if $^O eq 'MSWin32'; + return $val if $^O eq 'darwin'; + warn "This tag is Windows/Mac only\n"; + return undef; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + FileInodeChangeDate => { + Description => 'File Inode Change Date/Time', + Notes => q{ + the date/time when the file's directory information was last changed. + Non-Windows systems only + }, + Groups => { 1 => 'System', 2 => 'Time' }, + ValueConv => 'ConvertUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + FilePermissions => { + Groups => { 1 => 'System', 2 => 'Other' }, + Notes => q{ + r=read, w=write and x=execute permissions for the file owner, group and + others. The ValueConv value is an octal number so bit test operations on + this value should be done in octal, eg. 'oct($filePermissions#) & 0200' + }, + Writable => 1, + WritePseudo => 1, + DelCheck => q{"Can't delete"}, + Protected => 1, # all writable pseudo-tags must be protected! + ValueConv => 'sprintf("%.3o", $val)', + ValueConvInv => 'oct($val & 07777)', + PrintConv => sub { + my ($mask, $val) = (0400, oct(shift)); + my %types = ( + 0010000 => 'p', + 0020000 => 'c', + 0040000 => 'd', + 0060000 => 'b', + 0120000 => 'l', + 0140000 => 's', + ); + my $str = $types{$val & 0170000} || '-'; + while ($mask) { + foreach (qw(r w x)) { + $str .= $val & $mask ? $_ : '-'; + $mask >>= 1; + } + } + return $str; + }, + PrintConvInv => sub { + my ($bit, $val, $str) = (8, 0, shift); + $str = substr($str, 1) if length($str) == 10; + return undef if length($str) != 9; + while ($bit >= 0) { + foreach (qw(r w x)) { + $val |= (1 << $bit) if substr($str, 8-$bit, 1) eq $_; + --$bit; + } + } + return sprintf('%.3o', $val); + }, + }, + FileAttributes => { + Groups => { 1 => 'System', 2 => 'Other' }, + Notes => q{ + extracted only if specifically requested or the L or L API + option is set. 2 or 3 values: 0. File type, 1. Attribute bits, 2. Windows + attribute bits if Win32API::File is available + }, + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => [{ # stat device types (bitmask 0xf000) + 0x0000 => 'Unknown', + 0x1000 => 'FIFO', + 0x2000 => 'Character', + 0x3000 => 'Mux Character', + 0x4000 => 'Directory', + 0x5000 => 'XENIX Named', + 0x6000 => 'Block', + 0x7000 => 'Mux Block', + 0x8000 => 'Regular', + 0x9000 => 'VxFS Compressed', + 0xa000 => 'Symbolic Link', + 0xb000 => 'Solaris Shadow Inode', + 0xc000 => 'Socket', + 0xd000 => 'Solaris Door', + 0xe000 => 'BSD Whiteout', + },{ BITMASK => { # stat attribute bits (bitmask 0x0e00) + 9 => 'Sticky', + 10 => 'Set Group ID', + 11 => 'Set User ID', + }},{ BITMASK => { # Windows attribute bits + 0 => 'Read Only', + 1 => 'Hidden', + 2 => 'System', + 3 => 'Volume Label', + 4 => 'Directory', + 5 => 'Archive', + 6 => 'Device', + 7 => 'Normal', + 8 => 'Temporary', + 9 => 'Sparse File', + 10 => 'Reparse Point', + 11 => 'Compressed', + 12 => 'Offline', + 13 => 'Not Content Indexed', + 14 => 'Encrypted', + }}], + }, + FileDeviceID => { + Groups => { 1 => 'System', 2 => 'Other' }, + %systemTagsNotes, + PrintConv => '(($val >> 24) & 0xff) . "." . ($val & 0xffffff)', # (major.minor) + }, + FileDeviceNumber => { Groups => { 1 => 'System', 2 => 'Other' }, %systemTagsNotes }, + FileInodeNumber => { Groups => { 1 => 'System', 2 => 'Other' }, %systemTagsNotes }, + FileHardLinks => { Groups => { 1 => 'System', 2 => 'Other' }, %systemTagsNotes }, + FileUserID => { + Groups => { 1 => 'System', 2 => 'Other' }, + Notes => q{ + extracted only if specifically requested or the L or L API + option is set. Returns user ID number with the -n option, or name + otherwise. May be written with either user name or number + }, + Writable => 1, + WritePseudo => 1, + DelCheck => q{"Can't delete"}, + Protected => 1, # all writable pseudo-tags must be protected! + PrintConv => 'eval { getpwuid($val) } || $val', + PrintConvInv => 'eval { getpwnam($val) } || ($val=~/[^0-9]/ ? undef : $val)', + }, + FileGroupID => { + Groups => { 1 => 'System', 2 => 'Other' }, + Notes => q{ + extracted only if specifically requested or the L or L API + option is set. Returns group ID number with the -n option, or name + otherwise. May be written with either group name or number + }, + Writable => 1, + WritePseudo => 1, + DelCheck => q{"Can't delete"}, + Protected => 1, # all writable pseudo-tags must be protected! + PrintConv => 'eval { getgrgid($val) } || $val', + PrintConvInv => 'eval { getgrnam($val) } || ($val=~/[^0-9]/ ? undef : $val)', + }, + FileBlockSize => { Groups => { 1 => 'System', 2 => 'Other' }, %systemTagsNotes }, + FileBlockCount => { Groups => { 1 => 'System', 2 => 'Other' }, %systemTagsNotes }, + HardLink => { + Writable => 1, + DelCheck => q{"Can't delete"}, + WriteOnly => 1, + WritePseudo => 1, + Protected => 1, + Notes => q{ + this write-only tag is used to create a hard link with the specified name to + the source file. If the source file is edited, copied, renamed or moved in + the same operation as writing HardLink, then the link is made to the updated + file. Note that subsequent editing of either hard-linked file by exiftool + will break the link unless the -overwrite_original_in_place option is used + }, + ValueConvInv => '$val=~tr/\\\\/\//; $val', + }, + SymLink => { + Writable => 1, + DelCheck => q{"Can't delete"}, + WriteOnly => 1, + WritePseudo => 1, + Protected => 1, + Notes => q{ + this write-only tag is used to create a symbolic link with the specified + name to the source file. If the source file is edited, copied, renamed or + moved in the same operation as writing SymLink, then the link is made to the + updated file. The link uses an absolute path unless it is created in the + current working directory. Valid only for file systems that support + symbolic links. Note that subsequent editing of the file via the symbolic + link by exiftool will cause the link to be replaced by the edited file + without changing the original unless the -overwrite_original_in_place option + is used + }, + ValueConvInv => '$val=~tr/\\\\/\//; $val', + }, + MIMEType => { Notes => 'the MIME type of the source file', Groups => { 2 => 'Other' } }, + ImageWidth => { Notes => 'the width of the image in number of pixels' }, + ImageHeight => { Notes => 'the height of the image in number of pixels' }, + XResolution => { Notes => 'the horizontal pixel resolution' }, + YResolution => { Notes => 'the vertical pixel resolution' }, + MaxVal => { Notes => 'maximum pixel value in PPM or PGM image' }, + EXIF => { + Notes => q{ + the full EXIF data block from JPEG, PNG, JP2, MIE and MIFF images. This tag + is generated only if specifically requested + }, + Groups => { 0 => 'EXIF', 1 => 'EXIF' }, + Flags => ['Writable' ,'Protected', 'Binary', 'DelGroup'], + WriteCheck => q{ + return undef if $val =~ /^(II\x2a\0|MM\0\x2a)/; + return 'Invalid EXIF data'; + }, + }, + IPTC => { + Notes => q{ + the full IPTC data block. This tag is generated only if specifically + requested + }, + Groups => { 0 => 'IPTC', 1 => 'IPTC' }, + Flags => ['Writable', 'Protected', 'Binary', 'DelGroup'], + Priority => 0, # so main IPTC (which hopefully comes first) takes priority + WriteCheck => q{ + return undef if $val =~ /^(\x1c|\0+$)/; + return 'Invalid IPTC data'; + }, + }, + XMP => { + Notes => q{ + the XMP data block, but note that extended XMP in JPEG images may be split + into multiple blocks. This tag is generated only if specifically requested + }, + Groups => { 0 => 'XMP', 1 => 'XMP' }, + Flags => ['Writable', 'Protected', 'Binary', 'DelGroup'], + Priority => 0, # so main xmp (which usually comes first) takes priority + WriteCheck => q{ + require Image::ExifTool::XMP; + return Image::ExifTool::XMP::CheckXMP($self, $tagInfo, \$val); + }, + }, + XML => { + Notes => 'the XML data block, extracted for some file types', + Groups => { 0 => 'XML', 1 => 'XML' }, + Binary => 1, + }, + ICC_Profile => { + Notes => q{ + the full ICC_Profile data block. This tag is generated only if specifically + requested + }, + Groups => { 0 => 'ICC_Profile', 1 => 'ICC_Profile' }, + Flags => ['Writable' ,'Protected', 'Binary', 'DelGroup'], + WriteCheck => q{ + require Image::ExifTool::ICC_Profile; + return Image::ExifTool::ICC_Profile::ValidateICC(\$val); + }, + }, + CanonVRD => { + Notes => q{ + the full Canon DPP VRD trailer block. This tag is generated only if + specifically requested + }, + Groups => { 0 => 'CanonVRD', 1 => 'CanonVRD' }, + Flags => ['Writable' ,'Protected', 'Binary', 'DelGroup'], + Permanent => 0, # (this is 1 by default for MakerNotes tags) + WriteCheck => q{ + return undef if $val =~ /^CANON OPTIONAL DATA\0/; + return 'Invalid CanonVRD data'; + }, + }, + CanonDR4 => { + Notes => q{ + the full Canon DPP version 4 DR4 block. This tag is generated only if + specifically requested + }, + Groups => { 0 => 'CanonVRD', 1 => 'CanonVRD' }, + Flags => ['Writable' ,'Protected', 'Binary'], + Permanent => 0, # (this is 1 by default for MakerNotes tags) + WriteCheck => q{ + return undef if $val =~ /^IIII\x04\0\x04\0/; + return 'Invalid CanonDR4 data'; + }, + }, + Adobe => { + Notes => q{ + the JPEG APP14 Adobe segment. Extracted only if specified. See the + L for more information + }, + Groups => { 0 => 'APP14', 1 => 'Adobe' }, + WriteGroup => 'Adobe', + Flags => ['Writable' ,'Protected', 'Binary'], + }, + CurrentIPTCDigest => { + Notes => q{ + MD5 digest of existing IPTC data. All zeros if IPTC exists but Digest::MD5 + is not installed. Only calculated for IPTC in the standard location as + specified by the L. ExifTool + automates the handling of this tag in the MWG module -- see the + L for details + }, + ValueConv => 'unpack("H*", $val)', + }, + PreviewImage => { + Notes => 'JPEG-format embedded preview image', + Groups => { 2 => 'Preview' }, + Writable => 1, + WriteCheck => '$self->CheckImage(\$val)', + WriteGroup => 'All', + # can't delete, so set to empty string and return no error + DelCheck => '$val = ""; return undef', + # accept either scalar or scalar reference + RawConv => '$self->ValidateImage(ref $val ? $val : \$val, $tag)', + }, + ThumbnailImage => { + Groups => { 2 => 'Preview' }, + Notes => 'JPEG-format embedded thumbnail image', + RawConv => '$self->ValidateImage(ref $val ? $val : \$val, $tag)', + }, + OtherImage => { + Groups => { 2 => 'Preview' }, + Notes => 'other JPEG-format embedded image', + RawConv => '$self->ValidateImage(ref $val ? $val : \$val, $tag)', + }, + PreviewPNG => { + Groups => { 2 => 'Preview' }, + Notes => 'PNG-format embedded preview image', + Binary => 1, + }, + PreviewWMF => { + Groups => { 2 => 'Preview' }, + Notes => 'WMF-format embedded preview image', + Binary => 1, + }, + PreviewTIFF => { + Groups => { 2 => 'Preview' }, + Notes => 'TIFF-format embedded preview image', + Binary => 1, + }, + PreviewPDF => { + Groups => { 2 => 'Preview' }, + Notes => 'PDF-format embedded preview image', + Binary => 1, + }, + ExifByteOrder => { + Writable => 1, + DelCheck => q{"Can't delete"}, + Notes => q{ + represents the byte order of EXIF information. May be written to set the + byte order only for newly created EXIF segments + }, + PrintConv => { + II => 'Little-endian (Intel, II)', + MM => 'Big-endian (Motorola, MM)', + }, + }, + ExifUnicodeByteOrder => { + Writable => 1, + WriteOnly => 1, + DelCheck => q{"Can't delete"}, + Notes => q{ + specifies the byte order to use when writing EXIF Unicode text. The EXIF + specification is particularly vague about this byte ordering, and different + applications use different conventions. By default ExifTool writes Unicode + text in EXIF byte order, but this write-only tag may be used to force a + specific order. Applies to the EXIF UserComment tag when writing special + characters + }, + PrintConv => { + II => 'Little-endian (Intel, II)', + MM => 'Big-endian (Motorola, MM)', + }, + }, + ExifToolVersion => { + Description => 'ExifTool Version Number', + Groups => \%allGroupsExifTool, + Notes => 'the version of ExifTool currently running', + }, + ProcessingTime => { + Groups => { 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'Other' }, + Notes => q{ + the clock time in seconds taken by ExifTool to extract information from this + file. Not generated unless specifically requested or the L API + option is set. Requires Time::HiRes + }, + PrintConv => 'sprintf("%.3g s", $val)', + }, + RAFVersion => { Notes => 'RAF file version number' }, + JPEGDigest => { + Notes => q{ + an MD5 digest of the JPEG quantization tables is combined with the component + sub-sampling values to generate the value of this tag. The result is + compared to known values in an attempt to deduce the originating software + based only on the JPEG image data. For performance reasons, this tag is + generated only if specifically requested or the API L option is set + to 3 or higher + }, + }, + JPEGQualityEstimate => { + Notes => q{ + an estimate of the IJG JPEG quality setting for the image, calculated from + the quantization tables. For performance reasons, this tag is generated + only if specifically requested or the API L option is set to 3 or + higher + }, + }, + JPEGImageLength => { + Notes => q{ + byte length of JPEG image without metadata. For performance reasons, this + tag is generated only if specifically requested or the API L option + is set to 3 or higher + }, + }, + # Validate (added from Validate.pm) + Now => { + Groups => { 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'Time' }, + Notes => q{ + the current date/time. Useful when setting the tag values, eg. + C<"-modifydate. Not generated unless specifically requested or the + API L option is set + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + NewGUID => { + Groups => { 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'Other' }, + Notes => q{ + generates a new, random GUID with format + YYYYmmdd-HHMM-SSNN-PPPP-RRRRRRRRRRRR, where Y=year, m=month, d=day, H=hour, + M=minute, S=second, N=file sequence number in hex, P=process ID in hex, and + R=random hex number; without dashes with the -n option. Not generated + unless specifically requested or the API L option is set + }, + PrintConv => '$val =~ s/(.{8})(.{4})(.{4})(.{4})/$1-$2-$3-$4-/; $val', + }, + ID3Size => { Notes => 'size of the ID3 data block' }, + Geotag => { + Writable => 1, + WriteOnly => 1, + WriteNothing => 1, + AllowGroup => '(exif|gps|xmp|xmp-exif)', + Notes => q{ + this write-only tag is used to define the GPS track log data or track log + file name. Currently supported track log formats are GPX, NMEA RMC/GGA/GLL, + KML, IGC, Garmin XML and TCX, Magellan PMGNTRK, Honeywell PTNTHPR, Winplus + Beacon text, and Bramor gEO log files. May be set to the special value of + "DATETIMEONLY" (all caps) to set GPS date/time tags if no input track points + are available. See L for details + }, + DelCheck => q{ + require Image::ExifTool::Geotag; + # delete associated tags + Image::ExifTool::Geotag::SetGeoValues($self, undef, $wantGroup); + }, + ValueConvInv => q{ + require Image::ExifTool::Geotag; + # always warn because this tag is never set (warning is "\n" on success) + my $result = Image::ExifTool::Geotag::LoadTrackLog($self, $val); + return '' if not defined $result; # deleting geo tags + return $result if ref $result; # geotag data hash reference + warn "$result\n"; # error string + }, + }, + Geotime => { + Writable => 1, + WriteOnly => 1, + AllowGroup => '(exif|gps|xmp|xmp-exif)', + Notes => q{ + this write-only tag is used to define a date/time for interpolating a + position in the GPS track specified by the Geotag tag. Writing this tag + causes GPS information to be written into the EXIF or XMP of the target + files. The local system timezone is assumed if the date/time value does not + contain a timezone. May be deleted to delete associated GPS tags. A group + name of "EXIF" or "XMP" may be specified to write or delete only EXIF or XMP + GPS tags + }, + DelCheck => q{ + require Image::ExifTool::Geotag; + # delete associated tags + Image::ExifTool::Geotag::SetGeoValues($self, undef, $wantGroup); + }, + ValueConvInv => q{ + require Image::ExifTool::Geotag; + warn Image::ExifTool::Geotag::SetGeoValues($self, $val, $wantGroup) . "\n"; + return undef; + }, + }, + Geosync => { + Writable => 1, + WriteOnly => 1, + WriteNothing => 1, + AllowGroup => '(exif|gps|xmp|xmp-exif)', + Shift => 'Time', # enables "+=" syntax as well as "=+" + Notes => q{ + this write-only tag specifies a time difference to add to Geotime for + synchronization with the GPS clock. For example, set this to "-12" if the + camera clock is 12 seconds faster than GPS time. Input format is + "[+-][[[DD ]HH:]MM:]SS[.ss]". Additional features allow calculation of time + differences and time drifts, and extraction of synchronization times from + image files. See the L for details + }, + ValueConvInv => q{ + require Image::ExifTool::Geotag; + return Image::ExifTool::Geotag::ConvertGeosync($self, $val); + }, + }, + ForceWrite => { + Groups => { 0 => '*', 1 => '*', 2 => '*' }, + Writable => 1, + WriteOnly => 1, + Notes => q{ + write-only tag used to force metadata in a file to be rewritten even if no + tag values are changed. May be set to "EXIF", "IPTC", "XMP" or "PNG" to + force the corresponding metadata type to be rewritten, "FixBase" to cause + EXIF to be rewritten only if the MakerNotes offset base was fixed, or "All" + to rewrite all of these metadata types. Values are case insensitive, and + multiple values may be separated with commas, eg. C<-ForceWrite=exif,xmp> + }, + }, + EmbeddedVideo => { Groups => { 0 => 'Trailer', 2 => 'Video' } }, + Trailer => { + Groups => { 0 => 'Trailer' }, + Notes => q{ + the full JPEG trailer data block. Extracted only if specifically requested + or the API RequestAll option is set to 3 or higher + }, + Writable => 1, + Protected => 1, + }, + PageCount => { Notes => 'the number of pages in a multi-page TIFF document' }, +); + +# tags defined by UserParam option (added at runtime) +%Image::ExifTool::UserParam = ( + GROUPS => { 0 => 'UserParam', 1 => 'UserParam', 2 => 'Other' }, + PRIORITY => 0, +); + +# YCbCrSubSampling values (used by JPEG SOF, EXIF and XMP) +%Image::ExifTool::JPEG::yCbCrSubSampling = ( + '1 1' => 'YCbCr4:4:4 (1 1)', #PH + '2 1' => 'YCbCr4:2:2 (2 1)', #14 in Exif.pm + '2 2' => 'YCbCr4:2:0 (2 2)', #14 in Exif.pm + '4 1' => 'YCbCr4:1:1 (4 1)', #14 in Exif.pm + '4 2' => 'YCbCr4:1:0 (4 2)', #PH + '1 2' => 'YCbCr4:4:0 (1 2)', #PH + '1 4' => 'YCbCr4:4:1 (1 4)', #JD + '2 4' => 'YCbCr4:2:1 (2 4)', #JD +); + +# define common JPEG segments here to avoid overhead of loading JPEG module + +# JPEG SOF (start of frame) tags +# (ref http://www.w3.org/Graphics/JPEG/itu-t81.pdf) +%Image::ExifTool::JPEG::SOF = ( + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + NOTES => 'This information is extracted from the JPEG Start Of Frame segment.', + VARS => { NO_ID => 1 }, # tag ID's aren't meaningful for these tags + EncodingProcess => { + PrintHex => 1, + PrintConv => { + 0x0 => 'Baseline DCT, Huffman coding', + 0x1 => 'Extended sequential DCT, Huffman coding', + 0x2 => 'Progressive DCT, Huffman coding', + 0x3 => 'Lossless, Huffman coding', + 0x5 => 'Sequential DCT, differential Huffman coding', + 0x6 => 'Progressive DCT, differential Huffman coding', + 0x7 => 'Lossless, Differential Huffman coding', + 0x9 => 'Extended sequential DCT, arithmetic coding', + 0xa => 'Progressive DCT, arithmetic coding', + 0xb => 'Lossless, arithmetic coding', + 0xd => 'Sequential DCT, differential arithmetic coding', + 0xe => 'Progressive DCT, differential arithmetic coding', + 0xf => 'Lossless, differential arithmetic coding', + } + }, + BitsPerSample => { }, + ImageHeight => { }, + ImageWidth => { }, + ColorComponents => { }, + YCbCrSubSampling => { + Notes => 'calculated from components table', + PrintConv => \%Image::ExifTool::JPEG::yCbCrSubSampling, + }, +); + +# JPEG JFIF APP0 definitions +%Image::ExifTool::JFIF::Main = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'JFIF', 1 => 'JFIF', 2 => 'Image' }, + DATAMEMBER => [ 2, 3, 5 ], + 0 => { + Name => 'JFIFVersion', + Format => 'int8u[2]', + PrintConv => 'sprintf("%d.%.2d", split(" ",$val))', + Mandatory => 1, + }, + 2 => { + Name => 'ResolutionUnit', + Writable => 1, + RawConv => '$$self{JFIFResolutionUnit} = $val', + PrintConv => { + 0 => 'None', + 1 => 'inches', + 2 => 'cm', + }, + Priority => -1, + Mandatory => 1, + }, + 3 => { + Name => 'XResolution', + Format => 'int16u', + Writable => 1, + Priority => -1, + RawConv => '$$self{JFIFXResolution} = $val', + Mandatory => 1, + }, + 5 => { + Name => 'YResolution', + Format => 'int16u', + Writable => 1, + Priority => -1, + RawConv => '$$self{JFIFYResolution} = $val', + Mandatory => 1, + }, + 7 => { + Name => 'ThumbnailWidth', + RawConv => '$val ? $$self{JFIFThumbnailWidth} = $val : undef', + }, + 8 => { + Name => 'ThumbnailHeight', + RawConv => '$val ? $$self{JFIFThumbnailHeight} = $val : undef', + }, + 9 => { + Name => 'ThumbnailTIFF', + Groups => { 2 => 'Preview' }, + Format => 'undef[3*($val{7}||0)*($val{8}||0)]', + Notes => 'raw RGB thumbnail data, extracted as a TIFF image', + RawConv => 'length($val) ? $val : undef', + ValueConv => sub { + my ($val, $et) = @_; + my $len = length $val; + return \ "Binary data $len bytes" unless $et->Options('Binary'); + my $img = MakeTiffHeader($$et{JFIFThumbnailWidth},$$et{JFIFThumbnailHeight},3,8) . $val; + return \$img; + }, + }, +); +%Image::ExifTool::JFIF::Extension = ( + GROUPS => { 0 => 'JFIF', 1 => 'JFXX', 2 => 'Image' }, + NOTES => 'Thumbnail images extracted from the JFXX segment.', + 0x10 => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Notes => 'JPEG-format thumbnail image', + RawConv => '$self->ValidateImage(\$val,$tag)', + }, + 0x11 => { # (untested) + Name => 'ThumbnailTIFF', + Groups => { 2 => 'Preview' }, + Notes => 'raw palette-color thumbnail data, extracted as a TIFF image', + RawConv => '(length $val > 770 and $val !~ /^\0\0/) ? $val : undef', + ValueConv => sub { + my ($val, $et) = @_; + my $len = length $val; + return \ "Binary data $len bytes" unless $et->Options('Binary'); + my ($w, $h) = unpack('CC', $val); + my $img = MakeTiffHeader($w,$h,1,8,undef,substr($val,2,768)) . substr($val,770); + return \$img; + }, + }, + 0x13 => { + Name => 'ThumbnailTIFF', + Groups => { 2 => 'Preview' }, + Notes => 'raw RGB thumbnail data, extracted as a TIFF image', + RawConv => '(length $val > 2 and $val !~ /^\0\0/) ? $val : undef', + ValueConv => sub { + my ($val, $et) = @_; + my $len = length $val; + return \ "Binary data $len bytes" unless $et->Options('Binary'); + my ($w, $h) = unpack('CC', $val); + my $img = MakeTiffHeader($w,$h,3,8) . substr($val,2); + return \$img; + }, + }, + # Apple may add "AMPF" to the end of the JFIF record, + # possibly indicating the existence of MPF images (ref forum12677) +); + +# Composite tags (accumulation of all Composite tag tables) +%Image::ExifTool::Composite = ( + GROUPS => { 0 => 'Composite', 1 => 'Composite' }, + TABLE_NAME => 'Image::ExifTool::Composite', + SHORT_NAME => 'Composite', + VARS => { NO_ID => 1 }, # want empty tagID's for Composite tags + WRITE_PROC => \&DummyWriteProc, +); + +my %compositeID; # lookup for new ID's of Composite tags based on original ID + +# static private ExifTool variables + +%allTables = ( ); # list of all tables loaded (except Composite tags) +@tableOrder = ( ); # order the tables were loaded + +#------------------------------------------------------------------------------ +# Warning handler routines (warning string stored in $evalWarning) +# +# Set warning message +# Inputs: 0) warning string (undef to reset warning) +sub SetWarning($) { $evalWarning = $_[0]; } + +# Get warning message +sub GetWarning() { return $evalWarning; } + +# Clean unnecessary information (line number, LF) from warning +# Inputs: 0) warning string or undef to use $evalWarning +# Returns: cleaned warning +sub CleanWarning(;$) +{ + my $str = shift; + unless (defined $str) { + return undef unless defined $evalWarning; + $str = $evalWarning; + } + $str = $1 if $str =~ /(.*) at /s; + $str =~ s/\s+$//s; + return $str; +} + +#============================================================================== +# New - create new ExifTool object +# Inputs: 0) reference to exiftool object or ExifTool class name +# Returns: blessed ExifTool object ref +sub new +{ + local $_; + my $that = shift; + my $class = ref($that) || $that || 'Image::ExifTool'; + my $self = bless {}, $class; + + # make sure our main Exif tag table has been loaded + GetTagTable("Image::ExifTool::Exif::Main"); + + $self->ClearOptions(); # create default options hash + $$self{VALUE} = { }; # must initialize this for warning messages + $$self{PATH} = [ ]; # (this too) + $$self{DEL_GROUP} = { }; # lookup for groups to delete when writing + $$self{SAVE_COUNT} = 0; # count calls to SaveNewValues() + $$self{FILE_SEQUENCE} = 0; # sequence number for files when reading + + # initialize our new groups for writing + $self->SetNewGroups(@defaultWriteGroups); + + return $self; +} + +#------------------------------------------------------------------------------ +# ImageInfo - return specified information from image file +# Inputs: 0) [optional] ExifTool object reference +# 1) filename, file reference, or scalar data reference +# 2-N) list of tag names to find (or tag list reference or options reference) +# Returns: reference to hash of tag/value pairs (with "Error" entry on error) +# Notes: +# - if no tags names are specified, the values of all tags are returned +# - tags may be specified with leading '-' to exclude, or trailing '#' for ValueConv +# - can pass a reference to list of tags to find, in which case the list will +# be updated with the tags found in the proper case and in the specified order. +# - can pass reference to hash specifying options +# - returned tag values may be scalar references indicating binary data +# - see ClearOptions() below for a list of options and their default values +# Examples: +# use Image::ExifTool 'ImageInfo'; +# my $info = ImageInfo($file, 'DateTimeOriginal', 'ImageSize'); +# - or - +# my $et = new Image::ExifTool; +# my $info = $et->ImageInfo($file, \@tagList, {Sort=>'Group0'} ); +sub ImageInfo($;@) +{ + local $_; + # get our ExifTool object ($self) or create one if necessary + my $self; + if (ref $_[0] and UNIVERSAL::isa($_[0],'Image::ExifTool')) { + $self = shift; + } else { + $self = new Image::ExifTool; + } + my %saveOptions = %{$$self{OPTIONS}}; # save original options + + # initialize file information + $$self{FILENAME} = $$self{RAF} = undef; + + $self->ParseArguments(@_); # parse our function arguments + $self->ExtractInfo(undef); # extract meta information from image + my $info = $self->GetInfo(undef); # get requested information + + $$self{OPTIONS} = \%saveOptions; # restore original options + + return $info; # return requested information +} + +#------------------------------------------------------------------------------ +# Get/set ExifTool options +# Inputs: 0) ExifTool object reference, +# 1) Parameter name (case insensitive), 2) Value to set the option +# 3-N) More parameter/value pairs +# Returns: original value of last option specified +sub Options($$;@) +{ + local $_; + my $self = shift; + my $options = $$self{OPTIONS}; + my $oldVal; + + while (@_) { + my $param = shift; + # fix parameter case if necessary + unless (exists $$options{$param}) { + my ($fixed) = grep /^$param$/i, keys %$options; + if ($fixed) { + $param = $fixed; + } else { + $param =~ s/^Group(\d*)$/Group$1/i; + } + } + $oldVal = $$options{$param}; + if (ref $oldVal eq 'HASH' and ($param eq 'Compact' or $param eq 'XMPShorthand')) { + # get previous Compact/XMPShorthand setting + $oldVal = $$oldVal{$param}; + } + last unless @_; + my $newVal = shift; + if ($param eq 'Lang') { + # allow this to be set to undef to select the default language + $newVal = $defaultLang unless defined $newVal; + if ($newVal eq $defaultLang) { + $$options{$param} = $newVal; + delete $$self{CUR_LANG}; + # make sure the language is available + } else { + my %langs = map { $_ => 1 } @langs; + if ($langs{$newVal} and eval "require Image::ExifTool::Lang::$newVal") { + my $xlat = "Image::ExifTool::Lang::${newVal}::Translate"; + no strict 'refs'; + if (%$xlat) { + $$self{CUR_LANG} = \%$xlat; + $$options{$param} = $newVal; + } + } + } # else don't change Lang + } elsif ($param eq 'Exclude' and defined $newVal) { + # clone Exclude list and expand shortcuts + my @exclude; + if (ref $newVal eq 'ARRAY') { + @exclude = @$newVal; + } else { + @exclude = ($newVal); + } + ExpandShortcuts(\@exclude, 1); # (also remove '#' suffix) + $$options{$param} = \@exclude; + } elsif ($param =~ /^Charset/ or $param eq 'IPTCCharset') { + # only allow valid character sets to be set + if ($newVal) { + my $charset = $charsetName{lc $newVal}; + if ($charset) { + $$options{$param} = $charset; + # maintain backward-compatibility with old IPTCCharset option + $$options{CharsetIPTC} = $charset if $param eq 'IPTCCharset'; + } else { + warn "Invalid Charset $newVal\n"; + } + } elsif ($param eq 'CharsetEXIF' or $param eq 'CharsetFileName' or $param eq 'CharsetRIFF') { + $$options{$param} = $newVal; # only these may be set to a false value + } elsif ($param eq 'CharsetQuickTime') { + $$options{$param} = 'MacRoman'; # QuickTime defaults to MacRoman + } else { + $$options{$param} = 'Latin'; # all others default to Latin + } + } elsif ($param eq 'UserParam') { + # clear options if $newVal is undef + defined $newVal or $$options{$param} = {}, next; + my $table = GetTagTable('Image::ExifTool::UserParam'); + # allow initialization of entire UserParam hash + if (ref $newVal eq 'HASH') { + my %newParams; + foreach (sort keys %$newVal) { + my $lcTag = lc $_; + $newParams{$lcTag} = $$newVal{$_}; + delete $$table{$lcTag}; + AddTagToTable($table, $lcTag, $_); + } + $$options{$param} = \%newParams; + next; + } + my ($force, $paramName); + # set/reset single UserParam parameter + if ($newVal =~ /(.*?)=(.*)/s) { + $paramName = $1; + $newVal = $2; + $force = 1 if $paramName =~ s/\^$//; + $paramName =~ tr/-_a-zA-Z0-9#//dc; + $param = lc $paramName; + } else { + ($param = lc $newVal) =~ tr/-_a-zA-Z0-9#//dc; + undef $newVal; + } + delete $$table{$param}; + $oldVal = $$options{UserParam}{$param}; + if (defined $newVal) { + if (length $newVal or $force) { + $$options{UserParam}{$param} = $newVal; + AddTagToTable($table, $param, $paramName); + } else { + delete $$options{UserParam}{$param}; + } + } + # remove alternate version of tag + $param .= '#' unless $param =~ s/#$//; + delete $$table{$param}; + delete $$options{UserParam}{$param}; + } elsif ($param eq 'RequestTags') { + if (defined $newVal) { + # parse list from delimited string if necessary + my @reqList = (ref $newVal eq 'ARRAY') ? @$newVal : ($newVal =~ /[-\w?*:]+/g); + ExpandShortcuts(\@reqList); + # add to existing list + $$options{$param} or $$options{$param} = [ ]; + foreach (@reqList) { + /^(.*:)?([-\w?*]*)#?$/ or next; + push @{$$options{$param}}, lc($2) if $2; + next unless $1; + # add requested groups with trailing colon + push @{$$options{$param}}, lc($_).':' foreach split /:/, $1; + } + } else { + $$options{$param} = undef; # clear the list + } + } elsif ($param eq 'IgnoreTags') { + if (defined $newVal) { + # parse list from delimited string if necessary + my @ignoreList = (ref $newVal eq 'ARRAY') ? @$newVal : ($newVal =~ /[-\w?*:]+/g); + ExpandShortcuts(\@ignoreList); + # add to existing tags to ignore + $$options{$param} or $$options{$param} = { }; + foreach (@ignoreList) { + /^(.*:)?([-\w?*]+)#?$/ or next; + $$options{$param}{lc $2} = 1; + } + } else { + $$options{$param} = undef; # clear the option + } + } elsif ($param eq 'ListJoin') { + $$options{$param} = $newVal; + # set the old List and ListSep options for backward compatibility + if (defined $newVal) { + $$options{List} = 0; + $$options{ListSep} = $newVal; + } else { + $$options{List} = 1; + # (ListSep must be defined) + } + } elsif ($param eq 'List') { + $$options{$param} = $newVal; + # set the new ListJoin option for forward compatibility + $$options{ListJoin} = $newVal ? undef : $$options{ListSep}; + } elsif ($param eq 'Compact' or $param eq 'XMPShorthand') { + # set Compact and XMPShorthand options, preserving backward compatibility + my ($p, %compact); + foreach $p ('Compact','XMPShorthand') { + my $val = $param eq $p ? $newVal : $$options{Compact}{$p}; + if (defined $val) { + my @v = ($val =~ /\w+/g); + my $opt = ($p eq 'Compact') ? \%compactOpt : \%xmpShorthandOpt; + foreach (@v) { + my $set = $$opt{lc $_} or warn("Invalid $p setting '${_}'\n"), return $oldVal; + ref $set or $compact{$set} = 1, next; + $compact{$_} = 1 foreach @$set; + } + } + $compact{$p} = $val; # preserve most recent setting + } + $$options{Compact} = $$options{XMPShorthand} = \%compact; + } else { + if ($param eq 'Escape') { + # set ESCAPE_PROC + if (defined $newVal and $newVal eq 'XML') { + require Image::ExifTool::XMP; + $$self{ESCAPE_PROC} = \&Image::ExifTool::XMP::EscapeXML; + } elsif (defined $newVal and $newVal eq 'HTML') { + require Image::ExifTool::HTML; + $$self{ESCAPE_PROC} = \&Image::ExifTool::HTML::EscapeHTML; + } else { + delete $$self{ESCAPE_PROC}; + } + # must forget saved values since they depend on Escape method + $$self{BOTH} = { }; + } elsif ($param eq 'GlobalTimeShift') { + delete $$self{GLOBAL_TIME_OFFSET}; # reset our calculated offset + } elsif ($param eq 'TimeZone' and defined $newVal and length $newVal) { + $ENV{TZ} = $newVal; + eval { require POSIX; POSIX::tzset() }; + } elsif ($param eq 'Validate') { + # load Validate module if Validate option enabled + $newVal and require Image::ExifTool::Validate; + } + $$options{$param} = $newVal; + } + } + return $oldVal; +} + +#------------------------------------------------------------------------------ +# ClearOptions - set options to default values +# Inputs: 0) ExifTool object reference +sub ClearOptions($) +{ + local $_; + my $self = shift; + + # create options hash with default values + # +-----------------------------------------------------+ + # ! DON'T FORGET!! When adding any new option, must ! + # ! decide how it is handled in SetNewValuesFromFile() ! + # +-----------------------------------------------------+ + # (Note: All options must exist in this lookup, even if undefined, + # to facilitate case-insensitive options. 'Group#' is handled specially) + $$self{OPTIONS} = { + Binary => undef, # flag to extract binary values even if tag not specified + ByteOrder => undef, # default byte order when creating EXIF information + Charset => 'UTF8', # character set for converting Unicode characters + CharsetEXIF => undef, # internal EXIF "ASCII" string encoding + CharsetFileName => undef, # external encoding for file names + CharsetID3 => 'Latin', # internal ID3v1 character set + CharsetIPTC => 'Latin', # fallback IPTC character set if no CodedCharacterSet + CharsetPhotoshop => 'Latin', # internal encoding for Photoshop resource names + CharsetQuickTime => 'MacRoman', # internal QuickTime string encoding + CharsetRIFF => 0, # internal RIFF string encoding (0=default to Latin) + Compact => { }, # write compact XMP + Composite => 1, # flag to calculate Composite tags + Compress => undef, # flag to write new values as compressed if possible + CoordFormat => undef, # GPS lat/long coordinate format + DateFormat => undef, # format for date/time + Duplicates => 1, # flag to save duplicate tag values + Escape => undef, # escape special characters + Exclude => undef, # tags to exclude + ExtendedXMP => 1, # strategy for reading extended XMP + ExtractEmbedded =>undef,# flag to extract information from embedded documents + FastScan => undef, # flag to avoid scanning for trailer + Filter => undef, # output filter for all tag values + FilterW => undef, # input filter when writing tag values + FixBase => undef, # fix maker notes base offsets + GeoMaxIntSecs => 1800, # geotag maximum interpolation time (secs) + GeoMaxExtSecs => 1800, # geotag maximum extrapolation time (secs) + GeoMaxHDOP => undef, # geotag maximum HDOP + GeoMaxPDOP => undef, # geotag maximum PDOP + GeoMinSats => undef, # geotag minimum satellites + GeoSpeedRef => undef, # geotag GPSSpeedRef + GlobalTimeShift => undef, # apply time shift to all extracted date/time values + # Group# => undef, # return tags for specified groups in family # + HexTagIDs => 0, # use hex tag ID's in family 7 group names + HtmlDump => 0, # HTML dump (0-3, higher # = bigger limit) + HtmlDumpBase => undef, # base address for HTML dump + IgnoreMinorErrors => undef, # ignore minor errors when reading/writing + IgnoreTags => undef, # list of tags to ignore when extracting + Lang => $defaultLang,# localized language for descriptions etc + LargeFileSupport => undef, # flag indicating support of 64-bit file offsets + List => undef, # extract lists of PrintConv values into arrays [no longer documented] + ListItem => undef, # used to return a specific item from lists + ListJoin => ', ', # join lists together with this separator + ListSep => ', ', # list item separator [no longer documented] + ListSplit => undef, # regex for splitting list-type tag values when writing + MakerNotes => undef, # extract maker notes as a block + MDItemTags => undef, # extract MacOS metadata item tags + MissingTagValue =>undef,# value for missing tags when expanded in expressions + NoMultiExif => undef, # raise error when writing multi-segment EXIF + NoPDFList => undef, # flag to avoid splitting PDF List-type tag values + Password => undef, # password for password-protected PDF documents + PrintConv => 1, # flag to enable print conversion + QuickTimeHandler => 1, # flag to add mdir Handler to newly created Meta box + QuickTimePad=> undef, # flag to preserve padding of QuickTime CR3 tags + QuickTimeUTC=> undef, # assume that QuickTime date/time tags are stored as UTC + RequestAll => undef, # extract all tags that must be specifically requested + RequestTags => undef, # extra tags to request (on top of those in the tag list) + SaveFormat => undef, # save family 6 tag TIFF format + SavePath => undef, # save family 5 location path + ScanForXMP => undef, # flag to scan for XMP information in all files + Sort => 'Input', # order to sort found tags (Input, File, Tag, Descr, Group#) + Sort2 => 'File', # secondary sort order for tags in a group (File, Tag, Descr) + StrictDate => undef, # flag to return undef for invalid date conversions + Struct => undef, # return structures as hash references + SystemTags => undef, # extract additional File System tags + TextOut => \*STDOUT,# file for Verbose/HtmlDump output + TimeZone => undef, # local time zone + Unknown => 0, # flag to get values of unknown tags (0-2) + UserParam => { }, # user parameters for additional user-defined tag values + Validate => undef, # perform additional validation + Verbose => 0, # print verbose messages (0-5, higher # = more verbose) + WriteMode => 'wcg', # enable all write modes by default + XAttrTags => undef, # extract MacOS extended attribute tags + XMPAutoConv => 1, # automatic conversion of unknown XMP tag values + XMPShorthand=> 0, # (unused, but needed for backward compatibility) + }; + # keep necessary member variables in sync with options + delete $$self{CUR_LANG}; + delete $$self{ESCAPE_PROC}; + + # load user-defined default options + if (%Image::ExifTool::UserDefined::Options) { + foreach (keys %Image::ExifTool::UserDefined::Options) { + $self->Options($_, $Image::ExifTool::UserDefined::Options{$_}); + } + } +} + +#------------------------------------------------------------------------------ +# Extract meta information from image +# Inputs: 0) ExifTool object reference +# 1-N) Same as ImageInfo() +# Returns: 1 if this was a valid image, 0 otherwise +# Notes: pass an undefined value to avoid parsing arguments +# Internal 'ReEntry' option allows this routine to be called recursively +sub ExtractInfo($;@) +{ + local $_; + my $self = shift; + my $options = $$self{OPTIONS}; # pointer to current options + my $fast = $$options{FastScan} || 0; + my $req = $$self{REQ_TAG_LOOKUP}; + my $reqAll = $$options{RequestAll} || 0; + my (%saveOptions, $reEntry, $rsize, $zid, $type, @startTime, $saveOrder, $isDir); + + # check for internal ReEntry option to allow recursive calls to ExtractInfo + if (ref $_[1] eq 'HASH' and $_[1]{ReEntry} and + (ref $_[0] eq 'SCALAR' or ref $_[0] eq 'GLOB')) + { + # save necessary members for restoring later + $reEntry = { + RAF => $$self{RAF}, + PROCESSED => $$self{PROCESSED}, + EXIF_DATA => $$self{EXIF_DATA}, + EXIF_POS => $$self{EXIF_POS}, + FILE_TYPE => $$self{FILE_TYPE}, + }; + $saveOrder = GetByteOrder(), + $$self{RAF} = new File::RandomAccess($_[0]); + $$self{PROCESSED} = { }; + delete $$self{EXIF_DATA}; + delete $$self{EXIF_POS}; + } else { + if (defined $_[0] or $$options{HtmlDump} or $$req{validate}) { + %saveOptions = %$options; # save original options + + # require duplicates for html dump + $self->Options(Duplicates => 1) if $$options{HtmlDump}; + # enable Validate option if Validate tag is requested + $self->Options(Validate => 1) if $$req{validate}; + + if (defined $_[0]) { + # only initialize filename if called with arguments + $$self{FILENAME} = undef; # name of file (or '' if we didn't open it) + $$self{RAF} = undef; # RandomAccess object reference + + $self->ParseArguments(@_); # initialize from our arguments + } + } + # initialize ExifTool object members + $self->Init(); + + delete $$self{MAKER_NOTE_FIXUP}; # fixup information for extracted maker notes + delete $$self{MAKER_NOTE_BYTE_ORDER}; + + # return our version number + $self->FoundTag('ExifToolVersion', "$VERSION$RELEASE"); + $self->FoundTag('Now', $self->TimeNow()) if $$req{now} or $reqAll; + $self->FoundTag('NewGUID', NewGUID()) if $$req{newguid} or $reqAll; + # generate sequence number if necessary + $self->FoundTag('FileSequence', $$self{FILE_SEQUENCE}) if $$req{filesequence} or $reqAll; + + if ($$req{processingtime} or $reqAll) { + eval { require Time::HiRes; @startTime = Time::HiRes::gettimeofday() }; + if (not @startTime and $$req{processingtime}) { + $self->WarnOnce('Install Time::HiRes to generate ProcessingTime'); + } + } + + ++$$self{FILE_SEQUENCE}; # count files read + } + + my $filename = $$self{FILENAME}; # image file name ('' if already open) + my $raf = $$self{RAF}; # RandomAccess object + + local *EXIFTOOL_FILE; # avoid clashes with global namespace + + my $realname = $filename; + unless ($raf) { + # save file name + if (defined $filename and $filename ne '') { + unless ($filename eq '-') { + # extract file name from pipe if necessary + $realname =~ /\|$/ and $realname =~ s/^.*?"(.*?)".*/$1/s; + my ($dir, $name) = SplitFileName($realname); + $self->FoundTag('FileName', $name); + if ($$req{basename} or + ($reqAll and not $$self{EXCL_TAG_LOOKUP}{basename})) + { + $self->FoundTag('BaseName', $name =~ /(.*)\./ ? $1 : $name); + } + $self->FoundTag('Directory', $dir) if defined $dir and length $dir; + if ($$req{filepath} or + ($reqAll and not $$self{EXCL_TAG_LOOKUP}{filepath})) + { + local $SIG{'__WARN__'} = \&SetWarning; + if (eval { require Cwd }) { + my $path = eval { Cwd::abs_path($filename) }; + $self->FoundTag('FilePath', $path) if defined $path; + } elsif ($$req{filepath}) { + $self->WarnOnce('The Perl Cwd module must be installed to use FilePath'); + } + } + # get size of resource fork on Mac OS + $rsize = -s "$filename/..namedfork/rsrc" if $^O eq 'darwin' and not $$self{IN_RESOURCE}; + # check to see if Zone.Identifier file exists in Windows + if ($^O eq 'MSWin32' and eval { require Win32API::File }) { + my $wattr; + my $zfile = "${filename}:Zone.Identifier"; + if ($self->EncodeFileName($zfile)) { + $wattr = eval { Win32API::File::GetFileAttributesW($zfile) }; + } else { + $wattr = eval { Win32API::File::GetFileAttributes($zfile) }; + } + $zid = 1 unless $wattr == Win32API::File::INVALID_FILE_ATTRIBUTES(); + } + } + # open the file + if ($self->Open(\*EXIFTOOL_FILE, $filename)) { + # create random access file object + $raf = new File::RandomAccess(\*EXIFTOOL_FILE); + # patch to force pipe to be buffered because seek returns success + # in Windows cmd shell pipe even though it really failed + $$raf{TESTED} = -1 if $filename eq '-' or $filename =~ /\|$/; + $$self{RAF} = $raf; + } elsif ($self->IsDirectory($filename)) { + $isDir = 1; + } else { + $self->Error('Error opening file'); + } + } else { + $self->Error('No file specified'); + } + } + + while ($raf or $isDir) { + my (@stat, $plainFile); + if ($reEntry) { + # we already set these tags + } elsif (not $raf) { + @stat = stat $filename; + } elsif (not $$raf{FILE_PT}) { + # get file size from image in memory + $self->FoundTag('FileSize', length ${$$raf{BUFF_PT}}); + } elsif (-f $$raf{FILE_PT}) { + # get file tags if this is a plain file + @stat = stat _; + $plainFile = 1; + # hack to patch Windows daylight savings time bug + @stat[8,9,10] = $self->GetFileTime($$raf{FILE_PT}) if $^O eq 'MSWin32'; + } else { + # (note that Windows directories will still show the + # daylight savings time bug -- should fix this sometime) + @stat = stat $$raf{FILE_PT}; + } + my $fileSize = $stat[7]; + $self->FoundTag('FileSize', $stat[7]) if defined $stat[7]; + $self->FoundTag('ResourceForkSize', $rsize) if $rsize; + $self->FoundTag('ZoneIdentifier', 'Exists') if $zid; + $self->FoundTag('FileModifyDate', $stat[9]) if defined $stat[9]; + $self->FoundTag('FileAccessDate', $stat[8]) if defined $stat[8]; + my $cTag = $^O eq 'MSWin32' ? 'FileCreateDate' : 'FileInodeChangeDate'; + $self->FoundTag($cTag, $stat[10]) if defined $stat[10]; + $self->FoundTag('FilePermissions', $stat[2]) if defined $stat[2]; + # extract more system info if SystemTags option is set + if (@stat) { + my $sys = $$options{SystemTags} || ($reqAll and not defined $$options{SystemTags}); + if ($sys or $$req{fileattributes}) { + my @attr = ($stat[2] & 0xf000, $stat[2] & 0x0e00); + # add Windows file attributes if available + if ($^O eq 'MSWin32' and defined $filename and $filename ne '' and $filename ne '-') { + local $SIG{'__WARN__'} = \&SetWarning; + if (eval { require Win32API::File }) { + my $wattr; + my $file = $filename; + if ($self->EncodeFileName($file)) { + $wattr = eval { Win32API::File::GetFileAttributesW($file) }; + } else { + $wattr = eval { Win32API::File::GetFileAttributes($file) }; + } + push @attr, $wattr if defined $wattr and $wattr != 0xffffffff; + } + } + $self->FoundTag('FileAttributes', "@attr"); + } + $self->FoundTag('FileDeviceNumber', $stat[0]) if $sys or $$req{filedevicenumber}; + $self->FoundTag('FileInodeNumber', $stat[1]) if $sys or $$req{fileinodenumber}; + $self->FoundTag('FileHardLinks', $stat[3]) if $sys or $$req{filehardlinks}; + $self->FoundTag('FileUserID', $stat[4]) if $sys or $$req{fileuserid}; + $self->FoundTag('FileGroupID', $stat[5]) if $sys or $$req{filegroupid}; + $self->FoundTag('FileDeviceID', $stat[6]) if $sys or $$req{filedeviceid}; + $self->FoundTag('FileBlockSize', $stat[11]) if $sys or $$req{fileblocksize}; + $self->FoundTag('FileBlockCount', $stat[12]) if $sys or $$req{fileblockcount}; + } + # extract MDItem tags if requested (only on plain files) + if ($^O eq 'darwin' and defined $filename and $filename ne '' and defined $fileSize) { + my $reqMacOS = ($reqAll > 1 or $$req{'macos:'}); + my $crDate = ($reqMacOS || $$req{filecreatedate}); + my $mdItem = ($reqMacOS || $$options{MDItemTags} || grep /^mditem/, keys %$req); + my $xattr = ($reqMacOS || $$options{XAttrTags} || grep /^xattr/, keys %$req); + if ($crDate or $mdItem or $xattr) { + require Image::ExifTool::MacOS; + Image::ExifTool::MacOS::GetFileCreateDate($self, $filename) if $crDate; + Image::ExifTool::MacOS::ExtractMDItemTags($self, $filename) if $mdItem and $plainFile; + Image::ExifTool::MacOS::ExtractXAttrTags($self, $filename) if $xattr; + } + } + # do whatever else we can with directories, then return + if ($isDir or (defined $stat[2] and ($stat[2] & 0170000) == 0040000)) { + $self->FoundTag('FileType', 'DIR'); + $self->FoundTag('FileTypeExtension', ''); + $self->BuildCompositeTags() if $$options{Composite}; + $raf->Close() if $raf; + return 1; + } + # get list of file types to check + my ($tiffType, %noMagic, $recognizedExt); + my $ext = $$self{FILE_EXT} = GetFileExtension($realname); + # set $recognizedExt if this file type is recognized by extension only + $recognizedExt = $ext if defined $ext and not defined $magicNumber{$ext} and + defined $moduleName{$ext} and not $moduleName{$ext}; + my @fileTypeList = GetFileType($realname); + if ($fast >= 4) { + if (@fileTypeList) { + $type = shift @fileTypeList; + $self->SetFileType($$self{FILE_TYPE} = $type); + } else { + $self->Error('Unknown file type'); + } + $self->BuildCompositeTags() if $fast == 4 and $$options{Composite}; + last; # don't read the file + } + if (@fileTypeList) { + # add remaining types to end of list so we test them all + my $pat = join '|', @fileTypeList; + push @fileTypeList, grep(!/^($pat)$/, @fileTypes); + $tiffType = $$self{FILE_EXT}; + unless ($fast == 3) { + $noMagic{MXF} = 1; # don't do magic number test on MXF or DV files + $noMagic{DV} = 1; + } + } else { + # scan through all recognized file types + @fileTypeList = @fileTypes; + $tiffType = 'TIFF'; + } + push @fileTypeList, ''; # end of list marker + # initialize the input file for seeking in binary data + $raf->BinMode(); # set binary mode before we start reading + my $pos = $raf->Tell(); # get file position so we can rewind + # loop through list of file types to test + my ($buff, $seekErr); + my %dirInfo = ( RAF => $raf, Base => $pos, TestBuff => \$buff ); + # read start of file for testing + $raf->Read($buff, $testLen) or $buff = ''; + $raf->Seek($pos, 0) or $seekErr = 1; + until ($seekErr) { + my $unkHeader; + $type = shift @fileTypeList; + if ($type) { + if ($magicNumber{$type}) { + # do quick test for this file type to avoid loading module unnecessarily + next if $buff !~ /^$magicNumber{$type}/s and not $noMagic{$type}; + } else { + # keep checking for other types if we recognize this file only by extension + next if defined $moduleName{$type} and not $moduleName{$type}; + next if $fast > 2; # keep checking if we aren't processing the file + } + next if $weakMagic{$type} and defined $recognizedExt; + } elsif (not defined $type) { + last; + } elsif ($recognizedExt) { + $type = $recognizedExt; # set type from recognized file extension only + } else { + # last ditch effort to scan past unknown header for JPEG/TIFF + next unless $buff =~ /(\xff\xd8\xff|MM\0\x2a|II\x2a\0)/g; + $type = ($1 eq "\xff\xd8\xff") ? 'JPEG' : 'TIFF'; + my $skip = pos($buff) - length($1); + $dirInfo{Base} = $pos + $skip; + $raf->Seek($pos + $skip, 0) or $seekErr = 1, last; + $self->Warn("Processing $type-like data after unknown $skip-byte header"); + $unkHeader = 1 unless $$self{DOC_NUM}; + } + # save file type in member variable + $$self{FILE_TYPE} = $type; + $dirInfo{Parent} = ($type eq 'TIFF') ? $tiffType : $type; + # don't process the file when FastScan == 3 + if ($fast == 3 and not $processType{$type}) { + unless ($weakMagic{$type} and (not $ext or $ext ne $type)) { + $self->SetFileType($dirInfo{Parent}); + } + last; + } + my $module = $moduleName{$type}; + $module = $type unless defined $module; + my $func = "Process$type"; + + # load module if necessary + if ($module) { + require "Image/ExifTool/$module.pm"; + $func = "Image::ExifTool::${module}::$func"; + } elsif ($module eq '0') { + $self->SetFileType(); + $self->Warn('Unsupported file type'); + last; + } + push @{$$self{PATH}}, $type; # save file type in metadata PATH + + # process the file + no strict 'refs'; + my $result = &$func($self, \%dirInfo); + use strict 'refs'; + + pop @{$$self{PATH}}; + + if ($result) { # all done if successful + if ($unkHeader) { + $self->DeleteTag('FileType'); + $self->DeleteTag('FileTypeExtension'); + $self->DeleteTag('MIMEType'); + $self->VPrint(0,"Reset file type due to unknown header\n"); + } + last; + } + # seek back to try again from the same position in the file + $raf->Seek($pos, 0) or $seekErr = 1, last; + } + if (not defined $type and not $$self{DOC_NUM}) { + # if we were given a single image with a known type there + # must be a format error since we couldn't read it, otherwise + # it is likely we don't support images of this type + my $fileType = GetFileType($realname) || ''; + my $err; + if (not length $buff) { + $err = 'File is empty'; + } else { + my $ch = substr($buff, 0, 1); + if (length $buff < 16 or $buff =~ /[^\Q$ch\E]/) { + if ($fileType eq 'RAW') { + $err = 'Unsupported RAW file type'; + } elsif ($fileType) { + $err = 'File format error'; + } else { + $err = 'Unknown file type'; + } + } else { + # provide some insight into the content of some corrupted files + if ($$self{OPTIONS}{FastScan}) { + $err = 'File header is all'; + } else { + my $num = 0; + for (;;) { + $raf->Read($buff, 65536) or undef($num), last; + $buff =~ /[^\Q$ch\E]/g and $num += pos($buff) - 1, last; + $num += length($buff); + } + if ($num) { + $err = 'First ' . ConvertFileSize($num) . ' of file is'; + } else { + $err = 'Entire file is'; + } + } + if ($ch eq "\0") { + $err .= ' binary zeros'; + } elsif ($ch eq ' ') { + $err .= ' ASCII spaces'; + } elsif ($ch =~ /[a-zA-Z0-9]/) { + $err .= " ASCII '${ch}' characters"; + } else { + $err .= sprintf(" binary 0x%.2x's", ord $ch); + } + } + } + $self->Error($err); + } + if ($seekErr) { + $self->Error('Error seeking in file'); + } elsif ($self->Options('ScanForXMP') and (not defined $type or + (not $fast and not $$self{FoundXMP}))) + { + # scan for XMP + $raf->Seek($pos, 0); + require Image::ExifTool::XMP; + Image::ExifTool::XMP::ScanForXMP($self, $raf) and $type = ''; + } + # extract binary EXIF data block only if requested + if (defined $$self{EXIF_DATA} and length $$self{EXIF_DATA} > 16 and + ($$req{exif} or + # (not extracted normally, so check TAGS_FROM_FILE) + ($$self{TAGS_FROM_FILE} and not $$self{EXCL_TAG_LOOKUP}{exif}))) + { + $self->FoundTag('EXIF', $$self{EXIF_DATA}); + } + unless ($reEntry) { + $$self{PATH} = [ ]; # reset PATH + # calculate Composite tags + $self->BuildCompositeTags() if $$options{Composite}; + # do our HTML dump if requested + if ($$self{HTML_DUMP}) { + $raf->Seek(0, 2); # seek to end of file + $$self{HTML_DUMP}->FinishTiffDump($self, $raf->Tell()); + my $pos = $$options{HtmlDumpBase}; + $pos = ($$self{FIRST_EXIF_POS} || 0) unless defined $pos; + my $dataPt = defined $$self{EXIF_DATA} ? \$$self{EXIF_DATA} : undef; + undef $dataPt if defined $$self{EXIF_POS} and $pos != $$self{EXIF_POS}; + undef $dataPt if $$self{ExtendedEXIF}; # can't use EXIF block if not contiguous + my $success = $$self{HTML_DUMP}->Print($raf, $dataPt, $pos, + $$options{TextOut}, $$options{HtmlDump}, + $$self{FILENAME} ? "HTML Dump ($$self{FILENAME})" : 'HTML Dump'); + $self->Warn("Error reading $$self{HTML_DUMP}{ERROR}") if $success < 0; + } + } + if ($filename) { + $raf->Close(); # close the file if we opened it + # process the resource fork as an embedded file on Mac filesystems + if ($rsize and $$options{ExtractEmbedded}) { + local *RESOURCE_FILE; + if ($self->Open(\*RESOURCE_FILE, "$filename/..namedfork/rsrc")) { + $$self{DOC_NUM} = $$self{DOC_COUNT} + 1; + $$self{IN_RESOURCE} = 1; + $self->ExtractInfo(\*RESOURCE_FILE, { ReEntry => 1 }); + close RESOURCE_FILE; + delete $$self{IN_RESOURCE}; + } else { + $self->Warn('Error opening resource fork'); + } + } + } + last; # (loop was a cheap "goto") + } + + # generate Validate tag if requested + if ($$options{Validate} and not $reEntry) { + Image::ExifTool::Validate::FinishValidate($self, $$req{validate}); + } + + @startTime and $self->FoundTag('ProcessingTime', Time::HiRes::tv_interval(\@startTime)); + + # add user-defined parameters that ended with '!' + if (%{$$options{UserParam}}) { + my $doMsg = $$options{Verbose}; + my $table = GetTagTable('Image::ExifTool::UserParam'); + foreach (sort keys %{$$options{UserParam}}) { + next unless /#$/; + if ($doMsg) { + $self->VPrint(0, "UserParam tags:\n"); + undef $doMsg; + } + $self->HandleTag($table, $_, $$options{UserParam}{$_}); + } + } + + # restore original options + %saveOptions and $$self{OPTIONS} = \%saveOptions; + + if ($reEntry) { + # restore necessary members when exiting re-entrant code + $$self{$_} = $$reEntry{$_} foreach keys %$reEntry; + SetByteOrder($saveOrder); + } + + # ($type may be undef without an Error when processing sub-documents) + return 0 if not defined $type or exists $$self{VALUE}{Error}; + return 1; +} + +#------------------------------------------------------------------------------ +# Get hash of extracted meta information +# Inputs: 0) ExifTool object reference +# 1-N) options hash reference, tag list reference or tag names +# Returns: Reference to information hash +# Notes: - pass an undefined value to avoid parsing arguments +# - If groups are specified, first groups take precedence if duplicate +# tags found but Duplicates option not set. +# - tag names may end in '#' to extract ValueConv value +sub GetInfo($;@) +{ + local $_; + my $self = shift; + my %saveOptions; + + unless (@_ and not defined $_[0]) { + %saveOptions = %{$$self{OPTIONS}}; # save original options + # must set FILENAME so it isn't parsed from the arguments + $$self{FILENAME} = '' unless defined $$self{FILENAME}; + $self->ParseArguments(@_); + } + + # get reference to list of tags for which we will return info + my ($rtnTags, $byValue, $wildTags) = $self->SetFoundTags(); + + # build hash of tag information + my (%info, %ignored); + my $conv = $$self{OPTIONS}{PrintConv} ? 'PrintConv' : 'ValueConv'; + foreach (@$rtnTags) { + my $val = $self->GetValue($_, $conv); + defined $val or $ignored{$_} = 1, next; + $info{$_} = $val; + } + + # override specified tags with ValueConv value if necessary + if (@$byValue) { + # first determine the number of times each non-ValueConv value is used + my %nonVal; + $nonVal{$_} = ($nonVal{$_} || 0) + 1 foreach @$rtnTags; + --$nonVal{$$rtnTags[$_]} foreach @$byValue; + # loop through ValueConv tags, updating tag keys and returned values + foreach (@$byValue) { + my $tag = $$rtnTags[$_]; + my $val = $self->GetValue($tag, 'ValueConv'); + next unless defined $val; + my $vtag = $tag; + # generate a new tag key like "Tag #" or "Tag #(1)" + $vtag =~ s/( |$)/ #/; + unless (defined $$self{VALUE}{$vtag}) { + $$self{VALUE}{$vtag} = $$self{VALUE}{$tag}; + $$self{TAG_INFO}{$vtag} = $$self{TAG_INFO}{$tag}; + $$self{TAG_EXTRA}{$vtag} = $$self{TAG_EXTRA}{$tag}; + $$self{FILE_ORDER}{$vtag} = $$self{FILE_ORDER}{$tag}; + # remove existing PrintConv entry unless we are using it too + delete $info{$tag} unless $nonVal{$tag}; + } + $$rtnTags[$_] = $vtag; # store ValueConv value with new tag key + $info{$vtag} = $val; # return ValueConv value + } + } + + # remove ignored tags from the list + my $reqTags = $$self{REQUESTED_TAGS} || [ ]; + if (%ignored) { + if (not @$reqTags) { + my @goodTags; + foreach (@$rtnTags) { + push @goodTags, $_ unless $ignored{$_}; + } + $rtnTags = $$self{FOUND_TAGS} = \@goodTags; + } elsif (@$wildTags) { + # only remove tags specified by wildcard + my @goodTags; + my $i = 0; + foreach (@$rtnTags) { + if (@$wildTags and $i == $$wildTags[0]) { + shift @$wildTags; + push @goodTags, $_ unless $ignored{$_}; + } else { + push @goodTags, $_; + } + ++$i; + } + $rtnTags = $$self{FOUND_TAGS} = \@goodTags; + } + } + + # return sorted tag list if provided with a list reference + if ($$self{IO_TAG_LIST}) { + # use file order by default if no tags specified + # (no such thing as 'Input' order in this case) + my $sort = $$self{OPTIONS}{Sort}; + $sort = 'File' unless @$reqTags or ($sort and $sort ne 'Input'); + # return tags in specified sort order + @{$$self{IO_TAG_LIST}} = $self->GetTagList($rtnTags, $sort, $$self{OPTIONS}{Sort2}); + } + + # restore original options + %saveOptions and $$self{OPTIONS} = \%saveOptions; + + return \%info; +} + +#------------------------------------------------------------------------------ +# Inputs: 0) ExifTool object reference +# 1) [optional] reference to info hash or tag list ref (default is found tags) +# 2) [optional] sort order ('File', 'Input', ...) +# 3) [optional] secondary sort order +# Returns: List of tags in specified order +sub GetTagList($;$$$) +{ + local $_; + my ($self, $info, $sort, $sort2) = @_; + + my $foundTags; + if (ref $info eq 'HASH') { + my @tags = keys %$info; + $foundTags = \@tags; + } elsif (ref $info eq 'ARRAY') { + $foundTags = $info; + } + my $fileOrder = $$self{FILE_ORDER}; + + if ($foundTags) { + # make sure a FILE_ORDER entry exists for all tags + # (note: already generated bogus entries for FOUND_TAGS case below) + foreach (@$foundTags) { + next if defined $$fileOrder{$_}; + $$fileOrder{$_} = 999; + } + } else { + $sort = $info if $info and not $sort; + $foundTags = $$self{FOUND_TAGS} || $self->SetFoundTags() or return undef; + } + $sort or $sort = $$self{OPTIONS}{Sort}; + + # return original list if no sort order specified + return @$foundTags unless $sort and $sort ne 'Input'; + + if ($sort eq 'Tag' or $sort eq 'Alpha') { + return sort @$foundTags; + } elsif ($sort =~ /^Group(\d*(:\d+)*)/) { + my $family = $1 || 0; + # want to maintain a basic file order with the groups + # ordered in the way they appear in the file + my (%groupCount, %groupOrder); + my $numGroups = 0; + my $tag; + foreach $tag (sort { $$fileOrder{$a} <=> $$fileOrder{$b} } @$foundTags) { + my $group = $self->GetGroup($tag, $family); + my $num = $groupCount{$group}; + $num or $num = $groupCount{$group} = ++$numGroups; + $groupOrder{$tag} = $num; + } + $sort2 or $sort2 = $$self{OPTIONS}{Sort2}; + if ($sort2) { + if ($sort2 eq 'Tag' or $sort2 eq 'Alpha') { + return sort { $groupOrder{$a} <=> $groupOrder{$b} or $a cmp $b } @$foundTags; + } elsif ($sort2 eq 'Descr') { + my $desc = $self->GetDescriptions($foundTags); + return sort { $groupOrder{$a} <=> $groupOrder{$b} or + $$desc{$a} cmp $$desc{$b} } @$foundTags; + } + } + return sort { $groupOrder{$a} <=> $groupOrder{$b} or + $$fileOrder{$a} <=> $$fileOrder{$b} } @$foundTags; + } elsif ($sort eq 'Descr') { + my $desc = $self->GetDescriptions($foundTags); + return sort { $$desc{$a} cmp $$desc{$b} } @$foundTags; + } else { + return sort { $$fileOrder{$a} <=> $$fileOrder{$b} } @$foundTags; + } +} + +#------------------------------------------------------------------------------ +# Get list of found tags in specified sort order +# Inputs: 0) ExifTool object reference, 1) sort order ('File', 'Input', ...) +# 2) secondary sort order +# Returns: List of tag keys in specified order +# Notes: If not specified, sort order is taken from OPTIONS +sub GetFoundTags($;$$) +{ + local $_; + my ($self, $sort, $sort2) = @_; + my $foundTags = $$self{FOUND_TAGS} || $self->SetFoundTags() or return undef; + return $self->GetTagList($foundTags, $sort, $sort2); +} + +#------------------------------------------------------------------------------ +# Get list of requested tags +# Inputs: 0) ExifTool object reference +# Returns: List of requested tag keys +sub GetRequestedTags($) +{ + local $_; + return @{$_[0]{REQUESTED_TAGS}}; +} + +#------------------------------------------------------------------------------ +# Get tag value +# Inputs: 0) ExifTool object reference +# 1) tag key or tag name with optional group names (case sensitive) +# (or flattened tagInfo for getting field values, not part of public API) +# 2) [optional] Value type: PrintConv, ValueConv, Both, Raw or Rational, the default +# is PrintConv or ValueConv, depending on the PrintConv option setting +# 3) raw field value (not part of public API) +# Returns: Scalar context: tag value or undefined +# List context: list of values or empty list +sub GetValue($$;$) +{ + local $_; + my ($self, $tag, $type) = @_; # plus: ($fieldValue) + my (@convTypes, $tagInfo, $valueConv, $both); + my $rawValue = $$self{VALUE}; + + # get specific tag key if tag has a group name + if ($tag =~ /^(.*):(.+)/) { + my ($gp, $tg) = ($1, $2); + my ($i, $key, @keys); + # build list of tag keys in the order of priority (no index + # is top priority, otherwise higher index is higher priority) + for ($key=$tg, $i=$$self{DUPL_TAG}{$tg} || 0; ; --$i) { + push @keys, $key if defined $$rawValue{$key}; + last if $i <= 0; + $key = "$tg ($i)"; + } + if (@keys) { + $key = $self->GroupMatches($gp, \@keys); + $tag = $key if $key; + } + } + # figure out what conversions to do + if ($type) { + return $$self{RATIONAL}{$tag} if $type eq 'Rational'; + } else { + $type = $$self{OPTIONS}{PrintConv} ? 'PrintConv' : 'ValueConv'; + } + + # start with the raw value + my $value = $$rawValue{$tag}; + if (not defined $value) { + return () unless ref $tag; + # get the value of a structure field + $tagInfo = $tag; + $tag = $$tagInfo{Name}; + $value = $_[3]; + # (note: type "Both" is not allowed for structure fields) + if ($type ne 'Raw') { + push @convTypes, 'ValueConv'; + push @convTypes, 'PrintConv' unless $type eq 'ValueConv'; + } + } else { + $tagInfo = $$self{TAG_INFO}{$tag}; + if ($$tagInfo{Struct} and ref $value) { + # must load XMPStruct.pl just in case (should already be loaded if + # a structure was extracted, but we could also arrive here if a simple + # list of values was stored incorrectly in a Struct tag) + require 'Image/ExifTool/XMPStruct.pl'; + # convert strucure field values + unless ($type eq 'Both') { + # (note: ConvertStruct handles the filtering and escaping too if necessary) + return Image::ExifTool::XMP::ConvertStruct($self,$tagInfo,$value,$type); + } + $valueConv = Image::ExifTool::XMP::ConvertStruct($self,$tagInfo,$value,'ValueConv'); + $value = Image::ExifTool::XMP::ConvertStruct($self,$tagInfo,$value,'PrintConv'); + # (must not save these in $$self{BOTH} because the values may have been escaped) + return ($valueConv, $value); + } + if ($type ne 'Raw') { + # use values we calculated already if we stored them + $both = $$self{BOTH}{$tag}; + if ($both) { + if ($type eq 'PrintConv') { + $value = $$both[1]; + } elsif ($type eq 'ValueConv') { + $value = $$both[0]; + $value = $$both[1] unless defined $value; + } else { + ($valueConv, $value) = @$both; + } + } else { + push @convTypes, 'ValueConv'; + push @convTypes, 'PrintConv' unless $type eq 'ValueConv'; + } + } + } + + # do the conversions + my (@val, @prt, @raw, $convType); + foreach $convType (@convTypes) { + # don't convert a scalar reference or structure + last if ref $value eq 'SCALAR' and not $$tagInfo{ConvertBinary}; + my $conv = $$tagInfo{$convType}; + unless (defined $conv) { + if ($convType eq 'ValueConv') { + next unless $$tagInfo{Binary}; + $conv = '\$val'; # return scalar reference for binary values + } else { + # use PRINT_CONV from tag table if PrintConv doesn't exist + next unless defined($conv = $$tagInfo{Table}{PRINT_CONV}); + next if exists $$tagInfo{$convType}; + } + } + # save old ValueConv value if we want Both + $valueConv = $value if $type eq 'Both' and $convType eq 'PrintConv'; + my ($i, $val, $vals, @values, $convList); + # split into list if conversion is an array + if (ref $conv eq 'ARRAY') { + $convList = $conv; + $conv = $$convList[0]; + my @valList = (ref $value eq 'ARRAY') ? @$value : split ' ', $value; + # reorganize list if specified (Note: The writer currently doesn't + # relist values, so they may be grouped but the order must not change) + my $relist = $$tagInfo{Relist}; + if ($relist) { + my (@newList, $oldIndex); + foreach $oldIndex (@$relist) { + my ($newVal, @join); + if (ref $oldIndex) { + foreach (@$oldIndex) { + push @join, $valList[$_] if defined $valList[$_]; + } + $newVal = join(' ', @join) if @join; + } else { + $newVal = $valList[$oldIndex]; + } + push @newList, $newVal if defined $newVal; + } + $value = \@newList; + } else { + $value = \@valList; + } + return () unless @$value; + } + # initialize array so we can iterate over values in list + if (ref $value eq 'ARRAY') { + if (defined $$tagInfo{RawJoin}) { + $val = join ' ', @$value; + } else { + $i = 0; + $vals = $value; + $val = $$vals[0]; + } + } else { + $val = $value; + } + # loop through all values in list + for (;;) { + if (defined $conv) { + # get values of required tags if this is a Composite tag + if (ref $val eq 'HASH' and not @val) { + # disable escape of source values so we don't double escape them + my $oldEscape = $$self{ESCAPE_PROC}; + delete $$self{ESCAPE_PROC}; + # temporarily delete filter so it isn't applied to the Require'd values + my $oldFilter = $$self{OPTIONS}{Filter}; + delete $$self{OPTIONS}{Filter}; + foreach (keys %$val) { + next unless defined $$val{$_}; + $raw[$_] = $$rawValue{$$val{$_}}; + ($val[$_], $prt[$_]) = $self->GetValue($$val{$_}, 'Both'); + next if defined $val[$_] or not $$tagInfo{Require}{$_}; + $$self{OPTIONS}{Filter} = $oldFilter if defined $oldFilter; + $$self{ESCAPE_PROC} = $oldEscape; + return (); + } + $$self{OPTIONS}{Filter} = $oldFilter if defined $oldFilter; + $$self{ESCAPE_PROC} = $oldEscape; + # set $val to $val[0], or \@val for a CODE ref conversion + $val = ref $conv eq 'CODE' ? \@val : $val[0]; + } + if (ref $conv eq 'HASH') { + # look up converted value in hash + if (not defined($value = $$conv{$val})) { + if ($$conv{BITMASK}) { + $value = DecodeBits($val, $$conv{BITMASK}, $$tagInfo{BitsPerWord}); + } else { + # use alternate conversion routine if available + if ($$conv{OTHER}) { + local $SIG{'__WARN__'} = \&SetWarning; + undef $evalWarning; + $value = &{$$conv{OTHER}}($val, undef, $conv); + $self->Warn("$convType $tag: " . CleanWarning()) if $evalWarning; + } + if (not defined $value) { + if ($$tagInfo{PrintHex} and $val and IsInt($val) and + $convType eq 'PrintConv') + { + $value = sprintf('Unknown (0x%x)',$val); + } else { + $value = "Unknown ($val)"; + } + } + } + } + # override with our localized language PrintConv if available + my $tmp; + if ($$self{CUR_LANG} and $convType eq 'PrintConv' and + # (no need to check for lang-alt tag names -- they won't have a PrintConv) + ref($tmp = $$self{CUR_LANG}{$$tagInfo{Name}}) eq 'HASH' and + ($tmp = $$tmp{PrintConv})) + { + if ($$conv{BITMASK} and not defined $$conv{$val}) { + my @vals = split ', ', $value; + foreach (@vals) { + $_ = $$tmp{$_} if defined $$tmp{$_}; + } + $value = join ', ', @vals; + } elsif (defined($tmp = $$tmp{$value})) { + $value = $self->Decode($tmp, 'UTF8'); + } + } + } else { + # call subroutine or do eval to convert value + local $SIG{'__WARN__'} = \&SetWarning; + undef $evalWarning; + if (ref $conv eq 'CODE') { + $value = &$conv($val, $self); + } else { + #### eval ValueConv/PrintConv ($val, $self, @val, @prt, @raw) + $value = eval $conv; + $@ and $evalWarning = $@; + } + $self->Warn("$convType $tag: " . CleanWarning()) if $evalWarning; + } + } else { + $value = $val; + } + last unless $vals; + # must store a separate copy of each binary data value in the list + if (ref $value eq 'SCALAR') { + my $tval = $$value; + $value = \$tval; + } + # save this converted value and step to next value in list + push @values, $value if defined $value; + if (++$i >= scalar(@$vals)) { + $value = \@values if @values; + last; + } + $val = $$vals[$i]; + if ($convList) { + my $nextConv = $$convList[$i]; + if ($nextConv and $nextConv eq 'REPEAT') { + undef $convList; + } else { + $conv = $nextConv; + } + } + } + # return undefined now if no value + return () unless defined $value; + # join back into single value if split for conversion list + if ($convList and ref $value eq 'ARRAY') { + $value = join($convType eq 'PrintConv' ? '; ' : ' ', @$value); + } + } + if ($type eq 'Both') { + # save both (unescaped) values because we often need them again + # (Composite tags need "Both" and often Require one tag for various Composite tags) + $$self{BOTH}{$tag} = [ $valueConv, $value ] unless $both; + # escape values if necessary + if ($$self{ESCAPE_PROC}) { + DoEscape($value, $$self{ESCAPE_PROC}); + if (defined $valueConv) { + DoEscape($valueConv, $$self{ESCAPE_PROC}); + } else { + $valueConv = $value; + } + } elsif (not defined $valueConv) { + # $valueConv is undefined if there was no print conversion done + $valueConv = $value; + } + $self->Filter($$self{OPTIONS}{Filter}, \$value); + # return Both values as a list (ValueConv, PrintConv) + return ($valueConv, $value); + } + # escape value if necessary + DoEscape($value, $$self{ESCAPE_PROC}) if $$self{ESCAPE_PROC}; + + # filter if necessary + $self->Filter($$self{OPTIONS}{Filter}, \$value) if $$self{OPTIONS}{Filter} and $type eq 'PrintConv'; + + if (ref $value eq 'ARRAY') { + if (defined $$self{OPTIONS}{ListItem}) { + $value = $$value[$$self{OPTIONS}{ListItem}]; + } elsif (wantarray) { + # return array if requested + return @$value; + } elsif ($type eq 'PrintConv' and not $$self{OPTIONS}{List} and not ref $$value[0]) { + # join PrintConv values in comma-separated string if List option not used + # and list contains simple scalars (otherwise return ARRAY ref) + $value = join $$self{OPTIONS}{ListSep}, @$value; + } + } + return $value; +} + +#------------------------------------------------------------------------------ +# Get tag identification number +# Inputs: 0) ExifTool object reference, 1) tag key +# Returns: Scalar context: tag ID if available, otherwise '' +# List context: 0) tag ID (or ''), 1) language code (or undef) +sub GetTagID($$) +{ + my ($self, $tag) = @_; + my $tagInfo = $$self{TAG_INFO}{$tag}; + return '' unless $tagInfo and defined $$tagInfo{TagID}; + my $id = $$tagInfo{KeysID} || $$tagInfo{TagID}; + return ($id, $$tagInfo{LangCode}) if wantarray; + return $id; +} + +#------------------------------------------------------------------------------ +# Get description for specified tag +# Inputs: 0) ExifTool object reference, 1) tag key +# Returns: Tag description +# Notes: Will always return a defined value, even if description isn't available +sub GetDescription($$) +{ + local $_; + my ($self, $tag) = @_; + my ($desc, $name); + my $tagInfo = $$self{TAG_INFO}{$tag}; + # ($tagInfo won't be defined for missing tags extracted with -f) + if ($tagInfo) { + # use alternate language description if available + while ($$self{CUR_LANG}) { + $desc = $$self{CUR_LANG}{$$tagInfo{Name}}; + if ($desc) { + # must look up Description if this tag also has a PrintConv + $desc = $$desc{Description} or last if ref $desc; + } else { + # look up default language of lang-alt tag + last unless $$tagInfo{LangCode} and + ($name = $$tagInfo{Name}) =~ s/-$$tagInfo{LangCode}$// and + $desc = $$self{CUR_LANG}{$name}; + $desc = $$desc{Description} or last if ref $desc; + $desc .= " ($$tagInfo{LangCode})"; + } + # escape description if necessary + DoEscape($desc, $$self{ESCAPE_PROC}) if $$self{ESCAPE_PROC}; + # return description in proper Charset + return $self->Decode($desc, 'UTF8'); + } + $desc = $$tagInfo{Description}; + } + # just make the tag more readable if description doesn't exist + unless ($desc) { + $desc = MakeDescription(GetTagName($tag)); + # save description in tag information + $$tagInfo{Description} = $desc if $tagInfo; + } + return $desc; +} + +#------------------------------------------------------------------------------ +# Get group name for specified tag +# Inputs: 0) ExifTool object reference +# 1) tag key (or reference to tagInfo hash, not part of the public API) +# 2) [optional] group family (-1 to get extended group list, or multiple +# families separated by colons to return multiple groups as a string) +# Returns: Scalar context: group name (for family 0 if not otherwise specified) +# List context: group name if family specified, otherwise list of +# group names for each family. Returns '' for undefined tag. +# Notes: Multiple families may be specified with ':' in family argument (eg. '1:2') +sub GetGroup($$;$) +{ + local $_; + my ($self, $tag, $family) = @_; + my ($tagInfo, @groups, @families, $simplify, $byTagInfo, $ex, $noID); + if (ref $tag eq 'HASH') { + $tagInfo = $tag; + $tag = $$tagInfo{Name}; + # set flag so we don't get extra information for an extracted tag + $byTagInfo = 1; + } else { + $tagInfo = $$self{TAG_INFO}{$tag} || { }; + $ex = $$self{TAG_EXTRA}{$tag}; + } + my $groups = $$tagInfo{Groups}; + # fill in default groups unless already done + # (after this, Groups 0-2 in tagInfo are guaranteed to be defined) + unless ($$tagInfo{GotGroups}) { + my $tagTablePtr = $$tagInfo{Table} || { GROUPS => { } }; + # construct our group list + $groups or $groups = $$tagInfo{Groups} = { }; + # fill in default groups + foreach (0..2) { + $$groups{$_} = $$tagTablePtr{GROUPS}{$_} || '' unless $$groups{$_}; + } + # set flag indicating group list was built + $$tagInfo{GotGroups} = 1; + } + if (defined $family and $family ne '-1') { + if ($family =~ /[^\d]/) { + @families = ($family =~ /\d+/g); + return(($ex && $$ex{G0}) || $$groups{0}) unless @families; + $simplify = 1 unless $family =~ /^:/; + undef $family; + foreach (0..2) { $groups[$_] = $$groups{$_}; } + $noID = 1 if @families == 1 and $families[0] != 7; + } else { + return(($ex && $$ex{"G$family"}) || $$groups{$family}) if $family == 0 or $family == 2; + $groups[1] = $$groups{1}; + } + } else { + return(($ex && $$ex{G0}) || $$groups{0}) unless wantarray; + foreach (0..2) { $groups[$_] = $$groups{$_}; } + } + $groups[3] = 'Main'; + $groups[4] = ($tag =~ /\((\d+)\)$/) ? "Copy$1" : ''; + # handle dynamic group names if necessary + unless ($byTagInfo) { + if ($ex) { + $groups[0] = $$ex{G0} if $$ex{G0}; + $groups[1] = $$ex{G1} =~ /^\+(.*)/ ? "$groups[1]$1" : $$ex{G1} if $$ex{G1}; + $groups[3] = 'Doc' . $$ex{G3} if $$ex{G3}; + $groups[5] = $$ex{G5} || $groups[1] if defined $$ex{G5}; + if (defined $$ex{G6}) { + $groups[5] = '' unless defined $groups[5]; # (can't leave a hole in the array) + $groups[6] = $$ex{G6}; + } + } + # generate tag ID group names unless obviously not needed + unless ($noID) { + my $id = $$tagInfo{KeysID} || $$tagInfo{TagID}; + if (not defined $id) { + $id = ''; # (just to be safe) + } elsif ($id =~ /^\d+$/) { + $id = sprintf('0x%x', $id) if $$self{OPTIONS}{HexTagIDs}; + } else { + $id =~ s/([^-_A-Za-z0-9])/sprintf('%.2x',ord $1)/ge; + } + $groups[7] = 'ID-' . $id; + defined $groups[$_] or $groups[$_] = '' foreach (5,6); + } + } + if ($family) { + return $groups[$family] || '' if $family > 0; + # add additional matching group names to list + # eg) for MIE-Doc, also add MIE1, MIE1-Doc, MIE-Doc1 and MIE1-Doc1 + # and for MIE2-Doc3, also add MIE2, MIE-Doc3, MIE2-Doc and MIE-Doc + if ($groups[1] =~ /^MIE(\d*)-(.+?)(\d*)$/) { + push @groups, 'MIE' . ($1 || '1'); + push @groups, 'MIE' . ($1 ? '' : '1') . "-$2$3"; + push @groups, "MIE$1-$2" . ($3 ? '' : '1'); + push @groups, 'MIE' . ($1 ? '' : '1') . "-$2" . ($3 ? '' : '1'); + } + } + if (@families) { + my @grps; + # create list of group names (without identical adjacent groups if simplifying) + foreach (@families) { + my $grp = $groups[$_]; + unless ($grp) { + next if $simplify; + $grp = ''; + } + push @grps, $grp unless $simplify and @grps and $grp eq $grps[-1]; + } + # remove leading "Main:" if simplifying + shift @grps if $simplify and @grps > 1 and $grps[0] eq 'Main'; + # return colon-separated string of group names + return join ':', @grps; + } + return @groups; +} + +#------------------------------------------------------------------------------ +# Get group names for specified tags +# Inputs: 0) ExifTool object reference +# 1) [optional] information hash reference (default all extracted info) +# 2) [optional] group family (default 0) +# Returns: List of group names in alphabetical order +sub GetGroups($;$$) +{ + local $_; + my $self = shift; + my $info = shift; + my $family; + + # figure out our arguments + if (ref $info ne 'HASH') { + $family = $info; + $info = $$self{VALUE}; + } else { + $family = shift; + } + $family = 0 unless defined $family; + + # get a list of all groups in specified information + my ($tag, %groups); + foreach $tag (keys %$info) { + $groups{ $self->GetGroup($tag, $family) } = 1; + } + return sort keys %groups; +} + +#------------------------------------------------------------------------------ +# Set priority for group where new values are written +# Inputs: 0) ExifTool object reference, +# 1-N) group names (reset to default if no groups specified) +# - used when new tag values are set (ie. before files are written) +sub SetNewGroups($;@) +{ + local $_; + my ($self, @groups) = @_; + @groups or @groups = @defaultWriteGroups; + my $count = @groups * 10; + my %priority; + foreach (@groups) { + $priority{lc($_)} = $count; + $count -= 10; + } + $priority{file} = 500; # 'File' group is always written (Comment) + $priority{composite} = 500; # 'Composite' group is always written + # set write priority (higher # is higher priority) + $$self{WRITE_PRIORITY} = \%priority; + $$self{WRITE_GROUPS} = \@groups; +} + +#------------------------------------------------------------------------------ +# Build Composite tags from Require'd/Desire'd tags +# Inputs: 0) ExifTool object reference +# Note: Tag values are calculated in alphabetical order unless a tag Require's +# or Desire's another Composite tag, in which case the calculation is +# deferred until after the other tag is calculated. +sub BuildCompositeTags($) +{ + local $_; + my $self = shift; + + $$self{BuildingComposite} = 1; + + my $compTable = GetTagTable('Image::ExifTool::Composite'); + my @tagList = sort keys %$compTable; + my $rawValue = $$self{VALUE}; + my $compKeys = $$self{COMP_KEYS}; + my (%cache, $allBuilt); + + for (;;) { + my (%notBuilt, $tag, @deferredTags); + foreach (@tagList) { + $notBuilt{$$compTable{$_}{Name}} = 1 unless $specialTags{$_}; + } +COMPOSITE_TAG: + foreach $tag (@tagList) { + next if $specialTags{$tag}; + my $tagInfo = $self->GetTagInfo($compTable, $tag); + next unless $tagInfo; + my $tagName = $$compTable{$tag}{Name}; + # put required tags into array and make sure they all exist + my $subDoc = ($$tagInfo{SubDoc} and $$self{DOC_COUNT}); + my $require = $$tagInfo{Require} || { }; + my $desire = $$tagInfo{Desire} || { }; + my $inhibit = $$tagInfo{Inhibit} || { }; + # loop through sub-documents if necessary + my $docNum = 0; + for (;;) { + my (%tagKey, $found, $index); + # save Require'd and Desire'd tag values in list + for ($index=0; ; ++$index) { + my $reqTag = $$require{$index} || $$desire{$index} || $$inhibit{$index}; + unless ($reqTag) { + # allow Composite with no Require'd or Desire'd tags + $found = 1 if $index == 0; + last; + } + if ($subDoc) { + # handle SubDoc tags specially to cache tag keys for faster + # processing when there are a large number of sub-documents + # - get document number from the tag groups if specified, + # otherwise we are looping through all documents for this tag + my $doc = $reqTag =~ s/\b(Main|Doc(\d+)):// ? ($2 || 0) : $docNum; + # make fast lookup for keys of this tag with specified groups other than doc group + # (similar to code in InsertTagValues(), but this is case-sensitive) + my $cacheTag = $cache{$reqTag}; + unless ($cacheTag) { + $cacheTag = $cache{$reqTag} = [ ]; + my $reqGroup; + $reqTag =~ s/^(.*):// and $reqGroup = $1; + my ($i, $key, @keys); + # build list of tag keys in order of precedence + for ($key=$reqTag, $i=$$self{DUPL_TAG}{$reqTag} || 0; ; --$i) { + push @keys, $key if defined $$rawValue{$key}; + last if $i <= 0; + $key = "$reqTag ($i)"; + } + @keys = $self->GroupMatches($reqGroup, \@keys) if defined $reqGroup; + if (@keys) { + my $ex = $$self{TAG_EXTRA}; + # loop through tags in reverse order of precedence so the higher + # priority tag will win in the case of duplicates within a doc + $$cacheTag[$$ex{$_} ? $$ex{$_}{G3} || 0 : 0] = $_ foreach reverse @keys; + } + } + # (set $reqTag to a bogus key if not found) + $reqTag = $$cacheTag[$doc] || "$reqTag (0)"; + } elsif ($reqTag =~ /^(.*):(.+)/) { + my ($reqGroup, $name) = ($1, $2); + if ($reqGroup eq 'Composite' and $notBuilt{$name}) { + # defer only until all other tags are built if + # we are inhibiting based on another Composite tag + unless ($$inhibit{$index} and $allBuilt) { + push @deferredTags, $tag; + next COMPOSITE_TAG; + } + } + # (CAREFUL! keys may not be sequential if one was deleted) + my ($i, $key, @keys); + for ($key=$name, $i=$$self{DUPL_TAG}{$name} || 0; ; --$i) { + push @keys, $key if defined $$rawValue{$key}; + last if $i <= 0; + $key = "$name ($i)"; + } + # find first matching tag + $key = $self->GroupMatches($reqGroup, \@keys); + $reqTag = $key || "$name (0)"; + } elsif ($notBuilt{$reqTag} and not $$inhibit{$index}) { + # calculate this tag later if it relies on another + # Composite tag which hasn't been calculated yet + push @deferredTags, $tag; + next COMPOSITE_TAG; + } + if (defined $$rawValue{$reqTag}) { + if ($$inhibit{$index}) { + $found = 0; + last; + } else { + $found = 1; + } + } elsif ($$require{$index}) { + $found = 0; + last; # don't continue since we require this tag + } + $tagKey{$index} = $reqTag; + } + if ($docNum) { + if ($found) { + $$self{DOC_NUM} = $docNum; + # save pointers to all used tag keys + foreach (keys %tagKey) { + $$compKeys{$_} or $$compKeys{$_} = [ ]; + push @{$$compKeys{$tagKey{$_}}}, [ \%tagKey, $_ ]; + } + $self->FoundTag($tagInfo, \%tagKey); + delete $$self{DOC_NUM}; + } + next if ++$docNum <= $$self{DOC_COUNT}; + last; + } elsif ($found) { + delete $notBuilt{$tagName}; # this tag is OK to build now + # keep track of all Require'd tag keys + foreach (keys %tagKey) { + # only tag keys with same name as a Composite tag + # can be replaced (also eliminates keys with + # instance numbers which can't be replaced either) + next unless $compositeID{$tagKey{$_}}; + } + # save pointers to all used tag keys + foreach (keys %tagKey) { + $$compKeys{$_} or $$compKeys{$_} = [ ]; + push @{$$compKeys{$tagKey{$_}}}, [ \%tagKey, $_ ]; + } + # save reference to tag key lookup as value for Composite tag + my $key = $self->FoundTag($tagInfo, \%tagKey); + } elsif (not defined $found) { + delete $notBuilt{$tagName}; # tag can't be built anyway + } + last unless $subDoc; + # don't process sub-documents if there is no chance to build this tag + # (can be very time-consuming if there are many docs) + if (%$require) { + foreach (keys %$require) { + my $reqTag = $$require{$_}; + $reqTag =~ s/.*://; + next COMPOSITE_TAG unless defined $$rawValue{$reqTag}; + } + $docNum = 1; # go ahead and process the 1st sub-document + } else { + my @try = ref $$tagInfo{SubDoc} ? @{$$tagInfo{SubDoc}} : keys %$desire; + # at least one of the specified desire tags must exist + foreach (@try) { + my $desTag = $$desire{$_} or next; + $desTag =~ s/.*://; + defined $$rawValue{$desTag} and $docNum = 1, last; + } + last unless $docNum; + } + } + } + last unless @deferredTags; + if (@deferredTags == @tagList) { + if ($allBuilt) { + # everything was deferred in the last pass, + # must be a circular dependency + warn "Circular dependency in Composite tags\n"; + last; + } + $allBuilt = 1; # try once more, ignoring Composite Inhibit tags + } + @tagList = @deferredTags; # calculate deferred tags now + } + delete $$self{BuildingComposite}; +} + +#------------------------------------------------------------------------------ +# Get reference to Composite tag info hash +# Inputs: 0) case-sensitive Composite tag name +# Returns: tagInfo hash or undef +sub GetCompositeTagInfo($) +{ + my $tag = shift; + return undef unless $compositeID{$tag}; + return $Image::ExifTool::Composite{$compositeID{$tag}[0]}; +} + +#------------------------------------------------------------------------------ +# Get tag name (removes copy index) +# Inputs: 0) Tag key +# Returns: Tag name +sub GetTagName($) +{ + local $_; + $_[0] =~ /^(\S+)/; + return $1; +} + +#------------------------------------------------------------------------------ +# Get list of shortcuts +# Returns: Shortcut list (sorted alphabetically) +sub GetShortcuts() +{ + local $_; + require Image::ExifTool::Shortcuts; + return sort keys %Image::ExifTool::Shortcuts::Main; +} + +#------------------------------------------------------------------------------ +# Get file type for specified extension +# Inputs: 0) file name or extension (case is not significant), +# or FileType value if a description is requested +# 1) flag to return long description instead of type ('0' to return any recognized type) +# Returns: File type (or desc) or undef if extension not supported or if +# description is the same as the input FileType. In list context, +# may return more than one file type if the file may be different formats. +# Returns list of all supported extensions if no file specified +sub GetFileType(;$$) +{ + local $_; + my ($file, $desc) = @_; + unless (defined $file) { + my @types; + if (defined $desc and $desc eq '0') { + # return all recognized types + @types = sort keys %fileTypeLookup; + } else { + # return all supported types + foreach (sort keys %fileTypeLookup) { + my $module = $moduleName{$_}; + $module = $moduleName{$fileTypeLookup{$_}} unless defined $module; + push @types, $_ unless defined $module and $module eq '0'; + } + } + return @types; + } + my ($fileType, $subType); + my $fileExt = GetFileExtension($file); + unless ($fileExt) { + if ($file =~ s/ \((.*)\)$//) { + $subType = $1; + $fileExt = GetFileExtension($file); + } + $fileExt = uc($file) unless $fileExt; + } + $fileExt and $fileType = $fileTypeLookup{$fileExt}; # look up the file type + $fileType = $fileTypeLookup{$fileType} while $fileType and not ref $fileType; + # return description if specified + # (allow input $file to be a FileType for this purpose) + if ($desc) { + if ($fileType) { + if ($static_vars{OverrideFileDescription} and $static_vars{OverrideFileDescription}{$fileExt}) { + $desc = $static_vars{OverrideFileDescription}{$fileExt}; + } else { + $desc = $$fileType[1]; + } + } else { + $desc = $fileDescription{$file}; + } + $desc .= ", $subType" if $subType; + return $desc; + } elsif ($fileType and (not defined $desc or $desc ne '0')) { + # return only supported file types + my $mod = $moduleName{$$fileType[0]}; + undef $fileType if defined $mod and $mod eq '0'; + } + $fileType or return (); + $fileType = $$fileType[0]; # get file type (or list of types) + if (wantarray) { + return @$fileType if ref $fileType eq 'ARRAY'; + } elsif ($fileType) { + $fileType = $fileExt if ref $fileType eq 'ARRAY'; + } + return $fileType; +} + +#------------------------------------------------------------------------------ +# Return true if we can write the specified file type +# Inputs: 0) file name or ext +# Returns: true if writable, 0 if not writable, undef if unrecognized +sub CanWrite($) +{ + local $_; + my $file = shift or return undef; + my ($type) = GetFileType($file) or return undef; + if ($noWriteFile{$type}) { + # can't write TIFF files with certain extensions (various RAW formats) + my $ext = GetFileExtension($file) || uc($file); + return grep(/^$ext$/, @{$noWriteFile{$type}}) ? 0 : 1 if $ext; + } + unless (%writeTypes) { + $writeTypes{$_} = 1 foreach @writeTypes; + } + return $writeTypes{$type}; +} + +#------------------------------------------------------------------------------ +# Return true if we can create the specified file type +# Inputs: 0) file name or ext +# Returns: true if creatable, 0 if not writable, undef if unrecognized +sub CanCreate($) +{ + local $_; + my $file = shift or return undef; + my $ext = GetFileExtension($file) || uc($file); + my $type = GetFileType($file) or return undef; + return 1 if $createTypes{$ext} or $createTypes{$type}; + return 0; +} + +#============================================================================== +# Functions below this are not part of the public API + +# Initialize member variables for reading or writing a new file +# Inputs: 0) ExifTool object reference +sub Init($) +{ + local $_; + my $self = shift; + # delete all DataMember variables (lower-case names) + foreach (keys %$self) { + /[a-z]/ and delete $$self{$_}; + } + undef %static_vars; # clear all static variables + delete $$self{FOUND_TAGS}; # list of found tags + delete $$self{EXIF_DATA}; # the EXIF data block + delete $$self{EXIF_POS}; # EXIF position in file + delete $$self{FIRST_EXIF_POS}; # position of first EXIF in file + delete $$self{HTML_DUMP}; # html dump information + delete $$self{SET_GROUP0}; # group0 name override + delete $$self{SET_GROUP1}; # group1 name override + delete $$self{DOC_NUM}; # current embedded document number + $$self{DOC_COUNT} = 0; # count of embedded documents processed + $$self{BASE} = 0; # base for offsets from start of file + $$self{FILE_ORDER} = { }; # * hash of tag order in file ('*' = based on tag key) + $$self{VALUE} = { }; # * hash of raw tag values + $$self{BOTH} = { }; # * hash for Value/PrintConv values of Require'd tags + $$self{RATIONAL} = { }; # * hash of original rational components + $$self{TAG_INFO} = { }; # * hash of tag information + $$self{TAG_EXTRA} = { }; # * hash of extra tag information (dynamic group names) + $$self{PRIORITY} = { }; # * priority of current tags + $$self{LIST_TAGS} = { }; # hash of tagInfo refs for active List-type tags + $$self{PROCESSED} = { }; # hash of processed directory start positions + $$self{DIR_COUNT} = { }; # count various types of directories + $$self{DUPL_TAG} = { }; # last-used index for duplicate-tag keys + $$self{WARNED_ONCE}= { }; # WarnOnce() warnings already issued + $$self{WRITTEN} = { }; # list of tags written (selected tags only) + $$self{FORCE_WRITE}= { }; # ForceWrite lookup (set from ForceWrite tag) + $$self{FOUND_DIR} = { }; # hash of directory names found in file + $$self{COMP_KEYS} = { }; # lookup for tag keys used in Composite tags + $$self{PATH} = [ ]; # current subdirectory path in file when reading + $$self{NUM_FOUND} = 0; # total number of tags found (incl. duplicates) + $$self{CHANGED} = 0; # number of tags changed (writer only) + $$self{INDENT} = ' '; # initial indent for verbose messages + $$self{PRIORITY_DIR} = ''; # the priority directory name + $$self{LOW_PRIORITY_DIR} = { PreviewIFD => 1 }; # names of priority 0 directories + $$self{TIFF_TYPE} = ''; # type of TIFF data (APP1, TIFF, NEF, etc...) + $$self{FMT_EXPR} = undef; # current advanced formatting expression + $$self{Make} = ''; # camera make + $$self{Model} = ''; # camera model + $$self{CameraType} = ''; # Olympus camera type + $$self{FileType} = ''; # identified file type + if ($self->Options('HtmlDump')) { + require Image::ExifTool::HtmlDump; + $$self{HTML_DUMP} = new Image::ExifTool::HtmlDump; + } + # make sure our TextOut is a file reference + $$self{OPTIONS}{TextOut} = \*STDOUT unless ref $$self{OPTIONS}{TextOut}; +} + +#------------------------------------------------------------------------------ +# Combine information from a list of info hashes +# Unless Duplicates is enabled, first entry found takes priority +# Inputs: 0) ExifTool object reference, 1-N) list of info hash references +# Returns: Combined information hash reference +sub CombineInfo($;@) +{ + local $_; + my $self = shift; + my (%combinedInfo, $info, $tag, %haveInfo); + + if ($$self{OPTIONS}{Duplicates}) { + while ($info = shift) { + foreach $tag (keys %$info) { + $combinedInfo{$tag} = $$info{$tag}; + } + } + } else { + while ($info = shift) { + foreach $tag (keys %$info) { + my $tagName = GetTagName($tag); + next if $haveInfo{$tagName}; + $haveInfo{$tagName} = 1; + $combinedInfo{$tag} = $$info{$tag}; + } + } + } + return \%combinedInfo; +} + +#------------------------------------------------------------------------------ +# Get tag table name +# Inputs: 0) ExifTool object reference, 1) tag key +# Returns: Table name if available, otherwise '' +sub GetTableName($$) +{ + my ($self, $tag) = @_; + my $tagInfo = $$self{TAG_INFO}{$tag} or return ''; + return $$tagInfo{Table}{SHORT_NAME}; +} + +#------------------------------------------------------------------------------ +# Get tag index number +# Inputs: 0) ExifTool object reference, 1) tag key +# Returns: Table index number, or undefined if this tag isn't indexed +sub GetTagIndex($$) +{ + my ($self, $tag) = @_; + my $tagInfo = $$self{TAG_INFO}{$tag} or return undef; + return $$tagInfo{Index}; +} + +#------------------------------------------------------------------------------ +# Find value for specified tag +# Inputs: 0) ExifTool ref, 1) tag name, 2) tag group (family 1) +# Returns: value or undef +sub FindValue($$$) +{ + my ($et, $tag, $grp) = @_; + my ($i, $val); + my $value = $$et{VALUE}; + for ($i=0; ; ++$i) { + my $key = $tag . ($i ? " ($i)" : ''); + last unless defined $$value{$key}; + if ($et->GetGroup($key, 1) eq $grp) { + $val = $$value{$key}; + last; + } + } + return $val; +} + +#------------------------------------------------------------------------------ +# Get tag key for next existing tag +# Inputs: 0) ExifTool ref, 1) tag key or case-sensitive tag name +# Returns: Key of next existing tag, or undef if no more +# Notes: This routine is provided for iterating through duplicate tags in the +# ValueConv of Composite tags. +sub NextTagKey($$) +{ + my ($self, $tag) = @_; + my $i = ($tag =~ s/ \((\d+)\)$//) ? $1 + 1 : 1; + $tag = "$tag ($i)"; + return $tag if defined $$self{VALUE}{$tag}; + return undef; +} + +#------------------------------------------------------------------------------ +# Split file name into directory and name parts +# Inptus: 0) file name +# Returns: 0) directory, 1) filename +sub SplitFileName($) +{ + my $file = shift; + my ($dir, $name); + if (eval { require File::Basename }) { + $dir = File::Basename::dirname($file); + $name = File::Basename::basename($file); + } else { + ($name = $file) =~ tr/\\/\//; + # remove path + $dir = length($1) ? $1 : '/' if $name =~ s/(.*)\///; + } + return ($dir, $name); +} + +#------------------------------------------------------------------------------ +# Encode file name for calls to system i/o routines +# Inputs: 0) ExifTool ref, 1) file name in CharSetFileName, 2) flag to force conversion +# Returns: true if Windows Unicode routines should be used (in which case +# the file name will be encoded as a null-terminated UTF-16LE string) +sub EncodeFileName($$;$) +{ + my ($self, $file, $force) = @_; + my $enc = $$self{OPTIONS}{CharsetFileName}; + if ($enc) { + if ($file =~ /[\x80-\xff]/ or $force) { + # encode for use in Windows Unicode functions if necessary + if ($^O eq 'MSWin32') { + local $SIG{'__WARN__'} = \&SetWarning; + if (eval { require Win32API::File }) { + # recode as UTF-16LE and add null terminator + $_[1] = $self->Decode($file, $enc, undef, 'UTF16', 'II') . "\0\0"; + return 1; + } + $self->WarnOnce('Install Win32API::File for Windows Unicode file support'); + } else { + # recode as UTF-8 for other platforms if necessary + $_[1] = $self->Decode($file, $enc, undef, 'UTF8') unless $enc eq 'UTF8'; + } + } + } elsif ($^O eq 'MSWin32' and $file =~ /[\x80-\xff]/ and not defined $enc) { + require Image::ExifTool::XMP; + if (Image::ExifTool::XMP::IsUTF8(\$file) < 0) { + $self->WarnOnce('FileName encoding not specified'); + } + } + return 0; +} + +#------------------------------------------------------------------------------ +# Modified perl open() routine to properly handle special characters in file names +# Inputs: 0) ExifTool ref, 1) filehandle, 2) filename, +# 3) mode: '<' or undef = read, '>' = write, '+<' = update +# Returns: true on success +# Note: Must call like "$et->Open(\*FH,$file)", not "$et->Open(FH,$file)" to avoid +# "unopened filehandle" errors due to a change in scope of the filehandle +sub Open($*$;$) +{ + my ($self, $fh, $file, $mode) = @_; + + $file =~ s/^([\s&])/.\/$1/; # protect leading whitespace or ampersand + # default to read mode ('<') unless input is a trusted pipe + $mode = (($file =~ /\|$/ and $$self{TRUST_PIPE}) ? '' : '<') unless $mode; + delete $$self{TRUST_PIPE}; + if ($mode) { + if ($self->EncodeFileName($file)) { + # handle Windows Unicode file name + local $SIG{'__WARN__'} = \&SetWarning; + my ($access, $create); + if ($mode eq '>') { + eval { + $access = Win32API::File::GENERIC_WRITE(); + $create = Win32API::File::CREATE_ALWAYS(); + } + } else { + eval { + $access = Win32API::File::GENERIC_READ(); + $access |= Win32API::File::GENERIC_WRITE() if $mode eq '+<'; # update + $create = Win32API::File::OPEN_EXISTING(); + } + } + my $share = 0; + eval { + unless ($access & Win32API::File::GENERIC_WRITE()) { + $share = Win32API::File::FILE_SHARE_READ() | Win32API::File::FILE_SHARE_WRITE(); + } + }; + my $wh = eval { Win32API::File::CreateFileW($file, $access, $share, [], $create, 0, []) }; + return undef unless $wh; + my $fd = eval { Win32API::File::OsFHandleOpenFd($wh, 0) }; + if (not defined $fd or $fd < 0) { + eval { Win32API::File::CloseHandle($wh) }; + return undef; + } + $file = "&=$fd"; # specify file by descriptor + } else { + # add leading space to protect against leading characters like '>' + # in file name, and trailing "\0" to protect trailing spaces + $file = " $file\0"; + } + } + return open $fh, "$mode$file"; +} + +#------------------------------------------------------------------------------ +# Check to see if a file exists (with Windows Unicode support) +# Inputs: 0) ExifTool ref, 1) file name +# Returns: true if file exists +sub Exists($$) +{ + my ($self, $file) = @_; + + if ($self->EncodeFileName($file)) { + local $SIG{'__WARN__'} = \&SetWarning; + my $wh = eval { Win32API::File::CreateFileW($file, + Win32API::File::GENERIC_READ(), + Win32API::File::FILE_SHARE_READ(), [], + Win32API::File::OPEN_EXISTING(), 0, []) }; + return 0 unless $wh; + eval { Win32API::File::CloseHandle($wh) }; + } else { + # (named pipes already exist, but we pretend that they don't + # so we will be able to write them, so test with for pipe -p) + return(-e $file and not -p $file); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Return true if file is a directory (with Windows Unicode support) +# Inputs: 0) ExifTool ref, 1) file name +# Returns: true if file is a directory (false if file isn't, or doesn't exist) +sub IsDirectory($$) +{ + my ($et, $file) = @_; + if ($et->EncodeFileName($file)) { + local $SIG{'__WARN__'} = \&SetWarning; + my $attrs = eval { Win32API::File::GetFileAttributesW($file) }; + my $dirBit = eval { Win32API::File::FILE_ATTRIBUTE_DIRECTORY() } || 0; + return 1 if $attrs and $attrs != 0xffffffff and $attrs & $dirBit; + } else { + return -d $file; + } + return 0; +} + +#------------------------------------------------------------------------------ +# Get file times (Unix seconds since the epoch) +# Inputs: 0) ExifTool ref, 1) file name or ref +# Returns: 0) access time, 1) modification time, 2) creation time (or undefs on error) +my $k32GetFileTime; +sub GetFileTime($$) +{ + my ($self, $file) = @_; + + # open file by name if necessary + unless (ref $file) { + local *FH; + unless ($self->Open(\*FH, $file)) { + if ($self->IsDirectory($file)) { + my @rtn = (stat $file)[8, 9, 10]; + return @rtn if defined $rtn[0]; + } + $self->Warn("GetFileTime error for '${file}'"); + return (); + } + $file = *FH; # (not \*FH, so *FH will be kept open until $file goes out of scope) + } + # on Windows, try to work around incorrect file times when daylight saving time is in effect + if ($^O eq 'MSWin32') { + if (not eval { require Win32::API }) { + $self->WarnOnce('Install Win32::API for proper handling of Windows file times'); + } elsif (not eval { require Win32API::File }) { + $self->WarnOnce('Install Win32API::File for proper handling of Windows file times'); + } else { + # get Win32 handle, needed for GetFileTime + my $win32Handle = eval { Win32API::File::GetOsFHandle($file) }; + unless ($win32Handle) { + $self->Warn("Win32API::File::GetOsFHandle returned invalid handle"); + return (); + } + # get FILETIME structs + my ($atime, $mtime, $ctime, $time); + $atime = $mtime = $ctime = pack 'LL', 0, 0; + unless ($k32GetFileTime) { + return () if defined $k32GetFileTime; + $k32GetFileTime = new Win32::API('KERNEL32', 'GetFileTime', 'NPPP', 'I'); + unless ($k32GetFileTime) { + $self->Warn('Error calling Win32::API::GetFileTime'); + $k32GetFileTime = 0; + return (); + } + } + unless ($k32GetFileTime->Call($win32Handle, $ctime, $atime, $mtime)) { + $self->Warn("Win32::API::GetFileTime returned " . Win32::GetLastError()); + return (); + } + # convert FILETIME structs to Unix seconds + foreach $time ($atime, $mtime, $ctime) { + my ($lo, $hi) = unpack 'LL', $time; # unpack FILETIME struct + # FILETIME is in 100 ns intervals since 0:00 UTC Jan 1, 1601 + # (89 leap years between 1601 and 1970) + $time = ($hi * 4294967296 + $lo) * 1e-7 - (((1970-1601)*365+89)*24*3600); + } + return ($atime, $mtime, $ctime); + } + } + # other os (or Windows fallback) + return (stat $file)[8, 9, 10]; +} + +#------------------------------------------------------------------------------ +# Parse function arguments and set member variables accordingly +# Inputs: Same as ImageInfo() +# - sets REQUESTED_TAGS, REQ_TAG_LOOKUP, IO_TAG_LIST, FILENAME, RAF, OPTIONS +sub ParseArguments($;@) +{ + my $self = shift; + my $options = $$self{OPTIONS}; + my @oldGroupOpts = grep /^Group/, keys %{$$self{OPTIONS}}; + my (@exclude, $wasExcludeOpt); + + $$self{REQUESTED_TAGS} = [ ]; + $$self{REQ_TAG_LOOKUP} = { }; + $$self{EXCL_TAG_LOOKUP} = { }; + $$self{IO_TAG_LIST} = undef; + delete $$self{EXCL_XMP_LOOKUP}; + + # handle our input arguments + while (@_) { + my $arg = shift; + if (ref $arg and not overload::Method($arg, q[""])) { + if (ref $arg eq 'ARRAY') { + $$self{IO_TAG_LIST} = $arg; + foreach (@$arg) { + if (/^-(.*)/) { + push @exclude, $1; + } else { + push @{$$self{REQUESTED_TAGS}}, $_; + } + } + } elsif (ref $arg eq 'HASH') { + my $opt; + foreach $opt (keys %$arg) { + # a single new group option overrides all old group options + if (@oldGroupOpts and $opt =~ /^Group/) { + foreach (@oldGroupOpts) { + delete $$options{$_}; + } + undef @oldGroupOpts; + } + $self->Options($opt, $$arg{$opt}); + $opt eq 'Exclude' and $wasExcludeOpt = 1; + } + } elsif (ref $arg eq 'SCALAR' or UNIVERSAL::isa($arg,'GLOB')) { + next if defined $$self{RAF}; + # convert image data from UTF-8 to character stream if necessary + # (patches RHEL 3 UTF8 LANG problem) + if (ref $arg eq 'SCALAR' and $] >= 5.006 and + (eval { require Encode; Encode::is_utf8($$arg) } or $@)) + { + # repack by hand if Encode isn't available + my $buff = $@ ? pack('C*',unpack($] < 5.010000 ? 'U0C*' : 'C0C*',$$arg)) : Encode::encode('utf8',$$arg); + $arg = \$buff; + } + $$self{RAF} = new File::RandomAccess($arg); + # set filename to empty string to indicate that + # we have a file but we didn't open it + $$self{FILENAME} = ''; + } elsif (UNIVERSAL::isa($arg, 'File::RandomAccess')) { + $$self{RAF} = $arg; + $$self{FILENAME} = ''; + } else { + warn "Don't understand ImageInfo argument $arg\n"; + } + } elsif (defined $$self{FILENAME}) { + if ($arg =~ /^-(.*)/) { + push @exclude, $1; + } else { + push @{$$self{REQUESTED_TAGS}}, $arg; + } + } else { + $$self{FILENAME} = $arg; + } + } + # add additional requested tags to lookup + if ($$options{RequestTags}) { + $$self{REQ_TAG_LOOKUP}{$_} = 1 foreach @{$$options{RequestTags}}; + } + # expand shortcuts in tag arguments if provided + if (@{$$self{REQUESTED_TAGS}}) { + ExpandShortcuts($$self{REQUESTED_TAGS}); + # initialize lookup for requested tags + foreach (@{$$self{REQUESTED_TAGS}}) { + /^(.*:)?([-\w?*]*)#?$/ or next; + $$self{REQ_TAG_LOOKUP}{lc($2)} = 1 if $2; + next unless $1; + $$self{REQ_TAG_LOOKUP}{lc($_).':'} = 1 foreach split /:/, $1; + } + } + if (@exclude or $wasExcludeOpt) { + # must add existing excluded tags + push @exclude, @{$$options{Exclude}} if $$options{Exclude}; + $$options{Exclude} = \@exclude; + # expand shortcuts in new exclude list + ExpandShortcuts($$options{Exclude}, 1); # (also remove '#' suffix) + } + # generate lookup for excluded tags + if ($$options{Exclude}) { + foreach (@{$$options{Exclude}}) { + /([-\w]+)#?$/ and $$self{EXCL_TAG_LOOKUP}{lc $1} = 1; + if (/(xmp-.*:[-\w]+)#?/i) { + $$self{EXCL_XMP_LOOKUP} or $$self{EXCL_XMP_LOOKUP} = { }; + $$self{EXCL_XMP_LOOKUP}{lc $1} = 1; + } + } + # exclude list is used only for EXCL_TAG_LOOKUP when TAGS_FROM_FILE is set + undef $$options{Exclude} if $$self{TAGS_FROM_FILE}; + } +} + +#------------------------------------------------------------------------------ +# Does group name match the tag ID? +# Inputs: 0) tag ID, 1) group name (with "ID-" removed) +# Returns: true on success +sub IsSameID($$) +{ + my ($id, $grp) = @_; + return 1 if $grp eq $id; # decimal ID's or raw ID's + if ($id =~ /^\d+$/) { # numerical numerical ID's may be in hex + return 1 if $grp =~ s/^0x0*// and $grp eq sprintf('%x', $id); + } else { # other ID's may conform to ExifTool group name conventions + return 1 if $id =~ s/([^-_A-Za-z0-9])/sprintf('%.2x',ord $1)/ge and $grp eq $id; + } + return 0; +} + +#------------------------------------------------------------------------------ +# Get list of tags in specified group +# Inputs: 0) ExifTool ref, 1) group spec, 2) tag key or reference to list of tag keys +# Returns: list of matching tags in list context, or first match in scalar context +# Notes: Group spec may contain multiple groups separated by colons, each +# possibly with a leading family number +sub GroupMatches($$$) +{ + my ($self, $group, $tagList) = @_; + $tagList = [ $tagList ] unless ref $tagList; + my ($tag, @matches); + # check each group name individually (eg. "Author:1IPTC") + my @grps = split ':', $group; + my (@fmys, $g); + for ($g=0; $g<@grps; ++$g) { + if ($grps[$g] =~ s/^(\d*)(id-)?//i) { + $fmys[$g] = $1 if length $1; + if ($2) { + $fmys[$g] = 7; + next; # (don't convert tag ID's to lower case) + } + } + $grps[$g] = lc $grps[$g]; + $grps[$g] = '' if $grps[$g] eq 'copy0'; # accept 'Copy0' for primary tag + } + foreach $tag (@$tagList) { + my @groups = $self->GetGroup($tag, -1); + for ($g=0; $g<@grps; ++$g) { + my $grp = $grps[$g]; + next if $grp eq '*' or $grp eq 'all'; + my $f; + if (defined($f = $fmys[$g])) { + last unless defined $groups[$f]; + if ($f == 7) { + next if IsSameID($self->GetTagID($tag), $grp); + } else { + next if $grp eq lc $groups[$f]; + } + last; + } else { + last unless grep /^$grp$/i, @groups; + } + } + if ($g == @grps) { + return $tag unless wantarray; + push @matches, $tag; + } + } + return wantarray ? @matches : $matches[0]; +} + +#------------------------------------------------------------------------------ +# Remove specified tags from returned tag list, updating indices in other lists +# Inputs: 0) tag list ref, 1) index list ref, 2) index list ref, 3) hash ref, +# 4) true to include tags from hash instead of excluding +# Returns: nothing, but updates input lists +sub RemoveTagsFromList($$$$;$) +{ + local $_; + my ($tags, $list1, $list2, $exclude, $inv) = @_; + my @filteredTags; + + if (@$list1 or @$list2) { + while (@$tags) { + my $tag = pop @$tags; + my $i = @$tags; + if ($$exclude{$tag} xor $inv) { + # remove index of excluded tag from each list + @$list1 = map { $_ < $i ? $_ : $_ == $i ? () : $_ - 1 } @$list1; + @$list2 = map { $_ < $i ? $_ : $_ == $i ? () : $_ - 1 } @$list2; + } else { + unshift @filteredTags, $tag; + } + } + } else { + foreach (@$tags) { + push @filteredTags, $_ unless $$exclude{$_} xor $inv; + } + } + $_[0] = \@filteredTags; # update tag list +} + +#------------------------------------------------------------------------------ +# Set list of found tags from previously requested tags +# Inputs: 0) ExifTool object reference +# Returns: 0) Reference to list of found tag keys (in order of requested tags) +# 1) Reference to list of indices for tags requested by value +# 2) Reference to list of indices for tags specified by wildcard or "all" +# Notes: index lists are returned in increasing order +sub SetFoundTags($) +{ + my $self = shift; + my $options = $$self{OPTIONS}; + my $reqTags = $$self{REQUESTED_TAGS} || [ ]; + my $duplicates = $$options{Duplicates}; + my $exclude = $$options{Exclude}; + my $fileOrder = $$self{FILE_ORDER}; + my @groupOptions = sort grep /^Group/, keys %$options; + my $doDups = $duplicates || $exclude || @groupOptions; + my ($tag, $rtnTags, @byValue, @wildTags); + + # only return requested tags if specified + if (@$reqTags) { + $rtnTags or $rtnTags = [ ]; + # scan through the requested tags and generate a list of tags we found + my $tagHash = $$self{VALUE}; + my $reqTag; + foreach $reqTag (@$reqTags) { + my (@matches, $group, $allGrp, $allTag, $byValue); + if ($reqTag =~ /^(.*):(.+)/) { + ($group, $tag) = ($1, $2); + if ($group =~ /^(\*|all)$/i) { + $allGrp = 1; + } elsif ($group !~ /^[-\w:]*$/) { + $self->Warn("Invalid group name '${group}'"); + $group = 'invalid'; + } + } else { + $tag = $reqTag; + } + $byValue = 1 if $tag =~ s/#$// and $$options{PrintConv}; + if (defined $$tagHash{$reqTag} and not $doDups) { + $matches[0] = $tag; + } elsif ($tag =~ /^(\*|all)$/i) { + # tag name of '*' or 'all' matches all tags + if ($doDups or $allGrp) { + @matches = grep(!/#/, keys %$tagHash); + } else { + @matches = grep(!/ /, keys %$tagHash); + } + next unless @matches; # don't want entry in list for '*' tag + $allTag = 1; + } elsif ($tag =~ /[*?]/) { + # allow wildcards in tag names + $tag =~ s/\*/[-\\w]*/g; + $tag =~ s/\?/[-\\w]/g; + $tag .= '( \\(.*)?' if $doDups or $allGrp; + @matches = grep(/^$tag$/i, keys %$tagHash); + next unless @matches; # don't want entry in list for wildcard tags + $allTag = 1; + } elsif ($doDups or defined $group) { + # must also look for tags like "Tag (1)" + # (but be sure not to match temporary ValueConv entries like "Tag #") + @matches = grep(/^$tag( \(|$)/i, keys %$tagHash); + } elsif ($tag =~ /^[-\w]+$/) { + # find first matching value + # (use in list context to return value instead of count) + ($matches[0]) = grep /^$tag$/i, keys %$tagHash; + defined $matches[0] or undef @matches; + } else { + $self->Warn("Invalid tag name '${tag}'"); + } + if (defined $group and not $allGrp) { + # keep only specified group + @matches = $self->GroupMatches($group, \@matches); + next unless @matches or not $allTag; + } + if (@matches > 1) { + # maintain original file order for multiple tags + @matches = sort { $$fileOrder{$a} <=> $$fileOrder{$b} } @matches; + # return only the highest priority tag unless duplicates wanted + unless ($doDups or $allTag or $allGrp) { + $tag = shift @matches; + my $oldPriority = $$self{PRIORITY}{$tag} || 1; + foreach (@matches) { + my $priority = $$self{PRIORITY}{$_}; + $priority = 1 unless defined $priority; + next unless $priority >= $oldPriority; + $tag = $_; + $oldPriority = $priority || 1; + } + @matches = ( $tag ); + } + } elsif (not @matches) { + # put entry in return list even without value (value is undef) + $matches[0] = $byValue ? "$tag #(0)" : "$tag (0)"; + # bogus file order entry to avoid warning if sorting in file order + $$self{FILE_ORDER}{$matches[0]} = 9999; + } + # save indices of tags extracted by value + push @byValue, scalar(@$rtnTags) .. (scalar(@$rtnTags)+scalar(@matches)-1) if $byValue; + # save indices of wildcard tags + push @wildTags, scalar(@$rtnTags) .. (scalar(@$rtnTags)+scalar(@matches)-1) if $allTag; + push @$rtnTags, @matches; + } + } else { + # no requested tags, so we want all tags + my @allTags; + if ($doDups) { + @allTags = keys %{$$self{VALUE}}; + } else { + # only include tag if it doesn't end in a copy number + @allTags = grep(!/ /, keys %{$$self{VALUE}}); + } + $rtnTags = \@allTags; + } + + # filter excluded tags and group options + while (($exclude or @groupOptions) and @$rtnTags) { + if ($exclude) { + my ($pat, %exclude); + foreach $pat (@$exclude) { + my $group; + if ($pat =~ /^(.*):(.+)/) { + ($group, $tag) = ($1, $2); + if ($group =~ /^(\*|all)$/i) { + undef $group; + } elsif ($group !~ /^[-\w:]*$/) { + $self->Warn("Invalid group name '${group}'"); + $group = 'invalid'; + } + } else { + $tag = $pat; + } + my @matches; + if ($tag =~ /^(\*|all)$/i) { + @matches = @$rtnTags; + } else { + # allow wildcards in tag names + $tag =~ s/\*/[-\\w]*/g; + $tag =~ s/\?/[-\\w]/g; + @matches = grep(/^$tag( |$)/i, @$rtnTags); + } + @matches = $self->GroupMatches($group, \@matches) if $group and @matches; + $exclude{$_} = 1 foreach @matches; + } + if (%exclude) { + # remove excluded tags from return list(s) + RemoveTagsFromList($rtnTags, \@byValue, \@wildTags, \%exclude); + last unless @$rtnTags; # all done if nothing left + } + last if $duplicates and not @groupOptions; + } + # filter groups if requested, or to remove duplicates + my (%keepTags, %wantGroup, $family, $groupOpt); + my $allGroups = 1; + # build hash of requested/excluded group names for each group family + my $wantOrder = 0; + foreach $groupOpt (@groupOptions) { + $groupOpt =~ /^Group(\d*(:\d+)*)/ or next; + $family = $1 || 0; + $wantGroup{$family} or $wantGroup{$family} = { }; + my $groupList; + if (ref $$options{$groupOpt} eq 'ARRAY') { + $groupList = $$options{$groupOpt}; + } else { + $groupList = [ $$options{$groupOpt} ]; + } + foreach (@$groupList) { + # groups have priority in order they were specified + ++$wantOrder; + my ($groupName, $want); + if (/^-(.*)/) { + # excluded group begins with '-' + $groupName = $1; + $want = 0; # we don't want tags in this group + } else { + $groupName = $_; + $want = $wantOrder; # we want tags in this group + $allGroups = 0; # don't want all groups if we requested one + } + $wantGroup{$family}{$groupName} = $want; + } + } + # loop through all tags and decide which ones we want + my (@tags, %bestTag); +GR_TAG: foreach $tag (@$rtnTags) { + my $wantTag = $allGroups; # want tag by default if want all groups + foreach $family (keys %wantGroup) { + my $group = $self->GetGroup($tag, $family); + my $wanted = $wantGroup{$family}{$group}; + next unless defined $wanted; + next GR_TAG unless $wanted; # skip tag if group excluded + # take lowest non-zero want flag + next if $wantTag and $wantTag < $wanted; + $wantTag = $wanted; + } + next unless $wantTag; + $duplicates and $keepTags{$tag} = 1, next; + # determine which tag we want to keep + my $tagName = GetTagName($tag); + my $bestTag = $bestTag{$tagName}; + if (defined $bestTag) { + next if $wantTag > $keepTags{$bestTag}; + if ($wantTag == $keepTags{$bestTag}) { + # want two tags with the same name -- keep the latest one + if ($tag =~ / \((\d+)\)$/) { + my $tagNum = $1; + next if $bestTag !~ / \((\d+)\)$/ or $1 > $tagNum; + } + } + # this tag is better, so delete old best tag + delete $keepTags{$bestTag}; + } + $keepTags{$tag} = $wantTag; # keep this tag (for now...) + $bestTag{$tagName} = $tag; # this is our current best tag + } + # include only tags we want to keep in return lists + RemoveTagsFromList($rtnTags, \@byValue, \@wildTags, \%keepTags, 1); + last; + } + $$self{FOUND_TAGS} = $rtnTags; # save found tags + + # return reference to found tag keys (and list of indices of tags to extract by value) + return wantarray ? ($rtnTags, \@byValue, \@wildTags) : $rtnTags; +} + +#------------------------------------------------------------------------------ +# Utility to load our write routines if required (called via AUTOLOAD) +# Inputs: 0) autoload function, 1-N) function arguments +# Returns: result of function or dies if function not available +sub DoAutoLoad(@) +{ + my $autoload = shift; + my @callInfo = split(/::/, $autoload); + my $file = 'Image/ExifTool/Write'; + + return if $callInfo[$#callInfo] eq 'DESTROY'; + if (@callInfo == 4) { + # load Image/ExifTool/WriteMODULE.pl + $file .= "$callInfo[2].pl"; + } elsif ($callInfo[-1] eq 'ShiftTime') { + $file = 'Image/ExifTool/Shift.pl'; # load Shift.pl + } else { + # load Image/ExifTool/Writer.pl + $file .= 'r.pl'; + } + # attempt to load the package + eval { require $file } or die "Error while attempting to call $autoload\n$@\n"; + unless (defined &$autoload) { + my @caller = caller(0); + # reproduce Perl's standard 'undefined subroutine' message: + die "Undefined subroutine $autoload called at $caller[1] line $caller[2]\n"; + } + no strict 'refs'; + return &$autoload(@_); # call the function +} + +#------------------------------------------------------------------------------ +# AutoLoad our writer routines when necessary +# +sub AUTOLOAD +{ + return DoAutoLoad($AUTOLOAD, @_); +} + +#------------------------------------------------------------------------------ +# Add warning tag +# Inputs: 0) ExifTool object reference, 1) warning message +# 2) true if minor (2 if behaviour changes when warning is ignored, +# or 3 if warning shouldn't be issued when Validate option is used) +# Returns: true if warning tag was added +sub Warn($$;$) +{ + my ($self, $str, $ignorable) = @_; + if ($ignorable) { + return 0 if $$self{OPTIONS}{IgnoreMinorErrors}; + return 0 if $ignorable eq '3' and $$self{OPTIONS}{Validate}; + $str = $ignorable eq '2' ? "[Minor] $str" : "[minor] $str"; + } + $self->FoundTag('Warning', $str); + return 1; +} + +#------------------------------------------------------------------------------ +# Add warning tag only once per processed file +# Inputs: 0) ExifTool object reference, 1) warning message, 2) true if minor +# Returns: true if warning tag was added +sub WarnOnce($$;$) +{ + my ($self, $str, $ignorable) = @_; + return 0 if $ignorable and $$self{OPTIONS}{IgnoreMinorErrors}; + unless ($$self{WARNED_ONCE}{$str}) { + $self->Warn($str, $ignorable); + $$self{WARNED_ONCE}{$str} = 1; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Add error tag +# Inputs: 0) ExifTool object reference, 1) error message, 2) true if minor +# Returns: true if error tag was added, otherwise warning was added +sub Error($$;$) +{ + my ($self, $str, $ignorable) = @_; + if ($$self{DemoteErrors}) { + $self->Warn($str) and ++$$self{DemoteErrors}; + return 1; + } elsif ($ignorable) { + $$self{OPTIONS}{IgnoreMinorErrors} and $self->Warn($str), return 0; + $str = "[minor] $str"; + } + $self->FoundTag('Error', $str); + return 1; +} + +#------------------------------------------------------------------------------ +# Expand shortcuts +# Inputs: 0) reference to list of tags, 1) set to remove trailing '#' +# Notes: Handles leading '-' for excluded tags, trailing '#' for ValueConv, +# multiple group names, and redirected tags +sub ExpandShortcuts($;$) +{ + my ($tagList, $removeSuffix) = @_; + return unless $tagList and @$tagList; + + require Image::ExifTool::Shortcuts; + + # expand shortcuts + my $suffix = $removeSuffix ? '' : '#'; + my @expandedTags; + my ($entry, $tag, $excl); + foreach $entry (@$tagList) { + # skip things like options hash references in list + if (ref $entry) { + push @expandedTags, $entry; + next; + } + # remove leading '-' + ($excl, $tag) = $entry =~ /^(-?)(.*)/s; + my ($post, @post, $pre, $v); + # handle redirection + if (not $excl and $tag =~ /(.+?)([-+]?[<>].+)/s) { + ($tag, $post) = ($1, $2); + if ($post =~ /^[-+]?>/ or $post !~ /\$/) { + # expand shortcuts in postfix (rhs of redirection) + my ($op, $p2, $t2) = ($post =~ /([-+]?[<>])(.+:)?(.+)/); + $p2 = '' unless defined $p2; + $v = ($t2 =~ s/#$//) ? $suffix : ''; # ValueConv suffix + my ($match) = grep /^\Q$t2\E$/i, keys %Image::ExifTool::Shortcuts::Main; + if ($match) { + foreach (@{$Image::ExifTool::Shortcuts::Main{$match}}) { + /^-/ and next; # ignore excluded tags + if ($p2 and /(.+:)(.+)/) { + push @post, "$op$_$v"; + } else { + push @post, "$op$p2$_$v"; + } + } + next unless @post; + $post = shift @post; + } + } + } else { + $post = ''; + } + # handle group names + if ($tag =~ /(.+:)(.+)/) { + ($pre, $tag) = ($1, $2); + } else { + $pre = ''; + } + $v = ($tag =~ s/#$//) ? $suffix : ''; # ValueConv suffix + # loop over all postfixes + for (;;) { + # expand the tag name + my ($match) = grep /^\Q$tag\E$/i, keys %Image::ExifTool::Shortcuts::Main; + if ($match) { + if ($excl) { + # entry starts with '-', so exclude all tags in this shortcut + foreach (@{$Image::ExifTool::Shortcuts::Main{$match}}) { + /^-/ and next; # ignore excluded exclude tags + # group of expanded tag takes precedence + if ($pre and /(.+:)(.+)/) { + push @expandedTags, "$excl$_"; + } else { + push @expandedTags, "$excl$pre$_"; + } + } + } elsif (length $pre or length $post or $v) { + foreach (@{$Image::ExifTool::Shortcuts::Main{$match}}) { + /(-?)(.+:)?(.+)/; + if ($2) { + # group from expanded tag takes precedence + push @expandedTags, "$_$v$post"; + } else { + push @expandedTags, "$1$pre$3$v$post"; + } + } + } else { + push @expandedTags, @{$Image::ExifTool::Shortcuts::Main{$match}}; + } + } else { + push @expandedTags, "$excl$pre$tag$v$post"; + } + last unless @post; + $post = shift @post; + } + } + @$tagList = @expandedTags; +} + +#------------------------------------------------------------------------------ +# Add hash of Composite tags to our composites +# Inputs: 0) hash reference to table of Composite tags to add or module name, +# 1) override existing tag definition +sub AddCompositeTags($;$) +{ + local $_; + my ($add, $override) = @_; + my ($module, $prefix, $tagID); + unless (ref $add) { + ($prefix = $add) =~ s/.*:://; + $module = $add; + $add .= '::Composite'; + no strict 'refs'; + $add = \%$add; + $prefix .= '-'; + } else { + $prefix = 'UserDefined-'; + } + my $defaultGroups = $$add{GROUPS}; + my $compTable = GetTagTable('Image::ExifTool::Composite'); + + # make sure default groups are defined in families 0 and 1 + if ($defaultGroups) { + $$defaultGroups{0} or $$defaultGroups{0} = 'Composite'; + $$defaultGroups{1} or $$defaultGroups{1} = 'Composite'; + $$defaultGroups{2} or $$defaultGroups{2} = 'Other'; + } else { + $defaultGroups = $$add{GROUPS} = { 0 => 'Composite', 1 => 'Composite', 2 => 'Other' }; + } + SetupTagTable($add); # generate Name, TagID, etc + foreach $tagID (sort keys %$add) { + next if $specialTags{$tagID}; # must skip special tags + my $tagInfo = $$add{$tagID}; + my $new = $prefix . $tagID; # new tag ID for Composite table + $$tagInfo{Module} = $module if $$tagInfo{Writable}; + $$tagInfo{Override} = 1 if $override and not defined $$tagInfo{Override}; + $$tagInfo{IsComposite} = 1; + # handle Composite tags with the same name + if ($compositeID{$tagID}) { + # determine if we want to override this tag + # (=0 keep both, >0 override, <0 keep existing) + my $over = ($$tagInfo{Override} || 0) - ($$compTable{$compositeID{$tagID}[0]}{Override} || 0); + next if $over < 0; + if ($over) { + # remove existing tags with this ID + delete $$compTable{$_} foreach @{$compositeID{$tagID}}; + delete $compositeID{$tagID}; + } + } + # make sure new TagID is unique by adding index if necessary + # (could only happen for UserDefined tags now that module name is added to tag ID) + my $n = 0; + while ($$compTable{$new}) { + $new =~ s/-\d+$// if $n++; + $new .= "-$n"; + } + # use new ID and save it so we can use it in TagLookup + $$tagInfo{NewTagID} = $new unless $tagID eq $new; + + # add new ID to lookup of Composite tag ID's + $compositeID{$tagID} = [ ] unless $compositeID{$tagID}; + unshift @{$compositeID{$tagID}}, $new; # (most recent one first) + + # convert scalar Require/Desire/Inhibit entries + my ($type, @hashes, @scalars, %used); + foreach $type ('Require','Desire','Inhibit') { + my $req = $$tagInfo{$type} or next; + push @{ref($req) eq 'HASH' ? \@hashes : \@scalars}, $type; + } + if (@scalars) { + # make lookup for indices that are used + foreach $type (@hashes) { + $used{$_} = 1 foreach keys %{$$tagInfo{$type}}; + } + my $next = 0; + foreach $type (@scalars) { + ++$next while $used{$next}; + $$tagInfo{$type} = { $next++ => $$tagInfo{$type} }; + } + } + # add this Composite tag to our main Composite table + $$tagInfo{Table} = $compTable; + # (use the original TagID, even if we changed it, so don't do this:) + $$tagInfo{TagID} = $new; + # save tag under new ID in Composite table + $$compTable{$new} = $tagInfo; + # set all default groups in tag + my $groups = $$tagInfo{Groups}; + $groups or $groups = $$tagInfo{Groups} = { }; + # fill in default groups + foreach (keys %$defaultGroups) { + $$groups{$_} or $$groups{$_} = $$defaultGroups{$_}; + } + # set flag indicating group list was built + $$tagInfo{GotGroups} = 1; + } +} + +#------------------------------------------------------------------------------ +# Add tags to TagLookup (used for writing) +# Inputs: 0) source hash of tag definitions, 1) name of destination tag table +sub AddTagsToLookup($$) +{ + my ($tagHash, $table) = @_; + if (defined &Image::ExifTool::TagLookup::AddTags) { + Image::ExifTool::TagLookup::AddTags($tagHash, $table); + } elsif (not $Image::ExifTool::pluginTags{$tagHash}) { + # queue these tags until TagLookup is loaded + push @Image::ExifTool::pluginTags, [ $tagHash, $table ]; + # set flag so we don't load same tags twice + $Image::ExifTool::pluginTags{$tagHash} = 1; + } +} + +#------------------------------------------------------------------------------ +# Expand tagInfo Flags +# Inputs: 0) tagInfo hash ref +# Notes: $$tagInfo{Flags} must be defined to call this routine +sub ExpandFlags($) +{ + my $tagInfo = shift; + my $flags = $$tagInfo{Flags}; + if (ref $flags eq 'ARRAY') { + foreach (@$flags) { + $$tagInfo{$_} = 1; + } + } elsif (ref $flags eq 'HASH') { + my $key; + foreach $key (keys %$flags) { + $$tagInfo{$key} = $$flags{$key}; + } + } else { + $$tagInfo{$flags} = 1; + } +} + +#------------------------------------------------------------------------------ +# Set up tag table (must be done once for each tag table used) +# Inputs: 0) Reference to tag table +# Notes: - generates 'Name' field from key if it doesn't exist +# - stores 'Table' pointer and 'TagID' value +# - expands 'Flags' for quick lookup +sub SetupTagTable($) +{ + my $tagTablePtr = shift; + my $avoid = $$tagTablePtr{AVOID}; + my ($tagID, $tagInfo); + foreach $tagID (TagTableKeys($tagTablePtr)) { + my @infoArray = GetTagInfoList($tagTablePtr,$tagID); + # process conditional tagInfo arrays + foreach $tagInfo (@infoArray) { + $$tagInfo{Table} = $tagTablePtr; + $$tagInfo{TagID} = $tagID; + $$tagInfo{Name} or $$tagInfo{Name} = MakeTagName($tagID); + $$tagInfo{Flags} and ExpandFlags($tagInfo); + $$tagInfo{Avoid} = $avoid if defined $avoid; + # calculate BitShift from Mask if necessary + if ($$tagInfo{Mask} and not defined $$tagInfo{BitShift}) { + my ($mask, $bitShift) = ($$tagInfo{Mask}, 0); + ++$bitShift until $mask & (1 << $bitShift); + $$tagInfo{BitShift} = $bitShift; + } + } + next unless @infoArray > 1; + # add an "Index" member to each tagInfo in a list + my $index = 0; + foreach $tagInfo (@infoArray) { + $$tagInfo{Index} = $index++; + } + } +} + +#------------------------------------------------------------------------------ +# Utilities to check for numerical types +# Inputs: 0) value; Returns: true if value is a numerical type +# Notes: May change commas to decimals in floats for use in other locales +sub IsFloat($) { + return 1 if $_[0] =~ /^[+-]?(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/; + # allow comma separators (for other locales) + return 0 unless $_[0] =~ /^[+-]?(?=\d|,\d)\d*(,\d*)?([Ee]([+-]?\d+))?$/; + $_[0] =~ tr/,/./; # but translate ',' to '.' + return 1; +} +sub IsInt($) { return scalar($_[0] =~ /^[+-]?\d+$/); } +sub IsHex($) { return scalar($_[0] =~ /^(0x)?[0-9a-f]{1,8}$/i); } +sub IsRational($) { return scalar($_[0] =~ m{^[-+]?\d+/\d+$}); } + +# round floating point value to specified number of significant digits +# Inputs: 0) value, 1) number of sig digits; Returns: rounded number +sub RoundFloat($$) +{ + my ($val, $sig) = @_; + return sprintf("%.${sig}g", $val); +} + +# Convert strings to floating point numbers (or undef) +# Inputs: 0-N) list of strings (may be undef) +# Returns: last value converted +sub ToFloat(@) +{ + local $_; + foreach (@_) { + next unless defined $_; + # (add 0 to convert "0.0" to "0" for tests) + $_ = /((?:[+-]?)(?=\d|\.\d)\d*(?:\.\d*)?(?:[Ee](?:[+-]?\d+))?)/ ? $1 + 0 : undef; + } + return $_[-1]; +} + +#------------------------------------------------------------------------------ +# Utility routines to for reading binary data values from file + +my %unpackMotorola = ( S => 'n', L => 'N', C => 'C', c => 'c' ); +my %unpackIntel = ( S => 'v', L => 'V', C => 'C', c => 'c' ); +my %unpackRev = ( N => 'V', V => 'N', C => 'C', n => 'v', v => 'n', c => 'c' ); + +# the following 4 variables are defined in 'use vars' instead of using 'my' +# because mod_perl 5.6.1 apparently has a problem with setting file-scope 'my' +# variables from within subroutines (ref communication with Pavel Merdin): +# $swapBytes - set if EXIF header is not native byte ordering +# $swapWords - swap 32-bit words in doubles (ARM quirk) +$currentByteOrder = 'MM'; # current byte ordering ('II' or 'MM') +%unpackStd = %unpackMotorola; + +# Swap bytes in data if necessary +# Inputs: 0) data, 1) number of bytes +# Returns: swapped data +sub SwapBytes($$) +{ + return $_[0] unless $swapBytes; + my ($val, $bytes) = @_; + my $newVal = ''; + $newVal .= substr($val, $bytes, 1) while $bytes--; + return $newVal; +} +# Swap words. Inputs: 8 bytes of data, Returns: swapped data +sub SwapWords($) +{ + return $_[0] unless $swapWords and length($_[0]) == 8; + return substr($_[0],4,4) . substr($_[0],0,4) +} + +# Unpack value, letting unpack() handle byte swapping +# Inputs: 0) unpack template, 1) data reference, 2) offset +# Returns: unpacked number +# - uses value of %unpackStd to determine the unpack template +# - can only be called for 'S' or 'L' templates since these are the only +# templates for which you can specify the byte ordering. +sub DoUnpackStd(@) +{ + $_[2] and return unpack("x$_[2] $unpackStd{$_[0]}", ${$_[1]}); + return unpack($unpackStd{$_[0]}, ${$_[1]}); +} +# same, but with reversed byte order +sub DoUnpackRev(@) +{ + my $fmt = $unpackRev{$unpackStd{$_[0]}}; + $_[2] and return unpack("x$_[2] $fmt", ${$_[1]}); + return unpack($fmt, ${$_[1]}); +} +# Pack value +# Inputs: 0) template, 1) value, 2) data ref (or undef), 3) offset (if data ref) +# Returns: packed value +sub DoPackStd(@) +{ + my $val = pack($unpackStd{$_[0]}, $_[1]); + $_[2] and substr(${$_[2]}, $_[3], length($val)) = $val; + return $val; +} +# same, but with reversed byte order +sub DoPackRev(@) +{ + my $val = pack($unpackRev{$unpackStd{$_[0]}}, $_[1]); + $_[2] and substr(${$_[2]}, $_[3], length($val)) = $val; + return $val; +} + +# Unpack value, handling the byte swapping manually +# Inputs: 0) # bytes, 1) unpack template, 2) data reference, 3) offset +# Returns: unpacked number +# - uses value of $swapBytes to determine byte ordering +sub DoUnpack(@) +{ + my ($bytes, $template, $dataPt, $pos) = @_; + my $val; + if ($swapBytes) { + $val = ''; + $val .= substr($$dataPt,$pos+$bytes,1) while $bytes--; + } else { + $val = substr($$dataPt,$pos,$bytes); + } + defined($val) or return undef; + return unpack($template,$val); +} + +# Unpack double value +# Inputs: 0) unpack template, 1) data reference, 2) offset +# Returns: unpacked number +sub DoUnpackDbl(@) +{ + my ($template, $dataPt, $pos) = @_; + my $val = substr($$dataPt,$pos,8); + defined($val) or return undef; + # swap bytes and 32-bit words (ARM quirk) if necessary, then unpack value + return unpack($template, SwapWords(SwapBytes($val, 8))); +} + +# Inputs: 0) data reference, 1) offset into data +sub Get8s($$) { return DoUnpackStd('c', @_); } +sub Get8u($$) { return DoUnpackStd('C', @_); } +sub Get16s($$) { return DoUnpack(2, 's', @_); } +sub Get16u($$) { return DoUnpackStd('S', @_); } +sub Get32s($$) { return DoUnpack(4, 'l', @_); } +sub Get32u($$) { return DoUnpackStd('L', @_); } +sub GetFloat($$) { return DoUnpack(4, 'f', @_); } +sub GetDouble($$) { return DoUnpackDbl('d', @_); } +sub Get16uRev($$) { return DoUnpackRev('S', @_); } +sub Get32uRev($$) { return DoUnpackRev('L', @_); } + +# rationals may be a floating point number, 'inf' or 'undef' +my ($ratNumer, $ratDenom); +sub GetRational32s($$) +{ + my ($dataPt, $pos) = @_; + $ratNumer = Get16s($dataPt,$pos); + $ratDenom = Get16s($dataPt, $pos + 2) or return $ratNumer ? 'inf' : 'undef'; + # round off to a reasonable number of significant figures + return RoundFloat($ratNumer / $ratDenom, 7); +} +sub GetRational32u($$) +{ + my ($dataPt, $pos) = @_; + $ratNumer = Get16u($dataPt,$pos); + $ratDenom = Get16u($dataPt, $pos + 2) or return $ratNumer ? 'inf' : 'undef'; + return RoundFloat($ratNumer / $ratDenom, 7); +} +sub GetRational64s($$) +{ + my ($dataPt, $pos) = @_; + $ratNumer = Get32s($dataPt,$pos); + $ratDenom = Get32s($dataPt, $pos + 4) or return $ratNumer ? 'inf' : 'undef'; + return RoundFloat($ratNumer / $ratDenom, 10); +} +sub GetRational64u($$) +{ + my ($dataPt, $pos) = @_; + $ratNumer = Get32u($dataPt,$pos); + $ratDenom = Get32u($dataPt, $pos + 4) or return $ratNumer ? 'inf' : 'undef'; + return RoundFloat($ratNumer / $ratDenom, 10); +} +sub GetFixed16s($$) +{ + my ($dataPt, $pos) = @_; + my $val = Get16s($dataPt, $pos) / 0x100; + return int($val * 1000 + ($val<0 ? -0.5 : 0.5)) / 1000; +} +sub GetFixed16u($$) +{ + my ($dataPt, $pos) = @_; + return int((Get16u($dataPt, $pos) / 0x100) * 1000 + 0.5) / 1000; +} +sub GetFixed32s($$) +{ + my ($dataPt, $pos) = @_; + my $val = Get32s($dataPt, $pos) / 0x10000; + # remove insignificant digits + return int($val * 1e5 + ($val>0 ? 0.5 : -0.5)) / 1e5; +} +sub GetFixed32u($$) +{ + my ($dataPt, $pos) = @_; + # remove insignificant digits + return int((Get32u($dataPt, $pos) / 0x10000) * 1e5 + 0.5) / 1e5; +} +# Inputs: 0) value, 1) data ref, 2) offset +sub Set8s(@) { return DoPackStd('c', @_); } +sub Set8u(@) { return DoPackStd('C', @_); } +sub Set16u(@) { return DoPackStd('S', @_); } +sub Set32u(@) { return DoPackStd('L', @_); } +sub Set16uRev(@) { return DoPackRev('S', @_); } + +#------------------------------------------------------------------------------ +# Get current byte order ('II' or 'MM') +sub GetByteOrder() { return $currentByteOrder; } + +#------------------------------------------------------------------------------ +# Set byte ordering +# Inputs: 0) 'MM'=motorola, 'II'=intel (will translate 'BigEndian', 'LittleEndian') +# Returns: 1 on success +sub SetByteOrder($) +{ + my $order = shift; + + if ($order eq 'MM') { # big endian (Motorola) + %unpackStd = %unpackMotorola; + } elsif ($order eq 'II') { # little endian (Intel) + %unpackStd = %unpackIntel; + } elsif ($order =~ /^Big/i) { + $order = 'MM'; + %unpackStd = %unpackMotorola; + } elsif ($order =~ /^Little/i) { + $order = 'II'; + %unpackStd = %unpackIntel; + } else { + return 0; + } + my $val = unpack('S','A '); + my $nativeOrder; + if ($val == 0x4120) { # big endian + $nativeOrder = 'MM'; + } elsif ($val == 0x2041) { # little endian + $nativeOrder = 'II'; + } else { + warn sprintf("Unknown native byte order! (pattern %x)\n",$val); + return 0; + } + $currentByteOrder = $order; # save current byte order + + # swap bytes if our native CPU byte ordering is not the same as the EXIF + $swapBytes = ($order ne $nativeOrder); + + # little-endian ARM has big-endian words for doubles (thanks Riku Voipio) + # (Note: Riku's patch checked for '0ff3', but I think it should be 'f03f' since + # 1 is '000000000000f03f' on an x86 -- so check for both, but which is correct?) + my $pack1d = pack('d', 1); + $swapWords = ($pack1d eq "\0\0\x0f\xf3\0\0\0\0" or + $pack1d eq "\0\0\xf0\x3f\0\0\0\0"); + return 1; +} + +#------------------------------------------------------------------------------ +# Change byte order +sub ToggleByteOrder() +{ + SetByteOrder(GetByteOrder() eq 'II' ? 'MM' : 'II'); +} + +#------------------------------------------------------------------------------ +# hash lookups for reading values from data +my %formatSize = ( + int8s => 1, + int8u => 1, + int16s => 2, + int16u => 2, + int16uRev => 2, + int32s => 4, + int32u => 4, + int32uRev => 4, + int64s => 8, + int64u => 8, + rational32s => 4, + rational32u => 4, + rational64s => 8, + rational64u => 8, + fixed16s => 2, + fixed16u => 2, + fixed32s => 4, + fixed32u => 4, + fixed64s => 8, + float => 4, + double => 8, + extended => 10, + unicode => 2, + complex => 8, + string => 1, + binary => 1, + 'undef' => 1, + ifd => 4, + ifd64 => 8, + ue7 => 1, +); +my %readValueProc = ( + int8s => \&Get8s, + int8u => \&Get8u, + int16s => \&Get16s, + int16u => \&Get16u, + int16uRev => \&Get16uRev, + int32s => \&Get32s, + int32u => \&Get32u, + int32uRev => \&Get32uRev, + int64s => \&Get64s, + int64u => \&Get64u, + rational32s => \&GetRational32s, + rational32u => \&GetRational32u, + rational64s => \&GetRational64s, + rational64u => \&GetRational64u, + fixed16s => \&GetFixed16s, + fixed16u => \&GetFixed16u, + fixed32s => \&GetFixed32s, + fixed32u => \&GetFixed32u, + fixed64s => \&GetFixed64s, + float => \&GetFloat, + double => \&GetDouble, + extended => \&GetExtended, + ifd => \&Get32u, + ifd64 => \&Get64u, +); +# lookup for all rational types +my %isRational = ( + rational32u => 1, + rational32s => 1, + rational64u => 1, + rational64s => 1, +); +sub FormatSize($) { return $formatSize{$_[0]}; } + +#------------------------------------------------------------------------------ +# Read value from binary data (with current byte ordering) +# Inputs: 0) data reference, 1) value offset, 2) format string, +# 3) number of values (or undef to use all data), +# 4) valid data length relative to offset (or undef to use all data), +# 5) optional pointer to returned rational +# Returns: converted value, or undefined if data isn't there +# or list of values in list context +sub ReadValue($$$;$$$) +{ + my ($dataPt, $offset, $format, $count, $size, $ratPt) = @_; + + my $len = $formatSize{$format}; + unless ($len) { + warn "Unknown format $format"; + $len = 1; + } + $size = length($$dataPt) - $offset unless defined $size; + unless ($count) { + return '' if defined $count or $size < $len; + $count = int($size / $len); + } + # make sure entry is inside data + if ($len * $count > $size) { + $count = int($size / $len); # shorten count if necessary + $count < 1 and return undef; # return undefined if no data + } + my @vals; + my $proc = $readValueProc{$format}; + if (not $proc) { + # handle undef/binary/string (also unsupported unicode/complex) + $vals[0] = substr($$dataPt, $offset, $count * $len); + # truncate string at null terminator if necessary + $vals[0] =~ s/\0.*//s if $format eq 'string'; + } elsif ($isRational{$format} and $ratPt) { + # store rationals separately as string fractions + my @rat; + for (;;) { + push @vals, &$proc($dataPt, $offset); + push @rat, "$ratNumer/$ratDenom"; + last if --$count <= 0; + $offset += $len; + } + $$ratPt = join(' ',@rat); + } else { + for (;;) { + push @vals, &$proc($dataPt, $offset); + last if --$count <= 0; + $offset += $len; + } + } + return @vals if wantarray; + return join(' ', @vals) if @vals > 1; + return $vals[0]; +} + +#------------------------------------------------------------------------------ +# Decode string with specified encoding +# Inputs: 0) ExifTool object ref, 1) string to decode +# 2) source character set name (undef for current Charset) +# 3) optional source byte order (2-byte and 4-byte fixed-width sets only) +# 4) optional destination character set (defaults to Charset setting) +# 5) optional destination byte order (2-byte and 4-byte fixed-width only) +# Returns: string in destination encoding +# Note: ExifTool ref may be undef if character both character sets are provided +# (but in this case no warnings will be issued) +sub Decode($$$;$$$) +{ + my ($self, $val, $from, $fromOrder, $to, $toOrder) = @_; + $from or $from = $$self{OPTIONS}{Charset}; + $to or $to = $$self{OPTIONS}{Charset}; + if ($from ne $to and length $val) { + require Image::ExifTool::Charset; + my $cs1 = $Image::ExifTool::Charset::csType{$from}; + my $cs2 = $Image::ExifTool::Charset::csType{$to}; + if ($cs1 and $cs2 and not $cs2 & 0x002) { + # treat as straight ASCII if no character will need remapping + if (($cs1 | $cs2) & 0x680 or $val =~ /[\x80-\xff]/) { + my $uni = Image::ExifTool::Charset::Decompose($self, $val, $from, $fromOrder); + $val = Image::ExifTool::Charset::Recompose($self, $uni, $to, $toOrder); + } + } elsif ($self) { + my $set = $cs1 ? $to : $from; + unless ($$self{"DecodeWarn$set"}) { + $self->Warn("Unsupported character set ($set)"); + $$self{"DecodeWarn$set"} = 1; + } + } + } + return $val; +} + +#------------------------------------------------------------------------------ +# Encode string with specified encoding +# Inputs: 0) ExifTool object ref, 1) string, 2) destination character set name, +# 3) optional destination byte order (2-byte and 4-byte fixed-width sets only) +# Returns: string in specified encoding +sub Encode($$$;$) +{ + my ($self, $val, $to, $toOrder) = @_; + return $self->Decode($val, undef, undef, $to, $toOrder); +} + +#------------------------------------------------------------------------------ +# Decode bit mask +# Inputs: 0) value to decode, 1) Reference to hash for decoding (or undef) +# 2) optional bits per word (defaults to 32) +sub DecodeBits($$;$) +{ + my ($vals, $lookup, $bits) = @_; + $bits or $bits = 32; + my ($val, $i, @bitList); + my $num = 0; + foreach $val (split ' ', $vals) { + for ($i=0; $i<$bits; ++$i) { + next unless $val & (1 << $i); + my $n = $i + $num; + if (not $lookup) { + push @bitList, $n; + } elsif ($$lookup{$n}) { + push @bitList, $$lookup{$n}; + } else { + push @bitList, "[$n]"; + } + } + $num += $bits; + } + return '(none)' unless @bitList; + return join($lookup ? ', ' : ',', @bitList); +} + +#------------------------------------------------------------------------------ +# Validate an extracted image and repair if necessary +# Inputs: 0) ExifTool object reference, 1) image reference, 2) tag name or key +# Returns: image reference or undef if it wasn't valid +# Note: should be called from RawConv, not ValueConv +sub ValidateImage($$$) +{ + my ($self, $imagePt, $tag) = @_; + return undef if $$imagePt eq 'none'; + unless ($$imagePt =~ /^(Binary data|\xff\xd8\xff)/ or + # the first byte of the preview of some Minolta cameras is wrong, + # so check for this and set it back to 0xff if necessary + $$imagePt =~ s/^.(\xd8\xff\xdb)/\xff$1/s or + $self->Options('IgnoreMinorErrors')) + { + # issue warning only if the tag was specifically requested + if ($$self{REQ_TAG_LOOKUP}{lc GetTagName($tag)}) { + $self->Warn("$tag is not a valid JPEG image",1); + return undef; + } + } + return $imagePt; +} + +#------------------------------------------------------------------------------ +# Validate a tag name argument (including group name and wildcards, etc) +# Inputs: 0) tag name +# Returns: true if tag name is valid +# - a tag name may contain [-_A-Za-z0-9], but may not start with [-0-9] +# - tag names may contain wildcards [?*], and end with a hash [#] +# - may have group name prefixes (which may have family number prefix), separated by colons +# - a group name may be zero or more characters +sub ValidTagName($) +{ + my $tag = shift; + return $tag =~ /^(([-\w]*|\d*\*):)*[_a-zA-Z?*][-\w?*]*#?$/; +} + +#------------------------------------------------------------------------------ +# Generate a valid tag name based on the tag ID or name +# Inputs: 0) tag ID or name +# Returns: valid tag name +sub MakeTagName($) +{ + my $name = shift; + $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters + $name = ucfirst $name; # capitalize first letter + $name = "Tag$name" if length($name) < 2; # must at least 2 characters long + return $name; +} + +#------------------------------------------------------------------------------ +# Make description from a tag name +# Inputs: 0) tag name 1) optional tagID to add at end of description +# Returns: description +sub MakeDescription($;$) +{ + my ($tag, $tagID) = @_; + # start with the tag name and force first letter to be upper case + my $desc = ucfirst($tag); + # translate underlines to spaces + $desc =~ tr/_/ /; + # remove hex TagID from name (to avoid inserting spaces in the number) + $desc =~ s/ (0x[\da-f]+)$//i and $tagID = $1 unless defined $tagID; + # put a space between lower/UPPER case and lower/number combinations + $desc =~ s/([a-z])([A-Z\d])/$1 $2/g; + # put a space between acronyms and words + $desc =~ s/([A-Z])([A-Z][a-z])/$1 $2/g; + # put spaces after numbers (if more than one character follows the number) + $desc =~ s/(\d)([A-Z]\S)/$1 $2/g; + # add TagID to description + $desc .= ' ' . $tagID if defined $tagID; + return $desc; +} + +#------------------------------------------------------------------------------ +# Get descriptions for all tags in an array +# Inputs: 0) ExifTool ref, 1) reference to list of tag keys +# Returns: reference to hash lookup for descriptions +# Note: Returned descriptions are NOT escaped by ESCAPE_PROC +sub GetDescriptions($$) +{ + local $_; + my ($self, $tags) = @_; + my %desc; + my $oldEscape = $$self{ESCAPE_PROC}; + delete $$self{ESCAPE_PROC}; + $desc{$_} = $self->GetDescription($_) foreach @$tags; + $$self{ESCAPE_PROC} = $oldEscape; + return \%desc; +} + +#------------------------------------------------------------------------------ +# Apply filter to value(s) if necessary +# Inputs: 0) ExifTool ref, 1) filter expression, 2) reference to value to filter +# Returns: true unless a filter returned undef; changes value if necessary +sub Filter($$$) +{ + local $_; + my ($self, $filter, $valPt) = @_; + return 1 unless defined $filter and defined $$valPt; + my $rtnVal; + if (not ref $$valPt) { + $_ = $$valPt; + #### eval Filter ($_, $self) + eval $filter; + if (defined $_) { + $$valPt = $_; + $rtnVal = 1; + } + } elsif (ref $$valPt eq 'SCALAR') { + my $val = $$$valPt; # make a copy to avoid filtering twice + $rtnVal = $self->Filter($filter, \$val); + $$valPt = \$val; + } elsif (ref $$valPt eq 'ARRAY') { + my @val = @{$$valPt}; # make a copy to avoid filtering twice + $self->Filter($filter, \$_) and $rtnVal = 1 foreach @val; + $$valPt = \@val; + } elsif (ref $$valPt eq 'HASH') { + my %val = %{$$valPt}; # make a copy to avoid filtering twice + $self->Filter($filter, \$val{$_}) and $rtnVal = 1 foreach keys %val; + $$valPt = \%val; + } else { + $rtnVal = 1; + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Return printable value +# Inputs: 0) ExifTool object reference +# 1) value to print, 2) line length limit (undef defaults to 60, 0=unlimited) +sub Printable($;$) +{ + my ($self, $outStr, $maxLen) = @_; + return '(undef)' unless defined $outStr; + $outStr =~ tr/\x01-\x1f\x7f-\xff/./; + $outStr =~ s/\x00//g; + my $verbose = $$self{OPTIONS}{Verbose}; + if ($verbose < 4) { + if ($maxLen) { + $maxLen = 20 if $maxLen < 20; # minimum length is 20 + } elsif (defined $maxLen) { + $maxLen = length $outStr; # 0 is unlimited + } else { + $maxLen = 60; # default maximum is 60 + } + } else { + $maxLen = length $outStr; + # limit to 2048 characters if verbose < 5 + $maxLen = 2048 if $maxLen > 2048 and $verbose < 5; + } + + # limit length if necessary + $outStr = substr($outStr,0,$maxLen-6) . '[snip]' if length($outStr) > $maxLen; + return $outStr; +} + +#------------------------------------------------------------------------------ +# Convert date/time from Exif format +# Inputs: 0) ExifTool object reference, 1) Date/time in EXIF format +# Returns: Formatted date/time string +sub ConvertDateTime($$) +{ + my ($self, $date) = @_; + my $fmt = $$self{OPTIONS}{DateFormat}; + my $shift = $$self{OPTIONS}{GlobalTimeShift}; + if ($shift) { + my $dir = ($shift =~ s/^([-+])// and $1 eq '-') ? -1 : 1; + my $offset = $$self{GLOBAL_TIME_OFFSET}; + $offset or $offset = $$self{GLOBAL_TIME_OFFSET} = { }; + ShiftTime($date, $shift, $dir, $offset); + } + # only convert date if a format was specified and the date is recognizable + if ($fmt) { + # separate time zone if it exists + my $tz; + $date =~ s/([-+]\d{2}:\d{2}|Z)$// and $tz = $1; + # a few cameras use incorrect date/time formatting: + # - slashes instead of colons in date (RolleiD330, ImpressCam) + # - date/time values separated by colon instead of space (Polariod, Sanyo, Sharp, Vivitar) + # - single-digit seconds with leading space (HP scanners) + my @a = reverse ($date =~ /\d+/g); # be very flexible about date/time format + if (@a and $a[-1] >= 1000 and $a[-1] < 3000 and eval { require POSIX }) { + shift @a while @a > 6; # remove superfluous entries + unshift @a, 1 while @a < 3; # add month and day if necessary + unshift @a, 0 while @a < 6; # add h,m,s if necessary + $a[4] -= 1; # base month is 1 + # parse our %f fractional seconds first (and round up seconds if necessary) + # - if there are multiple %f codes, they all get the same number of digits as the first + if ($fmt =~ /%\.?(\d*)f/) { + my $dig = $1; + my $frac = $date =~ /(\.\d+)/ ? $1 : ''; + if (not $frac) { + $frac = '.' . ('0' x $dig) if $dig; + } elsif (length $dig) { + if ($dig+1 > length($frac)) { + $frac .= '0' x ($dig+1-length($frac)); + } elsif ($dig+1 < length($frac)) { + $frac = sprintf("%.${dig}f", $frac); + while ($frac =~ s/^(\d)// and $1 ne '0') { + # this is a pain, but we must round up to the next second + ++$a[0] < 60 and last; + $a[0] = 0; + ++$a[1] < 60 and last; + $a[1] = 0; + ++$a[2] < 24 and last; + $a[2] = 0; + require 'Image/ExifTool/Shift.pl'; + ++$a[3] <= DaysInMonth($a[4]+1, $a[5]) and last; + $a[3] = 1; + ++$a[4] < 12 and last; + $a[4] = 0; + ++$a[5]; + last; # (this was a goto) + } + } + } + $fmt =~ s/(^|[^%])((%%)*)%\.?\d*f/$1$2$frac/g; + } + # parse %z and %s ourself (to handle time zones properly) + if ($fmt =~ /%[sz]/) { + # use system time zone unless otherwise specified + $tz = TimeZoneString(\@a, TimeLocal(@a)) if not $tz and eval { require Time::Local }; + # remove colon, setting to UTC if time zone is not numeric + $tz = ($tz and $tz=~/^([-+]\d{2}):(\d{2})$/) ? "$1$2" : '+0000'; + $fmt =~ s/(^|[^%])((%%)*)%z/$1$2$tz/g; # convert '%z' format codes + if ($fmt =~ /%s/ and eval { require Time::Local }) { + # calculate seconds since the Epoch, UTC + my $s = Time::Local::timegm(@a) - 60 * ($tz - int($tz/100) * 40); + $fmt =~ s/(^|[^%])((%%)*)%s/$1$2$s/g; # convert '%s' format codes + } + } + $a[5] -= 1900; # strftime year starts from 1900 + $date = POSIX::strftime($fmt, @a); # generate the formatted date/time + } elsif ($$self{OPTIONS}{StrictDate}) { + undef $date; + } + } + return $date; +} + +#------------------------------------------------------------------------------ +# Print conversion for time span value +# Inputs: 0) time ticks, 1) number of seconds per tick (default 1) +# Returns: readable time +sub ConvertTimeSpan($;$) +{ + my ($val, $mult) = @_; + if (Image::ExifTool::IsFloat($val) and $val != 0) { + $val *= $mult if $mult; + if ($val < 60) { + $val = "$val seconds"; + } elsif ($val < 3600) { + my $fmt = ($mult and $mult >= 60) ? '%d' : '%.1f'; + my $s = ($val == 60 and $mult) ? '' : 's'; + $val = sprintf("$fmt minute$s", $val / 60); + } elsif ($val < 24 * 3600) { + $val = sprintf("%.1f hours", $val / 3600); + } else { + $val = sprintf("%.1f days", $val / (24 * 3600)); + } + } + return $val; +} + +#------------------------------------------------------------------------------ +# Patched timelocal() that fixes ActivePerl timezone bug +# Inputs/Returns: same as timelocal() +# Notes: must 'require Time::Local' before calling this routine +sub TimeLocal(@) +{ + my $tm = Time::Local::timelocal(@_); + if ($^O eq 'MSWin32') { + # patch for ActivePerl timezone bug + my @t2 = localtime($tm); + my $t2 = Time::Local::timelocal(@t2); + # adjust timelocal() return value to be consistent with localtime() + $tm += $tm - $t2; + } + return $tm; +} + +#------------------------------------------------------------------------------ +# Get time zone in minutes +# Inputs: 0) localtime array ref, 1) gmtime array ref +# Returns: time zone offset in minutes +sub GetTimeZone($$) +{ + my ($tm, $gm) = @_; + # compute the number of minutes between localtime and gmtime + my $min = $$tm[2] * 60 + $$tm[1] - ($$gm[2] * 60 + $$gm[1]); + if ($$tm[3] != $$gm[3]) { + # account for case where one date wraps to the first of the next month + $$gm[3] = $$tm[3] - ($$tm[3]==1 ? 1 : -1) if abs($$tm[3]-$$gm[3]) != 1; + # adjust for the +/- one day difference + $min += ($$tm[3] - $$gm[3]) * 24 * 60; + } + # MirBSD patch to round to the nearest 30 minutes because + # it includes leap seconds in localtime but not gmtime + $min = int($min / 30 + ($min > 0 ? 0.5 : -0.5)) * 30 if $^O eq 'mirbsd'; + return $min; +} + +#------------------------------------------------------------------------------ +# Get time zone string +# Inputs: 0) time zone offset in minutes +# or 0) localtime array ref, 1) corresponding time value +# Returns: time zone string ("+/-HH:MM") +sub TimeZoneString($;$) +{ + my $min = shift; + if (ref $min) { + my @gm = gmtime(shift); + $min = GetTimeZone($min, \@gm); + } + my $sign = '+'; + $min < 0 and $sign = '-', $min = -$min; + $min = int($min + 0.5); # round off to nearest minute + my $h = int($min / 60); + return sprintf('%s%.2d:%.2d', $sign, $h, $min - $h * 60); +} + +#------------------------------------------------------------------------------ +# Convert Unix time to EXIF date/time string +# Inputs: 0) Unix time value, 1) non-zero to convert to local time, +# 2) number of digits after the decimal for fractional seconds +# Returns: EXIF date/time string (with timezone for local times) +sub ConvertUnixTime($;$$) +{ + my ($time, $toLocal, $dec) = @_; + return '0000:00:00 00:00:00' if $time == 0; + my (@tm, $tz); + if ($dec) { + my $frac = $time - int($time); + $time = int($time); + $frac < 0 and $frac += 1, $time -= 1; + $dec = sprintf('%.*f', $dec, $frac); + # remove number before decimal and increment integer time if it was rounded up + $dec =~ s/^(\d)// and $1 eq '1' and $time += 1; + } else { + $time = int($time + 1e-6) if $time != int($time); # avoid round-off errors + $dec = ''; + } + if ($toLocal) { + @tm = localtime($time); + $tz = TimeZoneString(\@tm, $time); + } else { + @tm = gmtime($time); + $tz = ''; + } + my $str = sprintf("%4d:%.2d:%.2d %.2d:%.2d:%.2d$dec%s", + $tm[5]+1900, $tm[4]+1, $tm[3], $tm[2], $tm[1], $tm[0], $tz); + return $str; +} + +#------------------------------------------------------------------------------ +# Get Unix time from EXIF-formatted date/time string with optional timezone +# Inputs: 0) EXIF date/time string, 1) non-zero if time is local, or 2 to assume UTC +# Returns: Unix time (seconds since 0:00 GMT Jan 1, 1970) or undefined on error +sub GetUnixTime($;$) +{ + my ($timeStr, $isLocal) = @_; + return 0 if $timeStr eq '0000:00:00 00:00:00'; + my @tm = ($timeStr =~ /^(\d+)[-:](\d+)[-:](\d+)\s+(\d+):(\d+):(\d+)(.*)/); + return undef unless @tm == 7; + unless (eval { require Time::Local }) { + warn "Time::Local is not installed\n"; + return undef; + } + my ($tzStr, $tzSec) = (pop(@tm), 0); + # use specified timezone offset (if given) instead of local system time + # if we are converting a local time value + if ($isLocal) { + if ($tzStr =~ /(?:Z|([-+])(\d+):(\d+))/i) { + # use specified timezone if one exists + $tzSec = ($2 * 60 + $3) * ($1 eq '-' ? -60 : 60) if $1; + undef $isLocal; # convert using GMT corrected for specified timezone + } elsif ($isLocal eq '2') { + undef $isLocal; + } + } + $tm[1] -= 1; # convert month + @tm = reverse @tm; # change to order required by timelocal() + my $val = $isLocal ? TimeLocal(@tm) : Time::Local::timegm(@tm) - $tzSec; + # handle fractional seconds + $val += $1 if $tzStr and $tzStr =~ /^(\.\d+)/; + return $val; +} + +#------------------------------------------------------------------------------ +# Print conversion for file size +# Inputs: 0) file size in bytes +# Returns: converted file size +sub ConvertFileSize($) +{ + my $val = shift; + $val < 2000 and return "$val bytes"; + $val < 10000 and return sprintf('%.1f kB', $val / 1000); + $val < 2000000 and return sprintf('%.0f kB', $val / 1000); + $val < 10000000 and return sprintf('%.1f MB', $val / 1000000); + $val < 2000000000 and return sprintf('%.0f MB', $val / 1000000); + $val < 10000000000 and return sprintf('%.1f GB', $val / 1000000000); + return sprintf('%.0f GB', $val / 1000000000); +} + +#------------------------------------------------------------------------------ +# Convert seconds to duration string (handles negative durations) +# Inputs: 0) floating point seconds +# Returns: duration string in form "S.SS s", "H:MM:SS" or "DD days HH:MM:SS" +sub ConvertDuration($) +{ + my $time = shift; + return $time unless IsFloat($time); + return '0 s' if $time == 0; + my $sign = ($time > 0 ? '' : (($time = -$time), '-')); + return sprintf("$sign%.2f s", $time) if $time < 30; + $time += 0.5; # to round off to nearest second + my $h = int($time / 3600); + $time -= $h * 3600; + my $m = int($time / 60); + $time -= $m * 60; + if ($h > 24) { + my $d = int($h / 24); + $h -= $d * 24; + $sign = "$sign$d days "; + } + return sprintf("$sign%d:%.2d:%.2d", $h, $m, int($time)); +} + +#------------------------------------------------------------------------------ +# Print conversion for bitrate values +# Inputs: 0) bitrate in bits per second +# Returns: human-readable bitrate string +# Notes: returns input value without formatting if it isn't numerical +sub ConvertBitrate($) +{ + my $bitrate = shift; + IsFloat($bitrate) or return $bitrate; + my @units = ('bps', 'kbps', 'Mbps', 'Gbps'); + for (;;) { + my $units = shift @units; + $bitrate >= 1000 and @units and $bitrate /= 1000, next; + my $fmt = $bitrate < 100 ? '%.3g' : '%.0f'; + return sprintf("$fmt $units", $bitrate); + } +} + +#------------------------------------------------------------------------------ +# Convert file name for printing +# Inputs: 0) ExifTool ref, 1) file name in CharsetFileName character set +# Returns: converted file name in external character set +sub ConvertFileName($$) +{ + my ($self, $val) = @_; + my $enc = $$self{OPTIONS}{CharsetFileName}; + $val = $self->Decode($val, $enc) if $enc; + return $val; +} + +#------------------------------------------------------------------------------ +# Inverse conversion for file name (encode in CharsetFileName) +# Inputs: 0) ExifTool ref, 1) file name in external character set +# Returns: file name in CharsetFileName character set +sub InverseFileName($$) +{ + my ($self, $val) = @_; + my $enc = $$self{OPTIONS}{CharsetFileName}; + $val = $self->Encode($val, $enc) if $enc; + $val =~ tr/\\/\//; # make sure we are using forward slashes + return $val; +} + +#------------------------------------------------------------------------------ +# Save information for HTML dump +# Inputs: 0) ExifTool hash ref, 1) start offset, 2) data size +# 3) comment string, 4) tool tip (or SAME), 5) flags, 6) IFD name +sub HDump($$$$;$$$) +{ + my $self = shift; + $$self{HTML_DUMP} or return; + my ($pos, $len, $com, $tip, $flg, $ifd) = @_; + $pos += $$self{BASE} if $$self{BASE}; + # skip structural data blocks which have been removed from the middle of this dump + # (SkipData list contains ordered [start,end+1] offsets to skip) + if ($$self{SkipData}) { + my $end = $pos + $len; + my $skip; + foreach $skip (@{$$self{SkipData}}) { + $end <= $$skip[0] and last; + $pos >= $$skip[1] and $pos += $$skip[1] - $$skip[0], next; + if ($pos != $$skip[0]) { + $$self{HTML_DUMP}->Add($pos, $$skip[0]-$pos, $com, $tip, $flg, $ifd); + $len -= $$skip[0] - $pos; + $tip = 'SAME'; + } + $pos = $$skip[1]; + } + } + $$self{HTML_DUMP}->Add($pos, $len, $com, $tip, $flg, $ifd); +} + +#------------------------------------------------------------------------------ +# Identify trailer ending at specified offset from end of file +# Inputs: 0) RAF reference, 1) offset from end of file (0 by default) +# Returns: Trailer info hash (with RAF and DirName set), +# or undef if no recognized trailer was found +# Notes: leaves file position unchanged +sub IdentifyTrailer($;$) +{ + my $raf = shift; + my $offset = shift || 0; + my $pos = $raf->Tell(); + my ($buff, $type, $len); + while ($raf->Seek(-$offset, 2) and ($len = $raf->Tell()) > 0) { + # read up to 64 bytes before specified offset from end of file + $len = 64 if $len > 64; + $raf->Seek(-$len, 1) and $raf->Read($buff, $len) == $len or last; + if ($buff =~ /AXS(!|\*).{8}$/s) { + $type = 'AFCP'; + } elsif ($buff =~ /\xa1\xb2\xc3\xd4$/) { + $type = 'FotoStation'; + } elsif ($buff =~ /cbipcbbl$/) { + $type = 'PhotoMechanic'; + } elsif ($buff =~ /^CANON OPTIONAL DATA\0/) { + $type = 'CanonVRD'; + } elsif ($buff =~ /~\0\x04\0zmie~\0\0\x06.{4}[\x10\x18]\x04$/s or + $buff =~ /~\0\x04\0zmie~\0\0\x0a.{8}[\x10\x18]\x08$/s) + { + $type = 'MIE'; + } elsif ($buff =~ /\0\0(QDIOBS|SEFT)$/) { + $type = 'Samsung'; + } elsif ($buff =~ /8db42d694ccc418790edff439fe026bf$/s) { + $type = 'Insta360'; + } elsif ($buff =~ m(\0{6}/NIKON APP$)) { + $type = 'NikonApp'; + } + last; + } + $raf->Seek($pos, 0); # restore original file position + return $type ? { RAF => $raf, DirName => $type } : undef; +} + +#------------------------------------------------------------------------------ +# Read/rewrite trailer information (including multiple trailers) +# Inputs: 0) ExifTool object ref, 1) DirInfo ref: +# - requires RAF and DirName +# - OutFile is a scalar reference for writing +# - scans from current file position if ScanForAFCP is set +# Returns: 1 if trailer was processed or couldn't be processed (or written OK) +# 0 if trailer was recognized but offsets need fixing (or write error) +# - DirName, DirLen, DataPos, Offset, Fixup and OutFile are updated +# - preserves current file position and byte order +sub ProcessTrailers($$) +{ + my ($self, $dirInfo) = @_; + my $dirName = $$dirInfo{DirName}; + my $outfile = $$dirInfo{OutFile}; + my $offset = $$dirInfo{Offset} || 0; + my $fixup = $$dirInfo{Fixup}; + my $raf = $$dirInfo{RAF}; + my $pos = $raf->Tell(); + my $byteOrder = GetByteOrder(); + my $success = 1; + my $path = $$self{PATH}; + + for (;;) { # loop through all trailers + my ($proc, $outBuff); + if ($dirName eq 'Insta360') { + require 'Image/ExifTool/QuickTimeStream.pl'; + $proc = 'Image::ExifTool::QuickTime::ProcessInsta360'; + } elsif ($dirName eq 'NikonApp') { + require Image::ExifTool::Nikon; + $proc = 'Image::ExifTool::Nikon::ProcessNikonApp'; + } else { + require "Image/ExifTool/$dirName.pm"; + $proc = "Image::ExifTool::${dirName}::Process$dirName"; + } + if ($outfile) { + # write to local buffer so we can add trailer in proper order later + $$outfile and $$dirInfo{OutFile} = \$outBuff, $outBuff = ''; + # must generate new fixup if necessary so we can shift + # the old fixup separately after we prepend this trailer + delete $$dirInfo{Fixup}; + } + delete $$dirInfo{DirLen}; # reset trailer length + $$dirInfo{Offset} = $offset; # set offset from end of file + $$dirInfo{Trailer} = 1; # set Trailer flag in case proc cares + # add trailer and DirName to SubDirectory PATH + push @$path, 'Trailer', $dirName; + + # read or write this trailer + # (proc takes Offset as positive offset from end of trailer to end of file, + # and returns DataPos and DirLen, and Fixup if applicable, and updates + # OutFile when writing) + no strict 'refs'; + my $result = &$proc($self, $dirInfo); + use strict 'refs'; + + # restore PATH (pop last 2 items) + splice @$path, -2; + + # check result + if ($outfile) { + if ($result > 0) { + if ($outBuff) { + # write trailers to OutFile in original order + $$outfile = $outBuff . $$outfile; + # must adjust old fixup start if it exists + $$fixup{Start} += length($outBuff) if $fixup; + $outBuff = ''; # free memory + } + if ($$dirInfo{Fixup}) { + if ($fixup) { + # add fixup for subsequent trailers to the fixup for this trailer + # (but first we must adjust for the new start position) + $$fixup{Shift} += $$dirInfo{Fixup}{Start}; + $$fixup{Start} -= $$dirInfo{Fixup}{Start}; + $$dirInfo{Fixup}->AddFixup($fixup); + } + $fixup = $$dirInfo{Fixup}; # save fixup + } + } else { + $success = 0 if $self->Error("Error rewriting $dirName trailer", 2); + last; + } + } elsif ($result < 0) { + # can't continue if we must scan for this trailer + $success = 0; + last; + } + last unless $result > 0 and $$dirInfo{DirLen}; + # look for next trailer + $offset += $$dirInfo{DirLen}; + my $nextTrail = IdentifyTrailer($raf, $offset) or last; + $dirName = $$dirInfo{DirName} = $$nextTrail{DirName}; + $raf->Seek($pos, 0); + } + SetByteOrder($byteOrder); # restore original byte order + $raf->Seek($pos, 0); # restore original file position + $$dirInfo{OutFile} = $outfile; # restore original outfile + $$dirInfo{Offset} = $offset; # return offset from EOF to start of first trailer + $$dirInfo{Fixup} = $fixup; # return fixup information + return $success; +} + +#------------------------------------------------------------------------------ +# JPEG constants + +# JPEG marker names +%jpegMarker = ( + 0x00 => 'NULL', + 0x01 => 'TEM', + 0xc0 => 'SOF0', # to SOF15, with a few exceptions below + 0xc4 => 'DHT', + 0xc8 => 'JPGA', + 0xcc => 'DAC', + 0xd0 => 'RST0', # to RST7 + 0xd8 => 'SOI', + 0xd9 => 'EOI', + 0xda => 'SOS', + 0xdb => 'DQT', + 0xdc => 'DNL', + 0xdd => 'DRI', + 0xde => 'DHP', + 0xdf => 'EXP', + 0xe0 => 'APP0', # to APP15 + 0xf0 => 'JPG0', + 0xfe => 'COM', +); + +# lookup for size of JPEG marker length word +# (2 bytes assumed unless specified here) +my %markerLenBytes = ( + 0x00 => 0, 0x01 => 0, + 0xd0 => 0, 0xd1 => 0, 0xd2 => 0, 0xd3 => 0, 0xd4 => 0, 0xd5 => 0, 0xd6 => 0, 0xd7 => 0, + 0xd8 => 0, 0xd9 => 0, 0xda => 0, + # J2C + 0x30 => 0, 0x31 => 0, 0x32 => 0, 0x33 => 0, 0x34 => 0, 0x35 => 0, 0x36 => 0, 0x37 => 0, + 0x38 => 0, 0x39 => 0, 0x3a => 0, 0x3b => 0, 0x3c => 0, 0x3d => 0, 0x3e => 0, 0x3f => 0, + 0x4f => 0, + 0x92 => 0, 0x93 => 0, + # J2C extensions + 0x74 => 4, 0x75 => 4, 0x77 => 4, +); + +#------------------------------------------------------------------------------ +# Get JPEG marker name +# Inputs: 0) Jpeg number +# Returns: marker name +sub JpegMarkerName($) +{ + my $marker = shift; + my $markerName = $jpegMarker{$marker}; + unless ($markerName) { + $markerName = $jpegMarker{$marker & 0xf0}; + if ($markerName and $markerName =~ /^([A-Z]+)\d+$/) { + $markerName = $1 . ($marker & 0x0f); + } else { + $markerName = sprintf("marker 0x%.2x", $marker); + } + } + return $markerName; +} + +#------------------------------------------------------------------------------ +# Adjust directory start position +# Inputs: 0) dirInfo ref, 1) start offset +# 2) Base for offsets (relative to DataPos, defaults to absolute Base of 0) +sub DirStart($$;$) +{ + my ($dirInfo, $start, $base) = @_; + $$dirInfo{DirStart} = $start; + $$dirInfo{DirLen} -= $start; + if (defined $base) { + $$dirInfo{Base} = $$dirInfo{DataPos} + $base; + $$dirInfo{DataPos} = -$base; # (relative to Base!) + } +} + +#------------------------------------------------------------------------------ +# Extract metadata from a jpg image +# Inputs: 0) ExifTool object reference, 1) dirInfo ref with RAF set +# Returns: 1 on success, 0 if this wasn't a valid JPEG file +sub ProcessJPEG($$) +{ + local $_; + my ($self, $dirInfo) = @_; + my ($ch, $s, $length); + my $options = $$self{OPTIONS}; + my $verbose = $$options{Verbose}; + my $out = $$options{TextOut}; + my $fast = $$options{FastScan} || 0; + my $raf = $$dirInfo{RAF}; + my $req = $$self{REQ_TAG_LOOKUP}; + my $htmlDump = $$self{HTML_DUMP}; + my %dumpParms = ( Out => $out ); + my ($success, $wantTrailer, $trailInfo, $foundSOS, %jumbfChunk); + my (@iccChunk, $iccChunkCount, $iccChunksTotal, @flirChunk, $flirCount, $flirTotal); + my ($preview, $scalado, @dqt, $subSampling, $dumpEnd, %extendedXMP); + + # check to be sure this is a valid JPG (or J2C, or EXV) file + return 0 unless $raf->Read($s, 2) == 2 and $s =~ /^\xff[\xd8\x4f\x01]/; + if ($s eq "\xff\x01") { + return 0 unless $raf->Read($s, 5) == 5 and $s eq 'Exiv2'; + $$self{FILE_TYPE} = 'EXV'; + } + my $appBytes = 0; + my $calcImageLen = $$req{jpegimagelength}; + if ($$options{RequestAll} and $$options{RequestAll} > 2) { + $calcImageLen = 1; + } + if (not $$self{VALUE}{FileType} or ($$self{DOC_NUM} and $$options{ExtractEmbedded})) { + $self->SetFileType(); # set FileType tag + return 1 if $fast == 3; # don't process file when FastScan == 3 + $$self{LOW_PRIORITY_DIR}{IFD1} = 1; # lower priority of IFD1 tags + } + $$raf{NoBuffer} = 1 if $self->Options('FastScan'); # disable buffering in FastScan mode + + $dumpParms{MaxLen} = 128 if $verbose < 4; + if ($htmlDump) { + $dumpEnd = $raf->Tell(); + my ($n, $t, $m) = $s eq 'Exiv2' ? (7,'EXV','TEM') : (2,'JPEG','SOI'); + my $pos = $dumpEnd - $n; + $self->HDump(0, $pos, '[unknown header]') if $pos; + $self->HDump($pos, $n, "$t header", "$m Marker"); + } + my $path = $$self{PATH}; + my $pn = scalar @$path; + + # set input record separator to 0xff (the JPEG marker) to make reading quicker + local $/ = "\xff"; + + my ($nextMarker, $nextSegDataPt, $nextSegPos, $combinedSegData, $firstSegPos, @skipData); + + # read file until we reach an end of image (EOI) or start of scan (SOS) + Marker: for (;;) { + # set marker and data pointer for current segment + my $marker = $nextMarker; + my $segDataPt = $nextSegDataPt; + my $segPos = $nextSegPos; + my $skipped; + undef $nextMarker; + undef $nextSegDataPt; +# +# read ahead to the next segment unless we have reached EOI, SOS or SOD +# + unless ($marker and ($marker==0xd9 or ($marker==0xda and not $wantTrailer) or $marker==0x93)) { + # read up to next marker (JPEG markers begin with 0xff) + my $buff; + $raf->ReadLine($buff) or last; + $skipped = length($buff) - 1; + # JPEG markers can be padded with unlimited 0xff's + for (;;) { + $raf->Read($ch, 1) or last Marker; + $nextMarker = ord($ch); + last unless $nextMarker == 0xff; + ++$skipped; + } + # read segment data if it exists + if (not defined $markerLenBytes{$nextMarker}) { + # read record length word + last unless $raf->Read($s, 2) == 2; + my $len = unpack('n',$s); # get data length + last unless defined($len) and $len >= 2; + $nextSegPos = $raf->Tell(); + $len -= 2; # subtract size of length word + last unless $raf->Read($buff, $len) == $len; + $nextSegDataPt = \$buff; # set pointer to our next data + } elsif ($markerLenBytes{$nextMarker} == 4) { + # handle J2C extensions with 4-byte length word + last unless $raf->Read($s, 4) == 4; + my $len = unpack('N',$s); # get data length + last unless defined($len) and $len >= 4; + $nextSegPos = $raf->Tell(); + $len -= 4; # subtract size of length word + last unless $raf->Seek($len, 1); + } + # read second segment too if this was the first + next unless defined $marker; + } + # set some useful variables for the current segment + my $markerName = JpegMarkerName($marker); + $$path[$pn] = $markerName; + # issue warning if we skipped some garbage + if ($skipped and not $foundSOS and $markerName ne 'SOS') { + $self->Warn("Skipped unknown $skipped bytes after JPEG $markerName segment", 1); + if ($htmlDump) { + $self->HDump($nextSegPos-4-$skipped, $skipped, "[unknown $skipped bytes]", undef, 0x08); + $dumpEnd = $nextSegPos - 4; + } + } +# +# parse the current segment +# + # handle SOF markers: SOF0-SOF15, except DHT(0xc4), JPGA(0xc8) and DAC(0xcc) + if (($marker & 0xf0) == 0xc0 and ($marker == 0xc0 or $marker & 0x03)) { + $length = length $$segDataPt; + if ($verbose) { + print $out "JPEG $markerName ($length bytes):\n"; + HexDump($segDataPt, undef, %dumpParms, Addr=>$segPos) if $verbose>2; + } elsif ($htmlDump) { + $self->HDump($segPos-4, $length+4, "[JPEG $markerName]", undef, 0x08); + $dumpEnd = $segPos + $length; + } + next unless $length >= 6; + # extract some useful information + my ($p, $h, $w, $n) = unpack('Cn2C', $$segDataPt); + my $sof = GetTagTable('Image::ExifTool::JPEG::SOF'); + $self->HandleTag($sof, 'ImageWidth', $w); + $self->HandleTag($sof, 'ImageHeight', $h); + $self->HandleTag($sof, 'EncodingProcess', $marker - 0xc0); + $self->HandleTag($sof, 'BitsPerSample', $p); + $self->HandleTag($sof, 'ColorComponents', $n); + next unless $n == 3 and $length >= 15; + my ($i, $hmin, $hmax, $vmin, $vmax); + # loop through all components to determine sampling frequency + $subSampling = ''; + for ($i=0; $i<$n; ++$i) { + my $sf = Get8u($segDataPt, 7 + 3 * $i); + $subSampling .= sprintf('%.2x', $sf); + # isolate horizontal and vertical components + my ($hf, $vf) = ($sf >> 4, $sf & 0x0f); + unless ($i) { + $hmin = $hmax = $hf; + $vmin = $vmax = $vf; + next; + } + # determine min/max frequencies + $hmin = $hf if $hf < $hmin; + $hmax = $hf if $hf > $hmax; + $vmin = $vf if $vf < $vmin; + $vmax = $vf if $vf > $vmax; + } + if ($hmin and $vmin) { + my ($hs, $vs) = ($hmax / $hmin, $vmax / $vmin); + $self->HandleTag($sof, 'YCbCrSubSampling', "$hs $vs"); + } + next; + } elsif ($marker == 0xd9) { # EOI + pop @$path; + $verbose and print $out "JPEG EOI\n"; + my $pos = $raf->Tell(); + if ($htmlDump and $dumpEnd) { + $self->HDump($dumpEnd, $pos-2-$dumpEnd, '[JPEG Image Data]', undef, 0x08); + $self->HDump($pos-2, 2, 'JPEG EOI', undef); + $dumpEnd = 0; + } + if ($foundSOS or $$self{FILE_TYPE} eq 'EXV') { + $success = 1; + } else { + $self->Warn('Missing JPEG SOS'); + } + if ($$req{trailer}) { + # read entire trailer into memory + if ($raf->Seek(0,2)) { + my $len = $raf->Tell() - $pos; + if ($len) { + my $buff; + $raf->Seek($pos, 0); + $self->FoundTag(Trailer => \$buff) if $raf->Read($buff,$len) == $len; + $raf->Seek($pos, 0); + } + } else { + $self->Warn('Error seeking in file'); + } + } + # we are here because we are looking for trailer information + if ($wantTrailer) { + my $start = $$self{PreviewImageStart}; + if ($start or $$options{ExtractEmbedded}) { + my $buff; + # most previews start right after the JPEG EOI, but the Olympus E-20 + # preview is 508 bytes into the trailer, the K-M Maxxum 7D preview is + # 979 bytes in, and Sony previews can start up to 32 kB into the trailer. + # (and Minolta and Sony previews can have a random first byte...) + my $scanLen = $$self{Make} =~ /Sony/i ? 65536 : 1024; + if ($raf->Read($buff, $scanLen)) { + if ($buff =~ /^.{4}ftyp/s) { + my $val; + if ($raf->Seek(0,2)) { + my $len = $raf->Tell() - $pos; + if ($$options{Binary}) { + $val = \$buff if $raf->Seek($pos,0) and $raf->Read($buff,$len)==$len; + } else { + $val = \ "Binary data $len bytes"; + } + if ($val) { + $self->FoundTag('EmbeddedVideo', $val); + } else { + $self->Warn('Error reading trailer'); + } + } else { + $self->Warn('Error seeking to end of file'); + } + } elsif ($buff =~ /\xff\xd8\xff./g or + ($$self{Make} =~ /(Minolta|Sony)/i and $buff =~ /.\xd8\xff\xdb/g)) + { + # adjust PreviewImageStart to this location + my $actual = $pos + pos($buff) - 4; + if ($start and $start ne $actual and $verbose > 1) { + print $out "(Fixed PreviewImage location: $start -> $actual)\n"; + } + # update preview image offsets + if ($start) { + $$self{VALUE}{PreviewImageStart} = $actual if $$self{VALUE}{PreviewImageStart}; + $$self{PreviewImageStart} = $actual; + } + # load preview now if we tried and failed earlier + if ($$self{PreviewError} and $$self{PreviewImageLength}) { + if ($raf->Seek($actual, 0) and $raf->Read($buff, $$self{PreviewImageLength})) { + $self->FoundTag('PreviewImage', $buff); + delete $$self{PreviewError}; + } + } + } + } + $raf->Seek($pos, 0); + } + } + # process trailer now or finish processing trailers + # and scan for AFCP if necessary + my $fromEnd = 0; + if ($trailInfo) { + $$trailInfo{ScanForAFCP} = 1; # scan now if necessary + $self->ProcessTrailers($trailInfo); + # save offset from end of file to start of first trailer + $fromEnd = $$trailInfo{Offset}; + undef $trailInfo; + } + if ($$self{LeicaTrailer}) { + $raf->Seek(0, 2); + $$self{LeicaTrailer}{TrailPos} = $pos; + $$self{LeicaTrailer}{TrailLen} = $raf->Tell() - $pos - $fromEnd; + Image::ExifTool::Panasonic::ProcessLeicaTrailer($self); + } + # finally, dump remaining information in JPEG trailer + if ($verbose or $htmlDump) { + my $endPos = $$self{LeicaTrailerPos}; + unless ($endPos) { + $raf->Seek(0, 2); + $endPos = $raf->Tell() - $fromEnd; + } + $self->DumpUnknownTrailer({ + RAF => $raf, + DataPos => $pos, + DirLen => $endPos - $pos + }) if $endPos > $pos; + } + $self->FoundTag('JPEGImageLength', $pos - $appBytes) if $calcImageLen; + last; # all done parsing file + } elsif ($marker == 0xda) { # SOS + pop @$path; + $foundSOS = 1; + # all done with meta information unless we have a trailer + $verbose and print $out "JPEG SOS\n"; + unless ($fast) { + $trailInfo = IdentifyTrailer($raf); + # process trailer now unless we are doing verbose dump + if ($trailInfo and $verbose < 3 and not $htmlDump) { + # process trailers (keep trailInfo to finish processing later + # only if we can't finish without scanning from end of file) + $self->ProcessTrailers($trailInfo) and undef $trailInfo; + } + if ($wantTrailer and $$self{PreviewImageStart}) { + # seek ahead and validate preview image + my $buff; + my $curPos = $raf->Tell(); + if ($raf->Seek($$self{PreviewImageStart}, 0) and + $raf->Read($buff, 4) == 4 and + $buff =~ /^.\xd8\xff[\xc4\xdb\xe0-\xef]/) + { + undef $wantTrailer; + } + $raf->Seek($curPos, 0) or last; + } + # seek ahead and process Leica trailer + if ($$self{LeicaTrailer}) { + require Image::ExifTool::Panasonic; + Image::ExifTool::Panasonic::ProcessLeicaTrailer($self); + $wantTrailer = 1 if $$self{LeicaTrailer}; + } else { + $wantTrailer = 1 if $$options{ExtractEmbedded}; + } + next if $trailInfo or $wantTrailer or $verbose > 2 or $htmlDump; + } + # must scan to EOI if Validate or JpegCompressionFactor used + next if $$options{Validate} or $calcImageLen or $$req{trailer}; + # nothing interesting to parse after start of scan (SOS) + $success = 1; + last; # all done parsing file + } elsif ($marker == 0x93) { + pop @$path; + $verbose and print $out "JPEG SOD\n"; + $success = 1; + next if $verbose > 2 or $htmlDump; + last; # all done parsing file + } elsif (defined $markerLenBytes{$marker}) { + # handle other stand-alone markers and segments we skipped over + $verbose and $marker and print $out "JPEG $markerName\n"; + next; + } elsif ($marker == 0xdb and length($$segDataPt) and # DQT + # save the DQT data only if JPEGDigest has been requested + # (Note: since we aren't checking the API RequestAll option here, the application + # must use the RequestTags option to generate these tags if they have not been + # specifically requested. The reason is that there is too much overhead involved + # in the calculation of this tag to make this worth the CPU time.) + ($$req{jpegdigest} or $$req{jpegqualityestimate} + or ($$options{RequestAll} and $$options{RequestAll} > 2))) + { + my $num = unpack('C',$$segDataPt) & 0x0f; # get table index + $dqt[$num] = $$segDataPt if $num < 4; # save for MD5 calculation + } + # handle all other markers + my $dumpType = ''; + my ($desc, $tip, $xtra); + $length = length $$segDataPt; + $appBytes += $length + 4 if ($marker & 0xf0) == 0xe0; # total size of APP segments + if ($verbose) { + print $out "JPEG $markerName ($length bytes):\n"; + if ($verbose > 2) { + my %extraParms = ( Addr => $segPos ); + $extraParms{MaxLen} = 128 if $verbose == 4; + HexDump($segDataPt, undef, %dumpParms, %extraParms); + } + } + # prepare dirInfo hash for processing this information + my %dirInfo = ( + Parent => $markerName, + DataPt => $segDataPt, + DataPos => $segPos, + DataLen => $length, + DirStart => 0, + DirLen => $length, + Base => 0, + ); + if ($marker == 0xe0) { # APP0 (JFIF, JFXX, CIFF, AVI1, Ocad) + if ($$segDataPt =~ /^JFIF\0/) { + $dumpType = 'JFIF'; + DirStart(\%dirInfo, 5); # start at byte 5 + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::JFIF::Main'); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($$segDataPt =~ /^JFXX\0(\x10|\x11|\x13)/) { + my $tag = ord $1; + $dumpType = 'JFXX'; + my $tagTablePtr = GetTagTable('Image::ExifTool::JFIF::Extension'); + my $tagInfo = $self->GetTagInfo($tagTablePtr, $tag); + $self->FoundTag($tagInfo, substr($$segDataPt, 6)); + } elsif ($$segDataPt =~ /^(II|MM).{4}HEAPJPGM/s) { + next if $fast > 1; # skip processing for very fast + $dumpType = 'CIFF'; + my %dirInfo = ( RAF => new File::RandomAccess($segDataPt) ); + $$self{SET_GROUP1} = 'CIFF'; + push @{$$self{PATH}}, 'CIFF'; + require Image::ExifTool::CanonRaw; + Image::ExifTool::CanonRaw::ProcessCRW($self, \%dirInfo); + pop @{$$self{PATH}}; + delete $$self{SET_GROUP1}; + } elsif ($$segDataPt =~ /^(AVI1|Ocad)/) { + $dumpType = $1; + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable("Image::ExifTool::JPEG::$dumpType"); + DirStart(\%dirInfo, 4); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + } elsif ($marker == 0xe1) { # APP1 (EXIF, XMP, QVCI, PARROT) + # (some Kodak cameras don't put a second "\0", and I have seen an + # example where there was a second 4-byte APP1 segment header) + if ($$segDataPt =~ /^(.{0,4})Exif\0/is) { + undef $dumpType; # (will be dumped here) + # this is EXIF data -- + # get the data block (into a common variable) + my $hdrLen = length($exifAPP1hdr); + if (length $1) { + $hdrLen += length $1; + $self->Warn('Unknown garbage at start of EXIF segment',1); + } elsif ($$segDataPt !~ /^Exif\0/) { + $self->Warn('Incorrect EXIF segment identifier',1); + } + if ($htmlDump) { + $self->HDump($segPos-4, 4, 'APP1 header', "Data size: $length bytes"); + $self->HDump($segPos, $hdrLen, 'Exif header', 'APP1 data type: Exif'); + $dumpEnd = $segPos + $length; + } + my $dataPt = $segDataPt; + if (defined $combinedSegData) { + push @skipData, [ $segPos-4, $segPos+$hdrLen ]; + $combinedSegData .= substr($$segDataPt,$hdrLen); + undef $$segDataPt; + $dataPt = \$combinedSegData; + $segPos = $firstSegPos; + } + # peek ahead to see if the next segment is extended EXIF + if ($nextMarker == $marker and + $$nextSegDataPt =~ /^$exifAPP1hdr(?!(MM\0\x2a|II\x2a\0))/) + { + # initialize combined data if necessary + unless (defined $combinedSegData) { + $combinedSegData = $$segDataPt; + undef $$segDataPt; + $firstSegPos = $segPos; + $self->Warn('File contains multi-segment EXIF',1); + $$self{ExtendedEXIF} = 1; + } + next; + } + $dirInfo{DataPt} = $dataPt; + $dirInfo{DataPos} = $segPos; + $dirInfo{DataLen} = $dirInfo{DirLen} = length $$dataPt; + DirStart(\%dirInfo, $hdrLen, $hdrLen); + $$self{SkipData} = \@skipData if @skipData; + # extract the EXIF information (it is in standard TIFF format) + $self->ProcessTIFF(\%dirInfo) or $self->Warn('Malformed APP1 EXIF segment'); + # avoid looking for preview unless necessary because it really slows + # us down -- only look for it if we found pointer, and preview is + # outside EXIF, and PreviewImage is specifically requested + my $start = $self->GetValue('PreviewImageStart', 'ValueConv'); + my $plen = $self->GetValue('PreviewImageLength', 'ValueConv'); + if (not $start or not $plen and $$self{PreviewError}) { + $start = $$self{PreviewImageStart}; + $plen = $$self{PreviewImageLength}; + } + if ($start and $plen and IsInt($start) and IsInt($plen) and + $start + $plen > $$self{EXIF_POS} + length($$self{EXIF_DATA}) and + ($$req{previewimage} or + # (extracted normally, so check Binary option) + ($$options{Binary} and not $$self{EXCL_TAG_LOOKUP}{previewimage}))) + { + $$self{PreviewImageStart} = $start; + $$self{PreviewImageLength} = $plen; + $wantTrailer = 1; + } + if (@skipData) { + undef @skipData; + delete $$self{SkipData}; + } + undef $$dataPt; + next; + } elsif ($$segDataPt =~ /^$xmpExtAPP1hdr/) { + # off len -- extended XMP header (75 bytes total): + # 0 35 bytes - signature + # 35 32 bytes - GUID (MD5 hash of full extended XMP data in ASCII) + # 67 4 bytes - total size of extended XMP data + # 71 4 bytes - offset for this XMP data portion + $dumpType = 'Extended XMP'; + if ($length > 75) { + my ($size, $off) = unpack('x67N2', $$segDataPt); + my $guid = substr($$segDataPt, 35, 32); + if ($guid =~ /[^A-Za-z0-9]/) { # (technically, should be uppercase) + $self->WarnOnce($tip = 'Invalid extended XMP GUID'); + } else { + my $extXMP = $extendedXMP{$guid}; + if (not $extXMP) { + $extXMP = $extendedXMP{$guid} = { }; + } elsif ($size != $$extXMP{Size}) { + $self->WarnOnce('Inconsistent extended XMP size'); + } + $$extXMP{Size} = $size; + $$extXMP{$off} = substr($$segDataPt, 75); + $tip = "Full length: $size\nChunk offset: $off\nChunk length: " . + ($length - 75) . "\nGUID: $guid"; + # (delay processing extended XMP until after reading all segments) + } + } else { + $self->WarnOnce($tip = 'Invalid extended XMP segment'); + } + } elsif ($$segDataPt =~ /^QVCI\0/) { + $dumpType = 'QVCI'; + my $tagTablePtr = GetTagTable('Image::ExifTool::Casio::QVCI'); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($$segDataPt =~ /^FLIR\0/ and $length >= 8) { + $dumpType = 'FLIR'; + # must concatenate FLIR chunks (note: handle the case where + # some software erroneously writes zeros for the chunk counts) + my $chunkNum = Get8u($segDataPt, 6); + my $chunksTot = Get8u($segDataPt, 7) + 1; # (note the "+ 1"!) + $verbose and printf $out "$$self{INDENT}FLIR chunk %d of %d\n", + $chunkNum + 1, $chunksTot; + if (defined $flirTotal) { + # abort parsing FLIR if the total chunk count is inconsistent + undef $flirCount if $chunksTot != $flirTotal; + } else { + $flirCount = 0; + $flirTotal = $chunksTot; + } + if (defined $flirCount) { + if (defined $flirChunk[$chunkNum]) { + $self->WarnOnce('Duplicate FLIR chunk number(s)'); + $flirChunk[$chunkNum] .= substr($$segDataPt, 8); + } else { + $flirChunk[$chunkNum] = substr($$segDataPt, 8); + } + # process the FLIR information if we have all of the chunks + if (++$flirCount >= $flirTotal) { + my $flir = ''; + defined $_ and $flir .= $_ foreach @flirChunk; + undef @flirChunk; # free memory + my $tagTablePtr = GetTagTable('Image::ExifTool::FLIR::FFF'); + my %dirInfo = ( + DataPt => \$flir, + Parent => $markerName, + DirName => 'FLIR', + ); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + undef $flirCount; # prevent reprocessing + } + } else { + $self->WarnOnce('Invalid or extraneous FLIR chunk(s)'); + } + } elsif ($$segDataPt =~ /^PARROT\0(II\x2a\0|MM\0\x2a)/) { + # (don't know if this could span multiple segments) + my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::Main'); + $self->HandleTag($tagTablePtr, 'APP1', $$segDataPt); + $dumpType = 'Parrot'; + } else { + # Hmmm. Could be XMP, let's see + my $processed; + if ($$segDataPt =~ /^(http|XMP\0)/ or $$segDataPt =~ /<(exif:|\?xpacket)/) { + $dumpType = 'XMP'; + # also try to parse XMP with a non-standard header + # (note: this non-standard XMP is ignored when writing) + my $start = ($$segDataPt =~ /^$xmpAPP1hdr/) ? length($xmpAPP1hdr) : 0; + my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main'); + DirStart(\%dirInfo, $start); + $dirInfo{DirName} = $start ? 'XMP' : 'XML', + $processed = $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + if ($processed and not $start) { + $self->Warn('Non-standard header for APP1 XMP segment'); + } + } + if ($verbose and not $processed) { + $self->Warn("Ignored APP1 segment length $length (unknown header)"); + } + } + } elsif ($marker == 0xe2) { # APP2 (ICC Profile, FPXR, MPF, PreviewImage) + if ($$segDataPt =~ /^ICC_PROFILE\0/ and $length >= 14) { + $dumpType = 'ICC_Profile'; + # must concatenate profile chunks (note: handle the case where + # some software erroneously writes zeros for the chunk counts) + my $chunkNum = Get8u($segDataPt, 12); + my $chunksTot = Get8u($segDataPt, 13); + $verbose and print $out "$$self{INDENT}ICC_Profile chunk $chunkNum of $chunksTot\n"; + if (defined $iccChunksTotal) { + # abort parsing ICC_Profile if the total chunk count is inconsistent + undef $iccChunkCount if $chunksTot != $iccChunksTotal; + } else { + $iccChunkCount = 0; + $iccChunksTotal = $chunksTot; + $self->Warn('ICC_Profile chunk count is zero') if !$chunksTot; + } + if (defined $iccChunkCount) { + if (defined $iccChunk[$chunkNum]) { + $self->WarnOnce('Duplicate ICC_Profile chunk number(s)'); + $iccChunk[$chunkNum] .= substr($$segDataPt, 14); + } else { + $iccChunk[$chunkNum] = substr($$segDataPt, 14); + } + # process profile if we have all of the chunks + if (++$iccChunkCount >= $iccChunksTotal) { + my $icc_profile = ''; + defined $_ and $icc_profile .= $_ foreach @iccChunk; + undef @iccChunk; # free memory + my $tagTablePtr = GetTagTable('Image::ExifTool::ICC_Profile::Main'); + my %dirInfo = ( + DataPt => \$icc_profile, + DataPos => $segPos + 14, + DataLen => length($icc_profile), + DirStart => 0, + DirLen => length($icc_profile), + Parent => $markerName, + ); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + undef $iccChunkCount; # prevent reprocessing + } + } else { + $self->WarnOnce('Invalid or extraneous ICC_Profile chunk(s)'); + } + } elsif ($$segDataPt =~ /^FPXR\0/) { + next if $fast > 1; # skip processing for very fast + $dumpType = 'FPXR'; + my $tagTablePtr = GetTagTable('Image::ExifTool::FlashPix::Main'); + # set flag if this is the last FPXR segment + $dirInfo{LastFPXR} = not ($nextMarker==$marker and $$nextSegDataPt=~/^FPXR\0/), + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($$segDataPt =~ /^MPF\0/) { + undef $dumpType; # (will be dumped here) + DirStart(\%dirInfo, 4, 4); + $dirInfo{Multi} = 1; # the MP Attribute IFD will be MPF1 + if ($htmlDump) { + $self->HDump($segPos-4, 4, 'APP2 header', "Data size: $length bytes"); + $self->HDump($segPos, 4, 'MPF header', 'APP2 data type: MPF'); + $dumpEnd = $segPos + $length; + } + # extract the MPF information (it is in standard TIFF format) + my $tagTablePtr = GetTagTable('Image::ExifTool::MPF::Main'); + $self->ProcessTIFF(\%dirInfo, $tagTablePtr); + } elsif ($$segDataPt =~ /^(|QVGA\0|BGTH)\xff\xd8\xff[\xdb\xe0\xe1]/) { + # Samsung/GE/GoPro="", BenQ DC C1220/Pentacon/Polaroid="QVGA\0", + # Digilife DDC-690/Rollei="BGTH" + $dumpType = 'Preview Image'; + $preview = substr($$segDataPt, length($1)); + } elsif ($preview) { + $dumpType = 'Preview Image'; + $preview .= $$segDataPt; + } + if ($preview and $nextMarker ne $marker) { + $self->FoundTag('PreviewImage', $preview); + undef $preview; + } + } elsif ($marker == 0xe3) { # APP3 (Kodak "Meta", Stim) + if ($$segDataPt =~ /^(Meta|META|Exif)\0\0/) { + undef $dumpType; # (will be dumped here) + DirStart(\%dirInfo, 6, 6); + if ($htmlDump) { + $self->HDump($segPos-4, 10, 'APP3 Meta header'); + $dumpEnd = $segPos + $length; + } + my $tagTablePtr = GetTagTable('Image::ExifTool::Kodak::Meta'); + $self->ProcessTIFF(\%dirInfo, $tagTablePtr); + } elsif ($$segDataPt =~ /^Stim\0/) { + undef $dumpType; # (will be dumped here) + DirStart(\%dirInfo, 6, 6); + if ($htmlDump) { + $self->HDump($segPos-4, 4, 'APP3 header', "Data size: $length bytes"); + $self->HDump($segPos, 5, 'Stim header', 'APP3 data type: Stim'); + $dumpEnd = $segPos + $length; + } + # extract the Stim information (it is in standard TIFF format) + my $tagTablePtr = GetTagTable('Image::ExifTool::Stim::Main'); + $self->ProcessTIFF(\%dirInfo, $tagTablePtr); + } elsif ($$segDataPt =~ /^_JPSJPS_/) { + $dumpType = 'JPS'; + $self->OverrideFileType('JPS') if $$self{FILE_TYPE} eq 'JPEG'; + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::JPS'); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($$self{Make} eq 'DJI') { + $dumpType = 'DJI ThermalData'; + # add this data to the combined data if it exists + my $dataPt = $segDataPt; + if (defined $combinedSegData) { + $combinedSegData .= $$segDataPt; + $dataPt = \$combinedSegData; + } + if ($nextMarker == $marker) { + $combinedSegData = $$segDataPt unless defined $combinedSegData; + } else { + # process DJI FLIR thermal data + my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::Main'); + $self->HandleTag($tagTablePtr, 'APP3', $$dataPt); + undef $combinedSegData; + } + } elsif ($$segDataPt =~ /^\xff\xd8\xff\xdb/) { + $dumpType = 'PreviewImage'; # (Samsung, HP, BenQ) + $preview = $$segDataPt; + } + if ($preview and $nextMarker ne 0xe4) { # this preview continues in APP4 + $self->FoundTag('PreviewImage', $preview); + undef $preview; + } + } elsif ($marker == 0xe4) { # APP4 ("SCALADO", FPXR, PreviewImage) + if ($$segDataPt =~ /^SCALADO\0/ and $length >= 16) { + $dumpType = 'SCALADO'; + my ($num, $idx, $len) = unpack('x8n2N', $$segDataPt); + # assume that the segments are in order and just concatinate them + $scalado = '' unless defined $scalado; + $scalado .= substr($$segDataPt, 16); + if ($idx == $num - 1) { + if ($len != length $scalado) { + $self->Warn('Possibly corrupted APP4 SCALADO data', 1); + } + my %dirInfo = ( + Parent => $markerName, + DataPt => \$scalado, + ); + my $tagTablePtr = GetTagTable('Image::ExifTool::Scalado::Main'); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + undef $scalado; + } + } elsif ($$segDataPt =~ /^FPXR\0/) { + next if $fast > 1; # skip processing for very fast + $dumpType = 'FPXR'; + my $tagTablePtr = GetTagTable('Image::ExifTool::FlashPix::Main'); + # set flag if this is the last FPXR segment + $dirInfo{LastFPXR} = not ($nextMarker==$marker and $$nextSegDataPt=~/^FPXR\0/), + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($$self{Make} eq 'DJI' and $$segDataPt =~ /^\xaa\x55\x12\x06/) { + $dumpType = 'DJI ThermalParams'; + DirStart(\%dirInfo, 0, 0); + my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::ThermalParams'); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($preview) { + # continued Samsung S1060 preview from APP3 + $dumpType = 'PreviewImage'; + $preview .= $$segDataPt; + } + # (also seen "QTI Debug Metadata\0" segment in some newer Samsung images) + # BenQ DC E1050 continues preview in APP5 + if ($preview and $nextMarker ne 0xe5) { + $self->FoundTag('PreviewImage', $preview); + undef $preview; + } + } elsif ($marker == 0xe5) { # APP5 (Ricoh "RMETA") + if ($$segDataPt =~ /^RMETA\0/) { + # (NOTE: apparently these may span multiple segments, but I haven't seen + # a sample like this, so multi-segment support hasn't yet been implemented) + $dumpType = 'Ricoh RMETA'; + DirStart(\%dirInfo, 6, 6); + my $tagTablePtr = GetTagTable('Image::ExifTool::Ricoh::RMETA'); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($$segDataPt =~ /^ssuniqueid\0/) { + my $tagTablePtr = GetTagTable('Image::ExifTool::Samsung::APP5'); + $self->HandleTag($tagTablePtr, 'ssuniqueid', substr($$segDataPt, 11)); + } elsif ($$self{Make} eq 'DJI') { + $dumpType = 'DJI ThermalCal'; + my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::Main'); + $self->HandleTag($tagTablePtr, 'APP5', $$segDataPt); + } elsif ($preview) { + $dumpType = 'PreviewImage'; + $preview .= $$segDataPt; + $self->FoundTag('PreviewImage', $preview); + undef $preview; + } + } elsif ($marker == 0xe6) { # APP6 (Toshiba EPPIM, NITF, HP_TDHD) + if ($$segDataPt =~ /^EPPIM\0/) { + undef $dumpType; # (will be dumped here) + DirStart(\%dirInfo, 6, 6); + if ($htmlDump) { + $self->HDump($segPos-4, 10, 'APP6 EPPIM header'); + $dumpEnd = $segPos + $length; + } + my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::EPPIM'); + $self->ProcessTIFF(\%dirInfo, $tagTablePtr); + } elsif ($$segDataPt =~ /^NITF\0/) { + $dumpType = 'NITF'; + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::NITF'); + DirStart(\%dirInfo, 5); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($$segDataPt =~ /^TDHD\x01\0\0\0/ and $length > 12) { + # HP Photosmart R837 APP6 "TDHD" segment + $dumpType = 'TDHD'; + my $tagTablePtr = GetTagTable('Image::ExifTool::HP::TDHD'); + # (ignore first TDHD element because size includes 12-byte tag header) + DirStart(\%dirInfo, 12); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($$segDataPt =~ /^GoPro\0/) { + # GoPro segment + $dumpType = 'GoPro'; + my $tagTablePtr = GetTagTable('Image::ExifTool::GoPro::GPMF'); + DirStart(\%dirInfo, 6); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($$segDataPt =~ /^DTAT\0\0.\{/s) { + $dumpType = 'DJI_DTAT'; + my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::Main'); + $self->HandleTag($tagTablePtr, 'APP6', $$segDataPt); + } + } elsif ($marker == 0xe7) { # APP7 (Pentax, Huawei, Qualcomm) + if ($$segDataPt =~ /^PENTAX \0(II|MM)/) { + # found in K-3 images (is this multi-segment??) + SetByteOrder($1); + undef $dumpType; # (dump this ourself) + my $hdrLen = 10; + my $tagTablePtr = GetTagTable('Image::ExifTool::Pentax::Main'); + DirStart(\%dirInfo, $hdrLen, 0); + $dirInfo{DirName} = 'Pentax APP7'; + if ($htmlDump) { + $self->HDump($segPos-4, 4, 'APP7 header', "Data size: $length bytes"); + $self->HDump($segPos, $hdrLen, 'Pentax header', 'APP7 data type: Pentax'); + $dumpEnd = $segPos + $length; + } + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($$segDataPt =~ /^HUAWEI\0\0(II|MM)/) { + SetByteOrder($1); + undef $dumpType; # (dump this ourself) + my $hdrLen = 16; + my $tagTablePtr = GetTagTable('Image::ExifTool::Unknown::Main'); + DirStart(\%dirInfo, $hdrLen, 8); + $dirInfo{DirName} = 'Huawei APP7'; + if ($htmlDump) { + $self->HDump($segPos-4, 4, 'APP7 header', "Data size: $length bytes"); + $self->HDump($segPos, $hdrLen, 'Huawei header', 'APP7 data type: Huawei'); + $dumpEnd = $segPos + $length; + } + $$self{SET_GROUP0} = 'APP7'; + $$self{SET_GROUP1} = 'Huawei'; + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + delete $$self{SET_GROUP0}; + delete $$self{SET_GROUP1}; + } elsif ($$segDataPt =~ /^\x1aQualcomm Camera Attributes/) { + # found in HP iPAQ_VoiceMessenger + $dumpType = 'Qualcomm'; + my $tagTablePtr = GetTagTable('Image::ExifTool::Qualcomm::Main'); + DirStart(\%dirInfo, 27); + $dirInfo{DirName} = 'Qualcomm'; + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + } elsif ($marker == 0xe8) { # APP8 (SPIFF) + # my sample SPIFF has 32 bytes of data, but spec states 30 + if ($$segDataPt =~ /^SPIFF\0/ and $length == 32) { + $dumpType = 'SPIFF'; + DirStart(\%dirInfo, 6); + my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::SPIFF'); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + } elsif ($marker == 0xe9) { # APP9 (Media Jukebox) + if ($$segDataPt =~ /^Media Jukebox\0/ and $length > 22) { + $dumpType = 'MediaJukebox'; + # (start parsing after the "") + DirStart(\%dirInfo, 22); + $dirInfo{DirName} = 'MediaJukebox'; + require Image::ExifTool::XMP; + my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::MediaJukebox'); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr, \&Image::ExifTool::XMP::ProcessXMP); + } + } elsif ($marker == 0xea) { # APP10 (PhotoStudio Unicode comments) + if ($$segDataPt =~ /^UNICODE\0/) { + $dumpType = 'PhotoStudio'; + my $comment = $self->Decode(substr($$segDataPt,8), 'UCS2', 'MM'); + $self->FoundTag('Comment', $comment); + } elsif ($$segDataPt =~ /^AROT\0/ and $length > 10) { + # iPhone "AROT" segment containing integrated intensity per 16 scan lines + # (with number of elements N = ImageHeight / 16 - 1, ref PH/NealKrawetz) + $xtra = 'segment (N=' . unpack('x6N', $$segDataPt) . ')'; + } + } elsif ($marker == 0xeb) { # APP11 (JPEG-HDR, JUMBF) + if ($$segDataPt =~ /^HDR_RI /) { + $dumpType = 'JPEG-HDR'; + my $dataPt = $segDataPt; + if (defined $combinedSegData) { + if ($$segDataPt =~ /~\0/g) { + $combinedSegData .= substr($$segDataPt,pos($$segDataPt)); + } else { + $self->Warn('Invalid format for JPEG-HDR extended segment'); + } + $dataPt = \$combinedSegData; + } + if ($nextMarker == $marker and $$nextSegDataPt =~ /^HDR_RI /) { + $combinedSegData = $$segDataPt unless defined $combinedSegData; + } else { + my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::HDR'); + my %dirInfo = ( DataPt => $dataPt ); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + undef $combinedSegData; + } + } elsif ($$segDataPt =~ /^(JP..)/s and length($$segDataPt) >= 16) { + # JUMBF extension marker + my $hdr = $1; + $dumpType = 'JUMBF'; + SetByteOrder('MM'); + my $seq = Get32u($segDataPt, 4) - 1; # (start from 0) + my $len = Get32u($segDataPt, 8); + my $type = substr($$segDataPt, 12, 4); + my $hdrLen; + if ($len == 1 and length($$segDataPt) >= 24) { + $len = Get64u($$segDataPt, 16); + $hdrLen = 16; + } else { + $hdrLen = 8; + } + $jumbfChunk{$type} or $jumbfChunk{$type} = [ ]; + if ($len < $hdrLen) { + $self->Warn('Invalid JUMBF segment'); + } elsif ($seq < 0) { + $self->Warn('Invalid JUMBF sequence number'); + } elsif (defined $jumbfChunk{$type}[$seq]) { + $self->Warn('Duplicate JUMBF sequence number'); + } else { + # add to list of JUMBF chunks + $jumbfChunk{$type}[$seq] = substr($$segDataPt, 8 + $hdrLen); + # check to see if we have a complete JUMBF box + my $size = $hdrLen; + foreach (@{$jumbfChunk{$type}}) { + defined $_ or $size = 0, last; + $size += length $_; + } + if ($size == $len) { + my $buff = join '', substr($$segDataPt,8,$hdrLen), @{$jumbfChunk{$type}}; + $dirInfo{DataPt} = \$buff; + $dirInfo{DataPos} = $segPos + 8; # (shows correct offsets for single-segment JUMBF) + $dirInfo{DataLen} = $dirInfo{DirLen} = $size; + my $tagTablePtr = GetTagTable('Image::ExifTool::Jpeg2000::Main'); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + delete $jumbfChunk{$type}; + } + } + } + } elsif ($marker == 0xec) { # APP12 (Ducky, Picture Info) + if ($$segDataPt =~ /^Ducky/) { + $dumpType = 'Ducky'; + DirStart(\%dirInfo, 5); + my $tagTablePtr = GetTagTable('Image::ExifTool::APP12::Ducky'); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } else { + my $tagTablePtr = GetTagTable('Image::ExifTool::APP12::PictureInfo'); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr) and $dumpType = 'Picture Info'; + } + } elsif ($marker == 0xed) { # APP13 (Photoshop, Adobe_CM) + my $isOld; + if ($$segDataPt =~ /^$psAPP13hdr/ or ($$segDataPt =~ /^$psAPP13old/ and $isOld=1)) { + $dumpType = 'Photoshop'; + # add this data to the combined data if it exists + my $dataPt = $segDataPt; + if (defined $combinedSegData) { + $combinedSegData .= substr($$segDataPt,length($psAPP13hdr)); + $dataPt = \$combinedSegData; + } + # peek ahead to see if the next segment is photoshop data too + if ($nextMarker == $marker and $$nextSegDataPt =~ /^$psAPP13hdr/) { + # initialize combined data if necessary + $combinedSegData = $$segDataPt unless defined $combinedSegData; + # (will handle the Photoshop data the next time around) + } else { + my $hdrLen = $isOld ? 27 : 14; + # process APP13 Photoshop record + my $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Main'); + my %dirInfo = ( + DataPt => $dataPt, + DataPos => $segPos, + DataLen => length $$dataPt, + DirStart => $hdrLen, # directory starts after identifier + DirLen => length($$dataPt) - $hdrLen, + Parent => $markerName, + ); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + undef $combinedSegData; + } + } elsif ($$segDataPt =~ /^Adobe_CM/) { + $dumpType = 'Adobe_CM'; + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::AdobeCM'); + DirStart(\%dirInfo, 8); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + } elsif ($marker == 0xee) { # APP14 (Adobe) + if ($$segDataPt =~ /^Adobe/) { + # extract as a block if requested, or if copying tags from file + if ($$req{adobe} or + # (not extracted normally, so check TAGS_FROM_FILE) + ($$self{TAGS_FROM_FILE} and not $$self{EXCL_TAG_LOOKUP}{adobe})) + { + $self->FoundTag('Adobe', $$segDataPt); + } + $dumpType = 'Adobe'; + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::Adobe'); + DirStart(\%dirInfo, 5); + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + } elsif ($marker == 0xef) { # APP15 (GraphicConverter) + if ($$segDataPt =~ /^Q\s*(\d+)/ and $length == 4) { + $dumpType = 'GraphicConverter'; + my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::GraphConv'); + $self->HandleTag($tagTablePtr, 'Q', $1); + } + } elsif ($marker == 0xfe) { # COM (JPEG comment) + $dumpType = 'Comment'; + $$segDataPt =~ s/\0+$//; # some dumb softwares add null terminators + $self->FoundTag('Comment', $$segDataPt); + } elsif ($marker == 0x64) { # CME (J2C comment and extension) + $dumpType = 'Comment'; + if ($length > 2) { + my $reg = unpack('n', $$segDataPt); # get registration value + my $val = substr($$segDataPt, 2); + $val = $self->Decode($val, 'Latin') if $reg == 1; + # (actually an extension for $reg==65535, but store as binary comment) + $self->FoundTag('Comment', ($reg==0 or $reg==65535) ? \$val : $val); + } + } elsif ($marker == 0x51) { # SIZ (J2C) + my ($w, $h) = unpack('x2N2', $$segDataPt); + $self->FoundTag('ImageWidth', $w); + $self->FoundTag('ImageHeight', $h); + } elsif (($marker & 0xf0) != 0xe0) { + $dumpType = "$markerName segment"; + $desc = "[JPEG $markerName]"; # (other known JPEG segments) + } + if (defined $dumpType) { + if (not $dumpType and ($$options{Unknown} or $$options{Validate})) { + my $str = ($$segDataPt =~ /^([\x20-\x7e]{1,20})\0/) ? " '${1}'" : ''; + $xtra = 'segment' unless $xtra; + $self->Warn("Unknown $markerName$str $xtra", 1); + } + if ($htmlDump) { + $desc or $desc = $markerName . ($dumpType ? " $dumpType" : '') . ' segment'; + $self->HDump($segPos-4, $length+4, $desc, $tip, 0x08); + $dumpEnd = $segPos + $length; + } + } + undef $$segDataPt; + } + # process extended XMP now if it existed + if (%extendedXMP) { + my $guid; + # GUID indicated by the last main XMP segment + my $goodGuid = $$self{VALUE}{HasExtendedXMP} || ''; + # GUID of the extended XMP that we will process ('2' for all) + my $readGuid = $$options{ExtendedXMP} || 0; + $readGuid = $goodGuid if $readGuid eq '1'; + foreach $guid (sort keys %extendedXMP) { + next unless length $guid == 32; # ignore other (internal) keys + my $extXMP = $extendedXMP{$guid}; + my ($off, @offsets, $warn); + # make sure we have all chunks, and create a list of sorted offsets + for ($off=0; $off<$$extXMP{Size}; ) { + last unless defined $$extXMP{$off}; + push @offsets, $off; + $off += length $$extXMP{$off}; + } + unless ($off == $$extXMP{Size}) { + $self->Warn("Incomplete extended XMP (GUID $guid)"); + next; + } + if ($guid eq $readGuid or $readGuid eq '2') { + $warn = 'Reading non-' if $guid ne $goodGuid; + my $buff = ''; + # assemble XMP all together + $buff .= $$extXMP{$_} foreach @offsets; + my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main'); + my %dirInfo = ( + DataPt => \$buff, + Parent => 'APP1', + IsExtended => 1, + ); + $$path[$pn] = 'APP1'; + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + pop @$path; + } else { + $warn = 'Ignored '; + $warn .= 'non-' if $guid ne $goodGuid; + } + $self->Warn("${warn}standard extended XMP (GUID $guid)") if $warn; + delete $extendedXMP{$guid}; + } + } + # calculate JPEGDigest if requested + if (@dqt) { + require Image::ExifTool::JPEGDigest; + Image::ExifTool::JPEGDigest::Calculate($self, \@dqt, $subSampling); + } + # issue necessary warnings + $self->Warn('Invalid JUMBF size or missing JUMBF chunk') if %jumbfChunk; + $self->Warn('Incomplete ICC_Profile record', 1) if defined $iccChunkCount; + $self->Warn('Incomplete FLIR record', 1) if defined $flirCount; + $self->Warn('Error reading PreviewImage', 1) if $$self{PreviewError}; + $success or $self->Warn('JPEG format error'); + pop @$path if @$path > $pn; + return 1; +} + +#------------------------------------------------------------------------------ +# Extract metadata from an Exiv2 EXV file +# Inputs: 0) ExifTool object reference, 1) dirInfo ref with RAF set +# Returns: 1 on success, 0 if this wasn't a valid JPEG file +sub ProcessEXV($$) +{ + my ($self, $dirInfo) = @_; + return $self->ProcessJPEG($dirInfo); +} + +#------------------------------------------------------------------------------ +# Process EXIF file +# Inputs/Returns: same as ProcessTIFF +sub ProcessEXIF($$;$) +{ + my ($self, $dirInfo, $tagTablePtr) = @_; + return $self->ProcessTIFF($dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Process TIFF data (wrapper for DoProcessTIFF to allow re-entry) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref +# Returns: 1 if this looked like a valid EXIF block, 0 otherwise, or -1 on write error +sub ProcessTIFF($$;$) +{ + my ($self, $dirInfo, $tagTablePtr) = @_; + my $exifData = $$self{EXIF_DATA}; + my $exifPos = $$self{EXIF_POS}; + my $rtnVal = $self->DoProcessTIFF($dirInfo, $tagTablePtr); + # restore original EXIF information (in case ProcessTIFF is nested) + if (defined $exifData) { + $$self{EXIF_DATA} = $exifData; + $$self{EXIF_POS} = $exifPos; + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Process TIFF data +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref +# Returns: 1 if this looked like a valid EXIF block, 0 otherwise, or -1 on write error +sub DoProcessTIFF($$;$) +{ + my ($self, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $fileType = $$dirInfo{Parent} || ''; + my $raf = $$dirInfo{RAF}; + my $base = $$dirInfo{Base} || 0; + my $outfile = $$dirInfo{OutFile}; + my ($err, $sig, $canonSig, $otherSig); + + # attempt to read TIFF header + $$self{EXIF_DATA} = ''; + if ($raf) { + if ($outfile) { + $raf->Seek(0, 0) or return 0; + if ($base) { + $raf->Read($$dataPt, $base) == $base or return 0; + Write($outfile, $$dataPt) or $err = 1; + } + } else { + $raf->Seek($base, 0) or return 0; + } + # extract full EXIF block (for block copy) from EXIF file + my $amount = $fileType eq 'EXIF' ? 65536 * 8 : 8; + my $n = $raf->Read($$self{EXIF_DATA}, $amount); + if ($n < 8) { + return 0 if $n or not $outfile or $fileType ne 'EXIF'; + # create EXIF file from scratch + delete $$self{EXIF_DATA}; + undef $raf; + } + if ($n > 8) { + $raf->Seek(8, 0); + if ($n == $amount) { + $$self{EXIF_DATA} = substr($$self{EXIF_DATA}, 0, 8); + $self->Warn('EXIF too large to extract as a block'); #(shouldn't happen) + } + } + } elsif ($dataPt and length $$dataPt) { + # save a copy of the EXIF data + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart); + $$self{EXIF_DATA} = substr($$dataPt, $dirStart, $dirLen); + $self->VerboseDir('TIFF') if $$self{OPTIONS}{Verbose} and length($$self{INDENT}) > 2; + } elsif ($outfile) { + delete $$self{EXIF_DATA}; # create from scratch + } else { + $$self{EXIF_DATA} = ''; + } + unless (defined $$self{EXIF_DATA}) { + # set default byte order for creating new GPS in CR3 images + my $defaultByteOrder; + if ($$dirInfo{DirName} and $$dirInfo{DirName} eq 'GPS') { + $defaultByteOrder = $$self{SaveExifByteOrder}; + } + # create TIFF information from scratch + if ($self->SetPreferredByteOrder($defaultByteOrder) eq 'MM') { + $$self{EXIF_DATA} = "MM\0\x2a\0\0\0\x08"; + } else { + $$self{EXIF_DATA} = "II\x2a\0\x08\0\0\0"; + } + } + $$self{EXIF_POS} = $base + $$self{BASE}; + $$self{FIRST_EXIF_POS} = $$self{EXIF_POS} unless defined $$self{FIRST_EXIF_POS}; + $dataPt = \$$self{EXIF_DATA}; + + # set byte ordering + my $byteOrder = substr($$dataPt,0,2); + SetByteOrder($byteOrder) or return 0; + + # verify the byte ordering + my $identifier = Get16u($dataPt, 2); + # identifier is 0x2a for TIFF (but 0x4f52, 0x5352 or ?? for ORF) + # no longer do this because various files use different values + # (TIFF=0x2a, RW2/RWL=0x55, HDP=0xbc, BTF=0x2b, ORF=0x4f52/0x5352/0x????) + # return 0 unless $identifier == 0x2a; + $self->Warn('Invalid magic number in EXIF TIFF header') if $fileType eq 'APP1' and $identifier != 0x2a; + + # get offset to IFD0 + return 0 if length $$dataPt < 8; + my $offset = Get32u($dataPt, 4); + $offset >= 8 or return 0; + + if ($raf) { + # check for canon or EXIF signature + # (Canon CR2 images should have an offset of 16, but it may be + # greater if edited by PhotoMechanic) + if ($identifier == 0x2a and $offset >= 16) { + $raf->Read($sig, 8) == 8 or return 0; + $$dataPt .= $sig; + if ($sig =~ /^(CR\x02\0|\xba\xb0\xac\xbb|ExifMeta)/) { + if ($sig eq 'ExifMeta') { + $self->SetFileType($fileType = 'EXIF'); + $otherSig = $sig; + } else { + $fileType = $sig =~ /^CR/ ? 'CR2' : 'Canon 1D RAW'; + $canonSig = $sig; + } + $self->HDump($base+8, 8, "[$fileType header]") if $$self{HTML_DUMP}; + } + } elsif ($identifier == 0x55 and $fileType =~ /^(RAW|RW2|RWL|TIFF)$/) { + # panasonic RAW, RW2 or RWL file + my $magic; + # test for RW2/RWL magic number + if ($offset >= 0x18 and $raf->Read($magic, 16) and + $magic eq "\x88\xe7\x74\xd8\xf8\x25\x1d\x4d\x94\x7a\x6e\x77\x82\x2b\x5d\x6a") + { + $fileType = 'RW2' unless $fileType eq 'RWL'; + $self->HDump($base + 8, 16, '[RW2/RWL header]') if $$self{HTML_DUMP}; + $otherSig = $magic; # save signature for writing + } else { + $fileType = 'RAW'; + } + $tagTablePtr = GetTagTable('Image::ExifTool::PanasonicRaw::Main'); + } elsif ($fileType eq 'TIFF') { + if ($identifier == 0x2b) { + # this looks like a BigTIFF image + $raf->Seek(0); + require Image::ExifTool::BigTIFF; + my $result = Image::ExifTool::BigTIFF::ProcessBTF($self, $dirInfo); + if ($result) { + $self->FoundTag(PageCount => $$self{PageCount}) if $$self{MultiPage}; + return 1; + } + } elsif ($identifier == 0x4f52 or $identifier == 0x5352) { + # Olympus ORF image (set FileType now because base type is 'ORF') + $self->SetFileType($fileType = 'ORF'); + } elsif ($identifier == 0x4352) { + $fileType = 'DCP'; + } elsif ($byteOrder eq 'II' and ($identifier & 0xff) == 0xbc) { + $fileType = 'HDP'; # Windows HD Photo file + # check version number + my $ver = Get8u($dataPt, 3); + if ($ver > 1) { + $self->Error("Windows HD Photo version $ver files not yet supported"); + return 1; + } + } + } + # we have a valid TIFF (or whatever) file + if ($fileType and not $$self{VALUE}{FileType}) { + my $lookup = $fileTypeLookup{$fileType}; + $lookup = $fileTypeLookup{$lookup} unless ref $lookup or not $lookup; + # use file extension to pre-determine type if extension is TIFF-based or type is RAW + my $baseType = $lookup ? (ref $$lookup[0] ? $$lookup[0][0] : $$lookup[0]) : ''; + my $t = ($baseType eq 'TIFF' or $fileType =~ /RAW/) ? $fileType : undef; + $self->SetFileType($t); + } + # don't process file if FastScan == 3 + return 1 if not $outfile and $$self{OPTIONS}{FastScan} and $$self{OPTIONS}{FastScan} == 3; + } + # (accommodate CR3 images which have a TIFF directory with ExifIFD at the top level) + my $ifdName = ($$dirInfo{DirName} and $$dirInfo{DirName} =~ /^(ExifIFD|GPS)$/) ? $1 : 'IFD0'; + if (not $tagTablePtr or $$tagTablePtr{GROUPS}{0} eq 'EXIF') { + $self->FoundTag('ExifByteOrder', $byteOrder) unless $outfile; + } elsif ($$tagTablePtr{GROUPS}{0} eq 'MakerNotes') { # (for writing CR3 maker notes) + $ifdName = $$tagTablePtr{GROUPS}{0}; + } else { + $ifdName = $$tagTablePtr{GROUPS}{1}; + } + if ($$self{HTML_DUMP}) { + my $tip = sprintf("Byte order: %s endian\nIdentifier: 0x%.4x\n$ifdName offset: 0x%.4x", + ($byteOrder eq 'II') ? 'Little' : 'Big', $identifier, $offset); + $self->HDump($base, 8, 'TIFF header', $tip, 0); + } + # remember where we found the TIFF data (APP1, APP3, TIFF, NEF, etc...) + $$self{TIFF_TYPE} = $fileType; + + # get reference to the main EXIF table + $tagTablePtr or $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main'); + + # build directory information hash + my %dirInfo = ( + Base => $base, + DataPt => $dataPt, + DataLen => length $$dataPt, + DataPos => 0, + DirStart => $offset, + DirLen => length($$dataPt) - $offset, + RAF => $raf, + DirName => $ifdName, + Parent => $fileType, + ImageData=> 'Main', # set flag to get information to copy main image data later + Multi => $$dirInfo{Multi}, + ); + + # extract information from the image + unless ($outfile) { + # process the directory + $self->ProcessDirectory(\%dirInfo, $tagTablePtr); + # process GeoTiff information if available + if ($$self{VALUE}{GeoTiffDirectory}) { + require Image::ExifTool::GeoTiff; + Image::ExifTool::GeoTiff::ProcessGeoTiff($self); + } + # process information in recognized trailers + if ($raf) { + my $trailInfo = IdentifyTrailer($raf); + if ($trailInfo) { + $$trailInfo{ScanForAFCP} = 1; # scan to find AFCP if necessary + $self->ProcessTrailers($trailInfo); + } + # dump any other known trailer (eg. A100 RAW Data) + if ($$self{HTML_DUMP} and $$self{KnownTrailer}) { + my $known = $$self{KnownTrailer}; + $raf->Seek(0, 2); + my $len = $raf->Tell() - $$known{Start}; + $len -= $$trailInfo{Offset} if $trailInfo; # account for other trailers + $self->HDump($$known{Start}, $len, "[$$known{Name}]") if $len > 0; + } + } + # update FileType if necessary now that we know more about the file + if ($$self{DNGVersion} and $$self{VALUE}{FileType} !~ /^(DNG|GPR)$/) { + # override whatever FileType we set since we now know it is DNG + $self->OverrideFileType($$self{TIFF_TYPE} = 'DNG'); + } + if ($$self{TIFF_TYPE} eq 'TIFF') { + $self->FoundTag(PageCount => $$self{PageCount}) if $$self{MultiPage}; + } + return 1; + } +# +# rewrite the image +# + if ($$dirInfo{NoTiffEnd}) { + delete $$self{TIFF_END}; + } else { + # initialize TIFF_END so it will be updated by WriteExif() + $$self{TIFF_END} = 0; + } + if ($canonSig) { + # write Canon CR2 specially because it has a header we want to preserve, + # and possibly trailers added by the Canon utilities and/or PhotoMechanic + $dirInfo{OutFile} = $outfile; + require Image::ExifTool::CanonRaw; + Image::ExifTool::CanonRaw::WriteCR2($self, \%dirInfo, $tagTablePtr) or $err = 1; + } else { + # write TIFF header (8 bytes [plus optional signature] followed by IFD) + if ($fileType eq 'EXIF') { + $otherSig = 'ExifMeta'; # force this signature for all EXIF files + } elsif (not defined $otherSig) { + $otherSig = ''; + } + my $offset = 8 + length($otherSig); + # construct tiff header + my $header = substr($$dataPt, 0, 4) . Set32u($offset) . $otherSig; + $dirInfo{NewDataPos} = $offset; + $dirInfo{HeaderPtr} = \$header; + # preserve padding between image data blocks in ORF images + # (otherwise dcraw has problems because it assumes fixed block spacing) + $dirInfo{PreserveImagePadding} = 1 if $fileType eq 'ORF' or $identifier != 0x2a; + my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr); + if (not defined $newData) { + $err = 1; + } elsif (length($newData)) { + # update header length in case more was added + my $hdrLen = length $header; + if ($hdrLen != 8) { + Set32u($hdrLen, \$header, 4); + # also update preview fixup if necessary + my $pi = $$self{PREVIEW_INFO}; + $$pi{Fixup}{Start} += $hdrLen - 8 if $pi and $$pi{Fixup}; + } + if ($$self{TIFF_TYPE} eq 'ARW' and not $err) { + # write any required ARW trailer and patch other ARW quirks + require Image::ExifTool::Sony; + my $errStr = Image::ExifTool::Sony::FinishARW($self, $dirInfo, \$newData, + $dirInfo{ImageData}); + $errStr and $self->Error($errStr); + delete $dirInfo{ImageData}; # (was copied by FinishARW) + } else { + Write($outfile, $header, $newData) or $err = 1; + } + undef $newData; # free memory + } + # copy over image data now if necessary + if (ref $dirInfo{ImageData} and not $err) { + $self->CopyImageData($dirInfo{ImageData}, $outfile) or $err = 1; + delete $dirInfo{ImageData}; + } + } + # make local copy of TIFF_END now (it may be reset when processing trailers) + my $tiffEnd = $$self{TIFF_END}; + delete $$self{TIFF_END}; + + # rewrite trailers if they exist + if ($raf and $tiffEnd and not $err) { + my ($buf, $trailInfo); + $raf->Seek(0, 2) or $err = 1; + my $extra = $raf->Tell() - $tiffEnd; + # check for trailer and process if possible + for (;;) { + last unless $extra > 12; + $raf->Seek($tiffEnd); # seek back to end of image + $trailInfo = IdentifyTrailer($raf); + last unless $trailInfo; + my $tbuf = ''; + $$trailInfo{OutFile} = \$tbuf; # rewrite trailer(s) + $$trailInfo{ScanForAFCP} = 1; # scan for AFCP if necessary + # rewrite all trailers to buffer + unless ($self->ProcessTrailers($trailInfo)) { + undef $trailInfo; + $err = 1; + last; + } + # calculate unused bytes before trailer + $extra = $$trailInfo{DataPos} - $tiffEnd; + last; # yes, the 'for' loop was just a cheap 'goto' + } + # ignore a single zero byte if used for padding + if ($extra > 0 and $tiffEnd & 0x01) { + $raf->Seek($tiffEnd, 0) or $err = 1; + $raf->Read($buf, 1) or $err = 1; + defined $buf and $buf eq "\0" and --$extra, ++$tiffEnd; + } + if ($extra > 0) { + my $known = $$self{KnownTrailer}; + if ($$self{DEL_GROUP}{Trailer} and not $known) { + $self->VPrint(0, " Deleting unknown trailer ($extra bytes)\n"); + ++$$self{CHANGED}; + } elsif ($known) { + $self->VPrint(0, " Copying $$known{Name} ($extra bytes)\n"); + $raf->Seek($tiffEnd, 0) or $err = 1; + CopyBlock($raf, $outfile, $extra) or $err = 1; + } else { + $raf->Seek($tiffEnd, 0) or $err = 1; + # preserve unknown trailer only if it contains non-null data + # (Photoshop CS adds a trailer with 2 null bytes) + my $size = $extra; + for (;;) { + my $n = $size > 65536 ? 65536 : $size; + $raf->Read($buf, $n) == $n or $err = 1, last; + if ($buf =~ /[^\0]/) { + $self->VPrint(0, " Preserving unknown trailer ($extra bytes)\n"); + # copy the trailer since it contains non-null data + Write($outfile, "\0"x($extra-$size)) or $err = 1, last if $size != $extra; + Write($outfile, $buf) or $err = 1, last; + CopyBlock($raf, $outfile, $size-$n) or $err = 1 if $size > $n; + last; + } + $size -= $n; + next if $size > 0; + $self->VPrint(0, " Deleting blank trailer ($extra bytes)\n"); + last; + } + } + } + # write trailer buffer if necessary + $self->WriteTrailerBuffer($trailInfo, $outfile) or $err = 1 if $trailInfo; + # add any new trailers we are creating + my $trailPt = $self->AddNewTrailers(); + Write($outfile, $$trailPt) or $err = 1 if $trailPt; + } + # check DNG version + if ($$self{DNGVersion}) { + my $ver = $$self{DNGVersion}; + # currently support up to DNG version 1.6 + unless ($ver =~ /^(\d+) (\d+)/ and "$1.$2" <= 1.6) { + $ver =~ tr/ /./; + $self->Error("DNG Version $ver not yet tested", 1); + } + } + return $err ? -1 : 1; +} + +#------------------------------------------------------------------------------ +# Return list of tag table keys (ignoring special keys) +# Inputs: 0) reference to tag table +# Returns: List of table keys (unsorted) +sub TagTableKeys($) +{ + local $_; + my $tagTablePtr = shift; + my @keyList; + foreach (keys %$tagTablePtr) { + push(@keyList, $_) unless $specialTags{$_}; + } + return @keyList; +} + +#------------------------------------------------------------------------------ +# GetTagTable +# Inputs: 0) table name +# Returns: tag table reference, or undefined if not found +# Notes: Always use this function instead of requiring module and using table +# directly since this function also does the following the first time the table +# is loaded: +# - requires new module if necessary +# - generates default GROUPS hash and Group 0 name from module name +# - registers Composite tags if Composite table found +# - saves descriptions for tags in specified table +# - generates default TAG_PREFIX to be used for unknown tags +sub GetTagTable($) +{ + my $tableName = shift or return undef; + my $table = $allTables{$tableName}; + + unless ($table) { + no strict 'refs'; + unless (%$tableName) { + # try to load module for this table + if ($tableName =~ /(.*)::/) { + my $module = $1; + if (eval "require $module") { + # load additional modules if required + if (not %$tableName) { + if ($module eq 'Image::ExifTool::XMP') { + require 'Image/ExifTool/XMP2.pl'; + } elsif ($tableName eq 'Image::ExifTool::QuickTime::Stream') { + require 'Image/ExifTool/QuickTimeStream.pl'; + } + } + } else { + $@ and warn $@; + } + } + unless (%$tableName) { + warn "Can't find table $tableName\n"; + return undef; + } + } + no strict 'refs'; + $table = \%$tableName; + use strict 'refs'; + &{$$table{INIT_TABLE}}($table) if $$table{INIT_TABLE}; + $$table{TABLE_NAME} = $tableName; # set table name + ($$table{SHORT_NAME} = $tableName) =~ s/^Image::ExifTool:://; + # set default group 0 and 1 from module name unless already specified + my $defaultGroups = $$table{GROUPS}; + $defaultGroups or $defaultGroups = $$table{GROUPS} = { }; + unless ($$defaultGroups{0} and $$defaultGroups{1}) { + if ($tableName =~ /Image::.*?::([^:]*)/) { + $$defaultGroups{0} = $1 unless $$defaultGroups{0}; + $$defaultGroups{1} = $1 unless $$defaultGroups{1}; + } else { + $$defaultGroups{0} = $tableName unless $$defaultGroups{0}; + $$defaultGroups{1} = $tableName unless $$defaultGroups{1}; + } + } + $$defaultGroups{2} = 'Other' unless $$defaultGroups{2}; + if ($$defaultGroups{0} eq 'XMP' or $$table{NAMESPACE}) { + # initialize some XMP table defaults + require Image::ExifTool::XMP; + Image::ExifTool::XMP::RegisterNamespace($table); # register all table namespaces + # set default write/check procs + $$table{WRITE_PROC} = \&Image::ExifTool::XMP::WriteXMP unless $$table{WRITE_PROC}; + $$table{CHECK_PROC} = \&Image::ExifTool::XMP::CheckXMP unless $$table{CHECK_PROC}; + $$table{LANG_INFO} = \&Image::ExifTool::XMP::GetLangInfo unless $$table{LANG_INFO}; + } + # generate a tag prefix for unknown tags if necessary + unless (defined $$table{TAG_PREFIX}) { + my $tagPrefix; + if ($tableName =~ /Image::.*?::(.*)::Main/ || $tableName =~ /Image::.*?::(.*)/) { + ($tagPrefix = $1) =~ s/::/_/g; + } else { + $tagPrefix = $tableName; + } + $$table{TAG_PREFIX} = $tagPrefix; + } + # set up the new table + SetupTagTable($table); + # add any user-defined tags (except Composite tags, which are handled specially) + if (%UserDefined and $UserDefined{$tableName} and $table ne \%Image::ExifTool::Composite) { + my $tagID; + foreach $tagID (TagTableKeys($UserDefined{$tableName})) { + next if $specialTags{$tagID}; + delete $$table{$tagID}; # replace any existing entry + AddTagToTable($table, $tagID, $UserDefined{$tableName}{$tagID}, 1); + } + } + # remember order we loaded the tables in + push @tableOrder, $tableName; + # insert newly loaded table into list + $allTables{$tableName} = $table; + } + # must check each time to add UserDefined Composite tags because the Composite table + # may be loaded before the UserDefined tags are available + if ($table eq \%Image::ExifTool::Composite and not $$table{VARS}{LOADED_USERDEFINED} and + %UserDefined and $UserDefined{$tableName}) + { + my $userComp = $UserDefined{$tableName}; + delete $UserDefined{$tableName}; # (must delete first to avoid infinite recursion) + AddCompositeTags($userComp, 1); + $UserDefined{$tableName} = $userComp; # (add back again for adding writable tags later) + $$table{VARS}{LOADED_USERDEFINED} = 1; # set flag to avoid doing this again + } + return $table; +} + +#------------------------------------------------------------------------------ +# Process an image directory +# Inputs: 0) ExifTool object reference, 1) directory information reference +# 2) tag table reference, 3) optional reference to processing procedure +# Returns: Result from processing (1=success) +sub ProcessDirectory($$$;$) +{ + my ($self, $dirInfo, $tagTablePtr, $proc) = @_; + + return 0 unless $tagTablePtr and $dirInfo; + # use default proc from tag table or EXIF proc as fallback if no proc specified + $proc or $proc = $$tagTablePtr{PROCESS_PROC} || \&Image::ExifTool::Exif::ProcessExif; + # set directory name from default group0 name if not done already + my $dirName = $$dirInfo{DirName}; + unless ($dirName) { + $dirName = $$tagTablePtr{GROUPS}{0}; + $dirName = $$tagTablePtr{GROUPS}{1} if $dirName =~ /^APP\d+$/; # (use specific APP name) + $$dirInfo{DirName} = $dirName; + } + + # guard against cyclical recursion into the same directory + if (defined $$dirInfo{DirStart} and defined $$dirInfo{DataPos} and + # directories don't overlap if the length is zero + ($$dirInfo{DirLen} or not defined $$dirInfo{DirLen})) + { + my $addr = $$dirInfo{DirStart} + $$dirInfo{DataPos} + ($$dirInfo{Base}||0) + $$self{BASE}; + if ($$self{PROCESSED}{$addr}) { + $self->Warn("$dirName pointer references previous $$self{PROCESSED}{$addr} directory"); + # patch for bug in Windows phone 7.5 O/S that writes incorrect InteropIFD pointer + return 0 unless $dirName eq 'GPS' and $$self{PROCESSED}{$addr} eq 'InteropIFD'; + } + $$self{PROCESSED}{$addr} = $dirName; + } + my $oldOrder = GetByteOrder(); + my @save = @$self{'INDENT','DIR_NAME','Compression','SubfileType'}; + $$self{LIST_TAGS} = { }; # don't build lists across different directories + $$self{INDENT} .= '| '; + $$self{DIR_NAME} = $dirName; + push @{$$self{PATH}}, $dirName; + $$self{FOUND_DIR}{$dirName} = 1; + + # process the directory + no strict 'refs'; + my $rtnVal = &$proc($self, $dirInfo, $tagTablePtr); + use strict 'refs'; + + pop @{$$self{PATH}}; + @$self{'INDENT','DIR_NAME','Compression','SubfileType'} = @save; + SetByteOrder($oldOrder); + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Get Metadata path +# Inputs: 0) ExifTool object ref +# Return: Metadata path string +sub MetadataPath($) +{ + my $self = shift; + return join '-', @{$$self{PATH}} +} + +#------------------------------------------------------------------------------ +# Get standardized file extension +# Inputs: 0) file name +# Returns: standardized extension (all uppercase), or undefined if no extension +sub GetFileExtension($) +{ + my $filename = shift; + my $fileExt; + if ($filename and $filename =~ /^.*\.([^.]+)$/s) { + $fileExt = uc($1); # change extension to upper case + # convert TIF extension to TIFF because we use the + # extension for the file type tag of TIFF images + $fileExt eq 'TIF' and $fileExt = 'TIFF'; + } + return $fileExt; +} + +#------------------------------------------------------------------------------ +# Get list of tag information hashes for given tag ID +# Inputs: 0) Tag table reference, 1) tag ID +# Returns: Array of tag information references +# Notes: Generates tagInfo hash if necessary +sub GetTagInfoList($$) +{ + my ($tagTablePtr, $tagID) = @_; + my $tagInfo = $$tagTablePtr{$tagID}; + + if ($specialTags{$tagID}) { + # (hopefully this won't happen) + warn "Tag $tagID conflicts with internal ExifTool variable in $$tagTablePtr{TABLE_NAME}\n"; + } elsif (ref $tagInfo eq 'HASH') { + return ($tagInfo); + } elsif (ref $tagInfo eq 'ARRAY') { + return @$tagInfo; + } elsif ($tagInfo) { + # create hash with name + $tagInfo = $$tagTablePtr{$tagID} = { Name => $tagInfo }; + return ($tagInfo); + } + return (); +} + +#------------------------------------------------------------------------------ +# Find tag information, processing conditional tags +# Inputs: 0) ExifTool object reference, 1) tagTable pointer, 2) tag ID +# 3) optional value reference, 4) optional format type, 5) optional value count +# Returns: pointer to tagInfo hash, undefined if none found, or '' if $valPt needed +# Notes: You should always call this routine to find a tag in a table because +# this routine will evaluate conditional tags. +# Arguments 3-5 are only required if the information type allows $valPt, $format and/or +# $count in a Condition, and if not given when needed this routine returns ''. +sub GetTagInfo($$$;$$$) +{ + my ($self, $tagTablePtr, $tagID) = @_; + my ($valPt, $format, $count); + + my @infoArray = GetTagInfoList($tagTablePtr, $tagID); + # evaluate condition + my $tagInfo; + foreach $tagInfo (@infoArray) { + my $condition = $$tagInfo{Condition}; + if ($condition) { + ($valPt, $format, $count) = splice(@_, 3) if @_ > 3; + return '' if $condition =~ /\$(valPt|format|count)\b/ and not defined $valPt; + # set old value for use in condition if needed + local $SIG{'__WARN__'} = \&SetWarning; + undef $evalWarning; + #### eval Condition ($self, [$valPt, $format, $count]) + unless (eval $condition) { + $@ and $evalWarning = $@; + $self->Warn("Condition $$tagInfo{Name}: " . CleanWarning()) if $evalWarning; + next; + } + } + # don't return Unknown tags unless that option is set (also see forum13716) + if ($$tagInfo{Unknown} and not $$self{OPTIONS}{Unknown} and not + ($$self{OPTIONS}{Verbose} or $$self{HTML_DUMP} or + ($$self{OPTIONS}{Validate} and not $$tagInfo{AddedUnknown}))) + { + return undef; + } + # return the tag information we found + return $tagInfo; + } + # generate information for unknown tags (numerical only) if required + if (not $tagInfo and ($$self{OPTIONS}{Unknown} or $$self{OPTIONS}{Verbose}) and + $tagID =~ /^\d+$/ and not $$self{NO_UNKNOWN}) + { + my $printConv; + if (defined $$tagTablePtr{PRINT_CONV}) { + $printConv = $$tagTablePtr{PRINT_CONV}; + } else { + # limit length of printout (can be very long) + $printConv = 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val'; + } + my $hex = sprintf("0x%.4x", $tagID); + my $prefix = $$tagTablePtr{TAG_PREFIX}; + $tagInfo = { + Name => "${prefix}_$hex", + Description => MakeDescription($prefix, $hex), + Unknown => 1, + Writable => 0, # can't write unknown tags + PrintConv => $printConv, + AddedUnknown => 1, + }; + # add tag information to table + AddTagToTable($tagTablePtr, $tagID, $tagInfo); + } else { + undef $tagInfo; + } + return $tagInfo; +} + +#------------------------------------------------------------------------------ +# Add new tag to table (must use this routine to add new tags to a table) +# Inputs: 0) reference to tag table, 1) tag ID +# 2) [optional] tag name or reference to tag information hash +# 3) [optional] flag to avoid adding prefix when generating tag name +# Returns: tagInfo ref +# Notes: - will not override existing entry in table +# - info need contain no entries when this routine is called +# - tag name is cleaned if necessary +sub AddTagToTable($$;$$) +{ + my ($tagTablePtr, $tagID, $tagInfo, $noPrefix) = @_; + + # generate tag info hash if necessary + $tagInfo = $tagInfo ? { Name => $tagInfo } : { } unless ref $tagInfo eq 'HASH'; + + # define necessary entries in information hash + if ($$tagInfo{Groups}) { + # fill in default groups from table GROUPS + foreach (keys %{$$tagTablePtr{GROUPS}}) { + next if $$tagInfo{Groups}{$_}; + $$tagInfo{Groups}{$_} = $$tagTablePtr{GROUPS}{$_}; + } + } else { + $$tagInfo{Groups} = { %{$$tagTablePtr{GROUPS}} }; + } + $$tagInfo{Flags} and ExpandFlags($tagInfo); + $$tagInfo{GotGroups} = 1, + $$tagInfo{Table} = $tagTablePtr; + $$tagInfo{TagID} = $tagID; + if (defined $$tagTablePtr{AVOID} and not defined $$tagInfo{Avoid}) { + $$tagInfo{Avoid} = $$tagTablePtr{AVOID}; + } + + my $name = $$tagInfo{Name}; + $name = $tagID unless defined $name; + $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters + $name = ucfirst $name; # capitalize first letter + # add tag-name prefix if specified and tag name not provided + unless (defined $$tagInfo{Name} or $noPrefix or not $$tagTablePtr{TAG_PREFIX}) { + # make description to prevent tagID from getting mangled by MakeDescription() + $$tagInfo{Description} = MakeDescription($$tagTablePtr{TAG_PREFIX}, $name); + $name = "$$tagTablePtr{TAG_PREFIX}_$name"; + } + # tag names must be at least 2 characters long and prefer them to start with a letter + $name = "Tag$name" if length($name) < 2 or $name !~ /^[A-Z]/i; + $$tagInfo{Name} = $name; + # add tag to table, but never override existing entries (could potentially happen + # if someone thinks there isn't any tagInfo because a condition wasn't satisfied) + unless (defined $$tagTablePtr{$tagID} or $specialTags{$tagID}) { + $$tagTablePtr{$tagID} = $tagInfo; + } + return $tagInfo; +} + +#------------------------------------------------------------------------------ +# Handle simple extraction of new tag information +# Inputs: 0) ExifTool object ref, 1) tag table reference, 2) tagID, 3) value, +# 4-N) parameters hash: Index, DataPt, DataPos, Base, Start, Size, Parent, +# TagInfo, ProcessProc, RAF, Format, Count +# Returns: tag key or undef if tag not found +# Notes: if value is not defined, it is extracted from DataPt using TagInfo +# Format and Count if provided +sub HandleTag($$$$;%) +{ + my ($self, $tagTablePtr, $tag, $val, %parms) = @_; + my $verbose = $$self{OPTIONS}{Verbose}; + my $pfmt = $parms{Format}; + my $tagInfo = $parms{TagInfo} || $self->GetTagInfo($tagTablePtr, $tag, \$val, $pfmt, $parms{Count}); + my $dataPt = $parms{DataPt}; + my ($subdir, $format, $noTagInfo, $rational); + + if ($tagInfo) { + $subdir = $$tagInfo{SubDirectory}; + } else { + return undef unless $verbose; + $tagInfo = { Name => "tag $tag" }; # create temporary tagInfo hash + $noTagInfo = 1; + } + # read value if not done already (not necessary for subdir) + unless (defined $val or ($subdir and not $$tagInfo{Writable} and not $$tagInfo{RawConv})) { + my $start = $parms{Start} || 0; + my $dLen = $dataPt ? length($$dataPt) : -1; + my $size = $parms{Size}; + $size = $dLen unless defined $size; + # read from data in memory if possible + if ($start >= 0 and $start + $size <= $dLen) { + $format = $$tagInfo{Format} || $$tagTablePtr{FORMAT}; + $format = $pfmt if not $format and $pfmt and $formatSize{$pfmt}; + if ($format) { + $val = ReadValue($dataPt, $start, $format, $$tagInfo{Count}, $size, \$rational); + } else { + $val = substr($$dataPt, $start, $size); + } + } else { + $self->Warn("Error extracting value for $$tagInfo{Name}"); + return undef; + } + } + # do verbose print if necessary + if ($verbose) { + undef $tagInfo if $noTagInfo; + $parms{Value} = $val; + $parms{Value} .= " ($rational)" if defined $rational; + $parms{Table} = $tagTablePtr; + if ($format) { + my $count = int(($parms{Size} || 0) / ($formatSize{$format} || 1)); + $parms{Format} = $format . "[$count]"; + } + $self->VerboseInfo($tag, $tagInfo, %parms); + } + if ($tagInfo) { + if ($subdir) { + my $subdirStart = $parms{Start}; + my $subdirLen = $parms{Size}; + if ($$tagInfo{RawConv} and not $$tagInfo{Writable}) { + my $conv = $$tagInfo{RawConv}; + local $SIG{'__WARN__'} = \&SetWarning; + undef $evalWarning; + if (ref $conv eq 'CODE') { + $val = &$conv($val, $self); + } else { + my ($priority, @grps); + # NOTE: RawConv is evaluated in Writer.pl and twice in ExifTool.pm + #### eval RawConv ($self, $val, $tag, $tagInfo, $priority, @grps) + $val = eval $conv; + $@ and $evalWarning = $@; + } + $self->Warn("RawConv $tag: " . CleanWarning()) if $evalWarning; + return undef unless defined $val; + $val = $$val if ref $val eq 'SCALAR'; + $dataPt = \$val; + $subdirStart = 0; + $subdirLen = length $val; + } + if ($$subdir{Start}) { + my $valuePtr = 0; + #### eval Start ($valuePtr) + my $off = eval $$subdir{Start}; + $subdirStart += $off; + $subdirLen -= $off; + } + $dataPt or $dataPt = \$val; + # process subdirectory information + my %dirInfo = ( + DirName => $$subdir{DirName} || $$tagInfo{Name}, + DataPt => $dataPt, + DataLen => length $$dataPt, + DataPos => $parms{DataPos}, + DirStart => $subdirStart, + DirLen => $subdirLen, + Parent => $parms{Parent}, + Base => $parms{Base}, + Multi => $$subdir{Multi}, + TagInfo => $tagInfo, + RAF => $parms{RAF}, + ); + my $oldOrder = GetByteOrder(); + if ($$subdir{ByteOrder}) { + if ($$subdir{ByteOrder} eq 'Unknown') { + if ($subdirStart + 2 <= $subdirLen) { + # attempt to determine the byte ordering of an IFD-style subdirectory + my $num = Get16u($dataPt, $subdirStart); + ToggleByteOrder if $num & 0xff00 and ($num>>8) > ($num&0xff); + } + } else { + SetByteOrder($$subdir{ByteOrder}); + } + } + my $subTablePtr = GetTagTable($$subdir{TagTable}) || $tagTablePtr; + $self->ProcessDirectory(\%dirInfo, $subTablePtr, $$subdir{ProcessProc} || $parms{ProcessProc}); + SetByteOrder($oldOrder); + # return now unless directory is writable as a block + return undef unless $$tagInfo{Writable}; + } + my $key = $self->FoundTag($tagInfo, $val); + # save original components of rational numbers + $$self{RATIONAL}{$key} = $rational if defined $rational and defined $key; + return $key; + } + return undef; +} + +#------------------------------------------------------------------------------ +# Add tag to hash of extracted information +# Inputs: 0) ExifTool object reference +# 1) reference to tagInfo hash or tag name +# 2) data value (or reference to require hash if Composite) +# 3) optional family 0 group, 4) optional family 1 group +# Returns: tag key or undef if no value +sub FoundTag($$$;@) +{ + local $_; + my ($self, $tagInfo, $value, @grps) = @_; + my ($tag, $noListDel); + my $options = $$self{OPTIONS}; + + if (ref $tagInfo eq 'HASH') { + $tag = $$tagInfo{Name} or warn("No tag name\n"), return undef; + } else { + $tag = $tagInfo; + # look for tag in Extra + $tagInfo = $self->GetTagInfo(GetTagTable('Image::ExifTool::Extra'), $tag); + # make temporary hash if tag doesn't exist in Extra + # (not advised to do this since the tag won't show in list) + $tagInfo or $tagInfo = { Name => $tag, Groups => \%allGroupsExifTool }; + $$options{Verbose} and $self->VerboseInfo(undef, $tagInfo, Value => $value); + } + # get tag priority + my $priority = $$tagInfo{Priority}; + unless (defined $priority) { + $priority = $$tagInfo{Table}{PRIORITY}; + $priority = 0 if not defined $priority and $$tagInfo{Avoid}; + } + $grps[0] or $grps[0] = $$self{SET_GROUP0}; + $grps[1] or $grps[1] = $$self{SET_GROUP1}; + my $valueHash = $$self{VALUE}; + + if ($$tagInfo{RawConv}) { + # initialize @val for use in Composite RawConv expressions + my @val; + if (ref $value eq 'HASH' and $$tagInfo{IsComposite}) { + foreach (keys %$value) { $val[$_] = $$valueHash{$$value{$_}}; } + } + my $conv = $$tagInfo{RawConv}; + local $SIG{'__WARN__'} = \&SetWarning; + undef $evalWarning; + if (ref $conv eq 'CODE') { + $value = &$conv($value, $self); + $$self{grps} and @grps = @{$$self{grps}}, delete $$self{grps}; + } else { + my $val = $value; # do this so eval can use $val + # NOTE: RawConv is also evaluated in Writer.pl + #### eval RawConv ($self, $val, $tag, $tagInfo, $priority, @grps) + $value = eval $conv; + $@ and $evalWarning = $@; + } + $self->Warn("RawConv $tag: " . CleanWarning()) if $evalWarning; + return undef unless defined $value; + } + # ignore specified tags (AFTER doing RawConv if necessary!) + if ($$options{IgnoreTags}) { + if ($$options{IgnoreTags}{all}) { + return undef unless $$self{REQ_TAG_LOOKUP}{lc $tag}; + } else { + return undef if $$options{IgnoreTags}{lc $tag}; + } + } + # handle duplicate tag names + if (defined $$valueHash{$tag}) { + # add to list if there is an active list for this tag + if ($$self{LIST_TAGS}{$tagInfo}) { + $tag = $$self{LIST_TAGS}{$tagInfo}; # use key from previous list tag + if (defined $$self{NO_LIST}) { + # accumulate list in TAG_EXTRA "NoList" element + if (defined $$self{TAG_EXTRA}{$tag}{NoList}) { + push @{$$self{TAG_EXTRA}{$tag}{NoList}}, $value; + } else { + $$self{TAG_EXTRA}{$tag}{NoList} = [ $$valueHash{$tag}, $value ]; + } + $noListDel = 1; # set flag to delete this tag if re-listed + } else { + if (ref $$valueHash{$tag} ne 'ARRAY') { + $$valueHash{$tag} = [ $$valueHash{$tag} ]; + } + push @{$$valueHash{$tag}}, $value; + return $tag; # return without creating a new entry + } + } + # get next available tag key + my $nextInd = $$self{DUPL_TAG}{$tag} = ($$self{DUPL_TAG}{$tag} || 0) + 1; + my $nextTag = "$tag ($nextInd)"; +# +# take tag with highest priority +# + # promote existing 0-priority tag so it takes precedence over a new 0-tag + # (unless old tag was a sub-document and new tag isn't. Also, never override + # a Warning tag because they may be added by ValueConv, which could be confusing) + my $oldPriority = $$self{PRIORITY}{$tag}; + unless ($oldPriority) { + if ($$self{DOC_NUM} or not $$self{TAG_EXTRA}{$tag} or $tag eq 'Warning' or + not $$self{TAG_EXTRA}{$tag}{G3}) + { + $oldPriority = 1; + } else { + $oldPriority = 0; # don't promote sub-document tag over main document + } + } + # set priority for this tag + if (defined $priority) { + # increase 0-priority tags if this is the priority directory + $priority = 1 if not $priority and $$self{DIR_NAME} and + $$self{DIR_NAME} eq $$self{PRIORITY_DIR}; + } elsif ($$self{LOW_PRIORITY_DIR}{'*'} or + ($$self{DIR_NAME} and $$self{LOW_PRIORITY_DIR}{$$self{DIR_NAME}})) + { + $priority = 0; # default is 0 for a LOW_PRIORITY_DIR + } else { + $priority = 1; # the normal default + } + if ($priority >= $oldPriority and (not $$self{DOC_NUM} or + ($$self{TAG_EXTRA}{$tag} and $$self{TAG_EXTRA}{$tag}{G3} and + $$self{DOC_NUM} eq $$self{TAG_EXTRA}{$tag}{G3})) and not $noListDel) + { + # move existing tag out of the way since this tag is higher priority + # (NOTE: any new members added here must also be added to DeleteTag()) + $$self{PRIORITY}{$nextTag} = $$self{PRIORITY}{$tag}; + $$valueHash{$nextTag} = $$valueHash{$tag}; + $$self{FILE_ORDER}{$nextTag} = $$self{FILE_ORDER}{$tag}; + my $oldInfo = $$self{TAG_INFO}{$nextTag} = $$self{TAG_INFO}{$tag}; + foreach ('TAG_EXTRA','RATIONAL') { + if ($$self{$_}{$tag}) { + $$self{$_}{$nextTag} = $$self{$_}{$tag}; + delete $$self{$_}{$tag}; + } + } + delete $$self{BOTH}{$tag}; + # update tag key for list if necessary + $$self{LIST_TAGS}{$oldInfo} = $nextTag if $$self{LIST_TAGS}{$oldInfo}; + # update this key if used in a Composite tag + if ($$self{COMP_KEYS}{$tag}) { + $$_[0]{$$_[1]} = $nextTag foreach @{$$self{COMP_KEYS}{$tag}}; + $$self{COMP_KEYS}{$nextTag} = $$self{COMP_KEYS}{$tag}; + delete $$self{COMP_KEYS}{$tag}; + } + } else { + $tag = $nextTag; # don't override the existing tag + } + $$self{PRIORITY}{$tag} = $priority; + $$self{TAG_EXTRA}{$tag}{NoListDel} = 1 if $noListDel; + } elsif ($priority) { + # set tag priority (only if exists and is non-zero) + $$self{PRIORITY}{$tag} = $priority; + } + + # save the raw value, file order, tagInfo ref, group1 name, + # and tag key for lists if necessary + $$valueHash{$tag} = $value; + $$self{FILE_ORDER}{$tag} = ++$$self{NUM_FOUND}; + $$self{TAG_INFO}{$tag} = $tagInfo; + # set dynamic groups 0, 1 and 3 if necessary + $$self{TAG_EXTRA}{$tag}{G0} = $grps[0] if $grps[0]; + $$self{TAG_EXTRA}{$tag}{G1} = $grps[1] if $grps[1]; + if ($$self{DOC_NUM}) { + $$self{TAG_EXTRA}{$tag}{G3} = $$self{DOC_NUM}; + if ($$self{DOC_NUM} =~ /^(\d+)/) { + # keep track of maximum 1st-level sub-document number + $$self{DOC_COUNT} = $1 unless $$self{DOC_COUNT} >= $1; + } + } + # save path if requested + $$self{TAG_EXTRA}{$tag}{G5} = $self->MetadataPath() if $$options{SavePath}; + + # remember this tagInfo if we will be accumulating values in a list + # (but don't override earlier list if this may be deleted by NoListDel flag) + if ($$tagInfo{List} and not $$self{NO_LIST} and not $noListDel) { + $$self{LIST_TAGS}{$tagInfo} = $tag; + } + + # validate tag if requested (but only for simple values -- could result + # in infinite recursion if called for a Composite tag (HASH ref value) + # because FoundTag is called in the middle of building Composite tags + if ($$options{Validate} and not ref $value) { + Image::ExifTool::Validate::ValidateRaw($self, $tag, $value); + } + + return $tag; +} + +#------------------------------------------------------------------------------ +# Make current directory the priority directory if not set already +# Inputs: 0) ExifTool object reference +sub SetPriorityDir($) +{ + my $self = shift; + $$self{PRIORITY_DIR} = $$self{DIR_NAME} unless $$self{PRIORITY_DIR}; +} + +#------------------------------------------------------------------------------ +# Set family 0 or 1 group name specific to this tag instance +# Inputs: 0) ExifTool ref, 1) tag key, 2) group name, 3) family (default 1) +sub SetGroup($$$;$) +{ + my ($self, $tagKey, $extra, $fam) = @_; + $$self{TAG_EXTRA}{$tagKey}{defined $fam ? "G$fam" : 'G1'} = $extra; +} + +#------------------------------------------------------------------------------ +# Delete specified tag +# Inputs: 0) ExifTool object ref, 1) tag key +sub DeleteTag($$) +{ + my ($self, $tag) = @_; + delete $$self{VALUE}{$tag}; + delete $$self{FILE_ORDER}{$tag}; + delete $$self{TAG_INFO}{$tag}; + delete $$self{TAG_EXTRA}{$tag}; + delete $$self{PRIORITY}{$tag}; + delete $$self{RATIONAL}{$tag}; + delete $$self{BOTH}{$tag}; +} + +#------------------------------------------------------------------------------ +# Escape all elements of a value +# Inputs: 0) value, 1) escape proc +sub DoEscape($$) +{ + my ($val, $key); + if (not ref $_[0]) { + $_[0] = &{$_[1]}($_[0]); + } elsif (ref $_[0] eq 'ARRAY') { + foreach $val (@{$_[0]}) { + DoEscape($val, $_[1]); + } + } elsif (ref $_[0] eq 'HASH') { + foreach $key (keys %{$_[0]}) { + DoEscape($_[0]{$key}, $_[1]); + } + } +} + +#------------------------------------------------------------------------------ +# Set the FileType and MIMEType tags +# Inputs: 0) ExifTool object reference +# 1) Optional file type (uses FILE_TYPE if not specified) +# 2) Optional MIME type (uses our lookup if not specified) +# 3) Optional recommended extension (converted to lower case; uses FileType if undef) +# Notes: Will NOT set file type twice (subsequent calls ignored) +sub SetFileType($;$$$) +{ + my ($self, $fileType, $mimeType, $normExt) = @_; + unless ($$self{VALUE}{FileType} and not $$self{DOC_NUM}) { + my $baseType = $$self{FILE_TYPE}; + my $ext = $$self{FILE_EXT}; + $fileType or $fileType = $baseType; + # handle sub-types which are identified by extension + if (defined $ext and $ext ne $fileType and not $$self{DOC_NUM}) { + my ($f,$e) = @fileTypeLookup{$fileType,$ext}; + if (ref $f eq 'ARRAY' and ref $e eq 'ARRAY' and $$f[0] eq $$e[0]) { + # make sure $fileType was a root type and not another sub-type + $fileType = $ext if $$f[0] eq $fileType or not $fileTypeLookup{$$f[0]}; + } + } + $mimeType or $mimeType = $mimeType{$fileType}; + # use base file type if necessary (except if 'TIFF', which is a special case) + $mimeType = $mimeType{$baseType} unless $mimeType or $baseType eq 'TIFF'; + unless (defined $normExt) { + $normExt = $fileTypeExt{$fileType}; + $normExt = $fileType unless defined $normExt; + } + $$self{FileType} = $fileType; + $self->FoundTag('FileType', $fileType); + $self->FoundTag('FileTypeExtension', uc $normExt); + $self->FoundTag('MIMEType', $mimeType || 'application/unknown'); + } +} + +#------------------------------------------------------------------------------ +# Override the FileType and MIMEType tags +# Inputs: 0) ExifTool object ref, 1) file type, 2) MIME type, 3) normal extension (lower case) +# Notes: does nothing if FileType was not previously defined (ie. when writing) +sub OverrideFileType($$;$$) +{ + my ($self, $fileType, $mimeType, $normExt) = @_; + if (defined $$self{VALUE}{FileType} and $fileType ne $$self{VALUE}{FileType}) { + $$self{FileType} = $fileType; + $$self{VALUE}{FileType} = $fileType; + unless (defined $normExt) { + $normExt = $fileTypeExt{$fileType}; + $normExt = $fileType unless defined $normExt; + } + $$self{VALUE}{FileTypeExtension} = uc $normExt; + $mimeType or $mimeType = $mimeType{$fileType}; + $$self{VALUE}{MIMEType} = $mimeType if $mimeType; + if ($$self{OPTIONS}{Verbose}) { + $self->VPrint(0,"$$self{INDENT}FileType [override] = $fileType\n"); + $self->VPrint(0,"$$self{INDENT}FileTypeExtension [override] = $$self{VALUE}{FileTypeExtension}\n"); + $self->VPrint(0,"$$self{INDENT}MIMEType [override] = $mimeType\n") if $mimeType; + } + } +} + +#------------------------------------------------------------------------------ +# Modify the value of the MIMEType tag +# Inputs: 0) ExifTool object reference, 1) file or MIME type +# Notes: combines existing type with new type: ie) a/b + c/d => c/b-d +sub ModifyMimeType($;$) +{ + my ($self, $mime) = @_; + $mime =~ m{/} or $mime = $mimeType{$mime} or return; + my $old = $$self{VALUE}{MIMEType}; + if (defined $old) { + my ($a, $b) = split '/', $old; + my ($c, $d) = split '/', $mime; + $d =~ s/^x-//; + $$self{VALUE}{MIMEType} = "$c/$b-$d"; + $self->VPrint(0, " Modified MIMEType = $c/$b-$d\n"); + } else { + $self->FoundTag('MIMEType', $mime); + } +} + +#------------------------------------------------------------------------------ +# Print verbose output +# Inputs: 0) ExifTool ref, 1) verbose level (prints if level > this), 2-N) print args +sub VPrint($$@) +{ + my $self = shift; + my $level = shift; + if ($$self{OPTIONS}{Verbose} and $$self{OPTIONS}{Verbose} > $level) { + my $out = $$self{OPTIONS}{TextOut}; + print $out @_; + print $out "\n" unless $_[-1] =~ /\n$/; + } +} + +#------------------------------------------------------------------------------ +# Print verbose directory information +# Inputs: 0) ExifTool object reference, 1) directory name or dirInfo ref +# 2) number of entries in directory (or 0 if unknown) +# 3) optional size of directory in bytes +sub VerboseDir($$;$$) +{ + my ($self, $name, $entries, $size) = @_; + return unless $$self{OPTIONS}{Verbose}; + if (ref $name eq 'HASH') { + $size = $$name{DirLen} unless $size; + $name = $$name{Name} || $$name{DirName}; + } + my $indent = substr($$self{INDENT}, 0, -2); + my $out = $$self{OPTIONS}{TextOut}; + my $str = ($entries or defined $entries and not $size) ? " with $entries entries" : ''; + $str .= ", $size bytes" if $size; + print $out "$indent+ [$name directory$str]\n"; +} + +#------------------------------------------------------------------------------ +# Verbose dump +# Inputs: 0) ExifTool ref, 1) data ref, 2-N) HexDump options +sub VerboseDump($$;%) +{ + my $self = shift; + my $dataPt = shift; + my $verbose = $$self{OPTIONS}{Verbose}; + if ($verbose and $verbose > 2) { + my %parms = ( + Prefix => $$self{INDENT}, + Out => $$self{OPTIONS}{TextOut}, + MaxLen => $verbose < 4 ? 96 : $verbose < 5 ? 2048 : undef, + ); + HexDump($dataPt, undef, %parms, @_); + } +} + +#------------------------------------------------------------------------------ +# Print data in hex +# Inputs: 0) data +# Returns: hex string +# (this is a convenience function for use in debugging PrintConv statements) +sub PrintHex($) +{ + my $val = shift; + return join(' ', unpack('H2' x length($val), $val)); +} + +#------------------------------------------------------------------------------ +# Extract binary data from file +# 0) ExifTool object reference, 1) offset, 2) length, 3) tag name if conditional +# Returns: binary data, or undef on error +# Notes: Returns "Binary data #### bytes" instead of data unless tag is +# specifically requested or the Binary option is set +sub ExtractBinary($$$;$) +{ + my ($self, $offset, $length, $tag) = @_; + my ($isPreview, $buff); + + if ($tag) { + if ($tag eq 'PreviewImage') { + # save PreviewImage start/length in case we want to dump trailer + $$self{PreviewImageStart} = $offset; + $$self{PreviewImageLength} = $length; + $isPreview = 1; + } + my $lcTag = lc $tag; + if ((not $$self{OPTIONS}{Binary} or $$self{EXCL_TAG_LOOKUP}{$lcTag}) and + not $$self{OPTIONS}{Verbose} and not $$self{REQ_TAG_LOOKUP}{$lcTag}) + { + return "Binary data $length bytes"; + } + } + unless ($$self{RAF}->Seek($offset,0) + and $$self{RAF}->Read($buff, $length) == $length) + { + $tag or $tag = 'binary data'; + if ($isPreview and not $$self{BuildingComposite}) { + $$self{PreviewError} = 1; + } else { + $self->Warn("Error reading $tag from file", $isPreview); + } + return undef; + } + return $buff; +} + +#------------------------------------------------------------------------------ +# Process binary data +# Inputs: 0) ExifTool object ref, 1) directory information ref, 2) tag table ref +# Returns: 1 on success +# Notes: dirInfo may contain VarFormatData (reference to empty list) to return +# details about any variable-length-format tags in the table (used when writing) +sub ProcessBinaryData($$$) +{ + my ($self, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $offset = $$dirInfo{DirStart} || 0; + my $size = $$dirInfo{DirLen} || (length($$dataPt) - $offset); + my $base = $$dirInfo{Base} || 0; + my $verbose = $$self{OPTIONS}{Verbose}; + my $unknown = $$self{OPTIONS}{Unknown}; + my $dataPos = $$dirInfo{DataPos} || 0; + + # get default format ('int8u' unless specified) + my $defaultFormat = $$tagTablePtr{FORMAT} || 'int8u'; + my $increment = $formatSize{$defaultFormat}; + unless ($increment) { + warn "Unknown format $defaultFormat\n"; + $defaultFormat = 'int8u'; + $increment = $formatSize{$defaultFormat}; + } + # prepare list of tag numbers to extract + my (@tags, $topIndex); + if ($unknown > 1 and defined $$tagTablePtr{FIRST_ENTRY}) { + # don't create a stupid number of tags if data is huge + my $sizeLimit = $size < 65536 ? $size : 65536; + # scan through entire binary table + $topIndex = int($sizeLimit/$increment); + @tags = ($$tagTablePtr{FIRST_ENTRY}..($topIndex - 1)); + # add in floating point tag ID's if they exist + my @ftags = grep /\./, TagTableKeys($tagTablePtr); + @tags = sort { $a <=> $b } @tags, @ftags if @ftags; + } elsif ($$dirInfo{DataMember}) { + @tags = @{$$dirInfo{DataMember}}; + $verbose = 0; # no verbose output of extracted values when writing + } elsif ($$dirInfo{MixedTags}) { + # process sorted integer-ID tags only + @tags = sort { $a <=> $b } grep /^\d+$/, TagTableKeys($tagTablePtr); + } else { + # extract known tags in numerical order + @tags = sort { ($a < 0 ? $a + 1e9 : $a) <=> ($b < 0 ? $b + 1e9 : $b) } TagTableKeys($tagTablePtr); + } + $self->VerboseDir('BinaryData', undef, $size) if $verbose; + # avoid creating unknown tags for tags that fail condition if Unknown is 1 + $$self{NO_UNKNOWN} = 1 if $unknown < 2; + my ($index, %val); + my $nextIndex = 0; + my $varSize = 0; + foreach $index (@tags) { + my ($tagInfo, $val, $saveNextIndex, $len, $mask, $wasVar, $rational); + if ($$tagTablePtr{$index}) { + $tagInfo = $self->GetTagInfo($tagTablePtr, $index); + unless ($tagInfo) { + next unless defined $tagInfo; + my $entry = int($index) * $increment + $varSize; + if ($entry < 0) { + $entry += $size; + next if $entry < 0; + } + next if $entry >= $size; + my $more = $size - $entry; + $more = 128 if $more > 128; + my $v = substr($$dataPt, $entry+$offset, $more); + $tagInfo = $self->GetTagInfo($tagTablePtr, $index, \$v); + next unless $tagInfo; + } + next if $$tagInfo{Unknown} and + ($$tagInfo{Unknown} > $unknown or $index < $nextIndex); + } elsif ($topIndex and $$tagTablePtr{$index - $topIndex}) { + $tagInfo = $self->GetTagInfo($tagTablePtr, $index - $topIndex) or next; + } else { + # don't generate unknown tags in binary tables unless Unknown > 1 + next unless $unknown > 1; + next if $index < $nextIndex; # skip if data already used + $tagInfo = $self->GetTagInfo($tagTablePtr, $index) or next; + $$tagInfo{Unknown} = 2; # set unknown to 2 for binary unknowns + } + # get relative offset of this entry + my $entry = int($index) * $increment + $varSize; + # allow negative indices to represent bytes from end + if ($entry < 0) { + $entry += $size; + next if $entry < 0; + } + my $more = $size - $entry; + last if $more <= 0; # all done if we have reached the end of data + my $count = 1; + my $format = $$tagInfo{Format}; + if (not $format) { + $format = $defaultFormat; + } elsif ($format eq 'string') { + # string with no specified count runs to end of block + $count = $more; + } elsif ($format eq 'pstring') { + $format = 'string'; + $count = Get8u($dataPt, ($entry++)+$offset); + --$more; + } elsif (not $formatSize{$format}) { + if ($format =~ /(.*)\[(.*)\]/) { + # handle format count field + $format = $1; + $count = $2; + # evaluate count to allow count to be based on previous values + #### eval Format size (%val, $size, $self) + $count = eval $count; + $@ and warn("Format $$tagInfo{Name}: $@"), next; + next if $count < 0; + # allow a variable-length value of any format + # (note: the next incremental index points to data immediately after + # this value, regardless of the size of this value, even if it is zero) + if ($format =~ s/^var_//) { + $varSize += $count * ($formatSize{$format} || 1) - $increment; + $wasVar = 1; + # save variable size data if required for writing + if ($$dirInfo{VarFormatData}) { + push @{$$dirInfo{VarFormatData}}, [ $index, $varSize, $format ]; + } + # don't extract value if large and we wanted it just to get + # the variable-format information when writing + next if $$tagInfo{LargeTag} and $$dirInfo{VarFormatData}; + } + } elsif ($format =~ /^var_/) { + # handle variable-length string formats + $format = substr($format, 4); + pos($$dataPt) = $entry + $offset; + undef $count; + if ($format eq 'ustring') { + $count = pos($$dataPt) - ($entry+$offset) if $$dataPt =~ /\G(..)*?\0\0/sg; + $varSize -= 2; # ($count includes base size of 2 bytes) + } elsif ($format eq 'pstring') { + $count = Get8u($dataPt, ($entry++)+$offset); + --$more; + } elsif ($format eq 'pstr32' or $format eq 'ustr32') { + last if $more < 4; + $count = Get32u($dataPt, $entry + $offset); + $count *= 2 if $format eq 'ustr32'; + $entry += 4; + $more -= 4; + $nextIndex += 4 / $increment; # (increment next index for int32u) + } elsif ($format eq 'int16u') { + # int16u size of binary data to follow + last if $more < 2; + $count = Get16u($dataPt, $entry + $offset) + 2; + $varSize -= 2; # ($count includes size word) + $format = 'undef'; + } elsif ($format eq 'ue7') { + require Image::ExifTool::BPG; + ($val, $count) = Image::ExifTool::BPG::Get_ue7($dataPt, $entry + $offset); + last unless defined $val; + --$varSize; # ($count includes base size of 1 byte) + } elsif ($$dataPt =~ /\0/g) { + $count = pos($$dataPt) - ($entry+$offset); + --$varSize; # ($count includes base size of 1 byte) + } + $count = $more if not defined $count or $count > $more; + $varSize += $count; # shift subsequent indices + unless (defined $val) { + $val = substr($$dataPt, $entry+$offset, $count); + $val = $self->Decode($val, 'UCS2') if $format eq 'ustring' or $format eq 'ustr32'; + $val =~ s/\0.*//s unless $format eq 'undef'; # truncate at null + } + $wasVar = 1; + # save variable size data if required for writing + if ($$dirInfo{VarFormatData}) { + push @{$$dirInfo{VarFormatData}}, [ $index, $varSize, $format ]; + } + } + } + # hook to allow format, etc to be set dynamically + if (defined $$tagInfo{Hook}) { + my $oldVarSize = $varSize; + my $pos = $entry + $offset; + #### eval Hook ($format, $varSize, $size, $dataPt, $pos) + eval $$tagInfo{Hook}; + # save variable size data if required for writing (in case changed by Hook) + if ($$dirInfo{VarFormatData}) { + $#{$$dirInfo{VarFormatData}} -= 1 if $wasVar; # remove previous entry for this tag + push @{$$dirInfo{VarFormatData}}, [ $index, $varSize, $format ]; + } elsif ($varSize != $oldVarSize and $verbose > 2) { + my ($tmp, $sign) = ($varSize, '+'); + $tmp < 0 and $tmp = -$tmp, $sign = '-'; + $self->VPrint(2, sprintf("$$self{INDENT}\[offsets adjusted by ${sign}0x%.4x after 0x%.4x $$tagInfo{Name}]\n", $tmp, $index)); + } + } + if ($unknown > 1) { + # calculate next valid index for unknown tag + my $ni = int $index; + $ni += (($formatSize{$format} || 1) * $count) / $increment unless $wasVar; + $saveNextIndex = $nextIndex; + $nextIndex = $ni unless $nextIndex > $ni; + } + # allow large tags to be excluded from extraction + # (provides a work-around for some tight memory situations) + next if $$tagInfo{LargeTag} and $$self{EXCL_TAG_LOOKUP}{lc $$tagInfo{Name}}; + # read value now if necessary + unless (defined $val and not $$tagInfo{SubDirectory}) { + $val = ReadValue($dataPt, $entry+$offset, $format, $count, $more, \$rational); + next unless defined $val; + $mask = $$tagInfo{Mask}; + $val = ($val & $mask) >> $$tagInfo{BitShift} if $mask; + } + if ($verbose and not $$tagInfo{Hidden}) { + if (not $$tagInfo{SubDirectory} or $$tagInfo{Format}) { + $len = $count * ($formatSize{$format} || 1); + $len = $more if $len > $more; + } else { + $len = $more; + } + $self->VerboseInfo($index, $tagInfo, + Table => $tagTablePtr, + Value => $val, + DataPt => $dataPt, + Size => $len, + Start => $entry+$offset, + Addr => $entry+$offset+$base+$dataPos, + Format => $format, + Count => $count, + Extra => $mask ? sprintf(', mask 0x%.2x',$mask) : undef, + ); + } + # parse nested BinaryData directories + if ($$tagInfo{SubDirectory}) { + my $subdir = $$tagInfo{SubDirectory}; + my $subTablePtr = GetTagTable($$subdir{TagTable}); + # use specified subdirectory length if given + if ($$tagInfo{Format} and $formatSize{$format}) { + $len = $count * $formatSize{$format}; + $len = $more if $len > $more; + } else { + $len = $more; # directory size is all of remaining data + if ($$subTablePtr{PROCESS_PROC} and + $$subTablePtr{PROCESS_PROC} eq \&ProcessBinaryData) + { + # the rest of the data will be printed in the subdirectory + $nextIndex = $size / $increment; + } + } + my $subdirBase = $base; + if (defined $$subdir{Base}) { + #### eval Base ($start,$base) + my $start = $entry + $offset + $dataPos; + $subdirBase = eval($$subdir{Base}) + $base; + } + my $start = $$subdir{Start} || 0; + my %subdirInfo = ( + DataPt => $dataPt, + DataPos => $dataPos, + DataLen => length $$dataPt, + DirStart => $entry + $offset + $start, + DirLen => $len - $start, + Base => $subdirBase, + ); + delete $$self{NO_UNKNOWN}; + $self->ProcessDirectory(\%subdirInfo, $subTablePtr, $$subdir{ProcessProc}); + $$self{NO_UNKNOWN} = 1 if $unknown < 2; + next; + } + if ($$tagInfo{IsOffset} and $$tagInfo{IsOffset} ne '3') { + my $et = $self; + #### eval IsOffset ($val, $et) + $val += $base + $$self{BASE} if eval $$tagInfo{IsOffset}; + } + $val{$index} = $val; + my $oldBase; + if ($$tagInfo{SetBase}) { + $oldBase = $$self{BASE}; + $$self{BASE} += $base; + } + my $key = $self->FoundTag($tagInfo,$val); + $$self{BASE} = $oldBase if defined $oldBase; + if ($key) { + $$self{RATIONAL}{$key} = $rational if defined $rational; + } else { + # don't increment nextIndex if we didn't extract a tag + $nextIndex = $saveNextIndex if defined $saveNextIndex; + } + } + delete $$self{NO_UNKNOWN}; + return 1; +} + +#.............................................................................. +# Load .ExifTool_config file from user's home directory +# (use of noConfig is now deprecated, use configFile = '' instead) +until ($Image::ExifTool::noConfig) { + my $config = $Image::ExifTool::configFile; + my $file; + if (not defined $config) { + $config = '.ExifTool_config'; + # get our home directory (HOMEDRIVE and HOMEPATH are used in Windows cmd shell) + my $home = $ENV{EXIFTOOL_HOME} || $ENV{HOME} || + ($ENV{HOMEDRIVE} || '') . ($ENV{HOMEPATH} || '') || '.'; + # look for the config file in 1) the home directory, 2) the program dir + $file = "$home/$config"; + } else { + length $config or last; # filename of "" disables configuration + $file = $config; + } + # also check executable directory unless path is absolute + $exeDir = ($0 =~ /(.*)[\\\/]/) ? $1 : '.' unless defined $exeDir; + -r $file or $config =~ /^\// or $file = "$exeDir/$config"; + unless (-r $file) { + warn("Config file not found\n") if defined $Image::ExifTool::configFile; + last; + } + unshift @INC, '.'; # look in current directory first + eval { require $file }; # load the config file + shift @INC; + # print warning (minus "Compilation failed" part) + $@ and $_=$@, s/Compilation failed.*//s, warn $_; + last; +} +# read user-defined lenses (may have been defined by script instead of config file) +if (@Image::ExifTool::UserDefined::Lenses) { + foreach (@Image::ExifTool::UserDefined::Lenses) { + $Image::ExifTool::userLens{$_} = 1; + } +} +# add user-defined file types +if (%Image::ExifTool::UserDefined::FileTypes) { + foreach (sort keys %Image::ExifTool::UserDefined::FileTypes) { + my $fileInfo = $Image::ExifTool::UserDefined::FileTypes{$_}; + my $type = uc $_; + ref $fileInfo eq 'HASH' or $fileTypeLookup{$type} = $fileInfo, next; + my $baseType = $$fileInfo{BaseType}; + if ($baseType) { + if ($$fileInfo{Description}) { + $fileTypeLookup{$type} = [ $baseType, $$fileInfo{Description} ]; + } else { + $fileTypeLookup{$type} = $baseType; + } + if (defined $$fileInfo{Writable} and not $$fileInfo{Writable}) { + # first make sure we are using an actual base type and not a derived type + $baseType = $fileTypeLookup{$baseType} while $baseType and not ref $fileTypeLookup{$baseType}; + # mark this type as not writable + $noWriteFile{$baseType} or $noWriteFile{$baseType} = [ ]; + push @{$noWriteFile{$baseType}}, $type; + } + } else { + $fileTypeLookup{$type} = [ $type, $$fileInfo{Description} || $type ]; + $moduleName{$type} = 0; # not supported + if ($$fileInfo{Magic}) { + $magicNumber{$type} = $$fileInfo{Magic}; + push @fileTypes, $type unless grep /^$type$/, @fileTypes; + } + } + $mimeType{$type} = $$fileInfo{MIMEType} if defined $$fileInfo{MIMEType}; + } +} + +#------------------------------------------------------------------------------ +1; # end diff --git a/lib/Image/ExifTool.pod b/lib/Image/ExifTool.pod new file mode 100644 index 0000000..fe44295 --- /dev/null +++ b/lib/Image/ExifTool.pod @@ -0,0 +1,2780 @@ +#------------------------------------------------------------------------------ +# File: ExifTool.pod - Documentation for File::ExifTool +# +# Description: Read and write meta information +# +# URL: https://exiftool.org/ +# +# Legal: Copyright (c) 2003-2022, Phil Harvey (philharvey66 at gmail.com) +# This library is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +#------------------------------------------------------------------------------ + +=head1 NAME + +Image::ExifTool - Read and write meta information + +=head1 SYNOPSIS + + use Image::ExifTool qw(:Public); + + # ---- Simple procedural usage ---- + + # Get hash of meta information tag names/values from an image + $info = ImageInfo('a.jpg'); + + # ---- Object-oriented usage ---- + + # Create a new Image::ExifTool object + $exifTool = new Image::ExifTool; + + # Extract meta information from an image + $exifTool->ExtractInfo($file, \%options); + + # Get list of tags in the order they were found in the file + @tagList = $exifTool->GetFoundTags('File'); + + # Get the value of a specified tag + $value = $exifTool->GetValue($tag, $type); + + # Get a tag description + $description = $exifTool->GetDescription($tag); + + # Get the group name associated with this tag + $group = $exifTool->GetGroup($tag, $family); + + # Set a new value for a tag + $exifTool->SetNewValue($tag, $newValue); + + # Write new meta information to a file + $success = $exifTool->WriteInfo($srcfile, $dstfile); + + # ...plus a host of other useful methods... + +=head1 DESCRIPTION + +Reads and writes meta information in a wide variety of files, including the +maker notes of many digital cameras by various manufacturers such as Canon, +Casio, DJI, FLIR, FujiFilm, GE, GoPro, HP, JVC/Victor, Kodak, Leaf, +Minolta/Konica-Minolta, Nikon, Nintendo, Olympus/Epson, Panasonic/Leica, +Pentax/Asahi, Phase One, Reconyx, Ricoh, Samsung, Sanyo, Sigma/Foveon and +Sony. + +Below is a list of file types and meta information formats currently +supported by ExifTool (r = read, w = write, c = create): + + File Types + ------------+-------------+-------------+-------------+------------ + 360 r/w | DR4 r/w/c | JNG r/w | O r | RAW r/w + 3FR r | DSS r | JP2 r/w | ODP r | RIFF r + 3G2 r/w | DV r | JPEG r/w | ODS r | RSRC r + 3GP r/w | DVB r/w | JSON r | ODT r | RTF r + A r | DVR-MS r | JXL r | OFR r | RW2 r/w + AA r | DYLIB r | K25 r | OGG r | RWL r/w + AAE r | EIP r | KDC r | OGV r | RWZ r + AAX r/w | EPS r/w | KEY r | ONP r | RM r + ACR r | EPUB r | LA r | OPUS r | SEQ r + AFM r | ERF r/w | LFP r | ORF r/w | SKETCH r + AI r/w | EXE r | LIF r | ORI r/w | SO r + AIFF r | EXIF r/w/c | LNK r | OTF r | SR2 r/w + APE r | EXR r | LRV r/w | PAC r | SRF r + ARQ r/w | EXV r/w/c | M2TS r | PAGES r | SRW r/w + ARW r/w | F4A/V r/w | M4A/V r/w | PBM r/w | SVG r + ASF r | FFF r/w | MACOS r | PCD r | SWF r + AVI r | FITS r | MAX r | PCX r | THM r/w + AVIF r/w | FLA r | MEF r/w | PDB r | TIFF r/w + AZW r | FLAC r | MIE r/w/ | PDF r/w | TORRENT r + BMP r | FLIF r/w | MIFF r c | PEF r/w | TTC r + BPG r | FLV r | MKA r | PFA r | TTF r + BTF r | FPF r | MKS r | PFB r | TXT r + CHM r | FPX r | MKV r | PFM r | VCF r + COS r | GIF r/w | MNG r/w | PGF r | VRD r/w/c + CR2 r/w | GPR r/w | MOBI r | PGM r/w | VSD r + CR3 r/w | GZ r | MODD r | PLIST r | WAV r + CRM r/w | HDP r/w | MOI r | PICT r | WDP r/w + CRW r/w | HDR r | MOS r/w | PMP r | WEBP r + CS1 r/w | HEIC r/w | MOV r/w | PNG r/w | WEBM r + CSV r | HEIF r/w | MP3 r | PPM r/w | WMA r + CZI r | HTML r | MP4 r/w | PPT r | WMV r + DCM r | ICC r/w/c | MPC r | PPTX r | WTV r + DCP r/w | ICS r | MPG r | PS r/w | WV r + DCR r | IDML r | MPO r/w | PSB r/w | X3F r/w + DFONT r | IIQ r/w | MQV r/w | PSD r/w | XCF r + DIVX r | IND r/w | MRC r | PSP r | XLS r + DJVU r | INSP r/w | MRW r/w | QTIF r/w | XLSX r + DLL r | INSV r | MXF r | R3D r | XMP r/w/c + DNG r/w | INX r | NEF r/w | RA r | ZIP r + DOC r | ISO r | NKSC r/w | RAF r/w | + DOCX r | ITC r | NRW r/w | RAM r | + DPX r | J2C r | NUMBERS r | RAR r | + + Meta Information + ----------------------+----------------------+--------------------- + EXIF r/w/c | CIFF r/w | Ricoh RMETA r + GPS r/w/c | AFCP r/w | Picture Info r + IPTC r/w/c | Kodak Meta r/w | Adobe APP14 r + XMP r/w/c | FotoStation r/w | MPF r + MakerNotes r/w/c | PhotoMechanic r/w | Stim r + Photoshop IRB r/w/c | JPEG 2000 r | DPX r + ICC Profile r/w/c | DICOM r | APE r + MIE r/w/c | Flash r | Vorbis r + JFIF r/w/c | FlashPix r | SPIFF r + Ducky APP12 r/w/c | QuickTime r | DjVu r + PDF r/w/c | Matroska r | M2TS r + PNG r/w/c | MXF r | PE/COFF r + Canon VRD r/w/c | PrintIM r | AVCHD r + Nikon Capture r/w/c | FLAC r | ZIP r + GeoTIFF r/w/c | ID3 r | (and more) + +=head1 CONFIGURATION + +User-defined tags can be added via the ExifTool configuration file, or by +defining the %Image::ExifTool::UserDefined hash before calling any ExifTool +methods. See "ExifTool_config" in the ExifTool distribution for more +details. + +By default ExifTool looks for a configuration file named ".ExifTool_config" +first in your home directory, then in the directory of the application +script, but a different directory may be specified by setting the +EXIFTOOL_HOME environment variable, or a different file may be specified by +setting the ExifTool C variable before using Image::ExifTool. +For example: + + BEGIN { $Image::ExifTool::configFile = '/Users/phil/myconfig.cfg' } + use Image::ExifTool; + +The configuration feature may also be disabled by setting C to +an empty string: + + BEGIN { $Image::ExifTool::configFile = '' } + use Image::ExifTool; + +=head1 EXPORTS + +Exports nothing by default, but L and all static methods may be +exported with the C<:Public> export list. + +=head1 METHODS + +All ExifTool features are accessed through the methods of the public +interface listed below. Other Image::ExifTool methods and modules should +not be accessed directly because their interface may change with future +versions. + +None of these methods should ever die or issue warnings to STDERR if called +with the proper arguments (with the exception of L which may +send an error message to STDERR, but only when called in scalar context). +Error and warning messages that occur during processing are stored in the +values of the Error and Warning tags, and are accessible via the +L method to retrieve a single Error or Warning message, or +L to retrieve any number of them. + +The ExifTool methods are not thread safe. + +=head2 new + +Creates a new ExifTool object. + + $exifTool = new Image::ExifTool; + +One ExifTool object may be used to process many files, so creating multiple +ExifTool objects usually is not necessary. + +Note that ExifTool uses AUTOLOAD to load non-member methods, so any class +using Image::ExifTool as a base class must define an AUTOLOAD which calls +Image::ExifTool::DoAutoLoad(). eg) + + sub AUTOLOAD + { + Image::ExifTool::DoAutoLoad($AUTOLOAD, @_); + } + +=head2 ImageInfo + +Read image file and return meta information. This is the one step function +for retrieving meta information from an image. Internally, L +calls L to extract the information, L to generate +the information hash, and L for the returned tag list. + + # return meta information for 2 tags only (procedural) + $info = ImageInfo($filename, $tag1, $tag2); + + # return information about an open image file (object-oriented) + $info = $exifTool->ImageInfo(\*FILE); + + # return information from image data in memory for specified tags + %options = (PrintConv => 0); + @tagList = qw(filename imagesize xmp:creator exif:* -ifd1:*); + $info = ImageInfo(\$imageData, \@tagList, \%options); + + # extract information from an embedded thumbnail image + $info = ImageInfo('image.jpg', 'thumbnailimage'); + $thumbInfo = ImageInfo($$info{ThumbnailImage}); + +=over 4 + +=item Inputs: + +L is very flexible about the input arguments, and interprets +them based on their type. It may be called with one or more arguments. +The one required argument is either a SCALAR (the image file name), a file +reference (a reference to the image file) or a SCALAR reference (a +reference to the image in memory). Other arguments are optional. The +order of the arguments is not significant, except that the first SCALAR is +taken to be the file name unless a file reference or scalar reference comes +earlier in the argument list. + +Below is an explanation of how the L function arguments are +interpreted: + +=over 4 + +=item ExifTool ref + +L may be called with an ExifTool object if desired. Advantages +of using the object-oriented form are that options may be set before calling +L, and the object may be used afterward to access member +functions. Must be the first argument if used. + +=item SCALAR + +The first scalar argument is taken to be the file name unless an earlier +argument specified the image data via a file reference (file ref) or data +reference (SCALAR ref). The remaining scalar arguments are names of tags +for requested information. All tags are returned if no tags are specified. + +Tag names are case-insensitive and may be prefixed by optional group names +separated by colons. A group name may begin with a family number (eg. +'1IPTC:Keywords'), to restrict matches to a specific family. In the tag +name, a '?' matches any single character and a '*' matches zero or more +characters. Thus 'GROUP:*' represents all tags in a specific group. +Wildcards may not be used in group names, with the exception that a group +name of '*' may be used to extract all available instances of a tag +regardless of the L setting (eg. '*:WhiteBalance'). Multiple +groups may be specified (eg. 'EXIF:Time:*' extracts all EXIF Time tags). And +finally, a leading '-' indicates a tag to be excluded (eg. '-IFD1:*'), or a +trailing '#' causes the ValueConv value to be returned for this tag. + +Note that keys in the returned information hash and elements of the returned +tag list are not necessarily the same as these tag names because group names +are removed, the case may be changed, and an instance number may be added. +For this reason it is best to use either the keys of the returned hash or +the elements of the returned tag list when accessing the tag values. + +See L for a complete +list of ExifTool tag names. + +=item File ref + +A reference to an open image file. If you use this method (or a SCALAR +reference) to access information in an image, the FileName and Directory +tags will not be returned. (Also, a number of the File System tags will not +be returned unless it is a plain file.) Image processing begins at the +current file position, and on return the file position is unspecified. May +be either a standard filehandle, or a reference to a +L object. Note that the file remains +open and must be closed by the caller after L returns. + +[Advanced: To allow a non-rewindable stream (eg. a network socket) to be +re-read after processing with ExifTool, first wrap the file reference in a +L object, then pass this object to +L. The L object will +buffer the file if necessary, and may be used to re-read the file after +L returns.] + +=item SCALAR ref + +A reference to image data in memory. + +=item ARRAY ref + +Reference to a list of tag names. On entry, any elements in the list are +added to the list of requested tags. Tags with names beginning with '-' are +excluded. On return, this list is updated to contain an ordered list of tag +keys for the returned information. + +There will be 1:1 correspondence between the requested tags and the returned +tag keys only if the L option is 0 and L is 'Input'. +(With L enabled, there may be more entries in the returned list +of tag keys, and with other L settings the entries may not be in the +same order as requested.) If a requested tag doesn't exist, a tag key is +still generated, but the tag value is undefined. + +=item HASH ref + +Reference to a hash containing the options settings valid for this call +only. See L documentation below for a list of available options. +Options specified as arguments to L take precedence over +L settings. + +=back + +=item Return Values: + +L returns a reference to a hash of tag-key/value pairs. The tag +keys are identifiers -- essentially case-sensitive tag names with an +appended instance number if multiple tags with the same name were extracted +from the image. Many of the ExifTool functions require a tag key as an +argument. Use L to get the tag name for a given tag +key. Note that the case of the tag names may not be the same as requested. +Here is a simple example to print out the information returned by +L: + + foreach (sort keys %$info) { + print "$_ => $$info{$_}\n"; + } + +Values of the returned hash are usually simple scalars, but a scalar +reference is used to indicate binary data and an array reference may be used +to indicate a list. Also, a hash reference may be returned if the L +option is used. Lists of values are joined by commas into a single +string only if the PrintConv option is enabled and the ListJoin option is +enabled (which are the defaults). Note that binary values are not +necessarily extracted unless specifically requested, or the Binary option is +enabled and the tag is not specifically excluded. If not extracted the +value is a reference to a string of the form "Binary data ##### bytes". + +The code below gives an example of how to handle these return values, as +well as illustrating the use of other ExifTool functions: + + use Image::ExifTool; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Unknown => 1); + my $info = $exifTool->ImageInfo('a.jpg'); + my $group = ''; + my $tag; + foreach $tag ($exifTool->GetFoundTags('Group0')) { + if ($group ne $exifTool->GetGroup($tag)) { + $group = $exifTool->GetGroup($tag); + print "---- $group ----\n"; + } + my $val = $info->{$tag}; + if (ref $val eq 'SCALAR') { + if ($$val =~ /^Binary data/) { + $val = "($$val)"; + } else { + my $len = length($$val); + $val = "(Binary data $len bytes)"; + } + } + printf("%-32s : %s\n", $exifTool->GetDescription($tag), $val); + } + +=item Notes: + +ExifTool returns all values as byte strings of encoded characters. Perl +wide characters are not used. See L for details about +the encodings. By default, most returned values are encoded in UTF-8. For +these, Encode::decode_utf8() may be used to convert to a sequence of logical +Perl characters. + +As well as tags representing information extracted from the image, the +following L generated by +ExifTool may be returned: + + ExifToolVersion - The ExifTool version number. + + Error - An error message if the image could not be processed. + + Warning - A warning message if problems were encountered while + processing the image. + +=back + +=head2 Options + +Get/set ExifTool options. This function can be called to set the default +options for an ExifTool object. Options set this way are in effect for +all function calls but may be overridden by options passed as arguments +to some functions. Option names are not case sensitive. + +The default option values may be changed by defining a +%Image::ExifTool::UserDefined::Options hash. See the ExifTool_config file +in the full ExifTool distribution for examples. A default of undef has the +same behaviour as a value of 0 for numerical options. + + # exclude the 'OwnerName' tag from returned information + $exifTool->Options(Exclude => 'OwnerName'); + + # only get information in EXIF or MakerNotes groups + $exifTool->Options(Group0 => ['EXIF', 'MakerNotes']); + + # ignore information from IFD1 + $exifTool->Options(Group1 => '-IFD1'); + + # sort by groups in family 2, and extract unknown tags + $exifTool->Options(Sort => 'Group2', Unknown => 1); + + # reset DateFormat option + $exifTool->Options(DateFormat => undef); + + # do not extract duplicate tag names + $oldSetting = $exifTool->Options(Duplicates => 0); + + # get current Verbose setting + $isVerbose = $exifTool->Options('Verbose'); + + # set a user parameter + $exifTool->Options(UserParam => 'MyParam=some value'); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) Option parameter name (case-insensitive) + +2) [optional] Option parameter value (may be undef to clear option) + +3-N) [optional] Additional parameter/value pairs + +=item Option Parameters: + +Note that these API options may also be used in the exiftool application via +the command-line B<-api> option. + +=over 4 + +=item Binary + +Flag to extract the value data for all binary tags. Tag values representing +large binary data blocks (eg. ThumbnailImage) are not necessarily extracted +unless this option is set or the tag is specifically requested by name. +Default is undef. + +=item BlockExtract + +Flag to extract some directories (mentioned in the +L) as a block. +Setting this to a value of 2 also prevents parsing the block to extract tags +contained within. + +=item ByteOrder + +The byte order for newly created EXIF segments when writing. Note that if +EXIF information already exists, the existing order is maintained. Valid +values are 'MM', 'II' and undef. If ByteOrder is not defined (the default), +then the maker note byte order is used (if they are being copied), otherwise +big-endian ('MM') order is assumed. This can also be set via the +L, but the ByteOrder +option takes precedence if both are set. + +=item Charset + +Character set for encoding character tag values passed to/from ExifTool with +code points above U+007F. Default is 'UTF8'. Valid values are listed +below, case is not significant: + + Value Alias(es) Description + ----------- --------------- ---------------------------------- + UTF8 cp65001, UTF-8 UTF-8 characters + Latin cp1252, Latin1 Windows Latin1 (West European) + Latin2 cp1250 Windows Latin2 (Central European) + Cyrillic cp1251, Russian Windows Cyrillic + Greek cp1253 Windows Greek + Turkish cp1254 Windows Turkish + Hebrew cp1255 Windows Hebrew + Arabic cp1256 Windows Arabic + Baltic cp1257 Windows Baltic + Vietnam cp1258 Windows Vietnamese + Thai cp874 Windows Thai + DOSLatinUS cp437 DOS Latin US + DOSLatin1 cp850 DOS Latin1 + DOSCyrillic cp866 DOS Cyrillic + MacRoman cp10000, Roman Macintosh Roman + MacLatin2 cp10029 Macintosh Latin2 (Central Europe) + MacCyrillic cp10007 Macintosh Cyrillic + MacGreek cp10006 Macintosh Greek + MacTurkish cp10081 Macintosh Turkish + MacRomanian cp10010 Macintosh Romanian + MacIceland cp10079 Macintosh Icelandic + MacCroatian cp10082 Macintosh Croatian + +Note that this option affects some types of information when reading/writing +the file and other types when getting/setting tag values, so it must be +defined for both types of access. See the L section +for more information about the handling of special characters. + +=item CharsetEXIF + +Internal encoding to use for stored EXIF "ASCII" string values. May also be +set to undef to pass through EXIF "ASCII" values without recoding. Set to +"UTF8" to conform with the MWG recommendation. Default is undef. + +=item CharsetFileName + +External character set used for file names passed to ExifTool functions. +When set in Windows, this triggers use of Windows wide-character i/o library +routines (requires Win32API::File). Default is undef. May also be set to +an empty string to avoid "encoding not specified" warnings on Windows. + +=item CharsetID3 + +Internal encoding to assume for ID3v1 strings. By the specification ID3v1 +strings should be encoded in ISO 8859-1 (essentially Latin), but some +applications may use local encoding instead. Default is 'Latin'. + +=item CharsetIPTC + +Fallback internal IPTC character set to assume if IPTC information contains +no CodedCharacterSet tag. Possible values are the same as the L +option. Default is 'Latin'. + +Note that this option affects some types of information when reading/writing +the file and other types when getting/setting tag values, so it must be +defined for both types of access. + +=item CharsetPhotoshop + +Internal encoding to assume for Photoshop IRB resource names. Default is +'Latin'. + +=item CharsetQuickTime + +Internal encoding to assume for QuickTime strings stored with an unspecified +encoding. Default is 'MacRoman'. + +=item CharsetRIFF + +Internal encoding to assume for strings in RIFF metadata (eg. AVI and WAV +files). The default value of 0 assumes "Latin" encoding unless otherwise +specified by the RIFF CSET chunk. Set to undef to pass through strings +without recoding. Default is 0. + +=item Compact + +Comma-delimited list of settings for writing compact XMP. Below is a list +of available settings. Note that 'NoPadding' effects only embedded XMP +since padding is never written for stand-alone XMP files. Also note that +'OneDesc' is not recommended when writing XMP larger than 64 kB to a JPG +file because it interferes with ExifTool's technique of splitting off large +rdf:Description elements into the extended XMP. Case is not significant for +any of these options. Aliases are given in brackets. Default is undef. + + NoPadding - Avoid 2 kB of recommended padding at end of XMP (NoPad) + NoIndent - No spaces to indent lines (NoSpace, NoSpaces) + NoNewline - Avoid unnecessary newlines (NoNewlines) + Shorthand - Use XMP Shorthand format + OneDesc - Combine properties into a single rdf:Description (OneDescr) + AllSpace - Equivalent to 'NoPadding,NoIndent,NoNewline' + AllFormat - Equivalent to 'Shorthand,OneDesc' + All - Equivalent to 'AllSpace,AllFormat' + +=item Composite + +Flag to generate Composite tags when extracting information. Default is 1. + +=item Compress + +Flag to write new values in compressed format if possible. Has no effect +unless Compress::Zlib is installed. Default is undef. + +=item CoordFormat + +Format for printing GPS coordinates. This is a printf format string with +specifiers for degrees, minutes and seconds in that order, however minutes +and seconds may be omitted. If the hemisphere is known, a reference +direction (N, S, E or W) is appended to each printed coordinate, but adding +a C<+> to the first format specifier (eg. C<%+.6f>) prints a signed +coordinate instead. For example, the following table gives the output for +the same coordinate using various formats: + + CoordFormat Example Output + ------------------- ------------------ + q{%d deg %d' %.2f"} 54 deg 59' 22.80" (default for reading) + q{%d %d %.8f} 54 59 22.80000000 (default for copying) + q{%d deg %.4f min} 54 deg 59.3800 min + q{%.6f degrees} 54.989667 degrees + +Note: To avoid loss of precision, the default coordinate format is +different when copying tags with L. + +=item DateFormat + +Format for printing date/time values. See C in the L +package and L for details about +the format string. If the date can not be converted, the value is left +unchanged unless the StrictDate option is set. Timezones are ignored. The +inverse conversion (ie. when calling L) is performed only if +POSIX::strptime or Time::Piece is installed. The default setting of undef +causes date/time values to remain in standard EXIF format (similar to a +DateFormat of "%Y:%m:%d %H:%M:%S"). + +=item Duplicates + +Flag to return values from tags with duplicate names when extracting +information. Default is 1. + +=item Escape + +Escape special characters in extracted values for HTML or XML. Also +unescapes HTML or XML character entities in input values passed to +L. Valid settings are 'HTML', 'XML' or undef. Default is +undef. + +=item Exclude + +Exclude specified tags from tags extracted from an image. The option value +is either a tag name or reference to a list of tag names to exclude. The +case of tag names is not significant. This option is ignored for +specifically requested tags. Tags may also be excluded by preceding their +name with a '-' in the arguments to L. + +=item ExtendedXMP + +This setting affects the reading and editing of extended XMP in JPEG images. +According to the XMP specification, extended XMP is only valid if it has the +GUID specified by the HasExtendedXMP tag, so by default ExifTool will ignore +other extended XMP, but this option allows full control over the extended +XMP to be extracted. + + 0 - Ignore all extended XMP + 1 - Read extended XMP with valid GUID only (default) + 2 - Read extended XMP with any GUID + - Read extended XMP with a specific GUID + +=item ExtractEmbedded + +Flag to extract information from embedded documents in EPS files, embedded +EPS information and JPEG and Jpeg2000 images in PDF files, embedded MPF +images in JPEG and MPO files, timed metadata in videos, and the resource +fork of Mac OS files. A setting of 2 also causes the H264 video stream in +MP4 files to be parsed until the first SEI message is decoded, or 3 to parse +the entire H264 stream in MP4 videos and the entire M2TS file to look for +any unlisted program containing GPS metadata. Default is undef. + +=item FastScan + +Flag to increase speed when reading files by avoiding extraction of some +types of metadata. With this option set to 1, ExifTool will not scan to the +end of a JPEG image to check for an AFCP, CanonVRD, FotoStation, +PhotoMechanic, MIE or PreviewImage trailer. This also stops the parsing +after the first comment in GIF images, and at the audio/video data of +RIFF-format files (AVI, WAV, etc), so any trailing metadata (eg. XMP written +by some utilities) may be missed. Also disables input buffering for some +types of files to reduce memory usage when reading from a non-seekable +stream, and bypasses CRC validation for speed when writing PNG files. When +combined with the ScanForXMP option, prevents scanning for XMP in recognized +file types. With a value of 2, ExifTool will also avoid extracting any EXIF +MakerNote information, and will stop parsing at the IDAT chunk of PNG +images. (By the PNG specification, metadata is allowed after IDAT, but +ExifTool always writes it before because some utilities will ignore it +otherwise.) When set to 3 or higher, only pseudo system tags and FileType +are generated. For 3, the file header is read to provide an educated guess +at FileType. For 4, the file is not read at all and FileType is determined +based on the file's extension. For 5, generation of Composite tags is also +disabled (like setting L to 0). Default is undef. + +=item Filter + +Perl expression used to filter values for all tags. The expression acts on +the value of the Perl default variable ($_), and changes the value of this +variable as required. The current ExifTool object may be accessed through +$self. The value is not changed if $_ is set to undef. List items are +filtered individually. Applies to all returned values unless PrintConv +option is disabled. + +=item FilterW + +Perl expression used to filter PrintConv values when writing. The +expression acts on the value of the Perl default variable ($_), and changes +the value of this variable as required. The current ExifTool object may be +accessed through $self. The tag is not written if $_ is set to undef. + +=item FixBase + +Fix maker notes base offset. A common problem with image editing software +is that offsets in the maker notes are not adjusted properly when the file +is modified. This may cause the wrong values to be extracted for some maker +note entries when reading the edited file. FixBase specifies an integer +value to be added to the maker notes base offset. It may also be set to the +empty string ('') for ExifTool will take its best guess at the correct base, +or undef (the default) for no base adjustment. + +=item GeoMaxIntSecs + +Maximum interpolation time in seconds for geotagging. Geotagging is treated +as an extrapolation if the Geotime value lies between two fixes in the same +track which are separated by a number of seconds greater than this. +Otherwise, the coordinates are calculated as a linear interpolation between +the nearest fixes on either side of the Geotime value. Set to 0 to disable +interpolation and use the coordinates of the nearest fix instead (provided +it is within GeoMaxExtSecs, otherwise geotagging fails). Default is 1800. + +=item GeoMaxExtSecs + +Maximum extrapolation time in seconds for geotagging. Geotagging fails if +the Geotime value lies outside a GPS track by a number of seconds greater +than this. Otherwise, for an extrapolation the coordinates of the nearest +fix are taken (ie. it is assumed that you weren't moving during this +period). Default is 1800. + +=item GeoMaxHDOP + +Maximum Horizontal (2D) Dilution Of Precision for geotagging. GPS fixes are +ignored if the HDOP is greater than this. Default is undef. + +=item GeoMaxPDOP + +Maximum Position (3D) Dilution Of Precision for geotagging. GPS fixes are +ignored if the PDOP is greater than this. Default is undef. + +=item GeoMinSats + +Minimum number of satellites for geotagging. GPS fixes are ignored if the +number of acquired satellites is less than this. Default is undef. + +=item GeoSpeedRef + +Reference units for writing GPSSpeed when geotagging: + + 'K', 'k' or 'km/h' - km/h + 'M', 'm' or 'mph' - mph + - knots (default undef) + +=item GlobalTimeShift + +Time shift to apply to all extracted date/time PrintConv values. Does not +affect ValueConv values. Value is a date/time shift string (see +L), with a leading +'-' for negative shifts. Default is undef. + +=item Group# + +Extract tags only for specified groups in family # (Group0 assumed if # +not given). The option value may be a single group name or a reference +to a list of groups. Case is significant in group names. Specify a group +to be excluded by preceding group name with a '-'. See L for a +description of group families, and L for lists of +group names. + +=item HexTagIDs + +Return hexadecimal instead of decimal for the family 7 group names of tags +with numerical ID's. + +=item HtmlDump + +Dump information in hex to dynamic HTML web page. The value may be 0-3 for +increasingly larger limits on the maximum block size. Default is 0. Output +goes to the file specified by the TextOut option (\*STDOUT by default). + +=item HtmlDumpBase + +Base for HTML dump offsets. If not defined, the EXIF/TIFF base offset is +used. Set to 0 for absolute offsets. Default is undef. + +=item IgnoreMinorErrors + +Flag to ignore minor errors. Causes minor errors to be downgraded to +warnings, and minor warnings to be ignored. This option is provided mainly +to allow writing of files when minor errors occur, but by ignoring some +minor warnings the behaviour of ExifTool may be changed to allow some +questionable operations to proceed (such as extracting thumbnail and preview +images even if they don't have a recognizable header). Minor errors and +warnings are denoted by "[minor]" at the start of the message, or "[Minor]" +(with a capital "M") for warnings that affect processing when ignored. + +=item IgnoreTags + +List of tag names to ignore when reading. This may help in situations where +memory is limited because the ignored tag values are not stored in memory. +The tag names are case insensitive and group names and wildcards are not +allowed. A special tag name of "All" may be used to ignore all tags except +those specified by the L option. Set to undef to clear the +previous IgnoreTags list. Default is undef. + +=item Lang + +Localized language for exiftool tag descriptions, etc. Available languages +are given by the Image::ExifTool::Lang module names (eg. 'fr', 'zh_cn'). If +the specified language isn't available, the option is not changed. May be +set to undef to select the built-in default language. Default is 'en'. + +=item LargeFileSupport + +Flag to indicate that 64-bit file offsets are supported on this system. +Default is undef. + +=item ListItem + +Return only a specific item from list-type values. A value of 0 returns the +first item in the list, 1 return the second item, etc. Negative indices may +also be used, with -1 representing the last item in the list. Applies only +to the top-level list of nested lists. Default is undef to return all items +in the list. + +=item ListJoin + +Separator used to join the PrintConv value of multi-item List-type tags into +a single string. If not defined, multi-item lists are returned as a list +reference. Does not affect ValueConv values. Default is ', '. + +=item ListSplit + +Regular expression used to split values of list-type tags into individual +items when writing. (eg. use ',\\s*' to split a comma-separated list.) +Split when writing either PrintConv or ValueConv values. Default is undef. + +=item MakerNotes + +Option to extract MakerNotes and other writable subdirectories (such as +PrintIM) as a data block. Normally when the MakerNotes are extracted they +are rebuilt to include data outside the boundaries of the original maker +note data block, but a value of 2 disables this feature. Possible values +are: + + 0 - Do not extract writable subdirectories (same as default of undef) + 1 - Extract and rebuild maker notes into self-contained block + 2 - Extract without rebuilding maker notes + +=item MDItemTags + +Flag to extract the OS X metadata item tags (see the "mdls" man page and +L for more information). + +=item MissingTagValue + +Value for missing tags in tag name expressions (or tags where the advanced +formatting expression returns undef). If not set, a minor error is issued +for missing values, or the value is set to '' if L is +set. Default is undef. + +=item NoMultiExif + +Raise error when attempting to write multi-segment EXIF in a JPEG image. +Default is undef. + +=item NoPDFList + +Flag to avoid splitting PDF list-type tag values into separate items. +Default is undef. + +=item Password + +Password for reading/writing password-protected PDF documents. Ignored if a +password is not required. Character encoding of the password is determined +by the value of the Charset option at processing time. Default is undef. + +=item PrintConv + +Flag to enable automatic print conversion. Also enables inverse +print conversion for writing. Default is 1. + +=item QuickTimeHandler + +Flag set to add an 'mdir' Handler to a newly created Meta box when adding +QuickTime ItemList tags. Adobe Bridge does not add this Handler, but it is +commonly found in samples from other software, and it has been reported that +Apple QuickTime Player and Photos.apps will ignore ItemList tags if this is +missing. Default is 1. + +=item QuickTimePad + +Flag to preserve the padding of some QuickTime atoms when writing. +QuickTime-based Canon CR3 files pad the values of container atoms with null +bytes. This padding is removed by default when the file is rewritten, but +setting this option to 1 adds padding to preserve the original atom size if +the new atom would be smaller than the original. Default is undef. + +=item QuickTimeUTC + +Flag set to assume that QuickTime date/time values are stored as UTC, +causing conversion to local time when they are extracted and from local time +when written. According to the QuickTime specification date/time values +should be UTC, but many digital cameras store local time instead (presumably +because they don't know the time zone), so the default is to not convert +these times (except for Canon CR3 files, which always use UTC times). This +option also disables the autodetection of incorrect time-zero offsets in +QuickTime date/time values, and enforces a time zero of 1904 as per the +QuickTime specification. + +=item RequestAll + +Flag to request all tags to be extracted. This causes some tags to be +generated which normally would not be unless specifically requested (by +passing the tag name to L or L). May be set to 2 +or 3 to enable generation of some additional tags as mentioned in the tag +name documentation. Default is undef. + +=item RequestTags + +List of additional tag and/or group names to request in the next call to +L. This option is useful only for tags/groups which aren't +extracted unless specifically requested. Value may be a list reference, a +delimited string of names (any delimiter is allowed), or undef to clear the +current RequestTags list. Groups are requested by adding a colon after the +name (eg. "MacOS:"). Names are converted to lower case as they are added to +the list. Default is undef. + +=item SaveFormat + +Flag to save EXIF/TIFF format type as the family 6 group name when +extracting information. Without this option set, the family 6 group names +are not generated. Default is undef. See the L option for more +details. + +=item SavePath + +Flag to save the metadata path as the family 5 group name when extracting +information. Without this option set, the family 5 group names are not +generated. Default is undef. See the L option for more details. + +=item ScanForXMP + +Flag to scan all files (even unrecognized formats) for XMP information +unless XMP was already found in the file. When combined with the FastScan +option, only unrecognized file types are scanned for XMP. Default is undef. + +=item Sort + +Specifies order to sort tags in returned list: + + Input - Sort in same order as input tag arguments (default) + File - Sort in order that tags were found in the file + Tag - Sort alphabetically by tag name + Descr - Sort by tag description (for current Lang setting) + Group# - Sort by tag group, where # is zero or more family + numbers separated by colons. If # is not specified, + Group0 is assumed. See GetGroup for a description + of group families. + +=item Sort2 + +Secondary sort order used for tags within each group when Sort is 'Group': + + File - Sort in order tags were found in the file (default) + Tag - Sort alphabetically by tag name + Descr - Sort by tag description (for current Lang setting) + +=item StrictDate + +Flag to return undefined value for any date which can't be converted when +the DateFormat option is used. Default is undef. + + undef - Same as 0 for reading/writing, or 1 for copying + 0 - Return date/time value unchanged if it can't be converted + 1 - Return undef if date/time value can't be converted + +When set to 1 while writing a PrintConv date/time value with the DateFormat +option set, the value is written only if POSIX::strptime or Time::Piece is +available and can successfully convert the value. + +For PNG CreationTime, a setting of 1 has the additional effect of causing +the date/time to be reformatted according to PNG 1.2 recommendation +(RFC-1123) when writing, and a warning to be issued for any non-standard +value when reading (but note that Windows may not recognize PNG date/time +values in standard format). + +=item Struct + +Flag to return XMP structures as hash references instead of flattening into +individual tags. Has no effect when writing since both flattened and +structured tags may always be written. Possible values are: + + undef - (default) Same as 0 for reading, 2 for copying + 0 - Read/copy flattened tags + 1 - Read/copy structured tags + 2 - Read/copy both flattened and structured tags, but flag + flattened tags as 'unsafe' for copying + +=item SystemTags + +Flag to extract the following additional File System tags: FileAttributes, +FileDeviceNumber, FileInodeNumber, FileHardLinks, FileUserID, FileGroupID, +FileDeviceID, FileBlockSize and FileBlockCount. + +=item TextOut + +Output file reference for Verbose and HtmlDump options. Default is +\*STDOUT. + +=item TimeZone + +Time zone for local date/time values. May be set to any valid TZ string. +Uses the system time zone if not specified. Default is undef. (Requires +POSIX::tzset, which may not be available in Windows. A work-around in +Windows is to CzoneE> before running ExifTool.) + +=item Unknown + +Flag to get the values of unknown tags. If set to 1, unknown tags are +extracted from EXIF (or other tagged-format) directories. If set to 2, +unknown tags are also extracted from binary data blocks. Default is 0. + +=item UserParam + +Special option to set/get user-defined parameters. Useful to allow external +input into tag name expressions and ValueConv logic. Valid UserParam values +are: + + PARAM - Get parameter + PARAM= - Clear parameter + PARAM^= - Set parameter to empty string + PARAM=VALUE - Set parameter + - Set entire UserParam hash lookup + undef - Clear all user parameters + +Where I is the user-defined parameter name (case insensitive). + +User-defined parameters may be accessed in tag name expressions by prefixing +the parameter name with a dollar sign just like normal tags, or via the API +by calling C. Appending a hash tag (C<#>) to +the parameter name also causes the parameter to be extracted as a normal tag +(in the UserParam group). If called without additional arguments, +C returns a reference to the hash of all user +parameters (with lower-case names). + +=item Validate + +Flag to perform extra validation metadata checks when reading, causing extra +warnings to be generated if problems are found. Default is undef. + +=item Verbose + +Print verbose messages to file specified by TextOut option. Value may be +from 0 to 5 for increasingly verbose messages. Default is 0. With the +verbose option set, messages are printed to the console as the file is +parsed. Level 1 prints the tag names and raw values. Level 2 adds more +details about the tags. Level 3 adds a hex dump of the tag data, but with +limits on the number of bytes dumped. Levels 4 and 5 remove the dump limit +on tag values and JPEG segment data respectively. + +=item WriteMode + +Set tag write/create mode. Value is a string of one or more characters from +list below. Default is 'wcg'. + + w - Write existing tags + c - Create new tags + g - create new Groups as necessary + +The level of the group differs for different types of metadata. For XMP or +IPTC this is the full XMP/IPTC block (the family 0 group), but for EXIF this +is the individual IFD (the family 1 group). The 'w' and 'c' modes are +tested only when L is called, but the 'g' mode is also tested +in L. + +=item XAttrTags + +Flag to extract the OS X extended attribute tags (see the "xattr" man page +and L for more information). + +=item XMPAutoConv + +Flag to enable automatic conversion for unknown XMP tags with values that +look like rational numbers or dates. Default is 1. + +=back + +=item Return Values: + +The original value of the last specified parameter. + +=back + +=head2 ClearOptions + +Reset all options to their default values. Loads user-defined default +option values from the %Image::ExifTool::UserDefined::Options hash in the +.ExifTool_config file if it exists. + + $exifTool->ClearOptions(); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +=item Return Values: + +(none) + +=back + +=head2 ExtractInfo + +Extract all meta information from an image. + + $success = $exifTool->ExtractInfo('image.jpg', \%options); + +=over 4 + +=item Inputs: + +L takes exactly the same arguments as L. The only +difference is that a list of tag keys is not returned if an ARRAY reference +is given. The following options are effective in the call to +L: + +Binary, Charset, CharsetEXIF, CharsetFileName, CharsetID3, CharsetIPTC, +CharsetPhotoshop, CharsetQuickTime, CharsetRIFF, Composite, ExtendedXMP, +ExtractEmbedded, FastScan, FixBase, HtmlDump, HtmlDumpBase, +IgnoreMinorErrors, IgnoreTags, Lang, LargeFileSupport, MakerNotes, +MDItemTags, NoPDFList, Password, QuickTimeUTC (enforced 1904 time zero), +RequestAll, RequestTags, SaveFormat, SavePath, ScanForXMP, Struct, TextOut, +Unknown, Verbose, XAttrTags and XMPAutoConv. + +=item Return Value: + +1 if this was a recognized file format, 0 otherwise (and 'Error' tag set). + +=back + +=head2 GetInfo + +L is called to return meta information after it has been extracted +from the image by a previous call to L or L. This +function may be called repeatedly after a single call to L or +L. + + # get image width and height only + $info = $exifTool->GetInfo('ImageWidth', 'ImageHeight'); + + # get all Error and Warning messages + $info = $exifTool->GetInfo('Error', 'Warning'); + + # get information for all tags in list (list updated with tags found) + $info = $exifTool->GetInfo(\@ioTagList); + + # get all information in Author or Location groups + $info = $exifTool->GetInfo({Group2 => ['Author', 'Location']}); + +=over 4 + +=item Inputs: + +Inputs are the same as L and L except that an +image can not be specified. Options in effect are: + +Charset, CoordFormat, DateFormat, Duplicates, Escape, Exclude, Filter, +Group#, GlobalTimeShift, Lang, ListItem, ListJoin, PrintConv, Sort (if a tag +list reference is given) and StrictDate. + +=item Return Value: + +Reference to information hash, the same as with L. + +=back + +The following options are effective in the call to L: + +Charset, CoordFormat, DateFormat, Duplicates, Escape, Exclude, Filter, +Group#, GlobalTimeShift, Lang, ListItem, ListJoin, PrintConv, QuickTimeUTC +(conversion to local time), Sort (if a tag list reference is given) and +StrictDate. + +=head2 WriteInfo + +Write meta information to a file. The specified source file is rewritten to +the same-type destination file with new information as specified by previous +calls to L. The necessary segments and/or directories are +created in the destination file as required to store the specified +information. May be called repeatedly to write the same information to +additional files without the need to call L again. + +ExifTool queues all new values that are assigned via calls to +L, then applies them to any number of files through one or +more calls to L. These queued values may be accessed through +L, and are completely separate from metadata extracted from +files via L or L and accessed through L +or L. + +To be clear, it is NOT necessary to call L or L +before L. L changes only metadata specified by +previous calls to L. + + # add information to a source file, writing output to new file + $exifTool->WriteInfo($srcfile, $dstfile); + + # create XMP data file from scratch + $exifTool->WriteInfo(undef, $dstfile, 'XMP'); + + # overwrite file (you do have backups, right?) + $exifTool->WriteInfo($srcfile); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) Source file name, file reference, scalar reference, or undef to create a +file from scratch. A reference to a +L object is also allowed as a source, +but in this case the destination is not optional. + +2) [optional] Destination file name, file reference, scalar reference to +write to memory, or undef to overwrite the original file. May be '-' to +write to stdout. + +3) [optional] Destination file type. Ignored if a source is defined. + +=item Return Value: + +1 if file was written OK, 2 if file was written but no changes made, 0 on +file write error. + +If an error code is returned, an Error tag is set and GetValue('Error') can +be called to obtain the error description. A Warning tag may be set even if +this routine is successful. Calling WriteInfo clears any pre-existing Error +and Warning tags. + + $errorMessage = $exifTool->GetValue('Error'); + $warningMessage = $exifTool->GetValue('Warning'); + +=item Notes: + +The source file name may be undefined to create a file from scratch +(currently only XMP, MIE, ICC, VRD, DR4, EXV and EXIF files can be created +in this way -- see L for details). If undefined, the +destination file type is required unless the type can be determined from the +extension of the destination file name. + +If a destination file name is given, the specified file must not exist +because an existing destination file will not be overwritten. Any new +values for FileName, Directory or HardLink are ignored when a destination +file name is specified. + +The destination file name may be undefined to overwrite the original file +(make sure you have backups!). In this case, if a source file name is +provided, a temporary file is created and renamed to replace the source file +if no errors occurred while writing. Otherwise, if a source file reference +or scalar reference is used, the image is first written to memory then +copied back to replace the original if there were no errors. + +On Mac OS systems, the file resource fork is preserved if this routine is +called with a source file name. + +=back + +The following ExifTool options are effective in the call to L: + +ByteOrder, Charset, CharsetEXIF, CharsetFileName, CharsetIPTC, Compact, +Compress, FixBase, IgnoreMinorErrors, NoMultiExif, NoPDFList, Password, +QuickTimeHandler, QuickTimePad, Verbose and WriteMode. + +=head2 GetTagList + +Get a sorted list of tags from the specified information hash or tag list. + + @tags = $exifTool->GetTagList($info, 'Group0'); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) [optional] Information hash reference or tag list reference + +2) [optional] Sort order ('Input', 'File', 'Tag', 'Descr' or 'Group#') + +3) [optional] Secondary sort order ('File', 'Tag' or 'Descr') + +If the information hash or tag list reference is not provided, then the list +of found tags from the last call to L, L or +L is used instead, and the result is the same as if +L was called. If sort order is not specified, the sort order +is taken from the current options settings. + +=item Return Values: + +A list of tag keys in the specified order. + +=back + +=head2 GetFoundTags + +Get list of found tags in specified sort order. The found tags are the tags +for the information obtained from the most recent call to L, +L or L for this object. + + @tags = $exifTool->GetFoundTags('File'); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) [optional] Sort order ('Input', 'File', 'Tag', 'Descr' or 'Group#') + +2) [optional] Secondary sort order ('File', 'Tag' or 'Descr') + +If sort order is not specified, the sort order from the ExifTool options is +used. + +=item Return Values: + +A list of tag keys in the specified order. + +=back + +=head2 GetRequestedTags + +Get list of requested tags. These are the tags that were specified in the +arguments of the most recent call to L, L or +L, including tags specified via a tag list reference. Shortcut +tags are expanded in the list. + + @tags = $exifTool->GetRequestedTags(); + +=over 4 + +=item Inputs: + +(none) + +=item Return Values: + +List of requested tag keys in the same order that the tags were specified. +Note that this list will be empty if tags were not specifically requested +(ie. If extracting all tags). + +=back + +=head2 GetValue + +Get the value of a specified tag. The returned value is either the +human-readable (PrintConv) value, the converted machine-readable (ValueConv) +value, the original raw (Raw) value, or the original rational (Rational) +value for rational formats. If the value type is not specified, the +PrintConv value is returned if the PrintConv option is set, otherwise the +ValueConv value is returned. The PrintConv values are same as the values +returned by L and L in the tag/value hash unless the +PrintConv option is disabled. + +Tags which represent lists of multiple values (as may happen with 'Keywords' +for example) are handled specially. In scalar context, the returned +PrintConv value for these tags is either a string of values or a list +reference (depending on the ListJoin option setting), and the ValueConv +value is always a list reference. But in list context, L always +returns the list itself. + +Note that L requires a case-sensitive tag key as an argument. To +retrieve tag information based on a case-insensitive tag name (with an +optional group specifier), use L instead. + + # PrintConv example + my $val = $exifTool->GetValue($tag); + if (ref $val eq 'SCALAR') { + print "$tag = (unprintable value)\n"; + } else { + print "$tag = $val\n"; + } + + # ValueConv examples + my $val = $exifTool->GetValue($tag, 'ValueConv'); + if (ref $val eq 'ARRAY') { + print "$tag is a list of values\n"; + } elsif (ref $val eq 'SCALAR') { + print "$tag represents binary data\n"; + } else { + print "$tag is a simple scalar\n"; + } + + my @keywords = $exifTool->GetValue('Keywords', 'ValueConv'); + +The following options are in effect when L is called: + +Charset, CoordFormat, DateFormat, Escape, Filter, GlobalTimeShift, Lang, +ListItem, ListJoin, PrintConv, QuickTimeUTC (conversion to local time), +StrictDate and TimeZone. + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) Tag key, or case-sensitive tag name with optional group prefix(es) + +2) [optional] Value type: 'PrintConv', 'ValueConv', 'Both', 'Raw' or +'Rational' + +The default value type is 'PrintConv' if the PrintConv option is set, +otherwise the default is 'ValueConv'. A value type of 'Both' returns both +ValueConv and PrintConv values as a list. 'Rational' returns the raw +rational value as a string fraction for rational types, or undef for other +types. + +=item Return Values: + +The value of the specified tag. If the tag represents a list of multiple +values and the ListJoin option is enabled then PrintConv returns a string of +values, otherwise a reference to the list is returned in scalar context. The +list itself is returned in list context. (Unless 'Both' values are +requested, in which case two list references are returned, regardless of +context.) Values may also be scalar references to binary data, or hash +references if the L option is set. + +Note: It is possible for L to return an undefined ValueConv or +PrintConv value (or an empty list in list context) even if the tag exists, +since it is possible for these conversions to yield undefined values. And +the Rational value will be undefined for any non-rational tag. The Raw +value should always exist if the tag exists. + +=back + +=head2 SetNewValue + +Set the new value for a tag. The routine may be called multiple times to +set the values of many tags before using L to write the new +values to an image. + +For list-type tags (like Keywords), either call repeatedly with the same tag +name for each value, or call with a reference to the list of values. + + # set a new value for a tag (errors go to STDERR) + $success = $exifTool->SetNewValue($tag, $value); + + # set a new value and capture any error message + ($success, $errStr) = $exifTool->SetNewValue($tag, $value); + + # delete information for specified tag if it exists in image + # (also resets AddValue and DelValue options for this tag) + $exifTool->SetNewValue($tag); + + # reset all values from previous calls to SetNewValue() + $exifTool->SetNewValue(); + + # delete a specific keyword + $exifTool->SetNewValue('Keywords', $word, DelValue => 1); + + # set keywords (a list-type tag) with two new values + $exifTool->SetNewValue(Keywords => 'word1'); + $exifTool->SetNewValue(Keywords => 'word2'); + # equivalent, but set both in one call using an array reference + $exifTool->SetNewValue(Keywords => ['word1','word2']); + + # add a keyword without replacing existing keywords in the file + $exifTool->SetNewValue(Keywords => $word, AddValue => 1); + + # conditionally add a tag if it didn't exist before, + # or replace it if it had a specified value ("old value") + $exifTool->SetNewValue(Description => '', DelValue => 1); + $exifTool->SetNewValue(Description => 'old value', DelValue => 1); + $exifTool->SetNewValue(Description => 'new value'); + + # set a tag in a specific group + $exifTool->SetNewValue(Headline => $val, Group => 'XMP'); + $exifTool->SetNewValue('XMP:Headline' => $val); # (equivalent) + + # shift original date/time back by 2.5 hours + $exifTool->SetNewValue(DateTimeOriginal => '2:30', Shift => -1); + + # write a tag only if it had a specific value + # (the order of the following calls is not significant) + $exifTool->SetNewValue(Title => $oldVal, DelValue => 1); + $exifTool->SetNewValue(Title => $newVal); + + # write tag by numerical value + $exifTool->SetNewValue(Orientation => 6, Type => 'ValueConv'); + $exifTool->SetNewValue('Orientation#' => 6); # (equivalent) + + # delete all but EXIF tags + $exifTool->SetNewValue('*'); # delete all... + $exifTool->SetNewValue('EXIF:*', undef, Replace => 2); # ...but EXIF + + # write structured information as a HASH reference + $exifTool->SetNewValue('XMP:Flash' => { + mode => 'on', + fired => 'true', + return => 'not' + }); + + # write structured information as a serialized string + $exifTool->SetNewValue('XMP:Flash'=>'{mode=on,fired=true,return=not}'); + +(See L for a description of the +structure serialization technique.) + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) [optional] Tag key or tag name, or undef to clear all new values. The +tag name may be prefixed by one or more family 0, 1 or 2 group names with +optional leading family numbers, separated by colons (eg. 'EXIF:Artist', +'XMP:Time:*'), which is equivalent to using a Group option argument. Also, +a '#' may be appended to the tag name (eg. 'EXIF:Orientation#'), with the +same effect as setting Type to 'ValueConv'. Wildcards ('*' and '?') may be +used in the tag name to assign or delete multiple tags simultaneously. A +tag name of '*' is special when deleting information, and will delete an +entire group even if some individual tags in the group are not writable, but +only if a single family 0 or 1 group is specified (otherwise the tags are +deleted individually). Use L to get a list of deletable +group names, and see L +for a complete list of tag names. + +2) [optional] New value for tag. Undefined to delete tag from file. May be +a scalar, scalar reference, list reference to set a list of values, or hash +reference for a structure. Integer values may be specified as a hexadecimal +string (with a leading '0x'), and simple rational values may be specified in +fractional form (eg. '4/10'). Structure tags may be specified either as a +hash reference or a serialized string (see the last two examples above). + +3-N) [optional] SetNewValue option/value pairs (see below). + +=item SetNewValue Options: + +=over 4 + +=item AddValue + +Specifies that the value be added to an existing list in a file rather than +overwriting the existing values. Valid settings are 0 (overwrite any +existing tag value), 1 (add to an existing list and warn for non-list tags) +or 2 (add to existing list and overwrite non-list tags). Default is 0. + +=item DelValue + +Delete existing tag from a file if it has the specified value. For +list-type tags this deletes a specified item from the list. For non-list +tags this may be used to conditionally replace a tag by providing a new +value in a separate call to L (see examples above). For +structured tags, the entire structure is deleted/replaced only if all of the +specified fields match the existing structure. Option values are 0 or 1. +Default is 0. + +=item EditGroup + +Create tags in existing groups only. Don't create new group. Valid values +are 0 and 1. Effectively removes the 'g' from the ExifTool WriteMode option +for this tag only. Default is 0. + +=item EditOnly + +Edit tag only if it already exists. Don't create new tag. Valid values are +0 and 1. Effectively removes the 'c' from the ExifTool WriteMode option for +this tag only. Default is 0. + +=item Group + +Specifies group name where tag should be written. This option is superseded +by any group specified in the tag name. If not specified, tag is written to +highest priority group as specified by L. May be one or more +family 0, 1 or 2 groups with optional leading family number, separated by +colons. Case is not significant. + +=item NoFlat + +Treat flattened tags as 'unsafe'. + +=item NoShortcut + +Disables default behaviour of looking up tag in shortcuts if not found +otherwise. + +=item Protected + +Bit mask for tag protection levels to write. Bit 0x01 allows writing of +'unsafe' tags (ie. tags not copied automatically via +L). Bit 0x02 allows writing of 'protected' tags, and +should only be used internally by ExifTool. See +L, for a list of tag +names indicating 'unsafe' and 'protected' tags. Default is 0. + +=item ProtectSaved + +Avoid setting new values which were saved after the Nth call to +L. Has no effect on unsaved values, or values saved before +Nth call. Option value is N. Default is undef. + +=item Replace + +Flag to replace the previous new values for this tag (ie. replace the values +set in previous calls to L). This option is most commonly +used to replace previously-set new values for list-type tags. Valid values +are 0 (set new value normally -- adds to new values for list-type tags), 1 +(reset any previous new values before setting new value) or 2 (reset +previous new values only; new value argument is ignored). Default is 0. + +=item Shift + +Shift the tag by the specified value. Currently only date/time tags and +tags with numerical values may be shifted. Undefined for no shift, 1 for a +positive shift, or -1 for a negative shift. A value of 0 causes a positive +shift to be applied if the tag is shiftable and AddValue is set, or a +negative shift for date/time tags only if DelValue is set. Default is undef. +See L for more +information. + +=item Type + +The type of value being set. Valid values are PrintConv, ValueConv or Raw. +Default is PrintConv if the L Option is set, otherwise +ValueConv. + +=back + +=item Return Values: + +In scalar context, returns the number of tags set and error messages are +printed to STDERR. In list context, returns the number of tags set, and the +error string (which is undefined if there was no error). + +=item Notes: + +When deleting groups of tags, the Replace option may be used to exclude +specific groups from a mass delete. However, this technique may not be used +to exclude individual tags from a group delete (unless a family 2 group was +specified in the delete). Instead, use L to recover +the values of individual tags after deleting a group. + +When deleting all tags from a JPEG image, the APP14 "Adobe" information is +not deleted by default because doing so may affect the appearance of the +image. However, this information may be deleted by specifying it +explicitly, either by group (with 'Adobe:*') or as a block (with 'Adobe'). + +=back + +The following ExifTool options are effective in the call to L: + +Charset, DateFormat, Escape, IgnoreMinorErrors, Lang, ListJoin, ListSplit, +PrintConv, QuickTimeUTC, StrictDate, TimeZone, Verbose and WriteMode. + +=head2 GetNewValue + +Get the new Raw value for a tag. This is the value set by L +this is queued to be written to file. List-type tags may return multiple +values in list context. + + $rawVal = $exifTool->GetNewValue($tag); + + @rawVals = $exifTool->GetNewValue($tag); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) Tag name (case sensitive, may be prefixed by family 0, 1 or 7 group +names, separated by colons) + +=item Return Values: + +List of new Raw tag values, or first value in list when called in scalar +context. The list may be empty either if the tag isn't being written, or if +it is being deleted (ie. if L was called without a value). + +=back + +=head2 SetNewValuesFromFile + +A very powerful routine that sets new values for tags from information found +in a specified file. + + # set new values from all information in a file... + my $info = $exifTool->SetNewValuesFromFile($srcFile); + # ...then write these values to another image + my $result = $exifTool->WriteInfo($file2, $outFile); + + # set all new values, preserving original groups + $exifTool->SetNewValuesFromFile($srcFile, '*:*'); + + # set specific information + $exifTool->SetNewValuesFromFile($srcFile, @tags); + + # set new value from a different tag in specific group + $exifTool->SetNewValuesFromFile($fp, 'XMP-dc:SubjectSetNewValuesFromFile($fp, 'XMP-dc:Subject+SetNewValuesFromFile($file, + 'CommentSetNewValuesFromFile($file, { Replace => 0 }, + 'keywordsSetNewValuesFromFile($file, '*:*SetNewValuesFromFile($file, 'gps*'); + + # set FileName from Model, translating questionable characters + $exifTool->SetNewValuesFromFile($file, + 'filename<${model; tr(/\\\\?*:|"><)(_) }.jpg'); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) File name, file reference, or scalar reference + +2-N) [optional] List of tag names to set or options hash references. All +writable tags are set if none are specified. The tag names are not case +sensitive, and may be prefixed by one or more family 0, 1, 2 or 7 group +names with optional leading family numbers, separated by colons (eg. +'exif:iso'). A leading '-' indicates tags to be excluded (eg. '-comment'), +or a trailing '#' causes the ValueConv value to be copied (same as setting +the Type option to 'ValueConv' for this tag only). Wildcards ('*' and '?') +may be used in the tag name. A tag name of '*' is commonly used when a +group is specified to copy all tags in the group (eg. 'XMP:*'). A special +feature allows tag names of the form 'DSTTAGESRCTAG' (or +'SRCTAGEDSTTAG') to be specified to copy information to a tag with a +different name or a specified group. Both 'SRCTAG' and 'DSTTAG' may contain +wildcards and/or be prefixed by a group name (eg. +'fileModifyDateEmodifyDate' or 'xmp:*E*'), and/or suffixed by a '#' +to disable print conversion. Copied tags may also be added or deleted from +a list with arguments of the form 'DSTTAG+ESRCTAG' or +'DSTTAG-ESRCTAG'. Tags are evaluated in order, so exclusions apply only +to tags included earlier in the list. An extension of this feature allows +the tag value to be set from a string containing tag names with leading '$' +symbols (eg. 'CommentEthe file is $filename'). Braces '{}' may be used +around the tag name to separate it from subsequent text, and a '$$' is used +to to represent a '$' symbol. The behaviour for missing tags in expressions +is defined by the L option. The tag value may be modified +via changes to the default input variable ($_) in a Perl expression placed +inside the braces and after a semicolon following the tag name (see the last +example above). A '@' may be added after the tag name (before the +semicolon) to make the expression act on individual list items instead of +the concatenated string for list-type tags. Braces within the expression +must be balanced. Multiple options hash references may be passed to set +different options for different tags. Options apply to subsequent tags in +the argument list. + +By default, this routine will commute information between same-named tags in +different groups, allowing information to be translated between images with +different formats. This behaviour may be modified by specifying a group +name for extracted tags (even if '*' is used as a group name), in which case +the information is written to the original group, unless redirected to a +different group. When '*' is used for a group name, by default the family 1 +group of the original tag is preserved, but a different family may be +specified with a leading family number. (For example, specifying '*:*' +copies all information while preserving the original family 1 groups, while +'0*:*' preserves the family 0 group.) + +=item SetNewValuesFromFile Options: + +The options are the same was for L, and are passed directly +to L internally, with a few exceptions: + +- The Replace option defaults to 1 instead of 0 as with L. + +- The AddValue or DelValue option is set for individual tags if '+>' or '->' +(or '+E' or '-E') are used. + +- The Group option is set for tags where a group name is given. + +- The Protected flag is set to 1 for individually specified tags. + +- The Type option also applies to extracted tags. + +=item Return Values: + +A hash of information that was set successfully. May include Warning or +Error entries if there were problems reading the input file. + +=item Notes: + +The PrintConv option applies to this routine, but it normally should be left +on to provide more reliable transfer of information between groups. + +If a preview image exists, it is not copied. The preview image must be +transferred separately if desired, in a separate call to L + +When simply copying all information between files of the same type, it is +usually desirable to preserve the original groups by specifying '*:*' for +the tags to set. + +The L option is always in effect for tags extracted from the +source file using this routine. + +The L option is enabled by default for tags extracted by this +routine. This allows the hierarchy of complex structures to be preserved +when copying, but the Struct option may be set to 0 to override this +behaviour and copy as flattened tags instead. + +=back + +=head2 CountNewValues + +Return the total number of new values set. + + $numSet = $exifTool->CountNewValues(); + ($numSet, $numPseudo) = $exifTool->CountNewValues(); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +=item Return Values: + +In scalar context, returns the total number of tags with new values set. In +list context, also returns the number of "pseudo" tag values which have been +set. "Pseudo" tags are tags like FileName and FileModifyDate which are not +contained within the file and can be changed without rewriting the file. + +=back + +=head2 SaveNewValues + +Save state of new values to be later restored by L. + + $exifTool->SaveNewValues(); # save state of new values + $exifTool->SetNewValue(ISO => 100); # set new value for ISO + $exifTool->WriteInfo($src, $dst1); # write ISO + previous new values + $exifTool->RestoreNewValues(); # restore previous new values + $exifTool->WriteInfo($src, $dst2); # write previous new values only + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +=item Return Value: + +Count of the number of times this routine has been called (N) since the last +time the new values were reset. + +=back + +=head2 RestoreNewValues + +Restore new values to the settings that existed when L was +last called. May be called repeatedly after a single call to +L. See L above for an example. + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +=item Return Value: + +None. + +=back + +=head2 SetFileModifyDate + +Write the filesystem modification or creation time from the new value of the +FileModifyDate or FileCreateDate tag. + + $exifTool->SetNewValue(FileModifyDate => '2000:01:02 03:04:05-05:00', + Protected => 1); + $result = $exifTool->SetFileModifyDate($file); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) File name + +2) [optional] Base time if applying shift (days before $^T) + +3) [optional] Tag to write: 'FileModifyDate' (default), or 'FileCreateDate' + +=item Return Value: + +1 if the time was changed, 0 if nothing was done, or -1 if there was an +error setting the time. + +=item Notes: + +Equivalent to, but more efficient than calling L when only the +FileModifyDate or FileCreateDate tag has been set. If a timezone is not +specified, local time is assumed. When shifting, the time of the original +file is used unless the optional base time is specified. + +The ability to write FileCreateDate is currently restricted to Windows +systems only. + +=back + +=head2 SetFileName + +Set the file name and directory, or create a hard link. If not specified, +the new file name is derived from the new values of the FileName and +Directory tags, or from the HardLink or SymLink tag if creating a link. If +the FileName tag contains a '/', then the file is renamed into a new +directory. If FileName ends with '/', then it is taken as a directory name +and the file is moved into the new directory. The new value for the +Directory tag takes precedence over any directory specified in FileName. + + $result = $exifTool->SetFileName($file); + $result = $exifTool->SetFileName($file, $newName); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) Current file name + +2) [optional] New file name + +3) [optional] 'HardLink' or 'SymLink' to create a hard or symbolic link +instead of renaming the file, or 'Test' to test renaming feature by printing +the old and new names instead of changing anything. + +=item Return Value: + +1 on success, 0 if nothing was done, or -1 if there was an error renaming the +file or creating the link. + +=item Notes: + +Will not overwrite existing files. New directories are created as necessary. +If the file is successfully renamed, the new file name may be accessed via +C<$$exifTool{NewName}>. + +=back + +=head2 SetNewGroups + +Set the order of the preferred groups when adding new information. In +subsequent calls to L, new information will be created in the +first valid group of this list. This has an impact only if the group is not +specified when calling L and if the tag name exists in more +than one group. The default order is EXIF, IPTC, XMP, MakerNotes, +QuickTime, Photoshop, ICC_Profile, CanonVRD, Adobe. Any family 0 group name +may be used. Case is not significant. + + $exifTool->SetNewGroups('XMP','EXIF','IPTC'); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1-N) Groups in order of priority. If no groups are specified, the priorities +are reset to the defaults. + +=item Return Value: + +None. + +=back + +=head2 GetNewGroups + +Get current group priority list. + + @groups = $exifTool->GetNewGroups(); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +=item Return Values: + +List of group names in order of write priority. Highest priority first. + +=back + +=head2 GetTagID + +Get the ID for the specified tag. The ID is the IFD tag number in EXIF +information, the property name in XMP information, or the data offset in a +binary data block. For some tags, such as Composite tags where there is no +ID, an empty string is returned. In list context, also returns a language +code for the tag if available and different from the default language (eg. +with alternate language entries for XMP "lang-alt" tags). + + $id = $exifTool->GetTagID($tag); + ($id, $lang) = $exifTool->GetTagID($tag); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) Tag key + +=item Return Values: + +In scalar context, returns the tag ID or '' if there is no ID for this tag. +In list context, returns the tag ID (or '') and the language code (or +undef). + +=back + +=head2 GetDescription + +Get description for specified tag. This function will always return a +defined value. In the case where the description doesn't exist, one is +generated from the tag name. + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) Tag key + +=item Return Values: + +A description for the specified tag. + +=back + +=head2 GetGroup + +Get group name(s) for a specified tag. + + # return family 0 group name (eg. 'EXIF'); + $group = $exifTool->GetGroup($tag, 0); + + # return all groups (eg. qw{EXIF IFD0 Author Main}) + @groups = $exifTool->GetGroup($tag); + + # return groups as a string (eg. 'Main:IFD0:Author') + $group = $exifTool->GetGroup($tag, ':3:1:2'); + + # return groups as a simplified string (eg. 'IFD0:Author') + $group = $exifTool->GetGroup($tag, '3:1:2'); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) Tag key + +2) [optional] Group family number, or string of numbers separated by colons + +=item Return Values: + +Group name (or '' if tag has no group). If no group family is specified, +L returns the name of the group in family 0 when called in scalar +context, or the names of groups for all families in list context. Returns a +string of group names separated by colons if the input group family contains +a colon. The string is simplified to remove a leading 'Main:' and adjacent +identical group names unless the family string begins with a colon. + +=item Notes: + +The group family numbers are currently available: + + 0) Information Type (eg. EXIF, XMP, IPTC) + 1) Specific Location (eg. IFD0, XMP-dc) + 2) Category (eg. Author, Time) + 3) Document Number (eg. Main, Doc1, Doc3-2) + 4) Instance Number (eg. Copy1, Copy2, Copy3...) + 5) Metadata Path (eg. JPEG-APP1-IFD0-ExifIFD) + 6) EXIF/TIFF Format (eg. int8u, int32u, undef, string) + 7) Tag ID (eg. ID-271, ID-rights, ID-a9aut) + +Families 0 and 1 are based on the file structure, and are similar except +that family 1 is more specific and sub-divides some groups to give more +detail about the specific location where the information was found. For +example, the EXIF group is split up based on the specific IFD (Image File +Directory), the MakerNotes group is divided into groups for each +manufacturer, and the XMP group is separated based on the XMP namespace +prefix. Note that only common XMP namespaces are listed in the +L, but additional +namespaces may be present in some XMP data. Also note that the 'XMP-xmp...' +group names may appear in the older form 'XMP-xap...' since these names +evolved as the XMP standard was developed. The ICC_Profile group is broken +down to give information about the specific ICC_Profile tag from which +multiple values were extracted. As well, information extracted from the +ICC_Profile header is separated into the ICC-header group. + +Family 2 classifies information based on the logical category to which the +information refers. + +Family 3 gives the document number for tags extracted from embedded +documents, or 'Main' for tags from the main document. (See the +L option for extracting tags from embedded documents.) +Nested sub-documents (if they exist) are indicated by numbers separated with +dashes in the group name, to an arbitrary depth. (eg. 'Doc2-3-1' is the 1st +sub-sub-document of the 3rd sub-document of the 2nd embedded document of the +main file.) Document numbers are also used to differentiate samples for +timed metadata in videos. + +Family 4 provides a method for differentiating tags when multiple tags exist +with the same name in the same location. The primary instance of a tag (the +tag extracted when the Duplicates option is disabled and no group is +specified) has no family 4 group name, but additional instances have family +4 group names of 'Copy1', 'Copy2', 'Copy3', etc. For convenience, the +primary tag may also be accessed using a group name of 'Copy0'. + +Family 5 is experimental, and gives the complete path for the metadata in +the file. Generated only if the L option is used when +extracting. + +Family 6 is currently used only for EXIF/TIFF metadata, and gives the format +type of the extracted value. Generated only if the L option is +used when extracting. + +Family 7 is used for tag ID's. The group names are the actual tag ID's, +with a leading "ID-" string. Non-numerical ID's have characters other than +[-_A-Za-z0-9] converted to hex. Numerical tag ID's are returned in hex if +the L option is set, otherwise decimal is used. When specifying +a family 7 group name, numerical ID's may be in hex or decimal, and +non-numerical ID's may or may not have characters other than [-_A-Za-z0-9] +converted to hex. Note that unlike other group names, the tag ID's of +family 7 group names are case sensitive (but the leading "ID-" is not). + +See L for complete lists of group names. + +=back + +=head2 GetGroups + +Get list of group names that exist in the specified information. + + @groups = $exifTool->GetGroups($info, 2); + @groups = $exifTool->GetGroups('3:1'); + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +1) [optional] Info hash ref (default is all extracted info) + +2) [optional] Group family number, or string of numbers (default 0) + +=item Return Values: + +List of group names in alphabetical order. If information hash is not +specified, the group names are returned for all extracted information. See +L for an description of family numbers and family number strings. + +=back + +=head2 BuildCompositeTags + +Builds composite tags from required tags. The composite tags are +convenience tags which are derived from the values of other tags. This +routine is called automatically by L and L if the +Composite option is set. + +=over 4 + +=item Inputs: + +0) ExifTool object reference + +=item Return Values: + +(none) + +=item Notes: + +Tag values are calculated in alphabetical order unless a tag Require's or +Desire's another composite tag, in which case the calculation is deferred +until after the other tag is calculated. + +Composite tags may need to read data from the image for their value to be +determined, and for these L must be called while the +image is available. This is only a problem if L is called with +a filename (as opposed to a file reference or scalar reference) since in +this case the file is closed before L returns. Here the +Composite option may be used so that L is called from +within L, before the file is closed. + +=back + +=head2 GetTagName [static] + +Get name of tag from tag key. This is a convenience function that +strips the embedded instance number, if it exists, from the tag key. + +Note: "static" in the heading above indicates that the function does not +require an ExifTool object reference as the first argument. All functions +documented below are also static. + + $tagName = Image::ExifTool::GetTagName($tag); + +=over 4 + +=item Inputs: + +0) Tag key + +=item Return Value: + +Tag name. This is the same as the tag key but has the instance number +removed. + +=back + +=head2 GetShortcuts [static] + +Get a list of shortcut tags. + +=over 4 + +=item Inputs: + +(none) + +=item Return Values: + +List of shortcut tags (as defined in Image::ExifTool::Shortcuts). + +=back + +=head2 GetAllTags [static] + +Get list of all available tag names. + + @tagList = Image::ExifTool::GetAllTags($group); + +=over 4 + +=item Inputs: + +0) [optional] Group name, or string of group names separated by colons + +=item Return Values: + +A list of all available tags in alphabetical order, or all tags in a +specified group or intersection of groups. The group name is case +insensitive, and any group in families 0-2 may be used except for EXIF +family 1 groups (ie. the specific IFD). + +=back + +=head2 GetWritableTags [static] + +Get list of all writable tag names. + + @tagList = Image::ExifTool::GetWritableTags($group); + +=over 4 + +=item Inputs: + +0) [optional] Group name, or string of group names separated by colons + +=item Return Values: + +A list of all writable tags in alphabetical order. These are the tags for +which values may be set through L. If a group name is given, +returns only writable tags in specified group(s). The group name is case +insensitive, and any group in families 0-2 may be used except for EXIF +family 1 groups (ie. the specific IFD). + +=back + +=head2 GetAllGroups [static] + +Get list of all group names in specified family. + + @groupList = Image::ExifTool::GetAllGroups($family); + +=over 4 + +=item Inputs: + +0) Group family number (0-7) + +=item Return Values: + +A list of all groups in the specified family in alphabetical order. + +=back + +Here is a complete list of groups for each of these families: + +=over 4 + +=item Family 0 (Information Type): + +AFCP, AIFF, APE, APP0, APP1, APP11, APP12, APP13, APP14, APP15, APP3, APP4, +APP5, APP6, APP8, ASF, Audible, CanonVRD, Composite, DICOM, DNG, DV, DjVu, +Ducky, EXE, EXIF, ExifTool, FITS, FLAC, FLIR, File, Flash, FlashPix, Font, +FotoStation, GIF, GIMP, GeoTiff, GoPro, H264, HTML, ICC_Profile, ID3, IPTC, +ISO, ITC, JFIF, JPEG, JSON, JUMBF, Jpeg2000, LNK, Leaf, Lytro, M2TS, MIE, +MIFF, MNG, MOI, MPC, MPEG, MPF, MXF, MakerNotes, Matroska, Meta, Ogg, +OpenEXR, Opus, PDF, PICT, PLIST, PNG, PSP, Palm, Parrot, PanasonicRaw, +PhotoCD, PhotoMechanic, Photoshop, PostScript, PrintIM, QuickTime, RAF, +RIFF, RSRC, RTF, Radiance, Rawzor, Real, Red, SVG, SigmaRaw, Stim, Theora, +Torrent, Trailer, UserParam, VCard, Vorbis, WTV, XML, XMP, ZIP + +=item Family 1 (Specific Location): + +AC3, AFCP, AIFF, APE, ASF, AVI1, Adobe, AdobeCM, AdobeDNG, Apple, Audible, +CBOR, CIFF, CameraIFD, Canon, CanonCustom, CanonRaw, CanonVRD, Casio, +Chapter#, Composite, DICOM, DJI, DNG, DV, DjVu, DjVu-Meta, Ducky, EPPIM, +EXE, EXIF, ExifIFD, ExifTool, FITS, FLAC, FLIR, File, Flash, FlashPix, Font, +FotoStation, FujiFilm, FujiIFD, GE, GIF, GIMP, GPS, GeoTiff, GlobParamIFD, +GoPro, GraphConv, H264, HP, HTC, HTML, HTML-dc, HTML-ncc, HTML-office, +HTML-prod, HTML-vw96, HTTP-equiv, ICC-chrm, ICC-clrt, ICC-header, ICC-meas, +ICC-meta, ICC-view, ICC_Profile, ICC_Profile#, ID3, ID3v1, ID3v1_Enh, +ID3v2_2, ID3v2_3, ID3v2_4, IFD0, IFD1, IPTC, IPTC#, ISO, ITC, Insta360, +InteropIFD, ItemList, JFIF, JFXX, JPEG, JPEG-HDR, JPS, JSON, JUMBF, JVC, +Jpeg2000, KDC_IFD, Keys, Kodak, KodakBordersIFD, KodakEffectsIFD, KodakIFD, +KyoceraRaw, LNK, Leaf, LeafSubIFD, Leica, Lyrics3, Lytro, M2TS, MAC, +MIE-Audio, MIE-Camera, MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash, MIE-GPS, +MIE-Geo, MIE-Image, MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, +MIE-Orient, MIE-Preview, MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video, +MIFF, MNG, MOBI, MOI, MPC, MPEG, MPF0, MPImage, MS-DOC, MXF, MacOS, +MakerNotes, MakerUnknown, Matroska, MediaJukebox, Meta, MetaIFD, Microsoft, +Minolta, MinoltaRaw, Motorola, NITF, Nikon, NikonCapture, NikonCustom, +NikonScan, NikonSettings, NineEdits, Nintendo, Ocad, Ogg, Olympus, OpenEXR, +Opus, PDF, PICT, PNG, PNG-pHYs, PSP, Palm, Panasonic, PanasonicRaw, Pentax, +PhaseOne, PhotoCD, PhotoMechanic, Photoshop, PictureInfo, PostScript, +PreviewIFD, PrintIM, ProfileIFD, Qualcomm, QuickTime, RAF, RAF2, RIFF, +RMETA, RSRC, RTF, Radiance, Rawzor, Real, Real-CONT, Real-MDPR, Real-PROP, +Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red, Ricoh, SPIFF, SR2, +SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung, Sanyo, Scalado, Sigma, SigmaRaw, +Sony, SonyIDC, Stim, SubIFD, System, Theora, Torrent, Track#, UserData, +UserParam, VCalendar, VCard, Version0, Vorbis, WTV, XML, XMP, XMP-DICOM, +XMP-Device, XMP-GAudio, XMP-GDepth, XMP-GFocus, XMP-GImage, XMP-GPano, +XMP-GSpherical, XMP-LImage, XMP-MP, XMP-MP1, XMP-PixelLive, XMP-aas, +XMP-acdsee, XMP-album, XMP-apple-fi, XMP-aux, XMP-cc, XMP-cell, +XMP-creatorAtom, XMP-crs, XMP-dc, XMP-dex, XMP-digiKam, XMP-drone-dji, +XMP-dwc, XMP-exif, XMP-exifEX, XMP-expressionmedia, XMP-extensis, XMP-fpv, +XMP-getty, XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro, +XMP-microsoft, XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-pdf, XMP-pdfx, +XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi, XMP-prism, XMP-prl, +XMP-prm, XMP-pur, XMP-rdf, XMP-swf, XMP-tiff, XMP-x, XMP-xmp, XMP-xmpBJ, +XMP-xmpDM, XMP-xmpMM, XMP-xmpNote, XMP-xmpPLUS, XMP-xmpRights, XMP-xmpTPg, +ZIP, iTunes + +=item Family 2 (Category): + +Audio, Author, Camera, Device, Document, ExifTool, Image, Location, Other, +Preview, Printing, Time, Unknown, Video + +=item Family 3 (Document Number): + +Doc#, Main + +=item Family 4 (Instance Number): + +Copy# + +=item Family 5 (Metadata Path): + +eg. JPEG-APP1-IFD0-ExifIFD + +=item Family 6 (EXIF/TIFF Format): + +int8u, string, int16u, int32u, rational64u, int8s, undef, int16s, int32s, +rational64s, float, double, ifd, unicode, complex, int64u, int64s, ifd64 + +=item Family 7 (Tag ID): + +ID-xxx (Where xxx is the tag ID. Numerical ID's are returned in hex with a +leading "0x" if the HexTagIDs option is set, or decimal otherwise. +Characters in non-numerical ID's which are not valid in a group name are +returned as 2 hex digits.) + +=back + +Note: This function may also be called as an ExifTool member function to +allow the HexTagIDs option to be set when retrieving family 7 group names. + +=head2 GetDeleteGroups [static] + +Get list of all deletable group names. + + @delGroups = Image::ExifTool::GetDeleteGroups(); + +=over 4 + +=item Inputs: + +None. + +=item Return Values: + +A list of deletable group names in alphabetical order. The current list of +deletable group names is: + +Adobe, AFCP, APP0, APP1, APP10, APP11, APP12, APP13, APP14, APP15, APP2, +APP3, APP4, APP5, APP6, APP7, APP8, APP9, Audio, Author, Camera, CanonVRD, +CIFF, Document, Ducky, EXIF, ExifIFD, ExifTool, File, FlashPix, FotoStation, +GlobParamIFD, GPS, ICC_Profile, IFD0, IFD1, Image, Insta360, InteropIFD, +IPTC, ItemList, JFIF, Jpeg2000, Keys, Location, MakerNotes, Meta, MetaIFD, +Microsoft, MIE, MPF, NikonCapture, Other, PDF, PDF-update, PhotoMechanic, +Photoshop, PNG, PNG-pHYs, Preview, PrintIM, Printing, QuickTime, RMETA, +RSRC, SubIFD, Time, Trailer, UserData, Video, XML, XML-*, XMP, XMP-* + +To schedule a group for deletion, call L with a tag name like +'EXIF:*' and an undefined tag value. + +Deleting a family 0 or 1 group will delete the entire corresponding block of +metadata, but deleting a family 2 group (eg. Audio, Author, Camera, etc.) +deletes the individual tags belonging to that category. + +The 'Trailer' group allows all trailers in JPEG and TIFF-format images to be +deleted at once, including unknown trailers. Note that the JPEG "APP" +groups are special, and are used only to delete application segments which +are not associated with another deletable group. For example, deleting +'APP14:*' will delete other APP14 segments, but not the APP14 "Adobe" +segment. + +=back + +=head2 GetFileType [static] + +Get type of file given file name. + + my $type = Image::ExifTool::GetFileType($filename); + my $desc = Image::ExifTool::GetFileType($filename, 1); + +=over 4 + +=item Inputs: + +0) [optional] File name (or just an extension) + +1) [optional] Flag to return a description instead of a type. Default is +undef. Set to 0 to also return types of recognized but unsupported files +(otherwise the return value for unsupported files is undef), or 1 to return +descriptions. + +=item Return Value: + +A string, based on the file extension, which indicates the basic format of +the file. Note that some files may be based on other formats (like many RAW +image formats are based on TIFF). In list context, may return more than one +file type if the file may be based on different formats. Returns undef if +files with this extension are not yet supported by ExifTool. Returns a list +of extensions for all supported file types if no input extension is +specified (or all recognized file types if the description flag is set to +0). Returns a more detailed description of the specific file format when the +description flag is set. + +=back + +=head2 CanWrite [static] + +Can the specified file be written? + + my $writable = Image::ExifTool::CanWrite($filename); + +=over 4 + +=item Inputs: + +0) File name or extension + +=item Return Value: + +True if ExifTool supports writing files of this type (based on the file +extension). + +=back + +=head2 CanCreate [static] + +Can the specified file be created? + + my $creatable = Image::ExifTool::CanCreate($filename); + +=over 4 + +=item Inputs: + +0) File name or extension + +=item Return Value: + +True if ExifTool can create files with this extension from scratch. +Currently, this can only be done with XMP, MIE, ICC, VRD, DR4, EXV and EXIF +files. + +=back + +=head2 AddUserDefinedTags [static] + +Add user-defined tags to an existing tag table at run time. This differs +from the usual technique of creating user-defined tags via the +%Image::ExifTool::UserDefined hash (see the ExifTool_config file in the +Image::ExifTool distribution) because it allows tags to be added after a tag +table has been initialized. + + use Image::ExifTool ':Public'; + my %tags = ( + TestTagID1 => { Name => 'TestTagName1' }, + TestTagID2 => { Name => 'TestTagName2' }, + ); + my $num = AddUserDefinedTags('Image::ExifTool::PDF::Info', %tags); + +=over 4 + +=item Inputs: + +0) Destination tag table name + +1-N) Pairs of tag ID / tag information hash references for the new tags + +=item Return Value: + +The number of tags added. + +=item Notes + +Pre-existing tags with the same ID will be replaced in the destination +table. See lib/Image/ExifTool/README in the full distribution for full +details on the elements of the tag information hash. + +=back + +=head1 CHARACTER ENCODINGS + +Certain meta information formats allow coded character sets other than plain +ASCII. When reading, most known encodings are converted to the external +character set according to the L option, or to UTF-8 by default. +When writing, the inverse conversions are performed. Alternatively, special +characters may be converted to/from HTML character entities with the +L HTML option. + +A distinction is made between the external character set visible via the +ExifTool API, and the internal character used to store text in the metadata +of a file. These character sets may be specified separately as follows: + +=over 4 + +=item External Character Sets: + +The encoding for tag values passed to/from ExifTool API functions is set via +the L option, which is 'UTF8' by default. + +The encoding of file names is specified via the L option. +By default, L is not defined, and file names passed to +ExifTool are used directly in calls to the system i/o routines (which expect +UTF-8 strings on Mac/Linux, but default to the system code page on Windows). +In this mode on Windows a warning is issued if a file name contains special +characters, but this warning may be avoided by setting L +to an empty string. Setting L to any other value causes +file names to be converted from the specified encoding to one appropriate +for the system. In Windows this also has the effect of activating Unicode +filename support via the special Windows wide-character i/o routines if +Win32API::File is available. + +=item Internal Character Sets: + +The encodings used to store strings in the various metadata formats. These +encodings may be changed for certain types of metadata via the +L, L, L, L, +L and L options. + +=back + +Values are returned as byte strings of encoded characters. Perl wide +characters are not used. By default, most returned strings are encoded in +UTF-8. For these, Encode::decode_utf8() may be used to convert to a +sequence of logical Perl characters. Note that some settings of the +PERL_UNICODE environment variable may be incompatible with ExifTool's +character handling. + +More specific details are given below about how character coding is handled +for EXIF, IPTC, XMP, PNG, ID3, PDF, Photoshop, QuickTime, AIFF, MIE and +Vorbis information: + +=head2 EXIF + +Most textual information in EXIF is stored in ASCII format (called "string" +in the L). By +default ExifTool does not convert these strings. However, it is not +uncommon for applications to write UTF-8 or other encodings where ASCII is +expected. To deal with these, ExifTool allows the internal EXIF string +encoding to be specified with L, which causes EXIF string +values to be converted from the specified character set when reading, and +stored with this character set when writing. (The MWG recommends using +UTF-8 encoding for EXIF strings, and in keeping with this the +L module sets the default internal EXIF string +encoding to UTF-8, but note that this will have no effect unless the +external encoding is also set to something other than the default of UTF-8.) + +A few EXIF tags (UserComment, GPSProcessingMethod and GPSAreaInformation) +support a designated internal text encoding, with values stored as ASCII, +Unicode (UCS-2) or JIS. When reading these tags, ExifTool converts Unicode +and JIS to the external character set specified by the L +option, or to UTF-8 by default. ASCII text is not converted. When writing, +text is stored as ASCII unless the string contains special characters, in +which case it is converted from the external character set (UTF-8 by +default), and stored as Unicode. ExifTool writes Unicode in native EXIF byte +ordering by default, but the byte order may be specified by setting the +ExifUnicodeByteOrder tag (see the +L). + +The EXIF "XP" tags (XPTitle, XPComment, etc) are always stored as +little-endian Unicode (UCS-2), and are read and written using the specified +character set. + +=head2 IPTC + +The value of the IPTC:CodedCharacterSet tag determines how the internal IPTC +string values are interpreted. If CodedCharacterSet exists and has a value +of 'UTF8' (or 'ESC % G') then string values are assumed to be stored as +UTF-8, otherwise Windows Latin1 (cp1252, 'Latin') coding is assumed by +default, but this can be changed with the L option. When +reading, these strings are converted to the character set specified by the +L option. When writing, the inverse conversions are performed. +No conversion is done if the internal (IPTC) and external (ExifTool) +character sets are the same. Note that ISO 2022 character set shifting is +not supported. Instead, a warning is issued and the string is not converted +if an ISO 2022 shift code is encountered. See L +for the official IPTC specification. + +ExifTool may be used to convert IPTC values to a different internal +encoding. To do this, all IPTC tags must be rewritten along with the +desired value of CodedCharacterSet. For example, the following command +changes the internal IPTC encoding to UTF-8 (from Windows Latin1 unless +CodedCharacterSet was already 'UTF8'): + + exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 a.jpg + +or from Windows Latin2 (cp1250) to UTF-8: + + exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 \ + -charset iptc=latin2 a.jpg + +and this command changes it back from UTF-8 to Windows Latin1 (cp1252): + + exiftool -tagsfromfile @ -iptc:all -codedcharacterset= a.jpg + +or to Windows Latin2: + + exiftool -tagsfromfile @ -iptc:all -codedcharacterset= \ + -charset iptc=latin2 a.jpg + +Unless CodedCharacterSet is 'UTF8', applications have no reliable way to +determine the IPTC character encoding. For this reason, it is recommended +that CodedCharacterSet be set to 'UTF8' when creating new IPTC. + +(Note: Here, "IPTC" Refers to the older IPTC IIM format. The more recent +IPTC Core and Extension specifications actually use the XMP format.) + +=head2 XMP + +ExifTool reads XMP encoded as UTF-8, UTF-16 or UTF-32, and converts them all +to UTF-8 internally. Also, all XML character entity references and numeric +character references are converted. When writing, ExifTool always encodes +XMP as UTF-8, converting the following 5 characters to XML character +references: E E E E<39> E. By default no further +conversion is performed, however if the L option is other than +'UTF8' then text is converted to/from the specified character set when +reading/writing. + +=head2 PNG + +L are +stored as tEXt, zTXt and iTXt chunks in PNG images. The tEXt and zTXt +chunks use ISO 8859-1 encoding, while iTXt uses UTF-8. When reading, +ExifTool converts all PNG textual data to the character set specified by the +L option. When writing, ExifTool generates a tEXt chunk (or zTXt +with the L option) if the text doesn't contain special characters +or if Latin encoding is specified; otherwise an iTXt chunk is used and the +text is converted from the specified character set and stored as UTF-8. + +=head2 JPEG Comment + +The encoding for the JPEG Comment (COM segment) is not specified, so +ExifTool reads/writes this text without conversion. + +=head2 ID3 + +The ID3v1 specification officially supports only ISO 8859-1 encoding (a +subset of Windows Latin1), although some applications may incorrectly use +other character sets. By default ExifTool converts ID3v1 text from Latin to +the character set specified by the L option. However, the +internal ID3v1 charset may be specified with the L option. The +encoding for ID3v2 information is stored in the file, so ExifTool converts +ID3v2 text from this encoding to the character set specified by the +L option. ExifTool does not currently write ID3 information. + +=head2 PDF + +PDF text strings are stored in either PDFDocEncoding (similar to Windows +Latin1) or Unicode (UCS-2). When reading, ExifTool converts to the +character set specified by the L option. When writing, ExifTool +encodes input text from the specified character set as Unicode only if the +string contains special characters, otherwise PDFDocEncoding is used. + +=head2 Photoshop + +Some Photoshop resource names are stored as Pascal strings with unknown +encoding. By default, ExifTool assumes MacRoman encoding and converts this +to UTF-8, but the internal and external character sets may be specified with +the L and L options respectively. + +=head2 QuickTime + +QuickTime text strings may be stored in a variety of poorly document +formats. ExifTool does its best to decode these according to the L +option setting. For some QuickTime strings, ExifTool assumes a default +encoding of MacRoman, but this may be changed with the L +option. + +=head2 AIFF + +AIFF strings are assumed to be stored in MacRoman, and are converted +according to the L option when reading. + +=head2 RIFF + +The internal encoding of RIFF strings (eg. in AVI and WAV files) is assumed +to be Latin unless otherwise specified by the RIFF CSET chunk or the +L option. + +=head2 MIE + +MIE strings are stored as either UTF-8 or ISO 8859-1. When reading, UTF-8 +strings are converted according to the L option, and ISO 8859-1 +strings are never converted. When writing, input strings are converted from +the specified character set to UTF-8. The resulting strings are stored as +UTF-8 if they contain multi-byte UTF-8 character sequences, otherwise they +are stored as ISO 8859-1. + +=head2 Vorbis + +Vorbis comments are stored as UTF-8, and are converted to the character set +specified by the L option. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Many people have helped in the development of ExifTool through their bug +reports, comments and suggestions, and/or additions to the code. See the +ACKNOWLEDGEMENTS in the individual Image::ExifTool modules and in +html/index.html of the Image::ExifTool distribution package for a list of +people who have contributed to this project. + +=head1 SEE ALSO + +L, +L, +L, +L, +L, +L + +=cut + +# end diff --git a/lib/Image/ExifTool/AES.pm b/lib/Image/ExifTool/AES.pm new file mode 100644 index 0000000..c7996cd --- /dev/null +++ b/lib/Image/ExifTool/AES.pm @@ -0,0 +1,501 @@ +#------------------------------------------------------------------------------ +# File: AES.pm +# +# Description: AES encryption with cipher-block chaining +# +# Revisions: 2010/10/14 - P. Harvey Created +# +# References: 1) http://www.hoozi.com/Articles/AESEncryption.htm +# 2) http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf +# 3) http://www.faqs.org/rfcs/rfc3602.html +#------------------------------------------------------------------------------ + +package Image::ExifTool::AES; + +use strict; +use vars qw($VERSION @ISA @EXPORT_OK); +require Exporter; + +$VERSION = '1.01'; +@ISA = qw(Exporter); +@EXPORT_OK = qw(Crypt); + +my $seeded; # flag set if we already seeded random number generator +my $nr; # number of rounds in AES cipher +my @cbc; # cipher-block chaining bytes + +# arrays (all unsigned character) to hold intermediate results during encryption +my @state = ([],[],[],[]); # the 2-dimensional state array +my @RoundKey; # round keys + +my @sbox = ( + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16, +); + +# reverse sbox +my @rsbox = ( + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d, +); + +# the round constant word array, $rcon[i], contains the values given by +# x to the power (i-1) being powers of x (x is denoted as {02}) in the field GF(2^8) +# Note that i starts at 1, not 0). +my @rcon = ( + 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, + 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, + 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, + 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, + 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, + 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, + 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, + 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, + 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, + 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, + 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, + 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, + 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, + 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, + 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, + 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, +); + +#------------------------------------------------------------------------------ +# This function produces 4*($nr+1) round keys. +# The round keys are used in each round to encrypt the states. +# Inputs: 0) key string (must be 16, 24 or 32 bytes long) +sub KeyExpansion($) +{ + my $key = shift; + my @key = unpack 'C*', $key; # convert the key into a byte array + my $nk = int(length($key) / 4); # number of 32-bit words in the key + $nr = $nk + 6; # number of rounds + + # temporary variables (all unsigned characters) + my ($i,@temp); + + # The first round key is the key itself. + for ($i=0; $i<$nk; ++$i) { + @RoundKey[$i*4..$i*4+3] = @key[$i*4..$i*4+3]; + } + # All other round keys are found from the previous round keys. + while ($i < (4 * ($nr+1))) { + + @temp[0..3] = @RoundKey[($i-1)*4..($i-1)*4+3]; + + if ($i % $nk == 0) { + # rotate the 4 bytes in a word to the left once + # [a0,a1,a2,a3] becomes [a1,a2,a3,a0] + @temp[0..3] = @temp[1,2,3,0]; + + # take a four-byte input word and apply the S-box + # to each of the four bytes to produce an output word. + @temp[0..3] = @sbox[@temp[0..3]]; + + $temp[0] = $temp[0] ^ $rcon[$i/$nk]; + + } elsif ($nk > 6 && $i % $nk == 4) { + + @temp[0..3] = @sbox[@temp[0..3]]; + } + $RoundKey[$i*4+0] = $RoundKey[($i-$nk)*4+0] ^ $temp[0]; + $RoundKey[$i*4+1] = $RoundKey[($i-$nk)*4+1] ^ $temp[1]; + $RoundKey[$i*4+2] = $RoundKey[($i-$nk)*4+2] ^ $temp[2]; + $RoundKey[$i*4+3] = $RoundKey[($i-$nk)*4+3] ^ $temp[3]; + ++$i; + } +} + +#------------------------------------------------------------------------------ +# This function adds the round key to state. +# The round key is added to the state by an XOR function. +sub AddRoundKey($) +{ + my $round = shift; + my ($i,$j); + for ($i=0; $i<4; ++$i) { + my $k = $round*16 + $i*4; + for ($j=0; $j<4; ++$j) { + $state[$j][$i] ^= $RoundKey[$k + $j]; + } + } +} + +#------------------------------------------------------------------------------ +# Substitute the values in the state matrix with values in an S-box +sub SubBytes() +{ + my $i; + for ($i=0; $i<4; ++$i) { + @{$state[$i]}[0..3] = @sbox[@{$state[$i]}[0..3]]; + } +} + +sub InvSubBytes() +{ + my $i; + for ($i=0; $i<4; ++$i) { + @{$state[$i]}[0..3] = @rsbox[@{$state[$i]}[0..3]]; + } +} + +#------------------------------------------------------------------------------ +# Shift the rows in the state to the left. +# Each row is shifted with different offset. +# Offset = Row number. So the first row is not shifted. +sub ShiftRows() +{ + # rotate first row 1 columns to left + @{$state[1]}[0,1,2,3] = @{$state[1]}[1,2,3,0]; + + # rotate second row 2 columns to left + @{$state[2]}[0,1,2,3] = @{$state[2]}[2,3,0,1]; + + # rotate third row 3 columns to left + @{$state[3]}[0,1,2,3] = @{$state[3]}[3,0,1,2]; +} + +sub InvShiftRows() +{ + # rotate first row 1 columns to right + @{$state[1]}[0,1,2,3] = @{$state[1]}[3,0,1,2]; + + # rotate second row 2 columns to right + @{$state[2]}[0,1,2,3] = @{$state[2]}[2,3,0,1]; + + # rotate third row 3 columns to right + @{$state[3]}[0,1,2,3] = @{$state[3]}[1,2,3,0]; +} + +#------------------------------------------------------------------------------ +# Find the product of {02} and the argument to xtime modulo 0x1b +# Note: returns an integer which may need to be trimmed to 8 bits +sub xtime($) +{ + return ($_[0]<<1) ^ ((($_[0]>>7) & 1) * 0x1b); +} + +#------------------------------------------------------------------------------ +# Multiply numbers in the field GF(2^8) +sub Mult($$) +{ + my ($x, $y) = @_; + return (($y & 1) * $x) ^ + (($y>>1 & 1) * xtime($x)) ^ + (($y>>2 & 1) * xtime(xtime($x))) ^ + (($y>>3 & 1) * xtime(xtime(xtime($x)))) ^ + (($y>>4 & 1) * xtime(xtime(xtime(xtime($x))))); +} + +#------------------------------------------------------------------------------ +# Mix the columns of the state matrix +sub MixColumns() +{ + my ($i,$t0,$t1,$t2); + for ($i=0; $i<4; ++$i) { + $t0 = $state[0][$i]; + $t2 = $state[0][$i] ^ $state[1][$i] ^ $state[2][$i] ^ $state[3][$i]; + $t1 = $state[0][$i] ^ $state[1][$i] ; $t1 = xtime($t1) & 0xff; $state[0][$i] ^= $t1 ^ $t2 ; + $t1 = $state[1][$i] ^ $state[2][$i] ; $t1 = xtime($t1) & 0xff; $state[1][$i] ^= $t1 ^ $t2 ; + $t1 = $state[2][$i] ^ $state[3][$i] ; $t1 = xtime($t1) & 0xff; $state[2][$i] ^= $t1 ^ $t2 ; + $t1 = $state[3][$i] ^ $t0 ; $t1 = xtime($t1) & 0xff; $state[3][$i] ^= $t1 ^ $t2 ; + } +} + +sub InvMixColumns() +{ + my $i; + for ($i=0; $i<4; ++$i) { + my $a = $state[0][$i]; + my $b = $state[1][$i]; + my $c = $state[2][$i]; + my $d = $state[3][$i]; + $state[0][$i] = (Mult($a,0x0e) ^ Mult($b,0x0b) ^ Mult($c,0x0d) ^ Mult($d,0x09)) & 0xff; + $state[1][$i] = (Mult($a,0x09) ^ Mult($b,0x0e) ^ Mult($c,0x0b) ^ Mult($d,0x0d)) & 0xff; + $state[2][$i] = (Mult($a,0x0d) ^ Mult($b,0x09) ^ Mult($c,0x0e) ^ Mult($d,0x0b)) & 0xff; + $state[3][$i] = (Mult($a,0x0b) ^ Mult($b,0x0d) ^ Mult($c,0x09) ^ Mult($d,0x0e)) & 0xff; + } +} + +#------------------------------------------------------------------------------ +# Encrypt (Cipher) or decrypt (InvCipher) a block of data with CBC +# Inputs: 0) string to cipher (must be 16 bytes long) +# Returns: cipher'd string +sub Cipher($) +{ + my @in = unpack 'C*', $_[0]; # unpack input plaintext + my ($i, $j, $round); + + # copy the input PlainText to state array and apply the CBC + for ($i=0; $i<4; ++$i) { + for ($j=0; $j<4; ++$j) { + my $k = $i*4 + $j; + $state[$j][$i] = $in[$k] ^ $cbc[$k]; + } + } + + # add the First round key to the state before starting the rounds + AddRoundKey(0); + + # there will be $nr rounds; the first $nr-1 rounds are identical + for ($round=1; ; ++$round) { + SubBytes(); + ShiftRows(); + if ($round < $nr) { + MixColumns(); + AddRoundKey($round); + } else { + # MixColumns() is not used in the last round + AddRoundKey($nr); + last; + } + } + + # the encryption process is over + # copy the state array to output array (and save for CBC) + for ($i=0; $i<4; ++$i) { + for ($j=0; $j<4; ++$j) { + $cbc[$i*4+$j] = $state[$j][$i]; + } + } + return pack 'C*', @cbc; # return packed ciphertext +} + +sub InvCipher($) +{ + my @in = unpack 'C*', $_[0]; # unpack input ciphertext + my (@out, $i, $j, $round); + + # copy the input CipherText to state array + for ($i=0; $i<4; ++$i) { + for ($j=0; $j<4; ++$j) { + $state[$j][$i] = $in[$i*4 + $j]; + } + } + + # add the First round key to the state before starting the rounds + AddRoundKey($nr); + + # there will be $nr rounds; the first $nr-1 rounds are identical + for ($round=$nr-1; ; --$round) { + InvShiftRows(); + InvSubBytes(); + AddRoundKey($round); + # InvMixColumns() is not used in the last round + last if $round <= 0; + InvMixColumns(); + } + + # copy the state array to output array and reverse the CBC + for ($i=0; $i<4; ++$i) { + for ($j=0; $j<4; ++$j) { + my $k = $i*4 + $j; + $out[$k] = $state[$j][$i] ^ $cbc[$k]; + } + } + @cbc = @in; # update CBC for next block + return pack 'C*', @out; # return packed plaintext +} + +#------------------------------------------------------------------------------ +# Encrypt/Decrypt using AES-CBC algorithm (with fixed 16-byte blocks) +# Inputs: 0) data reference (with leading 16-byte initialization vector when decrypting) +# 1) encryption key (16, 24 or 32 bytes for AES-128, AES-192 or AES-256) +# 2) encrypt flag (false for decryption, true with length 16 bytes to +# encrypt using this as the CBC IV, or true with other length to +# encrypt with a randomly-generated IV) +# 3) flag to disable padding +# Returns: error string, or undef on success +# Notes: encrypts/decrypts data in place (encrypted data returned with leading IV) +sub Crypt($$;$$) +{ + my ($dataPt, $key, $encrypt, $noPad) = @_; + + # validate key length + my $keyLen = length $key; + unless ($keyLen == 16 or $keyLen == 24 or $keyLen == 32) { + return "Invalid AES key length ($keyLen)"; + } + my $partLen = length($$dataPt) % 16; + my ($pos, $i); + if ($encrypt) { + if (length($encrypt) == 16) { + @cbc = unpack 'C*', $encrypt; + } else { + # generate a random 16-byte CBC initialization vector + unless ($seeded) { + srand(time() & ($$ + ($$<<15))); + $seeded = 1; + } + for ($i=0; $i<16; ++$i) { + $cbc[$i] = int(rand(256)); + } + $encrypt = pack 'C*', @cbc; + } + $$dataPt = $encrypt . $$dataPt; # add IV to the start of the data + # add required padding so we can recover the + # original string length after decryption + # (padding bytes have value set to padding length) + my $padLen = 16 - $partLen; + $$dataPt .= (chr($padLen)) x $padLen unless $padLen == 16 and $noPad; + $pos = 16; # start encrypting at byte 16 (after the IV) + } elsif ($partLen) { + return 'Invalid AES ciphertext length'; + } elsif (length $$dataPt >= 32) { + # take the CBC initialization vector from the start of the data + @cbc = unpack 'C16', $$dataPt; + $$dataPt = substr($$dataPt, 16); + $pos = 0; # start decrypting from byte 0 (now that IV is removed) + } else { + $$dataPt = ''; # empty text + return undef; + } + # the KeyExpansion routine must be called before encryption + KeyExpansion($key); + + # loop through the data and convert in blocks + my $dataLen = length $$dataPt; + my $last = $dataLen - 16; + my $func = $encrypt ? \&Cipher : \&InvCipher; + while ($pos <= $last) { + # cipher this block + substr($$dataPt, $pos, 16) = &$func(substr($$dataPt, $pos, 16)); + $pos += 16; + } + unless ($encrypt or $noPad) { + # remove padding if necessary (padding byte value gives length of padding) + my $padLen = ord(substr($$dataPt, -1, 1)); + return 'AES decryption error (invalid pad byte)' if $padLen > 16; + $$dataPt = substr($$dataPt, 0, $dataLen - $padLen); + } + return undef; +} + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::AES - AES encryption with cipher-block chaining + +=head1 SYNOPSIS + + use Image::ExifTool::AES qw(Crypt); + + $err = Crypt(\$plaintext, $key, 1); # encryption + + $err = Crypt(\$ciphertext, $key); # decryption + +=head1 DESCRIPTION + +This module contains an implementation of the AES encryption/decryption +algorithms with cipher-block chaining (CBC) and RFC 2898 PKCS #5 padding. +This is the AESV2 and AESV3 encryption mode used in PDF documents. + +=head1 EXPORTS + +Exports nothing by default, but L may be exported. + +=head1 METHODS + +=head2 Crypt + +Implement AES encryption/decryption with cipher-block chaining. + +=over 4 + +=item Inputs: + +0) Scalar reference for data to encrypt/decrypt. + +1) Encryption key string (must have length 16, 24 or 32). + +2) [optional] Encrypt flag (false to decrypt). + +3) [optional] Flag to avoid removing padding after decrypting, or to avoid +adding 16 bytes of padding before encrypting when data length is already a +multiple of 16 bytes. + +=item Returns: + +On success, the return value is undefined and the data is encrypted or +decrypted as specified. Otherwise returns an error string and the data is +left in an indeterminate state. + +=item Notes: + +The length of the encryption key dictates the AES mode, with lengths of 16, +24 and 32 bytes resulting in AES-128, AES-192 and AES-256. + +When encrypting, the input data may be any length and will be padded to an +even 16-byte block size using the specified padding technique. If the +encrypt flag has length 16, it is used as the initialization vector for +the cipher-block chaining, otherwise a random IV is generated. Upon +successful return the data will be encrypted, with the first 16 bytes of +the data being the CBC IV. + +When decrypting, the input data begins with the 16-byte CBC initialization +vector. + +=back + +=head1 BUGS + +This code is blindingly slow. But in truth, slowing down processing is the +main purpose of encryption, so this really can't be considered a bug. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L + +=item L + +=item L + +=back + +=head1 SEE ALSO + +L + +=cut diff --git a/lib/Image/ExifTool/AFCP.pm b/lib/Image/ExifTool/AFCP.pm new file mode 100644 index 0000000..dcd89ca --- /dev/null +++ b/lib/Image/ExifTool/AFCP.pm @@ -0,0 +1,281 @@ +#------------------------------------------------------------------------------ +# File: AFCP.pm +# +# Description: Read/write AFCP trailer +# +# Revisions: 12/26/2005 - P. Harvey Created +# +# References: 1) http://web.archive.org/web/20080828211305/http://www.tocarte.com/media/axs_afcp_spec.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::AFCP; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.08'; + +sub ProcessAFCP($$); + +%Image::ExifTool::AFCP::Main = ( + PROCESS_PROC => \&ProcessAFCP, + NOTES => q{ +AFCP stands for AXS File Concatenation Protocol, and is a poorly designed +protocol for appending information to the end of files. This can be used as +an auxiliary technique to store IPTC information in images, but is +incompatible with some file formats. + +ExifTool will read and write (but not create) AFCP IPTC information in JPEG +and TIFF images. + +See +L +for the AFCP specification. + }, + IPTC => { SubDirectory => { TagTable => 'Image::ExifTool::IPTC::Main' } }, + TEXT => 'Text', + Nail => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + # (the specification allows for a variable amount of padding before + # the image after a 10-byte header, so look for the JPEG SOI marker, + # otherwise assume a fixed 8 bytes of padding) + RawConv => q{ + pos($val) = 10; + my $start = ($val =~ /\xff\xd8\xff/g) ? pos($val) - 3 : 18; + my $img = substr($val, $start); + return $self->ValidateImage(\$img, $tag); + }, + }, + PrVw => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + RawConv => q{ + pos($val) = 10; + my $start = ($val =~ /\xff\xd8\xff/g) ? pos($val) - 3 : 18; + my $img = substr($val, $start); + return $self->ValidateImage(\$img, $tag); + }, + }, +); + +#------------------------------------------------------------------------------ +# Read/write AFCP information in a file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# (Set 'ScanForAFCP' member in dirInfo to scan from current position for AFCP) +# Returns: 1 on success, 0 if this file didn't contain AFCP information +# -1 on write error or if the offsets were incorrect on reading +# - updates DataPos to point to actual AFCP start if ScanForAFCP is set +# - updates DirLen to trailer length +# - returns Fixup reference in dirInfo hash when writing +sub ProcessAFCP($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $curPos = $raf->Tell(); + my $offset = $$dirInfo{Offset} || 0; # offset from end of file + my $rtnVal = 0; + +NoAFCP: for (;;) { + my ($buff, $fix, $dirBuff, $valBuff, $fixup, $vers); + # look for AXS trailer + last unless $raf->Seek(-12-$offset, 2) and + $raf->Read($buff, 12) == 12 and + $buff =~ /^(AXS(!|\*))/; + my $endPos = $raf->Tell(); + my $hdr = $1; + SetByteOrder($2 eq '!' ? 'MM' : 'II'); + my $startPos = Get32u(\$buff, 4); + if ($raf->Seek($startPos, 0) and $raf->Read($buff, 12) == 12 and $buff =~ /^$hdr/) { + $fix = 0; + } else { + $rtnVal = -1; + # look for start of AXS trailer if 'ScanForAFCP' + last unless $$dirInfo{ScanForAFCP} and $raf->Seek($curPos, 0); + my $actualPos = $curPos; + # first look for header right at current position + for (;;) { + last if $raf->Read($buff, 12) == 12 and $buff =~ /^$hdr/; + last NoAFCP if $actualPos != $curPos; + # scan for AXS header (could be after preview image) + for (;;) { + my $buf2; + $raf->Read($buf2, 65536) or last NoAFCP; + $buff .= $buf2; + if ($buff =~ /$hdr/g) { + $actualPos += pos($buff) - length($hdr); + last; # ok, now go back and re-read header + } + $buf2 = substr($buf2, -3); # only need last 3 bytes for next test + $actualPos += length($buff) - length($buf2); + $buff = $buf2; + } + last unless $raf->Seek($actualPos, 0); # seek to start of AFCP + } + # calculate shift for fixing AFCP offsets + $fix = $actualPos - $startPos; + } + # set variables returned in dirInfo hash + $$dirInfo{DataPos} = $startPos + $fix; # actual start position + $$dirInfo{DirLen} = $endPos - ($startPos + $fix); + + $rtnVal = 1; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my $outfile = $$dirInfo{OutFile}; + if ($outfile) { + # allow all AFCP information to be deleted + if ($$et{DEL_GROUP}{AFCP}) { + $verbose and print $out " Deleting AFCP\n"; + ++$$et{CHANGED}; + last; + } + $dirBuff = $valBuff = ''; + require Image::ExifTool::Fixup; + $fixup = $$dirInfo{Fixup}; + $fixup or $fixup = $$dirInfo{Fixup} = new Image::ExifTool::Fixup; + $vers = substr($buff, 4, 2); # get version number + } else { + $et->DumpTrailer($dirInfo) if $verbose or $$et{HTML_DUMP}; + } + # read AFCP directory data + my $numEntries = Get16u(\$buff, 6); + my $dir; + unless ($raf->Read($dir, 12 * $numEntries) == 12 * $numEntries) { + $et->Error('Error reading AFCP directory', 1); + last; + } + if ($verbose > 2 and not $outfile) { + my $dat = $buff . $dir; + print $out " AFCP Directory:\n"; + $et->VerboseDump(\$dat, Addr => $$dirInfo{DataPos}, Width => 12); + } + $fix and $et->Warn("Adjusted AFCP offsets by $fix", 1); +# +# process AFCP directory +# + my $tagTablePtr = GetTagTable('Image::ExifTool::AFCP::Main'); + my ($index, $entry); + for ($index=0; $index<$numEntries; ++$index) { + my $entry = 12 * $index; + my $tag = substr($dir, $entry, 4); + my $size = Get32u(\$dir, $entry + 4); + my $offset = Get32u(\$dir, $entry + 8); + if ($size < 0x80000000 and + $raf->Seek($offset+$fix, 0) and + $raf->Read($buff, $size) == $size) + { + if ($outfile) { + # rewrite this information + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($tagInfo and $$tagInfo{SubDirectory}) { + my %subdirInfo = ( + DataPt => \$buff, + DirStart => 0, + DirLen => $size, + DataPos => $offset + $fix, + Parent => 'AFCP', + ); + my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + my $newDir = $et->WriteDirectory(\%subdirInfo, $subTable); + if (defined $newDir) { + $size = length $newDir; + $buff = $newDir; + } + } + $fixup->AddFixup(length($dirBuff) + 8); + $dirBuff .= $tag . Set32u($size) . Set32u(length $valBuff); + $valBuff .= $buff; + } else { + # extract information + $et->HandleTag($tagTablePtr, $tag, $buff, + DataPt => \$buff, + Size => $size, + Index => $index, + DataPos => $offset + $fix, + ); + } + } else { + $et->Warn("Bad AFCP directory"); + $rtnVal = -1 if $outfile; + last; + } + } + if ($outfile and length($dirBuff)) { + my $outPos = Tell($outfile); # get current outfile position + # apply fixup to directory pointers + my $valPos = $outPos + 12; # start of value data + $fixup->{Shift} += $valPos + length($dirBuff); + $fixup->ApplyFixup(\$dirBuff); + # write the AFCP header, directory, value data and EOF record (with zero checksums) + Write($outfile, $hdr, $vers, Set16u(length($dirBuff)/12), Set32u(0), + $dirBuff, $valBuff, $hdr, Set32u($outPos), Set32u(0)) or $rtnVal = -1; + # complete fixup so the calling routine can apply further shifts + $fixup->AddFixup(length($dirBuff) + length($valBuff) + 4); + $fixup->{Start} += $valPos; + $fixup->{Shift} -= $valPos; + } + last; + } + return $rtnVal; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::AFCP - Read/write AFCP trailer + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract +information from the AFCP trailer. Although the AFCP specification is +compatible with various file formats, ExifTool currently only processes AFCP +in JPEG images. + +=head1 NOTES + +AFCP is a specification which allows meta information (including IPTC) to be +appended to the end of a file. + +It is a poorly designed protocol because (like TIFF) it uses absolute +offsets to specify data locations. This is a huge blunder because it makes +the AFCP information dependent on the file length, so it is easily +invalidated by image editing software which doesn't recognize the AFCP +trailer to fix up these offsets when the file length changes. ExifTool will +attempt to fix these invalid offsets if possible. + +Scanning for AFCP information may be time consuming, especially when reading +from a sequential device, since the information is at the end of the file. +In these instances, the ExifTool FastScan option may be used to disable +scanning for AFCP information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L + +=back + +=head1 SEE ALSO + +L, +L + +=cut + diff --git a/lib/Image/ExifTool/AIFF.pm b/lib/Image/ExifTool/AIFF.pm new file mode 100644 index 0000000..3fe6c4a --- /dev/null +++ b/lib/Image/ExifTool/AIFF.pm @@ -0,0 +1,312 @@ +#------------------------------------------------------------------------------ +# File: AIFF.pm +# +# Description: Read AIFF meta information +# +# Revisions: 01/06/2006 - P. Harvey Created +# 09/22/2008 - PH Added DjVu support +# +# References: 1) http://developer.apple.com/documentation/QuickTime/INMAC/SOUND/imsoundmgr.30.htm#pgfId=3190 +# 2) http://astronomy.swin.edu.au/~pbourke/dataformats/aiff/ +# 3) http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::AIFF; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::ID3; + +$VERSION = '1.11'; + +# information for time/date-based tags (time zero is Jan 1, 1904) +my %timeInfo = ( + Groups => { 2 => 'Time' }, + ValueConv => 'ConvertUnixTime($val - ((66 * 365 + 17) * 24 * 3600))', + PrintConv => '$self->ConvertDateTime($val)', +); + +# AIFF info +%Image::ExifTool::AIFF::Main = ( + GROUPS => { 2 => 'Audio' }, + NOTES => q{ + Tags extracted from Audio Interchange File Format (AIFF) files. See + L for + the AIFF specification. + }, +# FORM => 'Format', + FVER => { + Name => 'FormatVersion', + SubDirectory => { TagTable => 'Image::ExifTool::AIFF::FormatVers' }, + }, + COMM => { + Name => 'Common', + SubDirectory => { TagTable => 'Image::ExifTool::AIFF::Common' }, + }, + COMT => { + Name => 'Comment', + SubDirectory => { TagTable => 'Image::ExifTool::AIFF::Comment' }, + }, + NAME => { + Name => 'Name', + ValueConv => '$self->Decode($val, "MacRoman")', + }, + AUTH => { + Name => 'Author', + Groups => { 2 => 'Author' }, + ValueConv => '$self->Decode($val, "MacRoman")', + }, + '(c) ' => { + Name => 'Copyright', + Groups => { 2 => 'Author' }, + ValueConv => '$self->Decode($val, "MacRoman")', + }, + ANNO => { + Name => 'Annotation', + ValueConv => '$self->Decode($val, "MacRoman")', + }, + 'ID3 ' => { + Name => 'ID3', + SubDirectory => { + TagTable => 'Image::ExifTool::ID3::Main', + ProcessProc => \&Image::ExifTool::ID3::ProcessID3, + }, + }, + APPL => 'ApplicationData', # (first 4 bytes are the application signature) +# SSND => 'SoundData', +# MARK => 'Marker', +# INST => 'Instrument', +# MIDI => 'MidiData', +# AESD => 'AudioRecording', +); + +%Image::ExifTool::AIFF::Common = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + FORMAT => 'int16u', + 0 => 'NumChannels', + 1 => { Name => 'NumSampleFrames', Format => 'int32u' }, + 3 => 'SampleSize', + 4 => { Name => 'SampleRate', Format => 'extended' }, #3 + 9 => { + Name => 'CompressionType', + Format => 'string[4]', + PrintConv => { + NONE => 'None', + ACE2 => 'ACE 2-to-1', + ACE8 => 'ACE 8-to-3', + MAC3 => 'MAC 3-to-1', + MAC6 => 'MAC 6-to-1', + sowt => 'Little-endian, no compression', + alaw => 'a-law', + ALAW => 'A-law', + ulaw => 'mu-law', + ULAW => 'Mu-law', + 'GSM '=> 'GSM', + G722 => 'G722', + G726 => 'G726', + G728 => 'G728', + }, + }, + 11 => { #PH + Name => 'CompressorName', + Format => 'pstring', + ValueConv => '$self->Decode($val, "MacRoman")', + }, +); + +%Image::ExifTool::AIFF::FormatVers = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int32u', + 0 => { Name => 'FormatVersionTime', %timeInfo }, +); + +%Image::ExifTool::AIFF::Comment = ( + PROCESS_PROC => \&Image::ExifTool::AIFF::ProcessComment, + GROUPS => { 2 => 'Audio' }, + 0 => { Name => 'CommentTime', %timeInfo }, + 1 => 'MarkerID', + 2 => { + Name => 'Comment', + ValueConv => '$self->Decode($val, "MacRoman")', + }, +); + +%Image::ExifTool::AIFF::Composite = ( + Duration => { + Require => { + 0 => 'AIFF:SampleRate', + 1 => 'AIFF:NumSampleFrames', + }, + RawConv => '($val[0] and $val[1]) ? $val[1] / $val[0] : undef', + PrintConv => 'ConvertDuration($val)', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::AIFF'); + + +#------------------------------------------------------------------------------ +# Process AIFF Comment chunk +# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref +# Returns: 1 on success +sub ProcessComment($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + my $verbose = $et->Options('Verbose'); + return 0 unless $dirLen > 2; + my $numComments = unpack('n',$$dataPt); + my $pos = 2; + my $i; + $verbose and $et->VerboseDir('Comment', $numComments); + for ($i=0; $i<$numComments; ++$i) { + last if $pos + 8 > $dirLen; + my ($time, $markerID, $size) = unpack("x${pos}Nnn", $$dataPt); + $et->HandleTag($tagTablePtr, 0, $time); + $et->HandleTag($tagTablePtr, 1, $markerID) if $markerID; + $pos += 8; + last if $pos + $size > $dirLen; + my $val = substr($$dataPt, $pos, $size); + $et->HandleTag($tagTablePtr, 2, $val); + ++$size if $size & 0x01; # account for padding byte if necessary + $pos += $size; + } +} + +#------------------------------------------------------------------------------ +# Extract information from a AIFF file +# Inputs: 0) ExifTool object reference, 1) DirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid AIFF file +sub ProcessAIFF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $err, $tagTablePtr, $page, $type, $n); + + # verify this is a valid AIFF file + return 0 unless $raf->Read($buff, 12) == 12; + my $fast3 = $$et{OPTIONS}{FastScan} && $$et{OPTIONS}{FastScan} == 3; + my $pos = 12; + # check for DjVu image + if ($buff =~ /^AT&TFORM/) { + # http://www.djvu.org/ + # http://djvu.sourceforge.net/specs/djvu3changes.txt + my $buf2; + return 0 unless $raf->Read($buf2, 4) == 4 and $buf2 =~ /^(DJVU|DJVM)/; + $pos += 4; + $buff = substr($buff, 4) . $buf2; + $et->SetFileType('DJVU'); + return 1 if $fast3; + $tagTablePtr = GetTagTable('Image::ExifTool::DjVu::Main'); + # modify FileType to indicate a multi-page document + $$et{VALUE}{FileType} .= " (multi-page)" if $buf2 eq 'DJVM'; + $type = 'DjVu'; + } else { + return 0 unless $buff =~ /^FORM....(AIF(F|C))/s; + $et->SetFileType($1); + return 1 if $fast3; + $tagTablePtr = GetTagTable('Image::ExifTool::AIFF::Main'); + $type = 'AIFF'; + } + SetByteOrder('MM'); + my $verbose = $et->Options('Verbose'); +# +# Read through the IFF chunks +# + for ($n=0;;++$n) { + $raf->Read($buff, 8) == 8 or last; + $pos += 8; + my ($tag, $len) = unpack('a4N', $buff); + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + $et->VPrint(0, "AIFF '${tag}' chunk ($len bytes of data): ", $raf->Tell(),"\n"); + # AIFF chunks are padded to an even number of bytes + my $len2 = $len + ($len & 0x01); + if ($len2 > 100000000) { + if ($len2 >= 0x80000000 and not $et->Options('LargeFileSupport')) { + $et->Warn('End of processing at large chunk (LargeFileSupport not enabled)'); + last; + } + if ($tagInfo) { + $et->Warn("Skipping large $$tagInfo{Name} chunk (> 100 MB)"); + undef $tagInfo; + } + } + if ($tagInfo) { + if ($$tagInfo{TypeOnly}) { + $len = $len2 = 4; + $page = ($page || 0) + 1; + $et->VPrint(0, $$et{INDENT} . "Page $page:\n"); + } + $raf->Read($buff, $len2) >= $len or $err=1, last; + unless ($$tagInfo{SubDirectory} or $$tagInfo{Binary}) { + $buff =~ s/\0+$//; # remove trailing nulls + } + $et->HandleTag($tagTablePtr, $tag, $buff, + DataPt => \$buff, + DataPos => $pos, + Start => 0, + Size => $len, + ); + } elsif (not $len) { + next if ++$n < 100; + $et->Warn('Aborting scan. Too many empty chunks'); + last; + } elsif ($verbose > 2 and $len2 < 1024000) { + $raf->Read($buff, $len2) == $len2 or $err = 1, last; + $et->VerboseDump(\$buff); + } else { + $raf->Seek($len2, 1) or $err=1, last; + } + $pos += $len2; + $n = 0; + } + $err and $et->Warn("Error reading $type file (corrupted?)"); + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::AIFF - Read AIFF meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to extract +information from AIFF (Audio Interchange File Format) audio files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L + +=item L + +=item L + +=back + +=head1 SEE ALSO + +L, +L + +=cut diff --git a/lib/Image/ExifTool/APE.pm b/lib/Image/ExifTool/APE.pm new file mode 100644 index 0000000..ac60379 --- /dev/null +++ b/lib/Image/ExifTool/APE.pm @@ -0,0 +1,287 @@ +#------------------------------------------------------------------------------ +# File: APE.pm +# +# Description: Read Monkey's Audio meta information +# +# Revisions: 11/13/2006 - P. Harvey Created +# +# References: 1) http://www.monkeysaudio.com/ +# 2) http://www.personal.uni-jena.de/~pfk/mpp/sv8/apetag.html +#------------------------------------------------------------------------------ + +package Image::ExifTool::APE; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.06'; + +# APE metadata blocks +%Image::ExifTool::APE::Main = ( + GROUPS => { 2 => 'Audio' }, + NOTES => q{ + Tags found in Monkey's Audio (APE) information. Only a few common tags are + listed below, but ExifTool will extract any tag found. ExifTool supports + APEv1 and APEv2 tags, as well as ID3 information in APE files, and will also + read APE metadata from MP3 and MPC files. + }, + Album => { }, + Artist => { }, + Genre => { }, + Title => { }, + Track => { }, + Year => { }, + DURATION => { + Name => 'Duration', + ValueConv => '$val += 4294967296 if $val < 0 and $val >= -2147483648; $val * 1e-7', + PrintConv => 'ConvertDuration($val)', + }, + 'Tool Version' => { Name => 'ToolVersion' }, + 'Tool Name' => { Name => 'ToolName' }, +); + +# APE MAC header version 3.97 or earlier +%Image::ExifTool::APE::OldHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 1 => 'MAC', 2 => 'Audio' }, + FORMAT => 'int16u', + NOTES => 'APE MAC audio header for version 3.97 or earlier.', + 0 => { + Name => 'APEVersion', + ValueConv => '$val / 1000', + }, + 1 => 'CompressionLevel', + # 2 => 'FormatFlags', + 3 => 'Channels', + 4 => { Name => 'SampleRate', Format => 'int32u' }, + # 6 => { Name => 'HeaderBytes', Format => 'int32u' }, # WAV header bytes + # 8 => { Name => 'TerminatingBytes', Format => 'int32u' }, + 10 => { Name => 'TotalFrames', Format => 'int32u' }, + 12 => { Name => 'FinalFrameBlocks', Format => 'int32u' }, +); + +# APE MAC header version 3.98 or later +%Image::ExifTool::APE::NewHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 1 => 'MAC', 2 => 'Audio' }, + FORMAT => 'int16u', + NOTES => 'APE MAC audio header for version 3.98 or later.', + 0 => 'CompressionLevel', + # 1 => 'FormatFlags', + 2 => { Name => 'BlocksPerFrame', Format => 'int32u' }, + 4 => { Name => 'FinalFrameBlocks', Format => 'int32u' }, + 6 => { Name => 'TotalFrames', Format => 'int32u' }, + 8 => 'BitsPerSample', + 9 => 'Channels', + 10 => { Name => 'SampleRate', Format => 'int32u' }, +); + +# APE Composite tags +%Image::ExifTool::APE::Composite = ( + GROUPS => { 2 => 'Audio' }, + Duration => { + Require => { + 0 => 'APE:SampleRate', + 1 => 'APE:TotalFrames', + 2 => 'APE:BlocksPerFrame', + 3 => 'APE:FinalFrameBlocks', + }, + RawConv => '($val[0] && $val[1]) ? (($val[1] - 1) * $val[2] + $val[3]) / $val[0]: undef', + PrintConv => 'ConvertDuration($val)', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::APE'); + +#------------------------------------------------------------------------------ +# Make tag info hash for specified tag +# Inputs: 0) tag name, 1) tag table ref +# - must only call if tag doesn't exist +sub MakeTag($$) +{ + my ($tag, $tagTablePtr) = @_; + my $name = ucfirst(lc($tag)); + # remove invalid characters in tag name and capitalize following letters + $name =~ s/[^\w-]+(.?)/\U$1/sg; + $name =~ s/([a-z0-9])_([a-z])/$1\U$2/g; + my %tagInfo = ( Name => $name ); + $tagInfo{Groups} = { 2 => 'Preview' } if $tag =~ /^Cover Art/ and $tag !~ /Desc$/; + AddTagToTable($tagTablePtr, $tag, \%tagInfo); +} + +#------------------------------------------------------------------------------ +# Extract information from an APE file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# - Just looks for APE trailer if FileType is already set +# Returns: 1 on success, 0 if this wasn't a valid APE file +sub ProcessAPE($$) +{ + my ($et, $dirInfo) = @_; + + # must first check for leading/trailing ID3 information + unless ($$et{DoneID3}) { + require Image::ExifTool::ID3; + Image::ExifTool::ID3::ProcessID3($et, $dirInfo) and return 1; + } + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my ($buff, $i, $header, $tagTablePtr, $dataPos, $oldIndent); + + $$et{DoneAPE} = 1; + + # check APE signature and process audio information + # unless this is some other type of file + unless ($$et{VALUE}{FileType}) { + $raf->Read($buff, 32) == 32 or return 0; + $buff =~ /^(MAC |APETAGEX)/ or return 0; + $et->SetFileType(); + SetByteOrder('II'); + + if ($buff =~ /^APETAGEX/) { + # we already read the APE header + $header = 1; + } else { + # process the MAC header + my $vers = Get16u(\$buff, 4); + my $table; + if ($vers <= 3970) { + $buff = substr($buff, 4); + $table = GetTagTable('Image::ExifTool::APE::OldHeader'); + } else { + my $dlen = Get32u(\$buff, 8); + my $hlen = Get32u(\$buff, 12); + unless ($dlen & 0x80000000 or $hlen & 0x80000000) { + if ($raf->Seek($dlen, 0) and $raf->Read($buff, $hlen) == $hlen) { + $table = GetTagTable('Image::ExifTool::APE::NewHeader'); + } + } + } + $et->ProcessDirectory( { DataPt => \$buff }, $table) if $table; + } + } + # look for APE trailer unless we already found an APE header + unless ($header) { + # look for the APE trailer footer... + my $footPos = -32; + # (...but before the ID3v1 trailer if it exists) + $footPos -= $$et{DoneID3} if $$et{DoneID3} > 1; + $raf->Seek($footPos, 2) or return 1; + $raf->Read($buff, 32) == 32 or return 1; + $buff =~ /^APETAGEX/ or return 1; + SetByteOrder('II'); + } +# +# Read the APE data (we have just read the APE header or footer into $buff) +# + my ($version, $size, $count, $flags) = unpack('x8V4', $buff); + $version /= 1000; + $size -= 32; # get size of data only + if (($size & 0x80000000) == 0 and + ($header or $raf->Seek(-$size-32, 1)) and + $raf->Read($buff, $size) == $size) + { + if ($verbose) { + $oldIndent = $$et{INDENT}; + $$et{INDENT} .= '| '; + $et->VerboseDir("APEv$version", $count, $size); + $et->VerboseDump(\$buff, DataPos => $raf->Tell() - $size); + } + $tagTablePtr = GetTagTable('Image::ExifTool::APE::Main'); + $dataPos = $raf->Tell() - $size; + } else { + $count = -1; + } +# +# Process the APE tags +# + my $pos = 0; + for ($i=0; $i<$count; ++$i) { + # read next APE tag + last if $pos + 8 > $size; + my $len = Get32u(\$buff, $pos); + my $flags = Get32u(\$buff, $pos + 4); + pos($buff) = $pos + 8; + last unless $buff =~ /\G(.*?)\0/sg; + my $tag = $1; + # avoid conflicts with our special table entries + $tag .= '.' if $Image::ExifTool::specialTags{$tag}; + $pos = pos($buff); + last if $pos + $len > $size; + my $val = substr($buff, $pos, $len); + MakeTag($tag, $tagTablePtr) unless $$tagTablePtr{$tag}; + # handle binary-value tags + if (($flags & 0x06) == 0x02) { + my $buf2 = $val; + $val = \$buf2; + # extract cover art description separately (hackitty hack) + if ($tag =~ /^Cover Art/) { + $buf2 =~ s/^([\x20-\x7f]*)\0//; + if ($1) { + my $t = "$tag Desc"; + my $v = $1; + MakeTag($t, $tagTablePtr) unless $$tagTablePtr{$t}; + $et->HandleTag($tagTablePtr, $t, $v); + } + } + } + $et->HandleTag($tagTablePtr, $tag, $val, + Index => $i, + DataPt => \$buff, + DataPos => $dataPos, + Start => $pos, + Size => $len, + ); + $pos += $len; + } + $i == $count or $et->Warn('Bad APE trailer'); + $$et{INDENT} = $oldIndent if defined $oldIndent; + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::APE - Read Monkey's Audio meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from Monkey's Audio (APE) audio files. + +=head1 BUGS + +Currently doesn't parse MAC header unless it is at the start of the file. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L + +=item L + +=back + +=head1 SEE ALSO + +L, +L + +=cut + diff --git a/lib/Image/ExifTool/APP12.pm b/lib/Image/ExifTool/APP12.pm new file mode 100644 index 0000000..d509117 --- /dev/null +++ b/lib/Image/ExifTool/APP12.pm @@ -0,0 +1,322 @@ +#------------------------------------------------------------------------------ +# File: APP12.pm +# +# Description: Read APP12 meta information +# +# Revisions: 10/18/2005 - P. Harvey Created +# +# References: 1) Heinrich Giesen private communication +#------------------------------------------------------------------------------ + +package Image::ExifTool::APP12; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.13'; + +sub ProcessAPP12($$$); +sub ProcessDucky($$$); +sub WriteDucky($$$); + +# APP12 tags (ref PH) +%Image::ExifTool::APP12::PictureInfo = ( + PROCESS_PROC => \&ProcessAPP12, + GROUPS => { 0 => 'APP12', 1 => 'PictureInfo', 2 => 'Image' }, + PRIORITY => 0, + NOTES => q{ + The JPEG APP12 "Picture Info" segment was used by some older cameras, and + contains ASCII-based meta information. Below are some tags which have been + observed Agfa and Polaroid images, however ExifTool will extract information + from any tags found in this segment. + }, + FNumber => { + ValueConv => '$val=~s/^[A-Za-z ]*//;$val', # Agfa leads with an 'F' + PrintConv => 'sprintf("%.1f",$val)', + }, + Aperture => { + PrintConv => 'sprintf("%.1f",$val)', + }, + TimeDate => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + ValueConv => '$val=~/^\d+$/ ? ConvertUnixTime($val) : $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + Shutter => { + Name => 'ExposureTime', + ValueConv => '$val * 1e-6', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + shtr => { + Name => 'ExposureTime', + ValueConv => '$val * 1e-6', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 'Serial#' => { + Name => 'SerialNumber', + Groups => { 2 => 'Camera' }, + }, + Flash => { PrintConv => { 0 => 'Off', 1 => 'On' } }, + Macro => { PrintConv => { 0 => 'Off', 1 => 'On' } }, + StrobeTime => { }, + Ytarget => { Name => 'YTarget' }, + ylevel => { Name => 'YLevel' }, + FocusPos => { }, + FocusMode => { }, + Quality => { }, + ExpBias => 'ExposureCompensation', + FWare => 'FirmwareVersion', + StrobeTime => { }, + Resolution => { }, + Protect => { }, + ConTake => { }, + ImageSize => { PrintConv => '$val=~tr/-/x/;$val' }, + ColorMode => { }, + Zoom => { }, + ZoomPos => { }, + LightS => { }, + Type => { + Name => 'CameraType', + Groups => { 2 => 'Camera' }, + DataMember => 'CameraType', + RawConv => '$self->{CameraType} = $val', + }, + Version => { Groups => { 2 => 'Camera' } }, + ID => { Groups => { 2 => 'Camera' } }, +); + +# APP12 segment written in Photoshop "Save For Web" images +# (from tests with Photoshop 7 files - PH/1) +%Image::ExifTool::APP12::Ducky = ( + PROCESS_PROC => \&ProcessDucky, + WRITE_PROC => \&WriteDucky, + GROUPS => { 0 => 'Ducky', 1 => 'Ducky', 2 => 'Image' }, + WRITABLE => 'string', + NOTES => q{ + Photoshop uses the JPEG APP12 "Ducky" segment to store some information in + "Save for Web" images. + }, + 1 => { #PH + Name => 'Quality', + Priority => 0, + Avoid => 1, + Writable => 'int32u', + ValueConv => 'unpack("N",$val)', # 4-byte integer + ValueConvInv => 'pack("N",$val)', + PrintConv => '"$val%"', + PrintConvInv => '$val=~/(\d+)/ ? $1 : undef', + }, + 2 => { #1 + Name => 'Comment', + Priority => 0, + Avoid => 1, + # (ignore 4-byte character count at start of value) + ValueConv => '$self->Decode(substr($val,4),"UCS2","MM")', + ValueConvInv => 'pack("N",length $val) . $self->Encode($val,"UCS2","MM")', + }, + 3 => { #PH + Name => 'Copyright', + Priority => 0, + Avoid => 1, + Groups => { 2 => 'Author' }, + # (ignore 4-byte character count at start of value) + ValueConv => '$self->Decode(substr($val,4),"UCS2","MM")', + ValueConvInv => 'pack("N",length $val) . $self->Encode($val,"UCS2","MM")', + }, +); + +#------------------------------------------------------------------------------ +# Write APP12 Ducky segment +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: New directory data or undefined on error +sub WriteDucky($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to autoload this package + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $newTags = $et->GetNewTagInfoHash($tagTablePtr); + my @addTags = sort { $a <=> $b } keys(%$newTags); + my ($dirEnd, %doneTags); + if ($dataPt) { + $dirEnd = $pos + $$dirInfo{DirLen}; + } else { + my $tmp = ''; + $dataPt = \$tmp; + $pos = $dirEnd = 0; + } + my $newData = ''; + SetByteOrder('MM'); + # process all data blocks in Ducky segment + for (;;) { + my ($tag, $len, $val); + if ($pos + 4 <= $dirEnd) { + $tag = Get16u($dataPt, $pos); + $len = Get16u($dataPt, $pos + 2); + $pos += 4; + if ($pos + $len > $dirEnd) { + $et->Warn('Invalid Ducky block length'); + return undef; + } + $val = substr($$dataPt, $pos, $len); + $pos += $len; + } else { + last unless @addTags; + $tag = pop @addTags; + next if $doneTags{$tag}; + } + $doneTags{$tag} = 1; + my $tagInfo = $$newTags{$tag}; + if ($tagInfo) { + my $nvHash = $et->GetNewValueHash($tagInfo); + my $isNew; + if (defined $val) { + if ($et->IsOverwriting($nvHash, $val)) { + $et->VerboseValue("- Ducky:$$tagInfo{Name}", $val); + $isNew = 1; + } + } else { + next unless $$nvHash{IsCreating}; + $isNew = 1; + } + if ($isNew) { + $val = $et->GetNewValue($nvHash); + ++$$et{CHANGED}; + next unless defined $val; # next if tag is being deleted + $et->VerboseValue("+ Ducky:$$tagInfo{Name}", $val); + } + } + $newData .= pack('nn', $tag, length $val) . $val; + } + $newData .= "\0\0" if length $newData; + return $newData; +} + +#------------------------------------------------------------------------------ +# Process APP12 Ducky segment (ref PH) +# Inputs: 0) ExifTool object reference, 1) Directory information ref, 2) tag table ref +# Returns: 1 on success, 0 if this wasn't a recognized Ducky segment +# Notes: This segment has the following format: +# 1) 5 bytes: "Ducky" +# 2) multiple data blocks (all integers are big endian): +# a) 2 bytes: block type (0=end, 1=Quality, 2=Comment, 3=Copyright) +# b) 2 bytes: block length (N) +# c) N bytes: block data +sub ProcessDucky($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $dirEnd = $pos + $$dirInfo{DirLen}; + SetByteOrder('MM'); + # process all data blocks in Ducky segment + for (;;) { + last if $pos + 4 > $dirEnd; + my $tag = Get16u($dataPt, $pos); + my $len = Get16u($dataPt, $pos + 2); + $pos += 4; + if ($pos + $len > $dirEnd) { + $et->Warn('Invalid Ducky block length'); + last; + } + my $val = substr($$dataPt, $pos, $len); + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + Start => $pos, + Size => $len, + ); + $pos += $len; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process APP12 Picture Info segment (ref PH) +# Inputs: 0) ExifTool object reference, 1) Directory information ref, 2) tag table ref +# Returns: 1 on success, 0 if this wasn't a recognized APP12 +sub ProcessAPP12($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart); + if ($dirLen != $dirStart + length($$dataPt)) { + my $buff = substr($$dataPt, $dirStart, $dirLen); + $dataPt = \$buff; + } else { + pos($$dataPt) = $$dirInfo{DirStart}; + } + my $verbose = $et->Options('Verbose'); + my $success = 0; + my $section = ''; + pos($$dataPt) = 0; + + # this regular expression is a bit complex, but basically we are looking for + # section headers (eg. "[Camera Info]") and tag/value pairs (eg. "tag=value", + # where "value" may contain white space), separated by spaces or CR/LF. + # (APP12 uses CR/LF, but Olympus TextualInfo is similar and uses spaces) + while ($$dataPt =~ /(\[.*?\]|[\w#-]+=[\x20-\x7e]+?(?=\s*([\n\r\0]|[\w#-]+=|\[|$)))/g) { + my $token = $1; + # was this a section name? + if ($token =~ /^\[(.*)\]/) { + $et->VerboseDir($1) if $verbose; + $section = ($token =~ /\[(\S+) ?Info\]/i) ? $1 : ''; + $success = 1; + next; + } + $et->VerboseDir($$dirInfo{DirName}) if $verbose and not $success; + $success = 1; + my ($tag, $val) = ($token =~ /(\S+)=(.+)/); + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + $verbose and $et->VerboseInfo($tag, $tagInfo, Value => $val); + unless ($tagInfo) { + # add new tag to table + $tagInfo = { Name => ucfirst $tag }; + # put in Camera group if information in "Camera" section + $$tagInfo{Groups} = { 2 => 'Camera' } if $section =~ /camera/i; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + $et->FoundTag($tagInfo, $val); + } + return $success; +} + + +1; #end + +__END__ + +=head1 NAME + +Image::ExifTool::APP12 - Read APP12 meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +APP12 meta information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Heinrich Giesen for his help decoding APP12 "Ducky" information. + +=head1 SEE ALSO + +L, +L + +=cut diff --git a/lib/Image/ExifTool/ASF.pm b/lib/Image/ExifTool/ASF.pm new file mode 100644 index 0000000..64689c8 --- /dev/null +++ b/lib/Image/ExifTool/ASF.pm @@ -0,0 +1,898 @@ +#------------------------------------------------------------------------------ +# File: ASF.pm +# +# Description: Read ASF/WMA/WMV meta information +# +# Revisions: 12/23/2005 - P. Harvey Created +# +# References: 1) http://www.microsoft.com/windows/windowsmedia/format/asfspec.aspx +# 2) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf (Oct 2008) +#------------------------------------------------------------------------------ + +package Image::ExifTool::ASF; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::RIFF; + +$VERSION = '1.25'; + +sub ProcessASF($$;$); +sub ProcessContentDescription($$$); +sub ProcessExtendedContentDescription($$$); +sub ProcessMetadata($$$); +sub ProcessPicture($$$); +sub ProcessCodecList($$$); + +# GUID definitions +my %errorCorrection = ( + '20FB5700-5B55-11CF-A8FD-00805F5C442B' => 'No Error Correction', + 'BFC3CD50-618F-11CF-8BB2-00AA00B4E220' => 'Audio Spread', +); + +my %streamType = ( + 'F8699E40-5B4D-11CF-A8FD-00805F5C442B' => 'Audio', + 'BC19EFC0-5B4D-11CF-A8FD-00805F5C442B' => 'Video', + '59DACFC0-59E6-11D0-A3AC-00A0C90348F6' => 'Command', + 'B61BE100-5B4E-11CF-A8FD-00805F5C442B' => 'JFIF', + '35907DE0-E415-11CF-A917-00805F5C442B' => 'Degradable JPEG', + '91BD222C-F21C-497A-8B6D-5AA86BFC0185' => 'File Transfer', + '3AFB65E2-47EF-40F2-AC2C-70A90D71D343' => 'Binary', +); + +my %mutex = ( + 'D6E22A00-35DA-11D1-9034-00A0C90349BE' => 'MutexLanguage', + 'D6E22A01-35DA-11D1-9034-00A0C90349BE' => 'MutexBitrate', + 'D6E22A02-35DA-11D1-9034-00A0C90349BE' => 'MutexUnknown', +); + +my %bandwidthSharing = ( + 'AF6060AA-5197-11D2-B6AF-00C04FD908E9' => 'SharingExclusive', + 'AF6060AB-5197-11D2-B6AF-00C04FD908E9' => 'SharingPartial', +); + +my %typeSpecific = ( + '776257D4-C627-41CB-8F81-7AC7FF1C40CC' => 'WebStreamMediaSubtype', + 'DA1E6B13-8359-4050-B398-388E965BF00C' => 'WebStreamFormat', +); + +my %advancedContentEncryption = ( + '7A079BB6-DAA4-4e12-A5CA-91D38DC11A8D' => 'DRMNetworkDevices', +); + +# ASF top level objects +%Image::ExifTool::ASF::Main = ( + PROCESS_PROC => \&ProcessASF, + NOTES => q{ + The ASF format is used by Windows WMA and WMV files, and DIVX videos. Tag + ID's aren't listed because they are huge 128-bit GUID's that would ruin the + formatting of this table. + }, + '75B22630-668E-11CF-A6D9-00AA0062CE6C' => { + Name => 'Header', + SubDirectory => { TagTable => 'Image::ExifTool::ASF::Header', Size => 6 }, + }, + '75B22636-668E-11CF-A6D9-00AA0062CE6C' => 'Data', + '33000890-E5B1-11CF-89F4-00A0C90349CB' => 'SimpleIndex', + 'D6E229D3-35DA-11D1-9034-00A0C90349BE' => 'Index', + 'FEB103F8-12AD-4C64-840F-2A1D2F7AD48C' => 'MediaIndex', + '3CB73FD0-0C4A-4803-953D-EDF7B6228F0C' => 'TimecodeIndex', + 'BE7ACFCB-97A9-42E8-9C71-999491E3AFAC' => { #2 + Name => 'XMP', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, +); + +# ASF header objects +%Image::ExifTool::ASF::Header = ( + PROCESS_PROC => \&ProcessASF, + '8CABDCA1-A947-11CF-8EE4-00C00C205365' => { + Name => 'FileProperties', + SubDirectory => { TagTable => 'Image::ExifTool::ASF::FileProperties' }, + }, + 'B7DC0791-A9B7-11CF-8EE6-00C00C205365' => { + Name => 'StreamProperties', + SubDirectory => { TagTable => 'Image::ExifTool::ASF::StreamProperties' }, + }, + '5FBF03B5-A92E-11CF-8EE3-00C00C205365' => { + Name => 'HeaderExtension', + SubDirectory => { TagTable => 'Image::ExifTool::ASF::HeaderExtension', Size => 22 }, + }, + '86D15240-311D-11D0-A3A4-00A0C90348F6' => { + Name => 'CodecList', + SubDirectory => { TagTable => 'Image::ExifTool::ASF::CodecList' }, + }, + '1EFB1A30-0B62-11D0-A39B-00A0C90348F6' => 'ScriptCommand', + 'F487CD01-A951-11CF-8EE6-00C00C205365' => 'Marker', + 'D6E229DC-35DA-11D1-9034-00A0C90349BE' => 'BitrateMutualExclusion', + '75B22635-668E-11CF-A6D9-00AA0062CE6C' => 'ErrorCorrection', + '75B22633-668E-11CF-A6D9-00AA0062CE6C' => { + Name => 'ContentDescription', + SubDirectory => { TagTable => 'Image::ExifTool::ASF::ContentDescr' }, + }, + '2211B3FA-BD23-11D2-B4B7-00A0C955FC6E' => { + Name => 'ContentBranding', + SubDirectory => { TagTable => 'Image::ExifTool::ASF::ContentBranding' }, + }, + 'D2D0A440-E307-11D2-97F0-00A0C95EA850' => { + Name => 'ExtendedContentDescr', + SubDirectory => { TagTable => 'Image::ExifTool::ASF::ExtendedDescr' }, + }, + '7BF875CE-468D-11D1-8D82-006097C9A2B2' => 'StreamBitrateProps', + '2211B3FB-BD23-11D2-B4B7-00A0C955FC6E' => 'ContentEncryption', + '298AE614-2622-4C17-B935-DAE07EE9289C' => 'ExtendedContentEncryption', + '2211B3FC-BD23-11D2-B4B7-00A0C955FC6E' => 'DigitalSignature', + '1806D474-CADF-4509-A4BA-9AABCB96AAE8' => 'Padding', +); + +%Image::ExifTool::ASF::ContentDescr = ( + PROCESS_PROC => \&ProcessContentDescription, + GROUPS => { 2 => 'Video' }, + 0 => 'Title', + 1 => { Name => 'Author', Groups => { 2 => 'Author' } }, + 2 => { Name => 'Copyright', Groups => { 2 => 'Author' } }, + 3 => 'Description', + 4 => 'Rating', +); + +%Image::ExifTool::ASF::ContentBranding = ( + PROCESS_PROC => \&ProcessContentBranding, + GROUPS => { 2 => 'Author' }, + 0 => { + Name => 'BannerImageType', + PrintConv => { + 0 => 'None', + 1 => 'Bitmap', + 2 => 'JPEG', + 3 => 'GIF', + }, + }, + 1 => { Name => 'BannerImage', Groups => { 2 => 'Preview' }, Binary => 1 }, + 2 => 'BannerImageURL', + 3 => 'CopyrightURL', +); + +# Note: Many of these tags are similar to those in Image::ExifTool::Microsoft::Xtra +# and Image::ExifTool::WTV::Metadata +# (tags in this table may have a leading "WM/" removed) +%Image::ExifTool::ASF::ExtendedDescr = ( + PROCESS_PROC => \&ProcessExtendedContentDescription, + GROUPS => { 2 => 'Video' }, + ASFLeakyBucketPairs => { Binary => 1 }, + AspectRatioX => {}, + AspectRatioY => {}, + Author => { Groups => { 2 => 'Author' } }, + AverageLevel => {}, + BannerImageData => {}, + BannerImageType => {}, + BannerImageURL => {}, + Bitrate => { PrintConv => 'ConvertBitrate($val)' }, + Broadcast => {}, + BufferAverage => {}, + Can_Skip_Backward => {}, + Can_Skip_Forward => {}, + Copyright => { Groups => { 2 => 'Author' } }, + CopyrightURL => { Groups => { 2 => 'Author' } }, + CurrentBitrate => { PrintConv => 'ConvertBitrate($val)' }, + Description => {}, + DRM_ContentID => {}, + DRM_DRMHeader_ContentDistributor => {}, + DRM_DRMHeader_ContentID => {}, + DRM_DRMHeader_IndividualizedVersion => {}, + DRM_DRMHeader_KeyID => {}, + DRM_DRMHeader_LicenseAcqURL => {}, + DRM_DRMHeader_SubscriptionContentID => {}, + DRM_DRMHeader => {}, + DRM_IndividualizedVersion => {}, + DRM_KeyID => {}, + DRM_LASignatureCert => {}, + DRM_LASignatureLicSrvCert => {}, + DRM_LASignaturePrivKey => {}, + DRM_LASignatureRootCert => {}, + DRM_LicenseAcqURL => {}, + DRM_V1LicenseAcqURL => {}, + Duration => { PrintConv => 'ConvertDuration($val)' }, + FileSize => {}, + HasArbitraryDataStream => {}, + HasAttachedImages => {}, + HasAudio => {}, + HasFileTransferStream => {}, + HasImage => {}, + HasScript => {}, + HasVideo => {}, + Is_Protected => {}, + Is_Trusted => {}, + IsVBR => {}, + NSC_Address => {}, + NSC_Description => {}, + NSC_Email => {}, + NSC_Name => {}, + NSC_Phone => {}, + NumberOfFrames => {}, + OptimalBitrate => { PrintConv => 'ConvertBitrate($val)' }, + PeakValue => {}, + Rating => {}, + Seekable => {}, + Signature_Name => {}, + Stridable => {}, + Title => {}, + VBRPeak => {}, + # "WM/" tags... + AlbumArtist => {}, + AlbumCoverURL => {}, + AlbumTitle => {}, + ASFPacketCount => {}, + ASFSecurityObjectsSize => {}, + AudioFileURL => {}, + AudioSourceURL => {}, + AuthorURL => { Groups => { 2 => 'Author' } }, + BeatsPerMinute => {}, + Category => {}, + Codec => {}, + Composer => {}, + Conductor => {}, + ContainerFormat => {}, + ContentDistributor => {}, + ContentGroupDescription => {}, + Director => {}, + DRM => {}, + DVDID => {}, + EncodedBy => {}, + EncodingSettings => {}, + EncodingTime => { Groups => { 2 => 'Time' }, PrintConv => '$self->ConvertDateTime($val)' }, + Genre => {}, + GenreID => {}, + InitialKey => {}, + ISRC => {}, + Language => {}, + Lyrics => {}, + Lyrics_Synchronised => {}, + MCDI => {}, + MediaClassPrimaryID => { ValueConv => 'Image::ExifTool::ASF::GetGUID($val)' }, + MediaClassSecondaryID => { ValueConv => 'Image::ExifTool::ASF::GetGUID($val)' }, + MediaCredits => {}, + MediaIsDelay => {}, + MediaIsFinale => {}, + MediaIsLive => {}, + MediaIsPremiere => {}, + MediaIsRepeat => {}, + MediaIsSAP => {}, + MediaIsStereo => {}, + MediaIsSubtitled => {}, + MediaIsTape => {}, + MediaNetworkAffiliation => {}, + MediaOriginalBroadcastDateTime => { + Groups => { 2 => 'Time' }, + ValueConv => '$val=~tr/-T/: /; $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + MediaOriginalChannel => {}, + MediaStationCallSign => {}, + MediaStationName => {}, + ModifiedBy => {}, + Mood => {}, + OriginalAlbumTitle => {}, + OriginalArtist => {}, + OriginalFilename => 'OriginalFileName', + OriginalLyricist => {}, + OriginalReleaseTime => { + Groups => { 2 => 'Time' }, + ValueConv => '$val=~tr/-T/: /; $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + OriginalReleaseYear => { Groups => { 2 => 'Time' } }, + ParentalRating => {}, + ParentalRatingReason => {}, + PartOfSet => {}, + PeakBitrate => { PrintConv => 'ConvertBitrate($val)' }, + Period => {}, + Picture => { + SubDirectory => { + TagTable => 'Image::ExifTool::ASF::Picture', + }, + }, + PlaylistDelay => {}, + Producer => {}, + PromotionURL => {}, + ProtectionType => {}, + Provider => {}, + ProviderCopyright => {}, + ProviderRating => {}, + ProviderStyle => {}, + Publisher => {}, + RadioStationName => {}, + RadioStationOwner => {}, + SharedUserRating => {}, + StreamTypeInfo => {}, + SubscriptionContentID => {}, + SubTitle => 'Subtitle', + SubTitleDescription => 'SubtitleDescription', + Text => {}, + ToolName => {}, + ToolVersion => {}, + Track => {}, + TrackNumber => {}, + UniqueFileIdentifier => {}, + UserWebURL => {}, + VideoClosedCaptioning => {}, + VideoFrameRate => {}, + VideoHeight => {}, + VideoWidth => {}, + WMADRCAverageReference => {}, + WMADRCAverageTarget => {}, + WMADRCPeakReference => {}, + WMADRCPeakTarget => {}, + WMCollectionGroupID => {}, + WMCollectionID => {}, + WMContentID => {}, + Writer => { Groups => { 2 => 'Author' } }, + Year => { Groups => { 2 => 'Time' } }, +); + +%Image::ExifTool::ASF::Picture = ( + PROCESS_PROC => \&ProcessPicture, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'PictureType', + PrintConv => { # (Note: Duplicated in ID3, ASF and FLAC modules!) + 0 => 'Other', + 1 => '32x32 PNG Icon', + 2 => 'Other Icon', + 3 => 'Front Cover', + 4 => 'Back Cover', + 5 => 'Leaflet', + 6 => 'Media', + 7 => 'Lead Artist', + 8 => 'Artist', + 9 => 'Conductor', + 10 => 'Band', + 11 => 'Composer', + 12 => 'Lyricist', + 13 => 'Recording Studio or Location', + 14 => 'Recording Session', + 15 => 'Performance', + 16 => 'Capture from Movie or Video', + 17 => 'Bright(ly) Colored Fish', + 18 => 'Illustration', + 19 => 'Band Logo', + 20 => 'Publisher Logo', + }, + }, + 1 => 'PictureMIMEType', + 2 => 'PictureDescription', + 3 => { + Name => 'Picture', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, +); + +%Image::ExifTool::ASF::FileProperties = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + 0 => { + Name => 'FileID', + Format => 'binary[16]', + ValueConv => 'Image::ExifTool::ASF::GetGUID($val)', + }, + 16 => { Name => 'FileLength', Format => 'int64u' }, + 24 => { + Name => 'CreationDate', + Format => 'int64u', + Groups => { 2 => 'Time' }, + # time is in 100 ns intervals since 0:00 UTC Jan 1, 1601 + ValueConv => q{ # (89 leap years between 1601 and 1970) + my $t = $val / 1e7 - (((1970-1601)*365+89)*24*3600); + return Image::ExifTool::ConvertUnixTime($t) . 'Z'; + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 32 => { Name => 'DataPackets', Format => 'int64u' }, + 40 => { + Name => 'Duration', + Format => 'int64u', + Notes => 'called PlayDuration by the ASF spec', + Priority => 0, + ValueConv => '$val / 1e7', + PrintConv => 'ConvertDuration($val)', + }, + 48 => { + Name => 'SendDuration', + Format => 'int64u', + ValueConv => '$val / 1e7', + PrintConv => 'ConvertDuration($val)', + }, + 56 => { Name => 'Preroll', Format => 'int64u' }, + 64 => { Name => 'Flags', Format => 'int32u' }, + 68 => { Name => 'MinPacketSize',Format => 'int32u' }, + 72 => { Name => 'MaxPacketSize',Format => 'int32u' }, + 76 => { Name => 'MaxBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' }, +); + +%Image::ExifTool::ASF::StreamProperties = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + NOTES => 'Tags with index 54 and greater are conditional based on the StreamType.', + 0 => { + Name => 'StreamType', + Format => 'binary[16]', + RawConv => sub { # set ASF_STREAM_TYPE for use in conditional tags + my ($val, $et) = @_; + $$et{ASF_STREAM_TYPE} = $streamType{GetGUID($val)} || ''; + return $val; + }, + ValueConv => 'Image::ExifTool::ASF::GetGUID($val)', + PrintConv => \%streamType, + }, + 16 => { + Name => 'ErrorCorrectionType', + Format => 'binary[16]', + ValueConv => 'Image::ExifTool::ASF::GetGUID($val)', + PrintConv => \%errorCorrection, + }, + 32 => { + Name => 'TimeOffset', + Format => 'int64u', + ValueConv => '$val / 1e7', + PrintConv => '"$val s"', + }, + 48 => { + Name => 'StreamNumber', + Format => 'int16u', + PrintConv => '($val & 0x7f) . ($val & 0x8000 ? " (encrypted)" : "")', + }, + 54 => [ + { + Condition => '$self->{ASF_STREAM_TYPE} eq "Audio"', + Name => 'AudioCodecID', + Format => 'int16u', + PrintHex => 1, + SeparateTable => 'RIFF AudioEncoding', + PrintConv => \%Image::ExifTool::RIFF::audioEncoding, + }, + { + Condition => '$self->{ASF_STREAM_TYPE} =~ /^(Video|JFIF|Degradable JPEG)$/', + Name => 'ImageWidth', + Format => 'int32u', + }, + ], + 56 => { + Condition => '$self->{ASF_STREAM_TYPE} eq "Audio"', + Name => 'AudioChannels', + Format => 'int16u', + }, + 58 => [ + { + Condition => '$self->{ASF_STREAM_TYPE} eq "Audio"', + Name => 'AudioSampleRate', + Format => 'int32u', + }, + { + Condition => '$self->{ASF_STREAM_TYPE} =~ /^(Video|JFIF|Degradable JPEG)$/', + Name => 'ImageHeight', + Format => 'int32u', + }, + ], +); + +%Image::ExifTool::ASF::HeaderExtension = ( + PROCESS_PROC => \&ProcessASF, + '14E6A5CB-C672-4332-8399-A96952065B5A' => 'ExtendedStreamProps', + 'A08649CF-4775-4670-8A16-6E35357566CD' => 'AdvancedMutualExcl', + 'D1465A40-5A79-4338-B71B-E36B8FD6C249' => 'GroupMutualExclusion', + 'D4FED15B-88D3-454F-81F0-ED5C45999E24' => 'StreamPrioritization', + 'A69609E6-517B-11D2-B6AF-00C04FD908E9' => 'BandwidthSharing', + '7C4346A9-EFE0-4BFC-B229-393EDE415C85' => 'LanguageList', + 'C5F8CBEA-5BAF-4877-8467-AA8C44FA4CCA' => { + Name => 'Metadata', + SubDirectory => { + # have seen some tags same as ExtendedDescr, so use this table - PH + TagTable => 'Image::ExifTool::ASF::ExtendedDescr', + ProcessProc => \&ProcessMetadata, + }, + }, + '44231C94-9498-49D1-A141-1D134E457054' => { + Name => 'MetadataLibrary', + SubDirectory => { + # have seen some tags same as ExtendedDescr, so use this table - PH + TagTable => 'Image::ExifTool::ASF::ExtendedDescr', + ProcessProc => \&ProcessMetadata, + }, + }, + 'D6E229DF-35DA-11D1-9034-00A0C90349BE' => 'IndexParameters', + '6B203BAD-3F11-48E4-ACA8-D7613DE2CFA7' => 'TimecodeIndexParms', + '75B22630-668E-11CF-A6D9-00AA0062CE6C' => 'Compatibility', + '43058533-6981-49E6-9B74-AD12CB86D58C' => 'AdvancedContentEncryption', + 'ABD3D211-A9BA-11cf-8EE6-00C00C205365' => 'Reserved1', +); + +%Image::ExifTool::ASF::CodecList = ( + PROCESS_PROC => \&ProcessCodecList, + VideoCodecName => {}, + VideoCodecDescription => {}, + AudioCodecName => {}, + AudioCodecDescription => {}, + OtherCodecName => {}, + OtherCodecDescription => {}, +); + +#------------------------------------------------------------------------------ +# Generate GUID from 16 bytes of binary data +# Inputs: 0) data +# Returns: GUID +sub GetGUID($) +{ + # must do some byte swapping + my $val = shift; + return $val unless length($val) == 16; + my $buff = unpack('H*',pack('NnnNN',unpack('VvvNN',$val))); + $buff =~ s/(.{8})(.{4})(.{4})(.{4})/$1-$2-$3-$4-/; + return uc($buff); +} + +#------------------------------------------------------------------------------ +# Process ASF content description +# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference +# Returns: 1 on success +sub ProcessContentDescription($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + return 0 if $dirLen < 10; + my @len = unpack('v5', $$dataPt); + my $pos = 10; + my $tag; + foreach $tag (0..4) { + my $len = shift @len; + next unless $len; + return 0 if $pos + $len > $dirLen; + my $val = $et->Decode(substr($$dataPt,$pos,$len),'UCS2','II'); + $et->HandleTag($tagTablePtr, $tag, $val); + $pos += $len; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process ASF content branding +# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference +# Returns: 1 on success +sub ProcessContentBranding($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + return 0 if $dirLen < 40; + # decode banner image type + $et->HandleTag($tagTablePtr, 0, unpack('V', $$dataPt)); + # decode banner image, banner URL and copyright URL + my $pos = 4; + my $tag; + foreach $tag (1..3) { + return 0 if $pos + 4 > $dirLen; + my $size = unpack("x${pos}V", $$dataPt); + $pos += 4; + next unless $size; + return 0 if $pos + $size > $dirLen; + my $val = substr($$dataPt, $pos, $size); + $et->HandleTag($tagTablePtr, $tag, $val); + $pos += $size; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Read ASF value +# Inputs: 0) ExifTool object ref, 1) data reference, 2) value offset, +# 3) format number, 4) size +# Returns: converted value +sub ReadASF($$$$$) +{ + my ($et, $dataPt, $pos, $format, $size) = @_; + my @vals; + if ($format == 0) { # unicode string + $vals[0] = $et->Decode(substr($$dataPt,$pos,$size),'UCS2','II'); + } elsif ($format == 2) { # 4-byte boolean + @vals = ReadValue($dataPt, $pos, 'int32u', undef, $size); + foreach (@vals) { + $_ = $_ ? 'True' : 'False'; + } + } elsif ($format == 3) { # int32u + @vals = ReadValue($dataPt, $pos, 'int32u', undef, $size); + } elsif ($format == 4) { # int64u + @vals = ReadValue($dataPt, $pos, 'int64u', undef, $size); + } elsif ($format == 5) { # int16u + @vals = ReadValue($dataPt, $pos, 'int16u', undef, $size); + } else { # any other format (including 1, byte array): return raw data + $vals[0] = substr($$dataPt,$pos,$size); + } + return join ' ', @vals; +} + +#------------------------------------------------------------------------------ +# Process extended content description +# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference +# Returns: 1 on success +sub ProcessExtendedContentDescription($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + return 0 if $dirLen < 2; + my $count = Get16u($dataPt, 0); + $et->VerboseDir($dirInfo, $count); + my $pos = 2; + my $i; + for ($i=0; $i<$count; ++$i) { + return 0 if $pos + 6 > $dirLen; + my $nameLen = unpack("x${pos}v", $$dataPt); + $pos += 2; + return 0 if $pos + $nameLen + 4 > $dirLen; + my $tag = Image::ExifTool::Decode(undef,substr($$dataPt,$pos,$nameLen),'UCS2','II','Latin'); + $tag =~ s/^WM\///; # remove leading "WM/" + $pos += $nameLen; + my ($dType, $dLen) = unpack("x${pos}v2", $$dataPt); + $pos += 4; + return 0 if $pos + $dLen > $dirLen; + my $val = ReadASF($et,$dataPt,$pos,$dType,$dLen); + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + Start => $pos, + Size => $dLen, + ); + $pos += $dLen; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process ASF metadata library (similar to ProcessExtendedContentDescription above) +# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference +# Returns: 1 on success +sub ProcessMetadata($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + return 0 if $dirLen < 2; + my $count = Get16u($dataPt, 0); + $et->VerboseDir($dirInfo, $count); + my $pos = 2; + my $i; + for ($i=0; $i<$count; ++$i) { + return 0 if $pos + 12 > $dirLen; + my ($index, $stream, $nameLen, $dType, $dLen) = unpack("x${pos}v4V", $$dataPt); + $pos += 12; + return 0 if $pos + $nameLen + $dLen > $dirLen; + my $tag = Image::ExifTool::Decode(undef,substr($$dataPt,$pos,$nameLen),'UCS2','II','Latin'); + $tag =~ s/^WM\///; # remove leading "WM/" + $pos += $nameLen; + my $val = ReadASF($et,$dataPt,$pos,$dType,$dLen); + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + Start => $pos, + Size => $dLen, + ); + $pos += $dLen; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process WM/Picture preview +# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference +# Returns: 1 on success +sub ProcessPicture($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart}; + my $dirLen = $$dirInfo{DirLen}; + return 0 unless $dirLen > 9; + # extract picture type and length + my ($type, $picLen) = unpack("x${dirStart}CV", $$dataPt); + $et->VerboseDir('Picture'); + $et->HandleTag($tagTablePtr, 0, $type); + # extract mime type and description strings (null-terminated unicode strings) + my $n = $dirLen - 5 - $picLen; + return 0 if $n & 0x01 or $n < 4; + my $str = substr($$dataPt, $dirStart+5, $n); + if ($str =~ /^((?:..)*?)\0\0((?:..)*?)\0\0/s) { + my ($mime, $desc) = ($1, $2); + $et->HandleTag($tagTablePtr, 1, $et->Decode($mime,'UCS2','II')); + $et->HandleTag($tagTablePtr, 2, $et->Decode($desc,'UCS2','II')) if length $desc; + } + $et->HandleTag($tagTablePtr, 3, substr($$dataPt, $dirStart+5+$n, $picLen)); + return 1; +} + +#------------------------------------------------------------------------------ +# Process codec list +# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table reference +# Returns: 1 on success +sub ProcessCodecList($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + return 0 if $dirLen < 20; + my $count = Get32u($dataPt, 16); + $et->VerboseDir($dirInfo, $count); + my $pos = 20; + my $i; + my %codecType = ( 1 => 'Video', 2 => 'Audio' ); + for ($i=0; $i<$count; ++$i) { + return 0 if $pos + 8 > $dirLen; + my $type = ($codecType{Get16u($dataPt, $pos)} || 'Other') . 'Codec'; + # stupid Windows programmers: these lengths are in characters (others are in bytes) + my $nameLen = Get16u($dataPt, $pos + 2) * 2; + $pos += 4; + return 0 if $pos + $nameLen + 2 > $dirLen; + my $name = $et->Decode(substr($$dataPt,$pos,$nameLen),'UCS2','II'); + $et->HandleTag($tagTablePtr, "${type}Name", $name); + my $descLen = Get16u($dataPt, $pos + $nameLen) * 2; + $pos += $nameLen + 2; + return 0 if $pos + $descLen + 2 > $dirLen; + my $desc = $et->Decode(substr($$dataPt,$pos,$descLen),'UCS2','II'); + $et->HandleTag($tagTablePtr, "${type}Description", $desc); + my $infoLen = Get16u($dataPt, $pos + $descLen); + $pos += $descLen + 2 + $infoLen; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from a ASF file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref +# Returns: 1 on success, 0 if this wasn't a valid ASF file +sub ProcessASF($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my $rtnVal = 0; + my $pos = 0; + my ($buff, $err, @parentTable, @childEnd); + + for (;;) { + last unless $raf->Read($buff, 24) == 24; + $pos += 24; + my $tag = GetGUID(substr($buff,0,16)); + unless ($tagTablePtr) { + # verify this is a valid ASF file + last unless $tag eq '75B22630-668E-11CF-A6D9-00AA0062CE6C'; + my $fileType = $$et{FILE_EXT}; + $fileType = 'ASF' unless $fileType and $fileType =~ /^(ASF|WMV|WMA|DIVX)$/; + $et->SetFileType($fileType); + SetByteOrder('II'); + $tagTablePtr = GetTagTable('Image::ExifTool::ASF::Main'); + $rtnVal = 1; + } + my $size = Image::ExifTool::Get64u(\$buff, 16) - 24; + if ($size < 0) { + $err = 'Invalid ASF object size'; + last; + } + if ($size > 0x7fffffff) { + if ($size > 0x7fffffff * 4294967296) { + $err = 'Invalid ASF object size'; + } elsif ($et->Options('LargeFileSupport')) { + if ($raf->Seek($size, 1)) { + $et->VPrint(0, " Skipped large ASF object ($size bytes)\n"); + $pos += $size; + next; + } + $err = 'Error seeking past large ASF object'; + } else { + $err = 'Large ASF objects not supported (LargeFileSupport not set)'; + } + last; + } + # go back to parent tag table if done with previous children + if (@childEnd and $pos >= $childEnd[-1]) { + pop @childEnd; + $tagTablePtr = pop @parentTable; + $$et{INDENT} = substr($$et{INDENT},0,-2); + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + $verbose and $et->VerboseInfo($tag, $tagInfo); + if ($tagInfo) { + my $subdir = $$tagInfo{SubDirectory}; + if ($subdir) { + my $subTable = GetTagTable($$subdir{TagTable}); + if ($$subTable{PROCESS_PROC} eq \&ProcessASF) { + if (defined $$subdir{Size}) { + my $s = $$subdir{Size}; + if ($verbose > 2) { + $raf->Read($buff, $s) == $s or $err = 'Truncated file', last; + $et->VerboseDump(\$buff); + } elsif (not $raf->Seek($s, 1)) { + $err = 'Seek error'; + last; + } + # continue processing linearly using subTable + push @parentTable, $tagTablePtr; + push @childEnd, $pos + $size; + $tagTablePtr = $subTable; + $pos += $$subdir{Size}; + if ($verbose) { + $$et{INDENT} .= '| '; + $et->VerboseDir($$tagInfo{Name}); + } + next; + } + } elsif ($raf->Read($buff, $size) == $size) { + my %subdirInfo = ( + DataPt => \$buff, + DirStart => 0, + DirLen => $size, + DirName => $$tagInfo{Name}, + ); + $et->VerboseDump(\$buff) if $verbose > 2; + unless ($et->ProcessDirectory(\%subdirInfo, $subTable, $$subdir{ProcessProc})) { + $et->Warn("Error processing $$tagInfo{Name} directory"); + } + $pos += $size; + next; + } else { + $err = 'Unexpected end of file'; + last; + } + } + } + if ($verbose > 2) { + $raf->Read($buff, $size) == $size or $err = 'Truncated file', last; + $et->VerboseDump(\$buff); + } elsif (not $raf->Seek($size, 1)) { # skip the block + $err = 'Seek error'; + last; + } + $pos += $size; + } + $err and $et->Warn($err); + return $rtnVal; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::ASF - Read ASF/WMA/WMV meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to extract +information from Microsoft Advanced Systems Format (ASF) files, including +Windows Media Audio (WMA) and Windows Media Video (WMV) files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L + +=back + +=head1 SEE ALSO + +L, +L + +=cut + diff --git a/lib/Image/ExifTool/Apple.pm b/lib/Image/ExifTool/Apple.pm new file mode 100644 index 0000000..61aa039 --- /dev/null +++ b/lib/Image/ExifTool/Apple.pm @@ -0,0 +1,171 @@ +#------------------------------------------------------------------------------ +# File: Apple.pm +# +# Description: Apple EXIF maker notes tags +# +# Revisions: 2013-09-13 - P. Harvey Created +# +# References: 1) http://www.photoinvestigator.co/blog/the-mystery-of-maker-apple-metadata/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::Apple; + +use strict; +use vars qw($VERSION); +use Image::ExifTool::Exif; +use Image::ExifTool::PLIST; + +$VERSION = '1.06'; + +# Apple iPhone metadata (ref PH) +%Image::ExifTool::Apple::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + NOTES => 'Tags extracted from the maker notes of iPhone images.', + # 0x0001 - int32s: seen 0,1,2,3,4,9 + # 0x0002 - binary plist with a single data object of size 512 bytes (iPhone5s) + 0x0003 => { + Name => 'RunTime', # (includes time plugged in, but not when suspended, ref 1) + SubDirectory => { TagTable => 'Image::ExifTool::Apple::RunTime' }, + }, + # 0x0004 - int32s: normally 1, but 0 for low-light images + # 0x0005 - int32s: seen values 113-247, and 100 for blank images + # 0x0006 - int32s: seen values 27-258, and 20 for blank images + # 0x0007 - int32s: seen 1 + 0x0008 => { #1 + Name => 'AccelerationVector', + Groups => { 2 => 'Camera' }, + Writable => 'rational64s', + Count => 3, + # Note: the directions are contrary to the Apple documentation (which have the + # signs of all axes reversed -- apparently the Apple geeks aren't very good + # with basic physics, and don't understand the concept of acceleration. See + # http://nscookbook.com/2013/03/ios-programming-recipe-19-using-core-motion-to-access-gyro-and-accelerometer/ + # for one of the few correct descriptions of this). Note that this leads to + # a left-handed coordinate system for acceleration. + Notes => q{ + XYZ coordinates of the acceleration vector in units of g. As viewed from + the front of the phone, positive X is toward the left side, positive Y is + toward the bottom, and positive Z points into the face of the phone + }, + }, + # 0x0009 - int32s: seen 19,275,531,4371 + 0x000a => { + Name => 'HDRImageType', + Writable => 'int32s', + PrintConv => { + # 2 => ? (iPad mini 2) + 3 => 'HDR Image', + 4 => 'Original Image', + }, + }, + 0x000b => { + Name => 'BurstUUID', + Writable => 'string', + Notes => 'unique ID for all images in a burst', + }, + 0x000c => { # ref forum13710 (Neal Krawetz) + Name => 'FocusDistanceRange', + Writable => 'rational64s', + Count => 2, + PrintConv => q{ + my @a = split ' ', $val; + sprintf('%.2f - %.2f m', $a[0] <= $a[1] ? @a : reverse @a); + }, + PrintConvInv => '$val =~ s/ - //; $val =~ s/ ?m$//; $val', + }, + # 0x000d - int32s: 0,1,6,20,24,32,40 + # 0x000e - int32s: 0,1,4,12 (Orientation? 0=landscape? 4=portrait? ref 1) + # 0x000f - int32s: 2,3 + # 0x0010 - int32s: 1 + 0x0011 => { + Name => 'MediaGroupUUID', #NealKrawetz private communication + # (changed in 12.19 from Name => 'ContentIdentifier', #forum8750) + Writable => 'string', + }, + # 0x0014 - int32s: 1,2,3,4,5 (iPhone 6s, iOS 6.1) + 0x0015 => { + Name => 'ImageUniqueID', + Writable => 'string', + }, + # 0x0016 - string[29]: "AXZ6pMTOh2L+acSh4Kg630XCScoO\0" + # 0x0017 - int32s: 0,8192 + # 0x0019 - int32s: 0,2,128 + # 0x001a - string[6]: "q825s\0" + # 0x001f - int32s: 0 +); + +# PLIST-format CMTime structure (ref PH) +# (CMTime ref https://developer.apple.com/library/ios/documentation/CoreMedia/Reference/CMTime/Reference/reference.html) +%Image::ExifTool::Apple::RunTime = ( + PROCESS_PROC => \&Image::ExifTool::PLIST::ProcessBinaryPLIST, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + NOTES => q{ + This PLIST-format information contains the elements of a CMTime structure + representing the amount of time the phone has been running since the last + boot, not including standby time. + }, + timescale => { Name => 'RunTimeScale' }, # (seen 1000000000 --> ns) + epoch => { Name => 'RunTimeEpoch' }, # (seen 0) + value => { Name => 'RunTimeValue' }, # (should divide by RunTimeScale to get seconds) + flags => { + Name => 'RunTimeFlags', + PrintConv => { BITMASK => { + 0 => 'Valid', + 1 => 'Has been rounded', + 2 => 'Positive infinity', + 3 => 'Negative infinity', + 4 => 'Indefinite', + }}, + }, +); + +# Apple composite tags +%Image::ExifTool::Apple::Composite = ( + GROUPS => { 2 => 'Camera' }, + RunTimeSincePowerUp => { + Require => { + 0 => 'Apple:RunTimeValue', + 1 => 'Apple:RunTimeScale', + }, + ValueConv => '$val[1] ? $val[0] / $val[1] : undef', + PrintConv => 'ConvertDuration($val)', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::Apple'); + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Apple - Apple EXIF maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Apple maker notes in EXIF information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L, +L + +=cut diff --git a/lib/Image/ExifTool/Audible.pm b/lib/Image/ExifTool/Audible.pm new file mode 100644 index 0000000..75560a7 --- /dev/null +++ b/lib/Image/ExifTool/Audible.pm @@ -0,0 +1,317 @@ +#------------------------------------------------------------------------------ +# File: Audible.pm +# +# Description: Read metadata from Audible audio books +# +# Revisions: 2015/04/05 - P. Harvey Created +# +# References: 1) https://github.com/jteeuwen/audible +# 2) https://code.google.com/p/pyaudibletags/ +# 3) http://wiki.multimedia.cx/index.php?title=Audible_Audio +#------------------------------------------------------------------------------ + +package Image::ExifTool::Audible; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.02'; + +sub ProcessAudible_meta($$$); +sub ProcessAudible_cvrx($$$); + +%Image::ExifTool::Audible::Main = ( + GROUPS => { 2 => 'Audio' }, + NOTES => q{ + ExifTool will extract any information found in the metadata dictionary of + Audible .AA files, even if not listed in the table below. + }, + # tags found in the metadata dictionary (chunk 2) + pubdate => { Name => 'PublishDate', Groups => { 2 => 'Time' } }, + pub_date_start => { Name => 'PublishDateStart', Groups => { 2 => 'Time' } }, + author => { Name => 'Author', Groups => { 2 => 'Author' } }, + copyright => { Name => 'Copyright', Groups => { 2 => 'Author' } }, + # also seen (ref PH): + # product_id, parent_id, title, provider, narrator, price, description, + # long_description, short_title, is_aggregation, title_id, codec, HeaderSeed, + # EncryptedBlocks, HeaderKey, license_list, CPUType, license_count, <12 hex digits>, + # parent_short_title, parent_title, aggregation_id, short_description, user_alias + + # information extracted from other chunks + _chapter_count => { Name => 'ChapterCount' }, # from chunk 6 + _cover_art => { # from chunk 11 + Name => 'CoverArt', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, +); + +# 'tags' atoms observed in Audible .m4b audio books (ref PH) +%Image::ExifTool::Audible::tags = ( + GROUPS => { 0 => 'QuickTime', 2 => 'Audio' }, + NOTES => 'Information found in "tags" atom of Audible M4B audio books.', + meta => { + Name => 'Audible_meta', + SubDirectory => { TagTable => 'Image::ExifTool::Audible::meta' }, + }, + cvrx => { + Name => 'Audible_cvrx', + SubDirectory => { TagTable => 'Image::ExifTool::Audible::cvrx' }, + }, + tseg => { + Name => 'Audible_tseg', + SubDirectory => { TagTable => 'Image::ExifTool::Audible::tseg' }, + }, +); + +# 'meta' information observed in Audible .m4b audio books (ref PH) +%Image::ExifTool::Audible::meta = ( + PROCESS_PROC => \&ProcessAudible_meta, + GROUPS => { 0 => 'QuickTime', 2 => 'Audio' }, + NOTES => 'Information found in Audible M4B "meta" atom.', + Album => 'Album', + ALBUMARTIST => { Name => 'AlbumArtist', Groups => { 2 => 'Author' } }, + Artist => { Name => 'Artist', Groups => { 2 => 'Author' } }, + Comment => 'Comment', + Genre => 'Genre', + itunesmediatype => { Name => 'iTunesMediaType', Description => 'iTunes Media Type' }, + SUBTITLE => 'Subtitle', + Title => 'Title', + TOOL => 'CreatorTool', + Year => { Name => 'Year', Groups => { 2 => 'Time' } }, + track => 'ChapterName', # (found in 'meta' of 'tseg' atom) +); + +# 'cvrx' information observed in Audible .m4b audio books (ref PH) +%Image::ExifTool::Audible::cvrx = ( + PROCESS_PROC => \&ProcessAudible_cvrx, + GROUPS => { 0 => 'QuickTime', 2 => 'Audio' }, + NOTES => 'Audible cover art information in M4B audio books.', + VARS => { NO_ID => 1 }, + CoverArtType => 'CoverArtType', + CoverArt => { + Name => 'CoverArt', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, +); + +# 'tseg' information observed in Audible .m4b audio books (ref PH) +%Image::ExifTool::Audible::tseg = ( + GROUPS => { 0 => 'QuickTime', 2 => 'Audio' }, + tshd => { + Name => 'ChapterNumber', + Format => 'int32u', + ValueConv => '$val + 1', # start counting from 1 + }, + meta => { + Name => 'Audible_meta2', + SubDirectory => { TagTable => 'Image::ExifTool::Audible::meta' }, + }, +); + +#------------------------------------------------------------------------------ +# Process Audible 'meta' tags from M4B files (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessAudible_meta($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $dirLen = length $$dataPt; + return 0 if $dirLen < 4; + my $num = Get32u($dataPt, 0); + $et->VerboseDir('Audible_meta', $num); + my $pos = 4; + my $index; + for ($index=0; $index<$num; ++$index) { + last if $pos + 3 > $dirLen; + my $unk = Get8u($dataPt, $pos); # ? (0x80 or 0x00) + last unless $unk == 0x80 or $unk == 0x00; + my $len = Get16u($dataPt, $pos + 1); # tag length + $pos += 3; + last if $pos + $len + 6 > $dirLen or not $len; + my $tag = substr($$dataPt, $pos, $len); # tag ID + my $ver = Get16u($dataPt, $pos + $len); # version? + last unless $ver == 0x0001; + my $size = Get32u($dataPt, $pos + $len + 2);# data size + $pos += $len + 6; + last if $pos + $size > $dirLen; + my $val = $et->Decode(substr($$dataPt, $pos, $size), 'UTF8'); + unless ($$tagTablePtr{$tag}) { + my $name = Image::ExifTool::MakeTagName(($tag =~ /[a-z]/) ? $tag : lc($tag)); + AddTagToTable($tagTablePtr, $tag, { Name => $name }); + } + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $pos, + Size => $size, + Index => $index, + ); + $pos += $size; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process Audible 'cvrx' cover art atom from M4B files (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessAudible_cvrx($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $dirLen = length $$dataPt; + return 0 if 0x0a > $dirLen; + my $len = Get16u($dataPt, 0x08); + return 0 if 0x0a + $len + 6 > $dirLen; + my $size = Get32u($dataPt, 0x0a + $len + 2); + return 0 if 0x0a + $len + 6 + $size > $dirLen; + $et->VerboseDir('Audible_cvrx', undef, $dirLen); + $et->HandleTag($tagTablePtr, 'CoverArtType', undef, + DataPt => $dataPt, + DataPos => $dataPos, + Start => 0x0a, + Size => $len, + ); + $et->HandleTag($tagTablePtr, 'CoverArt', undef, + DataPt => $dataPt, + DataPos => $dataPos, + Start => 0x0a + $len + 6, + Size => $size, + ); + return 1; +} + +#------------------------------------------------------------------------------ +# Read information from an Audible .AA file +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid AA file +sub ProcessAA($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $toc, $entry, $i); + + # check magic number + return 0 unless $raf->Read($buff, 16) == 16 and $buff=~/^.{4}\x57\x90\x75\x36/s; + # check file size + if (defined $$et{VALUE}{FileSize}) { + # first 4 bytes of the file should be the filesize + unpack('N', $buff) == $$et{VALUE}{FileSize} or return 0; + } + $et->SetFileType(); + SetByteOrder('MM'); + my $bytes = 12 * Get32u(\$buff, 8); # table of contents size in bytes + $bytes > 0xc00 and $et->Warn('Invalid TOC'), return 1; + # read the table of contents + $raf->Read($toc, $bytes) == $bytes or $et->Warn('Truncated TOC'), return 1; + my $tagTablePtr = GetTagTable('Image::ExifTool::Audible::Main'); + # parse table of contents (in $toc) + for ($entry=0; $entry<$bytes; $entry+=12) { + my $type = Get32u(\$toc, $entry); + next unless $type == 2 or $type == 6 or $type == 11; + my $offset = Get32u(\$toc, $entry + 4); + my $length = Get32u(\$toc, $entry + 8) or next; + $raf->Seek($offset, 0) or $et->Warn("Chunk $type seek error"), last; + if ($type == 6) { # offset table + next if $length < 4 or $raf->Read($buff, 4) != 4; # only read the chapter count + $et->HandleTag($tagTablePtr, '_chapter_count', Get32u(\$buff, 0)); + next; + } + # read the chunk + $length > 100000000 and $et->Warn("Chunk $type too big"), next; + $raf->Read($buff, $length) == $length or $et->Warn("Chunk $type read error"), last; + if ($type == 11) { # cover art + next if $length < 8; + my $len = Get32u(\$buff, 0); + my $off = Get32u(\$buff, 4); + next if $off < $offset + 8 or $off - $offset + $len > $length; + $et->HandleTag($tagTablePtr, '_cover_art', substr($buff, $off-$offset, $len)); + next; + } + # parse metadata dictionary (in $buff) + $length < 4 and $et->Warn('Bad dictionary'), next; + my $num = Get32u(\$buff, 0); + $num > 0x200 and $et->Warn('Bad dictionary count'), next; + my $pos = 4; # dictionary starts immediately after count + require Image::ExifTool::HTML; # (for UnescapeHTML) + $et->VerboseDir('Audible Metadata', $num); + for ($i=0; $i<$num; ++$i) { + my $tagPos = $pos + 9; # position of tag string + $tagPos > $length and $et->Warn('Truncated dictionary'), last; + # (1 unknown byte ignored at start of each dictionary entry) + my $tagLen = Get32u(\$buff, $pos + 1); # tag string length + my $valLen = Get32u(\$buff, $pos + 5); # value string length + my $valPos = $tagPos + $tagLen; # position of value string + my $nxtPos = $valPos + $valLen; # position of next entry + $nxtPos > $length and $et->Warn('Bad dictionary entry'), last; + my $tag = substr($buff, $tagPos, $tagLen); + my $val = substr($buff, $valPos, $valLen); + unless ($$tagTablePtr{$tag}) { + my $name = Image::ExifTool::MakeTagName($tag); + $name =~ s/_(.)/\U$1/g; # change from underscore-separated to mixed case + AddTagToTable($tagTablePtr, $tag, { Name => $name }); + } + # unescape HTML character references and convert from UTF-8 + $val = $et->Decode(Image::ExifTool::HTML::UnescapeHTML($val), 'UTF8'); + $et->HandleTag($tagTablePtr, $tag, $val, + DataPos => $offset, + DataPt => \$buff, + Start => $valPos, + Size => $valLen, + Index => $i, + ); + $pos = $nxtPos; # step to next dictionary entry + } + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Audible - Read meta information from Audible audio books + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read meta +information from Audible audio books. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L + +=item L + +=item L + +=back + +=head1 SEE ALSO + +L, +L + +=cut + diff --git a/lib/Image/ExifTool/BMP.pm b/lib/Image/ExifTool/BMP.pm new file mode 100644 index 0000000..5244f7a --- /dev/null +++ b/lib/Image/ExifTool/BMP.pm @@ -0,0 +1,361 @@ +#------------------------------------------------------------------------------ +# File: BMP.pm +# +# Description: Read BMP meta information +# +# Revisions: 07/16/2005 - P. Harvey Created +# +# References: 1) http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html +# 2) http://www.fourcc.org/rgb.php +# 3) https://msdn.microsoft.com/en-us/library/dd183381(v=vs.85).aspx +#------------------------------------------------------------------------------ + +package Image::ExifTool::BMP; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.09'; + +# conversions for fixed-point 2.30 format values +my %fixed2_30 = ( + ValueConv => q{ + my @a = split ' ', $val; + $_ /= 0x40000000 foreach @a; + "@a"; + }, + PrintConv => q{ + my @a = split ' ', $val; + $_ = sprintf('%.6f', $_) foreach @a; + "@a"; + }, +); + +# BMP chunks +%Image::ExifTool::BMP::Main = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + NOTES => q{ + There really isn't much meta information in a BMP file as such, just a bit + of image related information. + }, + 0 => { + Name => 'BMPVersion', + Format => 'int32u', + Notes => q{ + this is actually the size of the BMP header, but used to determine the BMP + version + }, + RawConv => '$$self{BMPVersion} = $val', + PrintConv => { + 40 => 'Windows V3', + 68 => 'AVI BMP structure?', #PH (seen in AVI movies from some Casio and Nikon cameras) + 108 => 'Windows V4', + 124 => 'Windows V5', + }, + }, + 4 => { + Name => 'ImageWidth', + Format => 'int32u', + }, + 8 => { + Name => 'ImageHeight', + Format => 'int32s', # (negative when stored in top-to-bottom order) + ValueConv => 'abs($val)', + }, + 12 => { + Name => 'Planes', + Format => 'int16u', + # values: 0,1,4,8,16,24,32 + }, + 14 => { + Name => 'BitDepth', + Format => 'int16u', + }, + 16 => { + Name => 'Compression', + Format => 'int32u', + RawConv => '$$self{BMPCompression} = $val', + # (formatted as string[4] for some values in AVI images) + ValueConv => '$val > 256 ? unpack("A4",pack("V",$val)) : $val', + PrintConv => { + 0 => 'None', + 1 => '8-Bit RLE', + 2 => '4-Bit RLE', + 3 => 'Bitfields', + 4 => 'JPEG', #2 + 5 => 'PNG', #2 + # pass through ASCII video compression codec ID's + OTHER => sub { + my $val = shift; + # convert non-ascii characters + $val =~ s/([\0-\x1f\x7f-\xff])/sprintf('\\x%.2x',ord $1)/eg; + return $val; + }, + }, + }, + 20 => { + Name => 'ImageLength', + Format => 'int32u', + RawConv => '$$self{BMPImageLength} = $val', + }, + 24 => { + Name => 'PixelsPerMeterX', + Format => 'int32u', + }, + 28 => { + Name => 'PixelsPerMeterY', + Format => 'int32u', + }, + 32 => { + Name => 'NumColors', + Format => 'int32u', + PrintConv => '$val ? $val : "Use BitDepth"', + }, + 36 => { + Name => 'NumImportantColors', + Format => 'int32u', + Hook => '$varSize += $size if $$self{BMPVersion} == 68', # (the rest is invalid for AVI BMP's) + PrintConv => '$val ? $val : "All"', + }, + 40 => { + Name => 'RedMask', + Format => 'int32u', + PrintConv => 'sprintf("0x%.8x",$val)', + }, + 44 => { + Name => 'GreenMask', + Format => 'int32u', + PrintConv => 'sprintf("0x%.8x",$val)', + }, + 48 => { + Name => 'BlueMask', + Format => 'int32u', + PrintConv => 'sprintf("0x%.8x",$val)', + }, + 52 => { + Name => 'AlphaMask', + Format => 'int32u', + PrintConv => 'sprintf("0x%.8x",$val)', + }, + 56 => { + Name => 'ColorSpace', + Format => 'undef[4]', + RawConv => '$$self{BMPColorSpace} = $val =~ /\0/ ? Get32u(\$val, 0) : pack("N",unpack("V",$val))', + PrintConv => { + 0 => 'Calibrated RGB', + 1 => 'Device RGB', + 2 => 'Device CMYK', + LINK => 'Linked Color Profile', + MBED => 'Embedded Color Profile', + sRGB => 'sRGB', + 'Win ' => 'Windows Color Space', + }, + }, + 60 => { + Name => 'RedEndpoint', + Condition => '$$self{BMPColorSpace} eq "0"', + Format => 'int32u[3]', + %fixed2_30, + }, + 72 => { + Name => 'GreenEndpoint', + Condition => '$$self{BMPColorSpace} eq "0"', + Format => 'int32u[3]', + %fixed2_30, + }, + 84 => { + Name => 'BlueEndpoint', + Condition => '$$self{BMPColorSpace} eq "0"', + Format => 'int32u[3]', + %fixed2_30, + }, + 96 => { + Name => 'GammaRed', + Condition => '$$self{BMPColorSpace} eq "0"', + Format => 'fixed32u', + }, + 100 => { + Name => 'GammaGreen', + Condition => '$$self{BMPColorSpace} eq "0"', + Format => 'fixed32u', + }, + 104 => { + Name => 'GammaBlue', + Condition => '$$self{BMPColorSpace} eq "0"', + Format => 'fixed32u', + }, + 108 => { + Name => 'RenderingIntent', + Format => 'int32u', + PrintConv => { + 1 => 'Graphic (LCS_GM_BUSINESS)', + 2 => 'Proof (LCS_GM_GRAPHICS)', + 4 => 'Picture (LCS_GM_IMAGES)', + 8 => 'Absolute Colorimetric (LCS_GM_ABS_COLORIMETRIC)', + }, + }, + 112 => { + Name => 'ProfileDataOffset', + Condition => '$$self{BMPColorSpace} eq "LINK" or $$self{BMPColorSpace} eq "MBED"', + Format => 'int32u', + RawConv => '$$self{BMPProfileOffset} = $val', + }, + 116 => { + Name => 'ProfileSize', + Condition => '$$self{BMPColorSpace} eq "LINK" or $$self{BMPColorSpace} eq "MBED"', + Format => 'int32u', + RawConv => '$$self{BMPProfileSize} = $val', + }, + # 120 - reserved +); + +# OS/2 12-byte bitmap header (ref http://www.fileformat.info/format/bmp/egff.htm) +%Image::ExifTool::BMP::OS2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + NOTES => 'Information extracted from OS/2-format BMP images.', + 0 => { + Name => 'BMPVersion', + Format => 'int32u', + Notes => 'again, the header size is used to determine the BMP version', + PrintConv => { + 12 => 'OS/2 V1', + 64 => 'OS/2 V2', + }, + }, + 4 => { Name => 'ImageWidth', Format => 'int16u' }, + 6 => { Name => 'ImageHeight', Format => 'int16u' }, + 8 => { Name => 'Planes', Format => 'int16u' }, + 10 => { Name => 'BitDepth', Format => 'int16u' }, +); + +%Image::ExifTool::BMP::Extra = ( + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + NOTES => 'Extra information extracted from some BMP images.', + VARS => { NO_ID => 1 }, + LinkedProfileName => { }, + ICC_Profile => { SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' } }, + EmbeddedJPG => { + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + EmbeddedPNG => { + Groups => { 2 => 'Preview' }, + Binary => 1, + }, +); + +#------------------------------------------------------------------------------ +# Extract EXIF information from a BMP image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid BMP file +sub ProcessBMP($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $tagTablePtr); + + # verify this is a valid BMP file + return 0 unless $raf->Read($buff, 18) == 18; + return 0 unless $buff =~ /^BM/; + SetByteOrder('II'); + my $len = Get32u(\$buff, 14); + # len = v1:12, v4:108, v5:124 + return 0 unless $len == 12 or $len == 16 or ($len >= 40 and $len < 1000000); + return 0 unless $raf->Seek(-4, 1) and $raf->Read($buff, $len) == $len; + $et->SetFileType(); # set the FileType tag +# +# process the BMP header +# + my %dirInfo = ( + DataPt => \$buff, + DirStart => 0, + DirLen => length($buff), + ); + if ($len == 12 or $len == 16 or $len == 64) { # old OS/2 format BMP + $tagTablePtr = GetTagTable('Image::ExifTool::BMP::OS2'); + } else { + $tagTablePtr = GetTagTable('Image::ExifTool::BMP::Main'); + } + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); +# +# extract any embedded images +# + my $extraTable = GetTagTable('Image::ExifTool::BMP::Extra'); + if ($$et{BMPCompression} and $$et{BMPImageLength} and + ($$et{BMPCompression} == 4 or $$et{BMPCompression} == 5)) + { + my $tag = $$et{BMPCompression} == 4 ? 'EmbeddedJPG' : 'EmbeddedPNG'; + my $val = $et->ExtractBinary($raf->Tell(), $$et{BMPImageLength}, $tag); + if ($val) { + $et->HandleTag($extraTable, $tag, $val); + } + } +# +# process profile data if it exists (v5 header only) +# + if ($len == 124 and $$et{BMPProfileOffset}) { + my $pos = $$et{BMPProfileOffset} + 14; # (note the 14-byte shift!) + my $size = $$et{BMPProfileSize}; + if ($raf->Seek($pos, 0) and $raf->Read($buff, $size) == $size) { + my $tag; + if ($$et{BMPColorSpace} eq 'LINK') { + $buff =~ s/\0+$//; # remove null terminator(s) + $buff = $et->Decode($buff, 'Latin'); # convert from Latin + $tag = 'LinkedProfileName'; + } else { + $tag = 'ICC_Profile'; + } + $et->HandleTag($extraTable, $tag => $buff, Size => $size, DataPos => $pos); + } else { + $et->Warn('Error loading profile data', 1); + } + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::BMP - Read BMP meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read BMP +(Windows Bitmap) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L + +=item L + +=item L + +=back + +=head1 SEE ALSO + +L, +L + +=cut + diff --git a/lib/Image/ExifTool/BPG.pm b/lib/Image/ExifTool/BPG.pm new file mode 100644 index 0000000..4d2c91a --- /dev/null +++ b/lib/Image/ExifTool/BPG.pm @@ -0,0 +1,253 @@ +#------------------------------------------------------------------------------ +# File: BPG.pm +# +# Description: Read BPG meta information +# +# Revisions: 2016-07-05 - P. Harvey Created +# +# References: 1) http://bellard.org/bpg/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::BPG; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.01'; + +# BPG information +%Image::ExifTool::BPG::Main = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + NOTES => q{ + The information listed below is extracted from BPG (Better Portable + Graphics) images. See L for the specification. + }, + 4 => { + Name => 'PixelFormat', + Format => 'int16u', + Mask => 0xe000, + PrintConv => { + 0 => 'Grayscale', + 1 => '4:2:0 (chroma at 0.5, 0.5)', + 2 => '4:2:2 (chroma at 0.5, 0)', + 3 => '4:4:4', + 4 => '4:2:0 (chroma at 0, 0.5)', + 5 => '4:2:2 (chroma at 0, 0)', + }, + }, + 4.1 => { + Name => 'Alpha', + Format => 'int16u', + Mask => 0x1004, + BitShift => 0, + PrintHex => 1, + PrintConv => { + 0x0000 => 'No Alpha Plane', + 0x1000 => 'Alpha Exists (color not premultiplied)', + 0x1004 => 'Alpha Exists (color premultiplied)', + 0x0004 => 'Alpha Exists (W color component)', + }, + }, + 4.2 => { + Name => 'BitDepth', + Format => 'int16u', + Mask => 0x0f00, + ValueConv => '$val + 8', + }, + 4.3 => { + Name => 'ColorSpace', + Format => 'int16u', + Mask => 0x00f0, + PrintConv => { + 0 => 'YCbCr (BT 601)', + 1 => 'RGB', + 2 => 'YCgCo', + 3 => 'YCbCr (BT 709)', + 4 => 'YCbCr (BT 2020)', + 5 => 'BT 2020 Constant Luminance', + }, + }, + 4.4 => { + Name => 'Flags', + Format => 'int16u', + Mask => 0x000b, + PrintConv => { BITMASK => { + 0 => 'Animation', + 1 => 'Limited Range', + 3 => 'Extension Present', + }}, + }, + 6 => { Name => 'ImageWidth', Format => 'var_ue7' }, + 7 => { Name => 'ImageHeight', Format => 'var_ue7' }, + # length of image data or 0 to EOF + # (must be decoded so we know where the extension data starts) + 8 => { Name => 'ImageLength', Format => 'var_ue7' }, +); + +%Image::ExifTool::BPG::Extensions = ( + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + VARS => { ALPHA_FIRST => 1 }, + 1 => { + Name => 'EXIF', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + }, + }, + 2 => { + Name => 'ICC_Profile', + SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' }, + }, + 3 => { + Name => 'XMP', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, + 4 => { + Name => 'ThumbnailBPG', + Binary => 1, + }, + 5 => { + Name => 'AnimationControl', + Binary => 1, + Unknown => 1, + }, +); + +#------------------------------------------------------------------------------ +# Get ue7 integer from binary data (max 32 bits) +# Inputs: 0) data ref, 1) location in data (undef for 0) +# Returns: 0) ue7 as integer or undef on error, 1) length of ue7 in bytes +sub Get_ue7($;$) +{ + my $dataPt = shift; + my $pos = shift || 0; + my $size = length $$dataPt; + my $val = 0; + my $i; + for ($i=0; ; ) { + return() if $pos+$i >= $size or $i >= 5; + my $byte = Get8u($dataPt, $pos + $i); + $val = ($val << 7) | ($byte & 0x7f); + unless ($byte & 0x80) { + return() if $i == 4 and $byte & 0x70; # error if bits 32-34 are set + last; # this was the last byte + } + return() if $i == 0 and $byte == 0x80; # error if first byte is 0x80 + ++$i; # step to the next byte + } + return($val, $i+1); +} + +#------------------------------------------------------------------------------ +# Extract EXIF information from a BPG image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid BPG file +sub ProcessBPG($$) +{ + local $_; + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $size, $n, $len, $pos); + + # verify this is a valid BPG file + return 0 unless $raf->Read($buff, 21) == 21; # (21 bytes is maximum header length) + return 0 unless $buff =~ /^BPG\xfb/; + $et->SetFileType(); # set the FileType tag + + SetByteOrder('MM'); + my %dirInfo = ( + DataPt => \$buff, + DirStart => 0, + DirLen => length($buff), + VarFormatData => [ ], + ); + $et->ProcessDirectory(\%dirInfo, GetTagTable('Image::ExifTool::BPG::Main')); + + return 1 unless $$et{VALUE}{Flags} & 0x0008; # all done unless extension flag is set + + # add varSize from last entry in VarFormatData to determine + # the current read position in the file + my $dataPos = 9 + $dirInfo{VarFormatData}[-1][1]; + # read extension length + unless ($raf->Seek($dataPos, 0) and $raf->Read($buff, 5) == 5) { + $et->Warn('Missing BPG extension data'); + return 1; + } + ($size, $n) = Get_ue7(\$buff); + defined $size or $et->Warn('Corrupted BPG extension length'), return 1; + $dataPos += $n; + $size > 10000000 and $et->Warn('BPG extension is too large'), return 1; + unless ($raf->Seek($dataPos, 0) and $raf->Read($buff, $size) == $size) { + $et->Warn('Truncated BPG extension'); + return 1; + } + my $tagTablePtr = GetTagTable('Image::ExifTool::BPG::Extensions'); + # loop through the individual extensions + for ($pos=0; $pos<$size; $pos+=$len) { + my $type = Get8u(\$buff, $pos); + # get length of this extension + ($len, $n) = Get_ue7(\$buff, ++$pos); + defined $len or $et->Warn('Corrupted BPG extension'), last; + $pos += $n; # point to start of data for this extension + $pos + $len > $size and $et->Warn('Invalid BPG extension size'), last; + $$tagTablePtr{$type} or $et->Warn("Unrecognized BPG extension $type ($len bytes)", 1), next; + # libbpg (in my opinion) incorrectly copies the padding byte after the + # "EXIF\0" APP1 header to the start of the BPG EXIF extension, so issue a + # minor warning and ignore the padding if we find it before the TIFF header + if ($type == 1 and $len > 3 and substr($buff,$pos,3)=~/^.(II|MM)/s) { + $et->Warn("Ignored extra byte at start of EXIF extension", 1); + ++$pos; + --$len; + } + $et->HandleTag($tagTablePtr, $type, undef, + DataPt => \$buff, + DataPos => $dataPos, + Start => $pos, + Size => $len, + Parent => 'BPG', + ); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::BPG - Read BPG meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read BPG +(Better Portable Graphics) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L + +=back + +=head1 SEE ALSO + +L, +L + +=cut + diff --git a/lib/Image/ExifTool/BZZ.pm b/lib/Image/ExifTool/BZZ.pm new file mode 100644 index 0000000..d1baae1 --- /dev/null +++ b/lib/Image/ExifTool/BZZ.pm @@ -0,0 +1,472 @@ +#------------------------------------------------------------------------------ +# File: BZZ.pm +# +# Description: Utility to decode BZZ compressed data +# +# Revisions: 09/22/2008 - P. Harvey Created +# +# References: 1) http://djvu.sourceforge.net/ +# 2) http://www.djvu.org/ +# +# Notes: This code based on ZPCodec and BSByteStream of DjVuLibre 3.5.21 +# (see NOTES documentation below for license/copyright details) +#------------------------------------------------------------------------------ + +package Image::ExifTool::BZZ; + +use strict; +use integer; # IMPORTANT!! use integer arithmetic throughout +require Exporter; +use vars qw($VERSION @ISA @EXPORT_OK); + +$VERSION = '1.00'; +@ISA = qw(Exporter); +@EXPORT_OK = qw(Decode); + +# constants +sub FREQMAX { 4 } +sub CTXIDS { 3 } +sub MAXBLOCK { 4096 } + +# This table has been designed for the ZPCoder +# by running the following command in file 'zptable.sn': +# (fast-crude (steady-mat 0.0035 0.0002) 260))) +my @default_ztable_p = ( + 0x8000, 0x8000, 0x8000, 0x6bbd, 0x6bbd, 0x5d45, 0x5d45, 0x51b9, 0x51b9, 0x4813, + 0x4813, 0x3fd5, 0x3fd5, 0x38b1, 0x38b1, 0x3275, 0x3275, 0x2cfd, 0x2cfd, 0x2825, + 0x2825, 0x23ab, 0x23ab, 0x1f87, 0x1f87, 0x1bbb, 0x1bbb, 0x1845, 0x1845, 0x1523, + 0x1523, 0x1253, 0x1253, 0x0fcf, 0x0fcf, 0x0d95, 0x0d95, 0x0b9d, 0x0b9d, 0x09e3, + 0x09e3, 0x0861, 0x0861, 0x0711, 0x0711, 0x05f1, 0x05f1, 0x04f9, 0x04f9, 0x0425, + 0x0425, 0x0371, 0x0371, 0x02d9, 0x02d9, 0x0259, 0x0259, 0x01ed, 0x01ed, 0x0193, + 0x0193, 0x0149, 0x0149, 0x010b, 0x010b, 0x00d5, 0x00d5, 0x00a5, 0x00a5, 0x007b, + 0x007b, 0x0057, 0x0057, 0x003b, 0x003b, 0x0023, 0x0023, 0x0013, 0x0013, 0x0007, + 0x0007, 0x0001, 0x0001, 0x5695, 0x24ee, 0x8000, 0x0d30, 0x481a, 0x0481, 0x3579, + 0x017a, 0x24ef, 0x007b, 0x1978, 0x0028, 0x10ca, 0x000d, 0x0b5d, 0x0034, 0x078a, + 0x00a0, 0x050f, 0x0117, 0x0358, 0x01ea, 0x0234, 0x0144, 0x0173, 0x0234, 0x00f5, + 0x0353, 0x00a1, 0x05c5, 0x011a, 0x03cf, 0x01aa, 0x0285, 0x0286, 0x01ab, 0x03d3, + 0x011a, 0x05c5, 0x00ba, 0x08ad, 0x007a, 0x0ccc, 0x01eb, 0x1302, 0x02e6, 0x1b81, + 0x045e, 0x24ef, 0x0690, 0x2865, 0x09de, 0x3987, 0x0dc8, 0x2c99, 0x10ca, 0x3b5f, + 0x0b5d, 0x5695, 0x078a, 0x8000, 0x050f, 0x24ee, 0x0358, 0x0d30, 0x0234, 0x0481, + 0x0173, 0x017a, 0x00f5, 0x007b, 0x00a1, 0x0028, 0x011a, 0x000d, 0x01aa, 0x0034, + 0x0286, 0x00a0, 0x03d3, 0x0117, 0x05c5, 0x01ea, 0x08ad, 0x0144, 0x0ccc, 0x0234, + 0x1302, 0x0353, 0x1b81, 0x05c5, 0x24ef, 0x03cf, 0x2b74, 0x0285, 0x201d, 0x01ab, + 0x1715, 0x011a, 0x0fb7, 0x00ba, 0x0a67, 0x01eb, 0x06e7, 0x02e6, 0x0496, 0x045e, + 0x030d, 0x0690, 0x0206, 0x09de, 0x0155, 0x0dc8, 0x00e1, 0x2b74, 0x0094, 0x201d, + 0x0188, 0x1715, 0x0252, 0x0fb7, 0x0383, 0x0a67, 0x0547, 0x06e7, 0x07e2, 0x0496, + 0x0bc0, 0x030d, 0x1178, 0x0206, 0x19da, 0x0155, 0x24ef, 0x00e1, 0x320e, 0x0094, + 0x432a, 0x0188, 0x447d, 0x0252, 0x5ece, 0x0383, 0x8000, 0x0547, 0x481a, 0x07e2, + 0x3579, 0x0bc0, 0x24ef, 0x1178, 0x1978, 0x19da, 0x2865, 0x24ef, 0x3987, 0x320e, + 0x2c99, 0x432a, 0x3b5f, 0x447d, 0x5695, 0x5ece, 0x8000, 0x8000, 0x5695, 0x481a, + 0x481a, 0, 0, 0, 0, 0 +); +my @default_ztable_m = ( + 0x0000, 0x0000, 0x0000, 0x10a5, 0x10a5, 0x1f28, 0x1f28, 0x2bd3, 0x2bd3, 0x36e3, + 0x36e3, 0x408c, 0x408c, 0x48fd, 0x48fd, 0x505d, 0x505d, 0x56d0, 0x56d0, 0x5c71, + 0x5c71, 0x615b, 0x615b, 0x65a5, 0x65a5, 0x6962, 0x6962, 0x6ca2, 0x6ca2, 0x6f74, + 0x6f74, 0x71e6, 0x71e6, 0x7404, 0x7404, 0x75d6, 0x75d6, 0x7768, 0x7768, 0x78c2, + 0x78c2, 0x79ea, 0x79ea, 0x7ae7, 0x7ae7, 0x7bbe, 0x7bbe, 0x7c75, 0x7c75, 0x7d0f, + 0x7d0f, 0x7d91, 0x7d91, 0x7dfe, 0x7dfe, 0x7e5a, 0x7e5a, 0x7ea6, 0x7ea6, 0x7ee6, + 0x7ee6, 0x7f1a, 0x7f1a, 0x7f45, 0x7f45, 0x7f6b, 0x7f6b, 0x7f8d, 0x7f8d, 0x7faa, + 0x7faa, 0x7fc3, 0x7fc3, 0x7fd7, 0x7fd7, 0x7fe7, 0x7fe7, 0x7ff2, 0x7ff2, 0x7ffa, + 0x7ffa, 0x7fff, 0x7fff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +); +my @default_ztable_up = ( + 84, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 81, 82, 9, 86, 5, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 82, 99, 76, 101, 70, 103, 66, 105, 106, 107, 66, 109, 60, 111, 56, 69, + 114, 65, 116, 61, 118, 57, 120, 53, 122, 49, 124, 43, 72, 39, 60, 33, + 56, 29, 52, 23, 48, 23, 42, 137, 38, 21, 140, 15, 142, 9, 144, 141, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 70, 157, 66, 81, 62, 75, + 58, 69, 54, 65, 50, 167, 44, 65, 40, 59, 34, 55, 30, 175, 24, 177, + 178, 179, 180, 181, 182, 183, 184, 69, 186, 59, 188, 55, 190, 51, 192, 47, + 194, 41, 196, 37, 198, 199, 72, 201, 62, 203, 58, 205, 54, 207, 50, 209, + 46, 211, 40, 213, 36, 215, 30, 217, 26, 219, 20, 71, 14, 61, 14, 57, + 8, 53, 228, 49, 230, 45, 232, 39, 234, 35, 138, 29, 24, 25, 240, 19, + 22, 13, 16, 13, 10, 7, 244, 249, 10, 89, 230, 0, 0, 0, 0, 0 +); +my @default_ztable_dn = ( + 145, 4, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 85, 226, 6, 176, 143, 138, 141, 112, 135, 104, 133, 100, 129, + 98, 127, 72, 125, 102, 123, 60, 121, 110, 119, 108, 117, 54, 115, 48, 113, + 134, 59, 132, 55, 130, 51, 128, 47, 126, 41, 62, 37, 66, 31, 54, 25, + 50, 131, 46, 17, 40, 15, 136, 7, 32, 139, 172, 9, 170, 85, 168, 248, + 166, 247, 164, 197, 162, 95, 160, 173, 158, 165, 156, 161, 60, 159, 56, 71, + 52, 163, 48, 59, 42, 171, 38, 169, 32, 53, 26, 47, 174, 193, 18, 191, + 222, 189, 218, 187, 216, 185, 214, 61, 212, 53, 210, 49, 208, 45, 206, 39, + 204, 195, 202, 31, 200, 243, 64, 239, 56, 237, 52, 235, 48, 233, 44, 231, + 38, 229, 34, 227, 28, 225, 22, 223, 16, 221, 220, 63, 8, 55, 224, 51, + 2, 47, 87, 43, 246, 37, 244, 33, 238, 27, 236, 21, 16, 15, 8, 241, + 242, 7, 10, 245, 2, 1, 83, 250, 2, 143, 246, 0, 0, 0, 0, 0 +); + +#------------------------------------------------------------------------------ +# New - create new BZZ object +# Inputs: 0) reference to BZZ object or BZZ class name +# Returns: blessed BZZ object ref +sub new +{ + local $_; + my $that = shift; + my $class = ref($that) || $that || 'Image::ExifTool::BZZ'; + return bless {}, $class; +} + +#------------------------------------------------------------------------------ +# Initialize BZZ object +# Inputs: 0) BZZ object ref, 1) data ref, 2) true for DjVu compatibility +sub Init($$) +{ + my ($self, $dataPt, $djvucompat) = @_; + # Create machine independent ffz table + my $ffzt = $$self{ffzt} = [ ]; + my ($i, $j); + for ($i=0; $i<256; $i++) { + $$ffzt[$i] = 0; + for ($j=$i; $j&0x80; $j<<=1) { + $$ffzt[$i] += 1; + } + } + # Initialize table + $$self{p} = [ @default_ztable_p ]; + $$self{'m'} = [ @default_ztable_m ]; + $$self{up} = [ @default_ztable_up ]; + $$self{dn} = [ @default_ztable_dn ]; + # Patch table (and lose DjVu compatibility) + unless ($djvucompat) { + my ($p, $m, $dn) = ($$self{p}, $$self{'m'}, $$self{dn}); + for ($j=0; $j<256; $j++) { + my $a = (0x10000 - $$p[$j]) & 0xffff; + while ($a >= 0x8000) { $a = ($a<<1) & 0xffff } + if ($$m[$j]>0 && $a+$$p[$j]>=0x8000 && $a>=$$m[$j]) { + $$dn[$j] = $default_ztable_dn[$default_ztable_dn[$j]]; + } + } + } + $$self{ctx} = [ (0) x 300 ]; + $$self{DataPt} = $dataPt; + $$self{Pos} = 0; + $$self{DataLen} = length $$dataPt; + $$self{a} = 0; + $$self{buffer} = 0; + $$self{fence} = 0; + $$self{blocksize} = 0; + # Read first 16 bits of code + if (length($$dataPt) >= 2) { + $$self{code} = unpack('n', $$dataPt); + $$self{Pos} += 2; + } elsif (length($$dataPt) >= 1) { + $$self{code} = (unpack('C', $$dataPt) << 8) | 0xff; + $$self{Pos}++; + } else { + $$self{code} = 0xffff; + } + $$self{byte} = $$self{code} & 0xff; + # Preload buffer + $$self{delay} = 25; + $$self{scount} = 0; + # Compute initial fence + $$self{fence} = $$self{code} >= 0x8000 ? 0x7fff : $$self{code}; +} + +#------------------------------------------------------------------------------ +# Decode data block +# Inputs: 0) optional BZZ object ref, 1) optional data ref +# Returns: decoded data or undefined on error +# Notes: If called without a data ref, an input BZZ object ref must be given and +# the BZZ object must have been initialized by a previous call to Init() +sub Decode($;$) +{ + # Decode input stream + local $_; + my $self; + if (ref $_[0] and UNIVERSAL::isa($_[0],'Image::ExifTool::BZZ')) { + $self = shift; + } else { + $self = new Image::ExifTool::BZZ; + } + my $dataPt = shift; + if ($dataPt) { + $self->Init($dataPt, 1); + } else { + $dataPt = $$self{DataPt} or return undef; + } + # Decode block size + my $n = 1; + my $m = (1 << 24); + while ($n < $m) { + my $b = $self->decode_sub(0x8000 + ($$self{a}>>1)); + $n = ($n<<1) | $b; + } + $$self{size} = $n - $m; + + return '' unless $$self{size}; + return undef if $$self{size} > MAXBLOCK()*1024; + # Allocate + if ($$self{blocksize} < $$self{size}) { + $$self{blocksize} = $$self{size}; + } + # Decode Estimation Speed + my $fshift = 0; + if ($self->decode_sub(0x8000 + ($$self{a}>>1))) { + $fshift += 1; + $fshift += 1 if $self->decode_sub(0x8000 + ($$self{a}>>1)); + } + # Prepare Quasi MTF + my @mtf = (0..255); + my @freq = (0) x FREQMAX(); + my $fadd = 4; + # Decode + my $mtfno = 3; + my $markerpos = -1; + my $cx = $$self{ctx}; + my ($i, @dat); +byte: for ($i=0; $i<$$self{size}; $i++) { + # dummy loop avoids use of "goto" statement +dummy: for (;;) { + my $ctxid = CTXIDS() - 1; + $ctxid = $mtfno if $ctxid > $mtfno; + my $cp = 0; + my ($imtf, $bits); + for ($imtf=0; $imtf<2; ++$imtf) { + if ($self->decoder($$cx[$cp+$ctxid])) { + $mtfno = $imtf; + $dat[$i] = $mtf[$mtfno]; + # (a "goto" here could give a segfault due to a Perl bug) + last dummy; # do rotation + } + $cp += CTXIDS(); + } + for ($bits=1; $bits<8; ++$bits, $imtf<<=1) { + if ($self->decoder($$cx[$cp])) { + my $n = 1; + my $m = (1 << $bits); + while ($n < $m) { + my $b = $self->decoder($$cx[$cp+$n]); + $n = ($n<<1) | $b; + } + $mtfno = $imtf + $n - $m; + $dat[$i] = $mtf[$mtfno]; + last dummy; # do rotation + } + $cp += $imtf; + } + $mtfno=256; + $dat[$i] = 0; + $markerpos=$i; + next byte; # no rotation necessary + } + # Rotate mtf according to empirical frequencies (new!) + # Adjust frequencies for overflow + $fadd = $fadd + ($fadd >> $fshift); + if ($fadd > 0x10000000) { + $fadd >>= 24; + $_ >>= 24 foreach @freq; + } + # Relocate new char according to new freq + my $fc = $fadd; + $fc += $freq[$mtfno] if $mtfno < FREQMAX(); + my $k; + for ($k=$mtfno; $k>=FREQMAX(); $k--) { + $mtf[$k] = $mtf[$k-1]; + } + for (; $k>0 && $fc>=$freq[$k-1]; $k--) { + $mtf[$k] = $mtf[$k-1]; + $freq[$k] = $freq[$k-1]; + } + $mtf[$k] = $dat[$i]; + $freq[$k] = $fc; + # when "goto" was used, Perl 5.8.6 could segfault here + # unless "next" was explicitly stated + } +# +# Reconstruct the string +# + return undef if $markerpos<1 || $markerpos>=$$self{size}; + # Allocate pointers + # Prepare count buffer + my @count = (0) x 256; + my @posn; + # Fill count buffer + no integer; + for ($i=0; $i<$markerpos; $i++) { + my $c = $dat[$i]; + $posn[$i] = ($c<<24) | ($count[$c]++ & 0xffffff); + } + $posn[$i++] = 0; # (initialize marker entry just to be safe) + for ( ; $i<$$self{size}; $i++) { + my $c = $dat[$i]; + $posn[$i] = ($c<<24) | ($count[$c]++ & 0xffffff); + } + use integer; + # Compute sorted char positions + my $last = 1; + for ($i=0; $i<256; $i++) { + my $tmp = $count[$i]; + $count[$i] = $last; + $last += $tmp; + } + # Undo the sort transform + $i = 0; + $last = $$self{size}-1; + while ($last > 0) { + my $n = $posn[$i]; + no integer; + my $c = $n >> 24; + use integer; + $dat[--$last] = $c; + $i = $count[$c] + ($n & 0xffffff); + } + # Final check and return decoded data + return undef if $i != $markerpos; + pop @dat; # (last byte isn't real) + return pack 'C*', @dat; +} + +#------------------------------------------------------------------------------ +# Inputs: 0) BZZ object ref, 1) ctx +# Returns: decoded bit +sub decoder($$) +{ + my ($self, $ctx) = @_; + my $z = $$self{a} + $self->{p}[$ctx]; + if ($z <= $$self{fence}) { + $$self{a} = $z; + return ($ctx & 1); + } + # must pass $_[1] so subroutine can modify value (darned C++ pass-by-reference!) + return $self->decode_sub($z, $_[1]); +} + +#------------------------------------------------------------------------------ +# Inputs: 0) BZZ object ref, 1) z, 2) ctx (or undef) +# Returns: decoded bit +sub decode_sub($$;$) +{ + my ($self, $z, $ctx) = @_; + + # ensure that we have at least 16 bits of encoded data available + if ($$self{scount} < 16) { + # preload byte by byte until we have at least 24 bits + while ($$self{scount} <= 24) { + if ($$self{Pos} < $$self{DataLen}) { + $$self{byte} = ord(substr(${$$self{DataPt}}, $$self{Pos}, 1)); + ++$$self{Pos}; + } else { + $$self{byte} = 0xff; + if (--$$self{delay} < 1) { + # setting size to zero forces error return from Decode() + $$self{size} = 0; + return 0; + } + } + $$self{buffer} = ($$self{buffer}<<8) | $$self{byte}; + $$self{scount} += 8; + } + } + # Save bit + my $a = $$self{a}; + my ($bit, $code); + if (defined $ctx) { + $bit = ($ctx & 1); + # Avoid interval reversion + my $d = 0x6000 + (($z+$a)>>2); + $z = $d if $z > $d; + } else { + $bit = 0; + } + # Test MPS/LPS + if ($z > ($code = $$self{code})) { + $bit ^= 1; + # LPS branch + $z = 0x10000 - $z; + $a += $z; + $code += $z; + # LPS adaptation + $_[2] = $self->{dn}[$ctx] if defined $ctx; + # LPS renormalization + my $sft = $a>=0xff00 ? $self->{ffzt}[$a&0xff] + 8 : $self->{ffzt}[($a>>8)&0xff]; + $$self{scount} -= $sft; + $$self{a} = ($a<<$sft) & 0xffff; + $code = (($code<<$sft) & 0xffff) | (($$self{buffer}>>$$self{scount}) & ((1<<$sft)-1)); + } else { + # MPS adaptation + $_[2] = $self->{up}[$ctx] if defined $ctx and $a >= $self->{'m'}[$ctx]; + # MPS renormalization + $$self{scount} -= 1; + $$self{a} = ($z<<1) & 0xffff; + $code = (($code<<1) & 0xffff) | (($$self{buffer}>>$$self{scount}) & 1); + } + # Adjust fence and save new code + $$self{fence} = $code >= 0x8000 ? 0x7fff : $code; + $$self{code} = $code; + return $bit; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::BZZ - Utility to decode BZZ compressed data + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to decode BZZ +compressed data in DjVu images. + +=head1 NOTES + +This code is based on ZPCodec and BSByteStream of DjVuLibre 3.5.21 (see +additional copyrights and the first reference below), which are covered +under the GNU GPL license. + +This is implemented as Image::ExifTool::BZZ instead of Compress::BZZ because +I am hoping that someone else will write a proper Compress::BZZ module (with +compression ability). + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) +Copyright 2002, Leon Bottou and Yann Le Cun +Copyright 2001, AT&T +Copyright 1999-2001, LizardTech Inc. + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L + +=item L + +=back + +=head1 SEE ALSO + +L, +L + +=cut + diff --git a/lib/Image/ExifTool/BigTIFF.pm b/lib/Image/ExifTool/BigTIFF.pm new file mode 100644 index 0000000..c060110 --- /dev/null +++ b/lib/Image/ExifTool/BigTIFF.pm @@ -0,0 +1,297 @@ +#------------------------------------------------------------------------------ +# File: BigTIFF.pm +# +# Description: Read Big TIFF meta information +# +# Revisions: 07/03/2007 - P. Harvey Created +# +# References: 1) http://www.awaresystems.be/imaging/tiff/bigtiff.html +#------------------------------------------------------------------------------ + +package Image::ExifTool::BigTIFF; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.07'; + +my $maxOffset = 0x7fffffff; # currently supported maximum data offset/size + +#------------------------------------------------------------------------------ +# Process Big IFD directory +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, otherwise returns 0 and sets a Warning +sub ProcessBigIFD($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $raf = $$dirInfo{RAF}; + my $verbose = $$et{OPTIONS}{Verbose}; + my $htmlDump = $$et{HTML_DUMP}; + my $dirName = $$dirInfo{DirName}; + my $dirStart = $$dirInfo{DirStart}; + my ($offName, $nextOffName); + + if ($htmlDump) { + $verbose = -1; # mix htmlDump into verbose so we can test for both at once + $offName = $$dirInfo{OffsetName}; + } + + # loop through IFD chain + for (;;) { + if ($dirStart > $maxOffset and not $et->Options('LargeFileSupport')) { + $et->Warn('Huge offsets not supported (LargeFileSupport not set)'); + last; + } + unless ($raf->Seek($dirStart, 0)) { + $et->Warn("Bad $dirName offset"); + return 0; + } + my ($dirBuff, $index); + unless ($raf->Read($dirBuff, 8) == 8) { + $et->Warn("Truncated $dirName count"); + return 0; + } + my $numEntries = Image::ExifTool::Get64u(\$dirBuff, 0); + $verbose > 0 and $et->VerboseDir($dirName, $numEntries); + my $bsize = $numEntries * 20; + if ($bsize > $maxOffset) { + $et->Warn('Huge directory counts not yet supported'); + last; + } + my $bufPos = $raf->Tell(); + unless ($raf->Read($dirBuff, $bsize) == $bsize) { + $et->Warn("Truncated $dirName directory"); + return 0; + } + my $nextIFD; + $raf->Read($nextIFD, 8) == 8 or undef $nextIFD; # try to read next IFD pointer + if ($htmlDump) { + $et->HDump($bufPos-8, 8, "$dirName entries", "Entry count: $numEntries", undef, $offName); + if (defined $nextIFD) { + my $off = Image::ExifTool::Get64u(\$nextIFD, 0); + my $tip = sprintf("Offset: 0x%.8x", $off); + my $id = $offName; + ($nextOffName, $id) = Image::ExifTool::Exif::NextOffsetName($et, $id) if $off; + $et->HDump($bufPos + 20 * $numEntries, 8, "Next IFD", $tip, 0, $id); + } + } + # loop through all entries in this BigTIFF IFD + for ($index=0; $index<$numEntries; ++$index) { + my $entry = 20 * $index; + my $tagID = Get16u(\$dirBuff, $entry); + my $format = Get16u(\$dirBuff, $entry+2); + my $count = Image::ExifTool::Get64u(\$dirBuff, $entry+4); + my $formatSize = $Image::ExifTool::Exif::formatSize[$format]; + unless (defined $formatSize) { + $et->HDump($bufPos+$entry,20,"[invalid IFD entry]", + "Bad format value: $format", 1, $offName); + # warn unless the IFD was just padded with zeros + $et->Warn(sprintf("Unknown format ($format) for $dirName tag 0x%x",$tagID)); + return 0; # assume corrupted IFD + } + my $formatStr = $Image::ExifTool::Exif::formatName[$format]; + my $size = $count * $formatSize; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID); + next unless defined $tagInfo or $verbose; + my $valuePtr = $entry + 12; + my ($valBuff, $valBase, $rational, $subOffName); + if ($size > 8) { + if ($size > $maxOffset) { + $et->Warn("Can't handle $dirName entry $index (huge size)"); + next; + } + $valuePtr = Image::ExifTool::Get64u(\$dirBuff, $valuePtr); + if ($valuePtr > $maxOffset and not $et->Options('LargeFileSupport')) { + $et->Warn("Can't handle $dirName entry $index (LargeFileSupport not set)"); + next; + } + unless ($raf->Seek($valuePtr, 0) and $raf->Read($valBuff, $size) == $size) { + $et->Warn("Error reading $dirName entry $index"); + next; + } + $valBase = 0; + } else { + $valBuff = substr($dirBuff, $valuePtr, $size); + $valBase = $bufPos; + } + if (defined $tagInfo and not $tagInfo) { + # GetTagInfo() required the value for a Condition + $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID, \$valBuff); + } + my $val = ReadValue(\$valBuff, 0, $formatStr, $count, $size, \$rational); + if ($htmlDump) { + my $tval = $val; + # show numerator/denominator separately for rational numbers + $tval .= " ($rational)" if defined $rational; + my ($tagName, $colName); + if ($tagID == 0x927c and $dirName eq 'ExifIFD') { + $tagName = 'MakerNotes'; + } elsif ($tagInfo) { + $tagName = $$tagInfo{Name}; + } else { + $tagName = sprintf("Tag 0x%.4x",$tagID); + } + my $dname = sprintf("$dirName-%.2d", $index); + # build our tool tip + my $tip = sprintf("Tag ID: 0x%.4x\n", $tagID) . + "Format: $formatStr\[$count]\nSize: $size bytes\n"; + if ($size > 8) { + $tip .= sprintf("Value offset: 0x%.8x\n", $valuePtr); + $colName = "$tagName"; + } else { + $colName = $tagName; + } + $tval = substr($tval,0,28) . '[...]' if length($tval) > 32; + if ($formatStr =~ /^(string|undef|binary)/) { + # translate non-printable characters + $tval =~ tr/\x00-\x1f\x7f-\xff/./; + } elsif ($tagInfo and Image::ExifTool::IsInt($tval)) { + if ($$tagInfo{IsOffset}) { + $tval = sprintf('0x%.4x', $tval); + } elsif ($$tagInfo{PrintHex}) { + $tval = sprintf('0x%x', $tval); + } + } + $tip .= "Value: $tval"; + my ($id, $sid); + if ($tagInfo and $$tagInfo{SubIFD}) { + ($subOffName, $id, $sid) = Image::ExifTool::Exif::NextOffsetName($et, $offName); + } else { + $id = $offName; + } + $et->HDump($entry+$bufPos, 20, "$dname $colName", $tip, 1, $id); + if ($size > 8) { + # add value data block + my $flg = ($tagInfo and $$tagInfo{SubDirectory} and $$tagInfo{MakerNotes}) ? 4 : 0; + $et->HDump($valuePtr,$size,"$tagName value",'SAME', $flg, $sid); + } + } + if ($tagInfo and $$tagInfo{SubIFD}) { + # process all SubIFD's as BigTIFF + $verbose > 0 and $et->VerboseInfo($tagID, $tagInfo, + Table => $tagTablePtr, + Index => $index, + Value => $val, + DataPt => \$valBuff, + DataPos => $valBase + $valuePtr, + Start => 0, + Size => $size, + Format => $formatStr, + Count => $count, + ); + my @offsets = split ' ', $val; + my $i; + for ($i=0; $i $raf, + DataPos => 0, + DirStart => $offsets[$i], + DirName => $subdirName, + Parent => $dirName, + OffsetName => $subOffName, + ); + $et->ProcessDirectory(\%subdirInfo, $tagTablePtr, \&ProcessBigIFD); + } + } else { + my $tagKey = $et->HandleTag($tagTablePtr, $tagID, $val, + Index => $index, + DataPt => \$valBuff, + DataPos => $valBase + $valuePtr, + Start => 0, + Size => $size, + Format => $formatStr, + TagInfo => $tagInfo, + RAF => $raf, + ); + $tagKey and $et->SetGroup($tagKey, $dirName); + } + } + last unless $dirName =~ /^(IFD|SubIFD)(\d*)$/; + $dirName = $1 . (($2 || 0) + 1); + defined $nextIFD or $et->Warn("Bad $dirName pointer"), return 0; + $dirStart = Image::ExifTool::Get64u(\$nextIFD, 0); + $dirStart or last; + $offName = $nextOffName; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Extract meta information from a BigTIFF image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid BigTIFF image +sub ProcessBTF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + + return 0 unless $raf->Read($buff, 16) == 16; + return 0 unless $buff =~ /^(MM\0\x2b\0\x08\0\0|II\x2b\0\x08\0\0\0)/; + if ($$dirInfo{OutFile}) { + $et->Error('ExifTool does not support writing of BigTIFF images'); + return 1; + } + $et->SetFileType('BTF'); # set the FileType tag + SetByteOrder(substr($buff, 0, 2)); + my $offset = Image::ExifTool::Get64u(\$buff, 8); + if ($$et{HTML_DUMP}) { + my $o = (GetByteOrder() eq 'II') ? 'Little' : 'Big'; + $et->HDump(0, 8, "BigTIFF header", "Byte order: $o endian", 0); + $et->HDump(8, 8, "IFD0 pointer", sprintf("Offset: 0x%.8x",$offset), 0); + } + my %dirInfo = ( + RAF => $raf, + DataPos => 0, + DirStart => $offset, + DirName => 'IFD0', + Parent => 'BigTIFF', + ); + my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main'); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr, \&ProcessBigIFD); + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::BigTIFF - Read Big TIFF meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to read meta +information in BigTIFF images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L + +=back + +=head1 SEE ALSO + +L, +L + +=cut + diff --git a/lib/Image/ExifTool/BuildTagLookup.pm b/lib/Image/ExifTool/BuildTagLookup.pm new file mode 100644 index 0000000..cf45549 --- /dev/null +++ b/lib/Image/ExifTool/BuildTagLookup.pm @@ -0,0 +1,2776 @@ +#------------------------------------------------------------------------------ +# File: BuildTagLookup.pm +# +# Description: Utility to build tag lookup tables in Image::ExifTool::TagLookup.pm +# +# Revisions: 12/31/2004 - P. Harvey Created +# 02/15/2005 - PH Added ability to generate TagNames documentation +# +# Notes: Documentation for the tag tables may either be placed in the +# %docs hash below or in a NOTES entry in the table itself, and +# individual tags may have their own Notes entry. +#------------------------------------------------------------------------------ + +package Image::ExifTool::BuildTagLookup; + +use strict; +require Exporter; + +BEGIN { + # prevent ExifTool from loading the user config file + $Image::ExifTool::configFile = ''; + $Image::ExifTool::debug = 1; # enabled debug messages +} + +use vars qw($VERSION @ISA); +use Image::ExifTool qw(:Utils :Vars); +use Image::ExifTool::Exif; +use Image::ExifTool::Shortcuts; +use Image::ExifTool::HTML qw(EscapeHTML); +use Image::ExifTool::IPTC; +use Image::ExifTool::XMP; +use Image::ExifTool::Canon; +use Image::ExifTool::Nikon; +use Image::ExifTool::Sony; +use Image::ExifTool::Validate; +use Image::ExifTool::MacOS; + +$VERSION = '3.47'; +@ISA = qw(Exporter); + +sub NumbersFirst($$); +sub SortedTagTablekeys($); + +my $createDate = 'Feb 15, 2005'; + +# global variables to control sorting order of table entries +my $numbersFirst = 1; # set to -1 to sort numbers last, or 2 to put negative numbers last +my $caseInsensitive; # flag to ignore case when sorting tag names + +# list of all tables in plug-in modules +my @pluginTables = ('Image::ExifTool::MWG::Composite'); + +# colors for html pages +my $noteFont = ""; +my $noteFontSmall = ""; + +my $docType = q{ +}; + +my $homePage = 'https://exiftool.org'; + +# tweak the ordering of tables in the documentation +my %tweakOrder = ( + # this => comes after this + # ------- ----------------- + JPEG => '-', # JPEG comes first + IPTC => 'Exif', # put IPTC after EXIF, + GPS => 'XMP', # etc... + Composite => 'Extra', + CBOR => 'JSON', + GeoTiff => 'GPS', + CanonVRD=> 'CanonCustom', + DJI => 'Casio', + FLIR => 'DJI', + FujiFilm => 'FLIR', + Kodak => 'JVC', + Leaf => 'Kodak', + Minolta => 'Leaf', + Motorola => 'Minolta', + Nikon => 'Motorola', + NikonCustom => 'Nikon', + NikonCapture => 'NikonCustom', + Nintendo => 'NikonCapture', + Pentax => 'Panasonic', + SonyIDC => 'Sony', + Unknown => 'SonyIDC', + DNG => 'Unknown', + PrintIM => 'ICC_Profile', + Vorbis => 'Ogg', + ID3 => 'PostScript', + MinoltaRaw => 'KyoceraRaw', + KyoceraRaw => 'CanonRaw', + SigmaRaw => 'PanasonicRaw', + Lytro => 'SigmaRaw', + PhotoMechanic => 'FotoStation', + Microsoft => 'PhotoMechanic', + 'Microsoft::MP'=> 'Microsoft::MP1', + GIMP => 'Microsoft', + 'Nikon::CameraSettingsD300' => 'Nikon::ShotInfoD300b', + 'Pentax::LensData' => 'Pentax::LensInfo2', + 'Sony::SRF2' => 'Sony::SRF', + DarwinCore => 'AFCP', + 'MWG::Regions' => 'MWG::Composite', + 'MWG::Keywords' => 'MWG::Regions', + 'MWG::Collections' => 'MWG::Keywords', + 'GoPro::fdsc' => 'GoPro::KBAT', +); + +# list of all recognized Format strings +# (not a complete list, but this is all we use so far) +# (also, formats like "var_X[num]" are allowed for any valid X) +my %formatOK = ( + %Image::ExifTool::Exif::formatNumber, + 0 => 1, + 1 => 1, + 2 => 1, # (writable for docs only) + real => 1, + integer => 1, + date => 1, + boolean => 1, + rational => 1, + 'lang-alt' => 1, + fixed16u => 1, + fixed16s => 1, + fixed32u => 1, + fixed32s => 1, + extended => 1, + resize => 1, + digits => 1, + int16uRev => 1, + int32uRev => 1, + rational32u => 1, + rational32s => 1, + pstring => 1, + var_string => 1, + var_int16u => 1, + var_pstr32 => 1, + var_ustr32 => 1, + var_ue7 => 1, # (BPG) + # Matroska + signed => 1, + unsigned => 1, + utf8 => 1, + Unicode => 1, # (Microsoft Xtra) + GUID => 1, # (Microsoft Xtra) + vt_filetime => 1, # (Microsoft Xtra) +); + +# Descriptions for the TagNames documentation +# (descriptions may also be defined in tag table NOTES) +# Note: POD headers in these descriptions start with '~' instead of '=' to keep +# from confusing POD parsers which apparently parse inside quoted strings. +my %docs = ( + PodHeader => q{ +~head1 NAME + +Image::ExifTool::TagNames - ExifTool tag name documentation + +~head1 DESCRIPTION + +This document contains a complete list of ExifTool tag names, organized into +tables based on information type. Tag names are used to reference specific +meta information extracted from or written to a file. + +~head1 TAG TABLES +}, + ExifTool => q{ +The tables listed below give the names of all tags recognized by ExifTool. +They contain a total of $$self{COUNT}{'total tags'} tags, with $$self{COUNT}{'unique tag names'} unique tag names. +}, + ExifTool2 => q{ +B, B or B is given in the first column of each +table. A B is the computer-readable equivalent of a tag name, and +is the identifier that is actually stored in the file. B refers to +the offset of a value when found at a fixed position within a data block +(B<#> is the multiplier for calculating a byte offset: B<1>, B<2>, B<4> or +B<8>). These offsets may have a decimal part which is used only to +differentiate tags with values stored at the same position. (Note that +writable tags within binary data blocks are not individually deletable, +and the usual alternative is to set them to a value of zero.) B +gives the order of values for a serial data stream. + +A B is the handle by which the information is accessed in +ExifTool. In some instances, more than one name may correspond to a single +tag ID. In these cases, the actual name used depends on the context in +which the information is found. Case is not significant for tag names. A +question mark (C) after a tag name indicates that the information is +either not understood, not verified, or not very useful -- these tags are +not extracted by ExifTool unless the L (-u) option is enabled. Be +aware that some tag names are different than the descriptions printed out by +default when extracting information with exiftool. To see the tag names +instead of the descriptions, use C. + +The B column indicates whether the tag is writable by ExifTool. +Anything but a C in this column means the tag is writable. A C +indicates writable information that is either unformatted or written using +the existing format. Other expressions give details about the format of the +stored value, and vary depending on the general type of information. The +format name may be followed by a number in square brackets to indicate the +number of values written, or the number of characters in a fixed-length +string (including a null terminator which is added if required). + +A plus sign (C<+>) after an entry in the B column indicates a +I tag which supports multiple values and allows individual values to +be added and deleted. A slash (C) indicates a tag that ExifTool will +I when writing. These will be edited but not created if another +same-named tag may be created instead. To create these tags, the group +should be specified. A tilde (C<~>) indicates a tag this is writable only +when the print conversion is disabled (by setting L to 0, using the +-n option, or suffixing the tag name with a C<#> character). An exclamation +point (C) indicates a tag that is considered I to write under +normal circumstances. These tags are not written unless specified +explicitly (ie. not when wildcards or "all" are used), and care should be +taken when editing them manually since they may affect the way an image is +rendered. An asterisk (C<*>) indicates a I tag which is not +writable directly, but is written automatically by ExifTool (often when a +corresponding L or +L tag is written). A colon +(C<:>) indicates a I tag which may be added automatically when +writing. Normally MakerNotes tags may not be deleted individually, but a +caret (C<^>) indicates a I MakerNotes tag. + +The HTML version of these tables also lists possible B for +discrete-valued tags, as well as B for some tags. The B are +listed with the computer-readable values on the left of the equals sign +(C<=>), and the human-readable values on the right. The human-readable +values are used by default when reading and writing, but the +computer-readable values may be accessed by disabling the value conversion +with the -n option on the command line, by setting the L option to 0 +in the API, or or on a per-tag basis by adding a hash (C<#>) after the tag +name. + +B: If you are familiar with common meta-information tag names, you may +find that some ExifTool tag names are different than expected. The usual +reason for this is to make the tag names more consistent across different +types of meta information. To determine a tag name, either consult this +documentation or run C on a file containing the information in +question. + +I<(This documentation is the result of years of research, testing and +reverse engineering, and is the most complete metadata tag list available +anywhere on the internet. It is provided not only for ExifTool users, but +more importantly as a public service to help augment the collective +knowledge, and is often used as a primary source of information in the +development of other metadata software. Please help keep this documentation +as accurate and complete as possible, and feed any new discoveries back to +ExifTool. A big thanks to everyone who has helped with this so far!)> +}, + EXIF => q{ +EXIF stands for "Exchangeable Image File Format". This type of information +is formatted according to the TIFF specification, and may be found in JPG, +TIFF, PNG, JP2, PGF, MIFF, HDP, PSP and XCF images, as well as many +TIFF-based RAW images, and even some AVI and MOV videos. + +The EXIF meta information is organized into different Image File Directories +(IFD's) within an image. The names of these IFD's correspond to the +ExifTool family 1 group names. When writing EXIF information, the default +B listed below is used unless another group is specified. + +Mandatory tags (indicated by a colon after the B type) may be +added automatically with default values when creating a new IFD, and the IFD +is removed automatically when deleting tags if only default-valued mandatory +tags remain. + +The table below lists all EXIF tags. Also listed are TIFF, DNG, HDP and +other tags which are not part of the EXIF specification, but may co-exist +with EXIF tags in some images. Tags which are part of the EXIF 2.32 +specification have an underlined B in the HTML version of this +documentation. See +L +for the official EXIF 2.32 specification. +}, + GPS => q{ +These GPS tags are part of the EXIF standard, and are stored in a separate +IFD within the EXIF information. + +ExifTool is very flexible about the input format when writing lat/long +coordinates, and will accept from 1 to 3 floating point numbers (for decimal +degrees, degrees and minutes, or degrees, minutes and seconds) separated by +just about anything, and will format them properly according to the EXIF +specification. + +Some GPS tags have values which are fixed-length strings. For these, the +indicated string lengths include a null terminator which is added +automatically by ExifTool. Remember that the descriptive values are used +when writing (eg. 'Above Sea Level', not '0') unless the print conversion is +disabled (with '-n' on the command line or the L option in the API, +or by suffixing the tag name with a C<#> character). + +When adding GPS information to an image, it is important to set all of the +following tags: GPSLatitude, GPSLatitudeRef, GPSLongitude, GPSLongitudeRef, +and GPSAltitude and GPSAltitudeRef if the altitude is known. ExifTool will +write the required GPSVersionID tag automatically if new a GPS IFD is added +to an image. +}, + XMP => q{ +XMP stands for "Extensible Metadata Platform", an XML/RDF-based metadata +format which is being pushed by Adobe. Information in this format can be +embedded in many different image file types including JPG, JP2, TIFF, GIF, +EPS, PDF, PSD, IND, INX, PNG, DJVU, SVG, PGF, MIFF, XCF, CRW, DNG and a +variety of proprietary TIFF-based RAW images, as well as MOV, AVI, ASF, WMV, +FLV, SWF and MP4 videos, and WMA and audio formats supporting ID3v2 +information. + +The XMP B's aren't listed because in most cases they are identical +to the B (aside from differences in case). Tags with different +ID's are mentioned in the B column of the HTML version of this +document. + +All XMP information is stored as character strings. The B column +specifies the information format: C is an unformatted string, +C is a string of digits (possibly beginning with a '+' or '-'), +C is a floating point number, C is entered as a floating +point number but stored as two C strings separated by a '/' +character, C is a date/time string entered in the format "YYYY:mm:dd +HH:MM:SS[.ss][+/-HH:MM]", C is either "True" or "False" (but "true" +and "false" may be written as a ValueConv value for compatibility with +non-conforming applications), C indicates a structured tag, and +C is a tag that supports alternate languages. + +When reading, C tags are extracted only if the L (-struct) +option is used. Otherwise the corresponding I tags, indicated by +an underline (C<_>) after the B type, are extracted. When +copying, by default both structured and flattened tags are available, but +the flattened tags are considered "unsafe" so they aren't copied unless +specified explicitly. The L option may be disabled by setting Struct +to 0 via the API or with --struct on the command line to copy only flattened +tags, or enabled by setting Struct to 1 via the API or with -struct on the +command line to copy only as structures. When writing, the L option +has no effect, and both structured and flattened tags may be written. See +L for more details. + +Individual languages for C tags are accessed by suffixing the tag +name with a '-', followed by an RFC 3066 language code (eg. "XMP:Title-fr", +or "Rights-en-US"). (See L for the RFC +3066 specification.) A C tag with no language code accesses the +"x-default" language, but causes other languages for this tag to be deleted +when writing. The "x-default" language code may be specified when writing +to preserve other existing languages (eg. "XMP-dc:Description-x-default"). +When reading, "x-default" is not specified. + +The XMP tags are organized according to schema B in the following +tables. The ExifTool family 1 group names are derived from the namespace +prefixes by adding a leading "XMP-" (eg. "XMP-dc"). A few of the longer +prefixes have been shortened (as mentioned in the documentation below) to +avoid excessively long ExifTool group names. The tags of any namespace may +be deleted as a group by specifying the family 1 group name (eg. +"-XMP-dc:all=" on the command line). This includes namespaces which are not +pre-defined by ExifTool. + +In cases where a tag name exists in more than one namespace, less common +namespaces are avoided when writing. However, a specific namespace may be +written by providing a family 1 group name for the tag (eg. XMP-crs:Contrast +or XMP-exif:Contrast). When deciding on which tags to add to an image, +using standard schemas such as L, L, +L and L is +recommended if possible. + +For structures, the heading of the first column is B. Field +names are very similar to tag names, except they are used to identify fields +inside structures instead of stand-alone tags. See +L for more +details. + +ExifTool will extract XMP information even if it is not listed in these +tables, but other tags are not writable unless added as user-defined tags in +the L. For example, the C namespace doesn't have a +predefined set of tag names because it is used to store application-defined +PDF information, so although this information will be extracted, it is only +writable if the corresponding user-defined tags have been created. + +The tables below list tags from the official XMP specification (with an +underlined B in the HTML version of this documentation), as well +as extensions from various other sources. See +L for the official XMP specification. +}, + IPTC => q{ +The tags listed below are part of the International Press Telecommunications +Council (IPTC) and the Newspaper Association of America (NAA) Information +Interchange Model (IIM). This is an older meta information format, slowly +being phased out in favor of XMP -- the newer IPTCCore specification uses +XMP format. IPTC information may be found in JPG, TIFF, PNG, MIFF, PS, PDF, +PSD, XCF and DNG images. + +IPTC information is separated into different records, each of which has its +own set of tags. See +L for the +official IPTC IIM specification. + +This specification dictates a length for ASCII (C or C) and +binary (C) values. These lengths are given in square brackets after +the B format name. For tags where a range of lengths is allowed, +the minimum and maximum lengths are separated by a comma within the +brackets. When writing, ExifTool issues a minor warning and truncates the +value if it is longer than allowed by the IPTC specification. Minor errors +may be ignored with the L (-m) option, allowing longer +values to be written, but beware that values like this may cause problems +for some other IPTC readers. ExifTool will happily read IPTC values of any +length. + +Separate IPTC date and time tags may be written with a combined date/time +value and ExifTool automagically takes the appropriate part of the date/time +string depending on whether a date or time tag is being written. This is +very useful when copying date/time values to IPTC from other metadata +formats. + +IPTC time values include a timezone offset. If written with a value which +doesn't include a timezone then the current local timezone offset is used +(unless written with a combined date/time, in which case the local timezone +offset at the specified date/time is used, which may be different due to +changes in daylight savings time). + +Note that it is not uncommon for IPTC to be found in non-standard locations +in JPEG and TIFF-based images. When reading, the family 1 group name has a +number added for non-standard IPTC ("IPTC2", "IPTC3", etc), but when writing +only "IPTC" may be specified as the group. To keep the IPTC consistent, +ExifTool updates tags in all existing IPTC locations, but will create a new +IPTC group only in the standard location. +}, + QuickTime => q{ +The QuickTime format is used for many different types of audio, video and +image files (most notably, MOV/MP4 videos and HEIC/CR3 images). ExifTool +extracts standard meta information and a variety of audio, video and image +parameters, as well as proprietary information written by many camera +models. Tags with a question mark after their name are not extracted unless +the L option is set. + +When writing, ExifTool creates both QuickTime and XMP tags by default, but +the group may be specified to write one or the other separately. If no +location is specified, newly created QuickTime tags are added in the +L location if +possible, otherwise in +L, and +finally in L, +but this order may be changed by setting the PREFERRED level of the +appropriate table in the config file (see +L in the full distribution for an +example). Note that some tags with the same name but different ID's may +exist in the same location, but the family 7 group names may be used to +differentiate these. ExifTool currently writes only top-level metadata in +QuickTime-based files; it extracts other track-specific and timed metadata, +but can not yet edit tags in these locations (with the exception of +track-level date/time tags). + +Alternate language tags may be accessed for +L and +L tags by adding +a 3-character ISO 639-2 language code and an optional ISO 3166-1 alpha 2 +country code to the tag name (eg. "ItemList:Artist-deu" or +"ItemList::Artist-deu-DE"). Most +L tags support a +language code, but without a country code. If no language code is specified +when writing, the default language is written and alternate languages for +the tag are deleted. Use the "und" language code to write the default +language without deleting alternate languages. Note that "eng" is treated +as a default language when reading, but not when writing. + +According to the specification, integer-format QuickTime date/time tags +should be stored as UTC. Unfortunately, digital cameras often store local +time values instead (presumably because they don't know the time zone). For +this reason, by default ExifTool does not assume a time zone for these +values. However, if the API L option is set, then ExifTool will +assume these values are properly stored as UTC, and will convert them to +local time when extracting. + +When writing string-based date/time tags, the system time zone is added if +the PrintConv option is enabled and no time zone is specified. This is +because Apple software may display crazy values if the time zone is missing +for some tags. + +By default ExifTool will remove null padding from some QuickTime containers +in Canon CR3 files when writing, but the +L option may be used to preserve +the original size by padding with nulls if necessary. + +See +L +for the official specification. +}, + Photoshop => q{ +Photoshop tags are found in PSD and PSB files, as well as inside embedded +Photoshop information in many other file types (JPEG, TIFF, PDF, PNG to name +a few). + +Many Photoshop tags are marked as Unknown (indicated by a question mark +after the tag name) because the information they provide is not very useful +under normal circumstances. These unknown tags are not extracted unless the +L (-u) option is used. See +L for the +official specification + +Photoshop path tags (Tag ID's 0x7d0 to 0xbb5) are not defined by default, +but a config file included in the full ExifTool distribution +(config_files/photoshop_paths.config) contains the tag definitions to allow +access to this information. +}, + PrintIM => q{ +The format of the PrintIM information is known, however no PrintIM tags have +been decoded. Use the L (-u) option to extract PrintIM information. +}, + GeoTiff => q{ +ExifTool extracts the following tags from GeoTIFF images. See +L for the +complete GeoTIFF specification. Also included in the table below are +ChartTIFF tags (see L). GeoTIFF +tags are not writable individually, but they may be copied en mass via the +block tags GeoTiffDirectory, GeoTiffDoubleParams and GeoTiffAsciiParams. +}, + JFIF => q{ +The following information is extracted from the JPEG JFIF header. See +L for the JFIF 1.02 +specification. +}, + Kodak => q{ +Many Kodak models don't store the maker notes in standard IFD format, and +these formats vary with different models. Some information has been +decoded, but much of the Kodak information remains unknown. +}, + 'Kodak SpecialEffects' => q{ +The Kodak SpecialEffects and Borders tags are found in sub-IFD's within the +Kodak JPEG APP3 "Meta" segment. +}, + Minolta => q{ +These tags are used by Minolta, Konica/Minolta as well as some Sony cameras. +Minolta doesn't make things easy for decoders because the meaning of some +tags and the location where some information is stored is different for +different camera models. (Take MinoltaQuality for example, which may be +located in 5 different places.) +}, + Olympus => q{ +Tags 0x0000 through 0x0103 are used by some older Olympus cameras, and are +the same as Konica/Minolta tags. These tags are also used for some models +from other brands such as Acer, BenQ, Epson, Hitachi, HP, Maginon, Minolta, +Pentax, Ricoh, Samsung, Sanyo, SeaLife, Sony, Supra and Vivitar. +}, + Panasonic => q{ +These tags are used in Panasonic/Leica cameras. +}, + Pentax => q{ +These tags are used in Pentax/Asahi cameras. +}, + CanonRaw => q{ +These tags apply to CRW-format Canon RAW files and information in the APP0 +"CIFF" segment of JPEG images. When writing CanonRaw/CIFF information, the +length of the information is preserved (and the new information is truncated +or padded as required) unless B is C. Currently, only +JpgFromRaw and ThumbnailImage are allowed to change size. See +L for a description of the Canon CRW +format. + +CRW images also support the addition of a CanonVRD trailer, which in turn +supports XMP. This trailer is created automatically if necessary when +ExifTool is used to write XMP to a CRW image. +}, + NikonCustom => q{ +Unfortunately, the NikonCustom settings are stored in a binary data block +which changes from model to model. This means that significant effort must +be spent in decoding these for each model, usually requiring hundreds of +test images from a dedicated Nikon owner. For this reason, the NikonCustom +settings have not been decoded for all models. The tables below list the +custom settings for the currently supported models. +}, + Unknown => q{ +The following tags are decoded in unsupported maker notes. Use the L +(-u) option to display other unknown tags. +}, + PDF => q{ +The tags listed in the PDF tables below are those which are used by ExifTool +to extract meta information, but they are only a small fraction of the total +number of available PDF tags. See +L for the official PDF +specification. + +ExifTool supports reading and writing PDF documents up to version 1.7 +extension level 3, including support for RC4, AES-128 and AES-256 +encryption. A L option is provided to allow processing of +password-protected PDF files. + +ExifTool may be used to write native PDF and XMP metadata to PDF files. It +uses an incremental update technique that has the advantages of being both +fast and reversible. If ExifTool was used to modify a PDF file, the +original may be recovered by deleting the C pseudo-group (with +C<-PDF-update:all=> on the command line). However, there are two main +disadvantages to this technique: + +1) A linearized PDF file is no longer linearized after the update, so it +must be subsequently re-linearized if this is required. + +2) All metadata edits are reversible. While this would normally be +considered an advantage, it is a potential security problem because old +information is never actually deleted from the file. (However, after +running ExifTool the old information may be removed permanently using the +"qpdf" utility with this command: "qpdf --linearize in.pdf out.pdf".) +}, + DNG => q{ +The main DNG tags are found in the EXIF table. The tables below define only +information found within structures of these main DNG tag values. See +L for the official DNG specification. +}, + MPEG => q{ +The MPEG format doesn't specify any file-level meta information. In lieu of +this, information is extracted from the first audio and video frame headers +in the file. +}, + Real => q{ +ExifTool recognizes three basic types of Real audio/video files: 1) +RealMedia (RM, RV and RMVB), 2) RealAudio (RA), and 3) Real Metafile (RAM +and RPM). +}, + Extra => q{ +The extra tags provide extra features or extra information extracted or +generated by ExifTool that is not directly associated with another tag +group. The B column lists the family 1 group name when reading. +Tags with a "-" in this column are write-only. + +Tags in the family 1 "System" group are referred to as "pseudo" tags because +they don't represent real metadata in the file. Instead, this information +is stored in the directory structure of the filesystem. The B +System "pseudo" tags in this table may be written without modifying the file +itself. The TestName tag is used for dry-run testing before writing +FileName. +}, + Composite => q{ +The values of the composite tags are B the values of other +tags. These are convenience tags which are calculated after all other +information is extracted. Only a few of these tags are writable directly, +the others are changed by writing the corresponding B tags. +User-defined Composite tags, also useful for custom-formatting of tag +values, may created via the L. +}, + Shortcuts => q{ +Shortcut tags are convenience tags that represent one or more other tag +names. They are used like regular tags to read and write the information +for a specified set of tags. + +The shortcut tags below have been pre-defined, but user-defined shortcuts +may be added via the %Image::ExifTool::UserDefined::Shortcuts lookup in the +~/.ExifTool_config file. See the Image::ExifTool::Shortcuts documentation +for more details. +}, + MWG => q{ +The Metadata Working Group (MWG) recommends techniques to allow certain +overlapping EXIF, IPTC and XMP tags to be reconciled when reading, and +synchronized when writing. The MWG Composite tags below are designed to aid +in the implementation of these recommendations. As well, the MWG defines +new XMP tags which are listed in the subsequent tables below. See +L +for the official MWG specification. +}, + MacOS => q{ +On MacOS systems, the there are additional MDItem and XAttr Finder tags that +may be extracted. These tags are not extracted by default -- they must be +specifically requested or enabled via an API option. (Except when reading +MacOS "._" files directly, see below.) + +The tables below list some of the tags that may be extracted, but ExifTool +will extract all available information even for tags not listed. + +Tags in these tables are referred to as "pseudo" tags because their +information is not stored in the file itself. As such, B tags in +these tables may be changed without having to rewrite the file. +}, + PodTrailer => q{ +~head1 NOTES + +This document generated automatically by +L. + +~head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +~head1 SEE ALSO + +L + +~cut +}, +); + +# notes for Shortcuts tags +my %shortcutNotes = ( + AllDates => q{ + contrary to the shortcut name, this represents only the common EXIF + date/time tags. To access all date/time tags, use Time:All instead + }, + MakerNotes => q{ + useful when copying tags between files to either copy the maker notes as a + block or prevent it from being copied + }, + ColorSpaceTags => q{ + standard tags which carry color space information. Useful for preserving + color space when deleting all other metadata + }, + CommonIFD0 => q{ + common metadata tags found in IFD0 of TIFF-format images. Used to simpify + deletion of all metadata from these images. See + L for details + }, + Unsafe => q{ + I tags in JPEG images which are normally not copied. Defined here + as a shortcut to use when rebuilding JPEG EXIF from scratch. See + L for more information + }, + LargeTags => q{ + large binary data tags which may be excluded to reduce memory usage if + memory limitations are a problem + }, + 'ls-l' => q{ + mimics columns shown by Unix "ls -l" command. Includes some tags which are + extracted only if the API L option + is enabled + }, +); + +# lookup for RIFF INFO tags which are found in the EXIF spec +my %riffSpec = ( + IARL => 1, ICRD => 1, IGNR => 1, IPLT => 1, ISRC => 1, + IART => 1, ICRP => 1, IKEY => 1, IPRD => 1, ISRF => 1, + ICMS => 1, IDIM => 1, ILGT => 1, ISBJ => 1, ITCH => 1, + ICMT => 1, IDPI => 1, IMED => 1, ISFT => 1, + ICOP => 1, IENG => 1, INAM => 1, ISHP => 1, +); +# same thing for XMP namespaces +my %xmpSpec = ( + aux => 1, 'x' => 1, + crs => 1, xmp => 1, + dc => 1, xmpBJ => 1, + exif => 1, xmpDM => 1, + pdf => 1, xmpMM => 1, + pdfx => 1, xmpNote => 1, + photoshop => 1, xmpRights => 1, + tiff => 1, xmpTPg => 1, +); + +#------------------------------------------------------------------------------ +# New - create new BuildTagLookup object +# Inputs: 0) reference to BuildTagLookup object or BuildTagLookup class name +sub new +{ + local $_; + my $that = shift; + my $class = ref($that) || $that || 'Image::ExifTool::BuildTagLookup'; + my $self = bless {}, $class; + my (%subdirs, %isShortcut); + my %count = ( + 'unique tag names' => 0, + 'total tags' => 0, + ); +# +# loop through all tables, accumulating TagLookup and TagName information +# + my (%tagNameInfo, %id, %longID, %longName, %shortName, %tableNum, + %tagLookup, %tagExists, %noLookup, %tableWritable, %sepTable, %case, + %structs, %compositeModules, %isPlugin, %flattened, %structLookup, + @writePseudo, %dupXmpTag); + $self->{TAG_NAME_INFO} = \%tagNameInfo; + $self->{ID_LOOKUP} = \%id; + $self->{LONG_ID} = \%longID; + $self->{LONG_NAME} = \%longName; + $self->{SHORT_NAME} = \%shortName; + $self->{TABLE_NUM} = \%tableNum; + $self->{TAG_LOOKUP} = \%tagLookup; + $self->{TAG_EXISTS} = \%tagExists; + $self->{FLATTENED} = \%flattened; + $self->{TABLE_WRITABLE} = \%tableWritable; + $self->{SEPARATE_TABLE} = \%sepTable; + $self->{STRUCTURES} = \%structs; + $self->{STRUCT_LOOKUP} = \%structLookup; # lookup for Struct hash ref based on Struct name + $self->{COMPOSITE_MODULES} = \%compositeModules; + $self->{COUNT} = \%count; + $self->{WRITE_PSEUDO} = \@writePseudo; + + Image::ExifTool::LoadAllTables(); + my @tableNames = sort keys %allTables; + # add Shortcuts after other tables + push @tableNames, 'Image::ExifTool::Shortcuts::Main'; + # add plug-in modules last + foreach (@pluginTables) { + push @tableNames, $_; + $isPlugin{$_} = 1; + } + + my $tableNum = 0; + my $et = new Image::ExifTool; + my ($tableName, $tag); + # create lookup for short table names + foreach $tableName (@tableNames) { + my $short = $tableName; + $short =~ s/^Image::ExifTool:://; + $short =~ s/::Main$//; + $short =~ s/::/ /; + $short =~ s/^(.+)Tags$/\u$1/ unless $short eq 'Nikon AVITags'; + $short =~ s/^Exif\b/EXIF/; + # change underlines to dashes in XMP-mwg group names + # (we used underlines just because Perl variables can't contain dashes) + $short =~ s/^XMP mwg_/XMP mwg-/; + $shortName{$tableName} = $short; # remember short name + $tableNum{$tableName} = $tableNum++; + } + # validate DICOM UID values + foreach (values %Image::ExifTool::DICOM::uid) { + next unless /[\0-\x1f\x7f-\xff]/; + warn "Warning: Special characters in DICOM UID value ($_)\n"; + } + # make lookup table to check for shortcut tags + foreach $tag (keys %Image::ExifTool::Shortcuts::Main) { + my $entry = $Image::ExifTool::Shortcuts::Main{$tag}; + # ignore if shortcut tag name includes itself + next if ref $entry eq 'ARRAY' and grep /^$tag$/, @$entry; + $isShortcut{lc($tag)} = 1; + } + foreach $tableName (@tableNames) { + # create short table name + my $short = $shortName{$tableName}; + my $info = $tagNameInfo{$tableName} = [ ]; + my $isPlugin = $isPlugin{$tableName}; + my ($table, $shortcut, %isOffset, %datamember, %hasSubdir); + if ($short eq 'Shortcuts') { + # can't use GetTagTable() for Shortcuts (not a normal table) + $table = \%Image::ExifTool::Shortcuts::Main; + $shortcut = 1; + } elsif ($isPlugin) { + $table = GetTagTable($tableName); + # don't add to allTables list because this messes our table order + delete $allTables{$tableName}; + pop @tableOrder; + } else { + $table = GetTagTable($tableName); + } + my $tableNum = $tableNum{$tableName}; + my $writeProc = $$table{WRITE_PROC}; + my $vars = $$table{VARS} || { }; + $longID{$tableName} = 0; + $longName{$tableName} = 0; + # save all tag names + my ($tagID, $binaryTable, $noID, $hexID, $isIPTC, $isXMP); + $isIPTC = 1 if $writeProc and $writeProc eq \&Image::ExifTool::IPTC::WriteIPTC; + # generate flattened tag names for structure fields if this is an XMP table + if ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP') { + Image::ExifTool::XMP::AddFlattenedTags($table); + $isXMP = 1; + } + $noID = 1 if $isXMP or $short =~ /^(Shortcuts|ASF.*)$/ or $$vars{NO_ID}; + $hexID = $$vars{HEX_ID}; + my $processBinaryData = ($$table{PROCESS_PROC} and ( + $$table{PROCESS_PROC} eq \&Image::ExifTool::ProcessBinaryData or + $$table{PROCESS_PROC} eq \&Image::ExifTool::Nikon::ProcessNikonEncrypted or + $$table{PROCESS_PROC} eq \&Image::ExifTool::Sony::ProcessEnciphered)); + if ($$vars{ID_LABEL} or $processBinaryData) { + my $s = $$table{FORMAT} ? Image::ExifTool::FormatSize($$table{FORMAT}) || 1 : 1; + $binaryTable = 1; + $id{$tableName} = $$vars{ID_LABEL} || "Index$s"; + } elsif ($isIPTC and $$table{PROCESS_PROC}) { #only the main IPTC table has a PROCESS_PROC + $id{$tableName} = 'Record'; + } elsif (not $noID) { + $id{$tableName} = 'Tag ID'; + } + $caseInsensitive = $isXMP; + $numbersFirst = 2; + $numbersFirst = -1 if $$table{VARS} and $$table{VARS}{ALPHA_FIRST}; + my @keys = SortedTagTableKeys($table); + $numbersFirst = 1; + my $defFormat = $table->{FORMAT}; + # use default format for binary data tables + $defFormat = 'int8u' if not $defFormat and $binaryTable; + +TagID: foreach $tagID (@keys) { + my ($tagInfo, @tagNames, $subdir, @values); + my (@infoArray, @require, @writeGroup, @writable); + if ($shortcut) { + # must build a dummy tagInfo list since Shortcuts is not a normal table + $tagInfo = { + Name => $tagID, + Notes => $shortcutNotes{$tagID}, + Writable => 1, + Require => { }, + }; + my $i; + for ($i=0; $i<@{$$table{$tagID}}; ++$i) { + $tagInfo->{Require}->{$i} = $table->{$tagID}->[$i]; + } + @infoArray = ( $tagInfo ); + } else { + @infoArray = GetTagInfoList($table,$tagID); + } + foreach $tagInfo (@infoArray) { + my $name = $$tagInfo{Name}; + if ($$tagInfo{WritePseudo}) { + push @writePseudo, $name; + warn "Writable pseudo tag $name is not protected!\n" unless $$tagInfo{Protected}; + } + unless ($$tagInfo{SubDirectory} or $$tagInfo{Struct}) { + my $lc = lc $name; + warn "Different case for $tableName $name $case{$lc}\n" if $case{$lc} and $case{$lc} ne $name; + $case{$lc} = $name; + } + my $format = $$tagInfo{Format}; + # check TagID's to make sure they don't start with 'ID-' + my @grps = $et->GetGroup($tagInfo); + foreach (@grps) { + warn "Group name starts with 'ID-' for $short $name\n" if /^ID-/i; + } + if ($isXMP and not $$tagInfo{Avoid} and not $$tagInfo{Struct} and + ($$tagInfo{Writable} or $$table{WRITABLE})) + { + $dupXmpTag{$name} and warn "Duplicate writable XMP tag $name\n"; + $dupXmpTag{$name} = 1; + } + # validate Name (must not start with a digit or else XML output will not be valid; + # must not start with a dash or exiftool command line may get confused) + if ($name !~ /^[_A-Za-z][-\w]+$/ and + # single-character subdirectory names are allowed + (not $$tagInfo{SubDirectory} or $name !~ /^[_A-Za-z]$/)) + { + warn "Warning: Invalid tag name $short '${name}'\n"; + } + # validate list type + if ($$tagInfo{List} and $$tagInfo{List} !~ /^(1|Alt|Bag|Seq|array|string)$/) { + warn "Warning: Unknown List type ($$tagInfo{List}) for $name in $tableName\n"; + } + # accumulate information for consistency check of BinaryData tables + if ($processBinaryData and $$table{WRITABLE}) { + # can't currently write tag if Condition accesses $valPt + if ($$tagInfo{Condition} and not $$tagInfo{SubDirectory} and + $$tagInfo{Condition} =~ /\$valPt/ and + ($$tagInfo{Writable} or not defined $$tagInfo{Writable})) + { + warn "Warning: Tag not writable due to Condition - $short $name\n"; + } + $isOffset{$tagID} = $name if $$tagInfo{IsOffset}; + $hasSubdir{$tagID} = $name if $$tagInfo{SubDirectory}; + # require DATAMEMBER for writable var-format tags, Hook and DataMember tags + if ($format and $format =~ /^var_/) { + $datamember{$tagID} = $name; + unless (defined $$tagInfo{Writable} and not $$tagInfo{Writable}) { + warn "Warning: Var-format tag is writable - $short $name\n" + } + # also need DATAMEMBER for tags used in length of var-sized value + while ($format =~ /\$val\{(.*?)\}/g) { + my $id = $1; + $id = hex($id) if $id =~ /^0x/; # convert from hex if necessary + $datamember{$id} = $$table{$id}{Name} if ref $$table{$id} eq 'HASH'; + unless ($datamember{$id}) { + warn "Warning: Unknown ID ($id) used in Format - $short $name\n"; + } + } + } elsif ($$tagInfo{Hook} or ($$tagInfo{RawConv} and + $$tagInfo{RawConv} =~ /\$self(->)?\{\w+\}\s*=(?!~)/)) + { + $datamember{$tagID} = $name; + } + if ($format and $format =~ /\$val\{/ and + ($$tagInfo{Writable} or not defined $$tagInfo{Writable})) + { + warn "Warning: \$var{} used in Format of writable tag - $short $name\n" + } + } + if ($$tagInfo{Hidden}) { + if ($tagInfo == $infoArray[0]) { + next TagID; # hide all tags with this ID if first tag in list is hidden + } else { + next; # only hide this tag + } + } + my $writable; + if (defined $$tagInfo{Writable}) { + $writable = $$tagInfo{Writable}; + # validate Writable + unless ($formatOK{$writable} or ($writable =~ /(.*)\[/ and $formatOK{$1})) { + warn "Warning: Unknown Writable ($writable) - $short $name\n", + } + } elsif (not $$tagInfo{SubDirectory}) { + $writable = $$table{WRITABLE}; + } + # in general, we can't write unless we have a WRITE_PROC + if ($writable and not ($$table{WRITE_PROC} or $tableName =~ /Shortcuts/ or $writable eq '2')) { + undef $writable; + } + # validate some characteristics of obvious date/time tags + my @g = $et->GetGroup($tagInfo); + if ($$tagInfo{List} and $g[2] eq 'Time' and $writable and not $$tagInfo{Protected} and + not $$tagInfo{PrintConvInv}) + { + # (this is a problem because shifting Time:All would create a new list entry) + warn "Writable List-type Time tag $g[1]:$name has no PrintConvInv and is not Protected!\n"; + } + if ($$tagInfo{PrintConv} and $$tagInfo{PrintConv} eq '$self->ConvertDateTime($val)') { + warn "$short $name should be in 'Time' group!\n" unless $g[2] eq 'Time'; + if ($writable and not defined $$tagInfo{Shift} and $short ne 'PostScript') { + warn "$short $name is not shiftable!\n"; + } + if ($writable and (not $$tagInfo{PrintConvInv} or + $$tagInfo{PrintConvInv} !~ /InverseDateTime/)) + { + warn "$short $name missing InverseDateTime PrintConvInv\n"; + } + } elsif ($name =~ /DateTime(?!Stamp)/ and (not $$tagInfo{Groups}{2} or + $$tagInfo{Groups}{2} ne 'Time') and $short ne 'DICOM') { + warn "$short $name should be in 'Time' group!\n"; + } + if ($name eq 'DateTimeOriginal' and (not $$tagInfo{Description} or + $$tagInfo{Description} ne 'Date/Time Original')) + { + warn "Need Description for $short DateTimeOriginal\n"; + } + # validate Description (can't contain special characters) + if ($$tagInfo{Description} and + $$tagInfo{Description} ne EscapeHTML($$tagInfo{Description})) + { + # this is a problem because the Escape option currently only + # escapes descriptions if the default Lang option isn't default + warn "$name description contains special characters!\n"; + } + # generate structure lookup + my $struct = $$tagInfo{Struct}; + my $strTable; + if (ref $struct) { + $strTable = $struct; + $struct = $$strTable{STRUCT_NAME}; + if ($struct) { + my $oldTable = $structLookup{$struct}; + if ($oldTable and $oldTable ne $strTable) { + warn "Duplicate XMP structure with name $struct\n"; + } else { + $structLookup{$struct} = $strTable; + } + } else { + warn "Missing STRUCT_NAME for structure in $$tagInfo{Name}\n"; + undef $strTable; + } + } elsif ($struct) { + $strTable = $structLookup{$struct}; + unless ($strTable) { + $struct = "XMP $struct" unless $struct =~ / /; + warn "Missing $struct structure!\n"; + undef $struct; + } + } + # validate SubIFD flag + my $subdir = $$tagInfo{SubDirectory}; + my $isSub = ($subdir and $$subdir{Start} and $$subdir{Start} =~ /\$val\b/); + if ($$tagInfo{SubIFD}) { + warn "Warning: Wrong SubDirectory Start for SubIFD tag - $short $name\n" unless $isSub; + } else { + warn "Warning: SubIFD flag not set for $short $name\n" if $isSub; + } + if ($$tagInfo{Notes}) { + my $note = $$tagInfo{Notes}; + # remove leading/trailing blank lines + $note =~ s/^\s+//; $note =~ s/\s+$//; + # remove leading/trailing spaces on each line + $note =~ s/(^[ \t]+|[ \t]+$)//mg; + push @values, "($note)"; + } + if ($isXMP and (lc $tagID ne lc $name or $$tagInfo{NotFlat})) { + my $note; + if ($$tagInfo{NotFlat}) { + $note = 'NOT a flattened tag!'; + } else { + # add note about different XMP Tag ID + $note = $$tagInfo{RootTagInfo} ? $tagID : "called $tagID by the spec"; + } + if ($$tagInfo{Notes}) { + $values[-1] =~ s/^\(/($note; /; + } else { + push @values, "($note)"; + } + } + my $writeGroup; + if ($short eq 'Extra') { + $writeGroup = $$tagInfo{WriteOnly} ? '-' : $g[1]; + } else { + $writeGroup = $$tagInfo{WriteGroup}; + } + unless ($writeGroup) { + $writeGroup = $$table{WRITE_GROUP} if $writable; + $writeGroup = '-' unless $writeGroup; + } + if (defined $format) { + # validate Format + unless ($formatOK{$format} or $short eq 'PICT' or + ($format =~ /^(var_)?(.*)\[/ and $formatOK{$2})) + { + warn "Warning: Unknown Format ($format) for $short $name\n"; + } + } else { + $format = $defFormat; + } + if ($subdir) { + my $subTable = $$subdir{TagTable} || $tableName; + push @values, $shortName{$subTable} + } elsif ($struct) { + push @values, $struct; + $structs{$struct} = 1; + } + my $type; + foreach $type ('Require','Desire') { + my $require = $$tagInfo{$type}; + if (ref $require) { + foreach (sort { $a <=> $b } keys %$require) { + push @require, $$require{$_}; + } + } elsif ($require) { + push @require, $require; + } + } + my $printConv = $$tagInfo{PrintConv}; + if ($$tagInfo{Mask}) { + my $val = $$tagInfo{Mask}; + my $bsh = $$tagInfo{BitShift}; + if ($bsh) { + push @values, sprintf('[val >> %d & 0x%x]',$bsh,$val>>$bsh); + } else { + push @values, sprintf('[val & 0x%x]',$val); + } + # verify that all values are within the mask + if (ref $printConv eq 'HASH') { + $val >>= $$tagInfo{BitShift}; + foreach (keys %$printConv) { + next if $_ !~ /^\d+$/ or ($_ & $val) == $_; + my $hex = sprintf '0x%.2x', $_; + warn "$short $name PrintConv value $hex is not in Mask!\n"; + } + } + } + if (ref($printConv) =~ /^(HASH|ARRAY)$/) { + my (@printConvList, @indexList, $index, $valueConvHash); + if (ref $printConv eq 'ARRAY') { + for ($index=0; $index<@$printConv; ++$index) { + if (ref $$printConv[$index] eq 'HASH') { + next unless %{$$printConv[$index]}; + push @printConvList, $$printConv[$index]; + push @indexList, $index; + } elsif ($$printConv[$index] and $$printConv[$index] eq 'REPEAT' and $index) { + push @printConvList, $$printConv[$index-1]; + push @indexList, 'N'; + } else { + next; + } + # collapse values with identical PrintConv's + if (@printConvList >= 2 and $printConvList[-1] eq $printConvList[-2]) { + if (ref $indexList[-2]) { + push @{$indexList[-2]}, $indexList[-1]; + } else { + $indexList[-2] = [ $indexList[-2], $indexList[-1] ]; + } + pop @printConvList; + pop @indexList; + } + } + $printConv = shift @printConvList; + $index = shift @indexList; + } else { + $valueConvHash = $$tagInfo{ValueConv} if ref $$tagInfo{ValueConv} eq 'HASH'; + } + while (defined $printConv) { + if (defined $index) { + # (print indices of original values if reorganized) + my $s = ''; + my $idx = $$tagInfo{Relist} ? $tagInfo->{Relist}->[$index] : $index; + if (ref $idx) { + $s = 's' if @$idx > 1; + # collapse consecutive number ranges + my ($i, @i, $rngStart); + for ($i=0; $i<@$idx; ++$i) { + if ($i < @$idx - 1 and ($$idx[$i+1] eq 'N' or $$idx[$i+1] == $$idx[$i] + 1)) { + $rngStart = $$idx[$i] unless defined $rngStart; + next; + } + push @i, (defined($rngStart) ? "$rngStart-" : '') . $$idx[$i]; + } + ($idx = join ', ', @i) =~ s/(.*),/$1 and/; + } elsif (not $$tagInfo{Relist}) { + while (@printConvList and $printConv eq $printConvList[0]) { + shift @printConvList; + $index = shift @indexList; + } + if ($idx != $index) { + $idx = "$idx-$index"; + $s = 's'; + } + } + push @values, "[Value$s $idx]"; + } + if ($$tagInfo{SeparateTable}) { + $subdir = 1; + my $s = $$tagInfo{SeparateTable}; + $s = $name if $s eq '1'; + # add module name if not specified + $s =~ / / or ($short =~ /^(\w+)/ and $s = "$1 $s"); + push @values, $s; + $sepTable{$s} = $printConv; + # add PrintHex flag to PrintConv so we can check it later + $$printConv{PrintHex} = 1 if $$tagInfo{PrintHex}; + $$printConv{PrintString} = 1 if $$tagInfo{PrintString}; + } else { + $caseInsensitive = 0; + my @pk; + if ($$tagInfo{PrintSort}) { + @pk = sort { NumbersFirst($$printConv{$a},$$printConv{$b}) } keys %$printConv; + } else { + @pk = sort { NumbersFirst($a,$b) } keys %$printConv; + } + my $n = scalar @values; + my ($bits, $i, $v); + foreach (@pk) { + next if $_ eq '' and $$printConv{$_} eq ''; + $_ eq 'BITMASK' and $bits = $$printConv{$_}, next; + $_ eq 'OTHER' and next; + my $index; + if (($$tagInfo{PrintHex} or $$printConv{BITMASK}) and /^-?\d+$/) { + my $dig = $$tagInfo{PrintHex} || 1; + if ($_ >= 0) { + $index = sprintf('0x%.*x', $dig, $_); + } elsif ($format and $format =~ /int(16|32)/) { + # mask off unused bits of signed integer hex value + my $mask = { 16 => 0xffff, 32 => 0xffffffff }->{$1}; + $index = sprintf('0x%.*x', $dig, $_ & $mask); + } else { + $index = $_; + } + } elsif (/^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/ and not $$tagInfo{PrintString}) { + $index = $_; + } else { + $index = $_; + # translate unprintable values + if ($index =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg) { + $index = qq{"$index"}; + } else { + $index = qq{'${index}'}; + } + } + push @values, "$index = " . $$printConv{$_}; + if ($valueConvHash) { + foreach $v (keys %$valueConvHash) { + next unless $$valueConvHash{$v} eq $_; + $values[-1] = "$v => " . $values[-1]; + last; + } + } + # validate all PrintConv values + if ($$printConv{$_} =~ /[\0-\x1f\x7f-\xff]/) { + warn "Warning: Special characters in $short $name PrintConv ($$printConv{$_})\n"; + } + } + if ($bits) { + my @pk = sort { NumbersFirst($a,$b) } keys %$bits; + foreach (@pk) { + push @values, "Bit $_ = " . $$bits{$_}; + } + } + # organize values into columns if specified + my $cols = $$tagInfo{PrintConvColumns}; + if (not $cols and scalar(@values) - $n >= 6) { + # do columns if more than 6 short entries + my $maxLen = 0; + for ($i=$n; $i<@values; ++$i) { + next unless $maxLen < length $values[$i]; + $maxLen = length $values[$i]; + } + my $num = scalar(@values) - $n; + $cols = int(50 / ($maxLen + 2)); # (50 chars max width) + # have 3 rows minimum + --$cols while $cols and $num / $cols < 3; + } + if ($cols) { + my @new = splice @values, $n; + my $v = '[!HTML]'; + my $rows = int((scalar(@new) + $cols - 1) / $cols); + for ($n=0; ;) { + $v .= "\n '; + last if ($n += $rows) >= @new; + $v .= ''; # add spaces between columns + } + push @values, $v . "
"; + for ($i=0; $i<$rows and $n+$i<@new; ++$i) { + $v .= "\n
" if $i; + $v .= EscapeHTML($new[$n+$i]); + } + $v .= '
  
\n"; + } + } + last unless @printConvList; + $printConv = shift @printConvList; + $index = shift @indexList; + } + } elsif ($printConv and $printConv =~ /DecodeBits\(\$val,\s*(\{.*\})\s*\)/s) { + $$self{Model} = ''; # needed for Nikon ShootingMode + my $bits = eval $1; + delete $$self{Model}; + if ($@) { + warn $@; + } else { + my @pk = sort { NumbersFirst($a,$b) } keys %$bits; + foreach (@pk) { + push @values, "Bit $_ = " . $$bits{$_}; + } + } + } + if ($subdir and not $$tagInfo{SeparateTable}) { + if ($writable) { + # subdirectories are only writable if specified explicitly + my $tw = $$tagInfo{Writable}; + $writable = 'yes' if $tw and $writable eq '1' or $writable eq '2'; + $writable = '-' . ($tw ? $writable : ''); + $writable .= '!' if $tw and ($$tagInfo{Protected} || 0) & 0x01; + $writable .= '+' if $$tagInfo{List}; + if (defined $$tagInfo{Permanent}) { + $writable .= '^' unless $$tagInfo{Permanent}; + } elsif (defined $$table{PERMANENT}) { + $writable .= '^' unless $$table{PERMANENT}; + } + } else { + $writable = '-'; + } + } else { + # not writable if we can't do the inverse conversions + my $noPrintConvInv; + if ($writable) { + foreach ('PrintConv','ValueConv') { + next unless $$tagInfo{$_}; + next if $$tagInfo{$_ . 'Inv'}; + next if ref($$tagInfo{$_}) =~ /^(HASH|ARRAY)$/; + next if $$tagInfo{WriteAlso}; + if ($_ eq 'ValueConv') { + undef $writable; + } else { + $noPrintConvInv = 1; + } + } + } + if (not $writable) { + $writable = 'no'; + } else { + $writable = $format ? $format : 'yes' if $writable eq '1' or $writable eq '2'; + my $count = $$tagInfo{Count} || 1; + # adjust count to Writable size if different than Format + if ($writable and $format and $writable ne $format and + $writable ne 'string' and $format ne 'string' and + $Image::ExifTool::Exif::formatNumber{$writable} and + $Image::ExifTool::Exif::formatNumber{$format}) + { + my $n1 = $Image::ExifTool::Exif::formatNumber{$format}; + my $n2 = $Image::ExifTool::Exif::formatNumber{$writable}; + $count *= $Image::ExifTool::Exif::formatSize[$n1] / + $Image::ExifTool::Exif::formatSize[$n2]; + } + if ($count != 1) { + $count = 'n' if $count < 0; + $writable .= "[$count]"; + } + $writable .= '~' if $noPrintConvInv; + # add a '*' if this tag is protected or a '!' for unsafe tags + if ($$tagInfo{Protected}) { + $writable .= '*' if $$tagInfo{Protected} & 0x02; + $writable .= '!' if $$tagInfo{Protected} & 0x01; + } + $writable .= '/' if $$tagInfo{Avoid}; + } + $writable = "=struct" if $struct; + $writable .= '_' if defined $$tagInfo{Flat}; + $writable .= '+' if $$tagInfo{List}; + $writable .= ':' if $$tagInfo{Mandatory}; + if (defined $$tagInfo{Permanent}) { + $writable .= '^' unless $$tagInfo{Permanent}; + } elsif (defined $$table{PERMANENT}) { + $writable .= '^' unless $$table{PERMANENT}; + } + # separate tables link like subdirectories (flagged with leading '-') + $writable = "-$writable" if $subdir; + } + # don't duplicate a tag name unless an entry is different + my $lcName = lc($name); + # check for conflicts with shortcut names + if ($isShortcut{$lcName} and $short ne 'Shortcuts' and + ($$tagInfo{Writable} or not $$tagInfo{SubDirectory})) + { + warn "WARNING: $short $name is a shortcut tag!\n"; + } + $name .= '?' if $$tagInfo{Unknown}; + unless (@tagNames and $tagNames[-1] eq $name and + $writeGroup[-1] eq $writeGroup and $writable[-1] eq $writable) + { + push @tagNames, $name; + push @writeGroup, $writeGroup; + push @writable, $writable; + } +# +# add this tag to the tag lookup unless NO_LOOKUP is set or shortcut or plug-in tag +# + next if $shortcut or $isPlugin; + # count tags + if ($$tagInfo{SubDirectory}) { + next if $$vars{NO_LOOKUP}; + $subdirs{$lcName} or $subdirs{$lcName} = 0; + ++$subdirs{$lcName}; + } else { + ++$count{'total tags'}; + unless ($tagExists{$lcName} and + (not $subdirs{$lcName} or $subdirs{$lcName} == $tagExists{$lcName})) + { + ++$count{'unique tag names'} unless $noLookup{$lcName}; + } + # don't add to tag lookup if specified + $$vars{NO_LOOKUP} and $noLookup{$lcName} = 1, next; + } + $tagExists{$lcName} or $tagExists{$lcName} = 0; + ++$tagExists{$lcName}; + # only add writable tags to lookup table (for speed) + my $wflag = $$tagInfo{Writable}; + next unless $writeProc and ($wflag or ($$table{WRITABLE} and + not defined $wflag and not $$tagInfo{SubDirectory})); + $tagLookup{$lcName} or $tagLookup{$lcName} = { }; + # add to lookup for flattened tags if necessary + if ($$tagInfo{RootTagInfo}) { + $flattened{$lcName} or $flattened{$lcName} = { }; + $flattened{$lcName}{$tableNum} = $$tagInfo{RootTagInfo}{TagID}; + } + # remember number for this table + my $tagIDs = $tagLookup{$lcName}->{$tableNum}; + # must allow for duplicate tags with the same name in a single table! + if ($tagIDs) { + if (ref $tagIDs eq 'HASH') { + $$tagIDs{$tagID} = 1; + next; + } elsif ($tagID eq $tagIDs) { + next; + } else { + $tagIDs = { $tagIDs => 1, $tagID => 1 }; + } + } else { + $tagIDs = $tagID; + } + $tableWritable{$tableName} = 1; + $tagLookup{$lcName}->{$tableNum} = $tagIDs; + # keep track of extra modules needed for Composite tags + $compositeModules{$lcName} = $$tagInfo{Module} if $$tagInfo{Module}; + } +# +# save TagName information +# + my $tagIDstr; + if ($tagID =~ /^(-)?\d+(\.\d+)?$/) { + if ($1) { + $tagIDstr = $tagID; + } elsif (defined $hexID) { + $tagIDstr = $hexID ? sprintf('0x%.4x',$tagID) : $tagID; + } elsif (not $2 and not $binaryTable and not $isIPTC and + not ($short =~ /^CanonCustom/ and $tagID < 256)) + { + $tagIDstr = sprintf('0x%.4x',$tagID); + } elsif ($tagID < 0x10000) { + $tagIDstr = $tagID; + } else { + $tagIDstr = sprintf('0x%.8x',$tagID); + } + } elsif ($short eq 'DICOM') { + ($tagIDstr = $tagID) =~ s/_/,/; + } elsif ($tagID =~ /^0x([0-9a-f]+)\.(\d+)$/) { # DR4 tags like '0x20500.0' + $tagIDstr = $tagID; + } else { + # convert non-printable characters to hex escape sequences + if ($tagID =~ s/([\x00-\x1f\x7f-\xff])/'\x'.unpack('H*',$1)/eg) { + $tagID =~ s/\\x00/\\0/g; + next if $tagID eq 'jP\x1a\x1a'; # ignore abnormal JP2 signature tag + $tagIDstr = qq{"$tagID"}; + } else { + $tagIDstr = "'${tagID}'"; + } + } + my $len = length $tagIDstr; + $longID{$tableName} = $len if $longID{$tableName} < $len; + foreach (@tagNames) { + $len = length $_; + $longName{$tableName} = $len if $longName{$tableName} < $len; + } + push @$info, [ $tagIDstr, \@tagNames, \@writable, \@values, \@require, \@writeGroup ]; + } + # do consistency check of writable BinaryData tables + if ($processBinaryData and $$table{WRITABLE}) { + my %lookup = ( + IS_OFFSET => \%isOffset, + IS_SUBDIR => \%hasSubdir, + DATAMEMBER => \%datamember, + ); + my ($var, $tagID); + foreach $var (sort keys %lookup) { + my $hash = $lookup{$var}; + if ($$table{$var}) { + foreach $tagID (@{$$table{$var}}) { + $$hash{$tagID} and delete($$hash{$tagID}), next; + warn sprintf("Warning: Extra %s for %s tag %d (0x%.4x)\n", + $var, $short, $tagID, $tagID); + } + } + foreach $tagID (sort keys %$hash) { + warn sprintf("Warning: Missing %s for %s %s, tag %d (0x%.4x)\n", + $var, $short, $$hash{$tagID}, $tagID, $tagID); + } + } + } + } + # save information about structures + my $strName; + foreach $strName (keys %structs) { + my $struct = $structLookup{$strName}; + my $fullName = ($strName =~ / / ? '' : 'XMP ') . "$strName Struct"; + my $info = $tagNameInfo{$fullName} = [ ]; + my $tag; + foreach $tag (sort keys %$struct) { + my $tagInfo = $$struct{$tag}; + next unless ref $tagInfo eq 'HASH' and $tag ne 'NAMESPACE' and $tag ne 'GROUPS'; + warn "WARNING: $strName Struct containes $tag\n" if $Image::ExifTool::specialTags{$tag}; + my $writable = $$tagInfo{Writable}; + my @vals; + unless ($writable) { + $writable = $$tagInfo{Struct}; + ref $writable and $writable = $$writable{STRUCT_NAME}; + if ($writable) { + push @vals, $writable; + $structs{$writable} = 1; + $writable = "=$writable"; + } else { + $writable = 'string'; + } + } + $writable .= '+' if $$tagInfo{List}; + push @vals, "($$tagInfo{Notes})" if $$tagInfo{Notes}; + # handle PrintConv lookups in Structure elements + my $printConv = $$tagInfo{PrintConv}; + if (ref $printConv eq 'HASH') { + foreach (sort keys %$printConv) { + next if /^(OTHER|BITMASK)$/; + push @vals, "$_ = $$printConv{$_}"; + } + } + push @$info, [ + $tag, + [ $$tagInfo{Name} || ucfirst($tag) ], + [ $writable ], + \@vals, + [], [] + ]; + } + } + return $self; +} + +#------------------------------------------------------------------------------ +# Rewrite this file to build the lookup tables +# Inputs: 0) BuildTagLookup object reference +# 1) output tag lookup module name (eg. 'lib/Image/ExifTool/TagLookup.pm') +# Returns: true on success +sub WriteTagLookup($$) +{ + local ($_, *INFILE, *OUTFILE); + my ($self, $file) = @_; + my $tagLookup = $self->{TAG_LOOKUP}; + my $tagExists = $self->{TAG_EXISTS}; + my $flattened = $self->{FLATTENED}; + my $tableWritable = $self->{TABLE_WRITABLE}; +# +# open/create necessary files and transfer file headers +# + my $tmpFile = "${file}_tmp"; + open(INFILE, $file) or warn("Can't open $file\n"), return 0; + unless (open(OUTFILE, ">$tmpFile")) { + warn "Can't create temporary file $tmpFile\n"; + close(INFILE); + return 0; + } + my $success; + while () { + print OUTFILE $_ or last; + if (/^#\+{4} Begin/) { + $success = 1; + last; + } + } + print OUTFILE "\n# list of tables containing writable tags\n"; + print OUTFILE "my \@tableList = (\n"; + +# +# write table list +# + my @tableNames = sort keys %allTables; + my $tableName; + my %wrNum; # translate from allTables index to writable tables index + my $count = 0; + my $num = 0; + foreach $tableName (@tableNames) { + if ($$tableWritable{$tableName}) { + print OUTFILE "\t'${tableName}',\n"; + $wrNum{$count} = $num++; + } + $count++; + } +# +# write the tag lookup table +# + my $tag; + # verify that certain critical tag names aren't duplicated + foreach $tag (qw{filename directory}) { + next unless $$tagLookup{$tag}; + my $n = scalar keys %{$$tagLookup{$tag}}; + warn "Warning: $n writable '${tag}' tags!\n" if $n > 1; + } + print OUTFILE ");\n\n# lookup for all writable tags\nmy \%tagLookup = (\n"; + foreach $tag (sort keys %$tagLookup) { + print OUTFILE "\t'${tag}' => { "; + my @tableNums = sort { $a <=> $b } keys %{$$tagLookup{$tag}}; + my (@entries, $tableNum); + foreach $tableNum (@tableNums) { + my $tagID = $$tagLookup{$tag}{$tableNum}; + my $rootID = $$flattened{$tag}{$tableNum}; + my $entry; + if (ref $tagID eq 'HASH' or $rootID) { + $tagID = { $tagID => 1 } unless ref $tagID eq 'HASH'; + my @tagIDs = sort keys %$tagID; + foreach (@tagIDs) { + if (/^\d+$/) { + $_ = sprintf('0x%x',$_); + } else { + my $quot = "'"; + # escape non-printable characters in tag ID if necessary + $quot = '"' if s/[\x00-\x1f,\x7f-\xff]/sprintf('\\x%.2x',ord($&))/ge; + $_ = $quot . $_ . $quot; + } + } + # reference to root structure ID must come first in lookup + # (so we can generate the flattened tags just before we need them) + unshift @tagIDs, "\\'${rootID}'" if $rootID; + $entry = '[' . join(',', @tagIDs) . ']'; + } elsif ($tagID =~ /^\d+$/) { + $entry = sprintf('0x%x',$tagID); + } else { + my $quot = "'"; + # escape non-printable characters in tag ID if necessary + $quot = '"' if $tagID =~ s/[\x00-\x1f,\x7f-\xff]/sprintf('\\x%.2x',ord($&))/ge; + $entry = "$quot${tagID}$quot"; + } + my $wrNum = $wrNum{$tableNum}; + push @entries, "$wrNum => $entry"; + } + print OUTFILE join(', ', @entries); + print OUTFILE " },\n"; + } +# +# write tag exists lookup +# + print OUTFILE ");\n\n# lookup for non-writable tags to check if the name exists\n"; + print OUTFILE "my \%tagExists = (\n"; + foreach $tag (sort keys %$tagExists) { + next if $$tagLookup{$tag}; + print OUTFILE "\t'${tag}' => 1,\n"; + } +# +# write module lookup for writable composite tags +# + my $compositeModules = $self->{COMPOSITE_MODULES}; + print OUTFILE ");\n\n# module names for writable Composite tags\n"; + print OUTFILE "my \%compositeModules = (\n"; + foreach (sort keys %$compositeModules) { + print OUTFILE "\t'${_}' => '$$compositeModules{$_}',\n"; + } + print OUTFILE ");\n\n"; +# +# finish writing TagLookup.pm and clean up +# + if ($success) { + $success = 0; + while () { + $success or /^#\+{4} End/ or next; + print OUTFILE $_; + $success = 1; + } + } + close(INFILE); + close(OUTFILE) or $success = 0; +# +# return success code +# + if ($success) { + local (*ORG, *TMP); + # only rename the file if something changed + open ORG, $file or return 0; + open TMP, $tmpFile or return 0; + my ($buff, $buf2, $changed); + for (;;) { + my $n1 = read ORG, $buff, 65536; + my $n2 = read TMP, $buf2, 65536; + $n1 eq $n2 or $changed = 1, last; + last unless $n1; + $buff eq $buf2 or $changed = 1, last; + } + close ORG; + close TMP; + if ($changed) { + rename($tmpFile, $file) or warn("Error renaming $tmpFile\n"), $success = 0; + } else { + unlink($tmpFile); + } + } else { + unlink($tmpFile); + warn "Error rewriting file\n"; + } + return $success; +} + +#------------------------------------------------------------------------------ +# Sort numbers first numerically, then strings alphabetically (case insensitive) +# - two global variables are used to change the sort algorithm: +# $numbersFirst: -1 = put numbers after other strings +# 1 = put numbers before other strings +# 2 = put numbers first, but negative numbers last +# $caseInsensitive: flag set for case-insensitive sorting +sub NumbersFirst($$) +{ + my ($a, $b) = @_; + my $rtnVal; + my ($bNum, $bDec); + ($bNum, $bDec) = ($1, $3) if $b =~ /^(-?[0-9]+)(\.(\d*))?$/; + if ($a =~ /^(-?[0-9]+)(\.(\d*))?$/) { + if (defined $bNum) { + $bNum += 1e9 if $numbersFirst == 2 and $bNum < 0; + my $aInt = $1; + $aInt += 1e9 if $numbersFirst == 2 and $aInt < 0; + # compare integer part as a number + $rtnVal = $aInt <=> $bNum; + unless ($rtnVal) { + my $aDec = $3 || 0; + $bDec or $bDec = 0; + # compare decimal part as an integer too + # (so that "1.10" comes after "1.9") + $rtnVal = $aDec <=> $bDec; + } + } else { + $rtnVal = -$numbersFirst; + } + } elsif (defined $bNum) { + $rtnVal = $numbersFirst; + } else { + my ($a2, $b2) = ($a, $b); + # expand numbers to 3 digits (with restrictions to avoid messing up ascii-hex tags) + $a2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $a2 =~ /^(APP|DMC-\w+ )?[.0-9 ]*$/ and length($a2)<16; + $b2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $b2 =~ /^(APP|DMC-\w+ )?[.0-9 ]*$/ and length($b2)<16; + $caseInsensitive and $rtnVal = (lc($a2) cmp lc($b2)); + $rtnVal or $rtnVal = ($a2 cmp $b2); + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Convert our pod-like documentation to pod +# (funny, I know, but the pod headings must be hidden to prevent confusing +# the pod parser) +# Inputs: 0-N) documentation strings +sub Doc2Pod($;@) +{ + my $doc = shift; + local $_; + $doc .= shift while @_; + $doc =~ s/\n~/\n=/g; + $doc =~ s/L<[^>]+?\|(http[^>]+)>/L<$1>/g; # POD doesn't support text for http links + $doc =~ s/L<([^>]+?)\|[^>]+\.html(#\w+)?>/$1/g; # remove relative HTML links + return $doc; +} + +#------------------------------------------------------------------------------ +# Convert our pod-like documentation to html +# Inputs: 0) string +sub Doc2Html($) +{ + my $doc = EscapeHTML(shift); + $doc =~ s/\n\n/<\/p>\n\n

/g; + $doc =~ s/B<(.*?)>/$1<\/b>/sg; + $doc =~ s/C<(.*?)>/$1<\/code>/sg; + $doc =~ s/I<(.*?)>/$1<\/i>/sg; + # L --> some text + $doc =~ s{L<([^&]+?)\|\Q$homePage\E/(.*?)>}{$1<\/a>}sg; + # L --> https://exiftool.org/struct.html + $doc =~ s{L<\Q$homePage\E/(.*?)>}{$1<\/a>}sg; + # L

--> <a href="XMP.html#DICOM">XMP DICOM Tags</a> + # (specify "Image::ExifTool::TagNames" to link to another html file) + $doc =~ s{L&lt;([^&]+?)\|Image::ExifTool::TagNames/(\w+) ([^/&|]+) Tags&gt;}{<a href="$2.html#$3">$1</a>}sg; + # L<DICOM Tags|Image::ExifTool::TagNames/DICOM Tags> --> <a href="DICOM.html">DICOM Tags</a> + $doc =~ s{L&lt;([^&]+?)\|Image::ExifTool::TagNames/(\w+) Tags&gt;}{<a href="$2.html">$1</a>}sg; + # L<dc|/XMP dc Tags> --> <a href="#dc">dc</a> + # (a relative POD link turns into a relative HTML link) + $doc =~ s{L&lt;([^&]+?)\|/\w+ ([^/&|]+) Tags&gt;}{<a href="#$2">$1</a>}sg; + # L<sample config file|../config.html> --> <a href="../config.html">sample config file</a> + $doc =~ s/L&lt;([^&]+?)\|(.+?)&gt;/<a href="$2">$1<\/a>/sg; + # L<http://some.web.site/> --> <a href="http://some.web.site">http://some.web.site</a> + $doc =~ s/L&lt;(http.*?)&gt;/<a href="$1">$1<\/a>/sg; + return $doc; +} + +#------------------------------------------------------------------------------ +# Tweak order of tables +# Inputs: 0) table list ref, 1) reference to tweak hash +sub TweakOrder($$) +{ + local $_; + my ($sortedTables, $tweakOrder) = @_; + my @tweak = sort keys %$tweakOrder; + my (%addedMain, @sorted); + # flag files which have a "Main" table + foreach (@$sortedTables) { + $addedMain{$1} = 0 if /^Image::ExifTool::(\w+)::(\w+)/ and $2 eq 'Main'; + } + # make sure that the main table always comes first in each file + foreach (@$sortedTables) { + if (/^Image::ExifTool::(\w+)::(\w+)/) { + if ($addedMain{$1}) { + next if $2 eq 'Main'; # don't add again + } elsif (defined $addedMain{$1}) { + push @sorted, "Image::ExifTool::${1}::Main" if $2 ne 'Main'; + $addedMain{$1} = 1; + } + } + push @sorted, $_; + } + @$sortedTables = @sorted; + # apply manual tweaks + while (@tweak) { + my $table = shift @tweak; + my $first = $$tweakOrder{$table}; + if ($$tweakOrder{$first}) { + push @tweak, $table; # must defer this till later + next; + } + delete $$tweakOrder{$table}; # because the table won't move again + my @moving = grep /^Image::ExifTool::$table\b/, @$sortedTables; + my @notMoving = grep !/^Image::ExifTool::$table\b/, @$sortedTables; + my @after; + while (@notMoving) { + last if $notMoving[-1] =~ /^Image::ExifTool::$first\b/; + unshift @after, pop @notMoving; + } + @$sortedTables = (@notMoving, @moving, @after); + } +} + +#------------------------------------------------------------------------------ +# Get a list of sorted tag ID's from a table +# Inputs: 0) tag table ref +# Returns: list of sorted keys +sub SortedTagTableKeys($) +{ + my $table = shift; + my $vars = $$table{VARS} || { }; + my @keys = TagTableKeys($table); + if ($$vars{NO_ID}) { + # sort by tag name if ID not shown + my ($key, %name); + foreach $key (@keys) { + my ($tagInfo) = GetTagInfoList($table, $key); + $name{$key} = $$tagInfo{Name}; + } + return sort { $name{$a} cmp $name{$b} or $a cmp $b } @keys; + } else { + my $sortProc = $$vars{SORT_PROC} || \&NumbersFirst; + return sort { &$sortProc($a,$b) } @keys; + } +} + +#------------------------------------------------------------------------------ +# Get the order that we want to print the tables in the documentation +# Inputs: 0-N) Extra tables to add at end +# Returns: tables in the order we want +sub GetTableOrder(@) +{ + my %gotTable; + my @tableNames = @tableOrder; + my (@orderedTables, %mainTables, @outOfOrder); + my $lastTable = ''; + + while (@tableNames) { + my $tableName = shift @tableNames; + next if $gotTable{$tableName}; + if ($tableName =~ /^Image::ExifTool::(\w+)::Main/) { + $mainTables{$1} = 1; + } elsif ($lastTable and not $tableName =~ /^${lastTable}::/) { + push @outOfOrder, $tableName; + } + ($lastTable) = ($tableName =~ /^(Image::ExifTool::\w+)/); + push @orderedTables, $tableName; + $gotTable{$tableName} = 1; + my $table = GetTagTable($tableName); + # recursively scan through tables in subdirectories + my @moreTables; + $caseInsensitive = ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP'); + $numbersFirst = -1 if $$table{VARS} and $$table{VARS}{ALPHA_FIRST}; + my @keys = SortedTagTableKeys($table); + $numbersFirst = 1; + foreach (@keys) { + my @infoArray = GetTagInfoList($table,$_); + my $tagInfo; + foreach $tagInfo (@infoArray) { + my $subdir = $$tagInfo{SubDirectory} or next; + $tableName = $$subdir{TagTable} or next; + next if $gotTable{$tableName}; # next if table already loaded + push @moreTables, $tableName; # must scan this one too + } + } + unshift @tableNames, @moreTables; + } + # clean up the order for tables which are out of order + # (groups all Canon and Kodak tables together) + my %fixOrder; + foreach (@outOfOrder) { + next unless /^Image::ExifTool::(\w+)/; + # only re-order tables which have a corresponding main table + next unless $mainTables{$1}; + $fixOrder{$1} = []; # fix the order of these tables + } + my (@sortedTables, %fixPos, $pos); + foreach (@orderedTables) { + if (/^Image::ExifTool::(\w+)/ and $fixOrder{$1}) { + my $fix = $fixOrder{$1}; + unless (@$fix) { + $pos = @sortedTables; + $fixPos{$pos} or $fixPos{$pos} = []; + push @{$fixPos{$pos}}, $1; + } + push @{$fix}, $_; + } else { + push @sortedTables, $_; + } + } + # insert back in better order + foreach $pos (sort { $b <=> $a } keys %fixPos) { # (reverse sort) + my $fix = $fixPos{$pos}; + foreach (@$fix) { + splice(@sortedTables, $pos, 0, @{$fixOrder{$_}}); + } + } + # add the extra tables + push @sortedTables, @_; + # tweak the table order + TweakOrder(\@sortedTables, \%tweakOrder); + + return @sortedTables; +} + +#------------------------------------------------------------------------------ +# Open HTMLFILE and print header and description +# Inputs: 0) Filename, 1) optional category +# Returns: True on success +my %createdFiles; +sub OpenHtmlFile($;$$) +{ + my ($htmldir, $category, $sepTable) = @_; + my ($htmlFile, $head, $title, $url, $class); + my $top = ''; + + if ($category) { + my @names = split ' ', $category; + $class = shift @names; + $htmlFile = "$htmldir/TagNames/$class.html"; + $head = $category; + if ($head =~ /^\S+ .+ Struct$/) { + pop @names; + } else { + $head .= ($sepTable ? ' Values' : ' Tags'); + } + ($title = $head) =~ s/ .* / /; + @names and $url = join '_', @names; + } else { + $htmlFile = "$htmldir/TagNames/index.html"; + $category = $class = 'ExifTool'; + $head = $title = 'ExifTool Tag Names'; + } + if ($createdFiles{$htmlFile}) { + open(HTMLFILE, ">>${htmlFile}_tmp") or return 0; + } else { + open(HTMLFILE, ">${htmlFile}_tmp") or return 0; + print HTMLFILE "$docType<html>\n"; + print HTMLFILE "<!-- (this file generated automatically by Image::ExifTool::BuildTagLookup) -->\n"; + print HTMLFILE "<head>\n<title>$title</title>\n"; + print HTMLFILE "<link rel=stylesheet type='text/css' href='style.css' title='Style'>\n"; + print HTMLFILE "</head>\n<body>\n"; + if ($category ne $class and $docs{$class}) { + print HTMLFILE "<h2 class=top>$class Tags</h2>\n" or return 0; + print HTMLFILE '<p>',Doc2Html($docs{$class}),"</p>\n" or return 0; + } else { + $top = " class=top"; + } + } + $head = "<a name='${url}'>$head</a>" if $url; + print HTMLFILE "<h2$top>$head</h2>\n" or return 0; + print HTMLFILE '<p>',Doc2Html($docs{$category}),"</p>\n" if $docs{$category}; + $createdFiles{$htmlFile} = 1; + return 1; +} + +#------------------------------------------------------------------------------ +# Close all html files and write trailers +# Returns: true on success +# Inputs: 0) BuildTagLookup object reference +sub CloseHtmlFiles($) +{ + my $self = shift; + my $preserveDate = $$self{PRESERVE_DATE}; + my $success = 1; + # get the date + my ($sec,$min,$hr,$day,$mon,$yr) = localtime; + my @month = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); + $yr += 1900; + my $date = "$month[$mon] $day, $yr"; + my $htmlFile; + my $countNewFiles = 0; + my $countSameFiles = 0; + foreach $htmlFile (keys %createdFiles) { + my $tmpFile = $htmlFile . '_tmp'; + my $fileDate = $date; + if ($preserveDate) { + my @lines = `grep '<i>Last revised' $htmlFile`; + $fileDate = $1 if @lines and $lines[-1] =~ m{<i>Last revised (.*)</i>}; + } + open(HTMLFILE, ">>$tmpFile") or $success = 0, next; + # write the trailers + print HTMLFILE "<hr>\n"; + print HTMLFILE "(This document generated automatically by Image::ExifTool::BuildTagLookup)\n"; + print HTMLFILE "<br><i>Created $createDate</i>\n" if $htmlFile eq 'html/TagNames/index.html'; + print HTMLFILE "<br><i>Last revised $fileDate</i>\n"; + print HTMLFILE "<p class=lf><a href="; + if ($htmlFile =~ /index\.html$/) { + print HTMLFILE "'../index.html'>&lt;-- Back to ExifTool home page</a></p>\n"; + } else { + print HTMLFILE "'index.html'>&lt;-- ExifTool Tag Names</a></p>\n" + } + print HTMLFILE "</body>\n</html>\n" or $success = 0; + close HTMLFILE or $success = 0; + # check for differences and only use new file if it was changed + # (so the date only gets updated if changes were really made) + my $useNewFile; + if ($success) { + open (TEMPFILE, $tmpFile) or $success = 0, last; + if (open (HTMLFILE, $htmlFile)) { + while (<HTMLFILE>) { + my $newLine = <TEMPFILE>; + if (defined $newLine) { + next if /^<br><i>Last revised/; + next if $_ eq $newLine; + } + # files are different -- use the new file + $useNewFile = 1; + last; + } + $useNewFile = 1 if <TEMPFILE>; + close HTMLFILE; + } else { + $useNewFile = 1; + } + close TEMPFILE; + if ($useNewFile) { + ++$countNewFiles; + rename $tmpFile, $htmlFile or warn("Error renaming temporary file\n"), $success = 0; + } else { + ++$countSameFiles; + unlink $tmpFile; # erase new file and use existing file + } + } + last unless $success; + } + # save number of files processed so we can check the results later + $self->{COUNT}->{'HTML files changed'} = $countNewFiles; + $self->{COUNT}->{'HTML files unchanged'} = $countSameFiles; + return $success; +} + +#------------------------------------------------------------------------------ +# Get bitmask for POD documentation +# Inputs: mask string from HTML docs +# Returns: mask string for POD, or '' +sub PodMask($) +{ + my $mask = shift; + return '' unless $mask =~ /^\[val( >> (\d+))? \& (0x[\da-f]+)\]/; + return sprintf(' & 0x%.2x', hex($3) << ($2 || 0)); +} + +#------------------------------------------------------------------------------ +# Write the TagName HTML and POD documentation +# Inputs: 0) BuildTagLookup object reference +# 1) output pod file (eg. 'lib/Image/ExifTool/TagNames.pod') +# 2) output html directory (eg. 'html') +# Returns: true on success +# Notes: My apologies for the patchwork code, but this is only used to generate the docs. +sub WriteTagNames($$) +{ + my ($self, $podFile, $htmldir) = @_; + my ($tableName, $short, $url, @sepTables, @structs); + my $tagNameInfo = $self->{TAG_NAME_INFO} or return 0; + my $idLabel = $self->{ID_LOOKUP}; + my $shortName = $self->{SHORT_NAME}; + my $sepTable = $self->{SEPARATE_TABLE}; + my $structs = $self->{STRUCTURES}; + my $structLookup = $self->{STRUCT_LOOKUP}; + my $success = 1; + my $columns = 6; # number of columns in html index + my $percent = int(100 / $columns); + + # open the file and write the header + open(PODFILE, ">$podFile") or return 0; + $docs{ExifTool} = eval qq{"$docs{ExifTool}"}; + print PODFILE Doc2Pod($docs{PodHeader}, $docs{ExifTool}, $docs{ExifTool2}); + mkdir "$htmldir/TagNames", 0777; + OpenHtmlFile($htmldir) or return 0; + print HTMLFILE "<blockquote>\n"; + print HTMLFILE "<table width='100%' class=frame><tr><td>\n"; + print HTMLFILE "<table width='100%' class=inner cellspacing=1><tr class=h>\n"; + print HTMLFILE "<th colspan=$columns><span class=l>Tag Table Index</span></th></tr>\n"; + print HTMLFILE "<tr class=b><td width='$percent%'>\n"; + + # get the full table list, adding shortcuts and plug-in tables to the end + my @tableNames = GetTableOrder('Image::ExifTool::Shortcuts::Main', @pluginTables); + + # get list of headings and add any missing ones + my $heading = 'xxx'; + my (@tableIndexNames, @headings); + foreach $tableName (@tableNames) { + $short = $$shortName{$tableName}; + my @names = split ' ', $short; + my $class = shift @names; + if (@names and $class ne 'Other') { + # add heading for tables without a Main + unless ($heading eq $class) { + $heading = $class; + push @tableIndexNames, $heading; + push @headings, $heading; + } + } else { + $heading = $short; + push @headings, $heading; + } + push @tableIndexNames, $tableName; + } + @tableNames = @tableIndexNames; + # print html index of headings only + my $count = 0; + my $lines = int((scalar(@headings) + $columns - 1) / $columns); + foreach $tableName (@headings) { + if ($count) { + if ($count % $lines) { + print HTMLFILE "<br>\n"; + } else { + print HTMLFILE "</td><td width='$percent%'>\n"; + } + } + $short = $$shortName{$tableName}; + $short = $tableName unless $short; + $url = "$short.html"; + # handle various tables in "Other.pm" + if ($short =~ /^Other (.*)/) { + $short = $1; + $url = 'Other.html#' . $1; + } else { + $url = "$short.html"; + } + print HTMLFILE "<a href='${url}'>$short</a>"; + ++$count; + } + print HTMLFILE "\n</td></tr></table></td></tr></table></blockquote>\n"; + print HTMLFILE '<p>',Doc2Html($docs{ExifTool2}),"</p>\n"; + + # write all the tag tables + while (@tableNames or @sepTables or @structs) { + while (@sepTables) { + $tableName = shift @sepTables; + my $printConv = $$sepTable{$tableName}; + next unless ref $printConv eq 'HASH'; + $$sepTable{$tableName} = 1; + my $notes = $$printConv{Notes}; + if ($notes) { + # remove unnecessary whitespace + $notes =~ s/^\s+//; $notes =~ s/\s+$//; + $notes =~ s/(^[ \t]+|[ \t]+$)//mg; + } + my $head = $tableName; + $head =~ s/^.* //s; + close HTMLFILE; + if (OpenHtmlFile($htmldir, $tableName, 1)) { + print HTMLFILE '<p>', Doc2Html($notes), "</p>\n" if $notes; + print HTMLFILE "<blockquote>\n"; + print HTMLFILE "<table class=frame><tr><td>\n"; + print HTMLFILE "<table class='inner sep' cellspacing=1>\n"; + my $align = ' class=r'; + my $wid = 0; + my @keys; + foreach (sort { NumbersFirst($a,$b) } keys %$printConv) { + next if /^(Notes|PrintHex|PrintString|OTHER)$/; + $align = '' if $align and /[^\d]/; + my $w = length($_) + length($$printConv{$_}); + $wid = $w if $wid < $w; + push @keys, $_; + if ($$printConv{$_} =~ /[\0-\x1f\x7f-\xff]/) { + warn "Warning: Special characters in $tableName PrintConv ($$printConv{$_})\n"; + } + } + $wid = length($tableName)+7 if $wid < length($tableName)+7; + # print in multiple columns if there is room + my $cols = int(110 / ($wid + 4)); + $cols = 1 if $cols < 1 or $cols > @keys or @keys < 4; + my $rows = int((scalar(@keys) + $cols - 1) / $cols); + my ($r, $c); + print HTMLFILE '<tr class=h>'; + for ($c=0; $c<$cols; ++$c) { + print HTMLFILE "<th>Value</th><th>$head</th>"; + } + print HTMLFILE "</tr>\n"; + for ($r=0; $r<$rows; ++$r) { + print HTMLFILE '<tr>'; + for ($c=0; $c<$cols; ++$c) { + my $key = $keys[$r + $c*$rows]; + my ($index, $prt); + if (defined $key) { + $index = $key; + $prt = '= ' . EscapeHTML($$printConv{$key}); + if ($$printConv{PrintHex}) { + $index =~ s/(\.\d+)$//; # remove decimal + $index = sprintf('0x%x',$index); + $index .= $1 if $1; # add back decimal + } elsif ($$printConv{PrintString} or + $index !~ /^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/) + { + $index = "'" . EscapeHTML($index) . "'"; + } + } else { + $index = $prt = '&nbsp;'; + } + my ($ic, $pc); + if ($c & 0x01) { + $pc = ' class=b'; + $ic = $align ? " class='r b'" : $pc; + } else { + $ic = $align; + $pc = ''; + } + print HTMLFILE "<td$ic>$index</td><td$pc>$prt</td>\n"; + } + print HTMLFILE '</tr>'; + } + print HTMLFILE "</table></td></tr></table></blockquote>\n\n"; + } + } + last unless @tableNames or @structs; + my $isStruct; + if (@structs) { + $tableName = shift @structs; + next if $$structs{$tableName} == 2; # only list each structure once + $$structs{$tableName} = 2; + $isStruct = $$structLookup{$tableName}; + $isStruct or warn("Missing structure $tableName\n"), next; + $tableName = "XMP $tableName" unless $tableName =~ / /; + $short = $tableName = "$tableName Struct"; + my $maxLen = 0; + $maxLen < length and $maxLen = length foreach keys %$isStruct; + $$self{LONG_ID}{$tableName} = $maxLen; + } else { + $tableName = shift @tableNames; + $short = $$shortName{$tableName}; + unless ($short) { + # this is just an index heading + print PODFILE "\n=head2 $tableName Tags\n"; + print PODFILE Doc2Pod($docs{$tableName}) if $docs{$tableName}; + next; + } + } + my $isExif = ($tableName eq 'Image::ExifTool::Exif::Main'); + my $isRiff = ($tableName eq 'Image::ExifTool::RIFF::Info'); + my $isXmpMain = ($tableName eq 'Image::ExifTool::XMP::Main'); + my $info = $$tagNameInfo{$tableName}; + my $id = $$idLabel{$tableName}; + my ($hid, $showGrp); + # widths of the different columns in the POD documentation + my ($wID,$wTag,$wReq,$wGrp) = (8,36,24,10); + my ($composite, $derived, $notes, $longTags, $wasLong, $prefix); + if ($short eq 'Shortcuts') { + $derived = '<th>Refers To</th>'; + $composite = 2; + } elsif ($isStruct) { + $derived = ''; + $notes = $$isStruct{NOTES}; + } else { + my $table = GetTagTable($tableName); + $notes = $$table{NOTES}; + if ($$table{NAMESPACE}) { + my $ns = $Image::ExifTool::XMP::stdXlatNS{$$table{NAMESPACE}} || $$table{NAMESPACE}; + my $msg = "These tags belong to the ExifTool XMP-$ns family 1 group."; + if ($notes) { + $notes =~ s/\s+$//; + $notes .= "\n\n" . $msg; + } else { + $notes = $msg; + } + } + $longTags = $$table{VARS}{LONG_TAGS} if $$table{VARS}; + if ($$table{GROUPS}{0} eq 'Composite') { + $composite = 1; + $derived = '<th>Derived From</th>'; + } else { + $composite = 0; + $derived = ''; + } + } + my $podIdLen = $self->{LONG_ID}->{$tableName}; + if ($notes) { + # remove unnecessary whitespace + $notes =~ s/^\s+//; $notes =~ s/\s+$//; + $notes =~ s/(^[ \t]+|[ \t]+$)//mg; + if ($notes =~ /leading '(.*?_)' which/) { + $prefix = $1; + $podIdLen -= length $prefix; + } + } + if ($podIdLen <= $wID) { + $podIdLen = $wID; + } elsif ($short eq 'DICOM') { + $podIdLen = 10; + } else { + # align tag names in secondary columns if possible + my $col = ($podIdLen <= 10) ? 12 : 20; + $podIdLen = $col if $podIdLen < $col; + } + if ($id) { + ($hid = "<th>$id</th>") =~ s/ /&nbsp;/g; + $wTag -= $podIdLen - $wID; + $wID = $podIdLen; + my $longTag = $self->{LONG_NAME}->{$tableName}; + if ($wTag < $longTag) { + if ($wID - $longTag + $wTag >= 6) { # don't let ID column get too narrow + $wID -= $longTag - $wTag; + $wTag = $longTag; + } + $wasLong = 1 if $wID <= $self->{LONG_ID}->{$tableName}; + } + } elsif ($composite) { + $wTag += $wID - $wReq; + $hid = ''; + } else { + $wTag += 9; + $hid = ''; + } + if ($short eq 'EXIF' or $short eq 'Extra') { + $derived = '<th>Group</th>'; + $showGrp = 1; + $wGrp += 8 if $short eq 'Extra'; # tweak Group column width for "Extra" tags + $wTag -= $wGrp + 1; + } + my $head = ($short =~ / /) ? 'head3' : 'head2'; + my $str = $isStruct ? '' : ' Tags'; + print PODFILE "\n=$head $short$str\n"; + print PODFILE Doc2Pod($docs{$short}) if $docs{$short}; + print PODFILE "\n", Doc2Pod($notes), "\n" if $notes; + my $line = "\n"; + if ($id) { + # shift over 'Index' heading by one character for a bit more balance + $id = " $id" if $id eq 'Index'; + $line .= sprintf " %-${wID}s", $id; + } else { + $line .= ' '; + } + my $tagNameHeading = ($short eq 'XMP') ? 'Namespace' : ($isStruct?'Field':'Tag').' Name'; + $line .= sprintf " %-${wTag}s", $tagNameHeading; + $line .= sprintf " %-${wReq}s", $composite == 2 ? 'Refers To' : 'Derived From' if $composite; + $line .= sprintf " %-${wGrp}s", 'Group' if $showGrp; + $line .= ' Writable'; + print PODFILE $line; + $line =~ s/^(\s*\w.{6}\w) /$1\t/; # change space to tab after long ID label (eg. "Sequence") + $line =~ s/\S/-/g; + $line =~ s/- -/---/g; + $line =~ tr/\t/ /; # change tab back to space + print PODFILE $line,"\n"; + close HTMLFILE; + OpenHtmlFile($htmldir, $short) or $success = 0; + print HTMLFILE '<p>',Doc2Html($notes), "</p>\n" if $notes; + print HTMLFILE "<blockquote>\n"; + print HTMLFILE "<table class=frame><tr><td>\n"; + print HTMLFILE "<table class=inner cellspacing=1>\n"; + print HTMLFILE "<tr class=h>$hid<th>$tagNameHeading</th>\n"; + print HTMLFILE "<th>Writable</th>$derived<th>Values / ${noteFont}Notes</span></th></tr>\n"; + my $rowClass = 1; + my $infoCount = 0; + my $infoList; + foreach $infoList (@$info) { + ++$infoCount; + my ($tagIDstr, $tagNames, $writable, $values, $require, $writeGroup) = @$infoList; + my ($align, $idStr, $w, $tip); + my $wTag2 = $wTag; + if (not $id) { + $idStr = ' '; + } elsif ($tagIDstr =~ /^-?\d+(\.\d+)?$/) { + $w = $wID - 3; + $idStr = sprintf " %${w}g ", $tagIDstr; + my $tooLong = length($idStr) - 6 - $w; + if ($tooLong) { + $tooLong = 3 if $tooLong > 3; + $idStr = substr($idStr, 0, -$tooLong); + } + $align = " class=r"; + } else { + $tagIDstr =~ s/^'$prefix/'/ if $prefix; + $w = $wID; + my $over = length($tagIDstr) - $w; + if ($over > 0) { + # shift over tag name if there is room + if ($over <= $wTag - length($$tagNames[0])) { + $wTag2 -= $over; + $w += $over; + } else { + # put tag name on next line if ID is too long + $idStr = " $tagIDstr\n " . (' ' x $w); + if ($longTags) { + --$longTags; + } else { + warn "Notice: Split $$tagNames[0] line\n"; + } + } + } + $idStr = sprintf " %-${w}s ", $tagIDstr unless defined $idStr; + $align = ''; + } + my @reqs; + my @tags = @$tagNames; + my @wGrp = @$writeGroup; + my @vals = @$writable; + my $wrStr = shift @vals; + my $subdir; + my @masks = grep /^\[val( >> \d+)? \& 0x[\da-f]+\]/, @$values; + my $tag = shift @tags; + # if this is a subdirectory or structure, print subdir name (from values) instead of writable + if ($wrStr =~ /^[-=]/) { + $subdir = 1; + if (@masks) { + # combine any mask into the format string + $wrStr .= PodMask($masks[0]); + shift @masks; + @vals = grep !/^\[val( >> \d+)? \& 0x[\da-f]+\]/, @$values; + } else { + @vals = @$values; + } + # remove Notes if subdir has Notes as well + shift @vals if $vals[0] =~ /^\(/ and @vals >= @$writable; + foreach (@vals) { /^\(/ and $_ = '-' } + my $i; # fill in any missing entries from non-directory tags + for ($i=0; $i<@$writable; ++$i) { + $vals[$i] = $$writable[$i] unless defined $vals[$i]; + if (@masks) { + $vals[$i] .= PodMask($masks[0]); + shift @masks; + } + } + if ($$sepTable{$vals[0]}) { + $wrStr =~ s/^[-=]//; + $wrStr = 'no' unless $wrStr; + } elsif ($$structs{$vals[0]}) { + my $flags = $wrStr =~ /([+_]+)$/ ? $1 : ''; + $wrStr = "$vals[0] Struct$flags"; + } else { + $wrStr = $vals[0]; + } + shift @vals; + } elsif ($wrStr and $wrStr ne 'no' and @masks) { + # fill in missing entries if masks are different + my $mask = shift @masks; + while (@masks > @vals) { + last if $masks[@vals] eq $mask; + push @vals, $wrStr; + push @tags, $tag if @tags < @vals; + } + # add Mask to Writable column in POD doc + $wrStr .= PodMask($mask); + } + my $pod = sprintf "%s%-${wTag2}s", $idStr, $tag; + my $tGrp = $wGrp; + if ($id and length($tag) > $wTag2) { + my $madeRoom; + if ($showGrp) { + my $wGrp0 = length($wGrp[0] || '-'); + if (not $composite and $wGrp > $wGrp0) { + $tGrp = $wGrp - (length($tag) - $wTag2); + if ($tGrp < length $wGrp0) { + $tGrp = length $wGrp0; + } else { + $madeRoom = 1; + } + } + } + warn "Warning: Pushed $tag\n" unless $madeRoom; + } + $pod .= sprintf " %-${tGrp}s", shift(@wGrp) || '-' if $showGrp; + if ($composite) { + @reqs = @$require; + $w = $wReq; # Keep writable column in line + length($tag) > $wTag2 and $w -= length($tag) - $wTag2; + $pod .= sprintf " %-${w}s", shift(@reqs) || ''; + } + $pod .= " $wrStr"; + # limit line length to 82 characters (even if it means messing up column alignment) + if (length $pod > 82 and $pod !~ /\n/) { + my $remove = length($pod) - 82; + $pod =~ s/(\w)\s{$remove}/$1/; + } + print PODFILE $pod, "\n"; + my $numTags = scalar @$tagNames; + my $n = 0; + while (@tags or @reqs or @vals) { + my $more = (@tags or @reqs); + $line = ' '; + $line .= ' 'x($wID+1) if $id; + $line .= sprintf("%-${wTag2}s", shift(@tags) || ''); + $line .= sprintf(" %-${wReq}s", shift(@reqs) || '') if $composite; + $line .= sprintf(" %-${wGrp}s", shift(@wGrp) || '-') if $showGrp; + ++$n; + if (@vals) { + my $val = shift @vals; + # use writable if this is a note + my $wrStr = $$writable[$n]; + if ($subdir and ($val =~ /^\(/ or $val =~ /=/ or ($wrStr and $wrStr !~ /^[-=]/))) { + $val = $wrStr; + if (defined $val) { + $val =~ s/^[-=]//; + } else { + # done with tag if nothing else to print + last unless $more; + } + } + if (defined $val) { + $line .= " $val"; + if (@masks) { + $line .= PodMask($masks[0]); + shift @masks; + } + } + } + $line =~ s/\s+$//; # trim trailing white space + print PODFILE "$line\n"; + } + my @htmlTags; + foreach (@$tagNames) { + push @htmlTags, EscapeHTML($_); + } + if (($isExif and $Image::ExifTool::Validate::exifSpec{hex $tagIDstr}) or + ($isRiff and $tagIDstr=~/(\w+)/ and $riffSpec{$1}) or + ($isXmpMain and $tagIDstr=~/([-\w]+)/ and $xmpSpec{$1})) + { + # underline "unknown" makernote tags only + my $n = $tagIDstr eq '0x927c' ? -1 : 0; + $htmlTags[$n] = "<u>$htmlTags[$n]</u>"; + } + $rowClass = $rowClass ? '' : " class=b"; + my $isSubdir; + if ($$writable[0] =~ /^[-=]/) { + $isSubdir = 1; + s/^[-=](.+)/$1/ foreach @$writable; + } + # add tooltip for hex conversion of Tag ID + if ($tagIDstr =~ /^(0x[0-9a-f]+)(\.\d+)?$/i) { + $tip = sprintf(" title='$tagIDstr = %u%s'", hex($1), $2||''); + } elsif ($tagIDstr =~ /^(\d+)(\.\d*)?$/) { + $tip = sprintf(" title='%u = 0x%x'", $1, $1); + } else { + $tip = ''; + # use copyright symbol in QuickTime UserData tags + $tagIDstr =~ s/^"\\xa9/"&copy;/; + } + # add tooltip for special writable attributes + my $wtip = ''; + my %wattr = ( + '_' => 'Flattened', + '+' => 'List', + '/' => 'Avoid', + '~' => 'Writable only with -n', + '!' => 'Unsafe', + '*' => 'Protected', + ':' => 'Mandatory', + '^' => 'Deletable', + ); + my ($wstr, %hasAttr, @hasAttr); + foreach $wstr (@$writable) { + next unless $wstr =~ m{([+/~!*:_^]+)$}; + my @a = split //, $1; + foreach (@a) { + next if $hasAttr{$_}; + push @hasAttr, $_; + $hasAttr{$_} = 1; + } + } + if (@hasAttr) { + $wtip = " title='"; + my $n = 0; + foreach (@hasAttr) { + $wtip .= "\n" if $n; + $wtip .= " $_ = $wattr{$_}"; + ++$n; + } + $wtip .= "'"; + } + # print this row in the tag table + print HTMLFILE "<tr$rowClass>\n"; + print HTMLFILE "<td$align$tip>$tagIDstr</td>\n" if $id; + print HTMLFILE "<td>", join("\n <br>",@htmlTags), "</td>\n"; + print HTMLFILE "<td class=c$wtip>",join('<br>',@$writable),"</td>\n"; + print HTMLFILE '<td class=n>',join("\n <br>",@$require),"</td>\n" if $composite; + print HTMLFILE "<td class=c>",join('<br>',@$writeGroup),"</td>\n" if $showGrp; + print HTMLFILE "<td>"; + if (@$values) { + if ($isSubdir) { + my ($smallNote, @values); + foreach (@$values) { + if (/^\(/) { + $_ = Doc2Html($_); + # set the note font + $smallNote = 1 if $numTags < 2; + push @values, ($smallNote ? $noteFontSmall : $noteFont) . "$_</span>"; + next; + } + # make text in square brackets small + if (/^\[/) { + if (s/^\[!HTML\]//) { + push @values, $_; + } else { + $_ = Doc2Html($_); + push @values, "<span class=s>$_</span>"; + } + next; + } + /=/ and push(@values, $_), next; + my @names = split; + my $suffix = ' Tags'; + if ($$sepTable{$_}) { + push @sepTables, $_; + $suffix = ' Values'; + } + # handle structures specially + if ($$structs{$_}) { + # assume XMP module for this struct unless otherwise specified + unshift @names, 'XMP' unless / /; + push @structs, $_; # list this later + # hack to put Area Struct in with XMP tags, + # even though it is only used by the MWG module + push @structs, 'Area' if $_ eq 'Dimensions'; + $suffix = ' Struct'; + } + $url = (shift @names) . '.html'; + @names and $url .= '#' . join '_', @names; + push @values, "--&gt; <a href='${url}'>$_$suffix</a>"; + } + # put small note last + $smallNote and push @values, shift @values; + print HTMLFILE join("\n <br>",@values); + } else { + my ($close, $br) = ('', ''); + foreach (@$values) { + if (s/^\[!HTML\]//) { + print HTMLFILE $close if $close; + print HTMLFILE $_; + $close = $br = ''; + } else { + if (/^\(/) { + # notes can use POD syntax + $_ = $noteFont . Doc2Html($_) . "</span>"; + } else { + $_ = EscapeHTML($_); + } + $close or $_ = "<span class=s>$_", $close = '</span>'; + print HTMLFILE $br, $_; + $br = "\n <br>"; + } + } + print HTMLFILE $close if $close; + } + } else { + print HTMLFILE '&nbsp;'; + } + print HTMLFILE "</td></tr>\n"; + } + warn "$longTags unaccounted-for long tags in $tableName\n" if $longTags; + if ($wasLong and not defined $longTags) { + warn "Notice: Long tags in $tableName table\n"; + } + unless ($infoCount) { + print PODFILE " [no tags known]\n"; + my $cols = 3; + ++$cols if $hid; + ++$cols if $derived; + print HTMLFILE "<tr><td colspan=$cols class=c><i>[no tags known]</i></td></tr>\n"; + } + print HTMLFILE "</table></td></tr></table></blockquote>\n\n"; + } + close(HTMLFILE) or $success = 0; + CloseHtmlFiles($self) or $success = 0; + print PODFILE Doc2Pod($docs{PodTrailer}) or $success = 0; + close(PODFILE) or $success = 0; + return $success; +} + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::BuildTagLookup - Build ExifTool tag lookup tables + +=head1 DESCRIPTION + +This module is used to generate the tag lookup tables in +Image::ExifTool::TagLookup.pm and tag name documentation in +Image::ExifTool::TagNames.pod, as well as HTML tag name documentation. It +is used before each new ExifTool release to update the lookup tables and +documentation, but it is not used otherwise. It also performs some +validation and consistency checks on the tag tables. + +=head1 SYNOPSIS + + use Image::ExifTool::BuildTagLookup; + + $builder = new Image::ExifTool::BuildTagLookup; + + # update Image::ExifTool::TagLookup + $ok = $builder->WriteTagLookup('lib/Image/ExifTool/TagLookup.pm'); + + # update the tag name documentation + $ok = $builder->WriteTagNames('lib/Image/ExifTool/TagNames.pod','html'); + + # print some statistics + my $count = $$builder{COUNT}; + foreach (sort keys %$count) { + printf "%5d %s\n", $$count{$_}, $_; + } + +=head1 MEMBER VARIABLES + +=over 4 + +=item PRESERVE_DATE + +Flag to preserve "Last revised" date in HTML files. Set before calling +WriteTagNames(). + +=item COUNT + +Reference to hash containing counting statistics. Keys are the +descriptions, and values are the numerical counts. Valid after +BuildTagLookup object is created, but additional statistics are added by +WriteTagNames(). + +=item WRITE_PSEUDO + +Returned list of writable pseudo tags. + +=back + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagLookup(3pm)|Image::ExifTool::TagLookup>, +L<Image::ExifTool::TagNames(3pm)|Image::ExifTool::TagNames> + +=cut diff --git a/lib/Image/ExifTool/CBOR.pm b/lib/Image/ExifTool/CBOR.pm new file mode 100644 index 0000000..267c1cb --- /dev/null +++ b/lib/Image/ExifTool/CBOR.pm @@ -0,0 +1,331 @@ +#------------------------------------------------------------------------------ +# File: CBOR.pm +# +# Description: Read CBOR format metadata +# +# Revisions: 2021-09-30 - P. Harvey Created +# +# References: 1) https://c2pa.org/public-draft/ +# 2) https://datatracker.ietf.org/doc/html/rfc7049 +#------------------------------------------------------------------------------ + +package Image::ExifTool::CBOR; +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::JSON; + +$VERSION = '1.01'; + +sub ProcessCBOR($$$); +sub ReadCBORValue($$$$); + +# optional CBOR type code +my %cborType6 = ( + 0 => 'date/time string', + 1 => 'epoch-based date/time', + 2 => 'positive bignum', + 3 => 'negative bignum', + 4 => 'decimal fraction', + 5 => 'bigfloat', + 21 => 'expected base64url encoding', + 22 => 'expected base64 encoding', + 23 => 'expected base16 encoding', + 24 => 'encoded CBOR data', + 32 => 'URI', + 33 => 'base64url', + 34 => 'base64', + 35 => 'regular expression', + 36 => 'MIME message', + 55799 => 'CBOR magic number', +); + +my %cborType7 = ( + 20 => 'False', + 21 => 'True', + 22 => 'null', + 23 => 'undef', +); + +%Image::ExifTool::CBOR::Main = ( + GROUPS => { 0 => 'JUMBF', 1 => 'CBOR', 2 => 'Other' }, + VARS => { NO_ID => 1 }, + PROCESS_PROC => \&ProcessCBOR, + NOTES => q{ + The tags below are extracted from CBOR (Concise Binary Object + Representation) metadata. The C2PA specification uses this format for some + metadata. As well as these tags, ExifTool will read any existing tags. + }, + 'dc:title' => 'Title', + 'dc:format' => 'Format', + # my sample file has the following 2 tags in CBOR, but they should be JSON + authorName => { Name => 'AuthorName', Groups => { 2 => 'Author' } }, + authorIdentifier=> { Name => 'AuthorIdentifier', Groups => { 2 => 'Author' } }, + documentID => { }, + instanceID => { }, + thumbnailHash => { List => 1 }, + thumbnailUrl => { Name => 'ThumbnailURL' }, + relationship => { } +); + +#------------------------------------------------------------------------------ +# Read CBOR value +# Inputs: 0) ExifTool ref, 1) data ref, 2) position in data, 3) data end +# Returns: 0) value, 1) error string, 2) new data position +sub ReadCBORValue($$$$) +{ + my ($et, $dataPt, $pos, $end) = @_; + return(undef, 'Truncated CBOR data', $pos) if $pos >= $end; + my $verbose = $$et{OPTIONS}{Verbose}; + my $indent = $$et{INDENT}; + my $dumpStart = $pos; + my $fmt = Get8u($dataPt, $pos++); + my $dat = $fmt & 0x1f; + my ($num, $val, $err, $size); + $fmt >>= 5; + if ($dat < 24) { + $num = $dat; + } elsif ($dat == 31) { # indefinite count (not used in C2PA) + $num = -1; # (flag for indefinite count) + $et->VPrint(1, "$$et{INDENT} (indefinite count):\n"); + } else { + my $format = { 24 => 'int8u', 25 => 'int16u', 26 => 'int32u', 27 => 'int64u' }->{$dat}; + return(undef, "Invalid CBOR integer type $dat", $pos) unless $format; + $size = Image::ExifTool::FormatSize($format); + return(undef, 'Truncated CBOR integer value', $pos) if $pos + $size > $end; + $num = ReadValue($dataPt, $pos, $format, 1, $size); + $pos += $size; + } + my $pre = ''; + if (defined $$et{cbor_pre} and $fmt != 6) { + $pre = $$et{cbor_pre}; + delete $$et{cbor_pre}; + } + if ($fmt == 0) { # positive integer + $val = $num; + $et->VPrint(1, "$$et{INDENT} ${pre}int+: $val\n"); + } elsif ($fmt == 1) { # negative integer + $val = -1 * $num; + $et->VPrint(1, "$$et{INDENT} ${pre}int-: $val\n"); + } elsif ($fmt == 2 or $fmt == 3) { # byte/UTF8 string + return(undef, 'Truncated CBOR string value', $pos) if $pos + $num > $end; + if ($num < 0) { # (should not happen in C2PA) + my $string = ''; + $$et{INDENT} .= ' '; + for (;;) { + ($val, $err, $pos) = ReadCBORValue($et, $dataPt, $pos, $end); + return(undef, $err, $pos) if $err; + last if not defined $val; # hit the break? + # (note: strictly we should be checking that this was a string we read) + $string .= $val; + } + $$et{INDENT} = $indent; + return($string, undef, $pos); # return concatenated byte/text string + } else { + $val = substr($$dataPt, $pos, $num); + } + $pos += $num; + if ($fmt == 2) { # (byte string) + $et->VPrint(1, "$$et{INDENT} ${pre}byte: <binary data ".length($val)." bytes>\n"); + my $dat = $val; + $val = \$dat; # use scalar reference for binary data + } else { # (text string) + $val = $et->Decode($val, 'UTF8'); + $et->VPrint(1, "$$et{INDENT} ${pre}text: '${val}'\n"); + } + } elsif ($fmt == 4 or $fmt == 5) { # list/hash + if ($fmt == 4) { + $et->VPrint(1, "$$et{INDENT} ${pre}list: <$num elements>\n"); + } else { + $et->VPrint(1, "$$et{INDENT} ${pre}hash: <$num pairs>\n"); + $num *= 2; + } + $$et{INDENT} .= ' '; + my $i = 0; + my @list; + Image::ExifTool::HexDump($dataPt, $pos - $dumpStart, + Start => $dumpStart, + DataPos => $$et{cbor_datapos}, + Prefix => $$et{INDENT}, + ) if $verbose > 2; + while ($num) { + $$et{cbor_pre} = "$i) "; + if ($fmt == 4) { + ++$i; + } elsif ($num & 0x01) { + $$et{cbor_pre} = ' ' x length($$et{cbor_pre}); + ++$i; + } + ($val, $err, $pos) = ReadCBORValue($et, $dataPt, $pos, $end); + return(undef, $err, $pos) if $err; + if (not defined $val) { + return(undef, 'Unexpected list terminator', $pos) unless $num < 0; + last; + } + push @list, $val; + --$num; + } + $dumpStart = $pos; + $$et{INDENT} = $indent; + if ($fmt == 5) { + my ($i, @keys); + my %hash = ( _ordered_keys_ => \@keys ); + for ($i=0; $i<@list-1; $i+=2) { + $hash{$list[$i]} = $list[$i+1]; + push @keys, $list[$i]; # save ordered list of keys + } + $val = \%hash; + } else { + $val = \@list; + } + } elsif ($fmt == 6) { # optional tag + if ($verbose) { + my $str = "$num (" . ($cborType6{$num} || 'unknown') . ')'; + my $spc = $$et{cbor_pre} ? (' ' x length $$et{cbor_pre}) : ''; + $et->VPrint(1, "$$et{INDENT} $spc<CBOR optional type $str>\n"); + Image::ExifTool::HexDump($dataPt, $pos - $dumpStart, + Start => $dumpStart, + DataPos => $$et{cbor_datapos}, + Prefix => $$et{INDENT} . ' ', + ) if $verbose > 2; + } + # read next value (note: in the case of multiple tags, + # this nesting will apply the tags in the correct order) + ($val, $err, $pos) = ReadCBORValue($et, $dataPt, $pos, $end); + $dumpStart = $pos; + # convert some values according to the optional tag number (untested) + if ($num == 0 and not ref $val) { # date/time string + require Image::ExifTool::XMP; + $val = Image::ExifTool::XMP::ConvertXMPDate($val); + } elsif ($num == 1 and not ref $val) { # epoch-based date/time + if (Image::ExifTool::IsFloat($val)) { + my $dec = ($val == int($val)) ? undef : 6; + $val = Image::ExifTool::ConvertUnixTime($val, 1, $dec); + } + } elsif (($num == 2 or $num == 3) and ref($val) eq 'SCALAR') { # pos/neg bignum + my $big = 0; + $big = 256 * $big + Get8u($val,$_) foreach 0..(length($$val) - 1); + $val = $num==2 ? $big : -$big; + } elsif (($num == 4 or $num == 5) and # decimal fraction or bigfloat + ref($val) eq 'ARRAY' and @$val == 2 and + Image::ExifTool::IsInt($$val[0]) and Image::ExifTool::IsInt($$val[1])) + { + $val = $$val[1] * ($num == 4 ? 10 : 2) ** $$val[0]; + } + } elsif ($fmt == 7) { + if ($dat == 31) { + undef $val; # "break" = end of indefinite array/hash (not used in C2PA) + } elsif ($dat < 24) { + $val = $cborType7{$num}; + $val = "Unknown ($val)" unless defined $val; + } elsif ($dat == 25) { # half-precision float + my $exp = ($num >> 10) & 0x1f; + my $mant = $num & 0x3ff; + if ($exp == 0) { + $val = $mant ** -24; + $val *= -1 if $num & 0x8000; + } elsif (exp != 31) { + $val = ($mant + 1024) ** ($exp - 25); + $val *= -1 if $num & 0x8000; + } else { + $val = $mant == 0 ? '<inf>' : '<nan>'; + } + } elsif ($dat == 26) { # float + $val = GetFloat($dataPt, $pos - $size); + } elsif ($dat == 27) { # double + $val = GetDouble($dataPt, $pos - $size); + } else { + return(undef, "Invalid CBOR type 7 variant $num", $pos); + } + $et->VPrint(1, "$$et{INDENT} ${pre}typ7: ".(defined $val ? $val : '<break>')."\n"); + } else { + return(undef, "Unknown CBOR format $fmt", $pos); + } + Image::ExifTool::HexDump($dataPt, $pos - $dumpStart, + Start => $dumpStart, + DataPos => $$et{cbor_datapos}, + Prefix => $$et{INDENT} . ' ', + MaxLen => $verbose < 5 ? ($verbose == 3 ? 96 : 2048) : undef, + ) if $verbose > 2; + return($val, $err, $pos); +} + +#------------------------------------------------------------------------------ +# Read CBOR box +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessCBOR($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $end = $pos + $$dirInfo{DirLen}; + my ($val, $err, $tag, $i); + + $et->VerboseDir('CBOR', undef, $$dirInfo{DirLen}); + + $$et{cbor_datapos} = $$dirInfo{DataPos} + $$dirInfo{Base}; + + while ($pos < $end) { + ($val, $err, $pos) = ReadCBORValue($et, $dataPt, $pos, $end); + $err and $et->Warn($err), last; + if (ref $val eq 'HASH') { + foreach $tag (@{$$val{_ordered_keys_}}) { + Image::ExifTool::JSON::ProcessTag($et, $tagTablePtr, $tag, $$val{$tag}); + } + } elsif (ref $val eq 'ARRAY') { + for ($i=0; $i<@$val; ++$i) { + Image::ExifTool::JSON::ProcessTag($et, $tagTablePtr, "Item$i", $$val[$i]); + } + } elsif ($val eq '0') { + $et->VPrint(1, "$$et{INDENT} <CBOR end>\n"); + last; # (treat as padding) + } else { + $et->VPrint(1, "$$et{INDENT} Unknown value: $val\n"); + } + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::CBOR - Read CBOR format metadata + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool read Concise +Binary Object Representation (CBOR) formatted metadata, used by the C2PA +specification. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://c2pa.org/public-draft/> + +=item L<https://datatracker.ietf.org/doc/html/rfc7049> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/CBOR Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Canon.pm b/lib/Image/ExifTool/Canon.pm new file mode 100644 index 0000000..0b32cdd --- /dev/null +++ b/lib/Image/ExifTool/Canon.pm @@ -0,0 +1,10193 @@ +#------------------------------------------------------------------------------ +# File: Canon.pm +# +# Description: Canon EXIF maker notes tags +# +# Revisions: 11/25/2003 - P. Harvey Created +# 12/03/2003 - P. Harvey Decode lots more tags and add CanonAFInfo +# 02/17/2004 - Michael Rommel Added IxusAFPoint +# 01/27/2005 - P. Harvey Disable validation of CanonAFInfo +# 01/30/2005 - P. Harvey Added a few more tags (ref 4) +# 02/10/2006 - P. Harvey Decode a lot of new tags (ref 12) +# [ongoing] - P. Harvey Constantly decoding new information +# +# Notes: Must check FocalPlaneX/YResolution values for each new model! +# +# References: 1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html +# 2) Michael Rommel private communication (Digital Ixus) +# 3) Daniel Pittman private communication (PowerShot S70) +# 4) http://www.wonderland.org/crw/ +# 5) Juha Eskelinen private communication (20D) +# 6) Richard S. Smith private communication (20D) +# 7) Denny Priebe private communication (1DmkII) +# 8) Irwin Poche private communication +# 9) Michael Tiemann private communication (1DmkII) +# 10) Volker Gering private communication (1DmkII) +# 11) "cip" private communication +# 12) Rainer Honle private communication (5D) +# 13) http://www.cybercom.net/~dcoffin/dcraw/ +# 14) (bozi) http://www.cpanforum.com/threads/2476 and /2563 +# 15) http://homepage3.nifty.com/kamisaka/makernote/makernote_canon.htm (2007/11/19) +# + http://homepage3.nifty.com/kamisaka/makernote/CanonLens.htm (2007/11/19) +# 16) Emil Sit private communication (30D) +# 17) http://www.asahi-net.or.jp/~xp8t-ymzk/s10exif.htm +# 18) Samson Tai private communication (G7) +# 19) Warren Stockton private communication +# 20) Bogdan private communication +# 21) Heiko Hinrichs private communication +# 22) Dave Nicholson private communication (PowerShot S30) +# 23) Magne Nilsen private communication (400D) +# 24) Wolfgang Hoffmann private communication (40D) +# 25) Laurent Clevy private communication +# 26) Steve Balcombe private communication +# 27) Chris Huebsch private communication (40D) +# 28) Hal Williamson private communication (XTi) +# 29) Ger Vermeulen private communication +# 30) David Pitcher private communication (1DmkIII) +# 31) Darryl Zurn private communication (A590IS) +# 32) Rich Taylor private communication (5D) +# 33) D.J. Cristi private communication +# 34) Andreas Huggel and Pascal de Bruijn private communication +# 35) Jan Boelsma private communication +# 36) Karl-Heinz Klotz private communication (http://www.dslr-forum.de/showthread.php?t=430900) +# 37) Vesa Kivisto private communication (30D) +# 38) Kurt Garloff private communication (5DmkII) +# 39) Irwin Poche private communication (5DmkII) +# 40) Jose Oliver-Didier private communication +# 41) http://www.cpanforum.com/threads/10730 +# 42) Norbert Wasser private communication +# 43) Karsten Sote private communication +# 44) Hugh Griffiths private communication (5DmkII) +# 45) Mark Berger private communication (5DmkII) +# 46) Dieter Steiner private communication (7D) +# 47) http://www.exiv2.org/ +# 48) Tomasz A. Kawecki private communication (550D, firmware 1.0.6, 1.0.8) +# 49) http://www.listware.net/201101/digikam-users/49795-digikam-users-re-lens-recognition.html +# 50) https://exiftool.org/forum/index.php/topic,3833.0.html +# 51) https://exiftool.org/forum/index.php/topic,4110.0.html +# 52) Kai Harrekilde-Petersen private communication +# 53) Anton Reiser private communication +# 54) https://github.com/lclevy/canon_cr3 +# IB) Iliah Borg private communication (LibRaw) +# JD) Jens Duttke private communication +# JR) Jos Roost private communication +# NJ) Niels Kristian Bech Jensen private communication +#------------------------------------------------------------------------------ + +package Image::ExifTool::Canon; + +use strict; +use vars qw($VERSION %canonModelID %canonLensTypes); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +sub WriteCanon($$$); +sub ProcessSerialData($$$); +sub ProcessFilters($$$); +sub ProcessCTMD($$$); +sub ProcessExifInfo($$$); +sub SwapWords($); + +$VERSION = '4.59'; + +# Note: Removed 'USM' from 'L' lenses since it is redundant - PH +# (or is it? Ref 32 shows 5 non-USM L-type lenses) +# --> have relaxed this for new lenses because Canon has been +# consistent about keeping "USM" in the model name +%canonLensTypes = ( #4 + Notes => q{ + Decimal values have been added to differentiate lenses which would otherwise + have the same LensType, and are used by the Composite LensID tag when + attempting to identify the specific lens model. + }, + -1 => 'n/a', + 1 => 'Canon EF 50mm f/1.8', + 2 => 'Canon EF 28mm f/2.8 or Sigma Lens', + 2.1 => 'Sigma 24mm f/2.8 Super Wide II', #ClaudeJolicoeur + # (3 removed in current Kamisaka list) + 3 => 'Canon EF 135mm f/2.8 Soft', #15/32 + 4 => 'Canon EF 35-105mm f/3.5-4.5 or Sigma Lens', #28 + 4.1 => 'Sigma UC Zoom 35-135mm f/4-5.6', + 5 => 'Canon EF 35-70mm f/3.5-4.5', #32 + 6 => 'Canon EF 28-70mm f/3.5-4.5 or Sigma or Tokina Lens', #32 + 6.1 => 'Sigma 18-50mm f/3.5-5.6 DC', #23 + 6.2 => 'Sigma 18-125mm f/3.5-5.6 DC IF ASP', + 6.3 => 'Tokina AF 193-2 19-35mm f/3.5-4.5', + 6.4 => 'Sigma 28-80mm f/3.5-5.6 II Macro', #47 + 6.5 => 'Sigma 28-300mm f/3.5-6.3 DG Macro', #IB + 7 => 'Canon EF 100-300mm f/5.6L', #15 + 8 => 'Canon EF 100-300mm f/5.6 or Sigma or Tokina Lens', #32 + 8.1 => 'Sigma 70-300mm f/4-5.6 [APO] DG Macro', #15 (both APO and non-APO, ref forum2947) + 8.2 => 'Tokina AT-X 242 AF 24-200mm f/3.5-5.6', #15 + 9 => 'Canon EF 70-210mm f/4', #32 + 9.1 => 'Sigma 55-200mm f/4-5.6 DC', #34 + 10 => 'Canon EF 50mm f/2.5 Macro or Sigma Lens', #10 (+ LSC Life Size Converter --> 70mm - PH) + 10.1 => 'Sigma 50mm f/2.8 EX', #4 + 10.2 => 'Sigma 28mm f/1.8', + 10.3 => 'Sigma 105mm f/2.8 Macro EX', #15 + 10.4 => 'Sigma 70mm f/2.8 EX DG Macro EF', #Jean-Michel Dubois + 11 => 'Canon EF 35mm f/2', #9 + 13 => 'Canon EF 15mm f/2.8 Fisheye', #9 + 14 => 'Canon EF 50-200mm f/3.5-4.5L', #32 + 15 => 'Canon EF 50-200mm f/3.5-4.5', #32 + 16 => 'Canon EF 35-135mm f/3.5-4.5', #32 + 17 => 'Canon EF 35-70mm f/3.5-4.5A', #32 + 18 => 'Canon EF 28-70mm f/3.5-4.5', #32 + 20 => 'Canon EF 100-200mm f/4.5A', #32 + 21 => 'Canon EF 80-200mm f/2.8L', + 22 => 'Canon EF 20-35mm f/2.8L or Tokina Lens', #32 + 22.1 => 'Tokina AT-X 280 AF Pro 28-80mm f/2.8 Aspherical', #15 + 23 => 'Canon EF 35-105mm f/3.5-4.5', #32 + 24 => 'Canon EF 35-80mm f/4-5.6 Power Zoom', #32 + 25 => 'Canon EF 35-80mm f/4-5.6 Power Zoom', #32 + 26 => 'Canon EF 100mm f/2.8 Macro or Other Lens', + 26.1 => 'Cosina 100mm f/3.5 Macro AF', + 26.2 => 'Tamron SP AF 90mm f/2.8 Di Macro', #15 + 26.3 => 'Tamron SP AF 180mm f/3.5 Di Macro', #15 + 26.4 => 'Carl Zeiss Planar T* 50mm f/1.4', #PH + 26.5 => 'Voigtlander APO Lanthar 125mm F2.5 SL Macro', #JR + 26.6 => 'Carl Zeiss Planar T 85mm f/1.4 ZE', #IB + 27 => 'Canon EF 35-80mm f/4-5.6', #32 + # 27 => 'Carl Zeiss Distagon T* 28mm f/2 ZF', #PH (must be with an adapter, because the ZF version is a Nikon mount) + # 27 => 'EMF adapter for Canon EOS digital cameras', #50 (reports MaxFocalLength of 65535) + # 27 => optix adapter + # 27 => Venus Optics Laowa 12mm f2.8 Zero-D or 105mm f2 (T3.2) Smooth Trans Focus (ref IB) + # 27 => Venus Optics Laowa 105mm f2 STF (ref IB) + 28 => 'Canon EF 80-200mm f/4.5-5.6 or Tamron Lens', #32 + 28.1 => 'Tamron SP AF 28-105mm f/2.8 LD Aspherical IF', #15 + 28.2 => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro', #4 + # 28.3 => 'Tamron AF 70-300mm f/4.5-5.6 Di LD 1:2 Macro Zoom', #11 + 28.3 => 'Tamron AF 70-300mm f/4-5.6 Di LD 1:2 Macro', #47 + 28.4 => 'Tamron AF Aspherical 28-200mm f/3.8-5.6', #14 + 29 => 'Canon EF 50mm f/1.8 II', + 30 => 'Canon EF 35-105mm f/4.5-5.6', #32 + 31 => 'Canon EF 75-300mm f/4-5.6 or Tamron Lens', #32 + 31.1 => 'Tamron SP AF 300mm f/2.8 LD IF', #15 + 32 => 'Canon EF 24mm f/2.8 or Sigma Lens', #10 + 32.1 => 'Sigma 15mm f/2.8 EX Fisheye', #11 + 33 => 'Voigtlander or Carl Zeiss Lens', + 33.1 => 'Voigtlander Ultron 40mm f/2 SLII Aspherical', #45 + 33.2 => 'Voigtlander Color Skopar 20mm f/3.5 SLII Aspherical', #50 + 33.3 => 'Voigtlander APO-Lanthar 90mm f/3.5 SLII Close Focus', #50 + 33.4 => 'Carl Zeiss Distagon T* 15mm f/2.8 ZE', #PH + 33.5 => 'Carl Zeiss Distagon T* 18mm f/3.5 ZE', #PH + 33.6 => 'Carl Zeiss Distagon T* 21mm f/2.8 ZE', #PH + 33.7 => 'Carl Zeiss Distagon T* 25mm f/2 ZE', #IB + 33.8 => 'Carl Zeiss Distagon T* 28mm f/2 ZE', #PH + 33.9 => 'Carl Zeiss Distagon T* 35mm f/2 ZE', #PH + '33.10' => 'Carl Zeiss Distagon T* 35mm f/1.4 ZE', #IB + '33.11' => 'Carl Zeiss Planar T* 50mm f/1.4 ZE', #IB + '33.12' => 'Carl Zeiss Makro-Planar T* 50mm f/2 ZE', #IB + '33.13' => 'Carl Zeiss Makro-Planar T* 100mm f/2 ZE', #IB + '33.14' => 'Carl Zeiss Apo-Sonnar T* 135mm f/2 ZE', #JR + 35 => 'Canon EF 35-80mm f/4-5.6', #32 + 36 => 'Canon EF 38-76mm f/4.5-5.6', #32 + 37 => 'Canon EF 35-80mm f/4-5.6 or Tamron Lens', #32 + 37.1 => 'Tamron 70-200mm f/2.8 Di LD IF Macro', #PH + 37.2 => 'Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro (A20)', #38 + 37.3 => 'Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical [IF]', #34 + 37.4 => 'Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical [IF] Macro', #forum2937 + 38 => 'Canon EF 80-200mm f/4.5-5.6 II', #32 (II added ref https://github.com/Exiv2/exiv2/issues/1906) + 39 => 'Canon EF 75-300mm f/4-5.6', + 40 => 'Canon EF 28-80mm f/3.5-5.6', + 41 => 'Canon EF 28-90mm f/4-5.6', #32 + 42 => 'Canon EF 28-200mm f/3.5-5.6 or Tamron Lens', #32 + 42.1 => 'Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro (A20)', #15 + 43 => 'Canon EF 28-105mm f/4-5.6', #10 + 44 => 'Canon EF 90-300mm f/4.5-5.6', #32 + 45 => 'Canon EF-S 18-55mm f/3.5-5.6 [II]', #PH (same ID for version II, ref 20) + 46 => 'Canon EF 28-90mm f/4-5.6', #32 + # 46 => 'Tamron 28-300mm f/3.5-6.3 Di VC PZD (A010)', # (also possibly?) + 47 => 'Zeiss Milvus 35mm f/2 or 50mm f/2', #IB + 47.1 => 'Zeiss Milvus 50mm f/2 Makro', #IB + 47.2 => 'Zeiss Milvus 135mm f/2 ZE', #IB + 48 => 'Canon EF-S 18-55mm f/3.5-5.6 IS', #20 + 49 => 'Canon EF-S 55-250mm f/4-5.6 IS', #23 + 50 => 'Canon EF-S 18-200mm f/3.5-5.6 IS', + 51 => 'Canon EF-S 18-135mm f/3.5-5.6 IS', #PH + 52 => 'Canon EF-S 18-55mm f/3.5-5.6 IS II', #PH + 53 => 'Canon EF-S 18-55mm f/3.5-5.6 III', #Jon Charnas + 54 => 'Canon EF-S 55-250mm f/4-5.6 IS II', #47 + 60 => 'Irix 11mm f/4', #50 + 63 => 'Irix 30mm F1.4 Dragonfly', #IB + 80 => 'Canon TS-E 50mm f/2.8L Macro', #42 + 81 => 'Canon TS-E 90mm f/2.8L Macro', #42 + 82 => 'Canon TS-E 135mm f/4L Macro', #42 + 94 => 'Canon TS-E 17mm f/4L', #42 + 95 => 'Canon TS-E 24mm f/3.5L II', #43 + 103 => 'Samyang AF 14mm f/2.8 EF or Rokinon Lens', #IB + 103.1 => 'Rokinon SP 14mm f/2.4', #IB + 103.2 => 'Rokinon AF 14mm f/2.8 EF', #IB + 106 => 'Rokinon SP / Samyang XP 35mm f/1.2', #IB + 112 => 'Sigma 28mm f/1.5 FF High-speed Prime or other Sigma Lens', #IB + 112.1 => 'Sigma 40mm f/1.5 FF High-speed Prime', #IB + 112.2 => 'Sigma 105mm f/1.5 FF High-speed Prime', #IB + 117 => 'Tamron 35-150mm f/2.8-4.0 Di VC OSD (A043) or other Tamron Lens', #IB + 117.1 => 'Tamron SP 35mm f/1.4 Di USD (F045)', #Exiv2#1064 + 124 => 'Canon MP-E 65mm f/2.8 1-5x Macro Photo', #9 + 125 => 'Canon TS-E 24mm f/3.5L', + 126 => 'Canon TS-E 45mm f/2.8', #15 + 127 => 'Canon TS-E 90mm f/2.8 or Tamron Lens', #15 + 127.1 => 'Tamron 18-200mm f/3.5-6.3 Di II VC (B018)', #TomLachecki + 129 => 'Canon EF 300mm f/2.8L USM', #32 + 130 => 'Canon EF 50mm f/1.0L USM', #10/15 + 131 => 'Canon EF 28-80mm f/2.8-4L USM or Sigma Lens', #32 + 131.1 => 'Sigma 8mm f/3.5 EX DG Circular Fisheye', #15 + 131.2 => 'Sigma 17-35mm f/2.8-4 EX DG Aspherical HSM', #15 + 131.3 => 'Sigma 17-70mm f/2.8-4.5 DC Macro', #PH (NC) + 131.4 => 'Sigma APO 50-150mm f/2.8 [II] EX DC HSM', #15 ([II] ref PH) + 131.5 => 'Sigma APO 120-300mm f/2.8 EX DG HSM', #15 + # 'Sigma APO 120-300mm f/2.8 EX DG HSM + 1.4x', #15 + # 'Sigma APO 120-300mm f/2.8 EX DG HSM + 2x', #15 + 131.6 => 'Sigma 4.5mm f/2.8 EX DC HSM Circular Fisheye', #PH + 131.7 => 'Sigma 70-200mm f/2.8 APO EX HSM', #PH (http://www.lensrentals.com/blog/2012/08/canon-illumination-correction-and-third-party-lenses) + 131.8 => 'Sigma 28-70mm f/2.8-4 DG', #IB + 132 => 'Canon EF 1200mm f/5.6L USM', #32 + 134 => 'Canon EF 600mm f/4L IS USM', #15 + 135 => 'Canon EF 200mm f/1.8L USM', + 136 => 'Canon EF 300mm f/2.8L USM', + 136.1 => 'Tamron SP 15-30mm f/2.8 Di VC USD (A012)', #TomLachecki + 137 => 'Canon EF 85mm f/1.2L USM or Sigma or Tamron Lens', #10 + 137.1 => 'Sigma 18-50mm f/2.8-4.5 DC OS HSM', #PH + 137.2 => 'Sigma 50-200mm f/4-5.6 DC OS HSM', #PH + 137.3 => 'Sigma 18-250mm f/3.5-6.3 DC OS HSM', #PH (also Sigma 18-250mm f/3.5-6.3 DC Macro OS HSM) + 137.4 => 'Sigma 24-70mm f/2.8 IF EX DG HSM', #PH + 137.5 => 'Sigma 18-125mm f/3.8-5.6 DC OS HSM', #PH + 137.6 => 'Sigma 17-70mm f/2.8-4 DC Macro OS HSM | C', #forum2819 (Contemporary version has this ID - PH) + 137.7 => 'Sigma 17-50mm f/2.8 OS HSM', #47 + 137.8 => 'Sigma 18-200mm f/3.5-6.3 DC OS HSM [II]', #PH + 137.9 => 'Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD (B008)', #forum3090 + '137.10' => 'Sigma 8-16mm f/4.5-5.6 DC HSM', #50-Zwielicht + '137.11' => 'Tamron SP 17-50mm f/2.8 XR Di II VC (B005)', #50 + '137.12' => 'Tamron SP 60mm f/2 Macro Di II (G005)', #50 + '137.13' => 'Sigma 10-20mm f/3.5 EX DC HSM', #Gerald Erdmann + '137.14' => 'Tamron SP 24-70mm f/2.8 Di VC USD', #PH + '137.15' => 'Sigma 18-35mm f/1.8 DC HSM', #David Monro + '137.16' => 'Sigma 12-24mm f/4.5-5.6 DG HSM II', #IB + '137.17' => 'Sigma 70-300mm f/4-5.6 DG OS', #IB + 138 => 'Canon EF 28-80mm f/2.8-4L', #32 + 139 => 'Canon EF 400mm f/2.8L USM', + 140 => 'Canon EF 500mm f/4.5L USM', #32 + 141 => 'Canon EF 500mm f/4.5L USM', + 142 => 'Canon EF 300mm f/2.8L IS USM', #15 + 143 => 'Canon EF 500mm f/4L IS USM or Sigma Lens', #15 + 143.1 => 'Sigma 17-70mm f/2.8-4 DC Macro OS HSM', #NJ (Exiv2 #1167) + 144 => 'Canon EF 35-135mm f/4-5.6 USM', #26 + 145 => 'Canon EF 100-300mm f/4.5-5.6 USM', #32 + 146 => 'Canon EF 70-210mm f/3.5-4.5 USM', #32 + 147 => 'Canon EF 35-135mm f/4-5.6 USM', #32 + 148 => 'Canon EF 28-80mm f/3.5-5.6 USM', #32 + 149 => 'Canon EF 100mm f/2 USM', #9 + 150 => 'Canon EF 14mm f/2.8L USM or Sigma Lens', #10 + 150.1 => 'Sigma 20mm EX f/1.8', #4 + 150.2 => 'Sigma 30mm f/1.4 DC HSM', #15 + 150.3 => 'Sigma 24mm f/1.8 DG Macro EX', #15 + 150.4 => 'Sigma 28mm f/1.8 DG Macro EX', #IB + 150.5 => 'Sigma 18-35mm f/1.8 DC HSM | A', #IB + 151 => 'Canon EF 200mm f/2.8L USM', + 152 => 'Canon EF 300mm f/4L IS USM or Sigma Lens', #15 + 152.1 => 'Sigma 12-24mm f/4.5-5.6 EX DG ASPHERICAL HSM', #15 + 152.2 => 'Sigma 14mm f/2.8 EX Aspherical HSM', #15 + 152.3 => 'Sigma 10-20mm f/4-5.6', #14 + 152.4 => 'Sigma 100-300mm f/4', # (ref Bozi) + 152.5 => 'Sigma 300-800mm f/5.6 APO EX DG HSM', #IB + 153 => 'Canon EF 35-350mm f/3.5-5.6L USM or Sigma or Tamron Lens', #PH + 153.1 => 'Sigma 50-500mm f/4-6.3 APO HSM EX', #15 + 153.2 => 'Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical [IF] Macro', + 153.3 => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical [IF] Macro (A14)', #15 + 153.4 => 'Tamron 18-250mm f/3.5-6.3 Di II LD Aspherical [IF] Macro', #PH + 154 => 'Canon EF 20mm f/2.8 USM or Zeiss Lens', #15 + 154.1 => 'Zeiss Milvus 21mm f/2.8', #IB + 154.2 => 'Zeiss Milvus 15mm f/2.8 ZE', #IB + 154.3 => 'Zeiss Milvus 18mm f/2.8 ZE', #IB + 155 => 'Canon EF 85mm f/1.8 USM or Sigma Lens', + 155.1 => 'Sigma 14mm f/1.8 DG HSM | A', #IB (A017) + 156 => 'Canon EF 28-105mm f/3.5-4.5 USM or Tamron Lens', + 156.1 => 'Tamron SP 70-300mm f/4-5.6 Di VC USD (A005)', #PH + 156.2 => 'Tamron SP AF 28-105mm f/2.8 LD Aspherical IF (176D)', #JR + 160 => 'Canon EF 20-35mm f/3.5-4.5 USM or Tamron or Tokina Lens', + 160.1 => 'Tamron AF 19-35mm f/3.5-4.5', #44 + 160.2 => 'Tokina AT-X 124 AF Pro DX 12-24mm f/4', #49 + 160.3 => 'Tokina AT-X 107 AF DX 10-17mm f/3.5-4.5 Fisheye', #PH (http://osdir.com/ml/digikam-devel/2011-04/msg00275.html) + 160.4 => 'Tokina AT-X 116 AF Pro DX 11-16mm f/2.8', #forum3967 + 160.5 => 'Tokina AT-X 11-20 F2.8 PRO DX Aspherical 11-20mm f/2.8', #NJ (Exiv2 #1166) + 161 => 'Canon EF 28-70mm f/2.8L USM or Other Lens', + 161.1 => 'Sigma 24-70mm f/2.8 EX', + 161.2 => 'Sigma 28-70mm f/2.8 EX', #PH (http://www.breezesys.com/forum/showthread.php?t=3718) + 161.3 => 'Sigma 24-60mm f/2.8 EX DG', #PH (http://www.lensrentals.com/blog/2012/08/canon-illumination-correction-and-third-party-lenses) + 161.4 => 'Tamron AF 17-50mm f/2.8 Di-II LD Aspherical', #40 + 161.5 => 'Tamron 90mm f/2.8', + 161.6 => 'Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical IF (A05)', #IB + 161.7 => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical [IF] Macro', #IB/NJ + 161.8 => 'Tokina AT-X 24-70mm f/2.8 PRO FX (IF)', #IB + 162 => 'Canon EF 200mm f/2.8L USM', #32 + 163 => 'Canon EF 300mm f/4L', #32 + 164 => 'Canon EF 400mm f/5.6L', #32 + 165 => 'Canon EF 70-200mm f/2.8L USM', + 166 => 'Canon EF 70-200mm f/2.8L USM + 1.4x', + 167 => 'Canon EF 70-200mm f/2.8L USM + 2x', + 168 => 'Canon EF 28mm f/1.8 USM or Sigma Lens', #15 + 168.1 => 'Sigma 50-100mm f/1.8 DC HSM | A', #IB + 169 => 'Canon EF 17-35mm f/2.8L USM or Sigma Lens', #15 + 169.1 => 'Sigma 18-200mm f/3.5-6.3 DC OS', #23 + 169.2 => 'Sigma 15-30mm f/3.5-4.5 EX DG Aspherical', #4 + 169.3 => 'Sigma 18-50mm f/2.8 Macro', #26 + 169.4 => 'Sigma 50mm f/1.4 EX DG HSM', #PH + 169.5 => 'Sigma 85mm f/1.4 EX DG HSM', #Rolando Ruzic + 169.6 => 'Sigma 30mm f/1.4 EX DC HSM', #Rodolfo Borges + 169.7 => 'Sigma 35mm f/1.4 DG HSM', #PH (also "| A" version, ref 50) + 169.8 => 'Sigma 35mm f/1.5 FF High-Speed Prime | 017', #IB + 169.9 => 'Sigma 70mm f/2.8 Macro EX DG', #IB + 170 => 'Canon EF 200mm f/2.8L II USM or Sigma Lens', #9 + 170.1 => 'Sigma 300mm f/2.8 APO EX DG HSM', #IB + 170.2 => 'Sigma 800mm f/5.6 APO EX DG HSM', #IB + 171 => 'Canon EF 300mm f/4L USM', #15 + 172 => 'Canon EF 400mm f/5.6L USM or Sigma Lens', #32 + 172.1 =>'Sigma 150-600mm f/5-6.3 DG OS HSM | S', #50 + 172.2 => 'Sigma 500mm f/4.5 APO EX DG HSM', #IB + 173 => 'Canon EF 180mm Macro f/3.5L USM or Sigma Lens', #9 + 173.1 => 'Sigma 180mm EX HSM Macro f/3.5', #14 + 173.2 => 'Sigma APO Macro 150mm f/2.8 EX DG HSM', #14 + 173.3 => 'Sigma 10mm f/2.8 EX DC Fisheye', #IB + 173.4 => 'Sigma 15mm f/2.8 EX DG Diagonal Fisheye', #IB + 173.5 => 'Venus Laowa 100mm F2.8 2X Ultra Macro APO', #IB + 174 => 'Canon EF 135mm f/2L USM or Other Lens', #9 + 174.1 => 'Sigma 70-200mm f/2.8 EX DG APO OS HSM', #PH (probably version II of this lens) + 174.2 => 'Sigma 50-500mm f/4.5-6.3 APO DG OS HSM', #forum4031 + 174.3 => 'Sigma 150-500mm f/5-6.3 APO DG OS HSM', #47 + 174.4 => 'Zeiss Milvus 100mm f/2 Makro', #IB + 174.5 => 'Sigma APO 50-150mm f/2.8 EX DC OS HSM', #IB + 174.6 => 'Sigma APO 120-300mm f/2.8 EX DG OS HSM', #IB + 174.7 => 'Sigma 120-300mm f/2.8 DG OS HSM S013', #IB + 174.8 => 'Sigma 120-400mm f/4.5-5.6 APO DG OS HSM', #IB + 174.9 => 'Sigma 200-500mm f/2.8 APO EX DG', #IB + 175 => 'Canon EF 400mm f/2.8L USM', #32 + 176 => 'Canon EF 24-85mm f/3.5-4.5 USM', + 177 => 'Canon EF 300mm f/4L IS USM', #9 + 178 => 'Canon EF 28-135mm f/3.5-5.6 IS', + 179 => 'Canon EF 24mm f/1.4L USM', #20 + 180 => 'Canon EF 35mm f/1.4L USM or Other Lens', #9 + 180.1 => 'Sigma 50mm f/1.4 DG HSM | A', #50 + 180.2 => 'Sigma 24mm f/1.4 DG HSM | A', #NJ + 180.3 => 'Zeiss Milvus 50mm f/1.4', #IB + 180.4 => 'Zeiss Milvus 85mm f/1.4', #IB + 180.5 => 'Zeiss Otus 28mm f/1.4 ZE', #PH + 180.6 => 'Sigma 24mm f/1.5 FF High-Speed Prime | 017', #IB + 180.7 => 'Sigma 50mm f/1.5 FF High-Speed Prime | 017', #IB + 180.8 => 'Sigma 85mm f/1.5 FF High-Speed Prime | 017', #IB + 180.9 => 'Tokina Opera 50mm f/1.4 FF', #IB + '180.10' => 'Sigma 20mm f/1.4 DG HSM | A', #IB (015) + 181 => 'Canon EF 100-400mm f/4.5-5.6L IS USM + 1.4x or Sigma Lens', #15 + 181.1 => 'Sigma 150-600mm f/5-6.3 DG OS HSM | S + 1.4x', #50 + 182 => 'Canon EF 100-400mm f/4.5-5.6L IS USM + 2x or Sigma Lens', + 182.1 => 'Sigma 150-600mm f/5-6.3 DG OS HSM | S + 2x', #PH (NC) + 183 => 'Canon EF 100-400mm f/4.5-5.6L IS USM or Sigma Lens', + 183.1 => 'Sigma 150mm f/2.8 EX DG OS HSM APO Macro', #50 + 183.2 => 'Sigma 105mm f/2.8 EX DG OS HSM Macro', #50 + 183.3 => 'Sigma 180mm f/2.8 EX DG OS HSM APO Macro', #IB + 183.4 => 'Sigma 150-600mm f/5-6.3 DG OS HSM | C', #47 + 183.5 => 'Sigma 150-600mm f/5-6.3 DG OS HSM | S', #forum7109 (Sports 014) + 183.6 => 'Sigma 100-400mm f/5-6.3 DG OS HSM', #PH ("| C" ?) + 183.7 => 'Sigma 180mm f/3.5 APO Macro EX DG IF HSM', #IB + 184 => 'Canon EF 400mm f/2.8L USM + 2x', #15 + 185 => 'Canon EF 600mm f/4L IS USM', #32 + 186 => 'Canon EF 70-200mm f/4L USM', #9 + 187 => 'Canon EF 70-200mm f/4L USM + 1.4x', #26 + 188 => 'Canon EF 70-200mm f/4L USM + 2x', #PH + 189 => 'Canon EF 70-200mm f/4L USM + 2.8x', #32 + 190 => 'Canon EF 100mm f/2.8 Macro USM', # (+USM ref 42) + 191 => 'Canon EF 400mm f/4 DO IS or Sigma Lens', #9 + 191.1 => 'Sigma 500mm f/4 DG OS HSM', #AndrewSheih + 193 => 'Canon EF 35-80mm f/4-5.6 USM', #32 + 194 => 'Canon EF 80-200mm f/4.5-5.6 USM', #32 + 195 => 'Canon EF 35-105mm f/4.5-5.6 USM', #32 + 196 => 'Canon EF 75-300mm f/4-5.6 USM', #15/32 + 197 => 'Canon EF 75-300mm f/4-5.6 IS USM or Sigma Lens', + 197.1 => 'Sigma 18-300mm f/3.5-6.3 DC Macro OS HSM', #50 + 198 => 'Canon EF 50mm f/1.4 USM or Other Lens', + 198.1 => 'Zeiss Otus 55mm f/1.4 ZE', #JR (seen only on Sony camera) + 198.2 => 'Zeiss Otus 85mm f/1.4 ZE', #JR (NC) + 198.3 => 'Zeiss Milvus 25mm f/1.4', #IB + 198.4 => 'Zeiss Otus 100mm f/1.4', #IB + 198.5 => 'Zeiss Milvus 35mm f/1.4 ZE', #IB + 198.6 => 'Yongnuo YN 35mm f/2', #IB + 199 => 'Canon EF 28-80mm f/3.5-5.6 USM', #32 + 200 => 'Canon EF 75-300mm f/4-5.6 USM', #32 + 201 => 'Canon EF 28-80mm f/3.5-5.6 USM', #32 + 202 => 'Canon EF 28-80mm f/3.5-5.6 USM IV', + 208 => 'Canon EF 22-55mm f/4-5.6 USM', #32 + 209 => 'Canon EF 55-200mm f/4.5-5.6', #32 (USM mk I version? ref IB) + 210 => 'Canon EF 28-90mm f/4-5.6 USM', #32 + 211 => 'Canon EF 28-200mm f/3.5-5.6 USM', #15 + 212 => 'Canon EF 28-105mm f/4-5.6 USM', #15 + 213 => 'Canon EF 90-300mm f/4.5-5.6 USM or Tamron Lens', + 213.1 => 'Tamron SP 150-600mm f/5-6.3 Di VC USD (A011)', #forum5565 + 213.2 => 'Tamron 16-300mm f/3.5-6.3 Di II VC PZD Macro (B016)', #PH + 213.3 => 'Tamron SP 35mm f/1.8 Di VC USD (F012)', #PH + 213.4 => 'Tamron SP 45mm f/1.8 Di VC USD (F013)', #PH + 214 => 'Canon EF-S 18-55mm f/3.5-5.6 USM', #PH/34 + 215 => 'Canon EF 55-200mm f/4.5-5.6 II USM', + 217 => 'Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD', #47 + 220 => 'Yongnuo YN 50mm f/1.8', #IB + 224 => 'Canon EF 70-200mm f/2.8L IS USM', #11 + 225 => 'Canon EF 70-200mm f/2.8L IS USM + 1.4x', #11 + 226 => 'Canon EF 70-200mm f/2.8L IS USM + 2x', #14 + 227 => 'Canon EF 70-200mm f/2.8L IS USM + 2.8x', #32 + 228 => 'Canon EF 28-105mm f/3.5-4.5 USM', #32 + 229 => 'Canon EF 16-35mm f/2.8L USM', #PH + 230 => 'Canon EF 24-70mm f/2.8L USM', #9 + 231 => 'Canon EF 17-40mm f/4L USM or Sigma Lens', + 231.1 => 'Sigma 12-24mm f/4 DG HSM A016', #IB + 232 => 'Canon EF 70-300mm f/4.5-5.6 DO IS USM', #15 + 233 => 'Canon EF 28-300mm f/3.5-5.6L IS USM', #PH + 234 => 'Canon EF-S 17-85mm f/4-5.6 IS USM or Tokina Lens', #19 + 234.1 => 'Tokina AT-X 12-28 PRO DX 12-28mm f/4', #50/NJ + 235 => 'Canon EF-S 10-22mm f/3.5-4.5 USM', #15 + 236 => 'Canon EF-S 60mm f/2.8 Macro USM', #15 + 237 => 'Canon EF 24-105mm f/4L IS USM', #15 + 238 => 'Canon EF 70-300mm f/4-5.6 IS USM', #15 (and version II? ref 42) + 239 => 'Canon EF 85mm f/1.2L II USM or Rokinon Lens', #15 + 239.1 => 'Rokinon SP 85mm f/1.2', #IB + 240 => 'Canon EF-S 17-55mm f/2.8 IS USM or Sigma Lens', #15 + 240.1 => 'Sigma 17-50mm f/2.8 EX DC OS HSM', #https://github.com/Exiv2/exiv2/issues/397 + 241 => 'Canon EF 50mm f/1.2L USM', #15 + 242 => 'Canon EF 70-200mm f/4L IS USM', #PH + 243 => 'Canon EF 70-200mm f/4L IS USM + 1.4x', #15 + 244 => 'Canon EF 70-200mm f/4L IS USM + 2x', #PH + 245 => 'Canon EF 70-200mm f/4L IS USM + 2.8x', #32 + 246 => 'Canon EF 16-35mm f/2.8L II USM', #PH + 247 => 'Canon EF 14mm f/2.8L II USM', #32 + 248 => 'Canon EF 200mm f/2L IS USM or Sigma Lens', #42 + 248.1 => 'Sigma 24-35mm f/2 DG HSM | A', #JR + 248.2 => 'Sigma 135mm f/2 FF High-Speed Prime | 017', #IB + 248.3 => 'Sigma 24-35mm f/2.2 FF Zoom | 017', #IB + 248.4 => 'Sigma 135mm f/1.8 DG HSM A017', #IB + 249 => 'Canon EF 800mm f/5.6L IS USM', #35 + 250 => 'Canon EF 24mm f/1.4L II USM or Sigma Lens', #41 + 250.1 => 'Sigma 20mm f/1.4 DG HSM | A', #IB + 250.2 => 'Sigma 20mm f/1.5 FF High-Speed Prime | 017', #IB + 250.3 => 'Tokina Opera 16-28mm f/2.8 FF', #IB + 250.4 => 'Sigma 85mm f/1.4 DG HSM A016', #IB + 251 => 'Canon EF 70-200mm f/2.8L IS II USM', + 251.1 => 'Canon EF 70-200mm f/2.8L IS III USM', #IB + 252 => 'Canon EF 70-200mm f/2.8L IS II USM + 1.4x', #50 (1.4x Mk II) + 252.1 => 'Canon EF 70-200mm f/2.8L IS III USM + 1.4x', #PH (NC) + 253 => 'Canon EF 70-200mm f/2.8L IS II USM + 2x', #PH (NC) + 253.1 => 'Canon EF 70-200mm f/2.8L IS III USM + 2x', #PH (NC) + # 253.2 => 'Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025) + 2x', #forum9367 + 254 => 'Canon EF 100mm f/2.8L Macro IS USM or Tamron Lens', #42 + 254.1 => 'Tamron SP 90mm f/2.8 Di VC USD 1:1 Macro (F017)', #PH + 255 => 'Sigma 24-105mm f/4 DG OS HSM | A or Other Lens', #50 + 255.1 => 'Sigma 180mm f/2.8 EX DG OS HSM APO Macro', #50 + 255.2 => 'Tamron SP 70-200mm f/2.8 Di VC USD', #exiv issue 1202 (A009) + 368 => 'Sigma 14-24mm f/2.8 DG HSM | A or other Sigma Lens', #IB (A018) + 368.1 => 'Sigma 20mm f/1.4 DG HSM | A', #50 (newer firmware) + 368.2 => 'Sigma 50mm f/1.4 DG HSM | A', #50 + 368.3 => 'Sigma 40mm f/1.4 DG HSM | A', #IB (018) + 368.4 => 'Sigma 60-600mm f/4.5-6.3 DG OS HSM | S', #IB (018) + 368.5 => 'Sigma 28mm f/1.4 DG HSM | A', #IB (A019) + 368.6 => 'Sigma 150-600mm f/5-6.3 DG OS HSM | S', #50 + 368.7 => 'Sigma 85mm f/1.4 DG HSM | A', #IB (016) + 368.8 => 'Sigma 105mm f/1.4 DG HSM', #IB (A018) + 368.9 => 'Sigma 14-24mm f/2.8 DG HSM', #IB (A018) + '368.10' => 'Sigma 35mm f/1.4 DG HSM | A', #PH (012) + '368.11' => 'Sigma 70mm f/2.8 DG Macro', #IB (A018) + '368.12' => 'Sigma 18-35mm f/1.8 DC HSM | A', #50 + # Note: LensType 488 (0x1e8) is reported as 232 (0xe8) in 7D CameraSettings + 488 => 'Canon EF-S 15-85mm f/3.5-5.6 IS USM', #PH + 489 => 'Canon EF 70-300mm f/4-5.6L IS USM', #Gerald Kapounek + 490 => 'Canon EF 8-15mm f/4L Fisheye USM', #Klaus Reinfeld (PH added "Fisheye") + 491 => 'Canon EF 300mm f/2.8L IS II USM or Tamron Lens', #42 + 491.1 => 'Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)', #IB + 491.2 => 'Tamron 18-400mm f/3.5-6.3 Di II VC HLD (B028)', #IB + 491.3 => 'Tamron 100-400mm f/4.5-6.3 Di VC USD (A035)', #IB + 491.4 => 'Tamron 70-210mm f/4 Di VC USD (A034)', #IB + 491.5 => 'Tamron 70-210mm f/4 Di VC USD (A034) + 1.4x', #IB + 491.6 => 'Tamron SP 24-70mm f/2.8 Di VC USD G2 (A032)', + 492 => 'Canon EF 400mm f/2.8L IS II USM', #PH + 493 => 'Canon EF 500mm f/4L IS II USM or EF 24-105mm f4L IS USM', #PH + 493.1 => 'Canon EF 24-105mm f/4L IS USM', #PH (should recheck this) + 494 => 'Canon EF 600mm f/4L IS II USM', #PH + 495 => 'Canon EF 24-70mm f/2.8L II USM or Sigma Lens', #PH + 495.1 => 'Sigma 24-70mm f/2.8 DG OS HSM | A', #IB (017) + 496 => 'Canon EF 200-400mm f/4L IS USM', #PH + 499 => 'Canon EF 200-400mm f/4L IS USM + 1.4x', #50 + 502 => 'Canon EF 28mm f/2.8 IS USM or Tamron Lens', #PH + 502.1 => 'Tamron 35mm f/1.8 Di VC USD (F012)', #forum9757 + 503 => 'Canon EF 24mm f/2.8 IS USM', #PH + 504 => 'Canon EF 24-70mm f/4L IS USM', #PH + 505 => 'Canon EF 35mm f/2 IS USM', #PH + 506 => 'Canon EF 400mm f/4 DO IS II USM', #42 + 507 => 'Canon EF 16-35mm f/4L IS USM', #42 + 508 => 'Canon EF 11-24mm f/4L USM or Tamron Lens', #PH + 508.1 => 'Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)', #PH + 624 => 'Sigma 70-200mm f/2.8 DG OS HSM | S or other Sigma Lens', #IB (018) + 624.1 => 'Sigma 150-600mm f/5-6.3 | C', #ChrisSkopec + 747 => 'Canon EF 100-400mm f/4.5-5.6L IS II USM or Tamron Lens', #JR + 747.1 => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2', #50 + 748 => 'Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x or Tamron Lens', #JR (1.4x Mk III) + 748.1 => 'Tamron 100-400mm f/4.5-6.3 Di VC USD A035E + 1.4x', #IB + 748.2 => 'Tamron 70-210mm f/4 Di VC USD (A034) + 2x', #IB + 749 => 'Tamron 100-400mm f/4.5-6.3 Di VC USD A035E + 2x', #IB + 750 => 'Canon EF 35mm f/1.4L II USM or Tamron Lens', #42 + 750.1 => 'Tamron SP 85mm f/1.8 Di VC USD (F016)', #Exiv2#1072 + 750.2 => 'Tamron SP 45mm f/1.8 Di VC USD (F013)', #PH + 751 => 'Canon EF 16-35mm f/2.8L III USM', #42 + 752 => 'Canon EF 24-105mm f/4L IS II USM', #42 + 753 => 'Canon EF 85mm f/1.4L IS USM', #42 + 754 => 'Canon EF 70-200mm f/4L IS II USM', #IB + 757 => 'Canon EF 400mm f/2.8L IS III USM', #IB + 758 => 'Canon EF 600mm f/4L IS III USM', #IB + + 1136 => 'Sigma 24-70mm f/2.8 DG OS HSM | A', #IB (017) + # (STM lenses - 0x10xx) + 4142 => 'Canon EF-S 18-135mm f/3.5-5.6 IS STM', + 4143 => 'Canon EF-M 18-55mm f/3.5-5.6 IS STM or Tamron Lens', + 4143.1 => 'Tamron 18-200mm f/3.5-6.3 Di III VC', #42 + 4144 => 'Canon EF 40mm f/2.8 STM', #50 + 4145 => 'Canon EF-M 22mm f/2 STM', #34 + 4146 => 'Canon EF-S 18-55mm f/3.5-5.6 IS STM', #PH + 4147 => 'Canon EF-M 11-22mm f/4-5.6 IS STM', #42 + 4148 => 'Canon EF-S 55-250mm f/4-5.6 IS STM', #42 + 4149 => 'Canon EF-M 55-200mm f/4.5-6.3 IS STM', #42 + 4150 => 'Canon EF-S 10-18mm f/4.5-5.6 IS STM', #42 + 4152 => 'Canon EF 24-105mm f/3.5-5.6 IS STM', #42 + 4153 => 'Canon EF-M 15-45mm f/3.5-6.3 IS STM', #PH + 4154 => 'Canon EF-S 24mm f/2.8 STM', #IB + 4155 => 'Canon EF-M 28mm f/3.5 Macro IS STM', #42 + 4156 => 'Canon EF 50mm f/1.8 STM', #42 + 4157 => 'Canon EF-M 18-150mm f/3.5-6.3 IS STM', #42 + 4158 => 'Canon EF-S 18-55mm f/4-5.6 IS STM', #PH + 4159 => 'Canon EF-M 32mm f/1.4 STM', #42 + 4160 => 'Canon EF-S 35mm f/2.8 Macro IS STM', #42 + 4208 => 'Sigma 56mm f/1.4 DC DN | C or other Sigma Lens', #forum10603 + 4208.1 => 'Sigma 30mm F1.4 DC DN | C', #git issue#83 (016) + # (Nano USM lenses - 0x90xx) + 36910 => 'Canon EF 70-300mm f/4-5.6 IS II USM', #42 + 36912 => 'Canon EF-S 18-135mm f/3.5-5.6 IS USM', #42 + # (CN-E lenses - 0xf0xx) + 61491 => 'Canon CN-E 14mm T3.1 L F', #PH + 61492 => 'Canon CN-E 24mm T1.5 L F', #PH + # 61493 - missing CN-E 50mm T1.3 L F ? + 61494 => 'Canon CN-E 85mm T1.3 L F', #PH + 61495 => 'Canon CN-E 135mm T2.2 L F', #PH + 61496 => 'Canon CN-E 35mm T1.5 L F', #PH +# +# see RFLensType tag for master list of 61182 RF lenses +# + 61182 => 'Canon RF 50mm F1.2L USM or other Canon RF Lens', + 61182.1 => 'Canon RF 24-105mm F4L IS USM', + 61182.2 => 'Canon RF 28-70mm F2L USM', + 61182.3 => 'Canon RF 35mm F1.8 MACRO IS STM', + 61182.4 => 'Canon RF 85mm F1.2L USM', + 61182.5 => 'Canon RF 85mm F1.2L USM DS', + 61182.6 => 'Canon RF 24-70mm F2.8L IS USM', + 61182.7 => 'Canon RF 15-35mm F2.8L IS USM', + 61182.8 => 'Canon RF 24-240mm F4-6.3 IS USM', + 61182.9 => 'Canon RF 70-200mm F2.8L IS USM', + '61182.10' => 'Canon RF 85mm F2 MACRO IS STM', + '61182.11' => 'Canon RF 600mm F11 IS STM', + '61182.12' => 'Canon RF 600mm F11 IS STM + RF1.4x', + '61182.13' => 'Canon RF 600mm F11 IS STM + RF2x', + '61182.14' => 'Canon RF 800mm F11 IS STM', + '61182.15' => 'Canon RF 800mm F11 IS STM + RF1.4x', + '61182.16' => 'Canon RF 800mm F11 IS STM + RF2x', + '61182.17' => 'Canon RF 24-105mm F4-7.1 IS STM', + '61182.18' => 'Canon RF 100-500mm F4.5-7.1L IS USM', + '61182.19' => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x', + '61182.20' => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x', + '61182.21' => 'Canon RF 70-200mm F4L IS USM', #42 + '61182.22' => 'Canon RF 100mm F2.8L MACRO IS USM', #42 + '61182.23' => 'Canon RF 50mm F1.8 STM', #42 + '61182.24' => 'Canon RF 14-35mm F4L IS USM', #IB + '61182.25' => 'Canon RF-S 18-45mm F4.5-6.3 IS STM', #42 + '61182.26' => 'Canon RF 100-400mm F5.6-8 IS USM', #42 + '61182.27' => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42 (NC) + '61182.28' => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42 (NC) + '61182.29' => 'Canon RF-S 18-150mm F3.5-6.3 IS STM', #42 + '61182.30' => 'Canon RF 16mm F2.8 STM', #42 + '61182.31' => 'Canon RF 400mm F2.8L IS USM', #IB + '61182.32' => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB + '61182.33' => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB + '61182.34' => 'Canon RF 600mm F4L IS USM', #GiaZopatti + # we need the RFLensType values for the following... + '61182.35' => 'Canon RF 800mm F5.6L IS USM', #PH (NC) + '61182.36' => 'Canon RF 1200mm F8L IS USM', #PH (NC) + '61182.37' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC) + 65535 => 'n/a', +); + +# Canon model ID numbers (PH) +%canonModelID = ( + 0x1010000 => 'PowerShot A30', + 0x1040000 => 'PowerShot S300 / Digital IXUS 300 / IXY Digital 300', + 0x1060000 => 'PowerShot A20', + 0x1080000 => 'PowerShot A10', + 0x1090000 => 'PowerShot S110 / Digital IXUS v / IXY Digital 200', + 0x1100000 => 'PowerShot G2', + 0x1110000 => 'PowerShot S40', + 0x1120000 => 'PowerShot S30', + 0x1130000 => 'PowerShot A40', + 0x1140000 => 'EOS D30', + 0x1150000 => 'PowerShot A100', + 0x1160000 => 'PowerShot S200 / Digital IXUS v2 / IXY Digital 200a', + 0x1170000 => 'PowerShot A200', + 0x1180000 => 'PowerShot S330 / Digital IXUS 330 / IXY Digital 300a', + 0x1190000 => 'PowerShot G3', + 0x1210000 => 'PowerShot S45', + 0x1230000 => 'PowerShot SD100 / Digital IXUS II / IXY Digital 30', + 0x1240000 => 'PowerShot S230 / Digital IXUS v3 / IXY Digital 320', + 0x1250000 => 'PowerShot A70', + 0x1260000 => 'PowerShot A60', + 0x1270000 => 'PowerShot S400 / Digital IXUS 400 / IXY Digital 400', + 0x1290000 => 'PowerShot G5', + 0x1300000 => 'PowerShot A300', + 0x1310000 => 'PowerShot S50', + 0x1340000 => 'PowerShot A80', + 0x1350000 => 'PowerShot SD10 / Digital IXUS i / IXY Digital L', + 0x1360000 => 'PowerShot S1 IS', + 0x1370000 => 'PowerShot Pro1', + 0x1380000 => 'PowerShot S70', + 0x1390000 => 'PowerShot S60', + 0x1400000 => 'PowerShot G6', + 0x1410000 => 'PowerShot S500 / Digital IXUS 500 / IXY Digital 500', + 0x1420000 => 'PowerShot A75', + 0x1440000 => 'PowerShot SD110 / Digital IXUS IIs / IXY Digital 30a', + 0x1450000 => 'PowerShot A400', + 0x1470000 => 'PowerShot A310', + 0x1490000 => 'PowerShot A85', + 0x1520000 => 'PowerShot S410 / Digital IXUS 430 / IXY Digital 450', + 0x1530000 => 'PowerShot A95', + 0x1540000 => 'PowerShot SD300 / Digital IXUS 40 / IXY Digital 50', + 0x1550000 => 'PowerShot SD200 / Digital IXUS 30 / IXY Digital 40', + 0x1560000 => 'PowerShot A520', + 0x1570000 => 'PowerShot A510', + 0x1590000 => 'PowerShot SD20 / Digital IXUS i5 / IXY Digital L2', + 0x1640000 => 'PowerShot S2 IS', + 0x1650000 => 'PowerShot SD430 / Digital IXUS Wireless / IXY Digital Wireless', + 0x1660000 => 'PowerShot SD500 / Digital IXUS 700 / IXY Digital 600', + 0x1668000 => 'EOS D60', + 0x1700000 => 'PowerShot SD30 / Digital IXUS i Zoom / IXY Digital L3', + 0x1740000 => 'PowerShot A430', + 0x1750000 => 'PowerShot A410', + 0x1760000 => 'PowerShot S80', + 0x1780000 => 'PowerShot A620', + 0x1790000 => 'PowerShot A610', + 0x1800000 => 'PowerShot SD630 / Digital IXUS 65 / IXY Digital 80', + 0x1810000 => 'PowerShot SD450 / Digital IXUS 55 / IXY Digital 60', + 0x1820000 => 'PowerShot TX1', + 0x1870000 => 'PowerShot SD400 / Digital IXUS 50 / IXY Digital 55', + 0x1880000 => 'PowerShot A420', + 0x1890000 => 'PowerShot SD900 / Digital IXUS 900 Ti / IXY Digital 1000', + 0x1900000 => 'PowerShot SD550 / Digital IXUS 750 / IXY Digital 700', + 0x1920000 => 'PowerShot A700', + 0x1940000 => 'PowerShot SD700 IS / Digital IXUS 800 IS / IXY Digital 800 IS', + 0x1950000 => 'PowerShot S3 IS', + 0x1960000 => 'PowerShot A540', + 0x1970000 => 'PowerShot SD600 / Digital IXUS 60 / IXY Digital 70', + 0x1980000 => 'PowerShot G7', + 0x1990000 => 'PowerShot A530', + 0x2000000 => 'PowerShot SD800 IS / Digital IXUS 850 IS / IXY Digital 900 IS', + 0x2010000 => 'PowerShot SD40 / Digital IXUS i7 / IXY Digital L4', + 0x2020000 => 'PowerShot A710 IS', + 0x2030000 => 'PowerShot A640', + 0x2040000 => 'PowerShot A630', + 0x2090000 => 'PowerShot S5 IS', + 0x2100000 => 'PowerShot A460', + 0x2120000 => 'PowerShot SD850 IS / Digital IXUS 950 IS / IXY Digital 810 IS', + 0x2130000 => 'PowerShot A570 IS', + 0x2140000 => 'PowerShot A560', + 0x2150000 => 'PowerShot SD750 / Digital IXUS 75 / IXY Digital 90', + 0x2160000 => 'PowerShot SD1000 / Digital IXUS 70 / IXY Digital 10', + 0x2180000 => 'PowerShot A550', + 0x2190000 => 'PowerShot A450', + 0x2230000 => 'PowerShot G9', + 0x2240000 => 'PowerShot A650 IS', + 0x2260000 => 'PowerShot A720 IS', + 0x2290000 => 'PowerShot SX100 IS', + 0x2300000 => 'PowerShot SD950 IS / Digital IXUS 960 IS / IXY Digital 2000 IS', + 0x2310000 => 'PowerShot SD870 IS / Digital IXUS 860 IS / IXY Digital 910 IS', + 0x2320000 => 'PowerShot SD890 IS / Digital IXUS 970 IS / IXY Digital 820 IS', + 0x2360000 => 'PowerShot SD790 IS / Digital IXUS 90 IS / IXY Digital 95 IS', + 0x2370000 => 'PowerShot SD770 IS / Digital IXUS 85 IS / IXY Digital 25 IS', + 0x2380000 => 'PowerShot A590 IS', + 0x2390000 => 'PowerShot A580', + 0x2420000 => 'PowerShot A470', + 0x2430000 => 'PowerShot SD1100 IS / Digital IXUS 80 IS / IXY Digital 20 IS', + 0x2460000 => 'PowerShot SX1 IS', + 0x2470000 => 'PowerShot SX10 IS', + 0x2480000 => 'PowerShot A1000 IS', + 0x2490000 => 'PowerShot G10', + 0x2510000 => 'PowerShot A2000 IS', + 0x2520000 => 'PowerShot SX110 IS', + 0x2530000 => 'PowerShot SD990 IS / Digital IXUS 980 IS / IXY Digital 3000 IS', + 0x2540000 => 'PowerShot SD880 IS / Digital IXUS 870 IS / IXY Digital 920 IS', + 0x2550000 => 'PowerShot E1', + 0x2560000 => 'PowerShot D10', + 0x2570000 => 'PowerShot SD960 IS / Digital IXUS 110 IS / IXY Digital 510 IS', + 0x2580000 => 'PowerShot A2100 IS', + 0x2590000 => 'PowerShot A480', + 0x2600000 => 'PowerShot SX200 IS', + 0x2610000 => 'PowerShot SD970 IS / Digital IXUS 990 IS / IXY Digital 830 IS', + 0x2620000 => 'PowerShot SD780 IS / Digital IXUS 100 IS / IXY Digital 210 IS', + 0x2630000 => 'PowerShot A1100 IS', + 0x2640000 => 'PowerShot SD1200 IS / Digital IXUS 95 IS / IXY Digital 110 IS', + 0x2700000 => 'PowerShot G11', + 0x2710000 => 'PowerShot SX120 IS', + 0x2720000 => 'PowerShot S90', + 0x2750000 => 'PowerShot SX20 IS', + 0x2760000 => 'PowerShot SD980 IS / Digital IXUS 200 IS / IXY Digital 930 IS', + 0x2770000 => 'PowerShot SD940 IS / Digital IXUS 120 IS / IXY Digital 220 IS', + 0x2800000 => 'PowerShot A495', + 0x2810000 => 'PowerShot A490', + 0x2820000 => 'PowerShot A3100/A3150 IS', # (different cameras, same ID) + 0x2830000 => 'PowerShot A3000 IS', + 0x2840000 => 'PowerShot SD1400 IS / IXUS 130 / IXY 400F', + 0x2850000 => 'PowerShot SD1300 IS / IXUS 105 / IXY 200F', + 0x2860000 => 'PowerShot SD3500 IS / IXUS 210 / IXY 10S', + 0x2870000 => 'PowerShot SX210 IS', + 0x2880000 => 'PowerShot SD4000 IS / IXUS 300 HS / IXY 30S', + 0x2890000 => 'PowerShot SD4500 IS / IXUS 1000 HS / IXY 50S', + 0x2920000 => 'PowerShot G12', + 0x2930000 => 'PowerShot SX30 IS', + 0x2940000 => 'PowerShot SX130 IS', + 0x2950000 => 'PowerShot S95', + 0x2980000 => 'PowerShot A3300 IS', + 0x2990000 => 'PowerShot A3200 IS', + 0x3000000 => 'PowerShot ELPH 500 HS / IXUS 310 HS / IXY 31S', + 0x3010000 => 'PowerShot Pro90 IS', + 0x3010001 => 'PowerShot A800', + 0x3020000 => 'PowerShot ELPH 100 HS / IXUS 115 HS / IXY 210F', + 0x3030000 => 'PowerShot SX230 HS', + 0x3040000 => 'PowerShot ELPH 300 HS / IXUS 220 HS / IXY 410F', + 0x3050000 => 'PowerShot A2200', + 0x3060000 => 'PowerShot A1200', + 0x3070000 => 'PowerShot SX220 HS', + 0x3080000 => 'PowerShot G1 X', + 0x3090000 => 'PowerShot SX150 IS', + 0x3100000 => 'PowerShot ELPH 510 HS / IXUS 1100 HS / IXY 51S', + 0x3110000 => 'PowerShot S100 (new)', + 0x3130000 => 'PowerShot SX40 HS', + 0x3120000 => 'PowerShot ELPH 310 HS / IXUS 230 HS / IXY 600F', + # the Canon page lists the IXY 32S as "Japan only", but many other + # sites list the ELPH 500 HS and IXUS 320 HS as being the same model. + # I haven't been able to find an IXUS 320 sample, and the ELPH 500 HS + # is already associated with other IXUS and IXY models - PH + 0x3140000 => 'IXY 32S', # (PowerShot ELPH 500 HS / IXUS 320 HS ??) + 0x3160000 => 'PowerShot A1300', + 0x3170000 => 'PowerShot A810', + 0x3180000 => 'PowerShot ELPH 320 HS / IXUS 240 HS / IXY 420F', + 0x3190000 => 'PowerShot ELPH 110 HS / IXUS 125 HS / IXY 220F', + 0x3200000 => 'PowerShot D20', + 0x3210000 => 'PowerShot A4000 IS', + 0x3220000 => 'PowerShot SX260 HS', + 0x3230000 => 'PowerShot SX240 HS', + 0x3240000 => 'PowerShot ELPH 530 HS / IXUS 510 HS / IXY 1', + 0x3250000 => 'PowerShot ELPH 520 HS / IXUS 500 HS / IXY 3', + 0x3260000 => 'PowerShot A3400 IS', + 0x3270000 => 'PowerShot A2400 IS', + 0x3280000 => 'PowerShot A2300', + 0x3320000 => 'PowerShot S100V', #IB + 0x3330000 => 'PowerShot G15', #25 + 0x3340000 => 'PowerShot SX50 HS', #25/forum8196 + 0x3350000 => 'PowerShot SX160 IS', + 0x3360000 => 'PowerShot S110 (new)', + 0x3370000 => 'PowerShot SX500 IS', + 0x3380000 => 'PowerShot N', + 0x3390000 => 'IXUS 245 HS / IXY 430F', # (no PowerShot) + 0x3400000 => 'PowerShot SX280 HS', + 0x3410000 => 'PowerShot SX270 HS', + 0x3420000 => 'PowerShot A3500 IS', + 0x3430000 => 'PowerShot A2600', + 0x3440000 => 'PowerShot SX275 HS', #forum8199 + 0x3450000 => 'PowerShot A1400', + 0x3460000 => 'PowerShot ELPH 130 IS / IXUS 140 / IXY 110F', + 0x3470000 => 'PowerShot ELPH 115/120 IS / IXUS 132/135 / IXY 90F/100F', + 0x3490000 => 'PowerShot ELPH 330 HS / IXUS 255 HS / IXY 610F', + 0x3510000 => 'PowerShot A2500', + 0x3540000 => 'PowerShot G16', + 0x3550000 => 'PowerShot S120', + 0x3560000 => 'PowerShot SX170 IS', + 0x3580000 => 'PowerShot SX510 HS', + 0x3590000 => 'PowerShot S200 (new)', + 0x3600000 => 'IXY 620F', # (no PowerShot or IXUS?) + 0x3610000 => 'PowerShot N100', + 0x3640000 => 'PowerShot G1 X Mark II', + 0x3650000 => 'PowerShot D30', + 0x3660000 => 'PowerShot SX700 HS', + 0x3670000 => 'PowerShot SX600 HS', + 0x3680000 => 'PowerShot ELPH 140 IS / IXUS 150 / IXY 130', + 0x3690000 => 'PowerShot ELPH 135 / IXUS 145 / IXY 120', + 0x3700000 => 'PowerShot ELPH 340 HS / IXUS 265 HS / IXY 630', + 0x3710000 => 'PowerShot ELPH 150 IS / IXUS 155 / IXY 140', + 0x3740000 => 'EOS M3', #IB + 0x3750000 => 'PowerShot SX60 HS', #IB/NJ + 0x3760000 => 'PowerShot SX520 HS', #IB + 0x3770000 => 'PowerShot SX400 IS', + 0x3780000 => 'PowerShot G7 X', #IB + 0x3790000 => 'PowerShot N2', + 0x3800000 => 'PowerShot SX530 HS', + 0x3820000 => 'PowerShot SX710 HS', + 0x3830000 => 'PowerShot SX610 HS', + 0x3840000 => 'EOS M10', + 0x3850000 => 'PowerShot G3 X', + 0x3860000 => 'PowerShot ELPH 165 HS / IXUS 165 / IXY 160', + 0x3870000 => 'PowerShot ELPH 160 / IXUS 160', + 0x3880000 => 'PowerShot ELPH 350 HS / IXUS 275 HS / IXY 640', + 0x3890000 => 'PowerShot ELPH 170 IS / IXUS 170', + 0x3910000 => 'PowerShot SX410 IS', + 0x3930000 => 'PowerShot G9 X', + 0x3940000 => 'EOS M5', #IB + 0x3950000 => 'PowerShot G5 X', + 0x3970000 => 'PowerShot G7 X Mark II', + 0x3980000 => 'EOS M100', #42 + 0x3990000 => 'PowerShot ELPH 360 HS / IXUS 285 HS / IXY 650', + 0x4010000 => 'PowerShot SX540 HS', + 0x4020000 => 'PowerShot SX420 IS', + 0x4030000 => 'PowerShot ELPH 190 IS / IXUS 180 / IXY 190', + 0x4040000 => 'PowerShot G1', + 0x4040001 => 'PowerShot ELPH 180 IS / IXUS 175 / IXY 180', #forum10402 + 0x4050000 => 'PowerShot SX720 HS', + 0x4060000 => 'PowerShot SX620 HS', + 0x4070000 => 'EOS M6', + 0x4100000 => 'PowerShot G9 X Mark II', + 0x412 => 'EOS M50 / Kiss M', # (yes, no "0000") + 0x4150000 => 'PowerShot ELPH 185 / IXUS 185 / IXY 200', + 0x4160000 => 'PowerShot SX430 IS', + 0x4170000 => 'PowerShot SX730 HS', + 0x4180000 => 'PowerShot G1 X Mark III', #IB + 0x6040000 => 'PowerShot S100 / Digital IXUS / IXY Digital', + 0x801 => 'PowerShot SX740 HS', + 0x804 => 'PowerShot G5 X Mark II', + 0x805 => 'PowerShot SX70 HS', + 0x808 => 'PowerShot G7 X Mark III', + 0x811 => 'EOS M6 Mark II', #IB + 0x812 => 'EOS M200', #25 + +# (see http://cweb.canon.jp/e-support/faq/answer/digitalcamera/10447-1.html for PowerShot/IXUS/IXY names) + + 0x4007d673 => 'DC19/DC21/DC22', + 0x4007d674 => 'XH A1', + 0x4007d675 => 'HV10', + 0x4007d676 => 'MD130/MD140/MD150/MD160/ZR850', + 0x4007d777 => 'DC50', # (iVIS) + 0x4007d778 => 'HV20', # (iVIS) + 0x4007d779 => 'DC211', #29 + 0x4007d77a => 'HG10', + 0x4007d77b => 'HR10', #29 (iVIS) + 0x4007d77d => 'MD255/ZR950', + 0x4007d81c => 'HF11', + 0x4007d878 => 'HV30', + 0x4007d87c => 'XH A1S', + 0x4007d87e => 'DC301/DC310/DC311/DC320/DC330', + 0x4007d87f => 'FS100', + 0x4007d880 => 'HF10', #29 (iVIS/VIXIA) + 0x4007d882 => 'HG20/HG21', # (VIXIA) + 0x4007d925 => 'HF21', # (LEGRIA) + 0x4007d926 => 'HF S11', # (LEGRIA) + 0x4007d978 => 'HV40', # (LEGRIA) + 0x4007d987 => 'DC410/DC411/DC420', + 0x4007d988 => 'FS19/FS20/FS21/FS22/FS200', # (LEGRIA) + 0x4007d989 => 'HF20/HF200', # (LEGRIA) + 0x4007d98a => 'HF S10/S100', # (LEGRIA/VIXIA) + 0x4007da8e => 'HF R10/R16/R17/R18/R100/R106', # (LEGRIA/VIXIA) + 0x4007da8f => 'HF M30/M31/M36/M300/M306', # (LEGRIA/VIXIA) + 0x4007da90 => 'HF S20/S21/S200', # (LEGRIA/VIXIA) + 0x4007da92 => 'FS31/FS36/FS37/FS300/FS305/FS306/FS307', + 0x4007dca0 => 'EOS C300', + 0x4007dda9 => 'HF G25', # (LEGRIA) + 0x4007dfb4 => 'XC10', + 0x4007e1c3 => 'EOS C200', + + # NOTE: some pre-production models may have a model name of + # "Canon EOS Kxxx", where "xxx" is the last 3 digits of the model ID below. + # This has been observed for the 1DSmkIII/K215 and 400D/K236. + 0x80000001 => 'EOS-1D', + 0x80000167 => 'EOS-1DS', + 0x80000168 => 'EOS 10D', + 0x80000169 => 'EOS-1D Mark III', + 0x80000170 => 'EOS Digital Rebel / 300D / Kiss Digital', + 0x80000174 => 'EOS-1D Mark II', + 0x80000175 => 'EOS 20D', + 0x80000176 => 'EOS Digital Rebel XSi / 450D / Kiss X2', + 0x80000188 => 'EOS-1Ds Mark II', + 0x80000189 => 'EOS Digital Rebel XT / 350D / Kiss Digital N', + 0x80000190 => 'EOS 40D', + 0x80000213 => 'EOS 5D', + 0x80000215 => 'EOS-1Ds Mark III', + 0x80000218 => 'EOS 5D Mark II', + 0x80000219 => 'WFT-E1', + 0x80000232 => 'EOS-1D Mark II N', + 0x80000234 => 'EOS 30D', + 0x80000236 => 'EOS Digital Rebel XTi / 400D / Kiss Digital X', + 0x80000241 => 'WFT-E2', + 0x80000246 => 'WFT-E3', + 0x80000250 => 'EOS 7D', + 0x80000252 => 'EOS Rebel T1i / 500D / Kiss X3', + 0x80000254 => 'EOS Rebel XS / 1000D / Kiss F', + 0x80000261 => 'EOS 50D', + 0x80000269 => 'EOS-1D X', + 0x80000270 => 'EOS Rebel T2i / 550D / Kiss X4', + 0x80000271 => 'WFT-E4', + 0x80000273 => 'WFT-E5', + 0x80000281 => 'EOS-1D Mark IV', + 0x80000285 => 'EOS 5D Mark III', + 0x80000286 => 'EOS Rebel T3i / 600D / Kiss X5', + 0x80000287 => 'EOS 60D', + 0x80000288 => 'EOS Rebel T3 / 1100D / Kiss X50', + 0x80000289 => 'EOS 7D Mark II', #IB + 0x80000297 => 'WFT-E2 II', + 0x80000298 => 'WFT-E4 II', + 0x80000301 => 'EOS Rebel T4i / 650D / Kiss X6i', + 0x80000302 => 'EOS 6D', #25 + 0x80000324 => 'EOS-1D C', #(NC) + 0x80000325 => 'EOS 70D', + 0x80000326 => 'EOS Rebel T5i / 700D / Kiss X7i', + 0x80000327 => 'EOS Rebel T5 / 1200D / Kiss X70 / Hi', + 0x80000328 => 'EOS-1D X Mark II', #42 + 0x80000331 => 'EOS M', + 0x80000350 => 'EOS 80D', #42 + 0x80000355 => 'EOS M2', + 0x80000346 => 'EOS Rebel SL1 / 100D / Kiss X7', + 0x80000347 => 'EOS Rebel T6s / 760D / 8000D', + 0x80000349 => 'EOS 5D Mark IV', #42 + 0x80000382 => 'EOS 5DS', + 0x80000393 => 'EOS Rebel T6i / 750D / Kiss X8i', + 0x80000401 => 'EOS 5DS R', + 0x80000404 => 'EOS Rebel T6 / 1300D / Kiss X80', + 0x80000405 => 'EOS Rebel T7i / 800D / Kiss X9i', + 0x80000406 => 'EOS 6D Mark II', #IB/42 + 0x80000408 => 'EOS 77D / 9000D', + 0x80000417 => 'EOS Rebel SL2 / 200D / Kiss X9', #IB/42 + 0x80000421 => 'EOS R5', #PH + 0x80000422 => 'EOS Rebel T100 / 4000D / 3000D', #IB (3000D in China; Kiss? - PH) + 0x80000424 => 'EOS R', #IB + 0x80000428 => 'EOS-1D X Mark III', #IB + 0x80000432 => 'EOS Rebel T7 / 2000D / 1500D / Kiss X90', #IB + 0x80000433 => 'EOS RP', + 0x80000435 => 'EOS Rebel T8i / 850D / X10i', #JR/PH + 0x80000436 => 'EOS SL3 / 250D / Kiss X10', #25 + 0x80000437 => 'EOS 90D', #IB + 0x80000450 => 'EOS R3', #42 + 0x80000453 => 'EOS R6', #PH + 0x80000464 => 'EOS R7', #42 + 0x80000465 => 'EOS R10', #42 + 0x80000467 => 'PowerShot ZOOM', + 0x80000468 => 'EOS M50 Mark II / Kiss M2', #IB + 0x80000520 => 'EOS D2000C', #IB + 0x80000560 => 'EOS D6000C', #PH (guess) +); + +my %canonQuality = ( + -1 => 'n/a', # (PH, EOS M MOV video) + 1 => 'Economy', + 2 => 'Normal', + 3 => 'Fine', + 4 => 'RAW', + 5 => 'Superfine', + 7 => 'CRAW', #42 + 130 => 'Light (RAW)', #github#119 + 131 => 'Standard (RAW)', #github#119 +); +my %canonImageSize = ( + -1 => 'n/a', + 0 => 'Large', + 1 => 'Medium', + 2 => 'Small', + 5 => 'Medium 1', #PH + 6 => 'Medium 2', #PH + 7 => 'Medium 3', #PH + 8 => 'Postcard', #PH (SD200 1600x1200 with DateStamp option) + 9 => 'Widescreen', #PH (SD900 3648x2048), 22 (HFS200 3264x1840) + 10 => 'Medium Widescreen', #22 (HFS200 1920x1080) + 14 => 'Small 1', #PH + 15 => 'Small 2', #PH + 16 => 'Small 3', #PH + 128 => '640x480 Movie', #PH (7D 60fps) + 129 => 'Medium Movie', #22 + 130 => 'Small Movie', #22 + 137 => '1280x720 Movie', #PH (S95 24fps; D60 50fps) + 142 => '1920x1080 Movie', #PH (D60 25fps) + 143 => '4096x2160 Movie', #PH (C200) +); +my %canonWhiteBalance = ( + # -1='Click", -2='Pasted' ?? - PH + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Cloudy', + 3 => 'Tungsten', + 4 => 'Fluorescent', + 5 => 'Flash', + 6 => 'Custom', + 7 => 'Black & White', + 8 => 'Shade', + 9 => 'Manual Temperature (Kelvin)', + 10 => 'PC Set1', #PH + 11 => 'PC Set2', #PH + 12 => 'PC Set3', #PH + 14 => 'Daylight Fluorescent', #3 + 15 => 'Custom 1', #PH + 16 => 'Custom 2', #PH + 17 => 'Underwater', #3 + 18 => 'Custom 3', #PH + 19 => 'Custom 4', #PH + 20 => 'PC Set4', #PH + 21 => 'PC Set5', #PH + # 22 - Custom 2? + 23 => 'Auto (ambience priority)', #PH (5DS) (perhaps this needs re-thinking?: forum13295) + # 30 - Click White Balance? + # 31 - Shot Settings? + # 137 - Tungsten? + # 138 - White Fluorescent? + # 139 - Fluorescent H? + # 140 - Manual? +); + +# picture styles used by the 5D +# (styles 0x4X may be downloaded from Canon) +# (called "ColorMatrix" in 1D owner manual) +my %pictureStyles = ( #12 + 0x00 => 'None', #PH + 0x01 => 'Standard', #15 + 0x02 => 'Portrait', #15 + 0x03 => 'High Saturation', #15 + 0x04 => 'Adobe RGB', #15 + 0x05 => 'Low Saturation', #15 + 0x06 => 'CM Set 1', #PH + 0x07 => 'CM Set 2', #PH + # "ColorMatrix" values end here + 0x21 => 'User Def. 1', + 0x22 => 'User Def. 2', + 0x23 => 'User Def. 3', + # "External" styles currently available from Canon are Nostalgia, Clear, + # Twilight and Emerald. The "User Def" styles change to these "External" + # codes when these styles are installed in the camera + 0x41 => 'PC 1', #PH + 0x42 => 'PC 2', #PH + 0x43 => 'PC 3', #PH + 0x81 => 'Standard', + 0x82 => 'Portrait', + 0x83 => 'Landscape', + 0x84 => 'Neutral', + 0x85 => 'Faithful', + 0x86 => 'Monochrome', + 0x87 => 'Auto', #PH + 0x88 => 'Fine Detail', #PH + 0xff => 'n/a', #PH (guess) + 0xffff => 'n/a', #PH (guess) +); +my %userDefStyles = ( #12/48 + Notes => q{ + Base style for user-defined picture styles. PC values represent external + picture styles which may be downloaded from Canon and installed in the + camera. + }, + 0x41 => 'PC 1', + 0x42 => 'PC 2', + 0x43 => 'PC 3', + 0x81 => 'Standard', + 0x82 => 'Portrait', + 0x83 => 'Landscape', + 0x84 => 'Neutral', + 0x85 => 'Faithful', + 0x86 => 'Monochrome', + 0x87 => 'Auto', #PH +); + +# picture style tag information for CameraInfo550D +my %psConv = ( + -559038737 => 'n/a', # = 0xdeadbeef ! LOL + OTHER => sub { shift }, +); +my %psInfo = ( + Format => 'int32s', + PrintHex => 1, + PrintConv => \%psConv, +); + +# ValueConv that makes long values binary type +my %longBin = ( + ValueConv => 'length($val) > 64 ? \$val : $val', + ValueConvInv => '$val', +); + +# conversions, etc for CameraColorCalibration tags +my %cameraColorCalibration = ( + Format => 'int16s[4]', + Unknown => 1, + PrintConv => 'sprintf("%4d %4d %4d (%dK)", split(" ",$val))', + PrintConvInv => '$val=~s/\s+/ /g; $val=~tr/()K//d; $val', +); + +# conversions, etc for PowerShot CameraColorCalibration tags +my %cameraColorCalibration2 = ( + Format => 'int16s[5]', + Unknown => 1, + PrintConv => 'sprintf("%4d %4d %4d %4d (%dK)", split(" ",$val))', + PrintConvInv => '$val=~s/\s+/ /g; $val=~tr/()K//d; $val', +); +# conversions, etc for byte-swapped FocusDistance tags +my %focusDistanceByteSwap = ( + # this is very odd (little-endian number on odd boundary), + # but it does seem to work better with my sample images - PH + Format => 'int16uRev', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => '$val > 655.345 ? "inf" : "$val m"', + PrintConvInv => '$val =~ s/ ?m$//; IsFloat($val) ? $val : 655.35', +); + +# common attributes for writable BinaryData directories +my %binaryDataAttrs = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, +); + +my %offOn = ( 0 => 'Off', 1 => 'On' ); + +#------------------------------------------------------------------------------ +# Canon EXIF Maker Notes +%Image::ExifTool::Canon::Main = ( + WRITE_PROC => \&WriteCanon, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x1 => { + Name => 'CanonCameraSettings', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::CameraSettings', + }, + }, + 0x2 => { + Name => 'CanonFocalLength', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::FocalLength' }, + }, + 0x3 => { + Name => 'CanonFlashInfo', + Unknown => 1, + }, + 0x4 => { + Name => 'CanonShotInfo', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::ShotInfo', + }, + }, + 0x5 => { + Name => 'CanonPanorama', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::Panorama' }, + }, + 0x6 => { + Name => 'CanonImageType', + Writable => 'string', + Groups => { 2 => 'Image' }, + }, + 0x7 => { + Name => 'CanonFirmwareVersion', + Writable => 'string', + }, + 0x8 => { + Name => 'FileNumber', + Writable => 'int32u', + Groups => { 2 => 'Image' }, + PrintConv => '$_=$val,s/(\d+)(\d{4})/$1-$2/,$_', + PrintConvInv => '$val=~s/-//g;$val', + }, + 0x9 => { + Name => 'OwnerName', + Writable => 'string', + # pad to 32 bytes (including null terminator which will be added) + # to avoid bug which crashes DPP if length is 4 bytes + ValueConvInv => '$val .= "\0" x (31 - length $val) if length $val < 31; $val', + }, + 0xa => { + Name => 'UnknownD30', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::UnknownD30', + }, + }, + 0xc => [ # square brackets for a conditional list + { + # D30 + Name => 'SerialNumber', + Condition => '$$self{Model} =~ /EOS D30\b/', + Writable => 'int32u', + PrintConv => 'sprintf("%.4x%.5d",$val>>16,$val&0xffff)', + PrintConvInv => '$val=~/(.*)-?(\d{5})$/ ? (hex($1)<<16)+$2 : undef', + }, + { + # serial number of 1D/1Ds/1D Mark II/1Ds Mark II is usually + # displayed w/o leeding zeros (ref 7) (1D uses 6 digits - PH) + Name => 'SerialNumber', + Condition => '$$self{Model} =~ /EOS-1D/', + Writable => 'int32u', + PrintConv => 'sprintf("%.6u",$val)', + PrintConvInv => '$val', + }, + { + # all other models (D60,300D,350D,REBEL,10D,20D,etc) + Name => 'SerialNumber', + Writable => 'int32u', + PrintConv => 'sprintf("%.10u",$val)', + PrintConvInv => '$val', + }, + ], + 0xd => [ + { + Name => 'CanonCameraInfo1D', + # (save size of this record as "CameraInfoCount" for later tests) + Condition => '($$self{CameraInfoCount} = $count) and $$self{Model} =~ /\b1DS?$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo1D' }, + }, + { + Name => 'CanonCameraInfo1DmkII', + Condition => '$$self{Model} =~ /\b1Ds? Mark II$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo1DmkII' }, + }, + { + Name => 'CanonCameraInfo1DmkIIN', + Condition => '$$self{Model} =~ /\b1Ds? Mark II N$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo1DmkIIN' }, + }, + { + Name => 'CanonCameraInfo1DmkIII', + Condition => '$$self{Model} =~ /\b1Ds? Mark III$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo1DmkIII' }, + }, + { + Name => 'CanonCameraInfo1DmkIV', + Condition => '$$self{Model} =~ /\b1D Mark IV$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo1DmkIV' }, + }, + { + Name => 'CanonCameraInfo1DX', + Condition => '$$self{Model} =~ /EOS-1D X$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo1DX' }, + }, + { + Name => 'CanonCameraInfo5D', + Condition => '$$self{Model} =~ /EOS 5D$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo5D' }, + }, + { + Name => 'CanonCameraInfo5DmkII', + Condition => '$$self{Model} =~ /EOS 5D Mark II$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo5DmkII' }, + }, + { + Name => 'CanonCameraInfo5DmkIII', + Condition => '$$self{Model} =~ /EOS 5D Mark III$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo5DmkIII' }, + }, + { + Name => 'CanonCameraInfo6D', + Condition => '$$self{Model} =~ /EOS 6D$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo6D' }, + }, + { + Name => 'CanonCameraInfo7D', + Condition => '$$self{Model} =~ /EOS 7D$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo7D' }, + }, + { + Name => 'CanonCameraInfo40D', + Condition => '$$self{Model} =~ /EOS 40D$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo40D' }, + }, + { + Name => 'CanonCameraInfo50D', + Condition => '$$self{Model} =~ /EOS 50D$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo50D' }, + }, + { + Name => 'CanonCameraInfo60D', + Condition => '$$self{Model} =~ /EOS 60D$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo60D' }, + }, + { + Name => 'CanonCameraInfo70D', + Condition => '$$self{Model} =~ /EOS 70D$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo70D' }, + }, + { + Name => 'CanonCameraInfo80D', + Condition => '$$self{Model} =~ /EOS 80D$/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo80D' }, + }, + { + Name => 'CanonCameraInfo450D', + Condition => '$$self{Model} =~ /\b(450D|REBEL XSi|Kiss X2)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo450D' }, + }, + { + Name => 'CanonCameraInfo500D', + Condition => '$$self{Model} =~ /\b(500D|REBEL T1i|Kiss X3)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo500D' }, + }, + { + Name => 'CanonCameraInfo550D', + Condition => '$$self{Model} =~ /\b(550D|REBEL T2i|Kiss X4)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo550D' }, + }, + { + Name => 'CanonCameraInfo600D', + Condition => '$$self{Model} =~ /\b(600D|REBEL T3i|Kiss X5)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo600D' }, + }, + { + Name => 'CanonCameraInfo650D', + Condition => '$$self{Model} =~ /\b(650D|REBEL T4i|Kiss X6i)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo650D' }, + }, + { + Name => 'CanonCameraInfo700D', + Condition => '$$self{Model} =~ /\b(700D|REBEL T5i|Kiss X7i)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo650D' }, + }, + { + Name => 'CanonCameraInfo750D', + Condition => '$$self{Model} =~ /\b(750D|Rebel T6i|Kiss X8i)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo750D' }, + }, + { + Name => 'CanonCameraInfo760D', + Condition => '$$self{Model} =~ /\b(760D|Rebel T6s|8000D)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo750D' }, + }, + { + Name => 'CanonCameraInfo1000D', + Condition => '$$self{Model} =~ /\b(1000D|REBEL XS|Kiss F)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo1000D' }, + }, + { + Name => 'CanonCameraInfo1100D', + Condition => '$$self{Model} =~ /\b(1100D|REBEL T3|Kiss X50)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo600D' }, + }, + { + Name => 'CanonCameraInfo1200D', + Condition => '$$self{Model} =~ /\b(1200D|REBEL T5|Kiss X70)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo60D' }, + }, + { + Name => 'CanonCameraInfoPowerShot', + # valid if format is int32u[138] or int32u[148] + Condition => '$format eq "int32u" and ($count == 138 or $count == 148)', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoPowerShot' }, + }, + { + Name => 'CanonCameraInfoPowerShot2', + # valid if format is int32u[162], int32u[167], int32u[171] or int32u[264] + Condition => q{ + $format eq "int32u" and ($count == 156 or $count == 162 or + $count == 167 or $count == 171 or $count == 264) + }, + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoPowerShot2' }, + }, + { + Name => 'CanonCameraInfoUnknown32', + Condition => '$format =~ /^int32/', + # (counts of 72, 85, 86, 93, 94, 96, 104) - PH + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoUnknown32' }, + }, + { + Name => 'CanonCameraInfoUnknown16', + Condition => '$format =~ /^int16/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoUnknown16' }, + }, + { + Name => 'CanonCameraInfoUnknown', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoUnknown' }, + }, + ], + 0xe => { + Name => 'CanonFileLength', + Writable => 'int32u', + Groups => { 2 => 'Image' }, + }, + 0xf => [ + { # used by 1DmkII, 1DSmkII and 1DmkIIN + Name => 'CustomFunctions1D', + Condition => '$$self{Model} =~ /EOS-1D/', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::Functions1D', + }, + }, + { + Name => 'CustomFunctions5D', + Condition => '$$self{Model} =~ /EOS 5D/', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::Functions5D', + }, + }, + { + Name => 'CustomFunctions10D', + Condition => '$$self{Model} =~ /EOS 10D/', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::Functions10D', + }, + }, + { + Name => 'CustomFunctions20D', + Condition => '$$self{Model} =~ /EOS 20D/', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::Functions20D', + }, + }, + { + Name => 'CustomFunctions30D', + Condition => '$$self{Model} =~ /EOS 30D/', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::Functions30D', + }, + }, + { + Name => 'CustomFunctions350D', + Condition => '$$self{Model} =~ /\b(350D|REBEL XT|Kiss Digital N)\b/', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::Functions350D', + }, + }, + { + Name => 'CustomFunctions400D', + Condition => '$$self{Model} =~ /\b(400D|REBEL XTi|Kiss Digital X|K236)\b/', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::Functions400D', + }, + }, + { + Name => 'CustomFunctionsD30', + Condition => '$$self{Model} =~ /EOS D30\b/', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::FunctionsD30', + }, + }, + { + Name => 'CustomFunctionsD60', + Condition => '$$self{Model} =~ /EOS D60\b/', + SubDirectory => { + # the stored size in the D60 apparently doesn't include the size word: + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size-2,$size)', + # (D60 custom functions are basically the same as D30) + TagTable => 'Image::ExifTool::CanonCustom::FunctionsD30', + }, + }, + { + Name => 'CustomFunctionsUnknown', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::FuncsUnknown', + }, + }, + ], + 0x10 => { #PH + Name => 'CanonModelID', + Writable => 'int32u', + PrintHex => 1, + SeparateTable => 1, + PrintConv => \%canonModelID, + }, + 0x11 => { #PH + Name => 'MovieInfo', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::MovieInfo', + }, + }, + 0x12 => { + Name => 'CanonAFInfo', + # not really a condition -- just need to store the count for later + Condition => '$$self{AFInfoCount} = $count', + SubDirectory => { + # this record does not begin with a length word, so it + # has to be validated differently + Validate => 'Image::ExifTool::Canon::ValidateAFInfo($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::AFInfo', + }, + }, + 0x13 => { #PH + Name => 'ThumbnailImageValidArea', + # left,right,top,bottom edges of image in thumbnail, or all zeros for full frame + Notes => 'all zeros for full frame', + Writable => 'int16u', + Count => 4, + }, + 0x15 => { #PH + # display format for serial number + Name => 'SerialNumberFormat', + Writable => 'int32u', + PrintHex => 1, + PrintConv => { + 0x90000000 => 'Format 1', + 0xa0000000 => 'Format 2', + }, + }, + 0x1a => { #15 + Name => 'SuperMacro', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On (1)', + 2 => 'On (2)', + }, + }, + 0x1c => { #PH (A570IS) + Name => 'DateStampMode', + Writable => 'int16u', + Notes => 'used only in postcard mode', + PrintConv => { + 0 => 'Off', + 1 => 'Date', + 2 => 'Date & Time', + }, + }, + 0x1d => { #PH + Name => 'MyColors', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::MyColors', + }, + }, + 0x1e => { #PH + Name => 'FirmwareRevision', + Writable => 'int32u', + # as a hex number: 0xAVVVRR00, where (a bit of guessing here...) + # A = 'a' for alpha, 'b' for beta? + # V = version? (100,101 for normal releases, 100,110,120,130,170 for alpha/beta) + # R = revision? (01-07, except 00 for alpha/beta releases) + PrintConv => q{ + my $rev = sprintf("%.8x", $val); + my ($rel, $v1, $v2, $r1, $r2) = ($rev =~ /^(.)(.)(..)0?(.+)(..)$/); + my %r = ( a => 'Alpha ', b => 'Beta ', '0' => '' ); + $rel = defined $r{$rel} ? $r{$rel} : "Unknown($rel) "; + return "$rel$v1.$v2 rev $r1.$r2", + }, + PrintConvInv => q{ + $_=$val; s/Alpha ?/a/i; s/Beta ?/b/i; + s/Unknown ?\((.)\)/$1/i; s/ ?rev ?(.)\./0$1/; s/ ?rev ?//; + tr/a-fA-F0-9//dc; return hex $_; + }, + }, + # 0x1f - used for red-eye-corrected images - PH (A570IS) + # 0x22 - values 1 and 2 are 2 and 1 for flash pics, 0 otherwise - PH (A570IS) + 0x23 => { #31 + Name => 'Categories', + Writable => 'int32u', + Format => 'int32u', # (necessary to perform conversion for Condition) + Notes => '2 values: 1. always 8, 2. Categories', + Count => '2', + Condition => '$$valPt =~ /^\x08\0\0\0/', + ValueConv => '$val =~ s/^8 //; $val', + ValueConvInv => '"8 $val"', + PrintConvColumns => 2, + PrintConv => { + 0 => '(none)', + BITMASK => { + 0 => 'People', + 1 => 'Scenery', + 2 => 'Events', + 3 => 'User 1', + 4 => 'User 2', + 5 => 'User 3', + 6 => 'To Do', + }, + }, + }, + 0x24 => { #PH + Name => 'FaceDetect1', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::FaceDetect1', + }, + }, + 0x25 => { #PH + Name => 'FaceDetect2', + SubDirectory => { + TagTable => 'Image::ExifTool::Canon::FaceDetect2', + # (can't validate because this record uses a 1-byte count instead of a 2-byte count) + }, + }, + 0x26 => { #PH (A570IS,1DmkIII) + Name => 'CanonAFInfo2', + Condition => '$$valPt !~ /^\0\0\0\0/', # (data may be all zeros in thumbnail of 60D MOV video) + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::AFInfo2', + }, + }, + 0x27 => { #PH + Name => 'ContrastInfo', + Condition => '$$valPt =~ /^\x0a\0/', # (seems to be various versions of this information) + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ContrastInfo' }, + }, + # 0x27 - value 1 is 1 for high ISO pictures, 0 otherwise + # value 4 is 9 for Flexizone and FaceDetect AF, 1 for Centre AF, 0 otherwise (SX10IS) + 0x28 => { #JD + # bytes 0-1=sequence number (encrypted), 2-5=date/time (encrypted) (ref JD) + Name => 'ImageUniqueID', + Format => 'undef', + Writable => 'int8u', + Groups => { 2 => 'Image' }, + RawConv => '$val eq "\0" x 16 ? undef : $val', + ValueConv => 'unpack("H*", $val)', + ValueConvInv => 'pack("H*", $val)', + }, + 0x29 => { #IB (G9) + Name => 'WBInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::WBInfo' }, + }, + # 0x2d - changes with categories (ref 31) + 0x2f => { #PH (G12) + Name => 'FaceDetect3', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::FaceDetect3', + }, + }, + # 0x32 - if length is 768, starting at offset 4 there are 6 RGGB 1/val int16 records: + # daylight,cloudy,tungsten,fluorescent,flash,kelvin (D30 2001, ref IB) + 0x35 => { #PH + Name => 'TimeInfo', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::TimeInfo', + }, + }, + 0x38 => { #PH + Name => 'BatteryType', + Writable => 'undef', + Condition => '$count == 76', + RawConv => '$val=~/^.{4}([^\0]+)/s ? $1 : undef', + RawConvInv => 'substr("\x4c\0\0\0".$val.("\0"x72), 0, 76)', + }, + 0x3c => { #PH (G1XmkII) + Name => 'AFInfo3', + Condition => '$$self{AFInfo3} = 1', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::AFInfo2', + }, + }, + # 0x44 (ShootInfo) + # 0x62 (UserSetting) + 0x81 => { #13 + Name => 'RawDataOffset', + # (can't yet write 1D raw files) + # Writable => 'int32u', + # Protected => 2, + }, + 0x83 => { #PH + Name => 'OriginalDecisionDataOffset', + Writable => 'int32u', + OffsetPair => 1, # (just used as a flag, since this tag has no pair) + # this is an offset to the original decision data block + # (offset relative to start of file in JPEG images, but NOT DNG images!) + IsOffset => '$val and $$et{FILE_TYPE} ne "JPEG"', + Protected => 2, + DataTag => 'OriginalDecisionData', + }, + 0x90 => { # used by 1D and 1Ds + Name => 'CustomFunctions1D', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::Functions1D', + }, + }, + 0x91 => { #PH + Name => 'PersonalFunctions', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::PersonalFuncs', + }, + }, + 0x92 => { #PH + Name => 'PersonalFunctionValues', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::PersonalFuncValues', + }, + }, + 0x93 => { + Name => 'CanonFileInfo', # (ShootInfoEx) + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::FileInfo', + }, + }, + 0x94 => { #PH + # AF points for 1D (45 points in 5 rows) + Name => 'AFPointsInFocus1D', + Notes => 'EOS 1D -- 5 rows: A1-7, B1-10, C1-11, D1-10, E1-7, center point is C6', + PrintConv => 'Image::ExifTool::Canon::PrintAFPoints1D($val)', + }, + 0x95 => { #PH (observed in 5D sample image) + Name => 'LensModel', # (LensName) + Writable => 'string', + }, + 0x96 => [ #PH (CMOSNumber) + { + Name => 'SerialInfo', + Condition => '$$self{Model} =~ /EOS 5D/', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::SerialInfo' }, + }, + { + Name => 'InternalSerialNumber', + Writable => 'string', + # remove trailing 0xff's if they exist (Kiss X3) + ValueConv => '$val=~s/\xff+$//; $val', + ValueConvInv => '$val', + }, + ], + 0x97 => { #PH (also see http://www.freepatentsonline.com/7657116.html) + Name => 'DustRemovalData', # (DustDeleteData) + Writable => 'undef', + Flags => [ 'Binary', 'Protected' ], + # 0x00: int8u - Version (0 or 1) + # 0x01: int8u - LensInfo ? (1) + # 0x02: int8u - AVValue ? (int8u for version 0, int16u for version 1) + # 0x03: int8u - POValue ? (int8u for version 0, int16u for version 1) + # 0x04: int16u - DustCount + # 0x06: int16u - FocalLength ? + # 0x08: int16u - LensID ? + # 0x0a: int16u - Width + # 0x0c: int16u - Height + # 0x0e: int16u - RAW_Width + # 0x10: int16u - RAW_Height + # 0x12: int16u - PixelPitch [um * 1000] + # 0x14: int16u - LpfDistance [mm * 1000] + # 0x16: int8u - TopOffset + # 0x17: int8u - BottomOffset + # 0x18: int8u - LeftOffset + # 0x19: int8u - RightOffset + # 0x1a: int8u - Year [-1900] + # 0x1b: int8u - Month + # 0x1c: int8u - Day + # 0x1d: int8u - Hour + # 0x1e: int8u - Minutes + # 0x1f: int8u - BrightDiff + # Table with DustCount entries: + # 0x22: int16u - DustX + # 0x24: int16u - DustY + # 0x26: int16u - DustSize + }, + 0x98 => { #PH + Name => 'CropInfo', # (ImageSizeOffset) + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CropInfo' }, + }, + 0x99 => { #PH (EOS 1D Mark III, 40D, etc) + Name => 'CustomFunctions2', # (CustomFunEx) + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::Functions2', + }, + }, + 0x9a => { #PH + Name => 'AspectInfo', # (AspectRatioInfo) + SubDirectory => { TagTable => 'Image::ExifTool::Canon::AspectInfo' }, + }, + 0xa0 => { + Name => 'ProcessingInfo', # (DevelopParam) + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::Processing', + }, + }, + 0xa1 => { Name => 'ToneCurveTable', %longBin }, #PH + 0xa2 => { Name => 'SharpnessTable', %longBin }, #PH + 0xa3 => { Name => 'SharpnessFreqTable', %longBin }, #PH + 0xa4 => { Name => 'WhiteBalanceTable', %longBin }, #PH + 0xa9 => { + Name => 'ColorBalance', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::ColorBalance', + }, + }, + 0xaa => { + Name => 'MeasuredColor', # (PresetWBDS) + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::MeasuredColor', + }, + }, + 0xae => { + Name => 'ColorTemperature', + Writable => 'int16u', + }, + 0xb0 => { #PH + Name => 'CanonFlags', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::Flags', + }, + }, + 0xb1 => { #PH + Name => 'ModifiedInfo', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::ModifiedInfo', + }, + }, + 0xb2 => { Name => 'ToneCurveMatching', %longBin }, #PH + 0xb3 => { Name => 'WhiteBalanceMatching', %longBin }, #PH + 0xb4 => { #PH + Name => 'ColorSpace', + Writable => 'int16u', + PrintConv => { + 1 => 'sRGB', + 2 => 'Adobe RGB', + 65535 => 'n/a', + }, + }, + 0xb6 => { + Name => 'PreviewImageInfo', + SubDirectory => { + # Note: the first word of this block gives the correct block size in bytes, but + # the size is wrong by a factor of 2 in the IFD, so we must account for this + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size/2)', + TagTable => 'Image::ExifTool::Canon::PreviewImageInfo', + }, + }, + 0xd0 => { #PH + Name => 'VRDOffset', + Writable => 'int32u', + OffsetPair => 1, # (just used as a flag, since this tag has no pair) + Protected => 2, + DataTag => 'CanonVRD', + Notes => 'offset of VRD "recipe data" if it exists', + }, + 0xe0 => { #12 + Name => 'SensorInfo', # (ImageAreaDesc) + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::SensorInfo', + }, + }, + 0x4001 => [ #13 (WBPacket) + { # (int16u[582]) - 20D and 350D + Condition => '$count == 582', + Name => 'ColorData1', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData1' }, + }, + { # (int16u[653]) - 1DmkII and 1DSmkII + Condition => '$count == 653', + Name => 'ColorData2', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData2' }, + }, + { # (int16u[796]) - 1DmkIIN, 5D, 30D, 400D + Condition => '$count == 796', + Name => 'ColorData3', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData3' }, + }, + { # (int16u[692|674|702|1227|1250|1251|1337]) + # 40D (692), 1DmkIII (674), 1DSmkIII (702), 450D/1000D (1227) + # 50D/5DmkII (1250), 500D/7D_pre-prod/1DmkIV_pre-prod (1251), + # 1DmkIV/7D/550D_pre-prod (1337), 550D (1338), 60D/1100D (1346) + Condition => q{ + $count == 692 or $count == 674 or $count == 702 or + $count == 1227 or $count == 1250 or $count == 1251 or + $count == 1337 or $count == 1338 or $count == 1346 + }, + Name => 'ColorData4', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData4' }, + }, + { # (int16u[5120]) - G10, G7X + Condition => '$count == 5120', + Name => 'ColorData5', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData5' }, + }, + { # (int16u[1273|1275]) - 600D (1273), 1200D (1275) + Condition => '$count == 1273 or $count == 1275', + Name => 'ColorData6', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData6' }, + }, + { # (int16u[1312|1313|1316]) + # 1DX/5DmkIII/650D/700D/M (1312), 6D/70D/100D (1313), + # 1DX firmware 1.x (1316), 7DmkII (1506) + Condition => '$count == 1312 or $count == 1313 or $count == 1316 or + $count == 1506', + Name => 'ColorData7', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData7' }, + }, + { # (int16u[1560|1592]) - 5DS/5DSR (1560), 80D (1592), 1300D (1353) ref IB + Condition => '$count == 1560 or $count == 1592 or $count == 1353 or $count == 1602', + Name => 'ColorData8', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData8' }, + }, + { # (int16u[1816|1820|1824]) - M50 (1820) ref PH, EOS R (1824), EOS RP, SX70 (1816) ref IB + Condition => '$count == 1816 or $count == 1820 or $count == 1824', + Name => 'ColorData9', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData9' }, + }, + { # (int16u[2024|3656]) - 1DXmkIII (2024) ref IB, R5/R6 (3656) ref PH + Condition => '$count == 2024 or $count == 3656', + Name => 'ColorData10', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData10' }, + }, + { # (int16u[3973]) - R3 ref IB + Condition => '$count == 3973', + Name => 'ColorData11', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData11' }, + }, + { + Name => 'ColorDataUnknown', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorDataUnknown' }, + }, + ], + 0x4002 => { #PH + # unknown data block in some JPEG and CR2 images + # (5kB for most models, but 22kb for 5D and 30D, and 43kB for 5DmkII so Drop it) + Name => 'CRWParam', + Format => 'undef', + Flags => [ 'Unknown', 'Binary', 'Drop' ], + }, + 0x4003 => { #PH + Name => 'ColorInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorInfo' }, + }, + 0x4005 => { #PH + Name => 'Flavor', + Notes => 'unknown 49kB block, not copied to JPEG images', + # 'Drop' because not found in JPEG images (too large for APP1 anyway) + Flags => [ 'Unknown', 'Binary', 'Drop' ], + }, + 0x4008 => { #53 + Name => 'PictureStyleUserDef', # (BasePictStyleOfUser) + Writable => 'int16u', + Count => 3, # UserDef1, UserDef2, UserDef3 + PrintHex => 1, + SeparateTable => 'PictureStyle', + PrintConv => [\%pictureStyles,\%pictureStyles,\%pictureStyles], + }, + 0x4009 => { #53 + Name => 'PictureStylePC', # (BasePictStyleOfUser) + Writable => 'int16u', + Count => 3, # PC1, PC2, PC3 + PrintHex => 1, + SeparateTable => 'PictureStyle', + PrintConv => [\%pictureStyles,\%pictureStyles,\%pictureStyles], + }, + 0x4010 => { #forum2933 + Name => 'CustomPictureStyleFileName', # (PictStyleCaption) + Writable => 'string', + }, + # 0x4011 (PictStyleAppendInfo) + # 0x4012 (CustomWBCaption) + 0x4013 => { #PH + Name => 'AFMicroAdj', # (AFMicroAdjust) + SubDirectory => { + # Canon DPP 3.13 is known to truncate this data to 0x14 bytes (from 0x2c), + # so specifically check for 0x2c to avoid giving a warning in this case + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size,0x2c)', + TagTable => 'Image::ExifTool::Canon::AFMicroAdj', + }, + }, + # 0x4014 (similar to 0x83?) + 0x4015 => [{ + Name => 'VignettingCorr', # (LensPacket) + Condition => '$$valPt =~ /^\0/ and $$valPt !~ /^\0\0\0\0/', # (data may be all zeros for 60D) + SubDirectory => { + # (the size word is at byte 2 in this structure) + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart+2,$size)', + TagTable => 'Image::ExifTool::Canon::VignettingCorr', + }, + },{ + Name => 'VignettingCorrUnknown1', + Condition => '$$valPt =~ /^[\x01\x02\x10\x20]/ and $$valPt !~ /^\0\0\0\0/', + SubDirectory => { + # (the size word is at byte 2 in this structure) + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart+2,$size)', + TagTable => 'Image::ExifTool::Canon::VignettingCorrUnknown', + }, + },{ + Name => 'VignettingCorrUnknown2', + Condition => '$$valPt !~ /^\0\0\0\0/', + SubDirectory => { + # (the size word is at byte 4 for version 3 of this structure, but not always!) + # Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart+4,$size)', + TagTable => 'Image::ExifTool::Canon::VignettingCorrUnknown', + }, + }], + 0x4016 => { + Name => 'VignettingCorr2', # (ImageCorrectActual) + SubDirectory => { + # (the size word is actually 4 bytes, but it doesn't matter if little-endian) + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::VignettingCorr2', + }, + }, + 0x4018 => { #PH + Name => 'LightingOpt', # (ImageCorrect) + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::LightingOpt', + } + }, + 0x4019 => { #20 + Name => 'LensInfo', # (LensInfoForService) + SubDirectory => { + TagTable => 'Image::ExifTool::Canon::LensInfo', + } + }, + 0x4020 => { #PH + Name => 'AmbienceInfo', + Condition => '$$valPt !~ /^\0\0\0\0/', # (data may be all zeros for 60D) + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::Ambience', + } + }, + 0x4021 => { #PH + Name => 'MultiExp', # (ExifDSTagMultipleExposure) + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::MultiExp', + } + }, + 0x4024 => { #PH + Name => 'FilterInfo', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::FilterInfo', + } + }, + 0x4025 => { #PH + Name => 'HDRInfo', # (HighDynamicRange) + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::HDRInfo', + } + }, + 0x4026 => { #github#119 + Name => 'LogInfo', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::LogInfo', + } + }, + 0x4028 => { #PH + Name => 'AFConfig', # (AFTabInfo) + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::AFConfig', + } + }, + 0x403f => { #25 + Name => 'RawBurstModeRoll', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::RawBurstInfo', + } + }, +); + +#.............................................................................. +# Canon camera settings (MakerNotes tag 0x01) +# BinaryData (keys are indices into the int16s array) +%Image::ExifTool::Canon::CameraSettings = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 1, + DATAMEMBER => [ 22, 25 ], # necessary for writing + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 1 => { + Name => 'MacroMode', + PrintConv => { + 1 => 'Macro', + 2 => 'Normal', + }, + }, + 2 => { + Name => 'SelfTimer', + # Custom timer mode if bit 0x4000 is set - PH (A570IS) + PrintConv => q{ + return 'Off' unless $val; + return (($val&0xfff) / 10) . ' s' . ($val & 0x4000 ? ', Custom' : ''); + }, + PrintConvInv => q{ + return 0 if $val =~ /^Off/i; + $val =~ s/\s*s(ec)?\b//i; + $val =~ s/,?\s*Custom$//i ? ($val*10) | 0x4000 : $val*10; + }, + }, + 3 => { + Name => 'Quality', + PrintConv => \%canonQuality, + }, + 4 => { + Name => 'CanonFlashMode', + PrintConv => { + -1 => 'n/a', # (PH, EOS M MOV video) + 0 => 'Off', + 1 => 'Auto', + 2 => 'On', + 3 => 'Red-eye reduction', + 4 => 'Slow-sync', + 5 => 'Red-eye reduction (Auto)', + 6 => 'Red-eye reduction (On)', + 16 => 'External flash', # not set in D30 or 300D + }, + }, + 5 => { + Name => 'ContinuousDrive', + PrintConv => { + 0 => 'Single', + 1 => 'Continuous', + 2 => 'Movie', #PH + 3 => 'Continuous, Speed Priority', #PH + 4 => 'Continuous, Low', #PH + 5 => 'Continuous, High', #PH + 6 => 'Silent Single', #PH + 8 => 'Continuous, High+', #WolfgangGulcker + # ref A: https://exiftool.org/forum/index.php/topic,5701.msg27843.html#msg27843 + 9 => 'Single, Silent', #A + 10 => 'Continuous, Silent', #A + # 11 - seen for SX260 + # 32-34 - Self-timer? + }, + }, + 7 => { + Name => 'FocusMode', + PrintConv => { + 0 => 'One-shot AF', + 1 => 'AI Servo AF', + 2 => 'AI Focus AF', + 3 => 'Manual Focus (3)', + 4 => 'Single', + 5 => 'Continuous', + 6 => 'Manual Focus (6)', + 16 => 'Pan Focus', #PH + # 137 - Single? + 256 => 'AF + MF', #PH (NC, EOS M) + 257 => 'Live View', #forum12082 + 512 => 'Movie Snap Focus', #48 + 519 => 'Movie Servo AF', #PH (NC, EOS M) + }, + }, + 9 => { #PH + Name => 'RecordMode', + RawConv => '$val==-1 ? undef : $val', #22 + PrintConv => { + 1 => 'JPEG', + 2 => 'CRW+THM', # (300D,etc) + 3 => 'AVI+THM', # (30D) + 4 => 'TIF', # +THM? (1Ds) (unconfirmed) + 5 => 'TIF+JPEG', # (1D) (unconfirmed) + 6 => 'CR2', # +THM? (1D,30D,350D) + 7 => 'CR2+JPEG', # (S30) + 9 => 'MOV', # (S95 MOV) + 10 => 'MP4', # (SX280 MP4) + 11 => 'CRM', #PH (C200 CRM) + 12 => 'CR3', #PH (EOS R) + 13 => 'CR3+JPEG', #PH (EOS R) + 14 => 'HIF', #PH (NC) + 15 => 'CR3+HIF', #PH (1DXmkIII) + }, + }, + 10 => { + Name => 'CanonImageSize', + PrintConvColumns => 2, + PrintConv => \%canonImageSize, + }, + 11 => { + Name => 'EasyMode', + PrintConvColumns => 3, + PrintConv => { + # references: + # A = http://homepage3.nifty.com/kamisaka/makernote/makernote_canon.htm + # B = http://www.burren.cx/david/canon.html + # C = DPP 3.11.26 + 0 => 'Full auto', + 1 => 'Manual', + 2 => 'Landscape', + 3 => 'Fast shutter', + 4 => 'Slow shutter', + 5 => 'Night', # (C='Night Scene') + 6 => 'Gray Scale', #PH (A/B/C='Black & White') + 7 => 'Sepia', + 8 => 'Portrait', + 9 => 'Sports', + 10 => 'Macro', + 11 => 'Black & White', #PH (A='Black & White', B/C='Pan focus') + 12 => 'Pan focus', # (A='Pan focus', C='Vivid') + 13 => 'Vivid', #PH (A='Vivid', C='Neutral') + 14 => 'Neutral', #PH (A='Natural', C='Black & White') + 15 => 'Flash Off', #8 (C=<none>) + 16 => 'Long Shutter', #PH + 17 => 'Super Macro', #PH (C='Macro') + 18 => 'Foliage', #PH + 19 => 'Indoor', #PH + 20 => 'Fireworks', #PH + 21 => 'Beach', #PH + 22 => 'Underwater', #PH + 23 => 'Snow', #PH + 24 => 'Kids & Pets', #PH + 25 => 'Night Snapshot', #PH + 26 => 'Digital Macro', #PH + 27 => 'My Colors', #PH + 28 => 'Movie Snap', #PH + 29 => 'Super Macro 2', #PH + 30 => 'Color Accent', #18 + 31 => 'Color Swap', #18 + 32 => 'Aquarium', #18 + 33 => 'ISO 3200', #18 + 34 => 'ISO 6400', #PH + 35 => 'Creative Light Effect', #PH + 36 => 'Easy', #PH + 37 => 'Quick Shot', #PH + 38 => 'Creative Auto', #39 + 39 => 'Zoom Blur', #PH + 40 => 'Low Light', #PH + 41 => 'Nostalgic', #PH + 42 => 'Super Vivid', #PH (SD4500) + 43 => 'Poster Effect', #PH (SD4500) + 44 => 'Face Self-timer', #PH + 45 => 'Smile', #PH + 46 => 'Wink Self-timer', #PH + 47 => 'Fisheye Effect', #PH (SX30IS,IXUS240) + 48 => 'Miniature Effect', #PH (SD4500) + 49 => 'High-speed Burst', #PH + 50 => 'Best Image Selection', #PH + 51 => 'High Dynamic Range', #PH (S95) + 52 => 'Handheld Night Scene', #PH + 53 => 'Movie Digest', #PH + 54 => 'Live View Control', #PH + 55 => 'Discreet', #PH + 56 => 'Blur Reduction', #PH + 57 => 'Monochrome', #PH (SX260 B&W,Sepia,Blue tone) + 58 => 'Toy Camera Effect', #51 + 59 => 'Scene Intelligent Auto', #PH (T3i) (C='High-speed Burst HQ' !!) + 60 => 'High-speed Burst HQ', #PH (C='High-speed Burst HQ', same as 59) + 61 => 'Smooth Skin', #51 + 62 => 'Soft Focus', #PH (SX260,IXUS240) + 68 => 'Food', #PH (250D) + # 83 - seen for EOS M200 (ref PH) + 84 => 'HDR Art Standard', #PH (80D) + 85 => 'HDR Art Vivid', #PH (80D) + 93 => 'HDR Art Bold', #PH (80D) + # 83 - seen for EOS M3 night shot (PH) + 257 => 'Spotlight', #PH + 258 => 'Night 2', #PH + 259 => 'Night+', + 260 => 'Super Night', #PH + 261 => 'Sunset', #PH (SX10IS) + 263 => 'Night Scene', #PH + 264 => 'Surface', #PH + 265 => 'Low Light 2', #PH + }, + }, + 12 => { + Name => 'DigitalZoom', + PrintConv => { + 0 => 'None', + 1 => '2x', + 2 => '4x', + 3 => 'Other', # value obtained from 2*$val[37]/$val[36] + }, + }, + 13 => { + Name => 'Contrast', + RawConv => '$val == 0x7fff ? undef : $val', + %Image::ExifTool::Exif::printParameter, + }, + 14 => { + Name => 'Saturation', + RawConv => '$val == 0x7fff ? undef : $val', + %Image::ExifTool::Exif::printParameter, + }, + 15 => { + Name => 'Sharpness', + RawConv => '$val == 0x7fff ? undef : $val', + Notes => q{ + some models use a range of -2 to +2 where 0 is normal sharpening, and + others use a range of 0 to 7 where 0 is no sharpening + }, + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 16 => { + Name => 'CameraISO', + RawConv => '$val == 0x7fff ? undef : $val', + ValueConv => 'Image::ExifTool::Canon::CameraISO($val)', + ValueConvInv => 'Image::ExifTool::Canon::CameraISO($val,1)', + }, + 17 => { + Name => 'MeteringMode', + PrintConv => { + 0 => 'Default', # older Ixus + 1 => 'Spot', + 2 => 'Average', #PH + 3 => 'Evaluative', + 4 => 'Partial', + 5 => 'Center-weighted average', + }, + }, + 18 => { + # this is always 2 for the 300D - PH + Name => 'FocusRange', + PrintConv => { + 0 => 'Manual', + 1 => 'Auto', + 2 => 'Not Known', + 3 => 'Macro', + 4 => 'Very Close', #PH + 5 => 'Close', #PH + 6 => 'Middle Range', #PH + 7 => 'Far Range', + 8 => 'Pan Focus', + 9 => 'Super Macro', #PH + 10=> 'Infinity', #PH + }, + }, + 19 => { + Name => 'AFPoint', + Flags => 'PrintHex', + RawConv => '$val==0 ? undef : $val', + PrintConv => { + 0x2005 => 'Manual AF point selection', + 0x3000 => 'None (MF)', + 0x3001 => 'Auto AF point selection', + 0x3002 => 'Right', + 0x3003 => 'Center', + 0x3004 => 'Left', + 0x4001 => 'Auto AF point selection', + 0x4006 => 'Face Detect', #PH (A570IS) + }, + }, + 20 => { + Name => 'CanonExposureMode', + PrintConv => { + 0 => 'Easy', + 1 => 'Program AE', + 2 => 'Shutter speed priority AE', + 3 => 'Aperture-priority AE', + 4 => 'Manual', + 5 => 'Depth-of-field AE', + 6 => 'M-Dep', #PH + 7 => 'Bulb', #30 + 8 => 'Flexible-priority AE', #ArnoldVanOostrum + }, + }, + 22 => { #4 + Name => 'LensType', + Format => 'int16u', + RawConv => '$val ? $$self{LensType}=$val : undef', # don't use if value is zero + Notes => 'this value is incorrect for EOS 7D images with lenses of type 256 or greater', + SeparateTable => 1, + DataMember => 'LensType', + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 23 => { + Name => 'MaxFocalLength', + Format => 'int16u', + # this is a bit tricky, but we need the FocalUnits to convert this to mm + RawConvInv => '$val * ($$self{FocalUnits} || 1)', + ValueConv => '$val / ($$self{FocalUnits} || 1)', + ValueConvInv => '$val', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm//;$val', + }, + 24 => { + Name => 'MinFocalLength', + Format => 'int16u', + RawConvInv => '$val * ($$self{FocalUnits} || 1)', + ValueConv => '$val / ($$self{FocalUnits} || 1)', + ValueConvInv => '$val', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm//;$val', + }, + 25 => { + Name => 'FocalUnits', + # conversion from raw focal length values to mm + DataMember => 'FocalUnits', + RawConv => '$$self{FocalUnits} = $val', + PrintConv => '"$val/mm"', + PrintConvInv => '$val=~s/\s*\/?\s*mm//;$val', + }, + 26 => { #9 + Name => 'MaxAperture', + RawConv => '$val > 0 ? $val : undef', + ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val)*log(2)/2)', + ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))', + PrintConv => 'sprintf("%.2g",$val)', + PrintConvInv => '$val', + }, + 27 => { #PH + Name => 'MinAperture', + RawConv => '$val > 0 ? $val : undef', + ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val)*log(2)/2)', + ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))', + PrintConv => 'sprintf("%.2g",$val)', + PrintConvInv => '$val', + }, + 28 => { + Name => 'FlashActivity', + RawConv => '$val==-1 ? undef : $val', + }, + 29 => { + Name => 'FlashBits', + PrintConvColumns => 2, + PrintConv => { + 0 => '(none)', + BITMASK => { + 0 => 'Manual', #PH + 1 => 'TTL', #PH + 2 => 'A-TTL', #PH + 3 => 'E-TTL', #PH + 4 => 'FP sync enabled', + 7 => '2nd-curtain sync used', + 11 => 'FP sync used', + 13 => 'Built-in', + 14 => 'External', #(may not be set in manual mode - ref 37) + }, + }, + }, + 32 => { + Name => 'FocusContinuous', + RawConv => '$val==-1 ? undef : $val', + PrintConv => { + 0 => 'Single', + 1 => 'Continuous', + 8 => 'Manual', #22 + }, + }, + 33 => { #PH + Name => 'AESetting', + RawConv => '$val==-1 ? undef : $val', + PrintConv => { + 0 => 'Normal AE', + 1 => 'Exposure Compensation', + 2 => 'AE Lock', + 3 => 'AE Lock + Exposure Comp.', + 4 => 'No AE', + }, + }, + 34 => { #PH + Name => 'ImageStabilization', + RawConv => '$val==-1 ? undef : $val', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'Shoot Only', #15 + 3 => 'Panning', # (A570IS) + 4 => 'Dynamic', # (SX30IS) (was 'On, Video') + # (don't know what bit 0x100 indicates) + 256 => 'Off (2)', + 257 => 'On (2)', + 258 => 'Shoot Only (2)', + 259 => 'Panning (2)', + 260 => 'Dynamic (2)', + }, + }, + 35 => { #PH + Name => 'DisplayAperture', + RawConv => '$val ? $val : undef', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 36 => 'ZoomSourceWidth', #PH + 37 => 'ZoomTargetWidth', #PH + 39 => { #22 + Name => 'SpotMeteringMode', + RawConv => '$val==-1 ? undef : $val', + PrintConv => { + 0 => 'Center', + 1 => 'AF Point', + }, + }, + 40 => { #PH + Name => 'PhotoEffect', + RawConv => '$val==-1 ? undef : $val', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Off', + 1 => 'Vivid', + 2 => 'Neutral', + 3 => 'Smooth', + 4 => 'Sepia', + 5 => 'B&W', + 6 => 'Custom', + 100 => 'My Color Data', + }, + }, + 41 => { #PH (A570IS) + Name => 'ManualFlashOutput', + PrintHex => 1, + PrintConv => { + 0 => 'n/a', + 0x500 => 'Full', + 0x502 => 'Medium', + 0x504 => 'Low', + 0x7fff => 'n/a', # (EOS models) + }, + }, + # 41 => non-zero for manual flash intensity - PH (A570IS) + 42 => { + Name => 'ColorTone', + RawConv => '$val == 0x7fff ? undef : $val', + %Image::ExifTool::Exif::printParameter, + }, + 46 => { #PH + Name => 'SRAWQuality', + RawConv => '$val==-1 ? undef : $val', + PrintConv => { + 0 => 'n/a', + 1 => 'sRAW1 (mRAW)', + 2 => 'sRAW2 (sRAW)', + }, + }, + # 47 - related to aspect ratio: 100=4:3,70=1:1/16:9,90=3:2,60=4:5 (PH G12) + # (roughly image area in percent - 4:3=100%,1:1/16:9=75%,3:2=89%,4:5=60%) +); + +# focal length information (MakerNotes tag 0x02) +%Image::ExifTool::Canon::FocalLength = ( + %binaryDataAttrs, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => { #9 + Name => 'FocalType', + RawConv => '$val ? $val : undef', # don't use if value is zero + PrintConv => { + 1 => 'Fixed', + 2 => 'Zoom', + }, + }, + 1 => { + Name => 'FocalLength', + # the EXIF FocalLength is more reliable, so set this priority to zero + Priority => 0, + RawConv => '$val ? $val : undef', # don't use if value is zero + RawConvInv => q{ + my $focalUnits = $$self{FocalUnits}; + unless ($focalUnits) { + $focalUnits = 1; + # (this happens when writing FocalLength to CRW images) + $self->Warn("FocalUnits not available for FocalLength conversion (1 assumed)"); + } + return $val * $focalUnits; + }, + ValueConv => '$val / ($$self{FocalUnits} || 1)', + ValueConvInv => '$val', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm//;$val', + }, + 2 => [ #4 + { + Name => 'FocalPlaneXSize', + Notes => q{ + these focal plane sizes are only valid for some models, and are affected by + digital zoom if applied + }, + # this conversion is valid only for PowerShot models and these EOS models: + # D30, D60, 1D, 1DS, 5D, 10D, 20D, 30D, 300D, 350D, and 400D + Condition => q{ + $$self{Model} !~ /EOS/ or + $$self{Model} =~ /\b(1DS?|5D|D30|D60|10D|20D|30D|K236)$/ or + $$self{Model} =~ /\b((300D|350D|400D) DIGITAL|REBEL( XTi?)?|Kiss Digital( [NX])?)$/ + }, + # focal plane image dimensions in 1/1000 inch -- convert to mm + RawConv => '$val < 40 ? undef : $val', # must be reasonable + ValueConv => '$val * 25.4 / 1000', + ValueConvInv => 'int($val * 1000 / 25.4 + 0.5)', + PrintConv => 'sprintf("%.2f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//;$val', + },{ + Name => 'FocalPlaneXUnknown', + Unknown => 1, + }, + ], + 3 => [ #4 + { + Name => 'FocalPlaneYSize', + Condition => q{ + $$self{Model} !~ /EOS/ or + $$self{Model} =~ /\b(1DS?|5D|D30|D60|10D|20D|30D|K236)$/ or + $$self{Model} =~ /\b((300D|350D|400D) DIGITAL|REBEL( XTi?)?|Kiss Digital( [NX])?)$/ + }, + RawConv => '$val < 40 ? undef : $val', # must be reasonable + ValueConv => '$val * 25.4 / 1000', + ValueConvInv => 'int($val * 1000 / 25.4 + 0.5)', + PrintConv => 'sprintf("%.2f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//;$val', + },{ + Name => 'FocalPlaneYUnknown', + Unknown => 1, + }, + ], +); + +# Canon shot information (MakerNotes tag 0x04) +# BinaryData (keys are indices into the int16s array) +%Image::ExifTool::Canon::ShotInfo = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 1, + DATAMEMBER => [ 19 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 1 => { #PH + Name => 'AutoISO', + Notes => 'actual ISO used = BaseISO * AutoISO / 100', + ValueConv => 'exp($val/32*log(2))*100', + ValueConvInv => '32*log($val/100)/log(2)', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 2 => { + Name => 'BaseISO', + Priority => 0, + RawConv => '$val ? $val : undef', + ValueConv => 'exp($val/32*log(2))*100/32', + ValueConvInv => '32*log($val*32/100)/log(2)', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 3 => { #9/PH + Name => 'MeasuredEV', + Notes => q{ + this is the Canon name for what could better be called MeasuredLV, and + should be close to the calculated LightValue for a proper exposure with most + models + }, + # empirical offset of +5 seems to be good for EOS models, but maybe + # the offset should be less by up to 1 EV for some PowerShot models + ValueConv => '$val / 32 + 5', + ValueConvInv => '($val - 5) * 32', + PrintConv => 'sprintf("%.2f",$val)', + PrintConvInv => '$val', + }, + 4 => { #2, 9 + Name => 'TargetAperture', + RawConv => '$val > 0 ? $val : undef', + ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val)*log(2)/2)', + ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))', + PrintConv => 'sprintf("%.2g",$val)', + PrintConvInv => '$val', + }, + 5 => { #2 + Name => 'TargetExposureTime', + # ignore obviously bad values (also, -32768 may be used for n/a) + # (note that a few models always write 0: DC211, and video models) + RawConv => '($val > -1000 and ($val or $$self{Model}=~/(EOS|PowerShot|IXUS|IXY)/))? $val : undef', + ValueConv => 'exp(-Image::ExifTool::Canon::CanonEv($val)*log(2))', + ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(-log($val)/log(2))', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 6 => { + Name => 'ExposureCompensation', + ValueConv => 'Image::ExifTool::Canon::CanonEv($val)', + ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv($val)', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 7 => { + Name => 'WhiteBalance', + PrintConv => \%canonWhiteBalance, + SeparateTable => 1, + }, + 8 => { #PH + Name => 'SlowShutter', + PrintConv => { + -1 => 'n/a', + 0 => 'Off', + 1 => 'Night Scene', + 2 => 'On', + 3 => 'None', + }, + }, + 9 => { + Name => 'SequenceNumber', + Description => 'Shot Number In Continuous Burst', + Notes => 'valid only for some models', #PH (eg. not the 5DmkIII) + }, + 10 => { #PH/17 + Name => 'OpticalZoomCode', + Groups => { 2 => 'Camera' }, + Notes => 'for many PowerShot models, a this is 0-6 for wide-tele zoom', + # (for many models, 0-6 represent 0-100% zoom, but it is always 8 for + # EOS models, and I have seen values of 16,20,28,32 and 39 too...) + # - set to 8 for "n/a" by Canon software (ref 22) + PrintConv => '$val == 8 ? "n/a" : $val', + PrintConvInv => '$val =~ /[a-z]/i ? 8 : $val', + }, + # 11 - (8 for all EOS samples, [0,8] for other models - PH) + 12 => { #37 + Name => 'CameraTemperature', + Condition => '$$self{Model} =~ /EOS/ and $$self{Model} !~ /EOS-1DS?$/', + Groups => { 2 => 'Camera' }, + Notes => 'newer EOS models only', + # usually zero if not valid for an EOS model (exceptions: 1D, 1DS) + RawConv => '$val ? $val : undef', + ValueConv => '$val - 128', + ValueConvInv => '$val + 128', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 13 => { #PH + Name => 'FlashGuideNumber', + RawConv => '$val==-1 ? undef : $val', + ValueConv => '$val / 32', + ValueConvInv => '$val * 32', + }, + # AF points for Ixus and IxusV cameras - 02/17/04 M. Rommel (also D30/D60 - PH) + 14 => { #2 + Name => 'AFPointsInFocus', + Notes => 'used by D30, D60 and some PowerShot/Ixus models', + Groups => { 2 => 'Camera' }, + Flags => 'PrintHex', + RawConv => '$val==0 ? undef : $val', + PrintConvColumns => 2, + PrintConv => { + 0x3000 => 'None (MF)', + 0x3001 => 'Right', + 0x3002 => 'Center', + 0x3003 => 'Center+Right', + 0x3004 => 'Left', + 0x3005 => 'Left+Right', + 0x3006 => 'Left+Center', + 0x3007 => 'All', + }, + }, + 15 => { + Name => 'FlashExposureComp', + Description => 'Flash Exposure Compensation', + ValueConv => 'Image::ExifTool::Canon::CanonEv($val)', + ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv($val)', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 16 => { + Name => 'AutoExposureBracketing', + PrintConv => { + -1 => 'On', + 0 => 'Off', + 1 => 'On (shot 1)', + 2 => 'On (shot 2)', + 3 => 'On (shot 3)', + }, + }, + 17 => { + Name => 'AEBBracketValue', + ValueConv => 'Image::ExifTool::Canon::CanonEv($val)', + ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv($val)', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 18 => { #22 + Name => 'ControlMode', + PrintConv => { + 0 => 'n/a', + 1 => 'Camera Local Control', + # 2 - have seen this for EOS M studio picture + 3 => 'Computer Remote Control', + }, + }, + 19 => { + Name => 'FocusDistanceUpper', + DataMember => 'FocusDistanceUpper', + Format => 'int16u', + Notes => 'FocusDistance tags are only extracted if FocusDistanceUpper is non-zero', + RawConv => '($$self{FocusDistanceUpper} = $val) || undef', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => '$val > 655.345 ? "inf" : "$val m"', + PrintConvInv => '$val =~ s/ ?m$//; IsFloat($val) ? $val : 655.35', + }, + 20 => { + Name => 'FocusDistanceLower', # (seems to be the upper distance for the 400D) + Condition => '$$self{FocusDistanceUpper}', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => '$val > 655.345 ? "inf" : "$val m"', + PrintConvInv => '$val =~ s/ ?m$//; IsFloat($val) ? $val : 655.35', + }, + 21 => { + Name => 'FNumber', + Priority => 0, + RawConv => '$val ? $val : undef', + # approximate big translation table by simple calculation - PH + ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val)*log(2)/2)', + ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))', + PrintConv => 'sprintf("%.2g",$val)', + PrintConvInv => '$val', + }, + 22 => [ + { + Name => 'ExposureTime', + # encoding is different for 20D and 350D (darn!) + # (but note that encoding is the same for TargetExposureTime - PH) + Condition => '$$self{Model} =~ /\b(20D|350D|REBEL XT|Kiss Digital N)\b/', + Priority => 0, + # many models write 0 here in JPEG images (even though 0 is the + # value for an exposure time of 1 sec), but apparently a value of 0 + # is valid in a CRW image (=1s, D60 sample) + RawConv => '($val or $$self{FILE_TYPE} eq "CRW") ? $val : undef', + # approximate big translation table by simple calculation - PH + ValueConv => 'exp(-Image::ExifTool::Canon::CanonEv($val)*log(2))*1000/32', + ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(-log($val*32/1000)/log(2))', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + { + Name => 'ExposureTime', + Priority => 0, + # many models write 0 here in JPEG images (even though 0 is the + # value for an exposure time of 1 sec), but apparently a value of 0 + # is valid in a CRW image (=1s, D60 sample) + RawConv => '($val or $$self{FILE_TYPE} eq "CRW") ? $val : undef', + # approximate big translation table by simple calculation - PH + ValueConv => 'exp(-Image::ExifTool::Canon::CanonEv($val)*log(2))', + ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(-log($val)/log(2))', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + ], + 23 => { #37 + Name => 'MeasuredEV2', + Description => 'Measured EV 2', + RawConv => '$val ? $val : undef', + ValueConv => '$val / 8 - 6', + ValueConvInv => 'int(($val + 6) * 8 + 0.5)', + }, + 24 => { + Name => 'BulbDuration', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + # 25 - (usually 0, but 1 for 2s timer?, 19 for small AVI, 14 for large + # AVI, and -6 and -10 for shots 1 and 2 with stitch assist - PH) + 26 => { #15 + Name => 'CameraType', + Groups => { 2 => 'Camera' }, + PrintConv => { + 0 => 'n/a', + 248 => 'EOS High-end', + 250 => 'Compact', + 252 => 'EOS Mid-range', + 255 => 'DV Camera', #PH + }, + }, + 27 => { + Name => 'AutoRotate', + RawConv => '$val >= 0 ? $val : undef', + PrintConv => { + -1 => 'n/a', # (set to -1 when rotated by Canon software) + 0 => 'None', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 180', + 3 => 'Rotate 270 CW', + }, + }, + 28 => { #15 + Name => 'NDFilter', + PrintConv => { -1 => 'n/a', 0 => 'Off', 1 => 'On' }, + }, + 29 => { + Name => 'SelfTimer2', + RawConv => '$val >= 0 ? $val : undef', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 33 => { #PH (A570IS) + Name => 'FlashOutput', + RawConv => '($$self{Model}=~/(PowerShot|IXUS|IXY)/ or $val) ? $val : undef', + Notes => q{ + used only for PowerShot models, this has a maximum value of 500 for models + like the A570IS + }, + }, +); + +# Canon panorama information (MakerNotes tag 0x05) +%Image::ExifTool::Canon::Panorama = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + # 0 - values: always 1 + # 1 - values: 0,256,512(3 sequential L->R images); 0,-256(2 R->L images) + 2 => 'PanoramaFrameNumber', #(some models this is always 0) + # 3 - values: 160(SX10IS,A570IS); 871(S30) + # 4 - values: always 0 + 5 => { + Name => 'PanoramaDirection', + PrintConv => { + 0 => 'Left to Right', + 1 => 'Right to Left', + 2 => 'Bottom to Top', + 3 => 'Top to Bottom', + 4 => '2x2 Matrix (Clockwise)', + }, + }, +); + +# D30 color information (MakerNotes tag 0x0a) +%Image::ExifTool::Canon::UnknownD30 = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, +); + +#.............................................................................. +# common CameraInfo tag definitions +my %ciFNumber = ( + Name => 'FNumber', + Format => 'int8u', + Groups => { 2 => 'Image' }, + RawConv => '$val ? $val : undef', + ValueConv => 'exp(($val-8)/16*log(2))', + ValueConvInv => 'log($val)*16/log(2)+8', + PrintConv => 'sprintf("%.2g",$val)', + PrintConvInv => '$val', +); +my %ciExposureTime = ( + Name => 'ExposureTime', + Format => 'int8u', + Groups => { 2 => 'Image' }, + RawConv => '$val ? $val : undef', + ValueConv => 'exp(4*log(2)*(1-Image::ExifTool::Canon::CanonEv($val-24)))', + ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(1-log($val)/(4*log(2)))+24', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', +); +my %ciISO = ( + Name => 'ISO', + Format => 'int8u', + Groups => { 2 => 'Image' }, + ValueConv => '100*exp(($val/8-9)*log(2))', + ValueConvInv => '(log($val/100)/log(2)+9)*8', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', +); +my %ciCameraTemperature = ( + Name => 'CameraTemperature', + Format => 'int8u', + ValueConv => '$val - 128', + ValueConvInv => '$val + 128', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', +); +my %ciMacroMagnification = ( + Name => 'MacroMagnification', + Notes => 'currently decoded only for the MP-E 65mm f/2.8 1-5x Macro Photo', + Condition => '$$self{LensType} and $$self{LensType} == 124', + # 75=1x, 44=5x, log relationship + ValueConv => 'exp((75-$val) * log(2) * 3 / 40)', + ValueConvInv => '$val > 0 ? 75 - log($val) / log(2) * 40 / 3 : undef', + PrintConv => 'sprintf("%.1fx",$val)', + PrintConvInv => '$val=~s/\s*x//; $val', +); +my %ciFocalLength = ( + Name => 'FocalLength', + Format => 'int16uRev', # (just to make things confusing, the focal lengths are big-endian) + # ignore if zero + RawConv => '$val ? $val : undef', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm//;$val', +); +my %ciMinFocal = ( + Name => 'MinFocalLength', + Format => 'int16uRev', # byte order is big-endian + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm//;$val', +); +my %ciMaxFocal = ( + Name => 'MaxFocalLength', + Format => 'int16uRev', # byte order is big-endian + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm//;$val', +); + +#.............................................................................. +# Camera information for 1D and 1DS (MakerNotes tag 0x0d) +# (ref 15 unless otherwise noted) +%Image::ExifTool::Canon::CameraInfo1D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, # these tags are not reliable since they change with firmware version + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + Information in the "CameraInfo" records is tricky to decode because the + encodings are very different than in other Canon records (even sometimes + switching endianness between values within a single camera), plus there is + considerable variation in format from model to model. The first table below + lists CameraInfo tags for the 1D and 1DS. + }, + 0x04 => { %ciExposureTime }, #9 + 0x0a => { + Name => 'FocalLength', + Format => 'int16u', + # ignore if zero + RawConv => '$val ? $val : undef', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm//;$val', + }, + 0x0d => { #9 + Name => 'LensType', + Format => 'int16uRev', # value is little-endian + SeparateTable => 1, + RawConv => '$val ? $val : undef', # don't use if value is zero + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x0e => { + Name => 'MinFocalLength', + Format => 'int16u', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm//;$val', + }, + 0x10 => { + Name => 'MaxFocalLength', + Format => 'int16u', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm//;$val', + }, + 0x41 => { + Name => 'SharpnessFrequency', # PatternSharpness? + Condition => '$$self{Model} =~ /\b1D$/', + Notes => '1D only', + PrintConvColumns => 2, + PrintConv => { + 0 => 'n/a', + 1 => 'Lowest', + 2 => 'Low', + 3 => 'Standard', + 4 => 'High', + 5 => 'Highest', + }, + }, + 0x42 => { + Name => 'Sharpness', + Format => 'int8s', + Condition => '$$self{Model} =~ /\b1D$/', + Notes => '1D only', + }, + 0x44 => { + Name => 'WhiteBalance', + Condition => '$$self{Model} =~ /\b1D$/', + Notes => '1D only', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0x47 => { + Name => 'SharpnessFrequency', # PatternSharpness? + Condition => '$$self{Model} =~ /\b1DS$/', + Notes => '1DS only', + PrintConvColumns => 2, + PrintConv => { + 0 => 'n/a', + 1 => 'Lowest', + 2 => 'Low', + 3 => 'Standard', + 4 => 'High', + 5 => 'Highest', + }, + }, + 0x48 => [ + { + Name => 'ColorTemperature', + Format => 'int16u', + Condition => '$$self{Model} =~ /\b1D$/', + Notes => '1D only', + }, + { + Name => 'Sharpness', + Format => 'int8s', + Condition => '$$self{Model} =~ /\b1DS$/', + Notes => '1DS only', + }, + ], + 0x4a => { + Name => 'WhiteBalance', + Condition => '$$self{Model} =~ /\b1DS$/', + Notes => '1DS only', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0x4b => { + Name => 'PictureStyle', + Condition => '$$self{Model} =~ /\b1D$/', + Notes => "1D only, called 'Color Matrix' in owner's manual", + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0x4e => { + Name => 'ColorTemperature', + Format => 'int16u', + Condition => '$$self{Model} =~ /\b1DS$/', + Notes => '1DS only', + }, + 0x51 => { + Name => 'PictureStyle', + Condition => '$$self{Model} =~ /\b1DS$/', + Notes => '1DS only', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, +); + +# Camera information for 1DmkII and 1DSmkII (MakerNotes tag 0x0d) +# (ref 15 unless otherwise noted) +%Image::ExifTool::Canon::CameraInfo1DmkII = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the 1DmkII and 1DSmkII.', + 0x04 => { %ciExposureTime }, #9 + 0x09 => { %ciFocalLength }, #9 + 0x0c => { #9 + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + RawConv => '$val ? $val : undef', # don't use if value is zero + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x11 => { %ciMinFocal }, #9 + 0x13 => { %ciMaxFocal }, #9 + 0x2d => { #9 + Name => 'FocalType', + PrintConv => { + 0 => 'Fixed', + 2 => 'Zoom', + }, + }, + 0x36 => { + Name => 'WhiteBalance', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0x37 => { + Name => 'ColorTemperature', + Format => 'int16uRev', + }, + 0x39 => { + Name => 'CanonImageSize', + Format => 'int16u', + PrintConvColumns => 2, + PrintConv => \%canonImageSize, + }, + 0x66 => { + Name => 'JPEGQuality', + Notes => 'a number from 1 to 10', + }, + 0x6c => { #12 + Name => 'PictureStyle', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0x6e => { + Name => 'Saturation', + Format => 'int8s', + %Image::ExifTool::Exif::printParameter, + }, + 0x6f => { + Name => 'ColorTone', + Format => 'int8s', + %Image::ExifTool::Exif::printParameter, + }, + 0x72 => { + Name => 'Sharpness', + Format => 'int8s', + }, + 0x73 => { + Name => 'Contrast', + Format => 'int8s', + %Image::ExifTool::Exif::printParameter, + }, + 0x75 => { + Name => 'ISO', + Format => 'string[5]', + }, +); + +# Camera information for the 1DmkIIN (MakerNotes tag 0x0d) +# (ref 9 unless otherwise noted) +%Image::ExifTool::Canon::CameraInfo1DmkIIN = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the 1DmkIIN.', + 0x04 => { %ciExposureTime }, + 0x09 => { %ciFocalLength }, + 0x0c => { + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + RawConv => '$val ? $val : undef', # don't use if value is zero + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x11 => { %ciMinFocal }, + 0x13 => { %ciMaxFocal }, + 0x36 => { #15 + Name => 'WhiteBalance', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0x37 => { #15 + Name => 'ColorTemperature', + Format => 'int16uRev', + }, + 0x73 => { #15 + Name => 'PictureStyle', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0x74 => { #15 + Name => 'Sharpness', + Format => 'int8s', + }, + 0x75 => { #15 + Name => 'Contrast', + Format => 'int8s', + %Image::ExifTool::Exif::printParameter, + }, + 0x76 => { #15 + Name => 'Saturation', + Format => 'int8s', + %Image::ExifTool::Exif::printParameter, + }, + 0x77 => { #15 + Name => 'ColorTone', + Format => 'int8s', + %Image::ExifTool::Exif::printParameter, + }, + 0x79 => { #15 + Name => 'ISO', + Format => 'string[5]', + }, +); + +# Canon camera information for 1DmkIII and 1DSmkIII (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo1DmkIII = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + IS_SUBDIR => [ 0x2aa ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the 1DmkIII and 1DSmkIII.', + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, #9 + 0x06 => { %ciISO }, + 0x18 => { %ciCameraTemperature }, #36 + 0x1b => { %ciMacroMagnification }, #(NC) + 0x1d => { %ciFocalLength }, + 0x30 => { # <-- (follows pattern /\xbb\xbb(.{64})?\x01\x01\0\0.{4}/s for all models - Dave Coffin) + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x43 => { #21/24 + Name => 'FocusDistanceUpper', + # (it looks like the focus distances are also odd-byte big-endian) + %focusDistanceByteSwap, + }, + 0x45 => { #21/24 + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0x5e => { #15 + Name => 'WhiteBalance', + Format => 'int16u', + PrintConv => \%canonWhiteBalance, + SeparateTable => 1, + }, + 0x62 => { #15 + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0x86 => { + Name => 'PictureStyle', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0x111 => { #15 + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x113 => { %ciMinFocal }, + 0x115 => { %ciMaxFocal }, + 0x136 => { #15 + Name => 'FirmwareVersion', + Format => 'string[6]', + }, + 0x172 => { + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x176 => { + Name => 'ShutterCount', + Notes => 'may be valid only for some 1DmkIII copies, even running the same firmware', + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x17e => { #(NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x2aa => { #48 + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo' }, + }, + 0x45a => { #29 + Name => 'TimeStamp1', + Condition => '$$self{Model} =~ /\b1D Mark III$/', + Format => 'int32u', + Groups => { 2 => 'Time' }, + # observed in 1DmkIII firmware 5.3.1 (pre-production), 1.0.3, 1.0.8 + Notes => 'only valid for some versions of the 1DmkIII firmware', + Shift => 'Time', + RawConv => '$val ? $val : undef', + ValueConv => 'ConvertUnixTime($val)', + ValueConvInv => 'GetUnixTime($val)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + 0x45e => { + Name => 'TimeStamp', + Format => 'int32u', + Groups => { 2 => 'Time' }, + # observed in 1DmkIII firmware 1.1.0, 1.1.3 and + # 1DSmkIII firmware 1.0.0, 1.0.4, 2.1.2, 2.7.1 + Notes => 'valid for the 1DSmkIII and some versions of the 1DmkIII firmware', + Shift => 'Time', + RawConv => '$val ? $val : undef', + ValueConv => 'ConvertUnixTime($val)', + ValueConvInv => 'GetUnixTime($val)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, +); + +# Canon camera information for 1DmkIV (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo1DmkIV = ( + %binaryDataAttrs, + FIRST_ENTRY => 0, + PRIORITY => 0, + DATAMEMBER => [ 0x00, 0x56, 0x153 ], + IS_SUBDIR => [ 0x368 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + CameraInfo tags for the EOS 1D Mark IV. Indices shown are for firmware + versions 1.0.x, but they may be different for other firmware versions. + }, + 0x00 => { + Name => 'FirmwareVersionLookAhead', + Hidden => 1, + # look ahead to check location of FirmwareVersion string + Format => 'undef[0x1fd]', + RawConv => q{ + my $t = substr($val, 0x1e8, 6); # 1 = firmware 4.2.1 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 1, return undef; + $t = substr($val, 0x1ed, 6); # 2 = firmware 1.0.4 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 2, return undef; + $self->Warn('Unrecognized CameraInfo1DmkIV firmware version'); + $$self{CanonFirm} = 0; + return undef; # not a real tag + }, + }, + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x07 => { + Name => 'HighlightTonePriority', + PrintConv => \%offOn, + }, + 0x08 => { + Name => 'MeasuredEV2', + Description => 'Measured EV 2', + RawConv => '$val ? $val : undef', + ValueConv => '$val / 8 - 6', + ValueConvInv => 'int(($val + 6) * 8 + 0.5)', + }, + 0x09 => { + Name => 'MeasuredEV3', + Description => 'Measured EV 3', + RawConv => '$val ? $val : undef', + ValueConv => '$val / 8 - 6', + ValueConvInv => 'int(($val + 6) * 8 + 0.5)', + }, + 0x15 => { + Name => 'FlashMeteringMode', + PrintConv => { + 0 => 'E-TTL', + 3 => 'TTL', + 4 => 'External Auto', + 5 => 'External Manual', + 6 => 'Off', + }, + }, + 0x19 => { %ciCameraTemperature }, + 0x1e => { %ciFocalLength }, + 0x35 => { + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x54 => { + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0x56 => { + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + Hook => '$varSize += ($$self{CanonFirm} ? -1 : 0x10000) if $$self{CanonFirm} < 2', + }, + 0x78 => { + Name => 'WhiteBalance', + Format => 'int16u', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0x7c => { + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0x14f => { + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x151 => { %ciMinFocal }, + 0x153 => { %ciMaxFocal, + Hook => '$varSize -= 4 if $$self{CanonFirm} < 2', + }, + 0x1ed => { + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + }, + 0x22c => { #(NC) + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x238 => { #(NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x368 => { + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo' }, + }, +); + +# Camera information for 1D X (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo1DX = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + DATAMEMBER => [ 0x00, 0x1b, 0x8e, 0x1ab ], + IS_SUBDIR => [ 0x3f4 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + CameraInfo tags for the EOS 1D X. Indices shown are for firmware version + 1.0.2, but they may be different for other firmware versions. + }, + 0x00 => { + Name => 'FirmwareVersionLookAhead', + Hidden => 1, + # look ahead to check location of FirmwareVersion string + Format => 'undef[0x28b]', + RawConv => q{ + my $t = substr($val, 0x271, 6); # 1 = firmware 5.7.1 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 1, return undef; + $t = substr($val, 0x279, 6); # 2 = firmware 6.5.1 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 2, return undef; + $t = substr($val, 0x280, 6); # 3 = firmware 0.0.8/1.0.2/1.1.1 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 3, return undef; + $t = substr($val, 0x285, 6); # 4 = firmware 2.1.0 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 4, return undef; + $self->Warn('Unrecognized CameraInfo1DX firmware version'); + $$self{CanonFirm} = 0; + return undef; # not a real tag + }, + }, + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x1b => { %ciCameraTemperature, + Hook => '$varSize -= 3 if $$self{CanonFirm} < 3', + }, + 0x23 => { %ciFocalLength }, + 0x7d => { + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x8c => { + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0x8e => { + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + Hook => '$varSize -= 4 if $$self{CanonFirm} < 3; $varSize += 5 if $$self{CanonFirm} == 4', + }, + 0xbc => { + Name => 'WhiteBalance', + Format => 'int16u', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0xc0 => { + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0xf4 => { + Name => 'PictureStyle', + Format => 'int8u', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0x1a7 => { + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x1a9 => { %ciMinFocal }, + 0x1ab => { %ciMaxFocal, + # add another offset of -8 for firmware 5.7.1, and a large offset + # to effectively abort processing for unknown firmware + Hook => '$varSize += ($$self{CanonFirm} ? -8 : 0x10000) if $$self{CanonFirm} < 2', + }, + 0x280 => { + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + }, + 0x2d0 => { # (doesn't seem to work for firmware 2.0.3 - PH) + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x2dc => { #(NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x3f4 => { + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo2' }, + }, +); + +# Camera information for 5D (MakerNotes tag 0x0d) +# (ref 12 unless otherwise noted) +%Image::ExifTool::Canon::CameraInfo5D = ( + %binaryDataAttrs, + FORMAT => 'int8s', + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the EOS 5D.', + 0x03 => { %ciFNumber }, #PH + 0x04 => { %ciExposureTime }, #9 + 0x06 => { %ciISO }, #PH + 0x0c => { #9 + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + RawConv => '$val ? $val : undef', # don't use if value is zero + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x17 => { %ciCameraTemperature }, #PH + 0x1b => { %ciMacroMagnification }, #PH + 0x27 => { #PH + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x28 => { %ciFocalLength }, #15 + 0x38 => { + Name => 'AFPointsInFocus5D', + Format => 'int16uRev', + PrintConvColumns => 2, + PrintConv => { 0 => '(none)', + BITMASK => { + 0 => 'Center', + 1 => 'Top', + 2 => 'Bottom', + 3 => 'Upper-left', + 4 => 'Upper-right', + 5 => 'Lower-left', + 6 => 'Lower-right', + 7 => 'Left', + 8 => 'Right', + 9 => 'AI Servo1', + 10 => 'AI Servo2', + 11 => 'AI Servo3', + 12 => 'AI Servo4', + 13 => 'AI Servo5', + 14 => 'AI Servo6', + }, + }, + }, + 0x54 => { #15 + Name => 'WhiteBalance', + Format => 'int16u', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0x58 => { #15 + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0x6c => { + Name => 'PictureStyle', + Format => 'int8u', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0x93 => { %ciMinFocal }, #15 + 0x95 => { %ciMaxFocal }, #15 + 0x97 => { #15 + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0xa4 => { #PH + Name => 'FirmwareRevision', + Format => 'string[8]', + }, + 0xac => { #PH + Name => 'ShortOwnerName', + Format => 'string[16]', + }, + 0xcc => { #PH (NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + }, + 0xd0 => { + Name => 'FileIndex', + Format => 'int16u', + Groups => { 2 => 'Image' }, + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0xe8 => 'ContrastStandard', + 0xe9 => 'ContrastPortrait', + 0xea => 'ContrastLandscape', + 0xeb => 'ContrastNeutral', + 0xec => 'ContrastFaithful', + 0xed => 'ContrastMonochrome', + 0xee => 'ContrastUserDef1', + 0xef => 'ContrastUserDef2', + 0xf0 => 'ContrastUserDef3', + # sharpness values are 0-7 + 0xf1 => 'SharpnessStandard', + 0xf2 => 'SharpnessPortrait', + 0xf3 => 'SharpnessLandscape', + 0xf4 => 'SharpnessNeutral', + 0xf5 => 'SharpnessFaithful', + 0xf6 => 'SharpnessMonochrome', + 0xf7 => 'SharpnessUserDef1', + 0xf8 => 'SharpnessUserDef2', + 0xf9 => 'SharpnessUserDef3', + 0xfa => 'SaturationStandard', + 0xfb => 'SaturationPortrait', + 0xfc => 'SaturationLandscape', + 0xfd => 'SaturationNeutral', + 0xfe => 'SaturationFaithful', + 0xff => { + Name => 'FilterEffectMonochrome', + PrintConv => { + 0 => 'None', + 1 => 'Yellow', + 2 => 'Orange', + 3 => 'Red', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0x100 => 'SaturationUserDef1', + 0x101 => 'SaturationUserDef2', + 0x102 => 'SaturationUserDef3', + 0x103 => 'ColorToneStandard', + 0x104 => 'ColorTonePortrait', + 0x105 => 'ColorToneLandscape', + 0x106 => 'ColorToneNeutral', + 0x107 => 'ColorToneFaithful', + 0x108 => { + Name => 'ToningEffectMonochrome', + PrintConv => { + 0 => 'None', + 1 => 'Sepia', + 2 => 'Blue', + 3 => 'Purple', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0x109 => 'ColorToneUserDef1', + 0x10a => 'ColorToneUserDef2', + 0x10b => 'ColorToneUserDef3', + 0x10c => { + Name => 'UserDef1PictureStyle', + Format => 'int16u', + PrintHex => 1, # (only needed for one tag) + SeparateTable => 'UserDefStyle', + PrintConv => \%userDefStyles, + }, + 0x10e => { + Name => 'UserDef2PictureStyle', + Format => 'int16u', + SeparateTable => 'UserDefStyle', + PrintConv => \%userDefStyles, + }, + 0x110 => { + Name => 'UserDef3PictureStyle', + Format => 'int16u', + SeparateTable => 'UserDefStyle', + PrintConv => \%userDefStyles, + }, + 0x11c => { + Name => 'TimeStamp', + Format => 'int32u', + Groups => { 2 => 'Time' }, + Shift => 'Time', + RawConv => '$val ? $val : undef', + ValueConv => 'ConvertUnixTime($val)', + ValueConvInv => 'GetUnixTime($val)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, +); + +# Camera information for 5D Mark II (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo5DmkII = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + DATAMEMBER => [ 0x00, 0xea ], + IS_SUBDIR => [ 0x2f7 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + CameraInfo tags for the EOS 5D Mark II. Indices shown are for firmware + version 1.0.6, but they may be different for other firmware versions. + }, + 0x00 => { + Name => 'FirmwareVersionLookAhead', + Hidden => 1, + # look ahead to check location of FirmwareVersion string + Format => 'undef[0x184]', + RawConv => q{ + my $t = substr($val, 0x15a, 6); # 1 = firmware 3.4.6/3.6.1 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 1, return undef; + $t = substr($val, 0x17e, 6); # 2 = firmware 4.1.1/1.0.6 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 2, return undef; + $self->Warn('Unrecognized CameraInfo5DmkII firmware version'); + $$self{CanonFirm} = 0; + return undef; # not a real tag + }, + }, + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x07 => { + Name => 'HighlightTonePriority', + PrintConv => \%offOn, + }, + 0x1b => { %ciMacroMagnification }, #PH + 0x15 => { #PH (580 EX II) + Name => 'FlashMeteringMode', + PrintConv => { + 0 => 'E-TTL', + 3 => 'TTL', + 4 => 'External Auto', + 5 => 'External Manual', + 6 => 'Off', + }, + }, + 0x19 => { %ciCameraTemperature }, #36 + # 0x1b, 0x1c, 0x1d - same as FileInfo 0x10 - PH + 0x1e => { %ciFocalLength }, + 0x31 => { + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x50 => { + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0x52 => { + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0x6f => { + Name => 'WhiteBalance', + Format => 'int16u', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0x73 => { + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0xa7 => { + Name => 'PictureStyle', + Format => 'int8u', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0xbd => { + Name => 'HighISONoiseReduction', + PrintConv => { + 0 => 'Standard', + 1 => 'Low', + 2 => 'Strong', + 3 => 'Off', + }, + }, + 0xbf => { + Name => 'AutoLightingOptimizer', + PrintConv => { + 0 => 'Standard', + 1 => 'Low', + 2 => 'Strong', + 3 => 'Off', + }, + }, + 0xe6 => { + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0xe8 => { %ciMinFocal }, + 0xea => { %ciMaxFocal, + # offset changes after this for different firmware versions + Hook => '$varSize += ($$self{CanonFirm} ? -36 : 0x10000) if $$self{CanonFirm} < 2', + }, + 0x17e => { + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, # not writable for logic reasons + # some firmwares have a null instead of a space after the version number + RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef', + }, + 0x1bb => { + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x1c7 => { #(NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x2f7 => { #48 + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo' }, + }, +); + +# Camera information for 5D Mark III (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo5DmkIII = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + DATAMEMBER => [ 0x00, 0x1b, 0x23, 0x8e, 0x157 ], + IS_SUBDIR => [ 0x3b0 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + CameraInfo tags for the EOS 5D Mark III. Indices shown are for firmware + versions 1.0.x, but they may be different for other firmware versions. + }, + 0x00 => { + Name => 'FirmwareVersionLookAhead', + Hidden => 1, + # look ahead to check location of FirmwareVersion string + Format => 'undef[0x24d]', + RawConv => q{ + my $t = substr($val, 0x22c, 6); # 1 = firmware 4.5.4/4.5.6 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 1, return undef; + $t = substr($val, 0x22d, 6); # 2 = firmware 5.2.2/5.3.1/5.4.2 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 2, return undef; + $t = substr($val, 0x23c, 6); # 3 = firmware 1.0.3/1.0.7 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 3, return undef; + $t = substr($val, 0x242, 6); # 4 = firmware 1.2.1 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 4, return undef; + $t = substr($val, 0x247, 6); # 5 = firmware 1.3.5 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 5, return undef; + $self->Warn('Unrecognized CameraInfo5DmkIII firmware version'); + $$self{CanonFirm} = 0; + return undef; # not a real tag + }, + }, + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x1b => { %ciCameraTemperature, + # decrement $varSize for missing byte after this tag with firmware 5.x and earlier + # (and add large offset to effectively abort processing if unknown firmware) + Hook => '$varSize += ($$self{CanonFirm} ? -1 : 0x10000) if $$self{CanonFirm} < 3', + }, + 0x23 => { %ciFocalLength, + Hook => q{ + $varSize -= 3 if $$self{CanonFirm} == 1; + $varSize -= 2 if $$self{CanonFirm} == 2; + $varSize += 6 if $$self{CanonFirm} >= 4; + }, + }, + 0x7d => { + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x8c => { + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0x8e => { + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + Hook => q{ + $varSize -= 4 if $$self{CanonFirm} < 3; + $varSize += 5 if $$self{CanonFirm} > 4; + }, + }, + 0xbc => { + Name => 'WhiteBalance', + Format => 'int16u', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0xc0 => { + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0xf4 => { + Name => 'PictureStyle', + Format => 'int8u', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0x153 => { + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x155 => { %ciMinFocal }, + 0x157 => { %ciMaxFocal, + Hook => '$varSize -= 8 if $$self{CanonFirm} < 3', + }, + 0x164 => { + Name => 'LensSerialNumber', + Format => 'undef[5]', + Priority => 0, + ValueConv => 'unpack("H*",$val)', + ValueConvInv => 'length($val) < 10 and $val = 0 x (10-length($val)) . $val; pack("H*",$val)', + }, + 0x23c => { + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + }, + # the 5DmkIII has "User setting1" and "User setting2" file naming options: + # - with "User setting1" 4 characters are selectable + # - with "User setting2", 3 characters are selectable, and the 4th character + # - in the file name corresponds to the image size: + # L=large, M=medium, S=small1, T=small2, U=small3, _=movie + # - as shipped, the first 4 characters of the file name are unique to the camera + 0x28c => { # used for file names like IMG_xxxx.JPG + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x290 => { # used for file names like 2F0Axxxx.JPG and 6T3Cxxxx.JPG + Name => 'FileIndex2', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x298 => { #(NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x29c => { #(NC) + Name => 'DirectoryIndex2', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x3b0 => { + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo2' }, + }, +); + +# Camera information for 6D (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo6D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + IS_SUBDIR => [ 0x3c6 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the EOS 6D.', + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x1b => { %ciCameraTemperature }, + 0x23 => { %ciFocalLength }, + 0x83 => { # (5DmkIII + 6) + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x92 => { # (5DmkIII + 6) + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0x94 => { # (5DmkIII + 6) + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0xc2 => { # (5DmkIII + 6) + Name => 'WhiteBalance', + Format => 'int16u', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0xc6 => { # (5DmkIII + 6) + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0xfa => { # (5DmkIII + 6) + Name => 'PictureStyle', + Format => 'int8u', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0x161 => { # (5DmkIII + 0x0e) + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x163 => { %ciMinFocal }, # (5DmkIII + 0x0e) + 0x165 => { %ciMaxFocal }, # (5DmkIII + 0x0e) + 0x256 => { # (5DmkIII + 0x1a) + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + }, + 0x2aa => { # (5DmkIII + 0x16 or 0x1e) + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x2b6 => { #(NC) (5DmkIII + 0x16 or 0x1e) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x3c6 => { # (5DmkIII + 0x16) + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo2' }, + }, +); + +# Camera information for 7D (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo7D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + DATAMEMBER => [ 0x00, 0x1e ], + IS_SUBDIR => [ 0x327 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + CameraInfo tags for the EOS 7D. Indices shown are for firmware versions + 1.0.x, but they may be different for other firmware versions. + }, + 0x00 => { + Name => 'FirmwareVersionLookAhead', + Hidden => 1, + # look ahead to check location of FirmwareVersion string + Format => 'undef[0x1b2]', + RawConv => q{ + my $t = substr($val, 0x1a8, 6); # 1 = firmware 3.7.5 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 1, return undef; + $t = substr($val, 0x1ac, 6); # 2 = firmware 1.0.7/1.0.8/1.1.0/1.2.1/1.2.2 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 2, return undef; + $self->Warn('Unrecognized CameraInfo7D firmware version'); + $$self{CanonFirm} = 0; + return undef; # not a real tag + }, + }, + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x07 => { + Name => 'HighlightTonePriority', + PrintConv => \%offOn, + }, + 0x08 => { #37 + Name => 'MeasuredEV2', + Description => 'Measured EV 2', + RawConv => '$val ? $val : undef', + ValueConv => '$val / 8 - 6', + ValueConvInv => 'int(($val + 6) * 8 + 0.5)', + }, + 0x09 => { #37 + Name => 'MeasuredEV', + Description => 'Measured EV', + RawConv => '$val ? $val : undef', + ValueConv => '$val / 8 - 6', + ValueConvInv => 'int(($val + 6) * 8 + 0.5)', + }, + 0x15 => { #PH (580 EX II) + Name => 'FlashMeteringMode', + PrintConv => { + 0 => 'E-TTL', + 3 => 'TTL', + 4 => 'External Auto', + 5 => 'External Manual', + 6 => 'Off', + }, + }, + 0x19 => { %ciCameraTemperature }, + 0x1e => { %ciFocalLength, + Hook => '$varSize += ($$self{CanonFirm} ? -4 : 0x10000) if $$self{CanonFirm} < 2', + }, + 0x35 => { + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x54 => { + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0x56 => { + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0x77 => { + Name => 'WhiteBalance', + Format => 'int16u', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0x7b => { + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0xaf => { + Name => 'CameraPictureStyle', + PrintHex => 1, + PrintConv => { + 0x81 => 'Standard', + 0x82 => 'Portrait', + 0x83 => 'Landscape', + 0x84 => 'Neutral', + 0x85 => 'Faithful', + 0x86 => 'Monochrome', + 0x21 => 'User Defined 1', + 0x22 => 'User Defined 2', + 0x23 => 'User Defined 3', + }, + }, + 0xc9 => { + Name => 'HighISONoiseReduction', + PrintConv => { + 0 => 'Standard', + 1 => 'Low', + 2 => 'Strong', + 3 => 'Off', + }, + }, + 0x112 => { + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x114 => { %ciMinFocal }, + 0x116 => { %ciMaxFocal }, + 0x1ac => { + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, # not writable for logic reasons + # some firmwares have a null instead of a space after the version number + RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef', + }, + 0x1eb => { + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x1f7 => { #(NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x327 => { #48 + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo' }, + }, +); + +# Canon camera information for 40D (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo40D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + IS_SUBDIR => [ 0x25b ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the EOS 40D.', + 0x03 => { %ciFNumber }, #PH + 0x04 => { %ciExposureTime }, #PH + 0x06 => { %ciISO }, #PH + 0x15 => { #PH (580 EX II) + Name => 'FlashMeteringMode', + PrintConv => { + 0 => 'E-TTL', + 3 => 'TTL', + 4 => 'External Auto', + 5 => 'External Manual', + 6 => 'Off', + }, + }, + 0x18 => { %ciCameraTemperature }, #36 + 0x1b => { %ciMacroMagnification }, #PH + 0x1d => { %ciFocalLength }, #PH + 0x30 => { #20 + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x43 => { #21/24 + Name => 'FocusDistanceUpper', + # this is very odd (little-endian number on odd boundary), + # but it does seem to work better with my sample images - PH + %focusDistanceByteSwap, + }, + 0x45 => { #21/24 + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0x6f => { #15 + Name => 'WhiteBalance', + Format => 'int16u', + PrintConv => \%canonWhiteBalance, + SeparateTable => 1, + }, + 0x73 => { #15 + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0xd6 => { #15 + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0xd8 => { %ciMinFocal }, #15 + 0xda => { %ciMaxFocal }, #15 + 0xff => { #15 + Name => 'FirmwareVersion', + Format => 'string[6]', + }, + 0x133 => { #27 + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + Notes => 'combined with DirectoryIndex to give the Composite FileNumber tag', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x13f => { #27 + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', # yes, minus (opposite to FileIndex) + ValueConvInv => '$val + 1', + }, + 0x25b => { + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo' }, + }, + 0x92b => { #33 + Name => 'LensModel', + Format => 'string[64]', + }, +); + +# Canon camera information for 50D (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo50D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + DATAMEMBER => [ 0x00, 0xee ], + IS_SUBDIR => [ 0x2d7 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + CameraInfo tags for the EOS 50D. Indices shown are for firmware versions + 1.0.x, but they may be different for other firmware versions. + }, + 0x00 => { + Name => 'FirmwareVersionLookAhead', + Hidden => 1, + # look ahead to check location of FirmwareVersion string + Format => 'undef[0x164]', + RawConv => q{ + my $t = substr($val, 0x15a, 6); # 1 = firmware 2.6.1 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 1, return undef; + $t = substr($val, 0x15e, 6); # 2 = firmware 2.9.1/3.1.1/1.0.2/1.0.3 + $t =~ /^\d+\.\d+\.\d+/ and $$self{CanonFirm} = 2, return undef; + $self->Warn('Unrecognized CameraInfo50D firmware version'); + $$self{CanonFirm} = 0; + return undef; # not a real tag + }, + }, + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x07 => { + Name => 'HighlightTonePriority', + PrintConv => \%offOn, + }, + 0x15 => { #PH (580 EX II) + Name => 'FlashMeteringMode', + PrintConv => { + 0 => 'E-TTL', + 3 => 'TTL', + 4 => 'External Auto', + 5 => 'External Manual', + 6 => 'Off', + }, + }, + 0x19 => { %ciCameraTemperature }, #36 + 0x1e => { %ciFocalLength }, + 0x31 => { + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x50 => { #33 + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0x52 => { #33 + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0x6f => { + Name => 'WhiteBalance', + Format => 'int16u', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0x73 => { #33 + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0xa7 => { + Name => 'PictureStyle', + Format => 'int8u', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0xbd => { + Name => 'HighISONoiseReduction', + PrintConv => { + 0 => 'Standard', + 1 => 'Low', + 2 => 'Strong', + 3 => 'Off', + }, + }, + 0xbf => { + Name => 'AutoLightingOptimizer', + PrintConv => { + 0 => 'Standard', + 1 => 'Low', + 2 => 'Strong', + 3 => 'Off', + }, + }, + 0xea => { #33 + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0xec => { %ciMinFocal }, + 0xee => { %ciMaxFocal, + Hook => '$varSize += ($$self{CanonFirm} ? -4 : 0x10000) if $$self{CanonFirm} < 2', + }, + 0x15e => { #33 + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + }, + 0x19b => { + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x1a7 => { #(NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x2d7 => { + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo' }, + }, +); + +# Canon camera information for 60D/1200D (MakerNotes tag 0x0d) (ref PH) +# NOTE: Can probably borrow more 50D tags here, possibly with an offset +%Image::ExifTool::Canon::CameraInfo60D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + IS_SUBDIR => [ 0x2f9, 0x321 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the EOS 60D and 1200D.', + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x19 => { %ciCameraTemperature }, + 0x1e => { %ciFocalLength }, + 0x36 => { + Name => 'CameraOrientation', + Condition => '$$self{Model} =~ /EOS 60D$/', #(NC) + Notes => '60D only', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x3a => { #IB + Name => 'CameraOrientation', + Condition => '$$self{Model} =~ /\b(1200D|REBEL T5|Kiss X70)\b/', + Notes => '1200D only', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x55 => { + Name => 'FocusDistanceUpper', + Condition => '$$self{Model} =~ /EOS 60D$/', + Notes => '60D only', + %focusDistanceByteSwap, + }, + 0x57 => { + Name => 'FocusDistanceLower', + Condition => '$$self{Model} =~ /EOS 60D$/', + Notes => '60D only', + %focusDistanceByteSwap, + }, + 0x7d => { + Name => 'ColorTemperature', + Condition => '$$self{Model} =~ /EOS 60D$/', + Notes => '60D only', + Format => 'int16u', + }, + 0xe8 => { + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0xea => { %ciMinFocal }, + 0xec => { %ciMaxFocal }, + 0x199 => { # (at this location for 60D firmware 2.8.1/1.0.5, and 1200D 3.3.1/1.0.0) + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + }, + 0x1d9 => { + Name => 'FileIndex', + Condition => '$$self{Model} =~ /EOS 60D$/', + Notes => '60D only', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x1e5 => { #(NC) + Name => 'DirectoryIndex', + Condition => '$$self{Model} =~ /EOS 60D$/', + Notes => '60D only', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x2f9 => { + Name => 'PictureStyleInfo', + Condition => '$$self{Model} =~ /\b(1200D|REBEL T5|Kiss X70)\b/', + Notes => '1200D', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo2' }, + }, + 0x321 => { + Name => 'PictureStyleInfo', + Condition => '$$self{Model} =~ /EOS 60D$/', + Notes => '60D', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo2' }, + }, +); + +# Canon camera information for 70D (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo70D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + IS_SUBDIR => [ 0x3cf ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the EOS 70D.', + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x1b => { %ciCameraTemperature }, + 0x23 => { %ciFocalLength }, + # 0x36 - focal length again? + 0x84 => { + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x93 => { + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0x95 => { + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0xc7 => { + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0x166 => { + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x168 => { %ciMinFocal }, + 0x16a => { %ciMaxFocal }, + 0x25e => { # (at this location for firmware 6.1.2, 1.0.4 and 1.1.1) + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + }, + 0x2b3 => { + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x2bf => { #(NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x3cf => { #48 + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo2' }, + }, +); + +# Canon camera information for 80D (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo80D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the EOS 80D.', + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x1b => { %ciCameraTemperature }, + 0x23 => { %ciFocalLength }, + 0x96 => { + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0xa5 => { + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0xa7 => { + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0x13a => { + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0x189 => { + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x18b => { %ciMinFocal }, + 0x18d => { %ciMaxFocal }, + 0x45a => { # (at this location for firmware 1.0.1) + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + }, + 0x4ae => { + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x4ba => { #(NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, +); + +# Canon camera information for 450D (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo450D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + IS_SUBDIR => [ 0x263 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the EOS 450D.', + 0x03 => { %ciFNumber }, #PH + 0x04 => { %ciExposureTime }, #PH + 0x06 => { %ciISO }, #PH + 0x15 => { #PH (580 EX II) + Name => 'FlashMeteringMode', + PrintConv => { + 0 => 'E-TTL', + 3 => 'TTL', + 4 => 'External Auto', + 5 => 'External Manual', + 6 => 'Off', + }, + }, + 0x18 => { %ciCameraTemperature }, #36 + 0x1b => { %ciMacroMagnification }, #PH + 0x1d => { %ciFocalLength }, #PH + 0x30 => { #20 + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x43 => { #20 + Name => 'FocusDistanceUpper', + # this is very odd (little-endian number on odd boundary), + # but it does seem to work better with my sample images - PH + %focusDistanceByteSwap, + }, + 0x45 => { #20 + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0x6f => { #PH + Name => 'WhiteBalance', + Format => 'int16u', + PrintConv => \%canonWhiteBalance, + SeparateTable => 1, + }, + 0x73 => { #PH + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0xde => { #33 + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x107 => { #PH + Name => 'FirmwareVersion', + Format => 'string[6]', + }, + 0x10f => { #20 + Name => 'OwnerName', + Format => 'string[32]', + }, + 0x133 => { #20 + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + }, + 0x13f => { #20 + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x263 => { #PH + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo' }, + }, + 0x933 => { #33 + Name => 'LensModel', + Format => 'string[64]', + }, +); + +# Canon camera information for 500D (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo500D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + IS_SUBDIR => [ 0x30b ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the EOS 500D.', + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x07 => { + Name => 'HighlightTonePriority', + PrintConv => \%offOn, + }, + 0x15 => { #PH (580 EX II) + Name => 'FlashMeteringMode', + PrintConv => { + 0 => 'E-TTL', + 3 => 'TTL', + 4 => 'External Auto', + 5 => 'External Manual', + 6 => 'Off', + }, + }, + 0x19 => { %ciCameraTemperature }, + 0x1e => { %ciFocalLength }, + 0x31 => { + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x50 => { + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0x52 => { + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0x73 => { # (50D + 4) + Name => 'WhiteBalance', + Format => 'int16u', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0x77 => { # (50D + 4) + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0xab => { # (50D + 4) + Name => 'PictureStyle', + Format => 'int8u', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0xbc => { + Name => 'HighISONoiseReduction', + PrintConv => { + 0 => 'Standard', + 1 => 'Low', + 2 => 'Strong', + 3 => 'Off', + }, + }, + 0xbe => { + Name => 'AutoLightingOptimizer', + PrintConv => { + 0 => 'Standard', + 1 => 'Low', + 2 => 'Strong', + 3 => 'Off', + }, + }, + 0xf6 => { + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0xf8 => { %ciMinFocal }, + 0xfa => { %ciMaxFocal }, + 0x190 => { + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef', + }, + 0x1d3 => { + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x1df => { #(NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x30b => { + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo' }, + }, +); + +# Canon camera information for 550D (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo550D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + IS_SUBDIR => [ 0x31c ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the EOS 550D.', + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x07 => { #(NC) + Name => 'HighlightTonePriority', + PrintConv => \%offOn, + }, + 0x15 => { #(NC) + Name => 'FlashMeteringMode', + PrintConv => { + 0 => 'E-TTL', + 3 => 'TTL', + 4 => 'External Auto', + 5 => 'External Manual', + 6 => 'Off', + }, + }, + 0x19 => { %ciCameraTemperature }, # (500D + 0) + 0x1e => { %ciFocalLength }, # (500D + 0) + 0x35 => { # (500D + 4) + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x54 => { # (500D + 4) + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0x56 => { # (500D + 4) + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0x78 => { # (500D + 5) (NC) + Name => 'WhiteBalance', + Format => 'int16u', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0x7c => { # (500D + 5) + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0xb0 => { # (500D + 5) + Name => 'PictureStyle', + Format => 'int8u', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0xff => { # (500D + 9) + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x101 => { %ciMinFocal }, # (500D + 9) + 0x103 => { %ciMaxFocal }, # (500D + 9) + 0x1a4 => { # (500D + 0x11) + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef', + }, + 0x1e4 => { # (500D + 0x11) + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x1f0 => { # (500D + 0x11) (NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x31c => { #48 + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo' }, + }, +); + +# Canon camera information for 600D and 1100D (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo600D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + IS_SUBDIR => [ 0x2fb ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the EOS 600D and 1100D.', + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x07 => { #(NC) + Name => 'HighlightTonePriority', + PrintConv => \%offOn, + }, + 0x15 => { #(NC) + Name => 'FlashMeteringMode', + PrintConv => { + 0 => 'E-TTL', + 3 => 'TTL', + 4 => 'External Auto', + 5 => 'External Manual', + 6 => 'Off', + }, + }, + 0x19 => { %ciCameraTemperature }, # (60D + 0) + 0x1e => { %ciFocalLength }, # (60D + 0) + 0x38 => { # (60D + 2) + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x57 => { # (60D + 2, 550D + 3) + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0x59 => { # (60D + 2, 550D + 3) + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0x7b => { # (550D + 3) + Name => 'WhiteBalance', + Format => 'int16u', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0x7f => { # (60D + 2, 550D + 3) + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0xb3 => { # (550D + 3) + Name => 'PictureStyle', + Format => 'int8u', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0xea => { # (60D + 2, 550D + 3) + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0xec => { %ciMinFocal }, # (60D + 2) + 0xee => { %ciMaxFocal }, # (60D + 2) + 0x19b => { # (60D + 2) + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef', + }, + 0x1db => { # (60D + 2) (NC) + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x1e7 => { # (60D + 2) (NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x2fb => { + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo2' }, + }, +); + +# Canon camera information for 650D/700D (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo650D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + IS_SUBDIR => [ 0x390 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the EOS 650D and 700D.', + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x1b => { %ciCameraTemperature }, # (1DX/5DmkIII + 0) + 0x23 => { %ciFocalLength }, # (1DX/5DmkIII + 3) + # 0x35 - seems to be the same as 0x54 + 0x7d => { # (1DX/5DmkIII + 3) + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x8c => { # (1DX + 3) + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0x8e => { # (1DX + 3) + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0xbc => { # (1DX + 7) + Name => 'WhiteBalance', + Format => 'int16u', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0xc0 => { # (1DX + 7) + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0xf4 => { # (1DX + 7) + Name => 'PictureStyle', + Format => 'int8u', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0x127 => { + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x129 => { %ciMinFocal }, + 0x12b => { %ciMaxFocal }, + 0x21b => { # (650D version 1.0.1) + Name => 'FirmwareVersion', + Condition => '$$self{Model} =~ /(650D|REBEL T4i|Kiss X6i)\b/', + Notes => '650D', + Format => 'string[6]', + Writable => 0, + RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef', + }, + 0x220 => { # (700D version 1.1.1/2.1.1) + Name => 'FirmwareVersion', + Condition => '$$self{Model} =~ /(700D|REBEL T5i|Kiss X7i)\b/', + Notes => '700D', + Format => 'string[6]', + Writable => 0, + RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef', + }, + 0x270 => { #(NC) + Name => 'FileIndex', + Condition => '$$self{Model} =~ /(650D|REBEL T4i|Kiss X6i)\b/', + Notes => '650D', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x274 => { #(NC) + Name => 'FileIndex', + Condition => '$$self{Model} =~ /(700D|REBEL T5i|Kiss X7i)\b/', + Notes => '700D', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x27c => { #(NC) + Name => 'DirectoryIndex', + Condition => '$$self{Model} =~ /(650D|REBEL T4i|Kiss X6i)\b/', + Notes => '650D', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x280 => { #(NC) + Name => 'DirectoryIndex', + Condition => '$$self{Model} =~ /(700D|REBEL T5i|Kiss X7i)\b/', + Notes => '700D', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val - 1', + ValueConvInv => '$val + 1', + }, + 0x390 => { + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo2' }, + }, +); + +# Canon camera information for 750D/760D (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo750D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the EOS 750D and 760D.', + 0x03 => { %ciFNumber }, + 0x04 => { %ciExposureTime }, + 0x06 => { %ciISO }, + 0x1b => { %ciCameraTemperature }, # (700D + 0) + 0x23 => { %ciFocalLength }, # (700D + 0) + 0x96 => { #IB (700D + 0x19) + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0xa5 => { # (700D + 0x19) + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0xa7 => { # (700D + 0x19) + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0x131 => { # (700D + 0x19) + Name => 'WhiteBalance', + Format => 'int16u', + SeparateTable => 1, + PrintConv => \%canonWhiteBalance, + }, + 0x135 => { + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0x169 => { + Name => 'PictureStyle', + Format => 'int8u', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 0x184 => { + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0x186 => { %ciMinFocal }, + 0x188 => { %ciMaxFocal }, + 0x43d => { # (750D/760D firmware 6.7.2) + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef', + }, + 0x449 => { # (750D/760D firmware 1.0.0) + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef', + }, +); + +# Canon camera information for 1000D (MakerNotes tag 0x0d) (ref PH) +%Image::ExifTool::Canon::CameraInfo1000D = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + PRIORITY => 0, + IS_SUBDIR => [ 0x267 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'CameraInfo tags for the EOS 1000D.', + 0x03 => { %ciFNumber }, #PH + 0x04 => { %ciExposureTime }, #PH + 0x06 => { %ciISO }, #PH + 0x15 => { #PH (580 EX II) + Name => 'FlashMeteringMode', + PrintConv => { + 0 => 'E-TTL', + 3 => 'TTL', + 4 => 'External Auto', + 5 => 'External Manual', + 6 => 'Off', + }, + }, + 0x18 => { %ciCameraTemperature }, #36 + 0x1b => { %ciMacroMagnification }, #PH (NC) + 0x1d => { %ciFocalLength }, #PH + 0x30 => { #20 + Name => 'CameraOrientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + 0x43 => { #20 + Name => 'FocusDistanceUpper', + %focusDistanceByteSwap, + }, + 0x45 => { #20 + Name => 'FocusDistanceLower', + %focusDistanceByteSwap, + }, + 0x6f => { #PH + Name => 'WhiteBalance', + Format => 'int16u', + PrintConv => \%canonWhiteBalance, + SeparateTable => 1, + }, + 0x73 => { #PH + Name => 'ColorTemperature', + Format => 'int16u', + }, + 0xe2 => { #PH + Name => 'LensType', + Format => 'int16uRev', # value is big-endian + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%canonLensTypes, + }, + 0xe4 => { %ciMinFocal }, #PH + 0xe6 => { %ciMaxFocal }, #PH + 0x10b => { #PH + Name => 'FirmwareVersion', + Format => 'string[6]', + }, + 0x137 => { #PH (NC) + Name => 'DirectoryIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + }, + 0x143 => { #PH + Name => 'FileIndex', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x267 => { #PH + Name => 'PictureStyleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::PSInfo' }, + }, + 0x937 => { #PH + Name => 'LensModel', + Format => 'string[64]', + }, +); + +# Canon camera information for PowerShot models (MakerNotes tag 0x0d) - PH +%Image::ExifTool::Canon::CameraInfoPowerShot = ( + %binaryDataAttrs, + FORMAT => 'int32s', + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + CameraInfo tags for PowerShot models such as the A450, A460, A550, A560, + A570, A630, A640, A650, A710, A720, G7, G9, S5, SD40, SD750, SD800, SD850, + SD870, SD900, SD950, SD1000, SX100 and TX1. + }, + 0x00 => { + Name => 'ISO', + Groups => { 2 => 'Image' }, + ValueConv => '100*exp((($val-411)/96)*log(2))', + ValueConvInv => 'log($val/100)/log(2)*96+411', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 0x05 => { + Name => 'FNumber', + Groups => { 2 => 'Image' }, + ValueConv => 'exp($val/192*log(2))', + ValueConvInv => 'log($val)*192/log(2)', + PrintConv => 'sprintf("%.2g",$val)', + PrintConvInv => '$val', + }, + 0x06 => { + Name => 'ExposureTime', + Groups => { 2 => 'Image' }, + ValueConv => 'exp(-$val/96*log(2))', + ValueConvInv => '-log($val)*96/log(2)', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x17 => 'Rotation', # usually the same as Orientation (but not always! why?) + # 0x25 - flash fired/not fired (ref 37) + # 0x26 - related to flash mode? (ref 37) + # 0x37 - related to flash strength (ref 37) + # 0x38 - pre-flash fired/no fired or flash data collection (ref 37) + 135 => { # [-3] <-- index relative to CameraInfoCount + Name => 'CameraTemperature', + Condition => '$$self{CameraInfoCount} == 138', + Notes => 'A450, A460, A550, A630, A640 and A710', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 145 => { #37 [-3] + Name => 'CameraTemperature', + Condition => '$$self{CameraInfoCount} == 148', + Notes => q{ + A560, A570, A650, A720, G7, G9, S5, SD40, SD750, SD800, SD850, SD870, SD900, + SD950, SD1000, SX100 and TX1 + }, + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, +); + +# Canon camera information for some PowerShot models (MakerNotes tag 0x0d) - PH +%Image::ExifTool::Canon::CameraInfoPowerShot2 = ( + %binaryDataAttrs, + FORMAT => 'int32s', + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + CameraInfo tags for PowerShot models such as the A470, A480, A490, A495, + A580, A590, A1000, A1100, A2000, A2100, A3000, A3100, D10, E1, G10, G11, + S90, S95, SD770, SD780, SD790, SD880, SD890, SD940, SD960, SD970, SD980, + SD990, SD1100, SD1200, SD1300, SD1400, SD3500, SD4000, SD4500, SX1, SX10, + SX20, SX110, SX120, SX130, SX200 and SX210. + }, + 0x01 => { + Name => 'ISO', + Groups => { 2 => 'Image' }, + ValueConv => '100*exp((($val-411)/96)*log(2))', + ValueConvInv => 'log($val/100)/log(2)*96+411', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 0x06 => { + Name => 'FNumber', + Groups => { 2 => 'Image' }, + ValueConv => 'exp($val/192*log(2))', + ValueConvInv => 'log($val)*192/log(2)', + PrintConv => 'sprintf("%.2g",$val)', + PrintConvInv => '$val', + }, + 0x07 => { + Name => 'ExposureTime', + Groups => { 2 => 'Image' }, + ValueConv => 'exp(-$val/96*log(2))', + ValueConvInv => '-log($val)*96/log(2)', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x18 => 'Rotation', + 153 => { # [-3] <-- index relative to CameraInfoCount + Name => 'CameraTemperature', + Condition => '$$self{CameraInfoCount} == 156', + Notes => 'A470, A580, A590, SD770, SD790, SD890 and SD1100', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 159 => { # [-3] + Name => 'CameraTemperature', + Condition => '$$self{CameraInfoCount} == 162', + Notes => 'A1000, A2000, E1, G10, SD880, SD990, SX1, SX10 and SX110', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 164 => { # [-3] + Name => 'CameraTemperature', + Condition => '$$self{CameraInfoCount} == 167', + Notes => 'A480, A1100, A2100, D10, SD780, SD960, SD970, SD1200 and SX200', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 168 => { # [-3] + Name => 'CameraTemperature', + Condition => '$$self{CameraInfoCount} == 171', + Notes => q{ + A490, A495, A3000, A3100, G11, S90, SD940, SD980, SD1300, SD1400, SD3500, + SD4000, SX20, SX120 and SX210 + }, + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 261 => { # [-3] + Name => 'CameraTemperature', + Condition => '$$self{CameraInfoCount} == 264', + Notes => 'S95, SD4500 and SX130', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, +); + +# unknown Canon camera information (MakerNotes tag 0x0d) - PH +%Image::ExifTool::Canon::CameraInfoUnknown32 = ( + %binaryDataAttrs, + FORMAT => 'int32s', + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Unknown CameraInfo tags are divided into 3 tables based on format size.', + # This tag may be uncommented, and is useful for generating + # lists of models in the "Notes" below... + # 0 => { + # Name => 'CameraInfoCount', + # ValueConv => '$$self{CameraInfoCount}', + # }, + 71 => { # [-1] <-- index relative to CameraInfoCount + Name => 'CameraTemperature', + Condition => '$$self{CameraInfoCount} == 72', + Notes => 'S1', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 83 => { # [-2] + Name => 'CameraTemperature', + Condition => '$$self{CameraInfoCount} == 85', + Notes => 'S2', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 91 => { # [-2 or -3] + Name => 'CameraTemperature', + Condition => '$$self{CameraInfoCount} == 93 or $$self{CameraInfoCount} == 94', + Notes => 'A410, A610, A620, S80, SD30, SD400, SD430, SD450, SD500 and SD550', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 92 => { # [-4] + Name => 'CameraTemperature', + Condition => '$$self{CameraInfoCount} == 96', + Notes => 'S3', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 100 => { # [-4] + Name => 'CameraTemperature', + Condition => '$$self{CameraInfoCount} == 104', + Notes => 'A420, A430, A530, A540, A700, SD600, SD630 and SD700', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + -3 => { + Name => 'CameraTemperature', + Condition => '$$self{CameraInfoCount} > 400', + Notes => '3 entries from end of record for most newer camera models', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, +# 466 => { # [-3] +# Name => 'CameraTemperature', +# Condition => '$$self{CameraInfoCount} == 469', +# Notes => '100HS, 300HS, 500HS, A1200, A2200, A3200 and A3300', +# PrintConv => '"$val C"', +# PrintConvInv => '$val=~s/ ?C//; $val', +# }, +# 503 => { # [-3] +# Name => 'CameraTemperature', +# Condition => '$$self{CameraInfoCount} == 506', +# Notes => 'A800', +# PrintConv => '"$val C"', +# PrintConvInv => '$val=~s/ ?C//; $val', +# }, +# 506 => { # [-3] +# Name => 'CameraTemperature', +# Condition => '$$self{CameraInfoCount} == 509', +# Notes => 'SX230HS', +# PrintConv => '"$val C"', +# PrintConvInv => '$val=~s/ ?C//; $val', +# }, +# 520 => { # [-3] +# Name => 'CameraTemperature', +# Condition => '$$self{CameraInfoCount} == 523', +# Notes => '310HS, 510HS, G1X, S100 (new), SX40HS and SX150', +# PrintConv => '"$val C"', +# PrintConvInv => '$val=~s/ ?C//; $val', +# }, +# 524 => { # [-3] +# Name => 'CameraTemperature', +# Condition => '$$self{CameraInfoCount} == 527', +# Notes => '110HS, 520HS, A2300, A2400, A3400, A4000, D20 and SX260HS', +# PrintConv => '"$val C"', +# PrintConvInv => '$val=~s/ ?C//; $val', +# }, +# 532 => { # [-3] +# Name => 'CameraTemperature', +# Condition => '$$self{CameraInfoCount} == 535', +# Notes => 'S110 (new), G15, SX50, SX160IS and SX500IS', +# PrintConv => '"$val C"', +# PrintConvInv => '$val=~s/ ?C//; $val', +# }, +# 547 => { # [-3] +# Name => 'CameraTemperature', +# Condition => '$$self{CameraInfoCount} == 550', +# Notes => '130IS, A1400, A2500 and A2600', +# PrintConv => '"$val C"', +# PrintConvInv => '$val=~s/ ?C//; $val', +# }, +# 549 => { # [-3] +# Name => 'CameraTemperature', +# Condition => '$$self{CameraInfoCount} == 552', +# Notes => '115IS, 130IS, SX270, SX280, 330HS and A3500', +# PrintConv => '"$val C"', +# PrintConvInv => '$val=~s/ ?C//; $val', +# }, +# 552 => { # [-3] +# Name => 'CameraTemperature', +# Condition => '$$self{CameraInfoCount} == 555', +# Notes => 'S200 (new)', +# PrintConv => '"$val C"', +# PrintConvInv => '$val=~s/ ?C//; $val', +# }, +# 850 => { # [-3] +# Name => 'CameraTemperature', +# Condition => '$$self{CameraInfoCount} == 853', +# Notes => 'N', +# PrintConv => '"$val C"', +# PrintConvInv => '$val=~s/ ?C//; $val', +# }, +# 895 => { # [-3] +# Name => 'CameraTemperature', +# Condition => '$$self{CameraInfoCount} == 898', +# Notes => 'G1XmkII, N100, SX600HS and SX700HS', +# PrintConv => '"$val C"', +# PrintConvInv => '$val=~s/ ?C//; $val', +# }, +); + +# unknown Canon camera information (MakerNotes tag 0x0d) - PH +%Image::ExifTool::Canon::CameraInfoUnknown16 = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, +); + +# unknown Canon camera information (MakerNotes tag 0x0d) - PH +%Image::ExifTool::Canon::CameraInfoUnknown = ( + %binaryDataAttrs, + FORMAT => 'int8s', + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x16b => { + Name => 'LensSerialNumber', + Condition => '$$self{Model} =~ /^Canon EOS 5DS/', # (good for 5DS and 5DSR) + Format => 'undef[5]', + Priority => 0, + ValueConv => 'unpack("H*",$val)', + ValueConvInv => 'length($val) < 10 and $val = 0 x (10-length($val)) . $val; pack("H*",$val)', + }, + 0x5c1 => { + Name => 'FirmwareVersion', + Format => 'string[6]', + Writable => 0, + Condition => '$$valPt =~ /^\d\.\d\.\d\0/', + Notes => 'M50', # (firmware 1.0.0) + }, +); + +# Picture Style information for various cameras (ref 48) +%Image::ExifTool::Canon::PSInfo = ( + %binaryDataAttrs, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom picture style information for various models.', + # (values expected to be "n/a" are flagged as Unknown) + 0x00 => { Name => 'ContrastStandard', %psInfo }, + 0x04 => { Name => 'SharpnessStandard', %psInfo }, + 0x08 => { Name => 'SaturationStandard', %psInfo }, + 0x0c => { Name => 'ColorToneStandard', %psInfo }, + 0x10 => { Name => 'FilterEffectStandard', %psInfo, Unknown => 1 }, + 0x14 => { Name => 'ToningEffectStandard', %psInfo, Unknown => 1 }, + 0x18 => { Name => 'ContrastPortrait', %psInfo }, + 0x1c => { Name => 'SharpnessPortrait', %psInfo }, + 0x20 => { Name => 'SaturationPortrait', %psInfo }, + 0x24 => { Name => 'ColorTonePortrait', %psInfo }, + 0x28 => { Name => 'FilterEffectPortrait', %psInfo, Unknown => 1 }, + 0x2c => { Name => 'ToningEffectPortrait', %psInfo, Unknown => 1 }, + 0x30 => { Name => 'ContrastLandscape', %psInfo }, + 0x34 => { Name => 'SharpnessLandscape', %psInfo }, + 0x38 => { Name => 'SaturationLandscape', %psInfo }, + 0x3c => { Name => 'ColorToneLandscape', %psInfo }, + 0x40 => { Name => 'FilterEffectLandscape', %psInfo, Unknown => 1 }, + 0x44 => { Name => 'ToningEffectLandscape', %psInfo, Unknown => 1 }, + 0x48 => { Name => 'ContrastNeutral', %psInfo }, + 0x4c => { Name => 'SharpnessNeutral', %psInfo }, + 0x50 => { Name => 'SaturationNeutral', %psInfo }, + 0x54 => { Name => 'ColorToneNeutral', %psInfo }, + 0x58 => { Name => 'FilterEffectNeutral', %psInfo, Unknown => 1 }, + 0x5c => { Name => 'ToningEffectNeutral', %psInfo, Unknown => 1 }, + 0x60 => { Name => 'ContrastFaithful', %psInfo }, + 0x64 => { Name => 'SharpnessFaithful', %psInfo }, + 0x68 => { Name => 'SaturationFaithful', %psInfo }, + 0x6c => { Name => 'ColorToneFaithful', %psInfo }, + 0x70 => { Name => 'FilterEffectFaithful', %psInfo, Unknown => 1 }, + 0x74 => { Name => 'ToningEffectFaithful', %psInfo, Unknown => 1 }, + 0x78 => { Name => 'ContrastMonochrome', %psInfo }, + 0x7c => { Name => 'SharpnessMonochrome', %psInfo }, + 0x80 => { Name => 'SaturationMonochrome', %psInfo, Unknown => 1 }, + 0x84 => { Name => 'ColorToneMonochrome', %psInfo, Unknown => 1 }, + 0x88 => { Name => 'FilterEffectMonochrome',%psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Yellow', + 2 => 'Orange', + 3 => 'Red', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0x8c => { Name => 'ToningEffectMonochrome',%psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Sepia', + 2 => 'Blue', + 3 => 'Purple', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0x90 => { Name => 'ContrastUserDef1', %psInfo }, + 0x94 => { Name => 'SharpnessUserDef1', %psInfo }, + 0x98 => { Name => 'SaturationUserDef1', %psInfo }, + 0x9c => { Name => 'ColorToneUserDef1', %psInfo }, + 0xa0 => { Name => 'FilterEffectUserDef1', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Yellow', + 2 => 'Orange', + 3 => 'Red', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0xa4 => { Name => 'ToningEffectUserDef1', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Sepia', + 2 => 'Blue', + 3 => 'Purple', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0xa8 => { Name => 'ContrastUserDef2', %psInfo }, + 0xac => { Name => 'SharpnessUserDef2', %psInfo }, + 0xb0 => { Name => 'SaturationUserDef2', %psInfo }, + 0xb4 => { Name => 'ColorToneUserDef2', %psInfo }, + 0xb8 => { Name => 'FilterEffectUserDef2', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Yellow', + 2 => 'Orange', + 3 => 'Red', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0xbc => { Name => 'ToningEffectUserDef2', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Sepia', + 2 => 'Blue', + 3 => 'Purple', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0xc0 => { Name => 'ContrastUserDef3', %psInfo }, + 0xc4 => { Name => 'SharpnessUserDef3', %psInfo }, + 0xc8 => { Name => 'SaturationUserDef3', %psInfo }, + 0xcc => { Name => 'ColorToneUserDef3', %psInfo }, + 0xd0 => { Name => 'FilterEffectUserDef3', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Yellow', + 2 => 'Orange', + 3 => 'Red', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0xd4 => { Name => 'ToningEffectUserDef3', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Sepia', + 2 => 'Blue', + 3 => 'Purple', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + # base picture style names: + 0xd8 => { + Name => 'UserDef1PictureStyle', + Format => 'int16u', + SeparateTable => 'UserDefStyle', + PrintConv => \%userDefStyles, + }, + 0xda => { + Name => 'UserDef2PictureStyle', + Format => 'int16u', + SeparateTable => 'UserDefStyle', + PrintConv => \%userDefStyles, + }, + 0xdc => { + Name => 'UserDef3PictureStyle', + Format => 'int16u', + SeparateTable => 'UserDefStyle', + PrintConv => \%userDefStyles, + }, +); + +# Picture Style information for the 60D, etc (ref 48) +%Image::ExifTool::Canon::PSInfo2 = ( + %binaryDataAttrs, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom picture style information for the EOS 5DmkIII, 60D, 600D and 1100D.', + # (values expected to be "n/a" are flagged as Unknown) + 0x00 => { Name => 'ContrastStandard', %psInfo }, + 0x04 => { Name => 'SharpnessStandard', %psInfo }, + 0x08 => { Name => 'SaturationStandard', %psInfo }, + 0x0c => { Name => 'ColorToneStandard', %psInfo }, + 0x10 => { Name => 'FilterEffectStandard', %psInfo, Unknown => 1 }, + 0x14 => { Name => 'ToningEffectStandard', %psInfo, Unknown => 1 }, + 0x18 => { Name => 'ContrastPortrait', %psInfo }, + 0x1c => { Name => 'SharpnessPortrait', %psInfo }, + 0x20 => { Name => 'SaturationPortrait', %psInfo }, + 0x24 => { Name => 'ColorTonePortrait', %psInfo }, + 0x28 => { Name => 'FilterEffectPortrait', %psInfo, Unknown => 1 }, + 0x2c => { Name => 'ToningEffectPortrait', %psInfo, Unknown => 1 }, + 0x30 => { Name => 'ContrastLandscape', %psInfo }, + 0x34 => { Name => 'SharpnessLandscape', %psInfo }, + 0x38 => { Name => 'SaturationLandscape', %psInfo }, + 0x3c => { Name => 'ColorToneLandscape', %psInfo }, + 0x40 => { Name => 'FilterEffectLandscape', %psInfo, Unknown => 1 }, + 0x44 => { Name => 'ToningEffectLandscape', %psInfo, Unknown => 1 }, + 0x48 => { Name => 'ContrastNeutral', %psInfo }, + 0x4c => { Name => 'SharpnessNeutral', %psInfo }, + 0x50 => { Name => 'SaturationNeutral', %psInfo }, + 0x54 => { Name => 'ColorToneNeutral', %psInfo }, + 0x58 => { Name => 'FilterEffectNeutral', %psInfo, Unknown => 1 }, + 0x5c => { Name => 'ToningEffectNeutral', %psInfo, Unknown => 1 }, + 0x60 => { Name => 'ContrastFaithful', %psInfo }, + 0x64 => { Name => 'SharpnessFaithful', %psInfo }, + 0x68 => { Name => 'SaturationFaithful', %psInfo }, + 0x6c => { Name => 'ColorToneFaithful', %psInfo }, + 0x70 => { Name => 'FilterEffectFaithful', %psInfo, Unknown => 1 }, + 0x74 => { Name => 'ToningEffectFaithful', %psInfo, Unknown => 1 }, + 0x78 => { Name => 'ContrastMonochrome', %psInfo }, + 0x7c => { Name => 'SharpnessMonochrome', %psInfo }, + 0x80 => { Name => 'SaturationMonochrome', %psInfo, Unknown => 1 }, + 0x84 => { Name => 'ColorToneMonochrome', %psInfo, Unknown => 1 }, + 0x88 => { Name => 'FilterEffectMonochrome',%psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Yellow', + 2 => 'Orange', + 3 => 'Red', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0x8c => { Name => 'ToningEffectMonochrome',%psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Sepia', + 2 => 'Blue', + 3 => 'Purple', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0x90 => { Name => 'ContrastAuto', %psInfo }, + 0x94 => { Name => 'SharpnessAuto', %psInfo }, + 0x98 => { Name => 'SaturationAuto', %psInfo }, + 0x9c => { Name => 'ColorToneAuto', %psInfo }, + 0xa0 => { Name => 'FilterEffectAuto', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Yellow', + 2 => 'Orange', + 3 => 'Red', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0xa4 => { Name => 'ToningEffectAuto', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Sepia', + 2 => 'Blue', + 3 => 'Purple', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0xa8 => { Name => 'ContrastUserDef1', %psInfo }, + 0xac => { Name => 'SharpnessUserDef1', %psInfo }, + 0xb0 => { Name => 'SaturationUserDef1', %psInfo }, + 0xb4 => { Name => 'ColorToneUserDef1', %psInfo }, + 0xb8 => { Name => 'FilterEffectUserDef1', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Yellow', + 2 => 'Orange', + 3 => 'Red', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0xbc => { Name => 'ToningEffectUserDef1', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Sepia', + 2 => 'Blue', + 3 => 'Purple', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0xc0 => { Name => 'ContrastUserDef2', %psInfo }, + 0xc4 => { Name => 'SharpnessUserDef2', %psInfo }, + 0xc8 => { Name => 'SaturationUserDef2', %psInfo }, + 0xcc => { Name => 'ColorToneUserDef2', %psInfo }, + 0xd0 => { Name => 'FilterEffectUserDef2', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Yellow', + 2 => 'Orange', + 3 => 'Red', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0xd4 => { Name => 'ToningEffectUserDef2', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Sepia', + 2 => 'Blue', + 3 => 'Purple', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0xd8 => { Name => 'ContrastUserDef3', %psInfo }, + 0xdc => { Name => 'SharpnessUserDef3', %psInfo }, + 0xe0 => { Name => 'SaturationUserDef3', %psInfo }, + 0xe4 => { Name => 'ColorToneUserDef3', %psInfo }, + 0xe8 => { Name => 'FilterEffectUserDef3', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Yellow', + 2 => 'Orange', + 3 => 'Red', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + 0xec => { Name => 'ToningEffectUserDef3', %psInfo, + PrintConv => { + 0 => 'None', + 1 => 'Sepia', + 2 => 'Blue', + 3 => 'Purple', + 4 => 'Green', + -559038737 => 'n/a', # (0xdeadbeef) + }, + }, + # base picture style names: + 0xf0 => { + Name => 'UserDef1PictureStyle', + Format => 'int16u', + SeparateTable => 'UserDefStyle', + PrintConv => \%userDefStyles, + }, + 0xf2 => { + Name => 'UserDef2PictureStyle', + Format => 'int16u', + SeparateTable => 'UserDefStyle', + PrintConv => \%userDefStyles, + }, + 0xf4 => { + Name => 'UserDef3PictureStyle', + Format => 'int16u', + SeparateTable => 'UserDefStyle', + PrintConv => \%userDefStyles, + }, +); + +# Movie information (MakerNotes tag 0x11) (ref PH) +%Image::ExifTool::Canon::MovieInfo = ( + %binaryDataAttrs, + FORMAT => 'int16u', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Video' }, + NOTES => 'Tags written by some Canon cameras when recording video.', + 1 => { # (older PowerShot AVI) + Name => 'FrameRate', + RawConv => '$val == 65535 ? undef: $val', + ValueConvInv => '$val > 65535 ? 65535 : $val', + }, + 2 => { # (older PowerShot AVI) + Name => 'FrameCount', + RawConv => '$val == 65535 ? undef: $val', + ValueConvInv => '$val > 65535 ? 65535 : $val', + }, + # 3 - values: 0x0001 (older PowerShot AVI), 0x4004, 0x4005 + 4 => { + Name => 'FrameCount', + Format => 'int32u', + }, + 6 => { + Name => 'FrameRate', + Format => 'rational32u', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + PrintConvInv => '$val', + }, + # 9/10 - same as 6/7 (FrameRate) + 106 => { + Name => 'Duration', + Format => 'int32u', + ValueConv => '$val / 1000', + ValueConvInv => '$val * 1000', + PrintConv => 'ConvertDuration($val)', + PrintConvInv => q{ + my @a = ($val =~ /\d+(?:\.\d*)?/g); + $val = pop(@a) || 0; # seconds + $val += pop(@a) * 60 if @a; # minutes + $val += pop(@a) * 3600 if @a; # hours + return $val; + }, + }, + 108 => { + Name => 'AudioBitrate', + Groups => { 2 => 'Audio' }, + Format => 'int32u', + PrintConv => 'ConvertBitrate($val)', + PrintConvInv => q{ + $val =~ /^(\d+(?:\.\d*)?) ?([kMG]?bps)?$/ or return undef; + return $1 * {bps=>1,kbps=>1000,Mbps=>1000000,Gbps=>1000000000}->{$2 || 'bps'}; + }, + }, + 110 => { + Name => 'AudioSampleRate', + Groups => { 2 => 'Audio' }, + Format => 'int32u', + }, + 112 => { # (guess) + Name => 'AudioChannels', + Groups => { 2 => 'Audio' }, + Format => 'int32u', + }, + # 114 - values: 0 (60D), 1 (S95) + 116 => { + Name => 'VideoCodec', + Format => 'undef[4]', + # swap bytes if little endian + RawConv => 'GetByteOrder() eq "MM" ? $val : pack("N",unpack("V",$val))', + RawConvInv => 'GetByteOrder() eq "MM" ? $val : pack("N",unpack("V",$val))', + }, + # 125 - same as 10 +); + +# AF information (MakerNotes tag 0x12) - PH +%Image::ExifTool::Canon::AFInfo = ( + PROCESS_PROC => \&ProcessSerialData, + VARS => { ID_LABEL => 'Sequence' }, + FORMAT => 'int16u', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + Auto-focus information used by many older Canon models. The values in this + record are sequential, and some have variable sizes based on the value of + NumAFPoints (which may be 1,5,7,9,15,45 or 53). The AFArea coordinates are + given in a system where the image has dimensions given by AFImageWidth and + AFImageHeight, and 0,0 is the image center. The direction of the Y axis + depends on the camera model, with positive Y upwards for EOS models, but + apparently downwards for PowerShot models. + }, + 0 => { + Name => 'NumAFPoints', + }, + 1 => { + Name => 'ValidAFPoints', + Notes => 'number of AF points valid in the following information', + }, + 2 => { + Name => 'CanonImageWidth', + Groups => { 2 => 'Image' }, + }, + 3 => { + Name => 'CanonImageHeight', + Groups => { 2 => 'Image' }, + }, + 4 => { + Name => 'AFImageWidth', + Notes => 'size of image in AF coordinates', + }, + 5 => 'AFImageHeight', + 6 => 'AFAreaWidth', + 7 => 'AFAreaHeight', + 8 => { + Name => 'AFAreaXPositions', + Format => 'int16s[$val{0}]', + }, + 9 => { + Name => 'AFAreaYPositions', + Format => 'int16s[$val{0}]', + }, + 10 => { + Name => 'AFPointsInFocus', + Format => 'int16s[int(($val{0}+15)/16)]', + PrintConv => 'Image::ExifTool::DecodeBits($val, undef, 16)', + }, + 11 => [ + { + Name => 'PrimaryAFPoint', + Condition => q{ + $$self{Model} !~ /EOS/ and + (not $$self{AFInfoCount} or $$self{AFInfoCount} != 36) + }, + }, + { + # (some PowerShot 9-point systems put PrimaryAFPoint after 8 unknown values) + Name => 'Canon_AFInfo_0x000b', + Condition => '$$self{Model} !~ /EOS/', + Format => 'int16u[8]', + Unknown => 1, + }, + # (serial processing stops here for EOS cameras) + ], + 12 => 'PrimaryAFPoint', +); + +# newer AF information (MakerNotes tag 0x26 and 0x32) - PH (A570IS,1DmkIII,40D and G1XmkII) +# (Note: this tag is out of sequence in A570IS maker notes) +%Image::ExifTool::Canon::AFInfo2 = ( + PROCESS_PROC => \&ProcessSerialData, + VARS => { ID_LABEL => 'Sequence' }, + FORMAT => 'int16u', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + Newer version of the AFInfo record containing much of the same information + (and coordinate confusion) as the older version. In this record, NumAFPoints + may be 7, 9, 11, 19, 31, 45 or 61, depending on the camera model. + }, + 0 => { + Name => 'AFInfoSize', + Unknown => 1, # normally don't print this out + }, + 1 => { + Name => 'AFAreaMode', + PrintConv => { + 0 => 'Off (Manual Focus)', + 1 => 'AF Point Expansion (surround)', #PH + 2 => 'Single-point AF', + # 3 - n/a + 4 => 'Auto', #forum6237 (AiAF on A570IS) + 5 => 'Face Detect AF', + 6 => 'Face + Tracking', #PH (NC, EOS M, live view) + 7 => 'Zone AF', #46 + 8 => 'AF Point Expansion (4 point)', #46/PH/forum6237 + 9 => 'Spot AF', #46 + 10 => 'AF Point Expansion (8 point)', #forum6237 + 11 => 'Flexizone Multi (49 point)', #PH (NC, EOS M, live view; 750D 49 points) + 12 => 'Flexizone Multi (9 point)', #PH (750D, 9 points) + 13 => 'Flexizone Single', #PH (EOS M default, live view) + 14 => 'Large Zone AF', #PH/forum6237 (7DmkII) + }, + }, + 2 => { + Name => 'NumAFPoints', + RawConv => '$$self{NumAFPoints} = $val', # save for later + }, + 3 => { + Name => 'ValidAFPoints', + Notes => 'number of AF points valid in the following information', + }, + 4 => { + Name => 'CanonImageWidth', + Groups => { 2 => 'Image' }, + }, + 5 => { + Name => 'CanonImageHeight', + Groups => { 2 => 'Image' }, + }, + 6 => { + Name => 'AFImageWidth', + Notes => 'size of image in AF coordinates', + }, + 7 => 'AFImageHeight', + 8 => { + Name => 'AFAreaWidths', + Format => 'int16s[$val{2}]', + }, + 9 => { + Name => 'AFAreaHeights', + Format => 'int16s[$val{2}]', + }, + 10 => { + Name => 'AFAreaXPositions', + Format => 'int16s[$val{2}]', + }, + 11 => { + Name => 'AFAreaYPositions', + Format => 'int16s[$val{2}]', + }, + 12 => { + Name => 'AFPointsInFocus', + Format => 'int16s[int(($val{2}+15)/16)]', + PrintConv => 'Image::ExifTool::DecodeBits($val, undef, 16)', + }, + 13 => [ + { + Name => 'AFPointsSelected', + Condition => '$$self{Model} =~ /EOS/', + Format => 'int16s[int(($val{2}+15)/16)]', + PrintConv => 'Image::ExifTool::DecodeBits($val, undef, 16)', + }, + { + Name => 'Canon_AFInfo2_0x000d', + Format => 'int16s[int(($val{2}+15)/16)+1]', + Unknown => 1, + }, + ], + 14 => { + # usually, but not always, the lowest number AF point in focus + Name => 'PrimaryAFPoint', + Condition => '$$self{Model} !~ /EOS/ and not $$self{AFInfo3}', # (not valid for G1XmkII) + }, +); + +# contrast information (MakerNotes tag 0x27) - PH +%Image::ExifTool::Canon::ContrastInfo = ( + %binaryDataAttrs, + FORMAT => 'int16u', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 4 => { + Name => 'IntelligentContrast', + PrintHex => 1, + PrintConv => { + 0x00 => 'Off', + 0x08 => 'On', + 0xffff => 'n/a', + OTHER => sub { + # DPP shows "On" for any value except 0xffff when bit 0x08 is set + my ($val, $inv) = @_; + if ($inv) { + $val =~ /(0x[0-9a-f]+)/i or $val =~ /(\d+)/ or return undef; + return $1; + } else { + return sprintf("On (0x%.2x)",$val) if $val & 0x08; + return sprintf("Off (0x%.2x)",$val); + } + }, + }, + }, + # 6 - 0=normal, 257=i-Contrast On +); + +# time information (MakerNotes tag 0x35) - PH (1DX, 5DmkIII) +%Image::ExifTool::Canon::TimeInfo = ( + %binaryDataAttrs, + FORMAT => 'int32s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Time' }, + # 0 - size (16 bytes) + 1 => { + Name => 'TimeZone', + PrintConv => 'Image::ExifTool::TimeZoneString($val)', + PrintConvInv => sub { + my $val = shift; + $val =~ /^([-+]?)(\d{1,2}):?(\d{2})$/ or return undef; + return(($1 eq '-' ? -1 : 1) * ($2 * 60 + $3)); + }, + }, + 2 => { + Name => 'TimeZoneCity', + PrintConvColumns => 3, + PrintConv => { + # [square brackets] = actual time zone for each city + # (round brackets) = observed time zone values from sample images + # --> unobserved entries have not been confirmed! + 0 => 'n/a', # (PowerShot models) + 1 => 'Chatham Islands', # [+12:45] + 2 => 'Wellington', # [+12] (+12:00,DST+0) + 3 => 'Solomon Islands', # [+11] + 4 => 'Sydney', # [+10] (+11:00,DST+1) + 5 => 'Adelaide', # [+9:30] + 6 => 'Tokyo', # [+9] (+09:00,DST+0) + 7 => 'Hong Kong', # [+8] (+08:00,DST+0) + 8 => 'Bangkok', # [+7] (+08:00,DST+1) + 9 => 'Yangon', # [+6:30] + 10 => 'Dhaka', # [+6] (Canon uses old "Dacca" spelling) + 11 => 'Kathmandu', # [+5:45] + 12 => 'Delhi', # [+5:30] + 13 => 'Karachi', # [+5] + 14 => 'Kabul', # [+4:30] + 15 => 'Dubai', # [+4] + 16 => 'Tehran', # [+3:30] + 17 => 'Moscow', # [+4] (+03:00,DST+0) (! changed to +4 permanent DST in 2011) + 18 => 'Cairo', # [+2] + 19 => 'Paris', # [+1] (+01:10,DST+0; +02:00,DST+1) + 20 => 'London', # [0] (+00:00,DST+0) + 21 => 'Azores', # [-1] + 22 => 'Fernando de Noronha', # [-2] + 23 => 'Sao Paulo', # [-3] + 24 => 'Newfoundland', # [-3:30] + 25 => 'Santiago', # [-4] + 26 => 'Caracas', # [-4:30] + 27 => 'New York', # [-5] (-05:00,DST+0; -04:00,DST+1) + 28 => 'Chicago', # [-6] + 29 => 'Denver', # [-7] + 30 => 'Los Angeles', # [-8] (-08:00,DST+0; -07:00,DST+1) + 31 => 'Anchorage', # [-9] + 32 => 'Honolulu', # [-10] + 33 => 'Samoa', # [+13] + 32766 => '(not set)', #(NC) + }, + }, + 3 => { + Name => 'DaylightSavings', + PrintConv => { + 0 => 'Off', + 60 => 'On', + }, + }, +); + +# my color mode information (MakerNotes tag 0x1d) - PH (A570IS) +%Image::ExifTool::Canon::MyColors = ( + %binaryDataAttrs, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x02 => { + Name => 'MyColorMode', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Off', + 1 => 'Positive Film', #15 (SD600) + 2 => 'Light Skin Tone', #15 + 3 => 'Dark Skin Tone', #15 + 4 => 'Vivid Blue', #15 + 5 => 'Vivid Green', #15 + 6 => 'Vivid Red', #15 + 7 => 'Color Accent', #15 (A610) (NC) + 8 => 'Color Swap', #15 (A610) + 9 => 'Custom', + 12 => 'Vivid', + 13 => 'Neutral', + 14 => 'Sepia', + 15 => 'B&W', + }, + }, +); + +# face detect information (MakerNotes tag 0x24) - PH (A570IS) +%Image::ExifTool::Canon::FaceDetect1 = ( + %binaryDataAttrs, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + DATAMEMBER => [ 0x02 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x02 => { + Name => 'FacesDetected', + DataMember => 'FacesDetected', + RawConv => '$$self{FacesDetected} = $val', + }, + 0x03 => { + Name => 'FaceDetectFrameSize', + Format => 'int16u[2]', + }, + 0x08 => { + Name => 'Face1Position', + Format => 'int16s[2]', + RawConv => '$$self{FacesDetected} < 1 ? undef: $val', + Notes => q{ + X-Y coordinates for the center of each face in the Face Detect frame at the + time of focus lock. "0 0" is the center, and positive X and Y are to the + right and downwards respectively + }, + }, + 0x0a => { + Name => 'Face2Position', + Format => 'int16s[2]', + RawConv => '$$self{FacesDetected} < 2 ? undef : $val', + }, + 0x0c => { + Name => 'Face3Position', + Format => 'int16s[2]', + RawConv => '$$self{FacesDetected} < 3 ? undef : $val', + }, + 0x0e => { + Name => 'Face4Position', + Format => 'int16s[2]', + RawConv => '$$self{FacesDetected} < 4 ? undef : $val', + }, + 0x10 => { + Name => 'Face5Position', + Format => 'int16s[2]', + RawConv => '$$self{FacesDetected} < 5 ? undef : $val', + }, + 0x12 => { + Name => 'Face6Position', + Format => 'int16s[2]', + RawConv => '$$self{FacesDetected} < 6 ? undef : $val', + }, + 0x14 => { + Name => 'Face7Position', + Format => 'int16s[2]', + RawConv => '$$self{FacesDetected} < 7 ? undef : $val', + }, + 0x16 => { + Name => 'Face8Position', + Format => 'int16s[2]', + RawConv => '$$self{FacesDetected} < 8 ? undef : $val', + }, + 0x18 => { + Name => 'Face9Position', + Format => 'int16s[2]', + RawConv => '$$self{FacesDetected} < 9 ? undef : $val', + }, +); + +# more face detect information (MakerNotes tag 0x25) - PH (A570IS) +%Image::ExifTool::Canon::FaceDetect2 = ( + %binaryDataAttrs, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x01 => 'FaceWidth', + 0x02 => 'FacesDetected', +); + +# G9 white balance information (MakerNotes tag 0x29) (ref IB, changed ref forum13640) +%Image::ExifTool::Canon::WBInfo = ( + %binaryDataAttrs, + NOTES => 'WB tags for the Canon G9.', + FORMAT => 'int32u', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x02 => { Name => 'WB_GRBGLevelsAuto', Format => 'int32s[4]' }, + 0x0a => { Name => 'WB_GRBGLevelsDaylight', Format => 'int32s[4]' }, + 0x12 => { Name => 'WB_GRBGLevelsCloudy', Format => 'int32s[4]' }, + 0x1a => { Name => 'WB_GRBGLevelsTungsten', Format => 'int32s[4]' }, + 0x22 => { Name => 'WB_GRBGLevelsFluorescent', Format => 'int32s[4]' }, + 0x2a => { Name => 'WB_GRBGLevelsFluorHigh', Format => 'int32s[4]' }, + 0x32 => { Name => 'WB_GRBGLevelsFlash', Format => 'int32s[4]' }, + 0x3a => { Name => 'WB_GRBGLevelsUnderwater', Format => 'int32s[4]' }, + 0x42 => { Name => 'WB_GRBGLevelsCustom1', Format => 'int32s[4]' }, + 0x4a => { Name => 'WB_GRBGLevelsCustom2', Format => 'int32s[4]' }, +); + +# yet more face detect information (MakerNotes tag 0x2f) - PH (G12) +%Image::ExifTool::Canon::FaceDetect3 = ( + %binaryDataAttrs, + FORMAT => 'int16u', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + # 0 - size (34 bytes) + # 1 - 1=4:3/16:9,2=1:1/3:2/4:5 + # 2 - normally 1 if faces detected, but sometimes 0 (maybe if face wasn't in captured image?) + 3 => 'FacesDetected', + # 4 - 240=4:3/4:5/1:1,180=16:9,212=3:2 +); + +# File number information (MakerNotes tag 0x93) +%Image::ExifTool::Canon::FileInfo = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 20 ], + 1 => [ + { #5 + Name => 'FileNumber', + Condition => '$$self{Model} =~ /\b(20D|350D|REBEL XT|Kiss Digital N)\b/', + Format => 'int32u', + # Thanks to Juha Eskelinen for figuring this out: + # [this is an odd bit mapping -- it looks like the file number exists as + # a 16-bit integer containing the high bits, followed by an 8-bit integer + # with the low bits. But it is more convenient to have this in a single + # word, so some bit manipulations are necessary... - PH] + # The bit pattern of the 32-bit word is: + # 31....24 23....16 15.....8 7......0 + # 00000000 ffffffff DDDDDDDD ddFFFFFF + # 0 = zero bits (not part of the file number?) + # f/F = low/high bits of file number + # d/D = low/high bits of directory number + # The directory and file number are then converted into decimal + # and separated by a '-' to give the file number used in the 20D + ValueConv => '(($val&0xffc0)>>6)*10000+(($val>>16)&0xff)+(($val&0x3f)<<8)', + ValueConvInv => q{ + my $d = int($val/10000); + my $f = $val - $d * 10000; + return (($d<<6) & 0xffc0) + (($f & 0xff)<<16) + (($f>>8) & 0x3f); + }, + PrintConv => '$_=$val,s/(\d+)(\d{4})/$1-$2/,$_', + PrintConvInv => '$val=~s/-//g;$val', + }, + { #16 + Name => 'FileNumber', + Condition => '$$self{Model} =~ /\b(30D|400D|REBEL XTi|Kiss Digital X|K236)\b/', + Format => 'int32u', + Notes => q{ + the location of the upper 4 bits of the directory number is a mystery for + the EOS 30D, so the reported directory number will be incorrect for original + images with a directory number of 164 or greater + }, + # Thanks to Emil Sit for figuring this out: + # [more insane bit maniplations like the 20D/350D above, but this time we + # appear to have lost the upper 4 bits of the directory number (this was + # verified through tests with directory numbers 100, 222, 801 and 999) - PH] + # The bit pattern for the 30D is: (see 20D notes above for more information) + # 31....24 23....16 15.....8 7......0 + # 00000000 ffff0000 ddddddFF FFFFFFFF + # [NOTE: the 4 high order directory bits don't appear in this record, but + # I have chosen to write them into bits 16-19 since these 4 zero bits look + # very suspicious, and are a convenient place to store this information - PH] + ValueConv => q{ + my $d = ($val & 0xffc00) >> 10; + # we know there are missing bits if directory number is < 100 + $d += 0x40 while $d < 100; # (repair the damage as best we can) + return $d*10000 + (($val&0x3ff)<<4) + (($val>>20)&0x0f); + }, + ValueConvInv => q{ + my $d = int($val/10000); + my $f = $val - $d * 10000; + return ($d << 10) + (($f>>4)&0x3ff) + (($f&0x0f)<<20); + }, + PrintConv => '$_=$val,s/(\d+)(\d{4})/$1-$2/,$_', + PrintConvInv => '$val=~s/-//g;$val', + }, + { #7 (1D, 1Ds) + Name => 'ShutterCount', + Condition => 'GetByteOrder() eq "MM"', + Format => 'int32u', + }, + { #7 (1DmkII, 1DSmkII, 1DSmkIIN) + Name => 'ShutterCount', + # ref http://www.luminous-landscape.com/forum/index.php?topic=36469 : + Notes => q{ + there are reports that the ShutterCount changed when loading a settings file + on the 1DSmkII + }, + Condition => '$$self{Model} =~ /\b1Ds? Mark II\b/', + Format => 'int32u', + ValueConv => '($val>>16)|(($val&0xffff)<<16)', + ValueConvInv => '($val>>16)|(($val&0xffff)<<16)', + }, + # 5D gives a single byte value (unknown) + # 40D stores all zeros + ], + 3 => { #PH + Name => 'BracketMode', + PrintConv => { + 0 => 'Off', + 1 => 'AEB', + 2 => 'FEB', + 3 => 'ISO', + 4 => 'WB', + }, + }, + 4 => 'BracketValue', #PH + 5 => 'BracketShotNumber', #PH + 6 => { #PH + Name => 'RawJpgQuality', + RawConv => '$val<=0 ? undef : $val', + PrintConv => \%canonQuality, + }, + 7 => { #PH + Name => 'RawJpgSize', + RawConv => '$val<0 ? undef : $val', + PrintConv => \%canonImageSize, + }, + 8 => { #PH + Name => 'LongExposureNoiseReduction2', + Notes => q{ + for some modules this gives the long exposure noise reduction applied to the + image, but for other models this just reflects the setting independent of + whether or not it was applied + }, + RawConv => '$val<0 ? undef : $val', + PrintConv => { + 0 => 'Off', + 1 => 'On (1D)', + 3 => 'On', + 4 => 'Auto', + }, + }, + 9 => { #PH + Name => 'WBBracketMode', + PrintConv => { + 0 => 'Off', + 1 => 'On (shift AB)', + 2 => 'On (shift GM)', + }, + }, + 12 => 'WBBracketValueAB', #PH + 13 => 'WBBracketValueGM', #PH + 14 => { #PH + Name => 'FilterEffect', + RawConv => '$val==-1 ? undef : $val', + PrintConv => { + 0 => 'None', + 1 => 'Yellow', + 2 => 'Orange', + 3 => 'Red', + 4 => 'Green', + }, + }, + 15 => { #PH + Name => 'ToningEffect', + RawConv => '$val==-1 ? undef : $val', + PrintConv => { + 0 => 'None', + 1 => 'Sepia', + 2 => 'Blue', + 3 => 'Purple', + 4 => 'Green', + }, + }, + 16 => { #PH + %ciMacroMagnification, + # MP-E 65mm on 5DmkII: 44=5x,52~=3.9x,56~=3.3x,62~=2.6x,75=1x + # ME-E 65mm on 40D/450D: 72 for all samples (not valid) + Condition => q{ + $$self{LensType} and $$self{LensType} == 124 and + $$self{Model} !~ /\b(40D|450D|REBEL XSi|Kiss X2)\b/ + }, + Notes => q{ + currently decoded only for the MP-E 65mm f/2.8 1-5x Macro Photo, and not + valid for all camera models + }, + }, + # 17 - values: 0, 3, 4 + # 18 - same as LiveViewShooting for all my samples (5DmkII, 50D) - PH + 19 => { #PH + # Note: this value is not displayed by Canon ImageBrowser for the following + # models with the live view feature: 1DmkIII, 1DSmkIII, 40D, 450D, 1000D + # (this tag could be valid only for some firmware versions: + # http://www.breezesys.com/forum/showthread.php?p=16980) + Name => 'LiveViewShooting', + PrintConv => \%offOn, + }, + 20 => { #47 + Name => 'FocusDistanceUpper', + DataMember => 'FocusDistanceUpper2', + Format => 'int16u', + RawConv => '($$self{FocusDistanceUpper2} = $val) || undef', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => '$val > 655.345 ? "inf" : "$val m"', + PrintConvInv => '$val =~ s/ ?m$//; IsFloat($val) ? $val : 655.35', + }, + 21 => { #47 + Name => 'FocusDistanceLower', + Condition => '$$self{FocusDistanceUpper2}', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => '$val > 655.345 ? "inf" : "$val m"', + PrintConvInv => '$val =~ s/ ?m$//; IsFloat($val) ? $val : 655.35', + }, + # 22 - values: 0, 1 + 23 => { #JohnMoyer (forum12925) + Name => 'ShutterMode', + PrintConv => { + 0 => 'Mechanical', + 1 => 'Electronic First Curtain', + 2 => 'Electronic', + # 3 => ? + # 21 => ? + # 22 => ? + }, + }, + 25 => { #PH + Name => 'FlashExposureLock', + PrintConv => \%offOn, + }, + 0x3d => { #IB + Name => 'RFLensType', + Format => 'int16u', + PrintConv => { + 0 => 'n/a', + 257 => 'Canon RF 50mm F1.2L USM', + 258 => 'Canon RF 24-105mm F4L IS USM', + 259 => 'Canon RF 28-70mm F2L USM', + 260 => 'Canon RF 35mm F1.8 MACRO IS STM', + 261 => 'Canon RF 85mm F1.2L USM', + 262 => 'Canon RF 85mm F1.2L USM DS', + 263 => 'Canon RF 24-70mm F2.8L IS USM', + 264 => 'Canon RF 15-35mm F2.8L IS USM', + 265 => 'Canon RF 24-240mm F4-6.3 IS USM', + 266 => 'Canon RF 70-200mm F2.8L IS USM', + 267 => 'Canon RF 85mm F2 MACRO IS STM', + 268 => 'Canon RF 600mm F11 IS STM', + 269 => 'Canon RF 600mm F11 IS STM + RF1.4x', + 270 => 'Canon RF 600mm F11 IS STM + RF2x', + 271 => 'Canon RF 800mm F11 IS STM', + 272 => 'Canon RF 800mm F11 IS STM + RF1.4x', + 273 => 'Canon RF 800mm F11 IS STM + RF2x', + 274 => 'Canon RF 24-105mm F4-7.1 IS STM', + 275 => 'Canon RF 100-500mm F4.5-7.1L IS USM', + 276 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x', + 277 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x', + 278 => 'Canon RF 70-200mm F4L IS USM', #42 + 279 => 'Canon RF 100mm F2.8L MACRO IS USM', #42 + 280 => 'Canon RF 50mm F1.8 STM', #42 + 281 => 'Canon RF 14-35mm F4L IS USM', #42/IB + 282 => 'Canon RF-S 18-45mm F4.5-6.3 IS STM', #42 + 283 => 'Canon RF 100-400mm F5.6-8 IS USM', #42 + 284 => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42 (NC) + 285 => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42 (NC) + 286 => 'Canon RF-S 18-150mm F3.5-6.3 IS STM', #42 + 288 => 'Canon RF 16mm F2.8 STM', #42 + 289 => 'Canon RF 400mm F2.8L IS USM', #IB + 290 => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB + 291 => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB + 292 => 'Canon RF 600mm F4L IS USM', #GiaZopatti + # Note: add new RF lenses to %canonLensTypes with ID 61182 + }, + }, +); + +# Internal serial number information (MakerNotes tag 0x96) (ref PH) +%Image::ExifTool::Canon::SerialInfo = ( + %binaryDataAttrs, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 9 => { + Name => 'InternalSerialNumber', + Format => 'string', + }, +); + +# Cropping information (MakerNotes tag 0x98) (ref PH) +%Image::ExifTool::Canon::CropInfo = ( + %binaryDataAttrs, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => 'CropLeftMargin', # (NC, may be right) + 1 => 'CropRightMargin', + 2 => 'CropTopMargin', # (NC, may be bottom) + 3 => 'CropBottomMargin', +); + +# Aspect ratio information (MakerNotes tag 0x9a) (ref PH) +%Image::ExifTool::Canon::AspectInfo = ( + %binaryDataAttrs, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'AspectRatio', + PrintConv => { + 0 => '3:2', + 1 => '1:1', + 2 => '4:3', + 7 => '16:9', + 8 => '4:5', + 12 => '3:2 (APS-H crop)', #IB + 13 => '3:2 (APS-C crop)', #IB + }, + }, + # (could use better names for these, or the Crop tags above, or both) + 1 => 'CroppedImageWidth', + 2 => 'CroppedImageHeight', + 3 => 'CroppedImageLeft', #forum4138 + 4 => 'CroppedImageTop', #ditto +); + +# Color information (MakerNotes tag 0xa0) +%Image::ExifTool::Canon::Processing = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 1 => { #PH + Name => 'ToneCurve', + PrintConv => { + 0 => 'Standard', + 1 => 'Manual', + 2 => 'Custom', + }, + }, + 2 => { #12 + Name => 'Sharpness', + Notes => 'all models except the 20D and 350D', + Condition => '$$self{Model} !~ /\b(20D|350D|REBEL XT|Kiss Digital N)\b/', + Priority => 0, # (maybe not as reliable as other sharpness values) + }, + 3 => { #PH + Name => 'SharpnessFrequency', # PatternSharpness? + PrintConvColumns => 2, + PrintConv => { + 0 => 'n/a', + 1 => 'Lowest', + 2 => 'Low', + 3 => 'Standard', + 4 => 'High', + 5 => 'Highest', + }, + }, + 4 => 'SensorRedLevel', #PH + 5 => 'SensorBlueLevel', #PH + 6 => 'WhiteBalanceRed', #PH + 7 => 'WhiteBalanceBlue', #PH + 8 => { #PH + Name => 'WhiteBalance', + RawConv => '$val < 0 ? undef : $val', + PrintConv => \%canonWhiteBalance, + SeparateTable => 1, + }, + 9 => 'ColorTemperature', #6 + 10 => { #12 + Name => 'PictureStyle', + Flags => ['PrintHex','SeparateTable'], + PrintConv => \%pictureStyles, + }, + 11 => { #PH + Name => 'DigitalGain', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 12 => { #PH + Name => 'WBShiftAB', + Notes => 'positive is a shift toward amber', + }, + 13 => { #PH + Name => 'WBShiftGM', + Notes => 'positive is a shift toward green', + }, +); + +# Color balance information (MakerNotes tag 0xa9) (ref PH) +%Image::ExifTool::Canon::ColorBalance = ( + %binaryDataAttrs, + NOTES => 'These tags are used by the 10D and 300D.', + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # red,green1,green2,blue (ref 2) + 1 => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' }, + 5 => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' }, + 9 => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' }, + 13 => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' }, + 17 => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' }, + 21 => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' }, + 25 => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' }, + 29 => [{ + Name => 'WB_RGGBLevelsCustom', + Notes => 'black levels for the D60', + Condition => '$$self{Model} !~ /EOS D60\b/', + Format => 'int16s[4]', + },{ # (black levels for D60, ref IB) + Name => 'BlackLevels', + Format => 'int16s[4]', + }], + 33 => { Name => 'WB_RGGBLevelsKelvin', Format => 'int16s[4]' }, + 37 => { Name => 'WB_RGGBBlackLevels', Format => 'int16s[4]' }, #IB +); + +# Measured color levels (MakerNotes tag 0xaa) (ref 37) +%Image::ExifTool::Canon::MeasuredColor = ( + %binaryDataAttrs, + FORMAT => 'int16u', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 1 => { + # this is basically the inverse of WB_RGGBLevelsMeasured (ref 37) + Name => 'MeasuredRGGB', + Format => 'int16u[4]', + }, + # 5 - observed values: 0, 1 - PH +); + +# Flags information (MakerNotes tag 0xb0) (ref PH) +%Image::ExifTool::Canon::Flags = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 1 => 'ModifiedParamFlag', +); + +# Modified information (MakerNotes tag 0xb1) (ref PH) +%Image::ExifTool::Canon::ModifiedInfo = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 1 => { + Name => 'ModifiedToneCurve', + PrintConv => { + 0 => 'Standard', + 1 => 'Manual', + 2 => 'Custom', + }, + }, + 2 => { + Name => 'ModifiedSharpness', + Notes => '1D and 5D only', + Condition => '$$self{Model} =~ /\b(1D|5D)/', + }, + 3 => { + Name => 'ModifiedSharpnessFreq', # ModifiedPatternSharpness? + PrintConv => { + 0 => 'n/a', + 1 => 'Lowest', + 2 => 'Low', + 3 => 'Standard', + 4 => 'High', + 5 => 'Highest', + }, + }, + 4 => 'ModifiedSensorRedLevel', + 5 => 'ModifiedSensorBlueLevel', + 6 => 'ModifiedWhiteBalanceRed', + 7 => 'ModifiedWhiteBalanceBlue', + 8 => { + Name => 'ModifiedWhiteBalance', + PrintConv => \%canonWhiteBalance, + SeparateTable => 'WhiteBalance', + }, + 9 => 'ModifiedColorTemp', + 10 => { + Name => 'ModifiedPictureStyle', + PrintHex => 1, + SeparateTable => 'PictureStyle', + PrintConv => \%pictureStyles, + }, + 11 => { + Name => 'ModifiedDigitalGain', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, +); + +# Preview image information (MakerNotes tag 0xb6) +# - The 300D writes a 1536x1024 preview image that is accessed +# through this information - decoded by PH 12/14/03 +%Image::ExifTool::Canon::PreviewImageInfo = ( + %binaryDataAttrs, + FORMAT => 'int32u', + FIRST_ENTRY => 1, + IS_OFFSET => [ 5 ], # tag 5 is 'IsOffset' + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, +# the size of the preview block in 2-byte increments +# 0 => { +# Name => 'PreviewImageInfoWords', +# }, + 1 => { + Name => 'PreviewQuality', + PrintConv => \%canonQuality, + }, + 2 => { + Name => 'PreviewImageLength', + OffsetPair => 5, # point to associated offset + DataTag => 'PreviewImage', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + 3 => 'PreviewImageWidth', + 4 => 'PreviewImageHeight', + 5 => { + Name => 'PreviewImageStart', + Flags => 'IsOffset', + OffsetPair => 2, # associated byte count tagID + DataTag => 'PreviewImage', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + # NOTE: The size of the PreviewImageInfo structure is incorrectly + # written as 48 bytes (Count=12, Format=int32u), but only the first + # 6 int32u values actually exist +); + +# Sensor information (MakerNotes tag 0xe0) (ref 12) +%Image::ExifTool::Canon::SensorInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int16s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + # Note: Don't make these writable because it confuses Canon decoding software + # if these are changed + 1 => 'SensorWidth', + 2 => 'SensorHeight', + 5 => 'SensorLeftBorder', #2 + 6 => 'SensorTopBorder', #2 + 7 => 'SensorRightBorder', #2 + 8 => 'SensorBottomBorder', #2 + 9 => { #22 + Name => 'BlackMaskLeftBorder', + Notes => q{ + coordinates for the area to the left or right of the image used to calculate + the average black level + }, + }, + 10 => 'BlackMaskTopBorder', #22 + 11 => 'BlackMaskRightBorder', #22 + 12 => 'BlackMaskBottomBorder', #22 +); + +# Color data (MakerNotes tag 0x4001, count=582) (ref 12) +%Image::ExifTool::Canon::ColorData1 = ( + %binaryDataAttrs, + NOTES => 'These tags are used by the 20D and 350D.', + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + IS_SUBDIR => [ 0x4b ], + # 0x00: size of record in bytes - PH + # (dcraw 8.81 uses index 0x19 for WB) + 0x19 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, + 0x1d => 'ColorTempAsShot', + 0x1e => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' }, + 0x22 => 'ColorTempAuto', + 0x23 => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' }, + 0x27 => 'ColorTempDaylight', + 0x28 => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' }, + 0x2c => 'ColorTempShade', + 0x2d => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' }, + 0x31 => 'ColorTempCloudy', + 0x32 => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' }, + 0x36 => 'ColorTempTungsten', + 0x37 => { Name => 'WB_RGGBLevelsFluorescent', Format => 'int16s[4]' }, + 0x3b => 'ColorTempFluorescent', + 0x3c => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' }, + 0x40 => 'ColorTempFlash', + 0x41 => { Name => 'WB_RGGBLevelsCustom1', Format => 'int16s[4]' }, + 0x45 => 'ColorTempCustom1', + 0x46 => { Name => 'WB_RGGBLevelsCustom2', Format => 'int16s[4]' }, + 0x4a => 'ColorTempCustom2', + 0x4b => { #PH + Name => 'ColorCalib', + Format => 'undef[120]', + Unknown => 1, # (all tags are unknown, so we can avoid processing entire directory) + Notes => 'A, B, C, Temperature', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' } + }, +); + +# Color data (MakerNotes tag 0x4001, count=653) (ref 12) +%Image::ExifTool::Canon::ColorData2 = ( + %binaryDataAttrs, + NOTES => 'These tags are used by the 1DmkII and 1DSmkII.', + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + IS_SUBDIR => [ 0xa4 ], + 0x18 => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' }, + 0x1c => 'ColorTempAuto', + 0x1d => { Name => 'WB_RGGBLevelsUnknown', Format => 'int16s[4]', Unknown => 1 }, + 0x21 => { Name => 'ColorTempUnknown', Unknown => 1 }, + # (dcraw 8.81 uses index 0x22 for WB) + 0x22 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, + 0x26 => 'ColorTempAsShot', + 0x27 => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' }, + 0x2b => 'ColorTempDaylight', + 0x2c => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' }, + 0x30 => 'ColorTempShade', + 0x31 => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' }, + 0x35 => 'ColorTempCloudy', + 0x36 => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' }, + 0x3a => 'ColorTempTungsten', + 0x3b => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' }, + 0x3f => 'ColorTempFluorescent', + 0x40 => { Name => 'WB_RGGBLevelsKelvin', Format => 'int16s[4]' }, + 0x44 => 'ColorTempKelvin', + 0x45 => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' }, + 0x49 => 'ColorTempFlash', + 0x4a => { Name => 'WB_RGGBLevelsUnknown2', Format => 'int16s[4]', Unknown => 1 }, + 0x4e => { Name => 'ColorTempUnknown2', Unknown => 1 }, + 0x4f => { Name => 'WB_RGGBLevelsUnknown3', Format => 'int16s[4]', Unknown => 1 }, + 0x53 => { Name => 'ColorTempUnknown3', Unknown => 1 }, + 0x54 => { Name => 'WB_RGGBLevelsUnknown4', Format => 'int16s[4]', Unknown => 1 }, + 0x58 => { Name => 'ColorTempUnknown4', Unknown => 1 }, + 0x59 => { Name => 'WB_RGGBLevelsUnknown5', Format => 'int16s[4]', Unknown => 1 }, + 0x5d => { Name => 'ColorTempUnknown5', Unknown => 1 }, + 0x5e => { Name => 'WB_RGGBLevelsUnknown6', Format => 'int16s[4]', Unknown => 1 }, + 0x62 => { Name => 'ColorTempUnknown6', Unknown => 1 }, + 0x63 => { Name => 'WB_RGGBLevelsUnknown7', Format => 'int16s[4]', Unknown => 1 }, + 0x67 => { Name => 'ColorTempUnknown7', Unknown => 1 }, + 0x68 => { Name => 'WB_RGGBLevelsUnknown8', Format => 'int16s[4]', Unknown => 1 }, + 0x6c => { Name => 'ColorTempUnknown8', Unknown => 1 }, + 0x6d => { Name => 'WB_RGGBLevelsUnknown9', Format => 'int16s[4]', Unknown => 1 }, + 0x71 => { Name => 'ColorTempUnknown9', Unknown => 1 }, + 0x72 => { Name => 'WB_RGGBLevelsUnknown10', Format => 'int16s[4]', Unknown => 1 }, + 0x76 => { Name => 'ColorTempUnknown10', Unknown => 1 }, + 0x77 => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 }, + 0x7b => { Name => 'ColorTempUnknown11', Unknown => 1 }, + 0x7c => { Name => 'WB_RGGBLevelsUnknown12', Format => 'int16s[4]', Unknown => 1 }, + 0x80 => { Name => 'ColorTempUnknown12', Unknown => 1 }, + 0x81 => { Name => 'WB_RGGBLevelsUnknown13', Format => 'int16s[4]', Unknown => 1 }, + 0x85 => { Name => 'ColorTempUnknown13', Unknown => 1 }, + 0x86 => { Name => 'WB_RGGBLevelsUnknown14', Format => 'int16s[4]', Unknown => 1 }, + 0x8a => { Name => 'ColorTempUnknown14', Unknown => 1 }, + 0x8b => { Name => 'WB_RGGBLevelsUnknown15', Format => 'int16s[4]', Unknown => 1 }, + 0x8f => { Name => 'ColorTempUnknown15', Unknown => 1 }, + 0x90 => { Name => 'WB_RGGBLevelsPC1', Format => 'int16s[4]' }, + 0x94 => 'ColorTempPC1', + 0x95 => { Name => 'WB_RGGBLevelsPC2', Format => 'int16s[4]' }, + 0x99 => 'ColorTempPC2', + 0x9a => { Name => 'WB_RGGBLevelsPC3', Format => 'int16s[4]' }, + 0x9e => 'ColorTempPC3', + 0x9f => { Name => 'WB_RGGBLevelsUnknown16', Format => 'int16s[4]', Unknown => 1 }, + 0xa3 => { Name => 'ColorTempUnknown16', Unknown => 1 }, + 0xa4 => { #PH + Name => 'ColorCalib', + Format => 'undef[120]', + Unknown => 1, + Notes => 'A, B, C, Temperature', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' } + }, + 0x26a => { #PH + Name => 'RawMeasuredRGGB', + Format => 'int32u[4]', + Notes => 'raw MeasuredRGGB values, before normalization', + # swap words because the word ordering is big-endian, opposite to the byte ordering + ValueConv => \&SwapWords, + ValueConvInv => \&SwapWords, + }, +); + +# Color data (MakerNotes tag 0x4001, count=796) (ref 12) +%Image::ExifTool::Canon::ColorData3 = ( + %binaryDataAttrs, + NOTES => 'These tags are used by the 1DmkIIN, 5D, 30D and 400D.', + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + IS_SUBDIR => [ 0x85 ], + 0x00 => { #PH + Name => 'ColorDataVersion', + PrintConv => { + 1 => '1 (1DmkIIN/5D/30D/400D)', + }, + }, + # 0x01-0x3e: RGGB coefficients, apparently specific to the + # individual camera and possibly used for color calibration (ref 37) + # (dcraw 8.81 uses index 0x3f for WB) + 0x3f => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, + 0x43 => 'ColorTempAsShot', + 0x44 => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' }, + 0x48 => 'ColorTempAuto', + # not sure exactly what 'Measured' values mean... + 0x49 => { Name => 'WB_RGGBLevelsMeasured', Format => 'int16s[4]' }, + 0x4d => 'ColorTempMeasured', + 0x4e => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' }, + 0x52 => 'ColorTempDaylight', + 0x53 => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' }, + 0x57 => 'ColorTempShade', + 0x58 => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' }, + 0x5c => 'ColorTempCloudy', + 0x5d => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' }, + 0x61 => 'ColorTempTungsten', + 0x62 => { Name => 'WB_RGGBLevelsFluorescent', Format => 'int16s[4]' }, + 0x66 => 'ColorTempFluorescent', + 0x67 => { Name => 'WB_RGGBLevelsKelvin', Format => 'int16s[4]' }, + 0x6b => 'ColorTempKelvin', + 0x6c => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' }, + 0x70 => 'ColorTempFlash', + 0x71 => { Name => 'WB_RGGBLevelsPC1', Format => 'int16s[4]' }, + 0x75 => 'ColorTempPC1', + 0x76 => { Name => 'WB_RGGBLevelsPC2', Format => 'int16s[4]' }, + 0x7a => 'ColorTempPC2', + 0x7b => { Name => 'WB_RGGBLevelsPC3', Format => 'int16s[4]' }, + 0x7f => 'ColorTempPC3', + 0x80 => { Name => 'WB_RGGBLevelsCustom', Format => 'int16s[4]' }, + 0x84 => 'ColorTempCustom', + 0x85 => { #37 + Name => 'ColorCalib', + Format => 'undef[120]', + Unknown => 1, + Notes => 'B, C, A, Temperature', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' } + }, + 0xc4 => { #IB + Name => 'PerChannelBlackLevel', + Format => 'int16u[4]', + }, + # 0xc8-0x1c7: some sort of color table (ref 37) + 0x248 => { #37 + Name => 'FlashOutput', + ValueConv => '$val >= 255 ? 255 : exp(($val-200)/16*log(2))', + ValueConvInv => '$val == 255 ? 255 : 200 + log($val)*16/log(2)', + PrintConv => '$val == 255 ? "Strobe or Misfire" : sprintf("%.0f%%", $val * 100)', + PrintConvInv => '$val =~ /^(\d(\.?\d*))/ ? $1 / 100 : 255', + }, + 0x249 => { #37 + Name => 'FlashBatteryLevel', + # calibration points for external flash: 144=3.76V (almost empty), 192=5.24V (full) + # - have seen a value of 201 with internal flash + PrintConv => '$val ? sprintf("%.2fV", $val * 5 / 186) : "n/a"', + PrintConvInv => '$val=~/^(\d+\.\d+)\s*V?$/i ? int($val*186/5+0.5) : 0', + }, + 0x24a => { #37 + Name => 'ColorTempFlashData', + # 0 for no external flash, 35980 for 'Strobe or Misfire' + # (lower than ColorTempFlash by up to 200 degrees) + RawConv => '($val < 2000 or $val > 12000) ? undef : $val', + }, + # 0x24b: inverse relationship with flash power (ref 37) + # 0x286: has value 256 for correct exposure, less for under exposure (seen 96 minimum) (ref 37) + 0x287 => { #37 + Name => 'MeasuredRGGBData', + Format => 'int32u[4]', + Notes => 'MeasuredRGGB may be derived from these data values', + # swap words because the word ordering is big-endian, opposite to the byte ordering + ValueConv => \&SwapWords, + ValueConvInv => \&SwapWords, + }, + # 0x297: ranges from -10 to 30, higher for high ISO (ref 37) +); + +# Color data (MakerNotes tag 0x4001, count=674|692|702|1227|1250|1251|1337|1338|1346) (ref PH) +%Image::ExifTool::Canon::ColorData4 = ( + %binaryDataAttrs, + NOTES => q{ + These tags are used by the 1DmkIII, 1DSmkIII, 1DmkIV, 5DmkII, 7D, 40D, 50D, + 60D, 450D, 500D, 550D, 1000D and 1100D. + }, + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + IS_SUBDIR => [ 0x3f, 0xa8 ], + DATAMEMBER => [ 0x00 ], + 0x00 => { + Name => 'ColorDataVersion', + DataMember => 'ColorDataVersion', + RawConv => '$$self{ColorDataVersion} = $val', + PrintConv => { + 2 => '2 (1DmkIII)', + 3 => '3 (40D)', + 4 => '4 (1DSmkIII)', + 5 => '5 (450D/1000D)', + 6 => '6 (50D/5DmkII)', + 7 => '7 (500D/550D/7D/1DmkIV)', + 9 => '9 (60D/1100D)', + }, + }, + # 0x01-0x18: unknown RGGB coefficients (int16s[4]) (50D) + # (dcraw 8.81 uses index 0x3f for WB) + 0x3f => { + Name => 'ColorCoefs', + Format => 'undef[210]', # ColorTempUnknown11 is last entry + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCoefs' } + }, + 0xa8 => { + Name => 'ColorCalib', + Format => 'undef[120]', + Unknown => 1, + Notes => 'B, C, A, Temperature', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' } + }, + 0x0e7 => { Name => 'AverageBlackLevel', Format => 'int16u[4]' }, #IB + 0x280 => { #PH + Name => 'RawMeasuredRGGB', + Format => 'int32u[4]', + Notes => 'raw MeasuredRGGB values, before normalization', + # swap words because the word ordering is big-endian, opposite to the byte ordering + ValueConv => \&SwapWords, + ValueConvInv => \&SwapWords, + }, + 0x2b4 => { #IB + Name => 'PerChannelBlackLevel', + Condition => '$$self{ColorDataVersion} == 4 or $$self{ColorDataVersion} == 5', + Format => 'int16u[4]', + }, + 0x2b8 => { #IB + Name => 'NormalWhiteLevel', + Condition => '$$self{ColorDataVersion} == 4 or $$self{ColorDataVersion} == 5', + Format => 'int16u', + RawConv => '$val || undef', + }, + 0x2b9 => { #IB + Name => 'SpecularWhiteLevel', + Condition => '$$self{ColorDataVersion} == 4 or $$self{ColorDataVersion} == 5', + Format => 'int16u', + }, + 0x2ba => { #IB + Name => 'LinearityUpperMargin', + Condition => '$$self{ColorDataVersion} == 4 or $$self{ColorDataVersion} == 5', + Format => 'int16u', + }, + 0x2cb => { #IB + Name => 'PerChannelBlackLevel', + Condition => '$$self{ColorDataVersion} == 6 or $$self{ColorDataVersion} == 7', + Format => 'int16u[4]', + }, + 0x2cf => [{ #IB + Name => 'NormalWhiteLevel', + Condition => '$$self{ColorDataVersion} == 6 or $$self{ColorDataVersion} == 7', + Format => 'int16u', + RawConv => '$val || undef', + },{ + Name => 'PerChannelBlackLevel', + Condition => '$$self{ColorDataVersion} == 9', + Format => 'int16u[4]', + }], + 0x2d0 => { #IB + Name => 'SpecularWhiteLevel', + Condition => '$$self{ColorDataVersion} == 6 or $$self{ColorDataVersion} == 7', + Format => 'int16u', + }, + 0x2d1 => { #IB + Name => 'LinearityUpperMargin', + Condition => '$$self{ColorDataVersion} == 6 or $$self{ColorDataVersion} == 7', + Format => 'int16u', + }, + 0x2d3 => { #IB + Name => 'NormalWhiteLevel', + Condition => '$$self{ColorDataVersion} == 9', + Format => 'int16u', + RawConv => '$val || undef', + }, + 0x2d4 => { #IB + Name => 'SpecularWhiteLevel', + Condition => '$$self{ColorDataVersion} == 9', + Format => 'int16u', + }, + 0x2d5 => { #IB + Name => 'LinearityUpperMargin', + Condition => '$$self{ColorDataVersion} == 9', + Format => 'int16u', + }, +); + +# color coefficients (ref PH) +%Image::ExifTool::Canon::ColorCoefs = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x00 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, + 0x04 => 'ColorTempAsShot', + 0x05 => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' }, + 0x09 => 'ColorTempAuto', + 0x0a => { Name => 'WB_RGGBLevelsMeasured', Format => 'int16s[4]' }, + 0x0e => 'ColorTempMeasured', + # the following Unknown values are set for the 50D and 5DmkII, and the + # SRAW images of the 40D, and affect thumbnail display for the 50D/5DmkII + # and conversion for all modes of the 40D + 0x0f => { Name => 'WB_RGGBLevelsUnknown', Format => 'int16s[4]', Unknown => 1 }, + 0x13 => { Name => 'ColorTempUnknown', Unknown => 1 }, + 0x14 => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' }, + 0x18 => 'ColorTempDaylight', + 0x19 => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' }, + 0x1d => 'ColorTempShade', + 0x1e => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' }, + 0x22 => 'ColorTempCloudy', + 0x23 => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' }, + 0x27 => 'ColorTempTungsten', + 0x28 => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' }, + 0x2c => 'ColorTempFluorescent', + # (changing the Kelvin values has no effect on image in DPP... why not?) + 0x2d => { Name => 'WB_RGGBLevelsKelvin', Format => 'int16s[4]' }, + 0x31 => 'ColorTempKelvin', + 0x32 => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' }, + 0x36 => 'ColorTempFlash', + 0x37 => { Name => 'WB_RGGBLevelsUnknown2', Format => 'int16s[4]', Unknown => 1 }, + 0x3b => { Name => 'ColorTempUnknown2', Unknown => 1 }, + 0x3c => { Name => 'WB_RGGBLevelsUnknown3', Format => 'int16s[4]', Unknown => 1 }, + 0x40 => { Name => 'ColorTempUnknown3', Unknown => 1 }, + 0x41 => { Name => 'WB_RGGBLevelsUnknown4', Format => 'int16s[4]', Unknown => 1 }, + 0x45 => { Name => 'ColorTempUnknown4', Unknown => 1 }, + 0x46 => { Name => 'WB_RGGBLevelsUnknown5', Format => 'int16s[4]', Unknown => 1 }, + 0x4a => { Name => 'ColorTempUnknown5', Unknown => 1 }, + 0x4b => { Name => 'WB_RGGBLevelsUnknown6', Format => 'int16s[4]', Unknown => 1 }, + 0x4f => { Name => 'ColorTempUnknown6', Unknown => 1 }, + 0x50 => { Name => 'WB_RGGBLevelsUnknown7', Format => 'int16s[4]', Unknown => 1 }, + 0x54 => { Name => 'ColorTempUnknown7', Unknown => 1 }, + 0x55 => { Name => 'WB_RGGBLevelsUnknown8', Format => 'int16s[4]', Unknown => 1 }, + 0x59 => { Name => 'ColorTempUnknown8', Unknown => 1 }, + 0x5a => { Name => 'WB_RGGBLevelsUnknown9', Format => 'int16s[4]', Unknown => 1 }, + 0x5e => { Name => 'ColorTempUnknown9', Unknown => 1 }, + 0x5f => { Name => 'WB_RGGBLevelsUnknown10', Format => 'int16s[4]', Unknown => 1 }, + 0x63 => { Name => 'ColorTempUnknown10', Unknown => 1 }, + 0x64 => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 }, + 0x68 => { Name => 'ColorTempUnknown11', Unknown => 1 }, + 0x69 => { Name => 'WB_RGGBLevelsUnknown12', Format => 'int16s[4]', Unknown => 1 }, + 0x6d => { Name => 'ColorTempUnknown12', Unknown => 1 }, + 0x6e => { Name => 'WB_RGGBLevelsUnknown13', Format => 'int16s[4]', Unknown => 1 }, + 0x72 => { Name => 'ColorTempUnknown13', Unknown => 1 }, +); + +# color coefficients (ref PH/IB) +%Image::ExifTool::Canon::ColorCoefs2 = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x00 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, + 0x07 => 'ColorTempAsShot', + 0x08 => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' }, + 0x0f => 'ColorTempAuto', + 0x10 => { Name => 'WB_RGGBLevelsMeasured', Format => 'int16s[4]' }, + 0x17 => 'ColorTempMeasured', + 0x18 => { Name => 'WB_RGGBLevelsUnknown', Format => 'int16s[4]', Unknown => 1 }, + 0x1f => { Name => 'ColorTempUnknown', Unknown => 1 }, + 0x20 => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' }, + 0x27 => 'ColorTempDaylight', + 0x28 => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' }, + 0x2f => 'ColorTempShade', + 0x30 => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' }, + 0x37 => 'ColorTempCloudy', + 0x38 => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' }, + 0x3f => 'ColorTempTungsten', + 0x40 => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' }, + 0x47 => 'ColorTempFluorescent', + 0x48 => { Name => 'WB_RGGBLevelsKelvin', Format => 'int16s[4]' }, + 0x4f => 'ColorTempKelvin', + 0x50 => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' }, + 0x57 => 'ColorTempFlash', + 0x58 => { Name => 'WB_RGGBLevelsUnknown2', Format => 'int16s[4]', Unknown => 1 }, + 0x5f => { Name => 'ColorTempUnknown2', Unknown => 1 }, + 0x60 => { Name => 'WB_RGGBLevelsUnknown3', Format => 'int16s[4]', Unknown => 1 }, + 0x67 => { Name => 'ColorTempUnknown3', Unknown => 1 }, + 0x68 => { Name => 'WB_RGGBLevelsUnknown4', Format => 'int16s[4]', Unknown => 1 }, + 0x6f => { Name => 'ColorTempUnknown4', Unknown => 1 }, + 0x70 => { Name => 'WB_RGGBLevelsUnknown5', Format => 'int16s[4]', Unknown => 1 }, + 0x77 => { Name => 'ColorTempUnknown5', Unknown => 1 }, + 0x78 => { Name => 'WB_RGGBLevelsUnknown6', Format => 'int16s[4]', Unknown => 1 }, + 0x7f => { Name => 'ColorTempUnknown6', Unknown => 1 }, + 0x80 => { Name => 'WB_RGGBLevelsUnknown7', Format => 'int16s[4]', Unknown => 1 }, + 0x87 => { Name => 'ColorTempUnknown7', Unknown => 1 }, + 0x88 => { Name => 'WB_RGGBLevelsUnknown8', Format => 'int16s[4]', Unknown => 1 }, + 0x8f => { Name => 'ColorTempUnknown8', Unknown => 1 }, + 0x90 => { Name => 'WB_RGGBLevelsUnknown9', Format => 'int16s[4]', Unknown => 1 }, + 0x97 => { Name => 'ColorTempUnknown9', Unknown => 1 }, + 0x98 => { Name => 'WB_RGGBLevelsUnknown10', Format => 'int16s[4]', Unknown => 1 }, + 0x9f => { Name => 'ColorTempUnknown10', Unknown => 1 }, + 0xa0 => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 }, + 0xa7 => { Name => 'ColorTempUnknown11', Unknown => 1 }, + 0xa8 => { Name => 'WB_RGGBLevelsUnknown12', Format => 'int16s[4]', Unknown => 1 }, + 0xaf => { Name => 'ColorTempUnknown12', Unknown => 1 }, + 0xb0 => { Name => 'WB_RGGBLevelsUnknown13', Format => 'int16s[4]', Unknown => 1 }, + 0xb7 => { Name => 'ColorTempUnknown13', Unknown => 1 }, +); + +# color calibration (ref 37) +%Image::ExifTool::Canon::ColorCalib = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # these coefficients are in a different order compared to older + # models (A,B,C in ColorData1/2 vs. C,A,B in ColorData3/4) - PH + # Coefficient A most closely matches the blue curvature, and + # coefficient B most closely matches the red curvature, but the match + # is not perfect, and I don't know what coefficient C is for (certainly + # not a green coefficient) - PH + NOTES => q{ + Camera color calibration data. For the 20D, 350D, 1DmkII and 1DSmkII the + order of the coefficients is A, B, C, Temperature, but for newer models it + is B, C, A, Temperature. These tags are extracted only when the L<Unknown|../ExifTool.html#Unknown> + option is used. + }, + 0x00 => { Name => 'CameraColorCalibration01', %cameraColorCalibration }, + 0x04 => { Name => 'CameraColorCalibration02', %cameraColorCalibration }, + 0x08 => { Name => 'CameraColorCalibration03', %cameraColorCalibration }, + 0x0c => { Name => 'CameraColorCalibration04', %cameraColorCalibration }, + 0x10 => { Name => 'CameraColorCalibration05', %cameraColorCalibration }, + 0x14 => { Name => 'CameraColorCalibration06', %cameraColorCalibration }, + 0x18 => { Name => 'CameraColorCalibration07', %cameraColorCalibration }, + 0x1c => { Name => 'CameraColorCalibration08', %cameraColorCalibration }, + 0x20 => { Name => 'CameraColorCalibration09', %cameraColorCalibration }, + 0x24 => { Name => 'CameraColorCalibration10', %cameraColorCalibration }, + 0x28 => { Name => 'CameraColorCalibration11', %cameraColorCalibration }, + 0x2c => { Name => 'CameraColorCalibration12', %cameraColorCalibration }, + 0x30 => { Name => 'CameraColorCalibration13', %cameraColorCalibration }, + 0x34 => { Name => 'CameraColorCalibration14', %cameraColorCalibration }, + 0x38 => { Name => 'CameraColorCalibration15', %cameraColorCalibration }, +); + +# color calibration2 +%Image::ExifTool::Canon::ColorCalib2 = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'B, C, A, D, Temperature.', + 0x00 => { Name => 'CameraColorCalibration01', %cameraColorCalibration2 }, + 0x05 => { Name => 'CameraColorCalibration02', %cameraColorCalibration2 }, + 0x0a => { Name => 'CameraColorCalibration03', %cameraColorCalibration2 }, + 0x0f => { Name => 'CameraColorCalibration04', %cameraColorCalibration2 }, + 0x14 => { Name => 'CameraColorCalibration05', %cameraColorCalibration2 }, + 0x19 => { Name => 'CameraColorCalibration06', %cameraColorCalibration2 }, + 0x1e => { Name => 'CameraColorCalibration07', %cameraColorCalibration2 }, + 0x23 => { Name => 'CameraColorCalibration08', %cameraColorCalibration2 }, + 0x28 => { Name => 'CameraColorCalibration09', %cameraColorCalibration2 }, + 0x2d => { Name => 'CameraColorCalibration10', %cameraColorCalibration2 }, + 0x32 => { Name => 'CameraColorCalibration11', %cameraColorCalibration2 }, + 0x37 => { Name => 'CameraColorCalibration12', %cameraColorCalibration2 }, + 0x3c => { Name => 'CameraColorCalibration13', %cameraColorCalibration2 }, + 0x41 => { Name => 'CameraColorCalibration14', %cameraColorCalibration2 }, + 0x46 => { Name => 'CameraColorCalibration15', %cameraColorCalibration2 }, +); + +# Color data (MakerNotes tag 0x4001, count=5120) (ref PH) +%Image::ExifTool::Canon::ColorData5 = ( + %binaryDataAttrs, + NOTES => 'These tags are used by many EOS M and PowerShot models.', + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0x00 ], + IS_SUBDIR => [ 0x47, 0xba, 0xff ], + 0x00 => { + Name => 'ColorDataVersion', + DataMember => 'ColorDataVersion', + RawConv => '$$self{ColorDataVersion} = $val', + PrintConv => { + -3 => '-3 (M10/M3)', # (and PowerShot G1X/G1XmkII/G10/G11/G12/G15/G16/G3X/G5X/G7X/G9X/S100/S110/S120/S90/S95/SX1IS/SX50HS/SX60HS) + -4 => '-4 (M100/M5/M6)', # (and PowerShot G1XmkIII/G7XmkII/G9XmkII) + }, + }, + 0x47 => [{ + Name => 'ColorCoefs', + Condition => '$$self{ColorDataVersion} == -3', + Format => 'undef[230]', # ColorTempUnknown13 is last entry + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCoefs' } + },{ + Name => 'ColorCoefs2', + Condition => '$$self{ColorDataVersion} == -4', + Format => 'undef[368]', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCoefs2' } + }], + 0xba => { + Name => 'ColorCalib2', + Condition => '$$self{ColorDataVersion} == -3', + Format => 'undef[150]', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib2' } + }, + 0xff => { + Name => 'ColorCalib2', + Condition => '$$self{ColorDataVersion} == -4', + Format => 'undef[150]', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib2' } + }, + 0x108=> { #IB + Name => 'PerChannelBlackLevel', + Condition => '$$self{ColorDataVersion} == -3', + Format => 'int16s[4]', + }, + 0x14d=> { #IB + Name => 'PerChannelBlackLevel', + Condition => '$$self{ColorDataVersion} == -4', + Format => 'int16s[4]', + }, + 0x0569 => { #PH (NC) + Name => 'NormalWhiteLevel', + Condition => '$$self{ColorDataVersion} == -4', + Format => 'int16u', + }, + 0x056a => { #PH (NC) + Name => 'SpecularWhiteLevel', + Condition => '$$self{ColorDataVersion} == -4', + Format => 'int16u', + }, +); + +# Color data (MakerNotes tag 0x4001, count=1273|1275) (ref PH) +%Image::ExifTool::Canon::ColorData6 = ( + %binaryDataAttrs, + NOTES => 'These tags are used by the EOS 600D and 1200D.', + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + IS_SUBDIR => [ 0xbc ], + 0x00 => { + Name => 'ColorDataVersion', + PrintConv => { + 10 => '10 (600D/1200D)', + }, + }, + 0x3f => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, + 0x43 => 'ColorTempAsShot', + 0x44 => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' }, + 0x48 => 'ColorTempAuto', + 0x49 => { Name => 'WB_RGGBLevelsMeasured', Format => 'int16s[4]' }, + 0x4d => 'ColorTempMeasured', + 0x4e => { Name => 'WB_RGGBLevelsUnknown', Format => 'int16s[4]', Unknown => 1 }, + 0x52 => { Name => 'ColorTempUnknown', Unknown => 1 }, + 0x53 => { Name => 'WB_RGGBLevelsUnknown2', Format => 'int16s[4]', Unknown => 1 }, + 0x57 => { Name => 'ColorTempUnknown2', Unknown => 1 }, + 0x58 => { Name => 'WB_RGGBLevelsUnknown3', Format => 'int16s[4]', Unknown => 1 }, + 0x5c => { Name => 'ColorTempUnknown3', Unknown => 1 }, + 0x5d => { Name => 'WB_RGGBLevelsUnknown4', Format => 'int16s[4]', Unknown => 1 }, + 0x61 => { Name => 'ColorTempUnknown4', Unknown => 1 }, + 0x62 => { Name => 'WB_RGGBLevelsUnknown5', Format => 'int16s[4]', Unknown => 1 }, + 0x66 => { Name => 'ColorTempUnknown5', Unknown => 1 }, + 0x67 => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' }, + 0x6b => 'ColorTempDaylight', + 0x6c => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' }, + 0x70 => 'ColorTempShade', + 0x71 => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' }, + 0x75 => 'ColorTempCloudy', + 0x76 => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' }, + 0x7a => 'ColorTempTungsten', + 0x7b => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' }, + 0x7f => 'ColorTempFluorescent', + 0x80 => { Name => 'WB_RGGBLevelsKelvin', Format => 'int16s[4]' }, + 0x84 => 'ColorTempKelvin', + 0x85 => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' }, + 0x89 => 'ColorTempFlash', + 0x8a => { Name => 'WB_RGGBLevelsUnknown6', Format => 'int16s[4]', Unknown => 1 }, + 0x8e => { Name => 'ColorTempUnknown6', Unknown => 1 }, + 0x8f => { Name => 'WB_RGGBLevelsUnknown7', Format => 'int16s[4]', Unknown => 1 }, + 0x93 => { Name => 'ColorTempUnknown7', Unknown => 1 }, + 0x94 => { Name => 'WB_RGGBLevelsUnknown8', Format => 'int16s[4]', Unknown => 1 }, + 0x98 => { Name => 'ColorTempUnknown8', Unknown => 1 }, + 0x99 => { Name => 'WB_RGGBLevelsUnknown9', Format => 'int16s[4]', Unknown => 1 }, + 0x9d => { Name => 'ColorTempUnknown9', Unknown => 1 }, + 0x9e => { Name => 'WB_RGGBLevelsUnknown10', Format => 'int16s[4]', Unknown => 1 }, + 0xa2 => { Name => 'ColorTempUnknown10', Unknown => 1 }, + 0xa3 => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 }, + 0xa7 => { Name => 'ColorTempUnknown11', Unknown => 1 }, + 0xa8 => { Name => 'WB_RGGBLevelsUnknown12', Format => 'int16s[4]', Unknown => 1 }, + 0xac => { Name => 'ColorTempUnknown12', Unknown => 1 }, + 0xad => { Name => 'WB_RGGBLevelsUnknown13', Format => 'int16s[4]', Unknown => 1 }, + 0xb1 => { Name => 'ColorTempUnknown13', Unknown => 1 }, + 0xb2 => { Name => 'WB_RGGBLevelsUnknown14', Format => 'int16s[4]', Unknown => 1 }, + 0xb6 => { Name => 'ColorTempUnknown14', Unknown => 1 }, + 0xb7 => { Name => 'WB_RGGBLevelsUnknown15', Format => 'int16s[4]', Unknown => 1 }, + 0xbb => { Name => 'ColorTempUnknown15', Unknown => 1 }, + 0xbc => { + Name => 'ColorCalib', + Format => 'undef[120]', + Unknown => 1, + Notes => 'B, C, A, Temperature', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' } + }, + 0x0fb => { Name => 'AverageBlackLevel', Format => 'int16u[4]' }, #IB + 0x194 => { #PH + Name => 'RawMeasuredRGGB', + Format => 'int32u[4]', + Notes => 'raw MeasuredRGGB values, before normalization', + # swap words because the word ordering is big-endian, opposite to the byte ordering + ValueConv => \&SwapWords, + ValueConvInv => \&SwapWords, + }, + 0x1df => { Name => 'PerChannelBlackLevel', Format => 'int16u[4]' }, #IB + 0x1e3 => { Name => 'NormalWhiteLevel', Format => 'int16u', RawConv => '$val || undef' }, #IB + 0x1e4 => { Name => 'SpecularWhiteLevel', Format => 'int16u' }, #IB + 0x1e5 => { Name => 'LinearityUpperMargin', Format => 'int16u' }, #IB +); + +# Color data (MakerNotes tag 0x4001, count=1312,1313,1316) (ref PH) +%Image::ExifTool::Canon::ColorData7 = ( + %binaryDataAttrs, + NOTES => q{ + These tags are used by the EOS 1DX, 5DmkIII, 6D, 7DmkII, 100D, 650D, 700D, + 8000D, M and M2. + }, + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0x00 ], + IS_SUBDIR => [ 0xd5 ], + 0x00 => { + Name => 'ColorDataVersion', + DataMember => 'ColorDataVersion', + RawConv => '$$self{ColorDataVersion} = $val', + PrintConv => { + 10 => '10 (1DX/5DmkIII/6D/70D/100D/650D/700D/M/M2)', + 11 => '11 (7DmkII/750D/760D/8000D)', + }, + }, + # not really sure about the AsShot, Auto and Measured values any more - PH + 0x3f => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, + 0x43 => 'ColorTempAsShot', + 0x44 => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' }, + 0x48 => 'ColorTempAuto', + 0x49 => { Name => 'WB_RGGBLevelsMeasured', Format => 'int16s[4]' }, + 0x4d => 'ColorTempMeasured', + 0x4e => { Name => 'WB_RGGBLevelsUnknown', Format => 'int16s[4]', Unknown => 1 }, + 0x52 => { Name => 'ColorTempUnknown', Unknown => 1 }, + 0x53 => { Name => 'WB_RGGBLevelsUnknown2', Format => 'int16s[4]', Unknown => 1 }, + 0x57 => { Name => 'ColorTempUnknown2', Unknown => 1 }, + 0x58 => { Name => 'WB_RGGBLevelsUnknown3', Format => 'int16s[4]', Unknown => 1 }, + 0x5c => { Name => 'ColorTempUnknown3', Unknown => 1 }, + 0x5d => { Name => 'WB_RGGBLevelsUnknown4', Format => 'int16s[4]', Unknown => 1 }, + 0x61 => { Name => 'ColorTempUnknown4', Unknown => 1 }, + 0x62 => { Name => 'WB_RGGBLevelsUnknown5', Format => 'int16s[4]', Unknown => 1 }, + 0x66 => { Name => 'ColorTempUnknown5', Unknown => 1 }, + 0x67 => { Name => 'WB_RGGBLevelsUnknown6', Format => 'int16s[4]', Unknown => 1 }, + 0x6b => { Name => 'ColorTempUnknown6', Unknown => 1 }, + 0x6c => { Name => 'WB_RGGBLevelsUnknown7', Format => 'int16s[4]', Unknown => 1 }, + 0x70 => { Name => 'ColorTempUnknown7', Unknown => 1 }, + 0x71 => { Name => 'WB_RGGBLevelsUnknown8', Format => 'int16s[4]', Unknown => 1 }, + 0x75 => { Name => 'ColorTempUnknown8', Unknown => 1 }, + 0x76 => { Name => 'WB_RGGBLevelsUnknown9', Format => 'int16s[4]', Unknown => 1 }, + 0x7a => { Name => 'ColorTempUnknown9', Unknown => 1 }, + 0x7b => { Name => 'WB_RGGBLevelsUnknown10', Format => 'int16s[4]', Unknown => 1 }, + 0x7f => { Name => 'ColorTempUnknown10', Unknown => 1 }, + 0x80 => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' }, + 0x84 => 'ColorTempDaylight', + 0x85 => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' }, + 0x89 => 'ColorTempShade', + 0x8a => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' }, + 0x8e => 'ColorTempCloudy', + 0x8f => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' }, + 0x93 => 'ColorTempTungsten', + 0x94 => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' }, + 0x98 => 'ColorTempFluorescent', + 0x99 => { Name => 'WB_RGGBLevelsKelvin', Format => 'int16s[4]' }, + 0x9d => 'ColorTempKelvin', + 0x9e => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' }, + 0xa2 => 'ColorTempFlash', + 0xa3 => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 }, + 0xa7 => { Name => 'ColorTempUnknown11', Unknown => 1 }, + 0xa8 => { Name => 'WB_RGGBLevelsUnknown12', Format => 'int16s[4]', Unknown => 1 }, + 0xac => { Name => 'ColorTempUnknown12', Unknown => 1 }, + 0xad => { Name => 'WB_RGGBLevelsUnknown13', Format => 'int16s[4]', Unknown => 1 }, + 0xb1 => { Name => 'ColorTempUnknown13', Unknown => 1 }, + 0xb2 => { Name => 'WB_RGGBLevelsUnknown14', Format => 'int16s[4]', Unknown => 1 }, + 0xb6 => { Name => 'ColorTempUnknown14', Unknown => 1 }, + 0xb7 => { Name => 'WB_RGGBLevelsUnknown15', Format => 'int16s[4]', Unknown => 1 }, + 0xbb => { Name => 'ColorTempUnknown15', Unknown => 1 }, + 0xbc => { Name => 'WB_RGGBLevelsUnknown16', Format => 'int16s[4]', Unknown => 1 }, + 0xc0 => { Name => 'ColorTempUnknown16', Unknown => 1 }, + 0xc1 => { Name => 'WB_RGGBLevelsUnknown17', Format => 'int16s[4]', Unknown => 1 }, + 0xc5 => { Name => 'ColorTempUnknown17', Unknown => 1 }, + 0xc6 => { Name => 'WB_RGGBLevelsUnknown18', Format => 'int16s[4]', Unknown => 1 }, + 0xca => { Name => 'ColorTempUnknown18', Unknown => 1 }, + 0xcb => { Name => 'WB_RGGBLevelsUnknown19', Format => 'int16s[4]', Unknown => 1 }, + 0xcf => { Name => 'ColorTempUnknown19', Unknown => 1 }, + 0xd0 => { Name => 'WB_RGGBLevelsUnknown20', Format => 'int16s[4]', Unknown => 1 }, + 0xd4 => { Name => 'ColorTempUnknown20', Unknown => 1 }, + 0xd5 => { + Name => 'ColorCalib', + Format => 'undef[120]', + Unknown => 1, + Notes => 'B, C, A, Temperature', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' } + }, + 0x114 => { Name => 'AverageBlackLevel', Format => 'int16u[4]' }, #IB + 0x1ad => { + Name => 'RawMeasuredRGGB', + Condition => '$$self{ColorDataVersion} == 10', + Format => 'int32u[4]', + Notes => 'raw MeasuredRGGB values, before normalization', + # swap words because the word ordering is big-endian, opposite to the byte ordering + ValueConv => \&SwapWords, + ValueConvInv => \&SwapWords, + }, + 0x1f8 => { #IB + Name => 'PerChannelBlackLevel', + Condition => '$$self{ColorDataVersion} == 10', + Format => 'int16u[4]', + }, + 0x1fc => { #IB + Name => 'NormalWhiteLevel', + Condition => '$$self{ColorDataVersion} == 10', + Format => 'int16u', + RawConv => '$val || undef', + }, + 0x1fd => { #IB + Name => 'SpecularWhiteLevel', + Condition => '$$self{ColorDataVersion} == 10', + Format => 'int16u', + }, + 0x1fe => { #IB + Name => 'LinearityUpperMargin', + Condition => '$$self{ColorDataVersion} == 10', + Format => 'int16u', + }, + 0x26b => { + Name => 'RawMeasuredRGGB', + Condition => '$$self{ColorDataVersion} == 11', + Format => 'int32u[4]', + ValueConv => \&SwapWords, + ValueConvInv => \&SwapWords, + }, + 0x2d8 => { + Name => 'PerChannelBlackLevel', + Condition => '$$self{ColorDataVersion} == 11', + Format => 'int16u[4]', + }, + 0x2dc => { + Name => 'NormalWhiteLevel', + Condition => '$$self{ColorDataVersion} == 11', + Format => 'int16u', + RawConv => '$val || undef', + }, + 0x2dd => { + Name => 'SpecularWhiteLevel', + Condition => '$$self{ColorDataVersion} == 11', + Format => 'int16u', + }, + 0x2de => { + Name => 'LinearityUpperMargin', + Condition => '$$self{ColorDataVersion} == 11', + Format => 'int16u', + }, +); + +# Color data (MakerNotes tag 0x4001, count=1560,etc) (ref IB) +%Image::ExifTool::Canon::ColorData8 = ( + %binaryDataAttrs, + NOTES => q{ + These tags are used by the EOS 1DXmkII, 5DS, 5DSR, 5DmkIV, 6DmkII, 77D, 80D, + 200D, 800D, 1300D, 2000D, 4000D and 9000D. + }, + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0 ], + IS_SUBDIR => [ 0x107 ], + 0x00 => { + Name => 'ColorDataVersion', + DataMember => 'ColorDataVersion', + RawConv => '$$self{ColorDataVersion} = $val', + PrintConv => { + 12 => '12 (1DXmkII/5DS/5DSR)', + 13 => '13 (80D/5DmkIV)', #PH + 14 => '14 (1300D/2000D/4000D)', #IB + 15 => '15 (6DmkII/77D/200D/800D,9000D)', #IB + }, + }, + 0x3f => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, + 0x43 => 'ColorTempAsShot', + 0x44 => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' }, + 0x48 => 'ColorTempAuto', + 0x49 => { Name => 'WB_RGGBLevelsMeasured', Format => 'int16s[4]' }, + 0x4d => 'ColorTempMeasured', + 0x4e => { Name => 'WB_RGGBLevelsUnknown', Format => 'int16s[4]', Unknown => 1 }, + 0x52 => { Name => 'ColorTempUnknown', Unknown => 1 }, + 0x53 => { Name => 'WB_RGGBLevelsUnknown2', Format => 'int16s[4]', Unknown => 1 }, + 0x57 => { Name => 'ColorTempUnknown2', Unknown => 1 }, + 0x58 => { Name => 'WB_RGGBLevelsUnknown3', Format => 'int16s[4]', Unknown => 1 }, + 0x5c => { Name => 'ColorTempUnknown3', Unknown => 1 }, + 0x5d => { Name => 'WB_RGGBLevelsUnknown4', Format => 'int16s[4]', Unknown => 1 }, + 0x61 => { Name => 'ColorTempUnknown4', Unknown => 1 }, + 0x62 => { Name => 'WB_RGGBLevelsUnknown5', Format => 'int16s[4]', Unknown => 1 }, + 0x66 => { Name => 'ColorTempUnknown5', Unknown => 1 }, + 0x67 => { Name => 'WB_RGGBLevelsUnknown6', Format => 'int16s[4]', Unknown => 1 }, + 0x6b => { Name => 'ColorTempUnknown6', Unknown => 1 }, + 0x6c => { Name => 'WB_RGGBLevelsUnknown7', Format => 'int16s[4]', Unknown => 1 }, + 0x70 => { Name => 'ColorTempUnknown7', Unknown => 1 }, + 0x71 => { Name => 'WB_RGGBLevelsUnknown8', Format => 'int16s[4]', Unknown => 1 }, + 0x75 => { Name => 'ColorTempUnknown8', Unknown => 1 }, + 0x76 => { Name => 'WB_RGGBLevelsUnknown9', Format => 'int16s[4]', Unknown => 1 }, + 0x7a => { Name => 'ColorTempUnknown9', Unknown => 1 }, + 0x7b => { Name => 'WB_RGGBLevelsUnknown10', Format => 'int16s[4]', Unknown => 1 }, + 0x7f => { Name => 'ColorTempUnknown10', Unknown => 1 }, + 0x80 => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 }, + 0x84 => { Name => 'ColorTempUnknown11', Unknown => 1 }, + 0x85 => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' }, + 0x89 => 'ColorTempDaylight', + 0x8a => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' }, + 0x8e => 'ColorTempShade', + 0x8f => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' }, + 0x93 => 'ColorTempCloudy', + 0x94 => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' }, + 0x98 => 'ColorTempTungsten', + 0x99 => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' }, + 0x9d => 'ColorTempFluorescent', + 0x9e => { Name => 'WB_RGGBLevelsKelvin', Format => 'int16s[4]' }, + 0xa2 => 'ColorTempKelvin', + 0xa3 => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' }, + 0xa7 => 'ColorTempFlash', + 0xa8 => { Name => 'WB_RGGBLevelsUnknown12', Format => 'int16s[4]', Unknown => 1 }, + 0xac => { Name => 'ColorTempUnknown12', Unknown => 1 }, + 0xad => { Name => 'WB_RGGBLevelsUnknown13', Format => 'int16s[4]', Unknown => 1 }, + 0xb1 => { Name => 'ColorTempUnknown13', Unknown => 1 }, + 0xb2 => { Name => 'WB_RGGBLevelsUnknown14', Format => 'int16s[4]', Unknown => 1 }, + 0xb6 => { Name => 'ColorTempUnknown14', Unknown => 1 }, + 0xb7 => { Name => 'WB_RGGBLevelsUnknown15', Format => 'int16s[4]', Unknown => 1 }, + 0xbb => { Name => 'ColorTempUnknown15', Unknown => 1 }, + 0xbc => { Name => 'WB_RGGBLevelsUnknown16', Format => 'int16s[4]', Unknown => 1 }, + 0xc0 => { Name => 'ColorTempUnknown16', Unknown => 1 }, + 0xc1 => { Name => 'WB_RGGBLevelsUnknown17', Format => 'int16s[4]', Unknown => 1 }, + 0xc5 => { Name => 'ColorTempUnknown17', Unknown => 1 }, + 0xc6 => { Name => 'WB_RGGBLevelsUnknown18', Format => 'int16s[4]', Unknown => 1 }, + 0xca => { Name => 'ColorTempUnknown18', Unknown => 1 }, + 0xcb => { Name => 'WB_RGGBLevelsUnknown19', Format => 'int16s[4]', Unknown => 1 }, + 0xcf => { Name => 'ColorTempUnknown19', Unknown => 1 }, + 0xd0 => { Name => 'WB_RGGBLevelsUnknown20', Format => 'int16s[4]', Unknown => 1 }, + 0xd4 => { Name => 'ColorTempUnknown20', Unknown => 1 }, + 0xd5 => { Name => 'WB_RGGBLevelsUnknown21', Format => 'int16s[4]', Unknown => 1 }, + 0xd9 => { Name => 'ColorTempUnknown21', Unknown => 1 }, + 0xda => { Name => 'WB_RGGBLevelsUnknown22', Format => 'int16s[4]', Unknown => 1 }, + 0xde => { Name => 'ColorTempUnknown22', Unknown => 1 }, + 0xdf => { Name => 'WB_RGGBLevelsUnknown23', Format => 'int16s[4]', Unknown => 1 }, + 0xe3 => { Name => 'ColorTempUnknown23', Unknown => 1 }, + 0xe4 => { Name => 'WB_RGGBLevelsUnknown24', Format => 'int16s[4]', Unknown => 1 }, + 0xe8 => { Name => 'ColorTempUnknown24', Unknown => 1 }, + 0xe9 => { Name => 'WB_RGGBLevelsUnknown25', Format => 'int16s[4]', Unknown => 1 }, + 0xed => { Name => 'ColorTempUnknown25', Unknown => 1 }, + 0xee => { Name => 'WB_RGGBLevelsUnknown26', Format => 'int16s[4]', Unknown => 1 }, + 0xf2 => { Name => 'ColorTempUnknown26', Unknown => 1 }, + 0xf3 => { Name => 'WB_RGGBLevelsUnknown27', Format => 'int16s[4]', Unknown => 1 }, + 0xf7 => { Name => 'ColorTempUnknown27', Unknown => 1 }, + 0xf8 => { Name => 'WB_RGGBLevelsUnknown28', Format => 'int16s[4]', Unknown => 1 }, + 0xfc => { Name => 'ColorTempUnknown28', Unknown => 1 }, + 0xfd => { Name => 'WB_RGGBLevelsUnknown29', Format => 'int16s[4]', Unknown => 1 }, + 0x101 => { Name => 'ColorTempUnknown29', Unknown => 1 }, + 0x102 => { Name => 'WB_RGGBLevelsUnknown30', Format => 'int16s[4]', Unknown => 1 }, + 0x106 => { Name => 'ColorTempUnknown30', Unknown => 1 }, + + 0x107 => { + Name => 'ColorCalib', + Format => 'undef[120]', + Unknown => 1, + Notes => 'B, C, A, Temperature', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' } + }, + 0x146 => { Name => 'AverageBlackLevel', Format => 'int16u[4]' }, + 0x22c => { + Name => 'PerChannelBlackLevel', + Condition => '$$self{ColorDataVersion} == 14', + Format => 'int16u[4]', + Notes => '1300D', + }, + 0x230 => { + Name => 'NormalWhiteLevel', + Condition => '$$self{ColorDataVersion} == 14', + Format => 'int16u', + Notes => '1300D', + RawConv => '$val || undef', + }, + 0x231 => { + Name => 'SpecularWhiteLevel', + Condition => '$$self{ColorDataVersion} == 14', + Format => 'int16u', + Notes => '1300D', + }, + 0x232 => { + Name => 'LinearityUpperMargin', + Condition => '$$self{ColorDataVersion} == 14', + Format => 'int16u', + Notes => '1300D', + }, + 0x30a => { + Name => 'PerChannelBlackLevel', + Condition => '$$self{ColorDataVersion} < 14 or $$self{ColorDataVersion} == 15', + Format => 'int16u[4]', + Notes => '5DS, 5DS R, 77D, 80D and 800D', + }, + 0x30e => { + Name => 'NormalWhiteLevel', + Condition => '$$self{ColorDataVersion} < 14 or $$self{ColorDataVersion} == 15', + Format => 'int16u', + Notes => '5DS, 5DS R, 77D, 80D and 800D', + RawConv => '$val || undef', + }, + 0x30f => { + Name => 'SpecularWhiteLevel', + Condition => '$$self{ColorDataVersion} < 14 or $$self{ColorDataVersion} == 15', + Format => 'int16u', + Notes => '5DS, 5DS R, 77D, 80D and 800D', + }, + 0x310 => { + Name => 'LinearityUpperMargin', + Condition => '$$self{ColorDataVersion} < 14 or $$self{ColorDataVersion} == 15', + Format => 'int16u', + Notes => '5DS, 5DS R, 77D, 80D and 800D', + }, +); + +# Color data (MakerNotes tag 0x4001, count=1820,etc) (ref PH) +%Image::ExifTool::Canon::ColorData9 = ( + %binaryDataAttrs, + NOTES => 'These tags are used by the M6mkII, M50, M200, EOS R, RP, 90D, 250D and 850D', + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0 ], + IS_SUBDIR => [ 0x10a ], + 0x00 => { + Name => 'ColorDataVersion', + DataMember => 'ColorDataVersion', + RawConv => '$$self{ColorDataVersion} = $val', + PrintConv => { + 16 => '16 (M50)', + 17 => '17 (EOS R)', # (and PowerShot SX740HS) + 18 => '18 (EOS RP/250D)', # (and PowerShot SX70HS) + 19 => '19 (90D/850D/M6mkII/M200)',# (and PowerShot G7XmkIII) + }, + }, + 0x47 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, + 0x4b => 'ColorTempAsShot', + 0x4c => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' }, + 0x50 => 'ColorTempAuto', + 0x51 => { Name => 'WB_RGGBLevelsMeasured', Format => 'int16s[4]' }, + 0x55 => 'ColorTempMeasured', + 0x56 => { Name => 'WB_RGGBLevelsUnknown', Format => 'int16s[4]', Unknown => 1 }, + 0x5a => { Name => 'ColorTempUnknown', Unknown => 1 }, + 0x5b => { Name => 'WB_RGGBLevelsUnknown2', Format => 'int16s[4]', Unknown => 1 }, + 0x5f => { Name => 'ColorTempUnknown2', Unknown => 1 }, + 0x60 => { Name => 'WB_RGGBLevelsUnknown3', Format => 'int16s[4]', Unknown => 1 }, + 0x64 => { Name => 'ColorTempUnknown3', Unknown => 1 }, + 0x65 => { Name => 'WB_RGGBLevelsUnknown4', Format => 'int16s[4]', Unknown => 1 }, + 0x69 => { Name => 'ColorTempUnknown4', Unknown => 1 }, + 0x6a => { Name => 'WB_RGGBLevelsUnknown5', Format => 'int16s[4]', Unknown => 1 }, + 0x6e => { Name => 'ColorTempUnknown5', Unknown => 1 }, + 0x6f => { Name => 'WB_RGGBLevelsUnknown6', Format => 'int16s[4]', Unknown => 1 }, + 0x73 => { Name => 'ColorTempUnknown6', Unknown => 1 }, + 0x74 => { Name => 'WB_RGGBLevelsUnknown7', Format => 'int16s[4]', Unknown => 1 }, + 0x78 => { Name => 'ColorTempUnknown7', Unknown => 1 }, + 0x79 => { Name => 'WB_RGGBLevelsUnknown8', Format => 'int16s[4]', Unknown => 1 }, + 0x7d => { Name => 'ColorTempUnknown8', Unknown => 1 }, + 0x7e => { Name => 'WB_RGGBLevelsUnknown9', Format => 'int16s[4]', Unknown => 1 }, + 0x82 => { Name => 'ColorTempUnknown9', Unknown => 1 }, + 0x83 => { Name => 'WB_RGGBLevelsUnknown10', Format => 'int16s[4]', Unknown => 1 }, + 0x87 => { Name => 'ColorTempUnknown10', Unknown => 1 }, + 0x88 => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' }, + 0x8c => 'ColorTempDaylight', + 0x8d => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' }, + 0x91 => 'ColorTempShade', + 0x92 => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' }, + 0x96 => 'ColorTempCloudy', + 0x97 => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' }, + 0x9b => 'ColorTempTungsten', + 0x9c => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' }, + 0xa0 => 'ColorTempFluorescent', + 0xa1 => { Name => 'WB_RGGBLevelsKelvin', Format => 'int16s[4]' }, + 0xa5 => 'ColorTempKelvin', + 0xa6 => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' }, + 0xaa => 'ColorTempFlash', + 0xab => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 }, + 0xaf => { Name => 'ColorTempUnknown11', Unknown => 1 }, + 0xb0 => { Name => 'WB_RGGBLevelsUnknown12', Format => 'int16s[4]', Unknown => 1 }, + 0xb4 => { Name => 'ColorTempUnknown12', Unknown => 1 }, + 0xb5 => { Name => 'WB_RGGBLevelsUnknown13', Format => 'int16s[4]', Unknown => 1 }, + 0xb9 => { Name => 'ColorTempUnknown13', Unknown => 1 }, + 0xba => { Name => 'WB_RGGBLevelsUnknown14', Format => 'int16s[4]', Unknown => 1 }, + 0xbe => { Name => 'ColorTempUnknown14', Unknown => 1 }, + 0xbf => { Name => 'WB_RGGBLevelsUnknown15', Format => 'int16s[4]', Unknown => 1 }, + 0xc3 => { Name => 'ColorTempUnknown15', Unknown => 1 }, + 0xc4 => { Name => 'WB_RGGBLevelsUnknown16', Format => 'int16s[4]', Unknown => 1 }, + 0xc8 => { Name => 'ColorTempUnknown16', Unknown => 1 }, + 0xc9 => { Name => 'WB_RGGBLevelsUnknown17', Format => 'int16s[4]', Unknown => 1 }, + 0xcd => { Name => 'ColorTempUnknown17', Unknown => 1 }, + 0xce => { Name => 'WB_RGGBLevelsUnknown18', Format => 'int16s[4]', Unknown => 1 }, + 0xd2 => { Name => 'ColorTempUnknown18', Unknown => 1 }, + 0xd3 => { Name => 'WB_RGGBLevelsUnknown19', Format => 'int16s[4]', Unknown => 1 }, + 0xd7 => { Name => 'ColorTempUnknown19', Unknown => 1 }, + 0xd8 => { Name => 'WB_RGGBLevelsUnknown20', Format => 'int16s[4]', Unknown => 1 }, + 0xdc => { Name => 'ColorTempUnknown20', Unknown => 1 }, + 0xdd => { Name => 'WB_RGGBLevelsUnknown21', Format => 'int16s[4]', Unknown => 1 }, + 0xe1 => { Name => 'ColorTempUnknown21', Unknown => 1 }, + 0xe2 => { Name => 'WB_RGGBLevelsUnknown22', Format => 'int16s[4]', Unknown => 1 }, + 0xe6 => { Name => 'ColorTempUnknown22', Unknown => 1 }, + 0xe7 => { Name => 'WB_RGGBLevelsUnknown23', Format => 'int16s[4]', Unknown => 1 }, + 0xeb => { Name => 'ColorTempUnknown23', Unknown => 1 }, + 0xec => { Name => 'WB_RGGBLevelsUnknown24', Format => 'int16s[4]', Unknown => 1 }, + 0xf0 => { Name => 'ColorTempUnknown24', Unknown => 1 }, + 0xf1 => { Name => 'WB_RGGBLevelsUnknown25', Format => 'int16s[4]', Unknown => 1 }, + 0xf5 => { Name => 'ColorTempUnknown25', Unknown => 1 }, + 0xf6 => { Name => 'WB_RGGBLevelsUnknown26', Format => 'int16s[4]', Unknown => 1 }, + 0xfa => { Name => 'ColorTempUnknown26', Unknown => 1 }, + 0xfb => { Name => 'WB_RGGBLevelsUnknown27', Format => 'int16s[4]', Unknown => 1 }, + 0xff => { Name => 'ColorTempUnknown27', Unknown => 1 }, + 0x100=> { Name => 'WB_RGGBLevelsUnknown28', Format => 'int16s[4]', Unknown => 1 }, + 0x104=> { Name => 'ColorTempUnknown28', Unknown => 1 }, + 0x105=> { Name => 'WB_RGGBLevelsUnknown29', Format => 'int16s[4]', Unknown => 1 }, + 0x109=> { Name => 'ColorTempUnknown29', Unknown => 1 }, + 0x10a => { #IB + Name => 'ColorCalib', + Format => 'undef[120]', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' } + }, + 0x149 => { #IB + Name => 'PerChannelBlackLevel', + Format => 'int16u[4]', + }, + # 0x318 - PerChannelBlackLevel again (ref IB) + 0x31c => { #IB + Name => 'NormalWhiteLevel', + Format => 'int16u', + RawConv => '$val || undef', + }, + 0x31d => { #IB + Name => 'SpecularWhiteLevel', + Format => 'int16u', + }, + 0x31e => { #IB + Name => 'LinearityUpperMargin', + Format => 'int16u', + }, +); + +# Color data (MakerNotes tag 0x4001, count=2024,3656) +# (same as ColorData9 but shifted up by 0x0e, ref PH) +%Image::ExifTool::Canon::ColorData10 = ( + %binaryDataAttrs, + NOTES => 'These tags are used by the R5, R5 and EOS 1DXmkIII.', + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0 ], + IS_SUBDIR => [ 0x118 ], + 0x00 => { + Name => 'ColorDataVersion', + DataMember => 'ColorDataVersion', + RawConv => '$$self{ColorDataVersion} = $val', + PrintConv => { + 32 => '32 (1DXmkIII)', #IB + 33 => '33 (R5/R6)', + }, + }, + 0x55 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, + 0x59 => 'ColorTempAsShot', + 0x5a => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' }, + 0x5e => 'ColorTempAuto', + 0x5f => { Name => 'WB_RGGBLevelsMeasured', Format => 'int16s[4]' }, + 0x63 => 'ColorTempMeasured', + 0x64 => { Name => 'WB_RGGBLevelsUnknown', Format => 'int16s[4]', Unknown => 1 }, + 0x68 => { Name => 'ColorTempUnknown', Unknown => 1 }, + 0x69 => { Name => 'WB_RGGBLevelsUnknown2', Format => 'int16s[4]', Unknown => 1 }, + 0x6d => { Name => 'ColorTempUnknown2', Unknown => 1 }, + 0x6e => { Name => 'WB_RGGBLevelsUnknown3', Format => 'int16s[4]', Unknown => 1 }, + 0x72 => { Name => 'ColorTempUnknown3', Unknown => 1 }, + 0x73 => { Name => 'WB_RGGBLevelsUnknown4', Format => 'int16s[4]', Unknown => 1 }, + 0x77 => { Name => 'ColorTempUnknown4', Unknown => 1 }, + 0x78 => { Name => 'WB_RGGBLevelsUnknown5', Format => 'int16s[4]', Unknown => 1 }, + 0x7c => { Name => 'ColorTempUnknown5', Unknown => 1 }, + 0x7d => { Name => 'WB_RGGBLevelsUnknown6', Format => 'int16s[4]', Unknown => 1 }, + 0x81 => { Name => 'ColorTempUnknown6', Unknown => 1 }, + 0x82 => { Name => 'WB_RGGBLevelsUnknown7', Format => 'int16s[4]', Unknown => 1 }, + 0x86 => { Name => 'ColorTempUnknown7', Unknown => 1 }, + 0x87 => { Name => 'WB_RGGBLevelsUnknown8', Format => 'int16s[4]', Unknown => 1 }, + 0x8b => { Name => 'ColorTempUnknown8', Unknown => 1 }, + 0x8c => { Name => 'WB_RGGBLevelsUnknown9', Format => 'int16s[4]', Unknown => 1 }, + 0x90 => { Name => 'ColorTempUnknown9', Unknown => 1 }, + 0x91 => { Name => 'WB_RGGBLevelsUnknown10', Format => 'int16s[4]', Unknown => 1 }, + 0x95 => { Name => 'ColorTempUnknown10', Unknown => 1 }, + 0x96 => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' }, + 0x9a => 'ColorTempDaylight', + 0x9b => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' }, + 0x9f => 'ColorTempShade', + 0xa0 => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' }, + 0xa4 => 'ColorTempCloudy', + 0xa5 => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' }, + 0xa9 => 'ColorTempTungsten', + 0xaa => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' }, + 0xae => 'ColorTempFluorescent', + 0xaf => { Name => 'WB_RGGBLevelsKelvin', Format => 'int16s[4]' }, + 0xb3 => 'ColorTempKelvin', + 0xb4 => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' }, + 0xb8 => 'ColorTempFlash', + 0xb9 => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 }, + 0xbd => { Name => 'ColorTempUnknown11', Unknown => 1 }, + 0xbe => { Name => 'WB_RGGBLevelsUnknown12', Format => 'int16s[4]', Unknown => 1 }, + 0xc2 => { Name => 'ColorTempUnknown12', Unknown => 1 }, + 0xc3 => { Name => 'WB_RGGBLevelsUnknown13', Format => 'int16s[4]', Unknown => 1 }, + 0xc7 => { Name => 'ColorTempUnknown13', Unknown => 1 }, + 0xc8 => { Name => 'WB_RGGBLevelsUnknown14', Format => 'int16s[4]', Unknown => 1 }, + 0xcc => { Name => 'ColorTempUnknown14', Unknown => 1 }, + 0xcd => { Name => 'WB_RGGBLevelsUnknown15', Format => 'int16s[4]', Unknown => 1 }, + 0xd1 => { Name => 'ColorTempUnknown15', Unknown => 1 }, + 0xd2 => { Name => 'WB_RGGBLevelsUnknown16', Format => 'int16s[4]', Unknown => 1 }, + 0xd6 => { Name => 'ColorTempUnknown16', Unknown => 1 }, + 0xd7 => { Name => 'WB_RGGBLevelsUnknown17', Format => 'int16s[4]', Unknown => 1 }, + 0xdb => { Name => 'ColorTempUnknown17', Unknown => 1 }, + 0xdc => { Name => 'WB_RGGBLevelsUnknown18', Format => 'int16s[4]', Unknown => 1 }, + 0xe0 => { Name => 'ColorTempUnknown18', Unknown => 1 }, + 0xe1 => { Name => 'WB_RGGBLevelsUnknown19', Format => 'int16s[4]', Unknown => 1 }, + 0xe5 => { Name => 'ColorTempUnknown19', Unknown => 1 }, + 0xe6 => { Name => 'WB_RGGBLevelsUnknown20', Format => 'int16s[4]', Unknown => 1 }, + 0xea => { Name => 'ColorTempUnknown20', Unknown => 1 }, + 0xeb => { Name => 'WB_RGGBLevelsUnknown21', Format => 'int16s[4]', Unknown => 1 }, + 0xef => { Name => 'ColorTempUnknown21', Unknown => 1 }, + 0xf0 => { Name => 'WB_RGGBLevelsUnknown22', Format => 'int16s[4]', Unknown => 1 }, + 0xf4 => { Name => 'ColorTempUnknown22', Unknown => 1 }, + 0xf5 => { Name => 'WB_RGGBLevelsUnknown23', Format => 'int16s[4]', Unknown => 1 }, + 0xf9 => { Name => 'ColorTempUnknown23', Unknown => 1 }, + 0xfa => { Name => 'WB_RGGBLevelsUnknown24', Format => 'int16s[4]', Unknown => 1 }, + 0xfe => { Name => 'ColorTempUnknown24', Unknown => 1 }, + 0xff => { Name => 'WB_RGGBLevelsUnknown25', Format => 'int16s[4]', Unknown => 1 }, + 0x103=> { Name => 'ColorTempUnknown25', Unknown => 1 }, + 0x104=> { Name => 'WB_RGGBLevelsUnknown26', Format => 'int16s[4]', Unknown => 1 }, + 0x108=> { Name => 'ColorTempUnknown26', Unknown => 1 }, + 0x109=> { Name => 'WB_RGGBLevelsUnknown27', Format => 'int16s[4]', Unknown => 1 }, + 0x10d=> { Name => 'ColorTempUnknown27', Unknown => 1 }, + 0x10e=> { Name => 'WB_RGGBLevelsUnknown28', Format => 'int16s[4]', Unknown => 1 }, + 0x112=> { Name => 'ColorTempUnknown28', Unknown => 1 }, + 0x113=> { Name => 'WB_RGGBLevelsUnknown29', Format => 'int16s[4]', Unknown => 1 }, + 0x117=> { Name => 'ColorTempUnknown29', Unknown => 1 }, + 0x118 => { + Name => 'ColorCalib', + Format => 'undef[120]', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' } + }, + 0x157 => { + Name => 'PerChannelBlackLevel', + Format => 'int16u[4]', + }, + # 0x326 - PerChannelBlackLevel again + 0x32a => { + Name => 'NormalWhiteLevel', + Format => 'int16u', + RawConv => '$val || undef', + }, + 0x32b => { + Name => 'SpecularWhiteLevel', + Format => 'int16u', + }, + 0x32c => { + Name => 'LinearityUpperMargin', + Format => 'int16u', + }, +); + +# Color data (MakerNotes tag 0x4001, count=3973, ref IB) +%Image::ExifTool::Canon::ColorData11 = ( + %binaryDataAttrs, + NOTES => 'These tags are used by the EOS R3', + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0 ], + IS_SUBDIR => [ 0x12c ], + 0x00 => { + Name => 'ColorDataVersion', + DataMember => 'ColorDataVersion', + RawConv => '$$self{ColorDataVersion} = $val', + PrintConv => { + 34 => '34 (R3)', #IB + }, + }, + 0x69 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, + 0x6d => 'ColorTempAsShot', + 0x6e => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' }, + 0x72 => 'ColorTempAuto', + 0x73 => { Name => 'WB_RGGBLevelsMeasured', Format => 'int16s[4]' }, + 0x77 => 'ColorTempMeasured', + 0x78 => { Name => 'WB_RGGBLevelsUnknown', Format => 'int16s[4]', Unknown => 1 }, + 0x7c => { Name => 'ColorTempUnknown', Unknown => 1 }, + 0x7d => { Name => 'WB_RGGBLevelsUnknown2', Format => 'int16s[4]', Unknown => 1 }, + 0x81 => { Name => 'ColorTempUnknown2', Unknown => 1 }, + 0x82 => { Name => 'WB_RGGBLevelsUnknown3', Format => 'int16s[4]', Unknown => 1 }, + 0x86 => { Name => 'ColorTempUnknown3', Unknown => 1 }, + 0x87 => { Name => 'WB_RGGBLevelsUnknown4', Format => 'int16s[4]', Unknown => 1 }, + 0x8b => { Name => 'ColorTempUnknown4', Unknown => 1 }, + 0x8c => { Name => 'WB_RGGBLevelsUnknown5', Format => 'int16s[4]', Unknown => 1 }, + 0x90 => { Name => 'ColorTempUnknown5', Unknown => 1 }, + 0x91 => { Name => 'WB_RGGBLevelsUnknown6', Format => 'int16s[4]', Unknown => 1 }, + 0x95 => { Name => 'ColorTempUnknown6', Unknown => 1 }, + 0x96 => { Name => 'WB_RGGBLevelsUnknown7', Format => 'int16s[4]', Unknown => 1 }, + 0x9a => { Name => 'ColorTempUnknown7', Unknown => 1 }, + 0x9b => { Name => 'WB_RGGBLevelsUnknown8', Format => 'int16s[4]', Unknown => 1 }, + 0x9f => { Name => 'ColorTempUnknown8', Unknown => 1 }, + 0xa0 => { Name => 'WB_RGGBLevelsUnknown9', Format => 'int16s[4]', Unknown => 1 }, + 0xa4 => { Name => 'ColorTempUnknown9', Unknown => 1 }, + 0xa5 => { Name => 'WB_RGGBLevelsUnknown10', Format => 'int16s[4]', Unknown => 1 }, + 0xa9 => { Name => 'ColorTempUnknown10', Unknown => 1 }, + 0xaa => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 }, + 0xae => { Name => 'ColorTempUnknown11', Unknown => 1 }, + 0xaf => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 }, + 0xb3 => { Name => 'ColorTempUnknown11', Unknown => 1 }, + 0xb4 => { Name => 'WB_RGGBLevelsUnknown12', Format => 'int16s[4]', Unknown => 1 }, + 0xb8 => { Name => 'ColorTempUnknown12', Unknown => 1 }, + 0xb9 => { Name => 'WB_RGGBLevelsUnknown13', Format => 'int16s[4]', Unknown => 1 }, + 0xbd => { Name => 'ColorTempUnknown13', Unknown => 1 }, + 0xbe => { Name => 'WB_RGGBLevelsUnknown14', Format => 'int16s[4]', Unknown => 1 }, + 0xc2 => { Name => 'ColorTempUnknown14', Unknown => 1 }, + 0xc3 => { Name => 'WB_RGGBLevelsUnknown15', Format => 'int16s[4]', Unknown => 1 }, + 0xc7 => { Name => 'ColorTempUnknown15', Unknown => 1 }, + 0xc8 => { Name => 'WB_RGGBLevelsUnknown16', Format => 'int16s[4]', Unknown => 1 }, + 0xcc => { Name => 'ColorTempUnknown16', Unknown => 1 }, + 0xcd => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' }, + 0xd1 => 'ColorTempDaylight', + 0xd2 => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' }, + 0xd6 => 'ColorTempShade', + 0xd7 => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' }, + 0xdb => 'ColorTempCloudy', + 0xdc => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' }, + 0xe0 => 'ColorTempTungsten', + 0xe1 => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' }, + 0xe5 => 'ColorTempFluorescent', + 0xe6 => { Name => 'WB_RGGBLevelsKelvin', Format => 'int16s[4]' }, + 0xea => 'ColorTempKelvin', + 0xeb => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' }, + 0xef => 'ColorTempFlash', + 0xf0 => { Name => 'WB_RGGBLevelsUnknown17', Format => 'int16s[4]', Unknown => 1 }, + 0xf4 => { Name => 'ColorTempUnknown17', Unknown => 1 }, + 0xf5 => { Name => 'WB_RGGBLevelsUnknown18', Format => 'int16s[4]', Unknown => 1 }, + 0xf9 => { Name => 'ColorTempUnknown18', Unknown => 1 }, + 0xfa => { Name => 'WB_RGGBLevelsUnknown19', Format => 'int16s[4]', Unknown => 1 }, + 0xfe => { Name => 'ColorTempUnknown19', Unknown => 1 }, + 0xff => { Name => 'WB_RGGBLevelsUnknown20', Format => 'int16s[4]', Unknown => 1 }, + 0x103 => { Name => 'ColorTempUnknown20', Unknown => 1 }, + 0x104 => { Name => 'WB_RGGBLevelsUnknown21', Format => 'int16s[4]', Unknown => 1 }, + 0x108 => { Name => 'ColorTempUnknown21', Unknown => 1 }, + 0x109 => { Name => 'WB_RGGBLevelsUnknown22', Format => 'int16s[4]', Unknown => 1 }, + 0x10d => { Name => 'ColorTempUnknown22', Unknown => 1 }, + 0x10e => { Name => 'WB_RGGBLevelsUnknown23', Format => 'int16s[4]', Unknown => 1 }, + 0x112 => { Name => 'ColorTempUnknown23', Unknown => 1 }, + 0x113 => { Name => 'WB_RGGBLevelsUnknown24', Format => 'int16s[4]', Unknown => 1 }, + 0x117 => { Name => 'ColorTempUnknown24', Unknown => 1 }, + 0x118 => { Name => 'WB_RGGBLevelsUnknown25', Format => 'int16s[4]', Unknown => 1 }, + 0x11c => { Name => 'ColorTempUnknown25', Unknown => 1 }, + 0x11d => { Name => 'WB_RGGBLevelsUnknown26', Format => 'int16s[4]', Unknown => 1 }, + 0x121 => { Name => 'ColorTempUnknown26', Unknown => 1 }, + 0x122 => { Name => 'WB_RGGBLevelsUnknown27', Format => 'int16s[4]', Unknown => 1 }, + 0x126 => { Name => 'ColorTempUnknown27', Unknown => 1 }, + 0x12c => { + Name => 'ColorCalib', + Format => 'undef[120]', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' } + }, + 0x16b => { + Name => 'PerChannelBlackLevel', + Format => 'int16u[4]', + }, + # 0x27c - PerChannelBlackLevel again + 0x280 => { + Name => 'NormalWhiteLevel', + Format => 'int16u', + RawConv => '$val || undef', + }, + 0x281 => { + Name => 'SpecularWhiteLevel', + Format => 'int16u', + }, + 0x282 => { + Name => 'LinearityUpperMargin', + Format => 'int16u', + }, +); + +# Unknown color data (MakerNotes tag 0x4001) +%Image::ExifTool::Canon::ColorDataUnknown = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int16s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x00 => 'ColorDataVersion', +); + +# Color information (MakerNotes tag 0x4003) (ref PH) +%Image::ExifTool::Canon::ColorInfo = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 1 => { + Condition => '$$self{Model} =~ /EOS-1D/', + Name => 'Saturation', + %Image::ExifTool::Exif::printParameter, + }, + 2 => { + Name => 'ColorTone', + %Image::ExifTool::Exif::printParameter, + }, + 3 => { + Name => 'ColorSpace', + RawConv => '$val ? $val : undef', # ignore tag if zero + PrintConv => { + 1 => 'sRGB', + 2 => 'Adobe RGB', + }, + }, +); + +# AF micro-adjustment information (MakerNotes tag 0x4013) (ref PH) +%Image::ExifTool::Canon::AFMicroAdj = ( + %binaryDataAttrs, + FORMAT => 'int32s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 1 => { + Name => 'AFMicroAdjMode', + PrintConv => { + 0 => 'Disable', + 1 => 'Adjust all by the same amount', + 2 => 'Adjust by lens', + # 3 - seen this for EOS 77D, which doesn't have an AF Micro Adjust feature - PH + }, + }, + 2 => { + Name => 'AFMicroAdjValue', + Format => 'rational64s', + }, +); + +# Vignetting correction information (MakerNotes tag 0x4015) +%Image::ExifTool::Canon::VignettingCorr = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'This information is found in images from newer EOS models.', + 0 => { + Name => 'VignettingCorrVersion', + Format => 'int8u', + Writable => 0, + }, + 2 => { + Name => 'PeripheralLighting', + PrintConv => \%offOn, + }, + 3 => { + Name => 'DistortionCorrection', + PrintConv => \%offOn, + }, + 4 => { + Name => 'ChromaticAberrationCorr', + PrintConv => \%offOn, + }, + 5 => { + Name => 'ChromaticAberrationCorr', + PrintConv => \%offOn, + }, + 6 => 'PeripheralLightingValue', + 9 => 'DistortionCorrectionValue', + # 10 - flags? + 11 => { + Name => 'OriginalImageWidth', + Notes => 'full size of original image before being rotated or scaled in camera', + }, + 12 => 'OriginalImageHeight', +); + +%Image::ExifTool::Canon::VignettingCorrUnknown = ( + %binaryDataAttrs, + FORMAT => 'int16s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Vignetting correction from PowerShot models.', + 0 => { + Name => 'VignettingCorrVersion', + Format => 'int8u', + Writable => 0, + }, +); + +# More Vignetting correction information (MakerNotes tag 0x4016) +%Image::ExifTool::Canon::VignettingCorr2 = ( + %binaryDataAttrs, + FORMAT => 'int32s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 5 => { + Name => 'PeripheralLightingSetting', + PrintConv => \%offOn, + }, + 6 => { + Name => 'ChromaticAberrationSetting', + PrintConv => \%offOn, + }, + 7 => { + Name => 'DistortionCorrectionSetting', + PrintConv => \%offOn, + }, +); + +# Auto Lighting Optimizater information (MakerNotes tag 0x4018) (ref PH) +%Image::ExifTool::Canon::LightingOpt = ( + %binaryDataAttrs, + FORMAT => 'int32s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'This information is new in images from the EOS 7D.', + 1 => { + Name => 'PeripheralIlluminationCorr', + PrintConv => \%offOn, + }, + 2 => { + Name => 'AutoLightingOptimizer', + PrintConv => { + 0 => 'Standard', + 1 => 'Low', + 2 => 'Strong', + 3 => 'Off', + }, + }, + 3 => { + Name => 'HighlightTonePriority', + PrintConv => \%offOn, + }, + 4 => { + Name => 'LongExposureNoiseReduction', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'On', + }, + }, + 5 => { + Name => 'HighISONoiseReduction', + PrintConv => { + 0 => 'Standard', + 1 => 'Low', + 2 => 'Strong', + 3 => 'Off', + }, + }, + # 6 - related to ChromaticAberrationCorr + # 7 - related to DistortionCorrection (0=off, 1=On in a 5DmkIV sample) + # 8 - related to PeripheralIlluminationCorr and ChromaticAberrationCorr +); + +# Lens information (MakerNotes tag 0x4019) (ref 20) +%Image::ExifTool::Canon::LensInfo = ( + %binaryDataAttrs, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { # this doesn't seem to be valid for some models (eg. 550D, 7D?, 1DmkIV?) + Name => 'LensSerialNumber', + Notes => q{ + apparently this is an internal serial number because it doesn't correspond + to the one printed on the lens + }, + Format => 'undef[5]', + Priority => 0, + RawConv => '$val=~/^\0\0\0\0/ ? undef : $val', # (rules out 550D and older lenses) + ValueConv => 'unpack("H*", $val)', + ValueConvInv => 'length($val) < 10 and $val = 0 x (10-length($val)) . $val; pack("H*",$val)', + }, +); + +# Subject mode ambience information (MakerNotes tag 0x4020) (ref PH) +%Image::ExifTool::Canon::Ambience = ( + %binaryDataAttrs, + FORMAT => 'int32s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 1 => { + Name => 'AmbienceSelection', + PrintConv => { + 0 => 'Standard', + 1 => 'Vivid', + 2 => 'Warm', + 3 => 'Soft', + 4 => 'Cool', + 5 => 'Intense', + 6 => 'Brighter', + 7 => 'Darker', + 8 => 'Monochrome', + }, + }, +); + +# Multi-exposure information (MakerNotes tag 0x4021) (ref PH) +%Image::ExifTool::Canon::MultiExp = ( + %binaryDataAttrs, + FORMAT => 'int32s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 1 => { + Name => 'MultiExposure', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On (RAW)', #IB + }, + }, + 2 => { + Name => 'MultiExposureControl', + PrintConv => { + 0 => 'Additive', + 1 => 'Average', + 2 => 'Bright (comparative)', + 3 => 'Dark (comparative)', + }, + }, + 3 => 'MultiExposureShots', +); + +my %filterConv = ( + PrintConv => { + -1 => 'Off', + OTHER => sub { my $val=shift; return "On ($val)" }, + }, +); +# Creative filter information (MakerNotes tag 0x4024) (ref PH) +%Image::ExifTool::Canon::FilterInfo = ( + PROCESS_PROC => \&ProcessFilters, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Information about creative filter settings.', + 0x101 => { + Name => 'GrainyBWFilter', + Description => 'Grainy B/W Filter', + %filterConv, + }, + 0x201 => { Name => 'SoftFocusFilter', %filterConv }, + 0x301 => { Name => 'ToyCameraFilter', %filterConv }, + 0x401 => { Name => 'MiniatureFilter', %filterConv }, + 0x402 => { + Name => 'MiniatureFilterOrientation', + PrintConv => { + 0 => 'Horizontal', + 1 => 'Vertical', + }, + }, + 0x403 => 'MiniatureFilterPosition', + 0x404 => 'MiniatureFilterParameter', # but what is the meaning? + 0x501 => { Name => 'FisheyeFilter', %filterConv }, # (M2) + 0x601 => { Name => 'PaintingFilter', %filterConv }, # (M2) + 0x701 => { Name => 'WatercolorFilter', %filterConv }, # (M2) +); + +# HDR information (MakerNotes tag 0x4025) (ref PH) +%Image::ExifTool::Canon::HDRInfo = ( + %binaryDataAttrs, + FORMAT => 'int32s', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 1 => { + Name => 'HDR', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'On', + }, + }, + 2 => { + Name => 'HDREffect', + PrintConv => { + 0 => 'Natural', + 1 => 'Art (standard)', + 2 => 'Art (vivid)', + 3 => 'Art (bold)', + 4 => 'Art (embossed)', + }, + }, + # 3 - maybe related to AutoImageAlign? +); + +# More color information (MakerNotes tag 0x4026) (ref github issue #119) +%Image::ExifTool::Canon::LogInfo = ( + %binaryDataAttrs, + FORMAT => 'int32s', + FIRST_ENTRY => 1, + PRIORITY => 0, + 4 => { + Name => 'CompressionFormat', + PrintConv => { + 0 => 'Editing (ALL-I)', + 1 => 'Standard (IPB)', + 2 => 'Light (IPB)', + 3 => 'Motion JPEG', + 4 => 'RAW', # either Standard or Light, depending on Quality + }, + }, + 6 => { # 0 to 7 + Name => 'Sharpness', + RawConv => '$val == 0x7fffffff ? undef : $val', + }, + 7 => { # -4 to 4 + Name => 'Saturation', + RawConv => '$val == 0x7fffffff ? undef : $val', + %Image::ExifTool::Exif::printParameter, + }, + 8 => { # -4 to 4 + Name => 'ColorTone', + RawConv => '$val == 0x7fffffff ? undef : $val', + %Image::ExifTool::Exif::printParameter, + }, + 9 => { + Name => 'ColorSpace2', + RawConv => '$val == 0x7fffffff ? undef : $val', + PrintConv => { + 0 => 'BT.709', + 1 => 'BT.2020', + 2 => 'CinemaGamut', + }, + }, + 10 => { + Name => 'ColorMatrix', + RawConv => '$val == 0x7fffffff ? undef : $val', + PrintConv => { + 0 => 'EOS Original', + 1 => 'Neutral', + }, + }, + 11 => { + Name => 'CanonLogVersion', # (increases dynamic range of sensor data) + RawConv => '$val == 0x7fffffff ? undef : $val', + PrintConv => { + 0 => 'OFF', + 1 => 'CLogV1', + 2 => 'CLogV2', # (NC) + 3 => 'CLogV3', + }, + }, +); + +# AF configuration info (MakerNotes tag 0x4028) (ref PH) +%Image::ExifTool::Canon::AFConfig = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int32s', + FIRST_ENTRY => 1, + 1 => { + Name => 'AFConfigTool', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + PrintConv => '"Case $val"', + PrintConvInv => '$val=~/(\d+)/ ? $1 : undef', + }, + 2 => 'AFTrackingSensitivity', + 3 => { + Name => 'AFAccelDecelTracking', + Description => 'AF Accel/Decel Tracking', + }, + 4 => 'AFPointSwitching', + 5 => { #52 + Name => 'AIServoFirstImage', + PrintConv => { + 0 => 'Equal Priority', + 1 => 'Release Priority', + 2 => 'Focus Priority', + }, + }, + 6 => { #52 + Name => 'AIServoSecondImage', + PrintConv => { + 0 => 'Equal Priority', + 1 => 'Release Priority', + 2 => 'Focus Priority', + 3 => 'Release High Priority', + 4 => 'Focus High Priority', + }, + }, + 7 => { #52 + Name => 'USMLensElectronicMF', + PrintConv => { + 0 => 'Enable After AF', + 1 => 'Disable After AF', + 2 => 'Disable in AF Mode', + }, + }, + 8 => { #52 + Name => 'AFAssistBeam', + PrintConv => { + 0 => 'Enable', + 1 => 'Disable', + 2 => 'IR AF Assist Beam Only', + }, + }, + 9 => { #52 + Name => 'OneShotAFRelease', + PrintConv => { + 0 => 'Focus Priority', + 1 => 'Release Priority', + }, + }, + 10 => { #52 + Name => 'AutoAFPointSelEOSiTRAF', + Description => 'Auto AF Point Sel EOS iTR AF', + # valid for: 1DX, 1DXmkII, 7DmkII, 5DS, 5DSR + # not valid for: 5DmkIII + Notes => 'only valid for some models', + Condition => '$$self{Model} !~ /5D /', + PrintConv => { + 0 => 'Enable', + 1 => 'Disable', + }, + }, + 11 => { #52 + Name => 'LensDriveWhenAFImpossible', + PrintConv => { + 0 => 'Continue Focus Search', + 1 => 'Stop Focus Search', + }, + }, + 12 => { #52 + Name => 'SelectAFAreaSelectionMode', + PrintConv => { BITMASK => { + 0 => 'Single-point AF', + 1 => 'Auto', # (61 point) + 2 => 'Zone AF', + 3 => 'AF Point Expansion (4 point)', + 4 => 'Spot AF', + 5 => 'AF Point Expansion (8 point)', + }}, + }, + 13 => { #52 + Name => 'AFAreaSelectionMethod', + PrintConv => { + 0 => 'M-Fn Button', + 1 => 'Main Dial', + }, + }, + 14 => { #52 + Name => 'OrientationLinkedAF', + PrintConv => { # Covers both 1Dx (0-2) and 5D3 (0-1) + 0 => 'Same for Vert/Horiz Points', + 1 => 'Separate Vert/Horiz Points', + 2 => 'Separate Area+Points', + }, + }, + 15 => { #52 + Name => 'ManualAFPointSelPattern', + PrintConv => { + 0 => 'Stops at AF Area Edges', + 1 => 'Continuous', + }, + }, + 16 => { #52 + Name => 'AFPointDisplayDuringFocus', + PrintConv => { + 0 => 'Selected (constant)', + 1 => 'All (constant)', + 2 => 'Selected (pre-AF, focused)', + 3 => 'Selected (focused)', + 4 => 'Disabled', + }, + }, + 17 => { #52 + Name => 'VFDisplayIllumination', + PrintConv => { + 0 => 'Auto', + 1 => 'Enable', + 2 => 'Disable', + }, + }, + 18 => { #52 + Name => 'AFStatusViewfinder', + Condition => '$$self{Model} =~ /1D X/', + Notes => '1D X only', + PrintConv => { + 0 => 'Show in Field of View', + 1 => 'Show Outside View', + }, + }, + 19 => { #52 + Name => 'InitialAFPointInServo', + Condition => '$$self{Model} =~ /1D X/', + Notes => '1D X only', + PrintConv => { + 0 => 'Initial AF Point Selected', + 1 => 'Manual AF Point', + 2 => 'Auto', #PH (1DXmkII) + }, + }, +); + +# RAW burst mode info (MakerNotes tag 0x403f) (ref 25) +%Image::ExifTool::Canon::RawBurstInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int32u', + FIRST_ENTRY => 1, + 1 => 'RawBurstImageNum', + 2 => 'RawBurstImageCount', +); + +# Canon UUID atoms (ref PH, SX280) +%Image::ExifTool::Canon::uuid = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Video' }, + WRITE_PROC => 'Image::ExifTool::QuickTime::WriteQuickTime', + NOTES => q{ + Tags extracted from the uuid atom of MP4 videos from cameras such as the + SX280, and CR3 images from cameras such as the EOS M50. + }, + CNCV => { + Name => 'CompressorVersion', + # use this to recognize the specific type of Canon RAW (CR3 or CRM) + RawConv => '$self->OverrideFileType($1) if $val =~ /^Canon(\w{3})/i; $val', + }, + # CNDM - 4 bytes - 0xff,0xd8,0xff,0xd9 + CNTH => { + Name => 'CanonCNTH', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CNTH' }, + }, + CCTP => { # (CR3 files) + Name => 'CanonCCTP', + SubDirectory => { + TagTable => 'Image::ExifTool::Canon::CCTP', + Start => '12', + }, + }, + # CTBO - (CR3 files) int32u entry count N, N x (int32u index, int64u offset, int64u size) + # index: 1=XMP, 2=PRVW, 3=mdat, 4=?, 5=? + # --> ignored when reading, but offsets are updated when writing + CMT1 => { # (CR3 files) + Name => 'IFD0', + PreservePadding => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + WriteProc => \&Image::ExifTool::WriteTIFF, + }, + }, + CMT2 => { # (CR3 files) + Name => 'ExifIFD', + PreservePadding => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + WriteProc => \&Image::ExifTool::WriteTIFF, + }, + }, + CMT3 => { # (CR3 files) + Name => 'MakerNoteCanon', + PreservePadding => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Canon::Main', + ProcessProc => \&ProcessCMT3, + WriteProc => \&Image::ExifTool::WriteTIFF, + }, + }, + CMT4 => { # (CR3 files) + Name => 'GPSInfo', + PreservePadding => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::GPS::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + WriteProc => \&Image::ExifTool::WriteTIFF, + DirName => 'GPS', + }, + }, + THMB => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + PreservePadding => 1, + RawConv => 'substr($val, 16)', + Binary => 1, + }, + CNOP => { #PH (M50) + Name => 'CanonCNOP', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CNOP' }, + }, +); + +# Canon top-level uuid atoms (ref PH, written by DPP4) +%Image::ExifTool::Canon::uuid2 = ( + WRITE_PROC => 'Image::ExifTool::QuickTime::WriteQuickTime', + CNOP => { + Name => 'CanonVRD', + PreservePadding => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::CanonVRD::Main', + WriteProc => 'Image::ExifTool::CanonVRD::WriteCanonDR4', + }, + }, +); + +%Image::ExifTool::Canon::UnknownIFD = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, +); + +# Canon CCTP atoms (ref PH, CR3 files) +%Image::ExifTool::Canon::CCTP = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Video' }, + # CCDT - int32u[3]: 0. 0, 1. decoder type?, 2. 0, 3. index +); + +# 'CMP1' atom information (ref 54, CR3 files) +%Image::ExifTool::Canon::CMP1 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Image' }, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + PRIORITY => 0, + 8 => { Name => 'ImageWidth', Format => 'int32u' }, + 10 => { Name => 'ImageHeight', Format => 'int32u' }, + # (the rest of the documented tags don't seem to produced good values with my samples - PH) +); + +# 'CDI1' atom information (ref PH, CR3 files) +%Image::ExifTool::Canon::CDI1 = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Image' }, + IAD1 => { Name => 'IAD1', SubDirectory => { TagTable => 'Image::ExifTool::Canon::IAD1' } }, +); + +# 'IAD1' atom information (ref 54, CR3 files) +%Image::ExifTool::Canon::IAD1 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Image' }, + FORMAT => 'int16u', + FIRST_ENTRY => 0, +); + +# Canon Timed MetaData (ref PH, CR3 files) +%Image::ExifTool::Canon::CTMD = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Image' }, + PROCESS_PROC => \&ProcessCTMD, + NOTES => q{ + Canon Timed MetaData tags found in CR3 images. The L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> option + is automatically applied when reading CR3 files to be able to extract this + information. + }, + 1 => { + Name => 'TimeStamp', + Groups => { 2 => 'Time' }, + RawConv => q{ + my $fmt = GetByteOrder() eq 'MM' ? 'x2nCCCCCC' : 'x2vCCCCCC'; + sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d.%.2d', unpack($fmt, $val)); + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + # 3 - 4 bytes, seen: ff ff ff ff + 4 => { + Name => 'FocalInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::FocalInfo' }, + }, + 5 => { + Name => 'ExposureInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ExposureInfo' }, + }, + 7 => { + Name => 'ExifInfo7', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ExifInfo' }, + }, + 8 => { + Name => 'ExifInfo8', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ExifInfo' }, + }, + 9 => { + Name => 'ExifInfo9', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ExifInfo' }, + }, + # 10 - 60 bytes: all zeros with a pair of 0xff's at offset 0x02 (C200 CRM) + # 11 - 612 bytes: all zero with pairs of 0xff's at offset 0x6e and 0x116 (C200 CRM) +); + +# Canon Timed MetaData (ref PH, CR3 files) +%Image::ExifTool::Canon::ExifInfo = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Image' }, + PROCESS_PROC => \&ProcessExifInfo, + 0x8769 => { + Name => 'ExifIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + }, + }, + 0x927c => { + Name => 'MakerNoteCanon', + SubDirectory => { + TagTable => 'Image::ExifTool::Canon::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + }, + }, +); + +# timed focal length information (ref PH, CR3 files) +%Image::ExifTool::Canon::FocalInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Image' }, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + 0 => { + Name => 'FocalLength', + Format => 'rational32u', + PrintConv => 'sprintf("%.1f mm",$val)', + }, +); + +# timed exposure information (ref PH, CR3 files) +%Image::ExifTool::Canon::ExposureInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Image' }, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + 0 => { + Name => 'FNumber', + Format => 'rational32u', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + }, + 1 => { + Name => 'ExposureTime', + Format => 'rational32u', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 2 => { + Name => 'ISO', + Format => 'int32u', + ValueConv => '$val & 0x7fffffff', # (not sure what high bit indicates) + }, +); + +%Image::ExifTool::Canon::CNTH = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Video' }, + VARS => { ATOM_COUNT => 1 }, # only one contained atom + WRITABLE => 1, + WRITE_PROC => 'Image::ExifTool::QuickTime::WriteQuickTime', + NOTES => q{ + Canon-specific QuickTime tags found in the CNTH atom of MOV/MP4 videos from + some cameras. + }, + CNDA => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Format => 'undef', + Notes => 'the full THM image, embedded metadata is extracted as the first sub-document', + SetBase => 1, + RawConv => q{ + $$self{DOC_NUM} = ++$$self{DOC_COUNT}; + $self->ExtractInfo(\$val, { ReEntry => 1 }); + $$self{DOC_NUM} = 0; + return \$val; + }, + RawConvInv => '$val', + }, +); + +# Canon CNOP atoms (ref PH) +%Image::ExifTool::Canon::CNOP = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Video' }, + # CNFB - 52 bytes (7DmkII,M50,C200) + # CNMI - 4 bytes: "0x20000001" (C200) + # CNCM - 48 bytes: original file name in bytes 24-31 (C200) +); + +# 'skip' atom of Canon MOV videos (ref PH) +%Image::ExifTool::Canon::Skip = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Video' }, + NOTES => 'Information found in the "skip" atom of Canon MOV videos.', + CNDB => { Name => 'Unknown_CNDB', Unknown => 1, Binary => 1 }, +); + +# Canon composite tags +%Image::ExifTool::Canon::Composite = ( + GROUPS => { 2 => 'Camera' }, + DriveMode => { + Require => { + 0 => 'ContinuousDrive', + 1 => 'SelfTimer', + }, + ValueConv => '$val[0] ? 0 : ($val[1] ? 1 : 2)', + PrintConv => { + 0 => 'Continuous Shooting', + 1 => 'Self-timer Operation', + 2 => 'Single-frame Shooting', + }, + }, + Lens => { + Require => { + 0 => 'Canon:MinFocalLength', + 1 => 'Canon:MaxFocalLength', + }, + ValueConv => '$val[0]', + PrintConv => 'Image::ExifTool::Canon::PrintFocalRange(@val)', + }, + Lens35efl => { + Description => 'Lens', + Require => { + 0 => 'Canon:MinFocalLength', + 1 => 'Canon:MaxFocalLength', + 3 => 'Lens', + }, + Desire => { + 2 => 'ScaleFactor35efl', + }, + ValueConv => '$val[3] * ($val[2] ? $val[2] : 1)', + PrintConv => '$prt[3] . ($val[2] ? sprintf(" (35 mm equivalent: %s)",Image::ExifTool::Canon::PrintFocalRange(@val)) : "")', + }, + ShootingMode => { + Require => { + 0 => 'CanonExposureMode', + 1 => 'EasyMode', + }, + Desire => { + 2 => 'BulbDuration', + }, + # most Canon models set CanonExposureMode to Manual (4) for Bulb shots, + # but the 1DmkIII uses a value of 7 for Bulb, so use this for other + # models too (Note that Canon DPP reports "Manual Exposure" here) + ValueConv => '$val[0] ? (($val[0] eq "4" and $val[2]) ? 7 : $val[0]) : $val[1] + 10', + PrintConv => '$val eq "7" ? "Bulb" : ($val[0] ? $prt[0] : $prt[1])', + }, + FlashType => { + Notes => q{ + may report "Built-in Flash" for some Canon cameras with external flash in + manual mode + }, + Require => { + 0 => 'FlashBits', + }, + RawConv => '$val[0] ? $val : undef', + ValueConv => '$val[0]&(1<<14)? 1 : 0', + PrintConv => { + 0 => 'Built-In Flash', + 1 => 'External', + }, + }, + RedEyeReduction => { + Require => { + 0 => 'CanonFlashMode', + 1 => 'FlashBits', + }, + RawConv => '$val[1] ? $val : undef', + ValueConv => '($val[0]==3 or $val[0]==4 or $val[0]==6) ? 1 : 0', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + # same as FlashExposureComp, but undefined if no flash + ConditionalFEC => { + Description => 'Flash Exposure Compensation', + Require => { + 0 => 'FlashExposureComp', + 1 => 'FlashBits', + }, + RawConv => '$val[1] ? $val : undef', + ValueConv => '$val[0]', + PrintConv => '$prt[0]', + }, + # hack to assume 1st curtain unless we see otherwise + ShutterCurtainHack => { + Description => 'Shutter Curtain Sync', + Desire => { + 0 => 'ShutterCurtainSync', + }, + Require => { + 1 => 'FlashBits', + }, + RawConv => '$val[1] ? $val : undef', + ValueConv => 'defined($val[0]) ? $val[0] : 0', + PrintConv => { + 0 => '1st-curtain sync', + 1 => '2nd-curtain sync', + }, + }, + WB_RGGBLevels => { + Require => { + 0 => 'Canon:WhiteBalance', + }, + Desire => { + 1 => 'WB_RGGBLevelsAsShot', + # indices of the following entries correspond to Canon:WhiteBalance + 2 + 2 => 'WB_RGGBLevelsAuto', + 3 => 'WB_RGGBLevelsDaylight', + 4 => 'WB_RGGBLevelsCloudy', + 5 => 'WB_RGGBLevelsTungsten', + 6 => 'WB_RGGBLevelsFluorescent', + 7 => 'WB_RGGBLevelsFlash', + 8 => 'WB_RGGBLevelsCustom', + 10 => 'WB_RGGBLevelsShade', + 11 => 'WB_RGGBLevelsKelvin', + }, + ValueConv => '$val[1] ? $val[1] : $val[($val[0] || 0) + 2]', + }, + ISO => { + Priority => 0, # let EXIF:ISO take priority + Desire => { + 0 => 'Canon:CameraISO', + 1 => 'Canon:BaseISO', + 2 => 'Canon:AutoISO', + }, + Notes => 'use CameraISO if numerical, otherwise calculate as BaseISO * AutoISO / 100', + ValueConv => q{ + return $val[0] if $val[0] and $val[0] =~ /^\d+$/; + return undef unless $val[1] and $val[2]; + return $val[1] * $val[2] / 100; + }, + PrintConv => 'sprintf("%.0f",$val)', + }, + DigitalZoom => { + Require => { + 0 => 'Canon:ZoomSourceWidth', + 1 => 'Canon:ZoomTargetWidth', + 2 => 'Canon:DigitalZoom', + }, + RawConv => q{ + ToFloat(@val); + return undef unless $val[2] and $val[2] == 3 and $val[0] and $val[1]; + return $val[1] / $val[0]; + }, + PrintConv => 'sprintf("%.2fx",$val)', + }, + OriginalDecisionData => { + Flags => ['Writable','Protected'], + WriteGroup => 'MakerNotes', + Require => 'OriginalDecisionDataOffset', + RawConv => 'Image::ExifTool::Canon::ReadODD($self,$val[0])', + }, + FileNumber => { + Groups => { 2 => 'Image' }, + Writable => 1, + WriteCheck => '$val=~/\d+-\d+/ ? undef : "Invalid format"', + DelCheck => '"Can\'t delete"', + Require => { + 0 => 'DirectoryIndex', + 1 => 'FileIndex', + }, + WriteAlso => { + DirectoryIndex => '$val=~/(\d+)-(\d+)/; $1', + FileIndex => '$val=~/(\d+)-(\d+)/; $2', + }, + ValueConv => q{ + # fix the funny things that these numbers do when they wrap over 9999 + # (it seems that FileIndex and DirectoryIndex actually store the + # numbers from the previous image, so we need special logic + # to handle the FileIndex wrap properly) + $val[1] == 10000 and $val[1] = 1, ++$val[0]; + return sprintf("%.3d-%.4d",@val); + }, + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::Canon'); + +#------------------------------------------------------------------------------ +# Return lens name with teleconverter if applicable +# Inputs: 0) lens name string, 1) short focal length +# Returns: lens string with tc if appropriate +sub LensWithTC($$) +{ + my ($lens, $shortFocal) = @_; + + # add teleconverter multiplication factor if applicable + # (and if the LensType doesn't already include one) + if (not $lens =~ /x$/ and $lens =~ /(\d+)/) { + my $sf = $1; # short focal length + my $tc; + foreach $tc (1, 1.4, 2, 2.8) { + next if abs($shortFocal - $sf * $tc) > 0.9; + $lens .= " + ${tc}x" if $tc > 1; + last; + } + } + return $lens; +} + +#------------------------------------------------------------------------------ +# Attempt to calculate sensor size for Canon cameras +# Inputs: 0/1) rational values for FocalPlaneX/YResolution +# Returns: Sensor diagonal size in mm, or undef +# Notes: This algorithm is fairly reliable, but has been found to give incorrect +# values for some firmware versions of the EOS 20D, A310, SD40 and IXUS 65 +# (ref http://wyw.dcweb.cn/download.asp?path=&file=jhead-2.96-ccdwidth_hack.zip) +sub CalcSensorDiag($$) +{ + my ($xres, $yres) = @_; + # most Canon cameras store the sensor size in the denominator + if ($xres and $yres) { + # assumptions: 1) numerators are image width/height * 1000 + # 2) denominators are sensor width/height in inches * 1000 + my @xres = split /[ \/]/, $xres; + my @yres = split /[ \/]/, $yres; + # verify assumptions as best we can: + # numerators are always divisible by 1000 + if ($xres[0] % 1000 == 0 and $yres[0] % 1000 == 0 and + # at least 640x480 pixels (DC models - PH) + $xres[0] >= 640000 and $yres[0] >= 480000 and + # ... but not too big! + $xres[0] < 10000000 and $yres[0] < 10000000 and + # minimum sensor size is 0.061 inches (DC models - PH) + $xres[1] >= 61 and $xres[1] < 1500 and + $yres[1] >= 61 and $yres[1] < 1000 and + # sensor isn't square (may happen if rationals have been reduced) + $xres[1] != $yres[1]) + { + return sqrt($xres[1]*$xres[1] + $yres[1]*$yres[1]) * 0.0254; + } + } + return undef; +} + +#------------------------------------------------------------------------------ +# Attempt to identify the specific lens if multiple lenses have the same LensType +# Inputs: 0) PrintConv hash ref, 1) LensType, 2) MinFocalLength, 3) MaxFocalLength +# 4) MaxAperture, 5) LensModel +# Notes: PrintConv, LensType, MinFocalLength and MaxFocalLength must be defined. +# Other inputs are optional. +sub PrintLensID(@) +{ + my ($printConv, $lensType, $shortFocal, $longFocal, $maxAperture, $lensModel) = @_; + my $lens; + $lens = $$printConv{$lensType} unless $lensType eq '-1' or $lensType eq '65535'; + if ($lens) { + # return this lens unless other lenses have the same LensType + return LensWithTC($lens, $shortFocal) unless $$printConv{"$lensType.1"}; + $lens =~ s/ or .*//s; # remove everything after "or" + # make list of all possible matching lenses + my @lenses = ( $lens ); + my $i; + for ($i=1; $$printConv{"$lensType.$i"}; ++$i) { + push @lenses, $$printConv{"$lensType.$i"}; + } + my ($tc, @user, @maybe, @likely, @matches); + # look for lens in user-defined lenses + foreach $lens (@lenses) { + push @user, $lens if $Image::ExifTool::userLens{$lens}; + } + # attempt to determine actual lens + foreach $tc (1, 1.4, 2, 2.8) { # loop through teleconverter scaling factors + foreach $lens (@lenses) { + next unless $lens =~ /(\d+)(?:-(\d+))?mm.*?(?:[fF]\/?)(\d+(?:\.\d+)?)(?:-(\d+(?:\.\d+)?))?/; + # ($1=short focal, $2=long focal, $3=max aperture wide, $4=max aperture tele) + my ($sf, $lf, $sa, $la) = ($1, $2, $3, $4); + # see if we can rule out this lens by focal length or aperture + $lf = $sf if $sf and not $lf; + $la = $sa if $sa and not $la; + # account for converter-specific LensType's (ie. end with " + #.#x") + if ($lens =~ / \+ (\d+(\.\d+)?)x$/) { + $sf *= $1; $lf *= $1; + $sa *= $1; $la *= $1; + } + next if abs($shortFocal - $sf * $tc) > 0.9; + my $tclens = $lens; + $tclens .= " + ${tc}x" if $tc > 1; + push @maybe, $tclens; + next if abs($longFocal - $lf * $tc) > 0.9; + push @likely, $tclens; + if ($maxAperture) { + # (not 100% sure that TC affects MaxAperture, but it should!) + # (RF 24-105mm F4L IS USM shows a MaxAperture of 4.177) + next if $maxAperture < $sa * $tc - 0.18; + next if $maxAperture > $la * $tc + 0.18; + } + push @matches, $tclens; + } + last if @maybe; + } + if (@user) { + # choose the best match if we have more than one + if (@user > 1) { + my ($try, @good); + foreach $try (\@matches, \@likely, \@maybe) { + foreach (@$try) { + $Image::ExifTool::userLens{$_} and push(@good, $_), next; + # check for match with TC string removed + next unless /^(.*) \+ \d+(\.\d+)?x$/; + $Image::ExifTool::userLens{$1} and push(@good, $_); + } + return join(' or ', @good) if @good; + } + } + # default to returning the first user-defined lens + return LensWithTC($user[0], $shortFocal); + } + # differentiate Sigma Art/Contemporary/Sports models + if (@matches > 1 and $lensModel and $lensModel =~ /(\| [ACS])/) { + my $type = $1; + my @best; + foreach $lens (@matches) { + push @best, $lens if $lens =~ /\Q$type/; + } + @matches = @best if @best; + } + @matches = @likely unless @matches; + @matches = @maybe unless @matches; + Image::ExifTool::Exif::MatchLensModel(\@matches, $lensModel); + return join(' or ', @matches) if @matches; + } elsif ($lensModel and $lensModel =~ /\d/) { + # use lens model as written by the camera + if ($printConv eq \%canonLensTypes) { + # add "Canon" to the start since the Canon cameras only understand Canon lenses + return "Canon $lensModel"; + } else { + return $lensModel; + } + } + my $str = ''; + if ($shortFocal) { + $str .= sprintf(' %d', $shortFocal); + $str .= sprintf('-%d', $longFocal) if $longFocal and $longFocal != $shortFocal; + $str .= 'mm'; + } + # (careful because Sigma LensType's may not be integer, so use string comparison) + return "Unknown$str" if $lensType eq '-1' or $lensType eq '65535'; + return "Unknown ($lensType)$str"; +} + +#------------------------------------------------------------------------------ +# Swap 16-bit words in 32-bit integers +# Inputs: 0) string of integers +# Returns: string of word-swapped integers +sub SwapWords($) +{ + my @a = split(' ', shift); + $_ = (($_ >> 16) | ($_ << 16)) & 0xffffffff foreach @a; + return "@a"; +} + +#------------------------------------------------------------------------------ +# Validate first word of Canon binary data +# Inputs: 0) data pointer, 1) offset, 2-N) list of valid values +# Returns: true if data value is the same +sub Validate($$@) +{ + my ($dataPt, $offset, @vals) = @_; + # the first 16-bit value is the length of the data in bytes + my $dataVal = Image::ExifTool::Get16u($dataPt, $offset); + my $val; + foreach $val (@vals) { + return 1 if $val == $dataVal; + } + return undef; +} + +#------------------------------------------------------------------------------ +# Validate CanonAFInfo +# Inputs: 0) data pointer, 1) offset, 2) size +# Returns: true if data appears valid +sub ValidateAFInfo($$$) +{ + my ($dataPt, $offset, $size) = @_; + return 0 if $size < 24; # must be at least 24 bytes long (PowerShot Pro1) + my $af = Get16u($dataPt, $offset); + return 0 if $af !~ /^(1|5|7|9|15|45|53)$/; # check NumAFPoints + my $w1 = Get16u($dataPt, $offset + 4); + my $h1 = Get16u($dataPt, $offset + 6); + return 0 unless $h1 and $w1; + my $f1 = $w1 / $h1; + # check for normal aspect ratio + return 1 if abs($f1 - 1.33) < 0.01 or abs($f1 - 1.67) < 0.01; + # ZoomBrowser can modify this for rotated images (ref Joshua Bixby) + return 1 if abs($f1 - 0.75) < 0.01 or abs($f1 - 0.60) < 0.01; + my $w2 = Get16u($dataPt, $offset + 8); + my $h2 = Get16u($dataPt, $offset + 10); + return 0 unless $h2 and $w2; + # compare aspect ratio with AF image size + # (but the Powershot AFImageHeight is odd, hence the test above) + return 0 if $w1 eq $h1; + my $f2 = $w2 / $h2; + return 1 if abs(1-$f1/$f2) < 0.01; + return 1 if abs(1-$f1*$f2) < 0.01; + return 0; +} + +#------------------------------------------------------------------------------ +# Read original decision data from file (variable length) +# Inputs: 0) ExifTool object ref, 1) offset in file +# Returns: reference to original decision data (or undef if no data) +sub ReadODD($$) +{ + my ($et, $offset) = @_; + return undef unless $offset; + my ($raf, $buff, $buf2, $i, $warn); + return undef unless defined($raf = $$et{RAF}); + # the data block is a variable length and starts with 0xffffffff + # followed a 4-byte (int32u) version number + my $pos = $raf->Tell(); + if ($raf->Seek($offset, 0) and $raf->Read($buff, 8)==8 and $buff=~/^\xff{4}.\0\0/s) { + my $err = 1; + # must set byte order in case it is different than current byte order + # (we could be reading this after byte order was changed) + my $oldOrder = GetByteOrder(); + my $version = Get32u(\$buff, 4); + if ($version > 20) { + ToggleByteOrder(); + $version = unpack('N',pack('V',$version)); + } + if ($version == 1 or # 1Ds (big endian) + $version == 2) # 5D/20D (little endian) + { + # this data is structured as follows: + # 4 bytes: all 0xff + # 4 bytes: version number (=1 or 2) + # 20 bytes: sha1 + # 4 bytes: record count + # for each record: + # | 4 bytes: record number (beginning at 0) + # | 4 bytes: block offset + # | 4 bytes: block length + # | 20 bytes: block sha1 + if ($raf->Read($buf2, 24) == 24) { + $buff .= $buf2; + my $count = Get32u(\$buf2, 20); + # read all records if the count is reasonable + if ($count and $count < 20 and + $raf->Read($buf2, $count * 32) == $count * 32) + { + $buff .= $buf2; + undef $err; + } + } + } elsif ($version == 3) { # newer models (little endian) + # this data is structured as follows: + # 4 bytes: all 0xff + # 4 bytes: version number (=3) + # 24 bytes: sha1 A length (=20) + sha1 A + # 24 bytes: sha1 B length (=20) + sha1 B + # 4 bytes: length of remaining data (including this length word!) + # 8 bytes: salt length (=4) + salt ? + # 4 bytes: unknown (=3) + # 4 bytes: size of file + # 4 bytes: unknown (=1 for most models, 2 for 5DmkII) + # 4 bytes: unknown (=1) + # 4 bytes: unknown (always the same for a given firmware version) + # 4 bytes: unknown (random) + # 4 bytes: record count + # for each record: + # | 4 bytes: record number (beginning at 1) + # | 8 bytes: salt length (=4) + salt ? + # | 24 bytes: sha1 length (=20) + sha1 + # | 4 bytes: block count + # | for each block: + # | | 4 bytes: block offset + # | | 4 bytes: block length + # followed by zero padding to end of ODD data (~72 bytes) + for ($i=0; ; ++$i) { + $i == 3 and undef $err, last; # success! + $raf->Read($buf2, 4) == 4 or last; + $buff .= $buf2; + my $len = Get32u(\$buf2, 0); + # (the data length includes the length word itself - doh!) + $len -= 4 if $i == 2 and $len >= 4; + # make sure records are a reasonable size (<= 64kB) + $len <= 0x10000 and $raf->Read($buf2, $len) == $len or last; + $buff .= $buf2; + } + } else { + $warn = "Unsupported original decision data version $version"; + } + SetByteOrder($oldOrder); + unless ($err) { + if ($et->Options('HtmlDump')) { + $et->HDump($offset, length $buff, '[OriginalDecisionData]', undef); + } + $raf->Seek($pos, 0); # restore original file position + return \$buff; + } + } + $et->Warn($warn || 'Invalid original decision data'); + $raf->Seek($pos, 0); # restore original file position + return undef; +} + +#------------------------------------------------------------------------------ +# Convert the CameraISO value +# Inputs: 0) value, 1) set for inverse conversion +sub CameraISO($;$) +{ + my ($val, $inv) = @_; + my $rtnVal; + my %isoLookup = ( + 0 => 'n/a', + 14 => 'Auto High', #PH (S3IS) + 15 => 'Auto', + 16 => 50, + 17 => 100, + 18 => 200, + 19 => 400, + 20 => 800, #PH + ); + if ($inv) { + $rtnVal = Image::ExifTool::ReverseLookup($val, \%isoLookup); + if (not defined $rtnVal and Image::ExifTool::IsInt($val)) { + $rtnVal = ($val & 0x3fff) | 0x4000; + } + } elsif ($val != 0x7fff) { + if ($val & 0x4000) { + $rtnVal = $val & 0x3fff; + } else { + $rtnVal = $isoLookup{$val} || "Unknown ($val)"; + } + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Print range of focal lengths +# Inputs: 0) short focal, 1) long focal, 2) optional scaling factor +sub PrintFocalRange(@) +{ + my ($short, $long, $scale) = @_; + + $scale or $scale = 1; + if ($short == $long) { + return sprintf("%.1f mm", $short * $scale); + } else { + return sprintf("%.1f - %.1f mm", $short * $scale, $long * $scale); + } +} + +#------------------------------------------------------------------------------ +# Process a serial stream of binary data +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +# Notes: The tagID's for serial stream tags are consecutive indices beginning +# at 0, and the corresponding values must be contiguous in memory. +# "Unknown" tags must be used to skip padding or unknown values. +# (does not yet extract Rational values) +sub ProcessSerialData($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $offset = $$dirInfo{DirStart}; + my $size = $$dirInfo{DirLen}; + my $base = $$dirInfo{Base} || 0; + my $verbose = $et->Options('Verbose'); + my $dataPos = $$dirInfo{DataPos} || 0; + + # temporarily set Unknown option so GetTagInfo() will return existing unknown tags + # (require to maintain serial data synchronization) + my $unknown = $et->Options(Unknown => 1); + # but disable unknown tag generation (because processing ends when we run out of tags) + $$et{NO_UNKNOWN} = 1; + + $verbose and $et->VerboseDir('SerialData', undef, $size); + + # get default format ('int8u' unless specified) + my $defaultFormat = $$tagTablePtr{FORMAT} || 'int8u'; + + my ($index, %val); + my $pos = 0; + for ($index=0; $$tagTablePtr{$index} and $pos <= $size; ++$index) { + my $tagInfo = $et->GetTagInfo($tagTablePtr, $index) or last; + my $format = $$tagInfo{Format}; + my $count = 1; + if ($format) { + if ($format =~ /(.*)\[(.*)\]/) { + $format = $1; + $count = $2; + # evaluate count to allow count to be based on previous values + #### eval Format (%val, $size) + $count = eval $count; + $@ and warn("Format $$tagInfo{Name}: $@"), last; + } elsif ($format eq 'string') { + # allow string with no specified count to run to end of block + $count = ($size > $pos) ? $size - $pos : 0; + } + } else { + $format = $defaultFormat; + } + my $len = (Image::ExifTool::FormatSize($format) || 1) * $count; + last if $pos + $len > $size; + my $val = ReadValue($dataPt, $pos+$offset, $format, $count, $size-$pos); + last unless defined $val; + if ($verbose) { + $et->VerboseInfo($index, $tagInfo, + Index => $index, + Table => $tagTablePtr, + Value => $val, + DataPt => $dataPt, + Size => $len, + Start => $pos+$offset, + Addr => $pos+$offset+$base+$dataPos, + Format => $format, + Count => $count, + ); + } + $val{$index} = $val; + if ($$tagInfo{SubDirectory}) { + my $subTablePtr = GetTagTable($$tagInfo{SubDirectory}{TagTable}); + my %dirInfo = ( + DataPt => \$val, + DataPos => $dataPos + $pos, + DirStart => 0, + DirLen => length($val), + ); + $et->ProcessDirectory(\%dirInfo, $subTablePtr); + } elsif (not $$tagInfo{Unknown} or $unknown) { + # don't extract zero-length information + $et->FoundTag($tagInfo, $val) if $count; + } + $pos += $len; + } + $et->Options(Unknown => $unknown); # restore Unknown option + delete $$et{NO_UNKNOWN}; + return 1; +} + +#------------------------------------------------------------------------------ +# Print 1D AF points +# Inputs: 0) value to convert +# Focus point pattern: +# A1 A2 A3 A4 A5 A6 A7 +# B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 +# C1 C2 C3 C4 C5 C6 C7 C9 C9 C10 C11 +# D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 +# E1 E2 E3 E4 E5 E6 E7 +sub PrintAFPoints1D($) +{ + my $val = shift; + return 'Unknown' unless length $val == 8; + # list of focus point values for decoding the first byte of the 8-byte record. + # they are the x/y positions of each bit in the AF point mask + # (y is upper 3 bits / x is lower 5 bits) + my @focusPts = (0,0, + 0x04,0x06,0x08,0x0a,0x0c,0x0e,0x10, 0,0, + 0x21,0x23,0x25,0x27,0x29,0x2b,0x2d,0x2f,0x31,0x33, + 0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4d,0x50,0x52,0x54, + 0x61,0x63,0x65,0x67,0x69,0x6b,0x6d,0x6f,0x71,0x73, 0,0, + 0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90, 0,0,0,0,0 + ); + my $focus = unpack('C',$val); + my @bits = split //, unpack('b*',substr($val,1)); + my @rows = split //, ' AAAAAAA BBBBBBBBBBCCCCCCCCCCCDDDDDDDDDD EEEEEEE '; + my ($focusing, $focusPt, @points); + my $lastRow = ''; + my $col = 0; + foreach $focusPt (@focusPts) { + my $row = shift @rows; + $col = ($row eq $lastRow) ? $col + 1 : 1; + $lastRow = $row; + $focusing = "$row$col" if $focus eq $focusPt; + push @points, "$row$col" if shift @bits; + } + $focusing or $focusing = ($focus == 0xff) ? 'Auto' : sprintf('Unknown (0x%.2x)',$focus); + return "$focusing (" . join(',',@points) . ')'; +} + +#------------------------------------------------------------------------------ +# Convert Canon hex-based EV (modulo 0x20) to real number +# Inputs: 0) value to convert +# eg) 0x00 -> 0 +# 0x0c -> 0.33333 +# 0x10 -> 0.5 +# 0x14 -> 0.66666 +# 0x20 -> 1 ... etc +sub CanonEv($) +{ + my $val = shift; + my $sign; + # temporarily make the number positive + if ($val < 0) { + $val = -$val; + $sign = -1; + } else { + $sign = 1; + } + my $frac = $val & 0x1f; + $val -= $frac; # remove fraction + # Convert 1/3 and 2/3 codes + if ($frac == 0x0c) { + $frac = 0x20 / 3; + } elsif ($frac == 0x14) { + $frac = 0x40 / 3; + } + return $sign * ($val + $frac) / 0x20; +} + +#------------------------------------------------------------------------------ +# Convert number to Canon hex-based EV (modulo 0x20) +# Inputs: 0) number +# Returns: Canon EV code +sub CanonEvInv($) +{ + my $num = shift; + my $sign; + # temporarily make the number positive + if ($num < 0) { + $num = -$num; + $sign = -1; + } else { + $sign = 1; + } + my $val = int($num); + my $frac = $num - $val; + if (abs($frac - 0.33) < 0.05) { + $frac = 0x0c + } elsif (abs($frac - 0.67) < 0.05) { + $frac = 0x14; + } else { + $frac = int($frac * 0x20 + 0.5); + } + return $sign * ($val * 0x20 + $frac); +} + +#------------------------------------------------------------------------------ +# Read CMT3 maker notes from CR3 file +# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table ref +# Returns: data block (may be empty if no Exif data) or undef on error +sub ProcessCMT3($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + + # extract the static maker notes to copying to other file types if requested + # Note: this won't copy makernotes in the timed metadata since these are stored + # separately, but the only records they have that aren't in the static maker notes + # (for the M50) are: ColorData9, Flavor, CanonCameraInfoUnknown, + # VignettingCorrUnknown1, Canon_0x4033 and Canon_0x402e + if (($et->Options('MakerNotes') or $$et{REQ_TAG_LOOKUP}{makernotecanon}) and + $$dirInfo{DirLen} > 8) + { + my $dataPt = $$dirInfo{DataPt}; + # remove old (unused) trailer + $$dataPt =~ s/(II\x2a\0|MM\0\x2a)\0{4,10}$//; + # remove TIFF header and append as the Canon makernote trailer + # (so offsets will be interpreted correctly) + my $val = substr($$dataPt,8) . substr($$dataPt,0,8); + $et->FoundTag($Image::ExifTool::Canon::uuid{CMT3}, \$val); + } + return $et->ProcessTIFF($dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Process CTMD EXIF information +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessExifInfo($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $start = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $start); + my $dirEnd = $start + $dirLen; + # loop through TIFF-format EXIF/MakerNote records + my ($pos, $len, $tag); + for ($pos = $start; $pos + 8 < $dirEnd; $pos += $len) { + $len = Get32u($dataPt, $pos); + $tag = Get32u($dataPt, $pos + 4); + # test size/tag for valid ExifInfo (not EXIF in CRM files) + last if $len < 8 or $pos + $len > $dirEnd or not $$tagTablePtr{$tag}; + $et->VerboseDir('ExifInfo', undef, $dirLen) if $pos == $start; + $et->HandleTag($tagTablePtr, $tag, undef, + DataPt => $dataPt, + Base => $$dirInfo{Base} + $pos + 8, # base for TIFF pointers + DataPos => -($pos + 8), # (relative to Base) + Start => $pos + 8, + Size => $len - 8, + ); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process Canon Timed MetaData (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessCTMD($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $verbose = $et->Options('Verbose'); + my $dirLen = length $$dataPt; + my $pos = 0; + SetByteOrder('II'); + while ($pos + 6 < $dirLen) { + my $size = Get32u($dataPt, $pos); + my $type = Get16u($dataPt, $pos + 4); + # what is the meaning of the 6-byte header of these records?: + # type 1 - 00 00 00 01 zz zz - TimeStamp(CR3/CRM); zz=00(CR3),ff(CRM) + # type 3 - 00 00 00 01 zz zz - ? "ff ff ff ff"; zz=00(CR3),ff(CRM) + # type 4 - 00 00 00 01 ff ff - FocalInfo(CR3/CRM) + # type 5 - 00 00 00 01 ff ff - ExposureInfo(CR3/CRM) + # type 6 - 00 04 00 01 ff ff - ? "03 04 00 80 e0 15 ff ff"(CRM) [0x15e0 = ColorTemperature?] + # type 7 - xx yy 00 01 ff ff - ExifIFD + MakerNotes(CR3), ?(CRM); xxyy=0101(CR3),0004(CRM) + # type 8 - 01 yy 00 01 ff ff - MakerNotes(CR3), ?(CRM); yy=01(CR3),04(CRM) + # type 9 - 01 yy 00 01 ff ff - MakerNotes(CR3), ?(CRM); yy=01(CR3),00(CRM) + # type 10- 01 00 00 01 ff ff - ? (CRM) + # type 11- 01 00 00 01 ff ff - ? (CRM) + # --> maybe yy == 01 for ExifInfo? + $size < 12 and $et->Warn('Short CTMD record'), last; + $pos + $size > $dirLen and $et->Warn('Truncated CTMD record'), last; + $et->VerboseDir("CTMD type $type", undef, $size - 6); + HexDump($dataPt, 6, # dump 6-byte header + Start => $pos + 6, + Addr => $$dirInfo{Base} + $pos + 6, + Prefix => $$et{INDENT}, + ) if $verbose > 2; + if ($$tagTablePtr{$type}) { + $et->HandleTag($tagTablePtr, $type, undef, + DataPt => $dataPt, + Base => $$dirInfo{Base}, + Start => $pos + 12, + Size => $size - 12, + ); + } elsif ($verbose) { + $et->VerboseDump($dataPt, Len=>$size-12, Start=>$pos+12, DataPos=>$$dirInfo{Base}); + } + $pos += $size; + } + $et->Warn('Error parsing Canon CTMD data', 1) if $pos != $dirLen; + return 1; +} + +#------------------------------------------------------------------------------ +# Process a creative filter data +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessFilters($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $dirLen = $$dirInfo{DirLen}; + my $dataPos = $$dirInfo{DataPos} || 0; + my $end = $pos + $dirLen; + my $verbose = $et->Options('Verbose'); + + return 0 if $dirLen < 8; + my $numFilters = Get32u($dataPt, $pos + 4); + $verbose and $et->VerboseDir('Creative Filter', $numFilters); + $pos += 8; + my ($i, $j, $err); + for ($i=0; $i<$numFilters; ++$i) { + # read filter structure: + # 4 bytes - filter number + # 4 bytes - filter data length + # 4 bytes - number of parameters: + # | 4 bytes - parameter ID + # | 4 bytes - parameter value count + # | 4 bytes * count - parameter values (NC) + $pos + 12 > $end and $err = "Truncated data for filter $i", last; + my $fnum = Get32u($dataPt, $pos); # (is this an index or an ID?) + my $size = Get32u($dataPt, $pos + 4); + my $nparm = Get32u($dataPt, $pos + 8); + my $nxt = $pos + 4 + $size; + $nxt > $end and $err = "Invalid size ($size) for filter $i", last; + $verbose and $et->VerboseDir("Filter $fnum", $nparm, $size); + $pos += 12; + for ($j=0; $j<$nparm; ++$j) { + $pos + 12 > $end and $err = "Truncated data for filter $i param $j", last; + my $tag = Get32u($dataPt, $pos); + my $count = Get32u($dataPt, $pos + 4); + $pos += 8; + $pos + 4 * $count > $end and $err = "Truncated value for filter $i param $j", last; + my $val = ReadValue($dataPt, $pos, 'int32s', $count, 4 * $count); + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $pos, + Size => 4 * $count, + ); + $pos += 4 * $count; + } + $pos = $nxt; # step to next filter + } + $err and $et->Warn($err, 1); + return 1; +} + +#------------------------------------------------------------------------------ +# Write Canon maker notes +# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table ref +# Returns: data block (may be empty if no Exif data) or undef on error +sub WriteCanon($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to autoload this package + my $dirData = Image::ExifTool::Exif::WriteExif($et, $dirInfo, $tagTablePtr); + # add footer which is written by some Canon models (format of a TIFF header) + if (defined $dirData and length $dirData and $$dirInfo{Fixup}) { + $dirData .= GetByteOrder() . Set16u(42) . Set32u(0); + $$dirInfo{Fixup}->AddFixup(length($dirData) - 4); + } + return $dirData; +} + +#------------------------------------------------------------------------------ +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Canon - Canon EXIF maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Canon maker notes in EXIF information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html> + +=item L<http://www.wonderland.org/crw/> + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=item L<http://homepage3.nifty.com/kamisaka/makernote/makernote_canon.htm> + +=item (...plus lots of testing with my 300D, A570IS and G12!) + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks Michael Rommel and Daniel Pittman for information they provided about +the Digital Ixus and PowerShot S70 cameras, Juha Eskelinen and Emil Sit for +figuring out the 20D and 30D FileNumber, Denny Priebe for figuring out a +couple of 1D tags, and Michael Tiemann, Rainer Honle, Dave Nicholson, Chris +Huebsch, Ger Vermeulen, Darryl Zurn, D.J. Cristi, Bogdan, Vesa Kivisto and +Kai Harrekilde-Petersen for decoding a number of new tags. Also thanks to +everyone who made contributions to the LensType lookup list or the meanings +of other tag values. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Canon Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/CanonCustom.pm b/lib/Image/ExifTool/CanonCustom.pm new file mode 100644 index 0000000..363235c --- /dev/null +++ b/lib/Image/ExifTool/CanonCustom.pm @@ -0,0 +1,2900 @@ +#------------------------------------------------------------------------------ +# File: CanonCustom.pm +# +# Description: Read and write Canon Custom functions +# +# Revisions: 11/25/2003 - P. Harvey Created +# +# References: 1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html +# 2) Christian Koller private communication (20D) +# 3) Rainer Honle private communication (5D) +# 4) David Pitcher private communication (1DmkIII firmware upgrade) +#------------------------------------------------------------------------------ + +package Image::ExifTool::CanonCustom; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess); +use Image::ExifTool::Canon; +use Image::ExifTool::Exif; + +$VERSION = '1.58'; + +sub ProcessCanonCustom($$$); +sub ProcessCanonCustom2($$$); +sub WriteCanonCustom($$$); +sub WriteCanonCustom2($$$); +sub CheckCanonCustom($$$); +sub ConvertPFn($); +sub ConvertPFnInv($); + +my %onOff = ( 0 => 'On', 1 => 'Off' ); +my %offOn = ( 0 => 'Off', 1 => 'On' ); +my %disableEnable = ( 0 => 'Disable', 1 => 'Enable' ); +my %enableDisable = ( 0 => 'Enable', 1 => 'Disable' ); +my %convPFn = ( PrintConv => \&ConvertPfn, PrintConvInv => \&ConvertPfnInv ); + +#------------------------------------------------------------------------------ +# Custom functions for the 1D +# CanonCustom (keys are custom function number) +%Image::ExifTool::CanonCustom::Functions1D = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessCanonCustom, + WRITE_PROC => \&WriteCanonCustom, + CHECK_PROC => \&CheckCanonCustom, + WRITABLE => 'int8u', + NOTES => q{ + These custom functions are used by all 1D models up to but not including the + Mark III. + }, + 0 => { + Name => 'FocusingScreen', + PrintConv => { + 0 => 'Ec-N, R', + 1 => 'Ec-A,B,C,CII,CIII,D,H,I,L', + }, + }, + 1 => { + Name => 'FinderDisplayDuringExposure', + PrintConv => \%offOn, + }, + 2 => { + Name => 'ShutterReleaseNoCFCard', + Description => 'Shutter Release W/O CF Card', + PrintConv => { + 0 => 'Yes', + 1 => 'No', + }, + }, + 3 => { + Name => 'ISOSpeedExpansion', + Description => 'ISO Speed Expansion', + PrintConv => { + 0 => 'No', + 1 => 'Yes', + }, + }, + 4 => { + Name => 'ShutterAELButton', + Description => 'Shutter Button/AEL Button', + PrintConv => { + 0 => 'AF/AE lock stop', + 1 => 'AE lock/AF', + 2 => 'AF/AF lock, No AE lock', + 3 => 'AE/AF, No AE lock', + }, + }, + 5 => { + Name => 'ManualTv', + Description => 'Manual Tv/Av For M', + PrintConv => { + 0 => 'Tv=Main/Av=Control', + 1 => 'Tv=Control/Av=Main', + 2 => 'Tv=Main/Av=Main w/o lens', + 3 => 'Tv=Control/Av=Main w/o lens', + }, + }, + 6 => { + Name => 'ExposureLevelIncrements', + PrintConv => { + 0 => '1/3-stop set, 1/3-stop comp.', + 1 => '1-stop set, 1/3-stop comp.', + 2 => '1/2-stop set, 1/2-stop comp.', + }, + }, + 7 => { + Name => 'USMLensElectronicMF', + PrintConv => { + 0 => 'Turns on after one-shot AF', + 1 => 'Turns off after one-shot AF', + 2 => 'Always turned off', + }, + }, + 8 => { + Name => 'LCDPanels', + Description => 'Top/Back LCD Panels', + PrintConv => { + 0 => 'Remain. shots/File no.', + 1 => 'ISO/Remain. shots', + 2 => 'ISO/File no.', + 3 => 'Shots in folder/Remain. shots', + }, + }, + 9 => { + Name => 'AEBSequenceAutoCancel', + Description => 'AEB Sequence/Auto Cancel', + PrintConv => { + 0 => '0,-,+/Enabled', + 1 => '0,-,+/Disabled', + 2 => '-,0,+/Enabled', + 3 => '-,0,+/Disabled', + }, + }, + 10 => { + Name => 'AFPointIllumination', + PrintConv => { + 0 => 'On', + 1 => 'Off', + 2 => 'On without dimming', + 3 => 'Brighter', + }, + }, + 11 => { + Name => 'AFPointSelection', + PrintConv => { + 0 => 'H=AF+Main/V=AF+Command', + 1 => 'H=Comp+Main/V=Comp+Command', + 2 => 'H=Command only/V=Assist+Main', + 3 => 'H=FEL+Main/V=FEL+Command', + }, + }, + 12 => { + Name => 'MirrorLockup', + PrintConv => \%disableEnable, + }, + 13 => { + Name => 'AFPointSpotMetering', + Description => 'No. AF Points/Spot Metering', + PrintConv => { + 0 => '45/Center AF point', + 1 => '11/Active AF point', + 2 => '11/Center AF point', + 3 => '9/Active AF point', + }, + }, + 14 => { + Name => 'FillFlashAutoReduction', + PrintConv => \%enableDisable, + }, + 15 => { + Name => 'ShutterCurtainSync', + PrintConv => { + 0 => '1st-curtain sync', + 1 => '2nd-curtain sync', + }, + }, + 16 => { + Name => 'SafetyShiftInAvOrTv', + PrintConv => \%disableEnable, + }, + 17 => { + Name => 'AFPointActivationArea', + PrintConv => { + 0 => 'Single AF point', + 1 => 'Expanded (TTL. of 7 AF points)', + 2 => 'Automatic expanded (max. 13)', + }, + }, + 18 => { + Name => 'SwitchToRegisteredAFPoint', + PrintConv => { + 0 => 'Assist + AF', + 1 => 'Assist', + 2 => 'Only while pressing assist', + }, + }, + 19 => { + Name => 'LensAFStopButton', + PrintConv => { + 0 => 'AF stop', + 1 => 'AF start', + 2 => 'AE lock while metering', + 3 => 'AF point: M -> Auto / Auto -> Ctr.', + 4 => 'AF mode: ONE SHOT <-> AI SERVO', + 5 => 'IS start', + }, + }, + 20 => { + Name => 'AIServoTrackingSensitivity', + PrintConv => { + 0 => 'Standard', + 1 => 'Slow', + 2 => 'Moderately slow', + 3 => 'Moderately fast', + 4 => 'Fast', + }, + }, + 21 => { + Name => 'AIServoContinuousShooting', + PrintConv => { + 0 => 'Shooting not possible without focus', + 1 => 'Shooting possible without focus', + }, + }, +); + +# Custom functions for the 5D (ref 3) +%Image::ExifTool::CanonCustom::Functions5D = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessCanonCustom, + WRITE_PROC => \&WriteCanonCustom, + CHECK_PROC => \&CheckCanonCustom, + WRITABLE => 'int8u', + 0 => { + Name => 'FocusingScreen', + PrintConv => { + 0 => 'Ee-A', + 1 => 'Ee-D', + 2 => 'Ee-S', + }, + }, + 1 => { + Name => 'SetFunctionWhenShooting', + PrintConv => { + 0 => 'Default (no function)', + 1 => 'Change quality', + 2 => 'Change Parameters', + 3 => 'Menu display', + 4 => 'Image replay', + }, + }, + 2 => { + Name => 'LongExposureNoiseReduction', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'On', + }, + }, + 3 => { + Name => 'FlashSyncSpeedAv', + PrintConv => { + 0 => 'Auto', + 1 => '1/200 Fixed', + }, + }, + 4 => { + Name => 'Shutter-AELock', + PrintConv => { + 0 => 'AF/AE lock', + 1 => 'AE lock/AF', + 2 => 'AF/AF lock, No AE lock', + 3 => 'AE/AF, No AE lock', + }, + }, + 5 => { + Name => 'AFAssistBeam', + PrintConv => { + 0 => 'Emits', + 1 => 'Does not emit', + }, + }, + 6 => { + Name => 'ExposureLevelIncrements', + PrintConv => { + 0 => '1/3 Stop', + 1 => '1/2 Stop', + }, + }, + 7 => { + Name => 'FlashFiring', + PrintConv => { + 0 => 'Fires', + 1 => 'Does not fire', + }, + }, + 8 => { + Name => 'ISOExpansion', + PrintConv => \%offOn, + }, + 9 => { + Name => 'AEBSequenceAutoCancel', + Description => 'AEB Sequence/Auto Cancel', + PrintConv => { + 0 => '0,-,+/Enabled', + 1 => '0,-,+/Disabled', + 2 => '-,0,+/Enabled', + 3 => '-,0,+/Disabled', + }, + }, + 10 => { + Name => 'SuperimposedDisplay', + PrintConv => \%onOff, + }, + 11 => { + Name => 'MenuButtonDisplayPosition', + PrintConv => { + 0 => 'Previous (top if power off)', + 1 => 'Previous', + 2 => 'Top', + }, + }, + 12 => { + Name => 'MirrorLockup', + PrintConv => \%disableEnable, + }, + 13 => { + Name => 'AFPointSelectionMethod', + PrintConv => { + 0 => 'Normal', + 1 => 'Multi-controller direct', + 2 => 'Quick Control Dial direct', + }, + }, + 14 => { + Name => 'ETTLII', + Description => 'E-TTL II', + PrintConv => { + 0 => 'Evaluative', + 1 => 'Average', + }, + }, + 15 => { + Name => 'ShutterCurtainSync', + PrintConv => { + 0 => '1st-curtain sync', + 1 => '2nd-curtain sync', + }, + }, + 16 => { + Name => 'SafetyShiftInAvOrTv', + PrintConv => \%disableEnable, + }, + 17 => { + Name => 'AFPointActivationArea', + PrintConv => { + 0 => 'Standard', + 1 => 'Expanded', + }, + }, + 18 => { + Name => 'LCDDisplayReturnToShoot', + PrintConv => { + 0 => 'With Shutter Button only', + 1 => 'Also with * etc.', + }, + }, + 19 => { + Name => 'LensAFStopButton', + PrintConv => { + 0 => 'AF stop', + 1 => 'AF start', + 2 => 'AE lock while metering', + 3 => 'AF point: M -> Auto / Auto -> Ctr.', + 4 => 'ONE SHOT <-> AI SERVO', + 5 => 'IS start', + }, + }, + 20 => { + Name => 'AddOriginalDecisionData', + PrintConv => \%offOn, + }, +); + +# Custom functions for 10D +%Image::ExifTool::CanonCustom::Functions10D = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessCanonCustom, + WRITE_PROC => \&WriteCanonCustom, + CHECK_PROC => \&CheckCanonCustom, + WRITABLE => 'int8u', + 1 => { + Name => 'SetButtonWhenShooting', + PrintConv => { + 0 => 'Normal (disabled)', + 1 => 'Image quality', + 2 => 'Change parameters', + 3 => 'Menu display', + 4 => 'Image playback', + }, + }, + 2 => { + Name => 'ShutterReleaseNoCFCard', + Description => 'Shutter Release W/O CF Card', + PrintConv => { + 0 => 'Yes', + 1 => 'No', + }, + }, + 3 => { + Name => 'FlashSyncSpeedAv', + PrintConv => { + 0 => 'Auto', + 1 => '1/200 Fixed', + }, + }, + 4 => { + Name => 'Shutter-AELock', + PrintConv => { + 0 => 'AF/AE lock', + 1 => 'AE lock/AF', + 2 => 'AF/AF lock, No AE lock', + 3 => 'AE/AF, No AE lock', + }, + }, + 5 => { + Name => 'AFAssist', + Description => 'AF Assist/Flash Firing', + PrintConv => { + 0 => 'Emits/Fires', + 1 => 'Does not emit/Fires', + 2 => 'Only ext. flash emits/Fires', + 3 => 'Emits/Does not fire', + }, + }, + 6 => { + Name => 'ExposureLevelIncrements', + PrintConv => { + 0 => '1/2 Stop', + 1 => '1/3 Stop', + }, + }, + 7 => { + Name => 'AFPointRegistration', + PrintConv => { + 0 => 'Center', + 1 => 'Bottom', + 2 => 'Right', + 3 => 'Extreme Right', + 4 => 'Automatic', + 5 => 'Extreme Left', + 6 => 'Left', + 7 => 'Top', + }, + }, + 8 => { + Name => 'RawAndJpgRecording', + PrintConv => { + 0 => 'RAW+Small/Normal', + 1 => 'RAW+Small/Fine', + 2 => 'RAW+Medium/Normal', + 3 => 'RAW+Medium/Fine', + 4 => 'RAW+Large/Normal', + 5 => 'RAW+Large/Fine', + }, + }, + 9 => { + Name => 'AEBSequenceAutoCancel', + Description => 'AEB Sequence/Auto Cancel', + PrintConv => { + 0 => '0,-,+/Enabled', + 1 => '0,-,+/Disabled', + 2 => '-,0,+/Enabled', + 3 => '-,0,+/Disabled', + }, + }, + 10 => { + Name => 'SuperimposedDisplay', + PrintConv => \%onOff, + }, + 11 => { + Name => 'MenuButtonDisplayPosition', + PrintConv => { + 0 => 'Previous (top if power off)', + 1 => 'Previous', + 2 => 'Top', + }, + }, + 12 => { + Name => 'MirrorLockup', + PrintConv => \%disableEnable, + }, + 13 => { + Name => 'AssistButtonFunction', + PrintConv => { + 0 => 'Normal', + 1 => 'Select Home Position', + 2 => 'Select HP (while pressing)', + 3 => 'Av+/- (AF point by QCD)', + 4 => 'FE lock', + }, + }, + 14 => { + Name => 'FillFlashAutoReduction', + PrintConv => \%enableDisable, + }, + 15 => { + Name => 'ShutterCurtainSync', + PrintConv => { + 0 => '1st-curtain sync', + 1 => '2nd-curtain sync', + }, + }, + 16 => { + Name => 'SafetyShiftInAvOrTv', + PrintConv => \%disableEnable, + }, + 17 => { + Name => 'LensAFStopButton', + PrintConv => { + 0 => 'AF stop', + 1 => 'AF start', + 2 => 'AE lock while metering', + 3 => 'AF point: M->Auto/Auto->ctr', + 4 => 'One Shot <-> AI servo', + 5 => 'IS start', + }, + }, +); + +# Custom functions for the 20D (ref 2) +%Image::ExifTool::CanonCustom::Functions20D = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessCanonCustom, + WRITE_PROC => \&WriteCanonCustom, + CHECK_PROC => \&CheckCanonCustom, + WRITABLE => 'int8u', + 0 => { + Name => 'SetFunctionWhenShooting', + PrintConv => { + 0 => 'Default (no function)', + 1 => 'Change quality', + 2 => 'Change Parameters', + 3 => 'Menu display', + 4 => 'Image replay', + }, + }, + 1 => { + Name => 'LongExposureNoiseReduction', + PrintConv => \%offOn, + }, + 2 => { + Name => 'FlashSyncSpeedAv', + PrintConv => { + 0 => 'Auto', + 1 => '1/250 Fixed', + }, + }, + 3 => { + Name => 'Shutter-AELock', + PrintConv => { + 0 => 'AF/AE lock', + 1 => 'AE lock/AF', + 2 => 'AF/AF lock, No AE lock', + 3 => 'AE/AF, No AE lock', + }, + }, + 4 => { + Name => 'AFAssistBeam', + PrintConv => { + 0 => 'Emits', + 1 => 'Does not emit', + 2 => 'Only ext. flash emits', + }, + }, + 5 => { + Name => 'ExposureLevelIncrements', + PrintConv => { + 0 => '1/3 Stop', + 1 => '1/2 Stop', + }, + }, + 6 => { + Name => 'FlashFiring', + PrintConv => { + 0 => 'Fires', + 1 => 'Does not fire', + }, + }, + 7 => { + Name => 'ISOExpansion', + PrintConv => \%offOn, + }, + 8 => { + Name => 'AEBSequenceAutoCancel', + Description => 'AEB Sequence/Auto Cancel', + PrintConv => { + 0 => '0,-,+/Enabled', + 1 => '0,-,+/Disabled', + 2 => '-,0,+/Enabled', + 3 => '-,0,+/Disabled', + }, + }, + 9 => { + Name => 'SuperimposedDisplay', + PrintConv => \%onOff, + }, + 10 => { + Name => 'MenuButtonDisplayPosition', + PrintConv => { + 0 => 'Previous (top if power off)', + 1 => 'Previous', + 2 => 'Top', + }, + }, + 11 => { + Name => 'MirrorLockup', + PrintConv => \%disableEnable, + }, + 12 => { + Name => 'AFPointSelectionMethod', + PrintConv => { + 0 => 'Normal', + 1 => 'Multi-controller direct', + 2 => 'Quick Control Dial direct', + }, + }, + 13 => { + Name => 'ETTLII', + Description => 'E-TTL II', + PrintConv => { + 0 => 'Evaluative', + 1 => 'Average', + }, + }, + 14 => { + Name => 'ShutterCurtainSync', + PrintConv => { + 0 => '1st-curtain sync', + 1 => '2nd-curtain sync', + }, + }, + 15 => { + Name => 'SafetyShiftInAvOrTv', + PrintConv => \%disableEnable, + }, + 16 => { + Name => 'LensAFStopButton', + PrintConv => { + 0 => 'AF stop', + 1 => 'AF start', + 2 => 'AE lock while metering', + 3 => 'AF point: M -> Auto / Auto -> Ctr.', + 4 => 'ONE SHOT <-> AI SERVO', + 5 => 'IS start', + }, + }, + 17 => { + Name => 'AddOriginalDecisionData', + PrintConv => \%offOn, + }, +); + +# Custom functions for the 30D (PH) +%Image::ExifTool::CanonCustom::Functions30D = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessCanonCustom, + WRITE_PROC => \&WriteCanonCustom, + CHECK_PROC => \&CheckCanonCustom, + WRITABLE => 'int8u', + 1 => { + Name => 'SetFunctionWhenShooting', + PrintConv => { + 0 => 'Default (no function)', + 1 => 'Change quality', + 2 => 'Change Picture Style', + 3 => 'Menu display', + 4 => 'Image replay', + }, + }, + 2 => { + Name => 'LongExposureNoiseReduction', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'On', + }, + }, + 3 => { + Name => 'FlashSyncSpeedAv', + PrintConv => { + 0 => 'Auto', + 1 => '1/250 Fixed', + }, + }, + 4 => { + Name => 'Shutter-AELock', + PrintConv => { + 0 => 'AF/AE lock', + 1 => 'AE lock/AF', + 2 => 'AF/AF lock, No AE lock', + 3 => 'AE/AF, No AE lock', + }, + }, + 5 => { + Name => 'AFAssistBeam', + PrintConv => { + 0 => 'Emits', + 1 => 'Does not emit', + 2 => 'Only ext. flash emits', + }, + }, + 6 => { + Name => 'ExposureLevelIncrements', + PrintConv => { + 0 => '1/3 Stop', + 1 => '1/2 Stop', + }, + }, + 7 => { + Name => 'FlashFiring', + PrintConv => { + 0 => 'Fires', + 1 => 'Does not fire', + }, + }, + 8 => { + Name => 'ISOExpansion', + PrintConv => \%offOn, + }, + 9 => { + Name => 'AEBSequenceAutoCancel', + Description => 'AEB Sequence/Auto Cancel', + PrintConv => { + 0 => '0,-,+/Enabled', + 1 => '0,-,+/Disabled', + 2 => '-,0,+/Enabled', + 3 => '-,0,+/Disabled', + }, + }, + 10 => { + Name => 'SuperimposedDisplay', + PrintConv => \%onOff, + }, + 11 => { + Name => 'MenuButtonDisplayPosition', + PrintConv => { + 0 => 'Previous (top if power off)', + 1 => 'Previous', + 2 => 'Top', + }, + }, + 12 => { + Name => 'MirrorLockup', + PrintConv => \%disableEnable, + }, + 13 => { + Name => 'AFPointSelectionMethod', + PrintConv => { + 0 => 'Normal', + 1 => 'Multi-controller direct', + 2 => 'Quick Control Dial direct', + }, + }, + 14 => { + Name => 'ETTLII', + Description => 'E-TTL II', + PrintConv => { + 0 => 'Evaluative', + 1 => 'Average', + }, + }, + 15 => { + Name => 'ShutterCurtainSync', + PrintConv => { + 0 => '1st-curtain sync', + 1 => '2nd-curtain sync', + }, + }, + 16 => { + Name => 'SafetyShiftInAvOrTv', + PrintConv => \%disableEnable, + }, + 17 => { + Name => 'MagnifiedView', + PrintConv => { + 0 => 'Image playback only', + 1 => 'Image review and playback', + }, + }, + 18 => { + Name => 'LensAFStopButton', + PrintConv => { + 0 => 'AF stop', + 1 => 'AF start', + 2 => 'AE lock while metering', + 3 => 'AF point: M -> Auto / Auto -> Ctr.', + 4 => 'ONE SHOT <-> AI SERVO', + 5 => 'IS start', + }, + }, + 19 => { + Name => 'AddOriginalDecisionData', + PrintConv => \%offOn, + }, +); + +# Custom functions for the 350D (PH) +%Image::ExifTool::CanonCustom::Functions350D = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessCanonCustom, + WRITE_PROC => \&WriteCanonCustom, + CHECK_PROC => \&CheckCanonCustom, + WRITABLE => 'int8u', + 0 => { + Name => 'SetButtonCrossKeysFunc', + PrintConv => { + 0 => 'Normal', + 1 => 'Set: Quality', + 2 => 'Set: Parameter', + 3 => 'Set: Playback', + 4 => 'Cross keys: AF point select', + }, + }, + 1 => { + Name => 'LongExposureNoiseReduction', + PrintConv => \%offOn, + }, + 2 => { + Name => 'FlashSyncSpeedAv', + PrintConv => { + 0 => 'Auto', + 1 => '1/200 Fixed', + }, + }, + 3 => { + Name => 'Shutter-AELock', + PrintConv => { + 0 => 'AF/AE lock', + 1 => 'AE lock/AF', + 2 => 'AF/AF lock, No AE lock', + 3 => 'AE/AF, No AE lock', + }, + }, + 4 => { + Name => 'AFAssistBeam', + PrintConv => { + 0 => 'Emits', + 1 => 'Does not emit', + 2 => 'Only ext. flash emits', + }, + }, + 5 => { + Name => 'ExposureLevelIncrements', + PrintConv => { + 0 => '1/3 Stop', + 1 => '1/2 Stop', + }, + }, + 6 => { + Name => 'MirrorLockup', + PrintConv => \%disableEnable, + }, + 7 => { + Name => 'ETTLII', + Description => 'E-TTL II', + PrintConv => { + 0 => 'Evaluative', + 1 => 'Average', + }, + }, + 8 => { + Name => 'ShutterCurtainSync', + PrintConv => { + 0 => '1st-curtain sync', + 1 => '2nd-curtain sync', + }, + }, +); + +# Custom functions for the 400D (PH) +%Image::ExifTool::CanonCustom::Functions400D = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessCanonCustom, + WRITE_PROC => \&WriteCanonCustom, + CHECK_PROC => \&CheckCanonCustom, + WRITABLE => 'int8u', + 0 => { + Name => 'SetButtonCrossKeysFunc', + PrintConv => { + 0 => 'Set: Picture Style', + 1 => 'Set: Quality', + 2 => 'Set: Flash Exposure Comp', + 3 => 'Set: Playback', + 4 => 'Cross keys: AF point select', + }, + }, + 1 => { + Name => 'LongExposureNoiseReduction', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'On', + }, + }, + 2 => { + Name => 'FlashSyncSpeedAv', + PrintConv => { + 0 => 'Auto', + 1 => '1/200 Fixed', + }, + }, + 3 => { + Name => 'Shutter-AELock', + PrintConv => { + 0 => 'AF/AE lock', + 1 => 'AE lock/AF', + 2 => 'AF/AF lock, No AE lock', + 3 => 'AE/AF, No AE lock', + }, + }, + 4 => { + Name => 'AFAssistBeam', + PrintConv => { + 0 => 'Emits', + 1 => 'Does not emit', + 2 => 'Only ext. flash emits', + }, + }, + 5 => { + Name => 'ExposureLevelIncrements', + PrintConv => { + 0 => '1/3 Stop', + 1 => '1/2 Stop', + }, + }, + 6 => { + Name => 'MirrorLockup', + PrintConv => \%disableEnable, + }, + 7 => { + Name => 'ETTLII', + Description => 'E-TTL II', + PrintConv => { + 0 => 'Evaluative', + 1 => 'Average', + }, + }, + 8 => { + Name => 'ShutterCurtainSync', + PrintConv => { + 0 => '1st-curtain sync', + 1 => '2nd-curtain sync', + }, + }, + 9 => { + Name => 'MagnifiedView', + PrintConv => { + 0 => 'Image playback only', + 1 => 'Image review and playback', + }, + }, + 10 => { + Name => 'LCDDisplayAtPowerOn', + PrintConv => { + 0 => 'Display', + 1 => 'Retain power off status', + }, + }, +); + +# Custom functions for the D30/D60 +%Image::ExifTool::CanonCustom::FunctionsD30 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessCanonCustom, + WRITE_PROC => \&WriteCanonCustom, + CHECK_PROC => \&CheckCanonCustom, + NOTES => 'Custom functions for the EOS D30 and D60.', + WRITABLE => 'int8u', + 1 => { + Name => 'LongExposureNoiseReduction', + PrintConv => \%offOn, + }, + 2 => { + Name => 'Shutter-AELock', + PrintConv => { + 0 => 'AF/AE lock', + 1 => 'AE lock/AF', + 2 => 'AF/AF lock', + 3 => 'AE+release/AE+AF', + }, + }, + 3 => { + Name => 'MirrorLockup', + PrintConv => \%disableEnable, + }, + 4 => { + Name => 'ExposureLevelIncrements', + PrintConv => { + 0 => '1/2 Stop', + 1 => '1/3 Stop', + }, + }, + 5 => { + Name => 'AFAssist', + PrintConv => { + 0 => 'Emits/Fires', + 1 => 'Does not emit/Fires', + 2 => 'Only ext. flash emits/Fires', + 3 => 'Emits/Does not fire', + }, + }, + 6 => { + Name => 'FlashSyncSpeedAv', + PrintConv => { + 0 => 'Auto', + 1 => '1/200 Fixed', + }, + }, + 7 => { + Name => 'AEBSequenceAutoCancel', + Description => 'AEB Sequence/Auto Cancel', + PrintConv => { + 0 => '0,-,+/Enabled', + 1 => '0,-,+/Disabled', + 2 => '-,0,+/Enabled', + 3 => '-,0,+/Disabled', + }, + }, + 8 => { + Name => 'ShutterCurtainSync', + PrintConv => { + 0 => '1st-curtain sync', + 1 => '2nd-curtain sync', + }, + }, + 9 => { + Name => 'LensAFStopButton', + PrintConv => { + 0 => 'AF Stop', + 1 => 'Operate AF', + 2 => 'Lock AE and start timer', + }, + }, + 10 => { + Name => 'FillFlashAutoReduction', + PrintConv => \%enableDisable, + }, + 11 => { + Name => 'MenuButtonReturn', + PrintConv => { + 0 => 'Top', + 1 => 'Previous (volatile)', + 2 => 'Previous', + }, + }, + 12 => { + Name => 'SetButtonWhenShooting', + PrintConv => { + 0 => 'Default (no function)', + 1 => 'Image quality', + 2 => 'Change ISO speed', + 3 => 'Change parameters', + }, + }, + 13 => { + Name => 'SensorCleaning', + PrintConv => \%disableEnable, + }, + 14 => { + Name => 'SuperimposedDisplay', + PrintConv => \%onOff, + }, + 15 => { + Name => 'ShutterReleaseNoCFCard', + Description => 'Shutter Release W/O CF Card', + PrintConv => { + 0 => 'Yes', + 1 => 'No', + }, + }, +); + +# Custom functions for unknown cameras +%Image::ExifTool::CanonCustom::FuncsUnknown = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessCanonCustom, +); + +# 1D personal function settings (ref PH) +%Image::ExifTool::CanonCustom::PersonalFuncs = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + NOTES => 'Personal function settings for the EOS-1D.', + FORMAT => 'int16u', + FIRST_ENTRY => 1, + 1 => { Name => 'PF0CustomFuncRegistration', %convPFn }, + 2 => { Name => 'PF1DisableShootingModes', %convPFn }, + 3 => { Name => 'PF2DisableMeteringModes', %convPFn }, + 4 => { Name => 'PF3ManualExposureMetering', %convPFn }, + 5 => { Name => 'PF4ExposureTimeLimits', %convPFn }, + 6 => { Name => 'PF5ApertureLimits', %convPFn }, + 7 => { Name => 'PF6PresetShootingModes', %convPFn }, + 8 => { Name => 'PF7BracketContinuousShoot', %convPFn }, + 9 => { Name => 'PF8SetBracketShots', %convPFn }, + 10 => { Name => 'PF9ChangeBracketSequence', %convPFn }, + 11 => { Name => 'PF10RetainProgramShift', %convPFn }, + #12 => { Name => 'PF11Unused', %convPFn }, + #13 => { Name => 'PF12Unused', %convPFn }, + 14 => { Name => 'PF13DrivePriority', %convPFn }, + 15 => { Name => 'PF14DisableFocusSearch', %convPFn }, + 16 => { Name => 'PF15DisableAFAssistBeam', %convPFn }, + 17 => { Name => 'PF16AutoFocusPointShoot', %convPFn }, + 18 => { Name => 'PF17DisableAFPointSel', %convPFn }, + 19 => { Name => 'PF18EnableAutoAFPointSel', %convPFn }, + 20 => { Name => 'PF19ContinuousShootSpeed', %convPFn }, + 21 => { Name => 'PF20LimitContinousShots', %convPFn }, + 22 => { Name => 'PF21EnableQuietOperation', %convPFn }, + #23 => { Name => 'PF22Unused', %convPFn }, + 24 => { Name => 'PF23SetTimerLengths', %convPFn }, + 25 => { Name => 'PF24LightLCDDuringBulb', %convPFn }, + 26 => { Name => 'PF25DefaultClearSettings', %convPFn }, + 27 => { Name => 'PF26ShortenReleaseLag', %convPFn }, + 28 => { Name => 'PF27ReverseDialRotation', %convPFn }, + 29 => { Name => 'PF28NoQuickDialExpComp', %convPFn }, + 30 => { Name => 'PF29QuickDialSwitchOff', %convPFn }, + 31 => { Name => 'PF30EnlargementMode', %convPFn }, + 32 => { Name => 'PF31OriginalDecisionData', %convPFn }, +); + +# 1D personal function values (ref PH) +%Image::ExifTool::CanonCustom::PersonalFuncValues = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int16u', + FIRST_ENTRY => 1, + 1 => 'PF1Value', + 2 => 'PF2Value', + 3 => 'PF3Value', + 4 => { + Name => 'PF4ExposureTimeMin', + RawConv => '$val > 0 ? $val : 0', + ValueConv => 'exp(-Image::ExifTool::Canon::CanonEv($val*4)*log(2))*1000/8', + ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(-log($val*8/1000)/log(2))/4', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 5 => { + Name => 'PF4ExposureTimeMax', + RawConv => '$val > 0 ? $val : 0', + ValueConv => 'exp(-Image::ExifTool::Canon::CanonEv($val*4)*log(2))*1000/8', + ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(-log($val*8/1000)/log(2))/4', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 6 => { + Name => 'PF5ApertureMin', + RawConv => '$val > 0 ? $val : 0', + ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val*4-32)*log(2)/2)', + ValueConvInv => '(Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))+32)/4', + PrintConv => 'sprintf("%.2g",$val)', + PrintConvInv => '$val', + }, + 7 => { + Name => 'PF5ApertureMax', + RawConv => '$val > 0 ? $val : 0', + ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val*4-32)*log(2)/2)', + ValueConvInv => '(Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))+32)/4', + PrintConv => 'sprintf("%.2g",$val)', + PrintConvInv => '$val', + }, + 8 => 'PF8BracketShots', + 9 => 'PF19ShootingSpeedLow', + 10 => 'PF19ShootingSpeedHigh', + 11 => 'PF20MaxContinousShots', + 12 => 'PF23ShutterButtonTime', + 13 => 'PF23FELockTime', + 14 => 'PF23PostReleaseTime', + 15 => 'PF25AEMode', + 16 => 'PF25MeteringMode', + 17 => 'PF25DriveMode', + 18 => 'PF25AFMode', + 19 => 'PF25AFPointSel', + 20 => 'PF25ImageSize', + 21 => 'PF25WBMode', + 22 => 'PF25Parameters', + 23 => 'PF25ColorMatrix', + 24 => 'PF27Value', +); + +# Custom functions used by the 1D Mark III and later models (ref PH) +%Image::ExifTool::CanonCustom::Functions2 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessCanonCustom2, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITE_PROC => \&WriteCanonCustom2, + WRITABLE => 'int32s', + NOTES => q{ + Beginning with the EOS 1D Mark III, Canon finally created a set of custom + function tags which are (reasonably) consistent across models. The EOS 1D + Mark III has 57 custom function tags divided into four main groups: 1. + Exposure (0x0101-0x010f), 2. Image (0x0201-0x0203), Flash Exposure + (0x0304-0x0306) and Display (0x0407-0x0409), 3. Auto Focus (0x0501-0x050e) + and Drive (0x060f-0x0611), and 4. Operation (0x0701-0x070a) and Others + (0x080b-0x0810). The table below lists tags used by the EOS 1D Mark III, as + well as newer tags and values added by later models. + }, + # grouped in 4 groups: + # 1) Exposure + 0x0101 => [ + { + Name => 'ExposureLevelIncrements', + Condition => '$$self{Model} =~ /\b1Ds?\b/', + Notes => '1DmkIII and 1DmkIV', + PrintConv => { + 0 => '1/3-stop set, 1/3-stop comp.', + 1 => '1-stop set, 1/3-stop comp.', + 2 => '1/2-stop set, 1/2-stop comp.', + }, + }, + { + Name => 'ExposureLevelIncrements', + Notes => 'other models', + PrintConv => { + 0 => '1/3 Stop', + 1 => '1/2 Stop', + }, + }, + ], + 0x0102 => { + Name => 'ISOSpeedIncrements', + PrintConv => { + 0 => '1/3 Stop', + 1 => '1 Stop', + }, + }, + 0x0103 => [ + { + Name => 'ISOSpeedRange', + Condition => '$$self{Model} =~ /\b1D/', + Notes => '1DmkIII and 1DmkIV', + Count => 3, + # (this decoding may not be valid for CR2 images?) + ValueConv => [ + undef, + # this may also be set to "H" (Hi6400) -- is this the -1 value I see? - PH + '$val < 2 ? $val : ($val < 1000 ? exp(($val/8-9)*log(2))*100 : 0)', # (educated guess) + # this may also be set to "L" (Lo50) -- is this the 1 value I see? - PH + '$val < 2 ? $val : ($val < 1000 ? exp(($val/8-9)*log(2))*100 : 0)', # (educated guess) + ], + ValueConvInv => [ + undef, + '$val < 2 ? $val : int(8*(log($val/100)/log(2)+9) + 0.5)', + '$val < 2 ? $val : int(8*(log($val/100)/log(2)+9) + 0.5)', + ], + PrintConv => [ + \%disableEnable, + 'sprintf("Max %.0f",$val)', + 'sprintf("Min %.0f",$val)', + ], + PrintConvInv => [ + undef, + '$val=~/(-?[\d.]+)/ ? $1 : 0', + '$val=~/(-?[\d.]+)/ ? $1 : 0', + ], + }, + { + Name => 'ISOExpansion', + Notes => 'other models', + PrintConv => \%offOn, + }, + ], + 0x0104 => { + Name => 'AEBAutoCancel', + PrintConv => \%onOff, + }, + 0x0105 => { + Name => 'AEBSequence', + Notes => 'value of 2 not used by 40D, 50D, 60D, 5DmkII and 7D', + PrintConv => { + 0 => '0,-,+', + 1 => '-,0,+', + 2 => '+,0,-', + }, + }, + 0x0106 => [{ + Name => 'AEBShotCount', + Condition => '$$self{Model} =~ /\b90D\b/', + Notes => 'EOS 90D', # (and who knows what others?) + PrintConv => { + 2 => '2 shots', + 3 => '3 shots', + 5 => '5 shots', + 7 => '7 shots', + }, + },{ + Name => 'AEBShotCount', + Condition => '$count == 1', + Notes => 'other models storing a single value', + PrintConv => { + 0 => '3 shots', + 1 => '2 shots', + 2 => '5 shots', + 3 => '7 shots', + }, + },{ + Name => 'AEBShotCount', + Count => 2, + Notes => 'models storing two values', + PrintConv => { + '3 0' => '3 shots', + '2 1' => '2 shots', + '5 2' => '5 shots', + '7 3' => '7 shots', + }, + }], + 0x0107 => { + Name => 'SpotMeterLinkToAFPoint', + PrintConv => { + 0 => 'Disable (use center AF point)', + 1 => 'Enable (use active AF point)', + }, + }, + 0x0108 => { + Name => 'SafetyShift', + Notes => 'value of 2 not used by some models', # eg. 40D, 50D, 60D, 5DmkII, 7D, 250D + PrintConv => { + 0 => 'Disable', + 1 => 'Enable (Tv/Av)', + 2 => 'Enable (ISO speed)', + }, + }, + 0x0109 => [{ # (1DXmkIII) + Name => 'UsableShootingModes', + Condition => '$count == 1', + Count => 1, + PrintConv => 'sprintf("Flags 0x%x",$val)', + PrintConvInv => '$val=~/0x([\dA-F]+)/i ? hex($1) : undef', + },{ + Name => 'UsableShootingModes', + Count => 2, + PrintConv => [ + \%disableEnable, + 'sprintf("Flags 0x%x",$val)', # (M, Tv, Av, P, Bulb) + ], + PrintConvInv => [ + undef, + '$val=~/0x([\dA-F]+)/i ? hex($1) : undef', + ], + }], + 0x010a => [{ # (1DXmkIII) + Name => 'UsableMeteringModes', + Condition => '$count == 1', + Count => 1, + PrintConv => 'sprintf("Flags 0x%x",$val)', + PrintConvInv => '$val=~/0x([\dA-F]+)/i ? hex($1) : undef', + },{ + Name => 'UsableMeteringModes', + Count => 2, + PrintConv => [ + \%disableEnable, + 'sprintf("Flags 0x%x",$val)', # (evaluative,partial,spot,center-weighted average) + ], + PrintConvInv => [ + undef, + '$val=~/0x([\dA-F]+)/i ? hex($1) : undef', + ], + }], + 0x010b => { + Name => 'ExposureModeInManual', + PrintConv => { + 0 => 'Specified metering mode', + 1 => 'Evaluative metering', + 2 => 'Partial metering', + 3 => 'Spot metering', + 4 => 'Center-weighted average', + }, + }, + 0x010c => [{ + Name => 'ShutterSpeedRange', + Condition => '$count == 3', + Count => 3, + ValueConv => [ + undef, + 'exp(-($val/8-7)*log(2))', + 'exp(-($val/8-7)*log(2))', + ], + ValueConvInv => [ + undef, + 'int(-8*(log($val)/log(2)-7) + 0.5)', + 'int(-8*(log($val)/log(2)-7) + 0.5)', + ], + PrintConv => [ + \%disableEnable, + '"Hi " . Image::ExifTool::Exif::PrintExposureTime($val)', + '"Lo " . Image::ExifTool::Exif::PrintExposureTime($val)', + ], + PrintConvInv => [ + undef, + '$val=~m{([\d./]+)} ? eval $1 : 0', + '$val=~m{([\d./]+)} ? eval $1 : 0', + ], + },{ # (EOS R) + Name => 'ShutterSpeedRange', + Condition => '$count == 4', + Count => 4, + ValueConv => [ # (NC) + 'exp(-$val/(1600*log(2)))', + 'exp(-$val/(1600*log(2)))', + 'exp(-$val/(1600*log(2)))', + 'exp(-$val/(1600*log(2)))', + ], + ValueConvInv => [ + 'int(-log($val)*1600*log(2) + 0.5)', + 'int(-log($val)*1600*log(2) + 0.5)', + 'int(-log($val)*1600*log(2) + 0.5)', + 'int(-log($val)*1600*log(2) + 0.5)', + ], + PrintConv => [ # (NC) + '"Manual: Hi " . Image::ExifTool::Exif::PrintExposureTime($val)', + '"Lo " . Image::ExifTool::Exif::PrintExposureTime($val)', + '"Auto: Hi " . Image::ExifTool::Exif::PrintExposureTime($val)', + '"Lo " . Image::ExifTool::Exif::PrintExposureTime($val)', + ], + PrintConvInv => [ + '$val=~m{([\d./]+)} ? eval $1 : 0', + '$val=~m{([\d./]+)} ? eval $1 : 0', + '$val=~m{([\d./]+)} ? eval $1 : 0', + '$val=~m{([\d./]+)} ? eval $1 : 0', + ], + }], + 0x010d => [{ + Name => 'ApertureRange', + Condition => '$count == 3', + Count => 3, + ValueConv => [ + undef, + 'exp(($val/8-1)*log(2)/2)', + 'exp(($val/8-1)*log(2)/2)', + ], + ValueConvInv => [ + undef, + 'int(8*(log($val)*2/log(2)+1) + 0.5)', + 'int(8*(log($val)*2/log(2)+1) + 0.5)', + ], + PrintConv => [ + \%disableEnable, + 'sprintf("Closed %.2g",$val)', + 'sprintf("Open %.2g",$val)', + ], + PrintConvInv => [ + undef, + '$val=~/([\d.]+)/ ? $1 : 0', + '$val=~/([\d.]+)/ ? $1 : 0', + ], + },{ # (EOS R) + Name => 'ApertureRange', + Condition => '$count == 4', + Count => 4, + ValueConv => [ # (NC) + 'exp($val/2400)', + 'exp($val/2400)', + 'exp($val/2400)', + 'exp($val/2400)', + ], + ValueConvInv => [ + 'int(log($val)*2400) + 0.5)', + 'int(log($val)*2400) + 0.5)', + 'int(log($val)*2400) + 0.5)', + 'int(log($val)*2400) + 0.5)', + ], + PrintConv => [ # (NC) + 'sprintf("Manual: Closed %.2g",$val)', + 'sprintf("Open %.2g",$val)', + 'sprintf("Auto: Closed %.2g",$val)', + 'sprintf("Open %.2g",$val)', + ], + PrintConvInv => [ + '$val=~/([\d.]+)/ ? $1 : 0', + '$val=~/([\d.]+)/ ? $1 : 0', + '$val=~/([\d.]+)/ ? $1 : 0', + '$val=~/([\d.]+)/ ? $1 : 0', + ], + }], + 0x010e => { + Name => 'ApplyShootingMeteringMode', + Count => 8, + PrintConv => [ \%disableEnable ], + }, + 0x010f => [ + { + Name => 'FlashSyncSpeedAv', + Condition => '$$self{Model} =~ /\b(40D|1Ds Mark III)\b/', + Notes => '40D and 1Ds Mark III', + PrintConv => { + 0 => 'Auto', + 1 => '1/250 Fixed', + }, + }, + { + Name => 'FlashSyncSpeedAv', + Condition => '$$self{Model} =~ /\b(50D|60D|7D)\b/', + Notes => '50D, 60D and 7D', + PrintConv => { + 0 => 'Auto', + 1 => '1/250-1/60 Auto', + 2 => '1/250 Fixed', + }, + }, + { + Name => 'FlashSyncSpeedAv', + Condition => '$$self{Model} =~ /\b(450D|XSi|Kiss X2|1000D|XS|Kiss F)\b/', + Notes => '450D and 1000D', + PrintConv => { + 0 => 'Auto', + 1 => '1/200 Fixed', + }, + }, + { + Name => 'FlashSyncSpeedAv', + Condition => '$$self{Model} =~ /\bEOS-1Ds? Mark III\b/', + Notes => '1D Mark III and 1Ds Mark III', + PrintConv => { + 0 => 'Auto', + 1 => '1/300 Fixed', + }, + }, + { + Name => 'FlashSyncSpeedAv', + Condition => '$$self{Model} =~ /\bEOS-1D Mark IV\b/', + Notes => '1D Mark IV', + PrintConv => { + 0 => 'Auto', + 1 => '1/300-1/60 Auto', + 2 => '1/300 Fixed', + }, + }, + { + Name => 'FlashSyncSpeedAv', + Notes => '5D Mark II, 5D Mark III, 500D, 550D, 600D and 1100D', + PrintConv => { + 0 => 'Auto', + 1 => '1/200-1/60 Auto', + 2 => '1/200 Fixed', + }, + }, + ], + 0x0110 => { # new for 1DmkIV + Name => 'AEMicroadjustment', + Count => 3, + PrintConv => [ \%disableEnable ], + }, + 0x0111 => { # new for 1DmkIV + Name => 'FEMicroadjustment', + Count => 3, + PrintConv => [ \%disableEnable ], + }, + 0x0112 => [{ # (5DS) + Name => 'SameExposureForNewAperture', + PrintConv => { + 0 => 'Disable', + 1 => 'ISO Speed', + 2 => 'Shutter Speed', + }, + },{ # (EOS R) + Name => 'SameExposureForNewAperture', + Notes => 'EOS R', + PrintConv => { + 0 => 'Disable', + 1 => 'ISO Speed', + 2 => 'ISO Speed/Shutter Speed', + 3 => 'Shutter Speed', + }, + }], + 0x0113 => { # (200D) + Name => 'ExposureCompAutoCancel', + PrintConv => \%enableDisable, + }, + 0x0114 => { # (R) + Name => 'AELockMeterModeAfterFocus', + # metering modes where AE lock after focus applies: + PrintConv => { BITMASK => { # (NC) + 0 => 'Evaluative', + 1 => 'Partial', + 2 => 'Spot', + 3 => 'Center-weighted', + }}, + }, + #### 2a) Image + 0x0201 => { + Name => 'LongExposureNoiseReduction', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'On', + }, + }, + 0x0202 => [ + { + Name => 'HighISONoiseReduction', + Condition => q{ + $$self{Model} =~ /\b(50D|60D|5D Mark II|7D|500D|T1i|Kiss X3|550D|T2i|Kiss X4)\b/ or + $$self{Model} =~ /\b(600D|T3i|Kiss X5|1100D|T3|Kiss X50)\b/ + }, + Notes => '50D, 60D, 500D, 550D, 600D, 1100D, 5DmkII and 7D', + PrintConv => { + 0 => 'Standard', + 1 => 'Low', + 2 => 'Strong', + 3 => 'Off', + }, + }, + { + Name => 'HighISONoiseReduction', + Notes => 'other models', + PrintConv => \%offOn, + }, + ], + 0x0203 => { + Name => 'HighlightTonePriority', + PrintConv => \%disableEnable + }, + 0x0204 => [ + { + Name => 'AutoLightingOptimizer', + Condition => '$$self{Model} =~ /\b(50D|5D Mark II|500D|T1i|Kiss X3|1D Mark IV)\b/', + Notes => '50D, 500D, 5DmkII and 1DmkIV', + PrintConv => { + 0 => 'Standard', + 1 => 'Low', + 2 => 'Strong', + 3 => 'Disable', + }, + }, + { + Name => 'AutoLightingOptimizer', + Notes => 'other models', + PrintConv => \%enableDisable, + }, + ], + # 0x0205 - Added in 5DmkII firmware update + #### 2b) Flash exposure + 0x0304 => { + Name => 'ETTLII', + Description => 'E-TTL II', + PrintConv => { + 0 => 'Evaluative', + 1 => 'Average', + }, + }, + 0x0305 => { + Name => 'ShutterCurtainSync', + PrintConv => { + 0 => '1st-curtain sync', + 1 => '2nd-curtain sync', + }, + }, + 0x0306 => { + Name => 'FlashFiring', + PrintConv => { + 0 => 'Fires', + 1 => 'Does not fire', + }, + }, + #### 2c) Display + 0x0407 => { + Name => 'ViewInfoDuringExposure', + PrintConv => \%disableEnable, + }, + 0x0408 => { + Name => 'LCDIlluminationDuringBulb', + PrintConv => \%offOn, + }, + 0x0409 => [ + { + Name => 'InfoButtonWhenShooting', + Condition => '$$self{Model} =~ /\b1Ds? Mark III\b/', + Notes => '1D Mark III', + PrintConv => { + 0 => 'Displays camera settings', + 1 => 'Displays shooting functions', + }, + }, + { + Name => 'InfoButtonWhenShooting', + Notes => '1D Mark IV', + PrintConv => { + # reversed from earlier models. grr... + 0 => 'Displays shooting functions', + 1 => 'Displays camera settings', + }, + }, + ], + 0x040a => { # new for 5DmkIII + Name => 'ViewfinderWarnings', + PrintConv => { BITMASK => { #(NC) + 0 => 'Monochrome', # (have seen for: 5DmkII, 6D, 250D, 90D) + 1 => 'WB corrected', # (have seen for: 5DmkII, 6D, 90D) + 2 => 'One-touch image quality', # (have seen for: 5DmkII; doesn't exist for 6D) + 3 => 'ISO expansion', # (have seen for: 5DmkII) + 4 => 'Spot metering', # (have seen for: 5DmkII, 6D) + 6 => 'Noise reduction', # (have seen for: 250D, 90D) + 7 => 'HDR', # (have seen for: 90D) + }}, + }, + 0x040b => { # new for 5DmkIII + Name => 'LVShootingAreaDisplay', + PrintConv => { + 0 => 'Masked', + 1 => 'Outlined', + }, + }, + 0x040c => { # (7DmkII) + Name => 'LVShootingAreaDisplay', + PrintConv => { + 0 => 'Masked', + 1 => 'Outlined', + }, + }, + #### 3a) Auto focus + 0x0501 => { + Name => 'USMLensElectronicMF', + PrintConv => { + 0 => 'Enable after one-shot AF', + 1 => 'Disable after one-shot AF', + 2 => 'Disable in AF mode', + }, + }, + 0x0502 => { + Name => 'AIServoTrackingSensitivity', + PrintConv => { + -2 => 'Slow', # (Locked on -2 for 6D) + -1 => 'Medium Slow', # (Locked on -1 for 6D) + 0 => 'Standard', + 1 => 'Medium Fast', # (Responsive +1 for 6D) + 2 => 'Fast', # (Responsive +2 for 6D) + }, + }, + 0x0503 => { + Name => 'AIServoImagePriority', + PrintConv => { + 0 => '1: AF, 2: Tracking', + 1 => '1: AF, 2: Drive speed', + 2 => '1: Release, 2: Drive speed', + 3 => '1: Release, 2: Tracking', # 7D/1DmkIV + }, + }, + 0x0504 => { + Name => 'AIServoTrackingMethod', + PrintConv => { + 0 => 'Main focus point priority', + 1 => 'Continuous AF track priority', + }, + }, + 0x0505 => { + Name => 'LensDriveNoAF', + PrintConv => { + 0 => 'Focus search on', + 1 => 'Focus search off', + }, + }, + 0x0506 => { + Name => 'LensAFStopButton', + Notes => 'value of 6 not used by 40D, 50D and 5DmkII', + PrintConv => { + 0 => 'AF stop', + 1 => 'AF start', + 2 => 'AE lock', + 3 => 'AF point: M->Auto/Auto->ctr', + 4 => 'One Shot <-> AI servo', + 5 => 'IS start', + 6 => 'Switch to registered AF point', + 7 => 'Spot AF', # 1DmkIV + }, + }, + 0x0507 => { + Name => 'AFMicroadjustment', + Count => 5, + PrintConv => [ + { + 0 => 'Disable', + 1 => 'Adjust all by same amount', + 2 => 'Adjust by lens', + }, + # DECODE OTHER VALUES + ], + }, + 0x0508 => [ + { + Name => 'AFPointAreaExpansion', + Condition => '$$self{Model} =~ /\b5D Mark II\b/', + Notes => '5D Mark II', + PrintConv => { + 0 => 'Disable', + 1 => 'Enable', + }, + }, + { + Name => 'AFPointAreaExpansion', + Condition => '$$self{Model} =~ /\b1Ds Mark III\b/', + Notes => '1Ds Mark III', + PrintConv => { + 0 => 'Disable', + 1 => 'Enable (left/right Assist AF points)', + 2 => 'Enable (surrounding Assist AF points)', + }, + }, + { + Name => 'AFPointAreaExpansion', + Notes => 'other models', + PrintConv => { + 0 => 'Disable', + 1 => 'Left/right AF points', + 2 => 'Surrounding AF points', + 3 => 'All 45 points area', # 1DmkIV + }, + }, + ], + 0x0509 => [ + { + Name => 'SelectableAFPoint', + Condition => '$$self{Model} =~ /\b1D Mark IV\b/', + Notes => '1D Mark IV', + PrintConv => { + 0 => '45 points', + 1 => '19 points', + 2 => '11 points', + 3 => 'Inner 9 points', + 4 => 'Outer 9 points', + }, + }, + { + Name => 'SelectableAFPoint', + Notes => 'other models', + PrintConv => { + 0 => '19 points', + 1 => 'Inner 9 points', + 2 => 'Outer 9 points', + 3 => '19 Points, Multi-controller selectable', #4 + 4 => 'Inner 9 Points, Multi-controller selectable', #4 + 5 => 'Outer 9 Points, Multi-controller selectable', #4 + }, + }, + ], + 0x050a => [ + { + Name => 'SwitchToRegisteredAFPoint', + Condition => '$$self{Model} =~ /\b1D Mark IV\b/', + Notes => '1D Mark IV', + PrintConv => { + 0 => 'Disable', + 1 => 'Switch with multi-controller', + 2 => 'Only while AEL is pressed', + }, + }, + { + Name => 'SwitchToRegisteredAFPoint', + Notes => 'other models', + PrintConv => \%disableEnable, + }, + ], + 0x050b => { + Name => 'AFPointAutoSelection', + PrintConv => { + 0 => 'Control-direct:disable/Main:enable', + 1 => 'Control-direct:disable/Main:disable', + 2 => 'Control-direct:enable/Main:enable', + }, + }, + 0x050c => [ + { + Name => 'AFPointDisplayDuringFocus', + Condition => '$$self{Model} =~ /\b1D\b/', + Notes => '1D models', + PrintConv => { + 0 => 'On', + 1 => 'Off', + 2 => 'On (when focus achieved)', + }, + }, + { + Name => 'AFPointDisplayDuringFocus', + Notes => 'other models', # (7D, 70D, 750D, 760D) + PrintConv => { + 0 => 'Selected (constant)', + 1 => 'All (constant)', + 2 => 'Selected (pre-AF, focused)', + 3 => 'Selected (focused)', + 4 => 'Disable display', + }, + }, + ], + 0x050d => { + Name => 'AFPointBrightness', + PrintConv => { + 0 => 'Normal', + 1 => 'Brighter', + }, + }, + 0x050e => [ + { + Name => 'AFAssistBeam', + Condition => '$$self{Model} =~ /\b(1D Mark IV|6D)\b/', + Notes => '1D Mark IV and 6D', + PrintConv => { + 0 => 'Emits', + 1 => 'Does not emit', + 2 => 'IR AF assist beam only', + }, + }, + { + Name => 'AFAssistBeam', + Notes => 'other models; values 2-3 not used by 1DmkIII or 5DmkII, value 3 new for 7D', + PrintConv => { + 0 => 'Emits', + 1 => 'Does not emit', + 2 => 'Only ext. flash emits', + 3 => 'IR AF assist beam only', # new for 7D + }, + }, + ], + 0x050f => [ # new for 40D + { + Name => 'AFPointSelectionMethod', + Condition => '$$self{Model} !~ /\b60D\b/', + Notes => '40D, 50D and 5DmkII', + PrintConv => { + 0 => 'Normal', + 1 => 'Multi-controller direct', + 2 => 'Quick Control Dial direct', + }, + }, + { + Name => 'AFPointSelectionMethod', + Notes => '60D', + PrintConv => { + 0 => 'AF point button: Activate AF Sel; Rear dial: Select AF points', + 1 => 'AF point button: Auto selection; Rear dial: Manual selection', + }, + }, + # (this is 2 values for 90D,M6mkII, seen: "1046 1046") + ], + 0x0510 => [ # new for 40D + { + Name => 'VFDisplayIllumination', # (7D quirk, or decoded incorrectly?) + Condition => '$$self{Model} =~ /\b7D\b/', + Notes => '7D', + PrintConv => { + 0 => 'Auto', + 1 => 'Enable', + 2 => 'Disable', + }, + }, + { + Name => 'SuperimposedDisplay', + Notes => 'other models', + PrintConv => \%onOff, + }, + ], + 0x0511 => [ # new for 40D + { + Name => 'AFDuringLiveView', + Condition => '$$self{Model} =~ /\b40D\b/', + Notes => '40D', + PrintConv => \%disableEnable, + }, + { + Name => 'AFDuringLiveView', + Notes => '450D and 1000D', + PrintConv => { + 0 => 'Disable', + 1 => 'Quick mode', + 2 => 'Live mode', + }, + }, + ], + 0x0512 => { # new for 7D + Name => 'SelectAFAreaSelectMode', + PrintConv => [ + { + 0 => 'Disable', + 1 => 'Enable', + 2 => 'Register', + 3 => 'Select AF-modes', + # also seen: 87 (90D), 1142 (RP) + }, + 'sprintf("Flags 0x%x",$val)', # (70D=Manual 1pt,Manual zone,Auto 19pt) + ], + PrintConvInv => [ + undef, + '$val=~/0x([\dA-F]+)/i ? hex($1) : undef', + ], + }, + 0x0513 => { # new for 7D + Name => 'ManualAFPointSelectPattern', + PrintConv => { + 0 => 'Stops at AF area edges', + 1 => 'Continuous', + }, + }, + 0x0514 => { # new for 7D + Name => 'DisplayAllAFPoints', + PrintConv => \%enableDisable, + }, + 0x0515 => { # new for 7D + Name => 'FocusDisplayAIServoAndMF', + PrintConv => \%enableDisable, + }, + 0x0516 => { # new for 7D and 1DmkIV + Name => 'OrientationLinkedAFPoint', + PrintConv => { + 0 => 'Same for vertical and horizontal', + 1 => 'Select different AF points', + }, + }, + 0x0517 => { # new for 1DmkIV + Name => 'MultiControllerWhileMetering', + PrintConv => { + 0 => 'Off', + 1 => 'AF point selection', + }, + }, + 0x0518 => { # new for 6D + Name => 'AccelerationTracking', + }, + 0x0519 => { # new for 6D + Name => 'AIServoFirstImagePriority', + PrintConv => { #(NC) + -1 => 'Release priority', + 0 => 'Equal priority', + 1 => 'Focus priority', + }, + }, + 0x051a => { # new for 6D + Name => 'AIServoSecondImagePriority', + PrintConv => { #(NC) + -1 => 'Shooting speed priority', + 0 => 'Equal priority', + 1 => 'Focus priority', + }, + }, + 0x051b => { # (70D) + Name => 'AFAreaSelectMethod', + PrintConv => { + 0 => 'AF area selection button', + 1 => 'Main dial', + }, + }, + 0x051c => { # (750D) + Name => 'AutoAFPointColorTracking', + PrintConv => { + 0 => 'On-Shot AF only', + 1 => 'Disable', + }, + }, + 0x051d => { # (750D/760D) + Name => 'VFDisplayIllumination', + PrintConv => [{ + 0 => 'Auto', + 1 => 'Enable', + 2 => 'Disable', + },{ + 0 => 'Non-illuminated', #(NC) + 1 => 'Illuminated', #(NC) + }], + }, + 0x051e => { # (80D) + Name => 'InitialAFPointAIServoAF', + PrintConv => { + 0 => 'Auto', + 1 => 'Initial AF point selected', + 2 => 'Manual AF point', + }, + }, + #### 3b) Drive + 0x060f => { + Name => 'MirrorLockup', + Notes => 'value of 2 not used by some models', + PrintConv => { + 0 => 'Disable', + 1 => 'Enable', + 2 => 'Enable: Down with Set', + }, + }, + 0x0610 => [{ # (1DXmkIII) + Name => 'ContinuousShootingSpeed', + Condition => '$count == 6', + Count => 6, + PrintConv => [ + \%disableEnable, + '"Hi $val"', + '"Cont $val"', + '"Lo $val"', + '"Soft $val"', + '"Soft LS $val"', + ], + PrintConvInv => [ + undef, + '$val=~/(\d+)/ ? $1 : 0', + '$val=~/(\d+)/ ? $1 : 0', + '$val=~/(\d+)/ ? $1 : 0', + '$val=~/(\d+)/ ? $1 : 0', + '$val=~/(\d+)/ ? $1 : 0', + ], + },{ # (1DXmkIII firmware 1.3) + Name => 'ContinuousShootingSpeed', + Condition => '$count == 5', + Count => 5, + PrintConv => [ + '"Hi $val"', + '"Cont $val"', + '"Lo $val"', + '"Soft $val"', + '"Soft LS $val"', + ], + PrintConvInv => [ + '$val=~/(\d+)/ ? $1 : 0', + '$val=~/(\d+)/ ? $1 : 0', + '$val=~/(\d+)/ ? $1 : 0', + '$val=~/(\d+)/ ? $1 : 0', + '$val=~/(\d+)/ ? $1 : 0', + ], + },{ # others + Name => 'ContinuousShootingSpeed', + Count => 3, + PrintConv => [ + \%disableEnable, + '"Hi $val"', + '"Lo $val"', + ], + PrintConvInv => [ + undef, + '$val=~/(\d+)/ ? $1 : 0', + '$val=~/(\d+)/ ? $1 : 0', + ], + }], + 0x0611 => { + Name => 'ContinuousShotLimit', + Count => 2, + PrintConv => [ + \%disableEnable, + '"$val shots"', + ], + PrintConvInv => [ + undef, + '$val=~/(\d+)/ ? $1 : 0', + ], + }, + 0x0612 => [{ # (1DXmkIII) + Name => 'RestrictDriveModes', + Condition => '$count == 1', + Count => 1, + PrintConv => 'sprintf("Flags 0x%x",$val)', + PrintConvInv => '$val=~/0x([\dA-F]+)/i ? hex($1) : undef', + },{ # (1DX) + Name => 'RestrictDriveModes', + Count => 2, + PrintConv => [ + \%disableEnable, + 'sprintf("Flags 0x%x",$val)', # (Single,Cont Hi,Cont Lo,Timer 10,Timer 2,Silent,Super Hi) + ], + PrintConvInv => [ + undef, + '$val=~/0x([\dA-F]+)/i ? hex($1) : undef', + ], + }], + #### 4a) Operation + 0x0701 => [ + { + Name => 'Shutter-AELock', + Condition => q{ + $$self{Model} =~ /\b(1000D|XS|Kiss F|500D|T1i|Kiss X3|550D|T2i|Kiss X4)\b/ or + $$self{Model} =~ /\b(600D|T3i|Kiss X5|1100D|T3|Kiss X50)\b/ + }, + Notes => '500D, 550D, 600D, 1000D and 1100D', + PrintConv => { + 0 => 'AF/AE lock', + 1 => 'AE lock/AF', + 2 => 'AF/AF lock, No AE lock', + 3 => 'AE/AF, No AE lock', + }, + }, + { + Name => 'Shutter-AELock', + Condition => '$count == 2', + Notes => '250D', + PrintConv => { + '0 0' => 'AF/AE lock', + '1 0' => 'AE lock/AF', + '2 0' => 'AF/AF lock, No AE lock', + '3 0' => 'AE/AF, No AE lock', + }, + }, + { + Name => 'AFAndMeteringButtons', + Condition => '$$self{Model} =~ /\b60D\b/', + Notes => '60D', + PrintConv => { + 0 => 'Metering start', + 1 => 'Metering + AF start', + 2 => 'AE lock', + 3 => 'AF stop', + 4 => 'No function', + }, + }, + { + Name => 'ShutterButtonAFOnButton', + Notes => 'other models', + PrintConv => { + 0 => 'Metering + AF start', + 1 => 'Metering + AF start/AF stop', + 2 => 'Metering start/Meter + AF start', + 3 => 'AE lock/Metering + AF start', + 4 => 'Metering + AF start/disable', + }, + }, + ], + 0x0702 => { + Name => 'AFOnAELockButtonSwitch', + PrintConv => \%disableEnable, + }, + 0x0703 => { + Name => 'QuickControlDialInMeter', + PrintConv => { + 0 => 'Exposure comp/Aperture', + 1 => 'AF point selection', + 2 => 'ISO speed', + 3 => 'AF point selection swapped with Exposure comp', #4 + 4 => 'ISO speed swapped with Exposure comp', #4 + }, + }, + 0x0704 => [ + { + Name => 'SetButtonWhenShooting', + Condition => '$$self{Model} =~ /\b(40D|50D|5D Mark II)\b/', + Notes => '40D, 50D and 5DmkII; value of 5 is new for 50D, and 6 is new for 5DmkII', + PrintConv => { + 0 => 'Normal (disabled)', + 1 => 'Image quality', + 2 => 'Picture style', + 3 => 'Menu display', + 4 => 'Image playback', + 5 => 'Quick control screen', #50D + 6 => 'Record movie (Live View)', #5DmkII + }, + }, + { + Name => 'SetButtonWhenShooting', + Condition => '$$self{Model} =~ /\b60D\b/', + Notes => '60D', + PrintConv => { + 0 => 'Normal (disabled)', + 1 => 'Image quality', + 2 => 'Picture style', + 3 => 'White balance', + 4 => 'Flash exposure compensation', + 5 => 'Viewfinder leveling gauge', + }, + }, + { + Name => 'SetButtonWhenShooting', + Condition => '$$self{Model} =~ /\b(450D|XSi|Kiss X2|550D|T2i|Kiss X4|600D|T3i|Kiss X5)\b/', + Notes => '450D, 550D and 600D; value of 5 is new for 550D', + PrintConv => { + 0 => 'Normal (disabled)', + 1 => 'Image quality', + 2 => 'Flash exposure compensation', + 3 => 'LCD monitor On/Off', + 4 => 'Menu display', + 5 => 'ISO speed', + }, + }, + { + Name => 'SetButtonWhenShooting', + Condition => '$$self{Model} =~ /\b(1100D|T3|Kiss X50)\b/', + Notes => '1100D', + PrintConv => { + 0 => 'Normal (disabled)', + 1 => 'Image quality', + 2 => 'Flash exposure compensation', + 3 => 'LCD monitor On/Off', + 4 => 'Menu display', + 5 => 'Depth-of-field preview', + }, + }, + { + Name => 'SetButtonWhenShooting', + Condition => '$$self{Model} =~ /\b(1000D|XS|Kiss F)\b/', + Notes => '1000D', + PrintConv => { + 0 => 'LCD monitor On/Off', + 1 => 'Image quality', + 2 => 'Flash exposure compensation', + 3 => 'Menu display', + 4 => 'Disabled', + }, + }, + { + Name => 'SetButtonWhenShooting', + Condition => '$$self{Model} =~ /\b(500D|T1i|Kiss X3)\b/', + Notes => '500D', + PrintConv => { + 0 => 'Quick control screen', + 1 => 'Image quality', + 2 => 'Flash exposure compensation', + 3 => 'LCD monitor On/Off', + 4 => 'Menu display', + 5 => 'Disabled', + }, + }, + { + Name => 'SetButtonWhenShooting', + Notes => '250D', + Condition => '$count == 2', + # (not sure how to decode this. seen: "37 0") + PrintConv => { }, + }, + { + Name => 'SetButtonWhenShooting', + Notes => '1DmkIII and 1DmkIV', + PrintConv => { + 0 => 'Normal (disabled)', + 1 => 'White balance', + 2 => 'Image size', + 3 => 'ISO speed', + 4 => 'Picture style', + 5 => 'Record func. + media/folder', + 6 => 'Menu display', + 7 => 'Image playback', + }, + }, + ], + 0x0705 => { + Name => 'ManualTv', + Description => 'Manual Tv/Av For M', + PrintConv => { + 0 => 'Tv=Main/Av=Control', + 1 => 'Tv=Control/Av=Main', + }, + }, + 0x0706 => { + Name => 'DialDirectionTvAv', + PrintConv => { + 0 => 'Normal', + 1 => 'Reversed', + }, + }, + 0x0707 => { + Name => 'AvSettingWithoutLens', + PrintConv => \%disableEnable, + }, + 0x0708 => { + Name => 'WBMediaImageSizeSetting', + PrintConv => { + 0 => 'Rear LCD panel', + 1 => 'LCD monitor', + 2 => 'Off (disable button)', # (1DX) + }, + }, + 0x0709 => { + Name => 'LockMicrophoneButton', + PrintConv => [{ + # called "sound" in 1DmkIII manual, and "memo" in 1DmkIV manual + 0 => 'Protect (hold:record memo)', + 1 => 'Record memo (protect:disable)', + 2 => 'Play memo (hold:record memo)', # new with 1DmkIV + 3 => 'Rating (protect/memo:disable)', # new with 1DX + }], + # (not sure what the 2nd number is -- new for 1DX. Seen a value of 31. + # Memo quality may be set to 48kHz or 8kHz through another option that + # doesn't seem to be stored separately -- is this it?) + }, + 0x070a => { + Name => 'ButtonFunctionControlOff', + PrintConv => { + 0 => 'Normal (enable)', + 1 => 'Disable main, Control, Multi-control', + }, + }, + 0x070b => { # 50D (also, 5DmkII writes this but it isn't in user guide) + Name => 'AssignFuncButton', + PrintConv => { + 0 => 'LCD brightness', + 1 => 'Image quality', + 2 => 'Exposure comp./AEB setting', + 3 => 'Image jump with main dial', + 4 => 'Live view function settings', + }, + }, + 0x070c => { # new for 7D + Name => 'CustomControls', + # (too much stuff to decode) + }, + 0x070d => { # new for 1DmkIV + Name => 'StartMovieShooting', + PrintConv => { + 0 => 'Default (from LV)', + 1 => 'Quick start (FEL button)', + }, + }, + 0x070e => { # new for 1100D + Name => 'FlashButtonFunction', + PrintConv => { + 0 => 'Raise built-in flash', + 1 => 'ISO speed', + }, + }, + 0x070f => { # new for 5DmkIII + Name => 'MultiFunctionLock', + PrintConv => [ + { #(NC) + 0 => 'Off', + 1 => 'On', # "On (main dial)" for 750D/760D? + 2 => 'On (quick control dial)', #(NC) + 3 => 'On (main dial and quick control dial)', #(NC) + }, + { BITMASK => { #(NC) + 0 => 'Main dial', + 1 => 'Quick control dial', + 2 => 'Multi-controller', + }}, + ], + }, + 0x0710 => { # (M) + Name => 'TrashButtonFunction', + PrintConv => { + 0 => 'Normal (set center AF point)', + 1 => 'Depth-of-field preview', + }, + }, + 0x0711 => { # (M) + Name => 'ShutterReleaseWithoutLens', + PrintConv => \%disableEnable, + }, + 0x0712 => { # (R) + Name => 'ControlRingRotation', + PrintConv => { + 0 => 'Normal', + 1 => 'Reversed', + }, + }, + 0x0713 => { # (R) + Name => 'FocusRingRotation', + PrintConv => { + 0 => 'Normal', + 1 => 'Reversed', + }, + }, + 0x0714 => { # (R) + Name => 'RFLensMFFocusRingSensitivity', + PrintConv => { + 0 => 'Varies With Rotation Speed', + 1 => 'Linked To Rotation Angle', + }, + }, + 0x0715 => { # (R) + Name => 'CustomizeDials', # (NC, may be CustomizeM-FnBar) + # (too much stuff to decode) + }, + #### 4b) Others + 0x080b => [ + { + Name => 'FocusingScreen', + Condition => '$$self{Model} =~ /\b(40D|50D|60D)\b/', + Notes => '40D, 50D and 60D', + PrintConv => { + 0 => 'Ef-A', + 1 => 'Ef-D', + 2 => 'Ef-S', + }, + }, + { + Name => 'FocusingScreen', + Condition => '$$self{Model} =~ /\b5D Mark II\b/', + Notes => '5D Mark II', + PrintConv => { + 0 => 'Eg-A', + 1 => 'Eg-D', + 2 => 'Eg-S', + }, + }, + { + Name => 'FocusingScreen', + Condition => '$$self{Model} =~ /\b6D\b/', + Notes => '6D', + PrintConv => { + 0 => 'Eg-A II', + 1 => 'Eg-D', + 2 => 'Eg-S', + }, + }, + { + Name => 'FocusingScreen', + Condition => '$$self{Model} =~ /\b7D Mark II\b/', + Notes => '7D Mark II', + PrintConv => { + 0 => 'Eh-A', + 1 => 'Eh-S', + }, + }, + { + Name => 'FocusingScreen', + Condition => '$$self{Model} =~ /\b1D X\b/', + Notes => '1DX', + PrintConv => { + 0 => 'Ec-CV', + 1 => 'Ec-A,B,D,H,I,L', + }, + }, + { + Name => 'FocusingScreen', + Notes => '1DmkIII, 1DSmkIII and 1DmkIV', + PrintConv => { + 0 => 'Ec-CIV', + 1 => 'Ec-A,B,C,CII,CIII,D,H,I,L', + 2 => 'Ec-S', + 3 => 'Ec-N,R', + }, + }, + ], + 0x080c => [{ # (1DXmkIII) + Name => 'TimerLength', + Condition => '$count == 3', + Count => 3, + PrintConv => [ + '"6 s: $val"', + '"16 s: $val"', + '"After release: $val"', + ], + PrintConvInv => [ + '$val=~/(\d+)$/ ? $1 : 0', + '$val=~/(\d+)$/ ? $1 : 0', + '$val=~/(\d+)$/ ? $1 : 0', + ], + },{ + Name => 'TimerLength', + Count => 4, + PrintConv => [ + \%disableEnable, + '"6 s: $val"', + '"16 s: $val"', + '"After release: $val"', + ], + PrintConvInv => [ + undef, + '$val=~/(\d+)$/ ? $1 : 0', + '$val=~/(\d+)$/ ? $1 : 0', + '$val=~/(\d+)$/ ? $1 : 0', + ], + }], + 0x080d => { + Name => 'ShortReleaseTimeLag', + PrintConv => \%disableEnable, + }, + 0x080e => { + Name => 'AddAspectRatioInfo', + PrintConv => { + 0 => 'Off', + 1 => '6:6', + 2 => '3:4', + 3 => '4:5', + 4 => '6:7', + 5 => '10:12', + 6 => '5:7', + }, + }, + 0x080f => { + Name => 'AddOriginalDecisionData', # called ("image verification" in 1DmkIV manual) + PrintConv => \%offOn, + }, + 0x0810 => { + Name => 'LiveViewExposureSimulation', + PrintConv => { + 0 => 'Disable (LCD auto adjust)', + 1 => 'Enable (simulates exposure)', + }, + }, + 0x0811 => { + Name => 'LCDDisplayAtPowerOn', + PrintConv => { + 0 => 'Display', + 1 => 'Retain power off status', + }, + }, + 0x0812 => { # (1DX) + Name => 'MemoAudioQuality', + PrintConv => { + 0 => 'High (48 kHz)', + 1 => 'Low (8 kHz)', + }, + }, + 0x0813 => { # (5DmkIII) + Name => 'DefaultEraseOption', + PrintConv => { + 0 => 'Cancel selected', + 1 => 'Erase selected', + 2 => 'Erase RAW selected', # (1DXmkIII) + 3 => 'Erase non-RAW selected', # (1DXmkIII) + }, + }, + 0x0814 => { # (5DS) + Name => 'RetractLensOnPowerOff', + PrintConv => \%enableDisable, + }, + 0x0815 => { # (R) + Name => 'AddIPTCInformation', + PrintConv => \%disableEnable, + }, + 0x0816 => { # (90D,RP) + Name => 'AudioCompression', + PrintConv => \%enableDisable, + } +); + +#------------------------------------------------------------------------------ +# Conversion routines +# Inputs: 0) value to convert +sub ConvertPfn($) +{ + my $val = shift; + return $val ? ($val==1 ? 'On' : "On ($val)") : "Off"; +} +sub ConvertPfnInv($) +{ + my $val = shift; + return $1 if $val =~ /(\d+)/; + return 1 if $val =~ /on/i; + return 0 if $val =~ /off/i; + return undef; +} + +#------------------------------------------------------------------------------ +# Read/Write Canon custom 2 directory (new for 1D Mark III) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessCanonCustom2($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $offset = $$dirInfo{DirStart}; + my $size = $$dirInfo{DirLen}; + my $write = $$dirInfo{Write}; + my $verbose = $et->Options('Verbose'); + my $newTags; + + return 0 if $size < 2; + # first entry in array must be the size + my $len = Get16u($dataPt, $offset); + unless ($len == $size and $len >= 8) { + $et->Warn('Invalid CanonCustom2 data'); + return 0; + } + # get group count + my $count = Get32u($dataPt, $offset + 4); + if ($write) { + $newTags = $et->GetNewTagInfoHash($tagTablePtr); + $et->VPrint(0, " Rewriting CanonCustom2\n"); + } elsif ($verbose) { + $et->VerboseDir('CanonCustom2', $count, $len); + } + my $pos = $offset + 8; + my $end = $offset + $size; + # loop through group records + for (; $pos<$end; ) { + last if $pos + 12 > $end; + my $recNum = Get32u($dataPt, $pos); + my $recLen = Get32u($dataPt, $pos + 4); + my $recCount = Get32u($dataPt, $pos + 8); + last if $recLen < 8; # must be at least 8 bytes for recNum and recLen + $pos += 12; + my $recPos = $pos; + my $recEnd = $pos + $recLen - 8; + if ($recEnd > $end) { + $et->Warn("Corrupted CanonCustom2 group $recNum"); + return 0; + } + if ($verbose and not $write) { + $et->VerboseDir("CanonCustom2 group $recNum", $recCount, $recLen); + } + my ($i, $num, $tag); + for ($i=0; $recPos + 8 < $recEnd; ++$i, $recPos+=4*$num) { + $tag = Get32u($dataPt, $recPos); + $num = Get32u($dataPt, $recPos + 4); + my $nextRec = $recPos + 8 + $num * 4; + last if $nextRec > $recEnd; + # patch for EOS-1DXmkIII firmware 1.0.0 bug: + if ($tag == 0x70c and $num == 0x66 and $nextRec + 8 < $recEnd) { + my $tmp = Get32u($dataPt, $nextRec + 4); + if ($tmp == 0x70f) { + $et->Warn('Fixed incorrect CanonCustom tag 0x70c size', 1); + ++$num; # (count should be one greater) + } + } + $recPos += 8; + my $val = ReadValue($dataPt, $recPos, 'int32s', $num, $num * 4); + if ($write) { + # write new value + my $tagInfo = $$newTags{$tag}; + next unless $$newTags{$tag}; + $tagInfo = $et->GetTagInfo($tagTablePtr, $tag, \$val, undef, $num) or next; + my $nvHash = $et->GetNewValueHash($tagInfo) or next; + next unless $et->IsOverwriting($nvHash, $val); + my $newVal = $et->GetNewValue($nvHash); + next unless defined $newVal; # can't delete from a custom table + WriteValue($newVal, 'int32s', $num, $dataPt, $recPos); + $et->VerboseValue("- CanonCustom:$$tagInfo{Name}", $val); + $et->VerboseValue("+ CanonCustom:$$tagInfo{Name}", $newVal); + ++$$et{CHANGED}; + } else { + # save extracted tag + my $oldInfo = $$tagTablePtr{$tag}; + $et->HandleTag($tagTablePtr, $tag, $val, + Index => $i, + Format => 'int32u', + Count => $num, + Size => $num * 4, + ); + my $tagInfo = $$tagTablePtr{$tag}; + # generate properly formatted description if we just added the tag + if ($tagInfo and not $oldInfo) { + ($$tagInfo{Description} = $$tagInfo{Name}) =~ tr/_/ /; + $$tagInfo{Description} =~ s/CanonCustom Functions/Canon Custom Functions /; + } + } + } + if ($i != $recCount) { + $et->Warn('Missing '.($recCount-$i)." entries in CanonCustom2 group $recNum directory", 1); + } + $pos = $recEnd; + } + if ($pos != $end) { + # Note: a firmware bug in the EOS M5 and M6 stores an incorrect + # size for the 2nd CanonCustom2 record, so this message is expected + # for these models... + $et->Warn('Possibly corrupted CanonCustom2 data'); + return 0; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Write Canon custom 2 data +# Inputs: 0) ExifTool object reference, 1) dirInfo hash ref, 2) tag table ref +# Returns: New custom data block or undefined on error +sub WriteCanonCustom2($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to autoload this package + my $dataPt = $$dirInfo{DataPt}; + # edit a copy of the custom function 2 data + my $buff = substr($$dataPt, $$dirInfo{DirStart}, $$dirInfo{DirLen}); + my %dirInfo = ( + DataPt => \$buff, + DirStart => 0, + DirLen => $$dirInfo{DirLen}, + Write => 1, + ); + ProcessCanonCustom2($et, \%dirInfo, $tagTablePtr) or return undef; + return $buff; +} + +#------------------------------------------------------------------------------ +# Process Canon custom directory +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessCanonCustom($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $offset = $$dirInfo{DirStart}; + my $size = $$dirInfo{DirLen}; + my $verbose = $et->Options('Verbose'); + + # first entry in array must be the size + my $len = Get16u($dataPt,$offset); + unless ($len == $size or ($$et{Model}=~/\bD60\b/ and $len+2 == $size)) { + $et->Warn("Invalid CanonCustom data"); + return 0; + } + $verbose and $et->VerboseDir('CanonCustom', $size/2-1); + my $pos; + for ($pos=2; $pos<$size; $pos+=2) { + # ($pos is position within custom directory) + my $val = Get16u($dataPt,$offset+$pos); + my $tag = ($val >> 8); + $val = ($val & 0xff); + $et->HandleTag($tagTablePtr, $tag, $val, + Index => $pos/2-1, + Format => 'int8u', + Count => 1, + Size => 1, + ); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Check new value for Canon custom data block +# Inputs: 0) ExifTool object reference, 1) tagInfo hash ref, 2) raw value ref +# Returns: error string or undef (and may modify value) on success +sub CheckCanonCustom($$$) +{ + my ($et, $tagInfo, $valPtr) = @_; + return Image::ExifTool::CheckValue($valPtr, 'int8u'); +} + +#------------------------------------------------------------------------------ +# Write Canon custom data +# Inputs: 0) ExifTool object reference, 1) dirInfo hash ref, 2) tag table ref +# Returns: New custom data block or undefined on error +sub WriteCanonCustom($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to autoload this package + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $dirStart; + my $dirName = $$dirInfo{DirName}; + my $newData = substr($$dataPt, $dirStart, $dirLen) or return undef; + $dataPt = \$newData; + + # first entry in array must be the size + my $len = Get16u($dataPt, 0); + unless ($len == $dirLen or ($$et{Model}=~/\bD60\b/ and $len+2 == $dirLen)) { + $et->Warn("Invalid CanonCustom data"); + return undef; + } + my $newTags = $et->GetNewTagInfoHash($tagTablePtr); + my $pos; + for ($pos=2; $pos<$dirLen; $pos+=2) { + my $val = Get16u($dataPt, $pos); + my $tag = ($val >> 8); + my $tagInfo = $$newTags{$tag}; + next unless $tagInfo; + my $nvHash = $et->GetNewValueHash($tagInfo); + $val = ($val & 0xff); + next unless $et->IsOverwriting($nvHash, $val); + my $newVal = $et->GetNewValue($nvHash); + next unless defined $newVal; # can't delete from a custom table + Set16u(($newVal & 0xff) + ($tag << 8), $dataPt, $pos); + $et->VerboseValue("- $dirName:$$tagInfo{Name}", $val); + $et->VerboseValue("+ $dirName:$$tagInfo{Name}", $newVal); + ++$$et{CHANGED}; + } + return $newData; +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::CanonCustom - Read and Write Canon custom functions + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +The Canon custom functions meta information is very specific to the +camera model, and is found in both the EXIF maker notes and in the +Canon RAW files. This module contains the definitions necessary for +Image::ExifTool to read this information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html> + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Christian Koller for his work in decoding the 20D custom +functions, Rainer Honle for decoding the 5D custom functions and David +Pitcher for adding a few undocumented 1DmkIII settings. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Canon Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/CanonRaw.pm b/lib/Image/ExifTool/CanonRaw.pm new file mode 100644 index 0000000..2ec6bea --- /dev/null +++ b/lib/Image/ExifTool/CanonRaw.pm @@ -0,0 +1,910 @@ +#------------------------------------------------------------------------------ +# File: CanonRaw.pm +# +# Description: Read Canon RAW (CRW) meta information +# +# Revisions: 11/25/2003 - P. Harvey Created +# 12/02/2003 - P. Harvey Completely reworked and figured out many +# more tags +# +# References: 1) http://www.cybercom.net/~dcoffin/dcraw/ +# 2) http://www.wonderland.org/crw/ +# 3) http://xyrion.org/ciff/CIFFspecV1R04.pdf +# 4) Dave Nicholson private communication (PowerShot S30) +#------------------------------------------------------------------------------ + +package Image::ExifTool::CanonRaw; + +use strict; +use vars qw($VERSION $AUTOLOAD %crwTagFormat); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::Canon; + +$VERSION = '1.58'; + +sub WriteCRW($$); +sub ProcessCanonRaw($$$); +sub WriteCanonRaw($$$); +sub CheckCanonRaw($$$); +sub InitMakerNotes($); +sub SaveMakerNotes($); +sub BuildMakerNotes($$$$$$); + +# formats for CRW tag types (($tag >> 8) & 0x38) +# Note: don't define format for undefined types +%crwTagFormat = ( + 0x00 => 'int8u', + 0x08 => 'string', + 0x10 => 'int16u', + 0x18 => 'int32u', + # 0x20 => 'undef', + # 0x28 => 'undef', + # 0x30 => 'undef', +); + +# Canon raw file tag table +# Note: Tag ID's have upper 2 bits set to zero, since these 2 bits +# just specify the location of the information +%Image::ExifTool::CanonRaw::Main = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessCanonRaw, + WRITE_PROC => \&WriteCanonRaw, + CHECK_PROC => \&CheckCanonRaw, + WRITABLE => 1, + 0x0000 => { Name => 'NullRecord', Writable => 'undef' }, #3 + 0x0001 => { #3 + Name => 'FreeBytes', + Format => 'undef', + Binary => 1, + }, + 0x0032 => { Name => 'CanonColorInfo1', Writable => 0 }, + 0x0805 => [ + # this tag is found in more than one directory... + { + Condition => '$self->{DIR_NAME} eq "ImageDescription"', + Name => 'CanonFileDescription', + Writable => 'string[32]', + }, + { + Name => 'UserComment', + Writable => 'string[256]', + }, + ], + 0x080a => { + Name => 'CanonRawMakeModel', + Writable => 0, + SubDirectory => { TagTable => 'Image::ExifTool::CanonRaw::MakeModel' }, + }, + 0x080b => { Name => 'CanonFirmwareVersion', Writable => 'string[32]' }, + 0x080c => { Name => 'ComponentVersion', Writable => 'string' }, #3 + 0x080d => { Name => 'ROMOperationMode', Writable => 'string[8]' }, #3 + 0x0810 => { Name => 'OwnerName', Writable => 'string[32]' }, + 0x0815 => { Name => 'CanonImageType', Writable => 'string[32]' }, + 0x0816 => { Name => 'OriginalFileName', Writable => 'string[32]' }, + 0x0817 => { Name => 'ThumbnailFileName', Writable => 'string[32]' }, + 0x100a => { #3 + Name => 'TargetImageType', + Writable => 'int16u', + PrintConv => { + 0 => 'Real-world Subject', + 1 => 'Written Document', + }, + }, + 0x1010 => { #3 + Name => 'ShutterReleaseMethod', + Writable => 'int16u', + PrintConv => { + 0 => 'Single Shot', + 2 => 'Continuous Shooting', + }, + }, + 0x1011 => { #3 + Name => 'ShutterReleaseTiming', + Writable => 'int16u', + PrintConv => { + 0 => 'Priority on shutter', + 1 => 'Priority on focus', + }, + }, + 0x1016 => { Name => 'ReleaseSetting', Writable => 'int16u' }, #3 + 0x101c => { Name => 'BaseISO', Writable => 'int16u' }, #3 + 0x1028=> { #PH + Name => 'CanonFlashInfo', + Writable => 'int16u', + Count => 4, + Unknown => 1, + }, + 0x1029 => { + Name => 'CanonFocalLength', + Writable => 0, + SubDirectory => { TagTable => 'Image::ExifTool::Canon::FocalLength' }, + }, + 0x102a => { + Name => 'CanonShotInfo', + Writable => 0, + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ShotInfo' }, + }, + 0x102c => { + Name => 'CanonColorInfo2', + Writable => 0, + # for the S30, the following information has been decoded: (ref 4) + # offset 66: int32u - shutter half press time in ms + # offset 70: int32u - image capture time in ms + # offset 74: int16u - custom white balance flag (0=Off, 512=On) + }, + 0x102d => { + Name => 'CanonCameraSettings', + Writable => 0, + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraSettings' }, + }, + 0x1030 => { #4 + Name => 'WhiteSample', + Writable => 0, + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonRaw::WhiteSample', + }, + }, + 0x1031 => { + Name => 'SensorInfo', + Writable => 0, + SubDirectory => { TagTable => 'Image::ExifTool::Canon::SensorInfo' }, + }, + # this tag has only be verified for the 10D in CRW files, but the D30 and D60 + # also produce CRW images and have CustomFunction information in their JPEG's + 0x1033 => [ + { + Name => 'CustomFunctions10D', + Condition => '$self->{Model} =~ /EOS 10D/', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::Functions10D', + }, + }, + { + Name => 'CustomFunctionsD30', + Condition => '$self->{Model} =~ /EOS D30\b/', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::FunctionsD30', + }, + }, + { + Name => 'CustomFunctionsD60', + Condition => '$self->{Model} =~ /EOS D60\b/', + SubDirectory => { + # the stored size in the D60 apparently doesn't include the size word: + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size-2,$size)', + # (D60 custom functions are basically the same as D30) + TagTable => 'Image::ExifTool::CanonCustom::FunctionsD30', + }, + }, + { + Name => 'CustomFunctionsUnknown', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonCustom::FuncsUnknown', + }, + }, + ], + 0x1038 => { + Name => 'CanonAFInfo', + Writable => 0, + SubDirectory => { TagTable => 'Image::ExifTool::Canon::AFInfo' }, + }, + 0x1093 => { + Name => 'CanonFileInfo', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::Canon::FileInfo', + }, + }, + 0x10a9 => { + Name => 'ColorBalance', + Writable => 0, + SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorBalance' }, + }, + 0x10b5 => { #PH + Name => 'RawJpgInfo', + SubDirectory => { + Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart,$size)', + TagTable => 'Image::ExifTool::CanonRaw::RawJpgInfo', + }, + }, + 0x10ae => { + Name => 'ColorTemperature', + Writable => 'int16u', + }, + 0x10b4 => { + Name => 'ColorSpace', + Writable => 'int16u', + PrintConv => { + 1 => 'sRGB', + 2 => 'Adobe RGB', + 0xffff => 'Uncalibrated', + }, + }, + 0x1803 => { #3 + Name => 'ImageFormat', + Writable => 0, + SubDirectory => { TagTable => 'Image::ExifTool::CanonRaw::ImageFormat' }, + }, + 0x1804 => { Name => 'RecordID', Writable => 'int32u' }, #3 + 0x1806 => { #3 + Name => 'SelfTimerTime', + Writable => 'int32u', + ValueConv => '$val / 1000', + ValueConvInv => '$val * 1000', + PrintConv => '"$val s"', + PrintConvInv => '$val=~s/\s*s.*//;$val', + }, + 0x1807 => { + Name => 'TargetDistanceSetting', + Format => 'float', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + 0x180b => [ + { + # D30 + Name => 'SerialNumber', + Condition => '$$self{Model} =~ /EOS D30\b/', + Writable => 'int32u', + PrintConv => 'sprintf("%x-%.5d",$val>>16,$val&0xffff)', + PrintConvInv => '$val=~/(.*)-(\d+)/ ? (hex($1)<<16)+$2 : undef', + }, + { + # all EOS models (D30, 10D, 300D) + Name => 'SerialNumber', + Condition => '$$self{Model} =~ /EOS/', + Writable => 'int32u', + PrintConv => 'sprintf("%.10d",$val)', + PrintConvInv => '$val', + }, + { + # this is not SerialNumber for PowerShot models (but what is it?) - PH + Name => 'UnknownNumber', + Unknown => 1, + }, + ], + 0x180e => { + Name => 'TimeStamp', + Writable => 0, + SubDirectory => { + TagTable => 'Image::ExifTool::CanonRaw::TimeStamp', + }, + }, + 0x1810 => { + Name => 'ImageInfo', + Writable => 0, + SubDirectory => { + TagTable => 'Image::ExifTool::CanonRaw::ImageInfo', + }, + }, + 0x1813 => { #3 + Name => 'FlashInfo', + Writable => 0, + SubDirectory => { + TagTable => 'Image::ExifTool::CanonRaw::FlashInfo', + }, + }, + 0x1814 => { #3 + Name => 'MeasuredEV', + Notes => q{ + this is the Canon name for what could better be called MeasuredLV, and + should be close to the calculated LightValue for a proper exposure with most + models + }, + Format => 'float', + ValueConv => '$val + 5', + ValueConvInv => '$val - 5', + }, + 0x1817 => { + Name => 'FileNumber', + Writable => 'int32u', + Groups => { 2 => 'Image' }, + PrintConv => '$_=$val;s/(\d+)(\d{4})/$1-$2/;$_', + PrintConvInv => '$_=$val;s/-//;$_', + }, + 0x1818 => { #3 + Name => 'ExposureInfo', + Groups => { 1 => 'CIFF' }, # (only so CIFF shows up in group lists) + Writable => 0, + SubDirectory => { TagTable => 'Image::ExifTool::CanonRaw::ExposureInfo' }, + }, + 0x1834 => { #PH + Name => 'CanonModelID', + Writable => 'int32u', + PrintHex => 1, + Notes => q{ + this is the complete list of model ID numbers, but note that many of these + models do not produce CRW images + }, + SeparateTable => 'Canon CanonModelID', + PrintConv => \%Image::ExifTool::Canon::canonModelID, + }, + 0x1835 => { + Name => 'DecoderTable', + Writable => 0, + SubDirectory => { TagTable => 'Image::ExifTool::CanonRaw::DecoderTable' }, + }, + 0x183b => { #PH + # display format for serial number + Name => 'SerialNumberFormat', + Writable => 'int32u', + PrintHex => 1, + PrintConv => { + 0x90000000 => 'Format 1', + 0xa0000000 => 'Format 2', + }, + }, + 0x2005 => { + Name => 'RawData', + Writable => 0, + Binary => 1, + }, + 0x2007 => { + Name => 'JpgFromRaw', + Groups => { 2 => 'Preview' }, + Writable => 'resize', # 'resize' allows this value to change size + Permanent => 0, + RawConv => '$self->ValidateImage(\$val,$tag)', + }, + 0x2008 => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Writable => 'resize', # 'resize' allows this value to change size + WriteCheck => '$self->CheckImage(\$val)', + Permanent => 0, + RawConv => '$self->ValidateImage(\$val,$tag)', + }, + # the following entries are subdirectories + # (any 0x28 and 0x30 tag types are handled automatically by the decoding logic) + 0x2804 => { + Name => 'ImageDescription', + SubDirectory => { }, + Writable => 0, + }, + 0x2807 => { #3 + Name => 'CameraObject', + SubDirectory => { }, + Writable => 0, + }, + 0x3002 => { #3 + Name => 'ShootingRecord', + SubDirectory => { }, + Writable => 0, + }, + 0x3003 => { #3 + Name => 'MeasuredInfo', + SubDirectory => { }, + Writable => 0, + }, + 0x3004 => { #3 + Name => 'CameraSpecification', + SubDirectory => { }, + Writable => 0, + }, + 0x300a => { #3 + Name => 'ImageProps', + SubDirectory => { }, + Writable => 0, + }, + 0x300b => { + Name => 'ExifInformation', + SubDirectory => { }, + Writable => 0, + }, +); + +# Canon binary data blocks +%Image::ExifTool::CanonRaw::MakeModel = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + DATAMEMBER => [ 0, 6 ], # indices of data members to extract when writing + WRITABLE => 1, + FORMAT => 'string', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # (can't specify a first entry because this isn't + # a simple binary table with fixed offsets) + 0 => { + Name => 'Make', + Format => 'string[6]', # "Canon\0" + DataMember => 'Make', + RawConv => '$self->{Make} = $val', + }, + 6 => { + Name => 'Model', + Format => 'string', # no size = to the end of the data + Description => 'Camera Model Name', + DataMember => 'Model', + RawConv => '$self->{Model} = $val', + }, +); + +%Image::ExifTool::CanonRaw::TimeStamp = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Time' }, + 0 => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Shift => 'Time', + ValueConv => 'ConvertUnixTime($val)', + ValueConvInv => 'GetUnixTime($val)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + 1 => { #3 + Name => 'TimeZoneCode', + Format => 'int32s', + ValueConv => '$val / 3600', + ValueConvInv => '$val * 3600', + }, + 2 => { #3 + Name => 'TimeZoneInfo', + Notes => 'set to 0x80000000 if TimeZoneCode is valid', + }, +); + +%Image::ExifTool::CanonRaw::ImageFormat = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => { + Name => 'FileFormat', + Flags => 'PrintHex', + PrintConv => { + 0x00010000 => 'JPEG (lossy)', + 0x00010002 => 'JPEG (non-quantization)', + 0x00010003 => 'JPEG (lossy/non-quantization toggled)', + 0x00020001 => 'CRW', + }, + }, + 1 => { + Name => 'TargetCompressionRatio', + Format => 'float', + }, +); + +%Image::ExifTool::CanonRaw::RawJpgInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int16u', + FIRST_ENTRY => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, +# 0 => 'RawJpgInfoSize', + 1 => { #PH + Name => 'RawJpgQuality', + PrintConv => { + 1 => 'Economy', + 2 => 'Normal', + 3 => 'Fine', + 5 => 'Superfine', + }, + }, + 2 => { #PH + Name => 'RawJpgSize', + PrintConv => { + 0 => 'Large', + 1 => 'Medium', + 2 => 'Small', + }, + }, + 3 => 'RawJpgWidth', #PH + 4 => 'RawJpgHeight', #PH +); + +%Image::ExifTool::CanonRaw::FlashInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'float', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => 'FlashGuideNumber', + 1 => 'FlashThreshold', +); + +%Image::ExifTool::CanonRaw::ExposureInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'float', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => 'ExposureCompensation', + 1 => { + Name => 'ShutterSpeedValue', + ValueConv => 'abs($val)<100 ? 1/(2**$val) : 0', + ValueConvInv => '$val>0 ? -log($val)/log(2) : -100', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 2 => { + Name => 'ApertureValue', + ValueConv => '2 ** ($val / 2)', + ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, +); + +%Image::ExifTool::CanonRaw::ImageInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + # Note: Don't make these writable (except rotation) because it confuses + # Canon decoding software if the are changed + 0 => 'ImageWidth', #3 + 1 => 'ImageHeight', #3 + 2 => { #3 + Name => 'PixelAspectRatio', + Format => 'float', + }, + 3 => { + Name => 'Rotation', + Format => 'int32s', + Writable => 'int32s', + }, + 4 => 'ComponentBitDepth', #3 + 5 => 'ColorBitDepth', #3 + 6 => 'ColorBW', #3 +); + +# ref 4 +%Image::ExifTool::CanonRaw::DecoderTable = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + 0 => 'DecoderTableNumber', + 2 => 'CompressedDataOffset', + 3 => 'CompressedDataLength', +); + +# ref 1/4 +%Image::ExifTool::CanonRaw::WhiteSample = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int16u', + FIRST_ENTRY => 1, + 1 => 'WhiteSampleWidth', + 2 => 'WhiteSampleHeight', + 3 => 'WhiteSampleLeftBorder', + 4 => 'WhiteSampleTopBorder', + 5 => 'WhiteSampleBits', + # this is followed by the encrypted white sample values (ref 1) +); + +#------------------------------------------------------------------------------ +# AutoLoad our writer routines when necessary +# +sub AUTOLOAD +{ + return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_); +} + +#------------------------------------------------------------------------------ +# Process Raw file directory +# Inputs: 0) ExifTool object reference +# 1) directory information reference, 2) tag table reference +# Returns: 1 on success +sub ProcessCanonRaw($$$) +{ + my ($et, $dirInfo, $rawTagTable) = @_; + my $blockStart = $$dirInfo{DirStart}; + my $blockSize = $$dirInfo{DirLen}; + my $raf = $$dirInfo{RAF} or return 0; + my $buff; + my $verbose = $et->Options('Verbose'); + my $buildMakerNotes = $et->Options('MakerNotes'); + + # 4 bytes at end of block give directory position within block + $raf->Seek($blockStart+$blockSize-4, 0) or return 0; + $raf->Read($buff, 4) == 4 or return 0; + my $dirOffset = Get32u(\$buff,0) + $blockStart; + $raf->Seek($dirOffset, 0) or return 0; + $raf->Read($buff, 2) == 2 or return 0; + my $entries = Get16u(\$buff,0); # get number of entries in directory + # read the directory (10 bytes per entry) + $raf->Read($buff, 10 * $entries) == 10 * $entries or return 0; + + $verbose and $et->VerboseDir('CIFF', $entries); + my $index; + for ($index=0; $index<$entries; ++$index) { + my $pt = 10 * $index; + my $tag = Get16u(\$buff, $pt); + my $size = Get32u(\$buff, $pt+2); + my $valuePtr = Get32u(\$buff, $pt+6); + my $ptr = $valuePtr + $blockStart; # all pointers relative to block start + if ($tag & 0x8000) { + $et->Warn('Bad CRW directory entry'); + return 1; + } + my $tagID = $tag & 0x3fff; # get tag ID + my $tagType = ($tag >> 8) & 0x38; # get tag type + my $valueInDir = ($tag & 0x4000); # flag for value in directory + my $tagInfo = $et->GetTagInfo($rawTagTable, $tagID); + if (($tagType==0x28 or $tagType==0x30) and not $valueInDir) { + # this type of tag specifies a raw subdirectory + my $name; + $tagInfo and $name = $$tagInfo{Name}; + $name or $name = sprintf("CanonRaw_0x%.4x", $tag); + my %subdirInfo = ( + DirName => $name, + DataLen => 0, + DirStart => $ptr, + DirLen => $size, + Nesting => $$dirInfo{Nesting} + 1, + RAF => $raf, + Parent => $$dirInfo{DirName}, + ); + if ($verbose) { + my $fakeInfo = { Name => $name, SubDirectory => { } }; + $et->VerboseInfo($tagID, $fakeInfo, + 'Index' => $index, + 'Size' => $size, + 'Start' => $ptr, + ); + } + $et->ProcessDirectory(\%subdirInfo, $rawTagTable); + next; + } + my ($valueDataPos, $count, $subdir); + my $format = $crwTagFormat{$tagType}; + if ($tagInfo) { + $subdir = $$tagInfo{SubDirectory}; + $format = $$tagInfo{Format} if $$tagInfo{Format}; + $count = $$tagInfo{Count}; + } + # get value data + my ($value, $delRawConv); + if ($valueInDir) { # is the value data in the directory? + # this type of tag stores the value in the 'size' and 'ptr' fields + $valueDataPos = $dirOffset + $pt + 4; # (remember, +2 for the entry count) + $size = 8; + $value = substr($buff, $pt+2, $size); + # set count to 1 by default for normal values in directory + $count = 1 if not defined $count and $format and + $format ne 'string' and not $subdir; + } else { + $valueDataPos = $ptr; + if ($size <= 512 or ($verbose > 2 and $size <= 65536) + or ($tagInfo and ($$tagInfo{SubDirectory} + or grep(/^$$tagInfo{Name}$/i, $et->GetRequestedTags()) ))) + { + # read value if size is small or specifically requested + # or if this is a SubDirectory + unless ($raf->Seek($ptr, 0) and $raf->Read($value, $size) == $size) { + $et->Warn(sprintf("Error reading %d bytes from 0x%x",$size,$ptr)); + next; + } + } else { + $value = "Binary data $size bytes"; + if ($tagInfo) { + if ($et->Options('Binary') or $verbose) { + # read the value anyway + unless ($raf->Seek($ptr, 0) and $raf->Read($value, $size) == $size) { + $et->Warn(sprintf("Error reading %d bytes from 0x%x",$size,$ptr)); + next; + } + } + # force this to be a binary (scalar reference) + $$tagInfo{RawConv} = '\$val'; + $delRawConv = 1; + } + $size = length $value; + undef $format; + } + } + # set count from tagInfo count if necessary + if ($format and not $count) { + # set count according to format and size + my $fnum = $Image::ExifTool::Exif::formatNumber{$format}; + my $fsiz = $Image::ExifTool::Exif::formatSize[$fnum]; + $count = int($size / $fsiz); + } + if ($verbose) { + my $val = $value; + $format and $val = ReadValue(\$val, 0, $format, $count, $size); + $et->VerboseInfo($tagID, $tagInfo, + Table => $rawTagTable, + Index => $index, + Value => $val, + DataPt => \$value, + DataPos => $valueDataPos, + Size => $size, + Format => $format, + Count => $count, + ); + } + if ($buildMakerNotes) { + # build maker notes information if requested + BuildMakerNotes($et, $tagID, $tagInfo, \$value, $format, $count); + } + next unless defined $tagInfo; + + if ($subdir) { + my $name = $$tagInfo{Name}; + my $newTagTable; + if ($$subdir{TagTable}) { + $newTagTable = GetTagTable($$subdir{TagTable}); + unless ($newTagTable) { + warn "Unknown tag table $$subdir{TagTable}\n"; + next; + } + } else { + warn "Must specify TagTable for SubDirectory $name\n"; + next; + } + my $subdirStart = 0; + #### eval Start () + $subdirStart = eval $$subdir{Start} if $$subdir{Start}; + my $dirData = \$value; + my %subdirInfo = ( + Name => $name, + DataPt => $dirData, + DataLen => $size, + DataPos => $valueDataPos, + DirStart => $subdirStart, + DirLen => $size - $subdirStart, + Nesting => $$dirInfo{Nesting} + 1, + RAF => $raf, + DirName => $name, + Parent => $$dirInfo{DirName}, + ); + #### eval Validate ($dirData, $subdirStart, $size) + if (defined $$subdir{Validate} and not eval $$subdir{Validate}) { + $et->Warn("Invalid $name data"); + } else { + $et->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc}); + } + } else { + # convert to specified format if necessary + $format and $value = ReadValue(\$value, 0, $format, $count, $size); + # save the information + $et->FoundTag($tagInfo, $value); + delete $$tagInfo{RawConv} if $delRawConv; + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# get information from raw file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 if this was a valid Canon RAW file +sub ProcessCRW($$) +{ + my ($et, $dirInfo) = @_; + my ($buff, $sig); + my $raf = $$dirInfo{RAF}; + my $buildMakerNotes = $et->Options('MakerNotes'); + + $raf->Read($buff,2) == 2 or return 0; + SetByteOrder($buff) or return 0; + $raf->Read($buff,4) == 4 or return 0; + $raf->Read($sig,8) == 8 or return 0; # get file signature + $sig =~ /^HEAP(CCDR|JPGM)/ or return 0; # validate signature + my $hlen = Get32u(\$buff, 0); + + $raf->Seek(0, 2) or return 0; # seek to end of file + my $filesize = $raf->Tell() or return 0; + + # initialize maker note data if building maker notes + $buildMakerNotes and InitMakerNotes($et); + + # set the FileType tag unless already done (eg. APP0 CIFF record in JPEG image) + $et->SetFileType(); + + # build directory information for main raw directory + my %dirInfo = ( + DataLen => 0, + DirStart => $hlen, + DirLen => $filesize - $hlen, + Nesting => 0, + RAF => $raf, + Parent => 'CRW', + ); + + # process the raw directory + my $rawTagTable = GetTagTable('Image::ExifTool::CanonRaw::Main'); + my $oldIndent = $$et{INDENT}; + $$et{INDENT} .= '| '; + unless (ProcessCanonRaw($et, \%dirInfo, $rawTagTable)) { + $et->Warn('CRW file format error'); + } + $$et{INDENT} = $oldIndent; + + # finish building maker notes if necessary + $buildMakerNotes and SaveMakerNotes($et); + + # process trailers if they exist in CRW file (not in CIFF information!) + if ($$et{FILE_TYPE} eq 'CRW') { + my $trailInfo = Image::ExifTool::IdentifyTrailer($raf); + $et->ProcessTrailers($trailInfo) if $trailInfo; + } + + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::CanonRaw - Read Canon RAW (CRW) meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +meta information from Canon CRW raw files. These files are written directly +by some Canon cameras, and contain meta information similar to that found in +the EXIF Canon maker notes. + +=head1 NOTES + +The CR2 format written by some Canon cameras is very different the CRW +format processed by this module. (CR2 is TIFF-based and uses standard EXIF +tags.) + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=item L<http://www.wonderland.org/crw/> + +=item L<http://xyrion.org/ciff/> + +=item L<https://exiftool.org/canon_raw.html> + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Dave Nicholson for decoding a number of new tags. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/CanonRaw Tags>, +L<Image::ExifTool::Canon(3pm)|Image::ExifTool::Canon>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/CanonVRD.pm b/lib/Image/ExifTool/CanonVRD.pm new file mode 100644 index 0000000..3fb60a9 --- /dev/null +++ b/lib/Image/ExifTool/CanonVRD.pm @@ -0,0 +1,2282 @@ +#------------------------------------------------------------------------------ +# File: CanonVRD.pm +# +# Description: Read/write Canon VRD and DR4 information +# +# Revisions: 2006/10/30 - P. Harvey Created +# 2007/10/23 - PH Added new VRD 3.0 tags +# 2008/08/29 - PH Added new VRD 3.4 tags +# 2008/12/02 - PH Added new VRD 3.5 tags +# 2010/06/18 - PH Support variable-length CustomPictureStyle data +# 2010/09/14 - PH Added r/w support for XMP in VRD +# 2015/05/16 - PH Added DR4 support (DPP 4.1.50.0) +# 2018/03/13 - PH Update to DPP 4.8.20 +# +# References: 1) Bogdan private communication (Canon DPP v3.4.1.1) +# 2) Gert Kello private communication (DPP 3.8) +#------------------------------------------------------------------------------ + +package Image::ExifTool::CanonVRD; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Canon; + +$VERSION = '1.33'; + +sub ProcessCanonVRD($$;$); +sub WriteCanonVRD($$;$); +sub ProcessEditData($$$); +sub ProcessIHL($$$); +sub ProcessIHLExif($$$); +sub ProcessDR4($$;$); +sub SortDR4($$); + +# map for adding directories to VRD +my %vrdMap = ( + XMP => 'CanonVRD', + CanonVRD => 'VRD', +); + +my %noYes = ( + PrintConvColumns => 2, + PrintConv => { 0 => 'No', 1 => 'Yes' }, +); + +# DR4 format codes +my %vrdFormat = ( + 1 => 'int32u', + 2 => 'string', + 8 => 'int32u', + 9 => 'int32s', + 13 => 'double', + 33 => 'int32u', # (array) + 38 => 'double', # (array) + # 254 => 'undef', ? + 255 => 'undef', +); + +# empty VRD header/footer for creating VRD from scratch +my $blankHeader = "CANON OPTIONAL DATA\0\0\x01\0\0\0\0\0\0"; +my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9"; + +# main tag table blocks in CanonVRD trailer (ref PH) +%Image::ExifTool::CanonVRD::Main = ( + WRITE_PROC => \&WriteCanonVRD, + PROCESS_PROC => \&ProcessCanonVRD, + NOTES => q{ + Canon Digital Photo Professional writes VRD (Recipe Data) information as a + trailer record to JPEG, TIFF, CRW and CR2 images, or as stand-alone VRD or + DR4 files. The tags listed below represent information found in these + records. The complete VRD/DR4 data record may be accessed as a block using + the Extra 'CanonVRD' or 'CanonDR4' tag, but this tag is not extracted or + copied unless specified explicitly. + }, + 0xffff00f4 => { + Name => 'EditData', + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::Edit' }, + }, + 0xffff00f5 => { + Name => 'IHLData', + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::IHL' }, + }, + 0xffff00f6 => { + Name => 'XMP', + Flags => [ 'Binary', 'Protected' ], + Writable => 'undef', # allow writing/deleting as a block + SubDirectory => { + DirName => 'XMP', + TagTable => 'Image::ExifTool::XMP::Main', + }, + }, + 0xffff00f7 => { + Name => 'Edit4Data', + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::Edit4' }, + }, +); + +# the VRD edit information is divided into sections +%Image::ExifTool::CanonVRD::Edit = ( + WRITE_PROC => \&ProcessEditData, + PROCESS_PROC => \&ProcessEditData, + VARS => { ID_LABEL => 'Index' }, # change TagID label in documentation + NOTES => 'Canon VRD edit information.', + 0 => { + Name => 'VRD1', + Size => 0x272, # size of version 1.0 edit information in bytes + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::Ver1' }, + }, + 1 => { + Name => 'VRDStampTool', + Size => 0, # size is variable, and obtained from int32u at directory start + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::StampTool' }, + }, + 2 => { + Name => 'VRD2', + Size => undef, # size is the remaining edit data + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::Ver2' }, + }, +); + +# Canon DPP version 4 edit information +%Image::ExifTool::CanonVRD::Edit4 = ( + WRITE_PROC => \&ProcessEditData, + PROCESS_PROC => \&ProcessEditData, + VARS => { ID_LABEL => 'Index' }, # change TagID label in documentation + NOTES => 'Canon DPP version 4 edit information.', + 0 => { + Name => 'DR4', + Size => undef, # size is the remaining edit data + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::DR4' }, + }, +); + +# "IHL Created Optional Item Data" tags (not yet writable) +%Image::ExifTool::CanonVRD::IHL = ( + PROCESS_PROC => \&ProcessIHL, + TAG_PREFIX => 'VRD_IHL', + GROUPS => { 2 => 'Image' }, + 1 => [ + # this contains edited TIFF-format data, with an original IFD at 0x0008 + # and an edited IFD with offset given in the TIFF header. + { + Name => 'IHL_EXIF', + Condition => '$self->Options("ExtractEmbedded")', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&ProcessIHLExif, + }, + },{ + Name => 'IHL_EXIF', + Notes => q{ + extracted as a block if the L<Unknown|../ExifTool.html#Unknown> option is used, or processed as the + first sub-document with the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> option + }, + Binary => 1, + Unknown => 1, + }, + ], + # 2 - written by DPP 3.0.2.6, and it looks something like edit data, + # but I haven't decoded it yet - PH + 3 => { + # (same size as the PreviewImage with DPP 3.0.2.6) + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + 4 => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + 5 => { + Name => 'RawCodecVersion', + ValueConv => '$val =~ s/\0.*//s; $val', # truncate string at null + }, + 6 => { + Name => 'CRCDevelParams', + Binary => 1, + Unknown => 1, + }, +); + +# VRD version 1 tags (ref PH) +%Image::ExifTool::CanonVRD::Ver1 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 2 => 'Image' }, + DATAMEMBER => [ 0x002 ], # necessary for writing +# +# RAW image adjustment +# + 0x002 => { + Name => 'VRDVersion', + Format => 'int16u', + Writable => 0, + DataMember => 'VRDVersion', + RawConv => '$$self{VRDVersion} = $val', + PrintConv => '$val =~ s/^(\d)(\d*)(\d)$/$1.$2.$3/; $val', + }, + 0x006 => { + Name => 'WBAdjRGGBLevels', + Format => 'int16u[4]', + }, + 0x018 => { + Name => 'WhiteBalanceAdj', + Format => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Cloudy', + 3 => 'Tungsten', + 4 => 'Fluorescent', + 5 => 'Flash', + 8 => 'Shade', + 9 => 'Kelvin', + 30 => 'Manual (Click)', + 31 => 'Shot Settings', + }, + }, + 0x01a => { + Name => 'WBAdjColorTemp', + Format => 'int16u', + }, + # 0x01c similar to 0x006 + 0x024 => { + Name => 'WBFineTuneActive', + Format => 'int16u', + %noYes, + }, + 0x028 => { + Name => 'WBFineTuneSaturation', + Format => 'int16u', + }, + 0x02c => { + Name => 'WBFineTuneTone', + Format => 'int16u', + }, + 0x02e => { + Name => 'RawColorAdj', + Format => 'int16u', + PrintConv => { + 0 => 'Shot Settings', + 1 => 'Faithful', + 2 => 'Custom', + }, + }, + 0x030 => { + Name => 'RawCustomSaturation', + Format => 'int32s', + }, + 0x034 => { + Name => 'RawCustomTone', + Format => 'int32s', + }, + 0x038 => { + Name => 'RawBrightnessAdj', + Format => 'int32s', + ValueConv => '$val / 6000', + ValueConvInv => 'int($val * 6000 + ($val < 0 ? -0.5 : 0.5))', + PrintConv => 'sprintf("%.2f",$val)', + PrintConvInv => '$val', + }, + 0x03c => { + Name => 'ToneCurveProperty', + Format => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Shot Settings', + 1 => 'Linear', + 2 => 'Custom 1', + 3 => 'Custom 2', + 4 => 'Custom 3', + 5 => 'Custom 4', + 6 => 'Custom 5', + }, + }, + # 0x040 usually "10 9 2" + 0x07a => { + Name => 'DynamicRangeMin', + Format => 'int16u', + }, + 0x07c => { + Name => 'DynamicRangeMax', + Format => 'int16u', + }, + # 0x0c6 usually "10 9 2" +# +# RGB image adjustment +# + 0x110 => { + Name => 'ToneCurveActive', + Format => 'int16u', + %noYes, + }, + 0x113 => { + Name => 'ToneCurveMode', + PrintConv => { 0 => 'RGB', 1 => 'Luminance' }, + }, + 0x114 => { + Name => 'BrightnessAdj', + Format => 'int8s', + }, + 0x115 => { + Name => 'ContrastAdj', + Format => 'int8s', + }, + 0x116 => { + Name => 'SaturationAdj', + Format => 'int16s', + }, + 0x11e => { + Name => 'ColorToneAdj', + Notes => 'in degrees, so -1 is the same as 359', + Format => 'int32s', + }, + 0x126 => { + Name => 'LuminanceCurvePoints', + Format => 'int16u[21]', + PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)', + PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)', + }, + 0x150 => { + Name => 'LuminanceCurveLimits', + Notes => '4 numbers: input and output highlight and shadow points', + Format => 'int16u[4]', + }, + 0x159 => { + Name => 'ToneCurveInterpolation', + PrintConv => { 0 => 'Curve', 1 => 'Straight' }, + }, + 0x160 => { + Name => 'RedCurvePoints', + Format => 'int16u[21]', + PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)', + PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)', + }, + # 0x193 same as 0x159 + 0x19a => { + Name => 'GreenCurvePoints', + Format => 'int16u[21]', + PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)', + PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)', + }, + # 0x1cd same as 0x159 + 0x1d4 => { + Name => 'BlueCurvePoints', + Format => 'int16u[21]', + PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)', + PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)', + }, + 0x18a => { + Name => 'RedCurveLimits', + Format => 'int16u[4]', + }, + 0x1c4 => { + Name => 'GreenCurveLimits', + Format => 'int16u[4]', + }, + 0x1fe => { + Name => 'BlueCurveLimits', + Format => 'int16u[4]', + }, + # 0x207 same as 0x159 + 0x20e => { + Name => 'RGBCurvePoints', + Format => 'int16u[21]', + PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)', + PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)', + }, + 0x238 => { + Name => 'RGBCurveLimits', + Format => 'int16u[4]', + }, + # 0x241 same as 0x159 + 0x244 => { + Name => 'CropActive', + Format => 'int16u', + %noYes, + }, + 0x246 => { + Name => 'CropLeft', + Notes => 'crop coordinates in original unrotated image', + Format => 'int16u', + }, + 0x248 => { + Name => 'CropTop', + Format => 'int16u', + }, + 0x24a => { + Name => 'CropWidth', + Format => 'int16u', + }, + 0x24c => { + Name => 'CropHeight', + Format => 'int16u', + }, + 0x25a => { + Name => 'SharpnessAdj', + Format => 'int16u', + }, + 0x260 => { + Name => 'CropAspectRatio', + Format => 'int16u', + PrintConv => { + 0 => 'Free', + 1 => '3:2', + 2 => '2:3', + 3 => '4:3', + 4 => '3:4', + 5 => 'A-size Landscape', + 6 => 'A-size Portrait', + 7 => 'Letter-size Landscape', + 8 => 'Letter-size Portrait', + 9 => '4:5', + 10 => '5:4', + 11 => '1:1', + 12 => 'Circle', + 65535 => 'Custom', + }, + }, + 0x262 => { + Name => 'ConstrainedCropWidth', + Format => 'float', + PrintConv => 'sprintf("%.7g",$val)', + PrintConvInv => '$val', + }, + 0x266 => { + Name => 'ConstrainedCropHeight', + Format => 'float', + PrintConv => 'sprintf("%.7g",$val)', + PrintConvInv => '$val', + }, + 0x26a => { + Name => 'CheckMark', + Format => 'int16u', + PrintConv => { + 0 => 'Clear', + 1 => 1, + 2 => 2, + 3 => 3, + }, + }, + 0x26e => { + Name => 'Rotation', + Format => 'int16u', + PrintConv => { + 0 => 0, + 1 => 90, + 2 => 180, + 3 => 270, + }, + }, + 0x270 => { + Name => 'WorkColorSpace', + Format => 'int16u', + PrintConv => { + 0 => 'sRGB', + 1 => 'Adobe RGB', + 2 => 'Wide Gamut RGB', + 3 => 'Apple RGB', + 4 => 'ColorMatch RGB', + }, + }, + # (VRD 1.0.0 edit data ends here -- 0x272 bytes) +); + +# VRD Stamp Tool tags (ref PH) +%Image::ExifTool::CanonVRD::StampTool = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0x00 => { + Name => 'StampToolCount', + Format => 'int32u', + }, +); + +# VRD version 2 and 3 tags (ref PH) +%Image::ExifTool::CanonVRD::Ver2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + FORMAT => 'int16s', + DATAMEMBER => [ 0x58, 0xdc, 0xdf, 0xe0 ], # (required for DataMember and var-format tags) + IS_SUBDIR => [ 0xe0 ], + GROUPS => { 2 => 'Image' }, + NOTES => 'Tags added in DPP version 2.0 and later.', + 0x02 => { + Name => 'PictureStyle', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Standard', + 1 => 'Portrait', + 2 => 'Landscape', + 3 => 'Neutral', + 4 => 'Faithful', + 5 => 'Monochrome', + 6 => 'Unknown?', # PH (maybe in-camera custom picture style?) + 7 => 'Custom', + }, + }, + 0x03 => { Name => 'IsCustomPictureStyle', %noYes }, + # 0x08: 3 + # 0x09: 4095 + # 0x0a: 0 + # 0x0b: 4095 + # 0x0c: 0 + 0x0d => 'StandardRawColorTone', + 0x0e => 'StandardRawSaturation', + 0x0f => 'StandardRawContrast', + 0x10 => { Name => 'StandardRawLinear', %noYes }, + 0x11 => 'StandardRawSharpness', + 0x12 => 'StandardRawHighlightPoint', + 0x13 => 'StandardRawShadowPoint', + 0x14 => 'StandardOutputHighlightPoint', #2 + 0x15 => 'StandardOutputShadowPoint', #2 + 0x16 => 'PortraitRawColorTone', + 0x17 => 'PortraitRawSaturation', + 0x18 => 'PortraitRawContrast', + 0x19 => { Name => 'PortraitRawLinear', %noYes }, + 0x1a => 'PortraitRawSharpness', + 0x1b => 'PortraitRawHighlightPoint', + 0x1c => 'PortraitRawShadowPoint', + 0x1d => 'PortraitOutputHighlightPoint', + 0x1e => 'PortraitOutputShadowPoint', + 0x1f => 'LandscapeRawColorTone', + 0x20 => 'LandscapeRawSaturation', + 0x21 => 'LandscapeRawContrast', + 0x22 => { Name => 'LandscapeRawLinear', %noYes }, + 0x23 => 'LandscapeRawSharpness', + 0x24 => 'LandscapeRawHighlightPoint', + 0x25 => 'LandscapeRawShadowPoint', + 0x26 => 'LandscapeOutputHighlightPoint', + 0x27 => 'LandscapeOutputShadowPoint', + 0x28 => 'NeutralRawColorTone', + 0x29 => 'NeutralRawSaturation', + 0x2a => 'NeutralRawContrast', + 0x2b => { Name => 'NeutralRawLinear', %noYes }, + 0x2c => 'NeutralRawSharpness', + 0x2d => 'NeutralRawHighlightPoint', + 0x2e => 'NeutralRawShadowPoint', + 0x2f => 'NeutralOutputHighlightPoint', + 0x30 => 'NeutralOutputShadowPoint', + 0x31 => 'FaithfulRawColorTone', + 0x32 => 'FaithfulRawSaturation', + 0x33 => 'FaithfulRawContrast', + 0x34 => { Name => 'FaithfulRawLinear', %noYes }, + 0x35 => 'FaithfulRawSharpness', + 0x36 => 'FaithfulRawHighlightPoint', + 0x37 => 'FaithfulRawShadowPoint', + 0x38 => 'FaithfulOutputHighlightPoint', + 0x39 => 'FaithfulOutputShadowPoint', + 0x3a => { + Name => 'MonochromeFilterEffect', + PrintConv => { + -2 => 'None', + -1 => 'Yellow', + 0 => 'Orange', + 1 => 'Red', + 2 => 'Green', + }, + }, + 0x3b => { + Name => 'MonochromeToningEffect', + PrintConv => { + -2 => 'None', + -1 => 'Sepia', + 0 => 'Blue', + 1 => 'Purple', + 2 => 'Green', + }, + }, + 0x3c => 'MonochromeContrast', + 0x3d => { Name => 'MonochromeLinear', %noYes }, + 0x3e => 'MonochromeSharpness', + 0x3f => 'MonochromeRawHighlightPoint', + 0x40 => 'MonochromeRawShadowPoint', + 0x41 => 'MonochromeOutputHighlightPoint', + 0x42 => 'MonochromeOutputShadowPoint', + 0x45 => { Name => 'UnknownContrast', Unknown => 1 }, + 0x46 => { Name => 'UnknownLinear', %noYes, Unknown => 1 }, + 0x47 => { Name => 'UnknownSharpness', Unknown => 1 }, + 0x48 => { Name => 'UnknownRawHighlightPoint', Unknown => 1 }, + 0x49 => { Name => 'UnknownRawShadowPoint', Unknown => 1 }, + 0x4a => { Name => 'UnknownOutputHighlightPoint',Unknown => 1 }, + 0x4b => { Name => 'UnknownOutputShadowPoint', Unknown => 1 }, + 0x4c => 'CustomColorTone', + 0x4d => 'CustomSaturation', + 0x4e => 'CustomContrast', + 0x4f => { Name => 'CustomLinear', %noYes }, + 0x50 => 'CustomSharpness', + 0x51 => 'CustomRawHighlightPoint', + 0x52 => 'CustomRawShadowPoint', + 0x53 => 'CustomOutputHighlightPoint', + 0x54 => 'CustomOutputShadowPoint', + 0x58 => { + Name => 'CustomPictureStyleData', + Format => 'var_int16u', + Binary => 1, + Notes => 'variable-length data structure', + Writable => 0, + RawConv => 'length($val) == 2 ? undef : $val', # ignore if no data + }, + # (VRD 2.0.0 edit data ends here: 178 bytes, index 0x59) + 0x5e => [{ + Name => 'ChrominanceNoiseReduction', + Condition => '$$self{VRDVersion} < 330', + Notes => 'VRDVersion prior to 3.3.0', + PrintConv => { + 0 => 'Off', + 58 => 'Low', + 100 => 'High', + }, + },{ #1 + Name => 'ChrominanceNoiseReduction', + Notes => 'VRDVersion 3.3.0 or later', + PrintHex => 1, + PrintConvColumns => 4, + PrintConv => { + 0x00 => 0, + 0x10 => 1, + 0x21 => 2, + 0x32 => 3, + 0x42 => 4, + 0x53 => 5, + 0x64 => 6, + 0x74 => 7, + 0x85 => 8, + 0x96 => 9, + 0xa6 => 10, + 0xa7 => 11, + 0xa8 => 12, + 0xa9 => 13, + 0xaa => 14, + 0xab => 15, + 0xac => 16, + 0xad => 17, + 0xae => 18, + 0xaf => 19, + 0xb0 => 20, + }, + }], + 0x5f => [{ + Name => 'LuminanceNoiseReduction', + Condition => '$$self{VRDVersion} < 330', + Notes => 'VRDVersion prior to 3.3.0', + PrintConv => { + 0 => 'Off', + 65 => 'Low', + 100 => 'High', + }, + },{ #1 + Name => 'LuminanceNoiseReduction', + Notes => 'VRDVersion 3.3.0 or later', + PrintHex => 1, + PrintConvColumns => 4, + PrintConv => { + 0x00 => 0, + 0x41 => 1, + 0x64 => 2, + 0x6e => 3, + 0x78 => 4, + 0x82 => 5, + 0x8c => 6, + 0x96 => 7, + 0xa0 => 8, + 0xaa => 9, + 0xb4 => 10, + 0xb5 => 11, + 0xb6 => 12, + 0xb7 => 13, + 0xb8 => 14, + 0xb9 => 15, + 0xba => 16, + 0xbb => 17, + 0xbc => 18, + 0xbd => 19, + 0xbe => 20, + }, + }], + 0x60 => [{ + Name => 'ChrominanceNR_TIFF_JPEG', + Condition => '$$self{VRDVersion} < 330', + Notes => 'VRDVersion prior to 3.3.0', + PrintConv => { + 0 => 'Off', + 33 => 'Low', + 100 => 'High', + }, + },{ #1 + Name => 'ChrominanceNR_TIFF_JPEG', + Notes => 'VRDVersion 3.3.0 or later', + PrintHex => 1, + PrintConvColumns => 4, + PrintConv => { + 0x00 => 0, + 0x10 => 1, + 0x21 => 2, + 0x32 => 3, + 0x42 => 4, + 0x53 => 5, + 0x64 => 6, + 0x74 => 7, + 0x85 => 8, + 0x96 => 9, + 0xa6 => 10, + 0xa7 => 11, + 0xa8 => 12, + 0xa9 => 13, + 0xaa => 14, + 0xab => 15, + 0xac => 16, + 0xad => 17, + 0xae => 18, + 0xaf => 19, + 0xb0 => 20, + }, + }], + # 0x61: 1 + # (VRD 3.0.0 edit data ends here: 196 bytes, index 0x62) + 0x62 => { Name => 'ChromaticAberrationOn', %noYes }, + 0x63 => { Name => 'DistortionCorrectionOn', %noYes }, + 0x64 => { Name => 'PeripheralIlluminationOn', %noYes }, + 0x65 => { Name => 'ColorBlur', %noYes }, + 0x66 => { + Name => 'ChromaticAberration', + ValueConv => '$val / 0x400', + ValueConvInv => 'int($val * 0x400 + 0.5)', + PrintConv => 'sprintf("%.0f%%", $val * 100)', + PrintConvInv => 'ToFloat($val) / 100', + }, + 0x67 => { + Name => 'DistortionCorrection', + ValueConv => '$val / 0x400', + ValueConvInv => 'int($val * 0x400 + 0.5)', + PrintConv => 'sprintf("%.0f%%", $val * 100)', + PrintConvInv => 'ToFloat($val) / 100', + }, + 0x68 => { + Name => 'PeripheralIllumination', + ValueConv => '$val / 0x400', + ValueConvInv => 'int($val * 0x400 + 0.5)', + PrintConv => 'sprintf("%.0f%%", $val * 100)', + PrintConvInv => 'ToFloat($val) / 100', + }, + 0x69 => { + Name => 'AberrationCorrectionDistance', + Notes => '100% = infinity', + RawConv => '$val == 0x7fff ? undef : $val', + ValueConv => '1 - $val / 0x400', + ValueConvInv => 'int((1 - $val) * 0x400 + 0.5)', + PrintConv => 'sprintf("%.0f%%", $val * 100)', + PrintConvInv => 'ToFloat($val) / 100', + }, + 0x6a => 'ChromaticAberrationRed', + 0x6b => 'ChromaticAberrationBlue', + 0x6d => { #1 + Name => 'LuminanceNR_TIFF_JPEG', + Notes => 'val = raw / 10', + ValueConv => '$val / 10', + ValueConvInv => 'int($val * 10 + 0.5)', + }, + # (VRD 3.4.0 edit data ends here: 220 bytes, index 0x6e) + 0x6e => { Name => 'AutoLightingOptimizerOn', %noYes }, + 0x6f => { + Name => 'AutoLightingOptimizer', + PrintConv => { + 100 => 'Low', + 200 => 'Standard', + 300 => 'Strong', + 0x7fff => 'n/a', #1 + }, + }, + # 0x71: 200 + # 0x73: 100 + # (VRD 3.5.0 edit data ends here: 232 bytes, index 0x74) + 0x75 => { + Name => 'StandardRawHighlight', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x76 => { + Name => 'PortraitRawHighlight', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x77 => { + Name => 'LandscapeRawHighlight', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x78 => { + Name => 'NeutralRawHighlight', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x79 => { + Name => 'FaithfulRawHighlight', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x7a => { + Name => 'MonochromeRawHighlight', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x7b => { + Name => 'UnknownRawHighlight', + Unknown => 1, + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x7c => { + Name => 'CustomRawHighlight', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x7e => { + Name => 'StandardRawShadow', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x7f => { + Name => 'PortraitRawShadow', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x80 => { + Name => 'LandscapeRawShadow', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x81 => { + Name => 'NeutralRawShadow', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x82 => { + Name => 'FaithfulRawShadow', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x83 => { + Name => 'MonochromeRawShadow', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x84 => { + Name => 'UnknownRawShadow', + Unknown => 1, + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x85 => { + Name => 'CustomRawShadow', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x8b => { #2 + Name => 'AngleAdj', + Format => 'int32s', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + }, + 0x8e => { + Name => 'CheckMark2', + Format => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Clear', + 1 => 1, + 2 => 2, + 3 => 3, + 4 => 4, + 5 => 5, + }, + }, + # (VRD 3.8.0 edit data ends here: 286 bytes, index 0x8f) + 0x90 => { + Name => 'UnsharpMask', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x92 => 'StandardUnsharpMaskStrength', + 0x94 => 'StandardUnsharpMaskFineness', + 0x96 => 'StandardUnsharpMaskThreshold', + 0x98 => 'PortraitUnsharpMaskStrength', + 0x9a => 'PortraitUnsharpMaskFineness', + 0x9c => 'PortraitUnsharpMaskThreshold', + 0x9e => 'LandscapeUnsharpMaskStrength', + 0xa0 => 'LandscapeUnsharpMaskFineness', + 0xa2 => 'LandscapeUnsharpMaskThreshold', + 0xa4 => 'NeutraUnsharpMaskStrength', + 0xa6 => 'NeutralUnsharpMaskFineness', + 0xa8 => 'NeutralUnsharpMaskThreshold', + 0xaa => 'FaithfulUnsharpMaskStrength', + 0xac => 'FaithfulUnsharpMaskFineness', + 0xae => 'FaithfulUnsharpMaskThreshold', + 0xb0 => 'MonochromeUnsharpMaskStrength', + 0xb2 => 'MonochromeUnsharpMaskFineness', + 0xb4 => 'MonochromeUnsharpMaskThreshold', + 0xb6 => 'CustomUnsharpMaskStrength', + 0xb8 => 'CustomUnsharpMaskFineness', + 0xba => 'CustomUnsharpMaskThreshold', + 0xbc => 'CustomDefaultUnsharpStrength', + 0xbe => 'CustomDefaultUnsharpFineness', + 0xc0 => 'CustomDefaultUnsharpThreshold', + # (VRD 3.9.1 edit data ends here: 392 bytes, index 0xc4) + # 0xc9: 3 - some RawSharpness + # 0xca: 4095 - some RawHighlightPoint + # 0xcb: 0 - some RawShadowPoint + # 0xcc: 4095 - some OutputHighlightPoint + # 0xcd: 0 - some OutputShadowPoint + # 0xd1: 3 - some UnsharpMaskStrength + # 0xd3: 7 - some UnsharpMaskFineness + # 0xd5: 3,4 - some UnsharpMaskThreshold + 0xd6 => { Name => 'CropCircleActive', %noYes }, + 0xd7 => 'CropCircleX', + 0xd8 => 'CropCircleY', + 0xd9 => 'CropCircleRadius', + # 0xda: 0, 1 + # 0xdb: 100 + 0xdc => { + Name => 'DLOOn', + DataMember => 'DLOOn', + RawConv => '$$self{DLOOn} = $val', + %noYes, + }, + 0xdd => 'DLOSetting', + # (VRD 3.11.0 edit data ends here: 444 bytes, index 0xde) + 0xde => { + Name => 'DLOShootingDistance', + Notes => '100% = infinity', + RawConv => '$val == 0x7fff ? undef : $val', + ValueConv => '1 - $val / 0x400', + ValueConvInv => 'int((1 - $val) * 0x400 + 0.5)', + PrintConv => 'sprintf("%.0f%%", $val * 100)', + PrintConvInv => 'ToFloat($val) / 100', + }, + 0xdf => { + Name => 'DLODataLength', + DataMember => 'DLODataLength', + Format => 'int32u', + Writable => 0, + RawConv => '$$self{DLODataLength} = $val', + }, + 0xe0 => { # (yes, this overlaps DLODataLength) + Name => 'DLOInfo', + # - have seen DLODataLengths of 65536,64869 when DLO is Off, so must test DLOOn flag + Condition => '$$self{DLOOn}', + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::DLOInfo' }, + Hook => '$varSize += $$self{DLODataLength} + 0x16', + }, + 0xe1 => 'CameraRawColorTone', + # (VRD 3.11.2 edit data ends here: 452 bytes, index 0xe2, unless DLO is on) + 0xe2 => 'CameraRawSaturation', + 0xe3 => 'CameraRawContrast', + 0xe4 => { Name => 'CameraRawLinear', %noYes }, + 0xe5 => 'CameraRawSharpness', + 0xe6 => 'CameraRawHighlightPoint', + 0xe7 => 'CameraRawShadowPoint', + 0xe8 => 'CameraRawOutputHighlightPoint', + 0xe9 => 'CameraRawOutputShadowPoint', +); + +# DLO tags (ref PH) +%Image::ExifTool::CanonVRD::DLOInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 1, + FORMAT => 'int16s', + GROUPS => { 2 => 'Image' }, + NOTES => 'Tags added when DLO (Digital Lens Optimizer) is on.', + # 0x01 - seen 3112,3140 + 0x04 => 'DLOSettingApplied', + 0x05 => { + Name => 'DLOVersion', #(NC) + Format => 'string[10]', + }, + 0x0a => { + Name => 'DLOData', + LargeTag => 1, # large tag, so avoid storing unnecessarily + Notes => 'variable-length Digital Lens Optimizer data, stored in JPEG-like format', + Format => 'undef[$$self{DLODataLength}]', + Writable => 0, + Binary => 1, + }, +); + +# VRD version 4 tags (ref PH) +%Image::ExifTool::CanonVRD::DR4 = ( + PROCESS_PROC => \&ProcessDR4, + WRITE_PROC => \&ProcessDR4, + WRITABLE => 1, + GROUPS => { 2 => 'Image' }, + VARS => { HEX_ID => 1, SORT_PROC => \&SortDR4 }, + NOTES => q{ + Tags written by Canon DPP version 4 in CanonVRD trailers and DR4 files. Each + tag has three associated flag words which are stored with the directory + entry, some of which are extracted as a separate tag, indicated in the table + below by a decimal appended to the tag ID (.0, .1 or .2). + }, + header => { + Name => 'DR4Header', + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::DR4Header' }, + }, + 0x10002 => 'Rotation', # left/right rotation 90,180,270 + 0x10003 => 'AngleAdj', # crop angle + # 0x10018 - fmt=8: 0 + # 0x10020 - fmt=2: '' + 0x10021 => 'CustomPictureStyle', # (string) + 0x10101 => { + Name => 'CheckMark', + PrintConv => { + 0 => 'Clear', + 1 => 1, + 2 => 2, + 3 => 3, + 4 => 4, + 5 => 5, + }, + }, + 0x10200 => { + Name => 'WorkColorSpace', + PrintConv => { + 1 => 'sRGB', + 2 => 'Adobe RGB', + 3 => 'Wide Gamut RGB', + 4 => 'Apple RGB', + 5 => 'ColorMatch RGB', + }, + }, + # 0x10201 - fmt=9: 0 + # 0x10f20 - fmt=9: 350 + 0x20001 => 'RawBrightnessAdj', + 0x20101 => { + Name => 'WhiteBalanceAdj', + PrintConvColumns => 2, + PrintConv => { + -1 => 'Manual (Click)', + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Cloudy', + 3 => 'Tungsten', + 4 => 'Fluorescent', + 5 => 'Flash', + 8 => 'Shade', + 9 => 'Kelvin', + 255 => 'Shot Settings', + }, + }, + 0x20102 => 'WBAdjColorTemp', + 0x20105 => 'WBAdjMagentaGreen', + 0x20106 => 'WBAdjBlueAmber', + 0x20125 => { + Name => 'WBAdjRGGBLevels', + PrintConv => '$val =~ s/^\d+ //; $val', # remove first integer (14: what is this for?) + PrintConvInv => '"14 $val"', + }, + 0x20200 => { Name => 'GammaLinear', %noYes }, + 0x20301 => { + Name => 'PictureStyle', + PrintHex => 1, + PrintConv => { + 0x81 => 'Standard', + 0x82 => 'Portrait', + 0x83 => 'Landscape', + 0x84 => 'Neutral', + 0x85 => 'Faithful', + 0x86 => 'Monochrome', + 0x87 => 'Auto', + 0x88 => 'Fine Detail', + 0xf0 => 'Shot Settings', + 0xff => 'Custom', + }, + }, + # 0x20302 - Gamma curve data + 0x20303 => 'ContrastAdj', + 0x20304 => 'ColorToneAdj', + 0x20305 => 'ColorSaturationAdj', + 0x20306 => { + Name => 'MonochromeToningEffect', + PrintConv => { + 0 => 'None', + 1 => 'Sepia', + 2 => 'Blue', + 3 => 'Purple', + 4 => 'Green', + }, + }, + 0x20307 => { + Name => 'MonochromeFilterEffect', + PrintConv => { + 0 => 'None', + 1 => 'Yellow', + 2 => 'Orange', + 3 => 'Red', + 4 => 'Green', + }, + }, + 0x20308 => 'UnsharpMaskStrength', + 0x20309 => 'UnsharpMaskFineness', + 0x2030a => 'UnsharpMaskThreshold', + 0x2030b => 'ShadowAdj', + 0x2030c => 'HighlightAdj', + 0x20310 => { + Name => 'SharpnessAdj', + PrintConv => { + 0 => 'Sharpness', + 1 => 'Unsharp Mask', + }, + }, + '0x20310.0' => { Name => 'SharpnessAdjOn', %noYes }, + 0x20311 => 'SharpnessStrength', + 0x20400 => { + Name => 'ToneCurve', + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::ToneCurve' }, + }, + '0x20400.1' => { Name => 'ToneCurveOriginal', %noYes }, + # 0x20401 - fmt=33 (312 bytes) + 0x20410 => 'ToneCurveBrightness', + 0x20411 => 'ToneCurveContrast', + 0x20500 => { + Name => 'AutoLightingOptimizer', + PrintConv => { + 0 => 'Low', + 1 => 'Standard', + 2 => 'Strong', + }, + }, + '0x20500.0' => { + Name => 'AutoLightingOptimizerOn', + Notes => 'ignored if gamma is linear', + %noYes, + }, + # 0x20501 - fmt=13: 0 + # 0x20502 - fmt=13: 0 + 0x20600 => 'LuminanceNoiseReduction', + 0x20601 => 'ChrominanceNoiseReduction', + # 0x20650 - fmt=9: 0 (JPG images) + 0x20670 => 'ColorMoireReduction', + '0x20670.0' => { Name => 'ColorMoireReductionOn', %noYes }, + 0x20701 => { + Name => 'ShootingDistance', + Notes => '100% = infinity', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.0f%%", $val * 100)', + PrintConvInv => 'ToFloat($val) / 100', + }, + 0x20702 => { + Name => 'PeripheralIllumination', + PrintConv => 'sprintf "%g", $val', + PrintConvInv => '$val', + }, + '0x20702.0' => { Name => 'PeripheralIlluminationOn', %noYes }, + 0x20703 => { + Name => 'ChromaticAberration', + PrintConv => 'sprintf "%g", $val', + PrintConvInv => '$val', + }, + '0x20703.0' => { Name => 'ChromaticAberrationOn', %noYes }, + 0x20704 => { Name => 'ColorBlurOn', %noYes }, + 0x20705 => { + Name => 'DistortionCorrection', + PrintConv => 'sprintf "%g", $val', + PrintConvInv => '$val', + }, + '0x20705.0' => { Name => 'DistortionCorrectionOn', %noYes }, + 0x20706 => 'DLOSetting', + '0x20706.0' => { Name => 'DLOOn', %noYes }, + 0x20707 => { + Name => 'ChromaticAberrationRed', + PrintConv => 'sprintf "%g", $val', + PrintConvInv => '$val', + }, + 0x20708 => { + Name => 'ChromaticAberrationBlue', + PrintConv => 'sprintf "%g", $val', + PrintConvInv => '$val', + }, + 0x20709 => { + Name => 'DistortionEffect', + PrintConv => { + 0 => 'Shot Settings', + 1 => 'Emphasize Linearity', + 2 => 'Emphasize Distance', + 3 => 'Emphasize Periphery', + 4 => 'Emphasize Center', + }, + }, + # 0x20800 - fmt=1: 0 + # 0x20801 - fmt=1: 0 + 0x2070b => { Name => 'DiffractionCorrectionOn', %noYes }, + 0x20900 => 'ColorHue', + 0x20901 => 'SaturationAdj', + 0x20910 => 'RedHSL', + 0x20911 => 'OrangeHSL', + 0x20912 => 'YellowHSL', + 0x20913 => 'GreenHSL', + 0x20914 => 'AquaHSL', + 0x20915 => 'BlueHSL', + 0x20916 => 'PurpleHSL', + 0x20917 => 'MagentaHSL', + 0x20a00 => { + Name => 'GammaInfo', + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::GammaInfo' }, + }, + # 0x20a01 - Auto picture style settings + # 0x20a02 - Standard picture style settings + # 0x20a03 - Portrait picture style settings + # 0x20a04 - Landscape picture style settings + # 0x20a05 - Neutral picture style settings + # 0x20a06 - Faithful picture style settings + # 0x20a07 - Monochrome picture style settings + # 0x20a08 - (unknown picture style settings) + # 0x20a09 - Custom picture style settings + # 0x20a20 - Fine Detail picture style settings + 0x30101 => { + Name => 'CropAspectRatio', + PrintConv => { + 0 => 'Free', + 1 => 'Custom', + 2 => '1:1', + 3 => '3:2', + 4 => '2:3', + 5 => '4:3', + 6 => '3:4', + 7 => '5:4', + 8 => '4:5', + 9 => '16:9', + 10 => '9:16', + }, + }, + 0x30102 => 'CropAspectRatioCustom', + # 0x30103 - fmt=33: "0 0 8" + 0xf0100 => { + Name => 'CropInfo', + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::CropInfo' }, + }, + 0xf0500 => { + Name => 'CustomPictureStyleData', + Binary => 1, + }, + 0xf0510 => { + Name => 'StampInfo', + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::StampInfo' }, + }, + 0xf0511 => { + Name => 'DustInfo', + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::DustInfo' }, + }, + 0xf0512 => 'LensFocalLength', + # 0xf0521 - DLO data + # 0xf0520 - DLO data + # 0xf0530 - created when dust delete data applied (4 bytes, all zero) + # 0xf0600 - fmt=253 (2308 bytes, JPG images) + # 0xf0601 - fmt=253 (2308 bytes, JPG images) + # 0x1ff52c - values: 129,130,132 (related to custom picture style somehow) + # to do: + # - find 8-15mm CR2 sample and decode linear distortion effect fine-tune +); + +# Version 4 header information (ref PH) +%Image::ExifTool::CanonVRD::DR4Header = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + FORMAT => 'int32u', + GROUPS => { 2 => 'Image' }, + # 0 - value: 'IIII' (presumably byte order) + # 1 - value: 0x00040004 (currently use this for magic number) + # 2 - value: 6 + 3 => { + Name => 'DR4CameraModel', + Writable => 'int32u', + PrintHex => 1, + SeparateTable => 'Canon CanonModelID', + PrintConv => \%Image::ExifTool::Canon::canonModelID, + }, + # 4 - value: 3 + # 5 - value: 4 + # 6 - value: 5 + # 7 - DR4 directory entry count +); + +# Version 4 RGB tone curve information (ref PH) +%Image::ExifTool::CanonVRD::ToneCurve = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + FORMAT => 'int32u', + GROUPS => { 2 => 'Image' }, + 0x00 => { + Name => 'ToneCurveColorSpace', + PrintConv => { + 0 => 'RGB', + 1 => 'Luminance', + }, + }, + 0x01 => { + Name => 'ToneCurveShape', + PrintConv => { + 0 => 'Curve', + 1 => 'Straight', + }, + }, + 0x03 => { Name => 'ToneCurveInputRange', Format => 'int32u[2]', Notes => '255 max' }, + 0x05 => { Name => 'ToneCurveOutputRange', Format => 'int32u[2]', Notes => '255 max' }, + 0x07 => { + Name => 'RGBCurvePoints', + Format => 'int32u[21]', + PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)', + PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)', + }, + 0x0a => 'ToneCurveX', + 0x0b => 'ToneCurveY', + 0x2d => { + Name => 'RedCurvePoints', + Format => 'int32u[21]', + PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)', + PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)', + }, + 0x53 => { + Name => 'GreenCurvePoints', + Format => 'int32u[21]', + PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)', + PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)', + }, + 0x79 => { + Name => 'BlueCurvePoints', + Format => 'int32u[21]', + PrintConv => 'Image::ExifTool::CanonVRD::ToneCurvePrint($val)', + PrintConvInv => 'Image::ExifTool::CanonVRD::ToneCurvePrintInv($val)', + }, +); + +# Version 4 gamma curve information (ref PH) +%Image::ExifTool::CanonVRD::GammaInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + FORMAT => 'double', + GROUPS => { 2 => 'Image' }, + 0x02 => 'GammaContrast', + 0x03 => 'GammaColorTone', + 0x04 => 'GammaSaturation', + 0x05 => 'GammaUnsharpMaskStrength', + 0x06 => 'GammaUnsharpMaskFineness', + 0x07 => 'GammaUnsharpMaskThreshold', + 0x08 => 'GammaSharpnessStrength', + 0x09 => 'GammaShadow', + 0x0a => 'GammaHighlight', + # 0x0b-0x10 are the same as first 6 doubles of tag DR4_0x20302 + # 0x0b - value: 14 + 0x0c => { + Name => 'GammaBlackPoint', + ValueConv => q{ + return 0 if $val <= 0; + $val = log($val / 4.6875) / log(2) + 1; + return abs($val) > 1e-10 ? $val : 0; + }, + ValueConvInv => '$val ? exp(($val - 1) * log(2)) * 4.6876 : 0', + PrintConv => 'sprintf("%+.3f", $val)', + PrintConvInv => '$val', + }, + 0x0d => { + Name => 'GammaWhitePoint', + ValueConv => q{ + return $val if $val <= 0; + $val = log($val / 4.6875) / log(2) - 11.77109325169954; + return abs($val) > 1e-10 ? $val : 0; + }, + ValueConvInv => '$val ? exp(($val + 11.77109325169954) * log(2)) * 4.6875 : 0', + PrintConv => 'sprintf("%+.3f", $val)', + PrintConvInv => '$val', + }, + 0x0e => { + Name => 'GammaMidPoint', + ValueConv => q{ + return $val if $val <= 0; + $val = log($val / 4.6875) / log(2) - 8; + return abs($val) > 1e-10 ? $val : 0; + }, + ValueConvInv => '$val ? exp(($val + 8) * log(2)) * 4.6876 : 0', + PrintConv => 'sprintf("%+.3f", $val)', + PrintConvInv => '$val', + }, + 0x0f => { Name => 'GammaCurveOutputRange', Format => 'double[2]', Notes => '16383 max' }, +); + +# Version 4 crop information (ref PH) +%Image::ExifTool::CanonVRD::CropInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + FORMAT => 'int32s', + GROUPS => { 2 => 'Image' }, + 0 => { Name => 'CropActive', %noYes }, + 1 => 'CropRotatedOriginalWidth', + 2 => 'CropRotatedOriginalHeight', + 3 => 'CropX', + 4 => 'CropY', + 5 => 'CropWidth', + 6 => 'CropHeight', + 8 => { + Name => 'CropRotation', + Format => 'double', + PrintConv => 'sprintf("%.7g",$val)', + PrintConvInv => '$val', + }, + 0x0a => 'CropOriginalWidth', + 0x0b => 'CropOriginalHeight', + # 0x0c double - value: 100 +); + +# DR4 Stamp Tool tags (ref PH) +%Image::ExifTool::CanonVRD::StampInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + 0x02 => 'StampToolCount', +); + +# DR4 dust delete information (ref PH) +%Image::ExifTool::CanonVRD::DustInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + 0x02 => { Name => 'DustDeleteApplied', %noYes }, +); + +#------------------------------------------------------------------------------ +# sort DR4 tag ID's for the documentation +sub SortDR4($$) +{ + my ($a, $b) = @_; + my ($aHex, $aDec, $bHex, $bDec); + ($aHex, $aDec) = ($1, $2) if $a =~ /^(0x[0-9a-f]+)?\.?(\d*?)$/; + ($bHex, $bDec) = ($1, $2) if $b =~ /^(0x[0-9a-f]+)?\.?(\d*?)$/; + if ($aHex) { + return 1 unless defined $bDec; # $b is 'header'; + return hex($aHex) <=> hex($bHex) || $aDec <=> $bDec if $bHex; + return hex($aHex) <=> $bDec || 1; + } elsif ($bHex) { + return -1 unless defined $aDec; + return $aDec <=> hex($bHex) || -1; + } else { + return 1 unless defined $bDec; + return -1 unless defined $aDec; + return $aDec <=> $bDec; + } +} + +#------------------------------------------------------------------------------ +# Tone curve print conversion +sub ToneCurvePrint($) +{ + my $val = shift; + my @vals = split ' ', $val; + return $val unless @vals == 21; + my $n = shift @vals; + return $val unless $n >= 2 and $n <= 10; + $val = ''; + while ($n--) { + $val and $val .= ' '; + $val .= '(' . shift(@vals) . ',' . shift(@vals) . ')'; + } + return $val; +} + +#------------------------------------------------------------------------------ +# Inverse print conversion for tone curve +sub ToneCurvePrintInv($) +{ + my $val = shift; + my @vals = ($val =~ /\((\d+),(\d+)\)/g); + return undef unless @vals >= 4 and @vals <= 20 and not @vals & 0x01; + unshift @vals, scalar(@vals) / 2; + while (@vals < 21) { push @vals, 0 } + return join(' ',@vals); +} + +#------------------------------------------------------------------------------ +# Read/Write VRD edit data +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: Reading: 1 on success; Writing: modified edit data, or undef if nothing changed +sub ProcessEditData($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $dataPos = $$dirInfo{DataPos}; + my $outfile = $$dirInfo{OutFile}; + my $dirLen = $$dirInfo{DirLen}; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my $oldChanged = $$et{CHANGED}; + + $et->VerboseDir('VRD Edit Data', 0, $dirLen) unless $outfile; + + if ($outfile) { + # make a copy for editing in place + my $buff = substr($$dataPt, $pos, $dirLen); + $dataPt = $$dirInfo{DataPt} = \$buff; + $dataPos += $pos; + $pos = $$dirInfo{DirStart} = 0; + } + my $dirEnd = $pos + $dirLen; + + # loop through all records in the edit data + my ($recNum, $recLen, $err); + for ($recNum=0;; ++$recNum, $pos+=$recLen) { + if ($pos + 4 > $dirEnd) { + last if $pos == $dirEnd; # all done if we arrived at end + $recLen = 0; # just reset record size (will exit loop on test below) + } else { + $recLen = Get32u($dataPt, $pos); + # (DR4 has a null terminator) + last if $recLen == 0 and $pos + 4 == $dirEnd; + } + $pos += 4; # move to start of record + if ($pos + $recLen > $dirEnd) { + $et->Warn('Possibly corrupt CanonVRD Edit record'); + $err = 1; + last; + } + my $saveRecLen = $recLen; + if ($verbose > 1 and not $outfile) { + printf $out "$$et{INDENT}CanonVRD Edit record ($recLen bytes at offset 0x%x)\n", + $pos + $dataPos; + $et->VerboseDump($dataPt, Len => $recLen, Start => $pos, Addr => $pos + $dataPos) if $recNum; + } + + # our edit information is the 0th record, so don't process the others + next if $recNum; + + # process VRD edit information + my $subTablePtr = $tagTablePtr; + my $index; + my %subdirInfo = ( + DataPt => $dataPt, + DataPos => $dataPos, + DirStart => $pos, + DirLen => $recLen, + OutFile => $outfile, + ); + my $subStart = 0; + # loop through various sections of the VRD edit data + for ($index=0; ; ++$index) { + my $tagInfo = $$subTablePtr{$index} or last; + my $subLen; + my $maxLen = $recLen - $subStart; + if ($$tagInfo{Size}) { + $subLen = $$tagInfo{Size}; + } elsif (defined $$tagInfo{Size}) { + # get size from int32u at $subStart + last unless $subStart + 4 <= $recLen; + $subLen = Get32u($dataPt, $subStart + $pos); + $subStart += 4; # skip the length word + } else { + $subLen = $maxLen; + } + $subLen > $maxLen and $subLen = $maxLen; + if ($subLen) { + my $subTable = GetTagTable($$tagInfo{SubDirectory}{TagTable}); + my $subName = $$tagInfo{Name}; + $subdirInfo{DirStart} = $subStart + $pos; + $subdirInfo{DirLen} = $subLen; + $subdirInfo{DirName} = $subName; + if ($outfile) { + # rewrite this section of the VRD edit information + $verbose and print $out " Rewriting Canon $subName\n"; + my $newVal = $et->WriteDirectory(\%subdirInfo, $subTable); + if ($newVal) { + my $sizeDiff = length($newVal) - $subLen; + substr($$dataPt, $pos+$subStart, $subLen) = $newVal; + if ($sizeDiff) { + $subLen = length $newVal; + $recLen += $sizeDiff; + $dirEnd += $sizeDiff; + $dirLen += $sizeDiff; + } + } + } else { + $et->VPrint(0, "$$et{INDENT}$subName (SubDirectory) -->\n"); + $et->VerboseDump($dataPt, + Start => $pos + $subStart, + Addr => $dataPos + $pos + $subStart, + Len => $subLen, + ); + # extract tags from this section of the VRD edit information + $et->ProcessDirectory(\%subdirInfo, $subTable); + } + } + # next section starts at the end of this one + $subStart += $subLen; + } + if ($outfile and $saveRecLen ne $recLen) { + # update record length if necessary + Set32u($recLen, $dataPt, $pos - 4) + } + } + if ($outfile) { + return undef if $oldChanged == $$et{CHANGED}; + return substr($$dataPt, $$dirInfo{DirStart}, $dirLen); + } + return $err ? 0 : 1; +} + +#------------------------------------------------------------------------------ +# Process VRD IHL data +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessIHL($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $pos = $$dirInfo{DirStart}; + my $dirLen = $$dirInfo{DirLen}; + my $dirEnd = $pos + $dirLen; + + $et->VerboseDir('VRD IHL', 0, $dirLen); + + SetByteOrder('II'); # (make up your mind, Canon!) + while ($pos + 48 <= $dirEnd) { + my $hdr = substr($$dataPt, $pos, 48); + unless ($hdr =~ /^IHL Created Optional Item Data\0\0/) { + $et->Warn('Possibly corrupted VRD IHL data'); + last; + } + my $tag = Get32u($dataPt, $pos + 36); + my $size = Get32u($dataPt, $pos + 40); # size of data in IHL record + my $next = Get32u($dataPt, $pos + 44); # size of complete IHL record + if ($size > $next or $pos + 48 + $next > $dirEnd) { + $et->Warn(sprintf('Bad size for VRD IHL tag 0x%.4x', $tag)); + last; + } + $pos += 48; + $et->HandleTag($tagTablePtr, $tag, substr($$dataPt, $pos, $size), + DataPt => $dataPt, + DataPos => $dataPos, + Start => $pos, + Size => $size + ); + $pos += $next; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process VRD IHL EXIF data +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessIHLExif($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $$et{DOC_NUM} = 1; + # the IHL-edited maker notes may look messed up, but the offsets should be OK + my $oldFix = $et->Options(FixBase => 0); + my $rtnVal = $et->ProcessTIFF($dirInfo, $tagTablePtr); + $et->Options(FixBase => $oldFix); + delete $$et{DOC_NUM}; + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Wrap DR4 data with the VRD header/footer and edit record +# Inputs: 0) DR4 record +# Returns: VRD[Edit[DR4]] data +sub WrapDR4($) +{ + my $val = shift; + my $n = length $val; + my $oldOrder = GetByteOrder(); + SetByteOrder('MM'); + $val = $blankHeader . "\xff\xff\0\xf7" . Set32u($n+8) . Set32u($n) . + $val . "\0\0\0\0" . $blankFooter; + # update the new VRD length in the header/footer + Set32u($n + 16, \$val, 0x18); # (extra 16 bytes for the edit record wrapper) + Set32u($n + 16, \$val, length($val) - 0x2c); + SetByteOrder($oldOrder); + return $val; +} + +#------------------------------------------------------------------------------ +# Read/Write DPP version 4 edit data or DR4 file +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: +# Reading from memory (not RAF and not IsWriting): 1 on success +# Editing from memory (not RAF and IsWriting): modified edit data, or undef if nothing changed +# Reading file (RAF and not OutFile): 1 if a valid DR4 file, 0 if not +# Writing file (RAF and OutFile): 1 if valid DR4 file, 0 if not, -1 on write error +# (serves me right for not having a consistent interface for the various modes of operation) +sub ProcessDR4($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access + my $dataPt = $$dirInfo{DataPt}; + my $raf = $$dirInfo{RAF}; + my $outfile = $$dirInfo{OutFile}; + my $isWriting = $outfile || $$dirInfo{IsWriting}; + my $dataPos = $$dirInfo{DataPos} || 0; + my $verbose = $et->Options('Verbose'); + my $unknown = $et->Options('Unknown'); + my ($pos, $dirLen, $numEntries, $err, $newTags); + + # write CanonDR4 as a block if specified + if ($isWriting) { + my $nvHash; + my $newVal = $et->GetNewValue('CanonDR4', \$nvHash); + if ($newVal) { + $et->VPrint(0, " Writing CanonDR4 as a block\n"); + $$et{DidCanonVRD} = 1; # set flag so we don't add this twice + ++$$et{CHANGED}; + if ($outfile) { + Write($$dirInfo{OutFile}, $newVal) or return -1; + return 1; + } else { + return $newVal; + } + } elsif (not $dataPt and ($nvHash or $$et{DEL_GROUP}{CanonVRD})) { + $et->Error("Can't delete all CanonDR4 information from a DR4 file"); + return 1; + } + } + if ($dataPt) { + $pos = $$dirInfo{DirStart} || 0; + $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $pos; + } else { + # load DR4 file into memory + my $buff; + $raf->Read($buff, 8) == 8 and $buff eq "IIII\x04\0\x04\0" or return 0; + $et->SetFileType(); + $raf->Seek(0, 2) or return $err = 1; + $dirLen = $raf->Tell(); + $raf->Seek(0, 0) or return $err = 1; + $raf->Read($buff, $dirLen) == $dirLen or $err = 1; + $err and $et->Warn('Error reading DR4 file'), return 1; + $tagTablePtr = GetTagTable('Image::ExifTool::CanonVRD::DR4'); + $dataPt = \$buff; + $pos = 0; + } + my $dirEnd = $pos + $dirLen; + + if (($$et{TAGS_FROM_FILE} and + not $$et{EXCL_TAG_LOOKUP}{canondr4}) or $$et{REQ_TAG_LOOKUP}{canondr4}) + { + # extract CanonDR4 block if copying tags, or if requested + $et->FoundTag('CanonDR4', substr($$dataPt, $pos, $dirLen)); + } + + # version 4 header is 32 bytes (int32u[8]) + if ($dirLen < 32) { + $err = 1; + } else { + SetByteOrder(substr($$dataPt, $pos, 2)) or $err = 1; + # process the DR4 header + my %hdrInfo = ( + DataPt => $dataPt, + DirStart => $pos, + DirLen => 32, + DirName => 'DR4Header', + ); + my $hdrTable = GetTagTable('Image::ExifTool::CanonVRD::DR4Header'); + if ($outfile) { + my $hdr = $et->WriteDirectory(\%hdrInfo, $hdrTable); + substr($$dataPt, $pos, 32) = $hdr if $hdr and length $hdr == 32; + } else { + $et->VerboseDir('DR4Header', undef, 32); + $et->ProcessDirectory(\%hdrInfo, $hdrTable); + } + # number of entries in the DR4 directory + $numEntries = Get32u($dataPt, $pos + 28); + $err = 1 if $dirLen < 36 + 28 * $numEntries; + } + $err and $et->Warn('Invalid DR4 directory'), return $outfile ? undef : 0; + + if ($outfile) { + $newTags = $et->GetNewTagInfoHash($tagTablePtr); + } else { + $et->VerboseDir('DR4', $numEntries, $dirLen); + } + + my $index; + for ($index=0; $index<$numEntries; ++$index) { + my ($val, @flg, $i); + my $entry = $pos + 36 + 28 * $index; + last if $entry + 28 > $dirEnd; + my $tag = Get32u($dataPt, $entry); + my $fmt = Get32u($dataPt, $entry + 4); + $flg[0] = Get32u($dataPt, $entry + 8); + $flg[1] = Get32u($dataPt, $entry + 12); + $flg[2] = Get32u($dataPt, $entry + 16); + my $off = Get32u($dataPt, $entry + 20) + $pos; + my $len = Get32u($dataPt, $entry + 24); + next if $off + $len >= $dirEnd; + my $format = $vrdFormat{$fmt}; + if (not $format) { + $val = unpack 'H*', substr($$dataPt, $off, $len); + $format = 'undef'; + } elsif ($format eq 'double' and $len == 8) { + # avoid teeny weeny values + $val = ReadValue($dataPt, $off, $format, undef, $len); + $val = 0 if abs($val) < 1e-100; + } + if ($outfile) { + # write (binary data) subdirectory if it exists + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($tagInfo and $$tagInfo{SubDirectory}) { + my %subdirInfo = ( + DataPt => $dataPt, + DirStart => $off, + DirLen => $len, + DirName => $$tagInfo{Name}, + ); + my $subTablePtr = GetTagTable($$tagInfo{SubDirectory}{TagTable}); + my $saveChanged = $$et{CHANGED}; + my $dat = $et->WriteDirectory(\%subdirInfo, $subTablePtr); + if (defined $dat and length($dat) == $len) { + substr($$dataPt, $off, $len) = $dat; + } else { + $$et{CHANGED} = $saveChanged; # didn't change anything after all + } + } else { + # loop through main tag and flags (don't yet consider flag 2) + for ($i=-1; $i<2; ++$i) { + $tagInfo = $$newTags{$i>=0 ? sprintf('0x%x.%d',$tag,$i) : $tag}; + next unless $tagInfo; + if ($i >= 0) { + $off = $entry + 8 + 4 * $i; + $format = 'int32u'; + $len = 4; + undef $val; + } + $val = ReadValue($dataPt, $off, $format, undef, $len) unless defined $val; + my $nvHash; + my $newVal = $et->GetNewValue($tagInfo, \$nvHash); + if ($et->IsOverwriting($nvHash, $val) and defined $newVal) { + my $count = int($len / Image::ExifTool::FormatSize($format)); + my $rtnVal = WriteValue($newVal, $format, $count, $dataPt, $off); + if (defined $rtnVal) { + $et->VerboseValue("- CanonVRD:$$tagInfo{Name}", $val); + $et->VerboseValue("+ CanonVRD:$$tagInfo{Name}", $newVal); + ++$$et{CHANGED}; + } + } + } + } + next; + } + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $off, + Size => $len, + Index => $index, + Format => $format, + # $flg[0] is on/off flag + # $flg[1] "is default" flag? + # $flg[2] changed to 0 when some unsharp mask settings were changed + Extra => ", fmt=$fmt flags=" . join(',', @flg), + ); + foreach $i (0..2) { + my $flagID = sprintf('0x%x.%d', $tag, $i); + $et->HandleTag($tagTablePtr, $flagID, $flg[$i]) if $$tagTablePtr{$flagID}; + } + } + return 1 unless $isWriting; + return substr($$dataPt, $pos, $dirLen) unless $raf; + return 1 if Write($outfile, substr($$dataPt, $pos, $dirLen)); + return -1; +} + +#------------------------------------------------------------------------------ +# Read/write Canon VRD file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 if this was a Canon VRD file, 0 otherwise, -1 on write error +sub ProcessVRD($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + my $num = $raf->Read($buff, 0x1c); + + # initialize write directories if necessary + $et->InitWriteDirs(\%vrdMap, 'XMP') if $$dirInfo{OutFile}; + + if (not $num and $$dirInfo{OutFile}) { + # create new VRD file from scratch + my $newVal = $et->GetNewValue('CanonVRD'); + if ($newVal) { + $et->VPrint(0, " Writing CanonVRD as a block\n"); + Write($$dirInfo{OutFile}, $newVal) or return -1; + $$et{DidCanonVRD} = 1; + ++$$et{CHANGED}; + } else { + # allow VRD to be created from individual tags + if ($$et{ADD_DIRS}{CanonVRD}) { + my $newVal = ''; + if (ProcessCanonVRD($et, { OutFile => \$newVal }) > 0) { + Write($$dirInfo{OutFile}, $newVal) or return -1; + ++$$et{CHANGED}; + return 1; + } + } + $et->Error('No CanonVRD information to write'); + } + } else { + $num == 0x1c or return 0; + $buff =~ /^CANON OPTIONAL DATA\0/ or return 0; + $et->SetFileType(); + $$dirInfo{DirName} = 'CanonVRD'; # set directory name for verbose output + my $result = ProcessCanonVRD($et, $dirInfo); + return $result if $result < 0; + $result or $et->Warn('Format error in VRD file'); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Write VRD data record as a block +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: VRD data block (may be empty if no VRD data) +# Notes: Increments ExifTool CHANGED flag if changed +sub WriteCanonVRD($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access + my $nvHash = $et->GetNewValueHash($Image::ExifTool::Extra{CanonVRD}); + my $val = $et->GetNewValue($nvHash); + $val = '' unless defined $val; + return undef unless $et->IsOverwriting($nvHash, $val); + ++$$et{CHANGED}; + return $val; +} + +#------------------------------------------------------------------------------ +# Write DR4-type CanonVRD edit record +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: VRD data block (may be empty if deleted, of undef on error) +sub WriteCanonDR4($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access + my $nvHash = $et->GetNewValueHash($Image::ExifTool::Extra{CanonDR4}); + my $val = $et->GetNewValue($nvHash); + if (defined $val) { + return undef unless $et->IsOverwriting($nvHash, $val); + $et->VPrint(0, " Writing CanonDR4 as a block\n"); + ++$$et{CHANGED}; + return WrapDR4($val); + } + my $buff = ''; + $$dirInfo{OutFile} = \$buff; + return $buff if ProcessCanonVRD($et, $dirInfo, $tagTablePtr) > 0; + return undef; +} + +#------------------------------------------------------------------------------ +# Read/write CanonVRD information (from VRD file or VRD trailer) +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 not valid VRD, or -1 error writing +# - updates DataPos to point to start of CanonVRD information +# - updates DirLen to existing trailer length +sub ProcessCanonVRD($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $raf = $$dirInfo{RAF}; + my $offset = $$dirInfo{Offset} || 0; + my $outfile = $$dirInfo{OutFile}; + my $dataPt = $$dirInfo{DataPt}; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my ($buff, $created, $err, $blockLen, $blockType, %didDir, $fromFile); +# +# The CanonVRD trailer has a 0x1c-byte header and a 0x40-byte footer, +# each beginning with "CANON OPTIONAL DATA\0" and containing an int32u +# giving the size of the contained data (at byte 0x18 and 0x14 respectively) +# + if ($raf) { + $fromFile = 1; + } else { + unless ($dataPt) { + return 1 unless $outfile; + # create blank VRD data from scratch + my $blank = $blankHeader . $blankFooter; + $dataPt = \$blank; + $verbose and print $out " Creating CanonVRD trailer\n"; + $created = 1; + } + $raf = new File::RandomAccess($dataPt); + } + # read and validate the footer + $raf->Seek(-0x40-$offset, 2) or return 0; + $raf->Read($buff, 0x40) == 0x40 or return 0; + $buff =~ /^CANON OPTIONAL DATA\0(.{4})/s or return 0; + my $dirLen = unpack('N', $1) + 0x5c; # size including header+footer + + # read and validate the header + unless ($dirLen < 0x80000000 and + $raf->Seek(-$dirLen, 1) and + $raf->Read($buff, 0x1c) == 0x1c and + $buff =~ /^CANON OPTIONAL DATA\0/ and + $raf->Seek(-0x1c, 1)) + { + $et->Warn('Bad CanonVRD trailer'); + return 0; + } + # set variables returned in dirInfo hash + $$dirInfo{DataPos} = $raf->Tell(); + $$dirInfo{DirLen} = $dirLen; + + if ($outfile and ref $outfile eq 'SCALAR' and not length $$outfile) { + # write directly to outfile to avoid duplicating data in memory + $$outfile = $$dataPt unless $fromFile; + # TRICKY! -- copy to outfile memory buffer and edit in place + # (so we must disable all Write() calls for this case) + $dataPt = $outfile; + } + if ($fromFile or $$dirInfo{DirStart}) { + $dataPt = \$buff unless $dataPt; + # read VRD data into memory if necessary + unless ($raf->Read($$dataPt, $dirLen) == $dirLen) { + $$dataPt = '' if $outfile and $outfile eq $dataPt; + $et->Warn('Error reading CanonVRD data'); + return 0; + } + } + # exit quickly if writing and no CanonVRD tags are being edited + if ($outfile and not exists $$et{EDIT_DIRS}{CanonVRD}) { + print $out "$$et{INDENT} [nothing changed]\n" if $verbose; + return 1 if $outfile eq $dataPt; + return Write($outfile, $$dataPt) ? 1 : -1; + } + + my $vrdType = 'VRD'; + + if ($outfile) { + $verbose and not $created and print $out " Rewriting CanonVRD trailer\n"; + # delete CanonVRD information if specified + my $doDel = $$et{DEL_GROUP}{CanonVRD}; + unless ($doDel) { + $doDel = 1 if $$et{DEL_GROUP}{Trailer} and $$et{FILE_TYPE} ne 'VRD'; + unless ($doDel) { + # also delete if writing as a block (will get added back again later) + if ($$et{NEW_VALUE}{$Image::ExifTool::Extra{CanonVRD}}) { + # delete if this isn't version 4 + $doDel = 1 unless $$dataPt =~ /^.{28}\xff\xff\0\xf7/s; + } + if ($$et{NEW_VALUE}{$Image::ExifTool::Extra{CanonDR4}} and not $doDel) { + # delete if this is version 4 + $doDel = 1 if $$dataPt =~ /^.{28}\xff\xff\0\xf7/s; + } + } + } + if ($doDel) { + if ($$et{FILE_TYPE} eq 'VRD') { + my $newVal = $et->GetNewValue('CanonVRD'); + if ($newVal) { + $verbose and print $out " Writing CanonVRD as a block\n"; + if ($outfile eq $dataPt) { + $$outfile = $newVal; + } else { + Write($outfile, $newVal) or return -1; + } + $$et{DidCanonVRD} = 1; + ++$$et{CHANGED}; + } else { + $et->Error("Can't delete all CanonVRD information from a VRD file"); + } + } else { + $verbose and print $out " Deleting CanonVRD trailer\n"; + $$outfile = '' if $outfile eq $dataPt; + ++$$et{CHANGED}; + } + return 1; + } + # write now and return if CanonVRD was set as a block + my $val = $et->GetNewValue('CanonVRD'); + unless ($val) { + $val = $et->GetNewValue('CanonDR4'); + $vrdType = 'DR4' if $val; + } + if ($val) { + $verbose and print $out " Writing Canon$vrdType as a block\n"; + # must wrap DR4 data with the VRD header/footer and edit record + $val = WrapDR4($val) if $vrdType eq 'DR4'; + if ($outfile eq $dataPt) { + $$outfile = $val; + } else { + Write($outfile, $val) or return -1; + } + $$et{DidCanonVRD} = 1; + ++$$et{CHANGED}; + return 1; + } + } elsif ($verbose or $$et{HTML_DUMP}) { + $et->DumpTrailer($dirInfo) if $$dirInfo{RAF}; + } + + $tagTablePtr = GetTagTable('Image::ExifTool::CanonVRD::Main'); + + # validate VRD trailer and get position and length of edit record + SetByteOrder('MM'); # VRD header/footer is big-endian + my $pos = 0x1c; # start at end of header + + # loop through the VRD blocks + for (;;) { + my $end = $dirLen - 0x40; # end of last VRD block (and start of footer) + if ($pos + 8 > $end) { + last if $pos == $end; + $blockLen = $end; # mark as invalid + } else { + $blockType = Get32u($dataPt, $pos); + $blockLen = Get32u($dataPt, $pos + 4); + } + $vrdType = 'DR4' if $blockType == 0xffff00f7; + $pos += 8; # move to start of block + if ($pos + $blockLen > $end) { + $et->Warn('Possibly corrupt CanonVRD block'); + last; + } + if ($verbose > 1 and not $outfile) { + printf $out " CanonVRD block 0x%.8x ($blockLen bytes at offset 0x%x)\n", + $blockType, $pos + $$dirInfo{DataPos}; + $et->VerboseDump($dataPt, Len => $blockLen, Start => $pos, Addr => $pos + $$dirInfo{DataPos}); + } + my $tagInfo = $$tagTablePtr{$blockType}; + unless ($tagInfo) { + unless ($et->Options('Unknown')) { + $pos += $blockLen; # step to next block + next; + } + my $name = sprintf('CanonVRD_0x%.8x', $blockType); + my $desc = $name; + $desc =~ tr/_/ /; + $tagInfo = { + Name => $name, + Description => $desc, + Binary => 1, + }; + AddTagToTable($tagTablePtr, $blockType, $tagInfo); + } + if ($$tagInfo{SubDirectory}) { + my $subTablePtr = GetTagTable($$tagInfo{SubDirectory}{TagTable}); + my %subdirInfo = ( + DataPt => $dataPt, + DataLen => length $$dataPt, + DataPos => $$dirInfo{DataPos}, + DirStart => $pos, + DirLen => $blockLen, + DirName => $$tagInfo{Name}, + Parent => 'CanonVRD', + OutFile => $outfile, + ); + if ($outfile) { + # set flag indicating we did this directory + $didDir{$$tagInfo{Name}} = 1; + my ($dat, $diff); + if ($$et{NEW_VALUE}{$tagInfo}) { + # write as a block + $et->VPrint(0, "Writing $$tagInfo{Name} as a block\n"); + $dat = $et->GetNewValue($tagInfo); + $dat = '' unless defined $dat; + ++$$et{CHANGED}; + } else { + $dat = $et->WriteDirectory(\%subdirInfo, $subTablePtr); + } + # update data with new directory + if (defined $dat) { + if (length $dat or $$et{FILE_TYPE} !~ /^(CRW|VRD)$/) { + # replace with new block (updating the block length word) + substr($$dataPt, $pos-4, $blockLen+4) = Set32u(length $dat) . $dat; + } else { + # remove block totally (CRW/VRD files only) + substr($$dataPt, $pos-8, $blockLen+8) = ''; + } + # make necessary adjustments if block changes length + if (($diff = length($$dataPt) - $dirLen) != 0) { + $pos += $diff; + $dirLen += $diff; + # update the new VRD length in the header/footer + Set32u($dirLen - 0x5c, $dataPt, 0x18); + Set32u($dirLen - 0x5c, $dataPt, $dirLen - 0x2c); + } + } + } else { + # extract as a block if requested + $et->ProcessDirectory(\%subdirInfo, $subTablePtr); + } + } else { + $et->HandleTag($tagTablePtr, $blockType, substr($$dataPt, $pos, $blockLen)); + } + $pos += $blockLen; # step to next block + } + if ($outfile) { + # create XMP block if necessary (CRW/VRD files only) + if ($$et{ADD_DIRS}{CanonVRD} and not $didDir{XMP}) { + my $subTablePtr = GetTagTable('Image::ExifTool::XMP::Main'); + my $dat = $et->WriteDirectory({ Parent => 'CanonVRD' }, $subTablePtr); + if ($dat) { + my $blockLen = length $dat; + substr($$dataPt, -0x40, 0) = Set32u(0xffff00f6) . Set32u(length $dat) . $dat; + $dirLen = length $$dataPt; + # update the new VRD length in the header/footer + Set32u($dirLen - 0x5c, $dataPt, 0x18); + Set32u($dirLen - 0x5c, $dataPt, $dirLen - 0x2c); + } + } + # write CanonVRD trailer unless it is empty + if (length $$dataPt) { + Write($outfile, $$dataPt) or $err = 1 unless $outfile eq $dataPt; + } else { + $verbose and print $out " Deleting CanonVRD trailer\n"; + } + } elsif ($vrdType eq 'VRD' and (($$et{TAGS_FROM_FILE} and + not $$et{EXCL_TAG_LOOKUP}{canonvrd}) or $$et{REQ_TAG_LOOKUP}{canonvrd})) + { + # extract CanonVRD block if copying tags, or if requested (and not DR4 info) + $et->FoundTag('CanonVRD', $buff); + } + undef $buff; + return $err ? -1 : 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::CanonVRD - Read/write Canon VRD and DR4 information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read and +write VRD and DR4 Recipe Data information as written by the Canon Digital +Photo Professional software. This information is written to VRD and DR4 +files, and as a trailer in JPEG, CRW, CR2 and TIFF images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Bogdan and Gert Kello for decoding some tags. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/CanonVRD Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/CaptureOne.pm b/lib/Image/ExifTool/CaptureOne.pm new file mode 100644 index 0000000..cfd2f43 --- /dev/null +++ b/lib/Image/ExifTool/CaptureOne.pm @@ -0,0 +1,235 @@ +#------------------------------------------------------------------------------ +# File: CaptureOne.pm +# +# Description: Read Capture One EIP and COS files +# +# Revisions: 2009/11/01 - P. Harvey Created +# +# Notes: The EIP format is a ZIP file containing an image (IIQ or TIFF) +# and some settings files (COS). COS files are XML based. +#------------------------------------------------------------------------------ + +package Image::ExifTool::CaptureOne; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::XMP; +use Image::ExifTool::ZIP; + +$VERSION = '1.04'; + +# CaptureOne COS XML tags +# - tags are added dynamically when encountered +# - this table is not listed in tag name docs +%Image::ExifTool::CaptureOne::Main = ( + GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP, + VARS => { NO_ID => 1 }, + ColorCorrections => { ValueConv => '\$val' }, # (long list of floating point numbers) +); + +#------------------------------------------------------------------------------ +# We found an XMP property name/value +# Inputs: 0) attribute list ref, 1) attr hash ref, +# 2) property name ref, 3) property value ref +# Returns: true if value was changed +sub HandleCOSAttrs($$$$) +{ + my ($attrList, $attrs, $prop, $valPt) = @_; + my $changed; + if (not length $$valPt and defined $$attrs{K} and defined $$attrs{V}) { + $$prop = $$attrs{K}; + $$valPt = $$attrs{V}; + # remove these attributes from the list + my @attrs = @$attrList; + @$attrList = ( ); + my $a; + foreach $a (@attrs) { + if ($a eq 'K' or $a eq 'V') { + delete $$attrs{$a}; + } else { + push @$attrList, $a; + } + } + $changed = 1; + } + return $changed; +} + +#------------------------------------------------------------------------------ +# We found a COS property name/value +# Inputs: 0) ExifTool object ref, 1) tag table ref +# 2) reference to array of XMP property names (last is current property) +# 3) property value, 4) attribute hash ref (not used here) +# Returns: 1 if valid tag was found +sub FoundCOS($$$$;$) +{ + my ($et, $tagTablePtr, $props, $val, $attrs) = @_; + + my $tag = $$props[-1]; + unless ($$tagTablePtr{$tag}) { + $et->VPrint(0, " | [adding $tag]\n"); + my $name = ucfirst $tag; + $name =~ tr/-_a-zA-Z0-9//dc; + return 0 unless length $tag; + my %tagInfo = ( Name => $tag ); + # try formatting any tag with "Date" in the name as a date + # (shouldn't affect non-date tags) + if ($name =~ /Date(?![a-z])/) { + $tagInfo{Groups} = { 2 => 'Time' }; + $tagInfo{ValueConv} = 'Image::ExifTool::XMP::ConvertXMPDate($val,1)'; + $tagInfo{PrintConv} = '$self->ConvertDateTime($val)'; + } + AddTagToTable($tagTablePtr, $tag, \%tagInfo); + } + # convert from UTF8 to ExifTool Charset + $val = $et->Decode($val, "UTF8"); + # un-escape XML character entities + $val = Image::ExifTool::XMP::UnescapeXML($val); + $et->HandleTag($tagTablePtr, $tag, $val); + return 0; +} + +#------------------------------------------------------------------------------ +# Extract information from a COS file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid XML file +sub ProcessCOS($$) +{ + my ($et, $dirInfo) = @_; + + # process using XMP module, but override handling of attributes and tags + $$dirInfo{XMPParseOpts} = { + AttrProc => \&HandleCOSAttrs, + FoundProc => \&FoundCOS, + }; + my $tagTablePtr = GetTagTable('Image::ExifTool::CaptureOne::Main'); + my $success = $et->ProcessDirectory($dirInfo, $tagTablePtr); + delete $$dirInfo{XMLParseArgs}; + return $success; +} + +#------------------------------------------------------------------------------ +# Extract information from a CaptureOne EIP file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 +# Notes: Upon entry to this routine, the file type has already been verified +# and the dirInfo hash contains a ZIP element unique to this process proc: +# ZIP - reference to Archive::Zip object for this file +sub ProcessEIP($$) +{ + my ($et, $dirInfo) = @_; + my $zip = $$dirInfo{ZIP}; + my ($file, $buff, $status, $member, %parseFile); + + $et->SetFileType('EIP'); + + # must catch all Archive::Zip warnings + local $SIG{'__WARN__'} = \&Image::ExifTool::ZIP::WarnProc; + # find all manifest files + my @members = $zip->membersMatching('^manifest\d*.xml$'); + # and choose the one with the highest version number (any better ideas?) + while (@members) { + my $m = shift @members; + my $f = $m->fileName(); + next if $file and $file gt $f; + $member = $m; + $file = $f; + } + # get file names from our chosen manifest file + if ($member) { + ($buff, $status) = $zip->contents($member); + if (not $status) { + my $foundImage; + while ($buff =~ m{<(RawPath|SettingsPath)>(.*?)</\1>}sg) { + $file = $2; + next unless $file =~ /\.(cos|iiq|jpe?g|tiff?)$/i; + $parseFile{$file} = 1; # set flag to parse this file + $foundImage = 1 unless $file =~ /\.cos$/i; + } + # ignore manifest unless it contained a valid image + undef %parseFile unless $foundImage; + } + } + # extract meta information from embedded files + my $docNum = 0; + @members = $zip->members(); # get all members + foreach $member (@members) { + # get filename of this ZIP member + $file = $member->fileName(); + next unless defined $file; + $et->VPrint(0, "File: $file\n"); + # set the document number and extract ZIP tags + $$et{DOC_NUM} = ++$docNum; + Image::ExifTool::ZIP::HandleMember($et, $member); + if (%parseFile) { + next unless $parseFile{$file}; + } else { + # reading the manifest didn't work, so look for image files in the + # root directory and .cos files in the CaptureOne directory + next unless $file =~ m{^([^/]+\.(iiq|jpe?g|tiff?)|CaptureOne/.*\.cos)$}i; + } + # extract the contents of the file + # Note: this could use a LOT of memory here for RAW images... + ($buff, $status) = $zip->contents($member); + $status and $et->Warn("Error extracting $file"), next; + if ($file =~ /\.cos$/i) { + # process Capture One Settings files + my %dirInfo = ( + DataPt => \$buff, + DirLen => length $buff, + DataLen => length $buff, + ); + ProcessCOS($et, \%dirInfo); + } else { + # set HtmlDump error if necessary because it doesn't work with embedded files + if ($$et{HTML_DUMP}) { + $$et{HTML_DUMP}{Error} = "Sorry, can't dump images embedded in ZIP files"; + } + # process IIQ, JPEG and TIFF images + $et->ExtractInfo(\$buff, { ReEntry => 1 }); + } + undef $buff; # (free memory now) + } + delete $$et{DOC_NUM}; + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::CaptureOne - Read Capture One EIP and COS files + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from Capture One EIP (Enhanced Image Package) and COS (Capture +One Settings) files. + +=head1 NOTES + +The EIP format is a ZIP file containing an image (IIQ or TIFF) and some +settings files (COS). + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/ZIP Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Casio.pm b/lib/Image/ExifTool/Casio.pm new file mode 100644 index 0000000..73f6660 --- /dev/null +++ b/lib/Image/ExifTool/Casio.pm @@ -0,0 +1,2060 @@ +#------------------------------------------------------------------------------ +# File: Casio.pm +# +# Description: Casio EXIF maker notes tags +# +# Revisions: 12/09/2003 - P. Harvey Created +# 09/10/2004 - P. Harvey Added MakerNote2 (thanks to Joachim Loehr) +# +# References: 1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html +# 2) Joachim Loehr private communication +# 3) http://homepage3.nifty.com/kamisaka/makernote/makernote_casio.htm +# 4) http://gvsoft.homedns.org/exif/makernote-casio-type1.html +# 5) Robert Chi private communication (EX-F1) +# 6) https://exiftool.org/forum/index.php/topic,3701.html +# JD) Jens Duttke private communication +#------------------------------------------------------------------------------ + +package Image::ExifTool::Casio; + +use strict; +use vars qw($VERSION); +use Image::ExifTool::Exif; + +$VERSION = '1.38'; + +# older Casio maker notes (ref 1) +%Image::ExifTool::Casio::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x0001 => { + Name => 'RecordingMode' , + Writable => 'int16u', + PrintConv => { + 1 => 'Single Shutter', + 2 => 'Panorama', + 3 => 'Night Scene', + 4 => 'Portrait', + 5 => 'Landscape', + 7 => 'Panorama', #4 + 10 => 'Night Scene', #4 + 15 => 'Portrait', #4 + 16 => 'Landscape', #4 + }, + }, + 0x0002 => { + Name => 'Quality', + Writable => 'int16u', + PrintConv => { 1 => 'Economy', 2 => 'Normal', 3 => 'Fine' }, + }, + 0x0003 => { + Name => 'FocusMode', + Writable => 'int16u', + PrintConv => { + 2 => 'Macro', + 3 => 'Auto', + 4 => 'Manual', + 5 => 'Infinity', + 7 => 'Spot AF', #4 + }, + }, + 0x0004 => [ + { + Name => 'FlashMode', + Condition => '$self->{Model} =~ /^QV-(3500EX|8000SX)/', + Writable => 'int16u', + PrintConv => { + 1 => 'Auto', + 2 => 'On', + 3 => 'Off', + 4 => 'Off', #4 + 5 => 'Red-eye Reduction', #4 + }, + }, + { + Name => 'FlashMode', + Writable => 'int16u', + PrintConv => { + 1 => 'Auto', + 2 => 'On', + 3 => 'Off', + 4 => 'Red-eye Reduction', + }, + }, + ], + 0x0005 => { + Name => 'FlashIntensity', + Writable => 'int16u', + PrintConv => { + 11 => 'Weak', + 12 => 'Low', #4 + 13 => 'Normal', + 14 => 'High', #4 + 15 => 'Strong', + }, + }, + 0x0006 => { + Name => 'ObjectDistance', + Writable => 'int32u', + ValueConv => '$val / 1000', #4 + ValueConvInv => '$val * 1000', + PrintConv => '"$val m"', + PrintConvInv => '$val=~s/\s*m$//;$val', + }, + 0x0007 => { + Name => 'WhiteBalance', + Writable => 'int16u', + PrintConv => { + 1 => 'Auto', + 2 => 'Tungsten', + 3 => 'Daylight', + 4 => 'Fluorescent', + 5 => 'Shade', + 129 => 'Manual', + }, + }, + # 0x0009 Bulb? (ref unknown) + 0x000a => { + Name => 'DigitalZoom', + Writable => 'int32u', + PrintHex => 1, + PrintConv => { + 0x10000 => 'Off', + 0x10001 => '2x', + 0x19999 => '1.6x', #4 + 0x20000 => '2x', #4 + 0x33333 => '3.2x', #4 + 0x40000 => '4x', #4 + }, + }, + 0x000b => { + Name => 'Sharpness', + Writable => 'int16u', + PrintConv => { + 0 => 'Normal', + 1 => 'Soft', + 2 => 'Hard', + 16 => 'Normal', #4 + 17 => '+1', #4 + 18 => '-1', #4 + }, + }, + 0x000c => { + Name => 'Contrast', + Writable => 'int16u', + PrintConv => { + 0 => 'Normal', + 1 => 'Low', + 2 => 'High', + 16 => 'Normal', #4 + 17 => '+1', #4 + 18 => '-1', #4 + }, + }, + 0x000d => { + Name => 'Saturation', + Writable => 'int16u', + PrintConv => { + 0 => 'Normal', + 1 => 'Low', + 2 => 'High', + 16 => 'Normal', #4 + 17 => '+1', #4 + 18 => '-1', #4 + }, + }, + 0x0014 => { + Name => 'ISO', + Writable => 'int16u', + Priority => 0, + }, + 0x0015 => { #JD (Similar to Type2 0x2001) + Name => 'FirmwareDate', + Writable => 'string', + Format => 'undef', # the 'string' contains nulls + Count => 18, + PrintConv => q{ + $_ = $val; + if (/^(\d{2})(\d{2})\0\0(\d{2})(\d{2})\0\0(\d{2})(.{2})\0{2}$/) { + my $yr = $1 + ($1 < 70 ? 2000 : 1900); + my $sec = $6; + $val = "$yr:$2:$3 $4:$5"; + $val .= ":$sec" if $sec=~/^\d{2}$/; + return $val; + } + tr/\0/./; s/\.+$//; + return "Unknown ($_)"; + }, + PrintConvInv => q{ + $_ = $val; + if (/^(19|20)(\d{2}):(\d{2}):(\d{2}) (\d{2}):(\d{2})$/) { + return "$2$3\0\0$4$5\0\0$6\0\0\0\0"; + } elsif (/^Unknown\s*\((.*)\)$/i) { + $_ = $1; tr/./\0/; + return $_; + } else { + return undef; + } + }, + }, + 0x0016 => { #4 + Name => 'Enhancement', + Writable => 'int16u', + PrintConv => { + 1 => 'Off', + 2 => 'Red', + 3 => 'Green', + 4 => 'Blue', + 5 => 'Flesh Tones', + }, + }, + 0x0017 => { #4 + Name => 'ColorFilter', + Writable => 'int16u', + PrintConv => { + 1 => 'Off', + 2 => 'Black & White', + 3 => 'Sepia', + 4 => 'Red', + 5 => 'Green', + 6 => 'Blue', + 7 => 'Yellow', + 8 => 'Pink', + 9 => 'Purple', + }, + }, + 0x0018 => { #4 + Name => 'AFPoint', + Writable => 'int16u', + Notes => 'may not be valid for all models', #JD + PrintConv => { + 1 => 'Center', + 2 => 'Upper Left', + 3 => 'Upper Right', + 4 => 'Near Left/Right of Center', + 5 => 'Far Left/Right of Center', + 6 => 'Far Left/Right of Center/Bottom', + 7 => 'Top Near-left', + 8 => 'Near Upper/Left', + 9 => 'Top Near-right', + 10 => 'Top Left', + 11 => 'Top Center', + 12 => 'Top Right', + 13 => 'Center Left', + 14 => 'Center Right', + 15 => 'Bottom Left', + 16 => 'Bottom Center', + 17 => 'Bottom Right', + }, + }, + 0x0019 => { #4 + Name => 'FlashIntensity', + Writable => 'int16u', + PrintConv => { + 1 => 'Normal', + 2 => 'Weak', + 3 => 'Strong', + }, + }, + 0x0e00 => { + Name => 'PrintIM', + Description => 'Print Image Matching', + # crazy I know, but the offset for this value is entry-based + # (QV-2100, QV-2900UX, QV-3500EX and QV-4000) even though the + # offsets for other values isn't + EntryBased => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::PrintIM::Main', + }, + }, +); + +# ref 2: +%Image::ExifTool::Casio::Type2 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x0002 => { + Name => 'PreviewImageSize', + Groups => { 2 => 'Image' }, + Writable => 'int16u', + Count => 2, + PrintConv => '$val =~ tr/ /x/; $val', + PrintConvInv => '$val =~ tr/x/ /; $val', + }, + 0x0003 => { + Name => 'PreviewImageLength', + Groups => { 2 => 'Image' }, + OffsetPair => 0x0004, # point to associated offset + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + 0x0004 => { + Name => 'PreviewImageStart', + Groups => { 2 => 'Image' }, + Flags => 'IsOffset', + OffsetPair => 0x0003, # point to associated byte count + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + 0x0008 => { + Name => 'QualityMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Economy', + 1 => 'Normal', + 2 => 'Fine', + }, + }, + 0x0009 => { + Name => 'CasioImageSize', + Groups => { 2 => 'Image' }, + Writable => 'int16u', + PrintConv => { + 0 => '640x480', + 4 => '1600x1200', + 5 => '2048x1536', + 20 => '2288x1712', + 21 => '2592x1944', + 22 => '2304x1728', + 36 => '3008x2008', + }, + }, + 0x000d => { + Name => 'FocusMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Normal', + 1 => 'Macro', + }, + }, + 0x0014 => { + Name => 'ISO', + Writable => 'int16u', + Priority => 0, + PrintConv => { + 3 => 50, + 4 => 64, + 6 => 100, + 9 => 200, + }, + }, + 0x0019 => { + Name => 'WhiteBalance', + Writable => 'int16u', + PrintConv => { + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Shade', + 3 => 'Tungsten', + 4 => 'Fluorescent', + 5 => 'Manual', + }, + }, + 0x001d => { + Name => 'FocalLength', + Writable => 'rational64u', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + 0x001f => { + Name => 'Saturation', + Writable => 'int16u', + PrintConv => { + 0 => 'Low', + 1 => 'Normal', + 2 => 'High', + }, + }, + 0x0020 => { + Name => 'Contrast', + Writable => 'int16u', + PrintConv => { + 0 => 'Low', + 1 => 'Normal', + 2 => 'High', + }, + }, + 0x0021 => { + Name => 'Sharpness', + Writable => 'int16u', + PrintConv => { + 0 => 'Soft', + 1 => 'Normal', + 2 => 'Hard', + }, + }, + 0x0e00 => { + Name => 'PrintIM', + Description => 'Print Image Matching', + Writable => 0, + SubDirectory => { + TagTable => 'Image::ExifTool::PrintIM::Main', + }, + }, + 0x2000 => { + # this image data is also referenced by tags 3 and 4 + # (nasty that they double-reference the image!) + %Image::ExifTool::previewImageTagInfo, + Groups => { 2 => 'Preview' }, + }, + 0x2001 => { #PH + # I downloaded images from 12 different EX-Z50 cameras, and they showed + # only 3 distinct dates here (2004:08:31 18:55, 2004:09:13 14:14, and + # 2004:11:26 17:07), so I'm guessing this is a firmware version date - PH + Name => 'FirmwareDate', + Writable => 'string', + Format => 'undef', # the 'string' contains nulls + Count => 18, + PrintConv => q{ + $_ = $val; + if (/^(\d{2})(\d{2})\0\0(\d{2})(\d{2})\0\0(\d{2})\0{4}$/) { + my $yr = $1 + ($1 < 70 ? 2000 : 1900); + return "$yr:$2:$3 $4:$5"; + } + tr/\0/./; s/\.+$//; + return "Unknown ($_)"; + }, + PrintConvInv => q{ + $_ = $val; + if (/^(19|20)(\d{2}):(\d{2}):(\d{2}) (\d{2}):(\d{2})$/) { + return "$2$3\0\0$4$5\0\0$6\0\0\0\0"; + } elsif (/^Unknown\s*\((.*)\)$/i) { + $_ = $1; tr/./\0/; + return $_; + } else { + return undef; + } + }, + }, + 0x2011 => { + Name => 'WhiteBalanceBias', + Writable => 'int16u', + Count => 2, + }, + 0x2012 => { + Name => 'WhiteBalance', + Writable => 'int16u', + PrintConv => { + 0 => 'Manual', + 1 => 'Daylight', #3 + 2 => 'Cloudy', #PH (EX-ZR20, NC) + 3 => 'Shade', #3 + 4 => 'Flash?', + 6 => 'Fluorescent', #3 + 9 => 'Tungsten?', #PH (EX-Z77) + 10 => 'Tungsten', #3 + 12 => 'Flash', + }, + }, + 0x2021 => { #JD (guess) + Name => 'AFPointPosition', + Writable => 'int16u', + Count => 4, + PrintConv => q{ + my @v = split ' ', $val; + return 'n/a' if $v[0] == 65535 or not $v[1] or not $v[3]; + sprintf "%.2g %.2g", $v[0]/$v[1], $v[2]/$v[3]; + }, + }, + 0x2022 => { + Name => 'ObjectDistance', + Writable => 'int32u', + ValueConv => '$val >= 0x20000000 ? "inf" : $val / 1000', + ValueConvInv => '$val eq "inf" ? 0x20000000 : $val * 1000', + PrintConv => '$val eq "inf" ? $val : "$val m"', + PrintConvInv => '$val=~s/\s*m$//;$val', + }, + # 0x2023 looks interesting (values 0,1,2,3,5 in samples) - PH + # - 1 for makeup mode shots (portrait?) (EX-Z450) + 0x2034 => { + Name => 'FlashDistance', + Writable => 'int16u', + }, + # 0x203e - normally 62000, but 62001 for anti-shake mode - PH + 0x2076 => { #PH (EX-Z450) + # ("Enhancement" was taken already, so call this "SpecialEffect" for lack of a better name) + Name => 'SpecialEffectMode', + Writable => 'int8u', + Count => 3, + PrintConv => { + '0 0 0' => 'Off', + '1 0 0' => 'Makeup', + '2 0 0' => 'Mist Removal', + '3 0 0' => 'Vivid Landscape', + # have also seen '1 1 1', '2 2 4', '4 3 3', '4 4 4' + # '0 0 14' and '0 0 42' - premium auto night shot (EX-Z2300) + # and '0 0 2' for Art HDR + }, + }, + 0x2089 => [ #PH + { + Name => 'FaceInfo1', + Condition => '$$valPt =~ /^(\0\0|.\x02\x80\x01\xe0)/s', # (EX-H5) + SubDirectory => { + TagTable => 'Image::ExifTool::Casio::FaceInfo1', + ByteOrder => 'BigEndian', + }, + },{ + Name => 'FaceInfo2', + Condition => '$$valPt =~ /^\x02\x01/', # (EX-H20G,EX-ZR100) + SubDirectory => { + TagTable => 'Image::ExifTool::Casio::FaceInfo2', + ByteOrder => 'LittleEndian', + }, + },{ + Name => 'FaceInfoUnknown', + Unknown => 1, + }, + ], + # 0x208a - also some sort of face detection information - PH + 0x211c => { #PH + Name => 'FacesDetected', + Format => 'int8u', + }, + 0x3000 => { + Name => 'RecordMode', + Writable => 'int16u', + PrintConv => { + 2 => 'Program AE', #3 + 3 => 'Shutter Priority', #3 + 4 => 'Aperture Priority', #3 + 5 => 'Manual', #3 + 6 => 'Best Shot', #3 + 17 => 'Movie', #PH (UHQ?) + 19 => 'Movie (19)', #PH (HQ?, EX-P505) + 20 => 'YouTube Movie', #PH + '2 0' => 'Program AE', #PH (NC) + '3 0' => 'Shutter Priority', #PH (NC) + '4 0' => 'Aperture Priority', #PH (NC) + '5 0' => 'Manual', #PH (NC) + '6 0' => 'Best Shot', #PH (NC) + }, + }, + 0x3001 => { #3 + Name => 'ReleaseMode', + Writable => 'int16u', + PrintConv => { + 1 => 'Normal', + 3 => 'AE Bracketing', + 11 => 'WB Bracketing', + 13 => 'Contrast Bracketing', #(not sure about translation - PH) + 19 => 'High Speed Burst', #PH (EX-FH25, 40fps) + # have also seen: 2, 7(common), 14, 18 - PH + }, + }, + 0x3002 => { + Name => 'Quality', + Writable => 'int16u', + PrintConv => { + 1 => 'Economy', + 2 => 'Normal', + 3 => 'Fine', + }, + }, + 0x3003 => { + Name => 'FocusMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Manual', #(guess at translation) + 1 => 'Focus Lock', #(guess at translation) + 2 => 'Macro', #3 + 3 => 'Single-Area Auto Focus', + 5 => 'Infinity', #PH + 6 => 'Multi-Area Auto Focus', + 8 => 'Super Macro', #PH (EX-Z2300) + }, + }, + 0x3006 => { + Name => 'HometownCity', + Writable => 'string', + }, + # unfortunately the BestShotMode numbers are model-dependent - PH + #http://search.casio-intl.com/search?q=BEST+SHOT+sets+up+the+camera+CASIO+EX+ZR100+BEST+SHOT&btnG=Search&output=xml_no_dtd&oe=UTF-8&ie=UTF-8&site=casio-intl_com&client=search_casio-intl_com&proxystylesheet=search_casio-intl_com + # NOTE: BestShotMode is not used unless RecordMode is "Best Shot" + 0x3007 => [{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-FC100"', + Notes => 'EX-FC100', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Portrait', + 3 => 'Scenery', + 4 => 'Portrait with Scenery', + 5 => 'Children', + 6 => 'Sports', + 7 => 'Pet', + 8 => 'Flower', + 9 => 'Natural Green', + 10 => 'Autumn Leaves', + 11 => 'Sundown', + 12 => 'High Speed Night Scene', + 13 => 'Night Scene Portrait', + 14 => 'Fireworks', + 15 => 'High Speed Anti Shake', + 16 => 'Multi-motion Image', + 17 => 'High Speed Best Selection', + 18 => 'Move Out CS', + 19 => 'Move In CS', + 20 => 'Pre-record Movie', + 21 => 'For YouTube', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-FC150"', + Notes => 'EX-FC150', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Expression CS', + 3 => 'Baby CS', + 4 => 'Child CS', + 5 => 'Pet CS', + 6 => 'Sports CS', + 7 => 'Child High Speed Movie', + 8 => 'Pet High Speed Movie', + 9 => 'Sports High Speed Movie', + 10 => 'Lag Correction', + 11 => 'High Speed Lighting', + 12 => 'High Speed Night Scene', + 13 => 'High Speed Night Scene and Portrait', + 14 => 'High Speed Anti Shake', + 15 => 'High Speed Best Selection', + 16 => 'Portrait', + 17 => 'Scenery', + 18 => 'Portrait With Scenery', + 19 => 'Flower', + 20 => 'Natural Green', + 21 => 'Autumn Leaves', + 22 => 'Sundown', + 23 => 'Fireworks', + 24 => 'Multi-motion Image', + 25 => 'Move Out CS', + 26 => 'Move In CS', + 27 => 'Pre-record Movie', + 28 => 'For YouTube', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-FC200S"', + Notes => 'EX-FC200S', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Off', + 1 => 'Slow Motion Swing (behind)', + 2 => 'Slow Motion Swing (front)', + 3 => 'Self Slow Motion (behind)', + 4 => 'Self Slow Motion (front)', + 5 => 'Swing Burst', + 6 => 'HDR', + 7 => 'HDR Art', + 8 => 'High Speed Night Scene', + 9 => 'High Speed Night Scene and Portrait', + 10 => 'High Speed Anti Shake', + 11 => 'Multi SR Zoom', + 12 => 'Blurred Background', + 13 => 'Wide Shot', + 14 => 'Slide Panorama', + 15 => 'High Speed Best Selection', + 16 => 'Lag Correction', + 17 => 'High Speed CS', + 18 => 'Child CS', + 19 => 'Pet CS', + 20 => 'Sports CS', + 21 => 'Child High Speed Movie', + 22 => 'Pet High Speed Movie', + 23 => 'Sports High Speed Movie', + 24 => 'Portrait', + 25 => 'Scenery', + 26 => 'Portrait with Scenery', + 27 => 'Children', + 28 => 'Sports', + 29 => 'Candlelight Portrait', + 30 => 'Party', + 31 => 'Pet', + 32 => 'Flower', + 33 => 'Natural Green', + 34 => 'Autumn Leaves', + 35 => 'Soft Flowing Water', + 36 => 'Splashing Water', + 37 => 'Sundown', + 38 => 'Fireworks', + 39 => 'Food', + 40 => 'Text', + 41 => 'Collection', + 42 => 'Auction', + 43 => 'Pre-record Movie', + 44 => 'For YouTube', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-FH100"', + Notes => 'EX-FH100', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Off', + 1 => 'Expression CS', + 2 => 'Baby CS', + 3 => 'Child CS', + 4 => 'Pet CS', + 5 => 'Sports CS', + 6 => 'Child High Speed Movie', + 7 => 'Pet High Speed Movie', + 8 => 'Sports High Speed Movie', + 9 => 'Lag Correction', + 10 => 'High Speed Lighting', + 11 => 'High Speed Night Scene', + 12 => 'High Speed Night Scene and Portrait', + 13 => 'High Speed Anti Shake', + 14 => 'High Speed Best Selection', + 15 => 'Portrait', + 16 => 'Scenery', + 17 => 'Portrait With Scenery', + 18 => 'Flower', + 19 => 'Natural Green', + 20 => 'Autumn Leaves', + 21 => 'Sundown', + 22 => 'Fireworks', + 23 => 'Multi-motion Image', + 24 => 'Move Out CS', + 25 => 'Move In CS', + 26 => 'Pre-record Movie', + 27 => 'For YouTube', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-G1"', + Notes => 'EX-G1', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Auto Best Shot', + 3 => 'Dynamic Photo', + 4 => 'Interval Snapshot', + 5 => 'Interval Movie', + 6 => 'Portrait', + 7 => 'Scenery', + 8 => 'Portrait with Scenery', + 9 => 'Underwater', + 10 => 'Beach', + 11 => 'Snow', + 12 => 'Children', + 13 => 'Sports', + 14 => 'Pet', + 15 => 'Flower', + 16 => 'Sundown', + 17 => 'Night Scene', + 18 => 'Night Scene Portrait', + 19 => 'Fireworks', + 20 => 'Food', + 21 => 'For eBay', + 22 => 'Multi-motion Image', + 23 => 'Pre-record Movie', + 24 => 'For YouTube', + 25 => 'Voice Recording', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-S10"', + Notes => 'EX-S10', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Portrait', + 3 => 'Scenery', + 4 => 'Portrait with Scenery', + 5 => 'Self-portrait (1 person)', + 6 => 'Self-portrait (2 people)', + 7 => 'Children', + 8 => 'Sports', + 9 => 'Candlelight Portrait', + 10 => 'Party', + 11 => 'Pet', + 12 => 'Flower', + 13 => 'Natural Green', + 14 => 'Autumn Leaves', + 15 => 'Soft Flowing Water', + 16 => 'Splashing Water', + 17 => 'Sundown', + 18 => 'Night Scene', + 19 => 'Night Scene Portrait', + 20 => 'Fireworks', + 21 => 'Food', + 22 => 'Text', + 23 => 'Collection', + 24 => 'Auction', + 25 => 'Backlight', + 26 => 'Anti Shake', + 27 => 'High Sensitivity', + 28 => 'Underwater', + 29 => 'Monochrome', + 30 => 'Retro', + 31 => 'Business Cards', + 32 => 'White Board', + 33 => 'Silent', + 34 => 'Pre-record Movie', + 35 => 'For YouTube', + 36 => 'Voice Recording', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-S880"', + Notes => 'EX-S880', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Portrait', + 3 => 'Scenery', + 4 => 'Portrait with Scenery', + 5 => 'Children', + 6 => 'Sports', + 7 => 'Candlelight Portrait', + 8 => 'Party', + 9 => 'Pet', + 10 => 'Flower', + 11 => 'Natural Green', + 12 => 'Autumn Leaves', + 13 => 'Soft Flowing Water', # (wrong in documentation) + 14 => 'Splashing Water', + 15 => 'Sundown', + 16 => 'Night Scene', + 17 => 'Night Scene Portrait', + 18 => 'Fireworks', + 19 => 'Food', + 20 => 'Text', + 21 => 'Collection', + 22 => 'Auction', + 23 => 'Backlight', + 24 => 'Anti Shake', + 25 => 'High Sensitivity', + 26 => 'Monochrome', + 27 => 'Retro', + 28 => 'Twilight', + 29 => 'Layout (2 images)', + 30 => 'Layout (3 images)', + 31 => 'Auto Framing', + 32 => 'Old Photo', + 33 => 'Business Cards', + 34 => 'White Board', + 35 => 'Silent', + 36 => 'Short Movie', + 37 => 'Past Movie', + 38 => 'For YouTube', + 39 => 'Voice Recording', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-Z16"', + Notes => 'EX-Z16', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Portrait', + 3 => 'Scenery', + 4 => 'Portrait with Scenery', + 5 => 'Children', + 6 => 'Sports', + 7 => 'Candlelight Portrait', + 8 => 'Party', + 9 => 'Pet', + 10 => 'Flower', + 11 => 'Soft Flowing Water', + 12 => 'Sundown', + 13 => 'Night Scene', + 14 => 'Night Scene Portrait', + 15 => 'Fireworks', + 16 => 'Food', + 17 => 'Text', + 18 => 'For eBay', + 19 => 'Backlight', + 20 => 'Anti Shake', + 21 => 'High Sensitivity', + 22 => 'For YouTube', + 23 => 'Voice Recording', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-Z9"', + Notes => 'EX-Z9', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Movie', + 3 => 'Portrait', + 4 => 'Scenery', + 5 => 'Children', + 6 => 'Sports', + 7 => 'Candlelight Portrait', + 8 => 'Party', + 9 => 'Pet', + 10 => 'Flower', + 11 => 'Soft Flowing Water', + 12 => 'Sundown', + 13 => 'Night Scene', + 14 => 'Night Scene Portrait', + 15 => 'Fireworks', + 16 => 'Food', + 17 => 'Text', + 18 => 'Auction', + 19 => 'Backlight', + 20 => 'Anti Shake', + 21 => 'High Sensitivity', + 22 => 'For YouTube', + 23 => 'Voice Recording', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-Z80"', + Notes => 'EX-Z80', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Portrait', + 3 => 'Scenery', + 4 => 'Portrait with Scenery', + 5 => 'Pet', + 6 => 'Self-portrait (1 person)', + 7 => 'Self-portrait (2 people)', + 8 => 'Flower', + 9 => 'Food', + 10 => 'Fashion Accessories', + 11 => 'Magazine', + 12 => 'Monochrome', + 13 => 'Retro', + 14 => 'Cross Filter', + 15 => 'Pastel', + 16 => 'Night Scene', + 17 => 'Night Scene Portrait', + 18 => 'Party', + 19 => 'Sports', + 20 => 'Children', + 21 => 'Sundown', + 22 => 'Fireworks', + 23 => 'Underwater', + 24 => 'Backlight', + 25 => 'High Sensitivity', + 26 => 'Auction', + 27 => 'White Board', + 28 => 'Pre-record Movie', + 29 => 'For YouTube', + 30 => 'Voice Recording', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} =~ /^EX-Z(100|200)$/', + Notes => 'EX-Z100 and EX-Z200', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Auto Best Shot', + 3 => 'Portrait', + 4 => 'Scenery', + 5 => 'Portrait with Scenery', + 6 => 'Self-portrait (1 person)', + 7 => 'Self-portrait (2 people)', + 8 => 'Children', + 9 => 'Sports', + 10 => 'Candlelight Portrait', + 11 => 'Party', + 12 => 'Pet', + 13 => 'Flower', + 14 => 'Natural Green', + 15 => 'Autumn Leaves', + 16 => 'Soft Flowing Water', + 17 => 'Splashing Water', + 18 => 'Sundown', + 19 => 'Night Scene', + 20 => 'Night Scene Portrait', + 21 => 'Fireworks', + 22 => 'Food', + 23 => 'Text', + 24 => 'Collection', + 25 => 'Auction', + 26 => 'Backlight', + 27 => 'Anti Shake', + 28 => 'High Sensitivity', + 29 => 'Underwater', + 30 => 'Monochrome', + 31 => 'Retro', + 32 => 'Twilight', + 33 => 'ID Photo', + 34 => 'Business Cards', + 35 => 'White Board', + 36 => 'Silent', + 37 => 'Pre-record Movie', + 38 => 'For YouTube', + 39 => 'Voice Recording', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + # (Movies have different BestShot numbers for this camera) + Condition => '$$self{Model} eq "EX-Z750" and $$self{FILE_TYPE} eq "JPEG"', + Notes => 'EX-Z750 JPEG images', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Portrait', + 2 => 'Scenery', + 3 => 'Portrait with Scenery', + 4 => 'Children', + 5 => 'Sports', + 6 => 'Candlelight Portrait', + 7 => 'Party', + 8 => 'Pet', + 9 => 'Flower', + 10 => 'Natural Green', + 11 => 'Soft Flowing Water', + 12 => 'Splashing Water', + 13 => 'Sundown', + 14 => 'Night Scene', + 15 => 'Night Scene Portrait', + 16 => 'Fireworks', + 17 => 'Food', + 18 => 'Text', + 19 => 'Collection', + 20 => 'Backlight', + 21 => 'Anti Shake', + 22 => 'Pastel', + 23 => 'Illustration', + 24 => 'Cross Filter', + 25 => 'Monochrome', + 26 => 'Retro', + 27 => 'Twilight', + 28 => 'Old Photo', + 29 => 'ID Photo', + 30 => 'Business Cards', + 31 => 'White Board', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + # (Movies have different BestShot numbers for this camera) + Condition => '$$self{Model} eq "EX-Z750" and $$self{FILE_TYPE} =~ /^(MOV|AVI)$/', + Notes => 'EX-Z750 movies', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Portrait', + 2 => 'Scenery', + 3 => 'Night Scene', + 4 => 'Fireworks', + 5 => 'Backlight', + 6 => 'Silent', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + # (Movies have different BestShot numbers for this camera) + Condition => '$$self{Model} eq "EX-Z850" and $$self{FILE_TYPE} eq "JPEG"', + Notes => 'EX-Z850 JPEG images', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Portrait', + 2 => 'Scenery', + 3 => 'Portrait with Scenery', + 4 => 'Children', + 5 => 'Sports', + 6 => 'Candlelight Portrait', + 7 => 'Party', + 8 => 'Pet', + 9 => 'Flower', + 10 => 'Natural Green', + 11 => 'Autumn Leaves', + 12 => 'Soft Flowing Water', + 13 => 'Splashing Water', + 14 => 'Sundown', + 15 => 'Night Scene', + 16 => 'Night Scene Portrait', + 17 => 'Fireworks', + 18 => 'Food', + 19 => 'Text', + 20 => 'Collection', + 21 => 'For eBay', + 22 => 'Backlight', + 23 => 'Anti Shake', + 24 => 'High Sensitivity', + 25 => 'Pastel', + 26 => 'Illustration', + 27 => 'Cross Filter', + 28 => 'Monochrome', + 29 => 'Retro', + 30 => 'Twilight', + 31 => 'ID Photo', + 32 => 'Old Photo', + 33 => 'Business Cards', + 34 => 'White Board', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + # (Movies have different BestShot numbers for this camera) + Condition => '$$self{Model} eq "EX-Z850" and $$self{FILE_TYPE} =~ /^(MOV|AVI)$/', + Notes => 'EX-Z850 movies', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Portrait', + 2 => 'Scenery', + 3 => 'Night Scene', + 4 => 'Fireworks', + 5 => 'Backlight', + 6 => 'High Sensitivity', + 7 => 'Silent', + 8 => 'Short Movie', + 9 => 'Past Movie', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + # (Movies have different BestShot numbers for this camera) + Condition => '$$self{Model} eq "EX-Z1050"', + Notes => 'EX-Z1050', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Movie', + 3 => 'Portrait', + 4 => 'Scenery', + 5 => 'Portrait with Scenery', + 6 => 'Children', + 7 => 'Sports', + 8 => 'Candlelight Portrait', + 9 => 'Party', + 10 => 'Pet', + 11 => 'Flower', + 12 => 'Natural Green', + 13 => 'Autumn Leaves', + 14 => 'Soft Flowing Water', + 15 => 'Splashing Water', + 16 => 'Sundown', + 17 => 'Night Scene', + 18 => 'Night Scene Portrait', + 19 => 'Fireworks', + 20 => 'Food', + 21 => 'Text', + 22 => 'Collection', + 23 => 'For eBay', + 24 => 'Backlight', + 25 => 'Anti Shake', + 26 => 'High Sensitivity', + 27 => 'Underwater', + 28 => 'Monochrome', + 29 => 'Retro', + 30 => 'Twilight', + 31 => 'Layout (2 images)', + 32 => 'Layout (3 images)', + 33 => 'Auto Framing', + 34 => 'ID Photo', + 35 => 'Old Photo', + 36 => 'Business Cards', + 37 => 'White Board', + 38 => 'Voice Recording', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + # (Movies have different BestShot numbers for this camera) + Condition => '$$self{Model} eq "EX-Z1080"', + Notes => 'EX-Z1080', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Movie', + 3 => 'Portrait', + 4 => 'Scenery', + 5 => 'Portrait with Scenery', + 6 => 'Children', + 7 => 'Sports', + 8 => 'Candlelight Portrait', + 9 => 'Party', + 10 => 'Pet', + 11 => 'Flower', + 12 => 'Natural Green', + 13 => 'Autumn Leaves', + 14 => 'Soft Flowing Water', + 15 => 'Splashing Water', + 16 => 'Sundown', + 17 => 'Night Scene', + 18 => 'Night Scene Portrait', + 19 => 'Fireworks', + 20 => 'Food', + 21 => 'Text', + 22 => 'Collection', + 23 => 'For eBay', + 24 => 'Backlight', + 25 => 'Anti Shake', + 26 => 'High Sensitivity', + 27 => 'Underwater', + 28 => 'Monochrome', + 29 => 'Retro', + 30 => 'Twilight', + 31 => 'Layout (2 images)', + 32 => 'Layout (3 images)', + 33 => 'Auto Framing', + 34 => 'ID Photo', + 35 => 'Old Photo', + 36 => 'Business Cards', + 37 => 'White Board', + 38 => 'Short Movie', + 39 => 'Past Movie', + 40 => 'For YouTube', + 41 => 'Voice Recording', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + # (Movies have different BestShot numbers for this camera) + Condition => '$$self{Model} eq "EX-Z1200" and $$self{FILE_TYPE} eq "JPEG"', + Notes => 'EX-Z1200 JPEG images', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Portrait', + 2 => 'Scenery', + 3 => 'Portrait with Scenery', + 4 => 'Children', + 5 => 'Sports', + 6 => 'Candlelight Portrait', + 7 => 'Party', + 8 => 'Pet', + 9 => 'Flower', + 10 => 'Natural Green', + 11 => 'Autumn Leaves', + 12 => 'Soft Flowing Water', + 13 => 'Splashing Water', + 14 => 'Sundown', + 15 => 'Night Scene', + 16 => 'Night Scene Portrait', + 17 => 'Fireworks', + 18 => 'Food', + 19 => 'Text', + 20 => 'Collection', + 21 => 'Auction', + 22 => 'Backlight', + 23 => 'High Sensitivity', + 24 => 'Underwater', + 25 => 'Monochrome', + 26 => 'Retro', + 27 => 'Twilight', + 28 => 'Layout (2 images)', + 29 => 'Layout (3 images)', + 30 => 'Auto Framing', + 31 => 'ID Photo', + 32 => 'Old Photo', + 33 => 'Business Cards', + 34 => 'White Board', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + # (Movies have different BestShot numbers for this camera) + Condition => '$$self{Model} eq "EX-Z1200" and $$self{FILE_TYPE} =~ /^(MOV|AVI)$/', + Notes => 'EX-Z1200 movies', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Portrait', + 2 => 'Scenery', + 3 => 'Night Scene', + 4 => 'Fireworks', + 5 => 'Backlight', + 6 => 'High Sensitivity', + 7 => 'Silent', + 8 => 'Short Movie', + 9 => 'Past Movie', + }, + }, + # (the following weren't numbered in the documentation: + # G1, Z300, Z250, Z85, Z19, Z150, F1, FH20) + { + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-Z2000"', + Notes => 'EX-Z2000', + PrintConvColumns => 3, + #http://support.casio.com/download_files/001/faq_pdf/Z2000/EXZ2000_BS_US_a.pdf + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Premium Auto', + 3 => 'Dynamic Photo', + 4 => 'Portrait', + 5 => 'Scenery', + 6 => 'Portrait with Scenery', + 7 => 'Children', + 8 => 'Sports', + 9 => 'Candlelight Portrait', + 10 => 'Party', + 11 => 'Pet', + 12 => 'Flower', + 13 => 'Natural Green', + 14 => 'Autumn Leaves', + 15 => 'Soft Flowing Water', + 16 => 'Splashing Water', + 17 => 'Sundown', + 18 => 'Night Scene', + 19 => 'Night Scene Portrait', + 20 => 'Fireworks', + 21 => 'Food', + 22 => 'Text', + 23 => 'Collection', + 24 => 'For eBay', + 25 => 'Backlight', + 26 => 'High Sensitivity', + 27 => 'Oil Painting', + 28 => 'Crayon', + 29 => 'Water Color', + 30 => 'Monochrome', + 31 => 'Retro', + 32 => 'Twilight', + 33 => 'Multi-motion Image', + 34 => 'ID Photo', + 35 => 'Business Cards', + 36 => 'White Board', + 37 => 'Silent', + 38 => 'Pre-record Movie', + 39 => 'For YouTube', + 40 => 'Voice Recording', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + # (Movies have different BestShot numbers for this camera) + Condition => '$$self{Model} eq "EX-Z2300"', + Notes => 'EX-Z2300', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Premium Auto', + 3 => 'Dynamic Photo', + 4 => 'Portrait', + 5 => 'Scenery', + 6 => 'Portrait with Scenery', + 7 => 'Children', + 8 => 'Sports', + 9 => 'Candlelight Portrait', + 10 => 'Party', + 11 => 'Pet', + 12 => 'Flower', + 13 => 'Natural Green', + 14 => 'Autumn Leaves', + 15 => 'Soft Flowing Water', + 16 => 'Splashing Water', + 17 => 'Sundown', + 18 => 'Night Scene', + 19 => 'Night Scene Portrait', + 20 => 'Fireworks', + 21 => 'Food', + 22 => 'Text', + 23 => 'Collection', + 24 => 'Auction', + 25 => 'Backlight', + 26 => 'High Sensitivity', + 27 => 'Oil Painting', + 28 => 'Crayon', + 29 => 'Water Color', + 30 => 'Monochrome', + 31 => 'Retro', + 32 => 'Twilight', + 33 => 'Multi-motion Image', + 34 => 'ID Photo', + 35 => 'Business Cards', + 36 => 'White Board', + 37 => 'Silent', + 38 => 'Pre-record Movie', + 39 => 'For YouTube', + 40 => 'Voice Recording', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-Z3000"', + Notes => 'EX-Z3000', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'Portrait', + 2 => 'Scenery', + 3 => 'Portrait With Scenery', + 4 => 'Children', + 5 => 'Sports', + 6 => 'Night Scene', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-ZR100"', + Notes => 'EX-ZR100', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Off', + 1 => 'Child CS', + 2 => 'Pet CS', + 3 => 'Sports CS', + 4 => 'Child High Speed Movie', + 5 => 'Pet High Speed Movie', + 6 => 'Sports High Speed Movie', + 7 => 'Multi SR Zoom', + 8 => 'Lag Correction', + 9 => 'High Speed Night Scene', + 10 => 'High Speed Night Scene and Portrait', + 11 => 'High Speed Anti Shake', + 12 => 'Portrait', + 13 => 'Scenery', + 14 => 'Portrait with Scenery', + 15 => 'Children', + 16 => 'Sports', + 17 => 'Candlelight Portrait', + 18 => 'Party', + 19 => 'Pet', + 20 => 'Flower', + 21 => 'Natural Green', + 22 => 'Autumn Leaves', + 23 => 'Soft Flowing Water', + 24 => 'Splashing Water', + 25 => 'Sundown', + 26 => 'Fireworks', + 27 => 'Food', + 28 => 'Text', + 29 => 'Collection', + 30 => 'For eBay', + 31 => 'Pre-record Movie', + 32 => 'For YouTube', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-ZR200"', + Notes => 'EX-ZR200', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Off', + 1 => 'High Speed Night Scene', + 2 => 'High Speed Night Scene and Portrait', + 3 => 'High Speed Anti Shake', + 4 => 'Blurred Background', + 5 => 'Wide Shot', + 6 => 'High Speed Best Selection', + 7 => 'Lag Correction', + 8 => 'Child CS', + 9 => 'Pet CS', + 10 => 'Sports CS', + 11 => 'Child High Speed Movie', + 12 => 'Pet High Speed Movie', + 13 => 'Sports High Speed Movie', + 14 => 'Portrait', + 15 => 'Scenery', + 16 => 'Portrait with Scenery', + 17 => 'Children', + 18 => 'Sports', + 19 => 'Candlelight Portrait', + 20 => 'Party', + 21 => 'Pet', + 22 => 'Flower', + 23 => 'Natural Green', + 24 => 'Autumn Leaves', + 25 => 'Soft Flowing Water', + 26 => 'Splashing Water', + 27 => 'Sundown', + 28 => 'Fireworks', + 29 => 'Food', + 30 => 'Text', + 31 => 'Collection', + 32 => 'Auction', + 33 => 'Pre-record Movie', + 34 => 'For YouTube', + }, + },{ #http://ftp.casio.co.jp/pub/world_manual/qv/en/qv_4000/BS.pdf + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "QV-4000"', + Notes => 'QV-4000', + PrintConvColumns => 3, + PrintConv => { + 0 => 'Off', + 1 => 'People', + 2 => 'Scenery', + 3 => 'Flower', + 4 => 'Night Scene', + 5 => 'Soft Focus', + # this camera also supports 100 modes that you can apparently load + # from a CD-ROM, but I don't know how these map into these numbers + }, + },{ #Manfred, email + Name => 'BestShotMode', + Writable => 'int16u', + Condition => '$$self{Model} eq "EX-ZR300"', + Notes => 'EX-ZR300', + PrintConvColumns => 2, + PrintConv => { + 1 => 'High Speed Night Shot', + 2 => 'Blurred Background', + 3 => 'Toy Camera', + 4 => 'Soft Focus', + 5 => 'Light Tone', + 6 => 'Pop', + 7 => 'Sepia', + 8 => 'Monochrome', + 9 => 'Miniature', + 10 => 'Wide Shot', + 11 => 'High Speed Best Selection', + 12 => 'Lag Correction', + 13 => 'High Speed Night Scene', + 14 => 'High Speed Night Scene and Portrait', + 15 => 'High Speed Anti Shake', + 16 => 'Portrait', + 17 => 'Scenery', + 18 => 'Portrait with Scenery', + 19 => 'Children', + 20 => 'Sports', + 21 => 'Candlelight Portrait', + 22 => 'Party', + 23 => 'Pet', + 24 => 'Flower', + 25 => 'Natural Green', + 26 => 'Autumn Leaves', + 27 => 'Soft Flowing Water', + 28 => 'Splashing Water', + 29 => 'Sundown', + 30 => 'Fireworks', + 31 => 'Food', + 32 => 'Text', + 33 => 'Collection', + 34 => 'Auction', + 35 => 'Prerecord (Movie)', + 36 => 'For YouTube', + }, + },{ + Name => 'BestShotMode', + Writable => 'int16u', + Notes => 'other models not yet decoded', + # so we can't use a lookup as usual - PH + PrintConv => '$val ? $val : "Off"', + PrintConvInv => '$val=~/(\d+)/ ? $1 : 0', + }], + 0x3008 => { #3 + Name => 'AutoISO', + Writable => 'int16u', + PrintConv => { + 1 => 'On', + 2 => 'Off', + 7 => 'On (high sensitivity)', #PH + 8 => 'On (anti-shake)', #PH + 10 => 'High Speed', #PH (EX-FC150) + }, + }, + 0x3009 => { #6 + Name => 'AFMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Spot', + 2 => 'Multi', + 3 => 'Face Detection', + 4 => 'Tracking', # (but saw this for "Family First" mode with EX-Z77 - PH) + 5 => 'Intelligent', + }, + }, + 0x3011 => { #3 + Name => 'Sharpness', + Format => 'int16s', + Writable => 'undef', + }, + 0x3012 => { #3 + Name => 'Contrast', + Format => 'int16s', + Writable => 'undef', + }, + 0x3013 => { #3 + Name => 'Saturation', + Format => 'int16s', + Writable => 'undef', + }, + 0x3014 => { + Name => 'ISO', + Writable => 'int16u', + Priority => 0, + }, + 0x3015 => { + Name => 'ColorMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 2 => 'Black & White', #PH (EX-Z400,FH20) + 3 => 'Sepia', #PH (EX-Z400) + }, + }, + 0x3016 => { + Name => 'Enhancement', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Scenery', #PH (NC) (EX-Z77) + 3 => 'Green', #PH (EX-Z77) + 5 => 'Underwater', #PH (NC) (EX-Z77) + 9 => 'Flesh Tones', #PH (EX-Z77) + }, + }, + 0x3017 => { + Name => 'ColorFilter', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Blue', #PH (FH20,Z400) + 3 => 'Green', #PH (FH20) + 4 => 'Yellow', #PH (FH20) + 5 => 'Red', #PH (FH20,Z77) + 6 => 'Purple', #PH (FH20,Z77,Z400) + 7 => 'Pink', #PH (FH20) + }, + }, + 0x301b => { #PH + Name => 'ArtMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Normal', + 8 => 'Silent Movie', + 39 => 'HDR', # (EX-ZR10) + 45 => 'Premium Auto', # (EX-2300) + 47 => 'Painting', # (EX-2300) + 49 => 'Crayon Drawing', # (EX-2300) + 51 => 'Panorama', # (EX-ZR10) + 52 => 'Art HDR', # (EX-ZR10,EX-Z3000) + 62 => 'High Speed Night Shot', # (EX-ZR20) + 64 => 'Monochrome', # (EX-ZR20) + 67 => 'Toy Camera', # (EX-ZR20) + 68 => 'Pop Art', # (EX-ZR20) + 69 => 'Light Tone', # (EX-ZR20) + }, + }, + 0x301c => { #3 + Name => 'SequenceNumber', # for continuous shooting + Writable => 'int16u', + }, + 0x301d => { #3 + Name => 'BracketSequence', + Writable => 'int16u', + Count => 2, + }, + # 0x301e - MultiBracket ? (ref 3) + 0x3020 => { #3 + Name => 'ImageStabilization', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'Best Shot', + 3 => 'Movie Anti-Shake', # (EX-V7, EX-TR100) + # (newer models write 2 numbers here - PH) + '0 0' => 'Off', #PH + '16 0' => 'Slow Shutter', #PH (EX-Z77) + '18 0' => 'Anti-Shake', #PH (EX-Z77) + '20 0' => 'High Sensitivity', #PH (EX-Z77) + # EX-Z2000 in 'Auto' mode gives '0 3' or '2 3' (ref 6) + '0 1' => 'Off (1)', #6 + '0 3' => 'CCD Shift', #PH/6 ("Camera AS" in EX-Z2000 manual) + '2 1' => 'High Sensitivity', #6 + '2 3' => 'CCD Shift + High Sensitivity', #PH (EX-FC150) + # have also seen: + # '2 0' - EX-Z15 1/60s ISO 200, EX-Z77 1/1000s ISO 50 + # '16 1' - EX-Z2300 1/125s ISO 50 + }, + }, + 0x302a => { #PH (EX-Z450) + Name => 'LightingMode', #(just guessing here) + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'High Dynamic Range', # (EX-Z77 anti-blur shot) + 5 => 'Shadow Enhance Low', #(NC) + 6 => 'Shadow Enhance High', #(NC) + }, + }, + 0x302b => { #PH (EX-Z77) + Name => 'PortraitRefiner', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => '+1', + 2 => '+2', + }, + }, + 0x3030 => { #PH (EX-Z450) + Name => 'SpecialEffectLevel', + Writable => 'int16u', + }, + 0x3031 => { #PH (EX-Z450) + Name => 'SpecialEffectSetting', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Makeup', + 2 => 'Mist Removal', + 3 => 'Vivid Landscape', + 16 => 'Art Shot', # (EX-Z2300) + }, + }, + 0x3103 => { #5 + Name => 'DriveMode', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + OTHER => sub { + # handle new values of future models + my ($val, $inv) = @_; + return $val =~ /(\d+)/ ? $1 : undef if $inv; + return "Continuous ($val fps)"; + }, + 0 => 'Single Shot', #PH (NC) + 1 => 'Continuous Shooting', # (1 fps for the EX-F1) + 2 => 'Continuous (2 fps)', + 3 => 'Continuous (3 fps)', + 4 => 'Continuous (4 fps)', + 5 => 'Continuous (5 fps)', + 6 => 'Continuous (6 fps)', + 7 => 'Continuous (7 fps)', + 10 => 'Continuous (10 fps)', + 12 => 'Continuous (12 fps)', + 15 => 'Continuous (15 fps)', + 20 => 'Continuous (20 fps)', + 30 => 'Continuous (30 fps)', + 40 => 'Continuous (40 fps)', #PH (EX-FH25) + 60 => 'Continuous (60 fps)', + 240 => 'Auto-N', + }, + }, + 0x310b => { #PH (NC) + Name => 'ArtModeParameters', + Writable => 'int8u', + Count => 3, + # "0 1 0" = Toy camera 1 + # "0 2 0" = Toy camera 1 + # "0 3 0" = Toy camera 1 + # Have also seen "0 0 0" and "2 0 0" + }, + 0x4001 => { #PH (AVI videos) + Name => 'CaptureFrameRate', + Writable => 'int16u', + Count => -1, + ValueConv => q{ + my @v=split(" ",$val); + return $val / 1000 if @v == 1; + return $v[1] ? "$v[1]-$v[0]" : ($v[0] > 10000 ? $v[0] / 1000 : $v[0]); + }, + ValueConvInv => '$val <= 60 ? $val * 1000 : int($val) . " 0"', + }, + # 0x4002 - AVI videos, related to video quality or size - PH + 0x4003 => { #PH (AVI and MOV videos) + Name => 'VideoQuality', + Writable => 'int16u', + PrintConv => { + 1 => 'Standard', + # 2 - could this be LP? + 3 => 'HD (720p)', + 4 => 'Full HD (1080p)', # (EX-ZR10, 30fps 1920x1080) + 5 => 'Low', # used in High Speed modes + }, + }, +); + +# face detection information (ref PH) (EX-H5) +%Image::ExifTool::Casio::FaceInfo1 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + WRITABLE => 1, + FIRST_ENTRY => 0, + DATAMEMBER => [ 0 ], + NOTES => 'Face-detect tags extracted from models such as the EX-H5.', + 0x00 => { # (NC) + Name => 'FacesDetected', + DataMember => 'FacesDetected', + RawConv => '$$self{FacesDetected} = $val', + }, + 0x01 => { + Name => 'FaceDetectFrameSize', + Condition => '$$self{FacesDetected} >= 1', # (otherwise zeros) + Format => 'int16u[2]', + }, + 0x0d => { + Name => 'Face1Position', + Condition => '$$self{FacesDetected} >= 1', + Format => 'int16u[4]', + Notes => q{ + left, top, right and bottom of detected face in coordinates of + FaceDetectFrameSize, with increasing Y downwards + }, + }, + # decoding NOT CONFIRMED (NC) for faces 2-10! + 0x7c => { + Name => 'Face2Position', + Condition => '$$self{FacesDetected} >= 2', + Format => 'int16u[4]', + }, + 0xeb => { + Name => 'Face3Position', + Condition => '$$self{FacesDetected} >= 3', + Format => 'int16u[4]', + }, + 0x15a => { + Name => 'Face4Position', + Condition => '$$self{FacesDetected} >= 4', + Format => 'int16u[4]', + }, + 0x1c9 => { + Name => 'Face5Position', + Condition => '$$self{FacesDetected} >= 5', + Format => 'int16u[4]', + }, + 0x238 => { + Name => 'Face6Position', + Condition => '$$self{FacesDetected} >= 6', + Format => 'int16u[4]', + }, + 0x2a7 => { + Name => 'Face7Position', + Condition => '$$self{FacesDetected} >= 7', + Format => 'int16u[4]', + }, + 0x316 => { + Name => 'Face8Position', + Condition => '$$self{FacesDetected} >= 8', + Format => 'int16u[4]', + }, + 0x385 => { + Name => 'Face9Position', + Condition => '$$self{FacesDetected} >= 9', + Format => 'int16u[4]', + }, + 0x3f4 => { + Name => 'Face10Position', + Condition => '$$self{FacesDetected} >= 10', + Format => 'int16u[4]', + }, +); + +# face detection information (ref PH) (EX-ZR100) +%Image::ExifTool::Casio::FaceInfo2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + WRITABLE => 1, + FIRST_ENTRY => 0, + DATAMEMBER => [ 2 ], + NOTES => 'Face-detect tags extracted from models such as the EX-H20G and EX-ZR100.', + 0x02 => { + Name => 'FacesDetected', + DataMember => 'FacesDetected', + RawConv => '$$self{FacesDetected} = $val', + }, + 0x04 => { + Name => 'FaceDetectFrameSize', + Condition => '$$self{FacesDetected} >= 1', + Format => 'int16u[2]', + }, + 0x08 => { + Name => 'FaceOrientation', + Condition => '$$self{FacesDetected} >= 1', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + 3 => 'Rotate 180', # (NC) + # (have seen 64 here, but image had no face) + }, + Notes => 'orientation of face relative to unrotated image', + }, + # 0x0a - FaceDetectFrameSize again + # 0x11 - Face1Detected flag (1=detected) + 0x18 => { + Name => 'Face1Position', + Condition => '$$self{FacesDetected} >= 1', + Format => 'int16u[4]', + Notes => q{ + left, top, right and bottom of detected face in coordinates of + FaceDetectFrameSize, with increasing Y downwards + }, + }, + # 0x45 - Face2Detected, etc... + 0x4c => { + Name => 'Face2Position', + Condition => '$$self{FacesDetected} >= 2', + Format => 'int16u[4]', + }, + 0x80 => { + Name => 'Face3Position', + Condition => '$$self{FacesDetected} >= 3', + Format => 'int16u[4]', + }, + 0xb4 => { + Name => 'Face4Position', + Condition => '$$self{FacesDetected} >= 4', + Format => 'int16u[4]', + }, + 0xe8 => { + Name => 'Face5Position', + Condition => '$$self{FacesDetected} >= 5', + Format => 'int16u[4]', + }, + 0x11c => { + Name => 'Face6Position', + Condition => '$$self{FacesDetected} >= 6', + Format => 'int16u[4]', + }, + 0x150 => { + Name => 'Face7Position', + Condition => '$$self{FacesDetected} >= 7', + Format => 'int16u[4]', + }, + 0x184 => { + Name => 'Face8Position', + Condition => '$$self{FacesDetected} >= 8', + Format => 'int16u[4]', + }, + 0x1b8 => { + Name => 'Face9Position', + Condition => '$$self{FacesDetected} >= 9', + Format => 'int16u[4]', + }, + 0x1ec => { + Name => 'Face10Position', + Condition => '$$self{FacesDetected} >= 10', + Format => 'int16u[4]', + }, +); + +# Casio APP1 QVCI segment found in QV-7000SX images (ref PH) +%Image::ExifTool::Casio::QVCI = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => q{ + This information is found in the APP1 QVCI segment of JPEG images from the + Casio QV-7000SX. + }, + 0x2c => { + Name => 'CasioQuality', + PrintConv => { + 1 => 'Economy', + 2 => 'Normal', + 3 => 'Fine', + 4 => 'Super Fine', + }, + }, + 0x37 => { + Name => 'FocalRange', + Unknown => 1, + }, + 0x4d => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Format => 'string[20]', + Groups => { 2 => 'Time' }, + ValueConv => '$val=~tr/./:/; $val=~s/(\d+:\d+:\d+):/$1 /; $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x62 => { + Name => 'ModelType', + Format => 'string[7]', + }, + 0x72 => { # could be serial number or manufacture date in form YYMMDDxx ? + Name => 'ManufactureIndex', + Format => 'string[9]', + }, + 0x7c => { + Name => 'ManufactureCode', + Format => 'string[9]', + }, +); + +# tags in Casio AVI videos (ref PH) +%Image::ExifTool::Casio::AVI = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => 'This information is found in Casio GV-10 AVI videos.', + 0 => { + Name => 'Software', # (equivalent to RIFF Software tag) + Format => 'string', + }, +); + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Casio - Casio EXIF maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Casio maker notes in EXIF information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html> + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Joachim Loehr for adding support for the type 2 maker notes, and +Jens Duttke and Robert Chi for decoding some tags. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Casio Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Charset.pm b/lib/Image/ExifTool/Charset.pm new file mode 100644 index 0000000..2e369ab --- /dev/null +++ b/lib/Image/ExifTool/Charset.pm @@ -0,0 +1,434 @@ +#------------------------------------------------------------------------------ +# File: Charset.pm +# +# Description: ExifTool character encoding routines +# +# Revisions: 2009/08/28 - P. Harvey created +# 2010/01/20 - P. Harvey complete re-write +# 2010/07/16 - P. Harvey added UTF-16 support +# +# Notes: Charset lookups are generated using my convertCharset script +#------------------------------------------------------------------------------ + +package Image::ExifTool::Charset; + +use strict; +use vars qw($VERSION %csType); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.11'; + +my %charsetTable; # character set tables we've loaded + +# lookup for converting Unicode to 1-byte character sets +my %unicode2byte = ( + Latin => { # pre-load Latin (cp1252) for speed + 0x20ac => 0x80, 0x0160 => 0x8a, 0x2013 => 0x96, + 0x201a => 0x82, 0x2039 => 0x8b, 0x2014 => 0x97, + 0x0192 => 0x83, 0x0152 => 0x8c, 0x02dc => 0x98, + 0x201e => 0x84, 0x017d => 0x8e, 0x2122 => 0x99, + 0x2026 => 0x85, 0x2018 => 0x91, 0x0161 => 0x9a, + 0x2020 => 0x86, 0x2019 => 0x92, 0x203a => 0x9b, + 0x2021 => 0x87, 0x201c => 0x93, 0x0153 => 0x9c, + 0x02c6 => 0x88, 0x201d => 0x94, 0x017e => 0x9e, + 0x2030 => 0x89, 0x2022 => 0x95, 0x0178 => 0x9f, + }, +); + +# bit flags for all supported character sets +# (this number must be correct because it dictates the decoding algorithm!) +# 0x001 = character set requires a translation module +# 0x002 = inverse conversion not yet supported by Recompose() +# 0x080 = some characters with codepoints in the range 0x00-0x7f are remapped +# 0x100 = 1-byte fixed-width characters +# 0x200 = 2-byte fixed-width characters +# 0x400 = 4-byte fixed-width characters +# 0x800 = 1- and 2-byte variable-width characters, or 1-byte +# fixed-width characters that map into multiple codepoints +# Note: In its public interface, ExifTool can currently only support type 0x101 +# and lower character sets because strings are only converted if they +# contain characters above 0x7f and there is no provision for specifying +# the byte order for input/output values +%csType = ( + UTF8 => 0x100, + ASCII => 0x100, # (treated like UTF8) + Arabic => 0x101, + Baltic => 0x101, + Cyrillic => 0x101, + Greek => 0x101, + Hebrew => 0x101, + Latin => 0x101, + Latin2 => 0x101, + DOSLatinUS => 0x101, + DOSLatin1 => 0x101, + DOSCyrillic => 0x101, + MacCroatian => 0x101, + MacCyrillic => 0x101, + MacGreek => 0x101, + MacIceland => 0x101, + MacLatin2 => 0x101, + MacRoman => 0x101, + MacRomanian => 0x101, + MacTurkish => 0x101, + Thai => 0x101, + Turkish => 0x101, + Vietnam => 0x101, + MacArabic => 0x103, # (directional characters not supported) + PDFDoc => 0x181, + Unicode => 0x200, # (UCS2) + UCS2 => 0x200, + UTF16 => 0x200, + Symbol => 0x201, + JIS => 0x201, + UCS4 => 0x400, + MacChineseCN => 0x803, + MacChineseTW => 0x803, + MacHebrew => 0x803, # (directional characters not supported) + MacKorean => 0x803, + MacRSymbol => 0x803, + MacThai => 0x803, + MacJapanese => 0x883, + ShiftJIS => 0x883, +); + +#------------------------------------------------------------------------------ +# Load character set module +# Inputs: 0) Module name +# Returns: Reference to lookup hash, or undef on error +sub LoadCharset($) +{ + my $charset = shift; + my $conv = $charsetTable{$charset}; + unless ($conv) { + # load translation module + my $module = "Image::ExifTool::Charset::$charset"; + no strict 'refs'; + if (%$module or eval "require $module") { + $conv = $charsetTable{$charset} = \%$module; + } + } + return $conv; +} + +#------------------------------------------------------------------------------ +# Does an array contain valid UTF-16 characters? +# Inputs: 0) array reference to list of UCS-2 values +# Returns: 0=invalid UTF-16, 1=valid UTF-16 with no surrogates, 2=valid UTF-16 with surrogates +sub IsUTF16($) +{ + local $_; + my $uni = shift; + my $surrogate; + foreach (@$uni) { + my $hiBits = ($_ & 0xfc00); + if ($hiBits == 0xfc00) { + # check for invalid values in UTF-16 + return 0 if $_ == 0xffff or $_ == 0xfffe or ($_ >= 0xfdd0 and $_ <= 0xfdef); + } elsif ($surrogate) { + return 0 if $hiBits != 0xdc00; + $surrogate = 0; + } else { + return 0 if $hiBits == 0xdc00; + $surrogate = 1 if $hiBits == 0xd800; + } + } + return 1 if not defined $surrogate; + return 2 unless $surrogate; + return 0; +} + +#------------------------------------------------------------------------------ +# Decompose string with specified encoding into an array of integer code points +# Inputs: 0) ExifTool object ref (or undef), 1) string, 2) character set name, +# 3) optional byte order ('II','MM','Unknown' or undef to use ExifTool ordering) +# Returns: Reference to array of Unicode values +# Notes: Accepts any type of character set +# - byte order only used for fixed-width 2-byte and 4-byte character sets +# - byte order mark observed and then removed with UCS2 and UCS4 +# - no warnings are issued if ExifTool object is not provided +# - sets ExifTool WrongByteOrder flag if byte order is Unknown and current order is wrong +sub Decompose($$$;$) +{ + local $_; + my ($et, $val, $charset) = @_; # ($byteOrder assigned later if required) + my $type = $csType{$charset}; + my (@uni, $conv); + + if ($type & 0x001) { + $conv = LoadCharset($charset); + unless ($conv) { + # (shouldn't happen) + $et->Warn("Invalid character set $charset") if $et; + return \@uni; # error! + } + } elsif ($type == 0x100) { + # convert ASCII and UTF8 (treat ASCII as UTF8) + if ($] < 5.006001) { + # do it ourself + @uni = Image::ExifTool::UnpackUTF8($val); + } else { + # handle warnings from malformed UTF-8 + undef $Image::ExifTool::evalWarning; + local $SIG{'__WARN__'} = \&Image::ExifTool::SetWarning; + # (somehow the meaning of "U0" was reversed in Perl 5.10.0!) + @uni = unpack($] < 5.010000 ? 'U0U*' : 'C0U*', $val); + # issue warning if we had errors + if ($Image::ExifTool::evalWarning and $et and not $$et{WarnBadUTF8}) { + $et->Warn('Malformed UTF-8 character(s)'); + $$et{WarnBadUTF8} = 1; + } + } + return \@uni; # all done! + } + if ($type & 0x100) { # 1-byte fixed-width characters + @uni = unpack('C*', $val); + foreach (@uni) { + $_ = $$conv{$_} if defined $$conv{$_}; + } + } elsif ($type & 0x600) { # 2-byte or 4-byte fixed-width characters + my $unknown; + my $byteOrder = $_[3]; + if (not $byteOrder) { + $byteOrder = GetByteOrder(); + } elsif ($byteOrder eq 'Unknown') { + $byteOrder = GetByteOrder(); + $unknown = 1; + } + my $fmt = $byteOrder eq 'MM' ? 'n*' : 'v*'; + if ($type & 0x400) { # 4-byte + $fmt = uc $fmt; # unpack as 'N*' or 'V*' + # honour BOM if it exists + $val =~ s/^(\0\0\xfe\xff|\xff\xfe\0\0)// and $fmt = $1 eq "\0\0\xfe\xff" ? 'N*' : 'V*'; + undef $unknown; # (byte order logic applies to 2-byte only) + } elsif ($val =~ s/^(\xfe\xff|\xff\xfe)//) { + $fmt = $1 eq "\xfe\xff" ? 'n*' : 'v*'; + undef $unknown; + } + # convert from UCS2 or UCS4 + @uni = unpack($fmt, $val); + + if (not $conv) { + # no translation necessary + if ($unknown) { + # check the byte order + my (%bh, %bl); + my ($zh, $zl) = (0, 0); + foreach (@uni) { + $bh{$_ >> 8} = 1; + $bl{$_ & 0xff} = 1; + ++$zh unless $_ & 0xff00; + ++$zl unless $_ & 0x00ff; + } + # count the number of unique values in the hi and lo bytes + my ($bh, $bl) = (scalar(keys %bh), scalar(keys %bl)); + # the byte with the greater number of unique values should be + # the low-order byte, otherwise the byte which is zero more + # often is likely the high-order byte + if ($bh > $bl or ($bh == $bl and $zl > $zh)) { + # we guessed wrong, so decode using the other byte order + $fmt =~ tr/nvNV/vnVN/; + @uni = unpack($fmt, $val); + $$et{WrongByteOrder} = 1; + } + } + # handle surrogate pairs of UTF-16 + if ($charset eq 'UTF16') { + my $i; + for ($i=0; $i<$#uni; ++$i) { + next unless ($uni[$i] & 0xfc00) == 0xd800 and + ($uni[$i+1] & 0xfc00) == 0xdc00; + my $cp = 0x10000 + (($uni[$i] & 0x3ff) << 10) + ($uni[$i+1] & 0x3ff); + splice(@uni, $i, 2, $cp); + } + } + } elsif ($unknown) { + # count encoding errors as we do the translation + my $e1 = 0; + foreach (@uni) { + defined $$conv{$_} and $_ = $$conv{$_}, next; + ++$e1; + } + # try the other byte order if we had any errors + if ($e1) { + $fmt = $byteOrder eq 'MM' ? 'v*' : 'n*'; #(reversed) + my @try = unpack($fmt, $val); + my $e2 = 0; + foreach (@try) { + defined $$conv{$_} and $_ = $$conv{$_}, next; + ++$e2; + } + # use this byte order if there are fewer errors + if ($e2 < $e1) { + $$et{WrongByteOrder} = 1; + return \@try; + } + } + } else { + # translate any characters found in the lookup + foreach (@uni) { + $_ = $$conv{$_} if defined $$conv{$_}; + } + } + } else { # variable-width characters + # unpack into bytes + my @bytes = unpack('C*', $val); + while (@bytes) { + my $ch = shift @bytes; + my $cv = $$conv{$ch}; + # pass straight through if no translation + $cv or push(@uni, $ch), next; + # byte translates into single Unicode character + ref $cv or push(@uni, $cv), next; + # byte maps into multiple Unicode characters + ref $cv eq 'ARRAY' and push(@uni, @$cv), next; + # handle 2-byte character codes + $ch = shift @bytes; + if (defined $ch) { + if ($$cv{$ch}) { + $cv = $$cv{$ch}; + ref $cv or push(@uni, $cv), next; + push @uni, @$cv; # multiple Unicode characters + } else { + push @uni, ord('?'); # encoding error + unshift @bytes, $ch; + } + } else { + push @uni, ord('?'); # encoding error + } + } + } + return \@uni; +} + +#------------------------------------------------------------------------------ +# Convert array of code point integers into a string with specified encoding +# Inputs: 0) ExifTool ref (or undef), 1) unicode character array ref, +# 2) character set (note: not all types are supported) +# 3) byte order ('MM' or 'II', multi-byte sets only, defaults to current byte order) +# Returns: converted string (truncated at null character if it exists), empty on error +# Notes: converts elements of input character array to new code points +# - ExifTool ref may be undef provided $charset is defined +sub Recompose($$;$$) +{ + local $_; + my ($et, $uni, $charset) = @_; # ($byteOrder assigned later if required) + my ($outVal, $conv, $inv); + $charset or $charset = $$et{OPTIONS}{Charset}; + my $csType = $csType{$charset}; + if ($csType == 0x100) { # UTF8 (also treat ASCII as UTF8) + if ($] >= 5.006001) { + # let Perl do it + $outVal = pack('C0U*', @$uni); + } else { + # do it ourself + $outVal = Image::ExifTool::PackUTF8(@$uni); + } + $outVal =~ s/\0.*//s; # truncate at null terminator + return $outVal; + } + # get references to forward and inverse lookup tables + if ($csType & 0x801) { + $conv = LoadCharset($charset); + unless ($conv) { + $et->Warn("Missing charset $charset") if $et; + return ''; + } + $inv = $unicode2byte{$charset}; + # generate inverse lookup if necessary + unless ($inv) { + if (not $csType or $csType & 0x802) { + $et->Warn("Invalid destination charset $charset") if $et; + return ''; + } + # prepare table to convert from Unicode to 1-byte characters + my ($char, %inv); + foreach $char (keys %$conv) { + $inv{$$conv{$char}} = $char; + } + $inv = $unicode2byte{$charset} = \%inv; + } + } + if ($csType & 0x100) { # 1-byte fixed-width + # convert to specified character set + foreach (@$uni) { + next if $_ < 0x80; + $$inv{$_} and $_ = $$inv{$_}, next; + # our tables omit 1-byte characters with the same values as Unicode, + # so pass them straight through after making sure there isn't a + # different character with this byte value + next if $_ < 0x100 and not $$conv{$_}; + $_ = ord('?'); # set invalid characters to '?' + if ($et and not $$et{EncodingError}) { + $et->Warn("Some character(s) could not be encoded in $charset"); + $$et{EncodingError} = 1; + } + } + # repack as an 8-bit string and truncate at null + $outVal = pack('C*', @$uni); + $outVal =~ s/\0.*//s; + } else { # 2-byte and 4-byte fixed-width + # convert if required + if ($inv) { + $$inv{$_} and $_ = $$inv{$_} foreach @$uni; + } + # generate surrogate pairs of UTF-16 + if ($charset eq 'UTF16') { + my $i; + for ($i=0; $i<@$uni; ++$i) { + next unless $$uni[$i] >= 0x10000 and $$uni[$i] < 0x10ffff; + my $t = $$uni[$i] - 0x10000; + my $w1 = 0xd800 + (($t >> 10) & 0x3ff); + my $w2 = 0xdc00 + ($t & 0x3ff); + splice(@$uni, $i, 1, $w1, $w2); + ++$i; # skip surrogate pair + } + } + # pack as 2- or 4-byte integer in specified byte order + my $byteOrder = $_[3] || GetByteOrder(); + my $fmt = $byteOrder eq 'MM' ? 'n*' : 'v*'; + $fmt = uc($fmt) if $csType & 0x400; + $outVal = pack($fmt, @$uni); + } + return $outVal; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Charset - ExifTool character encoding routines + +=head1 SYNOPSIS + +This module is required by Image::ExifTool. + +=head1 DESCRIPTION + +This module contains routines used by ExifTool to translate special +character sets. Currently, the following character sets are supported: + + UTF8, UTF16, UCS2, UCS4, Arabic, Baltic, Cyrillic, Greek, Hebrew, JIS, + Latin, Latin2, DOSLatinUS, DOSLatin1, DOSCyrillic, MacArabic, + MacChineseCN, MacChineseTW, MacCroatian, MacCyrillic, MacGreek, MacHebrew, + MacIceland, MacJapanese, MacKorean, MacLatin2, MacRSymbol, MacRoman, + MacRomanian, MacThai, MacTurkish, PDFDoc, RSymbol, ShiftJIS, Symbol, Thai, + Turkish, Vietnam + +However, only some of these character sets are available to the user via +ExifTool options -- the multi-byte character sets are used only internally +when decoding certain types of information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Charset/Arabic.pm b/lib/Image/ExifTool/Charset/Arabic.pm new file mode 100644 index 0000000..513492f --- /dev/null +++ b/lib/Image/ExifTool/Charset/Arabic.pm @@ -0,0 +1,39 @@ +#------------------------------------------------------------------------------ +# File: Arabic.pm +# +# Description: cp1256 to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1256.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::Arabic = ( + 0x80 => 0x20ac, 0x81 => 0x067e, 0x82 => 0x201a, 0x83 => 0x0192, + 0x84 => 0x201e, 0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021, + 0x88 => 0x02c6, 0x89 => 0x2030, 0x8a => 0x0679, 0x8b => 0x2039, + 0x8c => 0x0152, 0x8d => 0x0686, 0x8e => 0x0698, 0x8f => 0x0688, + 0x90 => 0x06af, 0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c, + 0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014, + 0x98 => 0x06a9, 0x99 => 0x2122, 0x9a => 0x0691, 0x9b => 0x203a, + 0x9c => 0x0153, 0x9d => 0x200c, 0x9e => 0x200d, 0x9f => 0x06ba, + 0xa1 => 0x060c, 0xaa => 0x06be, 0xba => 0x061b, 0xbf => 0x061f, + 0xc0 => 0x06c1, 0xc1 => 0x0621, 0xc2 => 0x0622, 0xc3 => 0x0623, + 0xc4 => 0x0624, 0xc5 => 0x0625, 0xc6 => 0x0626, 0xc7 => 0x0627, + 0xc8 => 0x0628, 0xc9 => 0x0629, 0xca => 0x062a, 0xcb => 0x062b, + 0xcc => 0x062c, 0xcd => 0x062d, 0xce => 0x062e, 0xcf => 0x062f, + 0xd0 => 0x0630, 0xd1 => 0x0631, 0xd2 => 0x0632, 0xd3 => 0x0633, + 0xd4 => 0x0634, 0xd5 => 0x0635, 0xd6 => 0x0636, 0xd8 => 0x0637, + 0xd9 => 0x0638, 0xda => 0x0639, 0xdb => 0x063a, 0xdc => 0x0640, + 0xdd => 0x0641, 0xde => 0x0642, 0xdf => 0x0643, 0xe1 => 0x0644, + 0xe3 => 0x0645, 0xe4 => 0x0646, 0xe5 => 0x0647, 0xe6 => 0x0648, + 0xec => 0x0649, 0xed => 0x064a, 0xf0 => 0x064b, 0xf1 => 0x064c, + 0xf2 => 0x064d, 0xf3 => 0x064e, 0xf5 => 0x064f, 0xf6 => 0x0650, + 0xf8 => 0x0651, 0xfa => 0x0652, 0xfd => 0x200e, 0xfe => 0x200f, + 0xff => 0x06d2, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/Baltic.pm b/lib/Image/ExifTool/Charset/Baltic.pm new file mode 100644 index 0000000..4ed0a10 --- /dev/null +++ b/lib/Image/ExifTool/Charset/Baltic.pm @@ -0,0 +1,35 @@ +#------------------------------------------------------------------------------ +# File: Baltic.pm +# +# Description: cp1257 to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1257.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::Baltic = ( + 0x80 => 0x20ac, 0x82 => 0x201a, 0x84 => 0x201e, 0x85 => 0x2026, + 0x86 => 0x2020, 0x87 => 0x2021, 0x89 => 0x2030, 0x8b => 0x2039, 0x8d => 0xa8, + 0x8e => 0x02c7, 0x8f => 0xb8, 0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c, + 0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014, + 0x99 => 0x2122, 0x9b => 0x203a, 0x9d => 0xaf, 0x9e => 0x02db, 0xa8 => 0xd8, + 0xaa => 0x0156, 0xaf => 0xc6, 0xb8 => 0xf8, 0xba => 0x0157, 0xbf => 0xe6, + 0xc0 => 0x0104, 0xc1 => 0x012e, 0xc2 => 0x0100, 0xc3 => 0x0106, + 0xc6 => 0x0118, 0xc7 => 0x0112, 0xc8 => 0x010c, 0xca => 0x0179, + 0xcb => 0x0116, 0xcc => 0x0122, 0xcd => 0x0136, 0xce => 0x012a, + 0xcf => 0x013b, 0xd0 => 0x0160, 0xd1 => 0x0143, 0xd2 => 0x0145, + 0xd4 => 0x014c, 0xd8 => 0x0172, 0xd9 => 0x0141, 0xda => 0x015a, + 0xdb => 0x016a, 0xdd => 0x017b, 0xde => 0x017d, 0xe0 => 0x0105, + 0xe1 => 0x012f, 0xe2 => 0x0101, 0xe3 => 0x0107, 0xe6 => 0x0119, + 0xe7 => 0x0113, 0xe8 => 0x010d, 0xea => 0x017a, 0xeb => 0x0117, + 0xec => 0x0123, 0xed => 0x0137, 0xee => 0x012b, 0xef => 0x013c, + 0xf0 => 0x0161, 0xf1 => 0x0144, 0xf2 => 0x0146, 0xf4 => 0x014d, + 0xf8 => 0x0173, 0xf9 => 0x0142, 0xfa => 0x015b, 0xfb => 0x016b, + 0xfd => 0x017c, 0xfe => 0x017e, 0xff => 0x02d9, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/Cyrillic.pm b/lib/Image/ExifTool/Charset/Cyrillic.pm new file mode 100644 index 0000000..f7972d6 --- /dev/null +++ b/lib/Image/ExifTool/Charset/Cyrillic.pm @@ -0,0 +1,45 @@ +#------------------------------------------------------------------------------ +# File: Cyrillic.pm +# +# Description: cp1251 to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::Cyrillic = ( + 0x80 => 0x0402, 0x81 => 0x0403, 0x82 => 0x201a, 0x83 => 0x0453, + 0x84 => 0x201e, 0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021, + 0x88 => 0x20ac, 0x89 => 0x2030, 0x8a => 0x0409, 0x8b => 0x2039, + 0x8c => 0x040a, 0x8d => 0x040c, 0x8e => 0x040b, 0x8f => 0x040f, + 0x90 => 0x0452, 0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c, + 0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014, + 0x99 => 0x2122, 0x9a => 0x0459, 0x9b => 0x203a, 0x9c => 0x045a, + 0x9d => 0x045c, 0x9e => 0x045b, 0x9f => 0x045f, 0xa1 => 0x040e, + 0xa2 => 0x045e, 0xa3 => 0x0408, 0xa5 => 0x0490, 0xa8 => 0x0401, + 0xaa => 0x0404, 0xaf => 0x0407, 0xb2 => 0x0406, 0xb3 => 0x0456, + 0xb4 => 0x0491, 0xb8 => 0x0451, 0xb9 => 0x2116, 0xba => 0x0454, + 0xbc => 0x0458, 0xbd => 0x0405, 0xbe => 0x0455, 0xbf => 0x0457, + 0xc0 => 0x0410, 0xc1 => 0x0411, 0xc2 => 0x0412, 0xc3 => 0x0413, + 0xc4 => 0x0414, 0xc5 => 0x0415, 0xc6 => 0x0416, 0xc7 => 0x0417, + 0xc8 => 0x0418, 0xc9 => 0x0419, 0xca => 0x041a, 0xcb => 0x041b, + 0xcc => 0x041c, 0xcd => 0x041d, 0xce => 0x041e, 0xcf => 0x041f, + 0xd0 => 0x0420, 0xd1 => 0x0421, 0xd2 => 0x0422, 0xd3 => 0x0423, + 0xd4 => 0x0424, 0xd5 => 0x0425, 0xd6 => 0x0426, 0xd7 => 0x0427, + 0xd8 => 0x0428, 0xd9 => 0x0429, 0xda => 0x042a, 0xdb => 0x042b, + 0xdc => 0x042c, 0xdd => 0x042d, 0xde => 0x042e, 0xdf => 0x042f, + 0xe0 => 0x0430, 0xe1 => 0x0431, 0xe2 => 0x0432, 0xe3 => 0x0433, + 0xe4 => 0x0434, 0xe5 => 0x0435, 0xe6 => 0x0436, 0xe7 => 0x0437, + 0xe8 => 0x0438, 0xe9 => 0x0439, 0xea => 0x043a, 0xeb => 0x043b, + 0xec => 0x043c, 0xed => 0x043d, 0xee => 0x043e, 0xef => 0x043f, + 0xf0 => 0x0440, 0xf1 => 0x0441, 0xf2 => 0x0442, 0xf3 => 0x0443, + 0xf4 => 0x0444, 0xf5 => 0x0445, 0xf6 => 0x0446, 0xf7 => 0x0447, + 0xf8 => 0x0448, 0xf9 => 0x0449, 0xfa => 0x044a, 0xfb => 0x044b, + 0xfc => 0x044c, 0xfd => 0x044d, 0xfe => 0x044e, 0xff => 0x044f, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/DOSCyrillic.pm b/lib/Image/ExifTool/Charset/DOSCyrillic.pm new file mode 100644 index 0000000..1ecc66a --- /dev/null +++ b/lib/Image/ExifTool/Charset/DOSCyrillic.pm @@ -0,0 +1,49 @@ +#------------------------------------------------------------------------------ +# File: DOSCyrillic.pm +# +# Description: cp866 to Unicode +# +# Revisions: 2020/03/23 - P. Harvey created +# +# References: 1) https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP866.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::DOSCyrillic = ( + 0x80 => 0x0410, 0x81 => 0x0411, 0x82 => 0x0412, 0x83 => 0x0413, + 0x84 => 0x0414, 0x85 => 0x0415, 0x86 => 0x0416, 0x87 => 0x0417, + 0x88 => 0x0418, 0x89 => 0x0419, 0x8a => 0x041a, 0x8b => 0x041b, + 0x8c => 0x041c, 0x8d => 0x041d, 0x8e => 0x041e, 0x8f => 0x041f, + 0x90 => 0x0420, 0x91 => 0x0421, 0x92 => 0x0422, 0x93 => 0x0423, + 0x94 => 0x0424, 0x95 => 0x0425, 0x96 => 0x0426, 0x97 => 0x0427, + 0x98 => 0x0428, 0x99 => 0x0429, 0x9a => 0x042a, 0x9b => 0x042b, + 0x9c => 0x042c, 0x9d => 0x042d, 0x9e => 0x042e, 0x9f => 0x042f, + 0xa0 => 0x0430, 0xa1 => 0x0431, 0xa2 => 0x0432, 0xa3 => 0x0433, + 0xa4 => 0x0434, 0xa5 => 0x0435, 0xa6 => 0x0436, 0xa7 => 0x0437, + 0xa8 => 0x0438, 0xa9 => 0x0439, 0xaa => 0x043a, 0xab => 0x043b, + 0xac => 0x043c, 0xad => 0x043d, 0xae => 0x043e, 0xaf => 0x043f, + 0xb0 => 0x2591, 0xb1 => 0x2592, 0xb2 => 0x2593, 0xb3 => 0x2502, + 0xb4 => 0x2524, 0xb5 => 0x2561, 0xb6 => 0x2562, 0xb7 => 0x2556, + 0xb8 => 0x2555, 0xb9 => 0x2563, 0xba => 0x2551, 0xbb => 0x2557, + 0xbc => 0x255d, 0xbd => 0x255c, 0xbe => 0x255b, 0xbf => 0x2510, + 0xc0 => 0x2514, 0xc1 => 0x2534, 0xc2 => 0x252c, 0xc3 => 0x251c, + 0xc4 => 0x2500, 0xc5 => 0x253c, 0xc6 => 0x255e, 0xc7 => 0x255f, + 0xc8 => 0x255a, 0xc9 => 0x2554, 0xca => 0x2569, 0xcb => 0x2566, + 0xcc => 0x2560, 0xcd => 0x2550, 0xce => 0x256c, 0xcf => 0x2567, + 0xd0 => 0x2568, 0xd1 => 0x2564, 0xd2 => 0x2565, 0xd3 => 0x2559, + 0xd4 => 0x2558, 0xd5 => 0x2552, 0xd6 => 0x2553, 0xd7 => 0x256b, + 0xd8 => 0x256a, 0xd9 => 0x2518, 0xda => 0x250c, 0xdb => 0x2588, + 0xdc => 0x2584, 0xdd => 0x258c, 0xde => 0x2590, 0xdf => 0x2580, + 0xe0 => 0x0440, 0xe1 => 0x0441, 0xe2 => 0x0442, 0xe3 => 0x0443, + 0xe4 => 0x0444, 0xe5 => 0x0445, 0xe6 => 0x0446, 0xe7 => 0x0447, + 0xe8 => 0x0448, 0xe9 => 0x0449, 0xea => 0x044a, 0xeb => 0x044b, + 0xec => 0x044c, 0xed => 0x044d, 0xee => 0x044e, 0xef => 0x044f, + 0xf0 => 0x0401, 0xf1 => 0x0451, 0xf2 => 0x0404, 0xf3 => 0x0454, + 0xf4 => 0x0407, 0xf5 => 0x0457, 0xf6 => 0x040e, 0xf7 => 0x045e, + 0xf8 => 0x00b0, 0xf9 => 0x2219, 0xfa => 0x00b7, 0xfb => 0x221a, + 0xfc => 0x2116, 0xfd => 0x00a4, 0xfe => 0x25a0, 0xff => 0x00a0, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/DOSLatin1.pm b/lib/Image/ExifTool/Charset/DOSLatin1.pm new file mode 100644 index 0000000..2e3fd15 --- /dev/null +++ b/lib/Image/ExifTool/Charset/DOSLatin1.pm @@ -0,0 +1,49 @@ +#------------------------------------------------------------------------------ +# File: DOSLatin1.pm +# +# Description: cp850 to Unicode +# +# Revisions: 2017/10/31- P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP850.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::DOSLatin1 = ( + 0x80 => 0x00c7, 0x81 => 0x00fc, 0x82 => 0x00e9, 0x83 => 0x00e2, + 0x84 => 0x00e4, 0x85 => 0x00e0, 0x86 => 0x00e5, 0x87 => 0x00e7, + 0x88 => 0x00ea, 0x89 => 0x00eb, 0x8a => 0x00e8, 0x8b => 0x00ef, + 0x8c => 0x00ee, 0x8d => 0x00ec, 0x8e => 0x00c4, 0x8f => 0x00c5, + 0x90 => 0x00c9, 0x91 => 0x00e6, 0x92 => 0x00c6, 0x93 => 0x00f4, + 0x94 => 0x00f6, 0x95 => 0x00f2, 0x96 => 0x00fb, 0x97 => 0x00f9, + 0x98 => 0x00ff, 0x99 => 0x00d6, 0x9a => 0x00dc, 0x9b => 0x00f8, + 0x9c => 0x00a3, 0x9d => 0x00d8, 0x9e => 0x00d7, 0x9f => 0x0192, + 0xa0 => 0x00e1, 0xa1 => 0x00ed, 0xa2 => 0x00f3, 0xa3 => 0x00fa, + 0xa4 => 0x00f1, 0xa5 => 0x00d1, 0xa6 => 0x00aa, 0xa7 => 0x00ba, + 0xa8 => 0x00bf, 0xa9 => 0x00ae, 0xaa => 0x00ac, 0xab => 0x00bd, + 0xac => 0x00bc, 0xad => 0x00a1, 0xae => 0x00ab, 0xaf => 0x00bb, + 0xb0 => 0x2591, 0xb1 => 0x2592, 0xb2 => 0x2593, 0xb3 => 0x2502, + 0xb4 => 0x2524, 0xb5 => 0x00c1, 0xb6 => 0x00c2, 0xb7 => 0x00c0, + 0xb8 => 0x00a9, 0xb9 => 0x2563, 0xba => 0x2551, 0xbb => 0x2557, + 0xbc => 0x255d, 0xbd => 0x00a2, 0xbe => 0x00a5, 0xbf => 0x2510, + 0xc0 => 0x2514, 0xc1 => 0x2534, 0xc2 => 0x252c, 0xc3 => 0x251c, + 0xc4 => 0x2500, 0xc5 => 0x253c, 0xc6 => 0x00e3, 0xc7 => 0x00c3, + 0xc8 => 0x255a, 0xc9 => 0x2554, 0xca => 0x2569, 0xcb => 0x2566, + 0xcc => 0x2560, 0xcd => 0x2550, 0xce => 0x256c, 0xcf => 0x00a4, + 0xd0 => 0x00f0, 0xd1 => 0x00d0, 0xd2 => 0x00ca, 0xd3 => 0x00cb, + 0xd4 => 0x00c8, 0xd5 => 0x0131, 0xd6 => 0x00cd, 0xd7 => 0x00ce, + 0xd8 => 0x00cf, 0xd9 => 0x2518, 0xda => 0x250c, 0xdb => 0x2588, + 0xdc => 0x2584, 0xdd => 0x00a6, 0xde => 0x00cc, 0xdf => 0x2580, + 0xe0 => 0x00d3, 0xe1 => 0x00df, 0xe2 => 0x00d4, 0xe3 => 0x00d2, + 0xe4 => 0x00f5, 0xe5 => 0x00d5, 0xe6 => 0x00b5, 0xe7 => 0x00fe, + 0xe8 => 0x00de, 0xe9 => 0x00da, 0xea => 0x00db, 0xeb => 0x00d9, + 0xec => 0x00fd, 0xed => 0x00dd, 0xee => 0x00af, 0xef => 0x00b4, + 0xf0 => 0x00ad, 0xf1 => 0x00b1, 0xf2 => 0x2017, 0xf3 => 0x00be, + 0xf4 => 0x00b6, 0xf5 => 0x00a7, 0xf6 => 0x00f7, 0xf7 => 0x00b8, + 0xf8 => 0x00b0, 0xf9 => 0x00a8, 0xfa => 0x00b7, 0xfb => 0x00b9, + 0xfc => 0x00b3, 0xfd => 0x00b2, 0xfe => 0x25a0, 0xff => 0x00a0, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/DOSLatinUS.pm b/lib/Image/ExifTool/Charset/DOSLatinUS.pm new file mode 100644 index 0000000..7f76823 --- /dev/null +++ b/lib/Image/ExifTool/Charset/DOSLatinUS.pm @@ -0,0 +1,49 @@ +#------------------------------------------------------------------------------ +# File: DOSLatinUS.pm +# +# Description: cp437 to Unicode +# +# Revisions: 2017/10/31- P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP437.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::DOSLatinUS = ( + 0x80 => 0x00c7, 0x81 => 0x00fc, 0x82 => 0x00e9, 0x83 => 0x00e2, + 0x84 => 0x00e4, 0x85 => 0x00e0, 0x86 => 0x00e5, 0x87 => 0x00e7, + 0x88 => 0x00ea, 0x89 => 0x00eb, 0x8a => 0x00e8, 0x8b => 0x00ef, + 0x8c => 0x00ee, 0x8d => 0x00ec, 0x8e => 0x00c4, 0x8f => 0x00c5, + 0x90 => 0x00c9, 0x91 => 0x00e6, 0x92 => 0x00c6, 0x93 => 0x00f4, + 0x94 => 0x00f6, 0x95 => 0x00f2, 0x96 => 0x00fb, 0x97 => 0x00f9, + 0x98 => 0x00ff, 0x99 => 0x00d6, 0x9a => 0x00dc, 0x9b => 0x00a2, + 0x9c => 0x00a3, 0x9d => 0x00a5, 0x9e => 0x20a7, 0x9f => 0x0192, + 0xa0 => 0x00e1, 0xa1 => 0x00ed, 0xa2 => 0x00f3, 0xa3 => 0x00fa, + 0xa4 => 0x00f1, 0xa5 => 0x00d1, 0xa6 => 0x00aa, 0xa7 => 0x00ba, + 0xa8 => 0x00bf, 0xa9 => 0x2310, 0xaa => 0x00ac, 0xab => 0x00bd, + 0xac => 0x00bc, 0xad => 0x00a1, 0xae => 0x00ab, 0xaf => 0x00bb, + 0xb0 => 0x2591, 0xb1 => 0x2592, 0xb2 => 0x2593, 0xb3 => 0x2502, + 0xb4 => 0x2524, 0xb5 => 0x2561, 0xb6 => 0x2562, 0xb7 => 0x2556, + 0xb8 => 0x2555, 0xb9 => 0x2563, 0xba => 0x2551, 0xbb => 0x2557, + 0xbc => 0x255d, 0xbd => 0x255c, 0xbe => 0x255b, 0xbf => 0x2510, + 0xc0 => 0x2514, 0xc1 => 0x2534, 0xc2 => 0x252c, 0xc3 => 0x251c, + 0xc4 => 0x2500, 0xc5 => 0x253c, 0xc6 => 0x255e, 0xc7 => 0x255f, + 0xc8 => 0x255a, 0xc9 => 0x2554, 0xca => 0x2569, 0xcb => 0x2566, + 0xcc => 0x2560, 0xcd => 0x2550, 0xce => 0x256c, 0xcf => 0x2567, + 0xd0 => 0x2568, 0xd1 => 0x2564, 0xd2 => 0x2565, 0xd3 => 0x2559, + 0xd4 => 0x2558, 0xd5 => 0x2552, 0xd6 => 0x2553, 0xd7 => 0x256b, + 0xd8 => 0x256a, 0xd9 => 0x2518, 0xda => 0x250c, 0xdb => 0x2588, + 0xdc => 0x2584, 0xdd => 0x258c, 0xde => 0x2590, 0xdf => 0x2580, + 0xe0 => 0x03b1, 0xe1 => 0x00df, 0xe2 => 0x0393, 0xe3 => 0x03c0, + 0xe4 => 0x03a3, 0xe5 => 0x03c3, 0xe6 => 0x00b5, 0xe7 => 0x03c4, + 0xe8 => 0x03a6, 0xe9 => 0x0398, 0xea => 0x03a9, 0xeb => 0x03b4, + 0xec => 0x221e, 0xed => 0x03c6, 0xee => 0x03b5, 0xef => 0x2229, + 0xf0 => 0x2261, 0xf1 => 0x00b1, 0xf2 => 0x2265, 0xf3 => 0x2264, + 0xf4 => 0x2320, 0xf5 => 0x2321, 0xf6 => 0x00f7, 0xf7 => 0x2248, + 0xf8 => 0x00b0, 0xf9 => 0x2219, 0xfa => 0x00b7, 0xfb => 0x221a, + 0xfc => 0x207f, 0xfd => 0x00b2, 0xfe => 0x25a0, 0xff => 0x00a0, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/Greek.pm b/lib/Image/ExifTool/Charset/Greek.pm new file mode 100644 index 0000000..a1bcb8e --- /dev/null +++ b/lib/Image/ExifTool/Charset/Greek.pm @@ -0,0 +1,40 @@ +#------------------------------------------------------------------------------ +# File: Greek.pm +# +# Description: cp1253 to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1253.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::Greek = ( + 0x80 => 0x20ac, 0x82 => 0x201a, 0x83 => 0x0192, 0x84 => 0x201e, + 0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021, 0x89 => 0x2030, + 0x8b => 0x2039, 0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c, + 0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014, + 0x99 => 0x2122, 0x9b => 0x203a, 0xa1 => 0x0385, 0xa2 => 0x0386, + 0xaf => 0x2015, 0xb4 => 0x0384, 0xb8 => 0x0388, 0xb9 => 0x0389, + 0xba => 0x038a, 0xbc => 0x038c, 0xbe => 0x038e, 0xbf => 0x038f, + 0xc0 => 0x0390, 0xc1 => 0x0391, 0xc2 => 0x0392, 0xc3 => 0x0393, + 0xc4 => 0x0394, 0xc5 => 0x0395, 0xc6 => 0x0396, 0xc7 => 0x0397, + 0xc8 => 0x0398, 0xc9 => 0x0399, 0xca => 0x039a, 0xcb => 0x039b, + 0xcc => 0x039c, 0xcd => 0x039d, 0xce => 0x039e, 0xcf => 0x039f, + 0xd0 => 0x03a0, 0xd1 => 0x03a1, 0xd3 => 0x03a3, 0xd4 => 0x03a4, + 0xd5 => 0x03a5, 0xd6 => 0x03a6, 0xd7 => 0x03a7, 0xd8 => 0x03a8, + 0xd9 => 0x03a9, 0xda => 0x03aa, 0xdb => 0x03ab, 0xdc => 0x03ac, + 0xdd => 0x03ad, 0xde => 0x03ae, 0xdf => 0x03af, 0xe0 => 0x03b0, + 0xe1 => 0x03b1, 0xe2 => 0x03b2, 0xe3 => 0x03b3, 0xe4 => 0x03b4, + 0xe5 => 0x03b5, 0xe6 => 0x03b6, 0xe7 => 0x03b7, 0xe8 => 0x03b8, + 0xe9 => 0x03b9, 0xea => 0x03ba, 0xeb => 0x03bb, 0xec => 0x03bc, + 0xed => 0x03bd, 0xee => 0x03be, 0xef => 0x03bf, 0xf0 => 0x03c0, + 0xf1 => 0x03c1, 0xf2 => 0x03c2, 0xf3 => 0x03c3, 0xf4 => 0x03c4, + 0xf5 => 0x03c5, 0xf6 => 0x03c6, 0xf7 => 0x03c7, 0xf8 => 0x03c8, + 0xf9 => 0x03c9, 0xfa => 0x03ca, 0xfb => 0x03cb, 0xfc => 0x03cc, + 0xfd => 0x03cd, 0xfe => 0x03ce, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/Hebrew.pm b/lib/Image/ExifTool/Charset/Hebrew.pm new file mode 100644 index 0000000..6cebced --- /dev/null +++ b/lib/Image/ExifTool/Charset/Hebrew.pm @@ -0,0 +1,36 @@ +#------------------------------------------------------------------------------ +# File: Hebrew.pm +# +# Description: cp1255 to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1255.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::Hebrew = ( + 0x80 => 0x20ac, 0x82 => 0x201a, 0x83 => 0x0192, 0x84 => 0x201e, + 0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021, 0x88 => 0x02c6, + 0x89 => 0x2030, 0x8b => 0x2039, 0x91 => 0x2018, 0x92 => 0x2019, + 0x93 => 0x201c, 0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, + 0x97 => 0x2014, 0x98 => 0x02dc, 0x99 => 0x2122, 0x9b => 0x203a, + 0xa4 => 0x20aa, 0xaa => 0xd7, 0xba => 0xf7, 0xc0 => 0x05b0, 0xc1 => 0x05b1, + 0xc2 => 0x05b2, 0xc3 => 0x05b3, 0xc4 => 0x05b4, 0xc5 => 0x05b5, + 0xc6 => 0x05b6, 0xc7 => 0x05b7, 0xc8 => 0x05b8, 0xc9 => 0x05b9, + 0xcb => 0x05bb, 0xcc => 0x05bc, 0xcd => 0x05bd, 0xce => 0x05be, + 0xcf => 0x05bf, 0xd0 => 0x05c0, 0xd1 => 0x05c1, 0xd2 => 0x05c2, + 0xd3 => 0x05c3, 0xd4 => 0x05f0, 0xd5 => 0x05f1, 0xd6 => 0x05f2, + 0xd7 => 0x05f3, 0xd8 => 0x05f4, 0xe0 => 0x05d0, 0xe1 => 0x05d1, + 0xe2 => 0x05d2, 0xe3 => 0x05d3, 0xe4 => 0x05d4, 0xe5 => 0x05d5, + 0xe6 => 0x05d6, 0xe7 => 0x05d7, 0xe8 => 0x05d8, 0xe9 => 0x05d9, + 0xea => 0x05da, 0xeb => 0x05db, 0xec => 0x05dc, 0xed => 0x05dd, + 0xee => 0x05de, 0xef => 0x05df, 0xf0 => 0x05e0, 0xf1 => 0x05e1, + 0xf2 => 0x05e2, 0xf3 => 0x05e3, 0xf4 => 0x05e4, 0xf5 => 0x05e5, + 0xf6 => 0x05e6, 0xf7 => 0x05e7, 0xf8 => 0x05e8, 0xf9 => 0x05e9, + 0xfa => 0x05ea, 0xfd => 0x200e, 0xfe => 0x200f, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/JIS.pm b/lib/Image/ExifTool/Charset/JIS.pm new file mode 100644 index 0000000..d4411cb --- /dev/null +++ b/lib/Image/ExifTool/Charset/JIS.pm @@ -0,0 +1,1735 @@ +#------------------------------------------------------------------------------ +# File: JIS.pm +# +# Description: JIS X 0208 (1990) to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0208.TXT +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::JIS = ( + 0x2121 => 0x3000, 0x2122 => 0x3001, 0x2123 => 0x3002, 0x2124 => 0xff0c, + 0x2125 => 0xff0e, 0x2126 => 0x30fb, 0x2127 => 0xff1a, 0x2128 => 0xff1b, + 0x2129 => 0xff1f, 0x212a => 0xff01, 0x212b => 0x309b, 0x212c => 0x309c, + 0x212d => 0x00b4, 0x212e => 0xff40, 0x212f => 0x00a8, 0x2130 => 0xff3e, + 0x2131 => 0xffe3, 0x2132 => 0xff3f, 0x2133 => 0x30fd, 0x2134 => 0x30fe, + 0x2135 => 0x309d, 0x2136 => 0x309e, 0x2137 => 0x3003, 0x2138 => 0x4edd, + 0x2139 => 0x3005, 0x213a => 0x3006, 0x213b => 0x3007, 0x213c => 0x30fc, + 0x213d => 0x2015, 0x213e => 0x2010, 0x213f => 0xff0f, 0x2140 => 0x005c, + 0x2141 => 0x301c, 0x2142 => 0x2016, 0x2143 => 0xff5c, 0x2144 => 0x2026, + 0x2145 => 0x2025, 0x2146 => 0x2018, 0x2147 => 0x2019, 0x2148 => 0x201c, + 0x2149 => 0x201d, 0x214a => 0xff08, 0x214b => 0xff09, 0x214c => 0x3014, + 0x214d => 0x3015, 0x214e => 0xff3b, 0x214f => 0xff3d, 0x2150 => 0xff5b, + 0x2151 => 0xff5d, 0x2152 => 0x3008, 0x2153 => 0x3009, 0x2154 => 0x300a, + 0x2155 => 0x300b, 0x2156 => 0x300c, 0x2157 => 0x300d, 0x2158 => 0x300e, + 0x2159 => 0x300f, 0x215a => 0x3010, 0x215b => 0x3011, 0x215c => 0xff0b, + 0x215d => 0x2212, 0x215e => 0x00b1, 0x215f => 0x00d7, 0x2160 => 0x00f7, + 0x2161 => 0xff1d, 0x2162 => 0x2260, 0x2163 => 0xff1c, 0x2164 => 0xff1e, + 0x2165 => 0x2266, 0x2166 => 0x2267, 0x2167 => 0x221e, 0x2168 => 0x2234, + 0x2169 => 0x2642, 0x216a => 0x2640, 0x216b => 0x00b0, 0x216c => 0x2032, + 0x216d => 0x2033, 0x216e => 0x2103, 0x216f => 0xffe5, 0x2170 => 0xff04, + 0x2171 => 0x00a2, 0x2172 => 0x00a3, 0x2173 => 0xff05, 0x2174 => 0xff03, + 0x2175 => 0xff06, 0x2176 => 0xff0a, 0x2177 => 0xff20, 0x2178 => 0x00a7, + 0x2179 => 0x2606, 0x217a => 0x2605, 0x217b => 0x25cb, 0x217c => 0x25cf, + 0x217d => 0x25ce, 0x217e => 0x25c7, 0x2221 => 0x25c6, 0x2222 => 0x25a1, + 0x2223 => 0x25a0, 0x2224 => 0x25b3, 0x2225 => 0x25b2, 0x2226 => 0x25bd, + 0x2227 => 0x25bc, 0x2228 => 0x203b, 0x2229 => 0x3012, 0x222a => 0x2192, + 0x222b => 0x2190, 0x222c => 0x2191, 0x222d => 0x2193, 0x222e => 0x3013, + 0x223a => 0x2208, 0x223b => 0x220b, 0x223c => 0x2286, 0x223d => 0x2287, + 0x223e => 0x2282, 0x223f => 0x2283, 0x2240 => 0x222a, 0x2241 => 0x2229, + 0x224a => 0x2227, 0x224b => 0x2228, 0x224c => 0x00ac, 0x224d => 0x21d2, + 0x224e => 0x21d4, 0x224f => 0x2200, 0x2250 => 0x2203, 0x225c => 0x2220, + 0x225d => 0x22a5, 0x225e => 0x2312, 0x225f => 0x2202, 0x2260 => 0x2207, + 0x2261 => 0x2261, 0x2262 => 0x2252, 0x2263 => 0x226a, 0x2264 => 0x226b, + 0x2265 => 0x221a, 0x2266 => 0x223d, 0x2267 => 0x221d, 0x2268 => 0x2235, + 0x2269 => 0x222b, 0x226a => 0x222c, 0x2272 => 0x212b, 0x2273 => 0x2030, + 0x2274 => 0x266f, 0x2275 => 0x266d, 0x2276 => 0x266a, 0x2277 => 0x2020, + 0x2278 => 0x2021, 0x2279 => 0x00b6, 0x227e => 0x25ef, 0x2330 => 0xff10, + 0x2331 => 0xff11, 0x2332 => 0xff12, 0x2333 => 0xff13, 0x2334 => 0xff14, + 0x2335 => 0xff15, 0x2336 => 0xff16, 0x2337 => 0xff17, 0x2338 => 0xff18, + 0x2339 => 0xff19, 0x2341 => 0xff21, 0x2342 => 0xff22, 0x2343 => 0xff23, + 0x2344 => 0xff24, 0x2345 => 0xff25, 0x2346 => 0xff26, 0x2347 => 0xff27, + 0x2348 => 0xff28, 0x2349 => 0xff29, 0x234a => 0xff2a, 0x234b => 0xff2b, + 0x234c => 0xff2c, 0x234d => 0xff2d, 0x234e => 0xff2e, 0x234f => 0xff2f, + 0x2350 => 0xff30, 0x2351 => 0xff31, 0x2352 => 0xff32, 0x2353 => 0xff33, + 0x2354 => 0xff34, 0x2355 => 0xff35, 0x2356 => 0xff36, 0x2357 => 0xff37, + 0x2358 => 0xff38, 0x2359 => 0xff39, 0x235a => 0xff3a, 0x2361 => 0xff41, + 0x2362 => 0xff42, 0x2363 => 0xff43, 0x2364 => 0xff44, 0x2365 => 0xff45, + 0x2366 => 0xff46, 0x2367 => 0xff47, 0x2368 => 0xff48, 0x2369 => 0xff49, + 0x236a => 0xff4a, 0x236b => 0xff4b, 0x236c => 0xff4c, 0x236d => 0xff4d, + 0x236e => 0xff4e, 0x236f => 0xff4f, 0x2370 => 0xff50, 0x2371 => 0xff51, + 0x2372 => 0xff52, 0x2373 => 0xff53, 0x2374 => 0xff54, 0x2375 => 0xff55, + 0x2376 => 0xff56, 0x2377 => 0xff57, 0x2378 => 0xff58, 0x2379 => 0xff59, + 0x237a => 0xff5a, 0x2421 => 0x3041, 0x2422 => 0x3042, 0x2423 => 0x3043, + 0x2424 => 0x3044, 0x2425 => 0x3045, 0x2426 => 0x3046, 0x2427 => 0x3047, + 0x2428 => 0x3048, 0x2429 => 0x3049, 0x242a => 0x304a, 0x242b => 0x304b, + 0x242c => 0x304c, 0x242d => 0x304d, 0x242e => 0x304e, 0x242f => 0x304f, + 0x2430 => 0x3050, 0x2431 => 0x3051, 0x2432 => 0x3052, 0x2433 => 0x3053, + 0x2434 => 0x3054, 0x2435 => 0x3055, 0x2436 => 0x3056, 0x2437 => 0x3057, + 0x2438 => 0x3058, 0x2439 => 0x3059, 0x243a => 0x305a, 0x243b => 0x305b, + 0x243c => 0x305c, 0x243d => 0x305d, 0x243e => 0x305e, 0x243f => 0x305f, + 0x2440 => 0x3060, 0x2441 => 0x3061, 0x2442 => 0x3062, 0x2443 => 0x3063, + 0x2444 => 0x3064, 0x2445 => 0x3065, 0x2446 => 0x3066, 0x2447 => 0x3067, + 0x2448 => 0x3068, 0x2449 => 0x3069, 0x244a => 0x306a, 0x244b => 0x306b, + 0x244c => 0x306c, 0x244d => 0x306d, 0x244e => 0x306e, 0x244f => 0x306f, + 0x2450 => 0x3070, 0x2451 => 0x3071, 0x2452 => 0x3072, 0x2453 => 0x3073, + 0x2454 => 0x3074, 0x2455 => 0x3075, 0x2456 => 0x3076, 0x2457 => 0x3077, + 0x2458 => 0x3078, 0x2459 => 0x3079, 0x245a => 0x307a, 0x245b => 0x307b, + 0x245c => 0x307c, 0x245d => 0x307d, 0x245e => 0x307e, 0x245f => 0x307f, + 0x2460 => 0x3080, 0x2461 => 0x3081, 0x2462 => 0x3082, 0x2463 => 0x3083, + 0x2464 => 0x3084, 0x2465 => 0x3085, 0x2466 => 0x3086, 0x2467 => 0x3087, + 0x2468 => 0x3088, 0x2469 => 0x3089, 0x246a => 0x308a, 0x246b => 0x308b, + 0x246c => 0x308c, 0x246d => 0x308d, 0x246e => 0x308e, 0x246f => 0x308f, + 0x2470 => 0x3090, 0x2471 => 0x3091, 0x2472 => 0x3092, 0x2473 => 0x3093, + 0x2521 => 0x30a1, 0x2522 => 0x30a2, 0x2523 => 0x30a3, 0x2524 => 0x30a4, + 0x2525 => 0x30a5, 0x2526 => 0x30a6, 0x2527 => 0x30a7, 0x2528 => 0x30a8, + 0x2529 => 0x30a9, 0x252a => 0x30aa, 0x252b => 0x30ab, 0x252c => 0x30ac, + 0x252d => 0x30ad, 0x252e => 0x30ae, 0x252f => 0x30af, 0x2530 => 0x30b0, + 0x2531 => 0x30b1, 0x2532 => 0x30b2, 0x2533 => 0x30b3, 0x2534 => 0x30b4, + 0x2535 => 0x30b5, 0x2536 => 0x30b6, 0x2537 => 0x30b7, 0x2538 => 0x30b8, + 0x2539 => 0x30b9, 0x253a => 0x30ba, 0x253b => 0x30bb, 0x253c => 0x30bc, + 0x253d => 0x30bd, 0x253e => 0x30be, 0x253f => 0x30bf, 0x2540 => 0x30c0, + 0x2541 => 0x30c1, 0x2542 => 0x30c2, 0x2543 => 0x30c3, 0x2544 => 0x30c4, + 0x2545 => 0x30c5, 0x2546 => 0x30c6, 0x2547 => 0x30c7, 0x2548 => 0x30c8, + 0x2549 => 0x30c9, 0x254a => 0x30ca, 0x254b => 0x30cb, 0x254c => 0x30cc, + 0x254d => 0x30cd, 0x254e => 0x30ce, 0x254f => 0x30cf, 0x2550 => 0x30d0, + 0x2551 => 0x30d1, 0x2552 => 0x30d2, 0x2553 => 0x30d3, 0x2554 => 0x30d4, + 0x2555 => 0x30d5, 0x2556 => 0x30d6, 0x2557 => 0x30d7, 0x2558 => 0x30d8, + 0x2559 => 0x30d9, 0x255a => 0x30da, 0x255b => 0x30db, 0x255c => 0x30dc, + 0x255d => 0x30dd, 0x255e => 0x30de, 0x255f => 0x30df, 0x2560 => 0x30e0, + 0x2561 => 0x30e1, 0x2562 => 0x30e2, 0x2563 => 0x30e3, 0x2564 => 0x30e4, + 0x2565 => 0x30e5, 0x2566 => 0x30e6, 0x2567 => 0x30e7, 0x2568 => 0x30e8, + 0x2569 => 0x30e9, 0x256a => 0x30ea, 0x256b => 0x30eb, 0x256c => 0x30ec, + 0x256d => 0x30ed, 0x256e => 0x30ee, 0x256f => 0x30ef, 0x2570 => 0x30f0, + 0x2571 => 0x30f1, 0x2572 => 0x30f2, 0x2573 => 0x30f3, 0x2574 => 0x30f4, + 0x2575 => 0x30f5, 0x2576 => 0x30f6, 0x2621 => 0x0391, 0x2622 => 0x0392, + 0x2623 => 0x0393, 0x2624 => 0x0394, 0x2625 => 0x0395, 0x2626 => 0x0396, + 0x2627 => 0x0397, 0x2628 => 0x0398, 0x2629 => 0x0399, 0x262a => 0x039a, + 0x262b => 0x039b, 0x262c => 0x039c, 0x262d => 0x039d, 0x262e => 0x039e, + 0x262f => 0x039f, 0x2630 => 0x03a0, 0x2631 => 0x03a1, 0x2632 => 0x03a3, + 0x2633 => 0x03a4, 0x2634 => 0x03a5, 0x2635 => 0x03a6, 0x2636 => 0x03a7, + 0x2637 => 0x03a8, 0x2638 => 0x03a9, 0x2641 => 0x03b1, 0x2642 => 0x03b2, + 0x2643 => 0x03b3, 0x2644 => 0x03b4, 0x2645 => 0x03b5, 0x2646 => 0x03b6, + 0x2647 => 0x03b7, 0x2648 => 0x03b8, 0x2649 => 0x03b9, 0x264a => 0x03ba, + 0x264b => 0x03bb, 0x264c => 0x03bc, 0x264d => 0x03bd, 0x264e => 0x03be, + 0x264f => 0x03bf, 0x2650 => 0x03c0, 0x2651 => 0x03c1, 0x2652 => 0x03c3, + 0x2653 => 0x03c4, 0x2654 => 0x03c5, 0x2655 => 0x03c6, 0x2656 => 0x03c7, + 0x2657 => 0x03c8, 0x2658 => 0x03c9, 0x2721 => 0x0410, 0x2722 => 0x0411, + 0x2723 => 0x0412, 0x2724 => 0x0413, 0x2725 => 0x0414, 0x2726 => 0x0415, + 0x2727 => 0x0401, 0x2728 => 0x0416, 0x2729 => 0x0417, 0x272a => 0x0418, + 0x272b => 0x0419, 0x272c => 0x041a, 0x272d => 0x041b, 0x272e => 0x041c, + 0x272f => 0x041d, 0x2730 => 0x041e, 0x2731 => 0x041f, 0x2732 => 0x0420, + 0x2733 => 0x0421, 0x2734 => 0x0422, 0x2735 => 0x0423, 0x2736 => 0x0424, + 0x2737 => 0x0425, 0x2738 => 0x0426, 0x2739 => 0x0427, 0x273a => 0x0428, + 0x273b => 0x0429, 0x273c => 0x042a, 0x273d => 0x042b, 0x273e => 0x042c, + 0x273f => 0x042d, 0x2740 => 0x042e, 0x2741 => 0x042f, 0x2751 => 0x0430, + 0x2752 => 0x0431, 0x2753 => 0x0432, 0x2754 => 0x0433, 0x2755 => 0x0434, + 0x2756 => 0x0435, 0x2757 => 0x0451, 0x2758 => 0x0436, 0x2759 => 0x0437, + 0x275a => 0x0438, 0x275b => 0x0439, 0x275c => 0x043a, 0x275d => 0x043b, + 0x275e => 0x043c, 0x275f => 0x043d, 0x2760 => 0x043e, 0x2761 => 0x043f, + 0x2762 => 0x0440, 0x2763 => 0x0441, 0x2764 => 0x0442, 0x2765 => 0x0443, + 0x2766 => 0x0444, 0x2767 => 0x0445, 0x2768 => 0x0446, 0x2769 => 0x0447, + 0x276a => 0x0448, 0x276b => 0x0449, 0x276c => 0x044a, 0x276d => 0x044b, + 0x276e => 0x044c, 0x276f => 0x044d, 0x2770 => 0x044e, 0x2771 => 0x044f, + 0x2821 => 0x2500, 0x2822 => 0x2502, 0x2823 => 0x250c, 0x2824 => 0x2510, + 0x2825 => 0x2518, 0x2826 => 0x2514, 0x2827 => 0x251c, 0x2828 => 0x252c, + 0x2829 => 0x2524, 0x282a => 0x2534, 0x282b => 0x253c, 0x282c => 0x2501, + 0x282d => 0x2503, 0x282e => 0x250f, 0x282f => 0x2513, 0x2830 => 0x251b, + 0x2831 => 0x2517, 0x2832 => 0x2523, 0x2833 => 0x2533, 0x2834 => 0x252b, + 0x2835 => 0x253b, 0x2836 => 0x254b, 0x2837 => 0x2520, 0x2838 => 0x252f, + 0x2839 => 0x2528, 0x283a => 0x2537, 0x283b => 0x253f, 0x283c => 0x251d, + 0x283d => 0x2530, 0x283e => 0x2525, 0x283f => 0x2538, 0x2840 => 0x2542, + 0x3021 => 0x4e9c, 0x3022 => 0x5516, 0x3023 => 0x5a03, 0x3024 => 0x963f, + 0x3025 => 0x54c0, 0x3026 => 0x611b, 0x3027 => 0x6328, 0x3028 => 0x59f6, + 0x3029 => 0x9022, 0x302a => 0x8475, 0x302b => 0x831c, 0x302c => 0x7a50, + 0x302d => 0x60aa, 0x302e => 0x63e1, 0x302f => 0x6e25, 0x3030 => 0x65ed, + 0x3031 => 0x8466, 0x3032 => 0x82a6, 0x3033 => 0x9bf5, 0x3034 => 0x6893, + 0x3035 => 0x5727, 0x3036 => 0x65a1, 0x3037 => 0x6271, 0x3038 => 0x5b9b, + 0x3039 => 0x59d0, 0x303a => 0x867b, 0x303b => 0x98f4, 0x303c => 0x7d62, + 0x303d => 0x7dbe, 0x303e => 0x9b8e, 0x303f => 0x6216, 0x3040 => 0x7c9f, + 0x3041 => 0x88b7, 0x3042 => 0x5b89, 0x3043 => 0x5eb5, 0x3044 => 0x6309, + 0x3045 => 0x6697, 0x3046 => 0x6848, 0x3047 => 0x95c7, 0x3048 => 0x978d, + 0x3049 => 0x674f, 0x304a => 0x4ee5, 0x304b => 0x4f0a, 0x304c => 0x4f4d, + 0x304d => 0x4f9d, 0x304e => 0x5049, 0x304f => 0x56f2, 0x3050 => 0x5937, + 0x3051 => 0x59d4, 0x3052 => 0x5a01, 0x3053 => 0x5c09, 0x3054 => 0x60df, + 0x3055 => 0x610f, 0x3056 => 0x6170, 0x3057 => 0x6613, 0x3058 => 0x6905, + 0x3059 => 0x70ba, 0x305a => 0x754f, 0x305b => 0x7570, 0x305c => 0x79fb, + 0x305d => 0x7dad, 0x305e => 0x7def, 0x305f => 0x80c3, 0x3060 => 0x840e, + 0x3061 => 0x8863, 0x3062 => 0x8b02, 0x3063 => 0x9055, 0x3064 => 0x907a, + 0x3065 => 0x533b, 0x3066 => 0x4e95, 0x3067 => 0x4ea5, 0x3068 => 0x57df, + 0x3069 => 0x80b2, 0x306a => 0x90c1, 0x306b => 0x78ef, 0x306c => 0x4e00, + 0x306d => 0x58f1, 0x306e => 0x6ea2, 0x306f => 0x9038, 0x3070 => 0x7a32, + 0x3071 => 0x8328, 0x3072 => 0x828b, 0x3073 => 0x9c2f, 0x3074 => 0x5141, + 0x3075 => 0x5370, 0x3076 => 0x54bd, 0x3077 => 0x54e1, 0x3078 => 0x56e0, + 0x3079 => 0x59fb, 0x307a => 0x5f15, 0x307b => 0x98f2, 0x307c => 0x6deb, + 0x307d => 0x80e4, 0x307e => 0x852d, 0x3121 => 0x9662, 0x3122 => 0x9670, + 0x3123 => 0x96a0, 0x3124 => 0x97fb, 0x3125 => 0x540b, 0x3126 => 0x53f3, + 0x3127 => 0x5b87, 0x3128 => 0x70cf, 0x3129 => 0x7fbd, 0x312a => 0x8fc2, + 0x312b => 0x96e8, 0x312c => 0x536f, 0x312d => 0x9d5c, 0x312e => 0x7aba, + 0x312f => 0x4e11, 0x3130 => 0x7893, 0x3131 => 0x81fc, 0x3132 => 0x6e26, + 0x3133 => 0x5618, 0x3134 => 0x5504, 0x3135 => 0x6b1d, 0x3136 => 0x851a, + 0x3137 => 0x9c3b, 0x3138 => 0x59e5, 0x3139 => 0x53a9, 0x313a => 0x6d66, + 0x313b => 0x74dc, 0x313c => 0x958f, 0x313d => 0x5642, 0x313e => 0x4e91, + 0x313f => 0x904b, 0x3140 => 0x96f2, 0x3141 => 0x834f, 0x3142 => 0x990c, + 0x3143 => 0x53e1, 0x3144 => 0x55b6, 0x3145 => 0x5b30, 0x3146 => 0x5f71, + 0x3147 => 0x6620, 0x3148 => 0x66f3, 0x3149 => 0x6804, 0x314a => 0x6c38, + 0x314b => 0x6cf3, 0x314c => 0x6d29, 0x314d => 0x745b, 0x314e => 0x76c8, + 0x314f => 0x7a4e, 0x3150 => 0x9834, 0x3151 => 0x82f1, 0x3152 => 0x885b, + 0x3153 => 0x8a60, 0x3154 => 0x92ed, 0x3155 => 0x6db2, 0x3156 => 0x75ab, + 0x3157 => 0x76ca, 0x3158 => 0x99c5, 0x3159 => 0x60a6, 0x315a => 0x8b01, + 0x315b => 0x8d8a, 0x315c => 0x95b2, 0x315d => 0x698e, 0x315e => 0x53ad, + 0x315f => 0x5186, 0x3160 => 0x5712, 0x3161 => 0x5830, 0x3162 => 0x5944, + 0x3163 => 0x5bb4, 0x3164 => 0x5ef6, 0x3165 => 0x6028, 0x3166 => 0x63a9, + 0x3167 => 0x63f4, 0x3168 => 0x6cbf, 0x3169 => 0x6f14, 0x316a => 0x708e, + 0x316b => 0x7114, 0x316c => 0x7159, 0x316d => 0x71d5, 0x316e => 0x733f, + 0x316f => 0x7e01, 0x3170 => 0x8276, 0x3171 => 0x82d1, 0x3172 => 0x8597, + 0x3173 => 0x9060, 0x3174 => 0x925b, 0x3175 => 0x9d1b, 0x3176 => 0x5869, + 0x3177 => 0x65bc, 0x3178 => 0x6c5a, 0x3179 => 0x7525, 0x317a => 0x51f9, + 0x317b => 0x592e, 0x317c => 0x5965, 0x317d => 0x5f80, 0x317e => 0x5fdc, + 0x3221 => 0x62bc, 0x3222 => 0x65fa, 0x3223 => 0x6a2a, 0x3224 => 0x6b27, + 0x3225 => 0x6bb4, 0x3226 => 0x738b, 0x3227 => 0x7fc1, 0x3228 => 0x8956, + 0x3229 => 0x9d2c, 0x322a => 0x9d0e, 0x322b => 0x9ec4, 0x322c => 0x5ca1, + 0x322d => 0x6c96, 0x322e => 0x837b, 0x322f => 0x5104, 0x3230 => 0x5c4b, + 0x3231 => 0x61b6, 0x3232 => 0x81c6, 0x3233 => 0x6876, 0x3234 => 0x7261, + 0x3235 => 0x4e59, 0x3236 => 0x4ffa, 0x3237 => 0x5378, 0x3238 => 0x6069, + 0x3239 => 0x6e29, 0x323a => 0x7a4f, 0x323b => 0x97f3, 0x323c => 0x4e0b, + 0x323d => 0x5316, 0x323e => 0x4eee, 0x323f => 0x4f55, 0x3240 => 0x4f3d, + 0x3241 => 0x4fa1, 0x3242 => 0x4f73, 0x3243 => 0x52a0, 0x3244 => 0x53ef, + 0x3245 => 0x5609, 0x3246 => 0x590f, 0x3247 => 0x5ac1, 0x3248 => 0x5bb6, + 0x3249 => 0x5be1, 0x324a => 0x79d1, 0x324b => 0x6687, 0x324c => 0x679c, + 0x324d => 0x67b6, 0x324e => 0x6b4c, 0x324f => 0x6cb3, 0x3250 => 0x706b, + 0x3251 => 0x73c2, 0x3252 => 0x798d, 0x3253 => 0x79be, 0x3254 => 0x7a3c, + 0x3255 => 0x7b87, 0x3256 => 0x82b1, 0x3257 => 0x82db, 0x3258 => 0x8304, + 0x3259 => 0x8377, 0x325a => 0x83ef, 0x325b => 0x83d3, 0x325c => 0x8766, + 0x325d => 0x8ab2, 0x325e => 0x5629, 0x325f => 0x8ca8, 0x3260 => 0x8fe6, + 0x3261 => 0x904e, 0x3262 => 0x971e, 0x3263 => 0x868a, 0x3264 => 0x4fc4, + 0x3265 => 0x5ce8, 0x3266 => 0x6211, 0x3267 => 0x7259, 0x3268 => 0x753b, + 0x3269 => 0x81e5, 0x326a => 0x82bd, 0x326b => 0x86fe, 0x326c => 0x8cc0, + 0x326d => 0x96c5, 0x326e => 0x9913, 0x326f => 0x99d5, 0x3270 => 0x4ecb, + 0x3271 => 0x4f1a, 0x3272 => 0x89e3, 0x3273 => 0x56de, 0x3274 => 0x584a, + 0x3275 => 0x58ca, 0x3276 => 0x5efb, 0x3277 => 0x5feb, 0x3278 => 0x602a, + 0x3279 => 0x6094, 0x327a => 0x6062, 0x327b => 0x61d0, 0x327c => 0x6212, + 0x327d => 0x62d0, 0x327e => 0x6539, 0x3321 => 0x9b41, 0x3322 => 0x6666, + 0x3323 => 0x68b0, 0x3324 => 0x6d77, 0x3325 => 0x7070, 0x3326 => 0x754c, + 0x3327 => 0x7686, 0x3328 => 0x7d75, 0x3329 => 0x82a5, 0x332a => 0x87f9, + 0x332b => 0x958b, 0x332c => 0x968e, 0x332d => 0x8c9d, 0x332e => 0x51f1, + 0x332f => 0x52be, 0x3330 => 0x5916, 0x3331 => 0x54b3, 0x3332 => 0x5bb3, + 0x3333 => 0x5d16, 0x3334 => 0x6168, 0x3335 => 0x6982, 0x3336 => 0x6daf, + 0x3337 => 0x788d, 0x3338 => 0x84cb, 0x3339 => 0x8857, 0x333a => 0x8a72, + 0x333b => 0x93a7, 0x333c => 0x9ab8, 0x333d => 0x6d6c, 0x333e => 0x99a8, + 0x333f => 0x86d9, 0x3340 => 0x57a3, 0x3341 => 0x67ff, 0x3342 => 0x86ce, + 0x3343 => 0x920e, 0x3344 => 0x5283, 0x3345 => 0x5687, 0x3346 => 0x5404, + 0x3347 => 0x5ed3, 0x3348 => 0x62e1, 0x3349 => 0x64b9, 0x334a => 0x683c, + 0x334b => 0x6838, 0x334c => 0x6bbb, 0x334d => 0x7372, 0x334e => 0x78ba, + 0x334f => 0x7a6b, 0x3350 => 0x899a, 0x3351 => 0x89d2, 0x3352 => 0x8d6b, + 0x3353 => 0x8f03, 0x3354 => 0x90ed, 0x3355 => 0x95a3, 0x3356 => 0x9694, + 0x3357 => 0x9769, 0x3358 => 0x5b66, 0x3359 => 0x5cb3, 0x335a => 0x697d, + 0x335b => 0x984d, 0x335c => 0x984e, 0x335d => 0x639b, 0x335e => 0x7b20, + 0x335f => 0x6a2b, 0x3360 => 0x6a7f, 0x3361 => 0x68b6, 0x3362 => 0x9c0d, + 0x3363 => 0x6f5f, 0x3364 => 0x5272, 0x3365 => 0x559d, 0x3366 => 0x6070, + 0x3367 => 0x62ec, 0x3368 => 0x6d3b, 0x3369 => 0x6e07, 0x336a => 0x6ed1, + 0x336b => 0x845b, 0x336c => 0x8910, 0x336d => 0x8f44, 0x336e => 0x4e14, + 0x336f => 0x9c39, 0x3370 => 0x53f6, 0x3371 => 0x691b, 0x3372 => 0x6a3a, + 0x3373 => 0x9784, 0x3374 => 0x682a, 0x3375 => 0x515c, 0x3376 => 0x7ac3, + 0x3377 => 0x84b2, 0x3378 => 0x91dc, 0x3379 => 0x938c, 0x337a => 0x565b, + 0x337b => 0x9d28, 0x337c => 0x6822, 0x337d => 0x8305, 0x337e => 0x8431, + 0x3421 => 0x7ca5, 0x3422 => 0x5208, 0x3423 => 0x82c5, 0x3424 => 0x74e6, + 0x3425 => 0x4e7e, 0x3426 => 0x4f83, 0x3427 => 0x51a0, 0x3428 => 0x5bd2, + 0x3429 => 0x520a, 0x342a => 0x52d8, 0x342b => 0x52e7, 0x342c => 0x5dfb, + 0x342d => 0x559a, 0x342e => 0x582a, 0x342f => 0x59e6, 0x3430 => 0x5b8c, + 0x3431 => 0x5b98, 0x3432 => 0x5bdb, 0x3433 => 0x5e72, 0x3434 => 0x5e79, + 0x3435 => 0x60a3, 0x3436 => 0x611f, 0x3437 => 0x6163, 0x3438 => 0x61be, + 0x3439 => 0x63db, 0x343a => 0x6562, 0x343b => 0x67d1, 0x343c => 0x6853, + 0x343d => 0x68fa, 0x343e => 0x6b3e, 0x343f => 0x6b53, 0x3440 => 0x6c57, + 0x3441 => 0x6f22, 0x3442 => 0x6f97, 0x3443 => 0x6f45, 0x3444 => 0x74b0, + 0x3445 => 0x7518, 0x3446 => 0x76e3, 0x3447 => 0x770b, 0x3448 => 0x7aff, + 0x3449 => 0x7ba1, 0x344a => 0x7c21, 0x344b => 0x7de9, 0x344c => 0x7f36, + 0x344d => 0x7ff0, 0x344e => 0x809d, 0x344f => 0x8266, 0x3450 => 0x839e, + 0x3451 => 0x89b3, 0x3452 => 0x8acc, 0x3453 => 0x8cab, 0x3454 => 0x9084, + 0x3455 => 0x9451, 0x3456 => 0x9593, 0x3457 => 0x9591, 0x3458 => 0x95a2, + 0x3459 => 0x9665, 0x345a => 0x97d3, 0x345b => 0x9928, 0x345c => 0x8218, + 0x345d => 0x4e38, 0x345e => 0x542b, 0x345f => 0x5cb8, 0x3460 => 0x5dcc, + 0x3461 => 0x73a9, 0x3462 => 0x764c, 0x3463 => 0x773c, 0x3464 => 0x5ca9, + 0x3465 => 0x7feb, 0x3466 => 0x8d0b, 0x3467 => 0x96c1, 0x3468 => 0x9811, + 0x3469 => 0x9854, 0x346a => 0x9858, 0x346b => 0x4f01, 0x346c => 0x4f0e, + 0x346d => 0x5371, 0x346e => 0x559c, 0x346f => 0x5668, 0x3470 => 0x57fa, + 0x3471 => 0x5947, 0x3472 => 0x5b09, 0x3473 => 0x5bc4, 0x3474 => 0x5c90, + 0x3475 => 0x5e0c, 0x3476 => 0x5e7e, 0x3477 => 0x5fcc, 0x3478 => 0x63ee, + 0x3479 => 0x673a, 0x347a => 0x65d7, 0x347b => 0x65e2, 0x347c => 0x671f, + 0x347d => 0x68cb, 0x347e => 0x68c4, 0x3521 => 0x6a5f, 0x3522 => 0x5e30, + 0x3523 => 0x6bc5, 0x3524 => 0x6c17, 0x3525 => 0x6c7d, 0x3526 => 0x757f, + 0x3527 => 0x7948, 0x3528 => 0x5b63, 0x3529 => 0x7a00, 0x352a => 0x7d00, + 0x352b => 0x5fbd, 0x352c => 0x898f, 0x352d => 0x8a18, 0x352e => 0x8cb4, + 0x352f => 0x8d77, 0x3530 => 0x8ecc, 0x3531 => 0x8f1d, 0x3532 => 0x98e2, + 0x3533 => 0x9a0e, 0x3534 => 0x9b3c, 0x3535 => 0x4e80, 0x3536 => 0x507d, + 0x3537 => 0x5100, 0x3538 => 0x5993, 0x3539 => 0x5b9c, 0x353a => 0x622f, + 0x353b => 0x6280, 0x353c => 0x64ec, 0x353d => 0x6b3a, 0x353e => 0x72a0, + 0x353f => 0x7591, 0x3540 => 0x7947, 0x3541 => 0x7fa9, 0x3542 => 0x87fb, + 0x3543 => 0x8abc, 0x3544 => 0x8b70, 0x3545 => 0x63ac, 0x3546 => 0x83ca, + 0x3547 => 0x97a0, 0x3548 => 0x5409, 0x3549 => 0x5403, 0x354a => 0x55ab, + 0x354b => 0x6854, 0x354c => 0x6a58, 0x354d => 0x8a70, 0x354e => 0x7827, + 0x354f => 0x6775, 0x3550 => 0x9ecd, 0x3551 => 0x5374, 0x3552 => 0x5ba2, + 0x3553 => 0x811a, 0x3554 => 0x8650, 0x3555 => 0x9006, 0x3556 => 0x4e18, + 0x3557 => 0x4e45, 0x3558 => 0x4ec7, 0x3559 => 0x4f11, 0x355a => 0x53ca, + 0x355b => 0x5438, 0x355c => 0x5bae, 0x355d => 0x5f13, 0x355e => 0x6025, + 0x355f => 0x6551, 0x3560 => 0x673d, 0x3561 => 0x6c42, 0x3562 => 0x6c72, + 0x3563 => 0x6ce3, 0x3564 => 0x7078, 0x3565 => 0x7403, 0x3566 => 0x7a76, + 0x3567 => 0x7aae, 0x3568 => 0x7b08, 0x3569 => 0x7d1a, 0x356a => 0x7cfe, + 0x356b => 0x7d66, 0x356c => 0x65e7, 0x356d => 0x725b, 0x356e => 0x53bb, + 0x356f => 0x5c45, 0x3570 => 0x5de8, 0x3571 => 0x62d2, 0x3572 => 0x62e0, + 0x3573 => 0x6319, 0x3574 => 0x6e20, 0x3575 => 0x865a, 0x3576 => 0x8a31, + 0x3577 => 0x8ddd, 0x3578 => 0x92f8, 0x3579 => 0x6f01, 0x357a => 0x79a6, + 0x357b => 0x9b5a, 0x357c => 0x4ea8, 0x357d => 0x4eab, 0x357e => 0x4eac, + 0x3621 => 0x4f9b, 0x3622 => 0x4fa0, 0x3623 => 0x50d1, 0x3624 => 0x5147, + 0x3625 => 0x7af6, 0x3626 => 0x5171, 0x3627 => 0x51f6, 0x3628 => 0x5354, + 0x3629 => 0x5321, 0x362a => 0x537f, 0x362b => 0x53eb, 0x362c => 0x55ac, + 0x362d => 0x5883, 0x362e => 0x5ce1, 0x362f => 0x5f37, 0x3630 => 0x5f4a, + 0x3631 => 0x602f, 0x3632 => 0x6050, 0x3633 => 0x606d, 0x3634 => 0x631f, + 0x3635 => 0x6559, 0x3636 => 0x6a4b, 0x3637 => 0x6cc1, 0x3638 => 0x72c2, + 0x3639 => 0x72ed, 0x363a => 0x77ef, 0x363b => 0x80f8, 0x363c => 0x8105, + 0x363d => 0x8208, 0x363e => 0x854e, 0x363f => 0x90f7, 0x3640 => 0x93e1, + 0x3641 => 0x97ff, 0x3642 => 0x9957, 0x3643 => 0x9a5a, 0x3644 => 0x4ef0, + 0x3645 => 0x51dd, 0x3646 => 0x5c2d, 0x3647 => 0x6681, 0x3648 => 0x696d, + 0x3649 => 0x5c40, 0x364a => 0x66f2, 0x364b => 0x6975, 0x364c => 0x7389, + 0x364d => 0x6850, 0x364e => 0x7c81, 0x364f => 0x50c5, 0x3650 => 0x52e4, + 0x3651 => 0x5747, 0x3652 => 0x5dfe, 0x3653 => 0x9326, 0x3654 => 0x65a4, + 0x3655 => 0x6b23, 0x3656 => 0x6b3d, 0x3657 => 0x7434, 0x3658 => 0x7981, + 0x3659 => 0x79bd, 0x365a => 0x7b4b, 0x365b => 0x7dca, 0x365c => 0x82b9, + 0x365d => 0x83cc, 0x365e => 0x887f, 0x365f => 0x895f, 0x3660 => 0x8b39, + 0x3661 => 0x8fd1, 0x3662 => 0x91d1, 0x3663 => 0x541f, 0x3664 => 0x9280, + 0x3665 => 0x4e5d, 0x3666 => 0x5036, 0x3667 => 0x53e5, 0x3668 => 0x533a, + 0x3669 => 0x72d7, 0x366a => 0x7396, 0x366b => 0x77e9, 0x366c => 0x82e6, + 0x366d => 0x8eaf, 0x366e => 0x99c6, 0x366f => 0x99c8, 0x3670 => 0x99d2, + 0x3671 => 0x5177, 0x3672 => 0x611a, 0x3673 => 0x865e, 0x3674 => 0x55b0, + 0x3675 => 0x7a7a, 0x3676 => 0x5076, 0x3677 => 0x5bd3, 0x3678 => 0x9047, + 0x3679 => 0x9685, 0x367a => 0x4e32, 0x367b => 0x6adb, 0x367c => 0x91e7, + 0x367d => 0x5c51, 0x367e => 0x5c48, 0x3721 => 0x6398, 0x3722 => 0x7a9f, + 0x3723 => 0x6c93, 0x3724 => 0x9774, 0x3725 => 0x8f61, 0x3726 => 0x7aaa, + 0x3727 => 0x718a, 0x3728 => 0x9688, 0x3729 => 0x7c82, 0x372a => 0x6817, + 0x372b => 0x7e70, 0x372c => 0x6851, 0x372d => 0x936c, 0x372e => 0x52f2, + 0x372f => 0x541b, 0x3730 => 0x85ab, 0x3731 => 0x8a13, 0x3732 => 0x7fa4, + 0x3733 => 0x8ecd, 0x3734 => 0x90e1, 0x3735 => 0x5366, 0x3736 => 0x8888, + 0x3737 => 0x7941, 0x3738 => 0x4fc2, 0x3739 => 0x50be, 0x373a => 0x5211, + 0x373b => 0x5144, 0x373c => 0x5553, 0x373d => 0x572d, 0x373e => 0x73ea, + 0x373f => 0x578b, 0x3740 => 0x5951, 0x3741 => 0x5f62, 0x3742 => 0x5f84, + 0x3743 => 0x6075, 0x3744 => 0x6176, 0x3745 => 0x6167, 0x3746 => 0x61a9, + 0x3747 => 0x63b2, 0x3748 => 0x643a, 0x3749 => 0x656c, 0x374a => 0x666f, + 0x374b => 0x6842, 0x374c => 0x6e13, 0x374d => 0x7566, 0x374e => 0x7a3d, + 0x374f => 0x7cfb, 0x3750 => 0x7d4c, 0x3751 => 0x7d99, 0x3752 => 0x7e4b, + 0x3753 => 0x7f6b, 0x3754 => 0x830e, 0x3755 => 0x834a, 0x3756 => 0x86cd, + 0x3757 => 0x8a08, 0x3758 => 0x8a63, 0x3759 => 0x8b66, 0x375a => 0x8efd, + 0x375b => 0x981a, 0x375c => 0x9d8f, 0x375d => 0x82b8, 0x375e => 0x8fce, + 0x375f => 0x9be8, 0x3760 => 0x5287, 0x3761 => 0x621f, 0x3762 => 0x6483, + 0x3763 => 0x6fc0, 0x3764 => 0x9699, 0x3765 => 0x6841, 0x3766 => 0x5091, + 0x3767 => 0x6b20, 0x3768 => 0x6c7a, 0x3769 => 0x6f54, 0x376a => 0x7a74, + 0x376b => 0x7d50, 0x376c => 0x8840, 0x376d => 0x8a23, 0x376e => 0x6708, + 0x376f => 0x4ef6, 0x3770 => 0x5039, 0x3771 => 0x5026, 0x3772 => 0x5065, + 0x3773 => 0x517c, 0x3774 => 0x5238, 0x3775 => 0x5263, 0x3776 => 0x55a7, + 0x3777 => 0x570f, 0x3778 => 0x5805, 0x3779 => 0x5acc, 0x377a => 0x5efa, + 0x377b => 0x61b2, 0x377c => 0x61f8, 0x377d => 0x62f3, 0x377e => 0x6372, + 0x3821 => 0x691c, 0x3822 => 0x6a29, 0x3823 => 0x727d, 0x3824 => 0x72ac, + 0x3825 => 0x732e, 0x3826 => 0x7814, 0x3827 => 0x786f, 0x3828 => 0x7d79, + 0x3829 => 0x770c, 0x382a => 0x80a9, 0x382b => 0x898b, 0x382c => 0x8b19, + 0x382d => 0x8ce2, 0x382e => 0x8ed2, 0x382f => 0x9063, 0x3830 => 0x9375, + 0x3831 => 0x967a, 0x3832 => 0x9855, 0x3833 => 0x9a13, 0x3834 => 0x9e78, + 0x3835 => 0x5143, 0x3836 => 0x539f, 0x3837 => 0x53b3, 0x3838 => 0x5e7b, + 0x3839 => 0x5f26, 0x383a => 0x6e1b, 0x383b => 0x6e90, 0x383c => 0x7384, + 0x383d => 0x73fe, 0x383e => 0x7d43, 0x383f => 0x8237, 0x3840 => 0x8a00, + 0x3841 => 0x8afa, 0x3842 => 0x9650, 0x3843 => 0x4e4e, 0x3844 => 0x500b, + 0x3845 => 0x53e4, 0x3846 => 0x547c, 0x3847 => 0x56fa, 0x3848 => 0x59d1, + 0x3849 => 0x5b64, 0x384a => 0x5df1, 0x384b => 0x5eab, 0x384c => 0x5f27, + 0x384d => 0x6238, 0x384e => 0x6545, 0x384f => 0x67af, 0x3850 => 0x6e56, + 0x3851 => 0x72d0, 0x3852 => 0x7cca, 0x3853 => 0x88b4, 0x3854 => 0x80a1, + 0x3855 => 0x80e1, 0x3856 => 0x83f0, 0x3857 => 0x864e, 0x3858 => 0x8a87, + 0x3859 => 0x8de8, 0x385a => 0x9237, 0x385b => 0x96c7, 0x385c => 0x9867, + 0x385d => 0x9f13, 0x385e => 0x4e94, 0x385f => 0x4e92, 0x3860 => 0x4f0d, + 0x3861 => 0x5348, 0x3862 => 0x5449, 0x3863 => 0x543e, 0x3864 => 0x5a2f, + 0x3865 => 0x5f8c, 0x3866 => 0x5fa1, 0x3867 => 0x609f, 0x3868 => 0x68a7, + 0x3869 => 0x6a8e, 0x386a => 0x745a, 0x386b => 0x7881, 0x386c => 0x8a9e, + 0x386d => 0x8aa4, 0x386e => 0x8b77, 0x386f => 0x9190, 0x3870 => 0x4e5e, + 0x3871 => 0x9bc9, 0x3872 => 0x4ea4, 0x3873 => 0x4f7c, 0x3874 => 0x4faf, + 0x3875 => 0x5019, 0x3876 => 0x5016, 0x3877 => 0x5149, 0x3878 => 0x516c, + 0x3879 => 0x529f, 0x387a => 0x52b9, 0x387b => 0x52fe, 0x387c => 0x539a, + 0x387d => 0x53e3, 0x387e => 0x5411, 0x3921 => 0x540e, 0x3922 => 0x5589, + 0x3923 => 0x5751, 0x3924 => 0x57a2, 0x3925 => 0x597d, 0x3926 => 0x5b54, + 0x3927 => 0x5b5d, 0x3928 => 0x5b8f, 0x3929 => 0x5de5, 0x392a => 0x5de7, + 0x392b => 0x5df7, 0x392c => 0x5e78, 0x392d => 0x5e83, 0x392e => 0x5e9a, + 0x392f => 0x5eb7, 0x3930 => 0x5f18, 0x3931 => 0x6052, 0x3932 => 0x614c, + 0x3933 => 0x6297, 0x3934 => 0x62d8, 0x3935 => 0x63a7, 0x3936 => 0x653b, + 0x3937 => 0x6602, 0x3938 => 0x6643, 0x3939 => 0x66f4, 0x393a => 0x676d, + 0x393b => 0x6821, 0x393c => 0x6897, 0x393d => 0x69cb, 0x393e => 0x6c5f, + 0x393f => 0x6d2a, 0x3940 => 0x6d69, 0x3941 => 0x6e2f, 0x3942 => 0x6e9d, + 0x3943 => 0x7532, 0x3944 => 0x7687, 0x3945 => 0x786c, 0x3946 => 0x7a3f, + 0x3947 => 0x7ce0, 0x3948 => 0x7d05, 0x3949 => 0x7d18, 0x394a => 0x7d5e, + 0x394b => 0x7db1, 0x394c => 0x8015, 0x394d => 0x8003, 0x394e => 0x80af, + 0x394f => 0x80b1, 0x3950 => 0x8154, 0x3951 => 0x818f, 0x3952 => 0x822a, + 0x3953 => 0x8352, 0x3954 => 0x884c, 0x3955 => 0x8861, 0x3956 => 0x8b1b, + 0x3957 => 0x8ca2, 0x3958 => 0x8cfc, 0x3959 => 0x90ca, 0x395a => 0x9175, + 0x395b => 0x9271, 0x395c => 0x783f, 0x395d => 0x92fc, 0x395e => 0x95a4, + 0x395f => 0x964d, 0x3960 => 0x9805, 0x3961 => 0x9999, 0x3962 => 0x9ad8, + 0x3963 => 0x9d3b, 0x3964 => 0x525b, 0x3965 => 0x52ab, 0x3966 => 0x53f7, + 0x3967 => 0x5408, 0x3968 => 0x58d5, 0x3969 => 0x62f7, 0x396a => 0x6fe0, + 0x396b => 0x8c6a, 0x396c => 0x8f5f, 0x396d => 0x9eb9, 0x396e => 0x514b, + 0x396f => 0x523b, 0x3970 => 0x544a, 0x3971 => 0x56fd, 0x3972 => 0x7a40, + 0x3973 => 0x9177, 0x3974 => 0x9d60, 0x3975 => 0x9ed2, 0x3976 => 0x7344, + 0x3977 => 0x6f09, 0x3978 => 0x8170, 0x3979 => 0x7511, 0x397a => 0x5ffd, + 0x397b => 0x60da, 0x397c => 0x9aa8, 0x397d => 0x72db, 0x397e => 0x8fbc, + 0x3a21 => 0x6b64, 0x3a22 => 0x9803, 0x3a23 => 0x4eca, 0x3a24 => 0x56f0, + 0x3a25 => 0x5764, 0x3a26 => 0x58be, 0x3a27 => 0x5a5a, 0x3a28 => 0x6068, + 0x3a29 => 0x61c7, 0x3a2a => 0x660f, 0x3a2b => 0x6606, 0x3a2c => 0x6839, + 0x3a2d => 0x68b1, 0x3a2e => 0x6df7, 0x3a2f => 0x75d5, 0x3a30 => 0x7d3a, + 0x3a31 => 0x826e, 0x3a32 => 0x9b42, 0x3a33 => 0x4e9b, 0x3a34 => 0x4f50, + 0x3a35 => 0x53c9, 0x3a36 => 0x5506, 0x3a37 => 0x5d6f, 0x3a38 => 0x5de6, + 0x3a39 => 0x5dee, 0x3a3a => 0x67fb, 0x3a3b => 0x6c99, 0x3a3c => 0x7473, + 0x3a3d => 0x7802, 0x3a3e => 0x8a50, 0x3a3f => 0x9396, 0x3a40 => 0x88df, + 0x3a41 => 0x5750, 0x3a42 => 0x5ea7, 0x3a43 => 0x632b, 0x3a44 => 0x50b5, + 0x3a45 => 0x50ac, 0x3a46 => 0x518d, 0x3a47 => 0x6700, 0x3a48 => 0x54c9, + 0x3a49 => 0x585e, 0x3a4a => 0x59bb, 0x3a4b => 0x5bb0, 0x3a4c => 0x5f69, + 0x3a4d => 0x624d, 0x3a4e => 0x63a1, 0x3a4f => 0x683d, 0x3a50 => 0x6b73, + 0x3a51 => 0x6e08, 0x3a52 => 0x707d, 0x3a53 => 0x91c7, 0x3a54 => 0x7280, + 0x3a55 => 0x7815, 0x3a56 => 0x7826, 0x3a57 => 0x796d, 0x3a58 => 0x658e, + 0x3a59 => 0x7d30, 0x3a5a => 0x83dc, 0x3a5b => 0x88c1, 0x3a5c => 0x8f09, + 0x3a5d => 0x969b, 0x3a5e => 0x5264, 0x3a5f => 0x5728, 0x3a60 => 0x6750, + 0x3a61 => 0x7f6a, 0x3a62 => 0x8ca1, 0x3a63 => 0x51b4, 0x3a64 => 0x5742, + 0x3a65 => 0x962a, 0x3a66 => 0x583a, 0x3a67 => 0x698a, 0x3a68 => 0x80b4, + 0x3a69 => 0x54b2, 0x3a6a => 0x5d0e, 0x3a6b => 0x57fc, 0x3a6c => 0x7895, + 0x3a6d => 0x9dfa, 0x3a6e => 0x4f5c, 0x3a6f => 0x524a, 0x3a70 => 0x548b, + 0x3a71 => 0x643e, 0x3a72 => 0x6628, 0x3a73 => 0x6714, 0x3a74 => 0x67f5, + 0x3a75 => 0x7a84, 0x3a76 => 0x7b56, 0x3a77 => 0x7d22, 0x3a78 => 0x932f, + 0x3a79 => 0x685c, 0x3a7a => 0x9bad, 0x3a7b => 0x7b39, 0x3a7c => 0x5319, + 0x3a7d => 0x518a, 0x3a7e => 0x5237, 0x3b21 => 0x5bdf, 0x3b22 => 0x62f6, + 0x3b23 => 0x64ae, 0x3b24 => 0x64e6, 0x3b25 => 0x672d, 0x3b26 => 0x6bba, + 0x3b27 => 0x85a9, 0x3b28 => 0x96d1, 0x3b29 => 0x7690, 0x3b2a => 0x9bd6, + 0x3b2b => 0x634c, 0x3b2c => 0x9306, 0x3b2d => 0x9bab, 0x3b2e => 0x76bf, + 0x3b2f => 0x6652, 0x3b30 => 0x4e09, 0x3b31 => 0x5098, 0x3b32 => 0x53c2, + 0x3b33 => 0x5c71, 0x3b34 => 0x60e8, 0x3b35 => 0x6492, 0x3b36 => 0x6563, + 0x3b37 => 0x685f, 0x3b38 => 0x71e6, 0x3b39 => 0x73ca, 0x3b3a => 0x7523, + 0x3b3b => 0x7b97, 0x3b3c => 0x7e82, 0x3b3d => 0x8695, 0x3b3e => 0x8b83, + 0x3b3f => 0x8cdb, 0x3b40 => 0x9178, 0x3b41 => 0x9910, 0x3b42 => 0x65ac, + 0x3b43 => 0x66ab, 0x3b44 => 0x6b8b, 0x3b45 => 0x4ed5, 0x3b46 => 0x4ed4, + 0x3b47 => 0x4f3a, 0x3b48 => 0x4f7f, 0x3b49 => 0x523a, 0x3b4a => 0x53f8, + 0x3b4b => 0x53f2, 0x3b4c => 0x55e3, 0x3b4d => 0x56db, 0x3b4e => 0x58eb, + 0x3b4f => 0x59cb, 0x3b50 => 0x59c9, 0x3b51 => 0x59ff, 0x3b52 => 0x5b50, + 0x3b53 => 0x5c4d, 0x3b54 => 0x5e02, 0x3b55 => 0x5e2b, 0x3b56 => 0x5fd7, + 0x3b57 => 0x601d, 0x3b58 => 0x6307, 0x3b59 => 0x652f, 0x3b5a => 0x5b5c, + 0x3b5b => 0x65af, 0x3b5c => 0x65bd, 0x3b5d => 0x65e8, 0x3b5e => 0x679d, + 0x3b5f => 0x6b62, 0x3b60 => 0x6b7b, 0x3b61 => 0x6c0f, 0x3b62 => 0x7345, + 0x3b63 => 0x7949, 0x3b64 => 0x79c1, 0x3b65 => 0x7cf8, 0x3b66 => 0x7d19, + 0x3b67 => 0x7d2b, 0x3b68 => 0x80a2, 0x3b69 => 0x8102, 0x3b6a => 0x81f3, + 0x3b6b => 0x8996, 0x3b6c => 0x8a5e, 0x3b6d => 0x8a69, 0x3b6e => 0x8a66, + 0x3b6f => 0x8a8c, 0x3b70 => 0x8aee, 0x3b71 => 0x8cc7, 0x3b72 => 0x8cdc, + 0x3b73 => 0x96cc, 0x3b74 => 0x98fc, 0x3b75 => 0x6b6f, 0x3b76 => 0x4e8b, + 0x3b77 => 0x4f3c, 0x3b78 => 0x4f8d, 0x3b79 => 0x5150, 0x3b7a => 0x5b57, + 0x3b7b => 0x5bfa, 0x3b7c => 0x6148, 0x3b7d => 0x6301, 0x3b7e => 0x6642, + 0x3c21 => 0x6b21, 0x3c22 => 0x6ecb, 0x3c23 => 0x6cbb, 0x3c24 => 0x723e, + 0x3c25 => 0x74bd, 0x3c26 => 0x75d4, 0x3c27 => 0x78c1, 0x3c28 => 0x793a, + 0x3c29 => 0x800c, 0x3c2a => 0x8033, 0x3c2b => 0x81ea, 0x3c2c => 0x8494, + 0x3c2d => 0x8f9e, 0x3c2e => 0x6c50, 0x3c2f => 0x9e7f, 0x3c30 => 0x5f0f, + 0x3c31 => 0x8b58, 0x3c32 => 0x9d2b, 0x3c33 => 0x7afa, 0x3c34 => 0x8ef8, + 0x3c35 => 0x5b8d, 0x3c36 => 0x96eb, 0x3c37 => 0x4e03, 0x3c38 => 0x53f1, + 0x3c39 => 0x57f7, 0x3c3a => 0x5931, 0x3c3b => 0x5ac9, 0x3c3c => 0x5ba4, + 0x3c3d => 0x6089, 0x3c3e => 0x6e7f, 0x3c3f => 0x6f06, 0x3c40 => 0x75be, + 0x3c41 => 0x8cea, 0x3c42 => 0x5b9f, 0x3c43 => 0x8500, 0x3c44 => 0x7be0, + 0x3c45 => 0x5072, 0x3c46 => 0x67f4, 0x3c47 => 0x829d, 0x3c48 => 0x5c61, + 0x3c49 => 0x854a, 0x3c4a => 0x7e1e, 0x3c4b => 0x820e, 0x3c4c => 0x5199, + 0x3c4d => 0x5c04, 0x3c4e => 0x6368, 0x3c4f => 0x8d66, 0x3c50 => 0x659c, + 0x3c51 => 0x716e, 0x3c52 => 0x793e, 0x3c53 => 0x7d17, 0x3c54 => 0x8005, + 0x3c55 => 0x8b1d, 0x3c56 => 0x8eca, 0x3c57 => 0x906e, 0x3c58 => 0x86c7, + 0x3c59 => 0x90aa, 0x3c5a => 0x501f, 0x3c5b => 0x52fa, 0x3c5c => 0x5c3a, + 0x3c5d => 0x6753, 0x3c5e => 0x707c, 0x3c5f => 0x7235, 0x3c60 => 0x914c, + 0x3c61 => 0x91c8, 0x3c62 => 0x932b, 0x3c63 => 0x82e5, 0x3c64 => 0x5bc2, + 0x3c65 => 0x5f31, 0x3c66 => 0x60f9, 0x3c67 => 0x4e3b, 0x3c68 => 0x53d6, + 0x3c69 => 0x5b88, 0x3c6a => 0x624b, 0x3c6b => 0x6731, 0x3c6c => 0x6b8a, + 0x3c6d => 0x72e9, 0x3c6e => 0x73e0, 0x3c6f => 0x7a2e, 0x3c70 => 0x816b, + 0x3c71 => 0x8da3, 0x3c72 => 0x9152, 0x3c73 => 0x9996, 0x3c74 => 0x5112, + 0x3c75 => 0x53d7, 0x3c76 => 0x546a, 0x3c77 => 0x5bff, 0x3c78 => 0x6388, + 0x3c79 => 0x6a39, 0x3c7a => 0x7dac, 0x3c7b => 0x9700, 0x3c7c => 0x56da, + 0x3c7d => 0x53ce, 0x3c7e => 0x5468, 0x3d21 => 0x5b97, 0x3d22 => 0x5c31, + 0x3d23 => 0x5dde, 0x3d24 => 0x4fee, 0x3d25 => 0x6101, 0x3d26 => 0x62fe, + 0x3d27 => 0x6d32, 0x3d28 => 0x79c0, 0x3d29 => 0x79cb, 0x3d2a => 0x7d42, + 0x3d2b => 0x7e4d, 0x3d2c => 0x7fd2, 0x3d2d => 0x81ed, 0x3d2e => 0x821f, + 0x3d2f => 0x8490, 0x3d30 => 0x8846, 0x3d31 => 0x8972, 0x3d32 => 0x8b90, + 0x3d33 => 0x8e74, 0x3d34 => 0x8f2f, 0x3d35 => 0x9031, 0x3d36 => 0x914b, + 0x3d37 => 0x916c, 0x3d38 => 0x96c6, 0x3d39 => 0x919c, 0x3d3a => 0x4ec0, + 0x3d3b => 0x4f4f, 0x3d3c => 0x5145, 0x3d3d => 0x5341, 0x3d3e => 0x5f93, + 0x3d3f => 0x620e, 0x3d40 => 0x67d4, 0x3d41 => 0x6c41, 0x3d42 => 0x6e0b, + 0x3d43 => 0x7363, 0x3d44 => 0x7e26, 0x3d45 => 0x91cd, 0x3d46 => 0x9283, + 0x3d47 => 0x53d4, 0x3d48 => 0x5919, 0x3d49 => 0x5bbf, 0x3d4a => 0x6dd1, + 0x3d4b => 0x795d, 0x3d4c => 0x7e2e, 0x3d4d => 0x7c9b, 0x3d4e => 0x587e, + 0x3d4f => 0x719f, 0x3d50 => 0x51fa, 0x3d51 => 0x8853, 0x3d52 => 0x8ff0, + 0x3d53 => 0x4fca, 0x3d54 => 0x5cfb, 0x3d55 => 0x6625, 0x3d56 => 0x77ac, + 0x3d57 => 0x7ae3, 0x3d58 => 0x821c, 0x3d59 => 0x99ff, 0x3d5a => 0x51c6, + 0x3d5b => 0x5faa, 0x3d5c => 0x65ec, 0x3d5d => 0x696f, 0x3d5e => 0x6b89, + 0x3d5f => 0x6df3, 0x3d60 => 0x6e96, 0x3d61 => 0x6f64, 0x3d62 => 0x76fe, + 0x3d63 => 0x7d14, 0x3d64 => 0x5de1, 0x3d65 => 0x9075, 0x3d66 => 0x9187, + 0x3d67 => 0x9806, 0x3d68 => 0x51e6, 0x3d69 => 0x521d, 0x3d6a => 0x6240, + 0x3d6b => 0x6691, 0x3d6c => 0x66d9, 0x3d6d => 0x6e1a, 0x3d6e => 0x5eb6, + 0x3d6f => 0x7dd2, 0x3d70 => 0x7f72, 0x3d71 => 0x66f8, 0x3d72 => 0x85af, + 0x3d73 => 0x85f7, 0x3d74 => 0x8af8, 0x3d75 => 0x52a9, 0x3d76 => 0x53d9, + 0x3d77 => 0x5973, 0x3d78 => 0x5e8f, 0x3d79 => 0x5f90, 0x3d7a => 0x6055, + 0x3d7b => 0x92e4, 0x3d7c => 0x9664, 0x3d7d => 0x50b7, 0x3d7e => 0x511f, + 0x3e21 => 0x52dd, 0x3e22 => 0x5320, 0x3e23 => 0x5347, 0x3e24 => 0x53ec, + 0x3e25 => 0x54e8, 0x3e26 => 0x5546, 0x3e27 => 0x5531, 0x3e28 => 0x5617, + 0x3e29 => 0x5968, 0x3e2a => 0x59be, 0x3e2b => 0x5a3c, 0x3e2c => 0x5bb5, + 0x3e2d => 0x5c06, 0x3e2e => 0x5c0f, 0x3e2f => 0x5c11, 0x3e30 => 0x5c1a, + 0x3e31 => 0x5e84, 0x3e32 => 0x5e8a, 0x3e33 => 0x5ee0, 0x3e34 => 0x5f70, + 0x3e35 => 0x627f, 0x3e36 => 0x6284, 0x3e37 => 0x62db, 0x3e38 => 0x638c, + 0x3e39 => 0x6377, 0x3e3a => 0x6607, 0x3e3b => 0x660c, 0x3e3c => 0x662d, + 0x3e3d => 0x6676, 0x3e3e => 0x677e, 0x3e3f => 0x68a2, 0x3e40 => 0x6a1f, + 0x3e41 => 0x6a35, 0x3e42 => 0x6cbc, 0x3e43 => 0x6d88, 0x3e44 => 0x6e09, + 0x3e45 => 0x6e58, 0x3e46 => 0x713c, 0x3e47 => 0x7126, 0x3e48 => 0x7167, + 0x3e49 => 0x75c7, 0x3e4a => 0x7701, 0x3e4b => 0x785d, 0x3e4c => 0x7901, + 0x3e4d => 0x7965, 0x3e4e => 0x79f0, 0x3e4f => 0x7ae0, 0x3e50 => 0x7b11, + 0x3e51 => 0x7ca7, 0x3e52 => 0x7d39, 0x3e53 => 0x8096, 0x3e54 => 0x83d6, + 0x3e55 => 0x848b, 0x3e56 => 0x8549, 0x3e57 => 0x885d, 0x3e58 => 0x88f3, + 0x3e59 => 0x8a1f, 0x3e5a => 0x8a3c, 0x3e5b => 0x8a54, 0x3e5c => 0x8a73, + 0x3e5d => 0x8c61, 0x3e5e => 0x8cde, 0x3e5f => 0x91a4, 0x3e60 => 0x9266, + 0x3e61 => 0x937e, 0x3e62 => 0x9418, 0x3e63 => 0x969c, 0x3e64 => 0x9798, + 0x3e65 => 0x4e0a, 0x3e66 => 0x4e08, 0x3e67 => 0x4e1e, 0x3e68 => 0x4e57, + 0x3e69 => 0x5197, 0x3e6a => 0x5270, 0x3e6b => 0x57ce, 0x3e6c => 0x5834, + 0x3e6d => 0x58cc, 0x3e6e => 0x5b22, 0x3e6f => 0x5e38, 0x3e70 => 0x60c5, + 0x3e71 => 0x64fe, 0x3e72 => 0x6761, 0x3e73 => 0x6756, 0x3e74 => 0x6d44, + 0x3e75 => 0x72b6, 0x3e76 => 0x7573, 0x3e77 => 0x7a63, 0x3e78 => 0x84b8, + 0x3e79 => 0x8b72, 0x3e7a => 0x91b8, 0x3e7b => 0x9320, 0x3e7c => 0x5631, + 0x3e7d => 0x57f4, 0x3e7e => 0x98fe, 0x3f21 => 0x62ed, 0x3f22 => 0x690d, + 0x3f23 => 0x6b96, 0x3f24 => 0x71ed, 0x3f25 => 0x7e54, 0x3f26 => 0x8077, + 0x3f27 => 0x8272, 0x3f28 => 0x89e6, 0x3f29 => 0x98df, 0x3f2a => 0x8755, + 0x3f2b => 0x8fb1, 0x3f2c => 0x5c3b, 0x3f2d => 0x4f38, 0x3f2e => 0x4fe1, + 0x3f2f => 0x4fb5, 0x3f30 => 0x5507, 0x3f31 => 0x5a20, 0x3f32 => 0x5bdd, + 0x3f33 => 0x5be9, 0x3f34 => 0x5fc3, 0x3f35 => 0x614e, 0x3f36 => 0x632f, + 0x3f37 => 0x65b0, 0x3f38 => 0x664b, 0x3f39 => 0x68ee, 0x3f3a => 0x699b, + 0x3f3b => 0x6d78, 0x3f3c => 0x6df1, 0x3f3d => 0x7533, 0x3f3e => 0x75b9, + 0x3f3f => 0x771f, 0x3f40 => 0x795e, 0x3f41 => 0x79e6, 0x3f42 => 0x7d33, + 0x3f43 => 0x81e3, 0x3f44 => 0x82af, 0x3f45 => 0x85aa, 0x3f46 => 0x89aa, + 0x3f47 => 0x8a3a, 0x3f48 => 0x8eab, 0x3f49 => 0x8f9b, 0x3f4a => 0x9032, + 0x3f4b => 0x91dd, 0x3f4c => 0x9707, 0x3f4d => 0x4eba, 0x3f4e => 0x4ec1, + 0x3f4f => 0x5203, 0x3f50 => 0x5875, 0x3f51 => 0x58ec, 0x3f52 => 0x5c0b, + 0x3f53 => 0x751a, 0x3f54 => 0x5c3d, 0x3f55 => 0x814e, 0x3f56 => 0x8a0a, + 0x3f57 => 0x8fc5, 0x3f58 => 0x9663, 0x3f59 => 0x976d, 0x3f5a => 0x7b25, + 0x3f5b => 0x8acf, 0x3f5c => 0x9808, 0x3f5d => 0x9162, 0x3f5e => 0x56f3, + 0x3f5f => 0x53a8, 0x3f60 => 0x9017, 0x3f61 => 0x5439, 0x3f62 => 0x5782, + 0x3f63 => 0x5e25, 0x3f64 => 0x63a8, 0x3f65 => 0x6c34, 0x3f66 => 0x708a, + 0x3f67 => 0x7761, 0x3f68 => 0x7c8b, 0x3f69 => 0x7fe0, 0x3f6a => 0x8870, + 0x3f6b => 0x9042, 0x3f6c => 0x9154, 0x3f6d => 0x9310, 0x3f6e => 0x9318, + 0x3f6f => 0x968f, 0x3f70 => 0x745e, 0x3f71 => 0x9ac4, 0x3f72 => 0x5d07, + 0x3f73 => 0x5d69, 0x3f74 => 0x6570, 0x3f75 => 0x67a2, 0x3f76 => 0x8da8, + 0x3f77 => 0x96db, 0x3f78 => 0x636e, 0x3f79 => 0x6749, 0x3f7a => 0x6919, + 0x3f7b => 0x83c5, 0x3f7c => 0x9817, 0x3f7d => 0x96c0, 0x3f7e => 0x88fe, + 0x4021 => 0x6f84, 0x4022 => 0x647a, 0x4023 => 0x5bf8, 0x4024 => 0x4e16, + 0x4025 => 0x702c, 0x4026 => 0x755d, 0x4027 => 0x662f, 0x4028 => 0x51c4, + 0x4029 => 0x5236, 0x402a => 0x52e2, 0x402b => 0x59d3, 0x402c => 0x5f81, + 0x402d => 0x6027, 0x402e => 0x6210, 0x402f => 0x653f, 0x4030 => 0x6574, + 0x4031 => 0x661f, 0x4032 => 0x6674, 0x4033 => 0x68f2, 0x4034 => 0x6816, + 0x4035 => 0x6b63, 0x4036 => 0x6e05, 0x4037 => 0x7272, 0x4038 => 0x751f, + 0x4039 => 0x76db, 0x403a => 0x7cbe, 0x403b => 0x8056, 0x403c => 0x58f0, + 0x403d => 0x88fd, 0x403e => 0x897f, 0x403f => 0x8aa0, 0x4040 => 0x8a93, + 0x4041 => 0x8acb, 0x4042 => 0x901d, 0x4043 => 0x9192, 0x4044 => 0x9752, + 0x4045 => 0x9759, 0x4046 => 0x6589, 0x4047 => 0x7a0e, 0x4048 => 0x8106, + 0x4049 => 0x96bb, 0x404a => 0x5e2d, 0x404b => 0x60dc, 0x404c => 0x621a, + 0x404d => 0x65a5, 0x404e => 0x6614, 0x404f => 0x6790, 0x4050 => 0x77f3, + 0x4051 => 0x7a4d, 0x4052 => 0x7c4d, 0x4053 => 0x7e3e, 0x4054 => 0x810a, + 0x4055 => 0x8cac, 0x4056 => 0x8d64, 0x4057 => 0x8de1, 0x4058 => 0x8e5f, + 0x4059 => 0x78a9, 0x405a => 0x5207, 0x405b => 0x62d9, 0x405c => 0x63a5, + 0x405d => 0x6442, 0x405e => 0x6298, 0x405f => 0x8a2d, 0x4060 => 0x7a83, + 0x4061 => 0x7bc0, 0x4062 => 0x8aac, 0x4063 => 0x96ea, 0x4064 => 0x7d76, + 0x4065 => 0x820c, 0x4066 => 0x8749, 0x4067 => 0x4ed9, 0x4068 => 0x5148, + 0x4069 => 0x5343, 0x406a => 0x5360, 0x406b => 0x5ba3, 0x406c => 0x5c02, + 0x406d => 0x5c16, 0x406e => 0x5ddd, 0x406f => 0x6226, 0x4070 => 0x6247, + 0x4071 => 0x64b0, 0x4072 => 0x6813, 0x4073 => 0x6834, 0x4074 => 0x6cc9, + 0x4075 => 0x6d45, 0x4076 => 0x6d17, 0x4077 => 0x67d3, 0x4078 => 0x6f5c, + 0x4079 => 0x714e, 0x407a => 0x717d, 0x407b => 0x65cb, 0x407c => 0x7a7f, + 0x407d => 0x7bad, 0x407e => 0x7dda, 0x4121 => 0x7e4a, 0x4122 => 0x7fa8, + 0x4123 => 0x817a, 0x4124 => 0x821b, 0x4125 => 0x8239, 0x4126 => 0x85a6, + 0x4127 => 0x8a6e, 0x4128 => 0x8cce, 0x4129 => 0x8df5, 0x412a => 0x9078, + 0x412b => 0x9077, 0x412c => 0x92ad, 0x412d => 0x9291, 0x412e => 0x9583, + 0x412f => 0x9bae, 0x4130 => 0x524d, 0x4131 => 0x5584, 0x4132 => 0x6f38, + 0x4133 => 0x7136, 0x4134 => 0x5168, 0x4135 => 0x7985, 0x4136 => 0x7e55, + 0x4137 => 0x81b3, 0x4138 => 0x7cce, 0x4139 => 0x564c, 0x413a => 0x5851, + 0x413b => 0x5ca8, 0x413c => 0x63aa, 0x413d => 0x66fe, 0x413e => 0x66fd, + 0x413f => 0x695a, 0x4140 => 0x72d9, 0x4141 => 0x758f, 0x4142 => 0x758e, + 0x4143 => 0x790e, 0x4144 => 0x7956, 0x4145 => 0x79df, 0x4146 => 0x7c97, + 0x4147 => 0x7d20, 0x4148 => 0x7d44, 0x4149 => 0x8607, 0x414a => 0x8a34, + 0x414b => 0x963b, 0x414c => 0x9061, 0x414d => 0x9f20, 0x414e => 0x50e7, + 0x414f => 0x5275, 0x4150 => 0x53cc, 0x4151 => 0x53e2, 0x4152 => 0x5009, + 0x4153 => 0x55aa, 0x4154 => 0x58ee, 0x4155 => 0x594f, 0x4156 => 0x723d, + 0x4157 => 0x5b8b, 0x4158 => 0x5c64, 0x4159 => 0x531d, 0x415a => 0x60e3, + 0x415b => 0x60f3, 0x415c => 0x635c, 0x415d => 0x6383, 0x415e => 0x633f, + 0x415f => 0x63bb, 0x4160 => 0x64cd, 0x4161 => 0x65e9, 0x4162 => 0x66f9, + 0x4163 => 0x5de3, 0x4164 => 0x69cd, 0x4165 => 0x69fd, 0x4166 => 0x6f15, + 0x4167 => 0x71e5, 0x4168 => 0x4e89, 0x4169 => 0x75e9, 0x416a => 0x76f8, + 0x416b => 0x7a93, 0x416c => 0x7cdf, 0x416d => 0x7dcf, 0x416e => 0x7d9c, + 0x416f => 0x8061, 0x4170 => 0x8349, 0x4171 => 0x8358, 0x4172 => 0x846c, + 0x4173 => 0x84bc, 0x4174 => 0x85fb, 0x4175 => 0x88c5, 0x4176 => 0x8d70, + 0x4177 => 0x9001, 0x4178 => 0x906d, 0x4179 => 0x9397, 0x417a => 0x971c, + 0x417b => 0x9a12, 0x417c => 0x50cf, 0x417d => 0x5897, 0x417e => 0x618e, + 0x4221 => 0x81d3, 0x4222 => 0x8535, 0x4223 => 0x8d08, 0x4224 => 0x9020, + 0x4225 => 0x4fc3, 0x4226 => 0x5074, 0x4227 => 0x5247, 0x4228 => 0x5373, + 0x4229 => 0x606f, 0x422a => 0x6349, 0x422b => 0x675f, 0x422c => 0x6e2c, + 0x422d => 0x8db3, 0x422e => 0x901f, 0x422f => 0x4fd7, 0x4230 => 0x5c5e, + 0x4231 => 0x8cca, 0x4232 => 0x65cf, 0x4233 => 0x7d9a, 0x4234 => 0x5352, + 0x4235 => 0x8896, 0x4236 => 0x5176, 0x4237 => 0x63c3, 0x4238 => 0x5b58, + 0x4239 => 0x5b6b, 0x423a => 0x5c0a, 0x423b => 0x640d, 0x423c => 0x6751, + 0x423d => 0x905c, 0x423e => 0x4ed6, 0x423f => 0x591a, 0x4240 => 0x592a, + 0x4241 => 0x6c70, 0x4242 => 0x8a51, 0x4243 => 0x553e, 0x4244 => 0x5815, + 0x4245 => 0x59a5, 0x4246 => 0x60f0, 0x4247 => 0x6253, 0x4248 => 0x67c1, + 0x4249 => 0x8235, 0x424a => 0x6955, 0x424b => 0x9640, 0x424c => 0x99c4, + 0x424d => 0x9a28, 0x424e => 0x4f53, 0x424f => 0x5806, 0x4250 => 0x5bfe, + 0x4251 => 0x8010, 0x4252 => 0x5cb1, 0x4253 => 0x5e2f, 0x4254 => 0x5f85, + 0x4255 => 0x6020, 0x4256 => 0x614b, 0x4257 => 0x6234, 0x4258 => 0x66ff, + 0x4259 => 0x6cf0, 0x425a => 0x6ede, 0x425b => 0x80ce, 0x425c => 0x817f, + 0x425d => 0x82d4, 0x425e => 0x888b, 0x425f => 0x8cb8, 0x4260 => 0x9000, + 0x4261 => 0x902e, 0x4262 => 0x968a, 0x4263 => 0x9edb, 0x4264 => 0x9bdb, + 0x4265 => 0x4ee3, 0x4266 => 0x53f0, 0x4267 => 0x5927, 0x4268 => 0x7b2c, + 0x4269 => 0x918d, 0x426a => 0x984c, 0x426b => 0x9df9, 0x426c => 0x6edd, + 0x426d => 0x7027, 0x426e => 0x5353, 0x426f => 0x5544, 0x4270 => 0x5b85, + 0x4271 => 0x6258, 0x4272 => 0x629e, 0x4273 => 0x62d3, 0x4274 => 0x6ca2, + 0x4275 => 0x6fef, 0x4276 => 0x7422, 0x4277 => 0x8a17, 0x4278 => 0x9438, + 0x4279 => 0x6fc1, 0x427a => 0x8afe, 0x427b => 0x8338, 0x427c => 0x51e7, + 0x427d => 0x86f8, 0x427e => 0x53ea, 0x4321 => 0x53e9, 0x4322 => 0x4f46, + 0x4323 => 0x9054, 0x4324 => 0x8fb0, 0x4325 => 0x596a, 0x4326 => 0x8131, + 0x4327 => 0x5dfd, 0x4328 => 0x7aea, 0x4329 => 0x8fbf, 0x432a => 0x68da, + 0x432b => 0x8c37, 0x432c => 0x72f8, 0x432d => 0x9c48, 0x432e => 0x6a3d, + 0x432f => 0x8ab0, 0x4330 => 0x4e39, 0x4331 => 0x5358, 0x4332 => 0x5606, + 0x4333 => 0x5766, 0x4334 => 0x62c5, 0x4335 => 0x63a2, 0x4336 => 0x65e6, + 0x4337 => 0x6b4e, 0x4338 => 0x6de1, 0x4339 => 0x6e5b, 0x433a => 0x70ad, + 0x433b => 0x77ed, 0x433c => 0x7aef, 0x433d => 0x7baa, 0x433e => 0x7dbb, + 0x433f => 0x803d, 0x4340 => 0x80c6, 0x4341 => 0x86cb, 0x4342 => 0x8a95, + 0x4343 => 0x935b, 0x4344 => 0x56e3, 0x4345 => 0x58c7, 0x4346 => 0x5f3e, + 0x4347 => 0x65ad, 0x4348 => 0x6696, 0x4349 => 0x6a80, 0x434a => 0x6bb5, + 0x434b => 0x7537, 0x434c => 0x8ac7, 0x434d => 0x5024, 0x434e => 0x77e5, + 0x434f => 0x5730, 0x4350 => 0x5f1b, 0x4351 => 0x6065, 0x4352 => 0x667a, + 0x4353 => 0x6c60, 0x4354 => 0x75f4, 0x4355 => 0x7a1a, 0x4356 => 0x7f6e, + 0x4357 => 0x81f4, 0x4358 => 0x8718, 0x4359 => 0x9045, 0x435a => 0x99b3, + 0x435b => 0x7bc9, 0x435c => 0x755c, 0x435d => 0x7af9, 0x435e => 0x7b51, + 0x435f => 0x84c4, 0x4360 => 0x9010, 0x4361 => 0x79e9, 0x4362 => 0x7a92, + 0x4363 => 0x8336, 0x4364 => 0x5ae1, 0x4365 => 0x7740, 0x4366 => 0x4e2d, + 0x4367 => 0x4ef2, 0x4368 => 0x5b99, 0x4369 => 0x5fe0, 0x436a => 0x62bd, + 0x436b => 0x663c, 0x436c => 0x67f1, 0x436d => 0x6ce8, 0x436e => 0x866b, + 0x436f => 0x8877, 0x4370 => 0x8a3b, 0x4371 => 0x914e, 0x4372 => 0x92f3, + 0x4373 => 0x99d0, 0x4374 => 0x6a17, 0x4375 => 0x7026, 0x4376 => 0x732a, + 0x4377 => 0x82e7, 0x4378 => 0x8457, 0x4379 => 0x8caf, 0x437a => 0x4e01, + 0x437b => 0x5146, 0x437c => 0x51cb, 0x437d => 0x558b, 0x437e => 0x5bf5, + 0x4421 => 0x5e16, 0x4422 => 0x5e33, 0x4423 => 0x5e81, 0x4424 => 0x5f14, + 0x4425 => 0x5f35, 0x4426 => 0x5f6b, 0x4427 => 0x5fb4, 0x4428 => 0x61f2, + 0x4429 => 0x6311, 0x442a => 0x66a2, 0x442b => 0x671d, 0x442c => 0x6f6e, + 0x442d => 0x7252, 0x442e => 0x753a, 0x442f => 0x773a, 0x4430 => 0x8074, + 0x4431 => 0x8139, 0x4432 => 0x8178, 0x4433 => 0x8776, 0x4434 => 0x8abf, + 0x4435 => 0x8adc, 0x4436 => 0x8d85, 0x4437 => 0x8df3, 0x4438 => 0x929a, + 0x4439 => 0x9577, 0x443a => 0x9802, 0x443b => 0x9ce5, 0x443c => 0x52c5, + 0x443d => 0x6357, 0x443e => 0x76f4, 0x443f => 0x6715, 0x4440 => 0x6c88, + 0x4441 => 0x73cd, 0x4442 => 0x8cc3, 0x4443 => 0x93ae, 0x4444 => 0x9673, + 0x4445 => 0x6d25, 0x4446 => 0x589c, 0x4447 => 0x690e, 0x4448 => 0x69cc, + 0x4449 => 0x8ffd, 0x444a => 0x939a, 0x444b => 0x75db, 0x444c => 0x901a, + 0x444d => 0x585a, 0x444e => 0x6802, 0x444f => 0x63b4, 0x4450 => 0x69fb, + 0x4451 => 0x4f43, 0x4452 => 0x6f2c, 0x4453 => 0x67d8, 0x4454 => 0x8fbb, + 0x4455 => 0x8526, 0x4456 => 0x7db4, 0x4457 => 0x9354, 0x4458 => 0x693f, + 0x4459 => 0x6f70, 0x445a => 0x576a, 0x445b => 0x58f7, 0x445c => 0x5b2c, + 0x445d => 0x7d2c, 0x445e => 0x722a, 0x445f => 0x540a, 0x4460 => 0x91e3, + 0x4461 => 0x9db4, 0x4462 => 0x4ead, 0x4463 => 0x4f4e, 0x4464 => 0x505c, + 0x4465 => 0x5075, 0x4466 => 0x5243, 0x4467 => 0x8c9e, 0x4468 => 0x5448, + 0x4469 => 0x5824, 0x446a => 0x5b9a, 0x446b => 0x5e1d, 0x446c => 0x5e95, + 0x446d => 0x5ead, 0x446e => 0x5ef7, 0x446f => 0x5f1f, 0x4470 => 0x608c, + 0x4471 => 0x62b5, 0x4472 => 0x633a, 0x4473 => 0x63d0, 0x4474 => 0x68af, + 0x4475 => 0x6c40, 0x4476 => 0x7887, 0x4477 => 0x798e, 0x4478 => 0x7a0b, + 0x4479 => 0x7de0, 0x447a => 0x8247, 0x447b => 0x8a02, 0x447c => 0x8ae6, + 0x447d => 0x8e44, 0x447e => 0x9013, 0x4521 => 0x90b8, 0x4522 => 0x912d, + 0x4523 => 0x91d8, 0x4524 => 0x9f0e, 0x4525 => 0x6ce5, 0x4526 => 0x6458, + 0x4527 => 0x64e2, 0x4528 => 0x6575, 0x4529 => 0x6ef4, 0x452a => 0x7684, + 0x452b => 0x7b1b, 0x452c => 0x9069, 0x452d => 0x93d1, 0x452e => 0x6eba, + 0x452f => 0x54f2, 0x4530 => 0x5fb9, 0x4531 => 0x64a4, 0x4532 => 0x8f4d, + 0x4533 => 0x8fed, 0x4534 => 0x9244, 0x4535 => 0x5178, 0x4536 => 0x586b, + 0x4537 => 0x5929, 0x4538 => 0x5c55, 0x4539 => 0x5e97, 0x453a => 0x6dfb, + 0x453b => 0x7e8f, 0x453c => 0x751c, 0x453d => 0x8cbc, 0x453e => 0x8ee2, + 0x453f => 0x985b, 0x4540 => 0x70b9, 0x4541 => 0x4f1d, 0x4542 => 0x6bbf, + 0x4543 => 0x6fb1, 0x4544 => 0x7530, 0x4545 => 0x96fb, 0x4546 => 0x514e, + 0x4547 => 0x5410, 0x4548 => 0x5835, 0x4549 => 0x5857, 0x454a => 0x59ac, + 0x454b => 0x5c60, 0x454c => 0x5f92, 0x454d => 0x6597, 0x454e => 0x675c, + 0x454f => 0x6e21, 0x4550 => 0x767b, 0x4551 => 0x83df, 0x4552 => 0x8ced, + 0x4553 => 0x9014, 0x4554 => 0x90fd, 0x4555 => 0x934d, 0x4556 => 0x7825, + 0x4557 => 0x783a, 0x4558 => 0x52aa, 0x4559 => 0x5ea6, 0x455a => 0x571f, + 0x455b => 0x5974, 0x455c => 0x6012, 0x455d => 0x5012, 0x455e => 0x515a, + 0x455f => 0x51ac, 0x4560 => 0x51cd, 0x4561 => 0x5200, 0x4562 => 0x5510, + 0x4563 => 0x5854, 0x4564 => 0x5858, 0x4565 => 0x5957, 0x4566 => 0x5b95, + 0x4567 => 0x5cf6, 0x4568 => 0x5d8b, 0x4569 => 0x60bc, 0x456a => 0x6295, + 0x456b => 0x642d, 0x456c => 0x6771, 0x456d => 0x6843, 0x456e => 0x68bc, + 0x456f => 0x68df, 0x4570 => 0x76d7, 0x4571 => 0x6dd8, 0x4572 => 0x6e6f, + 0x4573 => 0x6d9b, 0x4574 => 0x706f, 0x4575 => 0x71c8, 0x4576 => 0x5f53, + 0x4577 => 0x75d8, 0x4578 => 0x7977, 0x4579 => 0x7b49, 0x457a => 0x7b54, + 0x457b => 0x7b52, 0x457c => 0x7cd6, 0x457d => 0x7d71, 0x457e => 0x5230, + 0x4621 => 0x8463, 0x4622 => 0x8569, 0x4623 => 0x85e4, 0x4624 => 0x8a0e, + 0x4625 => 0x8b04, 0x4626 => 0x8c46, 0x4627 => 0x8e0f, 0x4628 => 0x9003, + 0x4629 => 0x900f, 0x462a => 0x9419, 0x462b => 0x9676, 0x462c => 0x982d, + 0x462d => 0x9a30, 0x462e => 0x95d8, 0x462f => 0x50cd, 0x4630 => 0x52d5, + 0x4631 => 0x540c, 0x4632 => 0x5802, 0x4633 => 0x5c0e, 0x4634 => 0x61a7, + 0x4635 => 0x649e, 0x4636 => 0x6d1e, 0x4637 => 0x77b3, 0x4638 => 0x7ae5, + 0x4639 => 0x80f4, 0x463a => 0x8404, 0x463b => 0x9053, 0x463c => 0x9285, + 0x463d => 0x5ce0, 0x463e => 0x9d07, 0x463f => 0x533f, 0x4640 => 0x5f97, + 0x4641 => 0x5fb3, 0x4642 => 0x6d9c, 0x4643 => 0x7279, 0x4644 => 0x7763, + 0x4645 => 0x79bf, 0x4646 => 0x7be4, 0x4647 => 0x6bd2, 0x4648 => 0x72ec, + 0x4649 => 0x8aad, 0x464a => 0x6803, 0x464b => 0x6a61, 0x464c => 0x51f8, + 0x464d => 0x7a81, 0x464e => 0x6934, 0x464f => 0x5c4a, 0x4650 => 0x9cf6, + 0x4651 => 0x82eb, 0x4652 => 0x5bc5, 0x4653 => 0x9149, 0x4654 => 0x701e, + 0x4655 => 0x5678, 0x4656 => 0x5c6f, 0x4657 => 0x60c7, 0x4658 => 0x6566, + 0x4659 => 0x6c8c, 0x465a => 0x8c5a, 0x465b => 0x9041, 0x465c => 0x9813, + 0x465d => 0x5451, 0x465e => 0x66c7, 0x465f => 0x920d, 0x4660 => 0x5948, + 0x4661 => 0x90a3, 0x4662 => 0x5185, 0x4663 => 0x4e4d, 0x4664 => 0x51ea, + 0x4665 => 0x8599, 0x4666 => 0x8b0e, 0x4667 => 0x7058, 0x4668 => 0x637a, + 0x4669 => 0x934b, 0x466a => 0x6962, 0x466b => 0x99b4, 0x466c => 0x7e04, + 0x466d => 0x7577, 0x466e => 0x5357, 0x466f => 0x6960, 0x4670 => 0x8edf, + 0x4671 => 0x96e3, 0x4672 => 0x6c5d, 0x4673 => 0x4e8c, 0x4674 => 0x5c3c, + 0x4675 => 0x5f10, 0x4676 => 0x8fe9, 0x4677 => 0x5302, 0x4678 => 0x8cd1, + 0x4679 => 0x8089, 0x467a => 0x8679, 0x467b => 0x5eff, 0x467c => 0x65e5, + 0x467d => 0x4e73, 0x467e => 0x5165, 0x4721 => 0x5982, 0x4722 => 0x5c3f, + 0x4723 => 0x97ee, 0x4724 => 0x4efb, 0x4725 => 0x598a, 0x4726 => 0x5fcd, + 0x4727 => 0x8a8d, 0x4728 => 0x6fe1, 0x4729 => 0x79b0, 0x472a => 0x7962, + 0x472b => 0x5be7, 0x472c => 0x8471, 0x472d => 0x732b, 0x472e => 0x71b1, + 0x472f => 0x5e74, 0x4730 => 0x5ff5, 0x4731 => 0x637b, 0x4732 => 0x649a, + 0x4733 => 0x71c3, 0x4734 => 0x7c98, 0x4735 => 0x4e43, 0x4736 => 0x5efc, + 0x4737 => 0x4e4b, 0x4738 => 0x57dc, 0x4739 => 0x56a2, 0x473a => 0x60a9, + 0x473b => 0x6fc3, 0x473c => 0x7d0d, 0x473d => 0x80fd, 0x473e => 0x8133, + 0x473f => 0x81bf, 0x4740 => 0x8fb2, 0x4741 => 0x8997, 0x4742 => 0x86a4, + 0x4743 => 0x5df4, 0x4744 => 0x628a, 0x4745 => 0x64ad, 0x4746 => 0x8987, + 0x4747 => 0x6777, 0x4748 => 0x6ce2, 0x4749 => 0x6d3e, 0x474a => 0x7436, + 0x474b => 0x7834, 0x474c => 0x5a46, 0x474d => 0x7f75, 0x474e => 0x82ad, + 0x474f => 0x99ac, 0x4750 => 0x4ff3, 0x4751 => 0x5ec3, 0x4752 => 0x62dd, + 0x4753 => 0x6392, 0x4754 => 0x6557, 0x4755 => 0x676f, 0x4756 => 0x76c3, + 0x4757 => 0x724c, 0x4758 => 0x80cc, 0x4759 => 0x80ba, 0x475a => 0x8f29, + 0x475b => 0x914d, 0x475c => 0x500d, 0x475d => 0x57f9, 0x475e => 0x5a92, + 0x475f => 0x6885, 0x4760 => 0x6973, 0x4761 => 0x7164, 0x4762 => 0x72fd, + 0x4763 => 0x8cb7, 0x4764 => 0x58f2, 0x4765 => 0x8ce0, 0x4766 => 0x966a, + 0x4767 => 0x9019, 0x4768 => 0x877f, 0x4769 => 0x79e4, 0x476a => 0x77e7, + 0x476b => 0x8429, 0x476c => 0x4f2f, 0x476d => 0x5265, 0x476e => 0x535a, + 0x476f => 0x62cd, 0x4770 => 0x67cf, 0x4771 => 0x6cca, 0x4772 => 0x767d, + 0x4773 => 0x7b94, 0x4774 => 0x7c95, 0x4775 => 0x8236, 0x4776 => 0x8584, + 0x4777 => 0x8feb, 0x4778 => 0x66dd, 0x4779 => 0x6f20, 0x477a => 0x7206, + 0x477b => 0x7e1b, 0x477c => 0x83ab, 0x477d => 0x99c1, 0x477e => 0x9ea6, + 0x4821 => 0x51fd, 0x4822 => 0x7bb1, 0x4823 => 0x7872, 0x4824 => 0x7bb8, + 0x4825 => 0x8087, 0x4826 => 0x7b48, 0x4827 => 0x6ae8, 0x4828 => 0x5e61, + 0x4829 => 0x808c, 0x482a => 0x7551, 0x482b => 0x7560, 0x482c => 0x516b, + 0x482d => 0x9262, 0x482e => 0x6e8c, 0x482f => 0x767a, 0x4830 => 0x9197, + 0x4831 => 0x9aea, 0x4832 => 0x4f10, 0x4833 => 0x7f70, 0x4834 => 0x629c, + 0x4835 => 0x7b4f, 0x4836 => 0x95a5, 0x4837 => 0x9ce9, 0x4838 => 0x567a, + 0x4839 => 0x5859, 0x483a => 0x86e4, 0x483b => 0x96bc, 0x483c => 0x4f34, + 0x483d => 0x5224, 0x483e => 0x534a, 0x483f => 0x53cd, 0x4840 => 0x53db, + 0x4841 => 0x5e06, 0x4842 => 0x642c, 0x4843 => 0x6591, 0x4844 => 0x677f, + 0x4845 => 0x6c3e, 0x4846 => 0x6c4e, 0x4847 => 0x7248, 0x4848 => 0x72af, + 0x4849 => 0x73ed, 0x484a => 0x7554, 0x484b => 0x7e41, 0x484c => 0x822c, + 0x484d => 0x85e9, 0x484e => 0x8ca9, 0x484f => 0x7bc4, 0x4850 => 0x91c6, + 0x4851 => 0x7169, 0x4852 => 0x9812, 0x4853 => 0x98ef, 0x4854 => 0x633d, + 0x4855 => 0x6669, 0x4856 => 0x756a, 0x4857 => 0x76e4, 0x4858 => 0x78d0, + 0x4859 => 0x8543, 0x485a => 0x86ee, 0x485b => 0x532a, 0x485c => 0x5351, + 0x485d => 0x5426, 0x485e => 0x5983, 0x485f => 0x5e87, 0x4860 => 0x5f7c, + 0x4861 => 0x60b2, 0x4862 => 0x6249, 0x4863 => 0x6279, 0x4864 => 0x62ab, + 0x4865 => 0x6590, 0x4866 => 0x6bd4, 0x4867 => 0x6ccc, 0x4868 => 0x75b2, + 0x4869 => 0x76ae, 0x486a => 0x7891, 0x486b => 0x79d8, 0x486c => 0x7dcb, + 0x486d => 0x7f77, 0x486e => 0x80a5, 0x486f => 0x88ab, 0x4870 => 0x8ab9, + 0x4871 => 0x8cbb, 0x4872 => 0x907f, 0x4873 => 0x975e, 0x4874 => 0x98db, + 0x4875 => 0x6a0b, 0x4876 => 0x7c38, 0x4877 => 0x5099, 0x4878 => 0x5c3e, + 0x4879 => 0x5fae, 0x487a => 0x6787, 0x487b => 0x6bd8, 0x487c => 0x7435, + 0x487d => 0x7709, 0x487e => 0x7f8e, 0x4921 => 0x9f3b, 0x4922 => 0x67ca, + 0x4923 => 0x7a17, 0x4924 => 0x5339, 0x4925 => 0x758b, 0x4926 => 0x9aed, + 0x4927 => 0x5f66, 0x4928 => 0x819d, 0x4929 => 0x83f1, 0x492a => 0x8098, + 0x492b => 0x5f3c, 0x492c => 0x5fc5, 0x492d => 0x7562, 0x492e => 0x7b46, + 0x492f => 0x903c, 0x4930 => 0x6867, 0x4931 => 0x59eb, 0x4932 => 0x5a9b, + 0x4933 => 0x7d10, 0x4934 => 0x767e, 0x4935 => 0x8b2c, 0x4936 => 0x4ff5, + 0x4937 => 0x5f6a, 0x4938 => 0x6a19, 0x4939 => 0x6c37, 0x493a => 0x6f02, + 0x493b => 0x74e2, 0x493c => 0x7968, 0x493d => 0x8868, 0x493e => 0x8a55, + 0x493f => 0x8c79, 0x4940 => 0x5edf, 0x4941 => 0x63cf, 0x4942 => 0x75c5, + 0x4943 => 0x79d2, 0x4944 => 0x82d7, 0x4945 => 0x9328, 0x4946 => 0x92f2, + 0x4947 => 0x849c, 0x4948 => 0x86ed, 0x4949 => 0x9c2d, 0x494a => 0x54c1, + 0x494b => 0x5f6c, 0x494c => 0x658c, 0x494d => 0x6d5c, 0x494e => 0x7015, + 0x494f => 0x8ca7, 0x4950 => 0x8cd3, 0x4951 => 0x983b, 0x4952 => 0x654f, + 0x4953 => 0x74f6, 0x4954 => 0x4e0d, 0x4955 => 0x4ed8, 0x4956 => 0x57e0, + 0x4957 => 0x592b, 0x4958 => 0x5a66, 0x4959 => 0x5bcc, 0x495a => 0x51a8, + 0x495b => 0x5e03, 0x495c => 0x5e9c, 0x495d => 0x6016, 0x495e => 0x6276, + 0x495f => 0x6577, 0x4960 => 0x65a7, 0x4961 => 0x666e, 0x4962 => 0x6d6e, + 0x4963 => 0x7236, 0x4964 => 0x7b26, 0x4965 => 0x8150, 0x4966 => 0x819a, + 0x4967 => 0x8299, 0x4968 => 0x8b5c, 0x4969 => 0x8ca0, 0x496a => 0x8ce6, + 0x496b => 0x8d74, 0x496c => 0x961c, 0x496d => 0x9644, 0x496e => 0x4fae, + 0x496f => 0x64ab, 0x4970 => 0x6b66, 0x4971 => 0x821e, 0x4972 => 0x8461, + 0x4973 => 0x856a, 0x4974 => 0x90e8, 0x4975 => 0x5c01, 0x4976 => 0x6953, + 0x4977 => 0x98a8, 0x4978 => 0x847a, 0x4979 => 0x8557, 0x497a => 0x4f0f, + 0x497b => 0x526f, 0x497c => 0x5fa9, 0x497d => 0x5e45, 0x497e => 0x670d, + 0x4a21 => 0x798f, 0x4a22 => 0x8179, 0x4a23 => 0x8907, 0x4a24 => 0x8986, + 0x4a25 => 0x6df5, 0x4a26 => 0x5f17, 0x4a27 => 0x6255, 0x4a28 => 0x6cb8, + 0x4a29 => 0x4ecf, 0x4a2a => 0x7269, 0x4a2b => 0x9b92, 0x4a2c => 0x5206, + 0x4a2d => 0x543b, 0x4a2e => 0x5674, 0x4a2f => 0x58b3, 0x4a30 => 0x61a4, + 0x4a31 => 0x626e, 0x4a32 => 0x711a, 0x4a33 => 0x596e, 0x4a34 => 0x7c89, + 0x4a35 => 0x7cde, 0x4a36 => 0x7d1b, 0x4a37 => 0x96f0, 0x4a38 => 0x6587, + 0x4a39 => 0x805e, 0x4a3a => 0x4e19, 0x4a3b => 0x4f75, 0x4a3c => 0x5175, + 0x4a3d => 0x5840, 0x4a3e => 0x5e63, 0x4a3f => 0x5e73, 0x4a40 => 0x5f0a, + 0x4a41 => 0x67c4, 0x4a42 => 0x4e26, 0x4a43 => 0x853d, 0x4a44 => 0x9589, + 0x4a45 => 0x965b, 0x4a46 => 0x7c73, 0x4a47 => 0x9801, 0x4a48 => 0x50fb, + 0x4a49 => 0x58c1, 0x4a4a => 0x7656, 0x4a4b => 0x78a7, 0x4a4c => 0x5225, + 0x4a4d => 0x77a5, 0x4a4e => 0x8511, 0x4a4f => 0x7b86, 0x4a50 => 0x504f, + 0x4a51 => 0x5909, 0x4a52 => 0x7247, 0x4a53 => 0x7bc7, 0x4a54 => 0x7de8, + 0x4a55 => 0x8fba, 0x4a56 => 0x8fd4, 0x4a57 => 0x904d, 0x4a58 => 0x4fbf, + 0x4a59 => 0x52c9, 0x4a5a => 0x5a29, 0x4a5b => 0x5f01, 0x4a5c => 0x97ad, + 0x4a5d => 0x4fdd, 0x4a5e => 0x8217, 0x4a5f => 0x92ea, 0x4a60 => 0x5703, + 0x4a61 => 0x6355, 0x4a62 => 0x6b69, 0x4a63 => 0x752b, 0x4a64 => 0x88dc, + 0x4a65 => 0x8f14, 0x4a66 => 0x7a42, 0x4a67 => 0x52df, 0x4a68 => 0x5893, + 0x4a69 => 0x6155, 0x4a6a => 0x620a, 0x4a6b => 0x66ae, 0x4a6c => 0x6bcd, + 0x4a6d => 0x7c3f, 0x4a6e => 0x83e9, 0x4a6f => 0x5023, 0x4a70 => 0x4ff8, + 0x4a71 => 0x5305, 0x4a72 => 0x5446, 0x4a73 => 0x5831, 0x4a74 => 0x5949, + 0x4a75 => 0x5b9d, 0x4a76 => 0x5cf0, 0x4a77 => 0x5cef, 0x4a78 => 0x5d29, + 0x4a79 => 0x5e96, 0x4a7a => 0x62b1, 0x4a7b => 0x6367, 0x4a7c => 0x653e, + 0x4a7d => 0x65b9, 0x4a7e => 0x670b, 0x4b21 => 0x6cd5, 0x4b22 => 0x6ce1, + 0x4b23 => 0x70f9, 0x4b24 => 0x7832, 0x4b25 => 0x7e2b, 0x4b26 => 0x80de, + 0x4b27 => 0x82b3, 0x4b28 => 0x840c, 0x4b29 => 0x84ec, 0x4b2a => 0x8702, + 0x4b2b => 0x8912, 0x4b2c => 0x8a2a, 0x4b2d => 0x8c4a, 0x4b2e => 0x90a6, + 0x4b2f => 0x92d2, 0x4b30 => 0x98fd, 0x4b31 => 0x9cf3, 0x4b32 => 0x9d6c, + 0x4b33 => 0x4e4f, 0x4b34 => 0x4ea1, 0x4b35 => 0x508d, 0x4b36 => 0x5256, + 0x4b37 => 0x574a, 0x4b38 => 0x59a8, 0x4b39 => 0x5e3d, 0x4b3a => 0x5fd8, + 0x4b3b => 0x5fd9, 0x4b3c => 0x623f, 0x4b3d => 0x66b4, 0x4b3e => 0x671b, + 0x4b3f => 0x67d0, 0x4b40 => 0x68d2, 0x4b41 => 0x5192, 0x4b42 => 0x7d21, + 0x4b43 => 0x80aa, 0x4b44 => 0x81a8, 0x4b45 => 0x8b00, 0x4b46 => 0x8c8c, + 0x4b47 => 0x8cbf, 0x4b48 => 0x927e, 0x4b49 => 0x9632, 0x4b4a => 0x5420, + 0x4b4b => 0x982c, 0x4b4c => 0x5317, 0x4b4d => 0x50d5, 0x4b4e => 0x535c, + 0x4b4f => 0x58a8, 0x4b50 => 0x64b2, 0x4b51 => 0x6734, 0x4b52 => 0x7267, + 0x4b53 => 0x7766, 0x4b54 => 0x7a46, 0x4b55 => 0x91e6, 0x4b56 => 0x52c3, + 0x4b57 => 0x6ca1, 0x4b58 => 0x6b86, 0x4b59 => 0x5800, 0x4b5a => 0x5e4c, + 0x4b5b => 0x5954, 0x4b5c => 0x672c, 0x4b5d => 0x7ffb, 0x4b5e => 0x51e1, + 0x4b5f => 0x76c6, 0x4b60 => 0x6469, 0x4b61 => 0x78e8, 0x4b62 => 0x9b54, + 0x4b63 => 0x9ebb, 0x4b64 => 0x57cb, 0x4b65 => 0x59b9, 0x4b66 => 0x6627, + 0x4b67 => 0x679a, 0x4b68 => 0x6bce, 0x4b69 => 0x54e9, 0x4b6a => 0x69d9, + 0x4b6b => 0x5e55, 0x4b6c => 0x819c, 0x4b6d => 0x6795, 0x4b6e => 0x9baa, + 0x4b6f => 0x67fe, 0x4b70 => 0x9c52, 0x4b71 => 0x685d, 0x4b72 => 0x4ea6, + 0x4b73 => 0x4fe3, 0x4b74 => 0x53c8, 0x4b75 => 0x62b9, 0x4b76 => 0x672b, + 0x4b77 => 0x6cab, 0x4b78 => 0x8fc4, 0x4b79 => 0x4fad, 0x4b7a => 0x7e6d, + 0x4b7b => 0x9ebf, 0x4b7c => 0x4e07, 0x4b7d => 0x6162, 0x4b7e => 0x6e80, + 0x4c21 => 0x6f2b, 0x4c22 => 0x8513, 0x4c23 => 0x5473, 0x4c24 => 0x672a, + 0x4c25 => 0x9b45, 0x4c26 => 0x5df3, 0x4c27 => 0x7b95, 0x4c28 => 0x5cac, + 0x4c29 => 0x5bc6, 0x4c2a => 0x871c, 0x4c2b => 0x6e4a, 0x4c2c => 0x84d1, + 0x4c2d => 0x7a14, 0x4c2e => 0x8108, 0x4c2f => 0x5999, 0x4c30 => 0x7c8d, + 0x4c31 => 0x6c11, 0x4c32 => 0x7720, 0x4c33 => 0x52d9, 0x4c34 => 0x5922, + 0x4c35 => 0x7121, 0x4c36 => 0x725f, 0x4c37 => 0x77db, 0x4c38 => 0x9727, + 0x4c39 => 0x9d61, 0x4c3a => 0x690b, 0x4c3b => 0x5a7f, 0x4c3c => 0x5a18, + 0x4c3d => 0x51a5, 0x4c3e => 0x540d, 0x4c3f => 0x547d, 0x4c40 => 0x660e, + 0x4c41 => 0x76df, 0x4c42 => 0x8ff7, 0x4c43 => 0x9298, 0x4c44 => 0x9cf4, + 0x4c45 => 0x59ea, 0x4c46 => 0x725d, 0x4c47 => 0x6ec5, 0x4c48 => 0x514d, + 0x4c49 => 0x68c9, 0x4c4a => 0x7dbf, 0x4c4b => 0x7dec, 0x4c4c => 0x9762, + 0x4c4d => 0x9eba, 0x4c4e => 0x6478, 0x4c4f => 0x6a21, 0x4c50 => 0x8302, + 0x4c51 => 0x5984, 0x4c52 => 0x5b5f, 0x4c53 => 0x6bdb, 0x4c54 => 0x731b, + 0x4c55 => 0x76f2, 0x4c56 => 0x7db2, 0x4c57 => 0x8017, 0x4c58 => 0x8499, + 0x4c59 => 0x5132, 0x4c5a => 0x6728, 0x4c5b => 0x9ed9, 0x4c5c => 0x76ee, + 0x4c5d => 0x6762, 0x4c5e => 0x52ff, 0x4c5f => 0x9905, 0x4c60 => 0x5c24, + 0x4c61 => 0x623b, 0x4c62 => 0x7c7e, 0x4c63 => 0x8cb0, 0x4c64 => 0x554f, + 0x4c65 => 0x60b6, 0x4c66 => 0x7d0b, 0x4c67 => 0x9580, 0x4c68 => 0x5301, + 0x4c69 => 0x4e5f, 0x4c6a => 0x51b6, 0x4c6b => 0x591c, 0x4c6c => 0x723a, + 0x4c6d => 0x8036, 0x4c6e => 0x91ce, 0x4c6f => 0x5f25, 0x4c70 => 0x77e2, + 0x4c71 => 0x5384, 0x4c72 => 0x5f79, 0x4c73 => 0x7d04, 0x4c74 => 0x85ac, + 0x4c75 => 0x8a33, 0x4c76 => 0x8e8d, 0x4c77 => 0x9756, 0x4c78 => 0x67f3, + 0x4c79 => 0x85ae, 0x4c7a => 0x9453, 0x4c7b => 0x6109, 0x4c7c => 0x6108, + 0x4c7d => 0x6cb9, 0x4c7e => 0x7652, 0x4d21 => 0x8aed, 0x4d22 => 0x8f38, + 0x4d23 => 0x552f, 0x4d24 => 0x4f51, 0x4d25 => 0x512a, 0x4d26 => 0x52c7, + 0x4d27 => 0x53cb, 0x4d28 => 0x5ba5, 0x4d29 => 0x5e7d, 0x4d2a => 0x60a0, + 0x4d2b => 0x6182, 0x4d2c => 0x63d6, 0x4d2d => 0x6709, 0x4d2e => 0x67da, + 0x4d2f => 0x6e67, 0x4d30 => 0x6d8c, 0x4d31 => 0x7336, 0x4d32 => 0x7337, + 0x4d33 => 0x7531, 0x4d34 => 0x7950, 0x4d35 => 0x88d5, 0x4d36 => 0x8a98, + 0x4d37 => 0x904a, 0x4d38 => 0x9091, 0x4d39 => 0x90f5, 0x4d3a => 0x96c4, + 0x4d3b => 0x878d, 0x4d3c => 0x5915, 0x4d3d => 0x4e88, 0x4d3e => 0x4f59, + 0x4d3f => 0x4e0e, 0x4d40 => 0x8a89, 0x4d41 => 0x8f3f, 0x4d42 => 0x9810, + 0x4d43 => 0x50ad, 0x4d44 => 0x5e7c, 0x4d45 => 0x5996, 0x4d46 => 0x5bb9, + 0x4d47 => 0x5eb8, 0x4d48 => 0x63da, 0x4d49 => 0x63fa, 0x4d4a => 0x64c1, + 0x4d4b => 0x66dc, 0x4d4c => 0x694a, 0x4d4d => 0x69d8, 0x4d4e => 0x6d0b, + 0x4d4f => 0x6eb6, 0x4d50 => 0x7194, 0x4d51 => 0x7528, 0x4d52 => 0x7aaf, + 0x4d53 => 0x7f8a, 0x4d54 => 0x8000, 0x4d55 => 0x8449, 0x4d56 => 0x84c9, + 0x4d57 => 0x8981, 0x4d58 => 0x8b21, 0x4d59 => 0x8e0a, 0x4d5a => 0x9065, + 0x4d5b => 0x967d, 0x4d5c => 0x990a, 0x4d5d => 0x617e, 0x4d5e => 0x6291, + 0x4d5f => 0x6b32, 0x4d60 => 0x6c83, 0x4d61 => 0x6d74, 0x4d62 => 0x7fcc, + 0x4d63 => 0x7ffc, 0x4d64 => 0x6dc0, 0x4d65 => 0x7f85, 0x4d66 => 0x87ba, + 0x4d67 => 0x88f8, 0x4d68 => 0x6765, 0x4d69 => 0x83b1, 0x4d6a => 0x983c, + 0x4d6b => 0x96f7, 0x4d6c => 0x6d1b, 0x4d6d => 0x7d61, 0x4d6e => 0x843d, + 0x4d6f => 0x916a, 0x4d70 => 0x4e71, 0x4d71 => 0x5375, 0x4d72 => 0x5d50, + 0x4d73 => 0x6b04, 0x4d74 => 0x6feb, 0x4d75 => 0x85cd, 0x4d76 => 0x862d, + 0x4d77 => 0x89a7, 0x4d78 => 0x5229, 0x4d79 => 0x540f, 0x4d7a => 0x5c65, + 0x4d7b => 0x674e, 0x4d7c => 0x68a8, 0x4d7d => 0x7406, 0x4d7e => 0x7483, + 0x4e21 => 0x75e2, 0x4e22 => 0x88cf, 0x4e23 => 0x88e1, 0x4e24 => 0x91cc, + 0x4e25 => 0x96e2, 0x4e26 => 0x9678, 0x4e27 => 0x5f8b, 0x4e28 => 0x7387, + 0x4e29 => 0x7acb, 0x4e2a => 0x844e, 0x4e2b => 0x63a0, 0x4e2c => 0x7565, + 0x4e2d => 0x5289, 0x4e2e => 0x6d41, 0x4e2f => 0x6e9c, 0x4e30 => 0x7409, + 0x4e31 => 0x7559, 0x4e32 => 0x786b, 0x4e33 => 0x7c92, 0x4e34 => 0x9686, + 0x4e35 => 0x7adc, 0x4e36 => 0x9f8d, 0x4e37 => 0x4fb6, 0x4e38 => 0x616e, + 0x4e39 => 0x65c5, 0x4e3a => 0x865c, 0x4e3b => 0x4e86, 0x4e3c => 0x4eae, + 0x4e3d => 0x50da, 0x4e3e => 0x4e21, 0x4e3f => 0x51cc, 0x4e40 => 0x5bee, + 0x4e41 => 0x6599, 0x4e42 => 0x6881, 0x4e43 => 0x6dbc, 0x4e44 => 0x731f, + 0x4e45 => 0x7642, 0x4e46 => 0x77ad, 0x4e47 => 0x7a1c, 0x4e48 => 0x7ce7, + 0x4e49 => 0x826f, 0x4e4a => 0x8ad2, 0x4e4b => 0x907c, 0x4e4c => 0x91cf, + 0x4e4d => 0x9675, 0x4e4e => 0x9818, 0x4e4f => 0x529b, 0x4e50 => 0x7dd1, + 0x4e51 => 0x502b, 0x4e52 => 0x5398, 0x4e53 => 0x6797, 0x4e54 => 0x6dcb, + 0x4e55 => 0x71d0, 0x4e56 => 0x7433, 0x4e57 => 0x81e8, 0x4e58 => 0x8f2a, + 0x4e59 => 0x96a3, 0x4e5a => 0x9c57, 0x4e5b => 0x9e9f, 0x4e5c => 0x7460, + 0x4e5d => 0x5841, 0x4e5e => 0x6d99, 0x4e5f => 0x7d2f, 0x4e60 => 0x985e, + 0x4e61 => 0x4ee4, 0x4e62 => 0x4f36, 0x4e63 => 0x4f8b, 0x4e64 => 0x51b7, + 0x4e65 => 0x52b1, 0x4e66 => 0x5dba, 0x4e67 => 0x601c, 0x4e68 => 0x73b2, + 0x4e69 => 0x793c, 0x4e6a => 0x82d3, 0x4e6b => 0x9234, 0x4e6c => 0x96b7, + 0x4e6d => 0x96f6, 0x4e6e => 0x970a, 0x4e6f => 0x9e97, 0x4e70 => 0x9f62, + 0x4e71 => 0x66a6, 0x4e72 => 0x6b74, 0x4e73 => 0x5217, 0x4e74 => 0x52a3, + 0x4e75 => 0x70c8, 0x4e76 => 0x88c2, 0x4e77 => 0x5ec9, 0x4e78 => 0x604b, + 0x4e79 => 0x6190, 0x4e7a => 0x6f23, 0x4e7b => 0x7149, 0x4e7c => 0x7c3e, + 0x4e7d => 0x7df4, 0x4e7e => 0x806f, 0x4f21 => 0x84ee, 0x4f22 => 0x9023, + 0x4f23 => 0x932c, 0x4f24 => 0x5442, 0x4f25 => 0x9b6f, 0x4f26 => 0x6ad3, + 0x4f27 => 0x7089, 0x4f28 => 0x8cc2, 0x4f29 => 0x8def, 0x4f2a => 0x9732, + 0x4f2b => 0x52b4, 0x4f2c => 0x5a41, 0x4f2d => 0x5eca, 0x4f2e => 0x5f04, + 0x4f2f => 0x6717, 0x4f30 => 0x697c, 0x4f31 => 0x6994, 0x4f32 => 0x6d6a, + 0x4f33 => 0x6f0f, 0x4f34 => 0x7262, 0x4f35 => 0x72fc, 0x4f36 => 0x7bed, + 0x4f37 => 0x8001, 0x4f38 => 0x807e, 0x4f39 => 0x874b, 0x4f3a => 0x90ce, + 0x4f3b => 0x516d, 0x4f3c => 0x9e93, 0x4f3d => 0x7984, 0x4f3e => 0x808b, + 0x4f3f => 0x9332, 0x4f40 => 0x8ad6, 0x4f41 => 0x502d, 0x4f42 => 0x548c, + 0x4f43 => 0x8a71, 0x4f44 => 0x6b6a, 0x4f45 => 0x8cc4, 0x4f46 => 0x8107, + 0x4f47 => 0x60d1, 0x4f48 => 0x67a0, 0x4f49 => 0x9df2, 0x4f4a => 0x4e99, + 0x4f4b => 0x4e98, 0x4f4c => 0x9c10, 0x4f4d => 0x8a6b, 0x4f4e => 0x85c1, + 0x4f4f => 0x8568, 0x4f50 => 0x6900, 0x4f51 => 0x6e7e, 0x4f52 => 0x7897, + 0x4f53 => 0x8155, 0x5021 => 0x5f0c, 0x5022 => 0x4e10, 0x5023 => 0x4e15, + 0x5024 => 0x4e2a, 0x5025 => 0x4e31, 0x5026 => 0x4e36, 0x5027 => 0x4e3c, + 0x5028 => 0x4e3f, 0x5029 => 0x4e42, 0x502a => 0x4e56, 0x502b => 0x4e58, + 0x502c => 0x4e82, 0x502d => 0x4e85, 0x502e => 0x8c6b, 0x502f => 0x4e8a, + 0x5030 => 0x8212, 0x5031 => 0x5f0d, 0x5032 => 0x4e8e, 0x5033 => 0x4e9e, + 0x5034 => 0x4e9f, 0x5035 => 0x4ea0, 0x5036 => 0x4ea2, 0x5037 => 0x4eb0, + 0x5038 => 0x4eb3, 0x5039 => 0x4eb6, 0x503a => 0x4ece, 0x503b => 0x4ecd, + 0x503c => 0x4ec4, 0x503d => 0x4ec6, 0x503e => 0x4ec2, 0x503f => 0x4ed7, + 0x5040 => 0x4ede, 0x5041 => 0x4eed, 0x5042 => 0x4edf, 0x5043 => 0x4ef7, + 0x5044 => 0x4f09, 0x5045 => 0x4f5a, 0x5046 => 0x4f30, 0x5047 => 0x4f5b, + 0x5048 => 0x4f5d, 0x5049 => 0x4f57, 0x504a => 0x4f47, 0x504b => 0x4f76, + 0x504c => 0x4f88, 0x504d => 0x4f8f, 0x504e => 0x4f98, 0x504f => 0x4f7b, + 0x5050 => 0x4f69, 0x5051 => 0x4f70, 0x5052 => 0x4f91, 0x5053 => 0x4f6f, + 0x5054 => 0x4f86, 0x5055 => 0x4f96, 0x5056 => 0x5118, 0x5057 => 0x4fd4, + 0x5058 => 0x4fdf, 0x5059 => 0x4fce, 0x505a => 0x4fd8, 0x505b => 0x4fdb, + 0x505c => 0x4fd1, 0x505d => 0x4fda, 0x505e => 0x4fd0, 0x505f => 0x4fe4, + 0x5060 => 0x4fe5, 0x5061 => 0x501a, 0x5062 => 0x5028, 0x5063 => 0x5014, + 0x5064 => 0x502a, 0x5065 => 0x5025, 0x5066 => 0x5005, 0x5067 => 0x4f1c, + 0x5068 => 0x4ff6, 0x5069 => 0x5021, 0x506a => 0x5029, 0x506b => 0x502c, + 0x506c => 0x4ffe, 0x506d => 0x4fef, 0x506e => 0x5011, 0x506f => 0x5006, + 0x5070 => 0x5043, 0x5071 => 0x5047, 0x5072 => 0x6703, 0x5073 => 0x5055, + 0x5074 => 0x5050, 0x5075 => 0x5048, 0x5076 => 0x505a, 0x5077 => 0x5056, + 0x5078 => 0x506c, 0x5079 => 0x5078, 0x507a => 0x5080, 0x507b => 0x509a, + 0x507c => 0x5085, 0x507d => 0x50b4, 0x507e => 0x50b2, 0x5121 => 0x50c9, + 0x5122 => 0x50ca, 0x5123 => 0x50b3, 0x5124 => 0x50c2, 0x5125 => 0x50d6, + 0x5126 => 0x50de, 0x5127 => 0x50e5, 0x5128 => 0x50ed, 0x5129 => 0x50e3, + 0x512a => 0x50ee, 0x512b => 0x50f9, 0x512c => 0x50f5, 0x512d => 0x5109, + 0x512e => 0x5101, 0x512f => 0x5102, 0x5130 => 0x5116, 0x5131 => 0x5115, + 0x5132 => 0x5114, 0x5133 => 0x511a, 0x5134 => 0x5121, 0x5135 => 0x513a, + 0x5136 => 0x5137, 0x5137 => 0x513c, 0x5138 => 0x513b, 0x5139 => 0x513f, + 0x513a => 0x5140, 0x513b => 0x5152, 0x513c => 0x514c, 0x513d => 0x5154, + 0x513e => 0x5162, 0x513f => 0x7af8, 0x5140 => 0x5169, 0x5141 => 0x516a, + 0x5142 => 0x516e, 0x5143 => 0x5180, 0x5144 => 0x5182, 0x5145 => 0x56d8, + 0x5146 => 0x518c, 0x5147 => 0x5189, 0x5148 => 0x518f, 0x5149 => 0x5191, + 0x514a => 0x5193, 0x514b => 0x5195, 0x514c => 0x5196, 0x514d => 0x51a4, + 0x514e => 0x51a6, 0x514f => 0x51a2, 0x5150 => 0x51a9, 0x5151 => 0x51aa, + 0x5152 => 0x51ab, 0x5153 => 0x51b3, 0x5154 => 0x51b1, 0x5155 => 0x51b2, + 0x5156 => 0x51b0, 0x5157 => 0x51b5, 0x5158 => 0x51bd, 0x5159 => 0x51c5, + 0x515a => 0x51c9, 0x515b => 0x51db, 0x515c => 0x51e0, 0x515d => 0x8655, + 0x515e => 0x51e9, 0x515f => 0x51ed, 0x5160 => 0x51f0, 0x5161 => 0x51f5, + 0x5162 => 0x51fe, 0x5163 => 0x5204, 0x5164 => 0x520b, 0x5165 => 0x5214, + 0x5166 => 0x520e, 0x5167 => 0x5227, 0x5168 => 0x522a, 0x5169 => 0x522e, + 0x516a => 0x5233, 0x516b => 0x5239, 0x516c => 0x524f, 0x516d => 0x5244, + 0x516e => 0x524b, 0x516f => 0x524c, 0x5170 => 0x525e, 0x5171 => 0x5254, + 0x5172 => 0x526a, 0x5173 => 0x5274, 0x5174 => 0x5269, 0x5175 => 0x5273, + 0x5176 => 0x527f, 0x5177 => 0x527d, 0x5178 => 0x528d, 0x5179 => 0x5294, + 0x517a => 0x5292, 0x517b => 0x5271, 0x517c => 0x5288, 0x517d => 0x5291, + 0x517e => 0x8fa8, 0x5221 => 0x8fa7, 0x5222 => 0x52ac, 0x5223 => 0x52ad, + 0x5224 => 0x52bc, 0x5225 => 0x52b5, 0x5226 => 0x52c1, 0x5227 => 0x52cd, + 0x5228 => 0x52d7, 0x5229 => 0x52de, 0x522a => 0x52e3, 0x522b => 0x52e6, + 0x522c => 0x98ed, 0x522d => 0x52e0, 0x522e => 0x52f3, 0x522f => 0x52f5, + 0x5230 => 0x52f8, 0x5231 => 0x52f9, 0x5232 => 0x5306, 0x5233 => 0x5308, + 0x5234 => 0x7538, 0x5235 => 0x530d, 0x5236 => 0x5310, 0x5237 => 0x530f, + 0x5238 => 0x5315, 0x5239 => 0x531a, 0x523a => 0x5323, 0x523b => 0x532f, + 0x523c => 0x5331, 0x523d => 0x5333, 0x523e => 0x5338, 0x523f => 0x5340, + 0x5240 => 0x5346, 0x5241 => 0x5345, 0x5242 => 0x4e17, 0x5243 => 0x5349, + 0x5244 => 0x534d, 0x5245 => 0x51d6, 0x5246 => 0x535e, 0x5247 => 0x5369, + 0x5248 => 0x536e, 0x5249 => 0x5918, 0x524a => 0x537b, 0x524b => 0x5377, + 0x524c => 0x5382, 0x524d => 0x5396, 0x524e => 0x53a0, 0x524f => 0x53a6, + 0x5250 => 0x53a5, 0x5251 => 0x53ae, 0x5252 => 0x53b0, 0x5253 => 0x53b6, + 0x5254 => 0x53c3, 0x5255 => 0x7c12, 0x5256 => 0x96d9, 0x5257 => 0x53df, + 0x5258 => 0x66fc, 0x5259 => 0x71ee, 0x525a => 0x53ee, 0x525b => 0x53e8, + 0x525c => 0x53ed, 0x525d => 0x53fa, 0x525e => 0x5401, 0x525f => 0x543d, + 0x5260 => 0x5440, 0x5261 => 0x542c, 0x5262 => 0x542d, 0x5263 => 0x543c, + 0x5264 => 0x542e, 0x5265 => 0x5436, 0x5266 => 0x5429, 0x5267 => 0x541d, + 0x5268 => 0x544e, 0x5269 => 0x548f, 0x526a => 0x5475, 0x526b => 0x548e, + 0x526c => 0x545f, 0x526d => 0x5471, 0x526e => 0x5477, 0x526f => 0x5470, + 0x5270 => 0x5492, 0x5271 => 0x547b, 0x5272 => 0x5480, 0x5273 => 0x5476, + 0x5274 => 0x5484, 0x5275 => 0x5490, 0x5276 => 0x5486, 0x5277 => 0x54c7, + 0x5278 => 0x54a2, 0x5279 => 0x54b8, 0x527a => 0x54a5, 0x527b => 0x54ac, + 0x527c => 0x54c4, 0x527d => 0x54c8, 0x527e => 0x54a8, 0x5321 => 0x54ab, + 0x5322 => 0x54c2, 0x5323 => 0x54a4, 0x5324 => 0x54be, 0x5325 => 0x54bc, + 0x5326 => 0x54d8, 0x5327 => 0x54e5, 0x5328 => 0x54e6, 0x5329 => 0x550f, + 0x532a => 0x5514, 0x532b => 0x54fd, 0x532c => 0x54ee, 0x532d => 0x54ed, + 0x532e => 0x54fa, 0x532f => 0x54e2, 0x5330 => 0x5539, 0x5331 => 0x5540, + 0x5332 => 0x5563, 0x5333 => 0x554c, 0x5334 => 0x552e, 0x5335 => 0x555c, + 0x5336 => 0x5545, 0x5337 => 0x5556, 0x5338 => 0x5557, 0x5339 => 0x5538, + 0x533a => 0x5533, 0x533b => 0x555d, 0x533c => 0x5599, 0x533d => 0x5580, + 0x533e => 0x54af, 0x533f => 0x558a, 0x5340 => 0x559f, 0x5341 => 0x557b, + 0x5342 => 0x557e, 0x5343 => 0x5598, 0x5344 => 0x559e, 0x5345 => 0x55ae, + 0x5346 => 0x557c, 0x5347 => 0x5583, 0x5348 => 0x55a9, 0x5349 => 0x5587, + 0x534a => 0x55a8, 0x534b => 0x55da, 0x534c => 0x55c5, 0x534d => 0x55df, + 0x534e => 0x55c4, 0x534f => 0x55dc, 0x5350 => 0x55e4, 0x5351 => 0x55d4, + 0x5352 => 0x5614, 0x5353 => 0x55f7, 0x5354 => 0x5616, 0x5355 => 0x55fe, + 0x5356 => 0x55fd, 0x5357 => 0x561b, 0x5358 => 0x55f9, 0x5359 => 0x564e, + 0x535a => 0x5650, 0x535b => 0x71df, 0x535c => 0x5634, 0x535d => 0x5636, + 0x535e => 0x5632, 0x535f => 0x5638, 0x5360 => 0x566b, 0x5361 => 0x5664, + 0x5362 => 0x562f, 0x5363 => 0x566c, 0x5364 => 0x566a, 0x5365 => 0x5686, + 0x5366 => 0x5680, 0x5367 => 0x568a, 0x5368 => 0x56a0, 0x5369 => 0x5694, + 0x536a => 0x568f, 0x536b => 0x56a5, 0x536c => 0x56ae, 0x536d => 0x56b6, + 0x536e => 0x56b4, 0x536f => 0x56c2, 0x5370 => 0x56bc, 0x5371 => 0x56c1, + 0x5372 => 0x56c3, 0x5373 => 0x56c0, 0x5374 => 0x56c8, 0x5375 => 0x56ce, + 0x5376 => 0x56d1, 0x5377 => 0x56d3, 0x5378 => 0x56d7, 0x5379 => 0x56ee, + 0x537a => 0x56f9, 0x537b => 0x5700, 0x537c => 0x56ff, 0x537d => 0x5704, + 0x537e => 0x5709, 0x5421 => 0x5708, 0x5422 => 0x570b, 0x5423 => 0x570d, + 0x5424 => 0x5713, 0x5425 => 0x5718, 0x5426 => 0x5716, 0x5427 => 0x55c7, + 0x5428 => 0x571c, 0x5429 => 0x5726, 0x542a => 0x5737, 0x542b => 0x5738, + 0x542c => 0x574e, 0x542d => 0x573b, 0x542e => 0x5740, 0x542f => 0x574f, + 0x5430 => 0x5769, 0x5431 => 0x57c0, 0x5432 => 0x5788, 0x5433 => 0x5761, + 0x5434 => 0x577f, 0x5435 => 0x5789, 0x5436 => 0x5793, 0x5437 => 0x57a0, + 0x5438 => 0x57b3, 0x5439 => 0x57a4, 0x543a => 0x57aa, 0x543b => 0x57b0, + 0x543c => 0x57c3, 0x543d => 0x57c6, 0x543e => 0x57d4, 0x543f => 0x57d2, + 0x5440 => 0x57d3, 0x5441 => 0x580a, 0x5442 => 0x57d6, 0x5443 => 0x57e3, + 0x5444 => 0x580b, 0x5445 => 0x5819, 0x5446 => 0x581d, 0x5447 => 0x5872, + 0x5448 => 0x5821, 0x5449 => 0x5862, 0x544a => 0x584b, 0x544b => 0x5870, + 0x544c => 0x6bc0, 0x544d => 0x5852, 0x544e => 0x583d, 0x544f => 0x5879, + 0x5450 => 0x5885, 0x5451 => 0x58b9, 0x5452 => 0x589f, 0x5453 => 0x58ab, + 0x5454 => 0x58ba, 0x5455 => 0x58de, 0x5456 => 0x58bb, 0x5457 => 0x58b8, + 0x5458 => 0x58ae, 0x5459 => 0x58c5, 0x545a => 0x58d3, 0x545b => 0x58d1, + 0x545c => 0x58d7, 0x545d => 0x58d9, 0x545e => 0x58d8, 0x545f => 0x58e5, + 0x5460 => 0x58dc, 0x5461 => 0x58e4, 0x5462 => 0x58df, 0x5463 => 0x58ef, + 0x5464 => 0x58fa, 0x5465 => 0x58f9, 0x5466 => 0x58fb, 0x5467 => 0x58fc, + 0x5468 => 0x58fd, 0x5469 => 0x5902, 0x546a => 0x590a, 0x546b => 0x5910, + 0x546c => 0x591b, 0x546d => 0x68a6, 0x546e => 0x5925, 0x546f => 0x592c, + 0x5470 => 0x592d, 0x5471 => 0x5932, 0x5472 => 0x5938, 0x5473 => 0x593e, + 0x5474 => 0x7ad2, 0x5475 => 0x5955, 0x5476 => 0x5950, 0x5477 => 0x594e, + 0x5478 => 0x595a, 0x5479 => 0x5958, 0x547a => 0x5962, 0x547b => 0x5960, + 0x547c => 0x5967, 0x547d => 0x596c, 0x547e => 0x5969, 0x5521 => 0x5978, + 0x5522 => 0x5981, 0x5523 => 0x599d, 0x5524 => 0x4f5e, 0x5525 => 0x4fab, + 0x5526 => 0x59a3, 0x5527 => 0x59b2, 0x5528 => 0x59c6, 0x5529 => 0x59e8, + 0x552a => 0x59dc, 0x552b => 0x598d, 0x552c => 0x59d9, 0x552d => 0x59da, + 0x552e => 0x5a25, 0x552f => 0x5a1f, 0x5530 => 0x5a11, 0x5531 => 0x5a1c, + 0x5532 => 0x5a09, 0x5533 => 0x5a1a, 0x5534 => 0x5a40, 0x5535 => 0x5a6c, + 0x5536 => 0x5a49, 0x5537 => 0x5a35, 0x5538 => 0x5a36, 0x5539 => 0x5a62, + 0x553a => 0x5a6a, 0x553b => 0x5a9a, 0x553c => 0x5abc, 0x553d => 0x5abe, + 0x553e => 0x5acb, 0x553f => 0x5ac2, 0x5540 => 0x5abd, 0x5541 => 0x5ae3, + 0x5542 => 0x5ad7, 0x5543 => 0x5ae6, 0x5544 => 0x5ae9, 0x5545 => 0x5ad6, + 0x5546 => 0x5afa, 0x5547 => 0x5afb, 0x5548 => 0x5b0c, 0x5549 => 0x5b0b, + 0x554a => 0x5b16, 0x554b => 0x5b32, 0x554c => 0x5ad0, 0x554d => 0x5b2a, + 0x554e => 0x5b36, 0x554f => 0x5b3e, 0x5550 => 0x5b43, 0x5551 => 0x5b45, + 0x5552 => 0x5b40, 0x5553 => 0x5b51, 0x5554 => 0x5b55, 0x5555 => 0x5b5a, + 0x5556 => 0x5b5b, 0x5557 => 0x5b65, 0x5558 => 0x5b69, 0x5559 => 0x5b70, + 0x555a => 0x5b73, 0x555b => 0x5b75, 0x555c => 0x5b78, 0x555d => 0x6588, + 0x555e => 0x5b7a, 0x555f => 0x5b80, 0x5560 => 0x5b83, 0x5561 => 0x5ba6, + 0x5562 => 0x5bb8, 0x5563 => 0x5bc3, 0x5564 => 0x5bc7, 0x5565 => 0x5bc9, + 0x5566 => 0x5bd4, 0x5567 => 0x5bd0, 0x5568 => 0x5be4, 0x5569 => 0x5be6, + 0x556a => 0x5be2, 0x556b => 0x5bde, 0x556c => 0x5be5, 0x556d => 0x5beb, + 0x556e => 0x5bf0, 0x556f => 0x5bf6, 0x5570 => 0x5bf3, 0x5571 => 0x5c05, + 0x5572 => 0x5c07, 0x5573 => 0x5c08, 0x5574 => 0x5c0d, 0x5575 => 0x5c13, + 0x5576 => 0x5c20, 0x5577 => 0x5c22, 0x5578 => 0x5c28, 0x5579 => 0x5c38, + 0x557a => 0x5c39, 0x557b => 0x5c41, 0x557c => 0x5c46, 0x557d => 0x5c4e, + 0x557e => 0x5c53, 0x5621 => 0x5c50, 0x5622 => 0x5c4f, 0x5623 => 0x5b71, + 0x5624 => 0x5c6c, 0x5625 => 0x5c6e, 0x5626 => 0x4e62, 0x5627 => 0x5c76, + 0x5628 => 0x5c79, 0x5629 => 0x5c8c, 0x562a => 0x5c91, 0x562b => 0x5c94, + 0x562c => 0x599b, 0x562d => 0x5cab, 0x562e => 0x5cbb, 0x562f => 0x5cb6, + 0x5630 => 0x5cbc, 0x5631 => 0x5cb7, 0x5632 => 0x5cc5, 0x5633 => 0x5cbe, + 0x5634 => 0x5cc7, 0x5635 => 0x5cd9, 0x5636 => 0x5ce9, 0x5637 => 0x5cfd, + 0x5638 => 0x5cfa, 0x5639 => 0x5ced, 0x563a => 0x5d8c, 0x563b => 0x5cea, + 0x563c => 0x5d0b, 0x563d => 0x5d15, 0x563e => 0x5d17, 0x563f => 0x5d5c, + 0x5640 => 0x5d1f, 0x5641 => 0x5d1b, 0x5642 => 0x5d11, 0x5643 => 0x5d14, + 0x5644 => 0x5d22, 0x5645 => 0x5d1a, 0x5646 => 0x5d19, 0x5647 => 0x5d18, + 0x5648 => 0x5d4c, 0x5649 => 0x5d52, 0x564a => 0x5d4e, 0x564b => 0x5d4b, + 0x564c => 0x5d6c, 0x564d => 0x5d73, 0x564e => 0x5d76, 0x564f => 0x5d87, + 0x5650 => 0x5d84, 0x5651 => 0x5d82, 0x5652 => 0x5da2, 0x5653 => 0x5d9d, + 0x5654 => 0x5dac, 0x5655 => 0x5dae, 0x5656 => 0x5dbd, 0x5657 => 0x5d90, + 0x5658 => 0x5db7, 0x5659 => 0x5dbc, 0x565a => 0x5dc9, 0x565b => 0x5dcd, + 0x565c => 0x5dd3, 0x565d => 0x5dd2, 0x565e => 0x5dd6, 0x565f => 0x5ddb, + 0x5660 => 0x5deb, 0x5661 => 0x5df2, 0x5662 => 0x5df5, 0x5663 => 0x5e0b, + 0x5664 => 0x5e1a, 0x5665 => 0x5e19, 0x5666 => 0x5e11, 0x5667 => 0x5e1b, + 0x5668 => 0x5e36, 0x5669 => 0x5e37, 0x566a => 0x5e44, 0x566b => 0x5e43, + 0x566c => 0x5e40, 0x566d => 0x5e4e, 0x566e => 0x5e57, 0x566f => 0x5e54, + 0x5670 => 0x5e5f, 0x5671 => 0x5e62, 0x5672 => 0x5e64, 0x5673 => 0x5e47, + 0x5674 => 0x5e75, 0x5675 => 0x5e76, 0x5676 => 0x5e7a, 0x5677 => 0x9ebc, + 0x5678 => 0x5e7f, 0x5679 => 0x5ea0, 0x567a => 0x5ec1, 0x567b => 0x5ec2, + 0x567c => 0x5ec8, 0x567d => 0x5ed0, 0x567e => 0x5ecf, 0x5721 => 0x5ed6, + 0x5722 => 0x5ee3, 0x5723 => 0x5edd, 0x5724 => 0x5eda, 0x5725 => 0x5edb, + 0x5726 => 0x5ee2, 0x5727 => 0x5ee1, 0x5728 => 0x5ee8, 0x5729 => 0x5ee9, + 0x572a => 0x5eec, 0x572b => 0x5ef1, 0x572c => 0x5ef3, 0x572d => 0x5ef0, + 0x572e => 0x5ef4, 0x572f => 0x5ef8, 0x5730 => 0x5efe, 0x5731 => 0x5f03, + 0x5732 => 0x5f09, 0x5733 => 0x5f5d, 0x5734 => 0x5f5c, 0x5735 => 0x5f0b, + 0x5736 => 0x5f11, 0x5737 => 0x5f16, 0x5738 => 0x5f29, 0x5739 => 0x5f2d, + 0x573a => 0x5f38, 0x573b => 0x5f41, 0x573c => 0x5f48, 0x573d => 0x5f4c, + 0x573e => 0x5f4e, 0x573f => 0x5f2f, 0x5740 => 0x5f51, 0x5741 => 0x5f56, + 0x5742 => 0x5f57, 0x5743 => 0x5f59, 0x5744 => 0x5f61, 0x5745 => 0x5f6d, + 0x5746 => 0x5f73, 0x5747 => 0x5f77, 0x5748 => 0x5f83, 0x5749 => 0x5f82, + 0x574a => 0x5f7f, 0x574b => 0x5f8a, 0x574c => 0x5f88, 0x574d => 0x5f91, + 0x574e => 0x5f87, 0x574f => 0x5f9e, 0x5750 => 0x5f99, 0x5751 => 0x5f98, + 0x5752 => 0x5fa0, 0x5753 => 0x5fa8, 0x5754 => 0x5fad, 0x5755 => 0x5fbc, + 0x5756 => 0x5fd6, 0x5757 => 0x5ffb, 0x5758 => 0x5fe4, 0x5759 => 0x5ff8, + 0x575a => 0x5ff1, 0x575b => 0x5fdd, 0x575c => 0x60b3, 0x575d => 0x5fff, + 0x575e => 0x6021, 0x575f => 0x6060, 0x5760 => 0x6019, 0x5761 => 0x6010, + 0x5762 => 0x6029, 0x5763 => 0x600e, 0x5764 => 0x6031, 0x5765 => 0x601b, + 0x5766 => 0x6015, 0x5767 => 0x602b, 0x5768 => 0x6026, 0x5769 => 0x600f, + 0x576a => 0x603a, 0x576b => 0x605a, 0x576c => 0x6041, 0x576d => 0x606a, + 0x576e => 0x6077, 0x576f => 0x605f, 0x5770 => 0x604a, 0x5771 => 0x6046, + 0x5772 => 0x604d, 0x5773 => 0x6063, 0x5774 => 0x6043, 0x5775 => 0x6064, + 0x5776 => 0x6042, 0x5777 => 0x606c, 0x5778 => 0x606b, 0x5779 => 0x6059, + 0x577a => 0x6081, 0x577b => 0x608d, 0x577c => 0x60e7, 0x577d => 0x6083, + 0x577e => 0x609a, 0x5821 => 0x6084, 0x5822 => 0x609b, 0x5823 => 0x6096, + 0x5824 => 0x6097, 0x5825 => 0x6092, 0x5826 => 0x60a7, 0x5827 => 0x608b, + 0x5828 => 0x60e1, 0x5829 => 0x60b8, 0x582a => 0x60e0, 0x582b => 0x60d3, + 0x582c => 0x60b4, 0x582d => 0x5ff0, 0x582e => 0x60bd, 0x582f => 0x60c6, + 0x5830 => 0x60b5, 0x5831 => 0x60d8, 0x5832 => 0x614d, 0x5833 => 0x6115, + 0x5834 => 0x6106, 0x5835 => 0x60f6, 0x5836 => 0x60f7, 0x5837 => 0x6100, + 0x5838 => 0x60f4, 0x5839 => 0x60fa, 0x583a => 0x6103, 0x583b => 0x6121, + 0x583c => 0x60fb, 0x583d => 0x60f1, 0x583e => 0x610d, 0x583f => 0x610e, + 0x5840 => 0x6147, 0x5841 => 0x613e, 0x5842 => 0x6128, 0x5843 => 0x6127, + 0x5844 => 0x614a, 0x5845 => 0x613f, 0x5846 => 0x613c, 0x5847 => 0x612c, + 0x5848 => 0x6134, 0x5849 => 0x613d, 0x584a => 0x6142, 0x584b => 0x6144, + 0x584c => 0x6173, 0x584d => 0x6177, 0x584e => 0x6158, 0x584f => 0x6159, + 0x5850 => 0x615a, 0x5851 => 0x616b, 0x5852 => 0x6174, 0x5853 => 0x616f, + 0x5854 => 0x6165, 0x5855 => 0x6171, 0x5856 => 0x615f, 0x5857 => 0x615d, + 0x5858 => 0x6153, 0x5859 => 0x6175, 0x585a => 0x6199, 0x585b => 0x6196, + 0x585c => 0x6187, 0x585d => 0x61ac, 0x585e => 0x6194, 0x585f => 0x619a, + 0x5860 => 0x618a, 0x5861 => 0x6191, 0x5862 => 0x61ab, 0x5863 => 0x61ae, + 0x5864 => 0x61cc, 0x5865 => 0x61ca, 0x5866 => 0x61c9, 0x5867 => 0x61f7, + 0x5868 => 0x61c8, 0x5869 => 0x61c3, 0x586a => 0x61c6, 0x586b => 0x61ba, + 0x586c => 0x61cb, 0x586d => 0x7f79, 0x586e => 0x61cd, 0x586f => 0x61e6, + 0x5870 => 0x61e3, 0x5871 => 0x61f6, 0x5872 => 0x61fa, 0x5873 => 0x61f4, + 0x5874 => 0x61ff, 0x5875 => 0x61fd, 0x5876 => 0x61fc, 0x5877 => 0x61fe, + 0x5878 => 0x6200, 0x5879 => 0x6208, 0x587a => 0x6209, 0x587b => 0x620d, + 0x587c => 0x620c, 0x587d => 0x6214, 0x587e => 0x621b, 0x5921 => 0x621e, + 0x5922 => 0x6221, 0x5923 => 0x622a, 0x5924 => 0x622e, 0x5925 => 0x6230, + 0x5926 => 0x6232, 0x5927 => 0x6233, 0x5928 => 0x6241, 0x5929 => 0x624e, + 0x592a => 0x625e, 0x592b => 0x6263, 0x592c => 0x625b, 0x592d => 0x6260, + 0x592e => 0x6268, 0x592f => 0x627c, 0x5930 => 0x6282, 0x5931 => 0x6289, + 0x5932 => 0x627e, 0x5933 => 0x6292, 0x5934 => 0x6293, 0x5935 => 0x6296, + 0x5936 => 0x62d4, 0x5937 => 0x6283, 0x5938 => 0x6294, 0x5939 => 0x62d7, + 0x593a => 0x62d1, 0x593b => 0x62bb, 0x593c => 0x62cf, 0x593d => 0x62ff, + 0x593e => 0x62c6, 0x593f => 0x64d4, 0x5940 => 0x62c8, 0x5941 => 0x62dc, + 0x5942 => 0x62cc, 0x5943 => 0x62ca, 0x5944 => 0x62c2, 0x5945 => 0x62c7, + 0x5946 => 0x629b, 0x5947 => 0x62c9, 0x5948 => 0x630c, 0x5949 => 0x62ee, + 0x594a => 0x62f1, 0x594b => 0x6327, 0x594c => 0x6302, 0x594d => 0x6308, + 0x594e => 0x62ef, 0x594f => 0x62f5, 0x5950 => 0x6350, 0x5951 => 0x633e, + 0x5952 => 0x634d, 0x5953 => 0x641c, 0x5954 => 0x634f, 0x5955 => 0x6396, + 0x5956 => 0x638e, 0x5957 => 0x6380, 0x5958 => 0x63ab, 0x5959 => 0x6376, + 0x595a => 0x63a3, 0x595b => 0x638f, 0x595c => 0x6389, 0x595d => 0x639f, + 0x595e => 0x63b5, 0x595f => 0x636b, 0x5960 => 0x6369, 0x5961 => 0x63be, + 0x5962 => 0x63e9, 0x5963 => 0x63c0, 0x5964 => 0x63c6, 0x5965 => 0x63e3, + 0x5966 => 0x63c9, 0x5967 => 0x63d2, 0x5968 => 0x63f6, 0x5969 => 0x63c4, + 0x596a => 0x6416, 0x596b => 0x6434, 0x596c => 0x6406, 0x596d => 0x6413, + 0x596e => 0x6426, 0x596f => 0x6436, 0x5970 => 0x651d, 0x5971 => 0x6417, + 0x5972 => 0x6428, 0x5973 => 0x640f, 0x5974 => 0x6467, 0x5975 => 0x646f, + 0x5976 => 0x6476, 0x5977 => 0x644e, 0x5978 => 0x652a, 0x5979 => 0x6495, + 0x597a => 0x6493, 0x597b => 0x64a5, 0x597c => 0x64a9, 0x597d => 0x6488, + 0x597e => 0x64bc, 0x5a21 => 0x64da, 0x5a22 => 0x64d2, 0x5a23 => 0x64c5, + 0x5a24 => 0x64c7, 0x5a25 => 0x64bb, 0x5a26 => 0x64d8, 0x5a27 => 0x64c2, + 0x5a28 => 0x64f1, 0x5a29 => 0x64e7, 0x5a2a => 0x8209, 0x5a2b => 0x64e0, + 0x5a2c => 0x64e1, 0x5a2d => 0x62ac, 0x5a2e => 0x64e3, 0x5a2f => 0x64ef, + 0x5a30 => 0x652c, 0x5a31 => 0x64f6, 0x5a32 => 0x64f4, 0x5a33 => 0x64f2, + 0x5a34 => 0x64fa, 0x5a35 => 0x6500, 0x5a36 => 0x64fd, 0x5a37 => 0x6518, + 0x5a38 => 0x651c, 0x5a39 => 0x6505, 0x5a3a => 0x6524, 0x5a3b => 0x6523, + 0x5a3c => 0x652b, 0x5a3d => 0x6534, 0x5a3e => 0x6535, 0x5a3f => 0x6537, + 0x5a40 => 0x6536, 0x5a41 => 0x6538, 0x5a42 => 0x754b, 0x5a43 => 0x6548, + 0x5a44 => 0x6556, 0x5a45 => 0x6555, 0x5a46 => 0x654d, 0x5a47 => 0x6558, + 0x5a48 => 0x655e, 0x5a49 => 0x655d, 0x5a4a => 0x6572, 0x5a4b => 0x6578, + 0x5a4c => 0x6582, 0x5a4d => 0x6583, 0x5a4e => 0x8b8a, 0x5a4f => 0x659b, + 0x5a50 => 0x659f, 0x5a51 => 0x65ab, 0x5a52 => 0x65b7, 0x5a53 => 0x65c3, + 0x5a54 => 0x65c6, 0x5a55 => 0x65c1, 0x5a56 => 0x65c4, 0x5a57 => 0x65cc, + 0x5a58 => 0x65d2, 0x5a59 => 0x65db, 0x5a5a => 0x65d9, 0x5a5b => 0x65e0, + 0x5a5c => 0x65e1, 0x5a5d => 0x65f1, 0x5a5e => 0x6772, 0x5a5f => 0x660a, + 0x5a60 => 0x6603, 0x5a61 => 0x65fb, 0x5a62 => 0x6773, 0x5a63 => 0x6635, + 0x5a64 => 0x6636, 0x5a65 => 0x6634, 0x5a66 => 0x661c, 0x5a67 => 0x664f, + 0x5a68 => 0x6644, 0x5a69 => 0x6649, 0x5a6a => 0x6641, 0x5a6b => 0x665e, + 0x5a6c => 0x665d, 0x5a6d => 0x6664, 0x5a6e => 0x6667, 0x5a6f => 0x6668, + 0x5a70 => 0x665f, 0x5a71 => 0x6662, 0x5a72 => 0x6670, 0x5a73 => 0x6683, + 0x5a74 => 0x6688, 0x5a75 => 0x668e, 0x5a76 => 0x6689, 0x5a77 => 0x6684, + 0x5a78 => 0x6698, 0x5a79 => 0x669d, 0x5a7a => 0x66c1, 0x5a7b => 0x66b9, + 0x5a7c => 0x66c9, 0x5a7d => 0x66be, 0x5a7e => 0x66bc, 0x5b21 => 0x66c4, + 0x5b22 => 0x66b8, 0x5b23 => 0x66d6, 0x5b24 => 0x66da, 0x5b25 => 0x66e0, + 0x5b26 => 0x663f, 0x5b27 => 0x66e6, 0x5b28 => 0x66e9, 0x5b29 => 0x66f0, + 0x5b2a => 0x66f5, 0x5b2b => 0x66f7, 0x5b2c => 0x670f, 0x5b2d => 0x6716, + 0x5b2e => 0x671e, 0x5b2f => 0x6726, 0x5b30 => 0x6727, 0x5b31 => 0x9738, + 0x5b32 => 0x672e, 0x5b33 => 0x673f, 0x5b34 => 0x6736, 0x5b35 => 0x6741, + 0x5b36 => 0x6738, 0x5b37 => 0x6737, 0x5b38 => 0x6746, 0x5b39 => 0x675e, + 0x5b3a => 0x6760, 0x5b3b => 0x6759, 0x5b3c => 0x6763, 0x5b3d => 0x6764, + 0x5b3e => 0x6789, 0x5b3f => 0x6770, 0x5b40 => 0x67a9, 0x5b41 => 0x677c, + 0x5b42 => 0x676a, 0x5b43 => 0x678c, 0x5b44 => 0x678b, 0x5b45 => 0x67a6, + 0x5b46 => 0x67a1, 0x5b47 => 0x6785, 0x5b48 => 0x67b7, 0x5b49 => 0x67ef, + 0x5b4a => 0x67b4, 0x5b4b => 0x67ec, 0x5b4c => 0x67b3, 0x5b4d => 0x67e9, + 0x5b4e => 0x67b8, 0x5b4f => 0x67e4, 0x5b50 => 0x67de, 0x5b51 => 0x67dd, + 0x5b52 => 0x67e2, 0x5b53 => 0x67ee, 0x5b54 => 0x67b9, 0x5b55 => 0x67ce, + 0x5b56 => 0x67c6, 0x5b57 => 0x67e7, 0x5b58 => 0x6a9c, 0x5b59 => 0x681e, + 0x5b5a => 0x6846, 0x5b5b => 0x6829, 0x5b5c => 0x6840, 0x5b5d => 0x684d, + 0x5b5e => 0x6832, 0x5b5f => 0x684e, 0x5b60 => 0x68b3, 0x5b61 => 0x682b, + 0x5b62 => 0x6859, 0x5b63 => 0x6863, 0x5b64 => 0x6877, 0x5b65 => 0x687f, + 0x5b66 => 0x689f, 0x5b67 => 0x688f, 0x5b68 => 0x68ad, 0x5b69 => 0x6894, + 0x5b6a => 0x689d, 0x5b6b => 0x689b, 0x5b6c => 0x6883, 0x5b6d => 0x6aae, + 0x5b6e => 0x68b9, 0x5b6f => 0x6874, 0x5b70 => 0x68b5, 0x5b71 => 0x68a0, + 0x5b72 => 0x68ba, 0x5b73 => 0x690f, 0x5b74 => 0x688d, 0x5b75 => 0x687e, + 0x5b76 => 0x6901, 0x5b77 => 0x68ca, 0x5b78 => 0x6908, 0x5b79 => 0x68d8, + 0x5b7a => 0x6922, 0x5b7b => 0x6926, 0x5b7c => 0x68e1, 0x5b7d => 0x690c, + 0x5b7e => 0x68cd, 0x5c21 => 0x68d4, 0x5c22 => 0x68e7, 0x5c23 => 0x68d5, + 0x5c24 => 0x6936, 0x5c25 => 0x6912, 0x5c26 => 0x6904, 0x5c27 => 0x68d7, + 0x5c28 => 0x68e3, 0x5c29 => 0x6925, 0x5c2a => 0x68f9, 0x5c2b => 0x68e0, + 0x5c2c => 0x68ef, 0x5c2d => 0x6928, 0x5c2e => 0x692a, 0x5c2f => 0x691a, + 0x5c30 => 0x6923, 0x5c31 => 0x6921, 0x5c32 => 0x68c6, 0x5c33 => 0x6979, + 0x5c34 => 0x6977, 0x5c35 => 0x695c, 0x5c36 => 0x6978, 0x5c37 => 0x696b, + 0x5c38 => 0x6954, 0x5c39 => 0x697e, 0x5c3a => 0x696e, 0x5c3b => 0x6939, + 0x5c3c => 0x6974, 0x5c3d => 0x693d, 0x5c3e => 0x6959, 0x5c3f => 0x6930, + 0x5c40 => 0x6961, 0x5c41 => 0x695e, 0x5c42 => 0x695d, 0x5c43 => 0x6981, + 0x5c44 => 0x696a, 0x5c45 => 0x69b2, 0x5c46 => 0x69ae, 0x5c47 => 0x69d0, + 0x5c48 => 0x69bf, 0x5c49 => 0x69c1, 0x5c4a => 0x69d3, 0x5c4b => 0x69be, + 0x5c4c => 0x69ce, 0x5c4d => 0x5be8, 0x5c4e => 0x69ca, 0x5c4f => 0x69dd, + 0x5c50 => 0x69bb, 0x5c51 => 0x69c3, 0x5c52 => 0x69a7, 0x5c53 => 0x6a2e, + 0x5c54 => 0x6991, 0x5c55 => 0x69a0, 0x5c56 => 0x699c, 0x5c57 => 0x6995, + 0x5c58 => 0x69b4, 0x5c59 => 0x69de, 0x5c5a => 0x69e8, 0x5c5b => 0x6a02, + 0x5c5c => 0x6a1b, 0x5c5d => 0x69ff, 0x5c5e => 0x6b0a, 0x5c5f => 0x69f9, + 0x5c60 => 0x69f2, 0x5c61 => 0x69e7, 0x5c62 => 0x6a05, 0x5c63 => 0x69b1, + 0x5c64 => 0x6a1e, 0x5c65 => 0x69ed, 0x5c66 => 0x6a14, 0x5c67 => 0x69eb, + 0x5c68 => 0x6a0a, 0x5c69 => 0x6a12, 0x5c6a => 0x6ac1, 0x5c6b => 0x6a23, + 0x5c6c => 0x6a13, 0x5c6d => 0x6a44, 0x5c6e => 0x6a0c, 0x5c6f => 0x6a72, + 0x5c70 => 0x6a36, 0x5c71 => 0x6a78, 0x5c72 => 0x6a47, 0x5c73 => 0x6a62, + 0x5c74 => 0x6a59, 0x5c75 => 0x6a66, 0x5c76 => 0x6a48, 0x5c77 => 0x6a38, + 0x5c78 => 0x6a22, 0x5c79 => 0x6a90, 0x5c7a => 0x6a8d, 0x5c7b => 0x6aa0, + 0x5c7c => 0x6a84, 0x5c7d => 0x6aa2, 0x5c7e => 0x6aa3, 0x5d21 => 0x6a97, + 0x5d22 => 0x8617, 0x5d23 => 0x6abb, 0x5d24 => 0x6ac3, 0x5d25 => 0x6ac2, + 0x5d26 => 0x6ab8, 0x5d27 => 0x6ab3, 0x5d28 => 0x6aac, 0x5d29 => 0x6ade, + 0x5d2a => 0x6ad1, 0x5d2b => 0x6adf, 0x5d2c => 0x6aaa, 0x5d2d => 0x6ada, + 0x5d2e => 0x6aea, 0x5d2f => 0x6afb, 0x5d30 => 0x6b05, 0x5d31 => 0x8616, + 0x5d32 => 0x6afa, 0x5d33 => 0x6b12, 0x5d34 => 0x6b16, 0x5d35 => 0x9b31, + 0x5d36 => 0x6b1f, 0x5d37 => 0x6b38, 0x5d38 => 0x6b37, 0x5d39 => 0x76dc, + 0x5d3a => 0x6b39, 0x5d3b => 0x98ee, 0x5d3c => 0x6b47, 0x5d3d => 0x6b43, + 0x5d3e => 0x6b49, 0x5d3f => 0x6b50, 0x5d40 => 0x6b59, 0x5d41 => 0x6b54, + 0x5d42 => 0x6b5b, 0x5d43 => 0x6b5f, 0x5d44 => 0x6b61, 0x5d45 => 0x6b78, + 0x5d46 => 0x6b79, 0x5d47 => 0x6b7f, 0x5d48 => 0x6b80, 0x5d49 => 0x6b84, + 0x5d4a => 0x6b83, 0x5d4b => 0x6b8d, 0x5d4c => 0x6b98, 0x5d4d => 0x6b95, + 0x5d4e => 0x6b9e, 0x5d4f => 0x6ba4, 0x5d50 => 0x6baa, 0x5d51 => 0x6bab, + 0x5d52 => 0x6baf, 0x5d53 => 0x6bb2, 0x5d54 => 0x6bb1, 0x5d55 => 0x6bb3, + 0x5d56 => 0x6bb7, 0x5d57 => 0x6bbc, 0x5d58 => 0x6bc6, 0x5d59 => 0x6bcb, + 0x5d5a => 0x6bd3, 0x5d5b => 0x6bdf, 0x5d5c => 0x6bec, 0x5d5d => 0x6beb, + 0x5d5e => 0x6bf3, 0x5d5f => 0x6bef, 0x5d60 => 0x9ebe, 0x5d61 => 0x6c08, + 0x5d62 => 0x6c13, 0x5d63 => 0x6c14, 0x5d64 => 0x6c1b, 0x5d65 => 0x6c24, + 0x5d66 => 0x6c23, 0x5d67 => 0x6c5e, 0x5d68 => 0x6c55, 0x5d69 => 0x6c62, + 0x5d6a => 0x6c6a, 0x5d6b => 0x6c82, 0x5d6c => 0x6c8d, 0x5d6d => 0x6c9a, + 0x5d6e => 0x6c81, 0x5d6f => 0x6c9b, 0x5d70 => 0x6c7e, 0x5d71 => 0x6c68, + 0x5d72 => 0x6c73, 0x5d73 => 0x6c92, 0x5d74 => 0x6c90, 0x5d75 => 0x6cc4, + 0x5d76 => 0x6cf1, 0x5d77 => 0x6cd3, 0x5d78 => 0x6cbd, 0x5d79 => 0x6cd7, + 0x5d7a => 0x6cc5, 0x5d7b => 0x6cdd, 0x5d7c => 0x6cae, 0x5d7d => 0x6cb1, + 0x5d7e => 0x6cbe, 0x5e21 => 0x6cba, 0x5e22 => 0x6cdb, 0x5e23 => 0x6cef, + 0x5e24 => 0x6cd9, 0x5e25 => 0x6cea, 0x5e26 => 0x6d1f, 0x5e27 => 0x884d, + 0x5e28 => 0x6d36, 0x5e29 => 0x6d2b, 0x5e2a => 0x6d3d, 0x5e2b => 0x6d38, + 0x5e2c => 0x6d19, 0x5e2d => 0x6d35, 0x5e2e => 0x6d33, 0x5e2f => 0x6d12, + 0x5e30 => 0x6d0c, 0x5e31 => 0x6d63, 0x5e32 => 0x6d93, 0x5e33 => 0x6d64, + 0x5e34 => 0x6d5a, 0x5e35 => 0x6d79, 0x5e36 => 0x6d59, 0x5e37 => 0x6d8e, + 0x5e38 => 0x6d95, 0x5e39 => 0x6fe4, 0x5e3a => 0x6d85, 0x5e3b => 0x6df9, + 0x5e3c => 0x6e15, 0x5e3d => 0x6e0a, 0x5e3e => 0x6db5, 0x5e3f => 0x6dc7, + 0x5e40 => 0x6de6, 0x5e41 => 0x6db8, 0x5e42 => 0x6dc6, 0x5e43 => 0x6dec, + 0x5e44 => 0x6dde, 0x5e45 => 0x6dcc, 0x5e46 => 0x6de8, 0x5e47 => 0x6dd2, + 0x5e48 => 0x6dc5, 0x5e49 => 0x6dfa, 0x5e4a => 0x6dd9, 0x5e4b => 0x6de4, + 0x5e4c => 0x6dd5, 0x5e4d => 0x6dea, 0x5e4e => 0x6dee, 0x5e4f => 0x6e2d, + 0x5e50 => 0x6e6e, 0x5e51 => 0x6e2e, 0x5e52 => 0x6e19, 0x5e53 => 0x6e72, + 0x5e54 => 0x6e5f, 0x5e55 => 0x6e3e, 0x5e56 => 0x6e23, 0x5e57 => 0x6e6b, + 0x5e58 => 0x6e2b, 0x5e59 => 0x6e76, 0x5e5a => 0x6e4d, 0x5e5b => 0x6e1f, + 0x5e5c => 0x6e43, 0x5e5d => 0x6e3a, 0x5e5e => 0x6e4e, 0x5e5f => 0x6e24, + 0x5e60 => 0x6eff, 0x5e61 => 0x6e1d, 0x5e62 => 0x6e38, 0x5e63 => 0x6e82, + 0x5e64 => 0x6eaa, 0x5e65 => 0x6e98, 0x5e66 => 0x6ec9, 0x5e67 => 0x6eb7, + 0x5e68 => 0x6ed3, 0x5e69 => 0x6ebd, 0x5e6a => 0x6eaf, 0x5e6b => 0x6ec4, + 0x5e6c => 0x6eb2, 0x5e6d => 0x6ed4, 0x5e6e => 0x6ed5, 0x5e6f => 0x6e8f, + 0x5e70 => 0x6ea5, 0x5e71 => 0x6ec2, 0x5e72 => 0x6e9f, 0x5e73 => 0x6f41, + 0x5e74 => 0x6f11, 0x5e75 => 0x704c, 0x5e76 => 0x6eec, 0x5e77 => 0x6ef8, + 0x5e78 => 0x6efe, 0x5e79 => 0x6f3f, 0x5e7a => 0x6ef2, 0x5e7b => 0x6f31, + 0x5e7c => 0x6eef, 0x5e7d => 0x6f32, 0x5e7e => 0x6ecc, 0x5f21 => 0x6f3e, + 0x5f22 => 0x6f13, 0x5f23 => 0x6ef7, 0x5f24 => 0x6f86, 0x5f25 => 0x6f7a, + 0x5f26 => 0x6f78, 0x5f27 => 0x6f81, 0x5f28 => 0x6f80, 0x5f29 => 0x6f6f, + 0x5f2a => 0x6f5b, 0x5f2b => 0x6ff3, 0x5f2c => 0x6f6d, 0x5f2d => 0x6f82, + 0x5f2e => 0x6f7c, 0x5f2f => 0x6f58, 0x5f30 => 0x6f8e, 0x5f31 => 0x6f91, + 0x5f32 => 0x6fc2, 0x5f33 => 0x6f66, 0x5f34 => 0x6fb3, 0x5f35 => 0x6fa3, + 0x5f36 => 0x6fa1, 0x5f37 => 0x6fa4, 0x5f38 => 0x6fb9, 0x5f39 => 0x6fc6, + 0x5f3a => 0x6faa, 0x5f3b => 0x6fdf, 0x5f3c => 0x6fd5, 0x5f3d => 0x6fec, + 0x5f3e => 0x6fd4, 0x5f3f => 0x6fd8, 0x5f40 => 0x6ff1, 0x5f41 => 0x6fee, + 0x5f42 => 0x6fdb, 0x5f43 => 0x7009, 0x5f44 => 0x700b, 0x5f45 => 0x6ffa, + 0x5f46 => 0x7011, 0x5f47 => 0x7001, 0x5f48 => 0x700f, 0x5f49 => 0x6ffe, + 0x5f4a => 0x701b, 0x5f4b => 0x701a, 0x5f4c => 0x6f74, 0x5f4d => 0x701d, + 0x5f4e => 0x7018, 0x5f4f => 0x701f, 0x5f50 => 0x7030, 0x5f51 => 0x703e, + 0x5f52 => 0x7032, 0x5f53 => 0x7051, 0x5f54 => 0x7063, 0x5f55 => 0x7099, + 0x5f56 => 0x7092, 0x5f57 => 0x70af, 0x5f58 => 0x70f1, 0x5f59 => 0x70ac, + 0x5f5a => 0x70b8, 0x5f5b => 0x70b3, 0x5f5c => 0x70ae, 0x5f5d => 0x70df, + 0x5f5e => 0x70cb, 0x5f5f => 0x70dd, 0x5f60 => 0x70d9, 0x5f61 => 0x7109, + 0x5f62 => 0x70fd, 0x5f63 => 0x711c, 0x5f64 => 0x7119, 0x5f65 => 0x7165, + 0x5f66 => 0x7155, 0x5f67 => 0x7188, 0x5f68 => 0x7166, 0x5f69 => 0x7162, + 0x5f6a => 0x714c, 0x5f6b => 0x7156, 0x5f6c => 0x716c, 0x5f6d => 0x718f, + 0x5f6e => 0x71fb, 0x5f6f => 0x7184, 0x5f70 => 0x7195, 0x5f71 => 0x71a8, + 0x5f72 => 0x71ac, 0x5f73 => 0x71d7, 0x5f74 => 0x71b9, 0x5f75 => 0x71be, + 0x5f76 => 0x71d2, 0x5f77 => 0x71c9, 0x5f78 => 0x71d4, 0x5f79 => 0x71ce, + 0x5f7a => 0x71e0, 0x5f7b => 0x71ec, 0x5f7c => 0x71e7, 0x5f7d => 0x71f5, + 0x5f7e => 0x71fc, 0x6021 => 0x71f9, 0x6022 => 0x71ff, 0x6023 => 0x720d, + 0x6024 => 0x7210, 0x6025 => 0x721b, 0x6026 => 0x7228, 0x6027 => 0x722d, + 0x6028 => 0x722c, 0x6029 => 0x7230, 0x602a => 0x7232, 0x602b => 0x723b, + 0x602c => 0x723c, 0x602d => 0x723f, 0x602e => 0x7240, 0x602f => 0x7246, + 0x6030 => 0x724b, 0x6031 => 0x7258, 0x6032 => 0x7274, 0x6033 => 0x727e, + 0x6034 => 0x7282, 0x6035 => 0x7281, 0x6036 => 0x7287, 0x6037 => 0x7292, + 0x6038 => 0x7296, 0x6039 => 0x72a2, 0x603a => 0x72a7, 0x603b => 0x72b9, + 0x603c => 0x72b2, 0x603d => 0x72c3, 0x603e => 0x72c6, 0x603f => 0x72c4, + 0x6040 => 0x72ce, 0x6041 => 0x72d2, 0x6042 => 0x72e2, 0x6043 => 0x72e0, + 0x6044 => 0x72e1, 0x6045 => 0x72f9, 0x6046 => 0x72f7, 0x6047 => 0x500f, + 0x6048 => 0x7317, 0x6049 => 0x730a, 0x604a => 0x731c, 0x604b => 0x7316, + 0x604c => 0x731d, 0x604d => 0x7334, 0x604e => 0x732f, 0x604f => 0x7329, + 0x6050 => 0x7325, 0x6051 => 0x733e, 0x6052 => 0x734e, 0x6053 => 0x734f, + 0x6054 => 0x9ed8, 0x6055 => 0x7357, 0x6056 => 0x736a, 0x6057 => 0x7368, + 0x6058 => 0x7370, 0x6059 => 0x7378, 0x605a => 0x7375, 0x605b => 0x737b, + 0x605c => 0x737a, 0x605d => 0x73c8, 0x605e => 0x73b3, 0x605f => 0x73ce, + 0x6060 => 0x73bb, 0x6061 => 0x73c0, 0x6062 => 0x73e5, 0x6063 => 0x73ee, + 0x6064 => 0x73de, 0x6065 => 0x74a2, 0x6066 => 0x7405, 0x6067 => 0x746f, + 0x6068 => 0x7425, 0x6069 => 0x73f8, 0x606a => 0x7432, 0x606b => 0x743a, + 0x606c => 0x7455, 0x606d => 0x743f, 0x606e => 0x745f, 0x606f => 0x7459, + 0x6070 => 0x7441, 0x6071 => 0x745c, 0x6072 => 0x7469, 0x6073 => 0x7470, + 0x6074 => 0x7463, 0x6075 => 0x746a, 0x6076 => 0x7476, 0x6077 => 0x747e, + 0x6078 => 0x748b, 0x6079 => 0x749e, 0x607a => 0x74a7, 0x607b => 0x74ca, + 0x607c => 0x74cf, 0x607d => 0x74d4, 0x607e => 0x73f1, 0x6121 => 0x74e0, + 0x6122 => 0x74e3, 0x6123 => 0x74e7, 0x6124 => 0x74e9, 0x6125 => 0x74ee, + 0x6126 => 0x74f2, 0x6127 => 0x74f0, 0x6128 => 0x74f1, 0x6129 => 0x74f8, + 0x612a => 0x74f7, 0x612b => 0x7504, 0x612c => 0x7503, 0x612d => 0x7505, + 0x612e => 0x750c, 0x612f => 0x750e, 0x6130 => 0x750d, 0x6131 => 0x7515, + 0x6132 => 0x7513, 0x6133 => 0x751e, 0x6134 => 0x7526, 0x6135 => 0x752c, + 0x6136 => 0x753c, 0x6137 => 0x7544, 0x6138 => 0x754d, 0x6139 => 0x754a, + 0x613a => 0x7549, 0x613b => 0x755b, 0x613c => 0x7546, 0x613d => 0x755a, + 0x613e => 0x7569, 0x613f => 0x7564, 0x6140 => 0x7567, 0x6141 => 0x756b, + 0x6142 => 0x756d, 0x6143 => 0x7578, 0x6144 => 0x7576, 0x6145 => 0x7586, + 0x6146 => 0x7587, 0x6147 => 0x7574, 0x6148 => 0x758a, 0x6149 => 0x7589, + 0x614a => 0x7582, 0x614b => 0x7594, 0x614c => 0x759a, 0x614d => 0x759d, + 0x614e => 0x75a5, 0x614f => 0x75a3, 0x6150 => 0x75c2, 0x6151 => 0x75b3, + 0x6152 => 0x75c3, 0x6153 => 0x75b5, 0x6154 => 0x75bd, 0x6155 => 0x75b8, + 0x6156 => 0x75bc, 0x6157 => 0x75b1, 0x6158 => 0x75cd, 0x6159 => 0x75ca, + 0x615a => 0x75d2, 0x615b => 0x75d9, 0x615c => 0x75e3, 0x615d => 0x75de, + 0x615e => 0x75fe, 0x615f => 0x75ff, 0x6160 => 0x75fc, 0x6161 => 0x7601, + 0x6162 => 0x75f0, 0x6163 => 0x75fa, 0x6164 => 0x75f2, 0x6165 => 0x75f3, + 0x6166 => 0x760b, 0x6167 => 0x760d, 0x6168 => 0x7609, 0x6169 => 0x761f, + 0x616a => 0x7627, 0x616b => 0x7620, 0x616c => 0x7621, 0x616d => 0x7622, + 0x616e => 0x7624, 0x616f => 0x7634, 0x6170 => 0x7630, 0x6171 => 0x763b, + 0x6172 => 0x7647, 0x6173 => 0x7648, 0x6174 => 0x7646, 0x6175 => 0x765c, + 0x6176 => 0x7658, 0x6177 => 0x7661, 0x6178 => 0x7662, 0x6179 => 0x7668, + 0x617a => 0x7669, 0x617b => 0x766a, 0x617c => 0x7667, 0x617d => 0x766c, + 0x617e => 0x7670, 0x6221 => 0x7672, 0x6222 => 0x7676, 0x6223 => 0x7678, + 0x6224 => 0x767c, 0x6225 => 0x7680, 0x6226 => 0x7683, 0x6227 => 0x7688, + 0x6228 => 0x768b, 0x6229 => 0x768e, 0x622a => 0x7696, 0x622b => 0x7693, + 0x622c => 0x7699, 0x622d => 0x769a, 0x622e => 0x76b0, 0x622f => 0x76b4, + 0x6230 => 0x76b8, 0x6231 => 0x76b9, 0x6232 => 0x76ba, 0x6233 => 0x76c2, + 0x6234 => 0x76cd, 0x6235 => 0x76d6, 0x6236 => 0x76d2, 0x6237 => 0x76de, + 0x6238 => 0x76e1, 0x6239 => 0x76e5, 0x623a => 0x76e7, 0x623b => 0x76ea, + 0x623c => 0x862f, 0x623d => 0x76fb, 0x623e => 0x7708, 0x623f => 0x7707, + 0x6240 => 0x7704, 0x6241 => 0x7729, 0x6242 => 0x7724, 0x6243 => 0x771e, + 0x6244 => 0x7725, 0x6245 => 0x7726, 0x6246 => 0x771b, 0x6247 => 0x7737, + 0x6248 => 0x7738, 0x6249 => 0x7747, 0x624a => 0x775a, 0x624b => 0x7768, + 0x624c => 0x776b, 0x624d => 0x775b, 0x624e => 0x7765, 0x624f => 0x777f, + 0x6250 => 0x777e, 0x6251 => 0x7779, 0x6252 => 0x778e, 0x6253 => 0x778b, + 0x6254 => 0x7791, 0x6255 => 0x77a0, 0x6256 => 0x779e, 0x6257 => 0x77b0, + 0x6258 => 0x77b6, 0x6259 => 0x77b9, 0x625a => 0x77bf, 0x625b => 0x77bc, + 0x625c => 0x77bd, 0x625d => 0x77bb, 0x625e => 0x77c7, 0x625f => 0x77cd, + 0x6260 => 0x77d7, 0x6261 => 0x77da, 0x6262 => 0x77dc, 0x6263 => 0x77e3, + 0x6264 => 0x77ee, 0x6265 => 0x77fc, 0x6266 => 0x780c, 0x6267 => 0x7812, + 0x6268 => 0x7926, 0x6269 => 0x7820, 0x626a => 0x792a, 0x626b => 0x7845, + 0x626c => 0x788e, 0x626d => 0x7874, 0x626e => 0x7886, 0x626f => 0x787c, + 0x6270 => 0x789a, 0x6271 => 0x788c, 0x6272 => 0x78a3, 0x6273 => 0x78b5, + 0x6274 => 0x78aa, 0x6275 => 0x78af, 0x6276 => 0x78d1, 0x6277 => 0x78c6, + 0x6278 => 0x78cb, 0x6279 => 0x78d4, 0x627a => 0x78be, 0x627b => 0x78bc, + 0x627c => 0x78c5, 0x627d => 0x78ca, 0x627e => 0x78ec, 0x6321 => 0x78e7, + 0x6322 => 0x78da, 0x6323 => 0x78fd, 0x6324 => 0x78f4, 0x6325 => 0x7907, + 0x6326 => 0x7912, 0x6327 => 0x7911, 0x6328 => 0x7919, 0x6329 => 0x792c, + 0x632a => 0x792b, 0x632b => 0x7940, 0x632c => 0x7960, 0x632d => 0x7957, + 0x632e => 0x795f, 0x632f => 0x795a, 0x6330 => 0x7955, 0x6331 => 0x7953, + 0x6332 => 0x797a, 0x6333 => 0x797f, 0x6334 => 0x798a, 0x6335 => 0x799d, + 0x6336 => 0x79a7, 0x6337 => 0x9f4b, 0x6338 => 0x79aa, 0x6339 => 0x79ae, + 0x633a => 0x79b3, 0x633b => 0x79b9, 0x633c => 0x79ba, 0x633d => 0x79c9, + 0x633e => 0x79d5, 0x633f => 0x79e7, 0x6340 => 0x79ec, 0x6341 => 0x79e1, + 0x6342 => 0x79e3, 0x6343 => 0x7a08, 0x6344 => 0x7a0d, 0x6345 => 0x7a18, + 0x6346 => 0x7a19, 0x6347 => 0x7a20, 0x6348 => 0x7a1f, 0x6349 => 0x7980, + 0x634a => 0x7a31, 0x634b => 0x7a3b, 0x634c => 0x7a3e, 0x634d => 0x7a37, + 0x634e => 0x7a43, 0x634f => 0x7a57, 0x6350 => 0x7a49, 0x6351 => 0x7a61, + 0x6352 => 0x7a62, 0x6353 => 0x7a69, 0x6354 => 0x9f9d, 0x6355 => 0x7a70, + 0x6356 => 0x7a79, 0x6357 => 0x7a7d, 0x6358 => 0x7a88, 0x6359 => 0x7a97, + 0x635a => 0x7a95, 0x635b => 0x7a98, 0x635c => 0x7a96, 0x635d => 0x7aa9, + 0x635e => 0x7ac8, 0x635f => 0x7ab0, 0x6360 => 0x7ab6, 0x6361 => 0x7ac5, + 0x6362 => 0x7ac4, 0x6363 => 0x7abf, 0x6364 => 0x9083, 0x6365 => 0x7ac7, + 0x6366 => 0x7aca, 0x6367 => 0x7acd, 0x6368 => 0x7acf, 0x6369 => 0x7ad5, + 0x636a => 0x7ad3, 0x636b => 0x7ad9, 0x636c => 0x7ada, 0x636d => 0x7add, + 0x636e => 0x7ae1, 0x636f => 0x7ae2, 0x6370 => 0x7ae6, 0x6371 => 0x7aed, + 0x6372 => 0x7af0, 0x6373 => 0x7b02, 0x6374 => 0x7b0f, 0x6375 => 0x7b0a, + 0x6376 => 0x7b06, 0x6377 => 0x7b33, 0x6378 => 0x7b18, 0x6379 => 0x7b19, + 0x637a => 0x7b1e, 0x637b => 0x7b35, 0x637c => 0x7b28, 0x637d => 0x7b36, + 0x637e => 0x7b50, 0x6421 => 0x7b7a, 0x6422 => 0x7b04, 0x6423 => 0x7b4d, + 0x6424 => 0x7b0b, 0x6425 => 0x7b4c, 0x6426 => 0x7b45, 0x6427 => 0x7b75, + 0x6428 => 0x7b65, 0x6429 => 0x7b74, 0x642a => 0x7b67, 0x642b => 0x7b70, + 0x642c => 0x7b71, 0x642d => 0x7b6c, 0x642e => 0x7b6e, 0x642f => 0x7b9d, + 0x6430 => 0x7b98, 0x6431 => 0x7b9f, 0x6432 => 0x7b8d, 0x6433 => 0x7b9c, + 0x6434 => 0x7b9a, 0x6435 => 0x7b8b, 0x6436 => 0x7b92, 0x6437 => 0x7b8f, + 0x6438 => 0x7b5d, 0x6439 => 0x7b99, 0x643a => 0x7bcb, 0x643b => 0x7bc1, + 0x643c => 0x7bcc, 0x643d => 0x7bcf, 0x643e => 0x7bb4, 0x643f => 0x7bc6, + 0x6440 => 0x7bdd, 0x6441 => 0x7be9, 0x6442 => 0x7c11, 0x6443 => 0x7c14, + 0x6444 => 0x7be6, 0x6445 => 0x7be5, 0x6446 => 0x7c60, 0x6447 => 0x7c00, + 0x6448 => 0x7c07, 0x6449 => 0x7c13, 0x644a => 0x7bf3, 0x644b => 0x7bf7, + 0x644c => 0x7c17, 0x644d => 0x7c0d, 0x644e => 0x7bf6, 0x644f => 0x7c23, + 0x6450 => 0x7c27, 0x6451 => 0x7c2a, 0x6452 => 0x7c1f, 0x6453 => 0x7c37, + 0x6454 => 0x7c2b, 0x6455 => 0x7c3d, 0x6456 => 0x7c4c, 0x6457 => 0x7c43, + 0x6458 => 0x7c54, 0x6459 => 0x7c4f, 0x645a => 0x7c40, 0x645b => 0x7c50, + 0x645c => 0x7c58, 0x645d => 0x7c5f, 0x645e => 0x7c64, 0x645f => 0x7c56, + 0x6460 => 0x7c65, 0x6461 => 0x7c6c, 0x6462 => 0x7c75, 0x6463 => 0x7c83, + 0x6464 => 0x7c90, 0x6465 => 0x7ca4, 0x6466 => 0x7cad, 0x6467 => 0x7ca2, + 0x6468 => 0x7cab, 0x6469 => 0x7ca1, 0x646a => 0x7ca8, 0x646b => 0x7cb3, + 0x646c => 0x7cb2, 0x646d => 0x7cb1, 0x646e => 0x7cae, 0x646f => 0x7cb9, + 0x6470 => 0x7cbd, 0x6471 => 0x7cc0, 0x6472 => 0x7cc5, 0x6473 => 0x7cc2, + 0x6474 => 0x7cd8, 0x6475 => 0x7cd2, 0x6476 => 0x7cdc, 0x6477 => 0x7ce2, + 0x6478 => 0x9b3b, 0x6479 => 0x7cef, 0x647a => 0x7cf2, 0x647b => 0x7cf4, + 0x647c => 0x7cf6, 0x647d => 0x7cfa, 0x647e => 0x7d06, 0x6521 => 0x7d02, + 0x6522 => 0x7d1c, 0x6523 => 0x7d15, 0x6524 => 0x7d0a, 0x6525 => 0x7d45, + 0x6526 => 0x7d4b, 0x6527 => 0x7d2e, 0x6528 => 0x7d32, 0x6529 => 0x7d3f, + 0x652a => 0x7d35, 0x652b => 0x7d46, 0x652c => 0x7d73, 0x652d => 0x7d56, + 0x652e => 0x7d4e, 0x652f => 0x7d72, 0x6530 => 0x7d68, 0x6531 => 0x7d6e, + 0x6532 => 0x7d4f, 0x6533 => 0x7d63, 0x6534 => 0x7d93, 0x6535 => 0x7d89, + 0x6536 => 0x7d5b, 0x6537 => 0x7d8f, 0x6538 => 0x7d7d, 0x6539 => 0x7d9b, + 0x653a => 0x7dba, 0x653b => 0x7dae, 0x653c => 0x7da3, 0x653d => 0x7db5, + 0x653e => 0x7dc7, 0x653f => 0x7dbd, 0x6540 => 0x7dab, 0x6541 => 0x7e3d, + 0x6542 => 0x7da2, 0x6543 => 0x7daf, 0x6544 => 0x7ddc, 0x6545 => 0x7db8, + 0x6546 => 0x7d9f, 0x6547 => 0x7db0, 0x6548 => 0x7dd8, 0x6549 => 0x7ddd, + 0x654a => 0x7de4, 0x654b => 0x7dde, 0x654c => 0x7dfb, 0x654d => 0x7df2, + 0x654e => 0x7de1, 0x654f => 0x7e05, 0x6550 => 0x7e0a, 0x6551 => 0x7e23, + 0x6552 => 0x7e21, 0x6553 => 0x7e12, 0x6554 => 0x7e31, 0x6555 => 0x7e1f, + 0x6556 => 0x7e09, 0x6557 => 0x7e0b, 0x6558 => 0x7e22, 0x6559 => 0x7e46, + 0x655a => 0x7e66, 0x655b => 0x7e3b, 0x655c => 0x7e35, 0x655d => 0x7e39, + 0x655e => 0x7e43, 0x655f => 0x7e37, 0x6560 => 0x7e32, 0x6561 => 0x7e3a, + 0x6562 => 0x7e67, 0x6563 => 0x7e5d, 0x6564 => 0x7e56, 0x6565 => 0x7e5e, + 0x6566 => 0x7e59, 0x6567 => 0x7e5a, 0x6568 => 0x7e79, 0x6569 => 0x7e6a, + 0x656a => 0x7e69, 0x656b => 0x7e7c, 0x656c => 0x7e7b, 0x656d => 0x7e83, + 0x656e => 0x7dd5, 0x656f => 0x7e7d, 0x6570 => 0x8fae, 0x6571 => 0x7e7f, + 0x6572 => 0x7e88, 0x6573 => 0x7e89, 0x6574 => 0x7e8c, 0x6575 => 0x7e92, + 0x6576 => 0x7e90, 0x6577 => 0x7e93, 0x6578 => 0x7e94, 0x6579 => 0x7e96, + 0x657a => 0x7e8e, 0x657b => 0x7e9b, 0x657c => 0x7e9c, 0x657d => 0x7f38, + 0x657e => 0x7f3a, 0x6621 => 0x7f45, 0x6622 => 0x7f4c, 0x6623 => 0x7f4d, + 0x6624 => 0x7f4e, 0x6625 => 0x7f50, 0x6626 => 0x7f51, 0x6627 => 0x7f55, + 0x6628 => 0x7f54, 0x6629 => 0x7f58, 0x662a => 0x7f5f, 0x662b => 0x7f60, + 0x662c => 0x7f68, 0x662d => 0x7f69, 0x662e => 0x7f67, 0x662f => 0x7f78, + 0x6630 => 0x7f82, 0x6631 => 0x7f86, 0x6632 => 0x7f83, 0x6633 => 0x7f88, + 0x6634 => 0x7f87, 0x6635 => 0x7f8c, 0x6636 => 0x7f94, 0x6637 => 0x7f9e, + 0x6638 => 0x7f9d, 0x6639 => 0x7f9a, 0x663a => 0x7fa3, 0x663b => 0x7faf, + 0x663c => 0x7fb2, 0x663d => 0x7fb9, 0x663e => 0x7fae, 0x663f => 0x7fb6, + 0x6640 => 0x7fb8, 0x6641 => 0x8b71, 0x6642 => 0x7fc5, 0x6643 => 0x7fc6, + 0x6644 => 0x7fca, 0x6645 => 0x7fd5, 0x6646 => 0x7fd4, 0x6647 => 0x7fe1, + 0x6648 => 0x7fe6, 0x6649 => 0x7fe9, 0x664a => 0x7ff3, 0x664b => 0x7ff9, + 0x664c => 0x98dc, 0x664d => 0x8006, 0x664e => 0x8004, 0x664f => 0x800b, + 0x6650 => 0x8012, 0x6651 => 0x8018, 0x6652 => 0x8019, 0x6653 => 0x801c, + 0x6654 => 0x8021, 0x6655 => 0x8028, 0x6656 => 0x803f, 0x6657 => 0x803b, + 0x6658 => 0x804a, 0x6659 => 0x8046, 0x665a => 0x8052, 0x665b => 0x8058, + 0x665c => 0x805a, 0x665d => 0x805f, 0x665e => 0x8062, 0x665f => 0x8068, + 0x6660 => 0x8073, 0x6661 => 0x8072, 0x6662 => 0x8070, 0x6663 => 0x8076, + 0x6664 => 0x8079, 0x6665 => 0x807d, 0x6666 => 0x807f, 0x6667 => 0x8084, + 0x6668 => 0x8086, 0x6669 => 0x8085, 0x666a => 0x809b, 0x666b => 0x8093, + 0x666c => 0x809a, 0x666d => 0x80ad, 0x666e => 0x5190, 0x666f => 0x80ac, + 0x6670 => 0x80db, 0x6671 => 0x80e5, 0x6672 => 0x80d9, 0x6673 => 0x80dd, + 0x6674 => 0x80c4, 0x6675 => 0x80da, 0x6676 => 0x80d6, 0x6677 => 0x8109, + 0x6678 => 0x80ef, 0x6679 => 0x80f1, 0x667a => 0x811b, 0x667b => 0x8129, + 0x667c => 0x8123, 0x667d => 0x812f, 0x667e => 0x814b, 0x6721 => 0x968b, + 0x6722 => 0x8146, 0x6723 => 0x813e, 0x6724 => 0x8153, 0x6725 => 0x8151, + 0x6726 => 0x80fc, 0x6727 => 0x8171, 0x6728 => 0x816e, 0x6729 => 0x8165, + 0x672a => 0x8166, 0x672b => 0x8174, 0x672c => 0x8183, 0x672d => 0x8188, + 0x672e => 0x818a, 0x672f => 0x8180, 0x6730 => 0x8182, 0x6731 => 0x81a0, + 0x6732 => 0x8195, 0x6733 => 0x81a4, 0x6734 => 0x81a3, 0x6735 => 0x815f, + 0x6736 => 0x8193, 0x6737 => 0x81a9, 0x6738 => 0x81b0, 0x6739 => 0x81b5, + 0x673a => 0x81be, 0x673b => 0x81b8, 0x673c => 0x81bd, 0x673d => 0x81c0, + 0x673e => 0x81c2, 0x673f => 0x81ba, 0x6740 => 0x81c9, 0x6741 => 0x81cd, + 0x6742 => 0x81d1, 0x6743 => 0x81d9, 0x6744 => 0x81d8, 0x6745 => 0x81c8, + 0x6746 => 0x81da, 0x6747 => 0x81df, 0x6748 => 0x81e0, 0x6749 => 0x81e7, + 0x674a => 0x81fa, 0x674b => 0x81fb, 0x674c => 0x81fe, 0x674d => 0x8201, + 0x674e => 0x8202, 0x674f => 0x8205, 0x6750 => 0x8207, 0x6751 => 0x820a, + 0x6752 => 0x820d, 0x6753 => 0x8210, 0x6754 => 0x8216, 0x6755 => 0x8229, + 0x6756 => 0x822b, 0x6757 => 0x8238, 0x6758 => 0x8233, 0x6759 => 0x8240, + 0x675a => 0x8259, 0x675b => 0x8258, 0x675c => 0x825d, 0x675d => 0x825a, + 0x675e => 0x825f, 0x675f => 0x8264, 0x6760 => 0x8262, 0x6761 => 0x8268, + 0x6762 => 0x826a, 0x6763 => 0x826b, 0x6764 => 0x822e, 0x6765 => 0x8271, + 0x6766 => 0x8277, 0x6767 => 0x8278, 0x6768 => 0x827e, 0x6769 => 0x828d, + 0x676a => 0x8292, 0x676b => 0x82ab, 0x676c => 0x829f, 0x676d => 0x82bb, + 0x676e => 0x82ac, 0x676f => 0x82e1, 0x6770 => 0x82e3, 0x6771 => 0x82df, + 0x6772 => 0x82d2, 0x6773 => 0x82f4, 0x6774 => 0x82f3, 0x6775 => 0x82fa, + 0x6776 => 0x8393, 0x6777 => 0x8303, 0x6778 => 0x82fb, 0x6779 => 0x82f9, + 0x677a => 0x82de, 0x677b => 0x8306, 0x677c => 0x82dc, 0x677d => 0x8309, + 0x677e => 0x82d9, 0x6821 => 0x8335, 0x6822 => 0x8334, 0x6823 => 0x8316, + 0x6824 => 0x8332, 0x6825 => 0x8331, 0x6826 => 0x8340, 0x6827 => 0x8339, + 0x6828 => 0x8350, 0x6829 => 0x8345, 0x682a => 0x832f, 0x682b => 0x832b, + 0x682c => 0x8317, 0x682d => 0x8318, 0x682e => 0x8385, 0x682f => 0x839a, + 0x6830 => 0x83aa, 0x6831 => 0x839f, 0x6832 => 0x83a2, 0x6833 => 0x8396, + 0x6834 => 0x8323, 0x6835 => 0x838e, 0x6836 => 0x8387, 0x6837 => 0x838a, + 0x6838 => 0x837c, 0x6839 => 0x83b5, 0x683a => 0x8373, 0x683b => 0x8375, + 0x683c => 0x83a0, 0x683d => 0x8389, 0x683e => 0x83a8, 0x683f => 0x83f4, + 0x6840 => 0x8413, 0x6841 => 0x83eb, 0x6842 => 0x83ce, 0x6843 => 0x83fd, + 0x6844 => 0x8403, 0x6845 => 0x83d8, 0x6846 => 0x840b, 0x6847 => 0x83c1, + 0x6848 => 0x83f7, 0x6849 => 0x8407, 0x684a => 0x83e0, 0x684b => 0x83f2, + 0x684c => 0x840d, 0x684d => 0x8422, 0x684e => 0x8420, 0x684f => 0x83bd, + 0x6850 => 0x8438, 0x6851 => 0x8506, 0x6852 => 0x83fb, 0x6853 => 0x846d, + 0x6854 => 0x842a, 0x6855 => 0x843c, 0x6856 => 0x855a, 0x6857 => 0x8484, + 0x6858 => 0x8477, 0x6859 => 0x846b, 0x685a => 0x84ad, 0x685b => 0x846e, + 0x685c => 0x8482, 0x685d => 0x8469, 0x685e => 0x8446, 0x685f => 0x842c, + 0x6860 => 0x846f, 0x6861 => 0x8479, 0x6862 => 0x8435, 0x6863 => 0x84ca, + 0x6864 => 0x8462, 0x6865 => 0x84b9, 0x6866 => 0x84bf, 0x6867 => 0x849f, + 0x6868 => 0x84d9, 0x6869 => 0x84cd, 0x686a => 0x84bb, 0x686b => 0x84da, + 0x686c => 0x84d0, 0x686d => 0x84c1, 0x686e => 0x84c6, 0x686f => 0x84d6, + 0x6870 => 0x84a1, 0x6871 => 0x8521, 0x6872 => 0x84ff, 0x6873 => 0x84f4, + 0x6874 => 0x8517, 0x6875 => 0x8518, 0x6876 => 0x852c, 0x6877 => 0x851f, + 0x6878 => 0x8515, 0x6879 => 0x8514, 0x687a => 0x84fc, 0x687b => 0x8540, + 0x687c => 0x8563, 0x687d => 0x8558, 0x687e => 0x8548, 0x6921 => 0x8541, + 0x6922 => 0x8602, 0x6923 => 0x854b, 0x6924 => 0x8555, 0x6925 => 0x8580, + 0x6926 => 0x85a4, 0x6927 => 0x8588, 0x6928 => 0x8591, 0x6929 => 0x858a, + 0x692a => 0x85a8, 0x692b => 0x856d, 0x692c => 0x8594, 0x692d => 0x859b, + 0x692e => 0x85ea, 0x692f => 0x8587, 0x6930 => 0x859c, 0x6931 => 0x8577, + 0x6932 => 0x857e, 0x6933 => 0x8590, 0x6934 => 0x85c9, 0x6935 => 0x85ba, + 0x6936 => 0x85cf, 0x6937 => 0x85b9, 0x6938 => 0x85d0, 0x6939 => 0x85d5, + 0x693a => 0x85dd, 0x693b => 0x85e5, 0x693c => 0x85dc, 0x693d => 0x85f9, + 0x693e => 0x860a, 0x693f => 0x8613, 0x6940 => 0x860b, 0x6941 => 0x85fe, + 0x6942 => 0x85fa, 0x6943 => 0x8606, 0x6944 => 0x8622, 0x6945 => 0x861a, + 0x6946 => 0x8630, 0x6947 => 0x863f, 0x6948 => 0x864d, 0x6949 => 0x4e55, + 0x694a => 0x8654, 0x694b => 0x865f, 0x694c => 0x8667, 0x694d => 0x8671, + 0x694e => 0x8693, 0x694f => 0x86a3, 0x6950 => 0x86a9, 0x6951 => 0x86aa, + 0x6952 => 0x868b, 0x6953 => 0x868c, 0x6954 => 0x86b6, 0x6955 => 0x86af, + 0x6956 => 0x86c4, 0x6957 => 0x86c6, 0x6958 => 0x86b0, 0x6959 => 0x86c9, + 0x695a => 0x8823, 0x695b => 0x86ab, 0x695c => 0x86d4, 0x695d => 0x86de, + 0x695e => 0x86e9, 0x695f => 0x86ec, 0x6960 => 0x86df, 0x6961 => 0x86db, + 0x6962 => 0x86ef, 0x6963 => 0x8712, 0x6964 => 0x8706, 0x6965 => 0x8708, + 0x6966 => 0x8700, 0x6967 => 0x8703, 0x6968 => 0x86fb, 0x6969 => 0x8711, + 0x696a => 0x8709, 0x696b => 0x870d, 0x696c => 0x86f9, 0x696d => 0x870a, + 0x696e => 0x8734, 0x696f => 0x873f, 0x6970 => 0x8737, 0x6971 => 0x873b, + 0x6972 => 0x8725, 0x6973 => 0x8729, 0x6974 => 0x871a, 0x6975 => 0x8760, + 0x6976 => 0x875f, 0x6977 => 0x8778, 0x6978 => 0x874c, 0x6979 => 0x874e, + 0x697a => 0x8774, 0x697b => 0x8757, 0x697c => 0x8768, 0x697d => 0x876e, + 0x697e => 0x8759, 0x6a21 => 0x8753, 0x6a22 => 0x8763, 0x6a23 => 0x876a, + 0x6a24 => 0x8805, 0x6a25 => 0x87a2, 0x6a26 => 0x879f, 0x6a27 => 0x8782, + 0x6a28 => 0x87af, 0x6a29 => 0x87cb, 0x6a2a => 0x87bd, 0x6a2b => 0x87c0, + 0x6a2c => 0x87d0, 0x6a2d => 0x96d6, 0x6a2e => 0x87ab, 0x6a2f => 0x87c4, + 0x6a30 => 0x87b3, 0x6a31 => 0x87c7, 0x6a32 => 0x87c6, 0x6a33 => 0x87bb, + 0x6a34 => 0x87ef, 0x6a35 => 0x87f2, 0x6a36 => 0x87e0, 0x6a37 => 0x880f, + 0x6a38 => 0x880d, 0x6a39 => 0x87fe, 0x6a3a => 0x87f6, 0x6a3b => 0x87f7, + 0x6a3c => 0x880e, 0x6a3d => 0x87d2, 0x6a3e => 0x8811, 0x6a3f => 0x8816, + 0x6a40 => 0x8815, 0x6a41 => 0x8822, 0x6a42 => 0x8821, 0x6a43 => 0x8831, + 0x6a44 => 0x8836, 0x6a45 => 0x8839, 0x6a46 => 0x8827, 0x6a47 => 0x883b, + 0x6a48 => 0x8844, 0x6a49 => 0x8842, 0x6a4a => 0x8852, 0x6a4b => 0x8859, + 0x6a4c => 0x885e, 0x6a4d => 0x8862, 0x6a4e => 0x886b, 0x6a4f => 0x8881, + 0x6a50 => 0x887e, 0x6a51 => 0x889e, 0x6a52 => 0x8875, 0x6a53 => 0x887d, + 0x6a54 => 0x88b5, 0x6a55 => 0x8872, 0x6a56 => 0x8882, 0x6a57 => 0x8897, + 0x6a58 => 0x8892, 0x6a59 => 0x88ae, 0x6a5a => 0x8899, 0x6a5b => 0x88a2, + 0x6a5c => 0x888d, 0x6a5d => 0x88a4, 0x6a5e => 0x88b0, 0x6a5f => 0x88bf, + 0x6a60 => 0x88b1, 0x6a61 => 0x88c3, 0x6a62 => 0x88c4, 0x6a63 => 0x88d4, + 0x6a64 => 0x88d8, 0x6a65 => 0x88d9, 0x6a66 => 0x88dd, 0x6a67 => 0x88f9, + 0x6a68 => 0x8902, 0x6a69 => 0x88fc, 0x6a6a => 0x88f4, 0x6a6b => 0x88e8, + 0x6a6c => 0x88f2, 0x6a6d => 0x8904, 0x6a6e => 0x890c, 0x6a6f => 0x890a, + 0x6a70 => 0x8913, 0x6a71 => 0x8943, 0x6a72 => 0x891e, 0x6a73 => 0x8925, + 0x6a74 => 0x892a, 0x6a75 => 0x892b, 0x6a76 => 0x8941, 0x6a77 => 0x8944, + 0x6a78 => 0x893b, 0x6a79 => 0x8936, 0x6a7a => 0x8938, 0x6a7b => 0x894c, + 0x6a7c => 0x891d, 0x6a7d => 0x8960, 0x6a7e => 0x895e, 0x6b21 => 0x8966, + 0x6b22 => 0x8964, 0x6b23 => 0x896d, 0x6b24 => 0x896a, 0x6b25 => 0x896f, + 0x6b26 => 0x8974, 0x6b27 => 0x8977, 0x6b28 => 0x897e, 0x6b29 => 0x8983, + 0x6b2a => 0x8988, 0x6b2b => 0x898a, 0x6b2c => 0x8993, 0x6b2d => 0x8998, + 0x6b2e => 0x89a1, 0x6b2f => 0x89a9, 0x6b30 => 0x89a6, 0x6b31 => 0x89ac, + 0x6b32 => 0x89af, 0x6b33 => 0x89b2, 0x6b34 => 0x89ba, 0x6b35 => 0x89bd, + 0x6b36 => 0x89bf, 0x6b37 => 0x89c0, 0x6b38 => 0x89da, 0x6b39 => 0x89dc, + 0x6b3a => 0x89dd, 0x6b3b => 0x89e7, 0x6b3c => 0x89f4, 0x6b3d => 0x89f8, + 0x6b3e => 0x8a03, 0x6b3f => 0x8a16, 0x6b40 => 0x8a10, 0x6b41 => 0x8a0c, + 0x6b42 => 0x8a1b, 0x6b43 => 0x8a1d, 0x6b44 => 0x8a25, 0x6b45 => 0x8a36, + 0x6b46 => 0x8a41, 0x6b47 => 0x8a5b, 0x6b48 => 0x8a52, 0x6b49 => 0x8a46, + 0x6b4a => 0x8a48, 0x6b4b => 0x8a7c, 0x6b4c => 0x8a6d, 0x6b4d => 0x8a6c, + 0x6b4e => 0x8a62, 0x6b4f => 0x8a85, 0x6b50 => 0x8a82, 0x6b51 => 0x8a84, + 0x6b52 => 0x8aa8, 0x6b53 => 0x8aa1, 0x6b54 => 0x8a91, 0x6b55 => 0x8aa5, + 0x6b56 => 0x8aa6, 0x6b57 => 0x8a9a, 0x6b58 => 0x8aa3, 0x6b59 => 0x8ac4, + 0x6b5a => 0x8acd, 0x6b5b => 0x8ac2, 0x6b5c => 0x8ada, 0x6b5d => 0x8aeb, + 0x6b5e => 0x8af3, 0x6b5f => 0x8ae7, 0x6b60 => 0x8ae4, 0x6b61 => 0x8af1, + 0x6b62 => 0x8b14, 0x6b63 => 0x8ae0, 0x6b64 => 0x8ae2, 0x6b65 => 0x8af7, + 0x6b66 => 0x8ade, 0x6b67 => 0x8adb, 0x6b68 => 0x8b0c, 0x6b69 => 0x8b07, + 0x6b6a => 0x8b1a, 0x6b6b => 0x8ae1, 0x6b6c => 0x8b16, 0x6b6d => 0x8b10, + 0x6b6e => 0x8b17, 0x6b6f => 0x8b20, 0x6b70 => 0x8b33, 0x6b71 => 0x97ab, + 0x6b72 => 0x8b26, 0x6b73 => 0x8b2b, 0x6b74 => 0x8b3e, 0x6b75 => 0x8b28, + 0x6b76 => 0x8b41, 0x6b77 => 0x8b4c, 0x6b78 => 0x8b4f, 0x6b79 => 0x8b4e, + 0x6b7a => 0x8b49, 0x6b7b => 0x8b56, 0x6b7c => 0x8b5b, 0x6b7d => 0x8b5a, + 0x6b7e => 0x8b6b, 0x6c21 => 0x8b5f, 0x6c22 => 0x8b6c, 0x6c23 => 0x8b6f, + 0x6c24 => 0x8b74, 0x6c25 => 0x8b7d, 0x6c26 => 0x8b80, 0x6c27 => 0x8b8c, + 0x6c28 => 0x8b8e, 0x6c29 => 0x8b92, 0x6c2a => 0x8b93, 0x6c2b => 0x8b96, + 0x6c2c => 0x8b99, 0x6c2d => 0x8b9a, 0x6c2e => 0x8c3a, 0x6c2f => 0x8c41, + 0x6c30 => 0x8c3f, 0x6c31 => 0x8c48, 0x6c32 => 0x8c4c, 0x6c33 => 0x8c4e, + 0x6c34 => 0x8c50, 0x6c35 => 0x8c55, 0x6c36 => 0x8c62, 0x6c37 => 0x8c6c, + 0x6c38 => 0x8c78, 0x6c39 => 0x8c7a, 0x6c3a => 0x8c82, 0x6c3b => 0x8c89, + 0x6c3c => 0x8c85, 0x6c3d => 0x8c8a, 0x6c3e => 0x8c8d, 0x6c3f => 0x8c8e, + 0x6c40 => 0x8c94, 0x6c41 => 0x8c7c, 0x6c42 => 0x8c98, 0x6c43 => 0x621d, + 0x6c44 => 0x8cad, 0x6c45 => 0x8caa, 0x6c46 => 0x8cbd, 0x6c47 => 0x8cb2, + 0x6c48 => 0x8cb3, 0x6c49 => 0x8cae, 0x6c4a => 0x8cb6, 0x6c4b => 0x8cc8, + 0x6c4c => 0x8cc1, 0x6c4d => 0x8ce4, 0x6c4e => 0x8ce3, 0x6c4f => 0x8cda, + 0x6c50 => 0x8cfd, 0x6c51 => 0x8cfa, 0x6c52 => 0x8cfb, 0x6c53 => 0x8d04, + 0x6c54 => 0x8d05, 0x6c55 => 0x8d0a, 0x6c56 => 0x8d07, 0x6c57 => 0x8d0f, + 0x6c58 => 0x8d0d, 0x6c59 => 0x8d10, 0x6c5a => 0x9f4e, 0x6c5b => 0x8d13, + 0x6c5c => 0x8ccd, 0x6c5d => 0x8d14, 0x6c5e => 0x8d16, 0x6c5f => 0x8d67, + 0x6c60 => 0x8d6d, 0x6c61 => 0x8d71, 0x6c62 => 0x8d73, 0x6c63 => 0x8d81, + 0x6c64 => 0x8d99, 0x6c65 => 0x8dc2, 0x6c66 => 0x8dbe, 0x6c67 => 0x8dba, + 0x6c68 => 0x8dcf, 0x6c69 => 0x8dda, 0x6c6a => 0x8dd6, 0x6c6b => 0x8dcc, + 0x6c6c => 0x8ddb, 0x6c6d => 0x8dcb, 0x6c6e => 0x8dea, 0x6c6f => 0x8deb, + 0x6c70 => 0x8ddf, 0x6c71 => 0x8de3, 0x6c72 => 0x8dfc, 0x6c73 => 0x8e08, + 0x6c74 => 0x8e09, 0x6c75 => 0x8dff, 0x6c76 => 0x8e1d, 0x6c77 => 0x8e1e, + 0x6c78 => 0x8e10, 0x6c79 => 0x8e1f, 0x6c7a => 0x8e42, 0x6c7b => 0x8e35, + 0x6c7c => 0x8e30, 0x6c7d => 0x8e34, 0x6c7e => 0x8e4a, 0x6d21 => 0x8e47, + 0x6d22 => 0x8e49, 0x6d23 => 0x8e4c, 0x6d24 => 0x8e50, 0x6d25 => 0x8e48, + 0x6d26 => 0x8e59, 0x6d27 => 0x8e64, 0x6d28 => 0x8e60, 0x6d29 => 0x8e2a, + 0x6d2a => 0x8e63, 0x6d2b => 0x8e55, 0x6d2c => 0x8e76, 0x6d2d => 0x8e72, + 0x6d2e => 0x8e7c, 0x6d2f => 0x8e81, 0x6d30 => 0x8e87, 0x6d31 => 0x8e85, + 0x6d32 => 0x8e84, 0x6d33 => 0x8e8b, 0x6d34 => 0x8e8a, 0x6d35 => 0x8e93, + 0x6d36 => 0x8e91, 0x6d37 => 0x8e94, 0x6d38 => 0x8e99, 0x6d39 => 0x8eaa, + 0x6d3a => 0x8ea1, 0x6d3b => 0x8eac, 0x6d3c => 0x8eb0, 0x6d3d => 0x8ec6, + 0x6d3e => 0x8eb1, 0x6d3f => 0x8ebe, 0x6d40 => 0x8ec5, 0x6d41 => 0x8ec8, + 0x6d42 => 0x8ecb, 0x6d43 => 0x8edb, 0x6d44 => 0x8ee3, 0x6d45 => 0x8efc, + 0x6d46 => 0x8efb, 0x6d47 => 0x8eeb, 0x6d48 => 0x8efe, 0x6d49 => 0x8f0a, + 0x6d4a => 0x8f05, 0x6d4b => 0x8f15, 0x6d4c => 0x8f12, 0x6d4d => 0x8f19, + 0x6d4e => 0x8f13, 0x6d4f => 0x8f1c, 0x6d50 => 0x8f1f, 0x6d51 => 0x8f1b, + 0x6d52 => 0x8f0c, 0x6d53 => 0x8f26, 0x6d54 => 0x8f33, 0x6d55 => 0x8f3b, + 0x6d56 => 0x8f39, 0x6d57 => 0x8f45, 0x6d58 => 0x8f42, 0x6d59 => 0x8f3e, + 0x6d5a => 0x8f4c, 0x6d5b => 0x8f49, 0x6d5c => 0x8f46, 0x6d5d => 0x8f4e, + 0x6d5e => 0x8f57, 0x6d5f => 0x8f5c, 0x6d60 => 0x8f62, 0x6d61 => 0x8f63, + 0x6d62 => 0x8f64, 0x6d63 => 0x8f9c, 0x6d64 => 0x8f9f, 0x6d65 => 0x8fa3, + 0x6d66 => 0x8fad, 0x6d67 => 0x8faf, 0x6d68 => 0x8fb7, 0x6d69 => 0x8fda, + 0x6d6a => 0x8fe5, 0x6d6b => 0x8fe2, 0x6d6c => 0x8fea, 0x6d6d => 0x8fef, + 0x6d6e => 0x9087, 0x6d6f => 0x8ff4, 0x6d70 => 0x9005, 0x6d71 => 0x8ff9, + 0x6d72 => 0x8ffa, 0x6d73 => 0x9011, 0x6d74 => 0x9015, 0x6d75 => 0x9021, + 0x6d76 => 0x900d, 0x6d77 => 0x901e, 0x6d78 => 0x9016, 0x6d79 => 0x900b, + 0x6d7a => 0x9027, 0x6d7b => 0x9036, 0x6d7c => 0x9035, 0x6d7d => 0x9039, + 0x6d7e => 0x8ff8, 0x6e21 => 0x904f, 0x6e22 => 0x9050, 0x6e23 => 0x9051, + 0x6e24 => 0x9052, 0x6e25 => 0x900e, 0x6e26 => 0x9049, 0x6e27 => 0x903e, + 0x6e28 => 0x9056, 0x6e29 => 0x9058, 0x6e2a => 0x905e, 0x6e2b => 0x9068, + 0x6e2c => 0x906f, 0x6e2d => 0x9076, 0x6e2e => 0x96a8, 0x6e2f => 0x9072, + 0x6e30 => 0x9082, 0x6e31 => 0x907d, 0x6e32 => 0x9081, 0x6e33 => 0x9080, + 0x6e34 => 0x908a, 0x6e35 => 0x9089, 0x6e36 => 0x908f, 0x6e37 => 0x90a8, + 0x6e38 => 0x90af, 0x6e39 => 0x90b1, 0x6e3a => 0x90b5, 0x6e3b => 0x90e2, + 0x6e3c => 0x90e4, 0x6e3d => 0x6248, 0x6e3e => 0x90db, 0x6e3f => 0x9102, + 0x6e40 => 0x9112, 0x6e41 => 0x9119, 0x6e42 => 0x9132, 0x6e43 => 0x9130, + 0x6e44 => 0x914a, 0x6e45 => 0x9156, 0x6e46 => 0x9158, 0x6e47 => 0x9163, + 0x6e48 => 0x9165, 0x6e49 => 0x9169, 0x6e4a => 0x9173, 0x6e4b => 0x9172, + 0x6e4c => 0x918b, 0x6e4d => 0x9189, 0x6e4e => 0x9182, 0x6e4f => 0x91a2, + 0x6e50 => 0x91ab, 0x6e51 => 0x91af, 0x6e52 => 0x91aa, 0x6e53 => 0x91b5, + 0x6e54 => 0x91b4, 0x6e55 => 0x91ba, 0x6e56 => 0x91c0, 0x6e57 => 0x91c1, + 0x6e58 => 0x91c9, 0x6e59 => 0x91cb, 0x6e5a => 0x91d0, 0x6e5b => 0x91d6, + 0x6e5c => 0x91df, 0x6e5d => 0x91e1, 0x6e5e => 0x91db, 0x6e5f => 0x91fc, + 0x6e60 => 0x91f5, 0x6e61 => 0x91f6, 0x6e62 => 0x921e, 0x6e63 => 0x91ff, + 0x6e64 => 0x9214, 0x6e65 => 0x922c, 0x6e66 => 0x9215, 0x6e67 => 0x9211, + 0x6e68 => 0x925e, 0x6e69 => 0x9257, 0x6e6a => 0x9245, 0x6e6b => 0x9249, + 0x6e6c => 0x9264, 0x6e6d => 0x9248, 0x6e6e => 0x9295, 0x6e6f => 0x923f, + 0x6e70 => 0x924b, 0x6e71 => 0x9250, 0x6e72 => 0x929c, 0x6e73 => 0x9296, + 0x6e74 => 0x9293, 0x6e75 => 0x929b, 0x6e76 => 0x925a, 0x6e77 => 0x92cf, + 0x6e78 => 0x92b9, 0x6e79 => 0x92b7, 0x6e7a => 0x92e9, 0x6e7b => 0x930f, + 0x6e7c => 0x92fa, 0x6e7d => 0x9344, 0x6e7e => 0x932e, 0x6f21 => 0x9319, + 0x6f22 => 0x9322, 0x6f23 => 0x931a, 0x6f24 => 0x9323, 0x6f25 => 0x933a, + 0x6f26 => 0x9335, 0x6f27 => 0x933b, 0x6f28 => 0x935c, 0x6f29 => 0x9360, + 0x6f2a => 0x937c, 0x6f2b => 0x936e, 0x6f2c => 0x9356, 0x6f2d => 0x93b0, + 0x6f2e => 0x93ac, 0x6f2f => 0x93ad, 0x6f30 => 0x9394, 0x6f31 => 0x93b9, + 0x6f32 => 0x93d6, 0x6f33 => 0x93d7, 0x6f34 => 0x93e8, 0x6f35 => 0x93e5, + 0x6f36 => 0x93d8, 0x6f37 => 0x93c3, 0x6f38 => 0x93dd, 0x6f39 => 0x93d0, + 0x6f3a => 0x93c8, 0x6f3b => 0x93e4, 0x6f3c => 0x941a, 0x6f3d => 0x9414, + 0x6f3e => 0x9413, 0x6f3f => 0x9403, 0x6f40 => 0x9407, 0x6f41 => 0x9410, + 0x6f42 => 0x9436, 0x6f43 => 0x942b, 0x6f44 => 0x9435, 0x6f45 => 0x9421, + 0x6f46 => 0x943a, 0x6f47 => 0x9441, 0x6f48 => 0x9452, 0x6f49 => 0x9444, + 0x6f4a => 0x945b, 0x6f4b => 0x9460, 0x6f4c => 0x9462, 0x6f4d => 0x945e, + 0x6f4e => 0x946a, 0x6f4f => 0x9229, 0x6f50 => 0x9470, 0x6f51 => 0x9475, + 0x6f52 => 0x9477, 0x6f53 => 0x947d, 0x6f54 => 0x945a, 0x6f55 => 0x947c, + 0x6f56 => 0x947e, 0x6f57 => 0x9481, 0x6f58 => 0x947f, 0x6f59 => 0x9582, + 0x6f5a => 0x9587, 0x6f5b => 0x958a, 0x6f5c => 0x9594, 0x6f5d => 0x9596, + 0x6f5e => 0x9598, 0x6f5f => 0x9599, 0x6f60 => 0x95a0, 0x6f61 => 0x95a8, + 0x6f62 => 0x95a7, 0x6f63 => 0x95ad, 0x6f64 => 0x95bc, 0x6f65 => 0x95bb, + 0x6f66 => 0x95b9, 0x6f67 => 0x95be, 0x6f68 => 0x95ca, 0x6f69 => 0x6ff6, + 0x6f6a => 0x95c3, 0x6f6b => 0x95cd, 0x6f6c => 0x95cc, 0x6f6d => 0x95d5, + 0x6f6e => 0x95d4, 0x6f6f => 0x95d6, 0x6f70 => 0x95dc, 0x6f71 => 0x95e1, + 0x6f72 => 0x95e5, 0x6f73 => 0x95e2, 0x6f74 => 0x9621, 0x6f75 => 0x9628, + 0x6f76 => 0x962e, 0x6f77 => 0x962f, 0x6f78 => 0x9642, 0x6f79 => 0x964c, + 0x6f7a => 0x964f, 0x6f7b => 0x964b, 0x6f7c => 0x9677, 0x6f7d => 0x965c, + 0x6f7e => 0x965e, 0x7021 => 0x965d, 0x7022 => 0x965f, 0x7023 => 0x9666, + 0x7024 => 0x9672, 0x7025 => 0x966c, 0x7026 => 0x968d, 0x7027 => 0x9698, + 0x7028 => 0x9695, 0x7029 => 0x9697, 0x702a => 0x96aa, 0x702b => 0x96a7, + 0x702c => 0x96b1, 0x702d => 0x96b2, 0x702e => 0x96b0, 0x702f => 0x96b4, + 0x7030 => 0x96b6, 0x7031 => 0x96b8, 0x7032 => 0x96b9, 0x7033 => 0x96ce, + 0x7034 => 0x96cb, 0x7035 => 0x96c9, 0x7036 => 0x96cd, 0x7037 => 0x894d, + 0x7038 => 0x96dc, 0x7039 => 0x970d, 0x703a => 0x96d5, 0x703b => 0x96f9, + 0x703c => 0x9704, 0x703d => 0x9706, 0x703e => 0x9708, 0x703f => 0x9713, + 0x7040 => 0x970e, 0x7041 => 0x9711, 0x7042 => 0x970f, 0x7043 => 0x9716, + 0x7044 => 0x9719, 0x7045 => 0x9724, 0x7046 => 0x972a, 0x7047 => 0x9730, + 0x7048 => 0x9739, 0x7049 => 0x973d, 0x704a => 0x973e, 0x704b => 0x9744, + 0x704c => 0x9746, 0x704d => 0x9748, 0x704e => 0x9742, 0x704f => 0x9749, + 0x7050 => 0x975c, 0x7051 => 0x9760, 0x7052 => 0x9764, 0x7053 => 0x9766, + 0x7054 => 0x9768, 0x7055 => 0x52d2, 0x7056 => 0x976b, 0x7057 => 0x9771, + 0x7058 => 0x9779, 0x7059 => 0x9785, 0x705a => 0x977c, 0x705b => 0x9781, + 0x705c => 0x977a, 0x705d => 0x9786, 0x705e => 0x978b, 0x705f => 0x978f, + 0x7060 => 0x9790, 0x7061 => 0x979c, 0x7062 => 0x97a8, 0x7063 => 0x97a6, + 0x7064 => 0x97a3, 0x7065 => 0x97b3, 0x7066 => 0x97b4, 0x7067 => 0x97c3, + 0x7068 => 0x97c6, 0x7069 => 0x97c8, 0x706a => 0x97cb, 0x706b => 0x97dc, + 0x706c => 0x97ed, 0x706d => 0x9f4f, 0x706e => 0x97f2, 0x706f => 0x7adf, + 0x7070 => 0x97f6, 0x7071 => 0x97f5, 0x7072 => 0x980f, 0x7073 => 0x980c, + 0x7074 => 0x9838, 0x7075 => 0x9824, 0x7076 => 0x9821, 0x7077 => 0x9837, + 0x7078 => 0x983d, 0x7079 => 0x9846, 0x707a => 0x984f, 0x707b => 0x984b, + 0x707c => 0x986b, 0x707d => 0x986f, 0x707e => 0x9870, 0x7121 => 0x9871, + 0x7122 => 0x9874, 0x7123 => 0x9873, 0x7124 => 0x98aa, 0x7125 => 0x98af, + 0x7126 => 0x98b1, 0x7127 => 0x98b6, 0x7128 => 0x98c4, 0x7129 => 0x98c3, + 0x712a => 0x98c6, 0x712b => 0x98e9, 0x712c => 0x98eb, 0x712d => 0x9903, + 0x712e => 0x9909, 0x712f => 0x9912, 0x7130 => 0x9914, 0x7131 => 0x9918, + 0x7132 => 0x9921, 0x7133 => 0x991d, 0x7134 => 0x991e, 0x7135 => 0x9924, + 0x7136 => 0x9920, 0x7137 => 0x992c, 0x7138 => 0x992e, 0x7139 => 0x993d, + 0x713a => 0x993e, 0x713b => 0x9942, 0x713c => 0x9949, 0x713d => 0x9945, + 0x713e => 0x9950, 0x713f => 0x994b, 0x7140 => 0x9951, 0x7141 => 0x9952, + 0x7142 => 0x994c, 0x7143 => 0x9955, 0x7144 => 0x9997, 0x7145 => 0x9998, + 0x7146 => 0x99a5, 0x7147 => 0x99ad, 0x7148 => 0x99ae, 0x7149 => 0x99bc, + 0x714a => 0x99df, 0x714b => 0x99db, 0x714c => 0x99dd, 0x714d => 0x99d8, + 0x714e => 0x99d1, 0x714f => 0x99ed, 0x7150 => 0x99ee, 0x7151 => 0x99f1, + 0x7152 => 0x99f2, 0x7153 => 0x99fb, 0x7154 => 0x99f8, 0x7155 => 0x9a01, + 0x7156 => 0x9a0f, 0x7157 => 0x9a05, 0x7158 => 0x99e2, 0x7159 => 0x9a19, + 0x715a => 0x9a2b, 0x715b => 0x9a37, 0x715c => 0x9a45, 0x715d => 0x9a42, + 0x715e => 0x9a40, 0x715f => 0x9a43, 0x7160 => 0x9a3e, 0x7161 => 0x9a55, + 0x7162 => 0x9a4d, 0x7163 => 0x9a5b, 0x7164 => 0x9a57, 0x7165 => 0x9a5f, + 0x7166 => 0x9a62, 0x7167 => 0x9a65, 0x7168 => 0x9a64, 0x7169 => 0x9a69, + 0x716a => 0x9a6b, 0x716b => 0x9a6a, 0x716c => 0x9aad, 0x716d => 0x9ab0, + 0x716e => 0x9abc, 0x716f => 0x9ac0, 0x7170 => 0x9acf, 0x7171 => 0x9ad1, + 0x7172 => 0x9ad3, 0x7173 => 0x9ad4, 0x7174 => 0x9ade, 0x7175 => 0x9adf, + 0x7176 => 0x9ae2, 0x7177 => 0x9ae3, 0x7178 => 0x9ae6, 0x7179 => 0x9aef, + 0x717a => 0x9aeb, 0x717b => 0x9aee, 0x717c => 0x9af4, 0x717d => 0x9af1, + 0x717e => 0x9af7, 0x7221 => 0x9afb, 0x7222 => 0x9b06, 0x7223 => 0x9b18, + 0x7224 => 0x9b1a, 0x7225 => 0x9b1f, 0x7226 => 0x9b22, 0x7227 => 0x9b23, + 0x7228 => 0x9b25, 0x7229 => 0x9b27, 0x722a => 0x9b28, 0x722b => 0x9b29, + 0x722c => 0x9b2a, 0x722d => 0x9b2e, 0x722e => 0x9b2f, 0x722f => 0x9b32, + 0x7230 => 0x9b44, 0x7231 => 0x9b43, 0x7232 => 0x9b4f, 0x7233 => 0x9b4d, + 0x7234 => 0x9b4e, 0x7235 => 0x9b51, 0x7236 => 0x9b58, 0x7237 => 0x9b74, + 0x7238 => 0x9b93, 0x7239 => 0x9b83, 0x723a => 0x9b91, 0x723b => 0x9b96, + 0x723c => 0x9b97, 0x723d => 0x9b9f, 0x723e => 0x9ba0, 0x723f => 0x9ba8, + 0x7240 => 0x9bb4, 0x7241 => 0x9bc0, 0x7242 => 0x9bca, 0x7243 => 0x9bb9, + 0x7244 => 0x9bc6, 0x7245 => 0x9bcf, 0x7246 => 0x9bd1, 0x7247 => 0x9bd2, + 0x7248 => 0x9be3, 0x7249 => 0x9be2, 0x724a => 0x9be4, 0x724b => 0x9bd4, + 0x724c => 0x9be1, 0x724d => 0x9c3a, 0x724e => 0x9bf2, 0x724f => 0x9bf1, + 0x7250 => 0x9bf0, 0x7251 => 0x9c15, 0x7252 => 0x9c14, 0x7253 => 0x9c09, + 0x7254 => 0x9c13, 0x7255 => 0x9c0c, 0x7256 => 0x9c06, 0x7257 => 0x9c08, + 0x7258 => 0x9c12, 0x7259 => 0x9c0a, 0x725a => 0x9c04, 0x725b => 0x9c2e, + 0x725c => 0x9c1b, 0x725d => 0x9c25, 0x725e => 0x9c24, 0x725f => 0x9c21, + 0x7260 => 0x9c30, 0x7261 => 0x9c47, 0x7262 => 0x9c32, 0x7263 => 0x9c46, + 0x7264 => 0x9c3e, 0x7265 => 0x9c5a, 0x7266 => 0x9c60, 0x7267 => 0x9c67, + 0x7268 => 0x9c76, 0x7269 => 0x9c78, 0x726a => 0x9ce7, 0x726b => 0x9cec, + 0x726c => 0x9cf0, 0x726d => 0x9d09, 0x726e => 0x9d08, 0x726f => 0x9ceb, + 0x7270 => 0x9d03, 0x7271 => 0x9d06, 0x7272 => 0x9d2a, 0x7273 => 0x9d26, + 0x7274 => 0x9daf, 0x7275 => 0x9d23, 0x7276 => 0x9d1f, 0x7277 => 0x9d44, + 0x7278 => 0x9d15, 0x7279 => 0x9d12, 0x727a => 0x9d41, 0x727b => 0x9d3f, + 0x727c => 0x9d3e, 0x727d => 0x9d46, 0x727e => 0x9d48, 0x7321 => 0x9d5d, + 0x7322 => 0x9d5e, 0x7323 => 0x9d64, 0x7324 => 0x9d51, 0x7325 => 0x9d50, + 0x7326 => 0x9d59, 0x7327 => 0x9d72, 0x7328 => 0x9d89, 0x7329 => 0x9d87, + 0x732a => 0x9dab, 0x732b => 0x9d6f, 0x732c => 0x9d7a, 0x732d => 0x9d9a, + 0x732e => 0x9da4, 0x732f => 0x9da9, 0x7330 => 0x9db2, 0x7331 => 0x9dc4, + 0x7332 => 0x9dc1, 0x7333 => 0x9dbb, 0x7334 => 0x9db8, 0x7335 => 0x9dba, + 0x7336 => 0x9dc6, 0x7337 => 0x9dcf, 0x7338 => 0x9dc2, 0x7339 => 0x9dd9, + 0x733a => 0x9dd3, 0x733b => 0x9df8, 0x733c => 0x9de6, 0x733d => 0x9ded, + 0x733e => 0x9def, 0x733f => 0x9dfd, 0x7340 => 0x9e1a, 0x7341 => 0x9e1b, + 0x7342 => 0x9e1e, 0x7343 => 0x9e75, 0x7344 => 0x9e79, 0x7345 => 0x9e7d, + 0x7346 => 0x9e81, 0x7347 => 0x9e88, 0x7348 => 0x9e8b, 0x7349 => 0x9e8c, + 0x734a => 0x9e92, 0x734b => 0x9e95, 0x734c => 0x9e91, 0x734d => 0x9e9d, + 0x734e => 0x9ea5, 0x734f => 0x9ea9, 0x7350 => 0x9eb8, 0x7351 => 0x9eaa, + 0x7352 => 0x9ead, 0x7353 => 0x9761, 0x7354 => 0x9ecc, 0x7355 => 0x9ece, + 0x7356 => 0x9ecf, 0x7357 => 0x9ed0, 0x7358 => 0x9ed4, 0x7359 => 0x9edc, + 0x735a => 0x9ede, 0x735b => 0x9edd, 0x735c => 0x9ee0, 0x735d => 0x9ee5, + 0x735e => 0x9ee8, 0x735f => 0x9eef, 0x7360 => 0x9ef4, 0x7361 => 0x9ef6, + 0x7362 => 0x9ef7, 0x7363 => 0x9ef9, 0x7364 => 0x9efb, 0x7365 => 0x9efc, + 0x7366 => 0x9efd, 0x7367 => 0x9f07, 0x7368 => 0x9f08, 0x7369 => 0x76b7, + 0x736a => 0x9f15, 0x736b => 0x9f21, 0x736c => 0x9f2c, 0x736d => 0x9f3e, + 0x736e => 0x9f4a, 0x736f => 0x9f52, 0x7370 => 0x9f54, 0x7371 => 0x9f63, + 0x7372 => 0x9f5f, 0x7373 => 0x9f60, 0x7374 => 0x9f61, 0x7375 => 0x9f66, + 0x7376 => 0x9f67, 0x7377 => 0x9f6c, 0x7378 => 0x9f6a, 0x7379 => 0x9f77, + 0x737a => 0x9f72, 0x737b => 0x9f76, 0x737c => 0x9f95, 0x737d => 0x9f9c, + 0x737e => 0x9fa0, 0x7421 => 0x582f, 0x7422 => 0x69c7, 0x7423 => 0x9059, + 0x7424 => 0x7464, 0x7425 => 0x51dc, 0x7426 => 0x7199, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/Latin.pm b/lib/Image/ExifTool/Charset/Latin.pm new file mode 100644 index 0000000..13cad9f --- /dev/null +++ b/lib/Image/ExifTool/Charset/Latin.pm @@ -0,0 +1,24 @@ +#------------------------------------------------------------------------------ +# File: Latin.pm +# +# Description: cp1252 to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::Latin = ( + 0x80 => 0x20ac, 0x82 => 0x201a, 0x83 => 0x0192, 0x84 => 0x201e, + 0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021, 0x88 => 0x02c6, + 0x89 => 0x2030, 0x8a => 0x0160, 0x8b => 0x2039, 0x8c => 0x0152, + 0x8e => 0x017d, 0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c, + 0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014, + 0x98 => 0x02dc, 0x99 => 0x2122, 0x9a => 0x0161, 0x9b => 0x203a, + 0x9c => 0x0153, 0x9e => 0x017e, 0x9f => 0x0178, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/Latin2.pm b/lib/Image/ExifTool/Charset/Latin2.pm new file mode 100644 index 0000000..1f8432e --- /dev/null +++ b/lib/Image/ExifTool/Charset/Latin2.pm @@ -0,0 +1,36 @@ +#------------------------------------------------------------------------------ +# File: Latin2.pm +# +# Description: cp1250 to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::Latin2 = ( + 0x80 => 0x20ac, 0x82 => 0x201a, 0x84 => 0x201e, 0x85 => 0x2026, + 0x86 => 0x2020, 0x87 => 0x2021, 0x89 => 0x2030, 0x8a => 0x0160, + 0x8b => 0x2039, 0x8c => 0x015a, 0x8d => 0x0164, 0x8e => 0x017d, + 0x8f => 0x0179, 0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c, + 0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014, + 0x99 => 0x2122, 0x9a => 0x0161, 0x9b => 0x203a, 0x9c => 0x015b, + 0x9d => 0x0165, 0x9e => 0x017e, 0x9f => 0x017a, 0xa1 => 0x02c7, + 0xa2 => 0x02d8, 0xa3 => 0x0141, 0xa5 => 0x0104, 0xaa => 0x015e, + 0xaf => 0x017b, 0xb2 => 0x02db, 0xb3 => 0x0142, 0xb9 => 0x0105, + 0xba => 0x015f, 0xbc => 0x013d, 0xbd => 0x02dd, 0xbe => 0x013e, + 0xbf => 0x017c, 0xc0 => 0x0154, 0xc3 => 0x0102, 0xc5 => 0x0139, + 0xc6 => 0x0106, 0xc8 => 0x010c, 0xca => 0x0118, 0xcc => 0x011a, + 0xcf => 0x010e, 0xd0 => 0x0110, 0xd1 => 0x0143, 0xd2 => 0x0147, + 0xd5 => 0x0150, 0xd8 => 0x0158, 0xd9 => 0x016e, 0xdb => 0x0170, + 0xde => 0x0162, 0xe0 => 0x0155, 0xe3 => 0x0103, 0xe5 => 0x013a, + 0xe6 => 0x0107, 0xe8 => 0x010d, 0xea => 0x0119, 0xec => 0x011b, + 0xef => 0x010f, 0xf0 => 0x0111, 0xf1 => 0x0144, 0xf2 => 0x0148, + 0xf5 => 0x0151, 0xf8 => 0x0159, 0xf9 => 0x016f, 0xfb => 0x0171, + 0xfe => 0x0163, 0xff => 0x02d9, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacArabic.pm b/lib/Image/ExifTool/Charset/MacArabic.pm new file mode 100644 index 0000000..05c22c3 --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacArabic.pm @@ -0,0 +1,47 @@ +#------------------------------------------------------------------------------ +# File: MacArabic.pm +# +# Description: Mac Arabic to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/ARABIC.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +# and directional characters are ignored +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacArabic = ( + 0x80 => 0xc4, 0x81 => 0xa0, 0x82 => 0xc7, 0x83 => 0xc9, 0x84 => 0xd1, + 0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0, 0x89 => 0xe2, + 0x8a => 0xe4, 0x8b => 0x06ba, 0x8c => 0xab, 0x8d => 0xe7, 0x8e => 0xe9, + 0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed, 0x93 => 0x2026, + 0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3, 0x98 => 0xbb, + 0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf7, 0x9c => 0xfa, 0x9d => 0xf9, + 0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x20, 0xa1 => 0x21, 0xa2 => 0x22, + 0xa3 => 0x23, 0xa4 => 0x24, 0xa5 => 0x066a, 0xa6 => 0x26, 0xa7 => 0x27, + 0xa8 => 0x28, 0xa9 => 0x29, 0xaa => 0x2a, 0xab => 0x2b, 0xac => 0x060c, + 0xad => 0x2d, 0xae => 0x2e, 0xaf => 0x2f, 0xb0 => 0x0660, 0xb1 => 0x0661, + 0xb2 => 0x0662, 0xb3 => 0x0663, 0xb4 => 0x0664, 0xb5 => 0x0665, + 0xb6 => 0x0666, 0xb7 => 0x0667, 0xb8 => 0x0668, 0xb9 => 0x0669, 0xba => 0x3a, + 0xbb => 0x061b, 0xbc => 0x3c, 0xbd => 0x3d, 0xbe => 0x3e, 0xbf => 0x061f, + 0xc0 => 0x274a, 0xc1 => 0x0621, 0xc2 => 0x0622, 0xc3 => 0x0623, + 0xc4 => 0x0624, 0xc5 => 0x0625, 0xc6 => 0x0626, 0xc7 => 0x0627, + 0xc8 => 0x0628, 0xc9 => 0x0629, 0xca => 0x062a, 0xcb => 0x062b, + 0xcc => 0x062c, 0xcd => 0x062d, 0xce => 0x062e, 0xcf => 0x062f, + 0xd0 => 0x0630, 0xd1 => 0x0631, 0xd2 => 0x0632, 0xd3 => 0x0633, + 0xd4 => 0x0634, 0xd5 => 0x0635, 0xd6 => 0x0636, 0xd7 => 0x0637, + 0xd8 => 0x0638, 0xd9 => 0x0639, 0xda => 0x063a, 0xdb => 0x5b, 0xdc => 0x5c, + 0xdd => 0x5d, 0xde => 0x5e, 0xdf => 0x5f, 0xe0 => 0x0640, 0xe1 => 0x0641, + 0xe2 => 0x0642, 0xe3 => 0x0643, 0xe4 => 0x0644, 0xe5 => 0x0645, + 0xe6 => 0x0646, 0xe7 => 0x0647, 0xe8 => 0x0648, 0xe9 => 0x0649, + 0xea => 0x064a, 0xeb => 0x064b, 0xec => 0x064c, 0xed => 0x064d, + 0xee => 0x064e, 0xef => 0x064f, 0xf0 => 0x0650, 0xf1 => 0x0651, + 0xf2 => 0x0652, 0xf3 => 0x067e, 0xf4 => 0x0679, 0xf5 => 0x0686, + 0xf6 => 0x06d5, 0xf7 => 0x06a4, 0xf8 => 0x06af, 0xf9 => 0x0688, + 0xfa => 0x0691, 0xfb => 0x7b, 0xfc => 0x7c, 0xfd => 0x7d, 0xfe => 0x0698, + 0xff => 0x06d2, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacChineseCN.pm b/lib/Image/ExifTool/Charset/MacChineseCN.pm new file mode 100644 index 0000000..5c70e0e --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacChineseCN.pm @@ -0,0 +1,2088 @@ +#------------------------------------------------------------------------------ +# File: MacChineseCN.pm +# +# Description: Mac Chinese Simplified to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/CHINSIMP.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacChineseCN = ( + 0x80 => [0xfc,0xf87f], 0x81 => 0xf880, 0x82 => 0xf881, 0xfd => 0xa9, + 0xfe => 0x2122, 0xff => 0x2026, + 0xa1 => { + 0xa1 => 0x3000, 0xa2 => 0x3001, 0xa3 => 0x3002, 0xa4 => 0xb7, + 0xa5 => 0x02c9, 0xa6 => 0x02c7, 0xa7 => 0xa8, 0xa8 => 0x3003, + 0xa9 => 0x3005, 0xaa => 0x2014, 0xab => 0x301c, 0xac => 0x2016, + 0xad => 0x22ef, 0xae => 0x2018, 0xaf => 0x2019, 0xb0 => 0x201c, + 0xb1 => 0x201d, 0xb2 => 0x3014, 0xb3 => 0x3015, 0xb4 => 0x3008, + 0xb5 => 0x3009, 0xb6 => 0x300a, 0xb7 => 0x300b, 0xb8 => 0x300c, + 0xb9 => 0x300d, 0xba => 0x300e, 0xbb => 0x300f, 0xbc => 0x3016, + 0xbd => 0x3017, 0xbe => 0x3010, 0xbf => 0x3011, 0xc0 => 0xb1, 0xc1 => 0xd7, + 0xc2 => 0xf7, 0xc3 => 0x2236, 0xc4 => 0x2227, 0xc5 => 0x2228, + 0xc6 => 0x2211, 0xc7 => 0x220f, 0xc8 => 0x222a, 0xc9 => 0x2229, + 0xca => 0x2208, 0xcb => 0x2237, 0xcc => 0x221a, 0xcd => 0x22a5, + 0xce => 0x2225, 0xcf => 0x2220, 0xd0 => 0x2312, 0xd1 => 0x2299, + 0xd2 => 0x222b, 0xd3 => 0x222e, 0xd4 => 0x2261, 0xd5 => 0x224c, + 0xd6 => 0x2248, 0xd7 => 0x223d, 0xd8 => 0x221d, 0xd9 => 0x2260, + 0xda => 0x226e, 0xdb => 0x226f, 0xdc => 0x2264, 0xdd => 0x2265, + 0xde => 0x221e, 0xdf => 0x2235, 0xe0 => 0x2234, 0xe1 => 0x2642, + 0xe2 => 0x2640, 0xe3 => 0xb0, 0xe4 => 0x2032, 0xe5 => 0x2033, + 0xe6 => 0x2103, 0xe7 => 0xff04, 0xe8 => 0xa4, 0xe9 => 0xa2, 0xea => 0xa3, + 0xeb => 0x2030, 0xec => 0xa7, 0xed => 0x2116, 0xee => 0x2606, + 0xef => 0x2605, 0xf0 => 0x25cb, 0xf1 => 0x25cf, 0xf2 => 0x25ce, + 0xf3 => 0x25c7, 0xf4 => 0x25c6, 0xf5 => 0x25a1, 0xf6 => 0x25a0, + 0xf7 => 0x25b3, 0xf8 => 0x25b2, 0xf9 => 0x203b, 0xfa => 0x2192, + 0xfb => 0x2190, 0xfc => 0x2191, 0xfd => 0x2193, 0xfe => 0x3013, + }, + 0xa2 => { + 0xb1 => 0x2488, 0xb2 => 0x2489, 0xb3 => 0x248a, 0xb4 => 0x248b, + 0xb5 => 0x248c, 0xb6 => 0x248d, 0xb7 => 0x248e, 0xb8 => 0x248f, + 0xb9 => 0x2490, 0xba => 0x2491, 0xbb => 0x2492, 0xbc => 0x2493, + 0xbd => 0x2494, 0xbe => 0x2495, 0xbf => 0x2496, 0xc0 => 0x2497, + 0xc1 => 0x2498, 0xc2 => 0x2499, 0xc3 => 0x249a, 0xc4 => 0x249b, + 0xc5 => 0x2474, 0xc6 => 0x2475, 0xc7 => 0x2476, 0xc8 => 0x2477, + 0xc9 => 0x2478, 0xca => 0x2479, 0xcb => 0x247a, 0xcc => 0x247b, + 0xcd => 0x247c, 0xce => 0x247d, 0xcf => 0x247e, 0xd0 => 0x247f, + 0xd1 => 0x2480, 0xd2 => 0x2481, 0xd3 => 0x2482, 0xd4 => 0x2483, + 0xd5 => 0x2484, 0xd6 => 0x2485, 0xd7 => 0x2486, 0xd8 => 0x2487, + 0xd9 => 0x2460, 0xda => 0x2461, 0xdb => 0x2462, 0xdc => 0x2463, + 0xdd => 0x2464, 0xde => 0x2465, 0xdf => 0x2466, 0xe0 => 0x2467, + 0xe1 => 0x2468, 0xe2 => 0x2469, 0xe5 => 0x3220, 0xe6 => 0x3221, + 0xe7 => 0x3222, 0xe8 => 0x3223, 0xe9 => 0x3224, 0xea => 0x3225, + 0xeb => 0x3226, 0xec => 0x3227, 0xed => 0x3228, 0xee => 0x3229, + 0xf1 => 0x2160, 0xf2 => 0x2161, 0xf3 => 0x2162, 0xf4 => 0x2163, + 0xf5 => 0x2164, 0xf6 => 0x2165, 0xf7 => 0x2166, 0xf8 => 0x2167, + 0xf9 => 0x2168, 0xfa => 0x2169, 0xfb => 0x216a, 0xfc => 0x216b, + }, + 0xa3 => { + 0xa1 => 0xff01, 0xa2 => 0xff02, 0xa3 => 0xff03, 0xa4 => 0xa5, + 0xa5 => 0xff05, 0xa6 => 0xff06, 0xa7 => 0xff07, 0xa8 => 0xff08, + 0xa9 => 0xff09, 0xaa => 0xff0a, 0xab => 0xff0b, 0xac => 0xff0c, + 0xad => 0xff0d, 0xae => 0xff0e, 0xaf => 0xff0f, 0xb0 => 0xff10, + 0xb1 => 0xff11, 0xb2 => 0xff12, 0xb3 => 0xff13, 0xb4 => 0xff14, + 0xb5 => 0xff15, 0xb6 => 0xff16, 0xb7 => 0xff17, 0xb8 => 0xff18, + 0xb9 => 0xff19, 0xba => 0xff1a, 0xbb => 0xff1b, 0xbc => 0xff1c, + 0xbd => 0xff1d, 0xbe => 0xff1e, 0xbf => 0xff1f, 0xc0 => 0xff20, + 0xc1 => 0xff21, 0xc2 => 0xff22, 0xc3 => 0xff23, 0xc4 => 0xff24, + 0xc5 => 0xff25, 0xc6 => 0xff26, 0xc7 => 0xff27, 0xc8 => 0xff28, + 0xc9 => 0xff29, 0xca => 0xff2a, 0xcb => 0xff2b, 0xcc => 0xff2c, + 0xcd => 0xff2d, 0xce => 0xff2e, 0xcf => 0xff2f, 0xd0 => 0xff30, + 0xd1 => 0xff31, 0xd2 => 0xff32, 0xd3 => 0xff33, 0xd4 => 0xff34, + 0xd5 => 0xff35, 0xd6 => 0xff36, 0xd7 => 0xff37, 0xd8 => 0xff38, + 0xd9 => 0xff39, 0xda => 0xff3a, 0xdb => 0xff3b, 0xdc => 0xff3c, + 0xdd => 0xff3d, 0xde => 0xff3e, 0xdf => 0xff3f, 0xe0 => 0xff40, + 0xe1 => 0xff41, 0xe2 => 0xff42, 0xe3 => 0xff43, 0xe4 => 0xff44, + 0xe5 => 0xff45, 0xe6 => 0xff46, 0xe7 => 0xff47, 0xe8 => 0xff48, + 0xe9 => 0xff49, 0xea => 0xff4a, 0xeb => 0xff4b, 0xec => 0xff4c, + 0xed => 0xff4d, 0xee => 0xff4e, 0xef => 0xff4f, 0xf0 => 0xff50, + 0xf1 => 0xff51, 0xf2 => 0xff52, 0xf3 => 0xff53, 0xf4 => 0xff54, + 0xf5 => 0xff55, 0xf6 => 0xff56, 0xf7 => 0xff57, 0xf8 => 0xff58, + 0xf9 => 0xff59, 0xfa => 0xff5a, 0xfb => 0xff5b, 0xfc => 0xff5c, + 0xfd => 0xff5d, 0xfe => 0x203e, + }, + 0xa4 => { + 0xa1 => 0x3041, 0xa2 => 0x3042, 0xa3 => 0x3043, 0xa4 => 0x3044, + 0xa5 => 0x3045, 0xa6 => 0x3046, 0xa7 => 0x3047, 0xa8 => 0x3048, + 0xa9 => 0x3049, 0xaa => 0x304a, 0xab => 0x304b, 0xac => 0x304c, + 0xad => 0x304d, 0xae => 0x304e, 0xaf => 0x304f, 0xb0 => 0x3050, + 0xb1 => 0x3051, 0xb2 => 0x3052, 0xb3 => 0x3053, 0xb4 => 0x3054, + 0xb5 => 0x3055, 0xb6 => 0x3056, 0xb7 => 0x3057, 0xb8 => 0x3058, + 0xb9 => 0x3059, 0xba => 0x305a, 0xbb => 0x305b, 0xbc => 0x305c, + 0xbd => 0x305d, 0xbe => 0x305e, 0xbf => 0x305f, 0xc0 => 0x3060, + 0xc1 => 0x3061, 0xc2 => 0x3062, 0xc3 => 0x3063, 0xc4 => 0x3064, + 0xc5 => 0x3065, 0xc6 => 0x3066, 0xc7 => 0x3067, 0xc8 => 0x3068, + 0xc9 => 0x3069, 0xca => 0x306a, 0xcb => 0x306b, 0xcc => 0x306c, + 0xcd => 0x306d, 0xce => 0x306e, 0xcf => 0x306f, 0xd0 => 0x3070, + 0xd1 => 0x3071, 0xd2 => 0x3072, 0xd3 => 0x3073, 0xd4 => 0x3074, + 0xd5 => 0x3075, 0xd6 => 0x3076, 0xd7 => 0x3077, 0xd8 => 0x3078, + 0xd9 => 0x3079, 0xda => 0x307a, 0xdb => 0x307b, 0xdc => 0x307c, + 0xdd => 0x307d, 0xde => 0x307e, 0xdf => 0x307f, 0xe0 => 0x3080, + 0xe1 => 0x3081, 0xe2 => 0x3082, 0xe3 => 0x3083, 0xe4 => 0x3084, + 0xe5 => 0x3085, 0xe6 => 0x3086, 0xe7 => 0x3087, 0xe8 => 0x3088, + 0xe9 => 0x3089, 0xea => 0x308a, 0xeb => 0x308b, 0xec => 0x308c, + 0xed => 0x308d, 0xee => 0x308e, 0xef => 0x308f, 0xf0 => 0x3090, + 0xf1 => 0x3091, 0xf2 => 0x3092, 0xf3 => 0x3093, + }, + 0xa5 => { + 0xa1 => 0x30a1, 0xa2 => 0x30a2, 0xa3 => 0x30a3, 0xa4 => 0x30a4, + 0xa5 => 0x30a5, 0xa6 => 0x30a6, 0xa7 => 0x30a7, 0xa8 => 0x30a8, + 0xa9 => 0x30a9, 0xaa => 0x30aa, 0xab => 0x30ab, 0xac => 0x30ac, + 0xad => 0x30ad, 0xae => 0x30ae, 0xaf => 0x30af, 0xb0 => 0x30b0, + 0xb1 => 0x30b1, 0xb2 => 0x30b2, 0xb3 => 0x30b3, 0xb4 => 0x30b4, + 0xb5 => 0x30b5, 0xb6 => 0x30b6, 0xb7 => 0x30b7, 0xb8 => 0x30b8, + 0xb9 => 0x30b9, 0xba => 0x30ba, 0xbb => 0x30bb, 0xbc => 0x30bc, + 0xbd => 0x30bd, 0xbe => 0x30be, 0xbf => 0x30bf, 0xc0 => 0x30c0, + 0xc1 => 0x30c1, 0xc2 => 0x30c2, 0xc3 => 0x30c3, 0xc4 => 0x30c4, + 0xc5 => 0x30c5, 0xc6 => 0x30c6, 0xc7 => 0x30c7, 0xc8 => 0x30c8, + 0xc9 => 0x30c9, 0xca => 0x30ca, 0xcb => 0x30cb, 0xcc => 0x30cc, + 0xcd => 0x30cd, 0xce => 0x30ce, 0xcf => 0x30cf, 0xd0 => 0x30d0, + 0xd1 => 0x30d1, 0xd2 => 0x30d2, 0xd3 => 0x30d3, 0xd4 => 0x30d4, + 0xd5 => 0x30d5, 0xd6 => 0x30d6, 0xd7 => 0x30d7, 0xd8 => 0x30d8, + 0xd9 => 0x30d9, 0xda => 0x30da, 0xdb => 0x30db, 0xdc => 0x30dc, + 0xdd => 0x30dd, 0xde => 0x30de, 0xdf => 0x30df, 0xe0 => 0x30e0, + 0xe1 => 0x30e1, 0xe2 => 0x30e2, 0xe3 => 0x30e3, 0xe4 => 0x30e4, + 0xe5 => 0x30e5, 0xe6 => 0x30e6, 0xe7 => 0x30e7, 0xe8 => 0x30e8, + 0xe9 => 0x30e9, 0xea => 0x30ea, 0xeb => 0x30eb, 0xec => 0x30ec, + 0xed => 0x30ed, 0xee => 0x30ee, 0xef => 0x30ef, 0xf0 => 0x30f0, + 0xf1 => 0x30f1, 0xf2 => 0x30f2, 0xf3 => 0x30f3, 0xf4 => 0x30f4, + 0xf5 => 0x30f5, 0xf6 => 0x30f6, + }, + 0xa6 => { + 0xa1 => 0x0391, 0xa2 => 0x0392, 0xa3 => 0x0393, 0xa4 => 0x0394, + 0xa5 => 0x0395, 0xa6 => 0x0396, 0xa7 => 0x0397, 0xa8 => 0x0398, + 0xa9 => 0x0399, 0xaa => 0x039a, 0xab => 0x039b, 0xac => 0x039c, + 0xad => 0x039d, 0xae => 0x039e, 0xaf => 0x039f, 0xb0 => 0x03a0, + 0xb1 => 0x03a1, 0xb2 => 0x03a3, 0xb3 => 0x03a4, 0xb4 => 0x03a5, + 0xb5 => 0x03a6, 0xb6 => 0x03a7, 0xb7 => 0x03a8, 0xb8 => 0x03a9, + 0xc1 => 0x03b1, 0xc2 => 0x03b2, 0xc3 => 0x03b3, 0xc4 => 0x03b4, + 0xc5 => 0x03b5, 0xc6 => 0x03b6, 0xc7 => 0x03b7, 0xc8 => 0x03b8, + 0xc9 => 0x03b9, 0xca => 0x03ba, 0xcb => 0x03bb, 0xcc => 0x03bc, + 0xcd => 0x03bd, 0xce => 0x03be, 0xcf => 0x03bf, 0xd0 => 0x03c0, + 0xd1 => 0x03c1, 0xd2 => 0x03c3, 0xd3 => 0x03c4, 0xd4 => 0x03c5, + 0xd5 => 0x03c6, 0xd6 => 0x03c7, 0xd7 => 0x03c8, 0xd8 => 0x03c9, + 0xd9 => [0xff0c,0xf87e], 0xda => [0x3002,0xf87e], 0xdb => [0x3001,0xf87e], + 0xdc => [0xff1a,0xf87e], 0xdd => [0xff1b,0xf87e], 0xde => [0xff01,0xf87e], + 0xdf => [0xff1f,0xf87e], 0xe0 => 0xfe35, 0xe1 => 0xfe36, 0xe2 => 0xfe39, + 0xe3 => 0xfe3a, 0xe4 => 0xfe3f, 0xe5 => 0xfe40, 0xe6 => 0xfe3d, + 0xe7 => 0xfe3e, 0xe8 => 0xfe41, 0xe9 => 0xfe42, 0xea => 0xfe43, + 0xeb => 0xfe44, 0xec => [0x3016,0xf87e], 0xed => [0x3017,0xf87e], + 0xee => 0xfe3b, 0xef => 0xfe3c, 0xf0 => 0xfe37, 0xf1 => 0xfe38, + 0xf2 => 0xfe31, 0xf3 => [0x22ef,0xf87e], 0xf4 => 0xfe33, 0xf5 => 0xfe34, + }, + 0xa7 => { + 0xa1 => 0x0410, 0xa2 => 0x0411, 0xa3 => 0x0412, 0xa4 => 0x0413, + 0xa5 => 0x0414, 0xa6 => 0x0415, 0xa7 => 0x0401, 0xa8 => 0x0416, + 0xa9 => 0x0417, 0xaa => 0x0418, 0xab => 0x0419, 0xac => 0x041a, + 0xad => 0x041b, 0xae => 0x041c, 0xaf => 0x041d, 0xb0 => 0x041e, + 0xb1 => 0x041f, 0xb2 => 0x0420, 0xb3 => 0x0421, 0xb4 => 0x0422, + 0xb5 => 0x0423, 0xb6 => 0x0424, 0xb7 => 0x0425, 0xb8 => 0x0426, + 0xb9 => 0x0427, 0xba => 0x0428, 0xbb => 0x0429, 0xbc => 0x042a, + 0xbd => 0x042b, 0xbe => 0x042c, 0xbf => 0x042d, 0xc0 => 0x042e, + 0xc1 => 0x042f, 0xd1 => 0x0430, 0xd2 => 0x0431, 0xd3 => 0x0432, + 0xd4 => 0x0433, 0xd5 => 0x0434, 0xd6 => 0x0435, 0xd7 => 0x0451, + 0xd8 => 0x0436, 0xd9 => 0x0437, 0xda => 0x0438, 0xdb => 0x0439, + 0xdc => 0x043a, 0xdd => 0x043b, 0xde => 0x043c, 0xdf => 0x043d, + 0xe0 => 0x043e, 0xe1 => 0x043f, 0xe2 => 0x0440, 0xe3 => 0x0441, + 0xe4 => 0x0442, 0xe5 => 0x0443, 0xe6 => 0x0444, 0xe7 => 0x0445, + 0xe8 => 0x0446, 0xe9 => 0x0447, 0xea => 0x0448, 0xeb => 0x0449, + 0xec => 0x044a, 0xed => 0x044b, 0xee => 0x044c, 0xef => 0x044d, + 0xf0 => 0x044e, 0xf1 => 0x044f, + }, + 0xa8 => { + 0xa1 => 0x0101, 0xa2 => 0xe1, 0xa3 => 0x01ce, 0xa4 => 0xe0, 0xa5 => 0x0113, + 0xa6 => 0xe9, 0xa7 => 0x011b, 0xa8 => 0xe8, 0xa9 => 0x012b, 0xaa => 0xed, + 0xab => 0x01d0, 0xac => 0xec, 0xad => 0x014d, 0xae => 0xf3, 0xaf => 0x01d2, + 0xb0 => 0xf2, 0xb1 => 0x016b, 0xb2 => 0xfa, 0xb3 => 0x01d4, 0xb4 => 0xf9, + 0xb5 => 0x01d6, 0xb6 => 0x01d8, 0xb7 => 0x01da, 0xb8 => 0x01dc, + 0xb9 => 0xfc, 0xba => 0xea, 0xbb => 0x0251, 0xbc => 0x1e3f, 0xbd => 0x0144, + 0xbe => 0x0148, 0xbf => 0x01f9, 0xc0 => 0x0261, 0xc5 => 0x3105, + 0xc6 => 0x3106, 0xc7 => 0x3107, 0xc8 => 0x3108, 0xc9 => 0x3109, + 0xca => 0x310a, 0xcb => 0x310b, 0xcc => 0x310c, 0xcd => 0x310d, + 0xce => 0x310e, 0xcf => 0x310f, 0xd0 => 0x3110, 0xd1 => 0x3111, + 0xd2 => 0x3112, 0xd3 => 0x3113, 0xd4 => 0x3114, 0xd5 => 0x3115, + 0xd6 => 0x3116, 0xd7 => 0x3117, 0xd8 => 0x3118, 0xd9 => 0x3119, + 0xda => 0x311a, 0xdb => 0x311b, 0xdc => 0x311c, 0xdd => 0x311d, + 0xde => 0x311e, 0xdf => 0x311f, 0xe0 => 0x3120, 0xe1 => 0x3121, + 0xe2 => 0x3122, 0xe3 => 0x3123, 0xe4 => 0x3124, 0xe5 => 0x3125, + 0xe6 => 0x3126, 0xe7 => 0x3127, 0xe8 => 0x3128, 0xe9 => 0x3129, + }, + 0xa9 => { + 0xa4 => 0x2500, 0xa5 => 0x2501, 0xa6 => 0x2502, 0xa7 => 0x2503, + 0xa8 => 0x2504, 0xa9 => 0x2505, 0xaa => 0x2506, 0xab => 0x2507, + 0xac => 0x2508, 0xad => 0x2509, 0xae => 0x250a, 0xaf => 0x250b, + 0xb0 => 0x250c, 0xb1 => 0x250d, 0xb2 => 0x250e, 0xb3 => 0x250f, + 0xb4 => 0x2510, 0xb5 => 0x2511, 0xb6 => 0x2512, 0xb7 => 0x2513, + 0xb8 => 0x2514, 0xb9 => 0x2515, 0xba => 0x2516, 0xbb => 0x2517, + 0xbc => 0x2518, 0xbd => 0x2519, 0xbe => 0x251a, 0xbf => 0x251b, + 0xc0 => 0x251c, 0xc1 => 0x251d, 0xc2 => 0x251e, 0xc3 => 0x251f, + 0xc4 => 0x2520, 0xc5 => 0x2521, 0xc6 => 0x2522, 0xc7 => 0x2523, + 0xc8 => 0x2524, 0xc9 => 0x2525, 0xca => 0x2526, 0xcb => 0x2527, + 0xcc => 0x2528, 0xcd => 0x2529, 0xce => 0x252a, 0xcf => 0x252b, + 0xd0 => 0x252c, 0xd1 => 0x252d, 0xd2 => 0x252e, 0xd3 => 0x252f, + 0xd4 => 0x2530, 0xd5 => 0x2531, 0xd6 => 0x2532, 0xd7 => 0x2533, + 0xd8 => 0x2534, 0xd9 => 0x2535, 0xda => 0x2536, 0xdb => 0x2537, + 0xdc => 0x2538, 0xdd => 0x2539, 0xde => 0x253a, 0xdf => 0x253b, + 0xe0 => 0x253c, 0xe1 => 0x253d, 0xe2 => 0x253e, 0xe3 => 0x253f, + 0xe4 => 0x2540, 0xe5 => 0x2541, 0xe6 => 0x2542, 0xe7 => 0x2543, + 0xe8 => 0x2544, 0xe9 => 0x2545, 0xea => 0x2546, 0xeb => 0x2547, + 0xec => 0x2548, 0xed => 0x2549, 0xee => 0x254a, 0xef => 0x254b, + }, + 0xb0 => { + 0xa1 => 0x554a, 0xa2 => 0x963f, 0xa3 => 0x57c3, 0xa4 => 0x6328, + 0xa5 => 0x54ce, 0xa6 => 0x5509, 0xa7 => 0x54c0, 0xa8 => 0x7691, + 0xa9 => 0x764c, 0xaa => 0x853c, 0xab => 0x77ee, 0xac => 0x827e, + 0xad => 0x788d, 0xae => 0x7231, 0xaf => 0x9698, 0xb0 => 0x978d, + 0xb1 => 0x6c28, 0xb2 => 0x5b89, 0xb3 => 0x4ffa, 0xb4 => 0x6309, + 0xb5 => 0x6697, 0xb6 => 0x5cb8, 0xb7 => 0x80fa, 0xb8 => 0x6848, + 0xb9 => 0x80ae, 0xba => 0x6602, 0xbb => 0x76ce, 0xbc => 0x51f9, + 0xbd => 0x6556, 0xbe => 0x71ac, 0xbf => 0x7ff1, 0xc0 => 0x8884, + 0xc1 => 0x50b2, 0xc2 => 0x5965, 0xc3 => 0x61ca, 0xc4 => 0x6fb3, + 0xc5 => 0x82ad, 0xc6 => 0x634c, 0xc7 => 0x6252, 0xc8 => 0x53ed, + 0xc9 => 0x5427, 0xca => 0x7b06, 0xcb => 0x516b, 0xcc => 0x75a4, + 0xcd => 0x5df4, 0xce => 0x62d4, 0xcf => 0x8dcb, 0xd0 => 0x9776, + 0xd1 => 0x628a, 0xd2 => 0x8019, 0xd3 => 0x575d, 0xd4 => 0x9738, + 0xd5 => 0x7f62, 0xd6 => 0x7238, 0xd7 => 0x767d, 0xd8 => 0x67cf, + 0xd9 => 0x767e, 0xda => 0x6446, 0xdb => 0x4f70, 0xdc => 0x8d25, + 0xdd => 0x62dc, 0xde => 0x7a17, 0xdf => 0x6591, 0xe0 => 0x73ed, + 0xe1 => 0x642c, 0xe2 => 0x6273, 0xe3 => 0x822c, 0xe4 => 0x9881, + 0xe5 => 0x677f, 0xe6 => 0x7248, 0xe7 => 0x626e, 0xe8 => 0x62cc, + 0xe9 => 0x4f34, 0xea => 0x74e3, 0xeb => 0x534a, 0xec => 0x529e, + 0xed => 0x7eca, 0xee => 0x90a6, 0xef => 0x5e2e, 0xf0 => 0x6886, + 0xf1 => 0x699c, 0xf2 => 0x8180, 0xf3 => 0x7ed1, 0xf4 => 0x68d2, + 0xf5 => 0x78c5, 0xf6 => 0x868c, 0xf7 => 0x9551, 0xf8 => 0x508d, + 0xf9 => 0x8c24, 0xfa => 0x82de, 0xfb => 0x80de, 0xfc => 0x5305, + 0xfd => 0x8912, 0xfe => 0x5265, + }, + 0xb1 => { + 0xa1 => 0x8584, 0xa2 => 0x96f9, 0xa3 => 0x4fdd, 0xa4 => 0x5821, + 0xa5 => 0x9971, 0xa6 => 0x5b9d, 0xa7 => 0x62b1, 0xa8 => 0x62a5, + 0xa9 => 0x66b4, 0xaa => 0x8c79, 0xab => 0x9c8d, 0xac => 0x7206, + 0xad => 0x676f, 0xae => 0x7891, 0xaf => 0x60b2, 0xb0 => 0x5351, + 0xb1 => 0x5317, 0xb2 => 0x8f88, 0xb3 => 0x80cc, 0xb4 => 0x8d1d, + 0xb5 => 0x94a1, 0xb6 => 0x500d, 0xb7 => 0x72c8, 0xb8 => 0x5907, + 0xb9 => 0x60eb, 0xba => 0x7119, 0xbb => 0x88ab, 0xbc => 0x5954, + 0xbd => 0x82ef, 0xbe => 0x672c, 0xbf => 0x7b28, 0xc0 => 0x5d29, + 0xc1 => 0x7ef7, 0xc2 => 0x752d, 0xc3 => 0x6cf5, 0xc4 => 0x8e66, + 0xc5 => 0x8ff8, 0xc6 => 0x903c, 0xc7 => 0x9f3b, 0xc8 => 0x6bd4, + 0xc9 => 0x9119, 0xca => 0x7b14, 0xcb => 0x5f7c, 0xcc => 0x78a7, + 0xcd => 0x84d6, 0xce => 0x853d, 0xcf => 0x6bd5, 0xd0 => 0x6bd9, + 0xd1 => 0x6bd6, 0xd2 => 0x5e01, 0xd3 => 0x5e87, 0xd4 => 0x75f9, + 0xd5 => 0x95ed, 0xd6 => 0x655d, 0xd7 => 0x5f0a, 0xd8 => 0x5fc5, + 0xd9 => 0x8f9f, 0xda => 0x58c1, 0xdb => 0x81c2, 0xdc => 0x907f, + 0xdd => 0x965b, 0xde => 0x97ad, 0xdf => 0x8fb9, 0xe0 => 0x7f16, + 0xe1 => 0x8d2c, 0xe2 => 0x6241, 0xe3 => 0x4fbf, 0xe4 => 0x53d8, + 0xe5 => 0x535e, 0xe6 => 0x8fa8, 0xe7 => 0x8fa9, 0xe8 => 0x8fab, + 0xe9 => 0x904d, 0xea => 0x6807, 0xeb => 0x5f6a, 0xec => 0x8198, + 0xed => 0x8868, 0xee => 0x9cd6, 0xef => 0x618b, 0xf0 => 0x522b, + 0xf1 => 0x762a, 0xf2 => 0x5f6c, 0xf3 => 0x658c, 0xf4 => 0x6fd2, + 0xf5 => 0x6ee8, 0xf6 => 0x5bbe, 0xf7 => 0x6448, 0xf8 => 0x5175, + 0xf9 => 0x51b0, 0xfa => 0x67c4, 0xfb => 0x4e19, 0xfc => 0x79c9, + 0xfd => 0x997c, 0xfe => 0x70b3, + }, + 0xb2 => { + 0xa1 => 0x75c5, 0xa2 => 0x5e76, 0xa3 => 0x73bb, 0xa4 => 0x83e0, + 0xa5 => 0x64ad, 0xa6 => 0x62e8, 0xa7 => 0x94b5, 0xa8 => 0x6ce2, + 0xa9 => 0x535a, 0xaa => 0x52c3, 0xab => 0x640f, 0xac => 0x94c2, + 0xad => 0x7b94, 0xae => 0x4f2f, 0xaf => 0x5e1b, 0xb0 => 0x8236, + 0xb1 => 0x8116, 0xb2 => 0x818a, 0xb3 => 0x6e24, 0xb4 => 0x6cca, + 0xb5 => 0x9a73, 0xb6 => 0x6355, 0xb7 => 0x535c, 0xb8 => 0x54fa, + 0xb9 => 0x8865, 0xba => 0x57e0, 0xbb => 0x4e0d, 0xbc => 0x5e03, + 0xbd => 0x6b65, 0xbe => 0x7c3f, 0xbf => 0x90e8, 0xc0 => 0x6016, + 0xc1 => 0x64e6, 0xc2 => 0x731c, 0xc3 => 0x88c1, 0xc4 => 0x6750, + 0xc5 => 0x624d, 0xc6 => 0x8d22, 0xc7 => 0x776c, 0xc8 => 0x8e29, + 0xc9 => 0x91c7, 0xca => 0x5f69, 0xcb => 0x83dc, 0xcc => 0x8521, + 0xcd => 0x9910, 0xce => 0x53c2, 0xcf => 0x8695, 0xd0 => 0x6b8b, + 0xd1 => 0x60ed, 0xd2 => 0x60e8, 0xd3 => 0x707f, 0xd4 => 0x82cd, + 0xd5 => 0x8231, 0xd6 => 0x4ed3, 0xd7 => 0x6ca7, 0xd8 => 0x85cf, + 0xd9 => 0x64cd, 0xda => 0x7cd9, 0xdb => 0x69fd, 0xdc => 0x66f9, + 0xdd => 0x8349, 0xde => 0x5395, 0xdf => 0x7b56, 0xe0 => 0x4fa7, + 0xe1 => 0x518c, 0xe2 => 0x6d4b, 0xe3 => 0x5c42, 0xe4 => 0x8e6d, + 0xe5 => 0x63d2, 0xe6 => 0x53c9, 0xe7 => 0x832c, 0xe8 => 0x8336, + 0xe9 => 0x67e5, 0xea => 0x78b4, 0xeb => 0x643d, 0xec => 0x5bdf, + 0xed => 0x5c94, 0xee => 0x5dee, 0xef => 0x8be7, 0xf0 => 0x62c6, + 0xf1 => 0x67f4, 0xf2 => 0x8c7a, 0xf3 => 0x6400, 0xf4 => 0x63ba, + 0xf5 => 0x8749, 0xf6 => 0x998b, 0xf7 => 0x8c17, 0xf8 => 0x7f20, + 0xf9 => 0x94f2, 0xfa => 0x4ea7, 0xfb => 0x9610, 0xfc => 0x98a4, + 0xfd => 0x660c, 0xfe => 0x7316, + }, + 0xb3 => { + 0xa1 => 0x573a, 0xa2 => 0x5c1d, 0xa3 => 0x5e38, 0xa4 => 0x957f, + 0xa5 => 0x507f, 0xa6 => 0x80a0, 0xa7 => 0x5382, 0xa8 => 0x655e, + 0xa9 => 0x7545, 0xaa => 0x5531, 0xab => 0x5021, 0xac => 0x8d85, + 0xad => 0x6284, 0xae => 0x949e, 0xaf => 0x671d, 0xb0 => 0x5632, + 0xb1 => 0x6f6e, 0xb2 => 0x5de2, 0xb3 => 0x5435, 0xb4 => 0x7092, + 0xb5 => 0x8f66, 0xb6 => 0x626f, 0xb7 => 0x64a4, 0xb8 => 0x63a3, + 0xb9 => 0x5f7b, 0xba => 0x6f88, 0xbb => 0x90f4, 0xbc => 0x81e3, + 0xbd => 0x8fb0, 0xbe => 0x5c18, 0xbf => 0x6668, 0xc0 => 0x5ff1, + 0xc1 => 0x6c89, 0xc2 => 0x9648, 0xc3 => 0x8d81, 0xc4 => 0x886c, + 0xc5 => 0x6491, 0xc6 => 0x79f0, 0xc7 => 0x57ce, 0xc8 => 0x6a59, + 0xc9 => 0x6210, 0xca => 0x5448, 0xcb => 0x4e58, 0xcc => 0x7a0b, + 0xcd => 0x60e9, 0xce => 0x6f84, 0xcf => 0x8bda, 0xd0 => 0x627f, + 0xd1 => 0x901e, 0xd2 => 0x9a8b, 0xd3 => 0x79e4, 0xd4 => 0x5403, + 0xd5 => 0x75f4, 0xd6 => 0x6301, 0xd7 => 0x5319, 0xd8 => 0x6c60, + 0xd9 => 0x8fdf, 0xda => 0x5f1b, 0xdb => 0x9a70, 0xdc => 0x803b, + 0xdd => 0x9f7f, 0xde => 0x4f88, 0xdf => 0x5c3a, 0xe0 => 0x8d64, + 0xe1 => 0x7fc5, 0xe2 => 0x65a5, 0xe3 => 0x70bd, 0xe4 => 0x5145, + 0xe5 => 0x51b2, 0xe6 => 0x866b, 0xe7 => 0x5d07, 0xe8 => 0x5ba0, + 0xe9 => 0x62bd, 0xea => 0x916c, 0xeb => 0x7574, 0xec => 0x8e0c, + 0xed => 0x7a20, 0xee => 0x6101, 0xef => 0x7b79, 0xf0 => 0x4ec7, + 0xf1 => 0x7ef8, 0xf2 => 0x7785, 0xf3 => 0x4e11, 0xf4 => 0x81ed, + 0xf5 => 0x521d, 0xf6 => 0x51fa, 0xf7 => 0x6a71, 0xf8 => 0x53a8, + 0xf9 => 0x8e87, 0xfa => 0x9504, 0xfb => 0x96cf, 0xfc => 0x6ec1, + 0xfd => 0x9664, 0xfe => 0x695a, + }, + 0xb4 => { + 0xa1 => 0x7840, 0xa2 => 0x50a8, 0xa3 => 0x77d7, 0xa4 => 0x6410, + 0xa5 => 0x89e6, 0xa6 => 0x5904, 0xa7 => 0x63e3, 0xa8 => 0x5ddd, + 0xa9 => 0x7a7f, 0xaa => 0x693d, 0xab => 0x4f20, 0xac => 0x8239, + 0xad => 0x5598, 0xae => 0x4e32, 0xaf => 0x75ae, 0xb0 => 0x7a97, + 0xb1 => 0x5e62, 0xb2 => 0x5e8a, 0xb3 => 0x95ef, 0xb4 => 0x521b, + 0xb5 => 0x5439, 0xb6 => 0x708a, 0xb7 => 0x6376, 0xb8 => 0x9524, + 0xb9 => 0x5782, 0xba => 0x6625, 0xbb => 0x693f, 0xbc => 0x9187, + 0xbd => 0x5507, 0xbe => 0x6df3, 0xbf => 0x7eaf, 0xc0 => 0x8822, + 0xc1 => 0x6233, 0xc2 => 0x7ef0, 0xc3 => 0x75b5, 0xc4 => 0x8328, + 0xc5 => 0x78c1, 0xc6 => 0x96cc, 0xc7 => 0x8f9e, 0xc8 => 0x6148, + 0xc9 => 0x74f7, 0xca => 0x8bcd, 0xcb => 0x6b64, 0xcc => 0x523a, + 0xcd => 0x8d50, 0xce => 0x6b21, 0xcf => 0x806a, 0xd0 => 0x8471, + 0xd1 => 0x56f1, 0xd2 => 0x5306, 0xd3 => 0x4ece, 0xd4 => 0x4e1b, + 0xd5 => 0x51d1, 0xd6 => 0x7c97, 0xd7 => 0x918b, 0xd8 => 0x7c07, + 0xd9 => 0x4fc3, 0xda => 0x8e7f, 0xdb => 0x7be1, 0xdc => 0x7a9c, + 0xdd => 0x6467, 0xde => 0x5d14, 0xdf => 0x50ac, 0xe0 => 0x8106, + 0xe1 => 0x7601, 0xe2 => 0x7cb9, 0xe3 => 0x6dec, 0xe4 => 0x7fe0, + 0xe5 => 0x6751, 0xe6 => 0x5b58, 0xe7 => 0x5bf8, 0xe8 => 0x78cb, + 0xe9 => 0x64ae, 0xea => 0x6413, 0xeb => 0x63aa, 0xec => 0x632b, + 0xed => 0x9519, 0xee => 0x642d, 0xef => 0x8fbe, 0xf0 => 0x7b54, + 0xf1 => 0x7629, 0xf2 => 0x6253, 0xf3 => 0x5927, 0xf4 => 0x5446, + 0xf5 => 0x6b79, 0xf6 => 0x50a3, 0xf7 => 0x6234, 0xf8 => 0x5e26, + 0xf9 => 0x6b86, 0xfa => 0x4ee3, 0xfb => 0x8d37, 0xfc => 0x888b, + 0xfd => 0x5f85, 0xfe => 0x902e, + }, + 0xb5 => { + 0xa1 => 0x6020, 0xa2 => 0x803d, 0xa3 => 0x62c5, 0xa4 => 0x4e39, + 0xa5 => 0x5355, 0xa6 => 0x90f8, 0xa7 => 0x63b8, 0xa8 => 0x80c6, + 0xa9 => 0x65e6, 0xaa => 0x6c2e, 0xab => 0x4f46, 0xac => 0x60ee, + 0xad => 0x6de1, 0xae => 0x8bde, 0xaf => 0x5f39, 0xb0 => 0x86cb, + 0xb1 => 0x5f53, 0xb2 => 0x6321, 0xb3 => 0x515a, 0xb4 => 0x8361, + 0xb5 => 0x6863, 0xb6 => 0x5200, 0xb7 => 0x6363, 0xb8 => 0x8e48, + 0xb9 => 0x5012, 0xba => 0x5c9b, 0xbb => 0x7977, 0xbc => 0x5bfc, + 0xbd => 0x5230, 0xbe => 0x7a3b, 0xbf => 0x60bc, 0xc0 => 0x9053, + 0xc1 => 0x76d7, 0xc2 => 0x5fb7, 0xc3 => 0x5f97, 0xc4 => 0x7684, + 0xc5 => 0x8e6c, 0xc6 => 0x706f, 0xc7 => 0x767b, 0xc8 => 0x7b49, + 0xc9 => 0x77aa, 0xca => 0x51f3, 0xcb => 0x9093, 0xcc => 0x5824, + 0xcd => 0x4f4e, 0xce => 0x6ef4, 0xcf => 0x8fea, 0xd0 => 0x654c, + 0xd1 => 0x7b1b, 0xd2 => 0x72c4, 0xd3 => 0x6da4, 0xd4 => 0x7fdf, + 0xd5 => 0x5ae1, 0xd6 => 0x62b5, 0xd7 => 0x5e95, 0xd8 => 0x5730, + 0xd9 => 0x8482, 0xda => 0x7b2c, 0xdb => 0x5e1d, 0xdc => 0x5f1f, + 0xdd => 0x9012, 0xde => 0x7f14, 0xdf => 0x98a0, 0xe0 => 0x6382, + 0xe1 => 0x6ec7, 0xe2 => 0x7898, 0xe3 => 0x70b9, 0xe4 => 0x5178, + 0xe5 => 0x975b, 0xe6 => 0x57ab, 0xe7 => 0x7535, 0xe8 => 0x4f43, + 0xe9 => 0x7538, 0xea => 0x5e97, 0xeb => 0x60e6, 0xec => 0x5960, + 0xed => 0x6dc0, 0xee => 0x6bbf, 0xef => 0x7889, 0xf0 => 0x53fc, + 0xf1 => 0x96d5, 0xf2 => 0x51cb, 0xf3 => 0x5201, 0xf4 => 0x6389, + 0xf5 => 0x540a, 0xf6 => 0x9493, 0xf7 => 0x8c03, 0xf8 => 0x8dcc, + 0xf9 => 0x7239, 0xfa => 0x789f, 0xfb => 0x8776, 0xfc => 0x8fed, + 0xfd => 0x8c0d, 0xfe => 0x53e0, + }, + 0xb6 => { + 0xa1 => 0x4e01, 0xa2 => 0x76ef, 0xa3 => 0x53ee, 0xa4 => 0x9489, + 0xa5 => 0x9876, 0xa6 => 0x9f0e, 0xa7 => 0x952d, 0xa8 => 0x5b9a, + 0xa9 => 0x8ba2, 0xaa => 0x4e22, 0xab => 0x4e1c, 0xac => 0x51ac, + 0xad => 0x8463, 0xae => 0x61c2, 0xaf => 0x52a8, 0xb0 => 0x680b, + 0xb1 => 0x4f97, 0xb2 => 0x606b, 0xb3 => 0x51bb, 0xb4 => 0x6d1e, + 0xb5 => 0x515c, 0xb6 => 0x6296, 0xb7 => 0x6597, 0xb8 => 0x9661, + 0xb9 => 0x8c46, 0xba => 0x9017, 0xbb => 0x75d8, 0xbc => 0x90fd, + 0xbd => 0x7763, 0xbe => 0x6bd2, 0xbf => 0x728a, 0xc0 => 0x72ec, + 0xc1 => 0x8bfb, 0xc2 => 0x5835, 0xc3 => 0x7779, 0xc4 => 0x8d4c, + 0xc5 => 0x675c, 0xc6 => 0x9540, 0xc7 => 0x809a, 0xc8 => 0x5ea6, + 0xc9 => 0x6e21, 0xca => 0x5992, 0xcb => 0x7aef, 0xcc => 0x77ed, + 0xcd => 0x953b, 0xce => 0x6bb5, 0xcf => 0x65ad, 0xd0 => 0x7f0e, + 0xd1 => 0x5806, 0xd2 => 0x5151, 0xd3 => 0x961f, 0xd4 => 0x5bf9, + 0xd5 => 0x58a9, 0xd6 => 0x5428, 0xd7 => 0x8e72, 0xd8 => 0x6566, + 0xd9 => 0x987f, 0xda => 0x56e4, 0xdb => 0x949d, 0xdc => 0x76fe, + 0xdd => 0x9041, 0xde => 0x6387, 0xdf => 0x54c6, 0xe0 => 0x591a, + 0xe1 => 0x593a, 0xe2 => 0x579b, 0xe3 => 0x8eb2, 0xe4 => 0x6735, + 0xe5 => 0x8dfa, 0xe6 => 0x8235, 0xe7 => 0x5241, 0xe8 => 0x60f0, + 0xe9 => 0x5815, 0xea => 0x86fe, 0xeb => 0x5ce8, 0xec => 0x9e45, + 0xed => 0x4fc4, 0xee => 0x989d, 0xef => 0x8bb9, 0xf0 => 0x5a25, + 0xf1 => 0x6076, 0xf2 => 0x5384, 0xf3 => 0x627c, 0xf4 => 0x904f, + 0xf5 => 0x9102, 0xf6 => 0x997f, 0xf7 => 0x6069, 0xf8 => 0x800c, + 0xf9 => 0x513f, 0xfa => 0x8033, 0xfb => 0x5c14, 0xfc => 0x9975, + 0xfd => 0x6d31, 0xfe => 0x4e8c, + }, + 0xb7 => { + 0xa1 => 0x8d30, 0xa2 => 0x53d1, 0xa3 => 0x7f5a, 0xa4 => 0x7b4f, + 0xa5 => 0x4f10, 0xa6 => 0x4e4f, 0xa7 => 0x9600, 0xa8 => 0x6cd5, + 0xa9 => 0x73d0, 0xaa => 0x85e9, 0xab => 0x5e06, 0xac => 0x756a, + 0xad => 0x7ffb, 0xae => 0x6a0a, 0xaf => 0x77fe, 0xb0 => 0x9492, + 0xb1 => 0x7e41, 0xb2 => 0x51e1, 0xb3 => 0x70e6, 0xb4 => 0x53cd, + 0xb5 => 0x8fd4, 0xb6 => 0x8303, 0xb7 => 0x8d29, 0xb8 => 0x72af, + 0xb9 => 0x996d, 0xba => 0x6cdb, 0xbb => 0x574a, 0xbc => 0x82b3, + 0xbd => 0x65b9, 0xbe => 0x80aa, 0xbf => 0x623f, 0xc0 => 0x9632, + 0xc1 => 0x59a8, 0xc2 => 0x4eff, 0xc3 => 0x8bbf, 0xc4 => 0x7eba, + 0xc5 => 0x653e, 0xc6 => 0x83f2, 0xc7 => 0x975e, 0xc8 => 0x5561, + 0xc9 => 0x98de, 0xca => 0x80a5, 0xcb => 0x532a, 0xcc => 0x8bfd, + 0xcd => 0x5420, 0xce => 0x80ba, 0xcf => 0x5e9f, 0xd0 => 0x6cb8, + 0xd1 => 0x8d39, 0xd2 => 0x82ac, 0xd3 => 0x915a, 0xd4 => 0x5429, + 0xd5 => 0x6c1b, 0xd6 => 0x5206, 0xd7 => 0x7eb7, 0xd8 => 0x575f, + 0xd9 => 0x711a, 0xda => 0x6c7e, 0xdb => 0x7c89, 0xdc => 0x594b, + 0xdd => 0x4efd, 0xde => 0x5fff, 0xdf => 0x6124, 0xe0 => 0x7caa, + 0xe1 => 0x4e30, 0xe2 => 0x5c01, 0xe3 => 0x67ab, 0xe4 => 0x8702, + 0xe5 => 0x5cf0, 0xe6 => 0x950b, 0xe7 => 0x98ce, 0xe8 => 0x75af, + 0xe9 => 0x70fd, 0xea => 0x9022, 0xeb => 0x51af, 0xec => 0x7f1d, + 0xed => 0x8bbd, 0xee => 0x5949, 0xef => 0x51e4, 0xf0 => 0x4f5b, + 0xf1 => 0x5426, 0xf2 => 0x592b, 0xf3 => 0x6577, 0xf4 => 0x80a4, + 0xf5 => 0x5b75, 0xf6 => 0x6276, 0xf7 => 0x62c2, 0xf8 => 0x8f90, + 0xf9 => 0x5e45, 0xfa => 0x6c1f, 0xfb => 0x7b26, 0xfc => 0x4f0f, + 0xfd => 0x4fd8, 0xfe => 0x670d, + }, + 0xb8 => { + 0xa1 => 0x6d6e, 0xa2 => 0x6daa, 0xa3 => 0x798f, 0xa4 => 0x88b1, + 0xa5 => 0x5f17, 0xa6 => 0x752b, 0xa7 => 0x629a, 0xa8 => 0x8f85, + 0xa9 => 0x4fef, 0xaa => 0x91dc, 0xab => 0x65a7, 0xac => 0x812f, + 0xad => 0x8151, 0xae => 0x5e9c, 0xaf => 0x8150, 0xb0 => 0x8d74, + 0xb1 => 0x526f, 0xb2 => 0x8986, 0xb3 => 0x8d4b, 0xb4 => 0x590d, + 0xb5 => 0x5085, 0xb6 => 0x4ed8, 0xb7 => 0x961c, 0xb8 => 0x7236, + 0xb9 => 0x8179, 0xba => 0x8d1f, 0xbb => 0x5bcc, 0xbc => 0x8ba3, + 0xbd => 0x9644, 0xbe => 0x5987, 0xbf => 0x7f1a, 0xc0 => 0x5490, + 0xc1 => 0x5676, 0xc2 => 0x560e, 0xc3 => 0x8be5, 0xc4 => 0x6539, + 0xc5 => 0x6982, 0xc6 => 0x9499, 0xc7 => 0x76d6, 0xc8 => 0x6e89, + 0xc9 => 0x5e72, 0xca => 0x7518, 0xcb => 0x6746, 0xcc => 0x67d1, + 0xcd => 0x7aff, 0xce => 0x809d, 0xcf => 0x8d76, 0xd0 => 0x611f, + 0xd1 => 0x79c6, 0xd2 => 0x6562, 0xd3 => 0x8d63, 0xd4 => 0x5188, + 0xd5 => 0x521a, 0xd6 => 0x94a2, 0xd7 => 0x7f38, 0xd8 => 0x809b, + 0xd9 => 0x7eb2, 0xda => 0x5c97, 0xdb => 0x6e2f, 0xdc => 0x6760, + 0xdd => 0x7bd9, 0xde => 0x768b, 0xdf => 0x9ad8, 0xe0 => 0x818f, + 0xe1 => 0x7f94, 0xe2 => 0x7cd5, 0xe3 => 0x641e, 0xe4 => 0x9550, + 0xe5 => 0x7a3f, 0xe6 => 0x544a, 0xe7 => 0x54e5, 0xe8 => 0x6b4c, + 0xe9 => 0x6401, 0xea => 0x6208, 0xeb => 0x9e3d, 0xec => 0x80f3, + 0xed => 0x7599, 0xee => 0x5272, 0xef => 0x9769, 0xf0 => 0x845b, + 0xf1 => 0x683c, 0xf2 => 0x86e4, 0xf3 => 0x9601, 0xf4 => 0x9694, + 0xf5 => 0x94ec, 0xf6 => 0x4e2a, 0xf7 => 0x5404, 0xf8 => 0x7ed9, + 0xf9 => 0x6839, 0xfa => 0x8ddf, 0xfb => 0x8015, 0xfc => 0x66f4, + 0xfd => 0x5e9a, 0xfe => 0x7fb9, + }, + 0xb9 => { + 0xa1 => 0x57c2, 0xa2 => 0x803f, 0xa3 => 0x6897, 0xa4 => 0x5de5, + 0xa5 => 0x653b, 0xa6 => 0x529f, 0xa7 => 0x606d, 0xa8 => 0x9f9a, + 0xa9 => 0x4f9b, 0xaa => 0x8eac, 0xab => 0x516c, 0xac => 0x5bab, + 0xad => 0x5f13, 0xae => 0x5de9, 0xaf => 0x6c5e, 0xb0 => 0x62f1, + 0xb1 => 0x8d21, 0xb2 => 0x5171, 0xb3 => 0x94a9, 0xb4 => 0x52fe, + 0xb5 => 0x6c9f, 0xb6 => 0x82df, 0xb7 => 0x72d7, 0xb8 => 0x57a2, + 0xb9 => 0x6784, 0xba => 0x8d2d, 0xbb => 0x591f, 0xbc => 0x8f9c, + 0xbd => 0x83c7, 0xbe => 0x5495, 0xbf => 0x7b8d, 0xc0 => 0x4f30, + 0xc1 => 0x6cbd, 0xc2 => 0x5b64, 0xc3 => 0x59d1, 0xc4 => 0x9f13, + 0xc5 => 0x53e4, 0xc6 => 0x86ca, 0xc7 => 0x9aa8, 0xc8 => 0x8c37, + 0xc9 => 0x80a1, 0xca => 0x6545, 0xcb => 0x987e, 0xcc => 0x56fa, + 0xcd => 0x96c7, 0xce => 0x522e, 0xcf => 0x74dc, 0xd0 => 0x5250, + 0xd1 => 0x5be1, 0xd2 => 0x6302, 0xd3 => 0x8902, 0xd4 => 0x4e56, + 0xd5 => 0x62d0, 0xd6 => 0x602a, 0xd7 => 0x68fa, 0xd8 => 0x5173, + 0xd9 => 0x5b98, 0xda => 0x51a0, 0xdb => 0x89c2, 0xdc => 0x7ba1, + 0xdd => 0x9986, 0xde => 0x7f50, 0xdf => 0x60ef, 0xe0 => 0x704c, + 0xe1 => 0x8d2f, 0xe2 => 0x5149, 0xe3 => 0x5e7f, 0xe4 => 0x901b, + 0xe5 => 0x7470, 0xe6 => 0x89c4, 0xe7 => 0x572d, 0xe8 => 0x7845, + 0xe9 => 0x5f52, 0xea => 0x9f9f, 0xeb => 0x95fa, 0xec => 0x8f68, + 0xed => 0x9b3c, 0xee => 0x8be1, 0xef => 0x7678, 0xf0 => 0x6842, + 0xf1 => 0x67dc, 0xf2 => 0x8dea, 0xf3 => 0x8d35, 0xf4 => 0x523d, + 0xf5 => 0x8f8a, 0xf6 => 0x6eda, 0xf7 => 0x68cd, 0xf8 => 0x9505, + 0xf9 => 0x90ed, 0xfa => 0x56fd, 0xfb => 0x679c, 0xfc => 0x88f9, + 0xfd => 0x8fc7, 0xfe => 0x54c8, + }, + 0xba => { + 0xa1 => 0x9ab8, 0xa2 => 0x5b69, 0xa3 => 0x6d77, 0xa4 => 0x6c26, + 0xa5 => 0x4ea5, 0xa6 => 0x5bb3, 0xa7 => 0x9a87, 0xa8 => 0x9163, + 0xa9 => 0x61a8, 0xaa => 0x90af, 0xab => 0x97e9, 0xac => 0x542b, + 0xad => 0x6db5, 0xae => 0x5bd2, 0xaf => 0x51fd, 0xb0 => 0x558a, + 0xb1 => 0x7f55, 0xb2 => 0x7ff0, 0xb3 => 0x64bc, 0xb4 => 0x634d, + 0xb5 => 0x65f1, 0xb6 => 0x61be, 0xb7 => 0x608d, 0xb8 => 0x710a, + 0xb9 => 0x6c57, 0xba => 0x6c49, 0xbb => 0x592f, 0xbc => 0x676d, + 0xbd => 0x822a, 0xbe => 0x58d5, 0xbf => 0x568e, 0xc0 => 0x8c6a, + 0xc1 => 0x6beb, 0xc2 => 0x90dd, 0xc3 => 0x597d, 0xc4 => 0x8017, + 0xc5 => 0x53f7, 0xc6 => 0x6d69, 0xc7 => 0x5475, 0xc8 => 0x559d, + 0xc9 => 0x8377, 0xca => 0x83cf, 0xcb => 0x6838, 0xcc => 0x79be, + 0xcd => 0x548c, 0xce => 0x4f55, 0xcf => 0x5408, 0xd0 => 0x76d2, + 0xd1 => 0x8c89, 0xd2 => 0x9602, 0xd3 => 0x6cb3, 0xd4 => 0x6db8, + 0xd5 => 0x8d6b, 0xd6 => 0x8910, 0xd7 => 0x9e64, 0xd8 => 0x8d3a, + 0xd9 => 0x563f, 0xda => 0x9ed1, 0xdb => 0x75d5, 0xdc => 0x5f88, + 0xdd => 0x72e0, 0xde => 0x6068, 0xdf => 0x54fc, 0xe0 => 0x4ea8, + 0xe1 => 0x6a2a, 0xe2 => 0x8861, 0xe3 => 0x6052, 0xe4 => 0x8f70, + 0xe5 => 0x54c4, 0xe6 => 0x70d8, 0xe7 => 0x8679, 0xe8 => 0x9e3f, + 0xe9 => 0x6d2a, 0xea => 0x5b8f, 0xeb => 0x5f18, 0xec => 0x7ea2, + 0xed => 0x5589, 0xee => 0x4faf, 0xef => 0x7334, 0xf0 => 0x543c, + 0xf1 => 0x539a, 0xf2 => 0x5019, 0xf3 => 0x540e, 0xf4 => 0x547c, + 0xf5 => 0x4e4e, 0xf6 => 0x5ffd, 0xf7 => 0x745a, 0xf8 => 0x58f6, + 0xf9 => 0x846b, 0xfa => 0x80e1, 0xfb => 0x8774, 0xfc => 0x72d0, + 0xfd => 0x7cca, 0xfe => 0x6e56, + }, + 0xbb => { + 0xa1 => 0x5f27, 0xa2 => 0x864e, 0xa3 => 0x552c, 0xa4 => 0x62a4, + 0xa5 => 0x4e92, 0xa6 => 0x6caa, 0xa7 => 0x6237, 0xa8 => 0x82b1, + 0xa9 => 0x54d7, 0xaa => 0x534e, 0xab => 0x733e, 0xac => 0x6ed1, + 0xad => 0x753b, 0xae => 0x5212, 0xaf => 0x5316, 0xb0 => 0x8bdd, + 0xb1 => 0x69d0, 0xb2 => 0x5f8a, 0xb3 => 0x6000, 0xb4 => 0x6dee, + 0xb5 => 0x574f, 0xb6 => 0x6b22, 0xb7 => 0x73af, 0xb8 => 0x6853, + 0xb9 => 0x8fd8, 0xba => 0x7f13, 0xbb => 0x6362, 0xbc => 0x60a3, + 0xbd => 0x5524, 0xbe => 0x75ea, 0xbf => 0x8c62, 0xc0 => 0x7115, + 0xc1 => 0x6da3, 0xc2 => 0x5ba6, 0xc3 => 0x5e7b, 0xc4 => 0x8352, + 0xc5 => 0x614c, 0xc6 => 0x9ec4, 0xc7 => 0x78fa, 0xc8 => 0x8757, + 0xc9 => 0x7c27, 0xca => 0x7687, 0xcb => 0x51f0, 0xcc => 0x60f6, + 0xcd => 0x714c, 0xce => 0x6643, 0xcf => 0x5e4c, 0xd0 => 0x604d, + 0xd1 => 0x8c0e, 0xd2 => 0x7070, 0xd3 => 0x6325, 0xd4 => 0x8f89, + 0xd5 => 0x5fbd, 0xd6 => 0x6062, 0xd7 => 0x86d4, 0xd8 => 0x56de, + 0xd9 => 0x6bc1, 0xda => 0x6094, 0xdb => 0x6167, 0xdc => 0x5349, + 0xdd => 0x60e0, 0xde => 0x6666, 0xdf => 0x8d3f, 0xe0 => 0x79fd, + 0xe1 => 0x4f1a, 0xe2 => 0x70e9, 0xe3 => 0x6c47, 0xe4 => 0x8bb3, + 0xe5 => 0x8bf2, 0xe6 => 0x7ed8, 0xe7 => 0x8364, 0xe8 => 0x660f, + 0xe9 => 0x5a5a, 0xea => 0x9b42, 0xeb => 0x6d51, 0xec => 0x6df7, + 0xed => 0x8c41, 0xee => 0x6d3b, 0xef => 0x4f19, 0xf0 => 0x706b, + 0xf1 => 0x83b7, 0xf2 => 0x6216, 0xf3 => 0x60d1, 0xf4 => 0x970d, + 0xf5 => 0x8d27, 0xf6 => 0x7978, 0xf7 => 0x51fb, 0xf8 => 0x573e, + 0xf9 => 0x57fa, 0xfa => 0x673a, 0xfb => 0x7578, 0xfc => 0x7a3d, + 0xfd => 0x79ef, 0xfe => 0x7b95, + }, + 0xbc => { + 0xa1 => 0x808c, 0xa2 => 0x9965, 0xa3 => 0x8ff9, 0xa4 => 0x6fc0, + 0xa5 => 0x8ba5, 0xa6 => 0x9e21, 0xa7 => 0x59ec, 0xa8 => 0x7ee9, + 0xa9 => 0x7f09, 0xaa => 0x5409, 0xab => 0x6781, 0xac => 0x68d8, + 0xad => 0x8f91, 0xae => 0x7c4d, 0xaf => 0x96c6, 0xb0 => 0x53ca, + 0xb1 => 0x6025, 0xb2 => 0x75be, 0xb3 => 0x6c72, 0xb4 => 0x5373, + 0xb5 => 0x5ac9, 0xb6 => 0x7ea7, 0xb7 => 0x6324, 0xb8 => 0x51e0, + 0xb9 => 0x810a, 0xba => 0x5df1, 0xbb => 0x84df, 0xbc => 0x6280, + 0xbd => 0x5180, 0xbe => 0x5b63, 0xbf => 0x4f0e, 0xc0 => 0x796d, + 0xc1 => 0x5242, 0xc2 => 0x60b8, 0xc3 => 0x6d4e, 0xc4 => 0x5bc4, + 0xc5 => 0x5bc2, 0xc6 => 0x8ba1, 0xc7 => 0x8bb0, 0xc8 => 0x65e2, + 0xc9 => 0x5fcc, 0xca => 0x9645, 0xcb => 0x5993, 0xcc => 0x7ee7, + 0xcd => 0x7eaa, 0xce => 0x5609, 0xcf => 0x67b7, 0xd0 => 0x5939, + 0xd1 => 0x4f73, 0xd2 => 0x5bb6, 0xd3 => 0x52a0, 0xd4 => 0x835a, + 0xd5 => 0x988a, 0xd6 => 0x8d3e, 0xd7 => 0x7532, 0xd8 => 0x94be, + 0xd9 => 0x5047, 0xda => 0x7a3c, 0xdb => 0x4ef7, 0xdc => 0x67b6, + 0xdd => 0x9a7e, 0xde => 0x5ac1, 0xdf => 0x6b7c, 0xe0 => 0x76d1, + 0xe1 => 0x575a, 0xe2 => 0x5c16, 0xe3 => 0x7b3a, 0xe4 => 0x95f4, + 0xe5 => 0x714e, 0xe6 => 0x517c, 0xe7 => 0x80a9, 0xe8 => 0x8270, + 0xe9 => 0x5978, 0xea => 0x7f04, 0xeb => 0x8327, 0xec => 0x68c0, + 0xed => 0x67ec, 0xee => 0x78b1, 0xef => 0x7877, 0xf0 => 0x62e3, + 0xf1 => 0x6361, 0xf2 => 0x7b80, 0xf3 => 0x4fed, 0xf4 => 0x526a, + 0xf5 => 0x51cf, 0xf6 => 0x8350, 0xf7 => 0x69db, 0xf8 => 0x9274, + 0xf9 => 0x8df5, 0xfa => 0x8d31, 0xfb => 0x89c1, 0xfc => 0x952e, + 0xfd => 0x7bad, 0xfe => 0x4ef6, + }, + 0xbd => { + 0xa1 => 0x5065, 0xa2 => 0x8230, 0xa3 => 0x5251, 0xa4 => 0x996f, + 0xa5 => 0x6e10, 0xa6 => 0x6e85, 0xa7 => 0x6da7, 0xa8 => 0x5efa, + 0xa9 => 0x50f5, 0xaa => 0x59dc, 0xab => 0x5c06, 0xac => 0x6d46, + 0xad => 0x6c5f, 0xae => 0x7586, 0xaf => 0x848b, 0xb0 => 0x6868, + 0xb1 => 0x5956, 0xb2 => 0x8bb2, 0xb3 => 0x5320, 0xb4 => 0x9171, + 0xb5 => 0x964d, 0xb6 => 0x8549, 0xb7 => 0x6912, 0xb8 => 0x7901, + 0xb9 => 0x7126, 0xba => 0x80f6, 0xbb => 0x4ea4, 0xbc => 0x90ca, + 0xbd => 0x6d47, 0xbe => 0x9a84, 0xbf => 0x5a07, 0xc0 => 0x56bc, + 0xc1 => 0x6405, 0xc2 => 0x94f0, 0xc3 => 0x77eb, 0xc4 => 0x4fa5, + 0xc5 => 0x811a, 0xc6 => 0x72e1, 0xc7 => 0x89d2, 0xc8 => 0x997a, + 0xc9 => 0x7f34, 0xca => 0x7ede, 0xcb => 0x527f, 0xcc => 0x6559, + 0xcd => 0x9175, 0xce => 0x8f7f, 0xcf => 0x8f83, 0xd0 => 0x53eb, + 0xd1 => 0x7a96, 0xd2 => 0x63ed, 0xd3 => 0x63a5, 0xd4 => 0x7686, + 0xd5 => 0x79f8, 0xd6 => 0x8857, 0xd7 => 0x9636, 0xd8 => 0x622a, + 0xd9 => 0x52ab, 0xda => 0x8282, 0xdb => 0x6854, 0xdc => 0x6770, + 0xdd => 0x6377, 0xde => 0x776b, 0xdf => 0x7aed, 0xe0 => 0x6d01, + 0xe1 => 0x7ed3, 0xe2 => 0x89e3, 0xe3 => 0x59d0, 0xe4 => 0x6212, + 0xe5 => 0x85c9, 0xe6 => 0x82a5, 0xe7 => 0x754c, 0xe8 => 0x501f, + 0xe9 => 0x4ecb, 0xea => 0x75a5, 0xeb => 0x8beb, 0xec => 0x5c4a, + 0xed => 0x5dfe, 0xee => 0x7b4b, 0xef => 0x65a4, 0xf0 => 0x91d1, + 0xf1 => 0x4eca, 0xf2 => 0x6d25, 0xf3 => 0x895f, 0xf4 => 0x7d27, + 0xf5 => 0x9526, 0xf6 => 0x4ec5, 0xf7 => 0x8c28, 0xf8 => 0x8fdb, + 0xf9 => 0x9773, 0xfa => 0x664b, 0xfb => 0x7981, 0xfc => 0x8fd1, + 0xfd => 0x70ec, 0xfe => 0x6d78, + }, + 0xbe => { + 0xa1 => 0x5c3d, 0xa2 => 0x52b2, 0xa3 => 0x8346, 0xa4 => 0x5162, + 0xa5 => 0x830e, 0xa6 => 0x775b, 0xa7 => 0x6676, 0xa8 => 0x9cb8, + 0xa9 => 0x4eac, 0xaa => 0x60ca, 0xab => 0x7cbe, 0xac => 0x7cb3, + 0xad => 0x7ecf, 0xae => 0x4e95, 0xaf => 0x8b66, 0xb0 => 0x666f, + 0xb1 => 0x9888, 0xb2 => 0x9759, 0xb3 => 0x5883, 0xb4 => 0x656c, + 0xb5 => 0x955c, 0xb6 => 0x5f84, 0xb7 => 0x75c9, 0xb8 => 0x9756, + 0xb9 => 0x7adf, 0xba => 0x7ade, 0xbb => 0x51c0, 0xbc => 0x70af, + 0xbd => 0x7a98, 0xbe => 0x63ea, 0xbf => 0x7a76, 0xc0 => 0x7ea0, + 0xc1 => 0x7396, 0xc2 => 0x97ed, 0xc3 => 0x4e45, 0xc4 => 0x7078, + 0xc5 => 0x4e5d, 0xc6 => 0x9152, 0xc7 => 0x53a9, 0xc8 => 0x6551, + 0xc9 => 0x65e7, 0xca => 0x81fc, 0xcb => 0x8205, 0xcc => 0x548e, + 0xcd => 0x5c31, 0xce => 0x759a, 0xcf => 0x97a0, 0xd0 => 0x62d8, + 0xd1 => 0x72d9, 0xd2 => 0x75bd, 0xd3 => 0x5c45, 0xd4 => 0x9a79, + 0xd5 => 0x83ca, 0xd6 => 0x5c40, 0xd7 => 0x5480, 0xd8 => 0x77e9, + 0xd9 => 0x4e3e, 0xda => 0x6cae, 0xdb => 0x805a, 0xdc => 0x62d2, + 0xdd => 0x636e, 0xde => 0x5de8, 0xdf => 0x5177, 0xe0 => 0x8ddd, + 0xe1 => 0x8e1e, 0xe2 => 0x952f, 0xe3 => 0x4ff1, 0xe4 => 0x53e5, + 0xe5 => 0x60e7, 0xe6 => 0x70ac, 0xe7 => 0x5267, 0xe8 => 0x6350, + 0xe9 => 0x9e43, 0xea => 0x5a1f, 0xeb => 0x5026, 0xec => 0x7737, + 0xed => 0x5377, 0xee => 0x7ee2, 0xef => 0x6485, 0xf0 => 0x652b, + 0xf1 => 0x6289, 0xf2 => 0x6398, 0xf3 => 0x5014, 0xf4 => 0x7235, + 0xf5 => 0x89c9, 0xf6 => 0x51b3, 0xf7 => 0x8bc0, 0xf8 => 0x7edd, + 0xf9 => 0x5747, 0xfa => 0x83cc, 0xfb => 0x94a7, 0xfc => 0x519b, + 0xfd => 0x541b, 0xfe => 0x5cfb, + }, + 0xbf => { + 0xa1 => 0x4fca, 0xa2 => 0x7ae3, 0xa3 => 0x6d5a, 0xa4 => 0x90e1, + 0xa5 => 0x9a8f, 0xa6 => 0x5580, 0xa7 => 0x5496, 0xa8 => 0x5361, + 0xa9 => 0x54af, 0xaa => 0x5f00, 0xab => 0x63e9, 0xac => 0x6977, + 0xad => 0x51ef, 0xae => 0x6168, 0xaf => 0x520a, 0xb0 => 0x582a, + 0xb1 => 0x52d8, 0xb2 => 0x574e, 0xb3 => 0x780d, 0xb4 => 0x770b, + 0xb5 => 0x5eb7, 0xb6 => 0x6177, 0xb7 => 0x7ce0, 0xb8 => 0x625b, + 0xb9 => 0x6297, 0xba => 0x4ea2, 0xbb => 0x7095, 0xbc => 0x8003, + 0xbd => 0x62f7, 0xbe => 0x70e4, 0xbf => 0x9760, 0xc0 => 0x5777, + 0xc1 => 0x82db, 0xc2 => 0x67ef, 0xc3 => 0x68f5, 0xc4 => 0x78d5, + 0xc5 => 0x9897, 0xc6 => 0x79d1, 0xc7 => 0x58f3, 0xc8 => 0x54b3, + 0xc9 => 0x53ef, 0xca => 0x6e34, 0xcb => 0x514b, 0xcc => 0x523b, + 0xcd => 0x5ba2, 0xce => 0x8bfe, 0xcf => 0x80af, 0xd0 => 0x5543, + 0xd1 => 0x57a6, 0xd2 => 0x6073, 0xd3 => 0x5751, 0xd4 => 0x542d, + 0xd5 => 0x7a7a, 0xd6 => 0x6050, 0xd7 => 0x5b54, 0xd8 => 0x63a7, + 0xd9 => 0x62a0, 0xda => 0x53e3, 0xdb => 0x6263, 0xdc => 0x5bc7, + 0xdd => 0x67af, 0xde => 0x54ed, 0xdf => 0x7a9f, 0xe0 => 0x82e6, + 0xe1 => 0x9177, 0xe2 => 0x5e93, 0xe3 => 0x88e4, 0xe4 => 0x5938, + 0xe5 => 0x57ae, 0xe6 => 0x630e, 0xe7 => 0x8de8, 0xe8 => 0x80ef, + 0xe9 => 0x5757, 0xea => 0x7b77, 0xeb => 0x4fa9, 0xec => 0x5feb, + 0xed => 0x5bbd, 0xee => 0x6b3e, 0xef => 0x5321, 0xf0 => 0x7b50, + 0xf1 => 0x72c2, 0xf2 => 0x6846, 0xf3 => 0x77ff, 0xf4 => 0x7736, + 0xf5 => 0x65f7, 0xf6 => 0x51b5, 0xf7 => 0x4e8f, 0xf8 => 0x76d4, + 0xf9 => 0x5cbf, 0xfa => 0x7aa5, 0xfb => 0x8475, 0xfc => 0x594e, + 0xfd => 0x9b41, 0xfe => 0x5080, + }, + 0xc0 => { + 0xa1 => 0x9988, 0xa2 => 0x6127, 0xa3 => 0x6e83, 0xa4 => 0x5764, + 0xa5 => 0x6606, 0xa6 => 0x6346, 0xa7 => 0x56f0, 0xa8 => 0x62ec, + 0xa9 => 0x6269, 0xaa => 0x5ed3, 0xab => 0x9614, 0xac => 0x5783, + 0xad => 0x62c9, 0xae => 0x5587, 0xaf => 0x8721, 0xb0 => 0x814a, + 0xb1 => 0x8fa3, 0xb2 => 0x5566, 0xb3 => 0x83b1, 0xb4 => 0x6765, + 0xb5 => 0x8d56, 0xb6 => 0x84dd, 0xb7 => 0x5a6a, 0xb8 => 0x680f, + 0xb9 => 0x62e6, 0xba => 0x7bee, 0xbb => 0x9611, 0xbc => 0x5170, + 0xbd => 0x6f9c, 0xbe => 0x8c30, 0xbf => 0x63fd, 0xc0 => 0x89c8, + 0xc1 => 0x61d2, 0xc2 => 0x7f06, 0xc3 => 0x70c2, 0xc4 => 0x6ee5, + 0xc5 => 0x7405, 0xc6 => 0x6994, 0xc7 => 0x72fc, 0xc8 => 0x5eca, + 0xc9 => 0x90ce, 0xca => 0x6717, 0xcb => 0x6d6a, 0xcc => 0x635e, + 0xcd => 0x52b3, 0xce => 0x7262, 0xcf => 0x8001, 0xd0 => 0x4f6c, + 0xd1 => 0x59e5, 0xd2 => 0x916a, 0xd3 => 0x70d9, 0xd4 => 0x6d9d, + 0xd5 => 0x52d2, 0xd6 => 0x4e50, 0xd7 => 0x96f7, 0xd8 => 0x956d, + 0xd9 => 0x857e, 0xda => 0x78ca, 0xdb => 0x7d2f, 0xdc => 0x5121, + 0xdd => 0x5792, 0xde => 0x64c2, 0xdf => 0x808b, 0xe0 => 0x7c7b, + 0xe1 => 0x6cea, 0xe2 => 0x68f1, 0xe3 => 0x695e, 0xe4 => 0x51b7, + 0xe5 => 0x5398, 0xe6 => 0x68a8, 0xe7 => 0x7281, 0xe8 => 0x9ece, + 0xe9 => 0x7bf1, 0xea => 0x72f8, 0xeb => 0x79bb, 0xec => 0x6f13, + 0xed => 0x7406, 0xee => 0x674e, 0xef => 0x91cc, 0xf0 => 0x9ca4, + 0xf1 => 0x793c, 0xf2 => 0x8389, 0xf3 => 0x8354, 0xf4 => 0x540f, + 0xf5 => 0x6817, 0xf6 => 0x4e3d, 0xf7 => 0x5389, 0xf8 => 0x52b1, + 0xf9 => 0x783e, 0xfa => 0x5386, 0xfb => 0x5229, 0xfc => 0x5088, + 0xfd => 0x4f8b, 0xfe => 0x4fd0, + }, + 0xc1 => { + 0xa1 => 0x75e2, 0xa2 => 0x7acb, 0xa3 => 0x7c92, 0xa4 => 0x6ca5, + 0xa5 => 0x96b6, 0xa6 => 0x529b, 0xa7 => 0x7483, 0xa8 => 0x54e9, + 0xa9 => 0x4fe9, 0xaa => 0x8054, 0xab => 0x83b2, 0xac => 0x8fde, + 0xad => 0x9570, 0xae => 0x5ec9, 0xaf => 0x601c, 0xb0 => 0x6d9f, + 0xb1 => 0x5e18, 0xb2 => 0x655b, 0xb3 => 0x8138, 0xb4 => 0x94fe, + 0xb5 => 0x604b, 0xb6 => 0x70bc, 0xb7 => 0x7ec3, 0xb8 => 0x7cae, + 0xb9 => 0x51c9, 0xba => 0x6881, 0xbb => 0x7cb1, 0xbc => 0x826f, + 0xbd => 0x4e24, 0xbe => 0x8f86, 0xbf => 0x91cf, 0xc0 => 0x667e, + 0xc1 => 0x4eae, 0xc2 => 0x8c05, 0xc3 => 0x64a9, 0xc4 => 0x804a, + 0xc5 => 0x50da, 0xc6 => 0x7597, 0xc7 => 0x71ce, 0xc8 => 0x5be5, + 0xc9 => 0x8fbd, 0xca => 0x6f66, 0xcb => 0x4e86, 0xcc => 0x6482, + 0xcd => 0x9563, 0xce => 0x5ed6, 0xcf => 0x6599, 0xd0 => 0x5217, + 0xd1 => 0x88c2, 0xd2 => 0x70c8, 0xd3 => 0x52a3, 0xd4 => 0x730e, + 0xd5 => 0x7433, 0xd6 => 0x6797, 0xd7 => 0x78f7, 0xd8 => 0x9716, + 0xd9 => 0x4e34, 0xda => 0x90bb, 0xdb => 0x9cde, 0xdc => 0x6dcb, + 0xdd => 0x51db, 0xde => 0x8d41, 0xdf => 0x541d, 0xe0 => 0x62ce, + 0xe1 => 0x73b2, 0xe2 => 0x83f1, 0xe3 => 0x96f6, 0xe4 => 0x9f84, + 0xe5 => 0x94c3, 0xe6 => 0x4f36, 0xe7 => 0x7f9a, 0xe8 => 0x51cc, + 0xe9 => 0x7075, 0xea => 0x9675, 0xeb => 0x5cad, 0xec => 0x9886, + 0xed => 0x53e6, 0xee => 0x4ee4, 0xef => 0x6e9c, 0xf0 => 0x7409, + 0xf1 => 0x69b4, 0xf2 => 0x786b, 0xf3 => 0x998f, 0xf4 => 0x7559, + 0xf5 => 0x5218, 0xf6 => 0x7624, 0xf7 => 0x6d41, 0xf8 => 0x67f3, + 0xf9 => 0x516d, 0xfa => 0x9f99, 0xfb => 0x804b, 0xfc => 0x5499, + 0xfd => 0x7b3c, 0xfe => 0x7abf, + }, + 0xc2 => { + 0xa1 => 0x9686, 0xa2 => 0x5784, 0xa3 => 0x62e2, 0xa4 => 0x9647, + 0xa5 => 0x697c, 0xa6 => 0x5a04, 0xa7 => 0x6402, 0xa8 => 0x7bd3, + 0xa9 => 0x6f0f, 0xaa => 0x964b, 0xab => 0x82a6, 0xac => 0x5362, + 0xad => 0x9885, 0xae => 0x5e90, 0xaf => 0x7089, 0xb0 => 0x63b3, + 0xb1 => 0x5364, 0xb2 => 0x864f, 0xb3 => 0x9c81, 0xb4 => 0x9e93, + 0xb5 => 0x788c, 0xb6 => 0x9732, 0xb7 => 0x8def, 0xb8 => 0x8d42, + 0xb9 => 0x9e7f, 0xba => 0x6f5e, 0xbb => 0x7984, 0xbc => 0x5f55, + 0xbd => 0x9646, 0xbe => 0x622e, 0xbf => 0x9a74, 0xc0 => 0x5415, + 0xc1 => 0x94dd, 0xc2 => 0x4fa3, 0xc3 => 0x65c5, 0xc4 => 0x5c65, + 0xc5 => 0x5c61, 0xc6 => 0x7f15, 0xc7 => 0x8651, 0xc8 => 0x6c2f, + 0xc9 => 0x5f8b, 0xca => 0x7387, 0xcb => 0x6ee4, 0xcc => 0x7eff, + 0xcd => 0x5ce6, 0xce => 0x631b, 0xcf => 0x5b6a, 0xd0 => 0x6ee6, + 0xd1 => 0x5375, 0xd2 => 0x4e71, 0xd3 => 0x63a0, 0xd4 => 0x7565, + 0xd5 => 0x62a1, 0xd6 => 0x8f6e, 0xd7 => 0x4f26, 0xd8 => 0x4ed1, + 0xd9 => 0x6ca6, 0xda => 0x7eb6, 0xdb => 0x8bba, 0xdc => 0x841d, + 0xdd => 0x87ba, 0xde => 0x7f57, 0xdf => 0x903b, 0xe0 => 0x9523, + 0xe1 => 0x7ba9, 0xe2 => 0x9aa1, 0xe3 => 0x88f8, 0xe4 => 0x843d, + 0xe5 => 0x6d1b, 0xe6 => 0x9a86, 0xe7 => 0x7edc, 0xe8 => 0x5988, + 0xe9 => 0x9ebb, 0xea => 0x739b, 0xeb => 0x7801, 0xec => 0x8682, + 0xed => 0x9a6c, 0xee => 0x9a82, 0xef => 0x561b, 0xf0 => 0x5417, + 0xf1 => 0x57cb, 0xf2 => 0x4e70, 0xf3 => 0x9ea6, 0xf4 => 0x5356, + 0xf5 => 0x8fc8, 0xf6 => 0x8109, 0xf7 => 0x7792, 0xf8 => 0x9992, + 0xf9 => 0x86ee, 0xfa => 0x6ee1, 0xfb => 0x8513, 0xfc => 0x66fc, + 0xfd => 0x6162, 0xfe => 0x6f2b, + }, + 0xc3 => { + 0xa1 => 0x8c29, 0xa2 => 0x8292, 0xa3 => 0x832b, 0xa4 => 0x76f2, + 0xa5 => 0x6c13, 0xa6 => 0x5fd9, 0xa7 => 0x83bd, 0xa8 => 0x732b, + 0xa9 => 0x8305, 0xaa => 0x951a, 0xab => 0x6bdb, 0xac => 0x77db, + 0xad => 0x94c6, 0xae => 0x536f, 0xaf => 0x8302, 0xb0 => 0x5192, + 0xb1 => 0x5e3d, 0xb2 => 0x8c8c, 0xb3 => 0x8d38, 0xb4 => 0x4e48, + 0xb5 => 0x73ab, 0xb6 => 0x679a, 0xb7 => 0x6885, 0xb8 => 0x9176, + 0xb9 => 0x9709, 0xba => 0x7164, 0xbb => 0x6ca1, 0xbc => 0x7709, + 0xbd => 0x5a92, 0xbe => 0x9541, 0xbf => 0x6bcf, 0xc0 => 0x7f8e, + 0xc1 => 0x6627, 0xc2 => 0x5bd0, 0xc3 => 0x59b9, 0xc4 => 0x5a9a, + 0xc5 => 0x95e8, 0xc6 => 0x95f7, 0xc7 => 0x4eec, 0xc8 => 0x840c, + 0xc9 => 0x8499, 0xca => 0x6aac, 0xcb => 0x76df, 0xcc => 0x9530, + 0xcd => 0x731b, 0xce => 0x68a6, 0xcf => 0x5b5f, 0xd0 => 0x772f, + 0xd1 => 0x919a, 0xd2 => 0x9761, 0xd3 => 0x7cdc, 0xd4 => 0x8ff7, + 0xd5 => 0x8c1c, 0xd6 => 0x5f25, 0xd7 => 0x7c73, 0xd8 => 0x79d8, + 0xd9 => 0x89c5, 0xda => 0x6ccc, 0xdb => 0x871c, 0xdc => 0x5bc6, + 0xdd => 0x5e42, 0xde => 0x68c9, 0xdf => 0x7720, 0xe0 => 0x7ef5, + 0xe1 => 0x5195, 0xe2 => 0x514d, 0xe3 => 0x52c9, 0xe4 => 0x5a29, + 0xe5 => 0x7f05, 0xe6 => 0x9762, 0xe7 => 0x82d7, 0xe8 => 0x63cf, + 0xe9 => 0x7784, 0xea => 0x85d0, 0xeb => 0x79d2, 0xec => 0x6e3a, + 0xed => 0x5e99, 0xee => 0x5999, 0xef => 0x8511, 0xf0 => 0x706d, + 0xf1 => 0x6c11, 0xf2 => 0x62bf, 0xf3 => 0x76bf, 0xf4 => 0x654f, + 0xf5 => 0x60af, 0xf6 => 0x95fd, 0xf7 => 0x660e, 0xf8 => 0x879f, + 0xf9 => 0x9e23, 0xfa => 0x94ed, 0xfb => 0x540d, 0xfc => 0x547d, + 0xfd => 0x8c2c, 0xfe => 0x6478, + }, + 0xc4 => { + 0xa1 => 0x6479, 0xa2 => 0x8611, 0xa3 => 0x6a21, 0xa4 => 0x819c, + 0xa5 => 0x78e8, 0xa6 => 0x6469, 0xa7 => 0x9b54, 0xa8 => 0x62b9, + 0xa9 => 0x672b, 0xaa => 0x83ab, 0xab => 0x58a8, 0xac => 0x9ed8, + 0xad => 0x6cab, 0xae => 0x6f20, 0xaf => 0x5bde, 0xb0 => 0x964c, + 0xb1 => 0x8c0b, 0xb2 => 0x725f, 0xb3 => 0x67d0, 0xb4 => 0x62c7, + 0xb5 => 0x7261, 0xb6 => 0x4ea9, 0xb7 => 0x59c6, 0xb8 => 0x6bcd, + 0xb9 => 0x5893, 0xba => 0x66ae, 0xbb => 0x5e55, 0xbc => 0x52df, + 0xbd => 0x6155, 0xbe => 0x6728, 0xbf => 0x76ee, 0xc0 => 0x7766, + 0xc1 => 0x7267, 0xc2 => 0x7a46, 0xc3 => 0x62ff, 0xc4 => 0x54ea, + 0xc5 => 0x5450, 0xc6 => 0x94a0, 0xc7 => 0x90a3, 0xc8 => 0x5a1c, + 0xc9 => 0x7eb3, 0xca => 0x6c16, 0xcb => 0x4e43, 0xcc => 0x5976, + 0xcd => 0x8010, 0xce => 0x5948, 0xcf => 0x5357, 0xd0 => 0x7537, + 0xd1 => 0x96be, 0xd2 => 0x56ca, 0xd3 => 0x6320, 0xd4 => 0x8111, + 0xd5 => 0x607c, 0xd6 => 0x95f9, 0xd7 => 0x6dd6, 0xd8 => 0x5462, + 0xd9 => 0x9981, 0xda => 0x5185, 0xdb => 0x5ae9, 0xdc => 0x80fd, + 0xdd => 0x59ae, 0xde => 0x9713, 0xdf => 0x502a, 0xe0 => 0x6ce5, + 0xe1 => 0x5c3c, 0xe2 => 0x62df, 0xe3 => 0x4f60, 0xe4 => 0x533f, + 0xe5 => 0x817b, 0xe6 => 0x9006, 0xe7 => 0x6eba, 0xe8 => 0x852b, + 0xe9 => 0x62c8, 0xea => 0x5e74, 0xeb => 0x78be, 0xec => 0x64b5, + 0xed => 0x637b, 0xee => 0x5ff5, 0xef => 0x5a18, 0xf0 => 0x917f, + 0xf1 => 0x9e1f, 0xf2 => 0x5c3f, 0xf3 => 0x634f, 0xf4 => 0x8042, + 0xf5 => 0x5b7d, 0xf6 => 0x556e, 0xf7 => 0x954a, 0xf8 => 0x954d, + 0xf9 => 0x6d85, 0xfa => 0x60a8, 0xfb => 0x67e0, 0xfc => 0x72de, + 0xfd => 0x51dd, 0xfe => 0x5b81, + }, + 0xc5 => { + 0xa1 => 0x62e7, 0xa2 => 0x6cde, 0xa3 => 0x725b, 0xa4 => 0x626d, + 0xa5 => 0x94ae, 0xa6 => 0x7ebd, 0xa7 => 0x8113, 0xa8 => 0x6d53, + 0xa9 => 0x519c, 0xaa => 0x5f04, 0xab => 0x5974, 0xac => 0x52aa, + 0xad => 0x6012, 0xae => 0x5973, 0xaf => 0x6696, 0xb0 => 0x8650, + 0xb1 => 0x759f, 0xb2 => 0x632a, 0xb3 => 0x61e6, 0xb4 => 0x7cef, + 0xb5 => 0x8bfa, 0xb6 => 0x54e6, 0xb7 => 0x6b27, 0xb8 => 0x9e25, + 0xb9 => 0x6bb4, 0xba => 0x85d5, 0xbb => 0x5455, 0xbc => 0x5076, + 0xbd => 0x6ca4, 0xbe => 0x556a, 0xbf => 0x8db4, 0xc0 => 0x722c, + 0xc1 => 0x5e15, 0xc2 => 0x6015, 0xc3 => 0x7436, 0xc4 => 0x62cd, + 0xc5 => 0x6392, 0xc6 => 0x724c, 0xc7 => 0x5f98, 0xc8 => 0x6e43, + 0xc9 => 0x6d3e, 0xca => 0x6500, 0xcb => 0x6f58, 0xcc => 0x76d8, + 0xcd => 0x78d0, 0xce => 0x76fc, 0xcf => 0x7554, 0xd0 => 0x5224, + 0xd1 => 0x53db, 0xd2 => 0x4e53, 0xd3 => 0x5e9e, 0xd4 => 0x65c1, + 0xd5 => 0x802a, 0xd6 => 0x80d6, 0xd7 => 0x629b, 0xd8 => 0x5486, + 0xd9 => 0x5228, 0xda => 0x70ae, 0xdb => 0x888d, 0xdc => 0x8dd1, + 0xdd => 0x6ce1, 0xde => 0x5478, 0xdf => 0x80da, 0xe0 => 0x57f9, + 0xe1 => 0x88f4, 0xe2 => 0x8d54, 0xe3 => 0x966a, 0xe4 => 0x914d, + 0xe5 => 0x4f69, 0xe6 => 0x6c9b, 0xe7 => 0x55b7, 0xe8 => 0x76c6, + 0xe9 => 0x7830, 0xea => 0x62a8, 0xeb => 0x70f9, 0xec => 0x6f8e, + 0xed => 0x5f6d, 0xee => 0x84ec, 0xef => 0x68da, 0xf0 => 0x787c, + 0xf1 => 0x7bf7, 0xf2 => 0x81a8, 0xf3 => 0x670b, 0xf4 => 0x9e4f, + 0xf5 => 0x6367, 0xf6 => 0x78b0, 0xf7 => 0x576f, 0xf8 => 0x7812, + 0xf9 => 0x9739, 0xfa => 0x6279, 0xfb => 0x62ab, 0xfc => 0x5288, + 0xfd => 0x7435, 0xfe => 0x6bd7, + }, + 0xc6 => { + 0xa1 => 0x5564, 0xa2 => 0x813e, 0xa3 => 0x75b2, 0xa4 => 0x76ae, + 0xa5 => 0x5339, 0xa6 => 0x75de, 0xa7 => 0x50fb, 0xa8 => 0x5c41, + 0xa9 => 0x8b6c, 0xaa => 0x7bc7, 0xab => 0x504f, 0xac => 0x7247, + 0xad => 0x9a97, 0xae => 0x98d8, 0xaf => 0x6f02, 0xb0 => 0x74e2, + 0xb1 => 0x7968, 0xb2 => 0x6487, 0xb3 => 0x77a5, 0xb4 => 0x62fc, + 0xb5 => 0x9891, 0xb6 => 0x8d2b, 0xb7 => 0x54c1, 0xb8 => 0x8058, + 0xb9 => 0x4e52, 0xba => 0x576a, 0xbb => 0x82f9, 0xbc => 0x840d, + 0xbd => 0x5e73, 0xbe => 0x51ed, 0xbf => 0x74f6, 0xc0 => 0x8bc4, + 0xc1 => 0x5c4f, 0xc2 => 0x5761, 0xc3 => 0x6cfc, 0xc4 => 0x9887, + 0xc5 => 0x5a46, 0xc6 => 0x7834, 0xc7 => 0x9b44, 0xc8 => 0x8feb, + 0xc9 => 0x7c95, 0xca => 0x5256, 0xcb => 0x6251, 0xcc => 0x94fa, + 0xcd => 0x4ec6, 0xce => 0x8386, 0xcf => 0x8461, 0xd0 => 0x83e9, + 0xd1 => 0x84b2, 0xd2 => 0x57d4, 0xd3 => 0x6734, 0xd4 => 0x5703, + 0xd5 => 0x666e, 0xd6 => 0x6d66, 0xd7 => 0x8c31, 0xd8 => 0x66dd, + 0xd9 => 0x7011, 0xda => 0x671f, 0xdb => 0x6b3a, 0xdc => 0x6816, + 0xdd => 0x621a, 0xde => 0x59bb, 0xdf => 0x4e03, 0xe0 => 0x51c4, + 0xe1 => 0x6f06, 0xe2 => 0x67d2, 0xe3 => 0x6c8f, 0xe4 => 0x5176, + 0xe5 => 0x68cb, 0xe6 => 0x5947, 0xe7 => 0x6b67, 0xe8 => 0x7566, + 0xe9 => 0x5d0e, 0xea => 0x8110, 0xeb => 0x9f50, 0xec => 0x65d7, + 0xed => 0x7948, 0xee => 0x7941, 0xef => 0x9a91, 0xf0 => 0x8d77, + 0xf1 => 0x5c82, 0xf2 => 0x4e5e, 0xf3 => 0x4f01, 0xf4 => 0x542f, + 0xf5 => 0x5951, 0xf6 => 0x780c, 0xf7 => 0x5668, 0xf8 => 0x6c14, + 0xf9 => 0x8fc4, 0xfa => 0x5f03, 0xfb => 0x6c7d, 0xfc => 0x6ce3, + 0xfd => 0x8bab, 0xfe => 0x6390, + }, + 0xc7 => { + 0xa1 => 0x6070, 0xa2 => 0x6d3d, 0xa3 => 0x7275, 0xa4 => 0x6266, + 0xa5 => 0x948e, 0xa6 => 0x94c5, 0xa7 => 0x5343, 0xa8 => 0x8fc1, + 0xa9 => 0x7b7e, 0xaa => 0x4edf, 0xab => 0x8c26, 0xac => 0x4e7e, + 0xad => 0x9ed4, 0xae => 0x94b1, 0xaf => 0x94b3, 0xb0 => 0x524d, + 0xb1 => 0x6f5c, 0xb2 => 0x9063, 0xb3 => 0x6d45, 0xb4 => 0x8c34, + 0xb5 => 0x5811, 0xb6 => 0x5d4c, 0xb7 => 0x6b20, 0xb8 => 0x6b49, + 0xb9 => 0x67aa, 0xba => 0x545b, 0xbb => 0x8154, 0xbc => 0x7f8c, + 0xbd => 0x5899, 0xbe => 0x8537, 0xbf => 0x5f3a, 0xc0 => 0x62a2, + 0xc1 => 0x6a47, 0xc2 => 0x9539, 0xc3 => 0x6572, 0xc4 => 0x6084, + 0xc5 => 0x6865, 0xc6 => 0x77a7, 0xc7 => 0x4e54, 0xc8 => 0x4fa8, + 0xc9 => 0x5de7, 0xca => 0x9798, 0xcb => 0x64ac, 0xcc => 0x7fd8, + 0xcd => 0x5ced, 0xce => 0x4fcf, 0xcf => 0x7a8d, 0xd0 => 0x5207, + 0xd1 => 0x8304, 0xd2 => 0x4e14, 0xd3 => 0x602f, 0xd4 => 0x7a83, + 0xd5 => 0x94a6, 0xd6 => 0x4fb5, 0xd7 => 0x4eb2, 0xd8 => 0x79e6, + 0xd9 => 0x7434, 0xda => 0x52e4, 0xdb => 0x82b9, 0xdc => 0x64d2, + 0xdd => 0x79bd, 0xde => 0x5bdd, 0xdf => 0x6c81, 0xe0 => 0x9752, + 0xe1 => 0x8f7b, 0xe2 => 0x6c22, 0xe3 => 0x503e, 0xe4 => 0x537f, + 0xe5 => 0x6e05, 0xe6 => 0x64ce, 0xe7 => 0x6674, 0xe8 => 0x6c30, + 0xe9 => 0x60c5, 0xea => 0x9877, 0xeb => 0x8bf7, 0xec => 0x5e86, + 0xed => 0x743c, 0xee => 0x7a77, 0xef => 0x79cb, 0xf0 => 0x4e18, + 0xf1 => 0x90b1, 0xf2 => 0x7403, 0xf3 => 0x6c42, 0xf4 => 0x56da, + 0xf5 => 0x914b, 0xf6 => 0x6cc5, 0xf7 => 0x8d8b, 0xf8 => 0x533a, + 0xf9 => 0x86c6, 0xfa => 0x66f2, 0xfb => 0x8eaf, 0xfc => 0x5c48, + 0xfd => 0x9a71, 0xfe => 0x6e20, + }, + 0xc8 => { + 0xa1 => 0x53d6, 0xa2 => 0x5a36, 0xa3 => 0x9f8b, 0xa4 => 0x8da3, + 0xa5 => 0x53bb, 0xa6 => 0x5708, 0xa7 => 0x98a7, 0xa8 => 0x6743, + 0xa9 => 0x919b, 0xaa => 0x6cc9, 0xab => 0x5168, 0xac => 0x75ca, + 0xad => 0x62f3, 0xae => 0x72ac, 0xaf => 0x5238, 0xb0 => 0x529d, + 0xb1 => 0x7f3a, 0xb2 => 0x7094, 0xb3 => 0x7638, 0xb4 => 0x5374, + 0xb5 => 0x9e4a, 0xb6 => 0x69b7, 0xb7 => 0x786e, 0xb8 => 0x96c0, + 0xb9 => 0x88d9, 0xba => 0x7fa4, 0xbb => 0x7136, 0xbc => 0x71c3, + 0xbd => 0x5189, 0xbe => 0x67d3, 0xbf => 0x74e4, 0xc0 => 0x58e4, + 0xc1 => 0x6518, 0xc2 => 0x56b7, 0xc3 => 0x8ba9, 0xc4 => 0x9976, + 0xc5 => 0x6270, 0xc6 => 0x7ed5, 0xc7 => 0x60f9, 0xc8 => 0x70ed, + 0xc9 => 0x58ec, 0xca => 0x4ec1, 0xcb => 0x4eba, 0xcc => 0x5fcd, + 0xcd => 0x97e7, 0xce => 0x4efb, 0xcf => 0x8ba4, 0xd0 => 0x5203, + 0xd1 => 0x598a, 0xd2 => 0x7eab, 0xd3 => 0x6254, 0xd4 => 0x4ecd, + 0xd5 => 0x65e5, 0xd6 => 0x620e, 0xd7 => 0x8338, 0xd8 => 0x84c9, + 0xd9 => 0x8363, 0xda => 0x878d, 0xdb => 0x7194, 0xdc => 0x6eb6, + 0xdd => 0x5bb9, 0xde => 0x7ed2, 0xdf => 0x5197, 0xe0 => 0x63c9, + 0xe1 => 0x67d4, 0xe2 => 0x8089, 0xe3 => 0x8339, 0xe4 => 0x8815, + 0xe5 => 0x5112, 0xe6 => 0x5b7a, 0xe7 => 0x5982, 0xe8 => 0x8fb1, + 0xe9 => 0x4e73, 0xea => 0x6c5d, 0xeb => 0x5165, 0xec => 0x8925, + 0xed => 0x8f6f, 0xee => 0x962e, 0xef => 0x854a, 0xf0 => 0x745e, + 0xf1 => 0x9510, 0xf2 => 0x95f0, 0xf3 => 0x6da6, 0xf4 => 0x82e5, + 0xf5 => 0x5f31, 0xf6 => 0x6492, 0xf7 => 0x6d12, 0xf8 => 0x8428, + 0xf9 => 0x816e, 0xfa => 0x9cc3, 0xfb => 0x585e, 0xfc => 0x8d5b, + 0xfd => 0x4e09, 0xfe => 0x53c1, + }, + 0xc9 => { + 0xa1 => 0x4f1e, 0xa2 => 0x6563, 0xa3 => 0x6851, 0xa4 => 0x55d3, + 0xa5 => 0x4e27, 0xa6 => 0x6414, 0xa7 => 0x9a9a, 0xa8 => 0x626b, + 0xa9 => 0x5ac2, 0xaa => 0x745f, 0xab => 0x8272, 0xac => 0x6da9, + 0xad => 0x68ee, 0xae => 0x50e7, 0xaf => 0x838e, 0xb0 => 0x7802, + 0xb1 => 0x6740, 0xb2 => 0x5239, 0xb3 => 0x6c99, 0xb4 => 0x7eb1, + 0xb5 => 0x50bb, 0xb6 => 0x5565, 0xb7 => 0x715e, 0xb8 => 0x7b5b, + 0xb9 => 0x6652, 0xba => 0x73ca, 0xbb => 0x82eb, 0xbc => 0x6749, + 0xbd => 0x5c71, 0xbe => 0x5220, 0xbf => 0x717d, 0xc0 => 0x886b, + 0xc1 => 0x95ea, 0xc2 => 0x9655, 0xc3 => 0x64c5, 0xc4 => 0x8d61, + 0xc5 => 0x81b3, 0xc6 => 0x5584, 0xc7 => 0x6c55, 0xc8 => 0x6247, + 0xc9 => 0x7f2e, 0xca => 0x5892, 0xcb => 0x4f24, 0xcc => 0x5546, + 0xcd => 0x8d4f, 0xce => 0x664c, 0xcf => 0x4e0a, 0xd0 => 0x5c1a, + 0xd1 => 0x88f3, 0xd2 => 0x68a2, 0xd3 => 0x634e, 0xd4 => 0x7a0d, + 0xd5 => 0x70e7, 0xd6 => 0x828d, 0xd7 => 0x52fa, 0xd8 => 0x97f6, + 0xd9 => 0x5c11, 0xda => 0x54e8, 0xdb => 0x90b5, 0xdc => 0x7ecd, + 0xdd => 0x5962, 0xde => 0x8d4a, 0xdf => 0x86c7, 0xe0 => 0x820c, + 0xe1 => 0x820d, 0xe2 => 0x8d66, 0xe3 => 0x6444, 0xe4 => 0x5c04, + 0xe5 => 0x6151, 0xe6 => 0x6d89, 0xe7 => 0x793e, 0xe8 => 0x8bbe, + 0xe9 => 0x7837, 0xea => 0x7533, 0xeb => 0x547b, 0xec => 0x4f38, + 0xed => 0x8eab, 0xee => 0x6df1, 0xef => 0x5a20, 0xf0 => 0x7ec5, + 0xf1 => 0x795e, 0xf2 => 0x6c88, 0xf3 => 0x5ba1, 0xf4 => 0x5a76, + 0xf5 => 0x751a, 0xf6 => 0x80be, 0xf7 => 0x614e, 0xf8 => 0x6e17, + 0xf9 => 0x58f0, 0xfa => 0x751f, 0xfb => 0x7525, 0xfc => 0x7272, + 0xfd => 0x5347, 0xfe => 0x7ef3, + }, + 0xca => { + 0xa1 => 0x7701, 0xa2 => 0x76db, 0xa3 => 0x5269, 0xa4 => 0x80dc, + 0xa5 => 0x5723, 0xa6 => 0x5e08, 0xa7 => 0x5931, 0xa8 => 0x72ee, + 0xa9 => 0x65bd, 0xaa => 0x6e7f, 0xab => 0x8bd7, 0xac => 0x5c38, + 0xad => 0x8671, 0xae => 0x5341, 0xaf => 0x77f3, 0xb0 => 0x62fe, + 0xb1 => 0x65f6, 0xb2 => 0x4ec0, 0xb3 => 0x98df, 0xb4 => 0x8680, + 0xb5 => 0x5b9e, 0xb6 => 0x8bc6, 0xb7 => 0x53f2, 0xb8 => 0x77e2, + 0xb9 => 0x4f7f, 0xba => 0x5c4e, 0xbb => 0x9a76, 0xbc => 0x59cb, + 0xbd => 0x5f0f, 0xbe => 0x793a, 0xbf => 0x58eb, 0xc0 => 0x4e16, + 0xc1 => 0x67ff, 0xc2 => 0x4e8b, 0xc3 => 0x62ed, 0xc4 => 0x8a93, + 0xc5 => 0x901d, 0xc6 => 0x52bf, 0xc7 => 0x662f, 0xc8 => 0x55dc, + 0xc9 => 0x566c, 0xca => 0x9002, 0xcb => 0x4ed5, 0xcc => 0x4f8d, + 0xcd => 0x91ca, 0xce => 0x9970, 0xcf => 0x6c0f, 0xd0 => 0x5e02, + 0xd1 => 0x6043, 0xd2 => 0x5ba4, 0xd3 => 0x89c6, 0xd4 => 0x8bd5, + 0xd5 => 0x6536, 0xd6 => 0x624b, 0xd7 => 0x9996, 0xd8 => 0x5b88, + 0xd9 => 0x5bff, 0xda => 0x6388, 0xdb => 0x552e, 0xdc => 0x53d7, + 0xdd => 0x7626, 0xde => 0x517d, 0xdf => 0x852c, 0xe0 => 0x67a2, + 0xe1 => 0x68b3, 0xe2 => 0x6b8a, 0xe3 => 0x6292, 0xe4 => 0x8f93, + 0xe5 => 0x53d4, 0xe6 => 0x8212, 0xe7 => 0x6dd1, 0xe8 => 0x758f, + 0xe9 => 0x4e66, 0xea => 0x8d4e, 0xeb => 0x5b70, 0xec => 0x719f, + 0xed => 0x85af, 0xee => 0x6691, 0xef => 0x66d9, 0xf0 => 0x7f72, + 0xf1 => 0x8700, 0xf2 => 0x9ecd, 0xf3 => 0x9f20, 0xf4 => 0x5c5e, + 0xf5 => 0x672f, 0xf6 => 0x8ff0, 0xf7 => 0x6811, 0xf8 => 0x675f, + 0xf9 => 0x620d, 0xfa => 0x7ad6, 0xfb => 0x5885, 0xfc => 0x5eb6, + 0xfd => 0x6570, 0xfe => 0x6f31, + }, + 0xcb => { + 0xa1 => 0x6055, 0xa2 => 0x5237, 0xa3 => 0x800d, 0xa4 => 0x6454, + 0xa5 => 0x8870, 0xa6 => 0x7529, 0xa7 => 0x5e05, 0xa8 => 0x6813, + 0xa9 => 0x62f4, 0xaa => 0x971c, 0xab => 0x53cc, 0xac => 0x723d, + 0xad => 0x8c01, 0xae => 0x6c34, 0xaf => 0x7761, 0xb0 => 0x7a0e, + 0xb1 => 0x542e, 0xb2 => 0x77ac, 0xb3 => 0x987a, 0xb4 => 0x821c, + 0xb5 => 0x8bf4, 0xb6 => 0x7855, 0xb7 => 0x6714, 0xb8 => 0x70c1, + 0xb9 => 0x65af, 0xba => 0x6495, 0xbb => 0x5636, 0xbc => 0x601d, + 0xbd => 0x79c1, 0xbe => 0x53f8, 0xbf => 0x4e1d, 0xc0 => 0x6b7b, + 0xc1 => 0x8086, 0xc2 => 0x5bfa, 0xc3 => 0x55e3, 0xc4 => 0x56db, + 0xc5 => 0x4f3a, 0xc6 => 0x4f3c, 0xc7 => 0x9972, 0xc8 => 0x5df3, + 0xc9 => 0x677e, 0xca => 0x8038, 0xcb => 0x6002, 0xcc => 0x9882, + 0xcd => 0x9001, 0xce => 0x5b8b, 0xcf => 0x8bbc, 0xd0 => 0x8bf5, + 0xd1 => 0x641c, 0xd2 => 0x8258, 0xd3 => 0x64de, 0xd4 => 0x55fd, + 0xd5 => 0x82cf, 0xd6 => 0x9165, 0xd7 => 0x4fd7, 0xd8 => 0x7d20, + 0xd9 => 0x901f, 0xda => 0x7c9f, 0xdb => 0x50f3, 0xdc => 0x5851, + 0xdd => 0x6eaf, 0xde => 0x5bbf, 0xdf => 0x8bc9, 0xe0 => 0x8083, + 0xe1 => 0x9178, 0xe2 => 0x849c, 0xe3 => 0x7b97, 0xe4 => 0x867d, + 0xe5 => 0x968b, 0xe6 => 0x968f, 0xe7 => 0x7ee5, 0xe8 => 0x9ad3, + 0xe9 => 0x788e, 0xea => 0x5c81, 0xeb => 0x7a57, 0xec => 0x9042, + 0xed => 0x96a7, 0xee => 0x795f, 0xef => 0x5b59, 0xf0 => 0x635f, + 0xf1 => 0x7b0b, 0xf2 => 0x84d1, 0xf3 => 0x68ad, 0xf4 => 0x5506, + 0xf5 => 0x7f29, 0xf6 => 0x7410, 0xf7 => 0x7d22, 0xf8 => 0x9501, + 0xf9 => 0x6240, 0xfa => 0x584c, 0xfb => 0x4ed6, 0xfc => 0x5b83, + 0xfd => 0x5979, 0xfe => 0x5854, + }, + 0xcc => { + 0xa1 => 0x736d, 0xa2 => 0x631e, 0xa3 => 0x8e4b, 0xa4 => 0x8e0f, + 0xa5 => 0x80ce, 0xa6 => 0x82d4, 0xa7 => 0x62ac, 0xa8 => 0x53f0, + 0xa9 => 0x6cf0, 0xaa => 0x915e, 0xab => 0x592a, 0xac => 0x6001, + 0xad => 0x6c70, 0xae => 0x574d, 0xaf => 0x644a, 0xb0 => 0x8d2a, + 0xb1 => 0x762b, 0xb2 => 0x6ee9, 0xb3 => 0x575b, 0xb4 => 0x6a80, + 0xb5 => 0x75f0, 0xb6 => 0x6f6d, 0xb7 => 0x8c2d, 0xb8 => 0x8c08, + 0xb9 => 0x5766, 0xba => 0x6bef, 0xbb => 0x8892, 0xbc => 0x78b3, + 0xbd => 0x63a2, 0xbe => 0x53f9, 0xbf => 0x70ad, 0xc0 => 0x6c64, + 0xc1 => 0x5858, 0xc2 => 0x642a, 0xc3 => 0x5802, 0xc4 => 0x68e0, + 0xc5 => 0x819b, 0xc6 => 0x5510, 0xc7 => 0x7cd6, 0xc8 => 0x5018, + 0xc9 => 0x8eba, 0xca => 0x6dcc, 0xcb => 0x8d9f, 0xcc => 0x70eb, + 0xcd => 0x638f, 0xce => 0x6d9b, 0xcf => 0x6ed4, 0xd0 => 0x7ee6, + 0xd1 => 0x8404, 0xd2 => 0x6843, 0xd3 => 0x9003, 0xd4 => 0x6dd8, + 0xd5 => 0x9676, 0xd6 => 0x8ba8, 0xd7 => 0x5957, 0xd8 => 0x7279, + 0xd9 => 0x85e4, 0xda => 0x817e, 0xdb => 0x75bc, 0xdc => 0x8a8a, + 0xdd => 0x68af, 0xde => 0x5254, 0xdf => 0x8e22, 0xe0 => 0x9511, + 0xe1 => 0x63d0, 0xe2 => 0x9898, 0xe3 => 0x8e44, 0xe4 => 0x557c, + 0xe5 => 0x4f53, 0xe6 => 0x66ff, 0xe7 => 0x568f, 0xe8 => 0x60d5, + 0xe9 => 0x6d95, 0xea => 0x5243, 0xeb => 0x5c49, 0xec => 0x5929, + 0xed => 0x6dfb, 0xee => 0x586b, 0xef => 0x7530, 0xf0 => 0x751c, + 0xf1 => 0x606c, 0xf2 => 0x8214, 0xf3 => 0x8146, 0xf4 => 0x6311, + 0xf5 => 0x6761, 0xf6 => 0x8fe2, 0xf7 => 0x773a, 0xf8 => 0x8df3, + 0xf9 => 0x8d34, 0xfa => 0x94c1, 0xfb => 0x5e16, 0xfc => 0x5385, + 0xfd => 0x542c, 0xfe => 0x70c3, + }, + 0xcd => { + 0xa1 => 0x6c40, 0xa2 => 0x5ef7, 0xa3 => 0x505c, 0xa4 => 0x4ead, + 0xa5 => 0x5ead, 0xa6 => 0x633a, 0xa7 => 0x8247, 0xa8 => 0x901a, + 0xa9 => 0x6850, 0xaa => 0x916e, 0xab => 0x77b3, 0xac => 0x540c, + 0xad => 0x94dc, 0xae => 0x5f64, 0xaf => 0x7ae5, 0xb0 => 0x6876, + 0xb1 => 0x6345, 0xb2 => 0x7b52, 0xb3 => 0x7edf, 0xb4 => 0x75db, + 0xb5 => 0x5077, 0xb6 => 0x6295, 0xb7 => 0x5934, 0xb8 => 0x900f, + 0xb9 => 0x51f8, 0xba => 0x79c3, 0xbb => 0x7a81, 0xbc => 0x56fe, + 0xbd => 0x5f92, 0xbe => 0x9014, 0xbf => 0x6d82, 0xc0 => 0x5c60, + 0xc1 => 0x571f, 0xc2 => 0x5410, 0xc3 => 0x5154, 0xc4 => 0x6e4d, + 0xc5 => 0x56e2, 0xc6 => 0x63a8, 0xc7 => 0x9893, 0xc8 => 0x817f, + 0xc9 => 0x8715, 0xca => 0x892a, 0xcb => 0x9000, 0xcc => 0x541e, + 0xcd => 0x5c6f, 0xce => 0x81c0, 0xcf => 0x62d6, 0xd0 => 0x6258, + 0xd1 => 0x8131, 0xd2 => 0x9e35, 0xd3 => 0x9640, 0xd4 => 0x9a6e, + 0xd5 => 0x9a7c, 0xd6 => 0x692d, 0xd7 => 0x59a5, 0xd8 => 0x62d3, + 0xd9 => 0x553e, 0xda => 0x6316, 0xdb => 0x54c7, 0xdc => 0x86d9, + 0xdd => 0x6d3c, 0xde => 0x5a03, 0xdf => 0x74e6, 0xe0 => 0x889c, + 0xe1 => 0x6b6a, 0xe2 => 0x5916, 0xe3 => 0x8c4c, 0xe4 => 0x5f2f, + 0xe5 => 0x6e7e, 0xe6 => 0x73a9, 0xe7 => 0x987d, 0xe8 => 0x4e38, + 0xe9 => 0x70f7, 0xea => 0x5b8c, 0xeb => 0x7897, 0xec => 0x633d, + 0xed => 0x665a, 0xee => 0x7696, 0xef => 0x60cb, 0xf0 => 0x5b9b, + 0xf1 => 0x5a49, 0xf2 => 0x4e07, 0xf3 => 0x8155, 0xf4 => 0x6c6a, + 0xf5 => 0x738b, 0xf6 => 0x4ea1, 0xf7 => 0x6789, 0xf8 => 0x7f51, + 0xf9 => 0x5f80, 0xfa => 0x65fa, 0xfb => 0x671b, 0xfc => 0x5fd8, + 0xfd => 0x5984, 0xfe => 0x5a01, + }, + 0xce => { + 0xa1 => 0x5dcd, 0xa2 => 0x5fae, 0xa3 => 0x5371, 0xa4 => 0x97e6, + 0xa5 => 0x8fdd, 0xa6 => 0x6845, 0xa7 => 0x56f4, 0xa8 => 0x552f, + 0xa9 => 0x60df, 0xaa => 0x4e3a, 0xab => 0x6f4d, 0xac => 0x7ef4, + 0xad => 0x82c7, 0xae => 0x840e, 0xaf => 0x59d4, 0xb0 => 0x4f1f, + 0xb1 => 0x4f2a, 0xb2 => 0x5c3e, 0xb3 => 0x7eac, 0xb4 => 0x672a, + 0xb5 => 0x851a, 0xb6 => 0x5473, 0xb7 => 0x754f, 0xb8 => 0x80c3, + 0xb9 => 0x5582, 0xba => 0x9b4f, 0xbb => 0x4f4d, 0xbc => 0x6e2d, + 0xbd => 0x8c13, 0xbe => 0x5c09, 0xbf => 0x6170, 0xc0 => 0x536b, + 0xc1 => 0x761f, 0xc2 => 0x6e29, 0xc3 => 0x868a, 0xc4 => 0x6587, + 0xc5 => 0x95fb, 0xc6 => 0x7eb9, 0xc7 => 0x543b, 0xc8 => 0x7a33, + 0xc9 => 0x7d0a, 0xca => 0x95ee, 0xcb => 0x55e1, 0xcc => 0x7fc1, + 0xcd => 0x74ee, 0xce => 0x631d, 0xcf => 0x8717, 0xd0 => 0x6da1, + 0xd1 => 0x7a9d, 0xd2 => 0x6211, 0xd3 => 0x65a1, 0xd4 => 0x5367, + 0xd5 => 0x63e1, 0xd6 => 0x6c83, 0xd7 => 0x5deb, 0xd8 => 0x545c, + 0xd9 => 0x94a8, 0xda => 0x4e4c, 0xdb => 0x6c61, 0xdc => 0x8bec, + 0xdd => 0x5c4b, 0xde => 0x65e0, 0xdf => 0x829c, 0xe0 => 0x68a7, + 0xe1 => 0x543e, 0xe2 => 0x5434, 0xe3 => 0x6bcb, 0xe4 => 0x6b66, + 0xe5 => 0x4e94, 0xe6 => 0x6342, 0xe7 => 0x5348, 0xe8 => 0x821e, + 0xe9 => 0x4f0d, 0xea => 0x4fae, 0xeb => 0x575e, 0xec => 0x620a, + 0xed => 0x96fe, 0xee => 0x6664, 0xef => 0x7269, 0xf0 => 0x52ff, + 0xf1 => 0x52a1, 0xf2 => 0x609f, 0xf3 => 0x8bef, 0xf4 => 0x6614, + 0xf5 => 0x7199, 0xf6 => 0x6790, 0xf7 => 0x897f, 0xf8 => 0x7852, + 0xf9 => 0x77fd, 0xfa => 0x6670, 0xfb => 0x563b, 0xfc => 0x5438, + 0xfd => 0x9521, 0xfe => 0x727a, + }, + 0xcf => { + 0xa1 => 0x7a00, 0xa2 => 0x606f, 0xa3 => 0x5e0c, 0xa4 => 0x6089, + 0xa5 => 0x819d, 0xa6 => 0x5915, 0xa7 => 0x60dc, 0xa8 => 0x7184, + 0xa9 => 0x70ef, 0xaa => 0x6eaa, 0xab => 0x6c50, 0xac => 0x7280, + 0xad => 0x6a84, 0xae => 0x88ad, 0xaf => 0x5e2d, 0xb0 => 0x4e60, + 0xb1 => 0x5ab3, 0xb2 => 0x559c, 0xb3 => 0x94e3, 0xb4 => 0x6d17, + 0xb5 => 0x7cfb, 0xb6 => 0x9699, 0xb7 => 0x620f, 0xb8 => 0x7ec6, + 0xb9 => 0x778e, 0xba => 0x867e, 0xbb => 0x5323, 0xbc => 0x971e, + 0xbd => 0x8f96, 0xbe => 0x6687, 0xbf => 0x5ce1, 0xc0 => 0x4fa0, + 0xc1 => 0x72ed, 0xc2 => 0x4e0b, 0xc3 => 0x53a6, 0xc4 => 0x590f, + 0xc5 => 0x5413, 0xc6 => 0x6380, 0xc7 => 0x9528, 0xc8 => 0x5148, + 0xc9 => 0x4ed9, 0xca => 0x9c9c, 0xcb => 0x7ea4, 0xcc => 0x54b8, + 0xcd => 0x8d24, 0xce => 0x8854, 0xcf => 0x8237, 0xd0 => 0x95f2, + 0xd1 => 0x6d8e, 0xd2 => 0x5f26, 0xd3 => 0x5acc, 0xd4 => 0x663e, + 0xd5 => 0x9669, 0xd6 => 0x73b0, 0xd7 => 0x732e, 0xd8 => 0x53bf, + 0xd9 => 0x817a, 0xda => 0x9985, 0xdb => 0x7fa1, 0xdc => 0x5baa, + 0xdd => 0x9677, 0xde => 0x9650, 0xdf => 0x7ebf, 0xe0 => 0x76f8, + 0xe1 => 0x53a2, 0xe2 => 0x9576, 0xe3 => 0x9999, 0xe4 => 0x7bb1, + 0xe5 => 0x8944, 0xe6 => 0x6e58, 0xe7 => 0x4e61, 0xe8 => 0x7fd4, + 0xe9 => 0x7965, 0xea => 0x8be6, 0xeb => 0x60f3, 0xec => 0x54cd, + 0xed => 0x4eab, 0xee => 0x9879, 0xef => 0x5df7, 0xf0 => 0x6a61, + 0xf1 => 0x50cf, 0xf2 => 0x5411, 0xf3 => 0x8c61, 0xf4 => 0x8427, + 0xf5 => 0x785d, 0xf6 => 0x9704, 0xf7 => 0x524a, 0xf8 => 0x54ee, + 0xf9 => 0x56a3, 0xfa => 0x9500, 0xfb => 0x6d88, 0xfc => 0x5bb5, + 0xfd => 0x6dc6, 0xfe => 0x6653, + }, + 0xd0 => { + 0xa1 => 0x5c0f, 0xa2 => 0x5b5d, 0xa3 => 0x6821, 0xa4 => 0x8096, + 0xa5 => 0x5578, 0xa6 => 0x7b11, 0xa7 => 0x6548, 0xa8 => 0x6954, + 0xa9 => 0x4e9b, 0xaa => 0x6b47, 0xab => 0x874e, 0xac => 0x978b, + 0xad => 0x534f, 0xae => 0x631f, 0xaf => 0x643a, 0xb0 => 0x90aa, + 0xb1 => 0x659c, 0xb2 => 0x80c1, 0xb3 => 0x8c10, 0xb4 => 0x5199, + 0xb5 => 0x68b0, 0xb6 => 0x5378, 0xb7 => 0x87f9, 0xb8 => 0x61c8, + 0xb9 => 0x6cc4, 0xba => 0x6cfb, 0xbb => 0x8c22, 0xbc => 0x5c51, + 0xbd => 0x85aa, 0xbe => 0x82af, 0xbf => 0x950c, 0xc0 => 0x6b23, + 0xc1 => 0x8f9b, 0xc2 => 0x65b0, 0xc3 => 0x5ffb, 0xc4 => 0x5fc3, + 0xc5 => 0x4fe1, 0xc6 => 0x8845, 0xc7 => 0x661f, 0xc8 => 0x8165, + 0xc9 => 0x7329, 0xca => 0x60fa, 0xcb => 0x5174, 0xcc => 0x5211, + 0xcd => 0x578b, 0xce => 0x5f62, 0xcf => 0x90a2, 0xd0 => 0x884c, + 0xd1 => 0x9192, 0xd2 => 0x5e78, 0xd3 => 0x674f, 0xd4 => 0x6027, + 0xd5 => 0x59d3, 0xd6 => 0x5144, 0xd7 => 0x51f6, 0xd8 => 0x80f8, + 0xd9 => 0x5308, 0xda => 0x6c79, 0xdb => 0x96c4, 0xdc => 0x718a, + 0xdd => 0x4f11, 0xde => 0x4fee, 0xdf => 0x7f9e, 0xe0 => 0x673d, + 0xe1 => 0x55c5, 0xe2 => 0x9508, 0xe3 => 0x79c0, 0xe4 => 0x8896, + 0xe5 => 0x7ee3, 0xe6 => 0x589f, 0xe7 => 0x620c, 0xe8 => 0x9700, + 0xe9 => 0x865a, 0xea => 0x5618, 0xeb => 0x987b, 0xec => 0x5f90, + 0xed => 0x8bb8, 0xee => 0x84c4, 0xef => 0x9157, 0xf0 => 0x53d9, + 0xf1 => 0x65ed, 0xf2 => 0x5e8f, 0xf3 => 0x755c, 0xf4 => 0x6064, + 0xf5 => 0x7d6e, 0xf6 => 0x5a7f, 0xf7 => 0x7eea, 0xf8 => 0x7eed, + 0xf9 => 0x8f69, 0xfa => 0x55a7, 0xfb => 0x5ba3, 0xfc => 0x60ac, + 0xfd => 0x65cb, 0xfe => 0x7384, + }, + 0xd1 => { + 0xa1 => 0x9009, 0xa2 => 0x7663, 0xa3 => 0x7729, 0xa4 => 0x7eda, + 0xa5 => 0x9774, 0xa6 => 0x859b, 0xa7 => 0x5b66, 0xa8 => 0x7a74, + 0xa9 => 0x96ea, 0xaa => 0x8840, 0xab => 0x52cb, 0xac => 0x718f, + 0xad => 0x5faa, 0xae => 0x65ec, 0xaf => 0x8be2, 0xb0 => 0x5bfb, + 0xb1 => 0x9a6f, 0xb2 => 0x5de1, 0xb3 => 0x6b89, 0xb4 => 0x6c5b, + 0xb5 => 0x8bad, 0xb6 => 0x8baf, 0xb7 => 0x900a, 0xb8 => 0x8fc5, + 0xb9 => 0x538b, 0xba => 0x62bc, 0xbb => 0x9e26, 0xbc => 0x9e2d, + 0xbd => 0x5440, 0xbe => 0x4e2b, 0xbf => 0x82bd, 0xc0 => 0x7259, + 0xc1 => 0x869c, 0xc2 => 0x5d16, 0xc3 => 0x8859, 0xc4 => 0x6daf, + 0xc5 => 0x96c5, 0xc6 => 0x54d1, 0xc7 => 0x4e9a, 0xc8 => 0x8bb6, + 0xc9 => 0x7109, 0xca => 0x54bd, 0xcb => 0x9609, 0xcc => 0x70df, + 0xcd => 0x6df9, 0xce => 0x76d0, 0xcf => 0x4e25, 0xd0 => 0x7814, + 0xd1 => 0x8712, 0xd2 => 0x5ca9, 0xd3 => 0x5ef6, 0xd4 => 0x8a00, + 0xd5 => 0x989c, 0xd6 => 0x960e, 0xd7 => 0x708e, 0xd8 => 0x6cbf, + 0xd9 => 0x5944, 0xda => 0x63a9, 0xdb => 0x773c, 0xdc => 0x884d, + 0xdd => 0x6f14, 0xde => 0x8273, 0xdf => 0x5830, 0xe0 => 0x71d5, + 0xe1 => 0x538c, 0xe2 => 0x781a, 0xe3 => 0x96c1, 0xe4 => 0x5501, + 0xe5 => 0x5f66, 0xe6 => 0x7130, 0xe7 => 0x5bb4, 0xe8 => 0x8c1a, + 0xe9 => 0x9a8c, 0xea => 0x6b83, 0xeb => 0x592e, 0xec => 0x9e2f, + 0xed => 0x79e7, 0xee => 0x6768, 0xef => 0x626c, 0xf0 => 0x4f6f, + 0xf1 => 0x75a1, 0xf2 => 0x7f8a, 0xf3 => 0x6d0b, 0xf4 => 0x9633, + 0xf5 => 0x6c27, 0xf6 => 0x4ef0, 0xf7 => 0x75d2, 0xf8 => 0x517b, + 0xf9 => 0x6837, 0xfa => 0x6f3e, 0xfb => 0x9080, 0xfc => 0x8170, + 0xfd => 0x5996, 0xfe => 0x7476, + }, + 0xd2 => { + 0xa1 => 0x6447, 0xa2 => 0x5c27, 0xa3 => 0x9065, 0xa4 => 0x7a91, + 0xa5 => 0x8c23, 0xa6 => 0x59da, 0xa7 => 0x54ac, 0xa8 => 0x8200, + 0xa9 => 0x836f, 0xaa => 0x8981, 0xab => 0x8000, 0xac => 0x6930, + 0xad => 0x564e, 0xae => 0x8036, 0xaf => 0x7237, 0xb0 => 0x91ce, + 0xb1 => 0x51b6, 0xb2 => 0x4e5f, 0xb3 => 0x9875, 0xb4 => 0x6396, + 0xb5 => 0x4e1a, 0xb6 => 0x53f6, 0xb7 => 0x66f3, 0xb8 => 0x814b, + 0xb9 => 0x591c, 0xba => 0x6db2, 0xbb => 0x4e00, 0xbc => 0x58f9, + 0xbd => 0x533b, 0xbe => 0x63d6, 0xbf => 0x94f1, 0xc0 => 0x4f9d, + 0xc1 => 0x4f0a, 0xc2 => 0x8863, 0xc3 => 0x9890, 0xc4 => 0x5937, + 0xc5 => 0x9057, 0xc6 => 0x79fb, 0xc7 => 0x4eea, 0xc8 => 0x80f0, + 0xc9 => 0x7591, 0xca => 0x6c82, 0xcb => 0x5b9c, 0xcc => 0x59e8, + 0xcd => 0x5f5d, 0xce => 0x6905, 0xcf => 0x8681, 0xd0 => 0x501a, + 0xd1 => 0x5df2, 0xd2 => 0x4e59, 0xd3 => 0x77e3, 0xd4 => 0x4ee5, + 0xd5 => 0x827a, 0xd6 => 0x6291, 0xd7 => 0x6613, 0xd8 => 0x9091, + 0xd9 => 0x5c79, 0xda => 0x4ebf, 0xdb => 0x5f79, 0xdc => 0x81c6, + 0xdd => 0x9038, 0xde => 0x8084, 0xdf => 0x75ab, 0xe0 => 0x4ea6, + 0xe1 => 0x88d4, 0xe2 => 0x610f, 0xe3 => 0x6bc5, 0xe4 => 0x5fc6, + 0xe5 => 0x4e49, 0xe6 => 0x76ca, 0xe7 => 0x6ea2, 0xe8 => 0x8be3, + 0xe9 => 0x8bae, 0xea => 0x8c0a, 0xeb => 0x8bd1, 0xec => 0x5f02, + 0xed => 0x7ffc, 0xee => 0x7fcc, 0xef => 0x7ece, 0xf0 => 0x8335, + 0xf1 => 0x836b, 0xf2 => 0x56e0, 0xf3 => 0x6bb7, 0xf4 => 0x97f3, + 0xf5 => 0x9634, 0xf6 => 0x59fb, 0xf7 => 0x541f, 0xf8 => 0x94f6, + 0xf9 => 0x6deb, 0xfa => 0x5bc5, 0xfb => 0x996e, 0xfc => 0x5c39, + 0xfd => 0x5f15, 0xfe => 0x9690, + }, + 0xd3 => { + 0xa1 => 0x5370, 0xa2 => 0x82f1, 0xa3 => 0x6a31, 0xa4 => 0x5a74, + 0xa5 => 0x9e70, 0xa6 => 0x5e94, 0xa7 => 0x7f28, 0xa8 => 0x83b9, + 0xa9 => 0x8424, 0xaa => 0x8425, 0xab => 0x8367, 0xac => 0x8747, + 0xad => 0x8fce, 0xae => 0x8d62, 0xaf => 0x76c8, 0xb0 => 0x5f71, + 0xb1 => 0x9896, 0xb2 => 0x786c, 0xb3 => 0x6620, 0xb4 => 0x54df, + 0xb5 => 0x62e5, 0xb6 => 0x4f63, 0xb7 => 0x81c3, 0xb8 => 0x75c8, + 0xb9 => 0x5eb8, 0xba => 0x96cd, 0xbb => 0x8e0a, 0xbc => 0x86f9, + 0xbd => 0x548f, 0xbe => 0x6cf3, 0xbf => 0x6d8c, 0xc0 => 0x6c38, + 0xc1 => 0x607f, 0xc2 => 0x52c7, 0xc3 => 0x7528, 0xc4 => 0x5e7d, + 0xc5 => 0x4f18, 0xc6 => 0x60a0, 0xc7 => 0x5fe7, 0xc8 => 0x5c24, + 0xc9 => 0x7531, 0xca => 0x90ae, 0xcb => 0x94c0, 0xcc => 0x72b9, + 0xcd => 0x6cb9, 0xce => 0x6e38, 0xcf => 0x9149, 0xd0 => 0x6709, + 0xd1 => 0x53cb, 0xd2 => 0x53f3, 0xd3 => 0x4f51, 0xd4 => 0x91c9, + 0xd5 => 0x8bf1, 0xd6 => 0x53c8, 0xd7 => 0x5e7c, 0xd8 => 0x8fc2, + 0xd9 => 0x6de4, 0xda => 0x4e8e, 0xdb => 0x76c2, 0xdc => 0x6986, + 0xdd => 0x865e, 0xde => 0x611a, 0xdf => 0x8206, 0xe0 => 0x4f59, + 0xe1 => 0x4fde, 0xe2 => 0x903e, 0xe3 => 0x9c7c, 0xe4 => 0x6109, + 0xe5 => 0x6e1d, 0xe6 => 0x6e14, 0xe7 => 0x9685, 0xe8 => 0x4e88, + 0xe9 => 0x5a31, 0xea => 0x96e8, 0xeb => 0x4e0e, 0xec => 0x5c7f, + 0xed => 0x79b9, 0xee => 0x5b87, 0xef => 0x8bed, 0xf0 => 0x7fbd, + 0xf1 => 0x7389, 0xf2 => 0x57df, 0xf3 => 0x828b, 0xf4 => 0x90c1, + 0xf5 => 0x5401, 0xf6 => 0x9047, 0xf7 => 0x55bb, 0xf8 => 0x5cea, + 0xf9 => 0x5fa1, 0xfa => 0x6108, 0xfb => 0x6b32, 0xfc => 0x72f1, + 0xfd => 0x80b2, 0xfe => 0x8a89, + }, + 0xd4 => { + 0xa1 => 0x6d74, 0xa2 => 0x5bd3, 0xa3 => 0x88d5, 0xa4 => 0x9884, + 0xa5 => 0x8c6b, 0xa6 => 0x9a6d, 0xa7 => 0x9e33, 0xa8 => 0x6e0a, + 0xa9 => 0x51a4, 0xaa => 0x5143, 0xab => 0x57a3, 0xac => 0x8881, + 0xad => 0x539f, 0xae => 0x63f4, 0xaf => 0x8f95, 0xb0 => 0x56ed, + 0xb1 => 0x5458, 0xb2 => 0x5706, 0xb3 => 0x733f, 0xb4 => 0x6e90, + 0xb5 => 0x7f18, 0xb6 => 0x8fdc, 0xb7 => 0x82d1, 0xb8 => 0x613f, + 0xb9 => 0x6028, 0xba => 0x9662, 0xbb => 0x66f0, 0xbc => 0x7ea6, + 0xbd => 0x8d8a, 0xbe => 0x8dc3, 0xbf => 0x94a5, 0xc0 => 0x5cb3, + 0xc1 => 0x7ca4, 0xc2 => 0x6708, 0xc3 => 0x60a6, 0xc4 => 0x9605, + 0xc5 => 0x8018, 0xc6 => 0x4e91, 0xc7 => 0x90e7, 0xc8 => 0x5300, + 0xc9 => 0x9668, 0xca => 0x5141, 0xcb => 0x8fd0, 0xcc => 0x8574, + 0xcd => 0x915d, 0xce => 0x6655, 0xcf => 0x97f5, 0xd0 => 0x5b55, + 0xd1 => 0x531d, 0xd2 => 0x7838, 0xd3 => 0x6742, 0xd4 => 0x683d, + 0xd5 => 0x54c9, 0xd6 => 0x707e, 0xd7 => 0x5bb0, 0xd8 => 0x8f7d, + 0xd9 => 0x518d, 0xda => 0x5728, 0xdb => 0x54b1, 0xdc => 0x6512, + 0xdd => 0x6682, 0xde => 0x8d5e, 0xdf => 0x8d43, 0xe0 => 0x810f, + 0xe1 => 0x846c, 0xe2 => 0x906d, 0xe3 => 0x7cdf, 0xe4 => 0x51ff, + 0xe5 => 0x85fb, 0xe6 => 0x67a3, 0xe7 => 0x65e9, 0xe8 => 0x6fa1, + 0xe9 => 0x86a4, 0xea => 0x8e81, 0xeb => 0x566a, 0xec => 0x9020, + 0xed => 0x7682, 0xee => 0x7076, 0xef => 0x71e5, 0xf0 => 0x8d23, + 0xf1 => 0x62e9, 0xf2 => 0x5219, 0xf3 => 0x6cfd, 0xf4 => 0x8d3c, + 0xf5 => 0x600e, 0xf6 => 0x589e, 0xf7 => 0x618e, 0xf8 => 0x66fe, + 0xf9 => 0x8d60, 0xfa => 0x624e, 0xfb => 0x55b3, 0xfc => 0x6e23, + 0xfd => 0x672d, 0xfe => 0x8f67, + }, + 0xd5 => { + 0xa1 => 0x94e1, 0xa2 => 0x95f8, 0xa3 => 0x7728, 0xa4 => 0x6805, + 0xa5 => 0x69a8, 0xa6 => 0x548b, 0xa7 => 0x4e4d, 0xa8 => 0x70b8, + 0xa9 => 0x8bc8, 0xaa => 0x6458, 0xab => 0x658b, 0xac => 0x5b85, + 0xad => 0x7a84, 0xae => 0x503a, 0xaf => 0x5be8, 0xb0 => 0x77bb, + 0xb1 => 0x6be1, 0xb2 => 0x8a79, 0xb3 => 0x7c98, 0xb4 => 0x6cbe, + 0xb5 => 0x76cf, 0xb6 => 0x65a9, 0xb7 => 0x8f97, 0xb8 => 0x5d2d, + 0xb9 => 0x5c55, 0xba => 0x8638, 0xbb => 0x6808, 0xbc => 0x5360, + 0xbd => 0x6218, 0xbe => 0x7ad9, 0xbf => 0x6e5b, 0xc0 => 0x7efd, + 0xc1 => 0x6a1f, 0xc2 => 0x7ae0, 0xc3 => 0x5f70, 0xc4 => 0x6f33, + 0xc5 => 0x5f20, 0xc6 => 0x638c, 0xc7 => 0x6da8, 0xc8 => 0x6756, + 0xc9 => 0x4e08, 0xca => 0x5e10, 0xcb => 0x8d26, 0xcc => 0x4ed7, + 0xcd => 0x80c0, 0xce => 0x7634, 0xcf => 0x969c, 0xd0 => 0x62db, + 0xd1 => 0x662d, 0xd2 => 0x627e, 0xd3 => 0x6cbc, 0xd4 => 0x8d75, + 0xd5 => 0x7167, 0xd6 => 0x7f69, 0xd7 => 0x5146, 0xd8 => 0x8087, + 0xd9 => 0x53ec, 0xda => 0x906e, 0xdb => 0x6298, 0xdc => 0x54f2, + 0xdd => 0x86f0, 0xde => 0x8f99, 0xdf => 0x8005, 0xe0 => 0x9517, + 0xe1 => 0x8517, 0xe2 => 0x8fd9, 0xe3 => 0x6d59, 0xe4 => 0x73cd, + 0xe5 => 0x659f, 0xe6 => 0x771f, 0xe7 => 0x7504, 0xe8 => 0x7827, + 0xe9 => 0x81fb, 0xea => 0x8d1e, 0xeb => 0x9488, 0xec => 0x4fa6, + 0xed => 0x6795, 0xee => 0x75b9, 0xef => 0x8bca, 0xf0 => 0x9707, + 0xf1 => 0x632f, 0xf2 => 0x9547, 0xf3 => 0x9635, 0xf4 => 0x84b8, + 0xf5 => 0x6323, 0xf6 => 0x7741, 0xf7 => 0x5f81, 0xf8 => 0x72f0, + 0xf9 => 0x4e89, 0xfa => 0x6014, 0xfb => 0x6574, 0xfc => 0x62ef, + 0xfd => 0x6b63, 0xfe => 0x653f, + }, + 0xd6 => { + 0xa1 => 0x5e27, 0xa2 => 0x75c7, 0xa3 => 0x90d1, 0xa4 => 0x8bc1, + 0xa5 => 0x829d, 0xa6 => 0x679d, 0xa7 => 0x652f, 0xa8 => 0x5431, + 0xa9 => 0x8718, 0xaa => 0x77e5, 0xab => 0x80a2, 0xac => 0x8102, + 0xad => 0x6c41, 0xae => 0x4e4b, 0xaf => 0x7ec7, 0xb0 => 0x804c, + 0xb1 => 0x76f4, 0xb2 => 0x690d, 0xb3 => 0x6b96, 0xb4 => 0x6267, + 0xb5 => 0x503c, 0xb6 => 0x4f84, 0xb7 => 0x5740, 0xb8 => 0x6307, + 0xb9 => 0x6b62, 0xba => 0x8dbe, 0xbb => 0x53ea, 0xbc => 0x65e8, + 0xbd => 0x7eb8, 0xbe => 0x5fd7, 0xbf => 0x631a, 0xc0 => 0x63b7, + 0xc1 => 0x81f3, 0xc2 => 0x81f4, 0xc3 => 0x7f6e, 0xc4 => 0x5e1c, + 0xc5 => 0x5cd9, 0xc6 => 0x5236, 0xc7 => 0x667a, 0xc8 => 0x79e9, + 0xc9 => 0x7a1a, 0xca => 0x8d28, 0xcb => 0x7099, 0xcc => 0x75d4, + 0xcd => 0x6ede, 0xce => 0x6cbb, 0xcf => 0x7a92, 0xd0 => 0x4e2d, + 0xd1 => 0x76c5, 0xd2 => 0x5fe0, 0xd3 => 0x949f, 0xd4 => 0x8877, + 0xd5 => 0x7ec8, 0xd6 => 0x79cd, 0xd7 => 0x80bf, 0xd8 => 0x91cd, + 0xd9 => 0x4ef2, 0xda => 0x4f17, 0xdb => 0x821f, 0xdc => 0x5468, + 0xdd => 0x5dde, 0xde => 0x6d32, 0xdf => 0x8bcc, 0xe0 => 0x7ca5, + 0xe1 => 0x8f74, 0xe2 => 0x8098, 0xe3 => 0x5e1a, 0xe4 => 0x5492, + 0xe5 => 0x76b1, 0xe6 => 0x5b99, 0xe7 => 0x663c, 0xe8 => 0x9aa4, + 0xe9 => 0x73e0, 0xea => 0x682a, 0xeb => 0x86db, 0xec => 0x6731, + 0xed => 0x732a, 0xee => 0x8bf8, 0xef => 0x8bdb, 0xf0 => 0x9010, + 0xf1 => 0x7af9, 0xf2 => 0x70db, 0xf3 => 0x716e, 0xf4 => 0x62c4, + 0xf5 => 0x77a9, 0xf6 => 0x5631, 0xf7 => 0x4e3b, 0xf8 => 0x8457, + 0xf9 => 0x67f1, 0xfa => 0x52a9, 0xfb => 0x86c0, 0xfc => 0x8d2e, + 0xfd => 0x94f8, 0xfe => 0x7b51, + }, + 0xd7 => { + 0xa1 => 0x4f4f, 0xa2 => 0x6ce8, 0xa3 => 0x795d, 0xa4 => 0x9a7b, + 0xa5 => 0x6293, 0xa6 => 0x722a, 0xa7 => 0x62fd, 0xa8 => 0x4e13, + 0xa9 => 0x7816, 0xaa => 0x8f6c, 0xab => 0x64b0, 0xac => 0x8d5a, + 0xad => 0x7bc6, 0xae => 0x6869, 0xaf => 0x5e84, 0xb0 => 0x88c5, + 0xb1 => 0x5986, 0xb2 => 0x649e, 0xb3 => 0x58ee, 0xb4 => 0x72b6, + 0xb5 => 0x690e, 0xb6 => 0x9525, 0xb7 => 0x8ffd, 0xb8 => 0x8d58, + 0xb9 => 0x5760, 0xba => 0x7f00, 0xbb => 0x8c06, 0xbc => 0x51c6, + 0xbd => 0x6349, 0xbe => 0x62d9, 0xbf => 0x5353, 0xc0 => 0x684c, + 0xc1 => 0x7422, 0xc2 => 0x8301, 0xc3 => 0x914c, 0xc4 => 0x5544, + 0xc5 => 0x7740, 0xc6 => 0x707c, 0xc7 => 0x6d4a, 0xc8 => 0x5179, + 0xc9 => 0x54a8, 0xca => 0x8d44, 0xcb => 0x59ff, 0xcc => 0x6ecb, + 0xcd => 0x6dc4, 0xce => 0x5b5c, 0xcf => 0x7d2b, 0xd0 => 0x4ed4, + 0xd1 => 0x7c7d, 0xd2 => 0x6ed3, 0xd3 => 0x5b50, 0xd4 => 0x81ea, + 0xd5 => 0x6e0d, 0xd6 => 0x5b57, 0xd7 => 0x9b03, 0xd8 => 0x68d5, + 0xd9 => 0x8e2a, 0xda => 0x5b97, 0xdb => 0x7efc, 0xdc => 0x603b, + 0xdd => 0x7eb5, 0xde => 0x90b9, 0xdf => 0x8d70, 0xe0 => 0x594f, + 0xe1 => 0x63cd, 0xe2 => 0x79df, 0xe3 => 0x8db3, 0xe4 => 0x5352, + 0xe5 => 0x65cf, 0xe6 => 0x7956, 0xe7 => 0x8bc5, 0xe8 => 0x963b, + 0xe9 => 0x7ec4, 0xea => 0x94bb, 0xeb => 0x7e82, 0xec => 0x5634, + 0xed => 0x9189, 0xee => 0x6700, 0xef => 0x7f6a, 0xf0 => 0x5c0a, + 0xf1 => 0x9075, 0xf2 => 0x6628, 0xf3 => 0x5de6, 0xf4 => 0x4f50, + 0xf5 => 0x67de, 0xf6 => 0x505a, 0xf7 => 0x4f5c, 0xf8 => 0x5750, + 0xf9 => 0x5ea7, + }, + 0xd8 => { + 0xa1 => 0x4e8d, 0xa2 => 0x4e0c, 0xa3 => 0x5140, 0xa4 => 0x4e10, + 0xa5 => 0x5eff, 0xa6 => 0x5345, 0xa7 => 0x4e15, 0xa8 => 0x4e98, + 0xa9 => 0x4e1e, 0xaa => 0x9b32, 0xab => 0x5b6c, 0xac => 0x5669, + 0xad => 0x4e28, 0xae => 0x79ba, 0xaf => 0x4e3f, 0xb0 => 0x5315, + 0xb1 => 0x4e47, 0xb2 => 0x592d, 0xb3 => 0x723b, 0xb4 => 0x536e, + 0xb5 => 0x6c10, 0xb6 => 0x56df, 0xb7 => 0x80e4, 0xb8 => 0x9997, + 0xb9 => 0x6bd3, 0xba => 0x777e, 0xbb => 0x9f17, 0xbc => 0x4e36, + 0xbd => 0x4e9f, 0xbe => 0x9f10, 0xbf => 0x4e5c, 0xc0 => 0x4e69, + 0xc1 => 0x4e93, 0xc2 => 0x8288, 0xc3 => 0x5b5b, 0xc4 => 0x556c, + 0xc5 => 0x560f, 0xc6 => 0x4ec4, 0xc7 => 0x538d, 0xc8 => 0x539d, + 0xc9 => 0x53a3, 0xca => 0x53a5, 0xcb => 0x53ae, 0xcc => 0x9765, + 0xcd => 0x8d5d, 0xce => 0x531a, 0xcf => 0x53f5, 0xd0 => 0x5326, + 0xd1 => 0x532e, 0xd2 => 0x533e, 0xd3 => 0x8d5c, 0xd4 => 0x5366, + 0xd5 => 0x5363, 0xd6 => 0x5202, 0xd7 => 0x5208, 0xd8 => 0x520e, + 0xd9 => 0x522d, 0xda => 0x5233, 0xdb => 0x523f, 0xdc => 0x5240, + 0xdd => 0x524c, 0xde => 0x525e, 0xdf => 0x5261, 0xe0 => 0x525c, + 0xe1 => 0x84af, 0xe2 => 0x527d, 0xe3 => 0x5282, 0xe4 => 0x5281, + 0xe5 => 0x5290, 0xe6 => 0x5293, 0xe7 => 0x5182, 0xe8 => 0x7f54, + 0xe9 => 0x4ebb, 0xea => 0x4ec3, 0xeb => 0x4ec9, 0xec => 0x4ec2, + 0xed => 0x4ee8, 0xee => 0x4ee1, 0xef => 0x4eeb, 0xf0 => 0x4ede, + 0xf1 => 0x4f1b, 0xf2 => 0x4ef3, 0xf3 => 0x4f22, 0xf4 => 0x4f64, + 0xf5 => 0x4ef5, 0xf6 => 0x4f25, 0xf7 => 0x4f27, 0xf8 => 0x4f09, + 0xf9 => 0x4f2b, 0xfa => 0x4f5e, 0xfb => 0x4f67, 0xfc => 0x6538, + 0xfd => 0x4f5a, 0xfe => 0x4f5d, + }, + 0xd9 => { + 0xa1 => 0x4f5f, 0xa2 => 0x4f57, 0xa3 => 0x4f32, 0xa4 => 0x4f3d, + 0xa5 => 0x4f76, 0xa6 => 0x4f74, 0xa7 => 0x4f91, 0xa8 => 0x4f89, + 0xa9 => 0x4f83, 0xaa => 0x4f8f, 0xab => 0x4f7e, 0xac => 0x4f7b, + 0xad => 0x4faa, 0xae => 0x4f7c, 0xaf => 0x4fac, 0xb0 => 0x4f94, + 0xb1 => 0x4fe6, 0xb2 => 0x4fe8, 0xb3 => 0x4fea, 0xb4 => 0x4fc5, + 0xb5 => 0x4fda, 0xb6 => 0x4fe3, 0xb7 => 0x4fdc, 0xb8 => 0x4fd1, + 0xb9 => 0x4fdf, 0xba => 0x4ff8, 0xbb => 0x5029, 0xbc => 0x504c, + 0xbd => 0x4ff3, 0xbe => 0x502c, 0xbf => 0x500f, 0xc0 => 0x502e, + 0xc1 => 0x502d, 0xc2 => 0x4ffe, 0xc3 => 0x501c, 0xc4 => 0x500c, + 0xc5 => 0x5025, 0xc6 => 0x5028, 0xc7 => 0x507e, 0xc8 => 0x5043, + 0xc9 => 0x5055, 0xca => 0x5048, 0xcb => 0x504e, 0xcc => 0x506c, + 0xcd => 0x507b, 0xce => 0x50a5, 0xcf => 0x50a7, 0xd0 => 0x50a9, + 0xd1 => 0x50ba, 0xd2 => 0x50d6, 0xd3 => 0x5106, 0xd4 => 0x50ed, + 0xd5 => 0x50ec, 0xd6 => 0x50e6, 0xd7 => 0x50ee, 0xd8 => 0x5107, + 0xd9 => 0x510b, 0xda => 0x4edd, 0xdb => 0x6c3d, 0xdc => 0x4f58, + 0xdd => 0x4f65, 0xde => 0x4fce, 0xdf => 0x9fa0, 0xe0 => 0x6c46, + 0xe1 => 0x7c74, 0xe2 => 0x516e, 0xe3 => 0x5dfd, 0xe4 => 0x9ec9, + 0xe5 => 0x9998, 0xe6 => 0x5181, 0xe7 => 0x5914, 0xe8 => 0x52f9, + 0xe9 => 0x530d, 0xea => 0x8a07, 0xeb => 0x5310, 0xec => 0x51eb, + 0xed => 0x5919, 0xee => 0x5155, 0xef => 0x4ea0, 0xf0 => 0x5156, + 0xf1 => 0x4eb3, 0xf2 => 0x886e, 0xf3 => 0x88a4, 0xf4 => 0x4eb5, + 0xf5 => 0x8114, 0xf6 => 0x88d2, 0xf7 => 0x7980, 0xf8 => 0x5b34, + 0xf9 => 0x8803, 0xfa => 0x7fb8, 0xfb => 0x51ab, 0xfc => 0x51b1, + 0xfd => 0x51bd, 0xfe => 0x51bc, + }, + 0xda => { + 0xa1 => 0x51c7, 0xa2 => 0x5196, 0xa3 => 0x51a2, 0xa4 => 0x51a5, + 0xa5 => 0x8ba0, 0xa6 => 0x8ba6, 0xa7 => 0x8ba7, 0xa8 => 0x8baa, + 0xa9 => 0x8bb4, 0xaa => 0x8bb5, 0xab => 0x8bb7, 0xac => 0x8bc2, + 0xad => 0x8bc3, 0xae => 0x8bcb, 0xaf => 0x8bcf, 0xb0 => 0x8bce, + 0xb1 => 0x8bd2, 0xb2 => 0x8bd3, 0xb3 => 0x8bd4, 0xb4 => 0x8bd6, + 0xb5 => 0x8bd8, 0xb6 => 0x8bd9, 0xb7 => 0x8bdc, 0xb8 => 0x8bdf, + 0xb9 => 0x8be0, 0xba => 0x8be4, 0xbb => 0x8be8, 0xbc => 0x8be9, + 0xbd => 0x8bee, 0xbe => 0x8bf0, 0xbf => 0x8bf3, 0xc0 => 0x8bf6, + 0xc1 => 0x8bf9, 0xc2 => 0x8bfc, 0xc3 => 0x8bff, 0xc4 => 0x8c00, + 0xc5 => 0x8c02, 0xc6 => 0x8c04, 0xc7 => 0x8c07, 0xc8 => 0x8c0c, + 0xc9 => 0x8c0f, 0xca => 0x8c11, 0xcb => 0x8c12, 0xcc => 0x8c14, + 0xcd => 0x8c15, 0xce => 0x8c16, 0xcf => 0x8c19, 0xd0 => 0x8c1b, + 0xd1 => 0x8c18, 0xd2 => 0x8c1d, 0xd3 => 0x8c1f, 0xd4 => 0x8c20, + 0xd5 => 0x8c21, 0xd6 => 0x8c25, 0xd7 => 0x8c27, 0xd8 => 0x8c2a, + 0xd9 => 0x8c2b, 0xda => 0x8c2e, 0xdb => 0x8c2f, 0xdc => 0x8c32, + 0xdd => 0x8c33, 0xde => 0x8c35, 0xdf => 0x8c36, 0xe0 => 0x5369, + 0xe1 => 0x537a, 0xe2 => 0x961d, 0xe3 => 0x9622, 0xe4 => 0x9621, + 0xe5 => 0x9631, 0xe6 => 0x962a, 0xe7 => 0x963d, 0xe8 => 0x963c, + 0xe9 => 0x9642, 0xea => 0x9649, 0xeb => 0x9654, 0xec => 0x965f, + 0xed => 0x9667, 0xee => 0x966c, 0xef => 0x9672, 0xf0 => 0x9674, + 0xf1 => 0x9688, 0xf2 => 0x968d, 0xf3 => 0x9697, 0xf4 => 0x96b0, + 0xf5 => 0x9097, 0xf6 => 0x909b, 0xf7 => 0x909d, 0xf8 => 0x9099, + 0xf9 => 0x90ac, 0xfa => 0x90a1, 0xfb => 0x90b4, 0xfc => 0x90b3, + 0xfd => 0x90b6, 0xfe => 0x90ba, + }, + 0xdb => { + 0xa1 => 0x90b8, 0xa2 => 0x90b0, 0xa3 => 0x90cf, 0xa4 => 0x90c5, + 0xa5 => 0x90be, 0xa6 => 0x90d0, 0xa7 => 0x90c4, 0xa8 => 0x90c7, + 0xa9 => 0x90d3, 0xaa => 0x90e6, 0xab => 0x90e2, 0xac => 0x90dc, + 0xad => 0x90d7, 0xae => 0x90db, 0xaf => 0x90eb, 0xb0 => 0x90ef, + 0xb1 => 0x90fe, 0xb2 => 0x9104, 0xb3 => 0x9122, 0xb4 => 0x911e, + 0xb5 => 0x9123, 0xb6 => 0x9131, 0xb7 => 0x912f, 0xb8 => 0x9139, + 0xb9 => 0x9143, 0xba => 0x9146, 0xbb => 0x520d, 0xbc => 0x5942, + 0xbd => 0x52a2, 0xbe => 0x52ac, 0xbf => 0x52ad, 0xc0 => 0x52be, + 0xc1 => 0x54ff, 0xc2 => 0x52d0, 0xc3 => 0x52d6, 0xc4 => 0x52f0, + 0xc5 => 0x53df, 0xc6 => 0x71ee, 0xc7 => 0x77cd, 0xc8 => 0x5ef4, + 0xc9 => 0x51f5, 0xca => 0x51fc, 0xcb => 0x9b2f, 0xcc => 0x53b6, + 0xcd => 0x5f01, 0xce => 0x755a, 0xcf => 0x5def, 0xd0 => 0x574c, + 0xd1 => 0x57a9, 0xd2 => 0x57a1, 0xd3 => 0x587e, 0xd4 => 0x58bc, + 0xd5 => 0x58c5, 0xd6 => 0x58d1, 0xd7 => 0x5729, 0xd8 => 0x572c, + 0xd9 => 0x572a, 0xda => 0x5733, 0xdb => 0x5739, 0xdc => 0x572e, + 0xdd => 0x572f, 0xde => 0x575c, 0xdf => 0x573b, 0xe0 => 0x5742, + 0xe1 => 0x5769, 0xe2 => 0x5785, 0xe3 => 0x576b, 0xe4 => 0x5786, + 0xe5 => 0x577c, 0xe6 => 0x577b, 0xe7 => 0x5768, 0xe8 => 0x576d, + 0xe9 => 0x5776, 0xea => 0x5773, 0xeb => 0x57ad, 0xec => 0x57a4, + 0xed => 0x578c, 0xee => 0x57b2, 0xef => 0x57cf, 0xf0 => 0x57a7, + 0xf1 => 0x57b4, 0xf2 => 0x5793, 0xf3 => 0x57a0, 0xf4 => 0x57d5, + 0xf5 => 0x57d8, 0xf6 => 0x57da, 0xf7 => 0x57d9, 0xf8 => 0x57d2, + 0xf9 => 0x57b8, 0xfa => 0x57f4, 0xfb => 0x57ef, 0xfc => 0x57f8, + 0xfd => 0x57e4, 0xfe => 0x57dd, + }, + 0xdc => { + 0xa1 => 0x580b, 0xa2 => 0x580d, 0xa3 => 0x57fd, 0xa4 => 0x57ed, + 0xa5 => 0x5800, 0xa6 => 0x581e, 0xa7 => 0x5819, 0xa8 => 0x5844, + 0xa9 => 0x5820, 0xaa => 0x5865, 0xab => 0x586c, 0xac => 0x5881, + 0xad => 0x5889, 0xae => 0x589a, 0xaf => 0x5880, 0xb0 => 0x99a8, + 0xb1 => 0x9f19, 0xb2 => 0x61ff, 0xb3 => 0x8279, 0xb4 => 0x827d, + 0xb5 => 0x827f, 0xb6 => 0x828f, 0xb7 => 0x828a, 0xb8 => 0x82a8, + 0xb9 => 0x8284, 0xba => 0x828e, 0xbb => 0x8291, 0xbc => 0x8297, + 0xbd => 0x8299, 0xbe => 0x82ab, 0xbf => 0x82b8, 0xc0 => 0x82be, + 0xc1 => 0x82b0, 0xc2 => 0x82c8, 0xc3 => 0x82ca, 0xc4 => 0x82e3, + 0xc5 => 0x8298, 0xc6 => 0x82b7, 0xc7 => 0x82ae, 0xc8 => 0x82cb, + 0xc9 => 0x82cc, 0xca => 0x82c1, 0xcb => 0x82a9, 0xcc => 0x82b4, + 0xcd => 0x82a1, 0xce => 0x82aa, 0xcf => 0x829f, 0xd0 => 0x82c4, + 0xd1 => 0x82ce, 0xd2 => 0x82a4, 0xd3 => 0x82e1, 0xd4 => 0x8309, + 0xd5 => 0x82f7, 0xd6 => 0x82e4, 0xd7 => 0x830f, 0xd8 => 0x8307, + 0xd9 => 0x82dc, 0xda => 0x82f4, 0xdb => 0x82d2, 0xdc => 0x82d8, + 0xdd => 0x830c, 0xde => 0x82fb, 0xdf => 0x82d3, 0xe0 => 0x8311, + 0xe1 => 0x831a, 0xe2 => 0x8306, 0xe3 => 0x8314, 0xe4 => 0x8315, + 0xe5 => 0x82e0, 0xe6 => 0x82d5, 0xe7 => 0x831c, 0xe8 => 0x8351, + 0xe9 => 0x835b, 0xea => 0x835c, 0xeb => 0x8308, 0xec => 0x8392, + 0xed => 0x833c, 0xee => 0x8334, 0xef => 0x8331, 0xf0 => 0x839b, + 0xf1 => 0x835e, 0xf2 => 0x832f, 0xf3 => 0x834f, 0xf4 => 0x8347, + 0xf5 => 0x8343, 0xf6 => 0x835f, 0xf7 => 0x8340, 0xf8 => 0x8317, + 0xf9 => 0x8360, 0xfa => 0x832d, 0xfb => 0x833a, 0xfc => 0x8333, + 0xfd => 0x8366, 0xfe => 0x8365, + }, + 0xdd => { + 0xa1 => 0x8368, 0xa2 => 0x831b, 0xa3 => 0x8369, 0xa4 => 0x836c, + 0xa5 => 0x836a, 0xa6 => 0x836d, 0xa7 => 0x836e, 0xa8 => 0x83b0, + 0xa9 => 0x8378, 0xaa => 0x83b3, 0xab => 0x83b4, 0xac => 0x83a0, + 0xad => 0x83aa, 0xae => 0x8393, 0xaf => 0x839c, 0xb0 => 0x8385, + 0xb1 => 0x837c, 0xb2 => 0x83b6, 0xb3 => 0x83a9, 0xb4 => 0x837d, + 0xb5 => 0x83b8, 0xb6 => 0x837b, 0xb7 => 0x8398, 0xb8 => 0x839e, + 0xb9 => 0x83a8, 0xba => 0x83ba, 0xbb => 0x83bc, 0xbc => 0x83c1, + 0xbd => 0x8401, 0xbe => 0x83e5, 0xbf => 0x83d8, 0xc0 => 0x5807, + 0xc1 => 0x8418, 0xc2 => 0x840b, 0xc3 => 0x83dd, 0xc4 => 0x83fd, + 0xc5 => 0x83d6, 0xc6 => 0x841c, 0xc7 => 0x8438, 0xc8 => 0x8411, + 0xc9 => 0x8406, 0xca => 0x83d4, 0xcb => 0x83df, 0xcc => 0x840f, + 0xcd => 0x8403, 0xce => 0x83f8, 0xcf => 0x83f9, 0xd0 => 0x83ea, + 0xd1 => 0x83c5, 0xd2 => 0x83c0, 0xd3 => 0x8426, 0xd4 => 0x83f0, + 0xd5 => 0x83e1, 0xd6 => 0x845c, 0xd7 => 0x8451, 0xd8 => 0x845a, + 0xd9 => 0x8459, 0xda => 0x8473, 0xdb => 0x8487, 0xdc => 0x8488, + 0xdd => 0x847a, 0xde => 0x8489, 0xdf => 0x8478, 0xe0 => 0x843c, + 0xe1 => 0x8446, 0xe2 => 0x8469, 0xe3 => 0x8476, 0xe4 => 0x848c, + 0xe5 => 0x848e, 0xe6 => 0x8431, 0xe7 => 0x846d, 0xe8 => 0x84c1, + 0xe9 => 0x84cd, 0xea => 0x84d0, 0xeb => 0x84e6, 0xec => 0x84bd, + 0xed => 0x84d3, 0xee => 0x84ca, 0xef => 0x84bf, 0xf0 => 0x84ba, + 0xf1 => 0x84e0, 0xf2 => 0x84a1, 0xf3 => 0x84b9, 0xf4 => 0x84b4, + 0xf5 => 0x8497, 0xf6 => 0x84e5, 0xf7 => 0x84e3, 0xf8 => 0x850c, + 0xf9 => 0x750d, 0xfa => 0x8538, 0xfb => 0x84f0, 0xfc => 0x8539, + 0xfd => 0x851f, 0xfe => 0x853a, + }, + 0xde => { + 0xa1 => 0x8556, 0xa2 => 0x853b, 0xa3 => 0x84ff, 0xa4 => 0x84fc, + 0xa5 => 0x8559, 0xa6 => 0x8548, 0xa7 => 0x8568, 0xa8 => 0x8564, + 0xa9 => 0x855e, 0xaa => 0x857a, 0xab => 0x77a2, 0xac => 0x8543, + 0xad => 0x8572, 0xae => 0x857b, 0xaf => 0x85a4, 0xb0 => 0x85a8, + 0xb1 => 0x8587, 0xb2 => 0x858f, 0xb3 => 0x8579, 0xb4 => 0x85ae, + 0xb5 => 0x859c, 0xb6 => 0x8585, 0xb7 => 0x85b9, 0xb8 => 0x85b7, + 0xb9 => 0x85b0, 0xba => 0x85d3, 0xbb => 0x85c1, 0xbc => 0x85dc, + 0xbd => 0x85ff, 0xbe => 0x8627, 0xbf => 0x8605, 0xc0 => 0x8629, + 0xc1 => 0x8616, 0xc2 => 0x863c, 0xc3 => 0x5efe, 0xc4 => 0x5f08, + 0xc5 => 0x593c, 0xc6 => 0x5941, 0xc7 => 0x8037, 0xc8 => 0x5955, + 0xc9 => 0x595a, 0xca => 0x5958, 0xcb => 0x530f, 0xcc => 0x5c22, + 0xcd => 0x5c25, 0xce => 0x5c2c, 0xcf => 0x5c34, 0xd0 => 0x624c, + 0xd1 => 0x626a, 0xd2 => 0x629f, 0xd3 => 0x62bb, 0xd4 => 0x62ca, + 0xd5 => 0x62da, 0xd6 => 0x62d7, 0xd7 => 0x62ee, 0xd8 => 0x6322, + 0xd9 => 0x62f6, 0xda => 0x6339, 0xdb => 0x634b, 0xdc => 0x6343, + 0xdd => 0x63ad, 0xde => 0x63f6, 0xdf => 0x6371, 0xe0 => 0x637a, + 0xe1 => 0x638e, 0xe2 => 0x63b4, 0xe3 => 0x636d, 0xe4 => 0x63ac, + 0xe5 => 0x638a, 0xe6 => 0x6369, 0xe7 => 0x63ae, 0xe8 => 0x63bc, + 0xe9 => 0x63f2, 0xea => 0x63f8, 0xeb => 0x63e0, 0xec => 0x63ff, + 0xed => 0x63c4, 0xee => 0x63de, 0xef => 0x63ce, 0xf0 => 0x6452, + 0xf1 => 0x63c6, 0xf2 => 0x63be, 0xf3 => 0x6445, 0xf4 => 0x6441, + 0xf5 => 0x640b, 0xf6 => 0x641b, 0xf7 => 0x6420, 0xf8 => 0x640c, + 0xf9 => 0x6426, 0xfa => 0x6421, 0xfb => 0x645e, 0xfc => 0x6484, + 0xfd => 0x646d, 0xfe => 0x6496, + }, + 0xdf => { + 0xa1 => 0x647a, 0xa2 => 0x64b7, 0xa3 => 0x64b8, 0xa4 => 0x6499, + 0xa5 => 0x64ba, 0xa6 => 0x64c0, 0xa7 => 0x64d0, 0xa8 => 0x64d7, + 0xa9 => 0x64e4, 0xaa => 0x64e2, 0xab => 0x6509, 0xac => 0x6525, + 0xad => 0x652e, 0xae => 0x5f0b, 0xaf => 0x5fd2, 0xb0 => 0x7519, + 0xb1 => 0x5f11, 0xb2 => 0x535f, 0xb3 => 0x53f1, 0xb4 => 0x53fd, + 0xb5 => 0x53e9, 0xb6 => 0x53e8, 0xb7 => 0x53fb, 0xb8 => 0x5412, + 0xb9 => 0x5416, 0xba => 0x5406, 0xbb => 0x544b, 0xbc => 0x5452, + 0xbd => 0x5453, 0xbe => 0x5454, 0xbf => 0x5456, 0xc0 => 0x5443, + 0xc1 => 0x5421, 0xc2 => 0x5457, 0xc3 => 0x5459, 0xc4 => 0x5423, + 0xc5 => 0x5432, 0xc6 => 0x5482, 0xc7 => 0x5494, 0xc8 => 0x5477, + 0xc9 => 0x5471, 0xca => 0x5464, 0xcb => 0x549a, 0xcc => 0x549b, + 0xcd => 0x5484, 0xce => 0x5476, 0xcf => 0x5466, 0xd0 => 0x549d, + 0xd1 => 0x54d0, 0xd2 => 0x54ad, 0xd3 => 0x54c2, 0xd4 => 0x54b4, + 0xd5 => 0x54d2, 0xd6 => 0x54a7, 0xd7 => 0x54a6, 0xd8 => 0x54d3, + 0xd9 => 0x54d4, 0xda => 0x5472, 0xdb => 0x54a3, 0xdc => 0x54d5, + 0xdd => 0x54bb, 0xde => 0x54bf, 0xdf => 0x54cc, 0xe0 => 0x54d9, + 0xe1 => 0x54da, 0xe2 => 0x54dc, 0xe3 => 0x54a9, 0xe4 => 0x54aa, + 0xe5 => 0x54a4, 0xe6 => 0x54dd, 0xe7 => 0x54cf, 0xe8 => 0x54de, + 0xe9 => 0x551b, 0xea => 0x54e7, 0xeb => 0x5520, 0xec => 0x54fd, + 0xed => 0x5514, 0xee => 0x54f3, 0xef => 0x5522, 0xf0 => 0x5523, + 0xf1 => 0x550f, 0xf2 => 0x5511, 0xf3 => 0x5527, 0xf4 => 0x552a, + 0xf5 => 0x5567, 0xf6 => 0x558f, 0xf7 => 0x55b5, 0xf8 => 0x5549, + 0xf9 => 0x556d, 0xfa => 0x5541, 0xfb => 0x5555, 0xfc => 0x553f, + 0xfd => 0x5550, 0xfe => 0x553c, + }, + 0xe0 => { + 0xa1 => 0x5537, 0xa2 => 0x5556, 0xa3 => 0x5575, 0xa4 => 0x5576, + 0xa5 => 0x5577, 0xa6 => 0x5533, 0xa7 => 0x5530, 0xa8 => 0x555c, + 0xa9 => 0x558b, 0xaa => 0x55d2, 0xab => 0x5583, 0xac => 0x55b1, + 0xad => 0x55b9, 0xae => 0x5588, 0xaf => 0x5581, 0xb0 => 0x559f, + 0xb1 => 0x557e, 0xb2 => 0x55d6, 0xb3 => 0x5591, 0xb4 => 0x557b, + 0xb5 => 0x55df, 0xb6 => 0x55bd, 0xb7 => 0x55be, 0xb8 => 0x5594, + 0xb9 => 0x5599, 0xba => 0x55ea, 0xbb => 0x55f7, 0xbc => 0x55c9, + 0xbd => 0x561f, 0xbe => 0x55d1, 0xbf => 0x55eb, 0xc0 => 0x55ec, + 0xc1 => 0x55d4, 0xc2 => 0x55e6, 0xc3 => 0x55dd, 0xc4 => 0x55c4, + 0xc5 => 0x55ef, 0xc6 => 0x55e5, 0xc7 => 0x55f2, 0xc8 => 0x55f3, + 0xc9 => 0x55cc, 0xca => 0x55cd, 0xcb => 0x55e8, 0xcc => 0x55f5, + 0xcd => 0x55e4, 0xce => 0x8f94, 0xcf => 0x561e, 0xd0 => 0x5608, + 0xd1 => 0x560c, 0xd2 => 0x5601, 0xd3 => 0x5624, 0xd4 => 0x5623, + 0xd5 => 0x55fe, 0xd6 => 0x5600, 0xd7 => 0x5627, 0xd8 => 0x562d, + 0xd9 => 0x5658, 0xda => 0x5639, 0xdb => 0x5657, 0xdc => 0x562c, + 0xdd => 0x564d, 0xde => 0x5662, 0xdf => 0x5659, 0xe0 => 0x565c, + 0xe1 => 0x564c, 0xe2 => 0x5654, 0xe3 => 0x5686, 0xe4 => 0x5664, + 0xe5 => 0x5671, 0xe6 => 0x566b, 0xe7 => 0x567b, 0xe8 => 0x567c, + 0xe9 => 0x5685, 0xea => 0x5693, 0xeb => 0x56af, 0xec => 0x56d4, + 0xed => 0x56d7, 0xee => 0x56dd, 0xef => 0x56e1, 0xf0 => 0x56f5, + 0xf1 => 0x56eb, 0xf2 => 0x56f9, 0xf3 => 0x56ff, 0xf4 => 0x5704, + 0xf5 => 0x570a, 0xf6 => 0x5709, 0xf7 => 0x571c, 0xf8 => 0x5e0f, + 0xf9 => 0x5e19, 0xfa => 0x5e14, 0xfb => 0x5e11, 0xfc => 0x5e31, + 0xfd => 0x5e3b, 0xfe => 0x5e3c, + }, + 0xe1 => { + 0xa1 => 0x5e37, 0xa2 => 0x5e44, 0xa3 => 0x5e54, 0xa4 => 0x5e5b, + 0xa5 => 0x5e5e, 0xa6 => 0x5e61, 0xa7 => 0x5c8c, 0xa8 => 0x5c7a, + 0xa9 => 0x5c8d, 0xaa => 0x5c90, 0xab => 0x5c96, 0xac => 0x5c88, + 0xad => 0x5c98, 0xae => 0x5c99, 0xaf => 0x5c91, 0xb0 => 0x5c9a, + 0xb1 => 0x5c9c, 0xb2 => 0x5cb5, 0xb3 => 0x5ca2, 0xb4 => 0x5cbd, + 0xb5 => 0x5cac, 0xb6 => 0x5cab, 0xb7 => 0x5cb1, 0xb8 => 0x5ca3, + 0xb9 => 0x5cc1, 0xba => 0x5cb7, 0xbb => 0x5cc4, 0xbc => 0x5cd2, + 0xbd => 0x5ce4, 0xbe => 0x5ccb, 0xbf => 0x5ce5, 0xc0 => 0x5d02, + 0xc1 => 0x5d03, 0xc2 => 0x5d27, 0xc3 => 0x5d26, 0xc4 => 0x5d2e, + 0xc5 => 0x5d24, 0xc6 => 0x5d1e, 0xc7 => 0x5d06, 0xc8 => 0x5d1b, + 0xc9 => 0x5d58, 0xca => 0x5d3e, 0xcb => 0x5d34, 0xcc => 0x5d3d, + 0xcd => 0x5d6c, 0xce => 0x5d5b, 0xcf => 0x5d6f, 0xd0 => 0x5d5d, + 0xd1 => 0x5d6b, 0xd2 => 0x5d4b, 0xd3 => 0x5d4a, 0xd4 => 0x5d69, + 0xd5 => 0x5d74, 0xd6 => 0x5d82, 0xd7 => 0x5d99, 0xd8 => 0x5d9d, + 0xd9 => 0x8c73, 0xda => 0x5db7, 0xdb => 0x5dc5, 0xdc => 0x5f73, + 0xdd => 0x5f77, 0xde => 0x5f82, 0xdf => 0x5f87, 0xe0 => 0x5f89, + 0xe1 => 0x5f8c, 0xe2 => 0x5f95, 0xe3 => 0x5f99, 0xe4 => 0x5f9c, + 0xe5 => 0x5fa8, 0xe6 => 0x5fad, 0xe7 => 0x5fb5, 0xe8 => 0x5fbc, + 0xe9 => 0x8862, 0xea => 0x5f61, 0xeb => 0x72ad, 0xec => 0x72b0, + 0xed => 0x72b4, 0xee => 0x72b7, 0xef => 0x72b8, 0xf0 => 0x72c3, + 0xf1 => 0x72c1, 0xf2 => 0x72ce, 0xf3 => 0x72cd, 0xf4 => 0x72d2, + 0xf5 => 0x72e8, 0xf6 => 0x72ef, 0xf7 => 0x72e9, 0xf8 => 0x72f2, + 0xf9 => 0x72f4, 0xfa => 0x72f7, 0xfb => 0x7301, 0xfc => 0x72f3, + 0xfd => 0x7303, 0xfe => 0x72fa, + }, + 0xe2 => { + 0xa1 => 0x72fb, 0xa2 => 0x7317, 0xa3 => 0x7313, 0xa4 => 0x7321, + 0xa5 => 0x730a, 0xa6 => 0x731e, 0xa7 => 0x731d, 0xa8 => 0x7315, + 0xa9 => 0x7322, 0xaa => 0x7339, 0xab => 0x7325, 0xac => 0x732c, + 0xad => 0x7338, 0xae => 0x7331, 0xaf => 0x7350, 0xb0 => 0x734d, + 0xb1 => 0x7357, 0xb2 => 0x7360, 0xb3 => 0x736c, 0xb4 => 0x736f, + 0xb5 => 0x737e, 0xb6 => 0x821b, 0xb7 => 0x5925, 0xb8 => 0x98e7, + 0xb9 => 0x5924, 0xba => 0x5902, 0xbb => 0x9963, 0xbc => 0x9967, + 0xbd => 0x9968, 0xbe => 0x9969, 0xbf => 0x996a, 0xc0 => 0x996b, + 0xc1 => 0x996c, 0xc2 => 0x9974, 0xc3 => 0x9977, 0xc4 => 0x997d, + 0xc5 => 0x9980, 0xc6 => 0x9984, 0xc7 => 0x9987, 0xc8 => 0x998a, + 0xc9 => 0x998d, 0xca => 0x9990, 0xcb => 0x9991, 0xcc => 0x9993, + 0xcd => 0x9994, 0xce => 0x9995, 0xcf => 0x5e80, 0xd0 => 0x5e91, + 0xd1 => 0x5e8b, 0xd2 => 0x5e96, 0xd3 => 0x5ea5, 0xd4 => 0x5ea0, + 0xd5 => 0x5eb9, 0xd6 => 0x5eb5, 0xd7 => 0x5ebe, 0xd8 => 0x5eb3, + 0xd9 => 0x8d53, 0xda => 0x5ed2, 0xdb => 0x5ed1, 0xdc => 0x5edb, + 0xdd => 0x5ee8, 0xde => 0x5eea, 0xdf => 0x81ba, 0xe0 => 0x5fc4, + 0xe1 => 0x5fc9, 0xe2 => 0x5fd6, 0xe3 => 0x5fcf, 0xe4 => 0x6003, + 0xe5 => 0x5fee, 0xe6 => 0x6004, 0xe7 => 0x5fe1, 0xe8 => 0x5fe4, + 0xe9 => 0x5ffe, 0xea => 0x6005, 0xeb => 0x6006, 0xec => 0x5fea, + 0xed => 0x5fed, 0xee => 0x5ff8, 0xef => 0x6019, 0xf0 => 0x6035, + 0xf1 => 0x6026, 0xf2 => 0x601b, 0xf3 => 0x600f, 0xf4 => 0x600d, + 0xf5 => 0x6029, 0xf6 => 0x602b, 0xf7 => 0x600a, 0xf8 => 0x603f, + 0xf9 => 0x6021, 0xfa => 0x6078, 0xfb => 0x6079, 0xfc => 0x607b, + 0xfd => 0x607a, 0xfe => 0x6042, + }, + 0xe3 => { + 0xa1 => 0x606a, 0xa2 => 0x607d, 0xa3 => 0x6096, 0xa4 => 0x609a, + 0xa5 => 0x60ad, 0xa6 => 0x609d, 0xa7 => 0x6083, 0xa8 => 0x6092, + 0xa9 => 0x608c, 0xaa => 0x609b, 0xab => 0x60ec, 0xac => 0x60bb, + 0xad => 0x60b1, 0xae => 0x60dd, 0xaf => 0x60d8, 0xb0 => 0x60c6, + 0xb1 => 0x60da, 0xb2 => 0x60b4, 0xb3 => 0x6120, 0xb4 => 0x6126, + 0xb5 => 0x6115, 0xb6 => 0x6123, 0xb7 => 0x60f4, 0xb8 => 0x6100, + 0xb9 => 0x610e, 0xba => 0x612b, 0xbb => 0x614a, 0xbc => 0x6175, + 0xbd => 0x61ac, 0xbe => 0x6194, 0xbf => 0x61a7, 0xc0 => 0x61b7, + 0xc1 => 0x61d4, 0xc2 => 0x61f5, 0xc3 => 0x5fdd, 0xc4 => 0x96b3, + 0xc5 => 0x95e9, 0xc6 => 0x95eb, 0xc7 => 0x95f1, 0xc8 => 0x95f3, + 0xc9 => 0x95f5, 0xca => 0x95f6, 0xcb => 0x95fc, 0xcc => 0x95fe, + 0xcd => 0x9603, 0xce => 0x9604, 0xcf => 0x9606, 0xd0 => 0x9608, + 0xd1 => 0x960a, 0xd2 => 0x960b, 0xd3 => 0x960c, 0xd4 => 0x960d, + 0xd5 => 0x960f, 0xd6 => 0x9612, 0xd7 => 0x9615, 0xd8 => 0x9616, + 0xd9 => 0x9617, 0xda => 0x9619, 0xdb => 0x961a, 0xdc => 0x4e2c, + 0xdd => 0x723f, 0xde => 0x6215, 0xdf => 0x6c35, 0xe0 => 0x6c54, + 0xe1 => 0x6c5c, 0xe2 => 0x6c4a, 0xe3 => 0x6ca3, 0xe4 => 0x6c85, + 0xe5 => 0x6c90, 0xe6 => 0x6c94, 0xe7 => 0x6c8c, 0xe8 => 0x6c68, + 0xe9 => 0x6c69, 0xea => 0x6c74, 0xeb => 0x6c76, 0xec => 0x6c86, + 0xed => 0x6ca9, 0xee => 0x6cd0, 0xef => 0x6cd4, 0xf0 => 0x6cad, + 0xf1 => 0x6cf7, 0xf2 => 0x6cf8, 0xf3 => 0x6cf1, 0xf4 => 0x6cd7, + 0xf5 => 0x6cb2, 0xf6 => 0x6ce0, 0xf7 => 0x6cd6, 0xf8 => 0x6cfa, + 0xf9 => 0x6ceb, 0xfa => 0x6cee, 0xfb => 0x6cb1, 0xfc => 0x6cd3, + 0xfd => 0x6cef, 0xfe => 0x6cfe, + }, + 0xe4 => { + 0xa1 => 0x6d39, 0xa2 => 0x6d27, 0xa3 => 0x6d0c, 0xa4 => 0x6d43, + 0xa5 => 0x6d48, 0xa6 => 0x6d07, 0xa7 => 0x6d04, 0xa8 => 0x6d19, + 0xa9 => 0x6d0e, 0xaa => 0x6d2b, 0xab => 0x6d4d, 0xac => 0x6d2e, + 0xad => 0x6d35, 0xae => 0x6d1a, 0xaf => 0x6d4f, 0xb0 => 0x6d52, + 0xb1 => 0x6d54, 0xb2 => 0x6d33, 0xb3 => 0x6d91, 0xb4 => 0x6d6f, + 0xb5 => 0x6d9e, 0xb6 => 0x6da0, 0xb7 => 0x6d5e, 0xb8 => 0x6d93, + 0xb9 => 0x6d94, 0xba => 0x6d5c, 0xbb => 0x6d60, 0xbc => 0x6d7c, + 0xbd => 0x6d63, 0xbe => 0x6e1a, 0xbf => 0x6dc7, 0xc0 => 0x6dc5, + 0xc1 => 0x6dde, 0xc2 => 0x6e0e, 0xc3 => 0x6dbf, 0xc4 => 0x6de0, + 0xc5 => 0x6e11, 0xc6 => 0x6de6, 0xc7 => 0x6ddd, 0xc8 => 0x6dd9, + 0xc9 => 0x6e16, 0xca => 0x6dab, 0xcb => 0x6e0c, 0xcc => 0x6dae, + 0xcd => 0x6e2b, 0xce => 0x6e6e, 0xcf => 0x6e4e, 0xd0 => 0x6e6b, + 0xd1 => 0x6eb2, 0xd2 => 0x6e5f, 0xd3 => 0x6e86, 0xd4 => 0x6e53, + 0xd5 => 0x6e54, 0xd6 => 0x6e32, 0xd7 => 0x6e25, 0xd8 => 0x6e44, + 0xd9 => 0x6edf, 0xda => 0x6eb1, 0xdb => 0x6e98, 0xdc => 0x6ee0, + 0xdd => 0x6f2d, 0xde => 0x6ee2, 0xdf => 0x6ea5, 0xe0 => 0x6ea7, + 0xe1 => 0x6ebd, 0xe2 => 0x6ebb, 0xe3 => 0x6eb7, 0xe4 => 0x6ed7, + 0xe5 => 0x6eb4, 0xe6 => 0x6ecf, 0xe7 => 0x6e8f, 0xe8 => 0x6ec2, + 0xe9 => 0x6e9f, 0xea => 0x6f62, 0xeb => 0x6f46, 0xec => 0x6f47, + 0xed => 0x6f24, 0xee => 0x6f15, 0xef => 0x6ef9, 0xf0 => 0x6f2f, + 0xf1 => 0x6f36, 0xf2 => 0x6f4b, 0xf3 => 0x6f74, 0xf4 => 0x6f2a, + 0xf5 => 0x6f09, 0xf6 => 0x6f29, 0xf7 => 0x6f89, 0xf8 => 0x6f8d, + 0xf9 => 0x6f8c, 0xfa => 0x6f78, 0xfb => 0x6f72, 0xfc => 0x6f7c, + 0xfd => 0x6f7a, 0xfe => 0x6fd1, + }, + 0xe5 => { + 0xa1 => 0x6fc9, 0xa2 => 0x6fa7, 0xa3 => 0x6fb9, 0xa4 => 0x6fb6, + 0xa5 => 0x6fc2, 0xa6 => 0x6fe1, 0xa7 => 0x6fee, 0xa8 => 0x6fde, + 0xa9 => 0x6fe0, 0xaa => 0x6fef, 0xab => 0x701a, 0xac => 0x7023, + 0xad => 0x701b, 0xae => 0x7039, 0xaf => 0x7035, 0xb0 => 0x704f, + 0xb1 => 0x705e, 0xb2 => 0x5b80, 0xb3 => 0x5b84, 0xb4 => 0x5b95, + 0xb5 => 0x5b93, 0xb6 => 0x5ba5, 0xb7 => 0x5bb8, 0xb8 => 0x752f, + 0xb9 => 0x9a9e, 0xba => 0x6434, 0xbb => 0x5be4, 0xbc => 0x5bee, + 0xbd => 0x8930, 0xbe => 0x5bf0, 0xbf => 0x8e47, 0xc0 => 0x8b07, + 0xc1 => 0x8fb6, 0xc2 => 0x8fd3, 0xc3 => 0x8fd5, 0xc4 => 0x8fe5, + 0xc5 => 0x8fee, 0xc6 => 0x8fe4, 0xc7 => 0x8fe9, 0xc8 => 0x8fe6, + 0xc9 => 0x8ff3, 0xca => 0x8fe8, 0xcb => 0x9005, 0xcc => 0x9004, + 0xcd => 0x900b, 0xce => 0x9026, 0xcf => 0x9011, 0xd0 => 0x900d, + 0xd1 => 0x9016, 0xd2 => 0x9021, 0xd3 => 0x9035, 0xd4 => 0x9036, + 0xd5 => 0x902d, 0xd6 => 0x902f, 0xd7 => 0x9044, 0xd8 => 0x9051, + 0xd9 => 0x9052, 0xda => 0x9050, 0xdb => 0x9068, 0xdc => 0x9058, + 0xdd => 0x9062, 0xde => 0x905b, 0xdf => 0x66b9, 0xe0 => 0x9074, + 0xe1 => 0x907d, 0xe2 => 0x9082, 0xe3 => 0x9088, 0xe4 => 0x9083, + 0xe5 => 0x908b, 0xe6 => 0x5f50, 0xe7 => 0x5f57, 0xe8 => 0x5f56, + 0xe9 => 0x5f58, 0xea => 0x5c3b, 0xeb => 0x54ab, 0xec => 0x5c50, + 0xed => 0x5c59, 0xee => 0x5b71, 0xef => 0x5c63, 0xf0 => 0x5c66, + 0xf1 => 0x7fbc, 0xf2 => 0x5f2a, 0xf3 => 0x5f29, 0xf4 => 0x5f2d, + 0xf5 => 0x8274, 0xf6 => 0x5f3c, 0xf7 => 0x9b3b, 0xf8 => 0x5c6e, + 0xf9 => 0x5981, 0xfa => 0x5983, 0xfb => 0x598d, 0xfc => 0x59a9, + 0xfd => 0x59aa, 0xfe => 0x59a3, + }, + 0xe6 => { + 0xa1 => 0x5997, 0xa2 => 0x59ca, 0xa3 => 0x59ab, 0xa4 => 0x599e, + 0xa5 => 0x59a4, 0xa6 => 0x59d2, 0xa7 => 0x59b2, 0xa8 => 0x59af, + 0xa9 => 0x59d7, 0xaa => 0x59be, 0xab => 0x5a05, 0xac => 0x5a06, + 0xad => 0x59dd, 0xae => 0x5a08, 0xaf => 0x59e3, 0xb0 => 0x59d8, + 0xb1 => 0x59f9, 0xb2 => 0x5a0c, 0xb3 => 0x5a09, 0xb4 => 0x5a32, + 0xb5 => 0x5a34, 0xb6 => 0x5a11, 0xb7 => 0x5a23, 0xb8 => 0x5a13, + 0xb9 => 0x5a40, 0xba => 0x5a67, 0xbb => 0x5a4a, 0xbc => 0x5a55, + 0xbd => 0x5a3c, 0xbe => 0x5a62, 0xbf => 0x5a75, 0xc0 => 0x80ec, + 0xc1 => 0x5aaa, 0xc2 => 0x5a9b, 0xc3 => 0x5a77, 0xc4 => 0x5a7a, + 0xc5 => 0x5abe, 0xc6 => 0x5aeb, 0xc7 => 0x5ab2, 0xc8 => 0x5ad2, + 0xc9 => 0x5ad4, 0xca => 0x5ab8, 0xcb => 0x5ae0, 0xcc => 0x5ae3, + 0xcd => 0x5af1, 0xce => 0x5ad6, 0xcf => 0x5ae6, 0xd0 => 0x5ad8, + 0xd1 => 0x5adc, 0xd2 => 0x5b09, 0xd3 => 0x5b17, 0xd4 => 0x5b16, + 0xd5 => 0x5b32, 0xd6 => 0x5b37, 0xd7 => 0x5b40, 0xd8 => 0x5c15, + 0xd9 => 0x5c1c, 0xda => 0x5b5a, 0xdb => 0x5b65, 0xdc => 0x5b73, + 0xdd => 0x5b51, 0xde => 0x5b53, 0xdf => 0x5b62, 0xe0 => 0x9a75, + 0xe1 => 0x9a77, 0xe2 => 0x9a78, 0xe3 => 0x9a7a, 0xe4 => 0x9a7f, + 0xe5 => 0x9a7d, 0xe6 => 0x9a80, 0xe7 => 0x9a81, 0xe8 => 0x9a85, + 0xe9 => 0x9a88, 0xea => 0x9a8a, 0xeb => 0x9a90, 0xec => 0x9a92, + 0xed => 0x9a93, 0xee => 0x9a96, 0xef => 0x9a98, 0xf0 => 0x9a9b, + 0xf1 => 0x9a9c, 0xf2 => 0x9a9d, 0xf3 => 0x9a9f, 0xf4 => 0x9aa0, + 0xf5 => 0x9aa2, 0xf6 => 0x9aa3, 0xf7 => 0x9aa5, 0xf8 => 0x9aa7, + 0xf9 => 0x7e9f, 0xfa => 0x7ea1, 0xfb => 0x7ea3, 0xfc => 0x7ea5, + 0xfd => 0x7ea8, 0xfe => 0x7ea9, + }, + 0xe7 => { + 0xa1 => 0x7ead, 0xa2 => 0x7eb0, 0xa3 => 0x7ebe, 0xa4 => 0x7ec0, + 0xa5 => 0x7ec1, 0xa6 => 0x7ec2, 0xa7 => 0x7ec9, 0xa8 => 0x7ecb, + 0xa9 => 0x7ecc, 0xaa => 0x7ed0, 0xab => 0x7ed4, 0xac => 0x7ed7, + 0xad => 0x7edb, 0xae => 0x7ee0, 0xaf => 0x7ee1, 0xb0 => 0x7ee8, + 0xb1 => 0x7eeb, 0xb2 => 0x7eee, 0xb3 => 0x7eef, 0xb4 => 0x7ef1, + 0xb5 => 0x7ef2, 0xb6 => 0x7f0d, 0xb7 => 0x7ef6, 0xb8 => 0x7efa, + 0xb9 => 0x7efb, 0xba => 0x7efe, 0xbb => 0x7f01, 0xbc => 0x7f02, + 0xbd => 0x7f03, 0xbe => 0x7f07, 0xbf => 0x7f08, 0xc0 => 0x7f0b, + 0xc1 => 0x7f0c, 0xc2 => 0x7f0f, 0xc3 => 0x7f11, 0xc4 => 0x7f12, + 0xc5 => 0x7f17, 0xc6 => 0x7f19, 0xc7 => 0x7f1c, 0xc8 => 0x7f1b, + 0xc9 => 0x7f1f, 0xca => 0x7f21, 0xcb => 0x7f22, 0xcc => 0x7f23, + 0xcd => 0x7f24, 0xce => 0x7f25, 0xcf => 0x7f26, 0xd0 => 0x7f27, + 0xd1 => 0x7f2a, 0xd2 => 0x7f2b, 0xd3 => 0x7f2c, 0xd4 => 0x7f2d, + 0xd5 => 0x7f2f, 0xd6 => 0x7f30, 0xd7 => 0x7f31, 0xd8 => 0x7f32, + 0xd9 => 0x7f33, 0xda => 0x7f35, 0xdb => 0x5e7a, 0xdc => 0x757f, + 0xdd => 0x5ddb, 0xde => 0x753e, 0xdf => 0x9095, 0xe0 => 0x738e, + 0xe1 => 0x7391, 0xe2 => 0x73ae, 0xe3 => 0x73a2, 0xe4 => 0x739f, + 0xe5 => 0x73cf, 0xe6 => 0x73c2, 0xe7 => 0x73d1, 0xe8 => 0x73b7, + 0xe9 => 0x73b3, 0xea => 0x73c0, 0xeb => 0x73c9, 0xec => 0x73c8, + 0xed => 0x73e5, 0xee => 0x73d9, 0xef => 0x987c, 0xf0 => 0x740a, + 0xf1 => 0x73e9, 0xf2 => 0x73e7, 0xf3 => 0x73de, 0xf4 => 0x73ba, + 0xf5 => 0x73f2, 0xf6 => 0x740f, 0xf7 => 0x742a, 0xf8 => 0x745b, + 0xf9 => 0x7426, 0xfa => 0x7425, 0xfb => 0x7428, 0xfc => 0x7430, + 0xfd => 0x742e, 0xfe => 0x742c, + }, + 0xe8 => { + 0xa1 => 0x741b, 0xa2 => 0x741a, 0xa3 => 0x7441, 0xa4 => 0x745c, + 0xa5 => 0x7457, 0xa6 => 0x7455, 0xa7 => 0x7459, 0xa8 => 0x7477, + 0xa9 => 0x746d, 0xaa => 0x747e, 0xab => 0x749c, 0xac => 0x748e, + 0xad => 0x7480, 0xae => 0x7481, 0xaf => 0x7487, 0xb0 => 0x748b, + 0xb1 => 0x749e, 0xb2 => 0x74a8, 0xb3 => 0x74a9, 0xb4 => 0x7490, + 0xb5 => 0x74a7, 0xb6 => 0x74d2, 0xb7 => 0x74ba, 0xb8 => 0x97ea, + 0xb9 => 0x97eb, 0xba => 0x97ec, 0xbb => 0x674c, 0xbc => 0x6753, + 0xbd => 0x675e, 0xbe => 0x6748, 0xbf => 0x6769, 0xc0 => 0x67a5, + 0xc1 => 0x6787, 0xc2 => 0x676a, 0xc3 => 0x6773, 0xc4 => 0x6798, + 0xc5 => 0x67a7, 0xc6 => 0x6775, 0xc7 => 0x67a8, 0xc8 => 0x679e, + 0xc9 => 0x67ad, 0xca => 0x678b, 0xcb => 0x6777, 0xcc => 0x677c, + 0xcd => 0x67f0, 0xce => 0x6809, 0xcf => 0x67d8, 0xd0 => 0x680a, + 0xd1 => 0x67e9, 0xd2 => 0x67b0, 0xd3 => 0x680c, 0xd4 => 0x67d9, + 0xd5 => 0x67b5, 0xd6 => 0x67da, 0xd7 => 0x67b3, 0xd8 => 0x67dd, + 0xd9 => 0x6800, 0xda => 0x67c3, 0xdb => 0x67b8, 0xdc => 0x67e2, + 0xdd => 0x680e, 0xde => 0x67c1, 0xdf => 0x67fd, 0xe0 => 0x6832, + 0xe1 => 0x6833, 0xe2 => 0x6860, 0xe3 => 0x6861, 0xe4 => 0x684e, + 0xe5 => 0x6862, 0xe6 => 0x6844, 0xe7 => 0x6864, 0xe8 => 0x6883, + 0xe9 => 0x681d, 0xea => 0x6855, 0xeb => 0x6866, 0xec => 0x6841, + 0xed => 0x6867, 0xee => 0x6840, 0xef => 0x683e, 0xf0 => 0x684a, + 0xf1 => 0x6849, 0xf2 => 0x6829, 0xf3 => 0x68b5, 0xf4 => 0x688f, + 0xf5 => 0x6874, 0xf6 => 0x6877, 0xf7 => 0x6893, 0xf8 => 0x686b, + 0xf9 => 0x68c2, 0xfa => 0x696e, 0xfb => 0x68fc, 0xfc => 0x691f, + 0xfd => 0x6920, 0xfe => 0x68f9, + }, + 0xe9 => { + 0xa1 => 0x6924, 0xa2 => 0x68f0, 0xa3 => 0x690b, 0xa4 => 0x6901, + 0xa5 => 0x6957, 0xa6 => 0x68e3, 0xa7 => 0x6910, 0xa8 => 0x6971, + 0xa9 => 0x6939, 0xaa => 0x6960, 0xab => 0x6942, 0xac => 0x695d, + 0xad => 0x6984, 0xae => 0x696b, 0xaf => 0x6980, 0xb0 => 0x6998, + 0xb1 => 0x6978, 0xb2 => 0x6934, 0xb3 => 0x69cc, 0xb4 => 0x6987, + 0xb5 => 0x6988, 0xb6 => 0x69ce, 0xb7 => 0x6989, 0xb8 => 0x6966, + 0xb9 => 0x6963, 0xba => 0x6979, 0xbb => 0x699b, 0xbc => 0x69a7, + 0xbd => 0x69bb, 0xbe => 0x69ab, 0xbf => 0x69ad, 0xc0 => 0x69d4, + 0xc1 => 0x69b1, 0xc2 => 0x69c1, 0xc3 => 0x69ca, 0xc4 => 0x69df, + 0xc5 => 0x6995, 0xc6 => 0x69e0, 0xc7 => 0x698d, 0xc8 => 0x69ff, + 0xc9 => 0x6a2f, 0xca => 0x69ed, 0xcb => 0x6a17, 0xcc => 0x6a18, + 0xcd => 0x6a65, 0xce => 0x69f2, 0xcf => 0x6a44, 0xd0 => 0x6a3e, + 0xd1 => 0x6aa0, 0xd2 => 0x6a50, 0xd3 => 0x6a5b, 0xd4 => 0x6a35, + 0xd5 => 0x6a8e, 0xd6 => 0x6a79, 0xd7 => 0x6a3d, 0xd8 => 0x6a28, + 0xd9 => 0x6a58, 0xda => 0x6a7c, 0xdb => 0x6a91, 0xdc => 0x6a90, + 0xdd => 0x6aa9, 0xde => 0x6a97, 0xdf => 0x6aab, 0xe0 => 0x7337, + 0xe1 => 0x7352, 0xe2 => 0x6b81, 0xe3 => 0x6b82, 0xe4 => 0x6b87, + 0xe5 => 0x6b84, 0xe6 => 0x6b92, 0xe7 => 0x6b93, 0xe8 => 0x6b8d, + 0xe9 => 0x6b9a, 0xea => 0x6b9b, 0xeb => 0x6ba1, 0xec => 0x6baa, + 0xed => 0x8f6b, 0xee => 0x8f6d, 0xef => 0x8f71, 0xf0 => 0x8f72, + 0xf1 => 0x8f73, 0xf2 => 0x8f75, 0xf3 => 0x8f76, 0xf4 => 0x8f78, + 0xf5 => 0x8f77, 0xf6 => 0x8f79, 0xf7 => 0x8f7a, 0xf8 => 0x8f7c, + 0xf9 => 0x8f7e, 0xfa => 0x8f81, 0xfb => 0x8f82, 0xfc => 0x8f84, + 0xfd => 0x8f87, 0xfe => 0x8f8b, + }, + 0xea => { + 0xa1 => 0x8f8d, 0xa2 => 0x8f8e, 0xa3 => 0x8f8f, 0xa4 => 0x8f98, + 0xa5 => 0x8f9a, 0xa6 => 0x8ece, 0xa7 => 0x620b, 0xa8 => 0x6217, + 0xa9 => 0x621b, 0xaa => 0x621f, 0xab => 0x6222, 0xac => 0x6221, + 0xad => 0x6225, 0xae => 0x6224, 0xaf => 0x622c, 0xb0 => 0x81e7, + 0xb1 => 0x74ef, 0xb2 => 0x74f4, 0xb3 => 0x74ff, 0xb4 => 0x750f, + 0xb5 => 0x7511, 0xb6 => 0x7513, 0xb7 => 0x6534, 0xb8 => 0x65ee, + 0xb9 => 0x65ef, 0xba => 0x65f0, 0xbb => 0x660a, 0xbc => 0x6619, + 0xbd => 0x6772, 0xbe => 0x6603, 0xbf => 0x6615, 0xc0 => 0x6600, + 0xc1 => 0x7085, 0xc2 => 0x66f7, 0xc3 => 0x661d, 0xc4 => 0x6634, + 0xc5 => 0x6631, 0xc6 => 0x6636, 0xc7 => 0x6635, 0xc8 => 0x8006, + 0xc9 => 0x665f, 0xca => 0x6654, 0xcb => 0x6641, 0xcc => 0x664f, + 0xcd => 0x6656, 0xce => 0x6661, 0xcf => 0x6657, 0xd0 => 0x6677, + 0xd1 => 0x6684, 0xd2 => 0x668c, 0xd3 => 0x66a7, 0xd4 => 0x669d, + 0xd5 => 0x66be, 0xd6 => 0x66db, 0xd7 => 0x66dc, 0xd8 => 0x66e6, + 0xd9 => 0x66e9, 0xda => 0x8d32, 0xdb => 0x8d33, 0xdc => 0x8d36, + 0xdd => 0x8d3b, 0xde => 0x8d3d, 0xdf => 0x8d40, 0xe0 => 0x8d45, + 0xe1 => 0x8d46, 0xe2 => 0x8d48, 0xe3 => 0x8d49, 0xe4 => 0x8d47, + 0xe5 => 0x8d4d, 0xe6 => 0x8d55, 0xe7 => 0x8d59, 0xe8 => 0x89c7, + 0xe9 => 0x89ca, 0xea => 0x89cb, 0xeb => 0x89cc, 0xec => 0x89ce, + 0xed => 0x89cf, 0xee => 0x89d0, 0xef => 0x89d1, 0xf0 => 0x726e, + 0xf1 => 0x729f, 0xf2 => 0x725d, 0xf3 => 0x7266, 0xf4 => 0x726f, + 0xf5 => 0x727e, 0xf6 => 0x727f, 0xf7 => 0x7284, 0xf8 => 0x728b, + 0xf9 => 0x728d, 0xfa => 0x728f, 0xfb => 0x7292, 0xfc => 0x6308, + 0xfd => 0x6332, 0xfe => 0x63b0, + }, + 0xeb => { + 0xa1 => 0x643f, 0xa2 => 0x64d8, 0xa3 => 0x8004, 0xa4 => 0x6bea, + 0xa5 => 0x6bf3, 0xa6 => 0x6bfd, 0xa7 => 0x6bf5, 0xa8 => 0x6bf9, + 0xa9 => 0x6c05, 0xaa => 0x6c07, 0xab => 0x6c06, 0xac => 0x6c0d, + 0xad => 0x6c15, 0xae => 0x6c18, 0xaf => 0x6c19, 0xb0 => 0x6c1a, + 0xb1 => 0x6c21, 0xb2 => 0x6c29, 0xb3 => 0x6c24, 0xb4 => 0x6c2a, + 0xb5 => 0x6c32, 0xb6 => 0x6535, 0xb7 => 0x6555, 0xb8 => 0x656b, + 0xb9 => 0x724d, 0xba => 0x7252, 0xbb => 0x7256, 0xbc => 0x7230, + 0xbd => 0x8662, 0xbe => 0x5216, 0xbf => 0x809f, 0xc0 => 0x809c, + 0xc1 => 0x8093, 0xc2 => 0x80bc, 0xc3 => 0x670a, 0xc4 => 0x80bd, + 0xc5 => 0x80b1, 0xc6 => 0x80ab, 0xc7 => 0x80ad, 0xc8 => 0x80b4, + 0xc9 => 0x80b7, 0xca => 0x80e7, 0xcb => 0x80e8, 0xcc => 0x80e9, + 0xcd => 0x80ea, 0xce => 0x80db, 0xcf => 0x80c2, 0xd0 => 0x80c4, + 0xd1 => 0x80d9, 0xd2 => 0x80cd, 0xd3 => 0x80d7, 0xd4 => 0x6710, + 0xd5 => 0x80dd, 0xd6 => 0x80eb, 0xd7 => 0x80f1, 0xd8 => 0x80f4, + 0xd9 => 0x80ed, 0xda => 0x810d, 0xdb => 0x810e, 0xdc => 0x80f2, + 0xdd => 0x80fc, 0xde => 0x6715, 0xdf => 0x8112, 0xe0 => 0x8c5a, + 0xe1 => 0x8136, 0xe2 => 0x811e, 0xe3 => 0x812c, 0xe4 => 0x8118, + 0xe5 => 0x8132, 0xe6 => 0x8148, 0xe7 => 0x814c, 0xe8 => 0x8153, + 0xe9 => 0x8174, 0xea => 0x8159, 0xeb => 0x815a, 0xec => 0x8171, + 0xed => 0x8160, 0xee => 0x8169, 0xef => 0x817c, 0xf0 => 0x817d, + 0xf1 => 0x816d, 0xf2 => 0x8167, 0xf3 => 0x584d, 0xf4 => 0x5ab5, + 0xf5 => 0x8188, 0xf6 => 0x8182, 0xf7 => 0x8191, 0xf8 => 0x6ed5, + 0xf9 => 0x81a3, 0xfa => 0x81aa, 0xfb => 0x81cc, 0xfc => 0x6726, + 0xfd => 0x81ca, 0xfe => 0x81bb, + }, + 0xec => { + 0xa1 => 0x81c1, 0xa2 => 0x81a6, 0xa3 => 0x6b24, 0xa4 => 0x6b37, + 0xa5 => 0x6b39, 0xa6 => 0x6b43, 0xa7 => 0x6b46, 0xa8 => 0x6b59, + 0xa9 => 0x98d1, 0xaa => 0x98d2, 0xab => 0x98d3, 0xac => 0x98d5, + 0xad => 0x98d9, 0xae => 0x98da, 0xaf => 0x6bb3, 0xb0 => 0x5f40, + 0xb1 => 0x6bc2, 0xb2 => 0x89f3, 0xb3 => 0x6590, 0xb4 => 0x9f51, + 0xb5 => 0x6593, 0xb6 => 0x65bc, 0xb7 => 0x65c6, 0xb8 => 0x65c4, + 0xb9 => 0x65c3, 0xba => 0x65cc, 0xbb => 0x65ce, 0xbc => 0x65d2, + 0xbd => 0x65d6, 0xbe => 0x7080, 0xbf => 0x709c, 0xc0 => 0x7096, + 0xc1 => 0x709d, 0xc2 => 0x70bb, 0xc3 => 0x70c0, 0xc4 => 0x70b7, + 0xc5 => 0x70ab, 0xc6 => 0x70b1, 0xc7 => 0x70e8, 0xc8 => 0x70ca, + 0xc9 => 0x7110, 0xca => 0x7113, 0xcb => 0x7116, 0xcc => 0x712f, + 0xcd => 0x7131, 0xce => 0x7173, 0xcf => 0x715c, 0xd0 => 0x7168, + 0xd1 => 0x7145, 0xd2 => 0x7172, 0xd3 => 0x714a, 0xd4 => 0x7178, + 0xd5 => 0x717a, 0xd6 => 0x7198, 0xd7 => 0x71b3, 0xd8 => 0x71b5, + 0xd9 => 0x71a8, 0xda => 0x71a0, 0xdb => 0x71e0, 0xdc => 0x71d4, + 0xdd => 0x71e7, 0xde => 0x71f9, 0xdf => 0x721d, 0xe0 => 0x7228, + 0xe1 => 0x706c, 0xe2 => 0x7118, 0xe3 => 0x7166, 0xe4 => 0x71b9, + 0xe5 => 0x623e, 0xe6 => 0x623d, 0xe7 => 0x6243, 0xe8 => 0x6248, + 0xe9 => 0x6249, 0xea => 0x793b, 0xeb => 0x7940, 0xec => 0x7946, + 0xed => 0x7949, 0xee => 0x795b, 0xef => 0x795c, 0xf0 => 0x7953, + 0xf1 => 0x795a, 0xf2 => 0x7962, 0xf3 => 0x7957, 0xf4 => 0x7960, + 0xf5 => 0x796f, 0xf6 => 0x7967, 0xf7 => 0x797a, 0xf8 => 0x7985, + 0xf9 => 0x798a, 0xfa => 0x799a, 0xfb => 0x79a7, 0xfc => 0x79b3, + 0xfd => 0x5fd1, 0xfe => 0x5fd0, + }, + 0xed => { + 0xa1 => 0x603c, 0xa2 => 0x605d, 0xa3 => 0x605a, 0xa4 => 0x6067, + 0xa5 => 0x6041, 0xa6 => 0x6059, 0xa7 => 0x6063, 0xa8 => 0x60ab, + 0xa9 => 0x6106, 0xaa => 0x610d, 0xab => 0x615d, 0xac => 0x61a9, + 0xad => 0x619d, 0xae => 0x61cb, 0xaf => 0x61d1, 0xb0 => 0x6206, + 0xb1 => 0x8080, 0xb2 => 0x807f, 0xb3 => 0x6c93, 0xb4 => 0x6cf6, + 0xb5 => 0x6dfc, 0xb6 => 0x77f6, 0xb7 => 0x77f8, 0xb8 => 0x7800, + 0xb9 => 0x7809, 0xba => 0x7817, 0xbb => 0x7818, 0xbc => 0x7811, + 0xbd => 0x65ab, 0xbe => 0x782d, 0xbf => 0x781c, 0xc0 => 0x781d, + 0xc1 => 0x7839, 0xc2 => 0x783a, 0xc3 => 0x783b, 0xc4 => 0x781f, + 0xc5 => 0x783c, 0xc6 => 0x7825, 0xc7 => 0x782c, 0xc8 => 0x7823, + 0xc9 => 0x7829, 0xca => 0x784e, 0xcb => 0x786d, 0xcc => 0x7856, + 0xcd => 0x7857, 0xce => 0x7826, 0xcf => 0x7850, 0xd0 => 0x7847, + 0xd1 => 0x784c, 0xd2 => 0x786a, 0xd3 => 0x789b, 0xd4 => 0x7893, + 0xd5 => 0x789a, 0xd6 => 0x7887, 0xd7 => 0x789c, 0xd8 => 0x78a1, + 0xd9 => 0x78a3, 0xda => 0x78b2, 0xdb => 0x78b9, 0xdc => 0x78a5, + 0xdd => 0x78d4, 0xde => 0x78d9, 0xdf => 0x78c9, 0xe0 => 0x78ec, + 0xe1 => 0x78f2, 0xe2 => 0x7905, 0xe3 => 0x78f4, 0xe4 => 0x7913, + 0xe5 => 0x7924, 0xe6 => 0x791e, 0xe7 => 0x7934, 0xe8 => 0x9f9b, + 0xe9 => 0x9ef9, 0xea => 0x9efb, 0xeb => 0x9efc, 0xec => 0x76f1, + 0xed => 0x7704, 0xee => 0x770d, 0xef => 0x76f9, 0xf0 => 0x7707, + 0xf1 => 0x7708, 0xf2 => 0x771a, 0xf3 => 0x7722, 0xf4 => 0x7719, + 0xf5 => 0x772d, 0xf6 => 0x7726, 0xf7 => 0x7735, 0xf8 => 0x7738, + 0xf9 => 0x7750, 0xfa => 0x7751, 0xfb => 0x7747, 0xfc => 0x7743, + 0xfd => 0x775a, 0xfe => 0x7768, + }, + 0xee => { + 0xa1 => 0x7762, 0xa2 => 0x7765, 0xa3 => 0x777f, 0xa4 => 0x778d, + 0xa5 => 0x777d, 0xa6 => 0x7780, 0xa7 => 0x778c, 0xa8 => 0x7791, + 0xa9 => 0x779f, 0xaa => 0x77a0, 0xab => 0x77b0, 0xac => 0x77b5, + 0xad => 0x77bd, 0xae => 0x753a, 0xaf => 0x7540, 0xb0 => 0x754e, + 0xb1 => 0x754b, 0xb2 => 0x7548, 0xb3 => 0x755b, 0xb4 => 0x7572, + 0xb5 => 0x7579, 0xb6 => 0x7583, 0xb7 => 0x7f58, 0xb8 => 0x7f61, + 0xb9 => 0x7f5f, 0xba => 0x8a48, 0xbb => 0x7f68, 0xbc => 0x7f74, + 0xbd => 0x7f71, 0xbe => 0x7f79, 0xbf => 0x7f81, 0xc0 => 0x7f7e, + 0xc1 => 0x76cd, 0xc2 => 0x76e5, 0xc3 => 0x8832, 0xc4 => 0x9485, + 0xc5 => 0x9486, 0xc6 => 0x9487, 0xc7 => 0x948b, 0xc8 => 0x948a, + 0xc9 => 0x948c, 0xca => 0x948d, 0xcb => 0x948f, 0xcc => 0x9490, + 0xcd => 0x9494, 0xce => 0x9497, 0xcf => 0x9495, 0xd0 => 0x949a, + 0xd1 => 0x949b, 0xd2 => 0x949c, 0xd3 => 0x94a3, 0xd4 => 0x94a4, + 0xd5 => 0x94ab, 0xd6 => 0x94aa, 0xd7 => 0x94ad, 0xd8 => 0x94ac, + 0xd9 => 0x94af, 0xda => 0x94b0, 0xdb => 0x94b2, 0xdc => 0x94b4, + 0xdd => 0x94b6, 0xde => 0x94b7, 0xdf => 0x94b8, 0xe0 => 0x94b9, + 0xe1 => 0x94ba, 0xe2 => 0x94bc, 0xe3 => 0x94bd, 0xe4 => 0x94bf, + 0xe5 => 0x94c4, 0xe6 => 0x94c8, 0xe7 => 0x94c9, 0xe8 => 0x94ca, + 0xe9 => 0x94cb, 0xea => 0x94cc, 0xeb => 0x94cd, 0xec => 0x94ce, + 0xed => 0x94d0, 0xee => 0x94d1, 0xef => 0x94d2, 0xf0 => 0x94d5, + 0xf1 => 0x94d6, 0xf2 => 0x94d7, 0xf3 => 0x94d9, 0xf4 => 0x94d8, + 0xf5 => 0x94db, 0xf6 => 0x94de, 0xf7 => 0x94df, 0xf8 => 0x94e0, + 0xf9 => 0x94e2, 0xfa => 0x94e4, 0xfb => 0x94e5, 0xfc => 0x94e7, + 0xfd => 0x94e8, 0xfe => 0x94ea, + }, + 0xef => { + 0xa1 => 0x94e9, 0xa2 => 0x94eb, 0xa3 => 0x94ee, 0xa4 => 0x94ef, + 0xa5 => 0x94f3, 0xa6 => 0x94f4, 0xa7 => 0x94f5, 0xa8 => 0x94f7, + 0xa9 => 0x94f9, 0xaa => 0x94fc, 0xab => 0x94fd, 0xac => 0x94ff, + 0xad => 0x9503, 0xae => 0x9502, 0xaf => 0x9506, 0xb0 => 0x9507, + 0xb1 => 0x9509, 0xb2 => 0x950a, 0xb3 => 0x950d, 0xb4 => 0x950e, + 0xb5 => 0x950f, 0xb6 => 0x9512, 0xb7 => 0x9513, 0xb8 => 0x9514, + 0xb9 => 0x9515, 0xba => 0x9516, 0xbb => 0x9518, 0xbc => 0x951b, + 0xbd => 0x951d, 0xbe => 0x951e, 0xbf => 0x951f, 0xc0 => 0x9522, + 0xc1 => 0x952a, 0xc2 => 0x952b, 0xc3 => 0x9529, 0xc4 => 0x952c, + 0xc5 => 0x9531, 0xc6 => 0x9532, 0xc7 => 0x9534, 0xc8 => 0x9536, + 0xc9 => 0x9537, 0xca => 0x9538, 0xcb => 0x953c, 0xcc => 0x953e, + 0xcd => 0x953f, 0xce => 0x9542, 0xcf => 0x9535, 0xd0 => 0x9544, + 0xd1 => 0x9545, 0xd2 => 0x9546, 0xd3 => 0x9549, 0xd4 => 0x954c, + 0xd5 => 0x954e, 0xd6 => 0x954f, 0xd7 => 0x9552, 0xd8 => 0x9553, + 0xd9 => 0x9554, 0xda => 0x9556, 0xdb => 0x9557, 0xdc => 0x9558, + 0xdd => 0x9559, 0xde => 0x955b, 0xdf => 0x955e, 0xe0 => 0x955f, + 0xe1 => 0x955d, 0xe2 => 0x9561, 0xe3 => 0x9562, 0xe4 => 0x9564, + 0xe5 => 0x9565, 0xe6 => 0x9566, 0xe7 => 0x9567, 0xe8 => 0x9568, + 0xe9 => 0x9569, 0xea => 0x956a, 0xeb => 0x956b, 0xec => 0x956c, + 0xed => 0x956f, 0xee => 0x9571, 0xef => 0x9572, 0xf0 => 0x9573, + 0xf1 => 0x953a, 0xf2 => 0x77e7, 0xf3 => 0x77ec, 0xf4 => 0x96c9, + 0xf5 => 0x79d5, 0xf6 => 0x79ed, 0xf7 => 0x79e3, 0xf8 => 0x79eb, + 0xf9 => 0x7a06, 0xfa => 0x5d47, 0xfb => 0x7a03, 0xfc => 0x7a02, + 0xfd => 0x7a1e, 0xfe => 0x7a14, + }, + 0xf0 => { + 0xa1 => 0x7a39, 0xa2 => 0x7a37, 0xa3 => 0x7a51, 0xa4 => 0x9ecf, + 0xa5 => 0x99a5, 0xa6 => 0x7a70, 0xa7 => 0x7688, 0xa8 => 0x768e, + 0xa9 => 0x7693, 0xaa => 0x7699, 0xab => 0x76a4, 0xac => 0x74de, + 0xad => 0x74e0, 0xae => 0x752c, 0xaf => 0x9e20, 0xb0 => 0x9e22, + 0xb1 => 0x9e28, 0xb2 => 0x9e29, 0xb3 => 0x9e2a, 0xb4 => 0x9e2b, + 0xb5 => 0x9e2c, 0xb6 => 0x9e32, 0xb7 => 0x9e31, 0xb8 => 0x9e36, + 0xb9 => 0x9e38, 0xba => 0x9e37, 0xbb => 0x9e39, 0xbc => 0x9e3a, + 0xbd => 0x9e3e, 0xbe => 0x9e41, 0xbf => 0x9e42, 0xc0 => 0x9e44, + 0xc1 => 0x9e46, 0xc2 => 0x9e47, 0xc3 => 0x9e48, 0xc4 => 0x9e49, + 0xc5 => 0x9e4b, 0xc6 => 0x9e4c, 0xc7 => 0x9e4e, 0xc8 => 0x9e51, + 0xc9 => 0x9e55, 0xca => 0x9e57, 0xcb => 0x9e5a, 0xcc => 0x9e5b, + 0xcd => 0x9e5c, 0xce => 0x9e5e, 0xcf => 0x9e63, 0xd0 => 0x9e66, + 0xd1 => 0x9e67, 0xd2 => 0x9e68, 0xd3 => 0x9e69, 0xd4 => 0x9e6a, + 0xd5 => 0x9e6b, 0xd6 => 0x9e6c, 0xd7 => 0x9e71, 0xd8 => 0x9e6d, + 0xd9 => 0x9e73, 0xda => 0x7592, 0xdb => 0x7594, 0xdc => 0x7596, + 0xdd => 0x75a0, 0xde => 0x759d, 0xdf => 0x75ac, 0xe0 => 0x75a3, + 0xe1 => 0x75b3, 0xe2 => 0x75b4, 0xe3 => 0x75b8, 0xe4 => 0x75c4, + 0xe5 => 0x75b1, 0xe6 => 0x75b0, 0xe7 => 0x75c3, 0xe8 => 0x75c2, + 0xe9 => 0x75d6, 0xea => 0x75cd, 0xeb => 0x75e3, 0xec => 0x75e8, + 0xed => 0x75e6, 0xee => 0x75e4, 0xef => 0x75eb, 0xf0 => 0x75e7, + 0xf1 => 0x7603, 0xf2 => 0x75f1, 0xf3 => 0x75fc, 0xf4 => 0x75ff, + 0xf5 => 0x7610, 0xf6 => 0x7600, 0xf7 => 0x7605, 0xf8 => 0x760c, + 0xf9 => 0x7617, 0xfa => 0x760a, 0xfb => 0x7625, 0xfc => 0x7618, + 0xfd => 0x7615, 0xfe => 0x7619, + }, + 0xf1 => { + 0xa1 => 0x761b, 0xa2 => 0x763c, 0xa3 => 0x7622, 0xa4 => 0x7620, + 0xa5 => 0x7640, 0xa6 => 0x762d, 0xa7 => 0x7630, 0xa8 => 0x763f, + 0xa9 => 0x7635, 0xaa => 0x7643, 0xab => 0x763e, 0xac => 0x7633, + 0xad => 0x764d, 0xae => 0x765e, 0xaf => 0x7654, 0xb0 => 0x765c, + 0xb1 => 0x7656, 0xb2 => 0x766b, 0xb3 => 0x766f, 0xb4 => 0x7fca, + 0xb5 => 0x7ae6, 0xb6 => 0x7a78, 0xb7 => 0x7a79, 0xb8 => 0x7a80, + 0xb9 => 0x7a86, 0xba => 0x7a88, 0xbb => 0x7a95, 0xbc => 0x7aa6, + 0xbd => 0x7aa0, 0xbe => 0x7aac, 0xbf => 0x7aa8, 0xc0 => 0x7aad, + 0xc1 => 0x7ab3, 0xc2 => 0x8864, 0xc3 => 0x8869, 0xc4 => 0x8872, + 0xc5 => 0x887d, 0xc6 => 0x887f, 0xc7 => 0x8882, 0xc8 => 0x88a2, + 0xc9 => 0x88c6, 0xca => 0x88b7, 0xcb => 0x88bc, 0xcc => 0x88c9, + 0xcd => 0x88e2, 0xce => 0x88ce, 0xcf => 0x88e3, 0xd0 => 0x88e5, + 0xd1 => 0x88f1, 0xd2 => 0x891a, 0xd3 => 0x88fc, 0xd4 => 0x88e8, + 0xd5 => 0x88fe, 0xd6 => 0x88f0, 0xd7 => 0x8921, 0xd8 => 0x8919, + 0xd9 => 0x8913, 0xda => 0x891b, 0xdb => 0x890a, 0xdc => 0x8934, + 0xdd => 0x892b, 0xde => 0x8936, 0xdf => 0x8941, 0xe0 => 0x8966, + 0xe1 => 0x897b, 0xe2 => 0x758b, 0xe3 => 0x80e5, 0xe4 => 0x76b2, + 0xe5 => 0x76b4, 0xe6 => 0x77dc, 0xe7 => 0x8012, 0xe8 => 0x8014, + 0xe9 => 0x8016, 0xea => 0x801c, 0xeb => 0x8020, 0xec => 0x8022, + 0xed => 0x8025, 0xee => 0x8026, 0xef => 0x8027, 0xf0 => 0x8029, + 0xf1 => 0x8028, 0xf2 => 0x8031, 0xf3 => 0x800b, 0xf4 => 0x8035, + 0xf5 => 0x8043, 0xf6 => 0x8046, 0xf7 => 0x804d, 0xf8 => 0x8052, + 0xf9 => 0x8069, 0xfa => 0x8071, 0xfb => 0x8983, 0xfc => 0x9878, + 0xfd => 0x9880, 0xfe => 0x9883, + }, + 0xf2 => { + 0xa1 => 0x9889, 0xa2 => 0x988c, 0xa3 => 0x988d, 0xa4 => 0x988f, + 0xa5 => 0x9894, 0xa6 => 0x989a, 0xa7 => 0x989b, 0xa8 => 0x989e, + 0xa9 => 0x989f, 0xaa => 0x98a1, 0xab => 0x98a2, 0xac => 0x98a5, + 0xad => 0x98a6, 0xae => 0x864d, 0xaf => 0x8654, 0xb0 => 0x866c, + 0xb1 => 0x866e, 0xb2 => 0x867f, 0xb3 => 0x867a, 0xb4 => 0x867c, + 0xb5 => 0x867b, 0xb6 => 0x86a8, 0xb7 => 0x868d, 0xb8 => 0x868b, + 0xb9 => 0x86ac, 0xba => 0x869d, 0xbb => 0x86a7, 0xbc => 0x86a3, + 0xbd => 0x86aa, 0xbe => 0x8693, 0xbf => 0x86a9, 0xc0 => 0x86b6, + 0xc1 => 0x86c4, 0xc2 => 0x86b5, 0xc3 => 0x86ce, 0xc4 => 0x86b0, + 0xc5 => 0x86ba, 0xc6 => 0x86b1, 0xc7 => 0x86af, 0xc8 => 0x86c9, + 0xc9 => 0x86cf, 0xca => 0x86b4, 0xcb => 0x86e9, 0xcc => 0x86f1, + 0xcd => 0x86f2, 0xce => 0x86ed, 0xcf => 0x86f3, 0xd0 => 0x86d0, + 0xd1 => 0x8713, 0xd2 => 0x86de, 0xd3 => 0x86f4, 0xd4 => 0x86df, + 0xd5 => 0x86d8, 0xd6 => 0x86d1, 0xd7 => 0x8703, 0xd8 => 0x8707, + 0xd9 => 0x86f8, 0xda => 0x8708, 0xdb => 0x870a, 0xdc => 0x870d, + 0xdd => 0x8709, 0xde => 0x8723, 0xdf => 0x873b, 0xe0 => 0x871e, + 0xe1 => 0x8725, 0xe2 => 0x872e, 0xe3 => 0x871a, 0xe4 => 0x873e, + 0xe5 => 0x8748, 0xe6 => 0x8734, 0xe7 => 0x8731, 0xe8 => 0x8729, + 0xe9 => 0x8737, 0xea => 0x873f, 0xeb => 0x8782, 0xec => 0x8722, + 0xed => 0x877d, 0xee => 0x877e, 0xef => 0x877b, 0xf0 => 0x8760, + 0xf1 => 0x8770, 0xf2 => 0x874c, 0xf3 => 0x876e, 0xf4 => 0x878b, + 0xf5 => 0x8753, 0xf6 => 0x8763, 0xf7 => 0x877c, 0xf8 => 0x8764, + 0xf9 => 0x8759, 0xfa => 0x8765, 0xfb => 0x8793, 0xfc => 0x87af, + 0xfd => 0x87a8, 0xfe => 0x87d2, + }, + 0xf3 => { + 0xa1 => 0x87c6, 0xa2 => 0x8788, 0xa3 => 0x8785, 0xa4 => 0x87ad, + 0xa5 => 0x8797, 0xa6 => 0x8783, 0xa7 => 0x87ab, 0xa8 => 0x87e5, + 0xa9 => 0x87ac, 0xaa => 0x87b5, 0xab => 0x87b3, 0xac => 0x87cb, + 0xad => 0x87d3, 0xae => 0x87bd, 0xaf => 0x87d1, 0xb0 => 0x87c0, + 0xb1 => 0x87ca, 0xb2 => 0x87db, 0xb3 => 0x87ea, 0xb4 => 0x87e0, + 0xb5 => 0x87ee, 0xb6 => 0x8816, 0xb7 => 0x8813, 0xb8 => 0x87fe, + 0xb9 => 0x880a, 0xba => 0x881b, 0xbb => 0x8821, 0xbc => 0x8839, + 0xbd => 0x883c, 0xbe => 0x7f36, 0xbf => 0x7f42, 0xc0 => 0x7f44, + 0xc1 => 0x7f45, 0xc2 => 0x8210, 0xc3 => 0x7afa, 0xc4 => 0x7afd, + 0xc5 => 0x7b08, 0xc6 => 0x7b03, 0xc7 => 0x7b04, 0xc8 => 0x7b15, + 0xc9 => 0x7b0a, 0xca => 0x7b2b, 0xcb => 0x7b0f, 0xcc => 0x7b47, + 0xcd => 0x7b38, 0xce => 0x7b2a, 0xcf => 0x7b19, 0xd0 => 0x7b2e, + 0xd1 => 0x7b31, 0xd2 => 0x7b20, 0xd3 => 0x7b25, 0xd4 => 0x7b24, + 0xd5 => 0x7b33, 0xd6 => 0x7b3e, 0xd7 => 0x7b1e, 0xd8 => 0x7b58, + 0xd9 => 0x7b5a, 0xda => 0x7b45, 0xdb => 0x7b75, 0xdc => 0x7b4c, + 0xdd => 0x7b5d, 0xde => 0x7b60, 0xdf => 0x7b6e, 0xe0 => 0x7b7b, + 0xe1 => 0x7b62, 0xe2 => 0x7b72, 0xe3 => 0x7b71, 0xe4 => 0x7b90, + 0xe5 => 0x7ba6, 0xe6 => 0x7ba7, 0xe7 => 0x7bb8, 0xe8 => 0x7bac, + 0xe9 => 0x7b9d, 0xea => 0x7ba8, 0xeb => 0x7b85, 0xec => 0x7baa, + 0xed => 0x7b9c, 0xee => 0x7ba2, 0xef => 0x7bab, 0xf0 => 0x7bb4, + 0xf1 => 0x7bd1, 0xf2 => 0x7bc1, 0xf3 => 0x7bcc, 0xf4 => 0x7bdd, + 0xf5 => 0x7bda, 0xf6 => 0x7be5, 0xf7 => 0x7be6, 0xf8 => 0x7bea, + 0xf9 => 0x7c0c, 0xfa => 0x7bfe, 0xfb => 0x7bfc, 0xfc => 0x7c0f, + 0xfd => 0x7c16, 0xfe => 0x7c0b, + }, + 0xf4 => { + 0xa1 => 0x7c1f, 0xa2 => 0x7c2a, 0xa3 => 0x7c26, 0xa4 => 0x7c38, + 0xa5 => 0x7c41, 0xa6 => 0x7c40, 0xa7 => 0x81fe, 0xa8 => 0x8201, + 0xa9 => 0x8202, 0xaa => 0x8204, 0xab => 0x81ec, 0xac => 0x8844, + 0xad => 0x8221, 0xae => 0x8222, 0xaf => 0x8223, 0xb0 => 0x822d, + 0xb1 => 0x822f, 0xb2 => 0x8228, 0xb3 => 0x822b, 0xb4 => 0x8238, + 0xb5 => 0x823b, 0xb6 => 0x8233, 0xb7 => 0x8234, 0xb8 => 0x823e, + 0xb9 => 0x8244, 0xba => 0x8249, 0xbb => 0x824b, 0xbc => 0x824f, + 0xbd => 0x825a, 0xbe => 0x825f, 0xbf => 0x8268, 0xc0 => 0x887e, + 0xc1 => 0x8885, 0xc2 => 0x8888, 0xc3 => 0x88d8, 0xc4 => 0x88df, + 0xc5 => 0x895e, 0xc6 => 0x7f9d, 0xc7 => 0x7f9f, 0xc8 => 0x7fa7, + 0xc9 => 0x7faf, 0xca => 0x7fb0, 0xcb => 0x7fb2, 0xcc => 0x7c7c, + 0xcd => 0x6549, 0xce => 0x7c91, 0xcf => 0x7c9d, 0xd0 => 0x7c9c, + 0xd1 => 0x7c9e, 0xd2 => 0x7ca2, 0xd3 => 0x7cb2, 0xd4 => 0x7cbc, + 0xd5 => 0x7cbd, 0xd6 => 0x7cc1, 0xd7 => 0x7cc7, 0xd8 => 0x7ccc, + 0xd9 => 0x7ccd, 0xda => 0x7cc8, 0xdb => 0x7cc5, 0xdc => 0x7cd7, + 0xdd => 0x7ce8, 0xde => 0x826e, 0xdf => 0x66a8, 0xe0 => 0x7fbf, + 0xe1 => 0x7fce, 0xe2 => 0x7fd5, 0xe3 => 0x7fe5, 0xe4 => 0x7fe1, + 0xe5 => 0x7fe6, 0xe6 => 0x7fe9, 0xe7 => 0x7fee, 0xe8 => 0x7ff3, + 0xe9 => 0x7cf8, 0xea => 0x7d77, 0xeb => 0x7da6, 0xec => 0x7dae, + 0xed => 0x7e47, 0xee => 0x7e9b, 0xef => 0x9eb8, 0xf0 => 0x9eb4, + 0xf1 => 0x8d73, 0xf2 => 0x8d84, 0xf3 => 0x8d94, 0xf4 => 0x8d91, + 0xf5 => 0x8db1, 0xf6 => 0x8d67, 0xf7 => 0x8d6d, 0xf8 => 0x8c47, + 0xf9 => 0x8c49, 0xfa => 0x914a, 0xfb => 0x9150, 0xfc => 0x914e, + 0xfd => 0x914f, 0xfe => 0x9164, + }, + 0xf5 => { + 0xa1 => 0x9162, 0xa2 => 0x9161, 0xa3 => 0x9170, 0xa4 => 0x9169, + 0xa5 => 0x916f, 0xa6 => 0x917d, 0xa7 => 0x917e, 0xa8 => 0x9172, + 0xa9 => 0x9174, 0xaa => 0x9179, 0xab => 0x918c, 0xac => 0x9185, + 0xad => 0x9190, 0xae => 0x918d, 0xaf => 0x9191, 0xb0 => 0x91a2, + 0xb1 => 0x91a3, 0xb2 => 0x91aa, 0xb3 => 0x91ad, 0xb4 => 0x91ae, + 0xb5 => 0x91af, 0xb6 => 0x91b5, 0xb7 => 0x91b4, 0xb8 => 0x91ba, + 0xb9 => 0x8c55, 0xba => 0x9e7e, 0xbb => 0x8db8, 0xbc => 0x8deb, + 0xbd => 0x8e05, 0xbe => 0x8e59, 0xbf => 0x8e69, 0xc0 => 0x8db5, + 0xc1 => 0x8dbf, 0xc2 => 0x8dbc, 0xc3 => 0x8dba, 0xc4 => 0x8dc4, + 0xc5 => 0x8dd6, 0xc6 => 0x8dd7, 0xc7 => 0x8dda, 0xc8 => 0x8dde, + 0xc9 => 0x8dce, 0xca => 0x8dcf, 0xcb => 0x8ddb, 0xcc => 0x8dc6, + 0xcd => 0x8dec, 0xce => 0x8df7, 0xcf => 0x8df8, 0xd0 => 0x8de3, + 0xd1 => 0x8df9, 0xd2 => 0x8dfb, 0xd3 => 0x8de4, 0xd4 => 0x8e09, + 0xd5 => 0x8dfd, 0xd6 => 0x8e14, 0xd7 => 0x8e1d, 0xd8 => 0x8e1f, + 0xd9 => 0x8e2c, 0xda => 0x8e2e, 0xdb => 0x8e23, 0xdc => 0x8e2f, + 0xdd => 0x8e3a, 0xde => 0x8e40, 0xdf => 0x8e39, 0xe0 => 0x8e35, + 0xe1 => 0x8e3d, 0xe2 => 0x8e31, 0xe3 => 0x8e49, 0xe4 => 0x8e41, + 0xe5 => 0x8e42, 0xe6 => 0x8e51, 0xe7 => 0x8e52, 0xe8 => 0x8e4a, + 0xe9 => 0x8e70, 0xea => 0x8e76, 0xeb => 0x8e7c, 0xec => 0x8e6f, + 0xed => 0x8e74, 0xee => 0x8e85, 0xef => 0x8e8f, 0xf0 => 0x8e94, + 0xf1 => 0x8e90, 0xf2 => 0x8e9c, 0xf3 => 0x8e9e, 0xf4 => 0x8c78, + 0xf5 => 0x8c82, 0xf6 => 0x8c8a, 0xf7 => 0x8c85, 0xf8 => 0x8c98, + 0xf9 => 0x8c94, 0xfa => 0x659b, 0xfb => 0x89d6, 0xfc => 0x89de, + 0xfd => 0x89da, 0xfe => 0x89dc, + }, + 0xf6 => { + 0xa1 => 0x89e5, 0xa2 => 0x89eb, 0xa3 => 0x89ef, 0xa4 => 0x8a3e, + 0xa5 => 0x8b26, 0xa6 => 0x9753, 0xa7 => 0x96e9, 0xa8 => 0x96f3, + 0xa9 => 0x96ef, 0xaa => 0x9706, 0xab => 0x9701, 0xac => 0x9708, + 0xad => 0x970f, 0xae => 0x970e, 0xaf => 0x972a, 0xb0 => 0x972d, + 0xb1 => 0x9730, 0xb2 => 0x973e, 0xb3 => 0x9f80, 0xb4 => 0x9f83, + 0xb5 => 0x9f85, 0xb6 => 0x9f86, 0xb7 => 0x9f87, 0xb8 => 0x9f88, + 0xb9 => 0x9f89, 0xba => 0x9f8a, 0xbb => 0x9f8c, 0xbc => 0x9efe, + 0xbd => 0x9f0b, 0xbe => 0x9f0d, 0xbf => 0x96b9, 0xc0 => 0x96bc, + 0xc1 => 0x96bd, 0xc2 => 0x96ce, 0xc3 => 0x96d2, 0xc4 => 0x77bf, + 0xc5 => 0x96e0, 0xc6 => 0x928e, 0xc7 => 0x92ae, 0xc8 => 0x92c8, + 0xc9 => 0x933e, 0xca => 0x936a, 0xcb => 0x93ca, 0xcc => 0x938f, + 0xcd => 0x943e, 0xce => 0x946b, 0xcf => 0x9c7f, 0xd0 => 0x9c82, + 0xd1 => 0x9c85, 0xd2 => 0x9c86, 0xd3 => 0x9c87, 0xd4 => 0x9c88, + 0xd5 => 0x7a23, 0xd6 => 0x9c8b, 0xd7 => 0x9c8e, 0xd8 => 0x9c90, + 0xd9 => 0x9c91, 0xda => 0x9c92, 0xdb => 0x9c94, 0xdc => 0x9c95, + 0xdd => 0x9c9a, 0xde => 0x9c9b, 0xdf => 0x9c9e, 0xe0 => 0x9c9f, + 0xe1 => 0x9ca0, 0xe2 => 0x9ca1, 0xe3 => 0x9ca2, 0xe4 => 0x9ca3, + 0xe5 => 0x9ca5, 0xe6 => 0x9ca6, 0xe7 => 0x9ca7, 0xe8 => 0x9ca8, + 0xe9 => 0x9ca9, 0xea => 0x9cab, 0xeb => 0x9cad, 0xec => 0x9cae, + 0xed => 0x9cb0, 0xee => 0x9cb1, 0xef => 0x9cb2, 0xf0 => 0x9cb3, + 0xf1 => 0x9cb4, 0xf2 => 0x9cb5, 0xf3 => 0x9cb6, 0xf4 => 0x9cb7, + 0xf5 => 0x9cba, 0xf6 => 0x9cbb, 0xf7 => 0x9cbc, 0xf8 => 0x9cbd, + 0xf9 => 0x9cc4, 0xfa => 0x9cc5, 0xfb => 0x9cc6, 0xfc => 0x9cc7, + 0xfd => 0x9cca, 0xfe => 0x9ccb, + }, + 0xf7 => { + 0xa1 => 0x9ccc, 0xa2 => 0x9ccd, 0xa3 => 0x9cce, 0xa4 => 0x9ccf, + 0xa5 => 0x9cd0, 0xa6 => 0x9cd3, 0xa7 => 0x9cd4, 0xa8 => 0x9cd5, + 0xa9 => 0x9cd7, 0xaa => 0x9cd8, 0xab => 0x9cd9, 0xac => 0x9cdc, + 0xad => 0x9cdd, 0xae => 0x9cdf, 0xaf => 0x9ce2, 0xb0 => 0x977c, + 0xb1 => 0x9785, 0xb2 => 0x9791, 0xb3 => 0x9792, 0xb4 => 0x9794, + 0xb5 => 0x97af, 0xb6 => 0x97ab, 0xb7 => 0x97a3, 0xb8 => 0x97b2, + 0xb9 => 0x97b4, 0xba => 0x9ab1, 0xbb => 0x9ab0, 0xbc => 0x9ab7, + 0xbd => 0x9e58, 0xbe => 0x9ab6, 0xbf => 0x9aba, 0xc0 => 0x9abc, + 0xc1 => 0x9ac1, 0xc2 => 0x9ac0, 0xc3 => 0x9ac5, 0xc4 => 0x9ac2, + 0xc5 => 0x9acb, 0xc6 => 0x9acc, 0xc7 => 0x9ad1, 0xc8 => 0x9b45, + 0xc9 => 0x9b43, 0xca => 0x9b47, 0xcb => 0x9b49, 0xcc => 0x9b48, + 0xcd => 0x9b4d, 0xce => 0x9b51, 0xcf => 0x98e8, 0xd0 => 0x990d, + 0xd1 => 0x992e, 0xd2 => 0x9955, 0xd3 => 0x9954, 0xd4 => 0x9adf, + 0xd5 => 0x9ae1, 0xd6 => 0x9ae6, 0xd7 => 0x9aef, 0xd8 => 0x9aeb, + 0xd9 => 0x9afb, 0xda => 0x9aed, 0xdb => 0x9af9, 0xdc => 0x9b08, + 0xdd => 0x9b0f, 0xde => 0x9b13, 0xdf => 0x9b1f, 0xe0 => 0x9b23, + 0xe1 => 0x9ebd, 0xe2 => 0x9ebe, 0xe3 => 0x7e3b, 0xe4 => 0x9e82, + 0xe5 => 0x9e87, 0xe6 => 0x9e88, 0xe7 => 0x9e8b, 0xe8 => 0x9e92, + 0xe9 => 0x93d6, 0xea => 0x9e9d, 0xeb => 0x9e9f, 0xec => 0x9edb, + 0xed => 0x9edc, 0xee => 0x9edd, 0xef => 0x9ee0, 0xf0 => 0x9edf, + 0xf1 => 0x9ee2, 0xf2 => 0x9ee9, 0xf3 => 0x9ee7, 0xf4 => 0x9ee5, + 0xf5 => 0x9eea, 0xf6 => 0x9eef, 0xf7 => 0x9f22, 0xf8 => 0x9f2c, + 0xf9 => 0x9f2f, 0xfa => 0x9f39, 0xfb => 0x9f37, 0xfc => 0x9f3d, + 0xfd => 0x9f3e, 0xfe => 0x9f44, + }, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacChineseTW.pm b/lib/Image/ExifTool/Charset/MacChineseTW.pm new file mode 100644 index 0000000..a7bb96e --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacChineseTW.pm @@ -0,0 +1,3623 @@ +#------------------------------------------------------------------------------ +# File: MacChineseTW.pm +# +# Description: Mac Chinese Traditional to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/CHINTRAD.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacChineseTW = ( + 0x80 => [0x5c,0xf87f], 0x81 => 0xf880, 0x82 => 0xf881, 0xfd => 0xa9, + 0xfe => 0x2122, 0xff => 0x2026, + 0xa1 => { + 0x40 => 0x3000, 0x41 => 0xff0c, 0x42 => 0x3001, 0x43 => 0x3002, + 0x44 => 0xff0e, 0x45 => 0xb7, 0x46 => 0xff1b, 0x47 => 0xff1a, + 0x48 => 0xff1f, 0x49 => 0xff01, 0x4a => 0xfe30, 0x4b => 0x22ef, + 0x4c => 0x2025, 0x4d => [0xff0c,0xf87d], 0x4e => [0x3001,0xf87d], + 0x4f => [0xff0e,0xf87d], 0x50 => [0xff0e,0xf87e], 0x51 => [0xff1b,0xf87d], + 0x52 => [0xff1a,0xf87d], 0x53 => [0xff1f,0xf87d], 0x54 => [0xff01,0xf87d], + 0x55 => 0xff5c, 0x56 => 0x2013, 0x57 => 0xfe31, 0x58 => 0x2014, + 0x59 => 0xfe33, 0x5a => [0xff3f,0xf87f], 0x5b => 0xfe34, 0x5c => 0xfe4f, + 0x5d => 0xff08, 0x5e => 0xff09, 0x5f => 0xfe35, 0x60 => 0xfe36, + 0x61 => 0xff5b, 0x62 => 0xff5d, 0x63 => 0xfe37, 0x64 => 0xfe38, + 0x65 => 0x3014, 0x66 => 0x3015, 0x67 => 0xfe39, 0x68 => 0xfe3a, + 0x69 => 0x3010, 0x6a => 0x3011, 0x6b => 0xfe3b, 0x6c => 0xfe3c, + 0x6d => 0x300a, 0x6e => 0x300b, 0x6f => 0xfe3d, 0x70 => 0xfe3e, + 0x71 => 0x3008, 0x72 => 0x3009, 0x73 => 0xfe3f, 0x74 => 0xfe40, + 0x75 => 0x300c, 0x76 => 0x300d, 0x77 => 0xfe41, 0x78 => 0xfe42, + 0x79 => 0x300e, 0x7a => 0x300f, 0x7b => 0xfe43, 0x7c => 0xfe44, + 0x7d => [0xff08,0xf87f], 0x7e => [0xff09,0xf87f], 0xa1 => [0xff5b,0xf87f], + 0xa2 => [0xff5d,0xf87f], 0xa3 => [0x3014,0xf87f], 0xa4 => [0x3015,0xf87f], + 0xa5 => 0x2018, 0xa6 => 0x2019, 0xa7 => 0x201c, 0xa8 => 0x201d, + 0xa9 => 0x301d, 0xaa => 0x301e, 0xab => 0x2035, 0xac => 0x2032, + 0xad => 0xff03, 0xae => 0xff06, 0xaf => 0xff0a, 0xb0 => 0x203b, + 0xb1 => 0xa7, 0xb2 => 0x3003, 0xb3 => 0x25cb, 0xb4 => 0x25cf, + 0xb5 => 0x25b3, 0xb6 => 0x25b2, 0xb7 => 0x25ce, 0xb8 => 0x2606, + 0xb9 => 0x2605, 0xba => 0x25c7, 0xbb => 0x25c6, 0xbc => 0x25a1, + 0xbd => 0x25a0, 0xbe => 0x25bd, 0xbf => 0x25bc, 0xc0 => 0x32a3, + 0xc1 => 0x2105, 0xc2 => 0x203e, 0xc3 => [0x203e,0xf87c], 0xc4 => 0xff3f, + 0xc5 => [0xff3f,0xf87c], 0xc6 => 0xfe49, 0xc7 => 0xfe4a, 0xc8 => 0xfe4d, + 0xc9 => 0xfe4e, 0xca => 0xfe4b, 0xcb => [0xfe4b,0xf87c], 0xcc => 0xfe5f, + 0xcd => 0xfe60, 0xce => 0xfe61, 0xcf => 0xff0b, 0xd0 => 0xff0d, + 0xd1 => 0xd7, 0xd2 => 0xf7, 0xd3 => 0xb1, 0xd4 => 0x221a, 0xd5 => 0xff1c, + 0xd6 => 0xff1e, 0xd7 => 0xff1d, 0xd8 => 0x2266, 0xd9 => 0x2267, + 0xda => 0x2260, 0xdb => 0x221e, 0xdc => 0x2252, 0xdd => 0x2261, + 0xde => 0xfe62, 0xdf => 0xfe63, 0xe0 => 0xfe64, 0xe1 => 0xfe65, + 0xe2 => 0xfe66, 0xe3 => 0x223c, 0xe4 => 0x2229, 0xe5 => 0x222a, + 0xe6 => 0x22a5, 0xe7 => 0x2220, 0xe8 => 0x221f, 0xe9 => 0x22bf, + 0xea => 0x33d2, 0xeb => 0x33d1, 0xec => 0x222b, 0xed => 0x222e, + 0xee => 0x2235, 0xef => 0x2234, 0xf0 => 0x2640, 0xf1 => 0x2642, + 0xf2 => 0x2295, 0xf3 => 0x2609, 0xf4 => 0x2191, 0xf5 => 0x2193, + 0xf6 => 0x2190, 0xf7 => 0x2192, 0xf8 => 0x2196, 0xf9 => 0x2197, + 0xfa => 0x2199, 0xfb => 0x2198, 0xfc => 0x2225, 0xfd => 0x2223, + 0xfe => [0xff0f,0xf87f], + }, + 0xa2 => { + 0x40 => [0xff3c,0xf87f], 0x41 => 0xff0f, 0x42 => 0xff3c, 0x43 => 0xff04, + 0x44 => 0xa5, 0x45 => 0x3012, 0x46 => 0xa2, 0x47 => 0xa3, 0x48 => 0xff05, + 0x49 => 0xff20, 0x4a => 0x2103, 0x4b => 0x2109, 0x4c => 0xfe69, + 0x4d => 0xfe6a, 0x4e => 0xfe6b, 0x4f => 0x33d5, 0x50 => 0x339c, + 0x51 => 0x339d, 0x52 => 0x339e, 0x53 => 0x33ce, 0x54 => 0x33a1, + 0x55 => 0x338e, 0x56 => 0x338f, 0x57 => 0x33c4, 0x58 => 0xb0, + 0x59 => 0x5159, 0x5a => 0x515b, 0x5b => 0x515e, 0x5c => 0x515d, + 0x5d => 0x5161, 0x5e => 0x5163, 0x5f => 0x55e7, 0x60 => 0x74e9, + 0x61 => 0x7cce, 0x62 => 0x2581, 0x63 => 0x2582, 0x64 => 0x2583, + 0x65 => 0x2584, 0x66 => 0x2585, 0x67 => 0x2586, 0x68 => 0x2587, + 0x69 => 0x2588, 0x6a => 0x258f, 0x6b => 0x258e, 0x6c => 0x258d, + 0x6d => 0x258c, 0x6e => 0x258b, 0x6f => 0x258a, 0x70 => 0x2589, + 0x71 => 0x253c, 0x72 => 0x2534, 0x73 => 0x252c, 0x74 => 0x2524, + 0x75 => 0x251c, 0x76 => 0x2594, 0x77 => 0x2500, 0x78 => 0x2502, + 0x79 => [0x2502,0xf87f], 0x7a => 0x250c, 0x7b => 0x2510, 0x7c => 0x2514, + 0x7d => 0x2518, 0x7e => 0x256d, 0xa1 => 0x256e, 0xa2 => 0x2570, + 0xa3 => 0x256f, 0xa4 => 0x2550, 0xa5 => 0x255e, 0xa6 => 0x256a, + 0xa7 => 0x2561, 0xa8 => 0x25e2, 0xa9 => 0x25e3, 0xaa => 0x25e5, + 0xab => 0x25e4, 0xac => 0x2571, 0xad => 0x2572, 0xae => 0x2573, + 0xaf => 0xff10, 0xb0 => 0xff11, 0xb1 => 0xff12, 0xb2 => 0xff13, + 0xb3 => 0xff14, 0xb4 => 0xff15, 0xb5 => 0xff16, 0xb6 => 0xff17, + 0xb7 => 0xff18, 0xb8 => 0xff19, 0xb9 => 0x2160, 0xba => 0x2161, + 0xbb => 0x2162, 0xbc => 0x2163, 0xbd => 0x2164, 0xbe => 0x2165, + 0xbf => 0x2166, 0xc0 => 0x2167, 0xc1 => 0x2168, 0xc2 => 0x2169, + 0xc3 => 0x3021, 0xc4 => 0x3022, 0xc5 => 0x3023, 0xc6 => 0x3024, + 0xc7 => 0x3025, 0xc8 => 0x3026, 0xc9 => 0x3027, 0xca => 0x3028, + 0xcb => 0x3029, 0xcc => [0x5341,0xf87f], 0xcd => 0x5344, + 0xce => [0x5345,0xf87f], 0xcf => 0xff21, 0xd0 => 0xff22, 0xd1 => 0xff23, + 0xd2 => 0xff24, 0xd3 => 0xff25, 0xd4 => 0xff26, 0xd5 => 0xff27, + 0xd6 => 0xff28, 0xd7 => 0xff29, 0xd8 => 0xff2a, 0xd9 => 0xff2b, + 0xda => 0xff2c, 0xdb => 0xff2d, 0xdc => 0xff2e, 0xdd => 0xff2f, + 0xde => 0xff30, 0xdf => 0xff31, 0xe0 => 0xff32, 0xe1 => 0xff33, + 0xe2 => 0xff34, 0xe3 => 0xff35, 0xe4 => 0xff36, 0xe5 => 0xff37, + 0xe6 => 0xff38, 0xe7 => 0xff39, 0xe8 => 0xff3a, 0xe9 => 0xff41, + 0xea => 0xff42, 0xeb => 0xff43, 0xec => 0xff44, 0xed => 0xff45, + 0xee => 0xff46, 0xef => 0xff47, 0xf0 => 0xff48, 0xf1 => 0xff49, + 0xf2 => 0xff4a, 0xf3 => 0xff4b, 0xf4 => 0xff4c, 0xf5 => 0xff4d, + 0xf6 => 0xff4e, 0xf7 => 0xff4f, 0xf8 => 0xff50, 0xf9 => 0xff51, + 0xfa => 0xff52, 0xfb => 0xff53, 0xfc => 0xff54, 0xfd => 0xff55, + 0xfe => 0xff56, + }, + 0xa3 => { + 0x40 => 0xff57, 0x41 => 0xff58, 0x42 => 0xff59, 0x43 => 0xff5a, + 0x44 => 0x0391, 0x45 => 0x0392, 0x46 => 0x0393, 0x47 => 0x0394, + 0x48 => 0x0395, 0x49 => 0x0396, 0x4a => 0x0397, 0x4b => 0x0398, + 0x4c => 0x0399, 0x4d => 0x039a, 0x4e => 0x039b, 0x4f => 0x039c, + 0x50 => 0x039d, 0x51 => 0x039e, 0x52 => 0x039f, 0x53 => 0x03a0, + 0x54 => 0x03a1, 0x55 => 0x03a3, 0x56 => 0x03a4, 0x57 => 0x03a5, + 0x58 => 0x03a6, 0x59 => 0x03a7, 0x5a => 0x03a8, 0x5b => 0x03a9, + 0x5c => 0x03b1, 0x5d => 0x03b2, 0x5e => 0x03b3, 0x5f => 0x03b4, + 0x60 => 0x03b5, 0x61 => 0x03b6, 0x62 => 0x03b7, 0x63 => 0x03b8, + 0x64 => 0x03b9, 0x65 => 0x03ba, 0x66 => 0x03bb, 0x67 => 0x03bc, + 0x68 => 0x03bd, 0x69 => 0x03be, 0x6a => 0x03bf, 0x6b => 0x03c0, + 0x6c => 0x03c1, 0x6d => 0x03c3, 0x6e => 0x03c4, 0x6f => 0x03c5, + 0x70 => 0x03c6, 0x71 => 0x03c7, 0x72 => 0x03c8, 0x73 => 0x03c9, + 0x74 => 0x3105, 0x75 => 0x3106, 0x76 => 0x3107, 0x77 => 0x3108, + 0x78 => 0x3109, 0x79 => 0x310a, 0x7a => 0x310b, 0x7b => 0x310c, + 0x7c => 0x310d, 0x7d => 0x310e, 0x7e => 0x310f, 0xa1 => 0x3110, + 0xa2 => 0x3111, 0xa3 => 0x3112, 0xa4 => 0x3113, 0xa5 => 0x3114, + 0xa6 => 0x3115, 0xa7 => 0x3116, 0xa8 => 0x3117, 0xa9 => 0x3118, + 0xaa => 0x3119, 0xab => 0x311a, 0xac => 0x311b, 0xad => 0x311c, + 0xae => 0x311d, 0xaf => 0x311e, 0xb0 => 0x311f, 0xb1 => 0x3120, + 0xb2 => 0x3121, 0xb3 => 0x3122, 0xb4 => 0x3123, 0xb5 => 0x3124, + 0xb6 => 0x3125, 0xb7 => 0x3126, 0xb8 => 0x3127, 0xb9 => 0x3128, + 0xba => 0x3129, 0xbb => 0x02d9, 0xbc => 0x02c9, 0xbd => 0x02ca, + 0xbe => 0x02c7, 0xbf => 0x02cb, + }, + 0xa4 => { + 0x40 => 0x4e00, 0x41 => 0x4e59, 0x42 => 0x4e01, 0x43 => 0x4e03, + 0x44 => 0x4e43, 0x45 => 0x4e5d, 0x46 => 0x4e86, 0x47 => 0x4e8c, + 0x48 => 0x4eba, 0x49 => 0x513f, 0x4a => 0x5165, 0x4b => 0x516b, + 0x4c => 0x51e0, 0x4d => 0x5200, 0x4e => 0x5201, 0x4f => 0x529b, + 0x50 => 0x5315, 0x51 => 0x5341, 0x52 => 0x535c, 0x53 => 0x53c8, + 0x54 => 0x4e09, 0x55 => 0x4e0b, 0x56 => 0x4e08, 0x57 => 0x4e0a, + 0x58 => 0x4e2b, 0x59 => 0x4e38, 0x5a => 0x51e1, 0x5b => 0x4e45, + 0x5c => 0x4e48, 0x5d => 0x4e5f, 0x5e => 0x4e5e, 0x5f => 0x4e8e, + 0x60 => 0x4ea1, 0x61 => 0x5140, 0x62 => 0x5203, 0x63 => 0x52fa, + 0x64 => 0x5343, 0x65 => 0x53c9, 0x66 => 0x53e3, 0x67 => 0x571f, + 0x68 => 0x58eb, 0x69 => 0x5915, 0x6a => 0x5927, 0x6b => 0x5973, + 0x6c => 0x5b50, 0x6d => 0x5b51, 0x6e => 0x5b53, 0x6f => 0x5bf8, + 0x70 => 0x5c0f, 0x71 => 0x5c22, 0x72 => 0x5c38, 0x73 => 0x5c71, + 0x74 => 0x5ddd, 0x75 => 0x5de5, 0x76 => 0x5df1, 0x77 => 0x5df2, + 0x78 => 0x5df3, 0x79 => 0x5dfe, 0x7a => 0x5e72, 0x7b => 0x5efe, + 0x7c => 0x5f0b, 0x7d => 0x5f13, 0x7e => 0x624d, 0xa1 => 0x4e11, + 0xa2 => 0x4e10, 0xa3 => 0x4e0d, 0xa4 => 0x4e2d, 0xa5 => 0x4e30, + 0xa6 => 0x4e39, 0xa7 => 0x4e4b, 0xa8 => 0x5c39, 0xa9 => 0x4e88, + 0xaa => 0x4e91, 0xab => 0x4e95, 0xac => 0x4e92, 0xad => 0x4e94, + 0xae => 0x4ea2, 0xaf => 0x4ec1, 0xb0 => 0x4ec0, 0xb1 => 0x4ec3, + 0xb2 => 0x4ec6, 0xb3 => 0x4ec7, 0xb4 => 0x4ecd, 0xb5 => 0x4eca, + 0xb6 => 0x4ecb, 0xb7 => 0x4ec4, 0xb8 => 0x5143, 0xb9 => 0x5141, + 0xba => 0x5167, 0xbb => 0x516d, 0xbc => 0x516e, 0xbd => 0x516c, + 0xbe => 0x5197, 0xbf => 0x51f6, 0xc0 => 0x5206, 0xc1 => 0x5207, + 0xc2 => 0x5208, 0xc3 => 0x52fb, 0xc4 => 0x52fe, 0xc5 => 0x52ff, + 0xc6 => 0x5316, 0xc7 => 0x5339, 0xc8 => 0x5348, 0xc9 => 0x5347, + 0xca => 0x5345, 0xcb => 0x535e, 0xcc => 0x5384, 0xcd => 0x53cb, + 0xce => 0x53ca, 0xcf => 0x53cd, 0xd0 => 0x58ec, 0xd1 => 0x5929, + 0xd2 => 0x592b, 0xd3 => 0x592a, 0xd4 => 0x592d, 0xd5 => 0x5b54, + 0xd6 => 0x5c11, 0xd7 => 0x5c24, 0xd8 => 0x5c3a, 0xd9 => 0x5c6f, + 0xda => 0x5df4, 0xdb => 0x5e7b, 0xdc => 0x5eff, 0xdd => 0x5f14, + 0xde => 0x5f15, 0xdf => 0x5fc3, 0xe0 => 0x6208, 0xe1 => 0x6236, + 0xe2 => 0x624b, 0xe3 => 0x624e, 0xe4 => 0x652f, 0xe5 => 0x6587, + 0xe6 => 0x6597, 0xe7 => 0x65a4, 0xe8 => 0x65b9, 0xe9 => 0x65e5, + 0xea => 0x66f0, 0xeb => 0x6708, 0xec => 0x6728, 0xed => 0x6b20, + 0xee => 0x6b62, 0xef => 0x6b79, 0xf0 => 0x6bcb, 0xf1 => 0x6bd4, + 0xf2 => 0x6bdb, 0xf3 => 0x6c0f, 0xf4 => 0x6c34, 0xf5 => 0x706b, + 0xf6 => 0x722a, 0xf7 => 0x7236, 0xf8 => 0x723b, 0xf9 => 0x7247, + 0xfa => 0x7259, 0xfb => 0x725b, 0xfc => 0x72ac, 0xfd => 0x738b, + 0xfe => 0x4e19, + }, + 0xa5 => { + 0x40 => 0x4e16, 0x41 => 0x4e15, 0x42 => 0x4e14, 0x43 => 0x4e18, + 0x44 => 0x4e3b, 0x45 => 0x4e4d, 0x46 => 0x4e4f, 0x47 => 0x4e4e, + 0x48 => 0x4ee5, 0x49 => 0x4ed8, 0x4a => 0x4ed4, 0x4b => 0x4ed5, + 0x4c => 0x4ed6, 0x4d => 0x4ed7, 0x4e => 0x4ee3, 0x4f => 0x4ee4, + 0x50 => 0x4ed9, 0x51 => 0x4ede, 0x52 => 0x5145, 0x53 => 0x5144, + 0x54 => 0x5189, 0x55 => 0x518a, 0x56 => 0x51ac, 0x57 => 0x51f9, + 0x58 => 0x51fa, 0x59 => 0x51f8, 0x5a => 0x520a, 0x5b => 0x52a0, + 0x5c => 0x529f, 0x5d => 0x5305, 0x5e => 0x5306, 0x5f => 0x5317, + 0x60 => 0x531d, 0x61 => 0x4edf, 0x62 => 0x534a, 0x63 => 0x5349, + 0x64 => 0x5361, 0x65 => 0x5360, 0x66 => 0x536f, 0x67 => 0x536e, + 0x68 => 0x53bb, 0x69 => 0x53ef, 0x6a => 0x53e4, 0x6b => 0x53f3, + 0x6c => 0x53ec, 0x6d => 0x53ee, 0x6e => 0x53e9, 0x6f => 0x53e8, + 0x70 => 0x53fc, 0x71 => 0x53f8, 0x72 => 0x53f5, 0x73 => 0x53eb, + 0x74 => 0x53e6, 0x75 => 0x53ea, 0x76 => 0x53f2, 0x77 => 0x53f1, + 0x78 => 0x53f0, 0x79 => 0x53e5, 0x7a => 0x53ed, 0x7b => 0x53fb, + 0x7c => 0x56db, 0x7d => 0x56da, 0x7e => 0x5916, 0xa1 => 0x592e, + 0xa2 => 0x5931, 0xa3 => 0x5974, 0xa4 => 0x5976, 0xa5 => 0x5b55, + 0xa6 => 0x5b83, 0xa7 => 0x5c3c, 0xa8 => 0x5de8, 0xa9 => 0x5de7, + 0xaa => 0x5de6, 0xab => 0x5e02, 0xac => 0x5e03, 0xad => 0x5e73, + 0xae => 0x5e7c, 0xaf => 0x5f01, 0xb0 => 0x5f18, 0xb1 => 0x5f17, + 0xb2 => 0x5fc5, 0xb3 => 0x620a, 0xb4 => 0x6253, 0xb5 => 0x6254, + 0xb6 => 0x6252, 0xb7 => 0x6251, 0xb8 => 0x65a5, 0xb9 => 0x65e6, + 0xba => 0x672e, 0xbb => 0x672c, 0xbc => 0x672a, 0xbd => 0x672b, + 0xbe => 0x672d, 0xbf => 0x6b63, 0xc0 => 0x6bcd, 0xc1 => 0x6c11, + 0xc2 => 0x6c10, 0xc3 => 0x6c38, 0xc4 => 0x6c41, 0xc5 => 0x6c40, + 0xc6 => 0x6c3e, 0xc7 => 0x72af, 0xc8 => 0x7384, 0xc9 => 0x7389, + 0xca => 0x74dc, 0xcb => 0x74e6, 0xcc => 0x7518, 0xcd => 0x751f, + 0xce => 0x7528, 0xcf => 0x7529, 0xd0 => 0x7530, 0xd1 => 0x7531, + 0xd2 => 0x7532, 0xd3 => 0x7533, 0xd4 => 0x758b, 0xd5 => 0x767d, + 0xd6 => 0x76ae, 0xd7 => 0x76bf, 0xd8 => 0x76ee, 0xd9 => 0x77db, + 0xda => 0x77e2, 0xdb => 0x77f3, 0xdc => 0x793a, 0xdd => 0x79be, + 0xde => 0x7a74, 0xdf => 0x7acb, 0xe0 => 0x4e1e, 0xe1 => 0x4e1f, + 0xe2 => 0x4e52, 0xe3 => 0x4e53, 0xe4 => 0x4e69, 0xe5 => 0x4e99, + 0xe6 => 0x4ea4, 0xe7 => 0x4ea6, 0xe8 => 0x4ea5, 0xe9 => 0x4eff, + 0xea => 0x4f09, 0xeb => 0x4f19, 0xec => 0x4f0a, 0xed => 0x4f15, + 0xee => 0x4f0d, 0xef => 0x4f10, 0xf0 => 0x4f11, 0xf1 => 0x4f0f, + 0xf2 => 0x4ef2, 0xf3 => 0x4ef6, 0xf4 => 0x4efb, 0xf5 => 0x4ef0, + 0xf6 => 0x4ef3, 0xf7 => 0x4efd, 0xf8 => 0x4f01, 0xf9 => 0x4f0b, + 0xfa => 0x5149, 0xfb => 0x5147, 0xfc => 0x5146, 0xfd => 0x5148, + 0xfe => 0x5168, + }, + 0xa6 => { + 0x40 => 0x5171, 0x41 => 0x518d, 0x42 => 0x51b0, 0x43 => 0x5217, + 0x44 => 0x5211, 0x45 => 0x5212, 0x46 => 0x520e, 0x47 => 0x5216, + 0x48 => 0x52a3, 0x49 => 0x5308, 0x4a => 0x5321, 0x4b => 0x5320, + 0x4c => 0x5370, 0x4d => 0x5371, 0x4e => 0x5409, 0x4f => 0x540f, + 0x50 => 0x540c, 0x51 => 0x540a, 0x52 => 0x5410, 0x53 => 0x5401, + 0x54 => 0x540b, 0x55 => 0x5404, 0x56 => 0x5411, 0x57 => 0x540d, + 0x58 => 0x5408, 0x59 => 0x5403, 0x5a => 0x540e, 0x5b => 0x5406, + 0x5c => 0x5412, 0x5d => 0x56e0, 0x5e => 0x56de, 0x5f => 0x56dd, + 0x60 => 0x5733, 0x61 => 0x5730, 0x62 => 0x5728, 0x63 => 0x572d, + 0x64 => 0x572c, 0x65 => 0x572f, 0x66 => 0x5729, 0x67 => 0x5919, + 0x68 => 0x591a, 0x69 => 0x5937, 0x6a => 0x5938, 0x6b => 0x5984, + 0x6c => 0x5978, 0x6d => 0x5983, 0x6e => 0x597d, 0x6f => 0x5979, + 0x70 => 0x5982, 0x71 => 0x5981, 0x72 => 0x5b57, 0x73 => 0x5b58, + 0x74 => 0x5b87, 0x75 => 0x5b88, 0x76 => 0x5b85, 0x77 => 0x5b89, + 0x78 => 0x5bfa, 0x79 => 0x5c16, 0x7a => 0x5c79, 0x7b => 0x5dde, + 0x7c => 0x5e06, 0x7d => 0x5e76, 0x7e => 0x5e74, 0xa1 => 0x5f0f, + 0xa2 => 0x5f1b, 0xa3 => 0x5fd9, 0xa4 => 0x5fd6, 0xa5 => 0x620e, + 0xa6 => 0x620c, 0xa7 => 0x620d, 0xa8 => 0x6210, 0xa9 => 0x6263, + 0xaa => 0x625b, 0xab => 0x6258, 0xac => 0x6536, 0xad => 0x65e9, + 0xae => 0x65e8, 0xaf => 0x65ec, 0xb0 => 0x65ed, 0xb1 => 0x66f2, + 0xb2 => 0x66f3, 0xb3 => 0x6709, 0xb4 => 0x673d, 0xb5 => 0x6734, + 0xb6 => 0x6731, 0xb7 => 0x6735, 0xb8 => 0x6b21, 0xb9 => 0x6b64, + 0xba => 0x6b7b, 0xbb => 0x6c16, 0xbc => 0x6c5d, 0xbd => 0x6c57, + 0xbe => 0x6c59, 0xbf => 0x6c5f, 0xc0 => 0x6c60, 0xc1 => 0x6c50, + 0xc2 => 0x6c55, 0xc3 => 0x6c61, 0xc4 => 0x6c5b, 0xc5 => 0x6c4d, + 0xc6 => 0x6c4e, 0xc7 => 0x7070, 0xc8 => 0x725f, 0xc9 => 0x725d, + 0xca => 0x767e, 0xcb => 0x7af9, 0xcc => 0x7c73, 0xcd => 0x7cf8, + 0xce => 0x7f36, 0xcf => 0x7f8a, 0xd0 => 0x7fbd, 0xd1 => 0x8001, + 0xd2 => 0x8003, 0xd3 => 0x800c, 0xd4 => 0x8012, 0xd5 => 0x8033, + 0xd6 => 0x807f, 0xd7 => 0x8089, 0xd8 => 0x808b, 0xd9 => 0x808c, + 0xda => 0x81e3, 0xdb => 0x81ea, 0xdc => 0x81f3, 0xdd => 0x81fc, + 0xde => 0x820c, 0xdf => 0x821b, 0xe0 => 0x821f, 0xe1 => 0x826e, + 0xe2 => 0x8272, 0xe3 => 0x827e, 0xe4 => 0x866b, 0xe5 => 0x8840, + 0xe6 => 0x884c, 0xe7 => 0x8863, 0xe8 => 0x897f, 0xe9 => 0x9621, + 0xea => 0x4e32, 0xeb => 0x4ea8, 0xec => 0x4f4d, 0xed => 0x4f4f, + 0xee => 0x4f47, 0xef => 0x4f57, 0xf0 => 0x4f5e, 0xf1 => 0x4f34, + 0xf2 => 0x4f5b, 0xf3 => 0x4f55, 0xf4 => 0x4f30, 0xf5 => 0x4f50, + 0xf6 => 0x4f51, 0xf7 => 0x4f3d, 0xf8 => 0x4f3a, 0xf9 => 0x4f38, + 0xfa => 0x4f43, 0xfb => 0x4f54, 0xfc => 0x4f3c, 0xfd => 0x4f46, + 0xfe => 0x4f63, + }, + 0xa7 => { + 0x40 => 0x4f5c, 0x41 => 0x4f60, 0x42 => 0x4f2f, 0x43 => 0x4f4e, + 0x44 => 0x4f36, 0x45 => 0x4f59, 0x46 => 0x4f5d, 0x47 => 0x4f48, + 0x48 => 0x4f5a, 0x49 => 0x514c, 0x4a => 0x514b, 0x4b => 0x514d, + 0x4c => 0x5175, 0x4d => 0x51b6, 0x4e => 0x51b7, 0x4f => 0x5225, + 0x50 => 0x5224, 0x51 => 0x5229, 0x52 => 0x522a, 0x53 => 0x5228, + 0x54 => 0x52ab, 0x55 => 0x52a9, 0x56 => 0x52aa, 0x57 => 0x52ac, + 0x58 => 0x5323, 0x59 => 0x5373, 0x5a => 0x5375, 0x5b => 0x541d, + 0x5c => 0x542d, 0x5d => 0x541e, 0x5e => 0x543e, 0x5f => 0x5426, + 0x60 => 0x544e, 0x61 => 0x5427, 0x62 => 0x5446, 0x63 => 0x5443, + 0x64 => 0x5433, 0x65 => 0x5448, 0x66 => 0x5442, 0x67 => 0x541b, + 0x68 => 0x5429, 0x69 => 0x544a, 0x6a => 0x5439, 0x6b => 0x543b, + 0x6c => 0x5438, 0x6d => 0x542e, 0x6e => 0x5435, 0x6f => 0x5436, + 0x70 => 0x5420, 0x71 => 0x543c, 0x72 => 0x5440, 0x73 => 0x5431, + 0x74 => 0x542b, 0x75 => 0x541f, 0x76 => 0x542c, 0x77 => 0x56ea, + 0x78 => 0x56f0, 0x79 => 0x56e4, 0x7a => 0x56eb, 0x7b => 0x574a, + 0x7c => 0x5751, 0x7d => 0x5740, 0x7e => 0x574d, 0xa1 => 0x5747, + 0xa2 => 0x574e, 0xa3 => 0x573e, 0xa4 => 0x5750, 0xa5 => 0x574f, + 0xa6 => 0x573b, 0xa7 => 0x58ef, 0xa8 => 0x593e, 0xa9 => 0x599d, + 0xaa => 0x5992, 0xab => 0x59a8, 0xac => 0x599e, 0xad => 0x59a3, + 0xae => 0x5999, 0xaf => 0x5996, 0xb0 => 0x598d, 0xb1 => 0x59a4, + 0xb2 => 0x5993, 0xb3 => 0x598a, 0xb4 => 0x59a5, 0xb5 => 0x5b5d, + 0xb6 => 0x5b5c, 0xb7 => 0x5b5a, 0xb8 => 0x5b5b, 0xb9 => 0x5b8c, + 0xba => 0x5b8b, 0xbb => 0x5b8f, 0xbc => 0x5c2c, 0xbd => 0x5c40, + 0xbe => 0x5c41, 0xbf => 0x5c3f, 0xc0 => 0x5c3e, 0xc1 => 0x5c90, + 0xc2 => 0x5c91, 0xc3 => 0x5c94, 0xc4 => 0x5c8c, 0xc5 => 0x5deb, + 0xc6 => 0x5e0c, 0xc7 => 0x5e8f, 0xc8 => 0x5e87, 0xc9 => 0x5e8a, + 0xca => 0x5ef7, 0xcb => 0x5f04, 0xcc => 0x5f1f, 0xcd => 0x5f64, + 0xce => 0x5f62, 0xcf => 0x5f77, 0xd0 => 0x5f79, 0xd1 => 0x5fd8, + 0xd2 => 0x5fcc, 0xd3 => 0x5fd7, 0xd4 => 0x5fcd, 0xd5 => 0x5ff1, + 0xd6 => 0x5feb, 0xd7 => 0x5ff8, 0xd8 => 0x5fea, 0xd9 => 0x6212, + 0xda => 0x6211, 0xdb => 0x6284, 0xdc => 0x6297, 0xdd => 0x6296, + 0xde => 0x6280, 0xdf => 0x6276, 0xe0 => 0x6289, 0xe1 => 0x626d, + 0xe2 => 0x628a, 0xe3 => 0x627c, 0xe4 => 0x627e, 0xe5 => 0x6279, + 0xe6 => 0x6273, 0xe7 => 0x6292, 0xe8 => 0x626f, 0xe9 => 0x6298, + 0xea => 0x626e, 0xeb => 0x6295, 0xec => 0x6293, 0xed => 0x6291, + 0xee => 0x6286, 0xef => 0x6539, 0xf0 => 0x653b, 0xf1 => 0x6538, + 0xf2 => 0x65f1, 0xf3 => 0x66f4, 0xf4 => 0x675f, 0xf5 => 0x674e, + 0xf6 => 0x674f, 0xf7 => 0x6750, 0xf8 => 0x6751, 0xf9 => 0x675c, + 0xfa => 0x6756, 0xfb => 0x675e, 0xfc => 0x6749, 0xfd => 0x6746, + 0xfe => 0x6760, + }, + 0xa8 => { + 0x40 => 0x6753, 0x41 => 0x6757, 0x42 => 0x6b65, 0x43 => 0x6bcf, + 0x44 => 0x6c42, 0x45 => 0x6c5e, 0x46 => 0x6c99, 0x47 => 0x6c81, + 0x48 => 0x6c88, 0x49 => 0x6c89, 0x4a => 0x6c85, 0x4b => 0x6c9b, + 0x4c => 0x6c6a, 0x4d => 0x6c7a, 0x4e => 0x6c90, 0x4f => 0x6c70, + 0x50 => 0x6c8c, 0x51 => 0x6c68, 0x52 => 0x6c96, 0x53 => 0x6c92, + 0x54 => 0x6c7d, 0x55 => 0x6c83, 0x56 => 0x6c72, 0x57 => 0x6c7e, + 0x58 => 0x6c74, 0x59 => 0x6c86, 0x5a => 0x6c76, 0x5b => 0x6c8d, + 0x5c => 0x6c94, 0x5d => 0x6c98, 0x5e => 0x6c82, 0x5f => 0x7076, + 0x60 => 0x707c, 0x61 => 0x707d, 0x62 => 0x7078, 0x63 => 0x7262, + 0x64 => 0x7261, 0x65 => 0x7260, 0x66 => 0x72c4, 0x67 => 0x72c2, + 0x68 => 0x7396, 0x69 => 0x752c, 0x6a => 0x752b, 0x6b => 0x7537, + 0x6c => 0x7538, 0x6d => 0x7682, 0x6e => 0x76ef, 0x6f => 0x77e3, + 0x70 => 0x79c1, 0x71 => 0x79c0, 0x72 => 0x79bf, 0x73 => 0x7a76, + 0x74 => 0x7cfb, 0x75 => 0x7f55, 0x76 => 0x8096, 0x77 => 0x8093, + 0x78 => 0x809d, 0x79 => 0x8098, 0x7a => 0x809b, 0x7b => 0x809a, + 0x7c => 0x80b2, 0x7d => 0x826f, 0x7e => 0x8292, 0xa1 => 0x828b, + 0xa2 => 0x828d, 0xa3 => 0x898b, 0xa4 => 0x89d2, 0xa5 => 0x8a00, + 0xa6 => 0x8c37, 0xa7 => 0x8c46, 0xa8 => 0x8c55, 0xa9 => 0x8c9d, + 0xaa => 0x8d64, 0xab => 0x8d70, 0xac => 0x8db3, 0xad => 0x8eab, + 0xae => 0x8eca, 0xaf => 0x8f9b, 0xb0 => 0x8fb0, 0xb1 => 0x8fc2, + 0xb2 => 0x8fc6, 0xb3 => 0x8fc5, 0xb4 => 0x8fc4, 0xb5 => 0x5de1, + 0xb6 => 0x9091, 0xb7 => 0x90a2, 0xb8 => 0x90aa, 0xb9 => 0x90a6, + 0xba => 0x90a3, 0xbb => 0x9149, 0xbc => 0x91c6, 0xbd => 0x91cc, + 0xbe => 0x9632, 0xbf => 0x962e, 0xc0 => 0x9631, 0xc1 => 0x962a, + 0xc2 => 0x962c, 0xc3 => 0x4e26, 0xc4 => 0x4e56, 0xc5 => 0x4e73, + 0xc6 => 0x4e8b, 0xc7 => 0x4e9b, 0xc8 => 0x4e9e, 0xc9 => 0x4eab, + 0xca => 0x4eac, 0xcb => 0x4f6f, 0xcc => 0x4f9d, 0xcd => 0x4f8d, + 0xce => 0x4f73, 0xcf => 0x4f7f, 0xd0 => 0x4f6c, 0xd1 => 0x4f9b, + 0xd2 => 0x4f8b, 0xd3 => 0x4f86, 0xd4 => 0x4f83, 0xd5 => 0x4f70, + 0xd6 => 0x4f75, 0xd7 => 0x4f88, 0xd8 => 0x4f69, 0xd9 => 0x4f7b, + 0xda => 0x4f96, 0xdb => 0x4f7e, 0xdc => 0x4f8f, 0xdd => 0x4f91, + 0xde => 0x4f7a, 0xdf => 0x5154, 0xe0 => 0x5152, 0xe1 => 0x5155, + 0xe2 => 0x5169, 0xe3 => 0x5177, 0xe4 => 0x5176, 0xe5 => 0x5178, + 0xe6 => 0x51bd, 0xe7 => 0x51fd, 0xe8 => 0x523b, 0xe9 => 0x5238, + 0xea => 0x5237, 0xeb => 0x523a, 0xec => 0x5230, 0xed => 0x522e, + 0xee => 0x5236, 0xef => 0x5241, 0xf0 => 0x52be, 0xf1 => 0x52bb, + 0xf2 => 0x5352, 0xf3 => 0x5354, 0xf4 => 0x5353, 0xf5 => 0x5351, + 0xf6 => 0x5366, 0xf7 => 0x5377, 0xf8 => 0x5378, 0xf9 => 0x5379, + 0xfa => 0x53d6, 0xfb => 0x53d4, 0xfc => 0x53d7, 0xfd => 0x5473, + 0xfe => 0x5475, + }, + 0xa9 => { + 0x40 => 0x5496, 0x41 => 0x5478, 0x42 => 0x5495, 0x43 => 0x5480, + 0x44 => 0x547b, 0x45 => 0x5477, 0x46 => 0x5484, 0x47 => 0x5492, + 0x48 => 0x5486, 0x49 => 0x547c, 0x4a => 0x5490, 0x4b => 0x5471, + 0x4c => 0x5476, 0x4d => 0x548c, 0x4e => 0x549a, 0x4f => 0x5462, + 0x50 => 0x5468, 0x51 => 0x548b, 0x52 => 0x547d, 0x53 => 0x548e, + 0x54 => 0x56fa, 0x55 => 0x5783, 0x56 => 0x5777, 0x57 => 0x576a, + 0x58 => 0x5769, 0x59 => 0x5761, 0x5a => 0x5766, 0x5b => 0x5764, + 0x5c => 0x577c, 0x5d => 0x591c, 0x5e => 0x5949, 0x5f => 0x5947, + 0x60 => 0x5948, 0x61 => 0x5944, 0x62 => 0x5954, 0x63 => 0x59be, + 0x64 => 0x59bb, 0x65 => 0x59d4, 0x66 => 0x59b9, 0x67 => 0x59ae, + 0x68 => 0x59d1, 0x69 => 0x59c6, 0x6a => 0x59d0, 0x6b => 0x59cd, + 0x6c => 0x59cb, 0x6d => 0x59d3, 0x6e => 0x59ca, 0x6f => 0x59af, + 0x70 => 0x59b3, 0x71 => 0x59d2, 0x72 => 0x59c5, 0x73 => 0x5b5f, + 0x74 => 0x5b64, 0x75 => 0x5b63, 0x76 => 0x5b97, 0x77 => 0x5b9a, + 0x78 => 0x5b98, 0x79 => 0x5b9c, 0x7a => 0x5b99, 0x7b => 0x5b9b, + 0x7c => 0x5c1a, 0x7d => 0x5c48, 0x7e => 0x5c45, 0xa1 => 0x5c46, + 0xa2 => 0x5cb7, 0xa3 => 0x5ca1, 0xa4 => 0x5cb8, 0xa5 => 0x5ca9, + 0xa6 => 0x5cab, 0xa7 => 0x5cb1, 0xa8 => 0x5cb3, 0xa9 => 0x5e18, + 0xaa => 0x5e1a, 0xab => 0x5e16, 0xac => 0x5e15, 0xad => 0x5e1b, + 0xae => 0x5e11, 0xaf => 0x5e78, 0xb0 => 0x5e9a, 0xb1 => 0x5e97, + 0xb2 => 0x5e9c, 0xb3 => 0x5e95, 0xb4 => 0x5e96, 0xb5 => 0x5ef6, + 0xb6 => 0x5f26, 0xb7 => 0x5f27, 0xb8 => 0x5f29, 0xb9 => 0x5f80, + 0xba => 0x5f81, 0xbb => 0x5f7f, 0xbc => 0x5f7c, 0xbd => 0x5fdd, + 0xbe => 0x5fe0, 0xbf => 0x5ffd, 0xc0 => 0x5ff5, 0xc1 => 0x5fff, + 0xc2 => 0x600f, 0xc3 => 0x6014, 0xc4 => 0x602f, 0xc5 => 0x6035, + 0xc6 => 0x6016, 0xc7 => 0x602a, 0xc8 => 0x6015, 0xc9 => 0x6021, + 0xca => 0x6027, 0xcb => 0x6029, 0xcc => 0x602b, 0xcd => 0x601b, + 0xce => 0x6216, 0xcf => 0x6215, 0xd0 => 0x623f, 0xd1 => 0x623e, + 0xd2 => 0x6240, 0xd3 => 0x627f, 0xd4 => 0x62c9, 0xd5 => 0x62cc, + 0xd6 => 0x62c4, 0xd7 => 0x62bf, 0xd8 => 0x62c2, 0xd9 => 0x62b9, + 0xda => 0x62d2, 0xdb => 0x62db, 0xdc => 0x62ab, 0xdd => 0x62d3, + 0xde => 0x62d4, 0xdf => 0x62cb, 0xe0 => 0x62c8, 0xe1 => 0x62a8, + 0xe2 => 0x62bd, 0xe3 => 0x62bc, 0xe4 => 0x62d0, 0xe5 => 0x62d9, + 0xe6 => 0x62c7, 0xe7 => 0x62cd, 0xe8 => 0x62b5, 0xe9 => 0x62da, + 0xea => 0x62b1, 0xeb => 0x62d8, 0xec => 0x62d6, 0xed => 0x62d7, + 0xee => 0x62c6, 0xef => 0x62ac, 0xf0 => 0x62ce, 0xf1 => 0x653e, + 0xf2 => 0x65a7, 0xf3 => 0x65bc, 0xf4 => 0x65fa, 0xf5 => 0x6614, + 0xf6 => 0x6613, 0xf7 => 0x660c, 0xf8 => 0x6606, 0xf9 => 0x6602, + 0xfa => 0x660e, 0xfb => 0x6600, 0xfc => 0x660f, 0xfd => 0x6615, + 0xfe => 0x660a, + }, + 0xaa => { + 0x40 => 0x6607, 0x41 => 0x670d, 0x42 => 0x670b, 0x43 => 0x676d, + 0x44 => 0x678b, 0x45 => 0x6795, 0x46 => 0x6771, 0x47 => 0x679c, + 0x48 => 0x6773, 0x49 => 0x6777, 0x4a => 0x6787, 0x4b => 0x679d, + 0x4c => 0x6797, 0x4d => 0x676f, 0x4e => 0x6770, 0x4f => 0x677f, + 0x50 => 0x6789, 0x51 => 0x677e, 0x52 => 0x6790, 0x53 => 0x6775, + 0x54 => 0x679a, 0x55 => 0x6793, 0x56 => 0x677c, 0x57 => 0x676a, + 0x58 => 0x6772, 0x59 => 0x6b23, 0x5a => 0x6b66, 0x5b => 0x6b67, + 0x5c => 0x6b7f, 0x5d => 0x6c13, 0x5e => 0x6c1b, 0x5f => 0x6ce3, + 0x60 => 0x6ce8, 0x61 => 0x6cf3, 0x62 => 0x6cb1, 0x63 => 0x6ccc, + 0x64 => 0x6ce5, 0x65 => 0x6cb3, 0x66 => 0x6cbd, 0x67 => 0x6cbe, + 0x68 => 0x6cbc, 0x69 => 0x6ce2, 0x6a => 0x6cab, 0x6b => 0x6cd5, + 0x6c => 0x6cd3, 0x6d => 0x6cb8, 0x6e => 0x6cc4, 0x6f => 0x6cb9, + 0x70 => 0x6cc1, 0x71 => 0x6cae, 0x72 => 0x6cd7, 0x73 => 0x6cc5, + 0x74 => 0x6cf1, 0x75 => 0x6cbf, 0x76 => 0x6cbb, 0x77 => 0x6ce1, + 0x78 => 0x6cdb, 0x79 => 0x6cca, 0x7a => 0x6cac, 0x7b => 0x6cef, + 0x7c => 0x6cdc, 0x7d => 0x6cd6, 0x7e => 0x6ce0, 0xa1 => 0x7095, + 0xa2 => 0x708e, 0xa3 => 0x7092, 0xa4 => 0x708a, 0xa5 => 0x7099, + 0xa6 => 0x722c, 0xa7 => 0x722d, 0xa8 => 0x7238, 0xa9 => 0x7248, + 0xaa => 0x7267, 0xab => 0x7269, 0xac => 0x72c0, 0xad => 0x72ce, + 0xae => 0x72d9, 0xaf => 0x72d7, 0xb0 => 0x72d0, 0xb1 => 0x73a9, + 0xb2 => 0x73a8, 0xb3 => 0x739f, 0xb4 => 0x73ab, 0xb5 => 0x73a5, + 0xb6 => 0x753d, 0xb7 => 0x759d, 0xb8 => 0x7599, 0xb9 => 0x759a, + 0xba => 0x7684, 0xbb => 0x76c2, 0xbc => 0x76f2, 0xbd => 0x76f4, + 0xbe => 0x77e5, 0xbf => 0x77fd, 0xc0 => 0x793e, 0xc1 => 0x7940, + 0xc2 => 0x7941, 0xc3 => 0x79c9, 0xc4 => 0x79c8, 0xc5 => 0x7a7a, + 0xc6 => 0x7a79, 0xc7 => 0x7afa, 0xc8 => 0x7cfe, 0xc9 => 0x7f54, + 0xca => 0x7f8c, 0xcb => 0x7f8b, 0xcc => 0x8005, 0xcd => 0x80ba, + 0xce => 0x80a5, 0xcf => 0x80a2, 0xd0 => 0x80b1, 0xd1 => 0x80a1, + 0xd2 => 0x80ab, 0xd3 => 0x80a9, 0xd4 => 0x80b4, 0xd5 => 0x80aa, + 0xd6 => 0x80af, 0xd7 => 0x81e5, 0xd8 => 0x81fe, 0xd9 => 0x820d, + 0xda => 0x82b3, 0xdb => 0x829d, 0xdc => 0x8299, 0xdd => 0x82ad, + 0xde => 0x82bd, 0xdf => 0x829f, 0xe0 => 0x82b9, 0xe1 => 0x82b1, + 0xe2 => 0x82ac, 0xe3 => 0x82a5, 0xe4 => 0x82af, 0xe5 => 0x82b8, + 0xe6 => 0x82a3, 0xe7 => 0x82b0, 0xe8 => 0x82be, 0xe9 => 0x82b7, + 0xea => 0x864e, 0xeb => 0x8671, 0xec => 0x521d, 0xed => 0x8868, + 0xee => 0x8ecb, 0xef => 0x8fce, 0xf0 => 0x8fd4, 0xf1 => 0x8fd1, + 0xf2 => 0x90b5, 0xf3 => 0x90b8, 0xf4 => 0x90b1, 0xf5 => 0x90b6, + 0xf6 => 0x91c7, 0xf7 => 0x91d1, 0xf8 => 0x9577, 0xf9 => 0x9580, + 0xfa => 0x961c, 0xfb => 0x9640, 0xfc => 0x963f, 0xfd => 0x963b, + 0xfe => 0x9644, + }, + 0xab => { + 0x40 => 0x9642, 0x41 => 0x96b9, 0x42 => 0x96e8, 0x43 => 0x9752, + 0x44 => 0x975e, 0x45 => 0x4e9f, 0x46 => 0x4ead, 0x47 => 0x4eae, + 0x48 => 0x4fe1, 0x49 => 0x4fb5, 0x4a => 0x4faf, 0x4b => 0x4fbf, + 0x4c => 0x4fe0, 0x4d => 0x4fd1, 0x4e => 0x4fcf, 0x4f => 0x4fdd, + 0x50 => 0x4fc3, 0x51 => 0x4fb6, 0x52 => 0x4fd8, 0x53 => 0x4fdf, + 0x54 => 0x4fca, 0x55 => 0x4fd7, 0x56 => 0x4fae, 0x57 => 0x4fd0, + 0x58 => 0x4fc4, 0x59 => 0x4fc2, 0x5a => 0x4fda, 0x5b => 0x4fce, + 0x5c => 0x4fde, 0x5d => 0x4fb7, 0x5e => 0x5157, 0x5f => 0x5192, + 0x60 => 0x5191, 0x61 => 0x51a0, 0x62 => 0x524e, 0x63 => 0x5243, + 0x64 => 0x524a, 0x65 => 0x524d, 0x66 => 0x524c, 0x67 => 0x524b, + 0x68 => 0x5247, 0x69 => 0x52c7, 0x6a => 0x52c9, 0x6b => 0x52c3, + 0x6c => 0x52c1, 0x6d => 0x530d, 0x6e => 0x5357, 0x6f => 0x537b, + 0x70 => 0x539a, 0x71 => 0x53db, 0x72 => 0x54ac, 0x73 => 0x54c0, + 0x74 => 0x54a8, 0x75 => 0x54ce, 0x76 => 0x54c9, 0x77 => 0x54b8, + 0x78 => 0x54a6, 0x79 => 0x54b3, 0x7a => 0x54c7, 0x7b => 0x54c2, + 0x7c => 0x54bd, 0x7d => 0x54aa, 0x7e => 0x54c1, 0xa1 => 0x54c4, + 0xa2 => 0x54c8, 0xa3 => 0x54af, 0xa4 => 0x54ab, 0xa5 => 0x54b1, + 0xa6 => 0x54bb, 0xa7 => 0x54a9, 0xa8 => 0x54a7, 0xa9 => 0x54bf, + 0xaa => 0x56ff, 0xab => 0x5782, 0xac => 0x578b, 0xad => 0x57a0, + 0xae => 0x57a3, 0xaf => 0x57a2, 0xb0 => 0x57ce, 0xb1 => 0x57ae, + 0xb2 => 0x5793, 0xb3 => 0x5955, 0xb4 => 0x5951, 0xb5 => 0x594f, + 0xb6 => 0x594e, 0xb7 => 0x5950, 0xb8 => 0x59dc, 0xb9 => 0x59d8, + 0xba => 0x59ff, 0xbb => 0x59e3, 0xbc => 0x59e8, 0xbd => 0x5a03, + 0xbe => 0x59e5, 0xbf => 0x59ea, 0xc0 => 0x59da, 0xc1 => 0x59e6, + 0xc2 => 0x5a01, 0xc3 => 0x59fb, 0xc4 => 0x5b69, 0xc5 => 0x5ba3, + 0xc6 => 0x5ba6, 0xc7 => 0x5ba4, 0xc8 => 0x5ba2, 0xc9 => 0x5ba5, + 0xca => 0x5c01, 0xcb => 0x5c4e, 0xcc => 0x5c4f, 0xcd => 0x5c4d, + 0xce => 0x5c4b, 0xcf => 0x5cd9, 0xd0 => 0x5cd2, 0xd1 => 0x5df7, + 0xd2 => 0x5e1d, 0xd3 => 0x5e25, 0xd4 => 0x5e1f, 0xd5 => 0x5e7d, + 0xd6 => 0x5ea0, 0xd7 => 0x5ea6, 0xd8 => 0x5efa, 0xd9 => 0x5f08, + 0xda => 0x5f2d, 0xdb => 0x5f65, 0xdc => 0x5f88, 0xdd => 0x5f85, + 0xde => 0x5f8a, 0xdf => 0x5f8b, 0xe0 => 0x5f87, 0xe1 => 0x5f8c, + 0xe2 => 0x5f89, 0xe3 => 0x6012, 0xe4 => 0x601d, 0xe5 => 0x6020, + 0xe6 => 0x6025, 0xe7 => 0x600e, 0xe8 => 0x6028, 0xe9 => 0x604d, + 0xea => 0x6070, 0xeb => 0x6068, 0xec => 0x6062, 0xed => 0x6046, + 0xee => 0x6043, 0xef => 0x606c, 0xf0 => 0x606b, 0xf1 => 0x606a, + 0xf2 => 0x6064, 0xf3 => 0x6241, 0xf4 => 0x62dc, 0xf5 => 0x6316, + 0xf6 => 0x6309, 0xf7 => 0x62fc, 0xf8 => 0x62ed, 0xf9 => 0x6301, + 0xfa => 0x62ee, 0xfb => 0x62fd, 0xfc => 0x6307, 0xfd => 0x62f1, + 0xfe => 0x62f7, + }, + 0xac => { + 0x40 => 0x62ef, 0x41 => 0x62ec, 0x42 => 0x62fe, 0x43 => 0x62f4, + 0x44 => 0x6311, 0x45 => 0x6302, 0x46 => 0x653f, 0x47 => 0x6545, + 0x48 => 0x65ab, 0x49 => 0x65bd, 0x4a => 0x65e2, 0x4b => 0x6625, + 0x4c => 0x662d, 0x4d => 0x6620, 0x4e => 0x6627, 0x4f => 0x662f, + 0x50 => 0x661f, 0x51 => 0x6628, 0x52 => 0x6631, 0x53 => 0x6624, + 0x54 => 0x66f7, 0x55 => 0x67ff, 0x56 => 0x67d3, 0x57 => 0x67f1, + 0x58 => 0x67d4, 0x59 => 0x67d0, 0x5a => 0x67ec, 0x5b => 0x67b6, + 0x5c => 0x67af, 0x5d => 0x67f5, 0x5e => 0x67e9, 0x5f => 0x67ef, + 0x60 => 0x67c4, 0x61 => 0x67d1, 0x62 => 0x67b4, 0x63 => 0x67da, + 0x64 => 0x67e5, 0x65 => 0x67b8, 0x66 => 0x67cf, 0x67 => 0x67de, + 0x68 => 0x67f3, 0x69 => 0x67b0, 0x6a => 0x67d9, 0x6b => 0x67e2, + 0x6c => 0x67dd, 0x6d => 0x67d2, 0x6e => 0x6b6a, 0x6f => 0x6b83, + 0x70 => 0x6b86, 0x71 => 0x6bb5, 0x72 => 0x6bd2, 0x73 => 0x6bd7, + 0x74 => 0x6c1f, 0x75 => 0x6cc9, 0x76 => 0x6d0b, 0x77 => 0x6d32, + 0x78 => 0x6d2a, 0x79 => 0x6d41, 0x7a => 0x6d25, 0x7b => 0x6d0c, + 0x7c => 0x6d31, 0x7d => 0x6d1e, 0x7e => 0x6d17, 0xa1 => 0x6d3b, + 0xa2 => 0x6d3d, 0xa3 => 0x6d3e, 0xa4 => 0x6d36, 0xa5 => 0x6d1b, + 0xa6 => 0x6cf5, 0xa7 => 0x6d39, 0xa8 => 0x6d27, 0xa9 => 0x6d38, + 0xaa => 0x6d29, 0xab => 0x6d2e, 0xac => 0x6d35, 0xad => 0x6d0e, + 0xae => 0x6d2b, 0xaf => 0x70ab, 0xb0 => 0x70ba, 0xb1 => 0x70b3, + 0xb2 => 0x70ac, 0xb3 => 0x70af, 0xb4 => 0x70ad, 0xb5 => 0x70b8, + 0xb6 => 0x70ae, 0xb7 => 0x70a4, 0xb8 => 0x7230, 0xb9 => 0x7272, + 0xba => 0x726f, 0xbb => 0x7274, 0xbc => 0x72e9, 0xbd => 0x72e0, + 0xbe => 0x72e1, 0xbf => 0x73b7, 0xc0 => 0x73ca, 0xc1 => 0x73bb, + 0xc2 => 0x73b2, 0xc3 => 0x73cd, 0xc4 => 0x73c0, 0xc5 => 0x73b3, + 0xc6 => 0x751a, 0xc7 => 0x752d, 0xc8 => 0x754f, 0xc9 => 0x754c, + 0xca => 0x754e, 0xcb => 0x754b, 0xcc => 0x75ab, 0xcd => 0x75a4, + 0xce => 0x75a5, 0xcf => 0x75a2, 0xd0 => 0x75a3, 0xd1 => 0x7678, + 0xd2 => 0x7686, 0xd3 => 0x7687, 0xd4 => 0x7688, 0xd5 => 0x76c8, + 0xd6 => 0x76c6, 0xd7 => 0x76c3, 0xd8 => 0x76c5, 0xd9 => 0x7701, + 0xda => 0x76f9, 0xdb => 0x76f8, 0xdc => 0x7709, 0xdd => 0x770b, + 0xde => 0x76fe, 0xdf => 0x76fc, 0xe0 => 0x7707, 0xe1 => 0x77dc, + 0xe2 => 0x7802, 0xe3 => 0x7814, 0xe4 => 0x780c, 0xe5 => 0x780d, + 0xe6 => 0x7946, 0xe7 => 0x7949, 0xe8 => 0x7948, 0xe9 => 0x7947, + 0xea => 0x79b9, 0xeb => 0x79ba, 0xec => 0x79d1, 0xed => 0x79d2, + 0xee => 0x79cb, 0xef => 0x7a7f, 0xf0 => 0x7a81, 0xf1 => 0x7aff, + 0xf2 => 0x7afd, 0xf3 => 0x7c7d, 0xf4 => 0x7d02, 0xf5 => 0x7d05, + 0xf6 => 0x7d00, 0xf7 => 0x7d09, 0xf8 => 0x7d07, 0xf9 => 0x7d04, + 0xfa => 0x7d06, 0xfb => 0x7f38, 0xfc => 0x7f8e, 0xfd => 0x7fbf, + 0xfe => 0x8004, + }, + 0xad => { + 0x40 => 0x8010, 0x41 => 0x800d, 0x42 => 0x8011, 0x43 => 0x8036, + 0x44 => 0x80d6, 0x45 => 0x80e5, 0x46 => 0x80da, 0x47 => 0x80c3, + 0x48 => 0x80c4, 0x49 => 0x80cc, 0x4a => 0x80e1, 0x4b => 0x80db, + 0x4c => 0x80ce, 0x4d => 0x80de, 0x4e => 0x80e4, 0x4f => 0x80dd, + 0x50 => 0x81f4, 0x51 => 0x8222, 0x52 => 0x82e7, 0x53 => 0x8303, + 0x54 => 0x8305, 0x55 => 0x82e3, 0x56 => 0x82db, 0x57 => 0x82e6, + 0x58 => 0x8304, 0x59 => 0x82e5, 0x5a => 0x8302, 0x5b => 0x8309, + 0x5c => 0x82d2, 0x5d => 0x82d7, 0x5e => 0x82f1, 0x5f => 0x8301, + 0x60 => 0x82dc, 0x61 => 0x82d4, 0x62 => 0x82d1, 0x63 => 0x82de, + 0x64 => 0x82d3, 0x65 => 0x82df, 0x66 => 0x82ef, 0x67 => 0x8306, + 0x68 => 0x8650, 0x69 => 0x8679, 0x6a => 0x867b, 0x6b => 0x867a, + 0x6c => 0x884d, 0x6d => 0x886b, 0x6e => 0x8981, 0x6f => 0x89d4, + 0x70 => 0x8a08, 0x71 => 0x8a02, 0x72 => 0x8a03, 0x73 => 0x8c9e, + 0x74 => 0x8ca0, 0x75 => 0x8d74, 0x76 => 0x8d73, 0x77 => 0x8db4, + 0x78 => 0x8ecd, 0x79 => 0x8ecc, 0x7a => 0x8ff0, 0x7b => 0x8fe6, + 0x7c => 0x8fe2, 0x7d => 0x8fea, 0x7e => 0x8fe5, 0xa1 => 0x8fed, + 0xa2 => 0x8feb, 0xa3 => 0x8fe4, 0xa4 => 0x8fe8, 0xa5 => 0x90ca, + 0xa6 => 0x90ce, 0xa7 => 0x90c1, 0xa8 => 0x90c3, 0xa9 => 0x914b, + 0xaa => 0x914a, 0xab => 0x91cd, 0xac => 0x9582, 0xad => 0x9650, + 0xae => 0x964b, 0xaf => 0x964c, 0xb0 => 0x964d, 0xb1 => 0x9762, + 0xb2 => 0x9769, 0xb3 => 0x97cb, 0xb4 => 0x97ed, 0xb5 => 0x97f3, + 0xb6 => 0x9801, 0xb7 => 0x98a8, 0xb8 => 0x98db, 0xb9 => 0x98df, + 0xba => 0x9996, 0xbb => 0x9999, 0xbc => 0x4e58, 0xbd => 0x4eb3, + 0xbe => 0x500c, 0xbf => 0x500d, 0xc0 => 0x5023, 0xc1 => 0x4fef, + 0xc2 => 0x5026, 0xc3 => 0x5025, 0xc4 => 0x4ff8, 0xc5 => 0x5029, + 0xc6 => 0x5016, 0xc7 => 0x5006, 0xc8 => 0x503c, 0xc9 => 0x501f, + 0xca => 0x501a, 0xcb => 0x5012, 0xcc => 0x5011, 0xcd => 0x4ffa, + 0xce => 0x5000, 0xcf => 0x5014, 0xd0 => 0x5028, 0xd1 => 0x4ff1, + 0xd2 => 0x5021, 0xd3 => 0x500b, 0xd4 => 0x5019, 0xd5 => 0x5018, + 0xd6 => 0x4ff3, 0xd7 => 0x4fee, 0xd8 => 0x502d, 0xd9 => 0x502a, + 0xda => 0x4ffe, 0xdb => 0x502b, 0xdc => 0x5009, 0xdd => 0x517c, + 0xde => 0x51a4, 0xdf => 0x51a5, 0xe0 => 0x51a2, 0xe1 => 0x51cd, + 0xe2 => 0x51cc, 0xe3 => 0x51c6, 0xe4 => 0x51cb, 0xe5 => 0x5256, + 0xe6 => 0x525c, 0xe7 => 0x5254, 0xe8 => 0x525b, 0xe9 => 0x525d, + 0xea => 0x532a, 0xeb => 0x537f, 0xec => 0x539f, 0xed => 0x539d, + 0xee => 0x53df, 0xef => 0x54e8, 0xf0 => 0x5510, 0xf1 => 0x5501, + 0xf2 => 0x5537, 0xf3 => 0x54fc, 0xf4 => 0x54e5, 0xf5 => 0x54f2, + 0xf6 => 0x5506, 0xf7 => 0x54fa, 0xf8 => 0x5514, 0xf9 => 0x54e9, + 0xfa => 0x54ed, 0xfb => 0x54e1, 0xfc => 0x5509, 0xfd => 0x54ee, + 0xfe => 0x54ea, + }, + 0xae => { + 0x40 => 0x54e6, 0x41 => 0x5527, 0x42 => 0x5507, 0x43 => 0x54fd, + 0x44 => 0x550f, 0x45 => 0x5703, 0x46 => 0x5704, 0x47 => 0x57c2, + 0x48 => 0x57d4, 0x49 => 0x57cb, 0x4a => 0x57c3, 0x4b => 0x5809, + 0x4c => 0x590f, 0x4d => 0x5957, 0x4e => 0x5958, 0x4f => 0x595a, + 0x50 => 0x5a11, 0x51 => 0x5a18, 0x52 => 0x5a1c, 0x53 => 0x5a1f, + 0x54 => 0x5a1b, 0x55 => 0x5a13, 0x56 => 0x59ec, 0x57 => 0x5a20, + 0x58 => 0x5a23, 0x59 => 0x5a29, 0x5a => 0x5a25, 0x5b => 0x5a0c, + 0x5c => 0x5a09, 0x5d => 0x5b6b, 0x5e => 0x5c58, 0x5f => 0x5bb0, + 0x60 => 0x5bb3, 0x61 => 0x5bb6, 0x62 => 0x5bb4, 0x63 => 0x5bae, + 0x64 => 0x5bb5, 0x65 => 0x5bb9, 0x66 => 0x5bb8, 0x67 => 0x5c04, + 0x68 => 0x5c51, 0x69 => 0x5c55, 0x6a => 0x5c50, 0x6b => 0x5ced, + 0x6c => 0x5cfd, 0x6d => 0x5cfb, 0x6e => 0x5cea, 0x6f => 0x5ce8, + 0x70 => 0x5cf0, 0x71 => 0x5cf6, 0x72 => 0x5d01, 0x73 => 0x5cf4, + 0x74 => 0x5dee, 0x75 => 0x5e2d, 0x76 => 0x5e2b, 0x77 => 0x5eab, + 0x78 => 0x5ead, 0x79 => 0x5ea7, 0x7a => 0x5f31, 0x7b => 0x5f92, + 0x7c => 0x5f91, 0x7d => 0x5f90, 0x7e => 0x6059, 0xa1 => 0x6063, + 0xa2 => 0x6065, 0xa3 => 0x6050, 0xa4 => 0x6055, 0xa5 => 0x606d, + 0xa6 => 0x6069, 0xa7 => 0x606f, 0xa8 => 0x6084, 0xa9 => 0x609f, + 0xaa => 0x609a, 0xab => 0x608d, 0xac => 0x6094, 0xad => 0x608c, + 0xae => 0x6085, 0xaf => 0x6096, 0xb0 => 0x6247, 0xb1 => 0x62f3, + 0xb2 => 0x6308, 0xb3 => 0x62ff, 0xb4 => 0x634e, 0xb5 => 0x633e, + 0xb6 => 0x632f, 0xb7 => 0x6355, 0xb8 => 0x6342, 0xb9 => 0x6346, + 0xba => 0x634f, 0xbb => 0x6349, 0xbc => 0x633a, 0xbd => 0x6350, + 0xbe => 0x633d, 0xbf => 0x632a, 0xc0 => 0x632b, 0xc1 => 0x6328, + 0xc2 => 0x634d, 0xc3 => 0x634c, 0xc4 => 0x6548, 0xc5 => 0x6549, + 0xc6 => 0x6599, 0xc7 => 0x65c1, 0xc8 => 0x65c5, 0xc9 => 0x6642, + 0xca => 0x6649, 0xcb => 0x664f, 0xcc => 0x6643, 0xcd => 0x6652, + 0xce => 0x664c, 0xcf => 0x6645, 0xd0 => 0x6641, 0xd1 => 0x66f8, + 0xd2 => 0x6714, 0xd3 => 0x6715, 0xd4 => 0x6717, 0xd5 => 0x6821, + 0xd6 => 0x6838, 0xd7 => 0x6848, 0xd8 => 0x6846, 0xd9 => 0x6853, + 0xda => 0x6839, 0xdb => 0x6842, 0xdc => 0x6854, 0xdd => 0x6829, + 0xde => 0x68b3, 0xdf => 0x6817, 0xe0 => 0x684c, 0xe1 => 0x6851, + 0xe2 => 0x683d, 0xe3 => 0x67f4, 0xe4 => 0x6850, 0xe5 => 0x6840, + 0xe6 => 0x683c, 0xe7 => 0x6843, 0xe8 => 0x682a, 0xe9 => 0x6845, + 0xea => 0x6813, 0xeb => 0x6818, 0xec => 0x6841, 0xed => 0x6b8a, + 0xee => 0x6b89, 0xef => 0x6bb7, 0xf0 => 0x6c23, 0xf1 => 0x6c27, + 0xf2 => 0x6c28, 0xf3 => 0x6c26, 0xf4 => 0x6c24, 0xf5 => 0x6cf0, + 0xf6 => 0x6d6a, 0xf7 => 0x6d95, 0xf8 => 0x6d88, 0xf9 => 0x6d87, + 0xfa => 0x6d66, 0xfb => 0x6d78, 0xfc => 0x6d77, 0xfd => 0x6d59, + 0xfe => 0x6d93, + }, + 0xaf => { + 0x40 => 0x6d6c, 0x41 => 0x6d89, 0x42 => 0x6d6e, 0x43 => 0x6d5a, + 0x44 => 0x6d74, 0x45 => 0x6d69, 0x46 => 0x6d8c, 0x47 => 0x6d8a, + 0x48 => 0x6d79, 0x49 => 0x6d85, 0x4a => 0x6d65, 0x4b => 0x6d94, + 0x4c => 0x70ca, 0x4d => 0x70d8, 0x4e => 0x70e4, 0x4f => 0x70d9, + 0x50 => 0x70c8, 0x51 => 0x70cf, 0x52 => 0x7239, 0x53 => 0x7279, + 0x54 => 0x72fc, 0x55 => 0x72f9, 0x56 => 0x72fd, 0x57 => 0x72f8, + 0x58 => 0x72f7, 0x59 => 0x7386, 0x5a => 0x73ed, 0x5b => 0x7409, + 0x5c => 0x73ee, 0x5d => 0x73e0, 0x5e => 0x73ea, 0x5f => 0x73de, + 0x60 => 0x7554, 0x61 => 0x755d, 0x62 => 0x755c, 0x63 => 0x755a, + 0x64 => 0x7559, 0x65 => 0x75be, 0x66 => 0x75c5, 0x67 => 0x75c7, + 0x68 => 0x75b2, 0x69 => 0x75b3, 0x6a => 0x75bd, 0x6b => 0x75bc, + 0x6c => 0x75b9, 0x6d => 0x75c2, 0x6e => 0x75b8, 0x6f => 0x768b, + 0x70 => 0x76b0, 0x71 => 0x76ca, 0x72 => 0x76cd, 0x73 => 0x76ce, + 0x74 => 0x7729, 0x75 => 0x771f, 0x76 => 0x7720, 0x77 => 0x7728, + 0x78 => 0x77e9, 0x79 => 0x7830, 0x7a => 0x7827, 0x7b => 0x7838, + 0x7c => 0x781d, 0x7d => 0x7834, 0x7e => 0x7837, 0xa1 => 0x7825, + 0xa2 => 0x782d, 0xa3 => 0x7820, 0xa4 => 0x781f, 0xa5 => 0x7832, + 0xa6 => 0x7955, 0xa7 => 0x7950, 0xa8 => 0x7960, 0xa9 => 0x795f, + 0xaa => 0x7956, 0xab => 0x795e, 0xac => 0x795d, 0xad => 0x7957, + 0xae => 0x795a, 0xaf => 0x79e4, 0xb0 => 0x79e3, 0xb1 => 0x79e7, + 0xb2 => 0x79df, 0xb3 => 0x79e6, 0xb4 => 0x79e9, 0xb5 => 0x79d8, + 0xb6 => 0x7a84, 0xb7 => 0x7a88, 0xb8 => 0x7ad9, 0xb9 => 0x7b06, + 0xba => 0x7b11, 0xbb => 0x7c89, 0xbc => 0x7d21, 0xbd => 0x7d17, + 0xbe => 0x7d0b, 0xbf => 0x7d0a, 0xc0 => 0x7d20, 0xc1 => 0x7d22, + 0xc2 => 0x7d14, 0xc3 => 0x7d10, 0xc4 => 0x7d15, 0xc5 => 0x7d1a, + 0xc6 => 0x7d1c, 0xc7 => 0x7d0d, 0xc8 => 0x7d19, 0xc9 => 0x7d1b, + 0xca => 0x7f3a, 0xcb => 0x7f5f, 0xcc => 0x7f94, 0xcd => 0x7fc5, + 0xce => 0x7fc1, 0xcf => 0x8006, 0xd0 => 0x8018, 0xd1 => 0x8015, + 0xd2 => 0x8019, 0xd3 => 0x8017, 0xd4 => 0x803d, 0xd5 => 0x803f, + 0xd6 => 0x80f1, 0xd7 => 0x8102, 0xd8 => 0x80f0, 0xd9 => 0x8105, + 0xda => 0x80ed, 0xdb => 0x80f4, 0xdc => 0x8106, 0xdd => 0x80f8, + 0xde => 0x80f3, 0xdf => 0x8108, 0xe0 => 0x80fd, 0xe1 => 0x810a, + 0xe2 => 0x80fc, 0xe3 => 0x80ef, 0xe4 => 0x81ed, 0xe5 => 0x81ec, + 0xe6 => 0x8200, 0xe7 => 0x8210, 0xe8 => 0x822a, 0xe9 => 0x822b, + 0xea => 0x8228, 0xeb => 0x822c, 0xec => 0x82bb, 0xed => 0x832b, + 0xee => 0x8352, 0xef => 0x8354, 0xf0 => 0x834a, 0xf1 => 0x8338, + 0xf2 => 0x8350, 0xf3 => 0x8349, 0xf4 => 0x8335, 0xf5 => 0x8334, + 0xf6 => 0x834f, 0xf7 => 0x8332, 0xf8 => 0x8339, 0xf9 => 0x8336, + 0xfa => 0x8317, 0xfb => 0x8340, 0xfc => 0x8331, 0xfd => 0x8328, + 0xfe => 0x8343, + }, + 0xb0 => { + 0x40 => 0x8654, 0x41 => 0x868a, 0x42 => 0x86aa, 0x43 => 0x8693, + 0x44 => 0x86a4, 0x45 => 0x86a9, 0x46 => 0x868c, 0x47 => 0x86a3, + 0x48 => 0x869c, 0x49 => 0x8870, 0x4a => 0x8877, 0x4b => 0x8881, + 0x4c => 0x8882, 0x4d => 0x887d, 0x4e => 0x8879, 0x4f => 0x8a18, + 0x50 => 0x8a10, 0x51 => 0x8a0e, 0x52 => 0x8a0c, 0x53 => 0x8a15, + 0x54 => 0x8a0a, 0x55 => 0x8a17, 0x56 => 0x8a13, 0x57 => 0x8a16, + 0x58 => 0x8a0f, 0x59 => 0x8a11, 0x5a => 0x8c48, 0x5b => 0x8c7a, + 0x5c => 0x8c79, 0x5d => 0x8ca1, 0x5e => 0x8ca2, 0x5f => 0x8d77, + 0x60 => 0x8eac, 0x61 => 0x8ed2, 0x62 => 0x8ed4, 0x63 => 0x8ecf, + 0x64 => 0x8fb1, 0x65 => 0x9001, 0x66 => 0x9006, 0x67 => 0x8ff7, + 0x68 => 0x9000, 0x69 => 0x8ffa, 0x6a => 0x8ff4, 0x6b => 0x9003, + 0x6c => 0x8ffd, 0x6d => 0x9005, 0x6e => 0x8ff8, 0x6f => 0x9095, + 0x70 => 0x90e1, 0x71 => 0x90dd, 0x72 => 0x90e2, 0x73 => 0x9152, + 0x74 => 0x914d, 0x75 => 0x914c, 0x76 => 0x91d8, 0x77 => 0x91dd, + 0x78 => 0x91d7, 0x79 => 0x91dc, 0x7a => 0x91d9, 0x7b => 0x9583, + 0x7c => 0x9662, 0x7d => 0x9663, 0x7e => 0x9661, 0xa1 => 0x965b, + 0xa2 => 0x965d, 0xa3 => 0x9664, 0xa4 => 0x9658, 0xa5 => 0x965e, + 0xa6 => 0x96bb, 0xa7 => 0x98e2, 0xa8 => 0x99ac, 0xa9 => 0x9aa8, + 0xaa => 0x9ad8, 0xab => 0x9b25, 0xac => 0x9b32, 0xad => 0x9b3c, + 0xae => 0x4e7e, 0xaf => 0x507a, 0xb0 => 0x507d, 0xb1 => 0x505c, + 0xb2 => 0x5047, 0xb3 => 0x5043, 0xb4 => 0x504c, 0xb5 => 0x505a, + 0xb6 => 0x5049, 0xb7 => 0x5065, 0xb8 => 0x5076, 0xb9 => 0x504e, + 0xba => 0x5055, 0xbb => 0x5075, 0xbc => 0x5074, 0xbd => 0x5077, + 0xbe => 0x504f, 0xbf => 0x500f, 0xc0 => 0x506f, 0xc1 => 0x506d, + 0xc2 => 0x515c, 0xc3 => 0x5195, 0xc4 => 0x51f0, 0xc5 => 0x526a, + 0xc6 => 0x526f, 0xc7 => 0x52d2, 0xc8 => 0x52d9, 0xc9 => 0x52d8, + 0xca => 0x52d5, 0xcb => 0x5310, 0xcc => 0x530f, 0xcd => 0x5319, + 0xce => 0x533f, 0xcf => 0x5340, 0xd0 => 0x533e, 0xd1 => 0x53c3, + 0xd2 => 0x66fc, 0xd3 => 0x5546, 0xd4 => 0x556a, 0xd5 => 0x5566, + 0xd6 => 0x5544, 0xd7 => 0x555e, 0xd8 => 0x5561, 0xd9 => 0x5543, + 0xda => 0x554a, 0xdb => 0x5531, 0xdc => 0x5556, 0xdd => 0x554f, + 0xde => 0x5555, 0xdf => 0x552f, 0xe0 => 0x5564, 0xe1 => 0x5538, + 0xe2 => 0x552e, 0xe3 => 0x555c, 0xe4 => 0x552c, 0xe5 => 0x5563, + 0xe6 => 0x5533, 0xe7 => 0x5541, 0xe8 => 0x5557, 0xe9 => 0x5708, + 0xea => 0x570b, 0xeb => 0x5709, 0xec => 0x57df, 0xed => 0x5805, + 0xee => 0x580a, 0xef => 0x5806, 0xf0 => 0x57e0, 0xf1 => 0x57e4, + 0xf2 => 0x57fa, 0xf3 => 0x5802, 0xf4 => 0x5835, 0xf5 => 0x57f7, + 0xf6 => 0x57f9, 0xf7 => 0x5920, 0xf8 => 0x5962, 0xf9 => 0x5a36, + 0xfa => 0x5a41, 0xfb => 0x5a49, 0xfc => 0x5a66, 0xfd => 0x5a6a, + 0xfe => 0x5a40, + }, + 0xb1 => { + 0x40 => 0x5a3c, 0x41 => 0x5a62, 0x42 => 0x5a5a, 0x43 => 0x5a46, + 0x44 => 0x5a4a, 0x45 => 0x5b70, 0x46 => 0x5bc7, 0x47 => 0x5bc5, + 0x48 => 0x5bc4, 0x49 => 0x5bc2, 0x4a => 0x5bbf, 0x4b => 0x5bc6, + 0x4c => 0x5c09, 0x4d => 0x5c08, 0x4e => 0x5c07, 0x4f => 0x5c60, + 0x50 => 0x5c5c, 0x51 => 0x5c5d, 0x52 => 0x5d07, 0x53 => 0x5d06, + 0x54 => 0x5d0e, 0x55 => 0x5d1b, 0x56 => 0x5d16, 0x57 => 0x5d22, + 0x58 => 0x5d11, 0x59 => 0x5d29, 0x5a => 0x5d14, 0x5b => 0x5d19, + 0x5c => 0x5d24, 0x5d => 0x5d27, 0x5e => 0x5d17, 0x5f => 0x5de2, + 0x60 => 0x5e38, 0x61 => 0x5e36, 0x62 => 0x5e33, 0x63 => 0x5e37, + 0x64 => 0x5eb7, 0x65 => 0x5eb8, 0x66 => 0x5eb6, 0x67 => 0x5eb5, + 0x68 => 0x5ebe, 0x69 => 0x5f35, 0x6a => 0x5f37, 0x6b => 0x5f57, + 0x6c => 0x5f6c, 0x6d => 0x5f69, 0x6e => 0x5f6b, 0x6f => 0x5f97, + 0x70 => 0x5f99, 0x71 => 0x5f9e, 0x72 => 0x5f98, 0x73 => 0x5fa1, + 0x74 => 0x5fa0, 0x75 => 0x5f9c, 0x76 => 0x607f, 0x77 => 0x60a3, + 0x78 => 0x6089, 0x79 => 0x60a0, 0x7a => 0x60a8, 0x7b => 0x60cb, + 0x7c => 0x60b4, 0x7d => 0x60e6, 0x7e => 0x60bd, 0xa1 => 0x60c5, + 0xa2 => 0x60bb, 0xa3 => 0x60b5, 0xa4 => 0x60dc, 0xa5 => 0x60bc, + 0xa6 => 0x60d8, 0xa7 => 0x60d5, 0xa8 => 0x60c6, 0xa9 => 0x60df, + 0xaa => 0x60b8, 0xab => 0x60da, 0xac => 0x60c7, 0xad => 0x621a, + 0xae => 0x621b, 0xaf => 0x6248, 0xb0 => 0x63a0, 0xb1 => 0x63a7, + 0xb2 => 0x6372, 0xb3 => 0x6396, 0xb4 => 0x63a2, 0xb5 => 0x63a5, + 0xb6 => 0x6377, 0xb7 => 0x6367, 0xb8 => 0x6398, 0xb9 => 0x63aa, + 0xba => 0x6371, 0xbb => 0x63a9, 0xbc => 0x6389, 0xbd => 0x6383, + 0xbe => 0x639b, 0xbf => 0x636b, 0xc0 => 0x63a8, 0xc1 => 0x6384, + 0xc2 => 0x6388, 0xc3 => 0x6399, 0xc4 => 0x63a1, 0xc5 => 0x63ac, + 0xc6 => 0x6392, 0xc7 => 0x638f, 0xc8 => 0x6380, 0xc9 => 0x637b, + 0xca => 0x6369, 0xcb => 0x6368, 0xcc => 0x637a, 0xcd => 0x655d, + 0xce => 0x6556, 0xcf => 0x6551, 0xd0 => 0x6559, 0xd1 => 0x6557, + 0xd2 => 0x555f, 0xd3 => 0x654f, 0xd4 => 0x6558, 0xd5 => 0x6555, + 0xd6 => 0x6554, 0xd7 => 0x659c, 0xd8 => 0x659b, 0xd9 => 0x65ac, + 0xda => 0x65cf, 0xdb => 0x65cb, 0xdc => 0x65cc, 0xdd => 0x65ce, + 0xde => 0x665d, 0xdf => 0x665a, 0xe0 => 0x6664, 0xe1 => 0x6668, + 0xe2 => 0x6666, 0xe3 => 0x665e, 0xe4 => 0x66f9, 0xe5 => 0x52d7, + 0xe6 => 0x671b, 0xe7 => 0x6881, 0xe8 => 0x68af, 0xe9 => 0x68a2, + 0xea => 0x6893, 0xeb => 0x68b5, 0xec => 0x687f, 0xed => 0x6876, + 0xee => 0x68b1, 0xef => 0x68a7, 0xf0 => 0x6897, 0xf1 => 0x68b0, + 0xf2 => 0x6883, 0xf3 => 0x68c4, 0xf4 => 0x68ad, 0xf5 => 0x6886, + 0xf6 => 0x6885, 0xf7 => 0x6894, 0xf8 => 0x689d, 0xf9 => 0x68a8, + 0xfa => 0x689f, 0xfb => 0x68a1, 0xfc => 0x6882, 0xfd => 0x6b32, + 0xfe => 0x6bba, + }, + 0xb2 => { + 0x40 => 0x6beb, 0x41 => 0x6bec, 0x42 => 0x6c2b, 0x43 => 0x6d8e, + 0x44 => 0x6dbc, 0x45 => 0x6df3, 0x46 => 0x6dd9, 0x47 => 0x6db2, + 0x48 => 0x6de1, 0x49 => 0x6dcc, 0x4a => 0x6de4, 0x4b => 0x6dfb, + 0x4c => 0x6dfa, 0x4d => 0x6e05, 0x4e => 0x6dc7, 0x4f => 0x6dcb, + 0x50 => 0x6daf, 0x51 => 0x6dd1, 0x52 => 0x6dae, 0x53 => 0x6dde, + 0x54 => 0x6df9, 0x55 => 0x6db8, 0x56 => 0x6df7, 0x57 => 0x6df5, + 0x58 => 0x6dc5, 0x59 => 0x6dd2, 0x5a => 0x6e1a, 0x5b => 0x6db5, + 0x5c => 0x6dda, 0x5d => 0x6deb, 0x5e => 0x6dd8, 0x5f => 0x6dea, + 0x60 => 0x6df1, 0x61 => 0x6dee, 0x62 => 0x6de8, 0x63 => 0x6dc6, + 0x64 => 0x6dc4, 0x65 => 0x6daa, 0x66 => 0x6dec, 0x67 => 0x6dbf, + 0x68 => 0x6de6, 0x69 => 0x70f9, 0x6a => 0x7109, 0x6b => 0x710a, + 0x6c => 0x70fd, 0x6d => 0x70ef, 0x6e => 0x723d, 0x6f => 0x727d, + 0x70 => 0x7281, 0x71 => 0x731c, 0x72 => 0x731b, 0x73 => 0x7316, + 0x74 => 0x7313, 0x75 => 0x7319, 0x76 => 0x7387, 0x77 => 0x7405, + 0x78 => 0x740a, 0x79 => 0x7403, 0x7a => 0x7406, 0x7b => 0x73fe, + 0x7c => 0x740d, 0x7d => 0x74e0, 0x7e => 0x74f6, 0xa1 => 0x74f7, + 0xa2 => 0x751c, 0xa3 => 0x7522, 0xa4 => 0x7565, 0xa5 => 0x7566, + 0xa6 => 0x7562, 0xa7 => 0x7570, 0xa8 => 0x758f, 0xa9 => 0x75d4, + 0xaa => 0x75d5, 0xab => 0x75b5, 0xac => 0x75ca, 0xad => 0x75cd, + 0xae => 0x768e, 0xaf => 0x76d4, 0xb0 => 0x76d2, 0xb1 => 0x76db, + 0xb2 => 0x7737, 0xb3 => 0x773e, 0xb4 => 0x773c, 0xb5 => 0x7736, + 0xb6 => 0x7738, 0xb7 => 0x773a, 0xb8 => 0x786b, 0xb9 => 0x7843, + 0xba => 0x784e, 0xbb => 0x7965, 0xbc => 0x7968, 0xbd => 0x796d, + 0xbe => 0x79fb, 0xbf => 0x7a92, 0xc0 => 0x7a95, 0xc1 => 0x7b20, + 0xc2 => 0x7b28, 0xc3 => 0x7b1b, 0xc4 => 0x7b2c, 0xc5 => 0x7b26, + 0xc6 => 0x7b19, 0xc7 => 0x7b1e, 0xc8 => 0x7b2e, 0xc9 => 0x7c92, + 0xca => 0x7c97, 0xcb => 0x7c95, 0xcc => 0x7d46, 0xcd => 0x7d43, + 0xce => 0x7d71, 0xcf => 0x7d2e, 0xd0 => 0x7d39, 0xd1 => 0x7d3c, + 0xd2 => 0x7d40, 0xd3 => 0x7d30, 0xd4 => 0x7d33, 0xd5 => 0x7d44, + 0xd6 => 0x7d2f, 0xd7 => 0x7d42, 0xd8 => 0x7d32, 0xd9 => 0x7d31, + 0xda => 0x7f3d, 0xdb => 0x7f9e, 0xdc => 0x7f9a, 0xdd => 0x7fcc, + 0xde => 0x7fce, 0xdf => 0x7fd2, 0xe0 => 0x801c, 0xe1 => 0x804a, + 0xe2 => 0x8046, 0xe3 => 0x812f, 0xe4 => 0x8116, 0xe5 => 0x8123, + 0xe6 => 0x812b, 0xe7 => 0x8129, 0xe8 => 0x8130, 0xe9 => 0x8124, + 0xea => 0x8202, 0xeb => 0x8235, 0xec => 0x8237, 0xed => 0x8236, + 0xee => 0x8239, 0xef => 0x838e, 0xf0 => 0x839e, 0xf1 => 0x8398, + 0xf2 => 0x8378, 0xf3 => 0x83a2, 0xf4 => 0x8396, 0xf5 => 0x83bd, + 0xf6 => 0x83ab, 0xf7 => 0x8392, 0xf8 => 0x838a, 0xf9 => 0x8393, + 0xfa => 0x8389, 0xfb => 0x83a0, 0xfc => 0x8377, 0xfd => 0x837b, + 0xfe => 0x837c, + }, + 0xb3 => { + 0x40 => 0x8386, 0x41 => 0x83a7, 0x42 => 0x8655, 0x43 => 0x5f6a, + 0x44 => 0x86c7, 0x45 => 0x86c0, 0x46 => 0x86b6, 0x47 => 0x86c4, + 0x48 => 0x86b5, 0x49 => 0x86c6, 0x4a => 0x86cb, 0x4b => 0x86b1, + 0x4c => 0x86af, 0x4d => 0x86c9, 0x4e => 0x8853, 0x4f => 0x889e, + 0x50 => 0x8888, 0x51 => 0x88ab, 0x52 => 0x8892, 0x53 => 0x8896, + 0x54 => 0x888d, 0x55 => 0x888b, 0x56 => 0x8993, 0x57 => 0x898f, + 0x58 => 0x8a2a, 0x59 => 0x8a1d, 0x5a => 0x8a23, 0x5b => 0x8a25, + 0x5c => 0x8a31, 0x5d => 0x8a2d, 0x5e => 0x8a1f, 0x5f => 0x8a1b, + 0x60 => 0x8a22, 0x61 => 0x8c49, 0x62 => 0x8c5a, 0x63 => 0x8ca9, + 0x64 => 0x8cac, 0x65 => 0x8cab, 0x66 => 0x8ca8, 0x67 => 0x8caa, + 0x68 => 0x8ca7, 0x69 => 0x8d67, 0x6a => 0x8d66, 0x6b => 0x8dbe, + 0x6c => 0x8dba, 0x6d => 0x8edb, 0x6e => 0x8edf, 0x6f => 0x9019, + 0x70 => 0x900d, 0x71 => 0x901a, 0x72 => 0x9017, 0x73 => 0x9023, + 0x74 => 0x901f, 0x75 => 0x901d, 0x76 => 0x9010, 0x77 => 0x9015, + 0x78 => 0x901e, 0x79 => 0x9020, 0x7a => 0x900f, 0x7b => 0x9022, + 0x7c => 0x9016, 0x7d => 0x901b, 0x7e => 0x9014, 0xa1 => 0x90e8, + 0xa2 => 0x90ed, 0xa3 => 0x90fd, 0xa4 => 0x9157, 0xa5 => 0x91ce, + 0xa6 => 0x91f5, 0xa7 => 0x91e6, 0xa8 => 0x91e3, 0xa9 => 0x91e7, + 0xaa => 0x91ed, 0xab => 0x91e9, 0xac => 0x9589, 0xad => 0x966a, + 0xae => 0x9675, 0xaf => 0x9673, 0xb0 => 0x9678, 0xb1 => 0x9670, + 0xb2 => 0x9674, 0xb3 => 0x9676, 0xb4 => 0x9677, 0xb5 => 0x966c, + 0xb6 => 0x96c0, 0xb7 => 0x96ea, 0xb8 => 0x96e9, 0xb9 => 0x7ae0, + 0xba => 0x7adf, 0xbb => 0x9802, 0xbc => 0x9803, 0xbd => 0x9b5a, + 0xbe => 0x9ce5, 0xbf => 0x9e75, 0xc0 => 0x9e7f, 0xc1 => 0x9ea5, + 0xc2 => 0x9ebb, 0xc3 => 0x50a2, 0xc4 => 0x508d, 0xc5 => 0x5085, + 0xc6 => 0x5099, 0xc7 => 0x5091, 0xc8 => 0x5080, 0xc9 => 0x5096, + 0xca => 0x5098, 0xcb => 0x509a, 0xcc => 0x6700, 0xcd => 0x51f1, + 0xce => 0x5272, 0xcf => 0x5274, 0xd0 => 0x5275, 0xd1 => 0x5269, + 0xd2 => 0x52de, 0xd3 => 0x52dd, 0xd4 => 0x52db, 0xd5 => 0x535a, + 0xd6 => 0x53a5, 0xd7 => 0x557b, 0xd8 => 0x5580, 0xd9 => 0x55a7, + 0xda => 0x557c, 0xdb => 0x558a, 0xdc => 0x559d, 0xdd => 0x5598, + 0xde => 0x5582, 0xdf => 0x559c, 0xe0 => 0x55aa, 0xe1 => 0x5594, + 0xe2 => 0x5587, 0xe3 => 0x558b, 0xe4 => 0x5583, 0xe5 => 0x55b3, + 0xe6 => 0x55ae, 0xe7 => 0x559f, 0xe8 => 0x553e, 0xe9 => 0x55b2, + 0xea => 0x559a, 0xeb => 0x55bb, 0xec => 0x55ac, 0xed => 0x55b1, + 0xee => 0x557e, 0xef => 0x5589, 0xf0 => 0x55ab, 0xf1 => 0x5599, + 0xf2 => 0x570d, 0xf3 => 0x582f, 0xf4 => 0x582a, 0xf5 => 0x5834, + 0xf6 => 0x5824, 0xf7 => 0x5830, 0xf8 => 0x5831, 0xf9 => 0x5821, + 0xfa => 0x581d, 0xfb => 0x5820, 0xfc => 0x58f9, 0xfd => 0x58fa, + 0xfe => 0x5960, + }, + 0xb4 => { + 0x40 => 0x5a77, 0x41 => 0x5a9a, 0x42 => 0x5a7f, 0x43 => 0x5a92, + 0x44 => 0x5a9b, 0x45 => 0x5aa7, 0x46 => 0x5b73, 0x47 => 0x5b71, + 0x48 => 0x5bd2, 0x49 => 0x5bcc, 0x4a => 0x5bd3, 0x4b => 0x5bd0, + 0x4c => 0x5c0a, 0x4d => 0x5c0b, 0x4e => 0x5c31, 0x4f => 0x5d4c, + 0x50 => 0x5d50, 0x51 => 0x5d34, 0x52 => 0x5d47, 0x53 => 0x5dfd, + 0x54 => 0x5e45, 0x55 => 0x5e3d, 0x56 => 0x5e40, 0x57 => 0x5e43, + 0x58 => 0x5e7e, 0x59 => 0x5eca, 0x5a => 0x5ec1, 0x5b => 0x5ec2, + 0x5c => 0x5ec4, 0x5d => 0x5f3c, 0x5e => 0x5f6d, 0x5f => 0x5fa9, + 0x60 => 0x5faa, 0x61 => 0x5fa8, 0x62 => 0x60d1, 0x63 => 0x60e1, + 0x64 => 0x60b2, 0x65 => 0x60b6, 0x66 => 0x60e0, 0x67 => 0x611c, + 0x68 => 0x6123, 0x69 => 0x60fa, 0x6a => 0x6115, 0x6b => 0x60f0, + 0x6c => 0x60fb, 0x6d => 0x60f4, 0x6e => 0x6168, 0x6f => 0x60f1, + 0x70 => 0x610e, 0x71 => 0x60f6, 0x72 => 0x6109, 0x73 => 0x6100, + 0x74 => 0x6112, 0x75 => 0x621f, 0x76 => 0x6249, 0x77 => 0x63a3, + 0x78 => 0x638c, 0x79 => 0x63cf, 0x7a => 0x63c0, 0x7b => 0x63e9, + 0x7c => 0x63c9, 0x7d => 0x63c6, 0x7e => 0x63cd, 0xa1 => 0x63d2, + 0xa2 => 0x63e3, 0xa3 => 0x63d0, 0xa4 => 0x63e1, 0xa5 => 0x63d6, + 0xa6 => 0x63ed, 0xa7 => 0x63ee, 0xa8 => 0x6376, 0xa9 => 0x63f4, + 0xaa => 0x63ea, 0xab => 0x63db, 0xac => 0x6452, 0xad => 0x63da, + 0xae => 0x63f9, 0xaf => 0x655e, 0xb0 => 0x6566, 0xb1 => 0x6562, + 0xb2 => 0x6563, 0xb3 => 0x6591, 0xb4 => 0x6590, 0xb5 => 0x65af, + 0xb6 => 0x666e, 0xb7 => 0x6670, 0xb8 => 0x6674, 0xb9 => 0x6676, + 0xba => 0x666f, 0xbb => 0x6691, 0xbc => 0x667a, 0xbd => 0x667e, + 0xbe => 0x6677, 0xbf => 0x66fe, 0xc0 => 0x66ff, 0xc1 => 0x671f, + 0xc2 => 0x671d, 0xc3 => 0x68fa, 0xc4 => 0x68d5, 0xc5 => 0x68e0, + 0xc6 => 0x68d8, 0xc7 => 0x68d7, 0xc8 => 0x6905, 0xc9 => 0x68df, + 0xca => 0x68f5, 0xcb => 0x68ee, 0xcc => 0x68e7, 0xcd => 0x68f9, + 0xce => 0x68d2, 0xcf => 0x68f2, 0xd0 => 0x68e3, 0xd1 => 0x68cb, + 0xd2 => 0x68cd, 0xd3 => 0x690d, 0xd4 => 0x6912, 0xd5 => 0x690e, + 0xd6 => 0x68c9, 0xd7 => 0x68da, 0xd8 => 0x696e, 0xd9 => 0x68fb, + 0xda => 0x6b3e, 0xdb => 0x6b3a, 0xdc => 0x6b3d, 0xdd => 0x6b98, + 0xde => 0x6b96, 0xdf => 0x6bbc, 0xe0 => 0x6bef, 0xe1 => 0x6c2e, + 0xe2 => 0x6c2f, 0xe3 => 0x6c2c, 0xe4 => 0x6e2f, 0xe5 => 0x6e38, + 0xe6 => 0x6e54, 0xe7 => 0x6e21, 0xe8 => 0x6e32, 0xe9 => 0x6e67, + 0xea => 0x6e4a, 0xeb => 0x6e20, 0xec => 0x6e25, 0xed => 0x6e23, + 0xee => 0x6e1b, 0xef => 0x6e5b, 0xf0 => 0x6e58, 0xf1 => 0x6e24, + 0xf2 => 0x6e56, 0xf3 => 0x6e6e, 0xf4 => 0x6e2d, 0xf5 => 0x6e26, + 0xf6 => 0x6e6f, 0xf7 => 0x6e34, 0xf8 => 0x6e4d, 0xf9 => 0x6e3a, + 0xfa => 0x6e2c, 0xfb => 0x6e43, 0xfc => 0x6e1d, 0xfd => 0x6e3e, + 0xfe => 0x6ecb, + }, + 0xb5 => { + 0x40 => 0x6e89, 0x41 => 0x6e19, 0x42 => 0x6e4e, 0x43 => 0x6e63, + 0x44 => 0x6e44, 0x45 => 0x6e72, 0x46 => 0x6e69, 0x47 => 0x6e5f, + 0x48 => 0x7119, 0x49 => 0x711a, 0x4a => 0x7126, 0x4b => 0x7130, + 0x4c => 0x7121, 0x4d => 0x7136, 0x4e => 0x716e, 0x4f => 0x711c, + 0x50 => 0x724c, 0x51 => 0x7284, 0x52 => 0x7280, 0x53 => 0x7336, + 0x54 => 0x7325, 0x55 => 0x7334, 0x56 => 0x7329, 0x57 => 0x743a, + 0x58 => 0x742a, 0x59 => 0x7433, 0x5a => 0x7422, 0x5b => 0x7425, + 0x5c => 0x7435, 0x5d => 0x7436, 0x5e => 0x7434, 0x5f => 0x742f, + 0x60 => 0x741b, 0x61 => 0x7426, 0x62 => 0x7428, 0x63 => 0x7525, + 0x64 => 0x7526, 0x65 => 0x756b, 0x66 => 0x756a, 0x67 => 0x75e2, + 0x68 => 0x75db, 0x69 => 0x75e3, 0x6a => 0x75d9, 0x6b => 0x75d8, + 0x6c => 0x75de, 0x6d => 0x75e0, 0x6e => 0x767b, 0x6f => 0x767c, + 0x70 => 0x7696, 0x71 => 0x7693, 0x72 => 0x76b4, 0x73 => 0x76dc, + 0x74 => 0x774f, 0x75 => 0x77ed, 0x76 => 0x785d, 0x77 => 0x786c, + 0x78 => 0x786f, 0x79 => 0x7a0d, 0x7a => 0x7a08, 0x7b => 0x7a0b, + 0x7c => 0x7a05, 0x7d => 0x7a00, 0x7e => 0x7a98, 0xa1 => 0x7a97, + 0xa2 => 0x7a96, 0xa3 => 0x7ae5, 0xa4 => 0x7ae3, 0xa5 => 0x7b49, + 0xa6 => 0x7b56, 0xa7 => 0x7b46, 0xa8 => 0x7b50, 0xa9 => 0x7b52, + 0xaa => 0x7b54, 0xab => 0x7b4d, 0xac => 0x7b4b, 0xad => 0x7b4f, + 0xae => 0x7b51, 0xaf => 0x7c9f, 0xb0 => 0x7ca5, 0xb1 => 0x7d5e, + 0xb2 => 0x7d50, 0xb3 => 0x7d68, 0xb4 => 0x7d55, 0xb5 => 0x7d2b, + 0xb6 => 0x7d6e, 0xb7 => 0x7d72, 0xb8 => 0x7d61, 0xb9 => 0x7d66, + 0xba => 0x7d62, 0xbb => 0x7d70, 0xbc => 0x7d73, 0xbd => 0x5584, + 0xbe => 0x7fd4, 0xbf => 0x7fd5, 0xc0 => 0x800b, 0xc1 => 0x8052, + 0xc2 => 0x8085, 0xc3 => 0x8155, 0xc4 => 0x8154, 0xc5 => 0x814b, + 0xc6 => 0x8151, 0xc7 => 0x814e, 0xc8 => 0x8139, 0xc9 => 0x8146, + 0xca => 0x813e, 0xcb => 0x814c, 0xcc => 0x8153, 0xcd => 0x8174, + 0xce => 0x8212, 0xcf => 0x821c, 0xd0 => 0x83e9, 0xd1 => 0x8403, + 0xd2 => 0x83f8, 0xd3 => 0x840d, 0xd4 => 0x83e0, 0xd5 => 0x83c5, + 0xd6 => 0x840b, 0xd7 => 0x83c1, 0xd8 => 0x83ef, 0xd9 => 0x83f1, + 0xda => 0x83f4, 0xdb => 0x8457, 0xdc => 0x840a, 0xdd => 0x83f0, + 0xde => 0x840c, 0xdf => 0x83cc, 0xe0 => 0x83fd, 0xe1 => 0x83f2, + 0xe2 => 0x83ca, 0xe3 => 0x8438, 0xe4 => 0x840e, 0xe5 => 0x8404, + 0xe6 => 0x83dc, 0xe7 => 0x8407, 0xe8 => 0x83d4, 0xe9 => 0x83df, + 0xea => 0x865b, 0xeb => 0x86df, 0xec => 0x86d9, 0xed => 0x86ed, + 0xee => 0x86d4, 0xef => 0x86db, 0xf0 => 0x86e4, 0xf1 => 0x86d0, + 0xf2 => 0x86de, 0xf3 => 0x8857, 0xf4 => 0x88c1, 0xf5 => 0x88c2, + 0xf6 => 0x88b1, 0xf7 => 0x8983, 0xf8 => 0x8996, 0xf9 => 0x8a3b, + 0xfa => 0x8a60, 0xfb => 0x8a55, 0xfc => 0x8a5e, 0xfd => 0x8a3c, + 0xfe => 0x8a41, + }, + 0xb6 => { + 0x40 => 0x8a54, 0x41 => 0x8a5b, 0x42 => 0x8a50, 0x43 => 0x8a46, + 0x44 => 0x8a34, 0x45 => 0x8a3a, 0x46 => 0x8a36, 0x47 => 0x8a56, + 0x48 => 0x8c61, 0x49 => 0x8c82, 0x4a => 0x8caf, 0x4b => 0x8cbc, + 0x4c => 0x8cb3, 0x4d => 0x8cbd, 0x4e => 0x8cc1, 0x4f => 0x8cbb, + 0x50 => 0x8cc0, 0x51 => 0x8cb4, 0x52 => 0x8cb7, 0x53 => 0x8cb6, + 0x54 => 0x8cbf, 0x55 => 0x8cb8, 0x56 => 0x8d8a, 0x57 => 0x8d85, + 0x58 => 0x8d81, 0x59 => 0x8dce, 0x5a => 0x8ddd, 0x5b => 0x8dcb, + 0x5c => 0x8dda, 0x5d => 0x8dd1, 0x5e => 0x8dcc, 0x5f => 0x8ddb, + 0x60 => 0x8dc6, 0x61 => 0x8efb, 0x62 => 0x8ef8, 0x63 => 0x8efc, + 0x64 => 0x8f9c, 0x65 => 0x902e, 0x66 => 0x9035, 0x67 => 0x9031, + 0x68 => 0x9038, 0x69 => 0x9032, 0x6a => 0x9036, 0x6b => 0x9102, + 0x6c => 0x90f5, 0x6d => 0x9109, 0x6e => 0x90fe, 0x6f => 0x9163, + 0x70 => 0x9165, 0x71 => 0x91cf, 0x72 => 0x9214, 0x73 => 0x9215, + 0x74 => 0x9223, 0x75 => 0x9209, 0x76 => 0x921e, 0x77 => 0x920d, + 0x78 => 0x9210, 0x79 => 0x9207, 0x7a => 0x9211, 0x7b => 0x9594, + 0x7c => 0x958f, 0x7d => 0x958b, 0x7e => 0x9591, 0xa1 => 0x9593, + 0xa2 => 0x9592, 0xa3 => 0x958e, 0xa4 => 0x968a, 0xa5 => 0x968e, + 0xa6 => 0x968b, 0xa7 => 0x967d, 0xa8 => 0x9685, 0xa9 => 0x9686, + 0xaa => 0x968d, 0xab => 0x9672, 0xac => 0x9684, 0xad => 0x96c1, + 0xae => 0x96c5, 0xaf => 0x96c4, 0xb0 => 0x96c6, 0xb1 => 0x96c7, + 0xb2 => 0x96ef, 0xb3 => 0x96f2, 0xb4 => 0x97cc, 0xb5 => 0x9805, + 0xb6 => 0x9806, 0xb7 => 0x9808, 0xb8 => 0x98e7, 0xb9 => 0x98ea, + 0xba => 0x98ef, 0xbb => 0x98e9, 0xbc => 0x98f2, 0xbd => 0x98ed, + 0xbe => 0x99ae, 0xbf => 0x99ad, 0xc0 => 0x9ec3, 0xc1 => 0x9ecd, + 0xc2 => 0x9ed1, 0xc3 => 0x4e82, 0xc4 => 0x50ad, 0xc5 => 0x50b5, + 0xc6 => 0x50b2, 0xc7 => 0x50b3, 0xc8 => 0x50c5, 0xc9 => 0x50be, + 0xca => 0x50ac, 0xcb => 0x50b7, 0xcc => 0x50bb, 0xcd => 0x50af, + 0xce => 0x50c7, 0xcf => 0x527f, 0xd0 => 0x5277, 0xd1 => 0x527d, + 0xd2 => 0x52df, 0xd3 => 0x52e6, 0xd4 => 0x52e4, 0xd5 => 0x52e2, + 0xd6 => 0x52e3, 0xd7 => 0x532f, 0xd8 => 0x55df, 0xd9 => 0x55e8, + 0xda => 0x55d3, 0xdb => 0x55e6, 0xdc => 0x55ce, 0xdd => 0x55dc, + 0xde => 0x55c7, 0xdf => 0x55d1, 0xe0 => 0x55e3, 0xe1 => 0x55e4, + 0xe2 => 0x55ef, 0xe3 => 0x55da, 0xe4 => 0x55e1, 0xe5 => 0x55c5, + 0xe6 => 0x55c6, 0xe7 => 0x55e5, 0xe8 => 0x55c9, 0xe9 => 0x5712, + 0xea => 0x5713, 0xeb => 0x585e, 0xec => 0x5851, 0xed => 0x5858, + 0xee => 0x5857, 0xef => 0x585a, 0xf0 => 0x5854, 0xf1 => 0x586b, + 0xf2 => 0x584c, 0xf3 => 0x586d, 0xf4 => 0x584a, 0xf5 => 0x5862, + 0xf6 => 0x5852, 0xf7 => 0x584b, 0xf8 => 0x5967, 0xf9 => 0x5ac1, + 0xfa => 0x5ac9, 0xfb => 0x5acc, 0xfc => 0x5abe, 0xfd => 0x5abd, + 0xfe => 0x5abc, + }, + 0xb7 => { + 0x40 => 0x5ab3, 0x41 => 0x5ac2, 0x42 => 0x5ab2, 0x43 => 0x5d69, + 0x44 => 0x5d6f, 0x45 => 0x5e4c, 0x46 => 0x5e79, 0x47 => 0x5ec9, + 0x48 => 0x5ec8, 0x49 => 0x5f12, 0x4a => 0x5f59, 0x4b => 0x5fac, + 0x4c => 0x5fae, 0x4d => 0x611a, 0x4e => 0x610f, 0x4f => 0x6148, + 0x50 => 0x611f, 0x51 => 0x60f3, 0x52 => 0x611b, 0x53 => 0x60f9, + 0x54 => 0x6101, 0x55 => 0x6108, 0x56 => 0x614e, 0x57 => 0x614c, + 0x58 => 0x6144, 0x59 => 0x614d, 0x5a => 0x613e, 0x5b => 0x6134, + 0x5c => 0x6127, 0x5d => 0x610d, 0x5e => 0x6106, 0x5f => 0x6137, + 0x60 => 0x6221, 0x61 => 0x6222, 0x62 => 0x6413, 0x63 => 0x643e, + 0x64 => 0x641e, 0x65 => 0x642a, 0x66 => 0x642d, 0x67 => 0x643d, + 0x68 => 0x642c, 0x69 => 0x640f, 0x6a => 0x641c, 0x6b => 0x6414, + 0x6c => 0x640d, 0x6d => 0x6436, 0x6e => 0x6416, 0x6f => 0x6417, + 0x70 => 0x6406, 0x71 => 0x656c, 0x72 => 0x659f, 0x73 => 0x65b0, + 0x74 => 0x6697, 0x75 => 0x6689, 0x76 => 0x6687, 0x77 => 0x6688, + 0x78 => 0x6696, 0x79 => 0x6684, 0x7a => 0x6698, 0x7b => 0x668d, + 0x7c => 0x6703, 0x7d => 0x6994, 0x7e => 0x696d, 0xa1 => 0x695a, + 0xa2 => 0x6977, 0xa3 => 0x6960, 0xa4 => 0x6954, 0xa5 => 0x6975, + 0xa6 => 0x6930, 0xa7 => 0x6982, 0xa8 => 0x694a, 0xa9 => 0x6968, + 0xaa => 0x696b, 0xab => 0x695e, 0xac => 0x6953, 0xad => 0x6979, + 0xae => 0x6986, 0xaf => 0x695d, 0xb0 => 0x6963, 0xb1 => 0x695b, + 0xb2 => 0x6b47, 0xb3 => 0x6b72, 0xb4 => 0x6bc0, 0xb5 => 0x6bbf, + 0xb6 => 0x6bd3, 0xb7 => 0x6bfd, 0xb8 => 0x6ea2, 0xb9 => 0x6eaf, + 0xba => 0x6ed3, 0xbb => 0x6eb6, 0xbc => 0x6ec2, 0xbd => 0x6e90, + 0xbe => 0x6e9d, 0xbf => 0x6ec7, 0xc0 => 0x6ec5, 0xc1 => 0x6ea5, + 0xc2 => 0x6e98, 0xc3 => 0x6ebc, 0xc4 => 0x6eba, 0xc5 => 0x6eab, + 0xc6 => 0x6ed1, 0xc7 => 0x6e96, 0xc8 => 0x6e9c, 0xc9 => 0x6ec4, + 0xca => 0x6ed4, 0xcb => 0x6eaa, 0xcc => 0x6ea7, 0xcd => 0x6eb4, + 0xce => 0x714e, 0xcf => 0x7159, 0xd0 => 0x7169, 0xd1 => 0x7164, + 0xd2 => 0x7149, 0xd3 => 0x7167, 0xd4 => 0x715c, 0xd5 => 0x716c, + 0xd6 => 0x7166, 0xd7 => 0x714c, 0xd8 => 0x7165, 0xd9 => 0x715e, + 0xda => 0x7146, 0xdb => 0x7168, 0xdc => 0x7156, 0xdd => 0x723a, + 0xde => 0x7252, 0xdf => 0x7337, 0xe0 => 0x7345, 0xe1 => 0x733f, + 0xe2 => 0x733e, 0xe3 => 0x746f, 0xe4 => 0x745a, 0xe5 => 0x7455, + 0xe6 => 0x745f, 0xe7 => 0x745e, 0xe8 => 0x7441, 0xe9 => 0x743f, + 0xea => 0x7459, 0xeb => 0x745b, 0xec => 0x745c, 0xed => 0x7576, + 0xee => 0x7578, 0xef => 0x7600, 0xf0 => 0x75f0, 0xf1 => 0x7601, + 0xf2 => 0x75f2, 0xf3 => 0x75f1, 0xf4 => 0x75fa, 0xf5 => 0x75ff, + 0xf6 => 0x75f4, 0xf7 => 0x75f3, 0xf8 => 0x76de, 0xf9 => 0x76df, + 0xfa => 0x775b, 0xfb => 0x776b, 0xfc => 0x7766, 0xfd => 0x775e, + 0xfe => 0x7763, + }, + 0xb8 => { + 0x40 => 0x7779, 0x41 => 0x776a, 0x42 => 0x776c, 0x43 => 0x775c, + 0x44 => 0x7765, 0x45 => 0x7768, 0x46 => 0x7762, 0x47 => 0x77ee, + 0x48 => 0x788e, 0x49 => 0x78b0, 0x4a => 0x7897, 0x4b => 0x7898, + 0x4c => 0x788c, 0x4d => 0x7889, 0x4e => 0x787c, 0x4f => 0x7891, + 0x50 => 0x7893, 0x51 => 0x787f, 0x52 => 0x797a, 0x53 => 0x797f, + 0x54 => 0x7981, 0x55 => 0x842c, 0x56 => 0x79bd, 0x57 => 0x7a1c, + 0x58 => 0x7a1a, 0x59 => 0x7a20, 0x5a => 0x7a14, 0x5b => 0x7a1f, + 0x5c => 0x7a1e, 0x5d => 0x7a9f, 0x5e => 0x7aa0, 0x5f => 0x7b77, + 0x60 => 0x7bc0, 0x61 => 0x7b60, 0x62 => 0x7b6e, 0x63 => 0x7b67, + 0x64 => 0x7cb1, 0x65 => 0x7cb3, 0x66 => 0x7cb5, 0x67 => 0x7d93, + 0x68 => 0x7d79, 0x69 => 0x7d91, 0x6a => 0x7d81, 0x6b => 0x7d8f, + 0x6c => 0x7d5b, 0x6d => 0x7f6e, 0x6e => 0x7f69, 0x6f => 0x7f6a, + 0x70 => 0x7f72, 0x71 => 0x7fa9, 0x72 => 0x7fa8, 0x73 => 0x7fa4, + 0x74 => 0x8056, 0x75 => 0x8058, 0x76 => 0x8086, 0x77 => 0x8084, + 0x78 => 0x8171, 0x79 => 0x8170, 0x7a => 0x8178, 0x7b => 0x8165, + 0x7c => 0x816e, 0x7d => 0x8173, 0x7e => 0x816b, 0xa1 => 0x8179, + 0xa2 => 0x817a, 0xa3 => 0x8166, 0xa4 => 0x8205, 0xa5 => 0x8247, + 0xa6 => 0x8482, 0xa7 => 0x8477, 0xa8 => 0x843d, 0xa9 => 0x8431, + 0xaa => 0x8475, 0xab => 0x8466, 0xac => 0x846b, 0xad => 0x8449, + 0xae => 0x846c, 0xaf => 0x845b, 0xb0 => 0x843c, 0xb1 => 0x8435, + 0xb2 => 0x8461, 0xb3 => 0x8463, 0xb4 => 0x8469, 0xb5 => 0x846d, + 0xb6 => 0x8446, 0xb7 => 0x865e, 0xb8 => 0x865c, 0xb9 => 0x865f, + 0xba => 0x86f9, 0xbb => 0x8713, 0xbc => 0x8708, 0xbd => 0x8707, + 0xbe => 0x8700, 0xbf => 0x86fe, 0xc0 => 0x86fb, 0xc1 => 0x8702, + 0xc2 => 0x8703, 0xc3 => 0x8706, 0xc4 => 0x870a, 0xc5 => 0x8859, + 0xc6 => 0x88df, 0xc7 => 0x88d4, 0xc8 => 0x88d9, 0xc9 => 0x88dc, + 0xca => 0x88d8, 0xcb => 0x88dd, 0xcc => 0x88e1, 0xcd => 0x88ca, + 0xce => 0x88d5, 0xcf => 0x88d2, 0xd0 => 0x899c, 0xd1 => 0x89e3, + 0xd2 => 0x8a6b, 0xd3 => 0x8a72, 0xd4 => 0x8a73, 0xd5 => 0x8a66, + 0xd6 => 0x8a69, 0xd7 => 0x8a70, 0xd8 => 0x8a87, 0xd9 => 0x8a7c, + 0xda => 0x8a63, 0xdb => 0x8aa0, 0xdc => 0x8a71, 0xdd => 0x8a85, + 0xde => 0x8a6d, 0xdf => 0x8a62, 0xe0 => 0x8a6e, 0xe1 => 0x8a6c, + 0xe2 => 0x8a79, 0xe3 => 0x8a7b, 0xe4 => 0x8a3e, 0xe5 => 0x8a68, + 0xe6 => 0x8c62, 0xe7 => 0x8c8a, 0xe8 => 0x8c89, 0xe9 => 0x8cca, + 0xea => 0x8cc7, 0xeb => 0x8cc8, 0xec => 0x8cc4, 0xed => 0x8cb2, + 0xee => 0x8cc3, 0xef => 0x8cc2, 0xf0 => 0x8cc5, 0xf1 => 0x8de1, + 0xf2 => 0x8ddf, 0xf3 => 0x8de8, 0xf4 => 0x8def, 0xf5 => 0x8df3, + 0xf6 => 0x8dfa, 0xf7 => 0x8dea, 0xf8 => 0x8de4, 0xf9 => 0x8de6, + 0xfa => 0x8eb2, 0xfb => 0x8f03, 0xfc => 0x8f09, 0xfd => 0x8efe, + 0xfe => 0x8f0a, + }, + 0xb9 => { + 0x40 => 0x8f9f, 0x41 => 0x8fb2, 0x42 => 0x904b, 0x43 => 0x904a, + 0x44 => 0x9053, 0x45 => 0x9042, 0x46 => 0x9054, 0x47 => 0x903c, + 0x48 => 0x9055, 0x49 => 0x9050, 0x4a => 0x9047, 0x4b => 0x904f, + 0x4c => 0x904e, 0x4d => 0x904d, 0x4e => 0x9051, 0x4f => 0x903e, + 0x50 => 0x9041, 0x51 => 0x9112, 0x52 => 0x9117, 0x53 => 0x916c, + 0x54 => 0x916a, 0x55 => 0x9169, 0x56 => 0x91c9, 0x57 => 0x9237, + 0x58 => 0x9257, 0x59 => 0x9238, 0x5a => 0x923d, 0x5b => 0x9240, + 0x5c => 0x923e, 0x5d => 0x925b, 0x5e => 0x924b, 0x5f => 0x9264, + 0x60 => 0x9251, 0x61 => 0x9234, 0x62 => 0x9249, 0x63 => 0x924d, + 0x64 => 0x9245, 0x65 => 0x9239, 0x66 => 0x923f, 0x67 => 0x925a, + 0x68 => 0x9598, 0x69 => 0x9698, 0x6a => 0x9694, 0x6b => 0x9695, + 0x6c => 0x96cd, 0x6d => 0x96cb, 0x6e => 0x96c9, 0x6f => 0x96ca, + 0x70 => 0x96f7, 0x71 => 0x96fb, 0x72 => 0x96f9, 0x73 => 0x96f6, + 0x74 => 0x9756, 0x75 => 0x9774, 0x76 => 0x9776, 0x77 => 0x9810, + 0x78 => 0x9811, 0x79 => 0x9813, 0x7a => 0x980a, 0x7b => 0x9812, + 0x7c => 0x980c, 0x7d => 0x98fc, 0x7e => 0x98f4, 0xa1 => 0x98fd, + 0xa2 => 0x98fe, 0xa3 => 0x99b3, 0xa4 => 0x99b1, 0xa5 => 0x99b4, + 0xa6 => 0x9ae1, 0xa7 => 0x9ce9, 0xa8 => 0x9e82, 0xa9 => 0x9f0e, + 0xaa => 0x9f13, 0xab => 0x9f20, 0xac => 0x50e7, 0xad => 0x50ee, + 0xae => 0x50e5, 0xaf => 0x50d6, 0xb0 => 0x50ed, 0xb1 => 0x50da, + 0xb2 => 0x50d5, 0xb3 => 0x50cf, 0xb4 => 0x50d1, 0xb5 => 0x50f1, + 0xb6 => 0x50ce, 0xb7 => 0x50e9, 0xb8 => 0x5162, 0xb9 => 0x51f3, + 0xba => 0x5283, 0xbb => 0x5282, 0xbc => 0x5331, 0xbd => 0x53ad, + 0xbe => 0x55fe, 0xbf => 0x5600, 0xc0 => 0x561b, 0xc1 => 0x5617, + 0xc2 => 0x55fd, 0xc3 => 0x5614, 0xc4 => 0x5606, 0xc5 => 0x5609, + 0xc6 => 0x560d, 0xc7 => 0x560e, 0xc8 => 0x55f7, 0xc9 => 0x5616, + 0xca => 0x561f, 0xcb => 0x5608, 0xcc => 0x5610, 0xcd => 0x55f6, + 0xce => 0x5718, 0xcf => 0x5716, 0xd0 => 0x5875, 0xd1 => 0x587e, + 0xd2 => 0x5883, 0xd3 => 0x5893, 0xd4 => 0x588a, 0xd5 => 0x5879, + 0xd6 => 0x5885, 0xd7 => 0x587d, 0xd8 => 0x58fd, 0xd9 => 0x5925, + 0xda => 0x5922, 0xdb => 0x5924, 0xdc => 0x596a, 0xdd => 0x5969, + 0xde => 0x5ae1, 0xdf => 0x5ae6, 0xe0 => 0x5ae9, 0xe1 => 0x5ad7, + 0xe2 => 0x5ad6, 0xe3 => 0x5ad8, 0xe4 => 0x5ae3, 0xe5 => 0x5b75, + 0xe6 => 0x5bde, 0xe7 => 0x5be7, 0xe8 => 0x5be1, 0xe9 => 0x5be5, + 0xea => 0x5be6, 0xeb => 0x5be8, 0xec => 0x5be2, 0xed => 0x5be4, + 0xee => 0x5bdf, 0xef => 0x5c0d, 0xf0 => 0x5c62, 0xf1 => 0x5d84, + 0xf2 => 0x5d87, 0xf3 => 0x5e5b, 0xf4 => 0x5e63, 0xf5 => 0x5e55, + 0xf6 => 0x5e57, 0xf7 => 0x5e54, 0xf8 => 0x5ed3, 0xf9 => 0x5ed6, + 0xfa => 0x5f0a, 0xfb => 0x5f46, 0xfc => 0x5f70, 0xfd => 0x5fb9, + 0xfe => 0x6147, + }, + 0xba => { + 0x40 => 0x613f, 0x41 => 0x614b, 0x42 => 0x6177, 0x43 => 0x6162, + 0x44 => 0x6163, 0x45 => 0x615f, 0x46 => 0x615a, 0x47 => 0x6158, + 0x48 => 0x6175, 0x49 => 0x622a, 0x4a => 0x6487, 0x4b => 0x6458, + 0x4c => 0x6454, 0x4d => 0x64a4, 0x4e => 0x6478, 0x4f => 0x645f, + 0x50 => 0x647a, 0x51 => 0x6451, 0x52 => 0x6467, 0x53 => 0x6434, + 0x54 => 0x646d, 0x55 => 0x647b, 0x56 => 0x6572, 0x57 => 0x65a1, + 0x58 => 0x65d7, 0x59 => 0x65d6, 0x5a => 0x66a2, 0x5b => 0x66a8, + 0x5c => 0x669d, 0x5d => 0x699c, 0x5e => 0x69a8, 0x5f => 0x6995, + 0x60 => 0x69c1, 0x61 => 0x69ae, 0x62 => 0x69d3, 0x63 => 0x69cb, + 0x64 => 0x699b, 0x65 => 0x69b7, 0x66 => 0x69bb, 0x67 => 0x69ab, + 0x68 => 0x69b4, 0x69 => 0x69d0, 0x6a => 0x69cd, 0x6b => 0x69ad, + 0x6c => 0x69cc, 0x6d => 0x69a6, 0x6e => 0x69c3, 0x6f => 0x69a3, + 0x70 => 0x6b49, 0x71 => 0x6b4c, 0x72 => 0x6c33, 0x73 => 0x6f33, + 0x74 => 0x6f14, 0x75 => 0x6efe, 0x76 => 0x6f13, 0x77 => 0x6ef4, + 0x78 => 0x6f29, 0x79 => 0x6f3e, 0x7a => 0x6f20, 0x7b => 0x6f2c, + 0x7c => 0x6f0f, 0x7d => 0x6f02, 0x7e => 0x6f22, 0xa1 => 0x6eff, + 0xa2 => 0x6eef, 0xa3 => 0x6f06, 0xa4 => 0x6f31, 0xa5 => 0x6f38, + 0xa6 => 0x6f32, 0xa7 => 0x6f23, 0xa8 => 0x6f15, 0xa9 => 0x6f2b, + 0xaa => 0x6f2f, 0xab => 0x6f88, 0xac => 0x6f2a, 0xad => 0x6eec, + 0xae => 0x6f01, 0xaf => 0x6ef2, 0xb0 => 0x6ecc, 0xb1 => 0x6ef7, + 0xb2 => 0x7194, 0xb3 => 0x7199, 0xb4 => 0x717d, 0xb5 => 0x718a, + 0xb6 => 0x7184, 0xb7 => 0x7192, 0xb8 => 0x723e, 0xb9 => 0x7292, + 0xba => 0x7296, 0xbb => 0x7344, 0xbc => 0x7350, 0xbd => 0x7464, + 0xbe => 0x7463, 0xbf => 0x746a, 0xc0 => 0x7470, 0xc1 => 0x746d, + 0xc2 => 0x7504, 0xc3 => 0x7591, 0xc4 => 0x7627, 0xc5 => 0x760d, + 0xc6 => 0x760b, 0xc7 => 0x7609, 0xc8 => 0x7613, 0xc9 => 0x76e1, + 0xca => 0x76e3, 0xcb => 0x7784, 0xcc => 0x777d, 0xcd => 0x777f, + 0xce => 0x7761, 0xcf => 0x78c1, 0xd0 => 0x789f, 0xd1 => 0x78a7, + 0xd2 => 0x78b3, 0xd3 => 0x78a9, 0xd4 => 0x78a3, 0xd5 => 0x798e, + 0xd6 => 0x798f, 0xd7 => 0x798d, 0xd8 => 0x7a2e, 0xd9 => 0x7a31, + 0xda => 0x7aaa, 0xdb => 0x7aa9, 0xdc => 0x7aed, 0xdd => 0x7aef, + 0xde => 0x7ba1, 0xdf => 0x7b95, 0xe0 => 0x7b8b, 0xe1 => 0x7b75, + 0xe2 => 0x7b97, 0xe3 => 0x7b9d, 0xe4 => 0x7b94, 0xe5 => 0x7b8f, + 0xe6 => 0x7bb8, 0xe7 => 0x7b87, 0xe8 => 0x7b84, 0xe9 => 0x7cb9, + 0xea => 0x7cbd, 0xeb => 0x7cbe, 0xec => 0x7dbb, 0xed => 0x7db0, + 0xee => 0x7d9c, 0xef => 0x7dbd, 0xf0 => 0x7dbe, 0xf1 => 0x7da0, + 0xf2 => 0x7dca, 0xf3 => 0x7db4, 0xf4 => 0x7db2, 0xf5 => 0x7db1, + 0xf6 => 0x7dba, 0xf7 => 0x7da2, 0xf8 => 0x7dbf, 0xf9 => 0x7db5, + 0xfa => 0x7db8, 0xfb => 0x7dad, 0xfc => 0x7dd2, 0xfd => 0x7dc7, + 0xfe => 0x7dac, + }, + 0xbb => { + 0x40 => 0x7f70, 0x41 => 0x7fe0, 0x42 => 0x7fe1, 0x43 => 0x7fdf, + 0x44 => 0x805e, 0x45 => 0x805a, 0x46 => 0x8087, 0x47 => 0x8150, + 0x48 => 0x8180, 0x49 => 0x818f, 0x4a => 0x8188, 0x4b => 0x818a, + 0x4c => 0x817f, 0x4d => 0x8182, 0x4e => 0x81e7, 0x4f => 0x81fa, + 0x50 => 0x8207, 0x51 => 0x8214, 0x52 => 0x821e, 0x53 => 0x824b, + 0x54 => 0x84c9, 0x55 => 0x84bf, 0x56 => 0x84c6, 0x57 => 0x84c4, + 0x58 => 0x8499, 0x59 => 0x849e, 0x5a => 0x84b2, 0x5b => 0x849c, + 0x5c => 0x84cb, 0x5d => 0x84b8, 0x5e => 0x84c0, 0x5f => 0x84d3, + 0x60 => 0x8490, 0x61 => 0x84bc, 0x62 => 0x84d1, 0x63 => 0x84ca, + 0x64 => 0x873f, 0x65 => 0x871c, 0x66 => 0x873b, 0x67 => 0x8722, + 0x68 => 0x8725, 0x69 => 0x8734, 0x6a => 0x8718, 0x6b => 0x8755, + 0x6c => 0x8737, 0x6d => 0x8729, 0x6e => 0x88f3, 0x6f => 0x8902, + 0x70 => 0x88f4, 0x71 => 0x88f9, 0x72 => 0x88f8, 0x73 => 0x88fd, + 0x74 => 0x88e8, 0x75 => 0x891a, 0x76 => 0x88ef, 0x77 => 0x8aa6, + 0x78 => 0x8a8c, 0x79 => 0x8a9e, 0x7a => 0x8aa3, 0x7b => 0x8a8d, + 0x7c => 0x8aa1, 0x7d => 0x8a93, 0x7e => 0x8aa4, 0xa1 => 0x8aaa, + 0xa2 => 0x8aa5, 0xa3 => 0x8aa8, 0xa4 => 0x8a98, 0xa5 => 0x8a91, + 0xa6 => 0x8a9a, 0xa7 => 0x8aa7, 0xa8 => 0x8c6a, 0xa9 => 0x8c8d, + 0xaa => 0x8c8c, 0xab => 0x8cd3, 0xac => 0x8cd1, 0xad => 0x8cd2, + 0xae => 0x8d6b, 0xaf => 0x8d99, 0xb0 => 0x8d95, 0xb1 => 0x8dfc, + 0xb2 => 0x8f14, 0xb3 => 0x8f12, 0xb4 => 0x8f15, 0xb5 => 0x8f13, + 0xb6 => 0x8fa3, 0xb7 => 0x9060, 0xb8 => 0x9058, 0xb9 => 0x905c, + 0xba => 0x9063, 0xbb => 0x9059, 0xbc => 0x905e, 0xbd => 0x9062, + 0xbe => 0x905d, 0xbf => 0x905b, 0xc0 => 0x9119, 0xc1 => 0x9118, + 0xc2 => 0x911e, 0xc3 => 0x9175, 0xc4 => 0x9178, 0xc5 => 0x9177, + 0xc6 => 0x9174, 0xc7 => 0x9278, 0xc8 => 0x9280, 0xc9 => 0x9285, + 0xca => 0x9298, 0xcb => 0x9296, 0xcc => 0x927b, 0xcd => 0x9293, + 0xce => 0x929c, 0xcf => 0x92a8, 0xd0 => 0x927c, 0xd1 => 0x9291, + 0xd2 => 0x95a1, 0xd3 => 0x95a8, 0xd4 => 0x95a9, 0xd5 => 0x95a3, + 0xd6 => 0x95a5, 0xd7 => 0x95a4, 0xd8 => 0x9699, 0xd9 => 0x969c, + 0xda => 0x969b, 0xdb => 0x96cc, 0xdc => 0x96d2, 0xdd => 0x9700, + 0xde => 0x977c, 0xdf => 0x9785, 0xe0 => 0x97f6, 0xe1 => 0x9817, + 0xe2 => 0x9818, 0xe3 => 0x98af, 0xe4 => 0x98b1, 0xe5 => 0x9903, + 0xe6 => 0x9905, 0xe7 => 0x990c, 0xe8 => 0x9909, 0xe9 => 0x99c1, + 0xea => 0x9aaf, 0xeb => 0x9ab0, 0xec => 0x9ae6, 0xed => 0x9b41, + 0xee => 0x9b42, 0xef => 0x9cf4, 0xf0 => 0x9cf6, 0xf1 => 0x9cf3, + 0xf2 => 0x9ebc, 0xf3 => 0x9f3b, 0xf4 => 0x9f4a, 0xf5 => 0x5104, + 0xf6 => 0x5100, 0xf7 => 0x50fb, 0xf8 => 0x50f5, 0xf9 => 0x50f9, + 0xfa => 0x5102, 0xfb => 0x5108, 0xfc => 0x5109, 0xfd => 0x5105, + 0xfe => 0x51dc, + }, + 0xbc => { + 0x40 => 0x5287, 0x41 => 0x5288, 0x42 => 0x5289, 0x43 => 0x528d, + 0x44 => 0x528a, 0x45 => 0x52f0, 0x46 => 0x53b2, 0x47 => 0x562e, + 0x48 => 0x563b, 0x49 => 0x5639, 0x4a => 0x5632, 0x4b => 0x563f, + 0x4c => 0x5634, 0x4d => 0x5629, 0x4e => 0x5653, 0x4f => 0x564e, + 0x50 => 0x5657, 0x51 => 0x5674, 0x52 => 0x5636, 0x53 => 0x562f, + 0x54 => 0x5630, 0x55 => 0x5880, 0x56 => 0x589f, 0x57 => 0x589e, + 0x58 => 0x58b3, 0x59 => 0x589c, 0x5a => 0x58ae, 0x5b => 0x58a9, + 0x5c => 0x58a6, 0x5d => 0x596d, 0x5e => 0x5b09, 0x5f => 0x5afb, + 0x60 => 0x5b0b, 0x61 => 0x5af5, 0x62 => 0x5b0c, 0x63 => 0x5b08, + 0x64 => 0x5bee, 0x65 => 0x5bec, 0x66 => 0x5be9, 0x67 => 0x5beb, + 0x68 => 0x5c64, 0x69 => 0x5c65, 0x6a => 0x5d9d, 0x6b => 0x5d94, + 0x6c => 0x5e62, 0x6d => 0x5e5f, 0x6e => 0x5e61, 0x6f => 0x5ee2, + 0x70 => 0x5eda, 0x71 => 0x5edf, 0x72 => 0x5edd, 0x73 => 0x5ee3, + 0x74 => 0x5ee0, 0x75 => 0x5f48, 0x76 => 0x5f71, 0x77 => 0x5fb7, + 0x78 => 0x5fb5, 0x79 => 0x6176, 0x7a => 0x6167, 0x7b => 0x616e, + 0x7c => 0x615d, 0x7d => 0x6155, 0x7e => 0x6182, 0xa1 => 0x617c, + 0xa2 => 0x6170, 0xa3 => 0x616b, 0xa4 => 0x617e, 0xa5 => 0x61a7, + 0xa6 => 0x6190, 0xa7 => 0x61ab, 0xa8 => 0x618e, 0xa9 => 0x61ac, + 0xaa => 0x619a, 0xab => 0x61a4, 0xac => 0x6194, 0xad => 0x61ae, + 0xae => 0x622e, 0xaf => 0x6469, 0xb0 => 0x646f, 0xb1 => 0x6479, + 0xb2 => 0x649e, 0xb3 => 0x64b2, 0xb4 => 0x6488, 0xb5 => 0x6490, + 0xb6 => 0x64b0, 0xb7 => 0x64a5, 0xb8 => 0x6493, 0xb9 => 0x6495, + 0xba => 0x64a9, 0xbb => 0x6492, 0xbc => 0x64ae, 0xbd => 0x64ad, + 0xbe => 0x64ab, 0xbf => 0x649a, 0xc0 => 0x64ac, 0xc1 => 0x6499, + 0xc2 => 0x64a2, 0xc3 => 0x64b3, 0xc4 => 0x6575, 0xc5 => 0x6577, + 0xc6 => 0x6578, 0xc7 => 0x66ae, 0xc8 => 0x66ab, 0xc9 => 0x66b4, + 0xca => 0x66b1, 0xcb => 0x6a23, 0xcc => 0x6a1f, 0xcd => 0x69e8, + 0xce => 0x6a01, 0xcf => 0x6a1e, 0xd0 => 0x6a19, 0xd1 => 0x69fd, + 0xd2 => 0x6a21, 0xd3 => 0x6a13, 0xd4 => 0x6a0a, 0xd5 => 0x69f3, + 0xd6 => 0x6a02, 0xd7 => 0x6a05, 0xd8 => 0x69ed, 0xd9 => 0x6a11, + 0xda => 0x6b50, 0xdb => 0x6b4e, 0xdc => 0x6ba4, 0xdd => 0x6bc5, + 0xde => 0x6bc6, 0xdf => 0x6f3f, 0xe0 => 0x6f7c, 0xe1 => 0x6f84, + 0xe2 => 0x6f51, 0xe3 => 0x6f66, 0xe4 => 0x6f54, 0xe5 => 0x6f86, + 0xe6 => 0x6f6d, 0xe7 => 0x6f5b, 0xe8 => 0x6f78, 0xe9 => 0x6f6e, + 0xea => 0x6f8e, 0xeb => 0x6f7a, 0xec => 0x6f70, 0xed => 0x6f64, + 0xee => 0x6f97, 0xef => 0x6f58, 0xf0 => 0x6ed5, 0xf1 => 0x6f6f, + 0xf2 => 0x6f60, 0xf3 => 0x6f5f, 0xf4 => 0x719f, 0xf5 => 0x71ac, + 0xf6 => 0x71b1, 0xf7 => 0x71a8, 0xf8 => 0x7256, 0xf9 => 0x729b, + 0xfa => 0x734e, 0xfb => 0x7357, 0xfc => 0x7469, 0xfd => 0x748b, + 0xfe => 0x7483, + }, + 0xbd => { + 0x40 => 0x747e, 0x41 => 0x7480, 0x42 => 0x757f, 0x43 => 0x7620, + 0x44 => 0x7629, 0x45 => 0x761f, 0x46 => 0x7624, 0x47 => 0x7626, + 0x48 => 0x7621, 0x49 => 0x7622, 0x4a => 0x769a, 0x4b => 0x76ba, + 0x4c => 0x76e4, 0x4d => 0x778e, 0x4e => 0x7787, 0x4f => 0x778c, + 0x50 => 0x7791, 0x51 => 0x778b, 0x52 => 0x78cb, 0x53 => 0x78c5, + 0x54 => 0x78ba, 0x55 => 0x78ca, 0x56 => 0x78be, 0x57 => 0x78d5, + 0x58 => 0x78bc, 0x59 => 0x78d0, 0x5a => 0x7a3f, 0x5b => 0x7a3c, + 0x5c => 0x7a40, 0x5d => 0x7a3d, 0x5e => 0x7a37, 0x5f => 0x7a3b, + 0x60 => 0x7aaf, 0x61 => 0x7aae, 0x62 => 0x7bad, 0x63 => 0x7bb1, + 0x64 => 0x7bc4, 0x65 => 0x7bb4, 0x66 => 0x7bc6, 0x67 => 0x7bc7, + 0x68 => 0x7bc1, 0x69 => 0x7ba0, 0x6a => 0x7bcc, 0x6b => 0x7cca, + 0x6c => 0x7de0, 0x6d => 0x7df4, 0x6e => 0x7def, 0x6f => 0x7dfb, + 0x70 => 0x7dd8, 0x71 => 0x7dec, 0x72 => 0x7ddd, 0x73 => 0x7de8, + 0x74 => 0x7de3, 0x75 => 0x7dda, 0x76 => 0x7dde, 0x77 => 0x7de9, + 0x78 => 0x7d9e, 0x79 => 0x7dd9, 0x7a => 0x7df2, 0x7b => 0x7df9, + 0x7c => 0x7f75, 0x7d => 0x7f77, 0x7e => 0x7faf, 0xa1 => 0x7fe9, + 0xa2 => 0x8026, 0xa3 => 0x819b, 0xa4 => 0x819c, 0xa5 => 0x819d, + 0xa6 => 0x81a0, 0xa7 => 0x819a, 0xa8 => 0x8198, 0xa9 => 0x8517, + 0xaa => 0x853d, 0xab => 0x851a, 0xac => 0x84ee, 0xad => 0x852c, + 0xae => 0x852d, 0xaf => 0x8513, 0xb0 => 0x8511, 0xb1 => 0x8523, + 0xb2 => 0x8521, 0xb3 => 0x8514, 0xb4 => 0x84ec, 0xb5 => 0x8525, + 0xb6 => 0x84ff, 0xb7 => 0x8506, 0xb8 => 0x8782, 0xb9 => 0x8774, + 0xba => 0x8776, 0xbb => 0x8760, 0xbc => 0x8766, 0xbd => 0x8778, + 0xbe => 0x8768, 0xbf => 0x8759, 0xc0 => 0x8757, 0xc1 => 0x874c, + 0xc2 => 0x8753, 0xc3 => 0x885b, 0xc4 => 0x885d, 0xc5 => 0x8910, + 0xc6 => 0x8907, 0xc7 => 0x8912, 0xc8 => 0x8913, 0xc9 => 0x8915, + 0xca => 0x890a, 0xcb => 0x8abc, 0xcc => 0x8ad2, 0xcd => 0x8ac7, + 0xce => 0x8ac4, 0xcf => 0x8a95, 0xd0 => 0x8acb, 0xd1 => 0x8af8, + 0xd2 => 0x8ab2, 0xd3 => 0x8ac9, 0xd4 => 0x8ac2, 0xd5 => 0x8abf, + 0xd6 => 0x8ab0, 0xd7 => 0x8ad6, 0xd8 => 0x8acd, 0xd9 => 0x8ab6, + 0xda => 0x8ab9, 0xdb => 0x8adb, 0xdc => 0x8c4c, 0xdd => 0x8c4e, + 0xde => 0x8c6c, 0xdf => 0x8ce0, 0xe0 => 0x8cde, 0xe1 => 0x8ce6, + 0xe2 => 0x8ce4, 0xe3 => 0x8cec, 0xe4 => 0x8ced, 0xe5 => 0x8ce2, + 0xe6 => 0x8ce3, 0xe7 => 0x8cdc, 0xe8 => 0x8cea, 0xe9 => 0x8ce1, + 0xea => 0x8d6d, 0xeb => 0x8d9f, 0xec => 0x8da3, 0xed => 0x8e2b, + 0xee => 0x8e10, 0xef => 0x8e1d, 0xf0 => 0x8e22, 0xf1 => 0x8e0f, + 0xf2 => 0x8e29, 0xf3 => 0x8e1f, 0xf4 => 0x8e21, 0xf5 => 0x8e1e, + 0xf6 => 0x8eba, 0xf7 => 0x8f1d, 0xf8 => 0x8f1b, 0xf9 => 0x8f1f, + 0xfa => 0x8f29, 0xfb => 0x8f26, 0xfc => 0x8f2a, 0xfd => 0x8f1c, + 0xfe => 0x8f1e, + }, + 0xbe => { + 0x40 => 0x8f25, 0x41 => 0x9069, 0x42 => 0x906e, 0x43 => 0x9068, + 0x44 => 0x906d, 0x45 => 0x9077, 0x46 => 0x9130, 0x47 => 0x912d, + 0x48 => 0x9127, 0x49 => 0x9131, 0x4a => 0x9187, 0x4b => 0x9189, + 0x4c => 0x918b, 0x4d => 0x9183, 0x4e => 0x92c5, 0x4f => 0x92bb, + 0x50 => 0x92b7, 0x51 => 0x92ea, 0x52 => 0x92ac, 0x53 => 0x92e4, + 0x54 => 0x92c1, 0x55 => 0x92b3, 0x56 => 0x92bc, 0x57 => 0x92d2, + 0x58 => 0x92c7, 0x59 => 0x92f0, 0x5a => 0x92b2, 0x5b => 0x95ad, + 0x5c => 0x95b1, 0x5d => 0x9704, 0x5e => 0x9706, 0x5f => 0x9707, + 0x60 => 0x9709, 0x61 => 0x9760, 0x62 => 0x978d, 0x63 => 0x978b, + 0x64 => 0x978f, 0x65 => 0x9821, 0x66 => 0x982b, 0x67 => 0x981c, + 0x68 => 0x98b3, 0x69 => 0x990a, 0x6a => 0x9913, 0x6b => 0x9912, + 0x6c => 0x9918, 0x6d => 0x99dd, 0x6e => 0x99d0, 0x6f => 0x99df, + 0x70 => 0x99db, 0x71 => 0x99d1, 0x72 => 0x99d5, 0x73 => 0x99d2, + 0x74 => 0x99d9, 0x75 => 0x9ab7, 0x76 => 0x9aee, 0x77 => 0x9aef, + 0x78 => 0x9b27, 0x79 => 0x9b45, 0x7a => 0x9b44, 0x7b => 0x9b77, + 0x7c => 0x9b6f, 0x7d => 0x9d06, 0x7e => 0x9d09, 0xa1 => 0x9d03, + 0xa2 => 0x9ea9, 0xa3 => 0x9ebe, 0xa4 => 0x9ece, 0xa5 => 0x58a8, + 0xa6 => 0x9f52, 0xa7 => 0x5112, 0xa8 => 0x5118, 0xa9 => 0x5114, + 0xaa => 0x5110, 0xab => 0x5115, 0xac => 0x5180, 0xad => 0x51aa, + 0xae => 0x51dd, 0xaf => 0x5291, 0xb0 => 0x5293, 0xb1 => 0x52f3, + 0xb2 => 0x5659, 0xb3 => 0x566b, 0xb4 => 0x5679, 0xb5 => 0x5669, + 0xb6 => 0x5664, 0xb7 => 0x5678, 0xb8 => 0x566a, 0xb9 => 0x5668, + 0xba => 0x5665, 0xbb => 0x5671, 0xbc => 0x566f, 0xbd => 0x566c, + 0xbe => 0x5662, 0xbf => 0x5676, 0xc0 => 0x58c1, 0xc1 => 0x58be, + 0xc2 => 0x58c7, 0xc3 => 0x58c5, 0xc4 => 0x596e, 0xc5 => 0x5b1d, + 0xc6 => 0x5b34, 0xc7 => 0x5b78, 0xc8 => 0x5bf0, 0xc9 => 0x5c0e, + 0xca => 0x5f4a, 0xcb => 0x61b2, 0xcc => 0x6191, 0xcd => 0x61a9, + 0xce => 0x618a, 0xcf => 0x61cd, 0xd0 => 0x61b6, 0xd1 => 0x61be, + 0xd2 => 0x61ca, 0xd3 => 0x61c8, 0xd4 => 0x6230, 0xd5 => 0x64c5, + 0xd6 => 0x64c1, 0xd7 => 0x64cb, 0xd8 => 0x64bb, 0xd9 => 0x64bc, + 0xda => 0x64da, 0xdb => 0x64c4, 0xdc => 0x64c7, 0xdd => 0x64c2, + 0xde => 0x64cd, 0xdf => 0x64bf, 0xe0 => 0x64d2, 0xe1 => 0x64d4, + 0xe2 => 0x64be, 0xe3 => 0x6574, 0xe4 => 0x66c6, 0xe5 => 0x66c9, + 0xe6 => 0x66b9, 0xe7 => 0x66c4, 0xe8 => 0x66c7, 0xe9 => 0x66b8, + 0xea => 0x6a3d, 0xeb => 0x6a38, 0xec => 0x6a3a, 0xed => 0x6a59, + 0xee => 0x6a6b, 0xef => 0x6a58, 0xf0 => 0x6a39, 0xf1 => 0x6a44, + 0xf2 => 0x6a62, 0xf3 => 0x6a61, 0xf4 => 0x6a4b, 0xf5 => 0x6a47, + 0xf6 => 0x6a35, 0xf7 => 0x6a5f, 0xf8 => 0x6a48, 0xf9 => 0x6b59, + 0xfa => 0x6b77, 0xfb => 0x6c05, 0xfc => 0x6fc2, 0xfd => 0x6fb1, + 0xfe => 0x6fa1, + }, + 0xbf => { + 0x40 => 0x6fc3, 0x41 => 0x6fa4, 0x42 => 0x6fc1, 0x43 => 0x6fa7, + 0x44 => 0x6fb3, 0x45 => 0x6fc0, 0x46 => 0x6fb9, 0x47 => 0x6fb6, + 0x48 => 0x6fa6, 0x49 => 0x6fa0, 0x4a => 0x6fb4, 0x4b => 0x71be, + 0x4c => 0x71c9, 0x4d => 0x71d0, 0x4e => 0x71d2, 0x4f => 0x71c8, + 0x50 => 0x71d5, 0x51 => 0x71b9, 0x52 => 0x71ce, 0x53 => 0x71d9, + 0x54 => 0x71dc, 0x55 => 0x71c3, 0x56 => 0x71c4, 0x57 => 0x7368, + 0x58 => 0x749c, 0x59 => 0x74a3, 0x5a => 0x7498, 0x5b => 0x749f, + 0x5c => 0x749e, 0x5d => 0x74e2, 0x5e => 0x750c, 0x5f => 0x750d, + 0x60 => 0x7634, 0x61 => 0x7638, 0x62 => 0x763a, 0x63 => 0x76e7, + 0x64 => 0x76e5, 0x65 => 0x77a0, 0x66 => 0x779e, 0x67 => 0x779f, + 0x68 => 0x77a5, 0x69 => 0x78e8, 0x6a => 0x78da, 0x6b => 0x78ec, + 0x6c => 0x78e7, 0x6d => 0x79a6, 0x6e => 0x7a4d, 0x6f => 0x7a4e, + 0x70 => 0x7a46, 0x71 => 0x7a4c, 0x72 => 0x7a4b, 0x73 => 0x7aba, + 0x74 => 0x7bd9, 0x75 => 0x7c11, 0x76 => 0x7bc9, 0x77 => 0x7be4, + 0x78 => 0x7bdb, 0x79 => 0x7be1, 0x7a => 0x7be9, 0x7b => 0x7be6, + 0x7c => 0x7cd5, 0x7d => 0x7cd6, 0x7e => 0x7e0a, 0xa1 => 0x7e11, + 0xa2 => 0x7e08, 0xa3 => 0x7e1b, 0xa4 => 0x7e23, 0xa5 => 0x7e1e, + 0xa6 => 0x7e1d, 0xa7 => 0x7e09, 0xa8 => 0x7e10, 0xa9 => 0x7f79, + 0xaa => 0x7fb2, 0xab => 0x7ff0, 0xac => 0x7ff1, 0xad => 0x7fee, + 0xae => 0x8028, 0xaf => 0x81b3, 0xb0 => 0x81a9, 0xb1 => 0x81a8, + 0xb2 => 0x81fb, 0xb3 => 0x8208, 0xb4 => 0x8258, 0xb5 => 0x8259, + 0xb6 => 0x854a, 0xb7 => 0x8559, 0xb8 => 0x8548, 0xb9 => 0x8568, + 0xba => 0x8569, 0xbb => 0x8543, 0xbc => 0x8549, 0xbd => 0x856d, + 0xbe => 0x856a, 0xbf => 0x855e, 0xc0 => 0x8783, 0xc1 => 0x879f, + 0xc2 => 0x879e, 0xc3 => 0x87a2, 0xc4 => 0x878d, 0xc5 => 0x8861, + 0xc6 => 0x892a, 0xc7 => 0x8932, 0xc8 => 0x8925, 0xc9 => 0x892b, + 0xca => 0x8921, 0xcb => 0x89aa, 0xcc => 0x89a6, 0xcd => 0x8ae6, + 0xce => 0x8afa, 0xcf => 0x8aeb, 0xd0 => 0x8af1, 0xd1 => 0x8b00, + 0xd2 => 0x8adc, 0xd3 => 0x8ae7, 0xd4 => 0x8aee, 0xd5 => 0x8afe, + 0xd6 => 0x8b01, 0xd7 => 0x8b02, 0xd8 => 0x8af7, 0xd9 => 0x8aed, + 0xda => 0x8af3, 0xdb => 0x8af6, 0xdc => 0x8afc, 0xdd => 0x8c6b, + 0xde => 0x8c6d, 0xdf => 0x8c93, 0xe0 => 0x8cf4, 0xe1 => 0x8e44, + 0xe2 => 0x8e31, 0xe3 => 0x8e34, 0xe4 => 0x8e42, 0xe5 => 0x8e39, + 0xe6 => 0x8e35, 0xe7 => 0x8f3b, 0xe8 => 0x8f2f, 0xe9 => 0x8f38, + 0xea => 0x8f33, 0xeb => 0x8fa8, 0xec => 0x8fa6, 0xed => 0x9075, + 0xee => 0x9074, 0xef => 0x9078, 0xf0 => 0x9072, 0xf1 => 0x907c, + 0xf2 => 0x907a, 0xf3 => 0x9134, 0xf4 => 0x9192, 0xf5 => 0x9320, + 0xf6 => 0x9336, 0xf7 => 0x92f8, 0xf8 => 0x9333, 0xf9 => 0x932f, + 0xfa => 0x9322, 0xfb => 0x92fc, 0xfc => 0x932b, 0xfd => 0x9304, + 0xfe => 0x931a, + }, + 0xc0 => { + 0x40 => 0x9310, 0x41 => 0x9326, 0x42 => 0x9321, 0x43 => 0x9315, + 0x44 => 0x932e, 0x45 => 0x9319, 0x46 => 0x95bb, 0x47 => 0x96a7, + 0x48 => 0x96a8, 0x49 => 0x96aa, 0x4a => 0x96d5, 0x4b => 0x970e, + 0x4c => 0x9711, 0x4d => 0x9716, 0x4e => 0x970d, 0x4f => 0x9713, + 0x50 => 0x970f, 0x51 => 0x975b, 0x52 => 0x975c, 0x53 => 0x9766, + 0x54 => 0x9798, 0x55 => 0x9830, 0x56 => 0x9838, 0x57 => 0x983b, + 0x58 => 0x9837, 0x59 => 0x982d, 0x5a => 0x9839, 0x5b => 0x9824, + 0x5c => 0x9910, 0x5d => 0x9928, 0x5e => 0x991e, 0x5f => 0x991b, + 0x60 => 0x9921, 0x61 => 0x991a, 0x62 => 0x99ed, 0x63 => 0x99e2, + 0x64 => 0x99f1, 0x65 => 0x9ab8, 0x66 => 0x9abc, 0x67 => 0x9afb, + 0x68 => 0x9aed, 0x69 => 0x9b28, 0x6a => 0x9b91, 0x6b => 0x9d15, + 0x6c => 0x9d23, 0x6d => 0x9d26, 0x6e => 0x9d28, 0x6f => 0x9d12, + 0x70 => 0x9d1b, 0x71 => 0x9ed8, 0x72 => 0x9ed4, 0x73 => 0x9f8d, + 0x74 => 0x9f9c, 0x75 => 0x512a, 0x76 => 0x511f, 0x77 => 0x5121, + 0x78 => 0x5132, 0x79 => 0x52f5, 0x7a => 0x568e, 0x7b => 0x5680, + 0x7c => 0x5690, 0x7d => 0x5685, 0x7e => 0x5687, 0xa1 => 0x568f, + 0xa2 => 0x58d5, 0xa3 => 0x58d3, 0xa4 => 0x58d1, 0xa5 => 0x58ce, + 0xa6 => 0x5b30, 0xa7 => 0x5b2a, 0xa8 => 0x5b24, 0xa9 => 0x5b7a, + 0xaa => 0x5c37, 0xab => 0x5c68, 0xac => 0x5dbc, 0xad => 0x5dba, + 0xae => 0x5dbd, 0xaf => 0x5db8, 0xb0 => 0x5e6b, 0xb1 => 0x5f4c, + 0xb2 => 0x5fbd, 0xb3 => 0x61c9, 0xb4 => 0x61c2, 0xb5 => 0x61c7, + 0xb6 => 0x61e6, 0xb7 => 0x61cb, 0xb8 => 0x6232, 0xb9 => 0x6234, + 0xba => 0x64ce, 0xbb => 0x64ca, 0xbc => 0x64d8, 0xbd => 0x64e0, + 0xbe => 0x64f0, 0xbf => 0x64e6, 0xc0 => 0x64ec, 0xc1 => 0x64f1, + 0xc2 => 0x64e2, 0xc3 => 0x64ed, 0xc4 => 0x6582, 0xc5 => 0x6583, + 0xc6 => 0x66d9, 0xc7 => 0x66d6, 0xc8 => 0x6a80, 0xc9 => 0x6a94, + 0xca => 0x6a84, 0xcb => 0x6aa2, 0xcc => 0x6a9c, 0xcd => 0x6adb, + 0xce => 0x6aa3, 0xcf => 0x6a7e, 0xd0 => 0x6a97, 0xd1 => 0x6a90, + 0xd2 => 0x6aa0, 0xd3 => 0x6b5c, 0xd4 => 0x6bae, 0xd5 => 0x6bda, + 0xd6 => 0x6c08, 0xd7 => 0x6fd8, 0xd8 => 0x6ff1, 0xd9 => 0x6fdf, + 0xda => 0x6fe0, 0xdb => 0x6fdb, 0xdc => 0x6fe4, 0xdd => 0x6feb, + 0xde => 0x6fef, 0xdf => 0x6f80, 0xe0 => 0x6fec, 0xe1 => 0x6fe1, + 0xe2 => 0x6fe9, 0xe3 => 0x6fd5, 0xe4 => 0x6fee, 0xe5 => 0x6ff0, + 0xe6 => 0x71e7, 0xe7 => 0x71df, 0xe8 => 0x71ee, 0xe9 => 0x71e6, + 0xea => 0x71e5, 0xeb => 0x71ed, 0xec => 0x71ec, 0xed => 0x71f4, + 0xee => 0x71e0, 0xef => 0x7235, 0xf0 => 0x7246, 0xf1 => 0x7370, + 0xf2 => 0x7372, 0xf3 => 0x74a9, 0xf4 => 0x74b0, 0xf5 => 0x74a6, + 0xf6 => 0x74a8, 0xf7 => 0x7646, 0xf8 => 0x7642, 0xf9 => 0x764c, + 0xfa => 0x76ea, 0xfb => 0x77b3, 0xfc => 0x77aa, 0xfd => 0x77b0, + 0xfe => 0x77ac, + }, + 0xc1 => { + 0x40 => 0x77a7, 0x41 => 0x77ad, 0x42 => 0x77ef, 0x43 => 0x78f7, + 0x44 => 0x78fa, 0x45 => 0x78f4, 0x46 => 0x78ef, 0x47 => 0x7901, + 0x48 => 0x79a7, 0x49 => 0x79aa, 0x4a => 0x7a57, 0x4b => 0x7abf, + 0x4c => 0x7c07, 0x4d => 0x7c0d, 0x4e => 0x7bfe, 0x4f => 0x7bf7, + 0x50 => 0x7c0c, 0x51 => 0x7be0, 0x52 => 0x7ce0, 0x53 => 0x7cdc, + 0x54 => 0x7cde, 0x55 => 0x7ce2, 0x56 => 0x7cdf, 0x57 => 0x7cd9, + 0x58 => 0x7cdd, 0x59 => 0x7e2e, 0x5a => 0x7e3e, 0x5b => 0x7e46, + 0x5c => 0x7e37, 0x5d => 0x7e32, 0x5e => 0x7e43, 0x5f => 0x7e2b, + 0x60 => 0x7e3d, 0x61 => 0x7e31, 0x62 => 0x7e45, 0x63 => 0x7e41, + 0x64 => 0x7e34, 0x65 => 0x7e39, 0x66 => 0x7e48, 0x67 => 0x7e35, + 0x68 => 0x7e3f, 0x69 => 0x7e2f, 0x6a => 0x7f44, 0x6b => 0x7ff3, + 0x6c => 0x7ffc, 0x6d => 0x8071, 0x6e => 0x8072, 0x6f => 0x8070, + 0x70 => 0x806f, 0x71 => 0x8073, 0x72 => 0x81c6, 0x73 => 0x81c3, + 0x74 => 0x81ba, 0x75 => 0x81c2, 0x76 => 0x81c0, 0x77 => 0x81bf, + 0x78 => 0x81bd, 0x79 => 0x81c9, 0x7a => 0x81be, 0x7b => 0x81e8, + 0x7c => 0x8209, 0x7d => 0x8271, 0x7e => 0x85aa, 0xa1 => 0x8584, + 0xa2 => 0x857e, 0xa3 => 0x859c, 0xa4 => 0x8591, 0xa5 => 0x8594, + 0xa6 => 0x85af, 0xa7 => 0x859b, 0xa8 => 0x8587, 0xa9 => 0x85a8, + 0xaa => 0x858a, 0xab => 0x8667, 0xac => 0x87c0, 0xad => 0x87d1, + 0xae => 0x87b3, 0xaf => 0x87d2, 0xb0 => 0x87c6, 0xb1 => 0x87ab, + 0xb2 => 0x87bb, 0xb3 => 0x87ba, 0xb4 => 0x87c8, 0xb5 => 0x87cb, + 0xb6 => 0x893b, 0xb7 => 0x8936, 0xb8 => 0x8944, 0xb9 => 0x8938, + 0xba => 0x893d, 0xbb => 0x89ac, 0xbc => 0x8b0e, 0xbd => 0x8b17, + 0xbe => 0x8b19, 0xbf => 0x8b1b, 0xc0 => 0x8b0a, 0xc1 => 0x8b20, + 0xc2 => 0x8b1d, 0xc3 => 0x8b04, 0xc4 => 0x8b10, 0xc5 => 0x8c41, + 0xc6 => 0x8c3f, 0xc7 => 0x8c73, 0xc8 => 0x8cfa, 0xc9 => 0x8cfd, + 0xca => 0x8cfc, 0xcb => 0x8cf8, 0xcc => 0x8cfb, 0xcd => 0x8da8, + 0xce => 0x8e49, 0xcf => 0x8e4b, 0xd0 => 0x8e48, 0xd1 => 0x8e4a, + 0xd2 => 0x8f44, 0xd3 => 0x8f3e, 0xd4 => 0x8f42, 0xd5 => 0x8f45, + 0xd6 => 0x8f3f, 0xd7 => 0x907f, 0xd8 => 0x907d, 0xd9 => 0x9084, + 0xda => 0x9081, 0xdb => 0x9082, 0xdc => 0x9080, 0xdd => 0x9139, + 0xde => 0x91a3, 0xdf => 0x919e, 0xe0 => 0x919c, 0xe1 => 0x934d, + 0xe2 => 0x9382, 0xe3 => 0x9328, 0xe4 => 0x9375, 0xe5 => 0x934a, + 0xe6 => 0x9365, 0xe7 => 0x934b, 0xe8 => 0x9318, 0xe9 => 0x937e, + 0xea => 0x936c, 0xeb => 0x935b, 0xec => 0x9370, 0xed => 0x935a, + 0xee => 0x9354, 0xef => 0x95ca, 0xf0 => 0x95cb, 0xf1 => 0x95cc, + 0xf2 => 0x95c8, 0xf3 => 0x95c6, 0xf4 => 0x96b1, 0xf5 => 0x96b8, + 0xf6 => 0x96d6, 0xf7 => 0x971c, 0xf8 => 0x971e, 0xf9 => 0x97a0, + 0xfa => 0x97d3, 0xfb => 0x9846, 0xfc => 0x98b6, 0xfd => 0x9935, + 0xfe => 0x9a01, + }, + 0xc2 => { + 0x40 => 0x99ff, 0x41 => 0x9bae, 0x42 => 0x9bab, 0x43 => 0x9baa, + 0x44 => 0x9bad, 0x45 => 0x9d3b, 0x46 => 0x9d3f, 0x47 => 0x9e8b, + 0x48 => 0x9ecf, 0x49 => 0x9ede, 0x4a => 0x9edc, 0x4b => 0x9edd, + 0x4c => 0x9edb, 0x4d => 0x9f3e, 0x4e => 0x9f4b, 0x4f => 0x53e2, + 0x50 => 0x5695, 0x51 => 0x56ae, 0x52 => 0x58d9, 0x53 => 0x58d8, + 0x54 => 0x5b38, 0x55 => 0x5f5d, 0x56 => 0x61e3, 0x57 => 0x6233, + 0x58 => 0x64f4, 0x59 => 0x64f2, 0x5a => 0x64fe, 0x5b => 0x6506, + 0x5c => 0x64fa, 0x5d => 0x64fb, 0x5e => 0x64f7, 0x5f => 0x65b7, + 0x60 => 0x66dc, 0x61 => 0x6726, 0x62 => 0x6ab3, 0x63 => 0x6aac, + 0x64 => 0x6ac3, 0x65 => 0x6abb, 0x66 => 0x6ab8, 0x67 => 0x6ac2, + 0x68 => 0x6aae, 0x69 => 0x6aaf, 0x6a => 0x6b5f, 0x6b => 0x6b78, + 0x6c => 0x6baf, 0x6d => 0x7009, 0x6e => 0x700b, 0x6f => 0x6ffe, + 0x70 => 0x7006, 0x71 => 0x6ffa, 0x72 => 0x7011, 0x73 => 0x700f, + 0x74 => 0x71fb, 0x75 => 0x71fc, 0x76 => 0x71fe, 0x77 => 0x71f8, + 0x78 => 0x7377, 0x79 => 0x7375, 0x7a => 0x74a7, 0x7b => 0x74bf, + 0x7c => 0x7515, 0x7d => 0x7656, 0x7e => 0x7658, 0xa1 => 0x7652, + 0xa2 => 0x77bd, 0xa3 => 0x77bf, 0xa4 => 0x77bb, 0xa5 => 0x77bc, + 0xa6 => 0x790e, 0xa7 => 0x79ae, 0xa8 => 0x7a61, 0xa9 => 0x7a62, + 0xaa => 0x7a60, 0xab => 0x7ac4, 0xac => 0x7ac5, 0xad => 0x7c2b, + 0xae => 0x7c27, 0xaf => 0x7c2a, 0xb0 => 0x7c1e, 0xb1 => 0x7c23, + 0xb2 => 0x7c21, 0xb3 => 0x7ce7, 0xb4 => 0x7e54, 0xb5 => 0x7e55, + 0xb6 => 0x7e5e, 0xb7 => 0x7e5a, 0xb8 => 0x7e61, 0xb9 => 0x7e52, + 0xba => 0x7e59, 0xbb => 0x7f48, 0xbc => 0x7ff9, 0xbd => 0x7ffb, + 0xbe => 0x8077, 0xbf => 0x8076, 0xc0 => 0x81cd, 0xc1 => 0x81cf, + 0xc2 => 0x820a, 0xc3 => 0x85cf, 0xc4 => 0x85a9, 0xc5 => 0x85cd, + 0xc6 => 0x85d0, 0xc7 => 0x85c9, 0xc8 => 0x85b0, 0xc9 => 0x85ba, + 0xca => 0x85b9, 0xcb => 0x85a6, 0xcc => 0x87ef, 0xcd => 0x87ec, + 0xce => 0x87f2, 0xcf => 0x87e0, 0xd0 => 0x8986, 0xd1 => 0x89b2, + 0xd2 => 0x89f4, 0xd3 => 0x8b28, 0xd4 => 0x8b39, 0xd5 => 0x8b2c, + 0xd6 => 0x8b2b, 0xd7 => 0x8c50, 0xd8 => 0x8d05, 0xd9 => 0x8e59, + 0xda => 0x8e63, 0xdb => 0x8e66, 0xdc => 0x8e64, 0xdd => 0x8e5f, + 0xde => 0x8e55, 0xdf => 0x8ec0, 0xe0 => 0x8f49, 0xe1 => 0x8f4d, + 0xe2 => 0x9087, 0xe3 => 0x9083, 0xe4 => 0x9088, 0xe5 => 0x91ab, + 0xe6 => 0x91ac, 0xe7 => 0x91d0, 0xe8 => 0x9394, 0xe9 => 0x938a, + 0xea => 0x9396, 0xeb => 0x93a2, 0xec => 0x93b3, 0xed => 0x93ae, + 0xee => 0x93ac, 0xef => 0x93b0, 0xf0 => 0x9398, 0xf1 => 0x939a, + 0xf2 => 0x9397, 0xf3 => 0x95d4, 0xf4 => 0x95d6, 0xf5 => 0x95d0, + 0xf6 => 0x95d5, 0xf7 => 0x96e2, 0xf8 => 0x96dc, 0xf9 => 0x96d9, + 0xfa => 0x96db, 0xfb => 0x96de, 0xfc => 0x9724, 0xfd => 0x97a3, + 0xfe => 0x97a6, + }, + 0xc3 => { + 0x40 => 0x97ad, 0x41 => 0x97f9, 0x42 => 0x984d, 0x43 => 0x984f, + 0x44 => 0x984c, 0x45 => 0x984e, 0x46 => 0x9853, 0x47 => 0x98ba, + 0x48 => 0x993e, 0x49 => 0x993f, 0x4a => 0x993d, 0x4b => 0x992e, + 0x4c => 0x99a5, 0x4d => 0x9a0e, 0x4e => 0x9ac1, 0x4f => 0x9b03, + 0x50 => 0x9b06, 0x51 => 0x9b4f, 0x52 => 0x9b4e, 0x53 => 0x9b4d, + 0x54 => 0x9bca, 0x55 => 0x9bc9, 0x56 => 0x9bfd, 0x57 => 0x9bc8, + 0x58 => 0x9bc0, 0x59 => 0x9d51, 0x5a => 0x9d5d, 0x5b => 0x9d60, + 0x5c => 0x9ee0, 0x5d => 0x9f15, 0x5e => 0x9f2c, 0x5f => 0x5133, + 0x60 => 0x56a5, 0x61 => 0x58de, 0x62 => 0x58df, 0x63 => 0x58e2, + 0x64 => 0x5bf5, 0x65 => 0x9f90, 0x66 => 0x5eec, 0x67 => 0x61f2, + 0x68 => 0x61f7, 0x69 => 0x61f6, 0x6a => 0x61f5, 0x6b => 0x6500, + 0x6c => 0x650f, 0x6d => 0x66e0, 0x6e => 0x66dd, 0x6f => 0x6ae5, + 0x70 => 0x6add, 0x71 => 0x6ada, 0x72 => 0x6ad3, 0x73 => 0x701b, + 0x74 => 0x701f, 0x75 => 0x7028, 0x76 => 0x701a, 0x77 => 0x701d, + 0x78 => 0x7015, 0x79 => 0x7018, 0x7a => 0x7206, 0x7b => 0x720d, + 0x7c => 0x7258, 0x7d => 0x72a2, 0x7e => 0x7378, 0xa1 => 0x737a, + 0xa2 => 0x74bd, 0xa3 => 0x74ca, 0xa4 => 0x74e3, 0xa5 => 0x7587, + 0xa6 => 0x7586, 0xa7 => 0x765f, 0xa8 => 0x7661, 0xa9 => 0x77c7, + 0xaa => 0x7919, 0xab => 0x79b1, 0xac => 0x7a6b, 0xad => 0x7a69, + 0xae => 0x7c3e, 0xaf => 0x7c3f, 0xb0 => 0x7c38, 0xb1 => 0x7c3d, + 0xb2 => 0x7c37, 0xb3 => 0x7c40, 0xb4 => 0x7e6b, 0xb5 => 0x7e6d, + 0xb6 => 0x7e79, 0xb7 => 0x7e69, 0xb8 => 0x7e6a, 0xb9 => 0x7f85, + 0xba => 0x7e73, 0xbb => 0x7fb6, 0xbc => 0x7fb9, 0xbd => 0x7fb8, + 0xbe => 0x81d8, 0xbf => 0x85e9, 0xc0 => 0x85dd, 0xc1 => 0x85ea, + 0xc2 => 0x85d5, 0xc3 => 0x85e4, 0xc4 => 0x85e5, 0xc5 => 0x85f7, + 0xc6 => 0x87fb, 0xc7 => 0x8805, 0xc8 => 0x880d, 0xc9 => 0x87f9, + 0xca => 0x87fe, 0xcb => 0x8960, 0xcc => 0x895f, 0xcd => 0x8956, + 0xce => 0x895e, 0xcf => 0x8b41, 0xd0 => 0x8b5c, 0xd1 => 0x8b58, + 0xd2 => 0x8b49, 0xd3 => 0x8b5a, 0xd4 => 0x8b4e, 0xd5 => 0x8b4f, + 0xd6 => 0x8b46, 0xd7 => 0x8b59, 0xd8 => 0x8d08, 0xd9 => 0x8d0a, + 0xda => 0x8e7c, 0xdb => 0x8e72, 0xdc => 0x8e87, 0xdd => 0x8e76, + 0xde => 0x8e6c, 0xdf => 0x8e7a, 0xe0 => 0x8e74, 0xe1 => 0x8f54, + 0xe2 => 0x8f4e, 0xe3 => 0x8fad, 0xe4 => 0x908a, 0xe5 => 0x908b, + 0xe6 => 0x91b1, 0xe7 => 0x91ae, 0xe8 => 0x93e1, 0xe9 => 0x93d1, + 0xea => 0x93df, 0xeb => 0x93c3, 0xec => 0x93c8, 0xed => 0x93dc, + 0xee => 0x93dd, 0xef => 0x93d6, 0xf0 => 0x93e2, 0xf1 => 0x93cd, + 0xf2 => 0x93d8, 0xf3 => 0x93e4, 0xf4 => 0x93d7, 0xf5 => 0x93e8, + 0xf6 => 0x95dc, 0xf7 => 0x96b4, 0xf8 => 0x96e3, 0xf9 => 0x972a, + 0xfa => 0x9727, 0xfb => 0x9761, 0xfc => 0x97dc, 0xfd => 0x97fb, + 0xfe => 0x985e, + }, + 0xc4 => { + 0x40 => 0x9858, 0x41 => 0x985b, 0x42 => 0x98bc, 0x43 => 0x9945, + 0x44 => 0x9949, 0x45 => 0x9a16, 0x46 => 0x9a19, 0x47 => 0x9b0d, + 0x48 => 0x9be8, 0x49 => 0x9be7, 0x4a => 0x9bd6, 0x4b => 0x9bdb, + 0x4c => 0x9d89, 0x4d => 0x9d61, 0x4e => 0x9d72, 0x4f => 0x9d6a, + 0x50 => 0x9d6c, 0x51 => 0x9e92, 0x52 => 0x9e97, 0x53 => 0x9e93, + 0x54 => 0x9eb4, 0x55 => 0x52f8, 0x56 => 0x56a8, 0x57 => 0x56b7, + 0x58 => 0x56b6, 0x59 => 0x56b4, 0x5a => 0x56bc, 0x5b => 0x58e4, + 0x5c => 0x5b40, 0x5d => 0x5b43, 0x5e => 0x5b7d, 0x5f => 0x5bf6, + 0x60 => 0x5dc9, 0x61 => 0x61f8, 0x62 => 0x61fa, 0x63 => 0x6518, + 0x64 => 0x6514, 0x65 => 0x6519, 0x66 => 0x66e6, 0x67 => 0x6727, + 0x68 => 0x6aec, 0x69 => 0x703e, 0x6a => 0x7030, 0x6b => 0x7032, + 0x6c => 0x7210, 0x6d => 0x737b, 0x6e => 0x74cf, 0x6f => 0x7662, + 0x70 => 0x7665, 0x71 => 0x7926, 0x72 => 0x792a, 0x73 => 0x792c, + 0x74 => 0x792b, 0x75 => 0x7ac7, 0x76 => 0x7af6, 0x77 => 0x7c4c, + 0x78 => 0x7c43, 0x79 => 0x7c4d, 0x7a => 0x7cef, 0x7b => 0x7cf0, + 0x7c => 0x8fae, 0x7d => 0x7e7d, 0x7e => 0x7e7c, 0xa1 => 0x7e82, + 0xa2 => 0x7f4c, 0xa3 => 0x8000, 0xa4 => 0x81da, 0xa5 => 0x8266, + 0xa6 => 0x85fb, 0xa7 => 0x85f9, 0xa8 => 0x8611, 0xa9 => 0x85fa, + 0xaa => 0x8606, 0xab => 0x860b, 0xac => 0x8607, 0xad => 0x860a, + 0xae => 0x8814, 0xaf => 0x8815, 0xb0 => 0x8964, 0xb1 => 0x89ba, + 0xb2 => 0x89f8, 0xb3 => 0x8b70, 0xb4 => 0x8b6c, 0xb5 => 0x8b66, + 0xb6 => 0x8b6f, 0xb7 => 0x8b5f, 0xb8 => 0x8b6b, 0xb9 => 0x8d0f, + 0xba => 0x8d0d, 0xbb => 0x8e89, 0xbc => 0x8e81, 0xbd => 0x8e85, + 0xbe => 0x8e82, 0xbf => 0x91b4, 0xc0 => 0x91cb, 0xc1 => 0x9418, + 0xc2 => 0x9403, 0xc3 => 0x93fd, 0xc4 => 0x95e1, 0xc5 => 0x9730, + 0xc6 => 0x98c4, 0xc7 => 0x9952, 0xc8 => 0x9951, 0xc9 => 0x99a8, + 0xca => 0x9a2b, 0xcb => 0x9a30, 0xcc => 0x9a37, 0xcd => 0x9a35, + 0xce => 0x9c13, 0xcf => 0x9c0d, 0xd0 => 0x9e79, 0xd1 => 0x9eb5, + 0xd2 => 0x9ee8, 0xd3 => 0x9f2f, 0xd4 => 0x9f5f, 0xd5 => 0x9f63, + 0xd6 => 0x9f61, 0xd7 => 0x5137, 0xd8 => 0x5138, 0xd9 => 0x56c1, + 0xda => 0x56c0, 0xdb => 0x56c2, 0xdc => 0x5914, 0xdd => 0x5c6c, + 0xde => 0x5dcd, 0xdf => 0x61fc, 0xe0 => 0x61fe, 0xe1 => 0x651d, + 0xe2 => 0x651c, 0xe3 => 0x6595, 0xe4 => 0x66e9, 0xe5 => 0x6afb, + 0xe6 => 0x6b04, 0xe7 => 0x6afa, 0xe8 => 0x6bb2, 0xe9 => 0x704c, + 0xea => 0x721b, 0xeb => 0x72a7, 0xec => 0x74d6, 0xed => 0x74d4, + 0xee => 0x7669, 0xef => 0x77d3, 0xf0 => 0x7c50, 0xf1 => 0x7e8f, + 0xf2 => 0x7e8c, 0xf3 => 0x7fbc, 0xf4 => 0x8617, 0xf5 => 0x862d, + 0xf6 => 0x861a, 0xf7 => 0x8823, 0xf8 => 0x8822, 0xf9 => 0x8821, + 0xfa => 0x881f, 0xfb => 0x896a, 0xfc => 0x896c, 0xfd => 0x89bd, + 0xfe => 0x8b74, + }, + 0xc5 => { + 0x40 => 0x8b77, 0x41 => 0x8b7d, 0x42 => 0x8d13, 0x43 => 0x8e8a, + 0x44 => 0x8e8d, 0x45 => 0x8e8b, 0x46 => 0x8f5f, 0x47 => 0x8faf, + 0x48 => 0x91ba, 0x49 => 0x942e, 0x4a => 0x9433, 0x4b => 0x9435, + 0x4c => 0x943a, 0x4d => 0x9438, 0x4e => 0x9432, 0x4f => 0x942b, + 0x50 => 0x95e2, 0x51 => 0x9738, 0x52 => 0x9739, 0x53 => 0x9732, + 0x54 => 0x97ff, 0x55 => 0x9867, 0x56 => 0x9865, 0x57 => 0x9957, + 0x58 => 0x9a45, 0x59 => 0x9a43, 0x5a => 0x9a40, 0x5b => 0x9a3e, + 0x5c => 0x9acf, 0x5d => 0x9b54, 0x5e => 0x9b51, 0x5f => 0x9c2d, + 0x60 => 0x9c25, 0x61 => 0x9daf, 0x62 => 0x9db4, 0x63 => 0x9dc2, + 0x64 => 0x9db8, 0x65 => 0x9e9d, 0x66 => 0x9eef, 0x67 => 0x9f19, + 0x68 => 0x9f5c, 0x69 => 0x9f66, 0x6a => 0x9f67, 0x6b => 0x513c, + 0x6c => 0x513b, 0x6d => 0x56c8, 0x6e => 0x56ca, 0x6f => 0x56c9, + 0x70 => 0x5b7f, 0x71 => 0x5dd4, 0x72 => 0x5dd2, 0x73 => 0x5f4e, + 0x74 => 0x61ff, 0x75 => 0x6524, 0x76 => 0x6b0a, 0x77 => 0x6b61, + 0x78 => 0x7051, 0x79 => 0x7058, 0x7a => 0x7380, 0x7b => 0x74e4, + 0x7c => 0x758a, 0x7d => 0x766e, 0x7e => 0x766c, 0xa1 => 0x79b3, + 0xa2 => 0x7c60, 0xa3 => 0x7c5f, 0xa4 => 0x807e, 0xa5 => 0x807d, + 0xa6 => 0x81df, 0xa7 => 0x8972, 0xa8 => 0x896f, 0xa9 => 0x89fc, + 0xaa => 0x8b80, 0xab => 0x8d16, 0xac => 0x8d17, 0xad => 0x8e91, + 0xae => 0x8e93, 0xaf => 0x8f61, 0xb0 => 0x9148, 0xb1 => 0x9444, + 0xb2 => 0x9451, 0xb3 => 0x9452, 0xb4 => 0x973d, 0xb5 => 0x973e, + 0xb6 => 0x97c3, 0xb7 => 0x97c1, 0xb8 => 0x986b, 0xb9 => 0x9955, + 0xba => 0x9a55, 0xbb => 0x9a4d, 0xbc => 0x9ad2, 0xbd => 0x9b1a, + 0xbe => 0x9c49, 0xbf => 0x9c31, 0xc0 => 0x9c3e, 0xc1 => 0x9c3b, + 0xc2 => 0x9dd3, 0xc3 => 0x9dd7, 0xc4 => 0x9f34, 0xc5 => 0x9f6c, + 0xc6 => 0x9f6a, 0xc7 => 0x9f94, 0xc8 => 0x56cc, 0xc9 => 0x5dd6, + 0xca => 0x6200, 0xcb => 0x6523, 0xcc => 0x652b, 0xcd => 0x652a, + 0xce => 0x66ec, 0xcf => 0x6b10, 0xd0 => 0x74da, 0xd1 => 0x7aca, + 0xd2 => 0x7c64, 0xd3 => 0x7c63, 0xd4 => 0x7c65, 0xd5 => 0x7e93, + 0xd6 => 0x7e96, 0xd7 => 0x7e94, 0xd8 => 0x81e2, 0xd9 => 0x8638, + 0xda => 0x863f, 0xdb => 0x8831, 0xdc => 0x8b8a, 0xdd => 0x9090, + 0xde => 0x908f, 0xdf => 0x9463, 0xe0 => 0x9460, 0xe1 => 0x9464, + 0xe2 => 0x9768, 0xe3 => 0x986f, 0xe4 => 0x995c, 0xe5 => 0x9a5a, + 0xe6 => 0x9a5b, 0xe7 => 0x9a57, 0xe8 => 0x9ad3, 0xe9 => 0x9ad4, + 0xea => 0x9ad1, 0xeb => 0x9c54, 0xec => 0x9c57, 0xed => 0x9c56, + 0xee => 0x9de5, 0xef => 0x9e9f, 0xf0 => 0x9ef4, 0xf1 => 0x56d1, + 0xf2 => 0x58e9, 0xf3 => 0x652c, 0xf4 => 0x705e, 0xf5 => 0x7671, + 0xf6 => 0x7672, 0xf7 => 0x77d7, 0xf8 => 0x7f50, 0xf9 => 0x7f88, + 0xfa => 0x8836, 0xfb => 0x8839, 0xfc => 0x8862, 0xfd => 0x8b93, + 0xfe => 0x8b92, + }, + 0xc6 => { + 0x40 => 0x8b96, 0x41 => 0x8277, 0x42 => 0x8d1b, 0x43 => 0x91c0, + 0x44 => 0x946a, 0x45 => 0x9742, 0x46 => 0x9748, 0x47 => 0x9744, + 0x48 => 0x97c6, 0x49 => 0x9870, 0x4a => 0x9a5f, 0x4b => 0x9b22, + 0x4c => 0x9b58, 0x4d => 0x9c5f, 0x4e => 0x9df9, 0x4f => 0x9dfa, + 0x50 => 0x9e7c, 0x51 => 0x9e7d, 0x52 => 0x9f07, 0x53 => 0x9f77, + 0x54 => 0x9f72, 0x55 => 0x5ef3, 0x56 => 0x6b16, 0x57 => 0x7063, + 0x58 => 0x7c6c, 0x59 => 0x7c6e, 0x5a => 0x883b, 0x5b => 0x89c0, + 0x5c => 0x8ea1, 0x5d => 0x91c1, 0x5e => 0x9472, 0x5f => 0x9470, + 0x60 => 0x9871, 0x61 => 0x995e, 0x62 => 0x9ad6, 0x63 => 0x9b23, + 0x64 => 0x9ecc, 0x65 => 0x7064, 0x66 => 0x77da, 0x67 => 0x8b9a, + 0x68 => 0x9477, 0x69 => 0x97c9, 0x6a => 0x9a62, 0x6b => 0x9a65, + 0x6c => 0x7e9c, 0x6d => 0x8b9c, 0x6e => 0x8eaa, 0x6f => 0x91c5, + 0x70 => 0x947d, 0x71 => 0x947e, 0x72 => 0x947c, 0x73 => 0x9c77, + 0x74 => 0x9c78, 0x75 => 0x9ef7, 0x76 => 0x8c54, 0x77 => 0x947f, + 0x78 => 0x9e1a, 0x79 => 0x7228, 0x7a => 0x9a6a, 0x7b => 0x9b31, + 0x7c => 0x9e1b, 0x7d => 0x9e1e, 0x7e => 0x7c72, + }, + 0xc9 => { + 0x40 => 0x4e42, 0x41 => 0x4e5c, 0x42 => 0x51f5, 0x43 => 0x531a, + 0x44 => 0x5382, 0x45 => 0x4e07, 0x46 => 0x4e0c, 0x47 => 0x4e47, + 0x48 => 0x4e8d, 0x49 => 0x56d7, 0x4a => 0xfa0c, 0x4b => 0x5c6e, + 0x4c => 0x5f73, 0x4d => 0x4e0f, 0x4e => 0x5187, 0x4f => 0x4e0e, + 0x50 => 0x4e2e, 0x51 => 0x4e93, 0x52 => 0x4ec2, 0x53 => 0x4ec9, + 0x54 => 0x4ec8, 0x55 => 0x5198, 0x56 => 0x52fc, 0x57 => 0x536c, + 0x58 => 0x53b9, 0x59 => 0x5720, 0x5a => 0x5903, 0x5b => 0x592c, + 0x5c => 0x5c10, 0x5d => 0x5dff, 0x5e => 0x65e1, 0x5f => 0x6bb3, + 0x60 => 0x6bcc, 0x61 => 0x6c14, 0x62 => 0x723f, 0x63 => 0x4e31, + 0x64 => 0x4e3c, 0x65 => 0x4ee8, 0x66 => 0x4edc, 0x67 => 0x4ee9, + 0x68 => 0x4ee1, 0x69 => 0x4edd, 0x6a => 0x4eda, 0x6b => 0x520c, + 0x6c => 0x531c, 0x6d => 0x534c, 0x6e => 0x5722, 0x6f => 0x5723, + 0x70 => 0x5917, 0x71 => 0x592f, 0x72 => 0x5b81, 0x73 => 0x5b84, + 0x74 => 0x5c12, 0x75 => 0x5c3b, 0x76 => 0x5c74, 0x77 => 0x5c73, + 0x78 => 0x5e04, 0x79 => 0x5e80, 0x7a => 0x5e82, 0x7b => 0x5fc9, + 0x7c => 0x6209, 0x7d => 0x6250, 0x7e => 0x6c15, 0xa1 => 0x6c36, + 0xa2 => 0x6c43, 0xa3 => 0x6c3f, 0xa4 => 0x6c3b, 0xa5 => 0x72ae, + 0xa6 => 0x72b0, 0xa7 => 0x738a, 0xa8 => 0x79b8, 0xa9 => 0x808a, + 0xaa => 0x961e, 0xab => 0x4f0e, 0xac => 0x4f18, 0xad => 0x4f2c, + 0xae => 0x4ef5, 0xaf => 0x4f14, 0xb0 => 0x4ef1, 0xb1 => 0x4f00, + 0xb2 => 0x4ef7, 0xb3 => 0x4f08, 0xb4 => 0x4f1d, 0xb5 => 0x4f02, + 0xb6 => 0x4f05, 0xb7 => 0x4f22, 0xb8 => 0x4f13, 0xb9 => 0x4f04, + 0xba => 0x4ef4, 0xbb => 0x4f12, 0xbc => 0x51b1, 0xbd => 0x5213, + 0xbe => 0x5209, 0xbf => 0x5210, 0xc0 => 0x52a6, 0xc1 => 0x5322, + 0xc2 => 0x531f, 0xc3 => 0x534d, 0xc4 => 0x538a, 0xc5 => 0x5407, + 0xc6 => 0x56e1, 0xc7 => 0x56df, 0xc8 => 0x572e, 0xc9 => 0x572a, + 0xca => 0x5734, 0xcb => 0x593c, 0xcc => 0x5980, 0xcd => 0x597c, + 0xce => 0x5985, 0xcf => 0x597b, 0xd0 => 0x597e, 0xd1 => 0x5977, + 0xd2 => 0x597f, 0xd3 => 0x5b56, 0xd4 => 0x5c15, 0xd5 => 0x5c25, + 0xd6 => 0x5c7c, 0xd7 => 0x5c7a, 0xd8 => 0x5c7b, 0xd9 => 0x5c7e, + 0xda => 0x5ddf, 0xdb => 0x5e75, 0xdc => 0x5e84, 0xdd => 0x5f02, + 0xde => 0x5f1a, 0xdf => 0x5f74, 0xe0 => 0x5fd5, 0xe1 => 0x5fd4, + 0xe2 => 0x5fcf, 0xe3 => 0x625c, 0xe4 => 0x625e, 0xe5 => 0x6264, + 0xe6 => 0x6261, 0xe7 => 0x6266, 0xe8 => 0x6262, 0xe9 => 0x6259, + 0xea => 0x6260, 0xeb => 0x625a, 0xec => 0x6265, 0xed => 0x65ef, + 0xee => 0x65ee, 0xef => 0x673e, 0xf0 => 0x6739, 0xf1 => 0x6738, + 0xf2 => 0x673b, 0xf3 => 0x673a, 0xf4 => 0x673f, 0xf5 => 0x673c, + 0xf6 => 0x6733, 0xf7 => 0x6c18, 0xf8 => 0x6c46, 0xf9 => 0x6c52, + 0xfa => 0x6c5c, 0xfb => 0x6c4f, 0xfc => 0x6c4a, 0xfd => 0x6c54, + 0xfe => 0x6c4b, + }, + 0xca => { + 0x40 => 0x6c4c, 0x41 => 0x7071, 0x42 => 0x725e, 0x43 => 0x72b4, + 0x44 => 0x72b5, 0x45 => 0x738e, 0x46 => 0x752a, 0x47 => 0x767f, + 0x48 => 0x7a75, 0x49 => 0x7f51, 0x4a => 0x8278, 0x4b => 0x827c, + 0x4c => 0x8280, 0x4d => 0x827d, 0x4e => 0x827f, 0x4f => 0x864d, + 0x50 => 0x897e, 0x51 => 0x9099, 0x52 => 0x9097, 0x53 => 0x9098, + 0x54 => 0x909b, 0x55 => 0x9094, 0x56 => 0x9622, 0x57 => 0x9624, + 0x58 => 0x9620, 0x59 => 0x9623, 0x5a => 0x4f56, 0x5b => 0x4f3b, + 0x5c => 0x4f62, 0x5d => 0x4f49, 0x5e => 0x4f53, 0x5f => 0x4f64, + 0x60 => 0x4f3e, 0x61 => 0x4f67, 0x62 => 0x4f52, 0x63 => 0x4f5f, + 0x64 => 0x4f41, 0x65 => 0x4f58, 0x66 => 0x4f2d, 0x67 => 0x4f33, + 0x68 => 0x4f3f, 0x69 => 0x4f61, 0x6a => 0x518f, 0x6b => 0x51b9, + 0x6c => 0x521c, 0x6d => 0x521e, 0x6e => 0x5221, 0x6f => 0x52ad, + 0x70 => 0x52ae, 0x71 => 0x5309, 0x72 => 0x5363, 0x73 => 0x5372, + 0x74 => 0x538e, 0x75 => 0x538f, 0x76 => 0x5430, 0x77 => 0x5437, + 0x78 => 0x542a, 0x79 => 0x5454, 0x7a => 0x5445, 0x7b => 0x5419, + 0x7c => 0x541c, 0x7d => 0x5425, 0x7e => 0x5418, 0xa1 => 0x543d, + 0xa2 => 0x544f, 0xa3 => 0x5441, 0xa4 => 0x5428, 0xa5 => 0x5424, + 0xa6 => 0x5447, 0xa7 => 0x56ee, 0xa8 => 0x56e7, 0xa9 => 0x56e5, + 0xaa => 0x5741, 0xab => 0x5745, 0xac => 0x574c, 0xad => 0x5749, + 0xae => 0x574b, 0xaf => 0x5752, 0xb0 => 0x5906, 0xb1 => 0x5940, + 0xb2 => 0x59a6, 0xb3 => 0x5998, 0xb4 => 0x59a0, 0xb5 => 0x5997, + 0xb6 => 0x598e, 0xb7 => 0x59a2, 0xb8 => 0x5990, 0xb9 => 0x598f, + 0xba => 0x59a7, 0xbb => 0x59a1, 0xbc => 0x5b8e, 0xbd => 0x5b92, + 0xbe => 0x5c28, 0xbf => 0x5c2a, 0xc0 => 0x5c8d, 0xc1 => 0x5c8f, + 0xc2 => 0x5c88, 0xc3 => 0x5c8b, 0xc4 => 0x5c89, 0xc5 => 0x5c92, + 0xc6 => 0x5c8a, 0xc7 => 0x5c86, 0xc8 => 0x5c93, 0xc9 => 0x5c95, + 0xca => 0x5de0, 0xcb => 0x5e0a, 0xcc => 0x5e0e, 0xcd => 0x5e8b, + 0xce => 0x5e89, 0xcf => 0x5e8c, 0xd0 => 0x5e88, 0xd1 => 0x5e8d, + 0xd2 => 0x5f05, 0xd3 => 0x5f1d, 0xd4 => 0x5f78, 0xd5 => 0x5f76, + 0xd6 => 0x5fd2, 0xd7 => 0x5fd1, 0xd8 => 0x5fd0, 0xd9 => 0x5fed, + 0xda => 0x5fe8, 0xdb => 0x5fee, 0xdc => 0x5ff3, 0xdd => 0x5fe1, + 0xde => 0x5fe4, 0xdf => 0x5fe3, 0xe0 => 0x5ffa, 0xe1 => 0x5fef, + 0xe2 => 0x5ff7, 0xe3 => 0x5ffb, 0xe4 => 0x6000, 0xe5 => 0x5ff4, + 0xe6 => 0x623a, 0xe7 => 0x6283, 0xe8 => 0x628c, 0xe9 => 0x628e, + 0xea => 0x628f, 0xeb => 0x6294, 0xec => 0x6287, 0xed => 0x6271, + 0xee => 0x627b, 0xef => 0x627a, 0xf0 => 0x6270, 0xf1 => 0x6281, + 0xf2 => 0x6288, 0xf3 => 0x6277, 0xf4 => 0x627d, 0xf5 => 0x6272, + 0xf6 => 0x6274, 0xf7 => 0x6537, 0xf8 => 0x65f0, 0xf9 => 0x65f4, + 0xfa => 0x65f3, 0xfb => 0x65f2, 0xfc => 0x65f5, 0xfd => 0x6745, + 0xfe => 0x6747, + }, + 0xcb => { + 0x40 => 0x6759, 0x41 => 0x6755, 0x42 => 0x674c, 0x43 => 0x6748, + 0x44 => 0x675d, 0x45 => 0x674d, 0x46 => 0x675a, 0x47 => 0x674b, + 0x48 => 0x6bd0, 0x49 => 0x6c19, 0x4a => 0x6c1a, 0x4b => 0x6c78, + 0x4c => 0x6c67, 0x4d => 0x6c6b, 0x4e => 0x6c84, 0x4f => 0x6c8b, + 0x50 => 0x6c8f, 0x51 => 0x6c71, 0x52 => 0x6c6f, 0x53 => 0x6c69, + 0x54 => 0x6c9a, 0x55 => 0x6c6d, 0x56 => 0x6c87, 0x57 => 0x6c95, + 0x58 => 0x6c9c, 0x59 => 0x6c66, 0x5a => 0x6c73, 0x5b => 0x6c65, + 0x5c => 0x6c7b, 0x5d => 0x6c8e, 0x5e => 0x7074, 0x5f => 0x707a, + 0x60 => 0x7263, 0x61 => 0x72bf, 0x62 => 0x72bd, 0x63 => 0x72c3, + 0x64 => 0x72c6, 0x65 => 0x72c1, 0x66 => 0x72ba, 0x67 => 0x72c5, + 0x68 => 0x7395, 0x69 => 0x7397, 0x6a => 0x7393, 0x6b => 0x7394, + 0x6c => 0x7392, 0x6d => 0x753a, 0x6e => 0x7539, 0x6f => 0x7594, + 0x70 => 0x7595, 0x71 => 0x7681, 0x72 => 0x793d, 0x73 => 0x8034, + 0x74 => 0x8095, 0x75 => 0x8099, 0x76 => 0x8090, 0x77 => 0x8092, + 0x78 => 0x809c, 0x79 => 0x8290, 0x7a => 0x828f, 0x7b => 0x8285, + 0x7c => 0x828e, 0x7d => 0x8291, 0x7e => 0x8293, 0xa1 => 0x828a, + 0xa2 => 0x8283, 0xa3 => 0x8284, 0xa4 => 0x8c78, 0xa5 => 0x8fc9, + 0xa6 => 0x8fbf, 0xa7 => 0x909f, 0xa8 => 0x90a1, 0xa9 => 0x90a5, + 0xaa => 0x909e, 0xab => 0x90a7, 0xac => 0x90a0, 0xad => 0x9630, + 0xae => 0x9628, 0xaf => 0x962f, 0xb0 => 0x962d, 0xb1 => 0x4e33, + 0xb2 => 0x4f98, 0xb3 => 0x4f7c, 0xb4 => 0x4f85, 0xb5 => 0x4f7d, + 0xb6 => 0x4f80, 0xb7 => 0x4f87, 0xb8 => 0x4f76, 0xb9 => 0x4f74, + 0xba => 0x4f89, 0xbb => 0x4f84, 0xbc => 0x4f77, 0xbd => 0x4f4c, + 0xbe => 0x4f97, 0xbf => 0x4f6a, 0xc0 => 0x4f9a, 0xc1 => 0x4f79, + 0xc2 => 0x4f81, 0xc3 => 0x4f78, 0xc4 => 0x4f90, 0xc5 => 0x4f9c, + 0xc6 => 0x4f94, 0xc7 => 0x4f9e, 0xc8 => 0x4f92, 0xc9 => 0x4f82, + 0xca => 0x4f95, 0xcb => 0x4f6b, 0xcc => 0x4f6e, 0xcd => 0x519e, + 0xce => 0x51bc, 0xcf => 0x51be, 0xd0 => 0x5235, 0xd1 => 0x5232, + 0xd2 => 0x5233, 0xd3 => 0x5246, 0xd4 => 0x5231, 0xd5 => 0x52bc, + 0xd6 => 0x530a, 0xd7 => 0x530b, 0xd8 => 0x533c, 0xd9 => 0x5392, + 0xda => 0x5394, 0xdb => 0x5487, 0xdc => 0x547f, 0xdd => 0x5481, + 0xde => 0x5491, 0xdf => 0x5482, 0xe0 => 0x5488, 0xe1 => 0x546b, + 0xe2 => 0x547a, 0xe3 => 0x547e, 0xe4 => 0x5465, 0xe5 => 0x546c, + 0xe6 => 0x5474, 0xe7 => 0x5466, 0xe8 => 0x548d, 0xe9 => 0x546f, + 0xea => 0x5461, 0xeb => 0x5460, 0xec => 0x5498, 0xed => 0x5463, + 0xee => 0x5467, 0xef => 0x5464, 0xf0 => 0x56f7, 0xf1 => 0x56f9, + 0xf2 => 0x576f, 0xf3 => 0x5772, 0xf4 => 0x576d, 0xf5 => 0x576b, + 0xf6 => 0x5771, 0xf7 => 0x5770, 0xf8 => 0x5776, 0xf9 => 0x5780, + 0xfa => 0x5775, 0xfb => 0x577b, 0xfc => 0x5773, 0xfd => 0x5774, + 0xfe => 0x5762, + }, + 0xcc => { + 0x40 => 0x5768, 0x41 => 0x577d, 0x42 => 0x590c, 0x43 => 0x5945, + 0x44 => 0x59b5, 0x45 => 0x59ba, 0x46 => 0x59cf, 0x47 => 0x59ce, + 0x48 => 0x59b2, 0x49 => 0x59cc, 0x4a => 0x59c1, 0x4b => 0x59b6, + 0x4c => 0x59bc, 0x4d => 0x59c3, 0x4e => 0x59d6, 0x4f => 0x59b1, + 0x50 => 0x59bd, 0x51 => 0x59c0, 0x52 => 0x59c8, 0x53 => 0x59b4, + 0x54 => 0x59c7, 0x55 => 0x5b62, 0x56 => 0x5b65, 0x57 => 0x5b93, + 0x58 => 0x5b95, 0x59 => 0x5c44, 0x5a => 0x5c47, 0x5b => 0x5cae, + 0x5c => 0x5ca4, 0x5d => 0x5ca0, 0x5e => 0x5cb5, 0x5f => 0x5caf, + 0x60 => 0x5ca8, 0x61 => 0x5cac, 0x62 => 0x5c9f, 0x63 => 0x5ca3, + 0x64 => 0x5cad, 0x65 => 0x5ca2, 0x66 => 0x5caa, 0x67 => 0x5ca7, + 0x68 => 0x5c9d, 0x69 => 0x5ca5, 0x6a => 0x5cb6, 0x6b => 0x5cb0, + 0x6c => 0x5ca6, 0x6d => 0x5e17, 0x6e => 0x5e14, 0x6f => 0x5e19, + 0x70 => 0x5f28, 0x71 => 0x5f22, 0x72 => 0x5f23, 0x73 => 0x5f24, + 0x74 => 0x5f54, 0x75 => 0x5f82, 0x76 => 0x5f7e, 0x77 => 0x5f7d, + 0x78 => 0x5fde, 0x79 => 0x5fe5, 0x7a => 0x602d, 0x7b => 0x6026, + 0x7c => 0x6019, 0x7d => 0x6032, 0x7e => 0x600b, 0xa1 => 0x6034, + 0xa2 => 0x600a, 0xa3 => 0x6017, 0xa4 => 0x6033, 0xa5 => 0x601a, + 0xa6 => 0x601e, 0xa7 => 0x602c, 0xa8 => 0x6022, 0xa9 => 0x600d, + 0xaa => 0x6010, 0xab => 0x602e, 0xac => 0x6013, 0xad => 0x6011, + 0xae => 0x600c, 0xaf => 0x6009, 0xb0 => 0x601c, 0xb1 => 0x6214, + 0xb2 => 0x623d, 0xb3 => 0x62ad, 0xb4 => 0x62b4, 0xb5 => 0x62d1, + 0xb6 => 0x62be, 0xb7 => 0x62aa, 0xb8 => 0x62b6, 0xb9 => 0x62ca, + 0xba => 0x62ae, 0xbb => 0x62b3, 0xbc => 0x62af, 0xbd => 0x62bb, + 0xbe => 0x62a9, 0xbf => 0x62b0, 0xc0 => 0x62b8, 0xc1 => 0x653d, + 0xc2 => 0x65a8, 0xc3 => 0x65bb, 0xc4 => 0x6609, 0xc5 => 0x65fc, + 0xc6 => 0x6604, 0xc7 => 0x6612, 0xc8 => 0x6608, 0xc9 => 0x65fb, + 0xca => 0x6603, 0xcb => 0x660b, 0xcc => 0x660d, 0xcd => 0x6605, + 0xce => 0x65fd, 0xcf => 0x6611, 0xd0 => 0x6610, 0xd1 => 0x66f6, + 0xd2 => 0x670a, 0xd3 => 0x6785, 0xd4 => 0x676c, 0xd5 => 0x678e, + 0xd6 => 0x6792, 0xd7 => 0x6776, 0xd8 => 0x677b, 0xd9 => 0x6798, + 0xda => 0x6786, 0xdb => 0x6784, 0xdc => 0x6774, 0xdd => 0x678d, + 0xde => 0x678c, 0xdf => 0x677a, 0xe0 => 0x679f, 0xe1 => 0x6791, + 0xe2 => 0x6799, 0xe3 => 0x6783, 0xe4 => 0x677d, 0xe5 => 0x6781, + 0xe6 => 0x6778, 0xe7 => 0x6779, 0xe8 => 0x6794, 0xe9 => 0x6b25, + 0xea => 0x6b80, 0xeb => 0x6b7e, 0xec => 0x6bde, 0xed => 0x6c1d, + 0xee => 0x6c93, 0xef => 0x6cec, 0xf0 => 0x6ceb, 0xf1 => 0x6cee, + 0xf2 => 0x6cd9, 0xf3 => 0x6cb6, 0xf4 => 0x6cd4, 0xf5 => 0x6cad, + 0xf6 => 0x6ce7, 0xf7 => 0x6cb7, 0xf8 => 0x6cd0, 0xf9 => 0x6cc2, + 0xfa => 0x6cba, 0xfb => 0x6cc3, 0xfc => 0x6cc6, 0xfd => 0x6ced, + 0xfe => 0x6cf2, + }, + 0xcd => { + 0x40 => 0x6cd2, 0x41 => 0x6cdd, 0x42 => 0x6cb4, 0x43 => 0x6c8a, + 0x44 => 0x6c9d, 0x45 => 0x6c80, 0x46 => 0x6cde, 0x47 => 0x6cc0, + 0x48 => 0x6d30, 0x49 => 0x6ccd, 0x4a => 0x6cc7, 0x4b => 0x6cb0, + 0x4c => 0x6cf9, 0x4d => 0x6ccf, 0x4e => 0x6ce9, 0x4f => 0x6cd1, + 0x50 => 0x7094, 0x51 => 0x7098, 0x52 => 0x7085, 0x53 => 0x7093, + 0x54 => 0x7086, 0x55 => 0x7084, 0x56 => 0x7091, 0x57 => 0x7096, + 0x58 => 0x7082, 0x59 => 0x709a, 0x5a => 0x7083, 0x5b => 0x726a, + 0x5c => 0x72d6, 0x5d => 0x72cb, 0x5e => 0x72d8, 0x5f => 0x72c9, + 0x60 => 0x72dc, 0x61 => 0x72d2, 0x62 => 0x72d4, 0x63 => 0x72da, + 0x64 => 0x72cc, 0x65 => 0x72d1, 0x66 => 0x73a4, 0x67 => 0x73a1, + 0x68 => 0x73ad, 0x69 => 0x73a6, 0x6a => 0x73a2, 0x6b => 0x73a0, + 0x6c => 0x73ac, 0x6d => 0x739d, 0x6e => 0x74dd, 0x6f => 0x74e8, + 0x70 => 0x753f, 0x71 => 0x7540, 0x72 => 0x753e, 0x73 => 0x758c, + 0x74 => 0x7598, 0x75 => 0x76af, 0x76 => 0x76f3, 0x77 => 0x76f1, + 0x78 => 0x76f0, 0x79 => 0x76f5, 0x7a => 0x77f8, 0x7b => 0x77fc, + 0x7c => 0x77f9, 0x7d => 0x77fb, 0x7e => 0x77fa, 0xa1 => 0x77f7, + 0xa2 => 0x7942, 0xa3 => 0x793f, 0xa4 => 0x79c5, 0xa5 => 0x7a78, + 0xa6 => 0x7a7b, 0xa7 => 0x7afb, 0xa8 => 0x7c75, 0xa9 => 0x7cfd, + 0xaa => 0x8035, 0xab => 0x808f, 0xac => 0x80ae, 0xad => 0x80a3, + 0xae => 0x80b8, 0xaf => 0x80b5, 0xb0 => 0x80ad, 0xb1 => 0x8220, + 0xb2 => 0x82a0, 0xb3 => 0x82c0, 0xb4 => 0x82ab, 0xb5 => 0x829a, + 0xb6 => 0x8298, 0xb7 => 0x829b, 0xb8 => 0x82b5, 0xb9 => 0x82a7, + 0xba => 0x82ae, 0xbb => 0x82bc, 0xbc => 0x829e, 0xbd => 0x82ba, + 0xbe => 0x82b4, 0xbf => 0x82a8, 0xc0 => 0x82a1, 0xc1 => 0x82a9, + 0xc2 => 0x82c2, 0xc3 => 0x82a4, 0xc4 => 0x82c3, 0xc5 => 0x82b6, + 0xc6 => 0x82a2, 0xc7 => 0x8670, 0xc8 => 0x866f, 0xc9 => 0x866d, + 0xca => 0x866e, 0xcb => 0x8c56, 0xcc => 0x8fd2, 0xcd => 0x8fcb, + 0xce => 0x8fd3, 0xcf => 0x8fcd, 0xd0 => 0x8fd6, 0xd1 => 0x8fd5, + 0xd2 => 0x8fd7, 0xd3 => 0x90b2, 0xd4 => 0x90b4, 0xd5 => 0x90af, + 0xd6 => 0x90b3, 0xd7 => 0x90b0, 0xd8 => 0x9639, 0xd9 => 0x963d, + 0xda => 0x963c, 0xdb => 0x963a, 0xdc => 0x9643, 0xdd => 0x4fcd, + 0xde => 0x4fc5, 0xdf => 0x4fd3, 0xe0 => 0x4fb2, 0xe1 => 0x4fc9, + 0xe2 => 0x4fcb, 0xe3 => 0x4fc1, 0xe4 => 0x4fd4, 0xe5 => 0x4fdc, + 0xe6 => 0x4fd9, 0xe7 => 0x4fbb, 0xe8 => 0x4fb3, 0xe9 => 0x4fdb, + 0xea => 0x4fc7, 0xeb => 0x4fd6, 0xec => 0x4fba, 0xed => 0x4fc0, + 0xee => 0x4fb9, 0xef => 0x4fec, 0xf0 => 0x5244, 0xf1 => 0x5249, + 0xf2 => 0x52c0, 0xf3 => 0x52c2, 0xf4 => 0x533d, 0xf5 => 0x537c, + 0xf6 => 0x5397, 0xf7 => 0x5396, 0xf8 => 0x5399, 0xf9 => 0x5398, + 0xfa => 0x54ba, 0xfb => 0x54a1, 0xfc => 0x54ad, 0xfd => 0x54a5, + 0xfe => 0x54cf, + }, + 0xce => { + 0x40 => 0x54c3, 0x41 => 0x830d, 0x42 => 0x54b7, 0x43 => 0x54ae, + 0x44 => 0x54d6, 0x45 => 0x54b6, 0x46 => 0x54c5, 0x47 => 0x54c6, + 0x48 => 0x54a0, 0x49 => 0x5470, 0x4a => 0x54bc, 0x4b => 0x54a2, + 0x4c => 0x54be, 0x4d => 0x5472, 0x4e => 0x54de, 0x4f => 0x54b0, + 0x50 => 0x57b5, 0x51 => 0x579e, 0x52 => 0x579f, 0x53 => 0x57a4, + 0x54 => 0x578c, 0x55 => 0x5797, 0x56 => 0x579d, 0x57 => 0x579b, + 0x58 => 0x5794, 0x59 => 0x5798, 0x5a => 0x578f, 0x5b => 0x5799, + 0x5c => 0x57a5, 0x5d => 0x579a, 0x5e => 0x5795, 0x5f => 0x58f4, + 0x60 => 0x590d, 0x61 => 0x5953, 0x62 => 0x59e1, 0x63 => 0x59de, + 0x64 => 0x59ee, 0x65 => 0x5a00, 0x66 => 0x59f1, 0x67 => 0x59dd, + 0x68 => 0x59fa, 0x69 => 0x59fd, 0x6a => 0x59fc, 0x6b => 0x59f6, + 0x6c => 0x59e4, 0x6d => 0x59f2, 0x6e => 0x59f7, 0x6f => 0x59db, + 0x70 => 0x59e9, 0x71 => 0x59f3, 0x72 => 0x59f5, 0x73 => 0x59e0, + 0x74 => 0x59fe, 0x75 => 0x59f4, 0x76 => 0x59ed, 0x77 => 0x5ba8, + 0x78 => 0x5c4c, 0x79 => 0x5cd0, 0x7a => 0x5cd8, 0x7b => 0x5ccc, + 0x7c => 0x5cd7, 0x7d => 0x5ccb, 0x7e => 0x5cdb, 0xa1 => 0x5cde, + 0xa2 => 0x5cda, 0xa3 => 0x5cc9, 0xa4 => 0x5cc7, 0xa5 => 0x5cca, + 0xa6 => 0x5cd6, 0xa7 => 0x5cd3, 0xa8 => 0x5cd4, 0xa9 => 0x5ccf, + 0xaa => 0x5cc8, 0xab => 0x5cc6, 0xac => 0x5cce, 0xad => 0x5cdf, + 0xae => 0x5cf8, 0xaf => 0x5df9, 0xb0 => 0x5e21, 0xb1 => 0x5e22, + 0xb2 => 0x5e23, 0xb3 => 0x5e20, 0xb4 => 0x5e24, 0xb5 => 0x5eb0, + 0xb6 => 0x5ea4, 0xb7 => 0x5ea2, 0xb8 => 0x5e9b, 0xb9 => 0x5ea3, + 0xba => 0x5ea5, 0xbb => 0x5f07, 0xbc => 0x5f2e, 0xbd => 0x5f56, + 0xbe => 0x5f86, 0xbf => 0x6037, 0xc0 => 0x6039, 0xc1 => 0x6054, + 0xc2 => 0x6072, 0xc3 => 0x605e, 0xc4 => 0x6045, 0xc5 => 0x6053, + 0xc6 => 0x6047, 0xc7 => 0x6049, 0xc8 => 0x605b, 0xc9 => 0x604c, + 0xca => 0x6040, 0xcb => 0x6042, 0xcc => 0x605f, 0xcd => 0x6024, + 0xce => 0x6044, 0xcf => 0x6058, 0xd0 => 0x6066, 0xd1 => 0x606e, + 0xd2 => 0x6242, 0xd3 => 0x6243, 0xd4 => 0x62cf, 0xd5 => 0x630d, + 0xd6 => 0x630b, 0xd7 => 0x62f5, 0xd8 => 0x630e, 0xd9 => 0x6303, + 0xda => 0x62eb, 0xdb => 0x62f9, 0xdc => 0x630f, 0xdd => 0x630c, + 0xde => 0x62f8, 0xdf => 0x62f6, 0xe0 => 0x6300, 0xe1 => 0x6313, + 0xe2 => 0x6314, 0xe3 => 0x62fa, 0xe4 => 0x6315, 0xe5 => 0x62fb, + 0xe6 => 0x62f0, 0xe7 => 0x6541, 0xe8 => 0x6543, 0xe9 => 0x65aa, + 0xea => 0x65bf, 0xeb => 0x6636, 0xec => 0x6621, 0xed => 0x6632, + 0xee => 0x6635, 0xef => 0x661c, 0xf0 => 0x6626, 0xf1 => 0x6622, + 0xf2 => 0x6633, 0xf3 => 0x662b, 0xf4 => 0x663a, 0xf5 => 0x661d, + 0xf6 => 0x6634, 0xf7 => 0x6639, 0xf8 => 0x662e, 0xf9 => 0x670f, + 0xfa => 0x6710, 0xfb => 0x67c1, 0xfc => 0x67f2, 0xfd => 0x67c8, + 0xfe => 0x67ba, + }, + 0xcf => { + 0x40 => 0x67dc, 0x41 => 0x67bb, 0x42 => 0x67f8, 0x43 => 0x67d8, + 0x44 => 0x67c0, 0x45 => 0x67b7, 0x46 => 0x67c5, 0x47 => 0x67eb, + 0x48 => 0x67e4, 0x49 => 0x67df, 0x4a => 0x67b5, 0x4b => 0x67cd, + 0x4c => 0x67b3, 0x4d => 0x67f7, 0x4e => 0x67f6, 0x4f => 0x67ee, + 0x50 => 0x67e3, 0x51 => 0x67c2, 0x52 => 0x67b9, 0x53 => 0x67ce, + 0x54 => 0x67e7, 0x55 => 0x67f0, 0x56 => 0x67b2, 0x57 => 0x67fc, + 0x58 => 0x67c6, 0x59 => 0x67ed, 0x5a => 0x67cc, 0x5b => 0x67ae, + 0x5c => 0x67e6, 0x5d => 0x67db, 0x5e => 0x67fa, 0x5f => 0x67c9, + 0x60 => 0x67ca, 0x61 => 0x67c3, 0x62 => 0x67ea, 0x63 => 0x67cb, + 0x64 => 0x6b28, 0x65 => 0x6b82, 0x66 => 0x6b84, 0x67 => 0x6bb6, + 0x68 => 0x6bd6, 0x69 => 0x6bd8, 0x6a => 0x6be0, 0x6b => 0x6c20, + 0x6c => 0x6c21, 0x6d => 0x6d28, 0x6e => 0x6d34, 0x6f => 0x6d2d, + 0x70 => 0x6d1f, 0x71 => 0x6d3c, 0x72 => 0x6d3f, 0x73 => 0x6d12, + 0x74 => 0x6d0a, 0x75 => 0x6cda, 0x76 => 0x6d33, 0x77 => 0x6d04, + 0x78 => 0x6d19, 0x79 => 0x6d3a, 0x7a => 0x6d1a, 0x7b => 0x6d11, + 0x7c => 0x6d00, 0x7d => 0x6d1d, 0x7e => 0x6d42, 0xa1 => 0x6d01, + 0xa2 => 0x6d18, 0xa3 => 0x6d37, 0xa4 => 0x6d03, 0xa5 => 0x6d0f, + 0xa6 => 0x6d40, 0xa7 => 0x6d07, 0xa8 => 0x6d20, 0xa9 => 0x6d2c, + 0xaa => 0x6d08, 0xab => 0x6d22, 0xac => 0x6d09, 0xad => 0x6d10, + 0xae => 0x70b7, 0xaf => 0x709f, 0xb0 => 0x70be, 0xb1 => 0x70b1, + 0xb2 => 0x70b0, 0xb3 => 0x70a1, 0xb4 => 0x70b4, 0xb5 => 0x70b5, + 0xb6 => 0x70a9, 0xb7 => 0x7241, 0xb8 => 0x7249, 0xb9 => 0x724a, + 0xba => 0x726c, 0xbb => 0x7270, 0xbc => 0x7273, 0xbd => 0x726e, + 0xbe => 0x72ca, 0xbf => 0x72e4, 0xc0 => 0x72e8, 0xc1 => 0x72eb, + 0xc2 => 0x72df, 0xc3 => 0x72ea, 0xc4 => 0x72e6, 0xc5 => 0x72e3, + 0xc6 => 0x7385, 0xc7 => 0x73cc, 0xc8 => 0x73c2, 0xc9 => 0x73c8, + 0xca => 0x73c5, 0xcb => 0x73b9, 0xcc => 0x73b6, 0xcd => 0x73b5, + 0xce => 0x73b4, 0xcf => 0x73eb, 0xd0 => 0x73bf, 0xd1 => 0x73c7, + 0xd2 => 0x73be, 0xd3 => 0x73c3, 0xd4 => 0x73c6, 0xd5 => 0x73b8, + 0xd6 => 0x73cb, 0xd7 => 0x74ec, 0xd8 => 0x74ee, 0xd9 => 0x752e, + 0xda => 0x7547, 0xdb => 0x7548, 0xdc => 0x75a7, 0xdd => 0x75aa, + 0xde => 0x7679, 0xdf => 0x76c4, 0xe0 => 0x7708, 0xe1 => 0x7703, + 0xe2 => 0x7704, 0xe3 => 0x7705, 0xe4 => 0x770a, 0xe5 => 0x76f7, + 0xe6 => 0x76fb, 0xe7 => 0x76fa, 0xe8 => 0x77e7, 0xe9 => 0x77e8, + 0xea => 0x7806, 0xeb => 0x7811, 0xec => 0x7812, 0xed => 0x7805, + 0xee => 0x7810, 0xef => 0x780f, 0xf0 => 0x780e, 0xf1 => 0x7809, + 0xf2 => 0x7803, 0xf3 => 0x7813, 0xf4 => 0x794a, 0xf5 => 0x794c, + 0xf6 => 0x794b, 0xf7 => 0x7945, 0xf8 => 0x7944, 0xf9 => 0x79d5, + 0xfa => 0x79cd, 0xfb => 0x79cf, 0xfc => 0x79d6, 0xfd => 0x79ce, + 0xfe => 0x7a80, + }, + 0xd0 => { + 0x40 => 0x7a7e, 0x41 => 0x7ad1, 0x42 => 0x7b00, 0x43 => 0x7b01, + 0x44 => 0x7c7a, 0x45 => 0x7c78, 0x46 => 0x7c79, 0x47 => 0x7c7f, + 0x48 => 0x7c80, 0x49 => 0x7c81, 0x4a => 0x7d03, 0x4b => 0x7d08, + 0x4c => 0x7d01, 0x4d => 0x7f58, 0x4e => 0x7f91, 0x4f => 0x7f8d, + 0x50 => 0x7fbe, 0x51 => 0x8007, 0x52 => 0x800e, 0x53 => 0x800f, + 0x54 => 0x8014, 0x55 => 0x8037, 0x56 => 0x80d8, 0x57 => 0x80c7, + 0x58 => 0x80e0, 0x59 => 0x80d1, 0x5a => 0x80c8, 0x5b => 0x80c2, + 0x5c => 0x80d0, 0x5d => 0x80c5, 0x5e => 0x80e3, 0x5f => 0x80d9, + 0x60 => 0x80dc, 0x61 => 0x80ca, 0x62 => 0x80d5, 0x63 => 0x80c9, + 0x64 => 0x80cf, 0x65 => 0x80d7, 0x66 => 0x80e6, 0x67 => 0x80cd, + 0x68 => 0x81ff, 0x69 => 0x8221, 0x6a => 0x8294, 0x6b => 0x82d9, + 0x6c => 0x82fe, 0x6d => 0x82f9, 0x6e => 0x8307, 0x6f => 0x82e8, + 0x70 => 0x8300, 0x71 => 0x82d5, 0x72 => 0x833a, 0x73 => 0x82eb, + 0x74 => 0x82d6, 0x75 => 0x82f4, 0x76 => 0x82ec, 0x77 => 0x82e1, + 0x78 => 0x82f2, 0x79 => 0x82f5, 0x7a => 0x830c, 0x7b => 0x82fb, + 0x7c => 0x82f6, 0x7d => 0x82f0, 0x7e => 0x82ea, 0xa1 => 0x82e4, + 0xa2 => 0x82e0, 0xa3 => 0x82fa, 0xa4 => 0x82f3, 0xa5 => 0x82ed, + 0xa6 => 0x8677, 0xa7 => 0x8674, 0xa8 => 0x867c, 0xa9 => 0x8673, + 0xaa => 0x8841, 0xab => 0x884e, 0xac => 0x8867, 0xad => 0x886a, + 0xae => 0x8869, 0xaf => 0x89d3, 0xb0 => 0x8a04, 0xb1 => 0x8a07, + 0xb2 => 0x8d72, 0xb3 => 0x8fe3, 0xb4 => 0x8fe1, 0xb5 => 0x8fee, + 0xb6 => 0x8fe0, 0xb7 => 0x90f1, 0xb8 => 0x90bd, 0xb9 => 0x90bf, + 0xba => 0x90d5, 0xbb => 0x90c5, 0xbc => 0x90be, 0xbd => 0x90c7, + 0xbe => 0x90cb, 0xbf => 0x90c8, 0xc0 => 0x91d4, 0xc1 => 0x91d3, + 0xc2 => 0x9654, 0xc3 => 0x964f, 0xc4 => 0x9651, 0xc5 => 0x9653, + 0xc6 => 0x964a, 0xc7 => 0x964e, 0xc8 => 0x501e, 0xc9 => 0x5005, + 0xca => 0x5007, 0xcb => 0x5013, 0xcc => 0x5022, 0xcd => 0x5030, + 0xce => 0x501b, 0xcf => 0x4ff5, 0xd0 => 0x4ff4, 0xd1 => 0x5033, + 0xd2 => 0x5037, 0xd3 => 0x502c, 0xd4 => 0x4ff6, 0xd5 => 0x4ff7, + 0xd6 => 0x5017, 0xd7 => 0x501c, 0xd8 => 0x5020, 0xd9 => 0x5027, + 0xda => 0x5035, 0xdb => 0x502f, 0xdc => 0x5031, 0xdd => 0x500e, + 0xde => 0x515a, 0xdf => 0x5194, 0xe0 => 0x5193, 0xe1 => 0x51ca, + 0xe2 => 0x51c4, 0xe3 => 0x51c5, 0xe4 => 0x51c8, 0xe5 => 0x51ce, + 0xe6 => 0x5261, 0xe7 => 0x525a, 0xe8 => 0x5252, 0xe9 => 0x525e, + 0xea => 0x525f, 0xeb => 0x5255, 0xec => 0x5262, 0xed => 0x52cd, + 0xee => 0x530e, 0xef => 0x539e, 0xf0 => 0x5526, 0xf1 => 0x54e2, + 0xf2 => 0x5517, 0xf3 => 0x5512, 0xf4 => 0x54e7, 0xf5 => 0x54f3, + 0xf6 => 0x54e4, 0xf7 => 0x551a, 0xf8 => 0x54ff, 0xf9 => 0x5504, + 0xfa => 0x5508, 0xfb => 0x54eb, 0xfc => 0x5511, 0xfd => 0x5505, + 0xfe => 0x54f1, + }, + 0xd1 => { + 0x40 => 0x550a, 0x41 => 0x54fb, 0x42 => 0x54f7, 0x43 => 0x54f8, + 0x44 => 0x54e0, 0x45 => 0x550e, 0x46 => 0x5503, 0x47 => 0x550b, + 0x48 => 0x5701, 0x49 => 0x5702, 0x4a => 0x57cc, 0x4b => 0x5832, + 0x4c => 0x57d5, 0x4d => 0x57d2, 0x4e => 0x57ba, 0x4f => 0x57c6, + 0x50 => 0x57bd, 0x51 => 0x57bc, 0x52 => 0x57b8, 0x53 => 0x57b6, + 0x54 => 0x57bf, 0x55 => 0x57c7, 0x56 => 0x57d0, 0x57 => 0x57b9, + 0x58 => 0x57c1, 0x59 => 0x590e, 0x5a => 0x594a, 0x5b => 0x5a19, + 0x5c => 0x5a16, 0x5d => 0x5a2d, 0x5e => 0x5a2e, 0x5f => 0x5a15, + 0x60 => 0x5a0f, 0x61 => 0x5a17, 0x62 => 0x5a0a, 0x63 => 0x5a1e, + 0x64 => 0x5a33, 0x65 => 0x5b6c, 0x66 => 0x5ba7, 0x67 => 0x5bad, + 0x68 => 0x5bac, 0x69 => 0x5c03, 0x6a => 0x5c56, 0x6b => 0x5c54, + 0x6c => 0x5cec, 0x6d => 0x5cff, 0x6e => 0x5cee, 0x6f => 0x5cf1, + 0x70 => 0x5cf7, 0x71 => 0x5d00, 0x72 => 0x5cf9, 0x73 => 0x5e29, + 0x74 => 0x5e28, 0x75 => 0x5ea8, 0x76 => 0x5eae, 0x77 => 0x5eaa, + 0x78 => 0x5eac, 0x79 => 0x5f33, 0x7a => 0x5f30, 0x7b => 0x5f67, + 0x7c => 0x605d, 0x7d => 0x605a, 0x7e => 0x6067, 0xa1 => 0x6041, + 0xa2 => 0x60a2, 0xa3 => 0x6088, 0xa4 => 0x6080, 0xa5 => 0x6092, + 0xa6 => 0x6081, 0xa7 => 0x609d, 0xa8 => 0x6083, 0xa9 => 0x6095, + 0xaa => 0x609b, 0xab => 0x6097, 0xac => 0x6087, 0xad => 0x609c, + 0xae => 0x608e, 0xaf => 0x6219, 0xb0 => 0x6246, 0xb1 => 0x62f2, + 0xb2 => 0x6310, 0xb3 => 0x6356, 0xb4 => 0x632c, 0xb5 => 0x6344, + 0xb6 => 0x6345, 0xb7 => 0x6336, 0xb8 => 0x6343, 0xb9 => 0x63e4, + 0xba => 0x6339, 0xbb => 0x634b, 0xbc => 0x634a, 0xbd => 0x633c, + 0xbe => 0x6329, 0xbf => 0x6341, 0xc0 => 0x6334, 0xc1 => 0x6358, + 0xc2 => 0x6354, 0xc3 => 0x6359, 0xc4 => 0x632d, 0xc5 => 0x6347, + 0xc6 => 0x6333, 0xc7 => 0x635a, 0xc8 => 0x6351, 0xc9 => 0x6338, + 0xca => 0x6357, 0xcb => 0x6340, 0xcc => 0x6348, 0xcd => 0x654a, + 0xce => 0x6546, 0xcf => 0x65c6, 0xd0 => 0x65c3, 0xd1 => 0x65c4, + 0xd2 => 0x65c2, 0xd3 => 0x664a, 0xd4 => 0x665f, 0xd5 => 0x6647, + 0xd6 => 0x6651, 0xd7 => 0x6712, 0xd8 => 0x6713, 0xd9 => 0x681f, + 0xda => 0x681a, 0xdb => 0x6849, 0xdc => 0x6832, 0xdd => 0x6833, + 0xde => 0x683b, 0xdf => 0x684b, 0xe0 => 0x684f, 0xe1 => 0x6816, + 0xe2 => 0x6831, 0xe3 => 0x681c, 0xe4 => 0x6835, 0xe5 => 0x682b, + 0xe6 => 0x682d, 0xe7 => 0x682f, 0xe8 => 0x684e, 0xe9 => 0x6844, + 0xea => 0x6834, 0xeb => 0x681d, 0xec => 0x6812, 0xed => 0x6814, + 0xee => 0x6826, 0xef => 0x6828, 0xf0 => 0x682e, 0xf1 => 0x684d, + 0xf2 => 0x683a, 0xf3 => 0x6825, 0xf4 => 0x6820, 0xf5 => 0x6b2c, + 0xf6 => 0x6b2f, 0xf7 => 0x6b2d, 0xf8 => 0x6b31, 0xf9 => 0x6b34, + 0xfa => 0x6b6d, 0xfb => 0x8082, 0xfc => 0x6b88, 0xfd => 0x6be6, + 0xfe => 0x6be4, + }, + 0xd2 => { + 0x40 => 0x6be8, 0x41 => 0x6be3, 0x42 => 0x6be2, 0x43 => 0x6be7, + 0x44 => 0x6c25, 0x45 => 0x6d7a, 0x46 => 0x6d63, 0x47 => 0x6d64, + 0x48 => 0x6d76, 0x49 => 0x6d0d, 0x4a => 0x6d61, 0x4b => 0x6d92, + 0x4c => 0x6d58, 0x4d => 0x6d62, 0x4e => 0x6d6d, 0x4f => 0x6d6f, + 0x50 => 0x6d91, 0x51 => 0x6d8d, 0x52 => 0x6def, 0x53 => 0x6d7f, + 0x54 => 0x6d86, 0x55 => 0x6d5e, 0x56 => 0x6d67, 0x57 => 0x6d60, + 0x58 => 0x6d97, 0x59 => 0x6d70, 0x5a => 0x6d7c, 0x5b => 0x6d5f, + 0x5c => 0x6d82, 0x5d => 0x6d98, 0x5e => 0x6d2f, 0x5f => 0x6d68, + 0x60 => 0x6d8b, 0x61 => 0x6d7e, 0x62 => 0x6d80, 0x63 => 0x6d84, + 0x64 => 0x6d16, 0x65 => 0x6d83, 0x66 => 0x6d7b, 0x67 => 0x6d7d, + 0x68 => 0x6d75, 0x69 => 0x6d90, 0x6a => 0x70dc, 0x6b => 0x70d3, + 0x6c => 0x70d1, 0x6d => 0x70dd, 0x6e => 0x70cb, 0x6f => 0x7f39, + 0x70 => 0x70e2, 0x71 => 0x70d7, 0x72 => 0x70d2, 0x73 => 0x70de, + 0x74 => 0x70e0, 0x75 => 0x70d4, 0x76 => 0x70cd, 0x77 => 0x70c5, + 0x78 => 0x70c6, 0x79 => 0x70c7, 0x7a => 0x70da, 0x7b => 0x70ce, + 0x7c => 0x70e1, 0x7d => 0x7242, 0x7e => 0x7278, 0xa1 => 0x7277, + 0xa2 => 0x7276, 0xa3 => 0x7300, 0xa4 => 0x72fa, 0xa5 => 0x72f4, + 0xa6 => 0x72fe, 0xa7 => 0x72f6, 0xa8 => 0x72f3, 0xa9 => 0x72fb, + 0xaa => 0x7301, 0xab => 0x73d3, 0xac => 0x73d9, 0xad => 0x73e5, + 0xae => 0x73d6, 0xaf => 0x73bc, 0xb0 => 0x73e7, 0xb1 => 0x73e3, + 0xb2 => 0x73e9, 0xb3 => 0x73dc, 0xb4 => 0x73d2, 0xb5 => 0x73db, + 0xb6 => 0x73d4, 0xb7 => 0x73dd, 0xb8 => 0x73da, 0xb9 => 0x73d7, + 0xba => 0x73d8, 0xbb => 0x73e8, 0xbc => 0x74de, 0xbd => 0x74df, + 0xbe => 0x74f4, 0xbf => 0x74f5, 0xc0 => 0x7521, 0xc1 => 0x755b, + 0xc2 => 0x755f, 0xc3 => 0x75b0, 0xc4 => 0x75c1, 0xc5 => 0x75bb, + 0xc6 => 0x75c4, 0xc7 => 0x75c0, 0xc8 => 0x75bf, 0xc9 => 0x75b6, + 0xca => 0x75ba, 0xcb => 0x768a, 0xcc => 0x76c9, 0xcd => 0x771d, + 0xce => 0x771b, 0xcf => 0x7710, 0xd0 => 0x7713, 0xd1 => 0x7712, + 0xd2 => 0x7723, 0xd3 => 0x7711, 0xd4 => 0x7715, 0xd5 => 0x7719, + 0xd6 => 0x771a, 0xd7 => 0x7722, 0xd8 => 0x7727, 0xd9 => 0x7823, + 0xda => 0x782c, 0xdb => 0x7822, 0xdc => 0x7835, 0xdd => 0x782f, + 0xde => 0x7828, 0xdf => 0x782e, 0xe0 => 0x782b, 0xe1 => 0x7821, + 0xe2 => 0x7829, 0xe3 => 0x7833, 0xe4 => 0x782a, 0xe5 => 0x7831, + 0xe6 => 0x7954, 0xe7 => 0x795b, 0xe8 => 0x794f, 0xe9 => 0x795c, + 0xea => 0x7953, 0xeb => 0x7952, 0xec => 0x7951, 0xed => 0x79eb, + 0xee => 0x79ec, 0xef => 0x79e0, 0xf0 => 0x79ee, 0xf1 => 0x79ed, + 0xf2 => 0x79ea, 0xf3 => 0x79dc, 0xf4 => 0x79de, 0xf5 => 0x79dd, + 0xf6 => 0x7a86, 0xf7 => 0x7a89, 0xf8 => 0x7a85, 0xf9 => 0x7a8b, + 0xfa => 0x7a8c, 0xfb => 0x7a8a, 0xfc => 0x7a87, 0xfd => 0x7ad8, + 0xfe => 0x7b10, + }, + 0xd3 => { + 0x40 => 0x7b04, 0x41 => 0x7b13, 0x42 => 0x7b05, 0x43 => 0x7b0f, + 0x44 => 0x7b08, 0x45 => 0x7b0a, 0x46 => 0x7b0e, 0x47 => 0x7b09, + 0x48 => 0x7b12, 0x49 => 0x7c84, 0x4a => 0x7c91, 0x4b => 0x7c8a, + 0x4c => 0x7c8c, 0x4d => 0x7c88, 0x4e => 0x7c8d, 0x4f => 0x7c85, + 0x50 => 0x7d1e, 0x51 => 0x7d1d, 0x52 => 0x7d11, 0x53 => 0x7d0e, + 0x54 => 0x7d18, 0x55 => 0x7d16, 0x56 => 0x7d13, 0x57 => 0x7d1f, + 0x58 => 0x7d12, 0x59 => 0x7d0f, 0x5a => 0x7d0c, 0x5b => 0x7f5c, + 0x5c => 0x7f61, 0x5d => 0x7f5e, 0x5e => 0x7f60, 0x5f => 0x7f5d, + 0x60 => 0x7f5b, 0x61 => 0x7f96, 0x62 => 0x7f92, 0x63 => 0x7fc3, + 0x64 => 0x7fc2, 0x65 => 0x7fc0, 0x66 => 0x8016, 0x67 => 0x803e, + 0x68 => 0x8039, 0x69 => 0x80fa, 0x6a => 0x80f2, 0x6b => 0x80f9, + 0x6c => 0x80f5, 0x6d => 0x8101, 0x6e => 0x80fb, 0x6f => 0x8100, + 0x70 => 0x8201, 0x71 => 0x822f, 0x72 => 0x8225, 0x73 => 0x8333, + 0x74 => 0x832d, 0x75 => 0x8344, 0x76 => 0x8319, 0x77 => 0x8351, + 0x78 => 0x8325, 0x79 => 0x8356, 0x7a => 0x833f, 0x7b => 0x8341, + 0x7c => 0x8326, 0x7d => 0x831c, 0x7e => 0x8322, 0xa1 => 0x8342, + 0xa2 => 0x834e, 0xa3 => 0x831b, 0xa4 => 0x832a, 0xa5 => 0x8308, + 0xa6 => 0x833c, 0xa7 => 0x834d, 0xa8 => 0x8316, 0xa9 => 0x8324, + 0xaa => 0x8320, 0xab => 0x8337, 0xac => 0x832f, 0xad => 0x8329, + 0xae => 0x8347, 0xaf => 0x8345, 0xb0 => 0x834c, 0xb1 => 0x8353, + 0xb2 => 0x831e, 0xb3 => 0x832c, 0xb4 => 0x834b, 0xb5 => 0x8327, + 0xb6 => 0x8348, 0xb7 => 0x8653, 0xb8 => 0x8652, 0xb9 => 0x86a2, + 0xba => 0x86a8, 0xbb => 0x8696, 0xbc => 0x868d, 0xbd => 0x8691, + 0xbe => 0x869e, 0xbf => 0x8687, 0xc0 => 0x8697, 0xc1 => 0x8686, + 0xc2 => 0x868b, 0xc3 => 0x869a, 0xc4 => 0x8685, 0xc5 => 0x86a5, + 0xc6 => 0x8699, 0xc7 => 0x86a1, 0xc8 => 0x86a7, 0xc9 => 0x8695, + 0xca => 0x8698, 0xcb => 0x868e, 0xcc => 0x869d, 0xcd => 0x8690, + 0xce => 0x8694, 0xcf => 0x8843, 0xd0 => 0x8844, 0xd1 => 0x886d, + 0xd2 => 0x8875, 0xd3 => 0x8876, 0xd4 => 0x8872, 0xd5 => 0x8880, + 0xd6 => 0x8871, 0xd7 => 0x887f, 0xd8 => 0x886f, 0xd9 => 0x8883, + 0xda => 0x887e, 0xdb => 0x8874, 0xdc => 0x887c, 0xdd => 0x8a12, + 0xde => 0x8c47, 0xdf => 0x8c57, 0xe0 => 0x8c7b, 0xe1 => 0x8ca4, + 0xe2 => 0x8ca3, 0xe3 => 0x8d76, 0xe4 => 0x8d78, 0xe5 => 0x8db5, + 0xe6 => 0x8db7, 0xe7 => 0x8db6, 0xe8 => 0x8ed1, 0xe9 => 0x8ed3, + 0xea => 0x8ffe, 0xeb => 0x8ff5, 0xec => 0x9002, 0xed => 0x8fff, + 0xee => 0x8ffb, 0xef => 0x9004, 0xf0 => 0x8ffc, 0xf1 => 0x8ff6, + 0xf2 => 0x90d6, 0xf3 => 0x90e0, 0xf4 => 0x90d9, 0xf5 => 0x90da, + 0xf6 => 0x90e3, 0xf7 => 0x90df, 0xf8 => 0x90e5, 0xf9 => 0x90d8, + 0xfa => 0x90db, 0xfb => 0x90d7, 0xfc => 0x90dc, 0xfd => 0x90e4, + 0xfe => 0x9150, + }, + 0xd4 => { + 0x40 => 0x914e, 0x41 => 0x914f, 0x42 => 0x91d5, 0x43 => 0x91e2, + 0x44 => 0x91da, 0x45 => 0x965c, 0x46 => 0x965f, 0x47 => 0x96bc, + 0x48 => 0x98e3, 0x49 => 0x9adf, 0x4a => 0x9b2f, 0x4b => 0x4e7f, + 0x4c => 0x5070, 0x4d => 0x506a, 0x4e => 0x5061, 0x4f => 0x505e, + 0x50 => 0x5060, 0x51 => 0x5053, 0x52 => 0x504b, 0x53 => 0x505d, + 0x54 => 0x5072, 0x55 => 0x5048, 0x56 => 0x504d, 0x57 => 0x5041, + 0x58 => 0x505b, 0x59 => 0x504a, 0x5a => 0x5062, 0x5b => 0x5015, + 0x5c => 0x5045, 0x5d => 0x505f, 0x5e => 0x5069, 0x5f => 0x506b, + 0x60 => 0x5063, 0x61 => 0x5064, 0x62 => 0x5046, 0x63 => 0x5040, + 0x64 => 0x506e, 0x65 => 0x5073, 0x66 => 0x5057, 0x67 => 0x5051, + 0x68 => 0x51d0, 0x69 => 0x526b, 0x6a => 0x526d, 0x6b => 0x526c, + 0x6c => 0x526e, 0x6d => 0x52d6, 0x6e => 0x52d3, 0x6f => 0x532d, + 0x70 => 0x539c, 0x71 => 0x5575, 0x72 => 0x5576, 0x73 => 0x553c, + 0x74 => 0x554d, 0x75 => 0x5550, 0x76 => 0x5534, 0x77 => 0x552a, + 0x78 => 0x5551, 0x79 => 0x5562, 0x7a => 0x5536, 0x7b => 0x5535, + 0x7c => 0x5530, 0x7d => 0x5552, 0x7e => 0x5545, 0xa1 => 0x550c, + 0xa2 => 0x5532, 0xa3 => 0x5565, 0xa4 => 0x554e, 0xa5 => 0x5539, + 0xa6 => 0x5548, 0xa7 => 0x552d, 0xa8 => 0x553b, 0xa9 => 0x5540, + 0xaa => 0x554b, 0xab => 0x570a, 0xac => 0x5707, 0xad => 0x57fb, + 0xae => 0x5814, 0xaf => 0x57e2, 0xb0 => 0x57f6, 0xb1 => 0x57dc, + 0xb2 => 0x57f4, 0xb3 => 0x5800, 0xb4 => 0x57ed, 0xb5 => 0x57fd, + 0xb6 => 0x5808, 0xb7 => 0x57f8, 0xb8 => 0x580b, 0xb9 => 0x57f3, + 0xba => 0x57cf, 0xbb => 0x5807, 0xbc => 0x57ee, 0xbd => 0x57e3, + 0xbe => 0x57f2, 0xbf => 0x57e5, 0xc0 => 0x57ec, 0xc1 => 0x57e1, + 0xc2 => 0x580e, 0xc3 => 0x57fc, 0xc4 => 0x5810, 0xc5 => 0x57e7, + 0xc6 => 0x5801, 0xc7 => 0x580c, 0xc8 => 0x57f1, 0xc9 => 0x57e9, + 0xca => 0x57f0, 0xcb => 0x580d, 0xcc => 0x5804, 0xcd => 0x595c, + 0xce => 0x5a60, 0xcf => 0x5a58, 0xd0 => 0x5a55, 0xd1 => 0x5a67, + 0xd2 => 0x5a5e, 0xd3 => 0x5a38, 0xd4 => 0x5a35, 0xd5 => 0x5a6d, + 0xd6 => 0x5a50, 0xd7 => 0x5a5f, 0xd8 => 0x5a65, 0xd9 => 0x5a6c, + 0xda => 0x5a53, 0xdb => 0x5a64, 0xdc => 0x5a57, 0xdd => 0x5a43, + 0xde => 0x5a5d, 0xdf => 0x5a52, 0xe0 => 0x5a44, 0xe1 => 0x5a5b, + 0xe2 => 0x5a48, 0xe3 => 0x5a8e, 0xe4 => 0x5a3e, 0xe5 => 0x5a4d, + 0xe6 => 0x5a39, 0xe7 => 0x5a4c, 0xe8 => 0x5a70, 0xe9 => 0x5a69, + 0xea => 0x5a47, 0xeb => 0x5a51, 0xec => 0x5a56, 0xed => 0x5a42, + 0xee => 0x5a5c, 0xef => 0x5b72, 0xf0 => 0x5b6e, 0xf1 => 0x5bc1, + 0xf2 => 0x5bc0, 0xf3 => 0x5c59, 0xf4 => 0x5d1e, 0xf5 => 0x5d0b, + 0xf6 => 0x5d1d, 0xf7 => 0x5d1a, 0xf8 => 0x5d20, 0xf9 => 0x5d0c, + 0xfa => 0x5d28, 0xfb => 0x5d0d, 0xfc => 0x5d26, 0xfd => 0x5d25, + 0xfe => 0x5d0f, + }, + 0xd5 => { + 0x40 => 0x5d30, 0x41 => 0x5d12, 0x42 => 0x5d23, 0x43 => 0x5d1f, + 0x44 => 0x5d2e, 0x45 => 0x5e3e, 0x46 => 0x5e34, 0x47 => 0x5eb1, + 0x48 => 0x5eb4, 0x49 => 0x5eb9, 0x4a => 0x5eb2, 0x4b => 0x5eb3, + 0x4c => 0x5f36, 0x4d => 0x5f38, 0x4e => 0x5f9b, 0x4f => 0x5f96, + 0x50 => 0x5f9f, 0x51 => 0x608a, 0x52 => 0x6090, 0x53 => 0x6086, + 0x54 => 0x60be, 0x55 => 0x60b0, 0x56 => 0x60ba, 0x57 => 0x60d3, + 0x58 => 0x60d4, 0x59 => 0x60cf, 0x5a => 0x60e4, 0x5b => 0x60d9, + 0x5c => 0x60dd, 0x5d => 0x60c8, 0x5e => 0x60b1, 0x5f => 0x60db, + 0x60 => 0x60b7, 0x61 => 0x60ca, 0x62 => 0x60bf, 0x63 => 0x60c3, + 0x64 => 0x60cd, 0x65 => 0x60c0, 0x66 => 0x6332, 0x67 => 0x6365, + 0x68 => 0x638a, 0x69 => 0x6382, 0x6a => 0x637d, 0x6b => 0x63bd, + 0x6c => 0x639e, 0x6d => 0x63ad, 0x6e => 0x639d, 0x6f => 0x6397, + 0x70 => 0x63ab, 0x71 => 0x638e, 0x72 => 0x636f, 0x73 => 0x6387, + 0x74 => 0x6390, 0x75 => 0x636e, 0x76 => 0x63af, 0x77 => 0x6375, + 0x78 => 0x639c, 0x79 => 0x636d, 0x7a => 0x63ae, 0x7b => 0x637c, + 0x7c => 0x63a4, 0x7d => 0x633b, 0x7e => 0x639f, 0xa1 => 0x6378, + 0xa2 => 0x6385, 0xa3 => 0x6381, 0xa4 => 0x6391, 0xa5 => 0x638d, + 0xa6 => 0x6370, 0xa7 => 0x6553, 0xa8 => 0x65cd, 0xa9 => 0x6665, + 0xaa => 0x6661, 0xab => 0x665b, 0xac => 0x6659, 0xad => 0x665c, + 0xae => 0x6662, 0xaf => 0x6718, 0xb0 => 0x6879, 0xb1 => 0x6887, + 0xb2 => 0x6890, 0xb3 => 0x689c, 0xb4 => 0x686d, 0xb5 => 0x686e, + 0xb6 => 0x68ae, 0xb7 => 0x68ab, 0xb8 => 0x6956, 0xb9 => 0x686f, + 0xba => 0x68a3, 0xbb => 0x68ac, 0xbc => 0x68a9, 0xbd => 0x6875, + 0xbe => 0x6874, 0xbf => 0x68b2, 0xc0 => 0x688f, 0xc1 => 0x6877, + 0xc2 => 0x6892, 0xc3 => 0x687c, 0xc4 => 0x686b, 0xc5 => 0x6872, + 0xc6 => 0x68aa, 0xc7 => 0x6880, 0xc8 => 0x6871, 0xc9 => 0x687e, + 0xca => 0x689b, 0xcb => 0x6896, 0xcc => 0x688b, 0xcd => 0x68a0, + 0xce => 0x6889, 0xcf => 0x68a4, 0xd0 => 0x6878, 0xd1 => 0x687b, + 0xd2 => 0x6891, 0xd3 => 0x688c, 0xd4 => 0x688a, 0xd5 => 0x687d, + 0xd6 => 0x6b36, 0xd7 => 0x6b33, 0xd8 => 0x6b37, 0xd9 => 0x6b38, + 0xda => 0x6b91, 0xdb => 0x6b8f, 0xdc => 0x6b8d, 0xdd => 0x6b8e, + 0xde => 0x6b8c, 0xdf => 0x6c2a, 0xe0 => 0x6dc0, 0xe1 => 0x6dab, + 0xe2 => 0x6db4, 0xe3 => 0x6db3, 0xe4 => 0x6e74, 0xe5 => 0x6dac, + 0xe6 => 0x6de9, 0xe7 => 0x6de2, 0xe8 => 0x6db7, 0xe9 => 0x6df6, + 0xea => 0x6dd4, 0xeb => 0x6e00, 0xec => 0x6dc8, 0xed => 0x6de0, + 0xee => 0x6ddf, 0xef => 0x6dd6, 0xf0 => 0x6dbe, 0xf1 => 0x6de5, + 0xf2 => 0x6ddc, 0xf3 => 0x6ddd, 0xf4 => 0x6ddb, 0xf5 => 0x6df4, + 0xf6 => 0x6dca, 0xf7 => 0x6dbd, 0xf8 => 0x6ded, 0xf9 => 0x6df0, + 0xfa => 0x6dba, 0xfb => 0x6dd5, 0xfc => 0x6dc2, 0xfd => 0x6dcf, + 0xfe => 0x6dc9, + }, + 0xd6 => { + 0x40 => 0x6dd0, 0x41 => 0x6df2, 0x42 => 0x6dd3, 0x43 => 0x6dfd, + 0x44 => 0x6dd7, 0x45 => 0x6dcd, 0x46 => 0x6de3, 0x47 => 0x6dbb, + 0x48 => 0x70fa, 0x49 => 0x710d, 0x4a => 0x70f7, 0x4b => 0x7117, + 0x4c => 0x70f4, 0x4d => 0x710c, 0x4e => 0x70f0, 0x4f => 0x7104, + 0x50 => 0x70f3, 0x51 => 0x7110, 0x52 => 0x70fc, 0x53 => 0x70ff, + 0x54 => 0x7106, 0x55 => 0x7113, 0x56 => 0x7100, 0x57 => 0x70f8, + 0x58 => 0x70f6, 0x59 => 0x710b, 0x5a => 0x7102, 0x5b => 0x710e, + 0x5c => 0x727e, 0x5d => 0x727b, 0x5e => 0x727c, 0x5f => 0x727f, + 0x60 => 0x731d, 0x61 => 0x7317, 0x62 => 0x7307, 0x63 => 0x7311, + 0x64 => 0x7318, 0x65 => 0x730a, 0x66 => 0x7308, 0x67 => 0x72ff, + 0x68 => 0x730f, 0x69 => 0x731e, 0x6a => 0x7388, 0x6b => 0x73f6, + 0x6c => 0x73f8, 0x6d => 0x73f5, 0x6e => 0x7404, 0x6f => 0x7401, + 0x70 => 0x73fd, 0x71 => 0x7407, 0x72 => 0x7400, 0x73 => 0x73fa, + 0x74 => 0x73fc, 0x75 => 0x73ff, 0x76 => 0x740c, 0x77 => 0x740b, + 0x78 => 0x73f4, 0x79 => 0x7408, 0x7a => 0x7564, 0x7b => 0x7563, + 0x7c => 0x75ce, 0x7d => 0x75d2, 0x7e => 0x75cf, 0xa1 => 0x75cb, + 0xa2 => 0x75cc, 0xa3 => 0x75d1, 0xa4 => 0x75d0, 0xa5 => 0x768f, + 0xa6 => 0x7689, 0xa7 => 0x76d3, 0xa8 => 0x7739, 0xa9 => 0x772f, + 0xaa => 0x772d, 0xab => 0x7731, 0xac => 0x7732, 0xad => 0x7734, + 0xae => 0x7733, 0xaf => 0x773d, 0xb0 => 0x7725, 0xb1 => 0x773b, + 0xb2 => 0x7735, 0xb3 => 0x7848, 0xb4 => 0x7852, 0xb5 => 0x7849, + 0xb6 => 0x784d, 0xb7 => 0x784a, 0xb8 => 0x784c, 0xb9 => 0x7826, + 0xba => 0x7845, 0xbb => 0x7850, 0xbc => 0x7964, 0xbd => 0x7967, + 0xbe => 0x7969, 0xbf => 0x796a, 0xc0 => 0x7963, 0xc1 => 0x796b, + 0xc2 => 0x7961, 0xc3 => 0x79bb, 0xc4 => 0x79fa, 0xc5 => 0x79f8, + 0xc6 => 0x79f6, 0xc7 => 0x79f7, 0xc8 => 0x7a8f, 0xc9 => 0x7a94, + 0xca => 0x7a90, 0xcb => 0x7b35, 0xcc => 0x7b47, 0xcd => 0x7b34, + 0xce => 0x7b25, 0xcf => 0x7b30, 0xd0 => 0x7b22, 0xd1 => 0x7b24, + 0xd2 => 0x7b33, 0xd3 => 0x7b18, 0xd4 => 0x7b2a, 0xd5 => 0x7b1d, + 0xd6 => 0x7b31, 0xd7 => 0x7b2b, 0xd8 => 0x7b2d, 0xd9 => 0x7b2f, + 0xda => 0x7b32, 0xdb => 0x7b38, 0xdc => 0x7b1a, 0xdd => 0x7b23, + 0xde => 0x7c94, 0xdf => 0x7c98, 0xe0 => 0x7c96, 0xe1 => 0x7ca3, + 0xe2 => 0x7d35, 0xe3 => 0x7d3d, 0xe4 => 0x7d38, 0xe5 => 0x7d36, + 0xe6 => 0x7d3a, 0xe7 => 0x7d45, 0xe8 => 0x7d2c, 0xe9 => 0x7d29, + 0xea => 0x7d41, 0xeb => 0x7d47, 0xec => 0x7d3e, 0xed => 0x7d3f, + 0xee => 0x7d4a, 0xef => 0x7d3b, 0xf0 => 0x7d28, 0xf1 => 0x7f63, + 0xf2 => 0x7f95, 0xf3 => 0x7f9c, 0xf4 => 0x7f9d, 0xf5 => 0x7f9b, + 0xf6 => 0x7fca, 0xf7 => 0x7fcb, 0xf8 => 0x7fcd, 0xf9 => 0x7fd0, + 0xfa => 0x7fd1, 0xfb => 0x7fc7, 0xfc => 0x7fcf, 0xfd => 0x7fc9, + 0xfe => 0x801f, + }, + 0xd7 => { + 0x40 => 0x801e, 0x41 => 0x801b, 0x42 => 0x8047, 0x43 => 0x8043, + 0x44 => 0x8048, 0x45 => 0x8118, 0x46 => 0x8125, 0x47 => 0x8119, + 0x48 => 0x811b, 0x49 => 0x812d, 0x4a => 0x811f, 0x4b => 0x812c, + 0x4c => 0x811e, 0x4d => 0x8121, 0x4e => 0x8115, 0x4f => 0x8127, + 0x50 => 0x811d, 0x51 => 0x8122, 0x52 => 0x8211, 0x53 => 0x8238, + 0x54 => 0x8233, 0x55 => 0x823a, 0x56 => 0x8234, 0x57 => 0x8232, + 0x58 => 0x8274, 0x59 => 0x8390, 0x5a => 0x83a3, 0x5b => 0x83a8, + 0x5c => 0x838d, 0x5d => 0x837a, 0x5e => 0x8373, 0x5f => 0x83a4, + 0x60 => 0x8374, 0x61 => 0x838f, 0x62 => 0x8381, 0x63 => 0x8395, + 0x64 => 0x8399, 0x65 => 0x8375, 0x66 => 0x8394, 0x67 => 0x83a9, + 0x68 => 0x837d, 0x69 => 0x8383, 0x6a => 0x838c, 0x6b => 0x839d, + 0x6c => 0x839b, 0x6d => 0x83aa, 0x6e => 0x838b, 0x6f => 0x837e, + 0x70 => 0x83a5, 0x71 => 0x83af, 0x72 => 0x8388, 0x73 => 0x8397, + 0x74 => 0x83b0, 0x75 => 0x837f, 0x76 => 0x83a6, 0x77 => 0x8387, + 0x78 => 0x83ae, 0x79 => 0x8376, 0x7a => 0x839a, 0x7b => 0x8659, + 0x7c => 0x8656, 0x7d => 0x86bf, 0x7e => 0x86b7, 0xa1 => 0x86c2, + 0xa2 => 0x86c1, 0xa3 => 0x86c5, 0xa4 => 0x86ba, 0xa5 => 0x86b0, + 0xa6 => 0x86c8, 0xa7 => 0x86b9, 0xa8 => 0x86b3, 0xa9 => 0x86b8, + 0xaa => 0x86cc, 0xab => 0x86b4, 0xac => 0x86bb, 0xad => 0x86bc, + 0xae => 0x86c3, 0xaf => 0x86bd, 0xb0 => 0x86be, 0xb1 => 0x8852, + 0xb2 => 0x8889, 0xb3 => 0x8895, 0xb4 => 0x88a8, 0xb5 => 0x88a2, + 0xb6 => 0x88aa, 0xb7 => 0x889a, 0xb8 => 0x8891, 0xb9 => 0x88a1, + 0xba => 0x889f, 0xbb => 0x8898, 0xbc => 0x88a7, 0xbd => 0x8899, + 0xbe => 0x889b, 0xbf => 0x8897, 0xc0 => 0x88a4, 0xc1 => 0x88ac, + 0xc2 => 0x888c, 0xc3 => 0x8893, 0xc4 => 0x888e, 0xc5 => 0x8982, + 0xc6 => 0x89d6, 0xc7 => 0x89d9, 0xc8 => 0x89d5, 0xc9 => 0x8a30, + 0xca => 0x8a27, 0xcb => 0x8a2c, 0xcc => 0x8a1e, 0xcd => 0x8c39, + 0xce => 0x8c3b, 0xcf => 0x8c5c, 0xd0 => 0x8c5d, 0xd1 => 0x8c7d, + 0xd2 => 0x8ca5, 0xd3 => 0x8d7d, 0xd4 => 0x8d7b, 0xd5 => 0x8d79, + 0xd6 => 0x8dbc, 0xd7 => 0x8dc2, 0xd8 => 0x8db9, 0xd9 => 0x8dbf, + 0xda => 0x8dc1, 0xdb => 0x8ed8, 0xdc => 0x8ede, 0xdd => 0x8edd, + 0xde => 0x8edc, 0xdf => 0x8ed7, 0xe0 => 0x8ee0, 0xe1 => 0x8ee1, + 0xe2 => 0x9024, 0xe3 => 0x900b, 0xe4 => 0x9011, 0xe5 => 0x901c, + 0xe6 => 0x900c, 0xe7 => 0x9021, 0xe8 => 0x90ef, 0xe9 => 0x90ea, + 0xea => 0x90f0, 0xeb => 0x90f4, 0xec => 0x90f2, 0xed => 0x90f3, + 0xee => 0x90d4, 0xef => 0x90eb, 0xf0 => 0x90ec, 0xf1 => 0x90e9, + 0xf2 => 0x9156, 0xf3 => 0x9158, 0xf4 => 0x915a, 0xf5 => 0x9153, + 0xf6 => 0x9155, 0xf7 => 0x91ec, 0xf8 => 0x91f4, 0xf9 => 0x91f1, + 0xfa => 0x91f3, 0xfb => 0x91f8, 0xfc => 0x91e4, 0xfd => 0x91f9, + 0xfe => 0x91ea, + }, + 0xd8 => { + 0x40 => 0x91eb, 0x41 => 0x91f7, 0x42 => 0x91e8, 0x43 => 0x91ee, + 0x44 => 0x957a, 0x45 => 0x9586, 0x46 => 0x9588, 0x47 => 0x967c, + 0x48 => 0x966d, 0x49 => 0x966b, 0x4a => 0x9671, 0x4b => 0x966f, + 0x4c => 0x96bf, 0x4d => 0x976a, 0x4e => 0x9804, 0x4f => 0x98e5, + 0x50 => 0x9997, 0x51 => 0x509b, 0x52 => 0x5095, 0x53 => 0x5094, + 0x54 => 0x509e, 0x55 => 0x508b, 0x56 => 0x50a3, 0x57 => 0x5083, + 0x58 => 0x508c, 0x59 => 0x508e, 0x5a => 0x509d, 0x5b => 0x5068, + 0x5c => 0x509c, 0x5d => 0x5092, 0x5e => 0x5082, 0x5f => 0x5087, + 0x60 => 0x515f, 0x61 => 0x51d4, 0x62 => 0x5312, 0x63 => 0x5311, + 0x64 => 0x53a4, 0x65 => 0x53a7, 0x66 => 0x5591, 0x67 => 0x55a8, + 0x68 => 0x55a5, 0x69 => 0x55ad, 0x6a => 0x5577, 0x6b => 0x5645, + 0x6c => 0x55a2, 0x6d => 0x5593, 0x6e => 0x5588, 0x6f => 0x558f, + 0x70 => 0x55b5, 0x71 => 0x5581, 0x72 => 0x55a3, 0x73 => 0x5592, + 0x74 => 0x55a4, 0x75 => 0x557d, 0x76 => 0x558c, 0x77 => 0x55a6, + 0x78 => 0x557f, 0x79 => 0x5595, 0x7a => 0x55a1, 0x7b => 0x558e, + 0x7c => 0x570c, 0x7d => 0x5829, 0x7e => 0x5837, 0xa1 => 0x5819, + 0xa2 => 0x581e, 0xa3 => 0x5827, 0xa4 => 0x5823, 0xa5 => 0x5828, + 0xa6 => 0x57f5, 0xa7 => 0x5848, 0xa8 => 0x5825, 0xa9 => 0x581c, + 0xaa => 0x581b, 0xab => 0x5833, 0xac => 0x583f, 0xad => 0x5836, + 0xae => 0x582e, 0xaf => 0x5839, 0xb0 => 0x5838, 0xb1 => 0x582d, + 0xb2 => 0x582c, 0xb3 => 0x583b, 0xb4 => 0x5961, 0xb5 => 0x5aaf, + 0xb6 => 0x5a94, 0xb7 => 0x5a9f, 0xb8 => 0x5a7a, 0xb9 => 0x5aa2, + 0xba => 0x5a9e, 0xbb => 0x5a78, 0xbc => 0x5aa6, 0xbd => 0x5a7c, + 0xbe => 0x5aa5, 0xbf => 0x5aac, 0xc0 => 0x5a95, 0xc1 => 0x5aae, + 0xc2 => 0x5a37, 0xc3 => 0x5a84, 0xc4 => 0x5a8a, 0xc5 => 0x5a97, + 0xc6 => 0x5a83, 0xc7 => 0x5a8b, 0xc8 => 0x5aa9, 0xc9 => 0x5a7b, + 0xca => 0x5a7d, 0xcb => 0x5a8c, 0xcc => 0x5a9c, 0xcd => 0x5a8f, + 0xce => 0x5a93, 0xcf => 0x5a9d, 0xd0 => 0x5bea, 0xd1 => 0x5bcd, + 0xd2 => 0x5bcb, 0xd3 => 0x5bd4, 0xd4 => 0x5bd1, 0xd5 => 0x5bca, + 0xd6 => 0x5bce, 0xd7 => 0x5c0c, 0xd8 => 0x5c30, 0xd9 => 0x5d37, + 0xda => 0x5d43, 0xdb => 0x5d6b, 0xdc => 0x5d41, 0xdd => 0x5d4b, + 0xde => 0x5d3f, 0xdf => 0x5d35, 0xe0 => 0x5d51, 0xe1 => 0x5d4e, + 0xe2 => 0x5d55, 0xe3 => 0x5d33, 0xe4 => 0x5d3a, 0xe5 => 0x5d52, + 0xe6 => 0x5d3d, 0xe7 => 0x5d31, 0xe8 => 0x5d59, 0xe9 => 0x5d42, + 0xea => 0x5d39, 0xeb => 0x5d49, 0xec => 0x5d38, 0xed => 0x5d3c, + 0xee => 0x5d32, 0xef => 0x5d36, 0xf0 => 0x5d40, 0xf1 => 0x5d45, + 0xf2 => 0x5e44, 0xf3 => 0x5e41, 0xf4 => 0x5f58, 0xf5 => 0x5fa6, + 0xf6 => 0x5fa5, 0xf7 => 0x5fab, 0xf8 => 0x60c9, 0xf9 => 0x60b9, + 0xfa => 0x60cc, 0xfb => 0x60e2, 0xfc => 0x60ce, 0xfd => 0x60c4, + 0xfe => 0x6114, + }, + 0xd9 => { + 0x40 => 0x60f2, 0x41 => 0x610a, 0x42 => 0x6116, 0x43 => 0x6105, + 0x44 => 0x60f5, 0x45 => 0x6113, 0x46 => 0x60f8, 0x47 => 0x60fc, + 0x48 => 0x60fe, 0x49 => 0x60c1, 0x4a => 0x6103, 0x4b => 0x6118, + 0x4c => 0x611d, 0x4d => 0x6110, 0x4e => 0x60ff, 0x4f => 0x6104, + 0x50 => 0x610b, 0x51 => 0x624a, 0x52 => 0x6394, 0x53 => 0x63b1, + 0x54 => 0x63b0, 0x55 => 0x63ce, 0x56 => 0x63e5, 0x57 => 0x63e8, + 0x58 => 0x63ef, 0x59 => 0x63c3, 0x5a => 0x649d, 0x5b => 0x63f3, + 0x5c => 0x63ca, 0x5d => 0x63e0, 0x5e => 0x63f6, 0x5f => 0x63d5, + 0x60 => 0x63f2, 0x61 => 0x63f5, 0x62 => 0x6461, 0x63 => 0x63df, + 0x64 => 0x63be, 0x65 => 0x63dd, 0x66 => 0x63dc, 0x67 => 0x63c4, + 0x68 => 0x63d8, 0x69 => 0x63d3, 0x6a => 0x63c2, 0x6b => 0x63c7, + 0x6c => 0x63cc, 0x6d => 0x63cb, 0x6e => 0x63c8, 0x6f => 0x63f0, + 0x70 => 0x63d7, 0x71 => 0x63d9, 0x72 => 0x6532, 0x73 => 0x6567, + 0x74 => 0x656a, 0x75 => 0x6564, 0x76 => 0x655c, 0x77 => 0x6568, + 0x78 => 0x6565, 0x79 => 0x658c, 0x7a => 0x659d, 0x7b => 0x659e, + 0x7c => 0x65ae, 0x7d => 0x65d0, 0x7e => 0x65d2, 0xa1 => 0x667c, + 0xa2 => 0x666c, 0xa3 => 0x667b, 0xa4 => 0x6680, 0xa5 => 0x6671, + 0xa6 => 0x6679, 0xa7 => 0x666a, 0xa8 => 0x6672, 0xa9 => 0x6701, + 0xaa => 0x690c, 0xab => 0x68d3, 0xac => 0x6904, 0xad => 0x68dc, + 0xae => 0x692a, 0xaf => 0x68ec, 0xb0 => 0x68ea, 0xb1 => 0x68f1, + 0xb2 => 0x690f, 0xb3 => 0x68d6, 0xb4 => 0x68f7, 0xb5 => 0x68eb, + 0xb6 => 0x68e4, 0xb7 => 0x68f6, 0xb8 => 0x6913, 0xb9 => 0x6910, + 0xba => 0x68f3, 0xbb => 0x68e1, 0xbc => 0x6907, 0xbd => 0x68cc, + 0xbe => 0x6908, 0xbf => 0x6970, 0xc0 => 0x68b4, 0xc1 => 0x6911, + 0xc2 => 0x68ef, 0xc3 => 0x68c6, 0xc4 => 0x6914, 0xc5 => 0x68f8, + 0xc6 => 0x68d0, 0xc7 => 0x68fd, 0xc8 => 0x68fc, 0xc9 => 0x68e8, + 0xca => 0x690b, 0xcb => 0x690a, 0xcc => 0x6917, 0xcd => 0x68ce, + 0xce => 0x68c8, 0xcf => 0x68dd, 0xd0 => 0x68de, 0xd1 => 0x68e6, + 0xd2 => 0x68f4, 0xd3 => 0x68d1, 0xd4 => 0x6906, 0xd5 => 0x68d4, + 0xd6 => 0x68e9, 0xd7 => 0x6915, 0xd8 => 0x6925, 0xd9 => 0x68c7, + 0xda => 0x6b39, 0xdb => 0x6b3b, 0xdc => 0x6b3f, 0xdd => 0x6b3c, + 0xde => 0x6b94, 0xdf => 0x6b97, 0xe0 => 0x6b99, 0xe1 => 0x6b95, + 0xe2 => 0x6bbd, 0xe3 => 0x6bf0, 0xe4 => 0x6bf2, 0xe5 => 0x6bf3, + 0xe6 => 0x6c30, 0xe7 => 0x6dfc, 0xe8 => 0x6e46, 0xe9 => 0x6e47, + 0xea => 0x6e1f, 0xeb => 0x6e49, 0xec => 0x6e88, 0xed => 0x6e3c, + 0xee => 0x6e3d, 0xef => 0x6e45, 0xf0 => 0x6e62, 0xf1 => 0x6e2b, + 0xf2 => 0x6e3f, 0xf3 => 0x6e41, 0xf4 => 0x6e5d, 0xf5 => 0x6e73, + 0xf6 => 0x6e1c, 0xf7 => 0x6e33, 0xf8 => 0x6e4b, 0xf9 => 0x6e40, + 0xfa => 0x6e51, 0xfb => 0x6e3b, 0xfc => 0x6e03, 0xfd => 0x6e2e, + 0xfe => 0x6e5e, + }, + 0xda => { + 0x40 => 0x6e68, 0x41 => 0x6e5c, 0x42 => 0x6e61, 0x43 => 0x6e31, + 0x44 => 0x6e28, 0x45 => 0x6e60, 0x46 => 0x6e71, 0x47 => 0x6e6b, + 0x48 => 0x6e39, 0x49 => 0x6e22, 0x4a => 0x6e30, 0x4b => 0x6e53, + 0x4c => 0x6e65, 0x4d => 0x6e27, 0x4e => 0x6e78, 0x4f => 0x6e64, + 0x50 => 0x6e77, 0x51 => 0x6e55, 0x52 => 0x6e79, 0x53 => 0x6e52, + 0x54 => 0x6e66, 0x55 => 0x6e35, 0x56 => 0x6e36, 0x57 => 0x6e5a, + 0x58 => 0x7120, 0x59 => 0x711e, 0x5a => 0x712f, 0x5b => 0x70fb, + 0x5c => 0x712e, 0x5d => 0x7131, 0x5e => 0x7123, 0x5f => 0x7125, + 0x60 => 0x7122, 0x61 => 0x7132, 0x62 => 0x711f, 0x63 => 0x7128, + 0x64 => 0x713a, 0x65 => 0x711b, 0x66 => 0x724b, 0x67 => 0x725a, + 0x68 => 0x7288, 0x69 => 0x7289, 0x6a => 0x7286, 0x6b => 0x7285, + 0x6c => 0x728b, 0x6d => 0x7312, 0x6e => 0x730b, 0x6f => 0x7330, + 0x70 => 0x7322, 0x71 => 0x7331, 0x72 => 0x7333, 0x73 => 0x7327, + 0x74 => 0x7332, 0x75 => 0x732d, 0x76 => 0x7326, 0x77 => 0x7323, + 0x78 => 0x7335, 0x79 => 0x730c, 0x7a => 0x742e, 0x7b => 0x742c, + 0x7c => 0x7430, 0x7d => 0x742b, 0x7e => 0x7416, 0xa1 => 0x741a, + 0xa2 => 0x7421, 0xa3 => 0x742d, 0xa4 => 0x7431, 0xa5 => 0x7424, + 0xa6 => 0x7423, 0xa7 => 0x741d, 0xa8 => 0x7429, 0xa9 => 0x7420, + 0xaa => 0x7432, 0xab => 0x74fb, 0xac => 0x752f, 0xad => 0x756f, + 0xae => 0x756c, 0xaf => 0x75e7, 0xb0 => 0x75da, 0xb1 => 0x75e1, + 0xb2 => 0x75e6, 0xb3 => 0x75dd, 0xb4 => 0x75df, 0xb5 => 0x75e4, + 0xb6 => 0x75d7, 0xb7 => 0x7695, 0xb8 => 0x7692, 0xb9 => 0x76da, + 0xba => 0x7746, 0xbb => 0x7747, 0xbc => 0x7744, 0xbd => 0x774d, + 0xbe => 0x7745, 0xbf => 0x774a, 0xc0 => 0x774e, 0xc1 => 0x774b, + 0xc2 => 0x774c, 0xc3 => 0x77de, 0xc4 => 0x77ec, 0xc5 => 0x7860, + 0xc6 => 0x7864, 0xc7 => 0x7865, 0xc8 => 0x785c, 0xc9 => 0x786d, + 0xca => 0x7871, 0xcb => 0x786a, 0xcc => 0x786e, 0xcd => 0x7870, + 0xce => 0x7869, 0xcf => 0x7868, 0xd0 => 0x785e, 0xd1 => 0x7862, + 0xd2 => 0x7974, 0xd3 => 0x7973, 0xd4 => 0x7972, 0xd5 => 0x7970, + 0xd6 => 0x7a02, 0xd7 => 0x7a0a, 0xd8 => 0x7a03, 0xd9 => 0x7a0c, + 0xda => 0x7a04, 0xdb => 0x7a99, 0xdc => 0x7ae6, 0xdd => 0x7ae4, + 0xde => 0x7b4a, 0xdf => 0x7b3b, 0xe0 => 0x7b44, 0xe1 => 0x7b48, + 0xe2 => 0x7b4c, 0xe3 => 0x7b4e, 0xe4 => 0x7b40, 0xe5 => 0x7b58, + 0xe6 => 0x7b45, 0xe7 => 0x7ca2, 0xe8 => 0x7c9e, 0xe9 => 0x7ca8, + 0xea => 0x7ca1, 0xeb => 0x7d58, 0xec => 0x7d6f, 0xed => 0x7d63, + 0xee => 0x7d53, 0xef => 0x7d56, 0xf0 => 0x7d67, 0xf1 => 0x7d6a, + 0xf2 => 0x7d4f, 0xf3 => 0x7d6d, 0xf4 => 0x7d5c, 0xf5 => 0x7d6b, + 0xf6 => 0x7d52, 0xf7 => 0x7d54, 0xf8 => 0x7d69, 0xf9 => 0x7d51, + 0xfa => 0x7d5f, 0xfb => 0x7d4e, 0xfc => 0x7f3e, 0xfd => 0x7f3f, + 0xfe => 0x7f65, + }, + 0xdb => { + 0x40 => 0x7f66, 0x41 => 0x7fa2, 0x42 => 0x7fa0, 0x43 => 0x7fa1, + 0x44 => 0x7fd7, 0x45 => 0x8051, 0x46 => 0x804f, 0x47 => 0x8050, + 0x48 => 0x80fe, 0x49 => 0x80d4, 0x4a => 0x8143, 0x4b => 0x814a, + 0x4c => 0x8152, 0x4d => 0x814f, 0x4e => 0x8147, 0x4f => 0x813d, + 0x50 => 0x814d, 0x51 => 0x813a, 0x52 => 0x81e6, 0x53 => 0x81ee, + 0x54 => 0x81f7, 0x55 => 0x81f8, 0x56 => 0x81f9, 0x57 => 0x8204, + 0x58 => 0x823c, 0x59 => 0x823d, 0x5a => 0x823f, 0x5b => 0x8275, + 0x5c => 0x833b, 0x5d => 0x83cf, 0x5e => 0x83f9, 0x5f => 0x8423, + 0x60 => 0x83c0, 0x61 => 0x83e8, 0x62 => 0x8412, 0x63 => 0x83e7, + 0x64 => 0x83e4, 0x65 => 0x83fc, 0x66 => 0x83f6, 0x67 => 0x8410, + 0x68 => 0x83c6, 0x69 => 0x83c8, 0x6a => 0x83eb, 0x6b => 0x83e3, + 0x6c => 0x83bf, 0x6d => 0x8401, 0x6e => 0x83dd, 0x6f => 0x83e5, + 0x70 => 0x83d8, 0x71 => 0x83ff, 0x72 => 0x83e1, 0x73 => 0x83cb, + 0x74 => 0x83ce, 0x75 => 0x83d6, 0x76 => 0x83f5, 0x77 => 0x83c9, + 0x78 => 0x8409, 0x79 => 0x840f, 0x7a => 0x83de, 0x7b => 0x8411, + 0x7c => 0x8406, 0x7d => 0x83c2, 0x7e => 0x83f3, 0xa1 => 0x83d5, + 0xa2 => 0x83fa, 0xa3 => 0x83c7, 0xa4 => 0x83d1, 0xa5 => 0x83ea, + 0xa6 => 0x8413, 0xa7 => 0x83c3, 0xa8 => 0x83ec, 0xa9 => 0x83ee, + 0xaa => 0x83c4, 0xab => 0x83fb, 0xac => 0x83d7, 0xad => 0x83e2, + 0xae => 0x841b, 0xaf => 0x83db, 0xb0 => 0x83fe, 0xb1 => 0x86d8, + 0xb2 => 0x86e2, 0xb3 => 0x86e6, 0xb4 => 0x86d3, 0xb5 => 0x86e3, + 0xb6 => 0x86da, 0xb7 => 0x86ea, 0xb8 => 0x86dd, 0xb9 => 0x86eb, + 0xba => 0x86dc, 0xbb => 0x86ec, 0xbc => 0x86e9, 0xbd => 0x86d7, + 0xbe => 0x86e8, 0xbf => 0x86d1, 0xc0 => 0x8848, 0xc1 => 0x8856, + 0xc2 => 0x8855, 0xc3 => 0x88ba, 0xc4 => 0x88d7, 0xc5 => 0x88b9, + 0xc6 => 0x88b8, 0xc7 => 0x88c0, 0xc8 => 0x88be, 0xc9 => 0x88b6, + 0xca => 0x88bc, 0xcb => 0x88b7, 0xcc => 0x88bd, 0xcd => 0x88b2, + 0xce => 0x8901, 0xcf => 0x88c9, 0xd0 => 0x8995, 0xd1 => 0x8998, + 0xd2 => 0x8997, 0xd3 => 0x89dd, 0xd4 => 0x89da, 0xd5 => 0x89db, + 0xd6 => 0x8a4e, 0xd7 => 0x8a4d, 0xd8 => 0x8a39, 0xd9 => 0x8a59, + 0xda => 0x8a40, 0xdb => 0x8a57, 0xdc => 0x8a58, 0xdd => 0x8a44, + 0xde => 0x8a45, 0xdf => 0x8a52, 0xe0 => 0x8a48, 0xe1 => 0x8a51, + 0xe2 => 0x8a4a, 0xe3 => 0x8a4c, 0xe4 => 0x8a4f, 0xe5 => 0x8c5f, + 0xe6 => 0x8c81, 0xe7 => 0x8c80, 0xe8 => 0x8cba, 0xe9 => 0x8cbe, + 0xea => 0x8cb0, 0xeb => 0x8cb9, 0xec => 0x8cb5, 0xed => 0x8d84, + 0xee => 0x8d80, 0xef => 0x8d89, 0xf0 => 0x8dd8, 0xf1 => 0x8dd3, + 0xf2 => 0x8dcd, 0xf3 => 0x8dc7, 0xf4 => 0x8dd6, 0xf5 => 0x8ddc, + 0xf6 => 0x8dcf, 0xf7 => 0x8dd5, 0xf8 => 0x8dd9, 0xf9 => 0x8dc8, + 0xfa => 0x8dd7, 0xfb => 0x8dc5, 0xfc => 0x8eef, 0xfd => 0x8ef7, + 0xfe => 0x8efa, + }, + 0xdc => { + 0x40 => 0x8ef9, 0x41 => 0x8ee6, 0x42 => 0x8eee, 0x43 => 0x8ee5, + 0x44 => 0x8ef5, 0x45 => 0x8ee7, 0x46 => 0x8ee8, 0x47 => 0x8ef6, + 0x48 => 0x8eeb, 0x49 => 0x8ef1, 0x4a => 0x8eec, 0x4b => 0x8ef4, + 0x4c => 0x8ee9, 0x4d => 0x902d, 0x4e => 0x9034, 0x4f => 0x902f, + 0x50 => 0x9106, 0x51 => 0x912c, 0x52 => 0x9104, 0x53 => 0x90ff, + 0x54 => 0x90fc, 0x55 => 0x9108, 0x56 => 0x90f9, 0x57 => 0x90fb, + 0x58 => 0x9101, 0x59 => 0x9100, 0x5a => 0x9107, 0x5b => 0x9105, + 0x5c => 0x9103, 0x5d => 0x9161, 0x5e => 0x9164, 0x5f => 0x915f, + 0x60 => 0x9162, 0x61 => 0x9160, 0x62 => 0x9201, 0x63 => 0x920a, + 0x64 => 0x9225, 0x65 => 0x9203, 0x66 => 0x921a, 0x67 => 0x9226, + 0x68 => 0x920f, 0x69 => 0x920c, 0x6a => 0x9200, 0x6b => 0x9212, + 0x6c => 0x91ff, 0x6d => 0x91fd, 0x6e => 0x9206, 0x6f => 0x9204, + 0x70 => 0x9227, 0x71 => 0x9202, 0x72 => 0x921c, 0x73 => 0x9224, + 0x74 => 0x9219, 0x75 => 0x9217, 0x76 => 0x9205, 0x77 => 0x9216, + 0x78 => 0x957b, 0x79 => 0x958d, 0x7a => 0x958c, 0x7b => 0x9590, + 0x7c => 0x9687, 0x7d => 0x967e, 0x7e => 0x9688, 0xa1 => 0x9689, + 0xa2 => 0x9683, 0xa3 => 0x9680, 0xa4 => 0x96c2, 0xa5 => 0x96c8, + 0xa6 => 0x96c3, 0xa7 => 0x96f1, 0xa8 => 0x96f0, 0xa9 => 0x976c, + 0xaa => 0x9770, 0xab => 0x976e, 0xac => 0x9807, 0xad => 0x98a9, + 0xae => 0x98eb, 0xaf => 0x9ce6, 0xb0 => 0x9ef9, 0xb1 => 0x4e83, + 0xb2 => 0x4e84, 0xb3 => 0x4eb6, 0xb4 => 0x50bd, 0xb5 => 0x50bf, + 0xb6 => 0x50c6, 0xb7 => 0x50ae, 0xb8 => 0x50c4, 0xb9 => 0x50ca, + 0xba => 0x50b4, 0xbb => 0x50c8, 0xbc => 0x50c2, 0xbd => 0x50b0, + 0xbe => 0x50c1, 0xbf => 0x50ba, 0xc0 => 0x50b1, 0xc1 => 0x50cb, + 0xc2 => 0x50c9, 0xc3 => 0x50b6, 0xc4 => 0x50b8, 0xc5 => 0x51d7, + 0xc6 => 0x527a, 0xc7 => 0x5278, 0xc8 => 0x527b, 0xc9 => 0x527c, + 0xca => 0x55c3, 0xcb => 0x55db, 0xcc => 0x55cc, 0xcd => 0x55d0, + 0xce => 0x55cb, 0xcf => 0x55ca, 0xd0 => 0x55dd, 0xd1 => 0x55c0, + 0xd2 => 0x55d4, 0xd3 => 0x55c4, 0xd4 => 0x55e9, 0xd5 => 0x55bf, + 0xd6 => 0x55d2, 0xd7 => 0x558d, 0xd8 => 0x55cf, 0xd9 => 0x55d5, + 0xda => 0x55e2, 0xdb => 0x55d6, 0xdc => 0x55c8, 0xdd => 0x55f2, + 0xde => 0x55cd, 0xdf => 0x55d9, 0xe0 => 0x55c2, 0xe1 => 0x5714, + 0xe2 => 0x5853, 0xe3 => 0x5868, 0xe4 => 0x5864, 0xe5 => 0x584f, + 0xe6 => 0x584d, 0xe7 => 0x5849, 0xe8 => 0x586f, 0xe9 => 0x5855, + 0xea => 0x584e, 0xeb => 0x585d, 0xec => 0x5859, 0xed => 0x5865, + 0xee => 0x585b, 0xef => 0x583d, 0xf0 => 0x5863, 0xf1 => 0x5871, + 0xf2 => 0x58fc, 0xf3 => 0x5ac7, 0xf4 => 0x5ac4, 0xf5 => 0x5acb, + 0xf6 => 0x5aba, 0xf7 => 0x5ab8, 0xf8 => 0x5ab1, 0xf9 => 0x5ab5, + 0xfa => 0x5ab0, 0xfb => 0x5abf, 0xfc => 0x5ac8, 0xfd => 0x5abb, + 0xfe => 0x5ac6, + }, + 0xdd => { + 0x40 => 0x5ab7, 0x41 => 0x5ac0, 0x42 => 0x5aca, 0x43 => 0x5ab4, + 0x44 => 0x5ab6, 0x45 => 0x5acd, 0x46 => 0x5ab9, 0x47 => 0x5a90, + 0x48 => 0x5bd6, 0x49 => 0x5bd8, 0x4a => 0x5bd9, 0x4b => 0x5c1f, + 0x4c => 0x5c33, 0x4d => 0x5d71, 0x4e => 0x5d63, 0x4f => 0x5d4a, + 0x50 => 0x5d65, 0x51 => 0x5d72, 0x52 => 0x5d6c, 0x53 => 0x5d5e, + 0x54 => 0x5d68, 0x55 => 0x5d67, 0x56 => 0x5d62, 0x57 => 0x5df0, + 0x58 => 0x5e4f, 0x59 => 0x5e4e, 0x5a => 0x5e4a, 0x5b => 0x5e4d, + 0x5c => 0x5e4b, 0x5d => 0x5ec5, 0x5e => 0x5ecc, 0x5f => 0x5ec6, + 0x60 => 0x5ecb, 0x61 => 0x5ec7, 0x62 => 0x5f40, 0x63 => 0x5faf, + 0x64 => 0x5fad, 0x65 => 0x60f7, 0x66 => 0x6149, 0x67 => 0x614a, + 0x68 => 0x612b, 0x69 => 0x6145, 0x6a => 0x6136, 0x6b => 0x6132, + 0x6c => 0x612e, 0x6d => 0x6146, 0x6e => 0x612f, 0x6f => 0x614f, + 0x70 => 0x6129, 0x71 => 0x6140, 0x72 => 0x6220, 0x73 => 0x9168, + 0x74 => 0x6223, 0x75 => 0x6225, 0x76 => 0x6224, 0x77 => 0x63c5, + 0x78 => 0x63f1, 0x79 => 0x63eb, 0x7a => 0x6410, 0x7b => 0x6412, + 0x7c => 0x6409, 0x7d => 0x6420, 0x7e => 0x6424, 0xa1 => 0x6433, + 0xa2 => 0x6443, 0xa3 => 0x641f, 0xa4 => 0x6415, 0xa5 => 0x6418, + 0xa6 => 0x6439, 0xa7 => 0x6437, 0xa8 => 0x6422, 0xa9 => 0x6423, + 0xaa => 0x640c, 0xab => 0x6426, 0xac => 0x6430, 0xad => 0x6428, + 0xae => 0x6441, 0xaf => 0x6435, 0xb0 => 0x642f, 0xb1 => 0x640a, + 0xb2 => 0x641a, 0xb3 => 0x6440, 0xb4 => 0x6425, 0xb5 => 0x6427, + 0xb6 => 0x640b, 0xb7 => 0x63e7, 0xb8 => 0x641b, 0xb9 => 0x642e, + 0xba => 0x6421, 0xbb => 0x640e, 0xbc => 0x656f, 0xbd => 0x6592, + 0xbe => 0x65d3, 0xbf => 0x6686, 0xc0 => 0x668c, 0xc1 => 0x6695, + 0xc2 => 0x6690, 0xc3 => 0x668b, 0xc4 => 0x668a, 0xc5 => 0x6699, + 0xc6 => 0x6694, 0xc7 => 0x6678, 0xc8 => 0x6720, 0xc9 => 0x6966, + 0xca => 0x695f, 0xcb => 0x6938, 0xcc => 0x694e, 0xcd => 0x6962, + 0xce => 0x6971, 0xcf => 0x693f, 0xd0 => 0x6945, 0xd1 => 0x696a, + 0xd2 => 0x6939, 0xd3 => 0x6942, 0xd4 => 0x6957, 0xd5 => 0x6959, + 0xd6 => 0x697a, 0xd7 => 0x6948, 0xd8 => 0x6949, 0xd9 => 0x6935, + 0xda => 0x696c, 0xdb => 0x6933, 0xdc => 0x693d, 0xdd => 0x6965, + 0xde => 0x68f0, 0xdf => 0x6978, 0xe0 => 0x6934, 0xe1 => 0x6969, + 0xe2 => 0x6940, 0xe3 => 0x696f, 0xe4 => 0x6944, 0xe5 => 0x6976, + 0xe6 => 0x6958, 0xe7 => 0x6941, 0xe8 => 0x6974, 0xe9 => 0x694c, + 0xea => 0x693b, 0xeb => 0x694b, 0xec => 0x6937, 0xed => 0x695c, + 0xee => 0x694f, 0xef => 0x6951, 0xf0 => 0x6932, 0xf1 => 0x6952, + 0xf2 => 0x692f, 0xf3 => 0x697b, 0xf4 => 0x693c, 0xf5 => 0x6b46, + 0xf6 => 0x6b45, 0xf7 => 0x6b43, 0xf8 => 0x6b42, 0xf9 => 0x6b48, + 0xfa => 0x6b41, 0xfb => 0x6b9b, 0xfc => 0xfa0d, 0xfd => 0x6bfb, + 0xfe => 0x6bfc, + }, + 0xde => { + 0x40 => 0x6bf9, 0x41 => 0x6bf7, 0x42 => 0x6bf8, 0x43 => 0x6e9b, + 0x44 => 0x6ed6, 0x45 => 0x6ec8, 0x46 => 0x6e8f, 0x47 => 0x6ec0, + 0x48 => 0x6e9f, 0x49 => 0x6e93, 0x4a => 0x6e94, 0x4b => 0x6ea0, + 0x4c => 0x6eb1, 0x4d => 0x6eb9, 0x4e => 0x6ec6, 0x4f => 0x6ed2, + 0x50 => 0x6ebd, 0x51 => 0x6ec1, 0x52 => 0x6e9e, 0x53 => 0x6ec9, + 0x54 => 0x6eb7, 0x55 => 0x6eb0, 0x56 => 0x6ecd, 0x57 => 0x6ea6, + 0x58 => 0x6ecf, 0x59 => 0x6eb2, 0x5a => 0x6ebe, 0x5b => 0x6ec3, + 0x5c => 0x6edc, 0x5d => 0x6ed8, 0x5e => 0x6e99, 0x5f => 0x6e92, + 0x60 => 0x6e8e, 0x61 => 0x6e8d, 0x62 => 0x6ea4, 0x63 => 0x6ea1, + 0x64 => 0x6ebf, 0x65 => 0x6eb3, 0x66 => 0x6ed0, 0x67 => 0x6eca, + 0x68 => 0x6e97, 0x69 => 0x6eae, 0x6a => 0x6ea3, 0x6b => 0x7147, + 0x6c => 0x7154, 0x6d => 0x7152, 0x6e => 0x7163, 0x6f => 0x7160, + 0x70 => 0x7141, 0x71 => 0x715d, 0x72 => 0x7162, 0x73 => 0x7172, + 0x74 => 0x7178, 0x75 => 0x716a, 0x76 => 0x7161, 0x77 => 0x7142, + 0x78 => 0x7158, 0x79 => 0x7143, 0x7a => 0x714b, 0x7b => 0x7170, + 0x7c => 0x715f, 0x7d => 0x7150, 0x7e => 0x7153, 0xa1 => 0x7144, + 0xa2 => 0x714d, 0xa3 => 0x715a, 0xa4 => 0x724f, 0xa5 => 0x728d, + 0xa6 => 0x728c, 0xa7 => 0x7291, 0xa8 => 0x7290, 0xa9 => 0x728e, + 0xaa => 0x733c, 0xab => 0x7342, 0xac => 0x733b, 0xad => 0x733a, + 0xae => 0x7340, 0xaf => 0x734a, 0xb0 => 0x7349, 0xb1 => 0x7444, + 0xb2 => 0x744a, 0xb3 => 0x744b, 0xb4 => 0x7452, 0xb5 => 0x7451, + 0xb6 => 0x7457, 0xb7 => 0x7440, 0xb8 => 0x744f, 0xb9 => 0x7450, + 0xba => 0x744e, 0xbb => 0x7442, 0xbc => 0x7446, 0xbd => 0x744d, + 0xbe => 0x7454, 0xbf => 0x74e1, 0xc0 => 0x74ff, 0xc1 => 0x74fe, + 0xc2 => 0x74fd, 0xc3 => 0x751d, 0xc4 => 0x7579, 0xc5 => 0x7577, + 0xc6 => 0x6983, 0xc7 => 0x75ef, 0xc8 => 0x760f, 0xc9 => 0x7603, + 0xca => 0x75f7, 0xcb => 0x75fe, 0xcc => 0x75fc, 0xcd => 0x75f9, + 0xce => 0x75f8, 0xcf => 0x7610, 0xd0 => 0x75fb, 0xd1 => 0x75f6, + 0xd2 => 0x75ed, 0xd3 => 0x75f5, 0xd4 => 0x75fd, 0xd5 => 0x7699, + 0xd6 => 0x76b5, 0xd7 => 0x76dd, 0xd8 => 0x7755, 0xd9 => 0x775f, + 0xda => 0x7760, 0xdb => 0x7752, 0xdc => 0x7756, 0xdd => 0x775a, + 0xde => 0x7769, 0xdf => 0x7767, 0xe0 => 0x7754, 0xe1 => 0x7759, + 0xe2 => 0x776d, 0xe3 => 0x77e0, 0xe4 => 0x7887, 0xe5 => 0x789a, + 0xe6 => 0x7894, 0xe7 => 0x788f, 0xe8 => 0x7884, 0xe9 => 0x7895, + 0xea => 0x7885, 0xeb => 0x7886, 0xec => 0x78a1, 0xed => 0x7883, + 0xee => 0x7879, 0xef => 0x7899, 0xf0 => 0x7880, 0xf1 => 0x7896, + 0xf2 => 0x787b, 0xf3 => 0x797c, 0xf4 => 0x7982, 0xf5 => 0x797d, + 0xf6 => 0x7979, 0xf7 => 0x7a11, 0xf8 => 0x7a18, 0xf9 => 0x7a19, + 0xfa => 0x7a12, 0xfb => 0x7a17, 0xfc => 0x7a15, 0xfd => 0x7a22, + 0xfe => 0x7a13, + }, + 0xdf => { + 0x40 => 0x7a1b, 0x41 => 0x7a10, 0x42 => 0x7aa3, 0x43 => 0x7aa2, + 0x44 => 0x7a9e, 0x45 => 0x7aeb, 0x46 => 0x7b66, 0x47 => 0x7b64, + 0x48 => 0x7b6d, 0x49 => 0x7b74, 0x4a => 0x7b69, 0x4b => 0x7b72, + 0x4c => 0x7b65, 0x4d => 0x7b73, 0x4e => 0x7b71, 0x4f => 0x7b70, + 0x50 => 0x7b61, 0x51 => 0x7b78, 0x52 => 0x7b76, 0x53 => 0x7b63, + 0x54 => 0x7cb2, 0x55 => 0x7cb4, 0x56 => 0x7caf, 0x57 => 0x7d88, + 0x58 => 0x7d86, 0x59 => 0x7d80, 0x5a => 0x7d8d, 0x5b => 0x7d7f, + 0x5c => 0x7d85, 0x5d => 0x7d7a, 0x5e => 0x7d8e, 0x5f => 0x7d7b, + 0x60 => 0x7d83, 0x61 => 0x7d7c, 0x62 => 0x7d8c, 0x63 => 0x7d94, + 0x64 => 0x7d84, 0x65 => 0x7d7d, 0x66 => 0x7d92, 0x67 => 0x7f6d, + 0x68 => 0x7f6b, 0x69 => 0x7f67, 0x6a => 0x7f68, 0x6b => 0x7f6c, + 0x6c => 0x7fa6, 0x6d => 0x7fa5, 0x6e => 0x7fa7, 0x6f => 0x7fdb, + 0x70 => 0x7fdc, 0x71 => 0x8021, 0x72 => 0x8164, 0x73 => 0x8160, + 0x74 => 0x8177, 0x75 => 0x815c, 0x76 => 0x8169, 0x77 => 0x815b, + 0x78 => 0x8162, 0x79 => 0x8172, 0x7a => 0x6721, 0x7b => 0x815e, + 0x7c => 0x8176, 0x7d => 0x8167, 0x7e => 0x816f, 0xa1 => 0x8144, + 0xa2 => 0x8161, 0xa3 => 0x821d, 0xa4 => 0x8249, 0xa5 => 0x8244, + 0xa6 => 0x8240, 0xa7 => 0x8242, 0xa8 => 0x8245, 0xa9 => 0x84f1, + 0xaa => 0x843f, 0xab => 0x8456, 0xac => 0x8476, 0xad => 0x8479, + 0xae => 0x848f, 0xaf => 0x848d, 0xb0 => 0x8465, 0xb1 => 0x8451, + 0xb2 => 0x8440, 0xb3 => 0x8486, 0xb4 => 0x8467, 0xb5 => 0x8430, + 0xb6 => 0x844d, 0xb7 => 0x847d, 0xb8 => 0x845a, 0xb9 => 0x8459, + 0xba => 0x8474, 0xbb => 0x8473, 0xbc => 0x845d, 0xbd => 0x8507, + 0xbe => 0x845e, 0xbf => 0x8437, 0xc0 => 0x843a, 0xc1 => 0x8434, + 0xc2 => 0x847a, 0xc3 => 0x8443, 0xc4 => 0x8478, 0xc5 => 0x8432, + 0xc6 => 0x8445, 0xc7 => 0x8429, 0xc8 => 0x83d9, 0xc9 => 0x844b, + 0xca => 0x842f, 0xcb => 0x8442, 0xcc => 0x842d, 0xcd => 0x845f, + 0xce => 0x8470, 0xcf => 0x8439, 0xd0 => 0x844e, 0xd1 => 0x844c, + 0xd2 => 0x8452, 0xd3 => 0x846f, 0xd4 => 0x84c5, 0xd5 => 0x848e, + 0xd6 => 0x843b, 0xd7 => 0x8447, 0xd8 => 0x8436, 0xd9 => 0x8433, + 0xda => 0x8468, 0xdb => 0x847e, 0xdc => 0x8444, 0xdd => 0x842b, + 0xde => 0x8460, 0xdf => 0x8454, 0xe0 => 0x846e, 0xe1 => 0x8450, + 0xe2 => 0x870b, 0xe3 => 0x8704, 0xe4 => 0x86f7, 0xe5 => 0x870c, + 0xe6 => 0x86fa, 0xe7 => 0x86d6, 0xe8 => 0x86f5, 0xe9 => 0x874d, + 0xea => 0x86f8, 0xeb => 0x870e, 0xec => 0x8709, 0xed => 0x8701, + 0xee => 0x86f6, 0xef => 0x870d, 0xf0 => 0x8705, 0xf1 => 0x88d6, + 0xf2 => 0x88cb, 0xf3 => 0x88cd, 0xf4 => 0x88ce, 0xf5 => 0x88de, + 0xf6 => 0x88db, 0xf7 => 0x88da, 0xf8 => 0x88cc, 0xf9 => 0x88d0, + 0xfa => 0x8985, 0xfb => 0x899b, 0xfc => 0x89df, 0xfd => 0x89e5, + 0xfe => 0x89e4, + }, + 0xe0 => { + 0x40 => 0x89e1, 0x41 => 0x89e0, 0x42 => 0x89e2, 0x43 => 0x89dc, + 0x44 => 0x89e6, 0x45 => 0x8a76, 0x46 => 0x8a86, 0x47 => 0x8a7f, + 0x48 => 0x8a61, 0x49 => 0x8a3f, 0x4a => 0x8a77, 0x4b => 0x8a82, + 0x4c => 0x8a84, 0x4d => 0x8a75, 0x4e => 0x8a83, 0x4f => 0x8a81, + 0x50 => 0x8a74, 0x51 => 0x8a7a, 0x52 => 0x8c3c, 0x53 => 0x8c4b, + 0x54 => 0x8c4a, 0x55 => 0x8c65, 0x56 => 0x8c64, 0x57 => 0x8c66, + 0x58 => 0x8c86, 0x59 => 0x8c84, 0x5a => 0x8c85, 0x5b => 0x8ccc, + 0x5c => 0x8d68, 0x5d => 0x8d69, 0x5e => 0x8d91, 0x5f => 0x8d8c, + 0x60 => 0x8d8e, 0x61 => 0x8d8f, 0x62 => 0x8d8d, 0x63 => 0x8d93, + 0x64 => 0x8d94, 0x65 => 0x8d90, 0x66 => 0x8d92, 0x67 => 0x8df0, + 0x68 => 0x8de0, 0x69 => 0x8dec, 0x6a => 0x8df1, 0x6b => 0x8dee, + 0x6c => 0x8dd0, 0x6d => 0x8de9, 0x6e => 0x8de3, 0x6f => 0x8de2, + 0x70 => 0x8de7, 0x71 => 0x8df2, 0x72 => 0x8deb, 0x73 => 0x8df4, + 0x74 => 0x8f06, 0x75 => 0x8eff, 0x76 => 0x8f01, 0x77 => 0x8f00, + 0x78 => 0x8f05, 0x79 => 0x8f07, 0x7a => 0x8f08, 0x7b => 0x8f02, + 0x7c => 0x8f0b, 0x7d => 0x9052, 0x7e => 0x903f, 0xa1 => 0x9044, + 0xa2 => 0x9049, 0xa3 => 0x903d, 0xa4 => 0x9110, 0xa5 => 0x910d, + 0xa6 => 0x910f, 0xa7 => 0x9111, 0xa8 => 0x9116, 0xa9 => 0x9114, + 0xaa => 0x910b, 0xab => 0x910e, 0xac => 0x916e, 0xad => 0x916f, + 0xae => 0x9248, 0xaf => 0x9252, 0xb0 => 0x9230, 0xb1 => 0x923a, + 0xb2 => 0x9266, 0xb3 => 0x9233, 0xb4 => 0x9265, 0xb5 => 0x925e, + 0xb6 => 0x9283, 0xb7 => 0x922e, 0xb8 => 0x924a, 0xb9 => 0x9246, + 0xba => 0x926d, 0xbb => 0x926c, 0xbc => 0x924f, 0xbd => 0x9260, + 0xbe => 0x9267, 0xbf => 0x926f, 0xc0 => 0x9236, 0xc1 => 0x9261, + 0xc2 => 0x9270, 0xc3 => 0x9231, 0xc4 => 0x9254, 0xc5 => 0x9263, + 0xc6 => 0x9250, 0xc7 => 0x9272, 0xc8 => 0x924e, 0xc9 => 0x9253, + 0xca => 0x924c, 0xcb => 0x9256, 0xcc => 0x9232, 0xcd => 0x959f, + 0xce => 0x959c, 0xcf => 0x959e, 0xd0 => 0x959b, 0xd1 => 0x9692, + 0xd2 => 0x9693, 0xd3 => 0x9691, 0xd4 => 0x9697, 0xd5 => 0x96ce, + 0xd6 => 0x96fa, 0xd7 => 0x96fd, 0xd8 => 0x96f8, 0xd9 => 0x96f5, + 0xda => 0x9773, 0xdb => 0x9777, 0xdc => 0x9778, 0xdd => 0x9772, + 0xde => 0x980f, 0xdf => 0x980d, 0xe0 => 0x980e, 0xe1 => 0x98ac, + 0xe2 => 0x98f6, 0xe3 => 0x98f9, 0xe4 => 0x99af, 0xe5 => 0x99b2, + 0xe6 => 0x99b0, 0xe7 => 0x99b5, 0xe8 => 0x9aad, 0xe9 => 0x9aab, + 0xea => 0x9b5b, 0xeb => 0x9cea, 0xec => 0x9ced, 0xed => 0x9ce7, + 0xee => 0x9e80, 0xef => 0x9efd, 0xf0 => 0x50e6, 0xf1 => 0x50d4, + 0xf2 => 0x50d7, 0xf3 => 0x50e8, 0xf4 => 0x50f3, 0xf5 => 0x50db, + 0xf6 => 0x50ea, 0xf7 => 0x50dd, 0xf8 => 0x50e4, 0xf9 => 0x50d3, + 0xfa => 0x50ec, 0xfb => 0x50f0, 0xfc => 0x50ef, 0xfd => 0x50e3, + 0xfe => 0x50e0, + }, + 0xe1 => { + 0x40 => 0x51d8, 0x41 => 0x5280, 0x42 => 0x5281, 0x43 => 0x52e9, + 0x44 => 0x52eb, 0x45 => 0x5330, 0x46 => 0x53ac, 0x47 => 0x5627, + 0x48 => 0x5615, 0x49 => 0x560c, 0x4a => 0x5612, 0x4b => 0x55fc, + 0x4c => 0x560f, 0x4d => 0x561c, 0x4e => 0x5601, 0x4f => 0x5613, + 0x50 => 0x5602, 0x51 => 0x55fa, 0x52 => 0x561d, 0x53 => 0x5604, + 0x54 => 0x55ff, 0x55 => 0x55f9, 0x56 => 0x5889, 0x57 => 0x587c, + 0x58 => 0x5890, 0x59 => 0x5898, 0x5a => 0x5886, 0x5b => 0x5881, + 0x5c => 0x587f, 0x5d => 0x5874, 0x5e => 0x588b, 0x5f => 0x587a, + 0x60 => 0x5887, 0x61 => 0x5891, 0x62 => 0x588e, 0x63 => 0x5876, + 0x64 => 0x5882, 0x65 => 0x5888, 0x66 => 0x587b, 0x67 => 0x5894, + 0x68 => 0x588f, 0x69 => 0x58fe, 0x6a => 0x596b, 0x6b => 0x5adc, + 0x6c => 0x5aee, 0x6d => 0x5ae5, 0x6e => 0x5ad5, 0x6f => 0x5aea, + 0x70 => 0x5ada, 0x71 => 0x5aed, 0x72 => 0x5aeb, 0x73 => 0x5af3, + 0x74 => 0x5ae2, 0x75 => 0x5ae0, 0x76 => 0x5adb, 0x77 => 0x5aec, + 0x78 => 0x5ade, 0x79 => 0x5add, 0x7a => 0x5ad9, 0x7b => 0x5ae8, + 0x7c => 0x5adf, 0x7d => 0x5b77, 0x7e => 0x5be0, 0xa1 => 0x5be3, + 0xa2 => 0x5c63, 0xa3 => 0x5d82, 0xa4 => 0x5d80, 0xa5 => 0x5d7d, + 0xa6 => 0x5d86, 0xa7 => 0x5d7a, 0xa8 => 0x5d81, 0xa9 => 0x5d77, + 0xaa => 0x5d8a, 0xab => 0x5d89, 0xac => 0x5d88, 0xad => 0x5d7e, + 0xae => 0x5d7c, 0xaf => 0x5d8d, 0xb0 => 0x5d79, 0xb1 => 0x5d7f, + 0xb2 => 0x5e58, 0xb3 => 0x5e59, 0xb4 => 0x5e53, 0xb5 => 0x5ed8, + 0xb6 => 0x5ed1, 0xb7 => 0x5ed7, 0xb8 => 0x5ece, 0xb9 => 0x5edc, + 0xba => 0x5ed5, 0xbb => 0x5ed9, 0xbc => 0x5ed2, 0xbd => 0x5ed4, + 0xbe => 0x5f44, 0xbf => 0x5f43, 0xc0 => 0x5f6f, 0xc1 => 0x5fb6, + 0xc2 => 0x612c, 0xc3 => 0x6128, 0xc4 => 0x6141, 0xc5 => 0x615e, + 0xc6 => 0x6171, 0xc7 => 0x6173, 0xc8 => 0x6152, 0xc9 => 0x6153, + 0xca => 0x6172, 0xcb => 0x616c, 0xcc => 0x6180, 0xcd => 0x6174, + 0xce => 0x6154, 0xcf => 0x617a, 0xd0 => 0x615b, 0xd1 => 0x6165, + 0xd2 => 0x613b, 0xd3 => 0x616a, 0xd4 => 0x6161, 0xd5 => 0x6156, + 0xd6 => 0x6229, 0xd7 => 0x6227, 0xd8 => 0x622b, 0xd9 => 0x642b, + 0xda => 0x644d, 0xdb => 0x645b, 0xdc => 0x645d, 0xdd => 0x6474, + 0xde => 0x6476, 0xdf => 0x6472, 0xe0 => 0x6473, 0xe1 => 0x647d, + 0xe2 => 0x6475, 0xe3 => 0x6466, 0xe4 => 0x64a6, 0xe5 => 0x644e, + 0xe6 => 0x6482, 0xe7 => 0x645e, 0xe8 => 0x645c, 0xe9 => 0x644b, + 0xea => 0x6453, 0xeb => 0x6460, 0xec => 0x6450, 0xed => 0x647f, + 0xee => 0x643f, 0xef => 0x646c, 0xf0 => 0x646b, 0xf1 => 0x6459, + 0xf2 => 0x6465, 0xf3 => 0x6477, 0xf4 => 0x6573, 0xf5 => 0x65a0, + 0xf6 => 0x66a1, 0xf7 => 0x66a0, 0xf8 => 0x669f, 0xf9 => 0x6705, + 0xfa => 0x6704, 0xfb => 0x6722, 0xfc => 0x69b1, 0xfd => 0x69b6, + 0xfe => 0x69c9, + }, + 0xe2 => { + 0x40 => 0x69a0, 0x41 => 0x69ce, 0x42 => 0x6996, 0x43 => 0x69b0, + 0x44 => 0x69ac, 0x45 => 0x69bc, 0x46 => 0x6991, 0x47 => 0x6999, + 0x48 => 0x698e, 0x49 => 0x69a7, 0x4a => 0x698d, 0x4b => 0x69a9, + 0x4c => 0x69be, 0x4d => 0x69af, 0x4e => 0x69bf, 0x4f => 0x69c4, + 0x50 => 0x69bd, 0x51 => 0x69a4, 0x52 => 0x69d4, 0x53 => 0x69b9, + 0x54 => 0x69ca, 0x55 => 0x699a, 0x56 => 0x69cf, 0x57 => 0x69b3, + 0x58 => 0x6993, 0x59 => 0x69aa, 0x5a => 0x69a1, 0x5b => 0x699e, + 0x5c => 0x69d9, 0x5d => 0x6997, 0x5e => 0x6990, 0x5f => 0x69c2, + 0x60 => 0x69b5, 0x61 => 0x69a5, 0x62 => 0x69c6, 0x63 => 0x6b4a, + 0x64 => 0x6b4d, 0x65 => 0x6b4b, 0x66 => 0x6b9e, 0x67 => 0x6b9f, + 0x68 => 0x6ba0, 0x69 => 0x6bc3, 0x6a => 0x6bc4, 0x6b => 0x6bfe, + 0x6c => 0x6ece, 0x6d => 0x6ef5, 0x6e => 0x6ef1, 0x6f => 0x6f03, + 0x70 => 0x6f25, 0x71 => 0x6ef8, 0x72 => 0x6f37, 0x73 => 0x6efb, + 0x74 => 0x6f2e, 0x75 => 0x6f09, 0x76 => 0x6f4e, 0x77 => 0x6f19, + 0x78 => 0x6f1a, 0x79 => 0x6f27, 0x7a => 0x6f18, 0x7b => 0x6f3b, + 0x7c => 0x6f12, 0x7d => 0x6eed, 0x7e => 0x6f0a, 0xa1 => 0x6f36, + 0xa2 => 0x6f73, 0xa3 => 0x6ef9, 0xa4 => 0x6eee, 0xa5 => 0x6f2d, + 0xa6 => 0x6f40, 0xa7 => 0x6f30, 0xa8 => 0x6f3c, 0xa9 => 0x6f35, + 0xaa => 0x6eeb, 0xab => 0x6f07, 0xac => 0x6f0e, 0xad => 0x6f43, + 0xae => 0x6f05, 0xaf => 0x6efd, 0xb0 => 0x6ef6, 0xb1 => 0x6f39, + 0xb2 => 0x6f1c, 0xb3 => 0x6efc, 0xb4 => 0x6f3a, 0xb5 => 0x6f1f, + 0xb6 => 0x6f0d, 0xb7 => 0x6f1e, 0xb8 => 0x6f08, 0xb9 => 0x6f21, + 0xba => 0x7187, 0xbb => 0x7190, 0xbc => 0x7189, 0xbd => 0x7180, + 0xbe => 0x7185, 0xbf => 0x7182, 0xc0 => 0x718f, 0xc1 => 0x717b, + 0xc2 => 0x7186, 0xc3 => 0x7181, 0xc4 => 0x7197, 0xc5 => 0x7244, + 0xc6 => 0x7253, 0xc7 => 0x7297, 0xc8 => 0x7295, 0xc9 => 0x7293, + 0xca => 0x7343, 0xcb => 0x734d, 0xcc => 0x7351, 0xcd => 0x734c, + 0xce => 0x7462, 0xcf => 0x7473, 0xd0 => 0x7471, 0xd1 => 0x7475, + 0xd2 => 0x7472, 0xd3 => 0x7467, 0xd4 => 0x746e, 0xd5 => 0x7500, + 0xd6 => 0x7502, 0xd7 => 0x7503, 0xd8 => 0x757d, 0xd9 => 0x7590, + 0xda => 0x7616, 0xdb => 0x7608, 0xdc => 0x760c, 0xdd => 0x7615, + 0xde => 0x7611, 0xdf => 0x760a, 0xe0 => 0x7614, 0xe1 => 0x76b8, + 0xe2 => 0x7781, 0xe3 => 0x777c, 0xe4 => 0x7785, 0xe5 => 0x7782, + 0xe6 => 0x776e, 0xe7 => 0x7780, 0xe8 => 0x776f, 0xe9 => 0x777e, + 0xea => 0x7783, 0xeb => 0x78b2, 0xec => 0x78aa, 0xed => 0x78b4, + 0xee => 0x78ad, 0xef => 0x78a8, 0xf0 => 0x787e, 0xf1 => 0x78ab, + 0xf2 => 0x789e, 0xf3 => 0x78a5, 0xf4 => 0x78a0, 0xf5 => 0x78ac, + 0xf6 => 0x78a2, 0xf7 => 0x78a4, 0xf8 => 0x7998, 0xf9 => 0x798a, + 0xfa => 0x798b, 0xfb => 0x7996, 0xfc => 0x7995, 0xfd => 0x7994, + 0xfe => 0x7993, + }, + 0xe3 => { + 0x40 => 0x7997, 0x41 => 0x7988, 0x42 => 0x7992, 0x43 => 0x7990, + 0x44 => 0x7a2b, 0x45 => 0x7a4a, 0x46 => 0x7a30, 0x47 => 0x7a2f, + 0x48 => 0x7a28, 0x49 => 0x7a26, 0x4a => 0x7aa8, 0x4b => 0x7aab, + 0x4c => 0x7aac, 0x4d => 0x7aee, 0x4e => 0x7b88, 0x4f => 0x7b9c, + 0x50 => 0x7b8a, 0x51 => 0x7b91, 0x52 => 0x7b90, 0x53 => 0x7b96, + 0x54 => 0x7b8d, 0x55 => 0x7b8c, 0x56 => 0x7b9b, 0x57 => 0x7b8e, + 0x58 => 0x7b85, 0x59 => 0x7b98, 0x5a => 0x5284, 0x5b => 0x7b99, + 0x5c => 0x7ba4, 0x5d => 0x7b82, 0x5e => 0x7cbb, 0x5f => 0x7cbf, + 0x60 => 0x7cbc, 0x61 => 0x7cba, 0x62 => 0x7da7, 0x63 => 0x7db7, + 0x64 => 0x7dc2, 0x65 => 0x7da3, 0x66 => 0x7daa, 0x67 => 0x7dc1, + 0x68 => 0x7dc0, 0x69 => 0x7dc5, 0x6a => 0x7d9d, 0x6b => 0x7dce, + 0x6c => 0x7dc4, 0x6d => 0x7dc6, 0x6e => 0x7dcb, 0x6f => 0x7dcc, + 0x70 => 0x7daf, 0x71 => 0x7db9, 0x72 => 0x7d96, 0x73 => 0x7dbc, + 0x74 => 0x7d9f, 0x75 => 0x7da6, 0x76 => 0x7dae, 0x77 => 0x7da9, + 0x78 => 0x7da1, 0x79 => 0x7dc9, 0x7a => 0x7f73, 0x7b => 0x7fe2, + 0x7c => 0x7fe3, 0x7d => 0x7fe5, 0x7e => 0x7fde, 0xa1 => 0x8024, + 0xa2 => 0x805d, 0xa3 => 0x805c, 0xa4 => 0x8189, 0xa5 => 0x8186, + 0xa6 => 0x8183, 0xa7 => 0x8187, 0xa8 => 0x818d, 0xa9 => 0x818c, + 0xaa => 0x818b, 0xab => 0x8215, 0xac => 0x8497, 0xad => 0x84a4, + 0xae => 0x84a1, 0xaf => 0x849f, 0xb0 => 0x84ba, 0xb1 => 0x84ce, + 0xb2 => 0x84c2, 0xb3 => 0x84ac, 0xb4 => 0x84ae, 0xb5 => 0x84ab, + 0xb6 => 0x84b9, 0xb7 => 0x84b4, 0xb8 => 0x84c1, 0xb9 => 0x84cd, + 0xba => 0x84aa, 0xbb => 0x849a, 0xbc => 0x84b1, 0xbd => 0x84d0, + 0xbe => 0x849d, 0xbf => 0x84a7, 0xc0 => 0x84bb, 0xc1 => 0x84a2, + 0xc2 => 0x8494, 0xc3 => 0x84c7, 0xc4 => 0x84cc, 0xc5 => 0x849b, + 0xc6 => 0x84a9, 0xc7 => 0x84af, 0xc8 => 0x84a8, 0xc9 => 0x84d6, + 0xca => 0x8498, 0xcb => 0x84b6, 0xcc => 0x84cf, 0xcd => 0x84a0, + 0xce => 0x84d7, 0xcf => 0x84d4, 0xd0 => 0x84d2, 0xd1 => 0x84db, + 0xd2 => 0x84b0, 0xd3 => 0x8491, 0xd4 => 0x8661, 0xd5 => 0x8733, + 0xd6 => 0x8723, 0xd7 => 0x8728, 0xd8 => 0x876b, 0xd9 => 0x8740, + 0xda => 0x872e, 0xdb => 0x871e, 0xdc => 0x8721, 0xdd => 0x8719, + 0xde => 0x871b, 0xdf => 0x8743, 0xe0 => 0x872c, 0xe1 => 0x8741, + 0xe2 => 0x873e, 0xe3 => 0x8746, 0xe4 => 0x8720, 0xe5 => 0x8732, + 0xe6 => 0x872a, 0xe7 => 0x872d, 0xe8 => 0x873c, 0xe9 => 0x8712, + 0xea => 0x873a, 0xeb => 0x8731, 0xec => 0x8735, 0xed => 0x8742, + 0xee => 0x8726, 0xef => 0x8727, 0xf0 => 0x8738, 0xf1 => 0x8724, + 0xf2 => 0x871a, 0xf3 => 0x8730, 0xf4 => 0x8711, 0xf5 => 0x88f7, + 0xf6 => 0x88e7, 0xf7 => 0x88f1, 0xf8 => 0x88f2, 0xf9 => 0x88fa, + 0xfa => 0x88fe, 0xfb => 0x88ee, 0xfc => 0x88fc, 0xfd => 0x88f6, + 0xfe => 0x88fb, + }, + 0xe4 => { + 0x40 => 0x88f0, 0x41 => 0x88ec, 0x42 => 0x88eb, 0x43 => 0x899d, + 0x44 => 0x89a1, 0x45 => 0x899f, 0x46 => 0x899e, 0x47 => 0x89e9, + 0x48 => 0x89eb, 0x49 => 0x89e8, 0x4a => 0x8aab, 0x4b => 0x8a99, + 0x4c => 0x8a8b, 0x4d => 0x8a92, 0x4e => 0x8a8f, 0x4f => 0x8a96, + 0x50 => 0x8c3d, 0x51 => 0x8c68, 0x52 => 0x8c69, 0x53 => 0x8cd5, + 0x54 => 0x8ccf, 0x55 => 0x8cd7, 0x56 => 0x8d96, 0x57 => 0x8e09, + 0x58 => 0x8e02, 0x59 => 0x8dff, 0x5a => 0x8e0d, 0x5b => 0x8dfd, + 0x5c => 0x8e0a, 0x5d => 0x8e03, 0x5e => 0x8e07, 0x5f => 0x8e06, + 0x60 => 0x8e05, 0x61 => 0x8dfe, 0x62 => 0x8e00, 0x63 => 0x8e04, + 0x64 => 0x8f10, 0x65 => 0x8f11, 0x66 => 0x8f0e, 0x67 => 0x8f0d, + 0x68 => 0x9123, 0x69 => 0x911c, 0x6a => 0x9120, 0x6b => 0x9122, + 0x6c => 0x911f, 0x6d => 0x911d, 0x6e => 0x911a, 0x6f => 0x9124, + 0x70 => 0x9121, 0x71 => 0x911b, 0x72 => 0x917a, 0x73 => 0x9172, + 0x74 => 0x9179, 0x75 => 0x9173, 0x76 => 0x92a5, 0x77 => 0x92a4, + 0x78 => 0x9276, 0x79 => 0x929b, 0x7a => 0x927a, 0x7b => 0x92a0, + 0x7c => 0x9294, 0x7d => 0x92aa, 0x7e => 0x928d, 0xa1 => 0x92a6, + 0xa2 => 0x929a, 0xa3 => 0x92ab, 0xa4 => 0x9279, 0xa5 => 0x9297, + 0xa6 => 0x927f, 0xa7 => 0x92a3, 0xa8 => 0x92ee, 0xa9 => 0x928e, + 0xaa => 0x9282, 0xab => 0x9295, 0xac => 0x92a2, 0xad => 0x927d, + 0xae => 0x9288, 0xaf => 0x92a1, 0xb0 => 0x928a, 0xb1 => 0x9286, + 0xb2 => 0x928c, 0xb3 => 0x9299, 0xb4 => 0x92a7, 0xb5 => 0x927e, + 0xb6 => 0x9287, 0xb7 => 0x92a9, 0xb8 => 0x929d, 0xb9 => 0x928b, + 0xba => 0x922d, 0xbb => 0x969e, 0xbc => 0x96a1, 0xbd => 0x96ff, + 0xbe => 0x9758, 0xbf => 0x977d, 0xc0 => 0x977a, 0xc1 => 0x977e, + 0xc2 => 0x9783, 0xc3 => 0x9780, 0xc4 => 0x9782, 0xc5 => 0x977b, + 0xc6 => 0x9784, 0xc7 => 0x9781, 0xc8 => 0x977f, 0xc9 => 0x97ce, + 0xca => 0x97cd, 0xcb => 0x9816, 0xcc => 0x98ad, 0xcd => 0x98ae, + 0xce => 0x9902, 0xcf => 0x9900, 0xd0 => 0x9907, 0xd1 => 0x999d, + 0xd2 => 0x999c, 0xd3 => 0x99c3, 0xd4 => 0x99b9, 0xd5 => 0x99bb, + 0xd6 => 0x99ba, 0xd7 => 0x99c2, 0xd8 => 0x99bd, 0xd9 => 0x99c7, + 0xda => 0x9ab1, 0xdb => 0x9ae3, 0xdc => 0x9ae7, 0xdd => 0x9b3e, + 0xde => 0x9b3f, 0xdf => 0x9b60, 0xe0 => 0x9b61, 0xe1 => 0x9b5f, + 0xe2 => 0x9cf1, 0xe3 => 0x9cf2, 0xe4 => 0x9cf5, 0xe5 => 0x9ea7, + 0xe6 => 0x50ff, 0xe7 => 0x5103, 0xe8 => 0x5130, 0xe9 => 0x50f8, + 0xea => 0x5106, 0xeb => 0x5107, 0xec => 0x50f6, 0xed => 0x50fe, + 0xee => 0x510b, 0xef => 0x510c, 0xf0 => 0x50fd, 0xf1 => 0x510a, + 0xf2 => 0x528b, 0xf3 => 0x528c, 0xf4 => 0x52f1, 0xf5 => 0x52ef, + 0xf6 => 0x5648, 0xf7 => 0x5642, 0xf8 => 0x564c, 0xf9 => 0x5635, + 0xfa => 0x5641, 0xfb => 0x564a, 0xfc => 0x5649, 0xfd => 0x5646, + 0xfe => 0x5658, + }, + 0xe5 => { + 0x40 => 0x565a, 0x41 => 0x5640, 0x42 => 0x5633, 0x43 => 0x563d, + 0x44 => 0x562c, 0x45 => 0x563e, 0x46 => 0x5638, 0x47 => 0x562a, + 0x48 => 0x563a, 0x49 => 0x571a, 0x4a => 0x58ab, 0x4b => 0x589d, + 0x4c => 0x58b1, 0x4d => 0x58a0, 0x4e => 0x58a3, 0x4f => 0x58af, + 0x50 => 0x58ac, 0x51 => 0x58a5, 0x52 => 0x58a1, 0x53 => 0x58ff, + 0x54 => 0x5aff, 0x55 => 0x5af4, 0x56 => 0x5afd, 0x57 => 0x5af7, + 0x58 => 0x5af6, 0x59 => 0x5b03, 0x5a => 0x5af8, 0x5b => 0x5b02, + 0x5c => 0x5af9, 0x5d => 0x5b01, 0x5e => 0x5b07, 0x5f => 0x5b05, + 0x60 => 0x5b0f, 0x61 => 0x5c67, 0x62 => 0x5d99, 0x63 => 0x5d97, + 0x64 => 0x5d9f, 0x65 => 0x5d92, 0x66 => 0x5da2, 0x67 => 0x5d93, + 0x68 => 0x5d95, 0x69 => 0x5da0, 0x6a => 0x5d9c, 0x6b => 0x5da1, + 0x6c => 0x5d9a, 0x6d => 0x5d9e, 0x6e => 0x5e69, 0x6f => 0x5e5d, + 0x70 => 0x5e60, 0x71 => 0x5e5c, 0x72 => 0x7df3, 0x73 => 0x5edb, + 0x74 => 0x5ede, 0x75 => 0x5ee1, 0x76 => 0x5f49, 0x77 => 0x5fb2, + 0x78 => 0x618b, 0x79 => 0x6183, 0x7a => 0x6179, 0x7b => 0x61b1, + 0x7c => 0x61b0, 0x7d => 0x61a2, 0x7e => 0x6189, 0xa1 => 0x619b, + 0xa2 => 0x6193, 0xa3 => 0x61af, 0xa4 => 0x61ad, 0xa5 => 0x619f, + 0xa6 => 0x6192, 0xa7 => 0x61aa, 0xa8 => 0x61a1, 0xa9 => 0x618d, + 0xaa => 0x6166, 0xab => 0x61b3, 0xac => 0x622d, 0xad => 0x646e, + 0xae => 0x6470, 0xaf => 0x6496, 0xb0 => 0x64a0, 0xb1 => 0x6485, + 0xb2 => 0x6497, 0xb3 => 0x649c, 0xb4 => 0x648f, 0xb5 => 0x648b, + 0xb6 => 0x648a, 0xb7 => 0x648c, 0xb8 => 0x64a3, 0xb9 => 0x649f, + 0xba => 0x6468, 0xbb => 0x64b1, 0xbc => 0x6498, 0xbd => 0x6576, + 0xbe => 0x657a, 0xbf => 0x6579, 0xc0 => 0x657b, 0xc1 => 0x65b2, + 0xc2 => 0x65b3, 0xc3 => 0x66b5, 0xc4 => 0x66b0, 0xc5 => 0x66a9, + 0xc6 => 0x66b2, 0xc7 => 0x66b7, 0xc8 => 0x66aa, 0xc9 => 0x66af, + 0xca => 0x6a00, 0xcb => 0x6a06, 0xcc => 0x6a17, 0xcd => 0x69e5, + 0xce => 0x69f8, 0xcf => 0x6a15, 0xd0 => 0x69f1, 0xd1 => 0x69e4, + 0xd2 => 0x6a20, 0xd3 => 0x69ff, 0xd4 => 0x69ec, 0xd5 => 0x69e2, + 0xd6 => 0x6a1b, 0xd7 => 0x6a1d, 0xd8 => 0x69fe, 0xd9 => 0x6a27, + 0xda => 0x69f2, 0xdb => 0x69ee, 0xdc => 0x6a14, 0xdd => 0x69f7, + 0xde => 0x69e7, 0xdf => 0x6a40, 0xe0 => 0x6a08, 0xe1 => 0x69e6, + 0xe2 => 0x69fb, 0xe3 => 0x6a0d, 0xe4 => 0x69fc, 0xe5 => 0x69eb, + 0xe6 => 0x6a09, 0xe7 => 0x6a04, 0xe8 => 0x6a18, 0xe9 => 0x6a25, + 0xea => 0x6a0f, 0xeb => 0x69f6, 0xec => 0x6a26, 0xed => 0x6a07, + 0xee => 0x69f4, 0xef => 0x6a16, 0xf0 => 0x6b51, 0xf1 => 0x6ba5, + 0xf2 => 0x6ba3, 0xf3 => 0x6ba2, 0xf4 => 0x6ba6, 0xf5 => 0x6c01, + 0xf6 => 0x6c00, 0xf7 => 0x6bff, 0xf8 => 0x6c02, 0xf9 => 0x6f41, + 0xfa => 0x6f26, 0xfb => 0x6f7e, 0xfc => 0x6f87, 0xfd => 0x6fc6, + 0xfe => 0x6f92, + }, + 0xe6 => { + 0x40 => 0x6f8d, 0x41 => 0x6f89, 0x42 => 0x6f8c, 0x43 => 0x6f62, + 0x44 => 0x6f4f, 0x45 => 0x6f85, 0x46 => 0x6f5a, 0x47 => 0x6f96, + 0x48 => 0x6f76, 0x49 => 0x6f6c, 0x4a => 0x6f82, 0x4b => 0x6f55, + 0x4c => 0x6f72, 0x4d => 0x6f52, 0x4e => 0x6f50, 0x4f => 0x6f57, + 0x50 => 0x6f94, 0x51 => 0x6f93, 0x52 => 0x6f5d, 0x53 => 0x6f00, + 0x54 => 0x6f61, 0x55 => 0x6f6b, 0x56 => 0x6f7d, 0x57 => 0x6f67, + 0x58 => 0x6f90, 0x59 => 0x6f53, 0x5a => 0x6f8b, 0x5b => 0x6f69, + 0x5c => 0x6f7f, 0x5d => 0x6f95, 0x5e => 0x6f63, 0x5f => 0x6f77, + 0x60 => 0x6f6a, 0x61 => 0x6f7b, 0x62 => 0x71b2, 0x63 => 0x71af, + 0x64 => 0x719b, 0x65 => 0x71b0, 0x66 => 0x71a0, 0x67 => 0x719a, + 0x68 => 0x71a9, 0x69 => 0x71b5, 0x6a => 0x719d, 0x6b => 0x71a5, + 0x6c => 0x719e, 0x6d => 0x71a4, 0x6e => 0x71a1, 0x6f => 0x71aa, + 0x70 => 0x719c, 0x71 => 0x71a7, 0x72 => 0x71b3, 0x73 => 0x7298, + 0x74 => 0x729a, 0x75 => 0x7358, 0x76 => 0x7352, 0x77 => 0x735e, + 0x78 => 0x735f, 0x79 => 0x7360, 0x7a => 0x735d, 0x7b => 0x735b, + 0x7c => 0x7361, 0x7d => 0x735a, 0x7e => 0x7359, 0xa1 => 0x7362, + 0xa2 => 0x7487, 0xa3 => 0x7489, 0xa4 => 0x748a, 0xa5 => 0x7486, + 0xa6 => 0x7481, 0xa7 => 0x747d, 0xa8 => 0x7485, 0xa9 => 0x7488, + 0xaa => 0x747c, 0xab => 0x7479, 0xac => 0x7508, 0xad => 0x7507, + 0xae => 0x757e, 0xaf => 0x7625, 0xb0 => 0x761e, 0xb1 => 0x7619, + 0xb2 => 0x761d, 0xb3 => 0x761c, 0xb4 => 0x7623, 0xb5 => 0x761a, + 0xb6 => 0x7628, 0xb7 => 0x761b, 0xb8 => 0x769c, 0xb9 => 0x769d, + 0xba => 0x769e, 0xbb => 0x769b, 0xbc => 0x778d, 0xbd => 0x778f, + 0xbe => 0x7789, 0xbf => 0x7788, 0xc0 => 0x78cd, 0xc1 => 0x78bb, + 0xc2 => 0x78cf, 0xc3 => 0x78cc, 0xc4 => 0x78d1, 0xc5 => 0x78ce, + 0xc6 => 0x78d4, 0xc7 => 0x78c8, 0xc8 => 0x78c3, 0xc9 => 0x78c4, + 0xca => 0x78c9, 0xcb => 0x799a, 0xcc => 0x79a1, 0xcd => 0x79a0, + 0xce => 0x799c, 0xcf => 0x79a2, 0xd0 => 0x799b, 0xd1 => 0x6b76, + 0xd2 => 0x7a39, 0xd3 => 0x7ab2, 0xd4 => 0x7ab4, 0xd5 => 0x7ab3, + 0xd6 => 0x7bb7, 0xd7 => 0x7bcb, 0xd8 => 0x7bbe, 0xd9 => 0x7bac, + 0xda => 0x7bce, 0xdb => 0x7baf, 0xdc => 0x7bb9, 0xdd => 0x7bca, + 0xde => 0x7bb5, 0xdf => 0x7cc5, 0xe0 => 0x7cc8, 0xe1 => 0x7ccc, + 0xe2 => 0x7ccb, 0xe3 => 0x7df7, 0xe4 => 0x7ddb, 0xe5 => 0x7dea, + 0xe6 => 0x7de7, 0xe7 => 0x7dd7, 0xe8 => 0x7de1, 0xe9 => 0x7e03, + 0xea => 0x7dfa, 0xeb => 0x7de6, 0xec => 0x7df6, 0xed => 0x7df1, + 0xee => 0x7df0, 0xef => 0x7dee, 0xf0 => 0x7ddf, 0xf1 => 0x7f76, + 0xf2 => 0x7fac, 0xf3 => 0x7fb0, 0xf4 => 0x7fad, 0xf5 => 0x7fed, + 0xf6 => 0x7feb, 0xf7 => 0x7fea, 0xf8 => 0x7fec, 0xf9 => 0x7fe6, + 0xfa => 0x7fe8, 0xfb => 0x8064, 0xfc => 0x8067, 0xfd => 0x81a3, + 0xfe => 0x819f, + }, + 0xe7 => { + 0x40 => 0x819e, 0x41 => 0x8195, 0x42 => 0x81a2, 0x43 => 0x8199, + 0x44 => 0x8197, 0x45 => 0x8216, 0x46 => 0x824f, 0x47 => 0x8253, + 0x48 => 0x8252, 0x49 => 0x8250, 0x4a => 0x824e, 0x4b => 0x8251, + 0x4c => 0x8524, 0x4d => 0x853b, 0x4e => 0x850f, 0x4f => 0x8500, + 0x50 => 0x8529, 0x51 => 0x850e, 0x52 => 0x8509, 0x53 => 0x850d, + 0x54 => 0x851f, 0x55 => 0x850a, 0x56 => 0x8527, 0x57 => 0x851c, + 0x58 => 0x84fb, 0x59 => 0x852b, 0x5a => 0x84fa, 0x5b => 0x8508, + 0x5c => 0x850c, 0x5d => 0x84f4, 0x5e => 0x852a, 0x5f => 0x84f2, + 0x60 => 0x8515, 0x61 => 0x84f7, 0x62 => 0x84eb, 0x63 => 0x84f3, + 0x64 => 0x84fc, 0x65 => 0x8512, 0x66 => 0x84ea, 0x67 => 0x84e9, + 0x68 => 0x8516, 0x69 => 0x84fe, 0x6a => 0x8528, 0x6b => 0x851d, + 0x6c => 0x852e, 0x6d => 0x8502, 0x6e => 0x84fd, 0x6f => 0x851e, + 0x70 => 0x84f6, 0x71 => 0x8531, 0x72 => 0x8526, 0x73 => 0x84e7, + 0x74 => 0x84e8, 0x75 => 0x84f0, 0x76 => 0x84ef, 0x77 => 0x84f9, + 0x78 => 0x8518, 0x79 => 0x8520, 0x7a => 0x8530, 0x7b => 0x850b, + 0x7c => 0x8519, 0x7d => 0x852f, 0x7e => 0x8662, 0xa1 => 0x8756, + 0xa2 => 0x8763, 0xa3 => 0x8764, 0xa4 => 0x8777, 0xa5 => 0x87e1, + 0xa6 => 0x8773, 0xa7 => 0x8758, 0xa8 => 0x8754, 0xa9 => 0x875b, + 0xaa => 0x8752, 0xab => 0x8761, 0xac => 0x875a, 0xad => 0x8751, + 0xae => 0x875e, 0xaf => 0x876d, 0xb0 => 0x876a, 0xb1 => 0x8750, + 0xb2 => 0x874e, 0xb3 => 0x875f, 0xb4 => 0x875d, 0xb5 => 0x876f, + 0xb6 => 0x876c, 0xb7 => 0x877a, 0xb8 => 0x876e, 0xb9 => 0x875c, + 0xba => 0x8765, 0xbb => 0x874f, 0xbc => 0x877b, 0xbd => 0x8775, + 0xbe => 0x8762, 0xbf => 0x8767, 0xc0 => 0x8769, 0xc1 => 0x885a, + 0xc2 => 0x8905, 0xc3 => 0x890c, 0xc4 => 0x8914, 0xc5 => 0x890b, + 0xc6 => 0x8917, 0xc7 => 0x8918, 0xc8 => 0x8919, 0xc9 => 0x8906, + 0xca => 0x8916, 0xcb => 0x8911, 0xcc => 0x890e, 0xcd => 0x8909, + 0xce => 0x89a2, 0xcf => 0x89a4, 0xd0 => 0x89a3, 0xd1 => 0x89ed, + 0xd2 => 0x89f0, 0xd3 => 0x89ec, 0xd4 => 0x8acf, 0xd5 => 0x8ac6, + 0xd6 => 0x8ab8, 0xd7 => 0x8ad3, 0xd8 => 0x8ad1, 0xd9 => 0x8ad4, + 0xda => 0x8ad5, 0xdb => 0x8abb, 0xdc => 0x8ad7, 0xdd => 0x8abe, + 0xde => 0x8ac0, 0xdf => 0x8ac5, 0xe0 => 0x8ad8, 0xe1 => 0x8ac3, + 0xe2 => 0x8aba, 0xe3 => 0x8abd, 0xe4 => 0x8ad9, 0xe5 => 0x8c3e, + 0xe6 => 0x8c4d, 0xe7 => 0x8c8f, 0xe8 => 0x8ce5, 0xe9 => 0x8cdf, + 0xea => 0x8cd9, 0xeb => 0x8ce8, 0xec => 0x8cda, 0xed => 0x8cdd, + 0xee => 0x8ce7, 0xef => 0x8da0, 0xf0 => 0x8d9c, 0xf1 => 0x8da1, + 0xf2 => 0x8d9b, 0xf3 => 0x8e20, 0xf4 => 0x8e23, 0xf5 => 0x8e25, + 0xf6 => 0x8e24, 0xf7 => 0x8e2e, 0xf8 => 0x8e15, 0xf9 => 0x8e1b, + 0xfa => 0x8e16, 0xfb => 0x8e11, 0xfc => 0x8e19, 0xfd => 0x8e26, + 0xfe => 0x8e27, + }, + 0xe8 => { + 0x40 => 0x8e14, 0x41 => 0x8e12, 0x42 => 0x8e18, 0x43 => 0x8e13, + 0x44 => 0x8e1c, 0x45 => 0x8e17, 0x46 => 0x8e1a, 0x47 => 0x8f2c, + 0x48 => 0x8f24, 0x49 => 0x8f18, 0x4a => 0x8f1a, 0x4b => 0x8f20, + 0x4c => 0x8f23, 0x4d => 0x8f16, 0x4e => 0x8f17, 0x4f => 0x9073, + 0x50 => 0x9070, 0x51 => 0x906f, 0x52 => 0x9067, 0x53 => 0x906b, + 0x54 => 0x912f, 0x55 => 0x912b, 0x56 => 0x9129, 0x57 => 0x912a, + 0x58 => 0x9132, 0x59 => 0x9126, 0x5a => 0x912e, 0x5b => 0x9185, + 0x5c => 0x9186, 0x5d => 0x918a, 0x5e => 0x9181, 0x5f => 0x9182, + 0x60 => 0x9184, 0x61 => 0x9180, 0x62 => 0x92d0, 0x63 => 0x92c3, + 0x64 => 0x92c4, 0x65 => 0x92c0, 0x66 => 0x92d9, 0x67 => 0x92b6, + 0x68 => 0x92cf, 0x69 => 0x92f1, 0x6a => 0x92df, 0x6b => 0x92d8, + 0x6c => 0x92e9, 0x6d => 0x92d7, 0x6e => 0x92dd, 0x6f => 0x92cc, + 0x70 => 0x92ef, 0x71 => 0x92c2, 0x72 => 0x92e8, 0x73 => 0x92ca, + 0x74 => 0x92c8, 0x75 => 0x92ce, 0x76 => 0x92e6, 0x77 => 0x92cd, + 0x78 => 0x92d5, 0x79 => 0x92c9, 0x7a => 0x92e0, 0x7b => 0x92de, + 0x7c => 0x92e7, 0x7d => 0x92d1, 0x7e => 0x92d3, 0xa1 => 0x92b5, + 0xa2 => 0x92e1, 0xa3 => 0x92c6, 0xa4 => 0x92b4, 0xa5 => 0x957c, + 0xa6 => 0x95ac, 0xa7 => 0x95ab, 0xa8 => 0x95ae, 0xa9 => 0x95b0, + 0xaa => 0x96a4, 0xab => 0x96a2, 0xac => 0x96d3, 0xad => 0x9705, + 0xae => 0x9708, 0xaf => 0x9702, 0xb0 => 0x975a, 0xb1 => 0x978a, + 0xb2 => 0x978e, 0xb3 => 0x9788, 0xb4 => 0x97d0, 0xb5 => 0x97cf, + 0xb6 => 0x981e, 0xb7 => 0x981d, 0xb8 => 0x9826, 0xb9 => 0x9829, + 0xba => 0x9828, 0xbb => 0x9820, 0xbc => 0x981b, 0xbd => 0x9827, + 0xbe => 0x98b2, 0xbf => 0x9908, 0xc0 => 0x98fa, 0xc1 => 0x9911, + 0xc2 => 0x9914, 0xc3 => 0x9916, 0xc4 => 0x9917, 0xc5 => 0x9915, + 0xc6 => 0x99dc, 0xc7 => 0x99cd, 0xc8 => 0x99cf, 0xc9 => 0x99d3, + 0xca => 0x99d4, 0xcb => 0x99ce, 0xcc => 0x99c9, 0xcd => 0x99d6, + 0xce => 0x99d8, 0xcf => 0x99cb, 0xd0 => 0x99d7, 0xd1 => 0x99cc, + 0xd2 => 0x9ab3, 0xd3 => 0x9aec, 0xd4 => 0x9aeb, 0xd5 => 0x9af3, + 0xd6 => 0x9af2, 0xd7 => 0x9af1, 0xd8 => 0x9b46, 0xd9 => 0x9b43, + 0xda => 0x9b67, 0xdb => 0x9b74, 0xdc => 0x9b71, 0xdd => 0x9b66, + 0xde => 0x9b76, 0xdf => 0x9b75, 0xe0 => 0x9b70, 0xe1 => 0x9b68, + 0xe2 => 0x9b64, 0xe3 => 0x9b6c, 0xe4 => 0x9cfc, 0xe5 => 0x9cfa, + 0xe6 => 0x9cfd, 0xe7 => 0x9cff, 0xe8 => 0x9cf7, 0xe9 => 0x9d07, + 0xea => 0x9d00, 0xeb => 0x9cf9, 0xec => 0x9cfb, 0xed => 0x9d08, + 0xee => 0x9d05, 0xef => 0x9d04, 0xf0 => 0x9e83, 0xf1 => 0x9ed3, + 0xf2 => 0x9f0f, 0xf3 => 0x9f10, 0xf4 => 0x511c, 0xf5 => 0x5113, + 0xf6 => 0x5117, 0xf7 => 0x511a, 0xf8 => 0x5111, 0xf9 => 0x51de, + 0xfa => 0x5334, 0xfb => 0x53e1, 0xfc => 0x5670, 0xfd => 0x5660, + 0xfe => 0x566e, + }, + 0xe9 => { + 0x40 => 0x5673, 0x41 => 0x5666, 0x42 => 0x5663, 0x43 => 0x566d, + 0x44 => 0x5672, 0x45 => 0x565e, 0x46 => 0x5677, 0x47 => 0x571c, + 0x48 => 0x571b, 0x49 => 0x58c8, 0x4a => 0x58bd, 0x4b => 0x58c9, + 0x4c => 0x58bf, 0x4d => 0x58ba, 0x4e => 0x58c2, 0x4f => 0x58bc, + 0x50 => 0x58c6, 0x51 => 0x5b17, 0x52 => 0x5b19, 0x53 => 0x5b1b, + 0x54 => 0x5b21, 0x55 => 0x5b14, 0x56 => 0x5b13, 0x57 => 0x5b10, + 0x58 => 0x5b16, 0x59 => 0x5b28, 0x5a => 0x5b1a, 0x5b => 0x5b20, + 0x5c => 0x5b1e, 0x5d => 0x5bef, 0x5e => 0x5dac, 0x5f => 0x5db1, + 0x60 => 0x5da9, 0x61 => 0x5da7, 0x62 => 0x5db5, 0x63 => 0x5db0, + 0x64 => 0x5dae, 0x65 => 0x5daa, 0x66 => 0x5da8, 0x67 => 0x5db2, + 0x68 => 0x5dad, 0x69 => 0x5daf, 0x6a => 0x5db4, 0x6b => 0x5e67, + 0x6c => 0x5e68, 0x6d => 0x5e66, 0x6e => 0x5e6f, 0x6f => 0x5ee9, + 0x70 => 0x5ee7, 0x71 => 0x5ee6, 0x72 => 0x5ee8, 0x73 => 0x5ee5, + 0x74 => 0x5f4b, 0x75 => 0x5fbc, 0x76 => 0x619d, 0x77 => 0x61a8, + 0x78 => 0x6196, 0x79 => 0x61c5, 0x7a => 0x61b4, 0x7b => 0x61c6, + 0x7c => 0x61c1, 0x7d => 0x61cc, 0x7e => 0x61ba, 0xa1 => 0x61bf, + 0xa2 => 0x61b8, 0xa3 => 0x618c, 0xa4 => 0x64d7, 0xa5 => 0x64d6, + 0xa6 => 0x64d0, 0xa7 => 0x64cf, 0xa8 => 0x64c9, 0xa9 => 0x64bd, + 0xaa => 0x6489, 0xab => 0x64c3, 0xac => 0x64db, 0xad => 0x64f3, + 0xae => 0x64d9, 0xaf => 0x6533, 0xb0 => 0x657f, 0xb1 => 0x657c, + 0xb2 => 0x65a2, 0xb3 => 0x66c8, 0xb4 => 0x66be, 0xb5 => 0x66c0, + 0xb6 => 0x66ca, 0xb7 => 0x66cb, 0xb8 => 0x66cf, 0xb9 => 0x66bd, + 0xba => 0x66bb, 0xbb => 0x66ba, 0xbc => 0x66cc, 0xbd => 0x6723, + 0xbe => 0x6a34, 0xbf => 0x6a66, 0xc0 => 0x6a49, 0xc1 => 0x6a67, + 0xc2 => 0x6a32, 0xc3 => 0x6a68, 0xc4 => 0x6a3e, 0xc5 => 0x6a5d, + 0xc6 => 0x6a6d, 0xc7 => 0x6a76, 0xc8 => 0x6a5b, 0xc9 => 0x6a51, + 0xca => 0x6a28, 0xcb => 0x6a5a, 0xcc => 0x6a3b, 0xcd => 0x6a3f, + 0xce => 0x6a41, 0xcf => 0x6a6a, 0xd0 => 0x6a64, 0xd1 => 0x6a50, + 0xd2 => 0x6a4f, 0xd3 => 0x6a54, 0xd4 => 0x6a6f, 0xd5 => 0x6a69, + 0xd6 => 0x6a60, 0xd7 => 0x6a3c, 0xd8 => 0x6a5e, 0xd9 => 0x6a56, + 0xda => 0x6a55, 0xdb => 0x6a4d, 0xdc => 0x6a4e, 0xdd => 0x6a46, + 0xde => 0x6b55, 0xdf => 0x6b54, 0xe0 => 0x6b56, 0xe1 => 0x6ba7, + 0xe2 => 0x6baa, 0xe3 => 0x6bab, 0xe4 => 0x6bc8, 0xe5 => 0x6bc7, + 0xe6 => 0x6c04, 0xe7 => 0x6c03, 0xe8 => 0x6c06, 0xe9 => 0x6fad, + 0xea => 0x6fcb, 0xeb => 0x6fa3, 0xec => 0x6fc7, 0xed => 0x6fbc, + 0xee => 0x6fce, 0xef => 0x6fc8, 0xf0 => 0x6f5e, 0xf1 => 0x6fc4, + 0xf2 => 0x6fbd, 0xf3 => 0x6f9e, 0xf4 => 0x6fca, 0xf5 => 0x6fa8, + 0xf6 => 0x7004, 0xf7 => 0x6fa5, 0xf8 => 0x6fae, 0xf9 => 0x6fba, + 0xfa => 0x6fac, 0xfb => 0x6faa, 0xfc => 0x6fcf, 0xfd => 0x6fbf, + 0xfe => 0x6fb8, + }, + 0xea => { + 0x40 => 0x6fa2, 0x41 => 0x6fc9, 0x42 => 0x6fab, 0x43 => 0x6fcd, + 0x44 => 0x6faf, 0x45 => 0x6fb2, 0x46 => 0x6fb0, 0x47 => 0x71c5, + 0x48 => 0x71c2, 0x49 => 0x71bf, 0x4a => 0x71b8, 0x4b => 0x71d6, + 0x4c => 0x71c0, 0x4d => 0x71c1, 0x4e => 0x71cb, 0x4f => 0x71d4, + 0x50 => 0x71ca, 0x51 => 0x71c7, 0x52 => 0x71cf, 0x53 => 0x71bd, + 0x54 => 0x71d8, 0x55 => 0x71bc, 0x56 => 0x71c6, 0x57 => 0x71da, + 0x58 => 0x71db, 0x59 => 0x729d, 0x5a => 0x729e, 0x5b => 0x7369, + 0x5c => 0x7366, 0x5d => 0x7367, 0x5e => 0x736c, 0x5f => 0x7365, + 0x60 => 0x736b, 0x61 => 0x736a, 0x62 => 0x747f, 0x63 => 0x749a, + 0x64 => 0x74a0, 0x65 => 0x7494, 0x66 => 0x7492, 0x67 => 0x7495, + 0x68 => 0x74a1, 0x69 => 0x750b, 0x6a => 0x7580, 0x6b => 0x762f, + 0x6c => 0x762d, 0x6d => 0x7631, 0x6e => 0x763d, 0x6f => 0x7633, + 0x70 => 0x763c, 0x71 => 0x7635, 0x72 => 0x7632, 0x73 => 0x7630, + 0x74 => 0x76bb, 0x75 => 0x76e6, 0x76 => 0x779a, 0x77 => 0x779d, + 0x78 => 0x77a1, 0x79 => 0x779c, 0x7a => 0x779b, 0x7b => 0x77a2, + 0x7c => 0x77a3, 0x7d => 0x7795, 0x7e => 0x7799, 0xa1 => 0x7797, + 0xa2 => 0x78dd, 0xa3 => 0x78e9, 0xa4 => 0x78e5, 0xa5 => 0x78ea, + 0xa6 => 0x78de, 0xa7 => 0x78e3, 0xa8 => 0x78db, 0xa9 => 0x78e1, + 0xaa => 0x78e2, 0xab => 0x78ed, 0xac => 0x78df, 0xad => 0x78e0, + 0xae => 0x79a4, 0xaf => 0x7a44, 0xb0 => 0x7a48, 0xb1 => 0x7a47, + 0xb2 => 0x7ab6, 0xb3 => 0x7ab8, 0xb4 => 0x7ab5, 0xb5 => 0x7ab1, + 0xb6 => 0x7ab7, 0xb7 => 0x7bde, 0xb8 => 0x7be3, 0xb9 => 0x7be7, + 0xba => 0x7bdd, 0xbb => 0x7bd5, 0xbc => 0x7be5, 0xbd => 0x7bda, + 0xbe => 0x7be8, 0xbf => 0x7bf9, 0xc0 => 0x7bd4, 0xc1 => 0x7bea, + 0xc2 => 0x7be2, 0xc3 => 0x7bdc, 0xc4 => 0x7beb, 0xc5 => 0x7bd8, + 0xc6 => 0x7bdf, 0xc7 => 0x7cd2, 0xc8 => 0x7cd4, 0xc9 => 0x7cd7, + 0xca => 0x7cd0, 0xcb => 0x7cd1, 0xcc => 0x7e12, 0xcd => 0x7e21, + 0xce => 0x7e17, 0xcf => 0x7e0c, 0xd0 => 0x7e1f, 0xd1 => 0x7e20, + 0xd2 => 0x7e13, 0xd3 => 0x7e0e, 0xd4 => 0x7e1c, 0xd5 => 0x7e15, + 0xd6 => 0x7e1a, 0xd7 => 0x7e22, 0xd8 => 0x7e0b, 0xd9 => 0x7e0f, + 0xda => 0x7e16, 0xdb => 0x7e0d, 0xdc => 0x7e14, 0xdd => 0x7e25, + 0xde => 0x7e24, 0xdf => 0x7f43, 0xe0 => 0x7f7b, 0xe1 => 0x7f7c, + 0xe2 => 0x7f7a, 0xe3 => 0x7fb1, 0xe4 => 0x7fef, 0xe5 => 0x802a, + 0xe6 => 0x8029, 0xe7 => 0x806c, 0xe8 => 0x81b1, 0xe9 => 0x81a6, + 0xea => 0x81ae, 0xeb => 0x81b9, 0xec => 0x81b5, 0xed => 0x81ab, + 0xee => 0x81b0, 0xef => 0x81ac, 0xf0 => 0x81b4, 0xf1 => 0x81b2, + 0xf2 => 0x81b7, 0xf3 => 0x81a7, 0xf4 => 0x81f2, 0xf5 => 0x8255, + 0xf6 => 0x8256, 0xf7 => 0x8257, 0xf8 => 0x8556, 0xf9 => 0x8545, + 0xfa => 0x856b, 0xfb => 0x854d, 0xfc => 0x8553, 0xfd => 0x8561, + 0xfe => 0x8558, + }, + 0xeb => { + 0x40 => 0x8540, 0x41 => 0x8546, 0x42 => 0x8564, 0x43 => 0x8541, + 0x44 => 0x8562, 0x45 => 0x8544, 0x46 => 0x8551, 0x47 => 0x8547, + 0x48 => 0x8563, 0x49 => 0x853e, 0x4a => 0x855b, 0x4b => 0x8571, + 0x4c => 0x854e, 0x4d => 0x856e, 0x4e => 0x8575, 0x4f => 0x8555, + 0x50 => 0x8567, 0x51 => 0x8560, 0x52 => 0x858c, 0x53 => 0x8566, + 0x54 => 0x855d, 0x55 => 0x8554, 0x56 => 0x8565, 0x57 => 0x856c, + 0x58 => 0x8663, 0x59 => 0x8665, 0x5a => 0x8664, 0x5b => 0x879b, + 0x5c => 0x878f, 0x5d => 0x8797, 0x5e => 0x8793, 0x5f => 0x8792, + 0x60 => 0x8788, 0x61 => 0x8781, 0x62 => 0x8796, 0x63 => 0x8798, + 0x64 => 0x8779, 0x65 => 0x8787, 0x66 => 0x87a3, 0x67 => 0x8785, + 0x68 => 0x8790, 0x69 => 0x8791, 0x6a => 0x879d, 0x6b => 0x8784, + 0x6c => 0x8794, 0x6d => 0x879c, 0x6e => 0x879a, 0x6f => 0x8789, + 0x70 => 0x891e, 0x71 => 0x8926, 0x72 => 0x8930, 0x73 => 0x892d, + 0x74 => 0x892e, 0x75 => 0x8927, 0x76 => 0x8931, 0x77 => 0x8922, + 0x78 => 0x8929, 0x79 => 0x8923, 0x7a => 0x892f, 0x7b => 0x892c, + 0x7c => 0x891f, 0x7d => 0x89f1, 0x7e => 0x8ae0, 0xa1 => 0x8ae2, + 0xa2 => 0x8af2, 0xa3 => 0x8af4, 0xa4 => 0x8af5, 0xa5 => 0x8add, + 0xa6 => 0x8b14, 0xa7 => 0x8ae4, 0xa8 => 0x8adf, 0xa9 => 0x8af0, + 0xaa => 0x8ac8, 0xab => 0x8ade, 0xac => 0x8ae1, 0xad => 0x8ae8, + 0xae => 0x8aff, 0xaf => 0x8aef, 0xb0 => 0x8afb, 0xb1 => 0x8c91, + 0xb2 => 0x8c92, 0xb3 => 0x8c90, 0xb4 => 0x8cf5, 0xb5 => 0x8cee, + 0xb6 => 0x8cf1, 0xb7 => 0x8cf0, 0xb8 => 0x8cf3, 0xb9 => 0x8d6c, + 0xba => 0x8d6e, 0xbb => 0x8da5, 0xbc => 0x8da7, 0xbd => 0x8e33, + 0xbe => 0x8e3e, 0xbf => 0x8e38, 0xc0 => 0x8e40, 0xc1 => 0x8e45, + 0xc2 => 0x8e36, 0xc3 => 0x8e3c, 0xc4 => 0x8e3d, 0xc5 => 0x8e41, + 0xc6 => 0x8e30, 0xc7 => 0x8e3f, 0xc8 => 0x8ebd, 0xc9 => 0x8f36, + 0xca => 0x8f2e, 0xcb => 0x8f35, 0xcc => 0x8f32, 0xcd => 0x8f39, + 0xce => 0x8f37, 0xcf => 0x8f34, 0xd0 => 0x9076, 0xd1 => 0x9079, + 0xd2 => 0x907b, 0xd3 => 0x9086, 0xd4 => 0x90fa, 0xd5 => 0x9133, + 0xd6 => 0x9135, 0xd7 => 0x9136, 0xd8 => 0x9193, 0xd9 => 0x9190, + 0xda => 0x9191, 0xdb => 0x918d, 0xdc => 0x918f, 0xdd => 0x9327, + 0xde => 0x931e, 0xdf => 0x9308, 0xe0 => 0x931f, 0xe1 => 0x9306, + 0xe2 => 0x930f, 0xe3 => 0x937a, 0xe4 => 0x9338, 0xe5 => 0x933c, + 0xe6 => 0x931b, 0xe7 => 0x9323, 0xe8 => 0x9312, 0xe9 => 0x9301, + 0xea => 0x9346, 0xeb => 0x932d, 0xec => 0x930e, 0xed => 0x930d, + 0xee => 0x92cb, 0xef => 0x931d, 0xf0 => 0x92fa, 0xf1 => 0x9325, + 0xf2 => 0x9313, 0xf3 => 0x92f9, 0xf4 => 0x92f7, 0xf5 => 0x9334, + 0xf6 => 0x9302, 0xf7 => 0x9324, 0xf8 => 0x92ff, 0xf9 => 0x9329, + 0xfa => 0x9339, 0xfb => 0x9335, 0xfc => 0x932a, 0xfd => 0x9314, + 0xfe => 0x930c, + }, + 0xec => { + 0x40 => 0x930b, 0x41 => 0x92fe, 0x42 => 0x9309, 0x43 => 0x9300, + 0x44 => 0x92fb, 0x45 => 0x9316, 0x46 => 0x95bc, 0x47 => 0x95cd, + 0x48 => 0x95be, 0x49 => 0x95b9, 0x4a => 0x95ba, 0x4b => 0x95b6, + 0x4c => 0x95bf, 0x4d => 0x95b5, 0x4e => 0x95bd, 0x4f => 0x96a9, + 0x50 => 0x96d4, 0x51 => 0x970b, 0x52 => 0x9712, 0x53 => 0x9710, + 0x54 => 0x9799, 0x55 => 0x9797, 0x56 => 0x9794, 0x57 => 0x97f0, + 0x58 => 0x97f8, 0x59 => 0x9835, 0x5a => 0x982f, 0x5b => 0x9832, + 0x5c => 0x9924, 0x5d => 0x991f, 0x5e => 0x9927, 0x5f => 0x9929, + 0x60 => 0x999e, 0x61 => 0x99ee, 0x62 => 0x99ec, 0x63 => 0x99e5, + 0x64 => 0x99e4, 0x65 => 0x99f0, 0x66 => 0x99e3, 0x67 => 0x99ea, + 0x68 => 0x99e9, 0x69 => 0x99e7, 0x6a => 0x9ab9, 0x6b => 0x9abf, + 0x6c => 0x9ab4, 0x6d => 0x9abb, 0x6e => 0x9af6, 0x6f => 0x9afa, + 0x70 => 0x9af9, 0x71 => 0x9af7, 0x72 => 0x9b33, 0x73 => 0x9b80, + 0x74 => 0x9b85, 0x75 => 0x9b87, 0x76 => 0x9b7c, 0x77 => 0x9b7e, + 0x78 => 0x9b7b, 0x79 => 0x9b82, 0x7a => 0x9b93, 0x7b => 0x9b92, + 0x7c => 0x9b90, 0x7d => 0x9b7a, 0x7e => 0x9b95, 0xa1 => 0x9b7d, + 0xa2 => 0x9b88, 0xa3 => 0x9d25, 0xa4 => 0x9d17, 0xa5 => 0x9d20, + 0xa6 => 0x9d1e, 0xa7 => 0x9d14, 0xa8 => 0x9d29, 0xa9 => 0x9d1d, + 0xaa => 0x9d18, 0xab => 0x9d22, 0xac => 0x9d10, 0xad => 0x9d19, + 0xae => 0x9d1f, 0xaf => 0x9e88, 0xb0 => 0x9e86, 0xb1 => 0x9e87, + 0xb2 => 0x9eae, 0xb3 => 0x9ead, 0xb4 => 0x9ed5, 0xb5 => 0x9ed6, + 0xb6 => 0x9efa, 0xb7 => 0x9f12, 0xb8 => 0x9f3d, 0xb9 => 0x5126, + 0xba => 0x5125, 0xbb => 0x5122, 0xbc => 0x5124, 0xbd => 0x5120, + 0xbe => 0x5129, 0xbf => 0x52f4, 0xc0 => 0x5693, 0xc1 => 0x568c, + 0xc2 => 0x568d, 0xc3 => 0x5686, 0xc4 => 0x5684, 0xc5 => 0x5683, + 0xc6 => 0x567e, 0xc7 => 0x5682, 0xc8 => 0x567f, 0xc9 => 0x5681, + 0xca => 0x58d6, 0xcb => 0x58d4, 0xcc => 0x58cf, 0xcd => 0x58d2, + 0xce => 0x5b2d, 0xcf => 0x5b25, 0xd0 => 0x5b32, 0xd1 => 0x5b23, + 0xd2 => 0x5b2c, 0xd3 => 0x5b27, 0xd4 => 0x5b26, 0xd5 => 0x5b2f, + 0xd6 => 0x5b2e, 0xd7 => 0x5b7b, 0xd8 => 0x5bf1, 0xd9 => 0x5bf2, + 0xda => 0x5db7, 0xdb => 0x5e6c, 0xdc => 0x5e6a, 0xdd => 0x5fbe, + 0xde => 0x5fbb, 0xdf => 0x61c3, 0xe0 => 0x61b5, 0xe1 => 0x61bc, + 0xe2 => 0x61e7, 0xe3 => 0x61e0, 0xe4 => 0x61e5, 0xe5 => 0x61e4, + 0xe6 => 0x61e8, 0xe7 => 0x61de, 0xe8 => 0x64ef, 0xe9 => 0x64e9, + 0xea => 0x64e3, 0xeb => 0x64eb, 0xec => 0x64e4, 0xed => 0x64e8, + 0xee => 0x6581, 0xef => 0x6580, 0xf0 => 0x65b6, 0xf1 => 0x65da, + 0xf2 => 0x66d2, 0xf3 => 0x6a8d, 0xf4 => 0x6a96, 0xf5 => 0x6a81, + 0xf6 => 0x6aa5, 0xf7 => 0x6a89, 0xf8 => 0x6a9f, 0xf9 => 0x6a9b, + 0xfa => 0x6aa1, 0xfb => 0x6a9e, 0xfc => 0x6a87, 0xfd => 0x6a93, + 0xfe => 0x6a8e, + }, + 0xed => { + 0x40 => 0x6a95, 0x41 => 0x6a83, 0x42 => 0x6aa8, 0x43 => 0x6aa4, + 0x44 => 0x6a91, 0x45 => 0x6a7f, 0x46 => 0x6aa6, 0x47 => 0x6a9a, + 0x48 => 0x6a85, 0x49 => 0x6a8c, 0x4a => 0x6a92, 0x4b => 0x6b5b, + 0x4c => 0x6bad, 0x4d => 0x6c09, 0x4e => 0x6fcc, 0x4f => 0x6fa9, + 0x50 => 0x6ff4, 0x51 => 0x6fd4, 0x52 => 0x6fe3, 0x53 => 0x6fdc, + 0x54 => 0x6fed, 0x55 => 0x6fe7, 0x56 => 0x6fe6, 0x57 => 0x6fde, + 0x58 => 0x6ff2, 0x59 => 0x6fdd, 0x5a => 0x6fe2, 0x5b => 0x6fe8, + 0x5c => 0x71e1, 0x5d => 0x71f1, 0x5e => 0x71e8, 0x5f => 0x71f2, + 0x60 => 0x71e4, 0x61 => 0x71f0, 0x62 => 0x71e2, 0x63 => 0x7373, + 0x64 => 0x736e, 0x65 => 0x736f, 0x66 => 0x7497, 0x67 => 0x74b2, + 0x68 => 0x74ab, 0x69 => 0x7490, 0x6a => 0x74aa, 0x6b => 0x74ad, + 0x6c => 0x74b1, 0x6d => 0x74a5, 0x6e => 0x74af, 0x6f => 0x7510, + 0x70 => 0x7511, 0x71 => 0x7512, 0x72 => 0x750f, 0x73 => 0x7584, + 0x74 => 0x7643, 0x75 => 0x7648, 0x76 => 0x7649, 0x77 => 0x7647, + 0x78 => 0x76a4, 0x79 => 0x76e9, 0x7a => 0x77b5, 0x7b => 0x77ab, + 0x7c => 0x77b2, 0x7d => 0x77b7, 0x7e => 0x77b6, 0xa1 => 0x77b4, + 0xa2 => 0x77b1, 0xa3 => 0x77a8, 0xa4 => 0x77f0, 0xa5 => 0x78f3, + 0xa6 => 0x78fd, 0xa7 => 0x7902, 0xa8 => 0x78fb, 0xa9 => 0x78fc, + 0xaa => 0x78f2, 0xab => 0x7905, 0xac => 0x78f9, 0xad => 0x78fe, + 0xae => 0x7904, 0xaf => 0x79ab, 0xb0 => 0x79a8, 0xb1 => 0x7a5c, + 0xb2 => 0x7a5b, 0xb3 => 0x7a56, 0xb4 => 0x7a58, 0xb5 => 0x7a54, + 0xb6 => 0x7a5a, 0xb7 => 0x7abe, 0xb8 => 0x7ac0, 0xb9 => 0x7ac1, + 0xba => 0x7c05, 0xbb => 0x7c0f, 0xbc => 0x7bf2, 0xbd => 0x7c00, + 0xbe => 0x7bff, 0xbf => 0x7bfb, 0xc0 => 0x7c0e, 0xc1 => 0x7bf4, + 0xc2 => 0x7c0b, 0xc3 => 0x7bf3, 0xc4 => 0x7c02, 0xc5 => 0x7c09, + 0xc6 => 0x7c03, 0xc7 => 0x7c01, 0xc8 => 0x7bf8, 0xc9 => 0x7bfd, + 0xca => 0x7c06, 0xcb => 0x7bf0, 0xcc => 0x7bf1, 0xcd => 0x7c10, + 0xce => 0x7c0a, 0xcf => 0x7ce8, 0xd0 => 0x7e2d, 0xd1 => 0x7e3c, + 0xd2 => 0x7e42, 0xd3 => 0x7e33, 0xd4 => 0x9848, 0xd5 => 0x7e38, + 0xd6 => 0x7e2a, 0xd7 => 0x7e49, 0xd8 => 0x7e40, 0xd9 => 0x7e47, + 0xda => 0x7e29, 0xdb => 0x7e4c, 0xdc => 0x7e30, 0xdd => 0x7e3b, + 0xde => 0x7e36, 0xdf => 0x7e44, 0xe0 => 0x7e3a, 0xe1 => 0x7f45, + 0xe2 => 0x7f7f, 0xe3 => 0x7f7e, 0xe4 => 0x7f7d, 0xe5 => 0x7ff4, + 0xe6 => 0x7ff2, 0xe7 => 0x802c, 0xe8 => 0x81bb, 0xe9 => 0x81c4, + 0xea => 0x81cc, 0xeb => 0x81ca, 0xec => 0x81c5, 0xed => 0x81c7, + 0xee => 0x81bc, 0xef => 0x81e9, 0xf0 => 0x825b, 0xf1 => 0x825a, + 0xf2 => 0x825c, 0xf3 => 0x8583, 0xf4 => 0x8580, 0xf5 => 0x858f, + 0xf6 => 0x85a7, 0xf7 => 0x8595, 0xf8 => 0x85a0, 0xf9 => 0x858b, + 0xfa => 0x85a3, 0xfb => 0x857b, 0xfc => 0x85a4, 0xfd => 0x859a, + 0xfe => 0x859e, + }, + 0xee => { + 0x40 => 0x8577, 0x41 => 0x857c, 0x42 => 0x8589, 0x43 => 0x85a1, + 0x44 => 0x857a, 0x45 => 0x8578, 0x46 => 0x8557, 0x47 => 0x858e, + 0x48 => 0x8596, 0x49 => 0x8586, 0x4a => 0x858d, 0x4b => 0x8599, + 0x4c => 0x859d, 0x4d => 0x8581, 0x4e => 0x85a2, 0x4f => 0x8582, + 0x50 => 0x8588, 0x51 => 0x8585, 0x52 => 0x8579, 0x53 => 0x8576, + 0x54 => 0x8598, 0x55 => 0x8590, 0x56 => 0x859f, 0x57 => 0x8668, + 0x58 => 0x87be, 0x59 => 0x87aa, 0x5a => 0x87ad, 0x5b => 0x87c5, + 0x5c => 0x87b0, 0x5d => 0x87ac, 0x5e => 0x87b9, 0x5f => 0x87b5, + 0x60 => 0x87bc, 0x61 => 0x87ae, 0x62 => 0x87c9, 0x63 => 0x87c3, + 0x64 => 0x87c2, 0x65 => 0x87cc, 0x66 => 0x87b7, 0x67 => 0x87af, + 0x68 => 0x87c4, 0x69 => 0x87ca, 0x6a => 0x87b4, 0x6b => 0x87b6, + 0x6c => 0x87bf, 0x6d => 0x87b8, 0x6e => 0x87bd, 0x6f => 0x87de, + 0x70 => 0x87b2, 0x71 => 0x8935, 0x72 => 0x8933, 0x73 => 0x893c, + 0x74 => 0x893e, 0x75 => 0x8941, 0x76 => 0x8952, 0x77 => 0x8937, + 0x78 => 0x8942, 0x79 => 0x89ad, 0x7a => 0x89af, 0x7b => 0x89ae, + 0x7c => 0x89f2, 0x7d => 0x89f3, 0x7e => 0x8b1e, 0xa1 => 0x8b18, + 0xa2 => 0x8b16, 0xa3 => 0x8b11, 0xa4 => 0x8b05, 0xa5 => 0x8b0b, + 0xa6 => 0x8b22, 0xa7 => 0x8b0f, 0xa8 => 0x8b12, 0xa9 => 0x8b15, + 0xaa => 0x8b07, 0xab => 0x8b0d, 0xac => 0x8b08, 0xad => 0x8b06, + 0xae => 0x8b1c, 0xaf => 0x8b13, 0xb0 => 0x8b1a, 0xb1 => 0x8c4f, + 0xb2 => 0x8c70, 0xb3 => 0x8c72, 0xb4 => 0x8c71, 0xb5 => 0x8c6f, + 0xb6 => 0x8c95, 0xb7 => 0x8c94, 0xb8 => 0x8cf9, 0xb9 => 0x8d6f, + 0xba => 0x8e4e, 0xbb => 0x8e4d, 0xbc => 0x8e53, 0xbd => 0x8e50, + 0xbe => 0x8e4c, 0xbf => 0x8e47, 0xc0 => 0x8f43, 0xc1 => 0x8f40, + 0xc2 => 0x9085, 0xc3 => 0x907e, 0xc4 => 0x9138, 0xc5 => 0x919a, + 0xc6 => 0x91a2, 0xc7 => 0x919b, 0xc8 => 0x9199, 0xc9 => 0x919f, + 0xca => 0x91a1, 0xcb => 0x919d, 0xcc => 0x91a0, 0xcd => 0x93a1, + 0xce => 0x9383, 0xcf => 0x93af, 0xd0 => 0x9364, 0xd1 => 0x9356, + 0xd2 => 0x9347, 0xd3 => 0x937c, 0xd4 => 0x9358, 0xd5 => 0x935c, + 0xd6 => 0x9376, 0xd7 => 0x9349, 0xd8 => 0x9350, 0xd9 => 0x9351, + 0xda => 0x9360, 0xdb => 0x936d, 0xdc => 0x938f, 0xdd => 0x934c, + 0xde => 0x936a, 0xdf => 0x9379, 0xe0 => 0x9357, 0xe1 => 0x9355, + 0xe2 => 0x9352, 0xe3 => 0x934f, 0xe4 => 0x9371, 0xe5 => 0x9377, + 0xe6 => 0x937b, 0xe7 => 0x9361, 0xe8 => 0x935e, 0xe9 => 0x9363, + 0xea => 0x9367, 0xeb => 0x9380, 0xec => 0x934e, 0xed => 0x9359, + 0xee => 0x95c7, 0xef => 0x95c0, 0xf0 => 0x95c9, 0xf1 => 0x95c3, + 0xf2 => 0x95c5, 0xf3 => 0x95b7, 0xf4 => 0x96ae, 0xf5 => 0x96b0, + 0xf6 => 0x96ac, 0xf7 => 0x9720, 0xf8 => 0x971f, 0xf9 => 0x9718, + 0xfa => 0x971d, 0xfb => 0x9719, 0xfc => 0x979a, 0xfd => 0x97a1, + 0xfe => 0x979c, + }, + 0xef => { + 0x40 => 0x979e, 0x41 => 0x979d, 0x42 => 0x97d5, 0x43 => 0x97d4, + 0x44 => 0x97f1, 0x45 => 0x9841, 0x46 => 0x9844, 0x47 => 0x984a, + 0x48 => 0x9849, 0x49 => 0x9845, 0x4a => 0x9843, 0x4b => 0x9925, + 0x4c => 0x992b, 0x4d => 0x992c, 0x4e => 0x992a, 0x4f => 0x9933, + 0x50 => 0x9932, 0x51 => 0x992f, 0x52 => 0x992d, 0x53 => 0x9931, + 0x54 => 0x9930, 0x55 => 0x9998, 0x56 => 0x99a3, 0x57 => 0x99a1, + 0x58 => 0x9a02, 0x59 => 0x99fa, 0x5a => 0x99f4, 0x5b => 0x99f7, + 0x5c => 0x99f9, 0x5d => 0x99f8, 0x5e => 0x99f6, 0x5f => 0x99fb, + 0x60 => 0x99fd, 0x61 => 0x99fe, 0x62 => 0x99fc, 0x63 => 0x9a03, + 0x64 => 0x9abe, 0x65 => 0x9afe, 0x66 => 0x9afd, 0x67 => 0x9b01, + 0x68 => 0x9afc, 0x69 => 0x9b48, 0x6a => 0x9b9a, 0x6b => 0x9ba8, + 0x6c => 0x9b9e, 0x6d => 0x9b9b, 0x6e => 0x9ba6, 0x6f => 0x9ba1, + 0x70 => 0x9ba5, 0x71 => 0x9ba4, 0x72 => 0x9b86, 0x73 => 0x9ba2, + 0x74 => 0x9ba0, 0x75 => 0x9baf, 0x76 => 0x9d33, 0x77 => 0x9d41, + 0x78 => 0x9d67, 0x79 => 0x9d36, 0x7a => 0x9d2e, 0x7b => 0x9d2f, + 0x7c => 0x9d31, 0x7d => 0x9d38, 0x7e => 0x9d30, 0xa1 => 0x9d45, + 0xa2 => 0x9d42, 0xa3 => 0x9d43, 0xa4 => 0x9d3e, 0xa5 => 0x9d37, + 0xa6 => 0x9d40, 0xa7 => 0x9d3d, 0xa8 => 0x7ff5, 0xa9 => 0x9d2d, + 0xaa => 0x9e8a, 0xab => 0x9e89, 0xac => 0x9e8d, 0xad => 0x9eb0, + 0xae => 0x9ec8, 0xaf => 0x9eda, 0xb0 => 0x9efb, 0xb1 => 0x9eff, + 0xb2 => 0x9f24, 0xb3 => 0x9f23, 0xb4 => 0x9f22, 0xb5 => 0x9f54, + 0xb6 => 0x9fa0, 0xb7 => 0x5131, 0xb8 => 0x512d, 0xb9 => 0x512e, + 0xba => 0x5698, 0xbb => 0x569c, 0xbc => 0x5697, 0xbd => 0x569a, + 0xbe => 0x569d, 0xbf => 0x5699, 0xc0 => 0x5970, 0xc1 => 0x5b3c, + 0xc2 => 0x5c69, 0xc3 => 0x5c6a, 0xc4 => 0x5dc0, 0xc5 => 0x5e6d, + 0xc6 => 0x5e6e, 0xc7 => 0x61d8, 0xc8 => 0x61df, 0xc9 => 0x61ed, + 0xca => 0x61ee, 0xcb => 0x61f1, 0xcc => 0x61ea, 0xcd => 0x61f0, + 0xce => 0x61eb, 0xcf => 0x61d6, 0xd0 => 0x61e9, 0xd1 => 0x64ff, + 0xd2 => 0x6504, 0xd3 => 0x64fd, 0xd4 => 0x64f8, 0xd5 => 0x6501, + 0xd6 => 0x6503, 0xd7 => 0x64fc, 0xd8 => 0x6594, 0xd9 => 0x65db, + 0xda => 0x66da, 0xdb => 0x66db, 0xdc => 0x66d8, 0xdd => 0x6ac5, + 0xde => 0x6ab9, 0xdf => 0x6abd, 0xe0 => 0x6ae1, 0xe1 => 0x6ac6, + 0xe2 => 0x6aba, 0xe3 => 0x6ab6, 0xe4 => 0x6ab7, 0xe5 => 0x6ac7, + 0xe6 => 0x6ab4, 0xe7 => 0x6aad, 0xe8 => 0x6b5e, 0xe9 => 0x6bc9, + 0xea => 0x6c0b, 0xeb => 0x7007, 0xec => 0x700c, 0xed => 0x700d, + 0xee => 0x7001, 0xef => 0x7005, 0xf0 => 0x7014, 0xf1 => 0x700e, + 0xf2 => 0x6fff, 0xf3 => 0x7000, 0xf4 => 0x6ffb, 0xf5 => 0x7026, + 0xf6 => 0x6ffc, 0xf7 => 0x6ff7, 0xf8 => 0x700a, 0xf9 => 0x7201, + 0xfa => 0x71ff, 0xfb => 0x71f9, 0xfc => 0x7203, 0xfd => 0x71fd, + 0xfe => 0x7376, + }, + 0xf0 => { + 0x40 => 0x74b8, 0x41 => 0x74c0, 0x42 => 0x74b5, 0x43 => 0x74c1, + 0x44 => 0x74be, 0x45 => 0x74b6, 0x46 => 0x74bb, 0x47 => 0x74c2, + 0x48 => 0x7514, 0x49 => 0x7513, 0x4a => 0x765c, 0x4b => 0x7664, + 0x4c => 0x7659, 0x4d => 0x7650, 0x4e => 0x7653, 0x4f => 0x7657, + 0x50 => 0x765a, 0x51 => 0x76a6, 0x52 => 0x76bd, 0x53 => 0x76ec, + 0x54 => 0x77c2, 0x55 => 0x77ba, 0x56 => 0x78ff, 0x57 => 0x790c, + 0x58 => 0x7913, 0x59 => 0x7914, 0x5a => 0x7909, 0x5b => 0x7910, + 0x5c => 0x7912, 0x5d => 0x7911, 0x5e => 0x79ad, 0x5f => 0x79ac, + 0x60 => 0x7a5f, 0x61 => 0x7c1c, 0x62 => 0x7c29, 0x63 => 0x7c19, + 0x64 => 0x7c20, 0x65 => 0x7c1f, 0x66 => 0x7c2d, 0x67 => 0x7c1d, + 0x68 => 0x7c26, 0x69 => 0x7c28, 0x6a => 0x7c22, 0x6b => 0x7c25, + 0x6c => 0x7c30, 0x6d => 0x7e5c, 0x6e => 0x7e50, 0x6f => 0x7e56, + 0x70 => 0x7e63, 0x71 => 0x7e58, 0x72 => 0x7e62, 0x73 => 0x7e5f, + 0x74 => 0x7e51, 0x75 => 0x7e60, 0x76 => 0x7e57, 0x77 => 0x7e53, + 0x78 => 0x7fb5, 0x79 => 0x7fb3, 0x7a => 0x7ff7, 0x7b => 0x7ff8, + 0x7c => 0x8075, 0x7d => 0x81d1, 0x7e => 0x81d2, 0xa1 => 0x81d0, + 0xa2 => 0x825f, 0xa3 => 0x825e, 0xa4 => 0x85b4, 0xa5 => 0x85c6, + 0xa6 => 0x85c0, 0xa7 => 0x85c3, 0xa8 => 0x85c2, 0xa9 => 0x85b3, + 0xaa => 0x85b5, 0xab => 0x85bd, 0xac => 0x85c7, 0xad => 0x85c4, + 0xae => 0x85bf, 0xaf => 0x85cb, 0xb0 => 0x85ce, 0xb1 => 0x85c8, + 0xb2 => 0x85c5, 0xb3 => 0x85b1, 0xb4 => 0x85b6, 0xb5 => 0x85d2, + 0xb6 => 0x8624, 0xb7 => 0x85b8, 0xb8 => 0x85b7, 0xb9 => 0x85be, + 0xba => 0x8669, 0xbb => 0x87e7, 0xbc => 0x87e6, 0xbd => 0x87e2, + 0xbe => 0x87db, 0xbf => 0x87eb, 0xc0 => 0x87ea, 0xc1 => 0x87e5, + 0xc2 => 0x87df, 0xc3 => 0x87f3, 0xc4 => 0x87e4, 0xc5 => 0x87d4, + 0xc6 => 0x87dc, 0xc7 => 0x87d3, 0xc8 => 0x87ed, 0xc9 => 0x87d8, + 0xca => 0x87e3, 0xcb => 0x87a4, 0xcc => 0x87d7, 0xcd => 0x87d9, + 0xce => 0x8801, 0xcf => 0x87f4, 0xd0 => 0x87e8, 0xd1 => 0x87dd, + 0xd2 => 0x8953, 0xd3 => 0x894b, 0xd4 => 0x894f, 0xd5 => 0x894c, + 0xd6 => 0x8946, 0xd7 => 0x8950, 0xd8 => 0x8951, 0xd9 => 0x8949, + 0xda => 0x8b2a, 0xdb => 0x8b27, 0xdc => 0x8b23, 0xdd => 0x8b33, + 0xde => 0x8b30, 0xdf => 0x8b35, 0xe0 => 0x8b47, 0xe1 => 0x8b2f, + 0xe2 => 0x8b3c, 0xe3 => 0x8b3e, 0xe4 => 0x8b31, 0xe5 => 0x8b25, + 0xe6 => 0x8b37, 0xe7 => 0x8b26, 0xe8 => 0x8b36, 0xe9 => 0x8b2e, + 0xea => 0x8b24, 0xeb => 0x8b3b, 0xec => 0x8b3d, 0xed => 0x8b3a, + 0xee => 0x8c42, 0xef => 0x8c75, 0xf0 => 0x8c99, 0xf1 => 0x8c98, + 0xf2 => 0x8c97, 0xf3 => 0x8cfe, 0xf4 => 0x8d04, 0xf5 => 0x8d02, + 0xf6 => 0x8d00, 0xf7 => 0x8e5c, 0xf8 => 0x8e62, 0xf9 => 0x8e60, + 0xfa => 0x8e57, 0xfb => 0x8e56, 0xfc => 0x8e5e, 0xfd => 0x8e65, + 0xfe => 0x8e67, + }, + 0xf1 => { + 0x40 => 0x8e5b, 0x41 => 0x8e5a, 0x42 => 0x8e61, 0x43 => 0x8e5d, + 0x44 => 0x8e69, 0x45 => 0x8e54, 0x46 => 0x8f46, 0x47 => 0x8f47, + 0x48 => 0x8f48, 0x49 => 0x8f4b, 0x4a => 0x9128, 0x4b => 0x913a, + 0x4c => 0x913b, 0x4d => 0x913e, 0x4e => 0x91a8, 0x4f => 0x91a5, + 0x50 => 0x91a7, 0x51 => 0x91af, 0x52 => 0x91aa, 0x53 => 0x93b5, + 0x54 => 0x938c, 0x55 => 0x9392, 0x56 => 0x93b7, 0x57 => 0x939b, + 0x58 => 0x939d, 0x59 => 0x9389, 0x5a => 0x93a7, 0x5b => 0x938e, + 0x5c => 0x93aa, 0x5d => 0x939e, 0x5e => 0x93a6, 0x5f => 0x9395, + 0x60 => 0x9388, 0x61 => 0x9399, 0x62 => 0x939f, 0x63 => 0x938d, + 0x64 => 0x93b1, 0x65 => 0x9391, 0x66 => 0x93b2, 0x67 => 0x93a4, + 0x68 => 0x93a8, 0x69 => 0x93b4, 0x6a => 0x93a3, 0x6b => 0x93a5, + 0x6c => 0x95d2, 0x6d => 0x95d3, 0x6e => 0x95d1, 0x6f => 0x96b3, + 0x70 => 0x96d7, 0x71 => 0x96da, 0x72 => 0x5dc2, 0x73 => 0x96df, + 0x74 => 0x96d8, 0x75 => 0x96dd, 0x76 => 0x9723, 0x77 => 0x9722, + 0x78 => 0x9725, 0x79 => 0x97ac, 0x7a => 0x97ae, 0x7b => 0x97a8, + 0x7c => 0x97ab, 0x7d => 0x97a4, 0x7e => 0x97aa, 0xa1 => 0x97a2, + 0xa2 => 0x97a5, 0xa3 => 0x97d7, 0xa4 => 0x97d9, 0xa5 => 0x97d6, + 0xa6 => 0x97d8, 0xa7 => 0x97fa, 0xa8 => 0x9850, 0xa9 => 0x9851, + 0xaa => 0x9852, 0xab => 0x98b8, 0xac => 0x9941, 0xad => 0x993c, + 0xae => 0x993a, 0xaf => 0x9a0f, 0xb0 => 0x9a0b, 0xb1 => 0x9a09, + 0xb2 => 0x9a0d, 0xb3 => 0x9a04, 0xb4 => 0x9a11, 0xb5 => 0x9a0a, + 0xb6 => 0x9a05, 0xb7 => 0x9a07, 0xb8 => 0x9a06, 0xb9 => 0x9ac0, + 0xba => 0x9adc, 0xbb => 0x9b08, 0xbc => 0x9b04, 0xbd => 0x9b05, + 0xbe => 0x9b29, 0xbf => 0x9b35, 0xc0 => 0x9b4a, 0xc1 => 0x9b4c, + 0xc2 => 0x9b4b, 0xc3 => 0x9bc7, 0xc4 => 0x9bc6, 0xc5 => 0x9bc3, + 0xc6 => 0x9bbf, 0xc7 => 0x9bc1, 0xc8 => 0x9bb5, 0xc9 => 0x9bb8, + 0xca => 0x9bd3, 0xcb => 0x9bb6, 0xcc => 0x9bc4, 0xcd => 0x9bb9, + 0xce => 0x9bbd, 0xcf => 0x9d5c, 0xd0 => 0x9d53, 0xd1 => 0x9d4f, + 0xd2 => 0x9d4a, 0xd3 => 0x9d5b, 0xd4 => 0x9d4b, 0xd5 => 0x9d59, + 0xd6 => 0x9d56, 0xd7 => 0x9d4c, 0xd8 => 0x9d57, 0xd9 => 0x9d52, + 0xda => 0x9d54, 0xdb => 0x9d5f, 0xdc => 0x9d58, 0xdd => 0x9d5a, + 0xde => 0x9e8e, 0xdf => 0x9e8c, 0xe0 => 0x9edf, 0xe1 => 0x9f01, + 0xe2 => 0x9f00, 0xe3 => 0x9f16, 0xe4 => 0x9f25, 0xe5 => 0x9f2b, + 0xe6 => 0x9f2a, 0xe7 => 0x9f29, 0xe8 => 0x9f28, 0xe9 => 0x9f4c, + 0xea => 0x9f55, 0xeb => 0x5134, 0xec => 0x5135, 0xed => 0x5296, + 0xee => 0x52f7, 0xef => 0x53b4, 0xf0 => 0x56ab, 0xf1 => 0x56ad, + 0xf2 => 0x56a6, 0xf3 => 0x56a7, 0xf4 => 0x56aa, 0xf5 => 0x56ac, + 0xf6 => 0x58da, 0xf7 => 0x58dd, 0xf8 => 0x58db, 0xf9 => 0x5912, + 0xfa => 0x5b3d, 0xfb => 0x5b3e, 0xfc => 0x5b3f, 0xfd => 0x5dc3, + 0xfe => 0x5e70, + }, + 0xf2 => { + 0x40 => 0x5fbf, 0x41 => 0x61fb, 0x42 => 0x6507, 0x43 => 0x6510, + 0x44 => 0x650d, 0x45 => 0x6509, 0x46 => 0x650c, 0x47 => 0x650e, + 0x48 => 0x6584, 0x49 => 0x65de, 0x4a => 0x65dd, 0x4b => 0x66de, + 0x4c => 0x6ae7, 0x4d => 0x6ae0, 0x4e => 0x6acc, 0x4f => 0x6ad1, + 0x50 => 0x6ad9, 0x51 => 0x6acb, 0x52 => 0x6adf, 0x53 => 0x6adc, + 0x54 => 0x6ad0, 0x55 => 0x6aeb, 0x56 => 0x6acf, 0x57 => 0x6acd, + 0x58 => 0x6ade, 0x59 => 0x6b60, 0x5a => 0x6bb0, 0x5b => 0x6c0c, + 0x5c => 0x7019, 0x5d => 0x7027, 0x5e => 0x7020, 0x5f => 0x7016, + 0x60 => 0x702b, 0x61 => 0x7021, 0x62 => 0x7022, 0x63 => 0x7023, + 0x64 => 0x7029, 0x65 => 0x7017, 0x66 => 0x7024, 0x67 => 0x701c, + 0x68 => 0x702a, 0x69 => 0x720c, 0x6a => 0x720a, 0x6b => 0x7207, + 0x6c => 0x7202, 0x6d => 0x7205, 0x6e => 0x72a5, 0x6f => 0x72a6, + 0x70 => 0x72a4, 0x71 => 0x72a3, 0x72 => 0x72a1, 0x73 => 0x74cb, + 0x74 => 0x74c5, 0x75 => 0x74b7, 0x76 => 0x74c3, 0x77 => 0x7516, + 0x78 => 0x7660, 0x79 => 0x77c9, 0x7a => 0x77ca, 0x7b => 0x77c4, + 0x7c => 0x77f1, 0x7d => 0x791d, 0x7e => 0x791b, 0xa1 => 0x7921, + 0xa2 => 0x791c, 0xa3 => 0x7917, 0xa4 => 0x791e, 0xa5 => 0x79b0, + 0xa6 => 0x7a67, 0xa7 => 0x7a68, 0xa8 => 0x7c33, 0xa9 => 0x7c3c, + 0xaa => 0x7c39, 0xab => 0x7c2c, 0xac => 0x7c3b, 0xad => 0x7cec, + 0xae => 0x7cea, 0xaf => 0x7e76, 0xb0 => 0x7e75, 0xb1 => 0x7e78, + 0xb2 => 0x7e70, 0xb3 => 0x7e77, 0xb4 => 0x7e6f, 0xb5 => 0x7e7a, + 0xb6 => 0x7e72, 0xb7 => 0x7e74, 0xb8 => 0x7e68, 0xb9 => 0x7f4b, + 0xba => 0x7f4a, 0xbb => 0x7f83, 0xbc => 0x7f86, 0xbd => 0x7fb7, + 0xbe => 0x7ffd, 0xbf => 0x7ffe, 0xc0 => 0x8078, 0xc1 => 0x81d7, + 0xc2 => 0x81d5, 0xc3 => 0x8264, 0xc4 => 0x8261, 0xc5 => 0x8263, + 0xc6 => 0x85eb, 0xc7 => 0x85f1, 0xc8 => 0x85ed, 0xc9 => 0x85d9, + 0xca => 0x85e1, 0xcb => 0x85e8, 0xcc => 0x85da, 0xcd => 0x85d7, + 0xce => 0x85ec, 0xcf => 0x85f2, 0xd0 => 0x85f8, 0xd1 => 0x85d8, + 0xd2 => 0x85df, 0xd3 => 0x85e3, 0xd4 => 0x85dc, 0xd5 => 0x85d1, + 0xd6 => 0x85f0, 0xd7 => 0x85e6, 0xd8 => 0x85ef, 0xd9 => 0x85de, + 0xda => 0x85e2, 0xdb => 0x8800, 0xdc => 0x87fa, 0xdd => 0x8803, + 0xde => 0x87f6, 0xdf => 0x87f7, 0xe0 => 0x8809, 0xe1 => 0x880c, + 0xe2 => 0x880b, 0xe3 => 0x8806, 0xe4 => 0x87fc, 0xe5 => 0x8808, + 0xe6 => 0x87ff, 0xe7 => 0x880a, 0xe8 => 0x8802, 0xe9 => 0x8962, + 0xea => 0x895a, 0xeb => 0x895b, 0xec => 0x8957, 0xed => 0x8961, + 0xee => 0x895c, 0xef => 0x8958, 0xf0 => 0x895d, 0xf1 => 0x8959, + 0xf2 => 0x8988, 0xf3 => 0x89b7, 0xf4 => 0x89b6, 0xf5 => 0x89f6, + 0xf6 => 0x8b50, 0xf7 => 0x8b48, 0xf8 => 0x8b4a, 0xf9 => 0x8b40, + 0xfa => 0x8b53, 0xfb => 0x8b56, 0xfc => 0x8b54, 0xfd => 0x8b4b, + 0xfe => 0x8b55, + }, + 0xf3 => { + 0x40 => 0x8b51, 0x41 => 0x8b42, 0x42 => 0x8b52, 0x43 => 0x8b57, + 0x44 => 0x8c43, 0x45 => 0x8c77, 0x46 => 0x8c76, 0x47 => 0x8c9a, + 0x48 => 0x8d06, 0x49 => 0x8d07, 0x4a => 0x8d09, 0x4b => 0x8dac, + 0x4c => 0x8daa, 0x4d => 0x8dad, 0x4e => 0x8dab, 0x4f => 0x8e6d, + 0x50 => 0x8e78, 0x51 => 0x8e73, 0x52 => 0x8e6a, 0x53 => 0x8e6f, + 0x54 => 0x8e7b, 0x55 => 0x8ec2, 0x56 => 0x8f52, 0x57 => 0x8f51, + 0x58 => 0x8f4f, 0x59 => 0x8f50, 0x5a => 0x8f53, 0x5b => 0x8fb4, + 0x5c => 0x9140, 0x5d => 0x913f, 0x5e => 0x91b0, 0x5f => 0x91ad, + 0x60 => 0x93de, 0x61 => 0x93c7, 0x62 => 0x93cf, 0x63 => 0x93c2, + 0x64 => 0x93da, 0x65 => 0x93d0, 0x66 => 0x93f9, 0x67 => 0x93ec, + 0x68 => 0x93cc, 0x69 => 0x93d9, 0x6a => 0x93a9, 0x6b => 0x93e6, + 0x6c => 0x93ca, 0x6d => 0x93d4, 0x6e => 0x93ee, 0x6f => 0x93e3, + 0x70 => 0x93d5, 0x71 => 0x93c4, 0x72 => 0x93ce, 0x73 => 0x93c0, + 0x74 => 0x93d2, 0x75 => 0x93e7, 0x76 => 0x957d, 0x77 => 0x95da, + 0x78 => 0x95db, 0x79 => 0x96e1, 0x7a => 0x9729, 0x7b => 0x972b, + 0x7c => 0x972c, 0x7d => 0x9728, 0x7e => 0x9726, 0xa1 => 0x97b3, + 0xa2 => 0x97b7, 0xa3 => 0x97b6, 0xa4 => 0x97dd, 0xa5 => 0x97de, + 0xa6 => 0x97df, 0xa7 => 0x985c, 0xa8 => 0x9859, 0xa9 => 0x985d, + 0xaa => 0x9857, 0xab => 0x98bf, 0xac => 0x98bd, 0xad => 0x98bb, + 0xae => 0x98be, 0xaf => 0x9948, 0xb0 => 0x9947, 0xb1 => 0x9943, + 0xb2 => 0x99a6, 0xb3 => 0x99a7, 0xb4 => 0x9a1a, 0xb5 => 0x9a15, + 0xb6 => 0x9a25, 0xb7 => 0x9a1d, 0xb8 => 0x9a24, 0xb9 => 0x9a1b, + 0xba => 0x9a22, 0xbb => 0x9a20, 0xbc => 0x9a27, 0xbd => 0x9a23, + 0xbe => 0x9a1e, 0xbf => 0x9a1c, 0xc0 => 0x9a14, 0xc1 => 0x9ac2, + 0xc2 => 0x9b0b, 0xc3 => 0x9b0a, 0xc4 => 0x9b0e, 0xc5 => 0x9b0c, + 0xc6 => 0x9b37, 0xc7 => 0x9bea, 0xc8 => 0x9beb, 0xc9 => 0x9be0, + 0xca => 0x9bde, 0xcb => 0x9be4, 0xcc => 0x9be6, 0xcd => 0x9be2, + 0xce => 0x9bf0, 0xcf => 0x9bd4, 0xd0 => 0x9bd7, 0xd1 => 0x9bec, + 0xd2 => 0x9bdc, 0xd3 => 0x9bd9, 0xd4 => 0x9be5, 0xd5 => 0x9bd5, + 0xd6 => 0x9be1, 0xd7 => 0x9bda, 0xd8 => 0x9d77, 0xd9 => 0x9d81, + 0xda => 0x9d8a, 0xdb => 0x9d84, 0xdc => 0x9d88, 0xdd => 0x9d71, + 0xde => 0x9d80, 0xdf => 0x9d78, 0xe0 => 0x9d86, 0xe1 => 0x9d8b, + 0xe2 => 0x9d8c, 0xe3 => 0x9d7d, 0xe4 => 0x9d6b, 0xe5 => 0x9d74, + 0xe6 => 0x9d75, 0xe7 => 0x9d70, 0xe8 => 0x9d69, 0xe9 => 0x9d85, + 0xea => 0x9d73, 0xeb => 0x9d7b, 0xec => 0x9d82, 0xed => 0x9d6f, + 0xee => 0x9d79, 0xef => 0x9d7f, 0xf0 => 0x9d87, 0xf1 => 0x9d68, + 0xf2 => 0x9e94, 0xf3 => 0x9e91, 0xf4 => 0x9ec0, 0xf5 => 0x9efc, + 0xf6 => 0x9f2d, 0xf7 => 0x9f40, 0xf8 => 0x9f41, 0xf9 => 0x9f4d, + 0xfa => 0x9f56, 0xfb => 0x9f57, 0xfc => 0x9f58, 0xfd => 0x5337, + 0xfe => 0x56b2, + }, + 0xf4 => { + 0x40 => 0x56b5, 0x41 => 0x56b3, 0x42 => 0x58e3, 0x43 => 0x5b45, + 0x44 => 0x5dc6, 0x45 => 0x5dc7, 0x46 => 0x5eee, 0x47 => 0x5eef, + 0x48 => 0x5fc0, 0x49 => 0x5fc1, 0x4a => 0x61f9, 0x4b => 0x6517, + 0x4c => 0x6516, 0x4d => 0x6515, 0x4e => 0x6513, 0x4f => 0x65df, + 0x50 => 0x66e8, 0x51 => 0x66e3, 0x52 => 0x66e4, 0x53 => 0x6af3, + 0x54 => 0x6af0, 0x55 => 0x6aea, 0x56 => 0x6ae8, 0x57 => 0x6af9, + 0x58 => 0x6af1, 0x59 => 0x6aee, 0x5a => 0x6aef, 0x5b => 0x703c, + 0x5c => 0x7035, 0x5d => 0x702f, 0x5e => 0x7037, 0x5f => 0x7034, + 0x60 => 0x7031, 0x61 => 0x7042, 0x62 => 0x7038, 0x63 => 0x703f, + 0x64 => 0x703a, 0x65 => 0x7039, 0x66 => 0x7040, 0x67 => 0x703b, + 0x68 => 0x7033, 0x69 => 0x7041, 0x6a => 0x7213, 0x6b => 0x7214, + 0x6c => 0x72a8, 0x6d => 0x737d, 0x6e => 0x737c, 0x6f => 0x74ba, + 0x70 => 0x76ab, 0x71 => 0x76aa, 0x72 => 0x76be, 0x73 => 0x76ed, + 0x74 => 0x77cc, 0x75 => 0x77ce, 0x76 => 0x77cf, 0x77 => 0x77cd, + 0x78 => 0x77f2, 0x79 => 0x7925, 0x7a => 0x7923, 0x7b => 0x7927, + 0x7c => 0x7928, 0x7d => 0x7924, 0x7e => 0x7929, 0xa1 => 0x79b2, + 0xa2 => 0x7a6e, 0xa3 => 0x7a6c, 0xa4 => 0x7a6d, 0xa5 => 0x7af7, + 0xa6 => 0x7c49, 0xa7 => 0x7c48, 0xa8 => 0x7c4a, 0xa9 => 0x7c47, + 0xaa => 0x7c45, 0xab => 0x7cee, 0xac => 0x7e7b, 0xad => 0x7e7e, + 0xae => 0x7e81, 0xaf => 0x7e80, 0xb0 => 0x7fba, 0xb1 => 0x7fff, + 0xb2 => 0x8079, 0xb3 => 0x81db, 0xb4 => 0x81d9, 0xb5 => 0x820b, + 0xb6 => 0x8268, 0xb7 => 0x8269, 0xb8 => 0x8622, 0xb9 => 0x85ff, + 0xba => 0x8601, 0xbb => 0x85fe, 0xbc => 0x861b, 0xbd => 0x8600, + 0xbe => 0x85f6, 0xbf => 0x8604, 0xc0 => 0x8609, 0xc1 => 0x8605, + 0xc2 => 0x860c, 0xc3 => 0x85fd, 0xc4 => 0x8819, 0xc5 => 0x8810, + 0xc6 => 0x8811, 0xc7 => 0x8817, 0xc8 => 0x8813, 0xc9 => 0x8816, + 0xca => 0x8963, 0xcb => 0x8966, 0xcc => 0x89b9, 0xcd => 0x89f7, + 0xce => 0x8b60, 0xcf => 0x8b6a, 0xd0 => 0x8b5d, 0xd1 => 0x8b68, + 0xd2 => 0x8b63, 0xd3 => 0x8b65, 0xd4 => 0x8b67, 0xd5 => 0x8b6d, + 0xd6 => 0x8dae, 0xd7 => 0x8e86, 0xd8 => 0x8e88, 0xd9 => 0x8e84, + 0xda => 0x8f59, 0xdb => 0x8f56, 0xdc => 0x8f57, 0xdd => 0x8f55, + 0xde => 0x8f58, 0xdf => 0x8f5a, 0xe0 => 0x908d, 0xe1 => 0x9143, + 0xe2 => 0x9141, 0xe3 => 0x91b7, 0xe4 => 0x91b5, 0xe5 => 0x91b2, + 0xe6 => 0x91b3, 0xe7 => 0x940b, 0xe8 => 0x9413, 0xe9 => 0x93fb, + 0xea => 0x9420, 0xeb => 0x940f, 0xec => 0x9414, 0xed => 0x93fe, + 0xee => 0x9415, 0xef => 0x9410, 0xf0 => 0x9428, 0xf1 => 0x9419, + 0xf2 => 0x940d, 0xf3 => 0x93f5, 0xf4 => 0x9400, 0xf5 => 0x93f7, + 0xf6 => 0x9407, 0xf7 => 0x940e, 0xf8 => 0x9416, 0xf9 => 0x9412, + 0xfa => 0x93fa, 0xfb => 0x9409, 0xfc => 0x93f8, 0xfd => 0x940a, + 0xfe => 0x93ff, + }, + 0xf5 => { + 0x40 => 0x93fc, 0x41 => 0x940c, 0x42 => 0x93f6, 0x43 => 0x9411, + 0x44 => 0x9406, 0x45 => 0x95de, 0x46 => 0x95e0, 0x47 => 0x95df, + 0x48 => 0x972e, 0x49 => 0x972f, 0x4a => 0x97b9, 0x4b => 0x97bb, + 0x4c => 0x97fd, 0x4d => 0x97fe, 0x4e => 0x9860, 0x4f => 0x9862, + 0x50 => 0x9863, 0x51 => 0x985f, 0x52 => 0x98c1, 0x53 => 0x98c2, + 0x54 => 0x9950, 0x55 => 0x994e, 0x56 => 0x9959, 0x57 => 0x994c, + 0x58 => 0x994b, 0x59 => 0x9953, 0x5a => 0x9a32, 0x5b => 0x9a34, + 0x5c => 0x9a31, 0x5d => 0x9a2c, 0x5e => 0x9a2a, 0x5f => 0x9a36, + 0x60 => 0x9a29, 0x61 => 0x9a2e, 0x62 => 0x9a38, 0x63 => 0x9a2d, + 0x64 => 0x9ac7, 0x65 => 0x9aca, 0x66 => 0x9ac6, 0x67 => 0x9b10, + 0x68 => 0x9b12, 0x69 => 0x9b11, 0x6a => 0x9c0b, 0x6b => 0x9c08, + 0x6c => 0x9bf7, 0x6d => 0x9c05, 0x6e => 0x9c12, 0x6f => 0x9bf8, + 0x70 => 0x9c40, 0x71 => 0x9c07, 0x72 => 0x9c0e, 0x73 => 0x9c06, + 0x74 => 0x9c17, 0x75 => 0x9c14, 0x76 => 0x9c09, 0x77 => 0x9d9f, + 0x78 => 0x9d99, 0x79 => 0x9da4, 0x7a => 0x9d9d, 0x7b => 0x9d92, + 0x7c => 0x9d98, 0x7d => 0x9d90, 0x7e => 0x9d9b, 0xa1 => 0x9da0, + 0xa2 => 0x9d94, 0xa3 => 0x9d9c, 0xa4 => 0x9daa, 0xa5 => 0x9d97, + 0xa6 => 0x9da1, 0xa7 => 0x9d9a, 0xa8 => 0x9da2, 0xa9 => 0x9da8, + 0xaa => 0x9d9e, 0xab => 0x9da3, 0xac => 0x9dbf, 0xad => 0x9da9, + 0xae => 0x9d96, 0xaf => 0x9da6, 0xb0 => 0x9da7, 0xb1 => 0x9e99, + 0xb2 => 0x9e9b, 0xb3 => 0x9e9a, 0xb4 => 0x9ee5, 0xb5 => 0x9ee4, + 0xb6 => 0x9ee7, 0xb7 => 0x9ee6, 0xb8 => 0x9f30, 0xb9 => 0x9f2e, + 0xba => 0x9f5b, 0xbb => 0x9f60, 0xbc => 0x9f5e, 0xbd => 0x9f5d, + 0xbe => 0x9f59, 0xbf => 0x9f91, 0xc0 => 0x513a, 0xc1 => 0x5139, + 0xc2 => 0x5298, 0xc3 => 0x5297, 0xc4 => 0x56c3, 0xc5 => 0x56bd, + 0xc6 => 0x56be, 0xc7 => 0x5b48, 0xc8 => 0x5b47, 0xc9 => 0x5dcb, + 0xca => 0x5dcf, 0xcb => 0x5ef1, 0xcc => 0x61fd, 0xcd => 0x651b, + 0xce => 0x6b02, 0xcf => 0x6afc, 0xd0 => 0x6b03, 0xd1 => 0x6af8, + 0xd2 => 0x6b00, 0xd3 => 0x7043, 0xd4 => 0x7044, 0xd5 => 0x704a, + 0xd6 => 0x7048, 0xd7 => 0x7049, 0xd8 => 0x7045, 0xd9 => 0x7046, + 0xda => 0x721d, 0xdb => 0x721a, 0xdc => 0x7219, 0xdd => 0x737e, + 0xde => 0x7517, 0xdf => 0x766a, 0xe0 => 0x77d0, 0xe1 => 0x792d, + 0xe2 => 0x7931, 0xe3 => 0x792f, 0xe4 => 0x7c54, 0xe5 => 0x7c53, + 0xe6 => 0x7cf2, 0xe7 => 0x7e8a, 0xe8 => 0x7e87, 0xe9 => 0x7e88, + 0xea => 0x7e8b, 0xeb => 0x7e86, 0xec => 0x7e8d, 0xed => 0x7f4d, + 0xee => 0x7fbb, 0xef => 0x8030, 0xf0 => 0x81dd, 0xf1 => 0x8618, + 0xf2 => 0x862a, 0xf3 => 0x8626, 0xf4 => 0x861f, 0xf5 => 0x8623, + 0xf6 => 0x861c, 0xf7 => 0x8619, 0xf8 => 0x8627, 0xf9 => 0x862e, + 0xfa => 0x8621, 0xfb => 0x8620, 0xfc => 0x8629, 0xfd => 0x861e, + 0xfe => 0x8625, + }, + 0xf6 => { + 0x40 => 0x8829, 0x41 => 0x881d, 0x42 => 0x881b, 0x43 => 0x8820, + 0x44 => 0x8824, 0x45 => 0x881c, 0x46 => 0x882b, 0x47 => 0x884a, + 0x48 => 0x896d, 0x49 => 0x8969, 0x4a => 0x896e, 0x4b => 0x896b, + 0x4c => 0x89fa, 0x4d => 0x8b79, 0x4e => 0x8b78, 0x4f => 0x8b45, + 0x50 => 0x8b7a, 0x51 => 0x8b7b, 0x52 => 0x8d10, 0x53 => 0x8d14, + 0x54 => 0x8daf, 0x55 => 0x8e8e, 0x56 => 0x8e8c, 0x57 => 0x8f5e, + 0x58 => 0x8f5b, 0x59 => 0x8f5d, 0x5a => 0x9146, 0x5b => 0x9144, + 0x5c => 0x9145, 0x5d => 0x91b9, 0x5e => 0x943f, 0x5f => 0x943b, + 0x60 => 0x9436, 0x61 => 0x9429, 0x62 => 0x943d, 0x63 => 0x943c, + 0x64 => 0x9430, 0x65 => 0x9439, 0x66 => 0x942a, 0x67 => 0x9437, + 0x68 => 0x942c, 0x69 => 0x9440, 0x6a => 0x9431, 0x6b => 0x95e5, + 0x6c => 0x95e4, 0x6d => 0x95e3, 0x6e => 0x9735, 0x6f => 0x973a, + 0x70 => 0x97bf, 0x71 => 0x97e1, 0x72 => 0x9864, 0x73 => 0x98c9, + 0x74 => 0x98c6, 0x75 => 0x98c0, 0x76 => 0x9958, 0x77 => 0x9956, + 0x78 => 0x9a39, 0x79 => 0x9a3d, 0x7a => 0x9a46, 0x7b => 0x9a44, + 0x7c => 0x9a42, 0x7d => 0x9a41, 0x7e => 0x9a3a, 0xa1 => 0x9a3f, + 0xa2 => 0x9acd, 0xa3 => 0x9b15, 0xa4 => 0x9b17, 0xa5 => 0x9b18, + 0xa6 => 0x9b16, 0xa7 => 0x9b3a, 0xa8 => 0x9b52, 0xa9 => 0x9c2b, + 0xaa => 0x9c1d, 0xab => 0x9c1c, 0xac => 0x9c2c, 0xad => 0x9c23, + 0xae => 0x9c28, 0xaf => 0x9c29, 0xb0 => 0x9c24, 0xb1 => 0x9c21, + 0xb2 => 0x9db7, 0xb3 => 0x9db6, 0xb4 => 0x9dbc, 0xb5 => 0x9dc1, + 0xb6 => 0x9dc7, 0xb7 => 0x9dca, 0xb8 => 0x9dcf, 0xb9 => 0x9dbe, + 0xba => 0x9dc5, 0xbb => 0x9dc3, 0xbc => 0x9dbb, 0xbd => 0x9db5, + 0xbe => 0x9dce, 0xbf => 0x9db9, 0xc0 => 0x9dba, 0xc1 => 0x9dac, + 0xc2 => 0x9dc8, 0xc3 => 0x9db1, 0xc4 => 0x9dad, 0xc5 => 0x9dcc, + 0xc6 => 0x9db3, 0xc7 => 0x9dcd, 0xc8 => 0x9db2, 0xc9 => 0x9e7a, + 0xca => 0x9e9c, 0xcb => 0x9eeb, 0xcc => 0x9eee, 0xcd => 0x9eed, + 0xce => 0x9f1b, 0xcf => 0x9f18, 0xd0 => 0x9f1a, 0xd1 => 0x9f31, + 0xd2 => 0x9f4e, 0xd3 => 0x9f65, 0xd4 => 0x9f64, 0xd5 => 0x9f92, + 0xd6 => 0x4eb9, 0xd7 => 0x56c6, 0xd8 => 0x56c5, 0xd9 => 0x56cb, + 0xda => 0x5971, 0xdb => 0x5b4b, 0xdc => 0x5b4c, 0xdd => 0x5dd5, + 0xde => 0x5dd1, 0xdf => 0x5ef2, 0xe0 => 0x6521, 0xe1 => 0x6520, + 0xe2 => 0x6526, 0xe3 => 0x6522, 0xe4 => 0x6b0b, 0xe5 => 0x6b08, + 0xe6 => 0x6b09, 0xe7 => 0x6c0d, 0xe8 => 0x7055, 0xe9 => 0x7056, + 0xea => 0x7057, 0xeb => 0x7052, 0xec => 0x721e, 0xed => 0x721f, + 0xee => 0x72a9, 0xef => 0x737f, 0xf0 => 0x74d8, 0xf1 => 0x74d5, + 0xf2 => 0x74d9, 0xf3 => 0x74d7, 0xf4 => 0x766d, 0xf5 => 0x76ad, + 0xf6 => 0x7935, 0xf7 => 0x79b4, 0xf8 => 0x7a70, 0xf9 => 0x7a71, + 0xfa => 0x7c57, 0xfb => 0x7c5c, 0xfc => 0x7c59, 0xfd => 0x7c5b, + 0xfe => 0x7c5a, + }, + 0xf7 => { + 0x40 => 0x7cf4, 0x41 => 0x7cf1, 0x42 => 0x7e91, 0x43 => 0x7f4f, + 0x44 => 0x7f87, 0x45 => 0x81de, 0x46 => 0x826b, 0x47 => 0x8634, + 0x48 => 0x8635, 0x49 => 0x8633, 0x4a => 0x862c, 0x4b => 0x8632, + 0x4c => 0x8636, 0x4d => 0x882c, 0x4e => 0x8828, 0x4f => 0x8826, + 0x50 => 0x882a, 0x51 => 0x8825, 0x52 => 0x8971, 0x53 => 0x89bf, + 0x54 => 0x89be, 0x55 => 0x89fb, 0x56 => 0x8b7e, 0x57 => 0x8b84, + 0x58 => 0x8b82, 0x59 => 0x8b86, 0x5a => 0x8b85, 0x5b => 0x8b7f, + 0x5c => 0x8d15, 0x5d => 0x8e95, 0x5e => 0x8e94, 0x5f => 0x8e9a, + 0x60 => 0x8e92, 0x61 => 0x8e90, 0x62 => 0x8e96, 0x63 => 0x8e97, + 0x64 => 0x8f60, 0x65 => 0x8f62, 0x66 => 0x9147, 0x67 => 0x944c, + 0x68 => 0x9450, 0x69 => 0x944a, 0x6a => 0x944b, 0x6b => 0x944f, + 0x6c => 0x9447, 0x6d => 0x9445, 0x6e => 0x9448, 0x6f => 0x9449, + 0x70 => 0x9446, 0x71 => 0x973f, 0x72 => 0x97e3, 0x73 => 0x986a, + 0x74 => 0x9869, 0x75 => 0x98cb, 0x76 => 0x9954, 0x77 => 0x995b, + 0x78 => 0x9a4e, 0x79 => 0x9a53, 0x7a => 0x9a54, 0x7b => 0x9a4c, + 0x7c => 0x9a4f, 0x7d => 0x9a48, 0x7e => 0x9a4a, 0xa1 => 0x9a49, + 0xa2 => 0x9a52, 0xa3 => 0x9a50, 0xa4 => 0x9ad0, 0xa5 => 0x9b19, + 0xa6 => 0x9b2b, 0xa7 => 0x9b3b, 0xa8 => 0x9b56, 0xa9 => 0x9b55, + 0xaa => 0x9c46, 0xab => 0x9c48, 0xac => 0x9c3f, 0xad => 0x9c44, + 0xae => 0x9c39, 0xaf => 0x9c33, 0xb0 => 0x9c41, 0xb1 => 0x9c3c, + 0xb2 => 0x9c37, 0xb3 => 0x9c34, 0xb4 => 0x9c32, 0xb5 => 0x9c3d, + 0xb6 => 0x9c36, 0xb7 => 0x9ddb, 0xb8 => 0x9dd2, 0xb9 => 0x9dde, + 0xba => 0x9dda, 0xbb => 0x9dcb, 0xbc => 0x9dd0, 0xbd => 0x9ddc, + 0xbe => 0x9dd1, 0xbf => 0x9ddf, 0xc0 => 0x9de9, 0xc1 => 0x9dd9, + 0xc2 => 0x9dd8, 0xc3 => 0x9dd6, 0xc4 => 0x9df5, 0xc5 => 0x9dd5, + 0xc6 => 0x9ddd, 0xc7 => 0x9eb6, 0xc8 => 0x9ef0, 0xc9 => 0x9f35, + 0xca => 0x9f33, 0xcb => 0x9f32, 0xcc => 0x9f42, 0xcd => 0x9f6b, + 0xce => 0x9f95, 0xcf => 0x9fa2, 0xd0 => 0x513d, 0xd1 => 0x5299, + 0xd2 => 0x58e8, 0xd3 => 0x58e7, 0xd4 => 0x5972, 0xd5 => 0x5b4d, + 0xd6 => 0x5dd8, 0xd7 => 0x882f, 0xd8 => 0x5f4f, 0xd9 => 0x6201, + 0xda => 0x6203, 0xdb => 0x6204, 0xdc => 0x6529, 0xdd => 0x6525, + 0xde => 0x6596, 0xdf => 0x66eb, 0xe0 => 0x6b11, 0xe1 => 0x6b12, + 0xe2 => 0x6b0f, 0xe3 => 0x6bca, 0xe4 => 0x705b, 0xe5 => 0x705a, + 0xe6 => 0x7222, 0xe7 => 0x7382, 0xe8 => 0x7381, 0xe9 => 0x7383, + 0xea => 0x7670, 0xeb => 0x77d4, 0xec => 0x7c67, 0xed => 0x7c66, + 0xee => 0x7e95, 0xef => 0x826c, 0xf0 => 0x863a, 0xf1 => 0x8640, + 0xf2 => 0x8639, 0xf3 => 0x863c, 0xf4 => 0x8631, 0xf5 => 0x863b, + 0xf6 => 0x863e, 0xf7 => 0x8830, 0xf8 => 0x8832, 0xf9 => 0x882e, + 0xfa => 0x8833, 0xfb => 0x8976, 0xfc => 0x8974, 0xfd => 0x8973, + 0xfe => 0x89fe, + }, + 0xf8 => { + 0x40 => 0x8b8c, 0x41 => 0x8b8e, 0x42 => 0x8b8b, 0x43 => 0x8b88, + 0x44 => 0x8c45, 0x45 => 0x8d19, 0x46 => 0x8e98, 0x47 => 0x8f64, + 0x48 => 0x8f63, 0x49 => 0x91bc, 0x4a => 0x9462, 0x4b => 0x9455, + 0x4c => 0x945d, 0x4d => 0x9457, 0x4e => 0x945e, 0x4f => 0x97c4, + 0x50 => 0x97c5, 0x51 => 0x9800, 0x52 => 0x9a56, 0x53 => 0x9a59, + 0x54 => 0x9b1e, 0x55 => 0x9b1f, 0x56 => 0x9b20, 0x57 => 0x9c52, + 0x58 => 0x9c58, 0x59 => 0x9c50, 0x5a => 0x9c4a, 0x5b => 0x9c4d, + 0x5c => 0x9c4b, 0x5d => 0x9c55, 0x5e => 0x9c59, 0x5f => 0x9c4c, + 0x60 => 0x9c4e, 0x61 => 0x9dfb, 0x62 => 0x9df7, 0x63 => 0x9def, + 0x64 => 0x9de3, 0x65 => 0x9deb, 0x66 => 0x9df8, 0x67 => 0x9de4, + 0x68 => 0x9df6, 0x69 => 0x9de1, 0x6a => 0x9dee, 0x6b => 0x9de6, + 0x6c => 0x9df2, 0x6d => 0x9df0, 0x6e => 0x9de2, 0x6f => 0x9dec, + 0x70 => 0x9df4, 0x71 => 0x9df3, 0x72 => 0x9de8, 0x73 => 0x9ded, + 0x74 => 0x9ec2, 0x75 => 0x9ed0, 0x76 => 0x9ef2, 0x77 => 0x9ef3, + 0x78 => 0x9f06, 0x79 => 0x9f1c, 0x7a => 0x9f38, 0x7b => 0x9f37, + 0x7c => 0x9f36, 0x7d => 0x9f43, 0x7e => 0x9f4f, 0xa1 => 0x9f71, + 0xa2 => 0x9f70, 0xa3 => 0x9f6e, 0xa4 => 0x9f6f, 0xa5 => 0x56d3, + 0xa6 => 0x56cd, 0xa7 => 0x5b4e, 0xa8 => 0x5c6d, 0xa9 => 0x652d, + 0xaa => 0x66ed, 0xab => 0x66ee, 0xac => 0x6b13, 0xad => 0x705f, + 0xae => 0x7061, 0xaf => 0x705d, 0xb0 => 0x7060, 0xb1 => 0x7223, + 0xb2 => 0x74db, 0xb3 => 0x74e5, 0xb4 => 0x77d5, 0xb5 => 0x7938, + 0xb6 => 0x79b7, 0xb7 => 0x79b6, 0xb8 => 0x7c6a, 0xb9 => 0x7e97, + 0xba => 0x7f89, 0xbb => 0x826d, 0xbc => 0x8643, 0xbd => 0x8838, + 0xbe => 0x8837, 0xbf => 0x8835, 0xc0 => 0x884b, 0xc1 => 0x8b94, + 0xc2 => 0x8b95, 0xc3 => 0x8e9e, 0xc4 => 0x8e9f, 0xc5 => 0x8ea0, + 0xc6 => 0x8e9d, 0xc7 => 0x91be, 0xc8 => 0x91bd, 0xc9 => 0x91c2, + 0xca => 0x946b, 0xcb => 0x9468, 0xcc => 0x9469, 0xcd => 0x96e5, + 0xce => 0x9746, 0xcf => 0x9743, 0xd0 => 0x9747, 0xd1 => 0x97c7, + 0xd2 => 0x97e5, 0xd3 => 0x9a5e, 0xd4 => 0x9ad5, 0xd5 => 0x9b59, + 0xd6 => 0x9c63, 0xd7 => 0x9c67, 0xd8 => 0x9c66, 0xd9 => 0x9c62, + 0xda => 0x9c5e, 0xdb => 0x9c60, 0xdc => 0x9e02, 0xdd => 0x9dfe, + 0xde => 0x9e07, 0xdf => 0x9e03, 0xe0 => 0x9e06, 0xe1 => 0x9e05, + 0xe2 => 0x9e00, 0xe3 => 0x9e01, 0xe4 => 0x9e09, 0xe5 => 0x9dff, + 0xe6 => 0x9dfd, 0xe7 => 0x9e04, 0xe8 => 0x9ea0, 0xe9 => 0x9f1e, + 0xea => 0x9f46, 0xeb => 0x9f74, 0xec => 0x9f75, 0xed => 0x9f76, + 0xee => 0x56d4, 0xef => 0x652e, 0xf0 => 0x65b8, 0xf1 => 0x6b18, + 0xf2 => 0x6b19, 0xf3 => 0x6b17, 0xf4 => 0x6b1a, 0xf5 => 0x7062, + 0xf6 => 0x7226, 0xf7 => 0x72aa, 0xf8 => 0x77d8, 0xf9 => 0x77d9, + 0xfa => 0x7939, 0xfb => 0x7c69, 0xfc => 0x7c6b, 0xfd => 0x7cf6, + 0xfe => 0x7e9a, + }, + 0xf9 => { + 0x40 => 0x7e98, 0x41 => 0x7e9b, 0x42 => 0x7e99, 0x43 => 0x81e0, + 0x44 => 0x81e1, 0x45 => 0x8646, 0x46 => 0x8647, 0x47 => 0x8648, + 0x48 => 0x8979, 0x49 => 0x897a, 0x4a => 0x897c, 0x4b => 0x897b, + 0x4c => 0x89ff, 0x4d => 0x8b98, 0x4e => 0x8b99, 0x4f => 0x8ea5, + 0x50 => 0x8ea4, 0x51 => 0x8ea3, 0x52 => 0x946e, 0x53 => 0x946d, + 0x54 => 0x946f, 0x55 => 0x9471, 0x56 => 0x9473, 0x57 => 0x9749, + 0x58 => 0x9872, 0x59 => 0x995f, 0x5a => 0x9c68, 0x5b => 0x9c6e, + 0x5c => 0x9c6d, 0x5d => 0x9e0b, 0x5e => 0x9e0d, 0x5f => 0x9e10, + 0x60 => 0x9e0f, 0x61 => 0x9e12, 0x62 => 0x9e11, 0x63 => 0x9ea1, + 0x64 => 0x9ef5, 0x65 => 0x9f09, 0x66 => 0x9f47, 0x67 => 0x9f78, + 0x68 => 0x9f7b, 0x69 => 0x9f7a, 0x6a => 0x9f79, 0x6b => 0x571e, + 0x6c => 0x7066, 0x6d => 0x7c6f, 0x6e => 0x883c, 0x6f => 0x8db2, + 0x70 => 0x8ea6, 0x71 => 0x91c3, 0x72 => 0x9474, 0x73 => 0x9478, + 0x74 => 0x9476, 0x75 => 0x9475, 0x76 => 0x9a60, 0x77 => 0x9c74, + 0x78 => 0x9c73, 0x79 => 0x9c71, 0x7a => 0x9c75, 0x7b => 0x9e14, + 0x7c => 0x9e13, 0x7d => 0x9ef6, 0x7e => 0x9f0a, 0xa1 => 0x9fa4, + 0xa2 => 0x7068, 0xa3 => 0x7065, 0xa4 => 0x7cf7, 0xa5 => 0x866a, + 0xa6 => 0x883e, 0xa7 => 0x883d, 0xa8 => 0x883f, 0xa9 => 0x8b9e, + 0xaa => 0x8c9c, 0xab => 0x8ea9, 0xac => 0x8ec9, 0xad => 0x974b, + 0xae => 0x9873, 0xaf => 0x9874, 0xb0 => 0x98cc, 0xb1 => 0x9961, + 0xb2 => 0x99ab, 0xb3 => 0x9a64, 0xb4 => 0x9a66, 0xb5 => 0x9a67, + 0xb6 => 0x9b24, 0xb7 => 0x9e15, 0xb8 => 0x9e17, 0xb9 => 0x9f48, + 0xba => 0x6207, 0xbb => 0x6b1e, 0xbc => 0x7227, 0xbd => 0x864c, + 0xbe => 0x8ea8, 0xbf => 0x9482, 0xc0 => 0x9480, 0xc1 => 0x9481, + 0xc2 => 0x9a69, 0xc3 => 0x9a68, 0xc4 => 0x9b2e, 0xc5 => 0x9e19, + 0xc6 => 0x7229, 0xc7 => 0x864b, 0xc8 => 0x8b9f, 0xc9 => 0x9483, + 0xca => 0x9c79, 0xcb => 0x9eb7, 0xcc => 0x7675, 0xcd => 0x9a6b, + 0xce => 0x9c7a, 0xcf => 0x9e1d, 0xd0 => 0x7069, 0xd1 => 0x706a, + 0xd2 => 0x9ea4, 0xd3 => 0x9f7e, 0xd4 => 0x9f49, 0xd5 => 0x9f98, + }, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacCroatian.pm b/lib/Image/ExifTool/Charset/MacCroatian.pm new file mode 100644 index 0000000..f99d066 --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacCroatian.pm @@ -0,0 +1,43 @@ +#------------------------------------------------------------------------------ +# File: MacCroatian.pm +# +# Description: Mac Croatian to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/CROATIAN.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacCroatian = ( + 0x80 => 0xc4, 0x81 => 0xc5, 0x82 => 0xc7, 0x83 => 0xc9, 0x84 => 0xd1, + 0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0, 0x89 => 0xe2, + 0x8a => 0xe4, 0x8b => 0xe3, 0x8c => 0xe5, 0x8d => 0xe7, 0x8e => 0xe9, + 0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed, 0x93 => 0xec, + 0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3, 0x98 => 0xf2, + 0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa, 0x9d => 0xf9, + 0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x2020, 0xa1 => 0xb0, 0xa4 => 0xa7, + 0xa5 => 0x2022, 0xa6 => 0xb6, 0xa7 => 0xdf, 0xa8 => 0xae, 0xa9 => 0x0160, + 0xaa => 0x2122, 0xab => 0xb4, 0xac => 0xa8, 0xad => 0x2260, 0xae => 0x017d, + 0xaf => 0xd8, 0xb0 => 0x221e, 0xb2 => 0x2264, 0xb3 => 0x2265, 0xb4 => 0x2206, + 0xb6 => 0x2202, 0xb7 => 0x2211, 0xb8 => 0x220f, 0xb9 => 0x0161, + 0xba => 0x222b, 0xbb => 0xaa, 0xbc => 0xba, 0xbd => 0x03a9, 0xbe => 0x017e, + 0xbf => 0xf8, 0xc0 => 0xbf, 0xc1 => 0xa1, 0xc2 => 0xac, 0xc3 => 0x221a, + 0xc4 => 0x0192, 0xc5 => 0x2248, 0xc6 => 0x0106, 0xc7 => 0xab, 0xc8 => 0x010c, + 0xc9 => 0x2026, 0xca => 0xa0, 0xcb => 0xc0, 0xcc => 0xc3, 0xcd => 0xd5, + 0xce => 0x0152, 0xcf => 0x0153, 0xd0 => 0x0110, 0xd1 => 0x2014, + 0xd2 => 0x201c, 0xd3 => 0x201d, 0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7, + 0xd7 => 0x25ca, 0xd8 => 0xf8ff, 0xd9 => 0xa9, 0xda => 0x2044, 0xdb => 0x20ac, + 0xdc => 0x2039, 0xdd => 0x203a, 0xde => 0xc6, 0xdf => 0xbb, 0xe0 => 0x2013, + 0xe1 => 0xb7, 0xe2 => 0x201a, 0xe3 => 0x201e, 0xe4 => 0x2030, 0xe5 => 0xc2, + 0xe6 => 0x0107, 0xe7 => 0xc1, 0xe8 => 0x010d, 0xe9 => 0xc8, 0xea => 0xcd, + 0xeb => 0xce, 0xec => 0xcf, 0xed => 0xcc, 0xee => 0xd3, 0xef => 0xd4, + 0xf0 => 0x0111, 0xf1 => 0xd2, 0xf2 => 0xda, 0xf3 => 0xdb, 0xf4 => 0xd9, + 0xf5 => 0x0131, 0xf6 => 0x02c6, 0xf7 => 0x02dc, 0xf8 => 0xaf, 0xf9 => 0x03c0, + 0xfa => 0xcb, 0xfb => 0x02da, 0xfc => 0xb8, 0xfd => 0xca, 0xfe => 0xe6, + 0xff => 0x02c7, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacCyrillic.pm b/lib/Image/ExifTool/Charset/MacCyrillic.pm new file mode 100644 index 0000000..7d5ea75 --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacCyrillic.pm @@ -0,0 +1,47 @@ +#------------------------------------------------------------------------------ +# File: MacCyrillic.pm +# +# Description: Mac Cyrillic to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/CYRILLIC.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacCyrillic = ( + 0x80 => 0x0410, 0x81 => 0x0411, 0x82 => 0x0412, 0x83 => 0x0413, + 0x84 => 0x0414, 0x85 => 0x0415, 0x86 => 0x0416, 0x87 => 0x0417, + 0x88 => 0x0418, 0x89 => 0x0419, 0x8a => 0x041a, 0x8b => 0x041b, + 0x8c => 0x041c, 0x8d => 0x041d, 0x8e => 0x041e, 0x8f => 0x041f, + 0x90 => 0x0420, 0x91 => 0x0421, 0x92 => 0x0422, 0x93 => 0x0423, + 0x94 => 0x0424, 0x95 => 0x0425, 0x96 => 0x0426, 0x97 => 0x0427, + 0x98 => 0x0428, 0x99 => 0x0429, 0x9a => 0x042a, 0x9b => 0x042b, + 0x9c => 0x042c, 0x9d => 0x042d, 0x9e => 0x042e, 0x9f => 0x042f, + 0xa0 => 0x2020, 0xa1 => 0xb0, 0xa2 => 0x0490, 0xa4 => 0xa7, 0xa5 => 0x2022, + 0xa6 => 0xb6, 0xa7 => 0x0406, 0xa8 => 0xae, 0xaa => 0x2122, 0xab => 0x0402, + 0xac => 0x0452, 0xad => 0x2260, 0xae => 0x0403, 0xaf => 0x0453, + 0xb0 => 0x221e, 0xb2 => 0x2264, 0xb3 => 0x2265, 0xb4 => 0x0456, + 0xb6 => 0x0491, 0xb7 => 0x0408, 0xb8 => 0x0404, 0xb9 => 0x0454, + 0xba => 0x0407, 0xbb => 0x0457, 0xbc => 0x0409, 0xbd => 0x0459, + 0xbe => 0x040a, 0xbf => 0x045a, 0xc0 => 0x0458, 0xc1 => 0x0405, 0xc2 => 0xac, + 0xc3 => 0x221a, 0xc4 => 0x0192, 0xc5 => 0x2248, 0xc6 => 0x2206, 0xc7 => 0xab, + 0xc8 => 0xbb, 0xc9 => 0x2026, 0xca => 0xa0, 0xcb => 0x040b, 0xcc => 0x045b, + 0xcd => 0x040c, 0xce => 0x045c, 0xcf => 0x0455, 0xd0 => 0x2013, + 0xd1 => 0x2014, 0xd2 => 0x201c, 0xd3 => 0x201d, 0xd4 => 0x2018, + 0xd5 => 0x2019, 0xd6 => 0xf7, 0xd7 => 0x201e, 0xd8 => 0x040e, 0xd9 => 0x045e, + 0xda => 0x040f, 0xdb => 0x045f, 0xdc => 0x2116, 0xdd => 0x0401, + 0xde => 0x0451, 0xdf => 0x044f, 0xe0 => 0x0430, 0xe1 => 0x0431, + 0xe2 => 0x0432, 0xe3 => 0x0433, 0xe4 => 0x0434, 0xe5 => 0x0435, + 0xe6 => 0x0436, 0xe7 => 0x0437, 0xe8 => 0x0438, 0xe9 => 0x0439, + 0xea => 0x043a, 0xeb => 0x043b, 0xec => 0x043c, 0xed => 0x043d, + 0xee => 0x043e, 0xef => 0x043f, 0xf0 => 0x0440, 0xf1 => 0x0441, + 0xf2 => 0x0442, 0xf3 => 0x0443, 0xf4 => 0x0444, 0xf5 => 0x0445, + 0xf6 => 0x0446, 0xf7 => 0x0447, 0xf8 => 0x0448, 0xf9 => 0x0449, + 0xfa => 0x044a, 0xfb => 0x044b, 0xfc => 0x044c, 0xfd => 0x044d, + 0xfe => 0x044e, 0xff => 0x20ac, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacGreek.pm b/lib/Image/ExifTool/Charset/MacGreek.pm new file mode 100644 index 0000000..43b2595 --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacGreek.pm @@ -0,0 +1,45 @@ +#------------------------------------------------------------------------------ +# File: MacGreek.pm +# +# Description: Mac Greek to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/GREEK.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacGreek = ( + 0x80 => 0xc4, 0x81 => 0xb9, 0x82 => 0xb2, 0x83 => 0xc9, 0x84 => 0xb3, + 0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0x0385, 0x88 => 0xe0, 0x89 => 0xe2, + 0x8a => 0xe4, 0x8b => 0x0384, 0x8c => 0xa8, 0x8d => 0xe7, 0x8e => 0xe9, + 0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xa3, 0x93 => 0x2122, + 0x94 => 0xee, 0x95 => 0xef, 0x96 => 0x2022, 0x97 => 0xbd, 0x98 => 0x2030, + 0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xa6, 0x9c => 0x20ac, 0x9d => 0xf9, + 0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x2020, 0xa1 => 0x0393, 0xa2 => 0x0394, + 0xa3 => 0x0398, 0xa4 => 0x039b, 0xa5 => 0x039e, 0xa6 => 0x03a0, 0xa7 => 0xdf, + 0xa8 => 0xae, 0xaa => 0x03a3, 0xab => 0x03aa, 0xac => 0xa7, 0xad => 0x2260, + 0xae => 0xb0, 0xaf => 0xb7, 0xb0 => 0x0391, 0xb2 => 0x2264, 0xb3 => 0x2265, + 0xb4 => 0xa5, 0xb5 => 0x0392, 0xb6 => 0x0395, 0xb7 => 0x0396, 0xb8 => 0x0397, + 0xb9 => 0x0399, 0xba => 0x039a, 0xbb => 0x039c, 0xbc => 0x03a6, + 0xbd => 0x03ab, 0xbe => 0x03a8, 0xbf => 0x03a9, 0xc0 => 0x03ac, + 0xc1 => 0x039d, 0xc2 => 0xac, 0xc3 => 0x039f, 0xc4 => 0x03a1, 0xc5 => 0x2248, + 0xc6 => 0x03a4, 0xc7 => 0xab, 0xc8 => 0xbb, 0xc9 => 0x2026, 0xca => 0xa0, + 0xcb => 0x03a5, 0xcc => 0x03a7, 0xcd => 0x0386, 0xce => 0x0388, + 0xcf => 0x0153, 0xd0 => 0x2013, 0xd1 => 0x2015, 0xd2 => 0x201c, + 0xd3 => 0x201d, 0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7, 0xd7 => 0x0389, + 0xd8 => 0x038a, 0xd9 => 0x038c, 0xda => 0x038e, 0xdb => 0x03ad, + 0xdc => 0x03ae, 0xdd => 0x03af, 0xde => 0x03cc, 0xdf => 0x038f, + 0xe0 => 0x03cd, 0xe1 => 0x03b1, 0xe2 => 0x03b2, 0xe3 => 0x03c8, + 0xe4 => 0x03b4, 0xe5 => 0x03b5, 0xe6 => 0x03c6, 0xe7 => 0x03b3, + 0xe8 => 0x03b7, 0xe9 => 0x03b9, 0xea => 0x03be, 0xeb => 0x03ba, + 0xec => 0x03bb, 0xed => 0x03bc, 0xee => 0x03bd, 0xef => 0x03bf, + 0xf0 => 0x03c0, 0xf1 => 0x03ce, 0xf2 => 0x03c1, 0xf3 => 0x03c3, + 0xf4 => 0x03c4, 0xf5 => 0x03b8, 0xf6 => 0x03c9, 0xf7 => 0x03c2, + 0xf8 => 0x03c7, 0xf9 => 0x03c5, 0xfa => 0x03b6, 0xfb => 0x03ca, + 0xfc => 0x03cb, 0xfd => 0x0390, 0xfe => 0x03b0, 0xff => 0xad, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacHebrew.pm b/lib/Image/ExifTool/Charset/MacHebrew.pm new file mode 100644 index 0000000..86f8f08 --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacHebrew.pm @@ -0,0 +1,47 @@ +#------------------------------------------------------------------------------ +# File: MacHebrew.pm +# +# Description: Mac Hebrew to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/HEBREW.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +# and directional characters are ignored +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacHebrew = ( + 0x80 => 0xc4, 0x81 => [0x05f2,0x05b7], 0x82 => 0xc7, 0x83 => 0xc9, + 0x84 => 0xd1, 0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0, + 0x89 => 0xe2, 0x8a => 0xe4, 0x8b => 0xe3, 0x8c => 0xe5, 0x8d => 0xe7, + 0x8e => 0xe9, 0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed, + 0x93 => 0xec, 0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3, + 0x98 => 0xf2, 0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa, + 0x9d => 0xf9, 0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x20, 0xa1 => 0x21, + 0xa2 => 0x22, 0xa3 => 0x23, 0xa4 => 0x24, 0xa5 => 0x25, 0xa6 => 0x20aa, + 0xa7 => 0x27, 0xa8 => 0x29, 0xa9 => 0x28, 0xaa => 0x2a, 0xab => 0x2b, + 0xac => 0x2c, 0xad => 0x2d, 0xae => 0x2e, 0xaf => 0x2f, 0xb0 => 0x30, + 0xb1 => 0x31, 0xb2 => 0x32, 0xb3 => 0x33, 0xb4 => 0x34, 0xb5 => 0x35, + 0xb6 => 0x36, 0xb7 => 0x37, 0xb8 => 0x38, 0xb9 => 0x39, 0xba => 0x3a, + 0xbb => 0x3b, 0xbc => 0x3c, 0xbd => 0x3d, 0xbe => 0x3e, 0xbf => 0x3f, + 0xc0 => [0xf86a,0x05dc,0x05b9], 0xc1 => 0x201e, 0xc2 => 0xf89b, + 0xc3 => 0xf89c, 0xc4 => 0xf89d, 0xc5 => 0xf89e, 0xc6 => 0x05bc, + 0xc7 => 0xfb4b, 0xc8 => 0xfb35, 0xc9 => 0x2026, 0xca => 0xa0, 0xcb => 0x05b8, + 0xcc => 0x05b7, 0xcd => 0x05b5, 0xce => 0x05b6, 0xcf => 0x05b4, + 0xd0 => 0x2013, 0xd1 => 0x2014, 0xd2 => 0x201c, 0xd3 => 0x201d, + 0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xfb2a, 0xd7 => 0xfb2b, + 0xd8 => 0x05bf, 0xd9 => 0x05b0, 0xda => 0x05b2, 0xdb => 0x05b1, + 0xdc => 0x05bb, 0xdd => 0x05b9, 0xde => [0x05b8,0xf87f], 0xdf => 0x05b3, + 0xe0 => 0x05d0, 0xe1 => 0x05d1, 0xe2 => 0x05d2, 0xe3 => 0x05d3, + 0xe4 => 0x05d4, 0xe5 => 0x05d5, 0xe6 => 0x05d6, 0xe7 => 0x05d7, + 0xe8 => 0x05d8, 0xe9 => 0x05d9, 0xea => 0x05da, 0xeb => 0x05db, + 0xec => 0x05dc, 0xed => 0x05dd, 0xee => 0x05de, 0xef => 0x05df, + 0xf0 => 0x05e0, 0xf1 => 0x05e1, 0xf2 => 0x05e2, 0xf3 => 0x05e3, + 0xf4 => 0x05e4, 0xf5 => 0x05e5, 0xf6 => 0x05e6, 0xf7 => 0x05e7, + 0xf8 => 0x05e8, 0xf9 => 0x05e9, 0xfa => 0x05ea, 0xfb => 0x7d, 0xfc => 0x5d, + 0xfd => 0x7b, 0xfe => 0x5b, 0xff => 0x7c, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacIceland.pm b/lib/Image/ExifTool/Charset/MacIceland.pm new file mode 100644 index 0000000..ad4d0c4 --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacIceland.pm @@ -0,0 +1,42 @@ +#------------------------------------------------------------------------------ +# File: MacIceland.pm +# +# Description: Mac Icelandic to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/ICELAND.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacIceland = ( + 0x80 => 0xc4, 0x81 => 0xc5, 0x82 => 0xc7, 0x83 => 0xc9, 0x84 => 0xd1, + 0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0, 0x89 => 0xe2, + 0x8a => 0xe4, 0x8b => 0xe3, 0x8c => 0xe5, 0x8d => 0xe7, 0x8e => 0xe9, + 0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed, 0x93 => 0xec, + 0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3, 0x98 => 0xf2, + 0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa, 0x9d => 0xf9, + 0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0xdd, 0xa1 => 0xb0, 0xa4 => 0xa7, + 0xa5 => 0x2022, 0xa6 => 0xb6, 0xa7 => 0xdf, 0xa8 => 0xae, 0xaa => 0x2122, + 0xab => 0xb4, 0xac => 0xa8, 0xad => 0x2260, 0xae => 0xc6, 0xaf => 0xd8, + 0xb0 => 0x221e, 0xb2 => 0x2264, 0xb3 => 0x2265, 0xb4 => 0xa5, 0xb6 => 0x2202, + 0xb7 => 0x2211, 0xb8 => 0x220f, 0xb9 => 0x03c0, 0xba => 0x222b, 0xbb => 0xaa, + 0xbc => 0xba, 0xbd => 0x03a9, 0xbe => 0xe6, 0xbf => 0xf8, 0xc0 => 0xbf, + 0xc1 => 0xa1, 0xc2 => 0xac, 0xc3 => 0x221a, 0xc4 => 0x0192, 0xc5 => 0x2248, + 0xc6 => 0x2206, 0xc7 => 0xab, 0xc8 => 0xbb, 0xc9 => 0x2026, 0xca => 0xa0, + 0xcb => 0xc0, 0xcc => 0xc3, 0xcd => 0xd5, 0xce => 0x0152, 0xcf => 0x0153, + 0xd0 => 0x2013, 0xd1 => 0x2014, 0xd2 => 0x201c, 0xd3 => 0x201d, + 0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7, 0xd7 => 0x25ca, 0xd8 => 0xff, + 0xd9 => 0x0178, 0xda => 0x2044, 0xdb => 0x20ac, 0xdc => 0xd0, 0xdd => 0xf0, + 0xdf => 0xfe, 0xe0 => 0xfd, 0xe1 => 0xb7, 0xe2 => 0x201a, 0xe3 => 0x201e, + 0xe4 => 0x2030, 0xe5 => 0xc2, 0xe6 => 0xca, 0xe7 => 0xc1, 0xe8 => 0xcb, + 0xe9 => 0xc8, 0xea => 0xcd, 0xeb => 0xce, 0xec => 0xcf, 0xed => 0xcc, + 0xee => 0xd3, 0xef => 0xd4, 0xf0 => 0xf8ff, 0xf1 => 0xd2, 0xf2 => 0xda, + 0xf3 => 0xdb, 0xf4 => 0xd9, 0xf5 => 0x0131, 0xf6 => 0x02c6, 0xf7 => 0x02dc, + 0xf8 => 0xaf, 0xf9 => 0x02d8, 0xfa => 0x02d9, 0xfb => 0x02da, 0xfc => 0xb8, + 0xfd => 0x02dd, 0xfe => 0x02db, 0xff => 0x02c7, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacJapanese.pm b/lib/Image/ExifTool/Charset/MacJapanese.pm new file mode 100644 index 0000000..79afe55 --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacJapanese.pm @@ -0,0 +1,1933 @@ +#------------------------------------------------------------------------------ +# File: MacJapanese.pm +# +# Description: Mac Japanese to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/JAPANESE.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +# This set re-maps characters with codepoints less than 0x80 +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacJapanese = ( + 0x5c => 0xa5, 0x80 => 0x5c, 0xa1 => 0xff61, 0xa2 => 0xff62, 0xa3 => 0xff63, + 0xa4 => 0xff64, 0xa5 => 0xff65, 0xa6 => 0xff66, 0xa7 => 0xff67, + 0xa8 => 0xff68, 0xa9 => 0xff69, 0xaa => 0xff6a, 0xab => 0xff6b, + 0xac => 0xff6c, 0xad => 0xff6d, 0xae => 0xff6e, 0xaf => 0xff6f, + 0xb0 => 0xff70, 0xb1 => 0xff71, 0xb2 => 0xff72, 0xb3 => 0xff73, + 0xb4 => 0xff74, 0xb5 => 0xff75, 0xb6 => 0xff76, 0xb7 => 0xff77, + 0xb8 => 0xff78, 0xb9 => 0xff79, 0xba => 0xff7a, 0xbb => 0xff7b, + 0xbc => 0xff7c, 0xbd => 0xff7d, 0xbe => 0xff7e, 0xbf => 0xff7f, + 0xc0 => 0xff80, 0xc1 => 0xff81, 0xc2 => 0xff82, 0xc3 => 0xff83, + 0xc4 => 0xff84, 0xc5 => 0xff85, 0xc6 => 0xff86, 0xc7 => 0xff87, + 0xc8 => 0xff88, 0xc9 => 0xff89, 0xca => 0xff8a, 0xcb => 0xff8b, + 0xcc => 0xff8c, 0xcd => 0xff8d, 0xce => 0xff8e, 0xcf => 0xff8f, + 0xd0 => 0xff90, 0xd1 => 0xff91, 0xd2 => 0xff92, 0xd3 => 0xff93, + 0xd4 => 0xff94, 0xd5 => 0xff95, 0xd6 => 0xff96, 0xd7 => 0xff97, + 0xd8 => 0xff98, 0xd9 => 0xff99, 0xda => 0xff9a, 0xdb => 0xff9b, + 0xdc => 0xff9c, 0xdd => 0xff9d, 0xde => 0xff9e, 0xdf => 0xff9f, 0xfd => 0xa9, + 0xfe => 0x2122, 0xff => [0x2026,0xf87f], + 0x81 => { + 0x40 => 0x3000, 0x41 => 0x3001, 0x42 => 0x3002, 0x43 => 0xff0c, + 0x44 => 0xff0e, 0x45 => 0x30fb, 0x46 => 0xff1a, 0x47 => 0xff1b, + 0x48 => 0xff1f, 0x49 => 0xff01, 0x4a => 0x309b, 0x4b => 0x309c, + 0x4c => 0xb4, 0x4d => 0xff40, 0x4e => 0xa8, 0x4f => 0xff3e, 0x50 => 0xffe3, + 0x51 => 0xff3f, 0x52 => 0x30fd, 0x53 => 0x30fe, 0x54 => 0x309d, + 0x55 => 0x309e, 0x56 => 0x3003, 0x57 => 0x4edd, 0x58 => 0x3005, + 0x59 => 0x3006, 0x5a => 0x3007, 0x5b => 0x30fc, 0x5c => 0x2014, + 0x5d => 0x2010, 0x5e => 0xff0f, 0x5f => 0xff3c, 0x60 => 0x301c, + 0x61 => 0x2016, 0x62 => 0xff5c, 0x63 => 0x2026, 0x64 => 0x2025, + 0x65 => 0x2018, 0x66 => 0x2019, 0x67 => 0x201c, 0x68 => 0x201d, + 0x69 => 0xff08, 0x6a => 0xff09, 0x6b => 0x3014, 0x6c => 0x3015, + 0x6d => 0xff3b, 0x6e => 0xff3d, 0x6f => 0xff5b, 0x70 => 0xff5d, + 0x71 => 0x3008, 0x72 => 0x3009, 0x73 => 0x300a, 0x74 => 0x300b, + 0x75 => 0x300c, 0x76 => 0x300d, 0x77 => 0x300e, 0x78 => 0x300f, + 0x79 => 0x3010, 0x7a => 0x3011, 0x7b => 0xff0b, 0x7c => 0x2212, + 0x7d => 0xb1, 0x7e => 0xd7, 0x80 => 0xf7, 0x81 => 0xff1d, 0x82 => 0x2260, + 0x83 => 0xff1c, 0x84 => 0xff1e, 0x85 => 0x2266, 0x86 => 0x2267, + 0x87 => 0x221e, 0x88 => 0x2234, 0x89 => 0x2642, 0x8a => 0x2640, + 0x8b => 0xb0, 0x8c => 0x2032, 0x8d => 0x2033, 0x8e => 0x2103, + 0x8f => 0xffe5, 0x90 => 0xff04, 0x91 => 0xa2, 0x92 => 0xa3, 0x93 => 0xff05, + 0x94 => 0xff03, 0x95 => 0xff06, 0x96 => 0xff0a, 0x97 => 0xff20, + 0x98 => 0xa7, 0x99 => 0x2606, 0x9a => 0x2605, 0x9b => 0x25cb, + 0x9c => 0x25cf, 0x9d => 0x25ce, 0x9e => 0x25c7, 0x9f => 0x25c6, + 0xa0 => 0x25a1, 0xa1 => 0x25a0, 0xa2 => 0x25b3, 0xa3 => 0x25b2, + 0xa4 => 0x25bd, 0xa5 => 0x25bc, 0xa6 => 0x203b, 0xa7 => 0x3012, + 0xa8 => 0x2192, 0xa9 => 0x2190, 0xaa => 0x2191, 0xab => 0x2193, + 0xac => 0x3013, 0xb8 => 0x2208, 0xb9 => 0x220b, 0xba => 0x2286, + 0xbb => 0x2287, 0xbc => 0x2282, 0xbd => 0x2283, 0xbe => 0x222a, + 0xbf => 0x2229, 0xc8 => 0x2227, 0xc9 => 0x2228, 0xca => 0xac, + 0xcb => 0x21d2, 0xcc => 0x21d4, 0xcd => 0x2200, 0xce => 0x2203, + 0xda => 0x2220, 0xdb => 0x22a5, 0xdc => 0x2312, 0xdd => 0x2202, + 0xde => 0x2207, 0xdf => 0x2261, 0xe0 => 0x2252, 0xe1 => 0x226a, + 0xe2 => 0x226b, 0xe3 => 0x221a, 0xe4 => 0x223d, 0xe5 => 0x221d, + 0xe6 => 0x2235, 0xe7 => 0x222b, 0xe8 => 0x222c, 0xf0 => 0x212b, + 0xf1 => 0x2030, 0xf2 => 0x266f, 0xf3 => 0x266d, 0xf4 => 0x266a, + 0xf5 => 0x2020, 0xf6 => 0x2021, 0xf7 => 0xb6, 0xfc => 0x25ef, + }, + 0x82 => { + 0x4f => 0xff10, 0x50 => 0xff11, 0x51 => 0xff12, 0x52 => 0xff13, + 0x53 => 0xff14, 0x54 => 0xff15, 0x55 => 0xff16, 0x56 => 0xff17, + 0x57 => 0xff18, 0x58 => 0xff19, 0x60 => 0xff21, 0x61 => 0xff22, + 0x62 => 0xff23, 0x63 => 0xff24, 0x64 => 0xff25, 0x65 => 0xff26, + 0x66 => 0xff27, 0x67 => 0xff28, 0x68 => 0xff29, 0x69 => 0xff2a, + 0x6a => 0xff2b, 0x6b => 0xff2c, 0x6c => 0xff2d, 0x6d => 0xff2e, + 0x6e => 0xff2f, 0x6f => 0xff30, 0x70 => 0xff31, 0x71 => 0xff32, + 0x72 => 0xff33, 0x73 => 0xff34, 0x74 => 0xff35, 0x75 => 0xff36, + 0x76 => 0xff37, 0x77 => 0xff38, 0x78 => 0xff39, 0x79 => 0xff3a, + 0x81 => 0xff41, 0x82 => 0xff42, 0x83 => 0xff43, 0x84 => 0xff44, + 0x85 => 0xff45, 0x86 => 0xff46, 0x87 => 0xff47, 0x88 => 0xff48, + 0x89 => 0xff49, 0x8a => 0xff4a, 0x8b => 0xff4b, 0x8c => 0xff4c, + 0x8d => 0xff4d, 0x8e => 0xff4e, 0x8f => 0xff4f, 0x90 => 0xff50, + 0x91 => 0xff51, 0x92 => 0xff52, 0x93 => 0xff53, 0x94 => 0xff54, + 0x95 => 0xff55, 0x96 => 0xff56, 0x97 => 0xff57, 0x98 => 0xff58, + 0x99 => 0xff59, 0x9a => 0xff5a, 0x9f => 0x3041, 0xa0 => 0x3042, + 0xa1 => 0x3043, 0xa2 => 0x3044, 0xa3 => 0x3045, 0xa4 => 0x3046, + 0xa5 => 0x3047, 0xa6 => 0x3048, 0xa7 => 0x3049, 0xa8 => 0x304a, + 0xa9 => 0x304b, 0xaa => 0x304c, 0xab => 0x304d, 0xac => 0x304e, + 0xad => 0x304f, 0xae => 0x3050, 0xaf => 0x3051, 0xb0 => 0x3052, + 0xb1 => 0x3053, 0xb2 => 0x3054, 0xb3 => 0x3055, 0xb4 => 0x3056, + 0xb5 => 0x3057, 0xb6 => 0x3058, 0xb7 => 0x3059, 0xb8 => 0x305a, + 0xb9 => 0x305b, 0xba => 0x305c, 0xbb => 0x305d, 0xbc => 0x305e, + 0xbd => 0x305f, 0xbe => 0x3060, 0xbf => 0x3061, 0xc0 => 0x3062, + 0xc1 => 0x3063, 0xc2 => 0x3064, 0xc3 => 0x3065, 0xc4 => 0x3066, + 0xc5 => 0x3067, 0xc6 => 0x3068, 0xc7 => 0x3069, 0xc8 => 0x306a, + 0xc9 => 0x306b, 0xca => 0x306c, 0xcb => 0x306d, 0xcc => 0x306e, + 0xcd => 0x306f, 0xce => 0x3070, 0xcf => 0x3071, 0xd0 => 0x3072, + 0xd1 => 0x3073, 0xd2 => 0x3074, 0xd3 => 0x3075, 0xd4 => 0x3076, + 0xd5 => 0x3077, 0xd6 => 0x3078, 0xd7 => 0x3079, 0xd8 => 0x307a, + 0xd9 => 0x307b, 0xda => 0x307c, 0xdb => 0x307d, 0xdc => 0x307e, + 0xdd => 0x307f, 0xde => 0x3080, 0xdf => 0x3081, 0xe0 => 0x3082, + 0xe1 => 0x3083, 0xe2 => 0x3084, 0xe3 => 0x3085, 0xe4 => 0x3086, + 0xe5 => 0x3087, 0xe6 => 0x3088, 0xe7 => 0x3089, 0xe8 => 0x308a, + 0xe9 => 0x308b, 0xea => 0x308c, 0xeb => 0x308d, 0xec => 0x308e, + 0xed => 0x308f, 0xee => 0x3090, 0xef => 0x3091, 0xf0 => 0x3092, + 0xf1 => 0x3093, + }, + 0x83 => { + 0x40 => 0x30a1, 0x41 => 0x30a2, 0x42 => 0x30a3, 0x43 => 0x30a4, + 0x44 => 0x30a5, 0x45 => 0x30a6, 0x46 => 0x30a7, 0x47 => 0x30a8, + 0x48 => 0x30a9, 0x49 => 0x30aa, 0x4a => 0x30ab, 0x4b => 0x30ac, + 0x4c => 0x30ad, 0x4d => 0x30ae, 0x4e => 0x30af, 0x4f => 0x30b0, + 0x50 => 0x30b1, 0x51 => 0x30b2, 0x52 => 0x30b3, 0x53 => 0x30b4, + 0x54 => 0x30b5, 0x55 => 0x30b6, 0x56 => 0x30b7, 0x57 => 0x30b8, + 0x58 => 0x30b9, 0x59 => 0x30ba, 0x5a => 0x30bb, 0x5b => 0x30bc, + 0x5c => 0x30bd, 0x5d => 0x30be, 0x5e => 0x30bf, 0x5f => 0x30c0, + 0x60 => 0x30c1, 0x61 => 0x30c2, 0x62 => 0x30c3, 0x63 => 0x30c4, + 0x64 => 0x30c5, 0x65 => 0x30c6, 0x66 => 0x30c7, 0x67 => 0x30c8, + 0x68 => 0x30c9, 0x69 => 0x30ca, 0x6a => 0x30cb, 0x6b => 0x30cc, + 0x6c => 0x30cd, 0x6d => 0x30ce, 0x6e => 0x30cf, 0x6f => 0x30d0, + 0x70 => 0x30d1, 0x71 => 0x30d2, 0x72 => 0x30d3, 0x73 => 0x30d4, + 0x74 => 0x30d5, 0x75 => 0x30d6, 0x76 => 0x30d7, 0x77 => 0x30d8, + 0x78 => 0x30d9, 0x79 => 0x30da, 0x7a => 0x30db, 0x7b => 0x30dc, + 0x7c => 0x30dd, 0x7d => 0x30de, 0x7e => 0x30df, 0x80 => 0x30e0, + 0x81 => 0x30e1, 0x82 => 0x30e2, 0x83 => 0x30e3, 0x84 => 0x30e4, + 0x85 => 0x30e5, 0x86 => 0x30e6, 0x87 => 0x30e7, 0x88 => 0x30e8, + 0x89 => 0x30e9, 0x8a => 0x30ea, 0x8b => 0x30eb, 0x8c => 0x30ec, + 0x8d => 0x30ed, 0x8e => 0x30ee, 0x8f => 0x30ef, 0x90 => 0x30f0, + 0x91 => 0x30f1, 0x92 => 0x30f2, 0x93 => 0x30f3, 0x94 => 0x30f4, + 0x95 => 0x30f5, 0x96 => 0x30f6, 0x9f => 0x0391, 0xa0 => 0x0392, + 0xa1 => 0x0393, 0xa2 => 0x0394, 0xa3 => 0x0395, 0xa4 => 0x0396, + 0xa5 => 0x0397, 0xa6 => 0x0398, 0xa7 => 0x0399, 0xa8 => 0x039a, + 0xa9 => 0x039b, 0xaa => 0x039c, 0xab => 0x039d, 0xac => 0x039e, + 0xad => 0x039f, 0xae => 0x03a0, 0xaf => 0x03a1, 0xb0 => 0x03a3, + 0xb1 => 0x03a4, 0xb2 => 0x03a5, 0xb3 => 0x03a6, 0xb4 => 0x03a7, + 0xb5 => 0x03a8, 0xb6 => 0x03a9, 0xbf => 0x03b1, 0xc0 => 0x03b2, + 0xc1 => 0x03b3, 0xc2 => 0x03b4, 0xc3 => 0x03b5, 0xc4 => 0x03b6, + 0xc5 => 0x03b7, 0xc6 => 0x03b8, 0xc7 => 0x03b9, 0xc8 => 0x03ba, + 0xc9 => 0x03bb, 0xca => 0x03bc, 0xcb => 0x03bd, 0xcc => 0x03be, + 0xcd => 0x03bf, 0xce => 0x03c0, 0xcf => 0x03c1, 0xd0 => 0x03c3, + 0xd1 => 0x03c4, 0xd2 => 0x03c5, 0xd3 => 0x03c6, 0xd4 => 0x03c7, + 0xd5 => 0x03c8, 0xd6 => 0x03c9, + }, + 0x84 => { + 0x40 => 0x0410, 0x41 => 0x0411, 0x42 => 0x0412, 0x43 => 0x0413, + 0x44 => 0x0414, 0x45 => 0x0415, 0x46 => 0x0401, 0x47 => 0x0416, + 0x48 => 0x0417, 0x49 => 0x0418, 0x4a => 0x0419, 0x4b => 0x041a, + 0x4c => 0x041b, 0x4d => 0x041c, 0x4e => 0x041d, 0x4f => 0x041e, + 0x50 => 0x041f, 0x51 => 0x0420, 0x52 => 0x0421, 0x53 => 0x0422, + 0x54 => 0x0423, 0x55 => 0x0424, 0x56 => 0x0425, 0x57 => 0x0426, + 0x58 => 0x0427, 0x59 => 0x0428, 0x5a => 0x0429, 0x5b => 0x042a, + 0x5c => 0x042b, 0x5d => 0x042c, 0x5e => 0x042d, 0x5f => 0x042e, + 0x60 => 0x042f, 0x70 => 0x0430, 0x71 => 0x0431, 0x72 => 0x0432, + 0x73 => 0x0433, 0x74 => 0x0434, 0x75 => 0x0435, 0x76 => 0x0451, + 0x77 => 0x0436, 0x78 => 0x0437, 0x79 => 0x0438, 0x7a => 0x0439, + 0x7b => 0x043a, 0x7c => 0x043b, 0x7d => 0x043c, 0x7e => 0x043d, + 0x80 => 0x043e, 0x81 => 0x043f, 0x82 => 0x0440, 0x83 => 0x0441, + 0x84 => 0x0442, 0x85 => 0x0443, 0x86 => 0x0444, 0x87 => 0x0445, + 0x88 => 0x0446, 0x89 => 0x0447, 0x8a => 0x0448, 0x8b => 0x0449, + 0x8c => 0x044a, 0x8d => 0x044b, 0x8e => 0x044c, 0x8f => 0x044d, + 0x90 => 0x044e, 0x91 => 0x044f, 0x9f => 0x2500, 0xa0 => 0x2502, + 0xa1 => 0x250c, 0xa2 => 0x2510, 0xa3 => 0x2518, 0xa4 => 0x2514, + 0xa5 => 0x251c, 0xa6 => 0x252c, 0xa7 => 0x2524, 0xa8 => 0x2534, + 0xa9 => 0x253c, 0xaa => 0x2501, 0xab => 0x2503, 0xac => 0x250f, + 0xad => 0x2513, 0xae => 0x251b, 0xaf => 0x2517, 0xb0 => 0x2523, + 0xb1 => 0x2533, 0xb2 => 0x252b, 0xb3 => 0x253b, 0xb4 => 0x254b, + 0xb5 => 0x2520, 0xb6 => 0x252f, 0xb7 => 0x2528, 0xb8 => 0x2537, + 0xb9 => 0x253f, 0xba => 0x251d, 0xbb => 0x2530, 0xbc => 0x2525, + 0xbd => 0x2538, 0xbe => 0x2542, + }, + 0x85 => { + 0x40 => 0x2460, 0x41 => 0x2461, 0x42 => 0x2462, 0x43 => 0x2463, + 0x44 => 0x2464, 0x45 => 0x2465, 0x46 => 0x2466, 0x47 => 0x2467, + 0x48 => 0x2468, 0x49 => 0x2469, 0x4a => 0x246a, 0x4b => 0x246b, + 0x4c => 0x246c, 0x4d => 0x246d, 0x4e => 0x246e, 0x4f => 0x246f, + 0x50 => 0x2470, 0x51 => 0x2471, 0x52 => 0x2472, 0x53 => 0x2473, + 0x5e => 0x2474, 0x5f => 0x2475, 0x60 => 0x2476, 0x61 => 0x2477, + 0x62 => 0x2478, 0x63 => 0x2479, 0x64 => 0x247a, 0x65 => 0x247b, + 0x66 => 0x247c, 0x67 => 0x247d, 0x68 => 0x247e, 0x69 => 0x247f, + 0x6a => 0x2480, 0x6b => 0x2481, 0x6c => 0x2482, 0x6d => 0x2483, + 0x6e => 0x2484, 0x6f => 0x2485, 0x70 => 0x2486, 0x71 => 0x2487, + 0x7c => 0x2776, 0x7d => 0x2777, 0x7e => 0x2778, 0x80 => 0x2779, + 0x81 => 0x277a, 0x82 => 0x277b, 0x83 => 0x277c, 0x84 => 0x277d, + 0x85 => 0x277e, 0x91 => [0xf860,0x30,0x2e], 0x92 => 0x2488, 0x93 => 0x2489, + 0x94 => 0x248a, 0x95 => 0x248b, 0x96 => 0x248c, 0x97 => 0x248d, + 0x98 => 0x248e, 0x99 => 0x248f, 0x9a => 0x2490, 0x9f => 0x2160, + 0xa0 => 0x2161, 0xa1 => 0x2162, 0xa2 => 0x2163, 0xa3 => 0x2164, + 0xa4 => 0x2165, 0xa5 => 0x2166, 0xa6 => 0x2167, 0xa7 => 0x2168, + 0xa8 => 0x2169, 0xa9 => 0x216a, 0xaa => 0x216b, + 0xab => [0xf862,0x58,0x49,0x49,0x49], 0xac => [0xf861,0x58,0x49,0x56], + 0xad => [0xf860,0x58,0x56], 0xb3 => 0x2170, 0xb4 => 0x2171, 0xb5 => 0x2172, + 0xb6 => 0x2173, 0xb7 => 0x2174, 0xb8 => 0x2175, 0xb9 => 0x2176, + 0xba => 0x2177, 0xbb => 0x2178, 0xbc => 0x2179, 0xbd => 0x217a, + 0xbe => 0x217b, 0xbf => [0xf862,0x78,0x69,0x69,0x69], + 0xc0 => [0xf861,0x78,0x69,0x76], 0xc1 => [0xf860,0x78,0x76], 0xdb => 0x249c, + 0xdc => 0x249d, 0xdd => 0x249e, 0xde => 0x249f, 0xdf => 0x24a0, + 0xe0 => 0x24a1, 0xe1 => 0x24a2, 0xe2 => 0x24a3, 0xe3 => 0x24a4, + 0xe4 => 0x24a5, 0xe5 => 0x24a6, 0xe6 => 0x24a7, 0xe7 => 0x24a8, + 0xe8 => 0x24a9, 0xe9 => 0x24aa, 0xea => 0x24ab, 0xeb => 0x24ac, + 0xec => 0x24ad, 0xed => 0x24ae, 0xee => 0x24af, 0xef => 0x24b0, + 0xf0 => 0x24b1, 0xf1 => 0x24b2, 0xf2 => 0x24b3, 0xf3 => 0x24b4, + 0xf4 => 0x24b5, + }, + 0x86 => { + 0x40 => 0x339c, 0x41 => 0x339f, 0x42 => 0x339d, 0x43 => 0x33a0, + 0x44 => 0x33a4, 0x45 => [0xff4d,0xf87f], 0x46 => 0x33a1, 0x47 => 0x33a5, + 0x48 => 0x339e, 0x49 => 0x33a2, 0x4a => 0x338e, 0x4b => [0xff47,0xf87f], + 0x4c => 0x338f, 0x4d => 0x33c4, 0x4e => 0x3396, 0x4f => 0x3397, + 0x50 => 0x2113, 0x51 => 0x3398, 0x52 => 0x33b3, 0x53 => 0x33b2, + 0x54 => 0x33b1, 0x55 => 0x33b0, 0x56 => 0x2109, 0x57 => 0x33d4, + 0x58 => 0x33cb, 0x59 => 0x3390, 0x5a => 0x3385, 0x5b => 0x3386, + 0x5c => 0x3387, 0x5d => [0xf860,0x54,0x42], 0x9b => 0x2116, 0x9c => 0x33cd, + 0x9d => 0x2121, 0x9e => [0xf861,0x46,0x41,0x58], 0x9f => 0x2664, + 0xa0 => 0x2667, 0xa1 => 0x2661, 0xa2 => 0x2662, 0xa3 => 0x2660, + 0xa4 => 0x2663, 0xa5 => 0x2665, 0xa6 => 0x2666, 0xb3 => 0x3020, + 0xb4 => 0x260e, 0xb5 => 0x3004, 0xc7 => 0x261e, 0xc8 => 0x261c, + 0xc9 => 0x261d, 0xca => 0x261f, 0xcb => 0x21c6, 0xcc => 0x21c4, + 0xcd => 0x21c5, 0xce => [0xf860,0x2193,0x2191], 0xcf => 0x21e8, + 0xd0 => 0x21e6, 0xd1 => 0x21e7, 0xd2 => 0x21e9, 0xd3 => [0x21e8,0xf87a], + 0xd4 => [0x21e6,0xf87a], 0xd5 => [0x21e7,0xf87a], 0xd6 => [0x21e9,0xf87a], + }, + 0x87 => { + 0x40 => 0x3230, 0x41 => 0x322a, 0x42 => 0x322b, 0x43 => 0x322c, + 0x44 => 0x322d, 0x45 => 0x322e, 0x46 => 0x322f, 0x47 => 0x3240, + 0x48 => 0x3237, 0x49 => 0x3242, 0x4a => 0x3243, 0x4b => 0x3239, + 0x4c => 0x323a, 0x4d => 0x3231, 0x4e => 0x323e, 0x4f => 0x3234, + 0x50 => 0x3232, 0x51 => 0x323b, 0x52 => 0x3236, 0x53 => 0x3233, + 0x54 => 0x3235, 0x55 => 0x323c, 0x56 => 0x323d, 0x57 => 0x323f, + 0x58 => 0x3238, 0x91 => [0x5927,0x20dd], 0x92 => [0x5c0f,0x20dd], + 0x93 => 0x32a4, 0x94 => 0x32a5, 0x95 => 0x32a6, 0x96 => 0x32a7, + 0x97 => 0x32a8, 0x98 => 0x32a9, 0x99 => 0x3296, 0x9a => 0x329d, + 0x9b => 0x3298, 0x9c => 0x329e, 0x9d => [0x63a7,0x20dd], 0x9e => 0x3299, + 0x9f => 0x3349, 0xa0 => 0x3322, 0xa1 => 0x334d, 0xa2 => 0x3314, + 0xa3 => 0x3316, 0xa4 => 0x3305, 0xa5 => 0x3333, 0xa6 => 0x334e, + 0xa7 => 0x3303, 0xa8 => 0x3336, 0xa9 => 0x3318, 0xaa => 0x3315, + 0xab => 0x3327, 0xac => 0x3351, 0xad => 0x334a, 0xae => 0x3339, + 0xaf => 0x3357, 0xb0 => 0x330d, 0xb1 => 0x3342, 0xb2 => 0x3323, + 0xb3 => 0x3326, 0xb4 => 0x333b, 0xb5 => 0x332b, 0xbd => 0x3300, + 0xbe => 0x331e, 0xbf => 0x332a, 0xc0 => 0x3331, 0xc1 => 0x3347, + 0xe5 => 0x337e, 0xe6 => 0x337d, 0xe7 => 0x337c, 0xe8 => 0x337b, + 0xfa => 0x337f, 0xfb => [0xf862,0x6709,0x9650,0x4f1a,0x793e], + 0xfc => [0xf862,0x8ca1,0x56e3,0x6cd5,0x4eba], + }, + 0x88 => { + 0x40 => 0x222e, 0x41 => 0x221f, 0x42 => 0x22bf, 0x54 => 0x301d, + 0x55 => 0x301f, 0x68 => 0x3094, 0x6a => 0x30f7, 0x6b => 0x30f8, + 0x6c => 0x30f9, 0x6d => 0x30fa, 0x9f => 0x4e9c, 0xa0 => 0x5516, + 0xa1 => 0x5a03, 0xa2 => 0x963f, 0xa3 => 0x54c0, 0xa4 => 0x611b, + 0xa5 => 0x6328, 0xa6 => 0x59f6, 0xa7 => 0x9022, 0xa8 => 0x8475, + 0xa9 => 0x831c, 0xaa => 0x7a50, 0xab => 0x60aa, 0xac => 0x63e1, + 0xad => 0x6e25, 0xae => 0x65ed, 0xaf => 0x8466, 0xb0 => 0x82a6, + 0xb1 => 0x9bf5, 0xb2 => 0x6893, 0xb3 => 0x5727, 0xb4 => 0x65a1, + 0xb5 => 0x6271, 0xb6 => 0x5b9b, 0xb7 => 0x59d0, 0xb8 => 0x867b, + 0xb9 => 0x98f4, 0xba => 0x7d62, 0xbb => 0x7dbe, 0xbc => 0x9b8e, + 0xbd => 0x6216, 0xbe => 0x7c9f, 0xbf => 0x88b7, 0xc0 => 0x5b89, + 0xc1 => 0x5eb5, 0xc2 => 0x6309, 0xc3 => 0x6697, 0xc4 => 0x6848, + 0xc5 => 0x95c7, 0xc6 => 0x978d, 0xc7 => 0x674f, 0xc8 => 0x4ee5, + 0xc9 => 0x4f0a, 0xca => 0x4f4d, 0xcb => 0x4f9d, 0xcc => 0x5049, + 0xcd => 0x56f2, 0xce => 0x5937, 0xcf => 0x59d4, 0xd0 => 0x5a01, + 0xd1 => 0x5c09, 0xd2 => 0x60df, 0xd3 => 0x610f, 0xd4 => 0x6170, + 0xd5 => 0x6613, 0xd6 => 0x6905, 0xd7 => 0x70ba, 0xd8 => 0x754f, + 0xd9 => 0x7570, 0xda => 0x79fb, 0xdb => 0x7dad, 0xdc => 0x7def, + 0xdd => 0x80c3, 0xde => 0x840e, 0xdf => 0x8863, 0xe0 => 0x8b02, + 0xe1 => 0x9055, 0xe2 => 0x907a, 0xe3 => 0x533b, 0xe4 => 0x4e95, + 0xe5 => 0x4ea5, 0xe6 => 0x57df, 0xe7 => 0x80b2, 0xe8 => 0x90c1, + 0xe9 => 0x78ef, 0xea => 0x4e00, 0xeb => 0x58f1, 0xec => 0x6ea2, + 0xed => 0x9038, 0xee => 0x7a32, 0xef => 0x8328, 0xf0 => 0x828b, + 0xf1 => 0x9c2f, 0xf2 => 0x5141, 0xf3 => 0x5370, 0xf4 => 0x54bd, + 0xf5 => 0x54e1, 0xf6 => 0x56e0, 0xf7 => 0x59fb, 0xf8 => 0x5f15, + 0xf9 => 0x98f2, 0xfa => 0x6deb, 0xfb => 0x80e4, 0xfc => 0x852d, + }, + 0x89 => { + 0x40 => 0x9662, 0x41 => 0x9670, 0x42 => 0x96a0, 0x43 => 0x97fb, + 0x44 => 0x540b, 0x45 => 0x53f3, 0x46 => 0x5b87, 0x47 => 0x70cf, + 0x48 => 0x7fbd, 0x49 => 0x8fc2, 0x4a => 0x96e8, 0x4b => 0x536f, + 0x4c => 0x9d5c, 0x4d => 0x7aba, 0x4e => 0x4e11, 0x4f => 0x7893, + 0x50 => 0x81fc, 0x51 => 0x6e26, 0x52 => 0x5618, 0x53 => 0x5504, + 0x54 => 0x6b1d, 0x55 => 0x851a, 0x56 => 0x9c3b, 0x57 => 0x59e5, + 0x58 => 0x53a9, 0x59 => 0x6d66, 0x5a => 0x74dc, 0x5b => 0x958f, + 0x5c => 0x5642, 0x5d => 0x4e91, 0x5e => 0x904b, 0x5f => 0x96f2, + 0x60 => 0x834f, 0x61 => 0x990c, 0x62 => 0x53e1, 0x63 => 0x55b6, + 0x64 => 0x5b30, 0x65 => 0x5f71, 0x66 => 0x6620, 0x67 => 0x66f3, + 0x68 => 0x6804, 0x69 => 0x6c38, 0x6a => 0x6cf3, 0x6b => 0x6d29, + 0x6c => 0x745b, 0x6d => 0x76c8, 0x6e => 0x7a4e, 0x6f => 0x9834, + 0x70 => 0x82f1, 0x71 => 0x885b, 0x72 => 0x8a60, 0x73 => 0x92ed, + 0x74 => 0x6db2, 0x75 => 0x75ab, 0x76 => 0x76ca, 0x77 => 0x99c5, + 0x78 => 0x60a6, 0x79 => 0x8b01, 0x7a => 0x8d8a, 0x7b => 0x95b2, + 0x7c => 0x698e, 0x7d => 0x53ad, 0x7e => 0x5186, 0x80 => 0x5712, + 0x81 => 0x5830, 0x82 => 0x5944, 0x83 => 0x5bb4, 0x84 => 0x5ef6, + 0x85 => 0x6028, 0x86 => 0x63a9, 0x87 => 0x63f4, 0x88 => 0x6cbf, + 0x89 => 0x6f14, 0x8a => 0x708e, 0x8b => 0x7114, 0x8c => 0x7159, + 0x8d => 0x71d5, 0x8e => 0x733f, 0x8f => 0x7e01, 0x90 => 0x8276, + 0x91 => 0x82d1, 0x92 => 0x8597, 0x93 => 0x9060, 0x94 => 0x925b, + 0x95 => 0x9d1b, 0x96 => 0x5869, 0x97 => 0x65bc, 0x98 => 0x6c5a, + 0x99 => 0x7525, 0x9a => 0x51f9, 0x9b => 0x592e, 0x9c => 0x5965, + 0x9d => 0x5f80, 0x9e => 0x5fdc, 0x9f => 0x62bc, 0xa0 => 0x65fa, + 0xa1 => 0x6a2a, 0xa2 => 0x6b27, 0xa3 => 0x6bb4, 0xa4 => 0x738b, + 0xa5 => 0x7fc1, 0xa6 => 0x8956, 0xa7 => 0x9d2c, 0xa8 => 0x9d0e, + 0xa9 => 0x9ec4, 0xaa => 0x5ca1, 0xab => 0x6c96, 0xac => 0x837b, + 0xad => 0x5104, 0xae => 0x5c4b, 0xaf => 0x61b6, 0xb0 => 0x81c6, + 0xb1 => 0x6876, 0xb2 => 0x7261, 0xb3 => 0x4e59, 0xb4 => 0x4ffa, + 0xb5 => 0x5378, 0xb6 => 0x6069, 0xb7 => 0x6e29, 0xb8 => 0x7a4f, + 0xb9 => 0x97f3, 0xba => 0x4e0b, 0xbb => 0x5316, 0xbc => 0x4eee, + 0xbd => 0x4f55, 0xbe => 0x4f3d, 0xbf => 0x4fa1, 0xc0 => 0x4f73, + 0xc1 => 0x52a0, 0xc2 => 0x53ef, 0xc3 => 0x5609, 0xc4 => 0x590f, + 0xc5 => 0x5ac1, 0xc6 => 0x5bb6, 0xc7 => 0x5be1, 0xc8 => 0x79d1, + 0xc9 => 0x6687, 0xca => 0x679c, 0xcb => 0x67b6, 0xcc => 0x6b4c, + 0xcd => 0x6cb3, 0xce => 0x706b, 0xcf => 0x73c2, 0xd0 => 0x798d, + 0xd1 => 0x79be, 0xd2 => 0x7a3c, 0xd3 => 0x7b87, 0xd4 => 0x82b1, + 0xd5 => 0x82db, 0xd6 => 0x8304, 0xd7 => 0x8377, 0xd8 => 0x83ef, + 0xd9 => 0x83d3, 0xda => 0x8766, 0xdb => 0x8ab2, 0xdc => 0x5629, + 0xdd => 0x8ca8, 0xde => 0x8fe6, 0xdf => 0x904e, 0xe0 => 0x971e, + 0xe1 => 0x868a, 0xe2 => 0x4fc4, 0xe3 => 0x5ce8, 0xe4 => 0x6211, + 0xe5 => 0x7259, 0xe6 => 0x753b, 0xe7 => 0x81e5, 0xe8 => 0x82bd, + 0xe9 => 0x86fe, 0xea => 0x8cc0, 0xeb => 0x96c5, 0xec => 0x9913, + 0xed => 0x99d5, 0xee => 0x4ecb, 0xef => 0x4f1a, 0xf0 => 0x89e3, + 0xf1 => 0x56de, 0xf2 => 0x584a, 0xf3 => 0x58ca, 0xf4 => 0x5efb, + 0xf5 => 0x5feb, 0xf6 => 0x602a, 0xf7 => 0x6094, 0xf8 => 0x6062, + 0xf9 => 0x61d0, 0xfa => 0x6212, 0xfb => 0x62d0, 0xfc => 0x6539, + }, + 0x8a => { + 0x40 => 0x9b41, 0x41 => 0x6666, 0x42 => 0x68b0, 0x43 => 0x6d77, + 0x44 => 0x7070, 0x45 => 0x754c, 0x46 => 0x7686, 0x47 => 0x7d75, + 0x48 => 0x82a5, 0x49 => 0x87f9, 0x4a => 0x958b, 0x4b => 0x968e, + 0x4c => 0x8c9d, 0x4d => 0x51f1, 0x4e => 0x52be, 0x4f => 0x5916, + 0x50 => 0x54b3, 0x51 => 0x5bb3, 0x52 => 0x5d16, 0x53 => 0x6168, + 0x54 => 0x6982, 0x55 => 0x6daf, 0x56 => 0x788d, 0x57 => 0x84cb, + 0x58 => 0x8857, 0x59 => 0x8a72, 0x5a => 0x93a7, 0x5b => 0x9ab8, + 0x5c => 0x6d6c, 0x5d => 0x99a8, 0x5e => 0x86d9, 0x5f => 0x57a3, + 0x60 => 0x67ff, 0x61 => 0x86ce, 0x62 => 0x920e, 0x63 => 0x5283, + 0x64 => 0x5687, 0x65 => 0x5404, 0x66 => 0x5ed3, 0x67 => 0x62e1, + 0x68 => 0x64b9, 0x69 => 0x683c, 0x6a => 0x6838, 0x6b => 0x6bbb, + 0x6c => 0x7372, 0x6d => 0x78ba, 0x6e => 0x7a6b, 0x6f => 0x899a, + 0x70 => 0x89d2, 0x71 => 0x8d6b, 0x72 => 0x8f03, 0x73 => 0x90ed, + 0x74 => 0x95a3, 0x75 => 0x9694, 0x76 => 0x9769, 0x77 => 0x5b66, + 0x78 => 0x5cb3, 0x79 => 0x697d, 0x7a => 0x984d, 0x7b => 0x984e, + 0x7c => 0x639b, 0x7d => 0x7b20, 0x7e => 0x6a2b, 0x80 => 0x6a7f, + 0x81 => 0x68b6, 0x82 => 0x9c0d, 0x83 => 0x6f5f, 0x84 => 0x5272, + 0x85 => 0x559d, 0x86 => 0x6070, 0x87 => 0x62ec, 0x88 => 0x6d3b, + 0x89 => 0x6e07, 0x8a => 0x6ed1, 0x8b => 0x845b, 0x8c => 0x8910, + 0x8d => 0x8f44, 0x8e => 0x4e14, 0x8f => 0x9c39, 0x90 => 0x53f6, + 0x91 => 0x691b, 0x92 => 0x6a3a, 0x93 => 0x9784, 0x94 => 0x682a, + 0x95 => 0x515c, 0x96 => 0x7ac3, 0x97 => 0x84b2, 0x98 => 0x91dc, + 0x99 => 0x938c, 0x9a => 0x565b, 0x9b => 0x9d28, 0x9c => 0x6822, + 0x9d => 0x8305, 0x9e => 0x8431, 0x9f => 0x7ca5, 0xa0 => 0x5208, + 0xa1 => 0x82c5, 0xa2 => 0x74e6, 0xa3 => 0x4e7e, 0xa4 => 0x4f83, + 0xa5 => 0x51a0, 0xa6 => 0x5bd2, 0xa7 => 0x520a, 0xa8 => 0x52d8, + 0xa9 => 0x52e7, 0xaa => 0x5dfb, 0xab => 0x559a, 0xac => 0x582a, + 0xad => 0x59e6, 0xae => 0x5b8c, 0xaf => 0x5b98, 0xb0 => 0x5bdb, + 0xb1 => 0x5e72, 0xb2 => 0x5e79, 0xb3 => 0x60a3, 0xb4 => 0x611f, + 0xb5 => 0x6163, 0xb6 => 0x61be, 0xb7 => 0x63db, 0xb8 => 0x6562, + 0xb9 => 0x67d1, 0xba => 0x6853, 0xbb => 0x68fa, 0xbc => 0x6b3e, + 0xbd => 0x6b53, 0xbe => 0x6c57, 0xbf => 0x6f22, 0xc0 => 0x6f97, + 0xc1 => 0x6f45, 0xc2 => 0x74b0, 0xc3 => 0x7518, 0xc4 => 0x76e3, + 0xc5 => 0x770b, 0xc6 => 0x7aff, 0xc7 => 0x7ba1, 0xc8 => 0x7c21, + 0xc9 => 0x7de9, 0xca => 0x7f36, 0xcb => 0x7ff0, 0xcc => 0x809d, + 0xcd => 0x8266, 0xce => 0x839e, 0xcf => 0x89b3, 0xd0 => 0x8acc, + 0xd1 => 0x8cab, 0xd2 => 0x9084, 0xd3 => 0x9451, 0xd4 => 0x9593, + 0xd5 => 0x9591, 0xd6 => 0x95a2, 0xd7 => 0x9665, 0xd8 => 0x97d3, + 0xd9 => 0x9928, 0xda => 0x8218, 0xdb => 0x4e38, 0xdc => 0x542b, + 0xdd => 0x5cb8, 0xde => 0x5dcc, 0xdf => 0x73a9, 0xe0 => 0x764c, + 0xe1 => 0x773c, 0xe2 => 0x5ca9, 0xe3 => 0x7feb, 0xe4 => 0x8d0b, + 0xe5 => 0x96c1, 0xe6 => 0x9811, 0xe7 => 0x9854, 0xe8 => 0x9858, + 0xe9 => 0x4f01, 0xea => 0x4f0e, 0xeb => 0x5371, 0xec => 0x559c, + 0xed => 0x5668, 0xee => 0x57fa, 0xef => 0x5947, 0xf0 => 0x5b09, + 0xf1 => 0x5bc4, 0xf2 => 0x5c90, 0xf3 => 0x5e0c, 0xf4 => 0x5e7e, + 0xf5 => 0x5fcc, 0xf6 => 0x63ee, 0xf7 => 0x673a, 0xf8 => 0x65d7, + 0xf9 => 0x65e2, 0xfa => 0x671f, 0xfb => 0x68cb, 0xfc => 0x68c4, + }, + 0x8b => { + 0x40 => 0x6a5f, 0x41 => 0x5e30, 0x42 => 0x6bc5, 0x43 => 0x6c17, + 0x44 => 0x6c7d, 0x45 => 0x757f, 0x46 => 0x7948, 0x47 => 0x5b63, + 0x48 => 0x7a00, 0x49 => 0x7d00, 0x4a => 0x5fbd, 0x4b => 0x898f, + 0x4c => 0x8a18, 0x4d => 0x8cb4, 0x4e => 0x8d77, 0x4f => 0x8ecc, + 0x50 => 0x8f1d, 0x51 => 0x98e2, 0x52 => 0x9a0e, 0x53 => 0x9b3c, + 0x54 => 0x4e80, 0x55 => 0x507d, 0x56 => 0x5100, 0x57 => 0x5993, + 0x58 => 0x5b9c, 0x59 => 0x622f, 0x5a => 0x6280, 0x5b => 0x64ec, + 0x5c => 0x6b3a, 0x5d => 0x72a0, 0x5e => 0x7591, 0x5f => 0x7947, + 0x60 => 0x7fa9, 0x61 => 0x87fb, 0x62 => 0x8abc, 0x63 => 0x8b70, + 0x64 => 0x63ac, 0x65 => 0x83ca, 0x66 => 0x97a0, 0x67 => 0x5409, + 0x68 => 0x5403, 0x69 => 0x55ab, 0x6a => 0x6854, 0x6b => 0x6a58, + 0x6c => 0x8a70, 0x6d => 0x7827, 0x6e => 0x6775, 0x6f => 0x9ecd, + 0x70 => 0x5374, 0x71 => 0x5ba2, 0x72 => 0x811a, 0x73 => 0x8650, + 0x74 => 0x9006, 0x75 => 0x4e18, 0x76 => 0x4e45, 0x77 => 0x4ec7, + 0x78 => 0x4f11, 0x79 => 0x53ca, 0x7a => 0x5438, 0x7b => 0x5bae, + 0x7c => 0x5f13, 0x7d => 0x6025, 0x7e => 0x6551, 0x80 => 0x673d, + 0x81 => 0x6c42, 0x82 => 0x6c72, 0x83 => 0x6ce3, 0x84 => 0x7078, + 0x85 => 0x7403, 0x86 => 0x7a76, 0x87 => 0x7aae, 0x88 => 0x7b08, + 0x89 => 0x7d1a, 0x8a => 0x7cfe, 0x8b => 0x7d66, 0x8c => 0x65e7, + 0x8d => 0x725b, 0x8e => 0x53bb, 0x8f => 0x5c45, 0x90 => 0x5de8, + 0x91 => 0x62d2, 0x92 => 0x62e0, 0x93 => 0x6319, 0x94 => 0x6e20, + 0x95 => 0x865a, 0x96 => 0x8a31, 0x97 => 0x8ddd, 0x98 => 0x92f8, + 0x99 => 0x6f01, 0x9a => 0x79a6, 0x9b => 0x9b5a, 0x9c => 0x4ea8, + 0x9d => 0x4eab, 0x9e => 0x4eac, 0x9f => 0x4f9b, 0xa0 => 0x4fa0, + 0xa1 => 0x50d1, 0xa2 => 0x5147, 0xa3 => 0x7af6, 0xa4 => 0x5171, + 0xa5 => 0x51f6, 0xa6 => 0x5354, 0xa7 => 0x5321, 0xa8 => 0x537f, + 0xa9 => 0x53eb, 0xaa => 0x55ac, 0xab => 0x5883, 0xac => 0x5ce1, + 0xad => 0x5f37, 0xae => 0x5f4a, 0xaf => 0x602f, 0xb0 => 0x6050, + 0xb1 => 0x606d, 0xb2 => 0x631f, 0xb3 => 0x6559, 0xb4 => 0x6a4b, + 0xb5 => 0x6cc1, 0xb6 => 0x72c2, 0xb7 => 0x72ed, 0xb8 => 0x77ef, + 0xb9 => 0x80f8, 0xba => 0x8105, 0xbb => 0x8208, 0xbc => 0x854e, + 0xbd => 0x90f7, 0xbe => 0x93e1, 0xbf => 0x97ff, 0xc0 => 0x9957, + 0xc1 => 0x9a5a, 0xc2 => 0x4ef0, 0xc3 => 0x51dd, 0xc4 => 0x5c2d, + 0xc5 => 0x6681, 0xc6 => 0x696d, 0xc7 => 0x5c40, 0xc8 => 0x66f2, + 0xc9 => 0x6975, 0xca => 0x7389, 0xcb => 0x6850, 0xcc => 0x7c81, + 0xcd => 0x50c5, 0xce => 0x52e4, 0xcf => 0x5747, 0xd0 => 0x5dfe, + 0xd1 => 0x9326, 0xd2 => 0x65a4, 0xd3 => 0x6b23, 0xd4 => 0x6b3d, + 0xd5 => 0x7434, 0xd6 => 0x7981, 0xd7 => 0x79bd, 0xd8 => 0x7b4b, + 0xd9 => 0x7dca, 0xda => 0x82b9, 0xdb => 0x83cc, 0xdc => 0x887f, + 0xdd => 0x895f, 0xde => 0x8b39, 0xdf => 0x8fd1, 0xe0 => 0x91d1, + 0xe1 => 0x541f, 0xe2 => 0x9280, 0xe3 => 0x4e5d, 0xe4 => 0x5036, + 0xe5 => 0x53e5, 0xe6 => 0x533a, 0xe7 => 0x72d7, 0xe8 => 0x7396, + 0xe9 => 0x77e9, 0xea => 0x82e6, 0xeb => 0x8eaf, 0xec => 0x99c6, + 0xed => 0x99c8, 0xee => 0x99d2, 0xef => 0x5177, 0xf0 => 0x611a, + 0xf1 => 0x865e, 0xf2 => 0x55b0, 0xf3 => 0x7a7a, 0xf4 => 0x5076, + 0xf5 => 0x5bd3, 0xf6 => 0x9047, 0xf7 => 0x9685, 0xf8 => 0x4e32, + 0xf9 => 0x6adb, 0xfa => 0x91e7, 0xfb => 0x5c51, 0xfc => 0x5c48, + }, + 0x8c => { + 0x40 => 0x6398, 0x41 => 0x7a9f, 0x42 => 0x6c93, 0x43 => 0x9774, + 0x44 => 0x8f61, 0x45 => 0x7aaa, 0x46 => 0x718a, 0x47 => 0x9688, + 0x48 => 0x7c82, 0x49 => 0x6817, 0x4a => 0x7e70, 0x4b => 0x6851, + 0x4c => 0x936c, 0x4d => 0x52f2, 0x4e => 0x541b, 0x4f => 0x85ab, + 0x50 => 0x8a13, 0x51 => 0x7fa4, 0x52 => 0x8ecd, 0x53 => 0x90e1, + 0x54 => 0x5366, 0x55 => 0x8888, 0x56 => 0x7941, 0x57 => 0x4fc2, + 0x58 => 0x50be, 0x59 => 0x5211, 0x5a => 0x5144, 0x5b => 0x5553, + 0x5c => 0x572d, 0x5d => 0x73ea, 0x5e => 0x578b, 0x5f => 0x5951, + 0x60 => 0x5f62, 0x61 => 0x5f84, 0x62 => 0x6075, 0x63 => 0x6176, + 0x64 => 0x6167, 0x65 => 0x61a9, 0x66 => 0x63b2, 0x67 => 0x643a, + 0x68 => 0x656c, 0x69 => 0x666f, 0x6a => 0x6842, 0x6b => 0x6e13, + 0x6c => 0x7566, 0x6d => 0x7a3d, 0x6e => 0x7cfb, 0x6f => 0x7d4c, + 0x70 => 0x7d99, 0x71 => 0x7e4b, 0x72 => 0x7f6b, 0x73 => 0x830e, + 0x74 => 0x834a, 0x75 => 0x86cd, 0x76 => 0x8a08, 0x77 => 0x8a63, + 0x78 => 0x8b66, 0x79 => 0x8efd, 0x7a => 0x981a, 0x7b => 0x9d8f, + 0x7c => 0x82b8, 0x7d => 0x8fce, 0x7e => 0x9be8, 0x80 => 0x5287, + 0x81 => 0x621f, 0x82 => 0x6483, 0x83 => 0x6fc0, 0x84 => 0x9699, + 0x85 => 0x6841, 0x86 => 0x5091, 0x87 => 0x6b20, 0x88 => 0x6c7a, + 0x89 => 0x6f54, 0x8a => 0x7a74, 0x8b => 0x7d50, 0x8c => 0x8840, + 0x8d => 0x8a23, 0x8e => 0x6708, 0x8f => 0x4ef6, 0x90 => 0x5039, + 0x91 => 0x5026, 0x92 => 0x5065, 0x93 => 0x517c, 0x94 => 0x5238, + 0x95 => 0x5263, 0x96 => 0x55a7, 0x97 => 0x570f, 0x98 => 0x5805, + 0x99 => 0x5acc, 0x9a => 0x5efa, 0x9b => 0x61b2, 0x9c => 0x61f8, + 0x9d => 0x62f3, 0x9e => 0x6372, 0x9f => 0x691c, 0xa0 => 0x6a29, + 0xa1 => 0x727d, 0xa2 => 0x72ac, 0xa3 => 0x732e, 0xa4 => 0x7814, + 0xa5 => 0x786f, 0xa6 => 0x7d79, 0xa7 => 0x770c, 0xa8 => 0x80a9, + 0xa9 => 0x898b, 0xaa => 0x8b19, 0xab => 0x8ce2, 0xac => 0x8ed2, + 0xad => 0x9063, 0xae => 0x9375, 0xaf => 0x967a, 0xb0 => 0x9855, + 0xb1 => 0x9a13, 0xb2 => 0x9e78, 0xb3 => 0x5143, 0xb4 => 0x539f, + 0xb5 => 0x53b3, 0xb6 => 0x5e7b, 0xb7 => 0x5f26, 0xb8 => 0x6e1b, + 0xb9 => 0x6e90, 0xba => 0x7384, 0xbb => 0x73fe, 0xbc => 0x7d43, + 0xbd => 0x8237, 0xbe => 0x8a00, 0xbf => 0x8afa, 0xc0 => 0x9650, + 0xc1 => 0x4e4e, 0xc2 => 0x500b, 0xc3 => 0x53e4, 0xc4 => 0x547c, + 0xc5 => 0x56fa, 0xc6 => 0x59d1, 0xc7 => 0x5b64, 0xc8 => 0x5df1, + 0xc9 => 0x5eab, 0xca => 0x5f27, 0xcb => 0x6238, 0xcc => 0x6545, + 0xcd => 0x67af, 0xce => 0x6e56, 0xcf => 0x72d0, 0xd0 => 0x7cca, + 0xd1 => 0x88b4, 0xd2 => 0x80a1, 0xd3 => 0x80e1, 0xd4 => 0x83f0, + 0xd5 => 0x864e, 0xd6 => 0x8a87, 0xd7 => 0x8de8, 0xd8 => 0x9237, + 0xd9 => 0x96c7, 0xda => 0x9867, 0xdb => 0x9f13, 0xdc => 0x4e94, + 0xdd => 0x4e92, 0xde => 0x4f0d, 0xdf => 0x5348, 0xe0 => 0x5449, + 0xe1 => 0x543e, 0xe2 => 0x5a2f, 0xe3 => 0x5f8c, 0xe4 => 0x5fa1, + 0xe5 => 0x609f, 0xe6 => 0x68a7, 0xe7 => 0x6a8e, 0xe8 => 0x745a, + 0xe9 => 0x7881, 0xea => 0x8a9e, 0xeb => 0x8aa4, 0xec => 0x8b77, + 0xed => 0x9190, 0xee => 0x4e5e, 0xef => 0x9bc9, 0xf0 => 0x4ea4, + 0xf1 => 0x4f7c, 0xf2 => 0x4faf, 0xf3 => 0x5019, 0xf4 => 0x5016, + 0xf5 => 0x5149, 0xf6 => 0x516c, 0xf7 => 0x529f, 0xf8 => 0x52b9, + 0xf9 => 0x52fe, 0xfa => 0x539a, 0xfb => 0x53e3, 0xfc => 0x5411, + }, + 0x8d => { + 0x40 => 0x540e, 0x41 => 0x5589, 0x42 => 0x5751, 0x43 => 0x57a2, + 0x44 => 0x597d, 0x45 => 0x5b54, 0x46 => 0x5b5d, 0x47 => 0x5b8f, + 0x48 => 0x5de5, 0x49 => 0x5de7, 0x4a => 0x5df7, 0x4b => 0x5e78, + 0x4c => 0x5e83, 0x4d => 0x5e9a, 0x4e => 0x5eb7, 0x4f => 0x5f18, + 0x50 => 0x6052, 0x51 => 0x614c, 0x52 => 0x6297, 0x53 => 0x62d8, + 0x54 => 0x63a7, 0x55 => 0x653b, 0x56 => 0x6602, 0x57 => 0x6643, + 0x58 => 0x66f4, 0x59 => 0x676d, 0x5a => 0x6821, 0x5b => 0x6897, + 0x5c => 0x69cb, 0x5d => 0x6c5f, 0x5e => 0x6d2a, 0x5f => 0x6d69, + 0x60 => 0x6e2f, 0x61 => 0x6e9d, 0x62 => 0x7532, 0x63 => 0x7687, + 0x64 => 0x786c, 0x65 => 0x7a3f, 0x66 => 0x7ce0, 0x67 => 0x7d05, + 0x68 => 0x7d18, 0x69 => 0x7d5e, 0x6a => 0x7db1, 0x6b => 0x8015, + 0x6c => 0x8003, 0x6d => 0x80af, 0x6e => 0x80b1, 0x6f => 0x8154, + 0x70 => 0x818f, 0x71 => 0x822a, 0x72 => 0x8352, 0x73 => 0x884c, + 0x74 => 0x8861, 0x75 => 0x8b1b, 0x76 => 0x8ca2, 0x77 => 0x8cfc, + 0x78 => 0x90ca, 0x79 => 0x9175, 0x7a => 0x9271, 0x7b => 0x783f, + 0x7c => 0x92fc, 0x7d => 0x95a4, 0x7e => 0x964d, 0x80 => 0x9805, + 0x81 => 0x9999, 0x82 => 0x9ad8, 0x83 => 0x9d3b, 0x84 => 0x525b, + 0x85 => 0x52ab, 0x86 => 0x53f7, 0x87 => 0x5408, 0x88 => 0x58d5, + 0x89 => 0x62f7, 0x8a => 0x6fe0, 0x8b => 0x8c6a, 0x8c => 0x8f5f, + 0x8d => 0x9eb9, 0x8e => 0x514b, 0x8f => 0x523b, 0x90 => 0x544a, + 0x91 => 0x56fd, 0x92 => 0x7a40, 0x93 => 0x9177, 0x94 => 0x9d60, + 0x95 => 0x9ed2, 0x96 => 0x7344, 0x97 => 0x6f09, 0x98 => 0x8170, + 0x99 => 0x7511, 0x9a => 0x5ffd, 0x9b => 0x60da, 0x9c => 0x9aa8, + 0x9d => 0x72db, 0x9e => 0x8fbc, 0x9f => 0x6b64, 0xa0 => 0x9803, + 0xa1 => 0x4eca, 0xa2 => 0x56f0, 0xa3 => 0x5764, 0xa4 => 0x58be, + 0xa5 => 0x5a5a, 0xa6 => 0x6068, 0xa7 => 0x61c7, 0xa8 => 0x660f, + 0xa9 => 0x6606, 0xaa => 0x6839, 0xab => 0x68b1, 0xac => 0x6df7, + 0xad => 0x75d5, 0xae => 0x7d3a, 0xaf => 0x826e, 0xb0 => 0x9b42, + 0xb1 => 0x4e9b, 0xb2 => 0x4f50, 0xb3 => 0x53c9, 0xb4 => 0x5506, + 0xb5 => 0x5d6f, 0xb6 => 0x5de6, 0xb7 => 0x5dee, 0xb8 => 0x67fb, + 0xb9 => 0x6c99, 0xba => 0x7473, 0xbb => 0x7802, 0xbc => 0x8a50, + 0xbd => 0x9396, 0xbe => 0x88df, 0xbf => 0x5750, 0xc0 => 0x5ea7, + 0xc1 => 0x632b, 0xc2 => 0x50b5, 0xc3 => 0x50ac, 0xc4 => 0x518d, + 0xc5 => 0x6700, 0xc6 => 0x54c9, 0xc7 => 0x585e, 0xc8 => 0x59bb, + 0xc9 => 0x5bb0, 0xca => 0x5f69, 0xcb => 0x624d, 0xcc => 0x63a1, + 0xcd => 0x683d, 0xce => 0x6b73, 0xcf => 0x6e08, 0xd0 => 0x707d, + 0xd1 => 0x91c7, 0xd2 => 0x7280, 0xd3 => 0x7815, 0xd4 => 0x7826, + 0xd5 => 0x796d, 0xd6 => 0x658e, 0xd7 => 0x7d30, 0xd8 => 0x83dc, + 0xd9 => 0x88c1, 0xda => 0x8f09, 0xdb => 0x969b, 0xdc => 0x5264, + 0xdd => 0x5728, 0xde => 0x6750, 0xdf => 0x7f6a, 0xe0 => 0x8ca1, + 0xe1 => 0x51b4, 0xe2 => 0x5742, 0xe3 => 0x962a, 0xe4 => 0x583a, + 0xe5 => 0x698a, 0xe6 => 0x80b4, 0xe7 => 0x54b2, 0xe8 => 0x5d0e, + 0xe9 => 0x57fc, 0xea => 0x7895, 0xeb => 0x9dfa, 0xec => 0x4f5c, + 0xed => 0x524a, 0xee => 0x548b, 0xef => 0x643e, 0xf0 => 0x6628, + 0xf1 => 0x6714, 0xf2 => 0x67f5, 0xf3 => 0x7a84, 0xf4 => 0x7b56, + 0xf5 => 0x7d22, 0xf6 => 0x932f, 0xf7 => 0x685c, 0xf8 => 0x9bad, + 0xf9 => 0x7b39, 0xfa => 0x5319, 0xfb => 0x518a, 0xfc => 0x5237, + }, + 0x8e => { + 0x40 => 0x5bdf, 0x41 => 0x62f6, 0x42 => 0x64ae, 0x43 => 0x64e6, + 0x44 => 0x672d, 0x45 => 0x6bba, 0x46 => 0x85a9, 0x47 => 0x96d1, + 0x48 => 0x7690, 0x49 => 0x9bd6, 0x4a => 0x634c, 0x4b => 0x9306, + 0x4c => 0x9bab, 0x4d => 0x76bf, 0x4e => 0x6652, 0x4f => 0x4e09, + 0x50 => 0x5098, 0x51 => 0x53c2, 0x52 => 0x5c71, 0x53 => 0x60e8, + 0x54 => 0x6492, 0x55 => 0x6563, 0x56 => 0x685f, 0x57 => 0x71e6, + 0x58 => 0x73ca, 0x59 => 0x7523, 0x5a => 0x7b97, 0x5b => 0x7e82, + 0x5c => 0x8695, 0x5d => 0x8b83, 0x5e => 0x8cdb, 0x5f => 0x9178, + 0x60 => 0x9910, 0x61 => 0x65ac, 0x62 => 0x66ab, 0x63 => 0x6b8b, + 0x64 => 0x4ed5, 0x65 => 0x4ed4, 0x66 => 0x4f3a, 0x67 => 0x4f7f, + 0x68 => 0x523a, 0x69 => 0x53f8, 0x6a => 0x53f2, 0x6b => 0x55e3, + 0x6c => 0x56db, 0x6d => 0x58eb, 0x6e => 0x59cb, 0x6f => 0x59c9, + 0x70 => 0x59ff, 0x71 => 0x5b50, 0x72 => 0x5c4d, 0x73 => 0x5e02, + 0x74 => 0x5e2b, 0x75 => 0x5fd7, 0x76 => 0x601d, 0x77 => 0x6307, + 0x78 => 0x652f, 0x79 => 0x5b5c, 0x7a => 0x65af, 0x7b => 0x65bd, + 0x7c => 0x65e8, 0x7d => 0x679d, 0x7e => 0x6b62, 0x80 => 0x6b7b, + 0x81 => 0x6c0f, 0x82 => 0x7345, 0x83 => 0x7949, 0x84 => 0x79c1, + 0x85 => 0x7cf8, 0x86 => 0x7d19, 0x87 => 0x7d2b, 0x88 => 0x80a2, + 0x89 => 0x8102, 0x8a => 0x81f3, 0x8b => 0x8996, 0x8c => 0x8a5e, + 0x8d => 0x8a69, 0x8e => 0x8a66, 0x8f => 0x8a8c, 0x90 => 0x8aee, + 0x91 => 0x8cc7, 0x92 => 0x8cdc, 0x93 => 0x96cc, 0x94 => 0x98fc, + 0x95 => 0x6b6f, 0x96 => 0x4e8b, 0x97 => 0x4f3c, 0x98 => 0x4f8d, + 0x99 => 0x5150, 0x9a => 0x5b57, 0x9b => 0x5bfa, 0x9c => 0x6148, + 0x9d => 0x6301, 0x9e => 0x6642, 0x9f => 0x6b21, 0xa0 => 0x6ecb, + 0xa1 => 0x6cbb, 0xa2 => 0x723e, 0xa3 => 0x74bd, 0xa4 => 0x75d4, + 0xa5 => 0x78c1, 0xa6 => 0x793a, 0xa7 => 0x800c, 0xa8 => 0x8033, + 0xa9 => 0x81ea, 0xaa => 0x8494, 0xab => 0x8f9e, 0xac => 0x6c50, + 0xad => 0x9e7f, 0xae => 0x5f0f, 0xaf => 0x8b58, 0xb0 => 0x9d2b, + 0xb1 => 0x7afa, 0xb2 => 0x8ef8, 0xb3 => 0x5b8d, 0xb4 => 0x96eb, + 0xb5 => 0x4e03, 0xb6 => 0x53f1, 0xb7 => 0x57f7, 0xb8 => 0x5931, + 0xb9 => 0x5ac9, 0xba => 0x5ba4, 0xbb => 0x6089, 0xbc => 0x6e7f, + 0xbd => 0x6f06, 0xbe => 0x75be, 0xbf => 0x8cea, 0xc0 => 0x5b9f, + 0xc1 => 0x8500, 0xc2 => 0x7be0, 0xc3 => 0x5072, 0xc4 => 0x67f4, + 0xc5 => 0x829d, 0xc6 => 0x5c61, 0xc7 => 0x854a, 0xc8 => 0x7e1e, + 0xc9 => 0x820e, 0xca => 0x5199, 0xcb => 0x5c04, 0xcc => 0x6368, + 0xcd => 0x8d66, 0xce => 0x659c, 0xcf => 0x716e, 0xd0 => 0x793e, + 0xd1 => 0x7d17, 0xd2 => 0x8005, 0xd3 => 0x8b1d, 0xd4 => 0x8eca, + 0xd5 => 0x906e, 0xd6 => 0x86c7, 0xd7 => 0x90aa, 0xd8 => 0x501f, + 0xd9 => 0x52fa, 0xda => 0x5c3a, 0xdb => 0x6753, 0xdc => 0x707c, + 0xdd => 0x7235, 0xde => 0x914c, 0xdf => 0x91c8, 0xe0 => 0x932b, + 0xe1 => 0x82e5, 0xe2 => 0x5bc2, 0xe3 => 0x5f31, 0xe4 => 0x60f9, + 0xe5 => 0x4e3b, 0xe6 => 0x53d6, 0xe7 => 0x5b88, 0xe8 => 0x624b, + 0xe9 => 0x6731, 0xea => 0x6b8a, 0xeb => 0x72e9, 0xec => 0x73e0, + 0xed => 0x7a2e, 0xee => 0x816b, 0xef => 0x8da3, 0xf0 => 0x9152, + 0xf1 => 0x9996, 0xf2 => 0x5112, 0xf3 => 0x53d7, 0xf4 => 0x546a, + 0xf5 => 0x5bff, 0xf6 => 0x6388, 0xf7 => 0x6a39, 0xf8 => 0x7dac, + 0xf9 => 0x9700, 0xfa => 0x56da, 0xfb => 0x53ce, 0xfc => 0x5468, + }, + 0x8f => { + 0x40 => 0x5b97, 0x41 => 0x5c31, 0x42 => 0x5dde, 0x43 => 0x4fee, + 0x44 => 0x6101, 0x45 => 0x62fe, 0x46 => 0x6d32, 0x47 => 0x79c0, + 0x48 => 0x79cb, 0x49 => 0x7d42, 0x4a => 0x7e4d, 0x4b => 0x7fd2, + 0x4c => 0x81ed, 0x4d => 0x821f, 0x4e => 0x8490, 0x4f => 0x8846, + 0x50 => 0x8972, 0x51 => 0x8b90, 0x52 => 0x8e74, 0x53 => 0x8f2f, + 0x54 => 0x9031, 0x55 => 0x914b, 0x56 => 0x916c, 0x57 => 0x96c6, + 0x58 => 0x919c, 0x59 => 0x4ec0, 0x5a => 0x4f4f, 0x5b => 0x5145, + 0x5c => 0x5341, 0x5d => 0x5f93, 0x5e => 0x620e, 0x5f => 0x67d4, + 0x60 => 0x6c41, 0x61 => 0x6e0b, 0x62 => 0x7363, 0x63 => 0x7e26, + 0x64 => 0x91cd, 0x65 => 0x9283, 0x66 => 0x53d4, 0x67 => 0x5919, + 0x68 => 0x5bbf, 0x69 => 0x6dd1, 0x6a => 0x795d, 0x6b => 0x7e2e, + 0x6c => 0x7c9b, 0x6d => 0x587e, 0x6e => 0x719f, 0x6f => 0x51fa, + 0x70 => 0x8853, 0x71 => 0x8ff0, 0x72 => 0x4fca, 0x73 => 0x5cfb, + 0x74 => 0x6625, 0x75 => 0x77ac, 0x76 => 0x7ae3, 0x77 => 0x821c, + 0x78 => 0x99ff, 0x79 => 0x51c6, 0x7a => 0x5faa, 0x7b => 0x65ec, + 0x7c => 0x696f, 0x7d => 0x6b89, 0x7e => 0x6df3, 0x80 => 0x6e96, + 0x81 => 0x6f64, 0x82 => 0x76fe, 0x83 => 0x7d14, 0x84 => 0x5de1, + 0x85 => 0x9075, 0x86 => 0x9187, 0x87 => 0x9806, 0x88 => 0x51e6, + 0x89 => 0x521d, 0x8a => 0x6240, 0x8b => 0x6691, 0x8c => 0x66d9, + 0x8d => 0x6e1a, 0x8e => 0x5eb6, 0x8f => 0x7dd2, 0x90 => 0x7f72, + 0x91 => 0x66f8, 0x92 => 0x85af, 0x93 => 0x85f7, 0x94 => 0x8af8, + 0x95 => 0x52a9, 0x96 => 0x53d9, 0x97 => 0x5973, 0x98 => 0x5e8f, + 0x99 => 0x5f90, 0x9a => 0x6055, 0x9b => 0x92e4, 0x9c => 0x9664, + 0x9d => 0x50b7, 0x9e => 0x511f, 0x9f => 0x52dd, 0xa0 => 0x5320, + 0xa1 => 0x5347, 0xa2 => 0x53ec, 0xa3 => 0x54e8, 0xa4 => 0x5546, + 0xa5 => 0x5531, 0xa6 => 0x5617, 0xa7 => 0x5968, 0xa8 => 0x59be, + 0xa9 => 0x5a3c, 0xaa => 0x5bb5, 0xab => 0x5c06, 0xac => 0x5c0f, + 0xad => 0x5c11, 0xae => 0x5c1a, 0xaf => 0x5e84, 0xb0 => 0x5e8a, + 0xb1 => 0x5ee0, 0xb2 => 0x5f70, 0xb3 => 0x627f, 0xb4 => 0x6284, + 0xb5 => 0x62db, 0xb6 => 0x638c, 0xb7 => 0x6377, 0xb8 => 0x6607, + 0xb9 => 0x660c, 0xba => 0x662d, 0xbb => 0x6676, 0xbc => 0x677e, + 0xbd => 0x68a2, 0xbe => 0x6a1f, 0xbf => 0x6a35, 0xc0 => 0x6cbc, + 0xc1 => 0x6d88, 0xc2 => 0x6e09, 0xc3 => 0x6e58, 0xc4 => 0x713c, + 0xc5 => 0x7126, 0xc6 => 0x7167, 0xc7 => 0x75c7, 0xc8 => 0x7701, + 0xc9 => 0x785d, 0xca => 0x7901, 0xcb => 0x7965, 0xcc => 0x79f0, + 0xcd => 0x7ae0, 0xce => 0x7b11, 0xcf => 0x7ca7, 0xd0 => 0x7d39, + 0xd1 => 0x8096, 0xd2 => 0x83d6, 0xd3 => 0x848b, 0xd4 => 0x8549, + 0xd5 => 0x885d, 0xd6 => 0x88f3, 0xd7 => 0x8a1f, 0xd8 => 0x8a3c, + 0xd9 => 0x8a54, 0xda => 0x8a73, 0xdb => 0x8c61, 0xdc => 0x8cde, + 0xdd => 0x91a4, 0xde => 0x9266, 0xdf => 0x937e, 0xe0 => 0x9418, + 0xe1 => 0x969c, 0xe2 => 0x9798, 0xe3 => 0x4e0a, 0xe4 => 0x4e08, + 0xe5 => 0x4e1e, 0xe6 => 0x4e57, 0xe7 => 0x5197, 0xe8 => 0x5270, + 0xe9 => 0x57ce, 0xea => 0x5834, 0xeb => 0x58cc, 0xec => 0x5b22, + 0xed => 0x5e38, 0xee => 0x60c5, 0xef => 0x64fe, 0xf0 => 0x6761, + 0xf1 => 0x6756, 0xf2 => 0x6d44, 0xf3 => 0x72b6, 0xf4 => 0x7573, + 0xf5 => 0x7a63, 0xf6 => 0x84b8, 0xf7 => 0x8b72, 0xf8 => 0x91b8, + 0xf9 => 0x9320, 0xfa => 0x5631, 0xfb => 0x57f4, 0xfc => 0x98fe, + }, + 0x90 => { + 0x40 => 0x62ed, 0x41 => 0x690d, 0x42 => 0x6b96, 0x43 => 0x71ed, + 0x44 => 0x7e54, 0x45 => 0x8077, 0x46 => 0x8272, 0x47 => 0x89e6, + 0x48 => 0x98df, 0x49 => 0x8755, 0x4a => 0x8fb1, 0x4b => 0x5c3b, + 0x4c => 0x4f38, 0x4d => 0x4fe1, 0x4e => 0x4fb5, 0x4f => 0x5507, + 0x50 => 0x5a20, 0x51 => 0x5bdd, 0x52 => 0x5be9, 0x53 => 0x5fc3, + 0x54 => 0x614e, 0x55 => 0x632f, 0x56 => 0x65b0, 0x57 => 0x664b, + 0x58 => 0x68ee, 0x59 => 0x699b, 0x5a => 0x6d78, 0x5b => 0x6df1, + 0x5c => 0x7533, 0x5d => 0x75b9, 0x5e => 0x771f, 0x5f => 0x795e, + 0x60 => 0x79e6, 0x61 => 0x7d33, 0x62 => 0x81e3, 0x63 => 0x82af, + 0x64 => 0x85aa, 0x65 => 0x89aa, 0x66 => 0x8a3a, 0x67 => 0x8eab, + 0x68 => 0x8f9b, 0x69 => 0x9032, 0x6a => 0x91dd, 0x6b => 0x9707, + 0x6c => 0x4eba, 0x6d => 0x4ec1, 0x6e => 0x5203, 0x6f => 0x5875, + 0x70 => 0x58ec, 0x71 => 0x5c0b, 0x72 => 0x751a, 0x73 => 0x5c3d, + 0x74 => 0x814e, 0x75 => 0x8a0a, 0x76 => 0x8fc5, 0x77 => 0x9663, + 0x78 => 0x976d, 0x79 => 0x7b25, 0x7a => 0x8acf, 0x7b => 0x9808, + 0x7c => 0x9162, 0x7d => 0x56f3, 0x7e => 0x53a8, 0x80 => 0x9017, + 0x81 => 0x5439, 0x82 => 0x5782, 0x83 => 0x5e25, 0x84 => 0x63a8, + 0x85 => 0x6c34, 0x86 => 0x708a, 0x87 => 0x7761, 0x88 => 0x7c8b, + 0x89 => 0x7fe0, 0x8a => 0x8870, 0x8b => 0x9042, 0x8c => 0x9154, + 0x8d => 0x9310, 0x8e => 0x9318, 0x8f => 0x968f, 0x90 => 0x745e, + 0x91 => 0x9ac4, 0x92 => 0x5d07, 0x93 => 0x5d69, 0x94 => 0x6570, + 0x95 => 0x67a2, 0x96 => 0x8da8, 0x97 => 0x96db, 0x98 => 0x636e, + 0x99 => 0x6749, 0x9a => 0x6919, 0x9b => 0x83c5, 0x9c => 0x9817, + 0x9d => 0x96c0, 0x9e => 0x88fe, 0x9f => 0x6f84, 0xa0 => 0x647a, + 0xa1 => 0x5bf8, 0xa2 => 0x4e16, 0xa3 => 0x702c, 0xa4 => 0x755d, + 0xa5 => 0x662f, 0xa6 => 0x51c4, 0xa7 => 0x5236, 0xa8 => 0x52e2, + 0xa9 => 0x59d3, 0xaa => 0x5f81, 0xab => 0x6027, 0xac => 0x6210, + 0xad => 0x653f, 0xae => 0x6574, 0xaf => 0x661f, 0xb0 => 0x6674, + 0xb1 => 0x68f2, 0xb2 => 0x6816, 0xb3 => 0x6b63, 0xb4 => 0x6e05, + 0xb5 => 0x7272, 0xb6 => 0x751f, 0xb7 => 0x76db, 0xb8 => 0x7cbe, + 0xb9 => 0x8056, 0xba => 0x58f0, 0xbb => 0x88fd, 0xbc => 0x897f, + 0xbd => 0x8aa0, 0xbe => 0x8a93, 0xbf => 0x8acb, 0xc0 => 0x901d, + 0xc1 => 0x9192, 0xc2 => 0x9752, 0xc3 => 0x9759, 0xc4 => 0x6589, + 0xc5 => 0x7a0e, 0xc6 => 0x8106, 0xc7 => 0x96bb, 0xc8 => 0x5e2d, + 0xc9 => 0x60dc, 0xca => 0x621a, 0xcb => 0x65a5, 0xcc => 0x6614, + 0xcd => 0x6790, 0xce => 0x77f3, 0xcf => 0x7a4d, 0xd0 => 0x7c4d, + 0xd1 => 0x7e3e, 0xd2 => 0x810a, 0xd3 => 0x8cac, 0xd4 => 0x8d64, + 0xd5 => 0x8de1, 0xd6 => 0x8e5f, 0xd7 => 0x78a9, 0xd8 => 0x5207, + 0xd9 => 0x62d9, 0xda => 0x63a5, 0xdb => 0x6442, 0xdc => 0x6298, + 0xdd => 0x8a2d, 0xde => 0x7a83, 0xdf => 0x7bc0, 0xe0 => 0x8aac, + 0xe1 => 0x96ea, 0xe2 => 0x7d76, 0xe3 => 0x820c, 0xe4 => 0x8749, + 0xe5 => 0x4ed9, 0xe6 => 0x5148, 0xe7 => 0x5343, 0xe8 => 0x5360, + 0xe9 => 0x5ba3, 0xea => 0x5c02, 0xeb => 0x5c16, 0xec => 0x5ddd, + 0xed => 0x6226, 0xee => 0x6247, 0xef => 0x64b0, 0xf0 => 0x6813, + 0xf1 => 0x6834, 0xf2 => 0x6cc9, 0xf3 => 0x6d45, 0xf4 => 0x6d17, + 0xf5 => 0x67d3, 0xf6 => 0x6f5c, 0xf7 => 0x714e, 0xf8 => 0x717d, + 0xf9 => 0x65cb, 0xfa => 0x7a7f, 0xfb => 0x7bad, 0xfc => 0x7dda, + }, + 0x91 => { + 0x40 => 0x7e4a, 0x41 => 0x7fa8, 0x42 => 0x817a, 0x43 => 0x821b, + 0x44 => 0x8239, 0x45 => 0x85a6, 0x46 => 0x8a6e, 0x47 => 0x8cce, + 0x48 => 0x8df5, 0x49 => 0x9078, 0x4a => 0x9077, 0x4b => 0x92ad, + 0x4c => 0x9291, 0x4d => 0x9583, 0x4e => 0x9bae, 0x4f => 0x524d, + 0x50 => 0x5584, 0x51 => 0x6f38, 0x52 => 0x7136, 0x53 => 0x5168, + 0x54 => 0x7985, 0x55 => 0x7e55, 0x56 => 0x81b3, 0x57 => 0x7cce, + 0x58 => 0x564c, 0x59 => 0x5851, 0x5a => 0x5ca8, 0x5b => 0x63aa, + 0x5c => 0x66fe, 0x5d => 0x66fd, 0x5e => 0x695a, 0x5f => 0x72d9, + 0x60 => 0x758f, 0x61 => 0x758e, 0x62 => 0x790e, 0x63 => 0x7956, + 0x64 => 0x79df, 0x65 => 0x7c97, 0x66 => 0x7d20, 0x67 => 0x7d44, + 0x68 => 0x8607, 0x69 => 0x8a34, 0x6a => 0x963b, 0x6b => 0x9061, + 0x6c => 0x9f20, 0x6d => 0x50e7, 0x6e => 0x5275, 0x6f => 0x53cc, + 0x70 => 0x53e2, 0x71 => 0x5009, 0x72 => 0x55aa, 0x73 => 0x58ee, + 0x74 => 0x594f, 0x75 => 0x723d, 0x76 => 0x5b8b, 0x77 => 0x5c64, + 0x78 => 0x531d, 0x79 => 0x60e3, 0x7a => 0x60f3, 0x7b => 0x635c, + 0x7c => 0x6383, 0x7d => 0x633f, 0x7e => 0x63bb, 0x80 => 0x64cd, + 0x81 => 0x65e9, 0x82 => 0x66f9, 0x83 => 0x5de3, 0x84 => 0x69cd, + 0x85 => 0x69fd, 0x86 => 0x6f15, 0x87 => 0x71e5, 0x88 => 0x4e89, + 0x89 => 0x75e9, 0x8a => 0x76f8, 0x8b => 0x7a93, 0x8c => 0x7cdf, + 0x8d => 0x7dcf, 0x8e => 0x7d9c, 0x8f => 0x8061, 0x90 => 0x8349, + 0x91 => 0x8358, 0x92 => 0x846c, 0x93 => 0x84bc, 0x94 => 0x85fb, + 0x95 => 0x88c5, 0x96 => 0x8d70, 0x97 => 0x9001, 0x98 => 0x906d, + 0x99 => 0x9397, 0x9a => 0x971c, 0x9b => 0x9a12, 0x9c => 0x50cf, + 0x9d => 0x5897, 0x9e => 0x618e, 0x9f => 0x81d3, 0xa0 => 0x8535, + 0xa1 => 0x8d08, 0xa2 => 0x9020, 0xa3 => 0x4fc3, 0xa4 => 0x5074, + 0xa5 => 0x5247, 0xa6 => 0x5373, 0xa7 => 0x606f, 0xa8 => 0x6349, + 0xa9 => 0x675f, 0xaa => 0x6e2c, 0xab => 0x8db3, 0xac => 0x901f, + 0xad => 0x4fd7, 0xae => 0x5c5e, 0xaf => 0x8cca, 0xb0 => 0x65cf, + 0xb1 => 0x7d9a, 0xb2 => 0x5352, 0xb3 => 0x8896, 0xb4 => 0x5176, + 0xb5 => 0x63c3, 0xb6 => 0x5b58, 0xb7 => 0x5b6b, 0xb8 => 0x5c0a, + 0xb9 => 0x640d, 0xba => 0x6751, 0xbb => 0x905c, 0xbc => 0x4ed6, + 0xbd => 0x591a, 0xbe => 0x592a, 0xbf => 0x6c70, 0xc0 => 0x8a51, + 0xc1 => 0x553e, 0xc2 => 0x5815, 0xc3 => 0x59a5, 0xc4 => 0x60f0, + 0xc5 => 0x6253, 0xc6 => 0x67c1, 0xc7 => 0x8235, 0xc8 => 0x6955, + 0xc9 => 0x9640, 0xca => 0x99c4, 0xcb => 0x9a28, 0xcc => 0x4f53, + 0xcd => 0x5806, 0xce => 0x5bfe, 0xcf => 0x8010, 0xd0 => 0x5cb1, + 0xd1 => 0x5e2f, 0xd2 => 0x5f85, 0xd3 => 0x6020, 0xd4 => 0x614b, + 0xd5 => 0x6234, 0xd6 => 0x66ff, 0xd7 => 0x6cf0, 0xd8 => 0x6ede, + 0xd9 => 0x80ce, 0xda => 0x817f, 0xdb => 0x82d4, 0xdc => 0x888b, + 0xdd => 0x8cb8, 0xde => 0x9000, 0xdf => 0x902e, 0xe0 => 0x968a, + 0xe1 => 0x9edb, 0xe2 => 0x9bdb, 0xe3 => 0x4ee3, 0xe4 => 0x53f0, + 0xe5 => 0x5927, 0xe6 => 0x7b2c, 0xe7 => 0x918d, 0xe8 => 0x984c, + 0xe9 => 0x9df9, 0xea => 0x6edd, 0xeb => 0x7027, 0xec => 0x5353, + 0xed => 0x5544, 0xee => 0x5b85, 0xef => 0x6258, 0xf0 => 0x629e, + 0xf1 => 0x62d3, 0xf2 => 0x6ca2, 0xf3 => 0x6fef, 0xf4 => 0x7422, + 0xf5 => 0x8a17, 0xf6 => 0x9438, 0xf7 => 0x6fc1, 0xf8 => 0x8afe, + 0xf9 => 0x8338, 0xfa => 0x51e7, 0xfb => 0x86f8, 0xfc => 0x53ea, + }, + 0x92 => { + 0x40 => 0x53e9, 0x41 => 0x4f46, 0x42 => 0x9054, 0x43 => 0x8fb0, + 0x44 => 0x596a, 0x45 => 0x8131, 0x46 => 0x5dfd, 0x47 => 0x7aea, + 0x48 => 0x8fbf, 0x49 => 0x68da, 0x4a => 0x8c37, 0x4b => 0x72f8, + 0x4c => 0x9c48, 0x4d => 0x6a3d, 0x4e => 0x8ab0, 0x4f => 0x4e39, + 0x50 => 0x5358, 0x51 => 0x5606, 0x52 => 0x5766, 0x53 => 0x62c5, + 0x54 => 0x63a2, 0x55 => 0x65e6, 0x56 => 0x6b4e, 0x57 => 0x6de1, + 0x58 => 0x6e5b, 0x59 => 0x70ad, 0x5a => 0x77ed, 0x5b => 0x7aef, + 0x5c => 0x7baa, 0x5d => 0x7dbb, 0x5e => 0x803d, 0x5f => 0x80c6, + 0x60 => 0x86cb, 0x61 => 0x8a95, 0x62 => 0x935b, 0x63 => 0x56e3, + 0x64 => 0x58c7, 0x65 => 0x5f3e, 0x66 => 0x65ad, 0x67 => 0x6696, + 0x68 => 0x6a80, 0x69 => 0x6bb5, 0x6a => 0x7537, 0x6b => 0x8ac7, + 0x6c => 0x5024, 0x6d => 0x77e5, 0x6e => 0x5730, 0x6f => 0x5f1b, + 0x70 => 0x6065, 0x71 => 0x667a, 0x72 => 0x6c60, 0x73 => 0x75f4, + 0x74 => 0x7a1a, 0x75 => 0x7f6e, 0x76 => 0x81f4, 0x77 => 0x8718, + 0x78 => 0x9045, 0x79 => 0x99b3, 0x7a => 0x7bc9, 0x7b => 0x755c, + 0x7c => 0x7af9, 0x7d => 0x7b51, 0x7e => 0x84c4, 0x80 => 0x9010, + 0x81 => 0x79e9, 0x82 => 0x7a92, 0x83 => 0x8336, 0x84 => 0x5ae1, + 0x85 => 0x7740, 0x86 => 0x4e2d, 0x87 => 0x4ef2, 0x88 => 0x5b99, + 0x89 => 0x5fe0, 0x8a => 0x62bd, 0x8b => 0x663c, 0x8c => 0x67f1, + 0x8d => 0x6ce8, 0x8e => 0x866b, 0x8f => 0x8877, 0x90 => 0x8a3b, + 0x91 => 0x914e, 0x92 => 0x92f3, 0x93 => 0x99d0, 0x94 => 0x6a17, + 0x95 => 0x7026, 0x96 => 0x732a, 0x97 => 0x82e7, 0x98 => 0x8457, + 0x99 => 0x8caf, 0x9a => 0x4e01, 0x9b => 0x5146, 0x9c => 0x51cb, + 0x9d => 0x558b, 0x9e => 0x5bf5, 0x9f => 0x5e16, 0xa0 => 0x5e33, + 0xa1 => 0x5e81, 0xa2 => 0x5f14, 0xa3 => 0x5f35, 0xa4 => 0x5f6b, + 0xa5 => 0x5fb4, 0xa6 => 0x61f2, 0xa7 => 0x6311, 0xa8 => 0x66a2, + 0xa9 => 0x671d, 0xaa => 0x6f6e, 0xab => 0x7252, 0xac => 0x753a, + 0xad => 0x773a, 0xae => 0x8074, 0xaf => 0x8139, 0xb0 => 0x8178, + 0xb1 => 0x8776, 0xb2 => 0x8abf, 0xb3 => 0x8adc, 0xb4 => 0x8d85, + 0xb5 => 0x8df3, 0xb6 => 0x929a, 0xb7 => 0x9577, 0xb8 => 0x9802, + 0xb9 => 0x9ce5, 0xba => 0x52c5, 0xbb => 0x6357, 0xbc => 0x76f4, + 0xbd => 0x6715, 0xbe => 0x6c88, 0xbf => 0x73cd, 0xc0 => 0x8cc3, + 0xc1 => 0x93ae, 0xc2 => 0x9673, 0xc3 => 0x6d25, 0xc4 => 0x589c, + 0xc5 => 0x690e, 0xc6 => 0x69cc, 0xc7 => 0x8ffd, 0xc8 => 0x939a, + 0xc9 => 0x75db, 0xca => 0x901a, 0xcb => 0x585a, 0xcc => 0x6802, + 0xcd => 0x63b4, 0xce => 0x69fb, 0xcf => 0x4f43, 0xd0 => 0x6f2c, + 0xd1 => 0x67d8, 0xd2 => 0x8fbb, 0xd3 => 0x8526, 0xd4 => 0x7db4, + 0xd5 => 0x9354, 0xd6 => 0x693f, 0xd7 => 0x6f70, 0xd8 => 0x576a, + 0xd9 => 0x58f7, 0xda => 0x5b2c, 0xdb => 0x7d2c, 0xdc => 0x722a, + 0xdd => 0x540a, 0xde => 0x91e3, 0xdf => 0x9db4, 0xe0 => 0x4ead, + 0xe1 => 0x4f4e, 0xe2 => 0x505c, 0xe3 => 0x5075, 0xe4 => 0x5243, + 0xe5 => 0x8c9e, 0xe6 => 0x5448, 0xe7 => 0x5824, 0xe8 => 0x5b9a, + 0xe9 => 0x5e1d, 0xea => 0x5e95, 0xeb => 0x5ead, 0xec => 0x5ef7, + 0xed => 0x5f1f, 0xee => 0x608c, 0xef => 0x62b5, 0xf0 => 0x633a, + 0xf1 => 0x63d0, 0xf2 => 0x68af, 0xf3 => 0x6c40, 0xf4 => 0x7887, + 0xf5 => 0x798e, 0xf6 => 0x7a0b, 0xf7 => 0x7de0, 0xf8 => 0x8247, + 0xf9 => 0x8a02, 0xfa => 0x8ae6, 0xfb => 0x8e44, 0xfc => 0x9013, + }, + 0x93 => { + 0x40 => 0x90b8, 0x41 => 0x912d, 0x42 => 0x91d8, 0x43 => 0x9f0e, + 0x44 => 0x6ce5, 0x45 => 0x6458, 0x46 => 0x64e2, 0x47 => 0x6575, + 0x48 => 0x6ef4, 0x49 => 0x7684, 0x4a => 0x7b1b, 0x4b => 0x9069, + 0x4c => 0x93d1, 0x4d => 0x6eba, 0x4e => 0x54f2, 0x4f => 0x5fb9, + 0x50 => 0x64a4, 0x51 => 0x8f4d, 0x52 => 0x8fed, 0x53 => 0x9244, + 0x54 => 0x5178, 0x55 => 0x586b, 0x56 => 0x5929, 0x57 => 0x5c55, + 0x58 => 0x5e97, 0x59 => 0x6dfb, 0x5a => 0x7e8f, 0x5b => 0x751c, + 0x5c => 0x8cbc, 0x5d => 0x8ee2, 0x5e => 0x985b, 0x5f => 0x70b9, + 0x60 => 0x4f1d, 0x61 => 0x6bbf, 0x62 => 0x6fb1, 0x63 => 0x7530, + 0x64 => 0x96fb, 0x65 => 0x514e, 0x66 => 0x5410, 0x67 => 0x5835, + 0x68 => 0x5857, 0x69 => 0x59ac, 0x6a => 0x5c60, 0x6b => 0x5f92, + 0x6c => 0x6597, 0x6d => 0x675c, 0x6e => 0x6e21, 0x6f => 0x767b, + 0x70 => 0x83df, 0x71 => 0x8ced, 0x72 => 0x9014, 0x73 => 0x90fd, + 0x74 => 0x934d, 0x75 => 0x7825, 0x76 => 0x783a, 0x77 => 0x52aa, + 0x78 => 0x5ea6, 0x79 => 0x571f, 0x7a => 0x5974, 0x7b => 0x6012, + 0x7c => 0x5012, 0x7d => 0x515a, 0x7e => 0x51ac, 0x80 => 0x51cd, + 0x81 => 0x5200, 0x82 => 0x5510, 0x83 => 0x5854, 0x84 => 0x5858, + 0x85 => 0x5957, 0x86 => 0x5b95, 0x87 => 0x5cf6, 0x88 => 0x5d8b, + 0x89 => 0x60bc, 0x8a => 0x6295, 0x8b => 0x642d, 0x8c => 0x6771, + 0x8d => 0x6843, 0x8e => 0x68bc, 0x8f => 0x68df, 0x90 => 0x76d7, + 0x91 => 0x6dd8, 0x92 => 0x6e6f, 0x93 => 0x6d9b, 0x94 => 0x706f, + 0x95 => 0x71c8, 0x96 => 0x5f53, 0x97 => 0x75d8, 0x98 => 0x7977, + 0x99 => 0x7b49, 0x9a => 0x7b54, 0x9b => 0x7b52, 0x9c => 0x7cd6, + 0x9d => 0x7d71, 0x9e => 0x5230, 0x9f => 0x8463, 0xa0 => 0x8569, + 0xa1 => 0x85e4, 0xa2 => 0x8a0e, 0xa3 => 0x8b04, 0xa4 => 0x8c46, + 0xa5 => 0x8e0f, 0xa6 => 0x9003, 0xa7 => 0x900f, 0xa8 => 0x9419, + 0xa9 => 0x9676, 0xaa => 0x982d, 0xab => 0x9a30, 0xac => 0x95d8, + 0xad => 0x50cd, 0xae => 0x52d5, 0xaf => 0x540c, 0xb0 => 0x5802, + 0xb1 => 0x5c0e, 0xb2 => 0x61a7, 0xb3 => 0x649e, 0xb4 => 0x6d1e, + 0xb5 => 0x77b3, 0xb6 => 0x7ae5, 0xb7 => 0x80f4, 0xb8 => 0x8404, + 0xb9 => 0x9053, 0xba => 0x9285, 0xbb => 0x5ce0, 0xbc => 0x9d07, + 0xbd => 0x533f, 0xbe => 0x5f97, 0xbf => 0x5fb3, 0xc0 => 0x6d9c, + 0xc1 => 0x7279, 0xc2 => 0x7763, 0xc3 => 0x79bf, 0xc4 => 0x7be4, + 0xc5 => 0x6bd2, 0xc6 => 0x72ec, 0xc7 => 0x8aad, 0xc8 => 0x6803, + 0xc9 => 0x6a61, 0xca => 0x51f8, 0xcb => 0x7a81, 0xcc => 0x6934, + 0xcd => 0x5c4a, 0xce => 0x9cf6, 0xcf => 0x82eb, 0xd0 => 0x5bc5, + 0xd1 => 0x9149, 0xd2 => 0x701e, 0xd3 => 0x5678, 0xd4 => 0x5c6f, + 0xd5 => 0x60c7, 0xd6 => 0x6566, 0xd7 => 0x6c8c, 0xd8 => 0x8c5a, + 0xd9 => 0x9041, 0xda => 0x9813, 0xdb => 0x5451, 0xdc => 0x66c7, + 0xdd => 0x920d, 0xde => 0x5948, 0xdf => 0x90a3, 0xe0 => 0x5185, + 0xe1 => 0x4e4d, 0xe2 => 0x51ea, 0xe3 => 0x8599, 0xe4 => 0x8b0e, + 0xe5 => 0x7058, 0xe6 => 0x637a, 0xe7 => 0x934b, 0xe8 => 0x6962, + 0xe9 => 0x99b4, 0xea => 0x7e04, 0xeb => 0x7577, 0xec => 0x5357, + 0xed => 0x6960, 0xee => 0x8edf, 0xef => 0x96e3, 0xf0 => 0x6c5d, + 0xf1 => 0x4e8c, 0xf2 => 0x5c3c, 0xf3 => 0x5f10, 0xf4 => 0x8fe9, + 0xf5 => 0x5302, 0xf6 => 0x8cd1, 0xf7 => 0x8089, 0xf8 => 0x8679, + 0xf9 => 0x5eff, 0xfa => 0x65e5, 0xfb => 0x4e73, 0xfc => 0x5165, + }, + 0x94 => { + 0x40 => 0x5982, 0x41 => 0x5c3f, 0x42 => 0x97ee, 0x43 => 0x4efb, + 0x44 => 0x598a, 0x45 => 0x5fcd, 0x46 => 0x8a8d, 0x47 => 0x6fe1, + 0x48 => 0x79b0, 0x49 => 0x7962, 0x4a => 0x5be7, 0x4b => 0x8471, + 0x4c => 0x732b, 0x4d => 0x71b1, 0x4e => 0x5e74, 0x4f => 0x5ff5, + 0x50 => 0x637b, 0x51 => 0x649a, 0x52 => 0x71c3, 0x53 => 0x7c98, + 0x54 => 0x4e43, 0x55 => 0x5efc, 0x56 => 0x4e4b, 0x57 => 0x57dc, + 0x58 => 0x56a2, 0x59 => 0x60a9, 0x5a => 0x6fc3, 0x5b => 0x7d0d, + 0x5c => 0x80fd, 0x5d => 0x8133, 0x5e => 0x81bf, 0x5f => 0x8fb2, + 0x60 => 0x8997, 0x61 => 0x86a4, 0x62 => 0x5df4, 0x63 => 0x628a, + 0x64 => 0x64ad, 0x65 => 0x8987, 0x66 => 0x6777, 0x67 => 0x6ce2, + 0x68 => 0x6d3e, 0x69 => 0x7436, 0x6a => 0x7834, 0x6b => 0x5a46, + 0x6c => 0x7f75, 0x6d => 0x82ad, 0x6e => 0x99ac, 0x6f => 0x4ff3, + 0x70 => 0x5ec3, 0x71 => 0x62dd, 0x72 => 0x6392, 0x73 => 0x6557, + 0x74 => 0x676f, 0x75 => 0x76c3, 0x76 => 0x724c, 0x77 => 0x80cc, + 0x78 => 0x80ba, 0x79 => 0x8f29, 0x7a => 0x914d, 0x7b => 0x500d, + 0x7c => 0x57f9, 0x7d => 0x5a92, 0x7e => 0x6885, 0x80 => 0x6973, + 0x81 => 0x7164, 0x82 => 0x72fd, 0x83 => 0x8cb7, 0x84 => 0x58f2, + 0x85 => 0x8ce0, 0x86 => 0x966a, 0x87 => 0x9019, 0x88 => 0x877f, + 0x89 => 0x79e4, 0x8a => 0x77e7, 0x8b => 0x8429, 0x8c => 0x4f2f, + 0x8d => 0x5265, 0x8e => 0x535a, 0x8f => 0x62cd, 0x90 => 0x67cf, + 0x91 => 0x6cca, 0x92 => 0x767d, 0x93 => 0x7b94, 0x94 => 0x7c95, + 0x95 => 0x8236, 0x96 => 0x8584, 0x97 => 0x8feb, 0x98 => 0x66dd, + 0x99 => 0x6f20, 0x9a => 0x7206, 0x9b => 0x7e1b, 0x9c => 0x83ab, + 0x9d => 0x99c1, 0x9e => 0x9ea6, 0x9f => 0x51fd, 0xa0 => 0x7bb1, + 0xa1 => 0x7872, 0xa2 => 0x7bb8, 0xa3 => 0x8087, 0xa4 => 0x7b48, + 0xa5 => 0x6ae8, 0xa6 => 0x5e61, 0xa7 => 0x808c, 0xa8 => 0x7551, + 0xa9 => 0x7560, 0xaa => 0x516b, 0xab => 0x9262, 0xac => 0x6e8c, + 0xad => 0x767a, 0xae => 0x9197, 0xaf => 0x9aea, 0xb0 => 0x4f10, + 0xb1 => 0x7f70, 0xb2 => 0x629c, 0xb3 => 0x7b4f, 0xb4 => 0x95a5, + 0xb5 => 0x9ce9, 0xb6 => 0x567a, 0xb7 => 0x5859, 0xb8 => 0x86e4, + 0xb9 => 0x96bc, 0xba => 0x4f34, 0xbb => 0x5224, 0xbc => 0x534a, + 0xbd => 0x53cd, 0xbe => 0x53db, 0xbf => 0x5e06, 0xc0 => 0x642c, + 0xc1 => 0x6591, 0xc2 => 0x677f, 0xc3 => 0x6c3e, 0xc4 => 0x6c4e, + 0xc5 => 0x7248, 0xc6 => 0x72af, 0xc7 => 0x73ed, 0xc8 => 0x7554, + 0xc9 => 0x7e41, 0xca => 0x822c, 0xcb => 0x85e9, 0xcc => 0x8ca9, + 0xcd => 0x7bc4, 0xce => 0x91c6, 0xcf => 0x7169, 0xd0 => 0x9812, + 0xd1 => 0x98ef, 0xd2 => 0x633d, 0xd3 => 0x6669, 0xd4 => 0x756a, + 0xd5 => 0x76e4, 0xd6 => 0x78d0, 0xd7 => 0x8543, 0xd8 => 0x86ee, + 0xd9 => 0x532a, 0xda => 0x5351, 0xdb => 0x5426, 0xdc => 0x5983, + 0xdd => 0x5e87, 0xde => 0x5f7c, 0xdf => 0x60b2, 0xe0 => 0x6249, + 0xe1 => 0x6279, 0xe2 => 0x62ab, 0xe3 => 0x6590, 0xe4 => 0x6bd4, + 0xe5 => 0x6ccc, 0xe6 => 0x75b2, 0xe7 => 0x76ae, 0xe8 => 0x7891, + 0xe9 => 0x79d8, 0xea => 0x7dcb, 0xeb => 0x7f77, 0xec => 0x80a5, + 0xed => 0x88ab, 0xee => 0x8ab9, 0xef => 0x8cbb, 0xf0 => 0x907f, + 0xf1 => 0x975e, 0xf2 => 0x98db, 0xf3 => 0x6a0b, 0xf4 => 0x7c38, + 0xf5 => 0x5099, 0xf6 => 0x5c3e, 0xf7 => 0x5fae, 0xf8 => 0x6787, + 0xf9 => 0x6bd8, 0xfa => 0x7435, 0xfb => 0x7709, 0xfc => 0x7f8e, + }, + 0x95 => { + 0x40 => 0x9f3b, 0x41 => 0x67ca, 0x42 => 0x7a17, 0x43 => 0x5339, + 0x44 => 0x758b, 0x45 => 0x9aed, 0x46 => 0x5f66, 0x47 => 0x819d, + 0x48 => 0x83f1, 0x49 => 0x8098, 0x4a => 0x5f3c, 0x4b => 0x5fc5, + 0x4c => 0x7562, 0x4d => 0x7b46, 0x4e => 0x903c, 0x4f => 0x6867, + 0x50 => 0x59eb, 0x51 => 0x5a9b, 0x52 => 0x7d10, 0x53 => 0x767e, + 0x54 => 0x8b2c, 0x55 => 0x4ff5, 0x56 => 0x5f6a, 0x57 => 0x6a19, + 0x58 => 0x6c37, 0x59 => 0x6f02, 0x5a => 0x74e2, 0x5b => 0x7968, + 0x5c => 0x8868, 0x5d => 0x8a55, 0x5e => 0x8c79, 0x5f => 0x5edf, + 0x60 => 0x63cf, 0x61 => 0x75c5, 0x62 => 0x79d2, 0x63 => 0x82d7, + 0x64 => 0x9328, 0x65 => 0x92f2, 0x66 => 0x849c, 0x67 => 0x86ed, + 0x68 => 0x9c2d, 0x69 => 0x54c1, 0x6a => 0x5f6c, 0x6b => 0x658c, + 0x6c => 0x6d5c, 0x6d => 0x7015, 0x6e => 0x8ca7, 0x6f => 0x8cd3, + 0x70 => 0x983b, 0x71 => 0x654f, 0x72 => 0x74f6, 0x73 => 0x4e0d, + 0x74 => 0x4ed8, 0x75 => 0x57e0, 0x76 => 0x592b, 0x77 => 0x5a66, + 0x78 => 0x5bcc, 0x79 => 0x51a8, 0x7a => 0x5e03, 0x7b => 0x5e9c, + 0x7c => 0x6016, 0x7d => 0x6276, 0x7e => 0x6577, 0x80 => 0x65a7, + 0x81 => 0x666e, 0x82 => 0x6d6e, 0x83 => 0x7236, 0x84 => 0x7b26, + 0x85 => 0x8150, 0x86 => 0x819a, 0x87 => 0x8299, 0x88 => 0x8b5c, + 0x89 => 0x8ca0, 0x8a => 0x8ce6, 0x8b => 0x8d74, 0x8c => 0x961c, + 0x8d => 0x9644, 0x8e => 0x4fae, 0x8f => 0x64ab, 0x90 => 0x6b66, + 0x91 => 0x821e, 0x92 => 0x8461, 0x93 => 0x856a, 0x94 => 0x90e8, + 0x95 => 0x5c01, 0x96 => 0x6953, 0x97 => 0x98a8, 0x98 => 0x847a, + 0x99 => 0x8557, 0x9a => 0x4f0f, 0x9b => 0x526f, 0x9c => 0x5fa9, + 0x9d => 0x5e45, 0x9e => 0x670d, 0x9f => 0x798f, 0xa0 => 0x8179, + 0xa1 => 0x8907, 0xa2 => 0x8986, 0xa3 => 0x6df5, 0xa4 => 0x5f17, + 0xa5 => 0x6255, 0xa6 => 0x6cb8, 0xa7 => 0x4ecf, 0xa8 => 0x7269, + 0xa9 => 0x9b92, 0xaa => 0x5206, 0xab => 0x543b, 0xac => 0x5674, + 0xad => 0x58b3, 0xae => 0x61a4, 0xaf => 0x626e, 0xb0 => 0x711a, + 0xb1 => 0x596e, 0xb2 => 0x7c89, 0xb3 => 0x7cde, 0xb4 => 0x7d1b, + 0xb5 => 0x96f0, 0xb6 => 0x6587, 0xb7 => 0x805e, 0xb8 => 0x4e19, + 0xb9 => 0x4f75, 0xba => 0x5175, 0xbb => 0x5840, 0xbc => 0x5e63, + 0xbd => 0x5e73, 0xbe => 0x5f0a, 0xbf => 0x67c4, 0xc0 => 0x4e26, + 0xc1 => 0x853d, 0xc2 => 0x9589, 0xc3 => 0x965b, 0xc4 => 0x7c73, + 0xc5 => 0x9801, 0xc6 => 0x50fb, 0xc7 => 0x58c1, 0xc8 => 0x7656, + 0xc9 => 0x78a7, 0xca => 0x5225, 0xcb => 0x77a5, 0xcc => 0x8511, + 0xcd => 0x7b86, 0xce => 0x504f, 0xcf => 0x5909, 0xd0 => 0x7247, + 0xd1 => 0x7bc7, 0xd2 => 0x7de8, 0xd3 => 0x8fba, 0xd4 => 0x8fd4, + 0xd5 => 0x904d, 0xd6 => 0x4fbf, 0xd7 => 0x52c9, 0xd8 => 0x5a29, + 0xd9 => 0x5f01, 0xda => 0x97ad, 0xdb => 0x4fdd, 0xdc => 0x8217, + 0xdd => 0x92ea, 0xde => 0x5703, 0xdf => 0x6355, 0xe0 => 0x6b69, + 0xe1 => 0x752b, 0xe2 => 0x88dc, 0xe3 => 0x8f14, 0xe4 => 0x7a42, + 0xe5 => 0x52df, 0xe6 => 0x5893, 0xe7 => 0x6155, 0xe8 => 0x620a, + 0xe9 => 0x66ae, 0xea => 0x6bcd, 0xeb => 0x7c3f, 0xec => 0x83e9, + 0xed => 0x5023, 0xee => 0x4ff8, 0xef => 0x5305, 0xf0 => 0x5446, + 0xf1 => 0x5831, 0xf2 => 0x5949, 0xf3 => 0x5b9d, 0xf4 => 0x5cf0, + 0xf5 => 0x5cef, 0xf6 => 0x5d29, 0xf7 => 0x5e96, 0xf8 => 0x62b1, + 0xf9 => 0x6367, 0xfa => 0x653e, 0xfb => 0x65b9, 0xfc => 0x670b, + }, + 0x96 => { + 0x40 => 0x6cd5, 0x41 => 0x6ce1, 0x42 => 0x70f9, 0x43 => 0x7832, + 0x44 => 0x7e2b, 0x45 => 0x80de, 0x46 => 0x82b3, 0x47 => 0x840c, + 0x48 => 0x84ec, 0x49 => 0x8702, 0x4a => 0x8912, 0x4b => 0x8a2a, + 0x4c => 0x8c4a, 0x4d => 0x90a6, 0x4e => 0x92d2, 0x4f => 0x98fd, + 0x50 => 0x9cf3, 0x51 => 0x9d6c, 0x52 => 0x4e4f, 0x53 => 0x4ea1, + 0x54 => 0x508d, 0x55 => 0x5256, 0x56 => 0x574a, 0x57 => 0x59a8, + 0x58 => 0x5e3d, 0x59 => 0x5fd8, 0x5a => 0x5fd9, 0x5b => 0x623f, + 0x5c => 0x66b4, 0x5d => 0x671b, 0x5e => 0x67d0, 0x5f => 0x68d2, + 0x60 => 0x5192, 0x61 => 0x7d21, 0x62 => 0x80aa, 0x63 => 0x81a8, + 0x64 => 0x8b00, 0x65 => 0x8c8c, 0x66 => 0x8cbf, 0x67 => 0x927e, + 0x68 => 0x9632, 0x69 => 0x5420, 0x6a => 0x982c, 0x6b => 0x5317, + 0x6c => 0x50d5, 0x6d => 0x535c, 0x6e => 0x58a8, 0x6f => 0x64b2, + 0x70 => 0x6734, 0x71 => 0x7267, 0x72 => 0x7766, 0x73 => 0x7a46, + 0x74 => 0x91e6, 0x75 => 0x52c3, 0x76 => 0x6ca1, 0x77 => 0x6b86, + 0x78 => 0x5800, 0x79 => 0x5e4c, 0x7a => 0x5954, 0x7b => 0x672c, + 0x7c => 0x7ffb, 0x7d => 0x51e1, 0x7e => 0x76c6, 0x80 => 0x6469, + 0x81 => 0x78e8, 0x82 => 0x9b54, 0x83 => 0x9ebb, 0x84 => 0x57cb, + 0x85 => 0x59b9, 0x86 => 0x6627, 0x87 => 0x679a, 0x88 => 0x6bce, + 0x89 => 0x54e9, 0x8a => 0x69d9, 0x8b => 0x5e55, 0x8c => 0x819c, + 0x8d => 0x6795, 0x8e => 0x9baa, 0x8f => 0x67fe, 0x90 => 0x9c52, + 0x91 => 0x685d, 0x92 => 0x4ea6, 0x93 => 0x4fe3, 0x94 => 0x53c8, + 0x95 => 0x62b9, 0x96 => 0x672b, 0x97 => 0x6cab, 0x98 => 0x8fc4, + 0x99 => 0x4fad, 0x9a => 0x7e6d, 0x9b => 0x9ebf, 0x9c => 0x4e07, + 0x9d => 0x6162, 0x9e => 0x6e80, 0x9f => 0x6f2b, 0xa0 => 0x8513, + 0xa1 => 0x5473, 0xa2 => 0x672a, 0xa3 => 0x9b45, 0xa4 => 0x5df3, + 0xa5 => 0x7b95, 0xa6 => 0x5cac, 0xa7 => 0x5bc6, 0xa8 => 0x871c, + 0xa9 => 0x6e4a, 0xaa => 0x84d1, 0xab => 0x7a14, 0xac => 0x8108, + 0xad => 0x5999, 0xae => 0x7c8d, 0xaf => 0x6c11, 0xb0 => 0x7720, + 0xb1 => 0x52d9, 0xb2 => 0x5922, 0xb3 => 0x7121, 0xb4 => 0x725f, + 0xb5 => 0x77db, 0xb6 => 0x9727, 0xb7 => 0x9d61, 0xb8 => 0x690b, + 0xb9 => 0x5a7f, 0xba => 0x5a18, 0xbb => 0x51a5, 0xbc => 0x540d, + 0xbd => 0x547d, 0xbe => 0x660e, 0xbf => 0x76df, 0xc0 => 0x8ff7, + 0xc1 => 0x9298, 0xc2 => 0x9cf4, 0xc3 => 0x59ea, 0xc4 => 0x725d, + 0xc5 => 0x6ec5, 0xc6 => 0x514d, 0xc7 => 0x68c9, 0xc8 => 0x7dbf, + 0xc9 => 0x7dec, 0xca => 0x9762, 0xcb => 0x9eba, 0xcc => 0x6478, + 0xcd => 0x6a21, 0xce => 0x8302, 0xcf => 0x5984, 0xd0 => 0x5b5f, + 0xd1 => 0x6bdb, 0xd2 => 0x731b, 0xd3 => 0x76f2, 0xd4 => 0x7db2, + 0xd5 => 0x8017, 0xd6 => 0x8499, 0xd7 => 0x5132, 0xd8 => 0x6728, + 0xd9 => 0x9ed9, 0xda => 0x76ee, 0xdb => 0x6762, 0xdc => 0x52ff, + 0xdd => 0x9905, 0xde => 0x5c24, 0xdf => 0x623b, 0xe0 => 0x7c7e, + 0xe1 => 0x8cb0, 0xe2 => 0x554f, 0xe3 => 0x60b6, 0xe4 => 0x7d0b, + 0xe5 => 0x9580, 0xe6 => 0x5301, 0xe7 => 0x4e5f, 0xe8 => 0x51b6, + 0xe9 => 0x591c, 0xea => 0x723a, 0xeb => 0x8036, 0xec => 0x91ce, + 0xed => 0x5f25, 0xee => 0x77e2, 0xef => 0x5384, 0xf0 => 0x5f79, + 0xf1 => 0x7d04, 0xf2 => 0x85ac, 0xf3 => 0x8a33, 0xf4 => 0x8e8d, + 0xf5 => 0x9756, 0xf6 => 0x67f3, 0xf7 => 0x85ae, 0xf8 => 0x9453, + 0xf9 => 0x6109, 0xfa => 0x6108, 0xfb => 0x6cb9, 0xfc => 0x7652, + }, + 0x97 => { + 0x40 => 0x8aed, 0x41 => 0x8f38, 0x42 => 0x552f, 0x43 => 0x4f51, + 0x44 => 0x512a, 0x45 => 0x52c7, 0x46 => 0x53cb, 0x47 => 0x5ba5, + 0x48 => 0x5e7d, 0x49 => 0x60a0, 0x4a => 0x6182, 0x4b => 0x63d6, + 0x4c => 0x6709, 0x4d => 0x67da, 0x4e => 0x6e67, 0x4f => 0x6d8c, + 0x50 => 0x7336, 0x51 => 0x7337, 0x52 => 0x7531, 0x53 => 0x7950, + 0x54 => 0x88d5, 0x55 => 0x8a98, 0x56 => 0x904a, 0x57 => 0x9091, + 0x58 => 0x90f5, 0x59 => 0x96c4, 0x5a => 0x878d, 0x5b => 0x5915, + 0x5c => 0x4e88, 0x5d => 0x4f59, 0x5e => 0x4e0e, 0x5f => 0x8a89, + 0x60 => 0x8f3f, 0x61 => 0x9810, 0x62 => 0x50ad, 0x63 => 0x5e7c, + 0x64 => 0x5996, 0x65 => 0x5bb9, 0x66 => 0x5eb8, 0x67 => 0x63da, + 0x68 => 0x63fa, 0x69 => 0x64c1, 0x6a => 0x66dc, 0x6b => 0x694a, + 0x6c => 0x69d8, 0x6d => 0x6d0b, 0x6e => 0x6eb6, 0x6f => 0x7194, + 0x70 => 0x7528, 0x71 => 0x7aaf, 0x72 => 0x7f8a, 0x73 => 0x8000, + 0x74 => 0x8449, 0x75 => 0x84c9, 0x76 => 0x8981, 0x77 => 0x8b21, + 0x78 => 0x8e0a, 0x79 => 0x9065, 0x7a => 0x967d, 0x7b => 0x990a, + 0x7c => 0x617e, 0x7d => 0x6291, 0x7e => 0x6b32, 0x80 => 0x6c83, + 0x81 => 0x6d74, 0x82 => 0x7fcc, 0x83 => 0x7ffc, 0x84 => 0x6dc0, + 0x85 => 0x7f85, 0x86 => 0x87ba, 0x87 => 0x88f8, 0x88 => 0x6765, + 0x89 => 0x83b1, 0x8a => 0x983c, 0x8b => 0x96f7, 0x8c => 0x6d1b, + 0x8d => 0x7d61, 0x8e => 0x843d, 0x8f => 0x916a, 0x90 => 0x4e71, + 0x91 => 0x5375, 0x92 => 0x5d50, 0x93 => 0x6b04, 0x94 => 0x6feb, + 0x95 => 0x85cd, 0x96 => 0x862d, 0x97 => 0x89a7, 0x98 => 0x5229, + 0x99 => 0x540f, 0x9a => 0x5c65, 0x9b => 0x674e, 0x9c => 0x68a8, + 0x9d => 0x7406, 0x9e => 0x7483, 0x9f => 0x75e2, 0xa0 => 0x88cf, + 0xa1 => 0x88e1, 0xa2 => 0x91cc, 0xa3 => 0x96e2, 0xa4 => 0x9678, + 0xa5 => 0x5f8b, 0xa6 => 0x7387, 0xa7 => 0x7acb, 0xa8 => 0x844e, + 0xa9 => 0x63a0, 0xaa => 0x7565, 0xab => 0x5289, 0xac => 0x6d41, + 0xad => 0x6e9c, 0xae => 0x7409, 0xaf => 0x7559, 0xb0 => 0x786b, + 0xb1 => 0x7c92, 0xb2 => 0x9686, 0xb3 => 0x7adc, 0xb4 => 0x9f8d, + 0xb5 => 0x4fb6, 0xb6 => 0x616e, 0xb7 => 0x65c5, 0xb8 => 0x865c, + 0xb9 => 0x4e86, 0xba => 0x4eae, 0xbb => 0x50da, 0xbc => 0x4e21, + 0xbd => 0x51cc, 0xbe => 0x5bee, 0xbf => 0x6599, 0xc0 => 0x6881, + 0xc1 => 0x6dbc, 0xc2 => 0x731f, 0xc3 => 0x7642, 0xc4 => 0x77ad, + 0xc5 => 0x7a1c, 0xc6 => 0x7ce7, 0xc7 => 0x826f, 0xc8 => 0x8ad2, + 0xc9 => 0x907c, 0xca => 0x91cf, 0xcb => 0x9675, 0xcc => 0x9818, + 0xcd => 0x529b, 0xce => 0x7dd1, 0xcf => 0x502b, 0xd0 => 0x5398, + 0xd1 => 0x6797, 0xd2 => 0x6dcb, 0xd3 => 0x71d0, 0xd4 => 0x7433, + 0xd5 => 0x81e8, 0xd6 => 0x8f2a, 0xd7 => 0x96a3, 0xd8 => 0x9c57, + 0xd9 => 0x9e9f, 0xda => 0x7460, 0xdb => 0x5841, 0xdc => 0x6d99, + 0xdd => 0x7d2f, 0xde => 0x985e, 0xdf => 0x4ee4, 0xe0 => 0x4f36, + 0xe1 => 0x4f8b, 0xe2 => 0x51b7, 0xe3 => 0x52b1, 0xe4 => 0x5dba, + 0xe5 => 0x601c, 0xe6 => 0x73b2, 0xe7 => 0x793c, 0xe8 => 0x82d3, + 0xe9 => 0x9234, 0xea => 0x96b7, 0xeb => 0x96f6, 0xec => 0x970a, + 0xed => 0x9e97, 0xee => 0x9f62, 0xef => 0x66a6, 0xf0 => 0x6b74, + 0xf1 => 0x5217, 0xf2 => 0x52a3, 0xf3 => 0x70c8, 0xf4 => 0x88c2, + 0xf5 => 0x5ec9, 0xf6 => 0x604b, 0xf7 => 0x6190, 0xf8 => 0x6f23, + 0xf9 => 0x7149, 0xfa => 0x7c3e, 0xfb => 0x7df4, 0xfc => 0x806f, + }, + 0x98 => { + 0x40 => 0x84ee, 0x41 => 0x9023, 0x42 => 0x932c, 0x43 => 0x5442, + 0x44 => 0x9b6f, 0x45 => 0x6ad3, 0x46 => 0x7089, 0x47 => 0x8cc2, + 0x48 => 0x8def, 0x49 => 0x9732, 0x4a => 0x52b4, 0x4b => 0x5a41, + 0x4c => 0x5eca, 0x4d => 0x5f04, 0x4e => 0x6717, 0x4f => 0x697c, + 0x50 => 0x6994, 0x51 => 0x6d6a, 0x52 => 0x6f0f, 0x53 => 0x7262, + 0x54 => 0x72fc, 0x55 => 0x7bed, 0x56 => 0x8001, 0x57 => 0x807e, + 0x58 => 0x874b, 0x59 => 0x90ce, 0x5a => 0x516d, 0x5b => 0x9e93, + 0x5c => 0x7984, 0x5d => 0x808b, 0x5e => 0x9332, 0x5f => 0x8ad6, + 0x60 => 0x502d, 0x61 => 0x548c, 0x62 => 0x8a71, 0x63 => 0x6b6a, + 0x64 => 0x8cc4, 0x65 => 0x8107, 0x66 => 0x60d1, 0x67 => 0x67a0, + 0x68 => 0x9df2, 0x69 => 0x4e99, 0x6a => 0x4e98, 0x6b => 0x9c10, + 0x6c => 0x8a6b, 0x6d => 0x85c1, 0x6e => 0x8568, 0x6f => 0x6900, + 0x70 => 0x6e7e, 0x71 => 0x7897, 0x72 => 0x8155, 0x9f => 0x5f0c, + 0xa0 => 0x4e10, 0xa1 => 0x4e15, 0xa2 => 0x4e2a, 0xa3 => 0x4e31, + 0xa4 => 0x4e36, 0xa5 => 0x4e3c, 0xa6 => 0x4e3f, 0xa7 => 0x4e42, + 0xa8 => 0x4e56, 0xa9 => 0x4e58, 0xaa => 0x4e82, 0xab => 0x4e85, + 0xac => 0x8c6b, 0xad => 0x4e8a, 0xae => 0x8212, 0xaf => 0x5f0d, + 0xb0 => 0x4e8e, 0xb1 => 0x4e9e, 0xb2 => 0x4e9f, 0xb3 => 0x4ea0, + 0xb4 => 0x4ea2, 0xb5 => 0x4eb0, 0xb6 => 0x4eb3, 0xb7 => 0x4eb6, + 0xb8 => 0x4ece, 0xb9 => 0x4ecd, 0xba => 0x4ec4, 0xbb => 0x4ec6, + 0xbc => 0x4ec2, 0xbd => 0x4ed7, 0xbe => 0x4ede, 0xbf => 0x4eed, + 0xc0 => 0x4edf, 0xc1 => 0x4ef7, 0xc2 => 0x4f09, 0xc3 => 0x4f5a, + 0xc4 => 0x4f30, 0xc5 => 0x4f5b, 0xc6 => 0x4f5d, 0xc7 => 0x4f57, + 0xc8 => 0x4f47, 0xc9 => 0x4f76, 0xca => 0x4f88, 0xcb => 0x4f8f, + 0xcc => 0x4f98, 0xcd => 0x4f7b, 0xce => 0x4f69, 0xcf => 0x4f70, + 0xd0 => 0x4f91, 0xd1 => 0x4f6f, 0xd2 => 0x4f86, 0xd3 => 0x4f96, + 0xd4 => 0x5118, 0xd5 => 0x4fd4, 0xd6 => 0x4fdf, 0xd7 => 0x4fce, + 0xd8 => 0x4fd8, 0xd9 => 0x4fdb, 0xda => 0x4fd1, 0xdb => 0x4fda, + 0xdc => 0x4fd0, 0xdd => 0x4fe4, 0xde => 0x4fe5, 0xdf => 0x501a, + 0xe0 => 0x5028, 0xe1 => 0x5014, 0xe2 => 0x502a, 0xe3 => 0x5025, + 0xe4 => 0x5005, 0xe5 => 0x4f1c, 0xe6 => 0x4ff6, 0xe7 => 0x5021, + 0xe8 => 0x5029, 0xe9 => 0x502c, 0xea => 0x4ffe, 0xeb => 0x4fef, + 0xec => 0x5011, 0xed => 0x5006, 0xee => 0x5043, 0xef => 0x5047, + 0xf0 => 0x6703, 0xf1 => 0x5055, 0xf2 => 0x5050, 0xf3 => 0x5048, + 0xf4 => 0x505a, 0xf5 => 0x5056, 0xf6 => 0x506c, 0xf7 => 0x5078, + 0xf8 => 0x5080, 0xf9 => 0x509a, 0xfa => 0x5085, 0xfb => 0x50b4, + 0xfc => 0x50b2, + }, + 0x99 => { + 0x40 => 0x50c9, 0x41 => 0x50ca, 0x42 => 0x50b3, 0x43 => 0x50c2, + 0x44 => 0x50d6, 0x45 => 0x50de, 0x46 => 0x50e5, 0x47 => 0x50ed, + 0x48 => 0x50e3, 0x49 => 0x50ee, 0x4a => 0x50f9, 0x4b => 0x50f5, + 0x4c => 0x5109, 0x4d => 0x5101, 0x4e => 0x5102, 0x4f => 0x5116, + 0x50 => 0x5115, 0x51 => 0x5114, 0x52 => 0x511a, 0x53 => 0x5121, + 0x54 => 0x513a, 0x55 => 0x5137, 0x56 => 0x513c, 0x57 => 0x513b, + 0x58 => 0x513f, 0x59 => 0x5140, 0x5a => 0x5152, 0x5b => 0x514c, + 0x5c => 0x5154, 0x5d => 0x5162, 0x5e => 0x7af8, 0x5f => 0x5169, + 0x60 => 0x516a, 0x61 => 0x516e, 0x62 => 0x5180, 0x63 => 0x5182, + 0x64 => 0x56d8, 0x65 => 0x518c, 0x66 => 0x5189, 0x67 => 0x518f, + 0x68 => 0x5191, 0x69 => 0x5193, 0x6a => 0x5195, 0x6b => 0x5196, + 0x6c => 0x51a4, 0x6d => 0x51a6, 0x6e => 0x51a2, 0x6f => 0x51a9, + 0x70 => 0x51aa, 0x71 => 0x51ab, 0x72 => 0x51b3, 0x73 => 0x51b1, + 0x74 => 0x51b2, 0x75 => 0x51b0, 0x76 => 0x51b5, 0x77 => 0x51bd, + 0x78 => 0x51c5, 0x79 => 0x51c9, 0x7a => 0x51db, 0x7b => 0x51e0, + 0x7c => 0x8655, 0x7d => 0x51e9, 0x7e => 0x51ed, 0x80 => 0x51f0, + 0x81 => 0x51f5, 0x82 => 0x51fe, 0x83 => 0x5204, 0x84 => 0x520b, + 0x85 => 0x5214, 0x86 => 0x520e, 0x87 => 0x5227, 0x88 => 0x522a, + 0x89 => 0x522e, 0x8a => 0x5233, 0x8b => 0x5239, 0x8c => 0x524f, + 0x8d => 0x5244, 0x8e => 0x524b, 0x8f => 0x524c, 0x90 => 0x525e, + 0x91 => 0x5254, 0x92 => 0x526a, 0x93 => 0x5274, 0x94 => 0x5269, + 0x95 => 0x5273, 0x96 => 0x527f, 0x97 => 0x527d, 0x98 => 0x528d, + 0x99 => 0x5294, 0x9a => 0x5292, 0x9b => 0x5271, 0x9c => 0x5288, + 0x9d => 0x5291, 0x9e => 0x8fa8, 0x9f => 0x8fa7, 0xa0 => 0x52ac, + 0xa1 => 0x52ad, 0xa2 => 0x52bc, 0xa3 => 0x52b5, 0xa4 => 0x52c1, + 0xa5 => 0x52cd, 0xa6 => 0x52d7, 0xa7 => 0x52de, 0xa8 => 0x52e3, + 0xa9 => 0x52e6, 0xaa => 0x98ed, 0xab => 0x52e0, 0xac => 0x52f3, + 0xad => 0x52f5, 0xae => 0x52f8, 0xaf => 0x52f9, 0xb0 => 0x5306, + 0xb1 => 0x5308, 0xb2 => 0x7538, 0xb3 => 0x530d, 0xb4 => 0x5310, + 0xb5 => 0x530f, 0xb6 => 0x5315, 0xb7 => 0x531a, 0xb8 => 0x5323, + 0xb9 => 0x532f, 0xba => 0x5331, 0xbb => 0x5333, 0xbc => 0x5338, + 0xbd => 0x5340, 0xbe => 0x5346, 0xbf => 0x5345, 0xc0 => 0x4e17, + 0xc1 => 0x5349, 0xc2 => 0x534d, 0xc3 => 0x51d6, 0xc4 => 0x535e, + 0xc5 => 0x5369, 0xc6 => 0x536e, 0xc7 => 0x5918, 0xc8 => 0x537b, + 0xc9 => 0x5377, 0xca => 0x5382, 0xcb => 0x5396, 0xcc => 0x53a0, + 0xcd => 0x53a6, 0xce => 0x53a5, 0xcf => 0x53ae, 0xd0 => 0x53b0, + 0xd1 => 0x53b6, 0xd2 => 0x53c3, 0xd3 => 0x7c12, 0xd4 => 0x96d9, + 0xd5 => 0x53df, 0xd6 => 0x66fc, 0xd7 => 0x71ee, 0xd8 => 0x53ee, + 0xd9 => 0x53e8, 0xda => 0x53ed, 0xdb => 0x53fa, 0xdc => 0x5401, + 0xdd => 0x543d, 0xde => 0x5440, 0xdf => 0x542c, 0xe0 => 0x542d, + 0xe1 => 0x543c, 0xe2 => 0x542e, 0xe3 => 0x5436, 0xe4 => 0x5429, + 0xe5 => 0x541d, 0xe6 => 0x544e, 0xe7 => 0x548f, 0xe8 => 0x5475, + 0xe9 => 0x548e, 0xea => 0x545f, 0xeb => 0x5471, 0xec => 0x5477, + 0xed => 0x5470, 0xee => 0x5492, 0xef => 0x547b, 0xf0 => 0x5480, + 0xf1 => 0x5476, 0xf2 => 0x5484, 0xf3 => 0x5490, 0xf4 => 0x5486, + 0xf5 => 0x54c7, 0xf6 => 0x54a2, 0xf7 => 0x54b8, 0xf8 => 0x54a5, + 0xf9 => 0x54ac, 0xfa => 0x54c4, 0xfb => 0x54c8, 0xfc => 0x54a8, + }, + 0x9a => { + 0x40 => 0x54ab, 0x41 => 0x54c2, 0x42 => 0x54a4, 0x43 => 0x54be, + 0x44 => 0x54bc, 0x45 => 0x54d8, 0x46 => 0x54e5, 0x47 => 0x54e6, + 0x48 => 0x550f, 0x49 => 0x5514, 0x4a => 0x54fd, 0x4b => 0x54ee, + 0x4c => 0x54ed, 0x4d => 0x54fa, 0x4e => 0x54e2, 0x4f => 0x5539, + 0x50 => 0x5540, 0x51 => 0x5563, 0x52 => 0x554c, 0x53 => 0x552e, + 0x54 => 0x555c, 0x55 => 0x5545, 0x56 => 0x5556, 0x57 => 0x5557, + 0x58 => 0x5538, 0x59 => 0x5533, 0x5a => 0x555d, 0x5b => 0x5599, + 0x5c => 0x5580, 0x5d => 0x54af, 0x5e => 0x558a, 0x5f => 0x559f, + 0x60 => 0x557b, 0x61 => 0x557e, 0x62 => 0x5598, 0x63 => 0x559e, + 0x64 => 0x55ae, 0x65 => 0x557c, 0x66 => 0x5583, 0x67 => 0x55a9, + 0x68 => 0x5587, 0x69 => 0x55a8, 0x6a => 0x55da, 0x6b => 0x55c5, + 0x6c => 0x55df, 0x6d => 0x55c4, 0x6e => 0x55dc, 0x6f => 0x55e4, + 0x70 => 0x55d4, 0x71 => 0x5614, 0x72 => 0x55f7, 0x73 => 0x5616, + 0x74 => 0x55fe, 0x75 => 0x55fd, 0x76 => 0x561b, 0x77 => 0x55f9, + 0x78 => 0x564e, 0x79 => 0x5650, 0x7a => 0x71df, 0x7b => 0x5634, + 0x7c => 0x5636, 0x7d => 0x5632, 0x7e => 0x5638, 0x80 => 0x566b, + 0x81 => 0x5664, 0x82 => 0x562f, 0x83 => 0x566c, 0x84 => 0x566a, + 0x85 => 0x5686, 0x86 => 0x5680, 0x87 => 0x568a, 0x88 => 0x56a0, + 0x89 => 0x5694, 0x8a => 0x568f, 0x8b => 0x56a5, 0x8c => 0x56ae, + 0x8d => 0x56b6, 0x8e => 0x56b4, 0x8f => 0x56c2, 0x90 => 0x56bc, + 0x91 => 0x56c1, 0x92 => 0x56c3, 0x93 => 0x56c0, 0x94 => 0x56c8, + 0x95 => 0x56ce, 0x96 => 0x56d1, 0x97 => 0x56d3, 0x98 => 0x56d7, + 0x99 => 0x56ee, 0x9a => 0x56f9, 0x9b => 0x5700, 0x9c => 0x56ff, + 0x9d => 0x5704, 0x9e => 0x5709, 0x9f => 0x5708, 0xa0 => 0x570b, + 0xa1 => 0x570d, 0xa2 => 0x5713, 0xa3 => 0x5718, 0xa4 => 0x5716, + 0xa5 => 0x55c7, 0xa6 => 0x571c, 0xa7 => 0x5726, 0xa8 => 0x5737, + 0xa9 => 0x5738, 0xaa => 0x574e, 0xab => 0x573b, 0xac => 0x5740, + 0xad => 0x574f, 0xae => 0x5769, 0xaf => 0x57c0, 0xb0 => 0x5788, + 0xb1 => 0x5761, 0xb2 => 0x577f, 0xb3 => 0x5789, 0xb4 => 0x5793, + 0xb5 => 0x57a0, 0xb6 => 0x57b3, 0xb7 => 0x57a4, 0xb8 => 0x57aa, + 0xb9 => 0x57b0, 0xba => 0x57c3, 0xbb => 0x57c6, 0xbc => 0x57d4, + 0xbd => 0x57d2, 0xbe => 0x57d3, 0xbf => 0x580a, 0xc0 => 0x57d6, + 0xc1 => 0x57e3, 0xc2 => 0x580b, 0xc3 => 0x5819, 0xc4 => 0x581d, + 0xc5 => 0x5872, 0xc6 => 0x5821, 0xc7 => 0x5862, 0xc8 => 0x584b, + 0xc9 => 0x5870, 0xca => 0x6bc0, 0xcb => 0x5852, 0xcc => 0x583d, + 0xcd => 0x5879, 0xce => 0x5885, 0xcf => 0x58b9, 0xd0 => 0x589f, + 0xd1 => 0x58ab, 0xd2 => 0x58ba, 0xd3 => 0x58de, 0xd4 => 0x58bb, + 0xd5 => 0x58b8, 0xd6 => 0x58ae, 0xd7 => 0x58c5, 0xd8 => 0x58d3, + 0xd9 => 0x58d1, 0xda => 0x58d7, 0xdb => 0x58d9, 0xdc => 0x58d8, + 0xdd => 0x58e5, 0xde => 0x58dc, 0xdf => 0x58e4, 0xe0 => 0x58df, + 0xe1 => 0x58ef, 0xe2 => 0x58fa, 0xe3 => 0x58f9, 0xe4 => 0x58fb, + 0xe5 => 0x58fc, 0xe6 => 0x58fd, 0xe7 => 0x5902, 0xe8 => 0x590a, + 0xe9 => 0x5910, 0xea => 0x591b, 0xeb => 0x68a6, 0xec => 0x5925, + 0xed => 0x592c, 0xee => 0x592d, 0xef => 0x5932, 0xf0 => 0x5938, + 0xf1 => 0x593e, 0xf2 => 0x7ad2, 0xf3 => 0x5955, 0xf4 => 0x5950, + 0xf5 => 0x594e, 0xf6 => 0x595a, 0xf7 => 0x5958, 0xf8 => 0x5962, + 0xf9 => 0x5960, 0xfa => 0x5967, 0xfb => 0x596c, 0xfc => 0x5969, + }, + 0x9b => { + 0x40 => 0x5978, 0x41 => 0x5981, 0x42 => 0x599d, 0x43 => 0x4f5e, + 0x44 => 0x4fab, 0x45 => 0x59a3, 0x46 => 0x59b2, 0x47 => 0x59c6, + 0x48 => 0x59e8, 0x49 => 0x59dc, 0x4a => 0x598d, 0x4b => 0x59d9, + 0x4c => 0x59da, 0x4d => 0x5a25, 0x4e => 0x5a1f, 0x4f => 0x5a11, + 0x50 => 0x5a1c, 0x51 => 0x5a09, 0x52 => 0x5a1a, 0x53 => 0x5a40, + 0x54 => 0x5a6c, 0x55 => 0x5a49, 0x56 => 0x5a35, 0x57 => 0x5a36, + 0x58 => 0x5a62, 0x59 => 0x5a6a, 0x5a => 0x5a9a, 0x5b => 0x5abc, + 0x5c => 0x5abe, 0x5d => 0x5acb, 0x5e => 0x5ac2, 0x5f => 0x5abd, + 0x60 => 0x5ae3, 0x61 => 0x5ad7, 0x62 => 0x5ae6, 0x63 => 0x5ae9, + 0x64 => 0x5ad6, 0x65 => 0x5afa, 0x66 => 0x5afb, 0x67 => 0x5b0c, + 0x68 => 0x5b0b, 0x69 => 0x5b16, 0x6a => 0x5b32, 0x6b => 0x5ad0, + 0x6c => 0x5b2a, 0x6d => 0x5b36, 0x6e => 0x5b3e, 0x6f => 0x5b43, + 0x70 => 0x5b45, 0x71 => 0x5b40, 0x72 => 0x5b51, 0x73 => 0x5b55, + 0x74 => 0x5b5a, 0x75 => 0x5b5b, 0x76 => 0x5b65, 0x77 => 0x5b69, + 0x78 => 0x5b70, 0x79 => 0x5b73, 0x7a => 0x5b75, 0x7b => 0x5b78, + 0x7c => 0x6588, 0x7d => 0x5b7a, 0x7e => 0x5b80, 0x80 => 0x5b83, + 0x81 => 0x5ba6, 0x82 => 0x5bb8, 0x83 => 0x5bc3, 0x84 => 0x5bc7, + 0x85 => 0x5bc9, 0x86 => 0x5bd4, 0x87 => 0x5bd0, 0x88 => 0x5be4, + 0x89 => 0x5be6, 0x8a => 0x5be2, 0x8b => 0x5bde, 0x8c => 0x5be5, + 0x8d => 0x5beb, 0x8e => 0x5bf0, 0x8f => 0x5bf6, 0x90 => 0x5bf3, + 0x91 => 0x5c05, 0x92 => 0x5c07, 0x93 => 0x5c08, 0x94 => 0x5c0d, + 0x95 => 0x5c13, 0x96 => 0x5c20, 0x97 => 0x5c22, 0x98 => 0x5c28, + 0x99 => 0x5c38, 0x9a => 0x5c39, 0x9b => 0x5c41, 0x9c => 0x5c46, + 0x9d => 0x5c4e, 0x9e => 0x5c53, 0x9f => 0x5c50, 0xa0 => 0x5c4f, + 0xa1 => 0x5b71, 0xa2 => 0x5c6c, 0xa3 => 0x5c6e, 0xa4 => 0x4e62, + 0xa5 => 0x5c76, 0xa6 => 0x5c79, 0xa7 => 0x5c8c, 0xa8 => 0x5c91, + 0xa9 => 0x5c94, 0xaa => 0x599b, 0xab => 0x5cab, 0xac => 0x5cbb, + 0xad => 0x5cb6, 0xae => 0x5cbc, 0xaf => 0x5cb7, 0xb0 => 0x5cc5, + 0xb1 => 0x5cbe, 0xb2 => 0x5cc7, 0xb3 => 0x5cd9, 0xb4 => 0x5ce9, + 0xb5 => 0x5cfd, 0xb6 => 0x5cfa, 0xb7 => 0x5ced, 0xb8 => 0x5d8c, + 0xb9 => 0x5cea, 0xba => 0x5d0b, 0xbb => 0x5d15, 0xbc => 0x5d17, + 0xbd => 0x5d5c, 0xbe => 0x5d1f, 0xbf => 0x5d1b, 0xc0 => 0x5d11, + 0xc1 => 0x5d14, 0xc2 => 0x5d22, 0xc3 => 0x5d1a, 0xc4 => 0x5d19, + 0xc5 => 0x5d18, 0xc6 => 0x5d4c, 0xc7 => 0x5d52, 0xc8 => 0x5d4e, + 0xc9 => 0x5d4b, 0xca => 0x5d6c, 0xcb => 0x5d73, 0xcc => 0x5d76, + 0xcd => 0x5d87, 0xce => 0x5d84, 0xcf => 0x5d82, 0xd0 => 0x5da2, + 0xd1 => 0x5d9d, 0xd2 => 0x5dac, 0xd3 => 0x5dae, 0xd4 => 0x5dbd, + 0xd5 => 0x5d90, 0xd6 => 0x5db7, 0xd7 => 0x5dbc, 0xd8 => 0x5dc9, + 0xd9 => 0x5dcd, 0xda => 0x5dd3, 0xdb => 0x5dd2, 0xdc => 0x5dd6, + 0xdd => 0x5ddb, 0xde => 0x5deb, 0xdf => 0x5df2, 0xe0 => 0x5df5, + 0xe1 => 0x5e0b, 0xe2 => 0x5e1a, 0xe3 => 0x5e19, 0xe4 => 0x5e11, + 0xe5 => 0x5e1b, 0xe6 => 0x5e36, 0xe7 => 0x5e37, 0xe8 => 0x5e44, + 0xe9 => 0x5e43, 0xea => 0x5e40, 0xeb => 0x5e4e, 0xec => 0x5e57, + 0xed => 0x5e54, 0xee => 0x5e5f, 0xef => 0x5e62, 0xf0 => 0x5e64, + 0xf1 => 0x5e47, 0xf2 => 0x5e75, 0xf3 => 0x5e76, 0xf4 => 0x5e7a, + 0xf5 => 0x9ebc, 0xf6 => 0x5e7f, 0xf7 => 0x5ea0, 0xf8 => 0x5ec1, + 0xf9 => 0x5ec2, 0xfa => 0x5ec8, 0xfb => 0x5ed0, 0xfc => 0x5ecf, + }, + 0x9c => { + 0x40 => 0x5ed6, 0x41 => 0x5ee3, 0x42 => 0x5edd, 0x43 => 0x5eda, + 0x44 => 0x5edb, 0x45 => 0x5ee2, 0x46 => 0x5ee1, 0x47 => 0x5ee8, + 0x48 => 0x5ee9, 0x49 => 0x5eec, 0x4a => 0x5ef1, 0x4b => 0x5ef3, + 0x4c => 0x5ef0, 0x4d => 0x5ef4, 0x4e => 0x5ef8, 0x4f => 0x5efe, + 0x50 => 0x5f03, 0x51 => 0x5f09, 0x52 => 0x5f5d, 0x53 => 0x5f5c, + 0x54 => 0x5f0b, 0x55 => 0x5f11, 0x56 => 0x5f16, 0x57 => 0x5f29, + 0x58 => 0x5f2d, 0x59 => 0x5f38, 0x5a => 0x5f41, 0x5b => 0x5f48, + 0x5c => 0x5f4c, 0x5d => 0x5f4e, 0x5e => 0x5f2f, 0x5f => 0x5f51, + 0x60 => 0x5f56, 0x61 => 0x5f57, 0x62 => 0x5f59, 0x63 => 0x5f61, + 0x64 => 0x5f6d, 0x65 => 0x5f73, 0x66 => 0x5f77, 0x67 => 0x5f83, + 0x68 => 0x5f82, 0x69 => 0x5f7f, 0x6a => 0x5f8a, 0x6b => 0x5f88, + 0x6c => 0x5f91, 0x6d => 0x5f87, 0x6e => 0x5f9e, 0x6f => 0x5f99, + 0x70 => 0x5f98, 0x71 => 0x5fa0, 0x72 => 0x5fa8, 0x73 => 0x5fad, + 0x74 => 0x5fbc, 0x75 => 0x5fd6, 0x76 => 0x5ffb, 0x77 => 0x5fe4, + 0x78 => 0x5ff8, 0x79 => 0x5ff1, 0x7a => 0x5fdd, 0x7b => 0x60b3, + 0x7c => 0x5fff, 0x7d => 0x6021, 0x7e => 0x6060, 0x80 => 0x6019, + 0x81 => 0x6010, 0x82 => 0x6029, 0x83 => 0x600e, 0x84 => 0x6031, + 0x85 => 0x601b, 0x86 => 0x6015, 0x87 => 0x602b, 0x88 => 0x6026, + 0x89 => 0x600f, 0x8a => 0x603a, 0x8b => 0x605a, 0x8c => 0x6041, + 0x8d => 0x606a, 0x8e => 0x6077, 0x8f => 0x605f, 0x90 => 0x604a, + 0x91 => 0x6046, 0x92 => 0x604d, 0x93 => 0x6063, 0x94 => 0x6043, + 0x95 => 0x6064, 0x96 => 0x6042, 0x97 => 0x606c, 0x98 => 0x606b, + 0x99 => 0x6059, 0x9a => 0x6081, 0x9b => 0x608d, 0x9c => 0x60e7, + 0x9d => 0x6083, 0x9e => 0x609a, 0x9f => 0x6084, 0xa0 => 0x609b, + 0xa1 => 0x6096, 0xa2 => 0x6097, 0xa3 => 0x6092, 0xa4 => 0x60a7, + 0xa5 => 0x608b, 0xa6 => 0x60e1, 0xa7 => 0x60b8, 0xa8 => 0x60e0, + 0xa9 => 0x60d3, 0xaa => 0x60b4, 0xab => 0x5ff0, 0xac => 0x60bd, + 0xad => 0x60c6, 0xae => 0x60b5, 0xaf => 0x60d8, 0xb0 => 0x614d, + 0xb1 => 0x6115, 0xb2 => 0x6106, 0xb3 => 0x60f6, 0xb4 => 0x60f7, + 0xb5 => 0x6100, 0xb6 => 0x60f4, 0xb7 => 0x60fa, 0xb8 => 0x6103, + 0xb9 => 0x6121, 0xba => 0x60fb, 0xbb => 0x60f1, 0xbc => 0x610d, + 0xbd => 0x610e, 0xbe => 0x6147, 0xbf => 0x613e, 0xc0 => 0x6128, + 0xc1 => 0x6127, 0xc2 => 0x614a, 0xc3 => 0x613f, 0xc4 => 0x613c, + 0xc5 => 0x612c, 0xc6 => 0x6134, 0xc7 => 0x613d, 0xc8 => 0x6142, + 0xc9 => 0x6144, 0xca => 0x6173, 0xcb => 0x6177, 0xcc => 0x6158, + 0xcd => 0x6159, 0xce => 0x615a, 0xcf => 0x616b, 0xd0 => 0x6174, + 0xd1 => 0x616f, 0xd2 => 0x6165, 0xd3 => 0x6171, 0xd4 => 0x615f, + 0xd5 => 0x615d, 0xd6 => 0x6153, 0xd7 => 0x6175, 0xd8 => 0x6199, + 0xd9 => 0x6196, 0xda => 0x6187, 0xdb => 0x61ac, 0xdc => 0x6194, + 0xdd => 0x619a, 0xde => 0x618a, 0xdf => 0x6191, 0xe0 => 0x61ab, + 0xe1 => 0x61ae, 0xe2 => 0x61cc, 0xe3 => 0x61ca, 0xe4 => 0x61c9, + 0xe5 => 0x61f7, 0xe6 => 0x61c8, 0xe7 => 0x61c3, 0xe8 => 0x61c6, + 0xe9 => 0x61ba, 0xea => 0x61cb, 0xeb => 0x7f79, 0xec => 0x61cd, + 0xed => 0x61e6, 0xee => 0x61e3, 0xef => 0x61f6, 0xf0 => 0x61fa, + 0xf1 => 0x61f4, 0xf2 => 0x61ff, 0xf3 => 0x61fd, 0xf4 => 0x61fc, + 0xf5 => 0x61fe, 0xf6 => 0x6200, 0xf7 => 0x6208, 0xf8 => 0x6209, + 0xf9 => 0x620d, 0xfa => 0x620c, 0xfb => 0x6214, 0xfc => 0x621b, + }, + 0x9d => { + 0x40 => 0x621e, 0x41 => 0x6221, 0x42 => 0x622a, 0x43 => 0x622e, + 0x44 => 0x6230, 0x45 => 0x6232, 0x46 => 0x6233, 0x47 => 0x6241, + 0x48 => 0x624e, 0x49 => 0x625e, 0x4a => 0x6263, 0x4b => 0x625b, + 0x4c => 0x6260, 0x4d => 0x6268, 0x4e => 0x627c, 0x4f => 0x6282, + 0x50 => 0x6289, 0x51 => 0x627e, 0x52 => 0x6292, 0x53 => 0x6293, + 0x54 => 0x6296, 0x55 => 0x62d4, 0x56 => 0x6283, 0x57 => 0x6294, + 0x58 => 0x62d7, 0x59 => 0x62d1, 0x5a => 0x62bb, 0x5b => 0x62cf, + 0x5c => 0x62ff, 0x5d => 0x62c6, 0x5e => 0x64d4, 0x5f => 0x62c8, + 0x60 => 0x62dc, 0x61 => 0x62cc, 0x62 => 0x62ca, 0x63 => 0x62c2, + 0x64 => 0x62c7, 0x65 => 0x629b, 0x66 => 0x62c9, 0x67 => 0x630c, + 0x68 => 0x62ee, 0x69 => 0x62f1, 0x6a => 0x6327, 0x6b => 0x6302, + 0x6c => 0x6308, 0x6d => 0x62ef, 0x6e => 0x62f5, 0x6f => 0x6350, + 0x70 => 0x633e, 0x71 => 0x634d, 0x72 => 0x641c, 0x73 => 0x634f, + 0x74 => 0x6396, 0x75 => 0x638e, 0x76 => 0x6380, 0x77 => 0x63ab, + 0x78 => 0x6376, 0x79 => 0x63a3, 0x7a => 0x638f, 0x7b => 0x6389, + 0x7c => 0x639f, 0x7d => 0x63b5, 0x7e => 0x636b, 0x80 => 0x6369, + 0x81 => 0x63be, 0x82 => 0x63e9, 0x83 => 0x63c0, 0x84 => 0x63c6, + 0x85 => 0x63e3, 0x86 => 0x63c9, 0x87 => 0x63d2, 0x88 => 0x63f6, + 0x89 => 0x63c4, 0x8a => 0x6416, 0x8b => 0x6434, 0x8c => 0x6406, + 0x8d => 0x6413, 0x8e => 0x6426, 0x8f => 0x6436, 0x90 => 0x651d, + 0x91 => 0x6417, 0x92 => 0x6428, 0x93 => 0x640f, 0x94 => 0x6467, + 0x95 => 0x646f, 0x96 => 0x6476, 0x97 => 0x644e, 0x98 => 0x652a, + 0x99 => 0x6495, 0x9a => 0x6493, 0x9b => 0x64a5, 0x9c => 0x64a9, + 0x9d => 0x6488, 0x9e => 0x64bc, 0x9f => 0x64da, 0xa0 => 0x64d2, + 0xa1 => 0x64c5, 0xa2 => 0x64c7, 0xa3 => 0x64bb, 0xa4 => 0x64d8, + 0xa5 => 0x64c2, 0xa6 => 0x64f1, 0xa7 => 0x64e7, 0xa8 => 0x8209, + 0xa9 => 0x64e0, 0xaa => 0x64e1, 0xab => 0x62ac, 0xac => 0x64e3, + 0xad => 0x64ef, 0xae => 0x652c, 0xaf => 0x64f6, 0xb0 => 0x64f4, + 0xb1 => 0x64f2, 0xb2 => 0x64fa, 0xb3 => 0x6500, 0xb4 => 0x64fd, + 0xb5 => 0x6518, 0xb6 => 0x651c, 0xb7 => 0x6505, 0xb8 => 0x6524, + 0xb9 => 0x6523, 0xba => 0x652b, 0xbb => 0x6534, 0xbc => 0x6535, + 0xbd => 0x6537, 0xbe => 0x6536, 0xbf => 0x6538, 0xc0 => 0x754b, + 0xc1 => 0x6548, 0xc2 => 0x6556, 0xc3 => 0x6555, 0xc4 => 0x654d, + 0xc5 => 0x6558, 0xc6 => 0x655e, 0xc7 => 0x655d, 0xc8 => 0x6572, + 0xc9 => 0x6578, 0xca => 0x6582, 0xcb => 0x6583, 0xcc => 0x8b8a, + 0xcd => 0x659b, 0xce => 0x659f, 0xcf => 0x65ab, 0xd0 => 0x65b7, + 0xd1 => 0x65c3, 0xd2 => 0x65c6, 0xd3 => 0x65c1, 0xd4 => 0x65c4, + 0xd5 => 0x65cc, 0xd6 => 0x65d2, 0xd7 => 0x65db, 0xd8 => 0x65d9, + 0xd9 => 0x65e0, 0xda => 0x65e1, 0xdb => 0x65f1, 0xdc => 0x6772, + 0xdd => 0x660a, 0xde => 0x6603, 0xdf => 0x65fb, 0xe0 => 0x6773, + 0xe1 => 0x6635, 0xe2 => 0x6636, 0xe3 => 0x6634, 0xe4 => 0x661c, + 0xe5 => 0x664f, 0xe6 => 0x6644, 0xe7 => 0x6649, 0xe8 => 0x6641, + 0xe9 => 0x665e, 0xea => 0x665d, 0xeb => 0x6664, 0xec => 0x6667, + 0xed => 0x6668, 0xee => 0x665f, 0xef => 0x6662, 0xf0 => 0x6670, + 0xf1 => 0x6683, 0xf2 => 0x6688, 0xf3 => 0x668e, 0xf4 => 0x6689, + 0xf5 => 0x6684, 0xf6 => 0x6698, 0xf7 => 0x669d, 0xf8 => 0x66c1, + 0xf9 => 0x66b9, 0xfa => 0x66c9, 0xfb => 0x66be, 0xfc => 0x66bc, + }, + 0x9e => { + 0x40 => 0x66c4, 0x41 => 0x66b8, 0x42 => 0x66d6, 0x43 => 0x66da, + 0x44 => 0x66e0, 0x45 => 0x663f, 0x46 => 0x66e6, 0x47 => 0x66e9, + 0x48 => 0x66f0, 0x49 => 0x66f5, 0x4a => 0x66f7, 0x4b => 0x670f, + 0x4c => 0x6716, 0x4d => 0x671e, 0x4e => 0x6726, 0x4f => 0x6727, + 0x50 => 0x9738, 0x51 => 0x672e, 0x52 => 0x673f, 0x53 => 0x6736, + 0x54 => 0x6741, 0x55 => 0x6738, 0x56 => 0x6737, 0x57 => 0x6746, + 0x58 => 0x675e, 0x59 => 0x6760, 0x5a => 0x6759, 0x5b => 0x6763, + 0x5c => 0x6764, 0x5d => 0x6789, 0x5e => 0x6770, 0x5f => 0x67a9, + 0x60 => 0x677c, 0x61 => 0x676a, 0x62 => 0x678c, 0x63 => 0x678b, + 0x64 => 0x67a6, 0x65 => 0x67a1, 0x66 => 0x6785, 0x67 => 0x67b7, + 0x68 => 0x67ef, 0x69 => 0x67b4, 0x6a => 0x67ec, 0x6b => 0x67b3, + 0x6c => 0x67e9, 0x6d => 0x67b8, 0x6e => 0x67e4, 0x6f => 0x67de, + 0x70 => 0x67dd, 0x71 => 0x67e2, 0x72 => 0x67ee, 0x73 => 0x67b9, + 0x74 => 0x67ce, 0x75 => 0x67c6, 0x76 => 0x67e7, 0x77 => 0x6a9c, + 0x78 => 0x681e, 0x79 => 0x6846, 0x7a => 0x6829, 0x7b => 0x6840, + 0x7c => 0x684d, 0x7d => 0x6832, 0x7e => 0x684e, 0x80 => 0x68b3, + 0x81 => 0x682b, 0x82 => 0x6859, 0x83 => 0x6863, 0x84 => 0x6877, + 0x85 => 0x687f, 0x86 => 0x689f, 0x87 => 0x688f, 0x88 => 0x68ad, + 0x89 => 0x6894, 0x8a => 0x689d, 0x8b => 0x689b, 0x8c => 0x6883, + 0x8d => 0x6aae, 0x8e => 0x68b9, 0x8f => 0x6874, 0x90 => 0x68b5, + 0x91 => 0x68a0, 0x92 => 0x68ba, 0x93 => 0x690f, 0x94 => 0x688d, + 0x95 => 0x687e, 0x96 => 0x6901, 0x97 => 0x68ca, 0x98 => 0x6908, + 0x99 => 0x68d8, 0x9a => 0x6922, 0x9b => 0x6926, 0x9c => 0x68e1, + 0x9d => 0x690c, 0x9e => 0x68cd, 0x9f => 0x68d4, 0xa0 => 0x68e7, + 0xa1 => 0x68d5, 0xa2 => 0x6936, 0xa3 => 0x6912, 0xa4 => 0x6904, + 0xa5 => 0x68d7, 0xa6 => 0x68e3, 0xa7 => 0x6925, 0xa8 => 0x68f9, + 0xa9 => 0x68e0, 0xaa => 0x68ef, 0xab => 0x6928, 0xac => 0x692a, + 0xad => 0x691a, 0xae => 0x6923, 0xaf => 0x6921, 0xb0 => 0x68c6, + 0xb1 => 0x6979, 0xb2 => 0x6977, 0xb3 => 0x695c, 0xb4 => 0x6978, + 0xb5 => 0x696b, 0xb6 => 0x6954, 0xb7 => 0x697e, 0xb8 => 0x696e, + 0xb9 => 0x6939, 0xba => 0x6974, 0xbb => 0x693d, 0xbc => 0x6959, + 0xbd => 0x6930, 0xbe => 0x6961, 0xbf => 0x695e, 0xc0 => 0x695d, + 0xc1 => 0x6981, 0xc2 => 0x696a, 0xc3 => 0x69b2, 0xc4 => 0x69ae, + 0xc5 => 0x69d0, 0xc6 => 0x69bf, 0xc7 => 0x69c1, 0xc8 => 0x69d3, + 0xc9 => 0x69be, 0xca => 0x69ce, 0xcb => 0x5be8, 0xcc => 0x69ca, + 0xcd => 0x69dd, 0xce => 0x69bb, 0xcf => 0x69c3, 0xd0 => 0x69a7, + 0xd1 => 0x6a2e, 0xd2 => 0x6991, 0xd3 => 0x69a0, 0xd4 => 0x699c, + 0xd5 => 0x6995, 0xd6 => 0x69b4, 0xd7 => 0x69de, 0xd8 => 0x69e8, + 0xd9 => 0x6a02, 0xda => 0x6a1b, 0xdb => 0x69ff, 0xdc => 0x6b0a, + 0xdd => 0x69f9, 0xde => 0x69f2, 0xdf => 0x69e7, 0xe0 => 0x6a05, + 0xe1 => 0x69b1, 0xe2 => 0x6a1e, 0xe3 => 0x69ed, 0xe4 => 0x6a14, + 0xe5 => 0x69eb, 0xe6 => 0x6a0a, 0xe7 => 0x6a12, 0xe8 => 0x6ac1, + 0xe9 => 0x6a23, 0xea => 0x6a13, 0xeb => 0x6a44, 0xec => 0x6a0c, + 0xed => 0x6a72, 0xee => 0x6a36, 0xef => 0x6a78, 0xf0 => 0x6a47, + 0xf1 => 0x6a62, 0xf2 => 0x6a59, 0xf3 => 0x6a66, 0xf4 => 0x6a48, + 0xf5 => 0x6a38, 0xf6 => 0x6a22, 0xf7 => 0x6a90, 0xf8 => 0x6a8d, + 0xf9 => 0x6aa0, 0xfa => 0x6a84, 0xfb => 0x6aa2, 0xfc => 0x6aa3, + }, + 0x9f => { + 0x40 => 0x6a97, 0x41 => 0x8617, 0x42 => 0x6abb, 0x43 => 0x6ac3, + 0x44 => 0x6ac2, 0x45 => 0x6ab8, 0x46 => 0x6ab3, 0x47 => 0x6aac, + 0x48 => 0x6ade, 0x49 => 0x6ad1, 0x4a => 0x6adf, 0x4b => 0x6aaa, + 0x4c => 0x6ada, 0x4d => 0x6aea, 0x4e => 0x6afb, 0x4f => 0x6b05, + 0x50 => 0x8616, 0x51 => 0x6afa, 0x52 => 0x6b12, 0x53 => 0x6b16, + 0x54 => 0x9b31, 0x55 => 0x6b1f, 0x56 => 0x6b38, 0x57 => 0x6b37, + 0x58 => 0x76dc, 0x59 => 0x6b39, 0x5a => 0x98ee, 0x5b => 0x6b47, + 0x5c => 0x6b43, 0x5d => 0x6b49, 0x5e => 0x6b50, 0x5f => 0x6b59, + 0x60 => 0x6b54, 0x61 => 0x6b5b, 0x62 => 0x6b5f, 0x63 => 0x6b61, + 0x64 => 0x6b78, 0x65 => 0x6b79, 0x66 => 0x6b7f, 0x67 => 0x6b80, + 0x68 => 0x6b84, 0x69 => 0x6b83, 0x6a => 0x6b8d, 0x6b => 0x6b98, + 0x6c => 0x6b95, 0x6d => 0x6b9e, 0x6e => 0x6ba4, 0x6f => 0x6baa, + 0x70 => 0x6bab, 0x71 => 0x6baf, 0x72 => 0x6bb2, 0x73 => 0x6bb1, + 0x74 => 0x6bb3, 0x75 => 0x6bb7, 0x76 => 0x6bbc, 0x77 => 0x6bc6, + 0x78 => 0x6bcb, 0x79 => 0x6bd3, 0x7a => 0x6bdf, 0x7b => 0x6bec, + 0x7c => 0x6beb, 0x7d => 0x6bf3, 0x7e => 0x6bef, 0x80 => 0x9ebe, + 0x81 => 0x6c08, 0x82 => 0x6c13, 0x83 => 0x6c14, 0x84 => 0x6c1b, + 0x85 => 0x6c24, 0x86 => 0x6c23, 0x87 => 0x6c5e, 0x88 => 0x6c55, + 0x89 => 0x6c62, 0x8a => 0x6c6a, 0x8b => 0x6c82, 0x8c => 0x6c8d, + 0x8d => 0x6c9a, 0x8e => 0x6c81, 0x8f => 0x6c9b, 0x90 => 0x6c7e, + 0x91 => 0x6c68, 0x92 => 0x6c73, 0x93 => 0x6c92, 0x94 => 0x6c90, + 0x95 => 0x6cc4, 0x96 => 0x6cf1, 0x97 => 0x6cd3, 0x98 => 0x6cbd, + 0x99 => 0x6cd7, 0x9a => 0x6cc5, 0x9b => 0x6cdd, 0x9c => 0x6cae, + 0x9d => 0x6cb1, 0x9e => 0x6cbe, 0x9f => 0x6cba, 0xa0 => 0x6cdb, + 0xa1 => 0x6cef, 0xa2 => 0x6cd9, 0xa3 => 0x6cea, 0xa4 => 0x6d1f, + 0xa5 => 0x884d, 0xa6 => 0x6d36, 0xa7 => 0x6d2b, 0xa8 => 0x6d3d, + 0xa9 => 0x6d38, 0xaa => 0x6d19, 0xab => 0x6d35, 0xac => 0x6d33, + 0xad => 0x6d12, 0xae => 0x6d0c, 0xaf => 0x6d63, 0xb0 => 0x6d93, + 0xb1 => 0x6d64, 0xb2 => 0x6d5a, 0xb3 => 0x6d79, 0xb4 => 0x6d59, + 0xb5 => 0x6d8e, 0xb6 => 0x6d95, 0xb7 => 0x6fe4, 0xb8 => 0x6d85, + 0xb9 => 0x6df9, 0xba => 0x6e15, 0xbb => 0x6e0a, 0xbc => 0x6db5, + 0xbd => 0x6dc7, 0xbe => 0x6de6, 0xbf => 0x6db8, 0xc0 => 0x6dc6, + 0xc1 => 0x6dec, 0xc2 => 0x6dde, 0xc3 => 0x6dcc, 0xc4 => 0x6de8, + 0xc5 => 0x6dd2, 0xc6 => 0x6dc5, 0xc7 => 0x6dfa, 0xc8 => 0x6dd9, + 0xc9 => 0x6de4, 0xca => 0x6dd5, 0xcb => 0x6dea, 0xcc => 0x6dee, + 0xcd => 0x6e2d, 0xce => 0x6e6e, 0xcf => 0x6e2e, 0xd0 => 0x6e19, + 0xd1 => 0x6e72, 0xd2 => 0x6e5f, 0xd3 => 0x6e3e, 0xd4 => 0x6e23, + 0xd5 => 0x6e6b, 0xd6 => 0x6e2b, 0xd7 => 0x6e76, 0xd8 => 0x6e4d, + 0xd9 => 0x6e1f, 0xda => 0x6e43, 0xdb => 0x6e3a, 0xdc => 0x6e4e, + 0xdd => 0x6e24, 0xde => 0x6eff, 0xdf => 0x6e1d, 0xe0 => 0x6e38, + 0xe1 => 0x6e82, 0xe2 => 0x6eaa, 0xe3 => 0x6e98, 0xe4 => 0x6ec9, + 0xe5 => 0x6eb7, 0xe6 => 0x6ed3, 0xe7 => 0x6ebd, 0xe8 => 0x6eaf, + 0xe9 => 0x6ec4, 0xea => 0x6eb2, 0xeb => 0x6ed4, 0xec => 0x6ed5, + 0xed => 0x6e8f, 0xee => 0x6ea5, 0xef => 0x6ec2, 0xf0 => 0x6e9f, + 0xf1 => 0x6f41, 0xf2 => 0x6f11, 0xf3 => 0x704c, 0xf4 => 0x6eec, + 0xf5 => 0x6ef8, 0xf6 => 0x6efe, 0xf7 => 0x6f3f, 0xf8 => 0x6ef2, + 0xf9 => 0x6f31, 0xfa => 0x6eef, 0xfb => 0x6f32, 0xfc => 0x6ecc, + }, + 0xe0 => { + 0x40 => 0x6f3e, 0x41 => 0x6f13, 0x42 => 0x6ef7, 0x43 => 0x6f86, + 0x44 => 0x6f7a, 0x45 => 0x6f78, 0x46 => 0x6f81, 0x47 => 0x6f80, + 0x48 => 0x6f6f, 0x49 => 0x6f5b, 0x4a => 0x6ff3, 0x4b => 0x6f6d, + 0x4c => 0x6f82, 0x4d => 0x6f7c, 0x4e => 0x6f58, 0x4f => 0x6f8e, + 0x50 => 0x6f91, 0x51 => 0x6fc2, 0x52 => 0x6f66, 0x53 => 0x6fb3, + 0x54 => 0x6fa3, 0x55 => 0x6fa1, 0x56 => 0x6fa4, 0x57 => 0x6fb9, + 0x58 => 0x6fc6, 0x59 => 0x6faa, 0x5a => 0x6fdf, 0x5b => 0x6fd5, + 0x5c => 0x6fec, 0x5d => 0x6fd4, 0x5e => 0x6fd8, 0x5f => 0x6ff1, + 0x60 => 0x6fee, 0x61 => 0x6fdb, 0x62 => 0x7009, 0x63 => 0x700b, + 0x64 => 0x6ffa, 0x65 => 0x7011, 0x66 => 0x7001, 0x67 => 0x700f, + 0x68 => 0x6ffe, 0x69 => 0x701b, 0x6a => 0x701a, 0x6b => 0x6f74, + 0x6c => 0x701d, 0x6d => 0x7018, 0x6e => 0x701f, 0x6f => 0x7030, + 0x70 => 0x703e, 0x71 => 0x7032, 0x72 => 0x7051, 0x73 => 0x7063, + 0x74 => 0x7099, 0x75 => 0x7092, 0x76 => 0x70af, 0x77 => 0x70f1, + 0x78 => 0x70ac, 0x79 => 0x70b8, 0x7a => 0x70b3, 0x7b => 0x70ae, + 0x7c => 0x70df, 0x7d => 0x70cb, 0x7e => 0x70dd, 0x80 => 0x70d9, + 0x81 => 0x7109, 0x82 => 0x70fd, 0x83 => 0x711c, 0x84 => 0x7119, + 0x85 => 0x7165, 0x86 => 0x7155, 0x87 => 0x7188, 0x88 => 0x7166, + 0x89 => 0x7162, 0x8a => 0x714c, 0x8b => 0x7156, 0x8c => 0x716c, + 0x8d => 0x718f, 0x8e => 0x71fb, 0x8f => 0x7184, 0x90 => 0x7195, + 0x91 => 0x71a8, 0x92 => 0x71ac, 0x93 => 0x71d7, 0x94 => 0x71b9, + 0x95 => 0x71be, 0x96 => 0x71d2, 0x97 => 0x71c9, 0x98 => 0x71d4, + 0x99 => 0x71ce, 0x9a => 0x71e0, 0x9b => 0x71ec, 0x9c => 0x71e7, + 0x9d => 0x71f5, 0x9e => 0x71fc, 0x9f => 0x71f9, 0xa0 => 0x71ff, + 0xa1 => 0x720d, 0xa2 => 0x7210, 0xa3 => 0x721b, 0xa4 => 0x7228, + 0xa5 => 0x722d, 0xa6 => 0x722c, 0xa7 => 0x7230, 0xa8 => 0x7232, + 0xa9 => 0x723b, 0xaa => 0x723c, 0xab => 0x723f, 0xac => 0x7240, + 0xad => 0x7246, 0xae => 0x724b, 0xaf => 0x7258, 0xb0 => 0x7274, + 0xb1 => 0x727e, 0xb2 => 0x7282, 0xb3 => 0x7281, 0xb4 => 0x7287, + 0xb5 => 0x7292, 0xb6 => 0x7296, 0xb7 => 0x72a2, 0xb8 => 0x72a7, + 0xb9 => 0x72b9, 0xba => 0x72b2, 0xbb => 0x72c3, 0xbc => 0x72c6, + 0xbd => 0x72c4, 0xbe => 0x72ce, 0xbf => 0x72d2, 0xc0 => 0x72e2, + 0xc1 => 0x72e0, 0xc2 => 0x72e1, 0xc3 => 0x72f9, 0xc4 => 0x72f7, + 0xc5 => 0x500f, 0xc6 => 0x7317, 0xc7 => 0x730a, 0xc8 => 0x731c, + 0xc9 => 0x7316, 0xca => 0x731d, 0xcb => 0x7334, 0xcc => 0x732f, + 0xcd => 0x7329, 0xce => 0x7325, 0xcf => 0x733e, 0xd0 => 0x734e, + 0xd1 => 0x734f, 0xd2 => 0x9ed8, 0xd3 => 0x7357, 0xd4 => 0x736a, + 0xd5 => 0x7368, 0xd6 => 0x7370, 0xd7 => 0x7378, 0xd8 => 0x7375, + 0xd9 => 0x737b, 0xda => 0x737a, 0xdb => 0x73c8, 0xdc => 0x73b3, + 0xdd => 0x73ce, 0xde => 0x73bb, 0xdf => 0x73c0, 0xe0 => 0x73e5, + 0xe1 => 0x73ee, 0xe2 => 0x73de, 0xe3 => 0x74a2, 0xe4 => 0x7405, + 0xe5 => 0x746f, 0xe6 => 0x7425, 0xe7 => 0x73f8, 0xe8 => 0x7432, + 0xe9 => 0x743a, 0xea => 0x7455, 0xeb => 0x743f, 0xec => 0x745f, + 0xed => 0x7459, 0xee => 0x7441, 0xef => 0x745c, 0xf0 => 0x7469, + 0xf1 => 0x7470, 0xf2 => 0x7463, 0xf3 => 0x746a, 0xf4 => 0x7476, + 0xf5 => 0x747e, 0xf6 => 0x748b, 0xf7 => 0x749e, 0xf8 => 0x74a7, + 0xf9 => 0x74ca, 0xfa => 0x74cf, 0xfb => 0x74d4, 0xfc => 0x73f1, + }, + 0xe1 => { + 0x40 => 0x74e0, 0x41 => 0x74e3, 0x42 => 0x74e7, 0x43 => 0x74e9, + 0x44 => 0x74ee, 0x45 => 0x74f2, 0x46 => 0x74f0, 0x47 => 0x74f1, + 0x48 => 0x74f8, 0x49 => 0x74f7, 0x4a => 0x7504, 0x4b => 0x7503, + 0x4c => 0x7505, 0x4d => 0x750c, 0x4e => 0x750e, 0x4f => 0x750d, + 0x50 => 0x7515, 0x51 => 0x7513, 0x52 => 0x751e, 0x53 => 0x7526, + 0x54 => 0x752c, 0x55 => 0x753c, 0x56 => 0x7544, 0x57 => 0x754d, + 0x58 => 0x754a, 0x59 => 0x7549, 0x5a => 0x755b, 0x5b => 0x7546, + 0x5c => 0x755a, 0x5d => 0x7569, 0x5e => 0x7564, 0x5f => 0x7567, + 0x60 => 0x756b, 0x61 => 0x756d, 0x62 => 0x7578, 0x63 => 0x7576, + 0x64 => 0x7586, 0x65 => 0x7587, 0x66 => 0x7574, 0x67 => 0x758a, + 0x68 => 0x7589, 0x69 => 0x7582, 0x6a => 0x7594, 0x6b => 0x759a, + 0x6c => 0x759d, 0x6d => 0x75a5, 0x6e => 0x75a3, 0x6f => 0x75c2, + 0x70 => 0x75b3, 0x71 => 0x75c3, 0x72 => 0x75b5, 0x73 => 0x75bd, + 0x74 => 0x75b8, 0x75 => 0x75bc, 0x76 => 0x75b1, 0x77 => 0x75cd, + 0x78 => 0x75ca, 0x79 => 0x75d2, 0x7a => 0x75d9, 0x7b => 0x75e3, + 0x7c => 0x75de, 0x7d => 0x75fe, 0x7e => 0x75ff, 0x80 => 0x75fc, + 0x81 => 0x7601, 0x82 => 0x75f0, 0x83 => 0x75fa, 0x84 => 0x75f2, + 0x85 => 0x75f3, 0x86 => 0x760b, 0x87 => 0x760d, 0x88 => 0x7609, + 0x89 => 0x761f, 0x8a => 0x7627, 0x8b => 0x7620, 0x8c => 0x7621, + 0x8d => 0x7622, 0x8e => 0x7624, 0x8f => 0x7634, 0x90 => 0x7630, + 0x91 => 0x763b, 0x92 => 0x7647, 0x93 => 0x7648, 0x94 => 0x7646, + 0x95 => 0x765c, 0x96 => 0x7658, 0x97 => 0x7661, 0x98 => 0x7662, + 0x99 => 0x7668, 0x9a => 0x7669, 0x9b => 0x766a, 0x9c => 0x7667, + 0x9d => 0x766c, 0x9e => 0x7670, 0x9f => 0x7672, 0xa0 => 0x7676, + 0xa1 => 0x7678, 0xa2 => 0x767c, 0xa3 => 0x7680, 0xa4 => 0x7683, + 0xa5 => 0x7688, 0xa6 => 0x768b, 0xa7 => 0x768e, 0xa8 => 0x7696, + 0xa9 => 0x7693, 0xaa => 0x7699, 0xab => 0x769a, 0xac => 0x76b0, + 0xad => 0x76b4, 0xae => 0x76b8, 0xaf => 0x76b9, 0xb0 => 0x76ba, + 0xb1 => 0x76c2, 0xb2 => 0x76cd, 0xb3 => 0x76d6, 0xb4 => 0x76d2, + 0xb5 => 0x76de, 0xb6 => 0x76e1, 0xb7 => 0x76e5, 0xb8 => 0x76e7, + 0xb9 => 0x76ea, 0xba => 0x862f, 0xbb => 0x76fb, 0xbc => 0x7708, + 0xbd => 0x7707, 0xbe => 0x7704, 0xbf => 0x7729, 0xc0 => 0x7724, + 0xc1 => 0x771e, 0xc2 => 0x7725, 0xc3 => 0x7726, 0xc4 => 0x771b, + 0xc5 => 0x7737, 0xc6 => 0x7738, 0xc7 => 0x7747, 0xc8 => 0x775a, + 0xc9 => 0x7768, 0xca => 0x776b, 0xcb => 0x775b, 0xcc => 0x7765, + 0xcd => 0x777f, 0xce => 0x777e, 0xcf => 0x7779, 0xd0 => 0x778e, + 0xd1 => 0x778b, 0xd2 => 0x7791, 0xd3 => 0x77a0, 0xd4 => 0x779e, + 0xd5 => 0x77b0, 0xd6 => 0x77b6, 0xd7 => 0x77b9, 0xd8 => 0x77bf, + 0xd9 => 0x77bc, 0xda => 0x77bd, 0xdb => 0x77bb, 0xdc => 0x77c7, + 0xdd => 0x77cd, 0xde => 0x77d7, 0xdf => 0x77da, 0xe0 => 0x77dc, + 0xe1 => 0x77e3, 0xe2 => 0x77ee, 0xe3 => 0x77fc, 0xe4 => 0x780c, + 0xe5 => 0x7812, 0xe6 => 0x7926, 0xe7 => 0x7820, 0xe8 => 0x792a, + 0xe9 => 0x7845, 0xea => 0x788e, 0xeb => 0x7874, 0xec => 0x7886, + 0xed => 0x787c, 0xee => 0x789a, 0xef => 0x788c, 0xf0 => 0x78a3, + 0xf1 => 0x78b5, 0xf2 => 0x78aa, 0xf3 => 0x78af, 0xf4 => 0x78d1, + 0xf5 => 0x78c6, 0xf6 => 0x78cb, 0xf7 => 0x78d4, 0xf8 => 0x78be, + 0xf9 => 0x78bc, 0xfa => 0x78c5, 0xfb => 0x78ca, 0xfc => 0x78ec, + }, + 0xe2 => { + 0x40 => 0x78e7, 0x41 => 0x78da, 0x42 => 0x78fd, 0x43 => 0x78f4, + 0x44 => 0x7907, 0x45 => 0x7912, 0x46 => 0x7911, 0x47 => 0x7919, + 0x48 => 0x792c, 0x49 => 0x792b, 0x4a => 0x7940, 0x4b => 0x7960, + 0x4c => 0x7957, 0x4d => 0x795f, 0x4e => 0x795a, 0x4f => 0x7955, + 0x50 => 0x7953, 0x51 => 0x797a, 0x52 => 0x797f, 0x53 => 0x798a, + 0x54 => 0x799d, 0x55 => 0x79a7, 0x56 => 0x9f4b, 0x57 => 0x79aa, + 0x58 => 0x79ae, 0x59 => 0x79b3, 0x5a => 0x79b9, 0x5b => 0x79ba, + 0x5c => 0x79c9, 0x5d => 0x79d5, 0x5e => 0x79e7, 0x5f => 0x79ec, + 0x60 => 0x79e1, 0x61 => 0x79e3, 0x62 => 0x7a08, 0x63 => 0x7a0d, + 0x64 => 0x7a18, 0x65 => 0x7a19, 0x66 => 0x7a20, 0x67 => 0x7a1f, + 0x68 => 0x7980, 0x69 => 0x7a31, 0x6a => 0x7a3b, 0x6b => 0x7a3e, + 0x6c => 0x7a37, 0x6d => 0x7a43, 0x6e => 0x7a57, 0x6f => 0x7a49, + 0x70 => 0x7a61, 0x71 => 0x7a62, 0x72 => 0x7a69, 0x73 => 0x9f9d, + 0x74 => 0x7a70, 0x75 => 0x7a79, 0x76 => 0x7a7d, 0x77 => 0x7a88, + 0x78 => 0x7a97, 0x79 => 0x7a95, 0x7a => 0x7a98, 0x7b => 0x7a96, + 0x7c => 0x7aa9, 0x7d => 0x7ac8, 0x7e => 0x7ab0, 0x80 => 0x7ab6, + 0x81 => 0x7ac5, 0x82 => 0x7ac4, 0x83 => 0x7abf, 0x84 => 0x9083, + 0x85 => 0x7ac7, 0x86 => 0x7aca, 0x87 => 0x7acd, 0x88 => 0x7acf, + 0x89 => 0x7ad5, 0x8a => 0x7ad3, 0x8b => 0x7ad9, 0x8c => 0x7ada, + 0x8d => 0x7add, 0x8e => 0x7ae1, 0x8f => 0x7ae2, 0x90 => 0x7ae6, + 0x91 => 0x7aed, 0x92 => 0x7af0, 0x93 => 0x7b02, 0x94 => 0x7b0f, + 0x95 => 0x7b0a, 0x96 => 0x7b06, 0x97 => 0x7b33, 0x98 => 0x7b18, + 0x99 => 0x7b19, 0x9a => 0x7b1e, 0x9b => 0x7b35, 0x9c => 0x7b28, + 0x9d => 0x7b36, 0x9e => 0x7b50, 0x9f => 0x7b7a, 0xa0 => 0x7b04, + 0xa1 => 0x7b4d, 0xa2 => 0x7b0b, 0xa3 => 0x7b4c, 0xa4 => 0x7b45, + 0xa5 => 0x7b75, 0xa6 => 0x7b65, 0xa7 => 0x7b74, 0xa8 => 0x7b67, + 0xa9 => 0x7b70, 0xaa => 0x7b71, 0xab => 0x7b6c, 0xac => 0x7b6e, + 0xad => 0x7b9d, 0xae => 0x7b98, 0xaf => 0x7b9f, 0xb0 => 0x7b8d, + 0xb1 => 0x7b9c, 0xb2 => 0x7b9a, 0xb3 => 0x7b8b, 0xb4 => 0x7b92, + 0xb5 => 0x7b8f, 0xb6 => 0x7b5d, 0xb7 => 0x7b99, 0xb8 => 0x7bcb, + 0xb9 => 0x7bc1, 0xba => 0x7bcc, 0xbb => 0x7bcf, 0xbc => 0x7bb4, + 0xbd => 0x7bc6, 0xbe => 0x7bdd, 0xbf => 0x7be9, 0xc0 => 0x7c11, + 0xc1 => 0x7c14, 0xc2 => 0x7be6, 0xc3 => 0x7be5, 0xc4 => 0x7c60, + 0xc5 => 0x7c00, 0xc6 => 0x7c07, 0xc7 => 0x7c13, 0xc8 => 0x7bf3, + 0xc9 => 0x7bf7, 0xca => 0x7c17, 0xcb => 0x7c0d, 0xcc => 0x7bf6, + 0xcd => 0x7c23, 0xce => 0x7c27, 0xcf => 0x7c2a, 0xd0 => 0x7c1f, + 0xd1 => 0x7c37, 0xd2 => 0x7c2b, 0xd3 => 0x7c3d, 0xd4 => 0x7c4c, + 0xd5 => 0x7c43, 0xd6 => 0x7c54, 0xd7 => 0x7c4f, 0xd8 => 0x7c40, + 0xd9 => 0x7c50, 0xda => 0x7c58, 0xdb => 0x7c5f, 0xdc => 0x7c64, + 0xdd => 0x7c56, 0xde => 0x7c65, 0xdf => 0x7c6c, 0xe0 => 0x7c75, + 0xe1 => 0x7c83, 0xe2 => 0x7c90, 0xe3 => 0x7ca4, 0xe4 => 0x7cad, + 0xe5 => 0x7ca2, 0xe6 => 0x7cab, 0xe7 => 0x7ca1, 0xe8 => 0x7ca8, + 0xe9 => 0x7cb3, 0xea => 0x7cb2, 0xeb => 0x7cb1, 0xec => 0x7cae, + 0xed => 0x7cb9, 0xee => 0x7cbd, 0xef => 0x7cc0, 0xf0 => 0x7cc5, + 0xf1 => 0x7cc2, 0xf2 => 0x7cd8, 0xf3 => 0x7cd2, 0xf4 => 0x7cdc, + 0xf5 => 0x7ce2, 0xf6 => 0x9b3b, 0xf7 => 0x7cef, 0xf8 => 0x7cf2, + 0xf9 => 0x7cf4, 0xfa => 0x7cf6, 0xfb => 0x7cfa, 0xfc => 0x7d06, + }, + 0xe3 => { + 0x40 => 0x7d02, 0x41 => 0x7d1c, 0x42 => 0x7d15, 0x43 => 0x7d0a, + 0x44 => 0x7d45, 0x45 => 0x7d4b, 0x46 => 0x7d2e, 0x47 => 0x7d32, + 0x48 => 0x7d3f, 0x49 => 0x7d35, 0x4a => 0x7d46, 0x4b => 0x7d73, + 0x4c => 0x7d56, 0x4d => 0x7d4e, 0x4e => 0x7d72, 0x4f => 0x7d68, + 0x50 => 0x7d6e, 0x51 => 0x7d4f, 0x52 => 0x7d63, 0x53 => 0x7d93, + 0x54 => 0x7d89, 0x55 => 0x7d5b, 0x56 => 0x7d8f, 0x57 => 0x7d7d, + 0x58 => 0x7d9b, 0x59 => 0x7dba, 0x5a => 0x7dae, 0x5b => 0x7da3, + 0x5c => 0x7db5, 0x5d => 0x7dc7, 0x5e => 0x7dbd, 0x5f => 0x7dab, + 0x60 => 0x7e3d, 0x61 => 0x7da2, 0x62 => 0x7daf, 0x63 => 0x7ddc, + 0x64 => 0x7db8, 0x65 => 0x7d9f, 0x66 => 0x7db0, 0x67 => 0x7dd8, + 0x68 => 0x7ddd, 0x69 => 0x7de4, 0x6a => 0x7dde, 0x6b => 0x7dfb, + 0x6c => 0x7df2, 0x6d => 0x7de1, 0x6e => 0x7e05, 0x6f => 0x7e0a, + 0x70 => 0x7e23, 0x71 => 0x7e21, 0x72 => 0x7e12, 0x73 => 0x7e31, + 0x74 => 0x7e1f, 0x75 => 0x7e09, 0x76 => 0x7e0b, 0x77 => 0x7e22, + 0x78 => 0x7e46, 0x79 => 0x7e66, 0x7a => 0x7e3b, 0x7b => 0x7e35, + 0x7c => 0x7e39, 0x7d => 0x7e43, 0x7e => 0x7e37, 0x80 => 0x7e32, + 0x81 => 0x7e3a, 0x82 => 0x7e67, 0x83 => 0x7e5d, 0x84 => 0x7e56, + 0x85 => 0x7e5e, 0x86 => 0x7e59, 0x87 => 0x7e5a, 0x88 => 0x7e79, + 0x89 => 0x7e6a, 0x8a => 0x7e69, 0x8b => 0x7e7c, 0x8c => 0x7e7b, + 0x8d => 0x7e83, 0x8e => 0x7dd5, 0x8f => 0x7e7d, 0x90 => 0x8fae, + 0x91 => 0x7e7f, 0x92 => 0x7e88, 0x93 => 0x7e89, 0x94 => 0x7e8c, + 0x95 => 0x7e92, 0x96 => 0x7e90, 0x97 => 0x7e93, 0x98 => 0x7e94, + 0x99 => 0x7e96, 0x9a => 0x7e8e, 0x9b => 0x7e9b, 0x9c => 0x7e9c, + 0x9d => 0x7f38, 0x9e => 0x7f3a, 0x9f => 0x7f45, 0xa0 => 0x7f4c, + 0xa1 => 0x7f4d, 0xa2 => 0x7f4e, 0xa3 => 0x7f50, 0xa4 => 0x7f51, + 0xa5 => 0x7f55, 0xa6 => 0x7f54, 0xa7 => 0x7f58, 0xa8 => 0x7f5f, + 0xa9 => 0x7f60, 0xaa => 0x7f68, 0xab => 0x7f69, 0xac => 0x7f67, + 0xad => 0x7f78, 0xae => 0x7f82, 0xaf => 0x7f86, 0xb0 => 0x7f83, + 0xb1 => 0x7f88, 0xb2 => 0x7f87, 0xb3 => 0x7f8c, 0xb4 => 0x7f94, + 0xb5 => 0x7f9e, 0xb6 => 0x7f9d, 0xb7 => 0x7f9a, 0xb8 => 0x7fa3, + 0xb9 => 0x7faf, 0xba => 0x7fb2, 0xbb => 0x7fb9, 0xbc => 0x7fae, + 0xbd => 0x7fb6, 0xbe => 0x7fb8, 0xbf => 0x8b71, 0xc0 => 0x7fc5, + 0xc1 => 0x7fc6, 0xc2 => 0x7fca, 0xc3 => 0x7fd5, 0xc4 => 0x7fd4, + 0xc5 => 0x7fe1, 0xc6 => 0x7fe6, 0xc7 => 0x7fe9, 0xc8 => 0x7ff3, + 0xc9 => 0x7ff9, 0xca => 0x98dc, 0xcb => 0x8006, 0xcc => 0x8004, + 0xcd => 0x800b, 0xce => 0x8012, 0xcf => 0x8018, 0xd0 => 0x8019, + 0xd1 => 0x801c, 0xd2 => 0x8021, 0xd3 => 0x8028, 0xd4 => 0x803f, + 0xd5 => 0x803b, 0xd6 => 0x804a, 0xd7 => 0x8046, 0xd8 => 0x8052, + 0xd9 => 0x8058, 0xda => 0x805a, 0xdb => 0x805f, 0xdc => 0x8062, + 0xdd => 0x8068, 0xde => 0x8073, 0xdf => 0x8072, 0xe0 => 0x8070, + 0xe1 => 0x8076, 0xe2 => 0x8079, 0xe3 => 0x807d, 0xe4 => 0x807f, + 0xe5 => 0x8084, 0xe6 => 0x8086, 0xe7 => 0x8085, 0xe8 => 0x809b, + 0xe9 => 0x8093, 0xea => 0x809a, 0xeb => 0x80ad, 0xec => 0x5190, + 0xed => 0x80ac, 0xee => 0x80db, 0xef => 0x80e5, 0xf0 => 0x80d9, + 0xf1 => 0x80dd, 0xf2 => 0x80c4, 0xf3 => 0x80da, 0xf4 => 0x80d6, + 0xf5 => 0x8109, 0xf6 => 0x80ef, 0xf7 => 0x80f1, 0xf8 => 0x811b, + 0xf9 => 0x8129, 0xfa => 0x8123, 0xfb => 0x812f, 0xfc => 0x814b, + }, + 0xe4 => { + 0x40 => 0x968b, 0x41 => 0x8146, 0x42 => 0x813e, 0x43 => 0x8153, + 0x44 => 0x8151, 0x45 => 0x80fc, 0x46 => 0x8171, 0x47 => 0x816e, + 0x48 => 0x8165, 0x49 => 0x8166, 0x4a => 0x8174, 0x4b => 0x8183, + 0x4c => 0x8188, 0x4d => 0x818a, 0x4e => 0x8180, 0x4f => 0x8182, + 0x50 => 0x81a0, 0x51 => 0x8195, 0x52 => 0x81a4, 0x53 => 0x81a3, + 0x54 => 0x815f, 0x55 => 0x8193, 0x56 => 0x81a9, 0x57 => 0x81b0, + 0x58 => 0x81b5, 0x59 => 0x81be, 0x5a => 0x81b8, 0x5b => 0x81bd, + 0x5c => 0x81c0, 0x5d => 0x81c2, 0x5e => 0x81ba, 0x5f => 0x81c9, + 0x60 => 0x81cd, 0x61 => 0x81d1, 0x62 => 0x81d9, 0x63 => 0x81d8, + 0x64 => 0x81c8, 0x65 => 0x81da, 0x66 => 0x81df, 0x67 => 0x81e0, + 0x68 => 0x81e7, 0x69 => 0x81fa, 0x6a => 0x81fb, 0x6b => 0x81fe, + 0x6c => 0x8201, 0x6d => 0x8202, 0x6e => 0x8205, 0x6f => 0x8207, + 0x70 => 0x820a, 0x71 => 0x820d, 0x72 => 0x8210, 0x73 => 0x8216, + 0x74 => 0x8229, 0x75 => 0x822b, 0x76 => 0x8238, 0x77 => 0x8233, + 0x78 => 0x8240, 0x79 => 0x8259, 0x7a => 0x8258, 0x7b => 0x825d, + 0x7c => 0x825a, 0x7d => 0x825f, 0x7e => 0x8264, 0x80 => 0x8262, + 0x81 => 0x8268, 0x82 => 0x826a, 0x83 => 0x826b, 0x84 => 0x822e, + 0x85 => 0x8271, 0x86 => 0x8277, 0x87 => 0x8278, 0x88 => 0x827e, + 0x89 => 0x828d, 0x8a => 0x8292, 0x8b => 0x82ab, 0x8c => 0x829f, + 0x8d => 0x82bb, 0x8e => 0x82ac, 0x8f => 0x82e1, 0x90 => 0x82e3, + 0x91 => 0x82df, 0x92 => 0x82d2, 0x93 => 0x82f4, 0x94 => 0x82f3, + 0x95 => 0x82fa, 0x96 => 0x8393, 0x97 => 0x8303, 0x98 => 0x82fb, + 0x99 => 0x82f9, 0x9a => 0x82de, 0x9b => 0x8306, 0x9c => 0x82dc, + 0x9d => 0x8309, 0x9e => 0x82d9, 0x9f => 0x8335, 0xa0 => 0x8334, + 0xa1 => 0x8316, 0xa2 => 0x8332, 0xa3 => 0x8331, 0xa4 => 0x8340, + 0xa5 => 0x8339, 0xa6 => 0x8350, 0xa7 => 0x8345, 0xa8 => 0x832f, + 0xa9 => 0x832b, 0xaa => 0x8317, 0xab => 0x8318, 0xac => 0x8385, + 0xad => 0x839a, 0xae => 0x83aa, 0xaf => 0x839f, 0xb0 => 0x83a2, + 0xb1 => 0x8396, 0xb2 => 0x8323, 0xb3 => 0x838e, 0xb4 => 0x8387, + 0xb5 => 0x838a, 0xb6 => 0x837c, 0xb7 => 0x83b5, 0xb8 => 0x8373, + 0xb9 => 0x8375, 0xba => 0x83a0, 0xbb => 0x8389, 0xbc => 0x83a8, + 0xbd => 0x83f4, 0xbe => 0x8413, 0xbf => 0x83eb, 0xc0 => 0x83ce, + 0xc1 => 0x83fd, 0xc2 => 0x8403, 0xc3 => 0x83d8, 0xc4 => 0x840b, + 0xc5 => 0x83c1, 0xc6 => 0x83f7, 0xc7 => 0x8407, 0xc8 => 0x83e0, + 0xc9 => 0x83f2, 0xca => 0x840d, 0xcb => 0x8422, 0xcc => 0x8420, + 0xcd => 0x83bd, 0xce => 0x8438, 0xcf => 0x8506, 0xd0 => 0x83fb, + 0xd1 => 0x846d, 0xd2 => 0x842a, 0xd3 => 0x843c, 0xd4 => 0x855a, + 0xd5 => 0x8484, 0xd6 => 0x8477, 0xd7 => 0x846b, 0xd8 => 0x84ad, + 0xd9 => 0x846e, 0xda => 0x8482, 0xdb => 0x8469, 0xdc => 0x8446, + 0xdd => 0x842c, 0xde => 0x846f, 0xdf => 0x8479, 0xe0 => 0x8435, + 0xe1 => 0x84ca, 0xe2 => 0x8462, 0xe3 => 0x84b9, 0xe4 => 0x84bf, + 0xe5 => 0x849f, 0xe6 => 0x84d9, 0xe7 => 0x84cd, 0xe8 => 0x84bb, + 0xe9 => 0x84da, 0xea => 0x84d0, 0xeb => 0x84c1, 0xec => 0x84c6, + 0xed => 0x84d6, 0xee => 0x84a1, 0xef => 0x8521, 0xf0 => 0x84ff, + 0xf1 => 0x84f4, 0xf2 => 0x8517, 0xf3 => 0x8518, 0xf4 => 0x852c, + 0xf5 => 0x851f, 0xf6 => 0x8515, 0xf7 => 0x8514, 0xf8 => 0x84fc, + 0xf9 => 0x8540, 0xfa => 0x8563, 0xfb => 0x8558, 0xfc => 0x8548, + }, + 0xe5 => { + 0x40 => 0x8541, 0x41 => 0x8602, 0x42 => 0x854b, 0x43 => 0x8555, + 0x44 => 0x8580, 0x45 => 0x85a4, 0x46 => 0x8588, 0x47 => 0x8591, + 0x48 => 0x858a, 0x49 => 0x85a8, 0x4a => 0x856d, 0x4b => 0x8594, + 0x4c => 0x859b, 0x4d => 0x85ea, 0x4e => 0x8587, 0x4f => 0x859c, + 0x50 => 0x8577, 0x51 => 0x857e, 0x52 => 0x8590, 0x53 => 0x85c9, + 0x54 => 0x85ba, 0x55 => 0x85cf, 0x56 => 0x85b9, 0x57 => 0x85d0, + 0x58 => 0x85d5, 0x59 => 0x85dd, 0x5a => 0x85e5, 0x5b => 0x85dc, + 0x5c => 0x85f9, 0x5d => 0x860a, 0x5e => 0x8613, 0x5f => 0x860b, + 0x60 => 0x85fe, 0x61 => 0x85fa, 0x62 => 0x8606, 0x63 => 0x8622, + 0x64 => 0x861a, 0x65 => 0x8630, 0x66 => 0x863f, 0x67 => 0x864d, + 0x68 => 0x4e55, 0x69 => 0x8654, 0x6a => 0x865f, 0x6b => 0x8667, + 0x6c => 0x8671, 0x6d => 0x8693, 0x6e => 0x86a3, 0x6f => 0x86a9, + 0x70 => 0x86aa, 0x71 => 0x868b, 0x72 => 0x868c, 0x73 => 0x86b6, + 0x74 => 0x86af, 0x75 => 0x86c4, 0x76 => 0x86c6, 0x77 => 0x86b0, + 0x78 => 0x86c9, 0x79 => 0x8823, 0x7a => 0x86ab, 0x7b => 0x86d4, + 0x7c => 0x86de, 0x7d => 0x86e9, 0x7e => 0x86ec, 0x80 => 0x86df, + 0x81 => 0x86db, 0x82 => 0x86ef, 0x83 => 0x8712, 0x84 => 0x8706, + 0x85 => 0x8708, 0x86 => 0x8700, 0x87 => 0x8703, 0x88 => 0x86fb, + 0x89 => 0x8711, 0x8a => 0x8709, 0x8b => 0x870d, 0x8c => 0x86f9, + 0x8d => 0x870a, 0x8e => 0x8734, 0x8f => 0x873f, 0x90 => 0x8737, + 0x91 => 0x873b, 0x92 => 0x8725, 0x93 => 0x8729, 0x94 => 0x871a, + 0x95 => 0x8760, 0x96 => 0x875f, 0x97 => 0x8778, 0x98 => 0x874c, + 0x99 => 0x874e, 0x9a => 0x8774, 0x9b => 0x8757, 0x9c => 0x8768, + 0x9d => 0x876e, 0x9e => 0x8759, 0x9f => 0x8753, 0xa0 => 0x8763, + 0xa1 => 0x876a, 0xa2 => 0x8805, 0xa3 => 0x87a2, 0xa4 => 0x879f, + 0xa5 => 0x8782, 0xa6 => 0x87af, 0xa7 => 0x87cb, 0xa8 => 0x87bd, + 0xa9 => 0x87c0, 0xaa => 0x87d0, 0xab => 0x96d6, 0xac => 0x87ab, + 0xad => 0x87c4, 0xae => 0x87b3, 0xaf => 0x87c7, 0xb0 => 0x87c6, + 0xb1 => 0x87bb, 0xb2 => 0x87ef, 0xb3 => 0x87f2, 0xb4 => 0x87e0, + 0xb5 => 0x880f, 0xb6 => 0x880d, 0xb7 => 0x87fe, 0xb8 => 0x87f6, + 0xb9 => 0x87f7, 0xba => 0x880e, 0xbb => 0x87d2, 0xbc => 0x8811, + 0xbd => 0x8816, 0xbe => 0x8815, 0xbf => 0x8822, 0xc0 => 0x8821, + 0xc1 => 0x8831, 0xc2 => 0x8836, 0xc3 => 0x8839, 0xc4 => 0x8827, + 0xc5 => 0x883b, 0xc6 => 0x8844, 0xc7 => 0x8842, 0xc8 => 0x8852, + 0xc9 => 0x8859, 0xca => 0x885e, 0xcb => 0x8862, 0xcc => 0x886b, + 0xcd => 0x8881, 0xce => 0x887e, 0xcf => 0x889e, 0xd0 => 0x8875, + 0xd1 => 0x887d, 0xd2 => 0x88b5, 0xd3 => 0x8872, 0xd4 => 0x8882, + 0xd5 => 0x8897, 0xd6 => 0x8892, 0xd7 => 0x88ae, 0xd8 => 0x8899, + 0xd9 => 0x88a2, 0xda => 0x888d, 0xdb => 0x88a4, 0xdc => 0x88b0, + 0xdd => 0x88bf, 0xde => 0x88b1, 0xdf => 0x88c3, 0xe0 => 0x88c4, + 0xe1 => 0x88d4, 0xe2 => 0x88d8, 0xe3 => 0x88d9, 0xe4 => 0x88dd, + 0xe5 => 0x88f9, 0xe6 => 0x8902, 0xe7 => 0x88fc, 0xe8 => 0x88f4, + 0xe9 => 0x88e8, 0xea => 0x88f2, 0xeb => 0x8904, 0xec => 0x890c, + 0xed => 0x890a, 0xee => 0x8913, 0xef => 0x8943, 0xf0 => 0x891e, + 0xf1 => 0x8925, 0xf2 => 0x892a, 0xf3 => 0x892b, 0xf4 => 0x8941, + 0xf5 => 0x8944, 0xf6 => 0x893b, 0xf7 => 0x8936, 0xf8 => 0x8938, + 0xf9 => 0x894c, 0xfa => 0x891d, 0xfb => 0x8960, 0xfc => 0x895e, + }, + 0xe6 => { + 0x40 => 0x8966, 0x41 => 0x8964, 0x42 => 0x896d, 0x43 => 0x896a, + 0x44 => 0x896f, 0x45 => 0x8974, 0x46 => 0x8977, 0x47 => 0x897e, + 0x48 => 0x8983, 0x49 => 0x8988, 0x4a => 0x898a, 0x4b => 0x8993, + 0x4c => 0x8998, 0x4d => 0x89a1, 0x4e => 0x89a9, 0x4f => 0x89a6, + 0x50 => 0x89ac, 0x51 => 0x89af, 0x52 => 0x89b2, 0x53 => 0x89ba, + 0x54 => 0x89bd, 0x55 => 0x89bf, 0x56 => 0x89c0, 0x57 => 0x89da, + 0x58 => 0x89dc, 0x59 => 0x89dd, 0x5a => 0x89e7, 0x5b => 0x89f4, + 0x5c => 0x89f8, 0x5d => 0x8a03, 0x5e => 0x8a16, 0x5f => 0x8a10, + 0x60 => 0x8a0c, 0x61 => 0x8a1b, 0x62 => 0x8a1d, 0x63 => 0x8a25, + 0x64 => 0x8a36, 0x65 => 0x8a41, 0x66 => 0x8a5b, 0x67 => 0x8a52, + 0x68 => 0x8a46, 0x69 => 0x8a48, 0x6a => 0x8a7c, 0x6b => 0x8a6d, + 0x6c => 0x8a6c, 0x6d => 0x8a62, 0x6e => 0x8a85, 0x6f => 0x8a82, + 0x70 => 0x8a84, 0x71 => 0x8aa8, 0x72 => 0x8aa1, 0x73 => 0x8a91, + 0x74 => 0x8aa5, 0x75 => 0x8aa6, 0x76 => 0x8a9a, 0x77 => 0x8aa3, + 0x78 => 0x8ac4, 0x79 => 0x8acd, 0x7a => 0x8ac2, 0x7b => 0x8ada, + 0x7c => 0x8aeb, 0x7d => 0x8af3, 0x7e => 0x8ae7, 0x80 => 0x8ae4, + 0x81 => 0x8af1, 0x82 => 0x8b14, 0x83 => 0x8ae0, 0x84 => 0x8ae2, + 0x85 => 0x8af7, 0x86 => 0x8ade, 0x87 => 0x8adb, 0x88 => 0x8b0c, + 0x89 => 0x8b07, 0x8a => 0x8b1a, 0x8b => 0x8ae1, 0x8c => 0x8b16, + 0x8d => 0x8b10, 0x8e => 0x8b17, 0x8f => 0x8b20, 0x90 => 0x8b33, + 0x91 => 0x97ab, 0x92 => 0x8b26, 0x93 => 0x8b2b, 0x94 => 0x8b3e, + 0x95 => 0x8b28, 0x96 => 0x8b41, 0x97 => 0x8b4c, 0x98 => 0x8b4f, + 0x99 => 0x8b4e, 0x9a => 0x8b49, 0x9b => 0x8b56, 0x9c => 0x8b5b, + 0x9d => 0x8b5a, 0x9e => 0x8b6b, 0x9f => 0x8b5f, 0xa0 => 0x8b6c, + 0xa1 => 0x8b6f, 0xa2 => 0x8b74, 0xa3 => 0x8b7d, 0xa4 => 0x8b80, + 0xa5 => 0x8b8c, 0xa6 => 0x8b8e, 0xa7 => 0x8b92, 0xa8 => 0x8b93, + 0xa9 => 0x8b96, 0xaa => 0x8b99, 0xab => 0x8b9a, 0xac => 0x8c3a, + 0xad => 0x8c41, 0xae => 0x8c3f, 0xaf => 0x8c48, 0xb0 => 0x8c4c, + 0xb1 => 0x8c4e, 0xb2 => 0x8c50, 0xb3 => 0x8c55, 0xb4 => 0x8c62, + 0xb5 => 0x8c6c, 0xb6 => 0x8c78, 0xb7 => 0x8c7a, 0xb8 => 0x8c82, + 0xb9 => 0x8c89, 0xba => 0x8c85, 0xbb => 0x8c8a, 0xbc => 0x8c8d, + 0xbd => 0x8c8e, 0xbe => 0x8c94, 0xbf => 0x8c7c, 0xc0 => 0x8c98, + 0xc1 => 0x621d, 0xc2 => 0x8cad, 0xc3 => 0x8caa, 0xc4 => 0x8cbd, + 0xc5 => 0x8cb2, 0xc6 => 0x8cb3, 0xc7 => 0x8cae, 0xc8 => 0x8cb6, + 0xc9 => 0x8cc8, 0xca => 0x8cc1, 0xcb => 0x8ce4, 0xcc => 0x8ce3, + 0xcd => 0x8cda, 0xce => 0x8cfd, 0xcf => 0x8cfa, 0xd0 => 0x8cfb, + 0xd1 => 0x8d04, 0xd2 => 0x8d05, 0xd3 => 0x8d0a, 0xd4 => 0x8d07, + 0xd5 => 0x8d0f, 0xd6 => 0x8d0d, 0xd7 => 0x8d10, 0xd8 => 0x9f4e, + 0xd9 => 0x8d13, 0xda => 0x8ccd, 0xdb => 0x8d14, 0xdc => 0x8d16, + 0xdd => 0x8d67, 0xde => 0x8d6d, 0xdf => 0x8d71, 0xe0 => 0x8d73, + 0xe1 => 0x8d81, 0xe2 => 0x8d99, 0xe3 => 0x8dc2, 0xe4 => 0x8dbe, + 0xe5 => 0x8dba, 0xe6 => 0x8dcf, 0xe7 => 0x8dda, 0xe8 => 0x8dd6, + 0xe9 => 0x8dcc, 0xea => 0x8ddb, 0xeb => 0x8dcb, 0xec => 0x8dea, + 0xed => 0x8deb, 0xee => 0x8ddf, 0xef => 0x8de3, 0xf0 => 0x8dfc, + 0xf1 => 0x8e08, 0xf2 => 0x8e09, 0xf3 => 0x8dff, 0xf4 => 0x8e1d, + 0xf5 => 0x8e1e, 0xf6 => 0x8e10, 0xf7 => 0x8e1f, 0xf8 => 0x8e42, + 0xf9 => 0x8e35, 0xfa => 0x8e30, 0xfb => 0x8e34, 0xfc => 0x8e4a, + }, + 0xe7 => { + 0x40 => 0x8e47, 0x41 => 0x8e49, 0x42 => 0x8e4c, 0x43 => 0x8e50, + 0x44 => 0x8e48, 0x45 => 0x8e59, 0x46 => 0x8e64, 0x47 => 0x8e60, + 0x48 => 0x8e2a, 0x49 => 0x8e63, 0x4a => 0x8e55, 0x4b => 0x8e76, + 0x4c => 0x8e72, 0x4d => 0x8e7c, 0x4e => 0x8e81, 0x4f => 0x8e87, + 0x50 => 0x8e85, 0x51 => 0x8e84, 0x52 => 0x8e8b, 0x53 => 0x8e8a, + 0x54 => 0x8e93, 0x55 => 0x8e91, 0x56 => 0x8e94, 0x57 => 0x8e99, + 0x58 => 0x8eaa, 0x59 => 0x8ea1, 0x5a => 0x8eac, 0x5b => 0x8eb0, + 0x5c => 0x8ec6, 0x5d => 0x8eb1, 0x5e => 0x8ebe, 0x5f => 0x8ec5, + 0x60 => 0x8ec8, 0x61 => 0x8ecb, 0x62 => 0x8edb, 0x63 => 0x8ee3, + 0x64 => 0x8efc, 0x65 => 0x8efb, 0x66 => 0x8eeb, 0x67 => 0x8efe, + 0x68 => 0x8f0a, 0x69 => 0x8f05, 0x6a => 0x8f15, 0x6b => 0x8f12, + 0x6c => 0x8f19, 0x6d => 0x8f13, 0x6e => 0x8f1c, 0x6f => 0x8f1f, + 0x70 => 0x8f1b, 0x71 => 0x8f0c, 0x72 => 0x8f26, 0x73 => 0x8f33, + 0x74 => 0x8f3b, 0x75 => 0x8f39, 0x76 => 0x8f45, 0x77 => 0x8f42, + 0x78 => 0x8f3e, 0x79 => 0x8f4c, 0x7a => 0x8f49, 0x7b => 0x8f46, + 0x7c => 0x8f4e, 0x7d => 0x8f57, 0x7e => 0x8f5c, 0x80 => 0x8f62, + 0x81 => 0x8f63, 0x82 => 0x8f64, 0x83 => 0x8f9c, 0x84 => 0x8f9f, + 0x85 => 0x8fa3, 0x86 => 0x8fad, 0x87 => 0x8faf, 0x88 => 0x8fb7, + 0x89 => 0x8fda, 0x8a => 0x8fe5, 0x8b => 0x8fe2, 0x8c => 0x8fea, + 0x8d => 0x8fef, 0x8e => 0x9087, 0x8f => 0x8ff4, 0x90 => 0x9005, + 0x91 => 0x8ff9, 0x92 => 0x8ffa, 0x93 => 0x9011, 0x94 => 0x9015, + 0x95 => 0x9021, 0x96 => 0x900d, 0x97 => 0x901e, 0x98 => 0x9016, + 0x99 => 0x900b, 0x9a => 0x9027, 0x9b => 0x9036, 0x9c => 0x9035, + 0x9d => 0x9039, 0x9e => 0x8ff8, 0x9f => 0x904f, 0xa0 => 0x9050, + 0xa1 => 0x9051, 0xa2 => 0x9052, 0xa3 => 0x900e, 0xa4 => 0x9049, + 0xa5 => 0x903e, 0xa6 => 0x9056, 0xa7 => 0x9058, 0xa8 => 0x905e, + 0xa9 => 0x9068, 0xaa => 0x906f, 0xab => 0x9076, 0xac => 0x96a8, + 0xad => 0x9072, 0xae => 0x9082, 0xaf => 0x907d, 0xb0 => 0x9081, + 0xb1 => 0x9080, 0xb2 => 0x908a, 0xb3 => 0x9089, 0xb4 => 0x908f, + 0xb5 => 0x90a8, 0xb6 => 0x90af, 0xb7 => 0x90b1, 0xb8 => 0x90b5, + 0xb9 => 0x90e2, 0xba => 0x90e4, 0xbb => 0x6248, 0xbc => 0x90db, + 0xbd => 0x9102, 0xbe => 0x9112, 0xbf => 0x9119, 0xc0 => 0x9132, + 0xc1 => 0x9130, 0xc2 => 0x914a, 0xc3 => 0x9156, 0xc4 => 0x9158, + 0xc5 => 0x9163, 0xc6 => 0x9165, 0xc7 => 0x9169, 0xc8 => 0x9173, + 0xc9 => 0x9172, 0xca => 0x918b, 0xcb => 0x9189, 0xcc => 0x9182, + 0xcd => 0x91a2, 0xce => 0x91ab, 0xcf => 0x91af, 0xd0 => 0x91aa, + 0xd1 => 0x91b5, 0xd2 => 0x91b4, 0xd3 => 0x91ba, 0xd4 => 0x91c0, + 0xd5 => 0x91c1, 0xd6 => 0x91c9, 0xd7 => 0x91cb, 0xd8 => 0x91d0, + 0xd9 => 0x91d6, 0xda => 0x91df, 0xdb => 0x91e1, 0xdc => 0x91db, + 0xdd => 0x91fc, 0xde => 0x91f5, 0xdf => 0x91f6, 0xe0 => 0x921e, + 0xe1 => 0x91ff, 0xe2 => 0x9214, 0xe3 => 0x922c, 0xe4 => 0x9215, + 0xe5 => 0x9211, 0xe6 => 0x925e, 0xe7 => 0x9257, 0xe8 => 0x9245, + 0xe9 => 0x9249, 0xea => 0x9264, 0xeb => 0x9248, 0xec => 0x9295, + 0xed => 0x923f, 0xee => 0x924b, 0xef => 0x9250, 0xf0 => 0x929c, + 0xf1 => 0x9296, 0xf2 => 0x9293, 0xf3 => 0x929b, 0xf4 => 0x925a, + 0xf5 => 0x92cf, 0xf6 => 0x92b9, 0xf7 => 0x92b7, 0xf8 => 0x92e9, + 0xf9 => 0x930f, 0xfa => 0x92fa, 0xfb => 0x9344, 0xfc => 0x932e, + }, + 0xe8 => { + 0x40 => 0x9319, 0x41 => 0x9322, 0x42 => 0x931a, 0x43 => 0x9323, + 0x44 => 0x933a, 0x45 => 0x9335, 0x46 => 0x933b, 0x47 => 0x935c, + 0x48 => 0x9360, 0x49 => 0x937c, 0x4a => 0x936e, 0x4b => 0x9356, + 0x4c => 0x93b0, 0x4d => 0x93ac, 0x4e => 0x93ad, 0x4f => 0x9394, + 0x50 => 0x93b9, 0x51 => 0x93d6, 0x52 => 0x93d7, 0x53 => 0x93e8, + 0x54 => 0x93e5, 0x55 => 0x93d8, 0x56 => 0x93c3, 0x57 => 0x93dd, + 0x58 => 0x93d0, 0x59 => 0x93c8, 0x5a => 0x93e4, 0x5b => 0x941a, + 0x5c => 0x9414, 0x5d => 0x9413, 0x5e => 0x9403, 0x5f => 0x9407, + 0x60 => 0x9410, 0x61 => 0x9436, 0x62 => 0x942b, 0x63 => 0x9435, + 0x64 => 0x9421, 0x65 => 0x943a, 0x66 => 0x9441, 0x67 => 0x9452, + 0x68 => 0x9444, 0x69 => 0x945b, 0x6a => 0x9460, 0x6b => 0x9462, + 0x6c => 0x945e, 0x6d => 0x946a, 0x6e => 0x9229, 0x6f => 0x9470, + 0x70 => 0x9475, 0x71 => 0x9477, 0x72 => 0x947d, 0x73 => 0x945a, + 0x74 => 0x947c, 0x75 => 0x947e, 0x76 => 0x9481, 0x77 => 0x947f, + 0x78 => 0x9582, 0x79 => 0x9587, 0x7a => 0x958a, 0x7b => 0x9594, + 0x7c => 0x9596, 0x7d => 0x9598, 0x7e => 0x9599, 0x80 => 0x95a0, + 0x81 => 0x95a8, 0x82 => 0x95a7, 0x83 => 0x95ad, 0x84 => 0x95bc, + 0x85 => 0x95bb, 0x86 => 0x95b9, 0x87 => 0x95be, 0x88 => 0x95ca, + 0x89 => 0x6ff6, 0x8a => 0x95c3, 0x8b => 0x95cd, 0x8c => 0x95cc, + 0x8d => 0x95d5, 0x8e => 0x95d4, 0x8f => 0x95d6, 0x90 => 0x95dc, + 0x91 => 0x95e1, 0x92 => 0x95e5, 0x93 => 0x95e2, 0x94 => 0x9621, + 0x95 => 0x9628, 0x96 => 0x962e, 0x97 => 0x962f, 0x98 => 0x9642, + 0x99 => 0x964c, 0x9a => 0x964f, 0x9b => 0x964b, 0x9c => 0x9677, + 0x9d => 0x965c, 0x9e => 0x965e, 0x9f => 0x965d, 0xa0 => 0x965f, + 0xa1 => 0x9666, 0xa2 => 0x9672, 0xa3 => 0x966c, 0xa4 => 0x968d, + 0xa5 => 0x9698, 0xa6 => 0x9695, 0xa7 => 0x9697, 0xa8 => 0x96aa, + 0xa9 => 0x96a7, 0xaa => 0x96b1, 0xab => 0x96b2, 0xac => 0x96b0, + 0xad => 0x96b4, 0xae => 0x96b6, 0xaf => 0x96b8, 0xb0 => 0x96b9, + 0xb1 => 0x96ce, 0xb2 => 0x96cb, 0xb3 => 0x96c9, 0xb4 => 0x96cd, + 0xb5 => 0x894d, 0xb6 => 0x96dc, 0xb7 => 0x970d, 0xb8 => 0x96d5, + 0xb9 => 0x96f9, 0xba => 0x9704, 0xbb => 0x9706, 0xbc => 0x9708, + 0xbd => 0x9713, 0xbe => 0x970e, 0xbf => 0x9711, 0xc0 => 0x970f, + 0xc1 => 0x9716, 0xc2 => 0x9719, 0xc3 => 0x9724, 0xc4 => 0x972a, + 0xc5 => 0x9730, 0xc6 => 0x9739, 0xc7 => 0x973d, 0xc8 => 0x973e, + 0xc9 => 0x9744, 0xca => 0x9746, 0xcb => 0x9748, 0xcc => 0x9742, + 0xcd => 0x9749, 0xce => 0x975c, 0xcf => 0x9760, 0xd0 => 0x9764, + 0xd1 => 0x9766, 0xd2 => 0x9768, 0xd3 => 0x52d2, 0xd4 => 0x976b, + 0xd5 => 0x9771, 0xd6 => 0x9779, 0xd7 => 0x9785, 0xd8 => 0x977c, + 0xd9 => 0x9781, 0xda => 0x977a, 0xdb => 0x9786, 0xdc => 0x978b, + 0xdd => 0x978f, 0xde => 0x9790, 0xdf => 0x979c, 0xe0 => 0x97a8, + 0xe1 => 0x97a6, 0xe2 => 0x97a3, 0xe3 => 0x97b3, 0xe4 => 0x97b4, + 0xe5 => 0x97c3, 0xe6 => 0x97c6, 0xe7 => 0x97c8, 0xe8 => 0x97cb, + 0xe9 => 0x97dc, 0xea => 0x97ed, 0xeb => 0x9f4f, 0xec => 0x97f2, + 0xed => 0x7adf, 0xee => 0x97f6, 0xef => 0x97f5, 0xf0 => 0x980f, + 0xf1 => 0x980c, 0xf2 => 0x9838, 0xf3 => 0x9824, 0xf4 => 0x9821, + 0xf5 => 0x9837, 0xf6 => 0x983d, 0xf7 => 0x9846, 0xf8 => 0x984f, + 0xf9 => 0x984b, 0xfa => 0x986b, 0xfb => 0x986f, 0xfc => 0x9870, + }, + 0xe9 => { + 0x40 => 0x9871, 0x41 => 0x9874, 0x42 => 0x9873, 0x43 => 0x98aa, + 0x44 => 0x98af, 0x45 => 0x98b1, 0x46 => 0x98b6, 0x47 => 0x98c4, + 0x48 => 0x98c3, 0x49 => 0x98c6, 0x4a => 0x98e9, 0x4b => 0x98eb, + 0x4c => 0x9903, 0x4d => 0x9909, 0x4e => 0x9912, 0x4f => 0x9914, + 0x50 => 0x9918, 0x51 => 0x9921, 0x52 => 0x991d, 0x53 => 0x991e, + 0x54 => 0x9924, 0x55 => 0x9920, 0x56 => 0x992c, 0x57 => 0x992e, + 0x58 => 0x993d, 0x59 => 0x993e, 0x5a => 0x9942, 0x5b => 0x9949, + 0x5c => 0x9945, 0x5d => 0x9950, 0x5e => 0x994b, 0x5f => 0x9951, + 0x60 => 0x9952, 0x61 => 0x994c, 0x62 => 0x9955, 0x63 => 0x9997, + 0x64 => 0x9998, 0x65 => 0x99a5, 0x66 => 0x99ad, 0x67 => 0x99ae, + 0x68 => 0x99bc, 0x69 => 0x99df, 0x6a => 0x99db, 0x6b => 0x99dd, + 0x6c => 0x99d8, 0x6d => 0x99d1, 0x6e => 0x99ed, 0x6f => 0x99ee, + 0x70 => 0x99f1, 0x71 => 0x99f2, 0x72 => 0x99fb, 0x73 => 0x99f8, + 0x74 => 0x9a01, 0x75 => 0x9a0f, 0x76 => 0x9a05, 0x77 => 0x99e2, + 0x78 => 0x9a19, 0x79 => 0x9a2b, 0x7a => 0x9a37, 0x7b => 0x9a45, + 0x7c => 0x9a42, 0x7d => 0x9a40, 0x7e => 0x9a43, 0x80 => 0x9a3e, + 0x81 => 0x9a55, 0x82 => 0x9a4d, 0x83 => 0x9a5b, 0x84 => 0x9a57, + 0x85 => 0x9a5f, 0x86 => 0x9a62, 0x87 => 0x9a65, 0x88 => 0x9a64, + 0x89 => 0x9a69, 0x8a => 0x9a6b, 0x8b => 0x9a6a, 0x8c => 0x9aad, + 0x8d => 0x9ab0, 0x8e => 0x9abc, 0x8f => 0x9ac0, 0x90 => 0x9acf, + 0x91 => 0x9ad1, 0x92 => 0x9ad3, 0x93 => 0x9ad4, 0x94 => 0x9ade, + 0x95 => 0x9adf, 0x96 => 0x9ae2, 0x97 => 0x9ae3, 0x98 => 0x9ae6, + 0x99 => 0x9aef, 0x9a => 0x9aeb, 0x9b => 0x9aee, 0x9c => 0x9af4, + 0x9d => 0x9af1, 0x9e => 0x9af7, 0x9f => 0x9afb, 0xa0 => 0x9b06, + 0xa1 => 0x9b18, 0xa2 => 0x9b1a, 0xa3 => 0x9b1f, 0xa4 => 0x9b22, + 0xa5 => 0x9b23, 0xa6 => 0x9b25, 0xa7 => 0x9b27, 0xa8 => 0x9b28, + 0xa9 => 0x9b29, 0xaa => 0x9b2a, 0xab => 0x9b2e, 0xac => 0x9b2f, + 0xad => 0x9b32, 0xae => 0x9b44, 0xaf => 0x9b43, 0xb0 => 0x9b4f, + 0xb1 => 0x9b4d, 0xb2 => 0x9b4e, 0xb3 => 0x9b51, 0xb4 => 0x9b58, + 0xb5 => 0x9b74, 0xb6 => 0x9b93, 0xb7 => 0x9b83, 0xb8 => 0x9b91, + 0xb9 => 0x9b96, 0xba => 0x9b97, 0xbb => 0x9b9f, 0xbc => 0x9ba0, + 0xbd => 0x9ba8, 0xbe => 0x9bb4, 0xbf => 0x9bc0, 0xc0 => 0x9bca, + 0xc1 => 0x9bb9, 0xc2 => 0x9bc6, 0xc3 => 0x9bcf, 0xc4 => 0x9bd1, + 0xc5 => 0x9bd2, 0xc6 => 0x9be3, 0xc7 => 0x9be2, 0xc8 => 0x9be4, + 0xc9 => 0x9bd4, 0xca => 0x9be1, 0xcb => 0x9c3a, 0xcc => 0x9bf2, + 0xcd => 0x9bf1, 0xce => 0x9bf0, 0xcf => 0x9c15, 0xd0 => 0x9c14, + 0xd1 => 0x9c09, 0xd2 => 0x9c13, 0xd3 => 0x9c0c, 0xd4 => 0x9c06, + 0xd5 => 0x9c08, 0xd6 => 0x9c12, 0xd7 => 0x9c0a, 0xd8 => 0x9c04, + 0xd9 => 0x9c2e, 0xda => 0x9c1b, 0xdb => 0x9c25, 0xdc => 0x9c24, + 0xdd => 0x9c21, 0xde => 0x9c30, 0xdf => 0x9c47, 0xe0 => 0x9c32, + 0xe1 => 0x9c46, 0xe2 => 0x9c3e, 0xe3 => 0x9c5a, 0xe4 => 0x9c60, + 0xe5 => 0x9c67, 0xe6 => 0x9c76, 0xe7 => 0x9c78, 0xe8 => 0x9ce7, + 0xe9 => 0x9cec, 0xea => 0x9cf0, 0xeb => 0x9d09, 0xec => 0x9d08, + 0xed => 0x9ceb, 0xee => 0x9d03, 0xef => 0x9d06, 0xf0 => 0x9d2a, + 0xf1 => 0x9d26, 0xf2 => 0x9daf, 0xf3 => 0x9d23, 0xf4 => 0x9d1f, + 0xf5 => 0x9d44, 0xf6 => 0x9d15, 0xf7 => 0x9d12, 0xf8 => 0x9d41, + 0xf9 => 0x9d3f, 0xfa => 0x9d3e, 0xfb => 0x9d46, 0xfc => 0x9d48, + }, + 0xea => { + 0x40 => 0x9d5d, 0x41 => 0x9d5e, 0x42 => 0x9d64, 0x43 => 0x9d51, + 0x44 => 0x9d50, 0x45 => 0x9d59, 0x46 => 0x9d72, 0x47 => 0x9d89, + 0x48 => 0x9d87, 0x49 => 0x9dab, 0x4a => 0x9d6f, 0x4b => 0x9d7a, + 0x4c => 0x9d9a, 0x4d => 0x9da4, 0x4e => 0x9da9, 0x4f => 0x9db2, + 0x50 => 0x9dc4, 0x51 => 0x9dc1, 0x52 => 0x9dbb, 0x53 => 0x9db8, + 0x54 => 0x9dba, 0x55 => 0x9dc6, 0x56 => 0x9dcf, 0x57 => 0x9dc2, + 0x58 => 0x9dd9, 0x59 => 0x9dd3, 0x5a => 0x9df8, 0x5b => 0x9de6, + 0x5c => 0x9ded, 0x5d => 0x9def, 0x5e => 0x9dfd, 0x5f => 0x9e1a, + 0x60 => 0x9e1b, 0x61 => 0x9e1e, 0x62 => 0x9e75, 0x63 => 0x9e79, + 0x64 => 0x9e7d, 0x65 => 0x9e81, 0x66 => 0x9e88, 0x67 => 0x9e8b, + 0x68 => 0x9e8c, 0x69 => 0x9e92, 0x6a => 0x9e95, 0x6b => 0x9e91, + 0x6c => 0x9e9d, 0x6d => 0x9ea5, 0x6e => 0x9ea9, 0x6f => 0x9eb8, + 0x70 => 0x9eaa, 0x71 => 0x9ead, 0x72 => 0x9761, 0x73 => 0x9ecc, + 0x74 => 0x9ece, 0x75 => 0x9ecf, 0x76 => 0x9ed0, 0x77 => 0x9ed4, + 0x78 => 0x9edc, 0x79 => 0x9ede, 0x7a => 0x9edd, 0x7b => 0x9ee0, + 0x7c => 0x9ee5, 0x7d => 0x9ee8, 0x7e => 0x9eef, 0x80 => 0x9ef4, + 0x81 => 0x9ef6, 0x82 => 0x9ef7, 0x83 => 0x9ef9, 0x84 => 0x9efb, + 0x85 => 0x9efc, 0x86 => 0x9efd, 0x87 => 0x9f07, 0x88 => 0x9f08, + 0x89 => 0x76b7, 0x8a => 0x9f15, 0x8b => 0x9f21, 0x8c => 0x9f2c, + 0x8d => 0x9f3e, 0x8e => 0x9f4a, 0x8f => 0x9f52, 0x90 => 0x9f54, + 0x91 => 0x9f63, 0x92 => 0x9f5f, 0x93 => 0x9f60, 0x94 => 0x9f61, + 0x95 => 0x9f66, 0x96 => 0x9f67, 0x97 => 0x9f6c, 0x98 => 0x9f6a, + 0x99 => 0x9f77, 0x9a => 0x9f72, 0x9b => 0x9f76, 0x9c => 0x9f95, + 0x9d => 0x9f9c, 0x9e => 0x9fa0, 0x9f => 0x582f, 0xa0 => 0x69c7, + 0xa1 => 0x9059, 0xa2 => 0x7464, 0xa3 => 0x51dc, 0xa4 => 0x7199, + }, + 0xeb => { + 0x41 => [0x3001,0xf87e], 0x42 => [0x3002,0xf87e], 0x50 => [0xffe3,0xf87e], + 0x51 => 0xfe33, 0x5b => [0x30fc,0xf87e], 0x5c => 0xfe31, + 0x5d => [0x2010,0xf87e], 0x60 => [0x301c,0xf87e], 0x61 => [0x2016,0xf87e], + 0x62 => [0xff5c,0xf87e], 0x63 => [0x2026,0xf87e], 0x64 => 0xfe30, + 0x69 => 0xfe35, 0x6a => 0xfe36, 0x6b => 0xfe39, 0x6c => 0xfe3a, + 0x6d => [0xff3b,0xf87e], 0x6e => [0xff3d,0xf87e], 0x6f => 0xfe37, + 0x70 => 0xfe38, 0x71 => 0xfe3f, 0x72 => 0xfe40, 0x73 => 0xfe3d, + 0x74 => 0xfe3e, 0x75 => 0xfe41, 0x76 => 0xfe42, 0x77 => 0xfe43, + 0x78 => 0xfe44, 0x79 => 0xfe3b, 0x7a => 0xfe3c, 0x81 => [0xff1d,0xf87e], + }, + 0xec => { + 0x9f => [0x3041,0xf87e], 0xa1 => [0x3043,0xf87e], 0xa3 => [0x3045,0xf87e], + 0xa5 => [0x3047,0xf87e], 0xa7 => [0x3049,0xf87e], 0xc1 => [0x3063,0xf87e], + 0xe1 => [0x3083,0xf87e], 0xe3 => [0x3085,0xf87e], 0xe5 => [0x3087,0xf87e], + 0xec => [0x308e,0xf87e], + }, + 0xed => { + 0x40 => [0x30a1,0xf87e], 0x42 => [0x30a3,0xf87e], 0x44 => [0x30a5,0xf87e], + 0x46 => [0x30a7,0xf87e], 0x48 => [0x30a9,0xf87e], 0x62 => [0x30c3,0xf87e], + 0x83 => [0x30e3,0xf87e], 0x85 => [0x30e5,0xf87e], 0x87 => [0x30e7,0xf87e], + 0x8e => [0x30ee,0xf87e], 0x95 => [0x30f5,0xf87e], 0x96 => [0x30f6,0xf87e], + }, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacKorean.pm b/lib/Image/ExifTool/Charset/MacKorean.pm new file mode 100644 index 0000000..c8f6e72 --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacKorean.pm @@ -0,0 +1,2720 @@ +#------------------------------------------------------------------------------ +# File: MacKorean.pm +# +# Description: Mac Korean to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/KOREAN.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacKorean = ( + 0x80 => 0xa0, 0x81 => 0x20a9, 0x82 => [0x2013,0xf87f], 0x83 => 0xa9, + 0x84 => [0xff3f,0xf87f], 0xff => [0x2026,0xf87f], + 0xa1 => { + 0x41 => [0x300c,0xf87f], 0x42 => [0x300d,0xf87f], 0x43 => [0x300c,0xf87b], + 0x44 => [0x300d,0xf87b], 0x45 => [0x300c,0xf87c], 0x46 => [0x300d,0xf87c], + 0x47 => [0x300e,0xf87c], 0x48 => [0x300f,0xf87c], 0x49 => [0x300a,0xf878], + 0x4a => [0x300b,0xf878], 0x4b => [0x3008,0xf878], 0x4c => [0x3009,0xf878], + 0x4d => 0xfe59, 0x4e => 0xfe5a, 0x4f => [0xfe59,0xf87f], + 0x50 => [0xfe5a,0xf87f], 0x51 => [0x2985,0xf87f], 0x52 => [0x2986,0xf87f], + 0x53 => [0x2985,0xf879], 0x54 => [0x2986,0xf879], 0x55 => [0x2985,0xf87c], + 0x56 => [0x2986,0xf87c], 0x57 => [0x28,0xf87c], 0x58 => [0x29,0xf87c], + 0x59 => 0x2985, 0x5a => 0x2986, 0x5b => [0x3010,0xf87f], + 0x5c => [0x3011,0xf87f], 0x5d => 0x3016, 0x5e => 0x3017, 0x5f => 0x3018, + 0x60 => 0x3019, 0x61 => [0x5b,0xf87b], 0x62 => [0x5d,0xf87b], + 0x63 => [0x5b,0xf87c], 0x64 => [0x5d,0xf87c], 0x65 => [0x2985,0xf87b], + 0x66 => [0x2986,0xf87b], 0x67 => [0x2020,0xf87f], 0x68 => [0x2021,0xf87f], + 0x69 => [0x2020,0xf87b], 0x6a => [0x2021,0xf87c], 0x6b => [0x2020,0xf877], + 0x6c => [0x2a,0xf877], 0x6d => 0x2051, 0x6e => 0xf840, 0x6f => 0x201f, + 0x70 => 0x201b, 0x71 => 0x207a, 0x72 => 0x207b, 0x73 => [0xd7,0xf877], + 0x74 => [0x221e,0xf877], 0x75 => [0x223d,0xf877], 0x76 => [0xb1,0xf877], + 0x77 => [0x2213,0xf877], 0x78 => [0x3e,0xf877], 0x79 => [0x3c,0xf877], + 0x7a => 0x207c, 0x7b => [0x2260,0xf877], 0x7c => 0x207d, 0x7d => 0x207e, + 0x81 => [0x7b,0xf877], 0x82 => [0x7d,0xf877], 0x83 => [0x5b,0xf877], + 0x84 => [0x5d,0xf877], 0x85 => [0x2229,0xf877], 0x86 => [0x222a,0xf877], + 0x87 => [0x2282,0xf877], 0x88 => [0x2208,0xf877], 0x89 => [0x2211,0xf877], + 0x8a => [0x21,0xf877], 0x8b => [0x3007,0xf876], 0x8c => [0x4e00,0xf876], + 0x8d => [0x4e8c,0xf876], 0x8e => [0x4e09,0xf876], 0x8f => [0x56db,0xf876], + 0x90 => [0x4e94,0xf876], 0x91 => [0x516d,0xf876], 0x92 => [0x4e03,0xf876], + 0x93 => [0x516b,0xf876], 0x94 => [0x4e5d,0xf876], 0x95 => [0x5341,0xf876], + 0x96 => 0x204c, 0x97 => 0x204d, 0x98 => 0x02bc, 0x99 => 0x2997, + 0x9a => 0x2998, 0x9c => [0xff0a,0xf874], 0x9d => [0x2051,0xf87c], + 0x9e => [0xff0a,0xf875], 0x9f => [0xff0a,0xf871], 0xa0 => [0x2051,0xf879], + 0xa1 => 0x3000, 0xa2 => 0x3001, 0xa3 => 0x3002, 0xa4 => 0xb7, + 0xa5 => 0x2025, 0xa6 => 0x2026, 0xa7 => 0xa8, 0xa8 => 0x3003, + 0xa9 => 0x2013, 0xaa => 0x2014, 0xab => 0x2016, 0xac => 0xff3c, + 0xad => 0x301c, 0xae => 0x2018, 0xaf => 0x2019, 0xb0 => 0x201c, + 0xb1 => 0x201d, 0xb2 => 0x3014, 0xb3 => 0x3015, 0xb4 => 0x3008, + 0xb5 => 0x3009, 0xb6 => 0x300a, 0xb7 => 0x300b, 0xb8 => 0x300c, + 0xb9 => 0x300d, 0xba => 0x300e, 0xbb => 0x300f, 0xbc => 0x3010, + 0xbd => 0x3011, 0xbe => 0xb1, 0xbf => 0xd7, 0xc0 => 0xf7, 0xc1 => 0x2260, + 0xc2 => 0x2264, 0xc3 => 0x2265, 0xc4 => 0x221e, 0xc5 => 0x2234, + 0xc6 => 0xb0, 0xc7 => 0x2032, 0xc8 => 0x2033, 0xc9 => 0x2103, + 0xca => 0x212b, 0xcb => 0xa2, 0xcc => 0xa3, 0xcd => 0xa5, 0xce => 0x2642, + 0xcf => 0x2640, 0xd0 => 0x2220, 0xd1 => 0x22a5, 0xd2 => 0x2312, + 0xd3 => 0x2202, 0xd4 => 0x2207, 0xd5 => 0x2261, 0xd6 => 0x2252, + 0xd7 => 0xa7, 0xd8 => 0x203b, 0xd9 => 0x2606, 0xda => 0x2605, + 0xdb => 0x25cb, 0xdc => 0x25cf, 0xdd => 0x25ce, 0xde => 0x25c7, + 0xdf => 0x25c6, 0xe0 => 0x25a1, 0xe1 => 0x25a0, 0xe2 => 0x25b3, + 0xe3 => 0x25b2, 0xe4 => 0x25bd, 0xe5 => 0x25bc, 0xe6 => 0x2192, + 0xe7 => 0x2190, 0xe8 => 0x2191, 0xe9 => 0x2193, 0xea => 0x2194, + 0xeb => 0x3013, 0xec => 0x226a, 0xed => 0x226b, 0xee => 0x221a, + 0xef => 0x223d, 0xf0 => 0x221d, 0xf1 => 0x2235, 0xf2 => 0x222b, + 0xf3 => 0x222c, 0xf4 => 0x2208, 0xf5 => 0x220b, 0xf6 => 0x2286, + 0xf7 => 0x2287, 0xf8 => 0x2282, 0xf9 => 0x2283, 0xfa => 0x222a, + 0xfb => 0x2229, 0xfc => 0x2227, 0xfd => 0x2228, 0xfe => 0xac, + }, + 0xa2 => { + 0x41 => [0x2985,0xf878], 0x42 => [0x2986,0xf878], 0x43 => [0x2985,0xf873], + 0x44 => [0x2986,0xf873], 0x45 => [0xfe59,0xf87c], 0x46 => [0xfe5a,0xf87c], + 0x47 => [0x3016,0xf878], 0x48 => [0x3017,0xf878], 0x49 => [0x3010,0xf878], + 0x4a => [0x3011,0xf878], 0x4b => [0x28,0xf87f], 0x4c => [0x29,0xf87f], + 0xa1 => 0x21d2, 0xa2 => 0x21d4, 0xa3 => 0x2200, 0xa4 => 0x2203, + 0xa5 => 0xb4, 0xa6 => 0x02dc, 0xa7 => 0x02c7, 0xa8 => 0x02d8, + 0xa9 => 0x02dd, 0xaa => 0x02da, 0xab => 0x02d9, 0xac => 0xb8, + 0xad => 0x02db, 0xae => 0xa1, 0xaf => 0xbf, 0xb0 => 0x02d0, 0xb1 => 0x222e, + 0xb2 => 0x2211, 0xb3 => 0x220f, 0xb4 => 0xa4, 0xb5 => 0x2109, + 0xb6 => 0x2030, 0xb7 => 0x25c1, 0xb8 => 0x25c0, 0xb9 => 0x25b7, + 0xba => 0x25b6, 0xbb => 0x2664, 0xbc => 0x2660, 0xbd => 0x2661, + 0xbe => 0x2665, 0xbf => 0x2667, 0xc0 => 0x2663, 0xc1 => 0x25c9, + 0xc2 => 0x25c8, 0xc3 => 0x25a3, 0xc4 => 0x25d0, 0xc5 => 0x25d1, + 0xc6 => 0x2592, 0xc7 => 0x25a4, 0xc8 => 0x25a5, 0xc9 => 0x25a8, + 0xca => 0x25a7, 0xcb => 0x25a6, 0xcc => 0x25a9, 0xcd => 0x2668, + 0xce => 0x260f, 0xcf => 0x260e, 0xd0 => 0x261c, 0xd1 => 0x261e, + 0xd2 => 0xb6, 0xd3 => 0x2020, 0xd4 => 0x2021, 0xd5 => 0x2195, + 0xd6 => 0x2197, 0xd7 => 0x2199, 0xd8 => 0x2196, 0xd9 => 0x2198, + 0xda => 0x266d, 0xdb => 0x2669, 0xdc => 0x266a, 0xdd => 0x266c, + 0xde => 0x327f, 0xdf => 0x321c, 0xe0 => 0x2116, 0xe1 => 0x33c7, + 0xe2 => 0x2122, 0xe3 => 0x33c2, 0xe4 => 0x33d8, 0xe5 => 0x2121, + 0xe6 => [0x31,0x20de,0xf87c], 0xe7 => [0x32,0x20de,0xf87c], + 0xe8 => [0x33,0x20de,0xf87c], 0xe9 => [0x34,0x20de,0xf87c], + 0xea => [0x35,0x20de,0xf87c], 0xeb => [0x36,0x20de,0xf87c], + 0xec => [0x37,0x20de,0xf87c], 0xed => [0x38,0x20de,0xf87c], + 0xee => [0x39,0x20de,0xf87c], 0xef => [0xf863,0x5b,0x31,0x30,0x5d], + 0xf0 => [0xf863,0x5b,0x31,0x31,0x5d], 0xf1 => [0xf863,0x5b,0x31,0x32,0x5d], + 0xf2 => [0xf863,0x5b,0x31,0x33,0x5d], 0xf3 => [0xf863,0x5b,0x31,0x34,0x5d], + 0xf4 => [0xf863,0x5b,0x31,0x35,0x5d], 0xf5 => [0xf863,0x5b,0x31,0x36,0x5d], + 0xf6 => [0xf863,0x5b,0x31,0x37,0x5d], 0xf7 => [0xf863,0x5b,0x31,0x38,0x5d], + 0xf8 => [0xf863,0x5b,0x31,0x39,0x5d], 0xf9 => [0xf863,0x5b,0x32,0x30,0x5d], + 0xfa => [0xb6,0xf87f], 0xfb => [0x2016,0xf87b], 0xfc => [0x2016,0xf87c], + 0xfd => 0x22ee, 0xfe => 0x2237, + }, + 0xa3 => { + 0x41 => [0x31,0x20de,0xf87b], 0x42 => [0x32,0x20de,0xf87b], + 0x43 => [0x33,0x20de,0xf87b], 0x44 => [0x34,0x20de,0xf87b], + 0x45 => [0x35,0x20de,0xf87b], 0x46 => [0x36,0x20de,0xf87b], + 0x47 => [0x37,0x20de,0xf87b], 0x48 => [0x38,0x20de,0xf87b], + 0x49 => [0x39,0x20de,0xf87b], 0x4a => [0xf864,0x5b,0x31,0x30,0x5d], + 0x4b => [0xf864,0x5b,0x31,0x31,0x5d], 0x4c => [0xf864,0x5b,0x31,0x32,0x5d], + 0x4d => [0xf864,0x5b,0x31,0x33,0x5d], 0x4e => [0xf864,0x5b,0x31,0x34,0x5d], + 0x4f => [0xf864,0x5b,0x31,0x35,0x5d], 0x50 => [0xf864,0x5b,0x31,0x36,0x5d], + 0x51 => [0xf864,0x5b,0x31,0x37,0x5d], 0x52 => [0xf864,0x5b,0x31,0x38,0x5d], + 0x53 => [0xf864,0x5b,0x31,0x39,0x5d], 0x54 => [0xf864,0x5b,0x32,0x30,0x5d], + 0x55 => 0x278a, 0x56 => 0x278b, 0x57 => 0x278c, 0x58 => 0x278d, + 0x59 => 0x278e, 0x5a => 0x278f, 0x5b => 0x2790, 0x5c => 0x2791, + 0x5d => 0x2792, 0x5e => 0x2793, 0x5f => [0x24eb,0xf87f], + 0x60 => [0x24ec,0xf87f], 0x61 => [0x24ed,0xf87f], 0x62 => [0x24ee,0xf87f], + 0x63 => [0x24ef,0xf87f], 0x64 => [0x24f0,0xf87f], 0x65 => [0x24f1,0xf87f], + 0x66 => [0x24f2,0xf87f], 0x67 => [0x24f3,0xf87f], 0x68 => [0x24f4,0xf87f], + 0x69 => [0xf861,0x28,0x41,0x29], 0x6a => [0xf861,0x28,0x42,0x29], + 0x6b => [0xf861,0x28,0x43,0x29], 0x6c => [0xf861,0x28,0x44,0x29], + 0x6d => [0xf861,0x28,0x45,0x29], 0x6e => [0xf861,0x28,0x46,0x29], + 0x6f => [0xf861,0x28,0x47,0x29], 0x70 => [0xf861,0x28,0x48,0x29], + 0x71 => [0xf861,0x28,0x49,0x29], 0x72 => [0xf861,0x28,0x4a,0x29], + 0x73 => [0xf861,0x28,0x4b,0x29], 0x74 => [0xf861,0x28,0x4c,0x29], + 0x75 => [0xf861,0x28,0x4d,0x29], 0x76 => [0xf861,0x28,0x4e,0x29], + 0x77 => [0xf861,0x28,0x4f,0x29], 0x78 => [0xf861,0x28,0x50,0x29], + 0x79 => [0xf861,0x28,0x51,0x29], 0x7a => [0xf861,0x28,0x52,0x29], + 0x7b => [0xf861,0x28,0x53,0x29], 0x7c => [0xf861,0x28,0x54,0x29], + 0x7d => [0xf861,0x28,0x55,0x29], 0x81 => [0xf861,0x28,0x56,0x29], + 0x82 => [0xf861,0x28,0x57,0x29], 0x83 => [0xf861,0x28,0x58,0x29], + 0x84 => [0xf861,0x28,0x59,0x29], 0x85 => [0xf861,0x28,0x5a,0x29], + 0x86 => 0x24b6, 0x87 => 0x24b7, 0x88 => 0x24b8, 0x89 => 0x24b9, + 0x8a => 0x24ba, 0x8b => 0x24bb, 0x8c => 0x24bc, 0x8d => 0x24bd, + 0x8e => 0x24be, 0x8f => 0x24bf, 0x90 => 0x24c0, 0x91 => 0x24c1, + 0x92 => 0x24c2, 0x93 => 0x24c3, 0x94 => 0x24c4, 0x95 => 0x24c5, + 0x96 => 0x24c6, 0x97 => 0x24c7, 0x98 => 0x24c8, 0x99 => 0x24c9, + 0x9a => 0x24ca, 0x9b => 0x24cb, 0x9c => 0x24cc, 0x9d => 0x24cd, + 0x9e => 0x24ce, 0x9f => 0x24cf, 0xa1 => 0xff01, 0xa2 => 0xff02, + 0xa3 => 0xff03, 0xa4 => 0xff04, 0xa5 => 0xff05, 0xa6 => 0xff06, + 0xa7 => 0xff07, 0xa8 => 0xff08, 0xa9 => 0xff09, 0xaa => 0xff0a, + 0xab => 0xff0b, 0xac => 0xff0c, 0xad => 0xff0d, 0xae => 0xff0e, + 0xaf => 0xff0f, 0xb0 => 0xff10, 0xb1 => 0xff11, 0xb2 => 0xff12, + 0xb3 => 0xff13, 0xb4 => 0xff14, 0xb5 => 0xff15, 0xb6 => 0xff16, + 0xb7 => 0xff17, 0xb8 => 0xff18, 0xb9 => 0xff19, 0xba => 0xff1a, + 0xbb => 0xff1b, 0xbc => 0xff1c, 0xbd => 0xff1d, 0xbe => 0xff1e, + 0xbf => 0xff1f, 0xc0 => 0xff20, 0xc1 => 0xff21, 0xc2 => 0xff22, + 0xc3 => 0xff23, 0xc4 => 0xff24, 0xc5 => 0xff25, 0xc6 => 0xff26, + 0xc7 => 0xff27, 0xc8 => 0xff28, 0xc9 => 0xff29, 0xca => 0xff2a, + 0xcb => 0xff2b, 0xcc => 0xff2c, 0xcd => 0xff2d, 0xce => 0xff2e, + 0xcf => 0xff2f, 0xd0 => 0xff30, 0xd1 => 0xff31, 0xd2 => 0xff32, + 0xd3 => 0xff33, 0xd4 => 0xff34, 0xd5 => 0xff35, 0xd6 => 0xff36, + 0xd7 => 0xff37, 0xd8 => 0xff38, 0xd9 => 0xff39, 0xda => 0xff3a, + 0xdb => 0xff3b, 0xdc => 0xffe6, 0xdd => 0xff3d, 0xde => 0xff3e, + 0xdf => 0xff3f, 0xe0 => 0xff40, 0xe1 => 0xff41, 0xe2 => 0xff42, + 0xe3 => 0xff43, 0xe4 => 0xff44, 0xe5 => 0xff45, 0xe6 => 0xff46, + 0xe7 => 0xff47, 0xe8 => 0xff48, 0xe9 => 0xff49, 0xea => 0xff4a, + 0xeb => 0xff4b, 0xec => 0xff4c, 0xed => 0xff4d, 0xee => 0xff4e, + 0xef => 0xff4f, 0xf0 => 0xff50, 0xf1 => 0xff51, 0xf2 => 0xff52, + 0xf3 => 0xff53, 0xf4 => 0xff54, 0xf5 => 0xff55, 0xf6 => 0xff56, + 0xf7 => 0xff57, 0xf8 => 0xff58, 0xf9 => 0xff59, 0xfa => 0xff5a, + 0xfb => 0xff5b, 0xfc => 0xff5c, 0xfd => 0xff5d, 0xfe => 0x203e, + }, + 0xa4 => { + 0x41 => [0x31,0x20de,0xf87f], 0x42 => [0x32,0x20de,0xf87f], + 0x43 => [0x33,0x20de,0xf87f], 0x44 => [0x34,0x20de,0xf87f], + 0x45 => [0x35,0x20de,0xf87f], 0x46 => [0x36,0x20de,0xf87f], + 0x47 => [0x37,0x20de,0xf87f], 0x48 => [0x38,0x20de,0xf87f], + 0x49 => [0x39,0x20de,0xf87f], 0x4a => [0xf862,0x5b,0x31,0x30,0x5d], + 0x4b => [0xf862,0x5b,0x31,0x31,0x5d], 0x4c => [0xf862,0x5b,0x31,0x32,0x5d], + 0x4d => [0xf862,0x5b,0x31,0x33,0x5d], 0x4e => [0xf862,0x5b,0x31,0x34,0x5d], + 0x4f => [0xf862,0x5b,0x31,0x35,0x5d], 0x50 => [0xf862,0x5b,0x31,0x36,0x5d], + 0x51 => [0xf862,0x5b,0x31,0x37,0x5d], 0x52 => [0xf862,0x5b,0x31,0x38,0x5d], + 0x53 => [0xf862,0x5b,0x31,0x39,0x5d], 0x54 => [0xf862,0x5b,0x32,0x30,0x5d], + 0x55 => [0x31,0x20de,0xf87a], 0x56 => [0x32,0x20de,0xf87a], + 0x57 => [0x33,0x20de,0xf87a], 0x58 => [0x34,0x20de,0xf87a], + 0x59 => [0x35,0x20de,0xf87a], 0x5a => [0x36,0x20de,0xf87a], + 0x5b => [0x37,0x20de,0xf87a], 0x5c => [0x38,0x20de,0xf87a], + 0x5d => [0x39,0x20de,0xf87a], 0x5e => [0xf865,0x5b,0x31,0x30,0x5d], + 0x5f => [0xf865,0x5b,0x31,0x31,0x5d], 0x60 => [0xf865,0x5b,0x31,0x32,0x5d], + 0x61 => [0xf865,0x5b,0x31,0x33,0x5d], 0x62 => [0xf865,0x5b,0x31,0x34,0x5d], + 0x63 => [0xf865,0x5b,0x31,0x35,0x5d], 0x64 => [0xf865,0x5b,0x31,0x36,0x5d], + 0x65 => [0xf865,0x5b,0x31,0x37,0x5d], 0x66 => [0xf865,0x5b,0x31,0x38,0x5d], + 0x67 => [0xf865,0x5b,0x31,0x39,0x5d], 0x68 => [0xf865,0x5b,0x32,0x30,0x5d], + 0x69 => [0x278a,0xf87f], 0x6a => [0x278b,0xf87f], 0x6b => [0x278c,0xf87f], + 0x6c => [0x278d,0xf87f], 0x6d => [0x278e,0xf87f], 0x6e => [0x278f,0xf87f], + 0x6f => [0x2790,0xf87f], 0x70 => [0x2791,0xf87f], 0x71 => [0x2792,0xf87f], + 0x72 => [0x2793,0xf87f], 0x73 => [0x24eb,0xf878], 0x74 => [0x24ec,0xf878], + 0x75 => [0x24ed,0xf878], 0x76 => [0x24ee,0xf878], 0x77 => [0x24ef,0xf878], + 0x78 => [0x24f0,0xf878], 0x79 => [0x24f1,0xf878], 0x7a => [0x24f2,0xf878], + 0x7b => [0x24f3,0xf878], 0x7c => [0x24f4,0xf878], 0x7d => 0x2a26, + 0x81 => 0x227a, 0x82 => 0x227b, 0x83 => 0x22ce, 0x84 => 0x22cf, + 0x85 => 0x2280, 0x86 => 0x2281, 0x87 => 0x2270, 0x88 => 0x2271, + 0x89 => 0x2272, 0x8a => 0x2273, 0x8b => 0x2ac5, 0x8c => 0x2acb, + 0x8d => 0x2ac6, 0x8e => 0x2acc, 0x8f => 0x2276, 0x90 => 0x2277, + 0x91 => 0x2279, 0x92 => 0x22da, 0x93 => 0x22db, 0x94 => 0x2a8b, + 0x95 => 0x2a8c, 0x96 => 0x2a91, 0x97 => 0x2a92, 0x98 => [0x2222,0xf87f], + 0x99 => 0x2245, 0x9a => 0x2243, 0x9b => 0x2248, 0x9c => 0x29a3, + 0x9d => 0x22a4, 0x9e => [0x2225,0x0347], 0x9f => [0x2afd,0x0347], + 0xa1 => 0x3131, 0xa2 => 0x3132, 0xa3 => 0x3133, 0xa4 => 0x3134, + 0xa5 => 0x3135, 0xa6 => 0x3136, 0xa7 => 0x3137, 0xa8 => 0x3138, + 0xa9 => 0x3139, 0xaa => 0x313a, 0xab => 0x313b, 0xac => 0x313c, + 0xad => 0x313d, 0xae => 0x313e, 0xaf => 0x313f, 0xb0 => 0x3140, + 0xb1 => 0x3141, 0xb2 => 0x3142, 0xb3 => 0x3143, 0xb4 => 0x3144, + 0xb5 => 0x3145, 0xb6 => 0x3146, 0xb7 => 0x3147, 0xb8 => 0x3148, + 0xb9 => 0x3149, 0xba => 0x314a, 0xbb => 0x314b, 0xbc => 0x314c, + 0xbd => 0x314d, 0xbe => 0x314e, 0xbf => 0x314f, 0xc0 => 0x3150, + 0xc1 => 0x3151, 0xc2 => 0x3152, 0xc3 => 0x3153, 0xc4 => 0x3154, + 0xc5 => 0x3155, 0xc6 => 0x3156, 0xc7 => 0x3157, 0xc8 => 0x3158, + 0xc9 => 0x3159, 0xca => 0x315a, 0xcb => 0x315b, 0xcc => 0x315c, + 0xcd => 0x315d, 0xce => 0x315e, 0xcf => 0x315f, 0xd0 => 0x3160, + 0xd1 => 0x3161, 0xd2 => 0x3162, 0xd3 => 0x3163, 0xd4 => 0x3164, + 0xd5 => 0x3165, 0xd6 => 0x3166, 0xd7 => 0x3167, 0xd8 => 0x3168, + 0xd9 => 0x3169, 0xda => 0x316a, 0xdb => 0x316b, 0xdc => 0x316c, + 0xdd => 0x316d, 0xde => 0x316e, 0xdf => 0x316f, 0xe0 => 0x3170, + 0xe1 => 0x3171, 0xe2 => 0x3172, 0xe3 => 0x3173, 0xe4 => 0x3174, + 0xe5 => 0x3175, 0xe6 => 0x3176, 0xe7 => 0x3177, 0xe8 => 0x3178, + 0xe9 => 0x3179, 0xea => 0x317a, 0xeb => 0x317b, 0xec => 0x317c, + 0xed => 0x317d, 0xee => 0x317e, 0xef => 0x317f, 0xf0 => 0x3180, + 0xf1 => 0x3181, 0xf2 => 0x3182, 0xf3 => 0x3183, 0xf4 => 0x3184, + 0xf5 => 0x3185, 0xf6 => 0x3186, 0xf7 => 0x3187, 0xf8 => 0x3188, + 0xf9 => 0x3189, 0xfa => 0x318a, 0xfb => 0x318b, 0xfc => 0x318c, + 0xfd => 0x318d, 0xfe => 0x318e, + }, + 0xa5 => { + 0x41 => [0x30,0x20de], 0x42 => [0x31,0x20de], 0x43 => [0x32,0x20de], + 0x44 => [0x33,0x20de], 0x45 => [0x34,0x20de], 0x46 => [0x35,0x20de], + 0x47 => [0x36,0x20de], 0x48 => [0x37,0x20de], 0x49 => [0x38,0x20de], + 0x4a => [0x39,0x20de], 0x4b => [0x24ea,0xf87f], 0x4c => [0x2460,0xf87f], + 0x4d => [0x2461,0xf87f], 0x4e => [0x2462,0xf87f], 0x4f => [0x2463,0xf87f], + 0x50 => [0x2464,0xf87f], 0x51 => [0x2465,0xf87f], 0x52 => [0x2466,0xf87f], + 0x53 => [0x2467,0xf87f], 0x54 => [0x2468,0xf87f], + 0x55 => [0xf860,0x41,0x29], 0x56 => [0xf860,0x42,0x29], + 0x57 => [0xf860,0x43,0x29], 0x58 => [0xf860,0x44,0x29], + 0x59 => [0xf860,0x45,0x29], 0x5a => [0xf860,0x46,0x29], + 0x5b => [0xf860,0x47,0x29], 0x5c => [0xf860,0x48,0x29], + 0x5d => [0xf860,0x49,0x29], 0x5e => [0xf860,0x4a,0x29], + 0x5f => [0xf860,0x4b,0x29], 0x60 => [0xf860,0x4c,0x29], + 0x61 => [0xf860,0x4d,0x29], 0x62 => [0xf860,0x4e,0x29], + 0x63 => [0xf860,0x4f,0x29], 0x64 => [0xf860,0x50,0x29], + 0x65 => [0xf860,0x51,0x29], 0x66 => [0xf860,0x52,0x29], + 0x67 => [0xf860,0x53,0x29], 0x68 => [0xf860,0x54,0x29], + 0x69 => [0xf860,0x55,0x29], 0x6a => [0xf860,0x56,0x29], + 0x6b => [0xf860,0x57,0x29], 0x6c => [0xf860,0x58,0x29], + 0x6d => [0xf860,0x59,0x29], 0x6e => [0xf860,0x5a,0x29], + 0x6f => [0xf860,0x61,0x29], 0x70 => [0xf860,0x62,0x29], + 0x71 => [0xf860,0x63,0x29], 0x72 => [0xf860,0x64,0x29], + 0x73 => [0xf860,0x65,0x29], 0x74 => [0xf860,0x66,0x29], + 0x75 => [0xf860,0x67,0x29], 0x76 => [0xf860,0x68,0x29], + 0x77 => [0xf860,0x69,0x29], 0x78 => [0xf860,0x6a,0x29], + 0x79 => [0xf860,0x6b,0x29], 0x7a => [0xf860,0x6c,0x29], + 0x7b => [0xf860,0x6d,0x29], 0x7c => [0xf860,0x6e,0x29], + 0x7d => [0xf860,0x6f,0x29], 0x81 => [0xf860,0x70,0x29], + 0x82 => [0xf860,0x71,0x29], 0x83 => [0xf860,0x72,0x29], + 0x84 => [0xf860,0x73,0x29], 0x85 => [0xf860,0x74,0x29], + 0x86 => [0xf860,0x75,0x29], 0x87 => [0xf860,0x76,0x29], + 0x88 => [0xf860,0x77,0x29], 0x89 => [0xf860,0x78,0x29], + 0x8a => [0xf860,0x79,0x29], 0x8b => [0xf860,0x7a,0x29], 0xa1 => 0x2170, + 0xa2 => 0x2171, 0xa3 => 0x2172, 0xa4 => 0x2173, 0xa5 => 0x2174, + 0xa6 => 0x2175, 0xa7 => 0x2176, 0xa8 => 0x2177, 0xa9 => 0x2178, + 0xaa => 0x2179, 0xb0 => 0x2160, 0xb1 => 0x2161, 0xb2 => 0x2162, + 0xb3 => 0x2163, 0xb4 => 0x2164, 0xb5 => 0x2165, 0xb6 => 0x2166, + 0xb7 => 0x2167, 0xb8 => 0x2168, 0xb9 => 0x2169, 0xc1 => 0x0391, + 0xc2 => 0x0392, 0xc3 => 0x0393, 0xc4 => 0x0394, 0xc5 => 0x0395, + 0xc6 => 0x0396, 0xc7 => 0x0397, 0xc8 => 0x0398, 0xc9 => 0x0399, + 0xca => 0x039a, 0xcb => 0x039b, 0xcc => 0x039c, 0xcd => 0x039d, + 0xce => 0x039e, 0xcf => 0x039f, 0xd0 => 0x03a0, 0xd1 => 0x03a1, + 0xd2 => 0x03a3, 0xd3 => 0x03a4, 0xd4 => 0x03a5, 0xd5 => 0x03a6, + 0xd6 => 0x03a7, 0xd7 => 0x03a8, 0xd8 => 0x03a9, 0xda => [0xff01,0xf874], + 0xdb => [0x3002,0xf87d], 0xdc => [0x2032,0xf87f], 0xdd => [0x2033,0xf87f], + 0xde => 0x2034, 0xe1 => 0x03b1, 0xe2 => 0x03b2, 0xe3 => 0x03b3, + 0xe4 => 0x03b4, 0xe5 => 0x03b5, 0xe6 => 0x03b6, 0xe7 => 0x03b7, + 0xe8 => 0x03b8, 0xe9 => 0x03b9, 0xea => 0x03ba, 0xeb => 0x03bb, + 0xec => 0x03bc, 0xed => 0x03bd, 0xee => 0x03be, 0xef => 0x03bf, + 0xf0 => 0x03c0, 0xf1 => 0x03c1, 0xf2 => 0x03c3, 0xf3 => 0x03c4, + 0xf4 => 0x03c5, 0xf5 => 0x03c6, 0xf6 => 0x03c7, 0xf7 => 0x03c8, + 0xf8 => 0x03c9, 0xf9 => [0x3257,0xf87a], 0xfa => [0x3258,0xf87a], + 0xfb => [0x3259,0xf87a], 0xfc => [0x325a,0xf87a], + }, + 0xa6 => { + 0x41 => [0xf83d,0xf87f], 0x42 => 0xf83d, 0x43 => [0x2020,0xf87c], + 0x44 => [0xf860,0x2020,0x2020], 0x45 => [0xf860,0x2021,0x2021], + 0x46 => [0xf861,0x2020,0x2020,0x2020], 0x47 => [0xa7,0xf87c], + 0x48 => 0x266f, 0x49 => [0xff0a,0xf87f], 0x4a => [0xff0a,0xf873], + 0x4b => [0x2051,0xf874], 0x4c => [0xf860,0x2a,0x2a], 0x4d => 0x2042, + 0x4e => 0x204e, 0x4f => [0x2051,0xf871], 0x50 => [0xf867,0x2a,0x2a], + 0x51 => [0x2042,0xf879], 0x52 => 0x273d, 0x53 => 0x2731, 0x54 => 0x2747, + 0x55 => 0x2022, 0x56 => [0x25a0,0x20df], 0x57 => [0x25c7,0x20df], + 0x58 => 0xf805, 0x59 => [0x25a1,0x20df], 0x5a => 0x2039, 0x5b => 0x203a, + 0x5c => 0xab, 0x5d => 0xbb, 0x5e => [0x261c,0xf87f], + 0x5f => [0x261e,0xf87f], 0x60 => [0xf806,0x20df], + 0x61 => [0x25c7,0x20df,0x20df], 0x62 => [0x25c7,0x20de], 0x63 => 0xf806, + 0x64 => 0x29c8, 0x65 => [0x25c6,0x20de], 0x66 => [0xf805,0x20de], + 0x67 => [0x29c8,0x20de], 0x68 => 0x29be, 0x69 => [0x25ce,0x20dd], + 0x6a => [0x25b3,0x20dd], 0x6b => [0x25b2,0x20dd], 0x6c => 0x271a, + 0x6d => 0x2716, 0x6e => 0x29bf, 0x6f => 0x25ef, 0x70 => [0x25ef,0xf87c], + 0x71 => [0x2610,0xf87c], 0x72 => 0x2723, 0x73 => 0x2756, 0x74 => 0xf80a, + 0x75 => 0x25cc, 0x76 => [0x2610,0xf87f], 0x77 => 0x2610, 0x78 => 0x25a2, + 0x79 => [0x2723,0xf87a], 0x7a => [0x2756,0xf87a], 0x7b => [0x273f,0xf87a], + 0x7c => 0x273f, 0x7d => [0x3013,0xf87c], 0x81 => 0xf809, + 0x82 => [0x25c9,0x20dd], 0x83 => 0x274d, 0x84 => 0x25cd, + 0x85 => [0x27e1,0x20dd], 0x86 => [0xf80b,0xf87f], 0x87 => [0x2720,0xf87a], + 0x88 => 0x2720, 0x89 => [0x25c8,0xf87f], 0x8a => [0x25a8,0xf87f], + 0x8d => 0x2741, 0x8e => [0x2756,0xf87f], 0x8f => 0xf808, + 0x90 => [0x20a9,0xf87f], 0x91 => [0xf809,0xf87a], 0x92 => [0x534d,0xf87f], + 0x93 => 0x262f, 0x96 => 0xf80b, 0x97 => [0x262f,0xf87a], + 0x98 => [0x262f,0xf876], 0x99 => 0x2740, 0x9a => 0xf80c, + 0x9b => [0x2748,0x20d8], 0x9e => 0x3020, 0x9f => 0xf807, 0xa1 => 0x2500, + 0xa2 => 0x2502, 0xa3 => 0x250c, 0xa4 => 0x2510, 0xa5 => 0x2518, + 0xa6 => 0x2514, 0xa7 => 0x251c, 0xa8 => 0x252c, 0xa9 => 0x2524, + 0xaa => 0x2534, 0xab => 0x253c, 0xac => 0x2501, 0xad => 0x2503, + 0xae => 0x250f, 0xaf => 0x2513, 0xb0 => 0x251b, 0xb1 => 0x2517, + 0xb2 => 0x2523, 0xb3 => 0x2533, 0xb4 => 0x252b, 0xb5 => 0x253b, + 0xb6 => 0x254b, 0xb7 => 0x2520, 0xb8 => 0x252f, 0xb9 => 0x2528, + 0xba => 0x2537, 0xbb => 0x253f, 0xbc => 0x251d, 0xbd => 0x2530, + 0xbe => 0x2525, 0xbf => 0x2538, 0xc0 => 0x2542, 0xc1 => 0x2512, + 0xc2 => 0x2511, 0xc3 => 0x251a, 0xc4 => 0x2519, 0xc5 => 0x2516, + 0xc6 => 0x2515, 0xc7 => 0x250e, 0xc8 => 0x250d, 0xc9 => 0x251e, + 0xca => 0x251f, 0xcb => 0x2521, 0xcc => 0x2522, 0xcd => 0x2526, + 0xce => 0x2527, 0xcf => 0x2529, 0xd0 => 0x252a, 0xd1 => 0x252d, + 0xd2 => 0x252e, 0xd3 => 0x2531, 0xd4 => 0x2532, 0xd5 => 0x2535, + 0xd6 => 0x2536, 0xd7 => 0x2539, 0xd8 => 0x253a, 0xd9 => 0x253d, + 0xda => 0x253e, 0xdb => 0x2540, 0xdc => 0x2541, 0xdd => 0x2543, + 0xde => 0x2544, 0xdf => 0x2545, 0xe0 => 0x2546, 0xe1 => 0x2547, + 0xe2 => 0x2548, 0xe3 => 0x2549, 0xe4 => 0x254a, 0xe5 => 0x2776, + 0xe6 => 0x2777, 0xe7 => 0x2778, 0xe8 => 0x2779, 0xe9 => 0x277a, + 0xea => 0x277b, 0xeb => 0x277c, 0xec => 0x277d, 0xed => 0x277e, + 0xee => 0x277f, 0xef => 0x24eb, 0xf0 => 0x24ec, 0xf1 => 0x24ed, + 0xf2 => 0x24ee, 0xf3 => 0x24ef, 0xf4 => 0x24f0, 0xf5 => 0x24f1, + 0xf6 => 0x24f2, 0xf7 => 0x24f3, 0xf8 => 0x24f4, 0xf9 => [0x3251,0xf87a], + 0xfa => [0x3252,0xf87a], 0xfb => [0x3253,0xf87a], 0xfc => [0x3254,0xf87a], + 0xfd => [0x3255,0xf87a], 0xfe => [0x3256,0xf87a], + }, + 0xa7 => { + 0x41 => [0x2642,0xf87f], 0x42 => 0x3012, 0x43 => 0x3036, + 0x44 => [0x25cb,0xf87f], 0x45 => [0x25b3,0xf87f], 0x46 => 0x25fb, + 0x47 => 0xf84c, 0x48 => [0x2394,0xf876], 0x49 => [0x25ad,0xf878], + 0x4a => 0x25ad, 0x4b => 0xf84d, 0x4c => 0xf84e, 0x4d => 0xf84f, + 0x4e => [0x25c7,0xf87f], 0x4f => [0x51f9,0xf87f], 0x50 => [0x51f8,0xf87f], + 0x51 => 0x2206, 0x52 => [0x2206,0xf87f], 0x53 => 0x221f, + 0x54 => [0x222a,0xf87f], 0x55 => 0x2225, 0x56 => 0x2226, + 0x57 => [0x2229,0xf87f], 0x58 => 0x2253, 0x59 => 0x2251, 0x5a => 0x2266, + 0x5b => 0x2267, 0x5c => 0x2213, 0x5d => 0x2295, 0x5e => 0x2296, + 0x5f => 0x2297, 0x60 => 0x2a38, 0x61 => 0x2314, 0x62 => [0x3d,0x20e5], + 0x63 => [0x2261,0x20e5], 0x64 => 0x2262, 0x65 => [0x3d,0x20d2], + 0x66 => 0x25b1, 0x67 => [0x2d,0x0308], 0x68 => 0x2222, 0x69 => 0x2250, + 0x6a => 0x03d5, 0x6b => 0x2ae8, 0x6c => 0x22a3, 0x6d => [0x22a5,0x0338], + 0x6e => [0x2261,0x20d2], 0x6f => 0x226e, 0x70 => 0x226f, 0x71 => 0x2285, + 0x72 => 0x2284, 0x73 => 0x2209, 0x74 => 0x220c, 0x75 => 0x22bb, + 0x76 => 0x22bc, 0x77 => 0x225a, 0x78 => 0x2306, 0x79 => [0x223d,0x0336], + 0x7a => [0x2314,0xf87f], 0x7b => 0x2a72, 0x7c => [0x88dc,0x20e4], + 0x7d => [0xf862,0xc8fc,0xc2dd,0xd68c,0xc0ac], + 0x81 => [0xf863,0xc8fc,0xc2dd,0xd68c,0xc0ac], 0x82 => 0x329e, + 0x83 => [0x329e,0xf87f], 0x84 => 0x203c, 0x85 => 0x2049, + 0x86 => [0x203c,0xf87f], 0x87 => 0x2047, 0x88 => [0x25c7,0xf87c], + 0x89 => [0x25c7,0xf879], 0x8a => [0x25c7,0xf87b], 0x8b => [0x25c6,0xf879], + 0x8c => [0x25a1,0xf87c], 0x8d => [0x25a1,0xf879], 0x8e => [0x25a1,0xf87b], + 0x8f => 0x2588, 0x90 => 0x25e6, 0x91 => [0x25cb,0xf879], + 0x92 => [0x25cb,0xf87b], 0x93 => [0x25cf,0xf879], 0x94 => 0x25bf, + 0x95 => 0x25b5, 0x96 => 0x25b9, 0x97 => 0x25c3, 0x98 => 0x2666, + 0x99 => 0x2981, 0x9a => 0x25fc, 0x9b => [0x25b4,0x20e4], 0x9c => 0x25ca, + 0x9d => 0x3231, 0x9e => 0x3239, 0x9f => 0x33cb, 0xa1 => 0x3395, + 0xa2 => 0x3396, 0xa3 => 0x3397, 0xa4 => 0x2113, 0xa5 => 0x3398, + 0xa6 => 0x33c4, 0xa7 => 0x33a3, 0xa8 => 0x33a4, 0xa9 => 0x33a5, + 0xaa => 0x33a6, 0xab => 0x3399, 0xac => 0x339a, 0xad => 0x339b, + 0xae => 0x339c, 0xaf => 0x339d, 0xb0 => 0x339e, 0xb1 => 0x339f, + 0xb2 => 0x33a0, 0xb3 => 0x33a1, 0xb4 => 0x33a2, 0xb5 => 0x33ca, + 0xb6 => 0x338d, 0xb7 => 0x338e, 0xb8 => 0x338f, 0xb9 => 0x33cf, + 0xba => 0x3388, 0xbb => 0x3389, 0xbc => 0x33c8, 0xbd => 0x33a7, + 0xbe => 0x33a8, 0xbf => 0x33b0, 0xc0 => 0x33b1, 0xc1 => 0x33b2, + 0xc2 => 0x33b3, 0xc3 => 0x33b4, 0xc4 => 0x33b5, 0xc5 => 0x33b6, + 0xc6 => 0x33b7, 0xc7 => 0x33b8, 0xc8 => 0x33b9, 0xc9 => 0x3380, + 0xca => 0x3381, 0xcb => 0x3382, 0xcc => 0x3383, 0xcd => 0x3384, + 0xce => 0x33ba, 0xcf => 0x33bb, 0xd0 => 0x33bc, 0xd1 => 0x33bd, + 0xd2 => 0x33be, 0xd3 => 0x33bf, 0xd4 => 0x3390, 0xd5 => 0x3391, + 0xd6 => 0x3392, 0xd7 => 0x3393, 0xd8 => 0x3394, 0xd9 => 0x2126, + 0xda => 0x33c0, 0xdb => 0x33c1, 0xdc => 0x338a, 0xdd => 0x338b, + 0xde => 0x338c, 0xdf => 0x33d6, 0xe0 => 0x33c5, 0xe1 => 0x33ad, + 0xe2 => 0x33ae, 0xe3 => 0x33af, 0xe4 => 0x33db, 0xe5 => 0x33a9, + 0xe6 => 0x33aa, 0xe7 => 0x33ab, 0xe8 => 0x33ac, 0xe9 => 0x33dd, + 0xea => 0x33d0, 0xeb => 0x33d3, 0xec => 0x33c3, 0xed => 0x33c9, + 0xee => 0x33dc, 0xef => 0x33c6, 0xf0 => 0x246f, 0xf1 => 0x2470, + 0xf2 => 0x2471, 0xf3 => 0x2472, 0xf4 => 0x2473, 0xf5 => 0x3251, + 0xf6 => 0x3252, 0xf7 => 0x3253, 0xf8 => 0x3254, 0xf9 => 0x3255, + 0xfa => 0x3256, 0xfb => 0x3257, 0xfc => 0x3258, 0xfd => 0x3259, + 0xfe => 0x325a, + }, + 0xa8 => { + 0x41 => [0x2192,0xf87b], 0x42 => [0x2190,0xf87b], 0x43 => [0x2191,0xf87b], + 0x44 => [0x2193,0xf87b], 0x45 => [0x2196,0xf87b], 0x46 => [0x2197,0xf87b], + 0x47 => [0x2198,0xf87b], 0x48 => [0x2199,0xf87b], 0x49 => 0x21d0, + 0x4a => 0x21cf, 0x4b => 0x21cd, 0x4c => [0x21d4,0xf87f], + 0x4d => [0x2192,0xf87c], 0x4e => [0x2190,0xf87c], 0x4f => [0x2191,0xf87c], + 0x50 => [0x2193,0xf87c], 0x51 => [0x2194,0xf87c], 0x52 => [0x2195,0xf87c], + 0x53 => [0x2190,0xf879], 0x54 => [0x2192,0xf879], 0x55 => [0x2191,0xf879], + 0x56 => [0x2193,0xf879], 0x57 => [0x21e6,0x20de], 0x58 => [0x21e8,0x20de], + 0x59 => [0x21e7,0x20de], 0x5a => [0x21e9,0x20de], 0x5b => [0x21e6,0x20dd], + 0x5c => 0x27b2, 0x5d => [0x21e7,0x20dd], 0x5e => [0x21e9,0x20dd], + 0x5f => [0x2190,0xf87f], 0x60 => 0x279c, 0x61 => [0x2191,0xf87f], + 0x62 => [0x2193,0xf87f], 0x63 => [0x2190,0xf875], 0x64 => [0x2192,0xf875], + 0x65 => [0x2191,0xf875], 0x66 => [0x2193,0xf875], 0x67 => 0xf846, + 0x68 => 0xf847, 0x69 => [0x2190,0xf871], 0x6a => 0x279b, + 0x6b => [0x2190,0xf872], 0x6c => [0x2192,0xf872], 0x6d => [0x2191,0xf872], + 0x6e => [0x2193,0xf872], 0x6f => 0x2962, 0x70 => 0x2964, 0x71 => 0x2963, + 0x72 => 0x2965, 0x73 => [0x21e6,0xf87a], 0x74 => 0x27a1, + 0x75 => [0x21e7,0xf87a], 0x76 => [0x21e9,0xf87a], 0x77 => [0x21e6,0xf87b], + 0x78 => 0x279e, 0x79 => [0x21e7,0xf87b], 0x7a => [0x21e9,0xf87b], + 0x7b => 0x21b2, 0x7c => 0x21b1, 0x7d => [0x21bb,0xf87b], 0x81 => 0x21b4, + 0x82 => 0x21b0, 0x83 => 0x21b3, 0x84 => [0x2939,0xf87f], + 0x85 => [0x2934,0xf87f], 0x86 => 0x2936, 0x87 => [0x21b1,0xf87f], + 0x88 => [0x21bb,0xf87f], 0x89 => 0x2935, 0x8a => [0x21b0,0xf87f], + 0x8b => 0x2937, 0x8c => 0x2939, 0x8d => 0x2934, 0x8e => [0x21e6,0xf879], + 0x8f => [0x21e8,0xf879], 0x90 => [0x21e7,0xf879], 0x91 => [0x21e9,0xf879], + 0x92 => 0x21bc, 0x93 => 0x21c0, 0x94 => 0xf841, 0x95 => [0x21d4,0xf879], + 0x96 => [0x21e8,0xf874], 0x97 => [0x21e6,0xf874], 0x98 => [0x21c0,0xf879], + 0x99 => [0x21bc,0xf879], 0x9a => [0x21d2,0xf87c], 0x9b => [0x21d0,0xf87c], + 0x9c => 0xf849, 0x9d => 0xf848, 0x9e => 0x21c4, 0x9f => 0x21c5, + 0xa1 => 0xc6, 0xa2 => 0xd0, 0xa3 => 0xaa, 0xa4 => 0x0126, 0xa6 => 0x0132, + 0xa8 => 0x013f, 0xa9 => 0x0141, 0xaa => 0xd8, 0xab => 0x0152, 0xac => 0xba, + 0xad => 0xde, 0xae => 0x0166, 0xaf => 0x014a, 0xb1 => 0x3260, + 0xb2 => 0x3261, 0xb3 => 0x3262, 0xb4 => 0x3263, 0xb5 => 0x3264, + 0xb6 => 0x3265, 0xb7 => 0x3266, 0xb8 => 0x3267, 0xb9 => 0x3268, + 0xba => 0x3269, 0xbb => 0x326a, 0xbc => 0x326b, 0xbd => 0x326c, + 0xbe => 0x326d, 0xbf => 0x326e, 0xc0 => 0x326f, 0xc1 => 0x3270, + 0xc2 => 0x3271, 0xc3 => 0x3272, 0xc4 => 0x3273, 0xc5 => 0x3274, + 0xc6 => 0x3275, 0xc7 => 0x3276, 0xc8 => 0x3277, 0xc9 => 0x3278, + 0xca => 0x3279, 0xcb => 0x327a, 0xcc => 0x327b, 0xcd => 0x24d0, + 0xce => 0x24d1, 0xcf => 0x24d2, 0xd0 => 0x24d3, 0xd1 => 0x24d4, + 0xd2 => 0x24d5, 0xd3 => 0x24d6, 0xd4 => 0x24d7, 0xd5 => 0x24d8, + 0xd6 => 0x24d9, 0xd7 => 0x24da, 0xd8 => 0x24db, 0xd9 => 0x24dc, + 0xda => 0x24dd, 0xdb => 0x24de, 0xdc => 0x24df, 0xdd => 0x24e0, + 0xde => 0x24e1, 0xdf => 0x24e2, 0xe0 => 0x24e3, 0xe1 => 0x24e4, + 0xe2 => 0x24e5, 0xe3 => 0x24e6, 0xe4 => 0x24e7, 0xe5 => 0x24e8, + 0xe6 => 0x24e9, 0xe7 => 0x2460, 0xe8 => 0x2461, 0xe9 => 0x2462, + 0xea => 0x2463, 0xeb => 0x2464, 0xec => 0x2465, 0xed => 0x2466, + 0xee => 0x2467, 0xef => 0x2468, 0xf0 => 0x2469, 0xf1 => 0x246a, + 0xf2 => 0x246b, 0xf3 => 0x246c, 0xf4 => 0x246d, 0xf5 => 0x246e, + 0xf6 => 0xbd, 0xf7 => 0x2153, 0xf8 => 0x2154, 0xf9 => 0xbc, 0xfa => 0xbe, + 0xfb => 0x215b, 0xfc => 0x215c, 0xfd => 0x215d, 0xfe => 0x215e, + }, + 0xa9 => { + 0x41 => [0xf860,0x41,0x2e], 0x42 => [0xf860,0x42,0x2e], + 0x43 => [0xf860,0x43,0x2e], 0x44 => [0xf860,0x44,0x2e], + 0x45 => [0xf860,0x45,0x2e], 0x46 => [0xf860,0x46,0x2e], + 0x47 => [0xf860,0x47,0x2e], 0x48 => [0xf860,0x48,0x2e], + 0x49 => [0xf860,0x49,0x2e], 0x4a => [0xf860,0x4a,0x2e], + 0x4b => [0xf860,0x4b,0x2e], 0x4c => [0xf860,0x4c,0x2e], + 0x4d => [0xf860,0x4d,0x2e], 0x4e => [0xf860,0x4e,0x2e], + 0x4f => [0xf860,0x4f,0x2e], 0x50 => [0xf860,0x50,0x2e], + 0x51 => [0xf860,0x51,0x2e], 0x52 => [0xf860,0x52,0x2e], + 0x53 => [0xf860,0x53,0x2e], 0x54 => [0xf860,0x54,0x2e], + 0x55 => [0xf860,0x55,0x2e], 0x56 => [0xf860,0x56,0x2e], + 0x57 => [0xf860,0x57,0x2e], 0x58 => [0xf860,0x58,0x2e], + 0x59 => [0xf860,0x59,0x2e], 0x5a => [0xf860,0x5a,0x2e], + 0x5b => [0xf860,0x61,0x2e], 0x5c => [0xf860,0x62,0x2e], + 0x5d => [0xf860,0x63,0x2e], 0x5e => [0xf860,0x64,0x2e], + 0x5f => [0xf860,0x65,0x2e], 0x60 => [0xf860,0x66,0x2e], + 0x61 => [0xf860,0x67,0x2e], 0x62 => [0xf860,0x68,0x2e], + 0x63 => [0xf860,0x69,0x2e], 0x64 => [0xf860,0x6a,0x2e], + 0x65 => [0xf860,0x6b,0x2e], 0x66 => [0xf860,0x6c,0x2e], + 0x67 => [0xf860,0x6d,0x2e], 0x68 => [0xf860,0x6e,0x2e], + 0x69 => [0xf860,0x6f,0x2e], 0x6a => [0xf860,0x70,0x2e], + 0x6b => [0xf860,0x71,0x2e], 0x6c => [0xf860,0x72,0x2e], + 0x6d => [0xf860,0x73,0x2e], 0x6e => [0xf860,0x74,0x2e], + 0x6f => [0xf860,0x75,0x2e], 0x70 => [0xf860,0x76,0x2e], + 0x71 => [0xf860,0x77,0x2e], 0x72 => [0xf860,0x78,0x2e], + 0x73 => [0xf860,0x79,0x2e], 0x74 => [0xf860,0x7a,0x2e], 0xa1 => 0xe6, + 0xa2 => 0x0111, 0xa3 => 0xf0, 0xa4 => 0x0127, 0xa5 => 0x0131, + 0xa6 => 0x0133, 0xa7 => 0x0138, 0xa8 => 0x0140, 0xa9 => 0x0142, + 0xaa => 0xf8, 0xab => 0x0153, 0xac => 0xdf, 0xad => 0xfe, 0xae => 0x0167, + 0xaf => 0x014b, 0xb0 => 0x0149, 0xb1 => 0x3200, 0xb2 => 0x3201, + 0xb3 => 0x3202, 0xb4 => 0x3203, 0xb5 => 0x3204, 0xb6 => 0x3205, + 0xb7 => 0x3206, 0xb8 => 0x3207, 0xb9 => 0x3208, 0xba => 0x3209, + 0xbb => 0x320a, 0xbc => 0x320b, 0xbd => 0x320c, 0xbe => 0x320d, + 0xbf => 0x320e, 0xc0 => 0x320f, 0xc1 => 0x3210, 0xc2 => 0x3211, + 0xc3 => 0x3212, 0xc4 => 0x3213, 0xc5 => 0x3214, 0xc6 => 0x3215, + 0xc7 => 0x3216, 0xc8 => 0x3217, 0xc9 => 0x3218, 0xca => 0x3219, + 0xcb => 0x321a, 0xcc => 0x321b, 0xcd => 0x249c, 0xce => 0x249d, + 0xcf => 0x249e, 0xd0 => 0x249f, 0xd1 => 0x24a0, 0xd2 => 0x24a1, + 0xd3 => 0x24a2, 0xd4 => 0x24a3, 0xd5 => 0x24a4, 0xd6 => 0x24a5, + 0xd7 => 0x24a6, 0xd8 => 0x24a7, 0xd9 => 0x24a8, 0xda => 0x24a9, + 0xdb => 0x24aa, 0xdc => 0x24ab, 0xdd => 0x24ac, 0xde => 0x24ad, + 0xdf => 0x24ae, 0xe0 => 0x24af, 0xe1 => 0x24b0, 0xe2 => 0x24b1, + 0xe3 => 0x24b2, 0xe4 => 0x24b3, 0xe5 => 0x24b4, 0xe6 => 0x24b5, + 0xe7 => 0x2474, 0xe8 => 0x2475, 0xe9 => 0x2476, 0xea => 0x2477, + 0xeb => 0x2478, 0xec => 0x2479, 0xed => 0x247a, 0xee => 0x247b, + 0xef => 0x247c, 0xf0 => 0x247d, 0xf1 => 0x247e, 0xf2 => 0x247f, + 0xf3 => 0x2480, 0xf4 => 0x2481, 0xf5 => 0x2482, 0xf6 => 0xb9, 0xf7 => 0xb2, + 0xf8 => 0xb3, 0xf9 => 0x2074, 0xfa => 0x207f, 0xfb => 0x2081, + 0xfc => 0x2082, 0xfd => 0x2083, 0xfe => 0x2084, + }, + 0xaa => { + 0x41 => [0xc6b4,0x20de], 0x42 => [0xb2f5,0x20de], 0x43 => [0xc8fc,0x20de], + 0x44 => [0xba85,0x20de], 0x45 => [0xb300,0x20de], 0x46 => [0xd615,0x20de], + 0x47 => [0xbd80,0x20de], 0x48 => [0xc804,0x20de], 0x49 => [0xc811,0x20de], + 0x4a => [0xc218,0x20de], 0x4b => [0xb3d9,0x20de], 0x4c => [0xbe44,0x20de], + 0x4d => [0xbc18,0x20de], 0x4e => [0xc790,0x20de], 0x4f => [0xd0c0,0x20de], + 0x50 => [0xac10,0x20de], 0x51 => [0xc57d,0x20de], 0x52 => [0xc778,0x20de], + 0x53 => [0xb73b,0x20de], 0x54 => [0x5370,0x20de], 0x55 => [0x8a3b,0x20de], + 0x56 => [0xc608,0x20de], 0x57 => [0x611f,0x20de], 0x58 => [0x51a0,0x20de], + 0x59 => [0x7b54,0x20de], 0x5a => [0x4ee3,0x20de], 0x5b => [0x982d,0x20de], + 0x5c => [0x52d5,0x20de], 0x5d => [0x540d,0x20de], 0x5e => [0x76ee,0x20de], + 0x5f => [0x53cd,0x20de], 0x60 => [0x88dc,0x20de], 0x61 => [0x672c,0x20de], + 0x62 => [0x526f,0x20de], 0x63 => [0x5e8f,0x20de], 0x64 => [0x9023,0x20de], + 0x65 => [0x5f71,0x20de], 0x66 => [0x4f8b,0x20de], 0x67 => [0x6e90,0x20de], + 0x68 => [0x5b50,0x20de], 0x69 => [0x524d,0x20de], 0x6a => [0x7bc0,0x20de], + 0x6b => [0x63a5,0x20de], 0x6c => [0x52a9,0x20de], 0x6d => [0x6307,0x20de], + 0x6e => [0x4ed6,0x20de], 0x6f => [0x6d3e,0x20de], 0x70 => [0x5f62,0x20de], + 0x71 => [0xc870,0x20de], 0x72 => [0xbb38,0x20de,0xf87a], + 0x73 => [0xb2f5,0x20de,0xf87a], 0x74 => [0xc8fc,0x20de,0xf87a], + 0x75 => [0xb73b,0x20de,0xf87a], 0x76 => [0x8a3b,0x20de,0xf87a], + 0x77 => [0xad50,0x20de,0xf87a], 0x78 => [0xc5ed,0x20de,0xf87a], + 0x79 => [0xc74c,0x20de,0xf87a], 0x7a => [0xc815,0x20de,0xf87a], + 0x7b => [0xd574,0x20de,0xf87a], 0x7c => [0xc608,0x20de,0xf87a], + 0x7d => [0xc874,0x20dd], 0x81 => [0xb77c,0x20dd], 0x82 => [0xb9c8,0x20dd], + 0x83 => [0xbc14,0x20dd], 0x84 => [0xc0ac,0x20dd], 0x85 => [0xc544,0x20dd], + 0x86 => [0xc790,0x20dd], 0x87 => [0xcc28,0x20dd], 0x88 => [0xce74,0x20dd], + 0x89 => [0xd0c0,0x20dd], 0x8a => [0xd30c,0x20dd], 0x8b => [0xb192,0x20dd], + 0x8c => [0xb0ae,0x20dd], 0x8d => [0xba85,0x20dd], 0x8e => [0xb300,0x20dd], + 0x8f => [0xd615,0x20dd], 0x90 => [0xbd80,0x20dd], 0x91 => [0xc804,0x20dd], + 0x92 => [0xc811,0x20dd], 0x93 => [0xc218,0x20dd], 0x94 => [0xb3d9,0x20dd], + 0x95 => [0xbe44,0x20dd], 0x96 => [0xac8c,0x20dd], 0x97 => [0xbc18,0x20dd], + 0x98 => [0xc18d,0x20dd], 0x99 => [0xc778,0x20dd], 0x9a => [0xbcf8,0x20dd], + 0x9b => [0xc57d,0x20dd], 0x9c => [0xc219,0x20dd], 0x9d => [0xc720,0x20dd], + 0x9e => [0xad00,0x20dd], 0x9f => [0x51a0,0x20dd], 0xa1 => 0x3041, + 0xa2 => 0x3042, 0xa3 => 0x3043, 0xa4 => 0x3044, 0xa5 => 0x3045, + 0xa6 => 0x3046, 0xa7 => 0x3047, 0xa8 => 0x3048, 0xa9 => 0x3049, + 0xaa => 0x304a, 0xab => 0x304b, 0xac => 0x304c, 0xad => 0x304d, + 0xae => 0x304e, 0xaf => 0x304f, 0xb0 => 0x3050, 0xb1 => 0x3051, + 0xb2 => 0x3052, 0xb3 => 0x3053, 0xb4 => 0x3054, 0xb5 => 0x3055, + 0xb6 => 0x3056, 0xb7 => 0x3057, 0xb8 => 0x3058, 0xb9 => 0x3059, + 0xba => 0x305a, 0xbb => 0x305b, 0xbc => 0x305c, 0xbd => 0x305d, + 0xbe => 0x305e, 0xbf => 0x305f, 0xc0 => 0x3060, 0xc1 => 0x3061, + 0xc2 => 0x3062, 0xc3 => 0x3063, 0xc4 => 0x3064, 0xc5 => 0x3065, + 0xc6 => 0x3066, 0xc7 => 0x3067, 0xc8 => 0x3068, 0xc9 => 0x3069, + 0xca => 0x306a, 0xcb => 0x306b, 0xcc => 0x306c, 0xcd => 0x306d, + 0xce => 0x306e, 0xcf => 0x306f, 0xd0 => 0x3070, 0xd1 => 0x3071, + 0xd2 => 0x3072, 0xd3 => 0x3073, 0xd4 => 0x3074, 0xd5 => 0x3075, + 0xd6 => 0x3076, 0xd7 => 0x3077, 0xd8 => 0x3078, 0xd9 => 0x3079, + 0xda => 0x307a, 0xdb => 0x307b, 0xdc => 0x307c, 0xdd => 0x307d, + 0xde => 0x307e, 0xdf => 0x307f, 0xe0 => 0x3080, 0xe1 => 0x3081, + 0xe2 => 0x3082, 0xe3 => 0x3083, 0xe4 => 0x3084, 0xe5 => 0x3085, + 0xe6 => 0x3086, 0xe7 => 0x3087, 0xe8 => 0x3088, 0xe9 => 0x3089, + 0xea => 0x308a, 0xeb => 0x308b, 0xec => 0x308c, 0xed => 0x308d, + 0xee => 0x308e, 0xef => 0x308f, 0xf0 => 0x3090, 0xf1 => 0x3091, + 0xf2 => 0x3092, 0xf3 => 0x3093, 0xf4 => 0x2483, 0xf5 => 0x2484, + 0xf6 => 0x2485, 0xf7 => 0x2486, 0xf8 => 0x2487, + 0xf9 => [0xf862,0x28,0x32,0x31,0x29], 0xfa => [0xf862,0x28,0x32,0x32,0x29], + 0xfb => [0xf862,0x28,0x32,0x33,0x29], 0xfc => [0xf862,0x28,0x32,0x34,0x29], + 0xfd => [0xf862,0x28,0x32,0x35,0x29], 0xfe => [0xf862,0x28,0x32,0x36,0x29], + }, + 0xab => { + 0x41 => [0xc870,0x20dd], 0x42 => [0xad6d,0x20dd], 0x43 => [0xac10,0x20dd], + 0x44 => [0x5370,0x20dd], 0x45 => [0x8863,0x20dd], 0x46 => [0x672b,0x20dd], + 0x47 => [0xac70,0x20dd], 0x48 => [0xb2f5,0x20dd], 0x49 => [0xbcc0,0x20dd], + 0x4a => [0xc0c1,0x20dd], 0x4b => [0xc13c,0x20dd], 0x4c => [0xc2e0,0x20dd], + 0x4d => [0xc5ec,0x20dd], 0x4e => [0xc608,0x20dd], 0x4f => [0xc6d0,0x20dd], + 0x50 => [0xc791,0x20dd], 0x51 => [0xc900,0x20dd], 0x52 => [0xd0b9,0x20dd], + 0x53 => [0xc678,0x20dd], 0x54 => [0xd65c,0x20dd], 0x55 => [0xac04,0x20dd], + 0x56 => [0xac19,0x20dd], 0x57 => [0xc2e4,0x20dd], 0x58 => [0x611f,0x20dd], + 0x59 => [0x6163,0x20dd], 0x5a => [0x4ee3,0x20dd], 0x5b => [0x52d5,0x20dd], + 0x5c => 0x3294, 0x5d => [0x53cd,0x20dd], 0x5e => [0x526f,0x20dd], + 0x5f => [0x81ea,0x20dd], 0x60 => [0x524d,0x20dd], 0x61 => [0x96fb,0x20dd], + 0x62 => [0x63a5,0x20dd], 0x63 => [0x52a9,0x20dd], 0x64 => [0x6ce8,0x20dd], + 0x65 => [0x53c3,0x20dd], 0x66 => [0x672c,0x20dd], 0x67 => [0x65b0,0x20dd], + 0x68 => [0x73fe,0x20dd], 0x69 => [0x5f62,0x20dd], 0x6a => [0x9593,0x20dd], + 0x6b => [0x570b,0x20dd], 0x6c => 0x32a5, 0x6d => [0x4ed6,0x20dd], + 0x6e => [0xbe60,0x20dd], 0x6f => [0xc2dc,0x20dd], 0x70 => [0xc785,0x20dd], + 0x71 => [0xc73c,0x20dd], 0x72 => [0xc74c,0x20dd], 0x73 => [0xc9c1,0x20dd], + 0x74 => [0xd45c,0x20dd], 0x75 => [0xac00,0x20dd], 0x76 => [0xb098,0x20dd], + 0x77 => [0xb2e4,0x20dd], 0x78 => [0xd558,0x20dd], + 0x79 => [0xb9c8,0x20dd,0xf87a], 0x7a => [0xbc14,0x20dd,0xf87a], + 0x7b => [0xc0ac,0x20dd,0xf87a], 0x7c => [0xc544,0x20dd,0xf87a], + 0x7d => [0xc790,0x20dd,0xf87a], 0x81 => [0xcc28,0x20dd,0xf87a], + 0x82 => [0xce74,0x20dd,0xf87a], 0x83 => [0xd0c0,0x20dd,0xf87a], + 0x84 => [0xd30c,0x20dd,0xf87a], 0x85 => [0xd558,0x20dd,0xf87a], + 0x86 => [0xbe44,0x20dd,0xf87a], 0x87 => [0xb2f5,0x20dd,0xf87a], + 0x88 => [0xbe60,0x20dd,0xf87a], 0x89 => [0xbcf8,0x20dd,0xf87a], + 0x8a => [0xb2e8,0x20dd,0xf87a], 0x8b => [0xc13c,0x20dd,0xf87a], + 0x8c => [0xc2dc,0x20dd,0xf87a], 0x8d => [0xc5ec,0x20dd,0xf87a], + 0x8e => [0xc608,0x20dd,0xf87a], 0x8f => [0xc73c,0x20dd,0xf87a], + 0x90 => [0xc74c,0x20dd,0xf87a], 0x91 => [0xc785,0x20dd,0xf87a], + 0x92 => [0xc81c,0x20dd,0xf87a], 0x93 => [0xc874,0x20dd,0xf87a], + 0x94 => [0xc900,0x20dd,0xf87a], 0x95 => [0xd45c,0x20dd,0xf87a], + 0x96 => [0xd574,0x20dd,0xf87a], 0x97 => [0xb290,0x20dd,0xf87a], + 0x98 => [0xb192,0x20dd,0xf87a], 0x99 => [0xb0ae,0x20dd,0xf87a], + 0x9a => [0xbc18,0x20dd,0xf87a], 0x9b => [0xac00,0x20dd,0xf87a], + 0x9c => [0xb098,0x20dd,0xf87a], 0x9d => [0xb2e4,0x20dd,0xf87a], + 0x9e => [0xb77c,0x20dd,0xf87a], 0x9f => [0xc678,0x20dd,0xf87a], + 0xa1 => 0x30a1, 0xa2 => 0x30a2, 0xa3 => 0x30a3, 0xa4 => 0x30a4, + 0xa5 => 0x30a5, 0xa6 => 0x30a6, 0xa7 => 0x30a7, 0xa8 => 0x30a8, + 0xa9 => 0x30a9, 0xaa => 0x30aa, 0xab => 0x30ab, 0xac => 0x30ac, + 0xad => 0x30ad, 0xae => 0x30ae, 0xaf => 0x30af, 0xb0 => 0x30b0, + 0xb1 => 0x30b1, 0xb2 => 0x30b2, 0xb3 => 0x30b3, 0xb4 => 0x30b4, + 0xb5 => 0x30b5, 0xb6 => 0x30b6, 0xb7 => 0x30b7, 0xb8 => 0x30b8, + 0xb9 => 0x30b9, 0xba => 0x30ba, 0xbb => 0x30bb, 0xbc => 0x30bc, + 0xbd => 0x30bd, 0xbe => 0x30be, 0xbf => 0x30bf, 0xc0 => 0x30c0, + 0xc1 => 0x30c1, 0xc2 => 0x30c2, 0xc3 => 0x30c3, 0xc4 => 0x30c4, + 0xc5 => 0x30c5, 0xc6 => 0x30c6, 0xc7 => 0x30c7, 0xc8 => 0x30c8, + 0xc9 => 0x30c9, 0xca => 0x30ca, 0xcb => 0x30cb, 0xcc => 0x30cc, + 0xcd => 0x30cd, 0xce => 0x30ce, 0xcf => 0x30cf, 0xd0 => 0x30d0, + 0xd1 => 0x30d1, 0xd2 => 0x30d2, 0xd3 => 0x30d3, 0xd4 => 0x30d4, + 0xd5 => 0x30d5, 0xd6 => 0x30d6, 0xd7 => 0x30d7, 0xd8 => 0x30d8, + 0xd9 => 0x30d9, 0xda => 0x30da, 0xdb => 0x30db, 0xdc => 0x30dc, + 0xdd => 0x30dd, 0xde => 0x30de, 0xdf => 0x30df, 0xe0 => 0x30e0, + 0xe1 => 0x30e1, 0xe2 => 0x30e2, 0xe3 => 0x30e3, 0xe4 => 0x30e4, + 0xe5 => 0x30e5, 0xe6 => 0x30e6, 0xe7 => 0x30e7, 0xe8 => 0x30e8, + 0xe9 => 0x30e9, 0xea => 0x30ea, 0xeb => 0x30eb, 0xec => 0x30ec, + 0xed => 0x30ed, 0xee => 0x30ee, 0xef => 0x30ef, 0xf0 => 0x30f0, + 0xf1 => 0x30f1, 0xf2 => 0x30f2, 0xf3 => 0x30f3, 0xf4 => 0x30f4, + 0xf5 => 0x30f5, 0xf6 => 0x30f6, 0xf7 => [0xf862,0x28,0x32,0x37,0x29], + 0xf8 => [0xf862,0x28,0x32,0x38,0x29], 0xf9 => [0xf862,0x28,0x32,0x39,0x29], + 0xfa => [0xf862,0x28,0x33,0x30,0x29], + }, + 0xac => { + 0x41 => 0x21f0, 0x42 => 0xf843, 0x43 => 0x27b5, 0x44 => [0x2964,0xf87f], + 0x45 => [0x2962,0xf87f], 0x46 => [0x21e8,0xf870], 0x47 => [0x21e6,0xf870], + 0x48 => 0x27a4, 0x49 => 0xf844, 0x4a => 0xf84b, 0x4b => 0xf84a, + 0x4c => [0x21c0,0xf87f], 0x4d => [0x21bc,0xf87f], 0x4e => [0x21e8,0xf87f], + 0x4f => [0x21e6,0xf87f], 0x50 => 0x21b6, 0x51 => 0x21b7, 0x52 => 0x219d, + 0x53 => 0x219c, 0x54 => 0xf842, 0x55 => [0x2190,0xf87a], + 0x56 => [0x2192,0xf87a], 0x57 => [0x2191,0xf87a], 0x58 => [0x2193,0xf87a], + 0x59 => [0x21e6,0xf87c], 0x5a => [0x21e8,0xf87c], 0x5b => [0x21e7,0xf87c], + 0x5c => [0x21e9,0xf87c], 0x5d => [0x2190,0xf873], 0x5e => 0x2794, + 0x5f => 0xf845, 0x60 => [0x2191,0xf873], 0x61 => [0x2193,0xf873], + 0x62 => [0x2190,0xf878], 0x63 => [0x2192,0xf878], 0x64 => [0x2191,0xf878], + 0x65 => [0x2193,0xf878], 0x66 => [0x2190,0xf874], 0x67 => [0x2192,0xf874], + 0x68 => [0x2191,0xf874], 0x69 => [0x2193,0xf874], 0x6a => 0x21e0, + 0x6b => 0x21e2, 0x6c => 0x21e1, 0x6d => 0x21e3, 0x6e => [0x21e6,0xf875], + 0x6f => [0x21e8,0xf875], 0x70 => [0x21e7,0xf875], 0x71 => [0x21e9,0xf875], + 0x72 => 0x21e6, 0x73 => 0x21e8, 0x74 => 0x21e7, 0x75 => 0x21e9, + 0x76 => [0x2936,0xf87a], 0x77 => [0x21b1,0xf87a], 0x78 => [0x21bb,0xf87a], + 0x79 => [0x2935,0xf87a], 0x7a => [0x21b0,0xf87a], 0x7b => [0x2937,0xf87a], + 0x7c => [0x2939,0xf87a], 0x7d => [0x2934,0xf87a], 0x81 => [0x2936,0xf87c], + 0x82 => [0x21b1,0xf87c], 0x83 => [0x21bb,0xf87c], 0x84 => [0x2935,0xf87c], + 0x85 => [0x21b0,0xf87c], 0x86 => [0x2937,0xf87c], 0x87 => [0x2939,0xf87c], + 0x88 => [0x2934,0xf87c], 0x89 => [0x2190,0xf870], 0x8a => [0x2192,0xf870], + 0x8b => [0x2191,0xf870], 0x8c => [0x2193,0xf870], 0x8d => 0x261d, + 0x8e => 0x261f, 0x8f => [0x261d,0xf87f], 0x90 => [0x261f,0xf87f], + 0x91 => [0xb2e8,0x20dd], 0x92 => [0xcc38,0x20dd], 0x93 => [0xc18c,0x20dd], + 0x94 => [0xc911,0x20dd], 0x95 => [0xc77c,0x20dd], 0x96 => [0xc774,0x20dd], + 0x97 => [0xd734,0x20dd], 0xa1 => 0x0410, 0xa2 => 0x0411, 0xa3 => 0x0412, + 0xa4 => 0x0413, 0xa5 => 0x0414, 0xa6 => 0x0415, 0xa7 => 0x0401, + 0xa8 => 0x0416, 0xa9 => 0x0417, 0xaa => 0x0418, 0xab => 0x0419, + 0xac => 0x041a, 0xad => 0x041b, 0xae => 0x041c, 0xaf => 0x041d, + 0xb0 => 0x041e, 0xb1 => 0x041f, 0xb2 => 0x0420, 0xb3 => 0x0421, + 0xb4 => 0x0422, 0xb5 => 0x0423, 0xb6 => 0x0424, 0xb7 => 0x0425, + 0xb8 => 0x0426, 0xb9 => 0x0427, 0xba => 0x0428, 0xbb => 0x0429, + 0xbc => 0x042a, 0xbd => 0x042b, 0xbe => 0x042c, 0xbf => 0x042d, + 0xc0 => 0x042e, 0xc1 => 0x042f, 0xc2 => [0x31,0x20de,0xf875], + 0xc3 => [0x32,0x20de,0xf875], 0xc4 => [0x33,0x20de,0xf875], + 0xc5 => [0x34,0x20de,0xf875], 0xc6 => [0x35,0x20de,0xf875], + 0xc7 => [0x36,0x20de,0xf875], 0xc8 => [0x37,0x20de,0xf875], + 0xc9 => [0x38,0x20de,0xf875], 0xca => [0x39,0x20de,0xf875], + 0xcb => [0xf866,0x5b,0x31,0x30,0x5d], 0xcc => [0xf866,0x5b,0x31,0x31,0x5d], + 0xcd => [0xf866,0x5b,0x31,0x32,0x5d], 0xce => [0xf866,0x5b,0x31,0x33,0x5d], + 0xcf => [0xf866,0x5b,0x31,0x34,0x5d], 0xd0 => [0xf866,0x5b,0x31,0x35,0x5d], + 0xd1 => 0x0430, 0xd2 => 0x0431, 0xd3 => 0x0432, 0xd4 => 0x0433, + 0xd5 => 0x0434, 0xd6 => 0x0435, 0xd7 => 0x0451, 0xd8 => 0x0436, + 0xd9 => 0x0437, 0xda => 0x0438, 0xdb => 0x0439, 0xdc => 0x043a, + 0xdd => 0x043b, 0xde => 0x043c, 0xdf => 0x043d, 0xe0 => 0x043e, + 0xe1 => 0x043f, 0xe2 => 0x0440, 0xe3 => 0x0441, 0xe4 => 0x0442, + 0xe5 => 0x0443, 0xe6 => 0x0444, 0xe7 => 0x0445, 0xe8 => 0x0446, + 0xe9 => 0x0447, 0xea => 0x0448, 0xeb => 0x0449, 0xec => 0x044a, + 0xed => 0x044b, 0xee => 0x044c, 0xef => 0x044d, 0xf0 => 0x044e, + 0xf1 => 0x044f, 0xf2 => [0xf866,0x5b,0x31,0x36,0x5d], + 0xf3 => [0xf866,0x5b,0x31,0x37,0x5d], 0xf4 => [0xf866,0x5b,0x31,0x38,0x5d], + 0xf5 => [0xf866,0x5b,0x31,0x39,0x5d], 0xf6 => [0xf866,0x5b,0x32,0x30,0x5d], + }, + 0xad => { + 0x41 => [0x4e00,0x20de,0xf87a], 0x42 => [0x4e8c,0x20de,0xf87a], + 0x43 => [0x4e09,0x20de,0xf87a], 0x44 => [0x56db,0x20de,0xf87a], + 0x45 => [0x4e94,0x20de,0xf87a], 0x46 => [0x516d,0x20de,0xf87a], + 0x47 => [0x4e03,0x20de,0xf87a], 0x48 => [0x516b,0x20de,0xf87a], + 0x49 => [0x4e5d,0x20de,0xf87a], 0x4a => [0x5341,0x20de,0xf87a], + 0x4b => [0xf863,0x5b,0x5341,0x4e00,0x5d], + 0x4c => [0xf863,0x5b,0x5341,0x4e8c,0x5d], + 0x4d => [0xf863,0x5b,0x5341,0x4e09,0x5d], + 0x4e => [0xf863,0x5b,0x5341,0x56db,0x5d], + 0x4f => [0xf863,0x5b,0x5341,0x4e94,0x5d], + 0x50 => [0xf863,0x5b,0x5341,0x516d,0x5d], + 0x51 => [0xf863,0x5b,0x5341,0x4e03,0x5d], + 0x52 => [0xf863,0x5b,0x5341,0x516b,0x5d], + 0x53 => [0xf863,0x5b,0x5341,0x4e5d,0x5d], + 0x54 => [0xf863,0x5b,0x4e8c,0x5341,0x5d], 0x55 => [0x4e00,0x20de], + 0x56 => [0x4e8c,0x20de], 0x57 => [0x4e09,0x20de], 0x58 => [0x56db,0x20de], + 0x59 => [0x4e94,0x20de], 0x5a => [0x516d,0x20de], 0x5b => [0x4e03,0x20de], + 0x5c => [0x516b,0x20de], 0x5d => [0x4e5d,0x20de], 0x5e => [0x5341,0x20de], + 0x5f => [0xf862,0x5b,0x5341,0x4e00,0x5d], + 0x60 => [0xf862,0x5b,0x5341,0x4e8c,0x5d], + 0x61 => [0xf862,0x5b,0x5341,0x4e09,0x5d], + 0x62 => [0xf862,0x5b,0x5341,0x56db,0x5d], + 0x63 => [0xf862,0x5b,0x5341,0x4e94,0x5d], + 0x64 => [0xf862,0x5b,0x5341,0x516d,0x5d], + 0x65 => [0xf862,0x5b,0x5341,0x4e03,0x5d], + 0x66 => [0xf862,0x5b,0x5341,0x516b,0x5d], + 0x67 => [0xf862,0x5b,0x5341,0x4e5d,0x5d], + 0x68 => [0xf862,0x5b,0x4e8c,0x5341,0x5d], 0x69 => [0x65e5,0x20de], + 0x6a => [0x6708,0x20de], 0x6b => [0x706b,0x20de], 0x6c => [0x6c34,0x20de], + 0x6d => [0x6728,0x20de], 0x6e => [0x91d1,0x20de], 0x6f => [0x571f,0x20de], + 0x70 => 0x3290, 0x71 => 0x328a, 0x72 => 0x328b, 0x73 => 0x328c, + 0x74 => 0x328d, 0x75 => 0x328e, 0x76 => 0x328f, + 0x77 => [0x65e5,0x20de,0xf87c], 0x78 => [0x6708,0x20de,0xf87c], + 0x79 => [0x706b,0x20de,0xf87c], 0x7a => [0x6c34,0x20de,0xf87c], + 0x7b => [0x6728,0x20de,0xf87c], 0x7c => [0x91d1,0x20de,0xf87c], + 0x7d => [0x571f,0x20de,0xf87c], 0xa1 => [0x300c,0xf879], + 0xa2 => [0x300d,0xf879], 0xa3 => [0x300e,0xf879], 0xa4 => [0x300f,0xf879], + 0xa5 => [0x21e8,0xf878], 0xa6 => [0x21e6,0xf878], 0xa7 => [0x21e7,0xf878], + 0xa8 => [0x21e9,0xf878], 0xa9 => 0x301e, 0xaa => 0x301f, 0xab => 0x2036, + 0xac => [0x2033,0xf873], 0xad => 0x2035, 0xae => [0x2032,0xf873], + 0xaf => [0x21e7,0xf87f], 0xb0 => [0x21,0xf87f], + }, + 0xb0 => { + 0xa1 => 0xac00, 0xa2 => 0xac01, 0xa3 => 0xac04, 0xa4 => 0xac07, + 0xa5 => 0xac08, 0xa6 => 0xac09, 0xa7 => 0xac0a, 0xa8 => 0xac10, + 0xa9 => 0xac11, 0xaa => 0xac12, 0xab => 0xac13, 0xac => 0xac14, + 0xad => 0xac15, 0xae => 0xac16, 0xaf => 0xac17, 0xb0 => 0xac19, + 0xb1 => 0xac1a, 0xb2 => 0xac1b, 0xb3 => 0xac1c, 0xb4 => 0xac1d, + 0xb5 => 0xac20, 0xb6 => 0xac24, 0xb7 => 0xac2c, 0xb8 => 0xac2d, + 0xb9 => 0xac2f, 0xba => 0xac30, 0xbb => 0xac31, 0xbc => 0xac38, + 0xbd => 0xac39, 0xbe => 0xac3c, 0xbf => 0xac40, 0xc0 => 0xac4b, + 0xc1 => 0xac4d, 0xc2 => 0xac54, 0xc3 => 0xac58, 0xc4 => 0xac5c, + 0xc5 => 0xac70, 0xc6 => 0xac71, 0xc7 => 0xac74, 0xc8 => 0xac77, + 0xc9 => 0xac78, 0xca => 0xac7a, 0xcb => 0xac80, 0xcc => 0xac81, + 0xcd => 0xac83, 0xce => 0xac84, 0xcf => 0xac85, 0xd0 => 0xac86, + 0xd1 => 0xac89, 0xd2 => 0xac8a, 0xd3 => 0xac8b, 0xd4 => 0xac8c, + 0xd5 => 0xac90, 0xd6 => 0xac94, 0xd7 => 0xac9c, 0xd8 => 0xac9d, + 0xd9 => 0xac9f, 0xda => 0xaca0, 0xdb => 0xaca1, 0xdc => 0xaca8, + 0xdd => 0xaca9, 0xde => 0xacaa, 0xdf => 0xacac, 0xe0 => 0xacaf, + 0xe1 => 0xacb0, 0xe2 => 0xacb8, 0xe3 => 0xacb9, 0xe4 => 0xacbb, + 0xe5 => 0xacbc, 0xe6 => 0xacbd, 0xe7 => 0xacc1, 0xe8 => 0xacc4, + 0xe9 => 0xacc8, 0xea => 0xaccc, 0xeb => 0xacd5, 0xec => 0xacd7, + 0xed => 0xace0, 0xee => 0xace1, 0xef => 0xace4, 0xf0 => 0xace7, + 0xf1 => 0xace8, 0xf2 => 0xacea, 0xf3 => 0xacec, 0xf4 => 0xacef, + 0xf5 => 0xacf0, 0xf6 => 0xacf1, 0xf7 => 0xacf3, 0xf8 => 0xacf5, + 0xf9 => 0xacf6, 0xfa => 0xacfc, 0xfb => 0xacfd, 0xfc => 0xad00, + 0xfd => 0xad04, 0xfe => 0xad06, + }, + 0xb1 => { + 0xa1 => 0xad0c, 0xa2 => 0xad0d, 0xa3 => 0xad0f, 0xa4 => 0xad11, + 0xa5 => 0xad18, 0xa6 => 0xad1c, 0xa7 => 0xad20, 0xa8 => 0xad29, + 0xa9 => 0xad2c, 0xaa => 0xad2d, 0xab => 0xad34, 0xac => 0xad35, + 0xad => 0xad38, 0xae => 0xad3c, 0xaf => 0xad44, 0xb0 => 0xad45, + 0xb1 => 0xad47, 0xb2 => 0xad49, 0xb3 => 0xad50, 0xb4 => 0xad54, + 0xb5 => 0xad58, 0xb6 => 0xad61, 0xb7 => 0xad63, 0xb8 => 0xad6c, + 0xb9 => 0xad6d, 0xba => 0xad70, 0xbb => 0xad73, 0xbc => 0xad74, + 0xbd => 0xad75, 0xbe => 0xad76, 0xbf => 0xad7b, 0xc0 => 0xad7c, + 0xc1 => 0xad7d, 0xc2 => 0xad7f, 0xc3 => 0xad81, 0xc4 => 0xad82, + 0xc5 => 0xad88, 0xc6 => 0xad89, 0xc7 => 0xad8c, 0xc8 => 0xad90, + 0xc9 => 0xad9c, 0xca => 0xad9d, 0xcb => 0xada4, 0xcc => 0xadb7, + 0xcd => 0xadc0, 0xce => 0xadc1, 0xcf => 0xadc4, 0xd0 => 0xadc8, + 0xd1 => 0xadd0, 0xd2 => 0xadd1, 0xd3 => 0xadd3, 0xd4 => 0xaddc, + 0xd5 => 0xade0, 0xd6 => 0xade4, 0xd7 => 0xadf8, 0xd8 => 0xadf9, + 0xd9 => 0xadfc, 0xda => 0xadff, 0xdb => 0xae00, 0xdc => 0xae01, + 0xdd => 0xae08, 0xde => 0xae09, 0xdf => 0xae0b, 0xe0 => 0xae0d, + 0xe1 => 0xae14, 0xe2 => 0xae30, 0xe3 => 0xae31, 0xe4 => 0xae34, + 0xe5 => 0xae37, 0xe6 => 0xae38, 0xe7 => 0xae3a, 0xe8 => 0xae40, + 0xe9 => 0xae41, 0xea => 0xae43, 0xeb => 0xae45, 0xec => 0xae46, + 0xed => 0xae4a, 0xee => 0xae4c, 0xef => 0xae4d, 0xf0 => 0xae4e, + 0xf1 => 0xae50, 0xf2 => 0xae54, 0xf3 => 0xae56, 0xf4 => 0xae5c, + 0xf5 => 0xae5d, 0xf6 => 0xae5f, 0xf7 => 0xae60, 0xf8 => 0xae61, + 0xf9 => 0xae65, 0xfa => 0xae68, 0xfb => 0xae69, 0xfc => 0xae6c, + 0xfd => 0xae70, 0xfe => 0xae78, + }, + 0xb2 => { + 0xa1 => 0xae79, 0xa2 => 0xae7b, 0xa3 => 0xae7c, 0xa4 => 0xae7d, + 0xa5 => 0xae84, 0xa6 => 0xae85, 0xa7 => 0xae8c, 0xa8 => 0xaebc, + 0xa9 => 0xaebd, 0xaa => 0xaebe, 0xab => 0xaec0, 0xac => 0xaec4, + 0xad => 0xaecc, 0xae => 0xaecd, 0xaf => 0xaecf, 0xb0 => 0xaed0, + 0xb1 => 0xaed1, 0xb2 => 0xaed8, 0xb3 => 0xaed9, 0xb4 => 0xaedc, + 0xb5 => 0xaee8, 0xb6 => 0xaeeb, 0xb7 => 0xaeed, 0xb8 => 0xaef4, + 0xb9 => 0xaef8, 0xba => 0xaefc, 0xbb => 0xaf07, 0xbc => 0xaf08, + 0xbd => 0xaf0d, 0xbe => 0xaf10, 0xbf => 0xaf2c, 0xc0 => 0xaf2d, + 0xc1 => 0xaf30, 0xc2 => 0xaf32, 0xc3 => 0xaf34, 0xc4 => 0xaf3c, + 0xc5 => 0xaf3d, 0xc6 => 0xaf3f, 0xc7 => 0xaf41, 0xc8 => 0xaf42, + 0xc9 => 0xaf43, 0xca => 0xaf48, 0xcb => 0xaf49, 0xcc => 0xaf50, + 0xcd => 0xaf5c, 0xce => 0xaf5d, 0xcf => 0xaf64, 0xd0 => 0xaf65, + 0xd1 => 0xaf79, 0xd2 => 0xaf80, 0xd3 => 0xaf84, 0xd4 => 0xaf88, + 0xd5 => 0xaf90, 0xd6 => 0xaf91, 0xd7 => 0xaf95, 0xd8 => 0xaf9c, + 0xd9 => 0xafb8, 0xda => 0xafb9, 0xdb => 0xafbc, 0xdc => 0xafc0, + 0xdd => 0xafc7, 0xde => 0xafc8, 0xdf => 0xafc9, 0xe0 => 0xafcb, + 0xe1 => 0xafcd, 0xe2 => 0xafce, 0xe3 => 0xafd4, 0xe4 => 0xafdc, + 0xe5 => 0xafe8, 0xe6 => 0xafe9, 0xe7 => 0xaff0, 0xe8 => 0xaff1, + 0xe9 => 0xaff4, 0xea => 0xaff8, 0xeb => 0xb000, 0xec => 0xb001, + 0xed => 0xb004, 0xee => 0xb00c, 0xef => 0xb010, 0xf0 => 0xb014, + 0xf1 => 0xb01c, 0xf2 => 0xb01d, 0xf3 => 0xb028, 0xf4 => 0xb044, + 0xf5 => 0xb045, 0xf6 => 0xb048, 0xf7 => 0xb04a, 0xf8 => 0xb04c, + 0xf9 => 0xb04e, 0xfa => 0xb053, 0xfb => 0xb054, 0xfc => 0xb055, + 0xfd => 0xb057, 0xfe => 0xb059, + }, + 0xb3 => { + 0xa1 => 0xb05d, 0xa2 => 0xb07c, 0xa3 => 0xb07d, 0xa4 => 0xb080, + 0xa5 => 0xb084, 0xa6 => 0xb08c, 0xa7 => 0xb08d, 0xa8 => 0xb08f, + 0xa9 => 0xb091, 0xaa => 0xb098, 0xab => 0xb099, 0xac => 0xb09a, + 0xad => 0xb09c, 0xae => 0xb09f, 0xaf => 0xb0a0, 0xb0 => 0xb0a1, + 0xb1 => 0xb0a2, 0xb2 => 0xb0a8, 0xb3 => 0xb0a9, 0xb4 => 0xb0ab, + 0xb5 => 0xb0ac, 0xb6 => 0xb0ad, 0xb7 => 0xb0ae, 0xb8 => 0xb0af, + 0xb9 => 0xb0b1, 0xba => 0xb0b3, 0xbb => 0xb0b4, 0xbc => 0xb0b5, + 0xbd => 0xb0b8, 0xbe => 0xb0bc, 0xbf => 0xb0c4, 0xc0 => 0xb0c5, + 0xc1 => 0xb0c7, 0xc2 => 0xb0c8, 0xc3 => 0xb0c9, 0xc4 => 0xb0d0, + 0xc5 => 0xb0d1, 0xc6 => 0xb0d4, 0xc7 => 0xb0d8, 0xc8 => 0xb0e0, + 0xc9 => 0xb0e5, 0xca => 0xb108, 0xcb => 0xb109, 0xcc => 0xb10b, + 0xcd => 0xb10c, 0xce => 0xb110, 0xcf => 0xb112, 0xd0 => 0xb113, + 0xd1 => 0xb118, 0xd2 => 0xb119, 0xd3 => 0xb11b, 0xd4 => 0xb11c, + 0xd5 => 0xb11d, 0xd6 => 0xb123, 0xd7 => 0xb124, 0xd8 => 0xb125, + 0xd9 => 0xb128, 0xda => 0xb12c, 0xdb => 0xb134, 0xdc => 0xb135, + 0xdd => 0xb137, 0xde => 0xb138, 0xdf => 0xb139, 0xe0 => 0xb140, + 0xe1 => 0xb141, 0xe2 => 0xb144, 0xe3 => 0xb148, 0xe4 => 0xb150, + 0xe5 => 0xb151, 0xe6 => 0xb154, 0xe7 => 0xb155, 0xe8 => 0xb158, + 0xe9 => 0xb15c, 0xea => 0xb160, 0xeb => 0xb178, 0xec => 0xb179, + 0xed => 0xb17c, 0xee => 0xb180, 0xef => 0xb182, 0xf0 => 0xb188, + 0xf1 => 0xb189, 0xf2 => 0xb18b, 0xf3 => 0xb18d, 0xf4 => 0xb192, + 0xf5 => 0xb193, 0xf6 => 0xb194, 0xf7 => 0xb198, 0xf8 => 0xb19c, + 0xf9 => 0xb1a8, 0xfa => 0xb1cc, 0xfb => 0xb1d0, 0xfc => 0xb1d4, + 0xfd => 0xb1dc, 0xfe => 0xb1dd, + }, + 0xb4 => { + 0xa1 => 0xb1df, 0xa2 => 0xb1e8, 0xa3 => 0xb1e9, 0xa4 => 0xb1ec, + 0xa5 => 0xb1f0, 0xa6 => 0xb1f9, 0xa7 => 0xb1fb, 0xa8 => 0xb1fd, + 0xa9 => 0xb204, 0xaa => 0xb205, 0xab => 0xb208, 0xac => 0xb20b, + 0xad => 0xb20c, 0xae => 0xb214, 0xaf => 0xb215, 0xb0 => 0xb217, + 0xb1 => 0xb219, 0xb2 => 0xb220, 0xb3 => 0xb234, 0xb4 => 0xb23c, + 0xb5 => 0xb258, 0xb6 => 0xb25c, 0xb7 => 0xb260, 0xb8 => 0xb268, + 0xb9 => 0xb269, 0xba => 0xb274, 0xbb => 0xb275, 0xbc => 0xb27c, + 0xbd => 0xb284, 0xbe => 0xb285, 0xbf => 0xb289, 0xc0 => 0xb290, + 0xc1 => 0xb291, 0xc2 => 0xb294, 0xc3 => 0xb298, 0xc4 => 0xb299, + 0xc5 => 0xb29a, 0xc6 => 0xb2a0, 0xc7 => 0xb2a1, 0xc8 => 0xb2a3, + 0xc9 => 0xb2a5, 0xca => 0xb2a6, 0xcb => 0xb2aa, 0xcc => 0xb2ac, + 0xcd => 0xb2b0, 0xce => 0xb2b4, 0xcf => 0xb2c8, 0xd0 => 0xb2c9, + 0xd1 => 0xb2cc, 0xd2 => 0xb2d0, 0xd3 => 0xb2d2, 0xd4 => 0xb2d8, + 0xd5 => 0xb2d9, 0xd6 => 0xb2db, 0xd7 => 0xb2dd, 0xd8 => 0xb2e2, + 0xd9 => 0xb2e4, 0xda => 0xb2e5, 0xdb => 0xb2e6, 0xdc => 0xb2e8, + 0xdd => 0xb2eb, 0xde => 0xb2ec, 0xdf => 0xb2ed, 0xe0 => 0xb2ee, + 0xe1 => 0xb2ef, 0xe2 => 0xb2f3, 0xe3 => 0xb2f4, 0xe4 => 0xb2f5, + 0xe5 => 0xb2f7, 0xe6 => 0xb2f8, 0xe7 => 0xb2f9, 0xe8 => 0xb2fa, + 0xe9 => 0xb2fb, 0xea => 0xb2ff, 0xeb => 0xb300, 0xec => 0xb301, + 0xed => 0xb304, 0xee => 0xb308, 0xef => 0xb310, 0xf0 => 0xb311, + 0xf1 => 0xb313, 0xf2 => 0xb314, 0xf3 => 0xb315, 0xf4 => 0xb31c, + 0xf5 => 0xb354, 0xf6 => 0xb355, 0xf7 => 0xb356, 0xf8 => 0xb358, + 0xf9 => 0xb35b, 0xfa => 0xb35c, 0xfb => 0xb35e, 0xfc => 0xb35f, + 0xfd => 0xb364, 0xfe => 0xb365, + }, + 0xb5 => { + 0xa1 => 0xb367, 0xa2 => 0xb369, 0xa3 => 0xb36b, 0xa4 => 0xb36e, + 0xa5 => 0xb370, 0xa6 => 0xb371, 0xa7 => 0xb374, 0xa8 => 0xb378, + 0xa9 => 0xb380, 0xaa => 0xb381, 0xab => 0xb383, 0xac => 0xb384, + 0xad => 0xb385, 0xae => 0xb38c, 0xaf => 0xb390, 0xb0 => 0xb394, + 0xb1 => 0xb3a0, 0xb2 => 0xb3a1, 0xb3 => 0xb3a8, 0xb4 => 0xb3ac, + 0xb5 => 0xb3c4, 0xb6 => 0xb3c5, 0xb7 => 0xb3c8, 0xb8 => 0xb3cb, + 0xb9 => 0xb3cc, 0xba => 0xb3ce, 0xbb => 0xb3d0, 0xbc => 0xb3d4, + 0xbd => 0xb3d5, 0xbe => 0xb3d7, 0xbf => 0xb3d9, 0xc0 => 0xb3db, + 0xc1 => 0xb3dd, 0xc2 => 0xb3e0, 0xc3 => 0xb3e4, 0xc4 => 0xb3e8, + 0xc5 => 0xb3fc, 0xc6 => 0xb410, 0xc7 => 0xb418, 0xc8 => 0xb41c, + 0xc9 => 0xb420, 0xca => 0xb428, 0xcb => 0xb429, 0xcc => 0xb42b, + 0xcd => 0xb434, 0xce => 0xb450, 0xcf => 0xb451, 0xd0 => 0xb454, + 0xd1 => 0xb458, 0xd2 => 0xb460, 0xd3 => 0xb461, 0xd4 => 0xb463, + 0xd5 => 0xb465, 0xd6 => 0xb46c, 0xd7 => 0xb480, 0xd8 => 0xb488, + 0xd9 => 0xb49d, 0xda => 0xb4a4, 0xdb => 0xb4a8, 0xdc => 0xb4ac, + 0xdd => 0xb4b5, 0xde => 0xb4b7, 0xdf => 0xb4b9, 0xe0 => 0xb4c0, + 0xe1 => 0xb4c4, 0xe2 => 0xb4c8, 0xe3 => 0xb4d0, 0xe4 => 0xb4d5, + 0xe5 => 0xb4dc, 0xe6 => 0xb4dd, 0xe7 => 0xb4e0, 0xe8 => 0xb4e3, + 0xe9 => 0xb4e4, 0xea => 0xb4e6, 0xeb => 0xb4ec, 0xec => 0xb4ed, + 0xed => 0xb4ef, 0xee => 0xb4f1, 0xef => 0xb4f8, 0xf0 => 0xb514, + 0xf1 => 0xb515, 0xf2 => 0xb518, 0xf3 => 0xb51b, 0xf4 => 0xb51c, + 0xf5 => 0xb524, 0xf6 => 0xb525, 0xf7 => 0xb527, 0xf8 => 0xb528, + 0xf9 => 0xb529, 0xfa => 0xb52a, 0xfb => 0xb530, 0xfc => 0xb531, + 0xfd => 0xb534, 0xfe => 0xb538, + }, + 0xb6 => { + 0xa1 => 0xb540, 0xa2 => 0xb541, 0xa3 => 0xb543, 0xa4 => 0xb544, + 0xa5 => 0xb545, 0xa6 => 0xb54b, 0xa7 => 0xb54c, 0xa8 => 0xb54d, + 0xa9 => 0xb550, 0xaa => 0xb554, 0xab => 0xb55c, 0xac => 0xb55d, + 0xad => 0xb55f, 0xae => 0xb560, 0xaf => 0xb561, 0xb0 => 0xb5a0, + 0xb1 => 0xb5a1, 0xb2 => 0xb5a4, 0xb3 => 0xb5a8, 0xb4 => 0xb5aa, + 0xb5 => 0xb5ab, 0xb6 => 0xb5b0, 0xb7 => 0xb5b1, 0xb8 => 0xb5b3, + 0xb9 => 0xb5b4, 0xba => 0xb5b5, 0xbb => 0xb5bb, 0xbc => 0xb5bc, + 0xbd => 0xb5bd, 0xbe => 0xb5c0, 0xbf => 0xb5c4, 0xc0 => 0xb5cc, + 0xc1 => 0xb5cd, 0xc2 => 0xb5cf, 0xc3 => 0xb5d0, 0xc4 => 0xb5d1, + 0xc5 => 0xb5d8, 0xc6 => 0xb5ec, 0xc7 => 0xb610, 0xc8 => 0xb611, + 0xc9 => 0xb614, 0xca => 0xb618, 0xcb => 0xb625, 0xcc => 0xb62c, + 0xcd => 0xb634, 0xce => 0xb648, 0xcf => 0xb664, 0xd0 => 0xb668, + 0xd1 => 0xb69c, 0xd2 => 0xb69d, 0xd3 => 0xb6a0, 0xd4 => 0xb6a4, + 0xd5 => 0xb6ab, 0xd6 => 0xb6ac, 0xd7 => 0xb6b1, 0xd8 => 0xb6d4, + 0xd9 => 0xb6f0, 0xda => 0xb6f4, 0xdb => 0xb6f8, 0xdc => 0xb700, + 0xdd => 0xb701, 0xde => 0xb705, 0xdf => 0xb728, 0xe0 => 0xb729, + 0xe1 => 0xb72c, 0xe2 => 0xb72f, 0xe3 => 0xb730, 0xe4 => 0xb738, + 0xe5 => 0xb739, 0xe6 => 0xb73b, 0xe7 => 0xb744, 0xe8 => 0xb748, + 0xe9 => 0xb74c, 0xea => 0xb754, 0xeb => 0xb755, 0xec => 0xb760, + 0xed => 0xb764, 0xee => 0xb768, 0xef => 0xb770, 0xf0 => 0xb771, + 0xf1 => 0xb773, 0xf2 => 0xb775, 0xf3 => 0xb77c, 0xf4 => 0xb77d, + 0xf5 => 0xb780, 0xf6 => 0xb784, 0xf7 => 0xb78c, 0xf8 => 0xb78d, + 0xf9 => 0xb78f, 0xfa => 0xb790, 0xfb => 0xb791, 0xfc => 0xb792, + 0xfd => 0xb796, 0xfe => 0xb797, + }, + 0xb7 => { + 0xa1 => 0xb798, 0xa2 => 0xb799, 0xa3 => 0xb79c, 0xa4 => 0xb7a0, + 0xa5 => 0xb7a8, 0xa6 => 0xb7a9, 0xa7 => 0xb7ab, 0xa8 => 0xb7ac, + 0xa9 => 0xb7ad, 0xaa => 0xb7b4, 0xab => 0xb7b5, 0xac => 0xb7b8, + 0xad => 0xb7c7, 0xae => 0xb7c9, 0xaf => 0xb7ec, 0xb0 => 0xb7ed, + 0xb1 => 0xb7f0, 0xb2 => 0xb7f4, 0xb3 => 0xb7fc, 0xb4 => 0xb7fd, + 0xb5 => 0xb7ff, 0xb6 => 0xb800, 0xb7 => 0xb801, 0xb8 => 0xb807, + 0xb9 => 0xb808, 0xba => 0xb809, 0xbb => 0xb80c, 0xbc => 0xb810, + 0xbd => 0xb818, 0xbe => 0xb819, 0xbf => 0xb81b, 0xc0 => 0xb81d, + 0xc1 => 0xb824, 0xc2 => 0xb825, 0xc3 => 0xb828, 0xc4 => 0xb82c, + 0xc5 => 0xb834, 0xc6 => 0xb835, 0xc7 => 0xb837, 0xc8 => 0xb838, + 0xc9 => 0xb839, 0xca => 0xb840, 0xcb => 0xb844, 0xcc => 0xb851, + 0xcd => 0xb853, 0xce => 0xb85c, 0xcf => 0xb85d, 0xd0 => 0xb860, + 0xd1 => 0xb864, 0xd2 => 0xb86c, 0xd3 => 0xb86d, 0xd4 => 0xb86f, + 0xd5 => 0xb871, 0xd6 => 0xb878, 0xd7 => 0xb87c, 0xd8 => 0xb88d, + 0xd9 => 0xb8a8, 0xda => 0xb8b0, 0xdb => 0xb8b4, 0xdc => 0xb8b8, + 0xdd => 0xb8c0, 0xde => 0xb8c1, 0xdf => 0xb8c3, 0xe0 => 0xb8c5, + 0xe1 => 0xb8cc, 0xe2 => 0xb8d0, 0xe3 => 0xb8d4, 0xe4 => 0xb8dd, + 0xe5 => 0xb8df, 0xe6 => 0xb8e1, 0xe7 => 0xb8e8, 0xe8 => 0xb8e9, + 0xe9 => 0xb8ec, 0xea => 0xb8f0, 0xeb => 0xb8f8, 0xec => 0xb8f9, + 0xed => 0xb8fb, 0xee => 0xb8fd, 0xef => 0xb904, 0xf0 => 0xb918, + 0xf1 => 0xb920, 0xf2 => 0xb93c, 0xf3 => 0xb93d, 0xf4 => 0xb940, + 0xf5 => 0xb944, 0xf6 => 0xb94c, 0xf7 => 0xb94f, 0xf8 => 0xb951, + 0xf9 => 0xb958, 0xfa => 0xb959, 0xfb => 0xb95c, 0xfc => 0xb960, + 0xfd => 0xb968, 0xfe => 0xb969, + }, + 0xb8 => { + 0xa1 => 0xb96b, 0xa2 => 0xb96d, 0xa3 => 0xb974, 0xa4 => 0xb975, + 0xa5 => 0xb978, 0xa6 => 0xb97c, 0xa7 => 0xb984, 0xa8 => 0xb985, + 0xa9 => 0xb987, 0xaa => 0xb989, 0xab => 0xb98a, 0xac => 0xb98d, + 0xad => 0xb98e, 0xae => 0xb9ac, 0xaf => 0xb9ad, 0xb0 => 0xb9b0, + 0xb1 => 0xb9b4, 0xb2 => 0xb9bc, 0xb3 => 0xb9bd, 0xb4 => 0xb9bf, + 0xb5 => 0xb9c1, 0xb6 => 0xb9c8, 0xb7 => 0xb9c9, 0xb8 => 0xb9cc, + 0xb9 => 0xb9ce, 0xba => 0xb9cf, 0xbb => 0xb9d0, 0xbc => 0xb9d1, + 0xbd => 0xb9d2, 0xbe => 0xb9d8, 0xbf => 0xb9d9, 0xc0 => 0xb9db, + 0xc1 => 0xb9dd, 0xc2 => 0xb9de, 0xc3 => 0xb9e1, 0xc4 => 0xb9e3, + 0xc5 => 0xb9e4, 0xc6 => 0xb9e5, 0xc7 => 0xb9e8, 0xc8 => 0xb9ec, + 0xc9 => 0xb9f4, 0xca => 0xb9f5, 0xcb => 0xb9f7, 0xcc => 0xb9f8, + 0xcd => 0xb9f9, 0xce => 0xb9fa, 0xcf => 0xba00, 0xd0 => 0xba01, + 0xd1 => 0xba08, 0xd2 => 0xba15, 0xd3 => 0xba38, 0xd4 => 0xba39, + 0xd5 => 0xba3c, 0xd6 => 0xba40, 0xd7 => 0xba42, 0xd8 => 0xba48, + 0xd9 => 0xba49, 0xda => 0xba4b, 0xdb => 0xba4d, 0xdc => 0xba4e, + 0xdd => 0xba53, 0xde => 0xba54, 0xdf => 0xba55, 0xe0 => 0xba58, + 0xe1 => 0xba5c, 0xe2 => 0xba64, 0xe3 => 0xba65, 0xe4 => 0xba67, + 0xe5 => 0xba68, 0xe6 => 0xba69, 0xe7 => 0xba70, 0xe8 => 0xba71, + 0xe9 => 0xba74, 0xea => 0xba78, 0xeb => 0xba83, 0xec => 0xba84, + 0xed => 0xba85, 0xee => 0xba87, 0xef => 0xba8c, 0xf0 => 0xbaa8, + 0xf1 => 0xbaa9, 0xf2 => 0xbaab, 0xf3 => 0xbaac, 0xf4 => 0xbab0, + 0xf5 => 0xbab2, 0xf6 => 0xbab8, 0xf7 => 0xbab9, 0xf8 => 0xbabb, + 0xf9 => 0xbabd, 0xfa => 0xbac4, 0xfb => 0xbac8, 0xfc => 0xbad8, + 0xfd => 0xbad9, 0xfe => 0xbafc, + }, + 0xb9 => { + 0xa1 => 0xbb00, 0xa2 => 0xbb04, 0xa3 => 0xbb0d, 0xa4 => 0xbb0f, + 0xa5 => 0xbb11, 0xa6 => 0xbb18, 0xa7 => 0xbb1c, 0xa8 => 0xbb20, + 0xa9 => 0xbb29, 0xaa => 0xbb2b, 0xab => 0xbb34, 0xac => 0xbb35, + 0xad => 0xbb36, 0xae => 0xbb38, 0xaf => 0xbb3b, 0xb0 => 0xbb3c, + 0xb1 => 0xbb3d, 0xb2 => 0xbb3e, 0xb3 => 0xbb44, 0xb4 => 0xbb45, + 0xb5 => 0xbb47, 0xb6 => 0xbb49, 0xb7 => 0xbb4d, 0xb8 => 0xbb4f, + 0xb9 => 0xbb50, 0xba => 0xbb54, 0xbb => 0xbb58, 0xbc => 0xbb61, + 0xbd => 0xbb63, 0xbe => 0xbb6c, 0xbf => 0xbb88, 0xc0 => 0xbb8c, + 0xc1 => 0xbb90, 0xc2 => 0xbba4, 0xc3 => 0xbba8, 0xc4 => 0xbbac, + 0xc5 => 0xbbb4, 0xc6 => 0xbbb7, 0xc7 => 0xbbc0, 0xc8 => 0xbbc4, + 0xc9 => 0xbbc8, 0xca => 0xbbd0, 0xcb => 0xbbd3, 0xcc => 0xbbf8, + 0xcd => 0xbbf9, 0xce => 0xbbfc, 0xcf => 0xbbff, 0xd0 => 0xbc00, + 0xd1 => 0xbc02, 0xd2 => 0xbc08, 0xd3 => 0xbc09, 0xd4 => 0xbc0b, + 0xd5 => 0xbc0c, 0xd6 => 0xbc0d, 0xd7 => 0xbc0f, 0xd8 => 0xbc11, + 0xd9 => 0xbc14, 0xda => 0xbc15, 0xdb => 0xbc16, 0xdc => 0xbc17, + 0xdd => 0xbc18, 0xde => 0xbc1b, 0xdf => 0xbc1c, 0xe0 => 0xbc1d, + 0xe1 => 0xbc1e, 0xe2 => 0xbc1f, 0xe3 => 0xbc24, 0xe4 => 0xbc25, + 0xe5 => 0xbc27, 0xe6 => 0xbc29, 0xe7 => 0xbc2d, 0xe8 => 0xbc30, + 0xe9 => 0xbc31, 0xea => 0xbc34, 0xeb => 0xbc38, 0xec => 0xbc40, + 0xed => 0xbc41, 0xee => 0xbc43, 0xef => 0xbc44, 0xf0 => 0xbc45, + 0xf1 => 0xbc49, 0xf2 => 0xbc4c, 0xf3 => 0xbc4d, 0xf4 => 0xbc50, + 0xf5 => 0xbc5d, 0xf6 => 0xbc84, 0xf7 => 0xbc85, 0xf8 => 0xbc88, + 0xf9 => 0xbc8b, 0xfa => 0xbc8c, 0xfb => 0xbc8e, 0xfc => 0xbc94, + 0xfd => 0xbc95, 0xfe => 0xbc97, + }, + 0xba => { + 0xa1 => 0xbc99, 0xa2 => 0xbc9a, 0xa3 => 0xbca0, 0xa4 => 0xbca1, + 0xa5 => 0xbca4, 0xa6 => 0xbca7, 0xa7 => 0xbca8, 0xa8 => 0xbcb0, + 0xa9 => 0xbcb1, 0xaa => 0xbcb3, 0xab => 0xbcb4, 0xac => 0xbcb5, + 0xad => 0xbcbc, 0xae => 0xbcbd, 0xaf => 0xbcc0, 0xb0 => 0xbcc4, + 0xb1 => 0xbccd, 0xb2 => 0xbccf, 0xb3 => 0xbcd0, 0xb4 => 0xbcd1, + 0xb5 => 0xbcd5, 0xb6 => 0xbcd8, 0xb7 => 0xbcdc, 0xb8 => 0xbcf4, + 0xb9 => 0xbcf5, 0xba => 0xbcf6, 0xbb => 0xbcf8, 0xbc => 0xbcfc, + 0xbd => 0xbd04, 0xbe => 0xbd05, 0xbf => 0xbd07, 0xc0 => 0xbd09, + 0xc1 => 0xbd10, 0xc2 => 0xbd14, 0xc3 => 0xbd24, 0xc4 => 0xbd2c, + 0xc5 => 0xbd40, 0xc6 => 0xbd48, 0xc7 => 0xbd49, 0xc8 => 0xbd4c, + 0xc9 => 0xbd50, 0xca => 0xbd58, 0xcb => 0xbd59, 0xcc => 0xbd64, + 0xcd => 0xbd68, 0xce => 0xbd80, 0xcf => 0xbd81, 0xd0 => 0xbd84, + 0xd1 => 0xbd87, 0xd2 => 0xbd88, 0xd3 => 0xbd89, 0xd4 => 0xbd8a, + 0xd5 => 0xbd90, 0xd6 => 0xbd91, 0xd7 => 0xbd93, 0xd8 => 0xbd95, + 0xd9 => 0xbd99, 0xda => 0xbd9a, 0xdb => 0xbd9c, 0xdc => 0xbda4, + 0xdd => 0xbdb0, 0xde => 0xbdb8, 0xdf => 0xbdd4, 0xe0 => 0xbdd5, + 0xe1 => 0xbdd8, 0xe2 => 0xbddc, 0xe3 => 0xbde9, 0xe4 => 0xbdf0, + 0xe5 => 0xbdf4, 0xe6 => 0xbdf8, 0xe7 => 0xbe00, 0xe8 => 0xbe03, + 0xe9 => 0xbe05, 0xea => 0xbe0c, 0xeb => 0xbe0d, 0xec => 0xbe10, + 0xed => 0xbe14, 0xee => 0xbe1c, 0xef => 0xbe1d, 0xf0 => 0xbe1f, + 0xf1 => 0xbe44, 0xf2 => 0xbe45, 0xf3 => 0xbe48, 0xf4 => 0xbe4c, + 0xf5 => 0xbe4e, 0xf6 => 0xbe54, 0xf7 => 0xbe55, 0xf8 => 0xbe57, + 0xf9 => 0xbe59, 0xfa => 0xbe5a, 0xfb => 0xbe5b, 0xfc => 0xbe60, + 0xfd => 0xbe61, 0xfe => 0xbe64, + }, + 0xbb => { + 0xa1 => 0xbe68, 0xa2 => 0xbe6a, 0xa3 => 0xbe70, 0xa4 => 0xbe71, + 0xa5 => 0xbe73, 0xa6 => 0xbe74, 0xa7 => 0xbe75, 0xa8 => 0xbe7b, + 0xa9 => 0xbe7c, 0xaa => 0xbe7d, 0xab => 0xbe80, 0xac => 0xbe84, + 0xad => 0xbe8c, 0xae => 0xbe8d, 0xaf => 0xbe8f, 0xb0 => 0xbe90, + 0xb1 => 0xbe91, 0xb2 => 0xbe98, 0xb3 => 0xbe99, 0xb4 => 0xbea8, + 0xb5 => 0xbed0, 0xb6 => 0xbed1, 0xb7 => 0xbed4, 0xb8 => 0xbed7, + 0xb9 => 0xbed8, 0xba => 0xbee0, 0xbb => 0xbee3, 0xbc => 0xbee4, + 0xbd => 0xbee5, 0xbe => 0xbeec, 0xbf => 0xbf01, 0xc0 => 0xbf08, + 0xc1 => 0xbf09, 0xc2 => 0xbf18, 0xc3 => 0xbf19, 0xc4 => 0xbf1b, + 0xc5 => 0xbf1c, 0xc6 => 0xbf1d, 0xc7 => 0xbf40, 0xc8 => 0xbf41, + 0xc9 => 0xbf44, 0xca => 0xbf48, 0xcb => 0xbf50, 0xcc => 0xbf51, + 0xcd => 0xbf55, 0xce => 0xbf94, 0xcf => 0xbfb0, 0xd0 => 0xbfc5, + 0xd1 => 0xbfcc, 0xd2 => 0xbfcd, 0xd3 => 0xbfd0, 0xd4 => 0xbfd4, + 0xd5 => 0xbfdc, 0xd6 => 0xbfdf, 0xd7 => 0xbfe1, 0xd8 => 0xc03c, + 0xd9 => 0xc051, 0xda => 0xc058, 0xdb => 0xc05c, 0xdc => 0xc060, + 0xdd => 0xc068, 0xde => 0xc069, 0xdf => 0xc090, 0xe0 => 0xc091, + 0xe1 => 0xc094, 0xe2 => 0xc098, 0xe3 => 0xc0a0, 0xe4 => 0xc0a1, + 0xe5 => 0xc0a3, 0xe6 => 0xc0a5, 0xe7 => 0xc0ac, 0xe8 => 0xc0ad, + 0xe9 => 0xc0af, 0xea => 0xc0b0, 0xeb => 0xc0b3, 0xec => 0xc0b4, + 0xed => 0xc0b5, 0xee => 0xc0b6, 0xef => 0xc0bc, 0xf0 => 0xc0bd, + 0xf1 => 0xc0bf, 0xf2 => 0xc0c0, 0xf3 => 0xc0c1, 0xf4 => 0xc0c5, + 0xf5 => 0xc0c8, 0xf6 => 0xc0c9, 0xf7 => 0xc0cc, 0xf8 => 0xc0d0, + 0xf9 => 0xc0d8, 0xfa => 0xc0d9, 0xfb => 0xc0db, 0xfc => 0xc0dc, + 0xfd => 0xc0dd, 0xfe => 0xc0e4, + }, + 0xbc => { + 0xa1 => 0xc0e5, 0xa2 => 0xc0e8, 0xa3 => 0xc0ec, 0xa4 => 0xc0f4, + 0xa5 => 0xc0f5, 0xa6 => 0xc0f7, 0xa7 => 0xc0f9, 0xa8 => 0xc100, + 0xa9 => 0xc104, 0xaa => 0xc108, 0xab => 0xc110, 0xac => 0xc115, + 0xad => 0xc11c, 0xae => 0xc11d, 0xaf => 0xc11e, 0xb0 => 0xc11f, + 0xb1 => 0xc120, 0xb2 => 0xc123, 0xb3 => 0xc124, 0xb4 => 0xc126, + 0xb5 => 0xc127, 0xb6 => 0xc12c, 0xb7 => 0xc12d, 0xb8 => 0xc12f, + 0xb9 => 0xc130, 0xba => 0xc131, 0xbb => 0xc136, 0xbc => 0xc138, + 0xbd => 0xc139, 0xbe => 0xc13c, 0xbf => 0xc140, 0xc0 => 0xc148, + 0xc1 => 0xc149, 0xc2 => 0xc14b, 0xc3 => 0xc14c, 0xc4 => 0xc14d, + 0xc5 => 0xc154, 0xc6 => 0xc155, 0xc7 => 0xc158, 0xc8 => 0xc15c, + 0xc9 => 0xc164, 0xca => 0xc165, 0xcb => 0xc167, 0xcc => 0xc168, + 0xcd => 0xc169, 0xce => 0xc170, 0xcf => 0xc174, 0xd0 => 0xc178, + 0xd1 => 0xc185, 0xd2 => 0xc18c, 0xd3 => 0xc18d, 0xd4 => 0xc18e, + 0xd5 => 0xc190, 0xd6 => 0xc194, 0xd7 => 0xc196, 0xd8 => 0xc19c, + 0xd9 => 0xc19d, 0xda => 0xc19f, 0xdb => 0xc1a1, 0xdc => 0xc1a5, + 0xdd => 0xc1a8, 0xde => 0xc1a9, 0xdf => 0xc1ac, 0xe0 => 0xc1b0, + 0xe1 => 0xc1bd, 0xe2 => 0xc1c4, 0xe3 => 0xc1c8, 0xe4 => 0xc1cc, + 0xe5 => 0xc1d4, 0xe6 => 0xc1d7, 0xe7 => 0xc1d8, 0xe8 => 0xc1e0, + 0xe9 => 0xc1e4, 0xea => 0xc1e8, 0xeb => 0xc1f0, 0xec => 0xc1f1, + 0xed => 0xc1f3, 0xee => 0xc1fc, 0xef => 0xc1fd, 0xf0 => 0xc200, + 0xf1 => 0xc204, 0xf2 => 0xc20c, 0xf3 => 0xc20d, 0xf4 => 0xc20f, + 0xf5 => 0xc211, 0xf6 => 0xc218, 0xf7 => 0xc219, 0xf8 => 0xc21c, + 0xf9 => 0xc21f, 0xfa => 0xc220, 0xfb => 0xc228, 0xfc => 0xc229, + 0xfd => 0xc22b, 0xfe => 0xc22d, + }, + 0xbd => { + 0xa1 => 0xc22f, 0xa2 => 0xc231, 0xa3 => 0xc232, 0xa4 => 0xc234, + 0xa5 => 0xc248, 0xa6 => 0xc250, 0xa7 => 0xc251, 0xa8 => 0xc254, + 0xa9 => 0xc258, 0xaa => 0xc260, 0xab => 0xc265, 0xac => 0xc26c, + 0xad => 0xc26d, 0xae => 0xc270, 0xaf => 0xc274, 0xb0 => 0xc27c, + 0xb1 => 0xc27d, 0xb2 => 0xc27f, 0xb3 => 0xc281, 0xb4 => 0xc288, + 0xb5 => 0xc289, 0xb6 => 0xc290, 0xb7 => 0xc298, 0xb8 => 0xc29b, + 0xb9 => 0xc29d, 0xba => 0xc2a4, 0xbb => 0xc2a5, 0xbc => 0xc2a8, + 0xbd => 0xc2ac, 0xbe => 0xc2ad, 0xbf => 0xc2b4, 0xc0 => 0xc2b5, + 0xc1 => 0xc2b7, 0xc2 => 0xc2b9, 0xc3 => 0xc2dc, 0xc4 => 0xc2dd, + 0xc5 => 0xc2e0, 0xc6 => 0xc2e3, 0xc7 => 0xc2e4, 0xc8 => 0xc2eb, + 0xc9 => 0xc2ec, 0xca => 0xc2ed, 0xcb => 0xc2ef, 0xcc => 0xc2f1, + 0xcd => 0xc2f6, 0xce => 0xc2f8, 0xcf => 0xc2f9, 0xd0 => 0xc2fb, + 0xd1 => 0xc2fc, 0xd2 => 0xc300, 0xd3 => 0xc308, 0xd4 => 0xc309, + 0xd5 => 0xc30c, 0xd6 => 0xc30d, 0xd7 => 0xc313, 0xd8 => 0xc314, + 0xd9 => 0xc315, 0xda => 0xc318, 0xdb => 0xc31c, 0xdc => 0xc324, + 0xdd => 0xc325, 0xde => 0xc328, 0xdf => 0xc329, 0xe0 => 0xc345, + 0xe1 => 0xc368, 0xe2 => 0xc369, 0xe3 => 0xc36c, 0xe4 => 0xc370, + 0xe5 => 0xc372, 0xe6 => 0xc378, 0xe7 => 0xc379, 0xe8 => 0xc37c, + 0xe9 => 0xc37d, 0xea => 0xc384, 0xeb => 0xc388, 0xec => 0xc38c, + 0xed => 0xc3c0, 0xee => 0xc3d8, 0xef => 0xc3d9, 0xf0 => 0xc3dc, + 0xf1 => 0xc3df, 0xf2 => 0xc3e0, 0xf3 => 0xc3e2, 0xf4 => 0xc3e8, + 0xf5 => 0xc3e9, 0xf6 => 0xc3ed, 0xf7 => 0xc3f4, 0xf8 => 0xc3f5, + 0xf9 => 0xc3f8, 0xfa => 0xc408, 0xfb => 0xc410, 0xfc => 0xc424, + 0xfd => 0xc42c, 0xfe => 0xc430, + }, + 0xbe => { + 0xa1 => 0xc434, 0xa2 => 0xc43c, 0xa3 => 0xc43d, 0xa4 => 0xc448, + 0xa5 => 0xc464, 0xa6 => 0xc465, 0xa7 => 0xc468, 0xa8 => 0xc46c, + 0xa9 => 0xc474, 0xaa => 0xc475, 0xab => 0xc479, 0xac => 0xc480, + 0xad => 0xc494, 0xae => 0xc49c, 0xaf => 0xc4b8, 0xb0 => 0xc4bc, + 0xb1 => 0xc4e9, 0xb2 => 0xc4f0, 0xb3 => 0xc4f1, 0xb4 => 0xc4f4, + 0xb5 => 0xc4f8, 0xb6 => 0xc4fa, 0xb7 => 0xc4ff, 0xb8 => 0xc500, + 0xb9 => 0xc501, 0xba => 0xc50c, 0xbb => 0xc510, 0xbc => 0xc514, + 0xbd => 0xc51c, 0xbe => 0xc528, 0xbf => 0xc529, 0xc0 => 0xc52c, + 0xc1 => 0xc530, 0xc2 => 0xc538, 0xc3 => 0xc539, 0xc4 => 0xc53b, + 0xc5 => 0xc53d, 0xc6 => 0xc544, 0xc7 => 0xc545, 0xc8 => 0xc548, + 0xc9 => 0xc549, 0xca => 0xc54a, 0xcb => 0xc54c, 0xcc => 0xc54d, + 0xcd => 0xc54e, 0xce => 0xc553, 0xcf => 0xc554, 0xd0 => 0xc555, + 0xd1 => 0xc557, 0xd2 => 0xc558, 0xd3 => 0xc559, 0xd4 => 0xc55d, + 0xd5 => 0xc55e, 0xd6 => 0xc560, 0xd7 => 0xc561, 0xd8 => 0xc564, + 0xd9 => 0xc568, 0xda => 0xc570, 0xdb => 0xc571, 0xdc => 0xc573, + 0xdd => 0xc574, 0xde => 0xc575, 0xdf => 0xc57c, 0xe0 => 0xc57d, + 0xe1 => 0xc580, 0xe2 => 0xc584, 0xe3 => 0xc587, 0xe4 => 0xc58c, + 0xe5 => 0xc58d, 0xe6 => 0xc58f, 0xe7 => 0xc591, 0xe8 => 0xc595, + 0xe9 => 0xc597, 0xea => 0xc598, 0xeb => 0xc59c, 0xec => 0xc5a0, + 0xed => 0xc5a9, 0xee => 0xc5b4, 0xef => 0xc5b5, 0xf0 => 0xc5b8, + 0xf1 => 0xc5b9, 0xf2 => 0xc5bb, 0xf3 => 0xc5bc, 0xf4 => 0xc5bd, + 0xf5 => 0xc5be, 0xf6 => 0xc5c4, 0xf7 => 0xc5c5, 0xf8 => 0xc5c6, + 0xf9 => 0xc5c7, 0xfa => 0xc5c8, 0xfb => 0xc5c9, 0xfc => 0xc5ca, + 0xfd => 0xc5cc, 0xfe => 0xc5ce, + }, + 0xbf => { + 0xa1 => 0xc5d0, 0xa2 => 0xc5d1, 0xa3 => 0xc5d4, 0xa4 => 0xc5d8, + 0xa5 => 0xc5e0, 0xa6 => 0xc5e1, 0xa7 => 0xc5e3, 0xa8 => 0xc5e5, + 0xa9 => 0xc5ec, 0xaa => 0xc5ed, 0xab => 0xc5ee, 0xac => 0xc5f0, + 0xad => 0xc5f4, 0xae => 0xc5f6, 0xaf => 0xc5f7, 0xb0 => 0xc5fc, + 0xb1 => 0xc5fd, 0xb2 => 0xc5fe, 0xb3 => 0xc5ff, 0xb4 => 0xc600, + 0xb5 => 0xc601, 0xb6 => 0xc605, 0xb7 => 0xc606, 0xb8 => 0xc607, + 0xb9 => 0xc608, 0xba => 0xc60c, 0xbb => 0xc610, 0xbc => 0xc618, + 0xbd => 0xc619, 0xbe => 0xc61b, 0xbf => 0xc61c, 0xc0 => 0xc624, + 0xc1 => 0xc625, 0xc2 => 0xc628, 0xc3 => 0xc62c, 0xc4 => 0xc62d, + 0xc5 => 0xc62e, 0xc6 => 0xc630, 0xc7 => 0xc633, 0xc8 => 0xc634, + 0xc9 => 0xc635, 0xca => 0xc637, 0xcb => 0xc639, 0xcc => 0xc63b, + 0xcd => 0xc640, 0xce => 0xc641, 0xcf => 0xc644, 0xd0 => 0xc648, + 0xd1 => 0xc650, 0xd2 => 0xc651, 0xd3 => 0xc653, 0xd4 => 0xc654, + 0xd5 => 0xc655, 0xd6 => 0xc65c, 0xd7 => 0xc65d, 0xd8 => 0xc660, + 0xd9 => 0xc66c, 0xda => 0xc66f, 0xdb => 0xc671, 0xdc => 0xc678, + 0xdd => 0xc679, 0xde => 0xc67c, 0xdf => 0xc680, 0xe0 => 0xc688, + 0xe1 => 0xc689, 0xe2 => 0xc68b, 0xe3 => 0xc68d, 0xe4 => 0xc694, + 0xe5 => 0xc695, 0xe6 => 0xc698, 0xe7 => 0xc69c, 0xe8 => 0xc6a4, + 0xe9 => 0xc6a5, 0xea => 0xc6a7, 0xeb => 0xc6a9, 0xec => 0xc6b0, + 0xed => 0xc6b1, 0xee => 0xc6b4, 0xef => 0xc6b8, 0xf0 => 0xc6b9, + 0xf1 => 0xc6ba, 0xf2 => 0xc6c0, 0xf3 => 0xc6c1, 0xf4 => 0xc6c3, + 0xf5 => 0xc6c5, 0xf6 => 0xc6cc, 0xf7 => 0xc6cd, 0xf8 => 0xc6d0, + 0xf9 => 0xc6d4, 0xfa => 0xc6dc, 0xfb => 0xc6dd, 0xfc => 0xc6e0, + 0xfd => 0xc6e1, 0xfe => 0xc6e8, + }, + 0xc0 => { + 0xa1 => 0xc6e9, 0xa2 => 0xc6ec, 0xa3 => 0xc6f0, 0xa4 => 0xc6f8, + 0xa5 => 0xc6f9, 0xa6 => 0xc6fd, 0xa7 => 0xc704, 0xa8 => 0xc705, + 0xa9 => 0xc708, 0xaa => 0xc70c, 0xab => 0xc714, 0xac => 0xc715, + 0xad => 0xc717, 0xae => 0xc719, 0xaf => 0xc720, 0xb0 => 0xc721, + 0xb1 => 0xc724, 0xb2 => 0xc728, 0xb3 => 0xc730, 0xb4 => 0xc731, + 0xb5 => 0xc733, 0xb6 => 0xc735, 0xb7 => 0xc737, 0xb8 => 0xc73c, + 0xb9 => 0xc73d, 0xba => 0xc740, 0xbb => 0xc744, 0xbc => 0xc74a, + 0xbd => 0xc74c, 0xbe => 0xc74d, 0xbf => 0xc74f, 0xc0 => 0xc751, + 0xc1 => 0xc752, 0xc2 => 0xc753, 0xc3 => 0xc754, 0xc4 => 0xc755, + 0xc5 => 0xc756, 0xc6 => 0xc757, 0xc7 => 0xc758, 0xc8 => 0xc75c, + 0xc9 => 0xc760, 0xca => 0xc768, 0xcb => 0xc76b, 0xcc => 0xc774, + 0xcd => 0xc775, 0xce => 0xc778, 0xcf => 0xc77c, 0xd0 => 0xc77d, + 0xd1 => 0xc77e, 0xd2 => 0xc783, 0xd3 => 0xc784, 0xd4 => 0xc785, + 0xd5 => 0xc787, 0xd6 => 0xc788, 0xd7 => 0xc789, 0xd8 => 0xc78a, + 0xd9 => 0xc78e, 0xda => 0xc790, 0xdb => 0xc791, 0xdc => 0xc794, + 0xdd => 0xc796, 0xde => 0xc797, 0xdf => 0xc798, 0xe0 => 0xc79a, + 0xe1 => 0xc7a0, 0xe2 => 0xc7a1, 0xe3 => 0xc7a3, 0xe4 => 0xc7a4, + 0xe5 => 0xc7a5, 0xe6 => 0xc7a6, 0xe7 => 0xc7ac, 0xe8 => 0xc7ad, + 0xe9 => 0xc7b0, 0xea => 0xc7b4, 0xeb => 0xc7bc, 0xec => 0xc7bd, + 0xed => 0xc7bf, 0xee => 0xc7c0, 0xef => 0xc7c1, 0xf0 => 0xc7c8, + 0xf1 => 0xc7c9, 0xf2 => 0xc7cc, 0xf3 => 0xc7ce, 0xf4 => 0xc7d0, + 0xf5 => 0xc7d8, 0xf6 => 0xc7dd, 0xf7 => 0xc7e4, 0xf8 => 0xc7e8, + 0xf9 => 0xc7ec, 0xfa => 0xc800, 0xfb => 0xc801, 0xfc => 0xc804, + 0xfd => 0xc808, 0xfe => 0xc80a, + }, + 0xc1 => { + 0xa1 => 0xc810, 0xa2 => 0xc811, 0xa3 => 0xc813, 0xa4 => 0xc815, + 0xa5 => 0xc816, 0xa6 => 0xc81c, 0xa7 => 0xc81d, 0xa8 => 0xc820, + 0xa9 => 0xc824, 0xaa => 0xc82c, 0xab => 0xc82d, 0xac => 0xc82f, + 0xad => 0xc831, 0xae => 0xc838, 0xaf => 0xc83c, 0xb0 => 0xc840, + 0xb1 => 0xc848, 0xb2 => 0xc849, 0xb3 => 0xc84c, 0xb4 => 0xc84d, + 0xb5 => 0xc854, 0xb6 => 0xc870, 0xb7 => 0xc871, 0xb8 => 0xc874, + 0xb9 => 0xc878, 0xba => 0xc87a, 0xbb => 0xc880, 0xbc => 0xc881, + 0xbd => 0xc883, 0xbe => 0xc885, 0xbf => 0xc886, 0xc0 => 0xc887, + 0xc1 => 0xc88b, 0xc2 => 0xc88c, 0xc3 => 0xc88d, 0xc4 => 0xc894, + 0xc5 => 0xc89d, 0xc6 => 0xc89f, 0xc7 => 0xc8a1, 0xc8 => 0xc8a8, + 0xc9 => 0xc8bc, 0xca => 0xc8bd, 0xcb => 0xc8c4, 0xcc => 0xc8c8, + 0xcd => 0xc8cc, 0xce => 0xc8d4, 0xcf => 0xc8d5, 0xd0 => 0xc8d7, + 0xd1 => 0xc8d9, 0xd2 => 0xc8e0, 0xd3 => 0xc8e1, 0xd4 => 0xc8e4, + 0xd5 => 0xc8f5, 0xd6 => 0xc8fc, 0xd7 => 0xc8fd, 0xd8 => 0xc900, + 0xd9 => 0xc904, 0xda => 0xc905, 0xdb => 0xc906, 0xdc => 0xc90c, + 0xdd => 0xc90d, 0xde => 0xc90f, 0xdf => 0xc911, 0xe0 => 0xc918, + 0xe1 => 0xc92c, 0xe2 => 0xc934, 0xe3 => 0xc950, 0xe4 => 0xc951, + 0xe5 => 0xc954, 0xe6 => 0xc958, 0xe7 => 0xc960, 0xe8 => 0xc961, + 0xe9 => 0xc963, 0xea => 0xc96c, 0xeb => 0xc970, 0xec => 0xc974, + 0xed => 0xc97c, 0xee => 0xc988, 0xef => 0xc989, 0xf0 => 0xc98c, + 0xf1 => 0xc990, 0xf2 => 0xc998, 0xf3 => 0xc999, 0xf4 => 0xc99b, + 0xf5 => 0xc99d, 0xf6 => 0xc9c0, 0xf7 => 0xc9c1, 0xf8 => 0xc9c4, + 0xf9 => 0xc9c7, 0xfa => 0xc9c8, 0xfb => 0xc9ca, 0xfc => 0xc9d0, + 0xfd => 0xc9d1, 0xfe => 0xc9d3, + }, + 0xc2 => { + 0xa1 => 0xc9d5, 0xa2 => 0xc9d6, 0xa3 => 0xc9d9, 0xa4 => 0xc9da, + 0xa5 => 0xc9dc, 0xa6 => 0xc9dd, 0xa7 => 0xc9e0, 0xa8 => 0xc9e2, + 0xa9 => 0xc9e4, 0xaa => 0xc9e7, 0xab => 0xc9ec, 0xac => 0xc9ed, + 0xad => 0xc9ef, 0xae => 0xc9f0, 0xaf => 0xc9f1, 0xb0 => 0xc9f8, + 0xb1 => 0xc9f9, 0xb2 => 0xc9fc, 0xb3 => 0xca00, 0xb4 => 0xca08, + 0xb5 => 0xca09, 0xb6 => 0xca0b, 0xb7 => 0xca0c, 0xb8 => 0xca0d, + 0xb9 => 0xca14, 0xba => 0xca18, 0xbb => 0xca29, 0xbc => 0xca4c, + 0xbd => 0xca4d, 0xbe => 0xca50, 0xbf => 0xca54, 0xc0 => 0xca5c, + 0xc1 => 0xca5d, 0xc2 => 0xca5f, 0xc3 => 0xca60, 0xc4 => 0xca61, + 0xc5 => 0xca68, 0xc6 => 0xca7d, 0xc7 => 0xca84, 0xc8 => 0xca98, + 0xc9 => 0xcabc, 0xca => 0xcabd, 0xcb => 0xcac0, 0xcc => 0xcac4, + 0xcd => 0xcacc, 0xce => 0xcacd, 0xcf => 0xcacf, 0xd0 => 0xcad1, + 0xd1 => 0xcad3, 0xd2 => 0xcad8, 0xd3 => 0xcad9, 0xd4 => 0xcae0, + 0xd5 => 0xcaec, 0xd6 => 0xcaf4, 0xd7 => 0xcb08, 0xd8 => 0xcb10, + 0xd9 => 0xcb14, 0xda => 0xcb18, 0xdb => 0xcb20, 0xdc => 0xcb21, + 0xdd => 0xcb41, 0xde => 0xcb48, 0xdf => 0xcb49, 0xe0 => 0xcb4c, + 0xe1 => 0xcb50, 0xe2 => 0xcb58, 0xe3 => 0xcb59, 0xe4 => 0xcb5d, + 0xe5 => 0xcb64, 0xe6 => 0xcb78, 0xe7 => 0xcb79, 0xe8 => 0xcb9c, + 0xe9 => 0xcbb8, 0xea => 0xcbd4, 0xeb => 0xcbe4, 0xec => 0xcbe7, + 0xed => 0xcbe9, 0xee => 0xcc0c, 0xef => 0xcc0d, 0xf0 => 0xcc10, + 0xf1 => 0xcc14, 0xf2 => 0xcc1c, 0xf3 => 0xcc1d, 0xf4 => 0xcc21, + 0xf5 => 0xcc22, 0xf6 => 0xcc27, 0xf7 => 0xcc28, 0xf8 => 0xcc29, + 0xf9 => 0xcc2c, 0xfa => 0xcc2e, 0xfb => 0xcc30, 0xfc => 0xcc38, + 0xfd => 0xcc39, 0xfe => 0xcc3b, + }, + 0xc3 => { + 0xa1 => 0xcc3c, 0xa2 => 0xcc3d, 0xa3 => 0xcc3e, 0xa4 => 0xcc44, + 0xa5 => 0xcc45, 0xa6 => 0xcc48, 0xa7 => 0xcc4c, 0xa8 => 0xcc54, + 0xa9 => 0xcc55, 0xaa => 0xcc57, 0xab => 0xcc58, 0xac => 0xcc59, + 0xad => 0xcc60, 0xae => 0xcc64, 0xaf => 0xcc66, 0xb0 => 0xcc68, + 0xb1 => 0xcc70, 0xb2 => 0xcc75, 0xb3 => 0xcc98, 0xb4 => 0xcc99, + 0xb5 => 0xcc9c, 0xb6 => 0xcca0, 0xb7 => 0xcca8, 0xb8 => 0xcca9, + 0xb9 => 0xccab, 0xba => 0xccac, 0xbb => 0xccad, 0xbc => 0xccb4, + 0xbd => 0xccb5, 0xbe => 0xccb8, 0xbf => 0xccbc, 0xc0 => 0xccc4, + 0xc1 => 0xccc5, 0xc2 => 0xccc7, 0xc3 => 0xccc9, 0xc4 => 0xccd0, + 0xc5 => 0xccd4, 0xc6 => 0xcce4, 0xc7 => 0xccec, 0xc8 => 0xccf0, + 0xc9 => 0xcd01, 0xca => 0xcd08, 0xcb => 0xcd09, 0xcc => 0xcd0c, + 0xcd => 0xcd10, 0xce => 0xcd18, 0xcf => 0xcd19, 0xd0 => 0xcd1b, + 0xd1 => 0xcd1d, 0xd2 => 0xcd24, 0xd3 => 0xcd28, 0xd4 => 0xcd2c, + 0xd5 => 0xcd39, 0xd6 => 0xcd5c, 0xd7 => 0xcd60, 0xd8 => 0xcd64, + 0xd9 => 0xcd6c, 0xda => 0xcd6d, 0xdb => 0xcd6f, 0xdc => 0xcd71, + 0xdd => 0xcd78, 0xde => 0xcd88, 0xdf => 0xcd94, 0xe0 => 0xcd95, + 0xe1 => 0xcd98, 0xe2 => 0xcd9c, 0xe3 => 0xcda4, 0xe4 => 0xcda5, + 0xe5 => 0xcda7, 0xe6 => 0xcda9, 0xe7 => 0xcdb0, 0xe8 => 0xcdc4, + 0xe9 => 0xcdcc, 0xea => 0xcdd0, 0xeb => 0xcde8, 0xec => 0xcdec, + 0xed => 0xcdf0, 0xee => 0xcdf8, 0xef => 0xcdf9, 0xf0 => 0xcdfb, + 0xf1 => 0xcdfd, 0xf2 => 0xce04, 0xf3 => 0xce08, 0xf4 => 0xce0c, + 0xf5 => 0xce14, 0xf6 => 0xce19, 0xf7 => 0xce20, 0xf8 => 0xce21, + 0xf9 => 0xce24, 0xfa => 0xce28, 0xfb => 0xce30, 0xfc => 0xce31, + 0xfd => 0xce33, 0xfe => 0xce35, + }, + 0xc4 => { + 0xa1 => 0xce58, 0xa2 => 0xce59, 0xa3 => 0xce5c, 0xa4 => 0xce5f, + 0xa5 => 0xce60, 0xa6 => 0xce61, 0xa7 => 0xce68, 0xa8 => 0xce69, + 0xa9 => 0xce6b, 0xaa => 0xce6d, 0xab => 0xce74, 0xac => 0xce75, + 0xad => 0xce78, 0xae => 0xce7c, 0xaf => 0xce84, 0xb0 => 0xce85, + 0xb1 => 0xce87, 0xb2 => 0xce89, 0xb3 => 0xce90, 0xb4 => 0xce91, + 0xb5 => 0xce94, 0xb6 => 0xce98, 0xb7 => 0xcea0, 0xb8 => 0xcea1, + 0xb9 => 0xcea3, 0xba => 0xcea4, 0xbb => 0xcea5, 0xbc => 0xceac, + 0xbd => 0xcead, 0xbe => 0xcec1, 0xbf => 0xcee4, 0xc0 => 0xcee5, + 0xc1 => 0xcee8, 0xc2 => 0xceeb, 0xc3 => 0xceec, 0xc4 => 0xcef4, + 0xc5 => 0xcef5, 0xc6 => 0xcef7, 0xc7 => 0xcef8, 0xc8 => 0xcef9, + 0xc9 => 0xcf00, 0xca => 0xcf01, 0xcb => 0xcf04, 0xcc => 0xcf08, + 0xcd => 0xcf10, 0xce => 0xcf11, 0xcf => 0xcf13, 0xd0 => 0xcf15, + 0xd1 => 0xcf1c, 0xd2 => 0xcf20, 0xd3 => 0xcf24, 0xd4 => 0xcf2c, + 0xd5 => 0xcf2d, 0xd6 => 0xcf2f, 0xd7 => 0xcf30, 0xd8 => 0xcf31, + 0xd9 => 0xcf38, 0xda => 0xcf54, 0xdb => 0xcf55, 0xdc => 0xcf58, + 0xdd => 0xcf5c, 0xde => 0xcf64, 0xdf => 0xcf65, 0xe0 => 0xcf67, + 0xe1 => 0xcf69, 0xe2 => 0xcf70, 0xe3 => 0xcf71, 0xe4 => 0xcf74, + 0xe5 => 0xcf78, 0xe6 => 0xcf80, 0xe7 => 0xcf85, 0xe8 => 0xcf8c, + 0xe9 => 0xcfa1, 0xea => 0xcfa8, 0xeb => 0xcfb0, 0xec => 0xcfc4, + 0xed => 0xcfe0, 0xee => 0xcfe1, 0xef => 0xcfe4, 0xf0 => 0xcfe8, + 0xf1 => 0xcff0, 0xf2 => 0xcff1, 0xf3 => 0xcff3, 0xf4 => 0xcff5, + 0xf5 => 0xcffc, 0xf6 => 0xd000, 0xf7 => 0xd004, 0xf8 => 0xd011, + 0xf9 => 0xd018, 0xfa => 0xd02d, 0xfb => 0xd034, 0xfc => 0xd035, + 0xfd => 0xd038, 0xfe => 0xd03c, + }, + 0xc5 => { + 0xa1 => 0xd044, 0xa2 => 0xd045, 0xa3 => 0xd047, 0xa4 => 0xd049, + 0xa5 => 0xd050, 0xa6 => 0xd054, 0xa7 => 0xd058, 0xa8 => 0xd060, + 0xa9 => 0xd06c, 0xaa => 0xd06d, 0xab => 0xd070, 0xac => 0xd074, + 0xad => 0xd07c, 0xae => 0xd07d, 0xaf => 0xd081, 0xb0 => 0xd0a4, + 0xb1 => 0xd0a5, 0xb2 => 0xd0a8, 0xb3 => 0xd0ac, 0xb4 => 0xd0b4, + 0xb5 => 0xd0b5, 0xb6 => 0xd0b7, 0xb7 => 0xd0b9, 0xb8 => 0xd0c0, + 0xb9 => 0xd0c1, 0xba => 0xd0c4, 0xbb => 0xd0c8, 0xbc => 0xd0c9, + 0xbd => 0xd0d0, 0xbe => 0xd0d1, 0xbf => 0xd0d3, 0xc0 => 0xd0d4, + 0xc1 => 0xd0d5, 0xc2 => 0xd0dc, 0xc3 => 0xd0dd, 0xc4 => 0xd0e0, + 0xc5 => 0xd0e4, 0xc6 => 0xd0ec, 0xc7 => 0xd0ed, 0xc8 => 0xd0ef, + 0xc9 => 0xd0f0, 0xca => 0xd0f1, 0xcb => 0xd0f8, 0xcc => 0xd10d, + 0xcd => 0xd130, 0xce => 0xd131, 0xcf => 0xd134, 0xd0 => 0xd138, + 0xd1 => 0xd13a, 0xd2 => 0xd140, 0xd3 => 0xd141, 0xd4 => 0xd143, + 0xd5 => 0xd144, 0xd6 => 0xd145, 0xd7 => 0xd14c, 0xd8 => 0xd14d, + 0xd9 => 0xd150, 0xda => 0xd154, 0xdb => 0xd15c, 0xdc => 0xd15d, + 0xdd => 0xd15f, 0xde => 0xd161, 0xdf => 0xd168, 0xe0 => 0xd16c, + 0xe1 => 0xd17c, 0xe2 => 0xd184, 0xe3 => 0xd188, 0xe4 => 0xd1a0, + 0xe5 => 0xd1a1, 0xe6 => 0xd1a4, 0xe7 => 0xd1a8, 0xe8 => 0xd1b0, + 0xe9 => 0xd1b1, 0xea => 0xd1b3, 0xeb => 0xd1b5, 0xec => 0xd1ba, + 0xed => 0xd1bc, 0xee => 0xd1c0, 0xef => 0xd1d8, 0xf0 => 0xd1f4, + 0xf1 => 0xd1f8, 0xf2 => 0xd207, 0xf3 => 0xd209, 0xf4 => 0xd210, + 0xf5 => 0xd22c, 0xf6 => 0xd22d, 0xf7 => 0xd230, 0xf8 => 0xd234, + 0xf9 => 0xd23c, 0xfa => 0xd23d, 0xfb => 0xd23f, 0xfc => 0xd241, + 0xfd => 0xd248, 0xfe => 0xd25c, + }, + 0xc6 => { + 0xa1 => 0xd264, 0xa2 => 0xd280, 0xa3 => 0xd281, 0xa4 => 0xd284, + 0xa5 => 0xd288, 0xa6 => 0xd290, 0xa7 => 0xd291, 0xa8 => 0xd295, + 0xa9 => 0xd29c, 0xaa => 0xd2a0, 0xab => 0xd2a4, 0xac => 0xd2ac, + 0xad => 0xd2b1, 0xae => 0xd2b8, 0xaf => 0xd2b9, 0xb0 => 0xd2bc, + 0xb1 => 0xd2bf, 0xb2 => 0xd2c0, 0xb3 => 0xd2c2, 0xb4 => 0xd2c8, + 0xb5 => 0xd2c9, 0xb6 => 0xd2cb, 0xb7 => 0xd2d4, 0xb8 => 0xd2d8, + 0xb9 => 0xd2dc, 0xba => 0xd2e4, 0xbb => 0xd2e5, 0xbc => 0xd2f0, + 0xbd => 0xd2f1, 0xbe => 0xd2f4, 0xbf => 0xd2f8, 0xc0 => 0xd300, + 0xc1 => 0xd301, 0xc2 => 0xd303, 0xc3 => 0xd305, 0xc4 => 0xd30c, + 0xc5 => 0xd30d, 0xc6 => 0xd30e, 0xc7 => 0xd310, 0xc8 => 0xd314, + 0xc9 => 0xd316, 0xca => 0xd31c, 0xcb => 0xd31d, 0xcc => 0xd31f, + 0xcd => 0xd320, 0xce => 0xd321, 0xcf => 0xd325, 0xd0 => 0xd328, + 0xd1 => 0xd329, 0xd2 => 0xd32c, 0xd3 => 0xd330, 0xd4 => 0xd338, + 0xd5 => 0xd339, 0xd6 => 0xd33b, 0xd7 => 0xd33c, 0xd8 => 0xd33d, + 0xd9 => 0xd344, 0xda => 0xd345, 0xdb => 0xd37c, 0xdc => 0xd37d, + 0xdd => 0xd380, 0xde => 0xd384, 0xdf => 0xd38c, 0xe0 => 0xd38d, + 0xe1 => 0xd38f, 0xe2 => 0xd390, 0xe3 => 0xd391, 0xe4 => 0xd398, + 0xe5 => 0xd399, 0xe6 => 0xd39c, 0xe7 => 0xd3a0, 0xe8 => 0xd3a8, + 0xe9 => 0xd3a9, 0xea => 0xd3ab, 0xeb => 0xd3ad, 0xec => 0xd3b4, + 0xed => 0xd3b8, 0xee => 0xd3bc, 0xef => 0xd3c4, 0xf0 => 0xd3c5, + 0xf1 => 0xd3c8, 0xf2 => 0xd3c9, 0xf3 => 0xd3d0, 0xf4 => 0xd3d8, + 0xf5 => 0xd3e1, 0xf6 => 0xd3e3, 0xf7 => 0xd3ec, 0xf8 => 0xd3ed, + 0xf9 => 0xd3f0, 0xfa => 0xd3f4, 0xfb => 0xd3fc, 0xfc => 0xd3fd, + 0xfd => 0xd3ff, 0xfe => 0xd401, + }, + 0xc7 => { + 0xa1 => 0xd408, 0xa2 => 0xd41d, 0xa3 => 0xd440, 0xa4 => 0xd444, + 0xa5 => 0xd45c, 0xa6 => 0xd460, 0xa7 => 0xd464, 0xa8 => 0xd46d, + 0xa9 => 0xd46f, 0xaa => 0xd478, 0xab => 0xd479, 0xac => 0xd47c, + 0xad => 0xd47f, 0xae => 0xd480, 0xaf => 0xd482, 0xb0 => 0xd488, + 0xb1 => 0xd489, 0xb2 => 0xd48b, 0xb3 => 0xd48d, 0xb4 => 0xd494, + 0xb5 => 0xd4a9, 0xb6 => 0xd4cc, 0xb7 => 0xd4d0, 0xb8 => 0xd4d4, + 0xb9 => 0xd4dc, 0xba => 0xd4df, 0xbb => 0xd4e8, 0xbc => 0xd4ec, + 0xbd => 0xd4f0, 0xbe => 0xd4f8, 0xbf => 0xd4fb, 0xc0 => 0xd4fd, + 0xc1 => 0xd504, 0xc2 => 0xd508, 0xc3 => 0xd50c, 0xc4 => 0xd514, + 0xc5 => 0xd515, 0xc6 => 0xd517, 0xc7 => 0xd53c, 0xc8 => 0xd53d, + 0xc9 => 0xd540, 0xca => 0xd544, 0xcb => 0xd54c, 0xcc => 0xd54d, + 0xcd => 0xd54f, 0xce => 0xd551, 0xcf => 0xd558, 0xd0 => 0xd559, + 0xd1 => 0xd55c, 0xd2 => 0xd560, 0xd3 => 0xd565, 0xd4 => 0xd568, + 0xd5 => 0xd569, 0xd6 => 0xd56b, 0xd7 => 0xd56d, 0xd8 => 0xd574, + 0xd9 => 0xd575, 0xda => 0xd578, 0xdb => 0xd57c, 0xdc => 0xd584, + 0xdd => 0xd585, 0xde => 0xd587, 0xdf => 0xd588, 0xe0 => 0xd589, + 0xe1 => 0xd590, 0xe2 => 0xd5a5, 0xe3 => 0xd5c8, 0xe4 => 0xd5c9, + 0xe5 => 0xd5cc, 0xe6 => 0xd5d0, 0xe7 => 0xd5d2, 0xe8 => 0xd5d8, + 0xe9 => 0xd5d9, 0xea => 0xd5db, 0xeb => 0xd5dd, 0xec => 0xd5e4, + 0xed => 0xd5e5, 0xee => 0xd5e8, 0xef => 0xd5ec, 0xf0 => 0xd5f4, + 0xf1 => 0xd5f5, 0xf2 => 0xd5f7, 0xf3 => 0xd5f9, 0xf4 => 0xd600, + 0xf5 => 0xd601, 0xf6 => 0xd604, 0xf7 => 0xd608, 0xf8 => 0xd610, + 0xf9 => 0xd611, 0xfa => 0xd613, 0xfb => 0xd614, 0xfc => 0xd615, + 0xfd => 0xd61c, 0xfe => 0xd620, + }, + 0xc8 => { + 0xa1 => 0xd624, 0xa2 => 0xd62d, 0xa3 => 0xd638, 0xa4 => 0xd639, + 0xa5 => 0xd63c, 0xa6 => 0xd640, 0xa7 => 0xd645, 0xa8 => 0xd648, + 0xa9 => 0xd649, 0xaa => 0xd64b, 0xab => 0xd64d, 0xac => 0xd651, + 0xad => 0xd654, 0xae => 0xd655, 0xaf => 0xd658, 0xb0 => 0xd65c, + 0xb1 => 0xd667, 0xb2 => 0xd669, 0xb3 => 0xd670, 0xb4 => 0xd671, + 0xb5 => 0xd674, 0xb6 => 0xd683, 0xb7 => 0xd685, 0xb8 => 0xd68c, + 0xb9 => 0xd68d, 0xba => 0xd690, 0xbb => 0xd694, 0xbc => 0xd69d, + 0xbd => 0xd69f, 0xbe => 0xd6a1, 0xbf => 0xd6a8, 0xc0 => 0xd6ac, + 0xc1 => 0xd6b0, 0xc2 => 0xd6b9, 0xc3 => 0xd6bb, 0xc4 => 0xd6c4, + 0xc5 => 0xd6c5, 0xc6 => 0xd6c8, 0xc7 => 0xd6cc, 0xc8 => 0xd6d1, + 0xc9 => 0xd6d4, 0xca => 0xd6d7, 0xcb => 0xd6d9, 0xcc => 0xd6e0, + 0xcd => 0xd6e4, 0xce => 0xd6e8, 0xcf => 0xd6f0, 0xd0 => 0xd6f5, + 0xd1 => 0xd6fc, 0xd2 => 0xd6fd, 0xd3 => 0xd700, 0xd4 => 0xd704, + 0xd5 => 0xd711, 0xd6 => 0xd718, 0xd7 => 0xd719, 0xd8 => 0xd71c, + 0xd9 => 0xd720, 0xda => 0xd728, 0xdb => 0xd729, 0xdc => 0xd72b, + 0xdd => 0xd72d, 0xde => 0xd734, 0xdf => 0xd735, 0xe0 => 0xd738, + 0xe1 => 0xd73c, 0xe2 => 0xd744, 0xe3 => 0xd747, 0xe4 => 0xd749, + 0xe5 => 0xd750, 0xe6 => 0xd751, 0xe7 => 0xd754, 0xe8 => 0xd756, + 0xe9 => 0xd757, 0xea => 0xd758, 0xeb => 0xd759, 0xec => 0xd760, + 0xed => 0xd761, 0xee => 0xd763, 0xef => 0xd765, 0xf0 => 0xd769, + 0xf1 => 0xd76c, 0xf2 => 0xd770, 0xf3 => 0xd774, 0xf4 => 0xd77c, + 0xf5 => 0xd77d, 0xf6 => 0xd781, 0xf7 => 0xd788, 0xf8 => 0xd789, + 0xf9 => 0xd78c, 0xfa => 0xd790, 0xfb => 0xd798, 0xfc => 0xd799, + 0xfd => 0xd79b, 0xfe => 0xd79d, + }, + 0xca => { + 0xa1 => 0x4f3d, 0xa2 => 0x4f73, 0xa3 => 0x5047, 0xa4 => 0x50f9, + 0xa5 => 0x52a0, 0xa6 => 0x53ef, 0xa7 => 0x5475, 0xa8 => 0x54e5, + 0xa9 => 0x5609, 0xaa => 0x5ac1, 0xab => 0x5bb6, 0xac => 0x6687, + 0xad => 0x67b6, 0xae => 0x67b7, 0xaf => 0x67ef, 0xb0 => 0x6b4c, + 0xb1 => 0x73c2, 0xb2 => 0x75c2, 0xb3 => 0x7a3c, 0xb4 => 0x82db, + 0xb5 => 0x8304, 0xb6 => 0x8857, 0xb7 => 0x8888, 0xb8 => 0x8a36, + 0xb9 => 0x8cc8, 0xba => 0x8dcf, 0xbb => 0x8efb, 0xbc => 0x8fe6, + 0xbd => 0x99d5, 0xbe => 0x523b, 0xbf => 0x5374, 0xc0 => 0x5404, + 0xc1 => 0x606a, 0xc2 => 0x6164, 0xc3 => 0x6bbc, 0xc4 => 0x73cf, + 0xc5 => 0x811a, 0xc6 => 0x89ba, 0xc7 => 0x89d2, 0xc8 => 0x95a3, + 0xc9 => 0x4f83, 0xca => 0x520a, 0xcb => 0x58be, 0xcc => 0x5978, + 0xcd => 0x59e6, 0xce => 0x5e72, 0xcf => 0x5e79, 0xd0 => 0x61c7, + 0xd1 => 0x63c0, 0xd2 => 0x6746, 0xd3 => 0x67ec, 0xd4 => 0x687f, + 0xd5 => 0x6f97, 0xd6 => 0x764e, 0xd7 => 0x770b, 0xd8 => 0x78f5, + 0xd9 => 0x7a08, 0xda => 0x7aff, 0xdb => 0x7c21, 0xdc => 0x809d, + 0xdd => 0x826e, 0xde => 0x8271, 0xdf => 0x8aeb, 0xe0 => 0x9593, + 0xe1 => 0x4e6b, 0xe2 => 0x559d, 0xe3 => 0x66f7, 0xe4 => 0x6e34, + 0xe5 => 0x78a3, 0xe6 => 0x7aed, 0xe7 => 0x845b, 0xe8 => 0x8910, + 0xe9 => 0x874e, 0xea => 0x97a8, 0xeb => 0x52d8, 0xec => 0x574e, + 0xed => 0x582a, 0xee => 0x5d4c, 0xef => 0x611f, 0xf0 => 0x61be, + 0xf1 => 0x6221, 0xf2 => 0x6562, 0xf3 => 0x67d1, 0xf4 => 0x6a44, + 0xf5 => 0x6e1b, 0xf6 => 0x7518, 0xf7 => 0x75b3, 0xf8 => 0x76e3, + 0xf9 => 0x77b0, 0xfa => 0x7d3a, 0xfb => 0x90af, 0xfc => 0x9451, + 0xfd => 0x9452, 0xfe => 0x9f95, + }, + 0xcb => { + 0xa1 => 0x5323, 0xa2 => 0x5cac, 0xa3 => 0x7532, 0xa4 => 0x80db, + 0xa5 => 0x9240, 0xa6 => 0x9598, 0xa7 => 0x525b, 0xa8 => 0x5808, + 0xa9 => 0x59dc, 0xaa => 0x5ca1, 0xab => 0x5d17, 0xac => 0x5eb7, + 0xad => 0x5f3a, 0xae => 0x5f4a, 0xaf => 0x6177, 0xb0 => 0x6c5f, + 0xb1 => 0x757a, 0xb2 => 0x7586, 0xb3 => 0x7ce0, 0xb4 => 0x7d73, + 0xb5 => 0x7db1, 0xb6 => 0x7f8c, 0xb7 => 0x8154, 0xb8 => 0x8221, + 0xb9 => 0x8591, 0xba => 0x8941, 0xbb => 0x8b1b, 0xbc => 0x92fc, + 0xbd => 0x964d, 0xbe => 0x9c47, 0xbf => 0x4ecb, 0xc0 => 0x4ef7, + 0xc1 => 0x500b, 0xc2 => 0x51f1, 0xc3 => 0x584f, 0xc4 => 0x6137, + 0xc5 => 0x613e, 0xc6 => 0x6168, 0xc7 => 0x6539, 0xc8 => 0x69ea, + 0xc9 => 0x6f11, 0xca => 0x75a5, 0xcb => 0x7686, 0xcc => 0x76d6, + 0xcd => 0x7b87, 0xce => 0x82a5, 0xcf => 0x84cb, 0xd0 => 0xf900, + 0xd1 => 0x93a7, 0xd2 => 0x958b, 0xd3 => 0x5580, 0xd4 => 0x5ba2, + 0xd5 => 0x5751, 0xd6 => 0xf901, 0xd7 => 0x7cb3, 0xd8 => 0x7fb9, + 0xd9 => 0x91b5, 0xda => 0x5028, 0xdb => 0x53bb, 0xdc => 0x5c45, + 0xdd => 0x5de8, 0xde => 0x62d2, 0xdf => 0x636e, 0xe0 => 0x64da, + 0xe1 => 0x64e7, 0xe2 => 0x6e20, 0xe3 => 0x70ac, 0xe4 => 0x795b, + 0xe5 => 0x8ddd, 0xe6 => 0x8e1e, 0xe7 => 0xf902, 0xe8 => 0x907d, + 0xe9 => 0x9245, 0xea => 0x92f8, 0xeb => 0x4e7e, 0xec => 0x4ef6, + 0xed => 0x5065, 0xee => 0x5dfe, 0xef => 0x5efa, 0xf0 => 0x6106, + 0xf1 => 0x6957, 0xf2 => 0x8171, 0xf3 => 0x8654, 0xf4 => 0x8e47, + 0xf5 => 0x9375, 0xf6 => 0x9a2b, 0xf7 => 0x4e5e, 0xf8 => 0x5091, + 0xf9 => 0x6770, 0xfa => 0x6840, 0xfb => 0x5109, 0xfc => 0x528d, + 0xfd => 0x5292, 0xfe => 0x6aa2, + }, + 0xcc => { + 0xa1 => 0x77bc, 0xa2 => 0x9210, 0xa3 => 0x9ed4, 0xa4 => 0x52ab, + 0xa5 => 0x602f, 0xa6 => 0x8ff2, 0xa7 => 0x5048, 0xa8 => 0x61a9, + 0xa9 => 0x63ed, 0xaa => 0x64ca, 0xab => 0x683c, 0xac => 0x6a84, + 0xad => 0x6fc0, 0xae => 0x8188, 0xaf => 0x89a1, 0xb0 => 0x9694, + 0xb1 => 0x5805, 0xb2 => 0x727d, 0xb3 => 0x72ac, 0xb4 => 0x7504, + 0xb5 => 0x7d79, 0xb6 => 0x7e6d, 0xb7 => 0x80a9, 0xb8 => 0x898b, + 0xb9 => 0x8b74, 0xba => 0x9063, 0xbb => 0x9d51, 0xbc => 0x6289, + 0xbd => 0x6c7a, 0xbe => 0x6f54, 0xbf => 0x7d50, 0xc0 => 0x7f3a, + 0xc1 => 0x8a23, 0xc2 => 0x517c, 0xc3 => 0x614a, 0xc4 => 0x7b9d, + 0xc5 => 0x8b19, 0xc6 => 0x9257, 0xc7 => 0x938c, 0xc8 => 0x4eac, + 0xc9 => 0x4fd3, 0xca => 0x501e, 0xcb => 0x50be, 0xcc => 0x5106, + 0xcd => 0x52c1, 0xce => 0x52cd, 0xcf => 0x537f, 0xd0 => 0x5770, + 0xd1 => 0x5883, 0xd2 => 0x5e9a, 0xd3 => 0x5f91, 0xd4 => 0x6176, + 0xd5 => 0x61ac, 0xd6 => 0x64ce, 0xd7 => 0x656c, 0xd8 => 0x666f, + 0xd9 => 0x66bb, 0xda => 0x66f4, 0xdb => 0x6897, 0xdc => 0x6d87, + 0xdd => 0x7085, 0xde => 0x70f1, 0xdf => 0x749f, 0xe0 => 0x74a5, + 0xe1 => 0x74ca, 0xe2 => 0x75d9, 0xe3 => 0x786c, 0xe4 => 0x78ec, + 0xe5 => 0x7adf, 0xe6 => 0x7af6, 0xe7 => 0x7d45, 0xe8 => 0x7d93, + 0xe9 => 0x8015, 0xea => 0x803f, 0xeb => 0x811b, 0xec => 0x8396, + 0xed => 0x8b66, 0xee => 0x8f15, 0xef => 0x9015, 0xf0 => 0x93e1, + 0xf1 => 0x9803, 0xf2 => 0x9838, 0xf3 => 0x9a5a, 0xf4 => 0x9be8, + 0xf5 => 0x4fc2, 0xf6 => 0x5553, 0xf7 => 0x583a, 0xf8 => 0x5951, + 0xf9 => 0x5b63, 0xfa => 0x5c46, 0xfb => 0x60b8, 0xfc => 0x6212, + 0xfd => 0x6842, 0xfe => 0x68b0, + }, + 0xcd => { + 0xa1 => 0x68e8, 0xa2 => 0x6eaa, 0xa3 => 0x754c, 0xa4 => 0x7678, + 0xa5 => 0x78ce, 0xa6 => 0x7a3d, 0xa7 => 0x7cfb, 0xa8 => 0x7e6b, + 0xa9 => 0x7e7c, 0xaa => 0x8a08, 0xab => 0x8aa1, 0xac => 0x8c3f, + 0xad => 0x968e, 0xae => 0x9dc4, 0xaf => 0x53e4, 0xb0 => 0x53e9, + 0xb1 => 0x544a, 0xb2 => 0x5471, 0xb3 => 0x56fa, 0xb4 => 0x59d1, + 0xb5 => 0x5b64, 0xb6 => 0x5c3b, 0xb7 => 0x5eab, 0xb8 => 0x62f7, + 0xb9 => 0x6537, 0xba => 0x6545, 0xbb => 0x6572, 0xbc => 0x66a0, + 0xbd => 0x67af, 0xbe => 0x69c1, 0xbf => 0x6cbd, 0xc0 => 0x75fc, + 0xc1 => 0x7690, 0xc2 => 0x777e, 0xc3 => 0x7a3f, 0xc4 => 0x7f94, + 0xc5 => 0x8003, 0xc6 => 0x80a1, 0xc7 => 0x818f, 0xc8 => 0x82e6, + 0xc9 => 0x82fd, 0xca => 0x83f0, 0xcb => 0x85c1, 0xcc => 0x8831, + 0xcd => 0x88b4, 0xce => 0x8aa5, 0xcf => 0xf903, 0xd0 => 0x8f9c, + 0xd1 => 0x932e, 0xd2 => 0x96c7, 0xd3 => 0x9867, 0xd4 => 0x9ad8, + 0xd5 => 0x9f13, 0xd6 => 0x54ed, 0xd7 => 0x659b, 0xd8 => 0x66f2, + 0xd9 => 0x688f, 0xda => 0x7a40, 0xdb => 0x8c37, 0xdc => 0x9d60, + 0xdd => 0x56f0, 0xde => 0x5764, 0xdf => 0x5d11, 0xe0 => 0x6606, + 0xe1 => 0x68b1, 0xe2 => 0x68cd, 0xe3 => 0x6efe, 0xe4 => 0x7428, + 0xe5 => 0x889e, 0xe6 => 0x9be4, 0xe7 => 0x6c68, 0xe8 => 0xf904, + 0xe9 => 0x9aa8, 0xea => 0x4f9b, 0xeb => 0x516c, 0xec => 0x5171, + 0xed => 0x529f, 0xee => 0x5b54, 0xef => 0x5de5, 0xf0 => 0x6050, + 0xf1 => 0x606d, 0xf2 => 0x62f1, 0xf3 => 0x63a7, 0xf4 => 0x653b, + 0xf5 => 0x73d9, 0xf6 => 0x7a7a, 0xf7 => 0x86a3, 0xf8 => 0x8ca2, + 0xf9 => 0x978f, 0xfa => 0x4e32, 0xfb => 0x5be1, 0xfc => 0x6208, + 0xfd => 0x679c, 0xfe => 0x74dc, + }, + 0xce => { + 0xa1 => 0x79d1, 0xa2 => 0x83d3, 0xa3 => 0x8a87, 0xa4 => 0x8ab2, + 0xa5 => 0x8de8, 0xa6 => 0x904e, 0xa7 => 0x934b, 0xa8 => 0x9846, + 0xa9 => 0x5ed3, 0xaa => 0x69e8, 0xab => 0x85ff, 0xac => 0x90ed, + 0xad => 0xf905, 0xae => 0x51a0, 0xaf => 0x5b98, 0xb0 => 0x5bec, + 0xb1 => 0x6163, 0xb2 => 0x68fa, 0xb3 => 0x6b3e, 0xb4 => 0x704c, + 0xb5 => 0x742f, 0xb6 => 0x74d8, 0xb7 => 0x7ba1, 0xb8 => 0x7f50, + 0xb9 => 0x83c5, 0xba => 0x89c0, 0xbb => 0x8cab, 0xbc => 0x95dc, + 0xbd => 0x9928, 0xbe => 0x522e, 0xbf => 0x605d, 0xc0 => 0x62ec, + 0xc1 => 0x9002, 0xc2 => 0x4f8a, 0xc3 => 0x5149, 0xc4 => 0x5321, + 0xc5 => 0x58d9, 0xc6 => 0x5ee3, 0xc7 => 0x66e0, 0xc8 => 0x6d38, + 0xc9 => 0x709a, 0xca => 0x72c2, 0xcb => 0x73d6, 0xcc => 0x7b50, + 0xcd => 0x80f1, 0xce => 0x945b, 0xcf => 0x5366, 0xd0 => 0x639b, + 0xd1 => 0x7f6b, 0xd2 => 0x4e56, 0xd3 => 0x5080, 0xd4 => 0x584a, + 0xd5 => 0x58de, 0xd6 => 0x602a, 0xd7 => 0x6127, 0xd8 => 0x62d0, + 0xd9 => 0x69d0, 0xda => 0x9b41, 0xdb => 0x5b8f, 0xdc => 0x7d18, + 0xdd => 0x80b1, 0xde => 0x8f5f, 0xdf => 0x4ea4, 0xe0 => 0x50d1, + 0xe1 => 0x54ac, 0xe2 => 0x55ac, 0xe3 => 0x5b0c, 0xe4 => 0x5da0, + 0xe5 => 0x5de7, 0xe6 => 0x652a, 0xe7 => 0x654e, 0xe8 => 0x6821, + 0xe9 => 0x6a4b, 0xea => 0x72e1, 0xeb => 0x768e, 0xec => 0x77ef, + 0xed => 0x7d5e, 0xee => 0x7ff9, 0xef => 0x81a0, 0xf0 => 0x854e, + 0xf1 => 0x86df, 0xf2 => 0x8f03, 0xf3 => 0x8f4e, 0xf4 => 0x90ca, + 0xf5 => 0x9903, 0xf6 => 0x9a55, 0xf7 => 0x9bab, 0xf8 => 0x4e18, + 0xf9 => 0x4e45, 0xfa => 0x4e5d, 0xfb => 0x4ec7, 0xfc => 0x4ff1, + 0xfd => 0x5177, 0xfe => 0x52fe, + }, + 0xcf => { + 0xa1 => 0x5340, 0xa2 => 0x53e3, 0xa3 => 0x53e5, 0xa4 => 0x548e, + 0xa5 => 0x5614, 0xa6 => 0x5775, 0xa7 => 0x57a2, 0xa8 => 0x5bc7, + 0xa9 => 0x5d87, 0xaa => 0x5ed0, 0xab => 0x61fc, 0xac => 0x62d8, + 0xad => 0x6551, 0xae => 0x67b8, 0xaf => 0x67e9, 0xb0 => 0x69cb, + 0xb1 => 0x6b50, 0xb2 => 0x6bc6, 0xb3 => 0x6bec, 0xb4 => 0x6c42, + 0xb5 => 0x6e9d, 0xb6 => 0x7078, 0xb7 => 0x72d7, 0xb8 => 0x7396, + 0xb9 => 0x7403, 0xba => 0x77bf, 0xbb => 0x77e9, 0xbc => 0x7a76, + 0xbd => 0x7d7f, 0xbe => 0x8009, 0xbf => 0x81fc, 0xc0 => 0x8205, + 0xc1 => 0x820a, 0xc2 => 0x82df, 0xc3 => 0x8862, 0xc4 => 0x8b33, + 0xc5 => 0x8cfc, 0xc6 => 0x8ec0, 0xc7 => 0x9011, 0xc8 => 0x90b1, + 0xc9 => 0x9264, 0xca => 0x92b6, 0xcb => 0x99d2, 0xcc => 0x9a45, + 0xcd => 0x9ce9, 0xce => 0x9dd7, 0xcf => 0x9f9c, 0xd0 => 0x570b, + 0xd1 => 0x5c40, 0xd2 => 0x83ca, 0xd3 => 0x97a0, 0xd4 => 0x97ab, + 0xd5 => 0x9eb4, 0xd6 => 0x541b, 0xd7 => 0x7a98, 0xd8 => 0x7fa4, + 0xd9 => 0x88d9, 0xda => 0x8ecd, 0xdb => 0x90e1, 0xdc => 0x5800, + 0xdd => 0x5c48, 0xde => 0x6398, 0xdf => 0x7a9f, 0xe0 => 0x5bae, + 0xe1 => 0x5f13, 0xe2 => 0x7a79, 0xe3 => 0x7aae, 0xe4 => 0x828e, + 0xe5 => 0x8eac, 0xe6 => 0x5026, 0xe7 => 0x5238, 0xe8 => 0x52f8, + 0xe9 => 0x5377, 0xea => 0x5708, 0xeb => 0x62f3, 0xec => 0x6372, + 0xed => 0x6b0a, 0xee => 0x6dc3, 0xef => 0x7737, 0xf0 => 0x53a5, + 0xf1 => 0x7357, 0xf2 => 0x8568, 0xf3 => 0x8e76, 0xf4 => 0x95d5, + 0xf5 => 0x673a, 0xf6 => 0x6ac3, 0xf7 => 0x6f70, 0xf8 => 0x8a6d, + 0xf9 => 0x8ecc, 0xfa => 0x994b, 0xfb => 0xf906, 0xfc => 0x6677, + 0xfd => 0x6b78, 0xfe => 0x8cb4, + }, + 0xd0 => { + 0xa1 => 0x9b3c, 0xa2 => 0xf907, 0xa3 => 0x53eb, 0xa4 => 0x572d, + 0xa5 => 0x594e, 0xa6 => 0x63c6, 0xa7 => 0x69fb, 0xa8 => 0x73ea, + 0xa9 => 0x7845, 0xaa => 0x7aba, 0xab => 0x7ac5, 0xac => 0x7cfe, + 0xad => 0x8475, 0xae => 0x898f, 0xaf => 0x8d73, 0xb0 => 0x9035, + 0xb1 => 0x95a8, 0xb2 => 0x52fb, 0xb3 => 0x5747, 0xb4 => 0x7547, + 0xb5 => 0x7b60, 0xb6 => 0x83cc, 0xb7 => 0x921e, 0xb8 => 0xf908, + 0xb9 => 0x6a58, 0xba => 0x514b, 0xbb => 0x524b, 0xbc => 0x5287, + 0xbd => 0x621f, 0xbe => 0x68d8, 0xbf => 0x6975, 0xc0 => 0x9699, + 0xc1 => 0x50c5, 0xc2 => 0x52a4, 0xc3 => 0x52e4, 0xc4 => 0x61c3, + 0xc5 => 0x65a4, 0xc6 => 0x6839, 0xc7 => 0x69ff, 0xc8 => 0x747e, + 0xc9 => 0x7b4b, 0xca => 0x82b9, 0xcb => 0x83eb, 0xcc => 0x89b2, + 0xcd => 0x8b39, 0xce => 0x8fd1, 0xcf => 0x9949, 0xd0 => 0xf909, + 0xd1 => 0x4eca, 0xd2 => 0x5997, 0xd3 => 0x64d2, 0xd4 => 0x6611, + 0xd5 => 0x6a8e, 0xd6 => 0x7434, 0xd7 => 0x7981, 0xd8 => 0x79bd, + 0xd9 => 0x82a9, 0xda => 0x887e, 0xdb => 0x887f, 0xdc => 0x895f, + 0xdd => 0xf90a, 0xde => 0x9326, 0xdf => 0x4f0b, 0xe0 => 0x53ca, + 0xe1 => 0x6025, 0xe2 => 0x6271, 0xe3 => 0x6c72, 0xe4 => 0x7d1a, + 0xe5 => 0x7d66, 0xe6 => 0x4e98, 0xe7 => 0x5162, 0xe8 => 0x77dc, + 0xe9 => 0x80af, 0xea => 0x4f01, 0xeb => 0x4f0e, 0xec => 0x5176, + 0xed => 0x5180, 0xee => 0x55dc, 0xef => 0x5668, 0xf0 => 0x573b, + 0xf1 => 0x57fa, 0xf2 => 0x57fc, 0xf3 => 0x5914, 0xf4 => 0x5947, + 0xf5 => 0x5993, 0xf6 => 0x5bc4, 0xf7 => 0x5c90, 0xf8 => 0x5d0e, + 0xf9 => 0x5df1, 0xfa => 0x5e7e, 0xfb => 0x5fcc, 0xfc => 0x6280, + 0xfd => 0x65d7, 0xfe => 0x65e3, + }, + 0xd1 => { + 0xa1 => 0x671e, 0xa2 => 0x671f, 0xa3 => 0x675e, 0xa4 => 0x68cb, + 0xa5 => 0x68c4, 0xa6 => 0x6a5f, 0xa7 => 0x6b3a, 0xa8 => 0x6c23, + 0xa9 => 0x6c7d, 0xaa => 0x6c82, 0xab => 0x6dc7, 0xac => 0x7398, + 0xad => 0x7426, 0xae => 0x742a, 0xaf => 0x7482, 0xb0 => 0x74a3, + 0xb1 => 0x7578, 0xb2 => 0x757f, 0xb3 => 0x7881, 0xb4 => 0x78ef, + 0xb5 => 0x7941, 0xb6 => 0x7947, 0xb7 => 0x7948, 0xb8 => 0x797a, + 0xb9 => 0x7b95, 0xba => 0x7d00, 0xbb => 0x7dba, 0xbc => 0x7f88, + 0xbd => 0x8006, 0xbe => 0x802d, 0xbf => 0x808c, 0xc0 => 0x8a18, + 0xc1 => 0x8b4f, 0xc2 => 0x8c48, 0xc3 => 0x8d77, 0xc4 => 0x9321, + 0xc5 => 0x9324, 0xc6 => 0x98e2, 0xc7 => 0x9951, 0xc8 => 0x9a0e, + 0xc9 => 0x9a0f, 0xca => 0x9a65, 0xcb => 0x9e92, 0xcc => 0x7dca, + 0xcd => 0x4f76, 0xce => 0x5409, 0xcf => 0x62ee, 0xd0 => 0x6854, + 0xd1 => 0x91d1, 0xd2 => 0x55ab, 0xd3 => 0x513a, 0xd4 => 0xf90b, + 0xd5 => 0xf90c, 0xd6 => 0x5a1c, 0xd7 => 0x61e6, 0xd8 => 0xf90d, + 0xd9 => 0x62cf, 0xda => 0x62ff, 0xdb => 0xf90e, 0xdc => 0xf90f, + 0xdd => 0xf910, 0xde => 0xf911, 0xdf => 0xf912, 0xe0 => 0xf913, + 0xe1 => 0x90a3, 0xe2 => 0xf914, 0xe3 => 0xf915, 0xe4 => 0xf916, + 0xe5 => 0xf917, 0xe6 => 0xf918, 0xe7 => 0x8afe, 0xe8 => 0xf919, + 0xe9 => 0xf91a, 0xea => 0xf91b, 0xeb => 0xf91c, 0xec => 0x6696, + 0xed => 0xf91d, 0xee => 0x7156, 0xef => 0xf91e, 0xf0 => 0xf91f, + 0xf1 => 0x96e3, 0xf2 => 0xf920, 0xf3 => 0x634f, 0xf4 => 0x637a, + 0xf5 => 0x5357, 0xf6 => 0xf921, 0xf7 => 0x678f, 0xf8 => 0x6960, + 0xf9 => 0x6e73, 0xfa => 0xf922, 0xfb => 0x7537, 0xfc => 0xf923, + 0xfd => 0xf924, 0xfe => 0xf925, + }, + 0xd2 => { + 0xa1 => 0x7d0d, 0xa2 => 0xf926, 0xa3 => 0xf927, 0xa4 => 0x8872, + 0xa5 => 0x56ca, 0xa6 => 0x5a18, 0xa7 => 0xf928, 0xa8 => 0xf929, + 0xa9 => 0xf92a, 0xaa => 0xf92b, 0xab => 0xf92c, 0xac => 0x4e43, + 0xad => 0xf92d, 0xae => 0x5167, 0xaf => 0x5948, 0xb0 => 0x67f0, + 0xb1 => 0x8010, 0xb2 => 0xf92e, 0xb3 => 0x5973, 0xb4 => 0x5e74, + 0xb5 => 0x649a, 0xb6 => 0x79ca, 0xb7 => 0x5ff5, 0xb8 => 0x606c, + 0xb9 => 0x62c8, 0xba => 0x637b, 0xbb => 0x5be7, 0xbc => 0x5bd7, + 0xbd => 0x52aa, 0xbe => 0xf92f, 0xbf => 0x5974, 0xc0 => 0x5f29, + 0xc1 => 0x6012, 0xc2 => 0xf930, 0xc3 => 0xf931, 0xc4 => 0xf932, + 0xc5 => 0x7459, 0xc6 => 0xf933, 0xc7 => 0xf934, 0xc8 => 0xf935, + 0xc9 => 0xf936, 0xca => 0xf937, 0xcb => 0xf938, 0xcc => 0x99d1, + 0xcd => 0xf939, 0xce => 0xf93a, 0xcf => 0xf93b, 0xd0 => 0xf93c, + 0xd1 => 0xf93d, 0xd2 => 0xf93e, 0xd3 => 0xf93f, 0xd4 => 0xf940, + 0xd5 => 0xf941, 0xd6 => 0xf942, 0xd7 => 0xf943, 0xd8 => 0x6fc3, + 0xd9 => 0xf944, 0xda => 0xf945, 0xdb => 0x81bf, 0xdc => 0x8fb2, + 0xdd => 0x60f1, 0xde => 0xf946, 0xdf => 0xf947, 0xe0 => 0x8166, + 0xe1 => 0xf948, 0xe2 => 0xf949, 0xe3 => 0x5c3f, 0xe4 => 0xf94a, + 0xe5 => 0xf94b, 0xe6 => 0xf94c, 0xe7 => 0xf94d, 0xe8 => 0xf94e, + 0xe9 => 0xf94f, 0xea => 0xf950, 0xeb => 0xf951, 0xec => 0x5ae9, + 0xed => 0x8a25, 0xee => 0x677b, 0xef => 0x7d10, 0xf0 => 0xf952, + 0xf1 => 0xf953, 0xf2 => 0xf954, 0xf3 => 0xf955, 0xf4 => 0xf956, + 0xf5 => 0xf957, 0xf6 => 0x80fd, 0xf7 => 0xf958, 0xf8 => 0xf959, + 0xf9 => 0x5c3c, 0xfa => 0x6ce5, 0xfb => 0x533f, 0xfc => 0x6eba, + 0xfd => 0x591a, 0xfe => 0x8336, + }, + 0xd3 => { + 0xa1 => 0x4e39, 0xa2 => 0x4eb6, 0xa3 => 0x4f46, 0xa4 => 0x55ae, + 0xa5 => 0x5718, 0xa6 => 0x58c7, 0xa7 => 0x5f56, 0xa8 => 0x65b7, + 0xa9 => 0x65e6, 0xaa => 0x6a80, 0xab => 0x6bb5, 0xac => 0x6e4d, + 0xad => 0x77ed, 0xae => 0x7aef, 0xaf => 0x7c1e, 0xb0 => 0x7dde, + 0xb1 => 0x86cb, 0xb2 => 0x8892, 0xb3 => 0x9132, 0xb4 => 0x935b, + 0xb5 => 0x64bb, 0xb6 => 0x6fbe, 0xb7 => 0x737a, 0xb8 => 0x75b8, + 0xb9 => 0x9054, 0xba => 0x5556, 0xbb => 0x574d, 0xbc => 0x61ba, + 0xbd => 0x64d4, 0xbe => 0x66c7, 0xbf => 0x6de1, 0xc0 => 0x6e5b, + 0xc1 => 0x6f6d, 0xc2 => 0x6fb9, 0xc3 => 0x75f0, 0xc4 => 0x8043, + 0xc5 => 0x81bd, 0xc6 => 0x8541, 0xc7 => 0x8983, 0xc8 => 0x8ac7, + 0xc9 => 0x8b5a, 0xca => 0x931f, 0xcb => 0x6c93, 0xcc => 0x7553, + 0xcd => 0x7b54, 0xce => 0x8e0f, 0xcf => 0x905d, 0xd0 => 0x5510, + 0xd1 => 0x5802, 0xd2 => 0x5858, 0xd3 => 0x5e62, 0xd4 => 0x6207, + 0xd5 => 0x649e, 0xd6 => 0x68e0, 0xd7 => 0x7576, 0xd8 => 0x7cd6, + 0xd9 => 0x87b3, 0xda => 0x9ee8, 0xdb => 0x4ee3, 0xdc => 0x5788, + 0xdd => 0x576e, 0xde => 0x5927, 0xdf => 0x5c0d, 0xe0 => 0x5cb1, + 0xe1 => 0x5e36, 0xe2 => 0x5f85, 0xe3 => 0x6234, 0xe4 => 0x64e1, + 0xe5 => 0x73b3, 0xe6 => 0x81fa, 0xe7 => 0x888b, 0xe8 => 0x8cb8, + 0xe9 => 0x968a, 0xea => 0x9edb, 0xeb => 0x5b85, 0xec => 0x5fb7, + 0xed => 0x60b3, 0xee => 0x5012, 0xef => 0x5200, 0xf0 => 0x5230, + 0xf1 => 0x5716, 0xf2 => 0x5835, 0xf3 => 0x5857, 0xf4 => 0x5c0e, + 0xf5 => 0x5c60, 0xf6 => 0x5cf6, 0xf7 => 0x5d8b, 0xf8 => 0x5ea6, + 0xf9 => 0x5f92, 0xfa => 0x60bc, 0xfb => 0x6311, 0xfc => 0x6389, + 0xfd => 0x6417, 0xfe => 0x6843, + }, + 0xd4 => { + 0xa1 => 0x68f9, 0xa2 => 0x6ac2, 0xa3 => 0x6dd8, 0xa4 => 0x6e21, + 0xa5 => 0x6ed4, 0xa6 => 0x6fe4, 0xa7 => 0x71fe, 0xa8 => 0x76dc, + 0xa9 => 0x7779, 0xaa => 0x79b1, 0xab => 0x7a3b, 0xac => 0x8404, + 0xad => 0x89a9, 0xae => 0x8ced, 0xaf => 0x8df3, 0xb0 => 0x8e48, + 0xb1 => 0x9003, 0xb2 => 0x9014, 0xb3 => 0x9053, 0xb4 => 0x90fd, + 0xb5 => 0x934d, 0xb6 => 0x9676, 0xb7 => 0x97dc, 0xb8 => 0x6bd2, + 0xb9 => 0x7006, 0xba => 0x7258, 0xbb => 0x72a2, 0xbc => 0x7368, + 0xbd => 0x7763, 0xbe => 0x79bf, 0xbf => 0x7be4, 0xc0 => 0x7e9b, + 0xc1 => 0x8b80, 0xc2 => 0x58a9, 0xc3 => 0x60c7, 0xc4 => 0x6566, + 0xc5 => 0x65fd, 0xc6 => 0x66be, 0xc7 => 0x6c8c, 0xc8 => 0x711e, + 0xc9 => 0x71c9, 0xca => 0x8c5a, 0xcb => 0x9813, 0xcc => 0x4e6d, + 0xcd => 0x7a81, 0xce => 0x4edd, 0xcf => 0x51ac, 0xd0 => 0x51cd, + 0xd1 => 0x52d5, 0xd2 => 0x540c, 0xd3 => 0x61a7, 0xd4 => 0x6771, + 0xd5 => 0x6850, 0xd6 => 0x68df, 0xd7 => 0x6d1e, 0xd8 => 0x6f7c, + 0xd9 => 0x75bc, 0xda => 0x77b3, 0xdb => 0x7ae5, 0xdc => 0x80f4, + 0xdd => 0x8463, 0xde => 0x9285, 0xdf => 0x515c, 0xe0 => 0x6597, + 0xe1 => 0x675c, 0xe2 => 0x6793, 0xe3 => 0x75d8, 0xe4 => 0x7ac7, + 0xe5 => 0x8373, 0xe6 => 0xf95a, 0xe7 => 0x8c46, 0xe8 => 0x9017, + 0xe9 => 0x982d, 0xea => 0x5c6f, 0xeb => 0x81c0, 0xec => 0x829a, + 0xed => 0x9041, 0xee => 0x906f, 0xef => 0x920d, 0xf0 => 0x5f97, + 0xf1 => 0x5d9d, 0xf2 => 0x6a59, 0xf3 => 0x71c8, 0xf4 => 0x767b, + 0xf5 => 0x7b49, 0xf6 => 0x85e4, 0xf7 => 0x8b04, 0xf8 => 0x9127, + 0xf9 => 0x9a30, 0xfa => 0x5587, 0xfb => 0x61f6, 0xfc => 0xf95b, + 0xfd => 0x7669, 0xfe => 0x7f85, + }, + 0xd5 => { + 0xa1 => 0x863f, 0xa2 => 0x87ba, 0xa3 => 0x88f8, 0xa4 => 0x908f, + 0xa5 => 0xf95c, 0xa6 => 0x6d1b, 0xa7 => 0x70d9, 0xa8 => 0x73de, + 0xa9 => 0x7d61, 0xaa => 0x843d, 0xab => 0xf95d, 0xac => 0x916a, + 0xad => 0x99f1, 0xae => 0xf95e, 0xaf => 0x4e82, 0xb0 => 0x5375, + 0xb1 => 0x6b04, 0xb2 => 0x6b12, 0xb3 => 0x703e, 0xb4 => 0x721b, + 0xb5 => 0x862d, 0xb6 => 0x9e1e, 0xb7 => 0x524c, 0xb8 => 0x8fa3, + 0xb9 => 0x5d50, 0xba => 0x64e5, 0xbb => 0x652c, 0xbc => 0x6b16, + 0xbd => 0x6feb, 0xbe => 0x7c43, 0xbf => 0x7e9c, 0xc0 => 0x85cd, + 0xc1 => 0x8964, 0xc2 => 0x89bd, 0xc3 => 0x62c9, 0xc4 => 0x81d8, + 0xc5 => 0x881f, 0xc6 => 0x5eca, 0xc7 => 0x6717, 0xc8 => 0x6d6a, + 0xc9 => 0x72fc, 0xca => 0x7405, 0xcb => 0x746f, 0xcc => 0x8782, + 0xcd => 0x90de, 0xce => 0x4f86, 0xcf => 0x5d0d, 0xd0 => 0x5fa0, + 0xd1 => 0x840a, 0xd2 => 0x51b7, 0xd3 => 0x63a0, 0xd4 => 0x7565, + 0xd5 => 0x4eae, 0xd6 => 0x5006, 0xd7 => 0x5169, 0xd8 => 0x51c9, + 0xd9 => 0x6881, 0xda => 0x6a11, 0xdb => 0x7cae, 0xdc => 0x7cb1, + 0xdd => 0x7ce7, 0xde => 0x826f, 0xdf => 0x8ad2, 0xe0 => 0x8f1b, + 0xe1 => 0x91cf, 0xe2 => 0x4fb6, 0xe3 => 0x5137, 0xe4 => 0x52f5, + 0xe5 => 0x5442, 0xe6 => 0x5eec, 0xe7 => 0x616e, 0xe8 => 0x623e, + 0xe9 => 0x65c5, 0xea => 0x6ada, 0xeb => 0x6ffe, 0xec => 0x792a, + 0xed => 0x85dc, 0xee => 0x8823, 0xef => 0x95ad, 0xf0 => 0x9a62, + 0xf1 => 0x9a6a, 0xf2 => 0x9e97, 0xf3 => 0x9ece, 0xf4 => 0x529b, + 0xf5 => 0x66c6, 0xf6 => 0x6b77, 0xf7 => 0x701d, 0xf8 => 0x792b, + 0xf9 => 0x8f62, 0xfa => 0x9742, 0xfb => 0x6190, 0xfc => 0x6200, + 0xfd => 0x6523, 0xfe => 0x6f23, + }, + 0xd6 => { + 0xa1 => 0x7149, 0xa2 => 0x7489, 0xa3 => 0x7df4, 0xa4 => 0x806f, + 0xa5 => 0x84ee, 0xa6 => 0x8f26, 0xa7 => 0x9023, 0xa8 => 0x934a, + 0xa9 => 0x51bd, 0xaa => 0x5217, 0xab => 0x52a3, 0xac => 0x6d0c, + 0xad => 0x70c8, 0xae => 0x88c2, 0xaf => 0x5ec9, 0xb0 => 0x6582, + 0xb1 => 0x6bae, 0xb2 => 0x6fc2, 0xb3 => 0x7c3e, 0xb4 => 0x7375, + 0xb5 => 0x4ee4, 0xb6 => 0x4f36, 0xb7 => 0x56f9, 0xb8 => 0xf95f, + 0xb9 => 0x5cba, 0xba => 0x5dba, 0xbb => 0x601c, 0xbc => 0x73b2, + 0xbd => 0x7b2d, 0xbe => 0x7f9a, 0xbf => 0x7fce, 0xc0 => 0x8046, + 0xc1 => 0x901e, 0xc2 => 0x9234, 0xc3 => 0x96f6, 0xc4 => 0x9748, + 0xc5 => 0x9818, 0xc6 => 0x9f61, 0xc7 => 0x4f8b, 0xc8 => 0x6fa7, + 0xc9 => 0x79ae, 0xca => 0x91b4, 0xcb => 0x96b7, 0xcc => 0x52de, + 0xcd => 0xf960, 0xce => 0x6488, 0xcf => 0x64c4, 0xd0 => 0x6ad3, + 0xd1 => 0x6f5e, 0xd2 => 0x7018, 0xd3 => 0x7210, 0xd4 => 0x76e7, + 0xd5 => 0x8001, 0xd6 => 0x8606, 0xd7 => 0x865c, 0xd8 => 0x8def, + 0xd9 => 0x8f05, 0xda => 0x9732, 0xdb => 0x9b6f, 0xdc => 0x9dfa, + 0xdd => 0x9e75, 0xde => 0x788c, 0xdf => 0x797f, 0xe0 => 0x7da0, + 0xe1 => 0x83c9, 0xe2 => 0x9304, 0xe3 => 0x9e7f, 0xe4 => 0x9e93, + 0xe5 => 0x8ad6, 0xe6 => 0x58df, 0xe7 => 0x5f04, 0xe8 => 0x6727, + 0xe9 => 0x7027, 0xea => 0x74cf, 0xeb => 0x7c60, 0xec => 0x807e, + 0xed => 0x5121, 0xee => 0x7028, 0xef => 0x7262, 0xf0 => 0x78ca, + 0xf1 => 0x8cc2, 0xf2 => 0x8cda, 0xf3 => 0x8cf4, 0xf4 => 0x96f7, + 0xf5 => 0x4e86, 0xf6 => 0x50da, 0xf7 => 0x5bee, 0xf8 => 0x5ed6, + 0xf9 => 0x6599, 0xfa => 0x71ce, 0xfb => 0x7642, 0xfc => 0x77ad, + 0xfd => 0x804a, 0xfe => 0x84fc, + }, + 0xd7 => { + 0xa1 => 0x907c, 0xa2 => 0x9b27, 0xa3 => 0x9f8d, 0xa4 => 0x58d8, + 0xa5 => 0x5a41, 0xa6 => 0x5c62, 0xa7 => 0x6a13, 0xa8 => 0x6dda, + 0xa9 => 0x6f0f, 0xaa => 0x763b, 0xab => 0x7d2f, 0xac => 0x7e37, + 0xad => 0x851e, 0xae => 0x8938, 0xaf => 0x93e4, 0xb0 => 0x964b, + 0xb1 => 0x5289, 0xb2 => 0x65d2, 0xb3 => 0x67f3, 0xb4 => 0x69b4, + 0xb5 => 0x6d41, 0xb6 => 0x6e9c, 0xb7 => 0x700f, 0xb8 => 0x7409, + 0xb9 => 0x7460, 0xba => 0x7559, 0xbb => 0x7624, 0xbc => 0x786b, + 0xbd => 0x8b2c, 0xbe => 0x985e, 0xbf => 0x516d, 0xc0 => 0x622e, + 0xc1 => 0x9678, 0xc2 => 0x4f96, 0xc3 => 0x502b, 0xc4 => 0x5d19, + 0xc5 => 0x6dea, 0xc6 => 0x7db8, 0xc7 => 0x8f2a, 0xc8 => 0x5f8b, + 0xc9 => 0x6144, 0xca => 0x6817, 0xcb => 0xf961, 0xcc => 0x9686, + 0xcd => 0x52d2, 0xce => 0x808b, 0xcf => 0x51dc, 0xd0 => 0x51cc, + 0xd1 => 0x695e, 0xd2 => 0x7a1c, 0xd3 => 0x7dbe, 0xd4 => 0x83f1, + 0xd5 => 0x9675, 0xd6 => 0x4fda, 0xd7 => 0x5229, 0xd8 => 0x5398, + 0xd9 => 0x540f, 0xda => 0x550e, 0xdb => 0x5c65, 0xdc => 0x60a7, + 0xdd => 0x674e, 0xde => 0x68a8, 0xdf => 0x6d6c, 0xe0 => 0x7281, + 0xe1 => 0x72f8, 0xe2 => 0x7406, 0xe3 => 0x7483, 0xe4 => 0xf962, + 0xe5 => 0x75e2, 0xe6 => 0x7c6c, 0xe7 => 0x7f79, 0xe8 => 0x7fb8, + 0xe9 => 0x8389, 0xea => 0x88cf, 0xeb => 0x88e1, 0xec => 0x91cc, + 0xed => 0x91d0, 0xee => 0x96e2, 0xef => 0x9bc9, 0xf0 => 0x541d, + 0xf1 => 0x6f7e, 0xf2 => 0x71d0, 0xf3 => 0x7498, 0xf4 => 0x85fa, + 0xf5 => 0x8eaa, 0xf6 => 0x96a3, 0xf7 => 0x9c57, 0xf8 => 0x9e9f, + 0xf9 => 0x6797, 0xfa => 0x6dcb, 0xfb => 0x7433, 0xfc => 0x81e8, + 0xfd => 0x9716, 0xfe => 0x782c, + }, + 0xd8 => { + 0xa1 => 0x7acb, 0xa2 => 0x7b20, 0xa3 => 0x7c92, 0xa4 => 0x6469, + 0xa5 => 0x746a, 0xa6 => 0x75f2, 0xa7 => 0x78bc, 0xa8 => 0x78e8, + 0xa9 => 0x99ac, 0xaa => 0x9b54, 0xab => 0x9ebb, 0xac => 0x5bde, + 0xad => 0x5e55, 0xae => 0x6f20, 0xaf => 0x819c, 0xb0 => 0x83ab, + 0xb1 => 0x9088, 0xb2 => 0x4e07, 0xb3 => 0x534d, 0xb4 => 0x5a29, + 0xb5 => 0x5dd2, 0xb6 => 0x5f4e, 0xb7 => 0x6162, 0xb8 => 0x633d, + 0xb9 => 0x6669, 0xba => 0x66fc, 0xbb => 0x6eff, 0xbc => 0x6f2b, + 0xbd => 0x7063, 0xbe => 0x779e, 0xbf => 0x842c, 0xc0 => 0x8513, + 0xc1 => 0x883b, 0xc2 => 0x8f13, 0xc3 => 0x9945, 0xc4 => 0x9c3b, + 0xc5 => 0x551c, 0xc6 => 0x62b9, 0xc7 => 0x672b, 0xc8 => 0x6cab, + 0xc9 => 0x8309, 0xca => 0x896a, 0xcb => 0x977a, 0xcc => 0x4ea1, + 0xcd => 0x5984, 0xce => 0x5fd8, 0xcf => 0x5fd9, 0xd0 => 0x671b, + 0xd1 => 0x7db2, 0xd2 => 0x7f54, 0xd3 => 0x8292, 0xd4 => 0x832b, + 0xd5 => 0x83bd, 0xd6 => 0x8f1e, 0xd7 => 0x9099, 0xd8 => 0x57cb, + 0xd9 => 0x59b9, 0xda => 0x5a92, 0xdb => 0x5bd0, 0xdc => 0x6627, + 0xdd => 0x679a, 0xde => 0x6885, 0xdf => 0x6bcf, 0xe0 => 0x7164, + 0xe1 => 0x7f75, 0xe2 => 0x8cb7, 0xe3 => 0x8ce3, 0xe4 => 0x9081, + 0xe5 => 0x9b45, 0xe6 => 0x8108, 0xe7 => 0x8c8a, 0xe8 => 0x964c, + 0xe9 => 0x9a40, 0xea => 0x9ea5, 0xeb => 0x5b5f, 0xec => 0x6c13, + 0xed => 0x731b, 0xee => 0x76f2, 0xef => 0x76df, 0xf0 => 0x840c, + 0xf1 => 0x51aa, 0xf2 => 0x8993, 0xf3 => 0x514d, 0xf4 => 0x5195, + 0xf5 => 0x52c9, 0xf6 => 0x68c9, 0xf7 => 0x6c94, 0xf8 => 0x7704, + 0xf9 => 0x7720, 0xfa => 0x7dbf, 0xfb => 0x7dec, 0xfc => 0x9762, + 0xfd => 0x9eb5, 0xfe => 0x6ec5, + }, + 0xd9 => { + 0xa1 => 0x8511, 0xa2 => 0x51a5, 0xa3 => 0x540d, 0xa4 => 0x547d, + 0xa5 => 0x660e, 0xa6 => 0x669d, 0xa7 => 0x6927, 0xa8 => 0x6e9f, + 0xa9 => 0x76bf, 0xaa => 0x7791, 0xab => 0x8317, 0xac => 0x84c2, + 0xad => 0x879f, 0xae => 0x9169, 0xaf => 0x9298, 0xb0 => 0x9cf4, + 0xb1 => 0x8882, 0xb2 => 0x4fae, 0xb3 => 0x5192, 0xb4 => 0x52df, + 0xb5 => 0x59c6, 0xb6 => 0x5e3d, 0xb7 => 0x6155, 0xb8 => 0x6478, + 0xb9 => 0x6479, 0xba => 0x66ae, 0xbb => 0x67d0, 0xbc => 0x6a21, + 0xbd => 0x6bcd, 0xbe => 0x6bdb, 0xbf => 0x725f, 0xc0 => 0x7261, + 0xc1 => 0x7441, 0xc2 => 0x7738, 0xc3 => 0x77db, 0xc4 => 0x8017, + 0xc5 => 0x82bc, 0xc6 => 0x8305, 0xc7 => 0x8b00, 0xc8 => 0x8b28, + 0xc9 => 0x8c8c, 0xca => 0x6728, 0xcb => 0x6c90, 0xcc => 0x7267, + 0xcd => 0x76ee, 0xce => 0x7766, 0xcf => 0x7a46, 0xd0 => 0x9da9, + 0xd1 => 0x6b7f, 0xd2 => 0x6c92, 0xd3 => 0x5922, 0xd4 => 0x6726, + 0xd5 => 0x8499, 0xd6 => 0x536f, 0xd7 => 0x5893, 0xd8 => 0x5999, + 0xd9 => 0x5edf, 0xda => 0x63cf, 0xdb => 0x6634, 0xdc => 0x6773, + 0xdd => 0x6e3a, 0xde => 0x732b, 0xdf => 0x7ad7, 0xe0 => 0x82d7, + 0xe1 => 0x9328, 0xe2 => 0x52d9, 0xe3 => 0x5deb, 0xe4 => 0x61ae, + 0xe5 => 0x61cb, 0xe6 => 0x620a, 0xe7 => 0x62c7, 0xe8 => 0x64ab, + 0xe9 => 0x65e0, 0xea => 0x6959, 0xeb => 0x6b66, 0xec => 0x6bcb, + 0xed => 0x7121, 0xee => 0x73f7, 0xef => 0x755d, 0xf0 => 0x7e46, + 0xf1 => 0x821e, 0xf2 => 0x8302, 0xf3 => 0x856a, 0xf4 => 0x8aa3, + 0xf5 => 0x8cbf, 0xf6 => 0x9727, 0xf7 => 0x9d61, 0xf8 => 0x58a8, + 0xf9 => 0x9ed8, 0xfa => 0x5011, 0xfb => 0x520e, 0xfc => 0x543b, + 0xfd => 0x554f, 0xfe => 0x6587, + }, + 0xda => { + 0xa1 => 0x6c76, 0xa2 => 0x7d0a, 0xa3 => 0x7d0b, 0xa4 => 0x805e, + 0xa5 => 0x868a, 0xa6 => 0x9580, 0xa7 => 0x96ef, 0xa8 => 0x52ff, + 0xa9 => 0x6c95, 0xaa => 0x7269, 0xab => 0x5473, 0xac => 0x5a9a, + 0xad => 0x5c3e, 0xae => 0x5d4b, 0xaf => 0x5f4c, 0xb0 => 0x5fae, + 0xb1 => 0x672a, 0xb2 => 0x68b6, 0xb3 => 0x6963, 0xb4 => 0x6e3c, + 0xb5 => 0x6e44, 0xb6 => 0x7709, 0xb7 => 0x7c73, 0xb8 => 0x7f8e, + 0xb9 => 0x8587, 0xba => 0x8b0e, 0xbb => 0x8ff7, 0xbc => 0x9761, + 0xbd => 0x9ef4, 0xbe => 0x5cb7, 0xbf => 0x60b6, 0xc0 => 0x610d, + 0xc1 => 0x61ab, 0xc2 => 0x654f, 0xc3 => 0x65fb, 0xc4 => 0x65fc, + 0xc5 => 0x6c11, 0xc6 => 0x6cef, 0xc7 => 0x739f, 0xc8 => 0x73c9, + 0xc9 => 0x7de1, 0xca => 0x9594, 0xcb => 0x5bc6, 0xcc => 0x871c, + 0xcd => 0x8b10, 0xce => 0x525d, 0xcf => 0x535a, 0xd0 => 0x62cd, + 0xd1 => 0x640f, 0xd2 => 0x64b2, 0xd3 => 0x6734, 0xd4 => 0x6a38, + 0xd5 => 0x6cca, 0xd6 => 0x73c0, 0xd7 => 0x749e, 0xd8 => 0x7b94, + 0xd9 => 0x7c95, 0xda => 0x7e1b, 0xdb => 0x818a, 0xdc => 0x8236, + 0xdd => 0x8584, 0xde => 0x8feb, 0xdf => 0x96f9, 0xe0 => 0x99c1, + 0xe1 => 0x4f34, 0xe2 => 0x534a, 0xe3 => 0x53cd, 0xe4 => 0x53db, + 0xe5 => 0x62cc, 0xe6 => 0x642c, 0xe7 => 0x6500, 0xe8 => 0x6591, + 0xe9 => 0x69c3, 0xea => 0x6cee, 0xeb => 0x6f58, 0xec => 0x73ed, + 0xed => 0x7554, 0xee => 0x7622, 0xef => 0x76e4, 0xf0 => 0x76fc, + 0xf1 => 0x78d0, 0xf2 => 0x78fb, 0xf3 => 0x792c, 0xf4 => 0x7d46, + 0xf5 => 0x822c, 0xf6 => 0x87e0, 0xf7 => 0x8fd4, 0xf8 => 0x9812, + 0xf9 => 0x98ef, 0xfa => 0x52c3, 0xfb => 0x62d4, 0xfc => 0x64a5, + 0xfd => 0x6e24, 0xfe => 0x6f51, + }, + 0xdb => { + 0xa1 => 0x767c, 0xa2 => 0x8dcb, 0xa3 => 0x91b1, 0xa4 => 0x9262, + 0xa5 => 0x9aee, 0xa6 => 0x9b43, 0xa7 => 0x5023, 0xa8 => 0x508d, + 0xa9 => 0x574a, 0xaa => 0x59a8, 0xab => 0x5c28, 0xac => 0x5e47, + 0xad => 0x5f77, 0xae => 0x623f, 0xaf => 0x653e, 0xb0 => 0x65b9, + 0xb1 => 0x65c1, 0xb2 => 0x6609, 0xb3 => 0x678b, 0xb4 => 0x699c, + 0xb5 => 0x6ec2, 0xb6 => 0x78c5, 0xb7 => 0x7d21, 0xb8 => 0x80aa, + 0xb9 => 0x8180, 0xba => 0x822b, 0xbb => 0x82b3, 0xbc => 0x84a1, + 0xbd => 0x868c, 0xbe => 0x8a2a, 0xbf => 0x8b17, 0xc0 => 0x90a6, + 0xc1 => 0x9632, 0xc2 => 0x9f90, 0xc3 => 0x500d, 0xc4 => 0x4ff3, + 0xc5 => 0xf963, 0xc6 => 0x57f9, 0xc7 => 0x5f98, 0xc8 => 0x62dc, + 0xc9 => 0x6392, 0xca => 0x676f, 0xcb => 0x6e43, 0xcc => 0x7119, + 0xcd => 0x76c3, 0xce => 0x80cc, 0xcf => 0x80da, 0xd0 => 0x88f4, + 0xd1 => 0x88f5, 0xd2 => 0x8919, 0xd3 => 0x8ce0, 0xd4 => 0x8f29, + 0xd5 => 0x914d, 0xd6 => 0x966a, 0xd7 => 0x4f2f, 0xd8 => 0x4f70, + 0xd9 => 0x5e1b, 0xda => 0x67cf, 0xdb => 0x6822, 0xdc => 0x767d, + 0xdd => 0x767e, 0xde => 0x9b44, 0xdf => 0x5e61, 0xe0 => 0x6a0a, + 0xe1 => 0x7169, 0xe2 => 0x71d4, 0xe3 => 0x756a, 0xe4 => 0xf964, + 0xe5 => 0x7e41, 0xe6 => 0x8543, 0xe7 => 0x85e9, 0xe8 => 0x98dc, + 0xe9 => 0x4f10, 0xea => 0x7b4f, 0xeb => 0x7f70, 0xec => 0x95a5, + 0xed => 0x51e1, 0xee => 0x5e06, 0xef => 0x68b5, 0xf0 => 0x6c3e, + 0xf1 => 0x6c4e, 0xf2 => 0x6cdb, 0xf3 => 0x72af, 0xf4 => 0x7bc4, + 0xf5 => 0x8303, 0xf6 => 0x6cd5, 0xf7 => 0x743a, 0xf8 => 0x50fb, + 0xf9 => 0x5288, 0xfa => 0x58c1, 0xfb => 0x64d8, 0xfc => 0x6a97, + 0xfd => 0x74a7, 0xfe => 0x7656, + }, + 0xdc => { + 0xa1 => 0x78a7, 0xa2 => 0x8617, 0xa3 => 0x95e2, 0xa4 => 0x9739, + 0xa5 => 0xf965, 0xa6 => 0x535e, 0xa7 => 0x5f01, 0xa8 => 0x8b8a, + 0xa9 => 0x8fa8, 0xaa => 0x8faf, 0xab => 0x908a, 0xac => 0x5225, + 0xad => 0x77a5, 0xae => 0x9c49, 0xaf => 0x9f08, 0xb0 => 0x4e19, + 0xb1 => 0x5002, 0xb2 => 0x5175, 0xb3 => 0x5c5b, 0xb4 => 0x5e77, + 0xb5 => 0x661e, 0xb6 => 0x663a, 0xb7 => 0x67c4, 0xb8 => 0x68c5, + 0xb9 => 0x70b3, 0xba => 0x7501, 0xbb => 0x75c5, 0xbc => 0x79c9, + 0xbd => 0x7add, 0xbe => 0x8f27, 0xbf => 0x9920, 0xc0 => 0x9a08, + 0xc1 => 0x4fdd, 0xc2 => 0x5821, 0xc3 => 0x5831, 0xc4 => 0x5bf6, + 0xc5 => 0x666e, 0xc6 => 0x6b65, 0xc7 => 0x6d11, 0xc8 => 0x6e7a, + 0xc9 => 0x6f7d, 0xca => 0x73e4, 0xcb => 0x752b, 0xcc => 0x83e9, + 0xcd => 0x88dc, 0xce => 0x8913, 0xcf => 0x8b5c, 0xd0 => 0x8f14, + 0xd1 => 0x4f0f, 0xd2 => 0x50d5, 0xd3 => 0x5310, 0xd4 => 0x535c, + 0xd5 => 0x5b93, 0xd6 => 0x5fa9, 0xd7 => 0x670d, 0xd8 => 0x798f, + 0xd9 => 0x8179, 0xda => 0x832f, 0xdb => 0x8514, 0xdc => 0x8907, + 0xdd => 0x8986, 0xde => 0x8f39, 0xdf => 0x8f3b, 0xe0 => 0x99a5, + 0xe1 => 0x9c12, 0xe2 => 0x672c, 0xe3 => 0x4e76, 0xe4 => 0x4ff8, + 0xe5 => 0x5949, 0xe6 => 0x5c01, 0xe7 => 0x5cef, 0xe8 => 0x5cf0, + 0xe9 => 0x6367, 0xea => 0x68d2, 0xeb => 0x70fd, 0xec => 0x71a2, + 0xed => 0x742b, 0xee => 0x7e2b, 0xef => 0x84ec, 0xf0 => 0x8702, + 0xf1 => 0x9022, 0xf2 => 0x92d2, 0xf3 => 0x9cf3, 0xf4 => 0x4e0d, + 0xf5 => 0x4ed8, 0xf6 => 0x4fef, 0xf7 => 0x5085, 0xf8 => 0x5256, + 0xf9 => 0x526f, 0xfa => 0x5426, 0xfb => 0x5490, 0xfc => 0x57e0, + 0xfd => 0x592b, 0xfe => 0x5a66, + }, + 0xdd => { + 0xa1 => 0x5b5a, 0xa2 => 0x5b75, 0xa3 => 0x5bcc, 0xa4 => 0x5e9c, + 0xa5 => 0xf966, 0xa6 => 0x6276, 0xa7 => 0x6577, 0xa8 => 0x65a7, + 0xa9 => 0x6d6e, 0xaa => 0x6ea5, 0xab => 0x7236, 0xac => 0x7b26, + 0xad => 0x7c3f, 0xae => 0x7f36, 0xaf => 0x8150, 0xb0 => 0x8151, + 0xb1 => 0x819a, 0xb2 => 0x8240, 0xb3 => 0x8299, 0xb4 => 0x83a9, + 0xb5 => 0x8a03, 0xb6 => 0x8ca0, 0xb7 => 0x8ce6, 0xb8 => 0x8cfb, + 0xb9 => 0x8d74, 0xba => 0x8dba, 0xbb => 0x90e8, 0xbc => 0x91dc, + 0xbd => 0x961c, 0xbe => 0x9644, 0xbf => 0x99d9, 0xc0 => 0x9ce7, + 0xc1 => 0x5317, 0xc2 => 0x5206, 0xc3 => 0x5429, 0xc4 => 0x5674, + 0xc5 => 0x58b3, 0xc6 => 0x5954, 0xc7 => 0x596e, 0xc8 => 0x5fff, + 0xc9 => 0x61a4, 0xca => 0x626e, 0xcb => 0x6610, 0xcc => 0x6c7e, + 0xcd => 0x711a, 0xce => 0x76c6, 0xcf => 0x7c89, 0xd0 => 0x7cde, + 0xd1 => 0x7d1b, 0xd2 => 0x82ac, 0xd3 => 0x8cc1, 0xd4 => 0x96f0, + 0xd5 => 0xf967, 0xd6 => 0x4f5b, 0xd7 => 0x5f17, 0xd8 => 0x5f7f, + 0xd9 => 0x62c2, 0xda => 0x5d29, 0xdb => 0x670b, 0xdc => 0x68da, + 0xdd => 0x787c, 0xde => 0x7e43, 0xdf => 0x9d6c, 0xe0 => 0x4e15, + 0xe1 => 0x5099, 0xe2 => 0x5315, 0xe3 => 0x532a, 0xe4 => 0x5351, + 0xe5 => 0x5983, 0xe6 => 0x5a62, 0xe7 => 0x5e87, 0xe8 => 0x60b2, + 0xe9 => 0x618a, 0xea => 0x6249, 0xeb => 0x6279, 0xec => 0x6590, + 0xed => 0x6787, 0xee => 0x69a7, 0xef => 0x6bd4, 0xf0 => 0x6bd6, + 0xf1 => 0x6bd7, 0xf2 => 0x6bd8, 0xf3 => 0x6cb8, 0xf4 => 0xf968, + 0xf5 => 0x7435, 0xf6 => 0x75fa, 0xf7 => 0x7812, 0xf8 => 0x7891, + 0xf9 => 0x79d5, 0xfa => 0x79d8, 0xfb => 0x7c83, 0xfc => 0x7dcb, + 0xfd => 0x7fe1, 0xfe => 0x80a5, + }, + 0xde => { + 0xa1 => 0x813e, 0xa2 => 0x81c2, 0xa3 => 0x83f2, 0xa4 => 0x871a, + 0xa5 => 0x88e8, 0xa6 => 0x8ab9, 0xa7 => 0x8b6c, 0xa8 => 0x8cbb, + 0xa9 => 0x9119, 0xaa => 0x975e, 0xab => 0x98db, 0xac => 0x9f3b, + 0xad => 0x56ac, 0xae => 0x5b2a, 0xaf => 0x5f6c, 0xb0 => 0x658c, + 0xb1 => 0x6ab3, 0xb2 => 0x6baf, 0xb3 => 0x6d5c, 0xb4 => 0x6ff1, + 0xb5 => 0x7015, 0xb6 => 0x725d, 0xb7 => 0x73ad, 0xb8 => 0x8ca7, + 0xb9 => 0x8cd3, 0xba => 0x983b, 0xbb => 0x6191, 0xbc => 0x6c37, + 0xbd => 0x8058, 0xbe => 0x9a01, 0xbf => 0x4e4d, 0xc0 => 0x4e8b, + 0xc1 => 0x4e9b, 0xc2 => 0x4ed5, 0xc3 => 0x4f3a, 0xc4 => 0x4f3c, + 0xc5 => 0x4f7f, 0xc6 => 0x4fdf, 0xc7 => 0x50ff, 0xc8 => 0x53f2, + 0xc9 => 0x53f8, 0xca => 0x5506, 0xcb => 0x55e3, 0xcc => 0x56db, + 0xcd => 0x58eb, 0xce => 0x5962, 0xcf => 0x5a11, 0xd0 => 0x5beb, + 0xd1 => 0x5bfa, 0xd2 => 0x5c04, 0xd3 => 0x5df3, 0xd4 => 0x5e2b, + 0xd5 => 0x5f99, 0xd6 => 0x601d, 0xd7 => 0x6368, 0xd8 => 0x659c, + 0xd9 => 0x65af, 0xda => 0x67f6, 0xdb => 0x67fb, 0xdc => 0x68ad, + 0xdd => 0x6b7b, 0xde => 0x6c99, 0xdf => 0x6cd7, 0xe0 => 0x6e23, + 0xe1 => 0x7009, 0xe2 => 0x7345, 0xe3 => 0x7802, 0xe4 => 0x793e, + 0xe5 => 0x7940, 0xe6 => 0x7960, 0xe7 => 0x79c1, 0xe8 => 0x7be9, + 0xe9 => 0x7d17, 0xea => 0x7d72, 0xeb => 0x8086, 0xec => 0x820d, + 0xed => 0x838e, 0xee => 0x84d1, 0xef => 0x86c7, 0xf0 => 0x88df, + 0xf1 => 0x8a50, 0xf2 => 0x8a5e, 0xf3 => 0x8b1d, 0xf4 => 0x8cdc, + 0xf5 => 0x8d66, 0xf6 => 0x8fad, 0xf7 => 0x90aa, 0xf8 => 0x98fc, + 0xf9 => 0x99df, 0xfa => 0x9e9d, 0xfb => 0x524a, 0xfc => 0xf969, + 0xfd => 0x6714, 0xfe => 0xf96a, + }, + 0xdf => { + 0xa1 => 0x5098, 0xa2 => 0x522a, 0xa3 => 0x5c71, 0xa4 => 0x6563, + 0xa5 => 0x6c55, 0xa6 => 0x73ca, 0xa7 => 0x7523, 0xa8 => 0x759d, + 0xa9 => 0x7b97, 0xaa => 0x849c, 0xab => 0x9178, 0xac => 0x9730, + 0xad => 0x4e77, 0xae => 0x6492, 0xaf => 0x6bba, 0xb0 => 0x715e, + 0xb1 => 0x85a9, 0xb2 => 0x4e09, 0xb3 => 0xf96b, 0xb4 => 0x6749, + 0xb5 => 0x68ee, 0xb6 => 0x6e17, 0xb7 => 0x829f, 0xb8 => 0x8518, + 0xb9 => 0x886b, 0xba => 0x63f7, 0xbb => 0x6f81, 0xbc => 0x9212, + 0xbd => 0x98af, 0xbe => 0x4e0a, 0xbf => 0x50b7, 0xc0 => 0x50cf, + 0xc1 => 0x511f, 0xc2 => 0x5546, 0xc3 => 0x55aa, 0xc4 => 0x5617, + 0xc5 => 0x5b40, 0xc6 => 0x5c19, 0xc7 => 0x5ce0, 0xc8 => 0x5e38, + 0xc9 => 0x5e8a, 0xca => 0x5ea0, 0xcb => 0x5ec2, 0xcc => 0x60f3, + 0xcd => 0x6851, 0xce => 0x6a61, 0xcf => 0x6e58, 0xd0 => 0x723d, + 0xd1 => 0x7240, 0xd2 => 0x72c0, 0xd3 => 0x76f8, 0xd4 => 0x7965, + 0xd5 => 0x7bb1, 0xd6 => 0x7fd4, 0xd7 => 0x88f3, 0xd8 => 0x89f4, + 0xd9 => 0x8a73, 0xda => 0x8c61, 0xdb => 0x8cde, 0xdc => 0x971c, + 0xdd => 0x585e, 0xde => 0x74bd, 0xdf => 0x8cfd, 0xe0 => 0x55c7, + 0xe1 => 0xf96c, 0xe2 => 0x7a61, 0xe3 => 0x7d22, 0xe4 => 0x8272, + 0xe5 => 0x7272, 0xe6 => 0x751f, 0xe7 => 0x7525, 0xe8 => 0xf96d, + 0xe9 => 0x7b19, 0xea => 0x5885, 0xeb => 0x58fb, 0xec => 0x5dbc, + 0xed => 0x5e8f, 0xee => 0x5eb6, 0xef => 0x5f90, 0xf0 => 0x6055, + 0xf1 => 0x6292, 0xf2 => 0x637f, 0xf3 => 0x654d, 0xf4 => 0x6691, + 0xf5 => 0x66d9, 0xf6 => 0x66f8, 0xf7 => 0x6816, 0xf8 => 0x68f2, + 0xf9 => 0x7280, 0xfa => 0x745e, 0xfb => 0x7b6e, 0xfc => 0x7d6e, + 0xfd => 0x7dd6, 0xfe => 0x7f72, + }, + 0xe0 => { + 0xa1 => 0x80e5, 0xa2 => 0x8212, 0xa3 => 0x85af, 0xa4 => 0x897f, + 0xa5 => 0x8a93, 0xa6 => 0x901d, 0xa7 => 0x92e4, 0xa8 => 0x9ecd, + 0xa9 => 0x9f20, 0xaa => 0x5915, 0xab => 0x596d, 0xac => 0x5e2d, + 0xad => 0x60dc, 0xae => 0x6614, 0xaf => 0x6673, 0xb0 => 0x6790, + 0xb1 => 0x6c50, 0xb2 => 0x6dc5, 0xb3 => 0x6f5f, 0xb4 => 0x77f3, + 0xb5 => 0x78a9, 0xb6 => 0x84c6, 0xb7 => 0x91cb, 0xb8 => 0x932b, + 0xb9 => 0x4ed9, 0xba => 0x50ca, 0xbb => 0x5148, 0xbc => 0x5584, + 0xbd => 0x5b0b, 0xbe => 0x5ba3, 0xbf => 0x6247, 0xc0 => 0x657e, + 0xc1 => 0x65cb, 0xc2 => 0x6e32, 0xc3 => 0x717d, 0xc4 => 0x7401, + 0xc5 => 0x7444, 0xc6 => 0x7487, 0xc7 => 0x74bf, 0xc8 => 0x766c, + 0xc9 => 0x79aa, 0xca => 0x7dda, 0xcb => 0x7e55, 0xcc => 0x7fa8, + 0xcd => 0x817a, 0xce => 0x81b3, 0xcf => 0x8239, 0xd0 => 0x861a, + 0xd1 => 0x87ec, 0xd2 => 0x8a75, 0xd3 => 0x8de3, 0xd4 => 0x9078, + 0xd5 => 0x9291, 0xd6 => 0x9425, 0xd7 => 0x994d, 0xd8 => 0x9bae, + 0xd9 => 0x5368, 0xda => 0x5c51, 0xdb => 0x6954, 0xdc => 0x6cc4, + 0xdd => 0x6d29, 0xde => 0x6e2b, 0xdf => 0x820c, 0xe0 => 0x859b, + 0xe1 => 0x893b, 0xe2 => 0x8a2d, 0xe3 => 0x8aaa, 0xe4 => 0x96ea, + 0xe5 => 0x9f67, 0xe6 => 0x5261, 0xe7 => 0x66b9, 0xe8 => 0x6bb2, + 0xe9 => 0x7e96, 0xea => 0x87fe, 0xeb => 0x8d0d, 0xec => 0x9583, + 0xed => 0x965d, 0xee => 0x651d, 0xef => 0x6d89, 0xf0 => 0x71ee, + 0xf1 => 0xf96e, 0xf2 => 0x57ce, 0xf3 => 0x59d3, 0xf4 => 0x5bac, + 0xf5 => 0x6027, 0xf6 => 0x60fa, 0xf7 => 0x6210, 0xf8 => 0x661f, + 0xf9 => 0x665f, 0xfa => 0x7329, 0xfb => 0x73f9, 0xfc => 0x76db, + 0xfd => 0x7701, 0xfe => 0x7b6c, + }, + 0xe1 => { + 0xa1 => 0x8056, 0xa2 => 0x8072, 0xa3 => 0x8165, 0xa4 => 0x8aa0, + 0xa5 => 0x9192, 0xa6 => 0x4e16, 0xa7 => 0x52e2, 0xa8 => 0x6b72, + 0xa9 => 0x6d17, 0xaa => 0x7a05, 0xab => 0x7b39, 0xac => 0x7d30, + 0xad => 0xf96f, 0xae => 0x8cb0, 0xaf => 0x53ec, 0xb0 => 0x562f, + 0xb1 => 0x5851, 0xb2 => 0x5bb5, 0xb3 => 0x5c0f, 0xb4 => 0x5c11, + 0xb5 => 0x5de2, 0xb6 => 0x6240, 0xb7 => 0x6383, 0xb8 => 0x6414, + 0xb9 => 0x662d, 0xba => 0x68b3, 0xbb => 0x6cbc, 0xbc => 0x6d88, + 0xbd => 0x6eaf, 0xbe => 0x701f, 0xbf => 0x70a4, 0xc0 => 0x71d2, + 0xc1 => 0x7526, 0xc2 => 0x758f, 0xc3 => 0x758e, 0xc4 => 0x7619, + 0xc5 => 0x7b11, 0xc6 => 0x7be0, 0xc7 => 0x7c2b, 0xc8 => 0x7d20, + 0xc9 => 0x7d39, 0xca => 0x852c, 0xcb => 0x856d, 0xcc => 0x8607, + 0xcd => 0x8a34, 0xce => 0x900d, 0xcf => 0x9061, 0xd0 => 0x90b5, + 0xd1 => 0x92b7, 0xd2 => 0x97f6, 0xd3 => 0x9a37, 0xd4 => 0x4fd7, + 0xd5 => 0x5c6c, 0xd6 => 0x675f, 0xd7 => 0x6d91, 0xd8 => 0x7c9f, + 0xd9 => 0x7e8c, 0xda => 0x8b16, 0xdb => 0x8d16, 0xdc => 0x901f, + 0xdd => 0x5b6b, 0xde => 0x5dfd, 0xdf => 0x640d, 0xe0 => 0x84c0, + 0xe1 => 0x905c, 0xe2 => 0x98e1, 0xe3 => 0x7387, 0xe4 => 0x5b8b, + 0xe5 => 0x609a, 0xe6 => 0x677e, 0xe7 => 0x6dde, 0xe8 => 0x8a1f, + 0xe9 => 0x8aa6, 0xea => 0x9001, 0xeb => 0x980c, 0xec => 0x5237, + 0xed => 0xf970, 0xee => 0x7051, 0xef => 0x788e, 0xf0 => 0x9396, + 0xf1 => 0x8870, 0xf2 => 0x91d7, 0xf3 => 0x4fee, 0xf4 => 0x53d7, + 0xf5 => 0x55fd, 0xf6 => 0x56da, 0xf7 => 0x5782, 0xf8 => 0x58fd, + 0xf9 => 0x5ac2, 0xfa => 0x5b88, 0xfb => 0x5cab, 0xfc => 0x5cc0, + 0xfd => 0x5e25, 0xfe => 0x6101, + }, + 0xe2 => { + 0xa1 => 0x620d, 0xa2 => 0x624b, 0xa3 => 0x6388, 0xa4 => 0x641c, + 0xa5 => 0x6536, 0xa6 => 0x6578, 0xa7 => 0x6a39, 0xa8 => 0x6b8a, + 0xa9 => 0x6c34, 0xaa => 0x6d19, 0xab => 0x6f31, 0xac => 0x71e7, + 0xad => 0x72e9, 0xae => 0x7378, 0xaf => 0x7407, 0xb0 => 0x74b2, + 0xb1 => 0x7626, 0xb2 => 0x7761, 0xb3 => 0x79c0, 0xb4 => 0x7a57, + 0xb5 => 0x7aea, 0xb6 => 0x7cb9, 0xb7 => 0x7d8f, 0xb8 => 0x7dac, + 0xb9 => 0x7e61, 0xba => 0x7f9e, 0xbb => 0x8129, 0xbc => 0x8331, + 0xbd => 0x8490, 0xbe => 0x84da, 0xbf => 0x85ea, 0xc0 => 0x8896, + 0xc1 => 0x8ab0, 0xc2 => 0x8b90, 0xc3 => 0x8f38, 0xc4 => 0x9042, + 0xc5 => 0x9083, 0xc6 => 0x916c, 0xc7 => 0x9296, 0xc8 => 0x92b9, + 0xc9 => 0x968b, 0xca => 0x96a7, 0xcb => 0x96a8, 0xcc => 0x96d6, + 0xcd => 0x9700, 0xce => 0x9808, 0xcf => 0x9996, 0xd0 => 0x9ad3, + 0xd1 => 0x9b1a, 0xd2 => 0x53d4, 0xd3 => 0x587e, 0xd4 => 0x5919, + 0xd5 => 0x5b70, 0xd6 => 0x5bbf, 0xd7 => 0x6dd1, 0xd8 => 0x6f5a, + 0xd9 => 0x719f, 0xda => 0x7421, 0xdb => 0x74b9, 0xdc => 0x8085, + 0xdd => 0x83fd, 0xde => 0x5de1, 0xdf => 0x5f87, 0xe0 => 0x5faa, + 0xe1 => 0x6042, 0xe2 => 0x65ec, 0xe3 => 0x6812, 0xe4 => 0x696f, + 0xe5 => 0x6a53, 0xe6 => 0x6b89, 0xe7 => 0x6d35, 0xe8 => 0x6df3, + 0xe9 => 0x73e3, 0xea => 0x76fe, 0xeb => 0x77ac, 0xec => 0x7b4d, + 0xed => 0x7d14, 0xee => 0x8123, 0xef => 0x821c, 0xf0 => 0x8340, + 0xf1 => 0x84f4, 0xf2 => 0x8563, 0xf3 => 0x8a62, 0xf4 => 0x8ac4, + 0xf5 => 0x9187, 0xf6 => 0x931e, 0xf7 => 0x9806, 0xf8 => 0x99b4, + 0xf9 => 0x620c, 0xfa => 0x8853, 0xfb => 0x8ff0, 0xfc => 0x9265, + 0xfd => 0x5d07, 0xfe => 0x5d27, + }, + 0xe3 => { + 0xa1 => 0x5d69, 0xa2 => 0x745f, 0xa3 => 0x819d, 0xa4 => 0x8768, + 0xa5 => 0x6fd5, 0xa6 => 0x62fe, 0xa7 => 0x7fd2, 0xa8 => 0x8936, + 0xa9 => 0x8972, 0xaa => 0x4e1e, 0xab => 0x4e58, 0xac => 0x50e7, + 0xad => 0x52dd, 0xae => 0x5347, 0xaf => 0x627f, 0xb0 => 0x6607, + 0xb1 => 0x7e69, 0xb2 => 0x8805, 0xb3 => 0x965e, 0xb4 => 0x4f8d, + 0xb5 => 0x5319, 0xb6 => 0x5636, 0xb7 => 0x59cb, 0xb8 => 0x5aa4, + 0xb9 => 0x5c38, 0xba => 0x5c4e, 0xbb => 0x5c4d, 0xbc => 0x5e02, + 0xbd => 0x5f11, 0xbe => 0x6043, 0xbf => 0x65bd, 0xc0 => 0x662f, + 0xc1 => 0x6642, 0xc2 => 0x67be, 0xc3 => 0x67f4, 0xc4 => 0x731c, + 0xc5 => 0x77e2, 0xc6 => 0x793a, 0xc7 => 0x7fc5, 0xc8 => 0x8494, + 0xc9 => 0x84cd, 0xca => 0x8996, 0xcb => 0x8a66, 0xcc => 0x8a69, + 0xcd => 0x8ae1, 0xce => 0x8c55, 0xcf => 0x8c7a, 0xd0 => 0x57f4, + 0xd1 => 0x5bd4, 0xd2 => 0x5f0f, 0xd3 => 0x606f, 0xd4 => 0x62ed, + 0xd5 => 0x690d, 0xd6 => 0x6b96, 0xd7 => 0x6e5c, 0xd8 => 0x7184, + 0xd9 => 0x7bd2, 0xda => 0x8755, 0xdb => 0x8b58, 0xdc => 0x8efe, + 0xdd => 0x98df, 0xde => 0x98fe, 0xdf => 0x4f38, 0xe0 => 0x4f81, + 0xe1 => 0x4fe1, 0xe2 => 0x547b, 0xe3 => 0x5a20, 0xe4 => 0x5bb8, + 0xe5 => 0x613c, 0xe6 => 0x65b0, 0xe7 => 0x6668, 0xe8 => 0x71fc, + 0xe9 => 0x7533, 0xea => 0x795e, 0xeb => 0x7d33, 0xec => 0x814e, + 0xed => 0x81e3, 0xee => 0x8398, 0xef => 0x85aa, 0xf0 => 0x85ce, + 0xf1 => 0x8703, 0xf2 => 0x8a0a, 0xf3 => 0x8eab, 0xf4 => 0x8f9b, + 0xf5 => 0xf971, 0xf6 => 0x8fc5, 0xf7 => 0x5931, 0xf8 => 0x5ba4, + 0xf9 => 0x5be6, 0xfa => 0x6089, 0xfb => 0x5be9, 0xfc => 0x5c0b, + 0xfd => 0x5fc3, 0xfe => 0x6c81, + }, + 0xe4 => { + 0xa1 => 0xf972, 0xa2 => 0x6df1, 0xa3 => 0x700b, 0xa4 => 0x751a, + 0xa5 => 0x82af, 0xa6 => 0x8af6, 0xa7 => 0x4ec0, 0xa8 => 0x5341, + 0xa9 => 0xf973, 0xaa => 0x96d9, 0xab => 0x6c0f, 0xac => 0x4e9e, + 0xad => 0x4fc4, 0xae => 0x5152, 0xaf => 0x555e, 0xb0 => 0x5a25, + 0xb1 => 0x5ce8, 0xb2 => 0x6211, 0xb3 => 0x7259, 0xb4 => 0x82bd, + 0xb5 => 0x83aa, 0xb6 => 0x86fe, 0xb7 => 0x8859, 0xb8 => 0x8a1d, + 0xb9 => 0x963f, 0xba => 0x96c5, 0xbb => 0x9913, 0xbc => 0x9d09, + 0xbd => 0x9d5d, 0xbe => 0x580a, 0xbf => 0x5cb3, 0xc0 => 0x5dbd, + 0xc1 => 0x5e44, 0xc2 => 0x60e1, 0xc3 => 0x6115, 0xc4 => 0x63e1, + 0xc5 => 0x6a02, 0xc6 => 0x6e25, 0xc7 => 0x9102, 0xc8 => 0x9354, + 0xc9 => 0x984e, 0xca => 0x9c10, 0xcb => 0x9f77, 0xcc => 0x5b89, + 0xcd => 0x5cb8, 0xce => 0x6309, 0xcf => 0x664f, 0xd0 => 0x6848, + 0xd1 => 0x773c, 0xd2 => 0x96c1, 0xd3 => 0x978d, 0xd4 => 0x9854, + 0xd5 => 0x9b9f, 0xd6 => 0x65a1, 0xd7 => 0x8b01, 0xd8 => 0x8ecb, + 0xd9 => 0x95bc, 0xda => 0x5535, 0xdb => 0x5ca9, 0xdc => 0x5dd6, + 0xdd => 0x5eb5, 0xde => 0x6697, 0xdf => 0x764c, 0xe0 => 0x83f4, + 0xe1 => 0x95c7, 0xe2 => 0x58d3, 0xe3 => 0x62bc, 0xe4 => 0x72ce, + 0xe5 => 0x9d28, 0xe6 => 0x4ef0, 0xe7 => 0x592e, 0xe8 => 0x600f, + 0xe9 => 0x663b, 0xea => 0x6b83, 0xeb => 0x79e7, 0xec => 0x9d26, + 0xed => 0x5393, 0xee => 0x54c0, 0xef => 0x57c3, 0xf0 => 0x5d16, + 0xf1 => 0x611b, 0xf2 => 0x66d6, 0xf3 => 0x6daf, 0xf4 => 0x788d, + 0xf5 => 0x827e, 0xf6 => 0x9698, 0xf7 => 0x9744, 0xf8 => 0x5384, + 0xf9 => 0x627c, 0xfa => 0x6396, 0xfb => 0x6db2, 0xfc => 0x7e0a, + 0xfd => 0x814b, 0xfe => 0x984d, + }, + 0xe5 => { + 0xa1 => 0x6afb, 0xa2 => 0x7f4c, 0xa3 => 0x9daf, 0xa4 => 0x9e1a, + 0xa5 => 0x4e5f, 0xa6 => 0x503b, 0xa7 => 0x51b6, 0xa8 => 0x591c, + 0xa9 => 0x60f9, 0xaa => 0x63f6, 0xab => 0x6930, 0xac => 0x723a, + 0xad => 0x8036, 0xae => 0xf974, 0xaf => 0x91ce, 0xb0 => 0x5f31, + 0xb1 => 0xf975, 0xb2 => 0xf976, 0xb3 => 0x7d04, 0xb4 => 0x82e5, + 0xb5 => 0x846f, 0xb6 => 0x84bb, 0xb7 => 0x85e5, 0xb8 => 0x8e8d, + 0xb9 => 0xf977, 0xba => 0x4f6f, 0xbb => 0xf978, 0xbc => 0xf979, + 0xbd => 0x58e4, 0xbe => 0x5b43, 0xbf => 0x6059, 0xc0 => 0x63da, + 0xc1 => 0x6518, 0xc2 => 0x656d, 0xc3 => 0x6698, 0xc4 => 0xf97a, + 0xc5 => 0x694a, 0xc6 => 0x6a23, 0xc7 => 0x6d0b, 0xc8 => 0x7001, + 0xc9 => 0x716c, 0xca => 0x75d2, 0xcb => 0x760d, 0xcc => 0x79b3, + 0xcd => 0x7a70, 0xce => 0xf97b, 0xcf => 0x7f8a, 0xd0 => 0xf97c, + 0xd1 => 0x8944, 0xd2 => 0xf97d, 0xd3 => 0x8b93, 0xd4 => 0x91c0, + 0xd5 => 0x967d, 0xd6 => 0xf97e, 0xd7 => 0x990a, 0xd8 => 0x5704, + 0xd9 => 0x5fa1, 0xda => 0x65bc, 0xdb => 0x6f01, 0xdc => 0x7600, + 0xdd => 0x79a6, 0xde => 0x8a9e, 0xdf => 0x99ad, 0xe0 => 0x9b5a, + 0xe1 => 0x9f6c, 0xe2 => 0x5104, 0xe3 => 0x61b6, 0xe4 => 0x6291, + 0xe5 => 0x6a8d, 0xe6 => 0x81c6, 0xe7 => 0x5043, 0xe8 => 0x5830, + 0xe9 => 0x5f66, 0xea => 0x7109, 0xeb => 0x8a00, 0xec => 0x8afa, + 0xed => 0x5b7c, 0xee => 0x8616, 0xef => 0x4ffa, 0xf0 => 0x513c, + 0xf1 => 0x56b4, 0xf2 => 0x5944, 0xf3 => 0x63a9, 0xf4 => 0x6df9, + 0xf5 => 0x5daa, 0xf6 => 0x696d, 0xf7 => 0x5186, 0xf8 => 0x4e88, + 0xf9 => 0x4f59, 0xfa => 0xf97f, 0xfb => 0xf980, 0xfc => 0xf981, + 0xfd => 0x5982, 0xfe => 0xf982, + }, + 0xe6 => { + 0xa1 => 0xf983, 0xa2 => 0x6b5f, 0xa3 => 0x6c5d, 0xa4 => 0xf984, + 0xa5 => 0x74b5, 0xa6 => 0x7916, 0xa7 => 0xf985, 0xa8 => 0x8207, + 0xa9 => 0x8245, 0xaa => 0x8339, 0xab => 0x8f3f, 0xac => 0x8f5d, + 0xad => 0xf986, 0xae => 0x9918, 0xaf => 0xf987, 0xb0 => 0xf988, + 0xb1 => 0xf989, 0xb2 => 0x4ea6, 0xb3 => 0xf98a, 0xb4 => 0x57df, + 0xb5 => 0x5f79, 0xb6 => 0x6613, 0xb7 => 0xf98b, 0xb8 => 0xf98c, + 0xb9 => 0x75ab, 0xba => 0x7e79, 0xbb => 0x8b6f, 0xbc => 0xf98d, + 0xbd => 0x9006, 0xbe => 0x9a5b, 0xbf => 0x56a5, 0xc0 => 0x5827, + 0xc1 => 0x59f8, 0xc2 => 0x5a1f, 0xc3 => 0x5bb4, 0xc4 => 0xf98e, + 0xc5 => 0x5ef6, 0xc6 => 0xf98f, 0xc7 => 0xf990, 0xc8 => 0x6350, + 0xc9 => 0x633b, 0xca => 0xf991, 0xcb => 0x693d, 0xcc => 0x6c87, + 0xcd => 0x6cbf, 0xce => 0x6d8e, 0xcf => 0x6d93, 0xd0 => 0x6df5, + 0xd1 => 0x6f14, 0xd2 => 0xf992, 0xd3 => 0x70df, 0xd4 => 0x7136, + 0xd5 => 0x7159, 0xd6 => 0xf993, 0xd7 => 0x71c3, 0xd8 => 0x71d5, + 0xd9 => 0xf994, 0xda => 0x784f, 0xdb => 0x786f, 0xdc => 0xf995, + 0xdd => 0x7b75, 0xde => 0x7de3, 0xdf => 0xf996, 0xe0 => 0x7e2f, + 0xe1 => 0xf997, 0xe2 => 0x884d, 0xe3 => 0x8edf, 0xe4 => 0xf998, + 0xe5 => 0xf999, 0xe6 => 0xf99a, 0xe7 => 0x925b, 0xe8 => 0xf99b, + 0xe9 => 0x9cf6, 0xea => 0xf99c, 0xeb => 0xf99d, 0xec => 0xf99e, + 0xed => 0x6085, 0xee => 0x6d85, 0xef => 0xf99f, 0xf0 => 0x71b1, + 0xf1 => 0xf9a0, 0xf2 => 0xf9a1, 0xf3 => 0x95b1, 0xf4 => 0x53ad, + 0xf5 => 0xf9a2, 0xf6 => 0xf9a3, 0xf7 => 0xf9a4, 0xf8 => 0x67d3, + 0xf9 => 0xf9a5, 0xfa => 0x708e, 0xfb => 0x7130, 0xfc => 0x7430, + 0xfd => 0x8276, 0xfe => 0x82d2, + }, + 0xe7 => { + 0xa1 => 0xf9a6, 0xa2 => 0x95bb, 0xa3 => 0x9ae5, 0xa4 => 0x9e7d, + 0xa5 => 0x66c4, 0xa6 => 0xf9a7, 0xa7 => 0x71c1, 0xa8 => 0x8449, + 0xa9 => 0xf9a8, 0xaa => 0xf9a9, 0xab => 0x584b, 0xac => 0xf9aa, + 0xad => 0xf9ab, 0xae => 0x5db8, 0xaf => 0x5f71, 0xb0 => 0xf9ac, + 0xb1 => 0x6620, 0xb2 => 0x668e, 0xb3 => 0x6979, 0xb4 => 0x69ae, + 0xb5 => 0x6c38, 0xb6 => 0x6cf3, 0xb7 => 0x6e36, 0xb8 => 0x6f41, + 0xb9 => 0x6fda, 0xba => 0x701b, 0xbb => 0x702f, 0xbc => 0x7150, + 0xbd => 0x71df, 0xbe => 0x7370, 0xbf => 0xf9ad, 0xc0 => 0x745b, + 0xc1 => 0xf9ae, 0xc2 => 0x74d4, 0xc3 => 0x76c8, 0xc4 => 0x7a4e, + 0xc5 => 0x7e93, 0xc6 => 0xf9af, 0xc7 => 0xf9b0, 0xc8 => 0x82f1, + 0xc9 => 0x8a60, 0xca => 0x8fce, 0xcb => 0xf9b1, 0xcc => 0x9348, + 0xcd => 0xf9b2, 0xce => 0x9719, 0xcf => 0xf9b3, 0xd0 => 0xf9b4, + 0xd1 => 0x4e42, 0xd2 => 0x502a, 0xd3 => 0xf9b5, 0xd4 => 0x5208, + 0xd5 => 0x53e1, 0xd6 => 0x66f3, 0xd7 => 0x6c6d, 0xd8 => 0x6fca, + 0xd9 => 0x730a, 0xda => 0x777f, 0xdb => 0x7a62, 0xdc => 0x82ae, + 0xdd => 0x85dd, 0xde => 0x8602, 0xdf => 0xf9b6, 0xe0 => 0x88d4, + 0xe1 => 0x8a63, 0xe2 => 0x8b7d, 0xe3 => 0x8c6b, 0xe4 => 0xf9b7, + 0xe5 => 0x92b3, 0xe6 => 0xf9b8, 0xe7 => 0x9713, 0xe8 => 0x9810, + 0xe9 => 0x4e94, 0xea => 0x4f0d, 0xeb => 0x4fc9, 0xec => 0x50b2, + 0xed => 0x5348, 0xee => 0x543e, 0xef => 0x5433, 0xf0 => 0x55da, + 0xf1 => 0x5862, 0xf2 => 0x58ba, 0xf3 => 0x5967, 0xf4 => 0x5a1b, + 0xf5 => 0x5be4, 0xf6 => 0x609f, 0xf7 => 0xf9b9, 0xf8 => 0x61ca, + 0xf9 => 0x6556, 0xfa => 0x65ff, 0xfb => 0x6664, 0xfc => 0x68a7, + 0xfd => 0x6c5a, 0xfe => 0x6fb3, + }, + 0xe8 => { + 0xa1 => 0x70cf, 0xa2 => 0x71ac, 0xa3 => 0x7352, 0xa4 => 0x7b7d, + 0xa5 => 0x8708, 0xa6 => 0x8aa4, 0xa7 => 0x9c32, 0xa8 => 0x9f07, + 0xa9 => 0x5c4b, 0xaa => 0x6c83, 0xab => 0x7344, 0xac => 0x7389, + 0xad => 0x923a, 0xae => 0x6eab, 0xaf => 0x7465, 0xb0 => 0x761f, + 0xb1 => 0x7a69, 0xb2 => 0x7e15, 0xb3 => 0x860a, 0xb4 => 0x5140, + 0xb5 => 0x58c5, 0xb6 => 0x64c1, 0xb7 => 0x74ee, 0xb8 => 0x7515, + 0xb9 => 0x7670, 0xba => 0x7fc1, 0xbb => 0x9095, 0xbc => 0x96cd, + 0xbd => 0x9954, 0xbe => 0x6e26, 0xbf => 0x74e6, 0xc0 => 0x7aa9, + 0xc1 => 0x7aaa, 0xc2 => 0x81e5, 0xc3 => 0x86d9, 0xc4 => 0x8778, + 0xc5 => 0x8a1b, 0xc6 => 0x5a49, 0xc7 => 0x5b8c, 0xc8 => 0x5b9b, + 0xc9 => 0x68a1, 0xca => 0x6900, 0xcb => 0x6d63, 0xcc => 0x73a9, + 0xcd => 0x7413, 0xce => 0x742c, 0xcf => 0x7897, 0xd0 => 0x7de9, + 0xd1 => 0x7feb, 0xd2 => 0x8118, 0xd3 => 0x8155, 0xd4 => 0x839e, + 0xd5 => 0x8c4c, 0xd6 => 0x962e, 0xd7 => 0x9811, 0xd8 => 0x66f0, + 0xd9 => 0x5f80, 0xda => 0x65fa, 0xdb => 0x6789, 0xdc => 0x6c6a, + 0xdd => 0x738b, 0xde => 0x502d, 0xdf => 0x5a03, 0xe0 => 0x6b6a, + 0xe1 => 0x77ee, 0xe2 => 0x5916, 0xe3 => 0x5d6c, 0xe4 => 0x5dcd, + 0xe5 => 0x7325, 0xe6 => 0x754f, 0xe7 => 0xf9ba, 0xe8 => 0xf9bb, + 0xe9 => 0x50e5, 0xea => 0x51f9, 0xeb => 0x582f, 0xec => 0x592d, + 0xed => 0x5996, 0xee => 0x59da, 0xef => 0x5be5, 0xf0 => 0xf9bc, + 0xf1 => 0xf9bd, 0xf2 => 0x5da2, 0xf3 => 0x62d7, 0xf4 => 0x6416, + 0xf5 => 0x6493, 0xf6 => 0x64fe, 0xf7 => 0xf9be, 0xf8 => 0x66dc, + 0xf9 => 0xf9bf, 0xfa => 0x6a48, 0xfb => 0xf9c0, 0xfc => 0x71ff, + 0xfd => 0x7464, 0xfe => 0xf9c1, + }, + 0xe9 => { + 0xa1 => 0x7a88, 0xa2 => 0x7aaf, 0xa3 => 0x7e47, 0xa4 => 0x7e5e, + 0xa5 => 0x8000, 0xa6 => 0x8170, 0xa7 => 0xf9c2, 0xa8 => 0x87ef, + 0xa9 => 0x8981, 0xaa => 0x8b20, 0xab => 0x9059, 0xac => 0xf9c3, + 0xad => 0x9080, 0xae => 0x9952, 0xaf => 0x617e, 0xb0 => 0x6b32, + 0xb1 => 0x6d74, 0xb2 => 0x7e1f, 0xb3 => 0x8925, 0xb4 => 0x8fb1, + 0xb5 => 0x4fd1, 0xb6 => 0x50ad, 0xb7 => 0x5197, 0xb8 => 0x52c7, + 0xb9 => 0x57c7, 0xba => 0x5889, 0xbb => 0x5bb9, 0xbc => 0x5eb8, + 0xbd => 0x6142, 0xbe => 0x6995, 0xbf => 0x6d8c, 0xc0 => 0x6e67, + 0xc1 => 0x6eb6, 0xc2 => 0x7194, 0xc3 => 0x7462, 0xc4 => 0x7528, + 0xc5 => 0x752c, 0xc6 => 0x8073, 0xc7 => 0x8338, 0xc8 => 0x84c9, + 0xc9 => 0x8e0a, 0xca => 0x9394, 0xcb => 0x93de, 0xcc => 0xf9c4, + 0xcd => 0x4e8e, 0xce => 0x4f51, 0xcf => 0x5076, 0xd0 => 0x512a, + 0xd1 => 0x53c8, 0xd2 => 0x53cb, 0xd3 => 0x53f3, 0xd4 => 0x5b87, + 0xd5 => 0x5bd3, 0xd6 => 0x5c24, 0xd7 => 0x611a, 0xd8 => 0x6182, + 0xd9 => 0x65f4, 0xda => 0x725b, 0xdb => 0x7397, 0xdc => 0x7440, + 0xdd => 0x76c2, 0xde => 0x7950, 0xdf => 0x7991, 0xe0 => 0x79b9, + 0xe1 => 0x7d06, 0xe2 => 0x7fbd, 0xe3 => 0x828b, 0xe4 => 0x85d5, + 0xe5 => 0x865e, 0xe6 => 0x8fc2, 0xe7 => 0x9047, 0xe8 => 0x90f5, + 0xe9 => 0x91ea, 0xea => 0x9685, 0xeb => 0x96e8, 0xec => 0x96e9, + 0xed => 0x52d6, 0xee => 0x5f67, 0xef => 0x65ed, 0xf0 => 0x6631, + 0xf1 => 0x682f, 0xf2 => 0x715c, 0xf3 => 0x7a36, 0xf4 => 0x90c1, + 0xf5 => 0x980a, 0xf6 => 0x4e91, 0xf7 => 0xf9c5, 0xf8 => 0x6a52, + 0xf9 => 0x6b9e, 0xfa => 0x6f90, 0xfb => 0x7189, 0xfc => 0x8018, + 0xfd => 0x82b8, 0xfe => 0x8553, + }, + 0xea => { + 0xa1 => 0x904b, 0xa2 => 0x9695, 0xa3 => 0x96f2, 0xa4 => 0x97fb, + 0xa5 => 0x851a, 0xa6 => 0x9b31, 0xa7 => 0x4e90, 0xa8 => 0x718a, + 0xa9 => 0x96c4, 0xaa => 0x5143, 0xab => 0x539f, 0xac => 0x54e1, + 0xad => 0x5713, 0xae => 0x5712, 0xaf => 0x57a3, 0xb0 => 0x5a9b, + 0xb1 => 0x5ac4, 0xb2 => 0x5bc3, 0xb3 => 0x6028, 0xb4 => 0x613f, + 0xb5 => 0x63f4, 0xb6 => 0x6c85, 0xb7 => 0x6d39, 0xb8 => 0x6e72, + 0xb9 => 0x6e90, 0xba => 0x7230, 0xbb => 0x733f, 0xbc => 0x7457, + 0xbd => 0x82d1, 0xbe => 0x8881, 0xbf => 0x8f45, 0xc0 => 0x9060, + 0xc1 => 0xf9c6, 0xc2 => 0x9662, 0xc3 => 0x9858, 0xc4 => 0x9d1b, + 0xc5 => 0x6708, 0xc6 => 0x8d8a, 0xc7 => 0x925e, 0xc8 => 0x4f4d, + 0xc9 => 0x5049, 0xca => 0x50de, 0xcb => 0x5371, 0xcc => 0x570d, + 0xcd => 0x59d4, 0xce => 0x5a01, 0xcf => 0x5c09, 0xd0 => 0x6170, + 0xd1 => 0x6690, 0xd2 => 0x6e2d, 0xd3 => 0x7232, 0xd4 => 0x744b, + 0xd5 => 0x7def, 0xd6 => 0x80c3, 0xd7 => 0x840e, 0xd8 => 0x8466, + 0xd9 => 0x853f, 0xda => 0x875f, 0xdb => 0x885b, 0xdc => 0x8918, + 0xdd => 0x8b02, 0xde => 0x9055, 0xdf => 0x97cb, 0xe0 => 0x9b4f, + 0xe1 => 0x4e73, 0xe2 => 0x4f91, 0xe3 => 0x5112, 0xe4 => 0x516a, + 0xe5 => 0xf9c7, 0xe6 => 0x552f, 0xe7 => 0x55a9, 0xe8 => 0x5b7a, + 0xe9 => 0x5ba5, 0xea => 0x5e7c, 0xeb => 0x5e7d, 0xec => 0x5ebe, + 0xed => 0x60a0, 0xee => 0x60df, 0xef => 0x6108, 0xf0 => 0x6109, + 0xf1 => 0x63c4, 0xf2 => 0x6538, 0xf3 => 0x6709, 0xf4 => 0xf9c8, + 0xf5 => 0x67d4, 0xf6 => 0x67da, 0xf7 => 0xf9c9, 0xf8 => 0x6961, + 0xf9 => 0x6962, 0xfa => 0x6cb9, 0xfb => 0x6d27, 0xfc => 0xf9ca, + 0xfd => 0x6e38, 0xfe => 0xf9cb, + }, + 0xeb => { + 0xa1 => 0x6fe1, 0xa2 => 0x7336, 0xa3 => 0x7337, 0xa4 => 0xf9cc, + 0xa5 => 0x745c, 0xa6 => 0x7531, 0xa7 => 0xf9cd, 0xa8 => 0x7652, + 0xa9 => 0xf9ce, 0xaa => 0xf9cf, 0xab => 0x7dad, 0xac => 0x81fe, + 0xad => 0x8438, 0xae => 0x88d5, 0xaf => 0x8a98, 0xb0 => 0x8adb, + 0xb1 => 0x8aed, 0xb2 => 0x8e30, 0xb3 => 0x8e42, 0xb4 => 0x904a, + 0xb5 => 0x903e, 0xb6 => 0x907a, 0xb7 => 0x9149, 0xb8 => 0x91c9, + 0xb9 => 0x936e, 0xba => 0xf9d0, 0xbb => 0xf9d1, 0xbc => 0x5809, + 0xbd => 0xf9d2, 0xbe => 0x6bd3, 0xbf => 0x8089, 0xc0 => 0x80b2, + 0xc1 => 0xf9d3, 0xc2 => 0xf9d4, 0xc3 => 0x5141, 0xc4 => 0x596b, + 0xc5 => 0x5c39, 0xc6 => 0xf9d5, 0xc7 => 0xf9d6, 0xc8 => 0x6f64, + 0xc9 => 0x73a7, 0xca => 0x80e4, 0xcb => 0x8d07, 0xcc => 0xf9d7, + 0xcd => 0x9217, 0xce => 0x958f, 0xcf => 0xf9d8, 0xd0 => 0xf9d9, + 0xd1 => 0xf9da, 0xd2 => 0xf9db, 0xd3 => 0x807f, 0xd4 => 0x620e, + 0xd5 => 0x701c, 0xd6 => 0x7d68, 0xd7 => 0x878d, 0xd8 => 0xf9dc, + 0xd9 => 0x57a0, 0xda => 0x6069, 0xdb => 0x6147, 0xdc => 0x6bb7, + 0xdd => 0x8abe, 0xde => 0x9280, 0xdf => 0x96b1, 0xe0 => 0x4e59, + 0xe1 => 0x541f, 0xe2 => 0x6deb, 0xe3 => 0x852d, 0xe4 => 0x9670, + 0xe5 => 0x97f3, 0xe6 => 0x98ee, 0xe7 => 0x63d6, 0xe8 => 0x6ce3, + 0xe9 => 0x9091, 0xea => 0x51dd, 0xeb => 0x61c9, 0xec => 0x81ba, + 0xed => 0x9df9, 0xee => 0x4f9d, 0xef => 0x501a, 0xf0 => 0x5100, + 0xf1 => 0x5b9c, 0xf2 => 0x610f, 0xf3 => 0x61ff, 0xf4 => 0x64ec, + 0xf5 => 0x6905, 0xf6 => 0x6bc5, 0xf7 => 0x7591, 0xf8 => 0x77e3, + 0xf9 => 0x7fa9, 0xfa => 0x8264, 0xfb => 0x858f, 0xfc => 0x87fb, + 0xfd => 0x8863, 0xfe => 0x8abc, + }, + 0xec => { + 0xa1 => 0x8b70, 0xa2 => 0x91ab, 0xa3 => 0x4e8c, 0xa4 => 0x4ee5, + 0xa5 => 0x4f0a, 0xa6 => 0xf9dd, 0xa7 => 0xf9de, 0xa8 => 0x5937, + 0xa9 => 0x59e8, 0xaa => 0xf9df, 0xab => 0x5df2, 0xac => 0x5f1b, + 0xad => 0x5f5b, 0xae => 0x6021, 0xaf => 0xf9e0, 0xb0 => 0xf9e1, + 0xb1 => 0xf9e2, 0xb2 => 0xf9e3, 0xb3 => 0x723e, 0xb4 => 0x73e5, + 0xb5 => 0xf9e4, 0xb6 => 0x7570, 0xb7 => 0x75cd, 0xb8 => 0xf9e5, + 0xb9 => 0x79fb, 0xba => 0xf9e6, 0xbb => 0x800c, 0xbc => 0x8033, + 0xbd => 0x8084, 0xbe => 0x82e1, 0xbf => 0x8351, 0xc0 => 0xf9e7, + 0xc1 => 0xf9e8, 0xc2 => 0x8cbd, 0xc3 => 0x8cb3, 0xc4 => 0x9087, + 0xc5 => 0xf9e9, 0xc6 => 0xf9ea, 0xc7 => 0x98f4, 0xc8 => 0x990c, + 0xc9 => 0xf9eb, 0xca => 0xf9ec, 0xcb => 0x7037, 0xcc => 0x76ca, + 0xcd => 0x7fca, 0xce => 0x7fcc, 0xcf => 0x7ffc, 0xd0 => 0x8b1a, + 0xd1 => 0x4eba, 0xd2 => 0x4ec1, 0xd3 => 0x5203, 0xd4 => 0x5370, + 0xd5 => 0xf9ed, 0xd6 => 0x54bd, 0xd7 => 0x56e0, 0xd8 => 0x59fb, + 0xd9 => 0x5bc5, 0xda => 0x5f15, 0xdb => 0x5fcd, 0xdc => 0x6e6e, + 0xdd => 0xf9ee, 0xde => 0xf9ef, 0xdf => 0x7d6a, 0xe0 => 0x8335, + 0xe1 => 0xf9f0, 0xe2 => 0x8693, 0xe3 => 0x8a8d, 0xe4 => 0xf9f1, + 0xe5 => 0x976d, 0xe6 => 0x9777, 0xe7 => 0xf9f2, 0xe8 => 0xf9f3, + 0xe9 => 0x4e00, 0xea => 0x4f5a, 0xeb => 0x4f7e, 0xec => 0x58f9, + 0xed => 0x65e5, 0xee => 0x6ea2, 0xef => 0x9038, 0xf0 => 0x93b0, + 0xf1 => 0x99b9, 0xf2 => 0x4efb, 0xf3 => 0x58ec, 0xf4 => 0x598a, + 0xf5 => 0x59d9, 0xf6 => 0x6041, 0xf7 => 0xf9f4, 0xf8 => 0xf9f5, + 0xf9 => 0x7a14, 0xfa => 0xf9f6, 0xfb => 0x834f, 0xfc => 0x8cc3, + 0xfd => 0x5165, 0xfe => 0x5344, + }, + 0xed => { + 0xa1 => 0xf9f7, 0xa2 => 0xf9f8, 0xa3 => 0xf9f9, 0xa4 => 0x4ecd, + 0xa5 => 0x5269, 0xa6 => 0x5b55, 0xa7 => 0x82bf, 0xa8 => 0x4ed4, + 0xa9 => 0x523a, 0xaa => 0x54a8, 0xab => 0x59c9, 0xac => 0x59ff, + 0xad => 0x5b50, 0xae => 0x5b57, 0xaf => 0x5b5c, 0xb0 => 0x6063, + 0xb1 => 0x6148, 0xb2 => 0x6ecb, 0xb3 => 0x7099, 0xb4 => 0x716e, + 0xb5 => 0x7386, 0xb6 => 0x74f7, 0xb7 => 0x75b5, 0xb8 => 0x78c1, + 0xb9 => 0x7d2b, 0xba => 0x8005, 0xbb => 0x81ea, 0xbc => 0x8328, + 0xbd => 0x8517, 0xbe => 0x85c9, 0xbf => 0x8aee, 0xc0 => 0x8cc7, + 0xc1 => 0x96cc, 0xc2 => 0x4f5c, 0xc3 => 0x52fa, 0xc4 => 0x56bc, + 0xc5 => 0x65ab, 0xc6 => 0x6628, 0xc7 => 0x707c, 0xc8 => 0x70b8, + 0xc9 => 0x7235, 0xca => 0x7dbd, 0xcb => 0x828d, 0xcc => 0x914c, + 0xcd => 0x96c0, 0xce => 0x9d72, 0xcf => 0x5b71, 0xd0 => 0x68e7, + 0xd1 => 0x6b98, 0xd2 => 0x6f7a, 0xd3 => 0x76de, 0xd4 => 0x5c91, + 0xd5 => 0x66ab, 0xd6 => 0x6f5b, 0xd7 => 0x7bb4, 0xd8 => 0x7c2a, + 0xd9 => 0x8836, 0xda => 0x96dc, 0xdb => 0x4e08, 0xdc => 0x4ed7, + 0xdd => 0x5320, 0xde => 0x5834, 0xdf => 0x58bb, 0xe0 => 0x58ef, + 0xe1 => 0x596c, 0xe2 => 0x5c07, 0xe3 => 0x5e33, 0xe4 => 0x5e84, + 0xe5 => 0x5f35, 0xe6 => 0x638c, 0xe7 => 0x66b2, 0xe8 => 0x6756, + 0xe9 => 0x6a1f, 0xea => 0x6aa3, 0xeb => 0x6b0c, 0xec => 0x6f3f, + 0xed => 0x7246, 0xee => 0xf9fa, 0xef => 0x7350, 0xf0 => 0x748b, + 0xf1 => 0x7ae0, 0xf2 => 0x7ca7, 0xf3 => 0x8178, 0xf4 => 0x81df, + 0xf5 => 0x81e7, 0xf6 => 0x838a, 0xf7 => 0x846c, 0xf8 => 0x8523, + 0xf9 => 0x8594, 0xfa => 0x85cf, 0xfb => 0x88dd, 0xfc => 0x8d13, + 0xfd => 0x91ac, 0xfe => 0x9577, + }, + 0xee => { + 0xa1 => 0x969c, 0xa2 => 0x518d, 0xa3 => 0x54c9, 0xa4 => 0x5728, + 0xa5 => 0x5bb0, 0xa6 => 0x624d, 0xa7 => 0x6750, 0xa8 => 0x683d, + 0xa9 => 0x6893, 0xaa => 0x6e3d, 0xab => 0x6ed3, 0xac => 0x707d, + 0xad => 0x7e21, 0xae => 0x88c1, 0xaf => 0x8ca1, 0xb0 => 0x8f09, + 0xb1 => 0x9f4b, 0xb2 => 0x9f4e, 0xb3 => 0x722d, 0xb4 => 0x7b8f, + 0xb5 => 0x8acd, 0xb6 => 0x931a, 0xb7 => 0x4f47, 0xb8 => 0x4f4e, + 0xb9 => 0x5132, 0xba => 0x5480, 0xbb => 0x59d0, 0xbc => 0x5e95, + 0xbd => 0x62b5, 0xbe => 0x6775, 0xbf => 0x696e, 0xc0 => 0x6a17, + 0xc1 => 0x6cae, 0xc2 => 0x6e1a, 0xc3 => 0x72d9, 0xc4 => 0x732a, + 0xc5 => 0x75bd, 0xc6 => 0x7bb8, 0xc7 => 0x7d35, 0xc8 => 0x82e7, + 0xc9 => 0x83f9, 0xca => 0x8457, 0xcb => 0x85f7, 0xcc => 0x8a5b, + 0xcd => 0x8caf, 0xce => 0x8e87, 0xcf => 0x9019, 0xd0 => 0x90b8, + 0xd1 => 0x96ce, 0xd2 => 0x9f5f, 0xd3 => 0x52e3, 0xd4 => 0x540a, + 0xd5 => 0x5ae1, 0xd6 => 0x5bc2, 0xd7 => 0x6458, 0xd8 => 0x6575, + 0xd9 => 0x6ef4, 0xda => 0x72c4, 0xdb => 0xf9fb, 0xdc => 0x7684, + 0xdd => 0x7a4d, 0xde => 0x7b1b, 0xdf => 0x7c4d, 0xe0 => 0x7e3e, + 0xe1 => 0x7fdf, 0xe2 => 0x837b, 0xe3 => 0x8b2b, 0xe4 => 0x8cca, + 0xe5 => 0x8d64, 0xe6 => 0x8de1, 0xe7 => 0x8e5f, 0xe8 => 0x8fea, + 0xe9 => 0x8ff9, 0xea => 0x9069, 0xeb => 0x93d1, 0xec => 0x4f43, + 0xed => 0x4f7a, 0xee => 0x50b3, 0xef => 0x5168, 0xf0 => 0x5178, + 0xf1 => 0x524d, 0xf2 => 0x526a, 0xf3 => 0x5861, 0xf4 => 0x587c, + 0xf5 => 0x5960, 0xf6 => 0x5c08, 0xf7 => 0x5c55, 0xf8 => 0x5edb, + 0xf9 => 0x609b, 0xfa => 0x6230, 0xfb => 0x6813, 0xfc => 0x6bbf, + 0xfd => 0x6c08, 0xfe => 0x6fb1, + }, + 0xef => { + 0xa1 => 0x714e, 0xa2 => 0x7420, 0xa3 => 0x7530, 0xa4 => 0x7538, + 0xa5 => 0x7551, 0xa6 => 0x7672, 0xa7 => 0x7b4c, 0xa8 => 0x7b8b, + 0xa9 => 0x7bad, 0xaa => 0x7bc6, 0xab => 0x7e8f, 0xac => 0x8a6e, + 0xad => 0x8f3e, 0xae => 0x8f49, 0xaf => 0x923f, 0xb0 => 0x9293, + 0xb1 => 0x9322, 0xb2 => 0x942b, 0xb3 => 0x96fb, 0xb4 => 0x985a, + 0xb5 => 0x986b, 0xb6 => 0x991e, 0xb7 => 0x5207, 0xb8 => 0x622a, + 0xb9 => 0x6298, 0xba => 0x6d59, 0xbb => 0x7664, 0xbc => 0x7aca, + 0xbd => 0x7bc0, 0xbe => 0x7d76, 0xbf => 0x5360, 0xc0 => 0x5cbe, + 0xc1 => 0x5e97, 0xc2 => 0x6f38, 0xc3 => 0x70b9, 0xc4 => 0x7c98, + 0xc5 => 0x9711, 0xc6 => 0x9b8e, 0xc7 => 0x9ede, 0xc8 => 0x63a5, + 0xc9 => 0x647a, 0xca => 0x8776, 0xcb => 0x4e01, 0xcc => 0x4e95, + 0xcd => 0x4ead, 0xce => 0x505c, 0xcf => 0x5075, 0xd0 => 0x5448, + 0xd1 => 0x59c3, 0xd2 => 0x5b9a, 0xd3 => 0x5e40, 0xd4 => 0x5ead, + 0xd5 => 0x5ef7, 0xd6 => 0x5f81, 0xd7 => 0x60c5, 0xd8 => 0x633a, + 0xd9 => 0x653f, 0xda => 0x6574, 0xdb => 0x65cc, 0xdc => 0x6676, + 0xdd => 0x6678, 0xde => 0x67fe, 0xdf => 0x6968, 0xe0 => 0x6a89, + 0xe1 => 0x6b63, 0xe2 => 0x6c40, 0xe3 => 0x6dc0, 0xe4 => 0x6de8, + 0xe5 => 0x6e1f, 0xe6 => 0x6e5e, 0xe7 => 0x701e, 0xe8 => 0x70a1, + 0xe9 => 0x738e, 0xea => 0x73fd, 0xeb => 0x753a, 0xec => 0x775b, + 0xed => 0x7887, 0xee => 0x798e, 0xef => 0x7a0b, 0xf0 => 0x7a7d, + 0xf1 => 0x7cbe, 0xf2 => 0x7d8e, 0xf3 => 0x8247, 0xf4 => 0x8a02, + 0xf5 => 0x8aea, 0xf6 => 0x8c9e, 0xf7 => 0x912d, 0xf8 => 0x914a, + 0xf9 => 0x91d8, 0xfa => 0x9266, 0xfb => 0x92cc, 0xfc => 0x9320, + 0xfd => 0x9706, 0xfe => 0x9756, + }, + 0xf0 => { + 0xa1 => 0x975c, 0xa2 => 0x9802, 0xa3 => 0x9f0e, 0xa4 => 0x5236, + 0xa5 => 0x5291, 0xa6 => 0x557c, 0xa7 => 0x5824, 0xa8 => 0x5e1d, + 0xa9 => 0x5f1f, 0xaa => 0x608c, 0xab => 0x63d0, 0xac => 0x68af, + 0xad => 0x6fdf, 0xae => 0x796d, 0xaf => 0x7b2c, 0xb0 => 0x81cd, + 0xb1 => 0x85ba, 0xb2 => 0x88fd, 0xb3 => 0x8af8, 0xb4 => 0x8e44, + 0xb5 => 0x918d, 0xb6 => 0x9664, 0xb7 => 0x969b, 0xb8 => 0x973d, + 0xb9 => 0x984c, 0xba => 0x9f4a, 0xbb => 0x4fce, 0xbc => 0x5146, + 0xbd => 0x51cb, 0xbe => 0x52a9, 0xbf => 0x5632, 0xc0 => 0x5f14, + 0xc1 => 0x5f6b, 0xc2 => 0x63aa, 0xc3 => 0x64cd, 0xc4 => 0x65e9, + 0xc5 => 0x6641, 0xc6 => 0x66fa, 0xc7 => 0x66f9, 0xc8 => 0x671d, + 0xc9 => 0x689d, 0xca => 0x68d7, 0xcb => 0x69fd, 0xcc => 0x6f15, + 0xcd => 0x6f6e, 0xce => 0x7167, 0xcf => 0x71e5, 0xd0 => 0x722a, + 0xd1 => 0x74aa, 0xd2 => 0x773a, 0xd3 => 0x7956, 0xd4 => 0x795a, + 0xd5 => 0x79df, 0xd6 => 0x7a20, 0xd7 => 0x7a95, 0xd8 => 0x7c97, + 0xd9 => 0x7cdf, 0xda => 0x7d44, 0xdb => 0x7e70, 0xdc => 0x8087, + 0xdd => 0x85fb, 0xde => 0x86a4, 0xdf => 0x8a54, 0xe0 => 0x8abf, + 0xe1 => 0x8d99, 0xe2 => 0x8e81, 0xe3 => 0x9020, 0xe4 => 0x906d, + 0xe5 => 0x91e3, 0xe6 => 0x963b, 0xe7 => 0x96d5, 0xe8 => 0x9ce5, + 0xe9 => 0x65cf, 0xea => 0x7c07, 0xeb => 0x8db3, 0xec => 0x93c3, + 0xed => 0x5b58, 0xee => 0x5c0a, 0xef => 0x5352, 0xf0 => 0x62d9, + 0xf1 => 0x731d, 0xf2 => 0x5027, 0xf3 => 0x5b97, 0xf4 => 0x5f9e, + 0xf5 => 0x60b0, 0xf6 => 0x616b, 0xf7 => 0x68d5, 0xf8 => 0x6dd9, + 0xf9 => 0x742e, 0xfa => 0x7a2e, 0xfb => 0x7d42, 0xfc => 0x7d9c, + 0xfd => 0x7e31, 0xfe => 0x816b, + }, + 0xf1 => { + 0xa1 => 0x8e2a, 0xa2 => 0x8e35, 0xa3 => 0x937e, 0xa4 => 0x9418, + 0xa5 => 0x4f50, 0xa6 => 0x5750, 0xa7 => 0x5de6, 0xa8 => 0x5ea7, + 0xa9 => 0x632b, 0xaa => 0x7f6a, 0xab => 0x4e3b, 0xac => 0x4f4f, + 0xad => 0x4f8f, 0xae => 0x505a, 0xaf => 0x59dd, 0xb0 => 0x80c4, + 0xb1 => 0x546a, 0xb2 => 0x5468, 0xb3 => 0x55fe, 0xb4 => 0x594f, + 0xb5 => 0x5b99, 0xb6 => 0x5dde, 0xb7 => 0x5eda, 0xb8 => 0x665d, + 0xb9 => 0x6731, 0xba => 0x67f1, 0xbb => 0x682a, 0xbc => 0x6ce8, + 0xbd => 0x6d32, 0xbe => 0x6e4a, 0xbf => 0x6f8d, 0xc0 => 0x70b7, + 0xc1 => 0x73e0, 0xc2 => 0x7587, 0xc3 => 0x7c4c, 0xc4 => 0x7d02, + 0xc5 => 0x7d2c, 0xc6 => 0x7da2, 0xc7 => 0x821f, 0xc8 => 0x86db, + 0xc9 => 0x8a3b, 0xca => 0x8a85, 0xcb => 0x8d70, 0xcc => 0x8e8a, + 0xcd => 0x8f33, 0xce => 0x9031, 0xcf => 0x914e, 0xd0 => 0x9152, + 0xd1 => 0x9444, 0xd2 => 0x99d0, 0xd3 => 0x7af9, 0xd4 => 0x7ca5, + 0xd5 => 0x4fca, 0xd6 => 0x5101, 0xd7 => 0x51c6, 0xd8 => 0x57c8, + 0xd9 => 0x5bef, 0xda => 0x5cfb, 0xdb => 0x6659, 0xdc => 0x6a3d, + 0xdd => 0x6d5a, 0xde => 0x6e96, 0xdf => 0x6fec, 0xe0 => 0x710c, + 0xe1 => 0x756f, 0xe2 => 0x7ae3, 0xe3 => 0x8822, 0xe4 => 0x9021, + 0xe5 => 0x9075, 0xe6 => 0x96cb, 0xe7 => 0x99ff, 0xe8 => 0x8301, + 0xe9 => 0x4e2d, 0xea => 0x4ef2, 0xeb => 0x8846, 0xec => 0x91cd, + 0xed => 0x537d, 0xee => 0x6adb, 0xef => 0x696b, 0xf0 => 0x6c41, + 0xf1 => 0x847a, 0xf2 => 0x589e, 0xf3 => 0x618e, 0xf4 => 0x66fe, + 0xf5 => 0x62ef, 0xf6 => 0x70dd, 0xf7 => 0x7511, 0xf8 => 0x75c7, + 0xf9 => 0x7e52, 0xfa => 0x84b8, 0xfb => 0x8b49, 0xfc => 0x8d08, + 0xfd => 0x4e4b, 0xfe => 0x53ea, + }, + 0xf2 => { + 0xa1 => 0x54ab, 0xa2 => 0x5730, 0xa3 => 0x5740, 0xa4 => 0x5fd7, + 0xa5 => 0x6301, 0xa6 => 0x6307, 0xa7 => 0x646f, 0xa8 => 0x652f, + 0xa9 => 0x65e8, 0xaa => 0x667a, 0xab => 0x679d, 0xac => 0x67b3, + 0xad => 0x6b62, 0xae => 0x6c60, 0xaf => 0x6c9a, 0xb0 => 0x6f2c, + 0xb1 => 0x77e5, 0xb2 => 0x7825, 0xb3 => 0x7949, 0xb4 => 0x7957, + 0xb5 => 0x7d19, 0xb6 => 0x80a2, 0xb7 => 0x8102, 0xb8 => 0x81f3, + 0xb9 => 0x829d, 0xba => 0x82b7, 0xbb => 0x8718, 0xbc => 0x8a8c, + 0xbd => 0xf9fc, 0xbe => 0x8d04, 0xbf => 0x8dbe, 0xc0 => 0x9072, + 0xc1 => 0x76f4, 0xc2 => 0x7a19, 0xc3 => 0x7a37, 0xc4 => 0x7e54, + 0xc5 => 0x8077, 0xc6 => 0x5507, 0xc7 => 0x55d4, 0xc8 => 0x5875, + 0xc9 => 0x632f, 0xca => 0x6422, 0xcb => 0x6649, 0xcc => 0x664b, + 0xcd => 0x686d, 0xce => 0x699b, 0xcf => 0x6b84, 0xd0 => 0x6d25, + 0xd1 => 0x6eb1, 0xd2 => 0x73cd, 0xd3 => 0x7468, 0xd4 => 0x74a1, + 0xd5 => 0x755b, 0xd6 => 0x75b9, 0xd7 => 0x76e1, 0xd8 => 0x771e, + 0xd9 => 0x778b, 0xda => 0x79e6, 0xdb => 0x7e09, 0xdc => 0x7e1d, + 0xdd => 0x81fb, 0xde => 0x852f, 0xdf => 0x8897, 0xe0 => 0x8a3a, + 0xe1 => 0x8cd1, 0xe2 => 0x8eeb, 0xe3 => 0x8fb0, 0xe4 => 0x9032, + 0xe5 => 0x93ad, 0xe6 => 0x9663, 0xe7 => 0x9673, 0xe8 => 0x9707, + 0xe9 => 0x4f84, 0xea => 0x53f1, 0xeb => 0x59ea, 0xec => 0x5ac9, + 0xed => 0x5e19, 0xee => 0x684e, 0xef => 0x74c6, 0xf0 => 0x75be, + 0xf1 => 0x79e9, 0xf2 => 0x7a92, 0xf3 => 0x81a3, 0xf4 => 0x86ed, + 0xf5 => 0x8cea, 0xf6 => 0x8dcc, 0xf7 => 0x8fed, 0xf8 => 0x659f, + 0xf9 => 0x6715, 0xfa => 0xf9fd, 0xfb => 0x57f7, 0xfc => 0x6f57, + 0xfd => 0x7ddd, 0xfe => 0x8f2f, + }, + 0xf3 => { + 0xa1 => 0x93f6, 0xa2 => 0x96c6, 0xa3 => 0x5fb5, 0xa4 => 0x61f2, + 0xa5 => 0x6f84, 0xa6 => 0x4e14, 0xa7 => 0x4f98, 0xa8 => 0x501f, + 0xa9 => 0x53c9, 0xaa => 0x55df, 0xab => 0x5d6f, 0xac => 0x5dee, + 0xad => 0x6b21, 0xae => 0x6b64, 0xaf => 0x78cb, 0xb0 => 0x7b9a, + 0xb1 => 0xf9fe, 0xb2 => 0x8e49, 0xb3 => 0x8eca, 0xb4 => 0x906e, + 0xb5 => 0x6349, 0xb6 => 0x643e, 0xb7 => 0x7740, 0xb8 => 0x7a84, + 0xb9 => 0x932f, 0xba => 0x947f, 0xbb => 0x9f6a, 0xbc => 0x64b0, + 0xbd => 0x6faf, 0xbe => 0x71e6, 0xbf => 0x74a8, 0xc0 => 0x74da, + 0xc1 => 0x7ac4, 0xc2 => 0x7c12, 0xc3 => 0x7e82, 0xc4 => 0x7cb2, + 0xc5 => 0x7e98, 0xc6 => 0x8b9a, 0xc7 => 0x8d0a, 0xc8 => 0x947d, + 0xc9 => 0x9910, 0xca => 0x994c, 0xcb => 0x5239, 0xcc => 0x5bdf, + 0xcd => 0x64e6, 0xce => 0x672d, 0xcf => 0x7d2e, 0xd0 => 0x50ed, + 0xd1 => 0x53c3, 0xd2 => 0x5879, 0xd3 => 0x6158, 0xd4 => 0x6159, + 0xd5 => 0x61fa, 0xd6 => 0x65ac, 0xd7 => 0x7ad9, 0xd8 => 0x8b92, + 0xd9 => 0x8b96, 0xda => 0x5009, 0xdb => 0x5021, 0xdc => 0x5275, + 0xdd => 0x5531, 0xde => 0x5a3c, 0xdf => 0x5ee0, 0xe0 => 0x5f70, + 0xe1 => 0x6134, 0xe2 => 0x655e, 0xe3 => 0x660c, 0xe4 => 0x6636, + 0xe5 => 0x66a2, 0xe6 => 0x69cd, 0xe7 => 0x6ec4, 0xe8 => 0x6f32, + 0xe9 => 0x7316, 0xea => 0x7621, 0xeb => 0x7a93, 0xec => 0x8139, + 0xed => 0x8259, 0xee => 0x83d6, 0xef => 0x84bc, 0xf0 => 0x50b5, + 0xf1 => 0x57f0, 0xf2 => 0x5bc0, 0xf3 => 0x5be8, 0xf4 => 0x5f69, + 0xf5 => 0x63a1, 0xf6 => 0x7826, 0xf7 => 0x7db5, 0xf8 => 0x83dc, + 0xf9 => 0x8521, 0xfa => 0x91c7, 0xfb => 0x91f5, 0xfc => 0x518a, + 0xfd => 0x67f5, 0xfe => 0x7b56, + }, + 0xf4 => { + 0xa1 => 0x8cac, 0xa2 => 0x51c4, 0xa3 => 0x59bb, 0xa4 => 0x60bd, + 0xa5 => 0x8655, 0xa6 => 0x501c, 0xa7 => 0xf9ff, 0xa8 => 0x5254, + 0xa9 => 0x5c3a, 0xaa => 0x617d, 0xab => 0x621a, 0xac => 0x62d3, + 0xad => 0x64f2, 0xae => 0x65a5, 0xaf => 0x6ecc, 0xb0 => 0x7620, + 0xb1 => 0x810a, 0xb2 => 0x8e60, 0xb3 => 0x965f, 0xb4 => 0x96bb, + 0xb5 => 0x4edf, 0xb6 => 0x5343, 0xb7 => 0x5598, 0xb8 => 0x5929, + 0xb9 => 0x5ddd, 0xba => 0x64c5, 0xbb => 0x6cc9, 0xbc => 0x6dfa, + 0xbd => 0x7394, 0xbe => 0x7a7f, 0xbf => 0x821b, 0xc0 => 0x85a6, + 0xc1 => 0x8ce4, 0xc2 => 0x8e10, 0xc3 => 0x9077, 0xc4 => 0x91e7, + 0xc5 => 0x95e1, 0xc6 => 0x9621, 0xc7 => 0x97c6, 0xc8 => 0x51f8, + 0xc9 => 0x54f2, 0xca => 0x5586, 0xcb => 0x5fb9, 0xcc => 0x64a4, + 0xcd => 0x6f88, 0xce => 0x7db4, 0xcf => 0x8f1f, 0xd0 => 0x8f4d, + 0xd1 => 0x9435, 0xd2 => 0x50c9, 0xd3 => 0x5c16, 0xd4 => 0x6cbe, + 0xd5 => 0x6dfb, 0xd6 => 0x751b, 0xd7 => 0x77bb, 0xd8 => 0x7c3d, + 0xd9 => 0x7c64, 0xda => 0x8a79, 0xdb => 0x8ac2, 0xdc => 0x581e, + 0xdd => 0x59be, 0xde => 0x5e16, 0xdf => 0x6377, 0xe0 => 0x7252, + 0xe1 => 0x758a, 0xe2 => 0x776b, 0xe3 => 0x8adc, 0xe4 => 0x8cbc, + 0xe5 => 0x8f12, 0xe6 => 0x5ef3, 0xe7 => 0x6674, 0xe8 => 0x6df8, + 0xe9 => 0x807d, 0xea => 0x83c1, 0xeb => 0x8acb, 0xec => 0x9751, + 0xed => 0x9bd6, 0xee => 0xfa00, 0xef => 0x5243, 0xf0 => 0x66ff, + 0xf1 => 0x6d95, 0xf2 => 0x6eef, 0xf3 => 0x7de0, 0xf4 => 0x8ae6, + 0xf5 => 0x902e, 0xf6 => 0x905e, 0xf7 => 0x9ad4, 0xf8 => 0x521d, + 0xf9 => 0x527f, 0xfa => 0x54e8, 0xfb => 0x6194, 0xfc => 0x6284, + 0xfd => 0x62db, 0xfe => 0x68a2, + }, + 0xf5 => { + 0xa1 => 0x6912, 0xa2 => 0x695a, 0xa3 => 0x6a35, 0xa4 => 0x7092, + 0xa5 => 0x7126, 0xa6 => 0x785d, 0xa7 => 0x7901, 0xa8 => 0x790e, + 0xa9 => 0x79d2, 0xaa => 0x7a0d, 0xab => 0x8096, 0xac => 0x8278, + 0xad => 0x82d5, 0xae => 0x8349, 0xaf => 0x8549, 0xb0 => 0x8c82, + 0xb1 => 0x8d85, 0xb2 => 0x9162, 0xb3 => 0x918b, 0xb4 => 0x91ae, + 0xb5 => 0x4fc3, 0xb6 => 0x56d1, 0xb7 => 0x71ed, 0xb8 => 0x77d7, + 0xb9 => 0x8700, 0xba => 0x89f8, 0xbb => 0x5bf8, 0xbc => 0x5fd6, + 0xbd => 0x6751, 0xbe => 0x90a8, 0xbf => 0x53e2, 0xc0 => 0x585a, + 0xc1 => 0x5bf5, 0xc2 => 0x60a4, 0xc3 => 0x6181, 0xc4 => 0x6460, + 0xc5 => 0x7e3d, 0xc6 => 0x8070, 0xc7 => 0x8525, 0xc8 => 0x9283, + 0xc9 => 0x64ae, 0xca => 0x50ac, 0xcb => 0x5d14, 0xcc => 0x6700, + 0xcd => 0x589c, 0xce => 0x62bd, 0xcf => 0x63a8, 0xd0 => 0x690e, + 0xd1 => 0x6978, 0xd2 => 0x6a1e, 0xd3 => 0x6e6b, 0xd4 => 0x76ba, + 0xd5 => 0x79cb, 0xd6 => 0x82bb, 0xd7 => 0x8429, 0xd8 => 0x8acf, + 0xd9 => 0x8da8, 0xda => 0x8ffd, 0xdb => 0x9112, 0xdc => 0x914b, + 0xdd => 0x919c, 0xde => 0x9310, 0xdf => 0x9318, 0xe0 => 0x939a, + 0xe1 => 0x96db, 0xe2 => 0x9a36, 0xe3 => 0x9c0d, 0xe4 => 0x4e11, + 0xe5 => 0x755c, 0xe6 => 0x795d, 0xe7 => 0x7afa, 0xe8 => 0x7b51, + 0xe9 => 0x7bc9, 0xea => 0x7e2e, 0xeb => 0x84c4, 0xec => 0x8e59, + 0xed => 0x8e74, 0xee => 0x8ef8, 0xef => 0x9010, 0xf0 => 0x6625, + 0xf1 => 0x693f, 0xf2 => 0x7443, 0xf3 => 0x51fa, 0xf4 => 0x672e, + 0xf5 => 0x9edc, 0xf6 => 0x5145, 0xf7 => 0x5fe0, 0xf8 => 0x6c96, + 0xf9 => 0x87f2, 0xfa => 0x885d, 0xfb => 0x8877, 0xfc => 0x60b4, + 0xfd => 0x81b5, 0xfe => 0x8403, + }, + 0xf6 => { + 0xa1 => 0x8d05, 0xa2 => 0x53d6, 0xa3 => 0x5439, 0xa4 => 0x5634, + 0xa5 => 0x5a36, 0xa6 => 0x5c31, 0xa7 => 0x708a, 0xa8 => 0x7fe0, + 0xa9 => 0x805a, 0xaa => 0x8106, 0xab => 0x81ed, 0xac => 0x8da3, + 0xad => 0x9189, 0xae => 0x9a5f, 0xaf => 0x9df2, 0xb0 => 0x5074, + 0xb1 => 0x4ec4, 0xb2 => 0x53a0, 0xb3 => 0x60fb, 0xb4 => 0x6e2c, + 0xb5 => 0x5c64, 0xb6 => 0x4f88, 0xb7 => 0x5024, 0xb8 => 0x55e4, + 0xb9 => 0x5cd9, 0xba => 0x5e5f, 0xbb => 0x6065, 0xbc => 0x6894, + 0xbd => 0x6cbb, 0xbe => 0x6dc4, 0xbf => 0x71be, 0xc0 => 0x75d4, + 0xc1 => 0x75f4, 0xc2 => 0x7661, 0xc3 => 0x7a1a, 0xc4 => 0x7a49, + 0xc5 => 0x7dc7, 0xc6 => 0x7dfb, 0xc7 => 0x7f6e, 0xc8 => 0x81f4, + 0xc9 => 0x86a9, 0xca => 0x8f1c, 0xcb => 0x96c9, 0xcc => 0x99b3, + 0xcd => 0x9f52, 0xce => 0x5247, 0xcf => 0x52c5, 0xd0 => 0x98ed, + 0xd1 => 0x89aa, 0xd2 => 0x4e03, 0xd3 => 0x67d2, 0xd4 => 0x6f06, + 0xd5 => 0x4fb5, 0xd6 => 0x5be2, 0xd7 => 0x6795, 0xd8 => 0x6c88, + 0xd9 => 0x6d78, 0xda => 0x741b, 0xdb => 0x7827, 0xdc => 0x91dd, + 0xdd => 0x937c, 0xde => 0x87c4, 0xdf => 0x79e4, 0xe0 => 0x7a31, + 0xe1 => 0x5feb, 0xe2 => 0x4ed6, 0xe3 => 0x54a4, 0xe4 => 0x553e, + 0xe5 => 0x58ae, 0xe6 => 0x59a5, 0xe7 => 0x60f0, 0xe8 => 0x6253, + 0xe9 => 0x62d6, 0xea => 0x6736, 0xeb => 0x6955, 0xec => 0x8235, + 0xed => 0x9640, 0xee => 0x99b1, 0xef => 0x99dd, 0xf0 => 0x502c, + 0xf1 => 0x5353, 0xf2 => 0x5544, 0xf3 => 0x577c, 0xf4 => 0xfa01, + 0xf5 => 0x6258, 0xf6 => 0xfa02, 0xf7 => 0x64e2, 0xf8 => 0x666b, + 0xf9 => 0x67dd, 0xfa => 0x6fc1, 0xfb => 0x6fef, 0xfc => 0x7422, + 0xfd => 0x7438, 0xfe => 0x8a17, + }, + 0xf7 => { + 0xa1 => 0x9438, 0xa2 => 0x5451, 0xa3 => 0x5606, 0xa4 => 0x5766, + 0xa5 => 0x5f48, 0xa6 => 0x619a, 0xa7 => 0x6b4e, 0xa8 => 0x7058, + 0xa9 => 0x70ad, 0xaa => 0x7dbb, 0xab => 0x8a95, 0xac => 0x596a, + 0xad => 0x812b, 0xae => 0x63a2, 0xaf => 0x7708, 0xb0 => 0x803d, + 0xb1 => 0x8caa, 0xb2 => 0x5854, 0xb3 => 0x642d, 0xb4 => 0x69bb, + 0xb5 => 0x5b95, 0xb6 => 0x5e11, 0xb7 => 0x6e6f, 0xb8 => 0xfa03, + 0xb9 => 0x8569, 0xba => 0x514c, 0xbb => 0x53f0, 0xbc => 0x592a, + 0xbd => 0x6020, 0xbe => 0x614b, 0xbf => 0x6b86, 0xc0 => 0x6c70, + 0xc1 => 0x6cf0, 0xc2 => 0x7b1e, 0xc3 => 0x80ce, 0xc4 => 0x82d4, + 0xc5 => 0x8dc6, 0xc6 => 0x90b0, 0xc7 => 0x98b1, 0xc8 => 0xfa04, + 0xc9 => 0x64c7, 0xca => 0x6fa4, 0xcb => 0x6491, 0xcc => 0x6504, + 0xcd => 0x514e, 0xce => 0x5410, 0xcf => 0x571f, 0xd0 => 0x8a0e, + 0xd1 => 0x615f, 0xd2 => 0x6876, 0xd3 => 0xfa05, 0xd4 => 0x75db, + 0xd5 => 0x7b52, 0xd6 => 0x7d71, 0xd7 => 0x901a, 0xd8 => 0x5806, + 0xd9 => 0x69cc, 0xda => 0x817f, 0xdb => 0x892a, 0xdc => 0x9000, + 0xdd => 0x9839, 0xde => 0x5078, 0xdf => 0x5957, 0xe0 => 0x59ac, + 0xe1 => 0x6295, 0xe2 => 0x900f, 0xe3 => 0x9b2a, 0xe4 => 0x615d, + 0xe5 => 0x7279, 0xe6 => 0x95d6, 0xe7 => 0x5761, 0xe8 => 0x5a46, + 0xe9 => 0x5df4, 0xea => 0x628a, 0xeb => 0x64ad, 0xec => 0x64fa, + 0xed => 0x6777, 0xee => 0x6ce2, 0xef => 0x6d3e, 0xf0 => 0x722c, + 0xf1 => 0x7436, 0xf2 => 0x7834, 0xf3 => 0x7f77, 0xf4 => 0x82ad, + 0xf5 => 0x8ddb, 0xf6 => 0x9817, 0xf7 => 0x5224, 0xf8 => 0x5742, + 0xf9 => 0x677f, 0xfa => 0x7248, 0xfb => 0x74e3, 0xfc => 0x8ca9, + 0xfd => 0x8fa6, 0xfe => 0x9211, + }, + 0xf8 => { + 0xa1 => 0x962a, 0xa2 => 0x516b, 0xa3 => 0x53ed, 0xa4 => 0x634c, + 0xa5 => 0x4f69, 0xa6 => 0x5504, 0xa7 => 0x6096, 0xa8 => 0x6557, + 0xa9 => 0x6c9b, 0xaa => 0x6d7f, 0xab => 0x724c, 0xac => 0x72fd, + 0xad => 0x7a17, 0xae => 0x8987, 0xaf => 0x8c9d, 0xb0 => 0x5f6d, + 0xb1 => 0x6f8e, 0xb2 => 0x70f9, 0xb3 => 0x81a8, 0xb4 => 0x610e, + 0xb5 => 0x4fbf, 0xb6 => 0x504f, 0xb7 => 0x6241, 0xb8 => 0x7247, + 0xb9 => 0x7bc7, 0xba => 0x7de8, 0xbb => 0x7fe9, 0xbc => 0x904d, + 0xbd => 0x97ad, 0xbe => 0x9a19, 0xbf => 0x8cb6, 0xc0 => 0x576a, + 0xc1 => 0x5e73, 0xc2 => 0x67b0, 0xc3 => 0x840d, 0xc4 => 0x8a55, + 0xc5 => 0x5420, 0xc6 => 0x5b16, 0xc7 => 0x5e63, 0xc8 => 0x5ee2, + 0xc9 => 0x5f0a, 0xca => 0x6583, 0xcb => 0x80ba, 0xcc => 0x853d, + 0xcd => 0x9589, 0xce => 0x965b, 0xcf => 0x4f48, 0xd0 => 0x5305, + 0xd1 => 0x530d, 0xd2 => 0x530f, 0xd3 => 0x5486, 0xd4 => 0x54fa, + 0xd5 => 0x5703, 0xd6 => 0x5e03, 0xd7 => 0x6016, 0xd8 => 0x629b, + 0xd9 => 0x62b1, 0xda => 0x6355, 0xdb => 0xfa06, 0xdc => 0x6ce1, + 0xdd => 0x6d66, 0xde => 0x75b1, 0xdf => 0x7832, 0xe0 => 0x80de, + 0xe1 => 0x812f, 0xe2 => 0x82de, 0xe3 => 0x8461, 0xe4 => 0x84b2, + 0xe5 => 0x888d, 0xe6 => 0x8912, 0xe7 => 0x900b, 0xe8 => 0x92ea, + 0xe9 => 0x98fd, 0xea => 0x9b91, 0xeb => 0x5e45, 0xec => 0x66b4, + 0xed => 0x66dd, 0xee => 0x7011, 0xef => 0x7206, 0xf0 => 0xfa07, + 0xf1 => 0x4ff5, 0xf2 => 0x527d, 0xf3 => 0x5f6a, 0xf4 => 0x6153, + 0xf5 => 0x6753, 0xf6 => 0x6a19, 0xf7 => 0x6f02, 0xf8 => 0x74e2, + 0xf9 => 0x7968, 0xfa => 0x8868, 0xfb => 0x8c79, 0xfc => 0x98c7, + 0xfd => 0x98c4, 0xfe => 0x9a43, + }, + 0xf9 => { + 0xa1 => 0x54c1, 0xa2 => 0x7a1f, 0xa3 => 0x6953, 0xa4 => 0x8af7, + 0xa5 => 0x8c4a, 0xa6 => 0x98a8, 0xa7 => 0x99ae, 0xa8 => 0x5f7c, + 0xa9 => 0x62ab, 0xaa => 0x75b2, 0xab => 0x76ae, 0xac => 0x88ab, + 0xad => 0x907f, 0xae => 0x9642, 0xaf => 0x5339, 0xb0 => 0x5f3c, + 0xb1 => 0x5fc5, 0xb2 => 0x6ccc, 0xb3 => 0x73cc, 0xb4 => 0x7562, + 0xb5 => 0x758b, 0xb6 => 0x7b46, 0xb7 => 0x82fe, 0xb8 => 0x999d, + 0xb9 => 0x4e4f, 0xba => 0x903c, 0xbb => 0x4e0b, 0xbc => 0x4f55, + 0xbd => 0x53a6, 0xbe => 0x590f, 0xbf => 0x5ec8, 0xc0 => 0x6630, + 0xc1 => 0x6cb3, 0xc2 => 0x7455, 0xc3 => 0x8377, 0xc4 => 0x8766, + 0xc5 => 0x8cc0, 0xc6 => 0x9050, 0xc7 => 0x971e, 0xc8 => 0x9c15, + 0xc9 => 0x58d1, 0xca => 0x5b78, 0xcb => 0x8650, 0xcc => 0x8b14, + 0xcd => 0x9db4, 0xce => 0x5bd2, 0xcf => 0x6068, 0xd0 => 0x608d, + 0xd1 => 0x65f1, 0xd2 => 0x6c57, 0xd3 => 0x6f22, 0xd4 => 0x6fa3, + 0xd5 => 0x701a, 0xd6 => 0x7f55, 0xd7 => 0x7ff0, 0xd8 => 0x9591, + 0xd9 => 0x9592, 0xda => 0x9650, 0xdb => 0x97d3, 0xdc => 0x5272, + 0xdd => 0x8f44, 0xde => 0x51fd, 0xdf => 0x542b, 0xe0 => 0x54b8, + 0xe1 => 0x5563, 0xe2 => 0x558a, 0xe3 => 0x6abb, 0xe4 => 0x6db5, + 0xe5 => 0x7dd8, 0xe6 => 0x8266, 0xe7 => 0x929c, 0xe8 => 0x9677, + 0xe9 => 0x9e79, 0xea => 0x5408, 0xeb => 0x54c8, 0xec => 0x76d2, + 0xed => 0x86e4, 0xee => 0x95a4, 0xef => 0x95d4, 0xf0 => 0x965c, + 0xf1 => 0x4ea2, 0xf2 => 0x4f09, 0xf3 => 0x59ee, 0xf4 => 0x5ae6, + 0xf5 => 0x5df7, 0xf6 => 0x6052, 0xf7 => 0x6297, 0xf8 => 0x676d, + 0xf9 => 0x6841, 0xfa => 0x6c86, 0xfb => 0x6e2f, 0xfc => 0x7f38, + 0xfd => 0x809b, 0xfe => 0x822a, + }, + 0xfa => { + 0xa1 => 0xfa08, 0xa2 => 0xfa09, 0xa3 => 0x9805, 0xa4 => 0x4ea5, + 0xa5 => 0x5055, 0xa6 => 0x54b3, 0xa7 => 0x5793, 0xa8 => 0x595a, + 0xa9 => 0x5b69, 0xaa => 0x5bb3, 0xab => 0x61c8, 0xac => 0x6977, + 0xad => 0x6d77, 0xae => 0x7023, 0xaf => 0x87f9, 0xb0 => 0x89e3, + 0xb1 => 0x8a72, 0xb2 => 0x8ae7, 0xb3 => 0x9082, 0xb4 => 0x99ed, + 0xb5 => 0x9ab8, 0xb6 => 0x52be, 0xb7 => 0x6838, 0xb8 => 0x5016, + 0xb9 => 0x5e78, 0xba => 0x674f, 0xbb => 0x8347, 0xbc => 0x884c, + 0xbd => 0x4eab, 0xbe => 0x5411, 0xbf => 0x56ae, 0xc0 => 0x73e6, + 0xc1 => 0x9115, 0xc2 => 0x97ff, 0xc3 => 0x9909, 0xc4 => 0x9957, + 0xc5 => 0x9999, 0xc6 => 0x5653, 0xc7 => 0x589f, 0xc8 => 0x865b, + 0xc9 => 0x8a31, 0xca => 0x61b2, 0xcb => 0x6af6, 0xcc => 0x737b, + 0xcd => 0x8ed2, 0xce => 0x6b47, 0xcf => 0x96aa, 0xd0 => 0x9a57, + 0xd1 => 0x5955, 0xd2 => 0x7200, 0xd3 => 0x8d6b, 0xd4 => 0x9769, + 0xd5 => 0x4fd4, 0xd6 => 0x5cf4, 0xd7 => 0x5f26, 0xd8 => 0x61f8, + 0xd9 => 0x665b, 0xda => 0x6ceb, 0xdb => 0x70ab, 0xdc => 0x7384, + 0xdd => 0x73b9, 0xde => 0x73fe, 0xdf => 0x7729, 0xe0 => 0x774d, + 0xe1 => 0x7d43, 0xe2 => 0x7d62, 0xe3 => 0x7e23, 0xe4 => 0x8237, + 0xe5 => 0x8852, 0xe6 => 0xfa0a, 0xe7 => 0x8ce2, 0xe8 => 0x9249, + 0xe9 => 0x986f, 0xea => 0x5b51, 0xeb => 0x7a74, 0xec => 0x8840, + 0xed => 0x9801, 0xee => 0x5acc, 0xef => 0x4fe0, 0xf0 => 0x5354, + 0xf1 => 0x593e, 0xf2 => 0x5cfd, 0xf3 => 0x633e, 0xf4 => 0x6d79, + 0xf5 => 0x72f9, 0xf6 => 0x8105, 0xf7 => 0x8107, 0xf8 => 0x83a2, + 0xf9 => 0x92cf, 0xfa => 0x9830, 0xfb => 0x4ea8, 0xfc => 0x5144, + 0xfd => 0x5211, 0xfe => 0x578b, + }, + 0xfb => { + 0xa1 => 0x5f62, 0xa2 => 0x6cc2, 0xa3 => 0x6ece, 0xa4 => 0x7005, + 0xa5 => 0x7050, 0xa6 => 0x70af, 0xa7 => 0x7192, 0xa8 => 0x73e9, + 0xa9 => 0x7469, 0xaa => 0x834a, 0xab => 0x87a2, 0xac => 0x8861, + 0xad => 0x9008, 0xae => 0x90a2, 0xaf => 0x93a3, 0xb0 => 0x99a8, + 0xb1 => 0x516e, 0xb2 => 0x5f57, 0xb3 => 0x60e0, 0xb4 => 0x6167, + 0xb5 => 0x66b3, 0xb6 => 0x8559, 0xb7 => 0x8e4a, 0xb8 => 0x91af, + 0xb9 => 0x978b, 0xba => 0x4e4e, 0xbb => 0x4e92, 0xbc => 0x547c, + 0xbd => 0x58d5, 0xbe => 0x58fa, 0xbf => 0x597d, 0xc0 => 0x5cb5, + 0xc1 => 0x5f27, 0xc2 => 0x6236, 0xc3 => 0x6248, 0xc4 => 0x660a, + 0xc5 => 0x6667, 0xc6 => 0x6beb, 0xc7 => 0x6d69, 0xc8 => 0x6dcf, + 0xc9 => 0x6e56, 0xca => 0x6ef8, 0xcb => 0x6f94, 0xcc => 0x6fe0, + 0xcd => 0x6fe9, 0xce => 0x705d, 0xcf => 0x72d0, 0xd0 => 0x7425, + 0xd1 => 0x745a, 0xd2 => 0x74e0, 0xd3 => 0x7693, 0xd4 => 0x795c, + 0xd5 => 0x7cca, 0xd6 => 0x7e1e, 0xd7 => 0x80e1, 0xd8 => 0x82a6, + 0xd9 => 0x846b, 0xda => 0x84bf, 0xdb => 0x864e, 0xdc => 0x865f, + 0xdd => 0x8774, 0xde => 0x8b77, 0xdf => 0x8c6a, 0xe0 => 0x93ac, + 0xe1 => 0x9800, 0xe2 => 0x9865, 0xe3 => 0x60d1, 0xe4 => 0x6216, + 0xe5 => 0x9177, 0xe6 => 0x5a5a, 0xe7 => 0x660f, 0xe8 => 0x6df7, + 0xe9 => 0x6e3e, 0xea => 0x743f, 0xeb => 0x9b42, 0xec => 0x5ffd, + 0xed => 0x60da, 0xee => 0x7b0f, 0xef => 0x54c4, 0xf0 => 0x5f18, + 0xf1 => 0x6c5e, 0xf2 => 0x6cd3, 0xf3 => 0x6d2a, 0xf4 => 0x70d8, + 0xf5 => 0x7d05, 0xf6 => 0x8679, 0xf7 => 0x8a0c, 0xf8 => 0x9d3b, + 0xf9 => 0x5316, 0xfa => 0x548c, 0xfb => 0x5b05, 0xfc => 0x6a3a, + 0xfd => 0x706b, 0xfe => 0x7575, + }, + 0xfc => { + 0xa1 => 0x798d, 0xa2 => 0x79be, 0xa3 => 0x82b1, 0xa4 => 0x83ef, + 0xa5 => 0x8a71, 0xa6 => 0x8b41, 0xa7 => 0x8ca8, 0xa8 => 0x9774, + 0xa9 => 0xfa0b, 0xaa => 0x64f4, 0xab => 0x652b, 0xac => 0x78ba, + 0xad => 0x78bb, 0xae => 0x7a6b, 0xaf => 0x4e38, 0xb0 => 0x559a, + 0xb1 => 0x5950, 0xb2 => 0x5ba6, 0xb3 => 0x5e7b, 0xb4 => 0x60a3, + 0xb5 => 0x63db, 0xb6 => 0x6b61, 0xb7 => 0x6665, 0xb8 => 0x6853, + 0xb9 => 0x6e19, 0xba => 0x7165, 0xbb => 0x74b0, 0xbc => 0x7d08, + 0xbd => 0x9084, 0xbe => 0x9a69, 0xbf => 0x9c25, 0xc0 => 0x6d3b, + 0xc1 => 0x6ed1, 0xc2 => 0x733e, 0xc3 => 0x8c41, 0xc4 => 0x95ca, + 0xc5 => 0x51f0, 0xc6 => 0x5e4c, 0xc7 => 0x5fa8, 0xc8 => 0x604d, + 0xc9 => 0x60f6, 0xca => 0x6130, 0xcb => 0x614c, 0xcc => 0x6643, + 0xcd => 0x6644, 0xce => 0x69a5, 0xcf => 0x6cc1, 0xd0 => 0x6e5f, + 0xd1 => 0x6ec9, 0xd2 => 0x6f62, 0xd3 => 0x714c, 0xd4 => 0x749c, + 0xd5 => 0x7687, 0xd6 => 0x7bc1, 0xd7 => 0x7c27, 0xd8 => 0x8352, + 0xd9 => 0x8757, 0xda => 0x9051, 0xdb => 0x968d, 0xdc => 0x9ec3, + 0xdd => 0x532f, 0xde => 0x56de, 0xdf => 0x5efb, 0xe0 => 0x5f8a, + 0xe1 => 0x6062, 0xe2 => 0x6094, 0xe3 => 0x61f7, 0xe4 => 0x6666, + 0xe5 => 0x6703, 0xe6 => 0x6a9c, 0xe7 => 0x6dee, 0xe8 => 0x6fae, + 0xe9 => 0x7070, 0xea => 0x736a, 0xeb => 0x7e6a, 0xec => 0x81be, + 0xed => 0x8334, 0xee => 0x86d4, 0xef => 0x8aa8, 0xf0 => 0x8cc4, + 0xf1 => 0x5283, 0xf2 => 0x7372, 0xf3 => 0x5b96, 0xf4 => 0x6a6b, + 0xf5 => 0x9404, 0xf6 => 0x54ee, 0xf7 => 0x5686, 0xf8 => 0x5b5d, + 0xf9 => 0x6548, 0xfa => 0x6585, 0xfb => 0x66c9, 0xfc => 0x689f, + 0xfd => 0x6d8d, 0xfe => 0x6dc6, + }, + 0xfd => { + 0xa1 => 0x723b, 0xa2 => 0x80b4, 0xa3 => 0x9175, 0xa4 => 0x9a4d, + 0xa5 => 0x4faf, 0xa6 => 0x5019, 0xa7 => 0x539a, 0xa8 => 0x540e, + 0xa9 => 0x543c, 0xaa => 0x5589, 0xab => 0x55c5, 0xac => 0x5e3f, + 0xad => 0x5f8c, 0xae => 0x673d, 0xaf => 0x7166, 0xb0 => 0x73dd, + 0xb1 => 0x9005, 0xb2 => 0x52db, 0xb3 => 0x52f3, 0xb4 => 0x5864, + 0xb5 => 0x58ce, 0xb6 => 0x7104, 0xb7 => 0x718f, 0xb8 => 0x71fb, + 0xb9 => 0x85b0, 0xba => 0x8a13, 0xbb => 0x6688, 0xbc => 0x85a8, + 0xbd => 0x55a7, 0xbe => 0x6684, 0xbf => 0x714a, 0xc0 => 0x8431, + 0xc1 => 0x5349, 0xc2 => 0x5599, 0xc3 => 0x6bc1, 0xc4 => 0x5f59, + 0xc5 => 0x5fbd, 0xc6 => 0x63ee, 0xc7 => 0x6689, 0xc8 => 0x7147, + 0xc9 => 0x8af1, 0xca => 0x8f1d, 0xcb => 0x9ebe, 0xcc => 0x4f11, + 0xcd => 0x643a, 0xce => 0x70cb, 0xcf => 0x7566, 0xd0 => 0x8667, + 0xd1 => 0x6064, 0xd2 => 0x8b4e, 0xd3 => 0x9df8, 0xd4 => 0x5147, + 0xd5 => 0x51f6, 0xd6 => 0x5308, 0xd7 => 0x6d36, 0xd8 => 0x80f8, + 0xd9 => 0x9ed1, 0xda => 0x6615, 0xdb => 0x6b23, 0xdc => 0x7098, + 0xdd => 0x75d5, 0xde => 0x5403, 0xdf => 0x5c79, 0xe0 => 0x7d07, + 0xe1 => 0x8a16, 0xe2 => 0x6b20, 0xe3 => 0x6b3d, 0xe4 => 0x6b46, + 0xe5 => 0x5438, 0xe6 => 0x6070, 0xe7 => 0x6d3d, 0xe8 => 0x7fd5, + 0xe9 => 0x8208, 0xea => 0x50d6, 0xeb => 0x51de, 0xec => 0x559c, + 0xed => 0x566b, 0xee => 0x56cd, 0xef => 0x59ec, 0xf0 => 0x5b09, + 0xf1 => 0x5e0c, 0xf2 => 0x6199, 0xf3 => 0x6198, 0xf4 => 0x6231, + 0xf5 => 0x665e, 0xf6 => 0x66e6, 0xf7 => 0x7199, 0xf8 => 0x71b9, + 0xf9 => 0x71ba, 0xfa => 0x72a7, 0xfb => 0x79a7, 0xfc => 0x7a00, + 0xfd => 0x7fb2, 0xfe => 0x8a70, + }, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacLatin2.pm b/lib/Image/ExifTool/Charset/MacLatin2.pm new file mode 100644 index 0000000..5b891ec --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacLatin2.pm @@ -0,0 +1,44 @@ +#------------------------------------------------------------------------------ +# File: MacLatin2.pm +# +# Description: Mac Central European to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/CENTEURO.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacLatin2 = ( + 0x80 => 0xc4, 0x81 => 0x0100, 0x82 => 0x0101, 0x83 => 0xc9, 0x84 => 0x0104, + 0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0x0105, 0x89 => 0x010c, + 0x8a => 0xe4, 0x8b => 0x010d, 0x8c => 0x0106, 0x8d => 0x0107, 0x8e => 0xe9, + 0x8f => 0x0179, 0x90 => 0x017a, 0x91 => 0x010e, 0x92 => 0xed, 0x93 => 0x010f, + 0x94 => 0x0112, 0x95 => 0x0113, 0x96 => 0x0116, 0x97 => 0xf3, 0x98 => 0x0117, + 0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa, 0x9d => 0x011a, + 0x9e => 0x011b, 0x9f => 0xfc, 0xa0 => 0x2020, 0xa1 => 0xb0, 0xa2 => 0x0118, + 0xa4 => 0xa7, 0xa5 => 0x2022, 0xa6 => 0xb6, 0xa7 => 0xdf, 0xa8 => 0xae, + 0xaa => 0x2122, 0xab => 0x0119, 0xac => 0xa8, 0xad => 0x2260, 0xae => 0x0123, + 0xaf => 0x012e, 0xb0 => 0x012f, 0xb1 => 0x012a, 0xb2 => 0x2264, + 0xb3 => 0x2265, 0xb4 => 0x012b, 0xb5 => 0x0136, 0xb6 => 0x2202, + 0xb7 => 0x2211, 0xb8 => 0x0142, 0xb9 => 0x013b, 0xba => 0x013c, + 0xbb => 0x013d, 0xbc => 0x013e, 0xbd => 0x0139, 0xbe => 0x013a, + 0xbf => 0x0145, 0xc0 => 0x0146, 0xc1 => 0x0143, 0xc2 => 0xac, 0xc3 => 0x221a, + 0xc4 => 0x0144, 0xc5 => 0x0147, 0xc6 => 0x2206, 0xc7 => 0xab, 0xc8 => 0xbb, + 0xc9 => 0x2026, 0xca => 0xa0, 0xcb => 0x0148, 0xcc => 0x0150, 0xcd => 0xd5, + 0xce => 0x0151, 0xcf => 0x014c, 0xd0 => 0x2013, 0xd1 => 0x2014, + 0xd2 => 0x201c, 0xd3 => 0x201d, 0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7, + 0xd7 => 0x25ca, 0xd8 => 0x014d, 0xd9 => 0x0154, 0xda => 0x0155, + 0xdb => 0x0158, 0xdc => 0x2039, 0xdd => 0x203a, 0xde => 0x0159, + 0xdf => 0x0156, 0xe0 => 0x0157, 0xe1 => 0x0160, 0xe2 => 0x201a, + 0xe3 => 0x201e, 0xe4 => 0x0161, 0xe5 => 0x015a, 0xe6 => 0x015b, 0xe7 => 0xc1, + 0xe8 => 0x0164, 0xe9 => 0x0165, 0xea => 0xcd, 0xeb => 0x017d, 0xec => 0x017e, + 0xed => 0x016a, 0xee => 0xd3, 0xef => 0xd4, 0xf0 => 0x016b, 0xf1 => 0x016e, + 0xf2 => 0xda, 0xf3 => 0x016f, 0xf4 => 0x0170, 0xf5 => 0x0171, 0xf6 => 0x0172, + 0xf7 => 0x0173, 0xf8 => 0xdd, 0xf9 => 0xfd, 0xfa => 0x0137, 0xfb => 0x017b, + 0xfc => 0x0141, 0xfd => 0x017c, 0xfe => 0x0122, 0xff => 0x02c7, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacRSymbol.pm b/lib/Image/ExifTool/Charset/MacRSymbol.pm new file mode 100644 index 0000000..073c743 --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacRSymbol.pm @@ -0,0 +1,2087 @@ +#------------------------------------------------------------------------------ +# File: MacRSymbol.pm +# +# Description: Mac RSymbol (cp10008) to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://www.haible.de/bruno/charsets/conversion-tables/GB2312.tar.bz2 +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacRSymbol = ( + 0x81 => 0xf8d8, 0x82 => 0xf8d9, 0x83 => 0xf8da, 0x84 => 0xf8db, + 0x85 => 0xf8dc, 0x86 => 0xf8dd, 0x87 => 0xf8de, 0x88 => 0xf8df, + 0x89 => 0xf8e0, 0x8a => 0xf8e1, 0x8b => 0xf8e2, 0x8c => 0xf8e3, + 0x8d => 0xf8e4, 0x8e => 0xf8e5, 0x8f => 0xf8e6, 0x90 => 0xf8e7, + 0x91 => 0xf8e8, 0x92 => 0xf8e9, 0x93 => 0xf8ea, 0x94 => 0xf8eb, + 0x95 => 0xf8ec, 0x96 => 0xf8ed, 0x97 => 0xf8ee, 0x98 => 0xf8ef, + 0x99 => 0xf8f0, 0x9a => 0xf8f1, 0x9b => 0xf8f2, 0x9c => 0xf8f3, + 0x9d => 0xf8f4, 0x9e => 0xf8f5, 0x9f => 0xf8f6, 0xa0 => 0xf8f7, + 0xa1 => { + 0xa1 => 0x3000, 0xa2 => 0x3001, 0xa3 => 0x3002, 0xa4 => 0x30fb, + 0xa5 => 0x02c9, 0xa6 => 0x02c7, 0xa7 => 0xa8, 0xa8 => 0x3003, + 0xa9 => 0x3005, 0xaa => 0x2015, 0xab => 0xff5e, 0xad => 0x2026, + 0xae => 0x2018, 0xaf => 0x2019, 0xb0 => 0x201c, 0xb1 => 0x201d, + 0xb2 => 0x3014, 0xb3 => 0x3015, 0xb4 => 0x3008, 0xb5 => 0x3009, + 0xb6 => 0x300a, 0xb7 => 0x300b, 0xb8 => 0x300c, 0xb9 => 0x300d, + 0xba => 0x300e, 0xbb => 0x300f, 0xbc => 0x3016, 0xbd => 0x3017, + 0xbe => 0x3010, 0xbf => 0x3011, 0xc0 => 0xb1, 0xc1 => 0xd7, 0xc2 => 0xf7, + 0xc3 => 0x2236, 0xc4 => 0x2227, 0xc5 => 0x2228, 0xc6 => 0x2211, + 0xc7 => 0x220f, 0xc8 => 0x222a, 0xc9 => 0x2229, 0xca => 0x2208, + 0xcb => 0x2237, 0xcc => 0x221a, 0xcd => 0x22a5, 0xce => 0x2225, + 0xcf => 0x2220, 0xd0 => 0x2312, 0xd1 => 0x2299, 0xd2 => 0x222b, + 0xd3 => 0x222e, 0xd4 => 0x2261, 0xd5 => 0x224c, 0xd6 => 0x2248, + 0xd7 => 0x223d, 0xd8 => 0x221d, 0xd9 => 0x2260, 0xda => 0x226e, + 0xdb => 0x226f, 0xdc => 0x2264, 0xdd => 0x2265, 0xde => 0x221e, + 0xdf => 0x2235, 0xe0 => 0x2234, 0xe1 => 0x2642, 0xe2 => 0x2640, + 0xe3 => 0xb0, 0xe4 => 0x2032, 0xe5 => 0x2033, 0xe6 => 0x2103, + 0xe7 => 0xff04, 0xe8 => 0xa4, 0xe9 => 0xffe0, 0xea => 0xffe1, + 0xeb => 0x2030, 0xec => 0xa7, 0xed => 0x2116, 0xee => 0x2606, + 0xef => 0x2605, 0xf0 => 0x25cb, 0xf1 => 0x25cf, 0xf2 => 0x25ce, + 0xf3 => 0x25c7, 0xf4 => 0x25c6, 0xf5 => 0x25a1, 0xf6 => 0x25a0, + 0xf7 => 0x25b3, 0xf8 => 0x25b2, 0xf9 => 0x203b, 0xfa => 0x2192, + 0xfb => 0x2190, 0xfc => 0x2191, 0xfd => 0x2193, 0xfe => 0x3013, + }, + 0xa2 => { + 0xb1 => 0x2488, 0xb2 => 0x2489, 0xb3 => 0x248a, 0xb4 => 0x248b, + 0xb5 => 0x248c, 0xb6 => 0x248d, 0xb7 => 0x248e, 0xb8 => 0x248f, + 0xb9 => 0x2490, 0xba => 0x2491, 0xbb => 0x2492, 0xbc => 0x2493, + 0xbd => 0x2494, 0xbe => 0x2495, 0xbf => 0x2496, 0xc0 => 0x2497, + 0xc1 => 0x2498, 0xc2 => 0x2499, 0xc3 => 0x249a, 0xc4 => 0x249b, + 0xc5 => 0x2474, 0xc6 => 0x2475, 0xc7 => 0x2476, 0xc8 => 0x2477, + 0xc9 => 0x2478, 0xca => 0x2479, 0xcb => 0x247a, 0xcc => 0x247b, + 0xcd => 0x247c, 0xce => 0x247d, 0xcf => 0x247e, 0xd0 => 0x247f, + 0xd1 => 0x2480, 0xd2 => 0x2481, 0xd3 => 0x2482, 0xd4 => 0x2483, + 0xd5 => 0x2484, 0xd6 => 0x2485, 0xd7 => 0x2486, 0xd8 => 0x2487, + 0xd9 => 0x2460, 0xda => 0x2461, 0xdb => 0x2462, 0xdc => 0x2463, + 0xdd => 0x2464, 0xde => 0x2465, 0xdf => 0x2466, 0xe0 => 0x2467, + 0xe1 => 0x2468, 0xe2 => 0x2469, 0xe5 => 0x3220, 0xe6 => 0x3221, + 0xe7 => 0x3222, 0xe8 => 0x3223, 0xe9 => 0x3224, 0xea => 0x3225, + 0xeb => 0x3226, 0xec => 0x3227, 0xed => 0x3228, 0xee => 0x3229, + 0xf1 => 0x2160, 0xf2 => 0x2161, 0xf3 => 0x2162, 0xf4 => 0x2163, + 0xf5 => 0x2164, 0xf6 => 0x2165, 0xf7 => 0x2166, 0xf8 => 0x2167, + 0xf9 => 0x2168, 0xfa => 0x2169, 0xfb => 0x216a, 0xfc => 0x216b, + }, + 0xa3 => { + 0xa1 => 0xff01, 0xa2 => 0xff02, 0xa3 => 0xff03, 0xa4 => 0xffe5, + 0xa5 => 0xff05, 0xa6 => 0xff06, 0xa7 => 0xff07, 0xa8 => 0xff08, + 0xa9 => 0xff09, 0xaa => 0xff0a, 0xab => 0xff0b, 0xac => 0xff0c, + 0xad => 0xff0d, 0xae => 0xff0e, 0xaf => 0xff0f, 0xb0 => 0xff10, + 0xb1 => 0xff11, 0xb2 => 0xff12, 0xb3 => 0xff13, 0xb4 => 0xff14, + 0xb5 => 0xff15, 0xb6 => 0xff16, 0xb7 => 0xff17, 0xb8 => 0xff18, + 0xb9 => 0xff19, 0xba => 0xff1a, 0xbb => 0xff1b, 0xbc => 0xff1c, + 0xbd => 0xff1d, 0xbe => 0xff1e, 0xbf => 0xff1f, 0xc0 => 0xff20, + 0xc1 => 0xff21, 0xc2 => 0xff22, 0xc3 => 0xff23, 0xc4 => 0xff24, + 0xc5 => 0xff25, 0xc6 => 0xff26, 0xc7 => 0xff27, 0xc8 => 0xff28, + 0xc9 => 0xff29, 0xca => 0xff2a, 0xcb => 0xff2b, 0xcc => 0xff2c, + 0xcd => 0xff2d, 0xce => 0xff2e, 0xcf => 0xff2f, 0xd0 => 0xff30, + 0xd1 => 0xff31, 0xd2 => 0xff32, 0xd3 => 0xff33, 0xd4 => 0xff34, + 0xd5 => 0xff35, 0xd6 => 0xff36, 0xd7 => 0xff37, 0xd8 => 0xff38, + 0xd9 => 0xff39, 0xda => 0xff3a, 0xdb => 0xff3b, 0xdc => 0xff3c, + 0xdd => 0xff3d, 0xde => 0xff3e, 0xdf => 0xff3f, 0xe0 => 0xff40, + 0xe1 => 0xff41, 0xe2 => 0xff42, 0xe3 => 0xff43, 0xe4 => 0xff44, + 0xe5 => 0xff45, 0xe6 => 0xff46, 0xe7 => 0xff47, 0xe8 => 0xff48, + 0xe9 => 0xff49, 0xea => 0xff4a, 0xeb => 0xff4b, 0xec => 0xff4c, + 0xed => 0xff4d, 0xee => 0xff4e, 0xef => 0xff4f, 0xf0 => 0xff50, + 0xf1 => 0xff51, 0xf2 => 0xff52, 0xf3 => 0xff53, 0xf4 => 0xff54, + 0xf5 => 0xff55, 0xf6 => 0xff56, 0xf7 => 0xff57, 0xf8 => 0xff58, + 0xf9 => 0xff59, 0xfa => 0xff5a, 0xfb => 0xff5b, 0xfc => 0xff5c, + 0xfd => 0xff5d, 0xfe => 0xffe3, + }, + 0xa4 => { + 0xa1 => 0x3041, 0xa2 => 0x3042, 0xa3 => 0x3043, 0xa4 => 0x3044, + 0xa5 => 0x3045, 0xa6 => 0x3046, 0xa7 => 0x3047, 0xa8 => 0x3048, + 0xa9 => 0x3049, 0xaa => 0x304a, 0xab => 0x304b, 0xac => 0x304c, + 0xad => 0x304d, 0xae => 0x304e, 0xaf => 0x304f, 0xb0 => 0x3050, + 0xb1 => 0x3051, 0xb2 => 0x3052, 0xb3 => 0x3053, 0xb4 => 0x3054, + 0xb5 => 0x3055, 0xb6 => 0x3056, 0xb7 => 0x3057, 0xb8 => 0x3058, + 0xb9 => 0x3059, 0xba => 0x305a, 0xbb => 0x305b, 0xbc => 0x305c, + 0xbd => 0x305d, 0xbe => 0x305e, 0xbf => 0x305f, 0xc0 => 0x3060, + 0xc1 => 0x3061, 0xc2 => 0x3062, 0xc3 => 0x3063, 0xc4 => 0x3064, + 0xc5 => 0x3065, 0xc6 => 0x3066, 0xc7 => 0x3067, 0xc8 => 0x3068, + 0xc9 => 0x3069, 0xca => 0x306a, 0xcb => 0x306b, 0xcc => 0x306c, + 0xcd => 0x306d, 0xce => 0x306e, 0xcf => 0x306f, 0xd0 => 0x3070, + 0xd1 => 0x3071, 0xd2 => 0x3072, 0xd3 => 0x3073, 0xd4 => 0x3074, + 0xd5 => 0x3075, 0xd6 => 0x3076, 0xd7 => 0x3077, 0xd8 => 0x3078, + 0xd9 => 0x3079, 0xda => 0x307a, 0xdb => 0x307b, 0xdc => 0x307c, + 0xdd => 0x307d, 0xde => 0x307e, 0xdf => 0x307f, 0xe0 => 0x3080, + 0xe1 => 0x3081, 0xe2 => 0x3082, 0xe3 => 0x3083, 0xe4 => 0x3084, + 0xe5 => 0x3085, 0xe6 => 0x3086, 0xe7 => 0x3087, 0xe8 => 0x3088, + 0xe9 => 0x3089, 0xea => 0x308a, 0xeb => 0x308b, 0xec => 0x308c, + 0xed => 0x308d, 0xee => 0x308e, 0xef => 0x308f, 0xf0 => 0x3090, + 0xf1 => 0x3091, 0xf2 => 0x3092, 0xf3 => 0x3093, + }, + 0xa5 => { + 0xa1 => 0x30a1, 0xa2 => 0x30a2, 0xa3 => 0x30a3, 0xa4 => 0x30a4, + 0xa5 => 0x30a5, 0xa6 => 0x30a6, 0xa7 => 0x30a7, 0xa8 => 0x30a8, + 0xa9 => 0x30a9, 0xaa => 0x30aa, 0xab => 0x30ab, 0xac => 0x30ac, + 0xad => 0x30ad, 0xae => 0x30ae, 0xaf => 0x30af, 0xb0 => 0x30b0, + 0xb1 => 0x30b1, 0xb2 => 0x30b2, 0xb3 => 0x30b3, 0xb4 => 0x30b4, + 0xb5 => 0x30b5, 0xb6 => 0x30b6, 0xb7 => 0x30b7, 0xb8 => 0x30b8, + 0xb9 => 0x30b9, 0xba => 0x30ba, 0xbb => 0x30bb, 0xbc => 0x30bc, + 0xbd => 0x30bd, 0xbe => 0x30be, 0xbf => 0x30bf, 0xc0 => 0x30c0, + 0xc1 => 0x30c1, 0xc2 => 0x30c2, 0xc3 => 0x30c3, 0xc4 => 0x30c4, + 0xc5 => 0x30c5, 0xc6 => 0x30c6, 0xc7 => 0x30c7, 0xc8 => 0x30c8, + 0xc9 => 0x30c9, 0xca => 0x30ca, 0xcb => 0x30cb, 0xcc => 0x30cc, + 0xcd => 0x30cd, 0xce => 0x30ce, 0xcf => 0x30cf, 0xd0 => 0x30d0, + 0xd1 => 0x30d1, 0xd2 => 0x30d2, 0xd3 => 0x30d3, 0xd4 => 0x30d4, + 0xd5 => 0x30d5, 0xd6 => 0x30d6, 0xd7 => 0x30d7, 0xd8 => 0x30d8, + 0xd9 => 0x30d9, 0xda => 0x30da, 0xdb => 0x30db, 0xdc => 0x30dc, + 0xdd => 0x30dd, 0xde => 0x30de, 0xdf => 0x30df, 0xe0 => 0x30e0, + 0xe1 => 0x30e1, 0xe2 => 0x30e2, 0xe3 => 0x30e3, 0xe4 => 0x30e4, + 0xe5 => 0x30e5, 0xe6 => 0x30e6, 0xe7 => 0x30e7, 0xe8 => 0x30e8, + 0xe9 => 0x30e9, 0xea => 0x30ea, 0xeb => 0x30eb, 0xec => 0x30ec, + 0xed => 0x30ed, 0xee => 0x30ee, 0xef => 0x30ef, 0xf0 => 0x30f0, + 0xf1 => 0x30f1, 0xf2 => 0x30f2, 0xf3 => 0x30f3, 0xf4 => 0x30f4, + 0xf5 => 0x30f5, 0xf6 => 0x30f6, + }, + 0xa6 => { + 0xa1 => 0x0391, 0xa2 => 0x0392, 0xa3 => 0x0393, 0xa4 => 0x0394, + 0xa5 => 0x0395, 0xa6 => 0x0396, 0xa7 => 0x0397, 0xa8 => 0x0398, + 0xa9 => 0x0399, 0xaa => 0x039a, 0xab => 0x039b, 0xac => 0x039c, + 0xad => 0x039d, 0xae => 0x039e, 0xaf => 0x039f, 0xb0 => 0x03a0, + 0xb1 => 0x03a1, 0xb2 => 0x03a3, 0xb3 => 0x03a4, 0xb4 => 0x03a5, + 0xb5 => 0x03a6, 0xb6 => 0x03a7, 0xb7 => 0x03a8, 0xb8 => 0x03a9, + 0xc1 => 0x03b1, 0xc2 => 0x03b2, 0xc3 => 0x03b3, 0xc4 => 0x03b4, + 0xc5 => 0x03b5, 0xc6 => 0x03b6, 0xc7 => 0x03b7, 0xc8 => 0x03b8, + 0xc9 => 0x03b9, 0xca => 0x03ba, 0xcb => 0x03bb, 0xcc => 0x03bc, + 0xcd => 0x03bd, 0xce => 0x03be, 0xcf => 0x03bf, 0xd0 => 0x03c0, + 0xd1 => 0x03c1, 0xd2 => 0x03c3, 0xd3 => 0x03c4, 0xd4 => 0x03c5, + 0xd5 => 0x03c6, 0xd6 => 0x03c7, 0xd7 => 0x03c8, 0xd8 => 0x03c9, + }, + 0xa7 => { + 0xa1 => 0x0410, 0xa2 => 0x0411, 0xa3 => 0x0412, 0xa4 => 0x0413, + 0xa5 => 0x0414, 0xa6 => 0x0415, 0xa7 => 0x0401, 0xa8 => 0x0416, + 0xa9 => 0x0417, 0xaa => 0x0418, 0xab => 0x0419, 0xac => 0x041a, + 0xad => 0x041b, 0xae => 0x041c, 0xaf => 0x041d, 0xb0 => 0x041e, + 0xb1 => 0x041f, 0xb2 => 0x0420, 0xb3 => 0x0421, 0xb4 => 0x0422, + 0xb5 => 0x0423, 0xb6 => 0x0424, 0xb7 => 0x0425, 0xb8 => 0x0426, + 0xb9 => 0x0427, 0xba => 0x0428, 0xbb => 0x0429, 0xbc => 0x042a, + 0xbd => 0x042b, 0xbe => 0x042c, 0xbf => 0x042d, 0xc0 => 0x042e, + 0xc1 => 0x042f, 0xd1 => 0x0430, 0xd2 => 0x0431, 0xd3 => 0x0432, + 0xd4 => 0x0433, 0xd5 => 0x0434, 0xd6 => 0x0435, 0xd7 => 0x0451, + 0xd8 => 0x0436, 0xd9 => 0x0437, 0xda => 0x0438, 0xdb => 0x0439, + 0xdc => 0x043a, 0xdd => 0x043b, 0xde => 0x043c, 0xdf => 0x043d, + 0xe0 => 0x043e, 0xe1 => 0x043f, 0xe2 => 0x0440, 0xe3 => 0x0441, + 0xe4 => 0x0442, 0xe5 => 0x0443, 0xe6 => 0x0444, 0xe7 => 0x0445, + 0xe8 => 0x0446, 0xe9 => 0x0447, 0xea => 0x0448, 0xeb => 0x0449, + 0xec => 0x044a, 0xed => 0x044b, 0xee => 0x044c, 0xef => 0x044d, + 0xf0 => 0x044e, 0xf1 => 0x044f, + }, + 0xa8 => { + 0xa1 => 0x0101, 0xa2 => 0xe1, 0xa3 => 0x01ce, 0xa4 => 0xe0, 0xa5 => 0x0113, + 0xa6 => 0xe9, 0xa7 => 0x011b, 0xa8 => 0xe8, 0xa9 => 0x012b, 0xaa => 0xed, + 0xab => 0x01d0, 0xac => 0xec, 0xad => 0x014d, 0xae => 0xf3, 0xaf => 0x01d2, + 0xb0 => 0xf2, 0xb1 => 0x016b, 0xb2 => 0xfa, 0xb3 => 0x01d4, 0xb4 => 0xf9, + 0xb5 => 0x01d6, 0xb6 => 0x01d8, 0xb7 => 0x01da, 0xb8 => 0x01dc, + 0xb9 => 0xfc, 0xba => 0xea, 0xc5 => 0x3105, 0xc6 => 0x3106, 0xc7 => 0x3107, + 0xc8 => 0x3108, 0xc9 => 0x3109, 0xca => 0x310a, 0xcb => 0x310b, + 0xcc => 0x310c, 0xcd => 0x310d, 0xce => 0x310e, 0xcf => 0x310f, + 0xd0 => 0x3110, 0xd1 => 0x3111, 0xd2 => 0x3112, 0xd3 => 0x3113, + 0xd4 => 0x3114, 0xd5 => 0x3115, 0xd6 => 0x3116, 0xd7 => 0x3117, + 0xd8 => 0x3118, 0xd9 => 0x3119, 0xda => 0x311a, 0xdb => 0x311b, + 0xdc => 0x311c, 0xdd => 0x311d, 0xde => 0x311e, 0xdf => 0x311f, + 0xe0 => 0x3120, 0xe1 => 0x3121, 0xe2 => 0x3122, 0xe3 => 0x3123, + 0xe4 => 0x3124, 0xe5 => 0x3125, 0xe6 => 0x3126, 0xe7 => 0x3127, + 0xe8 => 0x3128, 0xe9 => 0x3129, + }, + 0xa9 => { + 0xa4 => 0x2500, 0xa5 => 0x2501, 0xa6 => 0x2502, 0xa7 => 0x2503, + 0xa8 => 0x2504, 0xa9 => 0x2505, 0xaa => 0x2506, 0xab => 0x2507, + 0xac => 0x2508, 0xad => 0x2509, 0xae => 0x250a, 0xaf => 0x250b, + 0xb0 => 0x250c, 0xb1 => 0x250d, 0xb2 => 0x250e, 0xb3 => 0x250f, + 0xb4 => 0x2510, 0xb5 => 0x2511, 0xb6 => 0x2512, 0xb7 => 0x2513, + 0xb8 => 0x2514, 0xb9 => 0x2515, 0xba => 0x2516, 0xbb => 0x2517, + 0xbc => 0x2518, 0xbd => 0x2519, 0xbe => 0x251a, 0xbf => 0x251b, + 0xc0 => 0x251c, 0xc1 => 0x251d, 0xc2 => 0x251e, 0xc3 => 0x251f, + 0xc4 => 0x2520, 0xc5 => 0x2521, 0xc6 => 0x2522, 0xc7 => 0x2523, + 0xc8 => 0x2524, 0xc9 => 0x2525, 0xca => 0x2526, 0xcb => 0x2527, + 0xcc => 0x2528, 0xcd => 0x2529, 0xce => 0x252a, 0xcf => 0x252b, + 0xd0 => 0x252c, 0xd1 => 0x252d, 0xd2 => 0x252e, 0xd3 => 0x252f, + 0xd4 => 0x2530, 0xd5 => 0x2531, 0xd6 => 0x2532, 0xd7 => 0x2533, + 0xd8 => 0x2534, 0xd9 => 0x2535, 0xda => 0x2536, 0xdb => 0x2537, + 0xdc => 0x2538, 0xdd => 0x2539, 0xde => 0x253a, 0xdf => 0x253b, + 0xe0 => 0x253c, 0xe1 => 0x253d, 0xe2 => 0x253e, 0xe3 => 0x253f, + 0xe4 => 0x2540, 0xe5 => 0x2541, 0xe6 => 0x2542, 0xe7 => 0x2543, + 0xe8 => 0x2544, 0xe9 => 0x2545, 0xea => 0x2546, 0xeb => 0x2547, + 0xec => 0x2548, 0xed => 0x2549, 0xee => 0x254a, 0xef => 0x254b, + }, + 0xb0 => { + 0xa1 => 0x554a, 0xa2 => 0x963f, 0xa3 => 0x57c3, 0xa4 => 0x6328, + 0xa5 => 0x54ce, 0xa6 => 0x5509, 0xa7 => 0x54c0, 0xa8 => 0x7691, + 0xa9 => 0x764c, 0xaa => 0x853c, 0xab => 0x77ee, 0xac => 0x827e, + 0xad => 0x788d, 0xae => 0x7231, 0xaf => 0x9698, 0xb0 => 0x978d, + 0xb1 => 0x6c28, 0xb2 => 0x5b89, 0xb3 => 0x4ffa, 0xb4 => 0x6309, + 0xb5 => 0x6697, 0xb6 => 0x5cb8, 0xb7 => 0x80fa, 0xb8 => 0x6848, + 0xb9 => 0x80ae, 0xba => 0x6602, 0xbb => 0x76ce, 0xbc => 0x51f9, + 0xbd => 0x6556, 0xbe => 0x71ac, 0xbf => 0x7ff1, 0xc0 => 0x8884, + 0xc1 => 0x50b2, 0xc2 => 0x5965, 0xc3 => 0x61ca, 0xc4 => 0x6fb3, + 0xc5 => 0x82ad, 0xc6 => 0x634c, 0xc7 => 0x6252, 0xc8 => 0x53ed, + 0xc9 => 0x5427, 0xca => 0x7b06, 0xcb => 0x516b, 0xcc => 0x75a4, + 0xcd => 0x5df4, 0xce => 0x62d4, 0xcf => 0x8dcb, 0xd0 => 0x9776, + 0xd1 => 0x628a, 0xd2 => 0x8019, 0xd3 => 0x575d, 0xd4 => 0x9738, + 0xd5 => 0x7f62, 0xd6 => 0x7238, 0xd7 => 0x767d, 0xd8 => 0x67cf, + 0xd9 => 0x767e, 0xda => 0x6446, 0xdb => 0x4f70, 0xdc => 0x8d25, + 0xdd => 0x62dc, 0xde => 0x7a17, 0xdf => 0x6591, 0xe0 => 0x73ed, + 0xe1 => 0x642c, 0xe2 => 0x6273, 0xe3 => 0x822c, 0xe4 => 0x9881, + 0xe5 => 0x677f, 0xe6 => 0x7248, 0xe7 => 0x626e, 0xe8 => 0x62cc, + 0xe9 => 0x4f34, 0xea => 0x74e3, 0xeb => 0x534a, 0xec => 0x529e, + 0xed => 0x7eca, 0xee => 0x90a6, 0xef => 0x5e2e, 0xf0 => 0x6886, + 0xf1 => 0x699c, 0xf2 => 0x8180, 0xf3 => 0x7ed1, 0xf4 => 0x68d2, + 0xf5 => 0x78c5, 0xf6 => 0x868c, 0xf7 => 0x9551, 0xf8 => 0x508d, + 0xf9 => 0x8c24, 0xfa => 0x82de, 0xfb => 0x80de, 0xfc => 0x5305, + 0xfd => 0x8912, 0xfe => 0x5265, + }, + 0xb1 => { + 0xa1 => 0x8584, 0xa2 => 0x96f9, 0xa3 => 0x4fdd, 0xa4 => 0x5821, + 0xa5 => 0x9971, 0xa6 => 0x5b9d, 0xa7 => 0x62b1, 0xa8 => 0x62a5, + 0xa9 => 0x66b4, 0xaa => 0x8c79, 0xab => 0x9c8d, 0xac => 0x7206, + 0xad => 0x676f, 0xae => 0x7891, 0xaf => 0x60b2, 0xb0 => 0x5351, + 0xb1 => 0x5317, 0xb2 => 0x8f88, 0xb3 => 0x80cc, 0xb4 => 0x8d1d, + 0xb5 => 0x94a1, 0xb6 => 0x500d, 0xb7 => 0x72c8, 0xb8 => 0x5907, + 0xb9 => 0x60eb, 0xba => 0x7119, 0xbb => 0x88ab, 0xbc => 0x5954, + 0xbd => 0x82ef, 0xbe => 0x672c, 0xbf => 0x7b28, 0xc0 => 0x5d29, + 0xc1 => 0x7ef7, 0xc2 => 0x752d, 0xc3 => 0x6cf5, 0xc4 => 0x8e66, + 0xc5 => 0x8ff8, 0xc6 => 0x903c, 0xc7 => 0x9f3b, 0xc8 => 0x6bd4, + 0xc9 => 0x9119, 0xca => 0x7b14, 0xcb => 0x5f7c, 0xcc => 0x78a7, + 0xcd => 0x84d6, 0xce => 0x853d, 0xcf => 0x6bd5, 0xd0 => 0x6bd9, + 0xd1 => 0x6bd6, 0xd2 => 0x5e01, 0xd3 => 0x5e87, 0xd4 => 0x75f9, + 0xd5 => 0x95ed, 0xd6 => 0x655d, 0xd7 => 0x5f0a, 0xd8 => 0x5fc5, + 0xd9 => 0x8f9f, 0xda => 0x58c1, 0xdb => 0x81c2, 0xdc => 0x907f, + 0xdd => 0x965b, 0xde => 0x97ad, 0xdf => 0x8fb9, 0xe0 => 0x7f16, + 0xe1 => 0x8d2c, 0xe2 => 0x6241, 0xe3 => 0x4fbf, 0xe4 => 0x53d8, + 0xe5 => 0x535e, 0xe6 => 0x8fa8, 0xe7 => 0x8fa9, 0xe8 => 0x8fab, + 0xe9 => 0x904d, 0xea => 0x6807, 0xeb => 0x5f6a, 0xec => 0x8198, + 0xed => 0x8868, 0xee => 0x9cd6, 0xef => 0x618b, 0xf0 => 0x522b, + 0xf1 => 0x762a, 0xf2 => 0x5f6c, 0xf3 => 0x658c, 0xf4 => 0x6fd2, + 0xf5 => 0x6ee8, 0xf6 => 0x5bbe, 0xf7 => 0x6448, 0xf8 => 0x5175, + 0xf9 => 0x51b0, 0xfa => 0x67c4, 0xfb => 0x4e19, 0xfc => 0x79c9, + 0xfd => 0x997c, 0xfe => 0x70b3, + }, + 0xb2 => { + 0xa1 => 0x75c5, 0xa2 => 0x5e76, 0xa3 => 0x73bb, 0xa4 => 0x83e0, + 0xa5 => 0x64ad, 0xa6 => 0x62e8, 0xa7 => 0x94b5, 0xa8 => 0x6ce2, + 0xa9 => 0x535a, 0xaa => 0x52c3, 0xab => 0x640f, 0xac => 0x94c2, + 0xad => 0x7b94, 0xae => 0x4f2f, 0xaf => 0x5e1b, 0xb0 => 0x8236, + 0xb1 => 0x8116, 0xb2 => 0x818a, 0xb3 => 0x6e24, 0xb4 => 0x6cca, + 0xb5 => 0x9a73, 0xb6 => 0x6355, 0xb7 => 0x535c, 0xb8 => 0x54fa, + 0xb9 => 0x8865, 0xba => 0x57e0, 0xbb => 0x4e0d, 0xbc => 0x5e03, + 0xbd => 0x6b65, 0xbe => 0x7c3f, 0xbf => 0x90e8, 0xc0 => 0x6016, + 0xc1 => 0x64e6, 0xc2 => 0x731c, 0xc3 => 0x88c1, 0xc4 => 0x6750, + 0xc5 => 0x624d, 0xc6 => 0x8d22, 0xc7 => 0x776c, 0xc8 => 0x8e29, + 0xc9 => 0x91c7, 0xca => 0x5f69, 0xcb => 0x83dc, 0xcc => 0x8521, + 0xcd => 0x9910, 0xce => 0x53c2, 0xcf => 0x8695, 0xd0 => 0x6b8b, + 0xd1 => 0x60ed, 0xd2 => 0x60e8, 0xd3 => 0x707f, 0xd4 => 0x82cd, + 0xd5 => 0x8231, 0xd6 => 0x4ed3, 0xd7 => 0x6ca7, 0xd8 => 0x85cf, + 0xd9 => 0x64cd, 0xda => 0x7cd9, 0xdb => 0x69fd, 0xdc => 0x66f9, + 0xdd => 0x8349, 0xde => 0x5395, 0xdf => 0x7b56, 0xe0 => 0x4fa7, + 0xe1 => 0x518c, 0xe2 => 0x6d4b, 0xe3 => 0x5c42, 0xe4 => 0x8e6d, + 0xe5 => 0x63d2, 0xe6 => 0x53c9, 0xe7 => 0x832c, 0xe8 => 0x8336, + 0xe9 => 0x67e5, 0xea => 0x78b4, 0xeb => 0x643d, 0xec => 0x5bdf, + 0xed => 0x5c94, 0xee => 0x5dee, 0xef => 0x8be7, 0xf0 => 0x62c6, + 0xf1 => 0x67f4, 0xf2 => 0x8c7a, 0xf3 => 0x6400, 0xf4 => 0x63ba, + 0xf5 => 0x8749, 0xf6 => 0x998b, 0xf7 => 0x8c17, 0xf8 => 0x7f20, + 0xf9 => 0x94f2, 0xfa => 0x4ea7, 0xfb => 0x9610, 0xfc => 0x98a4, + 0xfd => 0x660c, 0xfe => 0x7316, + }, + 0xb3 => { + 0xa1 => 0x573a, 0xa2 => 0x5c1d, 0xa3 => 0x5e38, 0xa4 => 0x957f, + 0xa5 => 0x507f, 0xa6 => 0x80a0, 0xa7 => 0x5382, 0xa8 => 0x655e, + 0xa9 => 0x7545, 0xaa => 0x5531, 0xab => 0x5021, 0xac => 0x8d85, + 0xad => 0x6284, 0xae => 0x949e, 0xaf => 0x671d, 0xb0 => 0x5632, + 0xb1 => 0x6f6e, 0xb2 => 0x5de2, 0xb3 => 0x5435, 0xb4 => 0x7092, + 0xb5 => 0x8f66, 0xb6 => 0x626f, 0xb7 => 0x64a4, 0xb8 => 0x63a3, + 0xb9 => 0x5f7b, 0xba => 0x6f88, 0xbb => 0x90f4, 0xbc => 0x81e3, + 0xbd => 0x8fb0, 0xbe => 0x5c18, 0xbf => 0x6668, 0xc0 => 0x5ff1, + 0xc1 => 0x6c89, 0xc2 => 0x9648, 0xc3 => 0x8d81, 0xc4 => 0x886c, + 0xc5 => 0x6491, 0xc6 => 0x79f0, 0xc7 => 0x57ce, 0xc8 => 0x6a59, + 0xc9 => 0x6210, 0xca => 0x5448, 0xcb => 0x4e58, 0xcc => 0x7a0b, + 0xcd => 0x60e9, 0xce => 0x6f84, 0xcf => 0x8bda, 0xd0 => 0x627f, + 0xd1 => 0x901e, 0xd2 => 0x9a8b, 0xd3 => 0x79e4, 0xd4 => 0x5403, + 0xd5 => 0x75f4, 0xd6 => 0x6301, 0xd7 => 0x5319, 0xd8 => 0x6c60, + 0xd9 => 0x8fdf, 0xda => 0x5f1b, 0xdb => 0x9a70, 0xdc => 0x803b, + 0xdd => 0x9f7f, 0xde => 0x4f88, 0xdf => 0x5c3a, 0xe0 => 0x8d64, + 0xe1 => 0x7fc5, 0xe2 => 0x65a5, 0xe3 => 0x70bd, 0xe4 => 0x5145, + 0xe5 => 0x51b2, 0xe6 => 0x866b, 0xe7 => 0x5d07, 0xe8 => 0x5ba0, + 0xe9 => 0x62bd, 0xea => 0x916c, 0xeb => 0x7574, 0xec => 0x8e0c, + 0xed => 0x7a20, 0xee => 0x6101, 0xef => 0x7b79, 0xf0 => 0x4ec7, + 0xf1 => 0x7ef8, 0xf2 => 0x7785, 0xf3 => 0x4e11, 0xf4 => 0x81ed, + 0xf5 => 0x521d, 0xf6 => 0x51fa, 0xf7 => 0x6a71, 0xf8 => 0x53a8, + 0xf9 => 0x8e87, 0xfa => 0x9504, 0xfb => 0x96cf, 0xfc => 0x6ec1, + 0xfd => 0x9664, 0xfe => 0x695a, + }, + 0xb4 => { + 0xa1 => 0x7840, 0xa2 => 0x50a8, 0xa3 => 0x77d7, 0xa4 => 0x6410, + 0xa5 => 0x89e6, 0xa6 => 0x5904, 0xa7 => 0x63e3, 0xa8 => 0x5ddd, + 0xa9 => 0x7a7f, 0xaa => 0x693d, 0xab => 0x4f20, 0xac => 0x8239, + 0xad => 0x5598, 0xae => 0x4e32, 0xaf => 0x75ae, 0xb0 => 0x7a97, + 0xb1 => 0x5e62, 0xb2 => 0x5e8a, 0xb3 => 0x95ef, 0xb4 => 0x521b, + 0xb5 => 0x5439, 0xb6 => 0x708a, 0xb7 => 0x6376, 0xb8 => 0x9524, + 0xb9 => 0x5782, 0xba => 0x6625, 0xbb => 0x693f, 0xbc => 0x9187, + 0xbd => 0x5507, 0xbe => 0x6df3, 0xbf => 0x7eaf, 0xc0 => 0x8822, + 0xc1 => 0x6233, 0xc2 => 0x7ef0, 0xc3 => 0x75b5, 0xc4 => 0x8328, + 0xc5 => 0x78c1, 0xc6 => 0x96cc, 0xc7 => 0x8f9e, 0xc8 => 0x6148, + 0xc9 => 0x74f7, 0xca => 0x8bcd, 0xcb => 0x6b64, 0xcc => 0x523a, + 0xcd => 0x8d50, 0xce => 0x6b21, 0xcf => 0x806a, 0xd0 => 0x8471, + 0xd1 => 0x56f1, 0xd2 => 0x5306, 0xd3 => 0x4ece, 0xd4 => 0x4e1b, + 0xd5 => 0x51d1, 0xd6 => 0x7c97, 0xd7 => 0x918b, 0xd8 => 0x7c07, + 0xd9 => 0x4fc3, 0xda => 0x8e7f, 0xdb => 0x7be1, 0xdc => 0x7a9c, + 0xdd => 0x6467, 0xde => 0x5d14, 0xdf => 0x50ac, 0xe0 => 0x8106, + 0xe1 => 0x7601, 0xe2 => 0x7cb9, 0xe3 => 0x6dec, 0xe4 => 0x7fe0, + 0xe5 => 0x6751, 0xe6 => 0x5b58, 0xe7 => 0x5bf8, 0xe8 => 0x78cb, + 0xe9 => 0x64ae, 0xea => 0x6413, 0xeb => 0x63aa, 0xec => 0x632b, + 0xed => 0x9519, 0xee => 0x642d, 0xef => 0x8fbe, 0xf0 => 0x7b54, + 0xf1 => 0x7629, 0xf2 => 0x6253, 0xf3 => 0x5927, 0xf4 => 0x5446, + 0xf5 => 0x6b79, 0xf6 => 0x50a3, 0xf7 => 0x6234, 0xf8 => 0x5e26, + 0xf9 => 0x6b86, 0xfa => 0x4ee3, 0xfb => 0x8d37, 0xfc => 0x888b, + 0xfd => 0x5f85, 0xfe => 0x902e, + }, + 0xb5 => { + 0xa1 => 0x6020, 0xa2 => 0x803d, 0xa3 => 0x62c5, 0xa4 => 0x4e39, + 0xa5 => 0x5355, 0xa6 => 0x90f8, 0xa7 => 0x63b8, 0xa8 => 0x80c6, + 0xa9 => 0x65e6, 0xaa => 0x6c2e, 0xab => 0x4f46, 0xac => 0x60ee, + 0xad => 0x6de1, 0xae => 0x8bde, 0xaf => 0x5f39, 0xb0 => 0x86cb, + 0xb1 => 0x5f53, 0xb2 => 0x6321, 0xb3 => 0x515a, 0xb4 => 0x8361, + 0xb5 => 0x6863, 0xb6 => 0x5200, 0xb7 => 0x6363, 0xb8 => 0x8e48, + 0xb9 => 0x5012, 0xba => 0x5c9b, 0xbb => 0x7977, 0xbc => 0x5bfc, + 0xbd => 0x5230, 0xbe => 0x7a3b, 0xbf => 0x60bc, 0xc0 => 0x9053, + 0xc1 => 0x76d7, 0xc2 => 0x5fb7, 0xc3 => 0x5f97, 0xc4 => 0x7684, + 0xc5 => 0x8e6c, 0xc6 => 0x706f, 0xc7 => 0x767b, 0xc8 => 0x7b49, + 0xc9 => 0x77aa, 0xca => 0x51f3, 0xcb => 0x9093, 0xcc => 0x5824, + 0xcd => 0x4f4e, 0xce => 0x6ef4, 0xcf => 0x8fea, 0xd0 => 0x654c, + 0xd1 => 0x7b1b, 0xd2 => 0x72c4, 0xd3 => 0x6da4, 0xd4 => 0x7fdf, + 0xd5 => 0x5ae1, 0xd6 => 0x62b5, 0xd7 => 0x5e95, 0xd8 => 0x5730, + 0xd9 => 0x8482, 0xda => 0x7b2c, 0xdb => 0x5e1d, 0xdc => 0x5f1f, + 0xdd => 0x9012, 0xde => 0x7f14, 0xdf => 0x98a0, 0xe0 => 0x6382, + 0xe1 => 0x6ec7, 0xe2 => 0x7898, 0xe3 => 0x70b9, 0xe4 => 0x5178, + 0xe5 => 0x975b, 0xe6 => 0x57ab, 0xe7 => 0x7535, 0xe8 => 0x4f43, + 0xe9 => 0x7538, 0xea => 0x5e97, 0xeb => 0x60e6, 0xec => 0x5960, + 0xed => 0x6dc0, 0xee => 0x6bbf, 0xef => 0x7889, 0xf0 => 0x53fc, + 0xf1 => 0x96d5, 0xf2 => 0x51cb, 0xf3 => 0x5201, 0xf4 => 0x6389, + 0xf5 => 0x540a, 0xf6 => 0x9493, 0xf7 => 0x8c03, 0xf8 => 0x8dcc, + 0xf9 => 0x7239, 0xfa => 0x789f, 0xfb => 0x8776, 0xfc => 0x8fed, + 0xfd => 0x8c0d, 0xfe => 0x53e0, + }, + 0xb6 => { + 0xa1 => 0x4e01, 0xa2 => 0x76ef, 0xa3 => 0x53ee, 0xa4 => 0x9489, + 0xa5 => 0x9876, 0xa6 => 0x9f0e, 0xa7 => 0x952d, 0xa8 => 0x5b9a, + 0xa9 => 0x8ba2, 0xaa => 0x4e22, 0xab => 0x4e1c, 0xac => 0x51ac, + 0xad => 0x8463, 0xae => 0x61c2, 0xaf => 0x52a8, 0xb0 => 0x680b, + 0xb1 => 0x4f97, 0xb2 => 0x606b, 0xb3 => 0x51bb, 0xb4 => 0x6d1e, + 0xb5 => 0x515c, 0xb6 => 0x6296, 0xb7 => 0x6597, 0xb8 => 0x9661, + 0xb9 => 0x8c46, 0xba => 0x9017, 0xbb => 0x75d8, 0xbc => 0x90fd, + 0xbd => 0x7763, 0xbe => 0x6bd2, 0xbf => 0x728a, 0xc0 => 0x72ec, + 0xc1 => 0x8bfb, 0xc2 => 0x5835, 0xc3 => 0x7779, 0xc4 => 0x8d4c, + 0xc5 => 0x675c, 0xc6 => 0x9540, 0xc7 => 0x809a, 0xc8 => 0x5ea6, + 0xc9 => 0x6e21, 0xca => 0x5992, 0xcb => 0x7aef, 0xcc => 0x77ed, + 0xcd => 0x953b, 0xce => 0x6bb5, 0xcf => 0x65ad, 0xd0 => 0x7f0e, + 0xd1 => 0x5806, 0xd2 => 0x5151, 0xd3 => 0x961f, 0xd4 => 0x5bf9, + 0xd5 => 0x58a9, 0xd6 => 0x5428, 0xd7 => 0x8e72, 0xd8 => 0x6566, + 0xd9 => 0x987f, 0xda => 0x56e4, 0xdb => 0x949d, 0xdc => 0x76fe, + 0xdd => 0x9041, 0xde => 0x6387, 0xdf => 0x54c6, 0xe0 => 0x591a, + 0xe1 => 0x593a, 0xe2 => 0x579b, 0xe3 => 0x8eb2, 0xe4 => 0x6735, + 0xe5 => 0x8dfa, 0xe6 => 0x8235, 0xe7 => 0x5241, 0xe8 => 0x60f0, + 0xe9 => 0x5815, 0xea => 0x86fe, 0xeb => 0x5ce8, 0xec => 0x9e45, + 0xed => 0x4fc4, 0xee => 0x989d, 0xef => 0x8bb9, 0xf0 => 0x5a25, + 0xf1 => 0x6076, 0xf2 => 0x5384, 0xf3 => 0x627c, 0xf4 => 0x904f, + 0xf5 => 0x9102, 0xf6 => 0x997f, 0xf7 => 0x6069, 0xf8 => 0x800c, + 0xf9 => 0x513f, 0xfa => 0x8033, 0xfb => 0x5c14, 0xfc => 0x9975, + 0xfd => 0x6d31, 0xfe => 0x4e8c, + }, + 0xb7 => { + 0xa1 => 0x8d30, 0xa2 => 0x53d1, 0xa3 => 0x7f5a, 0xa4 => 0x7b4f, + 0xa5 => 0x4f10, 0xa6 => 0x4e4f, 0xa7 => 0x9600, 0xa8 => 0x6cd5, + 0xa9 => 0x73d0, 0xaa => 0x85e9, 0xab => 0x5e06, 0xac => 0x756a, + 0xad => 0x7ffb, 0xae => 0x6a0a, 0xaf => 0x77fe, 0xb0 => 0x9492, + 0xb1 => 0x7e41, 0xb2 => 0x51e1, 0xb3 => 0x70e6, 0xb4 => 0x53cd, + 0xb5 => 0x8fd4, 0xb6 => 0x8303, 0xb7 => 0x8d29, 0xb8 => 0x72af, + 0xb9 => 0x996d, 0xba => 0x6cdb, 0xbb => 0x574a, 0xbc => 0x82b3, + 0xbd => 0x65b9, 0xbe => 0x80aa, 0xbf => 0x623f, 0xc0 => 0x9632, + 0xc1 => 0x59a8, 0xc2 => 0x4eff, 0xc3 => 0x8bbf, 0xc4 => 0x7eba, + 0xc5 => 0x653e, 0xc6 => 0x83f2, 0xc7 => 0x975e, 0xc8 => 0x5561, + 0xc9 => 0x98de, 0xca => 0x80a5, 0xcb => 0x532a, 0xcc => 0x8bfd, + 0xcd => 0x5420, 0xce => 0x80ba, 0xcf => 0x5e9f, 0xd0 => 0x6cb8, + 0xd1 => 0x8d39, 0xd2 => 0x82ac, 0xd3 => 0x915a, 0xd4 => 0x5429, + 0xd5 => 0x6c1b, 0xd6 => 0x5206, 0xd7 => 0x7eb7, 0xd8 => 0x575f, + 0xd9 => 0x711a, 0xda => 0x6c7e, 0xdb => 0x7c89, 0xdc => 0x594b, + 0xdd => 0x4efd, 0xde => 0x5fff, 0xdf => 0x6124, 0xe0 => 0x7caa, + 0xe1 => 0x4e30, 0xe2 => 0x5c01, 0xe3 => 0x67ab, 0xe4 => 0x8702, + 0xe5 => 0x5cf0, 0xe6 => 0x950b, 0xe7 => 0x98ce, 0xe8 => 0x75af, + 0xe9 => 0x70fd, 0xea => 0x9022, 0xeb => 0x51af, 0xec => 0x7f1d, + 0xed => 0x8bbd, 0xee => 0x5949, 0xef => 0x51e4, 0xf0 => 0x4f5b, + 0xf1 => 0x5426, 0xf2 => 0x592b, 0xf3 => 0x6577, 0xf4 => 0x80a4, + 0xf5 => 0x5b75, 0xf6 => 0x6276, 0xf7 => 0x62c2, 0xf8 => 0x8f90, + 0xf9 => 0x5e45, 0xfa => 0x6c1f, 0xfb => 0x7b26, 0xfc => 0x4f0f, + 0xfd => 0x4fd8, 0xfe => 0x670d, + }, + 0xb8 => { + 0xa1 => 0x6d6e, 0xa2 => 0x6daa, 0xa3 => 0x798f, 0xa4 => 0x88b1, + 0xa5 => 0x5f17, 0xa6 => 0x752b, 0xa7 => 0x629a, 0xa8 => 0x8f85, + 0xa9 => 0x4fef, 0xaa => 0x91dc, 0xab => 0x65a7, 0xac => 0x812f, + 0xad => 0x8151, 0xae => 0x5e9c, 0xaf => 0x8150, 0xb0 => 0x8d74, + 0xb1 => 0x526f, 0xb2 => 0x8986, 0xb3 => 0x8d4b, 0xb4 => 0x590d, + 0xb5 => 0x5085, 0xb6 => 0x4ed8, 0xb7 => 0x961c, 0xb8 => 0x7236, + 0xb9 => 0x8179, 0xba => 0x8d1f, 0xbb => 0x5bcc, 0xbc => 0x8ba3, + 0xbd => 0x9644, 0xbe => 0x5987, 0xbf => 0x7f1a, 0xc0 => 0x5490, + 0xc1 => 0x5676, 0xc2 => 0x560e, 0xc3 => 0x8be5, 0xc4 => 0x6539, + 0xc5 => 0x6982, 0xc6 => 0x9499, 0xc7 => 0x76d6, 0xc8 => 0x6e89, + 0xc9 => 0x5e72, 0xca => 0x7518, 0xcb => 0x6746, 0xcc => 0x67d1, + 0xcd => 0x7aff, 0xce => 0x809d, 0xcf => 0x8d76, 0xd0 => 0x611f, + 0xd1 => 0x79c6, 0xd2 => 0x6562, 0xd3 => 0x8d63, 0xd4 => 0x5188, + 0xd5 => 0x521a, 0xd6 => 0x94a2, 0xd7 => 0x7f38, 0xd8 => 0x809b, + 0xd9 => 0x7eb2, 0xda => 0x5c97, 0xdb => 0x6e2f, 0xdc => 0x6760, + 0xdd => 0x7bd9, 0xde => 0x768b, 0xdf => 0x9ad8, 0xe0 => 0x818f, + 0xe1 => 0x7f94, 0xe2 => 0x7cd5, 0xe3 => 0x641e, 0xe4 => 0x9550, + 0xe5 => 0x7a3f, 0xe6 => 0x544a, 0xe7 => 0x54e5, 0xe8 => 0x6b4c, + 0xe9 => 0x6401, 0xea => 0x6208, 0xeb => 0x9e3d, 0xec => 0x80f3, + 0xed => 0x7599, 0xee => 0x5272, 0xef => 0x9769, 0xf0 => 0x845b, + 0xf1 => 0x683c, 0xf2 => 0x86e4, 0xf3 => 0x9601, 0xf4 => 0x9694, + 0xf5 => 0x94ec, 0xf6 => 0x4e2a, 0xf7 => 0x5404, 0xf8 => 0x7ed9, + 0xf9 => 0x6839, 0xfa => 0x8ddf, 0xfb => 0x8015, 0xfc => 0x66f4, + 0xfd => 0x5e9a, 0xfe => 0x7fb9, + }, + 0xb9 => { + 0xa1 => 0x57c2, 0xa2 => 0x803f, 0xa3 => 0x6897, 0xa4 => 0x5de5, + 0xa5 => 0x653b, 0xa6 => 0x529f, 0xa7 => 0x606d, 0xa8 => 0x9f9a, + 0xa9 => 0x4f9b, 0xaa => 0x8eac, 0xab => 0x516c, 0xac => 0x5bab, + 0xad => 0x5f13, 0xae => 0x5de9, 0xaf => 0x6c5e, 0xb0 => 0x62f1, + 0xb1 => 0x8d21, 0xb2 => 0x5171, 0xb3 => 0x94a9, 0xb4 => 0x52fe, + 0xb5 => 0x6c9f, 0xb6 => 0x82df, 0xb7 => 0x72d7, 0xb8 => 0x57a2, + 0xb9 => 0x6784, 0xba => 0x8d2d, 0xbb => 0x591f, 0xbc => 0x8f9c, + 0xbd => 0x83c7, 0xbe => 0x5495, 0xbf => 0x7b8d, 0xc0 => 0x4f30, + 0xc1 => 0x6cbd, 0xc2 => 0x5b64, 0xc3 => 0x59d1, 0xc4 => 0x9f13, + 0xc5 => 0x53e4, 0xc6 => 0x86ca, 0xc7 => 0x9aa8, 0xc8 => 0x8c37, + 0xc9 => 0x80a1, 0xca => 0x6545, 0xcb => 0x987e, 0xcc => 0x56fa, + 0xcd => 0x96c7, 0xce => 0x522e, 0xcf => 0x74dc, 0xd0 => 0x5250, + 0xd1 => 0x5be1, 0xd2 => 0x6302, 0xd3 => 0x8902, 0xd4 => 0x4e56, + 0xd5 => 0x62d0, 0xd6 => 0x602a, 0xd7 => 0x68fa, 0xd8 => 0x5173, + 0xd9 => 0x5b98, 0xda => 0x51a0, 0xdb => 0x89c2, 0xdc => 0x7ba1, + 0xdd => 0x9986, 0xde => 0x7f50, 0xdf => 0x60ef, 0xe0 => 0x704c, + 0xe1 => 0x8d2f, 0xe2 => 0x5149, 0xe3 => 0x5e7f, 0xe4 => 0x901b, + 0xe5 => 0x7470, 0xe6 => 0x89c4, 0xe7 => 0x572d, 0xe8 => 0x7845, + 0xe9 => 0x5f52, 0xea => 0x9f9f, 0xeb => 0x95fa, 0xec => 0x8f68, + 0xed => 0x9b3c, 0xee => 0x8be1, 0xef => 0x7678, 0xf0 => 0x6842, + 0xf1 => 0x67dc, 0xf2 => 0x8dea, 0xf3 => 0x8d35, 0xf4 => 0x523d, + 0xf5 => 0x8f8a, 0xf6 => 0x6eda, 0xf7 => 0x68cd, 0xf8 => 0x9505, + 0xf9 => 0x90ed, 0xfa => 0x56fd, 0xfb => 0x679c, 0xfc => 0x88f9, + 0xfd => 0x8fc7, 0xfe => 0x54c8, + }, + 0xba => { + 0xa1 => 0x9ab8, 0xa2 => 0x5b69, 0xa3 => 0x6d77, 0xa4 => 0x6c26, + 0xa5 => 0x4ea5, 0xa6 => 0x5bb3, 0xa7 => 0x9a87, 0xa8 => 0x9163, + 0xa9 => 0x61a8, 0xaa => 0x90af, 0xab => 0x97e9, 0xac => 0x542b, + 0xad => 0x6db5, 0xae => 0x5bd2, 0xaf => 0x51fd, 0xb0 => 0x558a, + 0xb1 => 0x7f55, 0xb2 => 0x7ff0, 0xb3 => 0x64bc, 0xb4 => 0x634d, + 0xb5 => 0x65f1, 0xb6 => 0x61be, 0xb7 => 0x608d, 0xb8 => 0x710a, + 0xb9 => 0x6c57, 0xba => 0x6c49, 0xbb => 0x592f, 0xbc => 0x676d, + 0xbd => 0x822a, 0xbe => 0x58d5, 0xbf => 0x568e, 0xc0 => 0x8c6a, + 0xc1 => 0x6beb, 0xc2 => 0x90dd, 0xc3 => 0x597d, 0xc4 => 0x8017, + 0xc5 => 0x53f7, 0xc6 => 0x6d69, 0xc7 => 0x5475, 0xc8 => 0x559d, + 0xc9 => 0x8377, 0xca => 0x83cf, 0xcb => 0x6838, 0xcc => 0x79be, + 0xcd => 0x548c, 0xce => 0x4f55, 0xcf => 0x5408, 0xd0 => 0x76d2, + 0xd1 => 0x8c89, 0xd2 => 0x9602, 0xd3 => 0x6cb3, 0xd4 => 0x6db8, + 0xd5 => 0x8d6b, 0xd6 => 0x8910, 0xd7 => 0x9e64, 0xd8 => 0x8d3a, + 0xd9 => 0x563f, 0xda => 0x9ed1, 0xdb => 0x75d5, 0xdc => 0x5f88, + 0xdd => 0x72e0, 0xde => 0x6068, 0xdf => 0x54fc, 0xe0 => 0x4ea8, + 0xe1 => 0x6a2a, 0xe2 => 0x8861, 0xe3 => 0x6052, 0xe4 => 0x8f70, + 0xe5 => 0x54c4, 0xe6 => 0x70d8, 0xe7 => 0x8679, 0xe8 => 0x9e3f, + 0xe9 => 0x6d2a, 0xea => 0x5b8f, 0xeb => 0x5f18, 0xec => 0x7ea2, + 0xed => 0x5589, 0xee => 0x4faf, 0xef => 0x7334, 0xf0 => 0x543c, + 0xf1 => 0x539a, 0xf2 => 0x5019, 0xf3 => 0x540e, 0xf4 => 0x547c, + 0xf5 => 0x4e4e, 0xf6 => 0x5ffd, 0xf7 => 0x745a, 0xf8 => 0x58f6, + 0xf9 => 0x846b, 0xfa => 0x80e1, 0xfb => 0x8774, 0xfc => 0x72d0, + 0xfd => 0x7cca, 0xfe => 0x6e56, + }, + 0xbb => { + 0xa1 => 0x5f27, 0xa2 => 0x864e, 0xa3 => 0x552c, 0xa4 => 0x62a4, + 0xa5 => 0x4e92, 0xa6 => 0x6caa, 0xa7 => 0x6237, 0xa8 => 0x82b1, + 0xa9 => 0x54d7, 0xaa => 0x534e, 0xab => 0x733e, 0xac => 0x6ed1, + 0xad => 0x753b, 0xae => 0x5212, 0xaf => 0x5316, 0xb0 => 0x8bdd, + 0xb1 => 0x69d0, 0xb2 => 0x5f8a, 0xb3 => 0x6000, 0xb4 => 0x6dee, + 0xb5 => 0x574f, 0xb6 => 0x6b22, 0xb7 => 0x73af, 0xb8 => 0x6853, + 0xb9 => 0x8fd8, 0xba => 0x7f13, 0xbb => 0x6362, 0xbc => 0x60a3, + 0xbd => 0x5524, 0xbe => 0x75ea, 0xbf => 0x8c62, 0xc0 => 0x7115, + 0xc1 => 0x6da3, 0xc2 => 0x5ba6, 0xc3 => 0x5e7b, 0xc4 => 0x8352, + 0xc5 => 0x614c, 0xc6 => 0x9ec4, 0xc7 => 0x78fa, 0xc8 => 0x8757, + 0xc9 => 0x7c27, 0xca => 0x7687, 0xcb => 0x51f0, 0xcc => 0x60f6, + 0xcd => 0x714c, 0xce => 0x6643, 0xcf => 0x5e4c, 0xd0 => 0x604d, + 0xd1 => 0x8c0e, 0xd2 => 0x7070, 0xd3 => 0x6325, 0xd4 => 0x8f89, + 0xd5 => 0x5fbd, 0xd6 => 0x6062, 0xd7 => 0x86d4, 0xd8 => 0x56de, + 0xd9 => 0x6bc1, 0xda => 0x6094, 0xdb => 0x6167, 0xdc => 0x5349, + 0xdd => 0x60e0, 0xde => 0x6666, 0xdf => 0x8d3f, 0xe0 => 0x79fd, + 0xe1 => 0x4f1a, 0xe2 => 0x70e9, 0xe3 => 0x6c47, 0xe4 => 0x8bb3, + 0xe5 => 0x8bf2, 0xe6 => 0x7ed8, 0xe7 => 0x8364, 0xe8 => 0x660f, + 0xe9 => 0x5a5a, 0xea => 0x9b42, 0xeb => 0x6d51, 0xec => 0x6df7, + 0xed => 0x8c41, 0xee => 0x6d3b, 0xef => 0x4f19, 0xf0 => 0x706b, + 0xf1 => 0x83b7, 0xf2 => 0x6216, 0xf3 => 0x60d1, 0xf4 => 0x970d, + 0xf5 => 0x8d27, 0xf6 => 0x7978, 0xf7 => 0x51fb, 0xf8 => 0x573e, + 0xf9 => 0x57fa, 0xfa => 0x673a, 0xfb => 0x7578, 0xfc => 0x7a3d, + 0xfd => 0x79ef, 0xfe => 0x7b95, + }, + 0xbc => { + 0xa1 => 0x808c, 0xa2 => 0x9965, 0xa3 => 0x8ff9, 0xa4 => 0x6fc0, + 0xa5 => 0x8ba5, 0xa6 => 0x9e21, 0xa7 => 0x59ec, 0xa8 => 0x7ee9, + 0xa9 => 0x7f09, 0xaa => 0x5409, 0xab => 0x6781, 0xac => 0x68d8, + 0xad => 0x8f91, 0xae => 0x7c4d, 0xaf => 0x96c6, 0xb0 => 0x53ca, + 0xb1 => 0x6025, 0xb2 => 0x75be, 0xb3 => 0x6c72, 0xb4 => 0x5373, + 0xb5 => 0x5ac9, 0xb6 => 0x7ea7, 0xb7 => 0x6324, 0xb8 => 0x51e0, + 0xb9 => 0x810a, 0xba => 0x5df1, 0xbb => 0x84df, 0xbc => 0x6280, + 0xbd => 0x5180, 0xbe => 0x5b63, 0xbf => 0x4f0e, 0xc0 => 0x796d, + 0xc1 => 0x5242, 0xc2 => 0x60b8, 0xc3 => 0x6d4e, 0xc4 => 0x5bc4, + 0xc5 => 0x5bc2, 0xc6 => 0x8ba1, 0xc7 => 0x8bb0, 0xc8 => 0x65e2, + 0xc9 => 0x5fcc, 0xca => 0x9645, 0xcb => 0x5993, 0xcc => 0x7ee7, + 0xcd => 0x7eaa, 0xce => 0x5609, 0xcf => 0x67b7, 0xd0 => 0x5939, + 0xd1 => 0x4f73, 0xd2 => 0x5bb6, 0xd3 => 0x52a0, 0xd4 => 0x835a, + 0xd5 => 0x988a, 0xd6 => 0x8d3e, 0xd7 => 0x7532, 0xd8 => 0x94be, + 0xd9 => 0x5047, 0xda => 0x7a3c, 0xdb => 0x4ef7, 0xdc => 0x67b6, + 0xdd => 0x9a7e, 0xde => 0x5ac1, 0xdf => 0x6b7c, 0xe0 => 0x76d1, + 0xe1 => 0x575a, 0xe2 => 0x5c16, 0xe3 => 0x7b3a, 0xe4 => 0x95f4, + 0xe5 => 0x714e, 0xe6 => 0x517c, 0xe7 => 0x80a9, 0xe8 => 0x8270, + 0xe9 => 0x5978, 0xea => 0x7f04, 0xeb => 0x8327, 0xec => 0x68c0, + 0xed => 0x67ec, 0xee => 0x78b1, 0xef => 0x7877, 0xf0 => 0x62e3, + 0xf1 => 0x6361, 0xf2 => 0x7b80, 0xf3 => 0x4fed, 0xf4 => 0x526a, + 0xf5 => 0x51cf, 0xf6 => 0x8350, 0xf7 => 0x69db, 0xf8 => 0x9274, + 0xf9 => 0x8df5, 0xfa => 0x8d31, 0xfb => 0x89c1, 0xfc => 0x952e, + 0xfd => 0x7bad, 0xfe => 0x4ef6, + }, + 0xbd => { + 0xa1 => 0x5065, 0xa2 => 0x8230, 0xa3 => 0x5251, 0xa4 => 0x996f, + 0xa5 => 0x6e10, 0xa6 => 0x6e85, 0xa7 => 0x6da7, 0xa8 => 0x5efa, + 0xa9 => 0x50f5, 0xaa => 0x59dc, 0xab => 0x5c06, 0xac => 0x6d46, + 0xad => 0x6c5f, 0xae => 0x7586, 0xaf => 0x848b, 0xb0 => 0x6868, + 0xb1 => 0x5956, 0xb2 => 0x8bb2, 0xb3 => 0x5320, 0xb4 => 0x9171, + 0xb5 => 0x964d, 0xb6 => 0x8549, 0xb7 => 0x6912, 0xb8 => 0x7901, + 0xb9 => 0x7126, 0xba => 0x80f6, 0xbb => 0x4ea4, 0xbc => 0x90ca, + 0xbd => 0x6d47, 0xbe => 0x9a84, 0xbf => 0x5a07, 0xc0 => 0x56bc, + 0xc1 => 0x6405, 0xc2 => 0x94f0, 0xc3 => 0x77eb, 0xc4 => 0x4fa5, + 0xc5 => 0x811a, 0xc6 => 0x72e1, 0xc7 => 0x89d2, 0xc8 => 0x997a, + 0xc9 => 0x7f34, 0xca => 0x7ede, 0xcb => 0x527f, 0xcc => 0x6559, + 0xcd => 0x9175, 0xce => 0x8f7f, 0xcf => 0x8f83, 0xd0 => 0x53eb, + 0xd1 => 0x7a96, 0xd2 => 0x63ed, 0xd3 => 0x63a5, 0xd4 => 0x7686, + 0xd5 => 0x79f8, 0xd6 => 0x8857, 0xd7 => 0x9636, 0xd8 => 0x622a, + 0xd9 => 0x52ab, 0xda => 0x8282, 0xdb => 0x6854, 0xdc => 0x6770, + 0xdd => 0x6377, 0xde => 0x776b, 0xdf => 0x7aed, 0xe0 => 0x6d01, + 0xe1 => 0x7ed3, 0xe2 => 0x89e3, 0xe3 => 0x59d0, 0xe4 => 0x6212, + 0xe5 => 0x85c9, 0xe6 => 0x82a5, 0xe7 => 0x754c, 0xe8 => 0x501f, + 0xe9 => 0x4ecb, 0xea => 0x75a5, 0xeb => 0x8beb, 0xec => 0x5c4a, + 0xed => 0x5dfe, 0xee => 0x7b4b, 0xef => 0x65a4, 0xf0 => 0x91d1, + 0xf1 => 0x4eca, 0xf2 => 0x6d25, 0xf3 => 0x895f, 0xf4 => 0x7d27, + 0xf5 => 0x9526, 0xf6 => 0x4ec5, 0xf7 => 0x8c28, 0xf8 => 0x8fdb, + 0xf9 => 0x9773, 0xfa => 0x664b, 0xfb => 0x7981, 0xfc => 0x8fd1, + 0xfd => 0x70ec, 0xfe => 0x6d78, + }, + 0xbe => { + 0xa1 => 0x5c3d, 0xa2 => 0x52b2, 0xa3 => 0x8346, 0xa4 => 0x5162, + 0xa5 => 0x830e, 0xa6 => 0x775b, 0xa7 => 0x6676, 0xa8 => 0x9cb8, + 0xa9 => 0x4eac, 0xaa => 0x60ca, 0xab => 0x7cbe, 0xac => 0x7cb3, + 0xad => 0x7ecf, 0xae => 0x4e95, 0xaf => 0x8b66, 0xb0 => 0x666f, + 0xb1 => 0x9888, 0xb2 => 0x9759, 0xb3 => 0x5883, 0xb4 => 0x656c, + 0xb5 => 0x955c, 0xb6 => 0x5f84, 0xb7 => 0x75c9, 0xb8 => 0x9756, + 0xb9 => 0x7adf, 0xba => 0x7ade, 0xbb => 0x51c0, 0xbc => 0x70af, + 0xbd => 0x7a98, 0xbe => 0x63ea, 0xbf => 0x7a76, 0xc0 => 0x7ea0, + 0xc1 => 0x7396, 0xc2 => 0x97ed, 0xc3 => 0x4e45, 0xc4 => 0x7078, + 0xc5 => 0x4e5d, 0xc6 => 0x9152, 0xc7 => 0x53a9, 0xc8 => 0x6551, + 0xc9 => 0x65e7, 0xca => 0x81fc, 0xcb => 0x8205, 0xcc => 0x548e, + 0xcd => 0x5c31, 0xce => 0x759a, 0xcf => 0x97a0, 0xd0 => 0x62d8, + 0xd1 => 0x72d9, 0xd2 => 0x75bd, 0xd3 => 0x5c45, 0xd4 => 0x9a79, + 0xd5 => 0x83ca, 0xd6 => 0x5c40, 0xd7 => 0x5480, 0xd8 => 0x77e9, + 0xd9 => 0x4e3e, 0xda => 0x6cae, 0xdb => 0x805a, 0xdc => 0x62d2, + 0xdd => 0x636e, 0xde => 0x5de8, 0xdf => 0x5177, 0xe0 => 0x8ddd, + 0xe1 => 0x8e1e, 0xe2 => 0x952f, 0xe3 => 0x4ff1, 0xe4 => 0x53e5, + 0xe5 => 0x60e7, 0xe6 => 0x70ac, 0xe7 => 0x5267, 0xe8 => 0x6350, + 0xe9 => 0x9e43, 0xea => 0x5a1f, 0xeb => 0x5026, 0xec => 0x7737, + 0xed => 0x5377, 0xee => 0x7ee2, 0xef => 0x6485, 0xf0 => 0x652b, + 0xf1 => 0x6289, 0xf2 => 0x6398, 0xf3 => 0x5014, 0xf4 => 0x7235, + 0xf5 => 0x89c9, 0xf6 => 0x51b3, 0xf7 => 0x8bc0, 0xf8 => 0x7edd, + 0xf9 => 0x5747, 0xfa => 0x83cc, 0xfb => 0x94a7, 0xfc => 0x519b, + 0xfd => 0x541b, 0xfe => 0x5cfb, + }, + 0xbf => { + 0xa1 => 0x4fca, 0xa2 => 0x7ae3, 0xa3 => 0x6d5a, 0xa4 => 0x90e1, + 0xa5 => 0x9a8f, 0xa6 => 0x5580, 0xa7 => 0x5496, 0xa8 => 0x5361, + 0xa9 => 0x54af, 0xaa => 0x5f00, 0xab => 0x63e9, 0xac => 0x6977, + 0xad => 0x51ef, 0xae => 0x6168, 0xaf => 0x520a, 0xb0 => 0x582a, + 0xb1 => 0x52d8, 0xb2 => 0x574e, 0xb3 => 0x780d, 0xb4 => 0x770b, + 0xb5 => 0x5eb7, 0xb6 => 0x6177, 0xb7 => 0x7ce0, 0xb8 => 0x625b, + 0xb9 => 0x6297, 0xba => 0x4ea2, 0xbb => 0x7095, 0xbc => 0x8003, + 0xbd => 0x62f7, 0xbe => 0x70e4, 0xbf => 0x9760, 0xc0 => 0x5777, + 0xc1 => 0x82db, 0xc2 => 0x67ef, 0xc3 => 0x68f5, 0xc4 => 0x78d5, + 0xc5 => 0x9897, 0xc6 => 0x79d1, 0xc7 => 0x58f3, 0xc8 => 0x54b3, + 0xc9 => 0x53ef, 0xca => 0x6e34, 0xcb => 0x514b, 0xcc => 0x523b, + 0xcd => 0x5ba2, 0xce => 0x8bfe, 0xcf => 0x80af, 0xd0 => 0x5543, + 0xd1 => 0x57a6, 0xd2 => 0x6073, 0xd3 => 0x5751, 0xd4 => 0x542d, + 0xd5 => 0x7a7a, 0xd6 => 0x6050, 0xd7 => 0x5b54, 0xd8 => 0x63a7, + 0xd9 => 0x62a0, 0xda => 0x53e3, 0xdb => 0x6263, 0xdc => 0x5bc7, + 0xdd => 0x67af, 0xde => 0x54ed, 0xdf => 0x7a9f, 0xe0 => 0x82e6, + 0xe1 => 0x9177, 0xe2 => 0x5e93, 0xe3 => 0x88e4, 0xe4 => 0x5938, + 0xe5 => 0x57ae, 0xe6 => 0x630e, 0xe7 => 0x8de8, 0xe8 => 0x80ef, + 0xe9 => 0x5757, 0xea => 0x7b77, 0xeb => 0x4fa9, 0xec => 0x5feb, + 0xed => 0x5bbd, 0xee => 0x6b3e, 0xef => 0x5321, 0xf0 => 0x7b50, + 0xf1 => 0x72c2, 0xf2 => 0x6846, 0xf3 => 0x77ff, 0xf4 => 0x7736, + 0xf5 => 0x65f7, 0xf6 => 0x51b5, 0xf7 => 0x4e8f, 0xf8 => 0x76d4, + 0xf9 => 0x5cbf, 0xfa => 0x7aa5, 0xfb => 0x8475, 0xfc => 0x594e, + 0xfd => 0x9b41, 0xfe => 0x5080, + }, + 0xc0 => { + 0xa1 => 0x9988, 0xa2 => 0x6127, 0xa3 => 0x6e83, 0xa4 => 0x5764, + 0xa5 => 0x6606, 0xa6 => 0x6346, 0xa7 => 0x56f0, 0xa8 => 0x62ec, + 0xa9 => 0x6269, 0xaa => 0x5ed3, 0xab => 0x9614, 0xac => 0x5783, + 0xad => 0x62c9, 0xae => 0x5587, 0xaf => 0x8721, 0xb0 => 0x814a, + 0xb1 => 0x8fa3, 0xb2 => 0x5566, 0xb3 => 0x83b1, 0xb4 => 0x6765, + 0xb5 => 0x8d56, 0xb6 => 0x84dd, 0xb7 => 0x5a6a, 0xb8 => 0x680f, + 0xb9 => 0x62e6, 0xba => 0x7bee, 0xbb => 0x9611, 0xbc => 0x5170, + 0xbd => 0x6f9c, 0xbe => 0x8c30, 0xbf => 0x63fd, 0xc0 => 0x89c8, + 0xc1 => 0x61d2, 0xc2 => 0x7f06, 0xc3 => 0x70c2, 0xc4 => 0x6ee5, + 0xc5 => 0x7405, 0xc6 => 0x6994, 0xc7 => 0x72fc, 0xc8 => 0x5eca, + 0xc9 => 0x90ce, 0xca => 0x6717, 0xcb => 0x6d6a, 0xcc => 0x635e, + 0xcd => 0x52b3, 0xce => 0x7262, 0xcf => 0x8001, 0xd0 => 0x4f6c, + 0xd1 => 0x59e5, 0xd2 => 0x916a, 0xd3 => 0x70d9, 0xd4 => 0x6d9d, + 0xd5 => 0x52d2, 0xd6 => 0x4e50, 0xd7 => 0x96f7, 0xd8 => 0x956d, + 0xd9 => 0x857e, 0xda => 0x78ca, 0xdb => 0x7d2f, 0xdc => 0x5121, + 0xdd => 0x5792, 0xde => 0x64c2, 0xdf => 0x808b, 0xe0 => 0x7c7b, + 0xe1 => 0x6cea, 0xe2 => 0x68f1, 0xe3 => 0x695e, 0xe4 => 0x51b7, + 0xe5 => 0x5398, 0xe6 => 0x68a8, 0xe7 => 0x7281, 0xe8 => 0x9ece, + 0xe9 => 0x7bf1, 0xea => 0x72f8, 0xeb => 0x79bb, 0xec => 0x6f13, + 0xed => 0x7406, 0xee => 0x674e, 0xef => 0x91cc, 0xf0 => 0x9ca4, + 0xf1 => 0x793c, 0xf2 => 0x8389, 0xf3 => 0x8354, 0xf4 => 0x540f, + 0xf5 => 0x6817, 0xf6 => 0x4e3d, 0xf7 => 0x5389, 0xf8 => 0x52b1, + 0xf9 => 0x783e, 0xfa => 0x5386, 0xfb => 0x5229, 0xfc => 0x5088, + 0xfd => 0x4f8b, 0xfe => 0x4fd0, + }, + 0xc1 => { + 0xa1 => 0x75e2, 0xa2 => 0x7acb, 0xa3 => 0x7c92, 0xa4 => 0x6ca5, + 0xa5 => 0x96b6, 0xa6 => 0x529b, 0xa7 => 0x7483, 0xa8 => 0x54e9, + 0xa9 => 0x4fe9, 0xaa => 0x8054, 0xab => 0x83b2, 0xac => 0x8fde, + 0xad => 0x9570, 0xae => 0x5ec9, 0xaf => 0x601c, 0xb0 => 0x6d9f, + 0xb1 => 0x5e18, 0xb2 => 0x655b, 0xb3 => 0x8138, 0xb4 => 0x94fe, + 0xb5 => 0x604b, 0xb6 => 0x70bc, 0xb7 => 0x7ec3, 0xb8 => 0x7cae, + 0xb9 => 0x51c9, 0xba => 0x6881, 0xbb => 0x7cb1, 0xbc => 0x826f, + 0xbd => 0x4e24, 0xbe => 0x8f86, 0xbf => 0x91cf, 0xc0 => 0x667e, + 0xc1 => 0x4eae, 0xc2 => 0x8c05, 0xc3 => 0x64a9, 0xc4 => 0x804a, + 0xc5 => 0x50da, 0xc6 => 0x7597, 0xc7 => 0x71ce, 0xc8 => 0x5be5, + 0xc9 => 0x8fbd, 0xca => 0x6f66, 0xcb => 0x4e86, 0xcc => 0x6482, + 0xcd => 0x9563, 0xce => 0x5ed6, 0xcf => 0x6599, 0xd0 => 0x5217, + 0xd1 => 0x88c2, 0xd2 => 0x70c8, 0xd3 => 0x52a3, 0xd4 => 0x730e, + 0xd5 => 0x7433, 0xd6 => 0x6797, 0xd7 => 0x78f7, 0xd8 => 0x9716, + 0xd9 => 0x4e34, 0xda => 0x90bb, 0xdb => 0x9cde, 0xdc => 0x6dcb, + 0xdd => 0x51db, 0xde => 0x8d41, 0xdf => 0x541d, 0xe0 => 0x62ce, + 0xe1 => 0x73b2, 0xe2 => 0x83f1, 0xe3 => 0x96f6, 0xe4 => 0x9f84, + 0xe5 => 0x94c3, 0xe6 => 0x4f36, 0xe7 => 0x7f9a, 0xe8 => 0x51cc, + 0xe9 => 0x7075, 0xea => 0x9675, 0xeb => 0x5cad, 0xec => 0x9886, + 0xed => 0x53e6, 0xee => 0x4ee4, 0xef => 0x6e9c, 0xf0 => 0x7409, + 0xf1 => 0x69b4, 0xf2 => 0x786b, 0xf3 => 0x998f, 0xf4 => 0x7559, + 0xf5 => 0x5218, 0xf6 => 0x7624, 0xf7 => 0x6d41, 0xf8 => 0x67f3, + 0xf9 => 0x516d, 0xfa => 0x9f99, 0xfb => 0x804b, 0xfc => 0x5499, + 0xfd => 0x7b3c, 0xfe => 0x7abf, + }, + 0xc2 => { + 0xa1 => 0x9686, 0xa2 => 0x5784, 0xa3 => 0x62e2, 0xa4 => 0x9647, + 0xa5 => 0x697c, 0xa6 => 0x5a04, 0xa7 => 0x6402, 0xa8 => 0x7bd3, + 0xa9 => 0x6f0f, 0xaa => 0x964b, 0xab => 0x82a6, 0xac => 0x5362, + 0xad => 0x9885, 0xae => 0x5e90, 0xaf => 0x7089, 0xb0 => 0x63b3, + 0xb1 => 0x5364, 0xb2 => 0x864f, 0xb3 => 0x9c81, 0xb4 => 0x9e93, + 0xb5 => 0x788c, 0xb6 => 0x9732, 0xb7 => 0x8def, 0xb8 => 0x8d42, + 0xb9 => 0x9e7f, 0xba => 0x6f5e, 0xbb => 0x7984, 0xbc => 0x5f55, + 0xbd => 0x9646, 0xbe => 0x622e, 0xbf => 0x9a74, 0xc0 => 0x5415, + 0xc1 => 0x94dd, 0xc2 => 0x4fa3, 0xc3 => 0x65c5, 0xc4 => 0x5c65, + 0xc5 => 0x5c61, 0xc6 => 0x7f15, 0xc7 => 0x8651, 0xc8 => 0x6c2f, + 0xc9 => 0x5f8b, 0xca => 0x7387, 0xcb => 0x6ee4, 0xcc => 0x7eff, + 0xcd => 0x5ce6, 0xce => 0x631b, 0xcf => 0x5b6a, 0xd0 => 0x6ee6, + 0xd1 => 0x5375, 0xd2 => 0x4e71, 0xd3 => 0x63a0, 0xd4 => 0x7565, + 0xd5 => 0x62a1, 0xd6 => 0x8f6e, 0xd7 => 0x4f26, 0xd8 => 0x4ed1, + 0xd9 => 0x6ca6, 0xda => 0x7eb6, 0xdb => 0x8bba, 0xdc => 0x841d, + 0xdd => 0x87ba, 0xde => 0x7f57, 0xdf => 0x903b, 0xe0 => 0x9523, + 0xe1 => 0x7ba9, 0xe2 => 0x9aa1, 0xe3 => 0x88f8, 0xe4 => 0x843d, + 0xe5 => 0x6d1b, 0xe6 => 0x9a86, 0xe7 => 0x7edc, 0xe8 => 0x5988, + 0xe9 => 0x9ebb, 0xea => 0x739b, 0xeb => 0x7801, 0xec => 0x8682, + 0xed => 0x9a6c, 0xee => 0x9a82, 0xef => 0x561b, 0xf0 => 0x5417, + 0xf1 => 0x57cb, 0xf2 => 0x4e70, 0xf3 => 0x9ea6, 0xf4 => 0x5356, + 0xf5 => 0x8fc8, 0xf6 => 0x8109, 0xf7 => 0x7792, 0xf8 => 0x9992, + 0xf9 => 0x86ee, 0xfa => 0x6ee1, 0xfb => 0x8513, 0xfc => 0x66fc, + 0xfd => 0x6162, 0xfe => 0x6f2b, + }, + 0xc3 => { + 0xa1 => 0x8c29, 0xa2 => 0x8292, 0xa3 => 0x832b, 0xa4 => 0x76f2, + 0xa5 => 0x6c13, 0xa6 => 0x5fd9, 0xa7 => 0x83bd, 0xa8 => 0x732b, + 0xa9 => 0x8305, 0xaa => 0x951a, 0xab => 0x6bdb, 0xac => 0x77db, + 0xad => 0x94c6, 0xae => 0x536f, 0xaf => 0x8302, 0xb0 => 0x5192, + 0xb1 => 0x5e3d, 0xb2 => 0x8c8c, 0xb3 => 0x8d38, 0xb4 => 0x4e48, + 0xb5 => 0x73ab, 0xb6 => 0x679a, 0xb7 => 0x6885, 0xb8 => 0x9176, + 0xb9 => 0x9709, 0xba => 0x7164, 0xbb => 0x6ca1, 0xbc => 0x7709, + 0xbd => 0x5a92, 0xbe => 0x9541, 0xbf => 0x6bcf, 0xc0 => 0x7f8e, + 0xc1 => 0x6627, 0xc2 => 0x5bd0, 0xc3 => 0x59b9, 0xc4 => 0x5a9a, + 0xc5 => 0x95e8, 0xc6 => 0x95f7, 0xc7 => 0x4eec, 0xc8 => 0x840c, + 0xc9 => 0x8499, 0xca => 0x6aac, 0xcb => 0x76df, 0xcc => 0x9530, + 0xcd => 0x731b, 0xce => 0x68a6, 0xcf => 0x5b5f, 0xd0 => 0x772f, + 0xd1 => 0x919a, 0xd2 => 0x9761, 0xd3 => 0x7cdc, 0xd4 => 0x8ff7, + 0xd5 => 0x8c1c, 0xd6 => 0x5f25, 0xd7 => 0x7c73, 0xd8 => 0x79d8, + 0xd9 => 0x89c5, 0xda => 0x6ccc, 0xdb => 0x871c, 0xdc => 0x5bc6, + 0xdd => 0x5e42, 0xde => 0x68c9, 0xdf => 0x7720, 0xe0 => 0x7ef5, + 0xe1 => 0x5195, 0xe2 => 0x514d, 0xe3 => 0x52c9, 0xe4 => 0x5a29, + 0xe5 => 0x7f05, 0xe6 => 0x9762, 0xe7 => 0x82d7, 0xe8 => 0x63cf, + 0xe9 => 0x7784, 0xea => 0x85d0, 0xeb => 0x79d2, 0xec => 0x6e3a, + 0xed => 0x5e99, 0xee => 0x5999, 0xef => 0x8511, 0xf0 => 0x706d, + 0xf1 => 0x6c11, 0xf2 => 0x62bf, 0xf3 => 0x76bf, 0xf4 => 0x654f, + 0xf5 => 0x60af, 0xf6 => 0x95fd, 0xf7 => 0x660e, 0xf8 => 0x879f, + 0xf9 => 0x9e23, 0xfa => 0x94ed, 0xfb => 0x540d, 0xfc => 0x547d, + 0xfd => 0x8c2c, 0xfe => 0x6478, + }, + 0xc4 => { + 0xa1 => 0x6479, 0xa2 => 0x8611, 0xa3 => 0x6a21, 0xa4 => 0x819c, + 0xa5 => 0x78e8, 0xa6 => 0x6469, 0xa7 => 0x9b54, 0xa8 => 0x62b9, + 0xa9 => 0x672b, 0xaa => 0x83ab, 0xab => 0x58a8, 0xac => 0x9ed8, + 0xad => 0x6cab, 0xae => 0x6f20, 0xaf => 0x5bde, 0xb0 => 0x964c, + 0xb1 => 0x8c0b, 0xb2 => 0x725f, 0xb3 => 0x67d0, 0xb4 => 0x62c7, + 0xb5 => 0x7261, 0xb6 => 0x4ea9, 0xb7 => 0x59c6, 0xb8 => 0x6bcd, + 0xb9 => 0x5893, 0xba => 0x66ae, 0xbb => 0x5e55, 0xbc => 0x52df, + 0xbd => 0x6155, 0xbe => 0x6728, 0xbf => 0x76ee, 0xc0 => 0x7766, + 0xc1 => 0x7267, 0xc2 => 0x7a46, 0xc3 => 0x62ff, 0xc4 => 0x54ea, + 0xc5 => 0x5450, 0xc6 => 0x94a0, 0xc7 => 0x90a3, 0xc8 => 0x5a1c, + 0xc9 => 0x7eb3, 0xca => 0x6c16, 0xcb => 0x4e43, 0xcc => 0x5976, + 0xcd => 0x8010, 0xce => 0x5948, 0xcf => 0x5357, 0xd0 => 0x7537, + 0xd1 => 0x96be, 0xd2 => 0x56ca, 0xd3 => 0x6320, 0xd4 => 0x8111, + 0xd5 => 0x607c, 0xd6 => 0x95f9, 0xd7 => 0x6dd6, 0xd8 => 0x5462, + 0xd9 => 0x9981, 0xda => 0x5185, 0xdb => 0x5ae9, 0xdc => 0x80fd, + 0xdd => 0x59ae, 0xde => 0x9713, 0xdf => 0x502a, 0xe0 => 0x6ce5, + 0xe1 => 0x5c3c, 0xe2 => 0x62df, 0xe3 => 0x4f60, 0xe4 => 0x533f, + 0xe5 => 0x817b, 0xe6 => 0x9006, 0xe7 => 0x6eba, 0xe8 => 0x852b, + 0xe9 => 0x62c8, 0xea => 0x5e74, 0xeb => 0x78be, 0xec => 0x64b5, + 0xed => 0x637b, 0xee => 0x5ff5, 0xef => 0x5a18, 0xf0 => 0x917f, + 0xf1 => 0x9e1f, 0xf2 => 0x5c3f, 0xf3 => 0x634f, 0xf4 => 0x8042, + 0xf5 => 0x5b7d, 0xf6 => 0x556e, 0xf7 => 0x954a, 0xf8 => 0x954d, + 0xf9 => 0x6d85, 0xfa => 0x60a8, 0xfb => 0x67e0, 0xfc => 0x72de, + 0xfd => 0x51dd, 0xfe => 0x5b81, + }, + 0xc5 => { + 0xa1 => 0x62e7, 0xa2 => 0x6cde, 0xa3 => 0x725b, 0xa4 => 0x626d, + 0xa5 => 0x94ae, 0xa6 => 0x7ebd, 0xa7 => 0x8113, 0xa8 => 0x6d53, + 0xa9 => 0x519c, 0xaa => 0x5f04, 0xab => 0x5974, 0xac => 0x52aa, + 0xad => 0x6012, 0xae => 0x5973, 0xaf => 0x6696, 0xb0 => 0x8650, + 0xb1 => 0x759f, 0xb2 => 0x632a, 0xb3 => 0x61e6, 0xb4 => 0x7cef, + 0xb5 => 0x8bfa, 0xb6 => 0x54e6, 0xb7 => 0x6b27, 0xb8 => 0x9e25, + 0xb9 => 0x6bb4, 0xba => 0x85d5, 0xbb => 0x5455, 0xbc => 0x5076, + 0xbd => 0x6ca4, 0xbe => 0x556a, 0xbf => 0x8db4, 0xc0 => 0x722c, + 0xc1 => 0x5e15, 0xc2 => 0x6015, 0xc3 => 0x7436, 0xc4 => 0x62cd, + 0xc5 => 0x6392, 0xc6 => 0x724c, 0xc7 => 0x5f98, 0xc8 => 0x6e43, + 0xc9 => 0x6d3e, 0xca => 0x6500, 0xcb => 0x6f58, 0xcc => 0x76d8, + 0xcd => 0x78d0, 0xce => 0x76fc, 0xcf => 0x7554, 0xd0 => 0x5224, + 0xd1 => 0x53db, 0xd2 => 0x4e53, 0xd3 => 0x5e9e, 0xd4 => 0x65c1, + 0xd5 => 0x802a, 0xd6 => 0x80d6, 0xd7 => 0x629b, 0xd8 => 0x5486, + 0xd9 => 0x5228, 0xda => 0x70ae, 0xdb => 0x888d, 0xdc => 0x8dd1, + 0xdd => 0x6ce1, 0xde => 0x5478, 0xdf => 0x80da, 0xe0 => 0x57f9, + 0xe1 => 0x88f4, 0xe2 => 0x8d54, 0xe3 => 0x966a, 0xe4 => 0x914d, + 0xe5 => 0x4f69, 0xe6 => 0x6c9b, 0xe7 => 0x55b7, 0xe8 => 0x76c6, + 0xe9 => 0x7830, 0xea => 0x62a8, 0xeb => 0x70f9, 0xec => 0x6f8e, + 0xed => 0x5f6d, 0xee => 0x84ec, 0xef => 0x68da, 0xf0 => 0x787c, + 0xf1 => 0x7bf7, 0xf2 => 0x81a8, 0xf3 => 0x670b, 0xf4 => 0x9e4f, + 0xf5 => 0x6367, 0xf6 => 0x78b0, 0xf7 => 0x576f, 0xf8 => 0x7812, + 0xf9 => 0x9739, 0xfa => 0x6279, 0xfb => 0x62ab, 0xfc => 0x5288, + 0xfd => 0x7435, 0xfe => 0x6bd7, + }, + 0xc6 => { + 0xa1 => 0x5564, 0xa2 => 0x813e, 0xa3 => 0x75b2, 0xa4 => 0x76ae, + 0xa5 => 0x5339, 0xa6 => 0x75de, 0xa7 => 0x50fb, 0xa8 => 0x5c41, + 0xa9 => 0x8b6c, 0xaa => 0x7bc7, 0xab => 0x504f, 0xac => 0x7247, + 0xad => 0x9a97, 0xae => 0x98d8, 0xaf => 0x6f02, 0xb0 => 0x74e2, + 0xb1 => 0x7968, 0xb2 => 0x6487, 0xb3 => 0x77a5, 0xb4 => 0x62fc, + 0xb5 => 0x9891, 0xb6 => 0x8d2b, 0xb7 => 0x54c1, 0xb8 => 0x8058, + 0xb9 => 0x4e52, 0xba => 0x576a, 0xbb => 0x82f9, 0xbc => 0x840d, + 0xbd => 0x5e73, 0xbe => 0x51ed, 0xbf => 0x74f6, 0xc0 => 0x8bc4, + 0xc1 => 0x5c4f, 0xc2 => 0x5761, 0xc3 => 0x6cfc, 0xc4 => 0x9887, + 0xc5 => 0x5a46, 0xc6 => 0x7834, 0xc7 => 0x9b44, 0xc8 => 0x8feb, + 0xc9 => 0x7c95, 0xca => 0x5256, 0xcb => 0x6251, 0xcc => 0x94fa, + 0xcd => 0x4ec6, 0xce => 0x8386, 0xcf => 0x8461, 0xd0 => 0x83e9, + 0xd1 => 0x84b2, 0xd2 => 0x57d4, 0xd3 => 0x6734, 0xd4 => 0x5703, + 0xd5 => 0x666e, 0xd6 => 0x6d66, 0xd7 => 0x8c31, 0xd8 => 0x66dd, + 0xd9 => 0x7011, 0xda => 0x671f, 0xdb => 0x6b3a, 0xdc => 0x6816, + 0xdd => 0x621a, 0xde => 0x59bb, 0xdf => 0x4e03, 0xe0 => 0x51c4, + 0xe1 => 0x6f06, 0xe2 => 0x67d2, 0xe3 => 0x6c8f, 0xe4 => 0x5176, + 0xe5 => 0x68cb, 0xe6 => 0x5947, 0xe7 => 0x6b67, 0xe8 => 0x7566, + 0xe9 => 0x5d0e, 0xea => 0x8110, 0xeb => 0x9f50, 0xec => 0x65d7, + 0xed => 0x7948, 0xee => 0x7941, 0xef => 0x9a91, 0xf0 => 0x8d77, + 0xf1 => 0x5c82, 0xf2 => 0x4e5e, 0xf3 => 0x4f01, 0xf4 => 0x542f, + 0xf5 => 0x5951, 0xf6 => 0x780c, 0xf7 => 0x5668, 0xf8 => 0x6c14, + 0xf9 => 0x8fc4, 0xfa => 0x5f03, 0xfb => 0x6c7d, 0xfc => 0x6ce3, + 0xfd => 0x8bab, 0xfe => 0x6390, + }, + 0xc7 => { + 0xa1 => 0x6070, 0xa2 => 0x6d3d, 0xa3 => 0x7275, 0xa4 => 0x6266, + 0xa5 => 0x948e, 0xa6 => 0x94c5, 0xa7 => 0x5343, 0xa8 => 0x8fc1, + 0xa9 => 0x7b7e, 0xaa => 0x4edf, 0xab => 0x8c26, 0xac => 0x4e7e, + 0xad => 0x9ed4, 0xae => 0x94b1, 0xaf => 0x94b3, 0xb0 => 0x524d, + 0xb1 => 0x6f5c, 0xb2 => 0x9063, 0xb3 => 0x6d45, 0xb4 => 0x8c34, + 0xb5 => 0x5811, 0xb6 => 0x5d4c, 0xb7 => 0x6b20, 0xb8 => 0x6b49, + 0xb9 => 0x67aa, 0xba => 0x545b, 0xbb => 0x8154, 0xbc => 0x7f8c, + 0xbd => 0x5899, 0xbe => 0x8537, 0xbf => 0x5f3a, 0xc0 => 0x62a2, + 0xc1 => 0x6a47, 0xc2 => 0x9539, 0xc3 => 0x6572, 0xc4 => 0x6084, + 0xc5 => 0x6865, 0xc6 => 0x77a7, 0xc7 => 0x4e54, 0xc8 => 0x4fa8, + 0xc9 => 0x5de7, 0xca => 0x9798, 0xcb => 0x64ac, 0xcc => 0x7fd8, + 0xcd => 0x5ced, 0xce => 0x4fcf, 0xcf => 0x7a8d, 0xd0 => 0x5207, + 0xd1 => 0x8304, 0xd2 => 0x4e14, 0xd3 => 0x602f, 0xd4 => 0x7a83, + 0xd5 => 0x94a6, 0xd6 => 0x4fb5, 0xd7 => 0x4eb2, 0xd8 => 0x79e6, + 0xd9 => 0x7434, 0xda => 0x52e4, 0xdb => 0x82b9, 0xdc => 0x64d2, + 0xdd => 0x79bd, 0xde => 0x5bdd, 0xdf => 0x6c81, 0xe0 => 0x9752, + 0xe1 => 0x8f7b, 0xe2 => 0x6c22, 0xe3 => 0x503e, 0xe4 => 0x537f, + 0xe5 => 0x6e05, 0xe6 => 0x64ce, 0xe7 => 0x6674, 0xe8 => 0x6c30, + 0xe9 => 0x60c5, 0xea => 0x9877, 0xeb => 0x8bf7, 0xec => 0x5e86, + 0xed => 0x743c, 0xee => 0x7a77, 0xef => 0x79cb, 0xf0 => 0x4e18, + 0xf1 => 0x90b1, 0xf2 => 0x7403, 0xf3 => 0x6c42, 0xf4 => 0x56da, + 0xf5 => 0x914b, 0xf6 => 0x6cc5, 0xf7 => 0x8d8b, 0xf8 => 0x533a, + 0xf9 => 0x86c6, 0xfa => 0x66f2, 0xfb => 0x8eaf, 0xfc => 0x5c48, + 0xfd => 0x9a71, 0xfe => 0x6e20, + }, + 0xc8 => { + 0xa1 => 0x53d6, 0xa2 => 0x5a36, 0xa3 => 0x9f8b, 0xa4 => 0x8da3, + 0xa5 => 0x53bb, 0xa6 => 0x5708, 0xa7 => 0x98a7, 0xa8 => 0x6743, + 0xa9 => 0x919b, 0xaa => 0x6cc9, 0xab => 0x5168, 0xac => 0x75ca, + 0xad => 0x62f3, 0xae => 0x72ac, 0xaf => 0x5238, 0xb0 => 0x529d, + 0xb1 => 0x7f3a, 0xb2 => 0x7094, 0xb3 => 0x7638, 0xb4 => 0x5374, + 0xb5 => 0x9e4a, 0xb6 => 0x69b7, 0xb7 => 0x786e, 0xb8 => 0x96c0, + 0xb9 => 0x88d9, 0xba => 0x7fa4, 0xbb => 0x7136, 0xbc => 0x71c3, + 0xbd => 0x5189, 0xbe => 0x67d3, 0xbf => 0x74e4, 0xc0 => 0x58e4, + 0xc1 => 0x6518, 0xc2 => 0x56b7, 0xc3 => 0x8ba9, 0xc4 => 0x9976, + 0xc5 => 0x6270, 0xc6 => 0x7ed5, 0xc7 => 0x60f9, 0xc8 => 0x70ed, + 0xc9 => 0x58ec, 0xca => 0x4ec1, 0xcb => 0x4eba, 0xcc => 0x5fcd, + 0xcd => 0x97e7, 0xce => 0x4efb, 0xcf => 0x8ba4, 0xd0 => 0x5203, + 0xd1 => 0x598a, 0xd2 => 0x7eab, 0xd3 => 0x6254, 0xd4 => 0x4ecd, + 0xd5 => 0x65e5, 0xd6 => 0x620e, 0xd7 => 0x8338, 0xd8 => 0x84c9, + 0xd9 => 0x8363, 0xda => 0x878d, 0xdb => 0x7194, 0xdc => 0x6eb6, + 0xdd => 0x5bb9, 0xde => 0x7ed2, 0xdf => 0x5197, 0xe0 => 0x63c9, + 0xe1 => 0x67d4, 0xe2 => 0x8089, 0xe3 => 0x8339, 0xe4 => 0x8815, + 0xe5 => 0x5112, 0xe6 => 0x5b7a, 0xe7 => 0x5982, 0xe8 => 0x8fb1, + 0xe9 => 0x4e73, 0xea => 0x6c5d, 0xeb => 0x5165, 0xec => 0x8925, + 0xed => 0x8f6f, 0xee => 0x962e, 0xef => 0x854a, 0xf0 => 0x745e, + 0xf1 => 0x9510, 0xf2 => 0x95f0, 0xf3 => 0x6da6, 0xf4 => 0x82e5, + 0xf5 => 0x5f31, 0xf6 => 0x6492, 0xf7 => 0x6d12, 0xf8 => 0x8428, + 0xf9 => 0x816e, 0xfa => 0x9cc3, 0xfb => 0x585e, 0xfc => 0x8d5b, + 0xfd => 0x4e09, 0xfe => 0x53c1, + }, + 0xc9 => { + 0xa1 => 0x4f1e, 0xa2 => 0x6563, 0xa3 => 0x6851, 0xa4 => 0x55d3, + 0xa5 => 0x4e27, 0xa6 => 0x6414, 0xa7 => 0x9a9a, 0xa8 => 0x626b, + 0xa9 => 0x5ac2, 0xaa => 0x745f, 0xab => 0x8272, 0xac => 0x6da9, + 0xad => 0x68ee, 0xae => 0x50e7, 0xaf => 0x838e, 0xb0 => 0x7802, + 0xb1 => 0x6740, 0xb2 => 0x5239, 0xb3 => 0x6c99, 0xb4 => 0x7eb1, + 0xb5 => 0x50bb, 0xb6 => 0x5565, 0xb7 => 0x715e, 0xb8 => 0x7b5b, + 0xb9 => 0x6652, 0xba => 0x73ca, 0xbb => 0x82eb, 0xbc => 0x6749, + 0xbd => 0x5c71, 0xbe => 0x5220, 0xbf => 0x717d, 0xc0 => 0x886b, + 0xc1 => 0x95ea, 0xc2 => 0x9655, 0xc3 => 0x64c5, 0xc4 => 0x8d61, + 0xc5 => 0x81b3, 0xc6 => 0x5584, 0xc7 => 0x6c55, 0xc8 => 0x6247, + 0xc9 => 0x7f2e, 0xca => 0x5892, 0xcb => 0x4f24, 0xcc => 0x5546, + 0xcd => 0x8d4f, 0xce => 0x664c, 0xcf => 0x4e0a, 0xd0 => 0x5c1a, + 0xd1 => 0x88f3, 0xd2 => 0x68a2, 0xd3 => 0x634e, 0xd4 => 0x7a0d, + 0xd5 => 0x70e7, 0xd6 => 0x828d, 0xd7 => 0x52fa, 0xd8 => 0x97f6, + 0xd9 => 0x5c11, 0xda => 0x54e8, 0xdb => 0x90b5, 0xdc => 0x7ecd, + 0xdd => 0x5962, 0xde => 0x8d4a, 0xdf => 0x86c7, 0xe0 => 0x820c, + 0xe1 => 0x820d, 0xe2 => 0x8d66, 0xe3 => 0x6444, 0xe4 => 0x5c04, + 0xe5 => 0x6151, 0xe6 => 0x6d89, 0xe7 => 0x793e, 0xe8 => 0x8bbe, + 0xe9 => 0x7837, 0xea => 0x7533, 0xeb => 0x547b, 0xec => 0x4f38, + 0xed => 0x8eab, 0xee => 0x6df1, 0xef => 0x5a20, 0xf0 => 0x7ec5, + 0xf1 => 0x795e, 0xf2 => 0x6c88, 0xf3 => 0x5ba1, 0xf4 => 0x5a76, + 0xf5 => 0x751a, 0xf6 => 0x80be, 0xf7 => 0x614e, 0xf8 => 0x6e17, + 0xf9 => 0x58f0, 0xfa => 0x751f, 0xfb => 0x7525, 0xfc => 0x7272, + 0xfd => 0x5347, 0xfe => 0x7ef3, + }, + 0xca => { + 0xa1 => 0x7701, 0xa2 => 0x76db, 0xa3 => 0x5269, 0xa4 => 0x80dc, + 0xa5 => 0x5723, 0xa6 => 0x5e08, 0xa7 => 0x5931, 0xa8 => 0x72ee, + 0xa9 => 0x65bd, 0xaa => 0x6e7f, 0xab => 0x8bd7, 0xac => 0x5c38, + 0xad => 0x8671, 0xae => 0x5341, 0xaf => 0x77f3, 0xb0 => 0x62fe, + 0xb1 => 0x65f6, 0xb2 => 0x4ec0, 0xb3 => 0x98df, 0xb4 => 0x8680, + 0xb5 => 0x5b9e, 0xb6 => 0x8bc6, 0xb7 => 0x53f2, 0xb8 => 0x77e2, + 0xb9 => 0x4f7f, 0xba => 0x5c4e, 0xbb => 0x9a76, 0xbc => 0x59cb, + 0xbd => 0x5f0f, 0xbe => 0x793a, 0xbf => 0x58eb, 0xc0 => 0x4e16, + 0xc1 => 0x67ff, 0xc2 => 0x4e8b, 0xc3 => 0x62ed, 0xc4 => 0x8a93, + 0xc5 => 0x901d, 0xc6 => 0x52bf, 0xc7 => 0x662f, 0xc8 => 0x55dc, + 0xc9 => 0x566c, 0xca => 0x9002, 0xcb => 0x4ed5, 0xcc => 0x4f8d, + 0xcd => 0x91ca, 0xce => 0x9970, 0xcf => 0x6c0f, 0xd0 => 0x5e02, + 0xd1 => 0x6043, 0xd2 => 0x5ba4, 0xd3 => 0x89c6, 0xd4 => 0x8bd5, + 0xd5 => 0x6536, 0xd6 => 0x624b, 0xd7 => 0x9996, 0xd8 => 0x5b88, + 0xd9 => 0x5bff, 0xda => 0x6388, 0xdb => 0x552e, 0xdc => 0x53d7, + 0xdd => 0x7626, 0xde => 0x517d, 0xdf => 0x852c, 0xe0 => 0x67a2, + 0xe1 => 0x68b3, 0xe2 => 0x6b8a, 0xe3 => 0x6292, 0xe4 => 0x8f93, + 0xe5 => 0x53d4, 0xe6 => 0x8212, 0xe7 => 0x6dd1, 0xe8 => 0x758f, + 0xe9 => 0x4e66, 0xea => 0x8d4e, 0xeb => 0x5b70, 0xec => 0x719f, + 0xed => 0x85af, 0xee => 0x6691, 0xef => 0x66d9, 0xf0 => 0x7f72, + 0xf1 => 0x8700, 0xf2 => 0x9ecd, 0xf3 => 0x9f20, 0xf4 => 0x5c5e, + 0xf5 => 0x672f, 0xf6 => 0x8ff0, 0xf7 => 0x6811, 0xf8 => 0x675f, + 0xf9 => 0x620d, 0xfa => 0x7ad6, 0xfb => 0x5885, 0xfc => 0x5eb6, + 0xfd => 0x6570, 0xfe => 0x6f31, + }, + 0xcb => { + 0xa1 => 0x6055, 0xa2 => 0x5237, 0xa3 => 0x800d, 0xa4 => 0x6454, + 0xa5 => 0x8870, 0xa6 => 0x7529, 0xa7 => 0x5e05, 0xa8 => 0x6813, + 0xa9 => 0x62f4, 0xaa => 0x971c, 0xab => 0x53cc, 0xac => 0x723d, + 0xad => 0x8c01, 0xae => 0x6c34, 0xaf => 0x7761, 0xb0 => 0x7a0e, + 0xb1 => 0x542e, 0xb2 => 0x77ac, 0xb3 => 0x987a, 0xb4 => 0x821c, + 0xb5 => 0x8bf4, 0xb6 => 0x7855, 0xb7 => 0x6714, 0xb8 => 0x70c1, + 0xb9 => 0x65af, 0xba => 0x6495, 0xbb => 0x5636, 0xbc => 0x601d, + 0xbd => 0x79c1, 0xbe => 0x53f8, 0xbf => 0x4e1d, 0xc0 => 0x6b7b, + 0xc1 => 0x8086, 0xc2 => 0x5bfa, 0xc3 => 0x55e3, 0xc4 => 0x56db, + 0xc5 => 0x4f3a, 0xc6 => 0x4f3c, 0xc7 => 0x9972, 0xc8 => 0x5df3, + 0xc9 => 0x677e, 0xca => 0x8038, 0xcb => 0x6002, 0xcc => 0x9882, + 0xcd => 0x9001, 0xce => 0x5b8b, 0xcf => 0x8bbc, 0xd0 => 0x8bf5, + 0xd1 => 0x641c, 0xd2 => 0x8258, 0xd3 => 0x64de, 0xd4 => 0x55fd, + 0xd5 => 0x82cf, 0xd6 => 0x9165, 0xd7 => 0x4fd7, 0xd8 => 0x7d20, + 0xd9 => 0x901f, 0xda => 0x7c9f, 0xdb => 0x50f3, 0xdc => 0x5851, + 0xdd => 0x6eaf, 0xde => 0x5bbf, 0xdf => 0x8bc9, 0xe0 => 0x8083, + 0xe1 => 0x9178, 0xe2 => 0x849c, 0xe3 => 0x7b97, 0xe4 => 0x867d, + 0xe5 => 0x968b, 0xe6 => 0x968f, 0xe7 => 0x7ee5, 0xe8 => 0x9ad3, + 0xe9 => 0x788e, 0xea => 0x5c81, 0xeb => 0x7a57, 0xec => 0x9042, + 0xed => 0x96a7, 0xee => 0x795f, 0xef => 0x5b59, 0xf0 => 0x635f, + 0xf1 => 0x7b0b, 0xf2 => 0x84d1, 0xf3 => 0x68ad, 0xf4 => 0x5506, + 0xf5 => 0x7f29, 0xf6 => 0x7410, 0xf7 => 0x7d22, 0xf8 => 0x9501, + 0xf9 => 0x6240, 0xfa => 0x584c, 0xfb => 0x4ed6, 0xfc => 0x5b83, + 0xfd => 0x5979, 0xfe => 0x5854, + }, + 0xcc => { + 0xa1 => 0x736d, 0xa2 => 0x631e, 0xa3 => 0x8e4b, 0xa4 => 0x8e0f, + 0xa5 => 0x80ce, 0xa6 => 0x82d4, 0xa7 => 0x62ac, 0xa8 => 0x53f0, + 0xa9 => 0x6cf0, 0xaa => 0x915e, 0xab => 0x592a, 0xac => 0x6001, + 0xad => 0x6c70, 0xae => 0x574d, 0xaf => 0x644a, 0xb0 => 0x8d2a, + 0xb1 => 0x762b, 0xb2 => 0x6ee9, 0xb3 => 0x575b, 0xb4 => 0x6a80, + 0xb5 => 0x75f0, 0xb6 => 0x6f6d, 0xb7 => 0x8c2d, 0xb8 => 0x8c08, + 0xb9 => 0x5766, 0xba => 0x6bef, 0xbb => 0x8892, 0xbc => 0x78b3, + 0xbd => 0x63a2, 0xbe => 0x53f9, 0xbf => 0x70ad, 0xc0 => 0x6c64, + 0xc1 => 0x5858, 0xc2 => 0x642a, 0xc3 => 0x5802, 0xc4 => 0x68e0, + 0xc5 => 0x819b, 0xc6 => 0x5510, 0xc7 => 0x7cd6, 0xc8 => 0x5018, + 0xc9 => 0x8eba, 0xca => 0x6dcc, 0xcb => 0x8d9f, 0xcc => 0x70eb, + 0xcd => 0x638f, 0xce => 0x6d9b, 0xcf => 0x6ed4, 0xd0 => 0x7ee6, + 0xd1 => 0x8404, 0xd2 => 0x6843, 0xd3 => 0x9003, 0xd4 => 0x6dd8, + 0xd5 => 0x9676, 0xd6 => 0x8ba8, 0xd7 => 0x5957, 0xd8 => 0x7279, + 0xd9 => 0x85e4, 0xda => 0x817e, 0xdb => 0x75bc, 0xdc => 0x8a8a, + 0xdd => 0x68af, 0xde => 0x5254, 0xdf => 0x8e22, 0xe0 => 0x9511, + 0xe1 => 0x63d0, 0xe2 => 0x9898, 0xe3 => 0x8e44, 0xe4 => 0x557c, + 0xe5 => 0x4f53, 0xe6 => 0x66ff, 0xe7 => 0x568f, 0xe8 => 0x60d5, + 0xe9 => 0x6d95, 0xea => 0x5243, 0xeb => 0x5c49, 0xec => 0x5929, + 0xed => 0x6dfb, 0xee => 0x586b, 0xef => 0x7530, 0xf0 => 0x751c, + 0xf1 => 0x606c, 0xf2 => 0x8214, 0xf3 => 0x8146, 0xf4 => 0x6311, + 0xf5 => 0x6761, 0xf6 => 0x8fe2, 0xf7 => 0x773a, 0xf8 => 0x8df3, + 0xf9 => 0x8d34, 0xfa => 0x94c1, 0xfb => 0x5e16, 0xfc => 0x5385, + 0xfd => 0x542c, 0xfe => 0x70c3, + }, + 0xcd => { + 0xa1 => 0x6c40, 0xa2 => 0x5ef7, 0xa3 => 0x505c, 0xa4 => 0x4ead, + 0xa5 => 0x5ead, 0xa6 => 0x633a, 0xa7 => 0x8247, 0xa8 => 0x901a, + 0xa9 => 0x6850, 0xaa => 0x916e, 0xab => 0x77b3, 0xac => 0x540c, + 0xad => 0x94dc, 0xae => 0x5f64, 0xaf => 0x7ae5, 0xb0 => 0x6876, + 0xb1 => 0x6345, 0xb2 => 0x7b52, 0xb3 => 0x7edf, 0xb4 => 0x75db, + 0xb5 => 0x5077, 0xb6 => 0x6295, 0xb7 => 0x5934, 0xb8 => 0x900f, + 0xb9 => 0x51f8, 0xba => 0x79c3, 0xbb => 0x7a81, 0xbc => 0x56fe, + 0xbd => 0x5f92, 0xbe => 0x9014, 0xbf => 0x6d82, 0xc0 => 0x5c60, + 0xc1 => 0x571f, 0xc2 => 0x5410, 0xc3 => 0x5154, 0xc4 => 0x6e4d, + 0xc5 => 0x56e2, 0xc6 => 0x63a8, 0xc7 => 0x9893, 0xc8 => 0x817f, + 0xc9 => 0x8715, 0xca => 0x892a, 0xcb => 0x9000, 0xcc => 0x541e, + 0xcd => 0x5c6f, 0xce => 0x81c0, 0xcf => 0x62d6, 0xd0 => 0x6258, + 0xd1 => 0x8131, 0xd2 => 0x9e35, 0xd3 => 0x9640, 0xd4 => 0x9a6e, + 0xd5 => 0x9a7c, 0xd6 => 0x692d, 0xd7 => 0x59a5, 0xd8 => 0x62d3, + 0xd9 => 0x553e, 0xda => 0x6316, 0xdb => 0x54c7, 0xdc => 0x86d9, + 0xdd => 0x6d3c, 0xde => 0x5a03, 0xdf => 0x74e6, 0xe0 => 0x889c, + 0xe1 => 0x6b6a, 0xe2 => 0x5916, 0xe3 => 0x8c4c, 0xe4 => 0x5f2f, + 0xe5 => 0x6e7e, 0xe6 => 0x73a9, 0xe7 => 0x987d, 0xe8 => 0x4e38, + 0xe9 => 0x70f7, 0xea => 0x5b8c, 0xeb => 0x7897, 0xec => 0x633d, + 0xed => 0x665a, 0xee => 0x7696, 0xef => 0x60cb, 0xf0 => 0x5b9b, + 0xf1 => 0x5a49, 0xf2 => 0x4e07, 0xf3 => 0x8155, 0xf4 => 0x6c6a, + 0xf5 => 0x738b, 0xf6 => 0x4ea1, 0xf7 => 0x6789, 0xf8 => 0x7f51, + 0xf9 => 0x5f80, 0xfa => 0x65fa, 0xfb => 0x671b, 0xfc => 0x5fd8, + 0xfd => 0x5984, 0xfe => 0x5a01, + }, + 0xce => { + 0xa1 => 0x5dcd, 0xa2 => 0x5fae, 0xa3 => 0x5371, 0xa4 => 0x97e6, + 0xa5 => 0x8fdd, 0xa6 => 0x6845, 0xa7 => 0x56f4, 0xa8 => 0x552f, + 0xa9 => 0x60df, 0xaa => 0x4e3a, 0xab => 0x6f4d, 0xac => 0x7ef4, + 0xad => 0x82c7, 0xae => 0x840e, 0xaf => 0x59d4, 0xb0 => 0x4f1f, + 0xb1 => 0x4f2a, 0xb2 => 0x5c3e, 0xb3 => 0x7eac, 0xb4 => 0x672a, + 0xb5 => 0x851a, 0xb6 => 0x5473, 0xb7 => 0x754f, 0xb8 => 0x80c3, + 0xb9 => 0x5582, 0xba => 0x9b4f, 0xbb => 0x4f4d, 0xbc => 0x6e2d, + 0xbd => 0x8c13, 0xbe => 0x5c09, 0xbf => 0x6170, 0xc0 => 0x536b, + 0xc1 => 0x761f, 0xc2 => 0x6e29, 0xc3 => 0x868a, 0xc4 => 0x6587, + 0xc5 => 0x95fb, 0xc6 => 0x7eb9, 0xc7 => 0x543b, 0xc8 => 0x7a33, + 0xc9 => 0x7d0a, 0xca => 0x95ee, 0xcb => 0x55e1, 0xcc => 0x7fc1, + 0xcd => 0x74ee, 0xce => 0x631d, 0xcf => 0x8717, 0xd0 => 0x6da1, + 0xd1 => 0x7a9d, 0xd2 => 0x6211, 0xd3 => 0x65a1, 0xd4 => 0x5367, + 0xd5 => 0x63e1, 0xd6 => 0x6c83, 0xd7 => 0x5deb, 0xd8 => 0x545c, + 0xd9 => 0x94a8, 0xda => 0x4e4c, 0xdb => 0x6c61, 0xdc => 0x8bec, + 0xdd => 0x5c4b, 0xde => 0x65e0, 0xdf => 0x829c, 0xe0 => 0x68a7, + 0xe1 => 0x543e, 0xe2 => 0x5434, 0xe3 => 0x6bcb, 0xe4 => 0x6b66, + 0xe5 => 0x4e94, 0xe6 => 0x6342, 0xe7 => 0x5348, 0xe8 => 0x821e, + 0xe9 => 0x4f0d, 0xea => 0x4fae, 0xeb => 0x575e, 0xec => 0x620a, + 0xed => 0x96fe, 0xee => 0x6664, 0xef => 0x7269, 0xf0 => 0x52ff, + 0xf1 => 0x52a1, 0xf2 => 0x609f, 0xf3 => 0x8bef, 0xf4 => 0x6614, + 0xf5 => 0x7199, 0xf6 => 0x6790, 0xf7 => 0x897f, 0xf8 => 0x7852, + 0xf9 => 0x77fd, 0xfa => 0x6670, 0xfb => 0x563b, 0xfc => 0x5438, + 0xfd => 0x9521, 0xfe => 0x727a, + }, + 0xcf => { + 0xa1 => 0x7a00, 0xa2 => 0x606f, 0xa3 => 0x5e0c, 0xa4 => 0x6089, + 0xa5 => 0x819d, 0xa6 => 0x5915, 0xa7 => 0x60dc, 0xa8 => 0x7184, + 0xa9 => 0x70ef, 0xaa => 0x6eaa, 0xab => 0x6c50, 0xac => 0x7280, + 0xad => 0x6a84, 0xae => 0x88ad, 0xaf => 0x5e2d, 0xb0 => 0x4e60, + 0xb1 => 0x5ab3, 0xb2 => 0x559c, 0xb3 => 0x94e3, 0xb4 => 0x6d17, + 0xb5 => 0x7cfb, 0xb6 => 0x9699, 0xb7 => 0x620f, 0xb8 => 0x7ec6, + 0xb9 => 0x778e, 0xba => 0x867e, 0xbb => 0x5323, 0xbc => 0x971e, + 0xbd => 0x8f96, 0xbe => 0x6687, 0xbf => 0x5ce1, 0xc0 => 0x4fa0, + 0xc1 => 0x72ed, 0xc2 => 0x4e0b, 0xc3 => 0x53a6, 0xc4 => 0x590f, + 0xc5 => 0x5413, 0xc6 => 0x6380, 0xc7 => 0x9528, 0xc8 => 0x5148, + 0xc9 => 0x4ed9, 0xca => 0x9c9c, 0xcb => 0x7ea4, 0xcc => 0x54b8, + 0xcd => 0x8d24, 0xce => 0x8854, 0xcf => 0x8237, 0xd0 => 0x95f2, + 0xd1 => 0x6d8e, 0xd2 => 0x5f26, 0xd3 => 0x5acc, 0xd4 => 0x663e, + 0xd5 => 0x9669, 0xd6 => 0x73b0, 0xd7 => 0x732e, 0xd8 => 0x53bf, + 0xd9 => 0x817a, 0xda => 0x9985, 0xdb => 0x7fa1, 0xdc => 0x5baa, + 0xdd => 0x9677, 0xde => 0x9650, 0xdf => 0x7ebf, 0xe0 => 0x76f8, + 0xe1 => 0x53a2, 0xe2 => 0x9576, 0xe3 => 0x9999, 0xe4 => 0x7bb1, + 0xe5 => 0x8944, 0xe6 => 0x6e58, 0xe7 => 0x4e61, 0xe8 => 0x7fd4, + 0xe9 => 0x7965, 0xea => 0x8be6, 0xeb => 0x60f3, 0xec => 0x54cd, + 0xed => 0x4eab, 0xee => 0x9879, 0xef => 0x5df7, 0xf0 => 0x6a61, + 0xf1 => 0x50cf, 0xf2 => 0x5411, 0xf3 => 0x8c61, 0xf4 => 0x8427, + 0xf5 => 0x785d, 0xf6 => 0x9704, 0xf7 => 0x524a, 0xf8 => 0x54ee, + 0xf9 => 0x56a3, 0xfa => 0x9500, 0xfb => 0x6d88, 0xfc => 0x5bb5, + 0xfd => 0x6dc6, 0xfe => 0x6653, + }, + 0xd0 => { + 0xa1 => 0x5c0f, 0xa2 => 0x5b5d, 0xa3 => 0x6821, 0xa4 => 0x8096, + 0xa5 => 0x5578, 0xa6 => 0x7b11, 0xa7 => 0x6548, 0xa8 => 0x6954, + 0xa9 => 0x4e9b, 0xaa => 0x6b47, 0xab => 0x874e, 0xac => 0x978b, + 0xad => 0x534f, 0xae => 0x631f, 0xaf => 0x643a, 0xb0 => 0x90aa, + 0xb1 => 0x659c, 0xb2 => 0x80c1, 0xb3 => 0x8c10, 0xb4 => 0x5199, + 0xb5 => 0x68b0, 0xb6 => 0x5378, 0xb7 => 0x87f9, 0xb8 => 0x61c8, + 0xb9 => 0x6cc4, 0xba => 0x6cfb, 0xbb => 0x8c22, 0xbc => 0x5c51, + 0xbd => 0x85aa, 0xbe => 0x82af, 0xbf => 0x950c, 0xc0 => 0x6b23, + 0xc1 => 0x8f9b, 0xc2 => 0x65b0, 0xc3 => 0x5ffb, 0xc4 => 0x5fc3, + 0xc5 => 0x4fe1, 0xc6 => 0x8845, 0xc7 => 0x661f, 0xc8 => 0x8165, + 0xc9 => 0x7329, 0xca => 0x60fa, 0xcb => 0x5174, 0xcc => 0x5211, + 0xcd => 0x578b, 0xce => 0x5f62, 0xcf => 0x90a2, 0xd0 => 0x884c, + 0xd1 => 0x9192, 0xd2 => 0x5e78, 0xd3 => 0x674f, 0xd4 => 0x6027, + 0xd5 => 0x59d3, 0xd6 => 0x5144, 0xd7 => 0x51f6, 0xd8 => 0x80f8, + 0xd9 => 0x5308, 0xda => 0x6c79, 0xdb => 0x96c4, 0xdc => 0x718a, + 0xdd => 0x4f11, 0xde => 0x4fee, 0xdf => 0x7f9e, 0xe0 => 0x673d, + 0xe1 => 0x55c5, 0xe2 => 0x9508, 0xe3 => 0x79c0, 0xe4 => 0x8896, + 0xe5 => 0x7ee3, 0xe6 => 0x589f, 0xe7 => 0x620c, 0xe8 => 0x9700, + 0xe9 => 0x865a, 0xea => 0x5618, 0xeb => 0x987b, 0xec => 0x5f90, + 0xed => 0x8bb8, 0xee => 0x84c4, 0xef => 0x9157, 0xf0 => 0x53d9, + 0xf1 => 0x65ed, 0xf2 => 0x5e8f, 0xf3 => 0x755c, 0xf4 => 0x6064, + 0xf5 => 0x7d6e, 0xf6 => 0x5a7f, 0xf7 => 0x7eea, 0xf8 => 0x7eed, + 0xf9 => 0x8f69, 0xfa => 0x55a7, 0xfb => 0x5ba3, 0xfc => 0x60ac, + 0xfd => 0x65cb, 0xfe => 0x7384, + }, + 0xd1 => { + 0xa1 => 0x9009, 0xa2 => 0x7663, 0xa3 => 0x7729, 0xa4 => 0x7eda, + 0xa5 => 0x9774, 0xa6 => 0x859b, 0xa7 => 0x5b66, 0xa8 => 0x7a74, + 0xa9 => 0x96ea, 0xaa => 0x8840, 0xab => 0x52cb, 0xac => 0x718f, + 0xad => 0x5faa, 0xae => 0x65ec, 0xaf => 0x8be2, 0xb0 => 0x5bfb, + 0xb1 => 0x9a6f, 0xb2 => 0x5de1, 0xb3 => 0x6b89, 0xb4 => 0x6c5b, + 0xb5 => 0x8bad, 0xb6 => 0x8baf, 0xb7 => 0x900a, 0xb8 => 0x8fc5, + 0xb9 => 0x538b, 0xba => 0x62bc, 0xbb => 0x9e26, 0xbc => 0x9e2d, + 0xbd => 0x5440, 0xbe => 0x4e2b, 0xbf => 0x82bd, 0xc0 => 0x7259, + 0xc1 => 0x869c, 0xc2 => 0x5d16, 0xc3 => 0x8859, 0xc4 => 0x6daf, + 0xc5 => 0x96c5, 0xc6 => 0x54d1, 0xc7 => 0x4e9a, 0xc8 => 0x8bb6, + 0xc9 => 0x7109, 0xca => 0x54bd, 0xcb => 0x9609, 0xcc => 0x70df, + 0xcd => 0x6df9, 0xce => 0x76d0, 0xcf => 0x4e25, 0xd0 => 0x7814, + 0xd1 => 0x8712, 0xd2 => 0x5ca9, 0xd3 => 0x5ef6, 0xd4 => 0x8a00, + 0xd5 => 0x989c, 0xd6 => 0x960e, 0xd7 => 0x708e, 0xd8 => 0x6cbf, + 0xd9 => 0x5944, 0xda => 0x63a9, 0xdb => 0x773c, 0xdc => 0x884d, + 0xdd => 0x6f14, 0xde => 0x8273, 0xdf => 0x5830, 0xe0 => 0x71d5, + 0xe1 => 0x538c, 0xe2 => 0x781a, 0xe3 => 0x96c1, 0xe4 => 0x5501, + 0xe5 => 0x5f66, 0xe6 => 0x7130, 0xe7 => 0x5bb4, 0xe8 => 0x8c1a, + 0xe9 => 0x9a8c, 0xea => 0x6b83, 0xeb => 0x592e, 0xec => 0x9e2f, + 0xed => 0x79e7, 0xee => 0x6768, 0xef => 0x626c, 0xf0 => 0x4f6f, + 0xf1 => 0x75a1, 0xf2 => 0x7f8a, 0xf3 => 0x6d0b, 0xf4 => 0x9633, + 0xf5 => 0x6c27, 0xf6 => 0x4ef0, 0xf7 => 0x75d2, 0xf8 => 0x517b, + 0xf9 => 0x6837, 0xfa => 0x6f3e, 0xfb => 0x9080, 0xfc => 0x8170, + 0xfd => 0x5996, 0xfe => 0x7476, + }, + 0xd2 => { + 0xa1 => 0x6447, 0xa2 => 0x5c27, 0xa3 => 0x9065, 0xa4 => 0x7a91, + 0xa5 => 0x8c23, 0xa6 => 0x59da, 0xa7 => 0x54ac, 0xa8 => 0x8200, + 0xa9 => 0x836f, 0xaa => 0x8981, 0xab => 0x8000, 0xac => 0x6930, + 0xad => 0x564e, 0xae => 0x8036, 0xaf => 0x7237, 0xb0 => 0x91ce, + 0xb1 => 0x51b6, 0xb2 => 0x4e5f, 0xb3 => 0x9875, 0xb4 => 0x6396, + 0xb5 => 0x4e1a, 0xb6 => 0x53f6, 0xb7 => 0x66f3, 0xb8 => 0x814b, + 0xb9 => 0x591c, 0xba => 0x6db2, 0xbb => 0x4e00, 0xbc => 0x58f9, + 0xbd => 0x533b, 0xbe => 0x63d6, 0xbf => 0x94f1, 0xc0 => 0x4f9d, + 0xc1 => 0x4f0a, 0xc2 => 0x8863, 0xc3 => 0x9890, 0xc4 => 0x5937, + 0xc5 => 0x9057, 0xc6 => 0x79fb, 0xc7 => 0x4eea, 0xc8 => 0x80f0, + 0xc9 => 0x7591, 0xca => 0x6c82, 0xcb => 0x5b9c, 0xcc => 0x59e8, + 0xcd => 0x5f5d, 0xce => 0x6905, 0xcf => 0x8681, 0xd0 => 0x501a, + 0xd1 => 0x5df2, 0xd2 => 0x4e59, 0xd3 => 0x77e3, 0xd4 => 0x4ee5, + 0xd5 => 0x827a, 0xd6 => 0x6291, 0xd7 => 0x6613, 0xd8 => 0x9091, + 0xd9 => 0x5c79, 0xda => 0x4ebf, 0xdb => 0x5f79, 0xdc => 0x81c6, + 0xdd => 0x9038, 0xde => 0x8084, 0xdf => 0x75ab, 0xe0 => 0x4ea6, + 0xe1 => 0x88d4, 0xe2 => 0x610f, 0xe3 => 0x6bc5, 0xe4 => 0x5fc6, + 0xe5 => 0x4e49, 0xe6 => 0x76ca, 0xe7 => 0x6ea2, 0xe8 => 0x8be3, + 0xe9 => 0x8bae, 0xea => 0x8c0a, 0xeb => 0x8bd1, 0xec => 0x5f02, + 0xed => 0x7ffc, 0xee => 0x7fcc, 0xef => 0x7ece, 0xf0 => 0x8335, + 0xf1 => 0x836b, 0xf2 => 0x56e0, 0xf3 => 0x6bb7, 0xf4 => 0x97f3, + 0xf5 => 0x9634, 0xf6 => 0x59fb, 0xf7 => 0x541f, 0xf8 => 0x94f6, + 0xf9 => 0x6deb, 0xfa => 0x5bc5, 0xfb => 0x996e, 0xfc => 0x5c39, + 0xfd => 0x5f15, 0xfe => 0x9690, + }, + 0xd3 => { + 0xa1 => 0x5370, 0xa2 => 0x82f1, 0xa3 => 0x6a31, 0xa4 => 0x5a74, + 0xa5 => 0x9e70, 0xa6 => 0x5e94, 0xa7 => 0x7f28, 0xa8 => 0x83b9, + 0xa9 => 0x8424, 0xaa => 0x8425, 0xab => 0x8367, 0xac => 0x8747, + 0xad => 0x8fce, 0xae => 0x8d62, 0xaf => 0x76c8, 0xb0 => 0x5f71, + 0xb1 => 0x9896, 0xb2 => 0x786c, 0xb3 => 0x6620, 0xb4 => 0x54df, + 0xb5 => 0x62e5, 0xb6 => 0x4f63, 0xb7 => 0x81c3, 0xb8 => 0x75c8, + 0xb9 => 0x5eb8, 0xba => 0x96cd, 0xbb => 0x8e0a, 0xbc => 0x86f9, + 0xbd => 0x548f, 0xbe => 0x6cf3, 0xbf => 0x6d8c, 0xc0 => 0x6c38, + 0xc1 => 0x607f, 0xc2 => 0x52c7, 0xc3 => 0x7528, 0xc4 => 0x5e7d, + 0xc5 => 0x4f18, 0xc6 => 0x60a0, 0xc7 => 0x5fe7, 0xc8 => 0x5c24, + 0xc9 => 0x7531, 0xca => 0x90ae, 0xcb => 0x94c0, 0xcc => 0x72b9, + 0xcd => 0x6cb9, 0xce => 0x6e38, 0xcf => 0x9149, 0xd0 => 0x6709, + 0xd1 => 0x53cb, 0xd2 => 0x53f3, 0xd3 => 0x4f51, 0xd4 => 0x91c9, + 0xd5 => 0x8bf1, 0xd6 => 0x53c8, 0xd7 => 0x5e7c, 0xd8 => 0x8fc2, + 0xd9 => 0x6de4, 0xda => 0x4e8e, 0xdb => 0x76c2, 0xdc => 0x6986, + 0xdd => 0x865e, 0xde => 0x611a, 0xdf => 0x8206, 0xe0 => 0x4f59, + 0xe1 => 0x4fde, 0xe2 => 0x903e, 0xe3 => 0x9c7c, 0xe4 => 0x6109, + 0xe5 => 0x6e1d, 0xe6 => 0x6e14, 0xe7 => 0x9685, 0xe8 => 0x4e88, + 0xe9 => 0x5a31, 0xea => 0x96e8, 0xeb => 0x4e0e, 0xec => 0x5c7f, + 0xed => 0x79b9, 0xee => 0x5b87, 0xef => 0x8bed, 0xf0 => 0x7fbd, + 0xf1 => 0x7389, 0xf2 => 0x57df, 0xf3 => 0x828b, 0xf4 => 0x90c1, + 0xf5 => 0x5401, 0xf6 => 0x9047, 0xf7 => 0x55bb, 0xf8 => 0x5cea, + 0xf9 => 0x5fa1, 0xfa => 0x6108, 0xfb => 0x6b32, 0xfc => 0x72f1, + 0xfd => 0x80b2, 0xfe => 0x8a89, + }, + 0xd4 => { + 0xa1 => 0x6d74, 0xa2 => 0x5bd3, 0xa3 => 0x88d5, 0xa4 => 0x9884, + 0xa5 => 0x8c6b, 0xa6 => 0x9a6d, 0xa7 => 0x9e33, 0xa8 => 0x6e0a, + 0xa9 => 0x51a4, 0xaa => 0x5143, 0xab => 0x57a3, 0xac => 0x8881, + 0xad => 0x539f, 0xae => 0x63f4, 0xaf => 0x8f95, 0xb0 => 0x56ed, + 0xb1 => 0x5458, 0xb2 => 0x5706, 0xb3 => 0x733f, 0xb4 => 0x6e90, + 0xb5 => 0x7f18, 0xb6 => 0x8fdc, 0xb7 => 0x82d1, 0xb8 => 0x613f, + 0xb9 => 0x6028, 0xba => 0x9662, 0xbb => 0x66f0, 0xbc => 0x7ea6, + 0xbd => 0x8d8a, 0xbe => 0x8dc3, 0xbf => 0x94a5, 0xc0 => 0x5cb3, + 0xc1 => 0x7ca4, 0xc2 => 0x6708, 0xc3 => 0x60a6, 0xc4 => 0x9605, + 0xc5 => 0x8018, 0xc6 => 0x4e91, 0xc7 => 0x90e7, 0xc8 => 0x5300, + 0xc9 => 0x9668, 0xca => 0x5141, 0xcb => 0x8fd0, 0xcc => 0x8574, + 0xcd => 0x915d, 0xce => 0x6655, 0xcf => 0x97f5, 0xd0 => 0x5b55, + 0xd1 => 0x531d, 0xd2 => 0x7838, 0xd3 => 0x6742, 0xd4 => 0x683d, + 0xd5 => 0x54c9, 0xd6 => 0x707e, 0xd7 => 0x5bb0, 0xd8 => 0x8f7d, + 0xd9 => 0x518d, 0xda => 0x5728, 0xdb => 0x54b1, 0xdc => 0x6512, + 0xdd => 0x6682, 0xde => 0x8d5e, 0xdf => 0x8d43, 0xe0 => 0x810f, + 0xe1 => 0x846c, 0xe2 => 0x906d, 0xe3 => 0x7cdf, 0xe4 => 0x51ff, + 0xe5 => 0x85fb, 0xe6 => 0x67a3, 0xe7 => 0x65e9, 0xe8 => 0x6fa1, + 0xe9 => 0x86a4, 0xea => 0x8e81, 0xeb => 0x566a, 0xec => 0x9020, + 0xed => 0x7682, 0xee => 0x7076, 0xef => 0x71e5, 0xf0 => 0x8d23, + 0xf1 => 0x62e9, 0xf2 => 0x5219, 0xf3 => 0x6cfd, 0xf4 => 0x8d3c, + 0xf5 => 0x600e, 0xf6 => 0x589e, 0xf7 => 0x618e, 0xf8 => 0x66fe, + 0xf9 => 0x8d60, 0xfa => 0x624e, 0xfb => 0x55b3, 0xfc => 0x6e23, + 0xfd => 0x672d, 0xfe => 0x8f67, + }, + 0xd5 => { + 0xa1 => 0x94e1, 0xa2 => 0x95f8, 0xa3 => 0x7728, 0xa4 => 0x6805, + 0xa5 => 0x69a8, 0xa6 => 0x548b, 0xa7 => 0x4e4d, 0xa8 => 0x70b8, + 0xa9 => 0x8bc8, 0xaa => 0x6458, 0xab => 0x658b, 0xac => 0x5b85, + 0xad => 0x7a84, 0xae => 0x503a, 0xaf => 0x5be8, 0xb0 => 0x77bb, + 0xb1 => 0x6be1, 0xb2 => 0x8a79, 0xb3 => 0x7c98, 0xb4 => 0x6cbe, + 0xb5 => 0x76cf, 0xb6 => 0x65a9, 0xb7 => 0x8f97, 0xb8 => 0x5d2d, + 0xb9 => 0x5c55, 0xba => 0x8638, 0xbb => 0x6808, 0xbc => 0x5360, + 0xbd => 0x6218, 0xbe => 0x7ad9, 0xbf => 0x6e5b, 0xc0 => 0x7efd, + 0xc1 => 0x6a1f, 0xc2 => 0x7ae0, 0xc3 => 0x5f70, 0xc4 => 0x6f33, + 0xc5 => 0x5f20, 0xc6 => 0x638c, 0xc7 => 0x6da8, 0xc8 => 0x6756, + 0xc9 => 0x4e08, 0xca => 0x5e10, 0xcb => 0x8d26, 0xcc => 0x4ed7, + 0xcd => 0x80c0, 0xce => 0x7634, 0xcf => 0x969c, 0xd0 => 0x62db, + 0xd1 => 0x662d, 0xd2 => 0x627e, 0xd3 => 0x6cbc, 0xd4 => 0x8d75, + 0xd5 => 0x7167, 0xd6 => 0x7f69, 0xd7 => 0x5146, 0xd8 => 0x8087, + 0xd9 => 0x53ec, 0xda => 0x906e, 0xdb => 0x6298, 0xdc => 0x54f2, + 0xdd => 0x86f0, 0xde => 0x8f99, 0xdf => 0x8005, 0xe0 => 0x9517, + 0xe1 => 0x8517, 0xe2 => 0x8fd9, 0xe3 => 0x6d59, 0xe4 => 0x73cd, + 0xe5 => 0x659f, 0xe6 => 0x771f, 0xe7 => 0x7504, 0xe8 => 0x7827, + 0xe9 => 0x81fb, 0xea => 0x8d1e, 0xeb => 0x9488, 0xec => 0x4fa6, + 0xed => 0x6795, 0xee => 0x75b9, 0xef => 0x8bca, 0xf0 => 0x9707, + 0xf1 => 0x632f, 0xf2 => 0x9547, 0xf3 => 0x9635, 0xf4 => 0x84b8, + 0xf5 => 0x6323, 0xf6 => 0x7741, 0xf7 => 0x5f81, 0xf8 => 0x72f0, + 0xf9 => 0x4e89, 0xfa => 0x6014, 0xfb => 0x6574, 0xfc => 0x62ef, + 0xfd => 0x6b63, 0xfe => 0x653f, + }, + 0xd6 => { + 0xa1 => 0x5e27, 0xa2 => 0x75c7, 0xa3 => 0x90d1, 0xa4 => 0x8bc1, + 0xa5 => 0x829d, 0xa6 => 0x679d, 0xa7 => 0x652f, 0xa8 => 0x5431, + 0xa9 => 0x8718, 0xaa => 0x77e5, 0xab => 0x80a2, 0xac => 0x8102, + 0xad => 0x6c41, 0xae => 0x4e4b, 0xaf => 0x7ec7, 0xb0 => 0x804c, + 0xb1 => 0x76f4, 0xb2 => 0x690d, 0xb3 => 0x6b96, 0xb4 => 0x6267, + 0xb5 => 0x503c, 0xb6 => 0x4f84, 0xb7 => 0x5740, 0xb8 => 0x6307, + 0xb9 => 0x6b62, 0xba => 0x8dbe, 0xbb => 0x53ea, 0xbc => 0x65e8, + 0xbd => 0x7eb8, 0xbe => 0x5fd7, 0xbf => 0x631a, 0xc0 => 0x63b7, + 0xc1 => 0x81f3, 0xc2 => 0x81f4, 0xc3 => 0x7f6e, 0xc4 => 0x5e1c, + 0xc5 => 0x5cd9, 0xc6 => 0x5236, 0xc7 => 0x667a, 0xc8 => 0x79e9, + 0xc9 => 0x7a1a, 0xca => 0x8d28, 0xcb => 0x7099, 0xcc => 0x75d4, + 0xcd => 0x6ede, 0xce => 0x6cbb, 0xcf => 0x7a92, 0xd0 => 0x4e2d, + 0xd1 => 0x76c5, 0xd2 => 0x5fe0, 0xd3 => 0x949f, 0xd4 => 0x8877, + 0xd5 => 0x7ec8, 0xd6 => 0x79cd, 0xd7 => 0x80bf, 0xd8 => 0x91cd, + 0xd9 => 0x4ef2, 0xda => 0x4f17, 0xdb => 0x821f, 0xdc => 0x5468, + 0xdd => 0x5dde, 0xde => 0x6d32, 0xdf => 0x8bcc, 0xe0 => 0x7ca5, + 0xe1 => 0x8f74, 0xe2 => 0x8098, 0xe3 => 0x5e1a, 0xe4 => 0x5492, + 0xe5 => 0x76b1, 0xe6 => 0x5b99, 0xe7 => 0x663c, 0xe8 => 0x9aa4, + 0xe9 => 0x73e0, 0xea => 0x682a, 0xeb => 0x86db, 0xec => 0x6731, + 0xed => 0x732a, 0xee => 0x8bf8, 0xef => 0x8bdb, 0xf0 => 0x9010, + 0xf1 => 0x7af9, 0xf2 => 0x70db, 0xf3 => 0x716e, 0xf4 => 0x62c4, + 0xf5 => 0x77a9, 0xf6 => 0x5631, 0xf7 => 0x4e3b, 0xf8 => 0x8457, + 0xf9 => 0x67f1, 0xfa => 0x52a9, 0xfb => 0x86c0, 0xfc => 0x8d2e, + 0xfd => 0x94f8, 0xfe => 0x7b51, + }, + 0xd7 => { + 0xa1 => 0x4f4f, 0xa2 => 0x6ce8, 0xa3 => 0x795d, 0xa4 => 0x9a7b, + 0xa5 => 0x6293, 0xa6 => 0x722a, 0xa7 => 0x62fd, 0xa8 => 0x4e13, + 0xa9 => 0x7816, 0xaa => 0x8f6c, 0xab => 0x64b0, 0xac => 0x8d5a, + 0xad => 0x7bc6, 0xae => 0x6869, 0xaf => 0x5e84, 0xb0 => 0x88c5, + 0xb1 => 0x5986, 0xb2 => 0x649e, 0xb3 => 0x58ee, 0xb4 => 0x72b6, + 0xb5 => 0x690e, 0xb6 => 0x9525, 0xb7 => 0x8ffd, 0xb8 => 0x8d58, + 0xb9 => 0x5760, 0xba => 0x7f00, 0xbb => 0x8c06, 0xbc => 0x51c6, + 0xbd => 0x6349, 0xbe => 0x62d9, 0xbf => 0x5353, 0xc0 => 0x684c, + 0xc1 => 0x7422, 0xc2 => 0x8301, 0xc3 => 0x914c, 0xc4 => 0x5544, + 0xc5 => 0x7740, 0xc6 => 0x707c, 0xc7 => 0x6d4a, 0xc8 => 0x5179, + 0xc9 => 0x54a8, 0xca => 0x8d44, 0xcb => 0x59ff, 0xcc => 0x6ecb, + 0xcd => 0x6dc4, 0xce => 0x5b5c, 0xcf => 0x7d2b, 0xd0 => 0x4ed4, + 0xd1 => 0x7c7d, 0xd2 => 0x6ed3, 0xd3 => 0x5b50, 0xd4 => 0x81ea, + 0xd5 => 0x6e0d, 0xd6 => 0x5b57, 0xd7 => 0x9b03, 0xd8 => 0x68d5, + 0xd9 => 0x8e2a, 0xda => 0x5b97, 0xdb => 0x7efc, 0xdc => 0x603b, + 0xdd => 0x7eb5, 0xde => 0x90b9, 0xdf => 0x8d70, 0xe0 => 0x594f, + 0xe1 => 0x63cd, 0xe2 => 0x79df, 0xe3 => 0x8db3, 0xe4 => 0x5352, + 0xe5 => 0x65cf, 0xe6 => 0x7956, 0xe7 => 0x8bc5, 0xe8 => 0x963b, + 0xe9 => 0x7ec4, 0xea => 0x94bb, 0xeb => 0x7e82, 0xec => 0x5634, + 0xed => 0x9189, 0xee => 0x6700, 0xef => 0x7f6a, 0xf0 => 0x5c0a, + 0xf1 => 0x9075, 0xf2 => 0x6628, 0xf3 => 0x5de6, 0xf4 => 0x4f50, + 0xf5 => 0x67de, 0xf6 => 0x505a, 0xf7 => 0x4f5c, 0xf8 => 0x5750, + 0xf9 => 0x5ea7, + }, + 0xd8 => { + 0xa1 => 0x4e8d, 0xa2 => 0x4e0c, 0xa3 => 0x5140, 0xa4 => 0x4e10, + 0xa5 => 0x5eff, 0xa6 => 0x5345, 0xa7 => 0x4e15, 0xa8 => 0x4e98, + 0xa9 => 0x4e1e, 0xaa => 0x9b32, 0xab => 0x5b6c, 0xac => 0x5669, + 0xad => 0x4e28, 0xae => 0x79ba, 0xaf => 0x4e3f, 0xb0 => 0x5315, + 0xb1 => 0x4e47, 0xb2 => 0x592d, 0xb3 => 0x723b, 0xb4 => 0x536e, + 0xb5 => 0x6c10, 0xb6 => 0x56df, 0xb7 => 0x80e4, 0xb8 => 0x9997, + 0xb9 => 0x6bd3, 0xba => 0x777e, 0xbb => 0x9f17, 0xbc => 0x4e36, + 0xbd => 0x4e9f, 0xbe => 0x9f10, 0xbf => 0x4e5c, 0xc0 => 0x4e69, + 0xc1 => 0x4e93, 0xc2 => 0x8288, 0xc3 => 0x5b5b, 0xc4 => 0x556c, + 0xc5 => 0x560f, 0xc6 => 0x4ec4, 0xc7 => 0x538d, 0xc8 => 0x539d, + 0xc9 => 0x53a3, 0xca => 0x53a5, 0xcb => 0x53ae, 0xcc => 0x9765, + 0xcd => 0x8d5d, 0xce => 0x531a, 0xcf => 0x53f5, 0xd0 => 0x5326, + 0xd1 => 0x532e, 0xd2 => 0x533e, 0xd3 => 0x8d5c, 0xd4 => 0x5366, + 0xd5 => 0x5363, 0xd6 => 0x5202, 0xd7 => 0x5208, 0xd8 => 0x520e, + 0xd9 => 0x522d, 0xda => 0x5233, 0xdb => 0x523f, 0xdc => 0x5240, + 0xdd => 0x524c, 0xde => 0x525e, 0xdf => 0x5261, 0xe0 => 0x525c, + 0xe1 => 0x84af, 0xe2 => 0x527d, 0xe3 => 0x5282, 0xe4 => 0x5281, + 0xe5 => 0x5290, 0xe6 => 0x5293, 0xe7 => 0x5182, 0xe8 => 0x7f54, + 0xe9 => 0x4ebb, 0xea => 0x4ec3, 0xeb => 0x4ec9, 0xec => 0x4ec2, + 0xed => 0x4ee8, 0xee => 0x4ee1, 0xef => 0x4eeb, 0xf0 => 0x4ede, + 0xf1 => 0x4f1b, 0xf2 => 0x4ef3, 0xf3 => 0x4f22, 0xf4 => 0x4f64, + 0xf5 => 0x4ef5, 0xf6 => 0x4f25, 0xf7 => 0x4f27, 0xf8 => 0x4f09, + 0xf9 => 0x4f2b, 0xfa => 0x4f5e, 0xfb => 0x4f67, 0xfc => 0x6538, + 0xfd => 0x4f5a, 0xfe => 0x4f5d, + }, + 0xd9 => { + 0xa1 => 0x4f5f, 0xa2 => 0x4f57, 0xa3 => 0x4f32, 0xa4 => 0x4f3d, + 0xa5 => 0x4f76, 0xa6 => 0x4f74, 0xa7 => 0x4f91, 0xa8 => 0x4f89, + 0xa9 => 0x4f83, 0xaa => 0x4f8f, 0xab => 0x4f7e, 0xac => 0x4f7b, + 0xad => 0x4faa, 0xae => 0x4f7c, 0xaf => 0x4fac, 0xb0 => 0x4f94, + 0xb1 => 0x4fe6, 0xb2 => 0x4fe8, 0xb3 => 0x4fea, 0xb4 => 0x4fc5, + 0xb5 => 0x4fda, 0xb6 => 0x4fe3, 0xb7 => 0x4fdc, 0xb8 => 0x4fd1, + 0xb9 => 0x4fdf, 0xba => 0x4ff8, 0xbb => 0x5029, 0xbc => 0x504c, + 0xbd => 0x4ff3, 0xbe => 0x502c, 0xbf => 0x500f, 0xc0 => 0x502e, + 0xc1 => 0x502d, 0xc2 => 0x4ffe, 0xc3 => 0x501c, 0xc4 => 0x500c, + 0xc5 => 0x5025, 0xc6 => 0x5028, 0xc7 => 0x507e, 0xc8 => 0x5043, + 0xc9 => 0x5055, 0xca => 0x5048, 0xcb => 0x504e, 0xcc => 0x506c, + 0xcd => 0x507b, 0xce => 0x50a5, 0xcf => 0x50a7, 0xd0 => 0x50a9, + 0xd1 => 0x50ba, 0xd2 => 0x50d6, 0xd3 => 0x5106, 0xd4 => 0x50ed, + 0xd5 => 0x50ec, 0xd6 => 0x50e6, 0xd7 => 0x50ee, 0xd8 => 0x5107, + 0xd9 => 0x510b, 0xda => 0x4edd, 0xdb => 0x6c3d, 0xdc => 0x4f58, + 0xdd => 0x4f65, 0xde => 0x4fce, 0xdf => 0x9fa0, 0xe0 => 0x6c46, + 0xe1 => 0x7c74, 0xe2 => 0x516e, 0xe3 => 0x5dfd, 0xe4 => 0x9ec9, + 0xe5 => 0x9998, 0xe6 => 0x5181, 0xe7 => 0x5914, 0xe8 => 0x52f9, + 0xe9 => 0x530d, 0xea => 0x8a07, 0xeb => 0x5310, 0xec => 0x51eb, + 0xed => 0x5919, 0xee => 0x5155, 0xef => 0x4ea0, 0xf0 => 0x5156, + 0xf1 => 0x4eb3, 0xf2 => 0x886e, 0xf3 => 0x88a4, 0xf4 => 0x4eb5, + 0xf5 => 0x8114, 0xf6 => 0x88d2, 0xf7 => 0x7980, 0xf8 => 0x5b34, + 0xf9 => 0x8803, 0xfa => 0x7fb8, 0xfb => 0x51ab, 0xfc => 0x51b1, + 0xfd => 0x51bd, 0xfe => 0x51bc, + }, + 0xda => { + 0xa1 => 0x51c7, 0xa2 => 0x5196, 0xa3 => 0x51a2, 0xa4 => 0x51a5, + 0xa5 => 0x8ba0, 0xa6 => 0x8ba6, 0xa7 => 0x8ba7, 0xa8 => 0x8baa, + 0xa9 => 0x8bb4, 0xaa => 0x8bb5, 0xab => 0x8bb7, 0xac => 0x8bc2, + 0xad => 0x8bc3, 0xae => 0x8bcb, 0xaf => 0x8bcf, 0xb0 => 0x8bce, + 0xb1 => 0x8bd2, 0xb2 => 0x8bd3, 0xb3 => 0x8bd4, 0xb4 => 0x8bd6, + 0xb5 => 0x8bd8, 0xb6 => 0x8bd9, 0xb7 => 0x8bdc, 0xb8 => 0x8bdf, + 0xb9 => 0x8be0, 0xba => 0x8be4, 0xbb => 0x8be8, 0xbc => 0x8be9, + 0xbd => 0x8bee, 0xbe => 0x8bf0, 0xbf => 0x8bf3, 0xc0 => 0x8bf6, + 0xc1 => 0x8bf9, 0xc2 => 0x8bfc, 0xc3 => 0x8bff, 0xc4 => 0x8c00, + 0xc5 => 0x8c02, 0xc6 => 0x8c04, 0xc7 => 0x8c07, 0xc8 => 0x8c0c, + 0xc9 => 0x8c0f, 0xca => 0x8c11, 0xcb => 0x8c12, 0xcc => 0x8c14, + 0xcd => 0x8c15, 0xce => 0x8c16, 0xcf => 0x8c19, 0xd0 => 0x8c1b, + 0xd1 => 0x8c18, 0xd2 => 0x8c1d, 0xd3 => 0x8c1f, 0xd4 => 0x8c20, + 0xd5 => 0x8c21, 0xd6 => 0x8c25, 0xd7 => 0x8c27, 0xd8 => 0x8c2a, + 0xd9 => 0x8c2b, 0xda => 0x8c2e, 0xdb => 0x8c2f, 0xdc => 0x8c32, + 0xdd => 0x8c33, 0xde => 0x8c35, 0xdf => 0x8c36, 0xe0 => 0x5369, + 0xe1 => 0x537a, 0xe2 => 0x961d, 0xe3 => 0x9622, 0xe4 => 0x9621, + 0xe5 => 0x9631, 0xe6 => 0x962a, 0xe7 => 0x963d, 0xe8 => 0x963c, + 0xe9 => 0x9642, 0xea => 0x9649, 0xeb => 0x9654, 0xec => 0x965f, + 0xed => 0x9667, 0xee => 0x966c, 0xef => 0x9672, 0xf0 => 0x9674, + 0xf1 => 0x9688, 0xf2 => 0x968d, 0xf3 => 0x9697, 0xf4 => 0x96b0, + 0xf5 => 0x9097, 0xf6 => 0x909b, 0xf7 => 0x909d, 0xf8 => 0x9099, + 0xf9 => 0x90ac, 0xfa => 0x90a1, 0xfb => 0x90b4, 0xfc => 0x90b3, + 0xfd => 0x90b6, 0xfe => 0x90ba, + }, + 0xdb => { + 0xa1 => 0x90b8, 0xa2 => 0x90b0, 0xa3 => 0x90cf, 0xa4 => 0x90c5, + 0xa5 => 0x90be, 0xa6 => 0x90d0, 0xa7 => 0x90c4, 0xa8 => 0x90c7, + 0xa9 => 0x90d3, 0xaa => 0x90e6, 0xab => 0x90e2, 0xac => 0x90dc, + 0xad => 0x90d7, 0xae => 0x90db, 0xaf => 0x90eb, 0xb0 => 0x90ef, + 0xb1 => 0x90fe, 0xb2 => 0x9104, 0xb3 => 0x9122, 0xb4 => 0x911e, + 0xb5 => 0x9123, 0xb6 => 0x9131, 0xb7 => 0x912f, 0xb8 => 0x9139, + 0xb9 => 0x9143, 0xba => 0x9146, 0xbb => 0x520d, 0xbc => 0x5942, + 0xbd => 0x52a2, 0xbe => 0x52ac, 0xbf => 0x52ad, 0xc0 => 0x52be, + 0xc1 => 0x54ff, 0xc2 => 0x52d0, 0xc3 => 0x52d6, 0xc4 => 0x52f0, + 0xc5 => 0x53df, 0xc6 => 0x71ee, 0xc7 => 0x77cd, 0xc8 => 0x5ef4, + 0xc9 => 0x51f5, 0xca => 0x51fc, 0xcb => 0x9b2f, 0xcc => 0x53b6, + 0xcd => 0x5f01, 0xce => 0x755a, 0xcf => 0x5def, 0xd0 => 0x574c, + 0xd1 => 0x57a9, 0xd2 => 0x57a1, 0xd3 => 0x587e, 0xd4 => 0x58bc, + 0xd5 => 0x58c5, 0xd6 => 0x58d1, 0xd7 => 0x5729, 0xd8 => 0x572c, + 0xd9 => 0x572a, 0xda => 0x5733, 0xdb => 0x5739, 0xdc => 0x572e, + 0xdd => 0x572f, 0xde => 0x575c, 0xdf => 0x573b, 0xe0 => 0x5742, + 0xe1 => 0x5769, 0xe2 => 0x5785, 0xe3 => 0x576b, 0xe4 => 0x5786, + 0xe5 => 0x577c, 0xe6 => 0x577b, 0xe7 => 0x5768, 0xe8 => 0x576d, + 0xe9 => 0x5776, 0xea => 0x5773, 0xeb => 0x57ad, 0xec => 0x57a4, + 0xed => 0x578c, 0xee => 0x57b2, 0xef => 0x57cf, 0xf0 => 0x57a7, + 0xf1 => 0x57b4, 0xf2 => 0x5793, 0xf3 => 0x57a0, 0xf4 => 0x57d5, + 0xf5 => 0x57d8, 0xf6 => 0x57da, 0xf7 => 0x57d9, 0xf8 => 0x57d2, + 0xf9 => 0x57b8, 0xfa => 0x57f4, 0xfb => 0x57ef, 0xfc => 0x57f8, + 0xfd => 0x57e4, 0xfe => 0x57dd, + }, + 0xdc => { + 0xa1 => 0x580b, 0xa2 => 0x580d, 0xa3 => 0x57fd, 0xa4 => 0x57ed, + 0xa5 => 0x5800, 0xa6 => 0x581e, 0xa7 => 0x5819, 0xa8 => 0x5844, + 0xa9 => 0x5820, 0xaa => 0x5865, 0xab => 0x586c, 0xac => 0x5881, + 0xad => 0x5889, 0xae => 0x589a, 0xaf => 0x5880, 0xb0 => 0x99a8, + 0xb1 => 0x9f19, 0xb2 => 0x61ff, 0xb3 => 0x8279, 0xb4 => 0x827d, + 0xb5 => 0x827f, 0xb6 => 0x828f, 0xb7 => 0x828a, 0xb8 => 0x82a8, + 0xb9 => 0x8284, 0xba => 0x828e, 0xbb => 0x8291, 0xbc => 0x8297, + 0xbd => 0x8299, 0xbe => 0x82ab, 0xbf => 0x82b8, 0xc0 => 0x82be, + 0xc1 => 0x82b0, 0xc2 => 0x82c8, 0xc3 => 0x82ca, 0xc4 => 0x82e3, + 0xc5 => 0x8298, 0xc6 => 0x82b7, 0xc7 => 0x82ae, 0xc8 => 0x82cb, + 0xc9 => 0x82cc, 0xca => 0x82c1, 0xcb => 0x82a9, 0xcc => 0x82b4, + 0xcd => 0x82a1, 0xce => 0x82aa, 0xcf => 0x829f, 0xd0 => 0x82c4, + 0xd1 => 0x82ce, 0xd2 => 0x82a4, 0xd3 => 0x82e1, 0xd4 => 0x8309, + 0xd5 => 0x82f7, 0xd6 => 0x82e4, 0xd7 => 0x830f, 0xd8 => 0x8307, + 0xd9 => 0x82dc, 0xda => 0x82f4, 0xdb => 0x82d2, 0xdc => 0x82d8, + 0xdd => 0x830c, 0xde => 0x82fb, 0xdf => 0x82d3, 0xe0 => 0x8311, + 0xe1 => 0x831a, 0xe2 => 0x8306, 0xe3 => 0x8314, 0xe4 => 0x8315, + 0xe5 => 0x82e0, 0xe6 => 0x82d5, 0xe7 => 0x831c, 0xe8 => 0x8351, + 0xe9 => 0x835b, 0xea => 0x835c, 0xeb => 0x8308, 0xec => 0x8392, + 0xed => 0x833c, 0xee => 0x8334, 0xef => 0x8331, 0xf0 => 0x839b, + 0xf1 => 0x835e, 0xf2 => 0x832f, 0xf3 => 0x834f, 0xf4 => 0x8347, + 0xf5 => 0x8343, 0xf6 => 0x835f, 0xf7 => 0x8340, 0xf8 => 0x8317, + 0xf9 => 0x8360, 0xfa => 0x832d, 0xfb => 0x833a, 0xfc => 0x8333, + 0xfd => 0x8366, 0xfe => 0x8365, + }, + 0xdd => { + 0xa1 => 0x8368, 0xa2 => 0x831b, 0xa3 => 0x8369, 0xa4 => 0x836c, + 0xa5 => 0x836a, 0xa6 => 0x836d, 0xa7 => 0x836e, 0xa8 => 0x83b0, + 0xa9 => 0x8378, 0xaa => 0x83b3, 0xab => 0x83b4, 0xac => 0x83a0, + 0xad => 0x83aa, 0xae => 0x8393, 0xaf => 0x839c, 0xb0 => 0x8385, + 0xb1 => 0x837c, 0xb2 => 0x83b6, 0xb3 => 0x83a9, 0xb4 => 0x837d, + 0xb5 => 0x83b8, 0xb6 => 0x837b, 0xb7 => 0x8398, 0xb8 => 0x839e, + 0xb9 => 0x83a8, 0xba => 0x83ba, 0xbb => 0x83bc, 0xbc => 0x83c1, + 0xbd => 0x8401, 0xbe => 0x83e5, 0xbf => 0x83d8, 0xc0 => 0x5807, + 0xc1 => 0x8418, 0xc2 => 0x840b, 0xc3 => 0x83dd, 0xc4 => 0x83fd, + 0xc5 => 0x83d6, 0xc6 => 0x841c, 0xc7 => 0x8438, 0xc8 => 0x8411, + 0xc9 => 0x8406, 0xca => 0x83d4, 0xcb => 0x83df, 0xcc => 0x840f, + 0xcd => 0x8403, 0xce => 0x83f8, 0xcf => 0x83f9, 0xd0 => 0x83ea, + 0xd1 => 0x83c5, 0xd2 => 0x83c0, 0xd3 => 0x8426, 0xd4 => 0x83f0, + 0xd5 => 0x83e1, 0xd6 => 0x845c, 0xd7 => 0x8451, 0xd8 => 0x845a, + 0xd9 => 0x8459, 0xda => 0x8473, 0xdb => 0x8487, 0xdc => 0x8488, + 0xdd => 0x847a, 0xde => 0x8489, 0xdf => 0x8478, 0xe0 => 0x843c, + 0xe1 => 0x8446, 0xe2 => 0x8469, 0xe3 => 0x8476, 0xe4 => 0x848c, + 0xe5 => 0x848e, 0xe6 => 0x8431, 0xe7 => 0x846d, 0xe8 => 0x84c1, + 0xe9 => 0x84cd, 0xea => 0x84d0, 0xeb => 0x84e6, 0xec => 0x84bd, + 0xed => 0x84d3, 0xee => 0x84ca, 0xef => 0x84bf, 0xf0 => 0x84ba, + 0xf1 => 0x84e0, 0xf2 => 0x84a1, 0xf3 => 0x84b9, 0xf4 => 0x84b4, + 0xf5 => 0x8497, 0xf6 => 0x84e5, 0xf7 => 0x84e3, 0xf8 => 0x850c, + 0xf9 => 0x750d, 0xfa => 0x8538, 0xfb => 0x84f0, 0xfc => 0x8539, + 0xfd => 0x851f, 0xfe => 0x853a, + }, + 0xde => { + 0xa1 => 0x8556, 0xa2 => 0x853b, 0xa3 => 0x84ff, 0xa4 => 0x84fc, + 0xa5 => 0x8559, 0xa6 => 0x8548, 0xa7 => 0x8568, 0xa8 => 0x8564, + 0xa9 => 0x855e, 0xaa => 0x857a, 0xab => 0x77a2, 0xac => 0x8543, + 0xad => 0x8572, 0xae => 0x857b, 0xaf => 0x85a4, 0xb0 => 0x85a8, + 0xb1 => 0x8587, 0xb2 => 0x858f, 0xb3 => 0x8579, 0xb4 => 0x85ae, + 0xb5 => 0x859c, 0xb6 => 0x8585, 0xb7 => 0x85b9, 0xb8 => 0x85b7, + 0xb9 => 0x85b0, 0xba => 0x85d3, 0xbb => 0x85c1, 0xbc => 0x85dc, + 0xbd => 0x85ff, 0xbe => 0x8627, 0xbf => 0x8605, 0xc0 => 0x8629, + 0xc1 => 0x8616, 0xc2 => 0x863c, 0xc3 => 0x5efe, 0xc4 => 0x5f08, + 0xc5 => 0x593c, 0xc6 => 0x5941, 0xc7 => 0x8037, 0xc8 => 0x5955, + 0xc9 => 0x595a, 0xca => 0x5958, 0xcb => 0x530f, 0xcc => 0x5c22, + 0xcd => 0x5c25, 0xce => 0x5c2c, 0xcf => 0x5c34, 0xd0 => 0x624c, + 0xd1 => 0x626a, 0xd2 => 0x629f, 0xd3 => 0x62bb, 0xd4 => 0x62ca, + 0xd5 => 0x62da, 0xd6 => 0x62d7, 0xd7 => 0x62ee, 0xd8 => 0x6322, + 0xd9 => 0x62f6, 0xda => 0x6339, 0xdb => 0x634b, 0xdc => 0x6343, + 0xdd => 0x63ad, 0xde => 0x63f6, 0xdf => 0x6371, 0xe0 => 0x637a, + 0xe1 => 0x638e, 0xe2 => 0x63b4, 0xe3 => 0x636d, 0xe4 => 0x63ac, + 0xe5 => 0x638a, 0xe6 => 0x6369, 0xe7 => 0x63ae, 0xe8 => 0x63bc, + 0xe9 => 0x63f2, 0xea => 0x63f8, 0xeb => 0x63e0, 0xec => 0x63ff, + 0xed => 0x63c4, 0xee => 0x63de, 0xef => 0x63ce, 0xf0 => 0x6452, + 0xf1 => 0x63c6, 0xf2 => 0x63be, 0xf3 => 0x6445, 0xf4 => 0x6441, + 0xf5 => 0x640b, 0xf6 => 0x641b, 0xf7 => 0x6420, 0xf8 => 0x640c, + 0xf9 => 0x6426, 0xfa => 0x6421, 0xfb => 0x645e, 0xfc => 0x6484, + 0xfd => 0x646d, 0xfe => 0x6496, + }, + 0xdf => { + 0xa1 => 0x647a, 0xa2 => 0x64b7, 0xa3 => 0x64b8, 0xa4 => 0x6499, + 0xa5 => 0x64ba, 0xa6 => 0x64c0, 0xa7 => 0x64d0, 0xa8 => 0x64d7, + 0xa9 => 0x64e4, 0xaa => 0x64e2, 0xab => 0x6509, 0xac => 0x6525, + 0xad => 0x652e, 0xae => 0x5f0b, 0xaf => 0x5fd2, 0xb0 => 0x7519, + 0xb1 => 0x5f11, 0xb2 => 0x535f, 0xb3 => 0x53f1, 0xb4 => 0x53fd, + 0xb5 => 0x53e9, 0xb6 => 0x53e8, 0xb7 => 0x53fb, 0xb8 => 0x5412, + 0xb9 => 0x5416, 0xba => 0x5406, 0xbb => 0x544b, 0xbc => 0x5452, + 0xbd => 0x5453, 0xbe => 0x5454, 0xbf => 0x5456, 0xc0 => 0x5443, + 0xc1 => 0x5421, 0xc2 => 0x5457, 0xc3 => 0x5459, 0xc4 => 0x5423, + 0xc5 => 0x5432, 0xc6 => 0x5482, 0xc7 => 0x5494, 0xc8 => 0x5477, + 0xc9 => 0x5471, 0xca => 0x5464, 0xcb => 0x549a, 0xcc => 0x549b, + 0xcd => 0x5484, 0xce => 0x5476, 0xcf => 0x5466, 0xd0 => 0x549d, + 0xd1 => 0x54d0, 0xd2 => 0x54ad, 0xd3 => 0x54c2, 0xd4 => 0x54b4, + 0xd5 => 0x54d2, 0xd6 => 0x54a7, 0xd7 => 0x54a6, 0xd8 => 0x54d3, + 0xd9 => 0x54d4, 0xda => 0x5472, 0xdb => 0x54a3, 0xdc => 0x54d5, + 0xdd => 0x54bb, 0xde => 0x54bf, 0xdf => 0x54cc, 0xe0 => 0x54d9, + 0xe1 => 0x54da, 0xe2 => 0x54dc, 0xe3 => 0x54a9, 0xe4 => 0x54aa, + 0xe5 => 0x54a4, 0xe6 => 0x54dd, 0xe7 => 0x54cf, 0xe8 => 0x54de, + 0xe9 => 0x551b, 0xea => 0x54e7, 0xeb => 0x5520, 0xec => 0x54fd, + 0xed => 0x5514, 0xee => 0x54f3, 0xef => 0x5522, 0xf0 => 0x5523, + 0xf1 => 0x550f, 0xf2 => 0x5511, 0xf3 => 0x5527, 0xf4 => 0x552a, + 0xf5 => 0x5567, 0xf6 => 0x558f, 0xf7 => 0x55b5, 0xf8 => 0x5549, + 0xf9 => 0x556d, 0xfa => 0x5541, 0xfb => 0x5555, 0xfc => 0x553f, + 0xfd => 0x5550, 0xfe => 0x553c, + }, + 0xe0 => { + 0xa1 => 0x5537, 0xa2 => 0x5556, 0xa3 => 0x5575, 0xa4 => 0x5576, + 0xa5 => 0x5577, 0xa6 => 0x5533, 0xa7 => 0x5530, 0xa8 => 0x555c, + 0xa9 => 0x558b, 0xaa => 0x55d2, 0xab => 0x5583, 0xac => 0x55b1, + 0xad => 0x55b9, 0xae => 0x5588, 0xaf => 0x5581, 0xb0 => 0x559f, + 0xb1 => 0x557e, 0xb2 => 0x55d6, 0xb3 => 0x5591, 0xb4 => 0x557b, + 0xb5 => 0x55df, 0xb6 => 0x55bd, 0xb7 => 0x55be, 0xb8 => 0x5594, + 0xb9 => 0x5599, 0xba => 0x55ea, 0xbb => 0x55f7, 0xbc => 0x55c9, + 0xbd => 0x561f, 0xbe => 0x55d1, 0xbf => 0x55eb, 0xc0 => 0x55ec, + 0xc1 => 0x55d4, 0xc2 => 0x55e6, 0xc3 => 0x55dd, 0xc4 => 0x55c4, + 0xc5 => 0x55ef, 0xc6 => 0x55e5, 0xc7 => 0x55f2, 0xc8 => 0x55f3, + 0xc9 => 0x55cc, 0xca => 0x55cd, 0xcb => 0x55e8, 0xcc => 0x55f5, + 0xcd => 0x55e4, 0xce => 0x8f94, 0xcf => 0x561e, 0xd0 => 0x5608, + 0xd1 => 0x560c, 0xd2 => 0x5601, 0xd3 => 0x5624, 0xd4 => 0x5623, + 0xd5 => 0x55fe, 0xd6 => 0x5600, 0xd7 => 0x5627, 0xd8 => 0x562d, + 0xd9 => 0x5658, 0xda => 0x5639, 0xdb => 0x5657, 0xdc => 0x562c, + 0xdd => 0x564d, 0xde => 0x5662, 0xdf => 0x5659, 0xe0 => 0x565c, + 0xe1 => 0x564c, 0xe2 => 0x5654, 0xe3 => 0x5686, 0xe4 => 0x5664, + 0xe5 => 0x5671, 0xe6 => 0x566b, 0xe7 => 0x567b, 0xe8 => 0x567c, + 0xe9 => 0x5685, 0xea => 0x5693, 0xeb => 0x56af, 0xec => 0x56d4, + 0xed => 0x56d7, 0xee => 0x56dd, 0xef => 0x56e1, 0xf0 => 0x56f5, + 0xf1 => 0x56eb, 0xf2 => 0x56f9, 0xf3 => 0x56ff, 0xf4 => 0x5704, + 0xf5 => 0x570a, 0xf6 => 0x5709, 0xf7 => 0x571c, 0xf8 => 0x5e0f, + 0xf9 => 0x5e19, 0xfa => 0x5e14, 0xfb => 0x5e11, 0xfc => 0x5e31, + 0xfd => 0x5e3b, 0xfe => 0x5e3c, + }, + 0xe1 => { + 0xa1 => 0x5e37, 0xa2 => 0x5e44, 0xa3 => 0x5e54, 0xa4 => 0x5e5b, + 0xa5 => 0x5e5e, 0xa6 => 0x5e61, 0xa7 => 0x5c8c, 0xa8 => 0x5c7a, + 0xa9 => 0x5c8d, 0xaa => 0x5c90, 0xab => 0x5c96, 0xac => 0x5c88, + 0xad => 0x5c98, 0xae => 0x5c99, 0xaf => 0x5c91, 0xb0 => 0x5c9a, + 0xb1 => 0x5c9c, 0xb2 => 0x5cb5, 0xb3 => 0x5ca2, 0xb4 => 0x5cbd, + 0xb5 => 0x5cac, 0xb6 => 0x5cab, 0xb7 => 0x5cb1, 0xb8 => 0x5ca3, + 0xb9 => 0x5cc1, 0xba => 0x5cb7, 0xbb => 0x5cc4, 0xbc => 0x5cd2, + 0xbd => 0x5ce4, 0xbe => 0x5ccb, 0xbf => 0x5ce5, 0xc0 => 0x5d02, + 0xc1 => 0x5d03, 0xc2 => 0x5d27, 0xc3 => 0x5d26, 0xc4 => 0x5d2e, + 0xc5 => 0x5d24, 0xc6 => 0x5d1e, 0xc7 => 0x5d06, 0xc8 => 0x5d1b, + 0xc9 => 0x5d58, 0xca => 0x5d3e, 0xcb => 0x5d34, 0xcc => 0x5d3d, + 0xcd => 0x5d6c, 0xce => 0x5d5b, 0xcf => 0x5d6f, 0xd0 => 0x5d5d, + 0xd1 => 0x5d6b, 0xd2 => 0x5d4b, 0xd3 => 0x5d4a, 0xd4 => 0x5d69, + 0xd5 => 0x5d74, 0xd6 => 0x5d82, 0xd7 => 0x5d99, 0xd8 => 0x5d9d, + 0xd9 => 0x8c73, 0xda => 0x5db7, 0xdb => 0x5dc5, 0xdc => 0x5f73, + 0xdd => 0x5f77, 0xde => 0x5f82, 0xdf => 0x5f87, 0xe0 => 0x5f89, + 0xe1 => 0x5f8c, 0xe2 => 0x5f95, 0xe3 => 0x5f99, 0xe4 => 0x5f9c, + 0xe5 => 0x5fa8, 0xe6 => 0x5fad, 0xe7 => 0x5fb5, 0xe8 => 0x5fbc, + 0xe9 => 0x8862, 0xea => 0x5f61, 0xeb => 0x72ad, 0xec => 0x72b0, + 0xed => 0x72b4, 0xee => 0x72b7, 0xef => 0x72b8, 0xf0 => 0x72c3, + 0xf1 => 0x72c1, 0xf2 => 0x72ce, 0xf3 => 0x72cd, 0xf4 => 0x72d2, + 0xf5 => 0x72e8, 0xf6 => 0x72ef, 0xf7 => 0x72e9, 0xf8 => 0x72f2, + 0xf9 => 0x72f4, 0xfa => 0x72f7, 0xfb => 0x7301, 0xfc => 0x72f3, + 0xfd => 0x7303, 0xfe => 0x72fa, + }, + 0xe2 => { + 0xa1 => 0x72fb, 0xa2 => 0x7317, 0xa3 => 0x7313, 0xa4 => 0x7321, + 0xa5 => 0x730a, 0xa6 => 0x731e, 0xa7 => 0x731d, 0xa8 => 0x7315, + 0xa9 => 0x7322, 0xaa => 0x7339, 0xab => 0x7325, 0xac => 0x732c, + 0xad => 0x7338, 0xae => 0x7331, 0xaf => 0x7350, 0xb0 => 0x734d, + 0xb1 => 0x7357, 0xb2 => 0x7360, 0xb3 => 0x736c, 0xb4 => 0x736f, + 0xb5 => 0x737e, 0xb6 => 0x821b, 0xb7 => 0x5925, 0xb8 => 0x98e7, + 0xb9 => 0x5924, 0xba => 0x5902, 0xbb => 0x9963, 0xbc => 0x9967, + 0xbd => 0x9968, 0xbe => 0x9969, 0xbf => 0x996a, 0xc0 => 0x996b, + 0xc1 => 0x996c, 0xc2 => 0x9974, 0xc3 => 0x9977, 0xc4 => 0x997d, + 0xc5 => 0x9980, 0xc6 => 0x9984, 0xc7 => 0x9987, 0xc8 => 0x998a, + 0xc9 => 0x998d, 0xca => 0x9990, 0xcb => 0x9991, 0xcc => 0x9993, + 0xcd => 0x9994, 0xce => 0x9995, 0xcf => 0x5e80, 0xd0 => 0x5e91, + 0xd1 => 0x5e8b, 0xd2 => 0x5e96, 0xd3 => 0x5ea5, 0xd4 => 0x5ea0, + 0xd5 => 0x5eb9, 0xd6 => 0x5eb5, 0xd7 => 0x5ebe, 0xd8 => 0x5eb3, + 0xd9 => 0x8d53, 0xda => 0x5ed2, 0xdb => 0x5ed1, 0xdc => 0x5edb, + 0xdd => 0x5ee8, 0xde => 0x5eea, 0xdf => 0x81ba, 0xe0 => 0x5fc4, + 0xe1 => 0x5fc9, 0xe2 => 0x5fd6, 0xe3 => 0x5fcf, 0xe4 => 0x6003, + 0xe5 => 0x5fee, 0xe6 => 0x6004, 0xe7 => 0x5fe1, 0xe8 => 0x5fe4, + 0xe9 => 0x5ffe, 0xea => 0x6005, 0xeb => 0x6006, 0xec => 0x5fea, + 0xed => 0x5fed, 0xee => 0x5ff8, 0xef => 0x6019, 0xf0 => 0x6035, + 0xf1 => 0x6026, 0xf2 => 0x601b, 0xf3 => 0x600f, 0xf4 => 0x600d, + 0xf5 => 0x6029, 0xf6 => 0x602b, 0xf7 => 0x600a, 0xf8 => 0x603f, + 0xf9 => 0x6021, 0xfa => 0x6078, 0xfb => 0x6079, 0xfc => 0x607b, + 0xfd => 0x607a, 0xfe => 0x6042, + }, + 0xe3 => { + 0xa1 => 0x606a, 0xa2 => 0x607d, 0xa3 => 0x6096, 0xa4 => 0x609a, + 0xa5 => 0x60ad, 0xa6 => 0x609d, 0xa7 => 0x6083, 0xa8 => 0x6092, + 0xa9 => 0x608c, 0xaa => 0x609b, 0xab => 0x60ec, 0xac => 0x60bb, + 0xad => 0x60b1, 0xae => 0x60dd, 0xaf => 0x60d8, 0xb0 => 0x60c6, + 0xb1 => 0x60da, 0xb2 => 0x60b4, 0xb3 => 0x6120, 0xb4 => 0x6126, + 0xb5 => 0x6115, 0xb6 => 0x6123, 0xb7 => 0x60f4, 0xb8 => 0x6100, + 0xb9 => 0x610e, 0xba => 0x612b, 0xbb => 0x614a, 0xbc => 0x6175, + 0xbd => 0x61ac, 0xbe => 0x6194, 0xbf => 0x61a7, 0xc0 => 0x61b7, + 0xc1 => 0x61d4, 0xc2 => 0x61f5, 0xc3 => 0x5fdd, 0xc4 => 0x96b3, + 0xc5 => 0x95e9, 0xc6 => 0x95eb, 0xc7 => 0x95f1, 0xc8 => 0x95f3, + 0xc9 => 0x95f5, 0xca => 0x95f6, 0xcb => 0x95fc, 0xcc => 0x95fe, + 0xcd => 0x9603, 0xce => 0x9604, 0xcf => 0x9606, 0xd0 => 0x9608, + 0xd1 => 0x960a, 0xd2 => 0x960b, 0xd3 => 0x960c, 0xd4 => 0x960d, + 0xd5 => 0x960f, 0xd6 => 0x9612, 0xd7 => 0x9615, 0xd8 => 0x9616, + 0xd9 => 0x9617, 0xda => 0x9619, 0xdb => 0x961a, 0xdc => 0x4e2c, + 0xdd => 0x723f, 0xde => 0x6215, 0xdf => 0x6c35, 0xe0 => 0x6c54, + 0xe1 => 0x6c5c, 0xe2 => 0x6c4a, 0xe3 => 0x6ca3, 0xe4 => 0x6c85, + 0xe5 => 0x6c90, 0xe6 => 0x6c94, 0xe7 => 0x6c8c, 0xe8 => 0x6c68, + 0xe9 => 0x6c69, 0xea => 0x6c74, 0xeb => 0x6c76, 0xec => 0x6c86, + 0xed => 0x6ca9, 0xee => 0x6cd0, 0xef => 0x6cd4, 0xf0 => 0x6cad, + 0xf1 => 0x6cf7, 0xf2 => 0x6cf8, 0xf3 => 0x6cf1, 0xf4 => 0x6cd7, + 0xf5 => 0x6cb2, 0xf6 => 0x6ce0, 0xf7 => 0x6cd6, 0xf8 => 0x6cfa, + 0xf9 => 0x6ceb, 0xfa => 0x6cee, 0xfb => 0x6cb1, 0xfc => 0x6cd3, + 0xfd => 0x6cef, 0xfe => 0x6cfe, + }, + 0xe4 => { + 0xa1 => 0x6d39, 0xa2 => 0x6d27, 0xa3 => 0x6d0c, 0xa4 => 0x6d43, + 0xa5 => 0x6d48, 0xa6 => 0x6d07, 0xa7 => 0x6d04, 0xa8 => 0x6d19, + 0xa9 => 0x6d0e, 0xaa => 0x6d2b, 0xab => 0x6d4d, 0xac => 0x6d2e, + 0xad => 0x6d35, 0xae => 0x6d1a, 0xaf => 0x6d4f, 0xb0 => 0x6d52, + 0xb1 => 0x6d54, 0xb2 => 0x6d33, 0xb3 => 0x6d91, 0xb4 => 0x6d6f, + 0xb5 => 0x6d9e, 0xb6 => 0x6da0, 0xb7 => 0x6d5e, 0xb8 => 0x6d93, + 0xb9 => 0x6d94, 0xba => 0x6d5c, 0xbb => 0x6d60, 0xbc => 0x6d7c, + 0xbd => 0x6d63, 0xbe => 0x6e1a, 0xbf => 0x6dc7, 0xc0 => 0x6dc5, + 0xc1 => 0x6dde, 0xc2 => 0x6e0e, 0xc3 => 0x6dbf, 0xc4 => 0x6de0, + 0xc5 => 0x6e11, 0xc6 => 0x6de6, 0xc7 => 0x6ddd, 0xc8 => 0x6dd9, + 0xc9 => 0x6e16, 0xca => 0x6dab, 0xcb => 0x6e0c, 0xcc => 0x6dae, + 0xcd => 0x6e2b, 0xce => 0x6e6e, 0xcf => 0x6e4e, 0xd0 => 0x6e6b, + 0xd1 => 0x6eb2, 0xd2 => 0x6e5f, 0xd3 => 0x6e86, 0xd4 => 0x6e53, + 0xd5 => 0x6e54, 0xd6 => 0x6e32, 0xd7 => 0x6e25, 0xd8 => 0x6e44, + 0xd9 => 0x6edf, 0xda => 0x6eb1, 0xdb => 0x6e98, 0xdc => 0x6ee0, + 0xdd => 0x6f2d, 0xde => 0x6ee2, 0xdf => 0x6ea5, 0xe0 => 0x6ea7, + 0xe1 => 0x6ebd, 0xe2 => 0x6ebb, 0xe3 => 0x6eb7, 0xe4 => 0x6ed7, + 0xe5 => 0x6eb4, 0xe6 => 0x6ecf, 0xe7 => 0x6e8f, 0xe8 => 0x6ec2, + 0xe9 => 0x6e9f, 0xea => 0x6f62, 0xeb => 0x6f46, 0xec => 0x6f47, + 0xed => 0x6f24, 0xee => 0x6f15, 0xef => 0x6ef9, 0xf0 => 0x6f2f, + 0xf1 => 0x6f36, 0xf2 => 0x6f4b, 0xf3 => 0x6f74, 0xf4 => 0x6f2a, + 0xf5 => 0x6f09, 0xf6 => 0x6f29, 0xf7 => 0x6f89, 0xf8 => 0x6f8d, + 0xf9 => 0x6f8c, 0xfa => 0x6f78, 0xfb => 0x6f72, 0xfc => 0x6f7c, + 0xfd => 0x6f7a, 0xfe => 0x6fd1, + }, + 0xe5 => { + 0xa1 => 0x6fc9, 0xa2 => 0x6fa7, 0xa3 => 0x6fb9, 0xa4 => 0x6fb6, + 0xa5 => 0x6fc2, 0xa6 => 0x6fe1, 0xa7 => 0x6fee, 0xa8 => 0x6fde, + 0xa9 => 0x6fe0, 0xaa => 0x6fef, 0xab => 0x701a, 0xac => 0x7023, + 0xad => 0x701b, 0xae => 0x7039, 0xaf => 0x7035, 0xb0 => 0x704f, + 0xb1 => 0x705e, 0xb2 => 0x5b80, 0xb3 => 0x5b84, 0xb4 => 0x5b95, + 0xb5 => 0x5b93, 0xb6 => 0x5ba5, 0xb7 => 0x5bb8, 0xb8 => 0x752f, + 0xb9 => 0x9a9e, 0xba => 0x6434, 0xbb => 0x5be4, 0xbc => 0x5bee, + 0xbd => 0x8930, 0xbe => 0x5bf0, 0xbf => 0x8e47, 0xc0 => 0x8b07, + 0xc1 => 0x8fb6, 0xc2 => 0x8fd3, 0xc3 => 0x8fd5, 0xc4 => 0x8fe5, + 0xc5 => 0x8fee, 0xc6 => 0x8fe4, 0xc7 => 0x8fe9, 0xc8 => 0x8fe6, + 0xc9 => 0x8ff3, 0xca => 0x8fe8, 0xcb => 0x9005, 0xcc => 0x9004, + 0xcd => 0x900b, 0xce => 0x9026, 0xcf => 0x9011, 0xd0 => 0x900d, + 0xd1 => 0x9016, 0xd2 => 0x9021, 0xd3 => 0x9035, 0xd4 => 0x9036, + 0xd5 => 0x902d, 0xd6 => 0x902f, 0xd7 => 0x9044, 0xd8 => 0x9051, + 0xd9 => 0x9052, 0xda => 0x9050, 0xdb => 0x9068, 0xdc => 0x9058, + 0xdd => 0x9062, 0xde => 0x905b, 0xdf => 0x66b9, 0xe0 => 0x9074, + 0xe1 => 0x907d, 0xe2 => 0x9082, 0xe3 => 0x9088, 0xe4 => 0x9083, + 0xe5 => 0x908b, 0xe6 => 0x5f50, 0xe7 => 0x5f57, 0xe8 => 0x5f56, + 0xe9 => 0x5f58, 0xea => 0x5c3b, 0xeb => 0x54ab, 0xec => 0x5c50, + 0xed => 0x5c59, 0xee => 0x5b71, 0xef => 0x5c63, 0xf0 => 0x5c66, + 0xf1 => 0x7fbc, 0xf2 => 0x5f2a, 0xf3 => 0x5f29, 0xf4 => 0x5f2d, + 0xf5 => 0x8274, 0xf6 => 0x5f3c, 0xf7 => 0x9b3b, 0xf8 => 0x5c6e, + 0xf9 => 0x5981, 0xfa => 0x5983, 0xfb => 0x598d, 0xfc => 0x59a9, + 0xfd => 0x59aa, 0xfe => 0x59a3, + }, + 0xe6 => { + 0xa1 => 0x5997, 0xa2 => 0x59ca, 0xa3 => 0x59ab, 0xa4 => 0x599e, + 0xa5 => 0x59a4, 0xa6 => 0x59d2, 0xa7 => 0x59b2, 0xa8 => 0x59af, + 0xa9 => 0x59d7, 0xaa => 0x59be, 0xab => 0x5a05, 0xac => 0x5a06, + 0xad => 0x59dd, 0xae => 0x5a08, 0xaf => 0x59e3, 0xb0 => 0x59d8, + 0xb1 => 0x59f9, 0xb2 => 0x5a0c, 0xb3 => 0x5a09, 0xb4 => 0x5a32, + 0xb5 => 0x5a34, 0xb6 => 0x5a11, 0xb7 => 0x5a23, 0xb8 => 0x5a13, + 0xb9 => 0x5a40, 0xba => 0x5a67, 0xbb => 0x5a4a, 0xbc => 0x5a55, + 0xbd => 0x5a3c, 0xbe => 0x5a62, 0xbf => 0x5a75, 0xc0 => 0x80ec, + 0xc1 => 0x5aaa, 0xc2 => 0x5a9b, 0xc3 => 0x5a77, 0xc4 => 0x5a7a, + 0xc5 => 0x5abe, 0xc6 => 0x5aeb, 0xc7 => 0x5ab2, 0xc8 => 0x5ad2, + 0xc9 => 0x5ad4, 0xca => 0x5ab8, 0xcb => 0x5ae0, 0xcc => 0x5ae3, + 0xcd => 0x5af1, 0xce => 0x5ad6, 0xcf => 0x5ae6, 0xd0 => 0x5ad8, + 0xd1 => 0x5adc, 0xd2 => 0x5b09, 0xd3 => 0x5b17, 0xd4 => 0x5b16, + 0xd5 => 0x5b32, 0xd6 => 0x5b37, 0xd7 => 0x5b40, 0xd8 => 0x5c15, + 0xd9 => 0x5c1c, 0xda => 0x5b5a, 0xdb => 0x5b65, 0xdc => 0x5b73, + 0xdd => 0x5b51, 0xde => 0x5b53, 0xdf => 0x5b62, 0xe0 => 0x9a75, + 0xe1 => 0x9a77, 0xe2 => 0x9a78, 0xe3 => 0x9a7a, 0xe4 => 0x9a7f, + 0xe5 => 0x9a7d, 0xe6 => 0x9a80, 0xe7 => 0x9a81, 0xe8 => 0x9a85, + 0xe9 => 0x9a88, 0xea => 0x9a8a, 0xeb => 0x9a90, 0xec => 0x9a92, + 0xed => 0x9a93, 0xee => 0x9a96, 0xef => 0x9a98, 0xf0 => 0x9a9b, + 0xf1 => 0x9a9c, 0xf2 => 0x9a9d, 0xf3 => 0x9a9f, 0xf4 => 0x9aa0, + 0xf5 => 0x9aa2, 0xf6 => 0x9aa3, 0xf7 => 0x9aa5, 0xf8 => 0x9aa7, + 0xf9 => 0x7e9f, 0xfa => 0x7ea1, 0xfb => 0x7ea3, 0xfc => 0x7ea5, + 0xfd => 0x7ea8, 0xfe => 0x7ea9, + }, + 0xe7 => { + 0xa1 => 0x7ead, 0xa2 => 0x7eb0, 0xa3 => 0x7ebe, 0xa4 => 0x7ec0, + 0xa5 => 0x7ec1, 0xa6 => 0x7ec2, 0xa7 => 0x7ec9, 0xa8 => 0x7ecb, + 0xa9 => 0x7ecc, 0xaa => 0x7ed0, 0xab => 0x7ed4, 0xac => 0x7ed7, + 0xad => 0x7edb, 0xae => 0x7ee0, 0xaf => 0x7ee1, 0xb0 => 0x7ee8, + 0xb1 => 0x7eeb, 0xb2 => 0x7eee, 0xb3 => 0x7eef, 0xb4 => 0x7ef1, + 0xb5 => 0x7ef2, 0xb6 => 0x7f0d, 0xb7 => 0x7ef6, 0xb8 => 0x7efa, + 0xb9 => 0x7efb, 0xba => 0x7efe, 0xbb => 0x7f01, 0xbc => 0x7f02, + 0xbd => 0x7f03, 0xbe => 0x7f07, 0xbf => 0x7f08, 0xc0 => 0x7f0b, + 0xc1 => 0x7f0c, 0xc2 => 0x7f0f, 0xc3 => 0x7f11, 0xc4 => 0x7f12, + 0xc5 => 0x7f17, 0xc6 => 0x7f19, 0xc7 => 0x7f1c, 0xc8 => 0x7f1b, + 0xc9 => 0x7f1f, 0xca => 0x7f21, 0xcb => 0x7f22, 0xcc => 0x7f23, + 0xcd => 0x7f24, 0xce => 0x7f25, 0xcf => 0x7f26, 0xd0 => 0x7f27, + 0xd1 => 0x7f2a, 0xd2 => 0x7f2b, 0xd3 => 0x7f2c, 0xd4 => 0x7f2d, + 0xd5 => 0x7f2f, 0xd6 => 0x7f30, 0xd7 => 0x7f31, 0xd8 => 0x7f32, + 0xd9 => 0x7f33, 0xda => 0x7f35, 0xdb => 0x5e7a, 0xdc => 0x757f, + 0xdd => 0x5ddb, 0xde => 0x753e, 0xdf => 0x9095, 0xe0 => 0x738e, + 0xe1 => 0x7391, 0xe2 => 0x73ae, 0xe3 => 0x73a2, 0xe4 => 0x739f, + 0xe5 => 0x73cf, 0xe6 => 0x73c2, 0xe7 => 0x73d1, 0xe8 => 0x73b7, + 0xe9 => 0x73b3, 0xea => 0x73c0, 0xeb => 0x73c9, 0xec => 0x73c8, + 0xed => 0x73e5, 0xee => 0x73d9, 0xef => 0x987c, 0xf0 => 0x740a, + 0xf1 => 0x73e9, 0xf2 => 0x73e7, 0xf3 => 0x73de, 0xf4 => 0x73ba, + 0xf5 => 0x73f2, 0xf6 => 0x740f, 0xf7 => 0x742a, 0xf8 => 0x745b, + 0xf9 => 0x7426, 0xfa => 0x7425, 0xfb => 0x7428, 0xfc => 0x7430, + 0xfd => 0x742e, 0xfe => 0x742c, + }, + 0xe8 => { + 0xa1 => 0x741b, 0xa2 => 0x741a, 0xa3 => 0x7441, 0xa4 => 0x745c, + 0xa5 => 0x7457, 0xa6 => 0x7455, 0xa7 => 0x7459, 0xa8 => 0x7477, + 0xa9 => 0x746d, 0xaa => 0x747e, 0xab => 0x749c, 0xac => 0x748e, + 0xad => 0x7480, 0xae => 0x7481, 0xaf => 0x7487, 0xb0 => 0x748b, + 0xb1 => 0x749e, 0xb2 => 0x74a8, 0xb3 => 0x74a9, 0xb4 => 0x7490, + 0xb5 => 0x74a7, 0xb6 => 0x74d2, 0xb7 => 0x74ba, 0xb8 => 0x97ea, + 0xb9 => 0x97eb, 0xba => 0x97ec, 0xbb => 0x674c, 0xbc => 0x6753, + 0xbd => 0x675e, 0xbe => 0x6748, 0xbf => 0x6769, 0xc0 => 0x67a5, + 0xc1 => 0x6787, 0xc2 => 0x676a, 0xc3 => 0x6773, 0xc4 => 0x6798, + 0xc5 => 0x67a7, 0xc6 => 0x6775, 0xc7 => 0x67a8, 0xc8 => 0x679e, + 0xc9 => 0x67ad, 0xca => 0x678b, 0xcb => 0x6777, 0xcc => 0x677c, + 0xcd => 0x67f0, 0xce => 0x6809, 0xcf => 0x67d8, 0xd0 => 0x680a, + 0xd1 => 0x67e9, 0xd2 => 0x67b0, 0xd3 => 0x680c, 0xd4 => 0x67d9, + 0xd5 => 0x67b5, 0xd6 => 0x67da, 0xd7 => 0x67b3, 0xd8 => 0x67dd, + 0xd9 => 0x6800, 0xda => 0x67c3, 0xdb => 0x67b8, 0xdc => 0x67e2, + 0xdd => 0x680e, 0xde => 0x67c1, 0xdf => 0x67fd, 0xe0 => 0x6832, + 0xe1 => 0x6833, 0xe2 => 0x6860, 0xe3 => 0x6861, 0xe4 => 0x684e, + 0xe5 => 0x6862, 0xe6 => 0x6844, 0xe7 => 0x6864, 0xe8 => 0x6883, + 0xe9 => 0x681d, 0xea => 0x6855, 0xeb => 0x6866, 0xec => 0x6841, + 0xed => 0x6867, 0xee => 0x6840, 0xef => 0x683e, 0xf0 => 0x684a, + 0xf1 => 0x6849, 0xf2 => 0x6829, 0xf3 => 0x68b5, 0xf4 => 0x688f, + 0xf5 => 0x6874, 0xf6 => 0x6877, 0xf7 => 0x6893, 0xf8 => 0x686b, + 0xf9 => 0x68c2, 0xfa => 0x696e, 0xfb => 0x68fc, 0xfc => 0x691f, + 0xfd => 0x6920, 0xfe => 0x68f9, + }, + 0xe9 => { + 0xa1 => 0x6924, 0xa2 => 0x68f0, 0xa3 => 0x690b, 0xa4 => 0x6901, + 0xa5 => 0x6957, 0xa6 => 0x68e3, 0xa7 => 0x6910, 0xa8 => 0x6971, + 0xa9 => 0x6939, 0xaa => 0x6960, 0xab => 0x6942, 0xac => 0x695d, + 0xad => 0x6984, 0xae => 0x696b, 0xaf => 0x6980, 0xb0 => 0x6998, + 0xb1 => 0x6978, 0xb2 => 0x6934, 0xb3 => 0x69cc, 0xb4 => 0x6987, + 0xb5 => 0x6988, 0xb6 => 0x69ce, 0xb7 => 0x6989, 0xb8 => 0x6966, + 0xb9 => 0x6963, 0xba => 0x6979, 0xbb => 0x699b, 0xbc => 0x69a7, + 0xbd => 0x69bb, 0xbe => 0x69ab, 0xbf => 0x69ad, 0xc0 => 0x69d4, + 0xc1 => 0x69b1, 0xc2 => 0x69c1, 0xc3 => 0x69ca, 0xc4 => 0x69df, + 0xc5 => 0x6995, 0xc6 => 0x69e0, 0xc7 => 0x698d, 0xc8 => 0x69ff, + 0xc9 => 0x6a2f, 0xca => 0x69ed, 0xcb => 0x6a17, 0xcc => 0x6a18, + 0xcd => 0x6a65, 0xce => 0x69f2, 0xcf => 0x6a44, 0xd0 => 0x6a3e, + 0xd1 => 0x6aa0, 0xd2 => 0x6a50, 0xd3 => 0x6a5b, 0xd4 => 0x6a35, + 0xd5 => 0x6a8e, 0xd6 => 0x6a79, 0xd7 => 0x6a3d, 0xd8 => 0x6a28, + 0xd9 => 0x6a58, 0xda => 0x6a7c, 0xdb => 0x6a91, 0xdc => 0x6a90, + 0xdd => 0x6aa9, 0xde => 0x6a97, 0xdf => 0x6aab, 0xe0 => 0x7337, + 0xe1 => 0x7352, 0xe2 => 0x6b81, 0xe3 => 0x6b82, 0xe4 => 0x6b87, + 0xe5 => 0x6b84, 0xe6 => 0x6b92, 0xe7 => 0x6b93, 0xe8 => 0x6b8d, + 0xe9 => 0x6b9a, 0xea => 0x6b9b, 0xeb => 0x6ba1, 0xec => 0x6baa, + 0xed => 0x8f6b, 0xee => 0x8f6d, 0xef => 0x8f71, 0xf0 => 0x8f72, + 0xf1 => 0x8f73, 0xf2 => 0x8f75, 0xf3 => 0x8f76, 0xf4 => 0x8f78, + 0xf5 => 0x8f77, 0xf6 => 0x8f79, 0xf7 => 0x8f7a, 0xf8 => 0x8f7c, + 0xf9 => 0x8f7e, 0xfa => 0x8f81, 0xfb => 0x8f82, 0xfc => 0x8f84, + 0xfd => 0x8f87, 0xfe => 0x8f8b, + }, + 0xea => { + 0xa1 => 0x8f8d, 0xa2 => 0x8f8e, 0xa3 => 0x8f8f, 0xa4 => 0x8f98, + 0xa5 => 0x8f9a, 0xa6 => 0x8ece, 0xa7 => 0x620b, 0xa8 => 0x6217, + 0xa9 => 0x621b, 0xaa => 0x621f, 0xab => 0x6222, 0xac => 0x6221, + 0xad => 0x6225, 0xae => 0x6224, 0xaf => 0x622c, 0xb0 => 0x81e7, + 0xb1 => 0x74ef, 0xb2 => 0x74f4, 0xb3 => 0x74ff, 0xb4 => 0x750f, + 0xb5 => 0x7511, 0xb6 => 0x7513, 0xb7 => 0x6534, 0xb8 => 0x65ee, + 0xb9 => 0x65ef, 0xba => 0x65f0, 0xbb => 0x660a, 0xbc => 0x6619, + 0xbd => 0x6772, 0xbe => 0x6603, 0xbf => 0x6615, 0xc0 => 0x6600, + 0xc1 => 0x7085, 0xc2 => 0x66f7, 0xc3 => 0x661d, 0xc4 => 0x6634, + 0xc5 => 0x6631, 0xc6 => 0x6636, 0xc7 => 0x6635, 0xc8 => 0x8006, + 0xc9 => 0x665f, 0xca => 0x6654, 0xcb => 0x6641, 0xcc => 0x664f, + 0xcd => 0x6656, 0xce => 0x6661, 0xcf => 0x6657, 0xd0 => 0x6677, + 0xd1 => 0x6684, 0xd2 => 0x668c, 0xd3 => 0x66a7, 0xd4 => 0x669d, + 0xd5 => 0x66be, 0xd6 => 0x66db, 0xd7 => 0x66dc, 0xd8 => 0x66e6, + 0xd9 => 0x66e9, 0xda => 0x8d32, 0xdb => 0x8d33, 0xdc => 0x8d36, + 0xdd => 0x8d3b, 0xde => 0x8d3d, 0xdf => 0x8d40, 0xe0 => 0x8d45, + 0xe1 => 0x8d46, 0xe2 => 0x8d48, 0xe3 => 0x8d49, 0xe4 => 0x8d47, + 0xe5 => 0x8d4d, 0xe6 => 0x8d55, 0xe7 => 0x8d59, 0xe8 => 0x89c7, + 0xe9 => 0x89ca, 0xea => 0x89cb, 0xeb => 0x89cc, 0xec => 0x89ce, + 0xed => 0x89cf, 0xee => 0x89d0, 0xef => 0x89d1, 0xf0 => 0x726e, + 0xf1 => 0x729f, 0xf2 => 0x725d, 0xf3 => 0x7266, 0xf4 => 0x726f, + 0xf5 => 0x727e, 0xf6 => 0x727f, 0xf7 => 0x7284, 0xf8 => 0x728b, + 0xf9 => 0x728d, 0xfa => 0x728f, 0xfb => 0x7292, 0xfc => 0x6308, + 0xfd => 0x6332, 0xfe => 0x63b0, + }, + 0xeb => { + 0xa1 => 0x643f, 0xa2 => 0x64d8, 0xa3 => 0x8004, 0xa4 => 0x6bea, + 0xa5 => 0x6bf3, 0xa6 => 0x6bfd, 0xa7 => 0x6bf5, 0xa8 => 0x6bf9, + 0xa9 => 0x6c05, 0xaa => 0x6c07, 0xab => 0x6c06, 0xac => 0x6c0d, + 0xad => 0x6c15, 0xae => 0x6c18, 0xaf => 0x6c19, 0xb0 => 0x6c1a, + 0xb1 => 0x6c21, 0xb2 => 0x6c29, 0xb3 => 0x6c24, 0xb4 => 0x6c2a, + 0xb5 => 0x6c32, 0xb6 => 0x6535, 0xb7 => 0x6555, 0xb8 => 0x656b, + 0xb9 => 0x724d, 0xba => 0x7252, 0xbb => 0x7256, 0xbc => 0x7230, + 0xbd => 0x8662, 0xbe => 0x5216, 0xbf => 0x809f, 0xc0 => 0x809c, + 0xc1 => 0x8093, 0xc2 => 0x80bc, 0xc3 => 0x670a, 0xc4 => 0x80bd, + 0xc5 => 0x80b1, 0xc6 => 0x80ab, 0xc7 => 0x80ad, 0xc8 => 0x80b4, + 0xc9 => 0x80b7, 0xca => 0x80e7, 0xcb => 0x80e8, 0xcc => 0x80e9, + 0xcd => 0x80ea, 0xce => 0x80db, 0xcf => 0x80c2, 0xd0 => 0x80c4, + 0xd1 => 0x80d9, 0xd2 => 0x80cd, 0xd3 => 0x80d7, 0xd4 => 0x6710, + 0xd5 => 0x80dd, 0xd6 => 0x80eb, 0xd7 => 0x80f1, 0xd8 => 0x80f4, + 0xd9 => 0x80ed, 0xda => 0x810d, 0xdb => 0x810e, 0xdc => 0x80f2, + 0xdd => 0x80fc, 0xde => 0x6715, 0xdf => 0x8112, 0xe0 => 0x8c5a, + 0xe1 => 0x8136, 0xe2 => 0x811e, 0xe3 => 0x812c, 0xe4 => 0x8118, + 0xe5 => 0x8132, 0xe6 => 0x8148, 0xe7 => 0x814c, 0xe8 => 0x8153, + 0xe9 => 0x8174, 0xea => 0x8159, 0xeb => 0x815a, 0xec => 0x8171, + 0xed => 0x8160, 0xee => 0x8169, 0xef => 0x817c, 0xf0 => 0x817d, + 0xf1 => 0x816d, 0xf2 => 0x8167, 0xf3 => 0x584d, 0xf4 => 0x5ab5, + 0xf5 => 0x8188, 0xf6 => 0x8182, 0xf7 => 0x8191, 0xf8 => 0x6ed5, + 0xf9 => 0x81a3, 0xfa => 0x81aa, 0xfb => 0x81cc, 0xfc => 0x6726, + 0xfd => 0x81ca, 0xfe => 0x81bb, + }, + 0xec => { + 0xa1 => 0x81c1, 0xa2 => 0x81a6, 0xa3 => 0x6b24, 0xa4 => 0x6b37, + 0xa5 => 0x6b39, 0xa6 => 0x6b43, 0xa7 => 0x6b46, 0xa8 => 0x6b59, + 0xa9 => 0x98d1, 0xaa => 0x98d2, 0xab => 0x98d3, 0xac => 0x98d5, + 0xad => 0x98d9, 0xae => 0x98da, 0xaf => 0x6bb3, 0xb0 => 0x5f40, + 0xb1 => 0x6bc2, 0xb2 => 0x89f3, 0xb3 => 0x6590, 0xb4 => 0x9f51, + 0xb5 => 0x6593, 0xb6 => 0x65bc, 0xb7 => 0x65c6, 0xb8 => 0x65c4, + 0xb9 => 0x65c3, 0xba => 0x65cc, 0xbb => 0x65ce, 0xbc => 0x65d2, + 0xbd => 0x65d6, 0xbe => 0x7080, 0xbf => 0x709c, 0xc0 => 0x7096, + 0xc1 => 0x709d, 0xc2 => 0x70bb, 0xc3 => 0x70c0, 0xc4 => 0x70b7, + 0xc5 => 0x70ab, 0xc6 => 0x70b1, 0xc7 => 0x70e8, 0xc8 => 0x70ca, + 0xc9 => 0x7110, 0xca => 0x7113, 0xcb => 0x7116, 0xcc => 0x712f, + 0xcd => 0x7131, 0xce => 0x7173, 0xcf => 0x715c, 0xd0 => 0x7168, + 0xd1 => 0x7145, 0xd2 => 0x7172, 0xd3 => 0x714a, 0xd4 => 0x7178, + 0xd5 => 0x717a, 0xd6 => 0x7198, 0xd7 => 0x71b3, 0xd8 => 0x71b5, + 0xd9 => 0x71a8, 0xda => 0x71a0, 0xdb => 0x71e0, 0xdc => 0x71d4, + 0xdd => 0x71e7, 0xde => 0x71f9, 0xdf => 0x721d, 0xe0 => 0x7228, + 0xe1 => 0x706c, 0xe2 => 0x7118, 0xe3 => 0x7166, 0xe4 => 0x71b9, + 0xe5 => 0x623e, 0xe6 => 0x623d, 0xe7 => 0x6243, 0xe8 => 0x6248, + 0xe9 => 0x6249, 0xea => 0x793b, 0xeb => 0x7940, 0xec => 0x7946, + 0xed => 0x7949, 0xee => 0x795b, 0xef => 0x795c, 0xf0 => 0x7953, + 0xf1 => 0x795a, 0xf2 => 0x7962, 0xf3 => 0x7957, 0xf4 => 0x7960, + 0xf5 => 0x796f, 0xf6 => 0x7967, 0xf7 => 0x797a, 0xf8 => 0x7985, + 0xf9 => 0x798a, 0xfa => 0x799a, 0xfb => 0x79a7, 0xfc => 0x79b3, + 0xfd => 0x5fd1, 0xfe => 0x5fd0, + }, + 0xed => { + 0xa1 => 0x603c, 0xa2 => 0x605d, 0xa3 => 0x605a, 0xa4 => 0x6067, + 0xa5 => 0x6041, 0xa6 => 0x6059, 0xa7 => 0x6063, 0xa8 => 0x60ab, + 0xa9 => 0x6106, 0xaa => 0x610d, 0xab => 0x615d, 0xac => 0x61a9, + 0xad => 0x619d, 0xae => 0x61cb, 0xaf => 0x61d1, 0xb0 => 0x6206, + 0xb1 => 0x8080, 0xb2 => 0x807f, 0xb3 => 0x6c93, 0xb4 => 0x6cf6, + 0xb5 => 0x6dfc, 0xb6 => 0x77f6, 0xb7 => 0x77f8, 0xb8 => 0x7800, + 0xb9 => 0x7809, 0xba => 0x7817, 0xbb => 0x7818, 0xbc => 0x7811, + 0xbd => 0x65ab, 0xbe => 0x782d, 0xbf => 0x781c, 0xc0 => 0x781d, + 0xc1 => 0x7839, 0xc2 => 0x783a, 0xc3 => 0x783b, 0xc4 => 0x781f, + 0xc5 => 0x783c, 0xc6 => 0x7825, 0xc7 => 0x782c, 0xc8 => 0x7823, + 0xc9 => 0x7829, 0xca => 0x784e, 0xcb => 0x786d, 0xcc => 0x7856, + 0xcd => 0x7857, 0xce => 0x7826, 0xcf => 0x7850, 0xd0 => 0x7847, + 0xd1 => 0x784c, 0xd2 => 0x786a, 0xd3 => 0x789b, 0xd4 => 0x7893, + 0xd5 => 0x789a, 0xd6 => 0x7887, 0xd7 => 0x789c, 0xd8 => 0x78a1, + 0xd9 => 0x78a3, 0xda => 0x78b2, 0xdb => 0x78b9, 0xdc => 0x78a5, + 0xdd => 0x78d4, 0xde => 0x78d9, 0xdf => 0x78c9, 0xe0 => 0x78ec, + 0xe1 => 0x78f2, 0xe2 => 0x7905, 0xe3 => 0x78f4, 0xe4 => 0x7913, + 0xe5 => 0x7924, 0xe6 => 0x791e, 0xe7 => 0x7934, 0xe8 => 0x9f9b, + 0xe9 => 0x9ef9, 0xea => 0x9efb, 0xeb => 0x9efc, 0xec => 0x76f1, + 0xed => 0x7704, 0xee => 0x770d, 0xef => 0x76f9, 0xf0 => 0x7707, + 0xf1 => 0x7708, 0xf2 => 0x771a, 0xf3 => 0x7722, 0xf4 => 0x7719, + 0xf5 => 0x772d, 0xf6 => 0x7726, 0xf7 => 0x7735, 0xf8 => 0x7738, + 0xf9 => 0x7750, 0xfa => 0x7751, 0xfb => 0x7747, 0xfc => 0x7743, + 0xfd => 0x775a, 0xfe => 0x7768, + }, + 0xee => { + 0xa1 => 0x7762, 0xa2 => 0x7765, 0xa3 => 0x777f, 0xa4 => 0x778d, + 0xa5 => 0x777d, 0xa6 => 0x7780, 0xa7 => 0x778c, 0xa8 => 0x7791, + 0xa9 => 0x779f, 0xaa => 0x77a0, 0xab => 0x77b0, 0xac => 0x77b5, + 0xad => 0x77bd, 0xae => 0x753a, 0xaf => 0x7540, 0xb0 => 0x754e, + 0xb1 => 0x754b, 0xb2 => 0x7548, 0xb3 => 0x755b, 0xb4 => 0x7572, + 0xb5 => 0x7579, 0xb6 => 0x7583, 0xb7 => 0x7f58, 0xb8 => 0x7f61, + 0xb9 => 0x7f5f, 0xba => 0x8a48, 0xbb => 0x7f68, 0xbc => 0x7f74, + 0xbd => 0x7f71, 0xbe => 0x7f79, 0xbf => 0x7f81, 0xc0 => 0x7f7e, + 0xc1 => 0x76cd, 0xc2 => 0x76e5, 0xc3 => 0x8832, 0xc4 => 0x9485, + 0xc5 => 0x9486, 0xc6 => 0x9487, 0xc7 => 0x948b, 0xc8 => 0x948a, + 0xc9 => 0x948c, 0xca => 0x948d, 0xcb => 0x948f, 0xcc => 0x9490, + 0xcd => 0x9494, 0xce => 0x9497, 0xcf => 0x9495, 0xd0 => 0x949a, + 0xd1 => 0x949b, 0xd2 => 0x949c, 0xd3 => 0x94a3, 0xd4 => 0x94a4, + 0xd5 => 0x94ab, 0xd6 => 0x94aa, 0xd7 => 0x94ad, 0xd8 => 0x94ac, + 0xd9 => 0x94af, 0xda => 0x94b0, 0xdb => 0x94b2, 0xdc => 0x94b4, + 0xdd => 0x94b6, 0xde => 0x94b7, 0xdf => 0x94b8, 0xe0 => 0x94b9, + 0xe1 => 0x94ba, 0xe2 => 0x94bc, 0xe3 => 0x94bd, 0xe4 => 0x94bf, + 0xe5 => 0x94c4, 0xe6 => 0x94c8, 0xe7 => 0x94c9, 0xe8 => 0x94ca, + 0xe9 => 0x94cb, 0xea => 0x94cc, 0xeb => 0x94cd, 0xec => 0x94ce, + 0xed => 0x94d0, 0xee => 0x94d1, 0xef => 0x94d2, 0xf0 => 0x94d5, + 0xf1 => 0x94d6, 0xf2 => 0x94d7, 0xf3 => 0x94d9, 0xf4 => 0x94d8, + 0xf5 => 0x94db, 0xf6 => 0x94de, 0xf7 => 0x94df, 0xf8 => 0x94e0, + 0xf9 => 0x94e2, 0xfa => 0x94e4, 0xfb => 0x94e5, 0xfc => 0x94e7, + 0xfd => 0x94e8, 0xfe => 0x94ea, + }, + 0xef => { + 0xa1 => 0x94e9, 0xa2 => 0x94eb, 0xa3 => 0x94ee, 0xa4 => 0x94ef, + 0xa5 => 0x94f3, 0xa6 => 0x94f4, 0xa7 => 0x94f5, 0xa8 => 0x94f7, + 0xa9 => 0x94f9, 0xaa => 0x94fc, 0xab => 0x94fd, 0xac => 0x94ff, + 0xad => 0x9503, 0xae => 0x9502, 0xaf => 0x9506, 0xb0 => 0x9507, + 0xb1 => 0x9509, 0xb2 => 0x950a, 0xb3 => 0x950d, 0xb4 => 0x950e, + 0xb5 => 0x950f, 0xb6 => 0x9512, 0xb7 => 0x9513, 0xb8 => 0x9514, + 0xb9 => 0x9515, 0xba => 0x9516, 0xbb => 0x9518, 0xbc => 0x951b, + 0xbd => 0x951d, 0xbe => 0x951e, 0xbf => 0x951f, 0xc0 => 0x9522, + 0xc1 => 0x952a, 0xc2 => 0x952b, 0xc3 => 0x9529, 0xc4 => 0x952c, + 0xc5 => 0x9531, 0xc6 => 0x9532, 0xc7 => 0x9534, 0xc8 => 0x9536, + 0xc9 => 0x9537, 0xca => 0x9538, 0xcb => 0x953c, 0xcc => 0x953e, + 0xcd => 0x953f, 0xce => 0x9542, 0xcf => 0x9535, 0xd0 => 0x9544, + 0xd1 => 0x9545, 0xd2 => 0x9546, 0xd3 => 0x9549, 0xd4 => 0x954c, + 0xd5 => 0x954e, 0xd6 => 0x954f, 0xd7 => 0x9552, 0xd8 => 0x9553, + 0xd9 => 0x9554, 0xda => 0x9556, 0xdb => 0x9557, 0xdc => 0x9558, + 0xdd => 0x9559, 0xde => 0x955b, 0xdf => 0x955e, 0xe0 => 0x955f, + 0xe1 => 0x955d, 0xe2 => 0x9561, 0xe3 => 0x9562, 0xe4 => 0x9564, + 0xe5 => 0x9565, 0xe6 => 0x9566, 0xe7 => 0x9567, 0xe8 => 0x9568, + 0xe9 => 0x9569, 0xea => 0x956a, 0xeb => 0x956b, 0xec => 0x956c, + 0xed => 0x956f, 0xee => 0x9571, 0xef => 0x9572, 0xf0 => 0x9573, + 0xf1 => 0x953a, 0xf2 => 0x77e7, 0xf3 => 0x77ec, 0xf4 => 0x96c9, + 0xf5 => 0x79d5, 0xf6 => 0x79ed, 0xf7 => 0x79e3, 0xf8 => 0x79eb, + 0xf9 => 0x7a06, 0xfa => 0x5d47, 0xfb => 0x7a03, 0xfc => 0x7a02, + 0xfd => 0x7a1e, 0xfe => 0x7a14, + }, + 0xf0 => { + 0xa1 => 0x7a39, 0xa2 => 0x7a37, 0xa3 => 0x7a51, 0xa4 => 0x9ecf, + 0xa5 => 0x99a5, 0xa6 => 0x7a70, 0xa7 => 0x7688, 0xa8 => 0x768e, + 0xa9 => 0x7693, 0xaa => 0x7699, 0xab => 0x76a4, 0xac => 0x74de, + 0xad => 0x74e0, 0xae => 0x752c, 0xaf => 0x9e20, 0xb0 => 0x9e22, + 0xb1 => 0x9e28, 0xb2 => 0x9e29, 0xb3 => 0x9e2a, 0xb4 => 0x9e2b, + 0xb5 => 0x9e2c, 0xb6 => 0x9e32, 0xb7 => 0x9e31, 0xb8 => 0x9e36, + 0xb9 => 0x9e38, 0xba => 0x9e37, 0xbb => 0x9e39, 0xbc => 0x9e3a, + 0xbd => 0x9e3e, 0xbe => 0x9e41, 0xbf => 0x9e42, 0xc0 => 0x9e44, + 0xc1 => 0x9e46, 0xc2 => 0x9e47, 0xc3 => 0x9e48, 0xc4 => 0x9e49, + 0xc5 => 0x9e4b, 0xc6 => 0x9e4c, 0xc7 => 0x9e4e, 0xc8 => 0x9e51, + 0xc9 => 0x9e55, 0xca => 0x9e57, 0xcb => 0x9e5a, 0xcc => 0x9e5b, + 0xcd => 0x9e5c, 0xce => 0x9e5e, 0xcf => 0x9e63, 0xd0 => 0x9e66, + 0xd1 => 0x9e67, 0xd2 => 0x9e68, 0xd3 => 0x9e69, 0xd4 => 0x9e6a, + 0xd5 => 0x9e6b, 0xd6 => 0x9e6c, 0xd7 => 0x9e71, 0xd8 => 0x9e6d, + 0xd9 => 0x9e73, 0xda => 0x7592, 0xdb => 0x7594, 0xdc => 0x7596, + 0xdd => 0x75a0, 0xde => 0x759d, 0xdf => 0x75ac, 0xe0 => 0x75a3, + 0xe1 => 0x75b3, 0xe2 => 0x75b4, 0xe3 => 0x75b8, 0xe4 => 0x75c4, + 0xe5 => 0x75b1, 0xe6 => 0x75b0, 0xe7 => 0x75c3, 0xe8 => 0x75c2, + 0xe9 => 0x75d6, 0xea => 0x75cd, 0xeb => 0x75e3, 0xec => 0x75e8, + 0xed => 0x75e6, 0xee => 0x75e4, 0xef => 0x75eb, 0xf0 => 0x75e7, + 0xf1 => 0x7603, 0xf2 => 0x75f1, 0xf3 => 0x75fc, 0xf4 => 0x75ff, + 0xf5 => 0x7610, 0xf6 => 0x7600, 0xf7 => 0x7605, 0xf8 => 0x760c, + 0xf9 => 0x7617, 0xfa => 0x760a, 0xfb => 0x7625, 0xfc => 0x7618, + 0xfd => 0x7615, 0xfe => 0x7619, + }, + 0xf1 => { + 0xa1 => 0x761b, 0xa2 => 0x763c, 0xa3 => 0x7622, 0xa4 => 0x7620, + 0xa5 => 0x7640, 0xa6 => 0x762d, 0xa7 => 0x7630, 0xa8 => 0x763f, + 0xa9 => 0x7635, 0xaa => 0x7643, 0xab => 0x763e, 0xac => 0x7633, + 0xad => 0x764d, 0xae => 0x765e, 0xaf => 0x7654, 0xb0 => 0x765c, + 0xb1 => 0x7656, 0xb2 => 0x766b, 0xb3 => 0x766f, 0xb4 => 0x7fca, + 0xb5 => 0x7ae6, 0xb6 => 0x7a78, 0xb7 => 0x7a79, 0xb8 => 0x7a80, + 0xb9 => 0x7a86, 0xba => 0x7a88, 0xbb => 0x7a95, 0xbc => 0x7aa6, + 0xbd => 0x7aa0, 0xbe => 0x7aac, 0xbf => 0x7aa8, 0xc0 => 0x7aad, + 0xc1 => 0x7ab3, 0xc2 => 0x8864, 0xc3 => 0x8869, 0xc4 => 0x8872, + 0xc5 => 0x887d, 0xc6 => 0x887f, 0xc7 => 0x8882, 0xc8 => 0x88a2, + 0xc9 => 0x88c6, 0xca => 0x88b7, 0xcb => 0x88bc, 0xcc => 0x88c9, + 0xcd => 0x88e2, 0xce => 0x88ce, 0xcf => 0x88e3, 0xd0 => 0x88e5, + 0xd1 => 0x88f1, 0xd2 => 0x891a, 0xd3 => 0x88fc, 0xd4 => 0x88e8, + 0xd5 => 0x88fe, 0xd6 => 0x88f0, 0xd7 => 0x8921, 0xd8 => 0x8919, + 0xd9 => 0x8913, 0xda => 0x891b, 0xdb => 0x890a, 0xdc => 0x8934, + 0xdd => 0x892b, 0xde => 0x8936, 0xdf => 0x8941, 0xe0 => 0x8966, + 0xe1 => 0x897b, 0xe2 => 0x758b, 0xe3 => 0x80e5, 0xe4 => 0x76b2, + 0xe5 => 0x76b4, 0xe6 => 0x77dc, 0xe7 => 0x8012, 0xe8 => 0x8014, + 0xe9 => 0x8016, 0xea => 0x801c, 0xeb => 0x8020, 0xec => 0x8022, + 0xed => 0x8025, 0xee => 0x8026, 0xef => 0x8027, 0xf0 => 0x8029, + 0xf1 => 0x8028, 0xf2 => 0x8031, 0xf3 => 0x800b, 0xf4 => 0x8035, + 0xf5 => 0x8043, 0xf6 => 0x8046, 0xf7 => 0x804d, 0xf8 => 0x8052, + 0xf9 => 0x8069, 0xfa => 0x8071, 0xfb => 0x8983, 0xfc => 0x9878, + 0xfd => 0x9880, 0xfe => 0x9883, + }, + 0xf2 => { + 0xa1 => 0x9889, 0xa2 => 0x988c, 0xa3 => 0x988d, 0xa4 => 0x988f, + 0xa5 => 0x9894, 0xa6 => 0x989a, 0xa7 => 0x989b, 0xa8 => 0x989e, + 0xa9 => 0x989f, 0xaa => 0x98a1, 0xab => 0x98a2, 0xac => 0x98a5, + 0xad => 0x98a6, 0xae => 0x864d, 0xaf => 0x8654, 0xb0 => 0x866c, + 0xb1 => 0x866e, 0xb2 => 0x867f, 0xb3 => 0x867a, 0xb4 => 0x867c, + 0xb5 => 0x867b, 0xb6 => 0x86a8, 0xb7 => 0x868d, 0xb8 => 0x868b, + 0xb9 => 0x86ac, 0xba => 0x869d, 0xbb => 0x86a7, 0xbc => 0x86a3, + 0xbd => 0x86aa, 0xbe => 0x8693, 0xbf => 0x86a9, 0xc0 => 0x86b6, + 0xc1 => 0x86c4, 0xc2 => 0x86b5, 0xc3 => 0x86ce, 0xc4 => 0x86b0, + 0xc5 => 0x86ba, 0xc6 => 0x86b1, 0xc7 => 0x86af, 0xc8 => 0x86c9, + 0xc9 => 0x86cf, 0xca => 0x86b4, 0xcb => 0x86e9, 0xcc => 0x86f1, + 0xcd => 0x86f2, 0xce => 0x86ed, 0xcf => 0x86f3, 0xd0 => 0x86d0, + 0xd1 => 0x8713, 0xd2 => 0x86de, 0xd3 => 0x86f4, 0xd4 => 0x86df, + 0xd5 => 0x86d8, 0xd6 => 0x86d1, 0xd7 => 0x8703, 0xd8 => 0x8707, + 0xd9 => 0x86f8, 0xda => 0x8708, 0xdb => 0x870a, 0xdc => 0x870d, + 0xdd => 0x8709, 0xde => 0x8723, 0xdf => 0x873b, 0xe0 => 0x871e, + 0xe1 => 0x8725, 0xe2 => 0x872e, 0xe3 => 0x871a, 0xe4 => 0x873e, + 0xe5 => 0x8748, 0xe6 => 0x8734, 0xe7 => 0x8731, 0xe8 => 0x8729, + 0xe9 => 0x8737, 0xea => 0x873f, 0xeb => 0x8782, 0xec => 0x8722, + 0xed => 0x877d, 0xee => 0x877e, 0xef => 0x877b, 0xf0 => 0x8760, + 0xf1 => 0x8770, 0xf2 => 0x874c, 0xf3 => 0x876e, 0xf4 => 0x878b, + 0xf5 => 0x8753, 0xf6 => 0x8763, 0xf7 => 0x877c, 0xf8 => 0x8764, + 0xf9 => 0x8759, 0xfa => 0x8765, 0xfb => 0x8793, 0xfc => 0x87af, + 0xfd => 0x87a8, 0xfe => 0x87d2, + }, + 0xf3 => { + 0xa1 => 0x87c6, 0xa2 => 0x8788, 0xa3 => 0x8785, 0xa4 => 0x87ad, + 0xa5 => 0x8797, 0xa6 => 0x8783, 0xa7 => 0x87ab, 0xa8 => 0x87e5, + 0xa9 => 0x87ac, 0xaa => 0x87b5, 0xab => 0x87b3, 0xac => 0x87cb, + 0xad => 0x87d3, 0xae => 0x87bd, 0xaf => 0x87d1, 0xb0 => 0x87c0, + 0xb1 => 0x87ca, 0xb2 => 0x87db, 0xb3 => 0x87ea, 0xb4 => 0x87e0, + 0xb5 => 0x87ee, 0xb6 => 0x8816, 0xb7 => 0x8813, 0xb8 => 0x87fe, + 0xb9 => 0x880a, 0xba => 0x881b, 0xbb => 0x8821, 0xbc => 0x8839, + 0xbd => 0x883c, 0xbe => 0x7f36, 0xbf => 0x7f42, 0xc0 => 0x7f44, + 0xc1 => 0x7f45, 0xc2 => 0x8210, 0xc3 => 0x7afa, 0xc4 => 0x7afd, + 0xc5 => 0x7b08, 0xc6 => 0x7b03, 0xc7 => 0x7b04, 0xc8 => 0x7b15, + 0xc9 => 0x7b0a, 0xca => 0x7b2b, 0xcb => 0x7b0f, 0xcc => 0x7b47, + 0xcd => 0x7b38, 0xce => 0x7b2a, 0xcf => 0x7b19, 0xd0 => 0x7b2e, + 0xd1 => 0x7b31, 0xd2 => 0x7b20, 0xd3 => 0x7b25, 0xd4 => 0x7b24, + 0xd5 => 0x7b33, 0xd6 => 0x7b3e, 0xd7 => 0x7b1e, 0xd8 => 0x7b58, + 0xd9 => 0x7b5a, 0xda => 0x7b45, 0xdb => 0x7b75, 0xdc => 0x7b4c, + 0xdd => 0x7b5d, 0xde => 0x7b60, 0xdf => 0x7b6e, 0xe0 => 0x7b7b, + 0xe1 => 0x7b62, 0xe2 => 0x7b72, 0xe3 => 0x7b71, 0xe4 => 0x7b90, + 0xe5 => 0x7ba6, 0xe6 => 0x7ba7, 0xe7 => 0x7bb8, 0xe8 => 0x7bac, + 0xe9 => 0x7b9d, 0xea => 0x7ba8, 0xeb => 0x7b85, 0xec => 0x7baa, + 0xed => 0x7b9c, 0xee => 0x7ba2, 0xef => 0x7bab, 0xf0 => 0x7bb4, + 0xf1 => 0x7bd1, 0xf2 => 0x7bc1, 0xf3 => 0x7bcc, 0xf4 => 0x7bdd, + 0xf5 => 0x7bda, 0xf6 => 0x7be5, 0xf7 => 0x7be6, 0xf8 => 0x7bea, + 0xf9 => 0x7c0c, 0xfa => 0x7bfe, 0xfb => 0x7bfc, 0xfc => 0x7c0f, + 0xfd => 0x7c16, 0xfe => 0x7c0b, + }, + 0xf4 => { + 0xa1 => 0x7c1f, 0xa2 => 0x7c2a, 0xa3 => 0x7c26, 0xa4 => 0x7c38, + 0xa5 => 0x7c41, 0xa6 => 0x7c40, 0xa7 => 0x81fe, 0xa8 => 0x8201, + 0xa9 => 0x8202, 0xaa => 0x8204, 0xab => 0x81ec, 0xac => 0x8844, + 0xad => 0x8221, 0xae => 0x8222, 0xaf => 0x8223, 0xb0 => 0x822d, + 0xb1 => 0x822f, 0xb2 => 0x8228, 0xb3 => 0x822b, 0xb4 => 0x8238, + 0xb5 => 0x823b, 0xb6 => 0x8233, 0xb7 => 0x8234, 0xb8 => 0x823e, + 0xb9 => 0x8244, 0xba => 0x8249, 0xbb => 0x824b, 0xbc => 0x824f, + 0xbd => 0x825a, 0xbe => 0x825f, 0xbf => 0x8268, 0xc0 => 0x887e, + 0xc1 => 0x8885, 0xc2 => 0x8888, 0xc3 => 0x88d8, 0xc4 => 0x88df, + 0xc5 => 0x895e, 0xc6 => 0x7f9d, 0xc7 => 0x7f9f, 0xc8 => 0x7fa7, + 0xc9 => 0x7faf, 0xca => 0x7fb0, 0xcb => 0x7fb2, 0xcc => 0x7c7c, + 0xcd => 0x6549, 0xce => 0x7c91, 0xcf => 0x7c9d, 0xd0 => 0x7c9c, + 0xd1 => 0x7c9e, 0xd2 => 0x7ca2, 0xd3 => 0x7cb2, 0xd4 => 0x7cbc, + 0xd5 => 0x7cbd, 0xd6 => 0x7cc1, 0xd7 => 0x7cc7, 0xd8 => 0x7ccc, + 0xd9 => 0x7ccd, 0xda => 0x7cc8, 0xdb => 0x7cc5, 0xdc => 0x7cd7, + 0xdd => 0x7ce8, 0xde => 0x826e, 0xdf => 0x66a8, 0xe0 => 0x7fbf, + 0xe1 => 0x7fce, 0xe2 => 0x7fd5, 0xe3 => 0x7fe5, 0xe4 => 0x7fe1, + 0xe5 => 0x7fe6, 0xe6 => 0x7fe9, 0xe7 => 0x7fee, 0xe8 => 0x7ff3, + 0xe9 => 0x7cf8, 0xea => 0x7d77, 0xeb => 0x7da6, 0xec => 0x7dae, + 0xed => 0x7e47, 0xee => 0x7e9b, 0xef => 0x9eb8, 0xf0 => 0x9eb4, + 0xf1 => 0x8d73, 0xf2 => 0x8d84, 0xf3 => 0x8d94, 0xf4 => 0x8d91, + 0xf5 => 0x8db1, 0xf6 => 0x8d67, 0xf7 => 0x8d6d, 0xf8 => 0x8c47, + 0xf9 => 0x8c49, 0xfa => 0x914a, 0xfb => 0x9150, 0xfc => 0x914e, + 0xfd => 0x914f, 0xfe => 0x9164, + }, + 0xf5 => { + 0xa1 => 0x9162, 0xa2 => 0x9161, 0xa3 => 0x9170, 0xa4 => 0x9169, + 0xa5 => 0x916f, 0xa6 => 0x917d, 0xa7 => 0x917e, 0xa8 => 0x9172, + 0xa9 => 0x9174, 0xaa => 0x9179, 0xab => 0x918c, 0xac => 0x9185, + 0xad => 0x9190, 0xae => 0x918d, 0xaf => 0x9191, 0xb0 => 0x91a2, + 0xb1 => 0x91a3, 0xb2 => 0x91aa, 0xb3 => 0x91ad, 0xb4 => 0x91ae, + 0xb5 => 0x91af, 0xb6 => 0x91b5, 0xb7 => 0x91b4, 0xb8 => 0x91ba, + 0xb9 => 0x8c55, 0xba => 0x9e7e, 0xbb => 0x8db8, 0xbc => 0x8deb, + 0xbd => 0x8e05, 0xbe => 0x8e59, 0xbf => 0x8e69, 0xc0 => 0x8db5, + 0xc1 => 0x8dbf, 0xc2 => 0x8dbc, 0xc3 => 0x8dba, 0xc4 => 0x8dc4, + 0xc5 => 0x8dd6, 0xc6 => 0x8dd7, 0xc7 => 0x8dda, 0xc8 => 0x8dde, + 0xc9 => 0x8dce, 0xca => 0x8dcf, 0xcb => 0x8ddb, 0xcc => 0x8dc6, + 0xcd => 0x8dec, 0xce => 0x8df7, 0xcf => 0x8df8, 0xd0 => 0x8de3, + 0xd1 => 0x8df9, 0xd2 => 0x8dfb, 0xd3 => 0x8de4, 0xd4 => 0x8e09, + 0xd5 => 0x8dfd, 0xd6 => 0x8e14, 0xd7 => 0x8e1d, 0xd8 => 0x8e1f, + 0xd9 => 0x8e2c, 0xda => 0x8e2e, 0xdb => 0x8e23, 0xdc => 0x8e2f, + 0xdd => 0x8e3a, 0xde => 0x8e40, 0xdf => 0x8e39, 0xe0 => 0x8e35, + 0xe1 => 0x8e3d, 0xe2 => 0x8e31, 0xe3 => 0x8e49, 0xe4 => 0x8e41, + 0xe5 => 0x8e42, 0xe6 => 0x8e51, 0xe7 => 0x8e52, 0xe8 => 0x8e4a, + 0xe9 => 0x8e70, 0xea => 0x8e76, 0xeb => 0x8e7c, 0xec => 0x8e6f, + 0xed => 0x8e74, 0xee => 0x8e85, 0xef => 0x8e8f, 0xf0 => 0x8e94, + 0xf1 => 0x8e90, 0xf2 => 0x8e9c, 0xf3 => 0x8e9e, 0xf4 => 0x8c78, + 0xf5 => 0x8c82, 0xf6 => 0x8c8a, 0xf7 => 0x8c85, 0xf8 => 0x8c98, + 0xf9 => 0x8c94, 0xfa => 0x659b, 0xfb => 0x89d6, 0xfc => 0x89de, + 0xfd => 0x89da, 0xfe => 0x89dc, + }, + 0xf6 => { + 0xa1 => 0x89e5, 0xa2 => 0x89eb, 0xa3 => 0x89ef, 0xa4 => 0x8a3e, + 0xa5 => 0x8b26, 0xa6 => 0x9753, 0xa7 => 0x96e9, 0xa8 => 0x96f3, + 0xa9 => 0x96ef, 0xaa => 0x9706, 0xab => 0x9701, 0xac => 0x9708, + 0xad => 0x970f, 0xae => 0x970e, 0xaf => 0x972a, 0xb0 => 0x972d, + 0xb1 => 0x9730, 0xb2 => 0x973e, 0xb3 => 0x9f80, 0xb4 => 0x9f83, + 0xb5 => 0x9f85, 0xb6 => 0x9f86, 0xb7 => 0x9f87, 0xb8 => 0x9f88, + 0xb9 => 0x9f89, 0xba => 0x9f8a, 0xbb => 0x9f8c, 0xbc => 0x9efe, + 0xbd => 0x9f0b, 0xbe => 0x9f0d, 0xbf => 0x96b9, 0xc0 => 0x96bc, + 0xc1 => 0x96bd, 0xc2 => 0x96ce, 0xc3 => 0x96d2, 0xc4 => 0x77bf, + 0xc5 => 0x96e0, 0xc6 => 0x928e, 0xc7 => 0x92ae, 0xc8 => 0x92c8, + 0xc9 => 0x933e, 0xca => 0x936a, 0xcb => 0x93ca, 0xcc => 0x938f, + 0xcd => 0x943e, 0xce => 0x946b, 0xcf => 0x9c7f, 0xd0 => 0x9c82, + 0xd1 => 0x9c85, 0xd2 => 0x9c86, 0xd3 => 0x9c87, 0xd4 => 0x9c88, + 0xd5 => 0x7a23, 0xd6 => 0x9c8b, 0xd7 => 0x9c8e, 0xd8 => 0x9c90, + 0xd9 => 0x9c91, 0xda => 0x9c92, 0xdb => 0x9c94, 0xdc => 0x9c95, + 0xdd => 0x9c9a, 0xde => 0x9c9b, 0xdf => 0x9c9e, 0xe0 => 0x9c9f, + 0xe1 => 0x9ca0, 0xe2 => 0x9ca1, 0xe3 => 0x9ca2, 0xe4 => 0x9ca3, + 0xe5 => 0x9ca5, 0xe6 => 0x9ca6, 0xe7 => 0x9ca7, 0xe8 => 0x9ca8, + 0xe9 => 0x9ca9, 0xea => 0x9cab, 0xeb => 0x9cad, 0xec => 0x9cae, + 0xed => 0x9cb0, 0xee => 0x9cb1, 0xef => 0x9cb2, 0xf0 => 0x9cb3, + 0xf1 => 0x9cb4, 0xf2 => 0x9cb5, 0xf3 => 0x9cb6, 0xf4 => 0x9cb7, + 0xf5 => 0x9cba, 0xf6 => 0x9cbb, 0xf7 => 0x9cbc, 0xf8 => 0x9cbd, + 0xf9 => 0x9cc4, 0xfa => 0x9cc5, 0xfb => 0x9cc6, 0xfc => 0x9cc7, + 0xfd => 0x9cca, 0xfe => 0x9ccb, + }, + 0xf7 => { + 0xa1 => 0x9ccc, 0xa2 => 0x9ccd, 0xa3 => 0x9cce, 0xa4 => 0x9ccf, + 0xa5 => 0x9cd0, 0xa6 => 0x9cd3, 0xa7 => 0x9cd4, 0xa8 => 0x9cd5, + 0xa9 => 0x9cd7, 0xaa => 0x9cd8, 0xab => 0x9cd9, 0xac => 0x9cdc, + 0xad => 0x9cdd, 0xae => 0x9cdf, 0xaf => 0x9ce2, 0xb0 => 0x977c, + 0xb1 => 0x9785, 0xb2 => 0x9791, 0xb3 => 0x9792, 0xb4 => 0x9794, + 0xb5 => 0x97af, 0xb6 => 0x97ab, 0xb7 => 0x97a3, 0xb8 => 0x97b2, + 0xb9 => 0x97b4, 0xba => 0x9ab1, 0xbb => 0x9ab0, 0xbc => 0x9ab7, + 0xbd => 0x9e58, 0xbe => 0x9ab6, 0xbf => 0x9aba, 0xc0 => 0x9abc, + 0xc1 => 0x9ac1, 0xc2 => 0x9ac0, 0xc3 => 0x9ac5, 0xc4 => 0x9ac2, + 0xc5 => 0x9acb, 0xc6 => 0x9acc, 0xc7 => 0x9ad1, 0xc8 => 0x9b45, + 0xc9 => 0x9b43, 0xca => 0x9b47, 0xcb => 0x9b49, 0xcc => 0x9b48, + 0xcd => 0x9b4d, 0xce => 0x9b51, 0xcf => 0x98e8, 0xd0 => 0x990d, + 0xd1 => 0x992e, 0xd2 => 0x9955, 0xd3 => 0x9954, 0xd4 => 0x9adf, + 0xd5 => 0x9ae1, 0xd6 => 0x9ae6, 0xd7 => 0x9aef, 0xd8 => 0x9aeb, + 0xd9 => 0x9afb, 0xda => 0x9aed, 0xdb => 0x9af9, 0xdc => 0x9b08, + 0xdd => 0x9b0f, 0xde => 0x9b13, 0xdf => 0x9b1f, 0xe0 => 0x9b23, + 0xe1 => 0x9ebd, 0xe2 => 0x9ebe, 0xe3 => 0x7e3b, 0xe4 => 0x9e82, + 0xe5 => 0x9e87, 0xe6 => 0x9e88, 0xe7 => 0x9e8b, 0xe8 => 0x9e92, + 0xe9 => 0x93d6, 0xea => 0x9e9d, 0xeb => 0x9e9f, 0xec => 0x9edb, + 0xed => 0x9edc, 0xee => 0x9edd, 0xef => 0x9ee0, 0xf0 => 0x9edf, + 0xf1 => 0x9ee2, 0xf2 => 0x9ee9, 0xf3 => 0x9ee7, 0xf4 => 0x9ee5, + 0xf5 => 0x9eea, 0xf6 => 0x9eef, 0xf7 => 0x9f22, 0xf8 => 0x9f2c, + 0xf9 => 0x9f2f, 0xfa => 0x9f39, 0xfb => 0x9f37, 0xfc => 0x9f3d, + 0xfd => 0x9f3e, 0xfe => 0x9f44, + }, + 0xf8 => 0xf8f8, 0xf9 => 0xf8f9, 0xfa => 0xf8fa, 0xfb => 0xf8fb, + 0xfc => 0xf8fc, 0xfd => 0xf8fd, 0xfe => 0xf8fe, 0xff => 0xf8ff, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacRoman.pm b/lib/Image/ExifTool/Charset/MacRoman.pm new file mode 100644 index 0000000..a672b26 --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacRoman.pm @@ -0,0 +1,42 @@ +#------------------------------------------------------------------------------ +# File: MacRoman.pm +# +# Description: Mac Roman to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/ROMAN.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacRoman = ( + 0x80 => 0xc4, 0x81 => 0xc5, 0x82 => 0xc7, 0x83 => 0xc9, 0x84 => 0xd1, + 0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0, 0x89 => 0xe2, + 0x8a => 0xe4, 0x8b => 0xe3, 0x8c => 0xe5, 0x8d => 0xe7, 0x8e => 0xe9, + 0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed, 0x93 => 0xec, + 0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3, 0x98 => 0xf2, + 0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa, 0x9d => 0xf9, + 0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x2020, 0xa1 => 0xb0, 0xa4 => 0xa7, + 0xa5 => 0x2022, 0xa6 => 0xb6, 0xa7 => 0xdf, 0xa8 => 0xae, 0xaa => 0x2122, + 0xab => 0xb4, 0xac => 0xa8, 0xad => 0x2260, 0xae => 0xc6, 0xaf => 0xd8, + 0xb0 => 0x221e, 0xb2 => 0x2264, 0xb3 => 0x2265, 0xb4 => 0xa5, 0xb6 => 0x2202, + 0xb7 => 0x2211, 0xb8 => 0x220f, 0xb9 => 0x03c0, 0xba => 0x222b, 0xbb => 0xaa, + 0xbc => 0xba, 0xbd => 0x03a9, 0xbe => 0xe6, 0xbf => 0xf8, 0xc0 => 0xbf, + 0xc1 => 0xa1, 0xc2 => 0xac, 0xc3 => 0x221a, 0xc4 => 0x0192, 0xc5 => 0x2248, + 0xc6 => 0x2206, 0xc7 => 0xab, 0xc8 => 0xbb, 0xc9 => 0x2026, 0xca => 0xa0, + 0xcb => 0xc0, 0xcc => 0xc3, 0xcd => 0xd5, 0xce => 0x0152, 0xcf => 0x0153, + 0xd0 => 0x2013, 0xd1 => 0x2014, 0xd2 => 0x201c, 0xd3 => 0x201d, + 0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7, 0xd7 => 0x25ca, 0xd8 => 0xff, + 0xd9 => 0x0178, 0xda => 0x2044, 0xdb => 0x20ac, 0xdc => 0x2039, + 0xdd => 0x203a, 0xde => 0xfb01, 0xdf => 0xfb02, 0xe0 => 0x2021, 0xe1 => 0xb7, + 0xe2 => 0x201a, 0xe3 => 0x201e, 0xe4 => 0x2030, 0xe5 => 0xc2, 0xe6 => 0xca, + 0xe7 => 0xc1, 0xe8 => 0xcb, 0xe9 => 0xc8, 0xea => 0xcd, 0xeb => 0xce, + 0xec => 0xcf, 0xed => 0xcc, 0xee => 0xd3, 0xef => 0xd4, 0xf0 => 0xf8ff, + 0xf1 => 0xd2, 0xf2 => 0xda, 0xf3 => 0xdb, 0xf4 => 0xd9, 0xf5 => 0x0131, + 0xf6 => 0x02c6, 0xf7 => 0x02dc, 0xf8 => 0xaf, 0xf9 => 0x02d8, 0xfa => 0x02d9, + 0xfb => 0x02da, 0xfc => 0xb8, 0xfd => 0x02dd, 0xfe => 0x02db, 0xff => 0x02c7, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacRomanian.pm b/lib/Image/ExifTool/Charset/MacRomanian.pm new file mode 100644 index 0000000..69c9396 --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacRomanian.pm @@ -0,0 +1,42 @@ +#------------------------------------------------------------------------------ +# File: MacRomanian.pm +# +# Description: Mac Romanian to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/ROMANIAN.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacRomanian = ( + 0x80 => 0xc4, 0x81 => 0xc5, 0x82 => 0xc7, 0x83 => 0xc9, 0x84 => 0xd1, + 0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0, 0x89 => 0xe2, + 0x8a => 0xe4, 0x8b => 0xe3, 0x8c => 0xe5, 0x8d => 0xe7, 0x8e => 0xe9, + 0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed, 0x93 => 0xec, + 0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3, 0x98 => 0xf2, + 0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa, 0x9d => 0xf9, + 0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x2020, 0xa1 => 0xb0, 0xa4 => 0xa7, + 0xa5 => 0x2022, 0xa6 => 0xb6, 0xa7 => 0xdf, 0xa8 => 0xae, 0xaa => 0x2122, + 0xab => 0xb4, 0xac => 0xa8, 0xad => 0x2260, 0xae => 0x0102, 0xaf => 0x0218, + 0xb0 => 0x221e, 0xb2 => 0x2264, 0xb3 => 0x2265, 0xb4 => 0xa5, 0xb6 => 0x2202, + 0xb7 => 0x2211, 0xb8 => 0x220f, 0xb9 => 0x03c0, 0xba => 0x222b, 0xbb => 0xaa, + 0xbc => 0xba, 0xbd => 0x03a9, 0xbe => 0x0103, 0xbf => 0x0219, 0xc0 => 0xbf, + 0xc1 => 0xa1, 0xc2 => 0xac, 0xc3 => 0x221a, 0xc4 => 0x0192, 0xc5 => 0x2248, + 0xc6 => 0x2206, 0xc7 => 0xab, 0xc8 => 0xbb, 0xc9 => 0x2026, 0xca => 0xa0, + 0xcb => 0xc0, 0xcc => 0xc3, 0xcd => 0xd5, 0xce => 0x0152, 0xcf => 0x0153, + 0xd0 => 0x2013, 0xd1 => 0x2014, 0xd2 => 0x201c, 0xd3 => 0x201d, + 0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7, 0xd7 => 0x25ca, 0xd8 => 0xff, + 0xd9 => 0x0178, 0xda => 0x2044, 0xdb => 0x20ac, 0xdc => 0x2039, + 0xdd => 0x203a, 0xde => 0x021a, 0xdf => 0x021b, 0xe0 => 0x2021, 0xe1 => 0xb7, + 0xe2 => 0x201a, 0xe3 => 0x201e, 0xe4 => 0x2030, 0xe5 => 0xc2, 0xe6 => 0xca, + 0xe7 => 0xc1, 0xe8 => 0xcb, 0xe9 => 0xc8, 0xea => 0xcd, 0xeb => 0xce, + 0xec => 0xcf, 0xed => 0xcc, 0xee => 0xd3, 0xef => 0xd4, 0xf0 => 0xf8ff, + 0xf1 => 0xd2, 0xf2 => 0xda, 0xf3 => 0xdb, 0xf4 => 0xd9, 0xf5 => 0x0131, + 0xf6 => 0x02c6, 0xf7 => 0x02dc, 0xf8 => 0xaf, 0xf9 => 0x02d8, 0xfa => 0x02d9, + 0xfb => 0x02da, 0xfc => 0xb8, 0xfd => 0x02dd, 0xfe => 0x02db, 0xff => 0x02c7, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacThai.pm b/lib/Image/ExifTool/Charset/MacThai.pm new file mode 100644 index 0000000..7292255 --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacThai.pm @@ -0,0 +1,49 @@ +#------------------------------------------------------------------------------ +# File: MacThai.pm +# +# Description: Mac Thai to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/THAI.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacThai = ( + 0x80 => 0xab, 0x81 => 0xbb, 0x82 => 0x2026, 0x83 => [0x0e48,0xf875], + 0x84 => [0x0e49,0xf875], 0x85 => [0x0e4a,0xf875], 0x86 => [0x0e4b,0xf875], + 0x87 => [0x0e4c,0xf875], 0x88 => [0x0e48,0xf873], 0x89 => [0x0e49,0xf873], + 0x8a => [0x0e4a,0xf873], 0x8b => [0x0e4b,0xf873], 0x8c => [0x0e4c,0xf873], + 0x8d => 0x201c, 0x8e => 0x201d, 0x8f => [0x0e4d,0xf874], 0x91 => 0x2022, + 0x92 => [0x0e31,0xf874], 0x93 => [0x0e47,0xf874], 0x94 => [0x0e34,0xf874], + 0x95 => [0x0e35,0xf874], 0x96 => [0x0e36,0xf874], 0x97 => [0x0e37,0xf874], + 0x98 => [0x0e48,0xf874], 0x99 => [0x0e49,0xf874], 0x9a => [0x0e4a,0xf874], + 0x9b => [0x0e4b,0xf874], 0x9c => [0x0e4c,0xf874], 0x9d => 0x2018, + 0x9e => 0x2019, 0xa1 => 0x0e01, 0xa2 => 0x0e02, 0xa3 => 0x0e03, + 0xa4 => 0x0e04, 0xa5 => 0x0e05, 0xa6 => 0x0e06, 0xa7 => 0x0e07, + 0xa8 => 0x0e08, 0xa9 => 0x0e09, 0xaa => 0x0e0a, 0xab => 0x0e0b, + 0xac => 0x0e0c, 0xad => 0x0e0d, 0xae => 0x0e0e, 0xaf => 0x0e0f, + 0xb0 => 0x0e10, 0xb1 => 0x0e11, 0xb2 => 0x0e12, 0xb3 => 0x0e13, + 0xb4 => 0x0e14, 0xb5 => 0x0e15, 0xb6 => 0x0e16, 0xb7 => 0x0e17, + 0xb8 => 0x0e18, 0xb9 => 0x0e19, 0xba => 0x0e1a, 0xbb => 0x0e1b, + 0xbc => 0x0e1c, 0xbd => 0x0e1d, 0xbe => 0x0e1e, 0xbf => 0x0e1f, + 0xc0 => 0x0e20, 0xc1 => 0x0e21, 0xc2 => 0x0e22, 0xc3 => 0x0e23, + 0xc4 => 0x0e24, 0xc5 => 0x0e25, 0xc6 => 0x0e26, 0xc7 => 0x0e27, + 0xc8 => 0x0e28, 0xc9 => 0x0e29, 0xca => 0x0e2a, 0xcb => 0x0e2b, + 0xcc => 0x0e2c, 0xcd => 0x0e2d, 0xce => 0x0e2e, 0xcf => 0x0e2f, + 0xd0 => 0x0e30, 0xd1 => 0x0e31, 0xd2 => 0x0e32, 0xd3 => 0x0e33, + 0xd4 => 0x0e34, 0xd5 => 0x0e35, 0xd6 => 0x0e36, 0xd7 => 0x0e37, + 0xd8 => 0x0e38, 0xd9 => 0x0e39, 0xda => 0x0e3a, 0xdb => 0x2060, + 0xdc => 0x200b, 0xdd => 0x2013, 0xde => 0x2014, 0xdf => 0x0e3f, + 0xe0 => 0x0e40, 0xe1 => 0x0e41, 0xe2 => 0x0e42, 0xe3 => 0x0e43, + 0xe4 => 0x0e44, 0xe5 => 0x0e45, 0xe6 => 0x0e46, 0xe7 => 0x0e47, + 0xe8 => 0x0e48, 0xe9 => 0x0e49, 0xea => 0x0e4a, 0xeb => 0x0e4b, + 0xec => 0x0e4c, 0xed => 0x0e4d, 0xee => 0x2122, 0xef => 0x0e4f, + 0xf0 => 0x0e50, 0xf1 => 0x0e51, 0xf2 => 0x0e52, 0xf3 => 0x0e53, + 0xf4 => 0x0e54, 0xf5 => 0x0e55, 0xf6 => 0x0e56, 0xf7 => 0x0e57, + 0xf8 => 0x0e58, 0xf9 => 0x0e59, 0xfa => 0xae, 0xfb => 0xa9, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/MacTurkish.pm b/lib/Image/ExifTool/Charset/MacTurkish.pm new file mode 100644 index 0000000..d95cb35 --- /dev/null +++ b/lib/Image/ExifTool/Charset/MacTurkish.pm @@ -0,0 +1,42 @@ +#------------------------------------------------------------------------------ +# File: MacTurkish.pm +# +# Description: Mac Turkish to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/TURKISH.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::MacTurkish = ( + 0x80 => 0xc4, 0x81 => 0xc5, 0x82 => 0xc7, 0x83 => 0xc9, 0x84 => 0xd1, + 0x85 => 0xd6, 0x86 => 0xdc, 0x87 => 0xe1, 0x88 => 0xe0, 0x89 => 0xe2, + 0x8a => 0xe4, 0x8b => 0xe3, 0x8c => 0xe5, 0x8d => 0xe7, 0x8e => 0xe9, + 0x8f => 0xe8, 0x90 => 0xea, 0x91 => 0xeb, 0x92 => 0xed, 0x93 => 0xec, + 0x94 => 0xee, 0x95 => 0xef, 0x96 => 0xf1, 0x97 => 0xf3, 0x98 => 0xf2, + 0x99 => 0xf4, 0x9a => 0xf6, 0x9b => 0xf5, 0x9c => 0xfa, 0x9d => 0xf9, + 0x9e => 0xfb, 0x9f => 0xfc, 0xa0 => 0x2020, 0xa1 => 0xb0, 0xa4 => 0xa7, + 0xa5 => 0x2022, 0xa6 => 0xb6, 0xa7 => 0xdf, 0xa8 => 0xae, 0xaa => 0x2122, + 0xab => 0xb4, 0xac => 0xa8, 0xad => 0x2260, 0xae => 0xc6, 0xaf => 0xd8, + 0xb0 => 0x221e, 0xb2 => 0x2264, 0xb3 => 0x2265, 0xb4 => 0xa5, 0xb6 => 0x2202, + 0xb7 => 0x2211, 0xb8 => 0x220f, 0xb9 => 0x03c0, 0xba => 0x222b, 0xbb => 0xaa, + 0xbc => 0xba, 0xbd => 0x03a9, 0xbe => 0xe6, 0xbf => 0xf8, 0xc0 => 0xbf, + 0xc1 => 0xa1, 0xc2 => 0xac, 0xc3 => 0x221a, 0xc4 => 0x0192, 0xc5 => 0x2248, + 0xc6 => 0x2206, 0xc7 => 0xab, 0xc8 => 0xbb, 0xc9 => 0x2026, 0xca => 0xa0, + 0xcb => 0xc0, 0xcc => 0xc3, 0xcd => 0xd5, 0xce => 0x0152, 0xcf => 0x0153, + 0xd0 => 0x2013, 0xd1 => 0x2014, 0xd2 => 0x201c, 0xd3 => 0x201d, + 0xd4 => 0x2018, 0xd5 => 0x2019, 0xd6 => 0xf7, 0xd7 => 0x25ca, 0xd8 => 0xff, + 0xd9 => 0x0178, 0xda => 0x011e, 0xdb => 0x011f, 0xdc => 0x0130, + 0xdd => 0x0131, 0xde => 0x015e, 0xdf => 0x015f, 0xe0 => 0x2021, 0xe1 => 0xb7, + 0xe2 => 0x201a, 0xe3 => 0x201e, 0xe4 => 0x2030, 0xe5 => 0xc2, 0xe6 => 0xca, + 0xe7 => 0xc1, 0xe8 => 0xcb, 0xe9 => 0xc8, 0xea => 0xcd, 0xeb => 0xce, + 0xec => 0xcf, 0xed => 0xcc, 0xee => 0xd3, 0xef => 0xd4, 0xf0 => 0xf8ff, + 0xf1 => 0xd2, 0xf2 => 0xda, 0xf3 => 0xdb, 0xf4 => 0xd9, 0xf5 => 0xf8a0, + 0xf6 => 0x02c6, 0xf7 => 0x02dc, 0xf8 => 0xaf, 0xf9 => 0x02d8, 0xfa => 0x02d9, + 0xfb => 0x02da, 0xfc => 0xb8, 0xfd => 0x02dd, 0xfe => 0x02db, 0xff => 0x02c7, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/PDFDoc.pm b/lib/Image/ExifTool/Charset/PDFDoc.pm new file mode 100644 index 0000000..83fa0e7 --- /dev/null +++ b/lib/Image/ExifTool/Charset/PDFDoc.pm @@ -0,0 +1,28 @@ +#------------------------------------------------------------------------------ +# File: PDFDoc.pm +# +# Description: PDFDocEncoding to Unicode +# +# Revisions: 2010/10/16 - P. Harvey created +# +# References: 1) http://www.adobe.com/devnet/pdf/pdf_reference.html +# +# Notes: The table omits 1-byte characters with the same values as Unicode +# This set re-maps characters with codepoints less than 0x80 +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::PDFDoc = ( + 0x18 => 0x02d8, 0x82 => 0x2021, 0x8c => 0x201e, 0x96 => 0x0152, + 0x19 => 0x02c7, 0x83 => 0x2026, 0x8d => 0x201c, 0x97 => 0x0160, + 0x1a => 0x02c6, 0x84 => 0x2014, 0x8e => 0x201d, 0x98 => 0x0178, + 0x1b => 0x02d9, 0x85 => 0x2013, 0x8f => 0x2018, 0x99 => 0x017d, + 0x1c => 0x02dd, 0x86 => 0x0192, 0x90 => 0x2019, 0x9a => 0x0131, + 0x1d => 0x02db, 0x87 => 0x2044, 0x91 => 0x201a, 0x9b => 0x0142, + 0x1e => 0x02da, 0x88 => 0x2039, 0x92 => 0x2122, 0x9c => 0x0153, + 0x1f => 0x02dc, 0x89 => 0x203a, 0x93 => 0xfb01, 0x9d => 0x0161, + 0x80 => 0x2022, 0x8a => 0x2212, 0x94 => 0xfb02, 0x9e => 0x017e, + 0x81 => 0x2020, 0x8b => 0x2030, 0x95 => 0x0141, 0xa0 => 0x20ac, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/ShiftJIS.pm b/lib/Image/ExifTool/Charset/ShiftJIS.pm new file mode 100644 index 0000000..d2a99d3 --- /dev/null +++ b/lib/Image/ExifTool/Charset/ShiftJIS.pm @@ -0,0 +1,1835 @@ +#------------------------------------------------------------------------------ +# File: ShiftJIS.pm +# +# Description: Shift-JIS to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# 2010/07/30 - P. Harvey fixed to use variable-width characters +# +# References: 1) http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFTJIS.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::ShiftJIS = ( + 0x5c => 0xa5, 0x7e => 0x203e, + 0x81 => { + 0x40 => 0x3000, 0x41 => 0x3001, 0x42 => 0x3002, 0x43 => 0xff0c, + 0x44 => 0xff0e, 0x45 => 0x30fb, 0x46 => 0xff1a, 0x47 => 0xff1b, + 0x48 => 0xff1f, 0x49 => 0xff01, 0x4a => 0x309b, 0x4b => 0x309c, + 0x4c => 0xb4, 0x4d => 0xff40, 0x4e => 0xa8, 0x4f => 0xff3e, 0x50 => 0xffe3, + 0x51 => 0xff3f, 0x52 => 0x30fd, 0x53 => 0x30fe, 0x54 => 0x309d, + 0x55 => 0x309e, 0x56 => 0x3003, 0x57 => 0x4edd, 0x58 => 0x3005, + 0x59 => 0x3006, 0x5a => 0x3007, 0x5b => 0x30fc, 0x5c => 0x2015, + 0x5d => 0x2010, 0x5e => 0xff0f, 0x5f => 0x5c, 0x60 => 0x301c, + 0x61 => 0x2016, 0x62 => 0xff5c, 0x63 => 0x2026, 0x64 => 0x2025, + 0x65 => 0x2018, 0x66 => 0x2019, 0x67 => 0x201c, 0x68 => 0x201d, + 0x69 => 0xff08, 0x6a => 0xff09, 0x6b => 0x3014, 0x6c => 0x3015, + 0x6d => 0xff3b, 0x6e => 0xff3d, 0x6f => 0xff5b, 0x70 => 0xff5d, + 0x71 => 0x3008, 0x72 => 0x3009, 0x73 => 0x300a, 0x74 => 0x300b, + 0x75 => 0x300c, 0x76 => 0x300d, 0x77 => 0x300e, 0x78 => 0x300f, + 0x79 => 0x3010, 0x7a => 0x3011, 0x7b => 0xff0b, 0x7c => 0x2212, + 0x7d => 0xb1, 0x7e => 0xd7, 0x80 => 0xf7, 0x81 => 0xff1d, 0x82 => 0x2260, + 0x83 => 0xff1c, 0x84 => 0xff1e, 0x85 => 0x2266, 0x86 => 0x2267, + 0x87 => 0x221e, 0x88 => 0x2234, 0x89 => 0x2642, 0x8a => 0x2640, + 0x8b => 0xb0, 0x8c => 0x2032, 0x8d => 0x2033, 0x8e => 0x2103, + 0x8f => 0xffe5, 0x90 => 0xff04, 0x91 => 0xa2, 0x92 => 0xa3, 0x93 => 0xff05, + 0x94 => 0xff03, 0x95 => 0xff06, 0x96 => 0xff0a, 0x97 => 0xff20, + 0x98 => 0xa7, 0x99 => 0x2606, 0x9a => 0x2605, 0x9b => 0x25cb, + 0x9c => 0x25cf, 0x9d => 0x25ce, 0x9e => 0x25c7, 0x9f => 0x25c6, + 0xa0 => 0x25a1, 0xa1 => 0x25a0, 0xa2 => 0x25b3, 0xa3 => 0x25b2, + 0xa4 => 0x25bd, 0xa5 => 0x25bc, 0xa6 => 0x203b, 0xa7 => 0x3012, + 0xa8 => 0x2192, 0xa9 => 0x2190, 0xaa => 0x2191, 0xab => 0x2193, + 0xac => 0x3013, 0xb8 => 0x2208, 0xb9 => 0x220b, 0xba => 0x2286, + 0xbb => 0x2287, 0xbc => 0x2282, 0xbd => 0x2283, 0xbe => 0x222a, + 0xbf => 0x2229, 0xc8 => 0x2227, 0xc9 => 0x2228, 0xca => 0xac, + 0xcb => 0x21d2, 0xcc => 0x21d4, 0xcd => 0x2200, 0xce => 0x2203, + 0xda => 0x2220, 0xdb => 0x22a5, 0xdc => 0x2312, 0xdd => 0x2202, + 0xde => 0x2207, 0xdf => 0x2261, 0xe0 => 0x2252, 0xe1 => 0x226a, + 0xe2 => 0x226b, 0xe3 => 0x221a, 0xe4 => 0x223d, 0xe5 => 0x221d, + 0xe6 => 0x2235, 0xe7 => 0x222b, 0xe8 => 0x222c, 0xf0 => 0x212b, + 0xf1 => 0x2030, 0xf2 => 0x266f, 0xf3 => 0x266d, 0xf4 => 0x266a, + 0xf5 => 0x2020, 0xf6 => 0x2021, 0xf7 => 0xb6, 0xfc => 0x25ef, + }, + 0x82 => { + 0x4f => 0xff10, 0x50 => 0xff11, 0x51 => 0xff12, 0x52 => 0xff13, + 0x53 => 0xff14, 0x54 => 0xff15, 0x55 => 0xff16, 0x56 => 0xff17, + 0x57 => 0xff18, 0x58 => 0xff19, 0x60 => 0xff21, 0x61 => 0xff22, + 0x62 => 0xff23, 0x63 => 0xff24, 0x64 => 0xff25, 0x65 => 0xff26, + 0x66 => 0xff27, 0x67 => 0xff28, 0x68 => 0xff29, 0x69 => 0xff2a, + 0x6a => 0xff2b, 0x6b => 0xff2c, 0x6c => 0xff2d, 0x6d => 0xff2e, + 0x6e => 0xff2f, 0x6f => 0xff30, 0x70 => 0xff31, 0x71 => 0xff32, + 0x72 => 0xff33, 0x73 => 0xff34, 0x74 => 0xff35, 0x75 => 0xff36, + 0x76 => 0xff37, 0x77 => 0xff38, 0x78 => 0xff39, 0x79 => 0xff3a, + 0x81 => 0xff41, 0x82 => 0xff42, 0x83 => 0xff43, 0x84 => 0xff44, + 0x85 => 0xff45, 0x86 => 0xff46, 0x87 => 0xff47, 0x88 => 0xff48, + 0x89 => 0xff49, 0x8a => 0xff4a, 0x8b => 0xff4b, 0x8c => 0xff4c, + 0x8d => 0xff4d, 0x8e => 0xff4e, 0x8f => 0xff4f, 0x90 => 0xff50, + 0x91 => 0xff51, 0x92 => 0xff52, 0x93 => 0xff53, 0x94 => 0xff54, + 0x95 => 0xff55, 0x96 => 0xff56, 0x97 => 0xff57, 0x98 => 0xff58, + 0x99 => 0xff59, 0x9a => 0xff5a, 0x9f => 0x3041, 0xa0 => 0x3042, + 0xa1 => 0x3043, 0xa2 => 0x3044, 0xa3 => 0x3045, 0xa4 => 0x3046, + 0xa5 => 0x3047, 0xa6 => 0x3048, 0xa7 => 0x3049, 0xa8 => 0x304a, + 0xa9 => 0x304b, 0xaa => 0x304c, 0xab => 0x304d, 0xac => 0x304e, + 0xad => 0x304f, 0xae => 0x3050, 0xaf => 0x3051, 0xb0 => 0x3052, + 0xb1 => 0x3053, 0xb2 => 0x3054, 0xb3 => 0x3055, 0xb4 => 0x3056, + 0xb5 => 0x3057, 0xb6 => 0x3058, 0xb7 => 0x3059, 0xb8 => 0x305a, + 0xb9 => 0x305b, 0xba => 0x305c, 0xbb => 0x305d, 0xbc => 0x305e, + 0xbd => 0x305f, 0xbe => 0x3060, 0xbf => 0x3061, 0xc0 => 0x3062, + 0xc1 => 0x3063, 0xc2 => 0x3064, 0xc3 => 0x3065, 0xc4 => 0x3066, + 0xc5 => 0x3067, 0xc6 => 0x3068, 0xc7 => 0x3069, 0xc8 => 0x306a, + 0xc9 => 0x306b, 0xca => 0x306c, 0xcb => 0x306d, 0xcc => 0x306e, + 0xcd => 0x306f, 0xce => 0x3070, 0xcf => 0x3071, 0xd0 => 0x3072, + 0xd1 => 0x3073, 0xd2 => 0x3074, 0xd3 => 0x3075, 0xd4 => 0x3076, + 0xd5 => 0x3077, 0xd6 => 0x3078, 0xd7 => 0x3079, 0xd8 => 0x307a, + 0xd9 => 0x307b, 0xda => 0x307c, 0xdb => 0x307d, 0xdc => 0x307e, + 0xdd => 0x307f, 0xde => 0x3080, 0xdf => 0x3081, 0xe0 => 0x3082, + 0xe1 => 0x3083, 0xe2 => 0x3084, 0xe3 => 0x3085, 0xe4 => 0x3086, + 0xe5 => 0x3087, 0xe6 => 0x3088, 0xe7 => 0x3089, 0xe8 => 0x308a, + 0xe9 => 0x308b, 0xea => 0x308c, 0xeb => 0x308d, 0xec => 0x308e, + 0xed => 0x308f, 0xee => 0x3090, 0xef => 0x3091, 0xf0 => 0x3092, + 0xf1 => 0x3093, + }, + 0x83 => { + 0x40 => 0x30a1, 0x41 => 0x30a2, 0x42 => 0x30a3, 0x43 => 0x30a4, + 0x44 => 0x30a5, 0x45 => 0x30a6, 0x46 => 0x30a7, 0x47 => 0x30a8, + 0x48 => 0x30a9, 0x49 => 0x30aa, 0x4a => 0x30ab, 0x4b => 0x30ac, + 0x4c => 0x30ad, 0x4d => 0x30ae, 0x4e => 0x30af, 0x4f => 0x30b0, + 0x50 => 0x30b1, 0x51 => 0x30b2, 0x52 => 0x30b3, 0x53 => 0x30b4, + 0x54 => 0x30b5, 0x55 => 0x30b6, 0x56 => 0x30b7, 0x57 => 0x30b8, + 0x58 => 0x30b9, 0x59 => 0x30ba, 0x5a => 0x30bb, 0x5b => 0x30bc, + 0x5c => 0x30bd, 0x5d => 0x30be, 0x5e => 0x30bf, 0x5f => 0x30c0, + 0x60 => 0x30c1, 0x61 => 0x30c2, 0x62 => 0x30c3, 0x63 => 0x30c4, + 0x64 => 0x30c5, 0x65 => 0x30c6, 0x66 => 0x30c7, 0x67 => 0x30c8, + 0x68 => 0x30c9, 0x69 => 0x30ca, 0x6a => 0x30cb, 0x6b => 0x30cc, + 0x6c => 0x30cd, 0x6d => 0x30ce, 0x6e => 0x30cf, 0x6f => 0x30d0, + 0x70 => 0x30d1, 0x71 => 0x30d2, 0x72 => 0x30d3, 0x73 => 0x30d4, + 0x74 => 0x30d5, 0x75 => 0x30d6, 0x76 => 0x30d7, 0x77 => 0x30d8, + 0x78 => 0x30d9, 0x79 => 0x30da, 0x7a => 0x30db, 0x7b => 0x30dc, + 0x7c => 0x30dd, 0x7d => 0x30de, 0x7e => 0x30df, 0x80 => 0x30e0, + 0x81 => 0x30e1, 0x82 => 0x30e2, 0x83 => 0x30e3, 0x84 => 0x30e4, + 0x85 => 0x30e5, 0x86 => 0x30e6, 0x87 => 0x30e7, 0x88 => 0x30e8, + 0x89 => 0x30e9, 0x8a => 0x30ea, 0x8b => 0x30eb, 0x8c => 0x30ec, + 0x8d => 0x30ed, 0x8e => 0x30ee, 0x8f => 0x30ef, 0x90 => 0x30f0, + 0x91 => 0x30f1, 0x92 => 0x30f2, 0x93 => 0x30f3, 0x94 => 0x30f4, + 0x95 => 0x30f5, 0x96 => 0x30f6, 0x9f => 0x0391, 0xa0 => 0x0392, + 0xa1 => 0x0393, 0xa2 => 0x0394, 0xa3 => 0x0395, 0xa4 => 0x0396, + 0xa5 => 0x0397, 0xa6 => 0x0398, 0xa7 => 0x0399, 0xa8 => 0x039a, + 0xa9 => 0x039b, 0xaa => 0x039c, 0xab => 0x039d, 0xac => 0x039e, + 0xad => 0x039f, 0xae => 0x03a0, 0xaf => 0x03a1, 0xb0 => 0x03a3, + 0xb1 => 0x03a4, 0xb2 => 0x03a5, 0xb3 => 0x03a6, 0xb4 => 0x03a7, + 0xb5 => 0x03a8, 0xb6 => 0x03a9, 0xbf => 0x03b1, 0xc0 => 0x03b2, + 0xc1 => 0x03b3, 0xc2 => 0x03b4, 0xc3 => 0x03b5, 0xc4 => 0x03b6, + 0xc5 => 0x03b7, 0xc6 => 0x03b8, 0xc7 => 0x03b9, 0xc8 => 0x03ba, + 0xc9 => 0x03bb, 0xca => 0x03bc, 0xcb => 0x03bd, 0xcc => 0x03be, + 0xcd => 0x03bf, 0xce => 0x03c0, 0xcf => 0x03c1, 0xd0 => 0x03c3, + 0xd1 => 0x03c4, 0xd2 => 0x03c5, 0xd3 => 0x03c6, 0xd4 => 0x03c7, + 0xd5 => 0x03c8, 0xd6 => 0x03c9, + }, + 0x84 => { + 0x40 => 0x0410, 0x41 => 0x0411, 0x42 => 0x0412, 0x43 => 0x0413, + 0x44 => 0x0414, 0x45 => 0x0415, 0x46 => 0x0401, 0x47 => 0x0416, + 0x48 => 0x0417, 0x49 => 0x0418, 0x4a => 0x0419, 0x4b => 0x041a, + 0x4c => 0x041b, 0x4d => 0x041c, 0x4e => 0x041d, 0x4f => 0x041e, + 0x50 => 0x041f, 0x51 => 0x0420, 0x52 => 0x0421, 0x53 => 0x0422, + 0x54 => 0x0423, 0x55 => 0x0424, 0x56 => 0x0425, 0x57 => 0x0426, + 0x58 => 0x0427, 0x59 => 0x0428, 0x5a => 0x0429, 0x5b => 0x042a, + 0x5c => 0x042b, 0x5d => 0x042c, 0x5e => 0x042d, 0x5f => 0x042e, + 0x60 => 0x042f, 0x70 => 0x0430, 0x71 => 0x0431, 0x72 => 0x0432, + 0x73 => 0x0433, 0x74 => 0x0434, 0x75 => 0x0435, 0x76 => 0x0451, + 0x77 => 0x0436, 0x78 => 0x0437, 0x79 => 0x0438, 0x7a => 0x0439, + 0x7b => 0x043a, 0x7c => 0x043b, 0x7d => 0x043c, 0x7e => 0x043d, + 0x80 => 0x043e, 0x81 => 0x043f, 0x82 => 0x0440, 0x83 => 0x0441, + 0x84 => 0x0442, 0x85 => 0x0443, 0x86 => 0x0444, 0x87 => 0x0445, + 0x88 => 0x0446, 0x89 => 0x0447, 0x8a => 0x0448, 0x8b => 0x0449, + 0x8c => 0x044a, 0x8d => 0x044b, 0x8e => 0x044c, 0x8f => 0x044d, + 0x90 => 0x044e, 0x91 => 0x044f, 0x9f => 0x2500, 0xa0 => 0x2502, + 0xa1 => 0x250c, 0xa2 => 0x2510, 0xa3 => 0x2518, 0xa4 => 0x2514, + 0xa5 => 0x251c, 0xa6 => 0x252c, 0xa7 => 0x2524, 0xa8 => 0x2534, + 0xa9 => 0x253c, 0xaa => 0x2501, 0xab => 0x2503, 0xac => 0x250f, + 0xad => 0x2513, 0xae => 0x251b, 0xaf => 0x2517, 0xb0 => 0x2523, + 0xb1 => 0x2533, 0xb2 => 0x252b, 0xb3 => 0x253b, 0xb4 => 0x254b, + 0xb5 => 0x2520, 0xb6 => 0x252f, 0xb7 => 0x2528, 0xb8 => 0x2537, + 0xb9 => 0x253f, 0xba => 0x251d, 0xbb => 0x2530, 0xbc => 0x2525, + 0xbd => 0x2538, 0xbe => 0x2542, + }, + 0x88 => { + 0x9f => 0x4e9c, 0xa0 => 0x5516, 0xa1 => 0x5a03, 0xa2 => 0x963f, + 0xa3 => 0x54c0, 0xa4 => 0x611b, 0xa5 => 0x6328, 0xa6 => 0x59f6, + 0xa7 => 0x9022, 0xa8 => 0x8475, 0xa9 => 0x831c, 0xaa => 0x7a50, + 0xab => 0x60aa, 0xac => 0x63e1, 0xad => 0x6e25, 0xae => 0x65ed, + 0xaf => 0x8466, 0xb0 => 0x82a6, 0xb1 => 0x9bf5, 0xb2 => 0x6893, + 0xb3 => 0x5727, 0xb4 => 0x65a1, 0xb5 => 0x6271, 0xb6 => 0x5b9b, + 0xb7 => 0x59d0, 0xb8 => 0x867b, 0xb9 => 0x98f4, 0xba => 0x7d62, + 0xbb => 0x7dbe, 0xbc => 0x9b8e, 0xbd => 0x6216, 0xbe => 0x7c9f, + 0xbf => 0x88b7, 0xc0 => 0x5b89, 0xc1 => 0x5eb5, 0xc2 => 0x6309, + 0xc3 => 0x6697, 0xc4 => 0x6848, 0xc5 => 0x95c7, 0xc6 => 0x978d, + 0xc7 => 0x674f, 0xc8 => 0x4ee5, 0xc9 => 0x4f0a, 0xca => 0x4f4d, + 0xcb => 0x4f9d, 0xcc => 0x5049, 0xcd => 0x56f2, 0xce => 0x5937, + 0xcf => 0x59d4, 0xd0 => 0x5a01, 0xd1 => 0x5c09, 0xd2 => 0x60df, + 0xd3 => 0x610f, 0xd4 => 0x6170, 0xd5 => 0x6613, 0xd6 => 0x6905, + 0xd7 => 0x70ba, 0xd8 => 0x754f, 0xd9 => 0x7570, 0xda => 0x79fb, + 0xdb => 0x7dad, 0xdc => 0x7def, 0xdd => 0x80c3, 0xde => 0x840e, + 0xdf => 0x8863, 0xe0 => 0x8b02, 0xe1 => 0x9055, 0xe2 => 0x907a, + 0xe3 => 0x533b, 0xe4 => 0x4e95, 0xe5 => 0x4ea5, 0xe6 => 0x57df, + 0xe7 => 0x80b2, 0xe8 => 0x90c1, 0xe9 => 0x78ef, 0xea => 0x4e00, + 0xeb => 0x58f1, 0xec => 0x6ea2, 0xed => 0x9038, 0xee => 0x7a32, + 0xef => 0x8328, 0xf0 => 0x828b, 0xf1 => 0x9c2f, 0xf2 => 0x5141, + 0xf3 => 0x5370, 0xf4 => 0x54bd, 0xf5 => 0x54e1, 0xf6 => 0x56e0, + 0xf7 => 0x59fb, 0xf8 => 0x5f15, 0xf9 => 0x98f2, 0xfa => 0x6deb, + 0xfb => 0x80e4, 0xfc => 0x852d, + }, + 0x89 => { + 0x40 => 0x9662, 0x41 => 0x9670, 0x42 => 0x96a0, 0x43 => 0x97fb, + 0x44 => 0x540b, 0x45 => 0x53f3, 0x46 => 0x5b87, 0x47 => 0x70cf, + 0x48 => 0x7fbd, 0x49 => 0x8fc2, 0x4a => 0x96e8, 0x4b => 0x536f, + 0x4c => 0x9d5c, 0x4d => 0x7aba, 0x4e => 0x4e11, 0x4f => 0x7893, + 0x50 => 0x81fc, 0x51 => 0x6e26, 0x52 => 0x5618, 0x53 => 0x5504, + 0x54 => 0x6b1d, 0x55 => 0x851a, 0x56 => 0x9c3b, 0x57 => 0x59e5, + 0x58 => 0x53a9, 0x59 => 0x6d66, 0x5a => 0x74dc, 0x5b => 0x958f, + 0x5c => 0x5642, 0x5d => 0x4e91, 0x5e => 0x904b, 0x5f => 0x96f2, + 0x60 => 0x834f, 0x61 => 0x990c, 0x62 => 0x53e1, 0x63 => 0x55b6, + 0x64 => 0x5b30, 0x65 => 0x5f71, 0x66 => 0x6620, 0x67 => 0x66f3, + 0x68 => 0x6804, 0x69 => 0x6c38, 0x6a => 0x6cf3, 0x6b => 0x6d29, + 0x6c => 0x745b, 0x6d => 0x76c8, 0x6e => 0x7a4e, 0x6f => 0x9834, + 0x70 => 0x82f1, 0x71 => 0x885b, 0x72 => 0x8a60, 0x73 => 0x92ed, + 0x74 => 0x6db2, 0x75 => 0x75ab, 0x76 => 0x76ca, 0x77 => 0x99c5, + 0x78 => 0x60a6, 0x79 => 0x8b01, 0x7a => 0x8d8a, 0x7b => 0x95b2, + 0x7c => 0x698e, 0x7d => 0x53ad, 0x7e => 0x5186, 0x80 => 0x5712, + 0x81 => 0x5830, 0x82 => 0x5944, 0x83 => 0x5bb4, 0x84 => 0x5ef6, + 0x85 => 0x6028, 0x86 => 0x63a9, 0x87 => 0x63f4, 0x88 => 0x6cbf, + 0x89 => 0x6f14, 0x8a => 0x708e, 0x8b => 0x7114, 0x8c => 0x7159, + 0x8d => 0x71d5, 0x8e => 0x733f, 0x8f => 0x7e01, 0x90 => 0x8276, + 0x91 => 0x82d1, 0x92 => 0x8597, 0x93 => 0x9060, 0x94 => 0x925b, + 0x95 => 0x9d1b, 0x96 => 0x5869, 0x97 => 0x65bc, 0x98 => 0x6c5a, + 0x99 => 0x7525, 0x9a => 0x51f9, 0x9b => 0x592e, 0x9c => 0x5965, + 0x9d => 0x5f80, 0x9e => 0x5fdc, 0x9f => 0x62bc, 0xa0 => 0x65fa, + 0xa1 => 0x6a2a, 0xa2 => 0x6b27, 0xa3 => 0x6bb4, 0xa4 => 0x738b, + 0xa5 => 0x7fc1, 0xa6 => 0x8956, 0xa7 => 0x9d2c, 0xa8 => 0x9d0e, + 0xa9 => 0x9ec4, 0xaa => 0x5ca1, 0xab => 0x6c96, 0xac => 0x837b, + 0xad => 0x5104, 0xae => 0x5c4b, 0xaf => 0x61b6, 0xb0 => 0x81c6, + 0xb1 => 0x6876, 0xb2 => 0x7261, 0xb3 => 0x4e59, 0xb4 => 0x4ffa, + 0xb5 => 0x5378, 0xb6 => 0x6069, 0xb7 => 0x6e29, 0xb8 => 0x7a4f, + 0xb9 => 0x97f3, 0xba => 0x4e0b, 0xbb => 0x5316, 0xbc => 0x4eee, + 0xbd => 0x4f55, 0xbe => 0x4f3d, 0xbf => 0x4fa1, 0xc0 => 0x4f73, + 0xc1 => 0x52a0, 0xc2 => 0x53ef, 0xc3 => 0x5609, 0xc4 => 0x590f, + 0xc5 => 0x5ac1, 0xc6 => 0x5bb6, 0xc7 => 0x5be1, 0xc8 => 0x79d1, + 0xc9 => 0x6687, 0xca => 0x679c, 0xcb => 0x67b6, 0xcc => 0x6b4c, + 0xcd => 0x6cb3, 0xce => 0x706b, 0xcf => 0x73c2, 0xd0 => 0x798d, + 0xd1 => 0x79be, 0xd2 => 0x7a3c, 0xd3 => 0x7b87, 0xd4 => 0x82b1, + 0xd5 => 0x82db, 0xd6 => 0x8304, 0xd7 => 0x8377, 0xd8 => 0x83ef, + 0xd9 => 0x83d3, 0xda => 0x8766, 0xdb => 0x8ab2, 0xdc => 0x5629, + 0xdd => 0x8ca8, 0xde => 0x8fe6, 0xdf => 0x904e, 0xe0 => 0x971e, + 0xe1 => 0x868a, 0xe2 => 0x4fc4, 0xe3 => 0x5ce8, 0xe4 => 0x6211, + 0xe5 => 0x7259, 0xe6 => 0x753b, 0xe7 => 0x81e5, 0xe8 => 0x82bd, + 0xe9 => 0x86fe, 0xea => 0x8cc0, 0xeb => 0x96c5, 0xec => 0x9913, + 0xed => 0x99d5, 0xee => 0x4ecb, 0xef => 0x4f1a, 0xf0 => 0x89e3, + 0xf1 => 0x56de, 0xf2 => 0x584a, 0xf3 => 0x58ca, 0xf4 => 0x5efb, + 0xf5 => 0x5feb, 0xf6 => 0x602a, 0xf7 => 0x6094, 0xf8 => 0x6062, + 0xf9 => 0x61d0, 0xfa => 0x6212, 0xfb => 0x62d0, 0xfc => 0x6539, + }, + 0x8a => { + 0x40 => 0x9b41, 0x41 => 0x6666, 0x42 => 0x68b0, 0x43 => 0x6d77, + 0x44 => 0x7070, 0x45 => 0x754c, 0x46 => 0x7686, 0x47 => 0x7d75, + 0x48 => 0x82a5, 0x49 => 0x87f9, 0x4a => 0x958b, 0x4b => 0x968e, + 0x4c => 0x8c9d, 0x4d => 0x51f1, 0x4e => 0x52be, 0x4f => 0x5916, + 0x50 => 0x54b3, 0x51 => 0x5bb3, 0x52 => 0x5d16, 0x53 => 0x6168, + 0x54 => 0x6982, 0x55 => 0x6daf, 0x56 => 0x788d, 0x57 => 0x84cb, + 0x58 => 0x8857, 0x59 => 0x8a72, 0x5a => 0x93a7, 0x5b => 0x9ab8, + 0x5c => 0x6d6c, 0x5d => 0x99a8, 0x5e => 0x86d9, 0x5f => 0x57a3, + 0x60 => 0x67ff, 0x61 => 0x86ce, 0x62 => 0x920e, 0x63 => 0x5283, + 0x64 => 0x5687, 0x65 => 0x5404, 0x66 => 0x5ed3, 0x67 => 0x62e1, + 0x68 => 0x64b9, 0x69 => 0x683c, 0x6a => 0x6838, 0x6b => 0x6bbb, + 0x6c => 0x7372, 0x6d => 0x78ba, 0x6e => 0x7a6b, 0x6f => 0x899a, + 0x70 => 0x89d2, 0x71 => 0x8d6b, 0x72 => 0x8f03, 0x73 => 0x90ed, + 0x74 => 0x95a3, 0x75 => 0x9694, 0x76 => 0x9769, 0x77 => 0x5b66, + 0x78 => 0x5cb3, 0x79 => 0x697d, 0x7a => 0x984d, 0x7b => 0x984e, + 0x7c => 0x639b, 0x7d => 0x7b20, 0x7e => 0x6a2b, 0x80 => 0x6a7f, + 0x81 => 0x68b6, 0x82 => 0x9c0d, 0x83 => 0x6f5f, 0x84 => 0x5272, + 0x85 => 0x559d, 0x86 => 0x6070, 0x87 => 0x62ec, 0x88 => 0x6d3b, + 0x89 => 0x6e07, 0x8a => 0x6ed1, 0x8b => 0x845b, 0x8c => 0x8910, + 0x8d => 0x8f44, 0x8e => 0x4e14, 0x8f => 0x9c39, 0x90 => 0x53f6, + 0x91 => 0x691b, 0x92 => 0x6a3a, 0x93 => 0x9784, 0x94 => 0x682a, + 0x95 => 0x515c, 0x96 => 0x7ac3, 0x97 => 0x84b2, 0x98 => 0x91dc, + 0x99 => 0x938c, 0x9a => 0x565b, 0x9b => 0x9d28, 0x9c => 0x6822, + 0x9d => 0x8305, 0x9e => 0x8431, 0x9f => 0x7ca5, 0xa0 => 0x5208, + 0xa1 => 0x82c5, 0xa2 => 0x74e6, 0xa3 => 0x4e7e, 0xa4 => 0x4f83, + 0xa5 => 0x51a0, 0xa6 => 0x5bd2, 0xa7 => 0x520a, 0xa8 => 0x52d8, + 0xa9 => 0x52e7, 0xaa => 0x5dfb, 0xab => 0x559a, 0xac => 0x582a, + 0xad => 0x59e6, 0xae => 0x5b8c, 0xaf => 0x5b98, 0xb0 => 0x5bdb, + 0xb1 => 0x5e72, 0xb2 => 0x5e79, 0xb3 => 0x60a3, 0xb4 => 0x611f, + 0xb5 => 0x6163, 0xb6 => 0x61be, 0xb7 => 0x63db, 0xb8 => 0x6562, + 0xb9 => 0x67d1, 0xba => 0x6853, 0xbb => 0x68fa, 0xbc => 0x6b3e, + 0xbd => 0x6b53, 0xbe => 0x6c57, 0xbf => 0x6f22, 0xc0 => 0x6f97, + 0xc1 => 0x6f45, 0xc2 => 0x74b0, 0xc3 => 0x7518, 0xc4 => 0x76e3, + 0xc5 => 0x770b, 0xc6 => 0x7aff, 0xc7 => 0x7ba1, 0xc8 => 0x7c21, + 0xc9 => 0x7de9, 0xca => 0x7f36, 0xcb => 0x7ff0, 0xcc => 0x809d, + 0xcd => 0x8266, 0xce => 0x839e, 0xcf => 0x89b3, 0xd0 => 0x8acc, + 0xd1 => 0x8cab, 0xd2 => 0x9084, 0xd3 => 0x9451, 0xd4 => 0x9593, + 0xd5 => 0x9591, 0xd6 => 0x95a2, 0xd7 => 0x9665, 0xd8 => 0x97d3, + 0xd9 => 0x9928, 0xda => 0x8218, 0xdb => 0x4e38, 0xdc => 0x542b, + 0xdd => 0x5cb8, 0xde => 0x5dcc, 0xdf => 0x73a9, 0xe0 => 0x764c, + 0xe1 => 0x773c, 0xe2 => 0x5ca9, 0xe3 => 0x7feb, 0xe4 => 0x8d0b, + 0xe5 => 0x96c1, 0xe6 => 0x9811, 0xe7 => 0x9854, 0xe8 => 0x9858, + 0xe9 => 0x4f01, 0xea => 0x4f0e, 0xeb => 0x5371, 0xec => 0x559c, + 0xed => 0x5668, 0xee => 0x57fa, 0xef => 0x5947, 0xf0 => 0x5b09, + 0xf1 => 0x5bc4, 0xf2 => 0x5c90, 0xf3 => 0x5e0c, 0xf4 => 0x5e7e, + 0xf5 => 0x5fcc, 0xf6 => 0x63ee, 0xf7 => 0x673a, 0xf8 => 0x65d7, + 0xf9 => 0x65e2, 0xfa => 0x671f, 0xfb => 0x68cb, 0xfc => 0x68c4, + }, + 0x8b => { + 0x40 => 0x6a5f, 0x41 => 0x5e30, 0x42 => 0x6bc5, 0x43 => 0x6c17, + 0x44 => 0x6c7d, 0x45 => 0x757f, 0x46 => 0x7948, 0x47 => 0x5b63, + 0x48 => 0x7a00, 0x49 => 0x7d00, 0x4a => 0x5fbd, 0x4b => 0x898f, + 0x4c => 0x8a18, 0x4d => 0x8cb4, 0x4e => 0x8d77, 0x4f => 0x8ecc, + 0x50 => 0x8f1d, 0x51 => 0x98e2, 0x52 => 0x9a0e, 0x53 => 0x9b3c, + 0x54 => 0x4e80, 0x55 => 0x507d, 0x56 => 0x5100, 0x57 => 0x5993, + 0x58 => 0x5b9c, 0x59 => 0x622f, 0x5a => 0x6280, 0x5b => 0x64ec, + 0x5c => 0x6b3a, 0x5d => 0x72a0, 0x5e => 0x7591, 0x5f => 0x7947, + 0x60 => 0x7fa9, 0x61 => 0x87fb, 0x62 => 0x8abc, 0x63 => 0x8b70, + 0x64 => 0x63ac, 0x65 => 0x83ca, 0x66 => 0x97a0, 0x67 => 0x5409, + 0x68 => 0x5403, 0x69 => 0x55ab, 0x6a => 0x6854, 0x6b => 0x6a58, + 0x6c => 0x8a70, 0x6d => 0x7827, 0x6e => 0x6775, 0x6f => 0x9ecd, + 0x70 => 0x5374, 0x71 => 0x5ba2, 0x72 => 0x811a, 0x73 => 0x8650, + 0x74 => 0x9006, 0x75 => 0x4e18, 0x76 => 0x4e45, 0x77 => 0x4ec7, + 0x78 => 0x4f11, 0x79 => 0x53ca, 0x7a => 0x5438, 0x7b => 0x5bae, + 0x7c => 0x5f13, 0x7d => 0x6025, 0x7e => 0x6551, 0x80 => 0x673d, + 0x81 => 0x6c42, 0x82 => 0x6c72, 0x83 => 0x6ce3, 0x84 => 0x7078, + 0x85 => 0x7403, 0x86 => 0x7a76, 0x87 => 0x7aae, 0x88 => 0x7b08, + 0x89 => 0x7d1a, 0x8a => 0x7cfe, 0x8b => 0x7d66, 0x8c => 0x65e7, + 0x8d => 0x725b, 0x8e => 0x53bb, 0x8f => 0x5c45, 0x90 => 0x5de8, + 0x91 => 0x62d2, 0x92 => 0x62e0, 0x93 => 0x6319, 0x94 => 0x6e20, + 0x95 => 0x865a, 0x96 => 0x8a31, 0x97 => 0x8ddd, 0x98 => 0x92f8, + 0x99 => 0x6f01, 0x9a => 0x79a6, 0x9b => 0x9b5a, 0x9c => 0x4ea8, + 0x9d => 0x4eab, 0x9e => 0x4eac, 0x9f => 0x4f9b, 0xa0 => 0x4fa0, + 0xa1 => 0x50d1, 0xa2 => 0x5147, 0xa3 => 0x7af6, 0xa4 => 0x5171, + 0xa5 => 0x51f6, 0xa6 => 0x5354, 0xa7 => 0x5321, 0xa8 => 0x537f, + 0xa9 => 0x53eb, 0xaa => 0x55ac, 0xab => 0x5883, 0xac => 0x5ce1, + 0xad => 0x5f37, 0xae => 0x5f4a, 0xaf => 0x602f, 0xb0 => 0x6050, + 0xb1 => 0x606d, 0xb2 => 0x631f, 0xb3 => 0x6559, 0xb4 => 0x6a4b, + 0xb5 => 0x6cc1, 0xb6 => 0x72c2, 0xb7 => 0x72ed, 0xb8 => 0x77ef, + 0xb9 => 0x80f8, 0xba => 0x8105, 0xbb => 0x8208, 0xbc => 0x854e, + 0xbd => 0x90f7, 0xbe => 0x93e1, 0xbf => 0x97ff, 0xc0 => 0x9957, + 0xc1 => 0x9a5a, 0xc2 => 0x4ef0, 0xc3 => 0x51dd, 0xc4 => 0x5c2d, + 0xc5 => 0x6681, 0xc6 => 0x696d, 0xc7 => 0x5c40, 0xc8 => 0x66f2, + 0xc9 => 0x6975, 0xca => 0x7389, 0xcb => 0x6850, 0xcc => 0x7c81, + 0xcd => 0x50c5, 0xce => 0x52e4, 0xcf => 0x5747, 0xd0 => 0x5dfe, + 0xd1 => 0x9326, 0xd2 => 0x65a4, 0xd3 => 0x6b23, 0xd4 => 0x6b3d, + 0xd5 => 0x7434, 0xd6 => 0x7981, 0xd7 => 0x79bd, 0xd8 => 0x7b4b, + 0xd9 => 0x7dca, 0xda => 0x82b9, 0xdb => 0x83cc, 0xdc => 0x887f, + 0xdd => 0x895f, 0xde => 0x8b39, 0xdf => 0x8fd1, 0xe0 => 0x91d1, + 0xe1 => 0x541f, 0xe2 => 0x9280, 0xe3 => 0x4e5d, 0xe4 => 0x5036, + 0xe5 => 0x53e5, 0xe6 => 0x533a, 0xe7 => 0x72d7, 0xe8 => 0x7396, + 0xe9 => 0x77e9, 0xea => 0x82e6, 0xeb => 0x8eaf, 0xec => 0x99c6, + 0xed => 0x99c8, 0xee => 0x99d2, 0xef => 0x5177, 0xf0 => 0x611a, + 0xf1 => 0x865e, 0xf2 => 0x55b0, 0xf3 => 0x7a7a, 0xf4 => 0x5076, + 0xf5 => 0x5bd3, 0xf6 => 0x9047, 0xf7 => 0x9685, 0xf8 => 0x4e32, + 0xf9 => 0x6adb, 0xfa => 0x91e7, 0xfb => 0x5c51, 0xfc => 0x5c48, + }, + 0x8c => { + 0x40 => 0x6398, 0x41 => 0x7a9f, 0x42 => 0x6c93, 0x43 => 0x9774, + 0x44 => 0x8f61, 0x45 => 0x7aaa, 0x46 => 0x718a, 0x47 => 0x9688, + 0x48 => 0x7c82, 0x49 => 0x6817, 0x4a => 0x7e70, 0x4b => 0x6851, + 0x4c => 0x936c, 0x4d => 0x52f2, 0x4e => 0x541b, 0x4f => 0x85ab, + 0x50 => 0x8a13, 0x51 => 0x7fa4, 0x52 => 0x8ecd, 0x53 => 0x90e1, + 0x54 => 0x5366, 0x55 => 0x8888, 0x56 => 0x7941, 0x57 => 0x4fc2, + 0x58 => 0x50be, 0x59 => 0x5211, 0x5a => 0x5144, 0x5b => 0x5553, + 0x5c => 0x572d, 0x5d => 0x73ea, 0x5e => 0x578b, 0x5f => 0x5951, + 0x60 => 0x5f62, 0x61 => 0x5f84, 0x62 => 0x6075, 0x63 => 0x6176, + 0x64 => 0x6167, 0x65 => 0x61a9, 0x66 => 0x63b2, 0x67 => 0x643a, + 0x68 => 0x656c, 0x69 => 0x666f, 0x6a => 0x6842, 0x6b => 0x6e13, + 0x6c => 0x7566, 0x6d => 0x7a3d, 0x6e => 0x7cfb, 0x6f => 0x7d4c, + 0x70 => 0x7d99, 0x71 => 0x7e4b, 0x72 => 0x7f6b, 0x73 => 0x830e, + 0x74 => 0x834a, 0x75 => 0x86cd, 0x76 => 0x8a08, 0x77 => 0x8a63, + 0x78 => 0x8b66, 0x79 => 0x8efd, 0x7a => 0x981a, 0x7b => 0x9d8f, + 0x7c => 0x82b8, 0x7d => 0x8fce, 0x7e => 0x9be8, 0x80 => 0x5287, + 0x81 => 0x621f, 0x82 => 0x6483, 0x83 => 0x6fc0, 0x84 => 0x9699, + 0x85 => 0x6841, 0x86 => 0x5091, 0x87 => 0x6b20, 0x88 => 0x6c7a, + 0x89 => 0x6f54, 0x8a => 0x7a74, 0x8b => 0x7d50, 0x8c => 0x8840, + 0x8d => 0x8a23, 0x8e => 0x6708, 0x8f => 0x4ef6, 0x90 => 0x5039, + 0x91 => 0x5026, 0x92 => 0x5065, 0x93 => 0x517c, 0x94 => 0x5238, + 0x95 => 0x5263, 0x96 => 0x55a7, 0x97 => 0x570f, 0x98 => 0x5805, + 0x99 => 0x5acc, 0x9a => 0x5efa, 0x9b => 0x61b2, 0x9c => 0x61f8, + 0x9d => 0x62f3, 0x9e => 0x6372, 0x9f => 0x691c, 0xa0 => 0x6a29, + 0xa1 => 0x727d, 0xa2 => 0x72ac, 0xa3 => 0x732e, 0xa4 => 0x7814, + 0xa5 => 0x786f, 0xa6 => 0x7d79, 0xa7 => 0x770c, 0xa8 => 0x80a9, + 0xa9 => 0x898b, 0xaa => 0x8b19, 0xab => 0x8ce2, 0xac => 0x8ed2, + 0xad => 0x9063, 0xae => 0x9375, 0xaf => 0x967a, 0xb0 => 0x9855, + 0xb1 => 0x9a13, 0xb2 => 0x9e78, 0xb3 => 0x5143, 0xb4 => 0x539f, + 0xb5 => 0x53b3, 0xb6 => 0x5e7b, 0xb7 => 0x5f26, 0xb8 => 0x6e1b, + 0xb9 => 0x6e90, 0xba => 0x7384, 0xbb => 0x73fe, 0xbc => 0x7d43, + 0xbd => 0x8237, 0xbe => 0x8a00, 0xbf => 0x8afa, 0xc0 => 0x9650, + 0xc1 => 0x4e4e, 0xc2 => 0x500b, 0xc3 => 0x53e4, 0xc4 => 0x547c, + 0xc5 => 0x56fa, 0xc6 => 0x59d1, 0xc7 => 0x5b64, 0xc8 => 0x5df1, + 0xc9 => 0x5eab, 0xca => 0x5f27, 0xcb => 0x6238, 0xcc => 0x6545, + 0xcd => 0x67af, 0xce => 0x6e56, 0xcf => 0x72d0, 0xd0 => 0x7cca, + 0xd1 => 0x88b4, 0xd2 => 0x80a1, 0xd3 => 0x80e1, 0xd4 => 0x83f0, + 0xd5 => 0x864e, 0xd6 => 0x8a87, 0xd7 => 0x8de8, 0xd8 => 0x9237, + 0xd9 => 0x96c7, 0xda => 0x9867, 0xdb => 0x9f13, 0xdc => 0x4e94, + 0xdd => 0x4e92, 0xde => 0x4f0d, 0xdf => 0x5348, 0xe0 => 0x5449, + 0xe1 => 0x543e, 0xe2 => 0x5a2f, 0xe3 => 0x5f8c, 0xe4 => 0x5fa1, + 0xe5 => 0x609f, 0xe6 => 0x68a7, 0xe7 => 0x6a8e, 0xe8 => 0x745a, + 0xe9 => 0x7881, 0xea => 0x8a9e, 0xeb => 0x8aa4, 0xec => 0x8b77, + 0xed => 0x9190, 0xee => 0x4e5e, 0xef => 0x9bc9, 0xf0 => 0x4ea4, + 0xf1 => 0x4f7c, 0xf2 => 0x4faf, 0xf3 => 0x5019, 0xf4 => 0x5016, + 0xf5 => 0x5149, 0xf6 => 0x516c, 0xf7 => 0x529f, 0xf8 => 0x52b9, + 0xf9 => 0x52fe, 0xfa => 0x539a, 0xfb => 0x53e3, 0xfc => 0x5411, + }, + 0x8d => { + 0x40 => 0x540e, 0x41 => 0x5589, 0x42 => 0x5751, 0x43 => 0x57a2, + 0x44 => 0x597d, 0x45 => 0x5b54, 0x46 => 0x5b5d, 0x47 => 0x5b8f, + 0x48 => 0x5de5, 0x49 => 0x5de7, 0x4a => 0x5df7, 0x4b => 0x5e78, + 0x4c => 0x5e83, 0x4d => 0x5e9a, 0x4e => 0x5eb7, 0x4f => 0x5f18, + 0x50 => 0x6052, 0x51 => 0x614c, 0x52 => 0x6297, 0x53 => 0x62d8, + 0x54 => 0x63a7, 0x55 => 0x653b, 0x56 => 0x6602, 0x57 => 0x6643, + 0x58 => 0x66f4, 0x59 => 0x676d, 0x5a => 0x6821, 0x5b => 0x6897, + 0x5c => 0x69cb, 0x5d => 0x6c5f, 0x5e => 0x6d2a, 0x5f => 0x6d69, + 0x60 => 0x6e2f, 0x61 => 0x6e9d, 0x62 => 0x7532, 0x63 => 0x7687, + 0x64 => 0x786c, 0x65 => 0x7a3f, 0x66 => 0x7ce0, 0x67 => 0x7d05, + 0x68 => 0x7d18, 0x69 => 0x7d5e, 0x6a => 0x7db1, 0x6b => 0x8015, + 0x6c => 0x8003, 0x6d => 0x80af, 0x6e => 0x80b1, 0x6f => 0x8154, + 0x70 => 0x818f, 0x71 => 0x822a, 0x72 => 0x8352, 0x73 => 0x884c, + 0x74 => 0x8861, 0x75 => 0x8b1b, 0x76 => 0x8ca2, 0x77 => 0x8cfc, + 0x78 => 0x90ca, 0x79 => 0x9175, 0x7a => 0x9271, 0x7b => 0x783f, + 0x7c => 0x92fc, 0x7d => 0x95a4, 0x7e => 0x964d, 0x80 => 0x9805, + 0x81 => 0x9999, 0x82 => 0x9ad8, 0x83 => 0x9d3b, 0x84 => 0x525b, + 0x85 => 0x52ab, 0x86 => 0x53f7, 0x87 => 0x5408, 0x88 => 0x58d5, + 0x89 => 0x62f7, 0x8a => 0x6fe0, 0x8b => 0x8c6a, 0x8c => 0x8f5f, + 0x8d => 0x9eb9, 0x8e => 0x514b, 0x8f => 0x523b, 0x90 => 0x544a, + 0x91 => 0x56fd, 0x92 => 0x7a40, 0x93 => 0x9177, 0x94 => 0x9d60, + 0x95 => 0x9ed2, 0x96 => 0x7344, 0x97 => 0x6f09, 0x98 => 0x8170, + 0x99 => 0x7511, 0x9a => 0x5ffd, 0x9b => 0x60da, 0x9c => 0x9aa8, + 0x9d => 0x72db, 0x9e => 0x8fbc, 0x9f => 0x6b64, 0xa0 => 0x9803, + 0xa1 => 0x4eca, 0xa2 => 0x56f0, 0xa3 => 0x5764, 0xa4 => 0x58be, + 0xa5 => 0x5a5a, 0xa6 => 0x6068, 0xa7 => 0x61c7, 0xa8 => 0x660f, + 0xa9 => 0x6606, 0xaa => 0x6839, 0xab => 0x68b1, 0xac => 0x6df7, + 0xad => 0x75d5, 0xae => 0x7d3a, 0xaf => 0x826e, 0xb0 => 0x9b42, + 0xb1 => 0x4e9b, 0xb2 => 0x4f50, 0xb3 => 0x53c9, 0xb4 => 0x5506, + 0xb5 => 0x5d6f, 0xb6 => 0x5de6, 0xb7 => 0x5dee, 0xb8 => 0x67fb, + 0xb9 => 0x6c99, 0xba => 0x7473, 0xbb => 0x7802, 0xbc => 0x8a50, + 0xbd => 0x9396, 0xbe => 0x88df, 0xbf => 0x5750, 0xc0 => 0x5ea7, + 0xc1 => 0x632b, 0xc2 => 0x50b5, 0xc3 => 0x50ac, 0xc4 => 0x518d, + 0xc5 => 0x6700, 0xc6 => 0x54c9, 0xc7 => 0x585e, 0xc8 => 0x59bb, + 0xc9 => 0x5bb0, 0xca => 0x5f69, 0xcb => 0x624d, 0xcc => 0x63a1, + 0xcd => 0x683d, 0xce => 0x6b73, 0xcf => 0x6e08, 0xd0 => 0x707d, + 0xd1 => 0x91c7, 0xd2 => 0x7280, 0xd3 => 0x7815, 0xd4 => 0x7826, + 0xd5 => 0x796d, 0xd6 => 0x658e, 0xd7 => 0x7d30, 0xd8 => 0x83dc, + 0xd9 => 0x88c1, 0xda => 0x8f09, 0xdb => 0x969b, 0xdc => 0x5264, + 0xdd => 0x5728, 0xde => 0x6750, 0xdf => 0x7f6a, 0xe0 => 0x8ca1, + 0xe1 => 0x51b4, 0xe2 => 0x5742, 0xe3 => 0x962a, 0xe4 => 0x583a, + 0xe5 => 0x698a, 0xe6 => 0x80b4, 0xe7 => 0x54b2, 0xe8 => 0x5d0e, + 0xe9 => 0x57fc, 0xea => 0x7895, 0xeb => 0x9dfa, 0xec => 0x4f5c, + 0xed => 0x524a, 0xee => 0x548b, 0xef => 0x643e, 0xf0 => 0x6628, + 0xf1 => 0x6714, 0xf2 => 0x67f5, 0xf3 => 0x7a84, 0xf4 => 0x7b56, + 0xf5 => 0x7d22, 0xf6 => 0x932f, 0xf7 => 0x685c, 0xf8 => 0x9bad, + 0xf9 => 0x7b39, 0xfa => 0x5319, 0xfb => 0x518a, 0xfc => 0x5237, + }, + 0x8e => { + 0x40 => 0x5bdf, 0x41 => 0x62f6, 0x42 => 0x64ae, 0x43 => 0x64e6, + 0x44 => 0x672d, 0x45 => 0x6bba, 0x46 => 0x85a9, 0x47 => 0x96d1, + 0x48 => 0x7690, 0x49 => 0x9bd6, 0x4a => 0x634c, 0x4b => 0x9306, + 0x4c => 0x9bab, 0x4d => 0x76bf, 0x4e => 0x6652, 0x4f => 0x4e09, + 0x50 => 0x5098, 0x51 => 0x53c2, 0x52 => 0x5c71, 0x53 => 0x60e8, + 0x54 => 0x6492, 0x55 => 0x6563, 0x56 => 0x685f, 0x57 => 0x71e6, + 0x58 => 0x73ca, 0x59 => 0x7523, 0x5a => 0x7b97, 0x5b => 0x7e82, + 0x5c => 0x8695, 0x5d => 0x8b83, 0x5e => 0x8cdb, 0x5f => 0x9178, + 0x60 => 0x9910, 0x61 => 0x65ac, 0x62 => 0x66ab, 0x63 => 0x6b8b, + 0x64 => 0x4ed5, 0x65 => 0x4ed4, 0x66 => 0x4f3a, 0x67 => 0x4f7f, + 0x68 => 0x523a, 0x69 => 0x53f8, 0x6a => 0x53f2, 0x6b => 0x55e3, + 0x6c => 0x56db, 0x6d => 0x58eb, 0x6e => 0x59cb, 0x6f => 0x59c9, + 0x70 => 0x59ff, 0x71 => 0x5b50, 0x72 => 0x5c4d, 0x73 => 0x5e02, + 0x74 => 0x5e2b, 0x75 => 0x5fd7, 0x76 => 0x601d, 0x77 => 0x6307, + 0x78 => 0x652f, 0x79 => 0x5b5c, 0x7a => 0x65af, 0x7b => 0x65bd, + 0x7c => 0x65e8, 0x7d => 0x679d, 0x7e => 0x6b62, 0x80 => 0x6b7b, + 0x81 => 0x6c0f, 0x82 => 0x7345, 0x83 => 0x7949, 0x84 => 0x79c1, + 0x85 => 0x7cf8, 0x86 => 0x7d19, 0x87 => 0x7d2b, 0x88 => 0x80a2, + 0x89 => 0x8102, 0x8a => 0x81f3, 0x8b => 0x8996, 0x8c => 0x8a5e, + 0x8d => 0x8a69, 0x8e => 0x8a66, 0x8f => 0x8a8c, 0x90 => 0x8aee, + 0x91 => 0x8cc7, 0x92 => 0x8cdc, 0x93 => 0x96cc, 0x94 => 0x98fc, + 0x95 => 0x6b6f, 0x96 => 0x4e8b, 0x97 => 0x4f3c, 0x98 => 0x4f8d, + 0x99 => 0x5150, 0x9a => 0x5b57, 0x9b => 0x5bfa, 0x9c => 0x6148, + 0x9d => 0x6301, 0x9e => 0x6642, 0x9f => 0x6b21, 0xa0 => 0x6ecb, + 0xa1 => 0x6cbb, 0xa2 => 0x723e, 0xa3 => 0x74bd, 0xa4 => 0x75d4, + 0xa5 => 0x78c1, 0xa6 => 0x793a, 0xa7 => 0x800c, 0xa8 => 0x8033, + 0xa9 => 0x81ea, 0xaa => 0x8494, 0xab => 0x8f9e, 0xac => 0x6c50, + 0xad => 0x9e7f, 0xae => 0x5f0f, 0xaf => 0x8b58, 0xb0 => 0x9d2b, + 0xb1 => 0x7afa, 0xb2 => 0x8ef8, 0xb3 => 0x5b8d, 0xb4 => 0x96eb, + 0xb5 => 0x4e03, 0xb6 => 0x53f1, 0xb7 => 0x57f7, 0xb8 => 0x5931, + 0xb9 => 0x5ac9, 0xba => 0x5ba4, 0xbb => 0x6089, 0xbc => 0x6e7f, + 0xbd => 0x6f06, 0xbe => 0x75be, 0xbf => 0x8cea, 0xc0 => 0x5b9f, + 0xc1 => 0x8500, 0xc2 => 0x7be0, 0xc3 => 0x5072, 0xc4 => 0x67f4, + 0xc5 => 0x829d, 0xc6 => 0x5c61, 0xc7 => 0x854a, 0xc8 => 0x7e1e, + 0xc9 => 0x820e, 0xca => 0x5199, 0xcb => 0x5c04, 0xcc => 0x6368, + 0xcd => 0x8d66, 0xce => 0x659c, 0xcf => 0x716e, 0xd0 => 0x793e, + 0xd1 => 0x7d17, 0xd2 => 0x8005, 0xd3 => 0x8b1d, 0xd4 => 0x8eca, + 0xd5 => 0x906e, 0xd6 => 0x86c7, 0xd7 => 0x90aa, 0xd8 => 0x501f, + 0xd9 => 0x52fa, 0xda => 0x5c3a, 0xdb => 0x6753, 0xdc => 0x707c, + 0xdd => 0x7235, 0xde => 0x914c, 0xdf => 0x91c8, 0xe0 => 0x932b, + 0xe1 => 0x82e5, 0xe2 => 0x5bc2, 0xe3 => 0x5f31, 0xe4 => 0x60f9, + 0xe5 => 0x4e3b, 0xe6 => 0x53d6, 0xe7 => 0x5b88, 0xe8 => 0x624b, + 0xe9 => 0x6731, 0xea => 0x6b8a, 0xeb => 0x72e9, 0xec => 0x73e0, + 0xed => 0x7a2e, 0xee => 0x816b, 0xef => 0x8da3, 0xf0 => 0x9152, + 0xf1 => 0x9996, 0xf2 => 0x5112, 0xf3 => 0x53d7, 0xf4 => 0x546a, + 0xf5 => 0x5bff, 0xf6 => 0x6388, 0xf7 => 0x6a39, 0xf8 => 0x7dac, + 0xf9 => 0x9700, 0xfa => 0x56da, 0xfb => 0x53ce, 0xfc => 0x5468, + }, + 0x8f => { + 0x40 => 0x5b97, 0x41 => 0x5c31, 0x42 => 0x5dde, 0x43 => 0x4fee, + 0x44 => 0x6101, 0x45 => 0x62fe, 0x46 => 0x6d32, 0x47 => 0x79c0, + 0x48 => 0x79cb, 0x49 => 0x7d42, 0x4a => 0x7e4d, 0x4b => 0x7fd2, + 0x4c => 0x81ed, 0x4d => 0x821f, 0x4e => 0x8490, 0x4f => 0x8846, + 0x50 => 0x8972, 0x51 => 0x8b90, 0x52 => 0x8e74, 0x53 => 0x8f2f, + 0x54 => 0x9031, 0x55 => 0x914b, 0x56 => 0x916c, 0x57 => 0x96c6, + 0x58 => 0x919c, 0x59 => 0x4ec0, 0x5a => 0x4f4f, 0x5b => 0x5145, + 0x5c => 0x5341, 0x5d => 0x5f93, 0x5e => 0x620e, 0x5f => 0x67d4, + 0x60 => 0x6c41, 0x61 => 0x6e0b, 0x62 => 0x7363, 0x63 => 0x7e26, + 0x64 => 0x91cd, 0x65 => 0x9283, 0x66 => 0x53d4, 0x67 => 0x5919, + 0x68 => 0x5bbf, 0x69 => 0x6dd1, 0x6a => 0x795d, 0x6b => 0x7e2e, + 0x6c => 0x7c9b, 0x6d => 0x587e, 0x6e => 0x719f, 0x6f => 0x51fa, + 0x70 => 0x8853, 0x71 => 0x8ff0, 0x72 => 0x4fca, 0x73 => 0x5cfb, + 0x74 => 0x6625, 0x75 => 0x77ac, 0x76 => 0x7ae3, 0x77 => 0x821c, + 0x78 => 0x99ff, 0x79 => 0x51c6, 0x7a => 0x5faa, 0x7b => 0x65ec, + 0x7c => 0x696f, 0x7d => 0x6b89, 0x7e => 0x6df3, 0x80 => 0x6e96, + 0x81 => 0x6f64, 0x82 => 0x76fe, 0x83 => 0x7d14, 0x84 => 0x5de1, + 0x85 => 0x9075, 0x86 => 0x9187, 0x87 => 0x9806, 0x88 => 0x51e6, + 0x89 => 0x521d, 0x8a => 0x6240, 0x8b => 0x6691, 0x8c => 0x66d9, + 0x8d => 0x6e1a, 0x8e => 0x5eb6, 0x8f => 0x7dd2, 0x90 => 0x7f72, + 0x91 => 0x66f8, 0x92 => 0x85af, 0x93 => 0x85f7, 0x94 => 0x8af8, + 0x95 => 0x52a9, 0x96 => 0x53d9, 0x97 => 0x5973, 0x98 => 0x5e8f, + 0x99 => 0x5f90, 0x9a => 0x6055, 0x9b => 0x92e4, 0x9c => 0x9664, + 0x9d => 0x50b7, 0x9e => 0x511f, 0x9f => 0x52dd, 0xa0 => 0x5320, + 0xa1 => 0x5347, 0xa2 => 0x53ec, 0xa3 => 0x54e8, 0xa4 => 0x5546, + 0xa5 => 0x5531, 0xa6 => 0x5617, 0xa7 => 0x5968, 0xa8 => 0x59be, + 0xa9 => 0x5a3c, 0xaa => 0x5bb5, 0xab => 0x5c06, 0xac => 0x5c0f, + 0xad => 0x5c11, 0xae => 0x5c1a, 0xaf => 0x5e84, 0xb0 => 0x5e8a, + 0xb1 => 0x5ee0, 0xb2 => 0x5f70, 0xb3 => 0x627f, 0xb4 => 0x6284, + 0xb5 => 0x62db, 0xb6 => 0x638c, 0xb7 => 0x6377, 0xb8 => 0x6607, + 0xb9 => 0x660c, 0xba => 0x662d, 0xbb => 0x6676, 0xbc => 0x677e, + 0xbd => 0x68a2, 0xbe => 0x6a1f, 0xbf => 0x6a35, 0xc0 => 0x6cbc, + 0xc1 => 0x6d88, 0xc2 => 0x6e09, 0xc3 => 0x6e58, 0xc4 => 0x713c, + 0xc5 => 0x7126, 0xc6 => 0x7167, 0xc7 => 0x75c7, 0xc8 => 0x7701, + 0xc9 => 0x785d, 0xca => 0x7901, 0xcb => 0x7965, 0xcc => 0x79f0, + 0xcd => 0x7ae0, 0xce => 0x7b11, 0xcf => 0x7ca7, 0xd0 => 0x7d39, + 0xd1 => 0x8096, 0xd2 => 0x83d6, 0xd3 => 0x848b, 0xd4 => 0x8549, + 0xd5 => 0x885d, 0xd6 => 0x88f3, 0xd7 => 0x8a1f, 0xd8 => 0x8a3c, + 0xd9 => 0x8a54, 0xda => 0x8a73, 0xdb => 0x8c61, 0xdc => 0x8cde, + 0xdd => 0x91a4, 0xde => 0x9266, 0xdf => 0x937e, 0xe0 => 0x9418, + 0xe1 => 0x969c, 0xe2 => 0x9798, 0xe3 => 0x4e0a, 0xe4 => 0x4e08, + 0xe5 => 0x4e1e, 0xe6 => 0x4e57, 0xe7 => 0x5197, 0xe8 => 0x5270, + 0xe9 => 0x57ce, 0xea => 0x5834, 0xeb => 0x58cc, 0xec => 0x5b22, + 0xed => 0x5e38, 0xee => 0x60c5, 0xef => 0x64fe, 0xf0 => 0x6761, + 0xf1 => 0x6756, 0xf2 => 0x6d44, 0xf3 => 0x72b6, 0xf4 => 0x7573, + 0xf5 => 0x7a63, 0xf6 => 0x84b8, 0xf7 => 0x8b72, 0xf8 => 0x91b8, + 0xf9 => 0x9320, 0xfa => 0x5631, 0xfb => 0x57f4, 0xfc => 0x98fe, + }, + 0x90 => { + 0x40 => 0x62ed, 0x41 => 0x690d, 0x42 => 0x6b96, 0x43 => 0x71ed, + 0x44 => 0x7e54, 0x45 => 0x8077, 0x46 => 0x8272, 0x47 => 0x89e6, + 0x48 => 0x98df, 0x49 => 0x8755, 0x4a => 0x8fb1, 0x4b => 0x5c3b, + 0x4c => 0x4f38, 0x4d => 0x4fe1, 0x4e => 0x4fb5, 0x4f => 0x5507, + 0x50 => 0x5a20, 0x51 => 0x5bdd, 0x52 => 0x5be9, 0x53 => 0x5fc3, + 0x54 => 0x614e, 0x55 => 0x632f, 0x56 => 0x65b0, 0x57 => 0x664b, + 0x58 => 0x68ee, 0x59 => 0x699b, 0x5a => 0x6d78, 0x5b => 0x6df1, + 0x5c => 0x7533, 0x5d => 0x75b9, 0x5e => 0x771f, 0x5f => 0x795e, + 0x60 => 0x79e6, 0x61 => 0x7d33, 0x62 => 0x81e3, 0x63 => 0x82af, + 0x64 => 0x85aa, 0x65 => 0x89aa, 0x66 => 0x8a3a, 0x67 => 0x8eab, + 0x68 => 0x8f9b, 0x69 => 0x9032, 0x6a => 0x91dd, 0x6b => 0x9707, + 0x6c => 0x4eba, 0x6d => 0x4ec1, 0x6e => 0x5203, 0x6f => 0x5875, + 0x70 => 0x58ec, 0x71 => 0x5c0b, 0x72 => 0x751a, 0x73 => 0x5c3d, + 0x74 => 0x814e, 0x75 => 0x8a0a, 0x76 => 0x8fc5, 0x77 => 0x9663, + 0x78 => 0x976d, 0x79 => 0x7b25, 0x7a => 0x8acf, 0x7b => 0x9808, + 0x7c => 0x9162, 0x7d => 0x56f3, 0x7e => 0x53a8, 0x80 => 0x9017, + 0x81 => 0x5439, 0x82 => 0x5782, 0x83 => 0x5e25, 0x84 => 0x63a8, + 0x85 => 0x6c34, 0x86 => 0x708a, 0x87 => 0x7761, 0x88 => 0x7c8b, + 0x89 => 0x7fe0, 0x8a => 0x8870, 0x8b => 0x9042, 0x8c => 0x9154, + 0x8d => 0x9310, 0x8e => 0x9318, 0x8f => 0x968f, 0x90 => 0x745e, + 0x91 => 0x9ac4, 0x92 => 0x5d07, 0x93 => 0x5d69, 0x94 => 0x6570, + 0x95 => 0x67a2, 0x96 => 0x8da8, 0x97 => 0x96db, 0x98 => 0x636e, + 0x99 => 0x6749, 0x9a => 0x6919, 0x9b => 0x83c5, 0x9c => 0x9817, + 0x9d => 0x96c0, 0x9e => 0x88fe, 0x9f => 0x6f84, 0xa0 => 0x647a, + 0xa1 => 0x5bf8, 0xa2 => 0x4e16, 0xa3 => 0x702c, 0xa4 => 0x755d, + 0xa5 => 0x662f, 0xa6 => 0x51c4, 0xa7 => 0x5236, 0xa8 => 0x52e2, + 0xa9 => 0x59d3, 0xaa => 0x5f81, 0xab => 0x6027, 0xac => 0x6210, + 0xad => 0x653f, 0xae => 0x6574, 0xaf => 0x661f, 0xb0 => 0x6674, + 0xb1 => 0x68f2, 0xb2 => 0x6816, 0xb3 => 0x6b63, 0xb4 => 0x6e05, + 0xb5 => 0x7272, 0xb6 => 0x751f, 0xb7 => 0x76db, 0xb8 => 0x7cbe, + 0xb9 => 0x8056, 0xba => 0x58f0, 0xbb => 0x88fd, 0xbc => 0x897f, + 0xbd => 0x8aa0, 0xbe => 0x8a93, 0xbf => 0x8acb, 0xc0 => 0x901d, + 0xc1 => 0x9192, 0xc2 => 0x9752, 0xc3 => 0x9759, 0xc4 => 0x6589, + 0xc5 => 0x7a0e, 0xc6 => 0x8106, 0xc7 => 0x96bb, 0xc8 => 0x5e2d, + 0xc9 => 0x60dc, 0xca => 0x621a, 0xcb => 0x65a5, 0xcc => 0x6614, + 0xcd => 0x6790, 0xce => 0x77f3, 0xcf => 0x7a4d, 0xd0 => 0x7c4d, + 0xd1 => 0x7e3e, 0xd2 => 0x810a, 0xd3 => 0x8cac, 0xd4 => 0x8d64, + 0xd5 => 0x8de1, 0xd6 => 0x8e5f, 0xd7 => 0x78a9, 0xd8 => 0x5207, + 0xd9 => 0x62d9, 0xda => 0x63a5, 0xdb => 0x6442, 0xdc => 0x6298, + 0xdd => 0x8a2d, 0xde => 0x7a83, 0xdf => 0x7bc0, 0xe0 => 0x8aac, + 0xe1 => 0x96ea, 0xe2 => 0x7d76, 0xe3 => 0x820c, 0xe4 => 0x8749, + 0xe5 => 0x4ed9, 0xe6 => 0x5148, 0xe7 => 0x5343, 0xe8 => 0x5360, + 0xe9 => 0x5ba3, 0xea => 0x5c02, 0xeb => 0x5c16, 0xec => 0x5ddd, + 0xed => 0x6226, 0xee => 0x6247, 0xef => 0x64b0, 0xf0 => 0x6813, + 0xf1 => 0x6834, 0xf2 => 0x6cc9, 0xf3 => 0x6d45, 0xf4 => 0x6d17, + 0xf5 => 0x67d3, 0xf6 => 0x6f5c, 0xf7 => 0x714e, 0xf8 => 0x717d, + 0xf9 => 0x65cb, 0xfa => 0x7a7f, 0xfb => 0x7bad, 0xfc => 0x7dda, + }, + 0x91 => { + 0x40 => 0x7e4a, 0x41 => 0x7fa8, 0x42 => 0x817a, 0x43 => 0x821b, + 0x44 => 0x8239, 0x45 => 0x85a6, 0x46 => 0x8a6e, 0x47 => 0x8cce, + 0x48 => 0x8df5, 0x49 => 0x9078, 0x4a => 0x9077, 0x4b => 0x92ad, + 0x4c => 0x9291, 0x4d => 0x9583, 0x4e => 0x9bae, 0x4f => 0x524d, + 0x50 => 0x5584, 0x51 => 0x6f38, 0x52 => 0x7136, 0x53 => 0x5168, + 0x54 => 0x7985, 0x55 => 0x7e55, 0x56 => 0x81b3, 0x57 => 0x7cce, + 0x58 => 0x564c, 0x59 => 0x5851, 0x5a => 0x5ca8, 0x5b => 0x63aa, + 0x5c => 0x66fe, 0x5d => 0x66fd, 0x5e => 0x695a, 0x5f => 0x72d9, + 0x60 => 0x758f, 0x61 => 0x758e, 0x62 => 0x790e, 0x63 => 0x7956, + 0x64 => 0x79df, 0x65 => 0x7c97, 0x66 => 0x7d20, 0x67 => 0x7d44, + 0x68 => 0x8607, 0x69 => 0x8a34, 0x6a => 0x963b, 0x6b => 0x9061, + 0x6c => 0x9f20, 0x6d => 0x50e7, 0x6e => 0x5275, 0x6f => 0x53cc, + 0x70 => 0x53e2, 0x71 => 0x5009, 0x72 => 0x55aa, 0x73 => 0x58ee, + 0x74 => 0x594f, 0x75 => 0x723d, 0x76 => 0x5b8b, 0x77 => 0x5c64, + 0x78 => 0x531d, 0x79 => 0x60e3, 0x7a => 0x60f3, 0x7b => 0x635c, + 0x7c => 0x6383, 0x7d => 0x633f, 0x7e => 0x63bb, 0x80 => 0x64cd, + 0x81 => 0x65e9, 0x82 => 0x66f9, 0x83 => 0x5de3, 0x84 => 0x69cd, + 0x85 => 0x69fd, 0x86 => 0x6f15, 0x87 => 0x71e5, 0x88 => 0x4e89, + 0x89 => 0x75e9, 0x8a => 0x76f8, 0x8b => 0x7a93, 0x8c => 0x7cdf, + 0x8d => 0x7dcf, 0x8e => 0x7d9c, 0x8f => 0x8061, 0x90 => 0x8349, + 0x91 => 0x8358, 0x92 => 0x846c, 0x93 => 0x84bc, 0x94 => 0x85fb, + 0x95 => 0x88c5, 0x96 => 0x8d70, 0x97 => 0x9001, 0x98 => 0x906d, + 0x99 => 0x9397, 0x9a => 0x971c, 0x9b => 0x9a12, 0x9c => 0x50cf, + 0x9d => 0x5897, 0x9e => 0x618e, 0x9f => 0x81d3, 0xa0 => 0x8535, + 0xa1 => 0x8d08, 0xa2 => 0x9020, 0xa3 => 0x4fc3, 0xa4 => 0x5074, + 0xa5 => 0x5247, 0xa6 => 0x5373, 0xa7 => 0x606f, 0xa8 => 0x6349, + 0xa9 => 0x675f, 0xaa => 0x6e2c, 0xab => 0x8db3, 0xac => 0x901f, + 0xad => 0x4fd7, 0xae => 0x5c5e, 0xaf => 0x8cca, 0xb0 => 0x65cf, + 0xb1 => 0x7d9a, 0xb2 => 0x5352, 0xb3 => 0x8896, 0xb4 => 0x5176, + 0xb5 => 0x63c3, 0xb6 => 0x5b58, 0xb7 => 0x5b6b, 0xb8 => 0x5c0a, + 0xb9 => 0x640d, 0xba => 0x6751, 0xbb => 0x905c, 0xbc => 0x4ed6, + 0xbd => 0x591a, 0xbe => 0x592a, 0xbf => 0x6c70, 0xc0 => 0x8a51, + 0xc1 => 0x553e, 0xc2 => 0x5815, 0xc3 => 0x59a5, 0xc4 => 0x60f0, + 0xc5 => 0x6253, 0xc6 => 0x67c1, 0xc7 => 0x8235, 0xc8 => 0x6955, + 0xc9 => 0x9640, 0xca => 0x99c4, 0xcb => 0x9a28, 0xcc => 0x4f53, + 0xcd => 0x5806, 0xce => 0x5bfe, 0xcf => 0x8010, 0xd0 => 0x5cb1, + 0xd1 => 0x5e2f, 0xd2 => 0x5f85, 0xd3 => 0x6020, 0xd4 => 0x614b, + 0xd5 => 0x6234, 0xd6 => 0x66ff, 0xd7 => 0x6cf0, 0xd8 => 0x6ede, + 0xd9 => 0x80ce, 0xda => 0x817f, 0xdb => 0x82d4, 0xdc => 0x888b, + 0xdd => 0x8cb8, 0xde => 0x9000, 0xdf => 0x902e, 0xe0 => 0x968a, + 0xe1 => 0x9edb, 0xe2 => 0x9bdb, 0xe3 => 0x4ee3, 0xe4 => 0x53f0, + 0xe5 => 0x5927, 0xe6 => 0x7b2c, 0xe7 => 0x918d, 0xe8 => 0x984c, + 0xe9 => 0x9df9, 0xea => 0x6edd, 0xeb => 0x7027, 0xec => 0x5353, + 0xed => 0x5544, 0xee => 0x5b85, 0xef => 0x6258, 0xf0 => 0x629e, + 0xf1 => 0x62d3, 0xf2 => 0x6ca2, 0xf3 => 0x6fef, 0xf4 => 0x7422, + 0xf5 => 0x8a17, 0xf6 => 0x9438, 0xf7 => 0x6fc1, 0xf8 => 0x8afe, + 0xf9 => 0x8338, 0xfa => 0x51e7, 0xfb => 0x86f8, 0xfc => 0x53ea, + }, + 0x92 => { + 0x40 => 0x53e9, 0x41 => 0x4f46, 0x42 => 0x9054, 0x43 => 0x8fb0, + 0x44 => 0x596a, 0x45 => 0x8131, 0x46 => 0x5dfd, 0x47 => 0x7aea, + 0x48 => 0x8fbf, 0x49 => 0x68da, 0x4a => 0x8c37, 0x4b => 0x72f8, + 0x4c => 0x9c48, 0x4d => 0x6a3d, 0x4e => 0x8ab0, 0x4f => 0x4e39, + 0x50 => 0x5358, 0x51 => 0x5606, 0x52 => 0x5766, 0x53 => 0x62c5, + 0x54 => 0x63a2, 0x55 => 0x65e6, 0x56 => 0x6b4e, 0x57 => 0x6de1, + 0x58 => 0x6e5b, 0x59 => 0x70ad, 0x5a => 0x77ed, 0x5b => 0x7aef, + 0x5c => 0x7baa, 0x5d => 0x7dbb, 0x5e => 0x803d, 0x5f => 0x80c6, + 0x60 => 0x86cb, 0x61 => 0x8a95, 0x62 => 0x935b, 0x63 => 0x56e3, + 0x64 => 0x58c7, 0x65 => 0x5f3e, 0x66 => 0x65ad, 0x67 => 0x6696, + 0x68 => 0x6a80, 0x69 => 0x6bb5, 0x6a => 0x7537, 0x6b => 0x8ac7, + 0x6c => 0x5024, 0x6d => 0x77e5, 0x6e => 0x5730, 0x6f => 0x5f1b, + 0x70 => 0x6065, 0x71 => 0x667a, 0x72 => 0x6c60, 0x73 => 0x75f4, + 0x74 => 0x7a1a, 0x75 => 0x7f6e, 0x76 => 0x81f4, 0x77 => 0x8718, + 0x78 => 0x9045, 0x79 => 0x99b3, 0x7a => 0x7bc9, 0x7b => 0x755c, + 0x7c => 0x7af9, 0x7d => 0x7b51, 0x7e => 0x84c4, 0x80 => 0x9010, + 0x81 => 0x79e9, 0x82 => 0x7a92, 0x83 => 0x8336, 0x84 => 0x5ae1, + 0x85 => 0x7740, 0x86 => 0x4e2d, 0x87 => 0x4ef2, 0x88 => 0x5b99, + 0x89 => 0x5fe0, 0x8a => 0x62bd, 0x8b => 0x663c, 0x8c => 0x67f1, + 0x8d => 0x6ce8, 0x8e => 0x866b, 0x8f => 0x8877, 0x90 => 0x8a3b, + 0x91 => 0x914e, 0x92 => 0x92f3, 0x93 => 0x99d0, 0x94 => 0x6a17, + 0x95 => 0x7026, 0x96 => 0x732a, 0x97 => 0x82e7, 0x98 => 0x8457, + 0x99 => 0x8caf, 0x9a => 0x4e01, 0x9b => 0x5146, 0x9c => 0x51cb, + 0x9d => 0x558b, 0x9e => 0x5bf5, 0x9f => 0x5e16, 0xa0 => 0x5e33, + 0xa1 => 0x5e81, 0xa2 => 0x5f14, 0xa3 => 0x5f35, 0xa4 => 0x5f6b, + 0xa5 => 0x5fb4, 0xa6 => 0x61f2, 0xa7 => 0x6311, 0xa8 => 0x66a2, + 0xa9 => 0x671d, 0xaa => 0x6f6e, 0xab => 0x7252, 0xac => 0x753a, + 0xad => 0x773a, 0xae => 0x8074, 0xaf => 0x8139, 0xb0 => 0x8178, + 0xb1 => 0x8776, 0xb2 => 0x8abf, 0xb3 => 0x8adc, 0xb4 => 0x8d85, + 0xb5 => 0x8df3, 0xb6 => 0x929a, 0xb7 => 0x9577, 0xb8 => 0x9802, + 0xb9 => 0x9ce5, 0xba => 0x52c5, 0xbb => 0x6357, 0xbc => 0x76f4, + 0xbd => 0x6715, 0xbe => 0x6c88, 0xbf => 0x73cd, 0xc0 => 0x8cc3, + 0xc1 => 0x93ae, 0xc2 => 0x9673, 0xc3 => 0x6d25, 0xc4 => 0x589c, + 0xc5 => 0x690e, 0xc6 => 0x69cc, 0xc7 => 0x8ffd, 0xc8 => 0x939a, + 0xc9 => 0x75db, 0xca => 0x901a, 0xcb => 0x585a, 0xcc => 0x6802, + 0xcd => 0x63b4, 0xce => 0x69fb, 0xcf => 0x4f43, 0xd0 => 0x6f2c, + 0xd1 => 0x67d8, 0xd2 => 0x8fbb, 0xd3 => 0x8526, 0xd4 => 0x7db4, + 0xd5 => 0x9354, 0xd6 => 0x693f, 0xd7 => 0x6f70, 0xd8 => 0x576a, + 0xd9 => 0x58f7, 0xda => 0x5b2c, 0xdb => 0x7d2c, 0xdc => 0x722a, + 0xdd => 0x540a, 0xde => 0x91e3, 0xdf => 0x9db4, 0xe0 => 0x4ead, + 0xe1 => 0x4f4e, 0xe2 => 0x505c, 0xe3 => 0x5075, 0xe4 => 0x5243, + 0xe5 => 0x8c9e, 0xe6 => 0x5448, 0xe7 => 0x5824, 0xe8 => 0x5b9a, + 0xe9 => 0x5e1d, 0xea => 0x5e95, 0xeb => 0x5ead, 0xec => 0x5ef7, + 0xed => 0x5f1f, 0xee => 0x608c, 0xef => 0x62b5, 0xf0 => 0x633a, + 0xf1 => 0x63d0, 0xf2 => 0x68af, 0xf3 => 0x6c40, 0xf4 => 0x7887, + 0xf5 => 0x798e, 0xf6 => 0x7a0b, 0xf7 => 0x7de0, 0xf8 => 0x8247, + 0xf9 => 0x8a02, 0xfa => 0x8ae6, 0xfb => 0x8e44, 0xfc => 0x9013, + }, + 0x93 => { + 0x40 => 0x90b8, 0x41 => 0x912d, 0x42 => 0x91d8, 0x43 => 0x9f0e, + 0x44 => 0x6ce5, 0x45 => 0x6458, 0x46 => 0x64e2, 0x47 => 0x6575, + 0x48 => 0x6ef4, 0x49 => 0x7684, 0x4a => 0x7b1b, 0x4b => 0x9069, + 0x4c => 0x93d1, 0x4d => 0x6eba, 0x4e => 0x54f2, 0x4f => 0x5fb9, + 0x50 => 0x64a4, 0x51 => 0x8f4d, 0x52 => 0x8fed, 0x53 => 0x9244, + 0x54 => 0x5178, 0x55 => 0x586b, 0x56 => 0x5929, 0x57 => 0x5c55, + 0x58 => 0x5e97, 0x59 => 0x6dfb, 0x5a => 0x7e8f, 0x5b => 0x751c, + 0x5c => 0x8cbc, 0x5d => 0x8ee2, 0x5e => 0x985b, 0x5f => 0x70b9, + 0x60 => 0x4f1d, 0x61 => 0x6bbf, 0x62 => 0x6fb1, 0x63 => 0x7530, + 0x64 => 0x96fb, 0x65 => 0x514e, 0x66 => 0x5410, 0x67 => 0x5835, + 0x68 => 0x5857, 0x69 => 0x59ac, 0x6a => 0x5c60, 0x6b => 0x5f92, + 0x6c => 0x6597, 0x6d => 0x675c, 0x6e => 0x6e21, 0x6f => 0x767b, + 0x70 => 0x83df, 0x71 => 0x8ced, 0x72 => 0x9014, 0x73 => 0x90fd, + 0x74 => 0x934d, 0x75 => 0x7825, 0x76 => 0x783a, 0x77 => 0x52aa, + 0x78 => 0x5ea6, 0x79 => 0x571f, 0x7a => 0x5974, 0x7b => 0x6012, + 0x7c => 0x5012, 0x7d => 0x515a, 0x7e => 0x51ac, 0x80 => 0x51cd, + 0x81 => 0x5200, 0x82 => 0x5510, 0x83 => 0x5854, 0x84 => 0x5858, + 0x85 => 0x5957, 0x86 => 0x5b95, 0x87 => 0x5cf6, 0x88 => 0x5d8b, + 0x89 => 0x60bc, 0x8a => 0x6295, 0x8b => 0x642d, 0x8c => 0x6771, + 0x8d => 0x6843, 0x8e => 0x68bc, 0x8f => 0x68df, 0x90 => 0x76d7, + 0x91 => 0x6dd8, 0x92 => 0x6e6f, 0x93 => 0x6d9b, 0x94 => 0x706f, + 0x95 => 0x71c8, 0x96 => 0x5f53, 0x97 => 0x75d8, 0x98 => 0x7977, + 0x99 => 0x7b49, 0x9a => 0x7b54, 0x9b => 0x7b52, 0x9c => 0x7cd6, + 0x9d => 0x7d71, 0x9e => 0x5230, 0x9f => 0x8463, 0xa0 => 0x8569, + 0xa1 => 0x85e4, 0xa2 => 0x8a0e, 0xa3 => 0x8b04, 0xa4 => 0x8c46, + 0xa5 => 0x8e0f, 0xa6 => 0x9003, 0xa7 => 0x900f, 0xa8 => 0x9419, + 0xa9 => 0x9676, 0xaa => 0x982d, 0xab => 0x9a30, 0xac => 0x95d8, + 0xad => 0x50cd, 0xae => 0x52d5, 0xaf => 0x540c, 0xb0 => 0x5802, + 0xb1 => 0x5c0e, 0xb2 => 0x61a7, 0xb3 => 0x649e, 0xb4 => 0x6d1e, + 0xb5 => 0x77b3, 0xb6 => 0x7ae5, 0xb7 => 0x80f4, 0xb8 => 0x8404, + 0xb9 => 0x9053, 0xba => 0x9285, 0xbb => 0x5ce0, 0xbc => 0x9d07, + 0xbd => 0x533f, 0xbe => 0x5f97, 0xbf => 0x5fb3, 0xc0 => 0x6d9c, + 0xc1 => 0x7279, 0xc2 => 0x7763, 0xc3 => 0x79bf, 0xc4 => 0x7be4, + 0xc5 => 0x6bd2, 0xc6 => 0x72ec, 0xc7 => 0x8aad, 0xc8 => 0x6803, + 0xc9 => 0x6a61, 0xca => 0x51f8, 0xcb => 0x7a81, 0xcc => 0x6934, + 0xcd => 0x5c4a, 0xce => 0x9cf6, 0xcf => 0x82eb, 0xd0 => 0x5bc5, + 0xd1 => 0x9149, 0xd2 => 0x701e, 0xd3 => 0x5678, 0xd4 => 0x5c6f, + 0xd5 => 0x60c7, 0xd6 => 0x6566, 0xd7 => 0x6c8c, 0xd8 => 0x8c5a, + 0xd9 => 0x9041, 0xda => 0x9813, 0xdb => 0x5451, 0xdc => 0x66c7, + 0xdd => 0x920d, 0xde => 0x5948, 0xdf => 0x90a3, 0xe0 => 0x5185, + 0xe1 => 0x4e4d, 0xe2 => 0x51ea, 0xe3 => 0x8599, 0xe4 => 0x8b0e, + 0xe5 => 0x7058, 0xe6 => 0x637a, 0xe7 => 0x934b, 0xe8 => 0x6962, + 0xe9 => 0x99b4, 0xea => 0x7e04, 0xeb => 0x7577, 0xec => 0x5357, + 0xed => 0x6960, 0xee => 0x8edf, 0xef => 0x96e3, 0xf0 => 0x6c5d, + 0xf1 => 0x4e8c, 0xf2 => 0x5c3c, 0xf3 => 0x5f10, 0xf4 => 0x8fe9, + 0xf5 => 0x5302, 0xf6 => 0x8cd1, 0xf7 => 0x8089, 0xf8 => 0x8679, + 0xf9 => 0x5eff, 0xfa => 0x65e5, 0xfb => 0x4e73, 0xfc => 0x5165, + }, + 0x94 => { + 0x40 => 0x5982, 0x41 => 0x5c3f, 0x42 => 0x97ee, 0x43 => 0x4efb, + 0x44 => 0x598a, 0x45 => 0x5fcd, 0x46 => 0x8a8d, 0x47 => 0x6fe1, + 0x48 => 0x79b0, 0x49 => 0x7962, 0x4a => 0x5be7, 0x4b => 0x8471, + 0x4c => 0x732b, 0x4d => 0x71b1, 0x4e => 0x5e74, 0x4f => 0x5ff5, + 0x50 => 0x637b, 0x51 => 0x649a, 0x52 => 0x71c3, 0x53 => 0x7c98, + 0x54 => 0x4e43, 0x55 => 0x5efc, 0x56 => 0x4e4b, 0x57 => 0x57dc, + 0x58 => 0x56a2, 0x59 => 0x60a9, 0x5a => 0x6fc3, 0x5b => 0x7d0d, + 0x5c => 0x80fd, 0x5d => 0x8133, 0x5e => 0x81bf, 0x5f => 0x8fb2, + 0x60 => 0x8997, 0x61 => 0x86a4, 0x62 => 0x5df4, 0x63 => 0x628a, + 0x64 => 0x64ad, 0x65 => 0x8987, 0x66 => 0x6777, 0x67 => 0x6ce2, + 0x68 => 0x6d3e, 0x69 => 0x7436, 0x6a => 0x7834, 0x6b => 0x5a46, + 0x6c => 0x7f75, 0x6d => 0x82ad, 0x6e => 0x99ac, 0x6f => 0x4ff3, + 0x70 => 0x5ec3, 0x71 => 0x62dd, 0x72 => 0x6392, 0x73 => 0x6557, + 0x74 => 0x676f, 0x75 => 0x76c3, 0x76 => 0x724c, 0x77 => 0x80cc, + 0x78 => 0x80ba, 0x79 => 0x8f29, 0x7a => 0x914d, 0x7b => 0x500d, + 0x7c => 0x57f9, 0x7d => 0x5a92, 0x7e => 0x6885, 0x80 => 0x6973, + 0x81 => 0x7164, 0x82 => 0x72fd, 0x83 => 0x8cb7, 0x84 => 0x58f2, + 0x85 => 0x8ce0, 0x86 => 0x966a, 0x87 => 0x9019, 0x88 => 0x877f, + 0x89 => 0x79e4, 0x8a => 0x77e7, 0x8b => 0x8429, 0x8c => 0x4f2f, + 0x8d => 0x5265, 0x8e => 0x535a, 0x8f => 0x62cd, 0x90 => 0x67cf, + 0x91 => 0x6cca, 0x92 => 0x767d, 0x93 => 0x7b94, 0x94 => 0x7c95, + 0x95 => 0x8236, 0x96 => 0x8584, 0x97 => 0x8feb, 0x98 => 0x66dd, + 0x99 => 0x6f20, 0x9a => 0x7206, 0x9b => 0x7e1b, 0x9c => 0x83ab, + 0x9d => 0x99c1, 0x9e => 0x9ea6, 0x9f => 0x51fd, 0xa0 => 0x7bb1, + 0xa1 => 0x7872, 0xa2 => 0x7bb8, 0xa3 => 0x8087, 0xa4 => 0x7b48, + 0xa5 => 0x6ae8, 0xa6 => 0x5e61, 0xa7 => 0x808c, 0xa8 => 0x7551, + 0xa9 => 0x7560, 0xaa => 0x516b, 0xab => 0x9262, 0xac => 0x6e8c, + 0xad => 0x767a, 0xae => 0x9197, 0xaf => 0x9aea, 0xb0 => 0x4f10, + 0xb1 => 0x7f70, 0xb2 => 0x629c, 0xb3 => 0x7b4f, 0xb4 => 0x95a5, + 0xb5 => 0x9ce9, 0xb6 => 0x567a, 0xb7 => 0x5859, 0xb8 => 0x86e4, + 0xb9 => 0x96bc, 0xba => 0x4f34, 0xbb => 0x5224, 0xbc => 0x534a, + 0xbd => 0x53cd, 0xbe => 0x53db, 0xbf => 0x5e06, 0xc0 => 0x642c, + 0xc1 => 0x6591, 0xc2 => 0x677f, 0xc3 => 0x6c3e, 0xc4 => 0x6c4e, + 0xc5 => 0x7248, 0xc6 => 0x72af, 0xc7 => 0x73ed, 0xc8 => 0x7554, + 0xc9 => 0x7e41, 0xca => 0x822c, 0xcb => 0x85e9, 0xcc => 0x8ca9, + 0xcd => 0x7bc4, 0xce => 0x91c6, 0xcf => 0x7169, 0xd0 => 0x9812, + 0xd1 => 0x98ef, 0xd2 => 0x633d, 0xd3 => 0x6669, 0xd4 => 0x756a, + 0xd5 => 0x76e4, 0xd6 => 0x78d0, 0xd7 => 0x8543, 0xd8 => 0x86ee, + 0xd9 => 0x532a, 0xda => 0x5351, 0xdb => 0x5426, 0xdc => 0x5983, + 0xdd => 0x5e87, 0xde => 0x5f7c, 0xdf => 0x60b2, 0xe0 => 0x6249, + 0xe1 => 0x6279, 0xe2 => 0x62ab, 0xe3 => 0x6590, 0xe4 => 0x6bd4, + 0xe5 => 0x6ccc, 0xe6 => 0x75b2, 0xe7 => 0x76ae, 0xe8 => 0x7891, + 0xe9 => 0x79d8, 0xea => 0x7dcb, 0xeb => 0x7f77, 0xec => 0x80a5, + 0xed => 0x88ab, 0xee => 0x8ab9, 0xef => 0x8cbb, 0xf0 => 0x907f, + 0xf1 => 0x975e, 0xf2 => 0x98db, 0xf3 => 0x6a0b, 0xf4 => 0x7c38, + 0xf5 => 0x5099, 0xf6 => 0x5c3e, 0xf7 => 0x5fae, 0xf8 => 0x6787, + 0xf9 => 0x6bd8, 0xfa => 0x7435, 0xfb => 0x7709, 0xfc => 0x7f8e, + }, + 0x95 => { + 0x40 => 0x9f3b, 0x41 => 0x67ca, 0x42 => 0x7a17, 0x43 => 0x5339, + 0x44 => 0x758b, 0x45 => 0x9aed, 0x46 => 0x5f66, 0x47 => 0x819d, + 0x48 => 0x83f1, 0x49 => 0x8098, 0x4a => 0x5f3c, 0x4b => 0x5fc5, + 0x4c => 0x7562, 0x4d => 0x7b46, 0x4e => 0x903c, 0x4f => 0x6867, + 0x50 => 0x59eb, 0x51 => 0x5a9b, 0x52 => 0x7d10, 0x53 => 0x767e, + 0x54 => 0x8b2c, 0x55 => 0x4ff5, 0x56 => 0x5f6a, 0x57 => 0x6a19, + 0x58 => 0x6c37, 0x59 => 0x6f02, 0x5a => 0x74e2, 0x5b => 0x7968, + 0x5c => 0x8868, 0x5d => 0x8a55, 0x5e => 0x8c79, 0x5f => 0x5edf, + 0x60 => 0x63cf, 0x61 => 0x75c5, 0x62 => 0x79d2, 0x63 => 0x82d7, + 0x64 => 0x9328, 0x65 => 0x92f2, 0x66 => 0x849c, 0x67 => 0x86ed, + 0x68 => 0x9c2d, 0x69 => 0x54c1, 0x6a => 0x5f6c, 0x6b => 0x658c, + 0x6c => 0x6d5c, 0x6d => 0x7015, 0x6e => 0x8ca7, 0x6f => 0x8cd3, + 0x70 => 0x983b, 0x71 => 0x654f, 0x72 => 0x74f6, 0x73 => 0x4e0d, + 0x74 => 0x4ed8, 0x75 => 0x57e0, 0x76 => 0x592b, 0x77 => 0x5a66, + 0x78 => 0x5bcc, 0x79 => 0x51a8, 0x7a => 0x5e03, 0x7b => 0x5e9c, + 0x7c => 0x6016, 0x7d => 0x6276, 0x7e => 0x6577, 0x80 => 0x65a7, + 0x81 => 0x666e, 0x82 => 0x6d6e, 0x83 => 0x7236, 0x84 => 0x7b26, + 0x85 => 0x8150, 0x86 => 0x819a, 0x87 => 0x8299, 0x88 => 0x8b5c, + 0x89 => 0x8ca0, 0x8a => 0x8ce6, 0x8b => 0x8d74, 0x8c => 0x961c, + 0x8d => 0x9644, 0x8e => 0x4fae, 0x8f => 0x64ab, 0x90 => 0x6b66, + 0x91 => 0x821e, 0x92 => 0x8461, 0x93 => 0x856a, 0x94 => 0x90e8, + 0x95 => 0x5c01, 0x96 => 0x6953, 0x97 => 0x98a8, 0x98 => 0x847a, + 0x99 => 0x8557, 0x9a => 0x4f0f, 0x9b => 0x526f, 0x9c => 0x5fa9, + 0x9d => 0x5e45, 0x9e => 0x670d, 0x9f => 0x798f, 0xa0 => 0x8179, + 0xa1 => 0x8907, 0xa2 => 0x8986, 0xa3 => 0x6df5, 0xa4 => 0x5f17, + 0xa5 => 0x6255, 0xa6 => 0x6cb8, 0xa7 => 0x4ecf, 0xa8 => 0x7269, + 0xa9 => 0x9b92, 0xaa => 0x5206, 0xab => 0x543b, 0xac => 0x5674, + 0xad => 0x58b3, 0xae => 0x61a4, 0xaf => 0x626e, 0xb0 => 0x711a, + 0xb1 => 0x596e, 0xb2 => 0x7c89, 0xb3 => 0x7cde, 0xb4 => 0x7d1b, + 0xb5 => 0x96f0, 0xb6 => 0x6587, 0xb7 => 0x805e, 0xb8 => 0x4e19, + 0xb9 => 0x4f75, 0xba => 0x5175, 0xbb => 0x5840, 0xbc => 0x5e63, + 0xbd => 0x5e73, 0xbe => 0x5f0a, 0xbf => 0x67c4, 0xc0 => 0x4e26, + 0xc1 => 0x853d, 0xc2 => 0x9589, 0xc3 => 0x965b, 0xc4 => 0x7c73, + 0xc5 => 0x9801, 0xc6 => 0x50fb, 0xc7 => 0x58c1, 0xc8 => 0x7656, + 0xc9 => 0x78a7, 0xca => 0x5225, 0xcb => 0x77a5, 0xcc => 0x8511, + 0xcd => 0x7b86, 0xce => 0x504f, 0xcf => 0x5909, 0xd0 => 0x7247, + 0xd1 => 0x7bc7, 0xd2 => 0x7de8, 0xd3 => 0x8fba, 0xd4 => 0x8fd4, + 0xd5 => 0x904d, 0xd6 => 0x4fbf, 0xd7 => 0x52c9, 0xd8 => 0x5a29, + 0xd9 => 0x5f01, 0xda => 0x97ad, 0xdb => 0x4fdd, 0xdc => 0x8217, + 0xdd => 0x92ea, 0xde => 0x5703, 0xdf => 0x6355, 0xe0 => 0x6b69, + 0xe1 => 0x752b, 0xe2 => 0x88dc, 0xe3 => 0x8f14, 0xe4 => 0x7a42, + 0xe5 => 0x52df, 0xe6 => 0x5893, 0xe7 => 0x6155, 0xe8 => 0x620a, + 0xe9 => 0x66ae, 0xea => 0x6bcd, 0xeb => 0x7c3f, 0xec => 0x83e9, + 0xed => 0x5023, 0xee => 0x4ff8, 0xef => 0x5305, 0xf0 => 0x5446, + 0xf1 => 0x5831, 0xf2 => 0x5949, 0xf3 => 0x5b9d, 0xf4 => 0x5cf0, + 0xf5 => 0x5cef, 0xf6 => 0x5d29, 0xf7 => 0x5e96, 0xf8 => 0x62b1, + 0xf9 => 0x6367, 0xfa => 0x653e, 0xfb => 0x65b9, 0xfc => 0x670b, + }, + 0x96 => { + 0x40 => 0x6cd5, 0x41 => 0x6ce1, 0x42 => 0x70f9, 0x43 => 0x7832, + 0x44 => 0x7e2b, 0x45 => 0x80de, 0x46 => 0x82b3, 0x47 => 0x840c, + 0x48 => 0x84ec, 0x49 => 0x8702, 0x4a => 0x8912, 0x4b => 0x8a2a, + 0x4c => 0x8c4a, 0x4d => 0x90a6, 0x4e => 0x92d2, 0x4f => 0x98fd, + 0x50 => 0x9cf3, 0x51 => 0x9d6c, 0x52 => 0x4e4f, 0x53 => 0x4ea1, + 0x54 => 0x508d, 0x55 => 0x5256, 0x56 => 0x574a, 0x57 => 0x59a8, + 0x58 => 0x5e3d, 0x59 => 0x5fd8, 0x5a => 0x5fd9, 0x5b => 0x623f, + 0x5c => 0x66b4, 0x5d => 0x671b, 0x5e => 0x67d0, 0x5f => 0x68d2, + 0x60 => 0x5192, 0x61 => 0x7d21, 0x62 => 0x80aa, 0x63 => 0x81a8, + 0x64 => 0x8b00, 0x65 => 0x8c8c, 0x66 => 0x8cbf, 0x67 => 0x927e, + 0x68 => 0x9632, 0x69 => 0x5420, 0x6a => 0x982c, 0x6b => 0x5317, + 0x6c => 0x50d5, 0x6d => 0x535c, 0x6e => 0x58a8, 0x6f => 0x64b2, + 0x70 => 0x6734, 0x71 => 0x7267, 0x72 => 0x7766, 0x73 => 0x7a46, + 0x74 => 0x91e6, 0x75 => 0x52c3, 0x76 => 0x6ca1, 0x77 => 0x6b86, + 0x78 => 0x5800, 0x79 => 0x5e4c, 0x7a => 0x5954, 0x7b => 0x672c, + 0x7c => 0x7ffb, 0x7d => 0x51e1, 0x7e => 0x76c6, 0x80 => 0x6469, + 0x81 => 0x78e8, 0x82 => 0x9b54, 0x83 => 0x9ebb, 0x84 => 0x57cb, + 0x85 => 0x59b9, 0x86 => 0x6627, 0x87 => 0x679a, 0x88 => 0x6bce, + 0x89 => 0x54e9, 0x8a => 0x69d9, 0x8b => 0x5e55, 0x8c => 0x819c, + 0x8d => 0x6795, 0x8e => 0x9baa, 0x8f => 0x67fe, 0x90 => 0x9c52, + 0x91 => 0x685d, 0x92 => 0x4ea6, 0x93 => 0x4fe3, 0x94 => 0x53c8, + 0x95 => 0x62b9, 0x96 => 0x672b, 0x97 => 0x6cab, 0x98 => 0x8fc4, + 0x99 => 0x4fad, 0x9a => 0x7e6d, 0x9b => 0x9ebf, 0x9c => 0x4e07, + 0x9d => 0x6162, 0x9e => 0x6e80, 0x9f => 0x6f2b, 0xa0 => 0x8513, + 0xa1 => 0x5473, 0xa2 => 0x672a, 0xa3 => 0x9b45, 0xa4 => 0x5df3, + 0xa5 => 0x7b95, 0xa6 => 0x5cac, 0xa7 => 0x5bc6, 0xa8 => 0x871c, + 0xa9 => 0x6e4a, 0xaa => 0x84d1, 0xab => 0x7a14, 0xac => 0x8108, + 0xad => 0x5999, 0xae => 0x7c8d, 0xaf => 0x6c11, 0xb0 => 0x7720, + 0xb1 => 0x52d9, 0xb2 => 0x5922, 0xb3 => 0x7121, 0xb4 => 0x725f, + 0xb5 => 0x77db, 0xb6 => 0x9727, 0xb7 => 0x9d61, 0xb8 => 0x690b, + 0xb9 => 0x5a7f, 0xba => 0x5a18, 0xbb => 0x51a5, 0xbc => 0x540d, + 0xbd => 0x547d, 0xbe => 0x660e, 0xbf => 0x76df, 0xc0 => 0x8ff7, + 0xc1 => 0x9298, 0xc2 => 0x9cf4, 0xc3 => 0x59ea, 0xc4 => 0x725d, + 0xc5 => 0x6ec5, 0xc6 => 0x514d, 0xc7 => 0x68c9, 0xc8 => 0x7dbf, + 0xc9 => 0x7dec, 0xca => 0x9762, 0xcb => 0x9eba, 0xcc => 0x6478, + 0xcd => 0x6a21, 0xce => 0x8302, 0xcf => 0x5984, 0xd0 => 0x5b5f, + 0xd1 => 0x6bdb, 0xd2 => 0x731b, 0xd3 => 0x76f2, 0xd4 => 0x7db2, + 0xd5 => 0x8017, 0xd6 => 0x8499, 0xd7 => 0x5132, 0xd8 => 0x6728, + 0xd9 => 0x9ed9, 0xda => 0x76ee, 0xdb => 0x6762, 0xdc => 0x52ff, + 0xdd => 0x9905, 0xde => 0x5c24, 0xdf => 0x623b, 0xe0 => 0x7c7e, + 0xe1 => 0x8cb0, 0xe2 => 0x554f, 0xe3 => 0x60b6, 0xe4 => 0x7d0b, + 0xe5 => 0x9580, 0xe6 => 0x5301, 0xe7 => 0x4e5f, 0xe8 => 0x51b6, + 0xe9 => 0x591c, 0xea => 0x723a, 0xeb => 0x8036, 0xec => 0x91ce, + 0xed => 0x5f25, 0xee => 0x77e2, 0xef => 0x5384, 0xf0 => 0x5f79, + 0xf1 => 0x7d04, 0xf2 => 0x85ac, 0xf3 => 0x8a33, 0xf4 => 0x8e8d, + 0xf5 => 0x9756, 0xf6 => 0x67f3, 0xf7 => 0x85ae, 0xf8 => 0x9453, + 0xf9 => 0x6109, 0xfa => 0x6108, 0xfb => 0x6cb9, 0xfc => 0x7652, + }, + 0x97 => { + 0x40 => 0x8aed, 0x41 => 0x8f38, 0x42 => 0x552f, 0x43 => 0x4f51, + 0x44 => 0x512a, 0x45 => 0x52c7, 0x46 => 0x53cb, 0x47 => 0x5ba5, + 0x48 => 0x5e7d, 0x49 => 0x60a0, 0x4a => 0x6182, 0x4b => 0x63d6, + 0x4c => 0x6709, 0x4d => 0x67da, 0x4e => 0x6e67, 0x4f => 0x6d8c, + 0x50 => 0x7336, 0x51 => 0x7337, 0x52 => 0x7531, 0x53 => 0x7950, + 0x54 => 0x88d5, 0x55 => 0x8a98, 0x56 => 0x904a, 0x57 => 0x9091, + 0x58 => 0x90f5, 0x59 => 0x96c4, 0x5a => 0x878d, 0x5b => 0x5915, + 0x5c => 0x4e88, 0x5d => 0x4f59, 0x5e => 0x4e0e, 0x5f => 0x8a89, + 0x60 => 0x8f3f, 0x61 => 0x9810, 0x62 => 0x50ad, 0x63 => 0x5e7c, + 0x64 => 0x5996, 0x65 => 0x5bb9, 0x66 => 0x5eb8, 0x67 => 0x63da, + 0x68 => 0x63fa, 0x69 => 0x64c1, 0x6a => 0x66dc, 0x6b => 0x694a, + 0x6c => 0x69d8, 0x6d => 0x6d0b, 0x6e => 0x6eb6, 0x6f => 0x7194, + 0x70 => 0x7528, 0x71 => 0x7aaf, 0x72 => 0x7f8a, 0x73 => 0x8000, + 0x74 => 0x8449, 0x75 => 0x84c9, 0x76 => 0x8981, 0x77 => 0x8b21, + 0x78 => 0x8e0a, 0x79 => 0x9065, 0x7a => 0x967d, 0x7b => 0x990a, + 0x7c => 0x617e, 0x7d => 0x6291, 0x7e => 0x6b32, 0x80 => 0x6c83, + 0x81 => 0x6d74, 0x82 => 0x7fcc, 0x83 => 0x7ffc, 0x84 => 0x6dc0, + 0x85 => 0x7f85, 0x86 => 0x87ba, 0x87 => 0x88f8, 0x88 => 0x6765, + 0x89 => 0x83b1, 0x8a => 0x983c, 0x8b => 0x96f7, 0x8c => 0x6d1b, + 0x8d => 0x7d61, 0x8e => 0x843d, 0x8f => 0x916a, 0x90 => 0x4e71, + 0x91 => 0x5375, 0x92 => 0x5d50, 0x93 => 0x6b04, 0x94 => 0x6feb, + 0x95 => 0x85cd, 0x96 => 0x862d, 0x97 => 0x89a7, 0x98 => 0x5229, + 0x99 => 0x540f, 0x9a => 0x5c65, 0x9b => 0x674e, 0x9c => 0x68a8, + 0x9d => 0x7406, 0x9e => 0x7483, 0x9f => 0x75e2, 0xa0 => 0x88cf, + 0xa1 => 0x88e1, 0xa2 => 0x91cc, 0xa3 => 0x96e2, 0xa4 => 0x9678, + 0xa5 => 0x5f8b, 0xa6 => 0x7387, 0xa7 => 0x7acb, 0xa8 => 0x844e, + 0xa9 => 0x63a0, 0xaa => 0x7565, 0xab => 0x5289, 0xac => 0x6d41, + 0xad => 0x6e9c, 0xae => 0x7409, 0xaf => 0x7559, 0xb0 => 0x786b, + 0xb1 => 0x7c92, 0xb2 => 0x9686, 0xb3 => 0x7adc, 0xb4 => 0x9f8d, + 0xb5 => 0x4fb6, 0xb6 => 0x616e, 0xb7 => 0x65c5, 0xb8 => 0x865c, + 0xb9 => 0x4e86, 0xba => 0x4eae, 0xbb => 0x50da, 0xbc => 0x4e21, + 0xbd => 0x51cc, 0xbe => 0x5bee, 0xbf => 0x6599, 0xc0 => 0x6881, + 0xc1 => 0x6dbc, 0xc2 => 0x731f, 0xc3 => 0x7642, 0xc4 => 0x77ad, + 0xc5 => 0x7a1c, 0xc6 => 0x7ce7, 0xc7 => 0x826f, 0xc8 => 0x8ad2, + 0xc9 => 0x907c, 0xca => 0x91cf, 0xcb => 0x9675, 0xcc => 0x9818, + 0xcd => 0x529b, 0xce => 0x7dd1, 0xcf => 0x502b, 0xd0 => 0x5398, + 0xd1 => 0x6797, 0xd2 => 0x6dcb, 0xd3 => 0x71d0, 0xd4 => 0x7433, + 0xd5 => 0x81e8, 0xd6 => 0x8f2a, 0xd7 => 0x96a3, 0xd8 => 0x9c57, + 0xd9 => 0x9e9f, 0xda => 0x7460, 0xdb => 0x5841, 0xdc => 0x6d99, + 0xdd => 0x7d2f, 0xde => 0x985e, 0xdf => 0x4ee4, 0xe0 => 0x4f36, + 0xe1 => 0x4f8b, 0xe2 => 0x51b7, 0xe3 => 0x52b1, 0xe4 => 0x5dba, + 0xe5 => 0x601c, 0xe6 => 0x73b2, 0xe7 => 0x793c, 0xe8 => 0x82d3, + 0xe9 => 0x9234, 0xea => 0x96b7, 0xeb => 0x96f6, 0xec => 0x970a, + 0xed => 0x9e97, 0xee => 0x9f62, 0xef => 0x66a6, 0xf0 => 0x6b74, + 0xf1 => 0x5217, 0xf2 => 0x52a3, 0xf3 => 0x70c8, 0xf4 => 0x88c2, + 0xf5 => 0x5ec9, 0xf6 => 0x604b, 0xf7 => 0x6190, 0xf8 => 0x6f23, + 0xf9 => 0x7149, 0xfa => 0x7c3e, 0xfb => 0x7df4, 0xfc => 0x806f, + }, + 0x98 => { + 0x40 => 0x84ee, 0x41 => 0x9023, 0x42 => 0x932c, 0x43 => 0x5442, + 0x44 => 0x9b6f, 0x45 => 0x6ad3, 0x46 => 0x7089, 0x47 => 0x8cc2, + 0x48 => 0x8def, 0x49 => 0x9732, 0x4a => 0x52b4, 0x4b => 0x5a41, + 0x4c => 0x5eca, 0x4d => 0x5f04, 0x4e => 0x6717, 0x4f => 0x697c, + 0x50 => 0x6994, 0x51 => 0x6d6a, 0x52 => 0x6f0f, 0x53 => 0x7262, + 0x54 => 0x72fc, 0x55 => 0x7bed, 0x56 => 0x8001, 0x57 => 0x807e, + 0x58 => 0x874b, 0x59 => 0x90ce, 0x5a => 0x516d, 0x5b => 0x9e93, + 0x5c => 0x7984, 0x5d => 0x808b, 0x5e => 0x9332, 0x5f => 0x8ad6, + 0x60 => 0x502d, 0x61 => 0x548c, 0x62 => 0x8a71, 0x63 => 0x6b6a, + 0x64 => 0x8cc4, 0x65 => 0x8107, 0x66 => 0x60d1, 0x67 => 0x67a0, + 0x68 => 0x9df2, 0x69 => 0x4e99, 0x6a => 0x4e98, 0x6b => 0x9c10, + 0x6c => 0x8a6b, 0x6d => 0x85c1, 0x6e => 0x8568, 0x6f => 0x6900, + 0x70 => 0x6e7e, 0x71 => 0x7897, 0x72 => 0x8155, 0x9f => 0x5f0c, + 0xa0 => 0x4e10, 0xa1 => 0x4e15, 0xa2 => 0x4e2a, 0xa3 => 0x4e31, + 0xa4 => 0x4e36, 0xa5 => 0x4e3c, 0xa6 => 0x4e3f, 0xa7 => 0x4e42, + 0xa8 => 0x4e56, 0xa9 => 0x4e58, 0xaa => 0x4e82, 0xab => 0x4e85, + 0xac => 0x8c6b, 0xad => 0x4e8a, 0xae => 0x8212, 0xaf => 0x5f0d, + 0xb0 => 0x4e8e, 0xb1 => 0x4e9e, 0xb2 => 0x4e9f, 0xb3 => 0x4ea0, + 0xb4 => 0x4ea2, 0xb5 => 0x4eb0, 0xb6 => 0x4eb3, 0xb7 => 0x4eb6, + 0xb8 => 0x4ece, 0xb9 => 0x4ecd, 0xba => 0x4ec4, 0xbb => 0x4ec6, + 0xbc => 0x4ec2, 0xbd => 0x4ed7, 0xbe => 0x4ede, 0xbf => 0x4eed, + 0xc0 => 0x4edf, 0xc1 => 0x4ef7, 0xc2 => 0x4f09, 0xc3 => 0x4f5a, + 0xc4 => 0x4f30, 0xc5 => 0x4f5b, 0xc6 => 0x4f5d, 0xc7 => 0x4f57, + 0xc8 => 0x4f47, 0xc9 => 0x4f76, 0xca => 0x4f88, 0xcb => 0x4f8f, + 0xcc => 0x4f98, 0xcd => 0x4f7b, 0xce => 0x4f69, 0xcf => 0x4f70, + 0xd0 => 0x4f91, 0xd1 => 0x4f6f, 0xd2 => 0x4f86, 0xd3 => 0x4f96, + 0xd4 => 0x5118, 0xd5 => 0x4fd4, 0xd6 => 0x4fdf, 0xd7 => 0x4fce, + 0xd8 => 0x4fd8, 0xd9 => 0x4fdb, 0xda => 0x4fd1, 0xdb => 0x4fda, + 0xdc => 0x4fd0, 0xdd => 0x4fe4, 0xde => 0x4fe5, 0xdf => 0x501a, + 0xe0 => 0x5028, 0xe1 => 0x5014, 0xe2 => 0x502a, 0xe3 => 0x5025, + 0xe4 => 0x5005, 0xe5 => 0x4f1c, 0xe6 => 0x4ff6, 0xe7 => 0x5021, + 0xe8 => 0x5029, 0xe9 => 0x502c, 0xea => 0x4ffe, 0xeb => 0x4fef, + 0xec => 0x5011, 0xed => 0x5006, 0xee => 0x5043, 0xef => 0x5047, + 0xf0 => 0x6703, 0xf1 => 0x5055, 0xf2 => 0x5050, 0xf3 => 0x5048, + 0xf4 => 0x505a, 0xf5 => 0x5056, 0xf6 => 0x506c, 0xf7 => 0x5078, + 0xf8 => 0x5080, 0xf9 => 0x509a, 0xfa => 0x5085, 0xfb => 0x50b4, + 0xfc => 0x50b2, + }, + 0x99 => { + 0x40 => 0x50c9, 0x41 => 0x50ca, 0x42 => 0x50b3, 0x43 => 0x50c2, + 0x44 => 0x50d6, 0x45 => 0x50de, 0x46 => 0x50e5, 0x47 => 0x50ed, + 0x48 => 0x50e3, 0x49 => 0x50ee, 0x4a => 0x50f9, 0x4b => 0x50f5, + 0x4c => 0x5109, 0x4d => 0x5101, 0x4e => 0x5102, 0x4f => 0x5116, + 0x50 => 0x5115, 0x51 => 0x5114, 0x52 => 0x511a, 0x53 => 0x5121, + 0x54 => 0x513a, 0x55 => 0x5137, 0x56 => 0x513c, 0x57 => 0x513b, + 0x58 => 0x513f, 0x59 => 0x5140, 0x5a => 0x5152, 0x5b => 0x514c, + 0x5c => 0x5154, 0x5d => 0x5162, 0x5e => 0x7af8, 0x5f => 0x5169, + 0x60 => 0x516a, 0x61 => 0x516e, 0x62 => 0x5180, 0x63 => 0x5182, + 0x64 => 0x56d8, 0x65 => 0x518c, 0x66 => 0x5189, 0x67 => 0x518f, + 0x68 => 0x5191, 0x69 => 0x5193, 0x6a => 0x5195, 0x6b => 0x5196, + 0x6c => 0x51a4, 0x6d => 0x51a6, 0x6e => 0x51a2, 0x6f => 0x51a9, + 0x70 => 0x51aa, 0x71 => 0x51ab, 0x72 => 0x51b3, 0x73 => 0x51b1, + 0x74 => 0x51b2, 0x75 => 0x51b0, 0x76 => 0x51b5, 0x77 => 0x51bd, + 0x78 => 0x51c5, 0x79 => 0x51c9, 0x7a => 0x51db, 0x7b => 0x51e0, + 0x7c => 0x8655, 0x7d => 0x51e9, 0x7e => 0x51ed, 0x80 => 0x51f0, + 0x81 => 0x51f5, 0x82 => 0x51fe, 0x83 => 0x5204, 0x84 => 0x520b, + 0x85 => 0x5214, 0x86 => 0x520e, 0x87 => 0x5227, 0x88 => 0x522a, + 0x89 => 0x522e, 0x8a => 0x5233, 0x8b => 0x5239, 0x8c => 0x524f, + 0x8d => 0x5244, 0x8e => 0x524b, 0x8f => 0x524c, 0x90 => 0x525e, + 0x91 => 0x5254, 0x92 => 0x526a, 0x93 => 0x5274, 0x94 => 0x5269, + 0x95 => 0x5273, 0x96 => 0x527f, 0x97 => 0x527d, 0x98 => 0x528d, + 0x99 => 0x5294, 0x9a => 0x5292, 0x9b => 0x5271, 0x9c => 0x5288, + 0x9d => 0x5291, 0x9e => 0x8fa8, 0x9f => 0x8fa7, 0xa0 => 0x52ac, + 0xa1 => 0x52ad, 0xa2 => 0x52bc, 0xa3 => 0x52b5, 0xa4 => 0x52c1, + 0xa5 => 0x52cd, 0xa6 => 0x52d7, 0xa7 => 0x52de, 0xa8 => 0x52e3, + 0xa9 => 0x52e6, 0xaa => 0x98ed, 0xab => 0x52e0, 0xac => 0x52f3, + 0xad => 0x52f5, 0xae => 0x52f8, 0xaf => 0x52f9, 0xb0 => 0x5306, + 0xb1 => 0x5308, 0xb2 => 0x7538, 0xb3 => 0x530d, 0xb4 => 0x5310, + 0xb5 => 0x530f, 0xb6 => 0x5315, 0xb7 => 0x531a, 0xb8 => 0x5323, + 0xb9 => 0x532f, 0xba => 0x5331, 0xbb => 0x5333, 0xbc => 0x5338, + 0xbd => 0x5340, 0xbe => 0x5346, 0xbf => 0x5345, 0xc0 => 0x4e17, + 0xc1 => 0x5349, 0xc2 => 0x534d, 0xc3 => 0x51d6, 0xc4 => 0x535e, + 0xc5 => 0x5369, 0xc6 => 0x536e, 0xc7 => 0x5918, 0xc8 => 0x537b, + 0xc9 => 0x5377, 0xca => 0x5382, 0xcb => 0x5396, 0xcc => 0x53a0, + 0xcd => 0x53a6, 0xce => 0x53a5, 0xcf => 0x53ae, 0xd0 => 0x53b0, + 0xd1 => 0x53b6, 0xd2 => 0x53c3, 0xd3 => 0x7c12, 0xd4 => 0x96d9, + 0xd5 => 0x53df, 0xd6 => 0x66fc, 0xd7 => 0x71ee, 0xd8 => 0x53ee, + 0xd9 => 0x53e8, 0xda => 0x53ed, 0xdb => 0x53fa, 0xdc => 0x5401, + 0xdd => 0x543d, 0xde => 0x5440, 0xdf => 0x542c, 0xe0 => 0x542d, + 0xe1 => 0x543c, 0xe2 => 0x542e, 0xe3 => 0x5436, 0xe4 => 0x5429, + 0xe5 => 0x541d, 0xe6 => 0x544e, 0xe7 => 0x548f, 0xe8 => 0x5475, + 0xe9 => 0x548e, 0xea => 0x545f, 0xeb => 0x5471, 0xec => 0x5477, + 0xed => 0x5470, 0xee => 0x5492, 0xef => 0x547b, 0xf0 => 0x5480, + 0xf1 => 0x5476, 0xf2 => 0x5484, 0xf3 => 0x5490, 0xf4 => 0x5486, + 0xf5 => 0x54c7, 0xf6 => 0x54a2, 0xf7 => 0x54b8, 0xf8 => 0x54a5, + 0xf9 => 0x54ac, 0xfa => 0x54c4, 0xfb => 0x54c8, 0xfc => 0x54a8, + }, + 0x9a => { + 0x40 => 0x54ab, 0x41 => 0x54c2, 0x42 => 0x54a4, 0x43 => 0x54be, + 0x44 => 0x54bc, 0x45 => 0x54d8, 0x46 => 0x54e5, 0x47 => 0x54e6, + 0x48 => 0x550f, 0x49 => 0x5514, 0x4a => 0x54fd, 0x4b => 0x54ee, + 0x4c => 0x54ed, 0x4d => 0x54fa, 0x4e => 0x54e2, 0x4f => 0x5539, + 0x50 => 0x5540, 0x51 => 0x5563, 0x52 => 0x554c, 0x53 => 0x552e, + 0x54 => 0x555c, 0x55 => 0x5545, 0x56 => 0x5556, 0x57 => 0x5557, + 0x58 => 0x5538, 0x59 => 0x5533, 0x5a => 0x555d, 0x5b => 0x5599, + 0x5c => 0x5580, 0x5d => 0x54af, 0x5e => 0x558a, 0x5f => 0x559f, + 0x60 => 0x557b, 0x61 => 0x557e, 0x62 => 0x5598, 0x63 => 0x559e, + 0x64 => 0x55ae, 0x65 => 0x557c, 0x66 => 0x5583, 0x67 => 0x55a9, + 0x68 => 0x5587, 0x69 => 0x55a8, 0x6a => 0x55da, 0x6b => 0x55c5, + 0x6c => 0x55df, 0x6d => 0x55c4, 0x6e => 0x55dc, 0x6f => 0x55e4, + 0x70 => 0x55d4, 0x71 => 0x5614, 0x72 => 0x55f7, 0x73 => 0x5616, + 0x74 => 0x55fe, 0x75 => 0x55fd, 0x76 => 0x561b, 0x77 => 0x55f9, + 0x78 => 0x564e, 0x79 => 0x5650, 0x7a => 0x71df, 0x7b => 0x5634, + 0x7c => 0x5636, 0x7d => 0x5632, 0x7e => 0x5638, 0x80 => 0x566b, + 0x81 => 0x5664, 0x82 => 0x562f, 0x83 => 0x566c, 0x84 => 0x566a, + 0x85 => 0x5686, 0x86 => 0x5680, 0x87 => 0x568a, 0x88 => 0x56a0, + 0x89 => 0x5694, 0x8a => 0x568f, 0x8b => 0x56a5, 0x8c => 0x56ae, + 0x8d => 0x56b6, 0x8e => 0x56b4, 0x8f => 0x56c2, 0x90 => 0x56bc, + 0x91 => 0x56c1, 0x92 => 0x56c3, 0x93 => 0x56c0, 0x94 => 0x56c8, + 0x95 => 0x56ce, 0x96 => 0x56d1, 0x97 => 0x56d3, 0x98 => 0x56d7, + 0x99 => 0x56ee, 0x9a => 0x56f9, 0x9b => 0x5700, 0x9c => 0x56ff, + 0x9d => 0x5704, 0x9e => 0x5709, 0x9f => 0x5708, 0xa0 => 0x570b, + 0xa1 => 0x570d, 0xa2 => 0x5713, 0xa3 => 0x5718, 0xa4 => 0x5716, + 0xa5 => 0x55c7, 0xa6 => 0x571c, 0xa7 => 0x5726, 0xa8 => 0x5737, + 0xa9 => 0x5738, 0xaa => 0x574e, 0xab => 0x573b, 0xac => 0x5740, + 0xad => 0x574f, 0xae => 0x5769, 0xaf => 0x57c0, 0xb0 => 0x5788, + 0xb1 => 0x5761, 0xb2 => 0x577f, 0xb3 => 0x5789, 0xb4 => 0x5793, + 0xb5 => 0x57a0, 0xb6 => 0x57b3, 0xb7 => 0x57a4, 0xb8 => 0x57aa, + 0xb9 => 0x57b0, 0xba => 0x57c3, 0xbb => 0x57c6, 0xbc => 0x57d4, + 0xbd => 0x57d2, 0xbe => 0x57d3, 0xbf => 0x580a, 0xc0 => 0x57d6, + 0xc1 => 0x57e3, 0xc2 => 0x580b, 0xc3 => 0x5819, 0xc4 => 0x581d, + 0xc5 => 0x5872, 0xc6 => 0x5821, 0xc7 => 0x5862, 0xc8 => 0x584b, + 0xc9 => 0x5870, 0xca => 0x6bc0, 0xcb => 0x5852, 0xcc => 0x583d, + 0xcd => 0x5879, 0xce => 0x5885, 0xcf => 0x58b9, 0xd0 => 0x589f, + 0xd1 => 0x58ab, 0xd2 => 0x58ba, 0xd3 => 0x58de, 0xd4 => 0x58bb, + 0xd5 => 0x58b8, 0xd6 => 0x58ae, 0xd7 => 0x58c5, 0xd8 => 0x58d3, + 0xd9 => 0x58d1, 0xda => 0x58d7, 0xdb => 0x58d9, 0xdc => 0x58d8, + 0xdd => 0x58e5, 0xde => 0x58dc, 0xdf => 0x58e4, 0xe0 => 0x58df, + 0xe1 => 0x58ef, 0xe2 => 0x58fa, 0xe3 => 0x58f9, 0xe4 => 0x58fb, + 0xe5 => 0x58fc, 0xe6 => 0x58fd, 0xe7 => 0x5902, 0xe8 => 0x590a, + 0xe9 => 0x5910, 0xea => 0x591b, 0xeb => 0x68a6, 0xec => 0x5925, + 0xed => 0x592c, 0xee => 0x592d, 0xef => 0x5932, 0xf0 => 0x5938, + 0xf1 => 0x593e, 0xf2 => 0x7ad2, 0xf3 => 0x5955, 0xf4 => 0x5950, + 0xf5 => 0x594e, 0xf6 => 0x595a, 0xf7 => 0x5958, 0xf8 => 0x5962, + 0xf9 => 0x5960, 0xfa => 0x5967, 0xfb => 0x596c, 0xfc => 0x5969, + }, + 0x9b => { + 0x40 => 0x5978, 0x41 => 0x5981, 0x42 => 0x599d, 0x43 => 0x4f5e, + 0x44 => 0x4fab, 0x45 => 0x59a3, 0x46 => 0x59b2, 0x47 => 0x59c6, + 0x48 => 0x59e8, 0x49 => 0x59dc, 0x4a => 0x598d, 0x4b => 0x59d9, + 0x4c => 0x59da, 0x4d => 0x5a25, 0x4e => 0x5a1f, 0x4f => 0x5a11, + 0x50 => 0x5a1c, 0x51 => 0x5a09, 0x52 => 0x5a1a, 0x53 => 0x5a40, + 0x54 => 0x5a6c, 0x55 => 0x5a49, 0x56 => 0x5a35, 0x57 => 0x5a36, + 0x58 => 0x5a62, 0x59 => 0x5a6a, 0x5a => 0x5a9a, 0x5b => 0x5abc, + 0x5c => 0x5abe, 0x5d => 0x5acb, 0x5e => 0x5ac2, 0x5f => 0x5abd, + 0x60 => 0x5ae3, 0x61 => 0x5ad7, 0x62 => 0x5ae6, 0x63 => 0x5ae9, + 0x64 => 0x5ad6, 0x65 => 0x5afa, 0x66 => 0x5afb, 0x67 => 0x5b0c, + 0x68 => 0x5b0b, 0x69 => 0x5b16, 0x6a => 0x5b32, 0x6b => 0x5ad0, + 0x6c => 0x5b2a, 0x6d => 0x5b36, 0x6e => 0x5b3e, 0x6f => 0x5b43, + 0x70 => 0x5b45, 0x71 => 0x5b40, 0x72 => 0x5b51, 0x73 => 0x5b55, + 0x74 => 0x5b5a, 0x75 => 0x5b5b, 0x76 => 0x5b65, 0x77 => 0x5b69, + 0x78 => 0x5b70, 0x79 => 0x5b73, 0x7a => 0x5b75, 0x7b => 0x5b78, + 0x7c => 0x6588, 0x7d => 0x5b7a, 0x7e => 0x5b80, 0x80 => 0x5b83, + 0x81 => 0x5ba6, 0x82 => 0x5bb8, 0x83 => 0x5bc3, 0x84 => 0x5bc7, + 0x85 => 0x5bc9, 0x86 => 0x5bd4, 0x87 => 0x5bd0, 0x88 => 0x5be4, + 0x89 => 0x5be6, 0x8a => 0x5be2, 0x8b => 0x5bde, 0x8c => 0x5be5, + 0x8d => 0x5beb, 0x8e => 0x5bf0, 0x8f => 0x5bf6, 0x90 => 0x5bf3, + 0x91 => 0x5c05, 0x92 => 0x5c07, 0x93 => 0x5c08, 0x94 => 0x5c0d, + 0x95 => 0x5c13, 0x96 => 0x5c20, 0x97 => 0x5c22, 0x98 => 0x5c28, + 0x99 => 0x5c38, 0x9a => 0x5c39, 0x9b => 0x5c41, 0x9c => 0x5c46, + 0x9d => 0x5c4e, 0x9e => 0x5c53, 0x9f => 0x5c50, 0xa0 => 0x5c4f, + 0xa1 => 0x5b71, 0xa2 => 0x5c6c, 0xa3 => 0x5c6e, 0xa4 => 0x4e62, + 0xa5 => 0x5c76, 0xa6 => 0x5c79, 0xa7 => 0x5c8c, 0xa8 => 0x5c91, + 0xa9 => 0x5c94, 0xaa => 0x599b, 0xab => 0x5cab, 0xac => 0x5cbb, + 0xad => 0x5cb6, 0xae => 0x5cbc, 0xaf => 0x5cb7, 0xb0 => 0x5cc5, + 0xb1 => 0x5cbe, 0xb2 => 0x5cc7, 0xb3 => 0x5cd9, 0xb4 => 0x5ce9, + 0xb5 => 0x5cfd, 0xb6 => 0x5cfa, 0xb7 => 0x5ced, 0xb8 => 0x5d8c, + 0xb9 => 0x5cea, 0xba => 0x5d0b, 0xbb => 0x5d15, 0xbc => 0x5d17, + 0xbd => 0x5d5c, 0xbe => 0x5d1f, 0xbf => 0x5d1b, 0xc0 => 0x5d11, + 0xc1 => 0x5d14, 0xc2 => 0x5d22, 0xc3 => 0x5d1a, 0xc4 => 0x5d19, + 0xc5 => 0x5d18, 0xc6 => 0x5d4c, 0xc7 => 0x5d52, 0xc8 => 0x5d4e, + 0xc9 => 0x5d4b, 0xca => 0x5d6c, 0xcb => 0x5d73, 0xcc => 0x5d76, + 0xcd => 0x5d87, 0xce => 0x5d84, 0xcf => 0x5d82, 0xd0 => 0x5da2, + 0xd1 => 0x5d9d, 0xd2 => 0x5dac, 0xd3 => 0x5dae, 0xd4 => 0x5dbd, + 0xd5 => 0x5d90, 0xd6 => 0x5db7, 0xd7 => 0x5dbc, 0xd8 => 0x5dc9, + 0xd9 => 0x5dcd, 0xda => 0x5dd3, 0xdb => 0x5dd2, 0xdc => 0x5dd6, + 0xdd => 0x5ddb, 0xde => 0x5deb, 0xdf => 0x5df2, 0xe0 => 0x5df5, + 0xe1 => 0x5e0b, 0xe2 => 0x5e1a, 0xe3 => 0x5e19, 0xe4 => 0x5e11, + 0xe5 => 0x5e1b, 0xe6 => 0x5e36, 0xe7 => 0x5e37, 0xe8 => 0x5e44, + 0xe9 => 0x5e43, 0xea => 0x5e40, 0xeb => 0x5e4e, 0xec => 0x5e57, + 0xed => 0x5e54, 0xee => 0x5e5f, 0xef => 0x5e62, 0xf0 => 0x5e64, + 0xf1 => 0x5e47, 0xf2 => 0x5e75, 0xf3 => 0x5e76, 0xf4 => 0x5e7a, + 0xf5 => 0x9ebc, 0xf6 => 0x5e7f, 0xf7 => 0x5ea0, 0xf8 => 0x5ec1, + 0xf9 => 0x5ec2, 0xfa => 0x5ec8, 0xfb => 0x5ed0, 0xfc => 0x5ecf, + }, + 0x9c => { + 0x40 => 0x5ed6, 0x41 => 0x5ee3, 0x42 => 0x5edd, 0x43 => 0x5eda, + 0x44 => 0x5edb, 0x45 => 0x5ee2, 0x46 => 0x5ee1, 0x47 => 0x5ee8, + 0x48 => 0x5ee9, 0x49 => 0x5eec, 0x4a => 0x5ef1, 0x4b => 0x5ef3, + 0x4c => 0x5ef0, 0x4d => 0x5ef4, 0x4e => 0x5ef8, 0x4f => 0x5efe, + 0x50 => 0x5f03, 0x51 => 0x5f09, 0x52 => 0x5f5d, 0x53 => 0x5f5c, + 0x54 => 0x5f0b, 0x55 => 0x5f11, 0x56 => 0x5f16, 0x57 => 0x5f29, + 0x58 => 0x5f2d, 0x59 => 0x5f38, 0x5a => 0x5f41, 0x5b => 0x5f48, + 0x5c => 0x5f4c, 0x5d => 0x5f4e, 0x5e => 0x5f2f, 0x5f => 0x5f51, + 0x60 => 0x5f56, 0x61 => 0x5f57, 0x62 => 0x5f59, 0x63 => 0x5f61, + 0x64 => 0x5f6d, 0x65 => 0x5f73, 0x66 => 0x5f77, 0x67 => 0x5f83, + 0x68 => 0x5f82, 0x69 => 0x5f7f, 0x6a => 0x5f8a, 0x6b => 0x5f88, + 0x6c => 0x5f91, 0x6d => 0x5f87, 0x6e => 0x5f9e, 0x6f => 0x5f99, + 0x70 => 0x5f98, 0x71 => 0x5fa0, 0x72 => 0x5fa8, 0x73 => 0x5fad, + 0x74 => 0x5fbc, 0x75 => 0x5fd6, 0x76 => 0x5ffb, 0x77 => 0x5fe4, + 0x78 => 0x5ff8, 0x79 => 0x5ff1, 0x7a => 0x5fdd, 0x7b => 0x60b3, + 0x7c => 0x5fff, 0x7d => 0x6021, 0x7e => 0x6060, 0x80 => 0x6019, + 0x81 => 0x6010, 0x82 => 0x6029, 0x83 => 0x600e, 0x84 => 0x6031, + 0x85 => 0x601b, 0x86 => 0x6015, 0x87 => 0x602b, 0x88 => 0x6026, + 0x89 => 0x600f, 0x8a => 0x603a, 0x8b => 0x605a, 0x8c => 0x6041, + 0x8d => 0x606a, 0x8e => 0x6077, 0x8f => 0x605f, 0x90 => 0x604a, + 0x91 => 0x6046, 0x92 => 0x604d, 0x93 => 0x6063, 0x94 => 0x6043, + 0x95 => 0x6064, 0x96 => 0x6042, 0x97 => 0x606c, 0x98 => 0x606b, + 0x99 => 0x6059, 0x9a => 0x6081, 0x9b => 0x608d, 0x9c => 0x60e7, + 0x9d => 0x6083, 0x9e => 0x609a, 0x9f => 0x6084, 0xa0 => 0x609b, + 0xa1 => 0x6096, 0xa2 => 0x6097, 0xa3 => 0x6092, 0xa4 => 0x60a7, + 0xa5 => 0x608b, 0xa6 => 0x60e1, 0xa7 => 0x60b8, 0xa8 => 0x60e0, + 0xa9 => 0x60d3, 0xaa => 0x60b4, 0xab => 0x5ff0, 0xac => 0x60bd, + 0xad => 0x60c6, 0xae => 0x60b5, 0xaf => 0x60d8, 0xb0 => 0x614d, + 0xb1 => 0x6115, 0xb2 => 0x6106, 0xb3 => 0x60f6, 0xb4 => 0x60f7, + 0xb5 => 0x6100, 0xb6 => 0x60f4, 0xb7 => 0x60fa, 0xb8 => 0x6103, + 0xb9 => 0x6121, 0xba => 0x60fb, 0xbb => 0x60f1, 0xbc => 0x610d, + 0xbd => 0x610e, 0xbe => 0x6147, 0xbf => 0x613e, 0xc0 => 0x6128, + 0xc1 => 0x6127, 0xc2 => 0x614a, 0xc3 => 0x613f, 0xc4 => 0x613c, + 0xc5 => 0x612c, 0xc6 => 0x6134, 0xc7 => 0x613d, 0xc8 => 0x6142, + 0xc9 => 0x6144, 0xca => 0x6173, 0xcb => 0x6177, 0xcc => 0x6158, + 0xcd => 0x6159, 0xce => 0x615a, 0xcf => 0x616b, 0xd0 => 0x6174, + 0xd1 => 0x616f, 0xd2 => 0x6165, 0xd3 => 0x6171, 0xd4 => 0x615f, + 0xd5 => 0x615d, 0xd6 => 0x6153, 0xd7 => 0x6175, 0xd8 => 0x6199, + 0xd9 => 0x6196, 0xda => 0x6187, 0xdb => 0x61ac, 0xdc => 0x6194, + 0xdd => 0x619a, 0xde => 0x618a, 0xdf => 0x6191, 0xe0 => 0x61ab, + 0xe1 => 0x61ae, 0xe2 => 0x61cc, 0xe3 => 0x61ca, 0xe4 => 0x61c9, + 0xe5 => 0x61f7, 0xe6 => 0x61c8, 0xe7 => 0x61c3, 0xe8 => 0x61c6, + 0xe9 => 0x61ba, 0xea => 0x61cb, 0xeb => 0x7f79, 0xec => 0x61cd, + 0xed => 0x61e6, 0xee => 0x61e3, 0xef => 0x61f6, 0xf0 => 0x61fa, + 0xf1 => 0x61f4, 0xf2 => 0x61ff, 0xf3 => 0x61fd, 0xf4 => 0x61fc, + 0xf5 => 0x61fe, 0xf6 => 0x6200, 0xf7 => 0x6208, 0xf8 => 0x6209, + 0xf9 => 0x620d, 0xfa => 0x620c, 0xfb => 0x6214, 0xfc => 0x621b, + }, + 0x9d => { + 0x40 => 0x621e, 0x41 => 0x6221, 0x42 => 0x622a, 0x43 => 0x622e, + 0x44 => 0x6230, 0x45 => 0x6232, 0x46 => 0x6233, 0x47 => 0x6241, + 0x48 => 0x624e, 0x49 => 0x625e, 0x4a => 0x6263, 0x4b => 0x625b, + 0x4c => 0x6260, 0x4d => 0x6268, 0x4e => 0x627c, 0x4f => 0x6282, + 0x50 => 0x6289, 0x51 => 0x627e, 0x52 => 0x6292, 0x53 => 0x6293, + 0x54 => 0x6296, 0x55 => 0x62d4, 0x56 => 0x6283, 0x57 => 0x6294, + 0x58 => 0x62d7, 0x59 => 0x62d1, 0x5a => 0x62bb, 0x5b => 0x62cf, + 0x5c => 0x62ff, 0x5d => 0x62c6, 0x5e => 0x64d4, 0x5f => 0x62c8, + 0x60 => 0x62dc, 0x61 => 0x62cc, 0x62 => 0x62ca, 0x63 => 0x62c2, + 0x64 => 0x62c7, 0x65 => 0x629b, 0x66 => 0x62c9, 0x67 => 0x630c, + 0x68 => 0x62ee, 0x69 => 0x62f1, 0x6a => 0x6327, 0x6b => 0x6302, + 0x6c => 0x6308, 0x6d => 0x62ef, 0x6e => 0x62f5, 0x6f => 0x6350, + 0x70 => 0x633e, 0x71 => 0x634d, 0x72 => 0x641c, 0x73 => 0x634f, + 0x74 => 0x6396, 0x75 => 0x638e, 0x76 => 0x6380, 0x77 => 0x63ab, + 0x78 => 0x6376, 0x79 => 0x63a3, 0x7a => 0x638f, 0x7b => 0x6389, + 0x7c => 0x639f, 0x7d => 0x63b5, 0x7e => 0x636b, 0x80 => 0x6369, + 0x81 => 0x63be, 0x82 => 0x63e9, 0x83 => 0x63c0, 0x84 => 0x63c6, + 0x85 => 0x63e3, 0x86 => 0x63c9, 0x87 => 0x63d2, 0x88 => 0x63f6, + 0x89 => 0x63c4, 0x8a => 0x6416, 0x8b => 0x6434, 0x8c => 0x6406, + 0x8d => 0x6413, 0x8e => 0x6426, 0x8f => 0x6436, 0x90 => 0x651d, + 0x91 => 0x6417, 0x92 => 0x6428, 0x93 => 0x640f, 0x94 => 0x6467, + 0x95 => 0x646f, 0x96 => 0x6476, 0x97 => 0x644e, 0x98 => 0x652a, + 0x99 => 0x6495, 0x9a => 0x6493, 0x9b => 0x64a5, 0x9c => 0x64a9, + 0x9d => 0x6488, 0x9e => 0x64bc, 0x9f => 0x64da, 0xa0 => 0x64d2, + 0xa1 => 0x64c5, 0xa2 => 0x64c7, 0xa3 => 0x64bb, 0xa4 => 0x64d8, + 0xa5 => 0x64c2, 0xa6 => 0x64f1, 0xa7 => 0x64e7, 0xa8 => 0x8209, + 0xa9 => 0x64e0, 0xaa => 0x64e1, 0xab => 0x62ac, 0xac => 0x64e3, + 0xad => 0x64ef, 0xae => 0x652c, 0xaf => 0x64f6, 0xb0 => 0x64f4, + 0xb1 => 0x64f2, 0xb2 => 0x64fa, 0xb3 => 0x6500, 0xb4 => 0x64fd, + 0xb5 => 0x6518, 0xb6 => 0x651c, 0xb7 => 0x6505, 0xb8 => 0x6524, + 0xb9 => 0x6523, 0xba => 0x652b, 0xbb => 0x6534, 0xbc => 0x6535, + 0xbd => 0x6537, 0xbe => 0x6536, 0xbf => 0x6538, 0xc0 => 0x754b, + 0xc1 => 0x6548, 0xc2 => 0x6556, 0xc3 => 0x6555, 0xc4 => 0x654d, + 0xc5 => 0x6558, 0xc6 => 0x655e, 0xc7 => 0x655d, 0xc8 => 0x6572, + 0xc9 => 0x6578, 0xca => 0x6582, 0xcb => 0x6583, 0xcc => 0x8b8a, + 0xcd => 0x659b, 0xce => 0x659f, 0xcf => 0x65ab, 0xd0 => 0x65b7, + 0xd1 => 0x65c3, 0xd2 => 0x65c6, 0xd3 => 0x65c1, 0xd4 => 0x65c4, + 0xd5 => 0x65cc, 0xd6 => 0x65d2, 0xd7 => 0x65db, 0xd8 => 0x65d9, + 0xd9 => 0x65e0, 0xda => 0x65e1, 0xdb => 0x65f1, 0xdc => 0x6772, + 0xdd => 0x660a, 0xde => 0x6603, 0xdf => 0x65fb, 0xe0 => 0x6773, + 0xe1 => 0x6635, 0xe2 => 0x6636, 0xe3 => 0x6634, 0xe4 => 0x661c, + 0xe5 => 0x664f, 0xe6 => 0x6644, 0xe7 => 0x6649, 0xe8 => 0x6641, + 0xe9 => 0x665e, 0xea => 0x665d, 0xeb => 0x6664, 0xec => 0x6667, + 0xed => 0x6668, 0xee => 0x665f, 0xef => 0x6662, 0xf0 => 0x6670, + 0xf1 => 0x6683, 0xf2 => 0x6688, 0xf3 => 0x668e, 0xf4 => 0x6689, + 0xf5 => 0x6684, 0xf6 => 0x6698, 0xf7 => 0x669d, 0xf8 => 0x66c1, + 0xf9 => 0x66b9, 0xfa => 0x66c9, 0xfb => 0x66be, 0xfc => 0x66bc, + }, + 0x9e => { + 0x40 => 0x66c4, 0x41 => 0x66b8, 0x42 => 0x66d6, 0x43 => 0x66da, + 0x44 => 0x66e0, 0x45 => 0x663f, 0x46 => 0x66e6, 0x47 => 0x66e9, + 0x48 => 0x66f0, 0x49 => 0x66f5, 0x4a => 0x66f7, 0x4b => 0x670f, + 0x4c => 0x6716, 0x4d => 0x671e, 0x4e => 0x6726, 0x4f => 0x6727, + 0x50 => 0x9738, 0x51 => 0x672e, 0x52 => 0x673f, 0x53 => 0x6736, + 0x54 => 0x6741, 0x55 => 0x6738, 0x56 => 0x6737, 0x57 => 0x6746, + 0x58 => 0x675e, 0x59 => 0x6760, 0x5a => 0x6759, 0x5b => 0x6763, + 0x5c => 0x6764, 0x5d => 0x6789, 0x5e => 0x6770, 0x5f => 0x67a9, + 0x60 => 0x677c, 0x61 => 0x676a, 0x62 => 0x678c, 0x63 => 0x678b, + 0x64 => 0x67a6, 0x65 => 0x67a1, 0x66 => 0x6785, 0x67 => 0x67b7, + 0x68 => 0x67ef, 0x69 => 0x67b4, 0x6a => 0x67ec, 0x6b => 0x67b3, + 0x6c => 0x67e9, 0x6d => 0x67b8, 0x6e => 0x67e4, 0x6f => 0x67de, + 0x70 => 0x67dd, 0x71 => 0x67e2, 0x72 => 0x67ee, 0x73 => 0x67b9, + 0x74 => 0x67ce, 0x75 => 0x67c6, 0x76 => 0x67e7, 0x77 => 0x6a9c, + 0x78 => 0x681e, 0x79 => 0x6846, 0x7a => 0x6829, 0x7b => 0x6840, + 0x7c => 0x684d, 0x7d => 0x6832, 0x7e => 0x684e, 0x80 => 0x68b3, + 0x81 => 0x682b, 0x82 => 0x6859, 0x83 => 0x6863, 0x84 => 0x6877, + 0x85 => 0x687f, 0x86 => 0x689f, 0x87 => 0x688f, 0x88 => 0x68ad, + 0x89 => 0x6894, 0x8a => 0x689d, 0x8b => 0x689b, 0x8c => 0x6883, + 0x8d => 0x6aae, 0x8e => 0x68b9, 0x8f => 0x6874, 0x90 => 0x68b5, + 0x91 => 0x68a0, 0x92 => 0x68ba, 0x93 => 0x690f, 0x94 => 0x688d, + 0x95 => 0x687e, 0x96 => 0x6901, 0x97 => 0x68ca, 0x98 => 0x6908, + 0x99 => 0x68d8, 0x9a => 0x6922, 0x9b => 0x6926, 0x9c => 0x68e1, + 0x9d => 0x690c, 0x9e => 0x68cd, 0x9f => 0x68d4, 0xa0 => 0x68e7, + 0xa1 => 0x68d5, 0xa2 => 0x6936, 0xa3 => 0x6912, 0xa4 => 0x6904, + 0xa5 => 0x68d7, 0xa6 => 0x68e3, 0xa7 => 0x6925, 0xa8 => 0x68f9, + 0xa9 => 0x68e0, 0xaa => 0x68ef, 0xab => 0x6928, 0xac => 0x692a, + 0xad => 0x691a, 0xae => 0x6923, 0xaf => 0x6921, 0xb0 => 0x68c6, + 0xb1 => 0x6979, 0xb2 => 0x6977, 0xb3 => 0x695c, 0xb4 => 0x6978, + 0xb5 => 0x696b, 0xb6 => 0x6954, 0xb7 => 0x697e, 0xb8 => 0x696e, + 0xb9 => 0x6939, 0xba => 0x6974, 0xbb => 0x693d, 0xbc => 0x6959, + 0xbd => 0x6930, 0xbe => 0x6961, 0xbf => 0x695e, 0xc0 => 0x695d, + 0xc1 => 0x6981, 0xc2 => 0x696a, 0xc3 => 0x69b2, 0xc4 => 0x69ae, + 0xc5 => 0x69d0, 0xc6 => 0x69bf, 0xc7 => 0x69c1, 0xc8 => 0x69d3, + 0xc9 => 0x69be, 0xca => 0x69ce, 0xcb => 0x5be8, 0xcc => 0x69ca, + 0xcd => 0x69dd, 0xce => 0x69bb, 0xcf => 0x69c3, 0xd0 => 0x69a7, + 0xd1 => 0x6a2e, 0xd2 => 0x6991, 0xd3 => 0x69a0, 0xd4 => 0x699c, + 0xd5 => 0x6995, 0xd6 => 0x69b4, 0xd7 => 0x69de, 0xd8 => 0x69e8, + 0xd9 => 0x6a02, 0xda => 0x6a1b, 0xdb => 0x69ff, 0xdc => 0x6b0a, + 0xdd => 0x69f9, 0xde => 0x69f2, 0xdf => 0x69e7, 0xe0 => 0x6a05, + 0xe1 => 0x69b1, 0xe2 => 0x6a1e, 0xe3 => 0x69ed, 0xe4 => 0x6a14, + 0xe5 => 0x69eb, 0xe6 => 0x6a0a, 0xe7 => 0x6a12, 0xe8 => 0x6ac1, + 0xe9 => 0x6a23, 0xea => 0x6a13, 0xeb => 0x6a44, 0xec => 0x6a0c, + 0xed => 0x6a72, 0xee => 0x6a36, 0xef => 0x6a78, 0xf0 => 0x6a47, + 0xf1 => 0x6a62, 0xf2 => 0x6a59, 0xf3 => 0x6a66, 0xf4 => 0x6a48, + 0xf5 => 0x6a38, 0xf6 => 0x6a22, 0xf7 => 0x6a90, 0xf8 => 0x6a8d, + 0xf9 => 0x6aa0, 0xfa => 0x6a84, 0xfb => 0x6aa2, 0xfc => 0x6aa3, + }, + 0x9f => { + 0x40 => 0x6a97, 0x41 => 0x8617, 0x42 => 0x6abb, 0x43 => 0x6ac3, + 0x44 => 0x6ac2, 0x45 => 0x6ab8, 0x46 => 0x6ab3, 0x47 => 0x6aac, + 0x48 => 0x6ade, 0x49 => 0x6ad1, 0x4a => 0x6adf, 0x4b => 0x6aaa, + 0x4c => 0x6ada, 0x4d => 0x6aea, 0x4e => 0x6afb, 0x4f => 0x6b05, + 0x50 => 0x8616, 0x51 => 0x6afa, 0x52 => 0x6b12, 0x53 => 0x6b16, + 0x54 => 0x9b31, 0x55 => 0x6b1f, 0x56 => 0x6b38, 0x57 => 0x6b37, + 0x58 => 0x76dc, 0x59 => 0x6b39, 0x5a => 0x98ee, 0x5b => 0x6b47, + 0x5c => 0x6b43, 0x5d => 0x6b49, 0x5e => 0x6b50, 0x5f => 0x6b59, + 0x60 => 0x6b54, 0x61 => 0x6b5b, 0x62 => 0x6b5f, 0x63 => 0x6b61, + 0x64 => 0x6b78, 0x65 => 0x6b79, 0x66 => 0x6b7f, 0x67 => 0x6b80, + 0x68 => 0x6b84, 0x69 => 0x6b83, 0x6a => 0x6b8d, 0x6b => 0x6b98, + 0x6c => 0x6b95, 0x6d => 0x6b9e, 0x6e => 0x6ba4, 0x6f => 0x6baa, + 0x70 => 0x6bab, 0x71 => 0x6baf, 0x72 => 0x6bb2, 0x73 => 0x6bb1, + 0x74 => 0x6bb3, 0x75 => 0x6bb7, 0x76 => 0x6bbc, 0x77 => 0x6bc6, + 0x78 => 0x6bcb, 0x79 => 0x6bd3, 0x7a => 0x6bdf, 0x7b => 0x6bec, + 0x7c => 0x6beb, 0x7d => 0x6bf3, 0x7e => 0x6bef, 0x80 => 0x9ebe, + 0x81 => 0x6c08, 0x82 => 0x6c13, 0x83 => 0x6c14, 0x84 => 0x6c1b, + 0x85 => 0x6c24, 0x86 => 0x6c23, 0x87 => 0x6c5e, 0x88 => 0x6c55, + 0x89 => 0x6c62, 0x8a => 0x6c6a, 0x8b => 0x6c82, 0x8c => 0x6c8d, + 0x8d => 0x6c9a, 0x8e => 0x6c81, 0x8f => 0x6c9b, 0x90 => 0x6c7e, + 0x91 => 0x6c68, 0x92 => 0x6c73, 0x93 => 0x6c92, 0x94 => 0x6c90, + 0x95 => 0x6cc4, 0x96 => 0x6cf1, 0x97 => 0x6cd3, 0x98 => 0x6cbd, + 0x99 => 0x6cd7, 0x9a => 0x6cc5, 0x9b => 0x6cdd, 0x9c => 0x6cae, + 0x9d => 0x6cb1, 0x9e => 0x6cbe, 0x9f => 0x6cba, 0xa0 => 0x6cdb, + 0xa1 => 0x6cef, 0xa2 => 0x6cd9, 0xa3 => 0x6cea, 0xa4 => 0x6d1f, + 0xa5 => 0x884d, 0xa6 => 0x6d36, 0xa7 => 0x6d2b, 0xa8 => 0x6d3d, + 0xa9 => 0x6d38, 0xaa => 0x6d19, 0xab => 0x6d35, 0xac => 0x6d33, + 0xad => 0x6d12, 0xae => 0x6d0c, 0xaf => 0x6d63, 0xb0 => 0x6d93, + 0xb1 => 0x6d64, 0xb2 => 0x6d5a, 0xb3 => 0x6d79, 0xb4 => 0x6d59, + 0xb5 => 0x6d8e, 0xb6 => 0x6d95, 0xb7 => 0x6fe4, 0xb8 => 0x6d85, + 0xb9 => 0x6df9, 0xba => 0x6e15, 0xbb => 0x6e0a, 0xbc => 0x6db5, + 0xbd => 0x6dc7, 0xbe => 0x6de6, 0xbf => 0x6db8, 0xc0 => 0x6dc6, + 0xc1 => 0x6dec, 0xc2 => 0x6dde, 0xc3 => 0x6dcc, 0xc4 => 0x6de8, + 0xc5 => 0x6dd2, 0xc6 => 0x6dc5, 0xc7 => 0x6dfa, 0xc8 => 0x6dd9, + 0xc9 => 0x6de4, 0xca => 0x6dd5, 0xcb => 0x6dea, 0xcc => 0x6dee, + 0xcd => 0x6e2d, 0xce => 0x6e6e, 0xcf => 0x6e2e, 0xd0 => 0x6e19, + 0xd1 => 0x6e72, 0xd2 => 0x6e5f, 0xd3 => 0x6e3e, 0xd4 => 0x6e23, + 0xd5 => 0x6e6b, 0xd6 => 0x6e2b, 0xd7 => 0x6e76, 0xd8 => 0x6e4d, + 0xd9 => 0x6e1f, 0xda => 0x6e43, 0xdb => 0x6e3a, 0xdc => 0x6e4e, + 0xdd => 0x6e24, 0xde => 0x6eff, 0xdf => 0x6e1d, 0xe0 => 0x6e38, + 0xe1 => 0x6e82, 0xe2 => 0x6eaa, 0xe3 => 0x6e98, 0xe4 => 0x6ec9, + 0xe5 => 0x6eb7, 0xe6 => 0x6ed3, 0xe7 => 0x6ebd, 0xe8 => 0x6eaf, + 0xe9 => 0x6ec4, 0xea => 0x6eb2, 0xeb => 0x6ed4, 0xec => 0x6ed5, + 0xed => 0x6e8f, 0xee => 0x6ea5, 0xef => 0x6ec2, 0xf0 => 0x6e9f, + 0xf1 => 0x6f41, 0xf2 => 0x6f11, 0xf3 => 0x704c, 0xf4 => 0x6eec, + 0xf5 => 0x6ef8, 0xf6 => 0x6efe, 0xf7 => 0x6f3f, 0xf8 => 0x6ef2, + 0xf9 => 0x6f31, 0xfa => 0x6eef, 0xfb => 0x6f32, 0xfc => 0x6ecc, + }, + 0xa1 => 0xff61, 0xa2 => 0xff62, 0xa3 => 0xff63, 0xa4 => 0xff64, + 0xa5 => 0xff65, 0xa6 => 0xff66, 0xa7 => 0xff67, 0xa8 => 0xff68, + 0xa9 => 0xff69, 0xaa => 0xff6a, 0xab => 0xff6b, 0xac => 0xff6c, + 0xad => 0xff6d, 0xae => 0xff6e, 0xaf => 0xff6f, 0xb0 => 0xff70, + 0xb1 => 0xff71, 0xb2 => 0xff72, 0xb3 => 0xff73, 0xb4 => 0xff74, + 0xb5 => 0xff75, 0xb6 => 0xff76, 0xb7 => 0xff77, 0xb8 => 0xff78, + 0xb9 => 0xff79, 0xba => 0xff7a, 0xbb => 0xff7b, 0xbc => 0xff7c, + 0xbd => 0xff7d, 0xbe => 0xff7e, 0xbf => 0xff7f, 0xc0 => 0xff80, + 0xc1 => 0xff81, 0xc2 => 0xff82, 0xc3 => 0xff83, 0xc4 => 0xff84, + 0xc5 => 0xff85, 0xc6 => 0xff86, 0xc7 => 0xff87, 0xc8 => 0xff88, + 0xc9 => 0xff89, 0xca => 0xff8a, 0xcb => 0xff8b, 0xcc => 0xff8c, + 0xcd => 0xff8d, 0xce => 0xff8e, 0xcf => 0xff8f, 0xd0 => 0xff90, + 0xd1 => 0xff91, 0xd2 => 0xff92, 0xd3 => 0xff93, 0xd4 => 0xff94, + 0xd5 => 0xff95, 0xd6 => 0xff96, 0xd7 => 0xff97, 0xd8 => 0xff98, + 0xd9 => 0xff99, 0xda => 0xff9a, 0xdb => 0xff9b, 0xdc => 0xff9c, + 0xdd => 0xff9d, 0xde => 0xff9e, 0xdf => 0xff9f, + 0xe0 => { + 0x40 => 0x6f3e, 0x41 => 0x6f13, 0x42 => 0x6ef7, 0x43 => 0x6f86, + 0x44 => 0x6f7a, 0x45 => 0x6f78, 0x46 => 0x6f81, 0x47 => 0x6f80, + 0x48 => 0x6f6f, 0x49 => 0x6f5b, 0x4a => 0x6ff3, 0x4b => 0x6f6d, + 0x4c => 0x6f82, 0x4d => 0x6f7c, 0x4e => 0x6f58, 0x4f => 0x6f8e, + 0x50 => 0x6f91, 0x51 => 0x6fc2, 0x52 => 0x6f66, 0x53 => 0x6fb3, + 0x54 => 0x6fa3, 0x55 => 0x6fa1, 0x56 => 0x6fa4, 0x57 => 0x6fb9, + 0x58 => 0x6fc6, 0x59 => 0x6faa, 0x5a => 0x6fdf, 0x5b => 0x6fd5, + 0x5c => 0x6fec, 0x5d => 0x6fd4, 0x5e => 0x6fd8, 0x5f => 0x6ff1, + 0x60 => 0x6fee, 0x61 => 0x6fdb, 0x62 => 0x7009, 0x63 => 0x700b, + 0x64 => 0x6ffa, 0x65 => 0x7011, 0x66 => 0x7001, 0x67 => 0x700f, + 0x68 => 0x6ffe, 0x69 => 0x701b, 0x6a => 0x701a, 0x6b => 0x6f74, + 0x6c => 0x701d, 0x6d => 0x7018, 0x6e => 0x701f, 0x6f => 0x7030, + 0x70 => 0x703e, 0x71 => 0x7032, 0x72 => 0x7051, 0x73 => 0x7063, + 0x74 => 0x7099, 0x75 => 0x7092, 0x76 => 0x70af, 0x77 => 0x70f1, + 0x78 => 0x70ac, 0x79 => 0x70b8, 0x7a => 0x70b3, 0x7b => 0x70ae, + 0x7c => 0x70df, 0x7d => 0x70cb, 0x7e => 0x70dd, 0x80 => 0x70d9, + 0x81 => 0x7109, 0x82 => 0x70fd, 0x83 => 0x711c, 0x84 => 0x7119, + 0x85 => 0x7165, 0x86 => 0x7155, 0x87 => 0x7188, 0x88 => 0x7166, + 0x89 => 0x7162, 0x8a => 0x714c, 0x8b => 0x7156, 0x8c => 0x716c, + 0x8d => 0x718f, 0x8e => 0x71fb, 0x8f => 0x7184, 0x90 => 0x7195, + 0x91 => 0x71a8, 0x92 => 0x71ac, 0x93 => 0x71d7, 0x94 => 0x71b9, + 0x95 => 0x71be, 0x96 => 0x71d2, 0x97 => 0x71c9, 0x98 => 0x71d4, + 0x99 => 0x71ce, 0x9a => 0x71e0, 0x9b => 0x71ec, 0x9c => 0x71e7, + 0x9d => 0x71f5, 0x9e => 0x71fc, 0x9f => 0x71f9, 0xa0 => 0x71ff, + 0xa1 => 0x720d, 0xa2 => 0x7210, 0xa3 => 0x721b, 0xa4 => 0x7228, + 0xa5 => 0x722d, 0xa6 => 0x722c, 0xa7 => 0x7230, 0xa8 => 0x7232, + 0xa9 => 0x723b, 0xaa => 0x723c, 0xab => 0x723f, 0xac => 0x7240, + 0xad => 0x7246, 0xae => 0x724b, 0xaf => 0x7258, 0xb0 => 0x7274, + 0xb1 => 0x727e, 0xb2 => 0x7282, 0xb3 => 0x7281, 0xb4 => 0x7287, + 0xb5 => 0x7292, 0xb6 => 0x7296, 0xb7 => 0x72a2, 0xb8 => 0x72a7, + 0xb9 => 0x72b9, 0xba => 0x72b2, 0xbb => 0x72c3, 0xbc => 0x72c6, + 0xbd => 0x72c4, 0xbe => 0x72ce, 0xbf => 0x72d2, 0xc0 => 0x72e2, + 0xc1 => 0x72e0, 0xc2 => 0x72e1, 0xc3 => 0x72f9, 0xc4 => 0x72f7, + 0xc5 => 0x500f, 0xc6 => 0x7317, 0xc7 => 0x730a, 0xc8 => 0x731c, + 0xc9 => 0x7316, 0xca => 0x731d, 0xcb => 0x7334, 0xcc => 0x732f, + 0xcd => 0x7329, 0xce => 0x7325, 0xcf => 0x733e, 0xd0 => 0x734e, + 0xd1 => 0x734f, 0xd2 => 0x9ed8, 0xd3 => 0x7357, 0xd4 => 0x736a, + 0xd5 => 0x7368, 0xd6 => 0x7370, 0xd7 => 0x7378, 0xd8 => 0x7375, + 0xd9 => 0x737b, 0xda => 0x737a, 0xdb => 0x73c8, 0xdc => 0x73b3, + 0xdd => 0x73ce, 0xde => 0x73bb, 0xdf => 0x73c0, 0xe0 => 0x73e5, + 0xe1 => 0x73ee, 0xe2 => 0x73de, 0xe3 => 0x74a2, 0xe4 => 0x7405, + 0xe5 => 0x746f, 0xe6 => 0x7425, 0xe7 => 0x73f8, 0xe8 => 0x7432, + 0xe9 => 0x743a, 0xea => 0x7455, 0xeb => 0x743f, 0xec => 0x745f, + 0xed => 0x7459, 0xee => 0x7441, 0xef => 0x745c, 0xf0 => 0x7469, + 0xf1 => 0x7470, 0xf2 => 0x7463, 0xf3 => 0x746a, 0xf4 => 0x7476, + 0xf5 => 0x747e, 0xf6 => 0x748b, 0xf7 => 0x749e, 0xf8 => 0x74a7, + 0xf9 => 0x74ca, 0xfa => 0x74cf, 0xfb => 0x74d4, 0xfc => 0x73f1, + }, + 0xe1 => { + 0x40 => 0x74e0, 0x41 => 0x74e3, 0x42 => 0x74e7, 0x43 => 0x74e9, + 0x44 => 0x74ee, 0x45 => 0x74f2, 0x46 => 0x74f0, 0x47 => 0x74f1, + 0x48 => 0x74f8, 0x49 => 0x74f7, 0x4a => 0x7504, 0x4b => 0x7503, + 0x4c => 0x7505, 0x4d => 0x750c, 0x4e => 0x750e, 0x4f => 0x750d, + 0x50 => 0x7515, 0x51 => 0x7513, 0x52 => 0x751e, 0x53 => 0x7526, + 0x54 => 0x752c, 0x55 => 0x753c, 0x56 => 0x7544, 0x57 => 0x754d, + 0x58 => 0x754a, 0x59 => 0x7549, 0x5a => 0x755b, 0x5b => 0x7546, + 0x5c => 0x755a, 0x5d => 0x7569, 0x5e => 0x7564, 0x5f => 0x7567, + 0x60 => 0x756b, 0x61 => 0x756d, 0x62 => 0x7578, 0x63 => 0x7576, + 0x64 => 0x7586, 0x65 => 0x7587, 0x66 => 0x7574, 0x67 => 0x758a, + 0x68 => 0x7589, 0x69 => 0x7582, 0x6a => 0x7594, 0x6b => 0x759a, + 0x6c => 0x759d, 0x6d => 0x75a5, 0x6e => 0x75a3, 0x6f => 0x75c2, + 0x70 => 0x75b3, 0x71 => 0x75c3, 0x72 => 0x75b5, 0x73 => 0x75bd, + 0x74 => 0x75b8, 0x75 => 0x75bc, 0x76 => 0x75b1, 0x77 => 0x75cd, + 0x78 => 0x75ca, 0x79 => 0x75d2, 0x7a => 0x75d9, 0x7b => 0x75e3, + 0x7c => 0x75de, 0x7d => 0x75fe, 0x7e => 0x75ff, 0x80 => 0x75fc, + 0x81 => 0x7601, 0x82 => 0x75f0, 0x83 => 0x75fa, 0x84 => 0x75f2, + 0x85 => 0x75f3, 0x86 => 0x760b, 0x87 => 0x760d, 0x88 => 0x7609, + 0x89 => 0x761f, 0x8a => 0x7627, 0x8b => 0x7620, 0x8c => 0x7621, + 0x8d => 0x7622, 0x8e => 0x7624, 0x8f => 0x7634, 0x90 => 0x7630, + 0x91 => 0x763b, 0x92 => 0x7647, 0x93 => 0x7648, 0x94 => 0x7646, + 0x95 => 0x765c, 0x96 => 0x7658, 0x97 => 0x7661, 0x98 => 0x7662, + 0x99 => 0x7668, 0x9a => 0x7669, 0x9b => 0x766a, 0x9c => 0x7667, + 0x9d => 0x766c, 0x9e => 0x7670, 0x9f => 0x7672, 0xa0 => 0x7676, + 0xa1 => 0x7678, 0xa2 => 0x767c, 0xa3 => 0x7680, 0xa4 => 0x7683, + 0xa5 => 0x7688, 0xa6 => 0x768b, 0xa7 => 0x768e, 0xa8 => 0x7696, + 0xa9 => 0x7693, 0xaa => 0x7699, 0xab => 0x769a, 0xac => 0x76b0, + 0xad => 0x76b4, 0xae => 0x76b8, 0xaf => 0x76b9, 0xb0 => 0x76ba, + 0xb1 => 0x76c2, 0xb2 => 0x76cd, 0xb3 => 0x76d6, 0xb4 => 0x76d2, + 0xb5 => 0x76de, 0xb6 => 0x76e1, 0xb7 => 0x76e5, 0xb8 => 0x76e7, + 0xb9 => 0x76ea, 0xba => 0x862f, 0xbb => 0x76fb, 0xbc => 0x7708, + 0xbd => 0x7707, 0xbe => 0x7704, 0xbf => 0x7729, 0xc0 => 0x7724, + 0xc1 => 0x771e, 0xc2 => 0x7725, 0xc3 => 0x7726, 0xc4 => 0x771b, + 0xc5 => 0x7737, 0xc6 => 0x7738, 0xc7 => 0x7747, 0xc8 => 0x775a, + 0xc9 => 0x7768, 0xca => 0x776b, 0xcb => 0x775b, 0xcc => 0x7765, + 0xcd => 0x777f, 0xce => 0x777e, 0xcf => 0x7779, 0xd0 => 0x778e, + 0xd1 => 0x778b, 0xd2 => 0x7791, 0xd3 => 0x77a0, 0xd4 => 0x779e, + 0xd5 => 0x77b0, 0xd6 => 0x77b6, 0xd7 => 0x77b9, 0xd8 => 0x77bf, + 0xd9 => 0x77bc, 0xda => 0x77bd, 0xdb => 0x77bb, 0xdc => 0x77c7, + 0xdd => 0x77cd, 0xde => 0x77d7, 0xdf => 0x77da, 0xe0 => 0x77dc, + 0xe1 => 0x77e3, 0xe2 => 0x77ee, 0xe3 => 0x77fc, 0xe4 => 0x780c, + 0xe5 => 0x7812, 0xe6 => 0x7926, 0xe7 => 0x7820, 0xe8 => 0x792a, + 0xe9 => 0x7845, 0xea => 0x788e, 0xeb => 0x7874, 0xec => 0x7886, + 0xed => 0x787c, 0xee => 0x789a, 0xef => 0x788c, 0xf0 => 0x78a3, + 0xf1 => 0x78b5, 0xf2 => 0x78aa, 0xf3 => 0x78af, 0xf4 => 0x78d1, + 0xf5 => 0x78c6, 0xf6 => 0x78cb, 0xf7 => 0x78d4, 0xf8 => 0x78be, + 0xf9 => 0x78bc, 0xfa => 0x78c5, 0xfb => 0x78ca, 0xfc => 0x78ec, + }, + 0xe2 => { + 0x40 => 0x78e7, 0x41 => 0x78da, 0x42 => 0x78fd, 0x43 => 0x78f4, + 0x44 => 0x7907, 0x45 => 0x7912, 0x46 => 0x7911, 0x47 => 0x7919, + 0x48 => 0x792c, 0x49 => 0x792b, 0x4a => 0x7940, 0x4b => 0x7960, + 0x4c => 0x7957, 0x4d => 0x795f, 0x4e => 0x795a, 0x4f => 0x7955, + 0x50 => 0x7953, 0x51 => 0x797a, 0x52 => 0x797f, 0x53 => 0x798a, + 0x54 => 0x799d, 0x55 => 0x79a7, 0x56 => 0x9f4b, 0x57 => 0x79aa, + 0x58 => 0x79ae, 0x59 => 0x79b3, 0x5a => 0x79b9, 0x5b => 0x79ba, + 0x5c => 0x79c9, 0x5d => 0x79d5, 0x5e => 0x79e7, 0x5f => 0x79ec, + 0x60 => 0x79e1, 0x61 => 0x79e3, 0x62 => 0x7a08, 0x63 => 0x7a0d, + 0x64 => 0x7a18, 0x65 => 0x7a19, 0x66 => 0x7a20, 0x67 => 0x7a1f, + 0x68 => 0x7980, 0x69 => 0x7a31, 0x6a => 0x7a3b, 0x6b => 0x7a3e, + 0x6c => 0x7a37, 0x6d => 0x7a43, 0x6e => 0x7a57, 0x6f => 0x7a49, + 0x70 => 0x7a61, 0x71 => 0x7a62, 0x72 => 0x7a69, 0x73 => 0x9f9d, + 0x74 => 0x7a70, 0x75 => 0x7a79, 0x76 => 0x7a7d, 0x77 => 0x7a88, + 0x78 => 0x7a97, 0x79 => 0x7a95, 0x7a => 0x7a98, 0x7b => 0x7a96, + 0x7c => 0x7aa9, 0x7d => 0x7ac8, 0x7e => 0x7ab0, 0x80 => 0x7ab6, + 0x81 => 0x7ac5, 0x82 => 0x7ac4, 0x83 => 0x7abf, 0x84 => 0x9083, + 0x85 => 0x7ac7, 0x86 => 0x7aca, 0x87 => 0x7acd, 0x88 => 0x7acf, + 0x89 => 0x7ad5, 0x8a => 0x7ad3, 0x8b => 0x7ad9, 0x8c => 0x7ada, + 0x8d => 0x7add, 0x8e => 0x7ae1, 0x8f => 0x7ae2, 0x90 => 0x7ae6, + 0x91 => 0x7aed, 0x92 => 0x7af0, 0x93 => 0x7b02, 0x94 => 0x7b0f, + 0x95 => 0x7b0a, 0x96 => 0x7b06, 0x97 => 0x7b33, 0x98 => 0x7b18, + 0x99 => 0x7b19, 0x9a => 0x7b1e, 0x9b => 0x7b35, 0x9c => 0x7b28, + 0x9d => 0x7b36, 0x9e => 0x7b50, 0x9f => 0x7b7a, 0xa0 => 0x7b04, + 0xa1 => 0x7b4d, 0xa2 => 0x7b0b, 0xa3 => 0x7b4c, 0xa4 => 0x7b45, + 0xa5 => 0x7b75, 0xa6 => 0x7b65, 0xa7 => 0x7b74, 0xa8 => 0x7b67, + 0xa9 => 0x7b70, 0xaa => 0x7b71, 0xab => 0x7b6c, 0xac => 0x7b6e, + 0xad => 0x7b9d, 0xae => 0x7b98, 0xaf => 0x7b9f, 0xb0 => 0x7b8d, + 0xb1 => 0x7b9c, 0xb2 => 0x7b9a, 0xb3 => 0x7b8b, 0xb4 => 0x7b92, + 0xb5 => 0x7b8f, 0xb6 => 0x7b5d, 0xb7 => 0x7b99, 0xb8 => 0x7bcb, + 0xb9 => 0x7bc1, 0xba => 0x7bcc, 0xbb => 0x7bcf, 0xbc => 0x7bb4, + 0xbd => 0x7bc6, 0xbe => 0x7bdd, 0xbf => 0x7be9, 0xc0 => 0x7c11, + 0xc1 => 0x7c14, 0xc2 => 0x7be6, 0xc3 => 0x7be5, 0xc4 => 0x7c60, + 0xc5 => 0x7c00, 0xc6 => 0x7c07, 0xc7 => 0x7c13, 0xc8 => 0x7bf3, + 0xc9 => 0x7bf7, 0xca => 0x7c17, 0xcb => 0x7c0d, 0xcc => 0x7bf6, + 0xcd => 0x7c23, 0xce => 0x7c27, 0xcf => 0x7c2a, 0xd0 => 0x7c1f, + 0xd1 => 0x7c37, 0xd2 => 0x7c2b, 0xd3 => 0x7c3d, 0xd4 => 0x7c4c, + 0xd5 => 0x7c43, 0xd6 => 0x7c54, 0xd7 => 0x7c4f, 0xd8 => 0x7c40, + 0xd9 => 0x7c50, 0xda => 0x7c58, 0xdb => 0x7c5f, 0xdc => 0x7c64, + 0xdd => 0x7c56, 0xde => 0x7c65, 0xdf => 0x7c6c, 0xe0 => 0x7c75, + 0xe1 => 0x7c83, 0xe2 => 0x7c90, 0xe3 => 0x7ca4, 0xe4 => 0x7cad, + 0xe5 => 0x7ca2, 0xe6 => 0x7cab, 0xe7 => 0x7ca1, 0xe8 => 0x7ca8, + 0xe9 => 0x7cb3, 0xea => 0x7cb2, 0xeb => 0x7cb1, 0xec => 0x7cae, + 0xed => 0x7cb9, 0xee => 0x7cbd, 0xef => 0x7cc0, 0xf0 => 0x7cc5, + 0xf1 => 0x7cc2, 0xf2 => 0x7cd8, 0xf3 => 0x7cd2, 0xf4 => 0x7cdc, + 0xf5 => 0x7ce2, 0xf6 => 0x9b3b, 0xf7 => 0x7cef, 0xf8 => 0x7cf2, + 0xf9 => 0x7cf4, 0xfa => 0x7cf6, 0xfb => 0x7cfa, 0xfc => 0x7d06, + }, + 0xe3 => { + 0x40 => 0x7d02, 0x41 => 0x7d1c, 0x42 => 0x7d15, 0x43 => 0x7d0a, + 0x44 => 0x7d45, 0x45 => 0x7d4b, 0x46 => 0x7d2e, 0x47 => 0x7d32, + 0x48 => 0x7d3f, 0x49 => 0x7d35, 0x4a => 0x7d46, 0x4b => 0x7d73, + 0x4c => 0x7d56, 0x4d => 0x7d4e, 0x4e => 0x7d72, 0x4f => 0x7d68, + 0x50 => 0x7d6e, 0x51 => 0x7d4f, 0x52 => 0x7d63, 0x53 => 0x7d93, + 0x54 => 0x7d89, 0x55 => 0x7d5b, 0x56 => 0x7d8f, 0x57 => 0x7d7d, + 0x58 => 0x7d9b, 0x59 => 0x7dba, 0x5a => 0x7dae, 0x5b => 0x7da3, + 0x5c => 0x7db5, 0x5d => 0x7dc7, 0x5e => 0x7dbd, 0x5f => 0x7dab, + 0x60 => 0x7e3d, 0x61 => 0x7da2, 0x62 => 0x7daf, 0x63 => 0x7ddc, + 0x64 => 0x7db8, 0x65 => 0x7d9f, 0x66 => 0x7db0, 0x67 => 0x7dd8, + 0x68 => 0x7ddd, 0x69 => 0x7de4, 0x6a => 0x7dde, 0x6b => 0x7dfb, + 0x6c => 0x7df2, 0x6d => 0x7de1, 0x6e => 0x7e05, 0x6f => 0x7e0a, + 0x70 => 0x7e23, 0x71 => 0x7e21, 0x72 => 0x7e12, 0x73 => 0x7e31, + 0x74 => 0x7e1f, 0x75 => 0x7e09, 0x76 => 0x7e0b, 0x77 => 0x7e22, + 0x78 => 0x7e46, 0x79 => 0x7e66, 0x7a => 0x7e3b, 0x7b => 0x7e35, + 0x7c => 0x7e39, 0x7d => 0x7e43, 0x7e => 0x7e37, 0x80 => 0x7e32, + 0x81 => 0x7e3a, 0x82 => 0x7e67, 0x83 => 0x7e5d, 0x84 => 0x7e56, + 0x85 => 0x7e5e, 0x86 => 0x7e59, 0x87 => 0x7e5a, 0x88 => 0x7e79, + 0x89 => 0x7e6a, 0x8a => 0x7e69, 0x8b => 0x7e7c, 0x8c => 0x7e7b, + 0x8d => 0x7e83, 0x8e => 0x7dd5, 0x8f => 0x7e7d, 0x90 => 0x8fae, + 0x91 => 0x7e7f, 0x92 => 0x7e88, 0x93 => 0x7e89, 0x94 => 0x7e8c, + 0x95 => 0x7e92, 0x96 => 0x7e90, 0x97 => 0x7e93, 0x98 => 0x7e94, + 0x99 => 0x7e96, 0x9a => 0x7e8e, 0x9b => 0x7e9b, 0x9c => 0x7e9c, + 0x9d => 0x7f38, 0x9e => 0x7f3a, 0x9f => 0x7f45, 0xa0 => 0x7f4c, + 0xa1 => 0x7f4d, 0xa2 => 0x7f4e, 0xa3 => 0x7f50, 0xa4 => 0x7f51, + 0xa5 => 0x7f55, 0xa6 => 0x7f54, 0xa7 => 0x7f58, 0xa8 => 0x7f5f, + 0xa9 => 0x7f60, 0xaa => 0x7f68, 0xab => 0x7f69, 0xac => 0x7f67, + 0xad => 0x7f78, 0xae => 0x7f82, 0xaf => 0x7f86, 0xb0 => 0x7f83, + 0xb1 => 0x7f88, 0xb2 => 0x7f87, 0xb3 => 0x7f8c, 0xb4 => 0x7f94, + 0xb5 => 0x7f9e, 0xb6 => 0x7f9d, 0xb7 => 0x7f9a, 0xb8 => 0x7fa3, + 0xb9 => 0x7faf, 0xba => 0x7fb2, 0xbb => 0x7fb9, 0xbc => 0x7fae, + 0xbd => 0x7fb6, 0xbe => 0x7fb8, 0xbf => 0x8b71, 0xc0 => 0x7fc5, + 0xc1 => 0x7fc6, 0xc2 => 0x7fca, 0xc3 => 0x7fd5, 0xc4 => 0x7fd4, + 0xc5 => 0x7fe1, 0xc6 => 0x7fe6, 0xc7 => 0x7fe9, 0xc8 => 0x7ff3, + 0xc9 => 0x7ff9, 0xca => 0x98dc, 0xcb => 0x8006, 0xcc => 0x8004, + 0xcd => 0x800b, 0xce => 0x8012, 0xcf => 0x8018, 0xd0 => 0x8019, + 0xd1 => 0x801c, 0xd2 => 0x8021, 0xd3 => 0x8028, 0xd4 => 0x803f, + 0xd5 => 0x803b, 0xd6 => 0x804a, 0xd7 => 0x8046, 0xd8 => 0x8052, + 0xd9 => 0x8058, 0xda => 0x805a, 0xdb => 0x805f, 0xdc => 0x8062, + 0xdd => 0x8068, 0xde => 0x8073, 0xdf => 0x8072, 0xe0 => 0x8070, + 0xe1 => 0x8076, 0xe2 => 0x8079, 0xe3 => 0x807d, 0xe4 => 0x807f, + 0xe5 => 0x8084, 0xe6 => 0x8086, 0xe7 => 0x8085, 0xe8 => 0x809b, + 0xe9 => 0x8093, 0xea => 0x809a, 0xeb => 0x80ad, 0xec => 0x5190, + 0xed => 0x80ac, 0xee => 0x80db, 0xef => 0x80e5, 0xf0 => 0x80d9, + 0xf1 => 0x80dd, 0xf2 => 0x80c4, 0xf3 => 0x80da, 0xf4 => 0x80d6, + 0xf5 => 0x8109, 0xf6 => 0x80ef, 0xf7 => 0x80f1, 0xf8 => 0x811b, + 0xf9 => 0x8129, 0xfa => 0x8123, 0xfb => 0x812f, 0xfc => 0x814b, + }, + 0xe4 => { + 0x40 => 0x968b, 0x41 => 0x8146, 0x42 => 0x813e, 0x43 => 0x8153, + 0x44 => 0x8151, 0x45 => 0x80fc, 0x46 => 0x8171, 0x47 => 0x816e, + 0x48 => 0x8165, 0x49 => 0x8166, 0x4a => 0x8174, 0x4b => 0x8183, + 0x4c => 0x8188, 0x4d => 0x818a, 0x4e => 0x8180, 0x4f => 0x8182, + 0x50 => 0x81a0, 0x51 => 0x8195, 0x52 => 0x81a4, 0x53 => 0x81a3, + 0x54 => 0x815f, 0x55 => 0x8193, 0x56 => 0x81a9, 0x57 => 0x81b0, + 0x58 => 0x81b5, 0x59 => 0x81be, 0x5a => 0x81b8, 0x5b => 0x81bd, + 0x5c => 0x81c0, 0x5d => 0x81c2, 0x5e => 0x81ba, 0x5f => 0x81c9, + 0x60 => 0x81cd, 0x61 => 0x81d1, 0x62 => 0x81d9, 0x63 => 0x81d8, + 0x64 => 0x81c8, 0x65 => 0x81da, 0x66 => 0x81df, 0x67 => 0x81e0, + 0x68 => 0x81e7, 0x69 => 0x81fa, 0x6a => 0x81fb, 0x6b => 0x81fe, + 0x6c => 0x8201, 0x6d => 0x8202, 0x6e => 0x8205, 0x6f => 0x8207, + 0x70 => 0x820a, 0x71 => 0x820d, 0x72 => 0x8210, 0x73 => 0x8216, + 0x74 => 0x8229, 0x75 => 0x822b, 0x76 => 0x8238, 0x77 => 0x8233, + 0x78 => 0x8240, 0x79 => 0x8259, 0x7a => 0x8258, 0x7b => 0x825d, + 0x7c => 0x825a, 0x7d => 0x825f, 0x7e => 0x8264, 0x80 => 0x8262, + 0x81 => 0x8268, 0x82 => 0x826a, 0x83 => 0x826b, 0x84 => 0x822e, + 0x85 => 0x8271, 0x86 => 0x8277, 0x87 => 0x8278, 0x88 => 0x827e, + 0x89 => 0x828d, 0x8a => 0x8292, 0x8b => 0x82ab, 0x8c => 0x829f, + 0x8d => 0x82bb, 0x8e => 0x82ac, 0x8f => 0x82e1, 0x90 => 0x82e3, + 0x91 => 0x82df, 0x92 => 0x82d2, 0x93 => 0x82f4, 0x94 => 0x82f3, + 0x95 => 0x82fa, 0x96 => 0x8393, 0x97 => 0x8303, 0x98 => 0x82fb, + 0x99 => 0x82f9, 0x9a => 0x82de, 0x9b => 0x8306, 0x9c => 0x82dc, + 0x9d => 0x8309, 0x9e => 0x82d9, 0x9f => 0x8335, 0xa0 => 0x8334, + 0xa1 => 0x8316, 0xa2 => 0x8332, 0xa3 => 0x8331, 0xa4 => 0x8340, + 0xa5 => 0x8339, 0xa6 => 0x8350, 0xa7 => 0x8345, 0xa8 => 0x832f, + 0xa9 => 0x832b, 0xaa => 0x8317, 0xab => 0x8318, 0xac => 0x8385, + 0xad => 0x839a, 0xae => 0x83aa, 0xaf => 0x839f, 0xb0 => 0x83a2, + 0xb1 => 0x8396, 0xb2 => 0x8323, 0xb3 => 0x838e, 0xb4 => 0x8387, + 0xb5 => 0x838a, 0xb6 => 0x837c, 0xb7 => 0x83b5, 0xb8 => 0x8373, + 0xb9 => 0x8375, 0xba => 0x83a0, 0xbb => 0x8389, 0xbc => 0x83a8, + 0xbd => 0x83f4, 0xbe => 0x8413, 0xbf => 0x83eb, 0xc0 => 0x83ce, + 0xc1 => 0x83fd, 0xc2 => 0x8403, 0xc3 => 0x83d8, 0xc4 => 0x840b, + 0xc5 => 0x83c1, 0xc6 => 0x83f7, 0xc7 => 0x8407, 0xc8 => 0x83e0, + 0xc9 => 0x83f2, 0xca => 0x840d, 0xcb => 0x8422, 0xcc => 0x8420, + 0xcd => 0x83bd, 0xce => 0x8438, 0xcf => 0x8506, 0xd0 => 0x83fb, + 0xd1 => 0x846d, 0xd2 => 0x842a, 0xd3 => 0x843c, 0xd4 => 0x855a, + 0xd5 => 0x8484, 0xd6 => 0x8477, 0xd7 => 0x846b, 0xd8 => 0x84ad, + 0xd9 => 0x846e, 0xda => 0x8482, 0xdb => 0x8469, 0xdc => 0x8446, + 0xdd => 0x842c, 0xde => 0x846f, 0xdf => 0x8479, 0xe0 => 0x8435, + 0xe1 => 0x84ca, 0xe2 => 0x8462, 0xe3 => 0x84b9, 0xe4 => 0x84bf, + 0xe5 => 0x849f, 0xe6 => 0x84d9, 0xe7 => 0x84cd, 0xe8 => 0x84bb, + 0xe9 => 0x84da, 0xea => 0x84d0, 0xeb => 0x84c1, 0xec => 0x84c6, + 0xed => 0x84d6, 0xee => 0x84a1, 0xef => 0x8521, 0xf0 => 0x84ff, + 0xf1 => 0x84f4, 0xf2 => 0x8517, 0xf3 => 0x8518, 0xf4 => 0x852c, + 0xf5 => 0x851f, 0xf6 => 0x8515, 0xf7 => 0x8514, 0xf8 => 0x84fc, + 0xf9 => 0x8540, 0xfa => 0x8563, 0xfb => 0x8558, 0xfc => 0x8548, + }, + 0xe5 => { + 0x40 => 0x8541, 0x41 => 0x8602, 0x42 => 0x854b, 0x43 => 0x8555, + 0x44 => 0x8580, 0x45 => 0x85a4, 0x46 => 0x8588, 0x47 => 0x8591, + 0x48 => 0x858a, 0x49 => 0x85a8, 0x4a => 0x856d, 0x4b => 0x8594, + 0x4c => 0x859b, 0x4d => 0x85ea, 0x4e => 0x8587, 0x4f => 0x859c, + 0x50 => 0x8577, 0x51 => 0x857e, 0x52 => 0x8590, 0x53 => 0x85c9, + 0x54 => 0x85ba, 0x55 => 0x85cf, 0x56 => 0x85b9, 0x57 => 0x85d0, + 0x58 => 0x85d5, 0x59 => 0x85dd, 0x5a => 0x85e5, 0x5b => 0x85dc, + 0x5c => 0x85f9, 0x5d => 0x860a, 0x5e => 0x8613, 0x5f => 0x860b, + 0x60 => 0x85fe, 0x61 => 0x85fa, 0x62 => 0x8606, 0x63 => 0x8622, + 0x64 => 0x861a, 0x65 => 0x8630, 0x66 => 0x863f, 0x67 => 0x864d, + 0x68 => 0x4e55, 0x69 => 0x8654, 0x6a => 0x865f, 0x6b => 0x8667, + 0x6c => 0x8671, 0x6d => 0x8693, 0x6e => 0x86a3, 0x6f => 0x86a9, + 0x70 => 0x86aa, 0x71 => 0x868b, 0x72 => 0x868c, 0x73 => 0x86b6, + 0x74 => 0x86af, 0x75 => 0x86c4, 0x76 => 0x86c6, 0x77 => 0x86b0, + 0x78 => 0x86c9, 0x79 => 0x8823, 0x7a => 0x86ab, 0x7b => 0x86d4, + 0x7c => 0x86de, 0x7d => 0x86e9, 0x7e => 0x86ec, 0x80 => 0x86df, + 0x81 => 0x86db, 0x82 => 0x86ef, 0x83 => 0x8712, 0x84 => 0x8706, + 0x85 => 0x8708, 0x86 => 0x8700, 0x87 => 0x8703, 0x88 => 0x86fb, + 0x89 => 0x8711, 0x8a => 0x8709, 0x8b => 0x870d, 0x8c => 0x86f9, + 0x8d => 0x870a, 0x8e => 0x8734, 0x8f => 0x873f, 0x90 => 0x8737, + 0x91 => 0x873b, 0x92 => 0x8725, 0x93 => 0x8729, 0x94 => 0x871a, + 0x95 => 0x8760, 0x96 => 0x875f, 0x97 => 0x8778, 0x98 => 0x874c, + 0x99 => 0x874e, 0x9a => 0x8774, 0x9b => 0x8757, 0x9c => 0x8768, + 0x9d => 0x876e, 0x9e => 0x8759, 0x9f => 0x8753, 0xa0 => 0x8763, + 0xa1 => 0x876a, 0xa2 => 0x8805, 0xa3 => 0x87a2, 0xa4 => 0x879f, + 0xa5 => 0x8782, 0xa6 => 0x87af, 0xa7 => 0x87cb, 0xa8 => 0x87bd, + 0xa9 => 0x87c0, 0xaa => 0x87d0, 0xab => 0x96d6, 0xac => 0x87ab, + 0xad => 0x87c4, 0xae => 0x87b3, 0xaf => 0x87c7, 0xb0 => 0x87c6, + 0xb1 => 0x87bb, 0xb2 => 0x87ef, 0xb3 => 0x87f2, 0xb4 => 0x87e0, + 0xb5 => 0x880f, 0xb6 => 0x880d, 0xb7 => 0x87fe, 0xb8 => 0x87f6, + 0xb9 => 0x87f7, 0xba => 0x880e, 0xbb => 0x87d2, 0xbc => 0x8811, + 0xbd => 0x8816, 0xbe => 0x8815, 0xbf => 0x8822, 0xc0 => 0x8821, + 0xc1 => 0x8831, 0xc2 => 0x8836, 0xc3 => 0x8839, 0xc4 => 0x8827, + 0xc5 => 0x883b, 0xc6 => 0x8844, 0xc7 => 0x8842, 0xc8 => 0x8852, + 0xc9 => 0x8859, 0xca => 0x885e, 0xcb => 0x8862, 0xcc => 0x886b, + 0xcd => 0x8881, 0xce => 0x887e, 0xcf => 0x889e, 0xd0 => 0x8875, + 0xd1 => 0x887d, 0xd2 => 0x88b5, 0xd3 => 0x8872, 0xd4 => 0x8882, + 0xd5 => 0x8897, 0xd6 => 0x8892, 0xd7 => 0x88ae, 0xd8 => 0x8899, + 0xd9 => 0x88a2, 0xda => 0x888d, 0xdb => 0x88a4, 0xdc => 0x88b0, + 0xdd => 0x88bf, 0xde => 0x88b1, 0xdf => 0x88c3, 0xe0 => 0x88c4, + 0xe1 => 0x88d4, 0xe2 => 0x88d8, 0xe3 => 0x88d9, 0xe4 => 0x88dd, + 0xe5 => 0x88f9, 0xe6 => 0x8902, 0xe7 => 0x88fc, 0xe8 => 0x88f4, + 0xe9 => 0x88e8, 0xea => 0x88f2, 0xeb => 0x8904, 0xec => 0x890c, + 0xed => 0x890a, 0xee => 0x8913, 0xef => 0x8943, 0xf0 => 0x891e, + 0xf1 => 0x8925, 0xf2 => 0x892a, 0xf3 => 0x892b, 0xf4 => 0x8941, + 0xf5 => 0x8944, 0xf6 => 0x893b, 0xf7 => 0x8936, 0xf8 => 0x8938, + 0xf9 => 0x894c, 0xfa => 0x891d, 0xfb => 0x8960, 0xfc => 0x895e, + }, + 0xe6 => { + 0x40 => 0x8966, 0x41 => 0x8964, 0x42 => 0x896d, 0x43 => 0x896a, + 0x44 => 0x896f, 0x45 => 0x8974, 0x46 => 0x8977, 0x47 => 0x897e, + 0x48 => 0x8983, 0x49 => 0x8988, 0x4a => 0x898a, 0x4b => 0x8993, + 0x4c => 0x8998, 0x4d => 0x89a1, 0x4e => 0x89a9, 0x4f => 0x89a6, + 0x50 => 0x89ac, 0x51 => 0x89af, 0x52 => 0x89b2, 0x53 => 0x89ba, + 0x54 => 0x89bd, 0x55 => 0x89bf, 0x56 => 0x89c0, 0x57 => 0x89da, + 0x58 => 0x89dc, 0x59 => 0x89dd, 0x5a => 0x89e7, 0x5b => 0x89f4, + 0x5c => 0x89f8, 0x5d => 0x8a03, 0x5e => 0x8a16, 0x5f => 0x8a10, + 0x60 => 0x8a0c, 0x61 => 0x8a1b, 0x62 => 0x8a1d, 0x63 => 0x8a25, + 0x64 => 0x8a36, 0x65 => 0x8a41, 0x66 => 0x8a5b, 0x67 => 0x8a52, + 0x68 => 0x8a46, 0x69 => 0x8a48, 0x6a => 0x8a7c, 0x6b => 0x8a6d, + 0x6c => 0x8a6c, 0x6d => 0x8a62, 0x6e => 0x8a85, 0x6f => 0x8a82, + 0x70 => 0x8a84, 0x71 => 0x8aa8, 0x72 => 0x8aa1, 0x73 => 0x8a91, + 0x74 => 0x8aa5, 0x75 => 0x8aa6, 0x76 => 0x8a9a, 0x77 => 0x8aa3, + 0x78 => 0x8ac4, 0x79 => 0x8acd, 0x7a => 0x8ac2, 0x7b => 0x8ada, + 0x7c => 0x8aeb, 0x7d => 0x8af3, 0x7e => 0x8ae7, 0x80 => 0x8ae4, + 0x81 => 0x8af1, 0x82 => 0x8b14, 0x83 => 0x8ae0, 0x84 => 0x8ae2, + 0x85 => 0x8af7, 0x86 => 0x8ade, 0x87 => 0x8adb, 0x88 => 0x8b0c, + 0x89 => 0x8b07, 0x8a => 0x8b1a, 0x8b => 0x8ae1, 0x8c => 0x8b16, + 0x8d => 0x8b10, 0x8e => 0x8b17, 0x8f => 0x8b20, 0x90 => 0x8b33, + 0x91 => 0x97ab, 0x92 => 0x8b26, 0x93 => 0x8b2b, 0x94 => 0x8b3e, + 0x95 => 0x8b28, 0x96 => 0x8b41, 0x97 => 0x8b4c, 0x98 => 0x8b4f, + 0x99 => 0x8b4e, 0x9a => 0x8b49, 0x9b => 0x8b56, 0x9c => 0x8b5b, + 0x9d => 0x8b5a, 0x9e => 0x8b6b, 0x9f => 0x8b5f, 0xa0 => 0x8b6c, + 0xa1 => 0x8b6f, 0xa2 => 0x8b74, 0xa3 => 0x8b7d, 0xa4 => 0x8b80, + 0xa5 => 0x8b8c, 0xa6 => 0x8b8e, 0xa7 => 0x8b92, 0xa8 => 0x8b93, + 0xa9 => 0x8b96, 0xaa => 0x8b99, 0xab => 0x8b9a, 0xac => 0x8c3a, + 0xad => 0x8c41, 0xae => 0x8c3f, 0xaf => 0x8c48, 0xb0 => 0x8c4c, + 0xb1 => 0x8c4e, 0xb2 => 0x8c50, 0xb3 => 0x8c55, 0xb4 => 0x8c62, + 0xb5 => 0x8c6c, 0xb6 => 0x8c78, 0xb7 => 0x8c7a, 0xb8 => 0x8c82, + 0xb9 => 0x8c89, 0xba => 0x8c85, 0xbb => 0x8c8a, 0xbc => 0x8c8d, + 0xbd => 0x8c8e, 0xbe => 0x8c94, 0xbf => 0x8c7c, 0xc0 => 0x8c98, + 0xc1 => 0x621d, 0xc2 => 0x8cad, 0xc3 => 0x8caa, 0xc4 => 0x8cbd, + 0xc5 => 0x8cb2, 0xc6 => 0x8cb3, 0xc7 => 0x8cae, 0xc8 => 0x8cb6, + 0xc9 => 0x8cc8, 0xca => 0x8cc1, 0xcb => 0x8ce4, 0xcc => 0x8ce3, + 0xcd => 0x8cda, 0xce => 0x8cfd, 0xcf => 0x8cfa, 0xd0 => 0x8cfb, + 0xd1 => 0x8d04, 0xd2 => 0x8d05, 0xd3 => 0x8d0a, 0xd4 => 0x8d07, + 0xd5 => 0x8d0f, 0xd6 => 0x8d0d, 0xd7 => 0x8d10, 0xd8 => 0x9f4e, + 0xd9 => 0x8d13, 0xda => 0x8ccd, 0xdb => 0x8d14, 0xdc => 0x8d16, + 0xdd => 0x8d67, 0xde => 0x8d6d, 0xdf => 0x8d71, 0xe0 => 0x8d73, + 0xe1 => 0x8d81, 0xe2 => 0x8d99, 0xe3 => 0x8dc2, 0xe4 => 0x8dbe, + 0xe5 => 0x8dba, 0xe6 => 0x8dcf, 0xe7 => 0x8dda, 0xe8 => 0x8dd6, + 0xe9 => 0x8dcc, 0xea => 0x8ddb, 0xeb => 0x8dcb, 0xec => 0x8dea, + 0xed => 0x8deb, 0xee => 0x8ddf, 0xef => 0x8de3, 0xf0 => 0x8dfc, + 0xf1 => 0x8e08, 0xf2 => 0x8e09, 0xf3 => 0x8dff, 0xf4 => 0x8e1d, + 0xf5 => 0x8e1e, 0xf6 => 0x8e10, 0xf7 => 0x8e1f, 0xf8 => 0x8e42, + 0xf9 => 0x8e35, 0xfa => 0x8e30, 0xfb => 0x8e34, 0xfc => 0x8e4a, + }, + 0xe7 => { + 0x40 => 0x8e47, 0x41 => 0x8e49, 0x42 => 0x8e4c, 0x43 => 0x8e50, + 0x44 => 0x8e48, 0x45 => 0x8e59, 0x46 => 0x8e64, 0x47 => 0x8e60, + 0x48 => 0x8e2a, 0x49 => 0x8e63, 0x4a => 0x8e55, 0x4b => 0x8e76, + 0x4c => 0x8e72, 0x4d => 0x8e7c, 0x4e => 0x8e81, 0x4f => 0x8e87, + 0x50 => 0x8e85, 0x51 => 0x8e84, 0x52 => 0x8e8b, 0x53 => 0x8e8a, + 0x54 => 0x8e93, 0x55 => 0x8e91, 0x56 => 0x8e94, 0x57 => 0x8e99, + 0x58 => 0x8eaa, 0x59 => 0x8ea1, 0x5a => 0x8eac, 0x5b => 0x8eb0, + 0x5c => 0x8ec6, 0x5d => 0x8eb1, 0x5e => 0x8ebe, 0x5f => 0x8ec5, + 0x60 => 0x8ec8, 0x61 => 0x8ecb, 0x62 => 0x8edb, 0x63 => 0x8ee3, + 0x64 => 0x8efc, 0x65 => 0x8efb, 0x66 => 0x8eeb, 0x67 => 0x8efe, + 0x68 => 0x8f0a, 0x69 => 0x8f05, 0x6a => 0x8f15, 0x6b => 0x8f12, + 0x6c => 0x8f19, 0x6d => 0x8f13, 0x6e => 0x8f1c, 0x6f => 0x8f1f, + 0x70 => 0x8f1b, 0x71 => 0x8f0c, 0x72 => 0x8f26, 0x73 => 0x8f33, + 0x74 => 0x8f3b, 0x75 => 0x8f39, 0x76 => 0x8f45, 0x77 => 0x8f42, + 0x78 => 0x8f3e, 0x79 => 0x8f4c, 0x7a => 0x8f49, 0x7b => 0x8f46, + 0x7c => 0x8f4e, 0x7d => 0x8f57, 0x7e => 0x8f5c, 0x80 => 0x8f62, + 0x81 => 0x8f63, 0x82 => 0x8f64, 0x83 => 0x8f9c, 0x84 => 0x8f9f, + 0x85 => 0x8fa3, 0x86 => 0x8fad, 0x87 => 0x8faf, 0x88 => 0x8fb7, + 0x89 => 0x8fda, 0x8a => 0x8fe5, 0x8b => 0x8fe2, 0x8c => 0x8fea, + 0x8d => 0x8fef, 0x8e => 0x9087, 0x8f => 0x8ff4, 0x90 => 0x9005, + 0x91 => 0x8ff9, 0x92 => 0x8ffa, 0x93 => 0x9011, 0x94 => 0x9015, + 0x95 => 0x9021, 0x96 => 0x900d, 0x97 => 0x901e, 0x98 => 0x9016, + 0x99 => 0x900b, 0x9a => 0x9027, 0x9b => 0x9036, 0x9c => 0x9035, + 0x9d => 0x9039, 0x9e => 0x8ff8, 0x9f => 0x904f, 0xa0 => 0x9050, + 0xa1 => 0x9051, 0xa2 => 0x9052, 0xa3 => 0x900e, 0xa4 => 0x9049, + 0xa5 => 0x903e, 0xa6 => 0x9056, 0xa7 => 0x9058, 0xa8 => 0x905e, + 0xa9 => 0x9068, 0xaa => 0x906f, 0xab => 0x9076, 0xac => 0x96a8, + 0xad => 0x9072, 0xae => 0x9082, 0xaf => 0x907d, 0xb0 => 0x9081, + 0xb1 => 0x9080, 0xb2 => 0x908a, 0xb3 => 0x9089, 0xb4 => 0x908f, + 0xb5 => 0x90a8, 0xb6 => 0x90af, 0xb7 => 0x90b1, 0xb8 => 0x90b5, + 0xb9 => 0x90e2, 0xba => 0x90e4, 0xbb => 0x6248, 0xbc => 0x90db, + 0xbd => 0x9102, 0xbe => 0x9112, 0xbf => 0x9119, 0xc0 => 0x9132, + 0xc1 => 0x9130, 0xc2 => 0x914a, 0xc3 => 0x9156, 0xc4 => 0x9158, + 0xc5 => 0x9163, 0xc6 => 0x9165, 0xc7 => 0x9169, 0xc8 => 0x9173, + 0xc9 => 0x9172, 0xca => 0x918b, 0xcb => 0x9189, 0xcc => 0x9182, + 0xcd => 0x91a2, 0xce => 0x91ab, 0xcf => 0x91af, 0xd0 => 0x91aa, + 0xd1 => 0x91b5, 0xd2 => 0x91b4, 0xd3 => 0x91ba, 0xd4 => 0x91c0, + 0xd5 => 0x91c1, 0xd6 => 0x91c9, 0xd7 => 0x91cb, 0xd8 => 0x91d0, + 0xd9 => 0x91d6, 0xda => 0x91df, 0xdb => 0x91e1, 0xdc => 0x91db, + 0xdd => 0x91fc, 0xde => 0x91f5, 0xdf => 0x91f6, 0xe0 => 0x921e, + 0xe1 => 0x91ff, 0xe2 => 0x9214, 0xe3 => 0x922c, 0xe4 => 0x9215, + 0xe5 => 0x9211, 0xe6 => 0x925e, 0xe7 => 0x9257, 0xe8 => 0x9245, + 0xe9 => 0x9249, 0xea => 0x9264, 0xeb => 0x9248, 0xec => 0x9295, + 0xed => 0x923f, 0xee => 0x924b, 0xef => 0x9250, 0xf0 => 0x929c, + 0xf1 => 0x9296, 0xf2 => 0x9293, 0xf3 => 0x929b, 0xf4 => 0x925a, + 0xf5 => 0x92cf, 0xf6 => 0x92b9, 0xf7 => 0x92b7, 0xf8 => 0x92e9, + 0xf9 => 0x930f, 0xfa => 0x92fa, 0xfb => 0x9344, 0xfc => 0x932e, + }, + 0xe8 => { + 0x40 => 0x9319, 0x41 => 0x9322, 0x42 => 0x931a, 0x43 => 0x9323, + 0x44 => 0x933a, 0x45 => 0x9335, 0x46 => 0x933b, 0x47 => 0x935c, + 0x48 => 0x9360, 0x49 => 0x937c, 0x4a => 0x936e, 0x4b => 0x9356, + 0x4c => 0x93b0, 0x4d => 0x93ac, 0x4e => 0x93ad, 0x4f => 0x9394, + 0x50 => 0x93b9, 0x51 => 0x93d6, 0x52 => 0x93d7, 0x53 => 0x93e8, + 0x54 => 0x93e5, 0x55 => 0x93d8, 0x56 => 0x93c3, 0x57 => 0x93dd, + 0x58 => 0x93d0, 0x59 => 0x93c8, 0x5a => 0x93e4, 0x5b => 0x941a, + 0x5c => 0x9414, 0x5d => 0x9413, 0x5e => 0x9403, 0x5f => 0x9407, + 0x60 => 0x9410, 0x61 => 0x9436, 0x62 => 0x942b, 0x63 => 0x9435, + 0x64 => 0x9421, 0x65 => 0x943a, 0x66 => 0x9441, 0x67 => 0x9452, + 0x68 => 0x9444, 0x69 => 0x945b, 0x6a => 0x9460, 0x6b => 0x9462, + 0x6c => 0x945e, 0x6d => 0x946a, 0x6e => 0x9229, 0x6f => 0x9470, + 0x70 => 0x9475, 0x71 => 0x9477, 0x72 => 0x947d, 0x73 => 0x945a, + 0x74 => 0x947c, 0x75 => 0x947e, 0x76 => 0x9481, 0x77 => 0x947f, + 0x78 => 0x9582, 0x79 => 0x9587, 0x7a => 0x958a, 0x7b => 0x9594, + 0x7c => 0x9596, 0x7d => 0x9598, 0x7e => 0x9599, 0x80 => 0x95a0, + 0x81 => 0x95a8, 0x82 => 0x95a7, 0x83 => 0x95ad, 0x84 => 0x95bc, + 0x85 => 0x95bb, 0x86 => 0x95b9, 0x87 => 0x95be, 0x88 => 0x95ca, + 0x89 => 0x6ff6, 0x8a => 0x95c3, 0x8b => 0x95cd, 0x8c => 0x95cc, + 0x8d => 0x95d5, 0x8e => 0x95d4, 0x8f => 0x95d6, 0x90 => 0x95dc, + 0x91 => 0x95e1, 0x92 => 0x95e5, 0x93 => 0x95e2, 0x94 => 0x9621, + 0x95 => 0x9628, 0x96 => 0x962e, 0x97 => 0x962f, 0x98 => 0x9642, + 0x99 => 0x964c, 0x9a => 0x964f, 0x9b => 0x964b, 0x9c => 0x9677, + 0x9d => 0x965c, 0x9e => 0x965e, 0x9f => 0x965d, 0xa0 => 0x965f, + 0xa1 => 0x9666, 0xa2 => 0x9672, 0xa3 => 0x966c, 0xa4 => 0x968d, + 0xa5 => 0x9698, 0xa6 => 0x9695, 0xa7 => 0x9697, 0xa8 => 0x96aa, + 0xa9 => 0x96a7, 0xaa => 0x96b1, 0xab => 0x96b2, 0xac => 0x96b0, + 0xad => 0x96b4, 0xae => 0x96b6, 0xaf => 0x96b8, 0xb0 => 0x96b9, + 0xb1 => 0x96ce, 0xb2 => 0x96cb, 0xb3 => 0x96c9, 0xb4 => 0x96cd, + 0xb5 => 0x894d, 0xb6 => 0x96dc, 0xb7 => 0x970d, 0xb8 => 0x96d5, + 0xb9 => 0x96f9, 0xba => 0x9704, 0xbb => 0x9706, 0xbc => 0x9708, + 0xbd => 0x9713, 0xbe => 0x970e, 0xbf => 0x9711, 0xc0 => 0x970f, + 0xc1 => 0x9716, 0xc2 => 0x9719, 0xc3 => 0x9724, 0xc4 => 0x972a, + 0xc5 => 0x9730, 0xc6 => 0x9739, 0xc7 => 0x973d, 0xc8 => 0x973e, + 0xc9 => 0x9744, 0xca => 0x9746, 0xcb => 0x9748, 0xcc => 0x9742, + 0xcd => 0x9749, 0xce => 0x975c, 0xcf => 0x9760, 0xd0 => 0x9764, + 0xd1 => 0x9766, 0xd2 => 0x9768, 0xd3 => 0x52d2, 0xd4 => 0x976b, + 0xd5 => 0x9771, 0xd6 => 0x9779, 0xd7 => 0x9785, 0xd8 => 0x977c, + 0xd9 => 0x9781, 0xda => 0x977a, 0xdb => 0x9786, 0xdc => 0x978b, + 0xdd => 0x978f, 0xde => 0x9790, 0xdf => 0x979c, 0xe0 => 0x97a8, + 0xe1 => 0x97a6, 0xe2 => 0x97a3, 0xe3 => 0x97b3, 0xe4 => 0x97b4, + 0xe5 => 0x97c3, 0xe6 => 0x97c6, 0xe7 => 0x97c8, 0xe8 => 0x97cb, + 0xe9 => 0x97dc, 0xea => 0x97ed, 0xeb => 0x9f4f, 0xec => 0x97f2, + 0xed => 0x7adf, 0xee => 0x97f6, 0xef => 0x97f5, 0xf0 => 0x980f, + 0xf1 => 0x980c, 0xf2 => 0x9838, 0xf3 => 0x9824, 0xf4 => 0x9821, + 0xf5 => 0x9837, 0xf6 => 0x983d, 0xf7 => 0x9846, 0xf8 => 0x984f, + 0xf9 => 0x984b, 0xfa => 0x986b, 0xfb => 0x986f, 0xfc => 0x9870, + }, + 0xe9 => { + 0x40 => 0x9871, 0x41 => 0x9874, 0x42 => 0x9873, 0x43 => 0x98aa, + 0x44 => 0x98af, 0x45 => 0x98b1, 0x46 => 0x98b6, 0x47 => 0x98c4, + 0x48 => 0x98c3, 0x49 => 0x98c6, 0x4a => 0x98e9, 0x4b => 0x98eb, + 0x4c => 0x9903, 0x4d => 0x9909, 0x4e => 0x9912, 0x4f => 0x9914, + 0x50 => 0x9918, 0x51 => 0x9921, 0x52 => 0x991d, 0x53 => 0x991e, + 0x54 => 0x9924, 0x55 => 0x9920, 0x56 => 0x992c, 0x57 => 0x992e, + 0x58 => 0x993d, 0x59 => 0x993e, 0x5a => 0x9942, 0x5b => 0x9949, + 0x5c => 0x9945, 0x5d => 0x9950, 0x5e => 0x994b, 0x5f => 0x9951, + 0x60 => 0x9952, 0x61 => 0x994c, 0x62 => 0x9955, 0x63 => 0x9997, + 0x64 => 0x9998, 0x65 => 0x99a5, 0x66 => 0x99ad, 0x67 => 0x99ae, + 0x68 => 0x99bc, 0x69 => 0x99df, 0x6a => 0x99db, 0x6b => 0x99dd, + 0x6c => 0x99d8, 0x6d => 0x99d1, 0x6e => 0x99ed, 0x6f => 0x99ee, + 0x70 => 0x99f1, 0x71 => 0x99f2, 0x72 => 0x99fb, 0x73 => 0x99f8, + 0x74 => 0x9a01, 0x75 => 0x9a0f, 0x76 => 0x9a05, 0x77 => 0x99e2, + 0x78 => 0x9a19, 0x79 => 0x9a2b, 0x7a => 0x9a37, 0x7b => 0x9a45, + 0x7c => 0x9a42, 0x7d => 0x9a40, 0x7e => 0x9a43, 0x80 => 0x9a3e, + 0x81 => 0x9a55, 0x82 => 0x9a4d, 0x83 => 0x9a5b, 0x84 => 0x9a57, + 0x85 => 0x9a5f, 0x86 => 0x9a62, 0x87 => 0x9a65, 0x88 => 0x9a64, + 0x89 => 0x9a69, 0x8a => 0x9a6b, 0x8b => 0x9a6a, 0x8c => 0x9aad, + 0x8d => 0x9ab0, 0x8e => 0x9abc, 0x8f => 0x9ac0, 0x90 => 0x9acf, + 0x91 => 0x9ad1, 0x92 => 0x9ad3, 0x93 => 0x9ad4, 0x94 => 0x9ade, + 0x95 => 0x9adf, 0x96 => 0x9ae2, 0x97 => 0x9ae3, 0x98 => 0x9ae6, + 0x99 => 0x9aef, 0x9a => 0x9aeb, 0x9b => 0x9aee, 0x9c => 0x9af4, + 0x9d => 0x9af1, 0x9e => 0x9af7, 0x9f => 0x9afb, 0xa0 => 0x9b06, + 0xa1 => 0x9b18, 0xa2 => 0x9b1a, 0xa3 => 0x9b1f, 0xa4 => 0x9b22, + 0xa5 => 0x9b23, 0xa6 => 0x9b25, 0xa7 => 0x9b27, 0xa8 => 0x9b28, + 0xa9 => 0x9b29, 0xaa => 0x9b2a, 0xab => 0x9b2e, 0xac => 0x9b2f, + 0xad => 0x9b32, 0xae => 0x9b44, 0xaf => 0x9b43, 0xb0 => 0x9b4f, + 0xb1 => 0x9b4d, 0xb2 => 0x9b4e, 0xb3 => 0x9b51, 0xb4 => 0x9b58, + 0xb5 => 0x9b74, 0xb6 => 0x9b93, 0xb7 => 0x9b83, 0xb8 => 0x9b91, + 0xb9 => 0x9b96, 0xba => 0x9b97, 0xbb => 0x9b9f, 0xbc => 0x9ba0, + 0xbd => 0x9ba8, 0xbe => 0x9bb4, 0xbf => 0x9bc0, 0xc0 => 0x9bca, + 0xc1 => 0x9bb9, 0xc2 => 0x9bc6, 0xc3 => 0x9bcf, 0xc4 => 0x9bd1, + 0xc5 => 0x9bd2, 0xc6 => 0x9be3, 0xc7 => 0x9be2, 0xc8 => 0x9be4, + 0xc9 => 0x9bd4, 0xca => 0x9be1, 0xcb => 0x9c3a, 0xcc => 0x9bf2, + 0xcd => 0x9bf1, 0xce => 0x9bf0, 0xcf => 0x9c15, 0xd0 => 0x9c14, + 0xd1 => 0x9c09, 0xd2 => 0x9c13, 0xd3 => 0x9c0c, 0xd4 => 0x9c06, + 0xd5 => 0x9c08, 0xd6 => 0x9c12, 0xd7 => 0x9c0a, 0xd8 => 0x9c04, + 0xd9 => 0x9c2e, 0xda => 0x9c1b, 0xdb => 0x9c25, 0xdc => 0x9c24, + 0xdd => 0x9c21, 0xde => 0x9c30, 0xdf => 0x9c47, 0xe0 => 0x9c32, + 0xe1 => 0x9c46, 0xe2 => 0x9c3e, 0xe3 => 0x9c5a, 0xe4 => 0x9c60, + 0xe5 => 0x9c67, 0xe6 => 0x9c76, 0xe7 => 0x9c78, 0xe8 => 0x9ce7, + 0xe9 => 0x9cec, 0xea => 0x9cf0, 0xeb => 0x9d09, 0xec => 0x9d08, + 0xed => 0x9ceb, 0xee => 0x9d03, 0xef => 0x9d06, 0xf0 => 0x9d2a, + 0xf1 => 0x9d26, 0xf2 => 0x9daf, 0xf3 => 0x9d23, 0xf4 => 0x9d1f, + 0xf5 => 0x9d44, 0xf6 => 0x9d15, 0xf7 => 0x9d12, 0xf8 => 0x9d41, + 0xf9 => 0x9d3f, 0xfa => 0x9d3e, 0xfb => 0x9d46, 0xfc => 0x9d48, + }, + 0xea => { + 0x40 => 0x9d5d, 0x41 => 0x9d5e, 0x42 => 0x9d64, 0x43 => 0x9d51, + 0x44 => 0x9d50, 0x45 => 0x9d59, 0x46 => 0x9d72, 0x47 => 0x9d89, + 0x48 => 0x9d87, 0x49 => 0x9dab, 0x4a => 0x9d6f, 0x4b => 0x9d7a, + 0x4c => 0x9d9a, 0x4d => 0x9da4, 0x4e => 0x9da9, 0x4f => 0x9db2, + 0x50 => 0x9dc4, 0x51 => 0x9dc1, 0x52 => 0x9dbb, 0x53 => 0x9db8, + 0x54 => 0x9dba, 0x55 => 0x9dc6, 0x56 => 0x9dcf, 0x57 => 0x9dc2, + 0x58 => 0x9dd9, 0x59 => 0x9dd3, 0x5a => 0x9df8, 0x5b => 0x9de6, + 0x5c => 0x9ded, 0x5d => 0x9def, 0x5e => 0x9dfd, 0x5f => 0x9e1a, + 0x60 => 0x9e1b, 0x61 => 0x9e1e, 0x62 => 0x9e75, 0x63 => 0x9e79, + 0x64 => 0x9e7d, 0x65 => 0x9e81, 0x66 => 0x9e88, 0x67 => 0x9e8b, + 0x68 => 0x9e8c, 0x69 => 0x9e92, 0x6a => 0x9e95, 0x6b => 0x9e91, + 0x6c => 0x9e9d, 0x6d => 0x9ea5, 0x6e => 0x9ea9, 0x6f => 0x9eb8, + 0x70 => 0x9eaa, 0x71 => 0x9ead, 0x72 => 0x9761, 0x73 => 0x9ecc, + 0x74 => 0x9ece, 0x75 => 0x9ecf, 0x76 => 0x9ed0, 0x77 => 0x9ed4, + 0x78 => 0x9edc, 0x79 => 0x9ede, 0x7a => 0x9edd, 0x7b => 0x9ee0, + 0x7c => 0x9ee5, 0x7d => 0x9ee8, 0x7e => 0x9eef, 0x80 => 0x9ef4, + 0x81 => 0x9ef6, 0x82 => 0x9ef7, 0x83 => 0x9ef9, 0x84 => 0x9efb, + 0x85 => 0x9efc, 0x86 => 0x9efd, 0x87 => 0x9f07, 0x88 => 0x9f08, + 0x89 => 0x76b7, 0x8a => 0x9f15, 0x8b => 0x9f21, 0x8c => 0x9f2c, + 0x8d => 0x9f3e, 0x8e => 0x9f4a, 0x8f => 0x9f52, 0x90 => 0x9f54, + 0x91 => 0x9f63, 0x92 => 0x9f5f, 0x93 => 0x9f60, 0x94 => 0x9f61, + 0x95 => 0x9f66, 0x96 => 0x9f67, 0x97 => 0x9f6c, 0x98 => 0x9f6a, + 0x99 => 0x9f77, 0x9a => 0x9f72, 0x9b => 0x9f76, 0x9c => 0x9f95, + 0x9d => 0x9f9c, 0x9e => 0x9fa0, 0x9f => 0x582f, 0xa0 => 0x69c7, + 0xa1 => 0x9059, 0xa2 => 0x7464, 0xa3 => 0x51dc, 0xa4 => 0x7199, + }, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/Symbol.pm b/lib/Image/ExifTool/Charset/Symbol.pm new file mode 100644 index 0000000..cb240ef --- /dev/null +++ b/lib/Image/ExifTool/Charset/Symbol.pm @@ -0,0 +1,54 @@ +#------------------------------------------------------------------------------ +# File: Symbol.pm +# +# Description: Symbol to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://blogs.msdn.com/michkap/archive/2005/11/08/490495.aspx +# +# Notes: The table omits 1-byte characters with the same values as Unicode. +# This set re-maps characters with codepoints less than 0x80 +# (Although all bytes >= 0x20 should be mapped according to the +# reference, I didn't map chars below 0x80 because I have some +# samples where these are regular ASCII characters, even though +# I think the encoding is probably incorrect for these samples) +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::Symbol = ( + 0x80 => 0xf080, 0x81 => 0xf081, 0x82 => 0xf082, 0x83 => 0xf083, + 0x84 => 0xf084, 0x85 => 0xf085, 0x86 => 0xf086, 0x87 => 0xf087, + 0x88 => 0xf088, 0x89 => 0xf089, 0x8a => 0xf08a, 0x8b => 0xf08b, + 0x8c => 0xf08c, 0x8d => 0xf08d, 0x8e => 0xf08e, 0x8f => 0xf08f, + 0x90 => 0xf090, 0x91 => 0xf091, 0x92 => 0xf092, 0x93 => 0xf093, + 0x94 => 0xf094, 0x95 => 0xf095, 0x96 => 0xf096, 0x97 => 0xf097, + 0x98 => 0xf098, 0x99 => 0xf099, 0x9a => 0xf09a, 0x9b => 0xf09b, + 0x9c => 0xf09c, 0x9d => 0xf09d, 0x9e => 0xf09e, 0x9f => 0xf09f, + 0xa0 => 0xf0a0, 0xa1 => 0xf0a1, 0xa2 => 0xf0a2, 0xa3 => 0xf0a3, + 0xa4 => 0xf0a4, 0xa5 => 0xf0a5, 0xa6 => 0xf0a6, 0xa7 => 0xf0a7, + 0xa8 => 0xf0a8, 0xa9 => 0xf0a9, 0xaa => 0xf0aa, 0xab => 0xf0ab, + 0xac => 0xf0ac, 0xad => 0xf0ad, 0xae => 0xf0ae, 0xaf => 0xf0af, + 0xb0 => 0xf0b0, 0xb1 => 0xf0b1, 0xb2 => 0xf0b2, 0xb3 => 0xf0b3, + 0xb4 => 0xf0b4, 0xb5 => 0xf0b5, 0xb6 => 0xf0b6, 0xb7 => 0xf0b7, + 0xb8 => 0xf0b8, 0xb9 => 0xf0b9, 0xba => 0xf0ba, 0xbb => 0xf0bb, + 0xbc => 0xf0bc, 0xbd => 0xf0bd, 0xbe => 0xf0be, 0xbf => 0xf0bf, + 0xc0 => 0xf0c0, 0xc1 => 0xf0c1, 0xc2 => 0xf0c2, 0xc3 => 0xf0c3, + 0xc4 => 0xf0c4, 0xc5 => 0xf0c5, 0xc6 => 0xf0c6, 0xc7 => 0xf0c7, + 0xc8 => 0xf0c8, 0xc9 => 0xf0c9, 0xca => 0xf0ca, 0xcb => 0xf0cb, + 0xcc => 0xf0cc, 0xcd => 0xf0cd, 0xce => 0xf0ce, 0xcf => 0xf0cf, + 0xd0 => 0xf0d0, 0xd1 => 0xf0d1, 0xd2 => 0xf0d2, 0xd3 => 0xf0d3, + 0xd4 => 0xf0d4, 0xd5 => 0xf0d5, 0xd6 => 0xf0d6, 0xd7 => 0xf0d7, + 0xd8 => 0xf0d8, 0xd9 => 0xf0d9, 0xda => 0xf0da, 0xdb => 0xf0db, + 0xdc => 0xf0dc, 0xdd => 0xf0dd, 0xde => 0xf0de, 0xdf => 0xf0df, + 0xe0 => 0xf0e0, 0xe1 => 0xf0e1, 0xe2 => 0xf0e2, 0xe3 => 0xf0e3, + 0xe4 => 0xf0e4, 0xe5 => 0xf0e5, 0xe6 => 0xf0e6, 0xe7 => 0xf0e7, + 0xe8 => 0xf0e8, 0xe9 => 0xf0e9, 0xea => 0xf0ea, 0xeb => 0xf0eb, + 0xec => 0xf0ec, 0xed => 0xf0ed, 0xee => 0xf0ee, 0xef => 0xf0ef, + 0xf0 => 0xf0f0, 0xf1 => 0xf0f1, 0xf2 => 0xf0f2, 0xf3 => 0xf0f3, + 0xf4 => 0xf0f4, 0xf5 => 0xf0f5, 0xf6 => 0xf0f6, 0xf7 => 0xf0f7, + 0xf8 => 0xf0f8, 0xf9 => 0xf0f9, 0xfa => 0xf0fa, 0xfb => 0xf0fb, + 0xfc => 0xf0fc, 0xfd => 0xf0fd, 0xfe => 0xf0fe, 0xff => 0xf0ff, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/Thai.pm b/lib/Image/ExifTool/Charset/Thai.pm new file mode 100644 index 0000000..068018e --- /dev/null +++ b/lib/Image/ExifTool/Charset/Thai.pm @@ -0,0 +1,41 @@ +#------------------------------------------------------------------------------ +# File: Thai.pm +# +# Description: cp874 to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP874.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::Thai = ( + 0x80 => 0x20ac, 0x85 => 0x2026, 0x91 => 0x2018, 0x92 => 0x2019, + 0x93 => 0x201c, 0x94 => 0x201d, 0x95 => 0x2022, 0x96 => 0x2013, + 0x97 => 0x2014, 0xa1 => 0x0e01, 0xa2 => 0x0e02, 0xa3 => 0x0e03, + 0xa4 => 0x0e04, 0xa5 => 0x0e05, 0xa6 => 0x0e06, 0xa7 => 0x0e07, + 0xa8 => 0x0e08, 0xa9 => 0x0e09, 0xaa => 0x0e0a, 0xab => 0x0e0b, + 0xac => 0x0e0c, 0xad => 0x0e0d, 0xae => 0x0e0e, 0xaf => 0x0e0f, + 0xb0 => 0x0e10, 0xb1 => 0x0e11, 0xb2 => 0x0e12, 0xb3 => 0x0e13, + 0xb4 => 0x0e14, 0xb5 => 0x0e15, 0xb6 => 0x0e16, 0xb7 => 0x0e17, + 0xb8 => 0x0e18, 0xb9 => 0x0e19, 0xba => 0x0e1a, 0xbb => 0x0e1b, + 0xbc => 0x0e1c, 0xbd => 0x0e1d, 0xbe => 0x0e1e, 0xbf => 0x0e1f, + 0xc0 => 0x0e20, 0xc1 => 0x0e21, 0xc2 => 0x0e22, 0xc3 => 0x0e23, + 0xc4 => 0x0e24, 0xc5 => 0x0e25, 0xc6 => 0x0e26, 0xc7 => 0x0e27, + 0xc8 => 0x0e28, 0xc9 => 0x0e29, 0xca => 0x0e2a, 0xcb => 0x0e2b, + 0xcc => 0x0e2c, 0xcd => 0x0e2d, 0xce => 0x0e2e, 0xcf => 0x0e2f, + 0xd0 => 0x0e30, 0xd1 => 0x0e31, 0xd2 => 0x0e32, 0xd3 => 0x0e33, + 0xd4 => 0x0e34, 0xd5 => 0x0e35, 0xd6 => 0x0e36, 0xd7 => 0x0e37, + 0xd8 => 0x0e38, 0xd9 => 0x0e39, 0xda => 0x0e3a, 0xdf => 0x0e3f, + 0xe0 => 0x0e40, 0xe1 => 0x0e41, 0xe2 => 0x0e42, 0xe3 => 0x0e43, + 0xe4 => 0x0e44, 0xe5 => 0x0e45, 0xe6 => 0x0e46, 0xe7 => 0x0e47, + 0xe8 => 0x0e48, 0xe9 => 0x0e49, 0xea => 0x0e4a, 0xeb => 0x0e4b, + 0xec => 0x0e4c, 0xed => 0x0e4d, 0xee => 0x0e4e, 0xef => 0x0e4f, + 0xf0 => 0x0e50, 0xf1 => 0x0e51, 0xf2 => 0x0e52, 0xf3 => 0x0e53, + 0xf4 => 0x0e54, 0xf5 => 0x0e55, 0xf6 => 0x0e56, 0xf7 => 0x0e57, + 0xf8 => 0x0e58, 0xf9 => 0x0e59, 0xfa => 0x0e5a, 0xfb => 0x0e5b, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/Turkish.pm b/lib/Image/ExifTool/Charset/Turkish.pm new file mode 100644 index 0000000..7f0a784 --- /dev/null +++ b/lib/Image/ExifTool/Charset/Turkish.pm @@ -0,0 +1,25 @@ +#------------------------------------------------------------------------------ +# File: Turkish.pm +# +# Description: cp1254 to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1254.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::Turkish = ( + 0x80 => 0x20ac, 0x82 => 0x201a, 0x83 => 0x0192, 0x84 => 0x201e, + 0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021, 0x88 => 0x02c6, + 0x89 => 0x2030, 0x8a => 0x0160, 0x8b => 0x2039, 0x8c => 0x0152, + 0x91 => 0x2018, 0x92 => 0x2019, 0x93 => 0x201c, 0x94 => 0x201d, + 0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014, 0x98 => 0x02dc, + 0x99 => 0x2122, 0x9a => 0x0161, 0x9b => 0x203a, 0x9c => 0x0153, + 0x9f => 0x0178, 0xd0 => 0x011e, 0xdd => 0x0130, 0xde => 0x015e, + 0xf0 => 0x011f, 0xfd => 0x0131, 0xfe => 0x015f, +); + +1; # end diff --git a/lib/Image/ExifTool/Charset/Vietnam.pm b/lib/Image/ExifTool/Charset/Vietnam.pm new file mode 100644 index 0000000..6275ea5 --- /dev/null +++ b/lib/Image/ExifTool/Charset/Vietnam.pm @@ -0,0 +1,27 @@ +#------------------------------------------------------------------------------ +# File: Vietnam.pm +# +# Description: cp1258 to Unicode +# +# Revisions: 2010/01/20 - P. Harvey created +# +# References: 1) http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1258.TXT +# +# Notes: The table omits 1-byte characters with the same values as Unicode +#------------------------------------------------------------------------------ +use strict; + +%Image::ExifTool::Charset::Vietnam = ( + 0x80 => 0x20ac, 0x82 => 0x201a, 0x83 => 0x0192, 0x84 => 0x201e, + 0x85 => 0x2026, 0x86 => 0x2020, 0x87 => 0x2021, 0x88 => 0x02c6, + 0x89 => 0x2030, 0x8b => 0x2039, 0x8c => 0x0152, 0x91 => 0x2018, + 0x92 => 0x2019, 0x93 => 0x201c, 0x94 => 0x201d, 0x95 => 0x2022, + 0x96 => 0x2013, 0x97 => 0x2014, 0x98 => 0x02dc, 0x99 => 0x2122, + 0x9b => 0x203a, 0x9c => 0x0153, 0x9f => 0x0178, 0xc3 => 0x0102, + 0xcc => 0x0300, 0xd0 => 0x0110, 0xd2 => 0x0309, 0xd5 => 0x01a0, + 0xdd => 0x01af, 0xde => 0x0303, 0xe3 => 0x0103, 0xec => 0x0301, + 0xf0 => 0x0111, 0xf2 => 0x0323, 0xf5 => 0x01a1, 0xfd => 0x01b0, + 0xfe => 0x20ab, +); + +1; # end diff --git a/lib/Image/ExifTool/DICOM.pm b/lib/Image/ExifTool/DICOM.pm new file mode 100644 index 0000000..e698432 --- /dev/null +++ b/lib/Image/ExifTool/DICOM.pm @@ -0,0 +1,3881 @@ +#------------------------------------------------------------------------------ +# File: DICOM.pm +# +# Description: Read DICOM and ACR-NEMA medical images +# +# Revisions: 2005/11/09 - P. Harvey Created +# 2009/11/19 - P. Harvey Added private GE tags from ref 4 +# 2009/12/11 - P. Harvey Updated to DICOM 2008 spec +# 2010/04/08 - P. Harvey Updated to DICOM 2009 spec +# +# References: 1) http://medical.nema.org/ +# 2) http://www.sph.sc.edu/comd/rorden/dicom.html +# 3) http://www.dclunie.com/ +# 4) http://www.gehealthcare.com/usen/interoperability/dicom/docs/2258357r3.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::DICOM; + +use strict; +use vars qw($VERSION %uid); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.22'; + +# DICOM VR (Value Representation) format conversions +my %dicomFormat = ( + FD => 'double', + FL => 'float', + OB => 'int8u', + OF => 'float', + OW => 'int16u', + SL => 'int32s', + SS => 'int16s', + UL => 'int32u', + US => 'int16u', +); + +# VR elements with 32-bit length in explicit VR syntax +my %vr32 = ( OB=>1, OW=>1, OF=>1, SQ=>1, UT=>1, UN=>1 ); + +# data elements with implicit VR regardless of syntax +my %implicitVR = ( + 'FFFE,E000' => 1, + 'FFFE,E00D' => 1, + 'FFFE,E0DD' => 1, +); + +# DICOM tags +# Note: "XxxGroupLength" tags are generated automatically if they don't exist +%Image::ExifTool::DICOM::Main = ( + GROUPS => { 2 => 'Image' }, + VARS => { NO_LOOKUP => 1 }, # omit tags from lookup (way too many!) + NOTES => q{ + The DICOM format is based on the ACR-NEMA specification, but adds a file + header and a number of new tags. ExifTool will extract information from + either type of file. The Tag ID's in the following table are the tag group + and element numbers in hexadecimal, as given in the DICOM specification (see + L<http://medical.nema.org/>). The table below contains tags from the DICOM + 2009 and earlier specifications plus some vendor-specific private tags. + + Note that DICOM information may be saved in other file formats using the + L<XMP DICOM Tags|Image::ExifTool::TagNames/XMP DICOM Tags>. + }, + # file meta information group (names end with VR) + '0002,0000' => { VR => 'UL', Name => 'FileMetaInfoGroupLength' }, + '0002,0001' => { VR => 'OB', Name => 'FileMetaInfoVersion' }, + '0002,0002' => { VR => 'UI', Name => 'MediaStorageSOPClassUID' }, + '0002,0003' => { VR => 'UI', Name => 'MediaStorageSOPInstanceUID' }, + '0002,0010' => { VR => 'UI', Name => 'TransferSyntaxUID' }, + '0002,0012' => { VR => 'UI', Name => 'ImplementationClassUID' }, + '0002,0013' => { VR => 'SH', Name => 'ImplementationVersionName' }, + '0002,0016' => { VR => 'AE', Name => 'SourceApplicationEntityTitle' }, + '0002,0100' => { VR => 'UI', Name => 'PrivateInformationCreatorUID' }, + '0002,0102' => { VR => 'OB', Name => 'PrivateInformation' }, + # directory structuring group + '0004,1130' => { VR => 'CS', Name => 'FileSetID' }, + '0004,1141' => { VR => 'CS', Name => 'FileSetDescriptorFileID' }, + '0004,1142' => { VR => 'CS', Name => 'SpecificCharacterSetOfFile' }, + '0004,1200' => { VR => 'UL', Name => 'FirstDirectoryRecordOffset' }, + '0004,1202' => { VR => 'UL', Name => 'LastDirectoryRecordOffset' }, + '0004,1212' => { VR => 'US', Name => 'FileSetConsistencyFlag' }, + '0004,1220' => { VR => 'SQ', Name => 'DirectoryRecordSequence' }, + '0004,1400' => { VR => 'UL', Name => 'OffsetOfNextDirectoryRecord' }, + '0004,1410' => { VR => 'US', Name => 'RecordInUseFlag' }, + '0004,1420' => { VR => 'UL', Name => 'LowerLevelDirectoryEntityOffset' }, + '0004,1430' => { VR => 'CS', Name => 'DirectoryRecordType' }, + '0004,1432' => { VR => 'UI', Name => 'PrivateRecordUID' }, + '0004,1500' => { VR => 'CS', Name => 'ReferencedFileID' }, + '0004,1504' => { VR => 'UL', Name => 'MRDRDirectoryRecordOffset' }, + '0004,1510' => { VR => 'UI', Name => 'ReferencedSOPClassUIDInFile' }, + '0004,1511' => { VR => 'UI', Name => 'ReferencedSOPInstanceUIDInFile' }, + '0004,1512' => { VR => 'UI', Name => 'ReferencedTransferSyntaxUIDInFile' }, + '0004,151A' => { VR => 'UI', Name => 'ReferencedRelatedSOPClassUIDInFile' }, + '0004,1600' => { VR => 'UL', Name => 'NumberOfReferences' }, + # identifying group + '0008,0000' => { VR => 'UL', Name => 'IdentifyingGroupLength' }, + '0008,0001' => { VR => 'UL', Name => 'LengthToEnd' }, + '0008,0005' => { VR => 'CS', Name => 'SpecificCharacterSet' }, + '0008,0006' => { VR => 'SQ', Name => 'LanguageCodeSequence' }, + '0008,0008' => { VR => 'CS', Name => 'ImageType' }, + '0008,0010' => { VR => 'CS', Name => 'RecognitionCode' }, + '0008,0012' => { VR => 'DA', Name => 'InstanceCreationDate' }, + '0008,0013' => { VR => 'TM', Name => 'InstanceCreationTime' }, + '0008,0014' => { VR => 'UI', Name => 'InstanceCreatorUID' }, + '0008,0016' => { VR => 'UI', Name => 'SOPClassUID' }, + '0008,0018' => { VR => 'UI', Name => 'SOPInstanceUID' }, + '0008,001A' => { VR => 'UI', Name => 'RelatedGeneralSOPClassUID' }, + '0008,001B' => { VR => 'UI', Name => 'OriginalSpecializedSOPClassUID' }, + '0008,0020' => { VR => 'DA', Name => 'StudyDate' }, + '0008,0021' => { VR => 'DA', Name => 'SeriesDate' }, + '0008,0022' => { VR => 'DA', Name => 'AcquisitionDate' }, + '0008,0023' => { VR => 'DA', Name => 'ContentDate' }, + '0008,0024' => { VR => 'DA', Name => 'OverlayDate' }, + '0008,0025' => { VR => 'DA', Name => 'CurveDate' }, + '0008,002A' => { VR => 'DT', Name => 'AcquisitionDateTime' }, + '0008,0030' => { VR => 'TM', Name => 'StudyTime' }, + '0008,0031' => { VR => 'TM', Name => 'SeriesTime' }, + '0008,0032' => { VR => 'TM', Name => 'AcquisitionTime' }, + '0008,0033' => { VR => 'TM', Name => 'ContentTime' }, + '0008,0034' => { VR => 'TM', Name => 'OverlayTime' }, + '0008,0035' => { VR => 'TM', Name => 'CurveTime' }, + '0008,0040' => { VR => 'US', Name => 'DataSetType' }, + '0008,0041' => { VR => 'LO', Name => 'DataSetSubtype' }, + '0008,0042' => { VR => 'CS', Name => 'NuclearMedicineSeriesType' }, + '0008,0050' => { VR => 'SH', Name => 'AccessionNumber' }, + '0008,0052' => { VR => 'CS', Name => 'QueryRetrieveLevel' }, + '0008,0054' => { VR => 'AE', Name => 'RetrieveAETitle' }, + '0008,0056' => { VR => 'CS', Name => 'InstanceAvailability' }, + '0008,0058' => { VR => 'UI', Name => 'FailedSOPInstanceUIDList' }, + '0008,0060' => { VR => 'CS', Name => 'Modality' }, + '0008,0061' => { VR => 'CS', Name => 'ModalitiesInStudy' }, + '0008,0062' => { VR => 'UI', Name => 'SOPClassesInStudy' }, + '0008,0064' => { VR => 'CS', Name => 'ConversionType' }, + '0008,0068' => { VR => 'CS', Name => 'PresentationIntentType' }, + '0008,0070' => { VR => 'LO', Name => 'Manufacturer' }, + '0008,0080' => { VR => 'LO', Name => 'InstitutionName' }, + '0008,0081' => { VR => 'ST', Name => 'InstitutionAddress' }, + '0008,0082' => { VR => 'SQ', Name => 'InstitutionCodeSequence' }, + '0008,0090' => { VR => 'PN', Name => 'ReferringPhysicianName' }, + '0008,0092' => { VR => 'ST', Name => 'ReferringPhysicianAddress' }, + '0008,0094' => { VR => 'SH', Name => 'ReferringPhysicianTelephoneNumber' }, + '0008,0096' => { VR => 'SQ', Name => 'ReferringPhysicianIDSequence' }, + '0008,0100' => { VR => 'SH', Name => 'CodeValue' }, + '0008,0102' => { VR => 'SH', Name => 'CodingSchemeDesignator' }, + '0008,0103' => { VR => 'SH', Name => 'CodingSchemeVersion' }, + '0008,0104' => { VR => 'LO', Name => 'CodeMeaning' }, + '0008,0105' => { VR => 'CS', Name => 'MappingResource' }, + '0008,0106' => { VR => 'DT', Name => 'ContextGroupVersion' }, + '0008,0107' => { VR => 'DT', Name => 'ContextGroupLocalVersion' }, + '0008,010B' => { VR => 'CS', Name => 'ContextGroupExtensionFlag' }, + '0008,010C' => { VR => 'UI', Name => 'CodingSchemeUID' }, + '0008,010D' => { VR => 'UI', Name => 'ContextGroupExtensionCreatorUID' }, + '0008,010F' => { VR => 'CS', Name => 'ContextIdentifier' }, + '0008,0110' => { VR => 'SQ', Name => 'CodingSchemeIDSequence' }, + '0008,0112' => { VR => 'LO', Name => 'CodingSchemeRegistry' }, + '0008,0114' => { VR => 'ST', Name => 'CodingSchemeExternalID' }, + '0008,0115' => { VR => 'ST', Name => 'CodingSchemeName' }, + '0008,0116' => { VR => 'ST', Name => 'ResponsibleOrganization' }, + '0008,0117' => { VR => 'UI', Name => 'ContextUID' }, + '0008,0201' => { VR => 'SH', Name => 'TimezoneOffsetFromUTC' }, + '0008,1000' => { VR => 'AE', Name => 'NetworkID' }, + '0008,1010' => { VR => 'SH', Name => 'StationName' }, + '0008,1030' => { VR => 'LO', Name => 'StudyDescription' }, + '0008,1032' => { VR => 'SQ', Name => 'ProcedureCodeSequence' }, + '0008,103E' => { VR => 'LO', Name => 'SeriesDescription' }, + '0008,1040' => { VR => 'LO', Name => 'InstitutionalDepartmentName' }, + '0008,1048' => { VR => 'PN', Name => 'PhysiciansOfRecord' }, + '0008,1049' => { VR => 'SQ', Name => 'PhysiciansOfRecordIDSequence' }, + '0008,1050' => { VR => 'PN', Name => 'PerformingPhysicianName' }, + '0008,1052' => { VR => 'SQ', Name => 'PerformingPhysicianIDSequence' }, + '0008,1060' => { VR => 'PN', Name => 'NameOfPhysicianReadingStudy' }, + '0008,1062' => { VR => 'SQ', Name => 'PhysicianReadingStudyIDSequence' }, + '0008,1070' => { VR => 'PN', Name => 'OperatorsName' }, + '0008,1072' => { VR => 'SQ', Name => 'OperatorIDSequence' }, + '0008,1080' => { VR => 'LO', Name => 'AdmittingDiagnosesDescription' }, + '0008,1084' => { VR => 'SQ', Name => 'AdmittingDiagnosesCodeSequence' }, + '0008,1090' => { VR => 'LO', Name => 'ManufacturersModelName' }, + '0008,1100' => { VR => 'SQ', Name => 'ReferencedResultsSequence' }, + '0008,1110' => { VR => 'SQ', Name => 'ReferencedStudySequence' }, + '0008,1111' => { VR => 'SQ', Name => 'ReferencedProcedureStepSequence' }, + '0008,1115' => { VR => 'SQ', Name => 'ReferencedSeriesSequence' }, + '0008,1120' => { VR => 'SQ', Name => 'ReferencedPatientSequence' }, + '0008,1125' => { VR => 'SQ', Name => 'ReferencedVisitSequence' }, + '0008,1130' => { VR => 'SQ', Name => 'ReferencedOverlaySequence' }, + '0008,113A' => { VR => 'SQ', Name => 'ReferencedWaveformSequence' }, + '0008,1140' => { VR => 'SQ', Name => 'ReferencedImageSequence' }, + '0008,1145' => { VR => 'SQ', Name => 'ReferencedCurveSequence' }, + '0008,114A' => { VR => 'SQ', Name => 'ReferencedInstanceSequence' }, + '0008,1150' => { VR => 'UI', Name => 'ReferencedSOPClassUID' }, + '0008,1155' => { VR => 'UI', Name => 'ReferencedSOPInstanceUID' }, + '0008,115A' => { VR => 'UI', Name => 'SOPClassesSupported' }, + '0008,1160' => { VR => 'IS', Name => 'ReferencedFrameNumber' }, + '0008,1161' => { VR => 'UL', Name => 'SimpleFrameList' }, + '0008,1162' => { VR => 'UL', Name => 'CalculatedFrameList' }, + '0008,1163' => { VR => 'FD', Name => 'TimeRange' }, + '0008,1164' => { VR => 'SQ', Name => 'FrameExtractionSequence' }, + '0008,1195' => { VR => 'UI', Name => 'TransactionUID' }, + '0008,1197' => { VR => 'US', Name => 'FailureReason' }, + '0008,1198' => { VR => 'SQ', Name => 'FailedSOPSequence' }, + '0008,1199' => { VR => 'SQ', Name => 'ReferencedSOPSequence' }, + '0008,1200' => { VR => 'SQ', Name => 'OtherReferencedStudiesSequence' }, + '0008,1250' => { VR => 'SQ', Name => 'RelatedSeriesSequence' }, + '0008,2110' => { VR => 'CS', Name => 'LossyImageCompression' }, + '0008,2111' => { VR => 'ST', Name => 'DerivationDescription' }, + '0008,2112' => { VR => 'SQ', Name => 'SourceImageSequence' }, + '0008,2120' => { VR => 'SH', Name => 'StageName' }, + '0008,2122' => { VR => 'IS', Name => 'StageNumber' }, + '0008,2124' => { VR => 'IS', Name => 'NumberOfStages' }, + '0008,2127' => { VR => 'SH', Name => 'ViewName' }, + '0008,2128' => { VR => 'IS', Name => 'ViewNumber' }, + '0008,2129' => { VR => 'IS', Name => 'NumberOfEventTimers' }, + '0008,212A' => { VR => 'IS', Name => 'NumberOfViewsInStage' }, + '0008,2130' => { VR => 'DS', Name => 'EventElapsedTimes' }, + '0008,2132' => { VR => 'LO', Name => 'EventTimerNames' }, + '0008,2133' => { VR => 'SQ', Name => 'EventTimerSequence' }, + '0008,2134' => { VR => 'FD', Name => 'EventTimeOffset' }, + '0008,2135' => { VR => 'SQ', Name => 'EventCodeSequence' }, + '0008,2142' => { VR => 'IS', Name => 'StartTrim' }, + '0008,2143' => { VR => 'IS', Name => 'StopTrim' }, + '0008,2144' => { VR => 'IS', Name => 'RecommendedDisplayFrameRate' }, + '0008,2200' => { VR => 'CS', Name => 'TransducerPosition' }, + '0008,2204' => { VR => 'CS', Name => 'TransducerOrientation' }, + '0008,2208' => { VR => 'CS', Name => 'AnatomicStructure' }, + '0008,2218' => { VR => 'SQ', Name => 'AnatomicRegionSequence' }, + '0008,2220' => { VR => 'SQ', Name => 'AnatomicRegionModifierSequence' }, + '0008,2228' => { VR => 'SQ', Name => 'PrimaryAnatomicStructureSequence' }, + '0008,2229' => { VR => 'SQ', Name => 'AnatomicStructureOrRegionSequence' }, + '0008,2230' => { VR => 'SQ', Name => 'AnatomicStructureModifierSequence' }, + '0008,2240' => { VR => 'SQ', Name => 'TransducerPositionSequence' }, + '0008,2242' => { VR => 'SQ', Name => 'TransducerPositionModifierSequence' }, + '0008,2244' => { VR => 'SQ', Name => 'TransducerOrientationSequence' }, + '0008,2246' => { VR => 'SQ', Name => 'TransducerOrientationModifierSeq' }, + '0008,2253' => { VR => 'SQ', Name => 'AnatomicEntrancePortalCodeSeqTrial' }, + '0008,2255' => { VR => 'SQ', Name => 'AnatomicApproachDirCodeSeqTrial' }, + '0008,2256' => { VR => 'ST', Name => 'AnatomicPerspectiveDescrTrial' }, + '0008,2257' => { VR => 'SQ', Name => 'AnatomicPerspectiveCodeSeqTrial' }, + '0008,3001' => { VR => 'SQ', Name => 'AlternateRepresentationSequence' }, + '0008,3010' => { VR => 'UI', Name => 'IrradiationEventUID' }, + '0008,4000' => { VR => 'LT', Name => 'IdentifyingComments' }, + '0008,9007' => { VR => 'CS', Name => 'FrameType' }, + '0008,9092' => { VR => 'SQ', Name => 'ReferencedImageEvidenceSequence' }, + '0008,9121' => { VR => 'SQ', Name => 'ReferencedRawDataSequence' }, + '0008,9123' => { VR => 'UI', Name => 'CreatorVersionUID' }, + '0008,9124' => { VR => 'SQ', Name => 'DerivationImageSequence' }, + '0008,9154' => { VR => 'SQ', Name => 'SourceImageEvidenceSequence' }, + '0008,9205' => { VR => 'CS', Name => 'PixelPresentation' }, + '0008,9206' => { VR => 'CS', Name => 'VolumetricProperties' }, + '0008,9207' => { VR => 'CS', Name => 'VolumeBasedCalculationTechnique' }, + '0008,9208' => { VR => 'CS', Name => 'ComplexImageComponent' }, + '0008,9209' => { VR => 'CS', Name => 'AcquisitionContrast' }, + '0008,9215' => { VR => 'SQ', Name => 'DerivationCodeSequence' }, + '0008,9237' => { VR => 'SQ', Name => 'GrayscalePresentationStateSequence' }, + '0008,9410' => { VR => 'SQ', Name => 'ReferencedOtherPlaneSequence' }, + '0008,9458' => { VR => 'SQ', Name => 'FrameDisplaySequence' }, + '0008,9459' => { VR => 'FL', Name => 'RecommendedDisplayFrameRateInFloat' }, + '0008,9460' => { VR => 'CS', Name => 'SkipFrameRangeFlag' }, + # GEMS_IDEN_01 (ref 4) + '0009,1001' => { VR => 'LO', Name => 'FullFidelity' }, + '0009,1002' => { VR => 'SH', Name => 'SuiteID' }, + '0009,1004' => { VR => 'SH', Name => 'ProductID' }, + '0009,1027' => { VR => 'SL', Name => 'ImageActualDate' }, + '0009,1030' => { VR => 'SH', Name => 'ServiceID' }, + '0009,1031' => { VR => 'SH', Name => 'MobileLocationNumber' }, + '0009,10E3' => { VR => 'UI', Name => 'EquipmentUID' }, + '0009,10E6' => { VR => 'SH', Name => 'GenesisVersionNow' }, + '0009,10E7' => { VR => 'UL', Name => 'ExamRecordChecksum' }, + '0009,10E9' => { VR => 'SL', Name => 'ActualSeriesDataTimeStamp' }, + # patient group + '0010,0000' => { VR => 'UL', Name => 'PatientGroupLength' }, + '0010,0010' => { VR => 'PN', Name => 'PatientName' }, + '0010,0020' => { VR => 'LO', Name => 'PatientID' }, + '0010,0021' => { VR => 'LO', Name => 'IssuerOfPatientID' }, + '0010,0022' => { VR => 'CS', Name => 'TypeOfPatientID' }, + '0010,0030' => { VR => 'DA', Name => 'PatientBirthDate' }, + '0010,0032' => { VR => 'TM', Name => 'PatientBirthTime' }, + '0010,0040' => { VR => 'CS', Name => 'PatientSex' }, + '0010,0050' => { VR => 'SQ', Name => 'PatientInsurancePlanCodeSequence' }, + '0010,0101' => { VR => 'SQ', Name => 'PatientPrimaryLanguageCodeSeq' }, + '0010,0102' => { VR => 'SQ', Name => 'PatientPrimaryLanguageCodeModSeq' }, + '0010,1000' => { VR => 'LO', Name => 'OtherPatientIDs' }, + '0010,1001' => { VR => 'PN', Name => 'OtherPatientNames' }, + '0010,1002' => { VR => 'SQ', Name => 'OtherPatientIDsSequence' }, + '0010,1005' => { VR => 'PN', Name => 'PatientBirthName' }, + '0010,1010' => { VR => 'AS', Name => 'PatientAge' }, + '0010,1020' => { VR => 'DS', Name => 'PatientSize' }, + '0010,1030' => { VR => 'DS', Name => 'PatientWeight' }, + '0010,1040' => { VR => 'LO', Name => 'PatientAddress' }, + '0010,1050' => { VR => 'LO', Name => 'InsurancePlanIdentification' }, + '0010,1060' => { VR => 'PN', Name => 'PatientMotherBirthName' }, + '0010,1080' => { VR => 'LO', Name => 'MilitaryRank' }, + '0010,1081' => { VR => 'LO', Name => 'BranchOfService' }, + '0010,1090' => { VR => 'LO', Name => 'MedicalRecordLocator' }, + '0010,2000' => { VR => 'LO', Name => 'MedicalAlerts' }, + '0010,2110' => { VR => 'LO', Name => 'Allergies' }, + '0010,2150' => { VR => 'LO', Name => 'CountryOfResidence' }, + '0010,2152' => { VR => 'LO', Name => 'RegionOfResidence' }, + '0010,2154' => { VR => 'SH', Name => 'PatientTelephoneNumbers' }, + '0010,2160' => { VR => 'SH', Name => 'EthnicGroup' }, + '0010,2180' => { VR => 'SH', Name => 'Occupation' }, + '0010,21A0' => { VR => 'CS', Name => 'SmokingStatus' }, + '0010,21B0' => { VR => 'LT', Name => 'AdditionalPatientHistory' }, + '0010,21C0' => { VR => 'US', Name => 'PregnancyStatus' }, + '0010,21D0' => { VR => 'DA', Name => 'LastMenstrualDate' }, + '0010,21F0' => { VR => 'LO', Name => 'PatientReligiousPreference' }, + '0010,2201' => { VR => 'LO', Name => 'PatientSpeciesDescription' }, + '0010,2202' => { VR => 'SQ', Name => 'PatientSpeciesCodeSequence' }, + '0010,2203' => { VR => 'CS', Name => 'PatientSexNeutered' }, + '0010,2210' => { VR => 'CS', Name => 'AnatomicalOrientationType' }, + '0010,2292' => { VR => 'LO', Name => 'PatientBreedDescription' }, + '0010,2293' => { VR => 'SQ', Name => 'PatientBreedCodeSequence' }, + '0010,2294' => { VR => 'SQ', Name => 'BreedRegistrationSequence' }, + '0010,2295' => { VR => 'LO', Name => 'BreedRegistrationNumber' }, + '0010,2296' => { VR => 'SQ', Name => 'BreedRegistryCodeSequence' }, + '0010,2297' => { VR => 'PN', Name => 'ResponsiblePerson' }, + '0010,2298' => { VR => 'CS', Name => 'ResponsiblePersonRole' }, + '0010,2299' => { VR => 'LO', Name => 'ResponsibleOrganization' }, + '0010,4000' => { VR => 'LT', Name => 'PatientComments' }, + '0010,9431' => { VR => 'FL', Name => 'ExaminedBodyThickness' }, + # GEMS_PATI_01 (ref 4) + '0011,1010' => { VR => 'SS', Name => 'PatientStatus' }, + # clinical trial group + '0012,0010' => { VR => 'LO', Name => 'ClinicalTrialSponsorName' }, + '0012,0020' => { VR => 'LO', Name => 'ClinicalTrialProtocolID' }, + '0012,0021' => { VR => 'LO', Name => 'ClinicalTrialProtocolName' }, + '0012,0030' => { VR => 'LO', Name => 'ClinicalTrialSiteID' }, + '0012,0031' => { VR => 'LO', Name => 'ClinicalTrialSiteName' }, + '0012,0040' => { VR => 'LO', Name => 'ClinicalTrialSubjectID' }, + '0012,0042' => { VR => 'LO', Name => 'ClinicalTrialSubjectReadingID' }, + '0012,0050' => { VR => 'LO', Name => 'ClinicalTrialTimePointID' }, + '0012,0051' => { VR => 'ST', Name => 'ClinicalTrialTimePointDescription' }, + '0012,0060' => { VR => 'LO', Name => 'ClinicalTrialCoordinatingCenter' }, + '0012,0062' => { VR => 'CS', Name => 'PatientIdentityRemoved' }, + '0012,0063' => { VR => 'LO', Name => 'DeidentificationMethod' }, + '0012,0064' => { VR => 'SQ', Name => 'DeidentificationMethodCodeSequence' }, + '0012,0071' => { VR => 'LO', Name => 'ClinicalTrialSeriesID' }, + '0012,0072' => { VR => 'LO', Name => 'ClinicalTrialSeriesDescription' }, + '0012,0084' => { VR => 'CS', Name => 'DistributionType' }, + '0012,0085' => { VR => 'CS', Name => 'ConsentForDistributionFlag' }, + # acquisition group + '0018,0000' => { VR => 'UL', Name => 'AcquisitionGroupLength' }, + '0018,0010' => { VR => 'LO', Name => 'ContrastBolusAgent' }, + '0018,0012' => { VR => 'SQ', Name => 'ContrastBolusAgentSequence' }, + '0018,0014' => { VR => 'SQ', Name => 'ContrastBolusAdministrationRoute' }, + '0018,0015' => { VR => 'CS', Name => 'BodyPartExamined' }, + '0018,0020' => { VR => 'CS', Name => 'ScanningSequence' }, + '0018,0021' => { VR => 'CS', Name => 'SequenceVariant' }, + '0018,0022' => { VR => 'CS', Name => 'ScanOptions' }, + '0018,0023' => { VR => 'CS', Name => 'MRAcquisitionType' }, + '0018,0024' => { VR => 'SH', Name => 'SequenceName' }, + '0018,0025' => { VR => 'CS', Name => 'AngioFlag' }, + '0018,0026' => { VR => 'SQ', Name => 'InterventionDrugInformationSeq' }, + '0018,0027' => { VR => 'TM', Name => 'InterventionDrugStopTime' }, + '0018,0028' => { VR => 'DS', Name => 'InterventionDrugDose' }, + '0018,0029' => { VR => 'SQ', Name => 'InterventionDrugSequence' }, + '0018,002A' => { VR => 'SQ', Name => 'AdditionalDrugSequence' }, + '0018,0030' => { VR => 'LO', Name => 'Radionuclide' }, + '0018,0031' => { VR => 'LO', Name => 'Radiopharmaceutical' }, + '0018,0032' => { VR => 'DS', Name => 'EnergyWindowCenterline' }, + '0018,0033' => { VR => 'DS', Name => 'EnergyWindowTotalWidth' }, + '0018,0034' => { VR => 'LO', Name => 'InterventionDrugName' }, + '0018,0035' => { VR => 'TM', Name => 'InterventionDrugStartTime' }, + '0018,0036' => { VR => 'SQ', Name => 'InterventionSequence' }, + '0018,0037' => { VR => 'CS', Name => 'TherapyType' }, + '0018,0038' => { VR => 'CS', Name => 'InterventionStatus' }, + '0018,0039' => { VR => 'CS', Name => 'TherapyDescription' }, + '0018,003A' => { VR => 'ST', Name => 'InterventionDescription' }, + '0018,0040' => { VR => 'IS', Name => 'CineRate' }, + '0018,0042' => { VR => 'CS', Name => 'InitialCineRunState' }, + '0018,0050' => { VR => 'DS', Name => 'SliceThickness' }, + '0018,0060' => { VR => 'DS', Name => 'KVP' }, + '0018,0070' => { VR => 'IS', Name => 'CountsAccumulated' }, + '0018,0071' => { VR => 'CS', Name => 'AcquisitionTerminationCondition' }, + '0018,0072' => { VR => 'DS', Name => 'EffectiveDuration' }, + '0018,0073' => { VR => 'CS', Name => 'AcquisitionStartCondition' }, + '0018,0074' => { VR => 'IS', Name => 'AcquisitionStartConditionData' }, + '0018,0075' => { VR => 'IS', Name => 'AcquisitionEndConditionData' }, + '0018,0080' => { VR => 'DS', Name => 'RepetitionTime' }, + '0018,0081' => { VR => 'DS', Name => 'EchoTime' }, + '0018,0082' => { VR => 'DS', Name => 'InversionTime' }, + '0018,0083' => { VR => 'DS', Name => 'NumberOfAverages' }, + '0018,0084' => { VR => 'DS', Name => 'ImagingFrequency' }, + '0018,0085' => { VR => 'SH', Name => 'ImagedNucleus' }, + '0018,0086' => { VR => 'IS', Name => 'EchoNumber' }, + '0018,0087' => { VR => 'DS', Name => 'MagneticFieldStrength' }, + '0018,0088' => { VR => 'DS', Name => 'SpacingBetweenSlices' }, + '0018,0089' => { VR => 'IS', Name => 'NumberOfPhaseEncodingSteps' }, + '0018,0090' => { VR => 'DS', Name => 'DataCollectionDiameter' }, + '0018,0091' => { VR => 'IS', Name => 'EchoTrainLength' }, + '0018,0093' => { VR => 'DS', Name => 'PercentSampling' }, + '0018,0094' => { VR => 'DS', Name => 'PercentPhaseFieldOfView' }, + '0018,0095' => { VR => 'DS', Name => 'PixelBandwidth' }, + '0018,1000' => { VR => 'LO', Name => 'DeviceSerialNumber' }, + '0018,1002' => { VR => 'UI', Name => 'DeviceUID' }, + '0018,1003' => { VR => 'LO', Name => 'DeviceID' }, + '0018,1004' => { VR => 'LO', Name => 'PlateID' }, + '0018,1005' => { VR => 'LO', Name => 'GeneratorID' }, + '0018,1006' => { VR => 'LO', Name => 'GridID' }, + '0018,1007' => { VR => 'LO', Name => 'CassetteID' }, + '0018,1008' => { VR => 'LO', Name => 'GantryID' }, + '0018,1010' => { VR => 'LO', Name => 'SecondaryCaptureDeviceID' }, + '0018,1011' => { VR => 'LO', Name => 'HardcopyCreationDeviceID' }, + '0018,1012' => { VR => 'DA', Name => 'DateOfSecondaryCapture' }, + '0018,1014' => { VR => 'TM', Name => 'TimeOfSecondaryCapture' }, + '0018,1016' => { VR => 'LO', Name => 'SecondaryCaptureDeviceManufacturer' }, + '0018,1017' => { VR => 'LO', Name => 'HardcopyDeviceManufacturer' }, + '0018,1018' => { VR => 'LO', Name => 'SecondaryCaptureDeviceModelName' }, + '0018,1019' => { VR => 'LO', Name => 'SecondaryCaptureDeviceSoftwareVers' }, + '0018,101A' => { VR => 'LO', Name => 'HardcopyDeviceSoftwareVersion' }, + '0018,101B' => { VR => 'LO', Name => 'HardcopyDeviceModelName' }, + '0018,1020' => { VR => 'LO', Name => 'SoftwareVersion' }, + '0018,1022' => { VR => 'SH', Name => 'VideoImageFormatAcquired' }, + '0018,1023' => { VR => 'LO', Name => 'DigitalImageFormatAcquired' }, + '0018,1030' => { VR => 'LO', Name => 'ProtocolName' }, + '0018,1040' => { VR => 'LO', Name => 'ContrastBolusRoute' }, + '0018,1041' => { VR => 'DS', Name => 'ContrastBolusVolume' }, + '0018,1042' => { VR => 'TM', Name => 'ContrastBolusStartTime' }, + '0018,1043' => { VR => 'TM', Name => 'ContrastBolusStopTime' }, + '0018,1044' => { VR => 'DS', Name => 'ContrastBolusTotalDose' }, + '0018,1045' => { VR => 'IS', Name => 'SyringeCounts' }, + '0018,1046' => { VR => 'DS', Name => 'ContrastFlowRate' }, + '0018,1047' => { VR => 'DS', Name => 'ContrastFlowDuration' }, + '0018,1048' => { VR => 'CS', Name => 'ContrastBolusIngredient' }, + '0018,1049' => { VR => 'DS', Name => 'ContrastBolusConcentration' }, + '0018,1050' => { VR => 'DS', Name => 'SpatialResolution' }, + '0018,1060' => { VR => 'DS', Name => 'TriggerTime' }, + '0018,1061' => { VR => 'LO', Name => 'TriggerSourceOrType' }, + '0018,1062' => { VR => 'IS', Name => 'NominalInterval' }, + '0018,1063' => { VR => 'DS', Name => 'FrameTime' }, + '0018,1064' => { VR => 'LO', Name => 'CardiacFramingType' }, + '0018,1065' => { VR => 'DS', Name => 'FrameTimeVector' }, + '0018,1066' => { VR => 'DS', Name => 'FrameDelay' }, + '0018,1067' => { VR => 'DS', Name => 'ImageTriggerDelay' }, + '0018,1068' => { VR => 'DS', Name => 'MultiplexGroupTimeOffset' }, + '0018,1069' => { VR => 'DS', Name => 'TriggerTimeOffset' }, + '0018,106A' => { VR => 'CS', Name => 'SynchronizationTrigger' }, + '0018,106C' => { VR => 'US', Name => 'SynchronizationChannel' }, + '0018,106E' => { VR => 'UL', Name => 'TriggerSamplePosition' }, + '0018,1070' => { VR => 'LO', Name => 'RadiopharmaceuticalRoute' }, + '0018,1071' => { VR => 'DS', Name => 'RadiopharmaceuticalVolume' }, + '0018,1072' => { VR => 'TM', Name => 'RadiopharmaceuticalStartTime' }, + '0018,1073' => { VR => 'TM', Name => 'RadiopharmaceuticalStopTime' }, + '0018,1074' => { VR => 'DS', Name => 'RadionuclideTotalDose' }, + '0018,1075' => { VR => 'DS', Name => 'RadionuclideHalfLife' }, + '0018,1076' => { VR => 'DS', Name => 'RadionuclidePositronFraction' }, + '0018,1077' => { VR => 'DS', Name => 'RadiopharmaceuticalSpecActivity' }, + '0018,1078' => { VR => 'DT', Name => 'RadiopharmaceuticalStartDateTime' }, + '0018,1079' => { VR => 'DT', Name => 'RadiopharmaceuticalStopDateTime' }, + '0018,1080' => { VR => 'CS', Name => 'BeatRejectionFlag' }, + '0018,1081' => { VR => 'IS', Name => 'LowRRValue' }, + '0018,1082' => { VR => 'IS', Name => 'HighRRValue' }, + '0018,1083' => { VR => 'IS', Name => 'IntervalsAcquired' }, + '0018,1084' => { VR => 'IS', Name => 'IntervalsRejected' }, + '0018,1085' => { VR => 'LO', Name => 'PVCRejection' }, + '0018,1086' => { VR => 'IS', Name => 'SkipBeats' }, + '0018,1088' => { VR => 'IS', Name => 'HeartRate' }, + '0018,1090' => { VR => 'IS', Name => 'CardiacNumberOfImages' }, + '0018,1094' => { VR => 'IS', Name => 'TriggerWindow' }, + '0018,1100' => { VR => 'DS', Name => 'ReconstructionDiameter' }, + '0018,1110' => { VR => 'DS', Name => 'DistanceSourceToDetector' }, + '0018,1111' => { VR => 'DS', Name => 'DistanceSourceToPatient' }, + '0018,1114' => { VR => 'DS', Name => 'EstimatedRadiographicMagnification' }, + '0018,1120' => { VR => 'DS', Name => 'GantryDetectorTilt' }, + '0018,1121' => { VR => 'DS', Name => 'GantryDetectorSlew' }, + '0018,1130' => { VR => 'DS', Name => 'TableHeight' }, + '0018,1131' => { VR => 'DS', Name => 'TableTraverse' }, + '0018,1134' => { VR => 'CS', Name => 'TableMotion' }, + '0018,1135' => { VR => 'DS', Name => 'TableVerticalIncrement' }, + '0018,1136' => { VR => 'DS', Name => 'TableLateralIncrement' }, + '0018,1137' => { VR => 'DS', Name => 'TableLongitudinalIncrement' }, + '0018,1138' => { VR => 'DS', Name => 'TableAngle' }, + '0018,113A' => { VR => 'CS', Name => 'TableType' }, + '0018,1140' => { VR => 'CS', Name => 'RotationDirection' }, + '0018,1141' => { VR => 'DS', Name => 'AngularPosition' }, + '0018,1142' => { VR => 'DS', Name => 'RadialPosition' }, + '0018,1143' => { VR => 'DS', Name => 'ScanArc' }, + '0018,1144' => { VR => 'DS', Name => 'AngularStep' }, + '0018,1145' => { VR => 'DS', Name => 'CenterOfRotationOffset' }, + '0018,1146' => { VR => 'DS', Name => 'RotationOffset' }, + '0018,1147' => { VR => 'CS', Name => 'FieldOfViewShape' }, + '0018,1149' => { VR => 'IS', Name => 'FieldOfViewDimensions' }, + '0018,1150' => { VR => 'IS', Name => 'ExposureTime' }, + '0018,1151' => { VR => 'IS', Name => 'XRayTubeCurrent' }, + '0018,1152' => { VR => 'IS', Name => 'Exposure' }, + '0018,1153' => { VR => 'IS', Name => 'ExposureInMicroAmpSec' }, + '0018,1154' => { VR => 'DS', Name => 'AveragePulseWidth' }, + '0018,1155' => { VR => 'CS', Name => 'RadiationSetting' }, + '0018,1156' => { VR => 'CS', Name => 'RectificationType' }, + '0018,115A' => { VR => 'CS', Name => 'RadiationMode' }, + '0018,115E' => { VR => 'DS', Name => 'ImageAreaDoseProduct' }, + '0018,1160' => { VR => 'SH', Name => 'FilterType' }, + '0018,1161' => { VR => 'LO', Name => 'TypeOfFilters' }, + '0018,1162' => { VR => 'DS', Name => 'IntensifierSize' }, + '0018,1164' => { VR => 'DS', Name => 'ImagerPixelSpacing' }, + '0018,1166' => { VR => 'CS', Name => 'Grid' }, + '0018,1170' => { VR => 'IS', Name => 'GeneratorPower' }, + '0018,1180' => { VR => 'SH', Name => 'CollimatorGridName' }, + '0018,1181' => { VR => 'CS', Name => 'CollimatorType' }, + '0018,1182' => { VR => 'IS', Name => 'FocalDistance' }, + '0018,1183' => { VR => 'DS', Name => 'XFocusCenter' }, + '0018,1184' => { VR => 'DS', Name => 'YFocusCenter' }, + '0018,1190' => { VR => 'DS', Name => 'FocalSpots' }, + '0018,1191' => { VR => 'CS', Name => 'AnodeTargetMaterial' }, + '0018,11A0' => { VR => 'DS', Name => 'BodyPartThickness' }, + '0018,11A2' => { VR => 'DS', Name => 'CompressionForce' }, + '0018,1200' => { VR => 'DA', Name => 'DateOfLastCalibration' }, + '0018,1201' => { VR => 'TM', Name => 'TimeOfLastCalibration' }, + '0018,1210' => { VR => 'SH', Name => 'ConvolutionKernel' }, + '0018,1240' => { VR => 'IS', Name => 'UpperLowerPixelValues' }, + '0018,1242' => { VR => 'IS', Name => 'ActualFrameDuration' }, + '0018,1243' => { VR => 'IS', Name => 'CountRate' }, + '0018,1244' => { VR => 'US', Name => 'PreferredPlaybackSequencing' }, + '0018,1250' => { VR => 'SH', Name => 'ReceiveCoilName' }, + '0018,1251' => { VR => 'SH', Name => 'TransmitCoilName' }, + '0018,1260' => { VR => 'SH', Name => 'PlateType' }, + '0018,1261' => { VR => 'LO', Name => 'PhosphorType' }, + '0018,1300' => { VR => 'DS', Name => 'ScanVelocity' }, + '0018,1301' => { VR => 'CS', Name => 'WholeBodyTechnique' }, + '0018,1302' => { VR => 'IS', Name => 'ScanLength' }, + '0018,1310' => { VR => 'US', Name => 'AcquisitionMatrix' }, + '0018,1312' => { VR => 'CS', Name => 'InPlanePhaseEncodingDirection' }, + '0018,1314' => { VR => 'DS', Name => 'FlipAngle' }, + '0018,1315' => { VR => 'CS', Name => 'VariableFlipAngleFlag' }, + '0018,1316' => { VR => 'DS', Name => 'SAR' }, + '0018,1318' => { VR => 'DS', Name => 'DB-Dt' }, + '0018,1400' => { VR => 'LO', Name => 'AcquisitionDeviceProcessingDescr' }, + '0018,1401' => { VR => 'LO', Name => 'AcquisitionDeviceProcessingCode' }, + '0018,1402' => { VR => 'CS', Name => 'CassetteOrientation' }, + '0018,1403' => { VR => 'CS', Name => 'CassetteSize' }, + '0018,1404' => { VR => 'US', Name => 'ExposuresOnPlate' }, + '0018,1405' => { VR => 'IS', Name => 'RelativeXRayExposure' }, + '0018,1450' => { VR => 'DS', Name => 'ColumnAngulation' }, + '0018,1460' => { VR => 'DS', Name => 'TomoLayerHeight' }, + '0018,1470' => { VR => 'DS', Name => 'TomoAngle' }, + '0018,1480' => { VR => 'DS', Name => 'TomoTime' }, + '0018,1490' => { VR => 'CS', Name => 'TomoType' }, + '0018,1491' => { VR => 'CS', Name => 'TomoClass' }, + '0018,1495' => { VR => 'IS', Name => 'NumberOfTomosynthesisSourceImages' }, + '0018,1500' => { VR => 'CS', Name => 'PositionerMotion' }, + '0018,1508' => { VR => 'CS', Name => 'PositionerType' }, + '0018,1510' => { VR => 'DS', Name => 'PositionerPrimaryAngle' }, + '0018,1511' => { VR => 'DS', Name => 'PositionerSecondaryAngle' }, + '0018,1520' => { VR => 'DS', Name => 'PositionerPrimaryAngleIncrement' }, + '0018,1521' => { VR => 'DS', Name => 'PositionerSecondaryAngleIncrement' }, + '0018,1530' => { VR => 'DS', Name => 'DetectorPrimaryAngle' }, + '0018,1531' => { VR => 'DS', Name => 'DetectorSecondaryAngle' }, + '0018,1600' => { VR => 'CS', Name => 'ShutterShape' }, + '0018,1602' => { VR => 'IS', Name => 'ShutterLeftVerticalEdge' }, + '0018,1604' => { VR => 'IS', Name => 'ShutterRightVerticalEdge' }, + '0018,1606' => { VR => 'IS', Name => 'ShutterUpperHorizontalEdge' }, + '0018,1608' => { VR => 'IS', Name => 'ShutterLowerHorizontalEdge' }, + '0018,1610' => { VR => 'IS', Name => 'CenterOfCircularShutter' }, + '0018,1612' => { VR => 'IS', Name => 'RadiusOfCircularShutter' }, + '0018,1620' => { VR => 'IS', Name => 'VerticesOfPolygonalShutter' }, + '0018,1622' => { VR => 'US', Name => 'ShutterPresentationValue' }, + '0018,1623' => { VR => 'US', Name => 'ShutterOverlayGroup' }, + '0018,1624' => { VR => 'US', Name => 'ShutterPresentationColorCIELabVal' }, + '0018,1700' => { VR => 'CS', Name => 'CollimatorShape' }, + '0018,1702' => { VR => 'IS', Name => 'CollimatorLeftVerticalEdge' }, + '0018,1704' => { VR => 'IS', Name => 'CollimatorRightVerticalEdge' }, + '0018,1706' => { VR => 'IS', Name => 'CollimatorUpperHorizontalEdge' }, + '0018,1708' => { VR => 'IS', Name => 'CollimatorLowerHorizontalEdge' }, + '0018,1710' => { VR => 'IS', Name => 'CenterOfCircularCollimator' }, + '0018,1712' => { VR => 'IS', Name => 'RadiusOfCircularCollimator' }, + '0018,1720' => { VR => 'IS', Name => 'VerticesOfPolygonalCollimator' }, + '0018,1800' => { VR => 'CS', Name => 'AcquisitionTimeSynchronized' }, + '0018,1801' => { VR => 'SH', Name => 'TimeSource' }, + '0018,1802' => { VR => 'CS', Name => 'TimeDistributionProtocol' }, + '0018,1803' => { VR => 'LO', Name => 'NTPSourceAddress' }, + '0018,2001' => { VR => 'IS', Name => 'PageNumberVector' }, + '0018,2002' => { VR => 'SH', Name => 'FrameLabelVector' }, + '0018,2003' => { VR => 'DS', Name => 'FramePrimaryAngleVector' }, + '0018,2004' => { VR => 'DS', Name => 'FrameSecondaryAngleVector' }, + '0018,2005' => { VR => 'DS', Name => 'SliceLocationVector' }, + '0018,2006' => { VR => 'SH', Name => 'DisplayWindowLabelVector' }, + '0018,2010' => { VR => 'DS', Name => 'NominalScannedPixelSpacing' }, + '0018,2020' => { VR => 'CS', Name => 'DigitizingDeviceTransportDirection' }, + '0018,2030' => { VR => 'DS', Name => 'RotationOfScannedFilm' }, + '0018,3100' => { VR => 'CS', Name => 'IVUSAcquisition' }, + '0018,3101' => { VR => 'DS', Name => 'IVUSPullbackRate' }, + '0018,3102' => { VR => 'DS', Name => 'IVUSGatedRate' }, + '0018,3103' => { VR => 'IS', Name => 'IVUSPullbackStartFrameNumber' }, + '0018,3104' => { VR => 'IS', Name => 'IVUSPullbackStopFrameNumber' }, + '0018,3105' => { VR => 'IS', Name => 'LesionNumber' }, + '0018,4000' => { VR => 'LT', Name => 'AcquisitionComments' }, + '0018,5000' => { VR => 'SH', Name => 'OutputPower' }, + '0018,5010' => { VR => 'LO', Name => 'TransducerData' }, + '0018,5012' => { VR => 'DS', Name => 'FocusDepth' }, + '0018,5020' => { VR => 'LO', Name => 'ProcessingFunction' }, + '0018,5021' => { VR => 'LO', Name => 'PostprocessingFunction' }, + '0018,5022' => { VR => 'DS', Name => 'MechanicalIndex' }, + '0018,5024' => { VR => 'DS', Name => 'BoneThermalIndex' }, + '0018,5026' => { VR => 'DS', Name => 'CranialThermalIndex' }, + '0018,5027' => { VR => 'DS', Name => 'SoftTissueThermalIndex' }, + '0018,5028' => { VR => 'DS', Name => 'SoftTissueFocusThermalIndex' }, + '0018,5029' => { VR => 'DS', Name => 'SoftTissueSurfaceThermalIndex' }, + '0018,5030' => { VR => 'DS', Name => 'DynamicRange' }, + '0018,5040' => { VR => 'DS', Name => 'TotalGain' }, + '0018,5050' => { VR => 'IS', Name => 'DepthOfScanField' }, + '0018,5100' => { VR => 'CS', Name => 'PatientPosition' }, + '0018,5101' => { VR => 'CS', Name => 'ViewPosition' }, + '0018,5104' => { VR => 'SQ', Name => 'ProjectionEponymousNameCodeSeq' }, + '0018,5210' => { VR => 'DS', Name => 'ImageTransformationMatrix' }, + '0018,5212' => { VR => 'DS', Name => 'ImageTranslationVector' }, + '0018,6000' => { VR => 'DS', Name => 'Sensitivity' }, + '0018,6011' => { VR => 'SQ', Name => 'SequenceOfUltrasoundRegions' }, + '0018,6012' => { VR => 'US', Name => 'RegionSpatialFormat' }, + '0018,6014' => { VR => 'US', Name => 'RegionDataType' }, + '0018,6016' => { VR => 'UL', Name => 'RegionFlags' }, + '0018,6018' => { VR => 'UL', Name => 'RegionLocationMinX0' }, + '0018,601A' => { VR => 'UL', Name => 'RegionLocationMinY0' }, + '0018,601C' => { VR => 'UL', Name => 'RegionLocationMaxX1' }, + '0018,601E' => { VR => 'UL', Name => 'RegionLocationMaxY1' }, + '0018,6020' => { VR => 'SL', Name => 'ReferencePixelX0' }, + '0018,6022' => { VR => 'SL', Name => 'ReferencePixelY0' }, + '0018,6024' => { VR => 'US', Name => 'PhysicalUnitsXDirection' }, + '0018,6026' => { VR => 'US', Name => 'PhysicalUnitsYDirection' }, + '0018,6028' => { VR => 'FD', Name => 'ReferencePixelPhysicalValueX' }, + '0018,602A' => { VR => 'FD', Name => 'ReferencePixelPhysicalValueY' }, + '0018,602C' => { VR => 'FD', Name => 'PhysicalDeltaX' }, + '0018,602E' => { VR => 'FD', Name => 'PhysicalDeltaY' }, + '0018,6030' => { VR => 'UL', Name => 'TransducerFrequency' }, + '0018,6031' => { VR => 'CS', Name => 'TransducerType' }, + '0018,6032' => { VR => 'UL', Name => 'PulseRepetitionFrequency' }, + '0018,6034' => { VR => 'FD', Name => 'DopplerCorrectionAngle' }, + '0018,6036' => { VR => 'FD', Name => 'SteeringAngle' }, + '0018,6038' => { VR => 'UL', Name => 'DopplerSampleVolumeXPosRetired' }, + '0018,6039' => { VR => 'SL', Name => 'DopplerSampleVolumeXPosition' }, + '0018,603A' => { VR => 'UL', Name => 'DopplerSampleVolumeYPosRetired' }, + '0018,603B' => { VR => 'SL', Name => 'DopplerSampleVolumeYPosition' }, + '0018,603C' => { VR => 'UL', Name => 'TMLinePositionX0Retired' }, + '0018,603D' => { VR => 'SL', Name => 'TMLinePositionX0' }, + '0018,603E' => { VR => 'UL', Name => 'TMLinePositionY0Retired' }, + '0018,603F' => { VR => 'SL', Name => 'TMLinePositionY0' }, + '0018,6040' => { VR => 'UL', Name => 'TMLinePositionX1Retired' }, + '0018,6041' => { VR => 'SL', Name => 'TMLinePositionX1' }, + '0018,6042' => { VR => 'UL', Name => 'TMLinePositionY1Retired' }, + '0018,6043' => { VR => 'SL', Name => 'TMLinePositionY1' }, + '0018,6044' => { VR => 'US', Name => 'PixelComponentOrganization' }, + '0018,6046' => { VR => 'UL', Name => 'PixelComponentMask' }, + '0018,6048' => { VR => 'UL', Name => 'PixelComponentRangeStart' }, + '0018,604A' => { VR => 'UL', Name => 'PixelComponentRangeStop' }, + '0018,604C' => { VR => 'US', Name => 'PixelComponentPhysicalUnits' }, + '0018,604E' => { VR => 'US', Name => 'PixelComponentDataType' }, + '0018,6050' => { VR => 'UL', Name => 'NumberOfTableBreakPoints' }, + '0018,6052' => { VR => 'UL', Name => 'TableOfXBreakPoints' }, + '0018,6054' => { VR => 'FD', Name => 'TableOfYBreakPoints' }, + '0018,6056' => { VR => 'UL', Name => 'NumberOfTableEntries' }, + '0018,6058' => { VR => 'UL', Name => 'TableOfPixelValues' }, + '0018,605A' => { VR => 'FL', Name => 'TableOfParameterValues' }, + '0018,6060' => { VR => 'FL', Name => 'RWaveTimeVector' }, + '0018,7000' => { VR => 'CS', Name => 'DetectorConditionsNominalFlag' }, + '0018,7001' => { VR => 'DS', Name => 'DetectorTemperature' }, + '0018,7004' => { VR => 'CS', Name => 'DetectorType' }, + '0018,7005' => { VR => 'CS', Name => 'DetectorConfiguration' }, + '0018,7006' => { VR => 'LT', Name => 'DetectorDescription' }, + '0018,7008' => { VR => 'LT', Name => 'DetectorMode' }, + '0018,700A' => { VR => 'SH', Name => 'DetectorID' }, + '0018,700C' => { VR => 'DA', Name => 'DateOfLastDetectorCalibration' }, + '0018,700E' => { VR => 'TM', Name => 'TimeOfLastDetectorCalibration' }, + '0018,7010' => { VR => 'IS', Name => 'DetectorExposuresSinceCalibration' }, + '0018,7011' => { VR => 'IS', Name => 'DetectorExposuresSinceManufactured' }, + '0018,7012' => { VR => 'DS', Name => 'DetectorTimeSinceLastExposure' }, + '0018,7014' => { VR => 'DS', Name => 'DetectorActiveTime' }, + '0018,7016' => { VR => 'DS', Name => 'DetectorActiveOffsetFromExposure' }, + '0018,701A' => { VR => 'DS', Name => 'DetectorBinning' }, + '0018,7020' => { VR => 'DS', Name => 'DetectorElementPhysicalSize' }, + '0018,7022' => { VR => 'DS', Name => 'DetectorElementSpacing' }, + '0018,7024' => { VR => 'CS', Name => 'DetectorActiveShape' }, + '0018,7026' => { VR => 'DS', Name => 'DetectorActiveDimensions' }, + '0018,7028' => { VR => 'DS', Name => 'DetectorActiveOrigin' }, + '0018,702A' => { VR => 'LO', Name => 'DetectorManufacturerName' }, + '0018,702B' => { VR => 'LO', Name => 'DetectorManufacturersModelName' }, + '0018,7030' => { VR => 'DS', Name => 'FieldOfViewOrigin' }, + '0018,7032' => { VR => 'DS', Name => 'FieldOfViewRotation' }, + '0018,7034' => { VR => 'CS', Name => 'FieldOfViewHorizontalFlip' }, + '0018,7040' => { VR => 'LT', Name => 'GridAbsorbingMaterial' }, + '0018,7041' => { VR => 'LT', Name => 'GridSpacingMaterial' }, + '0018,7042' => { VR => 'DS', Name => 'GridThickness' }, + '0018,7044' => { VR => 'DS', Name => 'GridPitch' }, + '0018,7046' => { VR => 'IS', Name => 'GridAspectRatio' }, + '0018,7048' => { VR => 'DS', Name => 'GridPeriod' }, + '0018,704C' => { VR => 'DS', Name => 'GridFocalDistance' }, + '0018,7050' => { VR => 'CS', Name => 'FilterMaterial' }, + '0018,7052' => { VR => 'DS', Name => 'FilterThicknessMinimum' }, + '0018,7054' => { VR => 'DS', Name => 'FilterThicknessMaximum' }, + '0018,7060' => { VR => 'CS', Name => 'ExposureControlMode' }, + '0018,7062' => { VR => 'LT', Name => 'ExposureControlModeDescription' }, + '0018,7064' => { VR => 'CS', Name => 'ExposureStatus' }, + '0018,7065' => { VR => 'DS', Name => 'PhototimerSetting' }, + '0018,8150' => { VR => 'DS', Name => 'ExposureTimeInMicroSec' }, + '0018,8151' => { VR => 'DS', Name => 'XRayTubeCurrentInMicroAmps' }, + '0018,9004' => { VR => 'CS', Name => 'ContentQualification' }, + '0018,9005' => { VR => 'SH', Name => 'PulseSequenceName' }, + '0018,9006' => { VR => 'SQ', Name => 'MRImagingModifierSequence' }, + '0018,9008' => { VR => 'CS', Name => 'EchoPulseSequence' }, + '0018,9009' => { VR => 'CS', Name => 'InversionRecovery' }, + '0018,9010' => { VR => 'CS', Name => 'FlowCompensation' }, + '0018,9011' => { VR => 'CS', Name => 'MultipleSpinEcho' }, + '0018,9012' => { VR => 'CS', Name => 'MultiPlanarExcitation' }, + '0018,9014' => { VR => 'CS', Name => 'PhaseContrast' }, + '0018,9015' => { VR => 'CS', Name => 'TimeOfFlightContrast' }, + '0018,9016' => { VR => 'CS', Name => 'Spoiling' }, + '0018,9017' => { VR => 'CS', Name => 'SteadyStatePulseSequence' }, + '0018,9018' => { VR => 'CS', Name => 'EchoPlanarPulseSequence' }, + '0018,9019' => { VR => 'FD', Name => 'TagAngleFirstAxis' }, + '0018,9020' => { VR => 'CS', Name => 'MagnetizationTransfer' }, + '0018,9021' => { VR => 'CS', Name => 'T2Preparation' }, + '0018,9022' => { VR => 'CS', Name => 'BloodSignalNulling' }, + '0018,9022' => { VR => 'CS', Name => 'BloodSignalNulling' }, + '0018,9024' => { VR => 'CS', Name => 'SaturationRecovery' }, + '0018,9025' => { VR => 'CS', Name => 'SpectrallySelectedSuppression' }, + '0018,9026' => { VR => 'CS', Name => 'SpectrallySelectedExcitation' }, + '0018,9027' => { VR => 'CS', Name => 'SpatialPresaturation' }, + '0018,9028' => { VR => 'CS', Name => 'Tagging' }, + '0018,9029' => { VR => 'CS', Name => 'OversamplingPhase' }, + '0018,9030' => { VR => 'FD', Name => 'TagSpacingFirstDimension' }, + '0018,9032' => { VR => 'CS', Name => 'GeometryOfKSpaceTraversal' }, + '0018,9033' => { VR => 'CS', Name => 'SegmentedKSpaceTraversal' }, + '0018,9034' => { VR => 'CS', Name => 'RectilinearPhaseEncodeReordering' }, + '0018,9035' => { VR => 'FD', Name => 'TagThickness' }, + '0018,9036' => { VR => 'CS', Name => 'PartialFourierDirection' }, + '0018,9037' => { VR => 'CS', Name => 'CardiacSynchronizationTechnique' }, + '0018,9041' => { VR => 'LO', Name => 'ReceiveCoilManufacturerName' }, + '0018,9042' => { VR => 'SQ', Name => 'MRReceiveCoilSequence' }, + '0018,9043' => { VR => 'CS', Name => 'ReceiveCoilType' }, + '0018,9044' => { VR => 'CS', Name => 'QuadratureReceiveCoil' }, + '0018,9045' => { VR => 'SQ', Name => 'MultiCoilDefinitionSequence' }, + '0018,9046' => { VR => 'LO', Name => 'MultiCoilConfiguration' }, + '0018,9047' => { VR => 'SH', Name => 'MultiCoilElementName' }, + '0018,9048' => { VR => 'CS', Name => 'MultiCoilElementUsed' }, + '0018,9049' => { VR => 'SQ', Name => 'MRTransmitCoilSequence' }, + '0018,9050' => { VR => 'LO', Name => 'TransmitCoilManufacturerName' }, + '0018,9051' => { VR => 'CS', Name => 'TransmitCoilType' }, + '0018,9052' => { VR => 'FD', Name => 'SpectralWidth' }, + '0018,9053' => { VR => 'FD', Name => 'ChemicalShiftReference' }, + '0018,9054' => { VR => 'CS', Name => 'VolumeLocalizationTechnique' }, + '0018,9058' => { VR => 'US', Name => 'MRAcquisitionFrequencyEncodeSteps' }, + '0018,9059' => { VR => 'CS', Name => 'Decoupling' }, + '0018,9060' => { VR => 'CS', Name => 'DecoupledNucleus' }, + '0018,9061' => { VR => 'FD', Name => 'DecouplingFrequency' }, + '0018,9062' => { VR => 'CS', Name => 'DecouplingMethod' }, + '0018,9063' => { VR => 'FD', Name => 'DecouplingChemicalShiftReference' }, + '0018,9064' => { VR => 'CS', Name => 'KSpaceFiltering' }, + '0018,9065' => { VR => 'CS', Name => 'TimeDomainFiltering' }, + '0018,9066' => { VR => 'US', Name => 'NumberOfZeroFills' }, + '0018,9067' => { VR => 'CS', Name => 'BaselineCorrection' }, + '0018,9069' => { VR => 'FD', Name => 'ParallelReductionFactorInPlane' }, + '0018,9070' => { VR => 'FD', Name => 'CardiacRRIntervalSpecified' }, + '0018,9073' => { VR => 'FD', Name => 'AcquisitionDuration' }, + '0018,9074' => { VR => 'DT', Name => 'FrameAcquisitionDateTime' }, + '0018,9075' => { VR => 'CS', Name => 'DiffusionDirectionality' }, + '0018,9076' => { VR => 'SQ', Name => 'DiffusionGradientDirectionSequence' }, + '0018,9077' => { VR => 'CS', Name => 'ParallelAcquisition' }, + '0018,9078' => { VR => 'CS', Name => 'ParallelAcquisitionTechnique' }, + '0018,9079' => { VR => 'FD', Name => 'InversionTimes' }, + '0018,9080' => { VR => 'ST', Name => 'MetaboliteMapDescription' }, + '0018,9081' => { VR => 'CS', Name => 'PartialFourier' }, + '0018,9082' => { VR => 'FD', Name => 'EffectiveEchoTime' }, + '0018,9083' => { VR => 'SQ', Name => 'MetaboliteMapCodeSequence' }, + '0018,9084' => { VR => 'SQ', Name => 'ChemicalShiftSequence' }, + '0018,9085' => { VR => 'CS', Name => 'CardiacSignalSource' }, + '0018,9087' => { VR => 'FD', Name => 'DiffusionBValue' }, + '0018,9089' => { VR => 'FD', Name => 'DiffusionGradientOrientation' }, + '0018,9090' => { VR => 'FD', Name => 'VelocityEncodingDirection' }, + '0018,9091' => { VR => 'FD', Name => 'VelocityEncodingMinimumValue' }, + '0018,9093' => { VR => 'US', Name => 'NumberOfKSpaceTrajectories' }, + '0018,9094' => { VR => 'CS', Name => 'CoverageOfKSpace' }, + '0018,9095' => { VR => 'UL', Name => 'SpectroscopyAcquisitionPhaseRows' }, + '0018,9096' => { VR => 'FD', Name => 'ParallelReductFactorInPlaneRetired' }, + '0018,9098' => { VR => 'FD', Name => 'TransmitterFrequency' }, + '0018,9100' => { VR => 'CS', Name => 'ResonantNucleus' }, + '0018,9101' => { VR => 'CS', Name => 'FrequencyCorrection' }, + '0018,9103' => { VR => 'SQ', Name => 'MRSpectroscopyFOV-GeometrySequence' }, + '0018,9104' => { VR => 'FD', Name => 'SlabThickness' }, + '0018,9105' => { VR => 'FD', Name => 'SlabOrientation' }, + '0018,9106' => { VR => 'FD', Name => 'MidSlabPosition' }, + '0018,9107' => { VR => 'SQ', Name => 'MRSpatialSaturationSequence' }, + '0018,9112' => { VR => 'SQ', Name => 'MRTimingAndRelatedParametersSeq' }, + '0018,9114' => { VR => 'SQ', Name => 'MREchoSequence' }, + '0018,9115' => { VR => 'SQ', Name => 'MRModifierSequence' }, + '0018,9117' => { VR => 'SQ', Name => 'MRDiffusionSequence' }, + '0018,9118' => { VR => 'SQ', Name => 'CardiacTriggerSequence' }, + '0018,9119' => { VR => 'SQ', Name => 'MRAveragesSequence' }, + '0018,9125' => { VR => 'SQ', Name => 'MRFOV-GeometrySequence' }, + '0018,9126' => { VR => 'SQ', Name => 'VolumeLocalizationSequence' }, + '0018,9127' => { VR => 'UL', Name => 'SpectroscopyAcquisitionDataColumns' }, + '0018,9147' => { VR => 'CS', Name => 'DiffusionAnisotropyType' }, + '0018,9151' => { VR => 'DT', Name => 'FrameReferenceDateTime' }, + '0018,9152' => { VR => 'SQ', Name => 'MRMetaboliteMapSequence' }, + '0018,9155' => { VR => 'FD', Name => 'ParallelReductionFactorOutOfPlane' }, + '0018,9159' => { VR => 'UL', Name => 'SpectroscopyOutOfPlanePhaseSteps' }, + '0018,9166' => { VR => 'CS', Name => 'BulkMotionStatus' }, + '0018,9168' => { VR => 'FD', Name => 'ParallelReductionFactSecondInPlane' }, + '0018,9169' => { VR => 'CS', Name => 'CardiacBeatRejectionTechnique' }, + '0018,9170' => { VR => 'CS', Name => 'RespiratoryMotionCompTechnique' }, + '0018,9171' => { VR => 'CS', Name => 'RespiratorySignalSource' }, + '0018,9172' => { VR => 'CS', Name => 'BulkMotionCompensationTechnique' }, + '0018,9173' => { VR => 'CS', Name => 'BulkMotionSignalSource' }, + '0018,9174' => { VR => 'CS', Name => 'ApplicableSafetyStandardAgency' }, + '0018,9175' => { VR => 'LO', Name => 'ApplicableSafetyStandardDescr' }, + '0018,9176' => { VR => 'SQ', Name => 'OperatingModeSequence' }, + '0018,9177' => { VR => 'CS', Name => 'OperatingModeType' }, + '0018,9178' => { VR => 'CS', Name => 'OperatingMode' }, + '0018,9179' => { VR => 'CS', Name => 'SpecificAbsorptionRateDefinition' }, + '0018,9180' => { VR => 'CS', Name => 'GradientOutputType' }, + '0018,9181' => { VR => 'FD', Name => 'SpecificAbsorptionRateValue' }, + '0018,9182' => { VR => 'FD', Name => 'GradientOutput' }, + '0018,9183' => { VR => 'CS', Name => 'FlowCompensationDirection' }, + '0018,9184' => { VR => 'FD', Name => 'TaggingDelay' }, + '0018,9185' => { VR => 'ST', Name => 'RespiratoryMotionCompTechDescr' }, + '0018,9186' => { VR => 'SH', Name => 'RespiratorySignalSourceID' }, + '0018,9195' => { VR => 'FD', Name => 'ChemicalShiftsMinIntegrateLimitHz' }, + '0018,9196' => { VR => 'FD', Name => 'ChemicalShiftsMaxIntegrateLimitHz' }, + '0018,9197' => { VR => 'SQ', Name => 'MRVelocityEncodingSequence' }, + '0018,9198' => { VR => 'CS', Name => 'FirstOrderPhaseCorrection' }, + '0018,9199' => { VR => 'CS', Name => 'WaterReferencedPhaseCorrection' }, + '0018,9200' => { VR => 'CS', Name => 'MRSpectroscopyAcquisitionType' }, + '0018,9214' => { VR => 'CS', Name => 'RespiratoryCyclePosition' }, + '0018,9217' => { VR => 'FD', Name => 'VelocityEncodingMaximumValue' }, + '0018,9218' => { VR => 'FD', Name => 'TagSpacingSecondDimension' }, + '0018,9219' => { VR => 'SS', Name => 'TagAngleSecondAxis' }, + '0018,9220' => { VR => 'FD', Name => 'FrameAcquisitionDuration' }, + '0018,9226' => { VR => 'SQ', Name => 'MRImageFrameTypeSequence' }, + '0018,9227' => { VR => 'SQ', Name => 'MRSpectroscopyFrameTypeSequence' }, + '0018,9231' => { VR => 'US', Name => 'MRAcqPhaseEncodingStepsInPlane' }, + '0018,9232' => { VR => 'US', Name => 'MRAcqPhaseEncodingStepsOutOfPlane' }, + '0018,9234' => { VR => 'UL', Name => 'SpectroscopyAcqPhaseColumns' }, + '0018,9236' => { VR => 'CS', Name => 'CardiacCyclePosition' }, + '0018,9239' => { VR => 'SQ', Name => 'SpecificAbsorptionRateSequence' }, + '0018,9240' => { VR => 'US', Name => 'RFEchoTrainLength' }, + '0018,9241' => { VR => 'US', Name => 'GradientEchoTrainLength' }, + '0018,9295' => { VR => 'FD', Name => 'ChemicalShiftsMinIntegrateLimitPPM' }, + '0018,9296' => { VR => 'FD', Name => 'ChemicalShiftsMaxIntegrateLimitPPM' }, + '0018,9301' => { VR => 'SQ', Name => 'CTAcquisitionTypeSequence' }, + '0018,9302' => { VR => 'CS', Name => 'AcquisitionType' }, + '0018,9303' => { VR => 'FD', Name => 'TubeAngle' }, + '0018,9304' => { VR => 'SQ', Name => 'CTAcquisitionDetailsSequence' }, + '0018,9305' => { VR => 'FD', Name => 'RevolutionTime' }, + '0018,9306' => { VR => 'FD', Name => 'SingleCollimationWidth' }, + '0018,9307' => { VR => 'FD', Name => 'TotalCollimationWidth' }, + '0018,9308' => { VR => 'SQ', Name => 'CTTableDynamicsSequence' }, + '0018,9309' => { VR => 'FD', Name => 'TableSpeed' }, + '0018,9310' => { VR => 'FD', Name => 'TableFeedPerRotation' }, + '0018,9311' => { VR => 'FD', Name => 'SpiralPitchFactor' }, + '0018,9312' => { VR => 'SQ', Name => 'CTGeometrySequence' }, + '0018,9313' => { VR => 'FD', Name => 'DataCollectionCenterPatient' }, + '0018,9314' => { VR => 'SQ', Name => 'CTReconstructionSequence' }, + '0018,9315' => { VR => 'CS', Name => 'ReconstructionAlgorithm' }, + '0018,9316' => { VR => 'CS', Name => 'ConvolutionKernelGroup' }, + '0018,9317' => { VR => 'FD', Name => 'ReconstructionFieldOfView' }, + '0018,9318' => { VR => 'FD', Name => 'ReconstructionTargetCenterPatient' }, + '0018,9319' => { VR => 'FD', Name => 'ReconstructionAngle' }, + '0018,9320' => { VR => 'SH', Name => 'ImageFilter' }, + '0018,9321' => { VR => 'SQ', Name => 'CTExposureSequence' }, + '0018,9322' => { VR => 'FD', Name => 'ReconstructionPixelSpacing' }, + '0018,9323' => { VR => 'CS', Name => 'ExposureModulationType' }, + '0018,9324' => { VR => 'FD', Name => 'EstimatedDoseSaving' }, + '0018,9325' => { VR => 'SQ', Name => 'CTXRayDetailsSequence' }, + '0018,9326' => { VR => 'SQ', Name => 'CTPositionSequence' }, + '0018,9327' => { VR => 'FD', Name => 'TablePosition' }, + '0018,9328' => { VR => 'FD', Name => 'ExposureTimeInMilliSec' }, + '0018,9329' => { VR => 'SQ', Name => 'CTImageFrameTypeSequence' }, + '0018,9330' => { VR => 'FD', Name => 'XRayTubeCurrentInMilliAmps' }, + '0018,9332' => { VR => 'FD', Name => 'ExposureInMilliAmpSec' }, + '0018,9333' => { VR => 'CS', Name => 'ConstantVolumeFlag' }, + '0018,9334' => { VR => 'CS', Name => 'FluoroscopyFlag' }, + '0018,9335' => { VR => 'FD', Name => 'SourceToDataCollectionCenterDist' }, + '0018,9337' => { VR => 'US', Name => 'ContrastBolusAgentNumber' }, + '0018,9338' => { VR => 'SQ', Name => 'ContrastBolusIngredientCodeSeq' }, + '0018,9340' => { VR => 'SQ', Name => 'ContrastAdministrationProfileSeq' }, + '0018,9341' => { VR => 'SQ', Name => 'ContrastBolusUsageSequence' }, + '0018,9342' => { VR => 'CS', Name => 'ContrastBolusAgentAdministered' }, + '0018,9343' => { VR => 'CS', Name => 'ContrastBolusAgentDetected' }, + '0018,9344' => { VR => 'CS', Name => 'ContrastBolusAgentPhase' }, + '0018,9345' => { VR => 'FD', Name => 'CTDIvol' }, + '0018,9346' => { VR => 'SQ', Name => 'CTDIPhantomTypeCodeSequence' }, + '0018,9351' => { VR => 'FL', Name => 'CalciumScoringMassFactorPatient' }, + '0018,9352' => { VR => 'FL', Name => 'CalciumScoringMassFactorDevice' }, + '0018,9353' => { VR => 'FL', Name => 'EnergyWeightingFactor' }, + '0018,9360' => { VR => 'SQ', Name => 'CTAdditionalXRaySourceSequence' }, + '0018,9401' => { VR => 'SQ', Name => 'ProjectionPixelCalibrationSequence' }, + '0018,9402' => { VR => 'FL', Name => 'DistanceSourceToIsocenter' }, + '0018,9403' => { VR => 'FL', Name => 'DistanceObjectToTableTop' }, + '0018,9404' => { VR => 'FL', Name => 'ObjectPixelSpacingInCenterOfBeam' }, + '0018,9405' => { VR => 'SQ', Name => 'PositionerPositionSequence' }, + '0018,9406' => { VR => 'SQ', Name => 'TablePositionSequence' }, + '0018,9407' => { VR => 'SQ', Name => 'CollimatorShapeSequence' }, + '0018,9412' => { VR => 'SQ', Name => 'XA-XRFFrameCharacteristicsSequence' }, + '0018,9417' => { VR => 'SQ', Name => 'FrameAcquisitionSequence' }, + '0018,9420' => { VR => 'CS', Name => 'XRayReceptorType' }, + '0018,9423' => { VR => 'LO', Name => 'AcquisitionProtocolName' }, + '0018,9424' => { VR => 'LT', Name => 'AcquisitionProtocolDescription' }, + '0018,9425' => { VR => 'CS', Name => 'ContrastBolusIngredientOpaque' }, + '0018,9426' => { VR => 'FL', Name => 'DistanceReceptorPlaneToDetHousing' }, + '0018,9427' => { VR => 'CS', Name => 'IntensifierActiveShape' }, + '0018,9428' => { VR => 'FL', Name => 'IntensifierActiveDimensions' }, + '0018,9429' => { VR => 'FL', Name => 'PhysicalDetectorSize' }, + '0018,9430' => { VR => 'US', Name => 'PositionOfIsocenterProjection' }, + '0018,9432' => { VR => 'SQ', Name => 'FieldOfViewSequence' }, + '0018,9433' => { VR => 'LO', Name => 'FieldOfViewDescription' }, + '0018,9434' => { VR => 'SQ', Name => 'ExposureControlSensingRegionsSeq' }, + '0018,9435' => { VR => 'CS', Name => 'ExposureControlSensingRegionShape' }, + '0018,9436' => { VR => 'SS', Name => 'ExposureControlSensRegionLeftEdge' }, + '0018,9437' => { VR => 'SS', Name => 'ExposureControlSensRegionRightEdge' }, + '0018,9440' => { VR => 'SS', Name => 'CenterOfCircExposControlSensRegion' }, + '0018,9441' => { VR => 'US', Name => 'RadiusOfCircExposControlSensRegion' }, + '0018,9447' => { VR => 'FL', Name => 'ColumnAngulationPatient' }, + '0018,9449' => { VR => 'FL', Name => 'BeamAngle' }, + '0018,9451' => { VR => 'SQ', Name => 'FrameDetectorParametersSequence' }, + '0018,9452' => { VR => 'FL', Name => 'CalculatedAnatomyThickness' }, + '0018,9455' => { VR => 'SQ', Name => 'CalibrationSequence' }, + '0018,9456' => { VR => 'SQ', Name => 'ObjectThicknessSequence' }, + '0018,9457' => { VR => 'CS', Name => 'PlaneIdentification' }, + '0018,9461' => { VR => 'FL', Name => 'FieldOfViewDimensionsInFloat' }, + '0018,9462' => { VR => 'SQ', Name => 'IsocenterReferenceSystemSequence' }, + '0018,9463' => { VR => 'FL', Name => 'PositionerIsocenterPrimaryAngle' }, + '0018,9464' => { VR => 'FL', Name => 'PositionerIsocenterSecondaryAngle' }, + '0018,9465' => { VR => 'FL', Name => 'PositionerIsocenterDetRotAngle' }, + '0018,9466' => { VR => 'FL', Name => 'TableXPositionToIsocenter' }, + '0018,9467' => { VR => 'FL', Name => 'TableYPositionToIsocenter' }, + '0018,9468' => { VR => 'FL', Name => 'TableZPositionToIsocenter' }, + '0018,9469' => { VR => 'FL', Name => 'TableHorizontalRotationAngle' }, + '0018,9470' => { VR => 'FL', Name => 'TableHeadTiltAngle' }, + '0018,9471' => { VR => 'FL', Name => 'TableCradleTiltAngle' }, + '0018,9472' => { VR => 'SQ', Name => 'FrameDisplayShutterSequence' }, + '0018,9473' => { VR => 'FL', Name => 'AcquiredImageAreaDoseProduct' }, + '0018,9474' => { VR => 'CS', Name => 'CArmPositionerTabletopRelationship' }, + '0018,9476' => { VR => 'SQ', Name => 'XRayGeometrySequence' }, + '0018,9477' => { VR => 'SQ', Name => 'IrradiationEventIDSequence' }, + '0018,9504' => { VR => 'SQ', Name => 'XRay3DFrameTypeSequence' }, + '0018,9506' => { VR => 'SQ', Name => 'ContributingSourcesSequence' }, + '0018,9507' => { VR => 'SQ', Name => 'XRay3DAcquisitionSequence' }, + '0018,9508' => { VR => 'FL', Name => 'PrimaryPositionerScanArc' }, + '0018,9509' => { VR => 'FL', Name => 'SecondaryPositionerScanArc' }, + '0018,9510' => { VR => 'FL', Name => 'PrimaryPositionerScanStartAngle' }, + '0018,9511' => { VR => 'FL', Name => 'SecondaryPositionerScanStartAngle' }, + '0018,9514' => { VR => 'FL', Name => 'PrimaryPositionerIncrement' }, + '0018,9515' => { VR => 'FL', Name => 'SecondaryPositionerIncrement' }, + '0018,9516' => { VR => 'DT', Name => 'StartAcquisitionDateTime' }, + '0018,9517' => { VR => 'DT', Name => 'EndAcquisitionDateTime' }, + '0018,9524' => { VR => 'LO', Name => 'ApplicationName' }, + '0018,9525' => { VR => 'LO', Name => 'ApplicationVersion' }, + '0018,9526' => { VR => 'LO', Name => 'ApplicationManufacturer' }, + '0018,9527' => { VR => 'CS', Name => 'AlgorithmType' }, + '0018,9528' => { VR => 'LO', Name => 'AlgorithmDescription' }, + '0018,9530' => { VR => 'SQ', Name => 'XRay3DReconstructionSequence' }, + '0018,9531' => { VR => 'LO', Name => 'ReconstructionDescription' }, + '0018,9538' => { VR => 'SQ', Name => 'PerProjectionAcquisitionSequence' }, + '0018,9601' => { VR => 'SQ', Name => 'DiffusionBMatrixSequence' }, + '0018,9602' => { VR => 'FD', Name => 'DiffusionBValueXX' }, + '0018,9603' => { VR => 'FD', Name => 'DiffusionBValueXY' }, + '0018,9604' => { VR => 'FD', Name => 'DiffusionBValueXZ' }, + '0018,9605' => { VR => 'FD', Name => 'DiffusionBValueYY' }, + '0018,9606' => { VR => 'FD', Name => 'DiffusionBValueYZ' }, + '0018,9607' => { VR => 'FD', Name => 'DiffusionBValueZZ' }, + '0018,9701' => { VR => 'DT', Name => 'DecayCorrectionDateTime' }, + '0018,9715' => { VR => 'FD', Name => 'StartDensityThreshold' }, + '0018,9722' => { VR => 'FD', Name => 'TerminationTimeThreshold' }, + '0018,9725' => { VR => 'CS', Name => 'DetectorGeometry' }, + '0018,9727' => { VR => 'FD', Name => 'AxialDetectorDimension' }, + '0018,9735' => { VR => 'SQ', Name => 'PETPositionSequence' }, + '0018,9739' => { VR => 'US', Name => 'NumberOfIterations' }, + '0018,9740' => { VR => 'US', Name => 'NumberOfSubsets' }, + '0018,9751' => { VR => 'SQ', Name => 'PETFrameTypeSequence' }, + '0018,9756' => { VR => 'CS', Name => 'ReconstructionType' }, + '0018,9758' => { VR => 'CS', Name => 'DecayCorrected' }, + '0018,9759' => { VR => 'CS', Name => 'AttenuationCorrected' }, + '0018,9760' => { VR => 'CS', Name => 'ScatterCorrected' }, + '0018,9761' => { VR => 'CS', Name => 'DeadTimeCorrected' }, + '0018,9762' => { VR => 'CS', Name => 'GantryMotionCorrected' }, + '0018,9763' => { VR => 'CS', Name => 'PatientMotionCorrected' }, + '0018,9765' => { VR => 'CS', Name => 'RandomsCorrected' }, + '0018,9767' => { VR => 'CS', Name => 'SensitivityCalibrated' }, + '0018,9801' => { VR => 'FD', Name => 'DepthsOfFocus' }, + '0018,9804' => { VR => 'DT', Name => 'ExclusionStartDatetime' }, + '0018,9805' => { VR => 'FD', Name => 'ExclusionDuration' }, + '0018,9807' => { VR => 'SQ', Name => 'ImageDataTypeSequence' }, + '0018,9808' => { VR => 'CS', Name => 'DataType' }, + '0018,980B' => { VR => 'CS', Name => 'AliasedDataType' }, + '0018,A001' => { VR => 'SQ', Name => 'ContributingEquipmentSequence' }, + '0018,A002' => { VR => 'DT', Name => 'ContributionDateTime' }, + '0018,A003' => { VR => 'ST', Name => 'ContributionDescription' }, + # GEMS_ACQU_01 (ref 4) + '0019,1002' => { VR => 'SL', Name => 'NumberOfCellsIInDetector' }, + '0019,1003' => { VR => 'DS', Name => 'CellNumberAtTheta' }, + '0019,1004' => { VR => 'DS', Name => 'CellSpacing' }, + '0019,100F' => { VR => 'DS', Name => 'HorizFrameOfRef' }, + '0019,1011' => { VR => 'SS', Name => 'SeriesContrast' }, + '0019,1012' => { VR => 'SS', Name => 'LastPseq' }, + '0019,1013' => { VR => 'SS', Name => 'StartNumberForBaseline' }, + '0019,1014' => { VR => 'SS', Name => 'EndNumberForBaseline' }, + '0019,1015' => { VR => 'SS', Name => 'StartNumberForEnhancedScans' }, + '0019,1016' => { VR => 'SS', Name => 'EndNumberForEnhancedScans' }, + '0019,1017' => { VR => 'SS', Name => 'SeriesPlane' }, + '0019,1018' => { VR => 'LO', Name => 'FirstScanRas' }, + '0019,1019' => { VR => 'DS', Name => 'FirstScanLocation' }, + '0019,101A' => { VR => 'LO', Name => 'LastScanRas' }, + '0019,101B' => { VR => 'DS', Name => 'LastScanLoc' }, + '0019,101E' => { VR => 'DS', Name => 'DisplayFieldOfView' }, + '0019,1023' => { VR => 'DS', Name => 'TableSpeed' }, + '0019,1024' => { VR => 'DS', Name => 'MidScanTime' }, + '0019,1025' => { VR => 'SS', Name => 'MidScanFlag' }, + '0019,1026' => { VR => 'SL', Name => 'DegreesOfAzimuth' }, + '0019,1027' => { VR => 'DS', Name => 'GantryPeriod' }, + '0019,102A' => { VR => 'DS', Name => 'XRayOnPosition' }, + '0019,102B' => { VR => 'DS', Name => 'XRayOffPosition' }, + '0019,102C' => { VR => 'SL', Name => 'NumberOfTriggers' }, + '0019,102E' => { VR => 'DS', Name => 'AngleOfFirstView' }, + '0019,102F' => { VR => 'DS', Name => 'TriggerFrequency' }, + '0019,1039' => { VR => 'SS', Name => 'ScanFOVType' }, + '0019,1040' => { VR => 'SS', Name => 'StatReconFlag' }, + '0019,1041' => { VR => 'SS', Name => 'ComputeType' }, + '0019,1042' => { VR => 'SS', Name => 'SegmentNumber' }, + '0019,1043' => { VR => 'SS', Name => 'TotalSegmentsRequested' }, + '0019,1044' => { VR => 'DS', Name => 'InterscanDelay' }, + '0019,1047' => { VR => 'SS', Name => 'ViewCompressionFactor' }, + '0019,104A' => { VR => 'SS', Name => 'TotalNoOfRefChannels' }, + '0019,104B' => { VR => 'SL', Name => 'DataSizeForScanData' }, + '0019,1052' => { VR => 'SS', Name => 'ReconPostProcflag' }, + '0019,1057' => { VR => 'SS', Name => 'CTWaterNumber' }, + '0019,1058' => { VR => 'SS', Name => 'CTBoneNumber' }, + '0019,105A' => { VR => 'FL', Name => 'AcquisitionDuration' }, + '0019,105E' => { VR => 'SL', Name => 'NumberOfChannels' }, + '0019,105F' => { VR => 'SL', Name => 'IncrementBetweenChannels' }, + '0019,1060' => { VR => 'SL', Name => 'StartingView' }, + '0019,1061' => { VR => 'SL', Name => 'NumberOfViews' }, + '0019,1062' => { VR => 'SL', Name => 'IncrementBetweenViews' }, + '0019,106A' => { VR => 'SS', Name => 'DependantOnNoViewsProcessed' }, + '0019,106B' => { VR => 'SS', Name => 'FieldOfViewInDetectorCells' }, + '0019,1070' => { VR => 'SS', Name => 'ValueOfBackProjectionButton' }, + '0019,1071' => { VR => 'SS', Name => 'SetIfFatqEstimatesWereUsed' }, + '0019,1072' => { VR => 'DS', Name => 'ZChanAvgOverViews' }, + '0019,1073' => { VR => 'DS', Name => 'AvgOfLeftRefChansOverViews' }, + '0019,1074' => { VR => 'DS', Name => 'MaxLeftChanOverViews' }, + '0019,1075' => { VR => 'DS', Name => 'AvgOfRightRefChansOverViews' }, + '0019,1076' => { VR => 'DS', Name => 'MaxRightChanOverViews' }, + '0019,107D' => { VR => 'DS', Name => 'SecondEcho' }, + '0019,107E' => { VR => 'SS', Name => 'NumberOfEchoes' }, + '0019,107F' => { VR => 'DS', Name => 'TableDelta' }, + '0019,1081' => { VR => 'SS', Name => 'Contiguous' }, + '0019,1084' => { VR => 'DS', Name => 'PeakSAR' }, + '0019,1085' => { VR => 'SS', Name => 'MonitorSAR' }, + '0019,1087' => { VR => 'DS', Name => 'CardiacRepetitionTime' }, + '0019,1088' => { VR => 'SS', Name => 'ImagesPerCardiacCycle' }, + '0019,108A' => { VR => 'SS', Name => 'ActualReceiveGainAnalog' }, + '0019,108B' => { VR => 'SS', Name => 'ActualReceiveGainDigital' }, + '0019,108D' => { VR => 'DS', Name => 'DelayAfterTrigger' }, + '0019,108F' => { VR => 'SS', Name => 'Swappf' }, + '0019,1090' => { VR => 'SS', Name => 'PauseInterval' }, + '0019,1091' => { VR => 'DS', Name => 'PulseTime' }, + '0019,1092' => { VR => 'SL', Name => 'SliceOffsetOnFreqAxis' }, + '0019,1093' => { VR => 'DS', Name => 'CenterFrequency' }, + '0019,1094' => { VR => 'SS', Name => 'TransmitGain' }, + '0019,1095' => { VR => 'SS', Name => 'AnalogReceiverGain' }, + '0019,1096' => { VR => 'SS', Name => 'DigitalReceiverGain' }, + '0019,1097' => { VR => 'SL', Name => 'BitmapDefiningCVs' }, + '0019,1098' => { VR => 'SS', Name => 'CenterFreqMethod' }, + '0019,109B' => { VR => 'SS', Name => 'PulseSeqMode' }, + '0019,109C' => { VR => 'LO', Name => 'PulseSeqName' }, + '0019,109D' => { VR => 'DT', Name => 'PulseSeqDate' }, + '0019,109E' => { VR => 'LO', Name => 'InternalPulseSeqName' }, + '0019,109F' => { VR => 'SS', Name => 'TransmittingCoil' }, + '0019,10A0' => { VR => 'SS', Name => 'SurfaceCoilType' }, + '0019,10A1' => { VR => 'SS', Name => 'ExtremityCoilFlag' }, + '0019,10A2' => { VR => 'SL', Name => 'RawDataRunNumber' }, + '0019,10A3' => { VR => 'UL', Name => 'CalibratedFieldStrength' }, + '0019,10A4' => { VR => 'SS', Name => 'SATFatWaterBone' }, + '0019,10A5' => { VR => 'DS', Name => 'ReceiveBandwidth' }, + '0019,10A7' => { VR => 'DS', Name => 'UserData01' }, + '0019,10A8' => { VR => 'DS', Name => 'UserData02' }, + '0019,10A9' => { VR => 'DS', Name => 'UserData03' }, + '0019,10AA' => { VR => 'DS', Name => 'UserData04' }, + '0019,10AB' => { VR => 'DS', Name => 'UserData05' }, + '0019,10AC' => { VR => 'DS', Name => 'UserData06' }, + '0019,10AD' => { VR => 'DS', Name => 'UserData07' }, + '0019,10AE' => { VR => 'DS', Name => 'UserData08' }, + '0019,10AF' => { VR => 'DS', Name => 'UserData09' }, + '0019,10B0' => { VR => 'DS', Name => 'UserData10' }, + '0019,10B1' => { VR => 'DS', Name => 'UserData11' }, + '0019,10B2' => { VR => 'DS', Name => 'UserData12' }, + '0019,10B3' => { VR => 'DS', Name => 'UserData13' }, + '0019,10B4' => { VR => 'DS', Name => 'UserData14' }, + '0019,10B5' => { VR => 'DS', Name => 'UserData15' }, + '0019,10B6' => { VR => 'DS', Name => 'UserData16' }, + '0019,10B7' => { VR => 'DS', Name => 'UserData17' }, + '0019,10B8' => { VR => 'DS', Name => 'UserData18' }, + '0019,10B9' => { VR => 'DS', Name => 'UserData19' }, + '0019,10BA' => { VR => 'DS', Name => 'UserData20' }, + '0019,10BB' => { VR => 'DS', Name => 'UserData21' }, + '0019,10BC' => { VR => 'DS', Name => 'UserData22' }, + '0019,10BD' => { VR => 'DS', Name => 'UserData23' }, + '0019,10BE' => { VR => 'DS', Name => 'ProjectionAngle' }, + '0019,10C0' => { VR => 'SS', Name => 'SaturationPlanes' }, + '0019,10C1' => { VR => 'SS', Name => 'SurfaceCoilIntensity' }, + '0019,10C2' => { VR => 'SS', Name => 'SATLocationR' }, + '0019,10C3' => { VR => 'SS', Name => 'SATLocationL' }, + '0019,10C4' => { VR => 'SS', Name => 'SATLocationA' }, + '0019,10C5' => { VR => 'SS', Name => 'SATLocationP' }, + '0019,10C6' => { VR => 'SS', Name => 'SATLocationH' }, + '0019,10C7' => { VR => 'SS', Name => 'SATLocationF' }, + '0019,10C8' => { VR => 'SS', Name => 'SATThicknessR-L' }, + '0019,10C9' => { VR => 'SS', Name => 'SATThicknessA-P' }, + '0019,10CA' => { VR => 'SS', Name => 'SATThicknessH-F' }, + '0019,10CB' => { VR => 'SS', Name => 'PrescribedFlowAxis' }, + '0019,10CC' => { VR => 'SS', Name => 'VelocityEncoding' }, + '0019,10CD' => { VR => 'SS', Name => 'ThicknessDisclaimer' }, + '0019,10CE' => { VR => 'SS', Name => 'PrescanType' }, + '0019,10CF' => { VR => 'SS', Name => 'PrescanStatus' }, + '0019,10D0' => { VR => 'SH', Name => 'RawDataType' }, + '0019,10D2' => { VR => 'SS', Name => 'ProjectionAlgorithm' }, + '0019,10D3' => { VR => 'SH', Name => 'ProjectionAlgorithm' }, + '0019,10D5' => { VR => 'SS', Name => 'FractionalEcho' }, + '0019,10D6' => { VR => 'SS', Name => 'PrepPulse' }, + '0019,10D7' => { VR => 'SS', Name => 'CardiacPhases' }, + '0019,10D8' => { VR => 'SS', Name => 'VariableEchoflag' }, + '0019,10D9' => { VR => 'DS', Name => 'ConcatenatedSAT' }, + '0019,10DA' => { VR => 'SS', Name => 'ReferenceChannelUsed' }, + '0019,10DB' => { VR => 'DS', Name => 'BackProjectorCoefficient' }, + '0019,10DC' => { VR => 'SS', Name => 'PrimarySpeedCorrectionUsed' }, + '0019,10DD' => { VR => 'SS', Name => 'OverrangeCorrectionUsed' }, + '0019,10DE' => { VR => 'DS', Name => 'DynamicZAlphaValue' }, + '0019,10DF' => { VR => 'DS', Name => 'UserData' }, + '0019,10E0' => { VR => 'DS', Name => 'UserData' }, + '0019,10E2' => { VR => 'DS', Name => 'VelocityEncodeScale' }, + '0019,10F2' => { VR => 'SS', Name => 'FastPhases' }, + '0019,10F9' => { VR => 'DS', Name => 'TransmissionGain' }, + # relationship group + '0020,0000' => { VR => 'UL', Name => 'RelationshipGroupLength' }, + '0020,000D' => { VR => 'UI', Name => 'StudyInstanceUID' }, + '0020,000E' => { VR => 'UI', Name => 'SeriesInstanceUID' }, + '0020,0010' => { VR => 'SH', Name => 'StudyID' }, + '0020,0011' => { VR => 'IS', Name => 'SeriesNumber' }, + '0020,0012' => { VR => 'IS', Name => 'AcquisitionNumber' }, + '0020,0013' => { VR => 'IS', Name => 'InstanceNumber' }, + '0020,0014' => { VR => 'IS', Name => 'IsotopeNumber' }, + '0020,0015' => { VR => 'IS', Name => 'PhaseNumber' }, + '0020,0016' => { VR => 'IS', Name => 'IntervalNumber' }, + '0020,0017' => { VR => 'IS', Name => 'TimeSlotNumber' }, + '0020,0018' => { VR => 'IS', Name => 'AngleNumber' }, + '0020,0019' => { VR => 'IS', Name => 'ItemNumber' }, + '0020,0020' => { VR => 'CS', Name => 'PatientOrientation' }, + '0020,0022' => { VR => 'IS', Name => 'OverlayNumber' }, + '0020,0024' => { VR => 'IS', Name => 'CurveNumber' }, + '0020,0026' => { VR => 'IS', Name => 'LookupTableNumber' }, + '0020,0030' => { VR => 'DS', Name => 'ImagePosition' }, + '0020,0032' => { VR => 'DS', Name => 'ImagePositionPatient' }, + '0020,0035' => { VR => 'DS', Name => 'ImageOrientation' }, + '0020,0037' => { VR => 'DS', Name => 'ImageOrientationPatient' }, + '0020,0050' => { VR => 'DS', Name => 'Location' }, + '0020,0052' => { VR => 'UI', Name => 'FrameOfReferenceUID' }, + '0020,0060' => { VR => 'CS', Name => 'Laterality' }, + '0020,0062' => { VR => 'CS', Name => 'ImageLaterality' }, + '0020,0070' => { VR => 'LO', Name => 'ImageGeometryType' }, + '0020,0080' => { VR => 'CS', Name => 'MaskingImage' }, + '0020,0100' => { VR => 'IS', Name => 'TemporalPositionIdentifier' }, + '0020,0105' => { VR => 'IS', Name => 'NumberOfTemporalPositions' }, + '0020,0110' => { VR => 'DS', Name => 'TemporalResolution' }, + '0020,0200' => { VR => 'UI', Name => 'SynchronizationFrameOfReferenceUID' }, + '0020,1000' => { VR => 'IS', Name => 'SeriesInStudy' }, + '0020,1001' => { VR => 'IS', Name => 'AcquisitionsInSeries' }, + '0020,1002' => { VR => 'IS', Name => 'ImagesInAcquisition' }, + '0020,1003' => { VR => 'IS', Name => 'ImagesInSeries' }, + '0020,1004' => { VR => 'IS', Name => 'AcquisitionsInStudy' }, + '0020,1005' => { VR => 'IS', Name => 'ImagesInStudy' }, + '0020,1020' => { VR => 'CS', Name => 'Reference' }, + '0020,1040' => { VR => 'LO', Name => 'PositionReferenceIndicator' }, + '0020,1041' => { VR => 'DS', Name => 'SliceLocation' }, + '0020,1070' => { VR => 'IS', Name => 'OtherStudyNumbers' }, + '0020,1200' => { VR => 'IS', Name => 'NumberOfPatientRelatedStudies' }, + '0020,1202' => { VR => 'IS', Name => 'NumberOfPatientRelatedSeries' }, + '0020,1204' => { VR => 'IS', Name => 'NumberOfPatientRelatedInstances' }, + '0020,1206' => { VR => 'IS', Name => 'NumberOfStudyRelatedSeries' }, + '0020,1208' => { VR => 'IS', Name => 'NumberOfStudyRelatedInstances' }, + '0020,1209' => { VR => 'IS', Name => 'NumberOfSeriesRelatedInstances' }, + '0020,31xx' => { VR => 'CS', Name => 'SourceImageIDs' }, + '0020,3401' => { VR => 'CS', Name => 'ModifyingDeviceID' }, + '0020,3402' => { VR => 'CS', Name => 'ModifiedImageID' }, + '0020,3403' => { VR => 'DA', Name => 'ModifiedImageDate' }, + '0020,3404' => { VR => 'LO', Name => 'ModifyingDeviceManufacturer' }, + '0020,3405' => { VR => 'TM', Name => 'ModifiedImageTime' }, + '0020,3406' => { VR => 'LO', Name => 'ModifiedImageDescription' }, + '0020,4000' => { VR => 'LT', Name => 'ImageComments' }, + '0020,5000' => { VR => 'AT', Name => 'OriginalImageIdentification' }, + '0020,5002' => { VR => 'CS', Name => 'OriginalImageIdentNomenclature' }, + '0020,9056' => { VR => 'SH', Name => 'StackID' }, + '0020,9057' => { VR => 'UL', Name => 'InStackPositionNumber' }, + '0020,9071' => { VR => 'SQ', Name => 'FrameAnatomySequence' }, + '0020,9072' => { VR => 'CS', Name => 'FrameLaterality' }, + '0020,9111' => { VR => 'SQ', Name => 'FrameContentSequence' }, + '0020,9113' => { VR => 'SQ', Name => 'PlanePositionSequence' }, + '0020,9116' => { VR => 'SQ', Name => 'PlaneOrientationSequence' }, + '0020,9128' => { VR => 'UL', Name => 'TemporalPositionIndex' }, + '0020,9153' => { VR => 'FD', Name => 'TriggerDelayTime' }, + '0020,9156' => { VR => 'US', Name => 'FrameAcquisitionNumber' }, + '0020,9157' => { VR => 'UL', Name => 'DimensionIndexValues' }, + '0020,9158' => { VR => 'LT', Name => 'FrameComments' }, + '0020,9161' => { VR => 'UI', Name => 'ConcatenationUID' }, + '0020,9162' => { VR => 'US', Name => 'InConcatenationNumber' }, + '0020,9163' => { VR => 'US', Name => 'InConcatenationTotalNumber' }, + '0020,9164' => { VR => 'UI', Name => 'DimensionOrganizationUID' }, + '0020,9165' => { VR => 'AT', Name => 'DimensionIndexPointer' }, + '0020,9167' => { VR => 'AT', Name => 'FunctionalGroupPointer' }, + '0020,9213' => { VR => 'LO', Name => 'DimensionIndexPrivateCreator' }, + '0020,9221' => { VR => 'SQ', Name => 'DimensionOrganizationSequence' }, + '0020,9222' => { VR => 'SQ', Name => 'DimensionIndexSequence' }, + '0020,9228' => { VR => 'UL', Name => 'ConcatenationFrameOffsetNumber' }, + '0020,9238' => { VR => 'LO', Name => 'FunctionalGroupPrivateCreator' }, + '0020,9241' => { VR => 'FL', Name => 'NominalPercentageOfCardiacPhase' }, + '0020,9245' => { VR => 'FL', Name => 'NominalPercentOfRespiratoryPhase' }, + '0020,9246' => { VR => 'FL', Name => 'StartingRespiratoryAmplitude' }, + '0020,9247' => { VR => 'CS', Name => 'StartingRespiratoryPhase' }, + '0020,9248' => { VR => 'FL', Name => 'EndingRespiratoryAmplitude' }, + '0020,9249' => { VR => 'CS', Name => 'EndingRespiratoryPhase' }, + '0020,9250' => { VR => 'CS', Name => 'RespiratoryTriggerType' }, + '0020,9251' => { VR => 'FD', Name => 'RRIntervalTimeNominal' }, + '0020,9252' => { VR => 'FD', Name => 'ActualCardiacTriggerDelayTime' }, + '0020,9253' => { VR => 'SQ', Name => 'RespiratorySynchronizationSequence' }, + '0020,9254' => { VR => 'FD', Name => 'RespiratoryIntervalTime' }, + '0020,9255' => { VR => 'FD', Name => 'NominalRespiratoryTriggerDelayTime' }, + '0020,9256' => { VR => 'FD', Name => 'RespiratoryTriggerDelayThreshold' }, + '0020,9257' => { VR => 'FD', Name => 'ActualRespiratoryTriggerDelayTime' }, + '0020,9301' => { VR => 'FD', Name => 'ImagePositionVolume' }, + '0020,9302' => { VR => 'FD', Name => 'ImageOrientationVolume' }, + '0020,9308' => { VR => 'FD', Name => 'ApexPosition' }, + '0020,9421' => { VR => 'LO', Name => 'DimensionDescriptionLabel' }, + '0020,9450' => { VR => 'SQ', Name => 'PatientOrientationInFrameSequence' }, + '0020,9453' => { VR => 'LO', Name => 'FrameLabel' }, + '0020,9518' => { VR => 'US', Name => 'AcquisitionIndex' }, + '0020,9529' => { VR => 'SQ', Name => 'ContributingSOPInstancesRefSeq' }, + '0020,9536' => { VR => 'US', Name => 'ReconstructionIndex' }, + # GEMS_RELA_01 (ref 4) + '0021,1003' => { VR => 'SS', Name => 'SeriesFromWhichPrescribed' }, + '0021,1005' => { VR => 'SH', Name => 'GenesisVersionNow' }, + '0021,1005' => { VR => 'SH', Name => 'GenesisVersionNow' }, + '0021,1007' => { VR => 'UL', Name => 'SeriesRecordChecksum' }, + '0021,1018' => { VR => 'SH', Name => 'GenesisVersionNow' }, + '0021,1018' => { VR => 'SH', Name => 'GenesisVersionNow' }, + '0021,1019' => { VR => 'UL', Name => 'AcqReconRecordChecksum' }, + '0021,1019' => { VR => 'UL', Name => 'AcqreconRecordChecksum' }, + '0021,1020' => { VR => 'DS', Name => 'TableStartLocation' }, + '0021,1035' => { VR => 'SS', Name => 'SeriesFromWhichPrescribed' }, + '0021,1036' => { VR => 'SS', Name => 'ImageFromWhichPrescribed' }, + '0021,1037' => { VR => 'SS', Name => 'ScreenFormat' }, + '0021,104A' => { VR => 'LO', Name => 'AnatomicalReferenceForScout' }, + '0021,104F' => { VR => 'SS', Name => 'LocationsInAcquisition' }, + '0021,1050' => { VR => 'SS', Name => 'GraphicallyPrescribed' }, + '0021,1051' => { VR => 'DS', Name => 'RotationFromSourceXRot' }, + '0021,1052' => { VR => 'DS', Name => 'RotationFromSourceYRot' }, + '0021,1053' => { VR => 'DS', Name => 'RotationFromSourceZRot' }, + '0021,1054' => { VR => 'SH', Name => 'ImagePosition' }, + '0021,1055' => { VR => 'SH', Name => 'ImageOrientation' }, + '0021,1056' => { VR => 'SL', Name => 'IntegerSlop' }, + '0021,1057' => { VR => 'SL', Name => 'IntegerSlop' }, + '0021,1058' => { VR => 'SL', Name => 'IntegerSlop' }, + '0021,1059' => { VR => 'SL', Name => 'IntegerSlop' }, + '0021,105A' => { VR => 'SL', Name => 'IntegerSlop' }, + '0021,105B' => { VR => 'DS', Name => 'FloatSlop' }, + '0021,105C' => { VR => 'DS', Name => 'FloatSlop' }, + '0021,105D' => { VR => 'DS', Name => 'FloatSlop' }, + '0021,105E' => { VR => 'DS', Name => 'FloatSlop' }, + '0021,105F' => { VR => 'DS', Name => 'FloatSlop' }, + '0021,1081' => { VR => 'DS', Name => 'AutoWindowLevelAlpha' }, + '0021,1082' => { VR => 'DS', Name => 'AutoWindowLevelBeta' }, + '0021,1083' => { VR => 'DS', Name => 'AutoWindowLevelWindow' }, + '0021,1084' => { VR => 'DS', Name => 'ToWindowLevelLevel' }, + '0021,1090' => { VR => 'SS', Name => 'TubeFocalSpotPosition' }, + '0021,1091' => { VR => 'SS', Name => 'BiopsyPosition' }, + '0021,1092' => { VR => 'FL', Name => 'BiopsyTLocation' }, + '0021,1093' => { VR => 'FL', Name => 'BiopsyRefLocation' }, + # ? + '0022,0001' => { VR => 'US', Name => 'LightPathFilterPassThroughWavelen' }, + '0022,0002' => { VR => 'US', Name => 'LightPathFilterPassBand' }, + '0022,0003' => { VR => 'US', Name => 'ImagePathFilterPassThroughWavelen' }, + '0022,0004' => { VR => 'US', Name => 'ImagePathFilterPassBand' }, + '0022,0005' => { VR => 'CS', Name => 'PatientEyeMovementCommanded' }, + '0022,0006' => { VR => 'SQ', Name => 'PatientEyeMovementCommandCodeSeq' }, + '0022,0007' => { VR => 'FL', Name => 'SphericalLensPower' }, + '0022,0008' => { VR => 'FL', Name => 'CylinderLensPower' }, + '0022,0009' => { VR => 'FL', Name => 'CylinderAxis' }, + '0022,000A' => { VR => 'FL', Name => 'EmmetropicMagnification' }, + '0022,000B' => { VR => 'FL', Name => 'IntraOcularPressure' }, + '0022,000C' => { VR => 'FL', Name => 'HorizontalFieldOfView' }, + '0022,000D' => { VR => 'CS', Name => 'PupilDilated' }, + '0022,000E' => { VR => 'FL', Name => 'DegreeOfDilation' }, + '0022,0010' => { VR => 'FL', Name => 'StereoBaselineAngle' }, + '0022,0011' => { VR => 'FL', Name => 'StereoBaselineDisplacement' }, + '0022,0012' => { VR => 'FL', Name => 'StereoHorizontalPixelOffset' }, + '0022,0013' => { VR => 'FL', Name => 'StereoVerticalPixelOffset' }, + '0022,0014' => { VR => 'FL', Name => 'StereoRotation' }, + '0022,0015' => { VR => 'SQ', Name => 'AcquisitionDeviceTypeCodeSequence' }, + '0022,0016' => { VR => 'SQ', Name => 'IlluminationTypeCodeSequence' }, + '0022,0017' => { VR => 'SQ', Name => 'LightPathFilterTypeStackCodeSeq' }, + '0022,0018' => { VR => 'SQ', Name => 'ImagePathFilterTypeStackCodeSeq' }, + '0022,0019' => { VR => 'SQ', Name => 'LensesCodeSequence' }, + '0022,001A' => { VR => 'SQ', Name => 'ChannelDescriptionCodeSequence' }, + '0022,001B' => { VR => 'SQ', Name => 'RefractiveStateSequence' }, + '0022,001C' => { VR => 'SQ', Name => 'MydriaticAgentCodeSequence' }, + '0022,001D' => { VR => 'SQ', Name => 'RelativeImagePositionCodeSequence' }, + '0022,0020' => { VR => 'SQ', Name => 'StereoPairsSequence' }, + '0022,0021' => { VR => 'SQ', Name => 'LeftImageSequence' }, + '0022,0022' => { VR => 'SQ', Name => 'RightImageSequence' }, + '0022,0030' => { VR => 'FL', Name => 'AxialLengthOfTheEye' }, + '0022,0031' => { VR => 'SQ', Name => 'OphthalmicFrameLocationSequence' }, + '0022,0032' => { VR => 'FL', Name => 'ReferenceCoordinates' }, + '0022,0035' => { VR => 'FL', Name => 'DepthSpatialResolution' }, + '0022,0036' => { VR => 'FL', Name => 'MaximumDepthDistortion' }, + '0022,0037' => { VR => 'FL', Name => 'AlongScanSpatialResolution' }, + '0022,0038' => { VR => 'FL', Name => 'MaximumAlongScanDistortion' }, + '0022,0039' => { VR => 'CS', Name => 'OphthalmicImageOrientation' }, + '0022,0041' => { VR => 'FL', Name => 'DepthOfTransverseImage' }, + '0022,0042' => { VR => 'SQ', Name => 'MydriaticAgentConcUnitsSeq' }, + '0022,0048' => { VR => 'FL', Name => 'AcrossScanSpatialResolution' }, + '0022,0049' => { VR => 'FL', Name => 'MaximumAcrossScanDistortion' }, + '0022,004E' => { VR => 'DS', Name => 'MydriaticAgentConcentration' }, + '0022,0055' => { VR => 'FL', Name => 'IlluminationWaveLength' }, + '0022,0056' => { VR => 'FL', Name => 'IlluminationPower' }, + '0022,0057' => { VR => 'FL', Name => 'IlluminationBandwidth' }, + '0022,0058' => { VR => 'SQ', Name => 'MydriaticAgentSequence' }, + # GEMS_STDY_01 (ref 4) + '0023,1001' => { VR => 'SL', Name => 'NumberOfSeriesInStudy' }, + '0023,1002' => { VR => 'SL', Name => 'NumberOfUnarchivedSeries' }, + '0023,1010' => { VR => 'SS', Name => 'ReferenceImageField' }, + '0023,1050' => { VR => 'SS', Name => 'SummaryImage' }, + '0023,1070' => { VR => 'FD', Name => 'StartTimeSecsInFirstAxial' }, + '0023,1074' => { VR => 'SL', Name => 'NoofUpdatesToHeader' }, + '0023,107D' => { VR => 'SS', Name => 'IndicatesIfStudyHasCompleteInfo' }, + '0023,107D' => { VR => 'SS', Name => 'IndicatesIfTheStudyHasCompleteInfo' }, + # GEMS_SERS_01 (ref 4) + '0025,1006' => { VR => 'SS', Name => 'LastPulseSequenceUsed' }, + '0025,1007' => { VR => 'SL', Name => 'ImagesInSeries' }, + '0025,1010' => { VR => 'SL', Name => 'LandmarkCounter' }, + '0025,1011' => { VR => 'SS', Name => 'NumberOfAcquisitions' }, + '0025,1014' => { VR => 'SL', Name => 'IndicatesNoofUpdatesToHeader' }, + '0025,1017' => { VR => 'SL', Name => 'SeriesCompleteFlag' }, + '0025,1018' => { VR => 'SL', Name => 'NumberOfImagesArchived' }, + '0025,1019' => { VR => 'SL', Name => 'LastImageNumberUsed' }, + '0025,101A' => { VR => 'SH', Name => 'PrimaryReceiverSuiteAndHost' }, + # GEMS_IMAG_01 (ref 4) + '0027,1006' => { VR => 'SL', Name => 'ImageArchiveFlag' }, + '0027,1010' => { VR => 'SS', Name => 'ScoutType' }, + '0027,101C' => { VR => 'SL', Name => 'VmaMamp' }, + '0027,101D' => { VR => 'SS', Name => 'VmaPhase' }, + '0027,101E' => { VR => 'SL', Name => 'VmaMod' }, + '0027,101F' => { VR => 'SL', Name => 'VmaClip' }, + '0027,1020' => { VR => 'SS', Name => 'SmartScanOnOffFlag' }, + '0027,1030' => { VR => 'SH', Name => 'ForeignImageRevision' }, + '0027,1031' => { VR => 'SS', Name => 'ImagingMode' }, + '0027,1032' => { VR => 'SS', Name => 'PulseSequence' }, + '0027,1033' => { VR => 'SL', Name => 'ImagingOptions' }, + '0027,1035' => { VR => 'SS', Name => 'PlaneType' }, + '0027,1036' => { VR => 'SL', Name => 'ObliquePlane' }, + '0027,1040' => { VR => 'SH', Name => 'RASLetterOfImageLocation' }, + '0027,1041' => { VR => 'FL', Name => 'ImageLocation' }, + '0027,1042' => { VR => 'FL', Name => 'CenterRCoordOfPlaneImage' }, + '0027,1043' => { VR => 'FL', Name => 'CenterACoordOfPlaneImage' }, + '0027,1044' => { VR => 'FL', Name => 'CenterSCoordOfPlaneImage' }, + '0027,1045' => { VR => 'FL', Name => 'NormalRCoord' }, + '0027,1046' => { VR => 'FL', Name => 'NormalACoord' }, + '0027,1047' => { VR => 'FL', Name => 'NormalSCoord' }, + '0027,1048' => { VR => 'FL', Name => 'RCoordOfTopRightCorner' }, + '0027,1049' => { VR => 'FL', Name => 'ACoordOfTopRightCorner' }, + '0027,104A' => { VR => 'FL', Name => 'SCoordOfTopRightCorner' }, + '0027,104B' => { VR => 'FL', Name => 'RCoordOfBottomRightCorner' }, + '0027,104C' => { VR => 'FL', Name => 'ACoordOfBottomRightCorner' }, + '0027,104D' => { VR => 'FL', Name => 'SCoordOfBottomRightCorner' }, + '0027,1050' => { VR => 'FL', Name => 'TableStartLocation' }, + '0027,1051' => { VR => 'FL', Name => 'TableEndLocation' }, + '0027,1052' => { VR => 'SH', Name => 'RASLetterForSideOfImage' }, + '0027,1053' => { VR => 'SH', Name => 'RASLetterForAnteriorPosterior' }, + '0027,1054' => { VR => 'SH', Name => 'RASLetterForScoutStartLoc' }, + '0027,1055' => { VR => 'SH', Name => 'RASLetterForScoutEndLoc' }, + '0027,1060' => { VR => 'FL', Name => 'ImageDimensionX' }, + '0027,1061' => { VR => 'FL', Name => 'ImageDimensionY' }, + '0027,1062' => { VR => 'FL', Name => 'NumberOfExcitations' }, + # image presentation group + '0028,0000' => { VR => 'UL', Name => 'ImagePresentationGroupLength' }, + '0028,0002' => { VR => 'US', Name => 'SamplesPerPixel' }, + '0028,0003' => { VR => 'US', Name => 'SamplesPerPixelUsed' }, + '0028,0004' => { VR => 'CS', Name => 'PhotometricInterpretation' }, + '0028,0005' => { VR => 'US', Name => 'ImageDimensions' }, + '0028,0006' => { VR => 'US', Name => 'PlanarConfiguration' }, + '0028,0008' => { VR => 'IS', Name => 'NumberOfFrames' }, + '0028,0009' => { VR => 'AT', Name => 'FrameIncrementPointer' }, + '0028,000A' => { VR => 'AT', Name => 'FrameDimensionPointer' }, + '0028,0010' => { VR => 'US', Name => 'Rows' }, + '0028,0011' => { VR => 'US', Name => 'Columns' }, + '0028,0012' => { VR => 'US', Name => 'Planes' }, + '0028,0014' => { VR => 'US', Name => 'UltrasoundColorDataPresent' }, + '0028,0030' => { VR => 'DS', Name => 'PixelSpacing' }, + '0028,0031' => { VR => 'DS', Name => 'ZoomFactor' }, + '0028,0032' => { VR => 'DS', Name => 'ZoomCenter' }, + '0028,0034' => { VR => 'IS', Name => 'PixelAspectRatio' }, + '0028,0040' => { VR => 'CS', Name => 'ImageFormat' }, + '0028,0050' => { VR => 'LO', Name => 'ManipulatedImage' }, + '0028,0051' => { VR => 'CS', Name => 'CorrectedImage' }, + '0028,005F' => { VR => 'LO', Name => 'CompressionRecognitionCode' }, + '0028,0060' => { VR => 'CS', Name => 'CompressionCode' }, + '0028,0061' => { VR => 'SH', Name => 'CompressionOriginator' }, + '0028,0062' => { VR => 'LO', Name => 'CompressionLabel' }, + '0028,0063' => { VR => 'SH', Name => 'CompressionDescription' }, + '0028,0065' => { VR => 'CS', Name => 'CompressionSequence' }, + '0028,0066' => { VR => 'AT', Name => 'CompressionStepPointers' }, + '0028,0068' => { VR => 'US', Name => 'RepeatInterval' }, + '0028,0069' => { VR => 'US', Name => 'BitsGrouped' }, + '0028,0070' => { VR => 'US', Name => 'PerimeterTable' }, + '0028,0071' => { VR => 'US', Name => 'PerimeterValue' }, + '0028,0080' => { VR => 'US', Name => 'PredictorRows' }, + '0028,0081' => { VR => 'US', Name => 'PredictorColumns' }, + '0028,0082' => { VR => 'US', Name => 'PredictorConstants' }, + '0028,0090' => { VR => 'CS', Name => 'BlockedPixels' }, + '0028,0091' => { VR => 'US', Name => 'BlockRows' }, + '0028,0092' => { VR => 'US', Name => 'BlockColumns' }, + '0028,0093' => { VR => 'US', Name => 'RowOverlap' }, + '0028,0094' => { VR => 'US', Name => 'ColumnOverlap' }, + '0028,0100' => { VR => 'US', Name => 'BitsAllocated' }, + '0028,0101' => { VR => 'US', Name => 'BitsStored' }, + '0028,0102' => { VR => 'US', Name => 'HighBit' }, + '0028,0103' => { VR => 'US', Name => 'PixelRepresentation', PrintConv => { 0 => 'Unsigned', 1 => 'Signed' } }, + '0028,0104' => { VR => 'US', Name => 'SmallestValidPixelValue' }, + '0028,0105' => { VR => 'US', Name => 'LargestValidPixelValue' }, + '0028,0106' => { VR => 'US', Name => 'SmallestImagePixelValue' }, + '0028,0107' => { VR => 'US', Name => 'LargestImagePixelValue' }, + '0028,0108' => { VR => 'US', Name => 'SmallestPixelValueInSeries' }, + '0028,0109' => { VR => 'US', Name => 'LargestPixelValueInSeries' }, + '0028,0110' => { VR => 'US', Name => 'SmallestImagePixelValueInPlane' }, + '0028,0111' => { VR => 'US', Name => 'LargestImagePixelValueInPlane' }, + '0028,0120' => { VR => 'US', Name => 'PixelPaddingValue' }, + '0028,0121' => { VR => 'US', Name => 'PixelPaddingRangeLimit' }, + '0028,0200' => { VR => 'US', Name => 'ImageLocation' }, + '0028,0300' => { VR => 'CS', Name => 'QualityControlImage' }, + '0028,0301' => { VR => 'CS', Name => 'BurnedInAnnotation' }, + '0028,0400' => { VR => 'LO', Name => 'TransformLabel' }, + '0028,0401' => { VR => 'LO', Name => 'TransformVersionNumber' }, + '0028,0402' => { VR => 'US', Name => 'NumberOfTransformSteps' }, + '0028,0403' => { VR => 'LO', Name => 'SequenceOfCompressedData' }, + '0028,0404' => { VR => 'AT', Name => 'DetailsOfCoefficients' }, + '0028,04x2' => { VR => 'LO', Name => 'CoefficientCoding' }, + '0028,04x3' => { VR => 'AT', Name => 'CoefficientCodingPointers' }, + '0028,0700' => { VR => 'LO', Name => 'DCTLabel' }, + '0028,0701' => { VR => 'CS', Name => 'DataBlockDescription' }, + '0028,0702' => { VR => 'AT', Name => 'DataBlock' }, + '0028,0710' => { VR => 'US', Name => 'NormalizationFactorFormat' }, + '0028,0720' => { VR => 'US', Name => 'ZonalMapNumberFormat' }, + '0028,0721' => { VR => 'AT', Name => 'ZonalMapLocation' }, + '0028,0722' => { VR => 'US', Name => 'ZonalMapFormat' }, + '0028,0730' => { VR => 'US', Name => 'AdaptiveMapFormat' }, + '0028,0740' => { VR => 'US', Name => 'CodeNumberFormat' }, + '0028,08x0' => { VR => 'CS', Name => 'CodeLabel' }, + '0028,08x2' => { VR => 'US', Name => 'NumberOfTables' }, + '0028,08x3' => { VR => 'AT', Name => 'CodeTableLocation' }, + '0028,08x4' => { VR => 'US', Name => 'BitsForCodeWord' }, + '0028,08x8' => { VR => 'AT', Name => 'ImageDataLocation' }, + '0028,1040' => { VR => 'CS', Name => 'PixelIntensityRelationship' }, + '0028,0A02' => { VR => 'CS', Name => 'PixelSpacingCalibrationType' }, + '0028,0A04' => { VR => 'LO', Name => 'PixelSpacingCalibrationDescription' }, + '0028,1040' => { VR => 'CS', Name => 'PixelIntensityRelationship' }, + '0028,1041' => { VR => 'SS', Name => 'PixelIntensityRelationshipSign' }, + '0028,1050' => { VR => 'DS', Name => 'WindowCenter' }, + '0028,1051' => { VR => 'DS', Name => 'WindowWidth' }, + '0028,1052' => { VR => 'DS', Name => 'RescaleIntercept' }, + '0028,1053' => { VR => 'DS', Name => 'RescaleSlope' }, + '0028,1054' => { VR => 'LO', Name => 'RescaleType' }, + '0028,1055' => { VR => 'LO', Name => 'WindowCenterAndWidthExplanation' }, + '0028,1056' => { VR => 'CS', Name => 'VOI_LUTFunction' }, + '0028,1080' => { VR => 'CS', Name => 'GrayScale' }, + '0028,1090' => { VR => 'CS', Name => 'RecommendedViewingMode' }, + '0028,1100' => { VR => 'SS', Name => 'GrayLookupTableDescriptor' }, + '0028,1101' => { VR => 'SS', Name => 'RedPaletteColorTableDescriptor' }, + '0028,1102' => { VR => 'SS', Name => 'GreenPaletteColorTableDescriptor' }, + '0028,1103' => { VR => 'SS', Name => 'BluePaletteColorTableDescriptor' }, + '0028,1111' => { VR => 'SS', Name => 'LargeRedPaletteColorTableDescr' }, + '0028,1112' => { VR => 'SS', Name => 'LargeGreenPaletteColorTableDescr' }, + '0028,1113' => { VR => 'SS', Name => 'LargeBluePaletteColorTableDescr' }, + '0028,1199' => { VR => 'UI', Name => 'PaletteColorTableUID' }, + '0028,1200' => { VR => 'US', Name => 'GrayLookupTableData' }, + '0028,1201' => { VR => 'OW', Name => 'RedPaletteColorTableData' }, + '0028,1202' => { VR => 'OW', Name => 'GreenPaletteColorTableData' }, + '0028,1203' => { VR => 'OW', Name => 'BluePaletteColorTableData' }, + '0028,1211' => { VR => 'OW', Name => 'LargeRedPaletteColorTableData', Binary => 1 }, + '0028,1212' => { VR => 'OW', Name => 'LargeGreenPaletteColorTableData', Binary => 1 }, + '0028,1213' => { VR => 'OW', Name => 'LargeBluePaletteColorTableData', Binary => 1 }, + '0028,1214' => { VR => 'UI', Name => 'LargePaletteColorLookupTableUID' }, + '0028,1221' => { VR => 'OW', Name => 'SegmentedRedColorTableData' }, + '0028,1222' => { VR => 'OW', Name => 'SegmentedGreenColorTableData' }, + '0028,1223' => { VR => 'OW', Name => 'SegmentedBlueColorTableData' }, + '0028,1300' => { VR => 'CS', Name => 'BreastImplantPresent' }, + '0028,1350' => { VR => 'CS', Name => 'PartialView' }, + '0028,1351' => { VR => 'ST', Name => 'PartialViewDescription' }, + '0028,1352' => { VR => 'SQ', Name => 'PartialViewCodeSequence' }, + '0028,135A' => { VR => 'CS', Name => 'SpatialLocationsPreserved' }, + '0028,1402' => { VR => 'CS', Name => 'DataPathAssignment' }, + '0028,1404' => { VR => 'SQ', Name => 'BlendingLUT1Sequence' }, + '0028,1406' => { VR => 'FD', Name => 'BlendingWeightConstant' }, + '0028,1408' => { VR => 'OW', Name => 'BlendingLookupTableData' }, + '0028,140C' => { VR => 'SQ', Name => 'BlendingLUT2Sequence' }, + '0028,140E' => { VR => 'CS', Name => 'DataPathID' }, + '0028,140F' => { VR => 'CS', Name => 'RGBLUTTransferFunction' }, + '0028,1410' => { VR => 'CS', Name => 'AlphaLUTTransferFunction' }, + '0028,2000' => { VR => 'OB', Name => 'ICCProfile' }, + '0028,2110' => { VR => 'CS', Name => 'LossyImageCompression' }, + '0028,2112' => { VR => 'DS', Name => 'LossyImageCompressionRatio' }, + '0028,2114' => { VR => 'CS', Name => 'LossyImageCompressionMethod' }, + '0028,3000' => { VR => 'SQ', Name => 'ModalityLUTSequence' }, + '0028,3002' => { VR => 'US', Name => 'LUTDescriptor' }, + '0028,3003' => { VR => 'LO', Name => 'LUTExplanation' }, + '0028,3004' => { VR => 'LO', Name => 'ModalityLUTType' }, + '0028,3006' => { VR => 'SS', Name => 'LUTData' }, + '0028,3010' => { VR => 'SQ', Name => 'VOILUTSequence' }, + '0028,3110' => { VR => 'SQ', Name => 'SoftcopyVOILUTSequence' }, + '0028,4000' => { VR => 'LT', Name => 'ImagePresentationComments' }, + '0028,5000' => { VR => 'SQ', Name => 'BiPlaneAcquisitionSequence' }, + '0028,6010' => { VR => 'US', Name => 'RepresentativeFrameNumber' }, + '0028,6020' => { VR => 'US', Name => 'FrameNumbersOfInterest' }, + '0028,6022' => { VR => 'LO', Name => 'FrameOfInterestDescription' }, + '0028,6023' => { VR => 'CS', Name => 'FrameOfInterestType' }, + '0028,6030' => { VR => 'US', Name => 'MaskPointers' }, + '0028,6040' => { VR => 'US', Name => 'RWavePointer' }, + '0028,6100' => { VR => 'SQ', Name => 'MaskSubtractionSequence' }, + '0028,6101' => { VR => 'CS', Name => 'MaskOperation' }, + '0028,6102' => { VR => 'US', Name => 'ApplicableFrameRange' }, + '0028,6110' => { VR => 'US', Name => 'MaskFrameNumbers' }, + '0028,6112' => { VR => 'US', Name => 'ContrastFrameAveraging' }, + '0028,6114' => { VR => 'FL', Name => 'MaskSubPixelShift' }, + '0028,6120' => { VR => 'SS', Name => 'TIDOffset' }, + '0028,6190' => { VR => 'ST', Name => 'MaskOperationExplanation' }, + '0028,7FE0' => { VR => 'UT', Name => 'PixelDataProviderURL' }, + '0028,9001' => { VR => 'UL', Name => 'DataPointRows' }, + '0028,9002' => { VR => 'UL', Name => 'DataPointColumns' }, + '0028,9003' => { VR => 'CS', Name => 'SignalDomainColumns' }, + '0028,9099' => { VR => 'US', Name => 'LargestMonochromePixelValue' }, + '0028,9108' => { VR => 'CS', Name => 'DataRepresentation' }, + '0028,9110' => { VR => 'SQ', Name => 'PixelMeasuresSequence' }, + '0028,9132' => { VR => 'SQ', Name => 'FrameVOILUTSequence' }, + '0028,9145' => { VR => 'SQ', Name => 'PixelValueTransformationSequence' }, + '0028,9235' => { VR => 'CS', Name => 'SignalDomainRows' }, + '0028,9411' => { VR => 'FL', Name => 'DisplayFilterPercentage' }, + '0028,9415' => { VR => 'SQ', Name => 'FramePixelShiftSequence' }, + '0028,9416' => { VR => 'US', Name => 'SubtractionItemID' }, + '0028,9422' => { VR => 'SQ', Name => 'PixelIntensityRelationshipLUTSeq' }, + '0028,9443' => { VR => 'SQ', Name => 'FramePixelDataPropertiesSequence' }, + '0028,9444' => { VR => 'CS', Name => 'GeometricalProperties' }, + '0028,9445' => { VR => 'FL', Name => 'GeometricMaximumDistortion' }, + '0028,9446' => { VR => 'CS', Name => 'ImageProcessingApplied' }, + '0028,9454' => { VR => 'CS', Name => 'MaskSelectionMode' }, + '0028,9474' => { VR => 'CS', Name => 'LUTFunction' }, + '0028,9478' => { VR => 'FL', Name => 'MaskVisibilityPercentage' }, + '0028,9501' => { VR => 'SQ', Name => 'PixelShiftSequence' }, + '0028,9502' => { VR => 'SQ', Name => 'RegionPixelShiftSequence' }, + '0028,9503' => { VR => 'SS', Name => 'VerticesOfTheRegion' }, + '0028,9506' => { VR => 'US', Name => 'PixelShiftFrameRange' }, + '0028,9507' => { VR => 'US', Name => 'LUTFrameRange' }, + '0028,9520' => { VR => 'DS', Name => 'ImageToEquipmentMappingMatrix' }, + '0028,9537' => { VR => 'CS', Name => 'EquipmentCoordinateSystemID' }, + # GEMS_IMPS_01 (ref 4) + '0029,1004' => { VR => 'SL', Name => 'LowerRangeOfPixels1a' }, + '0029,1005' => { VR => 'DS', Name => 'LowerRangeOfPixels1b' }, + '0029,1006' => { VR => 'DS', Name => 'LowerRangeOfPixels1c' }, + '0029,1007' => { VR => 'SL', Name => 'LowerRangeOfPixels1d' }, + '0029,1008' => { VR => 'SH', Name => 'LowerRangeOfPixels1e' }, + '0029,1009' => { VR => 'SH', Name => 'LowerRangeOfPixels1f' }, + '0029,100A' => { VR => 'SS', Name => 'LowerRangeOfPixels1g' }, + '0029,1015' => { VR => 'SL', Name => 'LowerRangeOfPixels1h' }, + '0029,1016' => { VR => 'SL', Name => 'LowerRangeOfPixels1i' }, + '0029,1017' => { VR => 'SL', Name => 'LowerRangeOfPixels2' }, + '0029,1018' => { VR => 'SL', Name => 'UpperRangeOfPixels2' }, + '0029,101A' => { VR => 'SL', Name => 'LenOfTotHdrInBytes' }, + '0029,1026' => { VR => 'SS', Name => 'VersionOfTheHdrStruct' }, + '0029,1034' => { VR => 'SL', Name => 'AdvantageCompOverflow' }, + '0029,1035' => { VR => 'SL', Name => 'AdvantageCompUnderflow' }, + # study group + '0032,0000' => { VR => 'UL', Name => 'StudyGroupLength' }, + '0032,000A' => { VR => 'CS', Name => 'StudyStatusID' }, + '0032,000C' => { VR => 'CS', Name => 'StudyPriorityID' }, + '0032,0012' => { VR => 'LO', Name => 'StudyIDIssuer' }, + '0032,0032' => { VR => 'DA', Name => 'StudyVerifiedDate' }, + '0032,0033' => { VR => 'TM', Name => 'StudyVerifiedTime' }, + '0032,0034' => { VR => 'DA', Name => 'StudyReadDate' }, + '0032,0035' => { VR => 'TM', Name => 'StudyReadTime' }, + '0032,1000' => { VR => 'DA', Name => 'ScheduledStudyStartDate' }, + '0032,1001' => { VR => 'TM', Name => 'ScheduledStudyStartTime' }, + '0032,1010' => { VR => 'DA', Name => 'ScheduledStudyStopDate' }, + '0032,1011' => { VR => 'TM', Name => 'ScheduledStudyStopTime' }, + '0032,1020' => { VR => 'LO', Name => 'ScheduledStudyLocation' }, + '0032,1021' => { VR => 'AE', Name => 'ScheduledStudyLocationAETitle' }, + '0032,1030' => { VR => 'LO', Name => 'ReasonForStudy' }, + '0032,1031' => { VR => 'SQ', Name => 'RequestingPhysicianIDSequence' }, + '0032,1032' => { VR => 'PN', Name => 'RequestingPhysician' }, + '0032,1033' => { VR => 'LO', Name => 'RequestingService' }, + '0032,1040' => { VR => 'DA', Name => 'StudyArrivalDate' }, + '0032,1041' => { VR => 'TM', Name => 'StudyArrivalTime' }, + '0032,1050' => { VR => 'DA', Name => 'StudyCompletionDate' }, + '0032,1051' => { VR => 'TM', Name => 'StudyCompletionTime' }, + '0032,1055' => { VR => 'CS', Name => 'StudyComponentStatusID' }, + '0032,1060' => { VR => 'LO', Name => 'RequestedProcedureDescription' }, + '0032,1064' => { VR => 'SQ', Name => 'RequestedProcedureCodeSequence' }, + '0032,1070' => { VR => 'LO', Name => 'RequestedContrastAgent' }, + '0032,4000' => { VR => 'LT', Name => 'StudyComments' }, + # visit group + '0038,0004' => { VR => 'SQ', Name => 'ReferencedPatientAliasSequence' }, + '0038,0008' => { VR => 'CS', Name => 'VisitStatusID' }, + '0038,0010' => { VR => 'LO', Name => 'AdmissionID' }, + '0038,0011' => { VR => 'LO', Name => 'IssuerOfAdmissionID' }, + '0038,0016' => { VR => 'LO', Name => 'RouteOfAdmissions' }, + '0038,001A' => { VR => 'DA', Name => 'ScheduledAdmissionDate' }, + '0038,001B' => { VR => 'TM', Name => 'ScheduledAdmissionTime' }, + '0038,001C' => { VR => 'DA', Name => 'ScheduledDischargeDate' }, + '0038,001D' => { VR => 'TM', Name => 'ScheduledDischargeTime' }, + '0038,001E' => { VR => 'LO', Name => 'ScheduledPatientInstitResidence' }, + '0038,0020' => { VR => 'DA', Name => 'AdmittingDate' }, + '0038,0021' => { VR => 'TM', Name => 'AdmittingTime' }, + '0038,0030' => { VR => 'DA', Name => 'DischargeDate' }, + '0038,0032' => { VR => 'TM', Name => 'DischargeTime' }, + '0038,0040' => { VR => 'LO', Name => 'DischargeDiagnosisDescription' }, + '0038,0044' => { VR => 'SQ', Name => 'DischargeDiagnosisCodeSequence' }, + '0038,0050' => { VR => 'LO', Name => 'SpecialNeeds' }, + '0038,0060' => { VR => 'LO', Name => 'ServiceEpisodeID' }, + '0038,0061' => { VR => 'LO', Name => 'IssuerOfServiceEpisodeID' }, + '0038,0062' => { VR => 'LO', Name => 'ServiceEpisodeDescription' }, + '0038,0100' => { VR => 'SQ', Name => 'PertinentDocumentsSequence' }, + '0038,0300' => { VR => 'LO', Name => 'CurrentPatientLocation' }, + '0038,0400' => { VR => 'LO', Name => 'PatientInstitutionResidence' }, + '0038,0500' => { VR => 'LO', Name => 'PatientState' }, + '0038,0502' => { VR => 'SQ', Name => 'PatientClinicalTrialParticipSeq' }, + '0038,4000' => { VR => 'LT', Name => 'VisitComments' }, + '003A,0004' => { VR => 'CS', Name => 'WaveformOriginality' }, + '003A,0005' => { VR => 'US', Name => 'NumberOfWaveformChannels' }, + '003A,0010' => { VR => 'UL', Name => 'NumberOfWaveformSamples' }, + '003A,001A' => { VR => 'DS', Name => 'SamplingFrequency' }, + '003A,0020' => { VR => 'SH', Name => 'MultiplexGroupLabel' }, + '003A,0200' => { VR => 'SQ', Name => 'ChannelDefinitionSequence' }, + '003A,0202' => { VR => 'IS', Name => 'WaveformChannelNumber' }, + '003A,0203' => { VR => 'SH', Name => 'ChannelLabel' }, + '003A,0205' => { VR => 'CS', Name => 'ChannelStatus' }, + '003A,0208' => { VR => 'SQ', Name => 'ChannelSourceSequence' }, + '003A,0209' => { VR => 'SQ', Name => 'ChannelSourceModifiersSequence' }, + '003A,020A' => { VR => 'SQ', Name => 'SourceWaveformSequence' }, + '003A,020C' => { VR => 'LO', Name => 'ChannelDerivationDescription' }, + '003A,0210' => { VR => 'DS', Name => 'ChannelSensitivity' }, + '003A,0211' => { VR => 'SQ', Name => 'ChannelSensitivityUnitsSequence' }, + '003A,0212' => { VR => 'DS', Name => 'ChannelSensitivityCorrectionFactor' }, + '003A,0213' => { VR => 'DS', Name => 'ChannelBaseline' }, + '003A,0214' => { VR => 'DS', Name => 'ChannelTimeSkew' }, + '003A,0215' => { VR => 'DS', Name => 'ChannelSampleSkew' }, + '003A,0218' => { VR => 'DS', Name => 'ChannelOffset' }, + '003A,021A' => { VR => 'US', Name => 'WaveformBitsStored' }, + '003A,0220' => { VR => 'DS', Name => 'FilterLowFrequency' }, + '003A,0221' => { VR => 'DS', Name => 'FilterHighFrequency' }, + '003A,0222' => { VR => 'DS', Name => 'NotchFilterFrequency' }, + '003A,0223' => { VR => 'DS', Name => 'NotchFilterBandwidth' }, + '003A,0230' => { VR => 'FL', Name => 'WaveformDataDisplayScale' }, + '003A,0231' => { VR => 'US', Name => 'WaveformDisplayBkgCIELabValue' }, + '003A,0240' => { VR => 'SQ', Name => 'WaveformPresentationGroupSequence' }, + '003A,0241' => { VR => 'US', Name => 'PresentationGroupNumber' }, + '003A,0242' => { VR => 'SQ', Name => 'ChannelDisplaySequence' }, + '003A,0244' => { VR => 'US', Name => 'ChannelRecommendDisplayCIELabValue' }, + '003A,0245' => { VR => 'FL', Name => 'ChannelPosition' }, + '003A,0246' => { VR => 'CS', Name => 'DisplayShadingFlag' }, + '003A,0247' => { VR => 'FL', Name => 'FractionalChannelDisplayScale' }, + '003A,0248' => { VR => 'FL', Name => 'AbsoluteChannelDisplayScale' }, + '003A,0300' => { VR => 'SQ', Name => 'MultiplexAudioChannelsDescrCodeSeq' }, + '003A,0301' => { VR => 'IS', Name => 'ChannelIdentificationCode' }, + '003A,0302' => { VR => 'CS', Name => 'ChannelMode' }, + '0040,0001' => { VR => 'AE', Name => 'ScheduledStationAETitle' }, + '0040,0002' => { VR => 'DA', Name => 'ScheduledProcedureStepStartDate' }, + '0040,0003' => { VR => 'TM', Name => 'ScheduledProcedureStepStartTime' }, + '0040,0004' => { VR => 'DA', Name => 'ScheduledProcedureStepEndDate' }, + '0040,0005' => { VR => 'TM', Name => 'ScheduledProcedureStepEndTime' }, + '0040,0006' => { VR => 'PN', Name => 'ScheduledPerformingPhysiciansName' }, + '0040,0007' => { VR => 'LO', Name => 'ScheduledProcedureStepDescription' }, + '0040,0008' => { VR => 'SQ', Name => 'ScheduledProtocolCodeSequence' }, + '0040,0009' => { VR => 'SH', Name => 'ScheduledProcedureStepID' }, + '0040,000A' => { VR => 'SQ', Name => 'StageCodeSequence' }, + '0040,000B' => { VR => 'SQ', Name => 'ScheduledPerformingPhysicianIDSeq' }, + '0040,0010' => { VR => 'SH', Name => 'ScheduledStationName' }, + '0040,0011' => { VR => 'SH', Name => 'ScheduledProcedureStepLocation' }, + '0040,0012' => { VR => 'LO', Name => 'PreMedication' }, + '0040,0020' => { VR => 'CS', Name => 'ScheduledProcedureStepStatus' }, + '0040,0031' => { VR => 'UT', Name => 'LocalNamespaceEntityID' }, + '0040,0032' => { VR => 'UT', Name => 'UniversalEntityID' }, + '0040,0033' => { VR => 'CS', Name => 'UniversalEntityIDType' }, + '0040,0035' => { VR => 'CS', Name => 'IdentifierTypeCode' }, + '0040,0036' => { VR => 'SQ', Name => 'AssigningFacilitySequence' }, + '0040,0100' => { VR => 'SQ', Name => 'ScheduledProcedureStepSequence' }, + '0040,0220' => { VR => 'SQ', Name => 'ReferencedNonImageCompositeSOPSeq' }, + '0040,0241' => { VR => 'AE', Name => 'PerformedStationAETitle' }, + '0040,0242' => { VR => 'SH', Name => 'PerformedStationName' }, + '0040,0243' => { VR => 'SH', Name => 'PerformedLocation' }, + '0040,0244' => { VR => 'DA', Name => 'PerformedProcedureStepStartDate' }, + '0040,0245' => { VR => 'TM', Name => 'PerformedProcedureStepStartTime' }, + '0040,0250' => { VR => 'DA', Name => 'PerformedProcedureStepEndDate' }, + '0040,0251' => { VR => 'TM', Name => 'PerformedProcedureStepEndTime' }, + '0040,0252' => { VR => 'CS', Name => 'PerformedProcedureStepStatus' }, + '0040,0253' => { VR => 'SH', Name => 'PerformedProcedureStepID' }, + '0040,0254' => { VR => 'LO', Name => 'PerformedProcedureStepDescription' }, + '0040,0255' => { VR => 'LO', Name => 'PerformedProcedureTypeDescription' }, + '0040,0260' => { VR => 'SQ', Name => 'PerformedProtocolCodeSequence' }, + '0040,0261' => { VR => 'CS', Name => 'PerformedProtocolType' }, + '0040,0270' => { VR => 'SQ', Name => 'ScheduledStepAttributesSequence' }, + '0040,0275' => { VR => 'SQ', Name => 'RequestAttributesSequence' }, + '0040,0280' => { VR => 'ST', Name => 'CommentsOnPerformedProcedureStep' }, + '0040,0281' => { VR => 'SQ', Name => 'ProcStepDiscontinueReasonCodeSeq' }, + '0040,0293' => { VR => 'SQ', Name => 'QuantitySequence' }, + '0040,0294' => { VR => 'DS', Name => 'Quantity' }, + '0040,0295' => { VR => 'SQ', Name => 'MeasuringUnitsSequence' }, + '0040,0296' => { VR => 'SQ', Name => 'BillingItemSequence' }, + '0040,0300' => { VR => 'US', Name => 'TotalTimeOfFluoroscopy' }, + '0040,0301' => { VR => 'US', Name => 'TotalNumberOfExposures' }, + '0040,0302' => { VR => 'US', Name => 'EntranceDose' }, + '0040,0303' => { VR => 'US', Name => 'ExposedArea' }, + '0040,0306' => { VR => 'DS', Name => 'DistanceSourceToEntrance' }, + '0040,0307' => { VR => 'DS', Name => 'DistanceSourceToSupport' }, + '0040,030E' => { VR => 'SQ', Name => 'ExposureDoseSequence' }, + '0040,0310' => { VR => 'ST', Name => 'CommentsOnRadiationDose' }, + '0040,0312' => { VR => 'DS', Name => 'XRayOutput' }, + '0040,0314' => { VR => 'DS', Name => 'HalfValueLayer' }, + '0040,0316' => { VR => 'DS', Name => 'OrganDose' }, + '0040,0318' => { VR => 'CS', Name => 'OrganExposed' }, + '0040,0320' => { VR => 'SQ', Name => 'BillingProcedureStepSequence' }, + '0040,0321' => { VR => 'SQ', Name => 'FilmConsumptionSequence' }, + '0040,0324' => { VR => 'SQ', Name => 'BillingSuppliesAndDevicesSequence' }, + '0040,0330' => { VR => 'SQ', Name => 'ReferencedProcedureStepSequence' }, + '0040,0340' => { VR => 'SQ', Name => 'PerformedSeriesSequence' }, + '0040,0400' => { VR => 'LT', Name => 'CommentsOnScheduledProcedureStep' }, + '0040,0440' => { VR => 'SQ', Name => 'ProtocolContextSequence' }, + '0040,0441' => { VR => 'SQ', Name => 'ContentItemModifierSequence' }, + '0040,050A' => { VR => 'LO', Name => 'SpecimenAccessionNumber' }, + '0040,0512' => { VR => 'LO', Name => 'ContainerIdentifier' }, + '0040,051A' => { VR => 'LO', Name => 'ContainerDescription' }, + '0040,0550' => { VR => 'SQ', Name => 'SpecimenSequence' }, + '0040,0551' => { VR => 'LO', Name => 'SpecimenIdentifier' }, + '0040,0552' => { VR => 'SQ', Name => 'SpecimenDescriptionSequenceTrial' }, + '0040,0553' => { VR => 'ST', Name => 'SpecimenDescriptionTrial' }, + '0040,0554' => { VR => 'UI', Name => 'SpecimenUID' }, + '0040,0555' => { VR => 'SQ', Name => 'AcquisitionContextSequence' }, + '0040,0556' => { VR => 'ST', Name => 'AcquisitionContextDescription' }, + '0040,059A' => { VR => 'SQ', Name => 'SpecimenTypeCodeSequence' }, + '0040,0600' => { VR => 'LO', Name => 'SpecimenShortDescription' }, + '0040,06FA' => { VR => 'LO', Name => 'SlideIdentifier' }, + '0040,071A' => { VR => 'SQ', Name => 'ImageCenterPointCoordinatesSeq' }, + '0040,072A' => { VR => 'DS', Name => 'XOffsetInSlideCoordinateSystem' }, + '0040,073A' => { VR => 'DS', Name => 'YOffsetInSlideCoordinateSystem' }, + '0040,074A' => { VR => 'DS', Name => 'ZOffsetInSlideCoordinateSystem' }, + '0040,08D8' => { VR => 'SQ', Name => 'PixelSpacingSequence' }, + '0040,08DA' => { VR => 'SQ', Name => 'CoordinateSystemAxisCodeSequence' }, + '0040,08EA' => { VR => 'SQ', Name => 'MeasurementUnitsCodeSequence' }, + '0040,09F8' => { VR => 'SQ', Name => 'VitalStainCodeSequenceTrial' }, + '0040,1001' => { VR => 'SH', Name => 'RequestedProcedureID' }, + '0040,1002' => { VR => 'LO', Name => 'ReasonForRequestedProcedure' }, + '0040,1003' => { VR => 'SH', Name => 'RequestedProcedurePriority' }, + '0040,1004' => { VR => 'LO', Name => 'PatientTransportArrangements' }, + '0040,1005' => { VR => 'LO', Name => 'RequestedProcedureLocation' }, + '0040,1006' => { VR => 'SH', Name => 'PlacerOrderNumber-Procedure' }, + '0040,1007' => { VR => 'SH', Name => 'FillerOrderNumber-Procedure' }, + '0040,1008' => { VR => 'LO', Name => 'ConfidentialityCode' }, + '0040,1009' => { VR => 'SH', Name => 'ReportingPriority' }, + '0040,100A' => { VR => 'SQ', Name => 'ReasonForRequestedProcedureCodeSeq' }, + '0040,1010' => { VR => 'PN', Name => 'NamesOfIntendedRecipientsOfResults' }, + '0040,1011' => { VR => 'SQ', Name => 'IntendedRecipientsOfResultsIDSeq' }, + '0040,1101' => { VR => 'SQ', Name => 'PersonIdentificationCodeSequence' }, + '0040,1102' => { VR => 'ST', Name => 'PersonAddress' }, + '0040,1103' => { VR => 'LO', Name => 'PersonTelephoneNumbers' }, + '0040,1400' => { VR => 'LT', Name => 'RequestedProcedureComments' }, + '0040,2001' => { VR => 'LO', Name => 'ReasonForImagingServiceRequest' }, + '0040,2004' => { VR => 'DA', Name => 'IssueDateOfImagingServiceRequest' }, + '0040,2005' => { VR => 'TM', Name => 'IssueTimeOfImagingServiceRequest' }, + '0040,2006' => { VR => 'SH', Name => 'PlacerOrderNum-ImagingServiceReq' }, + '0040,2007' => { VR => 'SH', Name => 'FillerOrderNum-ImagingServiceReq' }, + '0040,2008' => { VR => 'PN', Name => 'OrderEnteredBy' }, + '0040,2009' => { VR => 'SH', Name => 'OrderEntererLocation' }, + '0040,2010' => { VR => 'SH', Name => 'OrderCallbackPhoneNumber' }, + '0040,2016' => { VR => 'LO', Name => 'PlacerOrderNum-ImagingServiceReq' }, + '0040,2017' => { VR => 'LO', Name => 'FillerOrderNum-ImagingServiceReq' }, + '0040,2400' => { VR => 'LT', Name => 'ImagingServiceRequestComments' }, + '0040,3001' => { VR => 'LO', Name => 'ConfidentialityOnPatientDataDescr' }, + '0040,4001' => { VR => 'CS', Name => 'GenPurposeScheduledProcStepStatus' }, + '0040,4002' => { VR => 'CS', Name => 'GenPurposePerformedProcStepStatus' }, + '0040,4003' => { VR => 'CS', Name => 'GenPurposeSchedProcStepPriority' }, + '0040,4004' => { VR => 'SQ', Name => 'SchedProcessingApplicationsCodeSeq' }, + '0040,4005' => { VR => 'DT', Name => 'SchedProcedureStepStartDateAndTime' }, + '0040,4006' => { VR => 'CS', Name => 'MultipleCopiesFlag' }, + '0040,4007' => { VR => 'SQ', Name => 'PerformedProcessingAppsCodeSeq' }, + '0040,4009' => { VR => 'SQ', Name => 'HumanPerformerCodeSequence' }, + '0040,4010' => { VR => 'DT', Name => 'SchedProcStepModificationDateTime' }, + '0040,4011' => { VR => 'DT', Name => 'ExpectedCompletionDateAndTime' }, + '0040,4015' => { VR => 'SQ', Name => 'ResultingGenPurposePerfProcStepSeq' }, + '0040,4016' => { VR => 'SQ', Name => 'RefGenPurposeSchedProcStepSeq' }, + '0040,4018' => { VR => 'SQ', Name => 'ScheduledWorkitemCodeSequence' }, + '0040,4019' => { VR => 'SQ', Name => 'PerformedWorkitemCodeSequence' }, + '0040,4020' => { VR => 'CS', Name => 'InputAvailabilityFlag' }, + '0040,4021' => { VR => 'SQ', Name => 'InputInformationSequence' }, + '0040,4022' => { VR => 'SQ', Name => 'RelevantInformationSequence' }, + '0040,4023' => { VR => 'UI', Name => 'RefGenPurSchedProcStepTransUID' }, + '0040,4025' => { VR => 'SQ', Name => 'ScheduledStationNameCodeSequence' }, + '0040,4026' => { VR => 'SQ', Name => 'ScheduledStationClassCodeSequence' }, + '0040,4027' => { VR => 'SQ', Name => 'SchedStationGeographicLocCodeSeq' }, + '0040,4028' => { VR => 'SQ', Name => 'PerformedStationNameCodeSequence' }, + '0040,4029' => { VR => 'SQ', Name => 'PerformedStationClassCodeSequence' }, + '0040,4030' => { VR => 'SQ', Name => 'PerformedStationGeogLocCodeSeq' }, + '0040,4031' => { VR => 'SQ', Name => 'RequestedSubsequentWorkItemCodeSeq' }, + '0040,4032' => { VR => 'SQ', Name => 'NonDICOMOutputCodeSequence' }, + '0040,4033' => { VR => 'SQ', Name => 'OutputInformationSequence' }, + '0040,4034' => { VR => 'SQ', Name => 'ScheduledHumanPerformersSequence' }, + '0040,4035' => { VR => 'SQ', Name => 'ActualHumanPerformersSequence' }, + '0040,4036' => { VR => 'LO', Name => 'HumanPerformersOrganization' }, + '0040,4037' => { VR => 'PN', Name => 'HumanPerformerName' }, + '0040,4040' => { VR => 'CS', Name => 'RawDataHandling' }, + '0040,8302' => { VR => 'DS', Name => 'EntranceDoseInMilliGy' }, + '0040,9094' => { VR => 'SQ', Name => 'RefImageRealWorldValueMappingSeq' }, + '0040,9096' => { VR => 'SQ', Name => 'RealWorldValueMappingSequence' }, + '0040,9098' => { VR => 'SQ', Name => 'PixelValueMappingCodeSequence' }, + '0040,9210' => { VR => 'SH', Name => 'LUTLabel' }, + '0040,9211' => { VR => 'SS', Name => 'RealWorldValueLastValueMapped' }, + '0040,9212' => { VR => 'FD', Name => 'RealWorldValueLUTData' }, + '0040,9216' => { VR => 'SS', Name => 'RealWorldValueFirstValueMapped' }, + '0040,9224' => { VR => 'FD', Name => 'RealWorldValueIntercept' }, + '0040,9225' => { VR => 'FD', Name => 'RealWorldValueSlope' }, + '0040,A010' => { VR => 'CS', Name => 'RelationshipType' }, + '0040,A027' => { VR => 'LO', Name => 'VerifyingOrganization' }, + '0040,A030' => { VR => 'DT', Name => 'VerificationDateTime' }, + '0040,A032' => { VR => 'DT', Name => 'ObservationDateTime' }, + '0040,A040' => { VR => 'CS', Name => 'ValueType' }, + '0040,A043' => { VR => 'SQ', Name => 'ConceptNameCodeSequence' }, + '0040,A050' => { VR => 'CS', Name => 'ContinuityOfContent' }, + '0040,A073' => { VR => 'SQ', Name => 'VerifyingObserverSequence' }, + '0040,A075' => { VR => 'PN', Name => 'VerifyingObserverName' }, + '0040,A078' => { VR => 'SQ', Name => 'AuthorObserverSequence' }, + '0040,A07A' => { VR => 'SQ', Name => 'ParticipantSequence' }, + '0040,A07C' => { VR => 'SQ', Name => 'CustodialOrganizationSequence' }, + '0040,A080' => { VR => 'CS', Name => 'ParticipationType' }, + '0040,A082' => { VR => 'DT', Name => 'ParticipationDateTime' }, + '0040,A084' => { VR => 'CS', Name => 'ObserverType' }, + '0040,A088' => { VR => 'SQ', Name => 'VerifyingObserverIdentCodeSequence' }, + '0040,A090' => { VR => 'SQ', Name => 'EquivalentCDADocumentSequence' }, + '0040,A0B0' => { VR => 'US', Name => 'ReferencedWaveformChannels' }, + '0040,A120' => { VR => 'DT', Name => 'DateTime' }, + '0040,A121' => { VR => 'DA', Name => 'Date' }, + '0040,A122' => { VR => 'TM', Name => 'Time' }, + '0040,A123' => { VR => 'PN', Name => 'PersonName' }, + '0040,A124' => { VR => 'UI', Name => 'UID' }, + '0040,A130' => { VR => 'CS', Name => 'TemporalRangeType' }, + '0040,A132' => { VR => 'UL', Name => 'ReferencedSamplePositions' }, + '0040,A136' => { VR => 'US', Name => 'ReferencedFrameNumbers' }, + '0040,A138' => { VR => 'DS', Name => 'ReferencedTimeOffsets' }, + '0040,A13A' => { VR => 'DT', Name => 'ReferencedDateTime' }, + '0040,A160' => { VR => 'UT', Name => 'TextValue' }, + '0040,A168' => { VR => 'SQ', Name => 'ConceptCodeSequence' }, + '0040,A170' => { VR => 'SQ', Name => 'PurposeOfReferenceCodeSequence' }, + '0040,A180' => { VR => 'US', Name => 'AnnotationGroupNumber' }, + '0040,A195' => { VR => 'SQ', Name => 'ModifierCodeSequence' }, + '0040,A300' => { VR => 'SQ', Name => 'MeasuredValueSequence' }, + '0040,A301' => { VR => 'SQ', Name => 'NumericValueQualifierCodeSequence' }, + '0040,A30A' => { VR => 'DS', Name => 'NumericValue' }, + '0040,A353' => { VR => 'ST', Name => 'AddressTrial' }, + '0040,A354' => { VR => 'LO', Name => 'TelephoneNumberTrial' }, + '0040,A360' => { VR => 'SQ', Name => 'PredecessorDocumentsSequence' }, + '0040,A370' => { VR => 'SQ', Name => 'ReferencedRequestSequence' }, + '0040,A372' => { VR => 'SQ', Name => 'PerformedProcedureCodeSequence' }, + '0040,A375' => { VR => 'SQ', Name => 'CurrentRequestedProcEvidenceSeq' }, + '0040,A385' => { VR => 'SQ', Name => 'PertinentOtherEvidenceSequence' }, + '0040,A390' => { VR => 'SQ', Name => 'HL7StructuredDocumentRefSeq' }, + '0040,A491' => { VR => 'CS', Name => 'CompletionFlag' }, + '0040,A492' => { VR => 'LO', Name => 'CompletionFlagDescription' }, + '0040,A493' => { VR => 'CS', Name => 'VerificationFlag' }, + '0040,A494' => { VR => 'CS', Name => 'ArchiveRequested' }, + '0040,A496' => { VR => 'CS', Name => 'PreliminaryFlag' }, + '0040,A504' => { VR => 'SQ', Name => 'ContentTemplateSequence' }, + '0040,A525' => { VR => 'SQ', Name => 'IdenticalDocumentsSequence' }, + '0040,A730' => { VR => 'SQ', Name => 'ContentSequence' }, + '0040,B020' => { VR => 'SQ', Name => 'AnnotationSequence' }, + '0040,DB00' => { VR => 'CS', Name => 'TemplateIdentifier' }, + '0040,DB06' => { VR => 'DT', Name => 'TemplateVersion' }, + '0040,DB07' => { VR => 'DT', Name => 'TemplateLocalVersion' }, + '0040,DB0B' => { VR => 'CS', Name => 'TemplateExtensionFlag' }, + '0040,DB0C' => { VR => 'UI', Name => 'TemplateExtensionOrganizationUID' }, + '0040,DB0D' => { VR => 'UI', Name => 'TemplateExtensionCreatorUID' }, + '0040,DB73' => { VR => 'UL', Name => 'ReferencedContentItemIdentifier' }, + '0040,E001' => { VR => 'ST', Name => 'HL7InstanceIdentifier' }, + '0040,E004' => { VR => 'DT', Name => 'HL7DocumentEffectiveTime' }, + '0040,E006' => { VR => 'SQ', Name => 'HL7DocumentTypeCodeSequence' }, + '0040,E010' => { VR => 'UT', Name => 'RetrieveURI' }, + '0040,E011' => { VR => 'UI', Name => 'RetrieveLocationUID' }, + '0042,0010' => { VR => 'ST', Name => 'DocumentTitle' }, + '0042,0011' => { VR => 'OB', Name => 'EncapsulatedDocument' }, + '0042,0012' => { VR => 'LO', Name => 'MIMETypeOfEncapsulatedDocument' }, + '0042,0013' => { VR => 'SQ', Name => 'SourceInstanceSequence' }, + '0042,0014' => { VR => 'LO', Name => 'ListOfMIMETypes' }, + # GEMS_PARM_01 (ref 4) + '0043,1001' => { VR => 'SS', Name => 'BitmapOfPrescanOptions' }, + '0043,1002' => { VR => 'SS', Name => 'GradientOffsetInX' }, + '0043,1003' => { VR => 'SS', Name => 'GradientOffsetInY' }, + '0043,1004' => { VR => 'SS', Name => 'GradientOffsetInZ' }, + '0043,1005' => { VR => 'SS', Name => 'ImgIsOriginalOrUnoriginal' }, + '0043,1006' => { VR => 'SS', Name => 'NumberOfEPIShots' }, + '0043,1007' => { VR => 'SS', Name => 'ViewsPerSegment' }, + '0043,1008' => { VR => 'SS', Name => 'RespiratoryRateBpm' }, + '0043,1009' => { VR => 'SS', Name => 'RespiratoryTriggerPoint' }, + '0043,100A' => { VR => 'SS', Name => 'TypeOfReceiverUsed' }, + '0043,100B' => { VR => 'DS', Name => 'PeakRateOfChangeOfGradientField' }, + '0043,100C' => { VR => 'DS', Name => 'LimitsInUnitsOfPercent' }, + '0043,100D' => { VR => 'DS', Name => 'PSDEstimatedLimit' }, + '0043,100E' => { VR => 'DS', Name => 'PSDEstimatedLimitInTeslaPerSecond' }, + '0043,100F' => { VR => 'DS', Name => 'Saravghead' }, + '0043,1010' => { VR => 'US', Name => 'WindowValue' }, + '0043,1011' => { VR => 'US', Name => 'TotalInputViews' }, + '0043,1012' => { VR => 'SS', Name => 'X-RayChain' }, + '0043,1013' => { VR => 'SS', Name => 'DeconKernelParameters' }, + '0043,1014' => { VR => 'SS', Name => 'CalibrationParameters' }, + '0043,1015' => { VR => 'SS', Name => 'TotalOutputViews' }, + '0043,1016' => { VR => 'SS', Name => 'NumberOfOverranges' }, + '0043,1017' => { VR => 'DS', Name => 'IBHImageScaleFactors' }, + '0043,1018' => { VR => 'DS', Name => 'BBHCoefficients' }, + '0043,1019' => { VR => 'SS', Name => 'NumberOfBBHChainsToBlend' }, + '0043,101A' => { VR => 'SL', Name => 'StartingChannelNumber' }, + '0043,101B' => { VR => 'SS', Name => 'PpscanParameters' }, + '0043,101C' => { VR => 'SS', Name => 'GEImageIntegrity' }, + '0043,101D' => { VR => 'SS', Name => 'LevelValue' }, + '0043,101E' => { VR => 'DS', Name => 'DeltaStartTime' }, + '0043,101F' => { VR => 'SL', Name => 'MaxOverrangesInAView' }, + '0043,1020' => { VR => 'DS', Name => 'AvgOverrangesAllViews' }, + '0043,1021' => { VR => 'SS', Name => 'CorrectedAfterGlowTerms' }, + '0043,1025' => { VR => 'SS', Name => 'ReferenceChannels' }, + '0043,1026' => { VR => 'US', Name => 'NoViewsRefChansBlocked' }, + '0043,1027' => { VR => 'SH', Name => 'ScanPitchRatio' }, + '0043,1028' => { VR => 'OB', Name => 'UniqueImageIden' }, + '0043,1029' => { VR => 'OB', Name => 'HistogramTables' }, + '0043,102A' => { VR => 'OB', Name => 'UserDefinedData' }, + '0043,102B' => { VR => 'SS', Name => 'PrivateScanOptions' }, + '0043,102C' => { VR => 'SS', Name => 'EffectiveEchoSpacing' }, + '0043,102D' => { VR => 'SH', Name => 'StringSlopField1' }, + '0043,102E' => { VR => 'SH', Name => 'StringSlopField2' }, + '0043,102F' => { VR => 'SS', Name => 'RawDataType' }, + '0043,1030' => { VR => 'SS', Name => 'RawDataType' }, + '0043,1031' => { VR => 'DS', Name => 'RACordOfTargetReconCenter' }, + '0043,1032' => { VR => 'SS', Name => 'RawDataType' }, + '0043,1033' => { VR => 'FL', Name => 'NegScanspacing' }, + '0043,1034' => { VR => 'IS', Name => 'OffsetFrequency' }, + '0043,1035' => { VR => 'UL', Name => 'UserUsageTag' }, + '0043,1036' => { VR => 'UL', Name => 'UserFillMapMSW' }, + '0043,1037' => { VR => 'UL', Name => 'UserFillMapLSW' }, + '0043,1038' => { VR => 'FL', Name => 'User25-48' }, + '0043,1039' => { VR => 'IS', Name => 'SlopInt6-9' }, + '0043,1040' => { VR => 'FL', Name => 'TriggerOnPosition' }, + '0043,1041' => { VR => 'FL', Name => 'DegreeOfRotation' }, + '0043,1042' => { VR => 'SL', Name => 'DASTriggerSource' }, + '0043,1043' => { VR => 'SL', Name => 'DASFpaGain' }, + '0043,1044' => { VR => 'SL', Name => 'DASOutputSource' }, + '0043,1045' => { VR => 'SL', Name => 'DASAdInput' }, + '0043,1046' => { VR => 'SL', Name => 'DASCalMode' }, + '0043,1047' => { VR => 'SL', Name => 'DASCalFrequency' }, + '0043,1048' => { VR => 'SL', Name => 'DASRegXm' }, + '0043,1049' => { VR => 'SL', Name => 'DASAutoZero' }, + '0043,104A' => { VR => 'SS', Name => 'StartingChannelOfView' }, + '0043,104B' => { VR => 'SL', Name => 'DASXmPattern' }, + '0043,104C' => { VR => 'SS', Name => 'TGGCTriggerMode' }, + '0043,104D' => { VR => 'FL', Name => 'StartScanToXrayOnDelay' }, + '0043,104E' => { VR => 'FL', Name => 'DurationOfXrayOn' }, + '0043,1060' => { VR => 'IS', Name => 'SlopInt10-17' }, + '0043,1061' => { VR => 'UI', Name => 'ScannerStudyEntityUID' }, + '0043,1062' => { VR => 'SH', Name => 'ScannerStudyID' }, + '0043,106f' => { VR => 'DS', Name => 'ScannerTableEntry' }, + # ? + '0044,0001' => { VR => 'ST', Name => 'ProductPackageIdentifier' }, + '0044,0002' => { VR => 'CS', Name => 'SubstanceAdministrationApproval' }, + '0044,0003' => { VR => 'LT', Name => 'ApprovalStatusFurtherDescription' }, + '0044,0004' => { VR => 'DT', Name => 'ApprovalStatusDateTime' }, + '0044,0007' => { VR => 'SQ', Name => 'ProductTypeCodeSequence' }, + '0044,0008' => { VR => 'LO', Name => 'ProductName' }, + '0044,0009' => { VR => 'LT', Name => 'ProductDescription' }, + '0044,000A' => { VR => 'LO', Name => 'ProductLotIdentifier' }, + '0044,000B' => { VR => 'DT', Name => 'ProductExpirationDateTime' }, + '0044,0010' => { VR => 'DT', Name => 'SubstanceAdministrationDateTime' }, + '0044,0011' => { VR => 'LO', Name => 'SubstanceAdministrationNotes' }, + '0044,0012' => { VR => 'LO', Name => 'SubstanceAdministrationDeviceID' }, + '0044,0013' => { VR => 'SQ', Name => 'ProductParameterSequence' }, + '0044,0019' => { VR => 'SQ', Name => 'SubstanceAdminParameterSeq' }, + # GEMS_HELIOS_01 (ref 4) + '0045,1001' => { VR => 'LO', Name => 'NumberOfMacroRowsInDetector' }, + '0045,1002' => { VR => 'FL', Name => 'MacroWidthAtISOCenter' }, + '0045,1003' => { VR => 'SS', Name => 'DASType' }, + '0045,1004' => { VR => 'SS', Name => 'DASGain' }, + '0045,1005' => { VR => 'SS', Name => 'DASTemperature' }, + '0045,1006' => { VR => 'CS', Name => 'TableDirectionInOrOut' }, + '0045,1007' => { VR => 'FL', Name => 'ZSmoothingFactor' }, + '0045,1008' => { VR => 'SS', Name => 'ViewWeightingMode' }, + '0045,1009' => { VR => 'SS', Name => 'SigmaRowNumberWhichRowsWereUsed' }, + '0045,100A' => { VR => 'FL', Name => 'MinimumDasValueFoundInTheScanData' }, + '0045,100B' => { VR => 'FL', Name => 'MaximumOffsetShiftValueUsed' }, + '0045,100C' => { VR => 'SS', Name => 'NumberOfViewsShifted' }, + '0045,100D' => { VR => 'SS', Name => 'ZTrackingFlag' }, + '0045,100E' => { VR => 'FL', Name => 'MeanZError' }, + '0045,100F' => { VR => 'FL', Name => 'ZTrackingMaximumError' }, + '0045,1010' => { VR => 'SS', Name => 'StartingViewForRow2a' }, + '0045,1011' => { VR => 'SS', Name => 'NumberOfViewsInRow2a' }, + '0045,1012' => { VR => 'SS', Name => 'StartingViewForRow1a' }, + '0045,1013' => { VR => 'SS', Name => 'SigmaMode' }, + '0045,1014' => { VR => 'SS', Name => 'NumberOfViewsInRow1a' }, + '0045,1015' => { VR => 'SS', Name => 'StartingViewForRow2b' }, + '0045,1016' => { VR => 'SS', Name => 'NumberOfViewsInRow2b' }, + '0045,1017' => { VR => 'SS', Name => 'StartingViewForRow1b' }, + '0045,1018' => { VR => 'SS', Name => 'NumberOfViewsInRow1b' }, + '0045,1019' => { VR => 'SS', Name => 'AirFilterCalibrationDate' }, + '0045,101A' => { VR => 'SS', Name => 'AirFilterCalibrationTime' }, + '0045,101B' => { VR => 'SS', Name => 'PhantomCalibrationDate' }, + '0045,101C' => { VR => 'SS', Name => 'PhantomCalibrationTime' }, + '0045,101D' => { VR => 'SS', Name => 'ZSlopeCalibrationDate' }, + '0045,101E' => { VR => 'SS', Name => 'ZSlopeCalibrationTime' }, + '0045,101F' => { VR => 'SS', Name => 'CrosstalkCalibrationDate' }, + '0045,1020' => { VR => 'SS', Name => 'CrosstalkCalibrationTime' }, + '0045,1021' => { VR => 'SS', Name => 'IterboneOptionFlag' }, + '0045,1022' => { VR => 'SS', Name => 'PeristalticFlagOption' }, + '0046,0012' => { VR => 'LO', Name => 'LensDescription' }, + '0046,0014' => { VR => 'SQ', Name => 'RightLensSequence' }, + '0046,0015' => { VR => 'SQ', Name => 'LeftLensSequence' }, + '0046,0018' => { VR => 'SQ', Name => 'CylinderSequence' }, + '0046,0028' => { VR => 'SQ', Name => 'PrismSequence' }, + '0046,0030' => { VR => 'FD', Name => 'HorizontalPrismPower' }, + '0046,0032' => { VR => 'CS', Name => 'HorizontalPrismBase' }, + '0046,0034' => { VR => 'FD', Name => 'VerticalPrismPower' }, + '0046,0036' => { VR => 'CS', Name => 'VerticalPrismBase' }, + '0046,0038' => { VR => 'CS', Name => 'LensSegmentType' }, + '0046,0040' => { VR => 'FD', Name => 'OpticalTransmittance' }, + '0046,0042' => { VR => 'FD', Name => 'ChannelWidth' }, + '0046,0044' => { VR => 'FD', Name => 'PupilSize' }, + '0046,0046' => { VR => 'FD', Name => 'CornealSize' }, + '0046,0060' => { VR => 'FD', Name => 'DistancePupillaryDistance' }, + '0046,0062' => { VR => 'FD', Name => 'NearPupillaryDistance' }, + '0046,0064' => { VR => 'FD', Name => 'OtherPupillaryDistance' }, + '0046,0075' => { VR => 'FD', Name => 'RadiusOfCurvature' }, + '0046,0076' => { VR => 'FD', Name => 'KeratometricPower' }, + '0046,0077' => { VR => 'FD', Name => 'KeratometricAxis' }, + '0046,0092' => { VR => 'CS', Name => 'BackgroundColor' }, + '0046,0094' => { VR => 'CS', Name => 'Optotype' }, + '0046,0095' => { VR => 'CS', Name => 'OptotypePresentation' }, + '0046,0100' => { VR => 'SQ', Name => 'AddNearSequence' }, + '0046,0101' => { VR => 'SQ', Name => 'AddIntermediateSequence' }, + '0046,0102' => { VR => 'SQ', Name => 'AddOtherSequence' }, + '0046,0104' => { VR => 'FD', Name => 'AddPower' }, + '0046,0106' => { VR => 'FD', Name => 'ViewingDistance' }, + '0046,0125' => { VR => 'CS', Name => 'ViewingDistanceType' }, + '0046,0135' => { VR => 'SS', Name => 'VisualAcuityModifiers' }, + '0046,0137' => { VR => 'FD', Name => 'DecimalVisualAcuity' }, + '0046,0139' => { VR => 'LO', Name => 'OptotypeDetailedDefinition' }, + '0046,0146' => { VR => 'FD', Name => 'SpherePower' }, + '0046,0147' => { VR => 'FD', Name => 'CylinderPower' }, + # calibration group + '0050,0004' => { VR => 'CS', Name => 'CalibrationImage' }, + '0050,0010' => { VR => 'SQ', Name => 'DeviceSequence' }, + '0050,0014' => { VR => 'DS', Name => 'DeviceLength' }, + '0050,0015' => { VR => 'FD', Name => 'ContainerComponentWidth' }, + '0050,0016' => { VR => 'DS', Name => 'DeviceDiameter' }, + '0050,0017' => { VR => 'CS', Name => 'DeviceDiameterUnits' }, + '0050,0018' => { VR => 'DS', Name => 'DeviceVolume' }, + '0050,0019' => { VR => 'DS', Name => 'InterMarkerDistance' }, + '0050,001B' => { VR => 'LO', Name => 'ContainerComponentID' }, + '0050,0020' => { VR => 'LO', Name => 'DeviceDescription' }, + # nuclear acquisition group + '0054,0010' => { VR => 'US', Name => 'EnergyWindowVector' }, + '0054,0011' => { VR => 'US', Name => 'NumberOfEnergyWindows' }, + '0054,0012' => { VR => 'SQ', Name => 'EnergyWindowInformationSequence' }, + '0054,0013' => { VR => 'SQ', Name => 'EnergyWindowRangeSequence' }, + '0054,0014' => { VR => 'DS', Name => 'EnergyWindowLowerLimit' }, + '0054,0015' => { VR => 'DS', Name => 'EnergyWindowUpperLimit' }, + '0054,0016' => { VR => 'SQ', Name => 'RadiopharmaceuticalInformationSeq' }, + '0054,0017' => { VR => 'IS', Name => 'ResidualSyringeCounts' }, + '0054,0018' => { VR => 'SH', Name => 'EnergyWindowName' }, + '0054,0020' => { VR => 'US', Name => 'DetectorVector' }, + '0054,0021' => { VR => 'US', Name => 'NumberOfDetectors' }, + '0054,0022' => { VR => 'SQ', Name => 'DetectorInformationSequence' }, + '0054,0030' => { VR => 'US', Name => 'PhaseVector' }, + '0054,0031' => { VR => 'US', Name => 'NumberOfPhases' }, + '0054,0032' => { VR => 'SQ', Name => 'PhaseInformationSequence' }, + '0054,0033' => { VR => 'US', Name => 'NumberOfFramesInPhase' }, + '0054,0036' => { VR => 'IS', Name => 'PhaseDelay' }, + '0054,0038' => { VR => 'IS', Name => 'PauseBetweenFrames' }, + '0054,0039' => { VR => 'CS', Name => 'PhaseDescription' }, + '0054,0050' => { VR => 'US', Name => 'RotationVector' }, + '0054,0051' => { VR => 'US', Name => 'NumberOfRotations' }, + '0054,0052' => { VR => 'SQ', Name => 'RotationInformationSequence' }, + '0054,0053' => { VR => 'US', Name => 'NumberOfFramesInRotation' }, + '0054,0060' => { VR => 'US', Name => 'RRIntervalVector' }, + '0054,0061' => { VR => 'US', Name => 'NumberOfRRIntervals' }, + '0054,0062' => { VR => 'SQ', Name => 'GatedInformationSequence' }, + '0054,0063' => { VR => 'SQ', Name => 'DataInformationSequence' }, + '0054,0070' => { VR => 'US', Name => 'TimeSlotVector' }, + '0054,0071' => { VR => 'US', Name => 'NumberOfTimeSlots' }, + '0054,0072' => { VR => 'SQ', Name => 'TimeSlotInformationSequence' }, + '0054,0073' => { VR => 'DS', Name => 'TimeSlotTime' }, + '0054,0080' => { VR => 'US', Name => 'SliceVector' }, + '0054,0081' => { VR => 'US', Name => 'NumberOfSlices' }, + '0054,0090' => { VR => 'US', Name => 'AngularViewVector' }, + '0054,0100' => { VR => 'US', Name => 'TimeSliceVector' }, + '0054,0101' => { VR => 'US', Name => 'NumberOfTimeSlices' }, + '0054,0200' => { VR => 'DS', Name => 'StartAngle' }, + '0054,0202' => { VR => 'CS', Name => 'TypeOfDetectorMotion' }, + '0054,0210' => { VR => 'IS', Name => 'TriggerVector' }, + '0054,0211' => { VR => 'US', Name => 'NumberOfTriggersInPhase' }, + '0054,0220' => { VR => 'SQ', Name => 'ViewCodeSequence' }, + '0054,0222' => { VR => 'SQ', Name => 'ViewModifierCodeSequence' }, + '0054,0300' => { VR => 'SQ', Name => 'RadionuclideCodeSequence' }, + '0054,0302' => { VR => 'SQ', Name => 'AdministrationRouteCodeSequence' }, + '0054,0304' => { VR => 'SQ', Name => 'RadiopharmaceuticalCodeSequence' }, + '0054,0306' => { VR => 'SQ', Name => 'CalibrationDataSequence' }, + '0054,0308' => { VR => 'US', Name => 'EnergyWindowNumber' }, + '0054,0400' => { VR => 'SH', Name => 'ImageID' }, + '0054,0410' => { VR => 'SQ', Name => 'PatientOrientationCodeSequence' }, + '0054,0412' => { VR => 'SQ', Name => 'PatientOrientationModifierCodeSeq' }, + '0054,0414' => { VR => 'SQ', Name => 'PatientGantryRelationshipCodeSeq' }, + '0054,0500' => { VR => 'CS', Name => 'SliceProgressionDirection' }, + '0054,1000' => { VR => 'CS', Name => 'SeriesType' }, + '0054,1001' => { VR => 'CS', Name => 'Units' }, + '0054,1002' => { VR => 'CS', Name => 'CountsSource' }, + '0054,1004' => { VR => 'CS', Name => 'ReprojectionMethod' }, + '0054,1100' => { VR => 'CS', Name => 'RandomsCorrectionMethod' }, + '0054,1101' => { VR => 'LO', Name => 'AttenuationCorrectionMethod' }, + '0054,1102' => { VR => 'CS', Name => 'DecayCorrection' }, + '0054,1103' => { VR => 'LO', Name => 'ReconstructionMethod' }, + '0054,1104' => { VR => 'LO', Name => 'DetectorLinesOfResponseUsed' }, + '0054,1105' => { VR => 'LO', Name => 'ScatterCorrectionMethod' }, + '0054,1200' => { VR => 'DS', Name => 'AxialAcceptance' }, + '0054,1201' => { VR => 'IS', Name => 'AxialMash' }, + '0054,1202' => { VR => 'IS', Name => 'TransverseMash' }, + '0054,1203' => { VR => 'DS', Name => 'DetectorElementSize' }, + '0054,1210' => { VR => 'DS', Name => 'CoincidenceWindowWidth' }, + '0054,1220' => { VR => 'CS', Name => 'SecondaryCountsType' }, + '0054,1300' => { VR => 'DS', Name => 'FrameReferenceTime' }, + '0054,1310' => { VR => 'IS', Name => 'PrimaryCountsAccumulated' }, + '0054,1311' => { VR => 'IS', Name => 'SecondaryCountsAccumulated' }, + '0054,1320' => { VR => 'DS', Name => 'SliceSensitivityFactor' }, + '0054,1321' => { VR => 'DS', Name => 'DecayFactor' }, + '0054,1322' => { VR => 'DS', Name => 'DoseCalibrationFactor' }, + '0054,1323' => { VR => 'DS', Name => 'ScatterFractionFactor' }, + '0054,1324' => { VR => 'DS', Name => 'DeadTimeFactor' }, + '0054,1330' => { VR => 'US', Name => 'ImageIndex' }, + '0054,1400' => { VR => 'CS', Name => 'CountsIncluded' }, + '0054,1401' => { VR => 'CS', Name => 'DeadTimeCorrectionFlag' }, + '0060,3000' => { VR => 'SQ', Name => 'HistogramSequence' }, + '0060,3002' => { VR => 'US', Name => 'HistogramNumberOfBins' }, + '0060,3004' => { VR => 'US', Name => 'HistogramFirstBinValue' }, + '0060,3006' => { VR => 'US', Name => 'HistogramLastBinValue' }, + '0060,3008' => { VR => 'US', Name => 'HistogramBinWidth' }, + '0060,3010' => { VR => 'LO', Name => 'HistogramExplanation' }, + '0060,3020' => { VR => 'UL', Name => 'HistogramData' }, + '0062,0001' => { VR => 'CS', Name => 'SegmentationType' }, + '0062,0002' => { VR => 'SQ', Name => 'SegmentSequence' }, + '0062,0003' => { VR => 'SQ', Name => 'SegmentedPropertyCategoryCodeSeq' }, + '0062,0004' => { VR => 'US', Name => 'SegmentNumber' }, + '0062,0005' => { VR => 'LO', Name => 'SegmentLabel' }, + '0062,0006' => { VR => 'ST', Name => 'SegmentDescription' }, + '0062,0008' => { VR => 'CS', Name => 'SegmentAlgorithmType' }, + '0062,0009' => { VR => 'LO', Name => 'SegmentAlgorithmName' }, + '0062,000A' => { VR => 'SQ', Name => 'SegmentIdentificationSequence' }, + '0062,000B' => { VR => 'US', Name => 'ReferencedSegmentNumber' }, + '0062,000C' => { VR => 'US', Name => 'RecommendedDisplayGrayscaleValue' }, + '0062,000D' => { VR => 'US', Name => 'RecommendedDisplayCIELabValue' }, + '0062,000E' => { VR => 'US', Name => 'MaximumFractionalValue' }, + '0062,000F' => { VR => 'SQ', Name => 'SegmentedPropertyTypeCodeSequence' }, + '0062,0010' => { VR => 'CS', Name => 'SegmentationFractionalType' }, + '0064,0002' => { VR => 'SQ', Name => 'DeformableRegistrationSequence' }, + '0064,0003' => { VR => 'UI', Name => 'SourceFrameOfReferenceUID' }, + '0064,0005' => { VR => 'SQ', Name => 'DeformableRegistrationGridSequence' }, + '0064,0007' => { VR => 'UL', Name => 'GridDimensions' }, + '0064,0008' => { VR => 'FD', Name => 'GridResolution' }, + '0064,0009' => { VR => 'OF', Name => 'VectorGridData' }, + '0064,000F' => { VR => 'SQ', Name => 'PreDeformationMatrixRegistSeq' }, + '0064,0010' => { VR => 'SQ', Name => 'PostDeformationMatrixRegistSeq' }, + '0066,0001' => { VR => 'UL', Name => 'NumberOfSurfaces' }, + '0066,0002' => { VR => 'SQ', Name => 'SurfaceSequence' }, + '0066,0003' => { VR => 'UL', Name => 'SurfaceNumber' }, + '0066,0004' => { VR => 'LT', Name => 'SurfaceComments' }, + '0066,0009' => { VR => 'CS', Name => 'SurfaceProcessing' }, + '0066,000A' => { VR => 'FL', Name => 'SurfaceProcessingRatio' }, + '0066,000E' => { VR => 'CS', Name => 'FiniteVolume' }, + '0066,0010' => { VR => 'CS', Name => 'Manifold' }, + '0066,0011' => { VR => 'SQ', Name => 'SurfacePointsSequence' }, + '0066,0015' => { VR => 'UL', Name => 'NumberOfSurfacePoints' }, + '0066,0016' => { VR => 'OF', Name => 'PointCoordinatesData' }, + '0066,0017' => { VR => 'FL', Name => 'PointPositionAccuracy' }, + '0066,0018' => { VR => 'FL', Name => 'MeanPointDistance' }, + '0066,0019' => { VR => 'FL', Name => 'MaximumPointDistance' }, + '0066,001B' => { VR => 'FL', Name => 'AxisOfRotation' }, + '0066,001C' => { VR => 'FL', Name => 'CenterOfRotation' }, + '0066,001E' => { VR => 'UL', Name => 'NumberOfVectors' }, + '0066,001F' => { VR => 'US', Name => 'VectorDimensionality' }, + '0066,0020' => { VR => 'FL', Name => 'VectorAccuracy' }, + '0066,0021' => { VR => 'OF', Name => 'VectorCoordinateData' }, + '0066,0023' => { VR => 'OW', Name => 'TrianglePointIndexList' }, + '0066,0024' => { VR => 'OW', Name => 'EdgePointIndexList' }, + '0066,0025' => { VR => 'OW', Name => 'VertexPointIndexList' }, + '0066,0026' => { VR => 'SQ', Name => 'TriangleStripSequence' }, + '0066,0027' => { VR => 'SQ', Name => 'TriangleFanSequence' }, + '0066,0028' => { VR => 'SQ', Name => 'LineSequence' }, + '0066,0029' => { VR => 'OW', Name => 'PrimitivePointIndexList' }, + '0066,002A' => { VR => 'UL', Name => 'SurfaceCount' }, + '0066,002F' => { VR => 'SQ', Name => 'AlgorithmFamilyCodeSequ' }, + '0066,0031' => { VR => 'LO', Name => 'AlgorithmVersion' }, + '0066,0032' => { VR => 'LT', Name => 'AlgorithmParameters' }, + '0066,0034' => { VR => 'SQ', Name => 'FacetSequence' }, + '0066,0036' => { VR => 'LO', Name => 'AlgorithmName' }, + '0070,0001' => { VR => 'SQ', Name => 'GraphicAnnotationSequence' }, + '0070,0002' => { VR => 'CS', Name => 'GraphicLayer' }, + '0070,0003' => { VR => 'CS', Name => 'BoundingBoxAnnotationUnits' }, + '0070,0004' => { VR => 'CS', Name => 'AnchorPointAnnotationUnits' }, + '0070,0005' => { VR => 'CS', Name => 'GraphicAnnotationUnits' }, + '0070,0006' => { VR => 'ST', Name => 'UnformattedTextValue' }, + '0070,0008' => { VR => 'SQ', Name => 'TextObjectSequence' }, + '0070,0009' => { VR => 'SQ', Name => 'GraphicObjectSequence' }, + '0070,0010' => { VR => 'FL', Name => 'BoundingBoxTopLeftHandCorner' }, + '0070,0011' => { VR => 'FL', Name => 'BoundingBoxBottomRightHandCorner' }, + '0070,0012' => { VR => 'CS', Name => 'BoundingBoxTextHorizJustification' }, + '0070,0014' => { VR => 'FL', Name => 'AnchorPoint' }, + '0070,0015' => { VR => 'CS', Name => 'AnchorPointVisibility' }, + '0070,0020' => { VR => 'US', Name => 'GraphicDimensions' }, + '0070,0021' => { VR => 'US', Name => 'NumberOfGraphicPoints' }, + '0070,0022' => { VR => 'FL', Name => 'GraphicData' }, + '0070,0023' => { VR => 'CS', Name => 'GraphicType' }, + '0070,0024' => { VR => 'CS', Name => 'GraphicFilled' }, + '0070,0040' => { VR => 'IS', Name => 'ImageRotationRetired' }, + '0070,0041' => { VR => 'CS', Name => 'ImageHorizontalFlip' }, + '0070,0042' => { VR => 'US', Name => 'ImageRotation' }, + '0070,0050' => { VR => 'US', Name => 'DisplayedAreaTopLeftTrial' }, + '0070,0051' => { VR => 'US', Name => 'DisplayedAreaBottomRightTrial' }, + '0070,0052' => { VR => 'SL', Name => 'DisplayedAreaTopLeft' }, + '0070,0053' => { VR => 'SL', Name => 'DisplayedAreaBottomRight' }, + '0070,005A' => { VR => 'SQ', Name => 'DisplayedAreaSelectionSequence' }, + '0070,0060' => { VR => 'SQ', Name => 'GraphicLayerSequence' }, + '0070,0062' => { VR => 'IS', Name => 'GraphicLayerOrder' }, + '0070,0066' => { VR => 'US', Name => 'GraphicLayerRecDisplayGraysclValue' }, + '0070,0067' => { VR => 'US', Name => 'GraphicLayerRecDisplayRGBValue' }, + '0070,0068' => { VR => 'LO', Name => 'GraphicLayerDescription' }, + '0070,0080' => { VR => 'CS', Name => 'ContentLabel' }, + '0070,0081' => { VR => 'LO', Name => 'ContentDescription' }, + '0070,0082' => { VR => 'DA', Name => 'PresentationCreationDate' }, + '0070,0083' => { VR => 'TM', Name => 'PresentationCreationTime' }, + '0070,0084' => { VR => 'PN', Name => 'ContentCreatorName' }, + '0070,0086' => { VR => 'SQ', Name => 'ContentCreatorIDCodeSequence' }, + '0070,0100' => { VR => 'CS', Name => 'PresentationSizeMode' }, + '0070,0101' => { VR => 'DS', Name => 'PresentationPixelSpacing' }, + '0070,0102' => { VR => 'IS', Name => 'PresentationPixelAspectRatio' }, + '0070,0103' => { VR => 'FL', Name => 'PresentationPixelMagRatio' }, + '0070,0306' => { VR => 'CS', Name => 'ShapeType' }, + '0070,0308' => { VR => 'SQ', Name => 'RegistrationSequence' }, + '0070,0309' => { VR => 'SQ', Name => 'MatrixRegistrationSequence' }, + '0070,030A' => { VR => 'SQ', Name => 'MatrixSequence' }, + '0070,030C' => { VR => 'CS', Name => 'FrameOfRefTransformationMatrixType' }, + '0070,030D' => { VR => 'SQ', Name => 'RegistrationTypeCodeSequence' }, + '0070,030F' => { VR => 'ST', Name => 'FiducialDescription' }, + '0070,0310' => { VR => 'SH', Name => 'FiducialIdentifier' }, + '0070,0311' => { VR => 'SQ', Name => 'FiducialIdentifierCodeSequence' }, + '0070,0312' => { VR => 'FD', Name => 'ContourUncertaintyRadius' }, + '0070,0314' => { VR => 'SQ', Name => 'UsedFiducialsSequence' }, + '0070,0318' => { VR => 'SQ', Name => 'GraphicCoordinatesDataSequence' }, + '0070,031A' => { VR => 'UI', Name => 'FiducialUID' }, + '0070,031C' => { VR => 'SQ', Name => 'FiducialSetSequence' }, + '0070,031E' => { VR => 'SQ', Name => 'FiducialSequence' }, + '0070,0401' => { VR => 'US', Name => 'GraphicLayerRecomDisplayCIELabVal' }, + '0070,0402' => { VR => 'SQ', Name => 'BlendingSequence' }, + '0070,0403' => { VR => 'FL', Name => 'RelativeOpacity' }, + '0070,0404' => { VR => 'SQ', Name => 'ReferencedSpatialRegistrationSeq' }, + '0070,0405' => { VR => 'CS', Name => 'BlendingPosition' }, + '0072,0002' => { VR => 'SH', Name => 'HangingProtocolName' }, + '0072,0004' => { VR => 'LO', Name => 'HangingProtocolDescription' }, + '0072,0006' => { VR => 'CS', Name => 'HangingProtocolLevel' }, + '0072,0008' => { VR => 'LO', Name => 'HangingProtocolCreator' }, + '0072,000A' => { VR => 'DT', Name => 'HangingProtocolCreationDateTime' }, + '0072,000C' => { VR => 'SQ', Name => 'HangingProtocolDefinitionSequence' }, + '0072,000E' => { VR => 'SQ', Name => 'HangingProtocolUserIDCodeSequence' }, + '0072,0010' => { VR => 'LO', Name => 'HangingProtocolUserGroupName' }, + '0072,0012' => { VR => 'SQ', Name => 'SourceHangingProtocolSequence' }, + '0072,0014' => { VR => 'US', Name => 'NumberOfPriorsReferenced' }, + '0072,0020' => { VR => 'SQ', Name => 'ImageSetsSequence' }, + '0072,0022' => { VR => 'SQ', Name => 'ImageSetSelectorSequence' }, + '0072,0024' => { VR => 'CS', Name => 'ImageSetSelectorUsageFlag' }, + '0072,0026' => { VR => 'AT', Name => 'SelectorAttribute' }, + '0072,0028' => { VR => 'US', Name => 'SelectorValueNumber' }, + '0072,0030' => { VR => 'SQ', Name => 'TimeBasedImageSetsSequence' }, + '0072,0032' => { VR => 'US', Name => 'ImageSetNumber' }, + '0072,0034' => { VR => 'CS', Name => 'ImageSetSelectorCategory' }, + '0072,0038' => { VR => 'US', Name => 'RelativeTime' }, + '0072,003A' => { VR => 'CS', Name => 'RelativeTimeUnits' }, + '0072,003C' => { VR => 'SS', Name => 'AbstractPriorValue' }, + '0072,003E' => { VR => 'SQ', Name => 'AbstractPriorCodeSequence' }, + '0072,0040' => { VR => 'LO', Name => 'ImageSetLabel' }, + '0072,0050' => { VR => 'CS', Name => 'SelectorAttributeVR' }, + '0072,0052' => { VR => 'AT', Name => 'SelectorSequencePointer' }, + '0072,0054' => { VR => 'LO', Name => 'SelectorSeqPointerPrivateCreator' }, + '0072,0056' => { VR => 'LO', Name => 'SelectorAttributePrivateCreator' }, + '0072,0060' => { VR => 'AT', Name => 'SelectorATValue' }, + '0072,0062' => { VR => 'CS', Name => 'SelectorCSValue' }, + '0072,0064' => { VR => 'IS', Name => 'SelectorISValue' }, + '0072,0066' => { VR => 'LO', Name => 'SelectorLOValue' }, + '0072,0068' => { VR => 'LT', Name => 'SelectorLTValue' }, + '0072,006A' => { VR => 'PN', Name => 'SelectorPNValue' }, + '0072,006C' => { VR => 'SH', Name => 'SelectorSHValue' }, + '0072,006E' => { VR => 'ST', Name => 'SelectorSTValue' }, + '0072,0070' => { VR => 'UT', Name => 'SelectorUTValue' }, + '0072,0072' => { VR => 'DS', Name => 'SelectorDSValue' }, + '0072,0074' => { VR => 'FD', Name => 'SelectorFDValue' }, + '0072,0076' => { VR => 'FL', Name => 'SelectorFLValue' }, + '0072,0078' => { VR => 'UL', Name => 'SelectorULValue' }, + '0072,007A' => { VR => 'US', Name => 'SelectorUSValue' }, + '0072,007C' => { VR => 'SL', Name => 'SelectorSLValue' }, + '0072,007E' => { VR => 'SS', Name => 'SelectorSSValue' }, + '0072,0080' => { VR => 'SQ', Name => 'SelectorCodeSequenceValue' }, + '0072,0100' => { VR => 'US', Name => 'NumberOfScreens' }, + '0072,0102' => { VR => 'SQ', Name => 'NominalScreenDefinitionSequence' }, + '0072,0104' => { VR => 'US', Name => 'NumberOfVerticalPixels' }, + '0072,0106' => { VR => 'US', Name => 'NumberOfHorizontalPixels' }, + '0072,0108' => { VR => 'FD', Name => 'DisplayEnvironmentSpatialPosition' }, + '0072,010A' => { VR => 'US', Name => 'ScreenMinimumGrayscaleBitDepth' }, + '0072,010C' => { VR => 'US', Name => 'ScreenMinimumColorBitDepth' }, + '0072,010E' => { VR => 'US', Name => 'ApplicationMaximumRepaintTime' }, + '0072,0200' => { VR => 'SQ', Name => 'DisplaySetsSequence' }, + '0072,0202' => { VR => 'US', Name => 'DisplaySetNumber' }, + '0072,0203' => { VR => 'LO', Name => 'DisplaySetLabel' }, + '0072,0204' => { VR => 'US', Name => 'DisplaySetPresentationGroup' }, + '0072,0206' => { VR => 'LO', Name => 'DisplaySetPresentationGroupDescr' }, + '0072,0208' => { VR => 'CS', Name => 'PartialDataDisplayHandling' }, + '0072,0210' => { VR => 'SQ', Name => 'SynchronizedScrollingSequence' }, + '0072,0212' => { VR => 'US', Name => 'DisplaySetScrollingGroup' }, + '0072,0214' => { VR => 'SQ', Name => 'NavigationIndicatorSequence' }, + '0072,0216' => { VR => 'US', Name => 'NavigationDisplaySet' }, + '0072,0218' => { VR => 'US', Name => 'ReferenceDisplaySets' }, + '0072,0300' => { VR => 'SQ', Name => 'ImageBoxesSequence' }, + '0072,0302' => { VR => 'US', Name => 'ImageBoxNumber' }, + '0072,0304' => { VR => 'CS', Name => 'ImageBoxLayoutType' }, + '0072,0306' => { VR => 'US', Name => 'ImageBoxTileHorizontalDimension' }, + '0072,0308' => { VR => 'US', Name => 'ImageBoxTileVerticalDimension' }, + '0072,0310' => { VR => 'CS', Name => 'ImageBoxScrollDirection' }, + '0072,0312' => { VR => 'CS', Name => 'ImageBoxSmallScrollType' }, + '0072,0314' => { VR => 'US', Name => 'ImageBoxSmallScrollAmount' }, + '0072,0316' => { VR => 'CS', Name => 'ImageBoxLargeScrollType' }, + '0072,0318' => { VR => 'US', Name => 'ImageBoxLargeScrollAmount' }, + '0072,0320' => { VR => 'US', Name => 'ImageBoxOverlapPriority' }, + '0072,0330' => { VR => 'FD', Name => 'CineRelativeToRealTime' }, + '0072,0400' => { VR => 'SQ', Name => 'FilterOperationsSequence' }, + '0072,0402' => { VR => 'CS', Name => 'FilterByCategory' }, + '0072,0404' => { VR => 'CS', Name => 'FilterByAttributePresence' }, + '0072,0406' => { VR => 'CS', Name => 'FilterByOperator' }, + '0072,0432' => { VR => 'US', Name => 'SynchronizedImageBoxList' }, + '0072,0434' => { VR => 'CS', Name => 'TypeOfSynchronization' }, + '0072,0500' => { VR => 'CS', Name => 'BlendingOperationType' }, + '0072,0510' => { VR => 'CS', Name => 'ReformattingOperationType' }, + '0072,0512' => { VR => 'FD', Name => 'ReformattingThickness' }, + '0072,0514' => { VR => 'FD', Name => 'ReformattingInterval' }, + '0072,0516' => { VR => 'CS', Name => 'ReformattingOpInitialViewDir' }, + '0072,0520' => { VR => 'CS', Name => 'RenderingType3D' }, + '0072,0600' => { VR => 'SQ', Name => 'SortingOperationsSequence' }, + '0072,0602' => { VR => 'CS', Name => 'SortByCategory' }, + '0072,0604' => { VR => 'CS', Name => 'SortingDirection' }, + '0072,0700' => { VR => 'CS', Name => 'DisplaySetPatientOrientation' }, + '0072,0702' => { VR => 'CS', Name => 'VOIType' }, + '0072,0704' => { VR => 'CS', Name => 'PseudoColorType' }, + '0072,0706' => { VR => 'CS', Name => 'ShowGrayscaleInverted' }, + '0072,0710' => { VR => 'CS', Name => 'ShowImageTrueSizeFlag' }, + '0072,0712' => { VR => 'CS', Name => 'ShowGraphicAnnotationFlag' }, + '0072,0714' => { VR => 'CS', Name => 'ShowPatientDemographicsFlag' }, + '0072,0716' => { VR => 'CS', Name => 'ShowAcquisitionTechniquesFlag' }, + '0072,0717' => { VR => 'CS', Name => 'DisplaySetHorizontalJustification' }, + '0072,0718' => { VR => 'CS', Name => 'DisplaySetVerticalJustification' }, + '0074,1000' => { VR => 'CS', Name => 'UnifiedProcedureStepState' }, + '0074,1002' => { VR => 'SQ', Name => 'UPSProgressInformationSequence' }, + '0074,1004' => { VR => 'DS', Name => 'UnifiedProcedureStepProgress' }, + '0074,1006' => { VR => 'ST', Name => 'UnifiedProcedureStepProgressDescr' }, + '0074,1008' => { VR => 'SQ', Name => 'UnifiedProcedureStepComURISeq' }, + '0074,100a' => { VR => 'ST', Name => 'ContactURI' }, + '0074,100c' => { VR => 'LO', Name => 'ContactDisplayName' }, + '0074,1020' => { VR => 'SQ', Name => 'BeamTaskSequence' }, + '0074,1022' => { VR => 'CS', Name => 'BeamTaskType' }, + '0074,1024' => { VR => 'IS', Name => 'BeamOrderIndex' }, + '0074,1030' => { VR => 'SQ', Name => 'DeliveryVerificationImageSequence' }, + '0074,1032' => { VR => 'CS', Name => 'VerificationImageTiming' }, + '0074,1034' => { VR => 'CS', Name => 'DoubleExposureFlag' }, + '0074,1036' => { VR => 'CS', Name => 'DoubleExposureOrdering' }, + '0074,1038' => { VR => 'DS', Name => 'DoubleExposureMeterset' }, + '0074,103A' => { VR => 'DS', Name => 'DoubleExposureFieldDelta' }, + '0074,1040' => { VR => 'SQ', Name => 'RelatedReferenceRTImageSequence' }, + '0074,1042' => { VR => 'SQ', Name => 'GeneralMachineVerificationSequence' }, + '0074,1044' => { VR => 'SQ', Name => 'ConventionalMachineVerificationSeq' }, + '0074,1046' => { VR => 'SQ', Name => 'IonMachineVerificationSequence' }, + '0074,1048' => { VR => 'SQ', Name => 'FailedAttributesSequence' }, + '0074,104A' => { VR => 'SQ', Name => 'OverriddenAttributesSequence' }, + '0074,104C' => { VR => 'SQ', Name => 'ConventionalControlPointVerifySeq' }, + '0074,104E' => { VR => 'SQ', Name => 'IonControlPointVerificationSeq' }, + '0074,1050' => { VR => 'SQ', Name => 'AttributeOccurrenceSequence' }, + '0074,1052' => { VR => 'AT', Name => 'AttributeOccurrencePointer' }, + '0074,1054' => { VR => 'UL', Name => 'AttributeItemSelector' }, + '0074,1056' => { VR => 'LO', Name => 'AttributeOccurrencePrivateCreator' }, + '0074,1200' => { VR => 'CS', Name => 'ScheduledProcedureStepPriority' }, + '0074,1202' => { VR => 'LO', Name => 'WorklistLabel' }, + '0074,1204' => { VR => 'LO', Name => 'ProcedureStepLabel' }, + '0074,1210' => { VR => 'SQ', Name => 'ScheduledProcessingParametersSeq' }, + '0074,1212' => { VR => 'SQ', Name => 'PerformedProcessingParametersSeq' }, + '0074,1216' => { VR => 'SQ', Name => 'UPSPerformedProcedureSequence' }, + '0074,1220' => { VR => 'SQ', Name => 'RelatedProcedureStepSequence' }, + '0074,1222' => { VR => 'LO', Name => 'ProcedureStepRelationshipType' }, + '0074,1230' => { VR => 'LO', Name => 'DeletionLock' }, + '0074,1234' => { VR => 'AE', Name => 'ReceivingAE' }, + '0074,1236' => { VR => 'AE', Name => 'RequestingAE' }, + '0074,1238' => { VR => 'LT', Name => 'ReasonForCancellation' }, + '0074,1242' => { VR => 'CS', Name => 'SCPStatus' }, + '0074,1244' => { VR => 'CS', Name => 'SubscriptionListStatus' }, + '0074,1246' => { VR => 'CS', Name => 'UPSListStatus' }, + # storage group + '0088,0130' => { VR => 'SH', Name => 'StorageMediaFileSetID' }, + '0088,0140' => { VR => 'UI', Name => 'StorageMediaFileSetUID' }, + '0088,0200' => { VR => 'SQ', Name => 'IconImageSequence' }, + '0088,0904' => { VR => 'LO', Name => 'TopicTitle' }, + '0088,0906' => { VR => 'ST', Name => 'TopicSubject' }, + '0088,0910' => { VR => 'LO', Name => 'TopicAuthor' }, + '0088,0912' => { VR => 'LO', Name => 'TopicKeywords' }, + '0100,0410' => { VR => 'CS', Name => 'SOPInstanceStatus' }, + '0100,0420' => { VR => 'DT', Name => 'SOPAuthorizationDateAndTime' }, + '0100,0424' => { VR => 'LT', Name => 'SOPAuthorizationComment' }, + '0100,0426' => { VR => 'LO', Name => 'AuthorizationEquipmentCertNumber' }, + '0400,0005' => { VR => 'US', Name => 'MACIDNumber' }, + '0400,0010' => { VR => 'UI', Name => 'MACCalculationTransferSyntaxUID' }, + '0400,0015' => { VR => 'CS', Name => 'MACAlgorithm' }, + '0400,0020' => { VR => 'AT', Name => 'DataElementsSigned' }, + '0400,0100' => { VR => 'UI', Name => 'DigitalSignatureUID' }, + '0400,0105' => { VR => 'DT', Name => 'DigitalSignatureDateTime' }, + '0400,0110' => { VR => 'CS', Name => 'CertificateType' }, + '0400,0115' => { VR => 'OB', Name => 'CertificateOfSigner' }, + '0400,0120' => { VR => 'OB', Name => 'Signature' }, + '0400,0305' => { VR => 'CS', Name => 'CertifiedTimestampType' }, + '0400,0310' => { VR => 'OB', Name => 'CertifiedTimestamp' }, + '0400,0401' => { VR => 'SQ', Name => 'DigitalSignaturePurposeCodeSeq' }, + '0400,0402' => { VR => 'SQ', Name => 'ReferencedDigitalSignatureSeq' }, + '0400,0403' => { VR => 'SQ', Name => 'ReferencedSOPInstanceMACSeq' }, + '0400,0404' => { VR => 'OB', Name => 'MAC' }, + '0400,0500' => { VR => 'SQ', Name => 'EncryptedAttributesSequence' }, + '0400,0510' => { VR => 'UI', Name => 'EncryptedContentTransferSyntaxUID' }, + '0400,0520' => { VR => 'OB', Name => 'EncryptedContent' }, + '0400,0550' => { VR => 'SQ', Name => 'ModifiedAttributesSequence' }, + '0400,0561' => { VR => 'SQ', Name => 'OriginalAttributesSequence' }, + '0400,0562' => { VR => 'DT', Name => 'AttributeModificationDateTime' }, + '0400,0563' => { VR => 'LO', Name => 'ModifyingSystem' }, + '0400,0564' => { VR => 'LO', Name => 'SourceOfPreviousValues' }, + '0400,0565' => { VR => 'CS', Name => 'ReasonForTheAttributeModification' }, + '1000,xxx0' => { VR => 'US', Name => 'EscapeTriplet' }, + '1000,xxx1' => { VR => 'US', Name => 'RunLengthTriplet' }, + '1000,xxx2' => { VR => 'US', Name => 'HuffmanTableSize' }, + '1000,xxx3' => { VR => 'US', Name => 'HuffmanTableTriplet' }, + '1000,xxx4' => { VR => 'US', Name => 'ShiftTableSize' }, + '1000,xxx5' => { VR => 'US', Name => 'ShiftTableTriplet' }, + '1010,xxxx' => { VR => 'US', Name => 'ZonalMap' }, + '2000,0010' => { VR => 'IS', Name => 'NumberOfCopies' }, + '2000,001E' => { VR => 'SQ', Name => 'PrinterConfigurationSequence' }, + '2000,0020' => { VR => 'CS', Name => 'PrintPriority' }, + '2000,0030' => { VR => 'CS', Name => 'MediumType' }, + '2000,0040' => { VR => 'CS', Name => 'FilmDestination' }, + '2000,0050' => { VR => 'LO', Name => 'FilmSessionLabel' }, + '2000,0060' => { VR => 'IS', Name => 'MemoryAllocation' }, + '2000,0061' => { VR => 'IS', Name => 'MaximumMemoryAllocation' }, + '2000,0062' => { VR => 'CS', Name => 'ColorImagePrintingFlag' }, + '2000,0063' => { VR => 'CS', Name => 'CollationFlag' }, + '2000,0065' => { VR => 'CS', Name => 'AnnotationFlag' }, + '2000,0067' => { VR => 'CS', Name => 'ImageOverlayFlag' }, + '2000,0069' => { VR => 'CS', Name => 'PresentationLUTFlag' }, + '2000,006A' => { VR => 'CS', Name => 'ImageBoxPresentationLUTFlag' }, + '2000,00A0' => { VR => 'US', Name => 'MemoryBitDepth' }, + '2000,00A1' => { VR => 'US', Name => 'PrintingBitDepth' }, + '2000,00A2' => { VR => 'SQ', Name => 'MediaInstalledSequence' }, + '2000,00A4' => { VR => 'SQ', Name => 'OtherMediaAvailableSequence' }, + '2000,00A8' => { VR => 'SQ', Name => 'SupportedImageDisplayFormatSeq' }, + '2000,0500' => { VR => 'SQ', Name => 'ReferencedFilmBoxSequence' }, + '2000,0510' => { VR => 'SQ', Name => 'ReferencedStoredPrintSequence' }, + # film box group + '2010,0010' => { VR => 'ST', Name => 'ImageDisplayFormat' }, + '2010,0030' => { VR => 'CS', Name => 'AnnotationDisplayFormatID' }, + '2010,0040' => { VR => 'CS', Name => 'FilmOrientation' }, + '2010,0050' => { VR => 'CS', Name => 'FilmSizeID' }, + '2010,0052' => { VR => 'CS', Name => 'PrinterResolutionID' }, + '2010,0054' => { VR => 'CS', Name => 'DefaultPrinterResolutionID' }, + '2010,0060' => { VR => 'CS', Name => 'MagnificationType' }, + '2010,0080' => { VR => 'CS', Name => 'SmoothingType' }, + '2010,00A6' => { VR => 'CS', Name => 'DefaultMagnificationType' }, + '2010,00A7' => { VR => 'CS', Name => 'OtherMagnificationTypesAvailable' }, + '2010,00A8' => { VR => 'CS', Name => 'DefaultSmoothingType' }, + '2010,00A9' => { VR => 'CS', Name => 'OtherSmoothingTypesAvailable' }, + '2010,0100' => { VR => 'CS', Name => 'BorderDensity' }, + '2010,0110' => { VR => 'CS', Name => 'EmptyImageDensity' }, + '2010,0120' => { VR => 'US', Name => 'MinDensity' }, + '2010,0130' => { VR => 'US', Name => 'MaxDensity' }, + '2010,0140' => { VR => 'CS', Name => 'Trim' }, + '2010,0150' => { VR => 'ST', Name => 'ConfigurationInformation' }, + '2010,0152' => { VR => 'LT', Name => 'ConfigurationInformationDescr' }, + '2010,0154' => { VR => 'IS', Name => 'MaximumCollatedFilms' }, + '2010,015E' => { VR => 'US', Name => 'Illumination' }, + '2010,0160' => { VR => 'US', Name => 'ReflectedAmbientLight' }, + '2010,0376' => { VR => 'DS', Name => 'PrinterPixelSpacing' }, + '2010,0500' => { VR => 'SQ', Name => 'ReferencedFilmSessionSequence' }, + '2010,0510' => { VR => 'SQ', Name => 'ReferencedImageBoxSequence' }, + '2010,0520' => { VR => 'SQ', Name => 'ReferencedBasicAnnotationBoxSeq' }, + # image box group + '2020,0010' => { VR => 'US', Name => 'ImageBoxPosition' }, + '2020,0020' => { VR => 'CS', Name => 'Polarity' }, + '2020,0030' => { VR => 'DS', Name => 'RequestedImageSize' }, + '2020,0040' => { VR => 'CS', Name => 'RequestedDecimate-CropBehavior' }, + '2020,0050' => { VR => 'CS', Name => 'RequestedResolutionID' }, + '2020,00A0' => { VR => 'CS', Name => 'RequestedImageSizeFlag' }, + '2020,00A2' => { VR => 'CS', Name => 'DecimateCropResult' }, + '2020,0110' => { VR => 'SQ', Name => 'BasicGrayscaleImageSequence' }, + '2020,0111' => { VR => 'SQ', Name => 'BasicColorImageSequence' }, + '2020,0130' => { VR => 'SQ', Name => 'ReferencedImageOverlayBoxSequence' }, + '2020,0140' => { VR => 'SQ', Name => 'ReferencedVOILUTBoxSequence' }, + # annotation group + '2030,0010' => { VR => 'US', Name => 'AnnotationPosition' }, + '2030,0020' => { VR => 'LO', Name => 'TextString' }, + # overlay box group + '2040,0010' => { VR => 'SQ', Name => 'ReferencedOverlayPlaneSequence' }, + '2040,0011' => { VR => 'US', Name => 'ReferencedOverlayPlaneGroups' }, + '2040,0020' => { VR => 'SQ', Name => 'OverlayPixelDataSequence' }, + '2040,0060' => { VR => 'CS', Name => 'OverlayMagnificationType' }, + '2040,0070' => { VR => 'CS', Name => 'OverlaySmoothingType' }, + '2040,0072' => { VR => 'CS', Name => 'OverlayOrImageMagnification' }, + '2040,0074' => { VR => 'US', Name => 'MagnifyToNumberOfColumns' }, + '2040,0080' => { VR => 'CS', Name => 'OverlayForegroundDensity' }, + '2040,0082' => { VR => 'CS', Name => 'OverlayBackgroundDensity' }, + '2040,0090' => { VR => 'CS', Name => 'OverlayMode' }, + '2040,0100' => { VR => 'CS', Name => 'ThresholdDensity' }, + '2040,0500' => { VR => 'SQ', Name => 'ReferencedImageBoxSequence' }, + '2050,0010' => { VR => 'SQ', Name => 'PresentationLUTSequence' }, + '2050,0020' => { VR => 'CS', Name => 'PresentationLUTShape' }, + '2050,0500' => { VR => 'SQ', Name => 'ReferencedPresentationLUTSequence' }, + '2100,0010' => { VR => 'SH', Name => 'PrintJobID' }, + '2100,0020' => { VR => 'CS', Name => 'ExecutionStatus' }, + '2100,0030' => { VR => 'CS', Name => 'ExecutionStatusInfo' }, + '2100,0040' => { VR => 'DA', Name => 'CreationDate' }, + '2100,0050' => { VR => 'TM', Name => 'CreationTime' }, + '2100,0070' => { VR => 'AE', Name => 'Originator' }, + '2100,0140' => { VR => 'AE', Name => 'DestinationAE' }, + '2100,0160' => { VR => 'SH', Name => 'OwnerID' }, + '2100,0170' => { VR => 'IS', Name => 'NumberOfFilms' }, + '2100,0500' => { VR => 'SQ', Name => 'ReferencedPrintJobSequence' }, + # printer group + '2110,0010' => { VR => 'CS', Name => 'PrinterStatus' }, + '2110,0020' => { VR => 'CS', Name => 'PrinterStatusInfo' }, + '2110,0030' => { VR => 'LO', Name => 'PrinterName' }, + '2110,0099' => { VR => 'SH', Name => 'PrintQueueID' }, + '2120,0010' => { VR => 'CS', Name => 'QueueStatus' }, + # print job group + '2120,0050' => { VR => 'SQ', Name => 'PrintJobDescriptionSequence' }, + '2120,0070' => { VR => 'SQ', Name => 'ReferencedPrintJobSequence' }, + '2130,0010' => { VR => 'SQ', Name => 'PrintManagementCapabilitiesSeq' }, + '2130,0015' => { VR => 'SQ', Name => 'PrinterCharacteristicsSequence' }, + '2130,0030' => { VR => 'SQ', Name => 'FilmBoxContentSequence' }, + '2130,0040' => { VR => 'SQ', Name => 'ImageBoxContentSequence' }, + '2130,0050' => { VR => 'SQ', Name => 'AnnotationContentSequence' }, + '2130,0060' => { VR => 'SQ', Name => 'ImageOverlayBoxContentSequence' }, + '2130,0080' => { VR => 'SQ', Name => 'PresentationLUTContentSequence' }, + '2130,00A0' => { VR => 'SQ', Name => 'ProposedStudySequence' }, + '2130,00C0' => { VR => 'SQ', Name => 'OriginalImageSequence' }, + '2200,0001' => { VR => 'CS', Name => 'LabelFromInfoExtractedFromInstance' }, + '2200,0002' => { VR => 'UT', Name => 'LabelText' }, + '2200,0003' => { VR => 'CS', Name => 'LabelStyleSelection' }, + '2200,0004' => { VR => 'LT', Name => 'MediaDisposition' }, + '2200,0005' => { VR => 'LT', Name => 'BarcodeValue' }, + '2200,0006' => { VR => 'CS', Name => 'BarcodeSymbology' }, + '2200,0007' => { VR => 'CS', Name => 'AllowMediaSplitting' }, + '2200,0008' => { VR => 'CS', Name => 'IncludeNonDICOMObjects' }, + '2200,0009' => { VR => 'CS', Name => 'IncludeDisplayApplication' }, + '2200,000A' => { VR => 'CS', Name => 'SaveCompInstancesAfterMediaCreate' }, + '2200,000B' => { VR => 'US', Name => 'TotalNumberMediaPiecesCreated' }, + '2200,000C' => { VR => 'LO', Name => 'RequestedMediaApplicationProfile' }, + '2200,000D' => { VR => 'SQ', Name => 'ReferencedStorageMediaSequence' }, + '2200,000E' => { VR => 'AT', Name => 'FailureAttributes' }, + '2200,000F' => { VR => 'CS', Name => 'AllowLossyCompression' }, + '2200,0020' => { VR => 'CS', Name => 'RequestPriority' }, + '3002,0002' => { VR => 'SH', Name => 'RTImageLabel' }, + '3002,0003' => { VR => 'LO', Name => 'RTImageName' }, + '3002,0004' => { VR => 'ST', Name => 'RTImageDescription' }, + '3002,000A' => { VR => 'CS', Name => 'ReportedValuesOrigin' }, + '3002,000C' => { VR => 'CS', Name => 'RTImagePlane' }, + '3002,000D' => { VR => 'DS', Name => 'XRayImageReceptorTranslation' }, + '3002,000E' => { VR => 'DS', Name => 'XRayImageReceptorAngle' }, + '3002,0010' => { VR => 'DS', Name => 'RTImageOrientation' }, + '3002,0011' => { VR => 'DS', Name => 'ImagePlanePixelSpacing' }, + '3002,0012' => { VR => 'DS', Name => 'RTImagePosition' }, + '3002,0020' => { VR => 'SH', Name => 'RadiationMachineName' }, + '3002,0022' => { VR => 'DS', Name => 'RadiationMachineSAD' }, + '3002,0024' => { VR => 'DS', Name => 'RadiationMachineSSD' }, + '3002,0026' => { VR => 'DS', Name => 'RTImageSID' }, + '3002,0028' => { VR => 'DS', Name => 'SourceToReferenceObjectDistance' }, + '3002,0029' => { VR => 'IS', Name => 'FractionNumber' }, + '3002,0030' => { VR => 'SQ', Name => 'ExposureSequence' }, + '3002,0032' => { VR => 'DS', Name => 'MetersetExposure' }, + '3002,0034' => { VR => 'DS', Name => 'DiaphragmPosition' }, + '3002,0040' => { VR => 'SQ', Name => 'FluenceMapSequence' }, + '3002,0041' => { VR => 'CS', Name => 'FluenceDataSource' }, + '3002,0042' => { VR => 'DS', Name => 'FluenceDataScale' }, + '3002,0051' => { VR => 'CS', Name => 'FluenceMode' }, + '3002,0052' => { VR => 'SH', Name => 'FluenceModeID' }, + '3004,0001' => { VR => 'CS', Name => 'DVHType' }, + '3004,0002' => { VR => 'CS', Name => 'DoseUnits' }, + '3004,0004' => { VR => 'CS', Name => 'DoseType' }, + '3004,0006' => { VR => 'LO', Name => 'DoseComment' }, + '3004,0008' => { VR => 'DS', Name => 'NormalizationPoint' }, + '3004,000A' => { VR => 'CS', Name => 'DoseSummationType' }, + '3004,000C' => { VR => 'DS', Name => 'GridFrameOffsetVector' }, + '3004,000E' => { VR => 'DS', Name => 'DoseGridScaling' }, + '3004,0010' => { VR => 'SQ', Name => 'RTDoseROISequence' }, + '3004,0012' => { VR => 'DS', Name => 'DoseValue' }, + '3004,0014' => { VR => 'CS', Name => 'TissueHeterogeneityCorrection' }, + '3004,0040' => { VR => 'DS', Name => 'DVHNormalizationPoint' }, + '3004,0042' => { VR => 'DS', Name => 'DVHNormalizationDoseValue' }, + '3004,0050' => { VR => 'SQ', Name => 'DVHSequence' }, + '3004,0052' => { VR => 'DS', Name => 'DVHDoseScaling' }, + '3004,0054' => { VR => 'CS', Name => 'DVHVolumeUnits' }, + '3004,0056' => { VR => 'IS', Name => 'DVHNumberOfBins' }, + '3004,0058' => { VR => 'DS', Name => 'DVHData' }, + '3004,0060' => { VR => 'SQ', Name => 'DVHReferencedROISequence' }, + '3004,0062' => { VR => 'CS', Name => 'DVHROIContributionType' }, + '3004,0070' => { VR => 'DS', Name => 'DVHMinimumDose' }, + '3004,0072' => { VR => 'DS', Name => 'DVHMaximumDose' }, + '3004,0074' => { VR => 'DS', Name => 'DVHMeanDose' }, + '3006,0002' => { VR => 'SH', Name => 'StructureSetLabel' }, + '3006,0004' => { VR => 'LO', Name => 'StructureSetName' }, + '3006,0006' => { VR => 'ST', Name => 'StructureSetDescription' }, + '3006,0008' => { VR => 'DA', Name => 'StructureSetDate' }, + '3006,0009' => { VR => 'TM', Name => 'StructureSetTime' }, + '3006,0010' => { VR => 'SQ', Name => 'ReferencedFrameOfReferenceSequence' }, + '3006,0012' => { VR => 'SQ', Name => 'RTReferencedStudySequence' }, + '3006,0014' => { VR => 'SQ', Name => 'RTReferencedSeriesSequence' }, + '3006,0016' => { VR => 'SQ', Name => 'ContourImageSequence' }, + '3006,0020' => { VR => 'SQ', Name => 'StructureSetROISequence' }, + '3006,0022' => { VR => 'IS', Name => 'ROINumber' }, + '3006,0024' => { VR => 'UI', Name => 'ReferencedFrameOfReferenceUID' }, + '3006,0026' => { VR => 'LO', Name => 'ROIName' }, + '3006,0028' => { VR => 'ST', Name => 'ROIDescription' }, + '3006,002A' => { VR => 'IS', Name => 'ROIDisplayColor' }, + '3006,002C' => { VR => 'DS', Name => 'ROIVolume' }, + '3006,0030' => { VR => 'SQ', Name => 'RTRelatedROISequence' }, + '3006,0033' => { VR => 'CS', Name => 'RTROIRelationship' }, + '3006,0036' => { VR => 'CS', Name => 'ROIGenerationAlgorithm' }, + '3006,0038' => { VR => 'LO', Name => 'ROIGenerationDescription' }, + '3006,0039' => { VR => 'SQ', Name => 'ROIContourSequence' }, + '3006,0040' => { VR => 'SQ', Name => 'ContourSequence' }, + '3006,0042' => { VR => 'CS', Name => 'ContourGeometricType' }, + '3006,0044' => { VR => 'DS', Name => 'ContourSlabThickness' }, + '3006,0045' => { VR => 'DS', Name => 'ContourOffsetVector' }, + '3006,0046' => { VR => 'IS', Name => 'NumberOfContourPoints' }, + '3006,0048' => { VR => 'IS', Name => 'ContourNumber' }, + '3006,0049' => { VR => 'IS', Name => 'AttachedContours' }, + '3006,0050' => { VR => 'DS', Name => 'ContourData' }, + '3006,0080' => { VR => 'SQ', Name => 'RTROIObservationsSequence' }, + '3006,0082' => { VR => 'IS', Name => 'ObservationNumber' }, + '3006,0084' => { VR => 'IS', Name => 'ReferencedROINumber' }, + '3006,0085' => { VR => 'SH', Name => 'ROIObservationLabel' }, + '3006,0086' => { VR => 'SQ', Name => 'RTROIIdentificationCodeSequence' }, + '3006,0088' => { VR => 'ST', Name => 'ROIObservationDescription' }, + '3006,00A0' => { VR => 'SQ', Name => 'RelatedRTROIObservationsSequence' }, + '3006,00A4' => { VR => 'CS', Name => 'RTROIInterpretedType' }, + '3006,00A6' => { VR => 'PN', Name => 'ROIInterpreter' }, + '3006,00B0' => { VR => 'SQ', Name => 'ROIPhysicalPropertiesSequence' }, + '3006,00B2' => { VR => 'CS', Name => 'ROIPhysicalProperty' }, + '3006,00B4' => { VR => 'DS', Name => 'ROIPhysicalPropertyValue' }, + '3006,00B6' => { VR => 'SQ', Name => 'ROIElementalCompositionSequence' }, + '3006,00B7' => { VR => 'US', Name => 'ROIElementalCompAtomicNumber' }, + '3006,00B8' => { VR => 'FL', Name => 'ROIElementalCompAtomicMassFraction' }, + '3006,00C0' => { VR => 'SQ', Name => 'FrameOfReferenceRelationshipSeq' }, + '3006,00C2' => { VR => 'UI', Name => 'RelatedFrameOfReferenceUID' }, + '3006,00C4' => { VR => 'CS', Name => 'FrameOfReferenceTransformType' }, + '3006,00C6' => { VR => 'DS', Name => 'FrameOfReferenceTransformMatrix' }, + '3006,00C8' => { VR => 'LO', Name => 'FrameOfReferenceTransformComment' }, + '3008,0010' => { VR => 'SQ', Name => 'MeasuredDoseReferenceSequence' }, + '3008,0012' => { VR => 'ST', Name => 'MeasuredDoseDescription' }, + '3008,0014' => { VR => 'CS', Name => 'MeasuredDoseType' }, + '3008,0016' => { VR => 'DS', Name => 'MeasuredDoseValue' }, + '3008,0020' => { VR => 'SQ', Name => 'TreatmentSessionBeamSequence' }, + '3008,0021' => { VR => 'SQ', Name => 'TreatmentSessionIonBeamSequence' }, + '3008,0022' => { VR => 'IS', Name => 'CurrentFractionNumber' }, + '3008,0024' => { VR => 'DA', Name => 'TreatmentControlPointDate' }, + '3008,0025' => { VR => 'TM', Name => 'TreatmentControlPointTime' }, + '3008,002A' => { VR => 'CS', Name => 'TreatmentTerminationStatus' }, + '3008,002B' => { VR => 'SH', Name => 'TreatmentTerminationCode' }, + '3008,002C' => { VR => 'CS', Name => 'TreatmentVerificationStatus' }, + '3008,0030' => { VR => 'SQ', Name => 'ReferencedTreatmentRecordSequence' }, + '3008,0032' => { VR => 'DS', Name => 'SpecifiedPrimaryMeterset' }, + '3008,0033' => { VR => 'DS', Name => 'SpecifiedSecondaryMeterset' }, + '3008,0036' => { VR => 'DS', Name => 'DeliveredPrimaryMeterset' }, + '3008,0037' => { VR => 'DS', Name => 'DeliveredSecondaryMeterset' }, + '3008,003A' => { VR => 'DS', Name => 'SpecifiedTreatmentTime' }, + '3008,003B' => { VR => 'DS', Name => 'DeliveredTreatmentTime' }, + '3008,0040' => { VR => 'SQ', Name => 'ControlPointDeliverySequence' }, + '3008,0041' => { VR => 'SQ', Name => 'IonControlPointDeliverySequence' }, + '3008,0042' => { VR => 'DS', Name => 'SpecifiedMeterset' }, + '3008,0044' => { VR => 'DS', Name => 'DeliveredMeterset' }, + '3008,0045' => { VR => 'FL', Name => 'MetersetRateSet' }, + '3008,0046' => { VR => 'FL', Name => 'MetersetRateDelivered' }, + '3008,0047' => { VR => 'FL', Name => 'ScanSpotMetersetsDelivered' }, + '3008,0048' => { VR => 'DS', Name => 'DoseRateDelivered' }, + '3008,0050' => { VR => 'SQ', Name => 'TreatmentSummaryCalcDoseRefSeq' }, + '3008,0052' => { VR => 'DS', Name => 'CumulativeDoseToDoseReference' }, + '3008,0054' => { VR => 'DA', Name => 'FirstTreatmentDate' }, + '3008,0056' => { VR => 'DA', Name => 'MostRecentTreatmentDate' }, + '3008,005A' => { VR => 'IS', Name => 'NumberOfFractionsDelivered' }, + '3008,0060' => { VR => 'SQ', Name => 'OverrideSequence' }, + '3008,0061' => { VR => 'AT', Name => 'ParameterSequencePointer' }, + '3008,0062' => { VR => 'AT', Name => 'OverrideParameterPointer' }, + '3008,0063' => { VR => 'IS', Name => 'ParameterItemIndex' }, + '3008,0064' => { VR => 'IS', Name => 'MeasuredDoseReferenceNumber' }, + '3008,0065' => { VR => 'AT', Name => 'ParameterPointer' }, + '3008,0066' => { VR => 'ST', Name => 'OverrideReason' }, + '3008,0068' => { VR => 'SQ', Name => 'CorrectedParameterSequence' }, + '3008,006A' => { VR => 'FL', Name => 'CorrectionValue' }, + '3008,0070' => { VR => 'SQ', Name => 'CalculatedDoseReferenceSequence' }, + '3008,0072' => { VR => 'IS', Name => 'CalculatedDoseReferenceNumber' }, + '3008,0074' => { VR => 'ST', Name => 'CalculatedDoseReferenceDescription' }, + '3008,0076' => { VR => 'DS', Name => 'CalculatedDoseReferenceDoseValue' }, + '3008,0078' => { VR => 'DS', Name => 'StartMeterset' }, + '3008,007A' => { VR => 'DS', Name => 'EndMeterset' }, + '3008,0080' => { VR => 'SQ', Name => 'ReferencedMeasuredDoseReferenceSeq' }, + '3008,0082' => { VR => 'IS', Name => 'ReferencedMeasuredDoseReferenceNum' }, + '3008,0090' => { VR => 'SQ', Name => 'ReferencedCalculatedDoseRefSeq' }, + '3008,0092' => { VR => 'IS', Name => 'ReferencedCalculatedDoseRefNumber' }, + '3008,00A0' => { VR => 'SQ', Name => 'BeamLimitingDeviceLeafPairsSeq' }, + '3008,00B0' => { VR => 'SQ', Name => 'RecordedWedgeSequence' }, + '3008,00C0' => { VR => 'SQ', Name => 'RecordedCompensatorSequence' }, + '3008,00D0' => { VR => 'SQ', Name => 'RecordedBlockSequence' }, + '3008,00E0' => { VR => 'SQ', Name => 'TreatmentSummaryMeasuredDoseRefSeq' }, + '3008,00F0' => { VR => 'SQ', Name => 'RecordedSnoutSequence' }, + '3008,00F2' => { VR => 'SQ', Name => 'RecordedRangeShifterSequence' }, + '3008,00F4' => { VR => 'SQ', Name => 'RecordedLateralSpreadingDeviceSeq' }, + '3008,00F6' => { VR => 'SQ', Name => 'RecordedRangeModulatorSequence' }, + '3008,0100' => { VR => 'SQ', Name => 'RecordedSourceSequence' }, + '3008,0105' => { VR => 'LO', Name => 'SourceSerialNumber' }, + '3008,0110' => { VR => 'SQ', Name => 'TreatmentSessionAppSetupSeq' }, + '3008,0116' => { VR => 'CS', Name => 'ApplicationSetupCheck' }, + '3008,0120' => { VR => 'SQ', Name => 'RecordedBrachyAccessoryDeviceSeq' }, + '3008,0122' => { VR => 'IS', Name => 'ReferencedBrachyAccessoryDeviceNum' }, + '3008,0130' => { VR => 'SQ', Name => 'RecordedChannelSequence' }, + '3008,0132' => { VR => 'DS', Name => 'SpecifiedChannelTotalTime' }, + '3008,0134' => { VR => 'DS', Name => 'DeliveredChannelTotalTime' }, + '3008,0136' => { VR => 'IS', Name => 'SpecifiedNumberOfPulses' }, + '3008,0138' => { VR => 'IS', Name => 'DeliveredNumberOfPulses' }, + '3008,013A' => { VR => 'DS', Name => 'SpecifiedPulseRepetitionInterval' }, + '3008,013C' => { VR => 'DS', Name => 'DeliveredPulseRepetitionInterval' }, + '3008,0140' => { VR => 'SQ', Name => 'RecordedSourceApplicatorSequence' }, + '3008,0142' => { VR => 'IS', Name => 'ReferencedSourceApplicatorNumber' }, + '3008,0150' => { VR => 'SQ', Name => 'RecordedChannelShieldSequence' }, + '3008,0152' => { VR => 'IS', Name => 'ReferencedChannelShieldNumber' }, + '3008,0160' => { VR => 'SQ', Name => 'BrachyControlPointDeliveredSeq' }, + '3008,0162' => { VR => 'DA', Name => 'SafePositionExitDate' }, + '3008,0164' => { VR => 'TM', Name => 'SafePositionExitTime' }, + '3008,0166' => { VR => 'DA', Name => 'SafePositionReturnDate' }, + '3008,0168' => { VR => 'TM', Name => 'SafePositionReturnTime' }, + '3008,0200' => { VR => 'CS', Name => 'CurrentTreatmentStatus' }, + '3008,0202' => { VR => 'ST', Name => 'TreatmentStatusComment' }, + '3008,0220' => { VR => 'SQ', Name => 'FractionGroupSummarySequence' }, + '3008,0223' => { VR => 'IS', Name => 'ReferencedFractionNumber' }, + '3008,0224' => { VR => 'CS', Name => 'FractionGroupType' }, + '3008,0230' => { VR => 'CS', Name => 'BeamStopperPosition' }, + '3008,0240' => { VR => 'SQ', Name => 'FractionStatusSummarySequence' }, + '3008,0250' => { VR => 'DA', Name => 'TreatmentDate' }, + '3008,0251' => { VR => 'TM', Name => 'TreatmentTime' }, + '300A,0002' => { VR => 'SH', Name => 'RTPlanLabel' }, + '300A,0003' => { VR => 'LO', Name => 'RTPlanName' }, + '300A,0004' => { VR => 'ST', Name => 'RTPlanDescription' }, + '300A,0006' => { VR => 'DA', Name => 'RTPlanDate' }, + '300A,0007' => { VR => 'TM', Name => 'RTPlanTime' }, + '300A,0009' => { VR => 'LO', Name => 'TreatmentProtocols' }, + '300A,000A' => { VR => 'CS', Name => 'PlanIntent' }, + '300A,000B' => { VR => 'LO', Name => 'TreatmentSites' }, + '300A,000C' => { VR => 'CS', Name => 'RTPlanGeometry' }, + '300A,000E' => { VR => 'ST', Name => 'PrescriptionDescription' }, + '300A,0010' => { VR => 'SQ', Name => 'DoseReferenceSequence' }, + '300A,0012' => { VR => 'IS', Name => 'DoseReferenceNumber' }, + '300A,0013' => { VR => 'UI', Name => 'DoseReferenceUID' }, + '300A,0014' => { VR => 'CS', Name => 'DoseReferenceStructureType' }, + '300A,0015' => { VR => 'CS', Name => 'NominalBeamEnergyUnit' }, + '300A,0016' => { VR => 'LO', Name => 'DoseReferenceDescription' }, + '300A,0018' => { VR => 'DS', Name => 'DoseReferencePointCoordinates' }, + '300A,001A' => { VR => 'DS', Name => 'NominalPriorDose' }, + '300A,0020' => { VR => 'CS', Name => 'DoseReferenceType' }, + '300A,0021' => { VR => 'DS', Name => 'ConstraintWeight' }, + '300A,0022' => { VR => 'DS', Name => 'DeliveryWarningDose' }, + '300A,0023' => { VR => 'DS', Name => 'DeliveryMaximumDose' }, + '300A,0025' => { VR => 'DS', Name => 'TargetMinimumDose' }, + '300A,0026' => { VR => 'DS', Name => 'TargetPrescriptionDose' }, + '300A,0027' => { VR => 'DS', Name => 'TargetMaximumDose' }, + '300A,0028' => { VR => 'DS', Name => 'TargetUnderdoseVolumeFraction' }, + '300A,002A' => { VR => 'DS', Name => 'OrganAtRiskFullVolumeDose' }, + '300A,002B' => { VR => 'DS', Name => 'OrganAtRiskLimitDose' }, + '300A,002C' => { VR => 'DS', Name => 'OrganAtRiskMaximumDose' }, + '300A,002D' => { VR => 'DS', Name => 'OrganAtRiskOverdoseVolumeFraction' }, + '300A,0040' => { VR => 'SQ', Name => 'ToleranceTableSequence' }, + '300A,0042' => { VR => 'IS', Name => 'ToleranceTableNumber' }, + '300A,0043' => { VR => 'SH', Name => 'ToleranceTableLabel' }, + '300A,0044' => { VR => 'DS', Name => 'GantryAngleTolerance' }, + '300A,0046' => { VR => 'DS', Name => 'BeamLimitingDeviceAngleTolerance' }, + '300A,0048' => { VR => 'SQ', Name => 'BeamLimitingDeviceToleranceSeq' }, + '300A,004A' => { VR => 'DS', Name => 'BeamLimitingDevicePositionTol' }, + '300A,004B' => { VR => 'FL', Name => 'SnoutPositionTolerance' }, + '300A,004C' => { VR => 'DS', Name => 'PatientSupportAngleTolerance' }, + '300A,004E' => { VR => 'DS', Name => 'TableTopEccentricAngleTolerance' }, + '300A,004F' => { VR => 'FL', Name => 'TableTopPitchAngleTolerance' }, + '300A,0050' => { VR => 'FL', Name => 'TableTopRollAngleTolerance' }, + '300A,0051' => { VR => 'DS', Name => 'TableTopVerticalPositionTolerance' }, + '300A,0052' => { VR => 'DS', Name => 'TableTopLongitudinalPositionTol' }, + '300A,0053' => { VR => 'DS', Name => 'TableTopLateralPositionTolerance' }, + '300A,0055' => { VR => 'CS', Name => 'RTPlanRelationship' }, + '300A,0070' => { VR => 'SQ', Name => 'FractionGroupSequence' }, + '300A,0071' => { VR => 'IS', Name => 'FractionGroupNumber' }, + '300A,0072' => { VR => 'LO', Name => 'FractionGroupDescription' }, + '300A,0078' => { VR => 'IS', Name => 'NumberOfFractionsPlanned' }, + '300A,0079' => { VR => 'IS', Name => 'NumberFractionPatternDigitsPerDay' }, + '300A,007A' => { VR => 'IS', Name => 'RepeatFractionCycleLength' }, + '300A,007B' => { VR => 'LT', Name => 'FractionPattern' }, + '300A,0080' => { VR => 'IS', Name => 'NumberOfBeams' }, + '300A,0082' => { VR => 'DS', Name => 'BeamDoseSpecificationPoint' }, + '300A,0084' => { VR => 'DS', Name => 'BeamDose' }, + '300A,0086' => { VR => 'DS', Name => 'BeamMeterset' }, + '300A,0088' => { VR => 'FL', Name => 'BeamDosePointDepth' }, + '300A,0089' => { VR => 'FL', Name => 'BeamDosePointEquivalentDepth' }, + '300A,008A' => { VR => 'FL', Name => 'BeamDosePointSSD' }, + '300A,00A0' => { VR => 'IS', Name => 'NumberOfBrachyApplicationSetups' }, + '300A,00A2' => { VR => 'DS', Name => 'BrachyAppSetupDoseSpecPoint' }, + '300A,00A4' => { VR => 'DS', Name => 'BrachyApplicationSetupDose' }, + '300A,00B0' => { VR => 'SQ', Name => 'BeamSequence' }, + '300A,00B2' => { VR => 'SH', Name => 'TreatmentMachineName' }, + '300A,00B3' => { VR => 'CS', Name => 'PrimaryDosimeterUnit' }, + '300A,00B4' => { VR => 'DS', Name => 'SourceAxisDistance' }, + '300A,00B6' => { VR => 'SQ', Name => 'BeamLimitingDeviceSequence' }, + '300A,00B8' => { VR => 'CS', Name => 'RTBeamLimitingDeviceType' }, + '300A,00BA' => { VR => 'DS', Name => 'SourceToBeamLimitingDeviceDistance' }, + '300A,00BB' => { VR => 'FL', Name => 'IsocenterToBeamLimitingDeviceDist' }, + '300A,00BC' => { VR => 'IS', Name => 'NumberOfLeafJawPairs' }, + '300A,00BE' => { VR => 'DS', Name => 'LeafPositionBoundaries' }, + '300A,00C0' => { VR => 'IS', Name => 'BeamNumber' }, + '300A,00C2' => { VR => 'LO', Name => 'BeamName' }, + '300A,00C3' => { VR => 'ST', Name => 'BeamDescription' }, + '300A,00C4' => { VR => 'CS', Name => 'BeamType' }, + '300A,00C6' => { VR => 'CS', Name => 'RadiationType' }, + '300A,00C7' => { VR => 'CS', Name => 'HighDoseTechniqueType' }, + '300A,00C8' => { VR => 'IS', Name => 'ReferenceImageNumber' }, + '300A,00CA' => { VR => 'SQ', Name => 'PlannedVerificationImageSequence' }, + '300A,00CC' => { VR => 'LO', Name => 'ImagingDeviceSpecificAcqParams' }, + '300A,00CE' => { VR => 'CS', Name => 'TreatmentDeliveryType' }, + '300A,00D0' => { VR => 'IS', Name => 'NumberOfWedges' }, + '300A,00D1' => { VR => 'SQ', Name => 'WedgeSequence' }, + '300A,00D2' => { VR => 'IS', Name => 'WedgeNumber' }, + '300A,00D3' => { VR => 'CS', Name => 'WedgeType' }, + '300A,00D4' => { VR => 'SH', Name => 'WedgeID' }, + '300A,00D5' => { VR => 'IS', Name => 'WedgeAngle' }, + '300A,00D6' => { VR => 'DS', Name => 'WedgeFactor' }, + '300A,00D7' => { VR => 'FL', Name => 'TotalWedgeTrayWaterEquivThickness' }, + '300A,00D8' => { VR => 'DS', Name => 'WedgeOrientation' }, + '300A,00D9' => { VR => 'FL', Name => 'IsocenterToWedgeTrayDistance' }, + '300A,00DA' => { VR => 'DS', Name => 'SourceToWedgeTrayDistance' }, + '300A,00DB' => { VR => 'FL', Name => 'WedgeThinEdgePosition' }, + '300A,00DC' => { VR => 'SH', Name => 'BolusID' }, + '300A,00DD' => { VR => 'ST', Name => 'BolusDescription' }, + '300A,00E0' => { VR => 'IS', Name => 'NumberOfCompensators' }, + '300A,00E1' => { VR => 'SH', Name => 'MaterialID' }, + '300A,00E2' => { VR => 'DS', Name => 'TotalCompensatorTrayFactor' }, + '300A,00E3' => { VR => 'SQ', Name => 'CompensatorSequence' }, + '300A,00E4' => { VR => 'IS', Name => 'CompensatorNumber' }, + '300A,00E5' => { VR => 'SH', Name => 'CompensatorID' }, + '300A,00E6' => { VR => 'DS', Name => 'SourceToCompensatorTrayDistance' }, + '300A,00E7' => { VR => 'IS', Name => 'CompensatorRows' }, + '300A,00E8' => { VR => 'IS', Name => 'CompensatorColumns' }, + '300A,00E9' => { VR => 'DS', Name => 'CompensatorPixelSpacing' }, + '300A,00EA' => { VR => 'DS', Name => 'CompensatorPosition' }, + '300A,00EB' => { VR => 'DS', Name => 'CompensatorTransmissionData' }, + '300A,00EC' => { VR => 'DS', Name => 'CompensatorThicknessData' }, + '300A,00ED' => { VR => 'IS', Name => 'NumberOfBoli' }, + '300A,00EE' => { VR => 'CS', Name => 'CompensatorType' }, + '300A,00F0' => { VR => 'IS', Name => 'NumberOfBlocks' }, + '300A,00F2' => { VR => 'DS', Name => 'TotalBlockTrayFactor' }, + '300A,00F3' => { VR => 'FL', Name => 'TotalBlockTrayWaterEquivThickness' }, + '300A,00F4' => { VR => 'SQ', Name => 'BlockSequence' }, + '300A,00F5' => { VR => 'SH', Name => 'BlockTrayID' }, + '300A,00F6' => { VR => 'DS', Name => 'SourceToBlockTrayDistance' }, + '300A,00F7' => { VR => 'FL', Name => 'IsocenterToBlockTrayDistance' }, + '300A,00F8' => { VR => 'CS', Name => 'BlockType' }, + '300A,00F9' => { VR => 'LO', Name => 'AccessoryCode' }, + '300A,00FA' => { VR => 'CS', Name => 'BlockDivergence' }, + '300A,00FB' => { VR => 'CS', Name => 'BlockMountingPosition' }, + '300A,00FC' => { VR => 'IS', Name => 'BlockNumber' }, + '300A,00FE' => { VR => 'LO', Name => 'BlockName' }, + '300A,0100' => { VR => 'DS', Name => 'BlockThickness' }, + '300A,0102' => { VR => 'DS', Name => 'BlockTransmission' }, + '300A,0104' => { VR => 'IS', Name => 'BlockNumberOfPoints' }, + '300A,0106' => { VR => 'DS', Name => 'BlockData' }, + '300A,0107' => { VR => 'SQ', Name => 'ApplicatorSequence' }, + '300A,0108' => { VR => 'SH', Name => 'ApplicatorID' }, + '300A,0109' => { VR => 'CS', Name => 'ApplicatorType' }, + '300A,010A' => { VR => 'LO', Name => 'ApplicatorDescription' }, + '300A,010C' => { VR => 'DS', Name => 'CumulativeDoseReferenceCoefficient' }, + '300A,010E' => { VR => 'DS', Name => 'FinalCumulativeMetersetWeight' }, + '300A,0110' => { VR => 'IS', Name => 'NumberOfControlPoints' }, + '300A,0111' => { VR => 'SQ', Name => 'ControlPointSequence' }, + '300A,0112' => { VR => 'IS', Name => 'ControlPointIndex' }, + '300A,0114' => { VR => 'DS', Name => 'NominalBeamEnergy' }, + '300A,0115' => { VR => 'DS', Name => 'DoseRateSet' }, + '300A,0116' => { VR => 'SQ', Name => 'WedgePositionSequence' }, + '300A,0118' => { VR => 'CS', Name => 'WedgePosition' }, + '300A,011A' => { VR => 'SQ', Name => 'BeamLimitingDevicePositionSequence' }, + '300A,011C' => { VR => 'DS', Name => 'LeafJawPositions' }, + '300A,011E' => { VR => 'DS', Name => 'GantryAngle' }, + '300A,011F' => { VR => 'CS', Name => 'GantryRotationDirection' }, + '300A,0120' => { VR => 'DS', Name => 'BeamLimitingDeviceAngle' }, + '300A,0121' => { VR => 'CS', Name => 'BeamLimitingDeviceRotateDirection' }, + '300A,0122' => { VR => 'DS', Name => 'PatientSupportAngle' }, + '300A,0123' => { VR => 'CS', Name => 'PatientSupportRotationDirection' }, + '300A,0124' => { VR => 'DS', Name => 'TableTopEccentricAxisDistance' }, + '300A,0125' => { VR => 'DS', Name => 'TableTopEccentricAngle' }, + '300A,0126' => { VR => 'CS', Name => 'TableTopEccentricRotateDirection' }, + '300A,0128' => { VR => 'DS', Name => 'TableTopVerticalPosition' }, + '300A,0129' => { VR => 'DS', Name => 'TableTopLongitudinalPosition' }, + '300A,012A' => { VR => 'DS', Name => 'TableTopLateralPosition' }, + '300A,012C' => { VR => 'DS', Name => 'IsocenterPosition' }, + '300A,012E' => { VR => 'DS', Name => 'SurfaceEntryPoint' }, + '300A,0130' => { VR => 'DS', Name => 'SourceToSurfaceDistance' }, + '300A,0134' => { VR => 'DS', Name => 'CumulativeMetersetWeight' }, + '300A,0140' => { VR => 'FL', Name => 'TableTopPitchAngle' }, + '300A,0142' => { VR => 'CS', Name => 'TableTopPitchRotationDirection' }, + '300A,0144' => { VR => 'FL', Name => 'TableTopRollAngle' }, + '300A,0146' => { VR => 'CS', Name => 'TableTopRollRotationDirection' }, + '300A,0148' => { VR => 'FL', Name => 'HeadFixationAngle' }, + '300A,014A' => { VR => 'FL', Name => 'GantryPitchAngle' }, + '300A,014C' => { VR => 'CS', Name => 'GantryPitchRotationDirection' }, + '300A,014E' => { VR => 'FL', Name => 'GantryPitchAngleTolerance' }, + '300A,0180' => { VR => 'SQ', Name => 'PatientSetupSequence' }, + '300A,0182' => { VR => 'IS', Name => 'PatientSetupNumber' }, + '300A,0183' => { VR => 'LO', Name => 'PatientSetupLabel' }, + '300A,0184' => { VR => 'LO', Name => 'PatientAdditionalPosition' }, + '300A,0190' => { VR => 'SQ', Name => 'FixationDeviceSequence' }, + '300A,0192' => { VR => 'CS', Name => 'FixationDeviceType' }, + '300A,0194' => { VR => 'SH', Name => 'FixationDeviceLabel' }, + '300A,0196' => { VR => 'ST', Name => 'FixationDeviceDescription' }, + '300A,0198' => { VR => 'SH', Name => 'FixationDevicePosition' }, + '300A,0199' => { VR => 'FL', Name => 'FixationDevicePitchAngle' }, + '300A,019A' => { VR => 'FL', Name => 'FixationDeviceRollAngle' }, + '300A,01A0' => { VR => 'SQ', Name => 'ShieldingDeviceSequence' }, + '300A,01A2' => { VR => 'CS', Name => 'ShieldingDeviceType' }, + '300A,01A4' => { VR => 'SH', Name => 'ShieldingDeviceLabel' }, + '300A,01A6' => { VR => 'ST', Name => 'ShieldingDeviceDescription' }, + '300A,01A8' => { VR => 'SH', Name => 'ShieldingDevicePosition' }, + '300A,01B0' => { VR => 'CS', Name => 'SetupTechnique' }, + '300A,01B2' => { VR => 'ST', Name => 'SetupTechniqueDescription' }, + '300A,01B4' => { VR => 'SQ', Name => 'SetupDeviceSequence' }, + '300A,01B6' => { VR => 'CS', Name => 'SetupDeviceType' }, + '300A,01B8' => { VR => 'SH', Name => 'SetupDeviceLabel' }, + '300A,01BA' => { VR => 'ST', Name => 'SetupDeviceDescription' }, + '300A,01BC' => { VR => 'DS', Name => 'SetupDeviceParameter' }, + '300A,01D0' => { VR => 'ST', Name => 'SetupReferenceDescription' }, + '300A,01D2' => { VR => 'DS', Name => 'TableTopVerticalSetupDisplacement' }, + '300A,01D4' => { VR => 'DS', Name => 'TableTopLongitudinalSetupDisplace' }, + '300A,01D6' => { VR => 'DS', Name => 'TableTopLateralSetupDisplacement' }, + '300A,0200' => { VR => 'CS', Name => 'BrachyTreatmentTechnique' }, + '300A,0202' => { VR => 'CS', Name => 'BrachyTreatmentType' }, + '300A,0206' => { VR => 'SQ', Name => 'TreatmentMachineSequence' }, + '300A,0210' => { VR => 'SQ', Name => 'SourceSequence' }, + '300A,0212' => { VR => 'IS', Name => 'SourceNumber' }, + '300A,0214' => { VR => 'CS', Name => 'SourceType' }, + '300A,0216' => { VR => 'LO', Name => 'SourceManufacturer' }, + '300A,0218' => { VR => 'DS', Name => 'ActiveSourceDiameter' }, + '300A,021A' => { VR => 'DS', Name => 'ActiveSourceLength' }, + '300A,0222' => { VR => 'DS', Name => 'SourceEncapsulationNomThickness' }, + '300A,0224' => { VR => 'DS', Name => 'SourceEncapsulationNomTransmission' }, + '300A,0226' => { VR => 'LO', Name => 'SourceIsotopeName' }, + '300A,0228' => { VR => 'DS', Name => 'SourceIsotopeHalfLife' }, + '300A,0229' => { VR => 'CS', Name => 'SourceStrengthUnits' }, + '300A,022A' => { VR => 'DS', Name => 'ReferenceAirKermaRate' }, + '300A,022B' => { VR => 'DS', Name => 'SourceStrength' }, + '300A,022C' => { VR => 'DA', Name => 'SourceStrengthReferenceDate' }, + '300A,022E' => { VR => 'TM', Name => 'SourceStrengthReferenceTime' }, + '300A,0230' => { VR => 'SQ', Name => 'ApplicationSetupSequence' }, + '300A,0232' => { VR => 'CS', Name => 'ApplicationSetupType' }, + '300A,0234' => { VR => 'IS', Name => 'ApplicationSetupNumber' }, + '300A,0236' => { VR => 'LO', Name => 'ApplicationSetupName' }, + '300A,0238' => { VR => 'LO', Name => 'ApplicationSetupManufacturer' }, + '300A,0240' => { VR => 'IS', Name => 'TemplateNumber' }, + '300A,0242' => { VR => 'SH', Name => 'TemplateType' }, + '300A,0244' => { VR => 'LO', Name => 'TemplateName' }, + '300A,0250' => { VR => 'DS', Name => 'TotalReferenceAirKerma' }, + '300A,0260' => { VR => 'SQ', Name => 'BrachyAccessoryDeviceSequence' }, + '300A,0262' => { VR => 'IS', Name => 'BrachyAccessoryDeviceNumber' }, + '300A,0263' => { VR => 'SH', Name => 'BrachyAccessoryDeviceID' }, + '300A,0264' => { VR => 'CS', Name => 'BrachyAccessoryDeviceType' }, + '300A,0266' => { VR => 'LO', Name => 'BrachyAccessoryDeviceName' }, + '300A,026A' => { VR => 'DS', Name => 'BrachyAccessoryDeviceNomThickness' }, + '300A,026C' => { VR => 'DS', Name => 'BrachyAccessoryDevNomTransmission' }, + '300A,0280' => { VR => 'SQ', Name => 'ChannelSequence' }, + '300A,0282' => { VR => 'IS', Name => 'ChannelNumber' }, + '300A,0284' => { VR => 'DS', Name => 'ChannelLength' }, + '300A,0286' => { VR => 'DS', Name => 'ChannelTotalTime' }, + '300A,0288' => { VR => 'CS', Name => 'SourceMovementType' }, + '300A,028A' => { VR => 'IS', Name => 'NumberOfPulses' }, + '300A,028C' => { VR => 'DS', Name => 'PulseRepetitionInterval' }, + '300A,0290' => { VR => 'IS', Name => 'SourceApplicatorNumber' }, + '300A,0291' => { VR => 'SH', Name => 'SourceApplicatorID' }, + '300A,0292' => { VR => 'CS', Name => 'SourceApplicatorType' }, + '300A,0294' => { VR => 'LO', Name => 'SourceApplicatorName' }, + '300A,0296' => { VR => 'DS', Name => 'SourceApplicatorLength' }, + '300A,0298' => { VR => 'LO', Name => 'SourceApplicatorManufacturer' }, + '300A,029C' => { VR => 'DS', Name => 'SourceApplicatorWallNomThickness' }, + '300A,029E' => { VR => 'DS', Name => 'SourceApplicatorWallNomTrans' }, + '300A,02A0' => { VR => 'DS', Name => 'SourceApplicatorStepSize' }, + '300A,02A2' => { VR => 'IS', Name => 'TransferTubeNumber' }, + '300A,02A4' => { VR => 'DS', Name => 'TransferTubeLength' }, + '300A,02B0' => { VR => 'SQ', Name => 'ChannelShieldSequence' }, + '300A,02B2' => { VR => 'IS', Name => 'ChannelShieldNumber' }, + '300A,02B3' => { VR => 'SH', Name => 'ChannelShieldID' }, + '300A,02B4' => { VR => 'LO', Name => 'ChannelShieldName' }, + '300A,02B8' => { VR => 'DS', Name => 'ChannelShieldNominalThickness' }, + '300A,02BA' => { VR => 'DS', Name => 'ChannelShieldNominalTransmission' }, + '300A,02C8' => { VR => 'DS', Name => 'FinalCumulativeTimeWeight' }, + '300A,02D0' => { VR => 'SQ', Name => 'BrachyControlPointSequence' }, + '300A,02D2' => { VR => 'DS', Name => 'ControlPointRelativePosition' }, + '300A,02D4' => { VR => 'DS', Name => 'ControlPoint3DPosition' }, + '300A,02D6' => { VR => 'DS', Name => 'CumulativeTimeWeight' }, + '300A,02E0' => { VR => 'CS', Name => 'CompensatorDivergence' }, + '300A,02E1' => { VR => 'CS', Name => 'CompensatorMountingPosition' }, + '300A,02E2' => { VR => 'DS', Name => 'SourceToCompensatorDistance' }, + '300A,02E3' => { VR => 'FL', Name => 'TotalCompTrayWaterEquivThickness' }, + '300A,02E4' => { VR => 'FL', Name => 'IsocenterToCompensatorTrayDistance' }, + '300A,02E5' => { VR => 'FL', Name => 'CompensatorColumnOffset' }, + '300A,02E6' => { VR => 'FL', Name => 'IsocenterToCompensatorDistances' }, + '300A,02E7' => { VR => 'FL', Name => 'CompensatorRelStoppingPowerRatio' }, + '300A,02E8' => { VR => 'FL', Name => 'CompensatorMillingToolDiameter' }, + '300A,02EA' => { VR => 'SQ', Name => 'IonRangeCompensatorSequence' }, + '300A,02EB' => { VR => 'LT', Name => 'CompensatorDescription' }, + '300A,0302' => { VR => 'IS', Name => 'RadiationMassNumber' }, + '300A,0304' => { VR => 'IS', Name => 'RadiationAtomicNumber' }, + '300A,0306' => { VR => 'SS', Name => 'RadiationChargeState' }, + '300A,0308' => { VR => 'CS', Name => 'ScanMode' }, + '300A,030A' => { VR => 'FL', Name => 'VirtualSourceAxisDistances' }, + '300A,030C' => { VR => 'SQ', Name => 'SnoutSequence' }, + '300A,030D' => { VR => 'FL', Name => 'SnoutPosition' }, + '300A,030F' => { VR => 'SH', Name => 'SnoutID' }, + '300A,0312' => { VR => 'IS', Name => 'NumberOfRangeShifters' }, + '300A,0314' => { VR => 'SQ', Name => 'RangeShifterSequence' }, + '300A,0316' => { VR => 'IS', Name => 'RangeShifterNumber' }, + '300A,0318' => { VR => 'SH', Name => 'RangeShifterID' }, + '300A,0320' => { VR => 'CS', Name => 'RangeShifterType' }, + '300A,0322' => { VR => 'LO', Name => 'RangeShifterDescription' }, + '300A,0330' => { VR => 'IS', Name => 'NumberOfLateralSpreadingDevices' }, + '300A,0332' => { VR => 'SQ', Name => 'LateralSpreadingDeviceSequence' }, + '300A,0334' => { VR => 'IS', Name => 'LateralSpreadingDeviceNumber' }, + '300A,0336' => { VR => 'SH', Name => 'LateralSpreadingDeviceID' }, + '300A,0338' => { VR => 'CS', Name => 'LateralSpreadingDeviceType' }, + '300A,033A' => { VR => 'LO', Name => 'LateralSpreadingDeviceDescription' }, + '300A,033C' => { VR => 'FL', Name => 'LateralSpreadingDevWaterEquivThick' }, + '300A,0340' => { VR => 'IS', Name => 'NumberOfRangeModulators' }, + '300A,0342' => { VR => 'SQ', Name => 'RangeModulatorSequence' }, + '300A,0344' => { VR => 'IS', Name => 'RangeModulatorNumber' }, + '300A,0346' => { VR => 'SH', Name => 'RangeModulatorID' }, + '300A,0348' => { VR => 'CS', Name => 'RangeModulatorType' }, + '300A,034A' => { VR => 'LO', Name => 'RangeModulatorDescription' }, + '300A,034C' => { VR => 'SH', Name => 'BeamCurrentModulationID' }, + '300A,0350' => { VR => 'CS', Name => 'PatientSupportType' }, + '300A,0352' => { VR => 'SH', Name => 'PatientSupportID' }, + '300A,0354' => { VR => 'LO', Name => 'PatientSupportAccessoryCode' }, + '300A,0356' => { VR => 'FL', Name => 'FixationLightAzimuthalAngle' }, + '300A,0358' => { VR => 'FL', Name => 'FixationLightPolarAngle' }, + '300A,035A' => { VR => 'FL', Name => 'MetersetRate' }, + '300A,0360' => { VR => 'SQ', Name => 'RangeShifterSettingsSequence' }, + '300A,0362' => { VR => 'LO', Name => 'RangeShifterSetting' }, + '300A,0364' => { VR => 'FL', Name => 'IsocenterToRangeShifterDistance' }, + '300A,0366' => { VR => 'FL', Name => 'RangeShifterWaterEquivThickness' }, + '300A,0370' => { VR => 'SQ', Name => 'LateralSpreadingDeviceSettingsSeq' }, + '300A,0372' => { VR => 'LO', Name => 'LateralSpreadingDeviceSetting' }, + '300A,0374' => { VR => 'FL', Name => 'IsocenterToLateralSpreadingDevDist' }, + '300A,0380' => { VR => 'SQ', Name => 'RangeModulatorSettingsSequence' }, + '300A,0382' => { VR => 'FL', Name => 'RangeModulatorGatingStartValue' }, + '300A,0384' => { VR => 'FL', Name => 'RangeModulatorGatingStopValue' }, + '300A,038A' => { VR => 'FL', Name => 'IsocenterToRangeModulatorDistance' }, + '300A,0390' => { VR => 'SH', Name => 'ScanSpotTuneID' }, + '300A,0392' => { VR => 'IS', Name => 'NumberOfScanSpotPositions' }, + '300A,0394' => { VR => 'FL', Name => 'ScanSpotPositionMap' }, + '300A,0396' => { VR => 'FL', Name => 'ScanSpotMetersetWeights' }, + '300A,0398' => { VR => 'FL', Name => 'ScanningSpotSize' }, + '300A,039A' => { VR => 'IS', Name => 'NumberOfPaintings' }, + '300A,03A0' => { VR => 'SQ', Name => 'IonToleranceTableSequence' }, + '300A,03A2' => { VR => 'SQ', Name => 'IonBeamSequence' }, + '300A,03A4' => { VR => 'SQ', Name => 'IonBeamLimitingDeviceSequence' }, + '300A,03A6' => { VR => 'SQ', Name => 'IonBlockSequence' }, + '300A,03A8' => { VR => 'SQ', Name => 'IonControlPointSequence' }, + '300A,03AA' => { VR => 'SQ', Name => 'IonWedgeSequence' }, + '300A,03AC' => { VR => 'SQ', Name => 'IonWedgePositionSequence' }, + '300A,0401' => { VR => 'SQ', Name => 'ReferencedSetupImageSequence' }, + '300A,0402' => { VR => 'ST', Name => 'SetupImageComment' }, + '300A,0410' => { VR => 'SQ', Name => 'MotionSynchronizationSequence' }, + '300A,0412' => { VR => 'FL', Name => 'ControlPointOrientation' }, + '300A,0420' => { VR => 'SQ', Name => 'GeneralAccessorySequence' }, + '300A,0421' => { VR => 'SH', Name => 'GeneralAccessoryID' }, + '300A,0422' => { VR => 'ST', Name => 'GeneralAccessoryDescription' }, + '300A,0423' => { VR => 'CS', Name => 'GeneralAccessoryType' }, + '300A,0424' => { VR => 'IS', Name => 'GeneralAccessoryNumber' }, + '300C,0002' => { VR => 'SQ', Name => 'ReferencedRTPlanSequence' }, + '300C,0004' => { VR => 'SQ', Name => 'ReferencedBeamSequence' }, + '300C,0006' => { VR => 'IS', Name => 'ReferencedBeamNumber' }, + '300C,0007' => { VR => 'IS', Name => 'ReferencedReferenceImageNumber' }, + '300C,0008' => { VR => 'DS', Name => 'StartCumulativeMetersetWeight' }, + '300C,0009' => { VR => 'DS', Name => 'EndCumulativeMetersetWeight' }, + '300C,000A' => { VR => 'SQ', Name => 'ReferencedBrachyAppSetupSeq' }, + '300C,000C' => { VR => 'IS', Name => 'ReferencedBrachyAppSetupNumber' }, + '300C,000E' => { VR => 'IS', Name => 'ReferencedSourceNumber' }, + '300C,0020' => { VR => 'SQ', Name => 'ReferencedFractionGroupSequence' }, + '300C,0022' => { VR => 'IS', Name => 'ReferencedFractionGroupNumber' }, + '300C,0040' => { VR => 'SQ', Name => 'ReferencedVerificationImageSeq' }, + '300C,0042' => { VR => 'SQ', Name => 'ReferencedReferenceImageSequence' }, + '300C,0050' => { VR => 'SQ', Name => 'ReferencedDoseReferenceSequence' }, + '300C,0051' => { VR => 'IS', Name => 'ReferencedDoseReferenceNumber' }, + '300C,0055' => { VR => 'SQ', Name => 'BrachyReferencedDoseReferenceSeq' }, + '300C,0060' => { VR => 'SQ', Name => 'ReferencedStructureSetSequence' }, + '300C,006A' => { VR => 'IS', Name => 'ReferencedPatientSetupNumber' }, + '300C,0080' => { VR => 'SQ', Name => 'ReferencedDoseSequence' }, + '300C,00A0' => { VR => 'IS', Name => 'ReferencedToleranceTableNumber' }, + '300C,00B0' => { VR => 'SQ', Name => 'ReferencedBolusSequence' }, + '300C,00C0' => { VR => 'IS', Name => 'ReferencedWedgeNumber' }, + '300C,00D0' => { VR => 'IS', Name => 'ReferencedCompensatorNumber' }, + '300C,00E0' => { VR => 'IS', Name => 'ReferencedBlockNumber' }, + '300C,00F0' => { VR => 'IS', Name => 'ReferencedControlPointIndex' }, + '300C,00F2' => { VR => 'SQ', Name => 'ReferencedControlPointSequence' }, + '300C,00F4' => { VR => 'IS', Name => 'ReferencedStartControlPointIndex' }, + '300C,00F6' => { VR => 'IS', Name => 'ReferencedStopControlPointIndex' }, + '300C,0100' => { VR => 'IS', Name => 'ReferencedRangeShifterNumber' }, + '300C,0102' => { VR => 'IS', Name => 'ReferencedLateralSpreadingDevNum' }, + '300C,0104' => { VR => 'IS', Name => 'ReferencedRangeModulatorNumber' }, + '300E,0002' => { VR => 'CS', Name => 'ApprovalStatus' }, + '300E,0004' => { VR => 'DA', Name => 'ReviewDate' }, + '300E,0005' => { VR => 'TM', Name => 'ReviewTime' }, + '300E,0008' => { VR => 'PN', Name => 'ReviewerName' }, + # text group + '4000,0000' => { VR => 'UL', Name => 'TextGroupLength' }, + '4000,0010' => { VR => 'LT', Name => 'Arbitrary' }, + '4000,4000' => { VR => 'LT', Name => 'TextComments' }, + # results group + '4008,0040' => { VR => 'SH', Name => 'ResultsID' }, + '4008,0042' => { VR => 'LO', Name => 'ResultsIDIssuer' }, + '4008,0050' => { VR => 'SQ', Name => 'ReferencedInterpretationSequence' }, + '4008,0100' => { VR => 'DA', Name => 'InterpretationRecordedDate' }, + '4008,0101' => { VR => 'TM', Name => 'InterpretationRecordedTime' }, + '4008,0102' => { VR => 'PN', Name => 'InterpretationRecorder' }, + '4008,0103' => { VR => 'LO', Name => 'ReferenceToRecordedSound' }, + '4008,0108' => { VR => 'DA', Name => 'InterpretationTranscriptionDate' }, + '4008,0109' => { VR => 'TM', Name => 'InterpretationTranscriptionTime' }, + '4008,010A' => { VR => 'PN', Name => 'InterpretationTranscriber' }, + '4008,010B' => { VR => 'ST', Name => 'InterpretationText' }, + '4008,010C' => { VR => 'PN', Name => 'InterpretationAuthor' }, + '4008,0111' => { VR => 'SQ', Name => 'InterpretationApproverSequence' }, + '4008,0112' => { VR => 'DA', Name => 'InterpretationApprovalDate' }, + '4008,0113' => { VR => 'TM', Name => 'InterpretationApprovalTime' }, + '4008,0114' => { VR => 'PN', Name => 'PhysicianApprovingInterpretation' }, + '4008,0115' => { VR => 'LT', Name => 'InterpretationDiagnosisDescription' }, + '4008,0117' => { VR => 'SQ', Name => 'InterpretationDiagnosisCodeSeq' }, + '4008,0118' => { VR => 'SQ', Name => 'ResultsDistributionListSequence' }, + '4008,0119' => { VR => 'PN', Name => 'DistributionName' }, + '4008,011A' => { VR => 'LO', Name => 'DistributionAddress' }, + '4008,0200' => { VR => 'SH', Name => 'InterpretationID' }, + '4008,0202' => { VR => 'LO', Name => 'InterpretationIDIssuer' }, + '4008,0210' => { VR => 'CS', Name => 'InterpretationTypeID' }, + '4008,0212' => { VR => 'CS', Name => 'InterpretationStatusID' }, + '4008,0300' => { VR => 'ST', Name => 'Impressions' }, + '4008,4000' => { VR => 'ST', Name => 'ResultsComments' }, + '4FFE,0001' => { VR => 'SQ', Name => 'MACParametersSequence' }, + # curve group + '50xx,0005' => { VR => 'US', Name => 'CurveDimensions' }, + '50xx,0010' => { VR => 'US', Name => 'NumberOfPoints' }, + '50xx,0020' => { VR => 'CS', Name => 'TypeOfData' }, + '50xx,0022' => { VR => 'LO', Name => 'CurveDescription' }, + '50xx,0030' => { VR => 'SH', Name => 'AxisUnits' }, + '50xx,0040' => { VR => 'SH', Name => 'AxisLabels' }, + '50xx,0103' => { VR => 'US', Name => 'DataValueRepresentation' }, + '50xx,0104' => { VR => 'US', Name => 'MinimumCoordinateValue' }, + '50xx,0105' => { VR => 'US', Name => 'MaximumCoordinateValue' }, + '50xx,0106' => { VR => 'SH', Name => 'CurveRange' }, + '50xx,0110' => { VR => 'US', Name => 'CurveDataDescriptor' }, + '50xx,0112' => { VR => 'US', Name => 'CoordinateStartValue' }, + '50xx,0114' => { VR => 'US', Name => 'CoordinateStepValue' }, + '50xx,1001' => { VR => 'CS', Name => 'CurveActivationLayer' }, + '50xx,2000' => { VR => 'US', Name => 'AudioType' }, + '50xx,2002' => { VR => 'US', Name => 'AudioSampleFormat' }, + '50xx,2004' => { VR => 'US', Name => 'NumberOfChannels' }, + '50xx,2006' => { VR => 'UL', Name => 'NumberOfSamples' }, + '50xx,2008' => { VR => 'UL', Name => 'SampleRate' }, + '50xx,200A' => { VR => 'UL', Name => 'TotalTime' }, + '50xx,200C' => { VR => 'OW', Name => 'AudioSampleData' }, + '50xx,200E' => { VR => 'LT', Name => 'AudioComments' }, + '50xx,2500' => { VR => 'LO', Name => 'CurveLabel' }, + '50xx,2600' => { VR => 'SQ', Name => 'ReferencedOverlaySequence' }, + '50xx,2610' => { VR => 'US', Name => 'ReferencedOverlayGroup' }, + '50xx,3000' => { VR => 'OW', Name => 'CurveData' }, + '5200,9229' => { VR => 'SQ', Name => 'SharedFunctionalGroupsSequence' }, + '5200,9230' => { VR => 'SQ', Name => 'PerFrameFunctionalGroupsSequence' }, + '5400,0100' => { VR => 'SQ', Name => 'WaveformSequence' }, + '5400,0110' => { VR => 'OB', Name => 'ChannelMinimumValue' }, + '5400,0112' => { VR => 'OB', Name => 'ChannelMaximumValue' }, + '5400,1004' => { VR => 'US', Name => 'WaveformBitsAllocated' }, + '5400,1006' => { VR => 'CS', Name => 'WaveformSampleInterpretation' }, + '5400,100A' => { VR => 'OB', Name => 'WaveformPaddingValue' }, + '5400,1010' => { VR => 'OB', Name => 'WaveformData' }, + '5600,0010' => { VR => 'OF', Name => 'FirstOrderPhaseCorrectionAngle' }, + '5600,0020' => { VR => 'OF', Name => 'SpectroscopyData' }, + # overlay group + '6000,0000' => { VR => 'UL', Name => 'OverlayGroupLength' }, + '60xx,0010' => { VR => 'US', Name => 'OverlayRows' }, + '60xx,0011' => { VR => 'US', Name => 'OverlayColumns' }, + '60xx,0012' => { VR => 'US', Name => 'OverlayPlanes' }, + '60xx,0015' => { VR => 'IS', Name => 'NumberOfFramesInOverlay' }, + '60xx,0022' => { VR => 'LO', Name => 'OverlayDescription' }, + '60xx,0040' => { VR => 'CS', Name => 'OverlayType' }, + '60xx,0045' => { VR => 'LO', Name => 'OverlaySubtype' }, + '60xx,0050' => { VR => 'SS', Name => 'OverlayOrigin' }, + '60xx,0051' => { VR => 'US', Name => 'ImageFrameOrigin' }, + '60xx,0052' => { VR => 'US', Name => 'OverlayPlaneOrigin' }, + '60xx,0060' => { VR => 'CS', Name => 'OverlayCompressionCode' }, + '60xx,0061' => { VR => 'SH', Name => 'OverlayCompressionOriginator' }, + '60xx,0062' => { VR => 'SH', Name => 'OverlayCompressionLabel' }, + '60xx,0063' => { VR => 'CS', Name => 'OverlayCompressionDescription' }, + '60xx,0066' => { VR => 'AT', Name => 'OverlayCompressionStepPointers' }, + '60xx,0068' => { VR => 'US', Name => 'OverlayRepeatInterval' }, + '60xx,0069' => { VR => 'US', Name => 'OverlayBitsGrouped' }, + '60xx,0100' => { VR => 'US', Name => 'OverlayBitsAllocated' }, + '60xx,0102' => { VR => 'US', Name => 'OverlayBitPosition' }, + '60xx,0110' => { VR => 'CS', Name => 'OverlayFormat' }, + '60xx,0200' => { VR => 'US', Name => 'OverlayLocation' }, + '60xx,0800' => { VR => 'CS', Name => 'OverlayCodeLabel' }, + '60xx,0802' => { VR => 'US', Name => 'OverlayNumberOfTables' }, + '60xx,0803' => { VR => 'AT', Name => 'OverlayCodeTableLocation' }, + '60xx,0804' => { VR => 'US', Name => 'OverlayBitsForCodeWord' }, + '60xx,1001' => { VR => 'CS', Name => 'OverlayActivationLayer' }, + '60xx,1100' => { VR => 'US', Name => 'OverlayDescriptorGray' }, + '60xx,1101' => { VR => 'US', Name => 'OverlayDescriptorRed' }, + '60xx,1102' => { VR => 'US', Name => 'OverlayDescriptorGreen' }, + '60xx,1103' => { VR => 'US', Name => 'OverlayDescriptorBlue' }, + '60xx,1200' => { VR => 'US', Name => 'OverlaysGray' }, + '60xx,1201' => { VR => 'US', Name => 'OverlaysRed' }, + '60xx,1202' => { VR => 'US', Name => 'OverlaysGreen' }, + '60xx,1203' => { VR => 'US', Name => 'OverlaysBlue' }, + '60xx,1301' => { VR => 'IS', Name => 'ROIArea' }, + '60xx,1302' => { VR => 'DS', Name => 'ROIMean' }, + '60xx,1303' => { VR => 'DS', Name => 'ROIStandardDeviation' }, + '60xx,1500' => { VR => 'LO', Name => 'OverlayLabel' }, + '60xx,3000' => { VR => 'OB', Name => 'OverlayData' }, + '60xx,4000' => { VR => 'LT',Name => 'OverlayComments' }, + # pixel data group + '7Fxx,0000' => { VR => 'UL', Name => 'PixelDataGroupLength' }, + '7Fxx,0010' => { VR => 'OB', Name => 'PixelData', Binary => 1 }, + '7Fxx,0011' => { VR => 'US', Name => 'VariableNextDataGroup' }, + '7Fxx,0020' => { VR => 'OW', Name => 'VariableCoefficientsSDVN' }, + '7Fxx,0030' => { VR => 'OW', Name => 'VariableCoefficientsSDHN' }, + '7Fxx,0040' => { VR => 'OW', Name => 'VariableCoefficientsSDDN' }, + 'FFFA,FFFA' => { VR => 'SQ', Name => 'DigitalSignaturesSequence' }, + 'FFFC,FFFC' => { VR => 'OB', Name => 'DataSetTrailingPadding', Binary => 1 }, + # the sequence delimiters have no VR: + 'FFFE,E000' => 'StartOfItem', + 'FFFE,E00D' => 'EndOfItems', + 'FFFE,E0DD' => 'EndOfSequence', +); + +# table to translate registered UID values to readable strings +# (the PrintConv is added dynamically when a 'UI' format tag is extracted) +%uid = ( + '1.2.840.10008.1.1' => 'Verification SOP Class', + '1.2.840.10008.1.2' => 'Implicit VR Little Endian', + '1.2.840.10008.1.2.1' => 'Explicit VR Little Endian', + '1.2.840.10008.1.2.1.99' => 'Deflated Explicit VR Little Endian', + '1.2.840.10008.1.2.2' => 'Explicit VR Big Endian', + '1.2.840.10008.1.2.4.50' => 'JPEG Baseline (Process 1)', + '1.2.840.10008.1.2.4.51' => 'JPEG Extended (Process 2 & 4)', + '1.2.840.10008.1.2.4.52' => 'JPEG Extended (Process 3 & 5)', + '1.2.840.10008.1.2.4.53' => 'JPEG Spectral Selection, Non-Hierarchical (Process 6 & 8)', + '1.2.840.10008.1.2.4.54' => 'JPEG Spectral Selection, Non-Hierarchical (Process 7 & 9)', + '1.2.840.10008.1.2.4.55' => 'JPEG Full Progression, Non-Hierarchical (Process 10 & 12)', + '1.2.840.10008.1.2.4.56' => 'JPEG Full Progression, Non-Hierarchical (Process 11 & 13)', + '1.2.840.10008.1.2.4.57' => 'JPEG Lossless, Non-Hierarchical (Process 14)', + '1.2.840.10008.1.2.4.58' => 'JPEG Lossless, Non-Hierarchical (Process 15) ', + '1.2.840.10008.1.2.4.59' => 'JPEG Extended, Hierarchical (Process 16 & 18) ', + '1.2.840.10008.1.2.4.60' => 'JPEG Extended, Hierarchical (Process 17 & 19) ', + '1.2.840.10008.1.2.4.61' => 'JPEG Spectral Selection, Hierarchical (Process 20 & 22)', + '1.2.840.10008.1.2.4.62' => 'JPEG Spectral Selection, Hierarchical (Process 21 & 23)', + '1.2.840.10008.1.2.4.63' => 'JPEG Full Progression, Hierarchical (Process 24 & 26)', + '1.2.840.10008.1.2.4.64' => 'JPEG Full Progression, Hierarchical (Process 25 & 27)', + '1.2.840.10008.1.2.4.65' => 'JPEG Lossless, Hierarchical (Process 28) ', + '1.2.840.10008.1.2.4.66' => 'JPEG Lossless, Hierarchical (Process 29) ', + '1.2.840.10008.1.2.4.70' => 'JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14-1)', + '1.2.840.10008.1.2.4.80' => 'JPEG-LS Lossless Image Compression', + '1.2.840.10008.1.2.4.81' => 'JPEG-LS Lossy (Near-Lossless) Image Compression', + '1.2.840.10008.1.2.4.90' => 'JPEG 2000 Image Compression (Lossless Only)', + '1.2.840.10008.1.2.4.91' => 'JPEG 2000 Image Compression', + '1.2.840.10008.1.2.4.92' => 'JPEG 2000 Part 2 Multi-component Image Compression (Lossless Only)', + '1.2.840.10008.1.2.4.93' => 'JPEG 2000 Part 2 Multi-component Image Compression', + '1.2.840.10008.1.2.4.94' => 'JPIP Referenced', + '1.2.840.10008.1.2.4.95' => 'JPIP Referenced Deflate', + '1.2.840.10008.1.2.4.100' => 'MPEG2 Main Profile @ Main Level', + '1.2.840.10008.1.2.5' => 'RLE Lossless', + '1.2.840.10008.1.2.6.1' => 'RFC 2557 MIME encapsulation', + '1.2.840.10008.1.2.6.2' => 'XML Encoding', + '1.2.840.10008.1.3.10' => 'Media Storage Directory Storage', + '1.2.840.10008.1.4.1.1' => 'Talairach Brain Atlas Frame of Reference', + '1.2.840.10008.1.4.1.2' => 'SPM2 T1 Frame of Reference', + '1.2.840.10008.1.4.1.3' => 'SPM2 T2 Frame of Reference', + '1.2.840.10008.1.4.1.4' => 'SPM2 PD Frame of Reference', + '1.2.840.10008.1.4.1.5' => 'SPM2 EPI Frame of Reference', + '1.2.840.10008.1.4.1.6' => 'SPM2 FIL T1 Frame of Reference', + '1.2.840.10008.1.4.1.7' => 'SPM2 PET Frame of Reference', + '1.2.840.10008.1.4.1.8' => 'SPM2 TRANSM Frame of Reference', + '1.2.840.10008.1.4.1.9' => 'SPM2 SPECT Frame of Reference', + '1.2.840.10008.1.4.1.10' => 'SPM2 GRAY Frame of Reference', + '1.2.840.10008.1.4.1.11' => 'SPM2 WHITE Frame of Reference', + '1.2.840.10008.1.4.1.12' => 'SPM2 CSF Frame of Reference', + '1.2.840.10008.1.4.1.13' => 'SPM2 BRAINMASK Frame of Reference', + '1.2.840.10008.1.4.1.14' => 'SPM2 AVG305T1 Frame of Reference', + '1.2.840.10008.1.4.1.15' => 'SPM2 AVG152T1 Frame of Reference', + '1.2.840.10008.1.4.1.16' => 'SPM2 AVG152T2 Frame of Reference', + '1.2.840.10008.1.4.1.17' => 'SPM2 AVG152PD Frame of Reference', + '1.2.840.10008.1.4.1.18' => 'SPM2 SINGLESUBJT1 Frame of Reference', + '1.2.840.10008.1.4.2.1' => 'ICBM 452 T1 Frame of Reference', + '1.2.840.10008.1.4.2.2' => 'ICBM Single Subject MRI Frame of Reference', + '1.2.840.10008.1.9' => 'Basic Study Content Notification SOP Class', + '1.2.840.10008.1.20.1' => 'Storage Commitment Push Model SOP Class', + '1.2.840.10008.1.20.1.1' => 'Storage Commitment Push Model SOP Instance', + '1.2.840.10008.1.20.2' => 'Storage Commitment Pull Model SOP Class ', + '1.2.840.10008.1.20.2.1' => 'Storage Commitment Pull Model SOP Instance ', + '1.2.840.10008.1.40' => 'Procedural Event Logging SOP Class', + '1.2.840.10008.1.40.1' => 'Procedural Event Logging SOP Instance', + '1.2.840.10008.1.42' => 'Substance Administration Logging SOP Class', + '1.2.840.10008.1.42.1' => 'Substance Administration Logging SOP Instance', + '1.2.840.10008.2.6.1' => 'DICOM UID Registry', + '1.2.840.10008.2.16.4' => 'DICOM Controlled Terminology', + '1.2.840.10008.3.1.1.1' => 'DICOM Application Context Name', + '1.2.840.10008.3.1.2.1.1' => 'Detached Patient Management SOP Class', + '1.2.840.10008.3.1.2.1.4' => 'Detached Patient Management Meta SOP Class', + '1.2.840.10008.3.1.2.2.1' => 'Detached Visit Management SOP Class', + '1.2.840.10008.3.1.2.3.1' => 'Detached Study Management SOP Class', + '1.2.840.10008.3.1.2.3.2' => 'Study Component Management SOP Class', + '1.2.840.10008.3.1.2.3.3' => 'Modality Performed Procedure Step SOP Class', + '1.2.840.10008.3.1.2.3.4' => 'Modality Performed Procedure Step Retrieve SOP Class', + '1.2.840.10008.3.1.2.3.5' => 'Modality Performed Procedure Step Notification SOP Class', + '1.2.840.10008.3.1.2.5.1' => 'Detached Results Management SOP Class', + '1.2.840.10008.3.1.2.5.4' => 'Detached Results Management Meta SOP Class', + '1.2.840.10008.3.1.2.5.5' => 'Detached Study Management Meta SOP Class', + '1.2.840.10008.3.1.2.6.1' => 'Detached Interpretation Management SOP Class', + '1.2.840.10008.4.2' => 'Storage Service Class Service Class PS 3.4', + '1.2.840.10008.5.1.1.1' => 'Basic Film Session SOP Class', + '1.2.840.10008.5.1.1.2' => 'Basic Film Box SOP Class', + '1.2.840.10008.5.1.1.4' => 'Basic Grayscale Image Box SOP Class', + '1.2.840.10008.5.1.1.4.1' => 'Basic Color Image Box SOP Class', + '1.2.840.10008.5.1.1.4.2' => 'Referenced Image Box SOP Class', + '1.2.840.10008.5.1.1.9' => 'Basic Grayscale Print ManagementMeta SOP Class', + '1.2.840.10008.5.1.1.9.1' => 'Referenced Grayscale Print Management Meta SOP Class', + '1.2.840.10008.5.1.1.14' => 'Print Job SOP Class', + '1.2.840.10008.5.1.1.15' => 'Basic Annotation Box SOP Class', + '1.2.840.10008.5.1.1.16' => 'Printer SOP Class', + '1.2.840.10008.5.1.1.16.376' => 'Printer Configuration Retrieval SOP Class', + '1.2.840.10008.5.1.1.17' => 'Printer SOP Instance', + '1.2.840.10008.5.1.1.17.376' => 'Printer Configuration RetrievalSOP Instance', + '1.2.840.10008.5.1.1.18' => 'Basic Color Print Management Meta SOP Class', + '1.2.840.10008.5.1.1.18.1' => 'Referenced Color Print Management Meta SOP Class', + '1.2.840.10008.5.1.1.22' => 'VOI LUT Box SOP Class', + '1.2.840.10008.5.1.1.23' => 'Presentation LUT SOP Class', + '1.2.840.10008.5.1.1.24' => 'Image Overlay Box SOP Class', + '1.2.840.10008.5.1.1.24.1' => 'Basic Print Image Overlay Box SOP Class', + '1.2.840.10008.5.1.1.25' => 'Print Queue SOP Instance', + '1.2.840.10008.5.1.1.26' => 'Print Queue Management SOP Class', + '1.2.840.10008.5.1.1.27' => 'Stored Print Storage SOP Class', + '1.2.840.10008.5.1.1.29' => 'Hardcopy Grayscale Image', + '1.2.840.10008.5.1.1.30' => 'Hardcopy Color Image Storage SOP Class', + '1.2.840.10008.5.1.1.31' => 'Pull Print Request SOP Class', + '1.2.840.10008.5.1.1.32' => 'Pull Stored Print Management Meta SOP Class', + '1.2.840.10008.5.1.1.33' => 'Media Creation Management SOP Class', + '1.2.840.10008.5.1.4.1.1.1' => 'Computed Radiography Image Storage', + '1.2.840.10008.5.1.4.1.1.1.1' => 'Digital X-Ray Image Storage - For Presentation', + '1.2.840.10008.5.1.4.1.1.1.1.1' => 'Digital X-Ray Image Storage - For Processing', + '1.2.840.10008.5.1.4.1.1.1.2' => 'Digital Mammography X-Ray Image Storage - For Presentation', + '1.2.840.10008.5.1.4.1.1.1.2.1' => 'Digital Mammography X-Ray Image Storage - For Processing', + '1.2.840.10008.5.1.4.1.1.1.3' => 'Digital Intra-oral X-Ray Image Storage - For Presentation', + '1.2.840.10008.5.1.4.1.1.1.3.1' => 'Digital Intra-oral X-Ray Image Storage - For Processing', + '1.2.840.10008.5.1.4.1.1.2' => 'CT Image Storage', + '1.2.840.10008.5.1.4.1.1.2.1' => 'Enhanced CT Image Storage', + '1.2.840.10008.5.1.4.1.1.3' => 'Ultrasound Multi-frame Image Storage ', + '1.2.840.10008.5.1.4.1.1.3.1' => 'Ultrasound Multi-frame Image Storage', + '1.2.840.10008.5.1.4.1.1.4' => 'MR Image Storage', + '1.2.840.10008.5.1.4.1.1.4.1' => 'Enhanced MR Image Storage', + '1.2.840.10008.5.1.4.1.1.4.2' => 'MR Spectroscopy Storage', + '1.2.840.10008.5.1.4.1.1.5' => 'Nuclear Medicine Image Storage', + '1.2.840.10008.5.1.4.1.1.6' => 'Ultrasound Image Storage', + '1.2.840.10008.5.1.4.1.1.6.1' => 'Ultrasound Image Storage', + '1.2.840.10008.5.1.4.1.1.7' => 'Secondary Capture Image Storage', + '1.2.840.10008.5.1.4.1.1.7.1' => 'Multi-frame Single Bit Secondary', + '1.2.840.10008.5.1.4.1.1.7.2' => 'Multi-frame Grayscale Byte Secondary Capture Image Storage', + '1.2.840.10008.5.1.4.1.1.7.3' => 'Multi-frame Grayscale Word Secondary Capture Image Storage', + '1.2.840.10008.5.1.4.1.1.7.4' => 'Multi-frame True Color Secondary Capture Image Storage', + '1.2.840.10008.5.1.4.1.1.8' => 'Standalone Overlay Storage', + '1.2.840.10008.5.1.4.1.1.9' => 'Standalone Curve Storage', + '1.2.840.10008.5.1.4.1.1.9.1' => 'Waveform Storage - Trial (Retired)', + '1.2.840.10008.5.1.4.1.1.9.1.1' => '12-lead ECG Waveform Storage', + '1.2.840.10008.5.1.4.1.1.9.1.2' => 'General ECG Waveform Storage', + '1.2.840.10008.5.1.4.1.1.9.1.3' => 'Ambulatory ECG Waveform Storage', + '1.2.840.10008.5.1.4.1.1.9.2.1' => 'Hemodynamic Waveform Storage', + '1.2.840.10008.5.1.4.1.1.9.3.1' => 'Cardiac Electrophysiology Waveform Storage', + '1.2.840.10008.5.1.4.1.1.9.4.1' => 'Basic Voice Audio Waveform Storage', + '1.2.840.10008.5.1.4.1.1.10' => 'Standalone Modality LUT Storage', + '1.2.840.10008.5.1.4.1.1.11' => 'Standalone VOI LUT Storage', + '1.2.840.10008.5.1.4.1.1.11.1' => 'Grayscale Softcopy Presentation State Storage SOP Class', + '1.2.840.10008.5.1.4.1.1.11.2' => 'Color Softcopy Presentation State Storage SOP Class', + '1.2.840.10008.5.1.4.1.1.11.3' => 'Pseudo-Color Softcopy Presentation State Storage SOP Class', + '1.2.840.10008.5.1.4.1.1.11.4' => 'Blending Softcopy Presentation State Storage SOP Class', + '1.2.840.10008.5.1.4.1.1.12.1' => 'X-Ray Angiographic Image Storage', + '1.2.840.10008.5.1.4.1.1.12.1.1' => 'Enhanced XA Image Storage', + '1.2.840.10008.5.1.4.1.1.12.2' => 'X-Ray Radiofluoroscopic Image Storage', + '1.2.840.10008.5.1.4.1.1.12.2.1' => 'Enhanced XRF Image Storage', + '1.2.840.10008.5.1.4.1.1.12.3' => 'X-Ray Angiographic Bi-Plane Image Storage ', + '1.2.840.10008.5.1.4.1.1.13.1.1' => 'X-Ray 3D Angiographic Image Storage', + '1.2.840.10008.5.1.4.1.1.13.1.2' => 'X-Ray 3D Craniofacial Image Storage', + '1.2.840.10008.5.1.4.1.1.13.1.3' => 'Breast Tomosynthesis Image Storage', + '1.2.840.10008.5.1.4.1.1.14.1' => 'Intravascular Optical Coherence Tomography Image Storage - For Presentation', + '1.2.840.10008.5.1.4.1.1.14.2' => 'Intravascular Optical Coherence Tomography Image Storage - For Processing', + '1.2.840.10008.5.1.4.1.1.20' => 'Nuclear Medicine Image Storage', + '1.2.840.10008.5.1.4.1.1.66' => 'Raw Data Storage', + '1.2.840.10008.5.1.4.1.1.66.1' => 'Spatial Registration Storage', + '1.2.840.10008.5.1.4.1.1.66.2' => 'Spatial Fiducials Storage', + '1.2.840.10008.5.1.4.1.1.66.3' => 'Deformable Spatial Registration Storage', + '1.2.840.10008.5.1.4.1.1.66.4' => 'Segmentation Storage', + '1.2.840.10008.5.1.4.1.1.67' => 'Real World Value Mapping Storage', + '1.2.840.10008.5.1.4.1.1.77.1' => 'VL Image Storage ', + '1.2.840.10008.5.1.4.1.1.77.2' => 'VL Multi-frame Image Storage', + '1.2.840.10008.5.1.4.1.1.77.1.1' => 'VL Endoscopic Image Storage', + '1.2.840.10008.5.1.4.1.1.77.1.1.1' => 'Video Endoscopic Image Storage', + '1.2.840.10008.5.1.4.1.1.77.1.2' => 'VL Microscopic Image Storage', + '1.2.840.10008.5.1.4.1.1.77.1.2.1' => 'Video Microscopic Image Storage', + '1.2.840.10008.5.1.4.1.1.77.1.3' => 'VL Slide-Coordinates Microscopic Image Storage', + '1.2.840.10008.5.1.4.1.1.77.1.4' => 'VL Photographic Image Storage', + '1.2.840.10008.5.1.4.1.1.77.1.4.1' => 'Video Photographic Image Storage', + '1.2.840.10008.5.1.4.1.1.77.1.5.1' => 'Ophthalmic Photography 8 Bit Image Storage', + '1.2.840.10008.5.1.4.1.1.77.1.5.2' => 'Ophthalmic Photography 16 Bit Image Storage', + '1.2.840.10008.5.1.4.1.1.77.1.5.3' => 'Stereometric Relationship Storage', + '1.2.840.10008.5.1.4.1.1.77.1.5.4' => 'Ophthalmic Tomography Image Storage', + '1.2.840.10008.5.1.4.1.1.77.1.6' => 'VL Whole Slide Microscopy Image Storage', + '1.2.840.10008.5.1.4.1.1.78.1' => 'Lensometry Measurements Storage', + '1.2.840.10008.5.1.4.1.1.78.2' => 'Autorefraction Measurements Storage', + '1.2.840.10008.5.1.4.1.1.78.3' => 'Keratometry Measurements Storage', + '1.2.840.10008.5.1.4.1.1.78.4' => 'Subjective Refraction Measurements Storage', + '1.2.840.10008.5.1.4.1.1.78.5' => 'Visual Acuity Measurements Storage', + '1.2.840.10008.5.1.4.1.1.78.6' => 'Spectacle Prescription Report Storage', + '1.2.840.10008.5.1.4.1.1.78.7' => 'Ophthalmic Axial Measurements Storage', + '1.2.840.10008.5.1.4.1.1.78.8' => 'Intraocular Lens Calculations Storage', + '1.2.840.10008.5.1.4.1.1.79.1' => 'Macular Grid Thickness and Volume Report Storage SOP Class', + '1.2.840.10008.5.1.4.1.1.80.1' => 'Ophthalmic Visual Field Static Perimetry Measurements Storage', + '1.2.840.10008.5.1.4.1.1.88.1' => 'Text SR Storage - Trial (Retired)', + '1.2.840.10008.5.1.4.1.1.88.2' => 'Audio SR Storage - Trial (Retired)', + '1.2.840.10008.5.1.4.1.1.88.3' => 'Detail SR Storage - Trial (Retired)', + '1.2.840.10008.5.1.4.1.1.88.4' => 'Comprehensive SR Storage - Trial (Retired)', + '1.2.840.10008.5.1.4.1.1.88.11' => 'Basic Text SR', + '1.2.840.10008.5.1.4.1.1.88.22' => 'Enhanced SR', + '1.2.840.10008.5.1.4.1.1.88.33' => 'Comprehensive SR', + '1.2.840.10008.5.1.4.1.1.88.40' => 'Procedure Log Storage', + '1.2.840.10008.5.1.4.1.1.88.50' => 'Mammography CAD SR', + '1.2.840.10008.5.1.4.1.1.88.59' => 'Key Object Selection Document', + '1.2.840.10008.5.1.4.1.1.88.65' => 'Chest CAD SR', + '1.2.840.10008.5.1.4.1.1.88.67' => 'X-Ray Radiation Dose SR Storage', + '1.2.840.10008.5.1.4.1.1.88.69' => 'Colon CAD SR', + '1.2.840.10008.5.1.4.1.1.88.70' => 'Implantation Plan SR Document Storage', + '1.2.840.10008.5.1.4.1.1.104.1' => 'Encapsulated PDF Storage', + '1.2.840.10008.5.1.4.1.1.104.2' => 'Encapsulated CDA Storage', + '1.2.840.10008.5.1.4.1.1.128' => 'Positron Emission Tomography Image Storage', + '1.2.840.10008.5.1.4.1.1.129' => 'Standalone PET Curve Storage', + '1.2.840.10008.5.1.4.1.1.481.1' => 'RT Image Storage', + '1.2.840.10008.5.1.4.1.1.481.2' => 'RT Dose Storage', + '1.2.840.10008.5.1.4.1.1.481.3' => 'RT Structure Set Storage', + '1.2.840.10008.5.1.4.1.1.481.4' => 'RT Beams Treatment Record Storage', + '1.2.840.10008.5.1.4.1.1.481.5' => 'RT Plan Storage', + '1.2.840.10008.5.1.4.1.1.481.6' => 'RT Brachy Treatment Record Storage', + '1.2.840.10008.5.1.4.1.1.481.7' => 'RT Treatment Summary Record Storage', + '1.2.840.10008.5.1.4.1.1.481.8' => 'RT Ion Plan Storage', + '1.2.840.10008.5.1.4.1.1.481.9' => 'RT Ion Beams Treatment Record Storage', + '1.2.840.10008.5.1.4.1.2.1.1' => 'Patient Root Query/Retrieve Information Model - FIND', + '1.2.840.10008.5.1.4.1.2.1.2' => 'Patient Root Query/Retrieve Information Model - MOVE', + '1.2.840.10008.5.1.4.1.2.1.3' => 'Patient Root Query/Retrieve Information Model - GET', + '1.2.840.10008.5.1.4.1.2.2.1' => 'Study Root Query/Retrieve Information Model - FIND', + '1.2.840.10008.5.1.4.1.2.2.2' => 'Study Root Query/Retrieve Information Model - MOVE', + '1.2.840.10008.5.1.4.1.2.2.3' => 'Study Root Query/Retrieve Information Model - GET', + '1.2.840.10008.5.1.4.1.2.3.1' => 'Patient/Study Only Query/Retrieve Information Model - FIND', + '1.2.840.10008.5.1.4.1.2.3.2' => 'Patient/Study Only Query/Retrieve Information Model - MOVE', + '1.2.840.10008.5.1.4.1.2.3.3' => 'Patient/Study Only Query/Retrieve Information Model - GET', + '1.2.840.10008.5.1.4.31' => 'Modality Worklist Information Model - FIND', + '1.2.840.10008.5.1.4.32.1' => 'General Purpose Worklist Information Model - FIND', + '1.2.840.10008.5.1.4.32.2' => 'General Purpose Scheduled Procedure Step SOP Class', + '1.2.840.10008.5.1.4.32.3' => 'General Purpose Performed Procedure Step SOP Class', + '1.2.840.10008.5.1.4.32' => 'General Purpose Worklist Management Meta SOP Class', + '1.2.840.10008.5.1.4.33' => 'Instance Availability Notification SOP Class', + '1.2.840.10008.5.1.4.34.1' => 'RT Beams Delivery Instruction Storage', + '1.2.840.10008.5.1.4.34.2' => 'RT Conventional Machine Verification', + '1.2.840.10008.5.1.4.34.3' => 'RT Ion Machine Verification', + '1.2.840.10008.5.1.4.34.4' => 'Unified Worklist and Procedure Step Service Class', + '1.2.840.10008.5.1.4.34.4.1' => 'Unified Procedure Step - Push SOP Class', + '1.2.840.10008.5.1.4.34.4.2' => 'Unified Procedure Step - Watch SOP Class', + '1.2.840.10008.5.1.4.34.4.3' => 'Unified Procedure Step - Pull SOP Class', + '1.2.840.10008.5.1.4.34.4.4' => 'Unified Procedure Step - Event SOP Class', + '1.2.840.10008.5.1.4.34.5' => 'Unified Worklist and Procedure Step SOP Instance', + '1.2.840.10008.5.1.4.34.6.1' => 'Unified Procedure Step - Push SOP Class', + '1.2.840.10008.5.1.4.34.6.2' => 'Unified Procedure Step - Watch SOP Class', + '1.2.840.10008.5.1.4.34.6.3' => 'Unified Procedure Step - Pull SOP Class', + '1.2.840.10008.5.1.4.34.6.4' => 'Unified Procedure Step - Event SOP Class', + '1.2.840.10008.5.1.4.34.7' => 'RT Beams Delivery Instruction Storage', + '1.2.840.10008.5.1.4.34.8' => 'RT Conventional Machine Verification', + '1.2.840.10008.5.1.4.34.9' => 'RT Ion Machine Verification', + '1.2.840.10008.5.1.4.37.1' => 'General Relevant Patient Information Query', + '1.2.840.10008.5.1.4.37.2' => 'Breast Imaging Relevant Patient Information Query', + '1.2.840.10008.5.1.4.37.3' => 'Cardiac Relevant Patient Information Query', + '1.2.840.10008.5.1.4.38.1' => 'Hanging Protocol Storage', + '1.2.840.10008.5.1.4.38.2' => 'Hanging Protocol Information Model - FIND', + '1.2.840.10008.5.1.4.38.3' => 'Hanging Protocol Information Model - MOVE', + '1.2.840.10008.5.1.4.39.1' => 'Color Palette Storage', + '1.2.840.10008.5.1.4.39.2' => 'Color Palette Information Model - FIND', + '1.2.840.10008.5.1.4.39.3' => 'Color Palette Information Model - MOVE', + '1.2.840.10008.5.1.4.39.4' => 'Color Palette Information Model - GET', + '1.2.840.10008.5.1.4.41' => 'Product Characteristics Query SOP Class', + '1.2.840.10008.5.1.4.42' => 'Substance Approval Query SOP Class', + '1.2.840.10008.5.1.4.43.1' => 'Generic Implant Template Storage', + '1.2.840.10008.5.1.4.43.2' => 'Generic Implant Template Information Model - FIND', + '1.2.840.10008.5.1.4.43.3' => 'Generic Implant Template Information Model - MOVE', + '1.2.840.10008.5.1.4.43.4' => 'Generic Implant Template Information Model - GET', + '1.2.840.10008.5.1.4.44.1' => 'Implant Assembly Template Storage', + '1.2.840.10008.5.1.4.44.2' => 'Implant Assembly Template Information Model - FIND', + '1.2.840.10008.5.1.4.44.3' => 'Implant Assembly Template Information Model - MOVE', + '1.2.840.10008.5.1.4.44.4' => 'Implant Assembly Template Information Model - GET', + '1.2.840.10008.5.1.4.45.1' => 'Implant Template Group Storage', + '1.2.840.10008.5.1.4.45.2' => 'Implant Template Group Information Model - FIND', + '1.2.840.10008.5.1.4.45.3' => 'Implant Template Group Information Model - MOVE', + '1.2.840.10008.5.1.4.45.4' => 'Implant Template Group Information Model - GET', + '1.2.840.10008.15.0.3.1' => 'dicomDeviceName', + '1.2.840.10008.15.0.3.2' => 'dicomDescription', + '1.2.840.10008.15.0.3.3' => 'dicomManufacturer', + '1.2.840.10008.15.0.3.4' => 'dicomManufacturerModelName', + '1.2.840.10008.15.0.3.5' => 'dicomSoftwareVersion', + '1.2.840.10008.15.0.3.6' => 'dicomVendorData', + '1.2.840.10008.15.0.3.7' => 'dicomAETitle', + '1.2.840.10008.15.0.3.8' => 'dicomNetworkConnectionReference', + '1.2.840.10008.15.0.3.9' => 'dicomApplicationCluster', + '1.2.840.10008.15.0.3.10' => 'dicomAssociationInitiator', + '1.2.840.10008.15.0.3.11' => 'dicomAssociationAcceptor', + '1.2.840.10008.15.0.3.12' => 'dicomHostname', + '1.2.840.10008.15.0.3.13' => 'dicomPort', + '1.2.840.10008.15.0.3.14' => 'dicomSOPClass', + '1.2.840.10008.15.0.3.15' => 'dicomTransferRole', + '1.2.840.10008.15.0.3.16' => 'dicomTransferSyntax', + '1.2.840.10008.15.0.3.17' => 'dicomPrimaryDeviceType', + '1.2.840.10008.15.0.3.18' => 'dicomRelatedDeviceReference', + '1.2.840.10008.15.0.3.19' => 'dicomPreferredCalledAETitle', + '1.2.840.10008.15.0.3.20' => 'dicomTLSCyphersuite', + '1.2.840.10008.15.0.3.21' => 'dicomAuthorizedNodeCertificateReference', + '1.2.840.10008.15.0.3.22' => 'dicomThisNodeCertificateReference', + '1.2.840.10008.15.0.3.23' => 'dicomInstalled', + '1.2.840.10008.15.0.3.24' => 'dicomStationName', + '1.2.840.10008.15.0.3.25' => 'dicomDeviceSerialNumber', + '1.2.840.10008.15.0.3.26' => 'dicomInstitutionName', + '1.2.840.10008.15.0.3.27' => 'dicomInstitutionAddress', + '1.2.840.10008.15.0.3.28' => 'dicomInstitutionDepartmentName', + '1.2.840.10008.15.0.3.29' => 'dicomIssuerOfPatientID', + '1.2.840.10008.15.0.3.30' => 'dicomPreferredCallingAETitle', + '1.2.840.10008.15.0.3.31' => 'dicomSupportedCharacterSet', + '1.2.840.10008.15.0.4.1' => 'dicomConfigurationRoot', + '1.2.840.10008.15.0.4.2' => 'dicomDevicesRoot', + '1.2.840.10008.15.0.4.3' => 'dicomUniqueAETitlesRegistryRoot', + '1.2.840.10008.15.0.4.4' => 'dicomDevice', + '1.2.840.10008.15.0.4.5' => 'dicomNetworkAE', + '1.2.840.10008.15.0.4.6' => 'dicomNetworkConnection', + '1.2.840.10008.15.0.4.7' => 'dicomUniqueAETitle', + '1.2.840.10008.15.0.4.8' => 'dicomTransferCapability', +); + +#------------------------------------------------------------------------------ +# Extract information from a DICOM (DCM) image +# Inputs: 0) ExifTool object reference, 1) DirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid DICOM file +sub ProcessDICOM($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $unknown = $et->Options('Unknown'); + my $verbose = $et->Options('Verbose'); + my ($hdr, $buff, $implicit, $vr, $len); +# +# identify the DICOM or ACR-NEMA file +# + $raf->Read($hdr, 12) == 12 or return 0; # save for ACR identification later + $raf->Seek(128, 0) or return 0; # skip to end of DICM header + $raf->Read($buff, 4) == 4 or return 0; # read signature + if ($buff eq 'DICM') { + # file meta information transfer syntax is explicit little endian + SetByteOrder('II'); + $et->SetFileType('DICOM'); + } else { + # test for a RAW DCM image (ACR-NEMA format, ie. no header) + foreach ('II','MM','') { + return 0 unless $_; # no luck identifying the syntax + SetByteOrder($_); + my $g = Get16u(\$hdr, 0); + # expect group number to be small and even + next if $g < 2 or $g > 8 or $g & 0x01; + my $e = Get16u(\$hdr, 2); + next if $e > 0x20; # expect a low element number at start + $vr = substr($hdr, 4, 2); # look for explicit VR + if ($vr =~ /^[A-Z]{2}$/) { + $implicit = 0; + if ($vr32{$vr}) { + next unless Get16u(\$hdr, 6) == 0; # must be 2 zero bytes + $len = Get32u(\$hdr, 8); + } else { + next if $e == 0 and $vr ne 'UL'; # group length must be UL + $len = Get16u(\$hdr, 6); + } + } else { + $implicit = 1; + $len = Get32u(\$hdr, 4); + } + next if $e == 0 and $len != 4; # group length value must be 4 bytes + next if $len > 64; # first element shouldn't be too long + last; # success! + } + $raf->Seek(0, 0) or return 0; # rewind to start of file + $et->SetFileType('ACR'); + } +# +# process the meta information +# + my $tagTablePtr = GetTagTable('Image::ExifTool::DICOM::Main'); + my $pos = $raf->Tell(); + my $err = 1; + my ($transferSyntax, $group2end); + for (;;) { + $raf->Read($buff, 8) == 8 or $err = 0, last; + $pos += 8; + my $group = Get16u(\$buff, 0); + # implement the transfer syntax at the end of the group 2 data + if ($transferSyntax and ($group != 0x0002 or + ($group2end and $pos > $group2end))) + { + # 1.2.840.10008.1.2 = implicit VR little endian + # 1.2.840.10008.1.2.2 = explicit VR big endian + # 1.2.840.10008.1.2.x = explicit VR little endian + # 1.2.840.10008.1.2.1.99 = deflated + unless ($transferSyntax =~ /^1\.2\.840\.10008\.1\.2(\.\d+)?(\.\d+)?/) { + $et->Warn("Unrecognized transfer syntax $transferSyntax"); + last; + } + if (not $1) { + $implicit = 1; + } elsif ($1 eq '.2') { + SetByteOrder('MM'); + $group = Get16u(\$buff, 0); # must get group again + } elsif ($1 eq '.1' and $2 and $2 eq '.99') { + # inflate compressed data stream + if (eval { require Compress::Zlib }) { + # must use undocumented zlib feature to disable zlib header information + # because DICOM deflated data doesn't have the zlib header (ref 3) + my $wbits = -Compress::Zlib::MAX_WBITS(); + my $inflate = Compress::Zlib::inflateInit(-WindowBits => $wbits); + if ($inflate) { + $raf->Seek(-8, 1) or last; + my $data = ''; + while ($raf->Read($buff, 65536)) { + my ($buf, $stat) = $inflate->inflate($buff); + if ($stat == Compress::Zlib::Z_OK() or + $stat == Compress::Zlib::Z_STREAM_END()) + { + $data .= $buf; + last if $stat == Compress::Zlib::Z_STREAM_END(); + } else { + $et->Warn('Error inflating compressed data stream'); + return 1; + } + } + last if length $data < 8; + # create new RAF object from inflated data stream + $raf = new File::RandomAccess(\$data); + # re-read start of stream (now decompressed) + $raf->Read($buff, 8) == 8 or last; + $group = Get16u(\$buff, 0); + } else { + $et->Warn('Error initializing inflation'); + return 1; + } + } else { + $et->Warn('Install Compress::Zlib to decode compressed data stream'); + return 1; + } + } + undef $transferSyntax; + } + my $element = Get16u(\$buff,2); + my $tag = sprintf('%.4X,%.4X', $group, $element); + + if ($implicit or $implicitVR{$tag}) { + # treat everything as string if implicit VR because it + # isn't worth it to generate the necessary VR lookup tables + # for the thousands of defined data elements + $vr = ''; # no VR (treat everything as string) + $len = Get32u(\$buff, 4); + } else { + $vr = substr($buff,4,2); + last unless $vr =~ /^[A-Z]{2}$/; + if ($vr32{$vr}) { + $raf->Read($buff, 4) == 4 or last; + $pos += 4; + $len = Get32u(\$buff, 0); + $len = 0 if $vr eq 'SQ'; # just recurse into sequences + } else { + $len = Get16u(\$buff, 6); + } + } + if ($len == 0xffffffff) { + $len = 0; # don't read value if undefined length + if ($verbose) { + # start list of items in verbose output + $et->VPrint(0, "$$et{INDENT}+ [List of items]\n"); + $$et{INDENT} .= '| '; + } + } + # read the element value + if ($len) { + $raf->Read($buff, $len) == $len or last; + $pos += $len; + } else { + $buff = ''; + } + + # handle tags not found in the table + my $tagInfo = $$tagTablePtr{$tag}; + unless ($tagInfo) { + # accept tag ID's with "x" for a wildcard in the following patterns: + # '60xx,1203', '0020,31xx', '0028,04x2', '1000,xxx0', '1010,xxxx' + my $xx; + if ((($xx = $tag) =~ s/^(..)../$1xx/ and $$tagTablePtr{$xx}) or + (($xx = $tag) =~ s/..$/xx/ and $$tagTablePtr{$xx}) or + (($xx = $tag) =~ s/.(.)$/x$1/ and $$tagTablePtr{$xx}) or + (($xx = $tag) =~ s/...(.)$/xxx$1/ and $$tagTablePtr{$xx}) or + (($xx = $tag) =~ s/....$/xxxx/ and $$tagTablePtr{$xx})) + { + $tag = $xx; + $tagInfo = $$tagTablePtr{$xx}; + } elsif ($unknown) { + # create tag info hash for unknown elements + if ($element == 0) { # element zero is group length + $tagInfo = { + Name => sprintf("Group%.4X_Length", $group), + Description => sprintf("Group %.4X Length", $group), + }; + } else { + $tagInfo = { + Name => sprintf("DICOM_%.4X_%.4X", $group, $element), + Description => sprintf("DICOM %.4X,%.4X", $group, $element), + }; + } + $$tagInfo{Unknown} = 1; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + } + # get VR from our tag information if implicit + $vr = $$tagInfo{VR} || ' ' if $tagInfo and not $vr; + + if ($element == 0) { + $vr = 'UL'; # group length element is always unsigned long + } + my $val; + my $format = $dicomFormat{$vr}; + # remove trailing space used to pad to an even number of characters + $buff =~ s/ $// unless $format or length($buff) & 0x01; + if ($len > 1024) { + # treat large data elements as binary data + my $binData; + my $lcTag = $tagInfo ? lc($$tagInfo{Name}) : 'unknown'; + if ($$et{REQ_TAG_LOOKUP}{$lcTag} or + ($$et{OPTIONS}{Binary} and not $$et{EXCL_TAG_LOOKUP}{$lcTag})) + { + $binData = $buff; # must make a copy + } else { + $binData = "Binary data $len bytes"; + } + $val = \$binData; + } elsif ($format) { + $val = ReadValue(\$buff, 0, $format, undef, $len); + } else { + $val = $buff; + $format = 'string'; + if ($vr eq 'DA') { + # format date values + $val =~ s/^ *(\d{4})(\d{2})(\d{2})/$1:$2:$3/; + } elsif ($vr eq 'TM') { + # format time values + $val =~ s/^ *(\d{2})(\d{2})(\d{2}[^ ]*)/$1:$2:$3/; + } elsif ($vr eq 'DT') { + # format date/time values + $val =~ s/^ *(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}[^ ]*)/$1:$2:$3 $4:$5:$6/; + } elsif ($vr eq 'AT' and $len == 4) { + # convert attribute tag ID to hex format + my ($g, $e) = (Get16u(\$buff,0), Get16u(\$buff,2)); + $val = sprintf('%.4X,%.4X', $g, $e); + } elsif ($vr eq 'UI') { + # add PrintConv to translate registered UID's + $val =~ s/\0.*//s; # truncate at null + $$tagInfo{PrintConv} = \%uid if $uid{$val} and $tagInfo; + } elsif ($vr =~ /^(AE|CS|DS|IS|LO|PN|SH)$/) { + $val =~ s/ +$//; # leading/trailing spaces not significant + $val =~ s/^ +//; + } elsif ($vr =~ /^(LT|ST|UT)$/) { + $val =~ s/ +$//; # trailing spaces not significant + } + } + # save the group 2 end position and transfer syntax + if ($group == 0x0002) { + $element == 0x0000 and $group2end = $pos + $val; + $element == 0x0010 and $transferSyntax = $val; + } + + # handle the new tag information + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => \$buff, + DataPos => $pos - $len, + Format => $format, + Start => 0, + Size => $len, + Extra => " ($vr)", + ); + + # stop indenting for list if we reached EndOfItems tag + $$et{INDENT} =~ s/..$// if $verbose and $tag eq 'FFFE,E00D'; + } + $err and $et->Warn('Error reading DICOM file (corrupted?)'); + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::DICOM - Read DICOM and ACR-NEMA medical images + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to extract meta +information from DICOM (Digital Imaging and Communications in Medicine) DCM +and ACR-NEMA (American College of Radiology - National Electrical +Manufacturer's Association) ACR medical images. + +=head1 NOTES + +Images compressed using the DICOM deflated transfer syntax will be decoded +if Compress::Zlib is installed. + +No translation of special characters sets is done. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://medical.nema.org/> + +=item L<http://www.sph.sc.edu/comd/rorden/dicom.html> + +=item L<http://www.dclunie.com/> + +=item L<http://www.gehealthcare.com/usen/interoperability/dicom/docs/2258357r3.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/DICOM Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/DJI.pm b/lib/Image/ExifTool/DJI.pm new file mode 100644 index 0000000..4a2d8ae --- /dev/null +++ b/lib/Image/ExifTool/DJI.pm @@ -0,0 +1,223 @@ +#------------------------------------------------------------------------------ +# File: DJI.pm +# +# Description: DJI Phantom maker notes tags +# +# Revisions: 2016-07-25 - P. Harvey Created +# 2017-06-23 - PH Added XMP tags +#------------------------------------------------------------------------------ + +package Image::ExifTool::DJI; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::XMP; +use Image::ExifTool::GPS; + +$VERSION = '1.06'; + +sub ProcessDJIInfo($$$); + +my %convFloat2 = ( + PrintConv => 'sprintf("%+.2f", $val)', + PrintConvInv => '$val', +); + +# DJI maker notes (ref PH, mostly educated guesses based on DJI QuickTime::UserData tags) +%Image::ExifTool::DJI::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + This table lists tags found in the maker notes of images from some DJI + Phantom drones. + }, + 0x01 => { Name => 'Make', Writable => 'string' }, + # 0x02 - int8u[4]: "1 0 0 0", "1 1 0 0" + 0x03 => { Name => 'SpeedX', Writable => 'float', %convFloat2 }, # (guess) + 0x04 => { Name => 'SpeedY', Writable => 'float', %convFloat2 }, # (guess) + 0x05 => { Name => 'SpeedZ', Writable => 'float', %convFloat2 }, # (guess) + 0x06 => { Name => 'Pitch', Writable => 'float', %convFloat2 }, + 0x07 => { Name => 'Yaw', Writable => 'float', %convFloat2 }, + 0x08 => { Name => 'Roll', Writable => 'float', %convFloat2 }, + 0x09 => { Name => 'CameraPitch',Writable => 'float', %convFloat2 }, + 0x0a => { Name => 'CameraYaw', Writable => 'float', %convFloat2 }, + 0x0b => { Name => 'CameraRoll', Writable => 'float', %convFloat2 }, +); + +# DJI debug maker notes +%Image::ExifTool::DJI::Info = ( + PROCESS_PROC => \&ProcessDJIInfo, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Tags written by some DJI drones.', + VARS => { LONG_TAGS => 2 }, + ae_dbg_info => { Name => 'AEDebugInfo' }, + ae_histogram_info => { Name => 'AEHistogramInfo' }, + ae_local_histogram => { Name => 'AELocalHistogram' }, + ae_liveview_histogram_info => { Name => 'AELiveViewHistogramInfo' }, + ae_liveview_local_histogram => { Name => 'AELiveViewLocalHistogram' }, + awb_dbg_info => { Name => 'AWBDebugInfo' }, + af_dbg_info => { Name => 'AFDebugInfo' }, + hiso => { Name => 'Histogram' }, + xidiri => { Name => 'Xidiri' }, + 'GimbalDegree(Y,P,R)'=> { Name => 'GimbalDegree' }, + 'FlightDegree(Y,P,R)'=> { Name => 'FlightDegree' }, + adj_dbg_info => { Name => 'ADJDebugInfo' }, + sensor_id => { Name => 'SensorID' }, + 'FlightSpeed(X,Y,Z)' => { Name => 'FlightSpeed' }, + hyperlapse_dbg_info => { Name => 'HyperlapsDebugInfo' }, +); + +# thermal parameters in APP4 of DJI ZH20T images (ref forum11401) +%Image::ExifTool::DJI::ThermalParams = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'APP4', 2 => 'Image' }, + NOTES => 'Thermal parameters extracted from APP4 of DJI RJPEG files from the ZH20T.', + # 0x00 - 0xaa551206 - temperature header magic number + 0x24 => { Name => 'K1', Format => 'float' }, + 0x28 => { Name => 'K2', Format => 'float' }, + 0x2c => { Name => 'K3', Format => 'float' }, + 0x30 => { Name => 'K4', Format => 'float' }, + 0x34 => { Name => 'KF', Format => 'float' }, + 0x38 => { Name => 'B1', Format => 'float' }, + 0x3c => { Name => 'B2', Format => 'float' }, + 0x44 => { Name => 'ObjectDistance', Format => 'int16u' }, + 0x46 => { Name => 'RelativeHumidity', Format => 'int16u' }, + 0x48 => { Name => 'Emissivity', Format => 'int16u' }, + 0x4a => { Name => 'Reflection', Format => 'int16u', }, + 0x4c => { Name => 'AmbientTemperature', Format => 'int16u' }, # (aka D1) + 0x50 => { Name => 'D2', Format => 'int32s' }, + 0x54 => { Name => 'KJ', Format => 'int16u' }, + 0x56 => { Name => 'DB', Format => 'int16u' }, + 0x58 => { Name => 'KK', Format => 'int16u' }, + # 0x500 - 0x55aa1206 - device header magic number + # (nothing yet decoded from device header) +); + +%Image::ExifTool::DJI::XMP = ( + %Image::ExifTool::XMP::xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-drone-dji', 2 => 'Location' }, + NAMESPACE => 'drone-dji', + TABLE_DESC => 'XMP DJI', + VARS => { NO_ID => 1 }, + NOTES => 'XMP tags used by DJI for images from drones.', + AbsoluteAltitude => { Writable => 'real' }, + RelativeAltitude => { Writable => 'real' }, + GimbalRollDegree => { Writable => 'real' }, + GimbalYawDegree => { Writable => 'real' }, + GimbalPitchDegree => { Writable => 'real' }, + FlightRollDegree => { Writable => 'real' }, + FlightYawDegree => { Writable => 'real' }, + FlightPitchDegree => { Writable => 'real' }, + GpsLatitude => { + Name => 'GPSLatitude', + Writable => 'real', + Avoid => 1, + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")', + }, + GpsLongtitude => { # (sic) + Name => 'GPSLongtitude', + Writable => 'real', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")', + }, + GpsLongitude => { #PH (NC) + Name => 'GPSLongitude', + Writable => 'real', + Avoid => 1, + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")', + }, + FlightXSpeed => { Writable => 'real' }, + FlightYSpeed => { Writable => 'real' }, + FlightZSpeed => { Writable => 'real' }, + CamReverse => { }, # integer? + GimbalReverse => { }, # integer? + SelfData => { Groups => { 2 => 'Image' } }, + CalibratedFocalLength => { Writable => 'real', Groups => { 2 => 'Image' } }, + CalibratedOpticalCenterX => { Writable => 'real', Groups => { 2 => 'Image' } }, + CalibratedOpticalCenterY => { Writable => 'real', Groups => { 2 => 'Image' } }, + RtkFlag => { }, # integer? + RtkStdLon => { Writable => 'real' }, + RtkStdLat => { Writable => 'real' }, + RtkStdHgt => { Writable => 'real' }, + DewarpData => { Groups => { 2 => 'Image' } }, + DewarpFlag => { Groups => { 2 => 'Image' } }, # integer? + Latitude => { + Name => 'Latitude', + Writable => 'real', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")', + }, + Longitude => { + Name => 'Longitude', + Writable => 'real', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")', + }, +); + +#------------------------------------------------------------------------------ +# Process DJI infor (ref PH) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessDJIInfo($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart); + if ($dirStart) { + my $buff = substr($$dataPt, $dirStart, $dirLen); + $dataPt = \$buff; + } + while ($$dataPt =~ /\G\[(.*?)\](?=(\[|$))/sg) { + my ($tag, $val) = split /:/, $1, 2; + next unless defined $tag and defined $val; + if ($val =~ /^([\x20-\x7f]+)\0*$/) { + $val = $1; + } else { + my $buff = $val; + $val = \$buff; + } + if (not $$tagTbl{$tag} and $tag=~ /^[-_a-zA-Z0-9]+$/) { + my $name = $tag; + $name =~ s/_([a-z])/_\U$1/g; + AddTagToTable($tagTbl, $tag, { Name => Image::ExifTool::MakeTagName($name) }); + } + $et->HandleTag($tagTbl, $tag, $val); + } + return 1; +} + +__END__ + +=head1 NAME + +Image::ExifTool::DJI - DJI Phantom maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +the maker notes in images from some DJI Phantom drones. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/DJI Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/DNG.pm b/lib/Image/ExifTool/DNG.pm new file mode 100644 index 0000000..9c0babf --- /dev/null +++ b/lib/Image/ExifTool/DNG.pm @@ -0,0 +1,848 @@ +#------------------------------------------------------------------------------ +# File: DNG.pm +# +# Description: Read DNG-specific information +# +# Revisions: 01/09/2006 - P. Harvey Created +# +# References: 1) http://www.adobe.com/products/dng/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::DNG; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::MakerNotes; +use Image::ExifTool::CanonRaw; + +$VERSION = '1.23'; + +sub ProcessOriginalRaw($$$); +sub ProcessAdobeData($$$); +sub ProcessAdobeMakN($$$); +sub ProcessAdobeCRW($$$); +sub ProcessAdobeRAF($$$); +sub ProcessAdobeMRW($$$); +sub ProcessAdobeSR2($$$); +sub ProcessAdobeIFD($$$); +sub WriteAdobeStuff($$$); + +# data in OriginalRawFileData +%Image::ExifTool::DNG::OriginalRaw = ( + GROUPS => { 2 => 'Image' }, + PROCESS_PROC => \&ProcessOriginalRaw, + NOTES => q{ + This table defines tags extracted from the DNG OriginalRawFileData + information. + }, + 0 => { Name => 'OriginalRawImage', Binary => 1 }, + 1 => { Name => 'OriginalRawResource', Binary => 1 }, + 2 => 'OriginalRawFileType', + 3 => 'OriginalRawCreator', + 4 => { Name => 'OriginalTHMImage', Binary => 1 }, + 5 => { Name => 'OriginalTHMResource', Binary => 1 }, + 6 => 'OriginalTHMFileType', + 7 => 'OriginalTHMCreator', +); + +%Image::ExifTool::DNG::AdobeData = ( #PH + GROUPS => { 0 => 'MakerNotes', 1 => 'AdobeDNG', 2 => 'Image' }, + PROCESS_PROC => \&ProcessAdobeData, + WRITE_PROC => \&WriteAdobeStuff, + NOTES => q{ + This information is found in the "Adobe" DNGPrivateData. + + The maker notes ('MakN') are processed by ExifTool, but some information may + have been lost by the Adobe DNG Converter. This is because the Adobe DNG + Converter (as of version 6.3) doesn't properly handle information referenced + from inside the maker notes that lies outside the original maker notes + block. This information is lost when only the maker note block is copied to + the DNG image. While this doesn't effect all makes of cameras, it is a + problem for some major brands such as Olympus and Sony. + + Other entries in this table represent proprietary information that is + extracted from the original RAW image and restructured to a different (but + still proprietary) Adobe format. + }, + MakN => [ ], # (filled in later) + 'CRW ' => { + Name => 'AdobeCRW', + SubDirectory => { + TagTable => 'Image::ExifTool::CanonRaw::Main', + ProcessProc => \&ProcessAdobeCRW, + WriteProc => \&WriteAdobeStuff, + }, + }, + 'MRW ' => { + Name => 'AdobeMRW', + SubDirectory => { + TagTable => 'Image::ExifTool::MinoltaRaw::Main', + ProcessProc => \&ProcessAdobeMRW, + WriteProc => \&WriteAdobeStuff, + }, + }, + 'SR2 ' => { + Name => 'AdobeSR2', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::SR2Private', + ProcessProc => \&ProcessAdobeSR2, + }, + }, + 'RAF ' => { + Name => 'AdobeRAF', + SubDirectory => { + TagTable => 'Image::ExifTool::FujiFilm::RAF', + ProcessProc => \&ProcessAdobeRAF, + }, + }, + 'Pano' => { + Name => 'AdobePano', + SubDirectory => { + TagTable => 'Image::ExifTool::PanasonicRaw::Main', + ProcessProc => \&ProcessAdobeIFD, + }, + }, + 'Koda' => { + Name => 'AdobeKoda', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::IFD', + ProcessProc => \&ProcessAdobeIFD, + }, + }, + 'Leaf' => { + Name => 'AdobeLeaf', + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::SubIFD', + ProcessProc => \&ProcessAdobeIFD, + }, + }, +); + +# fill in maker notes +{ + my $tagInfo; + my $list = $Image::ExifTool::DNG::AdobeData{MakN}; + foreach $tagInfo (@Image::ExifTool::MakerNotes::Main) { + unless (ref $tagInfo eq 'HASH') { + push @$list, $tagInfo; + next; + } + my %copy = %$tagInfo; + delete $copy{Groups}; + delete $copy{GotGroups}; + delete $copy{Table}; + push @$list, \%copy; + } +} + +#------------------------------------------------------------------------------ +# Process DNG OriginalRawFileData information +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, otherwise returns 0 and sets a Warning +sub ProcessOriginalRaw($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $start = $$dirInfo{DirStart}; + my $end = $start + $$dirInfo{DirLen}; + my $pos = $start; + my ($index, $err); + + SetByteOrder('MM'); # pointers are always big-endian in this structure + for ($index=0; $index<8; ++$index) { + last if $pos + 4 > $end; + my $val = Get32u($dataPt, $pos); + $val or $pos += 4, next; # ignore zero values + my $tagInfo = $et->GetTagInfo($tagTablePtr, $index); + $tagInfo or $err = "Missing DNG tag $index", last; + if ($index & 0x02) { + # extract a simple file type (tags 2, 3, 6 and 7) + $val = substr($$dataPt, $pos, 4); + $pos += 4; + } else { + # extract a compressed data block (tags 0, 1, 4 and 5) + my $n = int(($val + 65535) / 65536); + my $hdrLen = 4 * ($n + 2); + $pos + $hdrLen > $end and $err = '', last; + my $tag = $$tagInfo{Name}; + # only extract this information if requested (because it takes time) + my $lcTag = lc $tag; + if (($$et{OPTIONS}{Binary} and not $$et{EXCL_TAG_LOOKUP}{$lcTag}) or + $$et{REQ_TAG_LOOKUP}{$lcTag}) + { + unless (eval { require Compress::Zlib }) { + $err = 'Install Compress::Zlib to extract compressed images'; + last; + } + my $i; + $val = ''; + my $p2 = $pos + Get32u($dataPt, $pos + 4); + for ($i=0; $i<$n; ++$i) { + # inflate this compressed block + my $p1 = $p2; + $p2 = $pos + Get32u($dataPt, $pos + ($i + 2) * 4); + if ($p1 >= $p2 or $p2 > $end) { + $err = 'Bad compressed RAW image'; + last; + } + my $buff = substr($$dataPt, $p1, $p2 - $p1); + my ($v2, $stat); + my $inflate = Compress::Zlib::inflateInit(); + $inflate and ($v2, $stat) = $inflate->inflate($buff); + if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) { + $val .= $v2; + } else { + $err = 'Error inflating compressed RAW image'; + last; + } + } + $pos = $p2; + } else { + $pos + $hdrLen > $end and $err = '', last; + my $len = Get32u($dataPt, $pos + $hdrLen - 4); + $pos + $len > $end and $err = '', last; + $val = substr($$dataPt, $pos + $hdrLen, $len - $hdrLen); + $val = "Binary data $len bytes"; + $pos += $len; # skip over this block + } + } + $et->FoundTag($tagInfo, $val); + } + $et->Warn($err || 'Bad OriginalRawFileData') if defined $err; + return 1; +} + +#------------------------------------------------------------------------------ +# Process Adobe DNGPrivateData directory +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessAdobeData($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $pos = $$dirInfo{DirStart}; + my $end = $$dirInfo{DirLen} + $pos; + my $outfile = $$dirInfo{OutFile}; + my $verbose = $et->Options('Verbose'); + my $htmlDump = $et->Options('HtmlDump'); + + return 0 unless $$dataPt =~ /^Adobe\0/; + unless ($outfile) { + $et->VerboseDir($dirInfo); + # don't parse makernotes if FastScan > 1 + my $fast = $et->Options('FastScan'); + return 1 if $fast and $fast > 1; + } + $htmlDump and $et->HDump($dataPos, 6, 'Adobe DNGPrivateData header'); + SetByteOrder('MM'); # always big endian + $pos += 6; + while ($pos + 8 <= $end) { + my ($tag, $size) = unpack("x${pos}a4N", $$dataPt); + $pos += 8; + last if $pos + $size > $end; + my $tagInfo = $$tagTablePtr{$tag}; + if ($htmlDump) { + my $name = "Adobe$tag"; + $name =~ tr/ //d; + $et->HDump($dataPos + $pos - 8, 8, "$name header", "Data Size: $size bytes"); + # dump non-EXIF format data + unless ($tag =~ /^(MakN|SR2 )$/) { + $et->HDump($dataPos + $pos, $size, "$name data"); + } + } + if ($verbose and not $outfile) { + $tagInfo or $et->VPrint(0, "$$et{INDENT}Unsupported DNGAdobeData record: ($tag)\n"); + $et->VerboseInfo($tag, + ref $tagInfo eq 'HASH' ? $tagInfo : undef, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $pos, + Size => $size, + ); + } + my $value; + while ($tagInfo) { + my ($subTable, $subName, $processProc); + if (ref $tagInfo eq 'HASH') { + unless ($$tagInfo{SubDirectory}) { + if ($outfile) { + # copy value across to outfile + $value = substr($$dataPt, $pos, $size); + } else { + $et->HandleTag($tagTablePtr, $tag, substr($$dataPt, $pos, $size)); + } + last; + } + $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + $subName = $$tagInfo{Name}; + $processProc = $tagInfo->{SubDirectory}->{ProcessProc}; + } else { + $subTable = $tagTablePtr; + $subName = 'AdobeMakN'; + $processProc = \&ProcessAdobeMakN; + } + my %dirInfo = ( + Base => $$dirInfo{Base}, + DataPt => $dataPt, + DataPos => $dataPos, + DataLen => $$dirInfo{DataLen}, + DirStart => $pos, + DirLen => $size, + DirName => $subName, + ); + if ($outfile) { + $dirInfo{Proc} = $processProc; # WriteAdobeStuff() calls this to do the actual writing + $value = $et->WriteDirectory(\%dirInfo, $subTable, \&WriteAdobeStuff); + # use old directory if an error occurred + defined $value or $value = substr($$dataPt, $pos, $size); + } else { + # override process proc for MakN + $et->ProcessDirectory(\%dirInfo, $subTable, $processProc); + } + last; + } + if (defined $value and length $value) { + # add "Adobe" header if necessary + $$outfile = "Adobe\0" unless $$outfile and length $$outfile; + $$outfile .= $tag . pack('N', length $value) . $value; + $$outfile .= "\0" if length($value) & 0x01; # pad if necessary + } + $pos += $size; + ++$pos if $size & 0x01; # (darn padding) + } + $pos == $end or $et->Warn("$pos $end Adobe private data is corrupt"); + return 1; +} + +#------------------------------------------------------------------------------ +# Process Adobe CRW directory +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, otherwise returns 0 and sets a Warning +# Notes: data has 4 byte header (2 for byte order and 2 for entry count) +# - this routine would be as simple as ProcessAdobeMRW() below if Adobe hadn't +# pulled the bonehead move of reformatting the CRW information +sub ProcessAdobeCRW($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $start = $$dirInfo{DirStart}; + my $end = $start + $$dirInfo{DirLen}; + my $verbose = $et->Options('Verbose'); + my $buildMakerNotes = $et->Options('MakerNotes'); + my $outfile = $$dirInfo{OutFile}; + my ($newTags, $oldChanged); + + SetByteOrder('MM'); # always big endian + return 0 if $$dirInfo{DirLen} < 4; + my $byteOrder = substr($$dataPt, $start, 2); + return 0 unless $byteOrder =~ /^(II|MM)$/; + + # initialize maker note data if building maker notes + $buildMakerNotes and Image::ExifTool::CanonRaw::InitMakerNotes($et); + + my $entries = Get16u($dataPt, $start + 2); + my $pos = $start + 4; + $et->VerboseDir($dirInfo, $entries) unless $outfile; + if ($outfile) { + # get hash of new tags + $newTags = $et->GetNewTagInfoHash($tagTablePtr); + $$outfile = substr($$dataPt, $start, 4); + $oldChanged = $$et{CHANGED}; + } + # loop through entries in Adobe CRW information + my $index; + for ($index=0; $index<$entries; ++$index) { + last if $pos + 6 > $end; + my $tag = Get16u($dataPt, $pos); + my $size = Get32u($dataPt, $pos + 2); + $pos += 6; + last if $pos + $size > $end; + my $value = substr($$dataPt, $pos, $size); + my $tagID = $tag & 0x3fff; + my $tagType = ($tag >> 8) & 0x38; # get tag type + my $format = $Image::ExifTool::CanonRaw::crwTagFormat{$tagType}; + my $count; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID, \$value); + if ($tagInfo) { + $format = $$tagInfo{Format} if $$tagInfo{Format}; + $count = $$tagInfo{Count}; + } + # set count to 1 by default for values that were in the directory entry + if (not defined $count and $tag & 0x4000 and $format and $format ne 'string') { + $count = 1; + } + # set count from tagInfo count if necessary + if ($format and not $count) { + # set count according to format and size + my $fnum = $Image::ExifTool::Exif::formatNumber{$format}; + my $fsiz = $Image::ExifTool::Exif::formatSize[$fnum]; + $count = int($size / $fsiz); + } + $format or $format = 'undef'; + SetByteOrder($byteOrder); + my $val = ReadValue(\$value, 0, $format, $count, $size); + if ($outfile) { + if ($tagInfo) { + my $subdir = $$tagInfo{SubDirectory}; + if ($subdir and $$subdir{TagTable}) { + my $name = $$tagInfo{Name}; + my $newTagTable = GetTagTable($$subdir{TagTable}); + return 0 unless $newTagTable; + my $subdirStart = 0; + #### eval Start () + $subdirStart = eval $$subdir{Start} if $$subdir{Start}; + my $dirData = \$value; + my %subdirInfo = ( + Name => $name, + DataPt => $dirData, + DataLen => $size, + DirStart => $subdirStart, + DirLen => $size - $subdirStart, + Parent => $$dirInfo{DirName}, + ); + #### eval Validate ($dirData, $subdirStart, $size) + if (defined $$subdir{Validate} and not eval $$subdir{Validate}) { + $et->Warn("Invalid $name data"); + } else { + $subdir = $et->WriteDirectory(\%subdirInfo, $newTagTable); + if (defined $subdir and length $subdir) { + if ($subdirStart) { + # add header before data directory + $value = substr($value, 0, $subdirStart) . $subdir; + } else { + $value = $subdir; + } + } + } + } elsif ($$newTags{$tagID}) { + my $nvHash = $et->GetNewValueHash($tagInfo); + if ($et->IsOverwriting($nvHash, $val)) { + my $newVal = $et->GetNewValue($nvHash); + my $verboseVal; + $verboseVal = $newVal if $verbose > 1; + # convert to specified format if necessary + if (defined $newVal and $format) { + $newVal = WriteValue($newVal, $format, $count); + } + if (defined $newVal) { + $et->VerboseValue("- CanonRaw:$$tagInfo{Name}", $value); + $et->VerboseValue("+ CanonRaw:$$tagInfo{Name}", $verboseVal); + $value = $newVal; + ++$$et{CHANGED}; + } + } + } + } + # write out new value (always big-endian) + SetByteOrder('MM'); + # (verified that there is no padding here) + $$outfile .= Set16u($tag) . Set32u(length($value)) . $value; + } else { + $et->HandleTag($tagTablePtr, $tagID, $val, + Index => $index, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + Start => $pos, + Size => $size, + TagInfo => $tagInfo, + ); + if ($buildMakerNotes) { + # build maker notes information if requested + Image::ExifTool::CanonRaw::BuildMakerNotes($et, $tagID, $tagInfo, + \$value, $format, $count); + } + } + # (we lost the directory structure, but the second tag 0x0805 + # should be in the ImageDescription directory) + $$et{DIR_NAME} = 'ImageDescription' if $tagID == 0x0805; + SetByteOrder('MM'); + $pos += $size; + } + if ($outfile and (not defined $$outfile or $index != $entries or + $$et{CHANGED} == $oldChanged)) + { + $$et{CHANGED} = $oldChanged; # nothing changed + undef $$outfile; # rewrite old directory + } + if ($index != $entries) { + $et->Warn('Truncated CRW notes'); + } elsif ($pos < $end) { + $et->Warn($end-$pos . ' extra bytes at end of CRW notes'); + } + # finish building maker notes if necessary + if ($buildMakerNotes) { + SetByteOrder($byteOrder); + Image::ExifTool::CanonRaw::SaveMakerNotes($et); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process Adobe MRW directory +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, otherwise returns 0 and sets a Warning +# Notes: data has 4 byte header (2 for byte order and 2 for entry count) +sub ProcessAdobeMRW($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + my $dirStart = $$dirInfo{DirStart}; + my $outfile = $$dirInfo{OutFile}; + + # construct fake MRW file + my $buff = "\0MRM" . pack('N', $dirLen - 4); + # ignore leading byte order and directory count words + $buff .= substr($$dataPt, $dirStart + 4, $dirLen - 4); + my $raf = new File::RandomAccess(\$buff); + my %dirInfo = ( RAF => $raf, OutFile => $outfile ); + my $rtnVal = Image::ExifTool::MinoltaRaw::ProcessMRW($et, \%dirInfo); + if ($outfile and defined $$outfile and length $$outfile) { + # remove MRW header and add Adobe header + $$outfile = substr($$dataPt, $dirStart, 4) . substr($$outfile, 8); + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Process Adobe RAF directory +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, otherwise returns 0 and sets a Warning +sub ProcessAdobeRAF($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + return 0 if $$dirInfo{OutFile}; # (can't write this yet) + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $dirEnd = $$dirInfo{DirLen} + $pos; + my ($readIt, $warn); + + # set byte order according to first 2 bytes of Adobe RAF data + if ($pos + 2 <= $dirEnd and SetByteOrder(substr($$dataPt, $pos, 2))) { + $pos += 2; + } else { + $et->Warn('Invalid DNG RAF data'); + return 0; + } + $et->VerboseDir($dirInfo); + # make fake RAF object for processing (same acronym, different meaning) + my $raf = new File::RandomAccess($dataPt); + my $num = ''; + # loop through all records in Adobe RAF data: + # 0 - RAF table (not processed) + # 1 - first RAF directory + # 2 - second RAF directory (if available) + for (;;) { + last if $pos + 4 > $dirEnd; + my $len = Get32u($dataPt, $pos); + $pos += 4 + $len; # step to next entry in Adobe RAF record + $len or last; # ends with an empty entry + $readIt or $readIt = 1, next; # ignore first entry (RAF table) + my %dirInfo = ( + RAF => $raf, + DirStart => $pos - $len, + ); + $$et{SET_GROUP1} = "RAF$num"; + $et->ProcessDirectory(\%dirInfo, $tagTablePtr) or $warn = 1; + delete $$et{SET_GROUP1}; + $num = ($num || 1) + 1; + } + $warn and $et->Warn('Possibly corrupt RAF information'); + return 1; +} + +#------------------------------------------------------------------------------ +# Process Adobe SR2 directory +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, otherwise returns 0 and sets a Warning +# Notes: data has 6 byte header (2 for byte order and 4 for original offset) +sub ProcessAdobeSR2($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + return 0 if $$dirInfo{OutFile}; # (can't write this yet) + my $dataPt = $$dirInfo{DataPt}; + my $start = $$dirInfo{DirStart}; + my $len = $$dirInfo{DirLen}; + + return 0 if $len < 6; + SetByteOrder('MM'); + my $originalPos = Get32u($dataPt, $start + 2); + return 0 unless SetByteOrder(substr($$dataPt, $start, 2)); + + $et->VerboseDir($dirInfo); + my $dataPos = $$dirInfo{DataPos}; + my $dirStart = $start + 6; # pointer to maker note directory + my $dirLen = $len - 6; + + # initialize subdirectory information + my $fix = $dataPos + $dirStart - $originalPos; + my %subdirInfo = ( + DirName => 'AdobeSR2', + Base => $$dirInfo{Base} + $fix, + DataPt => $dataPt, + DataPos => $dataPos - $fix, + DataLen => $$dirInfo{DataLen}, + DirStart => $dirStart, + DirLen => $dirLen, + Parent => $$dirInfo{DirName}, + ); + if ($et->Options('HtmlDump')) { + $et->HDump($dataPos + $start, 6, 'Adobe SR2 data'); + } + # parse the SR2 directory + $et->ProcessDirectory(\%subdirInfo, $tagTablePtr); + return 1; +} + +#------------------------------------------------------------------------------ +# Process Adobe-mutilated IFD directory +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, otherwise returns 0 and sets a Warning +# Notes: data has 2 byte header (byte order of the data) +sub ProcessAdobeIFD($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + return 0 if $$dirInfo{OutFile}; # (can't write this yet) + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $dataPos = $$dirInfo{DataPos}; + + return 0 if $$dirInfo{DirLen} < 4; + my $dataOrder = substr($$dataPt, $pos, 2); + return 0 unless SetByteOrder($dataOrder); # validate byte order of data + + # parse the mutilated IFD. This is similar to a TIFF IFD, except: + # - data follows directly after Count entry in IFD + # - byte order of IFD entries is always big-endian, but byte order of data changes + SetByteOrder('MM'); # IFD structure is always big-endian + my $entries = Get16u($dataPt, $pos + 2); + $et->VerboseDir($dirInfo, $entries); + $pos += 4; + + my $end = $pos + $$dirInfo{DirLen}; + my $index; + for ($index=0; $index<$entries; ++$index) { + last if $pos + 8 > $end; + SetByteOrder('MM'); # directory entries always big-endian (doh!) + my $tagID = Get16u($dataPt, $pos); + my $format = Get16u($dataPt, $pos+2); + my $count = Get32u($dataPt, $pos+4); + if ($format < 1 or $format > 13) { + # warn unless the IFD was just padded with zeros + $format and $et->Warn( + sprintf("Unknown format ($format) for $$dirInfo{DirName} tag 0x%x",$tagID)); + return 0; # must be corrupted + } + my $size = $Image::ExifTool::Exif::formatSize[$format] * $count; + last if $pos + 8 + $size > $end; + my $formatStr = $Image::ExifTool::Exif::formatName[$format]; + SetByteOrder($dataOrder); # data stored in native order + my $val = ReadValue($dataPt, $pos + 8, $formatStr, $count, $size); + $et->HandleTag($tagTablePtr, $tagID, $val, + Index => $index, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $pos + 8, + Size => $size + ); + $pos += 8 + $size; + } + if ($index < $entries) { + $et->Warn("Truncated $$dirInfo{DirName} directory"); + return 0; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process Adobe MakerNotes directory +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, otherwise returns 0 and sets a Warning +# Notes: data has 6 byte header (2 for byte order and 4 for original offset) +# --> or 18 bytes for DNG converted from JPG by Adobe Camera Raw! +sub ProcessAdobeMakN($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $start = $$dirInfo{DirStart}; + my $len = $$dirInfo{DirLen}; + my $outfile = $$dirInfo{OutFile}; + + return 0 if $len < 6; + SetByteOrder('MM'); + my $originalPos = Get32u($dataPt, $start + 2); + return 0 unless SetByteOrder(substr($$dataPt, $start, 2)); + + $et->VerboseDir($dirInfo) unless $outfile; + my $dataPos = $$dirInfo{DataPos}; + my $hdrLen = 6; + + # 2018-09-27: hack for extra 12 bytes in MakN header of JPEG converted to DNG + # by Adobe Camera Raw (4 bytes "00 00 00 01" followed by 8 unknown bytes) + # - this is because CameraRaw copies the maker notes from the wrong location + # in a JPG image (off by 12 bytes presumably due to the JPEG headers) + # - this hack won't work in most cases because the extra bytes are not consistent + # since they are just the data that existed in the JPG before the maker notes + # - also, the last 12 bytes of the maker notes will be missing + # - 2022-04-26: this bug still exists in Camera Raw 14.3 + $hdrLen += 12 if $len >= 18 and substr($$dataPt, $start+6, 4) eq "\0\0\0\x01"; + + my $dirStart = $start + $hdrLen; # pointer to maker note directory + my $dirLen = $len - $hdrLen; + + my $hdr = substr($$dataPt, $dirStart, $dirLen < 48 ? $dirLen : 48); + my $tagInfo = $et->GetTagInfo($tagTablePtr, 'MakN', \$hdr); + return 0 unless $tagInfo and $$tagInfo{SubDirectory}; + my $subdir = $$tagInfo{SubDirectory}; + my $subTable = GetTagTable($$subdir{TagTable}); + # initialize subdirectory information + my %subdirInfo = ( + DirName => 'MakerNotes', + Name => $$tagInfo{Name}, # needed for maker notes verbose dump + Base => $$dirInfo{Base}, + DataPt => $dataPt, + DataPos => $dataPos, + DataLen => $$dirInfo{DataLen}, + DirStart => $dirStart, + DirLen => $dirLen, + TagInfo => $tagInfo, + FixBase => $$subdir{FixBase}, + EntryBased=> $$subdir{EntryBased}, + Parent => $$dirInfo{DirName}, + ); + # look for start of maker notes IFD + my $loc = Image::ExifTool::MakerNotes::LocateIFD($et,\%subdirInfo); + unless (defined $loc) { + $et->Warn('Maker notes could not be parsed'); + return 0; + } + if ($et->Options('HtmlDump')) { + $et->HDump($dataPos + $start, $hdrLen, 'Adobe MakN data'); + $et->HDump($dataPos + $dirStart, $loc, "$$tagInfo{Name} header") if $loc; + } + + my $fix = 0; + unless ($$subdir{Base}) { + # adjust base offset for current maker note position + $fix = $dataPos + $dirStart - $originalPos; + $subdirInfo{Base} += $fix; + $subdirInfo{DataPos} -= $fix; + } + if ($outfile) { + # rewrite the maker notes directory + my $fixup = $subdirInfo{Fixup} = new Image::ExifTool::Fixup; + my $oldChanged = $$et{CHANGED}; + my $buff = $et->WriteDirectory(\%subdirInfo, $subTable); + # nothing to do if error writing directory or nothing changed + unless (defined $buff and $$et{CHANGED} != $oldChanged) { + $$et{CHANGED} = $oldChanged; + return 1; + } + # deleting maker notes if directory is empty + unless (length $buff) { + $$outfile = ''; + return 1; + } + # apply a one-time fixup to offsets + if ($subdirInfo{Relative}) { + # shift all offsets to be relative to new base + my $baseShift = $dataPos + $dirStart + $$dirInfo{Base} - $subdirInfo{Base}; + $fixup->{Shift} += $baseShift; + } else { + # shift offsets to position of original maker notes + $fixup->{Shift} += $originalPos; + } + # if we wrote the directory as a block the header is already included + $loc = 0 if $subdirInfo{BlockWrite}; + $fixup->{Shift} += $loc; # adjust for makernotes header + $fixup->ApplyFixup(\$buff); # fix up pointer offsets + # get copy of original Adobe header (6 or 18) and makernotes header ($loc) + my $header = substr($$dataPt, $start, $hdrLen + $loc); + # add Adobe and makernotes headers to new directory + $$outfile = $header . $buff; + } else { + # parse the maker notes directory + $et->ProcessDirectory(\%subdirInfo, $subTable, $$subdir{ProcessProc}); + # extract maker notes as a block if specified + if ($et->Options('MakerNotes') or + $$et{REQ_TAG_LOOKUP}{lc($$tagInfo{Name})}) + { + my $val; + if ($$tagInfo{MakerNotes}) { + $subdirInfo{Base} = $$dirInfo{Base} + $fix; + $subdirInfo{DataPos} = $dataPos - $fix; + $subdirInfo{DirStart} = $dirStart; + $subdirInfo{DirLen} = $dirLen; + # rebuild the maker notes to identify all offsets that require fixing up + $val = Image::ExifTool::Exif::RebuildMakerNotes($et, \%subdirInfo, $subTable); + if (not defined $val and $dirLen > 4) { + $et->Warn('Error rebuilding maker notes (may be corrupt)'); + } + } else { + # extract this directory as a block if specified + return 1 unless $$tagInfo{Writable}; + } + $val = substr($$dataPt, 20) unless defined $val; + $et->FoundTag($tagInfo, $val); + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Write Adobe information (calls appropriate ProcessProc to do the actual work) +# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref +# Returns: new data block (may be empty if directory is deleted) or undef on error +sub WriteAdobeStuff($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access + my $proc = $$dirInfo{Proc} || \&ProcessAdobeData; + my $buff; + $$dirInfo{OutFile} = \$buff; + &$proc($et, $dirInfo, $tagTablePtr) or undef $buff; + return $buff; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::DNG.pm - Read DNG-specific information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to process +information in DNG (Digital Negative) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.adobe.com/products/dng/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/DNG Tags>, +L<Image::ExifTool::TagNames/EXIF Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/DPX.pm b/lib/Image/ExifTool/DPX.pm new file mode 100644 index 0000000..a10b9dc --- /dev/null +++ b/lib/Image/ExifTool/DPX.pm @@ -0,0 +1,247 @@ +#------------------------------------------------------------------------------ +# File: DPX.pm +# +# Description: Read DPX meta information +# +# Revisions: 2013-09-19 - P. Harvey created +# +# References: 1) http://www.cineon.com/ff_draft.php +# 2) Harry Mallon private communication +#------------------------------------------------------------------------------ + +package Image::ExifTool::DPX; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.06'; + +# DPX tags +%Image::ExifTool::DPX::Main = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + NOTES => 'Tags extracted from DPX (Digital Picture Exchange) images.', + 0 => { Name => 'ByteOrder', Format => 'undef[4]', PrintConv => { SDPX => 'Big-endian', XPDS => 'Little-endian' } }, + 8 => { Name => 'HeaderVersion', Format => 'string[8]' }, + # 24 => { Name => 'GenericHeaderSize', Format => 'int32u' }, # = 1664 + # 28 => { Name => 'IndustryStandardHeaderSize', Format => 'int32u' }, # = 384 + 16 => { Name => 'DPXFileSize', Format => 'int32u' }, + 20 => { Name => 'DittoKey', Format => 'int32u', PrintConv => { 0 => 'Same', 1 => 'New' } }, + 36 => { Name => 'ImageFileName', Format => 'string[100]' }, + 136 => { + Name => 'CreateDate', + Format => 'string[24]', + Groups => { 2 => 'Time' }, + ValueConv => '$val =~ s/(\d{4}:\d{2}:\d{2}):/$1 /; $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + 160 => { Name => 'Creator', Format => 'string[100]', Groups => { 2 => 'Author' } }, + 260 => { Name => 'Project', Format => 'string[200]' }, + 460 => { Name => 'Copyright', Format => 'string[200]', Groups => { 2 => 'Author' } }, + 660 => { Name => 'EncryptionKey', Format => 'int32u', PrintConv => 'sprintf("%.8x",$val)' }, + 768 => { + Name => 'Orientation', + Format => 'int16u', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Mirror vertical', + 2 => 'Mirror horizontal', + 3 => 'Rotate 180', + 4 => 'Mirror horizontal and rotate 270 CW', + 5 => 'Rotate 90 CW', + 6 => 'Rotate 270 CW', + 7 => 'Mirror horizontal and rotate 90 CW', + }, + }, + 770 => { Name => 'ImageElements', Format => 'int16u' }, + 772 => { Name => 'ImageWidth', Format => 'int32u' }, + 776 => { Name => 'ImageHeight', Format => 'int32u' }, + 780 => { Name => 'DataSign', Format => 'int32u', PrintConv => { 0 => 'Unsigned', 1 => 'Signed' } }, + 800 => { + Name => 'ComponentsConfiguration', + Format => 'int8u', + PrintConv => { + 0 => 'User-defined single component', + 1 => 'Red (R)', + 2 => 'Green (G)', + 3 => 'Blue (B)', + 4 => 'Alpha (matte)', + 6 => 'Luminance (Y)', + 7 => 'Chrominance (Cb, Cr, subsampled by two)', + 8 => 'Depth (Z)', + 9 => 'Composite video', + 50 => 'R, G, B', + 51 => 'R, G, B, Alpha', + 52 => 'Alpha, B, G, R', + 100 => 'Cb, Y, Cr, Y (4:2:2)', + 101 => 'Cb, Y, A, Cr, Y, A (4:2:2:4)', + 102 => 'Cb, Y, Cr (4:4:4)', + 103 => 'Cb, Y, Cr, A (4:4:4:4)', + 150 => 'User-defined 2 component element', + 151 => 'User-defined 3 component element', + 152 => 'User-defined 4 component element', + 153 => 'User-defined 5 component element', + 154 => 'User-defined 6 component element', + 155 => 'User-defined 7 component element', + 156 => 'User-defined 8 component element', + }, + }, + 801 => { #2 + Name => 'TransferCharacteristic', + Format => 'int8u', + PrintConv => { + 0 => 'User-defined', + 1 => 'Printing density', + 2 => 'Linear', + 3 => 'Logarithmic', + 4 => 'Unspecified video', + 5 => 'SMPTE 274M', + 6 => 'ITU-R 704-4', + 7 => 'ITU-R 601-5 system B or G (625)', + 8 => 'ITU-R 601-5 system M (525)', + 9 => 'Composite video (NTSC)', + 10 => 'Composite video (PAL)', + 11 => 'Z (depth) - linear', + 12 => 'Z (depth) - homogeneous', + 13 => 'SMPTE ADX', + 14 => 'ITU-R 2020 NCL', + 15 => 'ITU-R 2020 CL', + 16 => 'IEC 61966-2-4 xvYCC', + 17 => 'ITU-R 2100 NCL/PQ', + 18 => 'ITU-R 2100 ICtCp/PQ', + 19 => 'ITU-R 2100 NCL/HLG', + 20 => 'ITU-R 2100 ICtCp/HLG', + 21 => 'RP 431-2:2011 Gama 2.6', + 22 => 'IEC 61966-2-1 sRGB', + }, + }, + 802 => { #2 + Name => 'ColorimetricSpecification', + Format => 'int8u', + PrintConv => { + 0 => 'User-defined', + 1 => 'Printing density', + 4 => 'Unspecified video', + 5 => 'SMPTE 274M', + 6 => 'ITU-R 704-4', + 7 => 'ITU-R 601-5 system B or G (625)', + 8 => 'ITU-R 601-5 system M (525)', + 9 => 'Composite video (NTSC)', + 10 => 'Composite video (PAL)', + 13 => 'SMPTE ADX', + 14 => 'ITU-R 2020', + 15 => 'P3D65', + 16 => 'P3DCI', + 17 => 'P3D60', + 18 => 'ACES', + }, + }, + 803 => { Name => 'BitDepth', Format => 'int8u' }, + 820 => { Name => 'ImageDescription', Format => 'string[32]' }, + 892 => { Name => 'Image2Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' }, + 964 => { Name => 'Image3Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' }, + 1036=> { Name => 'Image4Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' }, + 1108=> { Name => 'Image5Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' }, + 1180=> { Name => 'Image6Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' }, + 1252=> { Name => 'Image7Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' }, + 1324=> { Name => 'Image8Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' }, + # 1408=> { Name => 'XOffset', Format => 'int32u' }, + # 1412=> { Name => 'YOffset', Format => 'int32u' }, + # 1416=> { Name => 'XCenter', Format => 'float' }, + # 1420=> { Name => 'YCenter', Format => 'float' }, + # 1424=> { Name => 'XOriginalSize', Format => 'int32u' }, + # 1428=> { Name => 'YOriginalSize', Format => 'int32u' }, + 1432=> { Name => 'SourceFileName', Format => 'string[100]' }, + 1532=> { Name => 'SourceCreateDate', Format => 'string[24]' }, + 1556=> { Name => 'InputDeviceName', Format => 'string[32]' }, + 1588=> { Name => 'InputDeviceSerialNumber', Format => 'string[32]' }, + # 1620 => { Name => 'Border', Format => 'int16u[4]' }, + 1628 => { + Name => 'AspectRatio', + Format => 'int32u[2]', + RawConv => '$val =~ /4294967295/ ? undef : $val', # ignore undefined values + PrintConv => q{ + return 'undef' if $val eq '0 0'; + return 'inf' if $val=~/ 0$/; + my @a=split(' ',$val); + return join(':', Rationalize($a[0]/$a[1])); + }, + }, + 1724 => { Name => 'OriginalFrameRate',Format => 'float' }, + 1728 => { Name => 'ShutterAngle', Format => 'float', RawConv => '($val =~ /\d/ and $val !~ /nan/i) ? $val : undef' }, #2 + 1732 => { Name => 'FrameID', Format => 'string[32]' }, + 1764 => { Name => 'SlateInformation', Format => 'string[100]' }, + 1920 => { Name => 'TimeCode', Format => 'int32u' }, #2 + 1940 => { Name => 'FrameRate', Format => 'float', RawConv => '($val =~ /\d/ and $val !~ /nan/i) ? $val : undef' }, #2 + 1972 => { Name => 'Reserved5', Format => 'string[76]', Unknown => 1 }, + 2048 => { Name => 'UserID', Format => 'string[32]' }, +); + +#------------------------------------------------------------------------------ +# Extract EXIF information from a DPX image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid DPX file +sub ProcessDPX($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + + # verify this is a valid DPX file + return 0 unless $raf->Read($buff, 2080) == 2080; + return 0 unless $buff =~ /^(SDPX|XPDS)/; + SetByteOrder($1 eq 'SDPX' ? 'MM' : 'II'); + $et->SetFileType(); # set the FileType tag + my $hdrLen = Get32u(\$buff,24) + Get32u(\$buff,28); + $hdrLen == 2048 or $et->Warn("Unexpected DPX header length ($hdrLen)"); + my %dirInfo = ( + DataPt => \$buff, + DirStart => 0, + DirLen => length($buff), + ); + my $tagTablePtr = GetTagTable('Image::ExifTool::DPX::Main'); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::DPX - Read DPX meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read +metadata from DPX (Digital Picture Exchange) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.cineon.com/ff_draft.php> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/DPX Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/DV.pm b/lib/Image/ExifTool/DV.pm new file mode 100644 index 0000000..55109a7 --- /dev/null +++ b/lib/Image/ExifTool/DV.pm @@ -0,0 +1,315 @@ +#------------------------------------------------------------------------------ +# File: DV.pm +# +# Description: Read DV meta information +# +# Revisions: 2010/12/24 - P. Harvey Created +# +# References: 1) http://www.ffmpeg.org/ +# 2) http://dvswitch.alioth.debian.org/wiki/DV_format/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::DV; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.02'; + +# DV profiles (ref 1) +my @dvProfiles = ( + { + DSF => 0, + VideoSType => 0x0, + FrameSize => 120000, + VideoFormat => 'IEC 61834, SMPTE-314M - 525/60 (NTSC)', + Colorimetry => '4:1:1', + FrameRate => 30000/1001, + ImageHeight => 480, + ImageWidth => 720, + },{ + DSF => 1, + VideoSType => 0x0, + FrameSize => 144000, + VideoFormat => 'IEC 61834 - 625/50 (PAL)', + Colorimetry => '4:2:0', + FrameRate => 25/1, + ImageHeight => 576, + ImageWidth => 720, + },{ + DSF => 1, + VideoSType => 0x0, + FrameSize => 144000, + VideoFormat => 'SMPTE-314M - 625/50 (PAL)', + Colorimetry => '4:1:1', + FrameRate => 25/1, + ImageHeight => 576, + ImageWidth => 720, + },{ + DSF => 0, + VideoSType => 0x4, + FrameSize => 240000, + VideoFormat => 'DVCPRO50: SMPTE-314M - 525/60 (NTSC) 50 Mbps', + Colorimetry => '4:2:2', + FrameRate => 30000/1001, + ImageHeight => 480, + ImageWidth => 720, + },{ + DSF => 1, + VideoSType => 0x4, + FrameSize => 288000, + VideoFormat => 'DVCPRO50: SMPTE-314M - 625/50 (PAL) 50 Mbps', + Colorimetry => '4:2:2', + FrameRate => 25/1, + ImageHeight => 576, + ImageWidth => 720, + },{ + DSF => 0, + VideoSType => 0x14, + FrameSize => 480000, + VideoFormat => 'DVCPRO HD: SMPTE-370M - 1080i60 100 Mbps', + Colorimetry => '4:2:2', + FrameRate => 30000/1001, + ImageHeight => 1080, + ImageWidth => 1280, + },{ + DSF => 1, + VideoSType => 0x14, + FrameSize => 576000, + VideoFormat => 'DVCPRO HD: SMPTE-370M - 1080i50 100 Mbps', + Colorimetry => '4:2:2', + FrameRate => 25/1, + ImageHeight => 1080, + ImageWidth => 1440, + },{ + DSF => 0, + VideoSType => 0x18, + FrameSize => 240000, + VideoFormat => 'DVCPRO HD: SMPTE-370M - 720p60 100 Mbps', + Colorimetry => '4:2:2', + FrameRate => 60000/1001, + ImageHeight => 720, + ImageWidth => 960, + },{ + DSF => 1, + VideoSType => 0x18, + FrameSize => 288000, + VideoFormat => 'DVCPRO HD: SMPTE-370M - 720p50 100 Mbps', + Colorimetry => '4:2:2', + FrameRate => 50/1, + ImageHeight => 720, + ImageWidth => 960, + },{ + DSF => 1, + VideoSType => 0x1, + FrameSize => 144000, + VideoFormat => 'IEC 61883-5 - 625/50 (PAL)', + Colorimetry => '4:2:0', + FrameRate => 25/1, + ImageHeight => 576, + ImageWidth => 720, + }, +); + +# tags to extract, in the order we want to extract them +my @dvTags = ( + 'DateTimeOriginal', 'ImageWidth', 'ImageHeight', 'Duration', + 'TotalBitrate', 'VideoFormat', 'VideoScanType', 'FrameRate', + 'AspectRatio', 'Colorimetry', 'AudioChannels', 'AudioSampleRate', + 'AudioBitsPerSample', +); + +# DV tags +%Image::ExifTool::DV::Main = ( + GROUPS => { 2 => 'Video' }, + VARS => { NO_ID => 1 }, + NOTES => 'The following tags are extracted from DV videos.', + DateTimeOriginal => { + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + ImageWidth => { }, + ImageHeight => { }, + Duration => { PrintConv => 'ConvertDuration($val)' }, + TotalBitrate => { PrintConv => 'ConvertBitrate($val)' }, + VideoFormat => { }, + VideoScanType => { }, + FrameRate => { PrintConv => 'int($val * 1000 + 0.5) / 1000' }, + AspectRatio => { }, + Colorimetry => { }, + AudioChannels => { Groups => { 2 => 'Audio' } }, + AudioSampleRate => { Groups => { 2 => 'Audio' } }, + AudioBitsPerSample => { Groups => { 2 => 'Audio' } }, +); + +#------------------------------------------------------------------------------ +# Read information in a DV file (ref 1) +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid DV file +sub ProcessDV($$) +{ + my ($et, $dirInfo) = @_; + local $_; + my $raf = $$dirInfo{RAF}; + my ($buff, $start, $profile, $tag, $i, $j); + + $raf->Read($buff, 12000) or return 0; + if ($buff =~ /\x1f\x07\0[\x3f\xbf]/sg) { + $start = pos($buff) - 4; + } else { + while ($buff =~ /[\0\xff]\x3f\x07\0.{76}\xff\x3f\x07\x01/sg) { + next if pos($buff) - 163 < 0; + $start = pos($buff) - 163; + last; + } + return 0 unless defined $start; + } + my $len = length $buff; + # must at least have a full DIF header + return 0 if $start + 80 * 6 > $len; + + $et->SetFileType(); + + my $pos = $start; + my $dsf = (Get8u(\$buff, $pos + 3) & 0x80) >> 7; + my $stype = Get8u(\$buff, $pos + 80*5 + 48 + 3) & 0x1f; + + # 576i50 25Mbps 4:1:1 is a special case + if ($dsf == 1 && $stype == 0 && Get8u(\$buff, 4) & 0x07) { + $profile = $dvProfiles[2]; + } else { + foreach (@dvProfiles) { + next unless $dsf == $$_{DSF} and $stype == $$_{VideoSType}; + $profile = $_; + last; + } + $profile or $et->Warn("Unrecognized DV profile"), return 1; + } + my $tagTablePtr = GetTagTable('Image::ExifTool::DV::Main'); + + # calculate total bit rate and duration + my $byteRate = $$profile{FrameSize} * $$profile{FrameRate}; + my $fileSize = $$et{VALUE}{FileSize}; + $$profile{TotalBitrate} = 8 * $byteRate; + $$profile{Duration} = $fileSize / $byteRate if defined $fileSize; + + # read DVPack metadata from the VAUX DIF's to extract video tags + delete $$profile{DateTimeOriginal}; + delete $$profile{AspectRatio}; + delete $$profile{VideoScanType}; + my ($date, $time, $is16_9, $interlace); + for ($i=1; $i<6; ++$i) { + $pos += 80; + my $type = Get8u(\$buff, $pos); + next unless ($type & 0xf0) == 0x50; # look for VAUX types + for ($j=0; $j<15; ++$j) { + my $p = $pos + $j * 5 + 3; + $type = Get8u(\$buff, $p); + if ($type == 0x61) { # video control + my $apt = Get8u(\$buff, $start + 4) & 0x07; + my $t = Get8u(\$buff, $p + 2); + $is16_9 = (($t & 0x07) == 0x02 or (not $apt and ($t & 0x07) == 0x07)); + $interlace = Get8u(\$buff, $p + 3) & 0x10; # (ref 2) + } elsif ($type == 0x62) { # date + # mask off unused bits + my @d = unpack('C*', substr($buff, $p + 1, 4)); + # (ignore timezone in byte 0 until we can test this properly - see ref 2) + $date = sprintf('%.2x:%.2x:%.2x', $d[3], $d[2] & 0x1f, $d[1] & 0x3f); + if ($date =~ /[a-f]/) { + undef $date; # invalid date + } else { + # add century (this will work until 2089) + $date = ($date lt '9' ? '20' : '19') . $date; + } + undef $time; + } elsif ($type == 0x63 and $date) { # time + # (ignore frames past second in byte 0 for now - see ref 2) + my $val = Get32u(\$buff, $p + 1) & 0x007f7f3f; + my @t = unpack('C*', substr($buff, $p + 1, 4)); + $time = sprintf('%.2x:%.2x:%.2x', $t[3] & 0x3f, $t[2] & 0x7f, $t[1] & 0x7f); + last; + } else { + undef $time; # must be consecutive + } + } + } + if ($date and $time) { + $$profile{DateTimeOriginal} = "$date $time"; + if (defined $is16_9) { + $$profile{AspectRatio} = $is16_9 ? '16:9' : '4:3'; + $$profile{VideoScanType} = $interlace ? 'Interlaced' : 'Progressive'; + } + } + + # read audio tags if available + delete $$profile{AudioSampleRate}; + delete $$profile{AudioBitsPerSample}; + delete $$profile{AudioChannels}; + $pos = $start + 80*6 + 80*16*3 + 3; + if ($pos + 4 < $len and Get8u(\$buff, $pos) == 0x50) { + my $smpls = Get8u(\$buff, $pos + 1); + my $freq = (Get8u(\$buff, $pos + 4) >> 3) & 0x07; + my $stype = Get8u(\$buff, $pos + 3) & 0x1f; + my $quant = Get8u(\$buff, $pos + 4) & 0x07; + if ($freq < 3) { + $$profile{AudioSampleRate} = {0=>48000, 1=>44100, 2=>32000}->{$freq}; + } + if ($stype < 3) { + $stype = 2 if $stype == 0 and $quant and $freq == 2; + $$profile{AudioChannels} = {0=>2, 1=>0, 2=>4, 3=>8}->{$stype}; + } + $$profile{AudioBitsPerSample} = $quant ? 12 : 16; + } + + # save our metadata + foreach $tag (@dvTags) { + next unless defined $$profile{$tag}; + $et->HandleTag($tagTablePtr, $tag, $$profile{$tag}); + } + + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::DV - Read DV meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read meta +information from DV (raw Digital Video) files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://ffmpeg.org/> + +=item L<http://dvswitch.alioth.debian.org/wiki/DV_format/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/DV Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/DarwinCore.pm b/lib/Image/ExifTool/DarwinCore.pm new file mode 100644 index 0000000..4cc95c7 --- /dev/null +++ b/lib/Image/ExifTool/DarwinCore.pm @@ -0,0 +1,393 @@ +#------------------------------------------------------------------------------ +# File: DarwinCore.pm +# +# Description: Darwin Core XMP tags +# +# Revisions: 2013-01-28 - P. Harvey Created +# +# References: 1) http://rs.tdwg.org/dwc/index.htm +# 2) https://exiftool.org/forum/index.php/topic,4442.0/all.html +#------------------------------------------------------------------------------ + +package Image::ExifTool::DarwinCore; + +use strict; +use vars qw($VERSION); +use Image::ExifTool::XMP; + +$VERSION = '1.07'; + +my %dateTimeInfo = ( + # NOTE: Do NOT put "Groups" here because Groups hash must not be common! + Writable => 'date', + Shift => 'Time', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', +); + +my %materialSample = ( + STRUCT_NAME => 'DarwinCore MaterialSample', + NAMESPACE => 'dwc', + materialSampleID => { }, +); + +my %event = ( + STRUCT_NAME => 'DarwinCore Event', + NAMESPACE => 'dwc', + day => { Writable => 'integer', Groups => { 2 => 'Time' } }, + earliestDate => { %dateTimeInfo, Groups => { 2 => 'Time' } }, + endDayOfYear => { Writable => 'integer', Groups => { 2 => 'Time' } }, + eventDate => { %dateTimeInfo, Groups => { 2 => 'Time' } }, + eventID => { Avoid => 1, Notes => 'avoided in favor of XMP-iptcExt:EventID' }, + eventRemarks => { Writable => 'lang-alt' }, + eventTime => { + Groups => { 2 => 'Time' }, + Writable => 'string', # (so we can format this ourself) + Shift => 'Time', + # (allow date/time or just time value) + ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + ValueConvInv => 'Image::ExifTool::XMP::FormatXMPDate($val) or $val', + PrintConvInv => q{ + my $v = $self->InverseDateTime($val,undef,1); + undef $Image::ExifTool::evalWarning; + return $v if $v; + # allow time-only values by adding dummy date (thanks Herb) + my $v = $self->InverseDateTime("2000:01:01 $val",undef,1); + undef $Image::ExifTool::evalWarning; + return $v if $v and $v =~ s/.* //; # strip off dummy date + $Image::ExifTool::evalWarning = 'Invalid date/time or time-only value (use HH:MM:SS[.ss][+/-HH:MM|Z])'; + return undef; + }, + }, + fieldNotes => { }, + fieldNumber => { }, + habitat => { }, + latestDate => { %dateTimeInfo, Groups => { 2 => 'Time' } }, + month => { Writable => 'integer', Groups => { 2 => 'Time' } }, + parentEventID => { }, + samplingEffort => { }, + samplingProtocol => { }, + sampleSizeValue => { }, + sampleSizeUnit => { }, + startDayOfYear => { Writable => 'integer', Groups => { 2 => 'Time' } }, + verbatimEventDate => { Groups => { 2 => 'Time' } }, + year => { Writable => 'integer', Groups => { 2 => 'Time' } }, +); + +# Darwin Core tags +%Image::ExifTool::DarwinCore::Main = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-dwc', 2 => 'Other' }, + NAMESPACE => 'dwc', + WRITABLE => 'string', + NOTES => q{ + Tags defined in the Darwin Core (dwc) XMP namespace. See + L<http://rs.tdwg.org/dwc/index.htm> for the official specification. + }, + Event => { + Name => 'DCEvent', # (avoid conflict with XMP-iptcExt:Event) + FlatName => 'Event', + Struct => \%event, + }, + # tweak a few of the flattened tag names + EventEventDate => { Name => 'EventDate', Flat => 1 }, + EventEventID => { Name => 'EventID', Flat => 1 }, + EventEventRemarks => { Name => 'EventRemarks', Flat => 1 }, + EventEventTime => { Name => 'EventTime', Flat => 1 }, + FossilSpecimen => { Struct => \%materialSample }, + GeologicalContext => { + FlatName => '', # ('GeologicalContext' is too long) + Struct => { + STRUCT_NAME => 'DarwinCore GeologicalContext', + NAMESPACE => 'dwc', + bed => { }, + earliestAgeOrLowestStage => { }, + earliestEonOrLowestEonothem => { }, + earliestEpochOrLowestSeries => { }, + earliestEraOrLowestErathem => { }, + earliestPeriodOrLowestSystem=> { }, + formation => { }, + geologicalContextID => { }, + group => { }, + highestBiostratigraphicZone => { }, + latestAgeOrHighestStage => { }, + latestEonOrHighestEonothem => { }, + latestEpochOrHighestSeries => { }, + latestEraOrHighestErathem => { }, + latestPeriodOrHighestSystem => { }, + lithostratigraphicTerms => { }, + lowestBiostratigraphicZone => { }, + member => { }, + }, + }, + GeologicalContextBed => { Name => 'GeologicalContextBed', Flat => 1 }, + GeologicalContextFormation => { Name => 'GeologicalContextFormation', Flat => 1 }, + GeologicalContextGroup => { Name => 'GeologicalContextGroup', Flat => 1 }, + GeologicalContextMember => { Name => 'GeologicalContextMember', Flat => 1 }, + HumanObservation => { Struct => \%event }, + Identification => { + FlatName => '', # ('Identification' is redundant) + Struct => { + STRUCT_NAME => 'DarwinCore Identification', + NAMESPACE => 'dwc', + dateIdentified => { %dateTimeInfo, Groups => { 2 => 'Time' } }, + identificationID => { }, + identificationQualifier => { }, + identificationReferences => { }, + identificationRemarks => { }, + identificationVerificationStatus => { }, + identifiedBy => { }, + typeStatus => { }, + # new, ref forum13707 + identifiedByID => { }, + verbatimIdentification => { }, + }, + }, + LivingSpecimen => { Struct => \%materialSample }, + MachineObservation => { Struct => \%event }, + MaterialSample => { Struct => \%materialSample }, + MaterialSampleMaterialSampleID => { Name => 'MaterialSampleID', Flat => 1 }, + MeasurementOrFact => { + FlatName => '', # ('MeasurementOrFact' is redundant and too long) + Struct => { + STRUCT_NAME => 'DarwinCore MeasurementOrFact', + NAMESPACE => 'dwc', + measurementAccuracy => { Format => 'real' }, + measurementDeterminedBy => { }, + measurementDeterminedDate => { %dateTimeInfo, Groups => { 2 => 'Time' } }, + measurementID => { }, + measurementMethod => { }, + measurementRemarks => { }, + measurementType => { }, + measurementUnit => { }, + measurementValue => { }, + }, + }, + Occurrence => { + Struct => { + STRUCT_NAME => 'DarwinCore Occurrence', + NAMESPACE => 'dwc', + associatedMedia => { }, + associatedOccurrences => { }, + associatedReferences => { }, + associatedSequences => { }, + associatedTaxa => { }, + behavior => { }, + catalogNumber => { }, + disposition => { }, + establishmentMeans => { }, + individualCount => { }, + individualID => { }, + lifeStage => { }, + occurrenceDetails => { }, + occurrenceID => { }, + occurrenceRemarks => { }, + occurrenceStatus => { }, + organismQuantity => { }, + organismQuantityType => { }, + otherCatalogNumbers => { }, + preparations => { }, + previousIdentifications => { }, + recordedBy => { }, + recordNumber => { }, + reproductiveCondition => { }, + sex => { }, + # new, ref forum13707 + degreeOfEstablishment => { }, + georeferenceVerificationStatus => { }, + pathway => { }, + recordedByID => { }, + }, + }, + OccurrenceOccurrenceDetails => { Name => 'OccurrenceDetails', Flat => 1 }, + OccurrenceOccurrenceID => { Name => 'OccurrenceID', Flat => 1 }, + OccurrenceOccurrenceRemarks => { Name => 'OccurrenceRemarks', Flat => 1 }, + OccurrenceOccurrenceStatus => { Name => 'OccurrenceStatus', Flat => 1 }, + Organism => { + Struct => { + STRUCT_NAME => 'DarwinCore Organism', + NAMESPACE => 'dwc', + associatedOccurrences => { }, + associatedOrganisms => { }, + organismID => { }, + organismName => { }, + organismRemarks => { }, + organismScope => { }, + previousIdentifications => { }, + }, + }, + OrganismOrganismID => { Name => 'OrganismID', Flat => 1 }, + OrganismOrganismName => { Name => 'OrganismName', Flat => 1 }, + OrganismOrganismRemarks => { Name => 'OrganismRemarks', Flat => 1 }, + OrganismOrganismScope => { Name => 'OrganismScope', Flat => 1 }, + PreservedSpecimen => { Struct => \%materialSample }, + Record => { + Struct => { + STRUCT_NAME => 'DarwinCore Record', + NAMESPACE => 'dwc', + basisOfRecord => { }, + collectionCode => { }, + collectionID => { }, + dataGeneralizations => { }, + datasetID => { }, + datasetName => { }, + dynamicProperties => { }, + informationWithheld => { }, + institutionCode => { }, + institutionID => { }, + ownerInstitutionCode => { }, + }, + }, + ResourceRelationship => { + FlatName => '', # ('ResourceRelationship' is redundant and too long) + Struct => { + STRUCT_NAME => 'DarwinCore ResourceRelationship', + NAMESPACE => 'dwc', + relatedResourceID => { }, + relationshipAccordingTo => { }, + relationshipEstablishedDate => { %dateTimeInfo, Groups => { 2 => 'Time' } }, + relationshipOfResource => { }, + relationshipRemarks => { }, + resourceID => { }, + resourceRelationshipID => { }, + relationshipOfResourceID => { }, # new, ref forum13707 + }, + }, + Taxon => { + Struct => { + STRUCT_NAME => 'DarwinCore Taxon', + NAMESPACE => 'dwc', + acceptedNameUsage => { }, + acceptedNameUsageID => { }, + class => { }, + family => { }, + genus => { }, + higherClassification => { }, + infraspecificEpithet => { }, + cultivarEpithet => { }, # new, ref forum13707 + kingdom => { }, + nameAccordingTo => { }, + nameAccordingToID => { }, + namePublishedIn => { }, + namePublishedInID => { }, + namePublishedInYear => { }, + nomenclaturalCode => { }, + nomenclaturalStatus => { }, + order => { }, + originalNameUsage => { }, + originalNameUsageID => { }, + parentNameUsage => { }, + parentNameUsageID => { }, + phylum => { }, + scientificName => { }, + scientificNameAuthorship => { }, + scientificNameID => { }, + specificEpithet => { }, + subgenus => { }, + taxonConceptID => { }, + taxonID => { }, + taxonRank => { }, + taxonRemarks => { }, + taxonomicStatus => { }, + verbatimTaxonRank => { }, + vernacularName => { Writable => 'lang-alt' }, + }, + }, + TaxonTaxonConceptID => { Name => 'TaxonConceptID', Flat => 1 }, + TaxonTaxonID => { Name => 'TaxonID', Flat => 1 }, + TaxonTaxonRank => { Name => 'TaxonRank', Flat => 1 }, + TaxonTaxonRemarks => { Name => 'TaxonRemarks', Flat => 1 }, + dctermsLocation => { + Name => 'DCTermsLocation', + Groups => { 2 => 'Location' }, + FlatName => 'DC', # ('dctermsLocation' is too long) + Struct => { + STRUCT_NAME => 'DarwinCore DCTermsLocation', + NAMESPACE => 'dwc', + continent => { }, + coordinatePrecision => { }, + coordinateUncertaintyInMeters => { }, + country => { }, + countryCode => { }, + county => { }, + decimalLatitude => { }, + decimalLongitude => { }, + footprintSpatialFit => { }, + footprintSRS => { }, + footprintWKT => { }, + geodeticDatum => { }, + georeferencedBy => { }, + georeferencedDate => { }, + georeferenceProtocol => { }, + georeferenceRemarks => { }, + georeferenceSources => { }, + georeferenceVerificationStatus => { }, + higherGeography => { }, + higherGeographyID => { }, + island => { }, + islandGroup => { }, + locality => { }, + locationAccordingTo => { }, + locationID => { }, + locationRemarks => { }, + maximumDepthInMeters => { }, + maximumDistanceAboveSurfaceInMeters => { }, + maximumElevationInMeters => { }, + minimumDepthInMeters => { }, + minimumDistanceAboveSurfaceInMeters => { }, + minimumElevationInMeters => { }, + municipality => { }, + pointRadiusSpatialFit => { }, + stateProvince => { }, + verbatimCoordinates => { }, + verbatimCoordinateSystem => { }, + verbatimDepth => { }, + verbatimElevation => { }, + verbatimLatitude => { }, + verbatimLocality => { }, + verbatimLongitude => { }, + verbatimSRS => { }, + waterBody => { }, + # new, ref forum13707 + verticalDatum => { }, + }, + }, +); + +1; #end + +__END__ + +=head1 NAME + +Image::ExifTool::DarwinCore - Darwin Core XMP tags + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This file contains tag definitions for the Darwin Core XMP namespace. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://rs.tdwg.org/dwc/index.htm> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/XMP Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/DjVu.pm b/lib/Image/ExifTool/DjVu.pm new file mode 100644 index 0000000..2b0c03a --- /dev/null +++ b/lib/Image/ExifTool/DjVu.pm @@ -0,0 +1,378 @@ +#------------------------------------------------------------------------------ +# File: DjVu.pm +# +# Description: Read DjVu archive meta information +# +# Revisions: 09/25/2008 - P. Harvey Created +# +# References: 1) http://djvu.sourceforge.net/ (DjVu v3 specification, Nov 2005) +# 2) http://www.djvu.org/ +# +# Notes: DjVu files are recognized and the IFF structure is processed +# by Image::ExifTool::AIFF +#------------------------------------------------------------------------------ + +package Image::ExifTool::DjVu; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.07'; + +sub ParseAnt($); +sub ProcessAnt($$$); +sub ProcessMeta($$$); +sub ProcessBZZ($$$); + +# DjVu chunks that we parse (ref 4) +%Image::ExifTool::DjVu::Main = ( + GROUPS => { 2 => 'Image' }, + NOTES => q{ + Information is extracted from the following chunks in DjVu images. See + L<http://www.djvu.org/> for the DjVu specification. + }, + INFO => { + SubDirectory => { TagTable => 'Image::ExifTool::DjVu::Info' }, + }, + FORM => { + TypeOnly => 1, # extract chunk type only, then descend into chunk + SubDirectory => { TagTable => 'Image::ExifTool::DjVu::Form' }, + }, + ANTa => { + SubDirectory => { TagTable => 'Image::ExifTool::DjVu::Ant' }, + }, + ANTz => { + Name => 'CompressedAnnotation', + SubDirectory => { + TagTable => 'Image::ExifTool::DjVu::Ant', + ProcessProc => \&ProcessBZZ, + } + }, + INCL => 'IncludedFileID', +); + +# information in the DjVu INFO chunk +%Image::ExifTool::DjVu::Info = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + FORMAT => 'int8u', + PRIORITY => 0, # first INFO block takes priority + 0 => { + Name => 'ImageWidth', + Format => 'int16u', + }, + 2 => { + Name => 'ImageHeight', + Format => 'int16u', + }, + 4 => { + Name => 'DjVuVersion', + Description => 'DjVu Version', + Format => 'int8u[2]', + # (this may be just one byte as with version 0.16) + ValueConv => '$val=~/(\d+) (\d+)/ ? "$2.$1" : "0.$val"', + }, + 6 => { + Name => 'SpatialResolution', + Format => 'int16u', + ValueConv => '(($val & 0xff)<<8) + ($val>>8)', # (little-endian!) + }, + 8 => { + Name => 'Gamma', + ValueConv => '$val / 10', + }, + 9 => { + Name => 'Orientation', + Mask => 0x07, # (upper 5 bits reserved) + PrintConv => { + 1 => 'Horizontal (normal)', + 2 => 'Rotate 180', + 5 => 'Rotate 90 CW', + 6 => 'Rotate 270 CW', + }, + }, +); + +# information in the DjVu FORM chunk +%Image::ExifTool::DjVu::Form = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'SubfileType', + Format => 'undef[4]', + Priority => 0, + PrintConv => { + DJVU => 'Single-page image', + DJVM => 'Multi-page document', + PM44 => 'Color IW44', + BM44 => 'Grayscale IW44', + DJVI => 'Shared component', + THUM => 'Thumbnail image', + }, + }, +); + +# tags found in the DjVu annotation chunk (ANTz or ANTa) +%Image::ExifTool::DjVu::Ant = ( + PROCESS_PROC => \&Image::ExifTool::DjVu::ProcessAnt, + GROUPS => { 2 => 'Image' }, + NOTES => 'Information extracted from annotation chunks.', + # Note: For speed, ProcessAnt() pre-scans for known tag ID's, so if any + # new tags are added here they must also be added to the pre-scan check + metadata => { + SubDirectory => { TagTable => 'Image::ExifTool::DjVu::Meta' } + }, + xmp => { + Name => 'XMP', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' } + }, +); + +# tags found in the DjVu annotation metadata +%Image::ExifTool::DjVu::Meta = ( + PROCESS_PROC => \&Image::ExifTool::DjVu::ProcessMeta, + GROUPS => { 1 => 'DjVu-Meta', 2 => 'Image' }, + NOTES => q{ + This table lists the standard DjVu metadata tags, but ExifTool will extract + any tags that exist even if they don't appear here. The DjVu v3 + documentation endorses tags borrowed from two standards: 1) BibTeX + bibliography system tags (all lowercase Tag ID's in the table below), and 2) + PDF DocInfo tags (capitalized Tag ID's). + }, + # BibTeX tags (ref http://en.wikipedia.org/wiki/BibTeX) + address => { Groups => { 2 => 'Location' } }, + annote => { Name => 'Annotation' }, + author => { Groups => { 2 => 'Author' } }, + booktitle => { Name => 'BookTitle' }, + chapter => { }, + crossref => { Name => 'CrossRef' }, + edition => { }, + eprint => { Name => 'EPrint' }, + howpublished=> { Name => 'HowPublished' }, + institution => { }, + journal => { }, + key => { }, + month => { Groups => { 2 => 'Time' } }, + note => { }, + number => { }, + organization=> { }, + pages => { }, + publisher => { }, + school => { }, + series => { }, + title => { }, + type => { }, + url => { Name => 'URL' }, + volume => { }, + year => { Groups => { 2 => 'Time' } }, + # PDF tags (same as Image::ExifTool::PDF::Info) + Title => { }, + Author => { Groups => { 2 => 'Author' } }, + Subject => { }, + Keywords => { }, + Creator => { }, + Producer => { }, + CreationDate => { + Name => 'CreateDate', + Groups => { 2 => 'Time' }, + # RFC 3339 date/time format + ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + }, + ModDate => { + Name => 'ModifyDate', + Groups => { 2 => 'Time' }, + ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + }, + Trapped => { + # remove leading '/' from '/True' or '/False' + ValueConv => '$val=~s{^/}{}; $val', + }, +); + +#------------------------------------------------------------------------------ +# Parse DjVu annotation "s-expression" syntax (recursively) +# Inputs: 0) data ref (with pos($$dataPt) set to start of annotation) +# Returns: reference to list of tokens/references, or undef if no tokens, +# and the position in $$dataPt is set to end of last token +# Notes: The DjVu annotation syntax is not well documented, so I make +# a number of assumptions here! +sub ParseAnt($) +{ + my $dataPt = shift; + my (@toks, $tok, $more); + # (the DjVu annotation syntax really sucks, and requires that every + # single token be parsed in order to properly scan through the items) +Tok: for (;;) { + # find the next token + last unless $$dataPt =~ /(\S)/sg; # get next non-space character + if ($1 eq '(') { # start of list + $tok = ParseAnt($dataPt); + } elsif ($1 eq ')') { # end of list + $more = 1; + last; + } elsif ($1 eq '"') { # quoted string + $tok = ''; + for (;;) { + # get string up to the next quotation mark + # this doesn't work in perl 5.6.2! grrrr + # last Tok unless $$dataPt =~ /(.*?)"/sg; + # $tok .= $1; + my $pos = pos($$dataPt); + last Tok unless $$dataPt =~ /"/sg; + $tok .= substr($$dataPt, $pos, pos($$dataPt)-1-$pos); + # we're good unless quote was escaped by odd number of backslashes + last unless $tok =~ /(\\+)$/ and length($1) & 0x01; + $tok .= '"'; # quote is part of the string + } + # convert C escape sequences, allowed in quoted text + # (note: this only converts a few of them!) + my %esc = ( a => "\a", b => "\b", f => "\f", n => "\n", + r => "\r", t => "\t", '"' => '"', '\\' => '\\' ); + $tok =~ s/\\(.)/$esc{$1}||'\\'.$1/egs; + } else { # key name + pos($$dataPt) = pos($$dataPt) - 1; + # allow anything in key but whitespace, braces and double quotes + # (this is one of those assumptions I mentioned) + $tok = $$dataPt =~ /([^\s()"]+)/sg ? $1 : undef; + } + push @toks, $tok if defined $tok; + } + # prevent further parsing unless more after this + pos($$dataPt) = length $$dataPt unless $more; + return @toks ? \@toks : undef; +} + +#------------------------------------------------------------------------------ +# Process DjVu annotation chunk (ANTa or decoded ANTz) +# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref +# Returns: 1 on success +sub ProcessAnt($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + + # quick pre-scan to check for metadata or XMP + return 1 unless $$dataPt =~ /\(\s*(metadata|xmp)[\s("]/s; + + # parse annotations into a tree structure + pos($$dataPt) = 0; + my $toks = ParseAnt($dataPt) or return 0; + + # process annotations individually + my $ant; + foreach $ant (@$toks) { + next unless ref $ant eq 'ARRAY' and @$ant >= 2; + my $tag = shift @$ant; + next if ref $tag or not defined $$tagTablePtr{$tag}; + if ($tag eq 'metadata') { + # ProcessMeta() takes array reference + $et->HandleTag($tagTablePtr, $tag, $ant); + } else { + next if ref $$ant[0]; # only process simple values + $et->HandleTag($tagTablePtr, $tag, $$ant[0]); + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process DjVu metadata +# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref +# Returns: 1 on success +# Notes: input dirInfo DataPt is a reference to a list of pre-parsed metadata entries +sub ProcessMeta($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + return 0 unless ref $$dataPt eq 'ARRAY'; + $et->VerboseDir('Metadata', scalar @$$dataPt); + my ($item, $err); + foreach $item (@$$dataPt) { + # make sure item is a simple tag/value pair + $err=1, next unless ref $item eq 'ARRAY' and @$item >= 2 and + not ref $$item[0] and not ref $$item[1]; + # add any new tags to the table + unless ($$tagTablePtr{$$item[0]}) { + my $name = $$item[0]; + $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters + length $name or $err = 1, next; + AddTagToTable($tagTablePtr, $$item[0], { Name => ucfirst($name) }); + } + $et->HandleTag($tagTablePtr, $$item[0], $$item[1]); + } + $err and $et->Warn('Ignored invalid metadata entry(s)'); + return 1; +} + +#------------------------------------------------------------------------------ +# Process BZZ-compressed data (in DjVu images) +# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref +# Returns: 1 on success +sub ProcessBZZ($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + require Image::ExifTool::BZZ; + my $buff = Image::ExifTool::BZZ::Decode($$dirInfo{DataPt}); + unless (defined $buff) { + $et->Warn("Error decoding $$dirInfo{DirName}"); + return 0; + } + my $verbose = $et->Options('Verbose'); + if ($verbose >= 3) { + # dump the decoded data in very verbose mode + $et->VerboseDir("Decoded $$dirInfo{DirName}", 0, length $buff); + $et->VerboseDump(\$buff); + } + $$dirInfo{DataPt} = \$buff; + $$dirInfo{DataLen} = $$dirInfo{DirLen} = length $buff; + # process the data using the default process proc for this table + my $processProc = $$tagTablePtr{PROCESS_PROC} or return 0; + return &$processProc($et, $dirInfo, $tagTablePtr); +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::DjVu - Read DjVu meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from DjVu images. Parsing of the DjVu IFF structure is done by +Image::ExifTool::AIFF. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://djvu.sourceforge.net/> + +=item L<http://www.djvu.org/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/DjVu Tags>, +L<Image::ExifTool::AIFF(3pm)|Image::ExifTool::AIFF>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/EXE.pm b/lib/Image/ExifTool/EXE.pm new file mode 100644 index 0000000..4b32d33 --- /dev/null +++ b/lib/Image/ExifTool/EXE.pm @@ -0,0 +1,1432 @@ +#------------------------------------------------------------------------------ +# File: EXE.pm +# +# Description: Read meta information of various executable file formats +# +# Revisions: 2008/08/28 - P. Harvey Created +# 2011/07/12 - P. Harvey Added CHM (ok, not EXE, but it fits here) +# +# References: 1) http://www.openwatcom.org/ftp/devel/docs/pecoff.pdf +# 2) http://support.microsoft.com/kb/65122 +# 3) http://www.opensource.apple.com +# 4) http://www.skyfree.org/linux/references/ELF_Format.pdf +# 5) http://msdn.microsoft.com/en-us/library/ms809762.aspx +# 6) http://code.google.com/p/pefile/ +# 7) http://www.codeproject.com/KB/DLL/showver.aspx +#------------------------------------------------------------------------------ + +package Image::ExifTool::EXE; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.17'; + +sub ProcessPEResources($$); +sub ProcessPEVersion($$); + +# PE file resource types (ref 6) +my %resourceType = ( + 1 => 'Cursor', + 2 => 'Bitmap', + 3 => 'Icon', + 4 => 'Menu', + 5 => 'Dialog', + 6 => 'String', + 7 => 'Font Dir', + 8 => 'Font', + 9 => 'Accelerator', + 10 => 'RC Data', + 11 => 'Message Table', + 12 => 'Group Cursor', + 14 => 'Group Icon', + 16 => 'Version', + 17 => 'Dialog Include', + 19 => 'Plug-n-Play', + 20 => 'VxD', + 21 => 'Animated Cursor', + 22 => 'Animated Icon', + 23 => 'HTML', + 24 => 'Manifest', +); + +my %languageCode = ( + Notes => q{ + See L<https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid> + for the full list of Microsoft language codes. + }, + '0000' => 'Neutral', + '007F' => 'Invariant', + '0400' => 'Process default', + '0401' => 'Arabic', + '0402' => 'Bulgarian', + '0403' => 'Catalan', + '0404' => 'Chinese (Traditional)', + '0405' => 'Czech', + '0406' => 'Danish', + '0407' => 'German', + '0408' => 'Greek', + '0409' => 'English (U.S.)', + '040A' => 'Spanish (Castilian)', + '040B' => 'Finnish', + '040C' => 'French', + '040D' => 'Hebrew', + '040E' => 'Hungarian', + '040F' => 'Icelandic', + '0410' => 'Italian', + '0411' => 'Japanese', + '0412' => 'Korean', + '0413' => 'Dutch', + '0414' => 'Norwegian (Bokml)', + '0415' => 'Polish', + '0416' => 'Portuguese (Brazilian)', + '0417' => 'Rhaeto-Romanic', + '0418' => 'Romanian', + '0419' => 'Russian', + '041A' => 'Croato-Serbian (Latin)', + '041B' => 'Slovak', + '041C' => 'Albanian', + '041D' => 'Swedish', + '041E' => 'Thai', + '041F' => 'Turkish', + '0420' => 'Urdu', + # 0421-0493 ref 6 + '0421' => 'Indonesian', + '0422' => 'Ukrainian', + '0423' => 'Belarusian', + '0424' => 'Slovenian', + '0425' => 'Estonian', + '0426' => 'Latvian', + '0427' => 'Lithuanian', + '0428' => 'Maori', + '0429' => 'Farsi', + '042a' => 'Vietnamese', + '042b' => 'Armenian', + '042c' => 'Azeri', + '042d' => 'Basque', + '042e' => 'Sorbian', + '042f' => 'Macedonian', + '0430' => 'Sutu', + '0431' => 'Tsonga', + '0432' => 'Tswana', + '0433' => 'Venda', + '0434' => 'Xhosa', + '0435' => 'Zulu', + '0436' => 'Afrikaans', + '0437' => 'Georgian', + '0438' => 'Faeroese', + '0439' => 'Hindi', + '043a' => 'Maltese', + '043b' => 'Saami', + '043c' => 'Gaelic', + '043e' => 'Malay', + '043f' => 'Kazak', + '0440' => 'Kyrgyz', + '0441' => 'Swahili', + '0443' => 'Uzbek', + '0444' => 'Tatar', + '0445' => 'Bengali', + '0446' => 'Punjabi', + '0447' => 'Gujarati', + '0448' => 'Oriya', + '0449' => 'Tamil', + '044a' => 'Telugu', + '044b' => 'Kannada', + '044c' => 'Malayalam', + '044d' => 'Assamese', + '044e' => 'Marathi', + '044f' => 'Sanskrit', + '0450' => 'Mongolian', + '0456' => 'Galician', + '0457' => 'Konkani', + '0458' => 'Manipuri', + '0459' => 'Sindhi', + '045a' => 'Syriac', + '0460' => 'Kashmiri', + '0461' => 'Nepali', + '0465' => 'Divehi', + '047f' => 'Invariant', + '048f' => 'Esperanto', + '0490' => 'Walon', + '0491' => 'Cornish', + '0492' => 'Welsh', + '0493' => 'Breton', + '0800' => 'Neutral 2', + '0804' => 'Chinese (Simplified)', + '0807' => 'German (Swiss)', + '0809' => 'English (British)', + '080A' => 'Spanish (Mexican)', + '080C' => 'French (Belgian)', + '0810' => 'Italian (Swiss)', + '0813' => 'Dutch (Belgian)', + '0814' => 'Norwegian (Nynorsk)', + '0816' => 'Portuguese', + '081A' => 'Serbo-Croatian (Cyrillic)', + '0C07' => 'German (Austrian)', + '0C09' => 'English (Australian)', + '0C0A' => 'Spanish (Modern)', + '0C0C' => 'French (Canadian)', + '1009' => 'English (Canadian)', + '100C' => 'French (Swiss)', +); + +# Information extracted from PE COFF (Windows EXE) file header +%Image::ExifTool::EXE::Main = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + FORMAT => 'int16u', + NOTES => q{ + This module extracts information from various types of Windows, MacOS and + Unix executable and library files. The first table below lists information + extracted from the header of Windows PE (Portable Executable) EXE files and + DLL libraries. + }, + 0 => { + Name => 'MachineType', + PrintHex => 1, + PrintConv => { + 0x014c => 'Intel 386 or later, and compatibles', + 0x014d => 'Intel i860', #5 + 0x0162 => 'MIPS R3000', + 0x0166 => 'MIPS little endian (R4000)', + 0x0168 => 'MIPS R10000', + 0x0169 => 'MIPS little endian WCI v2', + 0x0183 => 'Alpha AXP (old)', #5 + 0x0184 => 'Alpha AXP', + 0x01a2 => 'Hitachi SH3', + 0x01a3 => 'Hitachi SH3 DSP', + 0x01a6 => 'Hitachi SH4', + 0x01a8 => 'Hitachi SH5', + 0x01c0 => 'ARM little endian', + 0x01c2 => 'Thumb', + 0x01d3 => 'Matsushita AM33', + 0x01f0 => 'PowerPC little endian', + 0x01f1 => 'PowerPC with floating point support', + 0x0200 => 'Intel IA64', + 0x0266 => 'MIPS16', + 0x0268 => 'Motorola 68000 series', + 0x0284 => 'Alpha AXP 64-bit', + 0x0366 => 'MIPS with FPU', + 0x0466 => 'MIPS16 with FPU', + 0x0ebc => 'EFI Byte Code', + 0x8664 => 'AMD AMD64', + 0x9041 => 'Mitsubishi M32R little endian', + 0xc0ee => 'clr pure MSIL', + }, + }, + 2 => { + Name => 'TimeStamp', + Format => 'int32u', + Groups => { 2 => 'Time' }, + ValueConv => 'ConvertUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + 9 => { + Name => 'ImageFileCharacteristics', + # ref https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_image_file_header + PrintConv => { BITMASK => { + 0 => 'No relocs', + 1 => 'Executable', + 2 => 'No line numbers', + 3 => 'No symbols', + 4 => 'Aggressive working-set trim', + 5 => 'Large address aware', + 7 => 'Bytes reversed lo', + 8 => '32-bit', + 9 => 'No debug', + 10 => 'Removable run from swap', + 11 => 'Net run from swap', + 12 => 'System file', + 13 => 'DLL', + 14 => 'Uniprocessor only', + 15 => 'Bytes reversed hi', + }}, + }, + 10 => { + Name => 'PEType', + PrintHex => 1, + PrintConv => { + 0x107 => 'ROM Image', + 0x10b => 'PE32', + 0x20b => 'PE32+', + }, + }, + 11 => { + Name => 'LinkerVersion', + Format => 'int8u[2]', + ValueConv => '$val=~tr/ /./; $val', + }, + 12 => { + Name => 'CodeSize', + Format => 'int32u', + }, + 14 => { + Name => 'InitializedDataSize', + Format => 'int32u', + }, + 16 => { + Name => 'UninitializedDataSize', + Format => 'int32u', + }, + 18 => { + Name => 'EntryPoint', + Format => 'int32u', + PrintConv => 'sprintf("0x%.4x", $val)', + }, + 30 => { + Name => 'OSVersion', + Format => 'int16u[2]', + ValueConv => '$val=~tr/ /./; $val', + }, + 32 => { + Name => 'ImageVersion', + Format => 'int16u[2]', + ValueConv => '$val=~tr/ /./; $val', + }, + 34 => { + Name => 'SubsystemVersion', + Format => 'int16u[2]', + ValueConv => '$val=~tr/ /./; $val', + }, + 44 => { + Name => 'Subsystem', + PrintConv => { + 0 => 'Unknown', + 1 => 'Native', + 2 => 'Windows GUI', + 3 => 'Windows command line', + 5 => 'OS/2 command line', #5 + 7 => 'POSIX command line', + 9 => 'Windows CE GUI', + 10 => 'EFI application', + 11 => 'EFI boot service', + 12 => 'EFI runtime driver', + 13 => 'EFI ROM', #6 + 14 => 'XBOX', #6 + }, + }, +); + +# PE file version information (ref 6) +%Image::ExifTool::EXE::PEVersion = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + FORMAT => 'int32u', + NOTES => q{ + Information extracted from the VS_VERSION_INFO structure of Windows PE + files. + }, + # (boring -- always 0xfeef04bd) + #0 => { + # Name => 'Signature', + # PrintConv => 'sprintf("0x%.4x",$val)', + #}, + # (boring -- always 1.0) + #1 => { + # Name => 'StructVersion', + # Format => 'int16u[2]', + # ValueConv => 'my @a=split(" ",$val); "$a[1].$a[0]"', + #}, + 2 => { + Name => 'FileVersionNumber', + Format => 'int16u[4]', + ValueConv => 'my @a=split(" ",$val); "$a[1].$a[0].$a[3].$a[2]"', + }, + 4 => { + Name => 'ProductVersionNumber', + Format => 'int16u[4]', + ValueConv => 'my @a=split(" ",$val); "$a[1].$a[0].$a[3].$a[2]"', + }, + 6 => { + Name => 'FileFlagsMask', + PrintConv => 'sprintf("0x%.4x",$val)', + }, + 7 => { # ref Cygwin /usr/include/w32api/winver.h + Name => 'FileFlags', + PrintConv => { BITMASK => { + 0 => 'Debug', + 1 => 'Pre-release', + 2 => 'Patched', + 3 => 'Private build', + 4 => 'Info inferred', + 5 => 'Special build', + }}, + }, + 8 => { + Name => 'FileOS', + PrintHex => 1, + PrintConv => { # ref Cygwin /usr/include/w32api/winver.h + 0x00001 => 'Win16', + 0x00002 => 'PM-16', + 0x00003 => 'PM-32', + 0x00004 => 'Win32', + 0x10000 => 'DOS', + 0x20000 => 'OS/2 16-bit', + 0x30000 => 'OS/2 32-bit', + 0x40000 => 'Windows NT', + 0x10001 => 'Windows 16-bit', + 0x10004 => 'Windows 32-bit', + 0x20002 => 'OS/2 16-bit PM-16', + 0x30003 => 'OS/2 32-bit PM-32', + 0x40004 => 'Windows NT 32-bit', + }, + }, + 9 => { # ref Cygwin /usr/include/w32api/winver.h + Name => 'ObjectFileType', + PrintConv => { + 0 => 'Unknown', + 1 => 'Executable application', + 2 => 'Dynamic link library', + 3 => 'Driver', + 4 => 'Font', + 5 => 'VxD', + 7 => 'Static library', + }, + }, + 10 => 'FileSubtype', + # (these are usually zero, so ignore them) + # 11 => 'FileDateMS', + # 12 => 'FileDateLS', +); + +# Windows PE StringFileInfo resource strings +# (see http://msdn.microsoft.com/en-us/library/aa381049.aspx) +%Image::ExifTool::EXE::PEString = ( + GROUPS => { 2 => 'Other' }, + VARS => { NO_ID => 1 }, + NOTES => q{ + Resource strings found in Windows PE files. The B<TagID>'s are not shown + because they are the same as the B<Tag Name>. ExifTool will extract any + existing StringFileInfo tags even if not listed in this table. + }, + LanguageCode => { + Notes => 'Windows code page; extracted from the StringFileInfo value', + # ref http://techsupt.winbatch.com/TS/T000001050F49.html + # (also see http://support.bigfix.com/fixlet/documents/WinInspectors-2006-08-10.pdf) + # (also see ftp://ftp.dyu.edu.tw/pub/cpatch/faq/tech/tech_nlsnt.txt) + # (not a complete set) + PrintString => 1, + SeparateTable => 1, + PrintConv => \%languageCode, + }, + CharacterSet => { + Notes => 'extracted from the StringFileInfo value', + # ref http://techsupt.winbatch.com/TS/T000001050F49.html + # (also see http://blog.chinaunix.net/u1/41189/showart_345768.html) + PrintString => 1, + PrintConv => { + '0000' => 'ASCII', + '03A4' => 'Windows, Japan (Shift - JIS X-0208)', # cp932 + '03A8' => 'Windows, Chinese (Simplified)', # cp936 + '03B5' => 'Windows, Korea (Shift - KSC 5601)', # cp949 + '03B6' => 'Windows, Taiwan (Big5)', # cp950 + '04B0' => 'Unicode', # UCS-2 + '04E2' => 'Windows, Latin2 (Eastern European)', + '04E3' => 'Windows, Cyrillic', + '04E4' => 'Windows, Latin1', + '04E5' => 'Windows, Greek', + '04E6' => 'Windows, Turkish', + '04E7' => 'Windows, Hebrew', + '04E8' => 'Windows, Arabic', + }, + }, + BuildDate => { Groups => { 2 => 'Time' } }, # (non-standard) + BuildVersion => { }, # (non-standard) + Comments => { }, + CompanyName => { }, + Copyright => { }, # (non-standard) + FileDescription => { }, + FileVersion => { }, + InternalName => { }, + LegalCopyright => { }, + LegalTrademarks => { }, + OriginalFilename=> { Name => 'OriginalFileName' }, + PrivateBuild => { }, + ProductName => { }, + ProductVersion => { }, + SpecialBuild => { }, +); + +# Information extracted from Mach-O (Mac OS X) file header +%Image::ExifTool::EXE::MachO = ( + GROUPS => { 2 => 'Other' }, + VARS => { ID_LABEL => 'Index' }, + NOTES => q{ + Information extracted from Mach-O (Mac OS X) executable files and DYLIB + libraries. + }, + # ref http://www.opensource.apple.com/darwinsource/DevToolsOct2007/cctools-622.9/include/mach/machine.h + 0 => 'CPUArchitecture', + 1 => 'CPUByteOrder', + 2 => 'CPUCount', + # ref /System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/machine.h + 3 => { + Name => 'CPUType', + List => 1, + PrintConv => { + # handle 64-bit flag (0x1000000) + OTHER => sub { + my ($val, $inv, $conv) = @_; + my $v = $val & 0xfeffffff; + return $$conv{$v} ? "$$conv{$v} 64-bit" : "Unknown ($val)"; + }, + -1 => 'Any', + 1 => 'VAX', + 2 => 'ROMP', + 4 => 'NS32032', + 5 => 'NS32332', + 6 => 'MC680x0', + 7 => 'x86', + 8 => 'MIPS', + 9 => 'NS32532', + 10 => 'MC98000', + 11 => 'HPPA', + 12 => 'ARM', + 13 => 'MC88000', + 14 => 'SPARC', + 15 => 'i860 big endian', + 16 => 'i860 little endian', + 17 => 'RS6000', + 18 => 'PowerPC', + 255 => 'VEO', + }, + }, + # ref /System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/machine.h + 4 => { + Name => 'CPUSubtype', + List => 1, + PrintConv => { + # handle 64-bit flags on CPUType (0x1000000) and CPUSubtype (0x80000000) + OTHER => sub { + my ($val, $inv, $conv) = @_; + my @v = split ' ', $val; + my $v = ($v[0] & 0xfeffffff) . ' ' . ($v[1] & 0x7fffffff); + return $$conv{$v} ? "$$conv{$v} 64-bit" : "Unknown ($val)"; + }, + # in theory, subtype can be -1 for multiple CPU types, + # but in practice I'm not sure anyone uses this - PH + '1 0' => 'VAX (all)', + '1 1' => 'VAX780', + '1 2' => 'VAX785', + '1 3' => 'VAX750', + '1 4' => 'VAX730', + '1 5' => 'UVAXI', + '1 6' => 'UVAXII', + '1 7' => 'VAX8200', + '1 8' => 'VAX8500', + '1 9' => 'VAX8600', + '1 10' => 'VAX8650', + '1 11' => 'VAX8800', + '1 12' => 'UVAXIII', + '2 0' => 'RT (all)', + '2 1' => 'RT PC', + '2 2' => 'RT APC', + '2 3' => 'RT 135', + # 32032/32332/32532 subtypes. + '4 0' => 'NS32032 (all)', + '4 1' => 'NS32032 DPC (032 CPU)', + '4 2' => 'NS32032 SQT', + '4 3' => 'NS32032 APC FPU (32081)', + '4 4' => 'NS32032 APC FPA (Weitek)', + '4 5' => 'NS32032 XPC (532)', + '5 0' => 'NS32332 (all)', + '5 1' => 'NS32332 DPC (032 CPU)', + '5 2' => 'NS32332 SQT', + '5 3' => 'NS32332 APC FPU (32081)', + '5 4' => 'NS32332 APC FPA (Weitek)', + '5 5' => 'NS32332 XPC (532)', + '6 1' => 'MC680x0 (all)', + '6 2' => 'MC68040', + '6 3' => 'MC68030', + '7 3' => 'i386 (all)', + '7 4' => 'i486', + '7 132' => 'i486SX', + '7 5' => 'i586', + '7 22' => 'Pentium Pro', + '7 54' => 'Pentium II M3', + '7 86' => 'Pentium II M5', + '7 103' => 'Celeron', + '7 119' => 'Celeron Mobile', + '7 8' => 'Pentium III', + '7 24' => 'Pentium III M', + '7 40' => 'Pentium III Xeon', + '7 9' => 'Pentium M', + '7 10' => 'Pentium 4', + '7 26' => 'Pentium 4 M', + '7 11' => 'Itanium', + '7 27' => 'Itanium 2', + '7 12' => 'Xeon', + '7 28' => 'Xeon MP', + '8 0' => 'MIPS (all)', + '8 1' => 'MIPS R2300', + '8 2' => 'MIPS R2600', + '8 3' => 'MIPS R2800', + '8 4' => 'MIPS R2000a', + '8 5' => 'MIPS R2000', + '8 6' => 'MIPS R3000a', + '8 7' => 'MIPS R3000', + '10 0' => 'MC98000 (all)', + '10 1' => 'MC98601', + '11 0' => 'HPPA (all)', + '11 1' => 'HPPA 7100LC', + '12 0' => 'ARM (all)', + '12 1' => 'ARM A500 ARCH', + '12 2' => 'ARM A500', + '12 3' => 'ARM A440', + '12 4' => 'ARM M4', + '12 5' => 'ARM A680/V4T', + '12 6' => 'ARM V6', + '12 7' => 'ARM V5TEJ', + '12 8' => 'ARM XSCALE', + '12 9' => 'ARM V7', + '13 0' => 'MC88000 (all)', + '13 1' => 'MC88100', + '13 2' => 'MC88110', + '14 0' => 'SPARC (all)', + '14 1' => 'SUN 4/260', + '14 2' => 'SUN 4/110', + '15 0' => 'i860 (all)', + '15 1' => 'i860 860', + '16 0' => 'i860 little (all)', + '16 1' => 'i860 little', + '17 0' => 'RS6000 (all)', + '17 1' => 'RS6000', + '18 0' => 'PowerPC (all)', + '18 1' => 'PowerPC 601', + '18 2' => 'PowerPC 602', + '18 3' => 'PowerPC 603', + '18 4' => 'PowerPC 603e', + '18 5' => 'PowerPC 603ev', + '18 6' => 'PowerPC 604', + '18 7' => 'PowerPC 604e', + '18 8' => 'PowerPC 620', + '18 9' => 'PowerPC 750', + '18 10' => 'PowerPC 7400', + '18 11' => 'PowerPC 7450', + '18 100' => 'PowerPC 970', + '255 1' => 'VEO 1', + '255 2' => 'VEO 2', + }, + }, + 5 => { + Name => 'ObjectFileType', + PrintHex => 1, + # ref https://svn.red-bean.com/pyobjc/branches/pyobjc-20x-branch/macholib/macholib/mach_o.py + PrintConv => { + -1 => 'Static library', #PH (internal use only) + 1 => 'Relocatable object', + 2 => 'Demand paged executable', + 3 => 'Fixed VM shared library', + 4 => 'Core', + 5 => 'Preloaded executable', + 6 => 'Dynamically bound shared library', + 7 => 'Dynamic link editor', + 8 => 'Dynamically bound bundle', + 9 => 'Shared library stub for static linking', + # (the following from Apple loader.h header file) + 10 => 'Debug information', + 11 => 'x86_64 kexts', + }, + }, + 6 => { + Name => 'ObjectFlags', + PrintHex => 1, + # ref Apple loader.h header file + PrintConv => { BITMASK => { + 0 => 'No undefs', + 1 => 'Incrementa link', + 2 => 'Dyld link', + 3 => 'Bind at load', + 4 => 'Prebound', + 5 => 'Split segs', + 6 => 'Lazy init', + 7 => 'Two level', + 8 => 'Force flat', + 9 => 'No multi defs', + 10 => 'No fix prebinding', + 11 => 'Prebindable', + 12 => 'All mods bound', + 13 => 'Subsections via symbols', + 14 => 'Canonical', + 15 => 'Weak defines', + 16 => 'Binds to weak', + 17 => 'Allow stack execution', + 18 => 'Dead strippable dylib', + 19 => 'Root safe', + 20 => 'No reexported dylibs', + 21 => 'Random address', + }}, + }, +); + +# Information extracted from PEF (Classic MacOS executable) file header +%Image::ExifTool::EXE::PEF = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + NOTES => q{ + Information extracted from PEF (Classic MacOS) executable files and + libraries. + }, + FORMAT => 'int32u', + 2 => { + Name => 'CPUArchitecture', + Format => 'undef[4]', + PrintConv => { + pwpc => 'PowerPC', + m68k => '68000', + }, + }, + 3 => 'PEFVersion', + 4 => { + Name => 'TimeStamp', + Groups => { 2 => 'Time' }, + # timestamp is relative to Jan 1, 1904 + ValueConv => 'ConvertUnixTime($val - ((66 * 365 + 17) * 24 * 3600))', + PrintConv => '$self->ConvertDateTime($val)', + }, + #5 => 'OldDefVersion', + #6 => 'OldImpVersion', + #7 => 'CurrentVersion', +); + +# Information extracted from ELF (Unix executable) file header +%Image::ExifTool::EXE::ELF = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + NOTES => q{ + Information extracted from ELF (Unix) executable files and SO libraries. + }, + 4 => { + Name => 'CPUArchitecture', + PrintConv => { + 1 => '32 bit', + 2 => '64 bit', + }, + }, + 5 => { + Name => 'CPUByteOrder', + PrintConv => { + 1 => 'Little endian', + 2 => 'Big endian', + }, + }, + 16 => { + Name => 'ObjectFileType', + Format => 'int16u', + PrintConv => { + 0 => 'None', + 1 => 'Relocatable file', + 2 => 'Executable file', + 3 => 'Shared object file', + 4 => 'Core file', + }, + }, + 18 => { + Name => 'CPUType', + Format => 'int16u', + # ref /usr/include/linux/elf-em.h + PrintConv => { + 0 => 'None', + 1 => 'AT&T WE 32100', + 2 => 'SPARC', + 3 => 'i386', + 4 => 'Motorola 68000', + 5 => 'Motorola 88000', + 6 => 'i486', + 7 => 'i860', + 8 => 'MIPS R3000', + 10 => 'MIPS R4000', + 15 => 'HPPA', + 18 => 'Sun v8plus', + 20 => 'PowerPC', + 21 => 'PowerPC 64-bit', + 22 => 'IBM S/390', + 23 => 'Cell BE SPU', + 42 => 'SuperH', + 43 => 'SPARC v9 64-bit', + 46 => 'Renesas H8/300,300H,H8S', + 50 => 'HP/Intel IA-64', + 62 => 'AMD x86-64', + 76 => 'Axis Communications 32-bit embedded processor', + 87 => 'NEC v850', + 88 => 'Renesas M32R', + 0x5441 => 'Fujitsu FR-V', + 0x9026 => 'Alpha', # (interim value) + 0x9041 => 'm32r (old)', + 0x9080 => 'v850 (old)', + 0xa390 => 'S/390 (old)', + }, + }, +); + +# Information extracted from static library archives +# (ref http://opensource.apple.com//source/xnu/xnu-1456.1.26/EXTERNAL_HEADERS/ar.h) +%Image::ExifTool::EXE::AR = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + NOTES => q{ + Information extracted from static libraries. + }, + # 0 string[16] ar_name + 16 => { + Name => 'CreateDate', + Groups => { 2 => 'Time' }, + Format => 'string[12]', + ValueConv => 'ConvertUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + # 28 string[6] ar_uid + # 34 string[6] ar_gid + # 40 string[8] ar_mode + # 48 string[10] ar_size + # 58 string[2] terminator "`\n" +); + +# Microsoft compiled help format (ref http://www.russotto.net/chm/chmformat.html) +%Image::ExifTool::EXE::CHM = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + NOTES => 'Tags extracted from Microsoft Compiled HTML files.', + FORMAT => 'int32u', + 1 => { Name => 'CHMVersion' }, + # 2 - total header length + # 3 - 1 + # 4 - low bits of date/time value plus 42 (ref http://www.nongnu.org/chmspec/latest/ITSF.html) + 5 => { + Name => 'LanguageCode', + SeparateTable => 1, + ValueConv => 'sprintf("%.4X", $val)', + PrintConv => \%languageCode, + }, +); + +#------------------------------------------------------------------------------ +# Extract information from a CHM file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid CHM file +sub ProcessCHM($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + + return 0 unless $raf->Read($buff, 56) == 56 and + $buff =~ /^ITSF.{20}\x10\xfd\x01\x7c\xaa\x7b\xd0\x11\x9e\x0c\0\xa0\xc9\x22\xe6\xec/s; + my $tagTablePtr = GetTagTable('Image::ExifTool::EXE::CHM'); + $et->SetFileType(); + SetByteOrder('II'); + $et->ProcessDirectory({ DataPt => \$buff }, $tagTablePtr); + return 1; +} + +#------------------------------------------------------------------------------ +# Read Unicode string (null terminated) from resource +# Inputs: 0) data ref, 1) start offset, 2) data end, 3) optional ExifTool object ref +# Returns: 0) Unicode string translated to UTF8, or current CharSet with ExifTool ref +# 1) end pos (rounded up to nearest 4 bytes) +sub ReadUnicodeStr($$$;$) +{ + my ($dataPt, $pos, $end, $et) = @_; + $end = length $$dataPt if $end > length $$dataPt; # (be safe) + my $str = ''; + while ($pos + 2 <= $end) { + my $ch = substr($$dataPt, $pos, 2); + $pos += 2; + last if $ch eq "\0\0"; + $str .= $ch; + } + $pos += 2 if $pos & 0x03; + my $to = $et ? $et->Options('Charset') : 'UTF8'; + return (Image::ExifTool::Decode(undef,$str,'UCS2','II',$to), $pos); +} + +#------------------------------------------------------------------------------ +# Process Windows PE Version Resource +# Inputs: 0) ExifTool object ref, 1) dirInfo ref +# Returns: true on success +sub ProcessPEVersion($$) +{ + my ($et, $dirInfo) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $end = $pos + $$dirInfo{DirLen}; + my ($index, $len, $valLen, $type, $string, $strEnd); + + # get VS_VERSION_INFO + for ($index = 0; ; ++$index) { + $pos = ($pos + 3) & 0xfffffffc; # align on a 4-byte boundary + last if $pos + 6 > $end; + $len = Get16u($dataPt, $pos); + $valLen = Get16u($dataPt, $pos + 2); + $type = Get16u($dataPt, $pos + 4); + return 0 unless $len or $valLen; # prevent possible infinite loop + ($string, $strEnd) = ReadUnicodeStr($dataPt, $pos + 6, $pos + $len); + return 0 if $strEnd + $valLen > $end; + unless ($index or $string eq 'VS_VERSION_INFO') { + $et->Warn('Invalid Version Info block'); + return 0; + } + if ($string eq 'VS_VERSION_INFO') { + # parse the fixed version info + $$dirInfo{DirStart} = $strEnd; + $$dirInfo{DirLen} = $valLen; + my $subTablePtr = GetTagTable('Image::ExifTool::EXE::PEVersion'); + $et->ProcessDirectory($dirInfo, $subTablePtr); + $pos = $strEnd + $valLen; + } elsif ($string eq 'StringFileInfo' and $valLen == 0) { + $pos += $len; + my $pt = $strEnd; + # parse string table + my $tagTablePtr = GetTagTable('Image::ExifTool::EXE::PEString'); + for ($index = 0; $pt + 6 < $pos; ++$index) { + $len = Get16u($dataPt, $pt); + $valLen = Get16u($dataPt, $pt + 2); + # $type = Get16u($dataPt, $pt + 4); + my $entryEnd = $pt + $len; + # get tag ID (converted to UTF8) + ($string, $pt) = ReadUnicodeStr($dataPt, $pt + 6, $entryEnd); + unless ($index) { + # separate the language code and character set + # (not sure what the CharacterSet tag is for, but the string + # values stored here are UCS-2 in all my files even if the + # CharacterSet is otherwise) + my $char; + if (length($string) > 4) { + $char = substr($string, 4); + $string = substr($string, 0, 4); + } + $et->HandleTag($tagTablePtr, 'LanguageCode', uc $string); + $et->HandleTag($tagTablePtr, 'CharacterSet', uc $char) if $char; + next; + } + my $tag = $string; + # create entry in tag table if it doesn't already exist + unless ($$tagTablePtr{$tag}) { + my $name = $tag; + $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters + next unless length $name; + AddTagToTable($tagTablePtr, $tag, { Name => $name }); + } + # get tag value (converted to current Charset) + if ($valLen) { + ($string, $pt) = ReadUnicodeStr($dataPt, $pt, $entryEnd, $et); + } else { + $string = ''; + } + $et->HandleTag($tagTablePtr, $tag, $string); + # step to next entry (padded to an even word) + $pt = ($entryEnd + 3) & 0xfffffffc; + } + } else { + $pos += $len + $valLen; + # ignore other information (for now) + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process Windows PE Resources +# Inputs: 0) ExifTool object ref, 1) dirInfo ref +# Returns: true on success +sub ProcessPEResources($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $base = $$dirInfo{Base}; + my $dirStart = $$dirInfo{DirStart} + $base; + my $level = $$dirInfo{Level} || 0; + my $verbose = $et->Options('Verbose'); + my ($buff, $buf2, $item); + + return 0 if $level > 10; # protect against deep recursion + # read the resource header + $raf->Seek($dirStart, 0) and $raf->Read($buff, 16) == 16 or return 0; + my $nameEntries = Get16u(\$buff, 12); + my $idEntries = Get16u(\$buff, 14); + my $count = $nameEntries + $idEntries; + $raf->Read($buff, $count * 8) == $count * 8 or return 0; + # loop through all resource entries + for ($item=0; $item<$count; ++$item) { + my $pos = $item * 8; + my $name = Get32u(\$buff, $pos); + my $entryPos = Get32u(\$buff, $pos + 4); + unless ($level) { + # set resource type if this is the 0th level directory + my $resType = $resourceType{$name} || sprintf('Unknown (0x%x)', $name); + # ignore everything but the Version resource unless verbose + if ($verbose) { + $et->VPrint(0, "$resType resource:\n"); + } else { + next unless $resType eq 'Version'; + } + $$dirInfo{ResType} = $resType; + } + if ($entryPos & 0x80000000) { # is this a directory? + # descend into next directory level + $$dirInfo{DirStart} = $entryPos & 0x7fffffff; + $$dirInfo{Level} = $level + 1; + ProcessPEResources($et, $dirInfo) or return 0; + --$$dirInfo{Level}; + } elsif ($$dirInfo{ResType} eq 'Version' and $level == 2 and + not $$dirInfo{GotVersion}) # (only process first Version resource) + { + # get position of this resource in the file + my $buf2; + $raf->Seek($entryPos + $base, 0) and $raf->Read($buf2, 16) == 16 or return 0; + my $off = Get32u(\$buf2, 0); + my $len = Get32u(\$buf2, 4); + # determine which section this is in so we can convert the virtual address + my ($section, $filePos); + foreach $section (@{$$dirInfo{Sections}}) { + next unless $off >= $$section{VirtualAddress} and + $off < $$section{VirtualAddress} + $$section{Size}; + $filePos = $off + $$section{Base} - $$section{VirtualAddress}; + last; + } + return 0 unless $filePos; + $raf->Seek($filePos, 0) and $raf->Read($buf2, $len) == $len or return 0; + ProcessPEVersion($et, { + DataPt => \$buf2, + DataLen => $len, + DirStart => 0, + DirLen => $len, + }) or $et->Warn('Possibly corrupt Version resource'); + $$dirInfo{GotVersion} = 1; # set flag so we don't do this again + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process Windows PE file data dictionary +# Inputs: 0) ExifTool object ref, 1) dirInfo ref +# Returns: true on success +sub ProcessPEDict($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = length($$dataPt); + my ($pos, @sections, %dirInfo, $rsrcFound); + + # loop through all sections + for ($pos=0; $pos+40<=$dirLen; $pos+=40) { + my $name = substr($$dataPt, $pos, 8); + my $va = Get32u($dataPt, $pos + 12); + my $size = Get32u($dataPt, $pos + 16); + my $offset = Get32u($dataPt, $pos + 20); + # remember the section offsets for the VirtualAddress lookup later + push @sections, { Base => $offset, Size => $size, VirtualAddress => $va }; + # save details of the first resource section (or .text if .rsrc not found, ref forum11465) + next unless ($name eq ".rsrc\0\0\0" and not $rsrcFound and defined($rsrcFound = 1)) or + ($name eq ".text\0\0\0" and not %dirInfo); + %dirInfo = ( + RAF => $raf, + Base => $offset, + DirStart => 0, # (relative to Base) + DirLen => $size, + Sections => \@sections, + ); + } + # process the first resource section + ProcessPEResources($et, \%dirInfo) or return 0 if %dirInfo; + return 1; +} + +#------------------------------------------------------------------------------ +# Override file type if necessary for Mach object files and libraries +# Inputs: 0) ExifTool ref, 1) ObjectFileType number, 2) flag for fat binary +my %machOverride = ( + 1 => [ 'object file', 'O' ], + 6 => [ 'dynamic link library', 'DYLIB' ], + 8 => [ 'dynamic bound bundle', 'DYLIB' ], + 9 => [ 'dynamic link library stub', 'DYLIB' ], +); +sub MachOverride($$;$) +{ + my ($et, $objType, $fat) = @_; + my $override = $machOverride{$objType}; + if ($override) { + my $desc = 'Mach-O ' . ($fat ? 'fat ' : '') . $$override[0]; + $et->OverrideFileType($desc, undef, $$override[1]); + } +} + +#------------------------------------------------------------------------------ +# Extract tags from Mach header +# Inputs: 0) ExifTool ref, 1) data ref, 2) flag to extract object type +# Returns: true if Mach header was found +# Mach type based on magic number +# [bit depth, byte order starting with "Little" or "Big"] +my %machType = ( + "\xfe\xed\xfa\xce" => ['32 bit', 'Big endian'], + "\xce\xfa\xed\xfe" => ['32 bit', 'Little endian'], + "\xfe\xed\xfa\xcf" => ['64 bit', 'Big endian'], + "\xcf\xfa\xed\xfe" => ['64 bit', 'Little endian'], +); +sub ExtractMachTags($$;$) +{ + my ($et, $dataPt, $doObj) = @_; + # get information about mach header based on the magic number (first 4 bytes) + my $info = $machType{substr($$dataPt, 0, 4)}; + if ($info) { + # Mach header structure: + # 0 int32u magic + # 4 int32u cputype + # 8 int32u cpusubtype + # 12 int32u filetype + # 16 int32u ncmds + # 20 int32u sizeofcmds + # 24 int32u flags + my $tagTablePtr = GetTagTable('Image::ExifTool::EXE::MachO'); + SetByteOrder($$info[1]); + my $cpuType = Get32s($dataPt, 4); + my $subType = Get32s($dataPt, 8); + $et->HandleTag($tagTablePtr, 0, $$info[0]); + $et->HandleTag($tagTablePtr, 1, $$info[1]); + $et->HandleTag($tagTablePtr, 3, $cpuType); + $et->HandleTag($tagTablePtr, 4, "$cpuType $subType"); + if ($doObj) { + my $objType = Get32u($dataPt, 12); + my $flags = Get32u($dataPt, 24); + $et->HandleTag($tagTablePtr, 5, $objType); + $et->HandleTag($tagTablePtr, 6, $flags); + # override file type if this is an object file or library + MachOverride($et, $objType); + } else { # otherwise this was a static library + $et->OverrideFileType('Mach-O static library', undef, 'A'); + } + return 1; + } + return 0; +} + +#------------------------------------------------------------------------------ +# Extract information from an EXE file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid EXE file +sub ProcessEXE($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $buf2, $type, $mime, $ext, $tagTablePtr, %dirInfo); + + my $size = $raf->Read($buff, 0x40) or return 0; + my $fast3 = $$et{OPTIONS}{FastScan} && $$et{OPTIONS}{FastScan} == 3; +# +# DOS and Windows EXE +# + if ($buff =~ /^MZ/ and $size == 0x40) { + # DOS/Windows executable + # validate DOS header + # (ref http://www.delphidabbler.com/articles?article=8&part=2) + # 0 int16u magic - Magic number ("MZ") + # 2 int16u cblp - Bytes on last page of file + # 4 int16u cp - Pages in file + # 6 int16u crlc - Relocations + # 8 int16u cparhdr - Size of header in paragraphs + # 10 int16u minalloc - Minimum extra paragraphs needed + # 12 int16u maxalloc - Maximum extra paragraphs needed + # 14 int16u ss - Initial (relative) SS value + # 16 int16u sp - Initial SP value + # 18 int16u csum - Checksum + # 20 int16u ip - Initial IP value + # 22 int16u cs - Initial (relative) CS value + # 24 int16u lfarlc - Address of relocation table + # 26 int16u ovno - Overlay number + # 28 int16u[4] res - Reserved words + # 36 int16u oemid - OEM identifier (for oeminfo) + # 38 int16u oeminfo - OEM info; oemid specific + # 40 int16u[10] res2 - Reserved words + # 60 int32u; lfanew - File address of new exe header + SetByteOrder('II'); + my ($cblp, $cp, $lfarlc, $lfanew) = unpack('x2v2x18vx34V', $buff); + my $fileSize = ($cp - ($cblp ? 1 : 0)) * 512 + $cblp; + #(patch to accommodate observed 64-bit files) + #return 0 if $fileSize < 0x40 or $fileSize < $lfarlc; + #return 0 if $fileSize < 0x40; (changed to warning in ExifTool 12.08) + $et->Warn('Invalid file size in DOS header') if $fileSize < 0x40; + # read the Windows NE, PE or LE (virtual device driver) header + #if ($lfarlc == 0x40 and $fileSize > $lfanew + 2 and ... + if ($raf->Seek($lfanew, 0) and $raf->Read($buff, 0x40) and $buff =~ /^(NE|PE|LE)/) { + if ($1 eq 'NE') { + if ($size >= 0x40) { # NE header is 64 bytes (ref 2) + # check for DLL + my $appFlags = Get16u(\$buff, 0x0c); + $ext = $appFlags & 0x80 ? 'DLL' : 'EXE'; + $type = "Win16 $ext"; + # offset 0x02 is 2 bytes with linker version and revision numbers + # offset 0x36 is executable type (2 = Windows) + } + } elsif ($1 eq 'PE') { + # PE header comes at byte 4 in buff: + # 4 int16u Machine + # 6 int16u NumberOfSections + # 8 int32u TimeDateStamp + # 12 int32u PointerToSymbolTable + # 16 int32u NumberOfSymbols + # 20 int16u SizeOfOptionalHeader + # 22 int16u Characteristics + if ($size >= 24) { # PE header is 24 bytes (plus optional header) + my $mach = Get16u(\$buff, 4); # MachineType + my $flags = Get16u(\$buff, 22); # ImageFileCharacteristics + my $machine = $Image::ExifTool::EXE::Main{0}{PrintConv}{$mach} || ''; + my $winType = $machine =~ /64/ ? 'Win64' : 'Win32'; + $ext = $flags & 0x2000 ? 'DLL' : 'EXE'; + $et->SetFileType("$winType $ext", undef, $ext); + return 1 if $fast3; + # read the rest of the optional header if necessary + my $optSize = Get16u(\$buff, 20); + my $more = $optSize + 24 - $size; + if ($more > 0) { + if ($raf->Read($buf2, $more) == $more) { + $buff .= $buf2; + $size += $more; + my $magic = Get16u(\$buff, 24); + # verify PE magic number + unless ($magic == 0x107 or $magic == 0x10b or $magic == 0x20b) { + $et->Warn('Unknown PE magic number'); + return 1; + } + # --> 64-bit if $magic is 0x20b ???? + } else { + $et->Warn('Error reading optional header'); + } + } + # process PE COFF file header + $tagTablePtr = GetTagTable('Image::ExifTool::EXE::Main'); + %dirInfo = ( + DataPt => \$buff, + DataPos => $raf->Tell() - $size, + DataLen => $size, + DirStart => 4, + DirLen => $size - 4, + ); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + # process data dictionary + my $num = Get16u(\$buff, 6); # NumberOfSections + if ($raf->Read($buff, 40 * $num) == 40 * $num) { + %dirInfo = ( + RAF => $raf, + DataPt => \$buff, + ); + ProcessPEDict($et, \%dirInfo) or $et->Warn('Error processing PE data dictionary'); + } + return 1; + } + } else { + $type = 'Virtual Device Driver'; + $ext = '386'; + } + } else { + $type = 'DOS EXE'; + $ext = 'exe'; + } +# +# Mach-O (Mac OS X) +# + } elsif ($buff =~ /^(\xca\xfe\xba\xbe|\xfe\xed\xfa(\xce|\xcf)|(\xce|\xcf)\xfa\xed\xfe)/ and $size > 12) { + # Mach-O executable + # (ref http://developer.apple.com/documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html) + $tagTablePtr = GetTagTable('Image::ExifTool::EXE::MachO'); + if ($1 eq "\xca\xfe\xba\xbe") { + SetByteOrder('MM'); + $et->SetFileType('Mach-O fat binary executable', undef, ''); + return 1 if $fast3; + my $count = Get32u(\$buff, 4); # get architecture count + my $more = $count * 20 - ($size - 8); + if ($more > 0) { + unless ($raf->Read($buf2, $more) == $more) { + $et->Warn('Error reading fat-arch headers'); + return 1; + } + $buff .= $buf2; + $size += $more; + } + $et->HandleTag($tagTablePtr, 2, $count); + my $i; + for ($i=0; $i<$count; ++$i) { + my $cpuType = Get32s(\$buff, 8 + $i * 20); + my $subType = Get32s(\$buff, 12 + $i * 20); + $et->HandleTag($tagTablePtr, 3, $cpuType); + $et->HandleTag($tagTablePtr, 4, "$cpuType $subType"); + } + # load first Mach-O header to get the object file type + my $offset = Get32u(\$buff, 16); + if ($raf->Seek($offset, 0) and $raf->Read($buf2, 16) == 16) { + if ($buf2 =~ /^(\xfe\xed\xfa(\xce|\xcf)|(\xce|\xcf)\xfa\xed\xfe)/) { + SetByteOrder($buf2 =~ /^\xfe\xed/ ? 'MM' : 'II'); + my $objType = Get32u(\$buf2, 12); + $et->HandleTag($tagTablePtr, 5, $objType); + # override file type if this is a library or object file + MachOverride($et, $objType, 'fat'); + } elsif ($buf2 =~ /^!<arch>\x0a/) { + # .a libraries use this magic number + $et->HandleTag($tagTablePtr, 5, -1); + # override file type since this is a library + $et->OverrideFileType('Mach-O fat static library', undef, 'A'); + } else { + $et->Warn('Unrecognized object file type'); + } + } else { + $et->Warn('Error reading file'); + } + } elsif ($size >= 16) { + $et->SetFileType('Mach-O executable', undef, ''); + return 1 if $fast3; + ExtractMachTags($et, \$buff, 1); + } + return 1; +# +# PEF (classic MacOS) +# + } elsif ($buff =~ /^Joy!peff/ and $size > 12) { + # ref http://developer.apple.com/documentation/mac/pdf/MacOS_RT_Architectures.pdf + $et->SetFileType('Classic MacOS executable', undef, ''); + return 1 if $fast3; + SetByteOrder('MM'); + $tagTablePtr = GetTagTable('Image::ExifTool::EXE::PEF'); + %dirInfo = ( + DataPt => \$buff, + DataPos => 0, + DataLen => $size, + DirStart => 0, + DirLen => $size, + ); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + return 1; +# +# ELF (Unix) +# + } elsif ($buff =~ /^\x7fELF/ and $size >= 16) { + $et->SetFileType('ELF executable', undef, ''); + return 1 if $fast3; + SetByteOrder(Get8u(\$buff,5) == 1 ? 'II' : 'MM'); + $tagTablePtr = GetTagTable('Image::ExifTool::EXE::ELF'); + %dirInfo = ( + DataPt => \$buff, + DataPos => 0, + DataLen => $size, + DirLen => $size, + ); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + # override file type if this is a library or object file + my $override = { + 1 => [ 'ELF object file', 'O' ], + 3 => [ 'ELF shared library', 'SO' ], + }->{$$et{VALUE}{ObjectFileType} || 0}; + $et->OverrideFileType($$override[0], undef, $$override[1]) if $override; + return 1; +# +# .a libraries +# + } elsif ($buff =~ /^!<arch>\x0a/) { + $et->SetFileType('Static library', undef, 'A'); + return 1 if $fast3; + my $pos = 8; # current file position + my $max = 10; # maximum number of archive files to check + # read into list of ar structures (each 60 bytes long): + while ($max-- > 0) { + # seek to start of the ar structure and read it + $raf->Seek($pos, 0) and $raf->Read($buff, 60) == 60 or last; + substr($buff, 58, 2) eq "`\n" or $et->Warn('Invalid archive header'), last; + unless ($tagTablePtr) { + # extract some information from first file in archive + $tagTablePtr = GetTagTable('Image::ExifTool::EXE::AR'); + %dirInfo = ( + DataPt => \$buff, + DataPos => $pos, + ); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + my $name = substr($buff, 0, 16); + if ($name =~ m{^#1/(\d+) *$}) { # check for extended archive (BSD variant) + my $len = $1; + $len > 256 and $et->Warn('Invalid extended archive name length'), last; + # (we read the name here just to move the file pointer) + $raf->Read($name, $len) == $len or $et->Warn('Error reading archive name'), last; + } + my $arSize = substr($buff, 48, 10); + $arSize =~ s/^(\d+).*/$1/s or last; # make sure archive size is a number + $raf->Read($buff, 28) == 28 or last; # read (possible) Mach header + ExtractMachTags($et, \$buff) and last; # try to extract tags + $pos += 60 + $arSize; # step to next entry + ++$pos if $pos & 0x01; # padded to an even byte + } + return 1; +# +# various scripts (perl, sh, etc...) +# + } elsif ($buff =~ m{^#!\s*/\S*bin/(\w+)}) { + my $prog = $1; + $prog = $1 if $prog eq 'env' and $buff =~ /\b(perl|python|ruby|php)\b/; + $type = "$prog script"; + $mime = "text/x-$prog"; + $ext = { + perl => 'pl', + python => 'py', + ruby => 'rb', + php => 'php', + }->{$prog}; + # use '.sh' for extension of all shell scripts + $ext = $prog =~ /sh$/ ? 'sh' : '' unless defined $ext; + } + return 0 unless $type; + $et->SetFileType($type, $mime, $ext); + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::EXE - Read executable file meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from various types of Windows, MacOS and Unix executable and +library files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.openwatcom.org/ftp/devel/docs/pecoff.pdf> + +=item L<http://support.microsoft.com/kb/65122> + +=item L<http://www.opensource.apple.com> + +=item L<http://www.skyfree.org/linux/references/ELF_Format.pdf> + +=item L<http://msdn.microsoft.com/en-us/library/ms809762.aspx> + +=item L<http://code.google.com/p/pefile/> + +=item L<http://www.codeproject.com/KB/DLL/showver.aspx> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/EXE Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Exif.pm b/lib/Image/ExifTool/Exif.pm new file mode 100644 index 0000000..353a253 --- /dev/null +++ b/lib/Image/ExifTool/Exif.pm @@ -0,0 +1,6850 @@ +#------------------------------------------------------------------------------ +# File: Exif.pm +# +# Description: Read EXIF/TIFF meta information +# +# Revisions: 11/25/2003 - P. Harvey Created +# 02/06/2004 - P. Harvey Moved processing functions from ExifTool +# 03/19/2004 - P. Harvey Check PreviewImage for validity +# 11/11/2004 - P. Harvey Split off maker notes into MakerNotes.pm +# 12/13/2004 - P. Harvey Added AUTOLOAD to load write routines +# +# References: 0) http://www.exif.org/Exif2-2.PDF +# 1) http://partners.adobe.com/asn/developer/pdfs/tn/TIFF6.pdf +# 2) http://www.adobe.com/products/dng/pdfs/dng_spec_1_3_0_0.pdf +# 3) http://www.awaresystems.be/imaging/tiff/tifftags.html +# 4) http://www.remotesensing.org/libtiff/TIFFTechNote2.html +# 5) http://www.exif.org/dcf.PDF +# 6) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html +# 7) http://www.fine-view.com/jp/lab/doc/ps6ffspecsv2.pdf +# 8) http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html +# 9) http://hul.harvard.edu/jhove/tiff-tags.html +# 10) http://partners.adobe.com/public/developer/en/tiff/TIFFPM6.pdf +# 11) Robert Mucke private communication +# 12) http://www.broomscloset.com/closet/photo/exif/TAG2000-22_DIS12234-2.PDF +# 13) http://www.microsoft.com/whdc/xps/wmphoto.mspx +# 14) http://www.asmail.be/msg0054681802.html +# 15) http://crousseau.free.fr/imgfmt_raw.htm +# 16) http://www.cybercom.net/~dcoffin/dcraw/ +# 17) http://www.digitalpreservation.gov/formats/content/tiff_tags.shtml +# 18) http://www.asmail.be/msg0055568584.html +# 19) http://libpsd.graphest.com/files/Photoshop%20File%20Formats.pdf +# 20) http://tiki-lounge.com/~raf/tiff/fields.html +# 21) http://community.roxen.com/developers/idocs/rfc/rfc3949.html +# 22) http://tools.ietf.org/html/draft-ietf-fax-tiff-fx-extension1-01 +# 23) MetaMorph Stack (STK) Image File Format: +# --> ftp://ftp.meta.moleculardevices.com/support/stack/STK.doc +# 24) http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf (Exif 2.3) +# 25) Vesa Kivisto private communication (7D) +# 26) Jeremy Brown private communication +# 27) Gregg Lee private communication +# 28) http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/cinemadng/pdfs/CinemaDNG_Format_Specification_v1_1.pdf +# 29) http://www.libtiff.org +# 30) http://geotiff.maptools.org/spec/geotiffhome.html +# 31) https://android.googlesource.com/platform/external/dng_sdk/+/refs/heads/master/source/dng_tag_codes.h +# 32) Jeffry Friedl private communication +# IB) Iliah Borg private communication (LibRaw) +# JD) Jens Duttke private communication +#------------------------------------------------------------------------------ + +package Image::ExifTool::Exif; + +use strict; +use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat + %lightSource %flash %compression %photometricInterpretation %orientation + %subfileType %saveForValidate); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::MakerNotes; + +$VERSION = '4.40'; + +sub ProcessExif($$$); +sub WriteExif($$$); +sub CheckExif($$$); +sub RebuildMakerNotes($$$); +sub EncodeExifText($$); +sub ValidateIFD($;$); +sub ValidateImageData($$$;$); +sub ProcessTiffIFD($$$); +sub PrintParameter($$$); +sub GetOffList($$$$$); +sub PrintOpcode($$$); +sub PrintLensInfo($); +sub ConvertLensInfo($); + +# size limit for loading binary data block into memory +sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; } + +# byte sizes for the various EXIF format types below +@formatSize = (undef,1,1,2,4,8,1,1,2,4,8,4,8,4,2,8,8,8,8); + +@formatName = ( + undef, 'int8u', 'string', 'int16u', + 'int32u', 'rational64u','int8s', 'undef', + 'int16s', 'int32s', 'rational64s','float', + 'double', 'ifd', 'unicode', 'complex', + 'int64u', 'int64s', 'ifd64', # (new BigTIFF formats) +); + +# hash to look up EXIF format numbers by name +# (format types are all lower case) +%formatNumber = ( + 'int8u' => 1, # BYTE + 'string' => 2, # ASCII + 'int16u' => 3, # SHORT + 'int32u' => 4, # LONG + 'rational64u' => 5, # RATIONAL + 'int8s' => 6, # SBYTE + 'undef' => 7, # UNDEFINED + 'binary' => 7, # (same as undef) + 'int16s' => 8, # SSHORT + 'int32s' => 9, # SLONG + 'rational64s' => 10, # SRATIONAL + 'float' => 11, # FLOAT + 'double' => 12, # DOUBLE + 'ifd' => 13, # IFD (with int32u format) + 'unicode' => 14, # UNICODE [see Note below] + 'complex' => 15, # COMPLEX [see Note below] + 'int64u' => 16, # LONG8 [BigTIFF] + 'int64s' => 17, # SLONG8 [BigTIFF] + 'ifd64' => 18, # IFD8 (with int64u format) [BigTIFF] + # Note: unicode and complex types are not yet properly supported by ExifTool. + # These are types which have been observed in the Adobe DNG SDK code, but + # aren't fully supported there either. We know the sizes, but that's about it. + # We don't know if the unicode is null terminated, or the format for complex + # (although I suspect it would be two 4-byte floats, real and imaginary). +); + +# lookup for integer format strings +%intFormat = ( + 'int8u' => 1, + 'int16u' => 3, + 'int32u' => 4, + 'int8s' => 6, + 'int16s' => 8, + 'int32s' => 9, + 'ifd' => 13, + 'int64u' => 16, + 'int64s' => 17, + 'ifd64' => 18, +); + +# EXIF LightSource PrintConv values +%lightSource = ( + 0 => 'Unknown', + 1 => 'Daylight', + 2 => 'Fluorescent', + 3 => 'Tungsten (Incandescent)', + 4 => 'Flash', + 9 => 'Fine Weather', + 10 => 'Cloudy', + 11 => 'Shade', + 12 => 'Daylight Fluorescent', # (D 5700 - 7100K) + 13 => 'Day White Fluorescent', # (N 4600 - 5500K) + 14 => 'Cool White Fluorescent', # (W 3800 - 4500K) + 15 => 'White Fluorescent', # (WW 3250 - 3800K) + 16 => 'Warm White Fluorescent', # (L 2600 - 3250K) + 17 => 'Standard Light A', + 18 => 'Standard Light B', + 19 => 'Standard Light C', + 20 => 'D55', + 21 => 'D65', + 22 => 'D75', + 23 => 'D50', + 24 => 'ISO Studio Tungsten', + 255 => 'Other', +); + +# EXIF Flash values +%flash = ( + OTHER => sub { + # translate "Off" and "On" when writing + my ($val, $inv) = @_; + return undef unless $inv and $val =~ /^(off|on)$/i; + return lc $val eq 'off' ? 0x00 : 0x01; + }, + 0x00 => 'No Flash', + 0x01 => 'Fired', + 0x05 => 'Fired, Return not detected', + 0x07 => 'Fired, Return detected', + 0x08 => 'On, Did not fire', # not charged up? + 0x09 => 'On, Fired', + 0x0d => 'On, Return not detected', + 0x0f => 'On, Return detected', + 0x10 => 'Off, Did not fire', + 0x14 => 'Off, Did not fire, Return not detected', + 0x18 => 'Auto, Did not fire', + 0x19 => 'Auto, Fired', + 0x1d => 'Auto, Fired, Return not detected', + 0x1f => 'Auto, Fired, Return detected', + 0x20 => 'No flash function', + 0x30 => 'Off, No flash function', + 0x41 => 'Fired, Red-eye reduction', + 0x45 => 'Fired, Red-eye reduction, Return not detected', + 0x47 => 'Fired, Red-eye reduction, Return detected', + 0x49 => 'On, Red-eye reduction', + 0x4d => 'On, Red-eye reduction, Return not detected', + 0x4f => 'On, Red-eye reduction, Return detected', + 0x50 => 'Off, Red-eye reduction', + 0x58 => 'Auto, Did not fire, Red-eye reduction', + 0x59 => 'Auto, Fired, Red-eye reduction', + 0x5d => 'Auto, Fired, Red-eye reduction, Return not detected', + 0x5f => 'Auto, Fired, Red-eye reduction, Return detected', +); + +# TIFF Compression values +# (values with format "Xxxxx XXX Compressed" are used to identify RAW file types) +%compression = ( + 1 => 'Uncompressed', + 2 => 'CCITT 1D', + 3 => 'T4/Group 3 Fax', + 4 => 'T6/Group 4 Fax', + 5 => 'LZW', + 6 => 'JPEG (old-style)', #3 + 7 => 'JPEG', #4 + 8 => 'Adobe Deflate', #3 + 9 => 'JBIG B&W', #3 + 10 => 'JBIG Color', #3 + 99 => 'JPEG', #16 + 262 => 'Kodak 262', #16 + 32766 => 'Next', #3 + 32767 => 'Sony ARW Compressed', #16 + 32769 => 'Packed RAW', #PH (used by Epson, Nikon, Samsung) + 32770 => 'Samsung SRW Compressed', #PH + 32771 => 'CCIRLEW', #3 + 32772 => 'Samsung SRW Compressed 2', #PH (NX3000,NXmini) + 32773 => 'PackBits', + 32809 => 'Thunderscan', #3 + 32867 => 'Kodak KDC Compressed', #PH + 32895 => 'IT8CTPAD', #3 + 32896 => 'IT8LW', #3 + 32897 => 'IT8MP', #3 + 32898 => 'IT8BL', #3 + 32908 => 'PixarFilm', #3 + 32909 => 'PixarLog', #3 + # 32910,32911 - Pixar reserved + 32946 => 'Deflate', #3 + 32947 => 'DCS', #3 + 33003 => 'Aperio JPEG 2000 YCbCr', #https://openslide.org/formats/aperio/ + 33005 => 'Aperio JPEG 2000 RGB', #https://openslide.org/formats/aperio/ + 34661 => 'JBIG', #3 + 34676 => 'SGILog', #3 + 34677 => 'SGILog24', #3 + 34712 => 'JPEG 2000', #3 + 34713 => 'Nikon NEF Compressed', #PH + 34715 => 'JBIG2 TIFF FX', #20 + 34718 => 'Microsoft Document Imaging (MDI) Binary Level Codec', #18 + 34719 => 'Microsoft Document Imaging (MDI) Progressive Transform Codec', #18 + 34720 => 'Microsoft Document Imaging (MDI) Vector', #18 + 34887 => 'ESRI Lerc', #LibTiff + # 34888,34889 - ESRI reserved + 34892 => 'Lossy JPEG', # (DNG 1.4) + 34925 => 'LZMA2', #LibTiff + 34926 => 'Zstd', #LibTiff + 34927 => 'WebP', #LibTiff + 34933 => 'PNG', # (TIFF mail list) + 34934 => 'JPEG XR', # (TIFF mail list) + 65000 => 'Kodak DCR Compressed', #PH + 65535 => 'Pentax PEF Compressed', #Jens +); + +%photometricInterpretation = ( + 0 => 'WhiteIsZero', + 1 => 'BlackIsZero', + 2 => 'RGB', + 3 => 'RGB Palette', + 4 => 'Transparency Mask', + 5 => 'CMYK', + 6 => 'YCbCr', + 8 => 'CIELab', + 9 => 'ICCLab', #3 + 10 => 'ITULab', #3 + 32803 => 'Color Filter Array', #2 + 32844 => 'Pixar LogL', #3 + 32845 => 'Pixar LogLuv', #3 + 32892 => 'Sequential Color Filter', #JR (Sony ARQ) + 34892 => 'Linear Raw', #2 + 51177 => 'Depth Map', # (DNG 1.5) + 52527 => 'Semantic Mask', # (DNG 1.6) +); + +%orientation = ( + 1 => 'Horizontal (normal)', + 2 => 'Mirror horizontal', + 3 => 'Rotate 180', + 4 => 'Mirror vertical', + 5 => 'Mirror horizontal and rotate 270 CW', + 6 => 'Rotate 90 CW', + 7 => 'Mirror horizontal and rotate 90 CW', + 8 => 'Rotate 270 CW', +); + +%subfileType = ( + 0 => 'Full-resolution image', + 1 => 'Reduced-resolution image', + 2 => 'Single page of multi-page image', + 3 => 'Single page of multi-page reduced-resolution image', + 4 => 'Transparency mask', + 5 => 'Transparency mask of reduced-resolution image', + 6 => 'Transparency mask of multi-page image', + 7 => 'Transparency mask of reduced-resolution multi-page image', + 8 => 'Depth map', # (DNG 1.5) + 9 => 'Depth map of reduced-resolution image', # (DNG 1.5) + 16 => 'Enhanced image data', # (DNG 1.5) + 0x10001 => 'Alternate reduced-resolution image', # (DNG 1.2) + 0x10004 => 'Semantic Mask', # (DNG 1.6) + 0xffffffff => 'invalid', #(found in E5700 NEF's) + BITMASK => { + 0 => 'Reduced resolution', + 1 => 'Single page', + 2 => 'Transparency mask', + 3 => 'TIFF/IT final page', #20 (repurposed as DepthMap repurposes by DNG 1.5) + 4 => 'TIFF-FX mixed raster content', #20 (repurposed as EnhancedImageData by DNG 1.5) + }, +); + +# PrintConv for parameter tags +%Image::ExifTool::Exif::printParameter = ( + PrintConv => { + 0 => 'Normal', + OTHER => \&Image::ExifTool::Exif::PrintParameter, + }, +); + +# convert DNG UTF-8 string values (may be string or int8u format) +my %utf8StringConv = ( + Writable => 'string', + Format => 'string', + ValueConv => '$self->Decode($val, "UTF8")', + ValueConvInv => '$self->Encode($val,"UTF8")', +); + +# ValueConv that makes long values binary type +my %longBin = ( + ValueConv => 'length($val) > 64 ? \$val : $val', + ValueConvInv => '$val', + LongBinary => 1, # flag to avoid decoding values of a large array +); + +# PrintConv for SampleFormat (0x153) +my %sampleFormat = ( + 1 => 'Unsigned', # unsigned integer + 2 => 'Signed', # two's complement signed integer + 3 => 'Float', # IEEE floating point + 4 => 'Undefined', + 5 => 'Complex int', # complex integer (ref 3) + 6 => 'Complex float', # complex IEEE floating point (ref 3) +); + +# save the values of these tags for additional validation checks +%saveForValidate = ( + 0x100 => 1, # ImageWidth + 0x101 => 1, # ImageHeight + 0x102 => 1, # BitsPerSample + 0x103 => 1, # Compression + 0x115 => 1, # SamplesPerPixel +); + +# conversions for DNG OpcodeList tags +my %opcodeInfo = ( + Writable => 'undef', + WriteGroup => 'SubIFD', + Protected => 1, + Binary => 1, + ConvertBinary => 1, # needed because the ValueConv value is binary + PrintConvColumns => 2, + PrintConv => { + OTHER => \&PrintOpcode, + 1 => 'WarpRectilinear', + 2 => 'WarpFisheye', + 3 => 'FixVignetteRadial', + 4 => 'FixBadPixelsConstant', + 5 => 'FixBadPixelsList', + 6 => 'TrimBounds', + 7 => 'MapTable', + 8 => 'MapPolynomial', + 9 => 'GainMap', + 10 => 'DeltaPerRow', + 11 => 'DeltaPerColumn', + 12 => 'ScalePerRow', + 13 => 'ScalePerColumn', + 14 => 'WarpRectilinear2', # (DNG 1.6) + }, + PrintConvInv => undef, # (so the inverse conversion is not performed) +); + +# main EXIF tag table +%Image::ExifTool::Exif::Main = ( + GROUPS => { 0 => 'EXIF', 1 => 'IFD0', 2 => 'Image'}, + WRITE_PROC => \&WriteExif, + CHECK_PROC => \&CheckExif, + WRITE_GROUP => 'ExifIFD', # default write group + SET_GROUP1 => 1, # set group1 name to directory name for all tags in table + 0x1 => { + Name => 'InteropIndex', + Description => 'Interoperability Index', + Protected => 1, + Writable => 'string', + WriteGroup => 'InteropIFD', + PrintConv => { + R98 => 'R98 - DCF basic file (sRGB)', + R03 => 'R03 - DCF option file (Adobe RGB)', + THM => 'THM - DCF thumbnail file', + }, + }, + 0x2 => { #5 + Name => 'InteropVersion', + Description => 'Interoperability Version', + Protected => 1, + Writable => 'undef', + Mandatory => 1, + WriteGroup => 'InteropIFD', + RawConv => '$val=~s/\0+$//; $val', # (some idiots add null terminators) + }, + 0x0b => { #PH + Name => 'ProcessingSoftware', + Writable => 'string', + WriteGroup => 'IFD0', + Notes => 'used by ACD Systems Digital Imaging', + }, + 0xfe => { + Name => 'SubfileType', + Notes => 'called NewSubfileType by the TIFF specification', + Protected => 1, + Writable => 'int32u', + WriteGroup => 'IFD0', + # set priority directory if this is the full resolution image + DataMember => 'SubfileType', + RawConv => q{ + if ($val == ($val & 0x02)) { + $self->SetPriorityDir() if $val == 0; + $$self{PageCount} = ($$self{PageCount} || 0) + 1; + $$self{MultiPage} = 1 if $val == 2 or $$self{PageCount} > 1; + } + $$self{SubfileType} = $val; + }, + PrintConv => \%subfileType, + }, + 0xff => { + Name => 'OldSubfileType', + Notes => 'called SubfileType by the TIFF specification', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + # set priority directory if this is the full resolution image + RawConv => q{ + if ($val == 1 or $val == 3) { + $self->SetPriorityDir() if $val == 1; + $$self{PageCount} = ($$self{PageCount} || 0) + 1; + $$self{MultiPage} = 1 if $val == 3 or $$self{PageCount} > 1; + } + $val; + }, + PrintConv => { + 1 => 'Full-resolution image', + 2 => 'Reduced-resolution image', + 3 => 'Single page of multi-page image', + }, + }, + 0x100 => { + Name => 'ImageWidth', + # even though Group 1 is set dynamically we need to register IFD1 once + # so it will show up in the group lists + Groups => { 1 => 'IFD1' }, + Protected => 1, + Writable => 'int32u', + WriteGroup => 'IFD0', + # Note: priority 0 tags automatically have their priority increased for the + # priority directory (the directory with a SubfileType of "Full-resolution image") + Priority => 0, + }, + 0x101 => { + Name => 'ImageHeight', + Notes => 'called ImageLength by the EXIF spec.', + Protected => 1, + Writable => 'int32u', + WriteGroup => 'IFD0', + Priority => 0, + }, + 0x102 => { + Name => 'BitsPerSample', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + Count => -1, # can be 1 or 3: -1 means 'variable' + Priority => 0, + }, + 0x103 => { + Name => 'Compression', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + Mandatory => 1, + DataMember => 'Compression', + SeparateTable => 'Compression', + RawConv => q{ + Image::ExifTool::Exif::IdentifyRawFile($self, $val); + return $$self{Compression} = $val; + }, + PrintConv => \%compression, + Priority => 0, + }, + 0x106 => { + Name => 'PhotometricInterpretation', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + PrintConv => \%photometricInterpretation, + Priority => 0, + }, + 0x107 => { + Name => 'Thresholding', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + PrintConv => { + 1 => 'No dithering or halftoning', + 2 => 'Ordered dither or halftone', + 3 => 'Randomized dither', + }, + }, + 0x108 => { + Name => 'CellWidth', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + }, + 0x109 => { + Name => 'CellLength', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + }, + 0x10a => { + Name => 'FillOrder', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + PrintConv => { + 1 => 'Normal', + 2 => 'Reversed', + }, + }, + 0x10d => { + Name => 'DocumentName', + Writable => 'string', + WriteGroup => 'IFD0', + }, + 0x10e => { + Name => 'ImageDescription', + Writable => 'string', + WriteGroup => 'IFD0', + Priority => 0, + }, + 0x10f => { + Name => 'Make', + Groups => { 2 => 'Camera' }, + Writable => 'string', + WriteGroup => 'IFD0', + DataMember => 'Make', + # remove trailing blanks and save as an ExifTool member variable + RawConv => '$val =~ s/\s+$//; $$self{Make} = $val', + # NOTE: trailing "blanks" (spaces) are removed from all EXIF tags which + # may be "unknown" (filled with spaces) according to the EXIF spec. + # This allows conditional replacement with "exiftool -TAG-= -TAG=VALUE". + # - also removed are any other trailing whitespace characters + }, + 0x110 => { + Name => 'Model', + Description => 'Camera Model Name', + Groups => { 2 => 'Camera' }, + Writable => 'string', + WriteGroup => 'IFD0', + DataMember => 'Model', + # remove trailing blanks and save as an ExifTool member variable + RawConv => '$val =~ s/\s+$//; $$self{Model} = $val', + }, + 0x111 => [ + { + Condition => q[ + $$self{TIFF_TYPE} eq 'MRW' and $$self{DIR_NAME} eq 'IFD0' and + $$self{Model} =~ /^DiMAGE A200/ + ], + Name => 'StripOffsets', + IsOffset => 1, + OffsetPair => 0x117, # point to associated byte counts + # A200 stores this information in the wrong byte order!! + ValueConv => '$val=join(" ",unpack("N*",pack("V*",split(" ",$val))));\$val', + ByteOrder => 'LittleEndian', + }, + { + # (APP1 IFD2 is for Leica JPEG preview) + Condition => q[ + not ($$self{TIFF_TYPE} eq 'CR2' and $$self{DIR_NAME} eq 'IFD0') and + not ($$self{TIFF_TYPE} =~ /^(DNG|TIFF)$/ and $$self{Compression} eq '7' and $$self{SubfileType} ne '0') and + not ($$self{TIFF_TYPE} eq 'APP1' and $$self{DIR_NAME} eq 'IFD2') + ], + Name => 'StripOffsets', + IsOffset => 1, + OffsetPair => 0x117, # point to associated byte counts + ValueConv => 'length($val) > 32 ? \$val : $val', + }, + { + # PreviewImageStart in IFD0 of CR2 images + Condition => '$$self{TIFF_TYPE} eq "CR2"', + Name => 'PreviewImageStart', + IsOffset => 1, + OffsetPair => 0x117, + Notes => q{ + called StripOffsets in most locations, but it is PreviewImageStart in IFD0 + of CR2 images and various IFD's of DNG images except for SubIFD2 where it is + JpgFromRawStart + }, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'IFD0', + Protected => 2, + Permanent => 1, + }, + { + # PreviewImageStart in various IFD's of DNG images except SubIFD2 + Condition => '$$self{DIR_NAME} ne "SubIFD2"', + Name => 'PreviewImageStart', + IsOffset => 1, + OffsetPair => 0x117, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'All', # (writes to specific group of associated Composite tag) + Protected => 2, + Permanent => 1, + }, + { + # JpgFromRawStart in various IFD's of DNG images except SubIFD2 + Name => 'JpgFromRawStart', + IsOffset => 1, + OffsetPair => 0x117, + DataTag => 'JpgFromRaw', + Writable => 'int32u', + WriteGroup => 'SubIFD2', + Protected => 2, + Permanent => 1, + }, + ], + 0x112 => { + Name => 'Orientation', + Writable => 'int16u', + WriteGroup => 'IFD0', + PrintConv => \%orientation, + Priority => 0, # so PRIORITY_DIR takes precedence + }, + 0x115 => { + Name => 'SamplesPerPixel', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + Priority => 0, + }, + 0x116 => { + Name => 'RowsPerStrip', + Protected => 1, + Writable => 'int32u', + WriteGroup => 'IFD0', + Priority => 0, + }, + 0x117 => [ + { + Condition => q[ + $$self{TIFF_TYPE} eq 'MRW' and $$self{DIR_NAME} eq 'IFD0' and + $$self{Model} =~ /^DiMAGE A200/ + ], + Name => 'StripByteCounts', + OffsetPair => 0x111, # point to associated offset + # A200 stores this information in the wrong byte order!! + ValueConv => '$val=join(" ",unpack("N*",pack("V*",split(" ",$val))));\$val', + ByteOrder => 'LittleEndian', + }, + { + # (APP1 IFD2 is for Leica JPEG preview) + Condition => q[ + not ($$self{TIFF_TYPE} eq 'CR2' and $$self{DIR_NAME} eq 'IFD0') and + not ($$self{TIFF_TYPE} =~ /^(DNG|TIFF)$/ and $$self{Compression} eq '7' and $$self{SubfileType} ne '0') and + not ($$self{TIFF_TYPE} eq 'APP1' and $$self{DIR_NAME} eq 'IFD2') + ], + Name => 'StripByteCounts', + OffsetPair => 0x111, # point to associated offset + ValueConv => 'length($val) > 32 ? \$val : $val', + }, + { + # PreviewImageLength in IFD0 of CR2 images + Condition => '$$self{TIFF_TYPE} eq "CR2"', + Name => 'PreviewImageLength', + OffsetPair => 0x111, + Notes => q{ + called StripByteCounts in most locations, but it is PreviewImageLength in + IFD0 of CR2 images and various IFD's of DNG images except for SubIFD2 where + it is JpgFromRawLength + }, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'IFD0', + Protected => 2, + Permanent => 1, + }, + { + # PreviewImageLength in various IFD's of DNG images except SubIFD2 + Condition => '$$self{DIR_NAME} ne "SubIFD2"', + Name => 'PreviewImageLength', + OffsetPair => 0x111, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'All', # (writes to specific group of associated Composite tag) + Protected => 2, + Permanent => 1, + }, + { + # JpgFromRawLength in SubIFD2 of DNG images + Name => 'JpgFromRawLength', + OffsetPair => 0x111, + DataTag => 'JpgFromRaw', + Writable => 'int32u', + WriteGroup => 'SubIFD2', + Protected => 2, + Permanent => 1, + }, + ], + 0x118 => { + Name => 'MinSampleValue', + Writable => 'int16u', + WriteGroup => 'IFD0', + }, + 0x119 => { + Name => 'MaxSampleValue', + Writable => 'int16u', + WriteGroup => 'IFD0', + }, + 0x11a => { + Name => 'XResolution', + Writable => 'rational64u', + WriteGroup => 'IFD0', + Mandatory => 1, + Priority => 0, # so PRIORITY_DIR takes precedence + }, + 0x11b => { + Name => 'YResolution', + Writable => 'rational64u', + WriteGroup => 'IFD0', + Mandatory => 1, + Priority => 0, + }, + 0x11c => { + Name => 'PlanarConfiguration', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + PrintConv => { + 1 => 'Chunky', + 2 => 'Planar', + }, + Priority => 0, + }, + 0x11d => { + Name => 'PageName', + Writable => 'string', + WriteGroup => 'IFD0', + }, + 0x11e => { + Name => 'XPosition', + Writable => 'rational64u', + WriteGroup => 'IFD0', + }, + 0x11f => { + Name => 'YPosition', + Writable => 'rational64u', + WriteGroup => 'IFD0', + }, + # FreeOffsets/FreeByteCounts are used by Ricoh for RMETA information + # in TIFF images (not yet supported) + 0x120 => { + Name => 'FreeOffsets', + IsOffset => 1, + OffsetPair => 0x121, + ValueConv => 'length($val) > 32 ? \$val : $val', + }, + 0x121 => { + Name => 'FreeByteCounts', + OffsetPair => 0x120, + ValueConv => 'length($val) > 32 ? \$val : $val', + }, + 0x122 => { + Name => 'GrayResponseUnit', + Writable => 'int16u', + WriteGroup => 'IFD0', + PrintConv => { #3 + 1 => 0.1, + 2 => 0.001, + 3 => 0.0001, + 4 => 0.00001, + 5 => 0.000001, + }, + }, + 0x123 => { + Name => 'GrayResponseCurve', + Binary => 1, + }, + 0x124 => { + Name => 'T4Options', + PrintConv => { BITMASK => { + 0 => '2-Dimensional encoding', + 1 => 'Uncompressed', + 2 => 'Fill bits added', + } }, #3 + }, + 0x125 => { + Name => 'T6Options', + PrintConv => { BITMASK => { + 1 => 'Uncompressed', + } }, #3 + }, + 0x128 => { + Name => 'ResolutionUnit', + Notes => 'the value 1 is not standard EXIF', + Writable => 'int16u', + WriteGroup => 'IFD0', + Mandatory => 1, + PrintConv => { + 1 => 'None', + 2 => 'inches', + 3 => 'cm', + }, + Priority => 0, + }, + 0x129 => { + Name => 'PageNumber', + Writable => 'int16u', + WriteGroup => 'IFD0', + Count => 2, + }, + 0x12c => 'ColorResponseUnit', #9 + 0x12d => { + Name => 'TransferFunction', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + Count => 768, + Binary => 1, + }, + 0x131 => { + Name => 'Software', + Writable => 'string', + WriteGroup => 'IFD0', + DataMember => 'Software', + RawConv => '$val =~ s/\s+$//; $$self{Software} = $val', # trim trailing blanks + }, + 0x132 => { + Name => 'ModifyDate', + Groups => { 2 => 'Time' }, + Notes => 'called DateTime by the EXIF spec.', + Writable => 'string', + Shift => 'Time', + WriteGroup => 'IFD0', + Validate => 'ValidateExifDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,0)', + }, + 0x13b => { + Name => 'Artist', + Groups => { 2 => 'Author' }, + Notes => 'becomes a list-type tag when the MWG module is loaded', + Writable => 'string', + WriteGroup => 'IFD0', + RawConv => '$val =~ s/\s+$//; $val', # trim trailing blanks + }, + 0x13c => { + Name => 'HostComputer', + Writable => 'string', + WriteGroup => 'IFD0', + }, + 0x13d => { + Name => 'Predictor', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + PrintConv => { + 1 => 'None', + 2 => 'Horizontal differencing', + 3 => 'Floating point', # (DNG 1.5) + 34892 => 'Horizontal difference X2', # (DNG 1.5) + 34893 => 'Horizontal difference X4', # (DNG 1.5) + 34894 => 'Floating point X2', # (DNG 1.5) + 34895 => 'Floating point X4', # (DNG 1.5) + }, + }, + 0x13e => { + Name => 'WhitePoint', + Groups => { 2 => 'Camera' }, + Writable => 'rational64u', + WriteGroup => 'IFD0', + Count => 2, + }, + 0x13f => { + Name => 'PrimaryChromaticities', + Writable => 'rational64u', + WriteGroup => 'IFD0', + Count => 6, + Priority => 0, + }, + 0x140 => { + Name => 'ColorMap', + Format => 'binary', + Binary => 1, + }, + 0x141 => { + Name => 'HalftoneHints', + Writable => 'int16u', + WriteGroup => 'IFD0', + Count => 2, + }, + 0x142 => { + Name => 'TileWidth', + Protected => 1, + Writable => 'int32u', + WriteGroup => 'IFD0', + }, + 0x143 => { + Name => 'TileLength', + Protected => 1, + Writable => 'int32u', + WriteGroup => 'IFD0', + }, + 0x144 => { + Name => 'TileOffsets', + IsOffset => 1, + OffsetPair => 0x145, + ValueConv => 'length($val) > 32 ? \$val : $val', + }, + 0x145 => { + Name => 'TileByteCounts', + OffsetPair => 0x144, + ValueConv => 'length($val) > 32 ? \$val : $val', + }, + 0x146 => 'BadFaxLines', #3 + 0x147 => { #3 + Name => 'CleanFaxData', + PrintConv => { + 0 => 'Clean', + 1 => 'Regenerated', + 2 => 'Unclean', + }, + }, + 0x148 => 'ConsecutiveBadFaxLines', #3 + 0x14a => [ + { + Name => 'SubIFD', + # use this opportunity to identify an ARW image, and if so we + # must decide if this is a SubIFD or the A100 raw data + # (use SubfileType, Compression and FILE_TYPE to identify ARW/SR2, + # then call SetARW to finish the job) + Condition => q{ + $$self{DIR_NAME} ne 'IFD0' or $$self{FILE_TYPE} ne 'TIFF' or + $$self{Make} !~ /^SONY/ or + not $$self{SubfileType} or $$self{SubfileType} != 1 or + not $$self{Compression} or $$self{Compression} != 6 or + not require Image::ExifTool::Sony or + Image::ExifTool::Sony::SetARW($self, $valPt) + }, + Groups => { 1 => 'SubIFD' }, + Flags => 'SubIFD', + SubDirectory => { + Start => '$val', + MaxSubdirs => 10, # (have seen 5 in a DNG 1.4 image) + }, + }, + { #16 + Name => 'A100DataOffset', + Notes => 'the data offset in original Sony DSLR-A100 ARW images', + DataMember => 'A100DataOffset', + RawConv => '$$self{A100DataOffset} = $val', + WriteGroup => 'IFD0', # (only for Validate) + IsOffset => 1, + Protected => 2, + }, + ], + 0x14c => { + Name => 'InkSet', + Writable => 'int16u', + WriteGroup => 'IFD0', + PrintConv => { #3 + 1 => 'CMYK', + 2 => 'Not CMYK', + }, + }, + 0x14d => 'InkNames', #3 + 0x14e => 'NumberofInks', #3 + 0x150 => 'DotRange', + 0x151 => { + Name => 'TargetPrinter', + Writable => 'string', + WriteGroup => 'IFD0', + }, + 0x152 => { + Name => 'ExtraSamples', + PrintConv => { #20 + 0 => 'Unspecified', + 1 => 'Associated Alpha', + 2 => 'Unassociated Alpha', + }, + }, + 0x153 => { + Name => 'SampleFormat', + Notes => 'SamplesPerPixel values', + WriteGroup => 'SubIFD', # (only for Validate) + PrintConvColumns => 2, + PrintConv => [ \%sampleFormat, \%sampleFormat, \%sampleFormat, \%sampleFormat ], + }, + 0x154 => 'SMinSampleValue', + 0x155 => 'SMaxSampleValue', + 0x156 => 'TransferRange', + 0x157 => 'ClipPath', #3 + 0x158 => 'XClipPathUnits', #3 + 0x159 => 'YClipPathUnits', #3 + 0x15a => { #3 + Name => 'Indexed', + PrintConv => { 0 => 'Not indexed', 1 => 'Indexed' }, + }, + 0x15b => { + Name => 'JPEGTables', + Binary => 1, + }, + 0x15f => { #10 + Name => 'OPIProxy', + PrintConv => { + 0 => 'Higher resolution image does not exist', + 1 => 'Higher resolution image exists', + }, + }, + # 0x181 => 'Decode', #20 (typo! - should be 0x1b1, ref 21) + # 0x182 => 'DefaultImageColor', #20 (typo! - should be 0x1b2, ref 21) + 0x190 => { #3 + Name => 'GlobalParametersIFD', + Groups => { 1 => 'GlobParamIFD' }, + Flags => 'SubIFD', + SubDirectory => { + DirName => 'GlobParamIFD', + Start => '$val', + MaxSubdirs => 1, + }, + }, + 0x191 => { #3 + Name => 'ProfileType', + PrintConv => { 0 => 'Unspecified', 1 => 'Group 3 FAX' }, + }, + 0x192 => { #3 + Name => 'FaxProfile', + PrintConv => { + 0 => 'Unknown', + 1 => 'Minimal B&W lossless, S', + 2 => 'Extended B&W lossless, F', + 3 => 'Lossless JBIG B&W, J', + 4 => 'Lossy color and grayscale, C', + 5 => 'Lossless color and grayscale, L', + 6 => 'Mixed raster content, M', + 7 => 'Profile T', #20 + 255 => 'Multi Profiles', #20 + }, + }, + 0x193 => { #3 + Name => 'CodingMethods', + PrintConv => { BITMASK => { + 0 => 'Unspecified compression', + 1 => 'Modified Huffman', + 2 => 'Modified Read', + 3 => 'Modified MR', + 4 => 'JBIG', + 5 => 'Baseline JPEG', + 6 => 'JBIG color', + } }, + }, + 0x194 => 'VersionYear', #3 + 0x195 => 'ModeNumber', #3 + 0x1b1 => 'Decode', #3 + 0x1b2 => 'DefaultImageColor', #3 (changed to ImageBaseColor, ref 21) + 0x1b3 => 'T82Options', #20 + 0x1b5 => { #19 + Name => 'JPEGTables', + Binary => 1, + }, + 0x200 => { + Name => 'JPEGProc', + PrintConv => { + 1 => 'Baseline', + 14 => 'Lossless', + }, + }, + 0x201 => [ + { + Name => 'ThumbnailOffset', + Notes => q{ + ThumbnailOffset in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW + images and AVI and MOV videos, and the SubIFD in IFD1 of SRW images; + PreviewImageStart in MakerNotes and IFD0 of ARW and SR2 images; + JpgFromRawStart in SubIFD of NEF images and IFD2 of PEF images; and + OtherImageStart in everything else + }, + # thumbnail is found in IFD1 of JPEG and TIFF images, and + # IFD0 of EXIF information in FujiFilm AVI (RIFF) and MOV videos + Condition => q{ + # recognize NRW file from a JPEG-compressed thumbnail in IFD0 + if ($$self{TIFF_TYPE} eq 'NEF' and $$self{DIR_NAME} eq 'IFD0' and $$self{Compression} == 6) { + $self->OverrideFileType($$self{TIFF_TYPE} = 'NRW'); + } + $$self{DIR_NAME} eq 'IFD1' or + ($$self{DIR_NAME} eq 'IFD0' and $$self{FILE_TYPE} =~ /^(RIFF|MOV)$/) + }, + IsOffset => 1, + OffsetPair => 0x202, + DataTag => 'ThumbnailImage', + Writable => 'int32u', + WriteGroup => 'IFD1', + # according to the EXIF spec. a JPEG-compressed thumbnail image may not + # be stored in a TIFF file, but these TIFF-based RAW image formats + # use IFD1 for a JPEG-compressed thumbnail: CR2, ARW, SR2 and PEF. + # (SRF also stores a JPEG image in IFD1, but it is actually a preview + # and we don't yet write SRF anyway) + WriteCondition => q{ + $$self{FILE_TYPE} ne "TIFF" or + $$self{TIFF_TYPE} =~ /^(CR2|ARW|SR2|PEF)$/ + }, + Protected => 2, + }, + { + Name => 'ThumbnailOffset', + # thumbnail in IFD0 of MRW images (Minolta A200) + # and IFD0 of NRW images (Nikon Coolpix P6000,P7000,P7100) + Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(MRW|NRW)$/', + IsOffset => 1, + OffsetPair => 0x202, + # A200 uses the wrong base offset for this pointer!! + WrongBase => '$$self{Model} =~ /^DiMAGE A200/ ? $$self{MRW_WrongBase} : undef', + DataTag => 'ThumbnailImage', + Writable => 'int32u', + WriteGroup => 'IFD0', + Protected => 2, + Permanent => 1, + }, + { + Name => 'ThumbnailOffset', + # in SubIFD of IFD1 in Samsung SRW images + Condition => q{ + $$self{TIFF_TYPE} eq 'SRW' and $$self{DIR_NAME} eq 'SubIFD' and + $$self{PATH}[-2] eq 'IFD1' + }, + IsOffset => 1, + OffsetPair => 0x202, + DataTag => 'ThumbnailImage', + Writable => 'int32u', + WriteGroup => 'SubIFD', + Protected => 2, + Permanent => 1, + }, + { + Name => 'PreviewImageStart', + Condition => '$$self{DIR_NAME} eq "MakerNotes"', + IsOffset => 1, + OffsetPair => 0x202, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + Permanent => 1, + }, + { + Name => 'PreviewImageStart', + # PreviewImage in IFD0 of ARW and SR2 files for all models + Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(ARW|SR2)$/', + IsOffset => 1, + OffsetPair => 0x202, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'IFD0', + Protected => 2, + Permanent => 1, + }, + { + Name => 'JpgFromRawStart', + Condition => '$$self{DIR_NAME} eq "SubIFD"', + IsOffset => 1, + OffsetPair => 0x202, + DataTag => 'JpgFromRaw', + Writable => 'int32u', + WriteGroup => 'SubIFD', + # JpgFromRaw is in SubIFD of NEF, NRW and SRW files + Protected => 2, + Permanent => 1, + }, + { + Name => 'JpgFromRawStart', + Condition => '$$self{DIR_NAME} eq "IFD2"', + IsOffset => 1, + OffsetPair => 0x202, + DataTag => 'JpgFromRaw', + Writable => 'int32u', + WriteGroup => 'IFD2', + # JpgFromRaw is in IFD2 of PEF files + Protected => 2, + Permanent => 1, + }, + { + Name => 'OtherImageStart', + Condition => '$$self{DIR_NAME} eq "SubIFD1"', + IsOffset => 1, + OffsetPair => 0x202, + DataTag => 'OtherImage', + Writable => 'int32u', + WriteGroup => 'SubIFD1', + Protected => 2, + Permanent => 1, + }, + { + Name => 'OtherImageStart', + Condition => '$$self{DIR_NAME} eq "SubIFD2"', + IsOffset => 1, + OffsetPair => 0x202, + DataTag => 'OtherImage', + Writable => 'int32u', + WriteGroup => 'SubIFD2', + Protected => 2, + Permanent => 1, + }, + { + Name => 'OtherImageStart', + IsOffset => 1, + OffsetPair => 0x202, + }, + ], + 0x202 => [ + { + Name => 'ThumbnailLength', + Notes => q{ + ThumbnailLength in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW + images and AVI and MOV videos, and the SubIFD in IFD1 of SRW images; + PreviewImageLength in MakerNotes and IFD0 of ARW and SR2 images; + JpgFromRawLength in SubIFD of NEF images, and IFD2 of PEF images; and + OtherImageLength in everything else + }, + Condition => q{ + $$self{DIR_NAME} eq 'IFD1' or + ($$self{DIR_NAME} eq 'IFD0' and $$self{FILE_TYPE} =~ /^(RIFF|MOV)$/) + }, + OffsetPair => 0x201, + DataTag => 'ThumbnailImage', + Writable => 'int32u', + WriteGroup => 'IFD1', + WriteCondition => q{ + $$self{FILE_TYPE} ne "TIFF" or + $$self{TIFF_TYPE} =~ /^(CR2|ARW|SR2|PEF)$/ + }, + Protected => 2, + }, + { + Name => 'ThumbnailLength', + # thumbnail in IFD0 of MRW images (Minolta A200) + # and IFD0 of NRW images (Nikon Coolpix P6000,P7000,P7100) + Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(MRW|NRW)$/', + OffsetPair => 0x201, + DataTag => 'ThumbnailImage', + Writable => 'int32u', + WriteGroup => 'IFD0', + Protected => 2, + Permanent => 1, + }, + { + Name => 'ThumbnailLength', + # in SubIFD of IFD1 in Samsung SRW images + Condition => q{ + $$self{TIFF_TYPE} eq 'SRW' and $$self{DIR_NAME} eq 'SubIFD' and + $$self{PATH}[-2] eq 'IFD1' + }, + OffsetPair => 0x201, + DataTag => 'ThumbnailImage', + Writable => 'int32u', + WriteGroup => 'SubIFD', + Protected => 2, + Permanent => 1, + }, + { + Name => 'PreviewImageLength', + Condition => '$$self{DIR_NAME} eq "MakerNotes"', + OffsetPair => 0x201, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + Permanent => 1, + }, + { + Name => 'PreviewImageLength', + # PreviewImage in IFD0 of ARW and SR2 files for all models + Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(ARW|SR2)$/', + OffsetPair => 0x201, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'IFD0', + Protected => 2, + Permanent => 1, + }, + { + Name => 'JpgFromRawLength', + Condition => '$$self{DIR_NAME} eq "SubIFD"', + OffsetPair => 0x201, + DataTag => 'JpgFromRaw', + Writable => 'int32u', + WriteGroup => 'SubIFD', + Protected => 2, + Permanent => 1, + }, + { + Name => 'JpgFromRawLength', + Condition => '$$self{DIR_NAME} eq "IFD2"', + OffsetPair => 0x201, + DataTag => 'JpgFromRaw', + Writable => 'int32u', + WriteGroup => 'IFD2', + Protected => 2, + Permanent => 1, + }, + { + Name => 'OtherImageLength', + Condition => '$$self{DIR_NAME} eq "SubIFD1"', + OffsetPair => 0x201, + DataTag => 'OtherImage', + Writable => 'int32u', + WriteGroup => 'SubIFD1', + Protected => 2, + Permanent => 1, + }, + { + Name => 'OtherImageLength', + Condition => '$$self{DIR_NAME} eq "SubIFD2"', + OffsetPair => 0x201, + DataTag => 'OtherImage', + Writable => 'int32u', + WriteGroup => 'SubIFD2', + Protected => 2, + Permanent => 1, + }, + { + Name => 'OtherImageLength', + OffsetPair => 0x201, + }, + ], + 0x203 => 'JPEGRestartInterval', + 0x205 => 'JPEGLosslessPredictors', + 0x206 => 'JPEGPointTransforms', + 0x207 => { + Name => 'JPEGQTables', + IsOffset => 1, + # this tag is not supported for writing, so define an + # invalid offset pair to cause a "No size tag" error to be + # generated if we try to write a file containing this tag + OffsetPair => -1, + }, + 0x208 => { + Name => 'JPEGDCTables', + IsOffset => 1, + OffsetPair => -1, # (see comment for JPEGQTables) + }, + 0x209 => { + Name => 'JPEGACTables', + IsOffset => 1, + OffsetPair => -1, # (see comment for JPEGQTables) + }, + 0x211 => { + Name => 'YCbCrCoefficients', + Protected => 1, + Writable => 'rational64u', + WriteGroup => 'IFD0', + Count => 3, + Priority => 0, + }, + 0x212 => { + Name => 'YCbCrSubSampling', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + Count => 2, + PrintConvColumns => 2, + PrintConv => \%Image::ExifTool::JPEG::yCbCrSubSampling, + Priority => 0, + }, + 0x213 => { + Name => 'YCbCrPositioning', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'IFD0', + Mandatory => 1, + PrintConv => { + 1 => 'Centered', + 2 => 'Co-sited', + }, + Priority => 0, + }, + 0x214 => { + Name => 'ReferenceBlackWhite', + Writable => 'rational64u', + WriteGroup => 'IFD0', + Count => 6, + Priority => 0, + }, + # 0x220 - int32u: 0 (IFD0, Xaiomi Redmi models) + # 0x221 - int32u: 0 (IFD0, Xaiomi Redmi models) + # 0x222 - int32u: 0 (IFD0, Xaiomi Redmi models) + # 0x223 - int32u: 0 (IFD0, Xaiomi Redmi models) + # 0x224 - int32u: 0,1 (IFD0, Xaiomi Redmi models) + # 0x225 - string: "" (IFD0, Xaiomi Redmi models) + 0x22f => 'StripRowCounts', + 0x2bc => { + Name => 'ApplicationNotes', # (writable directory!) + Format => 'undef', + Writable => 'int8u', + WriteGroup => 'IFD0', # (only for Validate) + Flags => [ 'Binary', 'Protected' ], + # this could be an XMP block + SubDirectory => { + DirName => 'XMP', + TagTable => 'Image::ExifTool::XMP::Main', + }, + }, + 0x3e7 => 'USPTOMiscellaneous', #20 + 0x1000 => { #5 + Name => 'RelatedImageFileFormat', + Protected => 1, + Writable => 'string', + WriteGroup => 'InteropIFD', + }, + 0x1001 => { #5 + Name => 'RelatedImageWidth', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'InteropIFD', + }, + 0x1002 => { #5 + Name => 'RelatedImageHeight', + Notes => 'called RelatedImageLength by the DCF spec.', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'InteropIFD', + }, + # (0x474x tags written by MicrosoftPhoto) + 0x4746 => { #PH + Name => 'Rating', + Writable => 'int16u', + WriteGroup => 'IFD0', + Avoid => 1, + }, + 0x4747 => { # (written by Digital Image Pro) + Name => 'XP_DIP_XML', + Format => 'undef', + # the following reference indicates this is Unicode: + # http://social.msdn.microsoft.com/Forums/en-US/isvvba/thread/ce6edcbb-8fc2-40c6-ad98-85f5d835ddfb + ValueConv => '$self->Decode($val,"UCS2","II")', + }, + 0x4748 => { + Name => 'StitchInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Microsoft::Stitch', + ByteOrder => 'LittleEndian', #PH (NC) + }, + }, + 0x4749 => { #PH + Name => 'RatingPercent', + Writable => 'int16u', + WriteGroup => 'IFD0', + Avoid => 1, + }, + 0x7000 => { #JR + Name => 'SonyRawFileType', + # (only valid if Sony:FileFormat >= ARW 2.0, ref IB) + # Writable => 'int16u', (don't allow writes for now) + PrintConv => { + 0 => 'Sony Uncompressed 14-bit RAW', + 1 => 'Sony Uncompressed 12-bit RAW', #IB + 2 => 'Sony Compressed RAW', # (lossy, ref IB) + 3 => 'Sony Lossless Compressed RAW', #IB + 4 => 'Sony Lossless Compressed RAW 2', #JR (ILCE-1) + }, + }, + # 0x7001 - int16u[1] (in SubIFD of Sony ARW images) - values: 0,1 + 0x7010 => { #IB + Name => 'SonyToneCurve', + # int16u[4] (in SubIFD of Sony ARW images -- don't allow writes for now) + # - only the middle 4 points are stored (lower comes from black level, + # and upper from data maximum) + }, + # 0x7011 - int16u[4] (in SubIFD of Sony ARW images) - values: "0 4912 8212 12287","4000 7200 10050 12075" + # 0x7020 - int32u[1] (in SubIFD of Sony ARW images) - values: 0,3 + 0x7031 => { + Name => 'VignettingCorrection', + Notes => 'found in Sony ARW images', + Protected => 1, + Writable => 'int16s', + WriteGroup => 'SubIFD', + PrintConv => { + 256 => 'Off', + 257 => 'Auto', + 272 => 'Auto (ILCE-1)', #JR + 511 => 'No correction params available', + }, + }, + 0x7032 => { + Name => 'VignettingCorrParams', #forum7640 + Notes => 'found in Sony ARW images', + Protected => 1, + Writable => 'int16s', + WriteGroup => 'SubIFD', + Count => 17, + }, + 0x7034 => { + Name => 'ChromaticAberrationCorrection', + Notes => 'found in Sony ARW images', + Protected => 1, + Writable => 'int16s', + WriteGroup => 'SubIFD', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 255 => 'No correction params available', + }, + }, + 0x7035 => { + Name => 'ChromaticAberrationCorrParams', #forum6509 + Notes => 'found in Sony ARW images', + Protected => 1, + Writable => 'int16s', + WriteGroup => 'SubIFD', + Count => 33, + }, + 0x7036 => { + Name => 'DistortionCorrection', + Notes => 'found in Sony ARW images', + Protected => 1, + Writable => 'int16s', + WriteGroup => 'SubIFD', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 17 => 'Auto fixed by lens', + 255 => 'No correction params available', + }, + }, + 0x7037 => { + Name => 'DistortionCorrParams', #forum6509 + Notes => 'found in Sony ARW images', + Protected => 1, + Writable => 'int16s', + WriteGroup => 'SubIFD', + Count => 17, + }, + 0x74c7 => { #IB (in ARW images from some Sony cameras) + Name => 'SonyCropTopLeft', + Writable => 'int32u', + WriteGroup => 'SubIFD', + Count => 2, + Permanent => 1, + Protected => 1, + }, + 0x74c8 => { #IB (in ARW images from some Sony cameras) + Name => 'SonyCropSize', + Writable => 'int32u', + WriteGroup => 'SubIFD', + Count => 2, + Permanent => 1, + Protected => 1, + }, + 0x800d => 'ImageID', #10 + 0x80a3 => { Name => 'WangTag1', Binary => 1 }, #20 + 0x80a4 => { Name => 'WangAnnotation', Binary => 1 }, + 0x80a5 => { Name => 'WangTag3', Binary => 1 }, #20 + 0x80a6 => { #20 + Name => 'WangTag4', + PrintConv => 'length($val) <= 64 ? $val : \$val', + }, + # tags 0x80b8-0x80bc are registered to Island Graphics + 0x80b9 => 'ImageReferencePoints', #29 + 0x80ba => 'RegionXformTackPoint', #29 + 0x80bb => 'WarpQuadrilateral', #29 + 0x80bc => 'AffineTransformMat', #29 + 0x80e3 => 'Matteing', #9 + 0x80e4 => 'DataType', #9 + 0x80e5 => 'ImageDepth', #9 + 0x80e6 => 'TileDepth', #9 + # tags 0x8214-0x8219 are registered to Pixar + 0x8214 => 'ImageFullWidth', #29 + 0x8215 => 'ImageFullHeight', #29 + 0x8216 => 'TextureFormat', #29 + 0x8217 => 'WrapModes', #29 + 0x8218 => 'FovCot', #29 + 0x8219 => 'MatrixWorldToScreen', #29 + 0x821a => 'MatrixWorldToCamera', #29 + 0x827d => 'Model2', #29 (Eastman Kodak) + 0x828d => { #12 + Name => 'CFARepeatPatternDim', + Protected => 1, + Writable => 'int16u', + WriteGroup => 'SubIFD', + Count => 2, + }, + 0x828e => { + Name => 'CFAPattern2', #12 + Format => 'int8u', # (written incorrectly as 'undef' in Nikon NRW images) + Protected => 1, + Writable => 'int8u', + WriteGroup => 'SubIFD', + Count => -1, + }, + 0x828f => { #12 + Name => 'BatteryLevel', + Groups => { 2 => 'Camera' }, + }, + 0x8290 => { + Name => 'KodakIFD', + Groups => { 1 => 'KodakIFD' }, + Flags => 'SubIFD', + Notes => 'used in various types of Kodak images', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::IFD', + DirName => 'KodakIFD', + Start => '$val', + MaxSubdirs => 1, + }, + }, + 0x8298 => { + Name => 'Copyright', + Groups => { 2 => 'Author' }, + Format => 'undef', + Writable => 'string', + WriteGroup => 'IFD0', + Notes => q{ + may contain copyright notices for photographer and editor, separated by a + newline. As per the EXIF specification, the newline is replaced by a null + byte when writing to file, but this may be avoided by disabling the print + conversion + }, + # internally the strings are separated by a null character in this format: + # Photographer only: photographer + NULL + # Both: photographer + NULL + editor + NULL + # Editor only: SPACE + NULL + editor + NULL + # (this is done as a RawConv so conditional replaces will work properly) + RawConv => sub { + my ($val, $self) = @_; + $val =~ s/ *\0/\n/; # translate first NULL to a newline, removing trailing blanks + $val =~ s/ *\0.*//s; # truncate at second NULL and remove trailing blanks + $val =~ s/\n$//; # remove trailing newline if it exists + # decode if necessary (note: this is the only non-'string' EXIF value like this) + my $enc = $self->Options('CharsetEXIF'); + $val = $self->Decode($val,$enc) if $enc; + return $val; + }, + RawConvInv => '$val . "\0"', + PrintConvInv => sub { + my ($val, $self) = @_; + # encode if necessary (not automatic because Format is 'undef') + my $enc = $self->Options('CharsetEXIF'); + $val = $self->Encode($val,$enc) if $enc and $val !~ /\0/; + if ($val =~ /(.*?)\s*[\n\r]+\s*(.*)/s) { + return $1 unless length $2; + # photographer copyright set to ' ' if it doesn't exist, according to spec. + return((length($1) ? $1 : ' ') . "\0" . $2); + } + return $val; + }, + }, + 0x829a => { + Name => 'ExposureTime', + Writable => 'rational64u', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => '$val', + }, + 0x829d => { + Name => 'FNumber', + Writable => 'rational64u', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', + }, + 0x82a5 => { #3 + Name => 'MDFileTag', + Notes => 'tags 0x82a5-0x82ac are used in Molecular Dynamics GEL files', + }, + 0x82a6 => 'MDScalePixel', #3 + 0x82a7 => 'MDColorTable', #3 + 0x82a8 => 'MDLabName', #3 + 0x82a9 => 'MDSampleInfo', #3 + 0x82aa => 'MDPrepDate', #3 + 0x82ab => 'MDPrepTime', #3 + 0x82ac => 'MDFileUnits', #3 + 0x830e => { #30 (GeoTiff) + Name => 'PixelScale', + Writable => 'double', + WriteGroup => 'IFD0', + Count => 3, + }, + 0x8335 => 'AdventScale', #20 + 0x8336 => 'AdventRevision', #20 + 0x835c => 'UIC1Tag', #23 + 0x835d => 'UIC2Tag', #23 + 0x835e => 'UIC3Tag', #23 + 0x835f => 'UIC4Tag', #23 + 0x83bb => { #12 + Name => 'IPTC-NAA', # (writable directory! -- but see note below) + # this should actually be written as 'undef' (see + # http://www.awaresystems.be/imaging/tiff/tifftags/iptc.html), + # but Photoshop writes it as int32u and Nikon Capture won't read + # anything else, so we do the same thing here... Doh! + Format => 'undef', # convert binary values as undef + Writable => 'int32u', # but write int32u format code in IFD + WriteGroup => 'IFD0', + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { + DirName => 'IPTC', + TagTable => 'Image::ExifTool::IPTC::Main', + }, + # Note: This directory may be written as a block via the IPTC-NAA tag, + # but this technique is not recommended. Instead, it is better to + # write the Extra IPTC tag and let ExifTool decide where it should go. + }, + 0x847e => 'IntergraphPacketData', #3 + 0x847f => 'IntergraphFlagRegisters', #3 + 0x8480 => { #30 (GeoTiff, obsolete) + Name => 'IntergraphMatrix', + Writable => 'double', + WriteGroup => 'IFD0', + Count => -1, + }, + 0x8481 => 'INGRReserved', #20 + 0x8482 => { #30 (GeoTiff) + Name => 'ModelTiePoint', + Groups => { 2 => 'Location' }, + Writable => 'double', + WriteGroup => 'IFD0', + Count => -1, + }, + 0x84e0 => 'Site', #9 + 0x84e1 => 'ColorSequence', #9 + 0x84e2 => 'IT8Header', #9 + 0x84e3 => { #9 + Name => 'RasterPadding', + PrintConv => { #20 + 0 => 'Byte', + 1 => 'Word', + 2 => 'Long Word', + 9 => 'Sector', + 10 => 'Long Sector', + }, + }, + 0x84e4 => 'BitsPerRunLength', #9 + 0x84e5 => 'BitsPerExtendedRunLength', #9 + 0x84e6 => 'ColorTable', #9 + 0x84e7 => { #9 + Name => 'ImageColorIndicator', + PrintConv => { #20 + 0 => 'Unspecified Image Color', + 1 => 'Specified Image Color', + }, + }, + 0x84e8 => { #9 + Name => 'BackgroundColorIndicator', + PrintConv => { #20 + 0 => 'Unspecified Background Color', + 1 => 'Specified Background Color', + }, + }, + 0x84e9 => 'ImageColorValue', #9 + 0x84ea => 'BackgroundColorValue', #9 + 0x84eb => 'PixelIntensityRange', #9 + 0x84ec => 'TransparencyIndicator', #9 + 0x84ed => 'ColorCharacterization', #9 + 0x84ee => { #9 + Name => 'HCUsage', + PrintConv => { #20 + 0 => 'CT', + 1 => 'Line Art', + 2 => 'Trap', + }, + }, + 0x84ef => 'TrapIndicator', #17 + 0x84f0 => 'CMYKEquivalent', #17 + 0x8546 => { #11 + Name => 'SEMInfo', + Notes => 'found in some scanning electron microscope images', + Writable => 'string', + WriteGroup => 'IFD0', + }, + 0x8568 => { + Name => 'AFCP_IPTC', + SubDirectory => { + # must change directory name so we don't create this directory + DirName => 'AFCP_IPTC', + TagTable => 'Image::ExifTool::IPTC::Main', + }, + }, + 0x85b8 => 'PixelMagicJBIGOptions', #20 + 0x85d7 => 'JPLCartoIFD', #exifprobe (NC) + 0x85d8 => { #30 (GeoTiff) + Name => 'ModelTransform', + Groups => { 2 => 'Location' }, + Writable => 'double', + WriteGroup => 'IFD0', + Count => 16, + }, + 0x8602 => { #16 + Name => 'WB_GRGBLevels', + Notes => 'found in IFD0 of Leaf MOS images', + }, + # 0x8603 - Leaf CatchLight color matrix (ref 16) + 0x8606 => { + Name => 'LeafData', + Format => 'undef', # avoid converting huge block to string of int8u's! + SubDirectory => { + DirName => 'LeafIFD', + TagTable => 'Image::ExifTool::Leaf::Main', + }, + }, + 0x8649 => { #19 + Name => 'PhotoshopSettings', + Format => 'binary', + WriteGroup => 'IFD0', # (only for Validate) + SubDirectory => { + DirName => 'Photoshop', + TagTable => 'Image::ExifTool::Photoshop::Main', + }, + }, + 0x8769 => { + Name => 'ExifOffset', + Groups => { 1 => 'ExifIFD' }, + WriteGroup => 'IFD0', # (only for Validate) + SubIFD => 2, + SubDirectory => { + DirName => 'ExifIFD', + Start => '$val', + }, + }, + 0x8773 => { + Name => 'ICC_Profile', + WriteGroup => 'IFD0', # (only for Validate) + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + }, + }, + 0x877f => { #20 + Name => 'TIFF_FXExtensions', + PrintConv => { BITMASK => { + 0 => 'Resolution/Image Width', + 1 => 'N Layer Profile M', + 2 => 'Shared Data', + 3 => 'B&W JBIG2', + 4 => 'JBIG2 Profile M', + }}, + }, + 0x8780 => { #20 + Name => 'MultiProfiles', + PrintConv => { BITMASK => { + 0 => 'Profile S', + 1 => 'Profile F', + 2 => 'Profile J', + 3 => 'Profile C', + 4 => 'Profile L', + 5 => 'Profile M', + 6 => 'Profile T', + 7 => 'Resolution/Image Width', + 8 => 'N Layer Profile M', + 9 => 'Shared Data', + 10 => 'JBIG2 Profile M', + }}, + }, + 0x8781 => { #22 + Name => 'SharedData', + IsOffset => 1, + # this tag is not supported for writing, so define an + # invalid offset pair to cause a "No size tag" error to be + # generated if we try to write a file containing this tag + OffsetPair => -1, + }, + 0x8782 => 'T88Options', #20 + 0x87ac => 'ImageLayer', + 0x87af => { #30 + Name => 'GeoTiffDirectory', + Format => 'undef', + Writable => 'int16u', + Notes => q{ + these "GeoTiff" tags may read and written as a block, but they aren't + extracted unless specifically requested. Byte order changes are handled + automatically when copying between TIFF images with different byte order + }, + WriteGroup => 'IFD0', + Binary => 1, + RawConv => '$val . GetByteOrder()', # save byte order + # swap byte order if necessary + RawConvInv => q{ + return $val if length $val < 2; + my $order = substr($val, -2); + return $val unless $order eq 'II' or $order eq 'MM'; + $val = substr($val, 0, -2); + return $val if $order eq GetByteOrder(); + return pack('v*',unpack('n*',$val)); + }, + }, + 0x87b0 => { #30 + Name => 'GeoTiffDoubleParams', + Format => 'undef', + Writable => 'double', + WriteGroup => 'IFD0', + Binary => 1, + RawConv => '$val . GetByteOrder()', # save byte order + # swap byte order if necessary + RawConvInv => q{ + return $val if length $val < 2; + my $order = substr($val, -2); + return $val unless $order eq 'II' or $order eq 'MM'; + $val = substr($val, 0, -2); + return $val if $order eq GetByteOrder(); + $val =~ s/(.{4})(.{4})/$2$1/sg; # swap words + return pack('V*',unpack('N*',$val)); + }, + }, + 0x87b1 => { #30 + Name => 'GeoTiffAsciiParams', + Format => 'undef', + Writable => 'string', + WriteGroup => 'IFD0', + Binary => 1, + }, + 0x87be => 'JBIGOptions', #29 + 0x8822 => { + Name => 'ExposureProgram', + Groups => { 2 => 'Camera' }, + Notes => 'the value of 9 is not standard EXIF, but is used by the Canon EOS 7D', + Writable => 'int16u', + PrintConv => { + 0 => 'Not Defined', + 1 => 'Manual', + 2 => 'Program AE', + 3 => 'Aperture-priority AE', + 4 => 'Shutter speed priority AE', + 5 => 'Creative (Slow speed)', + 6 => 'Action (High speed)', + 7 => 'Portrait', + 8 => 'Landscape', + 9 => 'Bulb', #25 + }, + }, + 0x8824 => { + Name => 'SpectralSensitivity', + Groups => { 2 => 'Camera' }, + Writable => 'string', + }, + 0x8825 => { + Name => 'GPSInfo', + Groups => { 1 => 'GPS' }, + WriteGroup => 'IFD0', # (only for Validate) + Flags => 'SubIFD', + SubDirectory => { + DirName => 'GPS', + TagTable => 'Image::ExifTool::GPS::Main', + Start => '$val', + MaxSubdirs => 1, + }, + }, + 0x8827 => { + Name => 'ISO', + Notes => q{ + called ISOSpeedRatings by EXIF 2.2, then PhotographicSensitivity by the EXIF + 2.3 spec. + }, + Writable => 'int16u', + Count => -1, + PrintConv => '$val=~s/\s+/, /g; $val', + PrintConvInv => '$val=~tr/,//d; $val', + }, + 0x8828 => { + Name => 'Opto-ElectricConvFactor', + Notes => 'called OECF by the EXIF spec.', + Binary => 1, + }, + 0x8829 => 'Interlace', #12 + 0x882a => { #12 + Name => 'TimeZoneOffset', + Writable => 'int16s', + Count => -1, # can be 1 or 2 + Notes => q{ + 1 or 2 values: 1. The time zone offset of DateTimeOriginal from GMT in + hours, 2. If present, the time zone offset of ModifyDate + }, + }, + 0x882b => { #12 + Name => 'SelfTimerMode', + Writable => 'int16u', + }, + 0x8830 => { #24 + Name => 'SensitivityType', + Notes => 'applies to EXIF:ISO tag', + Writable => 'int16u', + PrintConv => { + 0 => 'Unknown', + 1 => 'Standard Output Sensitivity', + 2 => 'Recommended Exposure Index', + 3 => 'ISO Speed', + 4 => 'Standard Output Sensitivity and Recommended Exposure Index', + 5 => 'Standard Output Sensitivity and ISO Speed', + 6 => 'Recommended Exposure Index and ISO Speed', + 7 => 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed', + }, + }, + 0x8831 => { #24 + Name => 'StandardOutputSensitivity', + Writable => 'int32u', + }, + 0x8832 => { #24 + Name => 'RecommendedExposureIndex', + Writable => 'int32u', + }, + 0x8833 => { #24 + Name => 'ISOSpeed', + Writable => 'int32u', + }, + 0x8834 => { #24 + Name => 'ISOSpeedLatitudeyyy', + Description => 'ISO Speed Latitude yyy', + Writable => 'int32u', + }, + 0x8835 => { #24 + Name => 'ISOSpeedLatitudezzz', + Description => 'ISO Speed Latitude zzz', + Writable => 'int32u', + }, + 0x885c => 'FaxRecvParams', #9 + 0x885d => 'FaxSubAddress', #9 + 0x885e => 'FaxRecvTime', #9 + 0x8871 => 'FedexEDR', #exifprobe (NC) + # 0x8889 - string: "portrait" (ExifIFD, Xiaomi POCO F1) + 0x888a => { #PH + Name => 'LeafSubIFD', + Format => 'int32u', # Leaf incorrectly uses 'undef' format! + Groups => { 1 => 'LeafSubIFD' }, + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::SubIFD', + Start => '$val', + }, + }, + # 0x8891 - int16u: 35 (ExifIFD, Xiaomi POCO F1) + # 0x8894 - int16u: 0 (ExifIFD, Xiaomi POCO F1) + # 0x8895 - int16u: 0 (ExifIFD, Xiaomi POCO F1) + # 0x889a - int16u: 0 (ExifIFD, Xiaomi POCO F1) + # 0x89ab - seen "11 100 130 16 0 0 0 0" in IFD0 of TIFF image from IR scanner (forum8470) + 0x9000 => { + Name => 'ExifVersion', + Writable => 'undef', + Mandatory => 1, + RawConv => '$val=~s/\0+$//; $val', # (some idiots add null terminators) + # (allow strings like "2.31" when writing) + PrintConvInv => '$val=~tr/.//d; $val=~/^\d{4}$/ ? $val : $val =~ /^\d{3}$/ ? "0$val" : undef', + }, + 0x9003 => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Notes => 'date/time when original image was taken', + Writable => 'string', + Shift => 'Time', + Validate => 'ValidateExifDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,0)', + }, + 0x9004 => { + Name => 'CreateDate', + Groups => { 2 => 'Time' }, + Notes => 'called DateTimeDigitized by the EXIF spec.', + Writable => 'string', + Shift => 'Time', + Validate => 'ValidateExifDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,0)', + }, + 0x9009 => { # undef[44] (or undef[11]) written by Google Plus uploader - PH + Name => 'GooglePlusUploadCode', + Format => 'int8u', + Writable => 'undef', + Count => -1, + }, + 0x9010 => { + Name => 'OffsetTime', + Groups => { 2 => 'Time' }, + Notes => 'time zone for ModifyDate', + Writable => 'string', + PrintConvInv => q{ + return "+00:00" if $val =~ /\d{2}Z$/; + return sprintf("%s%.2d:%.2d",$1,$2,$3) if $val =~ /([-+])(\d{1,2}):(\d{2})/; + return undef; + }, + }, + 0x9011 => { + Name => 'OffsetTimeOriginal', + Groups => { 2 => 'Time' }, + Notes => 'time zone for DateTimeOriginal', + Writable => 'string', + PrintConvInv => q{ + return "+00:00" if $val =~ /\d{2}Z$/; + return sprintf("%s%.2d:%.2d",$1,$2,$3) if $val =~ /([-+])(\d{1,2}):(\d{2})/; + return undef; + }, + }, + 0x9012 => { + Name => 'OffsetTimeDigitized', + Groups => { 2 => 'Time' }, + Notes => 'time zone for CreateDate', + Writable => 'string', + PrintConvInv => q{ + return "+00:00" if $val =~ /\d{2}Z$/; + return sprintf("%s%.2d:%.2d",$1,$2,$3) if $val =~ /([-+])(\d{1,2}):(\d{2})/; + return undef; + }, + }, + 0x9101 => { + Name => 'ComponentsConfiguration', + Format => 'int8u', + Protected => 1, + Writable => 'undef', + Count => 4, + Mandatory => 1, + ValueConvInv => '$val=~tr/,//d; $val', # (so we can copy from XMP with -n) + PrintConvColumns => 2, + PrintConv => { + 0 => '-', + 1 => 'Y', + 2 => 'Cb', + 3 => 'Cr', + 4 => 'R', + 5 => 'G', + 6 => 'B', + OTHER => sub { + my ($val, $inv, $conv) = @_; + my @a = split /,?\s+/, $val; + if ($inv) { + my %invConv; + $invConv{lc $$conv{$_}} = $_ foreach keys %$conv; + # strings like "YCbCr" and "RGB" still work for writing + @a = $a[0] =~ /(Y|Cb|Cr|R|G|B)/g if @a == 1; + foreach (@a) { + $_ = $invConv{lc $_}; + return undef unless defined $_; + } + push @a, 0 while @a < 4; + } else { + foreach (@a) { + $_ = $$conv{$_} || "Err ($_)"; + } + } + return join ', ', @a; + }, + }, + }, + 0x9102 => { + Name => 'CompressedBitsPerPixel', + Protected => 1, + Writable => 'rational64u', + }, + # 0x9103 - int16u: 1 (found in Pentax XG-1 samples) + 0x9201 => { + Name => 'ShutterSpeedValue', + Notes => 'displayed in seconds, but stored as an APEX value', + Format => 'rational64s', # Leica M8 patch (incorrectly written as rational64u) + Writable => 'rational64s', + ValueConv => 'IsFloat($val) && abs($val)<100 ? 2**(-$val) : 0', + ValueConvInv => '$val>0 ? -log($val)/log(2) : -100', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x9202 => { + Name => 'ApertureValue', + Notes => 'displayed as an F number, but stored as an APEX value', + Writable => 'rational64u', + ValueConv => '2 ** ($val / 2)', + ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + # Wikipedia: BrightnessValue = Bv = Av + Tv - Sv + # ExifTool: LightValue = LV = Av + Tv - Sv + 5 (5 is the Sv for ISO 100 in Exif usage) + 0x9203 => { + Name => 'BrightnessValue', + Writable => 'rational64s', + }, + 0x9204 => { + Name => 'ExposureCompensation', + Format => 'rational64s', # Leica M8 patch (incorrectly written as rational64u) + Notes => 'called ExposureBiasValue by the EXIF spec.', + Writable => 'rational64s', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => '$val', + }, + 0x9205 => { + Name => 'MaxApertureValue', + Notes => 'displayed as an F number, but stored as an APEX value', + Groups => { 2 => 'Camera' }, + Writable => 'rational64u', + ValueConv => '2 ** ($val / 2)', + ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x9206 => { + Name => 'SubjectDistance', + Groups => { 2 => 'Camera' }, + Writable => 'rational64u', + PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "${val} m"', + PrintConvInv => '$val=~s/\s*m$//;$val', + }, + 0x9207 => { + Name => 'MeteringMode', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + PrintConv => { + 0 => 'Unknown', + 1 => 'Average', + 2 => 'Center-weighted average', + 3 => 'Spot', + 4 => 'Multi-spot', + 5 => 'Multi-segment', + 6 => 'Partial', + 255 => 'Other', + }, + }, + 0x9208 => { + Name => 'LightSource', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + SeparateTable => 'LightSource', + PrintConv => \%lightSource, + }, + 0x9209 => { + Name => 'Flash', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + Flags => 'PrintHex', + SeparateTable => 'Flash', + PrintConv => \%flash, + }, + 0x920a => { + Name => 'FocalLength', + Groups => { 2 => 'Camera' }, + Writable => 'rational64u', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + # Note: tags 0x920b-0x9217 are duplicates of 0xa20b-0xa217 + # (The EXIF standard uses 0xa2xx, but you'll find both in images) + 0x920b => { #12 + Name => 'FlashEnergy', + Groups => { 2 => 'Camera' }, + }, + 0x920c => 'SpatialFrequencyResponse', #12 (not in Fuji images - PH) + 0x920d => 'Noise', #12 + 0x920e => 'FocalPlaneXResolution', #12 + 0x920f => 'FocalPlaneYResolution', #12 + 0x9210 => { #12 + Name => 'FocalPlaneResolutionUnit', + Groups => { 2 => 'Camera' }, + PrintConv => { + 1 => 'None', + 2 => 'inches', + 3 => 'cm', + 4 => 'mm', + 5 => 'um', + }, + }, + 0x9211 => { #12 + Name => 'ImageNumber', + Writable => 'int32u', + }, + 0x9212 => { #12 + Name => 'SecurityClassification', + Writable => 'string', + PrintConv => { + T => 'Top Secret', + S => 'Secret', + C => 'Confidential', + R => 'Restricted', + U => 'Unclassified', + }, + }, + 0x9213 => { #12 + Name => 'ImageHistory', + Writable => 'string', + }, + 0x9214 => { + Name => 'SubjectArea', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + Count => -1, # 2, 3 or 4 values + }, + 0x9215 => 'ExposureIndex', #12 + 0x9216 => 'TIFF-EPStandardID', #12 + 0x9217 => { #12 + Name => 'SensingMethod', + Groups => { 2 => 'Camera' }, + PrintConv => { + # (values 1 and 6 are not used by corresponding EXIF tag 0xa217) + 1 => 'Monochrome area', + 2 => 'One-chip color area', + 3 => 'Two-chip color area', + 4 => 'Three-chip color area', + 5 => 'Color sequential area', + 6 => 'Monochrome linear', + 7 => 'Trilinear', + 8 => 'Color sequential linear', + }, + }, + 0x923a => 'CIP3DataFile', #20 + 0x923b => 'CIP3Sheet', #20 + 0x923c => 'CIP3Side', #20 + 0x923f => 'StoNits', #9 + # handle maker notes as a conditional list + 0x927c => \@Image::ExifTool::MakerNotes::Main, + 0x9286 => { + Name => 'UserComment', + # I have seen other applications write it incorrectly as 'string' or 'int8u' + Format => 'undef', + Writable => 'undef', + RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,1,$tag)', + # (starts with "ASCII\0\0\0", "UNICODE\0", "JIS\0\0\0\0\0" or "\0\0\0\0\0\0\0\0") + RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)', + # SHOULD ADD SPECIAL LOGIC TO ALLOW CONDITIONAL OVERWRITE OF + # "UNKNOWN" VALUES FILLED WITH SPACES + }, + 0x9290 => { + Name => 'SubSecTime', + Groups => { 2 => 'Time' }, + Notes => 'fractional seconds for ModifyDate', + Writable => 'string', + ValueConv => '$val=~s/ +$//; $val', # trim trailing blanks + # extract fractional seconds from a full date/time value + ValueConvInv => '$val=~/^(\d+)\s*$/ ? $1 : ($val=~/\.(\d+)/ ? $1 : undef)', + }, + 0x9291 => { + Name => 'SubSecTimeOriginal', + Groups => { 2 => 'Time' }, + Notes => 'fractional seconds for DateTimeOriginal', + Writable => 'string', + ValueConv => '$val=~s/ +$//; $val', # trim trailing blanks + ValueConvInv => '$val=~/^(\d+)\s*$/ ? $1 : ($val=~/\.(\d+)/ ? $1 : undef)', + }, + 0x9292 => { + Name => 'SubSecTimeDigitized', + Groups => { 2 => 'Time' }, + Notes => 'fractional seconds for CreateDate', + Writable => 'string', + ValueConv => '$val=~s/ +$//; $val', # trim trailing blanks + ValueConvInv => '$val=~/^(\d+)\s*$/ ? $1 : ($val=~/\.(\d+)/ ? $1 : undef)', + }, + # The following 3 tags are found in MSOffice TIFF images + # References: + # http://social.msdn.microsoft.com/Forums/en-US/os_standocs/thread/03086d55-294a-49d5-967a-5303d34c40f8/ + # http://blogs.msdn.com/openspecification/archive/2009/12/08/details-of-three-tiff-tag-extensions-that-microsoft-office-document-imaging-modi-software-may-write-into-the-tiff-files-it-generates.aspx + # http://www.microsoft.com/downloads/details.aspx?FamilyID=0dbc435d-3544-4f4b-9092-2f2643d64a39&displaylang=en#filelist + 0x932f => 'MSDocumentText', + 0x9330 => { + Name => 'MSPropertySetStorage', + Binary => 1, + }, + 0x9331 => { + Name => 'MSDocumentTextPosition', + Binary => 1, # (just in case -- don't know what format this is) + }, + 0x935c => { #3/19 + Name => 'ImageSourceData', # (writable directory!) + Writable => 'undef', + WriteGroup => 'IFD0', + SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::DocumentData' }, + Binary => 1, + Protected => 1, # (because this can be hundreds of megabytes) + ReadFromRAF => 1, # don't load into memory when reading + }, + 0x9400 => { + Name => 'AmbientTemperature', + Notes => 'ambient temperature in degrees C, called Temperature by the EXIF spec.', + Writable => 'rational64s', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 0x9401 => { + Name => 'Humidity', + Notes => 'ambient relative humidity in percent', + Writable => 'rational64u', + }, + 0x9402 => { + Name => 'Pressure', + Notes => 'air pressure in hPa or mbar', + Writable => 'rational64u', + }, + 0x9403 => { + Name => 'WaterDepth', + Notes => 'depth under water in metres, negative for above water', + Writable => 'rational64s', + }, + 0x9404 => { + Name => 'Acceleration', + Notes => 'directionless camera acceleration in units of mGal, or 10-5 m/s2', + Writable => 'rational64u', + }, + 0x9405 => { + Name => 'CameraElevationAngle', + Writable => 'rational64s', + }, + # 0x9999 - string: camera settings (ExifIFD, Xiaomi POCO F1) + # 0x9aaa - int8u[2176]: ? (ExifIFD, Xiaomi POCO F1) + 0x9c9b => { + Name => 'XPTitle', + Format => 'undef', + Writable => 'int8u', + WriteGroup => 'IFD0', + Notes => q{ + tags 0x9c9b-0x9c9f are used by Windows Explorer; special characters + in these values are converted to UTF-8 by default, or Windows Latin1 + with the -L option. XPTitle is ignored by Windows Explorer if + ImageDescription exists + }, + ValueConv => '$self->Decode($val,"UCS2","II")', + ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"', + }, + 0x9c9c => { + Name => 'XPComment', + Format => 'undef', + Writable => 'int8u', + WriteGroup => 'IFD0', + ValueConv => '$self->Decode($val,"UCS2","II")', + ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"', + }, + 0x9c9d => { + Name => 'XPAuthor', + Groups => { 2 => 'Author' }, + Format => 'undef', + Writable => 'int8u', + WriteGroup => 'IFD0', + Notes => 'ignored by Windows Explorer if Artist exists', + ValueConv => '$self->Decode($val,"UCS2","II")', + ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"', + }, + 0x9c9e => { + Name => 'XPKeywords', + Format => 'undef', + Writable => 'int8u', + WriteGroup => 'IFD0', + ValueConv => '$self->Decode($val,"UCS2","II")', + ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"', + }, + 0x9c9f => { + Name => 'XPSubject', + Format => 'undef', + Writable => 'int8u', + WriteGroup => 'IFD0', + ValueConv => '$self->Decode($val,"UCS2","II")', + ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"', + }, + 0xa000 => { + Name => 'FlashpixVersion', + Writable => 'undef', + Mandatory => 1, + RawConv => '$val=~s/\0+$//; $val', # (some idiots add null terminators) + PrintConvInv => '$val=~tr/.//d; $val=~/^\d{4}$/ ? $val : undef', + }, + 0xa001 => { + Name => 'ColorSpace', + Notes => q{ + the value of 0x2 is not standard EXIF. Instead, an Adobe RGB image is + indicated by "Uncalibrated" with an InteropIndex of "R03". The values + 0xfffd and 0xfffe are also non-standard, and are used by some Sony cameras + }, + Writable => 'int16u', + Mandatory => 1, + PrintHex => 1, + PrintConv => { + 1 => 'sRGB', + 2 => 'Adobe RGB', + 0xffff => 'Uncalibrated', + # Sony uses these definitions: (ref JD) + # 0xffff => 'Adobe RGB', (conflicts with Uncalibrated) + 0xfffe => 'ICC Profile', + 0xfffd => 'Wide Gamut RGB', + }, + }, + 0xa002 => { + Name => 'ExifImageWidth', + Notes => 'called PixelXDimension by the EXIF spec.', + Writable => 'int16u', + Mandatory => 1, + }, + 0xa003 => { + Name => 'ExifImageHeight', + Notes => 'called PixelYDimension by the EXIF spec.', + Writable => 'int16u', + Mandatory => 1, + }, + 0xa004 => { + Name => 'RelatedSoundFile', + Writable => 'string', + }, + 0xa005 => { + Name => 'InteropOffset', + Groups => { 1 => 'InteropIFD' }, + Flags => 'SubIFD', + Description => 'Interoperability Offset', + SubDirectory => { + DirName => 'InteropIFD', + Start => '$val', + MaxSubdirs => 1, + }, + }, + # the following 4 tags found in SubIFD1 of some Samsung SRW images + 0xa010 => { + Name => 'SamsungRawPointersOffset', + IsOffset => 1, + OffsetPair => 0xa011, # point to associated byte count + }, + 0xa011 => { + Name => 'SamsungRawPointersLength', + OffsetPair => 0xa010, # point to associated offset + }, + 0xa101 => { + Name => 'SamsungRawByteOrder', + Format => 'undef', + # this is written incorrectly as string[1], but is "\0\0MM" or "II\0\0" + FixedSize => 4, + Count => 1, + }, + 0xa102 => { + Name => 'SamsungRawUnknown', + Unknown => 1, + }, + 0xa20b => { + Name => 'FlashEnergy', + Groups => { 2 => 'Camera' }, + Writable => 'rational64u', + }, + 0xa20c => { + Name => 'SpatialFrequencyResponse', + PrintConv => 'Image::ExifTool::Exif::PrintSFR($val)', + }, + 0xa20d => 'Noise', + 0xa20e => { + Name => 'FocalPlaneXResolution', + Groups => { 2 => 'Camera' }, + Writable => 'rational64u', + }, + 0xa20f => { + Name => 'FocalPlaneYResolution', + Groups => { 2 => 'Camera' }, + Writable => 'rational64u', + }, + 0xa210 => { + Name => 'FocalPlaneResolutionUnit', + Groups => { 2 => 'Camera' }, + Notes => 'values 1, 4 and 5 are not standard EXIF', + Writable => 'int16u', + PrintConv => { + 1 => 'None', # (not standard EXIF) + 2 => 'inches', + 3 => 'cm', + 4 => 'mm', # (not standard EXIF) + 5 => 'um', # (not standard EXIF) + }, + }, + 0xa211 => 'ImageNumber', + 0xa212 => 'SecurityClassification', + 0xa213 => 'ImageHistory', + 0xa214 => { + Name => 'SubjectLocation', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + Count => 2, + }, + 0xa215 => { Name => 'ExposureIndex', Writable => 'rational64u' }, + 0xa216 => 'TIFF-EPStandardID', + 0xa217 => { + Name => 'SensingMethod', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + PrintConv => { + 1 => 'Not defined', + 2 => 'One-chip color area', + 3 => 'Two-chip color area', + 4 => 'Three-chip color area', + 5 => 'Color sequential area', + 7 => 'Trilinear', + 8 => 'Color sequential linear', + # 15 - used by DJI XT2 + }, + }, + 0xa300 => { + Name => 'FileSource', + Writable => 'undef', + ValueConvInv => '($val=~/^\d+$/ and $val < 256) ? chr($val) : $val', + PrintConv => { + 1 => 'Film Scanner', + 2 => 'Reflection Print Scanner', + 3 => 'Digital Camera', + # handle the case where Sigma incorrectly gives this tag a count of 4 + "\3\0\0\0" => 'Sigma Digital Camera', + }, + }, + 0xa301 => { + Name => 'SceneType', + Writable => 'undef', + ValueConvInv => 'chr($val & 0xff)', + PrintConv => { + 1 => 'Directly photographed', + }, + }, + 0xa302 => { + Name => 'CFAPattern', + Writable => 'undef', + RawConv => 'Image::ExifTool::Exif::DecodeCFAPattern($self, $val)', + RawConvInv => q{ + my @a = split ' ', $val; + return $val if @a <= 2; # also accept binary data for backward compatibility + return pack(GetByteOrder() eq 'II' ? 'v2C*' : 'n2C*', @a); + }, + PrintConv => 'Image::ExifTool::Exif::PrintCFAPattern($val)', + PrintConvInv => 'Image::ExifTool::Exif::GetCFAPattern($val)', + }, + 0xa401 => { + Name => 'CustomRendered', + Writable => 'int16u', + Notes => q{ + only 0 and 1 are standard EXIF, but other values are used by Apple iOS + devices + }, + PrintConv => { + 0 => 'Normal', + 1 => 'Custom', + 2 => 'HDR (no original saved)', #32 non-standard (Apple iOS) + 3 => 'HDR (original saved)', #32 non-standard (Apple iOS) + 4 => 'Original (for HDR)', #32 non-standard (Apple iOS) + 6 => 'Panorama', # non-standard (Apple iOS, horizontal or vertical) + 7 => 'Portrait HDR', #32 non-standard (Apple iOS) + 8 => 'Portrait', # non-standard (Apple iOS, blurred background) + # 9 - also seen (Apple iOS) (HDR Portrait?) + }, + }, + 0xa402 => { + Name => 'ExposureMode', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + PrintConv => { + 0 => 'Auto', + 1 => 'Manual', + 2 => 'Auto bracket', + # have seen 3 from Samsung EX1, NX30, NX200 - PH + }, + }, + 0xa403 => { + Name => 'WhiteBalance', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + # set Priority to zero to keep this WhiteBalance from overriding the + # MakerNotes WhiteBalance, since the MakerNotes WhiteBalance and is more + # accurate and contains more information (if it exists) + Priority => 0, + PrintConv => { + 0 => 'Auto', + 1 => 'Manual', + }, + }, + 0xa404 => { + Name => 'DigitalZoomRatio', + Groups => { 2 => 'Camera' }, + Writable => 'rational64u', + }, + 0xa405 => { + Name => 'FocalLengthIn35mmFormat', + Notes => 'called FocalLengthIn35mmFilm by the EXIF spec.', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + 0xa406 => { + Name => 'SceneCaptureType', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + Notes => 'the value of 4 is non-standard, and used by some Samsung models', + PrintConv => { + 0 => 'Standard', + 1 => 'Landscape', + 2 => 'Portrait', + 3 => 'Night', + 4 => 'Other', # (non-standard Samsung, ref forum 5724) + }, + }, + 0xa407 => { + Name => 'GainControl', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + PrintConv => { + 0 => 'None', + 1 => 'Low gain up', + 2 => 'High gain up', + 3 => 'Low gain down', + 4 => 'High gain down', + }, + }, + 0xa408 => { + Name => 'Contrast', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + PrintConv => { + 0 => 'Normal', + 1 => 'Low', + 2 => 'High', + }, + PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)', + }, + 0xa409 => { + Name => 'Saturation', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + PrintConv => { + 0 => 'Normal', + 1 => 'Low', + 2 => 'High', + }, + PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)', + }, + 0xa40a => { + Name => 'Sharpness', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + PrintConv => { + 0 => 'Normal', + 1 => 'Soft', + 2 => 'Hard', + }, + PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)', + }, + 0xa40b => { + Name => 'DeviceSettingDescription', + Groups => { 2 => 'Camera' }, + Binary => 1, + }, + 0xa40c => { + Name => 'SubjectDistanceRange', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + PrintConv => { + 0 => 'Unknown', + 1 => 'Macro', + 2 => 'Close', + 3 => 'Distant', + }, + }, + # 0xa40d - int16u: 0 (GE E1486 TW) + # 0xa40e - int16u: 1 (GE E1486 TW) + 0xa420 => { Name => 'ImageUniqueID', Writable => 'string' }, + 0xa430 => { #24 + Name => 'OwnerName', + Notes => 'called CameraOwnerName by the EXIF spec.', + Writable => 'string', + }, + 0xa431 => { #24 + Name => 'SerialNumber', + Notes => 'called BodySerialNumber by the EXIF spec.', + Writable => 'string', + }, + 0xa432 => { #24 + Name => 'LensInfo', + Notes => q{ + 4 rational values giving focal and aperture ranges, called LensSpecification + by the EXIF spec. + }, + Writable => 'rational64u', + Count => 4, + # convert to the form "12-20mm f/3.8-4.5" or "50mm f/1.4" + PrintConv => \&PrintLensInfo, + PrintConvInv => \&ConvertLensInfo, + }, + 0xa433 => { Name => 'LensMake', Writable => 'string' }, #24 + 0xa434 => { Name => 'LensModel', Writable => 'string' }, #24 + 0xa435 => { Name => 'LensSerialNumber', Writable => 'string' }, #24 + 0xa460 => { #Exif2.32 + Name => 'CompositeImage', + Writable => 'int16u', + PrintConv => { + 0 => 'Unknown', + 1 => 'Not a Composite Image', + 2 => 'General Composite Image', + 3 => 'Composite Image Captured While Shooting', + }, + }, + 0xa461 => { #Exif2.32 + Name => 'CompositeImageCount', + Notes => q{ + 2 values: 1. Number of source images, 2. Number of images used. Called + SourceImageNumberOfCompositeImage by the EXIF spec. + }, + Writable => 'int16u', + Count => 2, + }, + 0xa462 => { #Exif2.32 + Name => 'CompositeImageExposureTimes', + Notes => q{ + 11 or more values: 1. Total exposure time period, 2. Total exposure of all + source images, 3. Total exposure of all used images, 4. Max exposure time of + source images, 5. Max exposure time of used images, 6. Min exposure time of + source images, 7. Min exposure of used images, 8. Number of sequences, 9. + Number of source images in sequence. 10-N. Exposure times of each source + image. Called SourceExposureTimesOfCompositeImage by the EXIF spec. + }, + Writable => 'undef', + RawConv => sub { + my $val = shift; + my @v; + my $i = 0; + for (;;) { + if ($i == 56 or $i == 58) { + last if $i + 2 > length $val; + push @v, Get16u(\$val, $i); + $i += 2; + } else { + last if $i + 8 > length $val; + push @v, Image::ExifTool::GetRational64u(\$val, $i); + $i += 8; + } + } + return join ' ', @v; + }, + RawConvInv => sub { + my $val = shift; + my @v = split ' ', $val; + my $i; + for ($i=0; ; ++$i) { + last unless defined $v[$i]; + $v[$i] = ($i == 7 or $i == 8) ? Set16u($v[$i]) : Image::ExifTool::SetRational64u($v[$i]); + } + return join '', @v; + }, + PrintConv => sub { + my $val = shift; + my @v = split ' ', $val; + my $i; + for ($i=0; ; ++$i) { + last unless defined $v[$i]; + $v[$i] = PrintExposureTime($v[$i]) unless $i == 7 or $i == 8; + } + return join ' ', @v; + }, + PrintConvInv => '$val', + }, + 0xa480 => { Name => 'GDALMetadata', Writable => 'string', WriteGroup => 'IFD0' }, #3 + 0xa481 => { Name => 'GDALNoData', Writable => 'string', WriteGroup => 'IFD0' }, #3 + 0xa500 => { Name => 'Gamma', Writable => 'rational64u' }, + 0xafc0 => 'ExpandSoftware', #JD (Opanda) + 0xafc1 => 'ExpandLens', #JD (Opanda) + 0xafc2 => 'ExpandFilm', #JD (Opanda) + 0xafc3 => 'ExpandFilterLens', #JD (Opanda) + 0xafc4 => 'ExpandScanner', #JD (Opanda) + 0xafc5 => 'ExpandFlashLamp', #JD (Opanda) + 0xb4c3 => { Name => 'HasselbladRawImage', Format => 'undef', Binary => 1 }, #IB +# +# Windows Media Photo / HD Photo (WDP/HDP) tags +# + 0xbc01 => { #13 + Name => 'PixelFormat', + PrintHex => 1, + Format => 'undef', + Notes => q{ + tags 0xbc** are used in Windows HD Photo (HDP and WDP) images. The actual + PixelFormat values are 16-byte GUID's but the leading 15 bytes, + '6fddc324-4e03-4bfe-b1853-d77768dc9', have been removed below to avoid + unnecessary clutter + }, + ValueConv => q{ + require Image::ExifTool::ASF; + $val = Image::ExifTool::ASF::GetGUID($val); + # GUID's are too long, so remove redundant information + $val =~ s/^6fddc324-4e03-4bfe-b185-3d77768dc9//i and $val = hex($val); + return $val; + }, + PrintConv => { + 0x0d => '24-bit RGB', + 0x0c => '24-bit BGR', + 0x0e => '32-bit BGR', + 0x15 => '48-bit RGB', + 0x12 => '48-bit RGB Fixed Point', + 0x3b => '48-bit RGB Half', + 0x18 => '96-bit RGB Fixed Point', + 0x1b => '128-bit RGB Float', + 0x0f => '32-bit BGRA', + 0x16 => '64-bit RGBA', + 0x1d => '64-bit RGBA Fixed Point', + 0x3a => '64-bit RGBA Half', + 0x1e => '128-bit RGBA Fixed Point', + 0x19 => '128-bit RGBA Float', + 0x10 => '32-bit PBGRA', + 0x17 => '64-bit PRGBA', + 0x1a => '128-bit PRGBA Float', + 0x1c => '32-bit CMYK', + 0x2c => '40-bit CMYK Alpha', + 0x1f => '64-bit CMYK', + 0x2d => '80-bit CMYK Alpha', + 0x20 => '24-bit 3 Channels', + 0x21 => '32-bit 4 Channels', + 0x22 => '40-bit 5 Channels', + 0x23 => '48-bit 6 Channels', + 0x24 => '56-bit 7 Channels', + 0x25 => '64-bit 8 Channels', + 0x2e => '32-bit 3 Channels Alpha', + 0x2f => '40-bit 4 Channels Alpha', + 0x30 => '48-bit 5 Channels Alpha', + 0x31 => '56-bit 6 Channels Alpha', + 0x32 => '64-bit 7 Channels Alpha', + 0x33 => '72-bit 8 Channels Alpha', + 0x26 => '48-bit 3 Channels', + 0x27 => '64-bit 4 Channels', + 0x28 => '80-bit 5 Channels', + 0x29 => '96-bit 6 Channels', + 0x2a => '112-bit 7 Channels', + 0x2b => '128-bit 8 Channels', + 0x34 => '64-bit 3 Channels Alpha', + 0x35 => '80-bit 4 Channels Alpha', + 0x36 => '96-bit 5 Channels Alpha', + 0x37 => '112-bit 6 Channels Alpha', + 0x38 => '128-bit 7 Channels Alpha', + 0x39 => '144-bit 8 Channels Alpha', + 0x08 => '8-bit Gray', + 0x0b => '16-bit Gray', + 0x13 => '16-bit Gray Fixed Point', + 0x3e => '16-bit Gray Half', + 0x3f => '32-bit Gray Fixed Point', + 0x11 => '32-bit Gray Float', + 0x05 => 'Black & White', + 0x09 => '16-bit BGR555', + 0x0a => '16-bit BGR565', + 0x13 => '32-bit BGR101010', + 0x3d => '32-bit RGBE', + }, + }, + 0xbc02 => { #13 + Name => 'Transformation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Mirror vertical', + 2 => 'Mirror horizontal', + 3 => 'Rotate 180', + 4 => 'Rotate 90 CW', + 5 => 'Mirror horizontal and rotate 90 CW', + 6 => 'Mirror horizontal and rotate 270 CW', + 7 => 'Rotate 270 CW', + }, + }, + 0xbc03 => { #13 + Name => 'Uncompressed', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0xbc04 => { #13 + Name => 'ImageType', + PrintConv => { BITMASK => { + 0 => 'Preview', + 1 => 'Page', + } }, + }, + 0xbc80 => 'ImageWidth', #13 + 0xbc81 => 'ImageHeight', #13 + 0xbc82 => 'WidthResolution', #13 + 0xbc83 => 'HeightResolution', #13 + 0xbcc0 => { #13 + Name => 'ImageOffset', + IsOffset => 1, + OffsetPair => 0xbcc1, # point to associated byte count + }, + 0xbcc1 => { #13 + Name => 'ImageByteCount', + OffsetPair => 0xbcc0, # point to associated offset + }, + 0xbcc2 => { #13 + Name => 'AlphaOffset', + IsOffset => 1, + OffsetPair => 0xbcc3, # point to associated byte count + }, + 0xbcc3 => { #13 + Name => 'AlphaByteCount', + OffsetPair => 0xbcc2, # point to associated offset + }, + 0xbcc4 => { #13 + Name => 'ImageDataDiscard', + PrintConv => { + 0 => 'Full Resolution', + 1 => 'Flexbits Discarded', + 2 => 'HighPass Frequency Data Discarded', + 3 => 'Highpass and LowPass Frequency Data Discarded', + }, + }, + 0xbcc5 => { #13 + Name => 'AlphaDataDiscard', + PrintConv => { + 0 => 'Full Resolution', + 1 => 'Flexbits Discarded', + 2 => 'HighPass Frequency Data Discarded', + 3 => 'Highpass and LowPass Frequency Data Discarded', + }, + }, +# + 0xc427 => 'OceScanjobDesc', #3 + 0xc428 => 'OceApplicationSelector', #3 + 0xc429 => 'OceIDNumber', #3 + 0xc42a => 'OceImageLogic', #3 + 0xc44f => { Name => 'Annotations', Binary => 1 }, #7/19 + 0xc4a5 => { + Name => 'PrintIM', # (writable directory!) + # must set Writable here so this tag will be saved with MakerNotes option + Writable => 'undef', + WriteGroup => 'IFD0', + Binary => 1, + # (don't make Binary/Protected because we can't copy individual PrintIM tags anyway) + Description => 'Print Image Matching', + SubDirectory => { + TagTable => 'Image::ExifTool::PrintIM::Main', + }, + PrintConvInv => '$val =~ /^PrintIM/ ? $val : undef', # quick validation + }, + 0xc51b => { # (Hasselblad H3D) + Name => 'HasselbladExif', + Format => 'undef', + RawConv => q{ + $$self{DOC_NUM} = ++$$self{DOC_COUNT}; + $self->ExtractInfo(\$val, { ReEntry => 1 }); + $$self{DOC_NUM} = 0; + return undef; + }, + }, + 0xc573 => { #PH + Name => 'OriginalFileName', + Notes => 'used by some obscure software', # (possibly Swizzy Photosmacker?) + # (it is a 'string', but obscure, so don't make it writable) + }, + 0xc580 => { #20 + Name => 'USPTOOriginalContentType', + PrintConv => { + 0 => 'Text or Drawing', + 1 => 'Grayscale', + 2 => 'Color', + }, + }, + # 0xc5d8 - found in CR2 images + # 0xc5d9 - found in CR2 images + 0xc5e0 => { #forum8153 (CR2 images) + Name => 'CR2CFAPattern', + ValueConv => { + 1 => '0 1 1 2', + 2 => '2 1 1 0', + 3 => '1 2 0 1', + 4 => '1 0 2 1', + }, + PrintConv => { + '0 1 1 2' => '[Red,Green][Green,Blue]', + '2 1 1 0' => '[Blue,Green][Green,Red]', + '1 2 0 1' => '[Green,Blue][Red,Green]', + '1 0 2 1' => '[Green,Red][Blue,Green]', + }, + }, +# +# DNG tags 0xc6XX, 0xc7XX and 0xcdXX (ref 2 unless otherwise stated) +# + 0xc612 => { + Name => 'DNGVersion', + Notes => q{ + tags 0xc612-0xcd3b are defined by the DNG specification unless otherwise + noted. See L<https://helpx.adobe.com/photoshop/digital-negative.html> for + the specification + }, + Writable => 'int8u', + WriteGroup => 'IFD0', + Count => 4, + Protected => 1, # (confuses Apple Preview if written to a TIFF image) + DataMember => 'DNGVersion', + RawConv => '$$self{DNGVersion} = $val', + PrintConv => '$val =~ tr/ /./; $val', + PrintConvInv => '$val =~ tr/./ /; $val', + }, + 0xc613 => { + Name => 'DNGBackwardVersion', + Writable => 'int8u', + WriteGroup => 'IFD0', + Count => 4, + Protected => 1, + PrintConv => '$val =~ tr/ /./; $val', + PrintConvInv => '$val =~ tr/./ /; $val', + }, + 0xc614 => { + Name => 'UniqueCameraModel', + Writable => 'string', + WriteGroup => 'IFD0', + }, + 0xc615 => { + Name => 'LocalizedCameraModel', + WriteGroup => 'IFD0', + %utf8StringConv, + PrintConv => '$self->Printable($val, 0)', + PrintConvInv => '$val', + }, + 0xc616 => { + Name => 'CFAPlaneColor', + WriteGroup => 'SubIFD', # (only for Validate) + PrintConv => q{ + my @cols = qw(Red Green Blue Cyan Magenta Yellow White); + my @vals = map { $cols[$_] || "Unknown($_)" } split(' ', $val); + return join(',', @vals); + }, + }, + 0xc617 => { + Name => 'CFALayout', + WriteGroup => 'SubIFD', # (only for Validate) + PrintConv => { + 1 => 'Rectangular', + 2 => 'Even columns offset down 1/2 row', + 3 => 'Even columns offset up 1/2 row', + 4 => 'Even rows offset right 1/2 column', + 5 => 'Even rows offset left 1/2 column', + # the following are new for DNG 1.3: + 6 => 'Even rows offset up by 1/2 row, even columns offset left by 1/2 column', + 7 => 'Even rows offset up by 1/2 row, even columns offset right by 1/2 column', + 8 => 'Even rows offset down by 1/2 row, even columns offset left by 1/2 column', + 9 => 'Even rows offset down by 1/2 row, even columns offset right by 1/2 column', + }, + }, + 0xc618 => { + Name => 'LinearizationTable', + Writable => 'int16u', + WriteGroup => 'SubIFD', + Count => -1, + Protected => 1, + Binary => 1, + }, + 0xc619 => { + Name => 'BlackLevelRepeatDim', + Writable => 'int16u', + WriteGroup => 'SubIFD', + Count => 2, + Protected => 1, + }, + 0xc61a => { + Name => 'BlackLevel', + Writable => 'rational64u', + WriteGroup => 'SubIFD', + Count => -1, + Protected => 1, + }, + 0xc61b => { + Name => 'BlackLevelDeltaH', + %longBin, + Writable => 'rational64s', + WriteGroup => 'SubIFD', + Count => -1, + Protected => 1, + }, + 0xc61c => { + Name => 'BlackLevelDeltaV', + %longBin, + Writable => 'rational64s', + WriteGroup => 'SubIFD', + Count => -1, + Protected => 1, + }, + 0xc61d => { + Name => 'WhiteLevel', + Writable => 'int32u', + WriteGroup => 'SubIFD', + Count => -1, + Protected => 1, + }, + 0xc61e => { + Name => 'DefaultScale', + Writable => 'rational64u', + WriteGroup => 'SubIFD', + Count => 2, + Protected => 1, + }, + 0xc61f => { + Name => 'DefaultCropOrigin', + Writable => 'int32u', + WriteGroup => 'SubIFD', + Count => 2, + Protected => 1, + }, + 0xc620 => { + Name => 'DefaultCropSize', + Writable => 'int32u', + WriteGroup => 'SubIFD', + Count => 2, + Protected => 1, + }, + 0xc621 => { + Name => 'ColorMatrix1', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc622 => { + Name => 'ColorMatrix2', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc623 => { + Name => 'CameraCalibration1', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc624 => { + Name => 'CameraCalibration2', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc625 => { + Name => 'ReductionMatrix1', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc626 => { + Name => 'ReductionMatrix2', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc627 => { + Name => 'AnalogBalance', + Writable => 'rational64u', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc628 => { + Name => 'AsShotNeutral', + Writable => 'rational64u', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc629 => { + Name => 'AsShotWhiteXY', + Writable => 'rational64u', + WriteGroup => 'IFD0', + Count => 2, + Protected => 1, + }, + 0xc62a => { + Name => 'BaselineExposure', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Protected => 1, + }, + 0xc62b => { + Name => 'BaselineNoise', + Writable => 'rational64u', + WriteGroup => 'IFD0', + Protected => 1, + }, + 0xc62c => { + Name => 'BaselineSharpness', + Writable => 'rational64u', + WriteGroup => 'IFD0', + Protected => 1, + }, + 0xc62d => { + Name => 'BayerGreenSplit', + Writable => 'int32u', + WriteGroup => 'SubIFD', + Protected => 1, + }, + 0xc62e => { + Name => 'LinearResponseLimit', + Writable => 'rational64u', + WriteGroup => 'IFD0', + Protected => 1, + }, + 0xc62f => { + Name => 'CameraSerialNumber', + Groups => { 2 => 'Camera' }, + Writable => 'string', + WriteGroup => 'IFD0', + }, + 0xc630 => { + Name => 'DNGLensInfo', + Groups => { 2 => 'Camera' }, + Writable => 'rational64u', + WriteGroup => 'IFD0', + Count => 4, + PrintConv =>\&PrintLensInfo, + PrintConvInv => \&ConvertLensInfo, + }, + 0xc631 => { + Name => 'ChromaBlurRadius', + Writable => 'rational64u', + WriteGroup => 'SubIFD', + Protected => 1, + }, + 0xc632 => { + Name => 'AntiAliasStrength', + Writable => 'rational64u', + WriteGroup => 'SubIFD', + Protected => 1, + }, + 0xc633 => { + Name => 'ShadowScale', + Writable => 'rational64u', + WriteGroup => 'IFD0', + Protected => 1, + }, + 0xc634 => [ + { + Condition => '$$self{TIFF_TYPE} =~ /^(ARW|SR2)$/', + Name => 'SR2Private', + Groups => { 1 => 'SR2' }, + Flags => 'SubIFD', + Format => 'int32u', + # some utilities have problems unless this is int8u format: + # - Adobe Camera Raw 5.3 gives an error + # - Apple Preview 10.5.8 gets the wrong white balance + FixFormat => 'int8u', # (stupid Sony) + WriteGroup => 'IFD0', # (for Validate) + SubDirectory => { + DirName => 'SR2Private', + TagTable => 'Image::ExifTool::Sony::SR2Private', + Start => '$val', + }, + }, + { + Condition => '$$valPt =~ /^Adobe\0/', + Name => 'DNGAdobeData', + Flags => [ 'Binary', 'Protected' ], + Writable => 'undef', # (writable directory!) (to make it possible to delete this mess) + WriteGroup => 'IFD0', + NestedHtmlDump => 1, + SubDirectory => { TagTable => 'Image::ExifTool::DNG::AdobeData' }, + Format => 'undef', # but written as int8u (change to undef for speed) + }, + { + # Pentax/Samsung models that write AOC maker notes in JPG images: + # K-5,K-7,K-m,K-x,K-r,K10D,K20D,K100D,K110D,K200D,K2000,GX10,GX20 + # (Note: the following expression also appears in WriteExif.pl) + Condition => q{ + $$valPt =~ /^(PENTAX |SAMSUNG)\0/ and + $$self{Model} =~ /\b(K(-[57mrx]|(10|20|100|110|200)D|2000)|GX(10|20))\b/ + }, + Name => 'MakerNotePentax', + MakerNotes => 1, # (causes "MakerNotes header" to be identified in HtmlDump output) + Binary => 1, + WriteGroup => 'IFD0', # (for Validate) + # Note: Don't make this block-writable for a few reasons: + # 1) It would be dangerous (possibly confusing Pentax software) + # 2) It is a different format from the JPEG version of MakerNotePentax + # 3) It is converted to JPEG format by RebuildMakerNotes() when copying + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::Main', + Start => '$valuePtr + 10', + Base => '$start - 10', + ByteOrder => 'Unknown', # easier to do this than read byteorder word + }, + Format => 'undef', # but written as int8u (change to undef for speed) + }, + { + # must duplicate the above tag with a different name for more recent + # Pentax models which use the "PENTAX" instead of the "AOC" maker notes + # in JPG images (needed when copying maker notes from DNG to JPG) + Condition => '$$valPt =~ /^(PENTAX |SAMSUNG)\0/', + Name => 'MakerNotePentax5', + MakerNotes => 1, + Binary => 1, + WriteGroup => 'IFD0', # (for Validate) + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::Main', + Start => '$valuePtr + 10', + Base => '$start - 10', + ByteOrder => 'Unknown', + }, + Format => 'undef', + }, + { + # Ricoh models such as the GR III + Condition => '$$valPt =~ /^RICOH\0(II|MM)/', + Name => 'MakerNoteRicohPentax', + MakerNotes => 1, + Binary => 1, + WriteGroup => 'IFD0', # (for Validate) + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::Main', + Start => '$valuePtr + 8', + Base => '$start - 8', + ByteOrder => 'Unknown', + }, + Format => 'undef', + }, + # the DJI FC2103 writes some interesting stuff here (with sections labelled + # awb_dbg_info, ae_dbg_info, ae_histogram_info, af_dbg_info, hiso, xidiri) - PH + { + Name => 'MakerNoteDJIInfo', + Condition => '$$valPt =~ /^\[ae_dbg_info:/', + MakerNotes => 1, + Binary => 1, + WriteGroup => 'IFD0', # (for Validate) + SubDirectory => { TagTable => 'Image::ExifTool::DJI::Info' }, + Format => 'undef', + }, + { + Name => 'DNGPrivateData', + Flags => [ 'Binary', 'Protected' ], + Format => 'undef', + Writable => 'int8u', + WriteGroup => 'IFD0', + }, + ], + 0xc635 => { + Name => 'MakerNoteSafety', + Writable => 'int16u', + WriteGroup => 'IFD0', + PrintConv => { + 0 => 'Unsafe', + 1 => 'Safe', + }, + }, + 0xc640 => { #15 + Name => 'RawImageSegmentation', + # (int16u[3], not writable) + Notes => q{ + used in segmented Canon CR2 images. 3 numbers: 1. Number of segments minus + one; 2. Pixel width of segments except last; 3. Pixel width of last segment + }, + }, + 0xc65a => { + Name => 'CalibrationIlluminant1', + Writable => 'int16u', + WriteGroup => 'IFD0', + Protected => 1, + SeparateTable => 'LightSource', + PrintConv => \%lightSource, + }, + 0xc65b => { + Name => 'CalibrationIlluminant2', + Writable => 'int16u', + WriteGroup => 'IFD0', + Protected => 1, + SeparateTable => 'LightSource', + PrintConv => \%lightSource, + }, + 0xc65c => { + Name => 'BestQualityScale', + Writable => 'rational64u', + WriteGroup => 'SubIFD', + Protected => 1, + }, + 0xc65d => { + Name => 'RawDataUniqueID', + Format => 'undef', + Writable => 'int8u', + WriteGroup => 'IFD0', + Count => 16, + Protected => 1, + ValueConv => 'uc(unpack("H*",$val))', + ValueConvInv => 'pack("H*", $val)', + }, + 0xc660 => { #3 + Name => 'AliasLayerMetadata', + Notes => 'used by Alias Sketchbook Pro', + }, + 0xc68b => { + Name => 'OriginalRawFileName', + WriteGroup => 'IFD0', + Protected => 1, + %utf8StringConv, + }, + 0xc68c => { + Name => 'OriginalRawFileData', # (writable directory!) + Writable => 'undef', # must be defined here so tag will be extracted if specified + WriteGroup => 'IFD0', + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { + TagTable => 'Image::ExifTool::DNG::OriginalRaw', + }, + }, + 0xc68d => { + Name => 'ActiveArea', + Writable => 'int32u', + WriteGroup => 'SubIFD', + Count => 4, + Protected => 1, + }, + 0xc68e => { + Name => 'MaskedAreas', + Writable => 'int32u', + WriteGroup => 'SubIFD', + Count => -1, + Protected => 1, + }, + 0xc68f => { + Name => 'AsShotICCProfile', # (writable directory) + Binary => 1, + Writable => 'undef', # must be defined here so tag will be extracted if specified + WriteGroup => 'IFD0', + Protected => 1, + WriteCheck => q{ + require Image::ExifTool::ICC_Profile; + return Image::ExifTool::ICC_Profile::ValidateICC(\$val); + }, + SubDirectory => { + DirName => 'AsShotICCProfile', + TagTable => 'Image::ExifTool::ICC_Profile::Main', + }, + }, + 0xc690 => { + Name => 'AsShotPreProfileMatrix', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc691 => { + Name => 'CurrentICCProfile', # (writable directory) + Binary => 1, + Writable => 'undef', # must be defined here so tag will be extracted if specified + SubDirectory => { + DirName => 'CurrentICCProfile', + TagTable => 'Image::ExifTool::ICC_Profile::Main', + }, + Writable => 'undef', + WriteGroup => 'IFD0', + Protected => 1, + WriteCheck => q{ + require Image::ExifTool::ICC_Profile; + return Image::ExifTool::ICC_Profile::ValidateICC(\$val); + }, + }, + 0xc692 => { + Name => 'CurrentPreProfileMatrix', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc6bf => { + Name => 'ColorimetricReference', + Writable => 'int16u', + WriteGroup => 'IFD0', + Protected => 1, + }, + 0xc6c5 => { Name => 'SRawType', Description => 'SRaw Type', WriteGroup => 'IFD0' }, #exifprobe (CR2 proprietary) + 0xc6d2 => { #JD (Panasonic DMC-TZ5) + # this text is UTF-8 encoded (hooray!) - PH (TZ5) + Name => 'PanasonicTitle', + Format => 'string', # written incorrectly as 'undef' + Notes => 'proprietary Panasonic tag used for baby/pet name, etc', + Writable => 'undef', + WriteGroup => 'IFD0', + # panasonic always records this tag (64 zero bytes), + # so ignore it unless it contains valid information + RawConv => 'length($val) ? $val : undef', + ValueConv => '$self->Decode($val, "UTF8")', + ValueConvInv => '$self->Encode($val,"UTF8")', + }, + 0xc6d3 => { #PH (Panasonic DMC-FS7) + Name => 'PanasonicTitle2', + Format => 'string', # written incorrectly as 'undef' + Notes => 'proprietary Panasonic tag used for baby/pet name with age', + Writable => 'undef', + WriteGroup => 'IFD0', + # panasonic always records this tag (128 zero bytes), + # so ignore it unless it contains valid information + RawConv => 'length($val) ? $val : undef', + ValueConv => '$self->Decode($val, "UTF8")', + ValueConvInv => '$self->Encode($val,"UTF8")', + }, + # 0xc6dc - int32u[4]: found in CR2 images (PH, 7DmkIII) + # 0xc6dd - int16u[256]: found in CR2 images (PH, 5DmkIV) + 0xc6f3 => { + Name => 'CameraCalibrationSig', + WriteGroup => 'IFD0', + Protected => 1, + %utf8StringConv, + }, + 0xc6f4 => { + Name => 'ProfileCalibrationSig', + WriteGroup => 'IFD0', + Protected => 1, + %utf8StringConv, + }, + 0xc6f5 => { + Name => 'ProfileIFD', # (ExtraCameraProfiles) + Groups => { 1 => 'ProfileIFD' }, + Flags => 'SubIFD', + WriteGroup => 'IFD0', # (only for Validate) + SubDirectory => { + ProcessProc => \&ProcessTiffIFD, + WriteProc => \&ProcessTiffIFD, + DirName => 'ProfileIFD', + Start => '$val', + Base => '$start', # offsets relative to start of TIFF-like header + MaxSubdirs => 10, + Magic => 0x4352, # magic number for TIFF-like header + }, + }, + 0xc6f6 => { + Name => 'AsShotProfileName', + WriteGroup => 'IFD0', + Protected => 1, + %utf8StringConv, + }, + 0xc6f7 => { + Name => 'NoiseReductionApplied', + Writable => 'rational64u', + WriteGroup => 'SubIFD', + Protected => 1, + }, + 0xc6f8 => { + Name => 'ProfileName', + WriteGroup => 'IFD0', + Protected => 1, + %utf8StringConv, + }, + 0xc6f9 => { + Name => 'ProfileHueSatMapDims', + Writable => 'int32u', + WriteGroup => 'IFD0', + Count => 3, + Protected => 1, + }, + 0xc6fa => { + Name => 'ProfileHueSatMapData1', + %longBin, + Writable => 'float', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc6fb => { + Name => 'ProfileHueSatMapData2', + %longBin, + Writable => 'float', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc6fc => { + Name => 'ProfileToneCurve', + %longBin, + Writable => 'float', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc6fd => { + Name => 'ProfileEmbedPolicy', + Writable => 'int32u', + WriteGroup => 'IFD0', + Protected => 1, + PrintConv => { + 0 => 'Allow Copying', + 1 => 'Embed if Used', + 2 => 'Never Embed', + 3 => 'No Restrictions', + }, + }, + 0xc6fe => { + Name => 'ProfileCopyright', + WriteGroup => 'IFD0', + Protected => 1, + %utf8StringConv, + }, + 0xc714 => { + Name => 'ForwardMatrix1', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc715 => { + Name => 'ForwardMatrix2', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc716 => { + Name => 'PreviewApplicationName', + WriteGroup => 'IFD0', + Protected => 1, + %utf8StringConv, + }, + 0xc717 => { + Name => 'PreviewApplicationVersion', + Writable => 'string', + WriteGroup => 'IFD0', + Protected => 1, + %utf8StringConv, + }, + 0xc718 => { + Name => 'PreviewSettingsName', + Writable => 'string', + WriteGroup => 'IFD0', + Protected => 1, + %utf8StringConv, + }, + 0xc719 => { + Name => 'PreviewSettingsDigest', + Format => 'undef', + Writable => 'int8u', + WriteGroup => 'IFD0', + Protected => 1, + ValueConv => 'unpack("H*", $val)', + ValueConvInv => 'pack("H*", $val)', + }, + 0xc71a => { + Name => 'PreviewColorSpace', + Writable => 'int32u', + WriteGroup => 'IFD0', + Protected => 1, + PrintConv => { + 0 => 'Unknown', + 1 => 'Gray Gamma 2.2', + 2 => 'sRGB', + 3 => 'Adobe RGB', + 4 => 'ProPhoto RGB', + }, + }, + 0xc71b => { + Name => 'PreviewDateTime', + Groups => { 2 => 'Time' }, + Writable => 'string', + Shift => 'Time', + WriteGroup => 'IFD0', + Protected => 1, + ValueConv => q{ + require Image::ExifTool::XMP; + return Image::ExifTool::XMP::ConvertXMPDate($val); + }, + ValueConvInv => q{ + require Image::ExifTool::XMP; + return Image::ExifTool::XMP::FormatXMPDate($val); + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,1,1)', + }, + 0xc71c => { + Name => 'RawImageDigest', + Format => 'undef', + Writable => 'int8u', + WriteGroup => 'IFD0', + Count => 16, + Protected => 1, + ValueConv => 'unpack("H*", $val)', + ValueConvInv => 'pack("H*", $val)', + }, + 0xc71d => { + Name => 'OriginalRawFileDigest', + Format => 'undef', + Writable => 'int8u', + WriteGroup => 'IFD0', + Count => 16, + Protected => 1, + ValueConv => 'unpack("H*", $val)', + ValueConvInv => 'pack("H*", $val)', + }, + 0xc71e => 'SubTileBlockSize', + 0xc71f => 'RowInterleaveFactor', + 0xc725 => { + Name => 'ProfileLookTableDims', + Writable => 'int32u', + WriteGroup => 'IFD0', + Count => 3, + Protected => 1, + }, + 0xc726 => { + Name => 'ProfileLookTableData', + %longBin, + Writable => 'float', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xc740 => { Name => 'OpcodeList1', %opcodeInfo }, # DNG 1.3 + 0xc741 => { Name => 'OpcodeList2', %opcodeInfo }, # DNG 1.3 + 0xc74e => { Name => 'OpcodeList3', %opcodeInfo }, # DNG 1.3 + 0xc761 => { # DNG 1.3 + Name => 'NoiseProfile', + Writable => 'double', + WriteGroup => 'SubIFD', + Count => -1, + Protected => 1, + }, + 0xc763 => { #28 + Name => 'TimeCodes', + Writable => 'int8u', + WriteGroup => 'IFD0', + Count => -1, # (8 * number of time codes, max 10) + ValueConv => q{ + my @a = split ' ', $val; + my @v; + push @v, join('.', map { sprintf('%.2x',$_) } splice(@a,0,8)) while @a >= 8; + join ' ', @v; + }, + ValueConvInv => q{ + my @a = map hex, split /[. ]+/, $val; + join ' ', @a; + }, + # Note: Currently ignore the flags: + # byte 0 0x80 - color frame + # byte 0 0x40 - drop frame + # byte 1 0x80 - field phase + PrintConv => q{ + my @a = map hex, split /[. ]+/, $val; + my @v; + while (@a >= 8) { + my $str = sprintf("%.2x:%.2x:%.2x.%.2x", $a[3]&0x3f, + $a[2]&0x7f, $a[1]&0x7f, $a[0]&0x3f); + if ($a[3] & 0x80) { # date+timezone exist if BGF2 is set + my $tz = $a[7] & 0x3f; + my $bz = sprintf('%.2x', $tz); + $bz = 100 if $bz =~ /[a-f]/i; # not BCD + if ($bz < 26) { + $tz = ($bz < 13 ? 0 : 26) - $bz; + } elsif ($bz == 32) { + $tz = 12.75; + } elsif ($bz >= 28 and $bz <= 31) { + $tz = 0; # UTC + } elsif ($bz < 100) { + undef $tz; # undefined or user-defined + } elsif ($tz < 0x20) { + $tz = (($tz < 0x10 ? 10 : 20) - $tz) - 0.5; + } else { + $tz = (($tz < 0x30 ? 53 : 63) - $tz) + 0.5; + } + if ($a[7] & 0x80) { # MJD format (/w UTC time) + my ($h,$m,$s,$f) = split /[:.]/, $str; + my $jday = sprintf('%x%.2x%.2x', reverse @a[4..6]); + $str = ConvertUnixTime(($jday - 40587) * 24 * 3600 + + ((($h+$tz) * 60) + $m) * 60 + $s) . ".$f"; + $str =~ s/^(\d+):(\d+):(\d+) /$1-$2-${3}T/; + } else { # YYMMDD (Note: CinemaDNG 1.1 example seems wrong) + my $yr = sprintf('%.2x',$a[6]) + 1900; + $yr += 100 if $yr < 1970; + $str = sprintf('%d-%.2x-%.2xT%s',$yr,$a[5],$a[4],$str); + } + $str .= TimeZoneString($tz*60) if defined $tz; + } + push @v, $str; + splice @a, 0, 8; + } + join ' ', @v; + }, + PrintConvInv => q{ + my @a = split ' ', $val; + my @v; + foreach (@a) { + my @td = reverse split /T/; + my $tz = 0x39; # default to unknown timezone + if ($td[0] =~ s/([-+])(\d+):(\d+)$//) { + if ($3 == 0) { + $tz = hex(($1 eq '-') ? $2 : 0x26 - $2); + } elsif ($3 == 30) { + if ($1 eq '-') { + $tz = $2 + 0x0a; + $tz += 0x0a if $tz > 0x0f; + } else { + $tz = 0x3f - $2; + $tz -= 0x0a if $tz < 0x3a; + } + } elsif ($3 == 45) { + $tz = 0x32 if $1 eq '+' and $2 == 12; + } + } + my @t = split /[:.]/, $td[0]; + push @t, '00' while @t < 4; + my $bg; + if ($td[1]) { + # date was specified: fill in date & timezone + my @d = split /[-]/, $td[1]; + next if @d < 3; + $bg = sprintf('.%.2d.%.2d.%.2d.%.2x', $d[2], $d[1], $d[0]%100, $tz); + $t[0] = sprintf('%.2x', hex($t[0]) + 0xc0); # set BGF1+BGF2 + } else { # time only + $bg = '.00.00.00.00'; + } + push @v, join('.', reverse(@t[0..3])) . $bg; + } + join ' ', @v; + }, + }, + 0xc764 => { #28 + Name => 'FrameRate', + Writable => 'rational64s', + WriteGroup => 'IFD0', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + PrintConvInv => '$val', + }, + 0xc772 => { #28 + Name => 'TStop', + Writable => 'rational64u', + WriteGroup => 'IFD0', + Count => -1, # (1 or 2) + PrintConv => 'join("-", map { sprintf("%.2f",$_) } split " ", $val)', + PrintConvInv => '$val=~tr/-/ /; $val', + }, + 0xc789 => { #28 + Name => 'ReelName', + Writable => 'string', + WriteGroup => 'IFD0', + }, + 0xc791 => { # DNG 1.4 + Name => 'OriginalDefaultFinalSize', + Writable => 'int32u', + WriteGroup => 'IFD0', + Count => 2, + Protected => 1, + }, + 0xc792 => { # DNG 1.4 + Name => 'OriginalBestQualitySize', + Notes => 'called OriginalBestQualityFinalSize by the DNG spec', + Writable => 'int32u', + WriteGroup => 'IFD0', + Count => 2, + Protected => 1, + }, + 0xc793 => { # DNG 1.4 + Name => 'OriginalDefaultCropSize', + Writable => 'rational64u', + WriteGroup => 'IFD0', + Count => 2, + Protected => 1, + }, + 0xc7a1 => { #28 + Name => 'CameraLabel', + Writable => 'string', + WriteGroup => 'IFD0', + }, + 0xc7a3 => { # DNG 1.4 + Name => 'ProfileHueSatMapEncoding', + Writable => 'int32u', + WriteGroup => 'IFD0', + Protected => 1, + PrintConv => { + 0 => 'Linear', + 1 => 'sRGB', + }, + }, + 0xc7a4 => { # DNG 1.4 + Name => 'ProfileLookTableEncoding', + Writable => 'int32u', + WriteGroup => 'IFD0', + Protected => 1, + PrintConv => { + 0 => 'Linear', + 1 => 'sRGB', + }, + }, + 0xc7a5 => { # DNG 1.4 + Name => 'BaselineExposureOffset', + Writable => 'rational64s', # (incorrectly "RATIONAL" in DNG 1.4 spec) + WriteGroup => 'IFD0', + Protected => 1, + }, + 0xc7a6 => { # DNG 1.4 + Name => 'DefaultBlackRender', + Writable => 'int32u', + WriteGroup => 'IFD0', + Protected => 1, + PrintConv => { + 0 => 'Auto', + 1 => 'None', + }, + }, + 0xc7a7 => { # DNG 1.4 + Name => 'NewRawImageDigest', + Format => 'undef', + Writable => 'int8u', + WriteGroup => 'IFD0', + Count => 16, + Protected => 1, + ValueConv => 'unpack("H*", $val)', + ValueConvInv => 'pack("H*", $val)', + }, + 0xc7a8 => { # DNG 1.4 + Name => 'RawToPreviewGain', + Writable => 'double', + WriteGroup => 'IFD0', + Protected => 1, + }, + # 0xc7a9 - CacheBlob (ref 31) + 0xc7aa => { #31 undocumented DNG tag written by LR4 (val=256, related to fast load data?) + Name => 'CacheVersion', + Writable => 'int32u', + WriteGroup => 'SubIFD2', + Format => 'int8u', + Count => 4, + Protected => 1, + PrintConv => '$val =~ tr/ /./; $val', + PrintConvInv => '$val =~ tr/./ /; $val', + }, + 0xc7b5 => { # DNG 1.4 + Name => 'DefaultUserCrop', + Writable => 'rational64u', + WriteGroup => 'SubIFD', + Count => 4, + Protected => 1, + }, + 0xc7d5 => { #PH (in SubIFD1 of Nikon Z6/Z7 NEF images) + Name => 'NikonNEFInfo', + Condition => '$$valPt =~ /^Nikon\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::NEFInfo', + Start => '$valuePtr + 18', + Base => '$start - 8', + ByteOrder => 'Unknown', + }, + }, + # 0xc7d6 - int8u: 1 (SubIFD1 of Nikon Z6/Z7 NEF) + 0xc7e9 => { # DNG 1.5 + Name => 'DepthFormat', + Writable => 'int16u', + Notes => 'tags 0xc7e9-0xc7ee added by DNG 1.5.0.0', + Protected => 1, + WriteGroup => 'IFD0', + PrintConv => { + 0 => 'Unknown', + 1 => 'Linear', + 2 => 'Inverse', + }, + }, + 0xc7ea => { # DNG 1.5 + Name => 'DepthNear', + Writable => 'rational64u', + Protected => 1, + WriteGroup => 'IFD0', + }, + 0xc7eb => { # DNG 1.5 + Name => 'DepthFar', + Writable => 'rational64u', + Protected => 1, + WriteGroup => 'IFD0', + }, + 0xc7ec => { # DNG 1.5 + Name => 'DepthUnits', + Writable => 'int16u', + Protected => 1, + WriteGroup => 'IFD0', + PrintConv => { + 0 => 'Unknown', + 1 => 'Meters', + }, + }, + 0xc7ed => { # DNG 1.5 + Name => 'DepthMeasureType', + Writable => 'int16u', + Protected => 1, + WriteGroup => 'IFD0', + PrintConv => { + 0 => 'Unknown', + 1 => 'Optical Axis', + 2 => 'Optical Ray', + }, + }, + 0xc7ee => { # DNG 1.5 + Name => 'EnhanceParams', + Writable => 'string', + Protected => 1, + WriteGroup => 'IFD0', + }, + 0xcd2d => { # DNG 1.6 + Name => 'ProfileGainTableMap', + Writable => 'undef', + WriteGroup => 'SubIFD', + Protected => 1, + Binary => 1, + }, + 0xcd2e => { # DNG 1.6 + Name => 'SemanticName', + # Writable => 'string', + WriteGroup => 'SubIFD' #? (NC) Semantic Mask IFD (only for Validate) + }, + 0xcd30 => { # DNG 1.6 + Name => 'SemanticInstanceIFD', + # Writable => 'string', + WriteGroup => 'SubIFD' #? (NC) Semantic Mask IFD (only for Validate) + }, + 0xcd31 => { # DNG 1.6 + Name => 'CalibrationIlluminant3', + Writable => 'int16u', + WriteGroup => 'IFD0', + Protected => 1, + SeparateTable => 'LightSource', + PrintConv => \%lightSource, + }, + 0xcd32 => { # DNG 1.6 + Name => 'CameraCalibration3', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xcd33 => { # DNG 1.6 + Name => 'ColorMatrix3', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xcd34 => { # DNG 1.6 + Name => 'ForwardMatrix3', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xcd35 => { # DNG 1.6 + Name => 'IlluminantData1', + Writable => 'undef', + WriteGroup => 'IFD0', + Protected => 1, + }, + 0xcd36 => { # DNG 1.6 + Name => 'IlluminantData2', + Writable => 'undef', + WriteGroup => 'IFD0', + Protected => 1, + }, + 0xcd37 => { # DNG 1.6 + Name => 'IlluminantData3', + Writable => 'undef', + WriteGroup => 'IFD0', + Protected => 1, + }, + 0xcd38 => { # DNG 1.6 + Name => 'MaskSubArea', + # Writable => 'int32u', + WriteGroup => 'SubIFD', #? (NC) Semantic Mask IFD (only for Validate) + Count => 4, + }, + 0xcd39 => { # DNG 1.6 + Name => 'ProfileHueSatMapData3', + %longBin, + Writable => 'float', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xcd3a => { # DNG 1.6 + Name => 'ReductionMatrix3', + Writable => 'rational64s', + WriteGroup => 'IFD0', + Count => -1, + Protected => 1, + }, + 0xcd3b => { # DNG 1.6 + Name => 'RGBTables', + Writable => 'undef', + WriteGroup => 'IFD0', + Protected => 1, + }, + 0xea1c => { #13 + Name => 'Padding', + Binary => 1, + Protected => 1, + Writable => 'undef', + # must start with 0x1c 0xea by the WM Photo specification + # (not sure what should happen if padding is only 1 byte) + # (why does MicrosoftPhoto write "1c ea 00 00 00 08"?) + RawConvInv => '$val=~s/^../\x1c\xea/s; $val', + }, + 0xea1d => { + Name => 'OffsetSchema', + Notes => "Microsoft's ill-conceived maker note offset difference", + Protected => 1, + Writable => 'int32s', + # From the Microsoft documentation: + # + # Any time the "Maker Note" is relocated by Windows, the Exif MakerNote + # tag (37500) is updated automatically to reference the new location. In + # addition, Windows records the offset (or difference) between the old and + # new locations in the Exif OffsetSchema tag (59933). If the "Maker Note" + # contains relative references, the developer can add the value in + # OffsetSchema to the original references to find the correct information. + # + # My recommendation is for other developers to ignore this tag because the + # information it contains is unreliable. It will be wrong if the image has + # been subsequently edited by another application that doesn't recognize the + # new Microsoft tag. + # + # The new tag unfortunately only gives the difference between the new maker + # note offset and the original offset. Instead, it should have been designed + # to store the original offset. The new offset may change if the image is + # edited, which will invalidate the tag as currently written. If instead the + # original offset had been stored, the new difference could be easily + # calculated because the new maker note offset is known. + # + # I exchanged emails with a Microsoft technical representative, pointing out + # this problem shortly after they released the update (Feb 2007), but so far + # they have taken no steps to address this. + }, + # 0xefee - int16u: 0 - seen this from a WIC-scanned image + + # tags in the range 0xfde8-0xfe58 have been observed in PS7 files + # generated from RAW images. They are all strings with the + # tag name at the start of the string. To accommodate these types + # of tags, all tags with values above 0xf000 are handled specially + # by ProcessExif(). + 0xfde8 => { + Name => 'OwnerName', + Condition => '$$self{TIFF_TYPE} ne "DCR"', # (used for another purpose in Kodak DCR images) + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"Owner's Name: $val"}, + Notes => q{ + tags 0xfde8-0xfdea and 0xfe4c-0xfe58 are generated by Photoshop Camera RAW. + Some names are the same as other EXIF tags, but ExifTool will avoid writing + these unless they already exist in the file + }, + }, + 0xfde9 => { + Name => 'SerialNumber', + Condition => '$$self{TIFF_TYPE} ne "DCR"', # (used for another purpose in Kodak DCR SubIFD) + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"Serial Number: $val"}, + }, + 0xfdea => { + Name => 'Lens', + Condition => '$$self{TIFF_TYPE} ne "DCR"', # (used for another purpose in Kodak DCR SubIFD) + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"Lens: $val"}, + }, + 0xfe4c => { + Name => 'RawFile', + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"Raw File: $val"}, + }, + 0xfe4d => { + Name => 'Converter', + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"Converter: $val"}, + }, + 0xfe4e => { + Name => 'WhiteBalance', + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"White Balance: $val"}, + }, + 0xfe51 => { + Name => 'Exposure', + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"Exposure: $val"}, + }, + 0xfe52 => { + Name => 'Shadows', + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"Shadows: $val"}, + }, + 0xfe53 => { + Name => 'Brightness', + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"Brightness: $val"}, + }, + 0xfe54 => { + Name => 'Contrast', + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"Contrast: $val"}, + }, + 0xfe55 => { + Name => 'Saturation', + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"Saturation: $val"}, + }, + 0xfe56 => { + Name => 'Sharpness', + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"Sharpness: $val"}, + }, + 0xfe57 => { + Name => 'Smoothness', + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"Smoothness: $val"}, + }, + 0xfe58 => { + Name => 'MoireFilter', + Avoid => 1, + PSRaw => 1, + Writable => 'string', + ValueConv => '$val=~s/^.*: //;$val', + ValueConvInv => q{"Moire Filter: $val"}, + }, + + #------------- + 0xfe00 => { + Name => 'KDC_IFD', + Groups => { 1 => 'KDC_IFD' }, + Flags => 'SubIFD', + Notes => 'used in some Kodak KDC images', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::KDC_IFD', + DirName => 'KDC_IFD', + Start => '$val', + }, + }, +); + +# conversions for Composite SubSec date/time tags +my %subSecConv = ( + # @val array: 0) date/time, 1) sub-seconds, 2) time zone offset + RawConv => q{ + my $v; + if (defined $val[1] and $val[1]=~/^(\d+)/) { + my $subSec = $1; + # be careful here just in case the time already contains sub-seconds or a timezone (contrary to spec) + undef $v unless ($v = $val[0]) =~ s/( \d{2}:\d{2}:\d{2})(?!\.\d+)/$1\.$subSec/; + } + if (defined $val[2] and $val[0]!~/[-+]/ and $val[2]=~/^([-+])(\d{1,2}):(\d{2})/) { + $v = ($v || $val[0]) . sprintf('%s%.2d:%.2d', $1, $2, $3); + } + return $v; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', +); + +# EXIF Composite tags (plus other more general Composite tags) +%Image::ExifTool::Exif::Composite = ( + GROUPS => { 2 => 'Image' }, + ImageSize => { + Require => { + 0 => 'ImageWidth', + 1 => 'ImageHeight', + }, + Desire => { + 2 => 'ExifImageWidth', + 3 => 'ExifImageHeight', + 4 => 'RawImageCroppedSize', # (FujiFilm RAF images) + }, + # use ExifImageWidth/Height only for Canon and Phase One TIFF-base RAW images + ValueConv => q{ + return $val[4] if $val[4]; + return "$val[2] $val[3]" if $val[2] and $val[3] and + $$self{TIFF_TYPE} =~ /^(CR2|Canon 1D RAW|IIQ|EIP)$/; + return "$val[0] $val[1]" if IsFloat($val[0]) and IsFloat($val[1]); + return undef; + }, + PrintConv => '$val =~ tr/ /x/; $val', + }, + Megapixels => { + Require => 'ImageSize', + ValueConv => 'my @d = ($val =~ /\d+/g); $d[0] * $d[1] / 1000000', + PrintConv => 'sprintf("%.*f", ($val >= 1 ? 1 : ($val >= 0.001 ? 3 : 6)), $val)', + }, + # pick the best shutter speed value + ShutterSpeed => { + Desire => { + 0 => 'ExposureTime', + 1 => 'ShutterSpeedValue', + 2 => 'BulbDuration', + }, + ValueConv => '($val[2] and $val[2]>0) ? $val[2] : (defined($val[0]) ? $val[0] : $val[1])', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + Aperture => { + Desire => { + 0 => 'FNumber', + 1 => 'ApertureValue', + }, + RawConv => '($val[0] || $val[1]) ? $val : undef', + ValueConv => '$val[0] || $val[1]', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + }, + LightValue => { + Notes => q{ + calculated LV = 2 * log2(Aperture) - log2(ShutterSpeed) - log2(ISO/100); + similar to exposure value but normalized to ISO 100 + }, + Require => { + 0 => 'Aperture', + 1 => 'ShutterSpeed', + 2 => 'ISO', + }, + ValueConv => 'Image::ExifTool::Exif::CalculateLV($val[0],$val[1],$prt[2])', + PrintConv => 'sprintf("%.1f",$val)', + }, + FocalLength35efl => { #26/PH + Description => 'Focal Length', + Notes => 'this value may be incorrect if the image has been resized', + Groups => { 2 => 'Camera' }, + Require => { + 0 => 'FocalLength', + }, + Desire => { + 1 => 'ScaleFactor35efl', + }, + ValueConv => 'ToFloat(@val); ($val[0] || 0) * ($val[1] || 1)', + PrintConv => '$val[1] ? sprintf("%.1f mm (35 mm equivalent: %.1f mm)", $val[0], $val) : sprintf("%.1f mm", $val)', + }, + ScaleFactor35efl => { #26/PH + Description => 'Scale Factor To 35 mm Equivalent', + Notes => q{ + this value and any derived values may be incorrect if the image has been + resized + }, + Groups => { 2 => 'Camera' }, + Desire => { + 0 => 'FocalLength', + 1 => 'FocalLengthIn35mmFormat', + 2 => 'Composite:DigitalZoom', + 3 => 'FocalPlaneDiagonal', + 4 => 'SensorSize', + 5 => 'FocalPlaneXSize', + 6 => 'FocalPlaneYSize', + 7 => 'FocalPlaneResolutionUnit', + 8 => 'FocalPlaneXResolution', + 9 => 'FocalPlaneYResolution', + 10 => 'ExifImageWidth', + 11 => 'ExifImageHeight', + 12 => 'CanonImageWidth', + 13 => 'CanonImageHeight', + 14 => 'ImageWidth', + 15 => 'ImageHeight', + }, + ValueConv => 'Image::ExifTool::Exif::CalcScaleFactor35efl($self, @val)', + PrintConv => 'sprintf("%.1f", $val)', + }, + CircleOfConfusion => { + Notes => q{ + calculated as D/1440, where D is the focal plane diagonal in mm. This value + may be incorrect if the image has been resized + }, + Groups => { 2 => 'Camera' }, + Require => 'ScaleFactor35efl', + ValueConv => 'sqrt(24*24+36*36) / ($val * 1440)', + PrintConv => 'sprintf("%.3f mm",$val)', + }, + HyperfocalDistance => { + Notes => 'this value may be incorrect if the image has been resized', + Groups => { 2 => 'Camera' }, + Require => { + 0 => 'FocalLength', + 1 => 'Aperture', + 2 => 'CircleOfConfusion', + }, + ValueConv => q{ + ToFloat(@val); + return 'inf' unless $val[1] and $val[2]; + return $val[0] * $val[0] / ($val[1] * $val[2] * 1000); + }, + PrintConv => 'sprintf("%.2f m", $val)', + }, + DOF => { + Description => 'Depth Of Field', + Notes => 'this value may be incorrect if the image has been resized', + Require => { + 0 => 'FocalLength', + 1 => 'Aperture', + 2 => 'CircleOfConfusion', + }, + Desire => { + 3 => 'FocusDistance', # focus distance in metres (0 is infinity) + 4 => 'SubjectDistance', + 5 => 'ObjectDistance', + 6 => 'ApproximateFocusDistance', + 7 => 'FocusDistanceLower', + 8 => 'FocusDistanceUpper', + }, + ValueConv => q{ + ToFloat(@val); + my ($d, $f) = ($val[3], $val[0]); + if (defined $d) { + $d or $d = 1e10; # (use large number for infinity) + } else { + $d = $val[4] || $val[5] || $val[6]; + unless (defined $d) { + return undef unless defined $val[7] and defined $val[8]; + $d = ($val[7] + $val[8]) / 2; + } + } + return 0 unless $f and $val[2]; + my $t = $val[1] * $val[2] * ($d * 1000 - $f) / ($f * $f); + my @v = ($d / (1 + $t), $d / (1 - $t)); + $v[1] < 0 and $v[1] = 0; # 0 means 'inf' + return join(' ',@v); + }, + PrintConv => q{ + $val =~ tr/,/./; # in case locale is whacky + my @v = split ' ', $val; + $v[1] or return sprintf("inf (%.2f m - inf)", $v[0]); + my $dof = $v[1] - $v[0]; + my $fmt = ($dof>0 and $dof<0.02) ? "%.3f" : "%.2f"; + return sprintf("$fmt m ($fmt - $fmt m)",$dof,$v[0],$v[1]); + }, + }, + FOV => { + Description => 'Field Of View', + Notes => q{ + calculated for the long image dimension. This value may be incorrect for + fisheye lenses, or if the image has been resized + }, + Require => { + 0 => 'FocalLength', + 1 => 'ScaleFactor35efl', + }, + Desire => { + 2 => 'FocusDistance', # (multiply by 1000 to convert to mm) + }, + # ref http://www.bobatkins.com/photography/technical/field_of_view.html + # (calculations below apply to rectilinear lenses only, not fisheye) + ValueConv => q{ + ToFloat(@val); + return undef unless $val[0] and $val[1]; + my $corr = 1; + if ($val[2]) { + my $d = 1000 * $val[2] - $val[0]; + $corr += $val[0]/$d if $d > 0; + } + my $fd2 = atan2(36, 2*$val[0]*$val[1]*$corr); + my @fov = ( $fd2 * 360 / 3.14159 ); + if ($val[2] and $val[2] > 0 and $val[2] < 10000) { + push @fov, 2 * $val[2] * sin($fd2) / cos($fd2); + } + return join(' ', @fov); + }, + PrintConv => q{ + my @v = split(' ',$val); + my $str = sprintf("%.1f deg", $v[0]); + $str .= sprintf(" (%.2f m)", $v[1]) if $v[1]; + return $str; + }, + }, + # generate DateTimeOriginal from Date and Time Created if not extracted already + DateTimeOriginal => { + Condition => 'not defined $$self{VALUE}{DateTimeOriginal}', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Desire => { + 0 => 'DateTimeCreated', + 1 => 'DateCreated', + 2 => 'TimeCreated', + }, + RawConv => '($val[1] and $val[2]) ? $val : undef', + ValueConv => q{ + return $val[0] if $val[0] and $val[0]=~/ /; + return "$val[1] $val[2]"; + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + ThumbnailImage => { + Groups => { 0 => 'EXIF', 1 => 'IFD1', 2 => 'Preview' }, + Writable => 1, + WriteGroup => 'All', + WriteCheck => '$self->CheckImage(\$val)', + WriteAlso => { + # (the 0xfeedfeed values are translated in the Exif write routine) + ThumbnailOffset => 'defined $val ? 0xfeedfeed : undef', + ThumbnailLength => 'defined $val ? 0xfeedfeed : undef', + }, + Require => { + 0 => 'ThumbnailOffset', + 1 => 'ThumbnailLength', + }, + Notes => q{ + this tag is writable, and may be used to update existing thumbnails, but may + only create a thumbnail in IFD1 of certain types of files. Note that for + this and other Composite embedded-image tags the family 0 and 1 groups match + those of the originating tags + }, + # retrieve the thumbnail from our EXIF data + RawConv => q{ + @grps = $self->GetGroup($$val{0}); # set groups from ThumbnailOffsets + Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"ThumbnailImage"); + }, + }, + ThumbnailTIFF => { + Groups => { 2 => 'Preview' }, + Require => { + 0 => 'SubfileType', + 1 => 'Compression', + 2 => 'ImageWidth', + 3 => 'ImageHeight', + 4 => 'BitsPerSample', + 5 => 'PhotometricInterpretation', + 6 => 'StripOffsets', + 7 => 'SamplesPerPixel', + 8 => 'RowsPerStrip', + 9 => 'StripByteCounts', + }, + Desire => { + 10 => 'PlanarConfiguration', + 11 => 'Orientation', + }, + # rebuild the TIFF thumbnail from our EXIF data + RawConv => q{ + my $tiff; + ($tiff, @grps) = Image::ExifTool::Exif::RebuildTIFF($self, @val); + return $tiff; + }, + }, + PreviewImage => { + Groups => { 0 => 'EXIF', 1 => 'SubIFD', 2 => 'Preview' }, + Writable => 1, + WriteGroup => 'All', + WriteCheck => '$self->CheckImage(\$val)', + DelCheck => '$val = ""; return undef', # can't delete, so set to empty string + WriteAlso => { + PreviewImageStart => 'defined $val ? 0xfeedfeed : undef', + PreviewImageLength => 'defined $val ? 0xfeedfeed : undef', + PreviewImageValid => 'defined $val and length $val ? 1 : 0', # (for Olympus) + }, + Require => { + 0 => 'PreviewImageStart', + 1 => 'PreviewImageLength', + }, + Desire => { + 2 => 'PreviewImageValid', + # (DNG and A100 ARW may be have 2 preview images) + 3 => 'PreviewImageStart (1)', + 4 => 'PreviewImageLength (1)', + }, + Notes => q{ + this tag is writable, and may be used to update existing embedded images, + but not create or delete them + }, + # note: extract 2nd preview, but ignore double-referenced preview + # (in A100 ARW images, the 2nd PreviewImageLength from IFD0 may be wrong anyway) + RawConv => q{ + if ($val[3] and $val[4] and $val[0] ne $val[3]) { + my %val = ( + 0 => 'PreviewImageStart (1)', + 1 => 'PreviewImageLength (1)', + 2 => 'PreviewImageValid', + ); + $self->FoundTag($tagInfo, \%val); + } + return undef if defined $val[2] and not $val[2]; + @grps = $self->GetGroup($$val{0}); + return Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],'PreviewImage'); + }, + }, + JpgFromRaw => { + Groups => { 0 => 'EXIF', 1 => 'SubIFD', 2 => 'Preview' }, + Writable => 1, + WriteGroup => 'All', + WriteCheck => '$self->CheckImage(\$val)', + # Note: ExifTool 10.38 had disabled the ability to delete this -- why? + # --> added the DelCheck in 10.61 to re-enable this + DelCheck => '$val = ""; return undef', # can't delete, so set to empty string + WriteAlso => { + JpgFromRawStart => 'defined $val ? 0xfeedfeed : undef', + JpgFromRawLength => 'defined $val ? 0xfeedfeed : undef', + }, + Require => { + 0 => 'JpgFromRawStart', + 1 => 'JpgFromRawLength', + }, + Notes => q{ + this tag is writable, and may be used to update existing embedded images, + but not create or delete them + }, + RawConv => q{ + @grps = $self->GetGroup($$val{0}); + return Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"JpgFromRaw"); + }, + }, + OtherImage => { + Groups => { 0 => 'EXIF', 1 => 'SubIFD', 2 => 'Preview' }, + Writable => 1, + WriteGroup => 'All', + WriteCheck => '$self->CheckImage(\$val)', + DelCheck => '$val = ""; return undef', # can't delete, so set to empty string + WriteAlso => { + OtherImageStart => 'defined $val ? 0xfeedfeed : undef', + OtherImageLength => 'defined $val ? 0xfeedfeed : undef', + }, + Require => { + 0 => 'OtherImageStart', + 1 => 'OtherImageLength', + }, + Notes => q{ + this tag is writable, and may be used to update existing embedded images, + but not create or delete them + }, + # retrieve the thumbnail from our EXIF data + RawConv => q{ + @grps = $self->GetGroup($$val{0}); + Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"OtherImage"); + }, + }, + PreviewImageSize => { + Require => { + 0 => 'PreviewImageWidth', + 1 => 'PreviewImageHeight', + }, + ValueConv => '"$val[0]x$val[1]"', + }, + SubSecDateTimeOriginal => { + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Writable => 1, + Shift => 0, # don't shift this tag + Require => { + 0 => 'EXIF:DateTimeOriginal', + }, + Desire => { + 1 => 'SubSecTimeOriginal', + 2 => 'OffsetTimeOriginal', + }, + WriteAlso => { + 'EXIF:DateTimeOriginal' => '($val and $val=~/^(\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2})/) ? $1 : undef', + 'EXIF:SubSecTimeOriginal' => '($val and $val=~/\.(\d+)/) ? $1 : undef', + 'EXIF:OffsetTimeOriginal' => '($val and $val=~/([-+]\d{2}:\d{2}|Z)$/) ? ($1 eq "Z" ? "+00:00" : $1) : undef', + }, + %subSecConv, + }, + SubSecCreateDate => { + Description => 'Create Date', + Groups => { 2 => 'Time' }, + Writable => 1, + Shift => 0, # don't shift this tag + Require => { + 0 => 'EXIF:CreateDate', + }, + Desire => { + 1 => 'SubSecTimeDigitized', + 2 => 'OffsetTimeDigitized', + }, + WriteAlso => { + 'EXIF:CreateDate' => '($val and $val=~/^(\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2})/) ? $1 : undef', + 'EXIF:SubSecTimeDigitized' => '($val and $val=~/\.(\d+)/) ? $1 : undef', + 'EXIF:OffsetTimeDigitized' => '($val and $val=~/([-+]\d{2}:\d{2}|Z)$/) ? ($1 eq "Z" ? "+00:00" : $1) : undef', + }, + %subSecConv, + }, + SubSecModifyDate => { + Description => 'Modify Date', + Groups => { 2 => 'Time' }, + Writable => 1, + Shift => 0, # don't shift this tag + Require => { + 0 => 'EXIF:ModifyDate', + }, + Desire => { + 1 => 'SubSecTime', + 2 => 'OffsetTime', + }, + WriteAlso => { + 'EXIF:ModifyDate' => '($val and $val=~/^(\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2})/) ? $1 : undef', + 'EXIF:SubSecTime' => '($val and $val=~/\.(\d+)/) ? $1 : undef', + 'EXIF:OffsetTime' => '($val and $val=~/([-+]\d{2}:\d{2}|Z)$/) ? ($1 eq "Z" ? "+00:00" : $1) : undef', + }, + %subSecConv, + }, + CFAPattern => { + Require => { + 0 => 'CFARepeatPatternDim', + 1 => 'CFAPattern2', + }, + # generate CFAPattern + ValueConv => q{ + my @a = split / /, $val[0]; + my @b = split / /, $val[1]; + return '?' unless @a==2 and @b==$a[0]*$a[1]; + return "$a[0] $a[1] @b"; + }, + PrintConv => 'Image::ExifTool::Exif::PrintCFAPattern($val)', + }, + RedBalance => { + Groups => { 2 => 'Camera' }, + Desire => { + 0 => 'WB_RGGBLevels', + 1 => 'WB_RGBGLevels', + 2 => 'WB_RBGGLevels', + 3 => 'WB_GRBGLevels', + 4 => 'WB_GRGBLevels', + 5 => 'WB_GBRGLevels', + 6 => 'WB_RGBLevels', + 7 => 'WB_GRBLevels', + 8 => 'WB_RBLevels', + 9 => 'WBRedLevel', # red + 10 => 'WBGreenLevel', + }, + ValueConv => 'Image::ExifTool::Exif::RedBlueBalance(0,@val)', + PrintConv => 'int($val * 1e6 + 0.5) * 1e-6', + }, + BlueBalance => { + Groups => { 2 => 'Camera' }, + Desire => { + 0 => 'WB_RGGBLevels', + 1 => 'WB_RGBGLevels', + 2 => 'WB_RBGGLevels', + 3 => 'WB_GRBGLevels', + 4 => 'WB_GRGBLevels', + 5 => 'WB_GBRGLevels', + 6 => 'WB_RGBLevels', + 7 => 'WB_GRBLevels', + 8 => 'WB_RBLevels', + 9 => 'WBBlueLevel', # blue + 10 => 'WBGreenLevel', + }, + ValueConv => 'Image::ExifTool::Exif::RedBlueBalance(1,@val)', + PrintConv => 'int($val * 1e6 + 0.5) * 1e-6', + }, + GPSPosition => { + Groups => { 2 => 'Location' }, + Writable => 1, + Protected => 1, + WriteAlso => { + GPSLatitude => '$val =~ /(.*?)( ?[NS])?,/ ? $1 : undef', + GPSLatitudeRef => '$val =~ /(-?)(.*?) ?([NS]?),/ ? ($3 || ($1 ? "S" : "N")) : undef', + GPSLongitude => '$val =~ /, ?(.*?)( ?[EW]?)$/ ? $1 : undef', + GPSLongitudeRef => '$val =~ /, ?(-?)(.*?) ?([EW]?)$/ ? ($3 || ($1 ? "W" : "E")) : undef', + }, + PrintConvInv => q{ + return undef unless $val =~ /(.*? ?[NS]?), ?(.*? ?[EW]?)$/; + my ($lat, $lon) = ($1, $2); + require Image::ExifTool::GPS; + $lat = Image::ExifTool::GPS::ToDegrees($lat, 1, "lat"); + $lon = Image::ExifTool::GPS::ToDegrees($lon, 1, "lon"); + return "$lat, $lon"; + }, + Require => { + 0 => 'GPSLatitude', + 1 => 'GPSLongitude', + }, + Priority => 0, + Notes => q{ + when written, writes GPSLatitude, GPSLatitudeRef, GPSLongitude and + GPSLongitudeRef. This tag may be written using the same coordinate + format as provided by Google Maps when right-clicking on a location + }, + ValueConv => '(length($val[0]) or length($val[1])) ? "$val[0] $val[1]" : undef', + PrintConv => '"$prt[0], $prt[1]"', + }, + LensID => { + Groups => { 2 => 'Camera' }, + Require => 'LensType', + Desire => { + 1 => 'FocalLength', + 2 => 'MaxAperture', + 3 => 'MaxApertureValue', + 4 => 'MinFocalLength', + 5 => 'MaxFocalLength', + 6 => 'LensModel', + 7 => 'LensFocalRange', + 8 => 'LensSpec', + 9 => 'LensType2', + 10 => 'LensType3', + 11 => 'LensFocalLength', # (for Pentax to check for converter) + 12 => 'RFLensType', + }, + Notes => q{ + attempt to identify the actual lens from all lenses with a given LensType. + Applies only to LensType values with a lookup table. May be configured + by adding user-defined lenses + }, + # this LensID is only valid if the LensType has a PrintConv or is a model name + RawConv => q{ + my $printConv = $$self{TAG_INFO}{LensType}{PrintConv}; + return $val if ref $printConv eq 'HASH' or (ref $printConv eq 'ARRAY' and + ref $$printConv[0] eq 'HASH') or $val[0] =~ /(mm|\d\/F)/; + return undef; + }, + ValueConv => '$val', + PrintConv => q{ + my $pcv; + # use LensType2 instead of LensType if available and valid (Sony E-mount lenses) + # (0x8000 or greater; 0 for several older/3rd-party E-mount lenses) + if (defined $val[9] and ($val[9] & 0x8000 or $val[9] == 0)) { + $val[0] = $val[9]; + $prt[0] = $prt[9]; + # Particularly GM lenses: often LensType2=0 but LensType3 is available and valid: use LensType3. + if ($val[9] == 0 and $val[10] & 0x8000) { + $val[0] = $val[10]; + $prt[0] = $prt[10]; + } + $pcv = $$self{TAG_INFO}{LensType2}{PrintConv}; + } + # use Canon RFLensType if available + if ($val[12]) { + $val[0] = $val[12]; + $prt[0] = $prt[12]; + $pcv = $$self{TAG_INFO}{RFLensType}{PrintConv}; + } + my $lens = Image::ExifTool::Exif::PrintLensID($self, $prt[0], $pcv, $prt[8], @val); + # check for use of lens converter (Pentax K-3) + if ($val[11] and $val[1] and $lens) { + my $conv = $val[1] / $val[11]; + $lens .= sprintf(' + %.1fx converter', $conv) if $conv > 1.1; + } + return $lens; + }, + }, + 'LensID-2' => { + Name => 'LensID', + Groups => { 2 => 'Camera' }, + Desire => { + 0 => 'LensModel', + 1 => 'Lens', + 2 => 'XMP-aux:LensID', + 3 => 'Make', + }, + Inhibit => { + 4 => 'Composite:LensID', + }, + RawConv => q{ + return undef if defined $val[2] and defined $val[3]; + return $val if defined $val[0] and $val[0] =~ /(mm|\d\/F)/; + return $val if defined $val[1] and $val[1] =~ /(mm|\d\/F)/; + return undef; + }, + ValueConv => q{ + return $val[0] if defined $val[0] and $val[0] =~ /(mm|\d\/F)/; + return $val[1]; + }, + PrintConv => '$_=$val; s/(\d)\/F/$1mm F/; s/mmF/mm F/; s/(\d) mm/${1}mm/; s/ - /-/; $_', + }, +); + +# table for unknown IFD entries +%Image::ExifTool::Exif::Unknown = ( + GROUPS => { 0 => 'EXIF', 1 => 'UnknownIFD', 2 => 'Image'}, + WRITE_PROC => \&WriteExif, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::Exif'); + + +#------------------------------------------------------------------------------ +# AutoLoad our writer routines when necessary +# +sub AUTOLOAD +{ + return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_); +} + +#------------------------------------------------------------------------------ +# Identify RAW file type for some TIFF-based formats using Compression value +# Inputs: 0) ExifTool object reference, 1) Compression value +# - sets TIFF_TYPE and FileType if identified +sub IdentifyRawFile($$) +{ + my ($et, $comp) = @_; + if ($$et{FILE_TYPE} eq 'TIFF' and not $$et{IdentifiedRawFile}) { + if ($compression{$comp} and $compression{$comp} =~ /^\w+ ([A-Z]{3}) Compressed$/) { + $et->OverrideFileType($$et{TIFF_TYPE} = $1); + $$et{IdentifiedRawFile} = 1; + } + } +} + +#------------------------------------------------------------------------------ +# Calculate LV (Light Value) +# Inputs: 0) Aperture, 1) ShutterSpeed, 2) ISO +# Returns: LV value (and converts input values to floating point if necessary) +sub CalculateLV($$$) +{ + local $_; + # do validity checks on arguments + return undef unless @_ >= 3; + foreach (@_) { + return undef unless $_ and /([+-]?(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?)/ and $1 > 0; + $_ = $1; # extract float from any other garbage + } + # (A light value of 0 is defined as f/1.0 at 1 second with ISO 100) + return log($_[0] * $_[0] * 100 / ($_[1] * $_[2])) / log(2); +} + +#------------------------------------------------------------------------------ +# Calculate scale factor for 35mm effective focal length (ref 26/PH) +# Inputs: 0) ExifTool object ref +# 1) Focal length +# 2) Focal length in 35mm format +# 3) Canon digital zoom factor +# 4) Focal plane diagonal size (in mm) +# 5) Sensor size (X and Y in mm) +# 6/7) Focal plane X/Y size (in mm) +# 8) focal plane resolution units (1=None,2=inches,3=cm,4=mm,5=um) +# 9/10) Focal plane X/Y resolution +# 11/12,13/14...) Image width/height in order of precedence (first valid pair is used) +# Returns: 35mm conversion factor (or undefined if it can't be calculated) +sub CalcScaleFactor35efl +{ + my $et = shift; + my $res = $_[7]; # save resolution units (in case they have been converted to string) + my $sensXY = $_[4]; + Image::ExifTool::ToFloat(@_); + my $focal = shift; + my $foc35 = shift; + + return $foc35 / $focal if $focal and $foc35; + + my $digz = shift || 1; + my $diag = shift; + my $sens = shift; + # calculate Canon sensor size using a dedicated algorithm + if ($$et{Make} eq 'Canon') { + require Image::ExifTool::Canon; + my $canonDiag = Image::ExifTool::Canon::CalcSensorDiag( + $$et{RATIONAL}{FocalPlaneXResolution}, + $$et{RATIONAL}{FocalPlaneYResolution}, + ); + $diag = $canonDiag if $canonDiag; + } + unless ($diag and Image::ExifTool::IsFloat($diag)) { + if ($sens and $sensXY =~ / (\d+(\.?\d*)?)$/) { + $diag = sqrt($sens * $sens + $1 * $1); + } else { + undef $diag; + my $xsize = shift; + my $ysize = shift; + if ($xsize and $ysize) { + # validate by checking aspect ratio because FocalPlaneX/YSize is not reliable + my $a = $xsize / $ysize; + if (abs($a-1.3333) < .1 or abs($a-1.5) < .1) { + $diag = sqrt($xsize * $xsize + $ysize * $ysize); + } + } + } + unless ($diag) { + # get number of mm in units (assume inches unless otherwise specified) + my %lkup = ( 3=>10, 4=>1, 5=>0.001 , cm=>10, mm=>1, um=>0.001 ); + my $units = $lkup{ shift() || $res || '' } || 25.4; + my $x_res = shift || return undef; + my $y_res = shift || $x_res; + Image::ExifTool::IsFloat($x_res) and $x_res != 0 or return undef; + Image::ExifTool::IsFloat($y_res) and $y_res != 0 or return undef; + my ($w, $h); + for (;;) { + @_ < 2 and return undef; + $w = shift; + $h = shift; + next unless $w and $h; + my $a = $w / $h; + last if $a > 0.5 and $a < 2; # stop if we get a reasonable value + } + # calculate focal plane size in mm + $w *= $units / $x_res; + $h *= $units / $y_res; + $diag = sqrt($w*$w+$h*$h); + # make sure size is reasonable + return undef unless $diag > 1 and $diag < 100; + } + } + return sqrt(36*36+24*24) * $digz / $diag; +} + +#------------------------------------------------------------------------------ +# Print exposure compensation fraction +sub PrintFraction($) +{ + my $val = shift; + my $str; + if (defined $val) { + $val *= 1.00001; # avoid round-off errors + if (not $val) { + $str = '0'; + } elsif (int($val)/$val > 0.999) { + $str = sprintf("%+d", int($val)); + } elsif ((int($val*2))/($val*2) > 0.999) { + $str = sprintf("%+d/2", int($val * 2)); + } elsif ((int($val*3))/($val*3) > 0.999) { + $str = sprintf("%+d/3", int($val * 3)); + } else { + $str = sprintf("%+.3g", $val); + } + } + return $str; +} + +#------------------------------------------------------------------------------ +# Convert fraction or number to floating point value (or 'undef' or 'inf') +sub ConvertFraction($) +{ + my $val = shift; + if ($val =~ m{([-+]?\d+)/(\d+)}) { + $val = $2 ? $1 / $2 : ($1 ? 'inf' : 'undef'); + } + return $val; +} + +#------------------------------------------------------------------------------ +# Convert EXIF text to something readable +# Inputs: 0) ExifTool object reference, 1) EXIF text, +# 2) [optional] 1 to apply CharsetEXIF to ASCII text, +# 3) tag name for warning message (may be argument 2) +# Returns: text encoded according to Charset option (with trailing spaces removed) +sub ConvertExifText($$;$$) +{ + my ($et, $val, $asciiFlex, $tag) = @_; + return $val if length($val) < 8; + my $id = substr($val, 0, 8); + my $str = substr($val, 8); + my $type; + + delete $$et{WrongByteOrder}; + if ($$et{OPTIONS}{Validate} and $id =~ /^(ASCII|UNICODE|JIS)?\0* \0*$/) { + $et->Warn(($1 || 'Undefined') . ' text header' . ($tag ? " for $tag" : '') . ' has spaces instead of nulls'); + } + # Note: allow spaces instead of nulls in the ID codes because + # it is fairly common for camera manufacturers to get this wrong + # (also handle Canon ZoomBrowser EX 4.5 null followed by 7 bytes of garbage) + if ($id =~ /^(ASCII)?(\0|[\0 ]+$)/) { + # truncate at null terminator (shouldn't have a null based on the + # EXIF spec, but it seems that few people actually read the spec) + $str =~ s/\0.*//s; + # allow ASCII text to contain any other specified encoding + if ($asciiFlex and $asciiFlex eq '1') { + my $enc = $et->Options('CharsetEXIF'); + $str = $et->Decode($str, $enc) if $enc; + } + # by the EXIF spec, the following string should be "UNICODE\0", but + # apparently Kodak sometimes uses "Unicode\0" in the APP3 "Meta" information. + # However, unfortunately Ricoh uses "Unicode\0" in the RR30 EXIF UserComment + # when the text is actually ASCII, so only recognize uppercase "UNICODE\0". + } elsif ($id =~ /^(UNICODE)[\0 ]$/) { + $type = $1; + # MicrosoftPhoto writes as little-endian even in big-endian EXIF, + # so we must guess at the true byte ordering + $str = $et->Decode($str, 'UTF16', 'Unknown'); + } elsif ($id =~ /^(JIS)[\0 ]{5}$/) { + $type = $1; + $str = $et->Decode($str, 'JIS', 'Unknown'); + } else { + $tag = $asciiFlex if $asciiFlex and $asciiFlex ne '1'; + $et->Warn('Invalid EXIF text encoding' . ($tag ? " for $tag" : '')); + $str = $id . $str; + } + if ($$et{WrongByteOrder} and $$et{OPTIONS}{Validate}) { + $et->Warn('Wrong byte order for EXIF' . ($tag ? " $tag" : '') . + ($type ? " $type" : '') . ' text'); + } + $str =~ s/ +$//; # trim trailing blanks + return $str; +} + +#------------------------------------------------------------------------------ +# Print conversion for SpatialFrequencyResponse +sub PrintSFR($) +{ + my $val = shift; + return $val unless length $val > 4; + my ($n, $m) = (Get16u(\$val, 0), Get16u(\$val, 2)); + my @cols = split /\0/, substr($val, 4), $n+1; + my $pos = length($val) - 8 * $n * $m; + return $val unless @cols == $n+1 and $pos >= 4; + pop @cols; + my ($i, $j); + for ($i=0; $i<$n; ++$i) { + my @rows; + for ($j=0; $j<$m; ++$j) { + push @rows, Image::ExifTool::GetRational64u(\$val, $pos + 8*($i+$j*$n)); + } + $cols[$i] .= '=' . join(',',@rows) . ''; + } + return join '; ', @cols; +} + +#------------------------------------------------------------------------------ +# Print numerical parameter value (with sign, or 'Normal' for zero) +# Inputs: 0) value, 1) flag for inverse conversion, 2) conversion hash reference +sub PrintParameter($$$) +{ + my ($val, $inv, $conv) = @_; + return $val if $inv; + if ($val > 0) { + if ($val > 0xfff0) { # a negative value in disguise? + $val = $val - 0x10000; + } else { + $val = "+$val"; + } + } + return $val; +} + +#------------------------------------------------------------------------------ +# Convert parameter back to standard EXIF value +# 0,0.00,etc or "Normal" => 0 +# -1,-2,etc or "Soft" or "Low" => 1 +# +1,+2,1,2,etc or "Hard" or "High" => 2 +sub ConvertParameter($) +{ + my $val = shift; + my $isFloat = Image::ExifTool::IsFloat($val); + # normal is a value of zero + return 0 if $val =~ /\bn/i or ($isFloat and $val == 0); + # "soft", "low" or any negative number is a value of 1 + return 1 if $val =~ /\b(s|l)/i or ($isFloat and $val < 0); + # "hard", "high" or any positive number is a value of 2 + return 2 if $val =~ /\bh/i or $isFloat; + return undef; +} + +#------------------------------------------------------------------------------ +# Calculate Red/BlueBalance +# Inputs: 0) 0=red, 1=blue, 1-8) WB_RGGB/RGBG/RBGG/GRBG/GRGB/RGB/GRB/RBLevels, +# 8) red or blue level, 9) green level +my @rggbLookup = ( + # indices for R, G, G and B components in input value + [ 0, 1, 2, 3 ], # 0 RGGB + [ 0, 1, 3, 2 ], # 1 RGBG + [ 0, 2, 3, 1 ], # 2 RBGG + [ 1, 0, 3, 2 ], # 3 GRBG + [ 1, 0, 2, 3 ], # 4 GRGB + [ 2, 3, 0, 1 ], # 5 GBRG + [ 0, 1, 1, 2 ], # 6 RGB + [ 1, 0, 0, 2 ], # 7 GRB + [ 0, 256, 256, 1 ], # 8 RB (green level is 256) +); +sub RedBlueBalance($@) +{ + my $blue = shift; + my ($i, $val, $levels); + for ($i=0; $i<@rggbLookup; ++$i) { + $levels = shift or next; + my @levels = split ' ', $levels; + next if @levels < 2; + my $lookup = $rggbLookup[$i]; + my $g = $$lookup[1]; # get green level or index + if ($g < 4) { + next if @levels < 3; + $g = ($levels[$g] + $levels[$$lookup[2]]) / 2 or next; + } elsif ($levels[$$lookup[$blue * 3]] < 4) { + $g = 1; # Some Nikon cameras use a scaling factor of 1 (E5700) + } + $val = $levels[$$lookup[$blue * 3]] / $g; + last; + } + $val = $_[0] / $_[1] if not defined $val and ($_[0] and $_[1]); + return $val; +} + +#------------------------------------------------------------------------------ +# Print exposure time as a fraction +sub PrintExposureTime($) +{ + my $secs = shift; + return $secs unless Image::ExifTool::IsFloat($secs); + if ($secs < 0.25001 and $secs > 0) { + return sprintf("1/%d",int(0.5 + 1/$secs)); + } + $_ = sprintf("%.1f",$secs); + s/\.0$//; + return $_; +} + +#------------------------------------------------------------------------------ +# Print FNumber +sub PrintFNumber($) +{ + my $val = shift; + if (Image::ExifTool::IsFloat($val) and $val > 0) { + # round to 1 decimal place, or 2 for values < 1.0 + $val = sprintf(($val<1 ? "%.2f" : "%.1f"), $val); + } + return $val; +} + +#------------------------------------------------------------------------------ +# Decode raw CFAPattern value +# Inputs: 0) ExifTool ref, 1) binary value +# Returns: string of numbers +sub DecodeCFAPattern($$) +{ + my ($self, $val) = @_; + # some panasonic cameras (SV-AS3, SV-AS30) write this in ascii (very odd) + if ($val =~ /^[0-6]+$/) { + $self->Warn('Incorrectly formatted CFAPattern', 1); + $val =~ tr/0-6/\x00-\x06/; + } + return $val unless length($val) >= 4; + my @a = unpack(GetByteOrder() eq 'II' ? 'v2C*' : 'n2C*', $val); + my $end = 2 + $a[0] * $a[1]; + if ($end > @a) { + # try swapping byte order (I have seen this order different than in EXIF) + my ($x, $y) = unpack('n2',pack('v2',$a[0],$a[1])); + if (@a < 2 + $x * $y) { + $self->Warn('Invalid CFAPattern', 1); + } else { + ($a[0], $a[1]) = ($x, $y); + # (can't technically be wrong because the order isn't well defined by the EXIF spec) + # $self->Warn('Wrong byte order for CFAPattern'); + } + } + return "@a"; +} + +#------------------------------------------------------------------------------ +# Print CFA Pattern +sub PrintCFAPattern($) +{ + my $val = shift; + my @a = split ' ', $val; + return '<truncated data>' unless @a >= 2; + return '<zero pattern size>' unless $a[0] and $a[1]; + my $end = 2 + $a[0] * $a[1]; + return '<invalid pattern size>' if $end > @a; + my @cfaColor = qw(Red Green Blue Cyan Magenta Yellow White); + my ($pos, $rtnVal) = (2, '['); + for (;;) { + $rtnVal .= $cfaColor[$a[$pos]] || 'Unknown'; + last if ++$pos >= $end; + ($pos - 2) % $a[1] and $rtnVal .= ',', next; + $rtnVal .= ']['; + } + return $rtnVal . ']'; +} + +#------------------------------------------------------------------------------ +# Print Opcode List +# Inputs: 0) value, 1) flag for inverse conversion, 2) conversion hash reference +# Returns: converted value +sub PrintOpcode($$$) +{ + my ($val, $inv, $conv) = @_; + return undef if $inv; # (can't do inverse conversion) + return '' unless length $$val > 4; + my $num = unpack('N', $$val); + my $pos = 4; + my ($i, @ops); + for ($i=0; $i<$num; ++$i) { + $pos + 16 <= length $$val or push(@ops, '<err>'), last; + my ($op, $ver, $flags, $len) = unpack("x${pos}N4", $$val); + push @ops, $$conv{$op} || "[opcode $op]"; + $pos += 16 + $len; + } + return join ', ', @ops; +} + +#------------------------------------------------------------------------------ +# Print conversion for lens info +# Inputs: 0) string of values (min focal, max focal, min F, max F) +# Returns: string in the form "12-20mm f/3.8-4.5" or "50mm f/1.4" +sub PrintLensInfo($) +{ + my $val = shift; + my @vals = split ' ', $val; + return $val unless @vals == 4; + my $c = 0; + foreach (@vals) { + Image::ExifTool::IsFloat($_) and ++$c, next; + $_ eq 'inf' and $_ = '?', ++$c, next; + $_ eq 'undef' and $_ = '?', ++$c, next; + } + return $val unless $c == 4; + $val = $vals[0]; + # (the Pentax Q writes zero for upper value of fixed-focal-length lenses) + $val .= "-$vals[1]" if $vals[1] and $vals[1] ne $vals[0]; + $val .= "mm f/$vals[2]"; + $val .= "-$vals[3]" if $vals[3] and $vals[3] ne $vals[2]; + return $val; +} + +#------------------------------------------------------------------------------ +# Get lens info from lens model string +# Inputs: 0) lens string, 1) flag to allow unknown "?" values +# Returns: 0) min focal, 1) max focal, 2) min aperture, 3) max aperture +# Notes: returns empty list if lens string could not be parsed +sub GetLensInfo($;$) +{ + my ($lens, $unk) = @_; + # extract focal length and aperture ranges for this lens + my $pat = '\\d+(?:\\.\\d+)?'; + $pat .= '|\\?' if $unk; + return () unless $lens =~ /($pat)(?:-($pat))?\s*mm.*?(?:[fF]\/?\s*)($pat)(?:-($pat))?/; + # ($1=short focal, $2=long focal, $3=max aperture wide, $4=max aperture tele) + my @a = ($1, $2, $3, $4); + $a[1] or $a[1] = $a[0]; + $a[3] or $a[3] = $a[2]; + if ($unk) { + local $_; + $_ eq '?' and $_ = 'undef' foreach @a; + } + return @a; +} + +#------------------------------------------------------------------------------ +# Match lens in list of possbilities based on value of LensModel +# Inputs: 0) reference to list of possible models, 1) LensModel string +# - updates list on return; guaranteed not to remove all list entries +sub MatchLensModel($$) +{ + my ($try, $lensModel) = @_; + if (@$try > 1 and $lensModel) { + my (@filt, $pat); + # filter by focal length + if ($lensModel =~ /((\d+-)?\d+mm)/) { + my $focal = $1; + @filt = grep /$focal/, @$try; + @$try = @filt if @filt and @filt < @$try; + } + # filter by aperture + if (@$try > 1 and $lensModel =~ m{(?:F/?|1:)(\d+(\.\d+)?)}i) { + my $fnum = $1; + @filt = grep m{(F/?|1:)$fnum(\b|[A-Z])}i, @$try; + @$try = @filt if @filt and @filt < @$try; + } + # filter by model version, and other lens parameters + foreach $pat ('I+', 'USM') { + next unless @$try > 1 and $lensModel =~ /\b($pat)\b/; + my $val = $1; + @filt = grep /\b$val\b/, @$try; + @$try = @filt if @filt and @filt < @$try; + } + } +} + +#------------------------------------------------------------------------------ +# Attempt to identify the specific lens if multiple lenses have the same LensType +# Inputs: 0) ExifTool object ref, 1) LensType print value, 2) PrintConv hash ref, +# 3) LensSpec print value, 4) LensType numerical value, 5) FocalLength, +# 6) MaxAperture, 7) MaxApertureValue, 8) MinFocalLength, 9) MaxFocalLength, +# 10) LensModel, 11) LensFocalRange, 12) LensSpec +my %sonyEtype; +sub PrintLensID($$@) +{ + my ($et, $lensTypePrt, $printConv, $lensSpecPrt, $lensType, $focalLength, + $maxAperture, $maxApertureValue, $shortFocal, $longFocal, $lensModel, + $lensFocalRange, $lensSpec) = @_; + # this logic relies on the LensType lookup: + return undef unless defined $lensType; + # get print conversion hash if necessary + $printConv or $printConv = $$et{TAG_INFO}{LensType}{PrintConv}; + # just copy LensType PrintConv value if it was a lens name + # (Olympus or Panasonic -- just exclude things like Nikon and Leaf LensType) + unless (ref $printConv eq 'HASH') { + if (ref $printConv eq 'ARRAY' and ref $$printConv[0] eq 'HASH') { + $printConv = $$printConv[0]; + $lensTypePrt =~ s/;.*//; + $lensType =~ s/ .*//; + } else { + return $lensTypePrt if $lensTypePrt =~ /mm/; + return $lensTypePrt if $lensTypePrt =~ s/(\d)\/F/$1mm F/; + return undef; + } + } + # get LensSpec information if available (Sony) + my ($sf0, $lf0, $sa0, $la0); + if ($lensSpecPrt) { + ($sf0, $lf0, $sa0, $la0) = GetLensInfo($lensSpecPrt); + undef $sf0 unless $sa0; # (make sure aperture isn't zero) + } + # use MaxApertureValue if MaxAperture is not available + $maxAperture = $maxApertureValue unless $maxAperture; + if ($lensFocalRange and $lensFocalRange =~ /^(\d+)(?: (?:to )?(\d+))?$/) { + ($shortFocal, $longFocal) = ($1, $2 || $1); + } + if ($$et{Make} eq 'SONY') { + if ($lensType eq 65535) { + # handle Sony E-type lenses when LensType2 isn't valid (NEX/ILCE models only) + if ($$et{Model} =~ /NEX|ILCE/) { + unless (%sonyEtype) { + my ($index, $i, %did, $lens); + require Image::ExifTool::Sony; + foreach (sort keys %Image::ExifTool::Sony::sonyLensTypes2) { + ($lens = $Image::ExifTool::Sony::sonyLensTypes2{$_}) =~ s/ or .*//; + next if $did{$lens}; + ($i, $index) = $index ? ("65535.$index", $index + 1) : (65535, 1); + $did{$sonyEtype{$i} = $lens} = 1; + } + } + $printConv = \%sonyEtype; + } + } elsif ($lensType != 0xff00) { + # Patch for Metabones or other adapters on Sony E-mount cameras (ref Jos Roost) + # Metabones Canon EF to E-mount adapters add 0xef00, 0xbc00 or 0x7700 to the + # high byte for 2-byte Canon LensType values, so we need to adjust for these. + # Offset 0xef00 is also used by Sigma MC-11, Fotodiox and Viltrox EF-E adapters. + # Have to exclude A-mount Sigma Filtermatic with 'odd' LensType=0xff00. + require Image::ExifTool::Minolta; + if ($Image::ExifTool::Minolta::metabonesID{$lensType & 0xff00}) { + $lensType -= ($lensType >= 0xef00 ? 0xef00 : $lensType >= 0xbc00 ? 0xbc00 : 0x7700); + require Image::ExifTool::Canon; + $printConv = \%Image::ExifTool::Canon::canonLensTypes; + $lensTypePrt = $$printConv{$lensType} if $$printConv{$lensType}; + # Test for Sigma MC-11 SA-E adapter with Sigma SA lens using 0x4900 offset. + # (upper limit of test cuts off two highest Sigma lenses, but prevents + # conflict with old Minolta 25xxx and higher ID's) + } elsif ($lensType >= 0x4900 and $lensType <= 0x590a) { + require Image::ExifTool::Sigma; + $lensType -= 0x4900; + $printConv = \%Image::ExifTool::Sigma::sigmaLensTypes; + $lensTypePrt = $$printConv{$lensType} if $$printConv{$lensType}; + } + } + # (Min/MaxFocalLength may report the current focal length for Tamron zoom lenses) + } elsif ($shortFocal and $longFocal and (not $lensModel or $lensModel !~ /^TAMRON.*-\d+mm/)) { + # Canon (and some other makes) include makernote information + # which allows better lens identification + require Image::ExifTool::Canon; + return Image::ExifTool::Canon::PrintLensID($printConv, $lensType, + $shortFocal, $longFocal, $maxAperture, $lensModel); + } + my $lens = $$printConv{$lensType}; + return ($lensModel || $lensTypePrt) unless $lens; + return $lens unless $$printConv{"$lensType.1"}; + $lens =~ s/ or .*//s; # remove everything after "or" + # make list of all possible matching lenses + my @lenses = ( $lens ); + my $i; + for ($i=1; $$printConv{"$lensType.$i"}; ++$i) { + push @lenses, $$printConv{"$lensType.$i"}; + } + # attempt to determine actual lens + my (@matches, @best, @user, $diff); + foreach $lens (@lenses) { + push @user, $lens if $Image::ExifTool::userLens{$lens}; + # sf = short focal + # lf = long focal + # sa = max aperture at short focal + # la = max aperture at long focal + my ($sf, $lf, $sa, $la) = GetLensInfo($lens); + next unless $sf; + # check against LensSpec parameters if available + if ($sf0) { + next if abs($sf - $sf0) > 0.5 or abs($sa - $sa0) > 0.15 or + abs($lf - $lf0) > 0.5 or abs($la - $la0) > 0.15; + # the basic parameters match, but also check against additional lens features: + # for Sony A and E lenses, the full LensSpec string should match with end of LensType, + # excluding any part between () at the end, and preceded by a space (the space + # ensures that e.g. Zeiss Loxia 21mm having LensSpec "E 21mm F2.8" will not be + # identified as "Sony FE 21mm F2.8 (SEL28F20 + SEL075UWC)") + $lensSpecPrt and $lens =~ / \Q$lensSpecPrt\E( \(| GM$|$)/ and @best = ( $lens ), last; + # exactly-matching Sony lens should have been found above, so only add non-Sony lenses + push @best, $lens unless $lens =~ /^Sony /; + next; + } + # adjust focal length and aperture if teleconverter is attached (Minolta) + if ($lens =~ / \+ .*? (\d+(\.\d+)?)x( |$)/) { + $sf *= $1; $lf *= $1; + $sa *= $1; $la *= $1; + } + # see if we can rule out this lens using FocalLength and MaxAperture + if ($focalLength) { + next if $focalLength < $sf - 0.5; + next if $focalLength > $lf + 0.5; + } + if ($maxAperture) { + # it seems that most manufacturers set MaxAperture and MaxApertureValue + # to the maximum aperture (smallest F number) for the current focal length + # of the lens, so assume that MaxAperture varies with focal length and find + # the closest match (this is somewhat contrary to the EXIF specification which + # states "The smallest F number of the lens", without mention of focal length) + next if $maxAperture < $sa - 0.15; # (0.15 is arbitrary) + next if $maxAperture > $la + 0.15; + # now determine the best match for this aperture + my $aa; # approximate maximum aperture at this focal length + if ($sf == $lf or $sa == $la or $focalLength <= $sf) { + # either 1) prime lens, 2) fixed-aperture zoom, or 3) zoom at min focal + $aa = $sa; + } elsif ($focalLength >= $lf) { + $aa = $la; + } else { + # assume a log-log variation of max aperture with focal length + # (see http://regex.info/blog/2006-10-05/263) + $aa = exp(log($sa) + (log($la)-log($sa)) / (log($lf)-log($sf)) * + (log($focalLength)-log($sf))); + # a linear relationship between 1/FocalLength and 1/MaxAperture fits Sony better (ref 27) + #$aa = 1 / (1/$sa + (1/$focalLength - 1/$sf) * (1/$la - 1/$sa) / (1/$lf - 1/$sf)); + } + my $d = abs($maxAperture - $aa); + if (defined $diff) { + $d > $diff + 0.15 and next; # (0.15 is arbitrary) + $d < $diff - 0.15 and undef @best; + } + $diff = $d; + push @best, $lens; + } + push @matches, $lens; + } + # return the user-defined lens if it exists + if (@user) { + # choose the best match if we have more than one + if (@user > 1) { + my ($try, @good); + foreach $try (\@best, \@matches) { + $Image::ExifTool::userLens{$_} and push @good, $_ foreach @$try; + return join(' or ', @good) if @good; + } + } + return join(' or ', @user); + } + # return the best match(es) from the possible lenses, after checking against LensModel + @best = @matches unless @best; + if (@best) { + MatchLensModel(\@best, $lensModel); + return join(' or ', @best); + } + $lens = $$printConv{$lensType}; + return $lensModel if $lensModel and $lens =~ / or /; # (eg. Sony NEX-5N) + return $lens; +} + +#------------------------------------------------------------------------------ +# Translate date into standard EXIF format +# Inputs: 0) date +# Returns: date in format '2003:10:22' +# - bad formats recognized: '2003-10-22','2003/10/22','2003 10 22','20031022' +# - removes null terminator if it exists +sub ExifDate($) +{ + my $date = shift; + $date =~ s/\0$//; # remove any null terminator + # separate year:month:day with colons + # (have seen many other characters, including nulls, used erroneously) + $date =~ s/(\d{4})[^\d]*(\d{2})[^\d]*(\d{2})$/$1:$2:$3/; + return $date; +} + +#------------------------------------------------------------------------------ +# Translate time into standard EXIF format +# Inputs: 0) time +# Returns: time in format '10:30:55' +# - bad formats recognized: '10 30 55', '103055', '103055+0500' +# - removes null terminator if it exists +# - leaves time zone intact if specified (eg. '10:30:55+05:00') +sub ExifTime($) +{ + my $time = shift; + $time =~ tr/ /:/; # use ':' (not ' ') as a separator + $time =~ s/\0$//; # remove any null terminator + # add separators if they don't exist + $time =~ s/^(\d{2})(\d{2})(\d{2})/$1:$2:$3/; + $time =~ s/([+-]\d{2})(\d{2})\s*$/$1:$2/; # to timezone too + return $time; +} + +#------------------------------------------------------------------------------ +# Generate TIFF file from scratch (in current byte order) +# Inputs: 0) hash of IFD entries (TagID => Value; multiple values space-delimited) +# 1) raw image data reference +# Returns: TIFF image data, or undef on error +sub GenerateTIFF($$) +{ + my ($entries, $dataPt) = @_; + my ($rtnVal, $tag, $offsetPos); + + my $num = scalar keys %$entries; + my $ifdBuff = GetByteOrder() . Set16u(42) . Set32u(8) . Set16u($num); + my $valBuff = ''; + my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main'); + foreach $tag (sort { $a <=> $b } keys %$entries) { + my $tagInfo = $$tagTablePtr{$tag}; + my $fmt = ref $tagInfo eq 'HASH' ? $$tagInfo{Writable} : 'int32u'; + return undef unless defined $fmt; + my $val = Image::ExifTool::WriteValue($$entries{$tag}, $fmt, -1); + return undef unless defined $val; + my $format = $formatNumber{$fmt}; + $ifdBuff .= Set16u($tag) . Set16u($format) . Set32u(length($val)/$formatSize[$format]); + $offsetPos = length($ifdBuff) if $tag == 0x111; # (remember StripOffsets position) + if (length $val > 4) { + $ifdBuff .= Set32u(10 + 12 * $num + 4 + length($valBuff)); + $valBuff .= $val; + } else { + $val .= "\0" x (4 - length($val)) if length $val < 4; + $ifdBuff .= $val; + } + } + $ifdBuff .= "\0\0\0\0"; # (no IFD1) + return undef unless $offsetPos; + Set32u(length($ifdBuff) + length($valBuff), \$ifdBuff, $offsetPos); + return $ifdBuff . $valBuff . $$dataPt; +} + +#------------------------------------------------------------------------------ +# Rebuild TIFF thumbnail(s)/preview(s) into stand-alone files with current byte order +# Inputs: 0) ExifTool ref, 1) SubfileType, 2) Compression, 3) ImageWidth, 4) ImageHeight, +# 5) BitsPerSample, 6) PhotometricInterpretation, 7) StripOffsets, 8) SamplesPerPixel, +# 9) RowsPerStrip, 10) StripByteCounts, 10) PlanarConfiguration, 11) Orientation +# Returns: 0) TIFF image or undef, 1/2) Family 0/1 groups for TIFF preview IFD +sub RebuildTIFF($;@) +{ + local $_; + my $et = $_[0]; + my $value = $$et{VALUE}; + my ($i, $j, $rtn, $grp0, $grp1); + return undef if $$et{FILE_TYPE} eq 'RWZ'; +SubFile: + for ($i=0; ; ++$i) { + my $key = 'SubfileType' . ($i ? " ($i)" : ''); + last unless defined $$value{$key}; + next unless $$value{$key} == 1; # (reduced-resolution image) + my $grp = $et->GetGroup($key, 1); + my $cmp = $et->FindValue('Compression', $grp); + next unless $cmp == 1; # (no compression) + my %vals = (Compression=>$cmp, PlanarConfiguration=>1, Orientation=>1); + foreach (qw(ImageWidth ImageHeight BitsPerSample PhotometricInterpretation + StripOffsets SamplesPerPixel RowsPerStrip StripByteCounts + PlanarConfiguration Orientation)) + { + my $val = $et->FindValue($_, $grp); + defined $val and $vals{$_} = $val, next; + next SubFile unless defined $vals{$_}; + } + my ($w, $h) = @vals{'ImageWidth', 'ImageHeight'}; + my @bits = split ' ', $vals{BitsPerSample}; + my $rowBytes = 0; + $rowBytes += $w * int(($_+7)/8) foreach @bits; + my $dat = ''; + my @off = split ' ', $vals{StripOffsets}; + my @len = split ' ', $vals{StripByteCounts}; + # read the image data + for ($j=0; $j<@off; ++$j) { + next SubFile unless $len[$j] == $rowBytes * $vals{RowsPerStrip}; + my $tmp = $et->ExtractBinary($off[$j], $len[$j]); + next SubFile unless defined $tmp; + $dat .= $tmp; + } + # generate the TIFF image + my %entries = ( + 0x0fe => 0, # SubfileType = 0 + 0x100 => $w, # ImageWidth + 0x101 => $h, # ImageHeight + 0x102 => $vals{BitsPerSample},# BitsPerSample + 0x103 => $vals{Compression},# Compression + 0x106 => $vals{PhotometricInterpretation}, # PhotometricInterpretation + 0x111 => 0, # StripOffsets (will be adjusted later) + 0x112 => $vals{Orientation},# Orientation + 0x115 => $vals{SamplesPerPixel}, # SamplesPerPixel + 0x116 => $h, # RowsPerStrip + 0x117 => $h * $rowBytes, # StripByteCounts + 0x11a => 72, # XResolution = 72 + 0x11b => 72, # YResolution = 72 + 0x11c => $vals{PlanarConfiguration}, # PlanarConfiguration + 0x128 => 2, # ResolutionUnit = 2 + ); + my $img = GenerateTIFF(\%entries, \$dat); + + if (not defined $img) { + $et->Warn('Invalid ' . ($w > 256 ? 'Preview' : 'Thumbnail') . 'TIFF data'); + } elsif ($rtn or $w > 256) { # (call it a preview if larger than 256 pixels) + $et->FoundTag('PreviewTIFF', \$img, $et->GetGroup($key)); + } else { + $rtn = \$img; + ($grp0, $grp1) = $et->GetGroup($key); + } + } + return $rtn unless wantarray; + return ($rtn, $grp0, $grp1); +} + +#------------------------------------------------------------------------------ +# Extract image from file +# Inputs: 0) ExifTool object reference, 1) data offset (in file), 2) data length +# 3) [optional] tag name +# Returns: Reference to Image if specifically requested or "Binary data" message +# Returns undef if there was an error loading the image +sub ExtractImage($$$$) +{ + my ($et, $offset, $len, $tag) = @_; + my $dataPt = \$$et{EXIF_DATA}; + my $dataPos = $$et{EXIF_POS}; + my $image; + + # no image if length is zero, and don't try to extract binary from XMP file + return undef if not $len or $$et{FILE_TYPE} eq 'XMP'; + + # take data from EXIF block if possible + if (defined $dataPos and $offset>=$dataPos and $offset+$len<=$dataPos+length($$dataPt)) { + $image = substr($$dataPt, $offset-$dataPos, $len); + } else { + $image = $et->ExtractBinary($offset, $len, $tag); + return undef unless defined $image; + # patch for incorrect ThumbnailOffset in some Sony DSLR-A100 ARW images + if ($tag and $tag eq 'ThumbnailImage' and $$et{TIFF_TYPE} eq 'ARW' and + $$et{Model} eq 'DSLR-A100' and $offset < 0x10000 and + $image !~ /^(Binary data|\xff\xd8\xff)/) + { + my $try = $et->ExtractBinary($offset + 0x10000, $len, $tag); + if (defined $try and $try =~ /^\xff\xd8\xff/) { + $image = $try; + $$et{VALUE}{ThumbnailOffset} += 0x10000; + $et->Warn('Adjusted incorrect A100 ThumbnailOffset', 1); + } + } + } + return $et->ValidateImage(\$image, $tag); +} + +#------------------------------------------------------------------------------ +# Utility routine to return tag ID string for warnings +# Inputs: 0) Tag ID, 1) [optional] TagInfo ref +# Returns: "tag 0xXXXX NAME" +sub TagName($;$) +{ + my ($tagID, $tagInfo) = @_; + my $tagName = $tagInfo ? ' '.$$tagInfo{Name} : ''; + return sprintf('tag 0x%.4x%s', $tagID, $tagName); +} + +#------------------------------------------------------------------------------ +# Get class name of next IFD offset for HtmlDump output +# Inputs: 0) ExifTool ref, 1) current class ID +# Returns: 0) new IFD offset name, 1) new class ID including "Offset_" for new offset +# 2) new "Offset_" ID +sub NextOffsetName($;$) +{ + my ($et, $id) = @_; + $$et{OffsetNum} = defined $$et{OffsetNum} ? $$et{OffsetNum} + 1 : 0; + my $offName = 'o' . $$et{OffsetNum}; + my $sid = "Offset_$offName"; + $id = (defined $id ? "$id " : '') . $sid; + return ($offName, $id, $sid); +} + +#------------------------------------------------------------------------------ +# Process EXIF directory +# Inputs: 0) ExifTool object reference +# 1) Reference to directory information hash +# 2) Pointer to tag table for this directory +# Returns: 1 on success, otherwise returns 0 and sets a Warning +sub ProcessExif($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos} || 0; + my $dataLen = $$dirInfo{DataLen}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || $dataLen - $dirStart; + my $dirName = $$dirInfo{DirName}; + my $base = $$dirInfo{Base} || 0; + my $firstBase = $base; + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my $validate = $et->Options('Validate'); + my $saveFormat = $et->Options('SaveFormat'); + my $htmlDump = $$et{HTML_DUMP}; + my $success = 1; + my ($tagKey, $dirSize, $makerAddr, $strEnc, %offsetInfo, $offName, $nextOffName); + my $inMakerNotes = $$tagTablePtr{GROUPS}{0} eq 'MakerNotes'; + my $isExif = ($tagTablePtr eq \%Image::ExifTool::Exif::Main); + + # set encoding to assume for strings + $strEnc = $et->Options('CharsetEXIF') if $$tagTablePtr{GROUPS}{0} eq 'EXIF'; + + # ignore non-standard EXIF while in strict MWG compatibility mode + if (($validate or $Image::ExifTool::MWG::strict) and $dirName eq 'IFD0' and + $isExif and $$et{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/) + { + my $path = $et->MetadataPath(); + unless ($path =~ /^(JPEG-APP1-IFD0|TIFF-IFD0|PSD-EXIFInfo-IFD0)$/) { + if ($Image::ExifTool::MWG::strict) { + $et->Warn("Ignored non-standard EXIF at $path"); + return 0; + } else { + $et->Warn("Non-standard EXIF at $path", 1); + } + } + } + # mix htmlDump and Validate into verbose so we can test for all at once + $verbose = -1 if $htmlDump; + $verbose = -2 if $validate and not $verbose; + $dirName eq 'EXIF' and $dirName = $$dirInfo{DirName} = 'IFD0'; + $$dirInfo{Multi} = 1 if $dirName =~ /^(IFD0|SubIFD)$/ and not defined $$dirInfo{Multi}; + # get a more descriptive name for MakerNote sub-directories + my $dir = $$dirInfo{Name}; + $dir = $dirName unless $dir and $inMakerNotes and $dir !~ /^MakerNote/; + + my ($numEntries, $dirEnd); + if ($dirStart >= 0 and $dirStart <= $dataLen-2) { + # make sure data is large enough (patches bug in Olympus subdirectory lengths) + $numEntries = Get16u($dataPt, $dirStart); + $dirSize = 2 + 12 * $numEntries; + $dirEnd = $dirStart + $dirSize; + if ($dirSize > $dirLen) { + if (($verbose > 0 or $validate) and not $$dirInfo{SubIFD}) { + my $short = $dirSize - $dirLen; + $$et{INDENT} =~ s/..$//; # keep indent the same + $et->Warn("Short directory size for $dir (missing $short bytes)"); + $$et{INDENT} .= '| '; + } + undef $dirSize if $dirEnd > $dataLen; # read from file if necessary + } + } + # read IFD from file if necessary + unless ($dirSize) { + $success = 0; + if ($raf) { + # read the count of entries in this IFD + my $offset = $dirStart + $dataPos; + my ($buff, $buf2); + if ($raf->Seek($offset + $base, 0) and $raf->Read($buff,2) == 2) { + my $len = 12 * Get16u(\$buff,0); + # also read next IFD pointer if available + if ($raf->Read($buf2, $len+4) >= $len) { + $buff .= $buf2; + $dataPt = $$dirInfo{DataPt} = \$buff; + $dataPos = $$dirInfo{DataPos} = $offset; + $dataLen = $$dirInfo{DataLen} = length $buff; + $dirStart = $$dirInfo{DirStart} = 0; + $dirLen = $$dirInfo{DirLen} = length $buff; + $success = 1; + } + } + } + if ($success) { + $numEntries = Get16u($dataPt, $dirStart); + } else { + $et->Warn("Bad $dir directory", $inMakerNotes); + return 0 unless $inMakerNotes and $dirLen >= 14 and $dirStart >= 0 and + $dirStart + $dirLen <= length($$dataPt); + $dirSize = $dirLen; + $numEntries = int(($dirSize - 2) / 12); # read what we can + Set16u($numEntries, $dataPt, $dirStart); + } + $dirSize = 2 + 12 * $numEntries; + $dirEnd = $dirStart + $dirSize; + } + $verbose > 0 and $et->VerboseDir($dirName, $numEntries); + my $bytesFromEnd = $dataLen - $dirEnd; + if ($bytesFromEnd < 4) { + unless ($bytesFromEnd==2 or $bytesFromEnd==0) { + $et->Warn("Illegal $dir directory size ($numEntries entries)"); + return 0; + } + } + # fix base offset for maker notes if necessary + if (defined $$dirInfo{MakerNoteAddr}) { + $makerAddr = $$dirInfo{MakerNoteAddr}; + delete $$dirInfo{MakerNoteAddr}; + if (Image::ExifTool::MakerNotes::FixBase($et, $dirInfo)) { + $base = $$dirInfo{Base}; + $dataPos = $$dirInfo{DataPos}; + } + } + if ($htmlDump) { + $offName = $$dirInfo{OffsetName}; + my $longName = $dir eq 'MakerNotes' ? ($$dirInfo{Name} || $dir) : $dir; + if (defined $makerAddr) { + my $hdrLen = $dirStart + $dataPos + $base - $makerAddr; + $et->HDump($makerAddr, $hdrLen, "MakerNotes header", $longName) if $hdrLen > 0; + } + unless ($$dirInfo{NoDumpEntryCount}) { + $et->HDump($dirStart + $dataPos + $base, 2, "$longName entries", + "Entry count: $numEntries", undef, $offName); + } + my $tip; + my $id = $offName; + if ($bytesFromEnd >= 4) { + my $nxt = ($dir =~ /^(.*?)(\d+)$/) ? $1 . ($2 + 1) : 'Next IFD'; + my $off = Get32u($dataPt, $dirEnd); + $tip = sprintf("$nxt offset: 0x%.4x", $off); + ($nextOffName, $id) = NextOffsetName($et, $offName) if $off; + } + $et->HDump($dirEnd + $dataPos + $base, 4, "Next IFD", $tip, 0, $id); + } + + # patch for Canon EOS 40D firmware 1.0.4 bug (incorrect directory counts) + # (must do this before parsing directory or CameraSettings offset will be suspicious) + if ($inMakerNotes and $$et{Model} eq 'Canon EOS 40D' and $numEntries) { + my $entry = $dirStart + 2 + 12 * ($numEntries - 1); + my $fmt = Get16u($dataPt, $entry + 2); + if ($fmt < 1 or $fmt > 13) { + $et->HDump($entry+$dataPos+$base,12,"[invalid IFD entry]", + "Bad format type: $fmt", 1, $offName); + # adjust the number of directory entries + --$numEntries; + $dirEnd -= 12; + } + } + + # make sure that Compression and SubfileType are defined for this IFD (for Condition's) + $$et{Compression} = $$et{SubfileType} = ''; + + # loop through all entries in an EXIF directory (IFD) + my ($index, $valEnd, $offList, $offHash, $mapFmt, @valPos); + $mapFmt = $$tagTablePtr{VARS}{MAP_FORMAT} if $$tagTablePtr{VARS}; + + my ($warnCount, $lastID) = (0, -1); + for ($index=0; $index<$numEntries; ++$index) { + if ($warnCount > 10) { + $et->Warn("Too many warnings -- $dir parsing aborted", 2) and return 0; + } + my $entry = $dirStart + 2 + 12 * $index; + my $tagID = Get16u($dataPt, $entry); + my $format = Get16u($dataPt, $entry+2); + my $count = Get32u($dataPt, $entry+4); + if ($format < 1 or $format > 13) { + if ($mapFmt and $$mapFmt{$format}) { + $format = $$mapFmt{$format}; + } else { + $et->HDump($entry+$dataPos+$base,12,"[invalid IFD entry]", + "Bad format type: $format", 1, $offName); + # warn unless the IFD was just padded with zeros + if ($format or $validate) { + $et->Warn("Bad format ($format) for $dir entry $index", $inMakerNotes); + ++$warnCount; + } + # assume corrupted IFD if this is our first entry (except Sony ILCE-7M2 firmware 1.21) + return 0 unless $index or $$et{Model} eq 'ILCE-7M2'; + next; + } + } + my $formatStr = $formatName[$format]; # get name of this format + my $valueDataPt = $dataPt; + my $valueDataPos = $dataPos; + my $valueDataLen = $dataLen; + my $valuePtr = $entry + 8; # pointer to value within $$dataPt + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID); + my ($origFormStr, $bad, $rational, $subOffName); + # save the EXIF format codes if requested + $$et{SaveFormat}{$saveFormat = $formatStr} = 1 if $saveFormat; + # hack to patch incorrect count in Kodak SubIFD3 tags + if ($count < 2 and ref $$tagTablePtr{$tagID} eq 'HASH' and $$tagTablePtr{$tagID}{FixCount}) { + $offList or ($offList, $offHash) = GetOffList($dataPt, $dirStart, $dataPos, + $numEntries, $tagTablePtr); + my $i = $$offHash{Get32u($dataPt, $valuePtr)}; + if (defined $i and $i < $#$offList) { + my $oldCount = $count; + $count = int(($$offList[$i+1] - $$offList[$i]) / $formatSize[$format]); + $origFormStr = $formatName[$format] . '[' . $oldCount . ']' if $oldCount != $count; + } + } + $validate and not $inMakerNotes and Image::ExifTool::Validate::ValidateExif( + $et, $tagTablePtr, $tagID, $tagInfo, $lastID, $dir, $count, $formatStr); + my $size = $count * $formatSize[$format]; + my $readSize = $size; + if ($size > 4) { + if ($size > 0x7fffffff and (not $tagInfo or not $$tagInfo{ReadFromRAF})) { + $et->Warn(sprintf("Invalid size (%u) for %s %s",$size,$dir,TagName($tagID,$tagInfo)), $inMakerNotes); + ++$warnCount; + next; + } + $valuePtr = Get32u($dataPt, $valuePtr); + if ($validate and not $inMakerNotes) { + my $tagName = TagName($tagID, $tagInfo); + $et->Warn("Odd offset for $dir $tagName", 1) if $valuePtr & 0x01; + if ($valuePtr < 8 || ($valuePtr + $size > length($$dataPt) and + $valuePtr + $size > $$et{VALUE}{FileSize})) + { + $et->Warn("Invalid offset for $dir $tagName"); + ++$warnCount; + next; + } + if ($valuePtr + $size > $dirStart + $dataPos and $valuePtr < $dirEnd + $dataPos + 4) { + $et->Warn("Value for $dir $tagName overlaps IFD"); + } + foreach (@valPos) { + next if $$_[0] >= $valuePtr + $size or $$_[0] + $$_[1] <= $valuePtr; + $et->Warn("Value for $dir $tagName overlaps $$_[2]"); + } + push @valPos, [ $valuePtr, $size, $tagName ]; + } + # fix valuePtr if necessary + if ($$dirInfo{FixOffsets}) { + my $wFlag; + $valEnd or $valEnd = $dataPos + $dirEnd + 4; + #### eval FixOffsets ($valuePtr, $valEnd, $size, $tagID, $wFlag) + eval $$dirInfo{FixOffsets}; + } + my $suspect; + # offset shouldn't point into TIFF header + $valuePtr < 8 and not $$dirInfo{ZeroOffsetOK} and $suspect = $warnCount; + # convert offset to pointer in $$dataPt + if ($$dirInfo{EntryBased} or (ref $$tagTablePtr{$tagID} eq 'HASH' and + $$tagTablePtr{$tagID}{EntryBased})) + { + $valuePtr += $entry; + } else { + $valuePtr -= $dataPos; + } + # value shouldn't overlap our directory + $suspect = $warnCount if $valuePtr < $dirEnd and $valuePtr+$size > $dirStart; + # load value from file if necessary + if ($valuePtr < 0 or $valuePtr+$size > $dataLen) { + # get value by seeking in file if we are allowed + my $buff; + if ($raf) { + # avoid loading large binary data unless necessary + while ($size > BINARY_DATA_LIMIT) { + if ($tagInfo) { + # make large unknown blocks binary data + $$tagInfo{Binary} = 1 if $$tagInfo{Unknown}; + last unless $$tagInfo{Binary}; # must read non-binary data + last if $$tagInfo{SubDirectory}; + my $lcTag = lc($$tagInfo{Name}); + if ($$et{OPTIONS}{Binary} and + not $$et{EXCL_TAG_LOOKUP}{$lcTag}) + { + # read binary data if specified unless tagsFromFile won't use it + last unless $$et{TAGS_FROM_FILE} and $$tagInfo{Protected}; + } + # must read if tag is specified by name + last if $$et{REQ_TAG_LOOKUP}{$lcTag}; + } else { + # must read value if needed for a condition + last if defined $tagInfo; + } + # (note: changing the value without changing $size will cause + # a warning in the verbose output, but we need to maintain the + # proper size for the htmlDump, so we can't change this) + $buff = "Binary data $size bytes"; + $readSize = length $buff; + last; + } + # read from file if necessary + unless (defined $buff) { + my $wrn; + my $readFromRAF = ($tagInfo and $$tagInfo{ReadFromRAF}); + if (not $raf->Seek($base + $valuePtr + $dataPos, 0)) { + $wrn = "Invalid offset for $dir entry $index"; + } elsif ($readFromRAF and $size > BINARY_DATA_LIMIT and + not $$et{REQ_TAG_LOOKUP}{lc $$tagInfo{Name}}) + { + $buff = "$$tagInfo{Name} data $size bytes"; + $readSize = length $buff; + } elsif ($raf->Read($buff,$size) != $size) { + $wrn = "Error reading value for $dir entry $index"; + } elsif ($readFromRAF) { + # seek back to the start of the value + $raf->Seek($base + $valuePtr + $dataPos, 0); + } + if ($wrn) { + $et->Warn($wrn, $inMakerNotes); + return 0 unless $inMakerNotes or $htmlDump; + ++$warnCount; + $buff = '' unless defined $buff; + $readSize = length $buff; + $bad = 1; + } + } + $valueDataLen = length $buff; + $valueDataPt = \$buff; + $valueDataPos = $valuePtr + $dataPos; + $valuePtr = 0; + } else { + my ($tagStr, $tmpInfo, $leicaTrailer); + if ($tagInfo) { + $tagStr = $$tagInfo{Name}; + $leicaTrailer = $$tagInfo{LeicaTrailer}; + } elsif (defined $tagInfo) { + $tmpInfo = $et->GetTagInfo($tagTablePtr, $tagID, \ '', $formatStr, $count); + if ($tmpInfo) { + $tagStr = $$tmpInfo{Name}; + $leicaTrailer = $$tmpInfo{LeicaTrailer}; + } + } + if ($tagInfo and $$tagInfo{ChangeBase}) { + # adjust base offset for this tag only + #### eval ChangeBase ($dirStart,$dataPos) + my $newBase = eval $$tagInfo{ChangeBase}; + $valuePtr += $newBase; + } + $tagStr or $tagStr = sprintf("tag 0x%.4x",$tagID); + # allow PreviewImage to run outside EXIF data + if ($tagStr eq 'PreviewImage' and $$et{RAF}) { + my $pos = $$et{RAF}->Tell(); + $buff = $et->ExtractBinary($base + $valuePtr + $dataPos, $size, 'PreviewImage'); + $$et{RAF}->Seek($pos, 0); + $valueDataPt = \$buff; + $valueDataPos = $valuePtr + $dataPos; + $valueDataLen = $size; + $valuePtr = 0; + } elsif ($leicaTrailer and $$et{RAF}) { + if ($verbose > 0) { + $et->VPrint(0, "$$et{INDENT}$index) $tagStr --> (outside APP1 segment)\n"); + } + if ($et->Options('FastScan')) { + $et->Warn('Ignored Leica MakerNote trailer'); + } else { + require Image::ExifTool::Fixup; + $$et{LeicaTrailer} = { + TagInfo => $tagInfo || $tmpInfo, + Offset => $base + $valuePtr + $dataPos, + Size => $size, + Fixup => new Image::ExifTool::Fixup, + }; + } + } else { + $et->Warn("Bad offset for $dir $tagStr", $inMakerNotes); + ++$warnCount; + } + unless (defined $buff) { + $valueDataPt = ''; + $valueDataPos = $valuePtr + $dataPos; + $valueDataLen = 0; + $valuePtr = 0; + $bad = 1; + } + } + } + # warn about suspect offsets if they didn't already cause another warning + if (defined $suspect and $suspect == $warnCount) { + my $tagStr = $tagInfo ? $$tagInfo{Name} : sprintf('tag 0x%.4x', $tagID); + if ($et->Warn("Suspicious $dir offset for $tagStr", $inMakerNotes)) { + ++$warnCount; + next unless $verbose; + } + } + } + # treat single unknown byte as int8u + $formatStr = 'int8u' if $format == 7 and $count == 1; + + my ($val, $subdir, $wrongFormat); + if ($tagID > 0xf000 and $isExif) { + my $oldInfo = $$tagTablePtr{$tagID}; + if ((not $oldInfo or (ref $oldInfo eq 'HASH' and $$oldInfo{Condition} and + not $$oldInfo{PSRaw})) and not $bad) + { + # handle special case of Photoshop RAW tags (0xfde8-0xfe58) + # --> generate tags from the value if possible + $val = ReadValue($valueDataPt,$valuePtr,$formatStr,$count,$readSize); + if (defined $val and $val =~ /(.*): (.*)/) { + my $tag = $1; + $val = $2; + $tag =~ s/'s//; # remove 's (so "Owner's Name" becomes "OwnerName") + $tag =~ tr/a-zA-Z0-9_//cd; # remove unknown characters + if ($tag) { + $tagInfo = { + Name => $tag, + Condition => '$$self{TIFF_TYPE} ne "DCR"', + ValueConv => '$_=$val;s/^.*: //;$_', # remove descr + PSRaw => 1, # (just as flag to avoid adding this again) + }; + AddTagToTable($tagTablePtr, $tagID, $tagInfo); + # generate conditional list if a conditional tag already existed + $$tagTablePtr{$tagID} = [ $oldInfo, $tagInfo ] if $oldInfo; + } + } + } + } + if (defined $tagInfo and not $tagInfo) { + if ($bad) { + undef $tagInfo; + } else { + # GetTagInfo() required the value for a Condition + my $tmpVal = substr($$valueDataPt, $valuePtr, $readSize < 128 ? $readSize : 128); + # (use original format name in this call -- $formatStr may have been changed to int8u) + $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID, \$tmpVal, + $formatName[$format], $count); + } + } + # make sure we are handling the 'ifd' format properly + if (($format == 13 or $format == 18) and (not $tagInfo or not $$tagInfo{SubIFD})) { + my $str = sprintf('%s tag 0x%.4x IFD format not handled', $dirName, $tagID); + $et->Warn($str, $inMakerNotes); + } + if (defined $tagInfo) { + my $readFormat = $$tagInfo{Format}; + $subdir = $$tagInfo{SubDirectory}; + # unless otherwise specified, all SubDirectory data except + # EXIF SubIFD offsets should be unformatted + $readFormat = 'undef' if $subdir and not $$tagInfo{SubIFD} and not $readFormat; + # override EXIF format if specified + if ($readFormat) { + $formatStr = $readFormat; + my $newNum = $formatNumber{$formatStr}; + if ($newNum and $newNum != $format) { + $origFormStr = $formatName[$format] . '[' . $count . ']'; + $format = $newNum; + $size = $readSize = $$tagInfo{FixedSize} if $$tagInfo{FixedSize}; + # adjust number of items for new format size + $count = int($size / $formatSize[$format]); + } + } + # verify that offset-type values are integral + if (($$tagInfo{IsOffset} or $$tagInfo{SubIFD}) and not $intFormat{$formatStr}) { + $et->Warn(sprintf('Wrong format (%s) for %s 0x%.4x %s',$formatStr,$dir,$tagID,$$tagInfo{Name})); + if ($validate) { + $$et{WrongFormat}{"$dir:$$tagInfo{Name}"} = 1; + $offsetInfo{$tagID} = [ $tagInfo, '' ]; + } + next unless $verbose; + $wrongFormat = 1; + } + } else { + next unless $verbose; + } + unless ($bad) { + # limit maximum length of data to reformat + # (avoids long delays when processing some corrupted files) + my $warned; + if ($count > 100000 and $formatStr !~ /^(undef|string|binary)$/) { + my $tagName = $tagInfo ? $$tagInfo{Name} : sprintf('tag 0x%.4x', $tagID); + # (count of 196608 is typical for ColorMap) + if ($tagName ne 'TransferFunction' or $count != 196608) { + my $minor = $count > 2000000 ? 0 : 2; + if ($et->Warn("Ignoring $dirName $tagName with excessive count", $minor)) { + next unless $$et{OPTIONS}{HtmlDump}; + $warned = 1; + } + } + } + if ($count > 500 and $formatStr !~ /^(undef|string|binary)$/ and + (not $tagInfo or $$tagInfo{LongBinary} or $warned) and not $$et{OPTIONS}{IgnoreMinorErrors}) + { + $et->WarnOnce('Not decoding some large array(s). Ignore minor errors to decode', 2) unless $warned; + next if $$et{TAGS_FROM_FILE}; # don't generate bogus value when copying tags + $val = "(large array of $count $formatStr values)"; + } else { + # convert according to specified format + $val = ReadValue($valueDataPt,$valuePtr,$formatStr,$count,$readSize,\$rational); + # re-code if necessary + $val = $et->Decode($val, $strEnc) if $strEnc and $formatStr eq 'string' and defined $val; + } + } + + if ($verbose) { + my $tval = $val; + # also show as a rational + $tval .= " ($rational)" if defined $rational; + if ($htmlDump) { + my ($tagName, $colName); + if ($tagID == 0x927c and $dirName eq 'ExifIFD') { + $tagName = 'MakerNotes'; + } elsif ($tagInfo) { + $tagName = $$tagInfo{Name}; + } else { + $tagName = sprintf("Tag 0x%.4x",$tagID); + } + my $dname = sprintf("${dir}-%.2d", $index); + # build our tool tip + $size < 0 and $size = $count * $formatSize[$format]; + my $fstr = "$formatName[$format]\[$count]"; + $fstr = "$origFormStr read as $fstr" if $origFormStr and $origFormStr ne $fstr; + $fstr .= ' <-- WRONG' if $wrongFormat; + my $tip = sprintf("Tag ID: 0x%.4x\n", $tagID) . + "Format: $fstr\nSize: $size bytes\n"; + if ($size > 4) { + my $offPt = Get32u($dataPt,$entry+8); + # (test this with ../pics/{CanonEOS-1D_XMarkIII.hif,PanasonicDC-G9.rw2}) + my $actPt = $valuePtr + $valueDataPos + $base - ($$et{EXIF_POS} || 0) + ($$et{BASE_FUDGE} || 0); + $tip .= sprintf("Value offset: 0x%.4x\n", $offPt); + # highlight tag name (red for bad size) + my $style = ($bad or not defined $tval) ? 'V' : 'H'; + if ($actPt != $offPt) { + $tip .= sprintf("Actual offset: 0x%.4x\n", $actPt); + my $sign = $actPt < $offPt ? '-' : ''; + $tip .= sprintf("Offset base: ${sign}0x%.4x\n", abs($actPt - $offPt)); + $style = 'F' if $style eq 'H'; # purple for different offsets + } + if ($$et{EXIF_POS} and not $$et{BASE_FUDGE}) { + $tip .= sprintf("File offset: 0x%.4x\n", $actPt + $$et{EXIF_POS}) + } + $colName = "<span class=$style>$tagName</span>"; + $colName .= ' <span class=V>(odd)</span>' if $offPt & 0x01; + } else { + $colName = $tagName; + } + $colName .= ' <span class=V>(err)</span>' if $wrongFormat; + $colName .= ' <span class=V>(seq)</span>' if $tagID <= $lastID and not $inMakerNotes; + $lastID = $tagID; + if (not defined $tval) { + $tval = '<bad size/offset>'; + } else { + $tval = substr($tval,0,28) . '[...]' if length($tval) > 32; + if ($formatStr =~ /^(string|undef|binary)/) { + # translate non-printable characters + $tval =~ tr/\x00-\x1f\x7f-\xff/./; + } elsif ($tagInfo and Image::ExifTool::IsInt($tval)) { + if ($$tagInfo{IsOffset} or $$tagInfo{SubIFD}) { + $tval = sprintf('0x%.4x', $tval); + my $actPt = $val + $base - ($$et{EXIF_POS} || 0) + ($$et{BASE_FUDGE} || 0); + if ($actPt != $val) { + $tval .= sprintf("\nActual offset: 0x%.4x", $actPt); + my $sign = $actPt < $val ? '-' : ''; + $tval .= sprintf("\nOffset base: ${sign}0x%.4x", abs($actPt - $val)); + } + } elsif ($$tagInfo{PrintHex}) { + $tval = sprintf('0x%x', $tval); + } + } + } + $tip .= "Value: $tval"; + my $id = $offName; + my $sid; + ($subOffName, $id, $sid) = NextOffsetName($et, $offName) if $tagInfo and $$tagInfo{SubIFD}; + $et->HDump($entry+$dataPos+$base, 12, "$dname $colName", $tip, 1, $id); + next if $valueDataLen < 0; # don't process bad pointer entry + if ($size > 4) { + my $exifDumpPos = $valuePtr + $valueDataPos + $base; + my $flag = 0; + if ($subdir) { + if ($$tagInfo{MakerNotes}) { + $flag = 0x04; + } elsif ($$tagInfo{NestedHtmlDump}) { + $flag = $$tagInfo{NestedHtmlDump} == 2 ? 0x10 : 0x04; + } + } + # add value data block (underlining maker notes data) + $et->HDump($exifDumpPos,$size,"$tagName value",'SAME', $flag, $sid); + } + } else { + if ($tagID <= $lastID and not $inMakerNotes) { + my $str = $tagInfo ? ' '.$$tagInfo{Name} : ''; + if ($tagID == $lastID) { + $et->Warn(sprintf('Duplicate tag 0x%.4x%s in %s', $tagID, $str, $dirName)); + } else { + $et->Warn(sprintf('Tag ID 0x%.4x%s out of sequence in %s', $tagID, $str, $dirName)); + } + } + $lastID = $tagID; + if ($verbose > 0) { + my $fstr = $formatName[$format]; + $fstr = "$origFormStr read as $fstr" if $origFormStr; + $et->VerboseInfo($tagID, $tagInfo, + Table => $tagTablePtr, + Index => $index, + Value => $tval, + DataPt => $valueDataPt, + DataPos => $valueDataPos + $base, + Size => $size, + Start => $valuePtr, + Format => $fstr, + Count => $count, + ); + } + } + next if not $tagInfo or $wrongFormat; + } + next unless defined $val; +#.............................................................................. +# Handle SubDirectory tag types +# + if ($subdir) { + # don't process empty subdirectories + unless ($size) { + unless ($$tagInfo{MakerNotes} or $inMakerNotes) { + $et->Warn("Empty $$tagInfo{Name} data", 1); + } + next; + } + my (@values, $newTagTable, $dirNum, $newByteOrder, $invalid); + my $tagStr = $$tagInfo{Name}; + if ($$subdir{MaxSubdirs}) { + @values = split ' ', $val; + # limit the number of subdirectories we parse + my $over = @values - $$subdir{MaxSubdirs}; + if ($over > 0) { + $et->Warn("Ignoring $over $tagStr directories"); + splice @values, $$subdir{MaxSubdirs}; + } + $val = shift @values; + } + if ($$subdir{TagTable}) { + $newTagTable = GetTagTable($$subdir{TagTable}); + $newTagTable or warn("Unknown tag table $$subdir{TagTable}"), next; + } else { + $newTagTable = $tagTablePtr; # use existing table + } + # loop through all sub-directories specified by this tag + for ($dirNum=0; ; ++$dirNum) { + my $subdirBase = $base; + my $subdirDataPt = $valueDataPt; + my $subdirDataPos = $valueDataPos; + my $subdirDataLen = $valueDataLen; + my $subdirStart = $valuePtr; + if (defined $$subdir{Start}) { + # set local $valuePtr relative to file $base for eval + my $valuePtr = $subdirStart + $subdirDataPos; + #### eval Start ($valuePtr, $val) + my $newStart = eval($$subdir{Start}); + unless (Image::ExifTool::IsInt($newStart)) { + $et->Warn("Bad value for $tagStr"); + last; + } + # convert back to relative to $subdirDataPt + $newStart -= $subdirDataPos; + # adjust directory size if necessary + unless ($$tagInfo{SubIFD} or $$subdir{BadOffset}) { + $size -= $newStart - $subdirStart; + } + $subdirStart = $newStart; + } + # this is a pain, but some maker notes are always a specific + # byte order, regardless of the byte order of the file + my $oldByteOrder = GetByteOrder(); + $newByteOrder = $$subdir{ByteOrder}; + if ($newByteOrder) { + if ($newByteOrder =~ /^Little/i) { + $newByteOrder = 'II'; + } elsif ($newByteOrder =~ /^Big/i) { + $newByteOrder = 'MM'; + } elsif ($$subdir{OffsetPt}) { + undef $newByteOrder; + warn "Can't have variable byte ordering for SubDirectories using OffsetPt"; + last; + } elsif ($subdirStart + 2 <= $subdirDataLen) { + # attempt to determine the byte ordering by checking + # the number of directory entries. This is an int16u + # that should be a reasonable value. + my $num = Get16u($subdirDataPt, $subdirStart); + if ($num & 0xff00 and ($num>>8) > ($num&0xff)) { + # This looks wrong, we shouldn't have this many entries + my %otherOrder = ( II=>'MM', MM=>'II' ); + $newByteOrder = $otherOrder{$oldByteOrder}; + } else { + $newByteOrder = $oldByteOrder; + } + } + } else { + $newByteOrder = $oldByteOrder; + } + # set base offset if necessary + if ($$subdir{Base}) { + # calculate subdirectory start relative to $base for eval + my $start = $subdirStart + $subdirDataPos; + #### eval Base ($start,$base) + $subdirBase = eval($$subdir{Base}) + $base; + } + # add offset to the start of the directory if necessary + if ($$subdir{OffsetPt}) { + #### eval OffsetPt ($valuePtr) + my $pos = eval $$subdir{OffsetPt}; + if ($pos + 4 > $subdirDataLen) { + $et->Warn("Bad $tagStr OffsetPt"); + last; + } + SetByteOrder($newByteOrder); + $subdirStart += Get32u($subdirDataPt, $pos); + SetByteOrder($oldByteOrder); + } + if ($subdirStart < 0 or $subdirStart + 2 > $subdirDataLen) { + # convert $subdirStart back to a file offset + if ($raf) { + # reset SubDirectory buffer (we will load it later) + my $buff = ''; + $subdirDataPt = \$buff; + $subdirDataLen = $size = length $buff; + } else { + my $msg = "Bad $tagStr SubDirectory start"; + if ($verbose > 0) { + if ($subdirStart < 0) { + $msg .= " (directory start $subdirStart is before EXIF start)"; + } else { + my $end = $subdirStart + $size; + $msg .= " (directory end is $end but EXIF size is only $subdirDataLen)"; + } + } + $et->Warn($msg, $inMakerNotes); + last; + } + } + + # must update subdirDataPos if $base changes for this subdirectory + $subdirDataPos += $base - $subdirBase; + + # build information hash for new directory + my %subdirInfo = ( + Name => $tagStr, + Base => $subdirBase, + DataPt => $subdirDataPt, + DataPos => $subdirDataPos, + DataLen => $subdirDataLen, + DirStart => $subdirStart, + DirLen => $size, + RAF => $raf, + Parent => $dirName, + DirName => $$subdir{DirName}, + FixBase => $$subdir{FixBase}, + FixOffsets => $$subdir{FixOffsets}, + EntryBased => $$subdir{EntryBased}, + TagInfo => $tagInfo, + SubIFD => $$tagInfo{SubIFD}, + Subdir => $subdir, + OffsetName => $subOffName, + ); + # (remember: some cameras incorrectly write maker notes in IFD0) + if ($$tagInfo{MakerNotes}) { + # don't parse makernotes if FastScan > 1 + my $fast = $et->Options('FastScan'); + last if $fast and $fast > 1; + $subdirInfo{MakerNoteAddr} = $valuePtr + $valueDataPos + $base; + $subdirInfo{NoFixBase} = 1 if defined $$subdir{Base}; + } + # set directory IFD name from group name of family 1 if it exists, + # unless the tag is writable as a block in which case group 1 may + # have been set automatically + if ($$tagInfo{Groups} and not $$tagInfo{Writable}) { + $subdirInfo{DirName} = $$tagInfo{Groups}{1}; + # number multiple subdirectories + $subdirInfo{DirName} =~ s/\d*$/$dirNum/ if $dirNum; + } + SetByteOrder($newByteOrder); # set byte order for this subdir + # validate the subdirectory if necessary + my $dirData = $subdirDataPt; # set data pointer to be used in eval + #### eval Validate ($val, $dirData, $subdirStart, $size) + my $ok = 0; + if (defined $$subdir{Validate} and not eval $$subdir{Validate}) { + $et->Warn("Invalid $tagStr data", $inMakerNotes); + $invalid = 1; + } else { + if (not $subdirInfo{DirName} and $inMakerNotes) { + $subdirInfo{DirName} = $$tagInfo{Name}; + } + # process the subdirectory + $ok = $et->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc}); + } + # print debugging information if there were errors + if (not $ok and $verbose > 1 and $subdirStart != $valuePtr) { + my $out = $et->Options('TextOut'); + printf $out "%s (SubDirectory start = 0x%x)\n", $$et{INDENT}, $subdirStart; + } + SetByteOrder($oldByteOrder); # restore original byte swapping + + @values or last; + $val = shift @values; # continue with next subdir + } + my $doMaker = $et->Options('MakerNotes'); + next unless $doMaker or $$et{REQ_TAG_LOOKUP}{lc($tagStr)} or $$tagInfo{BlockExtract}; + # extract as a block if specified + if ($$tagInfo{MakerNotes}) { + # save maker note byte order (if it was significant and valid) + if ($$subdir{ByteOrder} and not $invalid) { + $$et{MAKER_NOTE_BYTE_ORDER} = + defined ($$et{UnknownByteOrder}) ? + $$et{UnknownByteOrder} : $newByteOrder; + } + if ($doMaker and $doMaker eq '2') { + # extract maker notes without rebuilding (no fixup information) + delete $$et{MAKER_NOTE_FIXUP}; + } elsif (not $$tagInfo{NotIFD} or $$tagInfo{IsPhaseOne}) { + # this is a pain, but we must rebuild EXIF-type maker notes to + # include all the value data if data was outside the maker notes + my %makerDirInfo = ( + Name => $tagStr, + Base => $base, + DataPt => $valueDataPt, + DataPos => $valueDataPos, + DataLen => $valueDataLen, + DirStart => $valuePtr, + DirLen => $size, + RAF => $raf, + Parent => $dirName, + DirName => 'MakerNotes', + FixOffsets => $$subdir{FixOffsets}, + TagInfo => $tagInfo, + ); + my $val2; + if ($$tagInfo{IsPhaseOne}) { + $$et{DropTags} = 1; + $val2 = Image::ExifTool::PhaseOne::WritePhaseOne($et, \%makerDirInfo, $newTagTable); + delete $$et{DropTags}; + } else { + $makerDirInfo{FixBase} = 1 if $$subdir{FixBase}; + # rebuild maker notes (creates $$et{MAKER_NOTE_FIXUP}) + $val2 = RebuildMakerNotes($et, \%makerDirInfo, $newTagTable); + } + if (defined $val2) { + $val = $val2; + } elsif ($size > 4) { + $et->Warn('Error rebuilding maker notes (may be corrupt)'); + } + } + } else { + # extract this directory as a block if specified + next unless $$tagInfo{Writable}; + } + } + #.............................................................................. + # convert to absolute offsets if this tag is an offset + #### eval IsOffset ($val, $et) + if ($$tagInfo{IsOffset} and eval $$tagInfo{IsOffset}) { + my $offsetBase = $$tagInfo{IsOffset} eq '2' ? $firstBase : $base; + $offsetBase += $$et{BASE}; + # handle offsets which use a wrong base (Minolta A200) + if ($$tagInfo{WrongBase}) { + my $self = $et; + #### eval WrongBase ($self) + $offsetBase += eval $$tagInfo{WrongBase} || 0; + } + my @vals = split(' ',$val); + foreach $val (@vals) { + $val += $offsetBase; + } + $val = join(' ', @vals); + } + if ($validate) { + if ($$tagInfo{OffsetPair}) { + $offsetInfo{$tagID} = [ $tagInfo, $val ]; + } elsif ($saveForValidate{$tagID} and $isExif) { + $offsetInfo{$tagID} = $val; + } + } + # save the value of this tag + $tagKey = $et->FoundTag($tagInfo, $val); + if (defined $tagKey) { + # set the group 1 name for tags in specified tables + $et->SetGroup($tagKey, $dirName) if $$tagTablePtr{SET_GROUP1}; + # save original components of rational numbers (used when copying) + $$et{RATIONAL}{$tagKey} = $rational if defined $rational; + $$et{TAG_EXTRA}{$tagKey}{G6} = $saveFormat if $saveFormat; + } + } + + # validate image data offsets for this IFD + if ($validate and %offsetInfo) { + Image::ExifTool::Validate::ValidateOffsetInfo($et, \%offsetInfo, $$dirInfo{DirName}, $inMakerNotes) + } + + # scan for subsequent IFD's if specified + if ($$dirInfo{Multi} and $bytesFromEnd >= 4) { + # use same directory information for trailing directory, + # but change the start location (ProcessDirectory will + # test to make sure we don't reprocess the same dir twice) + my %newDirInfo = %$dirInfo; + $newDirInfo{Multi} = 0; # prevent recursion + $newDirInfo{OffsetName} = $nextOffName; + $$et{INDENT} =~ s/..$//; # keep indent the same + for (;;) { + my $offset = Get32u($dataPt, $dirEnd) or last; + $newDirInfo{DirStart} = $offset - $dataPos; + # increment IFD number + my $ifdNum = $newDirInfo{DirName} =~ s/(\d+)$// ? $1 : 0; + $newDirInfo{DirName} .= $ifdNum + 1; + # must validate SubIFD1 because the nextIFD pointer is invalid for some RAW formats + if ($newDirInfo{DirName} ne 'SubIFD1' or ValidateIFD(\%newDirInfo)) { + my $cur = pop @{$$et{PATH}}; + $et->ProcessDirectory(\%newDirInfo, $tagTablePtr) or $success = 0; + push @{$$et{PATH}}, $cur; + if ($success and $newDirInfo{BytesFromEnd} >= 4) { + $dataPt = $newDirInfo{DataPt}; + $dataPos = $newDirInfo{DataPos}; + $dirEnd = $newDirInfo{DirEnd}; + next; + } + } elsif ($verbose or $$et{TIFF_TYPE} eq 'TIFF') { + $et->Warn('Ignored bad IFD linked from SubIFD'); + } + last; + } + } elsif (defined $$dirInfo{Multi}) { + # return necessary parameters for parsing next IFD + $$dirInfo{DirEnd} = $dirEnd; + $$dirInfo{OffsetName} = $nextOffName; + $$dirInfo{BytesFromEnd} = $bytesFromEnd; + } + return $success; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Exif - Read EXIF/TIFF meta information + +=head1 SYNOPSIS + +This module is required by Image::ExifTool. + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool for processing +EXIF and TIFF meta information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.exif.org/Exif2-2.PDF> + +=item L<http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf> + +=item L<http://partners.adobe.com/asn/developer/pdfs/tn/TIFF6.pdf> + +=item L<http://partners.adobe.com/public/developer/en/tiff/TIFFPM6.pdf> + +=item L<http://www.adobe.com/products/dng/pdfs/dng_spec.pdf> + +=item L<http://www.awaresystems.be/imaging/tiff/tifftags.html> + +=item L<http://www.remotesensing.org/libtiff/TIFFTechNote2.html> + +=item L<http://www.exif.org/dcf.PDF> + +=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html> + +=item L<http://www.fine-view.com/jp/lab/doc/ps6ffspecsv2.pdf> + +=item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html> + +=item L<http://hul.harvard.edu/jhove/tiff-tags.html> + +=item L<http://www.microsoft.com/whdc/xps/wmphoto.mspx> + +=item L<http://www.asmail.be/msg0054681802.html> + +=item L<http://crousseau.free.fr/imgfmt_raw.htm> + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=item L<http://www.digitalpreservation.gov/formats/content/tiff_tags.shtml> + +=item L<http://community.roxen.com/developers/idocs/rfc/rfc3949.html> + +=item L<http://tools.ietf.org/html/draft-ietf-fax-tiff-fx-extension1-01> + +=item L<http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/cinemadng/pdfs/CinemaDNG_Format_Specification_v1_1.pdf> + +=item L<http://geotiff.maptools.org/spec/geotiffhome.html> + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jeremy Brown for the 35efl tags, and Matt Madrid for his help with +the XP character code conversions. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/EXIF Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/FITS.pm b/lib/Image/ExifTool/FITS.pm new file mode 100644 index 0000000..ca0bff3 --- /dev/null +++ b/lib/Image/ExifTool/FITS.pm @@ -0,0 +1,159 @@ +#------------------------------------------------------------------------------ +# File: FITS.pm +# +# Description: Read Flexible Image Transport System metadata +# +# Revisions: 2018/03/07 - P. Harvey Created +# +# References: 1) https://fits.gsfc.nasa.gov/fits_standard.html +#------------------------------------------------------------------------------ + +package Image::ExifTool::FITS; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.02'; + +# FITS tags (ref 1) +%Image::ExifTool::FITS::Main = ( + GROUPS => { 2 => 'Image' }, + NOTES => q{ + This table lists some standard Flexible Image Transport System (FITS) tags, + but ExifTool will extract any other tags found. See + L<https://fits.gsfc.nasa.gov/fits_standard.html> for the specification. + }, + TELESCOP => 'Telescope', + BACKGRND => 'Background', + INSTRUME => 'Instrument', + OBJECT => 'Object', + OBSERVER => 'Observer', + DATE => { Name => 'CreateDate', Groups => { 2 => 'Time' } }, + AUTHOR => { Name => 'Author', Groups => { 2 => 'Author' } }, + REFERENC => 'Reference', + 'DATE-OBS'=> { Name => 'ObservationDate', Groups => { 2 => 'Time' } }, + 'TIME-OBS'=> { Name => 'ObservationTime', Groups => { 2 => 'Time' } }, + 'DATE-END'=> { Name => 'ObservationDateEnd', Groups => { 2 => 'Time' } }, + 'TIME-END'=> { Name => 'ObservationTimeEnd', Groups => { 2 => 'Time' } }, + COMMENT => { Name => 'Comment', PrintConv => '$val =~ s/^ +//; $val', + Notes => 'leading spaces are removed if L<PrintConv|../ExifTool.html#PrintConv> is enabled' }, + HISTORY => { Name => 'History', PrintConv => '$val =~ s/^ +//; $val', + Notes => 'leading spaces are removed if L<PrintConv|../ExifTool.html#PrintConv> is enabled' }, +); + +#------------------------------------------------------------------------------ +# Read information in a FITS document +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid FITS file +sub ProcessFITS($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $tag, $continue); + + return 0 unless $raf->Read($buff, 80) == 80 and $buff =~ /^SIMPLE = {20}T/; + $et->SetFileType(); + my $tagTablePtr = GetTagTable('Image::ExifTool::FITS::Main'); + + for (;;) { + $raf->Read($buff, 80) == 80 or $et->Warn('Truncated FITS header'), last; + my $key = substr($buff, 0, 8); + $key =~ s/ +$//; # remove trailing space from key + if ($key eq 'CONTINUE') { + defined $continue or $et->WarnOnce('Unexpected FITS CONTINUE keyword'), next; + } else { + if (defined $continue) { + # the previous value wasn't continued, so store with the trailing '&' + $et->HandleTag($tagTablePtr, $tag, $continue . '&'); + undef $continue; + } + last if $key eq 'END'; + # make sure the key is valid + $key =~ /^[-_A-Z0-9]*$/ or $et->Warn('Format error in FITS header'), last; + if ($key eq 'COMMENT' or $key eq 'HISTORY') { + my $val = substr($buff, 8); # comments start in column 9 + $val =~ s/ +$//; # remove trailing spaces + $et->HandleTag($tagTablePtr, $key, $val); + next; + } + # ignore other lines that aren't tags + next unless substr($buff,8,2) eq '= '; + # save tag name (avoiding potential conflict with ExifTool variables) + $tag = $Image::ExifTool::specialTags{$key} ? "_$key" : $key; + # add to tag table if necessary + unless ($$tagTablePtr{$tag}) { + my $name = ucfirst lc $tag; # make tag name lower case with leading capital + $name =~ s/_(.)/\U$1/g; # remove all '_' and capitalize subsequent letter + AddTagToTable($tagTablePtr, $tag, { Name => $name }); + } + } + my $val = substr($buff, 10); + # parse quoted values + if ($val =~ /^'(.*?)'(.*)/) { + ($val, $buff) = ($1, $2); + while ($buff =~ /^('.*?)'(.*)/) { # handle escaped quotes + $val .= $1; + $buff = $2; + } + $val =~ s/ +$//; # remove trailing spaces + if (defined $continue) { + $val = $continue . $val; + undef $continue; + } + # check for possible continuation, removing trailing '&' + $val =~ s/\&$// and $continue = $val, next; + } elsif (defined $continue) { + $et->WarnOnce('Invalid FITS CONTINUE value'); + next; + } else { + $val =~ s/ *(\/.*)?$//; # remove trailing spaces and comment + next unless length $val; # ignore undefined values + $val =~ s/^ +//; # remove leading spaces + # re-format floating-point values to use 'e' + $val =~ tr/DE/e/ if $val =~ /^[+-]?(?=\d|\.\d)\d*(\.\d*)?([ED]([+-]?\d+))?$/; + } + $et->HandleTag($tagTablePtr, $tag, $val); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::FITS - Read Flexible Image Transport System metadata + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read meta +information from FITS (Flexible Image Transport System) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://fits.gsfc.nasa.gov/fits_standard.html> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/FITS Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/FLAC.pm b/lib/Image/ExifTool/FLAC.pm new file mode 100644 index 0000000..a9def18 --- /dev/null +++ b/lib/Image/ExifTool/FLAC.pm @@ -0,0 +1,307 @@ +#------------------------------------------------------------------------------ +# File: FLAC.pm +# +# Description: Read Free Lossless Audio Codec information +# +# Revisions: 11/13/2006 - P. Harvey Created +# +# References: 1) http://flac.sourceforge.net/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::FLAC; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.08'; + +sub ProcessBitStream($$$); + +# FLAC metadata blocks +%Image::ExifTool::FLAC::Main = ( + NOTES => q{ + Free Lossless Audio Codec (FLAC) meta information. ExifTool also extracts + ID3 information from these files. + }, + 0 => { + Name => 'StreamInfo', + SubDirectory => { TagTable => 'Image::ExifTool::FLAC::StreamInfo' }, + }, + 1 => { Name => 'Padding', Binary => 1, Unknown => 1 }, + 2 => { Name => 'Application', Binary => 1, Unknown => 1 }, + 3 => { Name => 'SeekTable', Binary => 1, Unknown => 1 }, + 4 => { + Name => 'VorbisComment', + SubDirectory => { TagTable => 'Image::ExifTool::Vorbis::Comments' }, + }, + 5 => { Name => 'CueSheet', Binary => 1, Unknown => 1 }, + 6 => { + Name => 'Picture', + SubDirectory => { TagTable => 'Image::ExifTool::FLAC::Picture' }, + }, + # 7-126 - Reserved + # 127 - Invalid +); + +%Image::ExifTool::FLAC::StreamInfo = ( + PROCESS_PROC => \&ProcessBitStream, + NOTES => 'FLAC is big-endian, so bit 0 is the high-order bit in this table.', + GROUPS => { 2 => 'Audio' }, + 'Bit000-015' => 'BlockSizeMin', + 'Bit016-031' => 'BlockSizeMax', + 'Bit032-055' => 'FrameSizeMin', + 'Bit056-079' => 'FrameSizeMax', + 'Bit080-099' => 'SampleRate', + 'Bit100-102' => { + Name => 'Channels', + ValueConv => '$val + 1', + }, + 'Bit103-107' => { + Name => 'BitsPerSample', + ValueConv => '$val + 1', + }, + 'Bit108-143' => 'TotalSamples', + 'Bit144-271' => { #Tim Eliseo + Name => 'MD5Signature', + Format => 'undef', + ValueConv => 'unpack("H*",$val)', + }, +); + +%Image::ExifTool::FLAC::Picture = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + FORMAT => 'int32u', + 0 => { + Name => 'PictureType', + PrintConv => { # (Note: Duplicated in ID3, ASF and FLAC modules!) + 0 => 'Other', + 1 => '32x32 PNG Icon', + 2 => 'Other Icon', + 3 => 'Front Cover', + 4 => 'Back Cover', + 5 => 'Leaflet', + 6 => 'Media', + 7 => 'Lead Artist', + 8 => 'Artist', + 9 => 'Conductor', + 10 => 'Band', + 11 => 'Composer', + 12 => 'Lyricist', + 13 => 'Recording Studio or Location', + 14 => 'Recording Session', + 15 => 'Performance', + 16 => 'Capture from Movie or Video', + 17 => 'Bright(ly) Colored Fish', + 18 => 'Illustration', + 19 => 'Band Logo', + 20 => 'Publisher Logo', + }, + }, + 1 => { + Name => 'PictureMIMEType', + Format => 'var_pstr32', + }, + 2 => { + Name => 'PictureDescription', + Format => 'var_pstr32', + ValueConv => '$self->Decode($val, "UTF8")', + }, + 3 => 'PictureWidth', + 4 => 'PictureHeight', + 5 => 'PictureBitsPerPixel', + 6 => 'PictureIndexedColors', + 7 => 'PictureLength', + 8 => { + Name => 'Picture', + Groups => { 2 => 'Preview' }, + Format => 'undef[$val{7}]', + Binary => 1, + }, +); + +# FLAC composite tags +%Image::ExifTool::FLAC::Composite = ( + Duration => { + Require => { + 0 => 'FLAC:SampleRate', + 1 => 'FLAC:TotalSamples', + }, + ValueConv => '($val[0] and $val[1]) ? $val[1] / $val[0] : undef', + PrintConv => 'ConvertDuration($val)', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::FLAC'); + + +#------------------------------------------------------------------------------ +# Process information in a bit stream +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Notes: Byte order is used to determine the ordering of bits in the stream: +# 'MM' = bit 0 is most significant, 'II' = bit 0 is least significant +# - can handle arbitrarily wide values (eg. 8-byte or larger integers) +sub ProcessBitStream($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart); + my $verbose = $et->Options('Verbose'); + my $byteOrder = GetByteOrder(); + my $tag; + + if ($verbose) { + $et->VPrint(0, " + [BitStream directory, $dirLen bytes, '${byteOrder}' order]\n"); + } + foreach $tag (sort keys %$tagTablePtr) { + next unless $tag =~ /^Bit(\d+)-?(\d+)?/; + my ($b1, $b2) = ($1, $2 || $1); # start/end bit numbers in stream + my ($i1, $i2) = (int($b1 / 8), int($b2 / 8)); # start/end byte numbers + my ($f1, $f2) = ($b1 % 8, $b2 % 8); # start/end bit numbers within each byte + last if $i2 >= $dirLen; + my ($val, $extra); + # if Format is unspecified, convert the specified number of bits to an unsigned integer, + # otherwise allow HandleTag to convert whole bytes the normal way (via undefined $val) + if (ref $$tagTablePtr{$tag} ne 'HASH' or not $$tagTablePtr{$tag}{Format}) { + my ($i, $mask); + $val = 0; + $extra = ', Mask=0x' if $verbose and ($f1 != 0 or $f2 != 7); + if ($byteOrder eq 'MM') { + # loop from high byte to low byte + for ($i=$i1; $i<=$i2; ++$i) { + $mask = 0xff; + if ($i == $i1 and $f1) { + # mask off high bits in first word (0 is high bit) + foreach ((8-$f1) .. 7) { $mask ^= (1 << $_) } + } + if ($i == $i2 and $f2 < 7) { + # mask off low bits in last word (7 is low bit) + foreach (0 .. (6-$f2)) { $mask ^= (1 << $_) } + } + $val = $val * 256 + ($mask & Get8u($dataPt, $i + $dirStart)); + $extra .= sprintf('%.2x', $mask) if $extra; + } + } else { + # (FLAC is big-endian, but support little-endian bit streams + # so this routine can be used by other modules) + # loop from high byte to low byte + for ($i=$i2; $i>=$i1; --$i) { + $mask = 0xff; + if ($i == $i1 and $f1) { + # mask off low bits in first word (0 is low bit) + foreach (0 .. ($f1-1)) { $mask ^= (1 << $_) } + } + if ($i == $i2 and $f2 < 7) { + # mask off high bits in last word (7 is high bit) + foreach (($f2+1) .. 7) { $mask ^= (1 << $_) } + } + $val = $val * 256 + ($mask & Get8u($dataPt, $i + $dirStart)); + $extra .= sprintf('%.2x', $mask) if $extra; + } + } + # shift word down until low bit is in position 0 + until ($mask & 0x01) { + $val /= 2; + $mask >>= 1; + } + } + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $dirStart + $i1, + Size => $i2 - $i1 + 1, + Extra => $extra, + ); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from an Ogg FLAC file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid Ogg FLAC file +sub ProcessFLAC($$) +{ + my ($et, $dirInfo) = @_; + + # must first check for leading/trailing ID3 information + unless ($$et{DoneID3}) { + require Image::ExifTool::ID3; + Image::ExifTool::ID3::ProcessID3($et, $dirInfo) and return 1; + } + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my ($buff, $err); + + # check FLAC signature + $raf->Read($buff, 4) == 4 and $buff eq 'fLaC' or return 0; + $et->SetFileType(); + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::FLAC::Main'); + for (;;) { + # read next metadata block header + $raf->Read($buff, 4) == 4 or last; + my $flag = unpack('C', $buff); + my $size = unpack('N', $buff) & 0x00ffffff; + $raf->Read($buff, $size) == $size or $err = 1, last; + my $last = $flag & 0x80; # last-metadata-block flag + my $tag = $flag & 0x7f; # tag bits + if ($verbose) { + print $out "FLAC metadata block, type $tag:\n"; + $et->VerboseDump(\$buff, DataPos => $raf->Tell() - $size); + } + $et->HandleTag($tagTablePtr, $tag, undef, + DataPt => \$buff, + DataPos => $raf->Tell() - $size, + ); + last if $last; # all done if is set + } + $err and $et->Warn('Format error in FLAC file'); + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::FLAC - Read Free Lossless Audio Codec information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from Free Lossless Audio Codec (FLAC) audio files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://flac.sourceforge.net/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/FLAC Tags>, +L<Image::ExifTool::TagNames/Ogg Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/FLIF.pm b/lib/Image/ExifTool/FLIF.pm new file mode 100644 index 0000000..afbc10a --- /dev/null +++ b/lib/Image/ExifTool/FLIF.pm @@ -0,0 +1,353 @@ +#------------------------------------------------------------------------------ +# File: FLIF.pm +# +# Description: Read/write FLIF meta information +# +# Revisions: 2016/10/11 - P. Harvey Created +# 2016/10/14 - PH Added write support +# +# References: 1) http://flif.info/ +# 2) https://github.com/FLIF-hub/FLIF/blob/master/doc/metadata +#------------------------------------------------------------------------------ + +package Image::ExifTool::FLIF; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.02'; + +my %flifMap = ( + EXIF => 'FLIF', + XMP => 'FLIF', + ICC_Profile => 'FLIF', + IFD0 => 'EXIF', + IFD1 => 'IFD0', + ExifIFD => 'IFD0', + GPS => 'IFD0', + SubIFD => 'IFD0', + GlobParamIFD => 'IFD0', + PrintIM => 'IFD0', + InteropIFD => 'ExifIFD', + MakerNotes => 'ExifIFD', +); + +# FLIF tags +%Image::ExifTool::FLIF::Main = ( + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + VARS => { HEX_ID => 0 }, + NOTES => q{ + Information extracted from Free Lossless Image Format files. See + L<http://flif.info/> for more information. + }, +# +# header information +# + 0 => { + Name => 'ImageType', + PrintConv => { + '1' => 'Grayscale (non-interlaced)', + '3' => 'RGB (non-interlaced)', + '4' => 'RGBA (non-interlaced)', + 'A' => 'Grayscale (interlaced)', + 'C' => 'RGB (interlaced)', + 'D' => 'RGBA (interlaced)', + 'Q' => 'Grayscale Animation (non-interlaced)', + 'S' => 'RGB Animation (non-interlaced)', + 'T' => 'RGBA Animation (non-interlaced)', + 'a' => 'Grayscale Animation (interlaced)', + 'c' => 'RGB Animation (interlaced)', + 'd' => 'RGBA Animation (interlaced)', + }, + }, + 1 => { + Name => 'BitDepth', + PrintConv => { + '0' => 'Custom', + '1' => 8, + '2' => 16, + }, + }, + 2 => 'ImageWidth', + 3 => 'ImageHeight', + 4 => 'AnimationFrames', + 5 => { + Name => 'Encoding', + PrintConv => { + 0 => 'FLIF16', + }, + }, +# +# metadata chunks +# + iCCP => { + Name => 'ICC_Profile', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + }, + }, + eXif => { + Name => 'EXIF', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + WriteProc => \&Image::ExifTool::WriteTIFF, + Start => 6, # (skip "Exif\0\0" header) + Header => "Exif\0\0", + }, + }, + eXmp => { + Name => 'XMP', + SubDirectory => { + TagTable => 'Image::ExifTool::XMP::Main', + }, + }, + # tRko - list of truncation offsets + # \0 - FLIF16-format image data +); + +#------------------------------------------------------------------------------ +# Read variable-length FLIF integer +# Inputs: 0) raf reference, 1) number to add to returned value +# Returns: integer, or undef on EOF +sub GetVarInt($;$) +{ + my ($raf, $add) = @_; + my ($val, $buff); + for ($val=0; ; $val<<=7) { + $raf->Read($buff, 1) or return undef; + my $byte = ord($buff); + $val |= ($byte & 0x7f); + last unless $byte & 0x80; + } + return $val + ($add || 0); +} + +#------------------------------------------------------------------------------ +# Construct variable-length FLIF integer +# Inputs: 0) integer +# Returns: FLIF variable-length integer byte stream +sub SetVarInt($) +{ + my $val = shift; + my $buff = ''; + my $high = 0; + for (;;) { + $buff = chr(($val & 0x7f) | $high) . $buff; + last unless $val >>= 7; + $high = 0x80; + } + return $buff; +} + +#------------------------------------------------------------------------------ +# Read FLIF header +# Inputs: 0) RAF ref +# Returns: Scalar context: binary header block +# List context: header values (4 or 5 elements: type,depth,width,height[,frames]) +# or undef if this isn't a valid FLIF file header +sub ReadFLIFHeader($) +{ + my $raf = shift; + my ($buff, @vals); + + # verify this is a valid FLIF file + return () unless $raf->Read($buff, 6) == 6 and $buff =~ /^FLIF([0-\x6f])([0-2])/; + + # decode header information ("FLIF" chunk) + push @vals, $1, $2; # type, depth + push @vals, GetVarInt($raf,+1), GetVarInt($raf,+1); # width, height (+1 each) + push @vals, GetVarInt($raf,+2) if $vals[0] gt 'H'; # frames (+2) + + return () unless defined $vals[-1]; + return @vals if wantarray; # return the decoded header values + + # return the binary header block + my $hdrLen = $raf->Tell(); + return () unless $raf->Seek(0,0) and $raf->Read($buff, $hdrLen) == $hdrLen; + return $buff; +} + +#------------------------------------------------------------------------------ +# WriteFLIF : Write FLIF image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid FLIF file, or -1 if +# an output file was specified and a write error occurred +sub WriteFLIF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $soi, @addTags, %doneTag); + + # verify FLIF header and copy it to the output file + $buff = ReadFLIFHeader($raf) or return 0; + my $outfile = $$dirInfo{OutFile}; + Write($outfile, $buff) or return -1; + + $et->InitWriteDirs(\%flifMap); + my $tagTablePtr = GetTagTable('Image::ExifTool::FLIF::Main'); + + # loop through the FLIF chunks + for (;;) { + my ($tag, $size, $inflated); + # read new tag (or soi) unless we already hit the soi (start of image) + if (not defined $soi) { + $raf->Read($buff, 4) == 4 or $et->Error('Unexpected EOF'), last; + if ($buff lt ' ') { + $soi = $buff; # we have hit the start of image (no more metadata) + # make list of new tags to add + foreach $tag ('eXif', 'eXmp', 'iCCP') { + push @addTags, $tag if $$et{ADD_DIRS}{$$tagTablePtr{$tag}{Name}} and not $doneTag{$tag}; + } + } + } + if (not defined $soi) { + $tag = $buff; + $size = GetVarInt($raf); # read the data size + } elsif (@addTags) { + $tag = shift @addTags; + ($buff, $size) = ('', 0); # create metadata from scratch + } else { + # finish copying file (no more metadata to add) + Write($outfile, $soi) or return -1; + Write($outfile, $buff) or return -1 while $raf->Read($buff, 65536); + last; # all done! + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($tagInfo and $$tagInfo{SubDirectory} and $$et{EDIT_DIRS}{$$tagInfo{Name}}) { + $doneTag{$tag} = 1; # prevent adding this back again later + unless (defined $soi) { + $raf->Read($buff, $size) == $size or $et->Error("Truncated FLIF $tag chunk"), last; + } + # rewrite the compressed data + if (eval { require IO::Uncompress::RawInflate } and eval { require IO::Compress::RawDeflate } ) { + if (length $buff == 0) { + $inflated = $buff; # (creating from scratch, so no need to inflate) + } elsif (not IO::Uncompress::RawInflate::rawinflate(\$buff => \$inflated)) { + $et->Error("Error inflating FLIF $tag chunk"), last; + } + my $subdir = $$tagInfo{SubDirectory}; + my %subdirInfo = ( + DirName => $$tagInfo{Name}, + DataPt => \$inflated, + DirStart => length($inflated) ? $$subdir{Start} : undef, + ReadOnly => 1, # (used only by WriteXMP) + ); + my $subTable = GetTagTable($$subdir{TagTable}); + $inflated = $et->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc}); + if (defined $inflated) { + next unless length $inflated; # (delete directory if length is zero) + $inflated = $$subdir{Header} . $inflated if $$subdir{Header}; # (add back header if necessary) + unless (IO::Compress::RawDeflate::rawdeflate(\$inflated => \$buff)) { + $et->Error("Error deflating FLIF $tag chunk"), last; + } + } + } else { + $et->WarnOnce('Install IO::Compress::RawDeflate to write FLIF metadata'); + } + Write($outfile, $tag, SetVarInt(length $buff), $buff) or return -1; + } elsif (not defined $soi) { + Write($outfile, $tag, SetVarInt($size)) or return -1; + Image::ExifTool::CopyBlock($raf, $outfile, $size) or return -1; + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from an FLIF file +# Inputs: 0) ExifTool object reference, 1) DirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid FLIF file +sub ProcessFLIF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $tag, $inflated); + + # verify this is a valid FLIF file and read the header + my @vals = ReadFLIFHeader($raf) or return 0; + + $et->SetFileType(); + my $tagTablePtr = GetTagTable('Image::ExifTool::FLIF::Main'); + my $verbose = $et->Options('Verbose'); + + # save the header information + $et->VPrint(0, "FLIF header:\n") if $verbose; + for ($tag=0; defined $vals[$tag]; ++$tag) { + $et->HandleTag($tagTablePtr, $tag, $vals[$tag]); + } + + # loop through the FLIF chunks + for (;;) { + $raf->Read($tag, 4) == 4 or $et->Warn('Unexpected EOF'), last; + my $byte = ord substr($tag, 0, 1); + # all done if we arrived at the image chunk + $byte < 32 and $et->HandleTag($tagTablePtr, 5, $byte), last; + my $size = GetVarInt($raf); + $et->VPrint(0, "FLIF $tag ($size bytes):\n") if $verbose; + if ($$tagTablePtr{$tag}) { + $raf->Read($buff, $size) == $size or $et->Warn("Truncated FLIF $tag chunk"), last; + $et->VerboseDump(\$buff, Addr => $raf->Tell() - $size) if $verbose > 2; + # inflate the compressed data + if (eval { require IO::Uncompress::RawInflate }) { + if (IO::Uncompress::RawInflate::rawinflate(\$buff => \$inflated)) { + $et->HandleTag($tagTablePtr, $tag, $inflated, + DataPt => \$inflated, + Size => length $inflated, + Extra => ' inflated', + ); + } else { + $et->Warn("Error inflating FLIF $tag chunk"); + } + } else { + $et->WarnOnce('Install IO::Uncompress::RawInflate to decode FLIF metadata'); + } + } else { + $raf->Seek($size, 1) or $et->Warn('Seek error'), last; + } + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::FLIF - Read/write FLIF meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to read and write +meta information in FLIF (Free Lossless Image Format) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://flif.info/> + +=item L<https://github.com/FLIF-hub/FLIF/blob/master/doc/metadata> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/FLIF Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/FLIR.pm b/lib/Image/ExifTool/FLIR.pm new file mode 100644 index 0000000..94cd007 --- /dev/null +++ b/lib/Image/ExifTool/FLIR.pm @@ -0,0 +1,1667 @@ +#------------------------------------------------------------------------------ +# File: FLIR.pm +# +# Description: Read FLIR meta information +# +# Revisions: 2013/03/28 - P. Harvey Created +# +# References: 1) https://exiftool.org/forum/index.php/topic,4898.0.html +# 2) http://www.nuage.ch/site/flir-i7-some-analysis/ +# 3) http://www.workswell.cz/manuals/flir/hardware/A3xx_and_A6xx_models/Streaming_format_ThermoVision.pdf +# 4) http://support.flir.com/DocDownload/Assets/62/English/1557488%24A.pdf +# 5) http://code.google.com/p/dvelib/source/browse/trunk/flirPublicFormat/fpfConverter/Fpfimg.h?spec=svn3&r=3 +# 6) https://exiftool.org/forum/index.php/topic,5538.0.html +# JD) Jens Duttke private communication +# +# Glossary: FLIR = Forward Looking Infra Red +#------------------------------------------------------------------------------ + +package Image::ExifTool::FLIR; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::GPS; + +$VERSION = '1.20'; + +sub ProcessFLIR($$;$); +sub ProcessFLIRText($$$); +sub ProcessMeasInfo($$$); +sub GetImageType($$$); + +my %temperatureInfo = ( + Writable => 'rational64u', + Format => 'rational64s', # (have seen negative values) +); + +# tag information for floating point Kelvin tag +my %floatKelvin = ( + Format => 'float', + ValueConv => '$val - 273.15', + PrintConv => 'sprintf("%.1f C",$val)', +); + +# commonly used tag information elements +my %float1f = ( Format => 'float', PrintConv => 'sprintf("%.1f",$val)' ); +my %float2f = ( Format => 'float', PrintConv => 'sprintf("%.2f",$val)' ); +my %float6f = ( Format => 'float', PrintConv => 'sprintf("%.6f",$val)' ); +my %float8g = ( Format => 'float', PrintConv => 'sprintf("%.8g",$val)' ); + +# FLIR makernotes tags (ref PH) +%Image::ExifTool::FLIR::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + WRITABLE => 1, + PRIORITY => 0, # (unreliable) + NOTES => q{ + Information extracted from the maker notes of JPEG images from thermal + imaging cameras by FLIR Systems Inc. + }, + 0x01 => { #2 + Name => 'ImageTemperatureMax', + %temperatureInfo, + Notes => q{ + these temperatures may be in Celsius, Kelvin or Fahrenheit, but there is no + way to tell which + }, + }, + 0x02 => { Name => 'ImageTemperatureMin', %temperatureInfo }, #2 + 0x03 => { #1 + Name => 'Emissivity', + Writable => 'rational64u', + PrintConv => 'sprintf("%.2f",$val)', + PrintConvInv => '$val', + }, + # 0x04 does not change with temperature units; often 238, 250 or 457 + 0x04 => { Name => 'UnknownTemperature', %temperatureInfo, Unknown => 1 }, + # 0x05,0x06 are unreliable. As written by FLIR tools, these are the + # CameraTemperatureRangeMax/Min, but the units vary depending on the + # options settings. But as written by some cameras, the values are different. + 0x05 => { Name => 'CameraTemperatureRangeMax', %temperatureInfo, Unknown => 1 }, + 0x06 => { Name => 'CameraTemperatureRangeMin', %temperatureInfo, Unknown => 1 }, + # 0x07 - string[33] (some sort of image ID?) + # 0x08 - string[33] + # 0x09 - undef (tool info) + # 0x0a - int32u: 1 + # 0x0f - rational64u: 0/1000 + # 0x10,0x11,0x12 - int32u: 0 + # 0x13 - rational64u: 0/1000 +); + +# FLIR FFF tag table (ref PH) +%Image::ExifTool::FLIR::FFF = ( + GROUPS => { 0 => 'APP1', 2 => 'Image' }, + PROCESS_PROC => \&ProcessFLIR, + VARS => { ALPHA_FIRST => 1 }, + NOTES => q{ + Information extracted from FLIR FFF images and the APP1 FLIR segment of JPEG + images. These tags may also be extracted from the first frame of an FLIR + SEQ file, or all frames if the ExtractEmbedded option is used. + }, + "_header" => { + Name => 'FFFHeader', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::Header' }, + }, + # 0 = free (ref 3) + 0x01 => { + Name => 'RawData', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::RawData' }, + }, + # 2 = GainMap (ref 3) + # 3 = OffsMap (ref 3) + # 4 = DeadMap (ref 3) + 0x05 => { #6 + Name => 'GainDeadData', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::GainDeadData' }, + }, + 0x06 => { #6 + Name => 'CoarseData', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::CoarseData' }, + }, + # 7 = ImageMap (ref 3) + 0x0e => { + Name => 'EmbeddedImage', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::EmbeddedImage' }, + }, + 0x20 => { + Name => 'CameraInfo', # (BasicData - ref 3) + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::CameraInfo' }, + }, + 0x21 => { #6 + Name => 'MeasurementInfo', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::MeasInfo' }, + }, + 0x22 => { + Name => 'PaletteInfo', # (ColorPal - ref 3) + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::PaletteInfo' }, + }, + 0x23 => { + Name => 'TextInfo', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::TextInfo' }, + }, + 0x24 => { + Name => 'EmbeddedAudioFile', + # (sometimes has an unknown 8-byte header) + RawConv => q{ + return \$val if $val =~ s/^.{0,16}?RIFF/RIFF/s; + $self->Warn('Unknown EmbeddedAudioFile format'); + return undef; + }, + }, + # 0x27: 01 00 08 00 10 00 00 00 + 0x28 => { + Name => 'PaintData', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::PaintData' }, + }, + 0x2a => { + Name => 'PiP', + SubDirectory => { + TagTable => 'Image::ExifTool::FLIR::PiP', + ByteOrder => 'LittleEndian', + }, + }, + 0x2b => { + Name => 'GPSInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::FLIR::GPSInfo', + ByteOrder => 'LittleEndian', + }, + }, + 0x2c => { + Name => 'MeterLink', + SubDirectory => { + TagTable => 'Image::ExifTool::FLIR::MeterLink' , + ByteOrder => 'LittleEndian' + }, + }, + 0x2e => { + Name => 'ParameterInfo', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::ParamInfo' }, + }, +); + +# FFF file header (ref PH) +%Image::ExifTool::FLIR::Header = ( + GROUPS => { 0 => 'APP1', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, + NOTES => 'Tags extracted from the FLIR FFF/AFF header.', + 4 => { Name => 'CreatorSoftware', Format => 'string[16]' }, +); + +# FLIR raw data record (ref PH) +%Image::ExifTool::FLIR::RawData = ( + GROUPS => { 0 => 'APP1', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + NOTES => q{ + The thermal image data may be stored either as raw data, or in PNG format. + If stored as raw data, ExifTool adds a TIFF header to allow the data to be + viewed as a TIFF image. If stored in PNG format, the PNG image is extracted + as-is. Note that most FLIR cameras using the PNG format seem to write the + 16-bit raw image data in the wrong byte order. + }, + 0x00 => { + # use this tag only to determine the byte order of the raw data + # (the value should be 0x0002 if the byte order is correct) + # - always "II" when RawThermalImageType is "TIFF" + # - seen both "II" and "MM" when RawThermalImageType is "PNG" + Name => 'RawDataByteOrder', + Hidden => 1, + RawConv => 'ToggleByteOrder() if $val >= 0x0100; undef', + }, + 0x01 => { + Name => 'RawThermalImageWidth', + RawConv => '$$self{RawThermalImageWidth} = $val', + }, + 0x02 => { + Name => 'RawThermalImageHeight', + RawConv => '$$self{RawThermalImageHeight} = $val', + }, + # 0x03-0x05: 0 + # 0x06: raw image width - 1 + # 0x07: 0 + # 0x08: raw image height - 1 + # 0x09: 0,15,16 + # 0x0a: 0,2,3,11,12,13,30 + # 0x0b: 0,2 + # 0x0c: 0 or a large number + # 0x0d: 0,3,4,6 + # 0x0e-0x0f: 0 + 16 => { + Name => 'RawThermalImageType', + Format => 'undef[$size-0x20]', + RawConv => 'Image::ExifTool::FLIR::GetImageType($self, $val, "RawThermalImage")', + }, + 16.1 => { + Name => 'RawThermalImage', + Groups => { 2 => 'Preview' }, + RawConv => '\$$self{RawThermalImage}', + }, +); + +# GainDeadMap record (ref 6) (see RawData above) +%Image::ExifTool::FLIR::GainDeadData = ( + GROUPS => { 0 => 'APP1', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + NOTES => 'Information found in FFF-format .GAN calibration image files.', + 0x00 => { + Name => 'GainDeadMapByteOrder', + Hidden => 1, + RawConv => 'ToggleByteOrder() if $val >= 0x0100; undef', + }, + 0x01 => { + Name => 'GainDeadMapImageWidth', + RawConv => '$$self{GainDeadMapImageWidth} = $val', + }, + 0x02 => { + Name => 'GainDeadMapImageHeight', + RawConv => '$$self{GainDeadMapImageHeight} = $val', + }, + 16 => { + Name => 'GainDeadMapImageType', + Format => 'undef[$size-0x20]', + RawConv => 'Image::ExifTool::FLIR::GetImageType($self, $val, "GainDeadMapImage")', + }, + 16.1 => { + Name => 'GainDeadMapImage', + RawConv => '\$$self{GainDeadMapImage}', + }, +); + +# CoarseMap record (ref 6) (see RawData above) +%Image::ExifTool::FLIR::CoarseData = ( + GROUPS => { 0 => 'APP1', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + NOTES => 'Information found in FFF-format .CRS correction image files.', + 0x00 => { + Name => 'CoarseMapByteOrder', + Hidden => 1, + RawConv => 'ToggleByteOrder() if $val >= 0x0100; undef', + }, + 0x01 => { + Name => 'CoarseMapImageWidth', + RawConv => '$$self{CoarseMapImageWidth} = $val', + }, + 0x02 => { + Name => 'CoarseMapImageHeight', + RawConv => '$$self{CoarseMapImageHeight} = $val', + }, + 16 => { + Name => 'CoarseMapImageType', + Format => 'undef[$size-0x20]', + RawConv => 'Image::ExifTool::FLIR::GetImageType($self, $val, "CoarseMapImage")', + }, + 16.1 => { + Name => 'CoarseMapImage', + RawConv => '\$$self{CoarseMapImage}', + }, +); + +# "Paint colors" record (ref PH) +%Image::ExifTool::FLIR::PaintData = ( + GROUPS => { 0 => 'APP1', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + NOTES => 'Information generated by FLIR Tools "Paint colors" tool.', + 0x01 => { + Name => 'PaintByteOrder', + Hidden => 1, + RawConv => 'ToggleByteOrder() if $val >= 0x0100; undef', + }, + 0x05 => { + Name => 'PaintImageWidth', + RawConv => '$$self{PaintImageWidth} = $val', + }, + 0x06 => { + Name => 'PaintImageHeight', + RawConv => '$$self{PaintImageHeight} = $val', + }, + 20 => { + Name => 'PaintImageType', + Format => 'undef[$size-0x28]', + RawConv => 'Image::ExifTool::FLIR::GetImageType($self, $val, "PaintImage")', + }, + 20.1 => { + Name => 'PaintImage', + RawConv => '\$$self{PaintImage}', + }, +); + +# FLIR embedded image (ref 1) +%Image::ExifTool::FLIR::EmbeddedImage = ( + GROUPS => { 0 => 'APP1', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + 0 => { + # use this tag only to determine the byte order + # (the value should be 0x0003 if the byte order is correct) + Name => 'EmbeddedImageByteOrder', + Format => 'int16u', + Hidden => 1, + RawConv => 'ToggleByteOrder() if $val >= 0x0100; undef', + }, + 1 => 'EmbeddedImageWidth', + 2 => 'EmbeddedImageHeight', + 16 => { + Name => 'EmbeddedImageType', + Format => 'undef[4]', + RawConv => '$val =~ /^\x89PNG/s ? "PNG" : ($val =~ /^\xff\xd8\xff/ ? "JPG" : "DAT")', + Notes => q{ + "PNG" for PNG image in Y Cb Cr colors, "JPG" for a JPEG image, or "DAT" for + other image data + }, + }, + 16.1 => { + Name => 'EmbeddedImage', + Groups => { 2 => 'Preview' }, + Format => 'undef[$size-0x20]', + Binary => 1, + }, +); + +# FLIR camera record (ref PH) +%Image::ExifTool::FLIR::CameraInfo = ( + GROUPS => { 0 => 'APP1', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, + NOTES => q{ + FLIR camera information. The Planck tags are variables used in the + temperature calculation. See + L<https://exiftool.org/forum/index.php?topic=4898.msg23972#msg23972> + for details. + }, + 0x00 => { + # use this tag only to determine the byte order + # (the value should be 0x0002 if the byte order is correct) + Name => 'CameraInfoByteOrder', + Format => 'int16u', + Hidden => 1, + RawConv => 'ToggleByteOrder() if $val >= 0x0100; undef', + }, + # 0x02 - int16u: image width + # 0x04 - int16u: image height + # 0x0c - int32u: image width - 1 + # 0x10 - int32u: image height - 1 + 0x20 => { Name => 'Emissivity', %float2f }, + 0x24 => { Name => 'ObjectDistance', Format => 'float', PrintConv => 'sprintf("%.2f m",$val)' }, + 0x28 => { Name => 'ReflectedApparentTemperature', %floatKelvin }, + 0x2c => { Name => 'AtmosphericTemperature', %floatKelvin }, + 0x30 => { Name => 'IRWindowTemperature', %floatKelvin }, + 0x34 => { Name => 'IRWindowTransmission', %float2f }, + # 0x38: 0 + 0x3c => { + Name => 'RelativeHumidity', + Format => 'float', + ValueConv => '$val > 2 ? $val / 100 : $val', # have seen value expressed as percent in FFF file + PrintConv => 'sprintf("%.1f %%",$val*100)', + }, + # 0x40 - float: 0,6 + # 0x44,0x48,0x4c: 0 + # 0x50 - int32u: 1 + # 0x54: 0 + 0x58 => { Name => 'PlanckR1', %float8g }, #1 + 0x5c => { Name => 'PlanckB', %float8g }, #1 + 0x60 => { Name => 'PlanckF', %float8g }, #1 + # 0x64,0x68,0x6c: 0 + 0x070 => { Name => 'AtmosphericTransAlpha1', %float6f }, #1 (value: 0.006569) + 0x074 => { Name => 'AtmosphericTransAlpha2', %float6f }, #1 (value: 0.012620) + 0x078 => { Name => 'AtmosphericTransBeta1', %float6f }, #1 (value: -0.002276) + 0x07c => { Name => 'AtmosphericTransBeta2', %float6f }, #1 (value: -0.006670) + 0x080 => { Name => 'AtmosphericTransX', %float6f }, #1 (value: 1.900000) + # 0x84,0x88: 0 + # 0x8c - float: 0,4,6 + 0x90 => { Name => 'CameraTemperatureRangeMax', %floatKelvin }, + 0x94 => { Name => 'CameraTemperatureRangeMin', %floatKelvin }, + 0x98 => { Name => 'CameraTemperatureMaxClip', %floatKelvin }, # 50 degrees over camera max + 0x9c => { Name => 'CameraTemperatureMinClip', %floatKelvin }, # usually 10 or 20 degrees below camera min + 0xa0 => { Name => 'CameraTemperatureMaxWarn', %floatKelvin }, # same as camera max + 0xa4 => { Name => 'CameraTemperatureMinWarn', %floatKelvin }, # same as camera min + 0xa8 => { Name => 'CameraTemperatureMaxSaturated', %floatKelvin }, # usually 50 or 88 degrees over camera max + 0xac => { Name => 'CameraTemperatureMinSaturated', %floatKelvin }, # usually 10, 20 or 40 degrees below camera min + 0xd4 => { Name => 'CameraModel', Format => 'string[32]' }, + 0xf4 => { Name => 'CameraPartNumber', Format => 'string[16]' }, #1 + 0x104 => { Name => 'CameraSerialNumber',Format => 'string[16]' }, #1 + 0x114 => { Name => 'CameraSoftware', Format => 'string[16]' }, #1/PH (NC) + 0x170 => { Name => 'LensModel', Format => 'string[32]' }, + # note: it seems that FLIR updated their lenses at some point, so lenses with the same + # name may have different part numbers (eg. the FOL38 is either 1196456 or T197089) + 0x190 => { Name => 'LensPartNumber', Format => 'string[16]' }, + 0x1a0 => { Name => 'LensSerialNumber', Format => 'string[16]' }, + 0x1b4 => { Name => 'FieldOfView', Format => 'float', PrintConv => 'sprintf("%.1f deg", $val)' }, #1 + # 0x1d0 - int16u: 0,12,24,25,46 + # 0x1d2 - int16u: 170,180,190,380,760,52320 + 0x1ec => { Name => 'FilterModel', Format => 'string[16]' }, + 0x1fc => { Name => 'FilterPartNumber', Format => 'string[32]' }, + 0x21c => { Name => 'FilterSerialNumber',Format => 'string[32]' }, + 0x308 => { Name => 'PlanckO', Format => 'int32s' }, #1 + 0x30c => { Name => 'PlanckR2', %float8g }, #1 + 0x310 => { Name => 'RawValueRangeMin', Format => 'int16u', Groups => { 2 => 'Image' } }, #forum10060 + 0x312 => { Name => 'RawValueRangeMax', Format => 'int16u', Groups => { 2 => 'Image' } }, #forum10060 + 0x338 => { Name => 'RawValueMedian', Format => 'int16u', Groups => { 2 => 'Image' } }, + 0x33c => { Name => 'RawValueRange', Format => 'int16u', Groups => { 2 => 'Image' } }, + 0x384 => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Format => 'undef[10]', + Groups => { 2 => 'Time' }, + RawConv => q{ + my $tm = Get32u(\$val, 0); + my $ss = Get32u(\$val, 4) & 0xffff; + my $tz = Get16s(\$val, 8); + ConvertUnixTime($tm - $tz * 60) . sprintf('.%.3d', $ss) . TimeZoneString(-$tz); + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x390 => { Name => 'FocusStepCount', Format => 'int16u' }, + 0x45c => { Name => 'FocusDistance', Format => 'float', PrintConv => 'sprintf("%.1f m",$val)' }, + # 0x43c - string: either "Live" or the file name + 0x464 => { Name => 'FrameRate', Format => 'int16u' }, #SebastianHani +); + +# FLIR measurement tools record (ref 6) +%Image::ExifTool::FLIR::MeasInfo = ( + GROUPS => { 0 => 'APP1', 2 => 'Image' }, + PROCESS_PROC => \&ProcessMeasInfo, + FORMAT => 'int16u', + VARS => { NO_ID => 1 }, + NOTES => q{ + Tags listed below are only for the first measurement tool, however multiple + measurements may be added, and information is extracted for all of them. + Tags for subsequent measurements are generated as required with the prefixes + "Meas2", "Meas3", etc. + }, + Meas1Type => { + PrintConv => { + 1 => 'Spot', + 2 => 'Area', + 3 => 'Ellipse', + 4 => 'Line', + 5 => 'Endpoint', #PH (NC, FLIR Tools v2.0 for Mac generates an empty one of these after each Line) + 6 => 'Alarm', #PH seen params: "0 1 0 1 9142 0 9142 0" (called "Isotherm" by Mac version) + 7 => 'Unused', #PH (NC) (or maybe "Free"?) + 8 => 'Difference', + }, + }, + Meas1Params => { + Notes => 'Spot=X,Y; Area=X1,Y1,W,H; Ellipse=XC,YC,X1,Y1,X2,Y2; Line=X1,Y1,X2,Y2', + }, + Meas1Label => { }, +); + +# FLIR palette record (ref PH/JD) +%Image::ExifTool::FLIR::PaletteInfo = ( + GROUPS => { 0 => 'APP1', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, + 0x00 => { #JD + Name => 'PaletteColors', + RawConv => '$$self{PaletteColors} = $val', + }, + 0x06 => { Name => 'AboveColor', Format => 'int8u[3]', Notes => 'Y Cr Cb color components' }, #JD + 0x09 => { Name => 'BelowColor', Format => 'int8u[3]' }, #JD + 0x0c => { Name => 'OverflowColor', Format => 'int8u[3]' }, #JD + 0x0f => { Name => 'UnderflowColor', Format => 'int8u[3]' }, #JD + 0x12 => { Name => 'Isotherm1Color', Format => 'int8u[3]' }, #JD + 0x15 => { Name => 'Isotherm2Color', Format => 'int8u[3]' }, #JD + 0x1a => { Name => 'PaletteMethod' }, #JD + 0x1b => { Name => 'PaletteStretch' }, #JD + 0x30 => { + Name => 'PaletteFileName', + Format => 'string[32]', + # (not valid for all images) + RawConv => q{ + $val =~ s/\0.*//; + $val =~ /^[\x20-\x7e]{3,31}$/ ? $val : undef; + }, + }, + 0x50 => { + Name => 'PaletteName', + Format => 'string[32]', + # (not valid for all images) + RawConv => q{ + $val =~ s/\0.*//; + $val =~ /^[\x20-\x7e]{3,31}$/ ? $val : undef; + }, + }, + 0x70 => { + Name => 'Palette', + Format => 'undef[3*$$self{PaletteColors}]', + Notes => 'Y Cr Cb byte values for each palette color', + Binary => 1, + }, +); + +# FLIR text information record (ref PH) +%Image::ExifTool::FLIR::TextInfo = ( + GROUPS => { 0 => 'APP1', 2 => 'Image' }, + PROCESS_PROC => \&ProcessFLIRText, + VARS => { NO_ID => 1 }, + Label0 => { }, + Value0 => { }, + Label1 => { }, + Value1 => { }, + Label2 => { }, + Value2 => { }, + Label3 => { }, + Value3 => { }, + # (there could be more, and we will generate these on the fly if necessary) +); + +# FLIR parameter information record (ref PH) +%Image::ExifTool::FLIR::ParamInfo = ( + GROUPS => { 0 => 'APP1', 2 => 'Image' }, + PROCESS_PROC => \&ProcessFLIRText, + VARS => { NO_ID => 1 }, + Generated => { + Name => 'DateTimeGenerated', + Description => 'Date/Time Generated', + Groups => { 2 => 'Time' }, + ValueConv => '$val =~ tr/-/:/; $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + Param0 => { }, + Param1 => { }, + Param2 => { }, + Param3 => { }, + # (there could be more, and we will generate these on the fly if necessary) +); + +# FLIR Picture in Picture record (ref 1) +%Image::ExifTool::FLIR::PiP = ( + GROUPS => { 0 => 'APP1', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, + NOTES => 'FLIR Picture in Picture tags.', + FORMAT => 'int16s', + 0x00 => { + Name => 'Real2IR', + Format => 'float', + }, + 2 => { + Name => 'OffsetX', + Notes => 'offset from of insertion point from center', + PrintConv => 'sprintf("%+d",$val)', # (add sign for direct use with IM convert) + }, + 3 => { + Name => 'OffsetY', + PrintConv => 'sprintf("%+d",$val)', + }, + 4 => { + Name => 'PiPX1', + Description => 'PiP X1', + Notes => 'crop size for radiometric image', + }, + 5 => { Name => 'PiPX2', Description => 'PiP X2' }, + 6 => { Name => 'PiPY1', Description => 'PiP Y1' }, + 7 => { Name => 'PiPY2', Description => 'PiP Y2' }, +); + +# FLIR GPS record (ref PH/JD/forum9615) +%Image::ExifTool::FLIR::GPSInfo = ( + GROUPS => { 0 => 'APP1', 2 => 'Location' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, + 0x00 => { + Name => 'GPSValid', + Format => 'int32u', + RawConv => '$$self{GPSValid} = $val', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0x04 => { + Name => 'GPSVersionID', + Format => 'undef[4]', + RawConv => '$val eq "\0\0\0\0" ? undef : $val', + PrintConv => 'join ".", split //, $val', + }, + 0x08 => { + Name => 'GPSLatitudeRef', + Format => 'string[2]', + RawConv => 'length($val) ? $val : undef', + PrintConv => { + N => 'North', + S => 'South', + }, + }, + 0x0a => { + Name => 'GPSLongitudeRef', + Format => 'string[2]', + RawConv => 'length($val) ? $val : undef', + PrintConv => { + E => 'East', + W => 'West', + }, + }, + # 0x0c - 4 unknown bytes + 0x10 => { + Name => 'GPSLatitude', + Condition => '$$self{GPSValid}', # valid only if GPSValid is 1 + Format => 'double', # (signed) + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + 0x18 => { + Name => 'GPSLongitude', + Condition => '$$self{GPSValid}', # valid only if GPSValid is 1 + Format => 'double', # (signed) + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + 0x20 => { + Name => 'GPSAltitude', + Condition => '$$self{GPSValid}', # valid only if GPSValid is 1 + Format => 'float', + # (have seen likely invalid value of -1 when GPSValid is 1) + PrintConv => 'sprintf("%.2f m", $val)', + }, + # 0x24 - 28 unknown bytes: + # 0x28 - int8u: seen 0,49,51,55,57 (ASCII "1","3","7","9") + # 0x29 - int8u: seen 0,48 (ASCII "0") + 0x40 => { + Name => 'GPSDOP', + Description => 'GPS Dilution Of Precision', + Format => 'float', + RawConv => '$val > 0 ? $val : undef', # (have also seen likely invalid value of 1) + PrintConv => 'sprintf("%.2f", $val)', + }, + 0x44 => { + Name => 'GPSSpeedRef', + Format => 'string[2]', + RawConv => 'length($val) ? $val : undef', + PrintConv => { + K => 'km/h', + M => 'mph', + N => 'knots', + }, + }, + 0x46 => { + Name => 'GPSTrackRef', + Format => 'string[2]', + RawConv => 'length($val) ? $val : undef', + PrintConv => { + M => 'Magnetic North', + T => 'True North', + }, + }, + 0x48 => { #PH (NC) + Name => 'GPSImgDirectionRef', + Format => 'string[2]', + RawConv => 'length($val) ? $val : undef', + PrintConv => { + M => 'Magnetic North', + T => 'True North', + }, + }, + 0x4c => { + Name => 'GPSSpeed', + %float2f, + RawConv => '$val < 0 ? undef : $val', + }, + 0x50 => { + Name => 'GPSTrack', + %float2f, + RawConv => '$val < 0 ? undef : $val', + }, + 0x54 => { + Name => 'GPSImgDirection', + %float2f, + RawConv => '$val < 0 ? undef : $val', + }, + 0x58 => { + Name => 'GPSMapDatum', + Format => 'string[16]', + RawConv => 'length($val) ? $val : undef', + }, + # 0xa4 - string[6]: seen 000208,081210,020409,000608,010408,020808,091011 + # 0x78 - double[2]: seen "-1 -1","0 0" + # 0x78 - float[2]: seen "-1 -1","0 0" + # 0xb2 - string[2]?: seen "5\0" +); + +# humidity meter information +# (ref https://exiftool.org/forum/index.php/topic,5325.0.html) +# The %Image::ExifTool::UserDefined hash defines new tags to be added to existing tables. +%Image::ExifTool::FLIR::MeterLink = ( + GROUPS => { 0 => 'APP1', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, + NOTES => 'Tags containing Meterlink humidity meter information.', + 26 => { + Name => 'Reading1Units', + DataMember => 'Reading1Units', + RawConv => '$$self{Reading1Units} = $val', + PrintHex => 1, + PrintConv => { + 0x0d => 'C', + 0x1b => '%', + 0x1d => 'Relative', + 0x24 => 'g/kg', + }, + }, + 28 => { + Name => 'Reading1Description', + DataMember => 'Reading1Description', + RawConv => '$$self{Reading1Description} = $val', + PrintConv => { + 0 => 'Humidity', + 3 => 'Moisture', # Pinless Moisture Readings with INTernal sensor + 7 => 'Dew Point', + 8 => 'Air Temperature', + 9 => 'IR Temperature', + 11 => 'Difference Temperature', # Difference Temp: IR-Temp and DewPoint + }, + }, + 32 => { + Name => 'Reading1Device', + Format => 'string[16]', + }, + 96 => { + Name => 'Reading1Value', + Format => 'double', + # convert Kelvin -> Celsius and kg/kg -> g/kg + ValueConv => q{ + return $val - 273.15 if $$self{Reading1Units} == 0x0d and $$self{Reading1Description} != 11; + return $val *= 1000 if $$self{Reading1Units} == 0x24; + return $val; + }, + }, + # add 100 for subsequent readings + 126 => { + Name => 'Reading2Units', + DataMember => 'Reading2Units', + RawConv => '$$self{Reading2Units} = $val', + PrintHex => 1, + PrintConv => { + 0x0d => 'C', + 0x1b => '%', + 0x1d => 'rel', + 0x24 => 'g/kg', + }, + }, + 128 => { + Name => 'Reading2Description', + DataMember => 'Reading2Description', + RawConv => '$$self{Reading2Description} = $val', + PrintConv => { + 0 => 'Humidity', + 3 => 'Moisture', + 7 => 'Dew Point', + 8 => 'Air Temperature', + 9 => 'IR Temperature', + 11 => 'Difference Temperature', # Difference Temp: IR-Temp and DewPoint + }, + }, + 132 => { + Name => 'Reading2Device', + Format => 'string[16]', + }, + 196 => { + Name => 'Reading2Value', + Format => 'double', + # convert Kelvin -> Celsius and kg/kg -> g/kg + ValueConv => q{ + return $val - 273.15 if $$self{Reading2Units} == 0x0d and $$self{Reading2Description} != 11; + return $val *= 1000 if $$self{Reading2Units} == 0x24; + return $val; + }, + }, + 226 => { + Name => 'Reading3Units', + DataMember => 'Reading3Units', + RawConv => '$$self{Reading3Units} = $val', + PrintHex => 1, + PrintConv => { + 0x0d => 'C', + 0x1b => '%', + 0x1d => 'rel', + 0x24 => 'g/kg', + }, + }, + 228 => { + Name => 'Reading3Description', + DataMember => 'Reading3Description', + RawConv => '$$self{Reading3Description} = $val', + PrintConv => { + 0 => 'Humidity', + 3 => 'Moisture', + 7 => 'Dew Point', + 8 => 'Air Temperature', + 9 => 'IR Temperature', + 11 => 'Difference Temperature', # Difference Temp: IR-Temp and DewPoint + }, + }, + 232 => { + Name => 'Reading3Device', + Format => 'string[16]', + }, + 296 => { + Name => 'Reading3Value', + Format => 'double', + # convert Kelvin -> Celsius and kg/kg -> g/kg + ValueConv => q{ + return $val - 273.15 if $$self{Reading3Units} == 0x0d and $$self{Reading3Description} != 11; + return $val *= 1000 if $$self{Reading3Units} == 0x24; + return $val; + }, + }, + + 326 => { + Name => 'Reading4Units', + DataMember => 'Reading4Units', + RawConv => '$$self{Reading4Units} = $val', + PrintHex => 1, + PrintConv => { + 0x0d => 'C', + 0x1b => '%', + 0x1d => 'rel', + 0x24 => 'g/kg', + }, + }, + 328 => { + Name => 'Reading4Description', + DataMember => 'Reading4Description', + RawConv => '$$self{Reading4Description} = $val', + PrintConv => { + 0 => 'Humidity', + 3 => 'Moisture', + 7 => 'Dew Point', + 8 => 'Air Temperature', + 9 => 'IR Temperature', + 11 => 'Difference Temperature', # Difference Temp: IR-Temp and DewPoint + }, + }, + 332 => { + Name => 'Reading4Device', + Format => 'string[16]', + }, + 396 => { + Name => 'Reading4Value', + Format => 'double', + # convert Kelvin -> Celsius and kg/kg -> g/kg + ValueConv => q{ + return $val - 273.15 if $$self{Reading4Units} == 0x0d and $$self{Reading4Description} != 11; + return $val *= 1000 if $$self{Reading4Units} == 0x24; + return $val; + }, + }, +); + +# FLIR public image format (ref 4/5) +%Image::ExifTool::FLIR::FPF = ( + GROUPS => { 0 => 'FLIR', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + NOTES => 'Tags extracted from FLIR Public image Format (FPF) files.', + 0x20 => { Name => 'FPFVersion', Format => 'int32u' }, + 0x24 => { Name => 'ImageDataOffset', Format => 'int32u' }, + 0x28 => { + Name => 'ImageType', + Format => 'int16u', + PrintConv => { + 0 => 'Temperature', + 1 => 'Temperature Difference', + 2 => 'Object Signal', + 3 => 'Object Signal Difference', + }, + }, + 0x2a => { + Name => 'ImagePixelFormat', + Format => 'int16u', + PrintConv => { + 0 => '2-byte short integer', + 1 => '4-byte long integer', + 2 => '4-byte float', + 3 => '8-byte double', + }, + }, + 0x2c => { Name => 'ImageWidth', Format => 'int16u' }, + 0x2e => { Name => 'ImageHeight', Format => 'int16u' }, + 0x30 => { Name => 'ExternalTriggerCount',Format => 'int32u' }, + 0x34 => { Name => 'SequenceFrameNumber',Format => 'int32u' }, + 0x78 => { Name => 'CameraModel', Format => 'string[32]', Groups => { 2 => 'Camera' } }, + 0x98 => { Name => 'CameraPartNumber', Format => 'string[32]', Groups => { 2 => 'Camera' } }, + 0xb8 => { Name => 'CameraSerialNumber', Format => 'string[32]', Groups => { 2 => 'Camera' } }, + 0xd8 => { Name => 'CameraTemperatureRangeMin', %floatKelvin, Groups => { 2 => 'Camera' } }, + 0xdc => { Name => 'CameraTemperatureRangeMax', %floatKelvin, Groups => { 2 => 'Camera' } }, + 0xe0 => { Name => 'LensModel', Format => 'string[32]', Groups => { 2 => 'Camera' } }, + 0x100 => { Name => 'LensPartNumber', Format => 'string[32]', Groups => { 2 => 'Camera' } }, + 0x120 => { Name => 'LensSerialNumber', Format => 'string[32]', Groups => { 2 => 'Camera' } }, + 0x140 => { Name => 'FilterModel', Format => 'string[32]', Groups => { 2 => 'Camera' } }, + 0x150 => { Name => 'FilterPartNumber', Format => 'string[32]', Groups => { 2 => 'Camera' } }, + 0x180 => { Name => 'FilterSerialNumber',Format => 'string[32]', Groups => { 2 => 'Camera' } }, + 0x1e0 => { Name => 'Emissivity', %float2f }, + 0x1e4 => { Name => 'ObjectDistance', Format => 'float', PrintConv => 'sprintf("%.2f m",$val)' }, + 0x1e8 => { Name => 'ReflectedApparentTemperature', %floatKelvin }, + 0x1ec => { Name => 'AtmosphericTemperature', %floatKelvin }, + 0x1f0 => { Name => 'RelativeHumidity', Format => 'float', PrintConv => 'sprintf("%.1f %%",$val*100)' }, + 0x1f4 => { Name => 'ComputedAtmosphericTrans', %float2f }, + 0x1f8 => { Name => 'EstimatedAtmosphericTrans',%float2f }, + 0x1fc => { Name => 'ReferenceTemperature', %floatKelvin }, + 0x200 => { Name => 'IRWindowTemperature', %floatKelvin, Groups => { 2 => 'Camera' } }, + 0x204 => { Name => 'IRWindowTransmission', %float2f, Groups => { 2 => 'Camera' } }, + 0x248 => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Format => 'int32u[7]', + ValueConv => 'sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d.%.3d",split(" ",$val))', + PrintConv => '$self->ConvertDateTime($val)', + }, + # Notes (based on ref 4): + # 1) The above date/time structure is documented to be 32 bytes for FPFVersion 1, but in + # fact it is only 28. Maybe this is why the full header length of my FPFVersion 2 + # sample is 892 bytes instead of 896. If this was a documentation error, we are OK, + # but if the alignment was really different in version 1, then the temperatures below + # will be mis-aligned. I don't have any version 1 samples to check this. + # 2) The following temperatures may not always be in Kelvin + 0x2a4 => { Name => 'CameraScaleMin', %float1f }, + 0x2a8 => { Name => 'CameraScaleMax', %float1f }, + 0x2ac => { Name => 'CalculatedScaleMin',%float1f }, + 0x2b0 => { Name => 'CalculatedScaleMax',%float1f }, + 0x2b4 => { Name => 'ActualScaleMin', %float1f }, + 0x2b8 => { Name => 'ActualScaleMax', %float1f }, +); + +# top-level user data written by FLIR cameras in MP4 videos +%Image::ExifTool::FLIR::UserData = ( + GROUPS => { 1 => 'FLIR', 2 => 'Camera' }, + NOTES => q{ + Tags written by some FLIR cameras in a top-level (!) "udta" atom of MP4 + videos. + }, + uuid => [ + { + Name => 'FLIR_Parts', + Condition => '$$valPt=~/^\x43\xc3\x99\x3b\x0f\x94\x42\x4b\x82\x05\x6b\x66\x51\x3f\x48\x5d/s', + SubDirectory => { + TagTable => 'Image::ExifTool::FLIR::Parts', + Start => 16, + }, + }, + { + Name => 'FLIR_Serial', + Condition => '$$valPt=~/^\x57\xf5\xb9\x3e\x51\xe4\x48\xaf\xa0\xd9\xc3\xef\x1b\x37\xf7\x12/s', + SubDirectory => { + TagTable => 'Image::ExifTool::FLIR::SerialNums', + Start => 16, + }, + }, + { + Name => 'FLIR_Params', + Condition => '$$valPt=~/^\x41\xe5\xdc\xf9\xe8\x0a\x41\xce\xad\xfe\x7f\x0c\x58\x08\x2c\x19/s', + SubDirectory => { + TagTable => 'Image::ExifTool::FLIR::Params', + Start => 16, + }, + }, + { + Name => 'FLIR_UnknownUUID', + Condition => '$$valPt=~/^\x57\x45\x20\x50\x2c\xbb\x44\xad\xae\x54\x15\xe9\xb8\x39\xd9\x03/s', + SubDirectory => { + TagTable => 'Image::ExifTool::FLIR::UnknownUUID', + Start => 16, + }, + }, + { + Name => 'FLIR_GPS', + Condition => '$$valPt=~/^\x7f\x2e\x21\x00\x8b\x46\x49\x18\xaf\xb1\xde\x70\x9a\x74\xf6\xf5/s', + SubDirectory => { + TagTable => 'Image::ExifTool::FLIR::GPS_UUID', + Start => 16, + }, + }, + { + Name => 'FLIR_MoreInfo', + Condition => '$$valPt=~/^\x2b\x45\x2f\xdc\x74\x35\x40\x94\xba\xee\x22\xa6\xb2\x3a\x7c\xf8/s', + SubDirectory => { + TagTable => 'Image::ExifTool::FLIR::MoreInfo', + Start => 16, + }, + }, + { + Name => 'SoftwareComponents', + Condition => '$$valPt=~/^\x78\x3f\xc7\x83\x0c\x95\x4b\x00\x8c\xc7\xac\xf1\xec\xb4\xd3\x9a/s', + Unknown => 1, + ValueConv => 'join " ", unpack "x20N4xZ*", $val', + }, + { + Name => 'FLIR_Unknown', + Condition => '$$valPt=~/^\x52\xae\xda\x45\x17\x1e\x48\xb1\x92\x47\x93\xa4\x21\x4e\x43\xf5/s', + Unknown => 1, + ValueConv => 'unpack "x20C*", $val', + }, + { + Name => 'Units', + Condition => '$$valPt=~/^\xf8\xab\x72\x1e\x84\x73\x44\xa0\xb8\xc8\x1b\x04\x82\x6e\x07\x24/s', + List => 1, + RawConv => 'my @a = split "\0", substr($val, 20); \@a', + }, + { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Condition => '$$valPt=~/^\x91\xaf\x9b\x93\x45\x9b\x44\x56\x98\xd1\x5e\x76\xea\x01\x04\xac....\xff\xd8\xff/s', + RawConv => 'substr($val, 20)', + Binary => 1, + }, + ], +); + +# uuid 43c3993b0f94424b82056b66513f485d box of MP4 videos (ref PH) +%Image::ExifTool::FLIR::Parts = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'FLIR', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'undef', + NOTES => q{ + Tags extracted from the "uuid" box with ID 43c3993b0f94424b82056b66513f485d + in FLIR MP4 videos. + }, + 4 => [ + { + Name => 'BAHPVer', + Condition => '$$valPt =~ /^bahpver\0/', + Format => 'undef[$size]', + RawConv => 'join " ", split "\0", substr($val, 8)', + }, + { + Name => 'BALPVer', + Condition => '$$valPt =~ /^balpver\0/', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", substr($val, 8)', + }, + { + Name => 'Battery', + Condition => '$$valPt =~ /^battery\0/', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", substr($val, 8)', + }, + { + Name => 'BAVPVer', + Condition => '$$valPt =~ /^bavpver\0/', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", substr($val, 8)', + # (the first string corresponds with a lens part number) + }, + { + Name => 'CamCore', + Condition => '$$valPt =~ /^camcore\0/', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", substr($val, 8)', + }, + { + Name => 'DetectorBoard', + Condition => '$$valPt =~ /^det_board\0/', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", substr($val, 10)', + }, + { + Name => 'Detector', + Condition => '$$valPt =~ /^detector\0/', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", substr($val, 9)', + }, + { + Name => 'GIDCVer', + Condition => '$$valPt =~ /^gidcver\0/', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", substr($val, 8)', + }, + { + Name => 'GIDPVer', + Condition => '$$valPt =~ /^gidpver\0/', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", substr($val, 8)', + }, + { + Name => 'GIPC_CPLD', + Condition => '$$valPt =~ /^gipccpld\0/', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", substr($val, 9)', + }, + { + Name => 'GIPCVer', + Condition => '$$valPt =~ /^gipcver\0/', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", substr($val, 8)', + }, + { + Name => 'GIXIVer', + Condition => '$$valPt =~ /^gixiver\0/', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", substr($val, 8)', + }, + { + Name => 'MainBoard', + Condition => '$$valPt =~ /^mainboard\0/', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", substr($val, 10)', + }, + { + Name => 'Optics', + Condition => '$$valPt =~ /^optics\0/', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", substr($val, 7)', + }, + { + Name => 'PartNumber', + Format => 'undef[$size]', + ValueConv => 'join " ", split "\0", $val', + }, + ], +); + +# uuid 57f5b93e51e448afa0d9c3ef1b37f712 box of MP4 videos (ref PH) +%Image::ExifTool::FLIR::SerialNums = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'FLIR', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, + NOTES => q{ + Tags extracted from the "uuid" box with ID 57f5b93e51e448afa0d9c3ef1b37f712 + in FLIR MP4 videos. + }, + # (not sure if these offsets are constant) + 0x0c => { Name => 'UnknownSerial1', Format => 'string[33]', Unknown => 1 }, + 0x2d => { Name => 'UnknownSerial2', Format => 'string[33]', Unknown => 1 }, + 0x4e => { Name => 'UnknownSerial3', Format => 'string[33]', Unknown => 1 }, + 0x6f => { Name => 'UnknownSerial4', Format => 'string[11]', Unknown => 1 }, + 0x7b => { Name => 'UnknownNumber', Format => 'string[3]', Unknown => 1 }, + 0x7e => { Name => 'CameraSerialNumber', Format => 'string[9]' }, +); + +# uuid 41e5dcf9e80a41ceadfe7f0c58082c19 box of MP4 videos (ref PH) +%Image::ExifTool::FLIR::Params = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'FLIR', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'float', + FIRST_ENTRY => 0, + NOTES => q{ + Tags extracted from the "uuid" box with ID 41e5dcf9e80a41ceadfe7f0c58082c19 + in FLIR MP4 videos. + }, + 1 => { Name => 'ReflectedApparentTemperature', %floatKelvin }, + 2 => { Name => 'AtmosphericTemperature', %floatKelvin }, + 3 => { Name => 'Emissivity', %float2f }, + 4 => { Name => 'ObjectDistance', PrintConv => 'sprintf("%.2f m",$val)' }, + 5 => { Name => 'RelativeHumidity', PrintConv => 'sprintf("%.1f %%",$val*100)' }, + 6 => { Name => 'EstimatedAtmosphericTrans', %float2f }, + 7 => { Name => 'IRWindowTemperature', %floatKelvin }, + 8 => { Name => 'IRWindowTransmission', %float2f }, +); + +# uuid 574520502cbb44adae5415e9b839d903 box of MP4 videos (ref PH) +%Image::ExifTool::FLIR::UnknownUUID = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'FLIR', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'float', + FIRST_ENTRY => 0, + NOTES => q{ + Tags extracted from the "uuid" box with ID 574520502cbb44adae5415e9b839d903 + in FLIR MP4 videos. + }, + # 1 - 1 + # 2 - 0 + # 3 - 0 +); + +# uuid 7f2e21008b464918afb1de709a74f6f5 box of MP4 videos (ref PH) +%Image::ExifTool::FLIR::GPS_UUID = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'FLIR', 2 => 'Location' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'float', + FIRST_ENTRY => 0, + NOTES => q{ + Tags extracted from the "uuid" box with ID 7f2e21008b464918afb1de709a74f6f5 + in FLIR MP4 videos. + }, + 1 => { + Name => 'GPSLatitude', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + 2 => { + Name => 'GPSLongitude', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + 3 => { + Name => 'GPSAltitude', + PrintConv => '$val=int($val*100+0.5)/100;"$val m"', + }, + # 4 - int32u: 0x0001bf74 + # 5 - int32u: 0 + # 6 - int32u: 1 +); + +# uuid 2b452fdc74354094baee22a6b23a7cf8 box of MP4 videos (ref PH) +%Image::ExifTool::FLIR::MoreInfo = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'FLIR', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, + NOTES => q{ + Tags extracted from the "uuid" box with ID 2b452fdc74354094baee22a6b23a7cf8 + in FLIR MP4 videos. + }, + 5 => { Name => 'LensModel', Format => 'string[6]' }, + 11 => { Name => 'UnknownTemperature1', %floatKelvin, Unknown => 1 }, # (-14.9 C) + 15 => { Name => 'UnknownTemperature2', %floatKelvin, Unknown => 1 }, # (60.0 C) +); + +# FLIR AFF tag table (ref PH) +%Image::ExifTool::FLIR::AFF = ( + GROUPS => { 0 => 'FLIR', 1 => 'FLIR', 2 => 'Image' }, + NOTES => 'Tags extracted from FLIR "AFF" SEQ images.', + VARS => { ALPHA_FIRST => 1 }, + "_header" => { + Name => 'AFFHeader', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::Header' }, + }, + 0x01 => { + Name => 'AFF1', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::AFF1' }, + }, + 0x05 => { + Name => 'AFF5', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::AFF5' }, + }, +); + +# AFF record type 1 (ref forum?topic=4898.msg27627) +%Image::ExifTool::FLIR::AFF1 = ( + GROUPS => { 0 => 'FLIR', 1 => 'FLIR', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + 0x00 => { + # use this tag only to determine the byte order of the raw data + # (the value should be 0x0002 if the byte order is correct) + Name => 'RawDataByteOrder', + Hidden => 1, + RawConv => 'ToggleByteOrder() if $val >= 0x0100; undef', + }, + 0x01 => { Name => 'SensorWidth', Format => 'int16u' }, + 0x02 => { Name => 'SensorHeight', Format => 'int16u' }, +); + +# AFF record type 5 (ref forum?topic=4898.msg27628) +%Image::ExifTool::FLIR::AFF5 = ( + GROUPS => { 0 => 'FLIR', 1 => 'FLIR', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + 0x12 => { + # use this tag only to determine the byte order of the raw data + # (the value should be 0x0002 if the byte order is correct) + Name => 'RawDataByteOrder', + Hidden => 1, + RawConv => 'ToggleByteOrder() if $val >= 0x0100; undef', + }, + 0x13 => { Name => 'SensorWidth', Format => 'int16u' }, + 0x14 => { Name => 'SensorHeight', Format => 'int16u' }, +); + +# FLIR composite tags (ref 1) +%Image::ExifTool::FLIR::Composite = ( + GROUPS => { 1 => 'FLIR', 2 => 'Camera' }, + PeakSpectralSensitivity => { + Require => 'FLIR:PlanckB', + ValueConv => '14387.6515/$val', + PrintConv => 'sprintf("%.1f um", $val)', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::FLIR'); + +#------------------------------------------------------------------------------ +# Get image type from raw image data +# Inputs: 0) ExifTool ref, 1) image data, 2) tag name +# Returns: image type (PNG, JPG, TIFF or undef) +# - image itself is stored in $$et{$tag} +sub GetImageType($$$) +{ + my ($et, $val, $tag) = @_; + my ($w, $h) = @$et{"${tag}Width","${tag}Height"}; + my $type = 'DAT'; + # add TIFF header only if this looks like 16-bit raw data + # (note: MakeTiffHeader currently works only for little-endian, + # and I haven't seen any big-endian samples, but check anwyay) + if ($val =~ /^\x89PNG\r\n\x1a\n/) { + $type = 'PNG'; + } elsif ($val =~ /^\xff\xd8\xff/) { # (haven't seen this, but just in case - PH) + $type = 'JPG'; + } elsif (length $val != $w * $h * 2) { + $et->Warn("Unrecognized FLIR $tag data format"); + } elsif (GetByteOrder() eq 'II') { + $val = Image::ExifTool::MakeTiffHeader($w,$h,1,16) . $val; + $type = 'TIFF'; + } else { + $et->Warn("Don't yet support big-endian TIFF $tag"); + } + # save image data + $$et{$tag} = $val; + return $type; +} + +#------------------------------------------------------------------------------ +# Unescape FLIR Unicode character +# Inputs: 0) escaped character code +# Returns: UTF8 character +sub UnescapeFLIR($) +{ + my $char = shift; + return $char unless length $char == 4; # escaped ASCII char (eg. '\\') + my $val = hex $char; + return chr($val) if $val < 0x80; # simple ASCII + return pack('C0U', $val) if $] >= 5.006001; + return Image::ExifTool::PackUTF8($val); +} + +#------------------------------------------------------------------------------ +# Process FLIR text info record (ref PH) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessFLIRText($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen}; + + return 0 if $dirLen < 12; + + $et->VerboseDir('FLIR Text'); + + my $dat = substr($$dataPt, $dirStart+12, $dirLen-12); + $dat =~ s/\0.*//s; # truncate at null + + # the parameter text contains an additional header entry... + if ($tagTablePtr eq \%Image::ExifTool::FLIR::ParamInfo and + $dat =~ /# (Generated) at (.*?)[\n\r]/) + { + $et->HandleTag($tagTablePtr, $1, $2); + } + + for (;;) { + $dat =~ /.(\d+).(label|value|param) (unicode|text) "(.*)"/g or last; + my ($tag, $val) = (ucfirst($2) . $1, $4); + if ($3 eq 'unicode' and $val =~ /\\/) { + # convert escaped Unicode characters (backslash followed by 4 hex digits) + $val =~ s/\\([0-9a-fA-F]{4}|.)/UnescapeFLIR($1)/sge; + $et->Decode($val, 'UTF8'); + } + $$tagTablePtr{$tag} or AddTagToTable($tagTablePtr, $tag, { Name => $tag }); + $et->HandleTag($tagTablePtr, $tag, $val); + } + + return 1; +} + +#------------------------------------------------------------------------------ +# Process FLIR measurement tool record (ref 6) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +# (code-driven decoding isn't pretty, but sometimes it is necessary) +sub ProcessMeasInfo($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dataPos = $$dirInfo{DataPos}; + my $dirEnd = $dirStart + $$dirInfo{DirLen}; + + my $pos = $dirStart + 12; + return 0 if $pos > $dirEnd; + ToggleByteOrder() if Get16u($dataPt, $dirStart) >= 0x100; + my ($i, $t, $p); + for ($i=1; ; ++$i) { + last if $pos + 2 > $dirEnd; + my $recLen = Get16u($dataPt, $pos); + last if $recLen < 0x28 or $pos + $recLen > $dirEnd; + my $pre = 'Meas' . $i; + $et->VerboseDir("MeasInfo $i", undef, $recLen); + $et->VerboseDump($dataPt, Len => $recLen, Start=>$pos, DataPos=>$dataPos); + my $coordLen = Get16u($dataPt, $pos+4); + # generate tag table entries for this tool if necessary + foreach $t ('Type', 'Params', 'Label') { + my $tag = $pre . $t; + last if $$tagTablePtr{$tag}; + my $tagInfo = { Name => $tag }; + $$tagInfo{PrintConv} = $$tagTablePtr{"Meas1$t"}{PrintConv}; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + # extract measurement tool type + $et->HandleTag($tagTablePtr, "${pre}Type", undef, + DataPt=>$dataPt, DataPos=>$dataPos, Start=>$pos+0x0a, Size=>2); + last if $pos + 0x24 + $coordLen > $dirEnd; + # extract measurement parameters + $et->HandleTag($tagTablePtr, "${pre}Params", undef, + DataPt=>$dataPt, DataPos=>$dataPos, Start=>$pos+0x24, Size=>$coordLen); + my @uni; + # extract label (sometimes-null-terminated Unicode) + for ($p=0x24+$coordLen; $p<$recLen-1; $p+=2) { + my $ch = Get16u($dataPt, $p+$pos); + # FLIR Tools v2.0 for Mac doesn't properly null-terminate these strings, + # so end the string at any funny character + last if $ch < 0x20 or $ch > 0x7f; + push @uni, $ch; + } + # convert to the ExifTool character set + require Image::ExifTool::Charset; + my $val = Image::ExifTool::Charset::Recompose($et, \@uni); + $et->HandleTag($tagTablePtr, "${pre}Label", $val, + DataPt=>$dataPt, DataPos=>$dataPos, Start=>$pos+0x24+$coordLen, Size=>2*scalar(@uni)); + $pos += $recLen; # step to next record + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process FLIR FFF record (ref PH/1/3) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 if this was a valid FFF record +sub ProcessFLIR($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $raf = $$dirInfo{RAF} || new File::RandomAccess($$dirInfo{DataPt}); + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my $base = $raf->Tell(); + my ($i, $hdr, $buff, $rec); + + # read and verify FFF header + $raf->Read($hdr, 0x40) == 0x40 and $hdr =~ /^([AF]FF)\0/ or return 0; + + my $type = $1; + + # set file type if reading from FFF or SEQ file ($tagTablePtr will not be defined) + $et->SetFileType($type eq 'FFF' ? 'FLIR' : 'SEQ') unless $tagTablePtr; + + # FLIR file header (ref 3) + # 0x00 - string[4] file format ID = "FFF\0" + # 0x04 - string[16] file creator: seen "\0","MTX IR\0","CAMCTRL\0" + # 0x14 - int32u file format version = 100 + # 0x18 - int32u offset to record directory + # 0x1c - int32u number of entries in record directory + # 0x20 - int32u next free index ID = 2 + # 0x24 - int16u swap pattern = 0 (?) + # 0x28 - int16u[7] spares + # 0x34 - int32u[2] reserved + # 0x3c - int32u checksum + + # determine byte ordering by validating version number + # (in my samples FLIR APP1 is big-endian, FFF files are little-endian) + for ($i=0; ; ++$i) { + my $ver = Get32u(\$hdr, 0x14); + last if $ver >= 100 and $ver < 200; # (have seen 100 and 101 - PH) + ToggleByteOrder(); + next unless $i; + return 0 if $$et{DOC_NUM}; + $et->Warn("Unsupported FLIR $type version"); + return 1; + } + + # read the FLIR record directory + my $pos = Get32u(\$hdr, 0x18); + my $num = Get32u(\$hdr, 0x1c); + unless ($raf->Seek($base+$pos) and $raf->Read($buff, $num * 0x20) == $num * 0x20) { + $et->Warn('Truncated FLIR FFF directory'); + return $$et{DOC_NUM} ? 0 : 1; + } + + unless ($tagTablePtr) { + $tagTablePtr = GetTagTable("Image::ExifTool::FLIR::$type"); + $$et{SET_GROUP0} = 'FLIR'; # (set group 0 to 'FLIR' for FFF files) + } + + # process the header data + $et->HandleTag($tagTablePtr, '_header', $hdr); + + my $success = 1; + my $oldIndent = $$et{INDENT}; + $$et{INDENT} .= '| '; + $et->VerboseDir($type, $num); + + for ($i=0; $i<$num; ++$i) { + + # FLIR record entry (ref 3): + # 0x00 - int16u record type + # 0x02 - int16u record subtype: RawData 1=BE, 2=LE, 3=PNG; 1 for other record types + # 0x04 - int32u record version: seen 0x64,0x66,0x67,0x68,0x6f,0x104 + # 0x08 - int32u index id = 1 + # 0x0c - int32u record offset from start of FLIR data + # 0x10 - int32u record length + # 0x14 - int32u parent = 0 (?) + # 0x18 - int32u object number = 0 (?) + # 0x1c - int32u checksum: 0 for no checksum + + my $entry = $i * 0x20; + my $recType = Get16u(\$buff, $entry); + if ($recType == 0) { + $verbose and print $out "$$et{INDENT}$i) FLIR Record 0x00 (empty)\n"; + next; + } + my $recPos = Get32u(\$buff, $entry + 0x0c); + my $recLen = Get32u(\$buff, $entry + 0x10); + + $verbose and printf $out "%s%d) FLIR Record 0x%.2x, offset 0x%.4x, length 0x%.4x\n", + $$et{INDENT}, $i, $recType, $recPos, $recLen; + + # skip RawData records for embedded documents + if ($recType == 1 and $$et{DOC_NUM}) { + $raf->Seek($base+$recPos+$recLen) or $success = 0, last; + next; + } + unless ($raf->Seek($base+$recPos) and $raf->Read($rec, $recLen) == $recLen) { + if ($$et{DOC_NUM}) { + $success = 0; # abort processing more documents + } else { + $et->Warn('Invalid FLIR record'); + } + last; + } + if ($$tagTablePtr{$recType}) { + $et->HandleTag($tagTablePtr, $recType, undef, + Base => $base, + DataPt => \$rec, + DataPos => $recPos, + Start => 0, + Size => $recLen, + ); + } elsif ($verbose > 2) { + $et->VerboseDump(\$rec, Len => $recLen, DataPos => $recPos); + } + } + delete $$et{SET_GROUP0}; + $$et{INDENT} = $oldIndent; + + # extract information from subsequent frames in SEQ file if ExtractEmbedded is used + if ($$dirInfo{RAF} and $et->Options('ExtractEmbedded') and not $$et{DOC_NUM}) { + for (;;) { + $$et{DOC_NUM} = $$et{DOC_COUNT} + 1; + last unless ProcessFLIR($et, $dirInfo, $tagTablePtr); + # (DOC_COUNT will be incremented automatically if we extracted any tags) + } + delete $$et{DOC_NUM}; + } + return $success; +} + +#------------------------------------------------------------------------------ +# Process FLIR public image format (FPF) file (ref PH/4) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 if this was a valid FFF file +sub ProcessFPF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + + $raf->Read($buff, 892) == 892 and $buff =~ /^FPF Public Image Format\0/ or return 0; + + # I think these are always little-endian, but check FPFVersion just in case + SetByteOrder('II'); + ToggleByteOrder() unless Get32u(\$buff, 0x20) & 0xffff; + + my $tagTablePtr = GetTagTable('Image::ExifTool::FLIR::FPF'); + $et->SetFileType(); + $et->ProcessDirectory( { DataPt => \$buff, Parent => 'FPF' }, $tagTablePtr); + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::FLIR - Read FLIR meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains the definitions to read meta information from FLIR +Systems Inc. thermal image files (FFF, FPF and JPEG format). + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://exiftool.org/forum/index.php/topic,4898.0.html> + +=item L<http://www.nuage.ch/site/flir-i7-some-analysis/> + +=item L<http://www.workswell.cz/manuals/flir/hardware/A3xx_and_A6xx_models/Streaming_format_ThermoVision.pdf> + +=item L<http://support.flir.com/DocDownload/Assets/62/English/1557488%24A.pdf> + +=item L<http://code.google.com/p/dvelib/source/browse/trunk/flirPublicFormat/fpfConverter/Fpfimg.h?spec=svn3&r=3> + +=item L<https://exiftool.org/forum/index.php/topic,5538.0.html> + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Tomas for his hard work in decoding much of this information, and +to Jens Duttke for getting me started on this format. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/FLIR Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Fixup.pm b/lib/Image/ExifTool/Fixup.pm new file mode 100644 index 0000000..12b52d4 --- /dev/null +++ b/lib/Image/ExifTool/Fixup.pm @@ -0,0 +1,366 @@ +#------------------------------------------------------------------------------ +# File: Fixup.pm +# +# Description: Utility to handle pointer fixups +# +# Revisions: 01/19/2005 - P. Harvey Created +# 04/11/2005 - P. Harvey Allow fixups to be tagged with a marker, +# and add new marker-related routines +# 06/21/2006 - P. Harvey Patch to work with negative offsets +# 07/07/2006 - P. Harvey Added support for 16-bit pointers +# 02/19/2013 - P. Harvey Added IsEmpty() +# +# Data Members: +# +# Start - Position in data where a zero pointer points to. +# Shift - Amount to shift offsets (relative to Start). +# Fixups - List of Fixup object references to to shift relative to this Fixup. +# Pointers - Hash of references to fixup pointer arrays, keyed by ByteOrder +# string (with "2" added if pointer is 16-bit [default is 32-bit], +# plus "_$marker" suffix if tagged with a marker name). +# +# Procedure: +# +# 1. Create a Fixup object for each data block containing pointers +# 2. Call AddFixup with the offset of each pointer in the block +# - pointer is assumed int32u with the current byte order +# - may also be called with a fixup reference for contained blocks +# 3. Add the necessary pointer offset to $$fixup{Shift} +# 4. Add data size to $$fixup{Start} if data is added before the block +# - automatically also shifts pointers by this amount +# 5. Call ApplyFixup to apply the fixup to all pointers +# - resets Shift and Start to 0 after applying fixup +#------------------------------------------------------------------------------ + +package Image::ExifTool::Fixup; + +use strict; +use Image::ExifTool qw(GetByteOrder SetByteOrder Get32u Get32s Set32u + Get16u Get16s Set16u); +use vars qw($VERSION); + +$VERSION = '1.05'; + +sub AddFixup($$;$$); +sub ApplyFixup($$); +sub Dump($;$); + +#------------------------------------------------------------------------------ +# New - create new Fixup object +# Inputs: 0) reference to Fixup object or Fixup class name +sub new +{ + local $_; + my $that = shift; + my $class = ref($that) || $that || 'Image::ExifTool::Fixup'; + my $self = bless {}, $class; + + # initialize required members + $self->{Start} = 0; + $self->{Shift} = 0; + + return $self; +} + +#------------------------------------------------------------------------------ +# Clone this object +# Inputs: 0) reference to Fixup object or Fixup class name +# Returns: reference to new Fixup object +sub Clone($) +{ + my $self = shift; + my $clone = new Image::ExifTool::Fixup; + $clone->{Start} = $self->{Start}; + $clone->{Shift} = $self->{Shift}; + my $phash = $self->{Pointers}; + if ($phash) { + $clone->{Pointers} = { }; + my $byteOrder; + foreach $byteOrder (keys %$phash) { + my @pointers = @{$phash->{$byteOrder}}; + $clone->{Pointers}->{$byteOrder} = \@pointers; + } + } + if ($self->{Fixups}) { + $clone->{Fixups} = [ ]; + my $subFixup; + foreach $subFixup (@{$self->{Fixups}}) { + push @{$clone->{Fixups}}, $subFixup->Clone(); + } + } + return $clone; +} + +#------------------------------------------------------------------------------ +# Add fixup pointer or another fixup object below this one +# Inputs: 0) Fixup object reference +# 1) Scalar for pointer offset, or reference to Fixup object +# 2) Optional marker name for the pointer +# 3) Optional pointer format ('int16u' or 'int32u', defaults to 'int32u') +# Notes: Byte ordering must be set properly for the pointer being added (must keep +# track of the byte order of each offset since MakerNotes may have different byte order!) +sub AddFixup($$;$$) +{ + my ($self, $pointer, $marker, $format) = @_; + if (ref $pointer) { + $self->{Fixups} or $self->{Fixups} = [ ]; + push @{$self->{Fixups}}, $pointer; + } else { + my $byteOrder = GetByteOrder(); + if (defined $format) { + if ($format eq 'int16u') { + $byteOrder .= '2'; + } elsif ($format ne 'int32u') { + warn "Bad Fixup pointer format $format\n"; + } + } + $byteOrder .= "_$marker" if defined $marker; + my $phash = $self->{Pointers}; + $phash or $phash = $self->{Pointers} = { }; + $phash->{$byteOrder} or $phash->{$byteOrder} = [ ]; + push @{$phash->{$byteOrder}}, $pointer; + } +} + +#------------------------------------------------------------------------------ +# fix up pointer offsets +# Inputs: 0) Fixup object reference, 1) data reference +# Outputs: Collapses fixup hierarchy into linear lists of fixup pointers +sub ApplyFixup($$) +{ + my ($self, $dataPt) = @_; + + my $start = $self->{Start}; + my $shift = $self->{Shift} + $start; # make shift relative to start + my $phash = $self->{Pointers}; + + # fix up pointers in this fixup + if ($phash and ($start or $shift)) { + my $saveOrder = GetByteOrder(); # save original byte ordering + my ($byteOrder, $ptr); + foreach $byteOrder (keys %$phash) { + SetByteOrder(substr($byteOrder,0,2)); + # apply the fixup offset shift (must get as signed integer + # to avoid overflow in case it was negative before) + my ($get, $set) = ($byteOrder =~ /^(II2|MM2)/) ? + (\&Get16s, \&Set16u) : (\&Get32s, \&Set32u); + foreach $ptr (@{$phash->{$byteOrder}}) { + $ptr += $start; # update pointer to new start location + next unless $shift; + &$set(&$get($dataPt, $ptr) + $shift, $dataPt, $ptr); + } + } + SetByteOrder($saveOrder); # restore original byte ordering + } + # recurse into contained fixups + if ($self->{Fixups}) { + # create our pointer hash if it doesn't exist + $phash or $phash = $self->{Pointers} = { }; + # loop through all contained fixups + my $subFixup; + foreach $subFixup (@{$self->{Fixups}}) { + # adjust the subfixup start and shift + $subFixup->{Start} += $start; + $subFixup->{Shift} += $shift - $start; + # recursively apply contained fixups + ApplyFixup($subFixup, $dataPt); + my $shash = $subFixup->{Pointers} or next; + # add all pointers to our collapsed lists + my $byteOrder; + foreach $byteOrder (keys %$shash) { + $phash->{$byteOrder} or $phash->{$byteOrder} = [ ]; + push @{$phash->{$byteOrder}}, @{$shash->{$byteOrder}}; + delete $shash->{$byteOrder}; + } + delete $subFixup->{Pointers}; + } + delete $self->{Fixups}; # remove our contained fixups + } + # reset our Start/Shift for the collapsed fixup + $self->{Start} = $self->{Shift} = 0; +} + +#------------------------------------------------------------------------------ +# Is this Fixup empty? +# Inputs: 0) Fixup object ref +# Returns: True if there are no offsets to fix +sub IsEmpty($) +{ + my $self = shift; + my $phash = $self->{Pointers}; + if ($phash) { + my $key; + foreach $key (keys %$phash) { + next unless ref $$phash{$key} eq 'ARRAY'; + return 0 if @{$$phash{$key}}; + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Does specified marker exist? +# Inputs: 0) Fixup object reference, 1) marker name +# Returns: True if fixup contains specified marker name +sub HasMarker($$) +{ + my ($self, $marker) = @_; + my $phash = $self->{Pointers}; + return 0 unless $phash; + return 1 if grep /_$marker$/, keys %$phash; + return 0 unless $self->{Fixups}; + my $subFixup; + foreach $subFixup (@{$self->{Fixups}}) { + return 1 if $subFixup->HasMarker($marker); + } + return 0; +} + +#------------------------------------------------------------------------------ +# Set all marker pointers to specified value +# Inputs: 0) Fixup object reference, 1) data reference +# 2) marker name, 3) pointer value, 4) offset to start of data +sub SetMarkerPointers($$$$;$) +{ + my ($self, $dataPt, $marker, $value, $startOffset) = @_; + my $start = $self->{Start} + ($startOffset || 0); + my $phash = $self->{Pointers}; + + if ($phash) { + my $saveOrder = GetByteOrder(); # save original byte ordering + my ($byteOrder, $ptr); + foreach $byteOrder (keys %$phash) { + next unless $byteOrder =~ /^(II|MM)(2?)_$marker$/; + SetByteOrder($1); + my $set = $2 ? \&Set16u : \&Set32u; + foreach $ptr (@{$phash->{$byteOrder}}) { + &$set($value, $dataPt, $ptr + $start); + } + } + SetByteOrder($saveOrder); # restore original byte ordering + } + if ($self->{Fixups}) { + my $subFixup; + foreach $subFixup (@{$self->{Fixups}}) { + $subFixup->SetMarkerPointers($dataPt, $marker, $value, $start); + } + } +} + +#------------------------------------------------------------------------------ +# Get pointer values for specified marker +# Inputs: 0) Fixup object reference, 1) data reference, +# 2) marker name, 3) offset to start of data +# Returns: List of marker pointers in list context, or first marker pointer otherwise +sub GetMarkerPointers($$$;$) +{ + my ($self, $dataPt, $marker, $startOffset) = @_; + my $start = $self->{Start} + ($startOffset || 0); + my $phash = $self->{Pointers}; + my @pointers; + + if ($phash) { + my $saveOrder = GetByteOrder(); + my ($byteOrder, $ptr); + foreach $byteOrder (grep /_$marker$/, keys %$phash) { + SetByteOrder(substr($byteOrder,0,2)); + my $get = ($byteOrder =~ /^(II2|MM2)/) ? \&Get16u : \&Get32u; + foreach $ptr (@{$phash->{$byteOrder}}) { + push @pointers, &$get($dataPt, $ptr + $start); + } + } + SetByteOrder($saveOrder); # restore original byte ordering + } + if ($self->{Fixups}) { + my $subFixup; + foreach $subFixup (@{$self->{Fixups}}) { + push @pointers, $subFixup->GetMarkerPointers($dataPt, $marker, $start); + } + } + return @pointers if wantarray; + return $pointers[0]; +} + +#------------------------------------------------------------------------------ +# Dump fixup to console for debugging +# Inputs: 0) Fixup object reference, 1) optional initial indent string +sub Dump($;$) +{ + my ($self, $indent) = @_; + $indent or $indent = ''; + printf "${indent}Fixup start=0x%x shift=0x%x\n", $self->{Start}, $self->{Shift}; + my $phash = $self->{Pointers}; + if ($phash) { + my $byteOrder; + foreach $byteOrder (sort keys %$phash) { + print "$indent $byteOrder: ", join(' ',@{$phash->{$byteOrder}}),"\n"; + } + } + if ($self->{Fixups}) { + my $subFixup; + foreach $subFixup (@{$self->{Fixups}}) { + Dump($subFixup, $indent . ' '); + } + } +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Fixup - Utility to handle pointer fixups + +=head1 SYNOPSIS + + use Image::ExifTool::Fixup; + + $fixup = new Image::ExifTool::Fixup; + + # add a new fixup to a pointer at the specified offset in data + $fixup->AddFixup($offset); + + # add a new Fixup object to the tree + $fixup->AddFixup($subFixup); + + $fixup->{Start} += $shift1; # shift pointer offsets and values + + $fixup->{Shift} += $shift2; # shift pointer values only + + # recursively apply fixups to the specified data + $fixup->ApplyFixups(\$data); + + $fixup->Dump(); # dump debugging information + + $fixup->IsEmpty(); # return true if no offsets to fix + +=head1 DESCRIPTION + +This module contains the code to keep track of pointers in memory and to +shift these pointers as required. It is used by ExifTool to maintain the +pointers in image file directories (IFD's). + +=head1 NOTES + +Keeps track of pointers with different byte ordering, and relies on +Image::ExifTool::GetByteOrder() to determine the current byte ordering +when adding new pointers to a fixup. + +Maintains a hierarchical list of fixups so that the whole hierarchy can +be shifted by a simple shift at the base. Hierarchy is collapsed to a +linear list when ApplyFixups() is called. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Flash.pm b/lib/Image/ExifTool/Flash.pm new file mode 100644 index 0000000..c91538a --- /dev/null +++ b/lib/Image/ExifTool/Flash.pm @@ -0,0 +1,755 @@ +#------------------------------------------------------------------------------ +# File: Flash.pm +# +# Description: Read Shockwave Flash meta information +# +# Revisions: 05/16/2006 - P. Harvey Created +# 06/07/2007 - PH Added support for FLV (Flash Video) files +# 10/23/2008 - PH Added support for XMP in FLV and SWF +# +# References: 1) http://www.the-labs.com/MacromediaFlash/SWF-Spec/SWFfileformat.html +# 2) http://sswf.sourceforge.net/SWFalexref.html +# 3) http://osflash.org/flv/ +# 4) http://www.irisa.fr/texmex/people/dufouil/ffmpegdoxy/flv_8h.html +# 5) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf (Oct 2008) +# 6) http://www.adobe.com/devnet/swf/pdf/swf_file_format_spec_v9.pdf +# 7) http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d56e-7ff6.html +# 8) http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf +# +# Notes: I'll add AMF3 support if someone sends me a FLV with AMF3 data +#------------------------------------------------------------------------------ + +package Image::ExifTool::Flash; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::FLAC; + +$VERSION = '1.12'; + +sub ProcessMeta($$$;$); + +# Meta packets that we process +my %processMetaPacket = ( onMetaData => 1, onXMPData => 1 ); + +# information extracted from SWF header +%Image::ExifTool::Flash::Main = ( + GROUPS => { 2 => 'Video' }, + VARS => { ALPHA_FIRST => 1 }, + NOTES => q{ + The information below is extracted from SWF (Shockwave Flash) files. Tags + with string ID's represent information extracted from the file header. + }, + FlashVersion => { }, + Compressed => { PrintConv => { 0 => 'False', 1 => 'True' } }, + ImageWidth => { }, + ImageHeight => { }, + FrameRate => { }, + FrameCount => { }, + Duration => { + Notes => 'calculated from FrameRate and FrameCount', + PrintConv => 'ConvertDuration($val)', + }, + 69 => { + Name => 'FlashAttributes', + PrintConv => { BITMASK => { + 0 => 'UseNetwork', + 3 => 'ActionScript3', + 4 => 'HasMetadata', + } }, + }, + 77 => { + Name => 'XMP', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, +); + +# packets in Flash Video files +%Image::ExifTool::Flash::FLV = ( + NOTES => q{ + Information is extracted from the following packets in FLV (Flash Video) + files. + }, + 0x08 => { + Name => 'Audio', + BitMask => 0x04, + SubDirectory => { TagTable => 'Image::ExifTool::Flash::Audio' }, + }, + 0x09 => { + Name => 'Video', + BitMask => 0x01, + SubDirectory => { TagTable => 'Image::ExifTool::Flash::Video' }, + }, + 0x12 => { + Name => 'Meta', + SubDirectory => { TagTable => 'Image::ExifTool::Flash::Meta' }, + }, +); + +# tags in Flash Video packet header +%Image::ExifTool::Flash::Audio = ( + PROCESS_PROC => \&Image::ExifTool::FLAC::ProcessBitStream, + GROUPS => { 2 => 'Audio' }, + NOTES => 'Information extracted from the Flash Audio header.', + 'Bit0-3' => { + Name => 'AudioEncoding', + PrintConv => { + 0 => 'PCM-BE (uncompressed)', # PCM-BE according to ref 4 + 1 => 'ADPCM', + 2 => 'MP3', + 3 => 'PCM-LE (uncompressed)', #4 + 4 => 'Nellymoser 16kHz Mono', #8 + 5 => 'Nellymoser 8kHz Mono', + 6 => 'Nellymoser', + 7 => 'G.711 A-law logarithmic PCM', #8 + 8 => 'G.711 mu-law logarithmic PCM', #8 + # (9 is reserved, ref 8) + 10 => 'AAC', #8 + 11 => 'Speex', #8 + 13 => 'MP3 8-Khz', #8 + 15 => 'Device-specific sound', #8 + }, + }, + 'Bit4-5' => { + Name => 'AudioSampleRate', + ValueConv => { + 0 => 5512, + 1 => 11025, + 2 => 22050, + 3 => 44100, + }, + }, + 'Bit6' => { + Name => 'AudioBitsPerSample', + ValueConv => '8 * ($val + 1)', + }, + 'Bit7' => { + Name => 'AudioChannels', + ValueConv => '$val + 1', + PrintConv => { + 1 => '1 (mono)', + 2 => '2 (stereo)', + }, + }, +); + +# tags in Flash Video packet header +%Image::ExifTool::Flash::Video = ( + PROCESS_PROC => \&Image::ExifTool::FLAC::ProcessBitStream, + GROUPS => { 2 => 'Video' }, + NOTES => 'Information extracted from the Flash Video header.', + 'Bit4-7' => { + Name => 'VideoEncoding', + PrintConv => { + 1 => 'JPEG', #8 + 2 => 'Sorensen H.263', + 3 => 'Screen Video', + 4 => 'On2 VP6', + 5 => 'On2 VP6 Alpha', #3 + 6 => 'Screen Video 2', #3 + 7 => 'H.264', #7 (called "AVC" by ref 8) + }, + }, +); + +# tags in Flash META packet (in ActionScript Message Format) +%Image::ExifTool::Flash::Meta = ( + PROCESS_PROC => \&ProcessMeta, + GROUPS => { 2 => 'Video' }, + NOTES => q{ + Below are a few observed FLV Meta tags, but ExifTool will attempt to extract + information from any tag found. + }, + 'audiocodecid' => { Name => 'AudioCodecID', Groups => { 2 => 'Audio' } }, + 'audiodatarate' => { + Name => 'AudioBitrate', + Groups => { 2 => 'Audio' }, + ValueConv => '$val * 1000', + PrintConv => 'ConvertBitrate($val)', + }, + 'audiodelay' => { Name => 'AudioDelay', Groups => { 2 => 'Audio' } }, + 'audiosamplerate'=>{ Name => 'AudioSampleRate', Groups => { 2 => 'Audio' } }, + 'audiosamplesize'=>{ Name => 'AudioSampleSize', Groups => { 2 => 'Audio' } }, + 'audiosize' => { Name => 'AudioSize', Groups => { 2 => 'Audio' } }, + 'bytelength' => 'ByteLength', # (youtube) + 'canseekontime' => 'CanSeekOnTime', # (youtube) + 'canSeekToEnd' => 'CanSeekToEnd', + 'creationdate' => { + # (not an AMF date type in my sample) + Name => 'CreateDate', + Groups => { 2 => 'Time' }, + ValueConv => '$val=~s/\s+$//; $val', # trim trailing whitespace + }, + 'createdby' => 'CreatedBy', #7 + 'cuePoints' => { + Name => 'CuePoint', + SubDirectory => { TagTable => 'Image::ExifTool::Flash::CuePoint' }, + }, + 'datasize' => 'DataSize', + 'duration' => { + Name => 'Duration', + PrintConv => 'ConvertDuration($val)', + }, + 'filesize' => 'FileSizeBytes', + 'framerate' => { + Name => 'FrameRate', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + }, + 'hasAudio' => { Name => 'HasAudio', Groups => { 2 => 'Audio' } }, + 'hasCuePoints' => 'HasCuePoints', + 'hasKeyframes' => 'HasKeyFrames', + 'hasMetadata' => 'HasMetadata', + 'hasVideo' => 'HasVideo', + 'height' => 'ImageHeight', + 'httphostheader'=> 'HTTPHostHeader', # (youtube) + 'keyframesTimes'=> 'KeyFramesTimes', + 'keyframesFilepositions' => 'KeyFramePositions', + 'lasttimestamp' => 'LastTimeStamp', + 'lastkeyframetimestamp' => 'LastKeyFrameTime', + 'metadatacreator'=>'MetadataCreator', + 'metadatadate' => { + Name => 'MetadataDate', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 'purl' => 'URL', # (youtube) (what does P mean?) + 'pmsg' => 'Message', # (youtube) (what does P mean?) + 'sourcedata' => 'SourceData', # (youtube) + 'starttime' => { # (youtube) + Name => 'StartTime', + PrintConv => 'ConvertDuration($val)', + }, + 'stereo' => { Name => 'Stereo', Groups => { 2 => 'Audio' } }, + 'totalduration' => { # (youtube) + Name => 'TotalDuration', + PrintConv => 'ConvertDuration($val)', + }, + 'totaldatarate' => { # (youtube) + Name => 'TotalDataRate', + ValueConv => '$val * 1000', + PrintConv => 'int($val + 0.5)', + }, + 'totalduration' => 'TotalDuration', + 'videocodecid' => 'VideoCodecID', + 'videodatarate' => { + Name => 'VideoBitrate', + ValueConv => '$val * 1000', + PrintConv => 'ConvertBitrate($val)', + }, + 'videosize' => 'VideoSize', + 'width' => 'ImageWidth', + # tags in 'onXMPData' packets + 'liveXML' => { #5 + Name => 'XMP', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, +); + +# tags in Flash META CuePoint structure +%Image::ExifTool::Flash::CuePoint = ( + PROCESS_PROC => \&ProcessMeta, + GROUPS => { 2 => 'Video' }, + NOTES => q{ + These tag names are added to the CuePoint name to generate complete tag + names like "CuePoint0Name". + }, + 'name' => 'Name', + 'type' => 'Type', + 'time' => 'Time', + 'parameters' => { + Name => 'Parameter', + SubDirectory => { TagTable => 'Image::ExifTool::Flash::Parameter' }, + }, +); + +# tags in Flash META CuePoint Parameter structure +%Image::ExifTool::Flash::Parameter = ( + PROCESS_PROC => \&ProcessMeta, + GROUPS => { 2 => 'Video' }, + NOTES => q{ + There are no pre-defined parameter tags, but ExifTool will extract any + existing parameters, with tag names like "CuePoint0ParameterXxx". + }, +); + +# name lookup for known AMF data types +my @amfType = qw(double boolean string object movieClip null undefined reference + mixedArray objectEnd array date longString unsupported recordSet + XML typedObject AMF3data); + +# test for AMF structure types (object, mixed array or typed object) +my %isStruct = ( 0x03 => 1, 0x08 => 1, 0x10 => 1 ); + +#------------------------------------------------------------------------------ +# Process Flash Video AMF Meta packet (ref 3) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# 3) Set to extract single type/value only +# Returns: 1 on success, (or type/value if extracting single value) +# Notes: Updates DataPos in dirInfo if extracting single value +sub ProcessMeta($$$;$) +{ + my ($et, $dirInfo, $tagTablePtr, $single) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $dirLen = $$dirInfo{DirLen} || length($$dataPt); + my $pos = $$dirInfo{Pos} || 0; + my ($type, $val, $rec); + + $et->VerboseDir('Meta') unless $single; + +Record: for ($rec=0; ; ++$rec) { + last if $pos >= $dirLen; + $type = ord(substr($$dataPt, $pos)); + ++$pos; + if ($type == 0x00 or $type == 0x0b) { # double or date + last if $pos + 8 > $dirLen; + $val = GetDouble($dataPt, $pos); + $pos += 8; + if ($type == 0x0b) { # date + $val /= 1000; # convert to seconds + my $frac = $val - int($val); # fractional seconds + # get time zone + last if $pos + 2 > $dirLen; + my $tz = Get16s($dataPt, $pos); + $pos += 2; + # construct date/time string + $val = Image::ExifTool::ConvertUnixTime(int($val)); + if ($frac) { + $frac = sprintf('%.6f', $frac); + $frac =~ s/(^0|0+$)//g; + $val .= $frac; + } + # add timezone + if ($tz < 0) { + $val .= '-'; + $tz *= -1; + } else { + $val .= '+'; + } + $val .= sprintf('%.2d:%.2d', int($tz/60), $tz%60); + } + } elsif ($type == 0x01) { # boolean + last if $pos + 1 > $dirLen; + $val = Get8u($dataPt, $pos); + $val = { 0 => 'No', 1 => 'Yes' }->{$val} if $val < 2; + ++$pos; + } elsif ($type == 0x02) { # string + last if $pos + 2 > $dirLen; + my $len = Get16u($dataPt, $pos); + last if $pos + 2 + $len > $dirLen; + $val = substr($$dataPt, $pos + 2, $len); + $pos += 2 + $len; + } elsif ($isStruct{$type}) { # object, mixed array or typed object + $et->VPrint(1, " + [$amfType[$type]]\n"); + my $getName; + $val = ''; # dummy value + if ($type == 0x08) { # mixed array + # skip last array index for mixed array + last if $pos + 4 > $dirLen; + $pos += 4; + } elsif ($type == 0x10) { # typed object + $getName = 1; + } + for (;;) { + # get tag ID (or typed object name) + last Record if $pos + 2 > $dirLen; + my $len = Get16u($dataPt, $pos); + if ($pos + 2 + $len > $dirLen) { + $et->Warn("Truncated $amfType[$type] record"); + last Record; + } + my $tag = substr($$dataPt, $pos + 2, $len); + $pos += 2 + $len; + # first string of a typed object is the object name + if ($getName) { + $et->VPrint(1," | (object name '${tag}')\n"); + undef $getName; + next; # (ignore name for now) + } + my $subTablePtr = $tagTablePtr; + my $tagInfo = $$subTablePtr{$tag}; + # switch to subdirectory table if necessary + if ($tagInfo and $$tagInfo{SubDirectory}) { + my $subTable = $tagInfo->{SubDirectory}->{TagTable}; + # descend into Flash SubDirectory + if ($subTable =~ /^Image::ExifTool::Flash::/) { + $tag = $$tagInfo{Name}; # use our name for the tag + $subTablePtr = GetTagTable($subTable); + } + } + # get object value + my $valPos = $pos + 1; + $$dirInfo{Pos} = $pos; + my $structName = $$dirInfo{StructName}; + # add structure name to start of tag name + $tag = $structName . ucfirst($tag) if defined $structName; + $$dirInfo{StructName} = $tag; # set new structure name + my ($t, $v) = ProcessMeta($et, $dirInfo, $subTablePtr, 1); + $$dirInfo{StructName} = $structName;# restore original structure name + $pos = $$dirInfo{Pos}; # update to new position in packet + # all done if this value contained tags + last Record unless defined $t and defined $v; + next if $isStruct{$t}; # already handled tags in sub-structures + next if ref($v) eq 'ARRAY' and not @$v; # ignore empty arrays + last if $t == 0x09; # (end of object) + if (not $$subTablePtr{$tag} and $tag =~ /^\w+$/) { + AddTagToTable($subTablePtr, $tag, { Name => ucfirst($tag) }); + $et->VPrint(1, " | (adding $tag)\n"); + } + $et->HandleTag($subTablePtr, $tag, $v, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $valPos, + Size => $pos - $valPos, + Format => $amfType[$t] || sprintf('0x%x',$t), + ); + } + # } elsif ($type == 0x04) { # movie clip (not supported) + } elsif ($type == 0x05 or $type == 0x06 or $type == 0x09 or $type == 0x0d) { + # null, undefined, dirLen of object, or unsupported + $val = ''; + } elsif ($type == 0x07) { # reference + last if $pos + 2 > $dirLen; + $val = Get16u($dataPt, $pos); + $pos += 2; + } elsif ($type == 0x0a) { # array + last if $pos + 4 > $dirLen; + my $num = Get32u($dataPt, $pos); + $$dirInfo{Pos} = $pos + 4; + my ($i, @vals); + # add array index to compound tag name + my $structName = $$dirInfo{StructName}; + for ($i=0; $i<$num; ++$i) { + $$dirInfo{StructName} = $structName . $i if defined $structName; + my ($t, $v) = ProcessMeta($et, $dirInfo, $tagTablePtr, 1); + last Record unless defined $v; + # save value unless contained in a sub-structure + push @vals, $v unless $isStruct{$t}; + } + $$dirInfo{StructName} = $structName; + $pos = $$dirInfo{Pos}; + $val = \@vals; + } elsif ($type == 0x0c or $type == 0x0f) { # long string or XML + last if $pos + 4 > $dirLen; + my $len = Get32u($dataPt, $pos); + last if $pos + 4 + $len > $dirLen; + $val = substr($$dataPt, $pos + 4, $len); + $pos += 4 + $len; + # } elsif ($type == 0x0e) { # record set (not supported) + # } elsif ($type == 0x11) { # AMF3 data (can't add support for this without a test sample) + } else { + my $t = $amfType[$type] || sprintf('type 0x%x',$type); + $et->Warn("AMF $t record not yet supported"); + undef $type; # (so we don't print another warning) + last; # can't continue + } + last if $single; # all done if extracting single value + unless ($isStruct{$type}) { + # only process certain Meta packets + if ($type == 0x02 and not $rec) { + my $verb = $processMetaPacket{$val} ? 'processing' : 'ignoring'; + $et->VPrint(0, " | ($verb $val information)\n"); + last unless $processMetaPacket{$val}; + } else { + # give verbose indication if we ignore a lone value + my $t = $amfType[$type] || sprintf('type 0x%x',$type); + $et->VPrint(1, " | (ignored lone $t value '${val}')\n"); + } + } + } + if (not defined $val and defined $type) { + $et->Warn(sprintf("Truncated AMF record 0x%x",$type)); + } + return 1 unless $single; # all done + $$dirInfo{Pos} = $pos; # update position + return($type,$val); # return single type/value pair +} + +#------------------------------------------------------------------------------ +# Read information frame a Flash Video file +# Inputs: 0) ExifTool object reference, 1) Directory information reference +# Returns: 1 on success, 0 if this wasn't a valid Flash Video file +sub ProcessFLV($$) +{ + my ($et, $dirInfo) = @_; + my $verbose = $et->Options('Verbose'); + my $raf = $$dirInfo{RAF}; + my $buff; + + $raf->Read($buff, 9) == 9 or return 0; + $buff =~ /^FLV\x01/ or return 0; + SetByteOrder('MM'); + $et->SetFileType(); + my ($flags, $offset) = unpack('x4CN', $buff); + $raf->Seek($offset-9, 1) or return 1 if $offset > 9; + $flags &= 0x05; # only look for audio/video + my $found = 0; + my $tagTablePtr = GetTagTable('Image::ExifTool::Flash::FLV'); + for (;;) { + $raf->Read($buff, 15) == 15 or last; + my $len = unpack('x4N', $buff); + my $type = $len >> 24; + $len &= 0x00ffffff; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $type); + if ($verbose > 1) { + my $name = $tagInfo ? $$tagInfo{Name} : "type $type"; + $et->VPrint(1, "FLV $name packet, len $len\n"); + } + undef $buff; + if ($tagInfo and $$tagInfo{SubDirectory}) { + my $mask = $$tagInfo{BitMask}; + if ($mask) { + # handle audio or video packet + unless ($found & $mask) { + $found |= $mask; + $flags &= ~$mask; + if ($len>=1 and $raf->Read($buff, 1) == 1) { + $len -= 1; + } else { + $et->Warn("Bad $$tagInfo{Name} packet"); + last; + } + } + } elsif ($raf->Read($buff, $len) == $len) { + $len = 0; + } else { + $et->Warn('Truncated Meta packet'); + last; + } + } + if (defined $buff) { + $et->HandleTag($tagTablePtr, $type, undef, + DataPt => \$buff, + DataPos => $raf->Tell() - length($buff), + ); + } + last unless $flags; + $raf->Seek($len, 1) or last if $len; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Found a Flash tag +# Inputs: 0) ExifTool object ref, 1) tag name, 2) tag value +sub FoundFlashTag($$$) +{ + my ($et, $tag, $val) = @_; + $et->HandleTag(\%Image::ExifTool::Flash::Main, $tag, $val); +} + +#------------------------------------------------------------------------------ +# Read data from possibly compressed file +# Inputs: 0) RAF reference, 1) data buffer, 2) bytes to read, 2) compressed flag +# Returns: number of bytes read (may be greater than requested bytes if compressed) +# - concatenates data to current buffer +# - updates compressed flag with reference to inflate object for future calls +# (or sets to error message and returns zero on error) +sub ReadCompressed($$$$) +{ + my ($raf, $len, $inflate) = ($_[0], $_[2], $_[3]); + my $buff; + unless ($raf->Read($buff, $len)) { + $_[3] = 'Error reading file'; + return 0; + } + # uncompress if necessary + if ($inflate) { + unless (ref $inflate) { + unless (eval { require Compress::Zlib }) { + $_[3] = 'Install Compress::Zlib to extract compressed information'; + return 0; + } + $inflate = Compress::Zlib::inflateInit(); + unless ($inflate) { + $_[3] = 'Error initializing inflate for Flash data'; + return 0; + } + $_[3] = $inflate; # pass inflate object back to caller + } + my $tmp = $buff; + $buff = ''; + # read 64 more bytes at a time and inflate until we get enough uncompressed data + for (;;) { + my ($dat, $stat) = $inflate->inflate($tmp); + if ($stat == Compress::Zlib::Z_STREAM_END() or + $stat == Compress::Zlib::Z_OK()) + { + $buff .= $dat; # add inflated data to buffer + last if length $buff >= $len or $stat == Compress::Zlib::Z_STREAM_END(); + $raf->Read($tmp,64) or last; # must read a bit more data + } else { + $buff = ''; + last; + } + } + $_[3] = 'Error inflating compressed Flash data' unless length $buff; + } + $_[1] = defined $_[1] ? $_[1] . $buff : $buff; + return length $buff; +} + +#------------------------------------------------------------------------------ +# Read information frame a Flash file +# Inputs: 0) ExifTool object reference, 1) Directory information reference +# Returns: 1 on success, 0 if this wasn't a valid Flash file +sub ProcessSWF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $hasMeta); + + $raf->Read($buff, 8) == 8 or return 0; + $buff =~ /^(F|C)WS([^\0])/ or return 0; + my ($compressed, $vers) = ($1 eq 'C' ? 1 : 0, ord($2)); + + SetByteOrder('II'); + $et->SetFileType(); + GetTagTable('Image::ExifTool::Flash::Main'); # make sure table is initialized + + FoundFlashTag($et, FlashVersion => $vers); + FoundFlashTag($et, Compressed => $compressed); + + # read the next 64 bytes of the file (and inflate if necessary) + $buff = ''; + unless (ReadCompressed($raf, $buff, 64, $compressed)) { + $et->Warn($compressed) if $compressed; + return 1; + } + + # unpack elements of bit-packed Flash Rect structure + my $nBits = unpack('C', $buff) >> 3; # bits in x1,x2,y1,y2 elements + my $totBits = 5 + $nBits * 4; # total bits in Rect structure + my $nBytes = int(($totBits + 7) / 8); # byte length of Rect structure + if (length $buff < $nBytes + 4) { + $et->Warn('Truncated Flash file'); + return 1; + } + my $bits = unpack("B$totBits", $buff); + # isolate Rect elements and convert from ASCII bit strings to integers + my @vals = unpack('x5' . "a$nBits" x 4, $bits); + # (do conversion the hard way because oct("0b$val") requires Perl 5.6) + map { $_ = unpack('N', pack('B32', '0' x (32 - length $_) . $_)) } @vals; + + # calculate and store ImageWidth/Height + FoundFlashTag($et, ImageWidth => ($vals[1] - $vals[0]) / 20); + FoundFlashTag($et, ImageHeight => ($vals[3] - $vals[2]) / 20); + + # get frame rate and count + @vals = unpack("x${nBytes}v2", $buff); + FoundFlashTag($et, FrameRate => $vals[0] / 256); + FoundFlashTag($et, FrameCount => $vals[1]); + FoundFlashTag($et, Duration => $vals[1] * 256 / $vals[0]) if $vals[0]; + + # scan through the tags to find FlashAttributes and XMP + $buff = substr($buff, $nBytes + 4); + for (;;) { + my $buffLen = length $buff; + last if $buffLen < 2; + my $code = Get16u(\$buff, 0); + my $pos = 2; + my $tag = $code >> 6; + my $size = $code & 0x3f; + $et->VPrint(1, "SWF tag $tag ($size bytes):\n"); + last unless $tag == 69 or $tag == 77 or $hasMeta; + # read enough to get a complete short record + if ($pos + $size > $buffLen) { + # (read 2 extra bytes if available to get next tag word) + unless (ReadCompressed($raf, $buff, $size + 2, $compressed)) { + $et->Warn($compressed) if $compressed; + return 1; + } + $buffLen = length $buff; + last if $pos + $size > $buffLen; + } + # read extended record if necessary + if ($size == 0x3f) { + last if $pos + 4 > $buffLen; + $size = Get32u(\$buff, $pos); + $pos += 4; + last if $size > 1000000; # don't read anything huge + if ($pos + $size > $buffLen) { + unless (ReadCompressed($raf, $buff, $size + 2, $compressed)) { + $et->Warn($compressed) if $compressed; + return 1; + } + $buffLen = length $buff; + last if $pos + $size > $buffLen; + } + $et->VPrint(1, " [extended size $size bytes]\n"); + } + if ($tag == 69) { # FlashAttributes + last unless $size; + my $flags = Get8u(\$buff, $pos); + FoundFlashTag($et, $tag => $flags); + last unless $flags & 0x10; # only continue if we have metadata (XMP) + $hasMeta = 1; + } elsif ($tag == 77) { # Metadata + my $val = substr($buff, $pos, $size); + FoundFlashTag($et, $tag => $val); + last; + } + last if $pos + 2 > $buffLen; + $buff = substr($buff, $pos); # remove everything before the next tag + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Flash - Read Shockwave Flash meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read SWF +(Shockwave Flash) and FLV (Flash Video) files. + +=head1 NOTES + +Flash Video AMF3 support has not yet been added because I haven't yet found +a FLV file containing AMF3 information. If someone sends me a sample then I +will add AMF3 support. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.the-labs.com/MacromediaFlash/SWF-Spec/SWFfileformat.html> + +=item L<http://sswf.sourceforge.net/SWFalexref.html> + +=item L<http://osflash.org/flv/> + +=item L<http://www.irisa.fr/texmex/people/dufouil/ffmpegdoxy/flv_8h.html> + +=item L<http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d56e-7ff6.html> + +=item L<http://www.adobe.com/devnet/swf/pdf/swf_file_format_spec_v9.pdf> + +=item L<http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Flash Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/FlashPix.pm b/lib/Image/ExifTool/FlashPix.pm new file mode 100644 index 0000000..bd1007f --- /dev/null +++ b/lib/Image/ExifTool/FlashPix.pm @@ -0,0 +1,2445 @@ +#------------------------------------------------------------------------------ +# File: FlashPix.pm +# +# Description: Read FlashPix meta information +# +# Revisions: 05/29/2006 - P. Harvey Created +# +# References: 1) http://www.exif.org/Exif2-2.PDF +# 2) http://www.graphcomp.com/info/specs/livepicture/fpx.pdf +# 3) http://search.cpan.org/~jdb/libwin32/ +# 4) http://msdn.microsoft.com/en-us/library/aa380374.aspx +# 5) http://www.cpan.org/modules/by-authors/id/H/HC/HCARVEY/File-MSWord-0.1.zip +# 6) https://msdn.microsoft.com/en-us/library/cc313153(v=office.12).aspx +#------------------------------------------------------------------------------ + +package Image::ExifTool::FlashPix; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::ASF; # for GetGUID() + +$VERSION = '1.40'; + +sub ProcessFPX($$); +sub ProcessFPXR($$$); +sub ProcessProperties($$$); +sub ReadFPXValue($$$$$;$$); +sub ProcessHyperlinks($$); +sub ProcessContents($$$); +sub ProcessWordDocument($$$); +sub ProcessDocumentTable($); +sub ProcessCommentBy($$$); +sub ProcessLastSavedBy($$$); +sub SetDocNum($$;$$$); +sub ConvertDTTM($); + +# sector type constants +sub HDR_SIZE () { 512; } +sub DIF_SECT () { 0xfffffffc; } +sub FAT_SECT () { 0xfffffffd; } +sub END_OF_CHAIN () { 0xfffffffe; } +sub FREE_SECT () { 0xffffffff; } + +# format flags +sub VT_VECTOR () { 0x1000; } +sub VT_ARRAY () { 0x2000; } +sub VT_BYREF () { 0x4000; } +sub VT_RESERVED () { 0x8000; } + +# other constants +sub VT_VARIANT () { 12; } +sub VT_LPSTR () { 30; } + +# list of OLE format codes (unsupported codes commented out) +my %oleFormat = ( + 0 => undef, # VT_EMPTY + 1 => undef, # VT_NULL + 2 => 'int16s', # VT_I2 + 3 => 'int32s', # VT_I4 + 4 => 'float', # VT_R4 + 5 => 'double', # VT_R8 + 6 => undef, # VT_CY + 7 => 'VT_DATE', # VT_DATE (double, number of days since Dec 30, 1899) + 8 => 'VT_BSTR', # VT_BSTR (int32u count, followed by binary string) +# 9 => 'VT_DISPATCH', + 10 => 'int32s', # VT_ERROR + 11 => 'int16s', # VT_BOOL + 12 => 'VT_VARIANT', # VT_VARIANT +# 13 => 'VT_UNKNOWN', +# 14 => 'VT_DECIMAL', + 16 => 'int8s', # VT_I1 + 17 => 'int8u', # VT_UI1 + 18 => 'int16u', # VT_UI2 + 19 => 'int32u', # VT_UI4 + 20 => 'int64s', # VT_I8 + 21 => 'int64u', # VT_UI8 +# 22 => 'VT_INT', +# 23 => 'VT_UINT', +# 24 => 'VT_VOID', +# 25 => 'VT_HRESULT', +# 26 => 'VT_PTR', +# 27 => 'VT_SAFEARRAY', +# 28 => 'VT_CARRAY', +# 29 => 'VT_USERDEFINED', + 30 => 'VT_LPSTR', # VT_LPSTR (int32u count, followed by string) + 31 => 'VT_LPWSTR', # VT_LPWSTR (int32u word count, followed by Unicode string) + 64 => 'VT_FILETIME',# VT_FILETIME (int64u, 100 ns increments since Jan 1, 1601) + 65 => 'VT_BLOB', # VT_BLOB +# 66 => 'VT_STREAM', +# 67 => 'VT_STORAGE', +# 68 => 'VT_STREAMED_OBJECT', +# 69 => 'VT_STORED_OBJECT', +# 70 => 'VT_BLOB_OBJECT', + 71 => 'VT_CF', # VT_CF + 72 => 'VT_CLSID', # VT_CLSID +); + +# OLE flag codes (high nibble of property type) +my %oleFlags = ( + 0x1000 => 'VT_VECTOR', + 0x2000 => 'VT_ARRAY', # not yet supported + 0x4000 => 'VT_BYREF', # ditto + 0x8000 => 'VT_RESERVED', +); + +# byte sizes for supported VT_* format and flag types +my %oleFormatSize = ( + VT_DATE => 8, + VT_BSTR => 4, # (+ string length) + VT_VARIANT => 4, # (+ data length) + VT_LPSTR => 4, # (+ string length) + VT_LPWSTR => 4, # (+ string character length) + VT_FILETIME => 8, + VT_BLOB => 4, # (+ data length) + VT_CF => 4, # (+ data length) + VT_CLSID => 16, + VT_VECTOR => 4, # (+ vector elements) +); + +# names for each type of directory entry +my @dirEntryType = qw(INVALID STORAGE STREAM LOCKBYTES PROPERTY ROOT); + +# list of code pages used by Microsoft +# (ref http://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx) +my %codePage = ( + 37 => 'IBM EBCDIC US-Canada', + 437 => 'DOS United States', + 500 => 'IBM EBCDIC International', + 708 => 'Arabic (ASMO 708)', + 709 => 'Arabic (ASMO-449+, BCON V4)', + 710 => 'Arabic - Transparent Arabic', + 720 => 'DOS Arabic (Transparent ASMO)', + 737 => 'DOS Greek (formerly 437G)', + 775 => 'DOS Baltic', + 850 => 'DOS Latin 1 (Western European)', + 852 => 'DOS Latin 2 (Central European)', + 855 => 'DOS Cyrillic (primarily Russian)', + 857 => 'DOS Turkish', + 858 => 'DOS Multilingual Latin 1 with Euro', + 860 => 'DOS Portuguese', + 861 => 'DOS Icelandic', + 862 => 'DOS Hebrew', + 863 => 'DOS French Canadian', + 864 => 'DOS Arabic', + 865 => 'DOS Nordic', + 866 => 'DOS Russian (Cyrillic)', + 869 => 'DOS Modern Greek', + 870 => 'IBM EBCDIC Multilingual/ROECE (Latin 2)', + 874 => 'Windows Thai (same as 28605, ISO 8859-15)', + 875 => 'IBM EBCDIC Greek Modern', + 932 => 'Windows Japanese (Shift-JIS)', + 936 => 'Windows Simplified Chinese (PRC, Singapore)', + 949 => 'Windows Korean (Unified Hangul Code)', + 950 => 'Windows Traditional Chinese (Taiwan)', + 1026 => 'IBM EBCDIC Turkish (Latin 5)', + 1047 => 'IBM EBCDIC Latin 1/Open System', + 1140 => 'IBM EBCDIC US-Canada with Euro', + 1141 => 'IBM EBCDIC Germany with Euro', + 1142 => 'IBM EBCDIC Denmark-Norway with Euro', + 1143 => 'IBM EBCDIC Finland-Sweden with Euro', + 1144 => 'IBM EBCDIC Italy with Euro', + 1145 => 'IBM EBCDIC Latin America-Spain with Euro', + 1146 => 'IBM EBCDIC United Kingdom with Euro', + 1147 => 'IBM EBCDIC France with Euro', + 1148 => 'IBM EBCDIC International with Euro', + 1149 => 'IBM EBCDIC Icelandic with Euro', + 1200 => 'Unicode UTF-16, little endian', + 1201 => 'Unicode UTF-16, big endian', + 1250 => 'Windows Latin 2 (Central European)', + 1251 => 'Windows Cyrillic', + 1252 => 'Windows Latin 1 (Western European)', + 1253 => 'Windows Greek', + 1254 => 'Windows Turkish', + 1255 => 'Windows Hebrew', + 1256 => 'Windows Arabic', + 1257 => 'Windows Baltic', + 1258 => 'Windows Vietnamese', + 1361 => 'Korean (Johab)', + 10000 => 'Mac Roman (Western European)', + 10001 => 'Mac Japanese', + 10002 => 'Mac Traditional Chinese', + 10003 => 'Mac Korean', + 10004 => 'Mac Arabic', + 10005 => 'Mac Hebrew', + 10006 => 'Mac Greek', + 10007 => 'Mac Cyrillic', + 10008 => 'Mac Simplified Chinese', + 10010 => 'Mac Romanian', + 10017 => 'Mac Ukrainian', + 10021 => 'Mac Thai', + 10029 => 'Mac Latin 2 (Central European)', + 10079 => 'Mac Icelandic', + 10081 => 'Mac Turkish', + 10082 => 'Mac Croatian', + 12000 => 'Unicode UTF-32, little endian', + 12001 => 'Unicode UTF-32, big endian', + 20000 => 'CNS Taiwan', + 20001 => 'TCA Taiwan', + 20002 => 'Eten Taiwan', + 20003 => 'IBM5550 Taiwan', + 20004 => 'TeleText Taiwan', + 20005 => 'Wang Taiwan', + 20105 => 'IA5 (IRV International Alphabet No. 5, 7-bit)', + 20106 => 'IA5 German (7-bit)', + 20107 => 'IA5 Swedish (7-bit)', + 20108 => 'IA5 Norwegian (7-bit)', + 20127 => 'US-ASCII (7-bit)', + 20261 => 'T.61', + 20269 => 'ISO 6937 Non-Spacing Accent', + 20273 => 'IBM EBCDIC Germany', + 20277 => 'IBM EBCDIC Denmark-Norway', + 20278 => 'IBM EBCDIC Finland-Sweden', + 20280 => 'IBM EBCDIC Italy', + 20284 => 'IBM EBCDIC Latin America-Spain', + 20285 => 'IBM EBCDIC United Kingdom', + 20290 => 'IBM EBCDIC Japanese Katakana Extended', + 20297 => 'IBM EBCDIC France', + 20420 => 'IBM EBCDIC Arabic', + 20423 => 'IBM EBCDIC Greek', + 20424 => 'IBM EBCDIC Hebrew', + 20833 => 'IBM EBCDIC Korean Extended', + 20838 => 'IBM EBCDIC Thai', + 20866 => 'Russian/Cyrillic (KOI8-R)', + 20871 => 'IBM EBCDIC Icelandic', + 20880 => 'IBM EBCDIC Cyrillic Russian', + 20905 => 'IBM EBCDIC Turkish', + 20924 => 'IBM EBCDIC Latin 1/Open System with Euro', + 20932 => 'Japanese (JIS 0208-1990 and 0121-1990)', + 20936 => 'Simplified Chinese (GB2312)', + 20949 => 'Korean Wansung', + 21025 => 'IBM EBCDIC Cyrillic Serbian-Bulgarian', + 21027 => 'Extended Alpha Lowercase (deprecated)', + 21866 => 'Ukrainian/Cyrillic (KOI8-U)', + 28591 => 'ISO 8859-1 Latin 1 (Western European)', + 28592 => 'ISO 8859-2 (Central European)', + 28593 => 'ISO 8859-3 Latin 3', + 28594 => 'ISO 8859-4 Baltic', + 28595 => 'ISO 8859-5 Cyrillic', + 28596 => 'ISO 8859-6 Arabic', + 28597 => 'ISO 8859-7 Greek', + 28598 => 'ISO 8859-8 Hebrew (Visual)', + 28599 => 'ISO 8859-9 Turkish', + 28603 => 'ISO 8859-13 Estonian', + 28605 => 'ISO 8859-15 Latin 9', + 29001 => 'Europa 3', + 38598 => 'ISO 8859-8 Hebrew (Logical)', + 50220 => 'ISO 2022 Japanese with no halfwidth Katakana (JIS)', + 50221 => 'ISO 2022 Japanese with halfwidth Katakana (JIS-Allow 1 byte Kana)', + 50222 => 'ISO 2022 Japanese JIS X 0201-1989 (JIS-Allow 1 byte Kana - SO/SI)', + 50225 => 'ISO 2022 Korean', + 50227 => 'ISO 2022 Simplified Chinese', + 50229 => 'ISO 2022 Traditional Chinese', + 50930 => 'EBCDIC Japanese (Katakana) Extended', + 50931 => 'EBCDIC US-Canada and Japanese', + 50933 => 'EBCDIC Korean Extended and Korean', + 50935 => 'EBCDIC Simplified Chinese Extended and Simplified Chinese', + 50936 => 'EBCDIC Simplified Chinese', + 50937 => 'EBCDIC US-Canada and Traditional Chinese', + 50939 => 'EBCDIC Japanese (Latin) Extended and Japanese', + 51932 => 'EUC Japanese', + 51936 => 'EUC Simplified Chinese', + 51949 => 'EUC Korean', + 51950 => 'EUC Traditional Chinese', + 52936 => 'HZ-GB2312 Simplified Chinese', + 54936 => 'Windows XP and later: GB18030 Simplified Chinese (4 byte)', + 57002 => 'ISCII Devanagari', + 57003 => 'ISCII Bengali', + 57004 => 'ISCII Tamil', + 57005 => 'ISCII Telugu', + 57006 => 'ISCII Assamese', + 57007 => 'ISCII Oriya', + 57008 => 'ISCII Kannada', + 57009 => 'ISCII Malayalam', + 57010 => 'ISCII Gujarati', + 57011 => 'ISCII Punjabi', + 65000 => 'Unicode (UTF-7)', + 65001 => 'Unicode (UTF-8)', +); + +# test for file extensions which may be variants of the FPX format +# (have seen one password-protected DOCX file that is FPX-like, so assume +# that all the rest could be as well) +my %fpxFileType = ( + DOC => 1, DOCX => 1, DOCM => 1, + DOT => 1, DOTX => 1, DOTM => 1, + POT => 1, POTX => 1, POTM => 1, + PPS => 1, PPSX => 1, PPSM => 1, + PPT => 1, PPTX => 1, PPTM => 1, THMX => 1, + XLA => 1, XLAM => 1, + XLS => 1, XLSX => 1, XLSM => 1, XLSB => 1, + XLT => 1, XLTX => 1, XLTM => 1, + # non MSOffice types + FLA => 1, VSD => 1, +); + +%Image::ExifTool::FlashPix::Main = ( + PROCESS_PROC => \&ProcessFPXR, + GROUPS => { 2 => 'Image' }, + VARS => { LONG_TAGS => 0 }, + NOTES => q{ + The FlashPix file format, introduced in 1996, was developed by Kodak, + Hewlett-Packard and Microsoft. Internally the FPX file structure mimics + that of an old DOS disk with fixed-sized "sectors" (usually 512 bytes) and a + "file allocation table" (FAT). No wonder this image format never became + popular. However, some of the structures used in FlashPix streams are part + of the EXIF specification, and are still being used in the APP2 FPXR segment + of JPEG images by some digital cameras from manufacturers such as FujiFilm, + Hewlett-Packard, Kodak and Sanyo. + + ExifTool extracts FlashPix information from both FPX images and the APP2 + FPXR segment of JPEG images. As well, FlashPix information is extracted + from DOC, PPT, XLS (Microsoft Word, PowerPoint and Excel) documents, VSD + (Microsoft Visio) drawings, and FLA (Macromedia/Adobe Flash project) files + since these are based on the same file format as FlashPix (the Windows + Compound Binary File format). Note that ExifTool identifies any + unrecognized Windows Compound Binary file as a FlashPix (FPX) file. See + L<http://graphcomp.com/info/specs/livepicture/fpx.pdf> for the FlashPix + specification. + }, + "\x05SummaryInformation" => { + Name => 'SummaryInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::SummaryInfo', + }, + }, + "\x05DocumentSummaryInformation" => { + Name => 'DocumentInfo', + Multi => 1, # flag to process UserDefined information after this + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::DocumentInfo', + }, + }, + "\x01CompObj" => { + Name => 'CompObj', + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::CompObj', + DirStart => 0x1c, # skip stream header + }, + }, + "\x05Image Info" => { + Name => 'ImageInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::ImageInfo', + }, + }, + "\x05Image Contents" => { + Name => 'Image', + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::Image', + }, + }, + "Contents" => { + Name => 'Contents', + Notes => 'found in FLA files; may contain XMP', + SubDirectory => { + TagTable => 'Image::ExifTool::XMP::Main', + ProcessProc => \&ProcessContents, + }, + }, + "ICC Profile 0001" => { + Name => 'ICC_Profile', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + DirStart => 0x1c, # skip stream header + }, + }, + "\x05Extension List" => { + Name => 'Extensions', + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::Extensions', + }, + }, + 'Subimage 0000 Header' => { + Name => 'SubimageHdr', + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::SubimageHdr', + DirStart => 0x1c, # skip stream header + }, + }, +# 'Subimage 0000 Data' + "\x05Data Object" => { # plus instance number (eg. " 000000") + Name => 'DataObject', + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::DataObject', + }, + }, +# "\x05Data Object Store" => { # plus instance number (eg. " 000000") + "\x05Transform" => { # plus instance number (eg. " 000000") + Name => 'Transform', + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::Transform', + }, + }, + "\x05Operation" => { # plus instance number (eg. " 000000") + Name => 'Operation', + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::Operation', + }, + }, + "\x05Global Info" => { + Name => 'GlobalInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::GlobalInfo', + }, + }, + "\x05Screen Nail" => { # plus class ID (eg. "_bd0100609719a180") + Name => 'ScreenNail', + Groups => { 2 => 'Other' }, + # strip off stream header + ValueConv => 'length($val) > 0x1c and $val = substr($val, 0x1c); \$val', + }, + "\x05Audio Info" => { + Name => 'AudioInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::AudioInfo', + }, + }, + 'Audio Stream' => { # plus instance number (eg. " 000000") + Name => 'AudioStream', + Groups => { 2 => 'Audio' }, + # strip off stream header + ValueConv => 'length($val) > 0x1c and $val = substr($val, 0x1c); \$val', + }, + 'Current User' => { #PH + Name => 'CurrentUser', + # not sure what the rest of this data is, but extract ASCII name from it - PH + ValueConv => q{ + return undef if length $val < 12; + my ($size,$pos) = unpack('x4VV', $val); + my $len = $size - $pos - 4; + return undef if $len < 0 or length $val < $size + 8; + return substr($val, 8 + $pos, $len); + }, + }, + 'WordDocument' => { + Name => 'WordDocument', + SubDirectory => { TagTable => 'Image::ExifTool::FlashPix::WordDocument' }, + }, + # save these tables until after the WordDocument was processed + '0Table' => { + Name => 'Table0', + Hidden => 1, # (used only as temporary storage until table is processed) + Binary => 1, + }, + '1Table' => { + Name => 'Table1', + Hidden => 1, # (used only as temporary storage until table is processed) + Binary => 1, + }, + Preview => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Binary => 1, + Notes => 'written by some FujiFilm models', + # skip 47-byte Fuji header + RawConv => q{ + return undef unless length $val > 47; + $val = substr($val, 47); + return $val =~ /^\xff\xd8\xff/ ? $val : undef; + }, + }, + Property => { + Name => 'PreviewInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::PreviewInfo', + ByteOrder => 'BigEndian', + }, + }, + # recognize Autodesk Revit files by looking at BasicFileInfo + # (but don't yet support reading their metatdata) + BasicFileInfo => { + Name => 'BasicFileInfo', + Binary => 1, + RawConv => q{ + $val =~ tr/\0//d; # brute force conversion to ASCII + if ($val =~ /\.(rfa|rft|rte|rvt)/) { + $self->OverrideFileType(uc($1), "application/$1", $1); + } + return $val; + }, + }, + IeImg => { + Name => 'EmbeddedImage', + Notes => 'embedded images in Scene7 vignette VNT files', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, +); + +# Summary Information properties +%Image::ExifTool::FlashPix::SummaryInfo = ( + PROCESS_PROC => \&ProcessProperties, + GROUPS => { 2 => 'Document' }, + NOTES => q{ + The Dictionary, CodePage and LocalIndicator tags are common to all FlashPix + property tables, even though they are only listed in the SummaryInfo table. + }, + 0x00 => { Name => 'Dictionary', Groups => { 2 => 'Other' }, Binary => 1 }, + 0x01 => { + Name => 'CodePage', + Groups => { 2 => 'Other' }, + PrintConv => \%codePage, + }, + 0x02 => 'Title', + 0x03 => 'Subject', + 0x04 => { Name => 'Author', Groups => { 2 => 'Author' } }, + 0x05 => 'Keywords', + 0x06 => 'Comments', + 0x07 => 'Template', + 0x08 => { Name => 'LastModifiedBy', Groups => { 2 => 'Author' } }, + 0x09 => 'RevisionNumber', + 0x0a => { Name => 'TotalEditTime', PrintConv => 'ConvertTimeSpan($val)' }, # (in sec) + 0x0b => { Name => 'LastPrinted', Groups => { 2 => 'Time' } }, + 0x0c => { + Name => 'CreateDate', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x0d => { + Name => 'ModifyDate', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x0e => 'Pages', + 0x0f => 'Words', + 0x10 => 'Characters', + 0x11 => { + Name => 'ThumbnailClip', + # (not a displayable format, so not in the "Preview" group) + Binary => 1, + }, + 0x12 => { + Name => 'Software', + RawConv => '$$self{Software} = $val', # (use to determine file type) + }, + 0x13 => { + Name => 'Security', + # see http://msdn.microsoft.com/en-us/library/aa379255(VS.85).aspx + PrintConv => { + 0 => 'None', + BITMASK => { + 0 => 'Password protected', + 1 => 'Read-only recommended', + 2 => 'Read-only enforced', + 3 => 'Locked for annotations', + }, + }, + }, + 0x22 => { Name => 'CreatedBy', Groups => { 2 => 'Author' } }, #PH (guess) (MAX files) + 0x23 => 'DocumentID', # PH (guess) (MAX files) + # 0x25 ? seen values 1.0-1.97 (MAX files) + 0x80000000 => { Name => 'LocaleIndicator', Groups => { 2 => 'Other' } }, +); + +# Document Summary Information properties (ref 4) +%Image::ExifTool::FlashPix::DocumentInfo = ( + PROCESS_PROC => \&ProcessProperties, + GROUPS => { 2 => 'Document' }, + NOTES => q{ + The DocumentSummaryInformation property set includes a UserDefined property + set for which only the Hyperlinks and HyperlinkBase tags are pre-defined. + However, ExifTool will also extract any other information found in the + UserDefined properties. + }, + 0x02 => 'Category', + 0x03 => 'PresentationTarget', + 0x04 => 'Bytes', + 0x05 => 'Lines', + 0x06 => 'Paragraphs', + 0x07 => 'Slides', + 0x08 => 'Notes', + 0x09 => 'HiddenSlides', + 0x0a => 'MMClips', + 0x0b => { + Name => 'ScaleCrop', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0x0c => 'HeadingPairs', + 0x0d => { + Name => 'TitleOfParts', + # look for "3ds Max" software name at beginning of TitleOfParts + RawConv => q{ + (ref $val eq 'ARRAY' ? $$val[0] : $val) =~ /^(3ds Max)/ and $$self{Software} = $1; + return $val; + } + }, + 0x0e => 'Manager', + 0x0f => 'Company', + 0x10 => { + Name => 'LinksUpToDate', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0x11 => 'CharCountWithSpaces', + # 0x12 ? seen -32.1850395202637,-386.220672607422,-9.8100004196167,-9810,... + 0x13 => { #PH (unconfirmed) + Name => 'SharedDoc', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + # 0x14 ? seen -1 + # 0x15 ? seen 1 + 0x16 => { + Name => 'HyperlinksChanged', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0x17 => { #PH (unconfirmed handling of lower 16 bits, not valid for MAX files) + Name => 'AppVersion', + ValueConv => 'sprintf("%d.%.4d",$val >> 16, $val & 0xffff)', + }, + # 0x18 ? seen -1 + # 0x19 ? seen 0 + # 0x1a ? seen 0 + # 0x1b ? seen 0 + # 0x1c ? seen 0,1 + # 0x1d ? seen 1 + # 0x1e ? seen 1 + # 0x1f ? seen 1,5 + # 0x20 ? seen 0,5 + # 0x21 ? seen -1 + # 0x22 ? seen 0 + '_PID_LINKBASE' => { + Name => 'HyperlinkBase', + ValueConv => '$self->Decode($val, "UCS2","II")', + }, + '_PID_HLINKS' => { + Name => 'Hyperlinks', + RawConv => \&ProcessHyperlinks, + }, +); + +# Image Information properties +%Image::ExifTool::FlashPix::ImageInfo = ( + PROCESS_PROC => \&ProcessProperties, + GROUPS => { 2 => 'Image' }, + 0x21000000 => { + Name => 'FileSource', + PrintConv => { + 1 => 'Film Scanner', + 2 => 'Reflection Print Scanner', + 3 => 'Digital Camera', + 4 => 'Video Capture', + 5 => 'Computer Graphics', + }, + }, + 0x21000001 => { + Name => 'SceneType', + PrintConv => { + 1 => 'Original Scene', + 2 => 'Second Generation Scene', + 3 => 'Digital Scene Generation', + }, + }, + 0x21000002 => 'CreationPathVector', + 0x21000003 => 'SoftwareRelease', + 0x21000004 => 'UserDefinedID', + 0x21000005 => 'SharpnessApproximation', + 0x22000000 => { Name => 'Copyright', Groups => { 2 => 'Author' } }, + 0x22000001 => { Name => 'OriginalImageBroker', Groups => { 2 => 'Author' } }, + 0x22000002 => { Name => 'DigitalImageBroker', Groups => { 2 => 'Author' } }, + 0x22000003 => { Name => 'Authorship', Groups => { 2 => 'Author' } }, + 0x22000004 => { Name => 'IntellectualPropertyNotes', Groups => { 2 => 'Author' } }, + 0x23000000 => { + Name => 'TestTarget', + PrintConv => { + 1 => 'Color Chart', + 2 => 'Gray Card', + 3 => 'Grayscale', + 4 => 'Resolution Chart', + 5 => 'Inch Scale', + 6 => 'Centimeter Scale', + 7 => 'Millimeter Scale', + 8 => 'Micrometer Scale', + }, + }, + 0x23000002 => 'GroupCaption', + 0x23000003 => 'CaptionText', + 0x23000004 => 'People', + 0x23000007 => 'Things', + 0x2300000A => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x2300000B => 'Events', + 0x2300000C => 'Places', + 0x2300000F => 'ContentDescriptionNotes', + 0x24000000 => { Name => 'Make', Groups => { 2 => 'Camera' } }, + 0x24000001 => { + Name => 'Model', + Description => 'Camera Model Name', + Groups => { 2 => 'Camera' }, + }, + 0x24000002 => { Name => 'SerialNumber', Groups => { 2 => 'Camera' } }, + 0x25000000 => { + Name => 'CreateDate', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x25000001 => { + Name => 'ExposureTime', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x25000002 => { + Name => 'FNumber', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x25000003 => { + Name => 'ExposureProgram', + Groups => { 2 => 'Camera' }, + # use PrintConv of corresponding EXIF tag + PrintConv => $Image::ExifTool::Exif::Main{0x8822}->{PrintConv}, + }, + 0x25000004 => 'BrightnessValue', + 0x25000005 => 'ExposureCompensation', + 0x25000006 => { + Name => 'SubjectDistance', + Groups => { 2 => 'Camera' }, + PrintConv => 'sprintf("%.3f m", $val)', + }, + 0x25000007 => { + Name => 'MeteringMode', + Groups => { 2 => 'Camera' }, + PrintConv => $Image::ExifTool::Exif::Main{0x9207}->{PrintConv}, + }, + 0x25000008 => { + Name => 'LightSource', + Groups => { 2 => 'Camera' }, + PrintConv => $Image::ExifTool::Exif::Main{0x9208}->{PrintConv}, + }, + 0x25000009 => { + Name => 'FocalLength', + Groups => { 2 => 'Camera' }, + PrintConv => 'sprintf("%.1f mm",$val)', + }, + 0x2500000A => { + Name => 'MaxApertureValue', + Groups => { 2 => 'Camera' }, + ValueConv => '2 ** ($val / 2)', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x2500000B => { + Name => 'Flash', + Groups => { 2 => 'Camera' }, + PrintConv => { + 1 => 'No Flash', + 2 => 'Flash Fired', + }, + }, + 0x2500000C => { + Name => 'FlashEnergy', + Groups => { 2 => 'Camera' }, + }, + 0x2500000D => { + Name => 'FlashReturn', + Groups => { 2 => 'Camera' }, + PrintConv => { + 1 => 'Subject Outside Flash Range', + 2 => 'Subject Inside Flash Range', + }, + }, + 0x2500000E => { + Name => 'BackLight', + PrintConv => { + 1 => 'Front Lit', + 2 => 'Back Lit 1', + 3 => 'Back Lit 2', + }, + }, + 0x2500000F => { Name => 'SubjectLocation', Groups => { 2 => 'Camera' } }, + 0x25000010 => 'ExposureIndex', + 0x25000011 => { + Name => 'SpecialEffectsOpticalFilter', + PrintConv => { + 1 => 'None', + 2 => 'Colored', + 3 => 'Diffusion', + 4 => 'Multi-image', + 5 => 'Polarizing', + 6 => 'Split-field', + 7 => 'Star', + }, + }, + 0x25000012 => 'PerPictureNotes', + 0x26000000 => { + Name => 'SensingMethod', + Groups => { 2 => 'Camera' }, + PrintConv => $Image::ExifTool::Exif::Main{0x9217}->{PrintConv}, + }, + 0x26000001 => { Name => 'FocalPlaneXResolution', Groups => { 2 => 'Camera' } }, + 0x26000002 => { Name => 'FocalPlaneYResolution', Groups => { 2 => 'Camera' } }, + 0x26000003 => { + Name => 'FocalPlaneResolutionUnit', + Groups => { 2 => 'Camera' }, + PrintConv => $Image::ExifTool::Exif::Main{0xa210}->{PrintConv}, + }, + 0x26000004 => 'SpatialFrequencyResponse', + 0x26000005 => 'CFAPattern', + 0x27000001 => { + Name => 'FilmCategory', + PrintConv => { + 1 => 'Negative B&W', + 2 => 'Negative Color', + 3 => 'Reversal B&W', + 4 => 'Reversal Color', + 5 => 'Chromagenic', + 6 => 'Internegative B&W', + 7 => 'Internegative Color', + }, + }, + 0x26000007 => 'ISO', + 0x26000008 => 'Opto-ElectricConvFactor', + 0x27000000 => 'FilmBrand', + 0x27000001 => 'FilmCategory', + 0x27000002 => 'FilmSize', + 0x27000003 => 'FilmRollNumber', + 0x27000004 => 'FilmFrameNumber', + 0x29000000 => 'OriginalScannedImageSize', + 0x29000001 => 'OriginalDocumentSize', + 0x29000002 => { + Name => 'OriginalMedium', + PrintConv => { + 1 => 'Continuous Tone Image', + 2 => 'Halftone Image', + 3 => 'Line Art', + }, + }, + 0x29000003 => { + Name => 'TypeOfOriginal', + PrintConv => { + 1 => 'B&W Print', + 2 => 'Color Print', + 3 => 'B&W Document', + 4 => 'Color Document', + }, + }, + 0x28000000 => 'ScannerMake', + 0x28000001 => 'ScannerModel', + 0x28000002 => 'ScannerSerialNumber', + 0x28000003 => 'ScanSoftware', + 0x28000004 => { Name => 'ScanSoftwareRevisionDate', Groups => { 2 => 'Time' } }, + 0x28000005 => 'ServiceOrganizationName', + 0x28000006 => 'ScanOperatorID', + 0x28000008 => { + Name => 'ScanDate', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x28000009 => { + Name => 'ModifyDate', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x2800000A => 'ScannerPixelSize', +); + +# Image Contents properties +%Image::ExifTool::FlashPix::Image = ( + PROCESS_PROC => \&ProcessProperties, + GROUPS => { 2 => 'Image' }, + # VARS storage is used as a hash lookup for tagID's which aren't constant. + # The key is a mask for significant bits of the tagID, and the value + # is a lookup for tagID's for which this mask is valid. + VARS => { + # ID's are different for each subimage + 0xff00ffff => { + 0x02000000=>1, 0x02000001=>1, 0x02000002=>1, 0x02000003=>1, + 0x02000004=>1, 0x02000005=>1, 0x02000006=>1, 0x02000007=>1, + 0x03000001=>1, + }, + }, + 0x01000000 => 'NumberOfResolutions', + 0x01000002 => 'ImageWidth', # width of highest resolution image + 0x01000003 => 'ImageHeight', + 0x01000004 => 'DefaultDisplayHeight', + 0x01000005 => 'DefaultDisplayWidth', + 0x01000006 => { + Name => 'DisplayUnits', + PrintConv => { + 0 => 'inches', + 1 => 'meters', + 2 => 'cm', + 3 => 'mm', + }, + }, + 0x02000000 => 'SubimageWidth', + 0x02000001 => 'SubimageHeight', + 0x02000002 => { + Name => 'SubimageColor', + # decode only component count and color space of first component + ValueConv => 'sprintf("%.2x %.4x", unpack("x4vx4v",$val))', + PrintConv => { + '01 0000' => 'Opacity Only', + '01 8000' => 'Opacity Only (uncalibrated)', + '01 0001' => 'Monochrome', + '01 8001' => 'Monochrome (uncalibrated)', + '03 0002' => 'YCbCr', + '03 8002' => 'YCbCr (uncalibrated)', + '03 0003' => 'RGB', + '03 8003' => 'RGB (uncalibrated)', + '04 0002' => 'YCbCr with Opacity', + '04 8002' => 'YCbCr with Opacity (uncalibrated)', + '04 0003' => 'RGB with Opacity', + '04 8003' => 'RGB with Opacity (uncalibrated)', + }, + }, + 0x02000003 => { + Name => 'SubimageNumericalFormat', + PrintConv => { + 17 => '8-bit, Unsigned', + 18 => '16-bit, Unsigned', + 19 => '32-bit, Unsigned', + }, + }, + 0x02000004 => { + Name => 'DecimationMethod', + PrintConv => { + 0 => 'None (Full-sized Image)', + 8 => '8-point Prefilter', + }, + }, + 0x02000005 => 'DecimationPrefilterWidth', + 0x02000007 => 'SubimageICC_Profile', + 0x03000001 => { Name => 'JPEGTables', Binary => 1 }, + 0x03000002 => 'MaxJPEGTableIndex', +); + +# Extension List properties +%Image::ExifTool::FlashPix::Extensions = ( + PROCESS_PROC => \&ProcessProperties, + GROUPS => { 2 => 'Other' }, + VARS => { + # ID's are different for each extension type + 0x0000ffff => { + 0x0001=>1, 0x0002=>1, 0x0003=>1, 0x0004=>1, + 0x0005=>1, 0x0006=>1, 0x0007=>1, 0x1000=>1, + 0x2000=>1, 0x2001=>1, 0x3000=>1, 0x4000=>1, + }, + 0x0000f00f => { 0x3001=>1, 0x3002=>1 }, + }, + 0x10000000 => 'UsedExtensionNumbers', + 0x0001 => 'ExtensionName', + 0x0002 => 'ExtensionClassID', + 0x0003 => { + Name => 'ExtensionPersistence', + PrintConv => { + 0 => 'Always Valid', + 1 => 'Invalidated By Modification', + 2 => 'Potentially Invalidated By Modification', + }, + }, + 0x0004 => { Name => 'ExtensionCreateDate', Groups => { 2 => 'Time' } }, + 0x0005 => { Name => 'ExtensionModifyDate', Groups => { 2 => 'Time' } }, + 0x0006 => 'CreatingApplication', + 0x0007 => 'ExtensionDescription', + 0x1000 => 'Storage-StreamPathname', + 0x2000 => 'FlashPixStreamPathname', + 0x2001 => 'FlashPixStreamFieldOffset', + 0x3000 => 'PropertySetPathname', + 0x3001 => 'PropertySetIDCodes', + 0x3002 => 'PropertyVectorElements', + 0x4000 => 'SubimageResolutions', +); + +# Subimage Header tags +%Image::ExifTool::FlashPix::SubimageHdr = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int32u', +# 0 => 'HeaderLength', + 1 => 'SubimageWidth', + 2 => 'SubimageHeight', + 3 => 'SubimageTileCount', + 4 => 'SubimageTileWidth', + 5 => 'SubimageTileHeight', + 6 => 'NumChannels', +# 7 => 'TileHeaderOffset', +# 8 => 'TileHeaderLength', + # ... followed by tile header table +); + +# Data Object properties +%Image::ExifTool::FlashPix::DataObject = ( + PROCESS_PROC => \&ProcessProperties, + GROUPS => { 2 => 'Other' }, + 0x00010000 => 'DataObjectID', + 0x00010002 => 'LockedPropertyList', + 0x00010003 => 'DataObjectTitle', + 0x00010004 => 'LastModifier', + 0x00010005 => 'RevisionNumber', + 0x00010006 => { Name => 'DataCreateDate', Groups => { 2 => 'Time' } }, + 0x00010007 => { Name => 'DataModifyDate', Groups => { 2 => 'Time' } }, + 0x00010008 => 'CreatingApplication', + 0x00010100 => { + Name => 'DataObjectStatus', + PrintConv => q{ + ($val & 0x0000ffff ? 'Exists' : 'Does Not Exist') . + ', ' . ($val & 0xffff0000 ? 'Not ' : '') . 'Purgeable' + }, + }, + 0x00010101 => { + Name => 'CreatingTransform', + PrintConv => '$val ? $val : "Source Image"', + }, + 0x00010102 => 'UsingTransforms', + 0x10000000 => 'CachedImageHeight', + 0x10000001 => 'CachedImageWidth', +); + +# Transform properties +%Image::ExifTool::FlashPix::Transform = ( + PROCESS_PROC => \&ProcessProperties, + GROUPS => { 2 => 'Other' }, + 0x00010000 => 'TransformNodeID', + 0x00010001 => 'OperationClassID', + 0x00010002 => 'LockedPropertyList', + 0x00010003 => 'TransformTitle', + 0x00010004 => 'LastModifier', + 0x00010005 => 'RevisionNumber', + 0x00010006 => { Name => 'TransformCreateDate', Groups => { 2 => 'Time' } }, + 0x00010007 => { Name => 'TransformModifyDate', Groups => { 2 => 'Time' } }, + 0x00010008 => 'CreatingApplication', + 0x00010100 => 'InputDataObjectList', + 0x00010101 => 'OutputDataObjectList', + 0x00010102 => 'OperationNumber', + 0x10000000 => 'ResultAspectRatio', + 0x10000001 => 'RectangleOfInterest', + 0x10000002 => 'Filtering', + 0x10000003 => 'SpatialOrientation', + 0x10000004 => 'ColorTwistMatrix', + 0x10000005 => 'ContrastAdjustment', +); + +# Operation properties +%Image::ExifTool::FlashPix::Operation = ( + PROCESS_PROC => \&ProcessProperties, + 0x00010000 => 'OperationID', +); + +# Global Info properties +%Image::ExifTool::FlashPix::GlobalInfo = ( + PROCESS_PROC => \&ProcessProperties, + 0x00010002 => 'LockedPropertyList', + 0x00010003 => 'TransformedImageTitle', + 0x00010004 => 'LastModifier', + 0x00010100 => 'VisibleOutputs', + 0x00010101 => 'MaximumImageIndex', + 0x00010102 => 'MaximumTransformIndex', + 0x00010103 => 'MaximumOperationIndex', +); + +# Audio Info properties +%Image::ExifTool::FlashPix::AudioInfo = ( + PROCESS_PROC => \&ProcessProperties, + GROUPS => { 2 => 'Audio' }, +); + +# MacroMedia flash contents +%Image::ExifTool::FlashPix::Contents = ( + PROCESS_PROC => \&ProcessProperties, + GROUPS => { 2 => 'Image' }, +); + +# CompObj tags +%Image::ExifTool::FlashPix::CompObj = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + FORMAT => 'int32u', + 0 => { Name => 'CompObjUserTypeLen' }, + 1 => { + Name => 'CompObjUserType', + Format => 'string[$val{0}]', + RawConv => '$$self{CompObjUserType} = $val', # (use to determine file type) + }, +); + +# decode Word document FIB header (ref [MS-DOC].pdf) +%Image::ExifTool::FlashPix::WordDocument = ( + PROCESS_PROC => \&ProcessWordDocument, + GROUPS => { 2 => 'Other' }, + FORMAT => 'int16u', + NOTES => 'Tags extracted from the Microsoft Word document stream.', + 0 => { + Name => 'Identification', + PrintHex => 1, + PrintConv => { + 0x6a62 => 'MS Word 97', + 0x626a => 'Word 98 Mac', + 0xa5dc => 'Word 6.0/7.0', + 0xa5ec => 'Word 8.0', + }, + }, + 3 => { + Name => 'LanguageCode', + PrintHex => 1, + PrintConv => { + 0x0400 => 'None', + 0x0401 => 'Arabic', + 0x0402 => 'Bulgarian', + 0x0403 => 'Catalan', + 0x0404 => 'Traditional Chinese', + 0x0804 => 'Simplified Chinese', + 0x0405 => 'Czech', + 0x0406 => 'Danish', + 0x0407 => 'German', + 0x0807 => 'German (Swiss)', + 0x0408 => 'Greek', + 0x0409 => 'English (US)', + 0x0809 => 'English (British)', + 0x0c09 => 'English (Australian)', + 0x040a => 'Spanish (Castilian)', + 0x080a => 'Spanish (Mexican)', + 0x040b => 'Finnish', + 0x040c => 'French', + 0x080c => 'French (Belgian)', + 0x0c0c => 'French (Canadian)', + 0x100c => 'French (Swiss)', + 0x040d => 'Hebrew', + 0x040e => 'Hungarian', + 0x040f => 'Icelandic', + 0x0410 => 'Italian', + 0x0810 => 'Italian (Swiss)', + 0x0411 => 'Japanese', + 0x0412 => 'Korean', + 0x0413 => 'Dutch', + 0x0813 => 'Dutch (Belgian)', + 0x0414 => 'Norwegian (Bokmal)', + 0x0814 => 'Norwegian (Nynorsk)', + 0x0415 => 'Polish', + 0x0416 => 'Portuguese (Brazilian)', + 0x0816 => 'Portuguese', + 0x0417 => 'Rhaeto-Romanic', + 0x0418 => 'Romanian', + 0x0419 => 'Russian', + 0x041a => 'Croato-Serbian (Latin)', + 0x081a => 'Serbo-Croatian (Cyrillic)', + 0x041b => 'Slovak', + 0x041c => 'Albanian', + 0x041d => 'Swedish', + 0x041e => 'Thai', + 0x041f => 'Turkish', + 0x0420 => 'Urdu', + 0x0421 => 'Bahasa', + 0x0422 => 'Ukrainian', + 0x0423 => 'Byelorussian', + 0x0424 => 'Slovenian', + 0x0425 => 'Estonian', + 0x0426 => 'Latvian', + 0x0427 => 'Lithuanian', + 0x0429 => 'Farsi', + 0x042d => 'Basque', + 0x042f => 'Macedonian', + 0x0436 => 'Afrikaans', + 0x043e => 'Malaysian', + }, + }, + 5 => { + Name => 'DocFlags', + Mask => 0xff0f, # ignore save count + RawConv => '$$self{DocFlags} = $val', + PrintConv => { BITMASK => { + 0 => 'Template', + 1 => 'AutoText only', + 2 => 'Complex', + 3 => 'Has picture', + # 4-7 = number of incremental saves + 8 => 'Encrypted', + 9 => '1Table', + 10 => 'Read only', + 11 => 'Passworded', + 12 => 'ExtChar', + 13 => 'Load override', + 14 => 'Far east', + 15 => 'Obfuscated', + }}, + }, + 9.1 => { + Name => 'System', + Mask => 0x0001, + PrintConv => { + 0x0000 => 'Windows', + 0x0001 => 'Macintosh', + }, + }, + 9.2 => { + Name => 'Word97', + Mask => 0x0010, + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, +); + +# tags decoded from Word document table +%Image::ExifTool::FlashPix::DocTable = ( + GROUPS => { 1 => 'MS-DOC', 2 => 'Document' }, + NOTES => 'Tags extracted from the Microsoft Word document table.', + VARS => { NO_ID => 1 }, + CommentBy => { + Groups => { 2 => 'Author' }, + Notes => 'enable L<Duplicates|../ExifTool.html#Duplicates> option to extract all entries', + }, + LastSavedBy => { + Groups => { 2 => 'Author' }, + Notes => 'enable L<Duplicates|../ExifTool.html#Duplicates> option to extract history of up to 10 entries', + }, + DOP => { SubDirectory => { TagTable => 'Image::ExifTool::FlashPix::DOP' } }, + ModifyDate => { + Groups => { 2 => 'Time' }, + Format => 'int64u', + Priority => 0, + RawConv => q{ + $val = $val * 1e-7 - 11644473600; # convert to seconds since 1970 + return $val > 0 ? $val : undef; + }, + ValueConv => 'ConvertUnixTime($val)', + PrintConv => '$self->ConvertDateTime($val)', + }, +# +# tags below are used internally in intermediate steps to extract the tags above +# + TableOffsets => { Hidden => 1 }, # stores offsets to extract data from document table + CommentByBlock => { # entire block of CommentBy entries + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::DocTable', + ProcessProc => \&ProcessCommentBy, + }, + Hidden => 1, + }, + LastSavedByBlock => { # entire block of LastSavedBy entries + SubDirectory => { + TagTable => 'Image::ExifTool::FlashPix::DocTable', + ProcessProc => \&ProcessLastSavedBy, + }, + Hidden => 1, + }, +); + +# Microsoft Office Document Properties (ref [MS-DOC].pdf) +%Image::ExifTool::FlashPix::DOP = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 1 => 'MS-DOC', 2 => 'Document' }, + NOTES => 'Microsoft office document properties.', + 20 => { + Name => 'CreateDate', + Format => 'int32u', + Groups => { 2 => 'Time' }, + Priority => 0, + RawConv => \&ConvertDTTM, + PrintConv => '$self->ConvertDateTime($val)', + }, + 24 => { + Name => 'ModifyDate', + Format => 'int32u', + Groups => { 2 => 'Time' }, + Priority => 0, + RawConv => \&ConvertDTTM, + PrintConv => '$self->ConvertDateTime($val)', + }, + 28 => { + Name => 'LastPrinted', + Format => 'int32u', + Groups => { 2 => 'Time' }, + RawConv => \&ConvertDTTM, + PrintConv => '$self->ConvertDateTime($val)', + }, + 32 => { Name => 'RevisionNumber', Format => 'int16u' }, + 34 => { + Name => 'TotalEditTime', + Format => 'int32u', + PrintConv => 'ConvertTimeSpan($val,60)', + }, + # (according to the MS-DOC specification, the following are accurate only if + # flag 'X' is set, and flag 'u' specifies whether the main or subdoc tags are + # used, but in my tests it seems that both are filled in with reasonable values, + # so just extract the main counts and ignore the subdoc counts for now - PH) + 38 => { Name => 'Words', Format => 'int32u' }, + 42 => { Name => 'Characters', Format => 'int32u' }, + 46 => { Name => 'Pages', Format => 'int16u' }, + 48 => { Name => 'Paragraphs', Format => 'int32u' }, + 56 => { Name => 'Lines', Format => 'int32u' }, + #60 => { Name => 'WordsWithSubdocs', Format => 'int32u' }, + #64 => { Name => 'CharactersWithSubdocs', Format => 'int32u' }, + #68 => { Name => 'PagesWithSubdocs', Format => 'int16u' }, + #70 => { Name => 'ParagraphsWithSubdocs', Format => 'int32u' }, + #74 => { Name => 'LinesWithSubdocs', Format => 'int32u' }, +); + +# FujiFilm "Property" information (ref PH) +%Image::ExifTool::FlashPix::PreviewInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + NOTES => 'Preview information written by some FujiFilm models.', + FIRST_ENTRY => 0, + # values are all constant for for my samples except the two decoded tags + # 0x0000: 01 01 00 00 02 01 00 00 00 00 00 00 00 xx xx 01 + # 0x0010: 01 00 00 00 00 00 00 xx xx 00 00 00 00 00 00 00 + # 0x0020: 00 00 00 00 00 + 0x0d => { + Name => 'PreviewImageWidth', + Format => 'int16u', + }, + 0x17 => { + Name => 'PreviewImageHeight', + Format => 'int16u', + }, +); + +# composite FlashPix tags +%Image::ExifTool::FlashPix::Composite = ( + GROUPS => { 2 => 'Image' }, + PreviewImage => { + Groups => { 2 => 'Preview' }, + # extract JPEG preview from ScreenNail if possible + Require => { + 0 => 'ScreenNail', + }, + Binary => 1, + RawConv => q{ + return undef unless $val[0] =~ /\xff\xd8\xff/g; + @grps = $self->GetGroup($$val{0}); # set groups from ScreenNail + return substr($val[0], pos($val[0])-3); + }, + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::FlashPix'); + +#------------------------------------------------------------------------------ +# Convert Microsoft DTTM structure to date/time +# Inputs: 0) DTTM value +# Returns: EXIF-format date/time string ("0000:00:00 00:00:00" for zero date/time) +sub ConvertDTTM($) +{ + my $val = shift; + my $yr = ($val >> 20) & 0x1ff; + my $mon = ($val >> 16) & 0x0f; + my $day = ($val >> 11) & 0x1f; + my $hr = ($val >> 6) & 0x1f; + my $min = ($val & 0x3f); + $yr += 1900 if $val; + return sprintf("%.4d:%.2d:%.2d %.2d:%.2d:00%s",$yr,$mon,$day,$hr,$min,$val ? 'Z' : ''); +} + +#------------------------------------------------------------------------------ +# Process hyperlinks from PID_HYPERLINKS array +# (ref http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dnaro97ta/html/msdn_hyper97.asp) +# Inputs: 0) value, 1) ExifTool ref +# Returns: list of hyperlinks +sub ProcessHyperlinks($$) +{ + my ($val, $et) = @_; + + # process as an array of VT_VARIANT's + my $dirEnd = length $val; + return undef if $dirEnd < 4; + my $num = Get32u(\$val, 0); + my $valPos = 4; + my ($i, @vals); + for ($i=0; $i<$num; ++$i) { + # read VT_BLOB entries as an array of VT_VARIANT's + my $value = ReadFPXValue($et, \$val, $valPos, VT_VARIANT, $dirEnd); + last unless defined $value; + push @vals, $value; + } + # filter values to extract only the links + my @links; + for ($i=0; $i<@vals; $i+=6) { + push @links, $vals[$i+4]; # get address + $links[-1] .= '#' . $vals[$i+5] if length $vals[$i+5]; # add subaddress + } + return \@links; +} + +#------------------------------------------------------------------------------ +# Read FlashPix value +# Inputs: 0) ExifTool ref, 1) data ref, 2) value offset, 3) FPX format number, +# 4) end offset, 5) flag for no padding, 6) code page +# Returns: converted value (or list of values in list context) and updates +# value offset to end of value if successful, or returns undef on error +sub ReadFPXValue($$$$$;$$) +{ + my ($et, $dataPt, $valPos, $type, $dirEnd, $noPad, $codePage) = @_; + my @vals; + + my $format = $oleFormat{$type & 0x0fff}; + while ($format) { + my $count = 1; + # handle VT_VECTOR types + my $flags = $type & 0xf000; + if ($flags) { + if ($flags == VT_VECTOR) { + $noPad = 1; # values sometimes aren't padded inside vectors!! + my $size = $oleFormatSize{VT_VECTOR}; + if ($valPos + $size > $dirEnd) { + $et->WarnOnce('Incorrect FPX VT_VECTOR size'); + last; + } + $count = Get32u($dataPt, $valPos); + push @vals, '' if $count == 0; # allow zero-element vector + $valPos += 4; + } else { + # can't yet handle this property flag + $et->WarnOnce('Unknown FPX property'); + last; + } + } + unless ($format =~ /^VT_/) { + my $size = Image::ExifTool::FormatSize($format) * $count; + if ($valPos + $size > $dirEnd) { + $et->WarnOnce("Incorrect FPX $format size"); + last; + } + @vals = ReadValue($dataPt, $valPos, $format, $count, $size); + # update position to end of value plus padding + $valPos += ($count * $size + 3) & 0xfffffffc; + last; + } + my $size = $oleFormatSize{$format}; + my ($item, $val, $len); + for ($item=0; $item<$count; ++$item) { + if ($valPos + $size > $dirEnd) { + $et->WarnOnce("Truncated FPX $format value"); + last; + } + # sometimes VT_VECTOR items are padded to even 4-byte boundaries, and sometimes they aren't + if ($noPad and defined $len and $len & 0x03) { + my $pad = 4 - ($len & 0x03); + if ($valPos + $pad + $size <= $dirEnd) { + # skip padding if all zeros + $valPos += $pad if substr($$dataPt, $valPos, $pad) eq "\0" x $pad; + } + } + undef $len; + if ($format eq 'VT_VARIANT') { + my $subType = Get32u($dataPt, $valPos); + $valPos += $size; + $val = ReadFPXValue($et, $dataPt, $valPos, $subType, $dirEnd, $noPad, $codePage); + last unless defined $val; + push @vals, $val; + next; # avoid adding $size to $valPos again + } elsif ($format eq 'VT_FILETIME') { + # convert from time in 100 ns increments to time in seconds + $val = 1e-7 * Image::ExifTool::Get64u($dataPt, $valPos); + # print as date/time if value is greater than one year (PH hack) + my $secDay = 24 * 3600; + if ($val > 365 * $secDay) { + # shift from Jan 1, 1601 to Jan 1, 1970 + my $unixTimeZero = 134774 * $secDay; + $val -= $unixTimeZero; + # there are a lot of bad programmers out there... + my $sec100yr = 100 * 365 * $secDay; + if ($val < 0 || $val > $sec100yr) { + # some software writes the wrong byte order (but the proper word order) + my @w = unpack("x${valPos}NN", $$dataPt); + my $v2 = ($w[0] + $w[1] * 4294967296) * 1e-7 - $unixTimeZero; + if ($v2 > 0 && $v2 < $sec100yr) { + $val = $v2; + # also check for wrong time base + } elsif ($val < 0 && $val + $unixTimeZero > 0) { + $val += $unixTimeZero; + } + } + $val = Image::ExifTool::ConvertUnixTime($val); + } + } elsif ($format eq 'VT_DATE') { + $val = Image::ExifTool::GetDouble($dataPt, $valPos); + # shift zero from Dec 30, 1899 to Jan 1, 1970 and convert to secs + $val = ($val - 25569) * 24 * 3600 if $val != 0; + $val = Image::ExifTool::ConvertUnixTime($val); + } elsif ($format =~ /STR$/) { + $len = Get32u($dataPt, $valPos); + $len *= 2 if $format eq 'VT_LPWSTR'; # convert to byte count + if ($valPos + $len + 4 > $dirEnd) { + $et->WarnOnce("Truncated $format value"); + last; + } + $val = substr($$dataPt, $valPos + 4, $len); + if ($format eq 'VT_LPWSTR') { + # convert wide string from Unicode + $val = $et->Decode($val, 'UCS2'); + } elsif ($codePage) { + my $charset = $Image::ExifTool::charsetName{"cp$codePage"}; + if ($charset) { + $val = $et->Decode($val, $charset); + } elsif ($codePage == 1200) { # UTF-16, little endian + $val = $et->Decode($val, 'UCS2', 'II'); + } + } + $val =~ s/\0.*//s; # truncate at null terminator + # update position for string length + # (the spec states that strings should be padded to align + # on even 32-bit boundaries, but this isn't always the case) + $valPos += $noPad ? $len : ($len + 3) & 0xfffffffc; + } elsif ($format eq 'VT_BLOB' or $format eq 'VT_CF') { + my $len = Get32u($dataPt, $valPos); # (use local $len because we always expect padding) + if ($valPos + $len + 4 > $dirEnd) { + $et->WarnOnce("Truncated $format value"); + last; + } + $val = substr($$dataPt, $valPos + 4, $len); + # update position for data length plus padding + # (does this padding disappear in arrays too?) + $valPos += ($len + 3) & 0xfffffffc; + } elsif ($format eq 'VT_CLSID') { + $val = Image::ExifTool::ASF::GetGUID(substr($$dataPt, $valPos, $size)); + } + $valPos += $size; # update value pointer to end of value + push @vals, $val; + } + # join VT_ values with commas unless we want an array + @vals = ( join $et->Options('ListSep'), @vals ) if @vals > 1 and not wantarray; + last; # didn't really want to loop + } + $_[2] = $valPos; # return updated value position + + if (wantarray) { + return @vals; + } elsif (@vals > 1) { + return join(' ', @vals); + } else { + return $vals[0]; + } +} + +#------------------------------------------------------------------------------ +# Scan for XMP in FLA Contents (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +# Notes: FLA format is proprietary and I couldn't find any documentation, +# so this routine is entirely based on observations from sample files +sub ProcessContents($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $isFLA; + + # all of my FLA samples contain "Contents" data, and no other FPX-like samples have + # this, but check the data for a familiar pattern to be sure this is FLA: the + # Contents of all of my FLA samples start with two bytes (0x29,0x38,0x3f,0x43 or 0x47, + # then 0x01) followed by a number of zero bytes (from 0x18 to 0x26 of them, related + # somehow to the value of the first byte), followed by the string "DocumentPage" + $isFLA = 1 if $$dataPt =~ /^..\0+\xff\xff\x01\0\x0d\0CDocumentPage/s; + + # do a brute-force scan of the "Contents" for UTF-16 XMP + # (this may always be little-endian, but allow for either endianness) + if ($$dataPt =~ /<\0\?\0x\0p\0a\0c\0k\0e\0t\0 \0b\0e\0g\0i\0n\0=\0['"](\0\xff\xfe|\xfe\xff)/g) { + $$dirInfo{DirStart} = pos($$dataPt) - 36; + if ($$dataPt =~ /<\0\?\0x\0p\0a\0c\0k\0e\0t\0 \0e\0n\0d\0=\0['"]\0[wr]\0['"]\0\?\0>\0?/g) { + $$dirInfo{DirLen} = pos($$dataPt) - $$dirInfo{DirStart}; + Image::ExifTool::XMP::ProcessXMP($et, $dirInfo, $tagTablePtr); + # override format if not already FLA but XMP-dc:Format indicates it is + $isFLA = 1 if $$et{FILE_TYPE} ne 'FLA' and $$et{VALUE}{Format} and + $$et{VALUE}{Format} eq 'application/vnd.adobe.fla'; + } + } + $et->OverrideFileType('FLA') if $isFLA; + return 1; +} + +#------------------------------------------------------------------------------ +# Process WordDocument stream of MSWord doc file (ref 6) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessWordDocument($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt} or return 0; + my $dirLen = length $$dataPt; + # validate the FIB signature + unless ($dirLen > 2 and Get16u($dataPt,0) == 0xa5ec) { + $et->WarnOnce('Invalid FIB signature', 1); + return 0; + } + $et->ProcessBinaryData($dirInfo, $tagTablePtr); # process FIB + # continue parsing the WordDocument stream until we find the FibRgFcLcb + my $pos = 32; + return 0 if $pos + 2 > $dirLen; + my $n = Get16u($dataPt, $pos); # read csw + $pos += 2 + $n * 2; # skip fibRgW + return 0 if $pos + 2 > $dirLen; + $n = Get16u($dataPt, $pos); # read cslw + $pos += 2 + $n * 4; # skip fibRgLw + return 0 if $pos + 2 > $dirLen; + $n = Get16u($dataPt, $pos); # read cbRgFcLcb + $pos += 2; # point to start of fibRgFcLcbBlob + return 0 if $pos + $n * 8 > $dirLen; + my ($off, @tableOffsets); + # save necessary entries for later processing of document table + # (DOP, CommentBy, LastSavedBy) + foreach $off (0xf8, 0x120, 0x238) { + last if $off + 8 > $n * 8; + push @tableOffsets, Get32u($dataPt, $pos + $off); + push @tableOffsets, Get32u($dataPt, $pos + $off + 4); + } + my $tbl = GetTagTable('Image::ExifTool::FlashPix::DocTable'); + # extract ModifyDate if it exists + $et->HandleTag($tbl, 'ModifyDate', undef, + DataPt => $dataPt, + Start => $pos + 0x2b8, + Size => 8, + ); + $et->HandleTag($tbl, TableOffsets => \@tableOffsets); # save for later + # $pos += $n * 8; # skip fibRgFcLcbBlob + # return 0 if $pos + 2 > $dirLen; + # $n = Get16u($dataPt, $pos); # read cswNew + # return 0 if $pos + 2 + $n * 2 > $dirLen; + # my $nFib = Get16u($dataPt, 2 + ($n ? $pos : 0)); + # $pos += 2 + $n * 2; # skip fibRgCswNew + return 1; +} + +#------------------------------------------------------------------------------ +# Process Microsoft Word Document Table +# Inputs: 0) ExifTool object ref +sub ProcessDocumentTable($) +{ + my $et = shift; + my $value = $$et{VALUE}; + my $extra = $$et{TAG_EXTRA}; + my ($i, $j, $tag); + # loop through TableOffsets for each sub-document + for ($i=0; ; ++$i) { + my $key = 'TableOffsets' . ($i ? " ($i)" : ''); + my $offsets = $$value{$key}; + last unless defined $offsets; + my $doc; + $doc = $$extra{$key}{G3} if $$extra{$key}; + $doc = '' unless $doc; + # get DocFlags for this sub-document + my ($docFlags, $docTable); + for ($j=0; ; ++$j) { + my $key = 'DocFlags' . ($j ? " ($j)" : ''); + last unless defined $$value{$key}; + my $tmp; + $tmp = $$extra{$key}{G3} if $$extra{$key}; + $tmp = '' unless $tmp; + if ($tmp eq $doc) { + $docFlags = $$value{$key}; + last; + } + } + next unless defined $docFlags; + $tag = $docFlags & 0x200 ? 'Table1' : 'Table0'; + # get table for this sub-document + for ($j=0; ; ++$j) { + my $key = $tag . ($j ? " ($j)" : ''); + last unless defined $$value{$key}; + my $tmp; + $tmp = $$extra{$key}{G3} if $$extra{$key}; + $tmp = '' unless $tmp; + if ($tmp eq $doc) { + $docTable = \$$value{$key}; + last; + } + } + next unless defined $docTable; + # extract DOP and LastSavedBy information from document table + $$et{DOC_NUM} = $doc; # use same document number + my $tagTablePtr = GetTagTable('Image::ExifTool::FlashPix::DocTable'); + foreach $tag (qw(DOP CommentByBlock LastSavedByBlock)) { + last unless @$offsets; + my $off = shift @$offsets; + my $len = shift @$offsets; + next unless $len and $off + $len <= length $$docTable; + $et->HandleTag($tagTablePtr, $tag, undef, + DataPt => $docTable, + Start => $off, + Size => $len, + ); + } + delete $$et{DOC_NUM}; + } + # delete intermediate tags + foreach $tag (qw(TableOffsets Table0 Table1)) { + for ($i=0; ; ++$i) { + my $key = $tag . ($i ? " ($i)" : ''); + last unless defined $$value{$key}; + $et->DeleteTag($key); + } + } +} + +#------------------------------------------------------------------------------ +# Extract names of comment authors (ref 6) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessCommentBy($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $end = $$dirInfo{DirLen} + $pos; + $et->VerboseDir($$dirInfo{DirName}); + while ($pos + 2 < $end) { + my $len = Get16u($dataPt, $pos); + $pos += 2; + last if $pos + $len * 2 > $end; + my $author = $et->Decode(substr($$dataPt, $pos, $len*2), 'UCS2'); + $pos += $len * 2; + $et->HandleTag($tagTablePtr, CommentBy => $author); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Extract last-saved-by names (ref 5) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessLastSavedBy($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $end = $$dirInfo{DirLen} + $pos; + return 0 if $pos + 6 > $end; + $et->VerboseDir($$dirInfo{DirName}); + my $num = Get16u($dataPt, $pos+2); + $pos += 6; + while ($num >= 2) { + last if $pos + 2 > $end; + my $len = Get16u($dataPt, $pos); + $pos += 2; + last if $pos + $len * 2 > $end; + my $author = $et->Decode(substr($$dataPt, $pos, $len*2), 'UCS2'); + $pos += $len * 2; + last if $pos + 2 > $end; + $len = Get16u($dataPt, $pos); + $pos += 2; + last if $pos + $len * 2 > $end; + my $path = $et->Decode(substr($$dataPt, $pos, $len*2), 'UCS2'); + $pos += $len * 2; + $et->HandleTag($tagTablePtr, LastSavedBy => "$author ($path)"); + $num -= 2; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Check FPX byte order mark (BOM) and set byte order appropriately +# Inputs: 0) data ref, 1) offset to BOM +# Returns: true on success +sub CheckBOM($$) +{ + my ($dataPt, $pos) = @_; + my $bom = Get16u($dataPt, $pos); + return 1 if $bom == 0xfffe; + return 0 unless $bom == 0xfeff; + ToggleByteOrder(); + return 1; +} + +#------------------------------------------------------------------------------ +# Process FlashPix properties +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessProperties($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $pos; + my $dirEnd = $pos + $dirLen; + my $verbose = $et->Options('Verbose'); + my $n; + + if ($dirLen < 48) { + $et->Warn('Truncated FPX properties'); + return 0; + } + # check and set our byte order if necessary + unless (CheckBOM($dataPt, $pos)) { + $et->Warn('Bad FPX property byte order mark'); + return 0; + } + # get position of start of section + $pos = Get32u($dataPt, $pos + 44); + if ($pos < 48) { + $et->Warn('Bad FPX property section offset'); + return 0; + } + for ($n=0; $n<2; ++$n) { + my %dictionary; # dictionary to translate user-defined properties + my $codePage; + last if $pos + 8 > $dirEnd; + # read property section header + my $size = Get32u($dataPt, $pos); + last unless $size; + my $numEntries = Get32u($dataPt, $pos + 4); + $verbose and $et->VerboseDir('Property Info', $numEntries, $size); + if ($pos + 8 + 8 * $numEntries > $dirEnd) { + $et->Warn('Truncated property list'); + last; + } + my $index; + for ($index=0; $index<$numEntries; ++$index) { + my $entry = $pos + 8 + 8 * $index; + my $tag = Get32u($dataPt, $entry); + my $offset = Get32u($dataPt, $entry + 4); + my $valStart = $pos + 4 + $offset; + last if $valStart >= $dirEnd; + my $valPos = $valStart; + my $type = Get32u($dataPt, $pos + $offset); + if ($tag == 0) { + # read dictionary to get tag name lookup for this property set + my $i; + for ($i=0; $i<$type; ++$i) { + last if $valPos + 8 > $dirEnd; + $tag = Get32u($dataPt, $valPos); + my $len = Get32u($dataPt, $valPos + 4); + $valPos += 8 + $len; + last if $valPos > $dirEnd; + my $name = substr($$dataPt, $valPos - $len, $len); + $name =~ s/\0.*//s; + next unless length $name; + $dictionary{$tag} = $name; + next if $$tagTablePtr{$name}; + $tag = $name; + $name =~ s/(^| )([a-z])/\U$2/g; # start with uppercase + $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters + next unless length $name; + $et->VPrint(0, "$$et{INDENT}\[adding $name]\n") if $verbose; + AddTagToTable($tagTablePtr, $tag, { Name => $name }); + } + next; + } + # use tag name from dictionary if available + my ($custom, $val); + if (defined $dictionary{$tag}) { + $tag = $dictionary{$tag}; + $custom = 1; + } + my @vals = ReadFPXValue($et, $dataPt, $valPos, $type, $dirEnd, undef, $codePage); + @vals or $et->Warn('Error reading property value'); + $val = @vals > 1 ? \@vals : $vals[0]; + my $format = $type & 0x0fff; + my $flags = $type & 0xf000; + my $formStr = $oleFormat{$format} || "Type $format"; + $formStr .= '|' . ($oleFlags{$flags} || sprintf("0x%x",$flags)) if $flags; + my $tagInfo; + # check for common tag ID's: Dictionary, CodePage and LocaleIndicator + # (must be done before masking because masked tags may overlap these ID's) + if (not $custom and ($tag == 1 or $tag == 0x80000000)) { + # get tagInfo from SummaryInfo table + my $summaryTable = GetTagTable('Image::ExifTool::FlashPix::SummaryInfo'); + $tagInfo = $et->GetTagInfo($summaryTable, $tag); + if ($tag == 1) { + $val += 0x10000 if $val < 0; # (may be incorrectly stored as int16s) + $codePage = $val; # save code page for translating values + } + } elsif ($$tagTablePtr{$tag}) { + $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + } elsif ($$tagTablePtr{VARS} and not $custom) { + # mask off insignificant bits of tag ID if necessary + my $masked = $$tagTablePtr{VARS}; + my $mask; + foreach $mask (keys %$masked) { + if ($masked->{$mask}->{$tag & $mask}) { + $tagInfo = $et->GetTagInfo($tagTablePtr, $tag & $mask); + last; + } + } + } + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + Start => $valStart, + Size => $valPos - $valStart, + Format => $formStr, + Index => $index, + TagInfo => $tagInfo, + Extra => ", type=$type", + ); + } + # issue warning if we hit end of property section prematurely + $et->Warn('Truncated property data') if $index < $numEntries; + last unless $$dirInfo{Multi}; + $pos += $size; + } + + return 1; +} + +#------------------------------------------------------------------------------ +# Load chain of sectors from file +# Inputs: 0) RAF ref, 1) first sector number, 2) FAT ref, 3) sector size, 4) header size +sub LoadChain($$$$$) +{ + my ($raf, $sect, $fatPt, $sectSize, $hdrSize) = @_; + return undef unless $raf; + my $chain = ''; + my ($buff, %loadedSect); + for (;;) { + last if $sect >= END_OF_CHAIN; + return undef if $loadedSect{$sect}; # avoid infinite loop + $loadedSect{$sect} = 1; + my $offset = $sect * $sectSize + $hdrSize; + return undef unless ($offset <= 0x7fffffff or $$raf{LargeFileSupport}) and + $raf->Seek($offset, 0) and + $raf->Read($buff, $sectSize) == $sectSize; + $chain .= $buff; + # step to next sector in chain + return undef if $sect * 4 > length($$fatPt) - 4; + $sect = Get32u($fatPt, $sect * 4); + } + return $chain; +} + +#------------------------------------------------------------------------------ +# Extract information from a JPEG APP2 FPXR segment +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessFPXR($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart}; + my $dirLen = $$dirInfo{DirLen}; + my $verbose = $et->Options('Verbose'); + + if ($dirLen < 13) { + $et->Warn('FPXR segment too small'); + return 0; + } + + # get version and segment type (version is 0 in all my samples) + my ($vers, $type) = unpack('x5C2', $$dataPt); + + if ($type == 1) { # a "Contents List" segment + + $vers != 0 and $et->Warn("Untested FPXR version $vers"); + if ($$et{FPXR}) { + $et->Warn('Multiple FPXR contents lists'); + delete $$et{FPXR}; + } + my $numEntries = unpack('x7n', $$dataPt); + my @contents; + $verbose and $et->VerboseDir('Contents List', $numEntries); + my $pos = 9; + my $entry; + for ($entry = 0; $entry < $numEntries; ++$entry) { + if ($pos + 4 > $dirLen) { + $et->Warn('Truncated FPXR contents'); + return 0; + } + my ($size, $default) = unpack("x${pos}Na", $$dataPt); + pos($$dataPt) = $pos + 5; + # according to the spec, this string is little-endian + # (very odd, since the size word is big-endian), + # and the first char must be '/' + unless ($$dataPt =~ m{\G(/\0(..)*?)\0\0}sg) { + $et->Warn('Invalid FPXR stream name'); + return 0; + } + # convert stream pathname to ascii + my $name = Image::ExifTool::Decode(undef, $1, 'UCS2', 'II', 'Latin'); + if ($verbose) { + my $psize = ($size == 0xffffffff) ? 'storage' : "$size bytes"; + $et->VPrint(0," | $entry) Name: '${name}' [$psize]\n"); + } + # remove directory specification + $name =~ s{.*/}{}s; + # read storage class ID if necessary + my $classID; + if ($size == 0xffffffff) { + unless ($$dataPt =~ m{(.{16})}sg) { + $et->Warn('Truncated FPXR storage class ID'); + return 0; + } + # unpack class ID in case we want to use it sometime + $classID = Image::ExifTool::ASF::GetGUID($1); + } + # find the tagInfo if available + my $tagInfo; + unless ($$tagTablePtr{$name}) { + # remove instance number or class ID from tag if necessary + $tagInfo = $et->GetTagInfo($tagTablePtr, $1) if + ($name =~ /(.*) \d{6}$/s and $$tagTablePtr{$1}) or + ($name =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1}); + } + # update position in list + $pos = pos($$dataPt); + # add to our contents list + push @contents, { + Name => $name, + Size => $size, + Default => $default, + ClassID => $classID, + TagInfo => $tagInfo, + }; + } + # save contents list as $et member variable + # (must do this last so we don't save list on error) + $$et{FPXR} = \@contents; + + } elsif ($type == 2) { # a "Stream Data" segment + + # get the contents list index and stream data offset + my ($index, $offset) = unpack('x7nN', $$dataPt); + my $fpxr = $$et{FPXR}; + if ($fpxr and $$fpxr[$index]) { + my $obj = $$fpxr[$index]; + # extract stream data (after 13-byte header) + if (not defined $$obj{Stream}) { + # ignore offset for first segment of this type + # (in my sample images, this isn't always zero as one would expect) + $$obj{Stream} = substr($$dataPt, $dirStart+13); + } else { + # add data at the proper offset to the stream + my $overlap = length($$obj{Stream}) - $offset; + my $start = $dirStart + 13; + if ($overlap < 0 or $dirLen - $overlap < 13) { + $et->WarnOnce("Bad FPXR stream $index offset",1); + } else { + # ignore any overlapping data in this segment + # (this seems to be the convention) + $start += $overlap; + } + # concatenate data with this stream + $$obj{Stream} .= substr($$dataPt, $start); + } + # save value for this tag if stream is complete + my $len = length $$obj{Stream}; + if ($len >= $$obj{Size}) { + $et->VPrint(0, " + [FPXR stream $index, $len bytes]\n") if $verbose; + if ($len > $$obj{Size}) { + $et->Warn('Extra data in FPXR segment (truncated)'); + $$obj{Stream} = substr($$obj{Stream}, 0, $$obj{Size}); + } + # handle this tag + $et->HandleTag($tagTablePtr, $$obj{Name}, $$obj{Stream}, + DataPt => \$$obj{Stream}, + TagInfo => $$obj{TagInfo}, + ); + delete $$obj{Stream}; # done with this stream + } + # hack for improperly stored FujiFilm PreviewImage (stored with no contents list) + } elsif ($index == 512 and $dirLen > 60 and ($$et{FujiPreview} or + ($dirLen > 64 and substr($$dataPt, $dirStart+60, 4) eq "\xff\xd8\xff\xdb"))) + { + $$et{FujiPreview} = '' unless defined $$et{FujiPreview}; + # recombine PreviewImage, skipping 13-byte FPXR header + 47-byte Fuji header + $$et{FujiPreview} .= substr($$dataPt, $dirStart+60); + } else { + # (Kodak uses index 255 for a free segment in images from some cameras) + $et->Warn("Unlisted FPXR segment (index $index)") if $index != 255; + } + + } elsif ($type != 3) { # not a "Reserved" segment + + $et->Warn("Unknown FPXR segment (type $type)"); + + } + + # clean up if this was the last FPXR segment + if ($$dirInfo{LastFPXR}) { + if ($$et{FPXR}) { + my $obj; + foreach $obj (@{$$et{FPXR}}) { + next unless defined $$obj{Stream} and length $$obj{Stream}; + # parse it even though it isn't the proper length + $et->HandleTag($tagTablePtr, $$obj{Name}, $$obj{Stream}, + DataPt => \$$obj{Stream}, + TagInfo => $$obj{TagInfo}, + ); + } + delete $$et{FPXR}; # delete our temporary variables + } + if ($$et{FujiPreview}) { + $et->FoundTag('PreviewImage', $$et{FujiPreview}); + delete $$et{FujiPreview}; + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Set document number for objects +# Inputs: 0) object hierarchy hash ref, 1) object index, 2) doc number list ref, +# 3) doc numbers used at each level, 4) flag set for metadata levels +sub SetDocNum($$;$$$) +{ + my ($hier, $index, $doc, $used, $meta) = @_; + my $obj = $$hier{$index} or return; + return if exists $$obj{DocNum}; + $$obj{DocNum} = $doc; + SetDocNum($hier, $$obj{Left}, $doc, $used, $meta) if $$obj{Left}; + SetDocNum($hier, $$obj{Right}, $doc, $used, $meta) if $$obj{Right}; + if (defined $$obj{Child}) { + $used or $used = [ ]; + my @subDoc; + push @subDoc, @$doc if $doc; + # we must dive down 2 levels for each sub-document, so use the + # $meta flag to add a sub-document level only for every 2nd generation + if ($meta) { + my $subNum = ($$used[scalar @subDoc] || 0); + $$used[scalar @subDoc] = $subNum; + push @subDoc, $subNum; + } elsif (@subDoc) { + $subDoc[-1] = ++$$used[$#subDoc]; + } + SetDocNum($hier, $$obj{Child}, \@subDoc, $used, not $meta); + } +} + +#------------------------------------------------------------------------------ +# Extract information from a FlashPix (FPX) file +# Inputs: 0) ExifTool object ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid FPX-format file +sub ProcessFPX($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $out, $oldIndent, $miniStreamBuff); + my ($tag, %hier, %objIndex, %loadedDifSect); + + # read header + return 0 unless $raf->Read($buff,HDR_SIZE) == HDR_SIZE; + # check signature + return 0 unless $buff =~ /^\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1/; + + # set FileType initially based on file extension (we may override this later) + my $fileType = $$et{FILE_EXT}; + $fileType = 'FPX' unless $fileType and $fpxFileType{$fileType}; + $et->SetFileType($fileType); + SetByteOrder(substr($buff, 0x1c, 2) eq "\xff\xfe" ? 'MM' : 'II'); + my $tagTablePtr = GetTagTable('Image::ExifTool::FlashPix::Main'); + my $verbose = $et->Options('Verbose'); + # copy LargeFileSupport option to RAF for use in LoadChain + $$raf{LargeFileSupport} = $et->Options('LargeFileSupport'); + + my $sectSize = 1 << Get16u(\$buff, 0x1e); + my $miniSize = 1 << Get16u(\$buff, 0x20); + my $fatCount = Get32u(\$buff, 0x2c); # number of FAT sectors + my $dirStart = Get32u(\$buff, 0x30); # first directory sector + my $miniCutoff = Get32u(\$buff, 0x38); # minimum size for big-FAT streams + my $miniStart = Get32u(\$buff, 0x3c); # first sector of mini-FAT + my $miniCount = Get32u(\$buff, 0x40); # number of mini-FAT sectors + my $difStart = Get32u(\$buff, 0x44); # first sector of DIF chain + my $difCount = Get32u(\$buff, 0x48); # number of DIF sectors + + if ($verbose) { + $out = $et->Options('TextOut'); + print $out " Sector size=$sectSize\n FAT: Count=$fatCount\n"; + print $out " DIR: Start=$dirStart\n"; + print $out " MiniFAT: Mini-sector size=$miniSize Start=$miniStart Count=$miniCount Cutoff=$miniCutoff\n"; + print $out " DIF FAT: Start=$difStart Count=$difCount\n"; + } +# +# load the FAT +# + my $pos = 0x4c; + my $endPos = length($buff); + my $fat = ''; + my $fatCountCheck = 0; + my $difCountCheck = 0; + my $hdrSize = $sectSize > HDR_SIZE ? $sectSize : HDR_SIZE; + + for (;;) { + while ($pos <= $endPos - 4) { + my $sect = Get32u(\$buff, $pos); + $pos += 4; + next if $sect == FREE_SECT; + my $offset = $sect * $sectSize + $hdrSize; + my $fatSect; + unless ($raf->Seek($offset, 0) and + $raf->Read($fatSect, $sectSize) == $sectSize) + { + $et->Error("Error reading FAT from sector $sect"); + return 1; + } + $fat .= $fatSect; + ++$fatCountCheck; + } + last if $difStart >= END_OF_CHAIN; + # read next DIF (Dual Indirect FAT) sector + if (++$difCountCheck > $difCount) { + $et->Warn('Unterminated DIF FAT'); + last; + } + if ($loadedDifSect{$difStart}) { + $et->Warn('Cyclical reference in DIF FAT'); + last; + } + my $offset = $difStart * $sectSize + $hdrSize; + unless ($raf->Seek($offset, 0) and $raf->Read($buff, $sectSize) == $sectSize) { + $et->Error("Error reading DIF sector $difStart"); + return 1; + } + $loadedDifSect{$difStart} = 1; + # set end of sector information in this DIF + $pos = 0; + $endPos = $sectSize - 4; + # next time around we want to read next DIF in chain + $difStart = Get32u(\$buff, $endPos); + } + if ($fatCountCheck != $fatCount) { + $et->Warn("Bad number of FAT sectors (expected $fatCount but found $fatCountCheck)"); + } +# +# load the mini-FAT and the directory +# + my $miniFat = LoadChain($raf, $miniStart, \$fat, $sectSize, $hdrSize); + my $dir = LoadChain($raf, $dirStart, \$fat, $sectSize, $hdrSize); + unless (defined $miniFat and defined $dir) { + $et->Error('Error reading mini-FAT or directory stream'); + return 1; + } + if ($verbose) { + print $out " FAT [",length($fat)," bytes]:\n"; + $et->VerboseDump(\$fat); + print $out " Mini-FAT [",length($miniFat)," bytes]:\n"; + $et->VerboseDump(\$miniFat); + print $out " Directory [",length($dir)," bytes]:\n"; + $et->VerboseDump(\$dir); + } +# +# process the directory +# + if ($verbose) { + $oldIndent = $$et{INDENT}; + $$et{INDENT} .= '| '; + $et->VerboseDir('FPX', undef, length $dir); + } + my $miniStream; + $endPos = length($dir); + my $index = 0; + + for ($pos=0; $pos<=$endPos-128; $pos+=128, ++$index) { + + # get directory entry type + # (0=invalid, 1=storage, 2=stream, 3=lockbytes, 4=property, 5=root) + my $type = Get8u(\$dir, $pos + 0x42); + next if $type == 0; # skip invalid entries + if ($type > 5) { + $et->Warn("Invalid directory entry type $type"); + last; # rest of directory is probably garbage + } + # get entry name (note: this is supposed to be length in 2-byte + # characters but this isn't what is done in my sample FPX file, so + # be very tolerant of this count -- it's null terminated anyway) + my $len = Get16u(\$dir, $pos + 0x40); + $len > 32 and $len = 32; + $tag = Image::ExifTool::Decode(undef, substr($dir,$pos,$len*2), 'UCS2', 'II', 'Latin'); + $tag =~ s/\0.*//s; # truncate at null (in case length was wrong) + + my $sect = Get32u(\$dir, $pos + 0x74); # start sector number + my $size = Get32u(\$dir, $pos + 0x78); # stream length + + # load Ministream (referenced from first directory entry) + unless ($miniStream) { + $miniStreamBuff = LoadChain($raf, $sect, \$fat, $sectSize, $hdrSize); + unless (defined $miniStreamBuff) { + $et->Warn('Error loading Mini-FAT stream'); + last; + } + $miniStream = new File::RandomAccess(\$miniStreamBuff); + } + + my $tagInfo; + if ($$tagTablePtr{$tag}) { + $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + } else { + # remove instance number or class ID from tag if necessary + $tagInfo = $et->GetTagInfo($tagTablePtr, $1) if + ($tag =~ /(.*) \d{6}$/s and $$tagTablePtr{$1}) or + ($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1}) or + ($tag =~ /(.*)_[0-9]{4}$/s and $$tagTablePtr{$1}); # IeImg instances + } + + my $lSib = Get32u(\$dir, $pos + 0x44); # left sibling + my $rSib = Get32u(\$dir, $pos + 0x48); # right sibling + my $chld = Get32u(\$dir, $pos + 0x4c); # child directory + + # save information about object hierarchy + my ($obj, $sub); + $obj = $hier{$index} or $obj = $hier{$index} = { }; + $$obj{Left} = $lSib unless $lSib == FREE_SECT; + $$obj{Right} = $rSib unless $rSib == FREE_SECT; + unless ($chld == FREE_SECT) { + $$obj{Child} = $chld; + $sub = $hier{$chld} or $sub = $hier{$chld} = { }; + $$sub{Parent} = $index; + } + + next unless $tagInfo or $verbose; + + # load the data for stream types + my $extra = ''; + my $typeStr = $dirEntryType[$type] || $type; + if ($typeStr eq 'STREAM') { + if ($size >= $miniCutoff) { + # stream is in the main FAT + $buff = LoadChain($raf, $sect, \$fat, $sectSize, $hdrSize); + } elsif ($size) { + # stream is in the mini-FAT + $buff = LoadChain($miniStream, $sect, \$miniFat, $miniSize, 0); + } else { + $buff = ''; # an empty stream + } + unless (defined $buff) { + my $name = $tagInfo ? $$tagInfo{Name} : 'unknown'; + $et->Warn("Error reading $name stream"); + $buff = ''; + } + } elsif ($typeStr eq 'ROOT') { + $buff = $miniStreamBuff; + $extra .= ' (Ministream)'; + } else { + $buff = ''; + undef $size; + } + if ($verbose) { + my $flags = Get8u(\$dir, $pos + 0x43); # 0=red, 1=black + my $col = { 0 => 'Red', 1 => 'Black' }->{$flags} || $flags; + $extra .= " Type=$typeStr Flags=$col"; + $extra .= " Left=$lSib" unless $lSib == FREE_SECT; + $extra .= " Right=$rSib" unless $rSib == FREE_SECT; + $extra .= " Child=$chld" unless $chld == FREE_SECT; + $et->VerboseInfo($tag, $tagInfo, + Index => $index, + Value => $buff, + DataPt => \$buff, + Extra => $extra, + Size => $size, + ); + } + if ($tagInfo and $buff) { + my $num = $$et{NUM_FOUND}; + my $subdir = $$tagInfo{SubDirectory}; + if ($subdir) { + my %dirInfo = ( + DataPt => \$buff, + DirStart => $$subdir{DirStart}, + DirLen => length $buff, + Multi => $$tagInfo{Multi}, + ); + my $subTablePtr = GetTagTable($$subdir{TagTable}); + $et->ProcessDirectory(\%dirInfo, $subTablePtr, $$subdir{ProcessProc}); + } else { + $et->FoundTag($tagInfo, $buff); + } + # save object index number for all found tags + my $num2 = $$et{NUM_FOUND}; + $objIndex{++$num} = $index while $num < $num2; + } + } + # set document numbers for tags extracted from embedded documents + unless ($$et{DOC_NUM}) { + # initialize document number for all objects, beginning at root (index 0) + SetDocNum(\%hier, 0); + # set family 3 group name for all tags in embedded documents + my $order = $$et{FILE_ORDER}; + my (@pri, $copy, $member); + foreach $tag (keys %$order) { + my $num = $$order{$tag}; + next unless defined $num and $objIndex{$num}; + my $obj = $hier{$objIndex{$num}} or next; + my $docNums = $$obj{DocNum}; + next unless $docNums and @$docNums; + $$et{TAG_EXTRA}{$tag}{G3} = join '-', @$docNums; + push @pri, $tag unless $tag =~ / /; # save keys for priority sub-doc tags + } + # swap priority sub-document tags with main document tags if they exist + foreach $tag (@pri) { + for ($copy=1; ;++$copy) { + my $key = "$tag ($copy)"; + last unless defined $$et{VALUE}{$key}; + my $extra = $$et{TAG_EXTRA}{$key}; + next if $extra and $$extra{G3}; # not Main if family 3 group is set + foreach $member ('PRIORITY','VALUE','FILE_ORDER','TAG_INFO','TAG_EXTRA') { + my $pHash = $$et{$member}; + my $t = $$pHash{$tag}; + $$pHash{$tag} = $$pHash{$key}; + $$pHash{$key} = $t; + } + last; + } + } + } + $$et{INDENT} = $oldIndent if $verbose; + # try to better identify the file type + if ($$et{VALUE}{FileType} eq 'FPX') { + my $val = $$et{CompObjUserType} || $$et{Software}; + if ($val) { + my %type = ( '^3ds Max' => 'MAX', Word => 'DOC', PowerPoint => 'PPT', Excel => 'XLS' ); + my $pat; + foreach $pat (sort keys %type) { + next unless $val =~ /$pat/; + $et->OverrideFileType($type{$pat}); + last; + } + } + } + # process Word document table + ProcessDocumentTable($et); + + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::FlashPix - Read FlashPix meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to extract +FlashPix meta information from FPX images, and from the APP2 FPXR segment of +JPEG images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.exif.org/Exif2-2.PDF> + +=item L<http://www.graphcomp.com/info/specs/livepicture/fpx.pdf> + +=item L<http://search.cpan.org/~jdb/libwin32/> + +=item L<http://msdn.microsoft.com/en-us/library/aa380374.aspx> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/FlashPix Tags>, +L<Image::ExifTool::TagNames/OOXML Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Font.pm b/lib/Image/ExifTool/Font.pm new file mode 100644 index 0000000..58cdb1a --- /dev/null +++ b/lib/Image/ExifTool/Font.pm @@ -0,0 +1,654 @@ +#------------------------------------------------------------------------------ +# File: Font.pm +# +# Description: Read meta information from font files +# +# Revisions: 2010/01/15 - P. Harvey Created +# +# References: 1) http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6.html +# 2) http://www.microsoft.com/typography/otspec/otff.htm +# 3) http://partners.adobe.com/public/developer/opentype/index_font_file.html +# 4) http://partners.adobe.com/public/developer/en/font/5178.PFM.pdf +# 5) http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/modules/compiler/src/java/flex2/compiler/util/MimeMappings.java +# 6) http://www.adobe.com/devnet/font/pdfs/5004.AFM_Spec.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::Font; + +use strict; +use vars qw($VERSION %ttLang); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.10'; + +sub ProcessOTF($$); + +# TrueType 'name' platform codes +my %ttPlatform = ( + 0 => 'Unicode', + 1 => 'Macintosh', + 2 => 'ISO', + 3 => 'Windows', + 4 => 'Custom', +); + +# convert TrueType 'name' character encoding to ExifTool Charset (ref 1/2) +my %ttCharset = ( + Macintosh => { + 0 => 'MacRoman', 17 => 'MacMalayalam', + 1 => 'MacJapanese', 18 => 'MacSinhalese', + 2 => 'MacChineseTW', 19 => 'MacBurmese', + 3 => 'MacKorean', 20 => 'MacKhmer', + 4 => 'MacArabic', 21 => 'MacThai', + 5 => 'MacHebrew', 22 => 'MacLaotian', + 6 => 'MacGreek', 23 => 'MacGeorgian', + 7 => 'MacCyrillic', 24 => 'MacArmenian', # 7=Russian + 8 => 'MacRSymbol', 25 => 'MacChineseCN', + 9 => 'MacDevanagari', 26 => 'MacTibetan', + 10 => 'MacGurmukhi', 27 => 'MacMongolian', + 11 => 'MacGujarati', 28 => 'MacGeez', + 12 => 'MacOriya', 29 => 'MacCyrillic', # 29=Slavic + 13 => 'MacBengali', 30 => 'MacVietnam', + 14 => 'MacTamil', 31 => 'MacSindhi', + 15 => 'MacTelugu', 32 => '', # 32=uninterpreted + 16 => 'MacKannada', + }, + Windows => { + 0 => 'Symbol', 4 => 'Big5', + 1 => 'UCS2', 5 => 'Wansung', + 2 => 'ShiftJIS', 6 => 'Johab', + 3 => 'PRC', 10 => 'UCS4', + }, + Unicode => { + # (we don't currently handle the various Unicode flavours) + 0 => 'UCS2', # Unicode 1.0 semantics + 1 => 'UCS2', # Unicode 1.1 semantics + 2 => 'UCS2', # ISO 10646 semantics + 3 => 'UCS2', # Unicode 2.0 and onwards semantics, Unicode BMP only. + 4 => 'UCS2', # Unicode 2.0 and onwards semantics, Unicode full repertoire. + # 5 => Unicode Variation Sequences (not used in Naming table) + }, + ISO => { # (deprecated) + 0 => 'UTF8', # (7-bit ASCII) + 1 => 'UCS2', # ISO 10646 + 2 => 'Latin', # ISO 8859-1 + }, + Custom => { }, +); + +# convert TrueType 'name' language code to ExifTool language code +%ttLang = ( + # Macintosh language codes (also used by QuickTime.pm) + # oddities: + # 49 - Cyrillic version 83 - Roman + # 50 - Arabic version 84 - Arabic + # 146 - with dot above + Macintosh => { + 0 => 'en', 24 => 'lt', 48 => 'kk', 72 => 'ml', 129 => 'eu', + 1 => 'fr', 25 => 'pl', 49 => 'az', 73 => 'kn', 130 => 'ca', + 2 => 'de', 26 => 'hu', 50 => 'az', 74 => 'ta', 131 => 'la', + 3 => 'it', 27 => 'et', 51 => 'hy', 75 => 'te', 132 => 'qu', + 4 => 'nl-NL', 28 => 'lv', 52 => 'ka', 76 => 'si', 133 => 'gn', + 5 => 'sv', 29 => 'smi', 53 => 'ro', 77 => 'my', 134 => 'ay', + 6 => 'es', 30 => 'fo', 54 => 'ky', 78 => 'km', 135 => 'tt', + 7 => 'da', 31 => 'fa', 55 => 'tg', 79 => 'lo', 136 => 'ug', + 8 => 'pt', 32 => 'ru', 56 => 'tk', 80 => 'vi', 137 => 'dz', + 9 => 'no', 33 => 'zh-CN', 57 => 'mn-MN', 81 => 'id', 138 => 'jv', + 10 => 'he', 34 => 'nl-BE', 58 => 'mn-CN', 82 => 'tl', 139 => 'su', + 11 => 'ja', 35 => 'ga', 59 => 'ps', 83 => 'ms-MY', 140 => 'gl', + 12 => 'ar', 36 => 'sq', 60 => 'ku', 84 => 'ms-BN', 141 => 'af', + 13 => 'fi', 37 => 'ro', 61 => 'ks', 85 => 'am', 142 => 'br', + 14 => 'el', 38 => 'cs', 62 => 'sd', 86 => 'ti', 144 => 'gd', + 15 => 'is', 39 => 'sk', 63 => 'bo', 87 => 'om', 145 => 'gv', + 16 => 'mt', 40 => 'sl', 64 => 'ne', 88 => 'so', 146 => 'ga', + 17 => 'tr', 41 => 'yi', 65 => 'sa', 89 => 'sw', 147 => 'to', + 18 => 'hr', 42 => 'sr', 66 => 'mr', 90 => 'rw', 148 => 'el', + 19 => 'zh-TW', 43 => 'mk', 67 => 'bn', 91 => 'rn', 149 => 'kl', + 20 => 'ur', 44 => 'bg', 68 => 'as', 92 => 'ny', 150 => 'az', + 21 => 'hi', 45 => 'uk', 69 => 'gu', 93 => 'mg', + 22 => 'th', 46 => 'be', 70 => 'pa', 94 => 'eo', + 23 => 'ko', 47 => 'uz', 71 => 'or', 128 => 'cy', + }, + # Windows language codes (http://msdn.microsoft.com/en-us/library/0h88fahh(VS.85).aspx) + # Notes: This isn't an exact science. The reference above gives language codes + # which are different from some ISO 639-1 numbers. Also, some Windows language + # codes don't appear to have ISO 639-1 equivalents. + # 0x0428 - fa by ref above + # 0x048c - no ISO equivalent + # 0x081a/0x83c - sr-SP + # 0x0c0a - modern? + # 0x2409 - Caribbean country code not found in ISO 3166-1 + Windows => { + 0x0401 => 'ar-SA', 0x0438 => 'fo', 0x0481 => 'mi', 0x1409 => 'en-NZ', + 0x0402 => 'bg', 0x0439 => 'hi', 0x0482 => 'oc', 0x140a => 'es-CR', + 0x0403 => 'ca', 0x043a => 'mt', 0x0483 => 'co', 0x140c => 'fr-LU', + 0x0404 => 'zh-TW', 0x043b => 'se-NO', 0x0484 => 'gsw', 0x141a => 'bs-BA', + 0x0405 => 'cs', 0x043c => 'gd', 0x0485 => 'sah', 0x143b => 'smj-SE', + 0x0406 => 'da', 0x043d => 'yi', 0x0486 => 'ny', 0x1801 => 'ar-MA', + 0x0407 => 'de-DE', 0x043e => 'ms-MY', 0x0487 => 'rw', 0x1809 => 'en-IE', + 0x0408 => 'el', 0x043f => 'kk', 0x048c => 'Dari', 0x180a => 'es-PA', + 0x0409 => 'en-US', 0x0440 => 'ky', 0x0801 => 'ar-IQ', 0x180c => 'fr-MC', + 0x040a => 'es-ES', 0x0441 => 'sw', 0x0804 => 'zh-CN', 0x181a => 'sr-BA', + 0x040b => 'fi', 0x0442 => 'tk', 0x0807 => 'de-CH', 0x183b => 'sma-NO', + 0x040c => 'fr-FR', 0x0443 => 'uz-UZ', 0x0809 => 'en-GB', 0x1c01 => 'ar-TN', + 0x040d => 'he', 0x0444 => 'tt', 0x080a => 'es-MX', 0x1c09 => 'en-ZA', + 0x040e => 'hu', 0x0445 => 'bn-IN', 0x080c => 'fr-BE', 0x1c0a => 'es-DO', + 0x040f => 'is', 0x0446 => 'pa', 0x0810 => 'it-CH', 0x1c1a => 'sr-BA', + 0x0410 => 'it-IT', 0x0447 => 'gu', 0x0813 => 'nl-BE', 0x1c3b => 'sma-SE', + 0x0411 => 'ja', 0x0448 => 'wo', 0x0814 => 'nn', 0x2001 => 'ar-OM', + 0x0412 => 'ko', 0x0449 => 'ta', 0x0816 => 'pt-PT', 0x2009 => 'en-JM', + 0x0413 => 'nl-NL', 0x044a => 'te', 0x0818 => 'ro-MO', 0x200a => 'es-VE', + 0x0414 => 'no-NO', 0x044b => 'kn', 0x0819 => 'ru-MO', 0x201a => 'bs-BA', + 0x0415 => 'pl', 0x044c => 'ml', 0x081a => 'sr-RS', 0x203b => 'sms', + 0x0416 => 'pt-BR', 0x044d => 'as', 0x081d => 'sv-FI', 0x2401 => 'ar-YE', + 0x0417 => 'rm', 0x044e => 'mr', 0x082c => 'az-AZ', 0x2409 => 'en-CB', + 0x0418 => 'ro', 0x044f => 'sa', 0x082e => 'dsb', 0x240a => 'es-CO', + 0x0419 => 'ru', 0x0450 => 'mn-MN', 0x083b => 'se-SE', 0x243b => 'smn', + 0x041a => 'hr', 0x0451 => 'bo', 0x083c => 'ga', 0x2801 => 'ar-SY', + 0x041b => 'sk', 0x0452 => 'cy', 0x083e => 'ms-BN', 0x2809 => 'en-BZ', + 0x041c => 'sq', 0x0453 => 'km', 0x0843 => 'uz-UZ', 0x280a => 'es-PE', + 0x041d => 'sv-SE', 0x0454 => 'lo', 0x0845 => 'bn-BD', 0x2c01 => 'ar-JO', + 0x041e => 'th', 0x0456 => 'gl', 0x0850 => 'mn-CN', 0x2c09 => 'en-TT', + 0x041f => 'tr', 0x0457 => 'kok', 0x085d => 'iu-CA', 0x2c0a => 'es-AR', + 0x0420 => 'ur', 0x045a => 'syr', 0x085f => 'tmh', 0x3001 => 'ar-LB', + 0x0421 => 'id', 0x045b => 'si', 0x086b => 'qu-EC', 0x3009 => 'en-ZW', + 0x0422 => 'uk', 0x045d => 'iu-CA', 0x0c01 => 'ar-EG', 0x300a => 'es-EC', + 0x0423 => 'be', 0x045e => 'am', 0x0c04 => 'zh-HK', 0x3401 => 'ar-KW', + 0x0424 => 'sl', 0x0461 => 'ne', 0x0c07 => 'de-AT', 0x3409 => 'en-PH', + 0x0425 => 'et', 0x0462 => 'fy', 0x0c09 => 'en-AU', 0x340a => 'es-CL', + 0x0426 => 'lv', 0x0463 => 'ps', 0x0c0a => 'es-ES', 0x3801 => 'ar-AE', + 0x0427 => 'lt', 0x0464 => 'fil', 0x0c0c => 'fr-CA', 0x380a => 'es-UY', + 0x0428 => 'tg', 0x0465 => 'dv', 0x0c1a => 'sr-RS', 0x3c01 => 'ar-BH', + 0x042a => 'vi', 0x0468 => 'ha', 0x0c3b => 'se-FI', 0x3c0a => 'es-PY', + 0x042b => 'hy', 0x046a => 'yo', 0x0c6b => 'qu-PE', 0x4001 => 'ar-QA', + 0x042c => 'az-AZ', 0x046b => 'qu-BO', 0x1001 => 'ar-LY', 0x4009 => 'en-IN', + 0x042d => 'eu', 0x046c => 'st', 0x1004 => 'zh-SG', 0x400a => 'es-BO', + 0x042e => 'hsb', 0x046d => 'ba', 0x1007 => 'de-LU', 0x4409 => 'en-MY', + 0x042f => 'mk', 0x046e => 'lb', 0x1009 => 'en-CA', 0x440a => 'es-SV', + 0x0430 => 'st', 0x046f => 'kl', 0x100a => 'es-GT', 0x4809 => 'en-SG', + 0x0431 => 'ts', 0x0470 => 'ig', 0x100c => 'fr-CH', 0x480a => 'es-HN', + 0x0432 => 'tn', 0x0478 => 'yi', 0x101a => 'hr-BA', 0x4c0a => 'es-NI', + 0x0434 => 'xh', 0x047a => 'arn', 0x103b => 'smj-NO',0x500a => 'es-PR', + 0x0435 => 'zu', 0x047c => 'moh', 0x1401 => 'ar-DZ', 0x540a => 'es-US', + 0x0436 => 'af', 0x047e => 'br', 0x1404 => 'zh-MO', + 0x0437 => 'ka', 0x0480 => 'ug', 0x1407 => 'de-LI', + }, + Unicode => { }, + ISO => { }, + Custom => { }, +); + +# eclectic table of tags for various format font files +%Image::ExifTool::Font::Main = ( + GROUPS => { 2 => 'Document' }, + NOTES => q{ + This table contains a collection of tags found in font files of various + formats. ExifTool current recognizes OTF, TTF, TTC, DFONT, PFA, PFB, PFM, + AFM, ACFM and AMFM font files. + }, + name => { + SubDirectory => { TagTable => 'Image::ExifTool::Font::Name' }, + }, + PFM => { + Name => 'PFMHeader', + SubDirectory => { TagTable => 'Image::ExifTool::Font::PFM' }, + }, + PSInfo => { + Name => 'PSFontInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Font::PSInfo' }, + }, + AFM => { + Name => 'AFM', + SubDirectory => { TagTable => 'Image::ExifTool::Font::AFM' }, + }, + numfonts => 'NumFonts', + fontname => 'FontName', + postfont => { + Name => 'PostScriptFontName', + Description => 'PostScript Font Name', + }, +); + +# TrueType name tags (ref 1/2) +%Image::ExifTool::Font::Name = ( + GROUPS => { 2 => 'Document' }, + NOTES => q{ + The following tags are extracted from the TrueType font "name" table found + in OTF, TTF, TTC and DFONT files. These tags support localized languages by + adding a hyphen followed by a language code to the end of the tag name (eg. + "Copyright-fr" or "License-en-US"). Tags with no language code use the + default language of "en". + }, + 0 => { Name => 'Copyright', Groups => { 2 => 'Author' } }, + 1 => 'FontFamily', + 2 => 'FontSubfamily', + 3 => 'FontSubfamilyID', + 4 => 'FontName', # full name + 5 => 'NameTableVersion', + 6 => { Name => 'PostScriptFontName', Description => 'PostScript Font Name' }, + 7 => 'Trademark', + 8 => 'Manufacturer', + 9 => 'Designer', + 10 => 'Description', + 11 => 'VendorURL', + 12 => 'DesignerURL', + 13 => 'License', + 14 => 'LicenseInfoURL', + 16 => 'PreferredFamily', + 17 => 'PreferredSubfamily', + 18 => 'CompatibleFontName', + 19 => 'SampleText', + 20 => { + Name => 'PostScriptFontName', + Description => 'PostScript Font Name', + }, + 21 => 'WWSFamilyName', + 22 => 'WWSSubfamilyName', +); + +# PostScript Font Metric file header (ref 4) +%Image::ExifTool::Font::PFM = ( + GROUPS => { 2 => 'Document' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + NOTES => 'Tags extracted from the PFM file header.', + 0 => { + Name => 'PFMVersion', + Format => 'int16u', + PrintConv => 'sprintf("%x.%.2x",$val>>8,$val&0xff)', + }, + 6 => { Name => 'Copyright', Format => 'string[60]', Groups => { 2 => 'Author' } }, + 66 => { Name => 'FontType', Format => 'int16u' }, + 68 => { Name => 'PointSize', Format => 'int16u' }, + 70 => { Name => 'YResolution', Format => 'int16u' }, + 72 => { Name => 'XResolution', Format => 'int16u' }, + 74 => { Name => 'Ascent', Format => 'int16u' }, + 76 => { Name => 'InternalLeading', Format => 'int16u' }, + 78 => { Name => 'ExternalLeading', Format => 'int16u' }, + 80 => { Name => 'Italic' }, + 81 => { Name => 'Underline' }, + 82 => { Name => 'Strikeout' }, + 83 => { Name => 'Weight', Format => 'int16u' }, + 85 => { Name => 'CharacterSet' }, + 86 => { Name => 'PixWidth', Format => 'int16u' }, + 88 => { Name => 'PixHeight', Format => 'int16u' }, + 90 => { Name => 'PitchAndFamily' }, + 91 => { Name => 'AvgWidth', Format => 'int16u' }, + 93 => { Name => 'MaxWidth', Format => 'int16u' }, + 95 => { Name => 'FirstChar' }, + 96 => { Name => 'LastChar' }, + 97 => { Name => 'DefaultChar' }, + 98 => { Name => 'BreakChar' }, + 99 => { Name => 'WidthBytes', Format => 'int16u' }, + # 101 => { Name => 'DeviceTypeOffset', Format => 'int32u' }, + # 105 => { Name => 'FontNameOffset', Format => 'int32u' }, + # 109 => { Name => 'BitsPointer', Format => 'int32u' }, + # 113 => { Name => 'BitsOffset', Format => 'int32u' }, +); + +# PostScript FontInfo attributes (PFA, PFB) (ref PH) +%Image::ExifTool::Font::PSInfo = ( + GROUPS => { 2 => 'Document' }, + NOTES => 'Tags extracted from PostScript font files (PFA and PFB).', + FullName => { }, + FamilyName => { Name => 'FontFamily' }, + Weight => { }, + ItalicAngle => { }, + isFixedPitch=> { }, + UnderlinePosition => { }, + UnderlineThickness => { }, + Copyright => { Groups => { 2 => 'Author' } }, + Notice => { Groups => { 2 => 'Author' } }, + version => { }, + FontName => { }, + FontType => { }, + FSType => { }, +); + +# Adobe Font Metrics tags (AFM) (ref 6) +%Image::ExifTool::Font::AFM = ( + GROUPS => { 2 => 'Document' }, + NOTES => 'Tags extracted from Adobe Font Metrics files (AFM, ACFM and AMFM).', + 'Creation Date' => { Name => 'CreateDate', Groups => { 2 => 'Time' } }, + FontName => { }, + FullName => { }, + FamilyName => { Name => 'FontFamily' }, + Weight => { }, + Version => { }, + Notice => { Groups => { 2 => 'Author' } }, + EncodingScheme => { }, + MappingScheme => { }, + EscChar => { }, + CharacterSet=> { }, + Characters => { }, + IsBaseFont => { }, + # VVector => { }, + IsFixedV => { }, + CapHeight => { }, + XHeight => { }, + Ascender => { }, + Descender => { }, +); + +#------------------------------------------------------------------------------ +# Read information from a TrueType font collection (TTC) (refs 2,3) +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid TrueType font collection +sub ProcessTTC($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $i); + + return 0 unless $raf->Read($buff, 12) == 12; + return 0 unless $buff =~ /^ttcf\0[\x01\x02]\0\0/; + SetByteOrder('MM'); + my $num = Get32u(\$buff, 8); + # might as well put a limit on the number of fonts we will parse (< 256) + return 0 unless $num < 0x100 and $raf->Read($buff, $num * 4) == $num * 4; + $et->SetFileType('TTC'); + return 1 if $$et{OPTIONS}{FastScan} and $$et{OPTIONS}{FastScan} == 3; + my $tagTablePtr = GetTagTable('Image::ExifTool::Font::Main'); + $et->HandleTag($tagTablePtr, 'numfonts', $num); + # loop through all fonts in the collection + for ($i=0; $i<$num; ++$i) { + my $n = $i + 1; + $et->VPrint(0, "Font $n:\n"); + $$et{SET_GROUP1} = "+$n"; + my $offset = Get32u(\$buff, $i * 4); + $raf->Seek($offset, 0) or last; + ProcessOTF($et, $dirInfo) or last; + } + delete $$et{SET_GROUP1}; + return 1; +} + +#------------------------------------------------------------------------------ +# Read information from a TrueType font file (OTF or TTF) (refs 1,2) +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid TrueType font file +sub ProcessOTF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($tbl, $buff, $pos, $i); + my $base = $$dirInfo{Base} || 0; + + return 0 unless $raf->Read($buff, 12) == 12; + return 0 unless $buff =~ /^(\0\x01\0\0|OTTO|true|typ1|\xa5(kbd|lst))[\0\x01]/; + + $et->SetFileType($1 eq 'OTTO' ? 'OTF' : 'TTF'); + return 1 if $$et{OPTIONS}{FastScan} and $$et{OPTIONS}{FastScan} == 3; + SetByteOrder('MM'); + my $numTables = Get16u(\$buff, 4); + return 0 unless $numTables > 0 and $numTables < 0x200; + my $len = $numTables * 16; + return 0 unless $raf->Read($tbl, $len) == $len; + + my $verbose = $et->Options('Verbose'); + my $oldIndent = $$et{INDENT}; + $$et{INDENT} .= '| '; + $et->VerboseDir('TrueType', $numTables) if $verbose; + + for ($pos=0; $pos<$len; $pos+=16) { + # look for 'name' table + my $tag = substr($tbl, $pos, 4); + next unless $tag eq 'name' or $verbose; + my $offset = Get32u(\$tbl, $pos + 8); + my $size = Get32u(\$tbl, $pos + 12); + unless ($raf->Seek($offset+$base, 0) and $raf->Read($buff, $size) == $size) { + $et->Warn("Error reading '${tag}' data"); + next; + } + if ($verbose) { + $tag =~ s/([\0-\x1f\x80-\xff])/sprintf('\x%.2x',ord $1)/ge; + my $str = sprintf("%s%d) Tag '%s' (offset 0x%.4x, %d bytes)\n", + $$et{INDENT}, $pos/16, $tag, $offset, $size); + $et->VPrint(0, $str); + $et->VerboseDump(\$buff, Addr => $offset) if $verbose > 2; + next unless $tag eq 'name'; + } + next unless $size >= 8; + my $entries = Get16u(\$buff, 2); + my $recEnd = 6 + $entries * 12; + if ($recEnd > $size) { + $et->Warn('Truncated name record'); + last; + } + my $strStart = Get16u(\$buff, 4); + if ($strStart < $recEnd or $strStart > $size) { + $et->Warn('Invalid string offset'); + last; + } + # parse language-tag record (in format 1 Naming table only) (ref 2) + my %langTag; + if (Get16u(\$buff, 0) == 1 and $recEnd + 2 <= $size) { + my $langTags = Get16u(\$buff, $recEnd); + if ($langTags and $recEnd + 2 + $langTags * 4 < $size) { + for ($i=0; $i<$langTags; ++$i) { + my $pt = $recEnd + 2 + $i * 4; + my $langLen = Get16u(\$buff, $pt); + # make sure the language string length is reasonable (UTF-16BE) + last if $langLen == 0 or $langLen & 0x01 or $langLen > 40; + my $langPt = Get16u(\$buff, $pt + 2) + $strStart; + last if $langPt + $langLen > $size; + my $lang = substr($buff, $langPt, $langLen); + $lang = $et->Decode($lang,'UCS2','MM','UTF8'); + $lang =~ tr/-_a-zA-Z0-9//dc; # remove naughty characters + $langTag{$i + 0x8000} = $lang; + } + } + } + my $tagTablePtr = GetTagTable('Image::ExifTool::Font::Name'); + $$et{INDENT} .= '| '; + $et->VerboseDir('Name', $entries) if $verbose; + for ($i=0; $i<$entries; ++$i) { + my $pt = 6 + $i * 12; + my $platform = Get16u(\$buff, $pt); + my $encoding = Get16u(\$buff, $pt + 2); + my $langID = Get16u(\$buff, $pt + 4); + my $nameID = Get16u(\$buff, $pt + 6); + my $strLen = Get16u(\$buff, $pt + 8); + my $strPt = Get16u(\$buff, $pt + 10) + $strStart; + if ($strPt + $strLen <= $size) { + my $val = substr($buff, $strPt, $strLen); + my ($lang, $charset, $extra); + my $sys = $ttPlatform{$platform}; + # translate from specified encoding + if ($sys) { + $lang = $ttLang{$sys}{$langID} || $langTag{$langID}; + $charset = $ttCharset{$sys}{$encoding}; + if (not $charset) { + if (not defined $charset and not $$et{FontWarn}) { + $et->Warn("Unknown $sys character set ($encoding)"); + $$et{FontWarn} = 1; + } + } else { + # translate to ExifTool character set + $val = $et->Decode($val, $charset); + } + } else { + $et->Warn("Unknown platform ($platform) for name $nameID"); + } + # get the tagInfo for our specific language (use 'en' for default) + my $tagInfo = $et->GetTagInfo($tagTablePtr, $nameID); + if ($tagInfo and $lang and $lang ne 'en') { + my $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang); + $tagInfo = $langInfo if $langInfo; + } + if ($verbose) { + $langID > 0x400 and $langID = sprintf('0x%x', $langID); + $extra = ", Plat=$platform/" . ($sys || 'Unknown') . ', ' . + "Enc=$encoding/" . ($charset || 'Unknown') . ', ' . + "Lang=$langID/" . ($lang || 'Unknown'); + } + $et->HandleTag($tagTablePtr, $nameID, $val, + TagInfo => $tagInfo, + DataPt => \$buff, + DataPos => $offset, + Start => $strPt, + Size => $strLen, + Index => $i, + Extra => $extra, + ); + } + } + $$et{INDENT} = $oldIndent . '| '; + last unless $verbose; + } + $$et{INDENT} = $oldIndent; + return 1; +} + +#------------------------------------------------------------------------------ +# Read information from an Adobe Font Metrics file (AFM, ACFM, AMFM) (ref 6) +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a recognized AFM-type file +sub ProcessAFM($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $comment); + + require Image::ExifTool::PostScript; + local $/ = Image::ExifTool::PostScript::GetInputRecordSeparator($raf); + $raf->ReadLine($buff); + return 0 unless $buff =~ /^Start(Comp|Master)?FontMetrics\s+\d+/; + my $ftyp = $1 ? ($1 eq 'Comp' ? 'ACFM' : 'AMFM') : 'AFM'; + $et->SetFileType($ftyp, 'application/x-font-afm'); + return 1 if $$et{OPTIONS}{FastScan} and $$et{OPTIONS}{FastScan} == 3; + my $tagTablePtr = GetTagTable('Image::ExifTool::Font::AFM'); + + for (;;) { + $raf->ReadLine($buff) or last; + if (defined $comment and $buff !~ /^Comment\s/) { + $et->FoundTag('Comment', $comment); + undef $comment; + } + $buff =~ /^(\w+)\s+(.*?)[\x0d\x0a]/ or next; + my ($tag, $val) = ($1, $2); + if ($tag eq 'Comment' and $val =~ /^(Creation Date):\s+(.*)/) { + ($tag, $val) = ($1, $2); + } + $val =~ s/^\((.*)\)$/$1/; # (some values may be in brackets) + if ($tag eq 'Comment') { + # concatinate all comments into a single value + $comment = defined($comment) ? "$comment\n$val" : $val; + next; + } + unless ($et->HandleTag($tagTablePtr, $tag, $val)) { + # end parsing if we start any subsection + last if $tag =~ /^Start/ and $tag ne 'StartDirection'; + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Read information from various format font files +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a recognized Font file +sub ProcessFont($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $buf2, $rtnVal); + return 0 unless $raf->Read($buff, 24) and $raf->Seek(0,0); + if ($buff =~ /^(\0\x01\0\0|OTTO|true|typ1)[\0\x01]/) { # OTF, TTF + $rtnVal = ProcessOTF($et, $dirInfo); + } elsif ($buff =~ /^ttcf\0[\x01\x02]\0\0/) { # TTC + $rtnVal = ProcessTTC($et, $dirInfo); + } elsif ($buff =~ /^Start(Comp|Master)?FontMetrics\s+\d+/s) { # AFM + $rtnVal = ProcessAFM($et, $dirInfo); + } elsif ($buff =~ /^(.{6})?%!(PS-(AdobeFont-|Bitstream )|FontType1-)/s) {# PFA, PFB + $raf->Seek(6,0) and $et->SetFileType('PFB') if $1; + require Image::ExifTool::PostScript; + $rtnVal = Image::ExifTool::PostScript::ProcessPS($et, $dirInfo); + } elsif ($buff =~ /^\0[\x01\x02]/ and $raf->Seek(0, 2) and # PFM + # validate file size + $raf->Tell() > 117 and $raf->Tell() == unpack('x2V',$buff) and + # read PFM header + $raf->Seek(0,0) and $raf->Read($buff,117) == 117 and + # validate "DeviceType" string (must be "PostScript\0") + SetByteOrder('II') and $raf->Seek(Get32u(\$buff, 101), 0) and + # the DeviceType should be "PostScript\0", but FontForge + # incorrectly writes "Postscript\0", so ignore case + $raf->Read($buf2, 11) == 11 and lc($buf2) eq "postscript\0") + { + $et->SetFileType('PFM'); + return 1 if $$et{OPTIONS}{FastScan} and $$et{OPTIONS}{FastScan} == 3; + SetByteOrder('II'); + my $tagTablePtr = GetTagTable('Image::ExifTool::Font::Main'); + # process the PFM header + $et->HandleTag($tagTablePtr, 'PFM', $buff); + # extract the font names + my $nameOff = Get32u(\$buff, 105); + if ($raf->Seek($nameOff, 0) and $raf->Read($buff, 256) and + $buff =~ /^([\x20-\xff]+)\0([\x20-\xff]+)\0/) + { + $et->HandleTag($tagTablePtr, 'fontname', $1); + $et->HandleTag($tagTablePtr, 'postfont', $2); + } + $rtnVal = 1; + } elsif ($buff =~ /^(wOF[F2])/) { + my $type = $1 eq 'wOFF' ? 'woff' : 'woff2'; + $et->SetFileType(uc($type), "font/$type"); + # (don't yet extract metadata from these files) + $rtnVal = 1; + } else { + $rtnVal = 0; + } + return $rtnVal; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Font - Read meta information from font files + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains the routines required by Image::ExifTool to read meta +information from various format font files. Currently recognized font file +types are OTF, TTF, TTC, DFONT, PFA, PFB, PFM, AFM, ACFM and AMFM. As well, +WOFF and WOFF2 font files are identified, but metadata is not currently +extracted from these formats. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6.html> + +=item L<http://www.microsoft.com/typography/otspec/otff.htm> + +=item L<http://partners.adobe.com/public/developer/opentype/index_font_file.html> + +=item L<http://partners.adobe.com/public/developer/en/font/5178.PFM.pdf> + +=item L<http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/modules/compiler/src/java/flex2/compiler/util/MimeMappings.java> + +=item L<http://www.adobe.com/devnet/font/pdfs/5004.AFM_Spec.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Font Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/FotoStation.pm b/lib/Image/ExifTool/FotoStation.pm new file mode 100644 index 0000000..c1c0e52 --- /dev/null +++ b/lib/Image/ExifTool/FotoStation.pm @@ -0,0 +1,261 @@ +#------------------------------------------------------------------------------ +# File: FotoStation.pm +# +# Description: Read/write FotoWare FotoStation trailer +# +# Revisions: 10/28/2006 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::FotoStation; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.04'; + +sub ProcessFotoStation($$); + +%Image::ExifTool::FotoStation::Main = ( + PROCESS_PROC => \&ProcessFotoStation, + WRITE_PROC => \&ProcessFotoStation, + GROUPS => { 2 => 'Image' }, + NOTES => q{ + The following tables define information found in the FotoWare FotoStation + trailer. + }, + 0x01 => { + Name => 'IPTC', + SubDirectory => { + TagTable => 'Image::ExifTool::IPTC::Main', + }, + }, + 0x02 => { + Name => 'SoftEdit', + SubDirectory => { + TagTable => 'Image::ExifTool::FotoStation::SoftEdit', + }, + }, + 0x03 => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Writable => 1, + RawConv => '$self->ValidateImage(\$val,$tag)', + }, + 0x04 => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Writable => 1, + RawConv => '$self->ValidateImage(\$val,$tag)', + }, +); + +# crop coordinate conversions +my %cropConv = ( + ValueConv => '$val / 1000', + ValueConvInv => '$val * 1000', + PrintConv => '"$val%"', + PrintConvInv => '$val=~tr/ %//d; $val', +); + +# soft crop record +%Image::ExifTool::FotoStation::SoftEdit = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int32s', + FIRST_ENTRY => 0, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'OriginalImageWidth', + }, + 1 => 'OriginalImageHeight', + 2 => 'ColorPlanes', + 3 => { + Name => 'XYResolution', + ValueConv => '$val / 1000', + ValueConvInv => '$val * 1000', + }, + 4 => { + Name => 'Rotation', + Notes => q{ + rotations are stored as degrees CCW * 100, but converted to degrees CW by + ExifTool + }, + # raw value is 0, 9000, 18000 or 27000 + ValueConv => '$val ? 360 - $val / 100 : 0', + ValueConvInv => '$val ? (360 - $val) * 100 : 0', + }, + # 5 Validity Check (0x11222211) + 6 => { + Name => 'CropLeft', + %cropConv, + }, + 7 => { + Name => 'CropTop', + %cropConv, + }, + 8 => { + Name => 'CropRight', + %cropConv, + }, + 9 => { + Name => 'CropBottom', + %cropConv, + }, + 11 => { + Name => 'CropRotation', + # raw value in the range -4500 to 4500 + ValueConv => '-$val / 100', + ValueConvInv => '-$val * 100', + }, +); + +#------------------------------------------------------------------------------ +# Read/write FotoStation information in a file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this file didn't contain FotoStation information +# - updates DataPos to point to start of FotoStation information +# - updates DirLen to trailer length +sub ProcessFotoStation($$) +{ + my ($et, $dirInfo) = @_; + $et or return 1; # allow dummy access to autoload this package + my ($buff, $footer, $dirBuff, $tagTablePtr); + my $raf = $$dirInfo{RAF}; + my $outfile = $$dirInfo{OutFile}; + my $offset = $$dirInfo{Offset} || 0; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my $rtnVal = 0; + + $$dirInfo{DirLen} = 0; # initialize returned trailer length + $raf->Seek(-$offset, 2); # seek to specified offset from end of file + + # loop through FotoStation records + for (;;) { + # look for trailer signature + last unless $raf->Seek(-10, 1) and $raf->Read($footer, 10) == 10; + my ($tag, $size, $sig) = unpack('nNN', $footer); + last unless $sig == 0xa1b2c3d4 and $size >= 10 and $raf->Seek(-$size, 1); + $size -= 10; # size of data only + last unless $raf->Read($buff, $size) == $size; + $raf->Seek(-$size, 1); + # set variables returned in dirInfo hash + $$dirInfo{DataPos} = $raf->Tell(); + $$dirInfo{DirLen} += $size + 10; + + unless ($tagTablePtr) { + $tagTablePtr = GetTagTable('Image::ExifTool::FotoStation::Main'); + SetByteOrder('MM'); # necessary for the binary data + $rtnVal = 1; # we found a valid FotoStation trailer + } + unless ($outfile) { + # print verbose trailer information + if ($verbose or $$et{HTML_DUMP}) { + $et->DumpTrailer({ + RAF => $raf, + DataPos => $$dirInfo{DataPos}, + DirLen => $size + 10, + DirName => "FotoStation_$tag", + }); + } + # extract information for this tag + $et->HandleTag($tagTablePtr, $tag, $buff, + DataPt => \$buff, + Start => 0, + Size => $size, + DataPos => $$dirInfo{DataPos}, + ); + next; + } + if ($$et{DEL_GROUP}{FotoStation}) { + $verbose and print $out " Deleting FotoStation trailer\n"; + $verbose = 0; # no more verbose messages after this + ++$$et{CHANGED}; + next; + } + # rewrite this information + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($tagInfo) { + my $newVal; + my $tagName = $$tagInfo{Name}; + if ($$tagInfo{SubDirectory}) { + my %subdirInfo = ( + DataPt => \$buff, + DirStart => 0, + DirLen => $size, + DataPos => $$dirInfo{DataPos}, + DirName => $tagName, + Parent => 'FotoStation', + ); + my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + $newVal = $et->WriteDirectory(\%subdirInfo, $subTable); + } else { + my $nvHash = $et->GetNewValueHash($tagInfo); + if ($et->IsOverwriting($nvHash) > 0) { + $newVal = $et->GetNewValue($nvHash); + $newVal = '' unless defined $newVal; + if ($verbose > 1) { + my $n = length $newVal; + print $out " - FotoStation:$tagName ($size bytes)\n" if $size; + print $out " + FotoStation:$tagName ($n bytes)\n" if $n; + } + ++$$et{CHANGED}; + } + } + if (defined $newVal) { + # note: length may be 0 here, but we write the empty record anyway + $buff = $newVal; + $size = length($newVal) + 10; + $footer = pack('nNN', $tag, $size, $sig); + } + } + if (defined $dirBuff) { + # maintain original record order + $dirBuff = $buff . $footer . $dirBuff; + } else { + $dirBuff = $buff . $footer; + } + } + # write the modified FotoStation trailer + Write($outfile, $dirBuff) or $rtnVal = -1 if $dirBuff; + return $rtnVal; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::FotoStation - Read/write FotoWare FotoStation trailer + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read and +write information from the FotoWare FotoStation trailer. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Mark Tate for information about the FotoStation data format. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/FotoStation Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/FujiFilm.pm b/lib/Image/ExifTool/FujiFilm.pm new file mode 100644 index 0000000..ba38cf9 --- /dev/null +++ b/lib/Image/ExifTool/FujiFilm.pm @@ -0,0 +1,1723 @@ +#------------------------------------------------------------------------------ +# File: FujiFilm.pm +# +# Description: Read/write FujiFilm maker notes and RAF images +# +# Revisions: 11/25/2003 - P. Harvey Created +# 11/14/2007 - PH Added ability to write RAF images +# +# References: 1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html +# 2) http://homepage3.nifty.com/kamisaka/makernote/makernote_fuji.htm (2007/09/11) +# 3) Michael Meissner private communication +# 4) Paul Samuelson private communication (S5) +# 5) http://www.cybercom.net/~dcoffin/dcraw/ +# 6) http://forums.dpreview.com/forums/readflat.asp?forum=1012&thread=31350384 +# and http://forum.photome.de/viewtopic.php?f=2&t=353&p=742#p740 +# 7) Kai Lappalainen private communication +# 8) https://exiftool.org/forum/index.php/topic,5223.0.html +# 9) Zilvinas Brobliauskas private communication +# 10) Albert Shan private communication +# 11) https://exiftool.org/forum/index.php/topic,8377.0.html +# 12) https://exiftool.org/forum/index.php/topic,9607.0.html +# 13) https://exiftool.org/forum/index.php/topic=10481.0.html +# IB) Iliah Borg private communication (LibRaw) +# JD) Jens Duttke private communication +#------------------------------------------------------------------------------ + +package Image::ExifTool::FujiFilm; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.82'; + +sub ProcessFujiDir($$$); +sub ProcessFaceRec($$$); + +# the following RAF version numbers have been tested for writing: +# (as of ExifTool 11.70, this lookup is no longer used if the version number is numerical) +my %testedRAF = ( + '0100' => 'E550, E900, F770, S5600, S6000fd, S6500fd, HS10/HS11, HS30, S200EXR, X100, XF1, X-Pro1, X-S1, XQ2 Ver1.00, X-T100, GFX 50R, XF10', + '0101' => 'X-E1, X20 Ver1.01, X-T3', + '0102' => 'S100FS, X10 Ver1.02', + '0103' => 'IS Pro Ver1.03', + '0104' => 'S5Pro Ver1.04', + '0106' => 'S5Pro Ver1.06', + '0111' => 'S5Pro Ver1.11', + '0114' => 'S9600 Ver1.00', + '0132' => 'X-T2 Ver1.32', + '0144' => 'X100T Ver1.44', + '0159' => 'S2Pro Ver1.00', + '0200' => 'X10 Ver2.00', + '0201' => 'X-H1 Ver2.01', + '0212' => 'S3Pro Ver2.12', + '0216' => 'S3Pro Ver2.16', # (NC) + '0218' => 'S3Pro Ver2.18', + '0240' => 'X-E1 Ver2.40', + '0264' => 'F700 Ver2.00', + '0266' => 'S9500 Ver1.01', + '0261' => 'X-E1 Ver2.61', + '0269' => 'S9500 Ver1.02', + '0271' => 'S3Pro Ver2.71', # UV/IR model? + '0300' => 'X-E2', + # 0400 - expect to see this for X-T1 + '0540' => 'X-T1 Ver5.40', + '0712' => 'S5000 Ver3.00', + '0716' => 'S5000 Ver3.00', # (yes, 2 RAF versions with the same Software version) + '0Dgi' => 'X-A10 Ver1.01 and X-A3 Ver1.02', # (yes, non-digits in the firmware number) +); + +my %faceCategories = ( + Format => 'int8u', + PrintConv => { BITMASK => { + 1 => 'Partner', + 2 => 'Family', + 3 => 'Friend', + }}, +); + +# FujiFilm MakerNotes tags +%Image::ExifTool::FujiFilm::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x0 => { + Name => 'Version', + Writable => 'undef', + }, + 0x0010 => { #PH/IB + Name => 'InternalSerialNumber', + Writable => 'string', + Notes => q{ + this number is unique for most models, and contains the camera model ID and + the date of manufacture + }, + # eg) "FPX20017035 592D31313034060427796060110384" + # "FPX 20495643 592D313335310701318AD010110047" (F40fd) + # HHHHHHHHHHHHyymmdd + # HHHHHHHHHHHH = camera body number in hex + # yymmdd = date of manufacture + PrintConv => q{ + if ($val =~ /^(.*?\s*)([0-9a-fA-F]*)(\d{2})(\d{2})(\d{2})(.{12})\s*\0*$/s + and $4 >= 1 and $4 <= 12 and $5 >= 1 and $5 <= 31) + { + my $yr = $3 + ($3 < 70 ? 2000 : 1900); + my $sn = pack 'H*', $2; + return "$1$sn $yr:$4:$5 $6"; + } else { + # handle a couple of models which use a slightly different format + $val =~ s/\b(592D(3[0-9])+)/pack("H*",$1).' '/e; + } + return $val; + }, + # (this inverse conversion doesn't work in all cases, so it is best to write + # the ValueConv value if an authentic internal serial number is required) + PrintConvInv => '$_=$val; s/(\S+) (19|20)(\d{2}):(\d{2}):(\d{2}) /unpack("H*",$1)."$3$4$5"/e; $_', + }, + 0x1000 => { + Name => 'Quality', + Writable => 'string', + }, + 0x1001 => { + Name => 'Sharpness', + Flags => 'PrintHex', + Writable => 'int16u', + PrintConv => { + 0x00 => '-4 (softest)', #10 + 0x01 => '-3 (very soft)', + 0x02 => '-2 (soft)', + 0x03 => '0 (normal)', + 0x04 => '+2 (hard)', + 0x05 => '+3 (very hard)', + 0x06 => '+4 (hardest)', + 0x82 => '-1 (medium soft)', #2 + 0x84 => '+1 (medium hard)', #2 + 0x8000 => 'Film Simulation', #2 + 0xffff => 'n/a', #2 + }, + }, + 0x1002 => { + Name => 'WhiteBalance', + Flags => 'PrintHex', + Writable => 'int16u', + PrintConv => { + 0x0 => 'Auto', + 0x1 => 'Auto (white priority)', #forum10890 + 0x2 => 'Auto (ambiance priority)', #forum10890 + 0x100 => 'Daylight', + 0x200 => 'Cloudy', + 0x300 => 'Daylight Fluorescent', + 0x301 => 'Day White Fluorescent', + 0x302 => 'White Fluorescent', + 0x303 => 'Warm White Fluorescent', #2/PH (S5) + 0x304 => 'Living Room Warm White Fluorescent', #2/PH (S5) + 0x400 => 'Incandescent', + 0x500 => 'Flash', #4 + 0x600 => 'Underwater', #forum6109 + 0xf00 => 'Custom', + 0xf01 => 'Custom2', #2 + 0xf02 => 'Custom3', #2 + 0xf03 => 'Custom4', #2 + 0xf04 => 'Custom5', #2 + # 0xfe0 => 'Gray Point?', #2 + 0xff0 => 'Kelvin', #4 + }, + }, + 0x1003 => { + Name => 'Saturation', + Flags => 'PrintHex', + Writable => 'int16u', + PrintConv => { + 0x0 => '0 (normal)', # # ("Color 0", ref 8) + 0x080 => '+1 (medium high)', #2 ("Color +1", ref 8) + 0x100 => '+2 (high)', # ("Color +2", ref 8) + 0x0c0 => '+3 (very high)', + 0x0e0 => '+4 (highest)', + 0x180 => '-1 (medium low)', #2 ("Color -1", ref 8) + 0x200 => 'Low', + 0x300 => 'None (B&W)', #2 + 0x301 => 'B&W Red Filter', #PH/8 + 0x302 => 'B&W Yellow Filter', #PH (X100) + 0x303 => 'B&W Green Filter', #PH/8 + 0x310 => 'B&W Sepia', #PH (X100) + 0x400 => '-2 (low)', #8 ("Color -2") + 0x4c0 => '-3 (very low)', + 0x4e0 => '-4 (lowest)', + 0x500 => 'Acros', #PH (X-Pro2) + 0x501 => 'Acros Red Filter', #PH (X-Pro2) + 0x502 => 'Acros Yellow Filter', #PH (X-Pro2) + 0x503 => 'Acros Green Filter', #PH (X-Pro2) + 0x8000 => 'Film Simulation', #2 + }, + }, + 0x1004 => { + Name => 'Contrast', + Flags => 'PrintHex', + Writable => 'int16u', + PrintConv => { + 0x0 => 'Normal', + 0x080 => 'Medium High', #2 + 0x100 => 'High', + 0x180 => 'Medium Low', #2 + 0x200 => 'Low', + 0x8000 => 'Film Simulation', #2 + }, + }, + 0x1005 => { #4 + Name => 'ColorTemperature', + Writable => 'int16u', + }, + 0x1006 => { #JD + Name => 'Contrast', + Flags => 'PrintHex', + Writable => 'int16u', + PrintConv => { + 0x0 => 'Normal', + 0x100 => 'High', + 0x300 => 'Low', + }, + }, + 0x100a => { #2 + Name => 'WhiteBalanceFineTune', + Writable => 'int32s', + Count => 2, + PrintConv => 'sprintf("Red %+d, Blue %+d", split(" ", $val))', + PrintConvInv => 'my @v=($val=~/-?\d+/g);"@v"', + }, + 0x100b => { #2 + Name => 'NoiseReduction', + Flags => 'PrintHex', + Writable => 'int16u', + RawConv => '$val == 0x100 ? undef : $val', + PrintConv => { + 0x40 => 'Low', + 0x80 => 'Normal', + 0x100 => 'n/a', #PH (NC) (all X100 samples) + }, + }, + 0x100e => { #PH (X100) + Name => 'NoiseReduction', + Flags => 'PrintHex', + Writable => 'int16u', + PrintConv => { + 0x000 => '0 (normal)', # ("NR 0, ref 8) + 0x100 => '+2 (strong)', # ("NR+2, ref 8) + 0x180 => '+1 (medium strong)', #8 ("NR+1") + 0x1c0 => '+3 (very strong)', + 0x1e0 => '+4 (strongest)', + 0x200 => '-2 (weak)', # ("NR-2, ref 8) + 0x280 => '-1 (medium weak)', #8 ("NR-1") + 0x2c0 => '-3 (very weak)', #10 (-3) + 0x2e0 => '-4 (weakest)', #10 (-4) + }, + }, + 0x1010 => { + Name => 'FujiFlashMode', + Writable => 'int16u', + PrintHex => 1, + PrintConv => { + 0 => 'Auto', + 1 => 'On', + 2 => 'Off', + 3 => 'Red-eye reduction', + 4 => 'External', #JD + 16 => 'Commander', + 0x8000 => 'Not Attached', #10 (X-T2) (or external flash off) + 0x8120 => 'TTL', #10 (X-T2) + 0x8320 => 'TTL Auto - Did not fire', + 0x9840 => 'Manual', #10 (X-T2) + 0x9860 => 'Flash Commander', #13 + 0x9880 => 'Multi-flash', #10 (X-T2) + 0xa920 => '1st Curtain (front)', #10 (EF-X500 flash) + 0xaa20 => 'TTL Slow - 1st Curtain (front)', #13 + 0xab20 => 'TTL Auto - 1st Curtain (front)', #13 + 0xad20 => 'TTL - Red-eye Flash - 1st Curtain (front)', #13 + 0xae20 => 'TTL Slow - Red-eye Flash - 1st Curtain (front)', #13 + 0xaf20 => 'TTL Auto - Red-eye Flash - 1st Curtain (front)', #13 + 0xc920 => '2nd Curtain (rear)', #10 + 0xca20 => 'TTL Slow - 2nd Curtain (rear)', #13 + 0xcb20 => 'TTL Auto - 2nd Curtain (rear)', #13 + 0xcd20 => 'TTL - Red-eye Flash - 2nd Curtain (rear)', #13 + 0xce20 => 'TTL Slow - Red-eye Flash - 2nd Curtain (rear)', #13 + 0xcf20 => 'TTL Auto - Red-eye Flash - 2nd Curtain (rear)', #13 + 0xe920 => 'High Speed Sync (HSS)', #10 + }, + }, + 0x1011 => { + Name => 'FlashExposureComp', #JD + Writable => 'rational64s', + }, + 0x1020 => { + Name => 'Macro', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 0x1021 => { + Name => 'FocusMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Auto', + 1 => 'Manual', + 65535 => 'Movie', #forum10766 + }, + }, + 0x1022 => { #8/forum6579 + Name => 'AFMode', + Writable => 'int16u', + Notes => '"No" for manual and some AF-multi focus modes', + PrintConv => { + 0 => 'No', + 1 => 'Single Point', + 256 => 'Zone', + 512 => 'Wide/Tracking', + }, + }, + 0x102b => { + Name => 'PrioritySettings', + SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::PrioritySettings' }, + }, + 0x102d => { + Name => 'FocusSettings', + SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::FocusSettings' }, + }, + 0x102e => { + Name => 'AFCSettings', + SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::AFCSettings' }, + }, + 0x1023 => { #2 + Name => 'FocusPixel', + Writable => 'int16u', + Count => 2, + }, + 0x1030 => { + Name => 'SlowSync', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 0x1031 => { + Name => 'PictureMode', + Flags => 'PrintHex', + Writable => 'int16u', + PrintConv => { + 0x0 => 'Auto', # (or 'SR+' if SceneRecognition present, ref 11) + 0x1 => 'Portrait', + 0x2 => 'Landscape', + 0x3 => 'Macro', #JD + 0x4 => 'Sports', + 0x5 => 'Night Scene', + 0x6 => 'Program AE', + 0x7 => 'Natural Light', #3 + 0x8 => 'Anti-blur', #3 + 0x9 => 'Beach & Snow', #JD + 0xa => 'Sunset', #3 + 0xb => 'Museum', #3 + 0xc => 'Party', #3 + 0xd => 'Flower', #3 + 0xe => 'Text', #3 + 0xf => 'Natural Light & Flash', #3 + 0x10 => 'Beach', #3 + 0x11 => 'Snow', #3 + 0x12 => 'Fireworks', #3 + 0x13 => 'Underwater', #3 + 0x14 => 'Portrait with Skin Correction', #7 + 0x16 => 'Panorama', #PH (X100) + 0x17 => 'Night (tripod)', #7 + 0x18 => 'Pro Low-light', #7 + 0x19 => 'Pro Focus', #7 + 0x1a => 'Portrait 2', #PH (NC, T500, maybe "Smile & Shoot"?) + 0x1b => 'Dog Face Detection', #7 + 0x1c => 'Cat Face Detection', #7 + 0x30 => 'HDR', #forum10799 + 0x40 => 'Advanced Filter', + 0x100 => 'Aperture-priority AE', + 0x200 => 'Shutter speed priority AE', + 0x300 => 'Manual', + }, + }, + 0x1032 => { #8 + Name => 'ExposureCount', + Writable => 'int16u', + Notes => 'number of exposures used for this image', + }, + 0x1033 => { #6 + Name => 'EXRAuto', + Writable => 'int16u', + PrintConv => { + 0 => 'Auto', + 1 => 'Manual', + }, + }, + 0x1034 => { #6 + Name => 'EXRMode', + Writable => 'int16u', + PrintHex => 1, + PrintConv => { + 0x100 => 'HR (High Resolution)', + 0x200 => 'SN (Signal to Noise priority)', + 0x300 => 'DR (Dynamic Range priority)', + }, + }, + 0x1040 => { #8 + Name => 'ShadowTone', + Writable => 'int32s', + PrintConv => { + -64 => '+4 (hardest)', + -48 => '+3 (very hard)', + -32 => '+2 (hard)', + -16 => '+1 (medium hard)', + 0 => '0 (normal)', + 16 => '-1 (medium soft)', + 32 => '-2 (soft)', + }, + }, + 0x1041 => { #8 + Name => 'HighlightTone', + Writable => 'int32s', + PrintConv => { + -64 => '+4 (hardest)', + -48 => '+3 (very hard)', + -32 => '+2 (hard)', + -16 => '+1 (medium hard)', + 0 => '0 (normal)', + 16 => '-1 (medium soft)', + 32 => '-2 (soft)', + }, + }, + 0x1044 => { #forum7668 + Name => 'DigitalZoom', + Writable => 'int32u', + ValueConv => '$val / 8', + ValueConvInv => '$val * 8', + }, + 0x1045 => { #12 + Name => 'LensModulationOptimizer', + Writable => 'int32u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x1047 => { #12 + Name => 'GrainEffect', + Writable => 'int32s', + PrintConv => { + 0 => 'Off', + 32 => 'Weak', + 64 => 'Strong', + }, + }, + 0x1048 => { #12 + Name => 'ColorChromeEffect', + Writable => 'int32s', + PrintConv => { + 0 => 'Off', + 32 => 'Weak', + 64 => 'Strong', + }, + }, + 0x1049 => { #12 + Name => 'BWAdjustment', + Notes => 'positive values are warm, negative values are cool', + Format => 'int8s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val + 0', + }, + # 0x104b - BWAdjustment for Green->Magenta (forum10800) + 0x104d => { #forum9634 + Name => 'CropMode', + Writable => 'int16u', + PrintConv => { # (perhaps this is a bit mask?) + 0 => 'n/a', + 1 => 'Full-frame on GFX', #IB + 2 => 'Sports Finder Mode', # (mechanical shutter) + 4 => 'Electronic Shutter 1.25x Crop', # (continuous high) + }, + }, + 0x1050 => { #forum6109 + Name => 'ShutterType', + Writable => 'int16u', + PrintConv => { + 0 => 'Mechanical', + 1 => 'Electronic', + 2 => 'Electronic (long shutter speed)', #12 + 3 => 'Electronic Front Curtain', #10 + }, + }, + # 0x1100 - This may not work well for newer cameras (ref forum12682) + 0x1100 => [{ + Name => 'AutoBracketing', + Condition => '$$self{Model} eq "X-T3"', + Notes => 'X-T3 only', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'Pre-shot', #12 (Electronic Shutter and Continuous High drive mode only) + }, + },{ + Name => 'AutoBracketing', + Notes => 'other models', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'No flash & flash', #3 + 6 => 'Pixel Shift', #IB (GFX100S) + }, + }], + 0x1101 => { + Name => 'SequenceNumber', + Writable => 'int16u', + }, + 0x1103 => { + Name => 'DriveSettings', + SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::DriveSettings' }, + }, + 0x1105 => { Name => 'PixelShiftShots', Writable => 'int16u' }, #IB + 0x1106 => { Name => 'PixelShiftOffset', Writable => 'rational64s', Count => 2 }, #IB + # (0x1150-0x1152 exist only for Pro Low-light and Pro Focus PictureModes) + # 0x1150 - Pro Low-light - val=1; Pro Focus - val=2 (ref 7); HDR - val=128 (forum10799) + # 0x1151 - Pro Low-light - val=4 (number of pictures taken?); Pro Focus - val=2,3 (ref 7); HDR - val=3 (forum10799) + # 0x1152 - Pro Low-light - val=1,3,4 (stacked pictures used?); Pro Focus - val=1,2 (ref 7); HDR - val=3 (forum10799) + 0x1153 => { #forum7668 + Name => 'PanoramaAngle', + Writable => 'int16u', + }, + 0x1154 => { #forum7668 + Name => 'PanoramaDirection', + Writable => 'int16u', + PrintConv => { + 1 => 'Right', + 2 => 'Up', + 3 => 'Left', + 4 => 'Down', + }, + }, + 0x1201 => { #forum6109 + Name => 'AdvancedFilter', + Writable => 'int32u', + PrintHex => 1, + PrintConv => { + 0x10000 => 'Pop Color', + 0x20000 => 'Hi Key', + 0x30000 => 'Toy Camera', + 0x40000 => 'Miniature', + 0x50000 => 'Dynamic Tone', + 0x60001 => 'Partial Color Red', + 0x60002 => 'Partial Color Yellow', + 0x60003 => 'Partial Color Green', + 0x60004 => 'Partial Color Blue', + 0x60005 => 'Partial Color Orange', + 0x60006 => 'Partial Color Purple', + 0x70000 => 'Soft Focus', + 0x90000 => 'Low Key', + }, + }, + 0x1210 => { #2 + Name => 'ColorMode', + Writable => 'int16u', + PrintHex => 1, + PrintConv => { + 0x00 => 'Standard', + 0x10 => 'Chrome', + 0x30 => 'B & W', + }, + }, + 0x1300 => { + Name => 'BlurWarning', + Writable => 'int16u', + PrintConv => { + 0 => 'None', + 1 => 'Blur Warning', + }, + }, + 0x1301 => { + Name => 'FocusWarning', + Writable => 'int16u', + PrintConv => { + 0 => 'Good', + 1 => 'Out of focus', + }, + }, + 0x1302 => { + Name => 'ExposureWarning', + Writable => 'int16u', + PrintConv => { + 0 => 'Good', + 1 => 'Bad exposure', + }, + }, + 0x1304 => { #PH + Name => 'GEImageSize', + Condition => '$$self{Make} =~ /^GENERAL IMAGING/', + Writable => 'string', + Notes => 'GE models only', + }, + 0x1400 => { #2 + Name => 'DynamicRange', + Writable => 'int16u', + PrintConv => { + 1 => 'Standard', + 3 => 'Wide', + # the S5Pro has 100%(STD),130%,170%,230%(W1),300%,400%(W2) - PH + }, + }, + 0x1401 => { #2 (this doesn't seem to work for the X100 - PH) + Name => 'FilmMode', + Writable => 'int16u', + PrintHex => 1, + PrintConv => { + 0x000 => 'F0/Standard (Provia)', # X-Pro2 "Provia/Standard" + 0x100 => 'F1/Studio Portrait', + 0x110 => 'F1a/Studio Portrait Enhanced Saturation', + 0x120 => 'F1b/Studio Portrait Smooth Skin Tone (Astia)', # X-Pro2 "Astia/Soft" + 0x130 => 'F1c/Studio Portrait Increased Sharpness', + 0x200 => 'F2/Fujichrome (Velvia)', # X-Pro2 "Velvia/Vivid" + 0x300 => 'F3/Studio Portrait Ex', + 0x400 => 'F4/Velvia', + 0x500 => 'Pro Neg. Std', #PH (X-Pro1) + 0x501 => 'Pro Neg. Hi', #PH (X-Pro1) + 0x600 => 'Classic Chrome', #forum6109 + 0x700 => 'Eterna', #12 + 0x800 => 'Classic Negative', #forum10536 + 0x900 => 'Bleach Bypass', #forum10890 + 0xa00 => 'Nostalgic Neg', #forum12085 + }, + }, + 0x1402 => { #2 + Name => 'DynamicRangeSetting', + Writable => 'int16u', + PrintHex => 1, + PrintConv => { + 0x000 => 'Auto', + 0x001 => 'Manual', #(ref http://forum.photome.de/viewtopic.php?f=2&t=353) + 0x100 => 'Standard (100%)', + 0x200 => 'Wide1 (230%)', + 0x201 => 'Wide2 (400%)', + 0x8000 => 'Film Simulation', + }, + }, + 0x1403 => { #2 (only valid for manual DR, ref 6) + Name => 'DevelopmentDynamicRange', + Writable => 'int16u', + # (shows 200, 400 or 800 for HDR200,HDR400,HDR800, ref forum10799) + }, + 0x1404 => { #2 + Name => 'MinFocalLength', + Writable => 'rational64s', + }, + 0x1405 => { #2 + Name => 'MaxFocalLength', + Writable => 'rational64s', + }, + 0x1406 => { #2 + Name => 'MaxApertureAtMinFocal', + Writable => 'rational64s', + }, + 0x1407 => { #2 + Name => 'MaxApertureAtMaxFocal', + Writable => 'rational64s', + }, + # 0x1408 - values: '0100', 'S100', 'VQ10' + # 0x1409 - values: same as 0x1408 + # 0x140a - values: 0, 1, 3, 5, 7 (bit 2=red-eye detection, ref 11/13) + 0x140b => { #6 + Name => 'AutoDynamicRange', + Writable => 'int16u', + PrintConv => '"$val%"', + PrintConvInv => '$val=~s/\s*\%$//; $val', + }, + 0x104e => { #forum10800 (X-Pro3) + Name => 'ColorChromeFXBlue', + Writable => 'int32s', + PrintConv => { + 0 => 'Off', + 32 => 'Weak', # (NC) + 64 => 'Strong', + }, + }, + 0x1422 => { #8 + Name => 'ImageStabilization', + Writable => 'int16u', + Count => 3, + PrintConv => [{ + 0 => 'None', + 1 => 'Optical', #PH + 2 => 'Sensor-shift', #PH (now IBIS/OIS, ref forum13708) + 3 => 'OIS Lens', #forum9815 (optical+sensor?) + 258 => 'IBIS/OIS + DIS', #forum13708 (digital on top of IBIS/OIS) + 512 => 'Digital', #PH + },{ + 0 => 'Off', + 1 => 'On (mode 1, continuous)', + 2 => 'On (mode 2, shooting only)', + }], + }, + 0x1425 => { # if present and 0x1031 PictureMode is zero, then PictureMode is SR+, not Auto (ref 11) + Name => 'SceneRecognition', + Writable => 'int16u', + PrintHex => 1, + PrintConv => { + 0 => 'Unrecognized', + 0x100 => 'Portrait Image', + 0x103 => 'Night Portrait', #forum10651 + 0x105 => 'Backlit Portrait', #forum10651 + 0x200 => 'Landscape Image', + 0x300 => 'Night Scene', + 0x400 => 'Macro', + }, + }, + 0x1431 => { #forum6109 + Name => 'Rating', + Groups => { 2 => 'Image' }, + Writable => 'int32u', + Priority => 0, + }, + 0x1436 => { #8 + Name => 'ImageGeneration', + Writable => 'int16u', + PrintConv => { + 0 => 'Original Image', + 1 => 'Re-developed from RAW', + }, + }, + 0x1438 => { #forum6579 (X-T1 firmware version 3) + Name => 'ImageCount', + Notes => 'may reset to 0 when new firmware is installed', + Writable => 'int16u', + ValueConv => '$val & 0x7fff', + ValueConvInv => '$val | 0x8000', + }, + 0x1443 => { #12 (X-T3) + Name => 'DRangePriority', + Writable => 'int16u', + PrintConv => { 0 => 'Auto', 1 => 'Fixed' }, + }, + 0x1444 => { #12 (X-T3, only exists if DRangePriority is 'Auto') + Name => 'DRangePriorityAuto', + Writable => 'int16u', + PrintConv => { + 1 => 'Weak', + 2 => 'Strong', + 3 => 'Plus', #forum10799 + }, + }, + 0x1445 => { #12 (X-T3, only exists if DRangePriority is 'Fixed') + Name => 'DRangePriorityFixed', + Writable => 'int16u', + PrintConv => { 1 => 'Weak', 2 => 'Strong' }, + }, + 0x1446 => { #12 + Name => 'FlickerReduction', + Writable => 'int32u', + # seen values: Off=0x0000, On=0x2100,0x3100 + PrintConv => q{ + my $on = ((($val >> 8) & 0x0f) == 1) ? 'On' : 'Off'; + return sprintf('%s (0x%.4x)', $on, $val); + }, + PrintConvInv => '$val=~/(0x[0-9a-f]+)/i; hex $1', + }, + 0x1447 => { Name => 'FirmwareVersion', Writable => 'string' }, + 0x1448 => { Name => 'FirmwareVersion2', Writable => 'string' }, + 0x3803 => { #forum10037 + Name => 'VideoRecordingMode', + Groups => { 2 => 'Video' }, + Writable => 'int32u', + PrintHex => 1, + PrintConv => { + 0x00 => 'Normal', + 0x10 => 'F-log', + 0x20 => 'HLG', + }, + }, + 0x3804 => { #forum10037 + Name => 'PeripheralLighting', + Groups => { 2 => 'Video' }, + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + # 0x3805 - int16u: seen 1 + 0x3806 => { #forum10037 + Name => 'VideoCompression', + Groups => { 2 => 'Video' }, + Writable => 'int16u', + PrintConv => { + 1 => 'Log GOP', + 2 => 'All Intra', + }, + }, + # 0x3810 - int32u: related to video codec (ref forum10037) + 0x3820 => { #PH (HS20EXR MOV) + Name => 'FrameRate', + Writable => 'int16u', + Groups => { 2 => 'Video' }, + }, + 0x3821 => { #PH (HS20EXR MOV) + Name => 'FrameWidth', + Writable => 'int16u', + Groups => { 2 => 'Video' }, + }, + 0x3822 => { #PH (HS20EXR MOV) + Name => 'FrameHeight', + Writable => 'int16u', + Groups => { 2 => 'Video' }, + }, + 0x3824 => { #forum10480 (X series) + Name => 'FullHDHighSpeedRec', + Writable => 'int32u', + Groups => { 2 => 'Video' }, + PrintConv => { 1 => 'Off', 2 => 'On' }, + }, + 0x4005 => { #forum9634 + Name => 'FaceElementSelected', # (could be face or eye) + Writable => 'int16u', + Count => 4, + }, + 0x4100 => { #PH + Name => 'FacesDetected', + Writable => 'int16u', + }, + 0x4103 => { #PH + Name => 'FacePositions', + Writable => 'int16u', + Count => -1, + Notes => q{ + left, top, right and bottom coordinates in full-sized image for each face + detected + }, + }, + 0x4200 => { #11 + Name => 'NumFaceElements', + Writable => 'int16u', + }, + 0x4201 => { #11 + Name => 'FaceElementTypes', + Writable => 'int8u', + Count => -1, + PrintConv => [{ + 1 => 'Face', + 2 => 'Left Eye', + 3 => 'Right Eye', + 7 => 'Body', + 8 => 'Head', + 11 => 'Bike', + 12 => 'Body of Car', + 13 => 'Front of Car', + 14 => 'Animal Body', + 15 => 'Animal Head', + 16 => 'Animal Face', + 17 => 'Animal Left Eye', + 18 => 'Animal Right Eye', + 19 => 'Bird Body', + 20 => 'Bird Head', + 21 => 'Bird Left Eye', + 22 => 'Bird Right Eye', + 23 => 'Aircraft Body', + 25 => 'Aircraft Cockpit', + 26 => 'Train Front', + 27 => 'Train Cockpit', + },'REPEAT'], + }, + # 0x4202 int8u[-1] - number of cooredinates in each rectangle? (ref 11) + 0x4203 => { #11 + Name => 'FaceElementPositions', + Writable => 'int16u', + Count => -1, + Notes => q{ + left, top, right and bottom coordinates in full-sized image for each face + element + }, + }, + # 0x4101-0x4105 - exist only if face detection active + # 0x4104 - also related to face detection (same number of entries as FacePositions) + # 0x4200 - same as 0x4100? + # 0x4203 - same as 0x4103 + # 0x4204 - same as 0x4104 + 0x4282 => { #PH + Name => 'FaceRecInfo', + SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::FaceRecInfo' }, + }, + 0x8000 => { #2 + Name => 'FileSource', + Writable => 'string', + }, + 0x8002 => { #2 + Name => 'OrderNumber', + Writable => 'int32u', + }, + 0x8003 => { #2 + Name => 'FrameNumber', + Writable => 'int16u', + }, + 0xb211 => { #PH + Name => 'Parallax', + # (value set in camera is -0.5 times this value in MPImage2... why?) + Writable => 'rational64s', + Notes => 'only found in MPImage2 of .MPO images', + }, + # 0xb212 - also found in MPIMage2 images - PH +); + +# Focus Priority settings, tag 0x102b (X-T3, ref forum 9607) +%Image::ExifTool::FujiFilm::PrioritySettings = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int16u', + WRITABLE => 1, + 0.1 => { + Name => 'AF-SPriority', + Mask => 0x000f, + PrintConv => { + 1 => 'Release', + 2 => 'Focus', + }, + }, + 0.2 => { + Name => 'AF-CPriority', + Mask => 0x00f0, + PrintConv => { + 1 => 'Release', + 2 => 'Focus', + }, + }, +); + +# Focus settings, tag 0x102d (X-T3, ref forum 9607) +%Image::ExifTool::FujiFilm::FocusSettings = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int32u', + WRITABLE => 1, + 0.1 => { + Name => 'FocusMode2', + Mask => 0x0000000f, + PrintConv => { + 0x0 => 'AF-M', + 0x1 => 'AF-S', + 0x2 => 'AF-C', + }, + }, + 0.2 => { + Name => 'PreAF', + Mask => 0x00f0, + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 0.3 => { + Name => 'AFAreaMode', + Mask => 0x0f00, + PrintConv => { + 0 => 'Single Point', + 1 => 'Zone', + 2 => 'Wide/Tracking', + }, + }, + 0.4 => { + Name => 'AFAreaPointSize', + Mask => 0xf000, + PrintConv => { + 0 => 'n/a', + OTHER => sub { return $_[0] }, + }, + }, + 0.5 => { + Name => 'AFAreaZoneSize', + Mask => 0xf0000, + PrintConv => { + 0 => 'n/a', + OTHER => sub { + my ($val, $inv) = @_; + return "$val x $val" unless $inv; + $val =~ s/ ?x.*//; + return $val; + }, + }, + }, +); + +# AF-C settings, tag 0x102e (ref forum 9607) +%Image::ExifTool::FujiFilm::AFCSettings = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int32u', + WRITABLE => 1, + 0 => { + Name => 'AF-CSetting', + PrintHex => 3, + PrintSort => 1, # sort PrintConv by value + # decode in-camera preset values (X-T3) + PrintConv => { + 0x102 => 'Set 1 (multi-purpose)', # (2,0,Auto) + 0x203 => 'Set 2 (ignore obstacles)', # (3,0,Center) + 0x122 => 'Set 3 (accelerating subject)', # (2,2,Auto) + 0x010 => 'Set 4 (suddenly appearing subject)', # (0,1,Front) + 0x123 => 'Set 5 (erratic motion)', # (3,2,Auto) + OTHER => sub { + my ($val, $inv) = @_; + return $val =~ /(0x\w+)/ ? hex $1 : undef if $inv; + return sprintf 'Set 6 (custom 0x%.3x)', $val; + }, + }, + }, + 0.1 => { + Name => 'AF-CTrackingSensitivity', + Mask => 0x000f, # (values 0-4) + }, + 0.2 => { + Name => 'AF-CSpeedTrackingSensitivity', + Mask => 0x00f0, + # (values 0-2) + }, + 0.3 => { + Name => 'AF-CZoneAreaSwitching', + Mask => 0x0f00, + PrintConv => { + 0 => 'Front', + 1 => 'Auto', + 2 => 'Center', + }, + }, +); + +# DriveMode settings, tag 0x1103 (X-T3, ref forum 9607) +%Image::ExifTool::FujiFilm::DriveSettings = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int32u', + WRITABLE => 1, + 0.1 => { + Name => 'DriveMode', + Mask => 0x000000ff, + PrintConv => { + 0 => 'Single', + 1 => 'Continuous Low', + 2 => 'Continuous High', + }, + }, + 0.2 => { + Name => 'DriveSpeed', + Mask => 0xff000000, + PrintConv => { + 0 => 'n/a', + OTHER => sub { + my ($val, $inv) = @_; + return "$val fps" unless $inv; + $val =~ s/ ?fps$//; + return $val; + }, + }, + }, +); + +# Face recognition information from FinePix F550EXR (ref PH) +%Image::ExifTool::FujiFilm::FaceRecInfo = ( + PROCESS_PROC => \&ProcessFaceRec, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + VARS => { NO_ID => 1 }, + NOTES => 'Face recognition information.', + Face1Name => { }, + Face2Name => { }, + Face3Name => { }, + Face4Name => { }, + Face5Name => { }, + Face6Name => { }, + Face7Name => { }, + Face8Name => { }, + Face1Category => { %faceCategories }, + Face2Category => { %faceCategories }, + Face3Category => { %faceCategories }, + Face4Category => { %faceCategories }, + Face5Category => { %faceCategories }, + Face6Category => { %faceCategories }, + Face7Category => { %faceCategories }, + Face8Category => { %faceCategories }, + Face1Birthday => { }, + Face2Birthday => { }, + Face3Birthday => { }, + Face4Birthday => { }, + Face5Birthday => { }, + Face6Birthday => { }, + Face7Birthday => { }, + Face8Birthday => { }, +); + +# tags in RAF images (ref 5) +%Image::ExifTool::FujiFilm::RAF = ( + PROCESS_PROC => \&ProcessFujiDir, + GROUPS => { 0 => 'RAF', 1 => 'RAF', 2 => 'Image' }, + PRIORITY => 0, # so the first RAF directory takes precedence + NOTES => q{ + FujiFilm RAF images contain meta information stored in a proprietary + FujiFilm RAF format, as well as EXIF information stored inside an embedded + JPEG preview image. The table below lists tags currently decoded from the + RAF-format information. + }, + 0x100 => { + Name => 'RawImageFullSize', + Format => 'int16u', + Groups => { 1 => 'RAF2' }, # (so RAF2 shows up in family 1 list) + Count => 2, + Notes => 'including borders', + ValueConv => 'my @v=reverse split(" ",$val);"@v"', # reverse to show width first + PrintConv => '$val=~tr/ /x/; $val', + }, + 0x110 => { + Name => 'RawImageCropTopLeft', + Format => 'int16u', + Count => 2, + Notes => 'top margin first, then left margin', + }, + 0x111 => { + Name => 'RawImageCroppedSize', + Format => 'int16u', + Count => 2, + Notes => 'including borders', + ValueConv => 'my @v=reverse split(" ",$val);"@v"', # reverse to show width first + PrintConv => '$val=~tr/ /x/; $val', + }, + 0x115 => { + Name => 'RawImageAspectRatio', + Format => 'int16u', + Count => 2, + ValueConv => 'my @v=reverse split(" ",$val);"@v"', # reverse to show width first + PrintConv => '$val=~tr/ /:/; $val', + }, + 0x121 => [ + { + Name => 'RawImageSize', + Condition => '$$self{Model} eq "FinePixS2Pro"', + Format => 'int16u', + Count => 2, + ValueConv => q{ + my @v=split(" ",$val); + $v[0]*=2, $v[1]/=2; + return "@v"; + }, + PrintConv => '$val=~tr/ /x/; $val', + }, + { + Name => 'RawImageSize', + Format => 'int16u', + Count => 2, + # values are height then width, adjusted for the layout + ValueConv => q{ + my @v=reverse split(" ",$val); + $$self{FujiLayout} and $v[0]/=2, $v[1]*=2; + return "@v"; + }, + PrintConv => '$val=~tr/ /x/; $val', + }, + ], + 0x130 => { + Name => 'FujiLayout', + Format => 'int8u', + RawConv => q{ + my ($v) = split ' ', $val; + $$self{FujiLayout} = $v & 0x80 ? 1 : 0; + return $val; + }, + }, + 0x131 => { #5 + Name => 'XTransLayout', + Description => 'X-Trans Layout', + Format => 'int8u', + Count => 36, + PrintConv => '$val =~ tr/012 /RGB/d; join " ", $val =~ /....../g', + }, + 0x2000 => { #IB + Name => 'WB_GRGBLevelsAuto', + Format => 'int16u', + Count => 4, # (ignore the duplicate values) + }, + 0x2100 => { #IB + Name => 'WB_GRGBLevelsDaylight', + Format => 'int16u', + Count => 4, + }, + 0x2200 => { #IB + Name => 'WB_GRGBLevelsCloudy', + Format => 'int16u', + Count => 4, + }, + 0x2300 => { #IB + Name => 'WB_GRGBLevelsDaylightFluor', + Format => 'int16u', + Count => 4, + }, + 0x2301 => { #IB + Name => 'WB_GRGBLevelsDayWhiteFluor', + Format => 'int16u', + Count => 4, + }, + 0x2302 => { #IB + Name => 'WB_GRGBLevelsWhiteFluorescent', + Format => 'int16u', + Count => 4, + }, + 0x2310 => { #IB + Name => 'WB_GRGBLevelsWarmWhiteFluor', + Format => 'int16u', + Count => 4, + }, + 0x2311 => { #IB + Name => 'WB_GRGBLevelsLivingRoomWarmWhiteFluor', + Format => 'int16u', + Count => 4, + }, + 0x2400 => { #IB + Name => 'WB_GRGBLevelsTungsten', + Format => 'int16u', + Count => 4, + }, + # 0x2f00 => WB_GRGBLevelsCustom: int32u count, then count * (int16u GRGBGRGB), ref IB + 0x2ff0 => { + Name => 'WB_GRGBLevels', + Format => 'int16u', + Count => 4, + }, + 0x9200 => { #Frank Markesteijn + Name => 'RelativeExposure', + Format => 'rational32s', + ValueConv => 'log($val) / log(2)', + ValueConvInv => 'exp($val * log(2))', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + # 0x9200 - relative exposure? (ref Frank Markesteijn) + 0x9650 => { #Frank Markesteijn + Name => 'RawExposureBias', + Format => 'rational32s', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 0xc000 => { + Name => 'RAFData', + SubDirectory => { + TagTable => 'Image::ExifTool::FujiFilm::RAFData', + ByteOrder => 'Little-endian', + } + }, +); + +%Image::ExifTool::FujiFilm::RAFData = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0, 4, 8 ], + FIRST_ENTRY => 0, + # (FujiFilm image dimensions are REALLY confusing) + # --> this needs some cleaning up + # [Note to self: See email from Iliah Borg for more information about WB settings in this data] + 0 => { + Name => 'RawImageWidth', + Format => 'int32u', + DataMember => 'FujiWidth', + RawConv => '$val < 10000 ? $$self{FujiWidth} = $val : undef', #5 + ValueConv => '$$self{FujiLayout} ? ($val / 2) : $val', + }, + 4 => [ + { + Name => 'RawImageWidth', + Condition => 'not $$self{FujiWidth}', + Format => 'int32u', + DataMember => 'FujiWidth', + RawConv => '$val < 10000 ? $$self{FujiWidth} = $val : undef', #PH + ValueConv => '$$self{FujiLayout} ? ($val / 2) : $val', + }, + { + Name => 'RawImageHeight', + Format => 'int32u', + DataMember => 'FujiHeight', + RawConv => '$$self{FujiHeight} = $val', + ValueConv => '$$self{FujiLayout} ? ($val * 2) : $val', + }, + ], + 8 => [ + { + Name => 'RawImageWidth', + Condition => 'not $$self{FujiWidth}', + Format => 'int32u', + DataMember => 'FujiWidth', + RawConv => '$val < 10000 ? $$self{FujiWidth} = $val : undef', #PH + ValueConv => '$$self{FujiLayout} ? ($val / 2) : $val', + }, + { + Name => 'RawImageHeight', + Condition => 'not $$self{FujiHeight}', + Format => 'int32u', + DataMember => 'FujiHeight', + RawConv => '$$self{FujiHeight} = $val', + ValueConv => '$$self{FujiLayout} ? ($val * 2) : $val', + }, + ], + 12 => { + Name => 'RawImageHeight', + Condition => 'not $$self{FujiHeight}', + Format => 'int32u', + ValueConv => '$$self{FujiLayout} ? ($val * 2) : $val', + }, +); + +# TIFF IFD-format information stored in FujiFilm RAF images (ref 5) +%Image::ExifTool::FujiFilm::IFD = ( + PROCESS_PROC => \&Image::ExifTool::Exif::ProcessExif, + GROUPS => { 0 => 'RAF', 1 => 'FujiIFD', 2 => 'Image' }, + NOTES => 'Tags found in the FujiIFD information of RAF images from some models.', + 0xf000 => { + Name => 'FujiIFD', + Groups => { 1 => 'FujiIFD' }, + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::FujiFilm::IFD', + DirName => 'FujiSubIFD', + Start => '$val', + }, + }, + 0xf001 => 'RawImageFullWidth', + 0xf002 => 'RawImageFullHeight', + 0xf003 => 'BitsPerSample', + # 0xf004 - values: 4 + # 0xf005 - values: 1374, 1668 + # 0xf006 - some sort of flag indicating packed format? + 0xf007 => { + Name => 'StripOffsets', + IsOffset => 1, + OffsetPair => 0xf008, # point to associated byte counts + }, + 0xf008 => { + Name => 'StripByteCounts', + OffsetPair => 0xf007, # point to associated offsets + }, + # 0xf009 - values: 0, 3 + 0xf00a => 'BlackLevel', #IB + 0xf00b => 'GeometricDistortionParams', #9 (rational64s[23, 35 or 43]) + 0xf00c => 'WB_GRBLevelsStandard', #IB (GRBXGRBX; X=17 is standard illuminant A, X=21 is D65) + 0xf00d => 'WB_GRBLevelsAuto', #IB + 0xf00e => 'WB_GRBLevels', + 0xf00f => 'ChromaticAberrationParams', # (rational64s[23]) + 0xf010 => 'VignettingParams', #9 (rational64s[31 or 64]) +); + +# information found in FFMV atom of MOV videos +%Image::ExifTool::FujiFilm::FFMV = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => 'Information found in the FFMV atom of MOV videos.', + 0 => { + Name => 'MovieStreamName', + Format => 'string[34]', + }, +); + +# tags in FujiFilm QuickTime videos (ref PH) +# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos) +%Image::ExifTool::FujiFilm::MOV = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => 'This information is found in MOV videos from some FujiFilm cameras.', + 0x00 => { + Name => 'Make', + Format => 'string[24]', + }, + 0x18 => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[16]', + }, + 0x2e => { # (NC) + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val ? 1 / $val : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x32 => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x3a => { # (NC) + Name => 'ExposureCompensation', + Format => 'rational64s', + PrintConv => '$val ? sprintf("%+.1f", $val) : 0', + }, +); + +#------------------------------------------------------------------------------ +# decode information from FujiFilm face recognition information +# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref +# Returns: 1 +sub ProcessFaceRec($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos} + ($$dirInfo{Base} || 0); + my $dirStart = $$dirInfo{DirStart}; + my $dirLen = $$dirInfo{DirLen}; + my $pos = $dirStart; + my $end = $dirStart + $dirLen; + my ($i, $n, $p, $val); + $et->VerboseDir('FaceRecInfo'); + for ($i=1; ; ++$i) { + last if $pos + 8 > $end; + my $off = Get32u($dataPt, $pos) + $dirStart; + my $len = Get32u($dataPt, $pos + 4); + last if $len==0 or $off>$end or $off+$len>$end or $len < 62; + # values observed for each offset (always zero if not listed): + # 0=5; 3=1; 4=4; 6=1; 10-13=numbers(constant for a given registered face) + # 15=16; 16=3; 18=1; 22=nameLen; 26=1; 27=16; 28=7; 30-33=nameLen(int32u) + # 34-37=nameOffset(int32u); 38=32; 39=16; 40=4; 42=1; 46=0,2,4,8(category) + # 50=33; 51=16; 52=7; 54-57=dateLen(int32u); 58-61=dateOffset(int32u) + $n = Get32u($dataPt, $off + 30); + $p = Get32u($dataPt, $off + 34) + $dirStart; + last if $p < $dirStart or $p + $n > $end; + $val = substr($$dataPt, $p, $n); + $et->HandleTag($tagTablePtr, "Face${i}Name", $val, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $p, + Size => $n, + ); + $n = Get32u($dataPt, $off + 54); + $p = Get32u($dataPt, $off + 58) + $dirStart; + last if $p < $dirStart or $p + $n > $end; + $val = substr($$dataPt, $p, $n); + $val =~ s/(\d{4})(\d{2})(\d{2})/$1:$2:$2/; + $et->HandleTag($tagTablePtr, "Face${i}Birthday", $val, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $p, + Size => $n, + ); + $et->HandleTag($tagTablePtr, "Face${i}Category", undef, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $off + 46, + Size => 1, + ); + $pos += 8; + } + return 1; +} + +#------------------------------------------------------------------------------ +# get information from FujiFilm RAF directory +# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref +# Returns: 1 if this was a valid FujiFilm directory +sub ProcessFujiDir($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $raf = $$dirInfo{RAF}; + my $offset = $$dirInfo{DirStart}; + $raf->Seek($offset, 0) or return 0; + my ($buff, $index); + $raf->Read($buff, 4) or return 0; + my $entries = unpack 'N', $buff; + $entries < 256 or return 0; + $et->Options('Verbose') and $et->VerboseDir('Fuji', $entries); + SetByteOrder('MM'); + my $pos = $offset + 4; + for ($index=0; $index<$entries; ++$index) { + $raf->Read($buff,4) or return 0; + $pos += 4; + my ($tag, $len) = unpack 'nn', $buff; + my ($val, $vbuf); + $raf->Read($vbuf, $len) or return 0; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($tagInfo and $$tagInfo{Format}) { + $val = ReadValue(\$vbuf, 0, $$tagInfo{Format}, $$tagInfo{Count}, $len); + next unless defined $val; + } elsif ($len == 4) { + # interpret unknown 4-byte values as int32u + $val = Get32u(\$vbuf, 0); + } else { + # treat other unknown values as binary data + $val = \$vbuf; + } + $et->HandleTag($tagTablePtr, $tag, $val, + Index => $index, + DataPt => \$vbuf, + DataPos => $pos, + Size => $len, + TagInfo => $tagInfo, + ); + $pos += $len; + } + return 1; +} + +#------------------------------------------------------------------------------ +# write information to FujiFilm RAW file (RAF) +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid RAF file, or -1 on write error +sub WriteRAF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($hdr, $jpeg, $outJpeg, $offset, $err, $buff); + + $raf->Read($hdr,0x94) == 0x94 or return 0; + $hdr =~ /^FUJIFILM/ or return 0; + my $ver = substr($hdr, 0x3c, 4); + $ver =~ /^\d{4}$/ or $testedRAF{$ver} or return 0; + + # get the position and size of embedded JPEG + my ($jpos, $jlen) = unpack('x84NN', $hdr); + # check to be sure the JPEG starts in the expected location + if ($jpos > 0x94 or $jpos < 0x68 or $jpos & 0x03) { + $et->Error("Unsupported or corrupted RAF image (version $ver)"); + return 1; + } + # check to make sure this version of RAF has been tested + #(removed in ExifTool 11.70) + #unless ($testedRAF{$ver}) { + # $et->Warn("RAF version $ver not yet tested", 1); + #} + # read the embedded JPEG + unless ($raf->Seek($jpos, 0) and $raf->Read($jpeg, $jlen) == $jlen) { + $et->Error('Error reading RAF meta information'); + return 1; + } + # use same write directories as JPEG + $et->InitWriteDirs('JPEG'); + # rewrite the embedded JPEG in memory + my %jpegInfo = ( + Parent => 'RAF', + RAF => new File::RandomAccess(\$jpeg), + OutFile => \$outJpeg, + ); + $$et{FILE_TYPE} = 'JPEG'; + my $success = $et->WriteJPEG(\%jpegInfo); + $$et{FILE_TYPE} = 'RAF'; + unless ($success and $outJpeg) { + $et->Error("Invalid RAF format"); + return 1; + } + return -1 if $success < 0; + + # rewrite the RAF image + SetByteOrder('MM'); + my $jpegLen = length $outJpeg; + # pad JPEG to an even 4 bytes (ALWAYS use padding as Fuji does) + my $pad = "\0" x (4 - ($jpegLen % 4)); + # update JPEG size in header (size without padding) + Set32u(length($outJpeg), \$hdr, 0x58); + # get pointer to start of the next RAF block + my $nextPtr = Get32u(\$hdr, 0x5c); + # determine the length of padding at the end of the original JPEG + my $oldPadLen = $nextPtr - ($jpos + $jlen); + if ($oldPadLen) { + if ($oldPadLen > 1000000 or $oldPadLen < 0 or + not $raf->Seek($jpos+$jlen, 0) or + $raf->Read($buff, $oldPadLen) != $oldPadLen) + { + $et->Error('Bad RAF pointer at 0x5c'); + return 1; + } + # make sure padding is only zero bytes (can be >100k for HS10) + # (have seen non-null padding in X-Pro1) + if ($buff =~ /[^\0]/) { + return 1 if $et->Error('Non-null bytes found in padding', 2); + } + } + # calculate offset difference due to change in JPEG size + my $ptrDiff = length($outJpeg) + length($pad) - ($jlen + $oldPadLen); + # update necessary pointers in header + foreach $offset (0x5c, 0x64, 0x78, 0x80) { + last if $offset >= $jpos; # some versions have a short header + my $oldPtr = Get32u(\$hdr, $offset); + next unless $oldPtr; # don't update if pointer is zero + Set32u($oldPtr + $ptrDiff, \$hdr, $offset); + } + # write the new header + my $outfile = $$dirInfo{OutFile}; + Write($outfile, substr($hdr, 0, $jpos)) or $err = 1; + # write the updated JPEG plus padding + Write($outfile, $outJpeg, $pad) or $err = 1; + # copy over the rest of the RAF image + unless ($raf->Seek($nextPtr, 0)) { + $et->Error('Error reading RAF image'); + return 1; + } + while ($raf->Read($buff, 65536)) { + Write($outfile, $buff) or $err = 1, last; + } + return $err ? -1 : 1; +} + +#------------------------------------------------------------------------------ +# get information from FujiFilm RAW file (RAF) +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 if this was a valid RAF file +sub ProcessRAF($$) +{ + my ($et, $dirInfo) = @_; + my ($buff, $jpeg, $warn, $offset); + + my $raf = $$dirInfo{RAF}; + $raf->Read($buff,0x5c) == 0x5c or return 0; + $buff =~ /^FUJIFILM/ or return 0; + my ($jpos, $jlen) = unpack('x84NN', $buff); + $jpos & 0x8000 and return 0; + $raf->Seek($jpos, 0) or return 0; + $raf->Read($jpeg, $jlen) == $jlen or return 0; + + $et->SetFileType(); + $et->FoundTag('RAFVersion', substr($buff, 0x3c, 4)); + + # extract information from embedded JPEG + my %dirInfo = ( + Parent => 'RAF', + RAF => new File::RandomAccess(\$jpeg), + ); + $$et{BASE} += $jpos; + my $rtnVal = $et->ProcessJPEG(\%dirInfo); + $$et{BASE} -= $jpos; + $et->FoundTag('PreviewImage', \$jpeg) if $rtnVal; + + # extract information from Fuji RAF and TIFF directories + my ($rafNum, $ifdNum) = ('',''); + foreach $offset (0x5c, 0x64, 0x78, 0x80) { + last if $offset >= $jpos; + unless ($raf->Seek($offset, 0) and $raf->Read($buff, 4)) { + $warn = 1; + last; + } + my $start = unpack('N',$buff); + next unless $start; + if ($offset == 0x64 or $offset == 0x80) { + # parse FujiIFD directory + %dirInfo = ( + RAF => $raf, + Base => $start, + ); + $$et{SET_GROUP1} = "FujiIFD$ifdNum"; + my $tagTablePtr = GetTagTable('Image::ExifTool::FujiFilm::IFD'); + # this is TIFF-format data only for some models, so no warning if it fails + $et->ProcessTIFF(\%dirInfo, $tagTablePtr, \&Image::ExifTool::ProcessTIFF); + delete $$et{SET_GROUP1}; + $ifdNum = ($ifdNum || 1) + 1; + } else { + # parse RAF directory + %dirInfo = ( + RAF => $raf, + DirStart => $start, + ); + $$et{SET_GROUP1} = "RAF$rafNum"; + my $tagTablePtr = GetTagTable('Image::ExifTool::FujiFilm::RAF'); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr) or $warn = 1; + delete $$et{SET_GROUP1}; + $rafNum = ($rafNum || 1) + 1; + } + } + $warn and $et->Warn('Possibly corrupt RAF information'); + + return $rtnVal; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::FujiFilm - Read/write FujiFilm maker notes and RAF images + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +FujiFilm maker notes in EXIF information, and to read/write FujiFilm RAW +(RAF) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html> + +=item L<http://homepage3.nifty.com/kamisaka/makernote/makernote_fuji.htm> + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=item (...plus testing with my own FinePix 2400 Zoom) + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Michael Meissner, Paul Samuelson and Jens Duttke for help decoding +some FujiFilm information. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/FujiFilm Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/GE.pm b/lib/Image/ExifTool/GE.pm new file mode 100644 index 0000000..3977f51 --- /dev/null +++ b/lib/Image/ExifTool/GE.pm @@ -0,0 +1,81 @@ +#------------------------------------------------------------------------------ +# File: GE.pm +# +# Description: General Imaging maker notes tags +# +# Revisions: 2010-12-14 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::GE; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.00'; + +sub ProcessGE2($$$); + +# GE type 1 maker notes (ref PH) +# (similar to Kodak::Type11 and Ricoh::Type2) +%Image::ExifTool::GE::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + This table lists tags found in the maker notes of some General Imaging + camera models. + }, + # 0x0104 - int32u + # 0x0200 - int32u[3] (with invalid offset of 0) + 0x0202 => { + Name => 'Macro', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + # 0x0203 - int16u: 0 + # 0x0204 - rational64u: 10/10 + # 0x0205 - rational64u: 7.249,7.34,9.47 (changes with camera model) + # 0x0206 - int16u[6] (with invalid offset of 0) + 0x0207 => { + Name => 'GEModel', + Format => 'string', + }, + 0x0300 => { + Name => 'GEMake', + Format => 'string', + }, + # 0x0500 - int16u: 0 + # 0x0600 - int32u: 0 +); + +__END__ + +=head1 NAME + +Image::ExifTool::GE - General Imaging maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +General Imaging maker notes. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/GE Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/GIF.pm b/lib/Image/ExifTool/GIF.pm new file mode 100644 index 0000000..a804795 --- /dev/null +++ b/lib/Image/ExifTool/GIF.pm @@ -0,0 +1,569 @@ +#------------------------------------------------------------------------------ +# File: GIF.pm +# +# Description: Read and write GIF meta information +# +# Revisions: 10/18/2005 - P. Harvey Separated from ExifTool.pm +# 05/23/2008 - P. Harvey Added ability to read/write XMP +# 10/28/2011 - P. Harvey Added ability to read/write ICC_Profile +# +# References: 1) http://www.w3.org/Graphics/GIF/spec-gif89a.txt +# 2) http://www.adobe.com/devnet/xmp/ +# 3) http://graphcomp.com/info/specs/ani_gif.html +# 4) http://www.color.org/icc_specs2.html +# 5) http://www.midiox.com/mmgif.htm +#------------------------------------------------------------------------------ + +package Image::ExifTool::GIF; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.19'; + +# road map of directory locations in GIF images +my %gifMap = ( + XMP => 'GIF', + ICC_Profile => 'GIF', +); + +%Image::ExifTool::GIF::Main = ( + GROUPS => { 2 => 'Image' }, + VARS => { NO_ID => 1 }, + NOTES => q{ + This table lists information extracted from GIF images. See + L<http://www.w3.org/Graphics/GIF/spec-gif89a.txt> for the official GIF89a + specification. + }, + GIFVersion => { }, + FrameCount => { Notes => 'number of animated images' }, + Text => { Notes => 'text displayed in image' }, + Comment => { + # for documentation only -- flag as writable for the docs, but + # it won't appear in the TagLookup because there is no WRITE_PROC + Writable => 2, + }, + Duration => { + Notes => 'duration of a single animation iteration', + PrintConv => 'sprintf("%.2f s",$val)', + }, + ScreenDescriptor => { + SubDirectory => { TagTable => 'Image::ExifTool::GIF::Screen' }, + }, + Extensions => { # (for documentation only) + SubDirectory => { TagTable => 'Image::ExifTool::GIF::Extensions' }, + }, + TransparentColor => { }, +); + +# GIF89a application extensions: +%Image::ExifTool::GIF::Extensions = ( + GROUPS => { 2 => 'Image' }, + NOTES => 'Tags extracted from GIF89a application extensions.', + 'NETSCAPE/2.0' => { #3 + Name => 'Animation', + SubDirectory => { TagTable => 'Image::ExifTool::GIF::Animation' }, + }, + 'XMP Data/XMP' => { #2 + Name => 'XMP', + IncludeLengthBytes => 1, # length bytes are included in the data + Writable => 2, + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, + 'ICCRGBG1/012' => { #4 + Name => 'ICC_Profile', + Writable => 2, + SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' }, + }, + 'MIDICTRL/Jon' => { #5 + Name => 'MIDIControl', + SubDirectory => { TagTable => 'Image::ExifTool::GIF::MIDIControl' }, + }, + 'MIDISONG/Dm7' => { #5 + Name => 'MIDISong', + Groups => { 2 => 'Audio' }, + Binary => 1, + }, +); + +# GIF locical screen descriptor +%Image::ExifTool::GIF::Screen = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + NOTES => 'Information extracted from the GIF logical screen descriptor.', + 0 => { + Name => 'ImageWidth', + Format => 'int16u', + }, + 2 => { + Name => 'ImageHeight', + Format => 'int16u', + }, + 4.1 => { + Name => 'HasColorMap', + Mask => 0x80, + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 4.2 => { + Name => 'ColorResolutionDepth', + Mask => 0x70, + ValueConv => '$val + 1', + }, + 4.3 => { + Name => 'BitsPerPixel', + Mask => 0x07, + ValueConv => '$val + 1', + }, + 5 => 'BackgroundColor', + 6 => { + Name => 'PixelAspectRatio', + RawConv => '$val ? $val : undef', + ValueConv => '($val + 15) / 64', + }, +); + +# GIF Netscape 2.0 animation extension (ref 3) +%Image::ExifTool::GIF::Animation = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + NOTES => 'Information extracted from the "NETSCAPE2.0" animation extension.', + 1 => { + Name => 'AnimationIterations', + Format => 'int16u', + PrintConv => '$val ? $val : "Infinite"', + }, +); + +# GIF MIDICTRL extension (ref 5) +%Image::ExifTool::GIF::MIDIControl = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + NOTES => 'Information extracted from the MIDI control block extension.', + 0 => 'MIDIControlVersion', + 1 => 'SequenceNumber', + 2 => 'MelodicPolyphony', + 3 => 'PercussivePolyphony', + 4 => { + Name => 'ChannelUsage', + Format => 'int16u', + PrintConv => 'sprintf("0x%.4x", $val)', + }, + 6 => { + Name => 'DelayTime', + Format => 'int16u', + ValueConv => '$val / 100', + PrintConv => '$val . " s"', + }, +); + +#------------------------------------------------------------------------------ +# Process meta information in GIF image +# Inputs: 0) ExifTool object reference, 1) Directory information ref +# Returns: 1 on success, 0 if this wasn't a valid GIF file, or -1 if +# an output file was specified and a write error occurred +sub ProcessGIF($$) +{ + my ($et, $dirInfo) = @_; + my $outfile = $$dirInfo{OutFile}; + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my ($a, $s, $ch, $length, $buff); + my ($err, $newComment, $setComment, $nvComment); + my ($addDirs, %doneDir); + my ($frameCount, $delayTime) = (0, 0); + + # verify this is a valid GIF file + return 0 unless $raf->Read($buff, 6) == 6 + and $buff =~ /^GIF(8[79]a)$/ + and $raf->Read($s, 7) == 7; + + my $ver = $1; + my $rtnVal = 0; + my $tagTablePtr = GetTagTable('Image::ExifTool::GIF::Main'); + SetByteOrder('II'); + + if ($outfile) { + $et->InitWriteDirs(\%gifMap, 'XMP'); # make XMP the preferred group for GIF + $addDirs = $$et{ADD_DIRS}; + # determine if we are editing the File:Comment tag + my $delGroup = $$et{DEL_GROUP}; + $newComment = $et->GetNewValue('Comment', \$nvComment); + $setComment = 1 if $nvComment or $$delGroup{File}; + # change to GIF 89a if adding comment, XMP or ICC_Profile + $buff = 'GIF89a' if $$addDirs{XMP} or $$addDirs{ICC_Profile} or defined $newComment; + Write($outfile, $buff, $s) or $err = 1; + } else { + $et->SetFileType(); # set file type + $et->HandleTag($tagTablePtr, 'GIFVersion', $ver); + $et->HandleTag($tagTablePtr, 'ScreenDescriptor', $s); + } + my $flags = Get8u(\$s, 4); + if ($flags & 0x80) { # does this image contain a color table? + # calculate color table size + $length = 3 * (2 << ($flags & 0x07)); + $raf->Read($buff, $length) == $length or return 0; # skip color table + Write($outfile, $buff) or $err = 1 if $outfile; + } +# +# loop through GIF blocks +# +Block: + for (;;) { + last unless $raf->Read($ch, 1); + # write out any new metadata now if this isn't an extension block + if ($outfile and ord($ch) != 0x21) { + # write the comment first if necessary + if (defined $newComment and $$nvComment{IsCreating}) { + # write comment marker + Write($outfile, "\x21\xfe") or $err = 1; + $verbose and print $out " + Comment = $newComment\n"; + my $len = length($newComment); + # write out the comment in 255-byte chunks, each + # chunk beginning with a length byte + my $n; + for ($n=0; $n<$len; $n+=255) { + my $size = $len - $n; + $size > 255 and $size = 255; + my $str = substr($newComment,$n,$size); + Write($outfile, pack('C',$size), $str) or $err = 1; + } + Write($outfile, "\0") or $err = 1; # empty chunk as terminator + undef $newComment; + undef $nvComment; # delete any other extraneous comments + ++$$et{CHANGED}; # increment file changed flag + } + # add application extension containing XMP block if necessary + # (this will place XMP before the first non-extension block) + if (exists $$addDirs{XMP} and not defined $doneDir{XMP}) { + $doneDir{XMP} = 1; + # write new XMP data + my $xmpTable = GetTagTable('Image::ExifTool::XMP::Main'); + my %dirInfo = ( Parent => 'GIF' ); + $verbose and print $out "Creating XMP application extension block:\n"; + $buff = $et->WriteDirectory(\%dirInfo, $xmpTable); + if (defined $buff and length $buff) { + my $lz = pack('C*',1,reverse(0..255),0); + Write($outfile, "\x21\xff\x0bXMP DataXMP", $buff, $lz) or $err = 1; + ++$doneDir{XMP}; # set to 2 to indicate we added XMP + } else { + $verbose and print $out " -> no XMP to add\n"; + } + } + # add application extension containing ICC_Profile if necessary + if (exists $$addDirs{ICC_Profile} and not defined $doneDir{ICC_Profile}) { + $doneDir{ICC_Profile} = 1; + # write new ICC_Profile + my $iccTable = GetTagTable('Image::ExifTool::ICC_Profile::Main'); + my %dirInfo = ( Parent => 'GIF' ); + $verbose and print $out "Creating ICC_Profile application extension block:\n"; + $buff = $et->WriteDirectory(\%dirInfo, $iccTable); + if (defined $buff and length $buff) { + my $pos = 0; + Write($outfile, "\x21\xff\x0bICCRGBG1012") or $err = 1; + my $len = length $buff; + while ($pos < $len) { + my $n = $len - $pos; + $n = 255 if $n > 255; + Write($outfile, chr($n), substr($buff, $pos, $n)) or $err = 1; + $pos += $n; + } + Write($outfile, "\0") or $err = 1; # write null terminator + ++$doneDir{ICC_Profile}; # set to 2 to indicate we added a new profile + } else { + $verbose and print $out " -> no ICC_Profile to add\n"; + } + } + } + if (ord($ch) == 0x2c) { + ++$frameCount; + Write($outfile, $ch) or $err = 1 if $outfile; + # image descriptor + last unless $raf->Read($buff, 8) == 8 and $raf->Read($ch, 1); + Write($outfile, $buff, $ch) or $err = 1 if $outfile; + if ($verbose) { + my ($left, $top, $w, $h) = unpack('v*', $buff); + print $out "Image: left=$left top=$top width=$w height=$h\n"; + } + if (ord($ch) & 0x80) { # does color table exist? + $length = 3 * (2 << (ord($ch) & 0x07)); + # skip the color table + last unless $raf->Read($buff, $length) == $length; + Write($outfile, $buff) or $err = 1 if $outfile; + } + # skip "LZW Minimum Code Size" byte + last unless $raf->Read($buff, 1); + Write($outfile,$buff) or $err = 1 if $outfile; + # skip image blocks + for (;;) { + last unless $raf->Read($ch, 1); + Write($outfile, $ch) or $err = 1 if $outfile; + last unless ord($ch); + last unless $raf->Read($buff, ord($ch)); + Write($outfile,$buff) or $err = 1 if $outfile; + } + next; # continue with next field + } +# last if ord($ch) == 0x3b; # normal end of GIF marker + unless (ord($ch) == 0x21) { + if ($outfile) { + Write($outfile, $ch) or $err = 1; + # copy the rest of the file + while ($raf->Read($buff, 65536)) { + Write($outfile, $buff) or $err = 1; + } + } + $rtnVal = 1; + last; + } + # get extension block type/size + last unless $raf->Read($s, 2) == 2; + # get marker and block size + ($a,$length) = unpack("C"x2, $s); + + if ($a == 0xfe) { # comment extension + + my $comment = ''; + while ($length) { + last unless $raf->Read($buff, $length) == $length; + $et->VerboseDump(\$buff) unless $outfile; + # add buffer to comment string + $comment .= $buff; + last unless $raf->Read($ch, 1); # read next block header + $length = ord($ch); # get next block size + } + last if $length; # was a read error if length isn't zero + if ($outfile) { + my $isOverwriting; + if ($setComment) { + if ($nvComment) { + $isOverwriting = $et->IsOverwriting($nvComment,$comment); + # get new comment again (may have been shifted) + $newComment = $et->GetNewValue($nvComment) if defined $newComment; + } else { + # group delete, or deleting additional comments after writing one + $isOverwriting = 1; + } + } + if ($isOverwriting) { + ++$$et{CHANGED}; # increment file changed flag + $et->VerboseValue('- Comment', $comment); + $comment = $newComment; + $et->VerboseValue('+ Comment', $comment) if defined $comment; + undef $nvComment; # just delete remaining comments + } else { + undef $setComment; # leave remaining comments alone + } + if (defined $comment) { + # write comment marker + Write($outfile, "\x21\xfe") or $err = 1; + my $len = length($comment); + # write out the comment in 255-byte chunks, each + # chunk beginning with a length byte + my $n; + for ($n=0; $n<$len; $n+=255) { + my $size = $len - $n; + $size > 255 and $size = 255; + my $str = substr($comment,$n,$size); + Write($outfile, pack('C',$size), $str) or $err = 1; + } + Write($outfile, "\0") or $err = 1; # empty chunk as terminator + } + undef $newComment; # don't write the new comment again + } else { + $rtnVal = 1; + $et->FoundTag('Comment', $comment) if $comment; + undef $comment; + # assume no more than one comment in FastScan mode + last if $et->Options('FastScan'); + } + next; + + } elsif ($a == 0xff and $length == 0x0b) { # application extension + + last unless $raf->Read($buff, $length) == $length; + my $hdr = "$ch$s$buff"; + # add "/" for readability + my $tag = substr($buff, 0, 8) . '/' . substr($buff, 8); + $tag =~ tr/\0-\x1f//d; # remove nulls and control characters + $verbose and print $out "Application Extension: $tag\n"; + + my $extTable = GetTagTable('Image::ExifTool::GIF::Extensions'); + my $extInfo = $$extTable{$tag}; + my ($subdir, $inclLen, $justCopy); + if ($extInfo) { + $subdir = $$extInfo{SubDirectory}; + $inclLen = $$extInfo{IncludeLengthBytes}; + # rewrite as-is unless this is a writable subdirectory + $justCopy = 1 if $outfile and (not $subdir or not $$extInfo{Writable}); + } else { + $justCopy = 1 if $outfile; + } + Write($outfile, $hdr) or $err = 1 if $justCopy; + + # read the extension data + my $dat = ''; + for (;;) { + $raf->Read($ch, 1) or last Block; # read next block header + $length = ord($ch) or last; # get next block size + $raf->Read($buff, $length) == $length or last Block; + Write($outfile, $ch, $buff) or $err = 1 if $justCopy; + $dat .= $inclLen ? $ch . $buff : $buff; + } + Write($outfile, "\0") if $justCopy; + + if ($subdir) { + my $dirLen = length $dat; + my $name = $$extInfo{Name}; + if ($name eq 'XMP') { + # get length of XMP without landing zone data + # (note that LZ data may not be exactly the same as what we use) + $dirLen = pos($dat) if $dat =~ /<\?xpacket end=['"][wr]['"]\?>/g; + } + my %dirInfo = ( + DataPt => \$dat, + DataLen => length $dat, + DirLen => $dirLen, + DirName => $name, + Parent => 'GIF', + ); + my $subTable = GetTagTable($$subdir{TagTable}); + if (not $outfile) { + $et->ProcessDirectory(\%dirInfo, $subTable); + } elsif ($$extInfo{Writable}) { + if ($doneDir{$name} and $doneDir{$name} > 1) { + $et->Warn("Duplicate $name block created"); + } + $buff = $et->WriteDirectory(\%dirInfo, $subTable); + if (defined $buff) { + next unless length $buff; # delete this extension if length is zero + # check for null just to be safe + $et->Error("$name contained NULL character") if $buff =~ /\0/; + $dat = $buff; + # add landing zone (without terminator, which will be added later) + $dat .= pack('C*',1,reverse(0..255)) if $$extInfo{IncludeLengthBytes}; + } # (else rewrite original data) + + $doneDir{$name} = 1; + + if ($$extInfo{IncludeLengthBytes}) { + # write data and landing zone + Write($outfile, $hdr, $dat) or $err = 1; + } else { + # write as sub-blocks + Write($outfile, $hdr) or $err = 1; + my $pos = 0; + my $len = length $dat; + while ($pos < $len) { + my $n = $len - $pos; + $n = 255 if $n > 255; + Write($outfile, chr($n), substr($dat, $pos, $n)) or $err = 1; + $pos += $n; + } + } + Write($outfile, "\0") or $err = 1; # write null terminator + } + } elsif (not $outfile) { + $et->HandleTag($extTable, $tag, $dat); + } + next; + + } elsif ($a == 0xf9 and $length == 4) { # graphic control extension + + last unless $raf->Read($buff, $length) == $length; + # sum the individual delay times + my $delay = Get16u(\$buff, 1); + $delayTime += $delay; + $verbose and printf $out "Graphic Control: delay=%.2f\n", $delay / 100; + # get transparent colour + my $bits = Get8u(\$buff, 0); + $et->HandleTag($tagTablePtr, 'TransparentColor', Get8u(\$buff,3)) if $bits & 0x01; + $raf->Seek(-$length, 1) or last; + + } elsif ($a == 0x01 and $length == 12) { # plain text extension + + last unless $raf->Read($buff, $length) == $length; + Write($outfile, $ch, $s, $buff) or $err = 1 if $outfile; + if ($verbose) { + my ($left, $top, $w, $h) = unpack('v4', $buff); + print $out "Text: left=$left top=$top width=$w height=$h\n"; + } + my $text = ''; + for (;;) { + last unless $raf->Read($ch, 1); + $length = ord($ch) or last; + last unless $raf->Read($buff, $length) == $length; + Write($outfile, $ch, $buff) or $err = 1 if $outfile; # write block + $text .= $buff; + } + Write($outfile, "\0") or $err = 1 if $outfile; # write terminator block + $et->HandleTag($tagTablePtr, 'Text', $text); + next; + } + Write($outfile, $ch, $s) or $err = 1 if $outfile; + # skip the block + while ($length) { + last unless $raf->Read($buff, $length) == $length; + Write($outfile, $buff) or $err = 1 if $outfile; + last unless $raf->Read($ch, 1); # read next block header + Write($outfile, $ch) or $err = 1 if $outfile; + $length = ord($ch); # get next block size + } + } + unless ($outfile) { + $et->HandleTag($tagTablePtr, 'FrameCount', $frameCount) if $frameCount > 1; + $et->HandleTag($tagTablePtr, 'Duration', $delayTime/100) if $delayTime; + } + + # set return value to -1 if we only had a write error + $rtnVal = -1 if $rtnVal and $err; + return $rtnVal; +} + + +1; #end + +__END__ + +=head1 NAME + +Image::ExifTool::GIF - Read and write GIF meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read and +write GIF meta information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.w3.org/Graphics/GIF/spec-gif89a.txt> + +=item L<http://www.adobe.com/devnet/xmp/> + +=item L<http://graphcomp.com/info/specs/ani_gif.html> + +=item L<http://www.color.org/icc_specs2.html> + +=item L<http://www.midiox.com/mmgif.htm> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/GIMP.pm b/lib/Image/ExifTool/GIMP.pm new file mode 100644 index 0000000..e3e7b2e --- /dev/null +++ b/lib/Image/ExifTool/GIMP.pm @@ -0,0 +1,294 @@ +#------------------------------------------------------------------------------ +# File: GIMP.pm +# +# Description: Read meta information from GIMP XCF images +# +# Revisions: 2010/10/05 - P. Harvey Created +# 2018/08/21 - PH Updated to current XCF specification (v013) +# +# References: 1) GIMP source code +# 2) https://gitlab.gnome.org/GNOME/gimp/blob/master/devel-docs/xcf.txt +#------------------------------------------------------------------------------ + +package Image::ExifTool::GIMP; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.03'; + +sub ProcessParasites($$$); + +# GIMP XCF properties (ref 2) +%Image::ExifTool::GIMP::Main = ( + GROUPS => { 2 => 'Image' }, + VARS => { ALPHA_FIRST => 1 }, + NOTES => q{ + The GNU Image Manipulation Program (GIMP) writes these tags in its native + XCF (eXperimental Computing Facilty) images. + }, + header => { SubDirectory => { TagTable => 'Image::ExifTool::GIMP::Header' } }, + # recognized properties + # 1 - ColorMap + # 17 - SamplePoints? (doc says 17 is also "PROP_SAMPLE_POINTS"??) + 17 => { + Name => 'Compression', + Format => 'int8u', + PrintConv => { + 0 => 'None', + 1 => 'RLE Encoding', + 2 => 'Zlib', + 3 => 'Fractal', + }, + }, + # 18 - Guides + 19 => { + Name => 'Resolution', + SubDirectory => { TagTable => 'Image::ExifTool::GIMP::Resolution' }, + }, + 20 => { + Name => 'Tattoo', + Format => 'int32u', + }, + 21 => { + Name => 'Parasites', + SubDirectory => { TagTable => 'Image::ExifTool::GIMP::Parasite' }, + }, + 22 => { + Name => 'Units', + Format => 'int32u', + PrintConv => { + 1 => 'Inches', + 2 => 'mm', + 3 => 'Points', + 4 => 'Picas', + }, + }, + # 23 Paths + # 24 UserUnit + # 25 Vectors +); + +# information extracted from the XCF file header (ref 2) +%Image::ExifTool::GIMP::Header = ( + GROUPS => { 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + 9 => { + Name => 'XCFVersion', + Format => 'string[5]', + DataMember => 'XCFVersion', + RawConv => '$$self{XCFVersion} = $val', + PrintConv => { + 'file' => '0', + 'v001' => '1', + 'v002' => '2', + OTHER => sub { my $val = shift; $val =~ s/^v0*//; return $val }, + }, + }, + 14 => { Name => 'ImageWidth', Format => 'int32u' }, + 18 => { Name => 'ImageHeight', Format => 'int32u' }, + 22 => { + Name => 'ColorMode', + Format => 'int32u', + PrintConv => { + 0 => 'RGB Color', + 1 => 'Grayscale', + 2 => 'Indexed Color', + }, + }, + # 26 - [XCF 4 or later] Precision +); + +# XCF resolution data (property type 19) (ref 2) +%Image::ExifTool::GIMP::Resolution = ( + GROUPS => { 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'float', + 0 => 'XResolution', + 1 => 'YResolution', +); + +# XCF "Parasite" data (property type 21) (ref 1/PH) +%Image::ExifTool::GIMP::Parasite = ( + GROUPS => { 2 => 'Image' }, + PROCESS_PROC => \&ProcessParasites, + 'gimp-comment' => { + Name => 'Comment', + Format => 'string', + }, + 'exif-data' => { + Name => 'ExifData', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + Start => 6, # starts after "Exif\0\0" header + }, + }, + 'jpeg-exif-data' => { # (deprecated, untested) + Name => 'JPEGExifData', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + Start => 6, + }, + }, + 'iptc-data' => { # (untested) + Name => 'IPTCData', + SubDirectory => { TagTable => 'Image::ExifTool::IPTC::Main' }, + }, + 'icc-profile' => { + Name => 'ICC_Profile', + SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' }, + }, + 'icc-profile-name' => { + Name => 'ICCProfileName', + Format => 'string', + }, + 'gimp-metadata' => { + Name => 'XMP', + SubDirectory => { + TagTable => 'Image::ExifTool::XMP::Main', + Start => 10, # starts after "GIMP_XMP_1" header + }, + }, + 'gimp-image-metadata' => { + Name => 'XML', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::XML' }, + }, + # Seen, but not yet decoded: + # gimp-image-grid + # jpeg-settings +); + +#------------------------------------------------------------------------------ +# Read information in a GIMP XCF parasite data (ref PH) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessParasites($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $unknown = $et->Options('Unknown') || $et->Options('Verbose'); + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart} || 0; + my $end = length $$dataPt; + $et->VerboseDir('Parasites', undef, $end); + for (;;) { + last if $pos + 4 > $end; + my $size = Get32u($dataPt, $pos); # length of tag string + $pos += 4; + last if $pos + $size + 8 > $end; + my $tag = substr($$dataPt, $pos, $size); + $pos += $size; + $tag =~ s/\0.*//s; # trim at null terminator + # my $flags = Get32u($dataPt, $pos); (ignore flags) + $size = Get32u($dataPt, $pos + 4); # length of data + $pos += 8; + last if $pos + $size > $end; + if (not $$tagTablePtr{$tag} and $unknown) { + my $name = $tag; + $name =~ tr/-_A-Za-z0-9//dc; + $name =~ s/^gimp-//; + next unless length $name; + $name = ucfirst $name; + $name =~ s/([a-z])-([a-z])/$1\u$2/g; + $name = "GIMP-$name" unless length($name) > 1; + AddTagToTable($tagTablePtr, $tag, { Name => $name, Unknown => 1 }); + } + $et->HandleTag($tagTablePtr, $tag, undef, + DataPt => $dataPt, + Start => $pos, + Size => $size, + ); + $pos += $size; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Read information in a GIMP XCF document +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid XCF file +sub ProcessXCF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + + return 0 unless $raf->Read($buff, 26) == 26; + return 0 unless $buff =~ /^gimp xcf /; + + my $tagTablePtr = GetTagTable('Image::ExifTool::GIMP::Main'); + my $verbose = $et->Options('Verbose'); + $et->SetFileType(); + SetByteOrder('MM'); + + # process the XCF header + $et->HandleTag($tagTablePtr, 'header', $buff); + + # skip over precision for XCV version 4 or later + $raf->Seek(4, 1) if $$et{XCFVersion} =~ /^v0*(\d+)/ and $1 >= 4; + + # loop through image properties + for (;;) { + $raf->Read($buff, 8) == 8 or last; + my $tag = Get32u(\$buff, 0) or last; + my $size = Get32u(\$buff, 4); + $verbose and $et->VPrint(0, "XCF property $tag ($size bytes):\n"); + unless ($$tagTablePtr{$tag}) { + $raf->Seek($size, 1); + next; + } + $raf->Read($buff, $size) == $size or last; + $et->HandleTag($tagTablePtr, $tag, undef, + DataPt => \$buff, + DataPos => $raf->Tell() - $size, + Size => $size, + ); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::GIMP - Read meta information from GIMP XCF images + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read meta +information from GIMP (GNU Image Manipulation Program) XCF (eXperimental +Computing Facility) images. This is the native image format used by the +GIMP software. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<GIMP source code> + +=item L<http://svn.gnome.org/viewvc/gimp/trunk/devel-docs/xcf.txt?view=markup> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/GIMP Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/GPS.pm b/lib/Image/ExifTool/GPS.pm new file mode 100644 index 0000000..d7f00f3 --- /dev/null +++ b/lib/Image/ExifTool/GPS.pm @@ -0,0 +1,621 @@ +#------------------------------------------------------------------------------ +# File: GPS.pm +# +# Description: EXIF GPS meta information tags +# +# Revisions: 12/09/2003 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::GPS; + +use strict; +use vars qw($VERSION); +use Image::ExifTool::Exif; + +$VERSION = '1.54'; + +my %coordConv = ( + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)', + ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)', +); + +%Image::ExifTool::GPS::Main = ( + GROUPS => { 0 => 'EXIF', 1 => 'GPS', 2 => 'Location' }, + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + WRITE_GROUP => 'GPS', + 0x0000 => { + Name => 'GPSVersionID', + Writable => 'int8u', + Mandatory => 1, + Count => 4, + PrintConv => '$val =~ tr/ /./; $val', + PrintConvInv => '$val =~ tr/./ /; $val', + }, + 0x0001 => { + Name => 'GPSLatitudeRef', + Writable => 'string', + Notes => q{ + tags 0x0001-0x0006 used for camera location according to MWG 2.0. ExifTool + will also accept a number when writing GPSLatitudeRef, positive for north + latitudes or negative for south, or a string containing N, North, S or South + }, + Count => 2, + PrintConv => { + # extract N/S if written from Composite:GPSLatitude + # (also allow writing from a signed number) + OTHER => sub { + my ($val, $inv) = @_; + return undef unless $inv; + return uc $2 if $val =~ /(^|[^A-Z])([NS])(orth|outh)?\b/i; + return $1 eq '-' ? 'S' : 'N' if $val =~ /([-+]?)\d+/; + return undef; + }, + N => 'North', + S => 'South', + }, + }, + 0x0002 => { + Name => 'GPSLatitude', + Writable => 'rational64u', + Count => 3, + %coordConv, + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val,undef,"lat")', + }, + 0x0003 => { + Name => 'GPSLongitudeRef', + Writable => 'string', + Count => 2, + Notes => q{ + ExifTool will also accept a number when writing this tag, positive for east + longitudes or negative for west, or a string containing E, East, W or West + }, + PrintConv => { + # extract E/W if written from Composite:GPSLongitude + # (also allow writing from a signed number) + OTHER => sub { + my ($val, $inv) = @_; + return undef unless $inv; + return uc $2 if $val =~ /(^|[^A-Z])([EW])(ast|est)?\b/i; + return $1 eq '-' ? 'W' : 'E' if $val =~ /([-+]?)\d+/; + return undef; + }, + E => 'East', + W => 'West', + }, + }, + 0x0004 => { + Name => 'GPSLongitude', + Writable => 'rational64u', + Count => 3, + %coordConv, + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val,undef,"lon")', + }, + 0x0005 => { + Name => 'GPSAltitudeRef', + Writable => 'int8u', + Notes => q{ + ExifTool will also accept number when writing this tag, with negative + numbers indicating below sea level + }, + PrintConv => { + OTHER => sub { + my ($val, $inv) = @_; + return undef unless $inv and $val =~ /^([-+0-9])/; + return($1 eq '-' ? 1 : 0); + }, + 0 => 'Above Sea Level', + 1 => 'Below Sea Level', + }, + }, + 0x0006 => { + Name => 'GPSAltitude', + Writable => 'rational64u', + # extricate unsigned decimal number from string + ValueConvInv => '$val=~/((?=\d|\.\d)\d*(?:\.\d*)?)/ ? $1 : undef', + PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "$val m"', + PrintConvInv => '$val=~s/\s*m$//;$val', + }, + 0x0007 => { + Name => 'GPSTimeStamp', + Groups => { 2 => 'Time' }, + Writable => 'rational64u', + Count => 3, + Shift => 'Time', + Notes => q{ + UTC time of GPS fix. When writing, date is stripped off if present, and + time is adjusted to UTC if it includes a timezone + }, + ValueConv => 'Image::ExifTool::GPS::ConvertTimeStamp($val)', + ValueConvInv => '$val=~tr/:/ /;$val', + PrintConv => 'Image::ExifTool::GPS::PrintTimeStamp($val)', + # pull time out of any format date/time string + # (converting to UTC if a timezone is given) + PrintConvInv => sub { + my ($v, $et) = @_; + $v = $et->TimeNow() if lc($v) eq 'now'; + my @tz; + if ($v =~ s/([-+])(\d{1,2}):?(\d{2})\s*(DST)?$//i) { # remove timezone + my $s = $1 eq '-' ? 1 : -1; # opposite sign to convert back to UTC + my $t = $2; + @tz = ($s*$2, $s*$3); + } + # (note: we must allow '.' as a time separator, eg. '10.30.00', with is tricky due to decimal seconds) + # YYYYmmddHHMMSS[.ss] format + my @a = ($v =~ /^[^\d]*\d{4}[^\d]*\d{1,2}[^\d]*\d{1,2}[^\d]*(\d{1,2})[^\d]*(\d{2})[^\d]*(\d{2}(?:\.\d+)?)[^\d]*$/); + # HHMMSS[.ss] format + @a or @a = ($v =~ /^[^\d]*(\d{1,2})[^\d]*(\d{2})[^\d]*(\d{2}(?:\.\d+)?)[^\d]*$/); + @a or warn('Invalid time (use HH:MM:SS[.ss][+/-HH:MM|Z])'), return undef; + if (@tz) { + # adjust to UTC + $a[1] += $tz[1]; + $a[0] += $tz[0]; + while ($a[1] >= 60) { $a[1] -= 60; ++$a[0] } + while ($a[1] < 0) { $a[1] += 60; --$a[0] } + $a[0] = ($a[0] + 24) % 24; + } + return join(':', @a); + }, + }, + 0x0008 => { + Name => 'GPSSatellites', + Writable => 'string', + }, + 0x0009 => { + Name => 'GPSStatus', + Writable => 'string', + Count => 2, + PrintConv => { + A => 'Measurement Active', # Exif2.2 "Measurement in progress" + V => 'Measurement Void', # Exif2.2 "Measurement Interoperability" (WTF?) + # (meaning for 'V' taken from status code in NMEA GLL and RMC sentences) + }, + }, + 0x000a => { + Name => 'GPSMeasureMode', + Writable => 'string', + Count => 2, + PrintConv => { + 2 => '2-Dimensional Measurement', + 3 => '3-Dimensional Measurement', + }, + }, + 0x000b => { + Name => 'GPSDOP', + Description => 'GPS Dilution Of Precision', + Writable => 'rational64u', + }, + 0x000c => { + Name => 'GPSSpeedRef', + Writable => 'string', + Count => 2, + PrintConv => { + K => 'km/h', + M => 'mph', + N => 'knots', + }, + }, + 0x000d => { + Name => 'GPSSpeed', + Writable => 'rational64u', + }, + 0x000e => { + Name => 'GPSTrackRef', + Writable => 'string', + Count => 2, + PrintConv => { + M => 'Magnetic North', + T => 'True North', + }, + }, + 0x000f => { + Name => 'GPSTrack', + Writable => 'rational64u', + }, + 0x0010 => { + Name => 'GPSImgDirectionRef', + Writable => 'string', + Count => 2, + PrintConv => { + M => 'Magnetic North', + T => 'True North', + }, + }, + 0x0011 => { + Name => 'GPSImgDirection', + Writable => 'rational64u', + }, + 0x0012 => { + Name => 'GPSMapDatum', + Writable => 'string', + }, + 0x0013 => { + Name => 'GPSDestLatitudeRef', + Writable => 'string', + Notes => 'tags 0x0013-0x001a used for subject location according to MWG 2.0', + Count => 2, + PrintConv => { N => 'North', S => 'South' }, + }, + 0x0014 => { + Name => 'GPSDestLatitude', + Writable => 'rational64u', + Count => 3, + %coordConv, + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val,undef,"lat")', + }, + 0x0015 => { + Name => 'GPSDestLongitudeRef', + Writable => 'string', + Count => 2, + PrintConv => { E => 'East', W => 'West' }, + }, + 0x0016 => { + Name => 'GPSDestLongitude', + Writable => 'rational64u', + Count => 3, + %coordConv, + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val,undef,"lon")', + }, + 0x0017 => { + Name => 'GPSDestBearingRef', + Writable => 'string', + Count => 2, + PrintConv => { + M => 'Magnetic North', + T => 'True North', + }, + }, + 0x0018 => { + Name => 'GPSDestBearing', + Writable => 'rational64u', + }, + 0x0019 => { + Name => 'GPSDestDistanceRef', + Writable => 'string', + Count => 2, + PrintConv => { + K => 'Kilometers', + M => 'Miles', + N => 'Nautical Miles', + }, + }, + 0x001a => { + Name => 'GPSDestDistance', + Writable => 'rational64u', + }, + 0x001b => { + Name => 'GPSProcessingMethod', + Writable => 'undef', + Notes => 'values of "GPS", "CELLID", "WLAN" or "MANUAL" by the EXIF spec.', + RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,1,$tag)', + RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)', + }, + 0x001c => { + Name => 'GPSAreaInformation', + Writable => 'undef', + RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,1,$tag)', + RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)', + }, + 0x001d => { + Name => 'GPSDateStamp', + Groups => { 2 => 'Time' }, + Writable => 'string', + Format => 'undef', # (Casio EX-H20G uses "\0" instead of ":" as a separator) + Count => 11, + Shift => 'Time', + Notes => q{ + when writing, time is stripped off if present, after adjusting date/time to + UTC if time includes a timezone. Format is YYYY:mm:dd + }, + RawConv => '$val =~ s/\0+$//; $val', + ValueConv => 'Image::ExifTool::Exif::ExifDate($val)', + ValueConvInv => '$val', + # pull date out of any format date/time string + # (and adjust to UTC if this is a full date/time/timezone value) + PrintConvInv => q{ + my $secs; + $val = $self->TimeNow() if lc($val) eq 'now'; + if ($val =~ /[-+]/ and ($secs = Image::ExifTool::GetUnixTime($val, 1))) { + $val = Image::ExifTool::ConvertUnixTime($secs); + } + return $val =~ /(\d{4}).*?(\d{2}).*?(\d{2})/ ? "$1:$2:$3" : undef; + }, + }, + 0x001e => { + Name => 'GPSDifferential', + Writable => 'int16u', + PrintConv => { + 0 => 'No Correction', + 1 => 'Differential Corrected', + }, + }, + 0x001f => { + Name => 'GPSHPositioningError', + Description => 'GPS Horizontal Positioning Error', + PrintConv => '"$val m"', + PrintConvInv => '$val=~s/\s*m$//; $val', + Writable => 'rational64u', + }, + # 0xea1c - Nokia Lumina 1020, Samsung GT-I8750, and other Windows 8 + # phones write this (padding) in GPS IFD - PH +); + +# Composite GPS tags +%Image::ExifTool::GPS::Composite = ( + GROUPS => { 2 => 'Location' }, + GPSDateTime => { + Description => 'GPS Date/Time', + Groups => { 2 => 'Time' }, + SubDoc => 1, # generate for all sub-documents + Require => { + 0 => 'GPS:GPSDateStamp', + 1 => 'GPS:GPSTimeStamp', + }, + ValueConv => '"$val[0] $val[1]Z"', + PrintConv => '$self->ConvertDateTime($val)', + }, + # Note: The following tags are used by other modules + # which must therefore require this module as necessary + GPSLatitude => { + SubDoc => 1, # generate for all sub-documents + Writable => 1, + Avoid => 1, + Priority => 1, # (necessary because Avoid sets default Priority to 0) + Require => { + 0 => 'GPS:GPSLatitude', + 1 => 'GPS:GPSLatitudeRef', + }, + WriteAlso => { + 'GPS:GPSLatitude' => '$val', + 'GPS:GPSLatitudeRef' => '$val < 0 ? "S" : "N"', + }, + ValueConv => '$val[1] =~ /^S/i ? -$val[0] : $val[0]', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")', + }, + GPSLongitude => { + SubDoc => 1, # generate for all sub-documents + Writable => 1, + Avoid => 1, + Priority => 1, + Require => { + 0 => 'GPS:GPSLongitude', + 1 => 'GPS:GPSLongitudeRef', + }, + WriteAlso => { + 'GPS:GPSLongitude' => '$val', + 'GPS:GPSLongitudeRef' => '$val < 0 ? "W" : "E"', + }, + Require => { + 0 => 'GPS:GPSLongitude', + 1 => 'GPS:GPSLongitudeRef', + }, + ValueConv => '$val[1] =~ /^W/i ? -$val[0] : $val[0]', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")', + }, + GPSAltitude => { + SubDoc => [1,3], # generate for sub-documents if Desire 1 or 3 has a chance to exist + Desire => { + 0 => 'GPS:GPSAltitude', + 1 => 'GPS:GPSAltitudeRef', + 2 => 'XMP:GPSAltitude', + 3 => 'XMP:GPSAltitudeRef', + }, + # Require either GPS:GPSAltitudeRef or XMP:GPSAltitudeRef + RawConv => '(defined $val[1] or defined $val[3]) ? $val : undef', + ValueConv => q{ + my $alt = $val[0]; + $alt = $val[2] unless defined $alt; + return undef unless defined $alt and IsFloat($alt); + return(($val[1] || $val[3]) ? -$alt : $alt); + }, + PrintConv => q{ + $val = int($val * 10) / 10; + return(($val =~ s/^-// ? "$val m Below" : "$val m Above") . " Sea Level"); + }, + }, + GPSDestLatitude => { + Require => { + 0 => 'GPS:GPSDestLatitude', + 1 => 'GPS:GPSDestLatitudeRef', + }, + ValueConv => '$val[1] =~ /^S/i ? -$val[0] : $val[0]', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + GPSDestLongitude => { + SubDoc => 1, # generate for all sub-documents + Require => { + 0 => 'GPS:GPSDestLongitude', + 1 => 'GPS:GPSDestLongitudeRef', + }, + ValueConv => '$val[1] =~ /^W/i ? -$val[0] : $val[0]', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::GPS'); + +#------------------------------------------------------------------------------ +# Convert GPS timestamp value +# Inputs: 0) raw timestamp value string +# Returns: EXIF-formatted time string +sub ConvertTimeStamp($) +{ + my $val = shift; + my ($h,$m,$s) = split ' ', $val; + my $f = (($h || 0) * 60 + ($m || 0)) * 60 + ($s || 0); + $h = int($f / 3600); $f -= $h * 3600; + $m = int($f / 60); $f -= $m * 60; + my $ss = sprintf('%012.9f', $f); + if ($ss >= 60) { + $ss = '00'; + ++$m >= 60 and $m -= 60, ++$h; + } else { + $ss =~ s/\.?0+$//; # trim trailing zeros + decimal + } + return sprintf("%.2d:%.2d:%s",$h,$m,$ss); +} + +#------------------------------------------------------------------------------ +# Print GPS timestamp +# Inputs: 0) EXIF-formatted time string +# Returns: time rounded to the nearest microsecond +sub PrintTimeStamp($) +{ + my $val = shift; + return $val unless $val =~ s/:(\d{2}\.\d+)$//; + my $s = int($1 * 1000000 + 0.5) / 1000000; + $s = "0$s" if $s < 10; + return "${val}:$s"; +} + +#------------------------------------------------------------------------------ +# Convert degrees to DMS, or whatever the current settings are +# Inputs: 0) ExifTool reference, 1) Value in degrees, +# 2) format code (0=no format, 1=CoordFormat, 2=XMP format) +# 3) 'N' or 'E' if sign is significant and N/S/E/W should be added +# Returns: DMS string +sub ToDMS($$;$$) +{ + my ($et, $val, $doPrintConv, $ref) = @_; + my ($fmt, @fmt, $num, $sign, $rtnVal); + + unless (length $val) { + # don't convert an empty value + return $val if $doPrintConv and $doPrintConv eq '1'; # avoid hiding existing tag when extracting + return undef; # avoid writing empty value + } + if ($ref) { + if ($val < 0) { + $val = -$val; + $ref = {N => 'S', E => 'W'}->{$ref}; + $sign = '-'; + } else { + $sign = '+'; + } + $ref = " $ref" unless $doPrintConv and $doPrintConv eq '2'; + } else { + $val = abs($val); + $ref = ''; + } + if ($doPrintConv) { + if ($doPrintConv eq '1') { + $fmt = $et->Options('CoordFormat'); + if (not $fmt) { + $fmt = q{%d deg %d' %.2f"} . $ref; + } elsif ($ref) { + # use signed value instead of reference direction if specified + $fmt =~ s/%\+/$sign%/g or $fmt .= $ref; + } else { + $fmt =~ s/%\+/%/g; # don't know sign, so don't print it + } + } else { + $fmt = "%d,%.8f$ref"; # use XMP format with 8 decimal minutes + } + # count (and capture) the format specifiers (max 3) + while ($fmt =~ /(%(%|[^%]*?[diouxXDOUeEfFgGcs]))/g) { + next if $1 eq '%%'; + push @fmt, $1; + last if @fmt >= 3; + } + $num = scalar @fmt; + } else { + $num = 3; + } + my @c; # coordinates (D) or (D,M) or (D,M,S) + $c[0] = $val; + if ($num > 1) { + $c[0] = int($c[0]); + $c[1] = ($val - $c[0]) * 60; + if ($num > 2) { + $c[1] = int($c[1]); + $c[2] = ($val - $c[0] - $c[1] / 60) * 3600; + } + # handle round-off errors to ensure minutes and seconds are + # less than 60 (eg. convert "72 59 60.00" to "73 0 0.00") + $c[-1] = $doPrintConv ? sprintf($fmt[-1], $c[-1]) : ($c[-1] . ''); + if ($c[-1] >= 60) { + $c[-1] -= 60; + ($c[-2] += 1) >= 60 and $num > 2 and $c[-2] -= 60, $c[-3] += 1; + } + } + if ($doPrintConv) { + $rtnVal = sprintf($fmt, @c); + # trim trailing zeros in XMP + $rtnVal =~ s/(\d)0+$ref$/$1$ref/ if $doPrintConv eq '2'; + } else { + $rtnVal = "@c$ref"; + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Convert to decimal degrees +# Inputs: 0) a string containing 1-3 decimal numbers and any amount of other garbage +# 1) true if value should be negative if coordinate ends in 'S' or 'W', +# 2) 'lat' or 'lon' to extract lat or lon from GPSCoordinates string +# Returns: Coordinate in degrees, or '' on error +sub ToDegrees($;$$) +{ + my ($val, $doSign, $coord) = @_; + return '' if $val =~ /\b(inf|undef)\b/; # ignore invalid values + # use only lat or lon part of combined GPSCoordinates inputs + if ($coord and ($coord eq 'lat' or $coord eq 'lon') and + # (two formatted coordinate values with cardinal directions, separated by a comma) + $val =~ /^(.*(?:N(?:orth)?|S(?:outh)?)),\s*(.*(?:E(?:ast)?|W(?:est)?))$/i) + { + $val = $coord eq 'lat' ? $1 : $2; + } + # extract decimal or floating point values out of any other garbage + my ($d, $m, $s) = ($val =~ /((?:[+-]?)(?=\d|\.\d)\d*(?:\.\d*)?(?:[Ee][+-]\d+)?)/g); + return '' unless defined $d; + my $deg = $d + (($m || 0) + ($s || 0)/60) / 60; + # make negative if S or W coordinate + $deg = -$deg if $doSign ? $val =~ /[^A-Z](S(outh)?|W(est)?)\s*$/i : $deg < 0; + return $deg; +} + + +1; #end + +__END__ + +=head1 NAME + +Image::ExifTool::GPS - EXIF GPS meta information tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +GPS (Global Positioning System) meta information in EXIF data. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<Image::Info|Image::Info> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/GPS Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::Info(3pm)|Image::Info> + +=cut diff --git a/lib/Image/ExifTool/GeoTiff.pm b/lib/Image/ExifTool/GeoTiff.pm new file mode 100644 index 0000000..5582bf3 --- /dev/null +++ b/lib/Image/ExifTool/GeoTiff.pm @@ -0,0 +1,2265 @@ +#------------------------------------------------------------------------------ +# File: GeoTiff.pm +# +# Description: Read GeoTiff meta information +# +# Revisions: 02/23/2004 - P. Harvey Created +# 02/25/2004 - PH Added new codes from libgeotiff-1.2.1 +# 02/01/2007 - PH Added new codes from libgeotiff-1.2.3 +# 01/22/2014 - PH Added new code from libgeotiff-1.4.0 +# 01/19/2015 - PH Added ChartTIFF tags +# +# References: 1) ftp://ftp.remotesensing.org/geotiff/libgeotiff/libgeotiff-1.1.4.tar.gz +# 2) http://www.charttiff.com/whitepapers.shtml +#------------------------------------------------------------------------------ + +package Image::ExifTool::GeoTiff; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.12'; + +# format codes for geoTiff directory entries +my %geoTiffFormat = ( + 0 => 'int16u', # (value is stored in offset, and count is 1) + 0x87af => 'int16u', # (value is stored after directory) + 0x87b0 => 'double', + 0x87b1 => 'string', +); + +my %epsg_units = ( + 9001 => 'Linear Meter', + 9002 => 'Linear Foot', + 9003 => 'Linear Foot US Survey', + 9004 => 'Linear Foot Modified American', + 9005 => 'Linear Foot Clarke', + 9006 => 'Linear Foot Indian', + 9007 => 'Linear Link', + 9008 => 'Linear Link Benoit', + 9009 => 'Linear Link Sears', + 9010 => 'Linear Chain Benoit', + 9011 => 'Linear Chain Sears', + 9012 => 'Linear Yard Sears', + 9013 => 'Linear Yard Indian', + 9014 => 'Linear Fathom', + 9015 => 'Linear Mile International Nautical', + 9101 => 'Angular Radian', + 9102 => 'Angular Degree', + 9103 => 'Angular Arc Minute', + 9104 => 'Angular Arc Second', + 9105 => 'Angular Grad', + 9106 => 'Angular Gon', + 9107 => 'Angular DMS', + 9108 => 'Angular DMS Hemisphere', + 32767 => 'User Defined', +); + +my %epsg_vertcs = ( + 0 => 'Undefined', + 5001 => 'Airy 1830 ellipsoid', + 5002 => 'Airy Modified 1849 ellipsoid', + 5003 => 'ANS ellipsoid', + 5004 => 'Bessel 1841 ellipsoid', + 5005 => 'Bessel Modified ellipsoid', + 5006 => 'Bessel Namibia ellipsoid', + 5007 => 'Clarke 1858 ellipsoid', + 5008 => 'Clarke 1866 ellipsoid', + 5010 => 'Clarke 1880 Benoit ellipsoid', + 5011 => 'Clarke 1880 IGN ellipsoid', + 5012 => 'Clarke 1880 RGS ellipsoid', + 5013 => 'Clarke 1880 Arc ellipsoid', + 5014 => 'Clarke 1880 SGA 1922 ellipsoid', + 5015 => 'Everest 1830 1937 Adjustment ellipsoid', + 5016 => 'Everest 1830 1967 Definition ellipsoid', + 5017 => 'Everest 1830 1975 Definition ellipsoid', + 5018 => 'Everest 1830 Modified ellipsoid', + 5019 => 'GRS 1980 ellipsoid', + 5020 => 'Helmert 1906 ellipsoid', + 5021 => 'INS ellipsoid', + 5022 => 'International 1924 ellipsoid', + 5023 => 'International 1967 ellipsoid', + 5024 => 'Krassowsky 1940 ellipsoid', + 5025 => 'NWL 9D ellipsoid', + 5026 => 'NWL 10D ellipsoid', + 5027 => 'Plessis 1817 ellipsoid', + 5028 => 'Struve 1860 ellipsoid', + 5029 => 'War Office ellipsoid', + 5030 => 'WGS 84 ellipsoid', + 5031 => 'GEM 10C ellipsoid', + 5032 => 'OSU86F ellipsoid', + 5033 => 'OSU91A ellipsoid', + 5101 => 'Newlyn', + 5102 => 'North American Vertical Datum 1929', + 5103 => 'North American Vertical Datum 1988', + 5104 => 'Yellow Sea 1956', + 5105 => 'Baltic Sea', + 5106 => 'Caspian Sea', + 32767 => 'User Defined', +); + +%Image::ExifTool::GeoTiff::Main = ( + GROUPS => { 2 => 'Location' }, + 1 => { + # this isn't a real GeoTiff key, but put it here + # so it will appear in tag lists since we generate it below + Name => 'GeoTiffVersion', + }, + 1024 => { + Name => 'GTModelType', + PrintConv => { + 1 => 'Projected', + 2 => 'Geographic', + 3 => 'Geocentric', + 32767 => 'User Defined', + }, + }, + 1025 => { + Name => 'GTRasterType', + PrintConv => { + 1 => 'Pixel Is Area', + 2 => 'Pixel Is Point', + 32767 => 'User Defined', + }, + }, + 1026 => 'GTCitation', + 2048 => { + Name => 'GeographicType', + PrintConv => { + # epsg_gcs + 4001 => 'Airy 1830', + 4002 => 'Airy Modified 1849', + 4003 => 'Australian National Spheroid', + 4004 => 'Bessel 1841', + 4005 => 'Bessel Modified', + 4006 => 'Bessel Namibia', + 4007 => 'Clarke 1858', + 4008 => 'Clarke 1866', + 4009 => 'Clarke 1866 Michigan', + 4010 => 'Clarke 1880 Benoit', + 4011 => 'Clarke 1880 IGN', + 4012 => 'Clarke 1880 RGS', + 4013 => 'Clarke 1880 Arc', + 4014 => 'Clarke 1880 SGA 1922', + 4015 => 'Everest 1830 1937 Adjustment', + 4016 => 'Everest 1830 1967 Definition', + 4017 => 'Everest 1830 1975 Definition', + 4018 => 'Everest 1830 Modified', + 4019 => 'GRS 1980', + 4020 => 'Helmert 1906', + 4021 => 'Indonesian National Spheroid', + 4022 => 'International 1924', + 4023 => 'International 1967', + 4024 => 'Krassowsky 1940', + 4025 => 'NWL9D', + 4026 => 'NWL10D', + 4027 => 'Plessis 1817', + 4028 => 'Struve 1860', + 4029 => 'War Office', + 4030 => 'WGS84', + 4031 => 'GEM10C', + 4032 => 'OSU86F', + 4033 => 'OSU91A', + 4034 => 'Clarke 1880', + 4035 => 'Sphere', + 4120 => 'Greek', + 4121 => 'GGRS87', + 4123 => 'KKJ', + 4124 => 'RT90', + 4133 => 'EST92', + 4815 => 'Greek Athens', + 4201 => 'Adindan', + 4202 => 'AGD66', + 4203 => 'AGD84', + 4204 => 'Ain el Abd', + 4205 => 'Afgooye', + 4206 => 'Agadez', + 4207 => 'Lisbon', + 4208 => 'Aratu', + 4209 => 'Arc 1950', + 4210 => 'Arc 1960', + 4211 => 'Batavia', + 4212 => 'Barbados', + 4213 => 'Beduaram', + 4214 => 'Beijing 1954', + 4215 => 'Belge 1950', + 4216 => 'Bermuda 1957', + 4217 => 'Bern 1898', + 4218 => 'Bogota', + 4219 => 'Bukit Rimpah', + 4220 => 'Camacupa', + 4221 => 'Campo Inchauspe', + 4222 => 'Cape', + 4223 => 'Carthage', + 4224 => 'Chua', + 4225 => 'Corrego Alegre', + 4226 => 'Cote d Ivoire', + 4227 => 'Deir ez Zor', + 4228 => 'Douala', + 4229 => 'Egypt 1907', + 4230 => 'ED50', + 4231 => 'ED87', + 4232 => 'Fahud', + 4233 => 'Gandajika 1970', + 4234 => 'Garoua', + 4235 => 'Guyane Francaise', + 4236 => 'Hu Tzu Shan', + 4237 => 'HD72', + 4238 => 'ID74', + 4239 => 'Indian 1954', + 4240 => 'Indian 1975', + 4241 => 'Jamaica 1875', + 4242 => 'JAD69', + 4243 => 'Kalianpur', + 4244 => 'Kandawala', + 4245 => 'Kertau', + 4246 => 'KOC', + 4247 => 'La Canoa', + 4248 => 'PSAD56', + 4249 => 'Lake', + 4250 => 'Leigon', + 4251 => 'Liberia 1964', + 4252 => 'Lome', + 4253 => 'Luzon 1911', + 4254 => 'Hito XVIII 1963', + 4255 => 'Herat North', + 4256 => 'Mahe 1971', + 4257 => 'Makassar', + 4258 => 'EUREF89', + 4259 => 'Malongo 1987', + 4260 => 'Manoca', + 4261 => 'Merchich', + 4262 => 'Massawa', + 4263 => 'Minna', + 4264 => 'Mhast', + 4265 => 'Monte Mario', + 4266 => 'M poraloko', + 4267 => 'NAD27', + 4268 => 'NAD Michigan', + 4269 => 'NAD83', + 4270 => 'Nahrwan 1967', + 4271 => 'Naparima 1972', + 4272 => 'GD49', + 4273 => 'NGO 1948', + 4274 => '73', + 4275 => 'NTF', + 4276 => 'NSWC 9Z 2', + 4277 => 'OSGB 1936', + 4278 => 'OSGB70', + 4279 => 'OS SN80', + 4280 => 'Padang', + 4281 => 'Palestine 1923', + 4282 => 'Pointe Noire', + 4283 => 'GDA94', + 4284 => 'Pulkovo 1942', + 4285 => 'Qatar', + 4286 => 'Qatar 1948', + 4287 => 'Qornoq', + 4288 => 'Loma Quintana', + 4289 => 'Amersfoort', + 4290 => 'RT38', + 4291 => 'SAD69', + 4292 => 'Sapper Hill 1943', + 4293 => 'Schwarzeck', + 4294 => 'Segora', + 4295 => 'Serindung', + 4296 => 'Sudan', + 4297 => 'Tananarive', + 4298 => 'Timbalai 1948', + 4299 => 'TM65', + 4300 => 'TM75', + 4301 => 'Tokyo', + 4302 => 'Trinidad 1903', + 4303 => 'TC 1948', + 4304 => 'Voirol 1875', + 4305 => 'Voirol Unifie', + 4306 => 'Bern 1938', + 4307 => 'Nord Sahara 1959', + 4308 => 'Stockholm 1938', + 4309 => 'Yacare', + 4310 => 'Yoff', + 4311 => 'Zanderij', + 4312 => 'MGI', + 4313 => 'Belge 1972', + 4314 => 'DHDN', + 4315 => 'Conakry 1905', + 4317 => 'Dealul Piscului 1970', + 4322 => 'WGS 72', + 4324 => 'WGS 72BE', + 4326 => 'WGS 84', + 4801 => 'Bern 1898 Bern', + 4802 => 'Bogota Bogota', + 4803 => 'Lisbon Lisbon', + 4804 => 'Makassar Jakarta', + 4805 => 'MGI Ferro', + 4806 => 'Monte Mario Rome', + 4807 => 'NTF Paris', + 4808 => 'Padang Jakarta', + 4809 => 'Belge 1950 Brussels', + 4810 => 'Tananarive Paris', + 4811 => 'Voirol 1875 Paris', + 4812 => 'Voirol Unifie Paris', + 4813 => 'Batavia Jakarta', + 4901 => 'ATF Paris', + 4902 => 'NDG Paris', + 32767 => 'User Defined', + }, + }, + 2049 => 'GeogCitation', + 2050 => { + Name => 'GeogGeodeticDatum', + PrintConv => { + # epsg_datum, + 6001 => 'Airy 1830', + 6002 => 'Airy Modified 1849', + 6003 => 'Australian National Spheroid', + 6004 => 'Bessel 1841', + 6005 => 'Bessel Modified', + 6006 => 'Bessel Namibia', + 6007 => 'Clarke 1858', + 6008 => 'Clarke 1866', + 6009 => 'Clarke 1866 Michigan', + 6010 => 'Clarke 1880 Benoit', + 6011 => 'Clarke 1880 IGN', + 6012 => 'Clarke 1880 RGS', + 6013 => 'Clarke 1880 Arc', + 6014 => 'Clarke 1880 SGA 1922', + 6015 => 'Everest 1830 1937 Adjustment', + 6016 => 'Everest 1830 1967 Definition', + 6017 => 'Everest 1830 1975 Definition', + 6018 => 'Everest 1830 Modified', + 6019 => 'GRS 1980', + 6020 => 'Helmert 1906', + 6021 => 'Indonesian National Spheroid', + 6022 => 'International 1924', + 6023 => 'International 1967', + 6024 => 'Krassowsky 1960', + 6025 => 'NWL9D', + 6026 => 'NWL10D', + 6027 => 'Plessis 1817', + 6028 => 'Struve 1860', + 6029 => 'War Office', + 6030 => 'WGS84', + 6031 => 'GEM10C', + 6032 => 'OSU86F', + 6033 => 'OSU91A', + 6034 => 'Clarke 1880', + 6035 => 'Sphere', + 6201 => 'Adindan', + 6202 => 'Australian Geodetic Datum 1966', + 6203 => 'Australian Geodetic Datum 1984', + 6204 => 'Ain el Abd 1970', + 6205 => 'Afgooye', + 6206 => 'Agadez', + 6207 => 'Lisbon', + 6208 => 'Aratu', + 6209 => 'Arc 1950', + 6210 => 'Arc 1960', + 6211 => 'Batavia', + 6212 => 'Barbados', + 6213 => 'Beduaram', + 6214 => 'Beijing 1954', + 6215 => 'Reseau National Belge 1950', + 6216 => 'Bermuda 1957', + 6217 => 'Bern 1898', + 6218 => 'Bogota', + 6219 => 'Bukit Rimpah', + 6220 => 'Camacupa', + 6221 => 'Campo Inchauspe', + 6222 => 'Cape', + 6223 => 'Carthage', + 6224 => 'Chua', + 6225 => 'Corrego Alegre', + 6226 => 'Cote d Ivoire', + 6227 => 'Deir ez Zor', + 6228 => 'Douala', + 6229 => 'Egypt 1907', + 6230 => 'European Datum 1950', + 6231 => 'European Datum 1987', + 6232 => 'Fahud', + 6233 => 'Gandajika 1970', + 6234 => 'Garoua', + 6235 => 'Guyane Francaise', + 6236 => 'Hu Tzu Shan', + 6237 => 'Hungarian Datum 1972', + 6238 => 'Indonesian Datum 1974', + 6239 => 'Indian 1954', + 6240 => 'Indian 1975', + 6241 => 'Jamaica 1875', + 6242 => 'Jamaica 1969', + 6243 => 'Kalianpur', + 6244 => 'Kandawala', + 6245 => 'Kertau', + 6246 => 'Kuwait Oil Company', + 6247 => 'La Canoa', + 6248 => 'Provisional S American Datum 1956', + 6249 => 'Lake', + 6250 => 'Leigon', + 6251 => 'Liberia 1964', + 6252 => 'Lome', + 6253 => 'Luzon 1911', + 6254 => 'Hito XVIII 1963', + 6255 => 'Herat North', + 6256 => 'Mahe 1971', + 6257 => 'Makassar', + 6258 => 'European Reference System 1989', + 6259 => 'Malongo 1987', + 6260 => 'Manoca', + 6261 => 'Merchich', + 6262 => 'Massawa', + 6263 => 'Minna', + 6264 => 'Mhast', + 6265 => 'Monte Mario', + 6266 => 'M poraloko', + 6267 => 'North American Datum 1927', + 6268 => 'NAD Michigan', + 6269 => 'North American Datum 1983', + 6270 => 'Nahrwan 1967', + 6271 => 'Naparima 1972', + 6272 => 'New Zealand Geodetic Datum 1949', + 6273 => 'NGO 1948', + 6274 => 'Datum 73', + 6275 => 'Nouvelle Triangulation Francaise', + 6276 => 'NSWC 9Z 2', + 6277 => 'OSGB 1936', + 6278 => 'OSGB 1970 SN', + 6279 => 'OS SN 1980', + 6280 => 'Padang 1884', + 6281 => 'Palestine 1923', + 6282 => 'Pointe Noire', + 6283 => 'Geocentric Datum of Australia 1994', + 6284 => 'Pulkovo 1942', + 6285 => 'Qatar', + 6286 => 'Qatar 1948', + 6287 => 'Qornoq', + 6288 => 'Loma Quintana', + 6289 => 'Amersfoort', + 6290 => 'RT38', + 6291 => 'South American Datum 1969', + 6292 => 'Sapper Hill 1943', + 6293 => 'Schwarzeck', + 6294 => 'Segora', + 6295 => 'Serindung', + 6296 => 'Sudan', + 6297 => 'Tananarive 1925', + 6298 => 'Timbalai 1948', + 6299 => 'TM65', + 6300 => 'TM75', + 6301 => 'Tokyo', + 6302 => 'Trinidad 1903', + 6303 => 'Trucial Coast 1948', + 6304 => 'Voirol 1875', + 6305 => 'Voirol Unifie 1960', + 6306 => 'Bern 1938', + 6307 => 'Nord Sahara 1959', + 6308 => 'Stockholm 1938', + 6309 => 'Yacare', + 6310 => 'Yoff', + 6311 => 'Zanderij', + 6312 => 'Militar Geographische Institut', + 6313 => 'Reseau National Belge 1972', + 6314 => 'Deutsche Hauptdreiecksnetz', + 6315 => 'Conakry 1905', + 6317 => 'Dealul Piscului 1970', + 6322 => 'WGS72', + 6324 => 'WGS72 Transit Broadcast Ephemeris', + 6326 => 'WGS84', + 6901 => 'Ancienne Triangulation Francaise', + 6902 => 'Nord de Guerre', + 32767 => 'User Defined', + }, + }, + 2051 => { + Name => 'GeogPrimeMeridian', + PrintConv => { + # epsg_pm + 8901 => 'Greenwich', + 8902 => 'Lisbon', + 8903 => 'Paris', + 8904 => 'Bogota', + 8905 => 'Madrid', + 8906 => 'Rome', + 8907 => 'Bern', + 8908 => 'Jakarta', + 8909 => 'Ferro', + 8910 => 'Brussels', + 8911 => 'Stockholm', + 32767 => 'User Defined', + }, + }, + 2052 => { + Name => 'GeogLinearUnits', + SeparateTable => 'Units', + PrintConv => \%epsg_units, + }, + 2053 => 'GeogLinearUnitSize', + 2054 => { + Name => 'GeogAngularUnits', + SeparateTable => 'Units', + PrintConv => \%epsg_units, + }, + 2055 => 'GeogAngularUnitSize', + 2056 => { + Name => 'GeogEllipsoid', + PrintConv => { + # epsg_ellipse + 7001 => 'Airy 1830', + 7002 => 'Airy Modified 1849', + 7003 => 'Australian National Spheroid', + 7004 => 'Bessel 1841', + 7005 => 'Bessel Modified', + 7006 => 'Bessel Namibia', + 7007 => 'Clarke 1858', + 7008 => 'Clarke 1866', + 7009 => 'Clarke 1866 Michigan', + 7010 => 'Clarke 1880 Benoit', + 7011 => 'Clarke 1880 IGN', + 7012 => 'Clarke 1880 RGS', + 7013 => 'Clarke 1880 Arc', + 7014 => 'Clarke 1880 SGA 1922', + 7015 => 'Everest 1830 1937 Adjustment', + 7016 => 'Everest 1830 1967 Definition', + 7017 => 'Everest 1830 1975 Definition', + 7018 => 'Everest 1830 Modified', + 7019 => 'GRS 1980', + 7020 => 'Helmert 1906', + 7021 => 'Indonesian National Spheroid', + 7022 => 'International 1924', + 7023 => 'International 1967', + 7024 => 'Krassowsky 1940', + 7025 => 'NWL 9D', + 7026 => 'NWL 10D', + 7027 => 'Plessis 1817', + 7028 => 'Struve 1860', + 7029 => 'War Office', + 7030 => 'WGS 84', + 7031 => 'GEM 10C', + 7032 => 'OSU86F', + 7033 => 'OSU91A', + 7034 => 'Clarke 1880', + 7035 => 'Sphere', + 32767 => 'User Defined', + }, + }, + 2057 => 'GeogSemiMajorAxis', + 2058 => 'GeogSemiMinorAxis', + 2059 => 'GeogInvFlattening', + 2060 => { + Name => 'GeogAzimuthUnits', + SeparateTable => 'Units', + PrintConv => \%epsg_units, + }, + 2061 => 'GeogPrimeMeridianLong', + 2062 => 'GeogToWGS84', + 3072 => { + Name => 'ProjectedCSType', + PrintConv => { + # epsg_pcs + 2100 => 'GGRS87 Greek Grid', + 2176 => 'ETRS89 Poland CS2000 zone 5', + 2177 => 'ETRS89 Poland CS2000 zone 6', + 2177 => 'ETRS89 Poland CS2000 zone 7', + 2178 => 'ETRS89 Poland CS2000 zone 8', + 2180 => 'ETRS89 Poland CS92', + 2204 => 'NAD27 Tennessee', + 2205 => 'NAD83 Kentucky North', + 2391 => 'KKJ Finland zone 1', + 2392 => 'KKJ Finland zone 2', + 2393 => 'KKJ Finland zone 3', + 2394 => 'KKJ Finland zone 4', + 2400 => 'RT90 2 5 gon W', + 2600 => 'Lietuvos Koordinoei Sistema 1994', + 3053 => 'Hjorsey 1955 Lambert', + 3057 => 'ISN93 Lambert 1993', + 3300 => 'Estonian Coordinate System of 1992', + 3786 => 'Popular Visualisation CRS / Mercator', #PH (NC) + 3857 => 'WGS 84 / Pseudo-Mercator', #PH (NC) + 20137 => 'Adindan UTM zone 37N', + 20138 => 'Adindan UTM zone 38N', + 20248 => 'AGD66 AMG zone 48', + 20249 => 'AGD66 AMG zone 49', + 20250 => 'AGD66 AMG zone 50', + 20251 => 'AGD66 AMG zone 51', + 20252 => 'AGD66 AMG zone 52', + 20253 => 'AGD66 AMG zone 53', + 20254 => 'AGD66 AMG zone 54', + 20255 => 'AGD66 AMG zone 55', + 20256 => 'AGD66 AMG zone 56', + 20257 => 'AGD66 AMG zone 57', + 20258 => 'AGD66 AMG zone 58', + 20348 => 'AGD84 AMG zone 48', + 20349 => 'AGD84 AMG zone 49', + 20350 => 'AGD84 AMG zone 50', + 20351 => 'AGD84 AMG zone 51', + 20352 => 'AGD84 AMG zone 52', + 20353 => 'AGD84 AMG zone 53', + 20354 => 'AGD84 AMG zone 54', + 20355 => 'AGD84 AMG zone 55', + 20356 => 'AGD84 AMG zone 56', + 20357 => 'AGD84 AMG zone 57', + 20358 => 'AGD84 AMG zone 58', + 20437 => 'Ain el Abd UTM zone 37N', + 20438 => 'Ain el Abd UTM zone 38N', + 20439 => 'Ain el Abd UTM zone 39N', + 20499 => 'Ain el Abd Bahrain Grid', + 20538 => 'Afgooye UTM zone 38N', + 20539 => 'Afgooye UTM zone 39N', + 20700 => 'Lisbon Portuguese Grid', + 20822 => 'Aratu UTM zone 22S', + 20823 => 'Aratu UTM zone 23S', + 20824 => 'Aratu UTM zone 24S', + 20973 => 'Arc 1950 Lo13', + 20975 => 'Arc 1950 Lo15', + 20977 => 'Arc 1950 Lo17', + 20979 => 'Arc 1950 Lo19', + 20981 => 'Arc 1950 Lo21', + 20983 => 'Arc 1950 Lo23', + 20985 => 'Arc 1950 Lo25', + 20987 => 'Arc 1950 Lo27', + 20989 => 'Arc 1950 Lo29', + 20991 => 'Arc 1950 Lo31', + 20993 => 'Arc 1950 Lo33', + 20995 => 'Arc 1950 Lo35', + 21100 => 'Batavia NEIEZ', + 21148 => 'Batavia UTM zone 48S', + 21149 => 'Batavia UTM zone 49S', + 21150 => 'Batavia UTM zone 50S', + 21413 => 'Beijing Gauss zone 13', + 21414 => 'Beijing Gauss zone 14', + 21415 => 'Beijing Gauss zone 15', + 21416 => 'Beijing Gauss zone 16', + 21417 => 'Beijing Gauss zone 17', + 21418 => 'Beijing Gauss zone 18', + 21419 => 'Beijing Gauss zone 19', + 21420 => 'Beijing Gauss zone 20', + 21421 => 'Beijing Gauss zone 21', + 21422 => 'Beijing Gauss zone 22', + 21423 => 'Beijing Gauss zone 23', + 21473 => 'Beijing Gauss 13N', + 21474 => 'Beijing Gauss 14N', + 21475 => 'Beijing Gauss 15N', + 21476 => 'Beijing Gauss 16N', + 21477 => 'Beijing Gauss 17N', + 21478 => 'Beijing Gauss 18N', + 21479 => 'Beijing Gauss 19N', + 21480 => 'Beijing Gauss 20N', + 21481 => 'Beijing Gauss 21N', + 21482 => 'Beijing Gauss 22N', + 21483 => 'Beijing Gauss 23N', + 21500 => 'Belge Lambert 50', + 21790 => 'Bern 1898 Swiss Old', + 21817 => 'Bogota UTM zone 17N', + 21818 => 'Bogota UTM zone 18N', + 21891 => 'Bogota Colombia 3W', + 21892 => 'Bogota Colombia Bogota', + 21893 => 'Bogota Colombia 3E', + 21894 => 'Bogota Colombia 6E', + 22032 => 'Camacupa UTM 32S', + 22033 => 'Camacupa UTM 33S', + 22191 => 'C Inchauspe Argentina 1', + 22192 => 'C Inchauspe Argentina 2', + 22193 => 'C Inchauspe Argentina 3', + 22194 => 'C Inchauspe Argentina 4', + 22195 => 'C Inchauspe Argentina 5', + 22196 => 'C Inchauspe Argentina 6', + 22197 => 'C Inchauspe Argentina 7', + 22332 => 'Carthage UTM zone 32N', + 22391 => 'Carthage Nord Tunisie', + 22392 => 'Carthage Sud Tunisie', + 22523 => 'Corrego Alegre UTM 23S', + 22524 => 'Corrego Alegre UTM 24S', + 22832 => 'Douala UTM zone 32N', + 22992 => 'Egypt 1907 Red Belt', + 22993 => 'Egypt 1907 Purple Belt', + 22994 => 'Egypt 1907 Ext Purple', + 23028 => 'ED50 UTM zone 28N', + 23029 => 'ED50 UTM zone 29N', + 23030 => 'ED50 UTM zone 30N', + 23031 => 'ED50 UTM zone 31N', + 23032 => 'ED50 UTM zone 32N', + 23033 => 'ED50 UTM zone 33N', + 23034 => 'ED50 UTM zone 34N', + 23035 => 'ED50 UTM zone 35N', + 23036 => 'ED50 UTM zone 36N', + 23037 => 'ED50 UTM zone 37N', + 23038 => 'ED50 UTM zone 38N', + 23239 => 'Fahud UTM zone 39N', + 23240 => 'Fahud UTM zone 40N', + 23433 => 'Garoua UTM zone 33N', + 23700 => 'HD72 EOV', + 23846 => 'ID74 UTM zone 46N', + 23847 => 'ID74 UTM zone 47N', + 23848 => 'ID74 UTM zone 48N', + 23849 => 'ID74 UTM zone 49N', + 23850 => 'ID74 UTM zone 50N', + 23851 => 'ID74 UTM zone 51N', + 23852 => 'ID74 UTM zone 52N', + 23853 => 'ID74 UTM zone 53N', + 23886 => 'ID74 UTM zone 46S', + 23887 => 'ID74 UTM zone 47S', + 23888 => 'ID74 UTM zone 48S', + 23889 => 'ID74 UTM zone 49S', + 23890 => 'ID74 UTM zone 50S', + 23891 => 'ID74 UTM zone 51S', + 23892 => 'ID74 UTM zone 52S', + 23893 => 'ID74 UTM zone 53S', + 23894 => 'ID74 UTM zone 54S', + 23947 => 'Indian 1954 UTM 47N', + 23948 => 'Indian 1954 UTM 48N', + 24047 => 'Indian 1975 UTM 47N', + 24048 => 'Indian 1975 UTM 48N', + 24100 => 'Jamaica 1875 Old Grid', + 24200 => 'JAD69 Jamaica Grid', + 24370 => 'Kalianpur India 0', + 24371 => 'Kalianpur India I', + 24372 => 'Kalianpur India IIa', + 24373 => 'Kalianpur India IIIa', + 24374 => 'Kalianpur India IVa', + 24382 => 'Kalianpur India IIb', + 24383 => 'Kalianpur India IIIb', + 24384 => 'Kalianpur India IVb', + 24500 => 'Kertau Singapore Grid', + 24547 => 'Kertau UTM zone 47N', + 24548 => 'Kertau UTM zone 48N', + 24720 => 'La Canoa UTM zone 20N', + 24721 => 'La Canoa UTM zone 21N', + 24818 => 'PSAD56 UTM zone 18N', + 24819 => 'PSAD56 UTM zone 19N', + 24820 => 'PSAD56 UTM zone 20N', + 24821 => 'PSAD56 UTM zone 21N', + 24877 => 'PSAD56 UTM zone 17S', + 24878 => 'PSAD56 UTM zone 18S', + 24879 => 'PSAD56 UTM zone 19S', + 24880 => 'PSAD56 UTM zone 20S', + 24891 => 'PSAD56 Peru west zone', + 24892 => 'PSAD56 Peru central', + 24893 => 'PSAD56 Peru east zone', + 25000 => 'Leigon Ghana Grid', + 25231 => 'Lome UTM zone 31N', + 25391 => 'Luzon Philippines I', + 25392 => 'Luzon Philippines II', + 25393 => 'Luzon Philippines III', + 25394 => 'Luzon Philippines IV', + 25395 => 'Luzon Philippines V', + 25700 => 'Makassar NEIEZ', + 25932 => 'Malongo 1987 UTM 32S', + 26191 => 'Merchich Nord Maroc', + 26192 => 'Merchich Sud Maroc', + 26193 => 'Merchich Sahara', + 26237 => 'Massawa UTM zone 37N', + 26331 => 'Minna UTM zone 31N', + 26332 => 'Minna UTM zone 32N', + 26391 => 'Minna Nigeria West', + 26392 => 'Minna Nigeria Mid Belt', + 26393 => 'Minna Nigeria East', + 26432 => 'Mhast UTM zone 32S', + 26591 => 'Monte Mario Italy 1', + 26592 => 'Monte Mario Italy 2', + 26632 => 'M poraloko UTM 32N', + 26692 => 'M poraloko UTM 32S', + 26703 => 'NAD27 UTM zone 3N', + 26704 => 'NAD27 UTM zone 4N', + 26705 => 'NAD27 UTM zone 5N', + 26706 => 'NAD27 UTM zone 6N', + 26707 => 'NAD27 UTM zone 7N', + 26708 => 'NAD27 UTM zone 8N', + 26709 => 'NAD27 UTM zone 9N', + 26710 => 'NAD27 UTM zone 10N', + 26711 => 'NAD27 UTM zone 11N', + 26712 => 'NAD27 UTM zone 12N', + 26713 => 'NAD27 UTM zone 13N', + 26714 => 'NAD27 UTM zone 14N', + 26715 => 'NAD27 UTM zone 15N', + 26716 => 'NAD27 UTM zone 16N', + 26717 => 'NAD27 UTM zone 17N', + 26718 => 'NAD27 UTM zone 18N', + 26719 => 'NAD27 UTM zone 19N', + 26720 => 'NAD27 UTM zone 20N', + 26721 => 'NAD27 UTM zone 21N', + 26722 => 'NAD27 UTM zone 22N', + 26729 => 'NAD27 Alabama East', + 26730 => 'NAD27 Alabama West', + 26731 => 'NAD27 Alaska zone 1', + 26732 => 'NAD27 Alaska zone 2', + 26733 => 'NAD27 Alaska zone 3', + 26734 => 'NAD27 Alaska zone 4', + 26735 => 'NAD27 Alaska zone 5', + 26736 => 'NAD27 Alaska zone 6', + 26737 => 'NAD27 Alaska zone 7', + 26738 => 'NAD27 Alaska zone 8', + 26739 => 'NAD27 Alaska zone 9', + 26740 => 'NAD27 Alaska zone 10', + 26741 => 'NAD27 California I', + 26742 => 'NAD27 California II', + 26743 => 'NAD27 California III', + 26744 => 'NAD27 California IV', + 26745 => 'NAD27 California V', + 26746 => 'NAD27 California VI', + 26747 => 'NAD27 California VII', + 26748 => 'NAD27 Arizona East', + 26749 => 'NAD27 Arizona Central', + 26750 => 'NAD27 Arizona West', + 26751 => 'NAD27 Arkansas North', + 26752 => 'NAD27 Arkansas South', + 26753 => 'NAD27 Colorado North', + 26754 => 'NAD27 Colorado Central', + 26755 => 'NAD27 Colorado South', + 26756 => 'NAD27 Connecticut', + 26757 => 'NAD27 Delaware', + 26758 => 'NAD27 Florida East', + 26759 => 'NAD27 Florida West', + 26760 => 'NAD27 Florida North', + 26761 => 'NAD27 Hawaii zone 1', + 26762 => 'NAD27 Hawaii zone 2', + 26763 => 'NAD27 Hawaii zone 3', + 26764 => 'NAD27 Hawaii zone 4', + 26765 => 'NAD27 Hawaii zone 5', + 26766 => 'NAD27 Georgia East', + 26767 => 'NAD27 Georgia West', + 26768 => 'NAD27 Idaho East', + 26769 => 'NAD27 Idaho Central', + 26770 => 'NAD27 Idaho West', + 26771 => 'NAD27 Illinois East', + 26772 => 'NAD27 Illinois West', + 26773 => 'NAD27 Indiana East', + 26774 => 'NAD27 BLM 14N feet', + 26774 => 'NAD27 Indiana West', + 26775 => 'NAD27 BLM 15N feet', + 26775 => 'NAD27 Iowa North', + 26776 => 'NAD27 BLM 16N feet', + 26776 => 'NAD27 Iowa South', + 26777 => 'NAD27 BLM 17N feet', + 26777 => 'NAD27 Kansas North', + 26778 => 'NAD27 Kansas South', + 26779 => 'NAD27 Kentucky North', + 26780 => 'NAD27 Kentucky South', + 26781 => 'NAD27 Louisiana North', + 26782 => 'NAD27 Louisiana South', + 26783 => 'NAD27 Maine East', + 26784 => 'NAD27 Maine West', + 26785 => 'NAD27 Maryland', + 26786 => 'NAD27 Massachusetts', + 26787 => 'NAD27 Massachusetts Is', + 26788 => 'NAD27 Michigan North', + 26789 => 'NAD27 Michigan Central', + 26790 => 'NAD27 Michigan South', + 26791 => 'NAD27 Minnesota North', + 26792 => 'NAD27 Minnesota Cent', + 26793 => 'NAD27 Minnesota South', + 26794 => 'NAD27 Mississippi East', + 26795 => 'NAD27 Mississippi West', + 26796 => 'NAD27 Missouri East', + 26797 => 'NAD27 Missouri Central', + 26798 => 'NAD27 Missouri West', + 26801 => 'NAD Michigan Michigan East', + 26802 => 'NAD Michigan Michigan Old Central', + 26803 => 'NAD Michigan Michigan West', + 26903 => 'NAD83 UTM zone 3N', + 26904 => 'NAD83 UTM zone 4N', + 26905 => 'NAD83 UTM zone 5N', + 26906 => 'NAD83 UTM zone 6N', + 26907 => 'NAD83 UTM zone 7N', + 26908 => 'NAD83 UTM zone 8N', + 26909 => 'NAD83 UTM zone 9N', + 26910 => 'NAD83 UTM zone 10N', + 26911 => 'NAD83 UTM zone 11N', + 26912 => 'NAD83 UTM zone 12N', + 26913 => 'NAD83 UTM zone 13N', + 26914 => 'NAD83 UTM zone 14N', + 26915 => 'NAD83 UTM zone 15N', + 26916 => 'NAD83 UTM zone 16N', + 26917 => 'NAD83 UTM zone 17N', + 26918 => 'NAD83 UTM zone 18N', + 26919 => 'NAD83 UTM zone 19N', + 26920 => 'NAD83 UTM zone 20N', + 26921 => 'NAD83 UTM zone 21N', + 26922 => 'NAD83 UTM zone 22N', + 26923 => 'NAD83 UTM zone 23N', + 26929 => 'NAD83 Alabama East', + 26930 => 'NAD83 Alabama West', + 26931 => 'NAD83 Alaska zone 1', + 26932 => 'NAD83 Alaska zone 2', + 26933 => 'NAD83 Alaska zone 3', + 26934 => 'NAD83 Alaska zone 4', + 26935 => 'NAD83 Alaska zone 5', + 26936 => 'NAD83 Alaska zone 6', + 26937 => 'NAD83 Alaska zone 7', + 26938 => 'NAD83 Alaska zone 8', + 26939 => 'NAD83 Alaska zone 9', + 26940 => 'NAD83 Alaska zone 10', + 26941 => 'NAD83 California 1', + 26942 => 'NAD83 California 2', + 26943 => 'NAD83 California 3', + 26944 => 'NAD83 California 4', + 26945 => 'NAD83 California 5', + 26946 => 'NAD83 California 6', + 26948 => 'NAD83 Arizona East', + 26949 => 'NAD83 Arizona Central', + 26950 => 'NAD83 Arizona West', + 26951 => 'NAD83 Arkansas North', + 26952 => 'NAD83 Arkansas South', + 26953 => 'NAD83 Colorado North', + 26954 => 'NAD83 Colorado Central', + 26955 => 'NAD83 Colorado South', + 26956 => 'NAD83 Connecticut', + 26957 => 'NAD83 Delaware', + 26958 => 'NAD83 Florida East', + 26959 => 'NAD83 Florida West', + 26960 => 'NAD83 Florida North', + 26961 => 'NAD83 Hawaii zone 1', + 26962 => 'NAD83 Hawaii zone 2', + 26963 => 'NAD83 Hawaii zone 3', + 26964 => 'NAD83 Hawaii zone 4', + 26965 => 'NAD83 Hawaii zone 5', + 26966 => 'NAD83 Georgia East', + 26967 => 'NAD83 Georgia West', + 26968 => 'NAD83 Idaho East', + 26969 => 'NAD83 Idaho Central', + 26970 => 'NAD83 Idaho West', + 26971 => 'NAD83 Illinois East', + 26972 => 'NAD83 Illinois West', + 26973 => 'NAD83 Indiana East', + 26974 => 'NAD83 Indiana West', + 26975 => 'NAD83 Iowa North', + 26976 => 'NAD83 Iowa South', + 26977 => 'NAD83 Kansas North', + 26978 => 'NAD83 Kansas South', + 26979 => 'NAD83 Kentucky North', + 26980 => 'NAD83 Kentucky South', + 26981 => 'NAD83 Louisiana North', + 26982 => 'NAD83 Louisiana South', + 26983 => 'NAD83 Maine East', + 26984 => 'NAD83 Maine West', + 26985 => 'NAD83 Maryland', + 26986 => 'NAD83 Massachusetts', + 26987 => 'NAD83 Massachusetts Is', + 26988 => 'NAD83 Michigan North', + 26989 => 'NAD83 Michigan Central', + 26990 => 'NAD83 Michigan South', + 26991 => 'NAD83 Minnesota North', + 26992 => 'NAD83 Minnesota Cent', + 26993 => 'NAD83 Minnesota South', + 26994 => 'NAD83 Mississippi East', + 26995 => 'NAD83 Mississippi West', + 26996 => 'NAD83 Missouri East', + 26997 => 'NAD83 Missouri Central', + 26998 => 'NAD83 Missouri West', + 27038 => 'Nahrwan 1967 UTM 38N', + 27039 => 'Nahrwan 1967 UTM 39N', + 27040 => 'Nahrwan 1967 UTM 40N', + 27120 => 'Naparima UTM 20N', + 27200 => 'GD49 NZ Map Grid', + 27291 => 'GD49 North Island Grid', + 27292 => 'GD49 South Island Grid', + 27429 => 'Datum 73 UTM zone 29N', + 27500 => 'ATF Nord de Guerre', + 27581 => 'NTF France I', + 27582 => 'NTF France II', + 27583 => 'NTF France III', + 27591 => 'NTF Nord France', + 27592 => 'NTF Centre France', + 27593 => 'NTF Sud France', + 27700 => 'British National Grid', + 28232 => 'Point Noire UTM 32S', + 28348 => 'GDA94 MGA zone 48', + 28349 => 'GDA94 MGA zone 49', + 28350 => 'GDA94 MGA zone 50', + 28351 => 'GDA94 MGA zone 51', + 28352 => 'GDA94 MGA zone 52', + 28353 => 'GDA94 MGA zone 53', + 28354 => 'GDA94 MGA zone 54', + 28355 => 'GDA94 MGA zone 55', + 28356 => 'GDA94 MGA zone 56', + 28357 => 'GDA94 MGA zone 57', + 28358 => 'GDA94 MGA zone 58', + 28404 => 'Pulkovo Gauss zone 4', + 28405 => 'Pulkovo Gauss zone 5', + 28406 => 'Pulkovo Gauss zone 6', + 28407 => 'Pulkovo Gauss zone 7', + 28408 => 'Pulkovo Gauss zone 8', + 28409 => 'Pulkovo Gauss zone 9', + 28410 => 'Pulkovo Gauss zone 10', + 28411 => 'Pulkovo Gauss zone 11', + 28412 => 'Pulkovo Gauss zone 12', + 28413 => 'Pulkovo Gauss zone 13', + 28414 => 'Pulkovo Gauss zone 14', + 28415 => 'Pulkovo Gauss zone 15', + 28416 => 'Pulkovo Gauss zone 16', + 28417 => 'Pulkovo Gauss zone 17', + 28418 => 'Pulkovo Gauss zone 18', + 28419 => 'Pulkovo Gauss zone 19', + 28420 => 'Pulkovo Gauss zone 20', + 28421 => 'Pulkovo Gauss zone 21', + 28422 => 'Pulkovo Gauss zone 22', + 28423 => 'Pulkovo Gauss zone 23', + 28424 => 'Pulkovo Gauss zone 24', + 28425 => 'Pulkovo Gauss zone 25', + 28426 => 'Pulkovo Gauss zone 26', + 28427 => 'Pulkovo Gauss zone 27', + 28428 => 'Pulkovo Gauss zone 28', + 28429 => 'Pulkovo Gauss zone 29', + 28430 => 'Pulkovo Gauss zone 30', + 28431 => 'Pulkovo Gauss zone 31', + 28432 => 'Pulkovo Gauss zone 32', + 28464 => 'Pulkovo Gauss 4N', + 28465 => 'Pulkovo Gauss 5N', + 28466 => 'Pulkovo Gauss 6N', + 28467 => 'Pulkovo Gauss 7N', + 28468 => 'Pulkovo Gauss 8N', + 28469 => 'Pulkovo Gauss 9N', + 28470 => 'Pulkovo Gauss 10N', + 28471 => 'Pulkovo Gauss 11N', + 28472 => 'Pulkovo Gauss 12N', + 28473 => 'Pulkovo Gauss 13N', + 28474 => 'Pulkovo Gauss 14N', + 28475 => 'Pulkovo Gauss 15N', + 28476 => 'Pulkovo Gauss 16N', + 28477 => 'Pulkovo Gauss 17N', + 28478 => 'Pulkovo Gauss 18N', + 28479 => 'Pulkovo Gauss 19N', + 28480 => 'Pulkovo Gauss 20N', + 28481 => 'Pulkovo Gauss 21N', + 28482 => 'Pulkovo Gauss 22N', + 28483 => 'Pulkovo Gauss 23N', + 28484 => 'Pulkovo Gauss 24N', + 28485 => 'Pulkovo Gauss 25N', + 28486 => 'Pulkovo Gauss 26N', + 28487 => 'Pulkovo Gauss 27N', + 28488 => 'Pulkovo Gauss 28N', + 28489 => 'Pulkovo Gauss 29N', + 28490 => 'Pulkovo Gauss 30N', + 28491 => 'Pulkovo Gauss 31N', + 28492 => 'Pulkovo Gauss 32N', + 28600 => 'Qatar National Grid', + 28991 => 'RD Netherlands Old', + 28992 => 'RD Netherlands New', + 29118 => 'SAD69 UTM zone 18N', + 29119 => 'SAD69 UTM zone 19N', + 29120 => 'SAD69 UTM zone 20N', + 29121 => 'SAD69 UTM zone 21N', + 29122 => 'SAD69 UTM zone 22N', + 29177 => 'SAD69 UTM zone 17S', + 29178 => 'SAD69 UTM zone 18S', + 29179 => 'SAD69 UTM zone 19S', + 29180 => 'SAD69 UTM zone 20S', + 29181 => 'SAD69 UTM zone 21S', + 29182 => 'SAD69 UTM zone 22S', + 29183 => 'SAD69 UTM zone 23S', + 29184 => 'SAD69 UTM zone 24S', + 29185 => 'SAD69 UTM zone 25S', + 29220 => 'Sapper Hill UTM 20S', + 29221 => 'Sapper Hill UTM 21S', + 29333 => 'Schwarzeck UTM 33S', + 29635 => 'Sudan UTM zone 35N', + 29636 => 'Sudan UTM zone 36N', + 29700 => 'Tananarive Laborde', + 29738 => 'Tananarive UTM 38S', + 29739 => 'Tananarive UTM 39S', + 29800 => 'Timbalai 1948 Borneo', + 29849 => 'Timbalai 1948 UTM 49N', + 29850 => 'Timbalai 1948 UTM 50N', + 29900 => 'TM65 Irish Nat Grid', + 30200 => 'Trinidad 1903 Trinidad', + 30339 => 'TC 1948 UTM zone 39N', + 30340 => 'TC 1948 UTM zone 40N', + 30491 => 'Voirol N Algerie ancien', + 30492 => 'Voirol S Algerie ancien', + 30591 => 'Voirol Unifie N Algerie', + 30592 => 'Voirol Unifie S Algerie', + 30600 => 'Bern 1938 Swiss New', + 30729 => 'Nord Sahara UTM 29N', + 30730 => 'Nord Sahara UTM 30N', + 30731 => 'Nord Sahara UTM 31N', + 30732 => 'Nord Sahara UTM 32N', + 31028 => 'Yoff UTM zone 28N', + 31121 => 'Zanderij UTM zone 21N', + 31291 => 'MGI Austria West', + 31292 => 'MGI Austria Central', + 31293 => 'MGI Austria East', + 31300 => 'Belge Lambert 72', + 31491 => 'DHDN Germany zone 1', + 31492 => 'DHDN Germany zone 2', + 31493 => 'DHDN Germany zone 3', + 31494 => 'DHDN Germany zone 4', + 31495 => 'DHDN Germany zone 5', + 31700 => 'Dealul Piscului 1970 Stereo 70', + 32001 => 'NAD27 Montana North', + 32002 => 'NAD27 Montana Central', + 32003 => 'NAD27 Montana South', + 32005 => 'NAD27 Nebraska North', + 32006 => 'NAD27 Nebraska South', + 32007 => 'NAD27 Nevada East', + 32008 => 'NAD27 Nevada Central', + 32009 => 'NAD27 Nevada West', + 32010 => 'NAD27 New Hampshire', + 32011 => 'NAD27 New Jersey', + 32012 => 'NAD27 New Mexico East', + 32013 => 'NAD27 New Mexico Cent', + 32014 => 'NAD27 New Mexico West', + 32015 => 'NAD27 New York East', + 32016 => 'NAD27 New York Central', + 32017 => 'NAD27 New York West', + 32018 => 'NAD27 New York Long Is', + 32019 => 'NAD27 North Carolina', + 32020 => 'NAD27 North Dakota N', + 32021 => 'NAD27 North Dakota S', + 32022 => 'NAD27 Ohio North', + 32023 => 'NAD27 Ohio South', + 32024 => 'NAD27 Oklahoma North', + 32025 => 'NAD27 Oklahoma South', + 32026 => 'NAD27 Oregon North', + 32027 => 'NAD27 Oregon South', + 32028 => 'NAD27 Pennsylvania N', + 32029 => 'NAD27 Pennsylvania S', + 32030 => 'NAD27 Rhode Island', + 32031 => 'NAD27 South Carolina N', + 32033 => 'NAD27 South Carolina S', + 32034 => 'NAD27 South Dakota N', + 32035 => 'NAD27 South Dakota S', + 32036 => 'NAD27 Tennessee', + 32037 => 'NAD27 Texas North', + 32038 => 'NAD27 Texas North Cen', + 32039 => 'NAD27 Texas Central', + 32040 => 'NAD27 Texas South Cen', + 32041 => 'NAD27 Texas South', + 32042 => 'NAD27 Utah North', + 32043 => 'NAD27 Utah Central', + 32044 => 'NAD27 Utah South', + 32045 => 'NAD27 Vermont', + 32046 => 'NAD27 Virginia North', + 32047 => 'NAD27 Virginia South', + 32048 => 'NAD27 Washington North', + 32049 => 'NAD27 Washington South', + 32050 => 'NAD27 West Virginia N', + 32051 => 'NAD27 West Virginia S', + 32052 => 'NAD27 Wisconsin North', + 32053 => 'NAD27 Wisconsin Cen', + 32054 => 'NAD27 Wisconsin South', + 32055 => 'NAD27 Wyoming East', + 32056 => 'NAD27 Wyoming E Cen', + 32057 => 'NAD27 Wyoming W Cen', + 32058 => 'NAD27 Wyoming West', + 32059 => 'NAD27 Puerto Rico', + 32060 => 'NAD27 St Croix', + 32100 => 'NAD83 Montana', + 32104 => 'NAD83 Nebraska', + 32107 => 'NAD83 Nevada East', + 32108 => 'NAD83 Nevada Central', + 32109 => 'NAD83 Nevada West', + 32110 => 'NAD83 New Hampshire', + 32111 => 'NAD83 New Jersey', + 32112 => 'NAD83 New Mexico East', + 32113 => 'NAD83 New Mexico Cent', + 32114 => 'NAD83 New Mexico West', + 32115 => 'NAD83 New York East', + 32116 => 'NAD83 New York Central', + 32117 => 'NAD83 New York West', + 32118 => 'NAD83 New York Long Is', + 32119 => 'NAD83 North Carolina', + 32120 => 'NAD83 North Dakota N', + 32121 => 'NAD83 North Dakota S', + 32122 => 'NAD83 Ohio North', + 32123 => 'NAD83 Ohio South', + 32124 => 'NAD83 Oklahoma North', + 32125 => 'NAD83 Oklahoma South', + 32126 => 'NAD83 Oregon North', + 32127 => 'NAD83 Oregon South', + 32128 => 'NAD83 Pennsylvania N', + 32129 => 'NAD83 Pennsylvania S', + 32130 => 'NAD83 Rhode Island', + 32133 => 'NAD83 South Carolina', + 32134 => 'NAD83 South Dakota N', + 32135 => 'NAD83 South Dakota S', + 32136 => 'NAD83 Tennessee', + 32137 => 'NAD83 Texas North', + 32138 => 'NAD83 Texas North Cen', + 32139 => 'NAD83 Texas Central', + 32140 => 'NAD83 Texas South Cen', + 32141 => 'NAD83 Texas South', + 32142 => 'NAD83 Utah North', + 32143 => 'NAD83 Utah Central', + 32144 => 'NAD83 Utah South', + 32145 => 'NAD83 Vermont', + 32146 => 'NAD83 Virginia North', + 32147 => 'NAD83 Virginia South', + 32148 => 'NAD83 Washington North', + 32149 => 'NAD83 Washington South', + 32150 => 'NAD83 West Virginia N', + 32151 => 'NAD83 West Virginia S', + 32152 => 'NAD83 Wisconsin North', + 32153 => 'NAD83 Wisconsin Cen', + 32154 => 'NAD83 Wisconsin South', + 32155 => 'NAD83 Wyoming East', + 32156 => 'NAD83 Wyoming E Cen', + 32157 => 'NAD83 Wyoming W Cen', + 32158 => 'NAD83 Wyoming West', + 32161 => 'NAD83 Puerto Rico Virgin Is', + 32201 => 'WGS72 UTM zone 1N', + 32202 => 'WGS72 UTM zone 2N', + 32203 => 'WGS72 UTM zone 3N', + 32204 => 'WGS72 UTM zone 4N', + 32205 => 'WGS72 UTM zone 5N', + 32206 => 'WGS72 UTM zone 6N', + 32207 => 'WGS72 UTM zone 7N', + 32208 => 'WGS72 UTM zone 8N', + 32209 => 'WGS72 UTM zone 9N', + 32210 => 'WGS72 UTM zone 10N', + 32211 => 'WGS72 UTM zone 11N', + 32212 => 'WGS72 UTM zone 12N', + 32213 => 'WGS72 UTM zone 13N', + 32214 => 'WGS72 UTM zone 14N', + 32215 => 'WGS72 UTM zone 15N', + 32216 => 'WGS72 UTM zone 16N', + 32217 => 'WGS72 UTM zone 17N', + 32218 => 'WGS72 UTM zone 18N', + 32219 => 'WGS72 UTM zone 19N', + 32220 => 'WGS72 UTM zone 20N', + 32221 => 'WGS72 UTM zone 21N', + 32222 => 'WGS72 UTM zone 22N', + 32223 => 'WGS72 UTM zone 23N', + 32224 => 'WGS72 UTM zone 24N', + 32225 => 'WGS72 UTM zone 25N', + 32226 => 'WGS72 UTM zone 26N', + 32227 => 'WGS72 UTM zone 27N', + 32228 => 'WGS72 UTM zone 28N', + 32229 => 'WGS72 UTM zone 29N', + 32230 => 'WGS72 UTM zone 30N', + 32231 => 'WGS72 UTM zone 31N', + 32232 => 'WGS72 UTM zone 32N', + 32233 => 'WGS72 UTM zone 33N', + 32234 => 'WGS72 UTM zone 34N', + 32235 => 'WGS72 UTM zone 35N', + 32236 => 'WGS72 UTM zone 36N', + 32237 => 'WGS72 UTM zone 37N', + 32238 => 'WGS72 UTM zone 38N', + 32239 => 'WGS72 UTM zone 39N', + 32240 => 'WGS72 UTM zone 40N', + 32241 => 'WGS72 UTM zone 41N', + 32242 => 'WGS72 UTM zone 42N', + 32243 => 'WGS72 UTM zone 43N', + 32244 => 'WGS72 UTM zone 44N', + 32245 => 'WGS72 UTM zone 45N', + 32246 => 'WGS72 UTM zone 46N', + 32247 => 'WGS72 UTM zone 47N', + 32248 => 'WGS72 UTM zone 48N', + 32249 => 'WGS72 UTM zone 49N', + 32250 => 'WGS72 UTM zone 50N', + 32251 => 'WGS72 UTM zone 51N', + 32252 => 'WGS72 UTM zone 52N', + 32253 => 'WGS72 UTM zone 53N', + 32254 => 'WGS72 UTM zone 54N', + 32255 => 'WGS72 UTM zone 55N', + 32256 => 'WGS72 UTM zone 56N', + 32257 => 'WGS72 UTM zone 57N', + 32258 => 'WGS72 UTM zone 58N', + 32259 => 'WGS72 UTM zone 59N', + 32260 => 'WGS72 UTM zone 60N', + 32301 => 'WGS72 UTM zone 1S', + 32302 => 'WGS72 UTM zone 2S', + 32303 => 'WGS72 UTM zone 3S', + 32304 => 'WGS72 UTM zone 4S', + 32305 => 'WGS72 UTM zone 5S', + 32306 => 'WGS72 UTM zone 6S', + 32307 => 'WGS72 UTM zone 7S', + 32308 => 'WGS72 UTM zone 8S', + 32309 => 'WGS72 UTM zone 9S', + 32310 => 'WGS72 UTM zone 10S', + 32311 => 'WGS72 UTM zone 11S', + 32312 => 'WGS72 UTM zone 12S', + 32313 => 'WGS72 UTM zone 13S', + 32314 => 'WGS72 UTM zone 14S', + 32315 => 'WGS72 UTM zone 15S', + 32316 => 'WGS72 UTM zone 16S', + 32317 => 'WGS72 UTM zone 17S', + 32318 => 'WGS72 UTM zone 18S', + 32319 => 'WGS72 UTM zone 19S', + 32320 => 'WGS72 UTM zone 20S', + 32321 => 'WGS72 UTM zone 21S', + 32322 => 'WGS72 UTM zone 22S', + 32323 => 'WGS72 UTM zone 23S', + 32324 => 'WGS72 UTM zone 24S', + 32325 => 'WGS72 UTM zone 25S', + 32326 => 'WGS72 UTM zone 26S', + 32327 => 'WGS72 UTM zone 27S', + 32328 => 'WGS72 UTM zone 28S', + 32329 => 'WGS72 UTM zone 29S', + 32330 => 'WGS72 UTM zone 30S', + 32331 => 'WGS72 UTM zone 31S', + 32332 => 'WGS72 UTM zone 32S', + 32333 => 'WGS72 UTM zone 33S', + 32334 => 'WGS72 UTM zone 34S', + 32335 => 'WGS72 UTM zone 35S', + 32336 => 'WGS72 UTM zone 36S', + 32337 => 'WGS72 UTM zone 37S', + 32338 => 'WGS72 UTM zone 38S', + 32339 => 'WGS72 UTM zone 39S', + 32340 => 'WGS72 UTM zone 40S', + 32341 => 'WGS72 UTM zone 41S', + 32342 => 'WGS72 UTM zone 42S', + 32343 => 'WGS72 UTM zone 43S', + 32344 => 'WGS72 UTM zone 44S', + 32345 => 'WGS72 UTM zone 45S', + 32346 => 'WGS72 UTM zone 46S', + 32347 => 'WGS72 UTM zone 47S', + 32348 => 'WGS72 UTM zone 48S', + 32349 => 'WGS72 UTM zone 49S', + 32350 => 'WGS72 UTM zone 50S', + 32351 => 'WGS72 UTM zone 51S', + 32352 => 'WGS72 UTM zone 52S', + 32353 => 'WGS72 UTM zone 53S', + 32354 => 'WGS72 UTM zone 54S', + 32355 => 'WGS72 UTM zone 55S', + 32356 => 'WGS72 UTM zone 56S', + 32357 => 'WGS72 UTM zone 57S', + 32358 => 'WGS72 UTM zone 58S', + 32359 => 'WGS72 UTM zone 59S', + 32360 => 'WGS72 UTM zone 60S', + 32401 => 'WGS72BE UTM zone 1N', + 32402 => 'WGS72BE UTM zone 2N', + 32403 => 'WGS72BE UTM zone 3N', + 32404 => 'WGS72BE UTM zone 4N', + 32405 => 'WGS72BE UTM zone 5N', + 32406 => 'WGS72BE UTM zone 6N', + 32407 => 'WGS72BE UTM zone 7N', + 32408 => 'WGS72BE UTM zone 8N', + 32409 => 'WGS72BE UTM zone 9N', + 32410 => 'WGS72BE UTM zone 10N', + 32411 => 'WGS72BE UTM zone 11N', + 32412 => 'WGS72BE UTM zone 12N', + 32413 => 'WGS72BE UTM zone 13N', + 32414 => 'WGS72BE UTM zone 14N', + 32415 => 'WGS72BE UTM zone 15N', + 32416 => 'WGS72BE UTM zone 16N', + 32417 => 'WGS72BE UTM zone 17N', + 32418 => 'WGS72BE UTM zone 18N', + 32419 => 'WGS72BE UTM zone 19N', + 32420 => 'WGS72BE UTM zone 20N', + 32421 => 'WGS72BE UTM zone 21N', + 32422 => 'WGS72BE UTM zone 22N', + 32423 => 'WGS72BE UTM zone 23N', + 32424 => 'WGS72BE UTM zone 24N', + 32425 => 'WGS72BE UTM zone 25N', + 32426 => 'WGS72BE UTM zone 26N', + 32427 => 'WGS72BE UTM zone 27N', + 32428 => 'WGS72BE UTM zone 28N', + 32429 => 'WGS72BE UTM zone 29N', + 32430 => 'WGS72BE UTM zone 30N', + 32431 => 'WGS72BE UTM zone 31N', + 32432 => 'WGS72BE UTM zone 32N', + 32433 => 'WGS72BE UTM zone 33N', + 32434 => 'WGS72BE UTM zone 34N', + 32435 => 'WGS72BE UTM zone 35N', + 32436 => 'WGS72BE UTM zone 36N', + 32437 => 'WGS72BE UTM zone 37N', + 32438 => 'WGS72BE UTM zone 38N', + 32439 => 'WGS72BE UTM zone 39N', + 32440 => 'WGS72BE UTM zone 40N', + 32441 => 'WGS72BE UTM zone 41N', + 32442 => 'WGS72BE UTM zone 42N', + 32443 => 'WGS72BE UTM zone 43N', + 32444 => 'WGS72BE UTM zone 44N', + 32445 => 'WGS72BE UTM zone 45N', + 32446 => 'WGS72BE UTM zone 46N', + 32447 => 'WGS72BE UTM zone 47N', + 32448 => 'WGS72BE UTM zone 48N', + 32449 => 'WGS72BE UTM zone 49N', + 32450 => 'WGS72BE UTM zone 50N', + 32451 => 'WGS72BE UTM zone 51N', + 32452 => 'WGS72BE UTM zone 52N', + 32453 => 'WGS72BE UTM zone 53N', + 32454 => 'WGS72BE UTM zone 54N', + 32455 => 'WGS72BE UTM zone 55N', + 32456 => 'WGS72BE UTM zone 56N', + 32457 => 'WGS72BE UTM zone 57N', + 32458 => 'WGS72BE UTM zone 58N', + 32459 => 'WGS72BE UTM zone 59N', + 32460 => 'WGS72BE UTM zone 60N', + 32501 => 'WGS72BE UTM zone 1S', + 32502 => 'WGS72BE UTM zone 2S', + 32503 => 'WGS72BE UTM zone 3S', + 32504 => 'WGS72BE UTM zone 4S', + 32505 => 'WGS72BE UTM zone 5S', + 32506 => 'WGS72BE UTM zone 6S', + 32507 => 'WGS72BE UTM zone 7S', + 32508 => 'WGS72BE UTM zone 8S', + 32509 => 'WGS72BE UTM zone 9S', + 32510 => 'WGS72BE UTM zone 10S', + 32511 => 'WGS72BE UTM zone 11S', + 32512 => 'WGS72BE UTM zone 12S', + 32513 => 'WGS72BE UTM zone 13S', + 32514 => 'WGS72BE UTM zone 14S', + 32515 => 'WGS72BE UTM zone 15S', + 32516 => 'WGS72BE UTM zone 16S', + 32517 => 'WGS72BE UTM zone 17S', + 32518 => 'WGS72BE UTM zone 18S', + 32519 => 'WGS72BE UTM zone 19S', + 32520 => 'WGS72BE UTM zone 20S', + 32521 => 'WGS72BE UTM zone 21S', + 32522 => 'WGS72BE UTM zone 22S', + 32523 => 'WGS72BE UTM zone 23S', + 32524 => 'WGS72BE UTM zone 24S', + 32525 => 'WGS72BE UTM zone 25S', + 32526 => 'WGS72BE UTM zone 26S', + 32527 => 'WGS72BE UTM zone 27S', + 32528 => 'WGS72BE UTM zone 28S', + 32529 => 'WGS72BE UTM zone 29S', + 32530 => 'WGS72BE UTM zone 30S', + 32531 => 'WGS72BE UTM zone 31S', + 32532 => 'WGS72BE UTM zone 32S', + 32533 => 'WGS72BE UTM zone 33S', + 32534 => 'WGS72BE UTM zone 34S', + 32535 => 'WGS72BE UTM zone 35S', + 32536 => 'WGS72BE UTM zone 36S', + 32537 => 'WGS72BE UTM zone 37S', + 32538 => 'WGS72BE UTM zone 38S', + 32539 => 'WGS72BE UTM zone 39S', + 32540 => 'WGS72BE UTM zone 40S', + 32541 => 'WGS72BE UTM zone 41S', + 32542 => 'WGS72BE UTM zone 42S', + 32543 => 'WGS72BE UTM zone 43S', + 32544 => 'WGS72BE UTM zone 44S', + 32545 => 'WGS72BE UTM zone 45S', + 32546 => 'WGS72BE UTM zone 46S', + 32547 => 'WGS72BE UTM zone 47S', + 32548 => 'WGS72BE UTM zone 48S', + 32549 => 'WGS72BE UTM zone 49S', + 32550 => 'WGS72BE UTM zone 50S', + 32551 => 'WGS72BE UTM zone 51S', + 32552 => 'WGS72BE UTM zone 52S', + 32553 => 'WGS72BE UTM zone 53S', + 32554 => 'WGS72BE UTM zone 54S', + 32555 => 'WGS72BE UTM zone 55S', + 32556 => 'WGS72BE UTM zone 56S', + 32557 => 'WGS72BE UTM zone 57S', + 32558 => 'WGS72BE UTM zone 58S', + 32559 => 'WGS72BE UTM zone 59S', + 32560 => 'WGS72BE UTM zone 60S', + 32601 => 'WGS84 UTM zone 1N', + 32602 => 'WGS84 UTM zone 2N', + 32603 => 'WGS84 UTM zone 3N', + 32604 => 'WGS84 UTM zone 4N', + 32605 => 'WGS84 UTM zone 5N', + 32606 => 'WGS84 UTM zone 6N', + 32607 => 'WGS84 UTM zone 7N', + 32608 => 'WGS84 UTM zone 8N', + 32609 => 'WGS84 UTM zone 9N', + 32610 => 'WGS84 UTM zone 10N', + 32611 => 'WGS84 UTM zone 11N', + 32612 => 'WGS84 UTM zone 12N', + 32613 => 'WGS84 UTM zone 13N', + 32614 => 'WGS84 UTM zone 14N', + 32615 => 'WGS84 UTM zone 15N', + 32616 => 'WGS84 UTM zone 16N', + 32617 => 'WGS84 UTM zone 17N', + 32618 => 'WGS84 UTM zone 18N', + 32619 => 'WGS84 UTM zone 19N', + 32620 => 'WGS84 UTM zone 20N', + 32621 => 'WGS84 UTM zone 21N', + 32622 => 'WGS84 UTM zone 22N', + 32623 => 'WGS84 UTM zone 23N', + 32624 => 'WGS84 UTM zone 24N', + 32625 => 'WGS84 UTM zone 25N', + 32626 => 'WGS84 UTM zone 26N', + 32627 => 'WGS84 UTM zone 27N', + 32628 => 'WGS84 UTM zone 28N', + 32629 => 'WGS84 UTM zone 29N', + 32630 => 'WGS84 UTM zone 30N', + 32631 => 'WGS84 UTM zone 31N', + 32632 => 'WGS84 UTM zone 32N', + 32633 => 'WGS84 UTM zone 33N', + 32634 => 'WGS84 UTM zone 34N', + 32635 => 'WGS84 UTM zone 35N', + 32636 => 'WGS84 UTM zone 36N', + 32637 => 'WGS84 UTM zone 37N', + 32638 => 'WGS84 UTM zone 38N', + 32639 => 'WGS84 UTM zone 39N', + 32640 => 'WGS84 UTM zone 40N', + 32641 => 'WGS84 UTM zone 41N', + 32642 => 'WGS84 UTM zone 42N', + 32643 => 'WGS84 UTM zone 43N', + 32644 => 'WGS84 UTM zone 44N', + 32645 => 'WGS84 UTM zone 45N', + 32646 => 'WGS84 UTM zone 46N', + 32647 => 'WGS84 UTM zone 47N', + 32648 => 'WGS84 UTM zone 48N', + 32649 => 'WGS84 UTM zone 49N', + 32650 => 'WGS84 UTM zone 50N', + 32651 => 'WGS84 UTM zone 51N', + 32652 => 'WGS84 UTM zone 52N', + 32653 => 'WGS84 UTM zone 53N', + 32654 => 'WGS84 UTM zone 54N', + 32655 => 'WGS84 UTM zone 55N', + 32656 => 'WGS84 UTM zone 56N', + 32657 => 'WGS84 UTM zone 57N', + 32658 => 'WGS84 UTM zone 58N', + 32659 => 'WGS84 UTM zone 59N', + 32660 => 'WGS84 UTM zone 60N', + 32701 => 'WGS84 UTM zone 1S', + 32702 => 'WGS84 UTM zone 2S', + 32703 => 'WGS84 UTM zone 3S', + 32704 => 'WGS84 UTM zone 4S', + 32705 => 'WGS84 UTM zone 5S', + 32706 => 'WGS84 UTM zone 6S', + 32707 => 'WGS84 UTM zone 7S', + 32708 => 'WGS84 UTM zone 8S', + 32709 => 'WGS84 UTM zone 9S', + 32710 => 'WGS84 UTM zone 10S', + 32711 => 'WGS84 UTM zone 11S', + 32712 => 'WGS84 UTM zone 12S', + 32713 => 'WGS84 UTM zone 13S', + 32714 => 'WGS84 UTM zone 14S', + 32715 => 'WGS84 UTM zone 15S', + 32716 => 'WGS84 UTM zone 16S', + 32717 => 'WGS84 UTM zone 17S', + 32718 => 'WGS84 UTM zone 18S', + 32719 => 'WGS84 UTM zone 19S', + 32720 => 'WGS84 UTM zone 20S', + 32721 => 'WGS84 UTM zone 21S', + 32722 => 'WGS84 UTM zone 22S', + 32723 => 'WGS84 UTM zone 23S', + 32724 => 'WGS84 UTM zone 24S', + 32725 => 'WGS84 UTM zone 25S', + 32726 => 'WGS84 UTM zone 26S', + 32727 => 'WGS84 UTM zone 27S', + 32728 => 'WGS84 UTM zone 28S', + 32729 => 'WGS84 UTM zone 29S', + 32730 => 'WGS84 UTM zone 30S', + 32731 => 'WGS84 UTM zone 31S', + 32732 => 'WGS84 UTM zone 32S', + 32733 => 'WGS84 UTM zone 33S', + 32734 => 'WGS84 UTM zone 34S', + 32735 => 'WGS84 UTM zone 35S', + 32736 => 'WGS84 UTM zone 36S', + 32737 => 'WGS84 UTM zone 37S', + 32738 => 'WGS84 UTM zone 38S', + 32739 => 'WGS84 UTM zone 39S', + 32740 => 'WGS84 UTM zone 40S', + 32741 => 'WGS84 UTM zone 41S', + 32742 => 'WGS84 UTM zone 42S', + 32743 => 'WGS84 UTM zone 43S', + 32744 => 'WGS84 UTM zone 44S', + 32745 => 'WGS84 UTM zone 45S', + 32746 => 'WGS84 UTM zone 46S', + 32747 => 'WGS84 UTM zone 47S', + 32748 => 'WGS84 UTM zone 48S', + 32749 => 'WGS84 UTM zone 49S', + 32750 => 'WGS84 UTM zone 50S', + 32751 => 'WGS84 UTM zone 51S', + 32752 => 'WGS84 UTM zone 52S', + 32753 => 'WGS84 UTM zone 53S', + 32754 => 'WGS84 UTM zone 54S', + 32755 => 'WGS84 UTM zone 55S', + 32756 => 'WGS84 UTM zone 56S', + 32757 => 'WGS84 UTM zone 57S', + 32758 => 'WGS84 UTM zone 58S', + 32759 => 'WGS84 UTM zone 59S', + 32760 => 'WGS84 UTM zone 60S', + 32767 => 'User Defined', + }, + }, + 3073 => 'PCSCitation', + 3074 => { + Name => 'Projection', + PrintConv => { + # epsg_proj + 10101 => 'Alabama CS27 East', + 10102 => 'Alabama CS27 West', + 10131 => 'Alabama CS83 East', + 10132 => 'Alabama CS83 West', + 10201 => 'Arizona Coordinate System east', + 10202 => 'Arizona Coordinate System Central', + 10203 => 'Arizona Coordinate System west', + 10231 => 'Arizona CS83 east', + 10232 => 'Arizona CS83 Central', + 10233 => 'Arizona CS83 west', + 10301 => 'Arkansas CS27 North', + 10302 => 'Arkansas CS27 South', + 10331 => 'Arkansas CS83 North', + 10332 => 'Arkansas CS83 South', + 10401 => 'California CS27 I', + 10402 => 'California CS27 II', + 10403 => 'California CS27 III', + 10404 => 'California CS27 IV', + 10405 => 'California CS27 V', + 10406 => 'California CS27 VI', + 10407 => 'California CS27 VII', + 10431 => 'California CS83 1', + 10432 => 'California CS83 2', + 10433 => 'California CS83 3', + 10434 => 'California CS83 4', + 10435 => 'California CS83 5', + 10436 => 'California CS83 6', + 10501 => 'Colorado CS27 North', + 10502 => 'Colorado CS27 Central', + 10503 => 'Colorado CS27 South', + 10531 => 'Colorado CS83 North', + 10532 => 'Colorado CS83 Central', + 10533 => 'Colorado CS83 South', + 10600 => 'Connecticut CS27', + 10630 => 'Connecticut CS83', + 10700 => 'Delaware CS27', + 10730 => 'Delaware CS83', + 10901 => 'Florida CS27 East', + 10902 => 'Florida CS27 West', + 10903 => 'Florida CS27 North', + 10931 => 'Florida CS83 East', + 10932 => 'Florida CS83 West', + 10933 => 'Florida CS83 North', + 11001 => 'Georgia CS27 East', + 11002 => 'Georgia CS27 West', + 11031 => 'Georgia CS83 East', + 11032 => 'Georgia CS83 West', + 11101 => 'Idaho CS27 East', + 11102 => 'Idaho CS27 Central', + 11103 => 'Idaho CS27 West', + 11131 => 'Idaho CS83 East', + 11132 => 'Idaho CS83 Central', + 11133 => 'Idaho CS83 West', + 11201 => 'Illinois CS27 East', + 11202 => 'Illinois CS27 West', + 11231 => 'Illinois CS83 East', + 11232 => 'Illinois CS83 West', + 11301 => 'Indiana CS27 East', + 11302 => 'Indiana CS27 West', + 11331 => 'Indiana CS83 East', + 11332 => 'Indiana CS83 West', + 11401 => 'Iowa CS27 North', + 11402 => 'Iowa CS27 South', + 11431 => 'Iowa CS83 North', + 11432 => 'Iowa CS83 South', + 11501 => 'Kansas CS27 North', + 11502 => 'Kansas CS27 South', + 11531 => 'Kansas CS83 North', + 11532 => 'Kansas CS83 South', + 11601 => 'Kentucky CS27 North', + 11602 => 'Kentucky CS27 South', + 11631 => 'Kentucky CS83 North', + 11632 => 'Kentucky CS83 South', + 11701 => 'Louisiana CS27 North', + 11702 => 'Louisiana CS27 South', + 11731 => 'Louisiana CS83 North', + 11732 => 'Louisiana CS83 South', + 11801 => 'Maine CS27 East', + 11802 => 'Maine CS27 West', + 11831 => 'Maine CS83 East', + 11832 => 'Maine CS83 West', + 11900 => 'Maryland CS27', + 11930 => 'Maryland CS83', + 12001 => 'Massachusetts CS27 Mainland', + 12002 => 'Massachusetts CS27 Island', + 12031 => 'Massachusetts CS83 Mainland', + 12032 => 'Massachusetts CS83 Island', + 12101 => 'Michigan State Plane East', + 12102 => 'Michigan State Plane Old Central', + 12103 => 'Michigan State Plane West', + 12111 => 'Michigan CS27 North', + 12112 => 'Michigan CS27 Central', + 12113 => 'Michigan CS27 South', + 12141 => 'Michigan CS83 North', + 12142 => 'Michigan CS83 Central', + 12143 => 'Michigan CS83 South', + 12201 => 'Minnesota CS27 North', + 12202 => 'Minnesota CS27 Central', + 12203 => 'Minnesota CS27 South', + 12231 => 'Minnesota CS83 North', + 12232 => 'Minnesota CS83 Central', + 12233 => 'Minnesota CS83 South', + 12301 => 'Mississippi CS27 East', + 12302 => 'Mississippi CS27 West', + 12331 => 'Mississippi CS83 East', + 12332 => 'Mississippi CS83 West', + 12401 => 'Missouri CS27 East', + 12402 => 'Missouri CS27 Central', + 12403 => 'Missouri CS27 West', + 12431 => 'Missouri CS83 East', + 12432 => 'Missouri CS83 Central', + 12433 => 'Missouri CS83 West', + 12501 => 'Montana CS27 North', + 12502 => 'Montana CS27 Central', + 12503 => 'Montana CS27 South', + 12530 => 'Montana CS83', + 12601 => 'Nebraska CS27 North', + 12602 => 'Nebraska CS27 South', + 12630 => 'Nebraska CS83', + 12701 => 'Nevada CS27 East', + 12702 => 'Nevada CS27 Central', + 12703 => 'Nevada CS27 West', + 12731 => 'Nevada CS83 East', + 12732 => 'Nevada CS83 Central', + 12733 => 'Nevada CS83 West', + 12800 => 'New Hampshire CS27', + 12830 => 'New Hampshire CS83', + 12900 => 'New Jersey CS27', + 12930 => 'New Jersey CS83', + 13001 => 'New Mexico CS27 East', + 13002 => 'New Mexico CS27 Central', + 13003 => 'New Mexico CS27 West', + 13031 => 'New Mexico CS83 East', + 13032 => 'New Mexico CS83 Central', + 13033 => 'New Mexico CS83 West', + 13101 => 'New York CS27 East', + 13102 => 'New York CS27 Central', + 13103 => 'New York CS27 West', + 13104 => 'New York CS27 Long Island', + 13131 => 'New York CS83 East', + 13132 => 'New York CS83 Central', + 13133 => 'New York CS83 West', + 13134 => 'New York CS83 Long Island', + 13200 => 'North Carolina CS27', + 13230 => 'North Carolina CS83', + 13301 => 'North Dakota CS27 North', + 13302 => 'North Dakota CS27 South', + 13331 => 'North Dakota CS83 North', + 13332 => 'North Dakota CS83 South', + 13401 => 'Ohio CS27 North', + 13402 => 'Ohio CS27 South', + 13431 => 'Ohio CS83 North', + 13432 => 'Ohio CS83 South', + 13501 => 'Oklahoma CS27 North', + 13502 => 'Oklahoma CS27 South', + 13531 => 'Oklahoma CS83 North', + 13532 => 'Oklahoma CS83 South', + 13601 => 'Oregon CS27 North', + 13602 => 'Oregon CS27 South', + 13631 => 'Oregon CS83 North', + 13632 => 'Oregon CS83 South', + 13701 => 'Pennsylvania CS27 North', + 13702 => 'Pennsylvania CS27 South', + 13731 => 'Pennsylvania CS83 North', + 13732 => 'Pennsylvania CS83 South', + 13800 => 'Rhode Island CS27', + 13830 => 'Rhode Island CS83', + 13901 => 'South Carolina CS27 North', + 13902 => 'South Carolina CS27 South', + 13930 => 'South Carolina CS83', + 14001 => 'South Dakota CS27 North', + 14002 => 'South Dakota CS27 South', + 14031 => 'South Dakota CS83 North', + 14032 => 'South Dakota CS83 South', + 14100 => 'Tennessee CS27', + 14130 => 'Tennessee CS83', + 14201 => 'Texas CS27 North', + 14202 => 'Texas CS27 North Central', + 14203 => 'Texas CS27 Central', + 14204 => 'Texas CS27 South Central', + 14205 => 'Texas CS27 South', + 14231 => 'Texas CS83 North', + 14232 => 'Texas CS83 North Central', + 14233 => 'Texas CS83 Central', + 14234 => 'Texas CS83 South Central', + 14235 => 'Texas CS83 South', + 14301 => 'Utah CS27 North', + 14302 => 'Utah CS27 Central', + 14303 => 'Utah CS27 South', + 14331 => 'Utah CS83 North', + 14332 => 'Utah CS83 Central', + 14333 => 'Utah CS83 South', + 14400 => 'Vermont CS27', + 14430 => 'Vermont CS83', + 14501 => 'Virginia CS27 North', + 14502 => 'Virginia CS27 South', + 14531 => 'Virginia CS83 North', + 14532 => 'Virginia CS83 South', + 14601 => 'Washington CS27 North', + 14602 => 'Washington CS27 South', + 14631 => 'Washington CS83 North', + 14632 => 'Washington CS83 South', + 14701 => 'West Virginia CS27 North', + 14702 => 'West Virginia CS27 South', + 14731 => 'West Virginia CS83 North', + 14732 => 'West Virginia CS83 South', + 14801 => 'Wisconsin CS27 North', + 14802 => 'Wisconsin CS27 Central', + 14803 => 'Wisconsin CS27 South', + 14831 => 'Wisconsin CS83 North', + 14832 => 'Wisconsin CS83 Central', + 14833 => 'Wisconsin CS83 South', + 14901 => 'Wyoming CS27 East', + 14902 => 'Wyoming CS27 East Central', + 14903 => 'Wyoming CS27 West Central', + 14904 => 'Wyoming CS27 West', + 14931 => 'Wyoming CS83 East', + 14932 => 'Wyoming CS83 East Central', + 14933 => 'Wyoming CS83 West Central', + 14934 => 'Wyoming CS83 West', + 15001 => 'Alaska CS27 1', + 15002 => 'Alaska CS27 2', + 15003 => 'Alaska CS27 3', + 15004 => 'Alaska CS27 4', + 15005 => 'Alaska CS27 5', + 15006 => 'Alaska CS27 6', + 15007 => 'Alaska CS27 7', + 15008 => 'Alaska CS27 8', + 15009 => 'Alaska CS27 9', + 15010 => 'Alaska CS27 10', + 15031 => 'Alaska CS83 1', + 15032 => 'Alaska CS83 2', + 15033 => 'Alaska CS83 3', + 15034 => 'Alaska CS83 4', + 15035 => 'Alaska CS83 5', + 15036 => 'Alaska CS83 6', + 15037 => 'Alaska CS83 7', + 15038 => 'Alaska CS83 8', + 15039 => 'Alaska CS83 9', + 15040 => 'Alaska CS83 10', + 15101 => 'Hawaii CS27 1', + 15102 => 'Hawaii CS27 2', + 15103 => 'Hawaii CS27 3', + 15104 => 'Hawaii CS27 4', + 15105 => 'Hawaii CS27 5', + 15131 => 'Hawaii CS83 1', + 15132 => 'Hawaii CS83 2', + 15133 => 'Hawaii CS83 3', + 15134 => 'Hawaii CS83 4', + 15135 => 'Hawaii CS83 5', + 15201 => 'Puerto Rico CS27', + 15202 => 'St Croix', + 15230 => 'Puerto Rico Virgin Is', + 15302 => 'Kentucky CS27', + 15303 => 'Kentucky CS83 North', + 15914 => 'BLM 14N feet', + 15915 => 'BLM 15N feet', + 15916 => 'BLM 16N feet', + 15917 => 'BLM 17N feet', + 16001 => 'UTM zone 1N', + 16002 => 'UTM zone 2N', + 16003 => 'UTM zone 3N', + 16004 => 'UTM zone 4N', + 16005 => 'UTM zone 5N', + 16006 => 'UTM zone 6N', + 16007 => 'UTM zone 7N', + 16008 => 'UTM zone 8N', + 16009 => 'UTM zone 9N', + 16010 => 'UTM zone 10N', + 16011 => 'UTM zone 11N', + 16012 => 'UTM zone 12N', + 16013 => 'UTM zone 13N', + 16014 => 'UTM zone 14N', + 16015 => 'UTM zone 15N', + 16016 => 'UTM zone 16N', + 16017 => 'UTM zone 17N', + 16018 => 'UTM zone 18N', + 16019 => 'UTM zone 19N', + 16020 => 'UTM zone 20N', + 16021 => 'UTM zone 21N', + 16022 => 'UTM zone 22N', + 16023 => 'UTM zone 23N', + 16024 => 'UTM zone 24N', + 16025 => 'UTM zone 25N', + 16026 => 'UTM zone 26N', + 16027 => 'UTM zone 27N', + 16028 => 'UTM zone 28N', + 16029 => 'UTM zone 29N', + 16030 => 'UTM zone 30N', + 16031 => 'UTM zone 31N', + 16032 => 'UTM zone 32N', + 16033 => 'UTM zone 33N', + 16034 => 'UTM zone 34N', + 16035 => 'UTM zone 35N', + 16036 => 'UTM zone 36N', + 16037 => 'UTM zone 37N', + 16038 => 'UTM zone 38N', + 16039 => 'UTM zone 39N', + 16040 => 'UTM zone 40N', + 16041 => 'UTM zone 41N', + 16042 => 'UTM zone 42N', + 16043 => 'UTM zone 43N', + 16044 => 'UTM zone 44N', + 16045 => 'UTM zone 45N', + 16046 => 'UTM zone 46N', + 16047 => 'UTM zone 47N', + 16048 => 'UTM zone 48N', + 16049 => 'UTM zone 49N', + 16050 => 'UTM zone 50N', + 16051 => 'UTM zone 51N', + 16052 => 'UTM zone 52N', + 16053 => 'UTM zone 53N', + 16054 => 'UTM zone 54N', + 16055 => 'UTM zone 55N', + 16056 => 'UTM zone 56N', + 16057 => 'UTM zone 57N', + 16058 => 'UTM zone 58N', + 16059 => 'UTM zone 59N', + 16060 => 'UTM zone 60N', + 16101 => 'UTM zone 1S', + 16102 => 'UTM zone 2S', + 16103 => 'UTM zone 3S', + 16104 => 'UTM zone 4S', + 16105 => 'UTM zone 5S', + 16106 => 'UTM zone 6S', + 16107 => 'UTM zone 7S', + 16108 => 'UTM zone 8S', + 16109 => 'UTM zone 9S', + 16110 => 'UTM zone 10S', + 16111 => 'UTM zone 11S', + 16112 => 'UTM zone 12S', + 16113 => 'UTM zone 13S', + 16114 => 'UTM zone 14S', + 16115 => 'UTM zone 15S', + 16116 => 'UTM zone 16S', + 16117 => 'UTM zone 17S', + 16118 => 'UTM zone 18S', + 16119 => 'UTM zone 19S', + 16120 => 'UTM zone 20S', + 16121 => 'UTM zone 21S', + 16122 => 'UTM zone 22S', + 16123 => 'UTM zone 23S', + 16124 => 'UTM zone 24S', + 16125 => 'UTM zone 25S', + 16126 => 'UTM zone 26S', + 16127 => 'UTM zone 27S', + 16128 => 'UTM zone 28S', + 16129 => 'UTM zone 29S', + 16130 => 'UTM zone 30S', + 16131 => 'UTM zone 31S', + 16132 => 'UTM zone 32S', + 16133 => 'UTM zone 33S', + 16134 => 'UTM zone 34S', + 16135 => 'UTM zone 35S', + 16136 => 'UTM zone 36S', + 16137 => 'UTM zone 37S', + 16138 => 'UTM zone 38S', + 16139 => 'UTM zone 39S', + 16140 => 'UTM zone 40S', + 16141 => 'UTM zone 41S', + 16142 => 'UTM zone 42S', + 16143 => 'UTM zone 43S', + 16144 => 'UTM zone 44S', + 16145 => 'UTM zone 45S', + 16146 => 'UTM zone 46S', + 16147 => 'UTM zone 47S', + 16148 => 'UTM zone 48S', + 16149 => 'UTM zone 49S', + 16150 => 'UTM zone 50S', + 16151 => 'UTM zone 51S', + 16152 => 'UTM zone 52S', + 16153 => 'UTM zone 53S', + 16154 => 'UTM zone 54S', + 16155 => 'UTM zone 55S', + 16156 => 'UTM zone 56S', + 16157 => 'UTM zone 57S', + 16158 => 'UTM zone 58S', + 16159 => 'UTM zone 59S', + 16160 => 'UTM zone 60S', + 16200 => 'Gauss Kruger zone 0', + 16201 => 'Gauss Kruger zone 1', + 16202 => 'Gauss Kruger zone 2', + 16203 => 'Gauss Kruger zone 3', + 16204 => 'Gauss Kruger zone 4', + 16205 => 'Gauss Kruger zone 5', + 17348 => 'Map Grid of Australia 48', + 17349 => 'Map Grid of Australia 49', + 17350 => 'Map Grid of Australia 50', + 17351 => 'Map Grid of Australia 51', + 17352 => 'Map Grid of Australia 52', + 17353 => 'Map Grid of Australia 53', + 17354 => 'Map Grid of Australia 54', + 17355 => 'Map Grid of Australia 55', + 17356 => 'Map Grid of Australia 56', + 17357 => 'Map Grid of Australia 57', + 17358 => 'Map Grid of Australia 58', + 17448 => 'Australian Map Grid 48', + 17449 => 'Australian Map Grid 49', + 17450 => 'Australian Map Grid 50', + 17451 => 'Australian Map Grid 51', + 17452 => 'Australian Map Grid 52', + 17453 => 'Australian Map Grid 53', + 17454 => 'Australian Map Grid 54', + 17455 => 'Australian Map Grid 55', + 17456 => 'Australian Map Grid 56', + 17457 => 'Australian Map Grid 57', + 17458 => 'Australian Map Grid 58', + 18031 => 'Argentina 1', + 18032 => 'Argentina 2', + 18033 => 'Argentina 3', + 18034 => 'Argentina 4', + 18035 => 'Argentina 5', + 18036 => 'Argentina 6', + 18037 => 'Argentina 7', + 18051 => 'Colombia 3W', + 18052 => 'Colombia Bogota', + 18053 => 'Colombia 3E', + 18054 => 'Colombia 6E', + 18072 => 'Egypt Red Belt', + 18073 => 'Egypt Purple Belt', + 18074 => 'Extended Purple Belt', + 18141 => 'New Zealand North Island Nat Grid', + 18142 => 'New Zealand South Island Nat Grid', + 19900 => 'Bahrain Grid', + 19905 => 'Netherlands E Indies Equatorial', + 19912 => 'RSO Borneo', + 19926 => 'Stereo 70', + 32767 => 'User Defined', + }, + }, + 3075 => { + Name => 'ProjCoordTrans', + PrintConv => { + # geo_ctrans + 1 => 'Transverse Mercator', + 2 => 'Transverse Mercator Modified Alaska', + 3 => 'Oblique Mercator', + 4 => 'Oblique Mercator Laborde', + 5 => 'Oblique Mercator Rosenmund', + 6 => 'Oblique Mercator Spherical', # not advisable + 7 => 'Mercator', + 8 => 'Lambert Conf Conic 2SP', + 9 => 'Lambert Conf Conic 1SP', + 10 => 'Lambert Azim Equal Area', + 11 => 'Albers Equal Area', + 12 => 'Azimuthal Equidistant', + 13 => 'Equidistant Conic', + 14 => 'Stereographic', + 15 => 'Polar Stereographic', + 16 => 'Oblique Stereographic', # not advisable + 17 => 'Equirectangular', + 18 => 'Cassini Soldner', + 19 => 'Gnomonic', + 20 => 'Miller Cylindrical', + 21 => 'Orthographic', + 22 => 'Polyconic', + 23 => 'Robinson', + 24 => 'Sinusoidal', + 25 => 'VanDerGrinten', + 26 => 'New Zealand Map Grid', + 27 => 'Transverse Mercator South Orientated', + 28 => 'Cylindrical Equal Area', + 32767 => 'User Defined', + }, + }, + 3076 => { + Name => 'ProjLinearUnits', + SeparateTable => 'Units', + PrintConv => \%epsg_units, + }, + 3077 => 'ProjLinearUnitSize', + 3078 => 'ProjStdParallel1', + 3079 => 'ProjStdParallel2', + 3080 => 'ProjNatOriginLong', + 3081 => 'ProjNatOriginLat', + 3082 => 'ProjFalseEasting', + 3083 => 'ProjFalseNorthing', + 3084 => 'ProjFalseOriginLong', + 3085 => 'ProjFalseOriginLat', + 3086 => 'ProjFalseOriginEasting', + 3087 => 'ProjFalseOriginNorthing', + 3088 => 'ProjCenterLong', + 3089 => 'ProjCenterLat', + 3090 => 'ProjCenterEasting', + 3091 => 'ProjCenterNorthing', + 3092 => 'ProjScaleAtNatOrigin', + 3093 => 'ProjScaleAtCenter', + 3094 => 'ProjAzimuthAngle', + 3095 => 'ProjStraightVertPoleLong', + 3096 => 'ProjRectifiedGridAngle', + 4096 => { + Name => 'VerticalCSType', + SeparateTable => 'VerticalCS', + PrintConv => \%epsg_vertcs, + }, + 4097 => 'VerticalCitation', + 4098 => { + Name => 'VerticalDatum', + SeparateTable => 'VerticalCS', + PrintConv => \%epsg_vertcs, + }, + 4099 => { + Name => 'VerticalUnits', + SeparateTable => 'Units', + PrintConv => \%epsg_units, + }, +# +# ChartTiff extensions (ref 2) +# + 47001 => { + Name => 'ChartFormat', + PrintConv => { + 47500 => 'General', + 47501 => 'Coastal', + 47502 => 'Harbor', + 47503 => 'SailingInternational', + 47504 => 'SmallCraft Route', + 47505 => 'SmallCraftArea', + 47506 => 'SmallCraftFolio', + 47507 => 'Topographic', + 47508 => 'Recreation', + 47509 => 'Index', + 47510 => 'Inset', + }, + }, + 47002 => 'ChartSource', + 47003 => 'ChartSourceEdition', + 47004 => 'ChartSourceDate', + 47005 => 'ChartCorrDate', + 47006 => 'ChartCountryOrigin', + 47007 => 'ChartRasterEdition', + 47008 => { + Name => 'ChartSoundingDatum', + PrintConv => { + 47600 => 'Equatorial Spring Low Water', + 47601 => 'Indian Spring Low Water', + 47602 => 'Lowest Astronomical Tide', + 47603 => 'Lowest Low Water', + 47604 => 'Lowest Normal Low Water', + 47605 => 'Mean Higher High Water', + 47606 => 'Mean High Water', + 47607 => 'Mean High Water Springs', + 47608 => 'Mean Lower Low Water', + 47609 => 'Mean Lower Low Water Springs', + 47610 => 'Mean Low Water', + 47611 => 'Mean Sea Level', + 47612 => 'Tropic Higher High Water', + 47613 => 'Tropic Lower Low Water', + }, + }, + 47009 => { + Name => 'ChartDepthUnits', + SeparateTable => 'Units', + PrintConv => \%epsg_units, + }, + 47010 => 'ChartMagVar', + 47011 => 'ChartMagVarYear', + 47012 => 'ChartMagVarAnnChange', + 47013 => 'ChartWGSNSShift', + 47015 => 'InsetNWPixelX', + 47016 => 'InsetNWPixelY', + 47017 => 'ChartContourInterval', +); + +#------------------------------------------------------------------------------ +# Inputs: 0) ExifTool object ref +# Notes: byte order must be set before calling this routine +sub ProcessGeoTiff($) +{ + my $et = shift; + my $dirData = $et->GetValue('GeoTiffDirectory', 'ValueConv') or return; + + # avoid re-processing if another EXIF directory is found + $$et{DidGeoTiff} and $$et{DidGeoTiff} eq $dirData and return; + $$et{DidGeoTiff} = $dirData; + + my $doubleData = $et->GetValue('GeoTiffDoubleParams', 'ValueConv'); + my $asciiData = $et->GetValue('GeoTiffAsciiParams', 'ValueConv'); + my $verbose = $et->Options('Verbose'); + + if (length($$dirData) >= 8 and + length($$dirData) >= 8 * (Get16u($dirData,6) + 1)) + { + my $version = Get16u($dirData,0); + my $revision = Get16u($dirData,2); + my $minorRev = Get16u($dirData,4); + my $numEntries = Get16u($dirData,6); + + if ($verbose) { + $$et{INDENT} .= '| '; + $et->VerboseDir('GeoTiff',$numEntries); + } + # generate version number tag (not a real GeoTiff tag) + my $tagTable = GetTagTable("Image::ExifTool::GeoTiff::Main"); + my $tagInfo = $et->GetTagInfo($tagTable, 1); + $tagInfo and $et->FoundTag($tagInfo,"$version.$revision.$minorRev"); + + my $i; + for ($i=0; $i<$numEntries; ++$i) { + my $pt = 8 * ($i + 1); + my $tag = Get16u($dirData, $pt); + $tagInfo = $et->GetTagInfo($tagTable, $tag) or next; + my $loc = Get16u($dirData, $pt+2); + my $count = Get16u($dirData, $pt+4); + my $offset = Get16u($dirData, $pt+6); + my $format = $geoTiffFormat{$loc}; + my ($val, $dataPt); + if (not $format) { + $et->Warn("Unknown GeoTiff location ($loc) for $$tagInfo{Name}"); + next; + } elsif ($format eq 'double') { # in the double parms + $dataPt = $doubleData; + } elsif ($format eq 'string') { # in the ASCII parms + $dataPt = $asciiData; + } elsif ($format eq 'int16u') { # in the GeoTiffDirectory data + $dataPt = $dirData; + unless ($loc) { # is value is stored in offset? + $count = 1; # (implied by location of 0) + $offset = ($pt + 6) / 2; # offset of the "offset" value + } + } + my $size = Image::ExifTool::FormatSize($format); + if (not $dataPt or length($$dataPt) < $size*($offset+$count)) { + $et->Warn("Missing $format data for $$tagInfo{Name}"); + next; + } + $offset *= $size; + $val = Image::ExifTool::ReadValue($dataPt, $offset, $format, + $count, length($$dataPt)-$offset); + # remove trailing terminator (NULL or '|') from string value + $val =~ s/(\0|\|)$// if $format eq 'string'; + $verbose and $et->VerboseInfo($tag, $tagInfo, + 'Table' => $tagTable, + 'Index' => $i, + 'Value' => $val, + 'DataPt' => $dataPt, + 'Start' => $offset, + 'Format' => $format, + 'Count' => $count, + 'Size' => $count * $size, + ); + $et->FoundTag($tagInfo, $val); + } + if ($verbose) { + $$et{INDENT} =~ s/..$//; + } + } else { + $et->Warn('Bad GeoTIFF directory'); + } + # extract block tags only if requested + unless ($$et{OPTIONS}{RequestAll}) { + $et->DeleteTag('GeoTiffDirectory') unless $$et{REQ_TAG_LOOKUP}{geotiffdirectory}; + $et->DeleteTag('GeoTiffDoubleParams') unless $$et{REQ_TAG_LOOKUP}{geotiffdoubleparams}; + $et->DeleteTag('GeoTiffAsciiParams') unless $$et{REQ_TAG_LOOKUP}{geotiffasciiparams}; + } +} + + +1; #end + +__END__ + +=head1 NAME + +Image::ExifTool::GeoTiff - Read GeoTiff meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +GeoTiff meta information. GeoTiff information is used in images to specify +exact geometric mappings used to transform the image to real world +coordinates. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item ftp://ftp.remotesensing.org/geotiff/libgeotiff/libgeotiff-1.1.4.tar.gz + +=item http://www.charttiff.com/whitepapers.shtml + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/GeoTiff Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Geotag.pm b/lib/Image/ExifTool/Geotag.pm new file mode 100644 index 0000000..7d95872 --- /dev/null +++ b/lib/Image/ExifTool/Geotag.pm @@ -0,0 +1,1475 @@ +#------------------------------------------------------------------------------ +# File: Geotag.pm +# +# Description: Geotagging utility routines +# +# Revisions: 2009/04/01 - P. Harvey Created +# 2009/09/27 - PH Added Geosync feature +# 2009/06/25 - PH Read Garmin TCX track logs +# 2009/09/11 - PH Read ITC GPS track logs +# 2012/01/08 - PH Extract orientation information from PTNTHPR +# 2012/05/08 - PH Read Winplus Beacon .TXT files +# 2015/05/30 - PH Read Bramor gEO log files +# 2016/07/13 - PH Added ability to geotag date/time only +# 2019/07/02 - PH Added ability to read IMU CSV files +# 2019/11/10 - PH Also write pitch to CameraElevationAngle +# 2020/12/01 - PH Added ability to read DJI CSV log files +# 2022/06/21 - PH Added ability to read Google Takeout JSON files +# +# References: 1) http://www.topografix.com/GPX/1/1/ +# 2) http://www.gpsinformation.org/dale/nmea.htm#GSA +# 3) http://code.google.com/apis/kml/documentation/kmlreference.html +# 4) http://www.fai.org/gliding/system/files/tech_spec_gnss.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::Geotag; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:Public); +use Image::ExifTool::GPS; + +$VERSION = '1.68'; + +sub JITTER() { return 2 } # maximum time jitter + +sub GetTime($); +sub SetGeoValues($$;$); +sub PrintFixTime($); +sub PrintFix($@); + +# XML tags that we recognize (keys are forced to lower case) +my %xmlTag = ( + lat => 'lat', # GPX + latitude => 'lat', # Garmin + latitudedegrees => 'lat', # Garmin TCX + lon => 'lon', # GPX + longitude => 'lon', # Garmin + longitudedegrees => 'lon', # Garmin TCX + ele => 'alt', # GPX + elevation => 'alt', # PH + alt => 'alt', # PH + altitude => 'alt', # Garmin + altitudemeters => 'alt', # Garmin TCX + 'time' => 'time', # GPX/Garmin + fix => 'fixtype', # GPX + hdop => 'hdop', # GPX + vdop => 'vdop', # GPX + pdop => 'pdop', # GPX + sat => 'nsats', # GPX + atemp => 'atemp', # GPX (Garmin 550t) + when => 'time', # KML + coordinates => 'coords', # KML + coord => 'coords', # KML, as written by Google Location History + begin => 'begin', # KML TimeSpan + end => 'time', # KML TimeSpan + course => 'dir', # (written by Arduino) + pitch => 'pitch', # (written by Arduino) + roll => 'roll', # (written by Arduino) + # XML containers (fix is reset at the opening tag of these properties) + wpt => '', # GPX + trkpt => '', # GPX + rtept => '', # GPX + trackpoint => '', # Garmin + placemark => '', # KML +); + +# fix information keys which must be interpolated around a circle +my %cyclical = (lon => 1, track => 1, dir => 1, roll => 1); + +# fix information keys for each of our general categories +my %fixInfoKeys = ( + 'pos' => [ 'lat', 'lon' ], + track => [ 'track', 'speed' ], + alt => [ 'alt' ], + orient => [ 'dir', 'pitch', 'roll' ], + atemp => [ 'atemp' ], +); + +my %isOrient = ( dir => 1, pitch => 1, roll => 1 ); # test for orientation key + +# conversion factors for GPSSpeed +my %speedConv = ( + 'K' => 1.852, # km/h per knot + 'M' => 1.150779448, # mph per knot + 'k' => 'K', # (allow lower case) + 'm' => 'M', + 'km/h' => 'K', # (allow other formats) + 'mph' => 'M', +); + +my $secPerDay = 24 * 3600; # a useful constant + +#------------------------------------------------------------------------------ +# Load GPS track log file +# Inputs: 0) ExifTool ref, 1) track log data or file name +# Returns: geotag hash data reference or error string +# - the geotag hash has the following members: +# Points - hash of GPS fix information hashes keyed by Unix time +# Times - list of sorted Unix times (keys of Points hash) +# NoDate - flag if some points have no date (ie. referenced to 1970:01:01) +# IsDate - flag if some points have date +# Has - hash of flags for available information (track, orient, alt) +# - the fix information hash may contain: +# lat - signed latitude (required) +# lon - signed longitude (required) +# alt - signed altitude +# time - fix time in UTC as XML string +# fixtype- type of fix ('none'|'2d'|'3d'|'dgps'|'pps') +# pdop - dilution of precision +# hdop - horizontal DOP +# vdop - vertical DOP +# sats - comma-separated list of active satellites +# nsats - number of active satellites +# track - track heading (deg true) +# dir - image direction (deg true) +# pitch - pitch angle (deg) +# roll - roll angle (deg) +# speed - speed (knots) +# first - flag set for first fix of track +# - concatenates new data with existing track data stored in ExifTool NEW_VALUE +# for the Geotag tag +sub LoadTrackLog($$;$) +{ + local ($_, $/, *EXIFTOOL_TRKFILE); + my ($et, $val) = @_; + my ($raf, $from, $time, $isDate, $noDate, $noDateChanged, $lastDate, $dateFlarm); + my ($nmeaStart, $fixSecs, @fixTimes, $lastFix, %nmea, @csvHeadings, $sortFixes); + my ($canCut, $cutPDOP, $cutHDOP, $cutSats, $e0, $e1, @tmp, $trackFile, $trackTime); + + unless (eval { require Time::Local }) { + return 'Geotag feature requires Time::Local installed'; + } + # add data to existing track + my $geotag = $et->GetNewValue('Geotag') || { }; + + # initialize track points lookup + my $points = $$geotag{Points}; + $points or $points = $$geotag{Points} = { }; + + # get lookup for available information types + my $has = $$geotag{Has}; + $has or $has = $$geotag{Has} = { 'pos' => 1 }; + + my $format = ''; + # is $val track log data? + if ($val =~ /^(\xef\xbb\xbf)?<(\?xml|gpx)[\s>]/) { + $format = 'XML'; + $/ = '>'; # set input record separator to '>' for XML/GPX data + } elsif ($val =~ /(\x0d\x0a|\x0d|\x0a)/) { + $/ = $1; + } else { + # $val is track file name + if ($et->Open(\*EXIFTOOL_TRKFILE, $val)) { + $trackFile = $val; + $raf = new File::RandomAccess(\*EXIFTOOL_TRKFILE); + unless ($raf->Read($_, 256)) { + close EXIFTOOL_TRKFILE; + return "Empty track file '${val}'"; + } + # look for XML or GPX header (might as well allow UTF-8 BOM) + if (/^(\xef\xbb\xbf)?<(\?xml|gpx)[\s>]/) { + $format = 'XML'; + $/ = '>'; # set input record separator to '>' for XML/GPX data + } elsif (/(\x0d\x0a|\x0d|\x0a)/) { + $/ = $1; + } else { + close EXIFTOOL_TRKFILE; + return "Invalid track file '${val}'"; + } + $raf->Seek(0,0); + $from = "file '${val}'"; + } elsif ($val eq 'DATETIMEONLY') { + $$geotag{DateTimeOnly} = 1; + $$geotag{IsDate} = 1; + $et->VPrint(0, 'Geotagging date/time only'); + return $geotag; + } else { + return "Error opening GPS file '${val}'"; + } + } + unless ($from) { + # set up RAF for reading log file in memory + $raf = new File::RandomAccess(\$val); + $from = 'data'; + } + + # initialize cuts + my $maxHDOP = $et->Options('GeoMaxHDOP'); + my $maxPDOP = $et->Options('GeoMaxPDOP'); + my $minSats = $et->Options('GeoMinSats'); + my $isCut = $maxHDOP || $maxPDOP || $minSats; + + my $numPoints = 0; + my $skipped = 0; + my $lastSecs = 0; + my $fix = { }; + my $csvDelim = $et->Options('CSVDelim'); + $csvDelim = ',' unless defined $csvDelim; + my (@saveFix, $timeSpan); + for (;;) { + $raf->ReadLine($_) or last; + # determine file format + if (not $format) { + s/^\xef\xbb\xbf//; # remove leading BOM if it exists + if (/^<(\?xml|gpx)[\s>]/) { # look for XML or GPX header + $format = 'XML'; + # check for NMEA sentence + # (must ONLY start with ones that have timestamps! eg. not GSA or PTNTHPR!) + } elsif (/^.*\$([A-Z]{2}(RMC|GGA|GLL|ZDA)|PMGNTRK),/) { + $format = 'NMEA'; + $nmeaStart = $2 || $1; # save type of first sentence + } elsif (/^A(FLA|XSY|FIL)/) { + # (don't set format yet because we want to read HFDTE first) + $nmeaStart = 'B' ; + next; + } elsif (/^HFDTE(?:DATE:)?(\d{2})(\d{2})(\d{2})/) { + my $year = $3 + ($3 >= 70 ? 1900 : 2000); + $dateFlarm = Time::Local::timegm(0,0,0,$1,$2-1,$year); + $nmeaStart = 'B' ; + $format = 'IGC'; + next; + } elsif ($nmeaStart and /^B/) { + # parse IGC fixes without a date + $format = 'IGC'; + } elsif (/^TP,D,/) { + $format = 'Winplus'; + } elsif (/^\s*\d+\s+.*\sypr\s*$/ and (@tmp=split) == 12) { + $format = 'Bramor'; + } elsif (((/\b(GPS)?Date/i and /\b(GPS)?(Date)?Time/i) or /\bTime\(seconds\)/i) and /\Q$csvDelim/) { + chomp; + @csvHeadings = split /\Q$csvDelim/; + $format = 'CSV'; + # convert recognized headings to our parameter names + foreach (@csvHeadings) { + my $param; + s/^GPS ?//; # remove leading "GPS" to simplify regex patterns + if (/^Time ?\(seconds\)$/i) { # DJI + # DJI CSV log files have a column "Time(seconds)" which is seconds since + # the start of the flight. The date/time is obtained from the file name. + $param = 'runtime'; + if ($trackFile and $trackFile =~ /(\d{4})-(\d{2})-(\d{2})[^\/]+(\d{2})-(\d{2})-(\d{2})[^\/]*$/) { + $trackTime = Image::ExifTool::TimeLocal($6,$5,$4,$3,$2-1,$1); + my $utc = PrintFixTime($trackTime); + my $tzs = Image::ExifTool::TimeZoneString([$6,$5,$4,$3,$2-1,$1-1900],$trackTime); + $et->VPrint(2, " DJI start time: $utc (local timezone is $tzs)\n"); + } else { + return 'Error getting start time from file name for DJI CSV track file'; + } + } elsif (/^Date ?Time/i) { # ExifTool addition + $param = 'datetime'; + } elsif (/^Date/i) { + $param = 'date'; + } elsif (/^Time(?! ?\(text\))/i) { # (ignore DJI "Time(text)" column) + $param = 'time'; + } elsif (/^(Pos)?Lat/i) { + $param = 'lat'; + /ref$/i and $param .= 'ref'; + } elsif (/^(Pos)?Lon/i) { + $param = 'lon'; + /ref$/i and $param .= 'ref'; + } elsif (/^(Pos)?Alt/i) { + $param = 'alt'; + } elsif (/^(Angle)?(Heading|Track)/i) { + $param = 'track'; + } elsif (/^(Angle)?Pitch/i or /^Camera ?Elevation ?Angle/i) { + $param = 'pitch'; + } elsif (/^(Angle)?Roll/i) { + $param = 'roll'; + } + if ($param) { + $et->VPrint(2, "CSV column '${_}' is $param\n"); + $_ = $param; + } else { + $et->VPrint(2, "CSV column '${_}' ignored\n"); + $_ = ''; # ignore this column + } + } + next; + } elsif (/"(timelineObjects|placeVisit|activitySegment|latitudeE7)":/) { + # Google Takeout JSON format + $format = 'JSON'; + $sortFixes = 1; # (fixes are not all in order for this format) + } else { + # search only first 50 lines of file for a valid fix + last if ++$skipped > 50; + next; + } + } +# +# XML format (GPX, KML, Garmin XML/TCX etc) +# + if ($format eq 'XML') { + my ($arg, $tok, $td); + s/\s*=\s*(['"])\s*/=$1/g; # remove unnecessary white space in attributes + # Workaround for KML generated by Google Location History: + # lat/lon/alt are space-separated; we want commas. + s{(\S+)\s+(\S+)\s+(\S+)(</gx:coord>)}{$1,$2,$3$4}; + foreach $arg (split) { + # parse attributes (eg. GPX 'lat' and 'lon') + # (note: ignore namespace prefixes if they exist) + if ($arg =~ /^(\w+:)?(\w+)=(['"])(.*?)\3/g) { + my $tag = $xmlTag{lc $2}; + if ($tag) { + $$fix{$tag} = $4; + if ($isOrient{$tag}) { + $$has{orient} = 1; + } elsif ($tag eq 'alt') { + # validate altitude + undef $$fix{alt} if defined $$fix{alt} and $$fix{alt} !~ /^[+-]?\d+\.?\d*/; + $$has{alt} = 1 if $$fix{alt}; # set "has altitude" flag if appropriate + } elsif ($tag eq 'atemp') { + $$has{atemp} = 1; + } + } + } + # loop through XML elements + while ($arg =~ m{([^<>]*)<(/)?(\w+:)?(\w+)(>|$)}g) { + my $tag = $xmlTag{$tok = lc $4}; + # parse as a simple property if this element has a value + if (defined $tag and not $tag) { + # a containing property was opened or closed + if (not $2) { + # opened: start a new fix + $lastFix = $fix = { }; + undef @saveFix; + next; + } elsif ($fix and $lastFix and %$fix) { + # closed: transfer additional tags from current fix + foreach (keys %$fix) { + $$lastFix{$_} = $$fix{$_} unless defined $$lastFix{$_}; + } + undef $lastFix; + } + } + if (length $1) { + if ($tag) { + if ($tag eq 'coords') { + # save other fixes if there are more than one + if (defined $$fix{lon} and defined $$fix{lat} and defined $$fix{alt}) { + push @saveFix, [ @$fix{'lon','lat','alt'} ]; + } + # read KML "Point" coordinates + @$fix{'lon','lat','alt'} = split ',', $1; + } else { + $$fix{$tag} = $1; + if ($isOrient{$tag}) { + $$has{orient} = 1; + } elsif ($tag eq 'alt') { + # validate altitude + undef $$fix{alt} if defined $$fix{alt} and $$fix{alt} !~ /^[+-]?\d+\.?\d*/; + $$has{alt} = 1 if $$fix{alt}; # set "has altitude" flag if appropriate + } elsif ($tag eq 'atemp') { + $$has{atemp} = 1; + } + } + } + next; + } elsif ($tok eq 'td') { + $td = 1; + } + # validate and store GPS fix + next unless defined $$fix{lat} and defined $$fix{lon} and $$fix{'time'}; + unless ($$fix{lat} =~ /^[+-]?\d+\.?\d*/ and $$fix{lon} =~ /^[+-]?\d+\.?\d*/) { + $e0 or $et->VPrint(0, "Coordinate format error in $from\n"), $e0 = 1; + next; + } + unless (defined($time = GetTime($$fix{'time'}))) { + $e1 or $et->VPrint(0, "Timestamp format error in $from\n"), $e1 = 1; + next; + } + $isDate = 1; + $canCut= 1 if defined $$fix{pdop} or defined $$fix{hdop} or defined $$fix{nsats}; + # generate extra fixes assuming an equally spaced track + if ($$fix{begin}) { + my $begin = GetTime($$fix{begin}); + undef $$fix{begin}; + if (defined $begin and $begin < $time) { + $$fix{span} = $timeSpan = ($timeSpan || 0) + 1; + my $i; + # duplicate the fix if there is only one so we will have + # a fix and the start and end of the TimeSpan + @saveFix or push @saveFix, [ @$fix{'lon','lat','alt'} ]; + for ($i=0; $i<@saveFix; ++$i) { + my $t = $begin + ($time - $begin) * ($i / scalar(@saveFix)); + my %f; + @f{'lon','lat','alt'} = @{$saveFix[$i]}; + $t += 0.001 if not $i and $$points{$t}; # (avoid dupicates) + $f{span} = $timeSpan; + $$points{$t} = \%f; + push @fixTimes, $t; + } + } + } + $$points{$time} = $fix; + push @fixTimes, $time; # save times of all fixes in order + $fix = { }; + undef @saveFix; + ++$numPoints; + } + } + # last ditch check KML description for timestamp (assume it is UTC) + $$fix{'time'} = "$1T$2Z" if $td and not $$fix{'time'} and + /[\s>](\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2}:\d{2}(\.\d+)?)/; + next; +# +# Winplus Beacon text file +# + } elsif ($format eq 'Winplus') { + # TP,D, 44.933666667, -93.186555556, 10/26/2011, 19:07:28, 0 + # latitude longitude date time + /^TP,D,\s*([-+]?\d+\.\d*),\s*([-+]?\d+\.\d*),\s*(\d+)\/(\d+)\/(\d{4}),\s*(\d+):(\d+):(\d+)/ or next; + $$fix{lat} = $1; + $$fix{lon} = $2; + $time = Time::Local::timegm($8,$7,$6,$4,$3-1,$5); +DoneFix: $isDate = 1; + $$points{$time} = $fix; + push @fixTimes, $time; + $fix = { }; + ++$numPoints; + next; +# +# Bramor gEO log file +# + } elsif ($format eq 'Bramor') { + # 1 0015 18.723675 50.672752 149 169.31 22/04/2015 07:06:55 169.31 8.88 28.07 ypr + # ? index latitude longitude alt track date time dir pitch roll + my @parts = split ' ', $_; + next unless @parts == 12 and $parts[11] eq 'ypr'; + my @d = split m{/}, $parts[6]; # date (dd/mm/YYYY) + my @t = split m{:}, $parts[7]; # time (HH:MM:SS) + next unless @d == 3 and @t == 3; + @$fix{qw(lat lon alt track dir pitch roll)} = @parts[2,3,4,5,8,9,10]; + # (add the seconds afterwards in case some models have decimal seconds) + $time = Time::Local::timegm(0,$t[1],$t[0],$d[0],$d[1]-1,$d[2]) + $t[2]; + # set necessary flags for extra available information + @$has{qw(alt track orient)} = (1,1,1); + goto DoneFix; # save this fix + } elsif ($format eq 'CSV') { + chomp; + my @vals = split /\Q$csvDelim/; +# +# CSV format output of GPS/IMU POS system +# Date* - date in DD/MM/YYYY format +# Time* - time in HH:MM:SS.SSS format +# [Pos]Lat* - latitude in decimal degrees +# [Pos]Lon* - longitude in decimal degrees +# [Pos]Alt* - altitude in m relative to sea level +# [Angle]Heading* - GPSTrack in degrees true +# [Angle]Pitch* - pitch angle in degrees +# [Angle]Roll* - roll angle in degrees +# (ExifTool enhancements allow for standard tag names or descriptions as the column headings, +# add support for time zones and flexible coordinates, and allow new DateTime and Shift columns) +# + my ($param, $date, $secs, %neg); + foreach $param (@csvHeadings) { + my $val = shift @vals; + last unless defined $val; + next unless $param; + if ($param eq 'datetime') { + local $SIG{'__WARN__'} = sub { }; + my $dateTime = $et->InverseDateTime($val); + if ($dateTime) { + $date = Image::ExifTool::GetUnixTime($val, 2); + $secs = 0; + } + } elsif ($param eq 'date') { + if ($val =~ m{^(\d{2})/(\d{2})/(\d{4})$}) { + $date = Time::Local::timegm(0,0,0,$1,$2-1,$3); + } elsif ($val =~ /(\d{4}).*?(\d{2}).*?(\d{2})/) { + $date = Time::Local::timegm(0,0,0,$3,$2-1,$1); + } + } elsif ($param eq 'time') { + if ($val =~ /^(\d{1,2}):(\d{2}):(\d{2}(\.\d+)?).*?(([-+])(\d{1,2}):?(\d{2}))?/) { + $secs = (($1 * 60) + $2) * 60 + $3; + # adjust for time zone if specified + $secs += ($7 * 60 + $8) * ($6 eq '-' ? 60 : -60) if $5; + } + } elsif ($param eq 'lat' or $param eq 'lon') { + $$fix{$param} = Image::ExifTool::GPS::ToDegrees($val, 1); + } elsif ($param eq 'latref') { + $neg{lat} = 1 if $val =~ /^S/i; + } elsif ($param eq 'lonref') { + $neg{lon} = 1 if $val =~ /^W/i; + } elsif ($param eq 'runtime') { + $date = $trackTime; + $secs = $val; + } else { + $$fix{$param} = $val; + } + } + # make coordinate negative according to reference direction if necessary + foreach $param (keys %neg) { + next unless defined $$fix{$param}; + $$fix{$param} = -abs($$fix{$param}); + } + if ($date and defined $secs and defined $$fix{lat} and defined $$fix{lon}) { + $time = $date + $secs; + $$has{alt} = 1 if defined $$fix{alt}; + $$has{track} = 1 if defined $$fix{track}; + $$has{orient} = 1 if defined $$fix{pitch}; + goto DoneFix; + } + next; + } elsif ($format eq 'JSON') { + # Google Takeout JSON format + if (/"(latitudeE7|longitudeE7|latE7|lngE7|timestamp)":\s*"?(.*?)"?,?\s*[\x0d\x0a]/) { + if ($1 eq 'timestamp') { + $time = GetTime($2); + goto DoneFix if $time and $$fix{lat} and $$fix{lon}; + } elsif ($1 eq 'latitudeE7' or $1 eq 'latE7') { + $$fix{lat} = $2 * 1e-7; + } else { + $$fix{lon} = $2 * 1e-7; + } + } + next; + } + my (%fix, $secs, $date, $nmea); + if ($format eq 'NMEA') { + # ignore unrecognized NMEA sentences + # (first 2 characters: GP=GPS, GL=GLONASS, GA=Gallileo, GN=combined, BD=Beidou) + next unless /^(.*)\$([A-Z]{2}(RMC|GGA|GLL|GSA|ZDA)|PMGNTRK|PTNTHPR),/; + $nmea = $3 || $2; + $_ = substr($_, length($1)) if length($1); + } +# +# IGC (flarm) (ref 4) +# + if ($format eq 'IGC') { + # B0939564531208N00557021EA007670089100207 + # BHHMMSSDDMMmmmNDDDMMmmmEAaaaaaAAAAAxxyy + # HH MM SS DD MM mmm DDD MM mmm aaaaa AAAAA + # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + /^B(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{3})([NS])(\d{3})(\d{2})(\d{3})([EW])([AV])(\d{5})(\d{5})/ or next; + $fix{lat} = ($4 + ($5 + $6/1000)/60) * ($7 eq 'N' ? 1 : -1); + $fix{lon} = ($8 + ($9 +$10/1000)/60) * ($11 eq 'E' ? 1 : -1); + $fix{alt} = $12 eq 'A' ? $14 : undef; + $secs = (($1 * 60) + $2) * 60 + $3; + # wrap to next day if necessary + if ($dateFlarm) { + $dateFlarm += $secPerDay if $secs < $lastSecs - JITTER(); + $date = $dateFlarm; + } + $nmea = 'B'; +# +# NMEA RMC sentence (contains date) +# + } elsif ($nmea eq 'RMC') { + # $GPRMC,092204.999,A,4250.5589,S,14718.5084,E,0.00,89.68,211200,,*25 + # $GPRMC,093657.007,,3652.835020,N,01053.104094,E,1.642,,290913,,,A*0F + # $GPRMC,hhmmss.sss,A/V,ddmm.mmmm,N/S,ddmmm.mmmm,E/W,spd(knots),dir(deg),DDMMYY,,*cs + /^\$[A-Z]{2}RMC,(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/ or next; + next if $13 > 31 or $14 > 12 or $15 > 99; # validate day/month/year + $fix{lat} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1); + $fix{lon} = (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1); + $fix{speed} = $11 if length $11; + $fix{track} = $12 if length $12; + my $year = $15 + ($15 >= 70 ? 1900 : 2000); + $secs = (($1 * 60) + $2) * 60 + $3; + $date = Time::Local::timegm(0,0,0,$13,$14-1,$year); +# +# NMEA GGA sentence (no date) +# + } elsif ($nmea eq 'GGA') { + # $GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F + # $GPGGA,093657.000,3652.835020,N,01053.104094,E,,8,,166.924,M,40.9,M,,*77 + # $GPGGA,hhmmss.sss,ddmm.mmmm,N/S,dddmm.mmmm,E/W,0=invalid,sats,hdop,alt,M,... + /^\$[A-Z]{2}GGA,(\d{2})(\d{2})(\d+(\.\d*)?),(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),[1-6]?,(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?/ or next; + $fix{lat} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1); + $fix{lon} = (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1); + @fix{qw(nsats hdop alt)} = ($11,$12,$13); + $secs = (($1 * 60) + $2) * 60 + $3; + $canCut = 1; +# +# NMEA GLL sentence (no date) +# + } elsif ($nmea eq 'GLL') { + # $GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D + # $GPGLL,ddmm.mmmm,N/S,dddmm.mmmm,E/W,hhmmss.sss,A/V*cs + /^\$[A-Z]{2}GLL,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d{2})(\d{2})(\d+(\.\d*)?),A/ or next; + $fix{lat} = (($1 || 0) + $2/60) * ($3 eq 'N' ? 1 : -1); + $fix{lon} = (($4 || 0) + $5/60) * ($6 eq 'E' ? 1 : -1); + $secs = (($7 * 60) + $8) * 60 + $9; +# +# NMEA GSA sentence (satellite status, no date) +# + } elsif ($nmea eq 'GSA') { + # $GPGSA,A,3,04,05,,,,,,,,,,,pdop,hdop,vdop*HH + /^\$[A-Z]{2}GSA,[AM],([23]),((?:\d*,){11}(?:\d*)),(\d+\.?\d*|\.\d+)?,(\d+\.?\d*|\.\d+)?,(\d+\.?\d*|\.\d+)?\*/ or next; + @fix{qw(fixtype sats pdop hdop vdop)} = ($1.'d',$2,$3,$4,$5); + # count the number of acquired satellites + my @a = ($fix{sats} =~ /\d+/g); + $fix{nsats} = scalar @a; + $canCut = 1; +# +# NMEA ZDA sentence (date/time, contains date) +# + } elsif ($nmea eq 'ZDA') { + # $GPZDA,093655.000,29,09,2013,,*58 + # $GPZDA,hhmmss.ss,DD,MM,YYYY,tzh,tzm (hhmmss in UTC) + /^\$[A-Z]{2}ZDA,(\d{2})(\d{2})(\d{2}(\.\d*)?),(\d+),(\d+),(\d+)/ or next; + $secs = (($1 * 60) + $2) * 60 + $3; + $date = Time::Local::timegm(0,0,0,$5,$6-1,$7); +# +# Magellan eXplorist PMGNTRK (Proprietary MaGellaN TRacK) sentence (optional date) +# + } elsif ($nmea eq 'PMGNTRK') { + # $PMGNTRK,4415.026,N,07631.091,W,00092,M,185031.06,A,,020409*65 + # $PMGNTRK,ddmm.mmm,N/S,dddmm.mmm,E/W,alt,F/M,hhmmss.ss,A/V,trkname,DDMMYY*cs + /^\$PMGNTRK,(\d+)(\d{2}\.\d+),([NS]),(\d+)(\d{2}\.\d+),([EW]),(-?\d+\.?\d*),([MF]),(\d{2})(\d{2})(\d+(\.\d*)?),A,(?:[^,]*,(\d{2})(\d{2})(\d+))?/ or next; + $fix{lat} = ($1 + $2/60) * ($3 eq 'N' ? 1 : -1); + $fix{lon} = ($4 + $5/60) * ($6 eq 'E' ? 1 : -1); + $fix{alt} = $8 eq 'M' ? $7 : $7 * 12 * 0.0254; + $secs = (($9 * 60) + $10) * 60 + $11; + if (defined $15) { + next if $13 > 31 or $14 > 12 or $15 > 99; # validate day/month/year + # optional date is available in PMGNTRK sentence + my $year = $15 + ($15 >= 70 ? 1900 : 2000); + $date = Time::Local::timegm(0,0,0,$13,$14-1,$year); + } +# +# Honeywell HMR3000 PTNTHPR (Heading Pitch Roll) sentence (no date) +# (ref http://www.gpsarea.com/uploadfile/download/introduce/hmr3000_manual.pdf) +# + } elsif ($nmea eq 'PTNTHPR') { + # $PTNTHPR,85.9,N,-0.9,N,0.8,N*HH + # $PTNTHPR,heading,heading status,pitch,pitch status,roll,roll status,*cs + # status: L=low alarm, M=low warning, N=normal, O=high warning + # P=high alarm, C=tuning analog circuit + # (ignore this information on any alarm status) + /^\$PTNTHPR,(-?[\d.]+),[MNO],(-?[\d.]+),[MNO],(-?[\d.]+),[MNO]/ or next; + @fix{qw(dir pitch roll)} = ($1,$2,$3); + + } else { + next; # this shouldn't happen + } + # remember the NMEA formats we successfully read + $nmea{$nmea} = 1; + # use last date if necessary (and appropriate) + if (defined $secs and not defined $date and defined $lastDate) { + # wrap to next day if necessary + if ($secs < $lastSecs - JITTER()) { + $lastSecs -= $secPerDay; + $lastDate += $secPerDay; + } + # use earlier date only if we are within 10 seconds + if ($secs - $lastSecs < 10) { + # last date is close, use it for this fix + $date = $lastDate; + } else { + # last date is old, discard it + undef $lastDate; + undef $lastSecs; + } + } + # save our last date/time + if (defined $date) { + $lastDate = $date; + $lastSecs = $secs; + } +# +# Add NMEA/IGC fix to our lookup +# (this is much more complicated than it needs to be because +# the stupid NMEA format provides no end-of-fix indication) +# + # assumptions for each NMEA sentence: + # - we only parse a time if we get a lat/lon + # - we always get a time if we have a date + if ($nmea eq $nmeaStart or (defined $secs and (not defined $fixSecs or + # don't combine sentences that are outside 10 seconds apart + ($secs >= $fixSecs and $secs - $fixSecs >= 10) or + ($secs < $fixSecs and $secs + $secPerDay - $fixSecs >= 10)))) + { + # start a new fix + $fix = \%fix; + $fixSecs = $secs; + undef $noDateChanged; + # does this fix have a date/time or time stamp? + if (defined $date) { + $fix{isDate} = $isDate = 1; + $time = $date + $secs; + } elsif (defined $secs) { + $time = $secs; + $noDate = $noDateChanged = 1; + } else { + next; # wait until we have a time before adding to lookup + } + } else { + # add new data to existing fix (but don't overwrite earlier values to + # keep the coordinates in sync with the fix time) + foreach (keys %fix) { + $$fix{$_} = $fix{$_} unless defined $$fix{$_}; + } + if (defined $date) { + next if $$fix{isDate}; + # move this fix to the proper date + if (defined $fixSecs) { + delete $$points{$fixSecs}; + pop @fixTimes if @fixTimes and $fixTimes[-1] == $fixSecs; + --$numPoints; + # if we wrapped to the next day since the start of this fix, + # we must shift the date back to the day of $fixSecs + $date -= $secPerDay if $secs < $fixSecs; + } else { + $fixSecs = $secs; + } + $time = $date + $fixSecs; + $$fix{isDate} = $isDate = 1; + # revert noDate flag if it was set for this fix + $noDate = 0 if $noDateChanged; + } elsif (defined $secs and not defined $fixSecs) { + $time = $fixSecs = $secs; + $noDate = $noDateChanged = 1; + } else { + next; # wait until we have a time + } + } + # add fix to our lookup + $$points{$time} = $fix; + push @fixTimes, $time; # save time of all fixes in order + ++$numPoints; + } + $raf->Close(); + + # set date flags + if ($noDate and not $$geotag{NoDate}) { + if ($isDate) { + $et->Warn('Fixes are date-less -- will use time-only interpolation'); + } else { + $et->Warn('Some fixes are date-less -- may use time-only interpolation'); + } + $$geotag{NoDate} = 1; + } + $$geotag{IsDate} = 1 if $isDate; + + # cut bad fixes if necessary + if ($isCut and $canCut) { + $cutPDOP = $cutHDOP = $cutSats = 0; + my @goodTimes; + foreach (@fixTimes) { + $fix = $$points{$_} or next; + if ($maxPDOP and $$fix{pdop} and $$fix{pdop} > $maxPDOP) { + delete $$points{$_}; + ++$cutPDOP; + } elsif ($maxHDOP and $$fix{hdop} and $$fix{hdop} > $maxHDOP) { + delete $$points{$_}; + ++$cutHDOP; + } elsif ($minSats and defined $$fix{nsats} and $$fix{nsats} ne '' and + $$fix{nsats} < $minSats) + { + delete $$points{$_}; + ++$cutSats; + } else { + push @goodTimes, $_; + } + } + @fixTimes = @goodTimes; # update fix times + $numPoints -= $cutPDOP; + $numPoints -= $cutHDOP; + $numPoints -= $cutSats; + } + # sort fixes if necessary + @fixTimes = sort { $a <=> $b } @fixTimes if $sortFixes; + # mark first fix of the track + while (@fixTimes) { + $fix = $$points{$fixTimes[0]} or shift(@fixTimes), next; + $$fix{first} = 1; + last; + } + my $verbose = $et->Options('Verbose'); + if ($verbose) { + my $out = $et->Options('TextOut'); + $format or $format = 'unknown'; + print $out "Loaded $numPoints points from $format-format GPS track log $from\n"; + print $out "Ignored $cutPDOP points due to GeoMaxPDOP cut\n" if $cutPDOP; + print $out "Ignored $cutHDOP points due to GeoMaxHDOP cut\n" if $cutHDOP; + print $out "Ignored $cutSats points due to GeoMinSats cut\n" if $cutSats; + if ($numPoints and $verbose > 1) { + my @lbl = ('start:', 'end: '); + # (fixes may be in reverse order in GPX files) + @lbl = reverse @lbl if $fixTimes[0] > $fixTimes[-1]; + print $out " GPS track $lbl[0] " . PrintFixTime($fixTimes[0]) . "\n"; + if ($verbose > 3) { + print $out PrintFix($points, $_) foreach @fixTimes; + } + print $out " GPS track $lbl[1] " . PrintFixTime($fixTimes[-1]) . "\n"; + } + } + if ($numPoints) { + # reset timestamp list to force it to be regenerated + delete $$geotag{Times}; + # set flags for available information + $$has{alt} = 1 if $nmea{GGA} or $nmea{PMGNTRK} or $nmea{B}; # alt + $$has{track} = 1 if $nmea{RMC}; # track, speed + $$has{orient} = 1 if $nmea{PTNTHPR}; # dir, pitch, roll + return $geotag; # success! + } + return "No track points found in GPS $from"; +} + + +#------------------------------------------------------------------------------ +# Get floating point UTC time +# Inputs: 0) XML time string +# Returns: floating point time or undef on error +sub GetTime($) +{ + my $timeStr = shift; + $timeStr =~ /^(\d{4})-(\d+)-(\d+)T(\d+):(\d+):(\d+)(\.\d+)?(.*)/ or return undef; + my $time = Time::Local::timegm($6,$5,$4,$3,$2-1,$1); + $time += $7 if $7; # add fractional seconds + my $tz = $8; + # adjust for time zone (otherwise assume UTC) + # - allow timezone of +-HH:MM, +-H:MM, +-HHMM or +-HH since + # the spec is unclear about timezone format + if ($tz =~ /^([-+])(\d+):(\d{2})\b/ or $tz =~ /^([-+])(\d{2})(\d{2})?\b/) { + $tz = ($2 * 60 + ($3 || 0)) * 60; + $tz *= -1 if $1 eq '+'; # opposite sign to change back to UTC + $time += $tz; + } + return $time; +} + +#------------------------------------------------------------------------------ +# Apply Geosync time correction +# Inputs: 0) ExifTool ref, 1) Unix UTC time value +# Returns: sync time difference (and updates input time), or undef if no sync +sub ApplySyncCorr($$) +{ + my ($et, $time) = @_; + my $sync = $et->GetNewValue('Geosync'); + if (ref $sync eq 'HASH') { + my $syncTimes = $$sync{Times}; + if ($syncTimes) { + # find the nearest 2 sync points + my ($i0, $i1) = (0, scalar(@$syncTimes) - 1); + while ($i1 > $i0 + 1) { + my $pt = int(($i0 + $i1) / 2); + ($time < $$syncTimes[$pt] ? $i1 : $i0) = $pt; + } + my ($t0, $t1) = ($$syncTimes[$i0], $$syncTimes[$i1]); + # interpolate/extrapolate to account for linear camera clock drift + my $syncPoints = $$sync{Points}; + my $f = $t1 == $t0 ? 0 : ($time - $t0) / ($t1 - $t0); + $sync = $$syncPoints{$t1} * $f + $$syncPoints{$t0} * (1 - $f); + } else { + $sync = $$sync{Offset}; # use fixed time offset + } + $_[1] += $sync; + } else { + undef $sync; + } + return $sync; +} + +#------------------------------------------------------------------------------ +# Scan outwards for a fix containing the requested parameter +# Inputs: 0) name of fix parameter, 1) reference to list of fix times, +# 2) reference to fix points hash, 3) index of starting time, +# 4) direction to scan (-1 or +1), 5) maximum time difference +# Returns: 0) time for fix containing requested information (or undef) +# 1) the corresponding fix, 2) the value of the requested fix parameter +sub ScanOutwards($$$$$$) +{ + my ($key, $times, $points, $i, $dir, $maxSecs) = @_; + my $t0 = $$times[$i]; + for (;;) { + $i += $dir; + last if $i < 0 or $i >= scalar @$times; + my $t = $$times[$i]; + last if abs($t - $t0) > $maxSecs; # don't look too far + my $p = $$points{$t}; + my $v = $$p{$key}; + return($t,$p,$v) if defined $v; + } + return(); +} + +#------------------------------------------------------------------------------ +# Find nearest fix containing the specified parameter +# Inputs: 0) ExifTool ref, 1) name of fix parameter, 2) reference to list of fix times, +# 3) reference to fix points hash, 4) index of starting time, +# 5) direction to scan (-1, +1 or undef), 6) maximum time difference +# Returns: reference to fix hash or undef +sub FindFix($$$$$$$) +{ + my ($et, $key, $times, $points, $i, $dir, $maxSecs) = @_; + my ($t,$p); + if ($dir) { + ($t,$p) = ScanOutwards($key, $times, $points, $i, $dir, $maxSecs); + } else { + my ($t1, $p1) = ScanOutwards($key, $times, $points, $i, -1, $maxSecs); + my ($t2, $p2) = ScanOutwards($key, $times, $points, $i, 1, $maxSecs); + if (defined $t1) { + if (defined $t2) { + # both surrounding points are valid, so take the closest one + ($t, $p) = ($t - $t1 < $t2 - $t) ? ($t1, $p1) : ($t2, $p2); + } else { + ($t, $p) = ($t1, $p1); + } + } elsif (defined $t2) { + ($t, $p) = ($t2, $p2); + } + } + if (defined $p and $$et{OPTIONS}{Verbose} > 2) { + $et->VPrint(2, " Taking $key from fix:\n", PrintFix($points, $t)) + } + return $p; +} + +#------------------------------------------------------------------------------ +# Set new geotagging values according to date/time +# Inputs: 0) ExifTool object ref, 1) date/time value (or undef to delete tags) +# 2) optional write group +# Returns: error string, or '' on success +# Notes: Uses track data stored in ExifTool NEW_VALUE for Geotag tag +sub SetGeoValues($$;$) +{ + local $_; + my ($et, $val, $writeGroup) = @_; + my $geotag = $et->GetNewValue('Geotag'); + my $verbose = $et->Options('Verbose'); + my ($fix, $time, $fsec, $noDate, $secondTry, $iExt, $iDir); + + # remove date if none of our fixes had date information + $val =~ s/^\S+\s+// if $val and $geotag and not $$geotag{IsDate}; + + # maximum time (sec) from nearest GPS fix when position is still considered valid + my $geoMaxIntSecs = $et->Options('GeoMaxIntSecs'); + my $geoMaxExtSecs = $et->Options('GeoMaxExtSecs'); + + # use 30 minutes for a default + defined $geoMaxIntSecs or $geoMaxIntSecs = 1800; + defined $geoMaxExtSecs or $geoMaxExtSecs = 1800; + + my $times = $$geotag{Times}; + my $points = $$geotag{Points}; + my $has = $$geotag{Has}; + my $err = ''; + # loop to try date/time value first, then time-only value + while (defined $val) { + unless (defined $geotag) { + $err = 'No GPS track loaded'; + last; + } + unless ($times) { + # generate sorted timestamp list for binary search + my @times = sort { $a <=> $b } keys %$points; + $times = $$geotag{Times} = \@times; + } + unless ($times and @$times or $$geotag{DateTimeOnly}) { + $err = 'GPS track is empty'; + last; + } + unless (eval { require Time::Local }) { + $err = 'Geotag feature requires Time::Local installed'; + last; + } + # convert date/time to UTC + my ($year,$mon,$day,$hr,$min,$sec,$fs,$tz,$t0,$t1,$t2); + if ($val =~ /^(\d{4}):(\d+):(\d+)\s+(\d+):(\d+):(\d+)(\.\d*)?(Z|([-+])(\d+):(\d+))?/) { + # valid date/time value + ($year,$mon,$day,$hr,$min,$sec,$fs,$tz,$t0,$t1,$t2) = ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11); + } elsif ($val =~ /^(\d{2}):(\d+):(\d+)(\.\d*)?(Z|([-+])(\d+):(\d+))?/) { + # valid time-only value + ($hr,$min,$sec,$fs,$tz,$t0,$t1,$t2) = ($1,$2,$3,$4,$5,$6,$7,$8); + # use Jan. 2 to avoid going negative after tz adjustment + ($year,$mon,$day) = (1970,1,2); + $noDate = 1; + } else { + $err = 'Invalid date/time (use YYYY:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z])'; + last; + } + if ($tz) { + $time = Time::Local::timegm($sec,$min,$hr,$day,$mon-1,$year); + # use timezone from date/time value + if ($tz ne 'Z') { + my $tzmin = $t1 * 60 + $t2; + $time -= ($t0 eq '-' ? -$tzmin : $tzmin) * 60; + } + } else { + # assume local timezone + $time = Image::ExifTool::TimeLocal($sec,$min,$hr,$day,$mon-1,$year); + } + # add fractional seconds + $time += $fs if $fs and $fs ne '.'; + + # bring UTC time back to Jan. 1 if no date is given + # (don't use '%' operator here because it drops fractional seconds) + $time -= int($time / $secPerDay) * $secPerDay if $noDate; + + # apply time synchronization if available + my $sync = ApplySyncCorr($et, $time); + + # save fractional seconds string + $fsec = ($time =~ /(\.\d+)$/) ? $1 : ''; + + if ($et->Options('Verbose') > 1 and not $secondTry) { + my $out = $et->Options('TextOut'); + my $str = ''; + $str .= sprintf(" (incl. Geosync offset of %+.3f sec)", $sync) if defined $sync; + unless ($tz) { + my $tzs = Image::ExifTool::TimeZoneString([$sec,$min,$hr,$day,$mon-1,$year-1900],$time); + $str .= " (local timezone is $tzs)"; + } + print $out ' Geotime value: ' . PrintFixTime($time) . "$str\n"; + } + if (not $times or not @$times) { + $fix = { }; # dummy fix to geotag date/time only + # interpolate GPS track at $time + } elsif ($time < $$times[0]) { + if ($time < $$times[0] - $geoMaxExtSecs) { + $err or $err = 'Time is too far before track'; + $et->VPrint(2, ' Track start: ', PrintFixTime($$times[0]), "\n") if $verbose > 2; + $fix = { } if $$geotag{DateTimeOnly}; + } else { + $fix = $$points{$$times[0]}; + $iExt = 0; $iDir = 1; + $et->VPrint(2, " Taking pos from fix:\n", + PrintFix($points, $$times[0])) if $verbose > 2; + } + } elsif ($time > $$times[-1]) { + if ($time > $$times[-1] + $geoMaxExtSecs) { + $err or $err = 'Time is too far beyond track'; + $et->VPrint(2, ' Track end: ', PrintFixTime($$times[-1]), "\n") if $verbose > 2; + $fix = { } if $$geotag{DateTimeOnly}; + } else { + $fix = $$points{$$times[-1]}; + $iExt = $#$times; $iDir = -1; + $et->VPrint(2, " Taking pos from fix:\n", + PrintFix($points, $$times[-1])) if $verbose > 2; + } + } else { + # find nearest 2 points in time + my ($i0, $i1) = (0, scalar(@$times) - 1); + while ($i1 > $i0 + 1) { + my $pt = int(($i0 + $i1) / 2); + ($time < $$times[$pt] ? $i1 : $i0) = $pt; + } + # do linear interpolation for position + my $t0 = $$times[$i0]; + my $t1 = $$times[$i1]; + my $p1 = $$points{$t1}; + # check to see if we are extrapolating before the first entry in a track + my $maxSecs = ($$p1{first} and $geoMaxIntSecs) ? $geoMaxExtSecs : $geoMaxIntSecs; + # don't interpolate if fixes are too far apart + # (but always interpolate fixes inside the same TimeSpan) + if ($t1 - $t0 > $maxSecs and (not $$p1{span} or not $$points{$t0}{span} or + $$p1{span} != $$points{$t0}{span})) + { + # treat as an extrapolation -- use nearest fix if close enough + my $tn; + if ($time - $t0 < $t1 - $time) { + $tn = $t0; + $iExt = $i0; + } else { + $tn = $t1; + $iExt = $i1; + } + if (abs($time - $tn) > $geoMaxExtSecs) { + $err or $err = 'Time is too far from nearest GPS fix'; + $et->VPrint(2, ' Nearest fix: ', PrintFixTime($tn), "\n") if $verbose > 2; + $fix = { } if $$geotag{DateTimeOnly}; + } else { + $fix = $$points{$tn}; + $et->VPrint(2, " Taking pos from fix:\n", + PrintFix($points, $tn)) if $verbose > 2; + } + } else { + my $f0 = $t1 == $t0 ? 0 : ($time - $t0) / ($t1 - $t0); + my $p0 = $$points{$t0}; + $et->VPrint(2, " Interpolating between fixes (f=$f0):\n", + PrintFix($points, $t0, $t1)) if $verbose > 2; + $fix = { }; + # loop through available fix information categories + # (pos, track, alt, orient) + my ($category, $key); +Category: foreach $category (qw{pos track alt orient atemp}) { + next unless $$has{$category}; + my ($f, $p0b, $p1b, $f0b); + # loop through specific fix information keys + # (lat, lon, alt, track, speed, dir, pitch, roll) + foreach $key (@{$fixInfoKeys{$category}}) { + my $v0 = $$p0{$key}; + my $v1 = $$p1{$key}; + if (defined $v0 and defined $v1) { + $f = $f0; + } elsif (defined $f0b) { + $v0 = $$p0b{$key}; + $v1 = $$p1b{$key}; + next unless defined $v0 and defined $v1; + $f = $f0b; + } else { + # scan outwards looking for fixes with the required information + # (NOTE: SHOULD EVENTUALLY DO THIS FOR EXTRAPOLATION TOO!) + my ($t0b, $t1b); + if (defined $v0) { + $t0b = $t0; $p0b = $p0; + } else { + ($t0b,$p0b,$v0) = ScanOutwards($key,$times,$points,$i0,-1,$maxSecs); + next Category unless defined $t0b; + } + if (defined $v1) { + $t1b = $t1; $p1b = $p1; + } else { + ($t1b,$p1b,$v1) = ScanOutwards($key,$times,$points,$i1,1,$maxSecs); + next Category unless defined $t1b; + } + # re-calculate the interpolation factor + $f = $f0b = $t1b == $t0b ? 0 : ($time - $t0b) / ($t1b - $t0b); + $et->VPrint(2, " Interpolating $category between fixes (f=$f):\n", + PrintFix($points, $t0b, $t1b)) if $verbose > 2; + } + # must interpolate cyclical values differently + if ($cyclical{$key} and abs($v1 - $v0) > 180) { + # the acute angle spans the discontinuity, so add + # 360 degrees to the smaller angle before interpolating + $v0 < $v1 ? $v0 += 360 : $v1 += 360; + $$fix{$key} = $v1 * $f + $v0 * (1 - $f); + # longitude and roll ranges are -180 to 180, others are 0 to 360 + my $max = ($key eq 'lon' or $key eq 'roll') ? 180 : 360; + $$fix{$key} -= 360 if $$fix{$key} >= $max; + } else { + # simple linear interpolation + $$fix{$key} = $v1 * $f + $v0 * (1 - $f); + } + } + } + } + } + if ($fix) { + $err = ''; # success! + } elsif ($$geotag{NoDate} and not $noDate and $val =~ s/^\S+\s+//) { + # try again with no date since some of our track points are date-less + $secondTry = 1; + next; + } + last; + } + if ($fix) { + my ($gpsDate, $gpsAlt, $gpsAltRef); + my @t = gmtime(int $time); + my $gpsTime = sprintf('%.2d:%.2d:%.2d', $t[2], $t[1], $t[0]) . $fsec; + # write GPSDateStamp if date included in track log, otherwise delete it + $gpsDate = sprintf('%.2d:%.2d:%.2d', $t[5]+1900, $t[4]+1, $t[3]) unless $noDate; + # write GPSAltitude tags if altitude included in track log, otherwise delete them + if (defined $$fix{alt}) { + $gpsAlt = abs $$fix{alt}; + $gpsAltRef = ($$fix{alt} < 0 ? 1 : 0); + } elsif ($$has{alt} and defined $iExt) { + my $tFix = FindFix($et,'alt',$times,$points,$iExt,$iDir,$geoMaxExtSecs); + if ($tFix) { + $gpsAlt = abs $$tFix{alt}; + $gpsAltRef = ($$tFix{alt} < 0 ? 1 : 0); + } + } + # set new GPS tag values (EXIF, or XMP if write group is 'xmp') + my ($xmp, $exif, @r); + my %opts = ( Type => 'ValueConv' ); # write ValueConv values + if ($writeGroup) { + $opts{Group} = $writeGroup; + $xmp = ($writeGroup =~ /xmp/i); + $exif = ($writeGroup =~ /^(exif|gps)$/i); + } + # (capture error messages by calling SetNewValue in list context) + @r = $et->SetNewValue(GPSLatitude => $$fix{lat}, %opts); + @r = $et->SetNewValue(GPSLongitude => $$fix{lon}, %opts); + @r = $et->SetNewValue(GPSAltitude => $gpsAlt, %opts); + @r = $et->SetNewValue(GPSAltitudeRef => $gpsAltRef, %opts); + if ($$has{track}) { + my $tFix = $fix; + if (not defined $$fix{track} and defined $iExt) { + my $p = FindFix($et,'track',$times,$points,$iExt,$iDir,$geoMaxExtSecs); + $tFix = $p if $p; + } + @r = $et->SetNewValue(GPSTrack => $$tFix{track}, %opts); + @r = $et->SetNewValue(GPSTrackRef => (defined $$tFix{track} ? 'T' : undef), %opts); + my ($spd, $ref); + if (defined($spd = $$tFix{speed})) { + $ref = $$et{OPTIONS}{GeoSpeedRef}; + if ($ref and defined $speedConv{$ref}) { + $ref = $speedConv{$ref} if $speedConv{$speedConv{$ref}}; + $spd *= $speedConv{$ref}; + } else { + $ref = 'N'; # knots by default + } + } + @r = $et->SetNewValue(GPSSpeed => $spd, %opts); + @r = $et->SetNewValue(GPSSpeedRef => $ref, %opts); + } + if ($$has{orient}) { + my $tFix = $fix; + if (not defined $$fix{dir} and defined $iExt) { + my $p = FindFix($et,'dir',$times,$points,$iExt,$iDir,$geoMaxExtSecs); + $tFix = $p if $p; + } + @r = $et->SetNewValue(GPSImgDirection => $$tFix{dir}, %opts); + @r = $et->SetNewValue(GPSImgDirectionRef => (defined $$tFix{dir} ? 'T' : undef), %opts); + @r = $et->SetNewValue(CameraElevationAngle => $$tFix{pitch}, %opts); + # Note: GPSPitch and GPSRoll are non-standard, and must be user-defined + @r = $et->SetNewValue(GPSPitch => $$tFix{pitch}, %opts); + @r = $et->SetNewValue(GPSRoll => $$tFix{roll}, %opts); + } + if ($$has{atemp}) { + my $tFix = $fix; + if (not defined $$fix{atemp} and defined $iExt) { + # (not all fixes have atemp, so try interpolating specifically for this) + my $p = FindFix($et,'atemp',$times,$points,$iExt,$iDir,$geoMaxExtSecs); + $tFix = $p if $p; + } + @r = $et->SetNewValue(AmbientTemperature => $$tFix{atemp}, %opts); + } + unless ($xmp) { + my ($latRef, $lonRef); + $latRef = ($$fix{lat} > 0 ? 'N' : 'S') if defined $$fix{lat}; + $lonRef = ($$fix{lon} > 0 ? 'E' : 'W') if defined $$fix{lon}; + @r = $et->SetNewValue(GPSLatitudeRef => $latRef, %opts); + @r = $et->SetNewValue(GPSLongitudeRef => $lonRef, %opts); + @r = $et->SetNewValue(GPSDateStamp => $gpsDate, %opts); + @r = $et->SetNewValue(GPSTimeStamp => $gpsTime, %opts); + # set options to edit XMP:GPSDateTime only if it already exists + $opts{EditOnly} = 1; + $opts{Group} = 'XMP'; + } + unless ($exif) { + @r = $et->SetNewValue(GPSDateTime => "$gpsDate $gpsTime", %opts); + } + } else { + my %opts = ( IgnorePermanent => 1 ); + $opts{Replace} = 2 if defined $val; # remove existing new values + $opts{Group} = $writeGroup if $writeGroup; + + # reset any GPS values we might have already set + foreach (qw(GPSLatitude GPSLatitudeRef GPSLongitude GPSLongitudeRef + GPSAltitude GPSAltitudeRef GPSDateStamp GPSTimeStamp GPSDateTime + GPSTrack GPSTrackRef GPSSpeed GPSSpeedRef GPSImgDirection + GPSImgDirectionRef GPSPitch GPSRoll CameraElevationAngle + AmbientTemperature)) + { + my @r = $et->SetNewValue($_, undef, %opts); + } + } + return $err; +} + +#------------------------------------------------------------------------------ +# Convert Geotagging time synchronization value +# Inputs: 0) exiftool object ref, +# 1) time difference string ("[+-]DD MM:HH:SS.ss"), geosync'd file name, +# "GPSTIME@IMAGETIME", or "GPSTIME@FILENAME" +# Returns: geosync hash: +# Offset = Offset in seconds for latest synchronization (GPS - image time) +# Points = hash of all sync offsets keyed by image times in seconds +# Times = sorted list of image synchronization times (keys in Points hash) +# Notes: calling this routine with more than one geosync'd file causes time drift +# correction to be implemented +sub ConvertGeosync($$) +{ + my ($et, $val) = @_; + my $sync = $et->GetNewValue('Geosync') || { }; + my ($syncFile, $gpsTime, $imgTime); + + if ($val =~ /(.*?)\@(.*)/) { + $gpsTime = $1; + (-f $2 ? $syncFile : $imgTime) = $2; + # (take care because "-f '1:30'" crashes ActivePerl 5.10) + } elsif ($val !~ /^\d/ or $val !~ /:/) { + $syncFile = $val if -f $val; + } + if ($gpsTime or defined $syncFile) { + # (this is a time synchronization vector) + if (defined $syncFile) { + # check the following tags in order to obtain the image timestamp + my @timeTags = qw(SubSecDateTimeOriginal SubSecCreateDate SubSecModifyDate + DateTimeOriginal CreateDate ModifyDate FileModifyDate); + my $info = ImageInfo($syncFile, { PrintConv => 0 }, @timeTags, + 'GPSDateTime', 'GPSTimeStamp'); + $$info{Error} and warn("$$info{Err}\n"), return undef; + unless ($gpsTime) { + $gpsTime = $$info{GPSDateTime} || $$info{GPSTimeStamp}; + $gpsTime .= 'Z' if $gpsTime and not $$info{GPSDateTime}; + } + $gpsTime or warn("No GPSTimeStamp in '$syncFile\n"), return undef; + my $tag; + foreach $tag (@timeTags) { + if ($$info{$tag}) { + $imgTime = $$info{$tag}; + $et->VPrint(2, "Geosyncing with $tag from '${syncFile}'\n"); + last; + } + } + $imgTime or warn("No image timestamp in '${syncFile}'\n"), return undef; + } + # add date to date-less timestamps + my ($imgDateTime, $gpsDateTime, $noDate); + if ($imgTime =~ /^(\d+:\d+:\d+)\s+\d+/) { + $imgDateTime = $imgTime; + my $date = $1; + if ($gpsTime =~ /^\d+:\d+:\d+\s+\d+/) { + $gpsDateTime = $gpsTime; + } else { + $gpsDateTime = "$date $gpsTime"; + } + } elsif ($gpsTime =~ /^(\d+:\d+:\d+)\s+\d+/) { + $imgDateTime = "$1 $imgTime"; + $gpsDateTime = $gpsTime; + } else { + # use a today's date (so hopefully the DST setting will be intuitive) + my @tm = localtime; + my $date = sprintf('%.4d:%.2d:%.2d', $tm[5]+1900, $tm[4]+1, $tm[3]); + $gpsDateTime = "$date $gpsTime"; + $imgDateTime = "$date $imgTime"; + $noDate = 1; + } + # calculate Unix seconds since the epoch + my $imgSecs = Image::ExifTool::GetUnixTime($imgDateTime, 1); + defined $imgSecs or warn("Invalid image time '${imgTime}'\n"), return undef; + my $gpsSecs = Image::ExifTool::GetUnixTime($gpsDateTime, 1); + defined $gpsSecs or warn("Invalid GPS time '${gpsTime}'\n"), return undef; + # add fractional seconds + $gpsSecs += $1 if $gpsTime =~ /(\.\d+)/; + $imgSecs += $1 if $imgTime =~ /(\.\d+)/; + # shift dates within 12 hours of each other if either timestamp was date-less + if ($gpsDateTime ne $gpsTime or $imgDateTime ne $imgTime) { + my $diff = ($imgSecs - $gpsSecs) % (24 * 3600); + $diff -= 24 * 3600 if $diff > 12 * 3600; + $diff += 24 * 3600 if $diff < -12 * 3600; + if ($gpsDateTime ne $gpsTime) { + $gpsSecs = $imgSecs - $diff; + } else { + $imgSecs = $gpsSecs + $diff; + } + } + # save the synchronization offset + $$sync{Offset} = $gpsSecs - $imgSecs; + # save this synchronization point if either timestamp had a date + unless ($noDate) { + $$sync{Points} or $$sync{Points} = { }; + $$sync{Points}{$imgSecs} = $$sync{Offset}; + # print verbose output + if ($et->Options('Verbose') > 1) { + # print GPS and image timestamps in UTC + $et->VPrint(1, "Added Geosync point:\n", + ' GPS time stamp: ', PrintFixTime($gpsSecs), "\n", + ' Image date/time: ', PrintFixTime($imgSecs), "\n"); + } + # save sorted list of image sync times if we have more than one + my @times = keys %{$$sync{Points}}; + if (@times > 1) { + @times = sort { $a <=> $b } @times; + $$sync{Times} = \@times; + } + } + } else { + # (this is a simple time difference) + my @vals = $val =~ /(?=\d|\.\d)\d*(?:\.\d*)?/g; # (allow decimal values too) + @vals or warn("Invalid value (please refer to geotag documentation)\n"), return undef; + my $secs = 0; + my $mult; + foreach $mult (1, 60, 3600, $secPerDay) { + $secs += $mult * pop(@vals); + last unless @vals; + } + # set constant sync offset + $$sync{Offset} = $val =~ /^\s*-/ ? -$secs : $secs; + } + return $sync; +} + +#------------------------------------------------------------------------------ +# Print fix time +# Inputs: 0) time since the epoch +# Returns: UTC time string with fractional seconds +sub PrintFixTime($) +{ + my $time = $_[0] + 0.0005; # round off to nearest ms + my $fsec = int(($time - int($time)) * 1000); + return sprintf('%s.%.3d UTC', Image::ExifTool::ConvertUnixTime($time), $fsec); +} + +#------------------------------------------------------------------------------ +# Print fix information +# Inputs: 0) lookup for all fix points, 1-n) list of fix times +# Returns: fix string (including leading indent and trailing newline) +sub PrintFix($@) +{ + local $_; + my $points = shift; + my $str = ''; + while (@_) { + my $time = shift; + $str .= ' ' . PrintFixTime($time) . ' -'; + my $fix = $$points{$time}; + if ($fix) { + foreach (sort keys %$fix) { + $str .= " $_=$$fix{$_}" unless $_ eq 'time' or not defined $$fix{$_}; + } + } + $str .= "\n"; + } + return $str; +} + +#------------------------------------------------------------------------------ +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Geotag - Geotagging utility routines + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module loads GPS track logs, interpolates to determine position based +on time, and sets new GPS values for geotagging images. Currently supported +formats are GPX, NMEA RMC/GGA/GLL, KML, IGC, Garmin XML and TCX, Magellan +PMGNTRK, Honeywell PTNTHPR, Bramor gEO, Winplus Beacon text, Google Takeout +JSON, GPS/IMU CSV, DJI CSV, ExifTool CSV log files. + +Methods in this module should not be called directly. Instead, the Geotag +feature is accessed by writing the values of the ExifTool Geotag, Geosync +and Geotime tags (see the L<Extra Tags|Image::ExifTool::TagNames/Extra Tags> +in the tag name documentation). + +=head1 NOTES + +To take advantage of attitude information in the PTNTHPR NMEA sentence, the +user-defined tag GPSRoll, must be active. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.topografix.com/GPX/1/1/> + +=item L<http://www.gpsinformation.org/dale/nmea.htm#GSA> + +=item L<http://code.google.com/apis/kml/documentation/kmlreference.html> + +=item L<http://www.fai.org/gliding/system/files/tech_spec_gnss.pdf> + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Lionel Genet for the ability to read IGC format track logs. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Extra Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/GoPro.pm b/lib/Image/ExifTool/GoPro.pm new file mode 100644 index 0000000..58df3d4 --- /dev/null +++ b/lib/Image/ExifTool/GoPro.pm @@ -0,0 +1,757 @@ +#------------------------------------------------------------------------------ +# File: GoPro.pm +# +# Description: Read information from GoPro videos +# +# Revisions: 2018/01/12 - P. Harvey Created +# +# References: 1) https://github.com/gopro/gpmf-parser +# 2) https://github.com/stilldavid/gopro-utils +#------------------------------------------------------------------------------ + +package Image::ExifTool::GoPro; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::QuickTime; + +$VERSION = '1.07'; + +sub ProcessGoPro($$$); +sub ProcessString($$$); +sub ScaleValues($$); +sub AddUnits($$$); +sub ConvertSystemTime($$); + +# GoPro data types that have ExifTool equivalents (ref 1) +my %goProFmt = ( # format codes + # 0x00 - container (subdirectory) + 0x62 => 'int8s', # 'b' + 0x42 => 'int8u', # 'B' + 0x63 => 'string', # 'c' (possibly null terminated) + 0x73 => 'int16s', # 's' + 0x53 => 'int16u', # 'S' + 0x6c => 'int32s', # 'l' + 0x4c => 'int32u', # 'L' + 0x66 => 'float', # 'f' + 0x64 => 'double', # 'd' + 0x46 => 'undef', # 'F' (4-char ID) + 0x47 => 'undef', # 'G' (16-byte uuid) + 0x6a => 'int64s', # 'j' + 0x4a => 'int64u', # 'J' + 0x71 => 'fixed32s', # 'q' + 0x51 => 'fixed64s', # 'Q' + 0x55 => 'undef', # 'U' (16-byte date) + 0x3f => 'undef', # '?' (complex structure) +); + +# sizes of format codes if different than what FormatSize() would return +my %goProSize = ( + 0x46 => 4, + 0x47 => 16, + 0x55 => 16, +); + +# tagInfo elements to add units to PrintConv value +my %addUnits = ( + AddUnits => 1, + PrintConv => 'Image::ExifTool::GoPro::AddUnits($self, $val, $tag)', +); + +# Tags found in the GPMF box of Hero6 mp4 videos (ref PH), and +# the gpmd-format timed metadata of Hero5 and Hero6 videos (ref 1) +%Image::ExifTool::GoPro::GPMF = ( + PROCESS_PROC => \&ProcessGoPro, + GROUPS => { 2 => 'Camera' }, + NOTES => q{ + Tags extracted from the GPMF box of GoPro MP4 videos, the APP6 "GoPro" + segment of JPEG files, and from the "gpmd" timed metadata if the + L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> (-ee) option is enabled. Many more tags exist, but are + currently unknown and extracted only with the L<Unknown|../ExifTool.html#Unknown> (-u) option. Please + let me know if you discover the meaning of any of these unknown tags. See + L<https://github.com/gopro/gpmf-parser> for details about this format. + }, + ACCL => { #2 (gpmd) + Name => 'Accelerometer', + Notes => 'accelerator readings in m/s2', + Binary => 1, + }, + # ANGX (GPMF-GEOC) - seen -0.05 (fmt d, Max) + # ANGY (GPMF-GEOC) - seen 179.9 (fmt d, Max) + # ANGZ (GPMF-GEOC) - seen 0.152 (fmt d, Max) + ALLD => 'AutoLowLightDuration', #1 (gpmd) (untested) + # APTO (GPMF) - seen: 'RAW', 'DYNM' (fmt c) + ATTD => { #PH (Karma) + Name => 'Attitude', + # UNIT=s,rad,rad,rad,rad/s,rad/s,rad/s, + # TYPE=LffffffB + # SCAL=1000 1 1 1 1 1 1 1 + Binary => 1, + }, + ATTR => { #PH (Karma) + Name => 'AttitudeTarget', + # UNIT=s,rad,rad,rad, + # TYPE=Jffff + # SCAL=1000 1 1 1 1 + Binary => 1, + }, + AUDO => 'AudioSetting', #PH (GPMF - seen: 'WIND', fmt c) + # AUPT (GPMF) - seen: 'N','Y' (fmt c) + BPOS => { #PH (Karma) + Name => 'Controller', + Unknown => 1, + # UNIT=deg,deg,m,deg,deg,m,m,m + # TYPE=lllfffff + # SCAL=10000000 10000000 1000 1 1 1 1 1 + %addUnits, + }, + # BRID (GPMF) - seen: 0 (fmt B) + # BROD (GPMF) - seen: 'ASK','' (fmt c) + # CALH (GPMF-GEOC) - seen 3040 (fmt L, Max) + # CALW (GPMF-GEOC) - seen 4056 (fmt L, Max) + CASN => 'CameraSerialNumber', #PH (GPMF - seen: 'C3221324545448', fmt c) + # CINF (GPMF) - seen: 0x67376be7709bc8876a8baf3940908618, 0xe230988539b30cf5f016627ae8fc5395, + # 0x8bcbe424acc5b37d7d77001635198b3b (fmt B) (Camera INFormation?) + # CMOD (GPMF) - seen: 12,13,17 [12 360 video, 13 time-laps video, 17 JPEG] (fmt B) + # CRTX (GPMF-BACK/FRNT) - double[1] + # CRTY (GPMF-BACK/FRNT) - double[1] + CSEN => { #PH (Karma) + Name => 'CoyoteSense', + # UNIT=s,rad/s,rad/s,rad/s,g,g,g,,,, + # TYPE=LffffffLLLL + # SCAL=1000 1 1 1 1 1 1 1 1 1 1 + Binary => 1, + }, + CYTS => { #PH (Karma) + Name => 'CoyoteStatus', + # UNIT=s,,,,,rad,rad,rad,, + # TYPE=LLLLLfffBB + # SCAL=1000 1 1 1 1 1 1 1 1 1 + Binary => 1, + }, + DEVC => { #PH (gpmd,GPMF, fmt \0) + Name => 'DeviceContainer', + SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPMF' }, + # (Max) DVID=1,DVNM='Global Settings',VERS,FMWR,LINF,CINF,CASN,MINF,MUID,CMOD,MTYP,OREN, + # DZOM,DZST,SMTR,PRTN,PTWB,PTSH,PTCL,EXPT,PIMX,PIMN,PTEV,RATE,SROT,ZFOV,VLTE,VLTA, + # EISE,EISA,AUPT,AUDO,BROD,BRID,PVUL,PRJT,SOFF + # (Max) DVID='GEOC',DVNM='Geometry Calibrations',SHFX,SHFY,SHFZ,ANGX,ANGY,ANGZ,CALW,CALH + # (Max) DVID='BACK',DVNM='Back Lens',KLNS,CTRX,CTRY,MFOV,SFTR + # (Max) DVID='FRNT',DVNM='Front Lens',KLNS,CTRX,CTRY,MFOV,SFTR + # (Max) DVID='HLMT',DVNM='Highlights' + }, + # DVID (GPMF) - DeviceID; seen: 1 (fmt L), HLMT (fmt F), GEOC (fmt F), 'BACK' (fmt F, Max) + DVID => { Name => 'DeviceID', Unknown => 1 }, #2 (gpmd) + # DVNM (GPMF) seen: 'Video Global Settings' (fmt c), 'Highlights' (fmt c), 'Geometry Calibrations' (Max) + # DVNM (gpmd) seen: 'Camera' (Hero5), 'Hero6 Black' (Hero6), 'GoPro Karma v1.0' (Karma) + DVNM => 'DeviceName', #PH (n/c) + DZOM => { #PH (GPMF - seen: 'Y', fmt c) + Name => 'DigitalZoom', + PrintConv => { N => 'No', Y => 'Yes' }, + }, + # DZST (GPMF) - seen: 0 (fmt L) (something to do with digital zoom maybe?) + EISA => { #PH (GPMF) - seen: 'Y','N','HS EIS','N/A' (fmt c) [N was for a time-lapse video] + Name => 'ElectronicImageStabilization', + }, + # EISE (GPMF) - seen: 'Y','N' (fmt c) + EMPT => { Name => 'Empty', Unknown => 1 }, #2 (gpmd) + ESCS => { #PH (Karma) + Name => 'EscapeStatus', + # UNIT=s,rpm,rpm,rpm,rpm,rpm,rpm,rpm,rpm,degC,degC,degC,degC,V,V,V,V,A,A,A,A,,,,,,,,, + # TYPE=JSSSSSSSSssssSSSSSSSSSSSSSSSSB + # (no SCAL!) + Unknown => 1, + %addUnits, + }, + # EXPT (GPMF) - seen: '', 'AUTO' (fmt c) + FACE => 'FaceDetected', #PH (gpmd) + FCNM => 'FaceNumbers', #PH (gpmd) (faces counted per frame, ref 1) + FMWR => 'FirmwareVersion', #PH (GPMF - seen: HD6.01.01.51.00, fmt c) + FWVS => 'OtherFirmware', #PH (NC) (gpmd - seen: '1.1.11.0', Karma) + GLPI => { #PH (gpmd, Karma) + Name => 'GPSPos', + # UNIT=s,deg,deg,m,m,m/s,m/s,m/s,deg + # TYPE=LllllsssS + # SCAL=1000 10000000 10000000 1000 1000 100 100 100 100 + RawConv => '$val', # necessary to use scaled value instead of raw data as subdir data + SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GLPI' }, + }, + GPRI => { #PH (gpmd, Karma) + Name => 'GPSRaw', + # UNIT=s,deg,deg,m,m,m,m/s,deg,, + # TYPE=JlllSSSSBB + # SCAL=1000000,10000000,10000000,1000,100,100,100,100,1,1 + Unknown => 1, + RawConv => '$val', # necessary to use scaled value instead of raw data as subdir data + SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPRI' }, + }, + GPS5 => { #2 (gpmd) + Name => 'GPSInfo', + # SCAL=10000000,10000000,1000,1000,100 + RawConv => '$val', # necessary to use scaled value instead of raw data as subdir data + SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPS5' }, + }, + GPSF => { #2 (gpmd) + Name => 'GPSMeasureMode', + PrintConv => { + 2 => '2-Dimensional Measurement', + 3 => '3-Dimensional Measurement', + }, + }, + GPSP => { #2 (gpmd) + Name => 'GPSHPositioningError', + Description => 'GPS Horizontal Positioning Error', + ValueConv => '$val / 100', # convert from cm to m + }, + GPSU => { #2 (gpmd) + Name => 'GPSDateTime', + Groups => { 2 => 'Time' }, + # (HERO5 writes this in 'c' format, HERO6 writes 'U') + ValueConv => '$val =~ s/^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/20$1:$2:$3 $4:$5:/; $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + GYRO => { #2 (gpmd) + Name => 'Gyroscope', + Notes => 'gyroscope readings in rad/s', + Binary => 1, + }, + # HFLG (APP6) - seen: 0 + ISOE => 'ISOSpeeds', #PH (gpmd) + ISOG => { #2 (gpmd) + Name => 'ImageSensorGain', + Binary => 1, + }, + KBAT => { #PH (gpmd) (Karma) + Name => 'BatteryStatus', + # UNIT=A,Ah,J,degC,V,V,V,V,s,%,,,,,% + # TYPE=lLlsSSSSSSSBBBb + # SCAL=1000,1000,0.00999999977648258,100,1000,1000,1000,1000,0.0166666675359011,1,1,1,1,1,1 + RawConv => '$val', # necessary to use scaled value instead of raw data as subdir data + SubDirectory => { TagTable => 'Image::ExifTool::GoPro::KBAT' }, + }, + # KLNS (GPMF-BACK/FRNT) - double[5] (fmt d, Max) + # LINF (GPMF) - seen: LAJ7061916601668,C3341326002180,C33632245450981 (fmt c) (Lens INFormation?) + LNED => { #PH (Karma) + Name => 'LocalPositionNED', + # UNIT=s,m,m,m,m/s,m/s,m/s + # TYPE=Lffffff + # SCAL=1000 1 1 1 1 1 1 + Binary => 1, + }, + MAGN => 'Magnetometer', #1 (gpmd) (units of uT) + # MFOV (GPMF-BACK/FRNT) - seen: 100 (fmt d, Max) + MINF => { #PH (GPMF - seen: HERO6 Black, fmt c) + Name => 'Model', + Groups => { 2 => 'Camera' }, + Description => 'Camera Model Name', + }, + # MTYP (GPMF) - seen: 0,1,5,11 [1 for time-lapse video, 5 for 360 video, 11 for JPEG] (fmt B) + # MUID (GPMF) - seen: 3882563431 2278071152 967805802 411471936 0 0 0 0 (fmt L) + OREN => { #PH (GPMF - seen: 'U', fmt c) + Name => 'AutoRotation', + PrintConv => { + U => 'Up', + D => 'Down', # (NC) + A => 'Auto', # (NC) + }, + }, + # (most of the "P" tags are ProTune settings - PH) + PHDR => 'HDRSetting', #PH (APP6 - seen: 0) + PIMN => 'AutoISOMin', #PH (GPMF - seen: 100, fmt L) + PIMX => 'AutoISOMax', #PH (GPMF - seen: 1600, fmt L) + # PRAW (APP6) - seen: 0, 'N', 'Y' (fmt c) + PRES => 'PhotoResolution', #PH (APP6 - seen: '12MP_W') + # PRJT (APP6) - seen: 'GPRO','EACO' (fmt F, Hero8, Max) + PRTN => { #PH (GPMF - seen: 'N', fmt c) + Name => 'ProTune', + PrintConv => { + N => 'Off', + Y => 'On', # (NC) + }, + }, + PTCL => 'ColorMode', #PH (GPMF - seen: 'GOPRO', fmt c' APP6: 'FLAT') + PTEV => 'ExposureCompensation', #PH (GPMF - seen: '0.0', fmt c) + PTSH => 'Sharpness', #PH (GPMF - seen: 'HIGH', fmt c) + PTWB => 'WhiteBalance', #PH (GPMF - seen: 'AUTO', fmt c) + # PVUL (APP6) - seen: 'F' (fmt c, Hero8, Max) + RATE => 'Rate', #PH (GPMF - seen: '0_5SEC', fmt c; APP6 - seen: '4_1SEC') + RMRK => { #2 (gpmd) + Name => 'Comments', + ValueConv => '$self->Decode($val, "Latin")', + }, + SCAL => { #2 (gpmd) scale factor for subsequent data + Name => 'ScaleFactor', + Unknown => 1, + }, + SCPR => { #PH (Karma) [stream was empty] + Name => 'ScaledPressure', + # UNIT=s,Pa,Pa,degC + # TYPE=Lffs + # SCAL=1000 0.00999999977648258 0.00999999977648258 100 + %addUnits, + }, + # SFTR (GPMF-BACK/FRNT) - seen 0.999,1.00004 (fmt d, Max) + # SHFX (GPMF-GEOC) - seen 22.92 (fmt d, Max) + # SHFY (GPMF-GEOC) - seen 0.123 (fmt d, Max) + # SHFZ (GPMF-GEOC) - seen 36.06 (fmt d, Max) + SHUT => { #2 (gpmd) + Name => 'ExposureTimes', + PrintConv => q{ + my @a = split ' ', $val; + $_ = Image::ExifTool::Exif::PrintExposureTime($_) foreach @a; + return join ' ', @a; + }, + }, + SIMU => { #PH (Karma) + Name => 'ScaledIMU', + # UNIT=s,g,g,g,rad/s,rad/s,rad/s,T,T,T + # TYPE=Lsssssssss + # SCAL=1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 + %addUnits, + }, + SIUN => { #2 (gpmd - seen : 'm/s2','rad/s') + Name => 'SIUnits', + Unknown => 1, + ValueConv => '$self->Decode($val, "Latin")', + }, + # SMTR (GPMF) - seen: 'N' (fmt c) + # SOFF (APP6) - seen: 0 (fmt L, Hero8, Max) + # SROT (GPMF) - seen 20.60 (fmt f, Max) + STMP => { #1 (gpmd) + Name => 'TimeStamp', + ValueConv => '$val / 1e6', + }, + STRM => { #2 (gpmd,GPMF, fmt \0) + Name => 'NestedSignalStream', + SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPMF' }, + }, + STNM => { #2 (gpmd) + Name => 'StreamName', + Unknown => 1, + ValueConv => '$self->Decode($val, "Latin")', + }, + SYST => { #PH (Karma) + Name => 'SystemTime', + # UNIT=s,s + # TYPE=JJ + # SCAL=1000000 1000 + # save system time calibrations for later + RawConv => q{ + my @v = split ' ', $val; + if (@v == 2) { + my $s = $$self{SystemTimeList}; + $s or $s = $$self{SystemTimeList} = [ ]; + push @$s, \@v; + } + return $val; + }, + }, + # TICK => { Name => 'InTime', Unknown => 1, ValueConv => '$val/1000' }, #1 (gpmd) + TMPC => { #2 (gpmd) + Name => 'CameraTemperature', + PrintConv => '"$val C"', + }, + # TOCK => { Name => 'OutTime', Unknown => 1, ValueConv => '$val/1000' }, #1 (gpmd) + TSMP => { Name => 'TotalSamples', Unknown => 1 }, #2 (gpmd) + TYPE => { Name => 'StructureType', Unknown => 1 }, #2 (gpmd,GPMF - eg 'LLLllfFff', fmt c) + UNIT => { #2 (gpmd) alternative units + Name => 'Units', + Unknown => 1, + ValueConv => '$self->Decode($val, "Latin")', + }, + VERS => { + Name => 'MetadataVersion', + PrintConv => '$val =~ tr/ /./; $val', + }, + VFOV => { #PH (GPMF - seen: 'W', fmt c) + Name => 'FieldOfView', + PrintConv => { + W => 'Wide', + S => 'Super View', # (NC, not seen) + L => 'Linear', # (NC, not seen) + }, + }, + # VLTA (GPMF) - seen: 78 ('N') (fmt B -- wrong format?) + VFRH => { #PH (Karma) + Name => 'VisualFlightRulesHUD', + BinaryData => 1, + # UNIT=m/s,m/s,m,m/s,deg,% + # TYPE=ffffsS + }, + # VLTE (GPMF) - seen: 'Y','N' (fmt c) + WBAL => 'ColorTemperatures', #PH (gpmd) + WRGB => { #PH (gpmd) + Name => 'WhiteBalanceRGB', + Binary => 1, + }, + # ZFOV (APP6,GPMF) - seen: 148.34, 0 (fmt f, Hero8, Max) + # the following ref forum12825 + MUID => { + Name => 'MediaUniqueID', + PrintConv => q{ + my @a = split ' ', $val; + $_ = sprintf('%.8x',$_) foreach @a; + return join('', @a); + }, + }, + EXPT => 'MaximumShutterAngle', + MTRX => 'AccelerometerMatrix', + ORIN => 'InputOrientation', + ORIO => 'OutputOrientation', + UNIF => 'InputUniformity', + SROT => 'SensorReadoutTime', +); + +# GoPro GPS5 tags (ref 2) (Hero5,Hero6) +%Image::ExifTool::GoPro::GPS5 = ( + PROCESS_PROC => \&ProcessString, + GROUPS => { 1 => 'GoPro', 2 => 'Location' }, + VARS => { HEX_ID => 0, ID_LABEL => 'Index' }, + 0 => { # (unit='deg') + Name => 'GPSLatitude', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + 1 => { # (unit='deg') + Name => 'GPSLongitude', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + 2 => { # (unit='m') + Name => 'GPSAltitude', + PrintConv => '"$val m"', + }, + 3 => 'GPSSpeed', # (unit='m/s') + 4 => 'GPSSpeed3D', # (unit='m/s') +); + +# GoPro GPRI tags (ref PH) (Karma) +%Image::ExifTool::GoPro::GPRI = ( + PROCESS_PROC => \&ProcessString, + GROUPS => { 1 => 'GoPro', 2 => 'Location' }, + VARS => { HEX_ID => 0, ID_LABEL => 'Index' }, + 0 => { # (unit='s') + Name => 'GPSDateTimeRaw', + Groups => { 2 => 'Time' }, + ValueConv => \&ConvertSystemTime, # convert to date/time based on SystemTime clock + PrintConv => '$self->ConvertDateTime($val)', + }, + 1 => { # (unit='deg') + Name => 'GPSLatitudeRaw', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + 2 => { # (unit='deg') + Name => 'GPSLongitudeRaw', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + 3 => { + Name => 'GPSAltitudeRaw', # (NC) + PrintConv => '"$val m"', + }, + # (unknown tags must be defined so that ProcessString() will iterate through all values) + 4 => { Name => 'GPRI_Unknown4', Unknown => 1, Hidden => 1, PrintConv => '"$val m"' }, + 5 => { Name => 'GPRI_Unknown5', Unknown => 1, Hidden => 1, PrintConv => '"$val m"' }, + 6 => 'GPSSpeedRaw', # (NC) # (unit='m/s' -- should convert to other units?) + 7 => 'GPSTrackRaw', # (NC) # (unit='deg') + 8 => { Name => 'GPRI_Unknown8', Unknown => 1, Hidden => 1 }, # (no units) + 9 => { Name => 'GPRI_Unknown9', Unknown => 1, Hidden => 1 }, # (no units) +); + +# GoPro GLPI tags (ref PH) (Karma) +%Image::ExifTool::GoPro::GLPI = ( + PROCESS_PROC => \&ProcessString, + GROUPS => { 1 => 'GoPro', 2 => 'Location' }, + VARS => { HEX_ID => 0, ID_LABEL => 'Index' }, + 0 => { # (unit='s') + Name => 'GPSDateTime', + Groups => { 2 => 'Time' }, + ValueConv => \&ConvertSystemTime, # convert to date/time based on SystemTime clock + PrintConv => '$self->ConvertDateTime($val)', + }, + 1 => { # (unit='deg') + Name => 'GPSLatitude', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + 2 => { # (unit='deg') + Name => 'GPSLongitude', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + 3 => { # (unit='m') + Name => 'GPSAltitude', # (NC) + PrintConv => '"$val m"', + }, + # (unknown tags must be defined so that ProcessString() will iterate through all values) + 4 => { Name => 'GLPI_Unknown4', Unknown => 1, Hidden => 1, PrintConv => '"$val m"' }, + 5 => { Name => 'GPSSpeedX', PrintConv => '"$val m/s"' }, # (NC) + 6 => { Name => 'GPSSpeedY', PrintConv => '"$val m/s"' }, # (NC) + 7 => { Name => 'GPSSpeedZ', PrintConv => '"$val m/s"' }, # (NC) + 8 => { Name => 'GPSTrack' }, # (unit='deg') +); + +# GoPro KBAT tags (ref PH) +%Image::ExifTool::GoPro::KBAT = ( + PROCESS_PROC => \&ProcessString, + GROUPS => { 1 => 'GoPro', 2 => 'Camera' }, + VARS => { HEX_ID => 0, ID_LABEL => 'Index' }, + NOTES => 'Battery status information found in GoPro Karma videos.', + 0 => { Name => 'BatteryCurrent', PrintConv => '"$val A"' }, + 1 => { Name => 'BatteryCapacity', PrintConv => '"$val Ah"' }, + 2 => { Name => 'KBAT_Unknown2', PrintConv => '"$val J"', Unknown => 1, Hidden => 1 }, + 3 => { Name => 'BatteryTemperature', PrintConv => '"$val C"' }, + 4 => { Name => 'BatteryVoltage1', PrintConv => '"$val V"' }, + 5 => { Name => 'BatteryVoltage2', PrintConv => '"$val V"' }, + 6 => { Name => 'BatteryVoltage3', PrintConv => '"$val V"' }, + 7 => { Name => 'BatteryVoltage4', PrintConv => '"$val V"' }, + 8 => { Name => 'BatteryTime', PrintConv => 'ConvertDuration(int($val + 0.5))' }, # (NC) + 9 => { Name => 'KBAT_Unknown9', PrintConv => '"$val %"', Unknown => 1, Hidden => 1, }, + 10 => { Name => 'KBAT_Unknown10', Unknown => 1, Hidden => 1 }, # (no units) + 11 => { Name => 'KBAT_Unknown11', Unknown => 1, Hidden => 1 }, # (no units) + 12 => { Name => 'KBAT_Unknown12', Unknown => 1, Hidden => 1 }, # (no units) + 13 => { Name => 'KBAT_Unknown13', Unknown => 1, Hidden => 1 }, # (no units) + 14 => { Name => 'BatteryLevel', PrintConv => '"$val %"' }, +); + +# GoPro fdsc tags written by the Hero5 and Hero6 (ref PH) +%Image::ExifTool::GoPro::fdsc = ( + GROUPS => { 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + NOTES => q{ + Tags extracted from the MP4 "fdsc" timed metadata when the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> + (-ee) option is used. + }, + 0x08 => { Name => 'FirmwareVersion', Format => 'string[15]' }, + 0x17 => { Name => 'SerialNumber', Format => 'string[16]' }, + 0x57 => { Name => 'OtherSerialNumber', Format => 'string[15]' }, # (NC) + 0x66 => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[16]', + }, + # ... + # after this there are lots of interesting values also found in the GPMF box, + # but this block is lacking tag ID's and any directory structure, so the + # value offsets are therefore presumably firmware dependent :( +); + +#------------------------------------------------------------------------------ +# Convert system time to date/time string +# Inputs: 0) system time value, 1) ExifTool ref +# Returns: EXIF-format date/time string with milliseconds +sub ConvertSystemTime($$) +{ + my ($val, $et) = @_; + my $s = $$et{SystemTimeList} or return '<uncalibrated>'; + unless ($$et{SystemTimeListSorted}) { + $s = $$et{SystemTimeList} = [ sort { $$a[0] <=> $$b[0] } @$s ]; + $$et{SystemTimeListSorted} = 1; + } + my ($i, $j) = (0, $#$s); + # perform binary search to find this system time value + while ($j - $i > 1) { + my $t = int(($i + $j) / 2); + ($val < $$s[$t][0] ? $j : $i) = $t; + } + if ($i == $j or $$s[$j][0] == $$s[$i][0]) { + $val = $$s[$i][1]; + } else { + # interpolate between values + $val = $$s[$i][1] + ($$s[$j][1] - $$s[$i][1]) * ($val - $$s[$i][0]) / ($$s[$j][0] - $$s[$i][0]); + } + # (a bit tricky to remove fractional seconds then add them back again after + # the date/time conversion while avoiding round-off errors which could + # put the seconds out by 1...) + my ($t, $f) = ("$val" =~ /^(\d+)(\.\d+)/); + return Image::ExifTool::ConvertUnixTime($t, $$et{OPTIONS}{QuickTimeUTC}) . $f; +} + +#------------------------------------------------------------------------------ +# Scale values by last 'SCAL' constants +# Inputs: 0) value or list of values, 1) string of scale factors +# Returns: nothing, but updates values +sub ScaleValues($$) +{ + my ($val, $scl) = @_; + return unless $val and $scl; + my @scl = split ' ', $scl or return; + my @scaled; + my $v = (ref $val eq 'ARRAY') ? $val : [ $val ]; + foreach $val (@$v) { + my @a = split ' ', $val; + $a[$_] /= $scl[$_ % @scl] foreach 0..$#a; + push @scaled, join(' ', @a); + } + $_[0] = @scaled > 1 ? \@scaled : $scaled[0]; +} + +#------------------------------------------------------------------------------ +# Add units to values for human-readable output +# Inputs: 0) ExifTool ref, 1) value, 2) tag key +# Returns: converted value +sub AddUnits($$$) +{ + my ($et, $val, $tag) = @_; + if ($et and $$et{TAG_EXTRA}{$tag} and $$et{TAG_EXTRA}{$tag}{Units}) { + my $u = $$et{TAG_EXTRA}{$tag}{Units}; + $u = [ $u ] unless ref $u eq 'ARRAY'; + my @a = split ' ', $val; + if (@$u == @a) { + my $i; + for ($i=0; $i<@a; ++$i) { + $a[$i] .= ' ' . $$u[$i] if $$u[$i]; + } + $val = join ' ', @a; + } + } + return $val; +} + +#------------------------------------------------------------------------------ +# Process string of values (or array of strings) to extract as separate tags +# Inputs: 0) ExifTool object ref, 1) directory information ref, 2) tag table ref +# Returns: 1 on success +sub ProcessString($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my @list = ref $$dataPt eq 'ARRAY' ? @{$$dataPt} : ( $$dataPt ); + my ($string, $val); + $et->VerboseDir('GoPro structure'); + foreach $string (@list) { + my @val = split ' ', $string; + my $i = 0; + foreach $val (@val) { + $et->HandleTag($tagTablePtr, $i, $val); + $$tagTablePtr{++$i} or $i = 0; + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process GoPro metadata (gpmd samples, GPMF box, or APP6) (ref PH/1/2) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +# - with hack to check for encrypted text in gpmd data (Rove Stealth 4K) +sub ProcessGoPro($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $base = $$dirInfo{Base}; + my $pos = $$dirInfo{DirStart} || 0; + my $dirEnd = $pos + ($$dirInfo{DirLen} || (length($$dataPt) - $pos)); + my $verbose = $et->Options('Verbose'); + my $unknown = $verbose || $et->Options('Unknown'); + my ($size, $type, $unit, $scal, $setGroup0); + + $et->VerboseDir($$dirInfo{DirName} || 'GPMF', undef, $dirEnd-$pos) if $verbose; + if ($pos) { + my $parent = $$dirInfo{Parent}; + $setGroup0 = $$et{SET_GROUP0} = 'APP6' if $parent and $parent eq 'APP6'; + } else { + # set group0 to "QuickTime" unless group1 is being changed (to Track#) + $setGroup0 = $$et{SET_GROUP0} = 'QuickTime' unless $$et{SET_GROUP1}; + } + + for (; $pos+8<=$dirEnd; $pos+=($size+3)&0xfffffffc) { + my ($tag,$fmt,$len,$count) = unpack("x${pos}a4CCn", $$dataPt); + $size = $len * $count; + $pos += 8; + last if $pos + $size > $dirEnd; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + last if $tag eq "\0\0\0\0"; # stop at null tag + next unless $size or $verbose; # don't save empty values unless verbose + my $format = $goProFmt{$fmt} || 'undef'; + my ($val, $i, $j, $p, @v); + if ($fmt == 0x3f and defined $type) { + # decode structure with format given by previous 'TYPE' + for ($i=0; $i<$count; ++$i) { + my (@s, $l); + for ($j=0, $p=0; $j<length($type); ++$j, $p+=$l) { + my $b = Get8u(\$type, $j); + my $f = $goProFmt{$b} or last; + $l = $goProSize{$b} || Image::ExifTool::FormatSize($f) or last; + last if $p + $l > $len; + my $s = ReadValue($dataPt, $pos+$i*$len+$p, $f, undef, $l); + last unless defined $s; + push @s, $s; + } + push @v, join ' ', @s if @s; + } + $val = @v > 1 ? \@v : $v[0]; + } elsif (($format eq 'undef' or $format eq 'string') and $count > 1 and $len > 1) { + # unpack multiple undef/string values as a list + my $a = $format eq 'undef' ? 'a' : 'A'; + $val = [ unpack("x${pos}".("$a$len" x $count), $$dataPt) ]; + } else { + $val = ReadValue($dataPt, $pos, $format, undef, $size); + } + # save TYPE, UNIT/SIUN and SCAL values for later + $type = $val if $tag eq 'TYPE'; + $unit = $val if $tag eq 'UNIT' or $tag eq 'SIUN'; + $scal = $val if $tag eq 'SCAL'; + + unless ($tagInfo) { + next unless $unknown; + my $name = Image::ExifTool::QuickTime::PrintableTagID($tag); + $tagInfo = { Name => "GoPro_$name", Description => "GoPro $name", Unknown => 1 }; + $$tagInfo{SubDirectory} = { TagTable => 'Image::ExifTool::GoPro::GPMF' } if not $fmt; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + # apply scaling if available to last tag in this container + ScaleValues($val, $scal) if $scal and $tag ne 'SCAL' and $pos+$size+3>=$dirEnd; + my $key = $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + Base => $base, + Start => $pos, + Size => $size, + TagInfo => $tagInfo, + Format => $format, + Extra => $verbose ? ", type='".($fmt ? chr($fmt) : '\0')."' size=$len count=$count" : undef, + ); + # save units for adding in print conversion if specified + $$et{TAG_EXTRA}{$key}{Units} = $unit if $$tagInfo{AddUnits} and $key; + } + delete $$et{SET_GROUP0} if $setGroup0; + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::GoPro - Read information from GoPro videos + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to decode +metadata from GoPro MP4 videos. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://github.com/gopro/gpmf-parser> + +=item L<https://github.com/stilldavid/gopro-utils> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/GoPro Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/H264.pm b/lib/Image/ExifTool/H264.pm new file mode 100644 index 0000000..89841b6 --- /dev/null +++ b/lib/Image/ExifTool/H264.pm @@ -0,0 +1,1149 @@ +#------------------------------------------------------------------------------ +# File: H264.pm +# +# Description: Read meta information from H.264 video +# +# Revisions: 2010/01/31 - P. Harvey Created +# +# References: 1) http://www.itu.int/rec/T-REC-H.264/e (T-REC-H.264-200305-S!!PDF-E.pdf) +# 2) http://miffteevee.co.uk/documentation/development/H264Parser_8cpp-source.html +# 3) http://ffmpeg.org/ +# 4) US Patent 2009/0052875 A1 +# 5) European Patent (EP2 051 528A1) application no. 07792522.0 filed 08.08.2007 +# 6) Dave Nicholson private communication +# 7) http://www.freepatentsonline.com/20050076039.pdf +# 8) Michael Reitinger private communication (RX100) +# +# Glossary: RBSP = Raw Byte Sequence Payload +#------------------------------------------------------------------------------ + +package Image::ExifTool::H264; + +use strict; +use vars qw($VERSION %convMake); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::GPS; + +$VERSION = '1.17'; + +sub ProcessSEI($$); + +my $parsePictureTiming; # flag to enable parsing of picture timing information (test only) + +# lookup for camera manufacturer name +%convMake = ( + 0x0103 => 'Panasonic', + 0x0108 => 'Sony', + 0x1011 => 'Canon', + 0x1104 => 'JVC', #Rob Lewis +); + +# information extracted from H.264 video streams +%Image::ExifTool::H264::Main = ( + GROUPS => { 2 => 'Video' }, + VARS => { NO_ID => 1 }, + NOTES => q{ + Tags extracted from H.264 video streams. The metadata for AVCHD videos is + stored in this stream. + }, + ImageWidth => { }, + ImageHeight => { }, + MDPM => { SubDirectory => { TagTable => 'Image::ExifTool::H264::MDPM' } }, +); + +# H.264 Supplemental Enhancement Information User Data (ref PH/4) +%Image::ExifTool::H264::MDPM = ( + GROUPS => { 2 => 'Camera' }, + PROCESS_PROC => \&ProcessSEI, + TAG_PREFIX => 'MDPM', + NOTES => q{ + The following tags are decoded from the Modified Digital Video Pack Metadata + (MDPM) of the unregistered user data with UUID + 17ee8c60f84d11d98cd60800200c9a66 in the H.264 Supplemental Enhancement + Information (SEI). I<[Yes, this description is confusing, but nothing + compared to the challenge of actually decoding the data!]> This information + may exist at regular intervals through the entire video, but only the first + occurrence is extracted unless the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> (-ee) option is used (in + which case subsequent occurrences are extracted as sub-documents). + }, + # (Note: all these are explained in IEC 61834-4, but it costs money so it is useless to me) + # 0x00 - ControlCassetteID (ref 7) + # 0x01 - ControlTapeLength (ref 7) + # 0x02 - ControlTimerActDate (ref 7) + # 0x03 - ControlTimerACS_S_S (ref 7) + # 0x04-0x05 - ControlPR_StartPoint (ref 7) + # 0x06 - ControlTagIDNoGenre (ref 7) + # 0x07 - ControlTopicPageHeader (ref 7) + # 0x08 - ControlTextHeader (ref 7) + # 0x09 - ControlText (ref 7) + # 0x0a-0x0b - ControlTag (ref 7) + # 0x0c - ControlTeletextInfo (ref 7) + # 0x0d - ControlKey (ref 7) + # 0x0e-0x0f - ControlZoneEnd (ref 7) + # 0x10 - TitleTotalTime (ref 7) + # 0x11 - TitleRemainTime (ref 7) + # 0x12 - TitleChapterTotalNo (ref 7) + 0x13 => { + Name => 'TimeCode', + Notes => 'hours:minutes:seconds:frames', + ValueConv => 'sprintf("%.2x:%.2x:%.2x:%.2x",reverse unpack("C*",$val))', + }, + # 0x14 - TitleBinaryGroup - val: 0x00000000,0x14200130 + # 0x15 - TitleCassetteNo (ref 7) + # 0x16-0x17 - TitleSoftID (ref 7) + # (0x18,0x19 listed as TitleTextHeader/TitleText by ref 7) + 0x18 => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Notes => 'combined with tag 0x19', + Combine => 1, # the next tag (0x19) contains the rest of the date + # first byte is timezone information: + # 0x80 - unused + # 0x40 - DST flag + # 0x20 - TimeZoneSign + # 0x1e - TimeZoneValue + # 0x01 - half-hour flag + ValueConv => q{ + my ($tz, @a) = unpack('C*',$val); + return sprintf('%.2x%.2x:%.2x:%.2x %.2x:%.2x:%.2x%s%.2d:%s%s', @a, + $tz & 0x20 ? '-' : '+', ($tz >> 1) & 0x0f, + $tz & 0x01 ? '30' : '00', + $tz & 0x40 ? ' DST' : ''); + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + # 0x1a-0x1b - TitleStart (ref 7) + # 0x1c-0x1d - TitleReelID (ref 7) + # 0x1e-0x1f - TitleEnd (ref 7) + # 0x20 - ChapterTotalTime (ref 7) + # 0x42 - ProgramRecDTime (ref 7) + # 0x50/0x60 - (AAUX/VAUX)Source (ref 7) + # 0x51/0x61 - (AAUX/VAUX)SourceControl (ref 7) + # 0x52/0x62 - (AAUX/VAUX)RecDate (ref 7) + # 0x53/0x63 - (AAUX/VAUX)RecTime (ref 7) + # 0x54/0x64 - (AAUX/VAUX)BinaryGroup (ref 7) + # 0x55/0x65 - (AAUX/VAUX)ClosedCaption (ref 7) + # 0x56/0x66 - (AAUX/VAUX)TR (ref 7) + 0x70 => { # ConsumerCamera1 + Name => 'Camera1', + SubDirectory => { TagTable => 'Image::ExifTool::H264::Camera1' }, + }, + 0x71 => { # ConsumerCamera2 + Name => 'Camera2', + SubDirectory => { TagTable => 'Image::ExifTool::H264::Camera2' }, + }, + # 0x73 Lens - val: 0x04ffffd3,0x0effffd3,0x15ffffd3,0x41ffffd3,0x52ffffd3,0x59ffffd3,0x65ffffd3,0x71ffffd3,0x75ffffd3,0x79ffffd3,0x7fffffd3,0xffffffd3... + # 0x74 Gain - val: 0xb8ffff0f + # 0x75 Pedestal + # 0x76 Gamma + # 0x77 Detail + # 0x7b CameraPreset + # 0x7c Flare + # 0x7d Shading + # 0x7e Knee + 0x7f => { # Shutter + Name => 'Shutter', + SubDirectory => { + TagTable => 'Image::ExifTool::H264::Shutter', + ByteOrder => 'LittleEndian', # weird + }, + }, + 0xa0 => { + Name => 'ExposureTime', + Format => 'rational32u', + Groups => { 2 => 'Image' }, + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0xa1 => { + Name => 'FNumber', + Format => 'rational32u', + Groups => { 2 => 'Image' }, + }, + 0xa2 => { + Name => 'ExposureProgram', + Format => 'int32u', # (guess) + PrintConv => { + 0 => 'Not Defined', + 1 => 'Manual', + 2 => 'Program AE', + 3 => 'Aperture-priority AE', + 4 => 'Shutter speed priority AE', + 5 => 'Creative (Slow speed)', + 6 => 'Action (High speed)', + 7 => 'Portrait', + 8 => 'Landscape', + }, + }, + 0xa3 => { + Name => 'BrightnessValue', + Format => 'rational32s', + Groups => { 2 => 'Image' }, + }, + 0xa4 => { + Name => 'ExposureCompensation', + Format => 'rational32s', + Groups => { 2 => 'Image' }, + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + 0xa5 => { + Name => 'MaxApertureValue', + Format => 'rational32u', + ValueConv => '2 ** ($val / 2)', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0xa6 => { + Name => 'Flash', + Format => 'int32u', # (guess) + Flags => 'PrintHex', + SeparateTable => 'EXIF Flash', + PrintConv => \%Image::ExifTool::Exif::flash, + }, + 0xa7 => { + Name => 'CustomRendered', + Format => 'int32u', # (guess) + Groups => { 2 => 'Image' }, + PrintConv => { + 0 => 'Normal', + 1 => 'Custom', + }, + }, + 0xa8 => { + Name => 'WhiteBalance', + Format => 'int32u', # (guess) + Priority => 0, + PrintConv => { + 0 => 'Auto', + 1 => 'Manual', + }, + }, + 0xa9 => { + Name => 'FocalLengthIn35mmFormat', + Format => 'rational32u', + PrintConv => '"$val mm"', + }, + 0xaa => { + Name => 'SceneCaptureType', + Format => 'int32u', # (guess) + PrintConv => { + 0 => 'Standard', + 1 => 'Landscape', + 2 => 'Portrait', + 3 => 'Night', + }, + }, + # 0xab-0xaf ExifOption + 0xb0 => { + Name => 'GPSVersionID', + Format => 'int8u', + Count => 4, + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => '$val =~ tr/ /./; $val', + }, + 0xb1 => { + Name => 'GPSLatitudeRef', + Format => 'string', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + N => 'North', + S => 'South', + }, + }, + 0xb2 => { + Name => 'GPSLatitude', + Format => 'rational32u', + Groups => { 1 => 'GPS', 2 => 'Location' }, + Notes => 'combined with tags 0xb3 and 0xb4', + Combine => 2, # combine the next 2 tags (0xb2=deg, 0xb3=min, 0xb4=sec) + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)', + }, + 0xb5 => { + Name => 'GPSLongitudeRef', + Format => 'string', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + E => 'East', + W => 'West', + }, + }, + 0xb6 => { + Name => 'GPSLongitude', + Format => 'rational32u', + Groups => { 1 => 'GPS', 2 => 'Location' }, + Combine => 2, # combine the next 2 tags (0xb6=deg, 0xb7=min, 0xb8=sec) + Notes => 'combined with tags 0xb7 and 0xb8', + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)', + }, + 0xb9 => { + Name => 'GPSAltitudeRef', + Format => 'int32u', # (guess) + Groups => { 1 => 'GPS', 2 => 'Location' }, + ValueConv => '$val ? 1 : 0', # because I'm not sure about the Format + PrintConv => { + 0 => 'Above Sea Level', + 1 => 'Below Sea Level', + }, + }, + 0xba => { + Name => 'GPSAltitude', + Format => 'rational32u', + Groups => { 1 => 'GPS', 2 => 'Location' }, + }, + 0xbb => { + Name => 'GPSTimeStamp', + Format => 'rational32u', + Groups => { 1 => 'GPS', 2 => 'Time' }, + Combine => 2, # the next tags (0xbc/0xbd) contain the minutes/seconds + Notes => 'combined with tags 0xbc and 0xbd', + ValueConv => 'Image::ExifTool::GPS::ConvertTimeStamp($val)', + PrintConv => 'Image::ExifTool::GPS::PrintTimeStamp($val)', + }, + 0xbe => { + Name => 'GPSStatus', + Format => 'string', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + A => 'Measurement Active', + V => 'Measurement Void', + }, + }, + 0xbf => { + Name => 'GPSMeasureMode', + Format => 'string', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + 2 => '2-Dimensional Measurement', + 3 => '3-Dimensional Measurement', + }, + }, + 0xc0 => { + Name => 'GPSDOP', + Description => 'GPS Dilution Of Precision', + Format => 'rational32u', + Groups => { 1 => 'GPS', 2 => 'Location' }, + }, + 0xc1 => { + Name => 'GPSSpeedRef', + Format => 'string', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + K => 'km/h', + M => 'mph', + N => 'knots', + }, + }, + 0xc2 => { + Name => 'GPSSpeed', + Format => 'rational32u', + Groups => { 1 => 'GPS', 2 => 'Location' }, + }, + 0xc3 => { + Name => 'GPSTrackRef', + Format => 'string', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + M => 'Magnetic North', + T => 'True North', + }, + }, + 0xc4 => { + Name => 'GPSTrack', + Format => 'rational32u', + Groups => { 1 => 'GPS', 2 => 'Location' }, + }, + 0xc5 => { + Name => 'GPSImgDirectionRef', + Format => 'string', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + M => 'Magnetic North', + T => 'True North', + }, + }, + 0xc6 => { + Name => 'GPSImgDirection', + Format => 'rational32u', + Groups => { 1 => 'GPS', 2 => 'Location' }, + }, + 0xc7 => { + Name => 'GPSMapDatum', + Format => 'string', + Groups => { 1 => 'GPS', 2 => 'Location' }, + Combine => 1, # the next tag (0xc8) contains the rest of the string + Notes => 'combined with tag 0xc8', + }, + # 0xc9-0xcf - GPSOption + # 0xc9 - val: 0x001d0203 + 0xca => { #PH (Sony DSC-HX7V) + Name => 'GPSDateStamp', + Format => 'string', + Groups => { 1 => 'GPS', 2 => 'Time' }, + Combine => 2, # the next 2 tags contain the rest of the string + Notes => 'combined with tags 0xcb and 0xcc', + ValueConv => 'Image::ExifTool::Exif::ExifDate($val)', + }, + 0xe0 => { + Name => 'MakeModel', + SubDirectory => { TagTable => 'Image::ExifTool::H264::MakeModel' }, + }, + # 0xe1-0xef - MakerOption + # 0xe1 - val: 0x01000670,0x01000678,0x06ffffff,0x01ffffff,0x01000020,0x01000400... + 0xe1 => { #6 + Name => 'RecInfo', + Condition => '$$self{Make} eq "Canon"', + Notes => 'Canon only', + SubDirectory => { TagTable => 'Image::ExifTool::H264::RecInfo' }, + }, + # 0xe2-0xe8 - val: 0x00000000 in many samples + # 0xe2 - val: 0x00000000,0x01000000,0x01010000,0x8080900c,0x8080a074 + # 0xe3 - val: 0x00801f89,0x00801f8b,0x00c01f89,0xc9c01f80 + 0xe4 => { #PH + Name => 'Model', + Condition => '$$self{Make} eq "Sony"', # (possibly also Canon models?) + Description => 'Camera Model Name', + Notes => 'Sony only, combined with tags 0xe5 and 0xe6', + Format => 'string', + Combine => 2, # (not sure about 0xe6, but include it just in case) + RawConv => '$val eq "" ? undef : $val', + }, + # 0xeb - val: 0x008a0a00,0x0a300000,0x508a0a00,0x52880a00,0x528a0a00 + # 0xec - val: 0x0b700000 + # 0xed - val: 0x0ce0f819 + 0xee => { #6 (HFS200) + Name => 'FrameInfo', + Condition => '$$self{Make} eq "Canon"', + Notes => 'Canon only', + SubDirectory => { TagTable => 'Image::ExifTool::H264::FrameInfo' }, + }, + # 0xef - val: 0x01c00000,0x0e00000c +); + +# ConsumerCamera1 information (ref PH) +%Image::ExifTool::H264::Camera1 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Camera' }, + TAG_PREFIX => 'Camera1', + PRINT_CONV => 'sprintf("0x%.2x",$val)', + FIRST_ENTRY => 0, + 0 => { + Name => 'ApertureSetting', + PrintHex => 1, + PrintConv => { + 0xff => 'Auto', + 0xfe => 'Closed', + OTHER => sub { sprintf('%.1f', 2 ** (($_[0] & 0x3f) / 8)) }, + }, + }, + 1 => { + Name => 'Gain', + Mask => 0x0f, + # (0x0f would translate to 42 dB, but this value is used by the Sony + # HXR-NX5U for any out-of-range value such as -6 dB or "hyper gain" - PH) + ValueConv => '($val - 1) * 3', + PrintConv => '$val==42 ? "Out of range" : "$val dB"', + }, + 1.1 => { + Name => 'ExposureProgram', + Mask => 0xf0, + ValueConv => '$val == 15 ? undef : $val', + PrintConv => { + 0 => 'Program AE', + 1 => 'Gain', #? + 2 => 'Shutter speed priority AE', + 3 => 'Aperture-priority AE', + 4 => 'Manual', + }, + }, + 2.1 => { + Name => 'WhiteBalance', + Mask => 0xe0, + ValueConv => '$val == 7 ? undef : $val', + PrintConv => { + 0 => 'Auto', + 1 => 'Hold', + 2 => '1-Push', + 3 => 'Daylight', + }, + }, + 3 => { + Name => 'Focus', + ValueConv => '$val == 0xff ? undef : $val', + PrintConv => q{ + my $foc = ($val & 0x7e) / (($val & 0x01) ? 40 : 400); + return(($val & 0x80 ? 'Manual' : 'Auto') . " ($foc)"); + }, + }, +); + +# ConsumerCamera2 information (ref PH) +%Image::ExifTool::H264::Camera2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Camera' }, + TAG_PREFIX => 'Camera2', + PRINT_CONV => 'sprintf("0x%.2x",$val)', + FIRST_ENTRY => 0, + 1 => { + Name => 'ImageStabilization', + PrintHex => 1, + PrintConv => { + 0 => 'Off', + 0x3f => 'On (0x3f)', #8 + 0xbf => 'Off (0xbf)', #8 + 0xff => 'n/a', + OTHER => sub { + my $val = shift; + sprintf("%s (0x%.2x)", $val & 0x10 ? "On" : "Off", $val); + }, + }, + }, +); + +# camera info 0x7f (ref PH) +%Image::ExifTool::H264::Shutter = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + TAG_PREFIX => 'Shutter', + PRINT_CONV => 'sprintf("0x%.2x",$val)', + FIRST_ENTRY => 0, + FORMAT => 'int16u', + 1.1 => { #6 + Name => 'ExposureTime', + Mask => 0x7fff, # (what is bit 0x8000 for?) + RawConv => '$val == 0x7fff ? undef : $val', #7 + ValueConv => '$val / 28125', #PH (Vixia HF G30, ref forum5588) (was $val/33640 until 9.49) + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, +); + +# camera info 0xe0 (ref PH) +%Image::ExifTool::H264::MakeModel = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Camera' }, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + 0 => { + Name => 'Make', + PrintHex => 1, + RawConv => '$$self{Make} = ($Image::ExifTool::H264::convMake{$val} || "Unknown"); $val', + PrintConv => \%convMake, + }, + # 1 => ModelIDCode according to ref 4/5 (I think not - PH) + # 1 => { Name => 'ModelIDCode', PrintConv => 'sprintf("%.4x",$val)' }, + # vals: 0x0313 - various Pansonic HDC models + # 0x0345 - Panasonic HC-V7272 + # 0x0414 - Panasonic AG-AF100 + # 0x0591 - various Panasonic DMC models + # 0x0802 - Panasonic DMC-TZ60 with GPS information off + # 0x0803 - Panasonic DMC-TZ60 with GPS information on + # 0x3001 - various Sony DSC, HDR, NEX and SLT models + # 0x3003 - various Sony DSC models + # 0x3100 - various Sony DSC, ILCE, NEX and SLT models + # 0x1000 - Sony HDR-UX1 + # 0x2000 - Canon HF100 (60i) + # 0x3000 - Canon HF100 (30p) + # 0x3101 - Canon HFM300 (PH, all qualities and frame rates) + # 0x3102 - Canon HFS200 + # 0x4300 - Canon HFG30 +); + +# camera info 0xe1 (ref 6) +%Image::ExifTool::H264::RecInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Camera' }, + FORMAT => 'int8u', + NOTES => 'Recording information stored by some Canon video cameras.', + FIRST_ENTRY => 0, + 0 => { + Name => 'RecordingMode', + PrintConv => { + 0x02 => 'XP+', # High Quality 12 Mbps + 0x04 => 'SP', # Standard Play 7 Mbps + 0x05 => 'LP', # Long Play 5 Mbps + 0x06 => 'FXP', # High Quality 17 Mbps + 0x07 => 'MXP', # High Quality 24 Mbps + }, + }, +); + +# camera info 0xee (ref 6) +%Image::ExifTool::H264::FrameInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int8u', + NOTES => 'Frame rate information stored by some Canon video cameras.', + FIRST_ENTRY => 0, + 0 => 'CaptureFrameRate', + 1 => 'VideoFrameRate', + # 2 - 8=60i, 10=PF30, 74=PF24 (PH, HFM300) +); + +#============================================================================== +# Bitstream functions (used for H264 video) +# +# Member variables: +# Mask = mask for next bit to read (0 when all data has been read) +# Pos = byte offset of next word to read +# Word = current data word +# Len = total data length in bytes +# DataPt = data pointer +#.............................................................................. + +#------------------------------------------------------------------------------ +# Read next word from bitstream +# Inputs: 0) BitStream ref +# Returns: true if there is more data (and updates +# Mask, Pos and Word for first bit in next word) +sub ReadNextWord($) +{ + my $bstr = shift; + my $pos = $$bstr{Pos}; + if ($pos + 4 <= $$bstr{Len}) { + $$bstr{Word} = unpack("x$pos N", ${$$bstr{DataPt}}); + $$bstr{Mask} = 0x80000000; + $$bstr{Pos} += 4; + } elsif ($pos < $$bstr{Len}) { + my @bytes = unpack("x$pos C*", ${$$bstr{DataPt}}); + my ($word, $mask) = (shift(@bytes), 0x80); + while (@bytes) { + $word = ($word << 8) | shift(@bytes); + $mask <<= 8; + } + $$bstr{Word} = $word; + $$bstr{Mask} = $mask; + $$bstr{Pos} = $$bstr{Len}; + } else { + return 0; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Create a new BitStream object +# Inputs: 0) data ref +# Returns: BitStream ref, or null if data is empty +sub NewBitStream($) +{ + my $dataPt = shift; + my $bstr = { + DataPt => $dataPt, + Len => length($$dataPt), + Pos => 0, + Mask => 0, + }; + ReadNextWord($bstr) or undef $bstr; + return $bstr; +} + +#------------------------------------------------------------------------------ +# Get number of bits remaining in bit stream +# Inputs: 0) BitStream ref +# Returns: number of bits remaining +sub BitsLeft($) +{ + my $bstr = shift; + my $bits = 0; + my $mask = $$bstr{Mask}; + while ($mask) { + ++$bits; + $mask >>= 1; + } + return $bits + 8 * ($$bstr{Len} - $$bstr{Pos}); +} + +#------------------------------------------------------------------------------ +# Get integer from bitstream +# Inputs: 0) BitStream ref, 1) number of bits +# Returns: integer (and increments position in bitstream) +sub GetIntN($$) +{ + my ($bstr, $bits) = @_; + my $val = 0; + while ($bits--) { + $val <<= 1; + ++$val if $$bstr{Mask} & $$bstr{Word}; + $$bstr{Mask} >>= 1 and next; + ReadNextWord($bstr) or last; + } + return $val; +} + +#------------------------------------------------------------------------------ +# Get Exp-Golomb integer from bitstream +# Inputs: 0) BitStream ref +# Returns: integer (and increments position in bitstream) +sub GetGolomb($) +{ + my $bstr = shift; + # first, count the number of zero bits to get the integer bit width + my $count = 0; + until ($$bstr{Mask} & $$bstr{Word}) { + ++$count; + $$bstr{Mask} >>= 1 and next; + ReadNextWord($bstr) or last; + } + # then return the adjusted integer + return GetIntN($bstr, $count + 1) - 1; +} + +#------------------------------------------------------------------------------ +# Get signed Exp-Golomb integer from bitstream +# Inputs: 0) BitStream ref +# Returns: integer (and increments position in bitstream) +sub GetGolombS($) +{ + my $bstr = shift; + my $val = GetGolomb($bstr) + 1; + return ($val & 1) ? -($val >> 1) : ($val >> 1); +} + +# end bitstream functions +#============================================================================== + +#------------------------------------------------------------------------------ +# Decode H.264 scaling matrices +# Inputs: 0) BitStream ref +# Reference: http://ffmpeg.org/ +sub DecodeScalingMatrices($) +{ + my $bstr = shift; + if (GetIntN($bstr, 1)) { + my ($i, $j); + for ($i=0; $i<8; ++$i) { + my $size = $i<6 ? 16 : 64; + next unless GetIntN($bstr, 1); + my ($last, $next) = (8, 8); + for ($j=0; $j<$size; ++$j) { + $next = ($last + GetGolombS($bstr)) & 0xff if $next; + last unless $j or $next; + } + } + } +} + +#------------------------------------------------------------------------------ +# Parse H.264 sequence parameter set RBSP (ref 1) +# Inputs: 0) ExifTool ref, 1) tag table ref, 2) data ref +# Notes: All this just to get the image size! +sub ParseSeqParamSet($$$) +{ + my ($et, $tagTablePtr, $dataPt) = @_; + # initialize our bitstream object + my $bstr = NewBitStream($dataPt) or return; + my ($t, $i, $j, $n); + # the messy nature of H.264 encoding makes it difficult to use + # data-driven structure parsing, so I code it explicitly (yuck!) + $t = GetIntN($bstr, 8); # profile_idc + GetIntN($bstr, 16); # constraints and level_idc + GetGolomb($bstr); # seq_parameter_set_id + if ($t >= 100) { # (ref b) + $t = GetGolomb($bstr); # chroma_format_idc + if ($t == 3) { + GetIntN($bstr, 1); # separate_colour_plane_flag + $n = 12; + } else { + $n = 8; + } + GetGolomb($bstr); # bit_depth_luma_minus8 + GetGolomb($bstr); # bit_depth_chroma_minus8 + GetIntN($bstr, 1); # qpprime_y_zero_transform_bypass_flag + DecodeScalingMatrices($bstr); + } + GetGolomb($bstr); # log2_max_frame_num_minus4 + $t = GetGolomb($bstr); # pic_order_cnt_type + if ($t == 0) { + GetGolomb($bstr); # log2_max_pic_order_cnt_lsb_minus4 + } elsif ($t == 1) { + GetIntN($bstr, 1); # delta_pic_order_always_zero_flag + GetGolomb($bstr); # offset_for_non_ref_pic + GetGolomb($bstr); # offset_for_top_to_bottom_field + $n = GetGolomb($bstr); # num_ref_frames_in_pic_order_cnt_cycle + for ($i=0; $i<$n; ++$i) { + GetGolomb($bstr); # offset_for_ref_frame[i] + } + } + GetGolomb($bstr); # num_ref_frames + GetIntN($bstr, 1); # gaps_in_frame_num_value_allowed_flag + my $w = GetGolomb($bstr); # pic_width_in_mbs_minus1 + my $h = GetGolomb($bstr); # pic_height_in_map_units_minus1 + my $f = GetIntN($bstr, 1); # frame_mbs_only_flag + $f or GetIntN($bstr, 1); # mb_adaptive_frame_field_flag + GetIntN($bstr, 1); # direct_8x8_inference_flag + # convert image size to pixels + $w = ($w + 1) * 16; + $h = (2 - $f) * ($h + 1) * 16; + # account for cropping (if any) + $t = GetIntN($bstr, 1); # frame_cropping_flag + if ($t) { + my $m = 4 - $f * 2; + $w -= 4 * GetGolomb($bstr);# frame_crop_left_offset + $w -= 4 * GetGolomb($bstr);# frame_crop_right_offset + $h -= $m * GetGolomb($bstr);# frame_crop_top_offset + $h -= $m * GetGolomb($bstr);# frame_crop_bottom_offset + } + # quick validity checks (just in case) + return unless $$bstr{Mask}; + if ($w>=160 and $w<=4096 and $h>=120 and $h<=3072) { + $et->HandleTag($tagTablePtr, ImageWidth => $w); + $et->HandleTag($tagTablePtr, ImageHeight => $h); + # (whew! -- so much work just to get ImageSize!!) + } + # return now unless interested in picture timing information + return unless $parsePictureTiming; + + # parse vui parameters if they exist + GetIntN($bstr, 1) or return; # vui_parameters_present_flag + $t = GetIntN($bstr, 1); # aspect_ratio_info_present_flag + if ($t) { + $t = GetIntN($bstr, 8); # aspect_ratio_idc + if ($t == 255) { # Extended_SAR ? + GetIntN($bstr, 32); # sar_width/sar_height + } + } + $t = GetIntN($bstr, 1); # overscan_info_present_flag + GetIntN($bstr, 1) if $t; # overscan_appropriate_flag + $t = GetIntN($bstr, 1); # video_signal_type_present_flag + if ($t) { + GetIntN($bstr, 4); # video_format/video_full_range_flag + $t = GetIntN($bstr, 1); # colour_description_present_flag + GetIntN($bstr, 24) if $t; # colour_primaries/transfer_characteristics/matrix_coefficients + } + $t = GetIntN($bstr, 1); # chroma_loc_info_present_flag + if ($t) { + GetGolomb($bstr); # chroma_sample_loc_type_top_field + GetGolomb($bstr); # chroma_sample_loc_type_bottom_field + } + $t = GetIntN($bstr, 1); # timing_info_present_flag + if ($t) { + return if BitsLeft($bstr) < 65; + $$et{VUI_units} = GetIntN($bstr, 32); # num_units_in_tick + $$et{VUI_scale} = GetIntN($bstr, 32); # time_scale + GetIntN($bstr, 1); # fixed_frame_rate_flag + } + my $hard; + for ($j=0; $j<2; ++$j) { + $t = GetIntN($bstr, 1); # nal_/vcl_hrd_parameters_present_flag + if ($t) { + $$et{VUI_hard} = 1; + $hard = 1; + $n = GetGolomb($bstr); # cpb_cnt_minus1 + GetIntN($bstr, 8); # bit_rate_scale/cpb_size_scale + for ($i=0; $i<=$n; ++$i) { + GetGolomb($bstr); # bit_rate_value_minus1[SchedSelIdx] + GetGolomb($bstr); # cpb_size_value_minus1[SchedSelIdx] + GetIntN($bstr, 1); # cbr_flag[SchedSelIdx] + } + GetIntN($bstr, 5); # initial_cpb_removal_delay_length_minus1 + $$et{VUI_clen} = GetIntN($bstr, 5); # cpb_removal_delay_length_minus1 + $$et{VUI_dlen} = GetIntN($bstr, 5); # dpb_output_delay_length_minus1 + $$et{VUI_toff} = GetIntN($bstr, 5); # time_offset_length + } + } + GetIntN($bstr, 1) if $hard; # low_delay_hrd_flag + $$et{VUI_pic} = GetIntN($bstr, 1); # pic_struct_present_flag + # (don't yet decode the rest of the vui data) +} + +#------------------------------------------------------------------------------ +# Parse H.264 picture timing SEI message (payload type 1) (ref 1) +# Inputs: 0) ExifTool ref, 1) data ref +# Notes: this routine is for test purposes only, and not called unless the +# $parsePictureTiming flag is set +sub ParsePictureTiming($$) +{ + my ($et, $dataPt) = @_; + my $bstr = NewBitStream($dataPt) or return; + my ($i, $t, $n); + # the specification is very odd on this point: the following delays + # exist if the VUI hardware parameters are present, or if + # "determined by the application, by some means not specified" -- WTF?? + if ($$et{VUI_hard}) { + GetIntN($bstr, $$et{VUI_clen} + 1); # cpb_removal_delay + GetIntN($bstr, $$et{VUI_dlen} + 1); # dpb_output_delay + } + if ($$et{VUI_pic}) { + $t = GetIntN($bstr, 4); # pic_struct + # determine NumClockTS ($n) + $n = { 0=>1, 1=>1, 2=>1, 3=>2, 4=>2, 5=>3, 6=>3, 7=>2, 8=>3 }->{$t}; + $n or return; + for ($i=0; $i<$n; ++$i) { + $t = GetIntN($bstr, 1); # clock_timestamp_flag[i] + next unless $t; + my ($nu, $s, $m, $h, $o); + GetIntN($bstr, 2); # ct_type + $nu = GetIntN($bstr, 1);# nuit_field_based_flag + GetIntN($bstr, 5); # counting_type + $t = GetIntN($bstr, 1); # full_timestamp_flag + GetIntN($bstr, 1); # discontinuity_flag + GetIntN($bstr, 1); # cnt_dropped_flag + GetIntN($bstr, 8); # n_frames + if ($t) { + $s = GetIntN($bstr, 6); # seconds_value + $m = GetIntN($bstr, 6); # minutes_value + $h = GetIntN($bstr, 5); # hours_value + } else { + $t = GetIntN($bstr, 1); # seconds_flag + if ($t) { + $s = GetIntN($bstr, 6); # seconds_value + $t = GetIntN($bstr, 1); # minutes_flag + if ($t) { + $m = GetIntN($bstr, 6); # minutes_value + $t = GetIntN($bstr, 1); # hours_flag + $h = GetIntN($bstr, 5) if $t; # hours_value + } + } + } + if ($$et{VUI_toff}) { + $o = GetIntN($bstr, $$et{VUI_toff}); # time_offset + } + last; # only parse the first clock timestamp found + } + } +} + +#------------------------------------------------------------------------------ +# Process H.264 Supplementary Enhancement Information (ref 1/PH) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 if we processed payload type 5 +# Payload types: +# 0 - buffer period +# 1 - pic timing +# 2 - pan scan rect +# 3 - filler payload +# 4 - user data registered itu t t35 +# 5 - user data unregistered +# 6 - recovery point +# 7 - dec ref pic marking repetition +# 8 - spare pic +# 9 - sene info +# 10 - sub seq info +# 11 - sub seq layer characteristics +# 12 - sub seq characteristics +# 13 - full frame freeze +# 14 - full frame freeze release +# 15 - full frame snapshot +# 16 - progressive refinement segment start +# 17 - progressive refinement segment end +# 18 - motion constrained slice group set +sub ProcessSEI($$) +{ + my ($et, $dirInfo) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $end = length($$dataPt); + my $pos = 0; + my ($type, $size, $index, $t); + + # scan through SEI payload for type 5 (the unregistered user data) + for (;;) { + $type = 0; + for (;;) { + return 0 if $pos >= $end; + $t = Get8u($dataPt, $pos++); # payload type + $type += $t; + last unless $t == 255; + } + return 0 if $type == 0x80; # terminator (ref PH - maybe byte alignment bits?) + $size = 0; + for (;;) { + return 0 if $pos >= $end; + $t = Get8u($dataPt, $pos++); # payload data length + $size += $t; + last unless $t == 255; + } + return 0 if $pos + $size > $end; + $et->VPrint(1," (SEI type $type)\n"); + if ($type == 1) { # picture timing information + if ($parsePictureTiming) { + my $buff = substr($$dataPt, $pos, $size); + ParsePictureTiming($et, $dataPt); + } + } elsif ($type == 5) { # unregistered user data + last; # exit loop to process user data now + } + $pos += $size; + } + + # look for our 16-byte UUID + # - plus "MDPM" for "ModifiedDVPackMeta" + # - plus "GA94" for closed-caption data (currently not decoded) + return 0 unless $size > 20 and substr($$dataPt, $pos, 20) eq + "\x17\xee\x8c\x60\xf8\x4d\x11\xd9\x8c\xd6\x08\0\x20\x0c\x9a\x66MDPM"; +# +# parse the MDPM records in the UUID 17ee8c60f84d11d98cd60800200c9a66 +# unregistered user data payload (ref PH) +# + my $tagTablePtr = GetTagTable('Image::ExifTool::H264::MDPM'); + my $oldIndent = $$et{INDENT}; + $$et{INDENT} .= '| '; + $end = $pos + $size; # end of payload + $pos += 20; # skip UUID + "MDPM" + my $num = Get8u($dataPt, $pos++); # get entry count + my $lastTag = 0; + $et->VerboseDir('MDPM', $num) if $et->Options('Verbose'); + # walk through entries in the MDPM payload + for ($index=0; $index<$num and $pos<$end; ++$index) { + my $tag = Get8u($dataPt, $pos); + if ($tag <= $lastTag) { # should be in numerical order (PH) + $et->Warn('Entries in MDPM directory are out of sequence'); + last; + } + $lastTag = $tag; + my $buff = substr($$dataPt, $pos + 1, 4); + my $from; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($tagInfo) { + # use our own print conversion for Unknown tags + if ($$tagInfo{Unknown} and not $$tagInfo{SetPrintConv}) { + $$tagInfo{PrintConv} = 'sprintf("0x%.8x", unpack("N", $val))'; + $$tagInfo{SetPrintConv} = 1; + } + # combine with next value(s) if necessary + my $combine = $$tagTablePtr{$tag}{Combine}; + while ($combine) { + last if $pos + 5 >= $end; + my $t = Get8u($dataPt, $pos + 5); + last if $t != $lastTag + 1; # must be consecutive tag ID's + $pos += 5; + $buff .= substr($$dataPt, $pos + 1, 4); + $from = $index unless defined $from; + ++$index; + ++$lastTag; + --$combine; + } + $et->HandleTag($tagTablePtr, $tag, undef, + TagInfo => $tagInfo, + DataPt => \$buff, + Size => length($buff), + Index => defined $from ? "$from-$index" : $index, + ); + } + $pos += 5; + } + $$et{INDENT} = $oldIndent; + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from H.264 video stream +# Inputs: 0) ExifTool ref, 1) data ref +# Returns: 0 = done parsing, 1 = we want to parse more of these +sub ParseH264Video($$) +{ + my ($et, $dataPt) = @_; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my $tagTablePtr = GetTagTable('Image::ExifTool::H264::Main'); + my %parseNalUnit = ( 0x06 => 1, 0x07 => 1 ); # NAL unit types to parse + my $foundUserData; + my $len = length $$dataPt; + my $pos = 0; + while ($pos < $len) { + my ($nextPos, $end); + # find start of next NAL unit + if ($$dataPt =~ /(\0{2,3}\x01)/g) { + $nextPos = pos $$dataPt; + $end = $nextPos - length $1; + $pos or $pos = $nextPos, next; + } else { + last unless $pos; + $nextPos = $end = $len; + } + last if $pos >= $len; + # parse NAL unit from $pos to $end + my $nal_unit_type = Get8u($dataPt, $pos); + ++$pos; + # check forbidden_zero_bit + $nal_unit_type & 0x80 and $et->Warn('H264 forbidden bit error'), last; + $nal_unit_type &= 0x1f; + # ignore this NAL unit unless we will parse it + $parseNalUnit{$nal_unit_type} or $verbose or $pos = $nextPos, next; + # read NAL unit (and convert all 0x000003's to 0x0000 as per spec.) + my $buff = ''; + pos($$dataPt) = $pos + 1; + while ($$dataPt =~ /\0\0\x03/g) { + last if pos $$dataPt > $end; + $buff .= substr($$dataPt, $pos, pos($$dataPt)-1-$pos); + $pos = pos $$dataPt; + } + $buff .= substr($$dataPt, $pos, $end - $pos); + if ($verbose > 1) { + printf $out " NAL Unit Type: 0x%x (%d bytes)\n",$nal_unit_type, length $buff; + $et->VerboseDump(\$buff); + } + pos($$dataPt) = $pos = $nextPos; + + if ($nal_unit_type == 0x06) { # sei_rbsp (supplemental enhancement info) + + if ($$et{GotNAL06}) { + # process only the first SEI unless ExtractEmbedded is set + next unless $et->Options('ExtractEmbedded'); + $$et{DOC_NUM} = $$et{GotNAL06}; + } + $foundUserData = ProcessSEI($et, { DataPt => \$buff } ); + delete $$et{DOC_NUM}; + # keep parsing SEI's until we find the user data + next unless $foundUserData; + $$et{GotNAL06} = ($$et{GotNAL06} || 0) + 1; + + } elsif ($nal_unit_type == 0x07) { # sequence_parameter_set_rbsp + + # process this NAL unit type only once + next if $$et{GotNAL07}; + $$et{GotNAL07} = 1; + ParseSeqParamSet($et, $tagTablePtr, \$buff); + } + # we were successful, so don't parse this NAL unit type again + delete $parseNalUnit{$nal_unit_type}; + } + # parse one extra H264 frame if we didn't find the user data in this one + # (Panasonic cameras don't put the SEI in the first frame) + return 0 if $foundUserData or $$et{ParsedH264}; + $$et{ParsedH264} = 1; + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::H264 - Read meta information from H.264 video + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to extract +information from H.264 video streams. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.itu.int/rec/T-REC-H.264/e> + +=item L<http://miffteevee.co.uk/documentation/development/H264Parser_8cpp-source.html> + +=item L<http://ffmpeg.org/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/H264 Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/HP.pm b/lib/Image/ExifTool/HP.pm new file mode 100644 index 0000000..c603df0 --- /dev/null +++ b/lib/Image/ExifTool/HP.pm @@ -0,0 +1,263 @@ +#------------------------------------------------------------------------------ +# File: HP.pm +# +# Description: Hewlett-Packard maker notes tags +# +# Revisions: 2007-05-03 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::HP; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.04'; + +sub ProcessHP($$$); +sub ProcessTDHD($$$); + +# HP EXIF-format maker notes (or is it Vivitar?) +%Image::ExifTool::HP::Main = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tables list tags found in the maker notes of some Hewlett-Packard + camera models. + + The first table lists tags found in the EXIF-format maker notes of the + PhotoSmart 720 (also used by the Vivitar ViviCam 3705, 3705B and 3715). + }, + 0x0e00 => { + Name => 'PrintIM', + Description => 'Print Image Matching', + SubDirectory => { + TagTable => 'Image::ExifTool::PrintIM::Main', + }, + }, +); + +# other types of HP maker notes +%Image::ExifTool::HP::Type2 = ( + PROCESS_PROC => \&ProcessHP, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are used by the PhotoSmart E427.', + 'PreviewImage' => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + RawConv => '$self->ValidateImage(\$val,$tag)', + }, + 'Serial Number' => 'SerialNumber', + 'Lens Shading' => 'LensShading', +); + +%Image::ExifTool::HP::Type4 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are used by the PhotoSmart M627.', + 0x0c => { + Name => 'MaxAperture', + Format => 'int16u', + ValueConv => '$val / 10', + }, + 0x10 => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val / 1e6', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x14 => { + Name => 'CameraDateTime', + Groups => { 2 => 'Time' }, + Format => 'string[20]', + }, + 0x34 => { + Name => 'ISO', + Format => 'int16u', + }, + 0x5c => { + Name => 'SerialNumber', + Format => 'string[26]', + RawConv => '$val =~ s/^SERIAL NUMBER:// ? $val : undef', + }, +); + +%Image::ExifTool::HP::Type6 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are used by the PhotoSmart M425, M525 and M527.', + 0x0c => { + Name => 'FNumber', + Format => 'int16u', + ValueConv => '$val / 10', + }, + 0x10 => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val / 1e6', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x14 => { + Name => 'CameraDateTime', + Groups => { 2 => 'Time' }, + Format => 'string[20]', + }, + 0x34 => { + Name => 'ISO', + Format => 'int16u', + }, + 0x58 => { + Name => 'SerialNumber', + Format => 'string[26]', + RawConv => '$val =~ s/^SERIAL NUMBER:// ? $val : undef', + }, +); + +# proprietary format TDHD data written by Photosmart R837 (ref PH) +%Image::ExifTool::HP::TDHD = ( + PROCESS_PROC => \&ProcessTDHD, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are extracted from the APP6 "TDHD" segment of Photosmart R837 + JPEG images. Many other unknown tags exist in is data, and can be seen with + the L<Unknown|../ExifTool.html#Unknown> (-u) option. + }, + # (all subdirectories except TDHD and LSLV are automatically recognized + # by their "type" word of 0x10001) + TDHD => { + Name => 'TDHD', + SubDirectory => { TagTable => 'Image::ExifTool::HP::TDHD' }, + }, + LSLV => { + Name => 'LSLV', + SubDirectory => { TagTable => 'Image::ExifTool::HP::TDHD' }, + }, + FWRV => 'FirmwareVersion', + CMSN => 'SerialNumber', # (unverified) + # LTEM - some temperature? +); + +#------------------------------------------------------------------------------ +# Process HP APP6 TDHD metadata (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessTDHD($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $pos = $$dirInfo{DirStart}; + my $dirEnd = $pos + $$dirInfo{DirLen}; + my $unknown = $et->Options('Unknown') || $et->Options('Verbose'); + $et->VerboseDir('TDHD', undef, $$dirInfo{DirLen}); + SetByteOrder('II'); + while ($pos + 12 < $dirEnd) { + my $tag = substr($$dataPt, $pos, 4); + my $type = Get32u($dataPt, $pos + 4); + my $size = Get32u($dataPt, $pos + 8); + $pos += 12; + last if $size < 0 or $pos + $size > $dirEnd; + if ($type == 0x10001) { + # this is a subdirectory containing more tags + my %dirInfo = ( + DataPt => $dataPt, + DataPos => $dataPos, + DirStart => $pos, + DirLen => $size, + ); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } else { + if (not $$tagTablePtr{$tag} and $unknown) { + my $name = $tag; + $name =~ tr/-_A-Za-z0-9//dc; # remove invalid characters + my %tagInfo = ( + Name => "HP_TDHD_$name", + Unknown => 1, + ); + # guess format based on data size + if ($size == 1) { + $tagInfo{Format} = 'int8u'; + } elsif ($size == 2) { + $tagInfo{Format} = 'int16u'; + } elsif ($size == 4) { + $tagInfo{Format} = 'int32s'; + } elsif ($size > 80) { + $tagInfo{Binary} = 1; + } + AddTagToTable($tagTablePtr, $tag, \%tagInfo); + } + $et->HandleTag($tagTablePtr, $tag, undef, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $pos, + Size => $size, + ); + } + $pos += $size; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process HP maker notes +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, otherwise returns 0 and sets a Warning +sub ProcessHP($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataLen = $$dirInfo{DataLen}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || $dataLen - $dirStart; + + # look for known text-type tags + if ($dirStart or $dirLen != length($$dataPt)) { + my $buff = substr($$dataPt, $dirStart, $dirLen); + $dataPt = \$buff; + } + my $tagID; + # brute-force scan for PreviewImage + if ($$tagTablePtr{PreviewImage} and $$dataPt =~ /(\xff\xd8\xff\xdb.*\xff\xd9)/gs) { + $et->HandleTag($tagTablePtr, 'PreviewImage', $1); + # truncate preview to speed subsequent tag scans + my $buff = substr($$dataPt, 0, pos($$dataPt)-length($1)); + $dataPt = \$buff; + } + # scan for other tag ID's + foreach $tagID (sort(TagTableKeys($tagTablePtr))) { + next if $tagID eq 'PreviewImage'; + next unless $$dataPt =~ /$tagID:\s*([\x20-\x7f]+)/i; + $et->HandleTag($tagTablePtr, $tagID, $1); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::HP - Hewlett-Packard maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Hewlett-Packard maker notes. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/HP Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/HTML.pm b/lib/Image/ExifTool/HTML.pm new file mode 100644 index 0000000..4af55d4 --- /dev/null +++ b/lib/Image/ExifTool/HTML.pm @@ -0,0 +1,583 @@ +#------------------------------------------------------------------------------ +# File: HTML.pm +# +# Description: Read HTML meta information +# +# Revisions: 01/30/2007 - P. Harvey Created +# +# References: 1) http://www.w3.org/TR/html4/ +# 2) http://www.daisy.org/publications/specifications/daisy_202.html +# 3) http://vancouver-webpages.com/META/metatags.detail.html +# 4) http://www.html-reference.com/META.htm +#------------------------------------------------------------------------------ + +package Image::ExifTool::HTML; + +use strict; +use vars qw($VERSION @ISA @EXPORT_OK); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::PostScript; +use Image::ExifTool::XMP qw(EscapeXML UnescapeXML); +require Exporter; + +$VERSION = '1.16'; +@ISA = qw(Exporter); +@EXPORT_OK = qw(EscapeHTML UnescapeHTML); + +sub SetHTMLCharset($$); + +# convert HTML charset (lower case) to ExifTool Charset name +my %htmlCharset = ( + macintosh => 'MacRoman', + 'iso-8859-1' => 'Latin', + 'utf-8' => 'UTF8', + 'windows-1252' => 'Latin', +); + +# HTML 4 character entity references +my %entityNum = ( + 'quot' => 34, 'eth' => 240, 'lsquo' => 8216, + 'amp' => 38, 'ntilde' => 241, 'rsquo' => 8217, + 'apos' => 39, 'ograve' => 242, 'sbquo' => 8218, + 'lt' => 60, 'oacute' => 243, 'ldquo' => 8220, + 'gt' => 62, 'ocirc' => 244, 'rdquo' => 8221, + 'nbsp' => 160, 'otilde' => 245, 'bdquo' => 8222, + 'iexcl' => 161, 'ouml' => 246, 'dagger' => 8224, + 'cent' => 162, 'divide' => 247, 'Dagger' => 8225, + 'pound' => 163, 'oslash' => 248, 'bull' => 8226, + 'curren' => 164, 'ugrave' => 249, 'hellip' => 8230, + 'yen' => 165, 'uacute' => 250, 'permil' => 8240, + 'brvbar' => 166, 'ucirc' => 251, 'prime' => 8242, + 'sect' => 167, 'uuml' => 252, 'Prime' => 8243, + 'uml' => 168, 'yacute' => 253, 'lsaquo' => 8249, + 'copy' => 169, 'thorn' => 254, 'rsaquo' => 8250, + 'ordf' => 170, 'yuml' => 255, 'oline' => 8254, + 'laquo' => 171, 'OElig' => 338, 'frasl' => 8260, + 'not' => 172, 'oelig' => 339, 'euro' => 8364, + 'shy' => 173, 'Scaron' => 352, 'image' => 8465, + 'reg' => 174, 'scaron' => 353, 'weierp' => 8472, + 'macr' => 175, 'Yuml' => 376, 'real' => 8476, + 'deg' => 176, 'fnof' => 402, 'trade' => 8482, + 'plusmn' => 177, 'circ' => 710, 'alefsym'=> 8501, + 'sup2' => 178, 'tilde' => 732, 'larr' => 8592, + 'sup3' => 179, 'Alpha' => 913, 'uarr' => 8593, + 'acute' => 180, 'Beta' => 914, 'rarr' => 8594, + 'micro' => 181, 'Gamma' => 915, 'darr' => 8595, + 'para' => 182, 'Delta' => 916, 'harr' => 8596, + 'middot' => 183, 'Epsilon'=> 917, 'crarr' => 8629, + 'cedil' => 184, 'Zeta' => 918, 'lArr' => 8656, + 'sup1' => 185, 'Eta' => 919, 'uArr' => 8657, + 'ordm' => 186, 'Theta' => 920, 'rArr' => 8658, + 'raquo' => 187, 'Iota' => 921, 'dArr' => 8659, + 'frac14' => 188, 'Kappa' => 922, 'hArr' => 8660, + 'frac12' => 189, 'Lambda' => 923, 'forall' => 8704, + 'frac34' => 190, 'Mu' => 924, 'part' => 8706, + 'iquest' => 191, 'Nu' => 925, 'exist' => 8707, + 'Agrave' => 192, 'Xi' => 926, 'empty' => 8709, + 'Aacute' => 193, 'Omicron'=> 927, 'nabla' => 8711, + 'Acirc' => 194, 'Pi' => 928, 'isin' => 8712, + 'Atilde' => 195, 'Rho' => 929, 'notin' => 8713, + 'Auml' => 196, 'Sigma' => 931, 'ni' => 8715, + 'Aring' => 197, 'Tau' => 932, 'prod' => 8719, + 'AElig' => 198, 'Upsilon'=> 933, 'sum' => 8721, + 'Ccedil' => 199, 'Phi' => 934, 'minus' => 8722, + 'Egrave' => 200, 'Chi' => 935, 'lowast' => 8727, + 'Eacute' => 201, 'Psi' => 936, 'radic' => 8730, + 'Ecirc' => 202, 'Omega' => 937, 'prop' => 8733, + 'Euml' => 203, 'alpha' => 945, 'infin' => 8734, + 'Igrave' => 204, 'beta' => 946, 'ang' => 8736, + 'Iacute' => 205, 'gamma' => 947, 'and' => 8743, + 'Icirc' => 206, 'delta' => 948, 'or' => 8744, + 'Iuml' => 207, 'epsilon'=> 949, 'cap' => 8745, + 'ETH' => 208, 'zeta' => 950, 'cup' => 8746, + 'Ntilde' => 209, 'eta' => 951, 'int' => 8747, + 'Ograve' => 210, 'theta' => 952, 'there4' => 8756, + 'Oacute' => 211, 'iota' => 953, 'sim' => 8764, + 'Ocirc' => 212, 'kappa' => 954, 'cong' => 8773, + 'Otilde' => 213, 'lambda' => 955, 'asymp' => 8776, + 'Ouml' => 214, 'mu' => 956, 'ne' => 8800, + 'times' => 215, 'nu' => 957, 'equiv' => 8801, + 'Oslash' => 216, 'xi' => 958, 'le' => 8804, + 'Ugrave' => 217, 'omicron'=> 959, 'ge' => 8805, + 'Uacute' => 218, 'pi' => 960, 'sub' => 8834, + 'Ucirc' => 219, 'rho' => 961, 'sup' => 8835, + 'Uuml' => 220, 'sigmaf' => 962, 'nsub' => 8836, + 'Yacute' => 221, 'sigma' => 963, 'sube' => 8838, + 'THORN' => 222, 'tau' => 964, 'supe' => 8839, + 'szlig' => 223, 'upsilon'=> 965, 'oplus' => 8853, + 'agrave' => 224, 'phi' => 966, 'otimes' => 8855, + 'aacute' => 225, 'chi' => 967, 'perp' => 8869, + 'acirc' => 226, 'psi' => 968, 'sdot' => 8901, + 'atilde' => 227, 'omega' => 969, 'lceil' => 8968, + 'auml' => 228, 'thetasym'=>977, 'rceil' => 8969, + 'aring' => 229, 'upsih' => 978, 'lfloor' => 8970, + 'aelig' => 230, 'piv' => 982, 'rfloor' => 8971, + 'ccedil' => 231, 'ensp' => 8194, 'lang' => 9001, + 'egrave' => 232, 'emsp' => 8195, 'rang' => 9002, + 'eacute' => 233, 'thinsp' => 8201, 'loz' => 9674, + 'ecirc' => 234, 'zwnj' => 8204, 'spades' => 9824, + 'euml' => 235, 'zwj' => 8205, 'clubs' => 9827, + 'igrave' => 236, 'lrm' => 8206, 'hearts' => 9829, + 'iacute' => 237, 'rlm' => 8207, 'diams' => 9830, + 'icirc' => 238, 'ndash' => 8211, + 'iuml' => 239, 'mdash' => 8212, +); +my %entityName; # look up entity names by number (built as necessary) + +# HTML info +# (tag ID's are case insensitive and must be all lower case in tables) +%Image::ExifTool::HTML::Main = ( + GROUPS => { 2 => 'Document' }, + NOTES => q{ + Meta information extracted from the header of HTML and XHTML files. This is + a mix of information found in the C<META> elements, C<XML> element, and the + C<TITLE> element. + }, + dc => { + Name => 'DC', + SubDirectory => { TagTable => 'Image::ExifTool::HTML::dc' }, + }, + ncc => { + Name => 'NCC', + SubDirectory => { TagTable => 'Image::ExifTool::HTML::ncc' }, + }, + prod => { + Name => 'Prod', + SubDirectory => { TagTable => 'Image::ExifTool::HTML::prod' }, + }, + vw96 => { + Name => 'VW96', + SubDirectory => { TagTable => 'Image::ExifTool::HTML::vw96' }, + }, + 'http-equiv' => { + Name => 'HTTP-equiv', + SubDirectory => { TagTable => 'Image::ExifTool::HTML::equiv' }, + }, + o => { + Name => 'Office', + SubDirectory => { TagTable => 'Image::ExifTool::HTML::Office' }, + }, + abstract => { }, + author => { }, + classification => { }, + 'content-language'=>{ Name => 'ContentLanguage' }, + copyright => { }, + description => { }, + distribution => { }, + 'doc-class' => { Name => 'DocClass' }, + 'doc-rights' => { Name => 'DocRights' }, + 'doc-type' => { Name => 'DocType' }, + formatter => { }, + generator => { }, + generatorversion=> { Name => 'GeneratorVersion' }, + googlebot => { Name => 'GoogleBot' }, + keywords => { List => 1 }, + mssmarttagspreventparsing => { Name => 'NoMSSmartTags' }, + originator => { }, + owner => { }, + progid => { Name => 'ProgID' }, + rating => { }, + refresh => { }, + 'resource-type' => { Name => 'ResourceType' }, + 'revisit-after' => { Name => 'RevisitAfter' }, + robots => { List => 1 }, + title => { Notes => "the only extracted tag which isn't from an HTML META element" }, +); + +# ref 2 +%Image::ExifTool::HTML::dc = ( + GROUPS => { 1 => 'HTML-dc', 2 => 'Document' }, + NOTES => 'Dublin Core schema tags (also used in XMP).', + contributor => { Groups => { 2 => 'Author' }, List => 'Bag' }, + coverage => { }, + creator => { Groups => { 2 => 'Author' }, List => 'Seq' }, + date => { + Groups => { 2 => 'Time' }, + List => 'Seq', + PrintConv => '$self->ConvertDateTime($val)', + }, + description => { }, + 'format' => { }, + identifier => { }, + language => { List => 'Bag' }, + publisher => { Groups => { 2 => 'Author' }, List => 'Bag' }, + relation => { List => 'Bag' }, + rights => { Groups => { 2 => 'Author' } }, + source => { Groups => { 2 => 'Author' } }, + subject => { List => 'Bag' }, + title => { }, + type => { List => 'Bag' }, +); + +# ref 2 +%Image::ExifTool::HTML::ncc = ( + GROUPS => { 1 => 'HTML-ncc', 2 => 'Document' }, + charset => { Name => 'CharacterSet' }, # name changed to avoid conflict with -charset option + depth => { }, + files => { }, + footnotes => { }, + generator => { }, + kbytesize => { Name => 'KByteSize' }, + maxpagenormal => { Name => 'MaxPageNormal' }, + multimediatype => { Name => 'MultimediaType' }, + narrator => { }, + pagefront => { Name => 'PageFront' }, + pagenormal => { Name => 'PageNormal' }, + pagespecial => { Name => 'PageSpecial' }, + prodnotes => { Name => 'ProdNotes' }, + producer => { }, + produceddate => { Name => 'ProducedDate', Groups => { 2 => 'Time' } }, # YYYY-mm-dd + revision => { }, + revisiondate => { Name => 'RevisionDate', Groups => { 2 => 'Time' } }, + setinfo => { Name => 'SetInfo' }, + sidebars => { }, + sourcedate => { Name => 'SourceDate', Groups => { 2 => 'Time' } }, + sourceedition => { Name => 'SourceEdition' }, + sourcepublisher => { Name => 'SourcePublisher' }, + sourcerights => { Name => 'SourceRights' }, + sourcetitle => { Name => 'SourceTitle' }, + tocitems => { Name => 'TOCItems' }, + totaltime => { Name => 'Duration' }, # HH:MM:SS +); + +# ref 3 +%Image::ExifTool::HTML::vw96 = ( + GROUPS => { 1 => 'HTML-vw96', 2 => 'Document' }, + objecttype => { Name => 'ObjectType' }, +); + +# ref 2 +%Image::ExifTool::HTML::prod = ( + GROUPS => { 1 => 'HTML-prod', 2 => 'Document' }, + reclocation => { Name => 'RecLocation' }, + recengineer => { Name => 'RecEngineer' }, +); + +# ref 3/4 +%Image::ExifTool::HTML::equiv = ( + GROUPS => { 1 => 'HTTP-equiv', 2 => 'Document' }, + NOTES => 'These tags have a family 1 group name of "HTTP-equiv".', + 'cache-control' => { Name => 'CacheControl' }, + 'content-disposition' => { Name => 'ContentDisposition' }, + 'content-language' => { Name => 'ContentLanguage' }, + 'content-script-type' => { Name => 'ContentScriptType' }, + 'content-style-type' => { Name => 'ContentStyleType' }, + # note: setting the HTMLCharset like this will miss any tags which come earlier + 'content-type' => { Name => 'ContentType', RawConv => \&SetHTMLCharset }, + 'default-style' => { Name => 'DefaultStyle' }, + expires => { }, + 'ext-cache' => { Name => 'ExtCache' }, + imagetoolbar => { Name => 'ImageToolbar' }, + lotus => { }, + 'page-enter' => { Name => 'PageEnter' }, + 'page-exit' => { Name => 'PageExit' }, + 'pics-label' => { Name => 'PicsLabel' }, + pragma => { }, + refresh => { }, + 'reply-to' => { Name => 'ReplyTo' }, + 'set-cookie' => { Name => 'SetCookie' }, + 'site-enter' => { Name => 'SiteEnter' }, + 'site-exit' => { Name => 'SiteExit' }, + vary => { }, + 'window-target' => { Name => 'WindowTarget' }, +); + +# MS Office namespace (ref PH) +%Image::ExifTool::HTML::Office = ( + GROUPS => { 1 => 'HTML-office', 2 => 'Document' }, + NOTES => 'Tags written by Microsoft Office applications.', + Subject => { }, + Author => { Groups => { 2 => 'Author' } }, + Keywords => { }, + Description => { }, + Template => { }, + LastAuthor => { Groups => { 2 => 'Author' } }, + Revision => { Name => 'RevisionNumber' }, + TotalTime => { Name => 'TotalEditTime', PrintConv => 'ConvertTimeSpan($val, 60)' }, + Created => { + Name => 'CreateDate', + Groups => { 2 => 'Time' }, + ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + }, + LastSaved => { + Name => 'ModifyDate', + Groups => { 2 => 'Time' }, + ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + }, + LastSaved => { + Name => 'ModifyDate', + Groups => { 2 => 'Time' }, + ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + }, + LastPrinted => { + Name => 'LastPrinted', + Groups => { 2 => 'Time' }, + ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + }, + Pages => { }, + Words => { }, + Characters => { }, + Category => { }, + Manager => { }, + Company => { }, + Lines => { }, + Paragraphs => { }, + CharactersWithSpaces => { }, + Version => { Name => 'RevisionNumber' }, +); + +#------------------------------------------------------------------------------ +# Set HTMLCharset member based on content type +# Inputs: 0) content type string, 1) ExifTool ref +# Returns: original string +sub SetHTMLCharset($$) +{ + my ($val, $et) = @_; + $$et{HTMLCharset} = $htmlCharset{lc $1} if $val =~ /charset=['"]?([-\w]+)/; + return $val; +} + +#------------------------------------------------------------------------------ +# Convert single UTF-8 character to HTML character reference +# Inputs: 0) UTF-8 character sequence +# Returns: HTML character reference (eg. "&quot;"); +# Note: Must be called via EscapeHTML to load name lookup +sub EscapeChar($) +{ + my $ch = shift; + my $val; + if ($] < 5.006001) { + ($val) = Image::ExifTool::UnpackUTF8($ch); + } else { + # the meaning of "U0" is reversed as of Perl 5.10.0! + ($val) = unpack($] < 5.010000 ? 'U0U' : 'C0U', $ch); + } + return '?' unless defined $val; + return "&$entityName{$val};" if $entityName{$val}; + return sprintf('&#x%x;',$val); +} + +#------------------------------------------------------------------------------ +# Escape any special characters for HTML +# Inputs: 0) string to be escaped, 1) optional string encoding (default 'UTF8') +# Returns: escaped string +sub EscapeHTML($;$) +{ + my ($str, $enc) = @_; + # escape XML characters + $str = EscapeXML($str); + # escape other special characters if they exist + if ($str =~ /[\x80-\xff]/) { + # generate entity name lookup if necessary + unless (%entityName) { + local $_; + foreach (keys %entityNum) { + $entityName{$entityNum{$_}} = $_; + } + delete $entityName{39}; # 'apos' is not valid HTML + } + # suppress warnings + local $SIG{'__WARN__'} = sub { 1 }; + if ($enc and $enc ne 'UTF8') { + $str = Image::ExifTool::Decode(undef, $str, $enc, undef, 'UTF8'); + $str =~ s/([\xc2-\xf7][\x80-\xbf]+)/EscapeChar($1)/sge; + $str = Image::ExifTool::Decode(undef, $str, 'UTF8', undef, $enc); + } else { + # escape any non-ascii characters for HTML + $str =~ s/([\xc2-\xf7][\x80-\xbf]+)/EscapeChar($1)/sge; + } + } + return $str; +} + +#------------------------------------------------------------------------------ +# Unescape all HTML character references +# Inputs: 0) string to be unescaped, 1) optional string encoding (default 'UTF8') +# Returns: unescaped string +sub UnescapeHTML($;$) +{ + my ($str, $enc) = @_; + return UnescapeXML($str, \%entityNum, $enc); +} + +#------------------------------------------------------------------------------ +# Extract information from a HTML file +# Inputs: 0) ExifTool object reference, 1) DirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid HTML file +sub ProcessHTML($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + + # validate HTML or XHTML file + $raf->Read($buff, 256) or return 0; + $buff =~ /^(\xef\xbb\xbf)?\s*<(!DOCTYPE\s+HTML|HTML|\?xml)/i or return 0; + $buff =~ /<(!DOCTYPE\s+)?HTML/i or return 0 if $2 eq '?xml'; + $et->SetFileType(); + + $raf->Seek(0,0) or $et->Warn('Seek error'), return 1; + + local $/ = Image::ExifTool::PostScript::GetInputRecordSeparator($raf); + $/ or $et->Warn('Invalid HTML data'), return 1; + + # extract header information + my $doc; + while ($raf->ReadLine($buff)) { + if (not defined $doc) { + # look for 'head' element + next unless $buff =~ /<head\b/ig; + $doc = substr($buff, pos($buff)); + next; + } + $doc .= $buff; + last if $buff =~ m{</head>}i; + } + return 1 unless defined $doc; + + # process all elements in header + my $tagTablePtr = GetTagTable('Image::ExifTool::HTML::Main'); + for (;;) { + last unless $doc =~ m{<([\w:.-]+)(.*?)>}sg; + my ($tagName, $attrs) = ($1, $2); + my $tag = lc($tagName); + my ($val, $grp); + if ($attrs =~ m{/$}) { # self-contained XHTML tags end in '/>' + $val = ''; + } else { + # look for element close + my $pos = pos($doc); + my $close = "</$tagName>"; + # the following doesn't work on Solaris Perl 5.6.1 due to Perl bug: + # if ($doc =~ m{(.*?)</$tagName>}sg) { + # $val = $1; + if ($doc =~ m{$close}sg) { + $val = substr($doc, $pos, pos($doc)-$pos-length($close)); + } else { + pos($doc) = $pos; + next unless $tag eq 'meta'; # META tags don't need to be closed + $val = ''; + } + } + my $table = $tagTablePtr; + if ($tag eq 'meta') { + # parse HTML META element + undef $tag; + # tag name is in NAME or HTTP-EQUIV attribute + if ($attrs =~ /\bname\s*=\s*['"]?([\w:.-]+)/si) { + $tagName = $1; + } elsif ($attrs =~ /\bhttp-equiv\s*=\s*['"]?([\w:.-]+)/si) { + $tagName = "HTTP-equiv.$1"; + } else { + next; # no name + } + $tag = lc($tagName) or next; + # tag value is in CONTENT attribute + if ($attrs =~ /\bcontent\s*=\s*(['"])(.*?)\1/si or + $attrs =~ /\bcontent\s*=\s*(['"]?)([\w:.-]+)/si) + { + $val = $2; + } else { + next unless length $val; + } + # isolate group name (separator is '.' in HTML, but ':' in ref 2) + if ($tag =~ /^([\w-]+)[:.]([\w-]+)/) { + ($grp, $tag) = ($1, $2); + my $tagInfo = $et->GetTagInfo($tagTablePtr, $grp); + if ($tagInfo and $$tagInfo{SubDirectory}) { + $table = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + } else { + $tag = "$grp.$tag"; + } + } + } elsif ($tag eq 'xml') { + $et->VPrint(0, "Parsing XML\n"); + # parse XML tags (quick-and-dirty) + my $xml = $val; + while ($xml =~ /<([\w-]+):([\w-]+)(\s.*?)?>([^<]*?)<\/\1:\2>/g) { + ($grp, $tag, $val) = ($1, $2, $4); + my $tagInfo = $et->GetTagInfo($tagTablePtr, $grp); + next unless $tagInfo and $$tagInfo{SubDirectory}; + $table = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + unless ($$table{$tag}) { + my $name = ucfirst $tag; + $name =~ s/_x([0-9a-f]{4})_/chr(hex($1))/gie; # convert hex codes + $name =~ s/\s(.)/\U$1/g; # capitalize all words in tag name + $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters (also hex code wide chars) + AddTagToTable($table, $tag, { Name => $name }); + $et->VPrint(0, " [adding $tag '${name}']\n"); + } + $val = $et->Decode($val, $$et{HTMLCharset}) if $$et{HTMLCharset}; + $et->HandleTag($table, $tag, UnescapeXML($val)); + } + next; + } else { + # the only other element we process is TITLE + next unless $tag eq 'title'; + } + unless ($$table{$tag}) { + my $name = $tagName; + $name =~ s/\W+(\w)/\u$1/sg; + my $info = { Name => $name, Groups => { 0 => 'HTML' } }; + $info->{Groups}->{1} = ($grp eq 'http-equiv' ? 'HTTP-equiv' : "HTML-$grp") if $grp; + AddTagToTable($table, $tag, $info); + $et->VPrint(0, " [adding $tag '${tagName}']\n"); + } + # recode if necessary + $val = $et->Decode($val, $$et{HTMLCharset}) if $$et{HTMLCharset}; + $val =~ s{\s*$/\s*}{ }sg; # replace linefeeds and indenting spaces + $val = UnescapeHTML($val); # unescape HTML character references + $et->HandleTag($table, $tag, $val); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::HTML - Read HTML meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to extract +meta information from HTML documents. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.w3.org/TR/html4/> + +=item L<http://www.daisy.org/publications/specifications/daisy_202.html> + +=item L<http://vancouver-webpages.com/META/metatags.detail.html> + +=item L<http://www.html-reference.com/META.htm> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/HTML Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/HtmlDump.pm b/lib/Image/ExifTool/HtmlDump.pm new file mode 100644 index 0000000..aee312b --- /dev/null +++ b/lib/Image/ExifTool/HtmlDump.pm @@ -0,0 +1,930 @@ +#------------------------------------------------------------------------------ +# File: HtmlDump.pm +# +# Description: Dump information in hex to HTML page +# +# Revisions: 12/05/2005 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::HtmlDump; + +use strict; +use vars qw($VERSION); +use Image::ExifTool; # only for FinishTiffDump() +use Image::ExifTool::HTML qw(EscapeHTML); + +$VERSION = '1.39'; + +sub DumpTable($$$;$$$$$$); +sub Open($$$;@); +sub Write($@); + +my ($bkgStart, $bkgEnd, @bkgSpan); + +my $htmlHeader1 = <<_END_PART_1_; +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" + "http://www.w3.org/TR/1998/REC-html40-19980424/loose.dtd"> +<html> +<head> +<title> +_END_PART_1_ + +# Note: Don't change font-weight style because it can affect line height +my $htmlHeader2 = <<_END_PART_2_; +</title> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> +<style type="text/css"> +<!-- +/* character style ID's */ +.D { color: #000000 } /* default color */ +.V { color: #ff0000 } /* duplicate block 1 */ +.W { color: #004400 } /* normal block 1 */ +.X { color: #ff4488 } /* duplicate block 2 */ +.Y { color: #448844 } /* normal block 2 */ +.U { color: #cc8844 } /* unused data block */ +.H { color: #0000ff } /* highlighted tag name */ +.F { color: #aa00dd } /* actual offset differs */ +.M { text-decoration: underline } /* maker notes data */ +.tt { /* tooltip text */ + visibility: hidden; + position: absolute; + white-space: nowrap; + top: 0; + left: 0; + font-family: Verdana, sans-serif; + font-size: .7em; + padding: 2px 4px; + border: 1px solid gray; + z-index: 3; +} +.tb { /* tooltip background */ + visibility: hidden; + position: absolute; + background: #ffffdd; + zoom: 1; + -moz-opacity: 0.8; + -khtml-opacity: 0.8; + -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)'; + filter: alpha(opacity=80); + opacity: 0.8; + z-index: 2; +} +/* table styles */ +table.dump { + border-top: 1px solid gray; + border-bottom: 1px solid gray; +} +table.dump td { padding: .2em .3em } +td.c2 { + border-left: 1px solid gray; + border-right: 1px solid gray; +} +pre { margin: 0 } +table { font-size: .9em } +body { color: black; background: white } +--> +</style> +<script language="JavaScript" type="text/JavaScript"> +<!-- Begin +// tooltip positioning constants +var TMAR = 4; // top/left margins +var BMAR = 16; // bottom/right margins (scrollbars may overhang inner dimensions) +var XOFF = 10; // x offset from cursor +var YOFF = 40; // y offset +var YMIN = 10; // minimum y offset +var YTOP = 20; // y offset when above cursor +// common variables +var safari1 = navigator.userAgent.indexOf("Safari/312.6") >= 0; +var ie6 = navigator.userAgent.toLowerCase().indexOf('msie 6') >= 0; +var mspan = new Array; +var clicked = 0; +var hlist, tt, tb, firstOutEvt, lastInEvt; + +function GetElementsByClass(classname, tagname) { + var found = new Array(); + var list = document.getElementsByTagName(tagname); + var len = list.length; + for (var i=0, j=0; i<len; ++i) { + var classes = list[i].className.split(' '); + for (var k=0; k<classes.length; ++k) { + if (classes[k] == classname) { + found[j++] = list[i]; + break; + } + } + } + return found; +} + +// click mouse +function doClick(e) +{ + if (!clicked) { + firstOutEvt = lastInEvt = undefined; + high(e, 2); + if (hlist) clicked = 1; + } else { + clicked = 0; + if (firstOutEvt) high(firstOutEvt, 0); + if (lastInEvt) high(lastInEvt, 1); + } +} + +// move tooltip +function move(e) +{ + if (!tt) return; + if (ie6 && (tt.style.top == '' || tt.style.top == 0) && + (tt.style.left == '' || tt.style.left == 0)) + { + tt.style.width = tt.offsetWidth + 'px'; + tt.style.height = tt.offsetHeight + 'px'; + } + var w, h; + // browser inconsistencies make getting window size more complex than it should be, + // and even then we don't know if it is smaller due to scrollbar width + if (typeof(window.innerWidth) == 'number') { + w = window.innerWidth; + h = window.innerHeight; + } else if (document.documentElement && document.documentElement.clientWidth) { + w = document.documentElement.clientWidth; + h = document.documentElement.clientHeight; + } else { + w = document.body.clientWidth; + h = document.body.clientHeight; + } + var x = e.clientX + XOFF; + var y = e.clientY + YOFF; + if (safari1) { // patch for people still using OS X 10.3.9 + x -= document.body.scrollLeft + document.documentElement.scrollLeft; + y -= document.body.scrollTop + document.documentElement.scrollTop; + } + var mx = w - BMAR - tt.offsetWidth; + var my = h - BMAR - tt.offsetHeight; + if (y > my + YOFF - YMIN) y = e.clientY - YTOP - tt.offsetHeight; + if (x > mx) x = mx; + if (y > my) y = my; + if (x < TMAR) x = TMAR; + if (y < TMAR) y = TMAR; + x += document.body.scrollLeft + document.documentElement.scrollLeft; + y += document.body.scrollTop + document.documentElement.scrollTop; + tb.style.width = tt.offsetWidth + 'px'; + tb.style.height = tt.offsetHeight + 'px'; + tt.style.top = tb.style.top = y + 'px'; + tt.style.left = tb.style.left = x + 'px'; + tt.style.visibility = tb.style.visibility = 'visible'; +} + +// highlight/unhighlight text +function high(e,on) { + if (on) { + lastInEvt = e; + } else { + if (!firstOutEvt) firstOutEvt = e; + } + if (clicked) return; + var targ; + if (e.target) targ = e.target; + else if (e.srcElement) targ = e.srcElement; + if (targ.nodeType == 3) targ = targ.parentNode; // defeat Safari bug + if (!targ.name) targ = targ.parentNode; // go up another level if necessary + if (targ.name && document.getElementsByName) { + // un-highlight current objects + if (hlist) { + for (var i=0; i<hlist.length; ++i) { + for (var j=0; j<hlist[i].length; ++j) { + hlist[i][j].style.background = 'transparent'; + } + } + hlist = null; + } + if (tt) { + // hide old tooltip + tt.style.visibility = tb.style.visibility = 'hidden'; + tt = null; + } + if (on) { + if (targ.name.substring(0,1) == 't') { + // show our tooltip (ID is different than name to avoid confusing IE) + tt = document.getElementById('p' + targ.name.substring(1)); + if (tt) { + tb = document.getElementById('tb'); + move(e); + } + } + // highlight anchor elements with the same name + hlist = new Array; + hlist.push(document.getElementsByName(targ.name)); + // is this an IFD pointer? + var pos = targ.className.indexOf('Offset_'); + if (pos > 0) { + // add elements from this IFD to our highlight list + hlist.push(document.getElementsByClassName(targ.className.substr(pos+7))); + } + // use class name to highlight span elements if necessary + for (var i=0; i<mspan.length; ++i) { + if (mspan[i] != targ.name) continue; + // add these span elements to our highlight list + hlist.push(GetElementsByClass(targ.name, 'span')); + break; + } + for (var i=0; i<hlist.length; ++i) { + for (var j=0; j<hlist[i].length; ++j) { + hlist[i][j].style.background = on == 2 ? '#ffbbbb' : '#ffcc99'; + } + } + } + } +} +_END_PART_2_ + +my $htmlHeader3 = q[ +// End ---> +</script></head> +<body><noscript><b class=V>--&gt; +Enable JavaScript for active highlighting and information tool tips! +</b></noscript> +<table class=dump cellspacing=0 cellpadding=2> +<tr><td valign='top'><pre>]; + +my $preMouse = q(<pre onmouseover="high(event,1)" onmouseout="high(event,0)" onmousemove="move(event)" onmousedown="doClick(event)">); + +#------------------------------------------------------------------------------ +# New - create new HtmlDump object +# Inputs: 0) reference to HtmlDump object or HtmlDump class name +sub new +{ + local $_; + my $that = shift; + my $class = ref($that) || $that || 'Image::ExifTool::HtmlDump'; + return bless { Block => {}, TipNum => 0 }, $class; +} + +#------------------------------------------------------------------------------ +# Add information to dump +# Inputs: 0) HTML dump hash ref, 1) absolute offset in file, 2) data size, +# 3) comment string, 4) tool tip (or SAME to use previous tip), +# 5) bit flags (see below), 6) IFD name +# Bits: 0x01 - print at start of line +# 0x02 - print red address +# 0x04 - maker notes data ('M'-class span) +# 0x08 - limit block length +# 0x10 - allow double references +# 0x100 - (reserved) +# Notes: Block will be shown in 'unused' color if comment string begins with '[' +sub Add($$$$;$$) +{ + my ($self, $start, $size, $msg, $tip, $flag, $ifd) = @_; + my $block = $$self{Block}; + $$block{$start} or $$block{$start} = [ ]; + my $htip; + if ($tip and $tip eq 'SAME') { + $htip = ''; + } else { + # use message as first line of tip, and make bold unless in brackets + $htip = ($msg =~ /^[[(]/) ? $msg : "<b>$msg</b>"; + if (defined $tip) { + ($tip = EscapeHTML($tip)) =~ s/\n/<br>/g; # HTML-ize tooltip text + $htip .= '<br>' . $tip; + } + # add size if not already done + $htip .= "<br>($size bytes)" unless $htip =~ /<br>Size:/; + ++$self->{TipNum}; + } + push @{$$block{$start}}, [ $size, $msg, $htip, $flag, $self->{TipNum}, $ifd ]; +} + +#------------------------------------------------------------------------------ +# Print dump information to HTML page +# Inputs: 0) Dump information hash reference, 1) source file RAF reference, +# 2) data pointer, 3) data position, 4) output file or scalar reference, +# 5) limit level (1-3), 6) title +# Returns: non-zero if useful output was generated, +# or -1 on error loading data and "ERROR" is set to offending data name +# Note: The "Error" member may be set externally to print a specific error +# message instead of doing the dump. +sub Print($$;$$$$$) +{ + local $_; + my ($self, $raf, $dataPt, $dataPos, $outfile, $level, $title) = @_; + my ($i, $buff, $rtnVal, $limit, $err); + my $block = $$self{Block}; + $dataPos = 0 unless $dataPos; + $outfile = \*STDOUT unless ref $outfile; + $title = 'HtmlDump' unless $title; + $level or $level = 0; + my $tell = $raf->Tell(); + my $pos = 0; + my $dataEnd = $dataPos + ($dataPt ? length($$dataPt) : 0); + # initialize member variables + $$self{Open} = []; + $$self{Closed} = []; + $$self{TipList} = []; + $$self{MSpanList} = []; + $$self{Cols} = [ '', '', '', '' ]; # text columns + # set dump size limits (limits are 4x smaller if bit 0x08 set in flags) + if ($level <= 1) { + $limit = 1024; + } elsif ($level <= 2) { + $limit = 16384; + } else { + $limit = 256 * 1024 * 1024; # never dump bigger than 256 MB + } + $$self{Limit} = $limit; + # pre-initialize open/closed hashes for all columns + for ($i=0; $i<4; ++$i) { + $self->{Open}->[$i] = { ID => [ ], Element => { } }; + $self->{Closed}->[$i] = { ID => [ ], Element => { } }; + } + $bkgStart = $bkgEnd = 0; + undef @bkgSpan; + my $index = 0; # initialize tooltip index + my (@names, $wasUnused, @starts); + # only do dump if we didn't have a serious error + @starts = sort { $a <=> $b } keys %$block unless $$self{Error}; + for ($i=0; $i<=@starts; ++$i) { + my $start = $starts[$i]; + my $parmList; + if (defined $start) { + $parmList = $$block{$start}; + } elsif ($bkgEnd and $pos < $bkgEnd and not defined $wasUnused) { + $start = $bkgEnd; # finish last bkg block + } else { + last; + } + my $len = $start - $pos; + if ($len > 0 and not $wasUnused) { + # we have a unused bytes before this data block + --$i; # dump the data block next time around + # split unused data into 2 blocks if it spans end of a bkg block + my ($nextBkgEnd, $bkg); + if (not defined $wasUnused and $bkgEnd) { + foreach $bkg (@bkgSpan) { + next if $pos >= $$bkg{End} + $dataPos or $pos + $len <= $$bkg{End} + $dataPos; + $nextBkgEnd = $$bkg{End} unless $nextBkgEnd and $nextBkgEnd < $$bkg{End}; + } + } + if ($nextBkgEnd) { + $start = $pos; + $len = $nextBkgEnd + $dataPos - $pos; + $wasUnused = 0; + } else { + $start = $pos; # dump the unused bytes now + $wasUnused = 1; # avoid re-dumping unused bytes if we get a read error + } + my $str = ($len > 1) ? "unused $len bytes" : 'pad byte'; + $parmList = [ [ $len, "[$str]", undef, 0x108 ] ]; + } else { + undef $wasUnused; + } + my $parms; + foreach $parms (@$parmList) { + my ($len, $msg, $tip, $flag, $tipNum, $ifd) = @$parms; + next unless $len > 0; + $flag = 0 unless defined $flag; + # generate same name for all blocks indexed by this tooltip + my $name; + $name = $names[$tipNum] if defined $tipNum; + my $idx = $index; + if ($name) { + # get index from existing ID + $idx = substr($name, 1); + } else { + $name = "t$index"; + $names[$tipNum] = $name if defined $tipNum; + ++$index; + } + if ($flag & 0x14) { + my $class = $flag & 0x04 ? "$name M" : $name; + $class .= " $ifd" if $ifd; + my %bkg = ( + Class => $class, + Start => $start - $dataPos, + End => $start - $dataPos + $len, + ); + push @bkgSpan, \%bkg; + $bkgStart = $bkg{Start} unless $bkgStart and $bkgStart < $bkg{Start}; + $bkgEnd = $bkg{End} unless $bkgEnd and $bkgEnd > $bkg{End}; + push @{$self->{MSpanList}}, $name; + next; + } + # loop until we read the value properly + my ($end, $try); + for ($try=0; $try<2; ++$try) { + $end = $start + $len; + # only load as much of the block as we are going to dump + # (read 32 more bytes than necessary just in case there + # is only one skipped line that we decide to print) + my $size = ($len > $limit + 32) ? $limit / 2 + 16 : $len; + if ($start >= $dataPos and $end <= $dataEnd) { + $buff = substr($$dataPt, $start-$dataPos, $size); + if ($len != $size) { + $buff .= substr($$dataPt, $start-$dataPos+$len-$size, $size); + } + } else { + $buff = ''; + if ($raf->Seek($start, 0) and $raf->Read($buff, $size) == $size) { + # read end of block + if ($len != $size) { + my $buf2 = ''; + unless ($raf->Seek($start+$len-$size, 0) and + $raf->Read($buf2, $size) == $size) + { + $err = $msg; + # reset $len to the actual length of available data + $raf->Seek(0, 2); + $len = $raf->Tell() - $start; + $tip .= "<br>Error: Only $len bytes available!" if $tip; + next; + } + $buff .= $buf2; + undef $buf2; + } + } else { + $err = $msg; + $len = length $buff; + $tip .= "<br>Error: Only $len bytes available!" if $tip; + } + } + last; + } + $tip and $self->{TipList}->[$idx] = $tip; + next unless length $buff; + # set flag to continue this line if next block is contiguous + if ($i+1 < @starts and $parms eq $$parmList[-1] and + ($end == $starts[$i+1] or ($end < $starts[$i+1] and $end >= $pos))) + { + my $nextFlag = $block->{$starts[$i+1]}->[0]->[3] || 0; + $flag |= 0x100 unless $flag & 0x01 or $nextFlag & 0x01; + } + $self->DumpTable($start-$dataPos, \$buff, $msg, $name, + $flag, $len, $pos-$dataPos, $ifd); + undef $buff; + $pos = $end if $pos < $end; + } + } + $self->Open('',''); # close all open elements + $raf->Seek($tell,0); + + # write output HTML file + Write($outfile, $htmlHeader1, $title); + if ($self->{Cols}->[0]) { + Write($outfile, $htmlHeader2); + my $mspan = \@{$$self{MSpanList}}; + for ($i=0; $i<@$mspan; ++$i) { + Write($outfile, qq(mspan[$i] = "$$mspan[$i]";\n)); + } + Write($outfile, $htmlHeader3, $self->{Cols}->[0]); + Write($outfile, '</pre></td><td valign="top">', + $preMouse, $self->{Cols}->[1]); + Write($outfile, '</pre></td><td class=c2 valign="top">', + $preMouse, $self->{Cols}->[2]); + Write($outfile, '</pre></td><td valign="top">', + $preMouse, $self->{Cols}->[3]); + Write($outfile, "</pre></td></tr></table>\n<div id=tb class=tb> </div>\n"); + my $tips = \@{$$self{TipList}}; + for ($i=0; $i<@$tips; ++$i) { + my $tip = $$tips[$i]; + Write($outfile, "<div id=p$i class=tt>$tip</div>\n") if defined $tip; + } + delete $$self{TipList}; + $rtnVal = 1; + } else { + my $err = $$self{Error} || 'No EXIF or TIFF information found in image'; + Write($outfile, "$title</title></head><body>\n$err\n"); + $rtnVal = 0; + } + Write($outfile, "</body></html>\n"); + for ($i=0; $i<4; ++$i) { + $self->{Cols}->[$i] = ''; # free memory + } + if ($err) { + $err =~ tr/()//d; + $$self{ERROR} = $err; + return -1; + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Open or close a specified html element +# Inputs: 0) HtmlDump object ref, 1) element id, 2) element string, +# 3-N) list of column numbers (empty for all columns) +# - element id may be '' to close all elements +# - element string may be '' to close element by ID (or 0 to close without reopening) +# - element id and string may both be 1 to reopen temporarily closed elements +sub Open($$$;@) +{ + my ($self, $id, $element, @colNums) = @_; + + # loop through specified columns + @colNums or @colNums = (0 .. $#{$self->{Open}}); + my $col; + foreach $col (@colNums) { + # get information about open elements in this column + my $opHash = $self->{Open}->[$col]; + my $opElem = $$opHash{Element}; + if ($element) { + # next if already open + next if $$opElem{$id} and $$opElem{$id} eq $element; + } elsif ($id and not $$opElem{$id}) { + # next if already closed and nothing to reopen + next unless $element eq '' and @{$self->{Closed}->[$col]->{ID}}; + } + my $opID = $$opHash{ID}; + my $clHash = $self->{Closed}->[$col]; + my $clID = $$clHash{ID}; + my $clElem = $$clHash{Element}; + # get reference to output column list (use temp list if available) + my $cols = $$self{TmpCols} || $$self{Cols}; + # close everything down to this element if necessary + if ($$opElem{$id} or not $id) { + while (@$opID) { + my $tid = pop @$opID; + my $e = $$opElem{$tid}; + $e =~ s/^<(\S+).*/<\/$1>/s; + $$cols[$col] .= $e; + if ($id eq $tid or not $id) { + delete $$opElem{$tid}; + last if $id; + next; + } + # add this to the temporarily closed list + # (because we really didn't want to close it) + push @$clID, $tid; + $$clElem{$tid} = $$opElem{$tid}; + delete $$opElem{$tid}; + } + unless ($id) { + # forget all temporarily closed elements + $clID = $$clHash{ID} = [ ]; + $clElem = $$clHash{Element} = { }; + } + } elsif ($$clElem{$id}) { + # delete from the list of temporarily closed elements + delete $$clElem{$id}; + @$clID = grep !/^$id$/, @$clID; + } + next if $element eq '0'; # 0 = don't reopen temporarily closed elements + + # re-open temporarily closed elements + while (@$clID) { + my $tid = pop @$clID; + $$cols[$col] .= $$clElem{$tid}; + push @$opID, $tid; + $$opElem{$tid} = $$clElem{$tid}; + delete $$clElem{$tid}; + } + # open specified element + if ($element and $element ne '1') { + $$cols[$col] .= $element; + push @$opID, $id; + $$opElem{$id} = $element; + } + } +} + +#------------------------------------------------------------------------------ +# Dump a block of data in HTML table form +# Inputs: 0) HtmlDump object ref, 1) data position, 2) block pointer, +# 3) message, 4) object name, 5) flag, 6) full block length (actual +# data may be shorter), 7) data end position, 8) IFD name +sub DumpTable($$$;$$$$$$) +{ + my ($self, $pos, $blockPt, $msg, $name, $flag, $len, $endPos, $ifd) = @_; + $len = length $$blockPt unless defined $len; + $endPos = 0 unless $endPos; + my ($f0, $dblRef, $id); + my $skipped = 0; + if (($endPos and $pos < $endPos) or $flag & 0x02) { + # display double-reference addresses in red + $f0 = "<span class=V>"; + $dblRef = 1 if $endPos and $pos < $endPos; + } else { + $f0 = ''; + } + my @c = ('','','',''); + $$self{TmpCols} = \@c; + if ($name) { + if ($msg and $msg =~ /^\[/) { + $id = 'U'; + } else { + if ($$self{A}) { + $id = 'X'; + $$self{A} = 0; + } else { + $id = 'V'; + $$self{A} = 1; + } + ++$id unless $dblRef; + } + my $class = $ifd ? "'$id $ifd'" : $id; + $name = "<a name=$name class=$class>"; + $msg and $msg = "$name$msg</a>"; + } else { + $name = ''; + } + # use base-relative offsets from now on + my $cols = 0; + my $p = $pos; + if ($$self{Cont}) { + $cols = $pos & 0x0f; + $c[1] .= ($cols == 8) ? ' ' : ' '; + } else { + my $addr = $pos < 0 ? sprintf("-%.4x",-$pos) : sprintf("%5.4x",$pos); + $self->Open('fgd', $f0, 0); + $self->Open('fgd', '', 3); + $c[0] .= "$addr"; + $p -= $pos & 0x0f unless $flag & 0x01; + if ($p < $pos) { + $self->Open('bkg', '', 1, 2); # don't underline white space + $cols = $pos - $p; + my $n = 3 * $cols; + ++$n if $cols > 7; + $c[1] .= ' ' x $n; + $c[2] .= ' ' x $cols; + $p = $pos; + } + } + # loop through each column of hex numbers + for (;;) { + my (@spanClass, @spanCont, $spanClose, $bkg); + if ($p >= $bkgStart and $p < $bkgEnd) { + foreach $bkg (@bkgSpan) { + next unless $p >= $$bkg{Start} and $p < $$bkg{End}; + push @spanClass, $$bkg{Class}; + if ($p + 1 == $$bkg{End}) { + $spanClose = 1; + } else { + push @spanCont, $$bkg{Class}; # this span continues + } + } + $self->Open('bkg', @spanClass ? "<span class='@spanClass'>" : '', 1, 2); + } else { + $self->Open('bkg', '', 1, 2); + } + $self->Open('a', $name, 1, 2); + my $ch = substr($$blockPt,$p-$pos-$skipped,1); + $c[1] .= sprintf("%.2x", ord($ch)); + # make the character HTML-friendly + $ch =~ tr/\x00-\x1f\x7f-\xff/./; + $ch =~ s/&/&amp;/g; + $ch =~ s/>/&gt;/g; + $ch =~ s/</&lt;/g; + $c[2] .= $ch; + ++$p; + ++$cols; + # close necessary elements + if ($spanClose) { + my $spanCont = @spanCont ? "<span class='@spanCont'>" : ''; + # close without reopening if closing anchor later + my $arg = ($p - $pos >= $len) ? 0 : $spanCont; + $self->Open('bkg', $arg, 1, 2); + } + if ($dblRef and $p >= $endPos) { + $dblRef = 0; + ++$id; + my $class = $ifd ? "'$id $ifd'" : $id; + $name =~ s/class=\w\b/class=$class/; + $f0 = ''; + $self->Open('fgd', $f0, 0); + } + if ($p - $pos >= $len) { + $self->Open('a', '', 1, 2); # close our anchor + last; + } + if ($cols < 16) { + $c[1] .= ($cols == 8 ? ' ' : ' '); + next; + } elsif ($flag & 0x01 and $cols < $len) { + $c[1] .= ' '; + next; # put it all on one line + } + unless ($$self{Msg}) { + $c[3] .= $msg; + $msg = ''; + } + $_ .= "\n" foreach @c; # add CR to all lines + $$self{Msg} = 0; + # limit data length if specified + if ($$self{Limit}) { + my $div = ($flag & 0x08) ? 4 : 1; + my $lim = $$self{Limit} / (2 * $div) - 16; + if ($p - $pos > $lim and $len - $p + $pos > $lim) { + my $n = ($len - $p + $pos - $lim) & ~0x0f; + if ($n > 16) { # (no use just cutting out one line) + $self->Open('bkg', '', 1, 2); # no underline + my $note = sprintf "[snip %d lines]", $n / 16; + $note = (' ' x (24-length($note)/2)) . $note; + $c[0] .= " ...\n"; + $c[1] .= $note . (' ' x (48-length($note))) . "\n"; + $c[2] .= " [snip] \n"; + $c[3] .= "\n"; + $p += $n; + $skipped += $len - length $$blockPt; + } + } + } + $c[0] .= ($p < 0 ? sprintf("-%.4x",-$p) : sprintf("%5.4x",$p)); + $cols = 0; + } + if ($msg) { + $msg = " $msg" if $$self{Msg}; + $c[3] .= $msg; + } + if ($flag & 0x100 and $cols < 16) { # continue on same line? + $$self{Cont} = 1; + $$self{Msg} = 1 if $msg; + } else { + $_ .= "\n" foreach @c; + $$self{Msg} = 0; + $$self{Cont} = 0; + } + # add temporary column data to our real columns + my $i; + for ($i=0; $i<4; ++$i) { + $self->{Cols}->[$i] .= $c[$i]; + } + delete $$self{TmpCols}; +} + +#------------------------------------------------------------------------------ +# Finish dumping of TIFF image data +# Inputs: 0) HtmlDump object ref, 1) ExifTool object ref, 2) length of file +# (this really belongs in Image::ExifTool::Exif, but is placed here so it +# is only compiled when needed) +sub FinishTiffDump($$$) +{ + my ($self, $et, $size) = @_; + my ($tag, $key, $start, $blockInfo, $i); + + # list of all indirectly referenced TIFF data tags + my %offsetPair = ( + StripOffsets => 'StripByteCounts', + TileOffsets => 'TileByteCounts', + FreeOffsets => 'FreeByteCounts', + ThumbnailOffset => 'ThumbnailLength', + PreviewImageStart => 'PreviewImageLength', + JpgFromRawStart => 'JpgFromRawLength', + OtherImageStart => 'OtherImageLength', + ImageOffset => 'ImageByteCount', + AlphaOffset => 'AlphaByteCount', + MPImageStart => 'MPImageLength', + IDCPreviewStart => 'IDCPreviewLength', + SamsungRawPointersOffset => 'SamsungRawPointersLength', + ); + + # add TIFF data to html dump + foreach $tag (keys %offsetPair) { + my $info = $et->GetInfo($tag); + next unless %$info; + # Panasonic hack: StripOffsets is not valid for Panasonic RW2 files, + # and StripRowBytes is not valid for some RAW images + if ($tag eq 'StripOffsets' and $$et{TAG_INFO}{$tag}{PanasonicHack}) { + # use RawDataOffset instead if available since it is valid in RW2 + my $info2 = $et->GetInfo('RawDataOffset'); + $info2 = $info unless %$info2; + my @keys = keys %$info2; + my $offset = $$info2{$keys[0]}; + my $raf = $$et{RAF}; + # ignore StripByteCounts and assume raw data runs to the end of file + if (@keys == 1 and $offset =~ /^\d+$/ and $raf) { + my $pos = $raf->Tell(); + $raf->Seek(0, 2); # seek to end + my $len = $raf->Tell() - $offset; + $raf->Seek($pos, 0); + if ($len > 0) { + $self->Add($offset, $len, "(Panasonic raw data)", "Size: $len bytes", 0x08); + next; + } + } + } + # loop through all offsets tags + foreach $key (keys %$info) { + my $name = Image::ExifTool::GetTagName($key); + my $grp1 = $et->GetGroup($key, 1); + my $info2 = $et->GetInfo($offsetPair{$tag}, { Group1 => $grp1 }); + my $key2 = $offsetPair{$tag}; + $key2 .= $1 if $key =~ /( .*)/; # use same instance number as $tag + next unless $$info2{$key2}; + my $offsets = $$info{$key}; + my $byteCounts = $$info2{$key2}; + # ignore primary MPImage (this is the whole JPEG) + next if $tag eq 'MPImageStart' and $offsets eq '0'; + # (long lists may be SCALAR references) + my @offsets = split ' ', (ref $offsets ? $$offsets : $offsets); + my @byteCounts = split ' ', (ref $byteCounts ? $$byteCounts : $byteCounts); + my $num = scalar @offsets; + my $li = 0; + my $padBytes = 0; + for ($i=0; @offsets and @byteCounts; ++$i) { + my $offset = shift @offsets; + my $byteCount = shift @byteCounts; + my $end = $offset + $byteCount; + if (@offsets and @byteCounts) { + # show data as contiguous if only normal pad bytes between blocks + if ($end & 0x01 and $end + 1 == $offsets[0]) { + $end += 1; + ++$padBytes; # count them + } + if ($end == $offsets[0]) { + # combine these two blocks + $byteCounts[0] += $offsets[0] - $offset; + $offsets[0] = $offset; + next; + } + } + my $msg = $et->GetGroup($key, 1) . ':' . $tag; + $msg =~ s/(Offsets?|Start)$/ /; + if ($num > 1) { + $msg .= "$li-" if $li != $i; + $msg .= "$i "; + $li = $i + 1; + } + $msg .= "data"; + my $tip = "Size: $byteCount bytes"; + $tip .= ", incl. $padBytes pad bytes" if $padBytes; + $self->Add($offset, $byteCount, "($msg)", $tip, 0x08); + } + } + } + # find offset of last dumped information, and dump any unknown trailer + my $last = 0; + my $block = $$self{Block}; + foreach $start (keys %$block) { + foreach $blockInfo (@{$$block{$start}}) { + my $end = $start + $$blockInfo[0]; + $last = $end if $last < $end; + } + } + my $diff = $size - $last; + if ($diff > 0 and ($last or $et->Options('Unknown'))) { + if ($diff > 1 or $size & 0x01) { + $self->Add($last, $diff, "[unknown data]", "Size: $diff bytes", 0x08); + } else { + $self->Add($last, $diff, "[trailing pad byte]", undef, 0x08); + } + } +} + +#------------------------------------------------------------------------------ +# utility routine to write to file or memory +# Inputs: 0) file or scalar reference, 1-N) list of stuff to write +# Returns: true on success +sub Write($@) +{ + my $outfile = shift; + if (UNIVERSAL::isa($outfile,'GLOB')) { + return print $outfile @_; + } elsif (ref $outfile eq 'SCALAR') { + $$outfile .= join('', @_); + return 1; + } + return 0; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::HtmlDump - Dump information in hex to HTML page + +=head1 SYNOPSIS + + use Image::ExifTool::HtmlDump; + my $dump = new Image::ExifTool::HtmlDump; + $dump->Add($start, $size, $comment); + $dump->Print($dumpInfo, $raf, $dataPt, $dataPos, $outfile); + +=head1 DESCRIPTION + +This module contains code used to generate an HTML-based hex dump of +information for debugging purposes. This is code is called when the +ExifTool 'HtmlDump' option is used. + +Currently, only EXIF/TIFF and JPEG information is dumped. + +=head1 BUGS + +Due to a memory allocation bug in ActivePerl 5.8.x for Windows, this code +may run extremely slowly when processing large files with this version of +Perl. + +An HTML 4 compliant browser is needed to properly display the generated HTML +page. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/ICC_Profile.pm b/lib/Image/ExifTool/ICC_Profile.pm new file mode 100644 index 0000000..eb821c8 --- /dev/null +++ b/lib/Image/ExifTool/ICC_Profile.pm @@ -0,0 +1,1381 @@ +#------------------------------------------------------------------------------ +# File: ICC_Profile.pm +# +# Description: Read ICC Profile meta information +# +# Revisions: 11/16/2004 - P. Harvey Created +# +# References: 1) http://www.color.org/icc_specs2.html (ICC.1:2003-09) +# 2) http://www.color.org/icc_specs2.html (ICC.1:2001-04) +# 3) http://developer.apple.com/documentation/GraphicsImaging/Reference/ColorSync_Manager/ColorSync_Manager.pdf +# 4) http://www.color.org/privatetag2007-01.pdf +# 5) http://www.color.org/icc_specs2.xalter (approved revisions, 2010-07-16) +# 6) Eef Vreeland private communication +# 7) https://color.org/specification/ICC.2-2019.pdf +# +# Notes: The ICC profile information is different: the format of each +# tag is embedded in the information instead of in the directory +# structure. This makes things a bit more complex because I need +# an extra level of logic to decode the variable-format tags. +#------------------------------------------------------------------------------ + +package Image::ExifTool::ICC_Profile; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.39'; + +sub ProcessICC($$); +sub ProcessICC_Profile($$$); +sub WriteICC_Profile($$;$); +sub ProcessMetadata($$$); +sub ValidateICC($); + +# illuminant type definitions +my %illuminantType = ( + 1 => 'D50', + 2 => 'D65', + 3 => 'D93', + 4 => 'F2', + 5 => 'D55', + 6 => 'A', + 7 => 'Equi-Power (E)', + 8 => 'F8', +); +my %profileClass = ( + scnr => 'Input Device Profile', + mntr => 'Display Device Profile', + prtr => 'Output Device Profile', + 'link'=> 'DeviceLink Profile', + spac => 'ColorSpace Conversion Profile', + abst => 'Abstract Profile', + nmcl => 'NamedColor Profile', + nkpf => 'Nikon Input Device Profile (NON-STANDARD!)', # (written by Nikon utilities) + # additions in v5 (ref 7) + cenc => 'ColorEncodingSpace Profile', + 'mid '=> 'MultiplexIdentification Profile', + mlnk => 'MultiplexLink Profile', + mvis => 'MultiplexVisualization Profile', +); +my %manuSig = ( #6 + 'NONE' => 'none', + 'none' => 'none', #PH + '' => '', #PH + '4d2p' => 'Erdt Systems GmbH & Co KG', + 'AAMA' => 'Aamazing Technologies, Inc.', + 'ACER' => 'Acer Peripherals', + 'ACLT' => 'Acolyte Color Research', + 'ACTI' => 'Actix Systems, Inc.', + 'ADAR' => 'Adara Technology, Inc.', + 'ADBE' => 'Adobe Systems Inc.', + 'ADI ' => 'ADI Systems, Inc.', + 'AGFA' => 'Agfa Graphics N.V.', + 'ALMD' => 'Alps Electric USA, Inc.', + 'ALPS' => 'Alps Electric USA, Inc.', + 'ALWN' => 'Alwan Color Expertise', + 'AMTI' => 'Amiable Technologies, Inc.', + 'AOC ' => 'AOC International (U.S.A), Ltd.', + 'APAG' => 'Apago', + 'APPL' => 'Apple Computer Inc.', + 'appl' => 'Apple Computer Inc.', + 'AST ' => 'AST', + 'AT&T' => 'AT&T Computer Systems', + 'BAEL' => 'BARBIERI electronic', + 'berg' => 'bergdesign incorporated', + 'bICC' => 'basICColor GmbH', + 'BRCO' => 'Barco NV', + 'BRKP' => 'Breakpoint Pty Limited', + 'BROT' => 'Brother Industries, LTD', + 'BULL' => 'Bull', + 'BUS ' => 'Bus Computer Systems', + 'C-IT' => 'C-Itoh', + 'CAMR' => 'Intel Corporation', + 'CANO' => 'Canon, Inc. (Canon Development Americas, Inc.)', + 'CARR' => 'Carroll Touch', + 'CASI' => 'Casio Computer Co., Ltd.', + 'CBUS' => 'Colorbus PL', + 'CEL ' => 'Crossfield', + 'CELx' => 'Crossfield', + 'ceyd' => 'Integrated Color Solutions, Inc.', + 'CGS ' => 'CGS Publishing Technologies International GmbH', + 'CHM ' => 'Rochester Robotics', + 'CIGL' => 'Colour Imaging Group, London', + 'CITI' => 'Citizen', + 'CL00' => 'Candela, Ltd.', + 'CLIQ' => 'Color IQ', + 'clsp' => 'MacDermid ColorSpan, Inc.', + 'CMCO' => 'Chromaco, Inc.', + 'CMiX' => 'CHROMiX', + 'COLO' => 'Colorgraphic Communications Corporation', + 'COMP' => 'COMPAQ Computer Corporation', + 'COMp' => 'Compeq USA/Focus Technology', + 'CONR' => 'Conrac Display Products', + 'CORD' => 'Cordata Technologies, Inc.', + 'CPQ ' => 'Compaq Computer Corporation', + 'CPRO' => 'ColorPro', + 'CRN ' => 'Cornerstone', + 'CTX ' => 'CTX International, Inc.', + 'CVIS' => 'ColorVision', + 'CWC ' => 'Fujitsu Laboratories, Ltd.', + 'DARI' => 'Darius Technology, Ltd.', + 'DATA' => 'Dataproducts', + 'DCP ' => 'Dry Creek Photo', + 'DCRC' => 'Digital Contents Resource Center, Chung-Ang University', + 'DELL' => 'Dell Computer Corporation', + 'DIC ' => 'Dainippon Ink and Chemicals', + 'DICO' => 'Diconix', + 'DIGI' => 'Digital', + 'DL&C' => 'Digital Light & Color', + 'DPLG' => 'Doppelganger, LLC', + 'DS ' => 'Dainippon Screen', + 'ds ' => 'Dainippon Screen', + 'DSOL' => 'DOOSOL', + 'DUPN' => 'DuPont', + 'dupn' => 'DuPont', + 'Eizo' => 'EIZO NANAO CORPORATION', + 'EPSO' => 'Epson', + 'ESKO' => 'Esko-Graphics', + 'ETRI' => 'Electronics and Telecommunications Research Institute', + 'EVER' => 'Everex Systems, Inc.', + 'EXAC' => 'ExactCODE GmbH', + 'FALC' => 'Falco Data Products, Inc.', + 'FF ' => 'Fuji Photo Film Co.,LTD', + 'FFEI' => 'FujiFilm Electronic Imaging, Ltd.', + 'ffei' => 'FujiFilm Electronic Imaging, Ltd.', + 'flux' => 'FluxData Corporation', + 'FNRD' => 'fnord software', + 'FORA' => 'Fora, Inc.', + 'FORE' => 'Forefront Technology Corporation', + 'FP ' => 'Fujitsu', + 'FPA ' => 'WayTech Development, Inc.', + 'FUJI' => 'Fujitsu', + 'FX ' => 'Fuji Xerox Co., Ltd.', + 'GCC ' => 'GCC Technologies, Inc.', + 'GGSL' => 'Global Graphics Software Limited', + 'GMB ' => 'Gretagmacbeth', + 'GMG ' => 'GMG GmbH & Co. KG', + 'GOLD' => 'GoldStar Technology, Inc.', + 'GOOG' => 'Google', #PH + 'GPRT' => 'Giantprint Pty Ltd', + 'GTMB' => 'Gretagmacbeth', + 'GVC ' => 'WayTech Development, Inc.', + 'GW2K' => 'Sony Corporation', + 'HCI ' => 'HCI', + 'HDM ' => 'Heidelberger Druckmaschinen AG', + 'HERM' => 'Hermes', + 'HITA' => 'Hitachi America, Ltd.', + 'HiTi' => 'HiTi Digital, Inc.', + 'HP ' => 'Hewlett-Packard', + 'HTC ' => 'Hitachi, Ltd.', + 'IBM ' => 'IBM Corporation', + 'IDNT' => 'Scitex Corporation, Ltd.', + 'Idnt' => 'Scitex Corporation, Ltd.', + 'IEC ' => 'Hewlett-Packard', + 'IIYA' => 'Iiyama North America, Inc.', + 'IKEG' => 'Ikegami Electronics, Inc.', + 'IMAG' => 'Image Systems Corporation', + 'IMI ' => 'Ingram Micro, Inc.', + 'Inca' => 'Inca Digital Printers Ltd.', + 'INTC' => 'Intel Corporation', + 'INTL' => 'N/A (INTL)', + 'INTR' => 'Intra Electronics USA, Inc.', + 'IOCO' => 'Iocomm International Technology Corporation', + 'IPS ' => 'InfoPrint Solutions Company', + 'IRIS' => 'Scitex Corporation, Ltd.', + 'Iris' => 'Scitex Corporation, Ltd.', + 'iris' => 'Scitex Corporation, Ltd.', + 'ISL ' => 'Ichikawa Soft Laboratory', + 'ITNL' => 'N/A (ITNL)', + 'IVM ' => 'IVM', + 'IWAT' => 'Iwatsu Electric Co., Ltd.', + 'JPEG' => 'Joint Photographic Experts Group', #PH + 'JSFT' => 'Jetsoft Development', + 'JVC ' => 'JVC Information Products Co.', + 'KART' => 'Scitex Corporation, Ltd.', + 'Kart' => 'Scitex Corporation, Ltd.', + 'kart' => 'Scitex Corporation, Ltd.', + 'KFC ' => 'KFC Computek Components Corporation', + 'KLH ' => 'KLH Computers', + 'KMHD' => 'Konica Minolta Holdings, Inc.', + 'KNCA' => 'Konica Corporation', + 'KODA' => 'Kodak', + 'KYOC' => 'Kyocera', + 'LCAG' => 'Leica Camera AG', + 'LCCD' => 'Leeds Colour', + 'lcms' => 'Little CMS', #NealKrawetz + 'LDAK' => 'Left Dakota', + 'LEAD' => 'Leading Technology, Inc.', + 'Leaf' => 'Leaf', #PH + 'LEXM' => 'Lexmark International, Inc.', + 'LINK' => 'Link Computer, Inc.', + 'LINO' => 'Linotronic', + 'Lino' => 'Linotronic', #PH (NC) + 'lino' => 'Linotronic', #PH (NC) + 'LITE' => 'Lite-On, Inc.', + 'MAGC' => 'Mag Computronic (USA) Inc.', + 'MAGI' => 'MAG Innovision, Inc.', + 'MANN' => 'Mannesmann', + 'MICN' => 'Micron Technology, Inc.', + 'MICR' => 'Microtek', + 'MICV' => 'Microvitec, Inc.', + 'MINO' => 'Minolta', + 'MITS' => 'Mitsubishi Electronics America, Inc.', + 'MITs' => 'Mitsuba Corporation', + 'Mits' => 'Mitsubishi Electric Corporation Kyoto Works', + 'MNLT' => 'Minolta', + 'MODG' => 'Modgraph, Inc.', + 'MONI' => 'Monitronix, Inc.', + 'MONS' => 'Monaco Systems Inc.', + 'MORS' => 'Morse Technology, Inc.', + 'MOTI' => 'Motive Systems', + 'MSFT' => 'Microsoft Corporation', + 'MUTO' => 'MUTOH INDUSTRIES LTD.', + 'NANA' => 'NANAO USA Corporation', + 'NEC ' => 'NEC Corporation', + 'NEXP' => 'NexPress Solutions LLC', + 'NISS' => 'Nissei Sangyo America, Ltd.', + 'NKON' => 'Nikon Corporation', + 'ob4d' => 'Erdt Systems GmbH & Co KG', + 'obic' => 'Medigraph GmbH', + 'OCE ' => 'Oce Technologies B.V.', + 'OCEC' => 'OceColor', + 'OKI ' => 'Oki', + 'OKID' => 'Okidata', + 'OKIP' => 'Okidata', + 'OLIV' => 'Olivetti', + 'OLYM' => 'OLYMPUS OPTICAL CO., LTD', + 'ONYX' => 'Onyx Graphics', + 'OPTI' => 'Optiquest', + 'PACK' => 'Packard Bell', + 'PANA' => 'Matsushita Electric Industrial Co., Ltd.', + 'PANT' => 'Pantone, Inc.', + 'PBN ' => 'Packard Bell', + 'PFU ' => 'PFU Limited', + 'PHIL' => 'Philips Consumer Electronics Co.', + 'PNTX' => 'HOYA Corporation PENTAX Imaging Systems Division', + 'POne' => 'Phase One A/S', + 'PREM' => 'Premier Computer Innovations', + 'PRIN' => 'Princeton Graphic Systems', + 'PRIP' => 'Princeton Publishing Labs', + 'QLUX' => 'Hong Kong', + 'QMS ' => 'QMS, Inc.', + 'QPCD' => 'QPcard AB', + 'QUAD' => 'QuadLaser', + 'quby' => 'Qubyx Sarl', + 'QUME' => 'Qume Corporation', + 'RADI' => 'Radius, Inc.', + 'RDDx' => 'Integrated Color Solutions, Inc.', + 'RDG ' => 'Roland DG Corporation', + 'REDM' => 'REDMS Group, Inc.', + 'RELI' => 'Relisys', + 'RGMS' => 'Rolf Gierling Multitools', + 'RICO' => 'Ricoh Corporation', + 'RNLD' => 'Edmund Ronald', + 'ROYA' => 'Royal', + 'RPC ' => 'Ricoh Printing Systems,Ltd.', + 'RTL ' => 'Royal Information Electronics Co., Ltd.', + 'SAMP' => 'Sampo Corporation of America', + 'SAMS' => 'Samsung, Inc.', + 'SANT' => 'Jaime Santana Pomares', + 'SCIT' => 'Scitex Corporation, Ltd.', + 'Scit' => 'Scitex Corporation, Ltd.', + 'scit' => 'Scitex Corporation, Ltd.', + 'SCRN' => 'Dainippon Screen', + 'scrn' => 'Dainippon Screen', + 'SDP ' => 'Scitex Corporation, Ltd.', + 'Sdp ' => 'Scitex Corporation, Ltd.', + 'sdp ' => 'Scitex Corporation, Ltd.', + 'SEC ' => 'SAMSUNG ELECTRONICS CO.,LTD', + 'SEIK' => 'Seiko Instruments U.S.A., Inc.', + 'SEIk' => 'Seikosha', + 'SGUY' => 'ScanGuy.com', + 'SHAR' => 'Sharp Laboratories', + 'SICC' => 'International Color Consortium', + 'siwi' => 'SIWI GRAFIKA CORPORATION', + 'SONY' => 'SONY Corporation', + 'Sony' => 'Sony Corporation', + 'SPCL' => 'SpectraCal', + 'STAR' => 'Star', + 'STC ' => 'Sampo Technology Corporation', + 'TALO' => 'Talon Technology Corporation', + 'TAND' => 'Tandy', + 'TATU' => 'Tatung Co. of America, Inc.', + 'TAXA' => 'TAXAN America, Inc.', + 'TDS ' => 'Tokyo Denshi Sekei K.K.', + 'TECO' => 'TECO Information Systems, Inc.', + 'TEGR' => 'Tegra', + 'TEKT' => 'Tektronix, Inc.', + 'TI ' => 'Texas Instruments', + 'TMKR' => 'TypeMaker Ltd.', + 'TOSB' => 'TOSHIBA corp.', + 'TOSH' => 'Toshiba, Inc.', + 'TOTK' => 'TOTOKU ELECTRIC Co., LTD', + 'TRIU' => 'Triumph', + 'TSBT' => 'TOSHIBA TEC CORPORATION', + 'TTX ' => 'TTX Computer Products, Inc.', + 'TVM ' => 'TVM Professional Monitor Corporation', + 'TW ' => 'TW Casper Corporation', + 'ULSX' => 'Ulead Systems', + 'UNIS' => 'Unisys', + 'UTZF' => 'Utz Fehlau & Sohn', + 'VARI' => 'Varityper', + 'VIEW' => 'Viewsonic', + 'VISL' => 'Visual communication', + 'VIVO' => 'Vivo Mobile Communication Co., Ltd', + 'WANG' => 'Wang', + 'WLBR' => 'Wilbur Imaging', + 'WTG2' => 'Ware To Go', + 'WYSE' => 'WYSE Technology', + 'XERX' => 'Xerox Corporation', + 'XRIT' => 'X-Rite', + 'yxym' => 'YxyMaster GmbH', + 'Z123' => "Lavanya's test Company", + 'Zebr' => 'Zebra Technologies Inc', + 'ZRAN' => 'Zoran Corporation', + # also seen: " ",ACMS,KCMS,UCCM,etc2,SCTX +); + +# ICC_Profile tag table +%Image::ExifTool::ICC_Profile::Main = ( + GROUPS => { 2 => 'Image' }, + PROCESS_PROC => \&ProcessICC_Profile, + WRITE_PROC => \&WriteICC_Profile, + NOTES => q{ + ICC profile information is used in many different file types including JPEG, + TIFF, PDF, PostScript, Photoshop, PNG, MIFF, PICT, QuickTime, XCF and some + RAW formats. While the tags listed below are not individually writable, the + entire profile itself can be accessed via the extra 'ICC_Profile' tag, but + this tag is neither extracted nor written unless specified explicitly. See + L<http://www.color.org/icc_specs2.xalter> for the official ICC + specification. + }, + A2B0 => 'AToB0', + A2B1 => 'AToB1', + A2B2 => 'AToB2', + bXYZ => 'BlueMatrixColumn', # (called BlueColorant in ref 2) + bTRC => { + Name => 'BlueTRC', + Description => 'Blue Tone Reproduction Curve', + }, + B2A0 => 'BToA0', + B2A1 => 'BToA1', + B2A2 => 'BToA2', + calt => { + Name => 'CalibrationDateTime', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + targ => { + Name => 'CharTarget', + ValueConv => '$val=~s/\0.*//; length $val > 128 ? \$val : $val', + }, + chad => 'ChromaticAdaptation', + chrm => { + Name => 'Chromaticity', + Groups => { 1 => 'ICC_Profile#' }, #(just for the group list) + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Chromaticity', + Validate => '$type eq "chrm"', + }, + }, + clro => 'ColorantOrder', + clrt => { + Name => 'ColorantTable', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::ColorantTable', + Validate => '$type eq "clrt"', + }, + }, + clot => { # new in version 4.2 + Name => 'ColorantTableOut', + Binary => 1, + }, + cprt => { + Name => 'ProfileCopyright', + ValueConv => '$val=~s/\0.*//; $val', # may be null terminated + }, + crdi => 'CRDInfo', #2 + dmnd => { + Name => 'DeviceMfgDesc', + Groups => { 2 => 'Camera' }, + }, + dmdd => { + Name => 'DeviceModelDesc', + Groups => { 2 => 'Camera' }, + }, + devs => { + Name => 'DeviceSettings', #2 + Groups => { 2 => 'Camera' }, + }, + gamt => 'Gamut', + kTRC => { + Name => 'GrayTRC', + Description => 'Gray Tone Reproduction Curve', + }, + gXYZ => 'GreenMatrixColumn', # (called GreenColorant in ref 2) + gTRC => { + Name => 'GreenTRC', + Description => 'Green Tone Reproduction Curve', + }, + lumi => 'Luminance', + meas => { + Name => 'Measurement', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Measurement', + Validate => '$type eq "meas"', + }, + }, + bkpt => 'MediaBlackPoint', + wtpt => 'MediaWhitePoint', + ncol => 'NamedColor', #2 + ncl2 => 'NamedColor2', + resp => 'OutputResponse', + pre0 => 'Preview0', + pre1 => 'Preview1', + pre2 => 'Preview2', + desc => 'ProfileDescription', + pseq => 'ProfileSequenceDesc', + psd0 => 'PostScript2CRD0', #2 + psd1 => 'PostScript2CRD1', #2 + psd2 => 'PostScript2CRD2', #2 + ps2s => 'PostScript2CSA', #2 + ps2i => 'PS2RenderingIntent', #2 + rXYZ => 'RedMatrixColumn', # (called RedColorant in ref 2) + rTRC => { + Name => 'RedTRC', + Description => 'Red Tone Reproduction Curve', + }, + scrd => 'ScreeningDesc', + scrn => 'Screening', + 'bfd '=> { + Name => 'UCRBG', + Description => 'Under Color Removal and Black Gen.', + }, + tech => { + Name => 'Technology', + PrintConv => { + fscn => 'Film Scanner', + dcam => 'Digital Camera', + rscn => 'Reflective Scanner', + ijet => 'Ink Jet Printer', + twax => 'Thermal Wax Printer', + epho => 'Electrophotographic Printer', + esta => 'Electrostatic Printer', + dsub => 'Dye Sublimation Printer', + rpho => 'Photographic Paper Printer', + fprn => 'Film Writer', + vidm => 'Video Monitor', + vidc => 'Video Camera', + pjtv => 'Projection Television', + 'CRT '=> 'Cathode Ray Tube Display', + 'PMD '=> 'Passive Matrix Display', + 'AMD '=> 'Active Matrix Display', + KPCD => 'Photo CD', + imgs => 'Photo Image Setter', + grav => 'Gravure', + offs => 'Offset Lithography', + silk => 'Silkscreen', + flex => 'Flexography', + mpfs => 'Motion Picture Film Scanner', #5 + mpfr => 'Motion Picture Film Recorder', #5 + dmpc => 'Digital Motion Picture Camera', #5 + dcpj => 'Digital Cinema Projector', #5 + }, + }, + vued => 'ViewingCondDesc', + view => { + Name => 'ViewingConditions', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::ViewingConditions', + Validate => '$type eq "view"', + }, + }, + ciis => 'ColorimetricIntentImageState', #5 + scoe => 'SceneColorimetryEstimates', #5 + sape => 'SceneAppearanceEstimates', #5 + fpce => 'FocalPlaneColorimetryEstimates', #5 + rhoc => 'ReflectionHardcopyOrigColorimetry', #5 + rpoc => 'ReflectionPrintOutputColorimetry', #5 + psid => { #5 + Name => 'ProfileSequenceIdentifier', + Binary => 1, + }, + B2D0 => { Name => 'BToD0', Binary => 1 }, #5 + B2D1 => { Name => 'BToD1', Binary => 1 }, #5 + B2D2 => { Name => 'BToD2', Binary => 1 }, #5 + B2D3 => { Name => 'BToD3', Binary => 1 }, #5 + D2B0 => { Name => 'DToB0', Binary => 1 }, #5 + D2B1 => { Name => 'DToB1', Binary => 1 }, #5 + D2B2 => { Name => 'DToB2', Binary => 1 }, #5 + D2B3 => { Name => 'DToB3', Binary => 1 }, #5 + rig0 => { #5 + Name => 'PerceptualRenderingIntentGamut', + PrintConv => { + prmg => 'Perceptual Reference Medium Gamut', + }, + }, + rig2 => { #5 + Name => 'SaturationRenderingIntentGamut', + PrintConv => { + prmg => 'Perceptual Reference Medium Gamut', + }, + }, + meta => { #5 + Name => 'Metadata', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Metadata', + Validate => '$type eq "dict"', + }, + }, + + # ColorSync custom tags (ref 3) + psvm => 'PS2CRDVMSize', + vcgt => 'VideoCardGamma', + mmod => 'MakeAndModel', + dscm => 'ProfileDescriptionML', + ndin => 'NativeDisplayInfo', + + # Microsoft custom tags (ref http://msdn2.microsoft.com/en-us/library/ms536870.aspx) + MS00 => 'WCSProfiles', + + psd3 => { #6 + Name => 'PostScript2CRD3', + Binary => 1, # (NC) + }, + + # new tags in v5 (ref 7) + A2B3 => 'AToB3', + A2M0 => 'AToM0', + B2A3 => 'BToA3', + bcp0 => 'BRDFColorimetricParam0', + bcp1 => 'BRDFColorimetricParam1', + bcp2 => 'BRDFColorimetricParam2', + bcp3 => 'BRDFColorimetricParam3', + bsp0 => 'BRDFSpectralParam0', + bsp1 => 'BRDFSpectralParam1', + bsp2 => 'BRDFSpectralParam2', + bsp3 => 'BRDFSpectralParam3', + bAB0 => 'BRDFAToB0', + bAB1 => 'BRDFAToB1', + bAB2 => 'BRDFAToB2', + bAB3 => 'BRDFAToB3', + bBA0 => 'BRDFBToA0', + bBA1 => 'BRDFBToA1', + bBA2 => 'BRDFBToA2', + bBA3 => 'BRDFBToA3', + bBD0 => 'BRDFBToD0', + bBD1 => 'BRDFBToD1', + bBD2 => 'BRDFBToD2', + bBD3 => 'BRDFBToD3', + bDB0 => 'BRDFDToB0', + bDB1 => 'BRDFDToB1', + bDB2 => 'BRDFDToB2', + bDB3 => 'BRDFDToB3', + bMB0 => 'BRDFMToB0', + bMB1 => 'BRDFMToB1', + bMB2 => 'BRDFMToB2', + bMB3 => 'BRDFMToB3', + bMS0 => 'BRDFMToS0', + bMS1 => 'BRDFMToS1', + bMS2 => 'BRDFMToS2', + bMS3 => 'BRDFMToS3', + dAB0 => 'DirectionalAToB0', + dAB1 => 'DirectionalAToB1', + dAB2 => 'DirectionalAToB2', + dAB3 => 'DirectionalAToB3', + dBA0 => 'DirectionalBToA0', + dBA1 => 'DirectionalBToA1', + dBA2 => 'DirectionalBToA2', + dBA3 => 'DirectionalBToA3', + dBD0 => 'DirectionalBToD0', + dBD1 => 'DirectionalBToD1', + dBD2 => 'DirectionalBToD2', + dBD3 => 'DirectionalBToD3', + dDB0 => 'DirectionalDToB0', + dDB1 => 'DirectionalDToB1', + dDB2 => 'DirectionalDToB2', + dDB3 => 'DirectionalDToB3', + gdb0 => 'GamutBoundaryDescription0', + gdb1 => 'GamutBoundaryDescription1', + gdb2 => 'GamutBoundaryDescription2', + gdb3 => 'GamutBoundaryDescription3', + 'mdv '=> 'MultiplexDefaultValues', + mcta => 'MultiplexTypeArray', + minf => 'MeasurementInfo', + miin => 'MeasurementInputInfo', + M2A0 => 'MToA0', + M2B0 => 'MToB0', + M2B1 => 'MToB1', + M2B2 => 'MToB2', + M2B3 => 'MToB3', + M2S0 => 'MToS0', + M2S1 => 'MToS1', + M2S2 => 'MToS2', + M2S3 => 'MToS3', + cept => 'ColorEncodingParams', + csnm => 'ColorSpaceName', + cloo => 'ColorantOrderOut', + clio => 'ColorantInfoOut', + c2sp => 'CustomToStandardPcc', + 'CxF '=> 'CXF', + nmcl => 'NamedColor', + psin => 'ProfileSequenceInfo', + rfnm => 'ReferenceName', + svcn => 'SpectralViewingConditions', + swpt => 'SpectralWhitePoint', + s2cp => 'StandardToCustomPcc', + smap => 'SurfaceMap', + # smwp ? (seen in some v5 samples) + + # the following entry represents the ICC profile header, and doesn't + # exist as a tag in the directory. It is only in this table to provide + # a link so ExifTool can locate the header tags + Header => { + Name => 'ProfileHeader', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Header', + }, + }, +); + +# ICC profile header definition +%Image::ExifTool::ICC_Profile::Header = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-header', 2 => 'Image' }, + 4 => { + Name => 'ProfileCMMType', + Format => 'string[4]', + SeparateTable => 'ManuSig', + PrintConv => \%manuSig, + }, + 8 => { + Name => 'ProfileVersion', + Format => 'int16s', + PrintConv => '($val >> 8).".".(($val & 0xf0)>>4).".".($val & 0x0f)', + }, + 12 => { + Name => 'ProfileClass', + Format => 'string[4]', + PrintConv => \%profileClass, + }, + 16 => { + Name => 'ColorSpaceData', + Format => 'string[4]', + }, + 20 => { + Name => 'ProfileConnectionSpace', + Format => 'string[4]', + }, + 24 => { + Name => 'ProfileDateTime', + Groups => { 2 => 'Time' }, + Format => 'int16u[6]', + ValueConv => 'sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d",split(" ",$val));', + PrintConv => '$self->ConvertDateTime($val)', + }, + 36 => { + Name => 'ProfileFileSignature', + Format => 'string[4]', + }, + 40 => { + Name => 'PrimaryPlatform', + Format => 'string[4]', + PrintConv => { + 'APPL' => 'Apple Computer Inc.', + 'MSFT' => 'Microsoft Corporation', + 'SGI ' => 'Silicon Graphics Inc.', + 'SUNW' => 'Sun Microsystems Inc.', + 'TGNT' => 'Taligent Inc.', + }, + }, + 44 => { + Name => 'CMMFlags', + Format => 'int32u', + PrintConv => q[ + ($val & 0x01 ? "Embedded, " : "Not Embedded, ") . + ($val & 0x02 ? "Not Independent" : "Independent") + ], + }, + 48 => { + Name => 'DeviceManufacturer', + Format => 'string[4]', + SeparateTable => 'ManuSig', + PrintConv => \%manuSig, + }, + 52 => { + Name => 'DeviceModel', + Format => 'string[4]', + # ROMM = Reference Output Medium Metric + }, + 56 => { + Name => 'DeviceAttributes', + Format => 'int32u[2]', + PrintConv => q[ + my @v = split ' ', $val; + ($v[1] & 0x01 ? "Transparency, " : "Reflective, ") . + ($v[1] & 0x02 ? "Matte, " : "Glossy, ") . + ($v[1] & 0x04 ? "Negative, " : "Positive, ") . + ($v[1] & 0x08 ? "B&W" : "Color"); + ], + }, + 64 => { + Name => 'RenderingIntent', + Format => 'int32u', + PrintConv => { + 0 => 'Perceptual', + 1 => 'Media-Relative Colorimetric', + 2 => 'Saturation', + 3 => 'ICC-Absolute Colorimetric', + }, + }, + 68 => { + Name => 'ConnectionSpaceIlluminant', + Format => 'fixed32s[3]', # xyz + }, + 80 => { + Name => 'ProfileCreator', + Format => 'string[4]', + SeparateTable => 'ManuSig', + PrintConv => \%manuSig, + }, + 84 => { + Name => 'ProfileID', + Format => 'int8u[16]', + PrintConv => 'Image::ExifTool::ICC_Profile::HexID($val)', + }, +); + +# viewingConditionsType (view) definition +%Image::ExifTool::ICC_Profile::ViewingConditions = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-view', 2 => 'Image' }, + 8 => { + Name => 'ViewingCondIlluminant', + Format => 'fixed32s[3]', # xyz + }, + 20 => { + Name => 'ViewingCondSurround', + Format => 'fixed32s[3]', # xyz + }, + 32 => { + Name => 'ViewingCondIlluminantType', + Format => 'int32u', + PrintConv => \%illuminantType, + }, +); + +# measurementType (meas) definition +%Image::ExifTool::ICC_Profile::Measurement = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-meas', 2 => 'Image' }, + 8 => { + Name => 'MeasurementObserver', + Format => 'int32u', + PrintConv => { + 1 => 'CIE 1931', + 2 => 'CIE 1964', + }, + }, + 12 => { + Name => 'MeasurementBacking', + Format => 'fixed32s[3]', # xyz + }, + 24 => { + Name => 'MeasurementGeometry', + Format => 'int32u', + PrintConv => { + 0 => 'Unknown', + 1 => '0/45 or 45/0', + 2 => '0/d or d/0', + }, + }, + 28 => { + Name => 'MeasurementFlare', + Format => 'fixed32u', + PrintConv => '$val*100 . "%"', # change into a percent + }, + 32 => { + Name => 'MeasurementIlluminant', + Format => 'int32u', + PrintConv => \%illuminantType, + }, +); + +# chromaticity (chrm) definition +%Image::ExifTool::ICC_Profile::Chromaticity = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-chrm', 2 => 'Image' }, + 8 => { + Name => 'ChromaticityChannels', + Format => 'int16u', + }, + 10 => { + Name => 'ChromaticityColorant', + Format => 'int16u', + PrintConv => { + 1 => 'ITU-R BT.709', + 2 => 'SMPTE RP145-1994', + 3 => 'EBU Tech.3213-E', + 4 => 'P22', + }, + }, + # include definitions for 4 channels -- if there are + # fewer then the ProcessBinaryData logic won't print them. + # If there are more, oh well. + 12 => { + Name => 'ChromaticityChannel1', + Format => 'fixed32u[2]', + }, + 20 => { + Name => 'ChromaticityChannel2', + Format => 'fixed32u[2]', + }, + 28 => { + Name => 'ChromaticityChannel3', + Format => 'fixed32u[2]', + }, + 36 => { + Name => 'ChromaticityChannel4', + Format => 'fixed32u[2]', + }, +); + +# colorantTable (clrt) definition +%Image::ExifTool::ICC_Profile::ColorantTable = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-clrt', 2 => 'Image' }, + 8 => { + Name => 'ColorantCount', + Format => 'int32u', + }, + # include definitions for 3 colorants -- if there are + # fewer then the ProcessBinaryData logic won't print them. + # If there are more, oh well. + 12 => { + Name => 'Colorant1Name', + Format => 'string[32]', + }, + 44 => { + Name => 'Colorant1Coordinates', + Format => 'int16u[3]', + }, + 50 => { + Name => 'Colorant2Name', + Format => 'string[32]', + }, + 82 => { + Name => 'Colorant2Coordinates', + Format => 'int16u[3]', + }, + 88 => { + Name => 'Colorant3Name', + Format => 'string[32]', + }, + 120 => { + Name => 'Colorant3Coordinates', + Format => 'int16u[3]', + }, +); + +# metadata (meta) tags +%Image::ExifTool::ICC_Profile::Metadata = ( + PROCESS_PROC => \&ProcessMetadata, + GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-meta', 2 => 'Image' }, + VARS => { NO_ID => 1 }, + NOTES => q{ + Only these few tags have been pre-defined, but ExifTool will extract any + Metadata tags that exist. + }, + ManufacturerName => { }, + MediaColor => { }, + MediaWeight => { }, + CreatorApp => { }, +); + +#------------------------------------------------------------------------------ +# Print ICC Profile ID in hex +# Inputs: 1) string of numbers +# Returns: string of hex digits +sub HexID($) +{ + my $val = shift; + my @vals = split(' ', $val); + # return a simple zero if no MD5 done + return 0 unless grep(!/^0/, @vals); + $val = ''; + foreach (@vals) { $val .= sprintf("%.2x",$_); } + return $val; +} + +#------------------------------------------------------------------------------ +# Get formatted value from ICC tag (which has the type embedded) +# Inputs: 0) data reference, 1) offset to tag data, 2) tag data size +# Returns: Formatted value or undefined if format not supported +# Notes: The following types are handled by BinaryTables: +# chromaticityType, colorantTableType, measurementType, viewingConditionsType +# The following types are currently not handled (most are large tables): +# curveType, lut16Type, lut8Type, lutAtoBType, lutBtoAType, namedColor2Type, +# parametricCurveType, profileSeqDescType, responseCurveSet16Type +# The multiLocalizedUnicodeType must be handled by the calling routine. +sub FormatICCTag($$$) +{ + my ($dataPt, $offset, $size) = @_; + + my $type; + if ($size >= 8) { + # get data type from start of tag data + $type = substr($$dataPt, $offset, 4); + } else { + $type = 'err'; + } + # colorantOrderType + if ($type eq 'clro' and $size >= 12) { + my $num = Get32u($dataPt, $offset+8); + if ($size >= $num + 12) { + my $pos = $offset + 12; + return join(' ',unpack("x$pos c$num", $$dataPt)); + } + } + # dataType + if ($type eq 'data' and $size >= 12) { + my $form = Get32u($dataPt, $offset+8); + # format 0 is UTF-8 data + $form == 0 and return substr($$dataPt, $offset+12, $size-12); + # binary data and other data types treat as binary (ie. don't format) + } + # dateTimeType + if ($type eq 'dtim' and $size >= 20) { + return sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d", + Get16u($dataPt, $offset+8), Get16u($dataPt, $offset+10), + Get16u($dataPt, $offset+12), Get16u($dataPt, $offset+14), + Get16u($dataPt, $offset+16), Get16u($dataPt, $offset+18)); + } + # s15Fixed16ArrayType + if ($type eq 'sf32') { + return ReadValue($dataPt,$offset+8,'fixed32s',($size-8)/4,$size-8); + } + # signatureType + if ($type eq 'sig ' and $size >= 12) { + return substr($$dataPt, $offset+8, 4); + } + # textType + $type eq 'text' and return substr($$dataPt, $offset+8, $size-8); + # textDescriptionType (ref 2, replaced by multiLocalizedUnicodeType) + if ($type eq 'desc' and $size >= 12) { + my $len = Get32u($dataPt, $offset+8); + if ($size >= $len + 12) { + my $str = substr($$dataPt, $offset+12, $len); + $str =~ s/\0.*//s; # truncate at null terminator + return $str; + } + } + # u16Fixed16ArrayType + if ($type eq 'uf32') { + return ReadValue($dataPt,$offset+8,'fixed32u',($size-8)/4,$size-8); + } + # uInt32ArrayType + if ($type eq 'ui32') { + return ReadValue($dataPt,$offset+8,'int32u',($size-8)/4,$size-8); + } + # uInt64ArrayType + if ($type eq 'ui64') { + return ReadValue($dataPt,$offset+8,'int64u',($size-8)/8,$size-8); + } + # uInt8ArrayType + if ($type eq 'ui08') { + return ReadValue($dataPt,$offset+8,'int8u',$size-8,$size-8); + } + # XYZType + if ($type eq 'XYZ ') { + my $str = ''; + my $pos; + for ($pos=8; $pos+12<=$size; $pos+=12) { + $str and $str .= ', '; + $str .= ReadValue($dataPt,$offset+$pos,'fixed32s',3,$size-$pos); + } + return $str; + } + return undef; # data type is not supported +} + +#------------------------------------------------------------------------------ +# Process ICC metadata record (ref 5) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessMetadata($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart}; + my $dirLen = $$dirInfo{DirLen}; + my $dirEnd = $dirStart + $dirLen; + + if ($dirLen < 16 or substr($$dataPt, $dirStart, 4) ne 'dict') { + $et->Warn('Invalid ICC meta dictionary'); + return 0; + } + my $num = Get32u($dataPt, $dirStart + 8); + $et->VerboseDir('Metadata', $num); + my $size = Get32u($dataPt, $dirStart + 12); + $size < 16 and $et->Warn('Invalid ICC meta record size'), return 0; + # NOTE: In the example the minimum offset is 20, + # but this doesn't jive with the table (both in ref 5) + my $minPtr = 16 + $size * $num; + my $index; + for ($index=0; $index<$num; ++$index) { + my $entry = $dirStart + 16 + $size * $index; + if ($entry + $size > $dirEnd) { + $et->Warn('Truncated ICC meta dictionary'); + last; + } + my $namePtr = Get32u($dataPt, $entry); + my $nameLen = Get32u($dataPt, $entry + 4); + my $valuePtr = Get32u($dataPt, $entry + 8); + my $valueLen = Get32u($dataPt, $entry + 12); + next unless $namePtr and $valuePtr; # ignore if offsets are zero + if ($namePtr < $minPtr or $namePtr + $nameLen > $dirLen or + $valuePtr < $minPtr or $valuePtr + $valueLen > $dirLen) + { + $et->Warn('Corrupted ICC meta dictionary'); + last; + } + my $tag = substr($$dataPt, $dirStart + $namePtr, $nameLen); + my $val = substr($$dataPt, $dirStart + $valuePtr, $valueLen); + $tag = $et->Decode($tag, 'UTF16', 'MM', 'UTF8'); + $val = $et->Decode($val, 'UTF16', 'MM'); + # generate tagInfo if it doesn't exist + unless ($$tagTablePtr{$tag}) { + my $name = ucfirst $tag; + $name =~ s/\s+(.)/\u$1/g; + $name =~ tr/-_a-zA-Z0-9//dc; + next unless length $name; + $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n"); + AddTagToTable($tagTablePtr, $tag, { Name => $name }); + } + $et->HandleTag($tagTablePtr, $tag, $val); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Write ICC profile file +# Inputs: 0) ExifTool object reference, 1) Reference to directory information +# Returns: 1 on success, 0 if this wasn't a valid ICC file, +# or -1 if a write error occurred +sub WriteICC($$) +{ + my ($et, $dirInfo) = @_; + # first make sure this is a valid ICC file (or no file at all) + my $raf = $$dirInfo{RAF}; + my $buff; + return 0 if $raf->Read($buff, 24) and ValidateICC(\$buff); + # now write the new ICC + $buff = WriteICC_Profile($et, $dirInfo); + if (defined $buff and length $buff) { + Write($$dirInfo{OutFile}, $buff) or return -1; + } else { + $et->Error('No ICC information to write'); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Write ICC data as a block +# Inputs: 0) ExifTool object reference, 1) source dirInfo reference, +# 2) tag table reference +# Returns: ICC data block (may be empty if no ICC data) +# Notes: Increments ExifTool CHANGED flag if changed +sub WriteICC_Profile($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access + my $dirName = $$dirInfo{DirName} || 'ICC_Profile'; + # (don't write AsShotICCProfile or CurrentICCProfile here) + return undef unless $dirName eq 'ICC_Profile'; + my $nvHash = $et->GetNewValueHash($Image::ExifTool::Extra{$dirName}); + my $val = $et->GetNewValue($nvHash); + $val = '' unless defined $val; + return undef unless $et->IsOverwriting($nvHash, $val); + ++$$et{CHANGED}; + return $val; +} + +#------------------------------------------------------------------------------ +# Validate ICC data +# Inputs: 0) ICC data reference +# Returns: error string or undef on success +sub ValidateICC($) +{ + my $valPtr = shift; + my $err; + length($$valPtr) < 24 and return 'Invalid ICC profile'; + $profileClass{substr($$valPtr, 12, 4)} or $err = 'profile class'; + my $col = substr($$valPtr, 16, 4); # ColorSpaceData + my $con = substr($$valPtr, 20, 4); # ConnectionSpace + my $match = '(XYZ |Lab |Luv |YCbr|Yxy |RGB |GRAY|HSV |HLS |CMYK|CMY |[2-9A-F]CLR|nc..|\0{4})'; + $col =~ /$match/ or $err = 'color space'; + $con =~ /$match/ or $err = 'connection space'; + return $err ? "Invalid ICC profile (bad $err)" : undef; +} + +#------------------------------------------------------------------------------ +# Process ICC profile file +# Inputs: 0) ExifTool object reference, 1) Reference to directory information +# Returns: 1 if this was an ICC file +sub ProcessICC($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + $raf->Read($buff, 24) == 24 or return 0; + # check to see if this is a valid ICC profile file + return 0 if ValidateICC(\$buff); + $et->SetFileType(); + # read the profile + my $size = unpack('N', $buff); + if ($size < 128 or $size & 0x80000000) { + $et->Error("Bad ICC Profile length ($size)"); + return 1; + } + $raf->Seek(0, 0); + unless ($raf->Read($buff, $size) == $size) { + $et->Error('Truncated ICC profile'); + return 1; + } + my %dirInfo = ( + DataPt => \$buff, + DataLen => $size, + DirStart => 0, + DirLen => $size, + ); + my $tagTablePtr = GetTagTable('Image::ExifTool::ICC_Profile::Main'); + return ProcessICC_Profile($et, \%dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Process ICC_Profile APP13 record +# Inputs: 0) ExifTool object reference, 1) Reference to directory information +# 2) Tag table reference (undefined to read ICC file) +# Returns: 1 on success +sub ProcessICC_Profile($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen}; + my $verbose = $et->Options('Verbose'); + + return 0 if $dirLen < 4; + + # extract binary ICC_Profile data block if binary mode or requested + if ((($$et{TAGS_FROM_FILE} and not $$et{EXCL_TAG_LOOKUP}{icc_profile}) or + $$et{REQ_TAG_LOOKUP}{icc_profile}) and + # (don't extract from AsShotICCProfile or CurrentICCProfile) + (not $$dirInfo{Name} or $$dirInfo{Name} eq 'ICC_Profile')) + { + $et->FoundTag('ICC_Profile', substr($$dataPt, $dirStart, $dirLen)); + } + + SetByteOrder('MM'); # ICC_Profile is always big-endian + + # check length of table + my $len = Get32u($dataPt, $dirStart); + if ($len != $dirLen or $len < 128) { + $et->Warn("Bad length ICC_Profile (length $len)"); + return 0 if $len < 128 or $dirLen < $len; + } + my $pos = $dirStart + 128; # position at start of table + my $numEntries = Get32u($dataPt, $pos); + if ($numEntries < 1 or $numEntries >= 0x100 + or $numEntries * 12 + 132 > $dirLen) + { + $et->Warn("Bad ICC_Profile table ($numEntries entries)"); + return 0; + } + + if ($verbose) { + $et->VerboseDir('ICC_Profile', $numEntries, $dirLen); + my $fakeInfo = { Name=>'ProfileHeader', SubDirectory => { } }; + $et->VerboseInfo(undef, $fakeInfo); + } + # increment ICC dir count + my $dirCount = $$et{DIR_COUNT}{ICC} = ($$et{DIR_COUNT}{ICC} || 0) + 1; + $$et{SET_GROUP1} = '+' . $dirCount if $dirCount > 1; + # process the header block + my %subdirInfo = ( + Name => 'ProfileHeader', + DataPt => $dataPt, + DataLen => $$dirInfo{DataLen}, + DirStart => $dirStart, + DirLen => 128, + Parent => $$dirInfo{DirName}, + DirName => 'Header', + ); + my $newTagTable = GetTagTable('Image::ExifTool::ICC_Profile::Header'); + $et->ProcessDirectory(\%subdirInfo, $newTagTable); + + $pos += 4; # skip item count + my $index; + for ($index=0; $index<$numEntries; ++$index) { + my $tagID = substr($$dataPt, $pos, 4); + my $offset = Get32u($dataPt, $pos + 4); + my $size = Get32u($dataPt, $pos + 8); + $pos += 12; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID); + # unknown tags aren't generated automatically by GetTagInfo() + # if the tagID's aren't numeric, so we must do this manually: + if (not $tagInfo and ($$et{OPTIONS}{Unknown} or $verbose)) { + $tagInfo = { Unknown => 1 }; + AddTagToTable($tagTablePtr, $tagID, $tagInfo); + } + next unless defined $tagInfo; + + if ($offset + $size > $dirLen) { + $et->Warn("Bad ICC_Profile table (truncated)"); + last; + } + my $valuePtr = $dirStart + $offset; + + my $subdir = $$tagInfo{SubDirectory}; + # format the value unless this is a subdirectory + my ($value, $fmt); + if ($size > 4) { + $fmt = substr($$dataPt, $valuePtr, 4); + # handle multiLocalizedUnicodeType + if ($fmt eq 'mluc' and not $subdir) { + next if $size < 28; + my $count = Get32u($dataPt, $valuePtr + 8); + my $recLen = Get32u($dataPt, $valuePtr + 12); + next if $recLen < 12; + my $i; + for ($i=0; $i<$count; ++$i) { + my $recPos = $valuePtr + 16 + $i * $recLen; + last if $recPos + $recLen > $valuePtr + $size; + my $lang = substr($$dataPt, $recPos, 4); + my $langInfo; + # validate language code and change to standard case (just in case) + if ($lang =~ s/^([a-z]{2})([A-Z]{2})$/\L$1-\U$2/i and $lang ne 'en-US') { + $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang); + } + my $strLen = Get32u($dataPt, $recPos + 4); + my $strPos = Get32u($dataPt, $recPos + 8); + last if $strPos + $strLen > $size; + my $str = substr($$dataPt, $valuePtr + $strPos, $strLen); + $str = $et->Decode($str, 'UTF16'); + $et->HandleTag($tagTablePtr, $tagID, $str, + TagInfo => $langInfo || $tagInfo, + Table => $tagTablePtr, + Index => $index, + Value => $str, + DataPt => $dataPt, + Size => $strLen, + Start => $valuePtr + $strPos, + Format => "type '${fmt}'", + ); + } + $et->Warn("Corrupted $$tagInfo{Name} data") if $i < $count; + next; + } + } else { + $fmt = 'err '; + } + $value = FormatICCTag($dataPt, $valuePtr, $size) unless $subdir; + $verbose and $et->VerboseInfo($tagID, $tagInfo, + Table => $tagTablePtr, + Index => $index, + Value => $value, + DataPt => $dataPt, + Size => $size, + Start => $valuePtr, + Format => "type '${fmt}'", + ); + if ($subdir) { + my $name = $$tagInfo{Name}; + undef $newTagTable; + if ($$subdir{TagTable}) { + $newTagTable = GetTagTable($$subdir{TagTable}); + unless ($newTagTable) { + warn "Unknown tag table $$subdir{TagTable}\n"; + next; + } + } else { + warn "Must specify TagTable for SubDirectory $name\n"; + next; + } + %subdirInfo = ( + Name => $name, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + DataLen => $$dirInfo{DataLen}, + DirStart => $valuePtr, + DirLen => $size, + DirName => $name, + Parent => $$dirInfo{DirName}, + ); + my $type = $fmt; + #### eval Validate ($type) + if (defined $$subdir{Validate} and not eval $$subdir{Validate}) { + $et->Warn("Invalid ICC $name data"); + } else { + $et->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc}); + } + } elsif (defined $value) { + $et->FoundTag($tagInfo, $value); + } else { + $value = substr($$dataPt, $valuePtr, $size); + # treat unsupported formats as binary data + $$tagInfo{ValueConv} = '\$val' unless defined $$tagInfo{ValueConv}; + $et->FoundTag($tagInfo, $value); + } + } + delete $$et{SET_GROUP1}; + return 1; +} + + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::ICC_Profile - Read ICC Profile meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains the definitions to read information from ICC profiles. +ICC (International Color Consortium) profiles are used to translate color +data created on one device into another device's native color space. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.color.org/icc_specs2.html> + +=item L<http://developer.apple.com/documentation/GraphicsImaging/Reference/ColorSync_Manager/ColorSync_Manager.pdf> + +=item L<https://color.org/specification/ICC.2-2019.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/ICC_Profile Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/ID3.pm b/lib/Image/ExifTool/ID3.pm new file mode 100644 index 0000000..3baa293 --- /dev/null +++ b/lib/Image/ExifTool/ID3.pm @@ -0,0 +1,1680 @@ +#------------------------------------------------------------------------------ +# File: ID3.pm +# +# Description: Read ID3 and Lyrics3 meta information +# +# Revisions: 09/12/2005 - P. Harvey Created +# 09/08/2020 - PH Added Lyrics3 support +# +# References: 1) http://www.id3.org/ (now https://id3.org) +# 2) http://www.mp3-tech.org/ +# 3) http://www.fortunecity.com/underworld/sonic/3/id3tag.html +# 4) https://id3.org/Lyrics3 +#------------------------------------------------------------------------------ + +package Image::ExifTool::ID3; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.57'; + +sub ProcessID3v2($$$); +sub ProcessPrivate($$$); +sub ProcessSynText($$$); +sub ProcessID3Dir($$$); +sub ConvertID3v1Text($$); +sub ConvertTimeStamp($); + +# audio formats that we process after an ID3v2 header (in order) +my @audioFormats = qw(APE MPC FLAC OGG MP3); + +# audio formats where the processing proc is in a differently-named module +my %audioModule = ( + MP3 => 'ID3', + OGG => 'Ogg', +); + +# picture types for 'PIC' and 'APIC' tags +# (Note: Duplicated in ID3, ASF and FLAC modules!) +my %pictureType = ( + 0 => 'Other', + 1 => '32x32 PNG Icon', + 2 => 'Other Icon', + 3 => 'Front Cover', + 4 => 'Back Cover', + 5 => 'Leaflet', + 6 => 'Media', + 7 => 'Lead Artist', + 8 => 'Artist', + 9 => 'Conductor', + 10 => 'Band', + 11 => 'Composer', + 12 => 'Lyricist', + 13 => 'Recording Studio or Location', + 14 => 'Recording Session', + 15 => 'Performance', + 16 => 'Capture from Movie or Video', + 17 => 'Bright(ly) Colored Fish', + 18 => 'Illustration', + 19 => 'Band Logo', + 20 => 'Publisher Logo', +); + +my %dateTimeConv = ( + ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)', + PrintConv => '$self->ConvertDateTime($val)', +); + +# This table is just for documentation purposes +%Image::ExifTool::ID3::Main = ( + VARS => { NO_ID => 1 }, + PROCESS_PROC => \&ProcessID3Dir, # (used to process 'id3 ' chunk in WAV files) + NOTES => q{ + ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, WAV, AIFF, + OGG, FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple + languages (eg. Comment and Lyrics) are extracted by specifying the tag name, + followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg. + "Comment-spa"). See L<https://id3.org/> for the official ID3 specification + and L<http://www.loc.gov/standards/iso639-2/php/code_list.php> for a list of + ISO 639-2 language codes. + }, + ID3v1 => { + Name => 'ID3v1', + SubDirectory => { TagTable => 'Image::ExifTool::ID3::v1' }, + }, + ID3v1Enh => { + Name => 'ID3v1_Enh', + SubDirectory => { TagTable => 'Image::ExifTool::ID3::v1_Enh' }, + }, + ID3v22 => { + Name => 'ID3v2_2', + SubDirectory => { TagTable => 'Image::ExifTool::ID3::v2_2' }, + }, + ID3v23 => { + Name => 'ID3v2_3', + SubDirectory => { TagTable => 'Image::ExifTool::ID3::v2_3' }, + }, + ID3v24 => { + Name => 'ID3v2_4', + SubDirectory => { TagTable => 'Image::ExifTool::ID3::v2_4' }, + }, +); + +# Lyrics3 tags (ref 4) +%Image::ExifTool::ID3::Lyrics3 = ( + GROUPS => { 1 => 'Lyrics3', 2 => 'Audio' }, + NOTES => q{ + ExifTool extracts Lyrics3 version 1.00 and 2.00 tags from any file that + supports ID3. See L<https://id3.org/Lyrics3> for the specification. + }, + IND => 'Indications', + LYR => 'Lyrics', + INF => 'AdditionalInfo', + AUT => { Name => 'Author', Groups => { 2 => 'Author' } }, + EAL => 'ExtendedAlbumName', + EAR => 'ExtendedArtistName', + ETT => 'ExtendedTrackTitle', + IMG => 'AssociatedImageFile', + CRC => 'CRC', #PH +); + +# Mapping for ID3v1 Genre numbers +my %genre = ( + 0 => 'Blues', + 1 => 'Classic Rock', + 2 => 'Country', + 3 => 'Dance', + 4 => 'Disco', + 5 => 'Funk', + 6 => 'Grunge', + 7 => 'Hip-Hop', + 8 => 'Jazz', + 9 => 'Metal', + 10 => 'New Age', + 11 => 'Oldies', + 12 => 'Other', + 13 => 'Pop', + 14 => 'R&B', + 15 => 'Rap', + 16 => 'Reggae', + 17 => 'Rock', + 18 => 'Techno', + 19 => 'Industrial', + 20 => 'Alternative', + 21 => 'Ska', + 22 => 'Death Metal', + 23 => 'Pranks', + 24 => 'Soundtrack', + 25 => 'Euro-Techno', + 26 => 'Ambient', + 27 => 'Trip-Hop', + 28 => 'Vocal', + 29 => 'Jazz+Funk', + 30 => 'Fusion', + 31 => 'Trance', + 32 => 'Classical', + 33 => 'Instrumental', + 34 => 'Acid', + 35 => 'House', + 36 => 'Game', + 37 => 'Sound Clip', + 38 => 'Gospel', + 39 => 'Noise', + 40 => 'Alt. Rock', # (was AlternRock) + 41 => 'Bass', + 42 => 'Soul', + 43 => 'Punk', + 44 => 'Space', + 45 => 'Meditative', + 46 => 'Instrumental Pop', + 47 => 'Instrumental Rock', + 48 => 'Ethnic', + 49 => 'Gothic', + 50 => 'Darkwave', + 51 => 'Techno-Industrial', + 52 => 'Electronic', + 53 => 'Pop-Folk', + 54 => 'Eurodance', + 55 => 'Dream', + 56 => 'Southern Rock', + 57 => 'Comedy', + 58 => 'Cult', + 59 => 'Gangsta Rap', # (was Gansta) + 60 => 'Top 40', + 61 => 'Christian Rap', + 62 => 'Pop/Funk', + 63 => 'Jungle', + 64 => 'Native American', + 65 => 'Cabaret', + 66 => 'New Wave', + 67 => 'Psychedelic', # (was misspelt) + 68 => 'Rave', + 69 => 'Showtunes', + 70 => 'Trailer', + 71 => 'Lo-Fi', + 72 => 'Tribal', + 73 => 'Acid Punk', + 74 => 'Acid Jazz', + 75 => 'Polka', + 76 => 'Retro', + 77 => 'Musical', + 78 => 'Rock & Roll', + 79 => 'Hard Rock', + # The following genres are Winamp extensions + 80 => 'Folk', + 81 => 'Folk-Rock', + 82 => 'National Folk', + 83 => 'Swing', + 84 => 'Fast-Fusion', # (was Fast Fusion) + 85 => 'Bebop', # (was misspelt) + 86 => 'Latin', + 87 => 'Revival', + 88 => 'Celtic', + 89 => 'Bluegrass', + 90 => 'Avantgarde', + 91 => 'Gothic Rock', + 92 => 'Progressive Rock', + 93 => 'Psychedelic Rock', + 94 => 'Symphonic Rock', + 95 => 'Slow Rock', + 96 => 'Big Band', + 97 => 'Chorus', + 98 => 'Easy Listening', + 99 => 'Acoustic', + 100 => 'Humour', + 101 => 'Speech', + 102 => 'Chanson', + 103 => 'Opera', + 104 => 'Chamber Music', + 105 => 'Sonata', + 106 => 'Symphony', + 107 => 'Booty Bass', + 108 => 'Primus', + 109 => 'Porn Groove', + 110 => 'Satire', + 111 => 'Slow Jam', + 112 => 'Club', + 113 => 'Tango', + 114 => 'Samba', + 115 => 'Folklore', + 116 => 'Ballad', + 117 => 'Power Ballad', + 118 => 'Rhythmic Soul', + 119 => 'Freestyle', + 120 => 'Duet', + 121 => 'Punk Rock', + 122 => 'Drum Solo', + 123 => 'A Cappella', # (was Acapella) + 124 => 'Euro-House', + 125 => 'Dance Hall', + # ref http://yar.hole.ru/MP3Tech/lamedoc/id3.html + 126 => 'Goa', + 127 => 'Drum & Bass', + 128 => 'Club-House', + 129 => 'Hardcore', + 130 => 'Terror', + 131 => 'Indie', + 132 => 'BritPop', + 133 => 'Afro-Punk', # (was Negerpunk) + 134 => 'Polsk Punk', + 135 => 'Beat', + 136 => 'Christian Gangsta Rap', # (was Christian Gangsta) + 137 => 'Heavy Metal', + 138 => 'Black Metal', + 139 => 'Crossover', + 140 => 'Contemporary Christian', # (was Contemporary C) + 141 => 'Christian Rock', + 142 => 'Merengue', + 143 => 'Salsa', + 144 => 'Thrash Metal', + 145 => 'Anime', + 146 => 'JPop', + 147 => 'Synthpop', # (was SynthPop) + # ref http://alicja.homelinux.com/~mats/text/Music/MP3/ID3/Genres.txt + # (also used to update some Genres above) + 148 => 'Abstract', + 149 => 'Art Rock', + 150 => 'Baroque', + 151 => 'Bhangra', + 152 => 'Big Beat', + 153 => 'Breakbeat', + 154 => 'Chillout', + 155 => 'Downtempo', + 156 => 'Dub', + 157 => 'EBM', + 158 => 'Eclectic', + 159 => 'Electro', + 160 => 'Electroclash', + 161 => 'Emo', + 162 => 'Experimental', + 163 => 'Garage', + 164 => 'Global', + 165 => 'IDM', + 166 => 'Illbient', + 167 => 'Industro-Goth', + 168 => 'Jam Band', + 169 => 'Krautrock', + 170 => 'Leftfield', + 171 => 'Lounge', + 172 => 'Math Rock', + 173 => 'New Romantic', + 174 => 'Nu-Breakz', + 175 => 'Post-Punk', + 176 => 'Post-Rock', + 177 => 'Psytrance', + 178 => 'Shoegaze', + 179 => 'Space Rock', + 180 => 'Trop Rock', + 181 => 'World Music', + 182 => 'Neoclassical', + 183 => 'Audiobook', + 184 => 'Audio Theatre', + 185 => 'Neue Deutsche Welle', + 186 => 'Podcast', + 187 => 'Indie Rock', + 188 => 'G-Funk', + 189 => 'Dubstep', + 190 => 'Garage Rock', + 191 => 'Psybient', + 255 => 'None', + # ID3v2 adds some text short forms... + CR => 'Cover', + RX => 'Remix', +); + +# Tags for ID3v1 +%Image::ExifTool::ID3::v1 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 1 => 'ID3v1', 2 => 'Audio' }, + PRIORITY => 0, # let ID3v2 tags replace these if they come later + 3 => { + Name => 'Title', + Format => 'string[30]', + ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)', + }, + 33 => { + Name => 'Artist', + Groups => { 2 => 'Author' }, + Format => 'string[30]', + ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)', + }, + 63 => { + Name => 'Album', + Format => 'string[30]', + ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)', + }, + 93 => { + Name => 'Year', + Groups => { 2 => 'Time' }, + Format => 'string[4]', + }, + 97 => { + Name => 'Comment', + Format => 'string[30]', + ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)', + }, + 125 => { # ID3v1.1 (ref http://en.wikipedia.org/wiki/ID3#Layout) + Name => 'Track', + Format => 'int8u[2]', + Notes => 'v1.1 addition -- last 2 bytes of v1.0 Comment field', + RawConv => '($val =~ s/^0 // and $val) ? $val : undef', + }, + 127 => { + Name => 'Genre', + Notes => 'CR and RX are ID3v2 only', + Format => 'int8u', + PrintConv => \%genre, + PrintConvColumns => 3, + }, +); + +# ID3v1 "Enhanced TAG" information (ref 3) +%Image::ExifTool::ID3::v1_Enh = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 1 => 'ID3v1_Enh', 2 => 'Audio' }, + NOTES => 'ID3 version 1 "Enhanced TAG" information (not part of the official spec).', + PRIORITY => 0, # let ID3v2 tags replace these if they come later + 4 => { + Name => 'Title2', + Format => 'string[60]', + ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)', + }, + 64 => { + Name => 'Artist2', + Groups => { 2 => 'Author' }, + Format => 'string[60]', + ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)', + }, + 124 => { + Name => 'Album2', + Format => 'string[60]', + ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)', + }, + 184 => { + Name => 'Speed', + Format => 'int8u', + PrintConv => { + 1 => 'Slow', + 2 => 'Medium', + 3 => 'Fast', + 4 => 'Hardcore', + }, + }, + 185 => { + Name => 'Genre', + Format => 'string[30]', + ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)', + }, + 215 => { + Name => 'StartTime', + Format => 'string[6]', + }, + 221 => { + Name => 'EndTime', + Format => 'string[6]', + }, +); + +# Tags for ID2v2.2 +%Image::ExifTool::ID3::v2_2 = ( + PROCESS_PROC => \&Image::ExifTool::ID3::ProcessID3v2, + GROUPS => { 1 => 'ID3v2_2', 2 => 'Audio' }, + NOTES => q{ + ExifTool extracts mainly text-based tags from ID3v2 information. The tags + in the tables below are those extracted by ExifTool, and don't represent a + complete list of available ID3v2 tags. + + ID3 version 2.2 tags. (These are the tags written by iTunes 5.0.) + }, + CNT => 'PlayCounter', + COM => 'Comment', + IPL => 'InvolvedPeople', + PIC => { + Name => 'Picture', + Groups => { 2 => 'Preview' }, + Binary => 1, + Notes => 'the 3 tags below are also extracted from this PIC frame', + }, + 'PIC-1' => { Name => 'PictureFormat', Groups => { 2 => 'Image' } }, + 'PIC-2' => { + Name => 'PictureType', + Groups => { 2 => 'Image' }, + PrintConv => \%pictureType, + SeparateTable => 1, + }, + 'PIC-3' => { Name => 'PictureDescription', Groups => { 2 => 'Image' } }, + POP => { + Name => 'Popularimeter', + PrintConv => '$val=~s/^(.*?) (\d+) (\d+)$/$1 Rating=$2 Count=$3/s; $val', + }, + SLT => { + Name => 'SynLyrics', + SubDirectory => { TagTable => 'Image::ExifTool::ID3::SynLyrics' }, + }, + TAL => 'Album', + TBP => 'BeatsPerMinute', + TCM => 'Composer', + TCO =>{ + Name => 'Genre', + Notes => 'uses same lookup table as ID3v1 Genre', + PrintConv => 'Image::ExifTool::ID3::PrintGenre($val)', + }, + TCP => { Name => 'Compilation', PrintConv => { 0 => 'No', 1 => 'Yes' } }, # iTunes + TCR => { Name => 'Copyright', Groups => { 2 => 'Author' } }, + TDA => { Name => 'Date', Groups => { 2 => 'Time' } }, + TDY => 'PlaylistDelay', + TEN => 'EncodedBy', + TFT => 'FileType', + TIM => { Name => 'Time', Groups => { 2 => 'Time' } }, + TKE => 'InitialKey', + TLA => 'Language', + TLE => 'Length', + TMT => 'Media', + TOA => { Name => 'OriginalArtist', Groups => { 2 => 'Author' } }, + TOF => 'OriginalFileName', + TOL => 'OriginalLyricist', + TOR => 'OriginalReleaseYear', + TOT => 'OriginalAlbum', + TP1 => { Name => 'Artist', Groups => { 2 => 'Author' } }, + TP2 => 'Band', + TP3 => 'Conductor', + TP4 => 'InterpretedBy', + TPA => 'PartOfSet', + TPB => 'Publisher', + TRC => 'ISRC', # (international standard recording code) + TRD => 'RecordingDates', + TRK => 'Track', + TSI => 'Size', + TSS => 'EncoderSettings', + TT1 => 'Grouping', + TT2 => 'Title', + TT3 => 'Subtitle', + TXT => 'Lyricist', + TXX => 'UserDefinedText', + TYE => { Name => 'Year', Groups => { 2 => 'Time' } }, + ULT => 'Lyrics', + WAF => 'FileURL', + WAR => { Name => 'ArtistURL', Groups => { 2 => 'Author' } }, + WAS => 'SourceURL', + WCM => 'CommercialURL', + WCP => { Name => 'CopyrightURL', Groups => { 2 => 'Author' } }, + WPB => 'PublisherURL', + WXX => 'UserDefinedURL', + # the following written by iTunes 10.5 (ref PH) + RVA => 'RelativeVolumeAdjustment', + TST => 'TitleSortOrder', + TSA => 'AlbumSortOrder', + TSP => 'PerformerSortOrder', + TS2 => 'AlbumArtistSortOrder', + TSC => 'ComposerSortOrder', + ITU => { Name => 'iTunesU', Description => 'iTunes U', Binary => 1, Unknown => 1 }, + PCS => { Name => 'Podcast', Binary => 1, Unknown => 1 }, +); + +# tags common to ID3v2.3 and ID3v2.4 +my %id3v2_common = ( + # AENC => 'AudioEncryption', # Owner, preview start, preview length, encr data + APIC => { + Name => 'Picture', + Groups => { 2 => 'Preview' }, + Binary => 1, + Notes => 'the 3 tags below are also extracted from this APIC frame', + }, + 'APIC-1' => { Name => 'PictureMIMEType', Groups => { 2 => 'Image' } }, + 'APIC-2' => { + Name => 'PictureType', + Groups => { 2 => 'Image' }, + PrintConv => \%pictureType, + SeparateTable => 1, + }, + 'APIC-3' => { Name => 'PictureDescription', Groups => { 2 => 'Image' } }, + COMM => 'Comment', + # COMR => 'Commercial', + # ENCR => 'EncryptionMethod', + # ETCO => 'EventTimingCodes', + # GEOB => 'GeneralEncapsulatedObject', + # GRID => 'GroupIdentification', + # LINK => 'LinkedInformation', + MCDI => { Name => 'MusicCDIdentifier', Binary => 1 }, + # MLLT => 'MPEGLocationLookupTable', + OWNE => 'Ownership', + PCNT => 'PlayCounter', + POPM => { + Name => 'Popularimeter', + PrintConv => '$val=~s/^(.*?) (\d+) (\d+)$/$1 Rating=$2 Count=$3/s; $val', + }, + # POSS => 'PostSynchronization', + PRIV => { + Name => 'Private', + SubDirectory => { TagTable => 'Image::ExifTool::ID3::Private' }, + }, + # RBUF => 'RecommendedBufferSize', + # RVRB => 'Reverb', + SYLT => { + Name => 'SynLyrics', + SubDirectory => { TagTable => 'Image::ExifTool::ID3::SynLyrics' }, + }, + # SYTC => 'SynchronizedTempoCodes', + TALB => 'Album', + TBPM => 'BeatsPerMinute', + TCMP => { Name => 'Compilation', PrintConv => { 0 => 'No', 1 => 'Yes' } }, #PH (iTunes) + TCOM => 'Composer', + TCON =>{ + Name => 'Genre', + Notes => 'uses same lookup table as ID3v1 Genre', + PrintConv => 'Image::ExifTool::ID3::PrintGenre($val)', + }, + TCOP => { Name => 'Copyright', Groups => { 2 => 'Author' } }, + TDLY => 'PlaylistDelay', + TENC => 'EncodedBy', + TEXT => 'Lyricist', + TFLT => 'FileType', + TIT1 => 'Grouping', + TIT2 => 'Title', + TIT3 => 'Subtitle', + TKEY => 'InitialKey', + TLAN => 'Language', + TLEN => { + Name => 'Length', + ValueConv => '$val / 1000', + PrintConv => '"$val s"', + }, + TMED => 'Media', + TOAL => 'OriginalAlbum', + TOFN => 'OriginalFileName', + TOLY => 'OriginalLyricist', + TOPE => { Name => 'OriginalArtist', Groups => { 2 => 'Author' } }, + TOWN => 'FileOwner', + TPE1 => { Name => 'Artist', Groups => { 2 => 'Author' } }, + TPE2 => 'Band', + TPE3 => 'Conductor', + TPE4 => 'InterpretedBy', + TPOS => 'PartOfSet', + TPUB => 'Publisher', + TRCK => 'Track', + TRSN => 'InternetRadioStationName', + TRSO => 'InternetRadioStationOwner', + TSRC => 'ISRC', # (international standard recording code) + TSSE => 'EncoderSettings', + TXXX => 'UserDefinedText', + # UFID => 'UniqueFileID', (not extracted because it is long and nasty and not very useful) + USER => 'TermsOfUse', + USLT => 'Lyrics', + WCOM => 'CommercialURL', + WCOP => 'CopyrightURL', + WOAF => 'FileURL', + WOAR => { Name => 'ArtistURL', Groups => { 2 => 'Author' } }, + WOAS => 'SourceURL', + WORS => 'InternetRadioStationURL', + WPAY => 'PaymentURL', + WPUB => 'PublisherURL', + WXXX => 'UserDefinedURL', +# +# non-standard frames +# + # the following are written by iTunes 10.5 (ref PH) + TSO2 => 'AlbumArtistSortOrder', + TSOC => 'ComposerSortOrder', + ITNU => { Name => 'iTunesU', Description => 'iTunes U', Binary => 1, Unknown => 1 }, + PCST => { Name => 'Podcast', Binary => 1, Unknown => 1 }, + # other proprietary Apple tags (ref http://help.mp3tag.de/main_tags.html) + TDES => 'PodcastDescription', + TGID => 'PodcastID', + WFED => 'PodcastURL', + TKWD => 'PodcastKeywords', + TCAT => 'PodcastCategory', + # more non-standard tags (ref http://eyed3.nicfit.net/compliance.html) + # NCON - unknown MusicMatch binary data + XDOR => { Name => 'OriginalReleaseTime',Groups => { 2 => 'Time' }, %dateTimeConv }, + XSOA => 'AlbumSortOrder', + XSOP => 'PerformerSortOrder', + XSOT => 'TitleSortOrder', + XOLY => { + Name => 'OlympusDSS', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::DSS' }, + }, + GRP1 => 'Grouping', + MVNM => 'MovementName', # (NC) + MVIN => 'MovementNumber', # (NC) +); + +# Tags for ID3v2.3 (http://www.id3.org/id3v2.3.0) +%Image::ExifTool::ID3::v2_3 = ( + PROCESS_PROC => \&Image::ExifTool::ID3::ProcessID3v2, + GROUPS => { 1 => 'ID3v2_3', 2 => 'Audio' }, + NOTES => q{ + ID3 version 2.3 tags. Includes some non-standard tags written by other + software. + }, + %id3v2_common, # include common tags + # EQUA => 'Equalization', + IPLS => 'InvolvedPeople', + # RVAD => 'RelativeVolumeAdjustment', + TDAT => { Name => 'Date', Groups => { 2 => 'Time' } }, + TIME => { Name => 'Time', Groups => { 2 => 'Time' } }, + TORY => 'OriginalReleaseYear', + TRDA => 'RecordingDates', + TSIZ => 'Size', + TYER => { Name => 'Year', Groups => { 2 => 'Time' } }, +); + +# Tags for ID3v2.4 (http://www.id3.org/id3v2.4.0-frames) +%Image::ExifTool::ID3::v2_4 = ( + PROCESS_PROC => \&Image::ExifTool::ID3::ProcessID3v2, + GROUPS => { 1 => 'ID3v2_4', 2 => 'Audio' }, + NOTES => q{ + ID3 version 2.4 tags. Includes some non-standard tags written by other + software. + }, + %id3v2_common, # include common tags + # EQU2 => 'Equalization', + RVA2 => 'RelativeVolumeAdjustment', + # SEEK => 'Seek', + # SIGN => 'Signature', + TDEN => { Name => 'EncodingTime', Groups => { 2 => 'Time' }, %dateTimeConv }, + TDOR => { Name => 'OriginalReleaseTime',Groups => { 2 => 'Time' }, %dateTimeConv }, + TDRC => { Name => 'RecordingTime', Groups => { 2 => 'Time' }, %dateTimeConv }, + TDRL => { Name => 'ReleaseTime', Groups => { 2 => 'Time' }, %dateTimeConv }, + TDTG => { Name => 'TaggingTime', Groups => { 2 => 'Time' }, %dateTimeConv }, + TIPL => 'InvolvedPeople', + TMCL => 'MusicianCredits', + TMOO => 'Mood', + TPRO => 'ProducedNotice', + TSOA => 'AlbumSortOrder', + TSOP => 'PerformerSortOrder', + TSOT => 'TitleSortOrder', + TSST => 'SetSubtitle', +); + +# Synchronized lyrics/text +%Image::ExifTool::ID3::SynLyrics = ( + GROUPS => { 1 => 'ID3', 2 => 'Audio' }, + VARS => { NO_ID => 1 }, + PROCESS_PROC => \&ProcessSynText, + NOTES => 'The following tags are extracted from synchronized lyrics/text frames.', + desc => { Name => 'SynchronizedLyricsDescription' }, + type => { + Name => 'SynchronizedLyricsType', + PrintConv => { + 0 => 'Other', + 1 => 'Lyrics', + 2 => 'Text Transcription', + 3 => 'Movement/part Name', + 4 => 'Events', + 5 => 'Chord', + 6 => 'Trivia/"pop-up" Information', + 7 => 'Web Page URL', + 8 => 'Image URL', + }, + }, + text => { + Name => 'SynchronizedLyricsText', + List => 1, + Notes => q{ + each list item has a leading time stamp in square brackets. Time stamps may + be in seconds with format [MM:SS.ss], or MPEG frames with format [FFFF], + depending on how this information was stored + }, + PrintConv => \&ConvertTimeStamp, + }, +); + +# ID3 PRIV tags (ref PH) +%Image::ExifTool::ID3::Private = ( + PROCESS_PROC => \&Image::ExifTool::ID3::ProcessPrivate, + GROUPS => { 1 => 'ID3', 2 => 'Audio' }, + VARS => { NO_ID => 1 }, + NOTES => q{ + ID3 private (PRIV) tags. ExifTool will decode any private tags found, even + if they do not appear in this table. + }, + XMP => { + SubDirectory => { + DirName => 'XMP', + TagTable => 'Image::ExifTool::XMP::Main', + }, + }, + PeakValue => { + ValueConv => 'length($val)==4 ? unpack("V",$val) : \$val', + }, + AverageLevel => { + ValueConv => 'length($val)==4 ? unpack("V",$val) : \$val', + }, + # Windows Media attributes ("/" in tag ID is converted to "_" by ProcessPrivate) + WM_WMContentID => { + Name => 'WM_ContentID', + ValueConv => 'require Image::ExifTool::ASF; Image::ExifTool::ASF::GetGUID($val)', + }, + WM_WMCollectionID => { + Name => 'WM_CollectionID', + ValueConv => 'require Image::ExifTool::ASF; Image::ExifTool::ASF::GetGUID($val)', + }, + WM_WMCollectionGroupID => { + Name => 'WM_CollectionGroupID', + ValueConv => 'require Image::ExifTool::ASF; Image::ExifTool::ASF::GetGUID($val)', + }, + WM_MediaClassPrimaryID => { + ValueConv => 'require Image::ExifTool::ASF; Image::ExifTool::ASF::GetGUID($val)', + }, + WM_MediaClassSecondaryID => { + ValueConv => 'require Image::ExifTool::ASF; Image::ExifTool::ASF::GetGUID($val)', + }, + WM_Provider => { + ValueConv => '$self->Decode($val,"UCS2","II")', #PH (NC) + }, + # there are lots more WM tags that could be decoded if I had samples or documentation - PH + # WM/AlbumArtist + # WM/AlbumTitle + # WM/Category + # WM/Composer + # WM/Conductor + # WM/ContentDistributor + # WM/ContentGroupDescription + # WM/EncodingTime + # WM/Genre + # WM/GenreID + # WM/InitialKey + # WM/Language + # WM/Lyrics + # WM/MCDI + # WM/MediaClassPrimaryID + # WM/MediaClassSecondaryID + # WM/Mood + # WM/ParentalRating + # WM/Period + # WM/ProtectionType + # WM/Provider + # WM/ProviderRating + # WM/ProviderStyle + # WM/Publisher + # WM/SubscriptionContentID + # WM/SubTitle + # WM/TrackNumber + # WM/UniqueFileIdentifier + # WM/WMCollectionGroupID + # WM/WMCollectionID + # WM/WMContentID + # WM/Writer + # WM/Year +); + +# lookup to check for existence of tags in other ID3 versions +my %otherTable = ( + \%Image::ExifTool::ID3::v2_4 => \%Image::ExifTool::ID3::v2_3, + \%Image::ExifTool::ID3::v2_3 => \%Image::ExifTool::ID3::v2_4, +); + +# ID3 Composite tags +%Image::ExifTool::ID3::Composite = ( + GROUPS => { 2 => 'Image' }, + DateTimeOriginal => { + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Priority => 0, + Desire => { + 0 => 'ID3:RecordingTime', + 1 => 'ID3:Year', + 2 => 'ID3:Date', + 3 => 'ID3:Time', + }, + ValueConv => q{ + return $val[0] if $val[0]; + return undef unless $val[1]; + return $val[1] unless $val[2] and $val[2] =~ /^(\d{2})(\d{2})$/; + $val[1] .= ":$1:$2"; + return $val[1] unless $val[3] and $val[3] =~ /^(\d{2})(\d{2})$/; + return "$val[1] $1:$2"; + }, + PrintConv => '$self->ConvertDateTime($val)', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::ID3'); + +# can't share tagInfo hashes between two tables, so we must make +# copies of the necessary hashes +{ + my $tag; + foreach $tag (keys %id3v2_common) { + next unless ref $id3v2_common{$tag} eq 'HASH'; + my %tagInfo = %{$id3v2_common{$tag}}; + # must also copy Groups hash if it exists + my $groups = $tagInfo{Groups}; + $tagInfo{Groups} = { %$groups } if $groups; + $Image::ExifTool::ID3::v2_4{$tag} = \%tagInfo; + } +} + +#------------------------------------------------------------------------------ +# Convert ID3v1 text to exiftool character set +# Inputs: 0) ExifTool object ref, 1) text string +# Returns: converted text +sub ConvertID3v1Text($$) +{ + my ($et, $val) = @_; + return $et->Decode($val, $et->Options('CharsetID3')); +} + +#------------------------------------------------------------------------------ +# Re-format time stamp in synchronized lyrics +# Inputs: 0) synchronized lyrics entry (eg. "[84.030]Da do do do") +# Returns: entry with formatted timestamp (eg. "[01:24.03]Da do do do") +sub ConvertTimeStamp($) +{ + my $val = shift; + # do nothing if this isn't a time stamp (frame count doesn't contain a decimal) + return $val unless $val =~ /^\[(\d+\.\d+)\]/g; + my $time = $1; + # print hours only if more than 60 minutes + my $h = int($time / 3600); + if ($h) { + $time -= $h * 3600; + $h = "$h:"; + } else { + $h = ''; + } + my $m = int($time / 60); + my $s = $time - $m * 60; + my $ss = sprintf('%05.2f', $s); + if ($ss >= 60) { + $ss = '00.00'; + ++$m >= 60 and $m -= 60, ++$h; + } + return sprintf('[%s%.2d:%s]', $h, $m, $ss) . substr($val, pos($val)); +} + +#------------------------------------------------------------------------------ +# Process ID3 synchronized lyrics/text +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +sub ProcessSynText($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + + $et->VerboseDir('SynLyrics', 0, length $$dataPt); + return unless length $$dataPt > 6; + + my ($enc,$lang,$timeCode,$type) = unpack('Ca3CC', $$dataPt); + $lang = lc $lang; + undef $lang if $lang !~ /^[a-z]{3}$/ or $lang eq 'eng'; + pos($$dataPt) = 6; + my ($termLen, $pat); + if ($enc == 1 or $enc == 2) { + $$dataPt =~ /\G(..)*?\0\0/sg or return; + $termLen = 2; + $pat = '\G(?:..)*?\0\0(....)'; + } else { + $$dataPt =~ /\0/g or return; + $termLen = 1; + $pat = '\0(....)'; + } + my $desc = substr($$dataPt, 6, pos($$dataPt) - 6 - $termLen); + $desc = DecodeString($et, $desc, $enc); + + my $tagInfo = $et->GetTagInfo($tagTablePtr, 'desc'); + $tagInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang) if $lang; + $et->HandleTag($tagTablePtr, 'type', $type); + $et->HandleTag($tagTablePtr, 'desc', $desc, TagInfo => $tagInfo); + $tagInfo = $et->GetTagInfo($tagTablePtr, 'text'); + $tagInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang) if $lang; + + for (;;) { + my $pos = pos $$dataPt; + last unless $$dataPt =~ /$pat/sg; + my $time = unpack('N', $1); + my $text = substr($$dataPt, $pos, pos($$dataPt) - $pos - 4 - $termLen); + $text = DecodeString($et, $text, $enc); + my $timeStr; + if ($timeCode == 2) { # time in ms + $timeStr = sprintf('%.3f', $time / 1000); + } else { # time in MPEG frames + $timeStr = sprintf('%.4d', $time); + $timeStr .= '?' if $timeCode != 1; + } + $et->HandleTag($tagTablePtr, 'text', "[$timeStr]$text", TagInfo => $tagInfo); + } +} + +#------------------------------------------------------------------------------ +# Process ID3 PRIV data +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +sub ProcessPrivate($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my ($tag, $start); + $et->VerboseDir('PRIV', 0, length $$dataPt); + if ($$dataPt =~ /^(.*?)\0/s) { + $tag = $1; + $start = length($tag) + 1; + } else { + $tag = ''; + $start = 0; + } + unless ($$tagTablePtr{$tag}) { + $tag =~ tr{/ }{_}d; # translate '/' to '_' and remove spaces + $tag = 'private' unless $tag =~ /^[-\w]{1,24}$/; + unless ($$tagTablePtr{$tag}) { + AddTagToTable($tagTablePtr, $tag, + { Name => ucfirst($tag), Binary => 1 }); + } + } + my $key = $et->HandleTag($tagTablePtr, $tag, undef, + Size => length($$dataPt) - $start, + Start => $start, + DataPt => $dataPt, + ); + # set group1 name + $et->SetGroup($key, $$et{ID3_Ver}) if $key; +} + +#------------------------------------------------------------------------------ +# Print ID3v2 Genre +# Inputs: TCON or TCO frame data +# Returns: Content type with decoded genre numbers +sub PrintGenre($) +{ + my $val = shift; + # make sure that %genre has an entry for all numbers we are interested in + # (genre numbers are in brackets for ID3v2.2 and v2.3) + while ($val =~ /\((\d+)\)/g) { + $genre{$1} or $genre{$1} = "Unknown ($1)"; + } + # (genre numbers are separated by nulls in ID3v2.4, + # but nulls are converted to '/' by DecodeString()) + while ($val =~ /(?:^|\/)(\d+)(\/|$)/g) { + $genre{$1} or $genre{$1} = "Unknown ($1)"; + } + $val =~ s/\((\d+)\)/\($genre{$1}\)/g; + $val =~ s/(^|\/)(\d+)(?=\/|$)/$1$genre{$2}/g; + $val =~ s/^\(([^)]+)\)\1?$/$1/; # clean up by removing brackets and duplicates + return $val; +} + +#------------------------------------------------------------------------------ +# Get Genre ID +# Inputs: 0) Genre name +# Returns: genre ID number, or undef +sub GetGenreID($) +{ + return Image::ExifTool::ReverseLookup(shift, \%genre); +} + +#------------------------------------------------------------------------------ +# Decode ID3 string +# Inputs: 0) ExifTool object reference +# 1) string beginning with encoding byte unless specified as argument +# 2) optional encoding (0=ISO-8859-1, 1=UTF-16 BOM, 2=UTF-16BE, 3=UTF-8) +# Returns: Decoded string in scalar context, or list of strings in list context +sub DecodeString($$;$) +{ + my ($et, $val, $enc) = @_; + return '' unless length $val; + unless (defined $enc) { + $enc = unpack('C', $val); + $val = substr($val, 1); # remove encoding byte + } + my @vals; + if ($enc == 0 or $enc == 3) { # ISO 8859-1 or UTF-8 + $val =~ s/\0+$//; # remove any null padding + # (must split before converting because conversion routines truncate at null) + @vals = split "\0", $val; + foreach $val (@vals) { + $val = $et->Decode($val, $enc ? 'UTF8' : 'Latin'); + } + } elsif ($enc == 1 or $enc == 2) { # UTF-16 with BOM, or UTF-16BE + my $bom = "\xfe\xff"; + my %order = ( "\xfe\xff" => 'MM', "\xff\xfe", => 'II' ); + for (;;) { + my $v; + # split string at null terminators on word boundaries + if ($val =~ s/((..)*?)\0\0//s) { + $v = $1; + } else { + last unless length $val > 1; + $v = $val; + $val = ''; + } + $bom = $1 if $v =~ s/^(\xfe\xff|\xff\xfe)//; + push @vals, $et->Decode($v, 'UCS2', $order{$bom}); + } + } else { + $val =~ s/\0+$//; + return "<Unknown encoding $enc> $val"; + } + return @vals if wantarray; + return join('/',@vals); +} + +#------------------------------------------------------------------------------ +# Convert sync-safe integer to a number we can use +# Inputs: 0) int32u sync-safe value +# Returns: actual number or undef on invalid value +sub UnSyncSafe($) +{ + my $val = shift; + return undef if $val & 0x80808080; + return ($val & 0x0000007f) | + (($val & 0x00007f00) >> 1) | + (($val & 0x007f0000) >> 2) | + (($val & 0x7f000000) >> 3); +} + +#------------------------------------------------------------------------------ +# Process ID3v2 information +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +sub ProcessID3v2($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $offset = $$dirInfo{DirStart}; + my $size = $$dirInfo{DirLen}; + my $vers = $$dirInfo{Version}; + my $verbose = $et->Options('Verbose'); + my $len; # frame data length + + $et->VerboseDir($tagTablePtr->{GROUPS}->{1}, 0, $size); + $et->VerboseDump($dataPt, Len => $size, Start => $offset); + + for (;;$offset+=$len) { + my ($id, $flags, $hi); + if ($vers < 0x0300) { + # version 2.2 frame header is 6 bytes + last if $offset + 6 > $size; + ($id, $hi, $len) = unpack("x${offset}a3Cn",$$dataPt); + last if $id eq "\0\0\0"; + $len += $hi << 16; + $offset += 6; + } else { + # version 2.3/2.4 frame header is 10 bytes + last if $offset + 10 > $size; + ($id, $len, $flags) = unpack("x${offset}a4Nn",$$dataPt); + last if $id eq "\0\0\0\0"; + $offset += 10; + # length is a "sync-safe" integer by the ID3v2.4 specification, but + # reportedly some versions of iTunes write this as a normal integer + # (ref http://www.id3.org/iTunes) + while ($vers >= 0x0400 and $len > 0x7f and not $len & 0x80808080) { + my $oldLen = $len; + $len = UnSyncSafe($len); + if (not defined $len or $offset + $len + 10 > $size) { + $et->Warn('Invalid ID3 frame size'); + last; + } + # check next ID to see if it makes sense + my $nextID = substr($$dataPt, $offset + $len, 4); + last if $$tagTablePtr{$nextID}; + # try again with the incorrect length word (patch for iTunes bug) + last if $offset + $oldLen + 10 > $size; + $nextID = substr($$dataPt, $offset + $len, 4); + $len = $oldLen if $$tagTablePtr{$nextID}; + last; # yes, "while" was really a "goto" in disguise + } + } + last if $offset + $len > $size; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $id); + unless ($tagInfo) { + my $otherTable = $otherTable{$tagTablePtr}; + $tagInfo = $et->GetTagInfo($otherTable, $id) if $otherTable; + if ($tagInfo) { + $et->WarnOnce("Frame '${id}' is not valid for this ID3 version", 1); + } else { + next unless $verbose or $et->Options('Unknown'); + $id =~ tr/-A-Za-z0-9_//dc; + $id = 'unknown' unless length $id; + unless ($$tagTablePtr{$id}) { + $tagInfo = { Name => "ID3_$id", Binary => 1 }; + AddTagToTable($tagTablePtr, $id, $tagInfo); + } + } + } + # decode v2.3 and v2.4 flags + my (%flags, %extra); + if ($flags) { + if ($vers < 0x0400) { + # version 2.3 flags + $flags & 0x80 and $flags{Compress} = 1; + $flags & 0x40 and $flags{Encrypt} = 1; + $flags & 0x20 and $flags{GroupID} = 1; + } else { + # version 2.4 flags + $flags & 0x40 and $flags{GroupID} = 1; + $flags & 0x08 and $flags{Compress} = 1; + $flags & 0x04 and $flags{Encrypt} = 1; + $flags & 0x02 and $flags{Unsync} = 1; + $flags & 0x01 and $flags{DataLen} = 1; + } + } + if ($flags{Encrypt}) { + $et->WarnOnce('Encrypted frames currently not supported'); + next; + } + # extract the value + my $val = substr($$dataPt, $offset, $len); + + # reverse the unsynchronization + $val =~ s/\xff\x00/\xff/g if $flags{Unsync}; + + # read grouping identity + if ($flags{GroupID}) { + length($val) >= 1 or $et->Warn("Short $id frame"), next; + $val = substr($val, 1); # (ignore it) + } + # read data length + my $dataLen; + if ($flags{DataLen} or $flags{Compress}) { + length($val) >= 4 or $et->Warn("Short $id frame"), next; + $dataLen = unpack('N', $val); # save the data length word + $val = substr($val, 4); + } + # uncompress data + if ($flags{Compress}) { + if (eval { require Compress::Zlib }) { + my $inflate = Compress::Zlib::inflateInit(); + my ($buff, $stat); + $inflate and ($buff, $stat) = $inflate->inflate($val); + if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) { + $val = $buff; + } else { + $et->Warn("Error inflating $id frame"); + next; + } + } else { + $et->WarnOnce('Install Compress::Zlib to decode compressed frames'); + next; + } + } + # validate data length + if (defined $dataLen) { + $dataLen = UnSyncSafe($dataLen); + defined $dataLen or $et->Warn("Invalid length for $id frame"), next; + $dataLen == length($val) or $et->Warn("Wrong length for $id frame"), next; + } + unless ($tagInfo) { + next unless $verbose; + %flags and $extra{Extra} = ', Flags=' . join(',', sort keys %flags); + $et->VerboseInfo($id, $tagInfo, + Table => $tagTablePtr, + Value => $val, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + Size => $len, + Start => $offset, + %extra + ); + next; + } +# +# decode data in this frame (it is bad form to hard-code these, but the ID3 frame formats +# are so variable that it would be more work to define format types for each of them) +# + my $lang; + my $valLen = length($val); # actual value length (after decompression, etc) + if ($id =~ /^(TXX|TXXX)$/) { + # two encoded strings separated by a null + my @vals = DecodeString($et, $val); + foreach (0..1) { $vals[$_] = '' unless defined $vals[$_]; } + ($val = "($vals[0]) $vals[1]") =~ s/^\(\) //; + } elsif ($id =~ /^T/ or $id =~ /^(IPL|IPLS)$/) { + $val = DecodeString($et, $val); + } elsif ($id =~ /^(WXX|WXXX)$/) { + # one encoded string and one Latin string separated by a null + my $enc = unpack('C', $val); + my $url; + if ($enc == 1 or $enc == 2) { + ($val, $url) = ($val =~ /^(.(?:..)*?)\0\0(.*)/s); + } else { + ($val, $url) = ($val =~ /^(..*?)\0(.*)/s); + } + unless (defined $val and defined $url) { + $et->Warn("Invalid $id frame value"); + next; + } + $val = DecodeString($et, $val); + $url =~ s/\0.*//s; + $val = length($val) ? "($val) $url" : $url; + } elsif ($id =~ /^W/) { + $val =~ s/\0.*//s; # truncate at null + } elsif ($id =~ /^(COM|COMM|ULT|USLT)$/) { + $valLen > 4 or $et->Warn("Short $id frame"), next; + $lang = substr($val,1,3); + my @vals = DecodeString($et, substr($val,4), Get8u(\$val,0)); + foreach (0..1) { $vals[$_] = '' unless defined $vals[$_]; } + $val = length($vals[0]) ? "($vals[0]) $vals[1]" : $vals[1]; + } elsif ($id eq 'USER') { + $valLen > 4 or $et->Warn("Short $id frame"), next; + $lang = substr($val,1,3); + $val = DecodeString($et, substr($val,4), Get8u(\$val,0)); + } elsif ($id =~ /^(CNT|PCNT)$/) { + $valLen >= 4 or $et->Warn("Short $id frame"), next; + my ($cnt, @xtra) = unpack('NC*', $val); + $cnt = ($cnt << 8) + $_ foreach @xtra; + $val = $cnt; + } elsif ($id =~ /^(PIC|APIC)$/) { + $valLen >= 4 or $et->Warn("Short $id frame"), next; + my ($hdr, $attr); + my $enc = unpack('C', $val); + if ($enc == 1 or $enc == 2) { + $hdr = ($id eq 'PIC') ? ".(...)(.)((?:..)*?)\0\0" : ".(.*?)\0(.)((?:..)*?)\0\0"; + } else { + $hdr = ($id eq 'PIC') ? ".(...)(.)(.*?)\0" : ".(.*?)\0(.)(.*?)\0"; + } + # remove header (encoding, image format or MIME type, picture type, description) + $val =~ s/^$hdr//s or $et->Warn("Invalid $id frame"), next; + my @attrs = ($1, ord($2), DecodeString($et, $3, $enc)); + my $i = 1; + foreach $attr (@attrs) { + # must store descriptions even if they are empty to maintain + # sync between copy numbers when multiple images + $et->HandleTag($tagTablePtr, "$id-$i", $attr); + ++$i; + } + } elsif ($id eq 'POP' or $id eq 'POPM') { + # _email, 00, rating(1), counter(4-N) + my ($email, $dat) = ($val =~ /^([^\0]*)\0(.*)$/s); + unless (defined $dat and length($dat)) { + $et->Warn("Invalid $id frame"); + next; + } + my ($rating, @xtra) = unpack('C*', $dat); + my $cnt = 0; + $cnt = ($cnt << 8) + $_ foreach @xtra; + $val = "$email $rating $cnt"; + } elsif ($id eq 'OWNE') { + # enc(1), _price, 00, _date(8), Seller + my @strs = DecodeString($et, $val); + $strs[1] =~ s/^(\d{4})(\d{2})(\d{2})/$1:$2:$3 /s if $strs[1]; # format date + $val = "@strs"; + } elsif ($id eq 'RVA' or $id eq 'RVAD') { + my @dat = unpack('C*', $val); + my $flag = shift @dat; + my $bits = shift @dat or $et->Warn("Short $id frame"), next; + my $bytes = int(($bits + 7) / 8); + my @parse = (['Right',0,2,0x01],['Left',1,3,0x02],['Back-right',4,6,0x04], + ['Back-left',5,7,0x08],['Center',8,9,0x10],['Bass',10,11,0x20]); + $val = ''; + while (@parse) { + my $elem = shift @parse; + my $j = $$elem[2] * $bytes; + last if scalar(@dat) < $j + $bytes; + my $i = $$elem[1] * $bytes; + $val .= ', ' if $val; + my ($rel, $pk, $b); + for ($rel=0, $pk=0, $b=0; $b<$bytes; ++$b) { + $rel = $rel * 256 + $dat[$i + $b]; + $pk = $pk * 256 + $dat[$j + $b]; # (peak - not used in printout) + } + $rel =-$rel unless $flag & $$elem[3]; + $val .= sprintf("%+.1f%% %s", 100 * $rel / ((1<<$bits)-1), $$elem[0]); + } + } elsif ($id eq 'RVA2') { + my ($pos, $id) = $val=~/^([^\0]*)\0/s ? (length($1)+1, $1) : (1, ''); + my @vals; + while ($pos + 4 <= $valLen) { + my $type = Get8u(\$val, $pos); + my $str = ({ + 0 => 'Other', + 1 => 'Master', + 2 => 'Front-right', + 3 => 'Front-left', + 4 => 'Back-right', + 5 => 'Back-left', + 6 => 'Front-centre', + 7 => 'Back-centre', + 8 => 'Subwoofer', + }->{$type} || "Unknown($type)"); + my $db = Get16s(\$val,$pos+1) / 512; + # convert dB to percent as displayed by iTunes 10.5 + # (not sure why I need to divide by 20 instead of 10 as expected - PH) + push @vals, sprintf('%+.1f%% %s', 10**($db/20+2)-100, $str); + # step to next channel (ignoring peak volume) + $pos += 4 + int((Get8u(\$val,$pos+3) + 7) / 8); + } + $val = join ', ', @vals; + $val .= " ($id)" if $id; + } elsif ($id eq 'PRIV') { + # save version number to set group1 name for tag later + $$et{ID3_Ver} = $$tagTablePtr{GROUPS}{1}; + $et->HandleTag($tagTablePtr, $id, $val); + next; + } elsif ($$tagInfo{Format} or $$tagInfo{SubDirectory}) { + $et->HandleTag($tagTablePtr, $id, undef, DataPt => \$val); + next; + } elsif ($id eq 'GRP1' or $id eq 'MVNM' or $id eq 'MVIN') { + $val =~ s/(^\0+|\0+$)//g; # (PH guess) + } elsif (not $$tagInfo{Binary}) { + $et->Warn("Don't know how to handle $id frame"); + next; + } + if ($lang and $lang =~ /^[a-z]{3}$/i and $lang ne 'eng') { + $tagInfo = Image::ExifTool::GetLangInfo($tagInfo, lc $lang); + } + %flags and $extra{Extra} = ', Flags=' . join(',', sort keys %flags); + $et->HandleTag($tagTablePtr, $id, $val, + TagInfo => $tagInfo, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + Size => $len, + Start => $offset, + %extra + ); + } +} + +#------------------------------------------------------------------------------ +# Extract ID3 information from an audio file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this file didn't contain ID3 information +# - also processes audio data if any ID3 information was found +# - sets ExifTool DoneID3 to 1 when called, or to trailer size if an ID3v1 trailer exists +sub ProcessID3($$) +{ + my ($et, $dirInfo) = @_; + + return 0 if $$et{DoneID3}; # avoid infinite recursion + $$et{DoneID3} = 1; + + # allow this to be called with either RAF or DataPt + my $raf = $$dirInfo{RAF} || new File::RandomAccess($$dirInfo{DataPt}); + my ($buff, %id3Header, %id3Trailer, $hBuff, $tBuff, $eBuff, $tagTablePtr); + my $rtnVal = 0; + my $hdrEnd = 0; + my $id3Len = 0; + + # read first 3 bytes of file + $raf->Seek(0, 0); + return 0 unless $raf->Read($buff, 3) == 3; +# +# identify ID3v2 header +# + while ($buff =~ /^ID3/) { + $rtnVal = 1; + $raf->Read($hBuff, 7) == 7 or $et->Warn('Short ID3 header'), last; + my ($vers, $flags, $size) = unpack('nCN', $hBuff); + $size = UnSyncSafe($size); + defined $size or $et->Warn('Invalid ID3 header'), last; + my $verStr = sprintf("2.%d.%d", $vers >> 8, $vers & 0xff); + if ($vers >= 0x0500) { + $et->Warn("Unsupported ID3 version: $verStr"); + last; + } + unless ($raf->Read($hBuff, $size) == $size) { + $et->Warn('Truncated ID3 data'); + last; + } + # this flag only indicates use of unsynchronized frames in ID3v2.4 + if ($flags & 0x80 and $vers < 0x0400) { + # reverse the unsynchronization + $hBuff =~ s/\xff\x00/\xff/g; + } + my $pos = 10; + if ($flags & 0x40) { + # skip the extended header + $size >= 4 or $et->Warn('Bad ID3 extended header'), last; + my $len = unpack('N', $hBuff); + if ($len > length($hBuff) - 4) { + $et->Warn('Truncated ID3 extended header'); + last; + } + $hBuff = substr($hBuff, $len + 4); + $pos += $len + 4; + } + if ($flags & 0x10) { + # ignore v2.4 footer (10 bytes long) + $raf->Seek(10, 1); + } + %id3Header = ( + DataPt => \$hBuff, + DataPos => $pos, + DirStart => 0, + DirLen => length($hBuff), + Version => $vers, + DirName => "ID3v$verStr", + ); + $id3Len += length($hBuff) + 10; + if ($vers >= 0x0400) { + $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v2_4'); + } elsif ($vers >= 0x0300) { + $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v2_3'); + } else { + $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v2_2'); + } + $hdrEnd = $raf->Tell(); + last; + } +# +# read ID3v1 trailer if it exists +# + my $trailSize = 0; + if ($raf->Seek(-128, 2) and $raf->Read($tBuff, 128) == 128 and $tBuff =~ /^TAG/) { + $trailSize = 128; + %id3Trailer = ( + DataPt => \$tBuff, + DataPos => $raf->Tell() - 128, + DirStart => 0, + DirLen => length($tBuff), + ); + $id3Len += length($tBuff); + $rtnVal = 1; + # load 'Enhanced TAG' information if available + my $eSize = 227; # size of ID3 Enhanced TAG info + if ($raf->Seek(-$trailSize - $eSize, 2) and $raf->Read($eBuff, $eSize) == $eSize and $eBuff =~ /^TAG+/) { + $id3Trailer{EnhancedTAG} = \$eBuff; + $trailSize += $eSize; + } + $$et{DoneID3} = $trailSize; # save trailer size + } +# +# read Lyrics3 trailer if it exists +# + if ($raf->Seek(-$trailSize-15, 2) and $raf->Read($buff, 15) == 15 and $buff =~ /^(.{6})LYRICS(END|200)$/) { + my $ver = $2; # Lyrics3 version ('END' for version 1) + my $len = ($ver eq 'END') ? 5100 : $1 + 15; # max Lyrics3 length + my $tbl = GetTagTable('Image::ExifTool::ID3::Lyrics3'); + $len = $raf->Tell() if $len > $raf->Tell(); + if ($raf->Seek(-$len, 1) and $raf->Read($buff, $len) == $len and $buff =~ /LYRICSBEGIN/g) { + my $pos = pos($buff); + $$et{DoneID3} = $trailSize + $len - $pos + 11; # update trailer length + my $oldIndent = $$et{INDENT}; + $$et{INDENT} .= '| '; + if ($et->Options('Verbose')) { + $et->VPrint(0, "Lyrics3:\n"); + $et->VerboseDir('Lyrics3', undef, $len); + if ($pos > 11) { + $buff = substr($buff, $pos - 11); + $pos = 11; + } + $et->VerboseDump(\$buff); + } + if ($ver eq 'END') { + # Lyrics3 v1.00 + my $val = substr($buff, $pos, $len - $pos - 9); + $et->HandleTag($tbl, 'LYR', $et->Decode($val, 'Latin')); + } else { + # Lyrics3 v2.00 + for (;;) { + # (note: the size field is 5 digits,, not 6 as per the documentation) + last unless $buff =~ /\G(.{3})(\d{5})/g; + my ($tag, $size) = ($1, $2); + $pos += 8; + last if $pos + $size > length($buff); + unless ($$tbl{$tag}) { + AddTagToTable($tbl, $tag, { Name => Image::ExifTool::MakeTagName("Lyrics3_$tag") }); + } + $et->HandleTag($tbl, $tag, $et->Decode(substr($buff, $pos, $size), 'Latin')); + $pos += $size; + pos($buff) = $pos; + } + $pos == length($buff) - 15 or $et->Warn('Malformed Lyrics3 v2.00 block'); + } + $$et{INDENT} = $oldIndent; + } else { + $et->Warn('Error reading Lyrics3 trailer'); + } + } +# +# process the the information +# + if ($rtnVal) { + # first process audio data if it exists + if ($$dirInfo{RAF}) { + my $oldType = $$et{FILE_TYPE}; # save file type + # check current file type first + my @types = grep /^$oldType$/, @audioFormats; + push @types, grep(!/^$oldType$/, @audioFormats); + my $type; + foreach $type (@types) { + # seek to end of ID3 header + $raf->Seek($hdrEnd, 0); + # set type for this file if we are successful + $$et{FILE_TYPE} = $type; + my $module = $audioModule{$type} || $type; + require "Image/ExifTool/$module.pm" or next; + my $func = "Image::ExifTool::${module}::Process$type"; + # process the file + no strict 'refs'; + &$func($et, $dirInfo) and last; + use strict 'refs'; + } + $$et{FILE_TYPE} = $oldType; # restore original file type + } + # set file type to MP3 if we didn't find audio data + $et->SetFileType('MP3'); + # record the size of the ID3 metadata + $et->FoundTag('ID3Size', $id3Len); + # process ID3v2 header if it exists + if (%id3Header) { + $et->VPrint(0, "$id3Header{DirName}:\n"); + $et->ProcessDirectory(\%id3Header, $tagTablePtr); + } + # process ID3v1 trailer if it exists + if (%id3Trailer) { + $et->VPrint(0, "ID3v1:\n"); + SetByteOrder('MM'); + $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v1'); + $et->ProcessDirectory(\%id3Trailer, $tagTablePtr); + # process "Enhanced TAG" information if available + if ($id3Trailer{EnhancedTAG}) { + $et->VPrint(0, "ID3v1 Enhanced TAG:\n"); + $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v1_Enh'); + $id3Trailer{DataPt} = $id3Trailer{EnhancedTAG}; + $id3Trailer{DataPos} -= 227; # (227 = length of Enhanced TAG block) + $id3Trailer{DirLen} = 227; + $et->ProcessDirectory(\%id3Trailer, $tagTablePtr); + } + } + } + # return file pointer to start of file to read audio data if necessary + $raf->Seek(0, 0); + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Process ID3 directory +# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) dummy tag table ref +sub ProcessID3Dir($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et->VerboseDir('ID3', undef, length ${$$dirInfo{DataPt}}); + return ProcessID3($et, $dirInfo); +} + +#------------------------------------------------------------------------------ +# Extract ID3 information from an MP3 audio file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid MP3 file +sub ProcessMP3($$) +{ + my ($et, $dirInfo) = @_; + my $rtnVal = 0; + + # must first check for leading/trailing ID3 information + # (and process the rest of the file if found) + unless ($$et{DoneID3}) { + $rtnVal = ProcessID3($et, $dirInfo); + } + + # check for MPEG A/V data if not already processed above + unless ($rtnVal) { + my $raf = $$dirInfo{RAF}; + my $buff; +# +# extract information from first audio/video frame headers +# (if found in the first $scanLen bytes) +# + # scan further into a file that should be an MP3 + my $scanLen = ($$et{FILE_EXT} and $$et{FILE_EXT} eq 'MP3') ? 8192 : 256; + if ($raf->Read($buff, $scanLen)) { + require Image::ExifTool::MPEG; + if ($buff =~ /\0\0\x01(\xb3|\xc0)/) { + # look for A/V headers in first 64kB + my $buf2; + $raf->Read($buf2, 0x10000 - $scanLen) and $buff .= $buf2; + $rtnVal = 1 if Image::ExifTool::MPEG::ParseMPEGAudioVideo($et, \$buff); + } else { + # look for audio frame sync in first $scanLen bytes + # (set MP3 flag to 1 so this will fail unless layer 3 audio) + my $ext = $$et{FILE_EXT} || ''; + my $mp3 = ($ext eq 'MUS') ? 0 : 1; # MUS files are MP2 + $rtnVal = 1 if Image::ExifTool::MPEG::ParseMPEGAudio($et, \$buff, $mp3); + } + } + } + + # check for an APE trailer if this was a valid A/V file and we haven't already done it + if ($rtnVal and not $$et{DoneAPE}) { + require Image::ExifTool::APE; + Image::ExifTool::APE::ProcessAPE($et, $dirInfo); + } + return $rtnVal; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::ID3 - Read ID3 meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract ID3 +information from audio files. ID3 information is found in MP3 and various +other types of audio files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://id3.org/> + +=item L<http://www.mp3-tech.org/> + +=item L<http://www.fortunecity.com/underworld/sonic/3/id3tag.html> + +=item L<https://id3.org/Lyrics3> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/ID3 Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/IPTC.pm b/lib/Image/ExifTool/IPTC.pm new file mode 100644 index 0000000..3cf723f --- /dev/null +++ b/lib/Image/ExifTool/IPTC.pm @@ -0,0 +1,1301 @@ +#------------------------------------------------------------------------------ +# File: IPTC.pm +# +# Description: Read IPTC meta information +# +# Revisions: Jan. 08/2003 - P. Harvey Created +# Feb. 05/2004 - P. Harvey Added support for records other than 2 +# +# References: 1) http://www.iptc.org/IIM/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::IPTC; + +use strict; +use vars qw($VERSION $AUTOLOAD %iptcCharset); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.57'; + +%iptcCharset = ( + "\x1b%G" => 'UTF8', + # don't translate these (at least until we handle ISO 2022 shift codes) + # because the sets are only designated and not invoked + # "\x1b,A" => 'Latin', # G0 = ISO 8859-1 (similar to Latin1, but codes 0x80-0x9f are missing) + # "\x1b-A" => 'Latin', # G1 " + # "\x1b.A" => 'Latin', # G2 + # "\x1b/A" => 'Latin', # G3 +); + +sub ProcessIPTC($$$); +sub WriteIPTC($$$); +sub CheckIPTC($$$); +sub PrintCodedCharset($); +sub PrintInvCodedCharset($); + +# standard IPTC locations +# (MWG specifies locations only for JPEG, TIFF and PSD -- the rest are ExifTool-defined) +my %isStandardIPTC = ( + 'JPEG-APP13-Photoshop-IPTC' => 1, + 'TIFF-IFD0-IPTC' => 1, + 'PSD-IPTC' => 1, + 'MIE-IPTC' => 1, + 'EPS-Photoshop-IPTC' => 1, + 'PS-Photoshop-IPTC' => 1, + 'EXV-APP13-Photoshop-IPTC' => 1, + # set file types to 0 if they have a standard location + JPEG => 0, + TIFF => 0, + PSD => 0, + MIE => 0, + EPS => 0, + PS => 0, + EXV => 0, +); + +my %fileFormat = ( + 0 => 'No ObjectData', + 1 => 'IPTC-NAA Digital Newsphoto Parameter Record', + 2 => 'IPTC7901 Recommended Message Format', + 3 => 'Tagged Image File Format (Adobe/Aldus Image data)', + 4 => 'Illustrator (Adobe Graphics data)', + 5 => 'AppleSingle (Apple Computer Inc)', + 6 => 'NAA 89-3 (ANPA 1312)', + 7 => 'MacBinary II', + 8 => 'IPTC Unstructured Character Oriented File Format (UCOFF)', + 9 => 'United Press International ANPA 1312 variant', + 10 => 'United Press International Down-Load Message', + 11 => 'JPEG File Interchange (JFIF)', + 12 => 'Photo-CD Image-Pac (Eastman Kodak)', + 13 => 'Bit Mapped Graphics File [.BMP] (Microsoft)', + 14 => 'Digital Audio File [.WAV] (Microsoft & Creative Labs)', + 15 => 'Audio plus Moving Video [.AVI] (Microsoft)', + 16 => 'PC DOS/Windows Executable Files [.COM][.EXE]', + 17 => 'Compressed Binary File [.ZIP] (PKWare Inc)', + 18 => 'Audio Interchange File Format AIFF (Apple Computer Inc)', + 19 => 'RIFF Wave (Microsoft Corporation)', + 20 => 'Freehand (Macromedia/Aldus)', + 21 => 'Hypertext Markup Language [.HTML] (The Internet Society)', + 22 => 'MPEG 2 Audio Layer 2 (Musicom), ISO/IEC', + 23 => 'MPEG 2 Audio Layer 3, ISO/IEC', + 24 => 'Portable Document File [.PDF] Adobe', + 25 => 'News Industry Text Format (NITF)', + 26 => 'Tape Archive [.TAR]', + 27 => 'Tidningarnas Telegrambyra NITF version (TTNITF DTD)', + 28 => 'Ritzaus Bureau NITF version (RBNITF DTD)', + 29 => 'Corel Draw [.CDR]', +); + +# main IPTC tag table +# Note: ALL entries in main IPTC table (except PROCESS_PROC) must be SubDirectory +# entries, each specifying a TagTable. +%Image::ExifTool::IPTC::Main = ( + GROUPS => { 2 => 'Image' }, + PROCESS_PROC => \&ProcessIPTC, + WRITE_PROC => \&WriteIPTC, + 1 => { + Name => 'IPTCEnvelope', + SubDirectory => { + TagTable => 'Image::ExifTool::IPTC::EnvelopeRecord', + }, + }, + 2 => { + Name => 'IPTCApplication', + SubDirectory => { + TagTable => 'Image::ExifTool::IPTC::ApplicationRecord', + }, + }, + 3 => { + Name => 'IPTCNewsPhoto', + SubDirectory => { + TagTable => 'Image::ExifTool::IPTC::NewsPhoto', + }, + }, + 7 => { + Name => 'IPTCPreObjectData', + SubDirectory => { + TagTable => 'Image::ExifTool::IPTC::PreObjectData', + }, + }, + 8 => { + Name => 'IPTCObjectData', + SubDirectory => { + TagTable => 'Image::ExifTool::IPTC::ObjectData', + }, + }, + 9 => { + Name => 'IPTCPostObjectData', + Groups => { 1 => 'IPTC#' }, #(just so this shows up in group list) + SubDirectory => { + TagTable => 'Image::ExifTool::IPTC::PostObjectData', + }, + }, + 240 => { + Name => 'IPTCFotoStation', + SubDirectory => { + TagTable => 'Image::ExifTool::IPTC::FotoStation', + }, + }, +); + +# Record 1 -- EnvelopeRecord +%Image::ExifTool::IPTC::EnvelopeRecord = ( + GROUPS => { 2 => 'Other' }, + WRITE_PROC => \&WriteIPTC, + CHECK_PROC => \&CheckIPTC, + WRITABLE => 1, + 0 => { + Name => 'EnvelopeRecordVersion', + Format => 'int16u', + Mandatory => 1, + }, + 5 => { + Name => 'Destination', + Flags => 'List', + Groups => { 2 => 'Location' }, + Format => 'string[0,1024]', + }, + 20 => { + Name => 'FileFormat', + Groups => { 2 => 'Image' }, + Format => 'int16u', + PrintConv => \%fileFormat, + }, + 22 => { + Name => 'FileVersion', + Groups => { 2 => 'Image' }, + Format => 'int16u', + }, + 30 => { + Name => 'ServiceIdentifier', + Format => 'string[0,10]', + }, + 40 => { + Name => 'EnvelopeNumber', + Format => 'digits[8]', + }, + 50 => { + Name => 'ProductID', + Flags => 'List', + Format => 'string[0,32]', + }, + 60 => { + Name => 'EnvelopePriority', + Format => 'digits[1]', + PrintConv => { + 0 => '0 (reserved)', + 1 => '1 (most urgent)', + 2 => 2, + 3 => 3, + 4 => 4, + 5 => '5 (normal urgency)', + 6 => 6, + 7 => 7, + 8 => '8 (least urgent)', + 9 => '9 (user-defined priority)', + }, + }, + 70 => { + Name => 'DateSent', + Groups => { 2 => 'Time' }, + Format => 'digits[8]', + Shift => 'Time', + ValueConv => 'Image::ExifTool::Exif::ExifDate($val)', + ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)', + PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)', + }, + 80 => { + Name => 'TimeSent', + Groups => { 2 => 'Time' }, + Format => 'string[11]', + Shift => 'Time', + ValueConv => 'Image::ExifTool::Exif::ExifTime($val)', + ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)', + PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)', + }, + 90 => { + Name => 'CodedCharacterSet', + Notes => q{ + values are entered in the form "ESC X Y[, ...]". The escape sequence for + UTF-8 character coding is "ESC % G", but this is displayed as "UTF8" for + convenience. Either string may be used when writing. The value of this tag + affects the decoding of string values in the Application and NewsPhoto + records. This tag is marked as "unsafe" to prevent it from being copied by + default in a group operation because existing tags in the destination image + may use a different encoding. When creating a new IPTC record from scratch, + it is suggested that this be set to "UTF8" if special characters are a + possibility + }, + Protected => 1, + Format => 'string[0,32]', + ValueConvInv => '$val =~ /^UTF-?8$/i ? "\x1b%G" : $val', + # convert ISO 2022 escape sequences to a more readable format + PrintConv => \&PrintCodedCharset, + PrintConvInv => \&PrintInvCodedCharset, + }, + 100 => { + Name => 'UniqueObjectName', + Format => 'string[14,80]', + }, + 120 => { + Name => 'ARMIdentifier', + Format => 'int16u', + }, + 122 => { + Name => 'ARMVersion', + Format => 'int16u', + }, +); + +# Record 2 -- ApplicationRecord +%Image::ExifTool::IPTC::ApplicationRecord = ( + GROUPS => { 2 => 'Other' }, + WRITE_PROC => \&WriteIPTC, + CHECK_PROC => \&CheckIPTC, + WRITABLE => 1, + 0 => { + Name => 'ApplicationRecordVersion', + Format => 'int16u', + Mandatory => 1, + }, + 3 => { + Name => 'ObjectTypeReference', + Format => 'string[3,67]', + }, + 4 => { + Name => 'ObjectAttributeReference', + Flags => 'List', + Format => 'string[4,68]', + }, + 5 => { + Name => 'ObjectName', + Format => 'string[0,64]', + }, + 7 => { + Name => 'EditStatus', + Format => 'string[0,64]', + }, + 8 => { + Name => 'EditorialUpdate', + Format => 'digits[2]', + PrintConv => { + '01' => 'Additional language', + }, + }, + 10 => { + Name => 'Urgency', + Format => 'digits[1]', + PrintConv => { + 0 => '0 (reserved)', + 1 => '1 (most urgent)', + 2 => 2, + 3 => 3, + 4 => 4, + 5 => '5 (normal urgency)', + 6 => 6, + 7 => 7, + 8 => '8 (least urgent)', + 9 => '9 (user-defined priority)', + }, + }, + 12 => { + Name => 'SubjectReference', + Flags => 'List', + Format => 'string[13,236]', + }, + 15 => { + Name => 'Category', + Format => 'string[0,3]', + }, + 20 => { + Name => 'SupplementalCategories', + Flags => 'List', + Format => 'string[0,32]', + }, + 22 => { + Name => 'FixtureIdentifier', + Format => 'string[0,32]', + }, + 25 => { + Name => 'Keywords', + Flags => 'List', + Format => 'string[0,64]', + }, + 26 => { + Name => 'ContentLocationCode', + Flags => 'List', + Groups => { 2 => 'Location' }, + Format => 'string[3]', + }, + 27 => { + Name => 'ContentLocationName', + Flags => 'List', + Groups => { 2 => 'Location' }, + Format => 'string[0,64]', + }, + 30 => { + Name => 'ReleaseDate', + Groups => { 2 => 'Time' }, + Format => 'digits[8]', + Shift => 'Time', + ValueConv => 'Image::ExifTool::Exif::ExifDate($val)', + ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)', + PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)', + }, + 35 => { + Name => 'ReleaseTime', + Groups => { 2 => 'Time' }, + Format => 'string[11]', + Shift => 'Time', + ValueConv => 'Image::ExifTool::Exif::ExifTime($val)', + ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)', + PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)', + }, + 37 => { + Name => 'ExpirationDate', + Groups => { 2 => 'Time' }, + Format => 'digits[8]', + Shift => 'Time', + ValueConv => 'Image::ExifTool::Exif::ExifDate($val)', + ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)', + PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)', + }, + 38 => { + Name => 'ExpirationTime', + Groups => { 2 => 'Time' }, + Format => 'string[11]', + Shift => 'Time', + ValueConv => 'Image::ExifTool::Exif::ExifTime($val)', + ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)', + PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)', + }, + 40 => { + Name => 'SpecialInstructions', + Format => 'string[0,256]', + }, + 42 => { + Name => 'ActionAdvised', + Format => 'digits[2]', + PrintConv => { + '' => '', + '01' => 'Object Kill', + '02' => 'Object Replace', + '03' => 'Object Append', + '04' => 'Object Reference', + }, + }, + 45 => { + Name => 'ReferenceService', + Flags => 'List', + Format => 'string[0,10]', + }, + 47 => { + Name => 'ReferenceDate', + Groups => { 2 => 'Time' }, + Flags => 'List', + Format => 'digits[8]', + Shift => 'Time', + ValueConv => 'Image::ExifTool::Exif::ExifDate($val)', + ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)', + PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)', + }, + 50 => { + Name => 'ReferenceNumber', + Flags => 'List', + Format => 'digits[8]', + }, + 55 => { + Name => 'DateCreated', + Groups => { 2 => 'Time' }, + Format => 'digits[8]', + Shift => 'Time', + ValueConv => 'Image::ExifTool::Exif::ExifDate($val)', + ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)', + PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)', + }, + 60 => { + Name => 'TimeCreated', + Groups => { 2 => 'Time' }, + Format => 'string[11]', + Shift => 'Time', + ValueConv => 'Image::ExifTool::Exif::ExifTime($val)', + ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)', + PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)', + }, + 62 => { + Name => 'DigitalCreationDate', + Groups => { 2 => 'Time' }, + Format => 'digits[8]', + Shift => 'Time', + ValueConv => 'Image::ExifTool::Exif::ExifDate($val)', + ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)', + PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)', + }, + 63 => { + Name => 'DigitalCreationTime', + Groups => { 2 => 'Time' }, + Format => 'string[11]', + Shift => 'Time', + ValueConv => 'Image::ExifTool::Exif::ExifTime($val)', + ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)', + PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)', + }, + 65 => { + Name => 'OriginatingProgram', + Format => 'string[0,32]', + }, + 70 => { + Name => 'ProgramVersion', + Format => 'string[0,10]', + }, + 75 => { + Name => 'ObjectCycle', + Format => 'string[1]', + PrintConv => { + 'a' => 'Morning', + 'p' => 'Evening', + 'b' => 'Both Morning and Evening', + }, + }, + 80 => { + Name => 'By-line', + Flags => 'List', + Format => 'string[0,32]', + Groups => { 2 => 'Author' }, + }, + 85 => { + Name => 'By-lineTitle', + Flags => 'List', + Format => 'string[0,32]', + Groups => { 2 => 'Author' }, + }, + 90 => { + Name => 'City', + Format => 'string[0,32]', + Groups => { 2 => 'Location' }, + }, + 92 => { + Name => 'Sub-location', + Format => 'string[0,32]', + Groups => { 2 => 'Location' }, + }, + 95 => { + Name => 'Province-State', + Format => 'string[0,32]', + Groups => { 2 => 'Location' }, + }, + 100 => { + Name => 'Country-PrimaryLocationCode', + Format => 'string[3]', + Groups => { 2 => 'Location' }, + }, + 101 => { + Name => 'Country-PrimaryLocationName', + Format => 'string[0,64]', + Groups => { 2 => 'Location' }, + }, + 103 => { + Name => 'OriginalTransmissionReference', + Format => 'string[0,32]', + Notes => 'now used as a job identifier', + }, + 105 => { + Name => 'Headline', + Format => 'string[0,256]', + }, + 110 => { + Name => 'Credit', + Groups => { 2 => 'Author' }, + Format => 'string[0,32]', + }, + 115 => { + Name => 'Source', + Groups => { 2 => 'Author' }, + Format => 'string[0,32]', + }, + 116 => { + Name => 'CopyrightNotice', + Groups => { 2 => 'Author' }, + Format => 'string[0,128]', + }, + 118 => { + Name => 'Contact', + Flags => 'List', + Groups => { 2 => 'Author' }, + Format => 'string[0,128]', + }, + 120 => { + Name => 'Caption-Abstract', + Format => 'string[0,2000]', + }, + 121 => { + Name => 'LocalCaption', + Format => 'string[0,256]', # (guess) + Notes => q{ + I haven't found a reference for the format of tags 121, 184-188 and + 225-232, so I have just make them writable as strings with + reasonable length. Beware that if this is wrong, other utilities + may not be able to read these tags as written by ExifTool + }, + }, + 122 => { + Name => 'Writer-Editor', + Flags => 'List', + Groups => { 2 => 'Author' }, + Format => 'string[0,32]', + }, + 125 => { + Name => 'RasterizedCaption', + Format => 'undef[7360]', + Binary => 1, + }, + 130 => { + Name => 'ImageType', + Groups => { 2 => 'Image' }, + Format => 'string[2]', + }, + 131 => { + Name => 'ImageOrientation', + Groups => { 2 => 'Image' }, + Format => 'string[1]', + PrintConv => { + P => 'Portrait', + L => 'Landscape', + S => 'Square', + }, + }, + 135 => { + Name => 'LanguageIdentifier', + Format => 'string[2,3]', + }, + 150 => { + Name => 'AudioType', + Format => 'string[2]', + PrintConv => { + '1A' => 'Mono Actuality', + '2A' => 'Stereo Actuality', + '1C' => 'Mono Question and Answer Session', + '2C' => 'Stereo Question and Answer Session', + '1M' => 'Mono Music', + '2M' => 'Stereo Music', + '1Q' => 'Mono Response to a Question', + '2Q' => 'Stereo Response to a Question', + '1R' => 'Mono Raw Sound', + '2R' => 'Stereo Raw Sound', + '1S' => 'Mono Scener', + '2S' => 'Stereo Scener', + '0T' => 'Text Only', + '1V' => 'Mono Voicer', + '2V' => 'Stereo Voicer', + '1W' => 'Mono Wrap', + '2W' => 'Stereo Wrap', + }, + }, + 151 => { + Name => 'AudioSamplingRate', + Format => 'digits[6]', + }, + 152 => { + Name => 'AudioSamplingResolution', + Format => 'digits[2]', + }, + 153 => { + Name => 'AudioDuration', + Format => 'digits[6]', + }, + 154 => { + Name => 'AudioOutcue', + Format => 'string[0,64]', + }, + 184 => { + Name => 'JobID', + Format => 'string[0,64]', # (guess) + }, + 185 => { + Name => 'MasterDocumentID', + Format => 'string[0,256]', # (guess) + }, + 186 => { + Name => 'ShortDocumentID', + Format => 'string[0,64]', # (guess) + }, + 187 => { + Name => 'UniqueDocumentID', + Format => 'string[0,128]', # (guess) + }, + 188 => { + Name => 'OwnerID', + Format => 'string[0,128]', # (guess) + }, + 200 => { + Name => 'ObjectPreviewFileFormat', + Groups => { 2 => 'Image' }, + Format => 'int16u', + PrintConv => \%fileFormat, + }, + 201 => { + Name => 'ObjectPreviewFileVersion', + Groups => { 2 => 'Image' }, + Format => 'int16u', + }, + 202 => { + Name => 'ObjectPreviewData', + Groups => { 2 => 'Preview' }, + Format => 'undef[0,256000]', + Binary => 1, + }, + 221 => { + Name => 'Prefs', + Groups => { 2 => 'Image' }, + Format => 'string[0,64]', + Notes => 'PhotoMechanic preferences', + PrintConv => q{ + $val =~ s[\s*(\d+):\s*(\d+):\s*(\d+):\s*(\S*)] + [Tagged:$1, ColorClass:$2, Rating:$3, FrameNum:$4]; + return $val; + }, + PrintConvInv => q{ + $val =~ s[Tagged:\s*(\d+).*ColorClass:\s*(\d+).*Rating:\s*(\d+).*FrameNum:\s*(\S*)] + [$1:$2:$3:$4]is; + return $val; + }, + }, + 225 => { + Name => 'ClassifyState', + Format => 'string[0,64]', # (guess) + }, + 228 => { + Name => 'SimilarityIndex', + Format => 'string[0,32]', # (guess) + }, + 230 => { + Name => 'DocumentNotes', + Format => 'string[0,1024]', # (guess) + }, + 231 => { + Name => 'DocumentHistory', + Format => 'string[0,256]', # (guess) + ValueConv => '$val =~ s/\0+/\n/g; $val', # (have seen embedded nulls) + ValueConvInv => '$val', + }, + 232 => { + Name => 'ExifCameraInfo', + Format => 'string[0,4096]', # (guess) + }, + 255 => { #PH + Name => 'CatalogSets', + List => 1, + Format => 'string[0,256]', # (guess) + Notes => 'written by iView MediaPro', + }, +); + +# Record 3 -- News photo +%Image::ExifTool::IPTC::NewsPhoto = ( + GROUPS => { 2 => 'Image' }, + WRITE_PROC => \&WriteIPTC, + CHECK_PROC => \&CheckIPTC, + WRITABLE => 1, + 0 => { + Name => 'NewsPhotoVersion', + Format => 'int16u', + Mandatory => 1, + }, + 10 => { + Name => 'IPTCPictureNumber', + Format => 'string[16]', + Notes => '4 numbers: 1-Manufacturer ID, 2-Equipment ID, 3-Date, 4-Sequence', + PrintConv => 'Image::ExifTool::IPTC::ConvertPictureNumber($val)', + PrintConvInv => 'Image::ExifTool::IPTC::InvConvertPictureNumber($val)', + }, + 20 => { + Name => 'IPTCImageWidth', + Format => 'int16u', + }, + 30 => { + Name => 'IPTCImageHeight', + Format => 'int16u', + }, + 40 => { + Name => 'IPTCPixelWidth', + Format => 'int16u', + }, + 50 => { + Name => 'IPTCPixelHeight', + Format => 'int16u', + }, + 55 => { + Name => 'SupplementalType', + Format => 'int8u', + PrintConv => { + 0 => 'Main Image', + 1 => 'Reduced Resolution Image', + 2 => 'Logo', + 3 => 'Rasterized Caption', + }, + }, + 60 => { + Name => 'ColorRepresentation', + Format => 'int16u', + PrintHex => 1, + PrintConv => { + 0x000 => 'No Image, Single Frame', + 0x100 => 'Monochrome, Single Frame', + 0x300 => '3 Components, Single Frame', + 0x301 => '3 Components, Frame Sequential in Multiple Objects', + 0x302 => '3 Components, Frame Sequential in One Object', + 0x303 => '3 Components, Line Sequential', + 0x304 => '3 Components, Pixel Sequential', + 0x305 => '3 Components, Special Interleaving', + 0x400 => '4 Components, Single Frame', + 0x401 => '4 Components, Frame Sequential in Multiple Objects', + 0x402 => '4 Components, Frame Sequential in One Object', + 0x403 => '4 Components, Line Sequential', + 0x404 => '4 Components, Pixel Sequential', + 0x405 => '4 Components, Special Interleaving', + }, + }, + 64 => { + Name => 'InterchangeColorSpace', + Format => 'int8u', + PrintConv => { + 1 => 'X,Y,Z CIE', + 2 => 'RGB SMPTE', + 3 => 'Y,U,V (K) (D65)', + 4 => 'RGB Device Dependent', + 5 => 'CMY (K) Device Dependent', + 6 => 'Lab (K) CIE', + 7 => 'YCbCr', + 8 => 'sRGB', + }, + }, + 65 => { + Name => 'ColorSequence', + Format => 'int8u', + }, + 66 => { + Name => 'ICC_Profile', + # ...could add SubDirectory support to read into this (if anybody cares) + Writable => 0, + Binary => 1, + }, + 70 => { + Name => 'ColorCalibrationMatrix', + Writable => 0, + Binary => 1, + }, + 80 => { + Name => 'LookupTable', + Writable => 0, + Binary => 1, + }, + 84 => { + Name => 'NumIndexEntries', + Format => 'int16u', + }, + 85 => { + Name => 'ColorPalette', + Writable => 0, + Binary => 1, + }, + 86 => { + Name => 'IPTCBitsPerSample', + Format => 'int8u', + }, + 90 => { + Name => 'SampleStructure', + Format => 'int8u', + PrintConv => { + 0 => 'OrthogonalConstangSampling', + 1 => 'Orthogonal4-2-2Sampling', + 2 => 'CompressionDependent', + }, + }, + 100 => { + Name => 'ScanningDirection', + Format => 'int8u', + PrintConv => { + 0 => 'L-R, Top-Bottom', + 1 => 'R-L, Top-Bottom', + 2 => 'L-R, Bottom-Top', + 3 => 'R-L, Bottom-Top', + 4 => 'Top-Bottom, L-R', + 5 => 'Bottom-Top, L-R', + 6 => 'Top-Bottom, R-L', + 7 => 'Bottom-Top, R-L', + }, + }, + 102 => { + Name => 'IPTCImageRotation', + Format => 'int8u', + PrintConv => { + 0 => 0, + 1 => 90, + 2 => 180, + 3 => 270, + }, + }, + 110 => { + Name => 'DataCompressionMethod', + Format => 'int32u', + }, + 120 => { + Name => 'QuantizationMethod', + Format => 'int8u', + PrintConv => { + 0 => 'Linear Reflectance/Transmittance', + 1 => 'Linear Density', + 2 => 'IPTC Ref B', + 3 => 'Linear Dot Percent', + 4 => 'AP Domestic Analogue', + 5 => 'Compression Method Specific', + 6 => 'Color Space Specific', + 7 => 'Gamma Compensated', + }, + }, + 125 => { + Name => 'EndPoints', + Writable => 0, + Binary => 1, + }, + 130 => { + Name => 'ExcursionTolerance', + Format => 'int8u', + PrintConv => { + 0 => 'Not Allowed', + 1 => 'Allowed', + }, + }, + 135 => { + Name => 'BitsPerComponent', + Format => 'int8u', + }, + 140 => { + Name => 'MaximumDensityRange', + Format => 'int16u', + }, + 145 => { + Name => 'GammaCompensatedValue', + Format => 'int16u', + }, +); + +# Record 7 -- Pre-object Data +%Image::ExifTool::IPTC::PreObjectData = ( + # (not actually writable, but used in BuildTagLookup to recognize IPTC tables) + WRITE_PROC => \&WriteIPTC, + 10 => { + Name => 'SizeMode', + Format => 'int8u', + PrintConv => { + 0 => 'Size Not Known', + 1 => 'Size Known', + }, + }, + 20 => { + Name => 'MaxSubfileSize', + Format => 'int32u', + }, + 90 => { + Name => 'ObjectSizeAnnounced', + Format => 'int32u', + }, + 95 => { + Name => 'MaximumObjectSize', + Format => 'int32u', + }, +); + +# Record 8 -- ObjectData +%Image::ExifTool::IPTC::ObjectData = ( + WRITE_PROC => \&WriteIPTC, + 10 => { + Name => 'SubFile', + Flags => 'List', + Binary => 1, + }, +); + +# Record 9 -- PostObjectData +%Image::ExifTool::IPTC::PostObjectData = ( + WRITE_PROC => \&WriteIPTC, + 10 => { + Name => 'ConfirmedObjectSize', + Format => 'int32u', + }, +); + +# Record 240 -- FotoStation proprietary data (ref PH) +%Image::ExifTool::IPTC::FotoStation = ( + GROUPS => { 2 => 'Other' }, + WRITE_PROC => \&WriteIPTC, + CHECK_PROC => \&CheckIPTC, + WRITABLE => 1, +); + +# IPTC Composite tags +%Image::ExifTool::IPTC::Composite = ( + GROUPS => { 2 => 'Image' }, + DateTimeCreated => { + Description => 'Date/Time Created', + Groups => { 2 => 'Time' }, + Require => { + 0 => 'IPTC:DateCreated', + 1 => 'IPTC:TimeCreated', + }, + ValueConv => '"$val[0] $val[1]"', + PrintConv => '$self->ConvertDateTime($val)', + }, + DigitalCreationDateTime => { + Description => 'Digital Creation Date/Time', + Groups => { 2 => 'Time' }, + Require => { + 0 => 'IPTC:DigitalCreationDate', + 1 => 'IPTC:DigitalCreationTime', + }, + ValueConv => '"$val[0] $val[1]"', + PrintConv => '$self->ConvertDateTime($val)', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::IPTC'); + + +#------------------------------------------------------------------------------ +# AutoLoad our writer routines when necessary +# +sub AUTOLOAD +{ + return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_); +} + +#------------------------------------------------------------------------------ +# Print conversion for CodedCharacterSet +# Inputs: 0) value +sub PrintCodedCharset($) +{ + my $val = shift; + return $iptcCharset{$val} if $iptcCharset{$val}; + $val =~ s/(.)/ $1/g; + $val =~ s/ \x1b/, ESC/g; + $val =~ s/^,? //; + return $val; +} + +#------------------------------------------------------------------------------ +# Handle CodedCharacterSet +# Inputs: 0) ExifTool ref, 1) CodedCharacterSet value +# Returns: IPTC character set if translation required (or 'bad' if unknown) +sub HandleCodedCharset($$) +{ + my ($et, $val) = @_; + my $xlat = $iptcCharset{$val}; + unless ($xlat) { + if ($val =~ /^\x1b\x25/) { + # some unknown character set invoked + $xlat = 'bad'; # flag unsupported coding + } else { + $xlat = $et->Options('CharsetIPTC'); + } + } + # no need to translate if Charset is the same + undef $xlat if $xlat eq $et->Options('Charset'); + return $xlat; +} + +#------------------------------------------------------------------------------ +# Encode or decode coded string +# Inputs: 0) ExifTool ref, 1) value ptr, 2) IPTC charset (or 'bad') ref +# 3) flag set to decode (read) value from IPTC +# Updates value on return +sub TranslateCodedString($$$$) +{ + my ($et, $valPtr, $xlatPtr, $read) = @_; + if ($$xlatPtr eq 'bad') { + $et->Warn('Some IPTC characters not converted (unsupported CodedCharacterSet)'); + undef $$xlatPtr; + } elsif (not $read) { + $$valPtr = $et->Decode($$valPtr, undef, undef, $$xlatPtr); + } elsif ($$valPtr !~ /[\x14\x15\x1b]/) { + $$valPtr = $et->Decode($$valPtr, $$xlatPtr); + } else { + # don't yet support reading ISO 2022 shifted character sets + $et->WarnOnce('Some IPTC characters not converted (ISO 2022 shifting not supported)'); + } +} + +#------------------------------------------------------------------------------ +# Is this IPTC in a standard location? +# Inputs: 0) Current metadata path string +# Returns: true if path is standard, 0 if file type doesn't have standard IPTC, +# or undef if IPTC is non-standard +sub IsStandardIPTC($) +{ + my $path = shift; + return 1 if $isStandardIPTC{$path}; + return 0 unless $path =~ /^(\w+)/ and defined $isStandardIPTC{$1}; + return undef; # non-standard +} + +#------------------------------------------------------------------------------ +# get IPTC info +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# 2) reference to tag table +# Returns: 1 on success, 0 otherwise +sub ProcessIPTC($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || 0; + my $dirEnd = $pos + $dirLen; + my $verbose = $et->Options('Verbose'); + my $validate = $et->Options('Validate'); + my $success = 0; + my ($lastRec, $recordPtr, $recordName); + + $verbose and $dirInfo and $et->VerboseDir('IPTC', 0, $$dirInfo{DirLen}); + + if ($tagTablePtr eq \%Image::ExifTool::IPTC::Main) { + my $path = $et->MetadataPath(); + my $isStd = IsStandardIPTC($path); + if (defined $isStd and not $$et{DIR_COUNT}{STD_IPTC}) { + # set flag to ensure we only have one family 1 "IPTC" group + $$et{DIR_COUNT}{STD_IPTC} = 1; + # calculate MD5 if Digest::MD5 is available (truly standard IPTC only) + if ($isStd) { + my $md5; + if (eval { require Digest::MD5 }) { + if ($pos or $dirLen != length($$dataPt)) { + $md5 = Digest::MD5::md5(substr $$dataPt, $pos, $dirLen); + } else { + $md5 = Digest::MD5::md5($$dataPt); + } + } else { + # a zero digest indicates IPTC exists but we don't have Digest::MD5 + $md5 = "\0" x 16; + } + $et->FoundTag('CurrentIPTCDigest', $md5); + } + } else { + if (($Image::ExifTool::MWG::strict or $et->Options('Validate')) and + $$et{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/) + { + if ($Image::ExifTool::MWG::strict) { + # ignore non-standard IPTC while in strict MWG compatibility mode + $et->Warn("Ignored non-standard IPTC at $path"); + return 1; + } else { + $et->Warn("Non-standard IPTC at $path", 1); + } + } + # extract non-standard IPTC + my $count = ($$et{DIR_COUNT}{IPTC} || 0) + 1; # count non-standard IPTC + $$et{DIR_COUNT}{IPTC} = $count; + $$et{LOW_PRIORITY_DIR}{IPTC} = 1; # lower priority of non-standard IPTC + $$et{SET_GROUP1} = '+' . ($count + 1); # add number to family 1 group name + } + } + # begin by assuming default IPTC encoding + my $xlat = $et->Options('CharsetIPTC'); + undef $xlat if $xlat eq $et->Options('Charset'); + + # quick check for improperly byte-swapped IPTC + if ($dirLen >= 4 and substr($$dataPt, $pos, 1) ne "\x1c" and + substr($$dataPt, $pos + 3, 1) eq "\x1c") + { + $et->Warn('IPTC data was improperly byte-swapped'); + my $newData = pack('N*', unpack('V*', substr($$dataPt, $pos, $dirLen) . "\0\0\0")); + $dataPt = \$newData; + $pos = 0; + $dirEnd = $pos + $dirLen; + # NOTE: MUST NOT access $dirInfo DataPt, DirStart or DataLen after this! + } + # extract IPTC as a block if specified + if ($$et{REQ_TAG_LOOKUP}{iptc} or ($$et{TAGS_FROM_FILE} and + not $$et{EXCL_TAG_LOOKUP}{iptc})) + { + if ($pos or $dirLen != length($$dataPt)) { + $et->FoundTag('IPTC', substr($$dataPt, $pos, $dirLen)); + } else { + $et->FoundTag('IPTC', $$dataPt); + } + } + while ($pos + 5 <= $dirEnd) { + my $buff = substr($$dataPt, $pos, 5); + my ($id, $rec, $tag, $len) = unpack("CCCn", $buff); + unless ($id == 0x1c) { + unless ($id) { + # scan the rest of the data an give warning unless all zeros + # (iMatch pads the IPTC block with nulls for some reason) + my $remaining = substr($$dataPt, $pos, $dirEnd - $pos); + last unless $remaining =~ /[^\0]/; + } + $et->Warn(sprintf('Bad IPTC data tag (marker 0x%x)',$id)); + last; + } + $pos += 5; # step to after field header + # handle extended IPTC entry if necessary + if ($len & 0x8000) { + my $n = $len & 0x7fff; # get num bytes in length field + if ($pos + $n > $dirEnd or $n > 8) { + $et->VPrint(0, "Invalid extended IPTC entry (dataset $rec:$tag, len $len)\n"); + $success = 0; + last; + } + # determine length (a big-endian, variable sized int) + for ($len = 0; $n; ++$pos, --$n) { + $len = $len * 256 + ord(substr($$dataPt, $pos, 1)); + } + } + if ($pos + $len > $dirEnd) { + $et->VPrint(0, "Invalid IPTC entry (dataset $rec:$tag, len $len)\n"); + $success = 0; + last; + } + if (not defined $lastRec or $lastRec != $rec) { + if ($validate and defined $lastRec and $rec < $lastRec) { + $et->Warn("IPTC doesn't conform to spec: Records out of sequence",1) + } + my $tableInfo = $tagTablePtr->{$rec}; + unless ($tableInfo) { + $et->WarnOnce("Unrecognized IPTC record $rec (ignored)"); + $pos += $len; + next; # ignore this entry + } + my $tableName = $tableInfo->{SubDirectory}->{TagTable}; + unless ($tableName) { + $et->Warn("No table for IPTC record $rec!"); + last; # this shouldn't happen + } + $recordName = $$tableInfo{Name}; + $recordPtr = Image::ExifTool::GetTagTable($tableName); + $et->VPrint(0,$$et{INDENT},"-- $recordName record --\n"); + $lastRec = $rec; + } + my $val = substr($$dataPt, $pos, $len); + + # add tagInfo for all unknown tags: + unless ($$recordPtr{$tag}) { + # - no Format so format is auto-detected + # - no Name so name is generated automatically with decimal tag number + AddTagToTable($recordPtr, $tag, { Unknown => 1 }); + } + + my $tagInfo = $et->GetTagInfo($recordPtr, $tag); + my $format; + # (could use $$recordPtr{FORMAT} if no Format below, but don't do this to + # be backward compatible with improperly written PhotoMechanic tags) + $format = $$tagInfo{Format} if $tagInfo; + if (not $format) { + # guess at "int" format if not specified + $format = 'int' if $len <= 4 and $len != 3 and $val =~ /[\0-\x08]/; + } elsif ($validate) { + my ($fmt,$min,$max); + if ($format =~ /(.*)\[(\d+)(,(\d+))?\]/) { + $fmt = $1; + $min = $2; + $max = $4 || $2; + } else { + $fmt = $format; + $min = $max = 1; + } + my $siz = Image::ExifTool::FormatSize($fmt) || 1; + $min *= $siz; $max *= $siz; + if ($len < $min or $len > $max) { + my $should = ($min == $max) ? $min : ($len < $min ? "$min min" : "$max max"); + my $what = ($len < $siz * $min) ? 'short' : 'long'; + $et->Warn("IPTC $$tagInfo{Name} too $what ($len bytes; should be $should)", 1); + } + } + if ($format) { + if ($format =~ /^int/) { + if ($len <= 8) { # limit integer conversion to 8 bytes long + $val = 0; + my $i; + for ($i=0; $i<$len; ++$i) { + $val = $val * 256 + ord(substr($$dataPt, $pos+$i, 1)); + } + } + } elsif ($format =~ /^string/) { + # some braindead softwares add null terminators + if ($val =~ s/\0+$// and $validate) { + $et->Warn("IPTC $$tagInfo{Name} improperly terminated", 1); + } + if ($rec == 1) { + # handle CodedCharacterSet tag + $xlat = HandleCodedCharset($et, $val) if $tag == 90; + # translate characters if necessary and special characters exist + } elsif ($xlat and $rec < 7 and $val =~ /[\x80-\xff]/) { + # translate to specified character set + TranslateCodedString($et, \$val, \$xlat, 1); + } + } elsif ($format =~ /^digits/) { + if ($val =~ s/\0+$// and $validate) { + $et->Warn("IPTC $$tagInfo{Name} improperly terminated", 1); + } + } elsif ($format !~ /^undef/) { + warn("Invalid IPTC format: $format"); # (this would be a programming error) + } + } + $verbose and $et->VerboseInfo($tag, $tagInfo, + Table => $tagTablePtr, + Value => $val, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + Size => $len, + Start => $pos, + Extra => ", $recordName record", + Format => $format, + ); + $et->FoundTag($tagInfo, $val) if $tagInfo; + $success = 1; + + $pos += $len; # increment to next field + } + delete $$et{SET_GROUP1}; + delete $$et{LOW_PRIORITY_DIR}{IPTC}; + return $success; +} + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::IPTC - Read IPTC meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +IPTC (International Press Telecommunications Council) meta information in +image files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.iptc.org/IIM/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/IPTC Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/ISO.pm b/lib/Image/ExifTool/ISO.pm new file mode 100644 index 0000000..46317d4 --- /dev/null +++ b/lib/Image/ExifTool/ISO.pm @@ -0,0 +1,206 @@ +#------------------------------------------------------------------------------ +# File: ISO.pm +# +# Description: Read information from ISO 9660 disk images +# +# Revisions: 2016-04-07 - P. Harvey created +# +# References: 1) http://wiki.osdev.org/ISO_9660 +#------------------------------------------------------------------------------ + +package Image::ExifTool::ISO; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.01'; + +# trim trailing spaces and ignore tag if empty +my %rawStr = ( + RawConv => sub { + my $val = shift; + $val =~ s/ +$//; + return length($val) ? $val : undef; + }, +); + +# tag info for date/time tags +my %dateInfo = ( + Format => 'undef[17]', + Groups => { 2 => 'Time' }, + ValueConv => q{ + return undef if $val !~ /[^0\0 ]/; # ignore if empty + if ($val =~ s/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(.)/$1:$2:$3 $4:$5:$6.$7/s) { + $val .= TimeZoneString(unpack('c', $8) * 15); + } + return $val; + }, + PrintConv => '$self->ConvertDateTime($val)', +); + +# lookup for volume descriptor types +my %volumeDescriptorType = ( + 0 => 'Boot Record', + 1 => 'Primary Volume', + 2 => 'Supplementary Volume', + 3 => 'Volume Partition', + 255 => 'Terminator', +); + +# ISO tags +%Image::ExifTool::ISO::Main = ( + GROUPS => { 2 => 'Other' }, + NOTES => 'Tags extracted from ISO 9660 disk images.', + 0 => { + Name => 'BootRecord', + SubDirectory => { TagTable => 'Image::ExifTool::ISO::BootRecord' }, + }, + 1 => { + Name => 'PrimaryVolume', + SubDirectory => { TagTable => 'Image::ExifTool::ISO::PrimaryVolume' }, + }, +); + +%Image::ExifTool::ISO::BootRecord = ( + GROUPS => { 2 => 'Other' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + # 0 => { Name => 'VolumeType', PrintConv => \%volumeDescriptorType }, # (0 for boot record) + # 1 => { Name => 'Identifier', Format => 'undef[5]' }, # (always "CD001") + # 6 => 'VolumeDesriptorVersion', # (always 1) + # always extract BootSystem, even if empty, as an indication that this is bootable + 7 => { Name => 'BootSystem', Format => 'string[32]', ValueConv => '$val=~s/ +$//; $val' }, + 39 => { Name => 'BootIdentifier', Format => 'string[32]', %rawStr }, +); + +%Image::ExifTool::ISO::PrimaryVolume = ( + GROUPS => { 2 => 'Other' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + # 0 => { Name => 'VolumeType', PrintConv => \%volumeDescriptorType }, # (1 for primary volume) + # 1 => { Name => 'Identifier', Format => 'undef[5]' }, # (always "CD001") + # 6 => 'VolumeDesriptorVersion', # (always 1) + 8 => { Name => 'System', Format => 'string[32]', %rawStr }, + 40 => { Name => 'VolumeName', Format => 'string[32]', %rawStr }, + 80 => { Name => 'VolumeBlockCount', Format => 'int32u' }, + 120 => { Name => 'VolumeSetDiskCount', Format => 'int16u', Unknown => 1 }, + 124 => { Name => 'VolumeSetDiskNumber', Format => 'int16u', Unknown => 1 }, + 128 => { Name => 'VolumeBlockSize', Format => 'int16u' }, + 132 => { Name => 'PathTableSize', Format => 'int32u', Unknown => 1 }, + 140 => { Name => 'PathTableLocation', Format => 'int32u', Unknown => 1 }, + 174 => { + Name => 'RootDirectoryCreateDate', + Format => 'undef[7]', + Groups => { 2 => 'Time' }, + ValueConv => q{ + my @a = unpack('C6c', $val); + $a[0] += 1900; + $a[6] = TimeZoneString($a[6] * 15); + return sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d%s', @a); + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 190 => { Name => 'VolumeSetName', Format => 'string[128]', %rawStr }, + 318 => { Name => 'Publisher', Format => 'string[128]', %rawStr }, + 446 => { Name => 'DataPreparer', Format => 'string[128]', %rawStr }, + 574 => { Name => 'Software', Format => 'string[128]', %rawStr }, + 702 => { Name => 'CopyrightFileName', Format => 'string[38]', %rawStr }, + 740 => { Name => 'AbstractFileName', Format => 'string[36]', %rawStr }, + 776 => { Name => 'BibligraphicFileName',Format => 'string[37]', %rawStr }, + 813 => { Name => 'VolumeCreateDate', %dateInfo }, + 830 => { Name => 'VolumeModifyDate', %dateInfo }, + 847 => { Name => 'VolumeExpirationDate',%dateInfo }, + 864 => { Name => 'VolumeEffectiveDate', %dateInfo }, + #881 => 'FileStructureVersion', # (always 1) +); + +# ISO Composite tags +%Image::ExifTool::ISO::Composite = ( + GROUPS => { 2 => 'Other' }, + VolumeSize => { + Require => { + 0 => 'ISO:VolumeBlockCount', + 1 => 'ISO:VolumeBlockSize', + }, + ValueConv => '$val[0] * $val[1]', + PrintConv => \&Image::ExifTool::ConvertFileSize, + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::ISO'); + +#------------------------------------------------------------------------------ +# Extract information from an ISO 9660 disk image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid ISO 9660 image +sub ProcessISO($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $tagTablePtr); + + # verify this is a valid ISO file + return 0 unless $raf->Seek(32768, 0); + + while ($raf->Read($buff, 2048) == 2048) { + last unless $buff =~ /^[\0-\x03\xff]CD001/; + unless ($tagTablePtr) { + $et->SetFileType(); # set the FileType tag + SetByteOrder('II'); # read little-endian values only + $tagTablePtr = GetTagTable('Image::ExifTool::ISO::Main'); + } + my $type = unpack('C', $buff); + $et->VPrint(0, "Volume descriptor type $type ($volumeDescriptorType{$type})\n"); + last if $type == 255; # stop at terminator + next unless $$tagTablePtr{$type}; + my $subTablePtr = GetTagTable($$tagTablePtr{$type}{SubDirectory}{TagTable}); + my %dirInfo = ( + DataPt => \$buff, + DataPos => $raf->Tell() - 2048, + DirStart => 0, + DirLen => length($buff), + ); + $et->ProcessDirectory(\%dirInfo, $subTablePtr); + } + return $tagTablePtr ? 1 : 0; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::ISO - Read information from ISO 9660 disk images + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read +information from ISO 9660 disk images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://wiki.osdev.org/ISO_9660> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/ISO Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/ITC.pm b/lib/Image/ExifTool/ITC.pm new file mode 100644 index 0000000..33eda28 --- /dev/null +++ b/lib/Image/ExifTool/ITC.pm @@ -0,0 +1,215 @@ +#------------------------------------------------------------------------------ +# File: ITC.pm +# +# Description: Read iTunes Cover Flow meta information +# +# Revisions: 01/12/2008 - P. Harvey Created +# +# References: 1) http://www.waldoland.com/dev/Articles/ITCFileFormat.aspx +# 2) http://www.falsecognate.org/2007/01/deciphering_the_itunes_itc_fil/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::ITC; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.02'; + +sub ProcessITC($$); + +# tags used in ITC files +%Image::ExifTool::ITC::Main = ( + NOTES => 'This information is found in iTunes Cover Flow data files.', + itch => { SubDirectory => { TagTable => 'Image::ExifTool::ITC::Header' } }, + item => { SubDirectory => { TagTable => 'Image::ExifTool::ITC::Item' } }, + data => { + Name => 'ImageData', + Notes => 'embedded JPEG or PNG image, depending on ImageType', + }, +); + +# ITC header information +%Image::ExifTool::ITC::Header = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0x10 => { + Name => 'DataType', + Format => 'undef[4]', + PrintConv => { artw => 'Artwork' }, + }, +); + +# ITC item information +%Image::ExifTool::ITC::Item = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + 0 => { + Name => 'LibraryID', + Format => 'undef[8]', + ValueConv => 'uc unpack "H*", $val', + }, + 2 => { + Name => 'TrackID', + Format => 'undef[8]', + ValueConv => 'uc unpack "H*", $val', + }, + 4 => { + Name => 'DataLocation', + Format => 'undef[4]', + PrintConv => { + down => 'Downloaded Separately', + locl => 'Local Music File', + }, + }, + 5 => { + Name => 'ImageType', + Format => 'undef[4]', + ValueConv => { # (not PrintConv because the unconverted JPEG value is nasty) + 'PNGf' => 'PNG', + "\0\0\0\x0d" => 'JPEG', + }, + }, + 7 => 'ImageWidth', + 8 => 'ImageHeight', +); + +#------------------------------------------------------------------------------ +# Process an iTunes Cover Flow (ITC) file +# Inputs: 0) ExifTool object reference, 1) Directory information reference +# Returns: 1 on success, 0 if this wasn't a valid ITC file +sub ProcessITC($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $rtnVal = 0; + my ($buff, $err, $pos, $tagTablePtr, %dirInfo); + + # loop through all blocks in this image + for (;;) { + # read the block header + my $n = $raf->Read($buff, 8); + unless ($n == 8) { + # no error if we reached the EOF normally + undef $err unless $n; + last; + } + my ($size, $tag) = unpack('Na4', $buff); + if ($rtnVal) { + last unless $size >= 8 and $size < 0x80000000; + } else { + # check to be sure this is a valid ITC image + # (first block must be 'itch') + last unless $tag eq 'itch'; + last unless $size >= 0x1c and $size < 0x10000; + $et->SetFileType(); + SetByteOrder('MM'); + $rtnVal = 1; # this is an ITC file + $err = 1; # format error unless we read to EOF + } + if ($tag eq 'itch') { + $pos = $raf->Tell(); + $size -= 8; # size of remaining data in block + $raf->Read($buff,$size) == $size or last; + # extract header information + %dirInfo = ( + DirName => 'ITC Header', + DataPt => \$buff, + DataPos => $pos, + ); + my $tagTablePtr = GetTagTable('Image::ExifTool::ITC::Header'); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($tag eq 'item') { + # don't want to read the entire item data (includes image) + $size > 12 or last; + $raf->Read($buff, 4) == 4 or last; + my $len = unpack('N', $buff); + $len >= 0xd0 and $len <= $size or last; + $size -= $len; # size of data after item header + $len -= 12; # length of remaining item header + # read in 4-byte blocks until we find the null terminator + # (this is just a guess about how to parse this variable-length part) + while ($len >= 4) { + $raf->Read($buff, 4) == 4 or last; + $len -= 4; + last if $buff eq "\0\0\0\0"; + } + last if $len < 4; + $pos = $raf->Tell(); + $raf->Read($buff, $len) == $len or last; + unless ($len >= 0xb4 and substr($buff, 0xb0, 4) eq 'data') { + $et->Warn('Parsing error. Please submit this ITC file for testing'); + last; + } + %dirInfo = ( + DirName => 'ITC Item', + DataPt => \$buff, + DataPos => $pos, + ); + $tagTablePtr = GetTagTable('Image::ExifTool::ITC::Item'); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + # extract embedded image + $pos += $len; + if ($size > 0) { + $tagTablePtr = GetTagTable('Image::ExifTool::ITC::Main'); + my $tagInfo = $et->GetTagInfo($tagTablePtr, 'data'); + my $image = $et->ExtractBinary($pos, $size, $$tagInfo{Name}); + $et->FoundTag($tagInfo, \$image); + # skip the rest of the block if necessary + $raf->Seek($pos+$size, 0) or last + } elsif ($size < 0) { + last; + } + } else { + $et->VPrint(0, "Unknown $tag block ($size bytes)\n"); + $raf->Seek($size-8, 1) or last; + } + } + $err and $et->Warn('ITC file format error'); + return $rtnVal; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::ITC - Read iTunes Cover Flow meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains the routines required by Image::ExifTool to read meta +information (including artwork images) from iTunes Cover Flow files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.waldoland.com/dev/Articles/ITCFileFormat.aspx> + +=item L<http://www.falsecognate.org/2007/01/deciphering_the_itunes_itc_fil/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/ITC Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Import.pm b/lib/Image/ExifTool/Import.pm new file mode 100644 index 0000000..9d642fb --- /dev/null +++ b/lib/Image/ExifTool/Import.pm @@ -0,0 +1,360 @@ +#------------------------------------------------------------------------------ +# File: Import.pm +# +# Description: Import CSV and JSON database files +# +# Revisions: 2011-03-05 - P. Harvey Created +#------------------------------------------------------------------------------ +package Image::ExifTool::Import; + +use strict; +require Exporter; + +use vars qw($VERSION @ISA @EXPORT_OK); + +$VERSION = '1.10'; +@ISA = qw(Exporter); +@EXPORT_OK = qw(ReadCSV ReadJSON); + +sub ReadJSONObject($;$); + +my %unescapeJSON = ( 't'=>"\t", 'n'=>"\n", 'r'=>"\r", 'b' => "\b", 'f' => "\f" ); +my $charset; + +#------------------------------------------------------------------------------ +# Read CSV file +# Inputs: 0) CSV file name, file ref or RAF ref, 1) database hash ref, +# 2) missing tag value, 3) delimiter if other than ',' +# Returns: undef on success, or error string +# Notes: There are various flavours of CSV, but here we assume that only +# double quotes are escaped, and they are escaped by doubling them +sub ReadCSV($$;$$) +{ + local ($_, $/); + my ($file, $database, $missingValue, $delim) = @_; + my ($buff, @tags, $found, $err, $raf, $openedFile); + + if (UNIVERSAL::isa($file, 'File::RandomAccess')) { + $raf = $file; + $file = 'CSV file'; + } elsif (ref $file eq 'GLOB') { + $raf = new File::RandomAccess($file); + $file = 'CSV file'; + } else { + open CSVFILE, $file or return "Error opening CSV file '${file}'"; + binmode CSVFILE; + $openedFile = 1; + $raf = new File::RandomAccess(\*CSVFILE); + } + $delim = ',' unless defined $delim; + # set input record separator by first newline found in the file + # (safe because first line should contain only tag names) + while ($raf->Read($buff, 65536)) { + $buff =~ /(\x0d\x0a|\x0d|\x0a)/ and $/ = $1, last; + } + $raf->Seek(0,0); + while ($raf->ReadLine($buff)) { + my (@vals, $v, $i, %fileInfo); + my @toks = split /\Q$delim/, $buff; + while (@toks) { + ($v = shift @toks) =~ s/^ +//; # remove leading spaces + if ($v =~ s/^"//) { + # quoted value must end in an odd number of quotes + while ($v !~ /("+)\s*$/ or not length($1) & 1) { + if (@toks) { + $v .= $delim . shift @toks; + } else { + # read another line from the file + $raf->ReadLine($buff) or last; + @toks = split /\Q$delim/, $buff; + last unless @toks; + $v .= shift @toks; + } + } + $v =~ s/"\s*$//; # remove trailing quote and whitespace + $v =~ s/""/"/g; # un-escape quotes + } else { + $v =~ s/[ \n\r]+$//;# remove trailing spaces/newlines + } + push @vals, $v; + } + if (@tags) { + # save values for each tag + for ($i=0; $i<@vals and $i<@tags; ++$i) { + # ignore empty entries unless missingValue is empty too + next unless length $vals[$i] or defined $missingValue and $missingValue eq ''; + # delete tag (set value to undef) if value is same as missing tag + $fileInfo{$tags[$i]} = + (defined $missingValue and $vals[$i] eq $missingValue) ? undef : $vals[$i]; + } + # figure out the file name to use + if ($fileInfo{SourceFile}) { + $$database{$fileInfo{SourceFile}} = \%fileInfo; + $found = 1; + } + } else { + # the first row should be the tag names + foreach (@vals) { + # terminate at first blank tag name (eg. extra comma at end of line) + last unless length $_; + @tags or s/^\xef\xbb\xbf//; # remove UTF-8 BOM if it exists + /^[-\w]+(:[-\w+]+)?#?$/ or $err = "Invalid tag name '${_}'", last; + push(@tags, $_); + } + last if $err; + @tags or $err = 'No tags found', last; + # fix "SourceFile" case if necessary + $tags[0] = 'SourceFile' if lc $tags[0] eq 'sourcefile'; + } + } + close CSVFILE if $openedFile; + undef $raf; + $err = 'No SourceFile column' unless $found or $err; + return $err ? "$err in $file" : undef; +} + +#------------------------------------------------------------------------------ +# Convert unicode code point to UTF-8 +# Inputs: 0) integer Unicode character +# Returns: UTF-8 bytes +sub ToUTF8($) +{ + require Image::ExifTool::Charset; + return Image::ExifTool::Charset::Recompose(undef, [$_[0]], $charset); +} + +#------------------------------------------------------------------------------ +# Read JSON object from file +# Inputs: 0) RAF reference or undef, 1) optional scalar reference for data +# to read before reading from file (ie. the file read buffer) +# Returns: JSON object (scalar, hash ref, or array ref), or undef on EOF or +# empty object or array (and sets $$buffPt to empty string on EOF) +# Notes: position in buffer is significant +sub ReadJSONObject($;$) +{ + my ($raf, $buffPt) = @_; + # initialize buffer if necessary + my ($pos, $readMore, $rtnVal, $tok, $key, $didBOM); + if ($buffPt) { + $pos = pos $$buffPt; + $pos = pos($$buffPt) = 0 unless defined $pos; + } else { + my $buff = ''; + $buffPt = \$buff; + $pos = 0; + } +Tok: for (;;) { + # (didn't spend the time to understand how $pos could be undef, but + # put a test here to be safe because one user reported this problem) + last unless defined $pos; + if ($pos >= length $$buffPt or $readMore) { + last unless defined $raf; + # read another 64kB and add to unparsed data + my $offset = length($$buffPt) - $pos; + if ($offset) { + my $buff; + $raf->Read($buff, 65536) or $$buffPt = '', last; + $$buffPt = substr($$buffPt, $pos) . $buff; + } else { + $raf->Read($$buffPt, 65536) or $$buffPt = '', last; + } + unless ($didBOM) { + $$buffPt =~ s/^\xef\xbb\xbf//; # remove UTF-8 BOM if it exists + $didBOM = 1; + } + $pos = pos($$buffPt) = 0; + $readMore = 0; + } + unless ($tok) { + # skip white space and find next character + $$buffPt =~ /(\S)/g or $pos = length($$buffPt), next; + $tok = $1; + $pos = pos $$buffPt; + } + # see what type of object this is + if ($tok eq '{') { # object (hash) + $rtnVal = { } unless defined $rtnVal; + for (;;) { + # read "KEY":"VALUE" pairs + unless (defined $key) { + $key = ReadJSONObject($raf, $buffPt); + $pos = pos $$buffPt; + } + # ($key may be undef for empty JSON object) + if (defined $key) { + # scan to delimiting ':' + $$buffPt =~ /(\S)/g or $readMore = 1, next Tok; + $1 eq ':' or return undef; # error if not a colon + my $val = ReadJSONObject($raf, $buffPt); + $pos = pos $$buffPt; + return undef unless defined $val; + $$rtnVal{$key} = $val; + undef $key; + } + # scan to delimiting ',' or bounding '}' + $$buffPt =~ /(\S)/g or $readMore = 1, next Tok; + last if $1 eq '}'; # check for end of object + $1 eq ',' or return undef; # error if not a comma + } + } elsif ($tok eq '[') { # array + $rtnVal = [ ] unless defined $rtnVal; + for (;;) { + my $item = ReadJSONObject($raf, $buffPt); + $pos = pos $$buffPt; + # ($item may be undef for empty array) + push @$rtnVal, $item if defined $item; + # scan to delimiting ',' or bounding ']' + $$buffPt =~ /(\S)/g or $readMore = 1, next Tok; + last if $1 eq ']'; # check for end of array + $1 eq ',' or return undef; # error if not a comma + } + } elsif ($tok eq '"') { # quoted string + for (;;) { + $$buffPt =~ /(\\*)"/g or $readMore = 1, next Tok; + last unless length($1) & 1; # check for escaped quote + } + $rtnVal = substr($$buffPt, $pos, pos($$buffPt)-$pos-1); + # unescape characters + $rtnVal =~ s/\\u([0-9a-f]{4})/ToUTF8(hex $1)/ige; + $rtnVal =~ s/\\(.)/$unescapeJSON{$1}||$1/sge; + # decode base64 (binary data) values + if ($rtnVal =~ /^base64:[A-Za-z0-9+\/]*={0,2}$/ and length($rtnVal) % 4 == 3) { + require Image::ExifTool::XMP; + $rtnVal = ${Image::ExifTool::XMP::DecodeBase64(substr($rtnVal,7))}; + } + } elsif ($tok eq ']' or $tok eq '}' or $tok eq ',') { + # return undef for empty object, array, or list item + # (empty list item actually not valid JSON) + pos($$buffPt) = pos($$buffPt) - 1; + } else { # number, 'true', 'false', 'null' + $$buffPt =~ /([\s:,\}\]])/g or $readMore = 1, next; + pos($$buffPt) = pos($$buffPt) - 1; + $rtnVal = $tok . substr($$buffPt, $pos, pos($$buffPt)-$pos); + } + last; + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Read JSON file +# Inputs: 0) JSON file name, file ref or RAF ref, 1) database hash ref, +# 2) flag to delete "-" tags, 3) character set +# Returns: undef on success, or error string +sub ReadJSON($$;$$) +{ + local $_; + my ($file, $database, $missingValue, $chset) = @_; + my ($raf, $openedFile); + + # initialize character set for converting "\uHHHH" chars + $charset = $chset || 'UTF8'; + if (UNIVERSAL::isa($file, 'File::RandomAccess')) { + $raf = $file; + $file = 'JSON file'; + } elsif (ref $file eq 'GLOB') { + $raf = new File::RandomAccess($file); + $file = 'JSON file'; + } else { + open JSONFILE, $file or return "Error opening JSON file '${file}'"; + binmode JSONFILE; + $openedFile = 1; + $raf = new File::RandomAccess(\*JSONFILE); + } + my $obj = ReadJSONObject($raf); + close JSONFILE if $openedFile; + unless (ref $obj eq 'ARRAY') { + ref $obj eq 'HASH' or return "Format error in JSON file '${file}'"; + $obj = [ $obj ]; + } + my ($info, $found); + foreach $info (@$obj) { + next unless ref $info eq 'HASH'; + # fix "SourceFile" case, or assume '*' if SourceFile not specified + unless (defined $$info{SourceFile}) { + my ($key) = grep /^SourceFile$/i, keys %$info; + if ($key) { + $$info{SourceFile} = $$info{$key}; + delete $$info{$key}; + } else { + $$info{SourceFile} = '*'; + } + } + if (defined $missingValue) { + $$info{$_} eq $missingValue and $$info{$_} = undef foreach keys %$info; + } + $$database{$$info{SourceFile}} = $info; + $found = 1; + } + return $found ? undef : "No valid JSON objects in '${file}'"; +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Import - Import CSV and JSON database files + +=head1 SYNOPSIS + + use Image::ExifTool::Import qw(ReadCSV ReadJSON); + + $err = ReadCSV($csvFile, \%database); + + $err = ReadJSON($jsonfile, \%database); + +=head1 DESCRIPTION + +This module contains routines for importing tag information from CSV (Comma +Separated Value) and JSON (JavaScript Object Notation) database files. + +=head1 EXPORTS + +Exports nothing by default, but ReadCSV and ReadJSON may be exported. + +=head1 METHODS + +=head2 ReadCSV / ReadJSON + +Read CSV or JSON file into a database hash. + +=over 4 + +=item Inputs: + +0) CSV file name or file reference. + +1) Hash reference for database object. + +2) Optional string used to represent an undefined (missing) tag value. +(Used for deleting tags.) + +3) For ReadCSV this gives the delimiter for CSV entries, with a default of +",". For ReadJSON this is the character set for converting Unicode escape +sequences in strings, with a default of "UTF8". See the ExifTool Charset +option for a list of valid character sets. + +=item Return Value: + +These functions return an error string, or undef on success and populate the +database hash with entries from the CSV or JSON file. Entries are keyed +based on the SourceFile column of the CSV or JSON information, and are +stored as hash lookups of tag name/value for each SourceFile. + +=back + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/InDesign.pm b/lib/Image/ExifTool/InDesign.pm new file mode 100644 index 0000000..b15f43c --- /dev/null +++ b/lib/Image/ExifTool/InDesign.pm @@ -0,0 +1,279 @@ +#------------------------------------------------------------------------------ +# File: InDesign.pm +# +# Description: Read/write meta information in Adobe InDesign files +# +# Revisions: 2009-06-17 - P. Harvey Created +# +# References: 1) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::InDesign; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.06'; + +# map for writing metadata to InDesign files (currently only write XMP) +my %indMap = ( + XMP => 'IND', +); + +# GUID's used in InDesign files +my $masterPageGUID = "\x06\x06\xed\xf5\xd8\x1d\x46\xe5\xbd\x31\xef\xe7\xfe\x74\xb7\x1d"; +my $objectHeaderGUID = "\xde\x39\x39\x79\x51\x88\x4b\x6c\x8E\x63\xee\xf8\xae\xe0\xdd\x38"; +my $objectTrailerGUID = "\xfd\xce\xdb\x70\xf7\x86\x4b\x4f\xa4\xd3\xc7\x28\xb3\x41\x71\x06"; + +#------------------------------------------------------------------------------ +# Read or write meta information in an InDesign file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid InDesign file, or -1 on write error +sub ProcessIND($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $outfile = $$dirInfo{OutFile}; + my ($hdr, $buff, $buf2, $err, $writeLen, $foundXMP); + + # validate the InDesign file + return 0 unless $raf->Read($hdr, 16) == 16; + return 0 unless $hdr eq $masterPageGUID; + return 0 unless $raf->Read($buff, 8) == 8; + $et->SetFileType($buff eq 'DOCUMENT' ? 'INDD' : 'IND'); # set the FileType tag + + # read the master pages + $raf->Seek(0, 0) or $err = 'Seek error', goto DONE; + unless ($raf->Read($buff, 4096) == 4096 and + $raf->Read($buf2, 4096) == 4096) + { + $err = 'Unexpected end of file'; + goto DONE; # (goto's can be our friend) + } + SetByteOrder('II'); + unless ($buf2 =~ /^\Q$masterPageGUID/) { + $err = 'Second master page is invalid'; + goto DONE; + } + my $seq1 = Get64u(\$buff, 264); + my $seq2 = Get64u(\$buf2, 264); + # take the most current master page + my $curPage = $seq2 > $seq1 ? \$buf2 : \$buff; + # byte order of stream data may be different than headers + my $streamInt32u = Get8u($curPage, 24); + if ($streamInt32u == 1) { + $streamInt32u = 'V'; # little-endian int32u + } elsif ($streamInt32u == 2) { + $streamInt32u = 'N'; # big-endian int32u + } else { + $err = 'Invalid stream byte order'; + goto DONE; + } + my $pages = Get32u($curPage, 280); + $pages < 2 and $err = 'Invalid page count', goto DONE; + my $pos = $pages * 4096; + if ($pos > 0x7fffffff and not $et->Options('LargeFileSupport')) { + $err = 'InDesign files larger than 2 GB not supported (LargeFileSupport not set)'; + goto DONE; + } + if ($outfile) { + # make XMP the preferred group for writing + $et->InitWriteDirs(\%indMap, 'XMP'); + + Write($outfile, $buff, $buf2) or $err = 1, goto DONE; + my $result = Image::ExifTool::CopyBlock($raf, $outfile, $pos - 8192); + unless ($result) { + $err = defined $result ? 'Error reading InDesign database' : 1; + goto DONE; + } + $writeLen = 0; + } else { + $raf->Seek($pos, 0) or $err = 'Seek error', goto DONE; + } + # scan through the contiguous objects for XMP + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + for (;;) { + $raf->Read($hdr, 32) or last; + unless (length($hdr) == 32 and $hdr =~ /^\Q$objectHeaderGUID/) { + # this must be null padding or we have an error + $hdr =~ /^\0+$/ or $err = 'Corrupt file or unsupported InDesign version'; + last; + } + my $len = Get32u(\$hdr, 24); + if ($verbose) { + printf $out "Contiguous object at offset 0x%x (%d bytes):\n", $raf->Tell(), $len; + if ($verbose > 2) { + my $len2 = $len < 1024000 ? $len : 1024000; + $raf->Seek(-$raf->Read($buff, $len2), 1) or $err = 1; + $et->VerboseDump(\$buff, Addr => $raf->Tell()); + } + } + # check for XMP if stream data is long enough + # (56 bytes is just enough for XMP header) + if ($len > 56) { + $raf->Read($buff, 56) == 56 or $err = 'Unexpected end of file', last; + if ($buff =~ /^(....)<\?xpacket begin=(['"])\xef\xbb\xbf\2 id=(['"])W5M0MpCehiHzreSzNTczkc9d\3/s) { + my $lenWord = $1; # save length word for writing later + $len -= 4; # get length of XMP only + $foundXMP = 1; + # I have a sample where the XMP is 107 MB, and ActivePerl may run into + # memory troubles (with its apparent 1 GB limit) if the XMP is larger + # than about 400 MB, so guard against this + if ($len > 300 * 1024 * 1024) { + my $msg = sprintf('Insanely large XMP (%.0f MB)', $len / (1024 * 1024)); + if ($outfile) { + $et->Error($msg, 2) and $err = 1, last; + } elsif ($et->Options('IgnoreMinorErrors')) { + $et->Warn($msg); + } else { + $et->Warn("$msg. Ignored.", 1); + $err = 1; + last; + } + } + # load and parse the XMP data + unless ($raf->Seek(-52, 1) and $raf->Read($buff, $len) == $len) { + $err = 'Error reading XMP stream'; + last; + } + my %dirInfo = ( + DataPt => \$buff, + Parent => 'IND', + NoDelete => 1, # do not allow this to be deleted when writing + ); + # validate xmp data length (should be same as length in header - 4) + my $xmpLen = unpack($streamInt32u, $lenWord); + unless ($xmpLen == $len) { + if ($xmpLen < $len) { + $dirInfo{DirLen} = $xmpLen; + } else { + $err = 'Truncated XMP stream (missing ' . ($xmpLen - $len) . ' bytes)'; + } + } + my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main'); + if ($outfile) { + last if $err; + # make sure that XMP is writable + my $classID = Get32u(\$hdr, 20); + $classID & 0x40000000 or $err = 'XMP stream is not writable', last; + my $xmp = $et->WriteDirectory(\%dirInfo, $tagTablePtr); + if ($xmp and length $xmp) { + # write new xmp with leading length word + $buff = pack($streamInt32u, length $xmp) . $xmp; + # update header with new length and invalid checksum + Set32u(length($buff), \$hdr, 24); + Set32u(0xffffffff, \$hdr, 28); + } else { + $$et{CHANGED} = 0; # didn't change anything + $et->Warn("Can't delete XMP as a block from InDesign file") if defined $xmp; + # put length word back at start of stream + $buff = $lenWord . $buff; + } + } else { + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + $len = 0; # we got the full stream (nothing left to read) + } else { + $len -= 56; # we got 56 bytes of the stream + } + } else { + $buff = ''; # must reset this for writing later + } + if ($outfile) { + # write object header and data + Write($outfile, $hdr, $buff) or $err = 1, last; + my $result = Image::ExifTool::CopyBlock($raf, $outfile, $len); + unless ($result) { + $err = defined $result ? 'Truncated stream data' : 1; + last; + } + $writeLen += 32 + length($buff) + $len; + } elsif ($len) { + # skip over remaining stream data + $raf->Seek($len, 1) or $err = 'Seek error', last; + } + $raf->Read($buff, 32) == 32 or $err = 'Unexpected end of file', last; + unless ($buff =~ /^\Q$objectTrailerGUID/) { + $err = 'Invalid object trailer'; + last; + } + if ($outfile) { + # make sure object UID and ClassID are the same in the trailer + substr($hdr,16,8) eq substr($buff,16,8) or $err = 'Non-matching object trailer', last; + # write object trailer + Write($outfile, $objectTrailerGUID, substr($hdr,16)) or $err = 1, last; + $writeLen += 32; + } + } + if ($outfile) { + # write null padding if necessary + # (InDesign files must be an even number of 4096-byte blocks) + my $part = $writeLen % 4096; + Write($outfile, "\0" x (4096 - $part)) or $err = 1 if $part; + } +DONE: + if (not $err) { + $et->Warn('No XMP stream to edit') if $outfile and not $foundXMP; + return 1; # success! + } elsif (not $outfile) { + # issue warning on read error + $et->Warn($err) unless $err eq '1'; + } elsif ($err ne '1') { + # set error and return success code + $et->Error($err); + } else { + return -1; # write error + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::InDesign - Read/write meta information in Adobe InDesign files + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to read XMP +meta information from Adobe InDesign (.IND, .INDD and .INDT) files. + +=head1 LIMITATIONS + +1) Only XMP meta information is processed. + +2) A new XMP stream may not be created, so XMP tags may only be written to +InDesign files which previously contained XMP. + +3) File sizes of greater than 2 GB are supported only if the system supports +them and the LargeFileSupport option is enabled. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/JPEG.pm b/lib/Image/ExifTool/JPEG.pm new file mode 100644 index 0000000..e1eea0d --- /dev/null +++ b/lib/Image/ExifTool/JPEG.pm @@ -0,0 +1,732 @@ +#------------------------------------------------------------------------------ +# File: JPEG.pm +# +# Description: Definitions for uncommon JPEG segments +# +# Revisions: 10/06/2006 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::JPEG; +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.33'; + +sub ProcessOcad($$$); +sub ProcessJPEG_HDR($$$); + +# (most of the tags in this table are for documentation purposes only) +%Image::ExifTool::JPEG::Main = ( + NOTES => q{ + This table lists information extracted by ExifTool from JPEG images. See + L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification. + }, + APP0 => [{ + Name => 'JFIF', + Condition => '$$valPt =~ /^JFIF\0/', + SubDirectory => { TagTable => 'Image::ExifTool::JFIF::Main' }, + }, { + Name => 'JFXX', + Condition => '$$valPt =~ /^JFXX\0\x10/', + SubDirectory => { TagTable => 'Image::ExifTool::JFIF::Extension' }, + }, { + Name => 'CIFF', + Condition => '$$valPt =~ /^(II|MM).{4}HEAPJPGM/s', + SubDirectory => { TagTable => 'Image::ExifTool::CanonRaw::Main' }, + }, { + Name => 'AVI1', + Condition => '$$valPt =~ /^AVI1/', + SubDirectory => { TagTable => 'Image::ExifTool::JPEG::AVI1' }, + }, { + Name => 'Ocad', + Condition => '$$valPt =~ /^Ocad/', + SubDirectory => { TagTable => 'Image::ExifTool::JPEG::Ocad' }, + }], + APP1 => [{ + Name => 'EXIF', + Condition => '$$valPt =~ /^Exif\0/', + SubDirectory => { TagTable => 'Image::ExifTool::Exif::Main' }, + }, { + Name => 'ExtendedXMP', + Condition => '$$valPt =~ m{^http://ns.adobe.com/xmp/extension/\0}', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, { + Name => 'XMP', + Condition => '$$valPt =~ /^http/ or $$valPt =~ /<exif:/', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, { + Name => 'QVCI', + Condition => '$$valPt =~ /^QVCI\0/', + SubDirectory => { TagTable => 'Image::ExifTool::Casio::QVCI' }, + }, { + Name => 'FLIR', + Condition => '$$valPt =~ /^FLIR\0/', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::FFF' }, + }, { + Name => 'RawThermalImage', # (from Parrot Bebop-Pro Thermal drone) + Condition => '$$valPt =~ /^PARROT\0(II\x2a\0|MM\0\x2a)/', + Groups => { 0 => 'APP1', 1 => 'Parrot', 2 => 'Preview' }, + Notes => 'thermal image from Parrot Bebop-Pro Thermal drone', + RawConv => 'substr($val, 7)', + Binary => 1, + }], + APP2 => [{ + Name => 'ICC_Profile', + Condition => '$$valPt =~ /^ICC_PROFILE\0/', + SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' }, + }, { + Name => 'FPXR', + Condition => '$$valPt =~ /^FPXR\0/', + SubDirectory => { TagTable => 'Image::ExifTool::FlashPix::Main' }, + }, { + Name => 'MPF', + Condition => '$$valPt =~ /^MPF\0/', + SubDirectory => { TagTable => 'Image::ExifTool::MPF::Main' }, + }, { + Name => 'PreviewImage', + Condition => '$$valPt =~ /^(|QVGA\0|BGTH)\xff\xd8\xff\xdb/', + Notes => 'Samsung APP2 preview image', # (Samsung/GoPro="", BenQ="QVGA\0", Digilife="BGTH") + }], + APP3 => [{ + Name => 'Meta', + Condition => '$$valPt =~ /^(Meta|META|Exif)\0\0/', + SubDirectory => { TagTable => 'Image::ExifTool::Kodak::Meta' }, + }, { + Name => 'Stim', + Condition => '$$valPt =~ /^Stim\0/', + SubDirectory => { TagTable => 'Image::ExifTool::Stim::Main' }, + }, { + Name => 'JPS', + Condition => '$$valPt =~ /^_JPSJPS_/', + SubDirectory => { TagTable => 'Image::ExifTool::JPEG::JPS' }, + }, { + Name => 'ThermalData', # (written by DJI FLIR models) + Condition => '$$self{Make} eq "DJI"', + Notes => 'DJI raw thermal data', + Groups => { 0 => 'APP3', 1 => 'DJI', 2 => 'Image' }, + Binary => 1, + }, { + Name => 'PreviewImage', # (written by HP R837 and Samsung S1060) + Condition => '$$valPt =~ /^\xff\xd8\xff\xdb/', + Notes => 'Samsung/HP preview image', # (Samsung, HP, BenQ) + }], + APP4 => [{ + Name => 'Scalado', + Condition => '$$valPt =~ /^SCALADO\0/', + SubDirectory => { TagTable => 'Image::ExifTool::Scalado::Main' }, + }, { + Name => 'FPXR', # (non-standard location written by some HP models) + Condition => '$$valPt =~ /^FPXR\0/', + SubDirectory => { TagTable => 'Image::ExifTool::FlashPix::Main' }, + }, { + Name => 'ThermalParams', # (written by DJI FLIR models) + Condition => '$$self{Make} eq "DJI" and $$valPt =~ /^\xaa\x55\x12\x06/', + SubDirectory => { TagTable => 'Image::ExifTool::DJI::ThermalParams' }, + }, { + Name => 'PreviewImage', # (eg. Samsung S1060) + Notes => 'continued from APP3', + }], + APP5 => [{ + Name => 'RMETA', + Condition => '$$valPt =~ /^RMETA\0/', + SubDirectory => { TagTable => 'Image::ExifTool::Ricoh::RMETA' }, + }, { + Name => 'SamsungUniqueID', + Condition => '$$valPt =~ /ssuniqueid\0/', + SubDirectory => { TagTable => 'Image::ExifTool::Samsung::APP5' }, + }, { + Name => 'ThermalCalibration', # (written by DJI FLIR models) + Condition => '$$self{Make} eq "DJI"', + Notes => 'DJI thermal calibration data', + Groups => { 0 => 'APP5', 1 => 'DJI', 2 => 'Image' }, + Binary => 1, + }, { + Name => 'PreviewImage', # (eg. BenQ DC E1050) + Notes => 'continued from APP4', + }], + APP6 => [{ + Name => 'EPPIM', + Condition => '$$valPt =~ /^EPPIM\0/', + SubDirectory => { TagTable => 'Image::ExifTool::JPEG::EPPIM' }, + }, { + Name => 'NITF', + Condition => '$$valPt =~ /^NTIF\0/', + SubDirectory => { TagTable => 'Image::ExifTool::JPEG::NITF' }, + }, { + Name => 'HP_TDHD', # (written by R837) + Condition => '$$valPt =~ /^TDHD\x01\0\0\0/', + SubDirectory => { TagTable => 'Image::ExifTool::HP::TDHD' }, + }, { + Name => 'GoPro', + Condition => '$$valPt =~ /^GoPro\0/', + SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPMF' }, + # also seen Motorola APP6 "MMIMETA\0", with sub-types: AL3A,ALED,MMI0,MOTD,QC3A + }, { + Name => 'DJI_DTAT', # (written by ZH20T) + Condition => '$$valPt =~ /^DTAT\0\0.\{/s', + Groups => { 0 => 'APP6', 1 => 'DJI' }, + Notes => 'DJI Thermal Analysis Tool record', + ValueConv => 'substr($val,7)', + }], + APP7 => [{ + Name => 'Pentax', + Condition => '$$valPt =~ /^PENTAX \0/', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::Main' }, + }, { + Name => 'Huawei', + Condition => '$$valPt =~ /^HUAWEI\0\0/', + SubDirectory => { TagTable => 'Image::ExifTool::Unknown::Main' }, + }, { + Name => 'Qualcomm', + Condition => '$$valPt =~ /^\x1aQualcomm Camera Attributes/', + SubDirectory => { TagTable => 'Image::ExifTool::Qualcomm::Main' }, + }], + APP8 => { + Name => 'SPIFF', + Condition => '$$valPt =~ /^SPIFF\0/', + SubDirectory => { TagTable => 'Image::ExifTool::JPEG::SPIFF' }, + }, + APP9 => { + Name => 'MediaJukebox', + Condition => '$$valPt =~ /^Media Jukebox\0/', + SubDirectory => { TagTable => 'Image::ExifTool::JPEG::MediaJukebox' }, + }, + APP10 => { + Name => 'Comment', + Condition => '$$valPt =~ /^UNICODE\0/', + Notes => 'PhotoStudio Unicode comment', + }, + APP11 => [{ + Name => 'JPEG-HDR', + Condition => '$$valPt =~ /^HDR_RI /', + SubDirectory => { TagTable => 'Image::ExifTool::JPEG::HDR' }, + },{ + Name => 'JUMBF', + Condition => '$$valPt =~ /^JP/', + SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::Main' }, + }], + APP12 => [{ + Name => 'PictureInfo', + Condition => '$$valPt =~ /(\[picture info\]|Type=)/', + SubDirectory => { TagTable => 'Image::ExifTool::APP12::PictureInfo' }, + }, { + Name => 'Ducky', + Condition => '$$valPt =~ /^Ducky/', + SubDirectory => { TagTable => 'Image::ExifTool::APP12::Ducky' }, + }], + APP13 => [{ + Name => 'Photoshop', + Condition => '$$valPt =~ /^(Photoshop 3.0\0|Adobe_Photoshop2.5)/', + SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Main' }, + }, { + Name => 'Adobe_CM', + Condition => '$$valPt =~ /^Adobe_CM/', + SubDirectory => { TagTable => 'Image::ExifTool::JPEG::AdobeCM' }, + }], + APP14 => { + Name => 'Adobe', + Condition => '$$valPt =~ /^Adobe/', + Writable => 2, # (for docs only) + SubDirectory => { TagTable => 'Image::ExifTool::JPEG::Adobe' }, + }, + APP15 => { + Name => 'GraphicConverter', + Condition => '$$valPt =~ /^Q\s*(\d+)/', + SubDirectory => { TagTable => 'Image::ExifTool::JPEG::GraphConv' }, + }, + # APP15 - Also unknown "TEXT\0" segment stored by Casio/FujiFilm + COM => { + Name => 'Comment', + # note: flag as writable for documentation, but it won't show up + # in the TagLookup as writable because there is no WRITE_PROC + Writable => 2, + }, + SOF => { + Name => 'StartOfFrame', + SubDirectory => { TagTable => 'Image::ExifTool::JPEG::SOF' }, + }, + DQT => { + Name => 'DefineQuantizationTable', + Notes => 'used to calculate the Extra JPEGDigest tag value', + }, + Trailer => [{ + Name => 'AFCP', + Condition => '$$valPt =~ /AXS(!|\*).{8}$/s', + SubDirectory => { TagTable => 'Image::ExifTool::AFCP::Main' }, + }, { + Name => 'CanonVRD', + Condition => '$$valPt =~ /CANON OPTIONAL DATA\0.{44}$/s', + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::Main' }, + }, { + Name => 'FotoStation', + Condition => '$$valPt =~ /\xa1\xb2\xc3\xd4$/', + SubDirectory => { TagTable => 'Image::ExifTool::FotoStation::Main' }, + }, { + Name => 'PhotoMechanic', + Condition => '$$valPt =~ /cbipcbbl$/', + SubDirectory => { TagTable => 'Image::ExifTool::PhotoMechanic::Main' }, + }, { + Name => 'MIE', + Condition => q{ + $$valPt =~ /~\0\x04\0zmie~\0\0\x06.{4}[\x10\x18]\x04$/s or + $$valPt =~ /~\0\x04\0zmie~\0\0\x0a.{8}[\x10\x18]\x08$/s + }, + SubDirectory => { TagTable => 'Image::ExifTool::MIE::Main' }, + }, { + Name => 'Samsung', + Condition => '$$valPt =~ /QDIOBS$/', + SubDirectory => { TagTable => 'Image::ExifTool::Samsung::Trailer' }, + }, { + Name => 'EmbeddedVideo', + Notes => 'extracted only when ExtractEmbedded option is used', + Condition => '$$valPt =~ /^.{4}ftyp/s', + }, { + Name => 'Insta360', + Condition => '$$valPt =~ /8db42d694ccc418790edff439fe026bf$/', + }, { + Name => 'NikonApp', + Condition => '$$valPt =~ m(\0{6}/NIKON APP$)', + Notes => 'contains editing information in XMP format', + }, { + Name => 'PreviewImage', + Condition => '$$valPt =~ /^\xff\xd8\xff/', + Writable => 2, # (for docs only) + }], +); + +# JPS APP3 segment (ref http://paulbourke.net/stereographics/stereoimage/) +%Image::ExifTool::JPEG::JPS = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'APP3', 1 => 'JPS', 2 => 'Image' }, + NOTES => 'Tags found in JPEG Stereo (JPS) images.', + 0x0a => { + Name => 'JPSSeparation', + Format => 'int32u', # (just so we can look ahead to MediaType); + Notes => 'stereo only', + RawConv => q{ + $$self{MediaType} = $val & 0xff; + return undef unless $$self{MediaType} == 1; + return(($val >> 24) & 0xff); + }, + }, + 0x08 => { + Name => 'HdrLength', + Format => 'int16u', + Hidden => 1, + RawConv => '$$self{HdrLength} = $val; undef', + }, + 0x0b => { + Name => 'JPSFlags', + PrintConv => { BITMASK => { + 0 => 'Half height', + 1 => 'Half width', + 2 => 'Left field first', + }}, + }, + 0x0c => [{ + Name => 'JPSLayout', + Condition => '$$self{MediaType} == 0', + Notes => 'mono', + PrintConv => { + 0 => 'Both Eyes', + 1 => 'Left Eye', + 2 => 'Right Eye', + }, + },{ + Name => 'JPSLayout', + Condition => '$$self{MediaType} == 1', + Notes => 'stereo', + PrintConv => { + 1 => 'Interleaved', + 2 => 'Side By Side', + 3 => 'Over Under', + 4 => 'Anaglyph', + }, + }], + 0x0d => { + Name => 'JPSType', + Hook => '$varSize += $$self{HdrLength} - 4', # comment starts after header block + PrintConv => { 0 => 'Mono', 1 => 'Stereo' }, + }, + # 0x0e - in16u comment length (ignored -- assume the remainder is all comment) + # (this is offset if we had a 4-byte JPS header block) + 0x10 => { + Name => 'JPSComment', + Format => 'string', + }, +); + +# EPPIM APP6 (Toshiba PrintIM) segment (ref PH, from PDR-M700 samples) +%Image::ExifTool::JPEG::EPPIM = ( + GROUPS => { 0 => 'APP6', 1 => 'EPPIM', 2 => 'Image' }, + NOTES => q{ + APP6 is used in by the Toshiba PDR-M700 to store a TIFF structure containing + PrintIM information. + }, + 0xc4a5 => { + Name => 'PrintIM', + # must set Writable here so this tag will be saved with MakerNotes option + # (but it isn't actually writable because there is no WRITE_PROC) + Writable => 'undef', + Description => 'Print Image Matching', + SubDirectory => { + TagTable => 'Image::ExifTool::PrintIM::Main', + }, + }, +); + +# APP8 SPIFF segment. Refs: +# 1) http://www.fileformat.info/format/spiff/ +# 2) http://www.jpeg.org/public/spiff.pdf +%Image::ExifTool::JPEG::SPIFF = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'APP8', 1 => 'SPIFF', 2 => 'Image' }, + NOTES => q{ + This information is found in APP8 of SPIFF-style JPEG images (the "official" + yet rarely used JPEG file format standard: Still Picture Interchange File + Format). See L<http://www.jpeg.org/public/spiff.pdf> for the official + specification. + }, + 0 => { + Name => 'SPIFFVersion', + Format => 'int8u[2]', + PrintConv => '$val =~ tr/ /./; $val', + }, + 2 => { + Name => 'ProfileID', + PrintConv => { + 0 => 'Not Specified', + 1 => 'Continuous-tone Base', + 2 => 'Continuous-tone Progressive', + 3 => 'Bi-level Facsimile', + 4 => 'Continuous-tone Facsimile', + }, + }, + 3 => 'ColorComponents', + 6 => { + Name => 'ImageHeight', + Notes => q{ + at index 4 in specification, but there are 2 extra bytes here in my only + SPIFF sample, version 1.2 + }, + Format => 'int32u', + }, + 10 => { + Name => 'ImageWidth', + Format => 'int32u', + }, + 14 => { + Name => 'ColorSpace', + PrintConv => { + 0 => 'Bi-level', + 1 => 'YCbCr, ITU-R BT 709, video', + 2 => 'No color space specified', + 3 => 'YCbCr, ITU-R BT 601-1, RGB', + 4 => 'YCbCr, ITU-R BT 601-1, video', + 8 => 'Gray-scale', + 9 => 'PhotoYCC', + 10 => 'RGB', + 11 => 'CMY', + 12 => 'CMYK', + 13 => 'YCCK', + 14 => 'CIELab', + }, + }, + 15 => 'BitsPerSample', + 16 => { + Name => 'Compression', + PrintConv => { + 0 => 'Uncompressed, interleaved, 8 bits per sample', + 1 => 'Modified Huffman', + 2 => 'Modified READ', + 3 => 'Modified Modified READ', + 4 => 'JBIG', + 5 => 'JPEG', + }, + }, + 17 => { + Name => 'ResolutionUnit', + PrintConv => { + 0 => 'None', + 1 => 'inches', + 2 => 'cm', + }, + }, + 18 => { + Name => 'YResolution', + Format => 'int32u', + }, + 22 => { + Name => 'XResolution', + Format => 'int32u', + }, +); + +# APP9 Media Jukebox segment (ref PH) +%Image::ExifTool::JPEG::MediaJukebox = ( + GROUPS => { 0 => 'XML', 1 => 'MediaJukebox', 2 => 'Image' }, + VARS => { NO_ID => 1 }, + NOTES => 'Tags found in the XML metadata of the APP9 "Media Jukebox" segment.', + Date => { + Groups => { 2 => 'Time' }, + # convert from days since Dec 30, 1899 to seconds since Jan 1, 1970 + ValueConv => 'ConvertUnixTime(($val - (70 * 365 + 17 + 2)) * 24 * 3600)', + PrintConv => '$self->ConvertDateTime($val)', + }, + Album => { }, + Caption => { }, + Keywords => { }, + Name => { }, + People => { }, + Places => { }, + Tool_Name => { }, + Tool_Version => { }, +); + +# JPEG-HDR APP11 information (ref PH, guessed from http://anyhere.com/gward/papers/cic05.pdf) +%Image::ExifTool::JPEG::HDR = ( + GROUPS => { 0 => 'APP11', 1 => 'JPEG-HDR', 2 => 'Image' }, + PROCESS_PROC => \&ProcessJPEG_HDR, + TAG_PREFIX => '', # (no prefix for unknown tags) + NOTES => 'Information extracted from APP11 of a JPEG-HDR image.', + ver => 'JPEG-HDRVersion', + # (need names for the next 3 tags) + ln0 => { Description => 'Ln0' }, + ln1 => { Description => 'Ln1' }, + s2n => { Description => 'S2n' }, + alp => { Name => 'Alpha' }, # (Alpha/Beta are saturation parameters) + bet => { Name => 'Beta' }, + cor => { Name => 'CorrectionMethod' }, + RatioImage => { + Groups => { 2 => 'Preview' }, + Notes => 'the embedded JPEG-compressed ratio image', + Binary => 1, + }, +); + +# AdobeCM APP13 (no references) +%Image::ExifTool::JPEG::AdobeCM = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'APP13', 1 => 'AdobeCM', 2 => 'Image' }, + NOTES => q{ + The APP13 "Adobe_CM" segment presumably contains color management + information, but the meaning of the data is currently unknown. If anyone + has an idea about what this means, please let me know. + }, + FORMAT => 'int16u', + 0 => 'AdobeCMType', +); + +# Adobe APP14 refs: +# http://partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf +# http://java.sun.com/j2se/1.5.0/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html#color +%Image::ExifTool::JPEG::Adobe = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'APP14', 1 => 'Adobe', 2 => 'Image' }, + NOTES => q{ + The APP14 "Adobe" segment stores image encoding information for DCT filters. + This segment may be copied or deleted as a block using the Extra "Adobe" + tag, but note that it is not deleted by default when deleting all metadata + because it may affect the appearance of the image. + }, + FORMAT => 'int16u', + 0 => 'DCTEncodeVersion', + 1 => { + Name => 'APP14Flags0', + PrintConv => { + 0 => '(none)', + BITMASK => { + 15 => 'Encoded with Blend=1 downsampling' + }, + }, + }, + 2 => { + Name => 'APP14Flags1', + PrintConv => { + 0 => '(none)', + BITMASK => { }, + }, + }, + 3 => { + Name => 'ColorTransform', + Format => 'int8u', + PrintConv => { + 0 => 'Unknown (RGB or CMYK)', + 1 => 'YCbCr', + 2 => 'YCCK', + }, + }, +); + +# GraphicConverter APP15 (ref PH) +%Image::ExifTool::JPEG::GraphConv = ( + GROUPS => { 0 => 'APP15', 1 => 'GraphConv', 2 => 'Image' }, + NOTES => 'APP15 is used by GraphicConverter to store JPEG quality.', + 'Q' => 'Quality', +); + +# APP0 AVI1 segment (ref http://www.schnarff.com/file-formats/bmp/BMPDIB.TXT) +%Image::ExifTool::JPEG::AVI1 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'APP0', 1 => 'AVI1', 2 => 'Image' }, + NOTES => 'This information may be found in APP0 of JPEG image data from AVI videos.', + FIRST_ENTRY => 0, + 0 => { + Name => 'InterleavedField', + PrintConv => { + 0 => 'Not Interleaved', + 1 => 'Odd', + 2 => 'Even', + }, + }, +); + +# APP0 Ocad segment (ref PH) +%Image::ExifTool::JPEG::Ocad = ( + PROCESS_PROC => \&ProcessOcad, + GROUPS => { 0 => 'APP0', 1 => 'Ocad', 2 => 'Image' }, + TAG_PREFIX => 'Ocad', + FIRST_ENTRY => 0, + NOTES => q{ + Tags extracted from the JPEG APP0 "Ocad" segment (found in Photobucket + images). + }, + Rev => { + Name => 'OcadRevision', + Format => 'string[6]', + } +); + +# APP6 NITF segment (National Imagery Transmission Format) +# ref http://www.gwg.nga.mil/ntb/baseline/docs/n010697/bwcguide25aug98.pdf +%Image::ExifTool::JPEG::NITF = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'APP6', 1 => 'NITF', 2 => 'Image' }, + NOTES => q{ + Information in APP6 used by the National Imagery Transmission Format. See + L<http://www.gwg.nga.mil/ntb/baseline/docs/n010697/bwcguide25aug98.pdf> for + the official specification. + }, + 0 => { + Name => 'NITFVersion', + Format => 'int8u[2]', + ValueConv => 'sprintf("%d.%.2d", split(" ",$val))', + }, + 2 => { + Name => 'ImageFormat', + ValueConv => 'chr($val & 0xff)', + PrintConv => { B => 'IMode B' }, + }, + 3 => { + Name => 'BlocksPerRow', + Format => 'int16u', + }, + 5 => { + Name => 'BlocksPerColumn', + Format => 'int16u', + }, + 7 => { + Name => 'ImageColor', + PrintConv => { 0 => 'Monochrome' }, + }, + 8 => 'BitDepth', + 9 => { + Name => 'ImageClass', + PrintConv => { + 0 => 'General Purpose', + 4 => 'Tactical Imagery', + }, + }, + 10 => { + Name => 'JPEGProcess', + PrintConv => { + 1 => 'Baseline sequential DCT, Huffman coding, 8-bit samples', + 4 => 'Extended sequential DCT, Huffman coding, 12-bit samples', + }, + }, + 11 => 'Quality', + 12 => { + Name => 'StreamColor', + PrintConv => { 0 => 'Monochrome' }, + }, + 13 => 'StreamBitDepth', + 14 => { + Name => 'Flags', + Format => 'int32u', + PrintConv => 'sprintf("0x%x", $val)', + }, +); + +#------------------------------------------------------------------------------ +# Extract information from the JPEG APP0 Ocad segment +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessOcad($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + $et->VerboseDir('APP0 Ocad', undef, length $$dataPt); + for (;;) { + last unless $$dataPt =~ /\$(\w+):([^\0\$]+)/g; + my ($tag, $val) = ($1, $2); + $val =~ s/^\s+//; $val =~ s/\s+$//; # remove leading/trailing spaces + AddTagToTable($tagTablePtr, $tag) unless $$tagTablePtr{$tag}; + $et->HandleTag($tagTablePtr, $tag, $val); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from the JPEG APP0 Ocad segment +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessJPEG_HDR($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + $$dataPt =~ /~\0/g or $et->Warn('Unrecognized JPEG-HDR format'), return 0; + my $pos = pos $$dataPt; + my $meta = substr($$dataPt, 7, $pos-9); + $et->VerboseDir('APP11 JPEG-HDR', undef, length $$dataPt); + while ($meta =~ /(\w+)=([^,\s]*)/g) { + my ($tag, $val) = ($1, $2); + AddTagToTable($tagTablePtr, $tag) unless $$tagTablePtr{$tag}; + $et->HandleTag($tagTablePtr, $tag, $val); + } + $et->HandleTag($tagTablePtr, 'RatioImage', substr($$dataPt, $pos)); + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::JPEG - Definitions for uncommon JPEG segments + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool for some +uncommon JPEG segments. For speed reasons, definitions for more common JPEG +segments are included in the Image::ExifTool module itself. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/JPEG Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/JPEGDigest.pm b/lib/Image/ExifTool/JPEGDigest.pm new file mode 100644 index 0000000..759d2a3 --- /dev/null +++ b/lib/Image/ExifTool/JPEGDigest.pm @@ -0,0 +1,2617 @@ +#------------------------------------------------------------------------------ +# File: JPEGDigest.pm +# +# Description: Calculate JPEGDigest and JPEGQualityEstimate +# +# Revisions: 2008/09/15 - P. Harvey Created +# 2016/01/05 - PH Added calculation of JPEGQualityEstimate +# +# References: JD) Jens Duttke +# 2) Franz Buchinger private communication +# 3) https://github.com/ImageMagick/ImageMagick/blob/master/coders/jpeg.c +#------------------------------------------------------------------------------ + +package Image::ExifTool::JPEGDigest; +use strict; +use vars qw($VERSION); + +$VERSION = '1.06'; + +# the print conversion for the JPEGDigest tag +my %PrintConv = ( #JD + # No DQT defined + 'd41d8cd98f00b204e9800998ecf8427e' => 'No DQT defined', + + # Tested with: + # - Independent JPEG Group library (used by many applications) X3 (Win) + # - Different subsamplings possible + # - Dynamic Photo HDR 3.0 (Win) + # - Fixed to quality 92? + # - Fixed subsampling of 111111? + # - FixFoto (Win) + # - These DQTs are only used for the Quality settings 24 to 100 + # - Different subsamplings possible + # - Subsampling of 221111 is default + # - GraphicConverter 4.4.4 (Mac) + # - Using the JPEG 6.0 library + # - Fixed subsampling to 221111 + # - IrfanView 4.10 (Win) + # - Subsampling 111111 with option "Disable subsampling", otherwise 221111 + # - Quality mode 0 doesn't exist here + # - Jasc Paint Shop Pro Version 5.01 (Win) + # - Fixed subsampling of 221111 + # - Use reversed Quality values (0 or 1 = 99; 2 = 98; 3 = 97 etc.) + # - Microsoft GDI+ Version 5.1.3102.2180 (Win) + # - Fixed subsampling of 221111 (or is that just the default subsampling?) + # - Photomatix pro 3.0 (Win) + # - Fixed subsampling to 221111 + + # IJG library + 'f83c5bc303fa1f74265863c2c6844edf' => 'Independent JPEG Group library (used by many applications), Quality 0 or 1', + '1e81ee25c96cdf46f44a9b930780f8c0' => 'Independent JPEG Group library (used by many applications), Quality 2', + '205d4a597e68f2da78137e52f39d2728' => 'Independent JPEG Group library (used by many applications), Quality 3', + '81a936d8371a7d59da428fcfc349850f' => 'Independent JPEG Group library (used by many applications), Quality 4', + '610772f3cf75c2fd89214fafbd7617a6' => 'Independent JPEG Group library (used by many applications), Quality 5', + '577ec8895d884612d064771e84cf231f' => 'Independent JPEG Group library (used by many applications), Quality 6', + '7dc25cc528116e25dd1aeb590dd7cb66' => 'Independent JPEG Group library (used by many applications), Quality 7', + 'e3cc8a85db1a32e81650b9668b98644a' => 'Independent JPEG Group library (used by many applications), Quality 8', + 'e2408846813c1f5c7f5ce3cf69e741c4' => 'Independent JPEG Group library (used by many applications), Quality 9', + 'e800426d2ef8d3cda13a0b41f1b2cc5a' => 'Independent JPEG Group library (used by many applications), Quality 10', + '8ef467e72e5006d1b48209e7b5d94541' => 'Independent JPEG Group library (used by many applications), Quality 11', + 'af6a08d0742aa8ed6bae2f1c374e7931' => 'Independent JPEG Group library (used by many applications), Quality 12', + 'e002d9728c73f60e4d0509e1cea9af43' => 'Independent JPEG Group library (used by many applications), Quality 13', + '1eb8b98bef8b062e4bc10cffea2d8372' => 'Independent JPEG Group library (used by many applications), Quality 14', + '99d933a8a9ece6f2ee65757aa81ef5bd' => 'Independent JPEG Group library (used by many applications), Quality 15', + 'c7d0f7dee5631d01bc55b7c598805d98' => 'Independent JPEG Group library (used by many applications), Quality 16', + '71555bee8d64c9dfca3cefa9dd332472' => 'Independent JPEG Group library (used by many applications), Quality 17', + '5009778c2a1df1deeb040c85fb9d0db2' => 'Independent JPEG Group library (used by many applications), Quality 18', + '81339d89e8294729c69fc096f1a448f3' => 'Independent JPEG Group library (used by many applications), Quality 19', + '82028a770d9e45d64d6aa26faee97e72' => 'Independent JPEG Group library (used by many applications), Quality 20', + '3ebb7aa9113b3e1628f55732de7dae7f' => 'Independent JPEG Group library (used by many applications), Quality 21', + '704c1868fe865f1038aa2bd0697f71a0' => 'Independent JPEG Group library (used by many applications), Quality 22', + '555fd108ab97e641fcfefee4bda6a306' => 'Independent JPEG Group library (used by many applications), Quality 23', + 'f1d9a0410c5ea11613569783625f5cf3' => 'Independent JPEG Group library (used by many applications), Quality 24', + 'ce378a14d52ee5752ded23b5a444f75e' => 'Independent JPEG Group library (used by many applications), Quality 25', + '3f243aacd371617b69f1e1eacadbbe2e' => 'Independent JPEG Group library (used by many applications), Quality 26', + 'c70a1df73760a88deb890003cdab3bfe' => 'Independent JPEG Group library (used by many applications), Quality 27', + 'aa5e05f96c53f6bc498f5016b1113651' => 'Independent JPEG Group library (used by many applications), Quality 28', + '740d4a06f4d0f774c6aac95719673793' => 'Independent JPEG Group library (used by many applications), Quality 29', + '1426dd9c1c8098936f395e201f1eb56d' => 'Independent JPEG Group library (used by many applications), Quality 30', + '891a53bb6a5261a2c076cf8931c3660e' => 'Independent JPEG Group library (used by many applications), Quality 31', + '1c87cb13f4b7a5ed45b09fc4f0e52d68' => 'Independent JPEG Group library (used by many applications), Quality 32', + '2457f78378c5efdac8e1ef619a4285cd' => 'Independent JPEG Group library (used by many applications), Quality 33', + '20f79a557d4edb1917d243d00a7a9ba8' => 'Independent JPEG Group library (used by many applications), Quality 34', + 'e06d44ffef23792c88f215a5b2ed9478' => 'Independent JPEG Group library (used by many applications), Quality 35', + 'df1b50991b82b66c82dc856cf82383da' => 'Independent JPEG Group library (used by many applications), Quality 36', + 'ffd6e30af6d99997d38ec3e303687e25' => 'Independent JPEG Group library (used by many applications), Quality 37', + 'ed923fdb1e5009215a49c0d92061c3b0' => 'Independent JPEG Group library (used by many applications), Quality 38', + 'aaf1ebc6949569327f95cf7da78ee7bc' => 'Independent JPEG Group library (used by many applications), Quality 39', + '0fe5225afaf055efd8453426c00e81e1' => 'Independent JPEG Group library (used by many applications), Quality 40', + 'a79e66299883be78b02ceaaf9159c320' => 'Independent JPEG Group library (used by many applications), Quality 41', + 'c9f10fb6d352cc8a8967e7e96a64862c' => 'Independent JPEG Group library (used by many applications), Quality 42', + '6dc3abbdd52b2f26b790ddb33b82099a' => 'Independent JPEG Group library (used by many applications), Quality 43', + '29572be1991c210fabacaeb658a74844' => 'Independent JPEG Group library (used by many applications), Quality 44', + '0c9f89a3728234e0e85645c968d1d84a' => 'Independent JPEG Group library (used by many applications), Quality 45', + 'a5e5355ae60c569dec306eb971a49276' => 'Independent JPEG Group library (used by many applications), Quality 46', + '4a2605b7c5b1bc99b6715342de7b6562' => 'Independent JPEG Group library (used by many applications), Quality 47', + '6af4053465275c1b1b2d5c97f4d841aa' => 'Independent JPEG Group library (used by many applications), Quality 48', + '905a0b1688644902f6a65d872d68a9db' => 'Independent JPEG Group library (used by many applications), Quality 49', + 'ffcd5eab8daeced571d59d4cdcc002c4' => 'Independent JPEG Group library (used by many applications), Quality 50', + '76806382fa57818da2e406a0dc23ce20' => 'Independent JPEG Group library (used by many applications), Quality 51', + '7c71a5eb9408b93be3ea6cf9be1d31ea' => 'Independent JPEG Group library (used by many applications), Quality 52', + 'ccf3f63196092667f97c2ff723481a21' => 'Independent JPEG Group library (used by many applications), Quality 53', + 'acc5e596cc4eb156b83eb89190b289a7' => 'Independent JPEG Group library (used by many applications), Quality 54', + 'a16e53aa41aa66124557c0b976d73734' => 'Independent JPEG Group library (used by many applications), Quality 55', + '2101fdf5c6f6e92943bc16ccf8aa46a8' => 'Independent JPEG Group library (used by many applications), Quality 56', + 'aaa2026d750590e466d9198f20b888e4' => 'Independent JPEG Group library (used by many applications), Quality 57', + 'fcd8c97cf6004230444ce21dab8a167f' => 'Independent JPEG Group library (used by many applications), Quality 58', + '318081abf5329c90d984c2214d69f097' => 'Independent JPEG Group library (used by many applications), Quality 59', + '95348adff2bf5a88f3967e9237fc571e' => 'Independent JPEG Group library (used by many applications), Quality 60; Pentax Better', + 'e22b26930415798b7ecf2b060c1cdc2a' => 'Independent JPEG Group library (used by many applications), Quality 61', + '3e646bfadb62d25ae8404b179e93e74e' => 'Independent JPEG Group library (used by many applications), Quality 62', + '34bf5c46342f2a514f8ae562e520ece0' => 'Independent JPEG Group library (used by many applications), Quality 63', + 'fc9f2bd278075ea89d482e1f9e66738f' => 'Independent JPEG Group library (used by many applications), Quality 64', + 'b55f27c368f119f25957c8e0036b27f8' => 'Independent JPEG Group library (used by many applications), Quality 65', + '5f7b9af6d66eaf12874aa680e7b0d31b' => 'Independent JPEG Group library (used by many applications), Quality 66', + 'a78fd0f1183b268b2fdfa23308c3ad44' => 'Independent JPEG Group library (used by many applications), Quality 67', + '61814a2eca233e10b0ba26881551fb50' => 'Independent JPEG Group library (used by many applications), Quality 68', + 'ce0f36a3d870b24f9816634000ea2d2e' => 'Independent JPEG Group library (used by many applications), Quality 69', + 'f7cba1affebd362a322abd45ce580e56' => 'Independent JPEG Group library (used by many applications), Quality 70', + '7b85fffdf97680de53e49788712c50de' => 'Independent JPEG Group library (used by many applications), Quality 71', + '4abd7dbca7735c987eb899b0f8646ce4' => 'Independent JPEG Group library (used by many applications), Quality 72', + '167959a11aff7940df84ed9f3379ed0a' => 'Independent JPEG Group library (used by many applications), Quality 73', + 'd61807da54a72c4651466049c9f67541' => 'Independent JPEG Group library (used by many applications), Quality 74', + '2851eea5e15f1b977c1496a77c884b4f' => 'Independent JPEG Group library (used by many applications), Quality 75', + 'b095631a0665a515d9aa290639f6672b' => 'Independent JPEG Group library (used by many applications), Quality 76', + '0ee4ea4687d3c57d060e3afd2559b7bb' => 'Independent JPEG Group library (used by many applications), Quality 77', + '37e999828e5bc43ee4a470bf29ea97b7' => 'Independent JPEG Group library (used by many applications), Quality 78', + 'dd9b9d09a624deab730d9bd5b8825baa' => 'Independent JPEG Group library (used by many applications), Quality 79', + '5319a82dc93c1ee5c8d2265e4f1fb60e' => 'Independent JPEG Group library (used by many applications), Quality 80', + '6fa04ba1184e986c4da3df8141e05a42' => 'Independent JPEG Group library (used by many applications), Quality 81', + '1d099901cfe37674e4aeb2cdbddf0703' => 'Independent JPEG Group library (used by many applications), Quality 82', + '8cc04e05813c028683e3cb8e6eab79eb' => 'Independent JPEG Group library (used by many applications), Quality 83', + '3eafbf05c0dd233b385856065e456c11' => 'Independent JPEG Group library (used by many applications), Quality 84', + '98dec36fe95ed7c1772d9ed67a67e260' => 'Independent JPEG Group library (used by many applications), Quality 85', + 'a1ee06d19dcb62c7467768d1ba73cf12' => 'Independent JPEG Group library (used by many applications), Quality 86', + '643ad95753c261eacc5ea3f4c9e4d469' => 'Independent JPEG Group library (used by many applications), Quality 87', + '2557828257dd798ad636df350c685a26' => 'Independent JPEG Group library (used by many applications), Quality 88', + 'a5b4bbf018828a3d00e54ab72a175fdc' => 'Independent JPEG Group library (used by many applications), Quality 89', + '50325a7b6e0a9b7f9aea8f5a6f7f31aa' => 'Independent JPEG Group library (used by many applications), Quality 90', + 'c0cf6b0c508a35a13acd8c912548a269' => 'Independent JPEG Group library (used by many applications), Quality 91', + 'ff0aa07a220cd8973a4b86f3ecd4325b' => 'Independent JPEG Group library (used by many applications), Quality 92', + 'f251d4554524d22f94a34668ab17957c' => 'Independent JPEG Group library (used by many applications), Quality 93', + 'cd993be55bad60bb539df0cc2d7f9f6f' => 'Independent JPEG Group library (used by many applications), Quality 94', + 'adf507352f9ce218a4605700459d597f' => 'Independent JPEG Group library (used by many applications), Quality 95', + '9e9e3e22af4e41ea4ec1b8f656f28f42' => 'Independent JPEG Group library (used by many applications), Quality 96', + 'b9f5c003ef62cbd8fc93be6679c1c3bc' => 'Independent JPEG Group library (used by many applications), Quality 97', + '95b6a316836182441b12039279872ec3' => 'Independent JPEG Group library (used by many applications), Quality 98', + 'b9b1ce23552e2f82b95b48de20065ed3' => 'Independent JPEG Group library (used by many applications), Quality 99', + 'a97591462e9b2339efd4f88ca97bb471' => 'Independent JPEG Group library (used by many applications), Quality 100', + + # Independent JPEG Group library (Grayscale) + # + # Tested with: + # - Corel PhotoImpact X3 (Win) + # - IrfanView (Win) + # - Quality mode 0 doesn't exist here + '185893c53196f6156d458a84e1135c43:11' => 'Independent JPEG Group library (used by many applications), Quality 0 or 1 (Grayscale)', + 'b41ccbe66e41a05de5e68832c07969a7:11' => 'Independent JPEG Group library (used by many applications), Quality 2 (Grayscale)', + 'efa024d741ecc5204e7edd4f590a7a25:11' => 'Independent JPEG Group library (used by many applications), Quality 3 (Grayscale)', + '3396344724a1868ada2330ebaeb9448e:11' => 'Independent JPEG Group library (used by many applications), Quality 4 (Grayscale)', + '14276fffb98deb42b7dbce30abb8425f:11' => 'Independent JPEG Group library (used by many applications), Quality 5 (Grayscale)', + 'a99e2826c10d0922ce8942c5437f53a6:11' => 'Independent JPEG Group library (used by many applications), Quality 6 (Grayscale)', + '0d3de456aa5cbb8a2578208250aa9b88:11' => 'Independent JPEG Group library (used by many applications), Quality 7 (Grayscale)', + 'fa987940fdedbe883cc0e9fcc907f89e:11' => 'Independent JPEG Group library (used by many applications), Quality 8 (Grayscale)', + '1c9bb67190ee64e82d3c67f7943bf4a4:11' => 'Independent JPEG Group library (used by many applications), Quality 9 (Grayscale)', + '57d20578d190b04c7667b10d3df241bb:11' => 'Independent JPEG Group library (used by many applications), Quality 10 (Grayscale)', + '619fd49197f0403ce13d86cffec46419:11' => 'Independent JPEG Group library (used by many applications), Quality 11 (Grayscale)', + '327f47dd8f999b2bbb3bb25c43cf5be5:11' => 'Independent JPEG Group library (used by many applications), Quality 12 (Grayscale)', + 'e4e5bc705c40cfaffff6565f16fe98a9:11' => 'Independent JPEG Group library (used by many applications), Quality 13 (Grayscale)', + '6c64fa9ad302624a826f04ecc80459be:11' => 'Independent JPEG Group library (used by many applications), Quality 14 (Grayscale)', + '039a3f0e101f1bcdb6bb81478cf7ae6b:11' => 'Independent JPEG Group library (used by many applications), Quality 15 (Grayscale)', + 'c23b08c94d7537c9447691d54ae1080c:11' => 'Independent JPEG Group library (used by many applications), Quality 16 (Grayscale)', + '200107bc0174104bbf1d4653c4b05058:11' => 'Independent JPEG Group library (used by many applications), Quality 17 (Grayscale)', + '72abfdc6e65b32ded2cd7ac77a04f447:11' => 'Independent JPEG Group library (used by many applications), Quality 18 (Grayscale)', + '1799a236c36da0b30729d9005ca7c7f9:11' => 'Independent JPEG Group library (used by many applications), Quality 19 (Grayscale)', + 'c33a667bff7f590655d196010c5e39f3:11' => 'Independent JPEG Group library (used by many applications), Quality 20 (Grayscale)', + 'b1dc98f6a2f8828f8432872da43e7d94:11' => 'Independent JPEG Group library (used by many applications), Quality 21 (Grayscale)', + '07318a0acfebe9086f0e04a4c4f5398a:11' => 'Independent JPEG Group library (used by many applications), Quality 22 (Grayscale)', + 'a295b7163305f327a5a45ae177a0a19c:11' => 'Independent JPEG Group library (used by many applications), Quality 23 (Grayscale)', + 'c741c1b134cf81ab69acc81f15a67137:11' => 'Independent JPEG Group library (used by many applications), Quality 24 (Grayscale)', + 'a68893776502a591548c7b5bece13e1b:11' => 'Independent JPEG Group library (used by many applications), Quality 25 (Grayscale)', + '111848d9e41f6f408ef70841f90c0519:11' => 'Independent JPEG Group library (used by many applications), Quality 26 (Grayscale)', + '886374ceebcfd4dfed200b0b34b4baca:11' => 'Independent JPEG Group library (used by many applications), Quality 27 (Grayscale)', + '666dd95fd0e20f5c20bc44d78d528869:11' => 'Independent JPEG Group library (used by many applications), Quality 28 (Grayscale)', + '1aa58cb85dda84de2ddf436667124dcd:11' => 'Independent JPEG Group library (used by many applications), Quality 29 (Grayscale)', + '9d321ab2bdda6f3cb76d2d88838aa8c3:11' => 'Independent JPEG Group library (used by many applications), Quality 30 (Grayscale)', + '6ad87d648101c268f83fa379d4c773f2:11' => 'Independent JPEG Group library (used by many applications), Quality 31 (Grayscale)', + 'cdf8e921300f27a4af7661a2de16e91a:11' => 'Independent JPEG Group library (used by many applications), Quality 32 (Grayscale)', + '3f48672e37b6dd2e571b222e4b7ff97d:11' => 'Independent JPEG Group library (used by many applications), Quality 33 (Grayscale)', + 'a53a7d4cc86d01f4c1b867270c9c078f:11' => 'Independent JPEG Group library (used by many applications), Quality 34 (Grayscale)', + '09ec03f5096df106c692123f3fd34296:11' => 'Independent JPEG Group library (used by many applications), Quality 35 (Grayscale)', + 'a946498fd1902c9de87a1f5182966742:11' => 'Independent JPEG Group library (used by many applications), Quality 36 (Grayscale)', + '5d650a1d38108fd79d4f336ba8e254c2:11' => 'Independent JPEG Group library (used by many applications), Quality 37 (Grayscale)', + '81d620f1b470fd535b26544b4ea20643:11' => 'Independent JPEG Group library (used by many applications), Quality 38 (Grayscale)', + '892788bdf8cbef5c6fbd7019a079bf8e:11' => 'Independent JPEG Group library (used by many applications), Quality 39 (Grayscale)', + 'cf3929fd4c1e5c28b7f137f982178ad1:11' => 'Independent JPEG Group library (used by many applications), Quality 40 (Grayscale)', + '31f288945896ed839f1d936bff06fb03:11' => 'Independent JPEG Group library (used by many applications), Quality 41 (Grayscale)', + 'e0c38f0c5e6562445d4e92bae51713be:11' => 'Independent JPEG Group library (used by many applications), Quality 42 (Grayscale)', + '18fa29d1164984883a6af76377b60d5a:11' => 'Independent JPEG Group library (used by many applications), Quality 43 (Grayscale)', + 'eff737b226fbce48c42625c5bf9dabb6:11' => 'Independent JPEG Group library (used by many applications), Quality 44 (Grayscale)', + 'b900f91ee8697255d5daebce858caaeb:11' => 'Independent JPEG Group library (used by many applications), Quality 45 (Grayscale)', + 'ab2f8513823067af242f7e3c04a88a9c:11' => 'Independent JPEG Group library (used by many applications), Quality 46 (Grayscale)', + '60b682c4d412f5255efbaa32787c46ca:11' => 'Independent JPEG Group library (used by many applications), Quality 47 (Grayscale)', + 'ea50813e06203c2ad1165252bcb99a1d:11' => 'Independent JPEG Group library (used by many applications), Quality 48 (Grayscale)', + 'f6308a717437d3653b0751ebf511db0f:11' => 'Independent JPEG Group library (used by many applications), Quality 49 (Grayscale)', + '7c8242581553e818ef243fc680879a19:11' => 'Independent JPEG Group library (used by many applications), Quality 50 (Grayscale)', + 'fc41ab8251718977bc6676f502f457e0:11' => 'Independent JPEG Group library (used by many applications), Quality 51 (Grayscale)', + '606c4c78c0226646bf4d3c5a5898fb17:11' => 'Independent JPEG Group library (used by many applications), Quality 52 (Grayscale)', + '0e6c6a5440d33d25f1c25836a45cfa69:11' => 'Independent JPEG Group library (used by many applications), Quality 53 (Grayscale)', + '7464b2361e5b5f5a9ba74a87475dda91:11' => 'Independent JPEG Group library (used by many applications), Quality 54 (Grayscale)', + 'aeaa2ca48eabb3088ebb713b3c4e1a67:11' => 'Independent JPEG Group library (used by many applications), Quality 55 (Grayscale)', + '3f36450b0ba074578391e77f7340cef0:11' => 'Independent JPEG Group library (used by many applications), Quality 56 (Grayscale)', + 'be232444027e83db6f8d8b79d078442e:11' => 'Independent JPEG Group library (used by many applications), Quality 57 (Grayscale)', + '712c145d6472a2b315b2ecfb916d1590:11' => 'Independent JPEG Group library (used by many applications), Quality 58 (Grayscale)', + 'ae3dd4568cc71c47d068cf831c66b59d:11' => 'Independent JPEG Group library (used by many applications), Quality 59 (Grayscale)', + 'b290e52c21a435fede4586636ef5e287:11' => 'Independent JPEG Group library (used by many applications), Quality 60 (Grayscale)', + 'a09ca4c4391e0221396a08f229a65f9d:11' => 'Independent JPEG Group library (used by many applications), Quality 61 (Grayscale)', + '0818578fc5fc571b4f8d5ffefc9dc0d8:11' => 'Independent JPEG Group library (used by many applications), Quality 62 (Grayscale)', + '7c685e2916555eda34cb37a1e71adc6a:11' => 'Independent JPEG Group library (used by many applications), Quality 63 (Grayscale)', + '69c6b9440342adfc0db89a6c91aba332:11' => 'Independent JPEG Group library (used by many applications), Quality 64 (Grayscale)', + 'd5d484b68e25b44288e67e699829695c:11' => 'Independent JPEG Group library (used by many applications), Quality 65 (Grayscale)', + 'de8310d09116a7a62965f3e0e43ef525:11' => 'Independent JPEG Group library (used by many applications), Quality 66 (Grayscale)', + 'e4735f63e88baf04599afc034e690845:11' => 'Independent JPEG Group library (used by many applications), Quality 67 (Grayscale)', + 'b4ef810b14dee9c6d6d8cace98f799a6:11' => 'Independent JPEG Group library (used by many applications), Quality 68 (Grayscale)', + '52886ef80147c9a136e20b2bc3b76f52:11' => 'Independent JPEG Group library (used by many applications), Quality 69 (Grayscale)', + '9c62dbc848be82ef91219ba9843998be:11' => 'Independent JPEG Group library (used by many applications), Quality 70 (Grayscale)', + 'bfe8c1c73eea84b85673487a82f67627:11' => 'Independent JPEG Group library (used by many applications), Quality 71 (Grayscale)', + 'ea445840d29c51009a2a8cd49b96ccee:11' => 'Independent JPEG Group library (used by many applications), Quality 72 (Grayscale)', + '71c1a56890fff9b0a095fa5a1c96132b:11' => 'Independent JPEG Group library (used by many applications), Quality 73 (Grayscale)', + 'f080b02331ac8adf03de2281042d2b49:11' => 'Independent JPEG Group library (used by many applications), Quality 74 (Grayscale)', + 'd0eaa368737f17f6037757d393a22599:11' => 'Independent JPEG Group library (used by many applications), Quality 75 (Grayscale)', + '303663905d055b77bb547fe0b0beb9c5:11' => 'Independent JPEG Group library (used by many applications), Quality 76 (Grayscale)', + '5cdf1d5bbe19375ad5c7237273dddede:11' => 'Independent JPEG Group library (used by many applications), Quality 77 (Grayscale)', + 'd64e7ff8292fd77131932864d3c9ce7c:11' => 'Independent JPEG Group library (used by many applications), Quality 78 (Grayscale)', + '12b4cc13891c5aef3dadb3405b6fa65d:11' => 'Independent JPEG Group library (used by many applications), Quality 79 (Grayscale)', + 'b008cd63591f8fd366f77d2b224b9c9c:11' => 'Independent JPEG Group library (used by many applications), Quality 80 (Grayscale)', + '49b6e472c7d5ecead593c6009768e765:11' => 'Independent JPEG Group library (used by many applications), Quality 81 (Grayscale)', + 'bce6fa61623ad4f65ff3fec1528cb026:11' => 'Independent JPEG Group library (used by many applications), Quality 82 (Grayscale)', + 'c2b037bf9f5e5baba804d7bbbb2dc73b:11' => 'Independent JPEG Group library (used by many applications), Quality 83 (Grayscale)', + '7fe7b339c6ffc62b984eeab4b0df9168:11' => 'Independent JPEG Group library (used by many applications), Quality 84 (Grayscale)', + '274bbeb0ac3939f90c578ebb1f5a9eef:11' => 'Independent JPEG Group library (used by many applications), Quality 85 (Grayscale)', + '0a0268c655d616b0e4af2851533aa3af:11' => 'Independent JPEG Group library (used by many applications), Quality 86 (Grayscale)', + '52318e260c0d6b3dbee85c87f9b94e63:11' => 'Independent JPEG Group library (used by many applications), Quality 87 (Grayscale)', + 'b64cc19a0f81a506ed5bcfb9c131c8fe:11' => 'Independent JPEG Group library (used by many applications), Quality 88 (Grayscale)', + 'd8c54333eb475b8db9f32f11fe96337e:11' => 'Independent JPEG Group library (used by many applications), Quality 89 (Grayscale)', + '12fe6b9bfd20f4d7f0ac2a221c566c45:11' => 'Independent JPEG Group library (used by many applications), Quality 90 (Grayscale)', + '12aefbf7689633c83da714c9f0e90e05:11' => 'Independent JPEG Group library (used by many applications), Quality 91 (Grayscale)', + 'a3a96add050fc51a2b3ce59a9a491034:11' => 'Independent JPEG Group library (used by many applications), Quality 92 (Grayscale)', + '7b0242bd9aaeab4962f5d5b39b9a4027:11' => 'Independent JPEG Group library (used by many applications), Quality 93 (Grayscale)', + '12fc29c1d8940c93a47ee9d927a17561:11' => 'Independent JPEG Group library (used by many applications), Quality 94 (Grayscale)', + 'e1fedef5184beeb7b0f5c055c7ae1d31:11' => 'Independent JPEG Group library (used by many applications), Quality 95 (Grayscale)', + 'ae9202355f603776794d3e62c43578d6:11' => 'Independent JPEG Group library (used by many applications), Quality 96 (Grayscale)', + '36da00bae6cd81d1f97e32748c07e33f:11' => 'Independent JPEG Group library (used by many applications), Quality 97 (Grayscale)', + '54dc50b16e7cc9bc383eb9e73e85e199:11' => 'Independent JPEG Group library (used by many applications), Quality 98 (Grayscale)', + '23a59c4f9ec045faf9f8379b3ca302bb:11' => 'Independent JPEG Group library (used by many applications), Quality 99 (Grayscale)', + 'bbd2dbcfe20b59e981e9a42cd1eb6ece:11' => 'Independent JPEG Group library (used by many applications), Quality 100 (Grayscale)', + + # Tested with Adobe Photoshop Lightroom 1.4.1 (Win) - "Export" + '683506a889c78d9bc230a0c7ee5f62f3:221111' => 'Adobe Lightroom, Quality 0% - 7%', + 'bc490651af6592cd1dbbbc4fa2cfa1fb:221111' => 'Adobe Lightroom, Quality 8% - 15%', + 'ce4286d9f07999524c3c7472b065c5ab:221111' => 'Adobe Lightroom, Quality 16% - 23%', + 'cbfbfef12aead8841585ef605c789b9f:221111' => 'Adobe Lightroom, Quality 24% - 30%', + 'a0772e73dec2bdc4057c27da47bff376:221111' => 'Adobe Lightroom, Quality 31% - 38%', + '7ef06dbde538346b8b01c6b538ca70c6:221111' => 'Adobe Lightroom, Quality 39% - 46%', + '0ff225f58a214f79d1d85d78f6f5dab8:221111' => 'Adobe Lightroom, Quality 47% - 53%', + '8a8603650fa5ae5fdcf4b2eaf0b23638:111111' => 'Adobe Lightroom, Quality 54% - 61%', + '44f583ed6b65cb8ba915ec5df051616c:111111' => 'Adobe Lightroom, Quality 62% - 69%', + 'de94c5591bafc7456ccaef430271b907:111111' => 'Adobe Lightroom, Quality 70% - 76%', + 'a6841b35e9ffefa5d83a0445dddd2621:111111' => 'Adobe Lightroom, Quality 77% - 84%', + '6e3f6a3a5a1eae6155331d42d6f968dd:111111' => 'Adobe Lightroom, Quality 85% - 92%', + '5379e0133d4439b6f7c7039fc7f7734f:111111' => 'Adobe Lightroom, Quality 93% - 100%', + + # Adobe Photoshop Lightroom 2.1 (Win) - "Export" + # (0-23% equal to Lightroom 1.4.1) + '8453391d3adf377c46a1a0cee08c35c3:221111' => 'Adobe Lightroom, Quality 24% - 30%', + 'f8ede291b1272576d1580e333d30103e:221111' => 'Adobe Lightroom, Quality 31% - 38%', + 'de0fb6d13e12e8df26140dd74691bf0f:221111' => 'Adobe Lightroom, Quality 39% - 46%', + '0d5b0af72561f68c671731f22d9e41e2:221111' => 'Adobe Lightroom, Quality 47% - 53%', + 'b9fd15fd52408af5ea2a5045227233d8:111111' => 'Adobe Lightroom, Quality 54% - 61%', + '27472e3714251402d5509438505611c3:111111' => 'Adobe Lightroom, Quality 62% - 69%', + '34a599dff2b6aaed12143938b7374f2f:111111' => 'Adobe Lightroom, Quality 70% - 76%', + '5c508e529d045b6f0c800e29ba2d6ab5:111111' => 'Adobe Lightroom, Quality 77% - 84%', + '42bfe52476bf07f1ed0e6451903cc9ee:111111' => 'Adobe Lightroom, Quality 85% - 92%', + '4c3c425b4024b68c0de03904a825bc35:111111' => 'Adobe Lightroom, Quality 93% - 100%', + + # Tested with Adobe Photoshop CS2 Version 9.0.2 (Win) - "Save as..." (RGB/CMYK) + '683506a889c78d9bc230a0c7ee5f62f3:221111' => 'Adobe Photoshop, Quality 0', + 'bc490651af6592cd1dbbbc4fa2cfa1fb:221111' => 'Adobe Photoshop, Quality 1', + 'ce4286d9f07999524c3c7472b065c5ab:221111' => 'Adobe Photoshop, Quality 2', + 'cbfbfef12aead8841585ef605c789b9f:221111' => 'Adobe Photoshop, Quality 3', + 'a0772e73dec2bdc4057c27da47bff376:221111' => 'Adobe Photoshop, Quality 4', + '7ef06dbde538346b8b01c6b538ca70c6:221111' => 'Adobe Photoshop, Quality 5', + '0ff225f58a214f79d1d85d78f6f5dab8:221111' => 'Adobe Photoshop, Quality 6', + '8a8603650fa5ae5fdcf4b2eaf0b23638:111111' => 'Adobe Photoshop, Quality 7', + '44f583ed6b65cb8ba915ec5df051616c:111111' => 'Adobe Photoshop, Quality 8', + 'de94c5591bafc7456ccaef430271b907:111111' => 'Adobe Photoshop, Quality 9', + 'a6841b35e9ffefa5d83a0445dddd2621:111111' => 'Adobe Photoshop, Quality 10', + '6e3f6a3a5a1eae6155331d42d6f968dd:111111' => 'Adobe Photoshop, Quality 11', + '5379e0133d4439b6f7c7039fc7f7734f:111111' => 'Adobe Photoshop, Quality 12', + + # Tested with Adobe Photoshop CS2 Version 9.0.2 (Win) - "Save as..." (Grayscale) + '3b0b5975a0e1c9d732c93e1b37a6978b:11' => 'Adobe Photoshop, Quality 0', + 'f4d19ed563e2d0519d6a547088771ddb:11' => 'Adobe Photoshop, Quality 1', + 'e9ef286567fd84a1f479b35ca00db43c:11' => 'Adobe Photoshop, Quality 2', + 'b39cafdb459a42749be3f6459a596677:11' => 'Adobe Photoshop, Quality 3', + 'b3f215deea48e982e205619af279205f:11' => 'Adobe Photoshop, Quality 4', + 'fccd63ce166e198065eaae05c8d78407:11' => 'Adobe Photoshop, Quality 5', + '0a50266ad8d1dff11c90cd1480c0a2be:11' => 'Adobe Photoshop, Quality 6', + '6579941db0216f41f0a20de9b626538a:11' => 'Adobe Photoshop, Quality 7', + '57aa47876e10c6b4f35ecb8889e55ad9:11' => 'Adobe Photoshop, Quality 8', + '076598d43c5186f6d7a1020b64b93625:11' => 'Adobe Photoshop, Quality 9', + '37132e8ea81137fdf26ce30926ab8100:11' => 'Adobe Photoshop, Quality 10', + '46f55ee294723cee9faa816549b3cfa7:11' => 'Adobe Photoshop, Quality 11', + '7b83284f61decf47ab3f8f7361c18943:11' => 'Adobe Photoshop, Quality 12', + + # Tested with Adobe Photoshop CS2 Version 9.0.2 (Win) - "Save for web..." + '9ac881c536e509675e5cf3795a85d9de:221111' => 'Adobe Photoshop, Save for web, Quality 0', + '3521d793fd9d2d9aac85dc4f0be40290:221111' => 'Adobe Photoshop, Save for web, Quality 1', + '041c9e3cf0d34a8b89539e3115bca31b:221111' => 'Adobe Photoshop, Save for web, Quality 2', + '029b3a6f0b92af6786d753788eafabfe:221111' => 'Adobe Photoshop, Save for web, Quality 3', + '6cdd3762e346b16a59af4bddb213b07a:221111' => 'Adobe Photoshop, Save for web, Quality 4', + '84a69c0b43505dd0cbc25d640873b5b9:221111' => 'Adobe Photoshop, Save for web, Quality 5', + '7254c012821f2bc866d7d6dd7906c92d:221111' => 'Adobe Photoshop, Save for web, Quality 6', + '428ba2c747ea4e495ff3c7ff44a988d2:221111' => 'Adobe Photoshop, Save for web, Quality 7', + '42cb001aea7e24d239f6c2fcbd861862:221111' => 'Adobe Photoshop, Save for web, Quality 8', + 'a3698813ce90772a30b6eb9a7deb3f4a:221111' => 'Adobe Photoshop, Save for web, Quality 9', + '301158b292e3232856a765486da26fa6:221111' => 'Adobe Photoshop, Save for web, Quality 10', + '8d9edea9287aa919e433b620f61468dc:221111' => 'Adobe Photoshop, Save for web, Quality 11', + 'c1e0554d8a6ed003eb98e068429b56b9:221111' => 'Adobe Photoshop, Save for web, Quality 12', + '0e0a151e0a52097cbd7683c9385e3a7c:221111' => 'Adobe Photoshop, Save for web, Quality 13', + '911e66f21fe242cc74e0a5738b0330bd:221111' => 'Adobe Photoshop, Save for web, Quality 14', + '028fafd94aa66ee269f58d800c89d838:221111' => 'Adobe Photoshop, Save for web, Quality 15', + '866b8adb1ce7c9dc0e58b7c1e013280f:221111' => 'Adobe Photoshop, Save for web, Quality 16', + '7f712aecf513621f635a007aadda61af:221111' => 'Adobe Photoshop, Save for web, Quality 17', + '38f26622a54ba22accac05f7c0a3b307:221111' => 'Adobe Photoshop, Save for web, Quality 18', + 'd241d5165e64e98024b47dfbf76be88c:221111' => 'Adobe Photoshop, Save for web, Quality 19', + 'afb31cfed194d4e125bde8fd4755bb8a:221111' => 'Adobe Photoshop, Save for web, Quality 20', + '0d501a036c984d2caf49fd298b2d0d16:221111' => 'Adobe Photoshop, Save for web, Quality 21', + '9e992f35767c4aa023b8afd243b247bf:221111' => 'Adobe Photoshop, Save for web, Quality 22', + '0a80e5bf01a9c5650384dfe1a428f61d:221111' => 'Adobe Photoshop, Save for web, Quality 23', + '2501aad23cdf94b25c6df0ab6984b6e0:221111' => 'Adobe Photoshop, Save for web, Quality 24', + '09c168d2e075070d3a2535e7f2e455df:221111' => 'Adobe Photoshop, Save for web, Quality 25', + '63190207beeb805306f7d0bcc3898cb3:221111' => 'Adobe Photoshop, Save for web, Quality 26', + 'e47902bc7ba3037921010c568648c8c3:221111' => 'Adobe Photoshop, Save for web, Quality 27', + '410ed63b6e5225d8b99da6272fd6069b:221111' => 'Adobe Photoshop, Save for web, Quality 28', + 'b40f3f3c46d70a560e2033fadd8c7bb5:221111' => 'Adobe Photoshop, Save for web, Quality 29', + '45148ae63b12ccaa6fb5a487ca7620e9:221111' => 'Adobe Photoshop, Save for web, Quality 30', + '5180e51bd58432c7b51a305ed0c24d1b:221111' => 'Adobe Photoshop, Save for web, Quality 31', + 'c5c472d899462bbe31da9aa8c072c0bc:221111' => 'Adobe Photoshop, Save for web, Quality 32', + '28cdbc95898e02dd0ffc45ba48596ca7:221111' => 'Adobe Photoshop, Save for web, Quality 33', + '42cd88e0eb3c14a705b952550ec2eacd:221111' => 'Adobe Photoshop, Save for web, Quality 34', + '78a2a442aac5cca7fa2ef5a8bd96219e:221111' => 'Adobe Photoshop, Save for web, Quality 35', + '96bce854134a2fccfcb68dca6687cd51:221111' => 'Adobe Photoshop, Save for web, Quality 36', + 'fefd00ec4610895e4294de690f5977e9:221111' => 'Adobe Photoshop, Save for web, Quality 37', + 'd71c8ddb9117920304d83a6f8b7832a4:221111' => 'Adobe Photoshop, Save for web, Quality 38', + '1727e720300403e5f315b5e17ef84d3f:221111' => 'Adobe Photoshop, Save for web, Quality 39', + '8fb05e3c3b0a7404ff6ca54f952d2a5e:221111' => 'Adobe Photoshop, Save for web, Quality 40', + '328ab751ea48f5a8bc7c4b8628138ce0:221111' => 'Adobe Photoshop, Save for web, Quality 41', + 'd9653333a3af8842dd4b72856ac4ef4e:221111' => 'Adobe Photoshop, Save for web, Quality 42', + '276da99e50e1b39134e13826789d655e:221111' => 'Adobe Photoshop, Save for web, Quality 43', + '23f2bd2d96ec531815609503dae4a2b0:221111' => 'Adobe Photoshop, Save for web, Quality 44', + 'bafe2a89809f23bc7367e9a819570728:221111' => 'Adobe Photoshop, Save for web, Quality 45', + '6bfdcd36327406f801be86d0e8ca6b60:221111' => 'Adobe Photoshop, Save for web, Quality 46', + 'eb8e5c42d31b916737ac21dffd6f012b:221111' => 'Adobe Photoshop, Save for web, Quality 47', + 'e57a9878be74473990343573c6585f79:221111' => 'Adobe Photoshop, Save for web, Quality 48', + '91dfacd928ce717cb135c6da03afd907:221111' => 'Adobe Photoshop, Save for web, Quality 49', + '16c443478b9417d44893f8748d49b790:221111' => 'Adobe Photoshop, Save for web, Quality 50', + '84de345dcf710f937a39a0b631b87fc4:111111' => 'Adobe Photoshop, Save for web, Quality 51', + 'bdd6043e7f5a5f1512b99b2394a075e2:111111' => 'Adobe Photoshop, Save for web, Quality 52', + 'c7614d3d384a02630721be335062ef75:111111' => 'Adobe Photoshop, Save for web, Quality 53', + '42d6f71aace3de2ccfdd8348b0198704:111111' => 'Adobe Photoshop, Save for web, Quality 54', + '84d5f059ce3e1b78d91355e1e86e2d1a:111111' => 'Adobe Photoshop, Save for web, Quality 55', + '5881004f575752d77ee00e767d848e51:111111' => 'Adobe Photoshop, Save for web, Quality 56', + '0cb697537acde3d2e85078377461a8e0:111111' => 'Adobe Photoshop, Save for web, Quality 57', + 'b2762ffa5c0a1799fb2e9ad6dfd2171a:111111' => 'Adobe Photoshop, Save for web, Quality 58', + '2b7a6a83259aa9967e098d3e70f1ee09:111111' => 'Adobe Photoshop, Save for web, Quality 59', + '6123a3685e1012af5a0d024de1ce0304:111111' => 'Adobe Photoshop, Save for web, Quality 60', + 'd08c8435de33f2c186aa2dd9cba3e874:111111' => 'Adobe Photoshop, Save for web, Quality 61', + 'e69be2174dbbfb952e54576fbdfe6c14:111111' => 'Adobe Photoshop, Save for web, Quality 62', + '2ec2d5c10641952fce5c435b331b8872:111111' => 'Adobe Photoshop, Save for web, Quality 63', + '98201e1185b7069f1247ac3cdc56c824:111111' => 'Adobe Photoshop, Save for web, Quality 64', + '8fc0325d05c9199bc1e2dec417c3a55e:111111' => 'Adobe Photoshop, Save for web, Quality 65', + '016600f44a61cc5a5673c9bad85e23a3:111111' => 'Adobe Photoshop, Save for web, Quality 66', + '91d7b4300c98c726aff7b19cbe098a3e:111111' => 'Adobe Photoshop, Save for web, Quality 67', + 'f9b83ba21b86a3d4ddb507e3edce490c:111111' => 'Adobe Photoshop, Save for web, Quality 68', + 'd312a23c8ecb3bf59bc11bbe17d79e55:111111' => 'Adobe Photoshop, Save for web, Quality 69', + '240fffe5f8e2d8f3345b8175f9cb0a40:111111' => 'Adobe Photoshop, Save for web, Quality 70', + 'ba60a642bfb1a184c11e5561581d7115:111111' => 'Adobe Photoshop, Save for web, Quality 71', + 'c901580e589f58d309f8b50590cfe214:111111' => 'Adobe Photoshop, Save for web, Quality 72', + 'c244f94d84a016840c6ef06250c58ade:111111' => 'Adobe Photoshop, Save for web, Quality 73', + '3589227bdd85f880f3337b492e895c5d:111111' => 'Adobe Photoshop, Save for web, Quality 74', + 'cae6fd91a423ff181d50bb9c26a0d392:111111' => 'Adobe Photoshop, Save for web, Quality 75', + '7d8ee11ca66d2c22ff9ed1f778b5dbac:111111' => 'Adobe Photoshop, Save for web, Quality 76', + 'a16371762ce48953d42dfb5b77d1bfc6:111111' => 'Adobe Photoshop, Save for web, Quality 77', + '204b111d4aaa85b430e86273a63fd004:111111' => 'Adobe Photoshop, Save for web, Quality 78', + '6a243ac0b8575c2ed962070cd7d39e04:111111' => 'Adobe Photoshop, Save for web, Quality 79', + '51879d6e5178d2282d5e8276ed4e2439:111111' => 'Adobe Photoshop, Save for web, Quality 80', + 'ca683ab6caaa3132bf661a0ebf32ef4e:111111' => 'Adobe Photoshop, Save for web, Quality 81', + '5399adc3f21ecb30c96d6a94b38ab74c:111111' => 'Adobe Photoshop, Save for web, Quality 82', + '43eb3b161279ccc1fb4f9cbe7b92398f:111111' => 'Adobe Photoshop, Save for web, Quality 83', + '2d387641f4e94b6986908b3770fb762e:111111' => 'Adobe Photoshop, Save for web, Quality 84', + '75ee5a0fd61559c6bf8e6ebc920c93b0:111111' => 'Adobe Photoshop, Save for web, Quality 85', + '60d17e041a23d47b96c5aac86180a022:111111' => 'Adobe Photoshop, Save for web, Quality 86', + '8e5290b1d12832ad259de92a53e1ef4e:111111' => 'Adobe Photoshop, Save for web, Quality 87', + 'dc19a48af9051bbdc54cf7e88c03f13e:111111' => 'Adobe Photoshop, Save for web, Quality 88', + 'c3fbc85c803ddc81c8882c03330b5b15:111111' => 'Adobe Photoshop, Save for web, Quality 89', + '5e016a2d28f8ad3e7e27e4e2981031d2:111111' => 'Adobe Photoshop, Save for web, Quality 90', + 'ef4fa43f4d548e0687c4d4151a0bf1bd:111111' => 'Adobe Photoshop, Save for web, Quality 91', + '00f03e367cd316b71de360c6e7af0e6b:111111' => 'Adobe Photoshop, Save for web, Quality 92', + '982fc46fd167df238fbf23494a1ce761:111111' => 'Adobe Photoshop, Save for web, Quality 93', + '6fd7b56ac6b58dc861e6021815fb5704:111111' => 'Adobe Photoshop, Save for web, Quality 94', + 'c6d9120293c8435cf6b40574b45756bb:111111' => 'Adobe Photoshop, Save for web, Quality 95', + '1e133f4bf9f7c7c1e0accf44c0b1107d:111111' => 'Adobe Photoshop, Save for web, Quality 96', + 'fb91d6a8a1b72388d68130f551698865:111111' => 'Adobe Photoshop, Save for web, Quality 97', + '4ea4e07900e04a3bd7572d4b59aa7a74:111111' => 'Adobe Photoshop, Save for web, Quality 98', + '15e1d2321b96b355d4ad109a8d2fe882:111111' => 'Adobe Photoshop, Save for web, Quality 99', + '234d8f310d75effc9f77beb1d3847f49:111111' => 'Adobe Photoshop, Save for web, Quality 100', + + # Adobe Photoshop Express (Release build number: 481589) + 'aeb34eb083acc888770d65e691497bcf:111111' => 'Adobe Photoshop Express, Original Size', + + # Apple QuickTime (Color) + # + # Tested with: + # - QuickTime 7.5.0 (Win) + # - QuickTime 7.5.0 (Mac) + # - QuickTime 7.4.1 (Mac) + # - GraphicConverter 4.4.4 (Mac) + # - Using the QuickTime library + # - Fixed subsampling to 221111 + # - Use a subset of 101 of the 1024 values + 'dbdc6a6f3c9ffff19e67cfad2cc51ae4:221111' => 'Apple QuickTime, Quality 0-63 (0-6%)', + '23bd5edb6224e03e2f7c282e04986553:221111' => 'Apple QuickTime, Quality 64-80 (6-8%)', + '69747272d4079b78c2ee2ef0f5e63f30:221111' => 'Apple QuickTime, Quality 81-92 (8-9%)', + '4f50903ec9314f739e460c79552a20c5:221111' => 'Apple QuickTime, Quality 93-101 (9-10%)', + '2535e621267a9ff2e2d09148643e3389:221111' => 'Apple QuickTime, Quality 102-109 (10-11%)', + '46a125048b572576eed271816b2cbad2:221111' => 'Apple QuickTime, Quality 110-116 (11%)', + 'ce05e4b45c53a6e321d9cf1061c62128:221111' => 'Apple QuickTime, Quality 117-122 (11-12%)', + 'c3b80241282d06ac5114f2750089589a:221111' => 'Apple QuickTime, Quality 123-127 (12%)', + '9d91481900305fb9ad09339f0924f690:221111' => 'Apple QuickTime, Quality 128-133 (13%)', + '348f4874d57ae6aae04ef96132374913:221111' => 'Apple QuickTime, Quality 134-137 (13%)', + '4e3daadebe0517955b1c86fb1fbc1dc1:221111' => 'Apple QuickTime, Quality 138-142 (13-14%)', + '599b6ad93f32b9d5ce67e1622338c379:221111' => 'Apple QuickTime, Quality 143-146 (14%)', + '66aeb0f03343673eeed6462e0ce9e1aa:221111' => 'Apple QuickTime, Quality 147-150 (14-15%)', + '13570e05da917fe51235ef66a295bc78:221111' => 'Apple QuickTime, Quality 151-154 (15%)', + '25e399a9cf70fe7a13867b40ac2c3416:221111' => 'Apple QuickTime, Quality 155-157 (15%)', + '25eb3d27e65659435a89e401edfab65f:221111' => 'Apple QuickTime, Quality 158-161 (15-16%)', + 'c3bb3c557e70b56a890b07236348518b:221111' => 'Apple QuickTime, Quality 162-164 (16%)', + '792e93c41ac63451068b887b11ad0c2e:221111' => 'Apple QuickTime, Quality 165-167 (16%)', + '35af99d11406974cf2ffa6676801b10c:221111' => 'Apple QuickTime, Quality 168-170 (16-17%)', + '606e5652fc33c6a02328f0bd23ee9751:221111' => 'Apple QuickTime, Quality 171-173 (17%)', + '9b62a9e4544cbc1033c67732ea0bbb08:221111' => 'Apple QuickTime, Quality 174-176 (17%)', + '93ef48999d5659763a33c45a2a0fa784:221111' => 'Apple QuickTime, Quality 177-179 (17%)', + '01b48291bfeccf2fadab996816225b9b:221111' => 'Apple QuickTime, Quality 180-182 (18%)', + '613ef896fc4af5baad36e2680968a7ba:221111' => 'Apple QuickTime, Quality 183-184 (18%)', + '758d37a9d3b91c0ba383d23f5a080d8f:221111' => 'Apple QuickTime, Quality 185-187 (18%)', + '34457d32b9531f04696a52969e02dc1a:221111' => 'Apple QuickTime, Quality 188-189 (18%)', + '6634cdad61e7a8e6fb3a4ba1a0416256:221111' => 'Apple QuickTime, Quality 190-191 (19%)', + 'e5b0739f8e02c6d481e0cdafe7326ae2:221111' => 'Apple QuickTime, Quality 192-194 (19%)', + 'fca91c73d4275748587f97b472b59280:221111' => 'Apple QuickTime, Quality 195-196 (19%)', + '7dc9316230c4f197fb5d1b36f09cd883:221111' => 'Apple QuickTime, Quality 197-198 (19%)', + '13d6536913342860ab993be8b141f644:221111' => 'Apple QuickTime, Quality 199-201 (19-20%)', + 'd835580b2be669d4aa6c68ead27c0c2f:221111' => 'Apple QuickTime, Quality 202-203 (20%)', + '1e91365abfe1d9f7a008c363c834a66e:221111' => 'Apple QuickTime, Quality 204-205 (20%)', + '6f7825365b673f9eb2ac050d27a21d1b:221111' => 'Apple QuickTime, Quality 206-207 (20%)', + '2a98c0b884281080eefcdf98dd33fd6b:221111' => 'Apple QuickTime, Quality 208-209 (20%)', + '0ffe7e9fc17393a338b95c345052b7c5:221111' => 'Apple QuickTime, Quality 210-211 (21%)', + '9dd5c9717d0fd45486af4d26e59ebb35:221111' => 'Apple QuickTime, Quality 212-213 (21%)', + '0ef85155f08194f8fed3f4e7197126e6:221111' => 'Apple QuickTime, Quality 214-215 (21%)', + '35886289b5c8921f7932f895d7f1855d:221111' => 'Apple QuickTime, Quality 216-217 (21%)', + '1d7ac617d70b1880be9c7ba16f96a3ec:221111' => 'Apple QuickTime, Quality 218 (21%)', + 'b26a53dce1477ac3970335df110bb240:221111' => 'Apple QuickTime, Quality 219-220 (21%)', + 'a333be9f2b13b53bfdf64bf5665f8e55:221111' => 'Apple QuickTime, Quality 221-222 (22%)', + 'f1e8d9b3d66fa34ec9a51a987b48a159:221111' => 'Apple QuickTime, Quality 223-224 (22%)', + '20f37f34a9fd18089aa58fe77493a7b7:221111' => 'Apple QuickTime, Quality 225 (22%)', + 'b80e56d3ed0c4a8e1c6bb0c5a1d45ca9:221111' => 'Apple QuickTime, Quality 226-227 (22%)', + 'd14411ab659ac68209ee8c75b941cb48:221111' => 'Apple QuickTime, Quality 228-229 (22%)', + 'a5da49ac5bfe27aafda44bae107ae1c5:221111' => 'Apple QuickTime, Quality 230 (22%)', + '9aa9359126240c0712610121371f870c:221111' => 'Apple QuickTime, Quality 231-232 (23%)', + '5975500a23ab9a547ba149bf1aaa1893:221111' => 'Apple QuickTime, Quality 233-234 (23%)', + 'd03a4790dd96a862113b1a2408103ad6:221111' => 'Apple QuickTime, Quality 235 (23%)', + '44d2a7baaf1e3f8c3d45e4e6272a39b1:221111' => 'Apple QuickTime, Quality 236-237 (23%)', + '7755ba223679105c184be0ada8c99f92:221111' => 'Apple QuickTime, Quality 238 (23%)', + '1ea3f373d0adf989e8416ecb11c38608:221111' => 'Apple QuickTime, Quality 239-240 (23%)', + '12196a46c697fbb88d8bef279b52b106:221111' => 'Apple QuickTime, Quality 241 (24%)', + '2183a6f77fe72f5c70726244dcabc963:221111' => 'Apple QuickTime, Quality 242-243 (24%)', + 'd1ca3a3723c1385d2989b199a7a30557:221111' => 'Apple QuickTime, Quality 244 (24%)', + 'd83207842d60965f9d194d89f3281ccd:221111' => 'Apple QuickTime, Quality 245-246 (24%)', + '6ae041573525edd42e800e1b61d4313c:221111' => 'Apple QuickTime, Quality 247 (24%)', + '6c42d12564d1c5706653a8ddb5375192:221111' => 'Apple QuickTime, Quality 248-249 (24%)', + '671a071a1b17f49a774da3893f7199c7:221111' => 'Apple QuickTime, Quality 250 (24%)', + 'fb3c0cc15ad21b6c19576dd8d7d29a0e:221111' => 'Apple QuickTime, Quality 251 (25%)', + 'c9ce3dc3d0567f631e463cc3ff1b2e30:221111' => 'Apple QuickTime, Quality 252-253 (25%)', + 'b309a0dc90b16ac01f0798a04c3127e8:221111' => 'Apple QuickTime, Quality 254 (25%)', + 'cd15038a76bd8752c3afd14669816c2e:221111' => 'Apple QuickTime, Quality 255 (25%)', + 'd275e9aebd39cf411496caf6e54d0c5f:221111' => 'Apple QuickTime, Quality 256-257 (25%)', + '5e75328df5dadca132bb83e0883ce522:221111' => 'Apple QuickTime, Quality 258 (25%)', + 'b04cbc1812939770d59461982cd9d32d:221111' => 'Apple QuickTime, Quality 259 (25%)', + 'ddf1f3b922ea51f6f4ca3cb6863eeae0:221111' => 'Apple QuickTime, Quality 260-261 (25%)', + '5532e398abb0a455b528659e59c7cfd7:221111' => 'Apple QuickTime, Quality 262 (26%)', + 'f9bff3eeb4e94fb9ab4820184b0b6058:221111' => 'Apple QuickTime, Quality 263 (26%)', + '081da80ed314194b571ff9880a7c11d3:221111' => 'Apple QuickTime, Quality 264-265 (26%)', + '178aa0138d7a08be081aeff794956a71:221111' => 'Apple QuickTime, Quality 266 (26%)', + '78bb04e3ced3eee51c78e94b421ecc26:221111' => 'Apple QuickTime, Quality 267 (26%)', + '17782e930dc2cba42da909d95278fe9b:221111' => 'Apple QuickTime, Quality 268 (26%)', + '093b011ce21ae794d3eca7c64eecf5b6:221111' => 'Apple QuickTime, Quality 269 (26%)', + '4bf515768d1a06e4c529ebae3e03b4b5:221111' => 'Apple QuickTime, Quality 270-271 (26%)', + '3dd79429ada0455422ff6605c1727456:221111' => 'Apple QuickTime, Quality 272 (27%)', + '4be1504b9732d1d9f6265d0616bad21b:221111' => 'Apple QuickTime, Quality 273 (27%)', + 'b2118dc8e8b1762cc634e135a2a1893c:221111' => 'Apple QuickTime, Quality 274 (27%)', + '70d843457698f46db30181ac616deb75:221111' => 'Apple QuickTime, Quality 275 (27%)', + 'f3c42f077883313db21c72bd240de05f:221111' => 'Apple QuickTime, Quality 276 (27%)', + '56e9a02eb25508a9f71ad1a7cb9f9f4d:221111' => 'Apple QuickTime, Quality 277-278 (27%)', + '1d956197da5eb19ffe8855a0e2a52c98:221111' => 'Apple QuickTime, Quality 279 (27%)', + '3e37de5c00962684feba769939fce685:221111' => 'Apple QuickTime, Quality 280 (27%)', + '5628aeb29bb04d9c5073bc1caf371f01:221111' => 'Apple QuickTime, Quality 281 (27%)', + 'a2e7b219d18177294378485759215f72:221111' => 'Apple QuickTime, Quality 282 (28%)', + '537f40d0aae588fbce4cde9ba148604d:221111' => 'Apple QuickTime, Quality 283 (28%)', + '14b7d58b539ad8d6f1c4f8fd82c91358:221111' => 'Apple QuickTime, Quality 284 (28%)', + '58b302794024b9842657bbe7cb667577:221111' => 'Apple QuickTime, Quality 285 (28%)', + '4be64c2782cbb36b757cdcadd756498a:221111' => 'Apple QuickTime, Quality 286 (28%)', + '6c947f09bc02f87b257a26f9f5c77a77:221111' => 'Apple QuickTime, Quality 287 (28%)', + '663b8a9dbd00efa78281f5028b35c503:221111' => 'Apple QuickTime, Quality 288 (28%)', + 'e5deb190a5e17492a01e8136afdfd6c1:221111' => 'Apple QuickTime, Quality 289 (28%)', + 'ba36e1298ce7fed908ee3e02b83ae7c3:221111' => 'Apple QuickTime, Quality 290 (28%)', + 'bc4abc4600f2efc0bdead1e4be78801b:221111' => 'Apple QuickTime, Quality 291-292 (28-29%)', + '43887ad276efb9ca8e8110498b38d814:221111' => 'Apple QuickTime, Quality 293 (29%)', + '3050624718ce9acc06f85c2fa0208cc7:221111' => 'Apple QuickTime, Quality 294 (29%)', + 'f6d9c8699e54823040b66c4b8e1361aa:221111' => 'Apple QuickTime, Quality 295 (29%)', + 'a9b2875fc3c21e7b998969c57f74fa7a:221111' => 'Apple QuickTime, Quality 296 (29%)', + 'b9be740b8a374a52808ad5ef6db2bfe7:221111' => 'Apple QuickTime, Quality 297 (29%)', + '63f9786c6a9b8ef87c791818ddaba058:221111' => 'Apple QuickTime, Quality 298 (29%)', + 'a65113fd3b66ef137f9b1144367f731b:221111' => 'Apple QuickTime, Quality 299 (29%)', + 'ee58773aa7b774040d650365937cf173:221111' => 'Apple QuickTime, Quality 300 (29%)', + '29a9ee0cae41784d90fa74d7cd240a3e:221111' => 'Apple QuickTime, Quality 301 (29%)', + '369e1cfc338b45a239cb7db09778037e:221111' => 'Apple QuickTime, Quality 302 (29%)', + '131ddd6eec5f51e825cf7afd9c7ab3b2:221111' => 'Apple QuickTime, Quality 303 (30%)', + '88a2772be7b74a5a9b7ebbea28ddde47:221111' => 'Apple QuickTime, Quality 304 (30%)', + '83e206dafb515f20a4b9a0c16f770940:221111' => 'Apple QuickTime, Quality 305 (30%)', + 'dddc3adae44a64457b05416affc2502e:221111' => 'Apple QuickTime, Quality 306 (30%)', + 'ff0758d87a0cbdb323fb93bf9ed1fdff:221111' => 'Apple QuickTime, Quality 307 (30%)', + 'b1b1a08ebaf13142b731c95771d97226:221111' => 'Apple QuickTime, Quality 308 (30%)', + 'd6e206f8224d6a3582fb1066b511437b:221111' => 'Apple QuickTime, Quality 309 (30%)', + '2926d6bf5a27174bd9057bd6198413cd:221111' => 'Apple QuickTime, Quality 310 (30%)', + '5d1b5e80f9777a636d1d5cb402fcfc32:221111' => 'Apple QuickTime, Quality 311 (30%)', + 'ae39c8775a10e34accdf2bba3bffc483:221111' => 'Apple QuickTime, Quality 312 (30%)', + 'bc6d3a9f349a97c5cde3f8fa4e1b5beb:221111' => 'Apple QuickTime, Quality 313 (31%)', + '91bd468ca96fe548a7df9646b51880d1:221111' => 'Apple QuickTime, Quality 314 (31%)', + '104c3b63e4ca667a4ee2e4250340052c:221111' => 'Apple QuickTime, Quality 315 (31%)', + '64b80be38604eaecc99236b1f74a99f8:221111' => 'Apple QuickTime, Quality 316 (31%)', + '284efada45882694778e65969f761478:221111' => 'Apple QuickTime, Quality 317 (31%)', + 'd8bd88390c27b2b05a0784eafd4b31ef:221111' => 'Apple QuickTime, Quality 318 (31%)', + '99bf8158a4060d354b521f3d6f5648ac:221111' => 'Apple QuickTime, Quality 319 (31%)', + '96c9e3cd827097ec03edc458fc1053e4:221111' => 'Apple QuickTime, Quality 320 (31%)', + '272b5b12f7701be4cceba51e9d5dbf13:221111' => 'Apple QuickTime, Quality 321 (31%)', + 'dcc3ffcda228ab283d53e1dc2cb739ef:221111' => 'Apple QuickTime, Quality 322-324 (31-32%)', + 'c44701e8185306f5e6d09be16a2b0fbd:221111' => 'Apple QuickTime, Quality 325 (32%)', + '476a1ebd043ed59e56d18dd6d08777d7:221111' => 'Apple QuickTime, Quality 326 (32%)', + '26831dfc8d0dc1d202d50d6cf7b4f4a4:221111' => 'Apple QuickTime, Quality 327 (32%)', + '00f929d549fdd9f89fbb10303445cc2c:221111' => 'Apple QuickTime, Quality 328 (32%)', + '030736cda242f0583a7064cb60cc026e:221111' => 'Apple QuickTime, Quality 329 (32%)', + '825fb58744c6c2432d232f5fb83a9597:221111' => 'Apple QuickTime, Quality 330 (32%)', + '0bac94d5b6ef090da7875e294a7f8040:221111' => 'Apple QuickTime, Quality 331 (32%)', + '16de07616490b8439576d837c74aefbe:221111' => 'Apple QuickTime, Quality 332 (32%)', + '8190e844832ee8ea97492b509c728de4:221111' => 'Apple QuickTime, Quality 333 (33%)', + '0bb6bf7365676f75d285bb38a40b8e3f:221111' => 'Apple QuickTime, Quality 334 (33%)', + '04710d4ba5233b4f82bd260263f9e992:221111' => 'Apple QuickTime, Quality 335 (33%)', + 'fcb49e821b83f8436d450b03f1b1f182:221111' => 'Apple QuickTime, Quality 336 (33%)', + '1bca645051a125cd2c3af262074f70e7:221111' => 'Apple QuickTime, Quality 337 (33%)', + '7a5c04b63f9fe6af176efef387ba1f03:221111' => 'Apple QuickTime, Quality 338 (33%)', + '24fff8dcfdc8640225fff020ad869c18:221111' => 'Apple QuickTime, Quality 339 (33%)', + '08549fa433585b86d6eab75b6dcb1fe3:221111' => 'Apple QuickTime, Quality 340 (33%)', + 'caabe462a50217592c74902def037c07:221111' => 'Apple QuickTime, Quality 341 (33%)', + '757e97f3490ebc5b74fd63792fb23992:221111' => 'Apple QuickTime, Quality 342 (33%)', + 'aa6072a632f7bae361c8d371aa022c57:221111' => 'Apple QuickTime, Quality 343 (33%)', + '03809d08372d3a9fd86ff254854f45b7:221111' => 'Apple QuickTime, Quality 344 (34%)', + 'bdebcafc7b5f6b7fea114943e042df5e:221111' => 'Apple QuickTime, Quality 345 (34%)', + '555dc90fb10df448f37c67ee7ec31bc2:221111' => 'Apple QuickTime, Quality 346 (34%)', + 'a2f2a404cd1c2278ef65f2a27c0365e0:221111' => 'Apple QuickTime, Quality 347 (34%)', + 'aee867276d6dc4ed4b682a454815acd1:221111' => 'Apple QuickTime, Quality 348 (34%)', + '8f2f9e8433104cedb50c3e54577fcd00:221111' => 'Apple QuickTime, Quality 349 (34%)', + '84c2067991afbb6851204f21f5d132ea:221111' => 'Apple QuickTime, Quality 350 (34%)', + '2d2a77bf6078ab4f07261c76b637b597:221111' => 'Apple QuickTime, Quality 351 (34%)', + 'fc9d0f82571701e8b4cf764125ac0d2e:221111' => 'Apple QuickTime, Quality 352 (34%)', + '75d4ffdc6c10675cb1b5bd002d4e0e41:221111' => 'Apple QuickTime, Quality 353 (34%)', + '4b96c3457701c201f90d56af1a82d43b:221111' => 'Apple QuickTime, Quality 354 (35%)', + 'a56edeb9e571dc790a429c26ebc59976:221111' => 'Apple QuickTime, Quality 355 (35%)', + '3673ce9ec4f6f916009d39282ff3a8d7:221111' => 'Apple QuickTime, Quality 356 (35%)', + 'b7279ade733ff1c88073971cebe6edd8:221111' => 'Apple QuickTime, Quality 357 (35%)', + 'b35f3358027aa4d2cca0c64425aa8f1b:221111' => 'Apple QuickTime, Quality 358 (35%)', + '854d2e536bc92a9e2e3db3ff2c18e138:221111' => 'Apple QuickTime, Quality 359 (35%)', + '48b6aa4f0258162cceb9d43e19c96043:221111' => 'Apple QuickTime, Quality 360 (35%)', + '1dfb48b5955cf2a50011f52b9a05f1a4:221111' => 'Apple QuickTime, Quality 361 (35%)', + 'd67da3fcbac8975acffe7f1ab088f646:221111' => 'Apple QuickTime, Quality 362 (35%)', + '7be7bded72d0ade6f907e3adcf62b391:221111' => 'Apple QuickTime, Quality 363 (35%)', + '02c0554e4a004ceaddd0d7772e68a38b:221111' => 'Apple QuickTime, Quality 364 (36%)', + 'e7b9303f785f78a2cb27f83616c18726:221111' => 'Apple QuickTime, Quality 365 (36%)', + '4a4a154781db3f5f500e8cf177a4b446:221111' => 'Apple QuickTime, Quality 366 (36%)', + '7e4b44f2900a405e7b85090af7d40298:221111' => 'Apple QuickTime, Quality 367 (36%)', + '76aa290370382de8a3516f73389f9350:221111' => 'Apple QuickTime, Quality 368 (36%)', + '912779b5b7c935f2b533af0f400402f3:221111' => 'Apple QuickTime, Quality 369 (36%)', + '91c7f694fbf07321037a838c3a4d6e7d:221111' => 'Apple QuickTime, Quality 370 (36%)', + 'f98a4286abf1cbe8bf46fba1e78cec61:221111' => 'Apple QuickTime, Quality 371 (36%)', + '2fbbcce5a035d6215e4851a0ae63481f:221111' => 'Apple QuickTime, Quality 372 (36%)', + '8d8fab3b6b7386a4e81f10c15a7abaa5:221111' => 'Apple QuickTime, Quality 373 (36%)', + '82e672854d7e00d47a988855b95d2f7f:221111' => 'Apple QuickTime, Quality 374 (37%)', + '9fffe6b2fbbce23598c19e6cd177adb0:221111' => 'Apple QuickTime, Quality 375 (37%)', + '3f69293a4abeb2201004e7241fe22c75:221111' => 'Apple QuickTime, Quality 376 (37%)', + 'a01d3a7766c7c593a79ff6c63433860a:221111' => 'Apple QuickTime, Quality 377 (37%)', + '787ed74c3d5570c03f98804bc9d0c448:221111' => 'Apple QuickTime, Quality 378 (37%)', + '12239aa16bb4091d8f873f9536e40371:221111' => 'Apple QuickTime, Quality 379 (37%)', + 'f45d495d3b470eadba70bcca888042b3:221111' => 'Apple QuickTime, Quality 380 (37%)', + '97346edee67c3afea7823c72e57cb6c5:221111' => 'Apple QuickTime, Quality 381 (37%)', + '5b35e4bc9cbbc353b8e4b73132324088:221111' => 'Apple QuickTime, Quality 382 (37%)', + 'a43b370edaaee853bb16e46ee4a002e8:221111' => 'Apple QuickTime, Quality 383 (37%)', + '7f3d110973a4d7d5824724c4e577b407:221111' => 'Apple QuickTime, Quality 384 (38%)', + '0e36104efe90a5a77e9b686d0a6528ab:221111' => 'Apple QuickTime, Quality 385 (38%)', + '0bc0941c2a59d9a12b66d1d34117cfd7:221111' => 'Apple QuickTime, Quality 386 (38%)', + '342e3bddb81140ea9df00400a46461d7:221111' => 'Apple QuickTime, Quality 387 (38%)', + 'ad8bbd6b23b87950d1b76278fbb7de87:221111' => 'Apple QuickTime, Quality 388 (38%)', + 'd58f5d339b69e1296911a3387cc664a4:221111' => 'Apple QuickTime, Quality 389 (38%)', + 'c740804ef8493bb467744e1cdb8882c1:221111' => 'Apple QuickTime, Quality 390 (38%)', + 'ab975404bdb713bb6a58ac560330aaf1:221111' => 'Apple QuickTime, Quality 391 (38%)', + 'eb68a0ff9c83267e5fb5e998365b4480:221111' => 'Apple QuickTime, Quality 392 (38%)', + '9c1865e7fdc0289dc5fe8f4c1f65577e:221111' => 'Apple QuickTime, Quality 393 (38%)', + '21db4122ad8183006542018e53e0c653:221111' => 'Apple QuickTime, Quality 394 (38%)', + '734255167cbd052200fb4c474f05bcd9:221111' => 'Apple QuickTime, Quality 395 (39%)', + 'e5dcd017a9734f9f0e18b515c7fa1787:221111' => 'Apple QuickTime, Quality 396 (39%)', + 'c58a47c2e3dc737b9591420812b9cc27:221111' => 'Apple QuickTime, Quality 397 (39%)', + 'ea25d0beaa91434a14348fb60f5cff31:221111' => 'Apple QuickTime, Quality 398 (39%)', + '21f8a4a67742edcde0ac854522028c9f:221111' => 'Apple QuickTime, Quality 399 (39%)', + '8b8dc34912d8b18742a7670be4b1c867:221111' => 'Apple QuickTime, Quality 400 (39%)', + 'f7adac1fb54bb1fc566b66822122a9c6:221111' => 'Apple QuickTime, Quality 401 (39%)', + '0fe0c7e65c0696d9e76ad819d61e44ae:221111' => 'Apple QuickTime, Quality 402 (39%)', + '6dabf05ddc213b650ff08aa9a8cb9f50:221111' => 'Apple QuickTime, Quality 403 (39%)', + '226788e417078cdcc5aa989379b9e824:221111' => 'Apple QuickTime, Quality 404 (39%)', + '9366dde6c37f4cac36a8e8cea4d5f51c:221111' => 'Apple QuickTime, Quality 405 (40%)', + '3ce5057aaf0ff155ee69d66591c8290d:221111' => 'Apple QuickTime, Quality 406 (40%)', + '58fe81014a9ee26a7bd393c8e31f4011:221111' => 'Apple QuickTime, Quality 407 (40%)', + '41e44bae14ab49d1b0f06438d34cb316:221111' => 'Apple QuickTime, Quality 408 (40%)', + '80ccbe5645cc62ebd4ae7b2128b42d91:221111' => 'Apple QuickTime, Quality 409 (40%)', + 'b08af3cffd1904e8a8cfbbba71077069:221111' => 'Apple QuickTime, Quality 410 (40%)', + 'abb56efe234d4b8fdf50016a19c63684:221111' => 'Apple QuickTime, Quality 411 (40%)', + 'e41806d0928fbb5552225e10db7b55d0:221111' => 'Apple QuickTime, Quality 412 (40%)', + 'ae9de0a8343d730e2e6a358849c29a4e:221111' => 'Apple QuickTime, Quality 413 (40%)', + 'b83146f54d17b2c8e242f7f36dc36f19:221111' => 'Apple QuickTime, Quality 414 (40%)', + 'a748fdfe8d6dc9493253908410e517eb:221111' => 'Apple QuickTime, Quality 415 (41%)', + 'd4bb4c59b5284630a4c716a0290d9091:221111' => 'Apple QuickTime, Quality 416 (41%)', + 'de93dd8ab7918b25f191923f4a43a5c2:221111' => 'Apple QuickTime, Quality 417 (41%)', + '0807f8b3b41b01054509858fa74dcf4d:221111' => 'Apple QuickTime, Quality 418 (41%)', + 'efd780e10dcd0ab8ca0a0f4f3cb215d3:221111' => 'Apple QuickTime, Quality 419 (41%)', + '2ec3d0ec37690e40f009b7a9f9b17c49:221111' => 'Apple QuickTime, Quality 420 (41%)', + 'a4680e71907e5c6f7b18e20e46286412:221111' => 'Apple QuickTime, Quality 421 (41%)', + '8e54abf2320cca661b6dd67b7658c9f3:221111' => 'Apple QuickTime, Quality 422 (41%)', + '00f76480eafd05aa5267053aec3aa122:221111' => 'Apple QuickTime, Quality 423 (41%)', + '849bce1254b14d44e24a6b419c385597:221111' => 'Apple QuickTime, Quality 424 (41%)', + '8a91452f2df82874183be50601242106:221111' => 'Apple QuickTime, Quality 425 (42%)', + 'a670182cd48f37dd16652db878791a7a:221111' => 'Apple QuickTime, Quality 426 (42%)', + 'c2afe9aca67de0276a6fb507861c3e80:221111' => 'Apple QuickTime, Quality 427 (42%)', + '18836b72e5399e2a19cd6420562ab1ff:221111' => 'Apple QuickTime, Quality 428 (42%)', + 'cb207af75faf8ee1ef0ca3caa593bb69:221111' => 'Apple QuickTime, Quality 429 (42%)', + '7a318965f27e3c09d11f53cbb10a872b:221111' => 'Apple QuickTime, Quality 430 (42%)', + 'b0a501129cb83e54f97006610ec9ed64:221111' => 'Apple QuickTime, Quality 431 (42%)', + 'f1a8af8c0abe4b3423d5ac8c6273a7ca:221111' => 'Apple QuickTime, Quality 432 (42%)', + '56224ea0ac2fccb92cbe9702896f9796:221111' => 'Apple QuickTime, Quality 433 (42%)', + '2f2101a8450c617a09ccad472c275b88:221111' => 'Apple QuickTime, Quality 434 (42%)', + '13e218420429e2c94d4b9474ab03f8e4:221111' => 'Apple QuickTime, Quality 435 (42%)', + '41061e1cdb97926ed5bded3da11af209:221111' => 'Apple QuickTime, Quality 436 (43%)', + 'cc3e4dc4e190d00a12bd03199efdcc6d:221111' => 'Apple QuickTime, Quality 437 (43%)', + '36b2371ec6df13143af12d600232c2ab:221111' => 'Apple QuickTime, Quality 438 (43%)', + '71d0e3444a4c82cf39048ba8cf7b1d5f:221111' => 'Apple QuickTime, Quality 439 (43%)', + '9f48e71f610caa47b94d3e474608cb3d:221111' => 'Apple QuickTime, Quality 440 (43%)', + 'dcecd4f366d521e118e94d87ef915caa:221111' => 'Apple QuickTime, Quality 441 (43%)', + 'cf0a070dc9b4a8983b50f8e3f105b857:221111' => 'Apple QuickTime, Quality 442 (43%)', + '5504a428191bc87e5c1ba4b5e9984a37:221111' => 'Apple QuickTime, Quality 443 (43%)', + 'de6a322383022ee8d966e848a2df4f28:221111' => 'Apple QuickTime, Quality 444 (43%)', + '163be99e863436e9b3d32615785ec8e1:221111' => 'Apple QuickTime, Quality 445 (43%)', + '958185c48000065b5b8d03b0f975d95b:221111' => 'Apple QuickTime, Quality 446 (44%)', + '2d719cb263e284fc8621bbec1fe52cd5:221111' => 'Apple QuickTime, Quality 447 (44%)', + '8f0f54955cf19689f38df36715908b76:221111' => 'Apple QuickTime, Quality 448 (44%)', + '737c61e006222488645fa2e007f83f3c:221111' => 'Apple QuickTime, Quality 449 (44%)', + 'bb342113b57cf66ce0cf3a09fae5fd16:221111' => 'Apple QuickTime, Quality 450 (44%)', + 'cd3ed5b396580d8e9f0cb7b78baed8b8:221111' => 'Apple QuickTime, Quality 451 (44%)', + 'e7914fbf6c9b2a127af3676726e6bd8b:221111' => 'Apple QuickTime, Quality 452 (44%)', + '377a7b50c2d7484255bbbf537bf9fa86:221111' => 'Apple QuickTime, Quality 453 (44%)', + '09f9009406d2fe8dfa1b35236f8b1bdb:221111' => 'Apple QuickTime, Quality 454 (44%)', + '78b0e590ea36cb11c495097049022d2e:221111' => 'Apple QuickTime, Quality 455 (44%)', + '984c0f34636e6197b508265f17cbd6c9:221111' => 'Apple QuickTime, Quality 456 (45%)', + '7fca22065811c0efe6599a15ca38f05e:221111' => 'Apple QuickTime, Quality 457 (45%)', + 'd55d9744065708d7b6fa7fb6e8eb2453:221111' => 'Apple QuickTime, Quality 458 (45%)', + '63ef900bf59d41003a0e0602baa60681:221111' => 'Apple QuickTime, Quality 459 (45%)', + 'e8b31dbd18c91229a3c40356efeb2622:221111' => 'Apple QuickTime, Quality 460 (45%)', + '8cb1bb16c6fa524199dad5513386d225:221111' => 'Apple QuickTime, Quality 461 (45%)', + 'c53438ece0552cedb1ec0d50ad2d5dbe:221111' => 'Apple QuickTime, Quality 462 (45%)', + '5db6302d7e68c1a274139033681b8fcc:221111' => 'Apple QuickTime, Quality 463 (45%)', + 'acd1d5ec1787c9d346d87c281a7b6da0:221111' => 'Apple QuickTime, Quality 464-465 (45%)', + 'e66c03f97b19213f385136f014c78ac1:221111' => 'Apple QuickTime, Quality 466-467 (46%)', + '23816ed847127a41e3c7f52e04072e41:221111' => 'Apple QuickTime, Quality 468 (46%)', + 'ebce337e9ef5a07775cebe40d7623862:221111' => 'Apple QuickTime, Quality 469 (46%)', + '09563e47ab174b05fb19f722e9aa43c3:221111' => 'Apple QuickTime, Quality 470 (46%)', + '545e14e832fb81f032526a9efcbf2450:221111' => 'Apple QuickTime, Quality 471 (46%)', + 'edda5d6ae456d4cdccec80e390ac9279:221111' => 'Apple QuickTime, Quality 472 (46%)', + '9a43fc0aa6223673c32a49fb76d6525c:221111' => 'Apple QuickTime, Quality 473 (46%)', + 'bdaf3e68c2925cbaad3864359fdbbb77:221111' => 'Apple QuickTime, Quality 474 (46%)', + '4f83a1a8338a8e6e70eaa58cd236f62a:221111' => 'Apple QuickTime, Quality 475 (46%)', + '879b320cfd6e27b2e283b573483bda81:221111' => 'Apple QuickTime, Quality 476 (46%)', + '2748fa249a86361b1b5f0662a88abdb3:221111' => 'Apple QuickTime, Quality 477 (47%)', + '32eb803f68d72719267a1313548e7180:221111' => 'Apple QuickTime, Quality 478 (47%)', + '771eeb43856b1821a271b0aa8398a243:221111' => 'Apple QuickTime, Quality 479 (47%)', + '653c5006512bb3aaa1e6a4e77078b630:221111' => 'Apple QuickTime, Quality 480 (47%)', + 'c5c102ba5f004d49656f424d89e9773c:221111' => 'Apple QuickTime, Quality 481 (47%)', + 'd5220fcfa99764e440684fbac6273cff:221111' => 'Apple QuickTime, Quality 482 (47%)', + 'd300f18258f46060d89c994dbc370131:221111' => 'Apple QuickTime, Quality 483 (47%)', + '60258dcc1e3a81858d176080ef774730:221111' => 'Apple QuickTime, Quality 484 (47%)', + '8bda9fb1ed75249ac5b2feaad7b51d2f:221111' => 'Apple QuickTime, Quality 485 (47%)', + '9e334af92d75ab7d4ea1a9816840ea73:221111' => 'Apple QuickTime, Quality 486 (47%)', + 'c40a38c96832a6042c6ddfc9754c1d6d:221111' => 'Apple QuickTime, Quality 487 (48%)', + '30be130aa27d0b91d6f55ed9b1cd6c84:221111' => 'Apple QuickTime, Quality 488 (48%)', + '3601e95d6cd507065d46b3f058229d91:221111' => 'Apple QuickTime, Quality 489 (48%)', + '9127f8ddd20e583523bc848e99061126:221111' => 'Apple QuickTime, Quality 490 (48%)', + '0d605d279c48a74ef71a24e89ca426a8:221111' => 'Apple QuickTime, Quality 491 (48%)', + 'a5cd2d8592e1c45b67cfb3009d07fb49:221111' => 'Apple QuickTime, Quality 492 (48%)', + 'e346ce6e3bee6abff16420f5ba95ceb9:221111' => 'Apple QuickTime, Quality 493 (48%)', + '03295b26893cab9c7dea4ec15ed56d08:221111' => 'Apple QuickTime, Quality 494 (48%)', + '76af24fe94edf8f3992e38c1dd6eebce:221111' => 'Apple QuickTime, Quality 495 (48%)', + '3c58e82299d87346d37023ea015f3e80:221111' => 'Apple QuickTime, Quality 496 (48%)', + 'aa8940194463b7adc14f20dbee9c6a75:221111' => 'Apple QuickTime, Quality 497 (49%)', + '68a808b23bfa8096e04006171926b72c:221111' => 'Apple QuickTime, Quality 498 (49%)', + '34c0043b98d09193beda0cf5d1ada274:221111' => 'Apple QuickTime, Quality 499 (49%)', + '5881bb3c6e7e2ac43983b4b1e947a6c3:221111' => 'Apple QuickTime, Quality 500 (49%)', + 'a0a7061bc100f051a3c5470559661138:221111' => 'Apple QuickTime, Quality 501 (49%)', + '62e6812d1f7935adddd1a69227cdf626:221111' => 'Apple QuickTime, Quality 502 (49%)', + '94f6dbd754fb4ba3c92698d5f08084f9:221111' => 'Apple QuickTime, Quality 503 (49%)', + 'b7257ba67e4b38b7ccdca2a65d60c970:221111' => 'Apple QuickTime, Quality 504 (49%)', + '5a19d6130b03080dfedef45b6415f4f8:221111' => 'Apple QuickTime, Quality 505 (49%)', + '2b3262e10b1563600a5f0738fec342ed:221111' => 'Apple QuickTime, Quality 506 (49%)', + '295cb1e2772312ba5cd546966d1aa70d:221111' => 'Apple QuickTime, Quality 507 (50%)', + 'c910bcb7b9e8967b87cfa08229d9ca34:221111' => 'Apple QuickTime, Quality 508 (50%)', + '61c8506b490d5e596151b951ffa7a14f:221111' => 'Apple QuickTime, Quality 509 (50%)', + 'ae15629cecc940fef9f24ad9f207fa10:221111' => 'Apple QuickTime, Quality 510 (50%)', + 'c8ef3c50ca99c44ea13f1692ac1190dc:221111' => 'Apple QuickTime, Quality 511 (50%)', + '50500b1272433ef5c9c96f16069fbdf1:221111' => 'Apple QuickTime, Quality 512 (50%)', + 'e41e5416e21dbfb5a41f006b3485f5bb:221111' => 'Apple QuickTime, Quality 513 (50%)', + 'd606add3e7590885ac8978af6d09a2aa:221111' => 'Apple QuickTime, Quality 514 (50%)', + 'cc3936c39c298ef67d9196d0254b0c19:221111' => 'Apple QuickTime, Quality 515 (50%)', + 'e83f8505dc3f5f46b37e22b590f71b98:221111' => 'Apple QuickTime, Quality 516 (50%)', + '2a8e27e03b6e1555335c91231c452bba:221111' => 'Apple QuickTime, Quality 517 (50%)', + '52ab880d25db7b36137e2a3c04987c9a:221111' => 'Apple QuickTime, Quality 518 (51%)', + 'ce2335cc1f8289deda620877f50fd90d:221111' => 'Apple QuickTime, Quality 519 (51%)', + 'bbad0e19b252268530df19c563aa9176:221111' => 'Apple QuickTime, Quality 520 (51%)', + '3184b71ca26bfe0c80811cf10423fa92:221111' => 'Apple QuickTime, Quality 521 (51%)', + '37802f44dab089a35e03b94a298b19da:221111' => 'Apple QuickTime, Quality 522 (51%)', + '5e528bd6778792490c6cf292cf9ba8df:221111' => 'Apple QuickTime, Quality 523 (51%)', + 'fbe0f5b89f266ff382f2b14c70a83097:221111' => 'Apple QuickTime, Quality 524 (51%)', + 'a4bfd80e0c8b9ae7a1114d79a7b63ad6:221111' => 'Apple QuickTime, Quality 525 (51%)', + 'abdf532dc2005805db7d8d0214227146:221111' => 'Apple QuickTime, Quality 526 (51%)', + '2a7ec778642b15b8bce238f7b63ef537:221111' => 'Apple QuickTime, Quality 527 (51%)', + '70073f02f04ee893510bceb09e411d53:221111' => 'Apple QuickTime, Quality 528 (52%)', + '345d210b180a45bd23b0c7931c59c263:221111' => 'Apple QuickTime, Quality 529 (52%)', + 'ddbc4e6566bbcc74b6205526393ef468:221111' => 'Apple QuickTime, Quality 530 (52%)', + '420af34c4f718cc0a10de5285140b6e0:221111' => 'Apple QuickTime, Quality 531 (52%)', + '16b6c2d8688113b1a28afbbc57f46f80:221111' => 'Apple QuickTime, Quality 532-533 (52%)', + '4a2a0e381fed49e5d5ba074998652561:221111' => 'Apple QuickTime, Quality 534 (52%)', + '50f1255f2424b2de5b930751ddf24842:221111' => 'Apple QuickTime, Quality 535 (52%)', + '80f2c05e2ad3524f18dd55bac10ee2e3:221111' => 'Apple QuickTime, Quality 536 (52%)', + '6c0916ab5aa02602cc682bcdbc22369e:221111' => 'Apple QuickTime, Quality 537 (52%)', + 'f7e5656e1f2cf036e9a57a6c02373398:221111' => 'Apple QuickTime, Quality 538 (53%)', + '92044affd220e31ee953aff021144b29:221111' => 'Apple QuickTime, Quality 539 (53%)', + '2bafe4b75b8a105d72e981b21fe3b6cf:221111' => 'Apple QuickTime, Quality 540 (53%)', + 'ca0e84028714f19cf20cb868d1cd346c:221111' => 'Apple QuickTime, Quality 541 (53%)', + 'db1ae392a31d30cd5564dc7bbea24019:221111' => 'Apple QuickTime, Quality 542 (53%)', + '4417e739b9244781987769c2177abc6f:221111' => 'Apple QuickTime, Quality 543 (53%)', + 'f1de58c1c6a48dc36ce7e8c69636539c:221111' => 'Apple QuickTime, Quality 544 (53%)', + '10c931d7bff7bfcc20e37f0868887228:221111' => 'Apple QuickTime, Quality 545 (53%)', + 'e082971717023e667f3d922bbccf089b:221111' => 'Apple QuickTime, Quality 546 (53%)', + '5a285190351b16fee0eb14778280d74f:221111' => 'Apple QuickTime, Quality 547 (53%)', + 'aad0e2cd42c5adaec41080a05be4ffdc:221111' => 'Apple QuickTime, Quality 548 (54%)', + 'de802b8c64d7f854081c7df6ed345b43:221111' => 'Apple QuickTime, Quality 549 (54%)', + '82f45d11d651d93a67995965b94aa649:221111' => 'Apple QuickTime, Quality 550 (54%)', + '617c4c853344ef079f4a1f1062672e8c:221111' => 'Apple QuickTime, Quality 551-552 (54%)', + '90d96923be1883e6ee15a9d0d32a114c:221111' => 'Apple QuickTime, Quality 553 (54%)', + '307c47179fdad179b5f962228c115db8:221111' => 'Apple QuickTime, Quality 554 (54%)', + 'a4683813bdf6e2bd429c4c5676128384:221111' => 'Apple QuickTime, Quality 555 (54%)', + '8e3cfc2fc9cfbba0f6aed9850504ebb6:221111' => 'Apple QuickTime, Quality 556 (54%)', + 'a8f8928c72b69049e1da7639e977c9c7:221111' => 'Apple QuickTime, Quality 557 (54%)', + '1fb4c8af2d70cdeecab3fd9fc882e0ce:221111' => 'Apple QuickTime, Quality 558 (54%)', + '98ddda3b0ada32ce919b9af9df4054dd:221111' => 'Apple QuickTime, Quality 559 (55%)', + 'b43ab5c404469c416e853e52497b3f0d:221111' => 'Apple QuickTime, Quality 560 (55%)', + 'd9696efa02b9de813caf8d684b06346f:221111' => 'Apple QuickTime, Quality 561 (55%)', + 'be63c4e967eff819bd8a052a561a4576:221111' => 'Apple QuickTime, Quality 562 (55%)', + 'f984581f90913e44f3898fffd8fce8b0:221111' => 'Apple QuickTime, Quality 563 (55%)', + '082779cf55f6b922036f11b74df54110:221111' => 'Apple QuickTime, Quality 564 (55%)', + '066fd6cb3a5dd994fc6159987afde581:221111' => 'Apple QuickTime, Quality 565 (55%)', + '133351a0f39427f1199312585cd6c997:221111' => 'Apple QuickTime, Quality 566 (55%)', + '6c23da63c864f1433ec198ae202e56f0:221111' => 'Apple QuickTime, Quality 567 (55%)', + '7d1819ccce2756fcf6dfbb67565c2552:221111' => 'Apple QuickTime, Quality 568 (55%)', + 'd9794fa54e2ef47be48b972cdca910c2:221111' => 'Apple QuickTime, Quality 569 (56%)', + '085db73bd47194c8fdf567fc619c3b62:221111' => 'Apple QuickTime, Quality 570 (56%)', + '9866add6e1d251e1d4c40793f4300dce:221111' => 'Apple QuickTime, Quality 571 (56%)', + '1b9e7e39831b05b058025ae0a7482d44:221111' => 'Apple QuickTime, Quality 572 (56%)', + 'a8b52e666bd3d81404c0f8915ac18b43:221111' => 'Apple QuickTime, Quality 573 (56%)', + 'e34d11f979458a87492b57eabfd4f4ea:221111' => 'Apple QuickTime, Quality 574 (56%)', + '4295c1330dec60585760cbb05b79662d:221111' => 'Apple QuickTime, Quality 575 (56%)', + '9205cc28769d94d6d00c25804ac70a88:221111' => 'Apple QuickTime, Quality 576 (56%)', + 'b5648f13228d20fd7ae81965394f7515:221111' => 'Apple QuickTime, Quality 577 (56%)', + 'c8f02bf550c40daa39b28911a4ef5a69:221111' => 'Apple QuickTime, Quality 578 (56%)', + 'c2b23a91d377ce2d99ac4109f2740069:221111' => 'Apple QuickTime, Quality 579 (57%)', + 'c0cecb47363aff00a2764a915f95cd35:221111' => 'Apple QuickTime, Quality 580 (57%)', + 'fc0d8f17be060220464fe7bc0a2d754e:221111' => 'Apple QuickTime, Quality 581 (57%)', + '63b59904874e5e427ddecb37e12f90c7:221111' => 'Apple QuickTime, Quality 582 (57%)', + 'df6535865562ce7cbf08e9368e991a95:221111' => 'Apple QuickTime, Quality 583 (57%)', + '74523ad3424dcff6aa697c3ce433ad4e:221111' => 'Apple QuickTime, Quality 584 (57%)', + 'cbdec670ec6d9105277434b304226920:221111' => 'Apple QuickTime, Quality 585 (57%)', + '68783ed0a7956cf0b7a1b2787e756213:221111' => 'Apple QuickTime, Quality 586 (57%)', + 'a431976a61e281e7b9d808f094b74d2e:221111' => 'Apple QuickTime, Quality 587 (57%)', + '8e2a66454fb149552d4538d53ec033aa:221111' => 'Apple QuickTime, Quality 588 (57%)', + '49222c4a3be01e93baad695bba63b254:221111' => 'Apple QuickTime, Quality 589 (58%)', + 'ab8fe796c87f9f61cedbfa64af9f5dec:221111' => 'Apple QuickTime, Quality 590 (58%)', + '9bfe788e7ae4bc9cbe76d36f9a2b1b5e:221111' => 'Apple QuickTime, Quality 591 (58%)', + '22b5f11b635ea5484469708cd7e6e3d9:221111' => 'Apple QuickTime, Quality 592 (58%)', + '44e36eb25c6f9e313ef2a8f4c520c335:221111' => 'Apple QuickTime, Quality 593 (58%)', + 'c71aa81fb12b378dd31a1ca128942f76:221111' => 'Apple QuickTime, Quality 594 (58%)', + 'e56ca8f4da20395ec1f87d380198fa0a:221111' => 'Apple QuickTime, Quality 595 (58%)', + '38f4d508dcf9c82d9488b42a2487b191:221111' => 'Apple QuickTime, Quality 596 (58%)', + '3da1e7270e0900a17a0a4ff8d3c9a488:221111' => 'Apple QuickTime, Quality 597 (58%)', + '900fee18a5f6d1dc3fd856d3d92f5414:221111' => 'Apple QuickTime, Quality 598 (58%)', + '3c724d4b5d8cbe203ebbf92ea8e22808:221111' => 'Apple QuickTime, Quality 599 (58%)', + 'e7e7befa282a985a0532634f360df7db:221111' => 'Apple QuickTime, Quality 600 (59%)', + '1f21bf5b7e0e79c229ef4d06fc9d3cc8:221111' => 'Apple QuickTime, Quality 601 (59%)', + '3bb09b202acd618286d26a33f688f7c7:221111' => 'Apple QuickTime, Quality 602 (59%)', + '9717c5a17cbffdfaa2e5d3769b87fbc5:221111' => 'Apple QuickTime, Quality 603 (59%)', + 'ffa7874d293c62ecc55c098b8f305ae1:221111' => 'Apple QuickTime, Quality 604 (59%)', + 'e68841bf28d33d749d0031bfe3a5219c:221111' => 'Apple QuickTime, Quality 605 (59%)', + '5862c8c2b241a9760f6804d970eefd66:221111' => 'Apple QuickTime, Quality 606 (59%)', + '1d069604250e871bd92a4a24c7be2bd5:221111' => 'Apple QuickTime, Quality 607 (59%)', + '3806bcbefd350e8791be95dfc62bab27:221111' => 'Apple QuickTime, Quality 608 (59%)', + '490b035a665ef80c7b48804461d55b7f:221111' => 'Apple QuickTime, Quality 609 (59%)', + 'bd6943a8c92a14e74d2b24052a19400a:221111' => 'Apple QuickTime, Quality 610 (60%)', + '93e725418f46b2a70723523bef0979fe:221111' => 'Apple QuickTime, Quality 611 (60%)', + '5b66fa5c0c1ba746289747229193cfb0:221111' => 'Apple QuickTime, Quality 612 (60%)', + '1bdac971e8cddd198ad3123849370037:221111' => 'Apple QuickTime, Quality 613 (60%)', + '20f7b70185f4b324a8451ac4657c1d66:221111' => 'Apple QuickTime, Quality 614 (60%)', + '86ab18d6c1359a424f303fcfd0930df2:221111' => 'Apple QuickTime, Quality 615 (60%)', + '0d70031c9962dba7c39da59ada2f1660:221111' => 'Apple QuickTime, Quality 616-617 (60%)', + '9cb9a256b6deb481cf13e5230fe87dbb:221111' => 'Apple QuickTime, Quality 618-619 (60%)', + 'cb34e1a0e18a4dd7ffe823f9c92b3622:221111' => 'Apple QuickTime, Quality 620 (61%)', + 'ac015afc1d80314edd832aebfb495d25:221111' => 'Apple QuickTime, Quality 621 (61%)', + '4974cc7044768888244b324449a238ab:221111' => 'Apple QuickTime, Quality 622 (61%)', + 'bc4541f5bc4d58b99b53d24f3f520b32:221111' => 'Apple QuickTime, Quality 623 (61%)', + 'ec2fd56a50df0e42498018d441a3aa75:221111' => 'Apple QuickTime, Quality 624 (61%)', + '153a6f0994d16003aa4f1112e6757467:221111' => 'Apple QuickTime, Quality 625 (61%)', + 'ed6b90ca62ed648d1102e1c506a0af26:221111' => 'Apple QuickTime, Quality 626 (61%)', + '18593e50c21c8ad521b30933ef7479b1:221111' => 'Apple QuickTime, Quality 627 (61%)', + '6f96ed52a987d67e8d950b2627d3fbc2:221111' => 'Apple QuickTime, Quality 628 (61%)', + 'e76d86e8de4f0bf9e58cd389e0a8c117:221111' => 'Apple QuickTime, Quality 629 (61%)', + '4fa27c83741226576ac6359cd4f6248e:221111' => 'Apple QuickTime, Quality 630 (62%)', + 'be010732a7783ee345548a1eb95d024a:221111' => 'Apple QuickTime, Quality 631 (62%)', + '6700663d4ebaeb394bfd3c85597347b5:221111' => 'Apple QuickTime, Quality 632 (62%)', + '34dba33043aa5ee317b7649242e702b1:221111' => 'Apple QuickTime, Quality 633 (62%)', + '821d7e59bcf756171b7644ec5736266e:221111' => 'Apple QuickTime, Quality 634 (62%)', + 'd81683c0458d9ad72751530d6fbc1389:221111' => 'Apple QuickTime, Quality 635 (62%)', + '4c04d6fe904a4b6ff8b25c9f0e9f0a16:221111' => 'Apple QuickTime, Quality 636 (62%)', + '8efda55d6186d9867189c5cb572c5413:221111' => 'Apple QuickTime, Quality 637 (62%)', + '25497c83113bd738e89d91bd48d7086c:221111' => 'Apple QuickTime, Quality 638 (62%)', + '84c8e142e6d27734b126f76653b9199d:221111' => 'Apple QuickTime, Quality 639 (62%)', + 'bdaf13038b56b5701f60300528f8a89c:221111' => 'Apple QuickTime, Quality 640-641 (63%)', + 'b015ada43293b8d5bd2a8f288f8fb928:221111' => 'Apple QuickTime, Quality 642 (63%)', + '8134ff0c4713cc1ef4a25ff60b49ac54:221111' => 'Apple QuickTime, Quality 643 (63%)', + '967fc5c3ece2b69662257c76397416c9:221111' => 'Apple QuickTime, Quality 644 (63%)', + 'd01a38e0f568d2a7b6b71f8fa63b8bcc:221111' => 'Apple QuickTime, Quality 645 (63%)', + '5229288e448311401bb284133ac7d48c:221111' => 'Apple QuickTime, Quality 646 (63%)', + '76d22de881d1b95b491689b589743b7a:221111' => 'Apple QuickTime, Quality 647 (63%)', + 'c81b03b0291d2277461a551ed6861252:221111' => 'Apple QuickTime, Quality 648-649 (63%)', + 'ebb774b4e106d1a9df5824958d4e5a95:221111' => 'Apple QuickTime, Quality 650 (63%)', + '9ed53fb5bc8e397daf9409251c0a0a6c:221111' => 'Apple QuickTime, Quality 651 (64%)', + '87d40f2e4dad34fa435c62af6817dc18:221111' => 'Apple QuickTime, Quality 652 (64%)', + '0b933cf90e62682da926267d6356ac2b:221111' => 'Apple QuickTime, Quality 653 (64%)', + '2c4a4cb841ee92aa3a2b4c93467ba7a8:221111' => 'Apple QuickTime, Quality 654 (64%)', + '8a6ba56597670b7adb70901eca278049:221111' => 'Apple QuickTime, Quality 655 (64%)', + 'd1ef25928fd4eefe131ffcfc249b9f8a:221111' => 'Apple QuickTime, Quality 656 (64%)', + '8c85462b5a01db09bcbf304d7be1d543:221111' => 'Apple QuickTime, Quality 657 (64%)', + '19c03533b9b2e3304a0b02d9b1054497:221111' => 'Apple QuickTime, Quality 658 (64%)', + 'd2baa8fbc56f0970f820c376c6065d41:221111' => 'Apple QuickTime, Quality 659 (64%)', + 'e6a0a679a13a99de16e13c6ea2829deb:221111' => 'Apple QuickTime, Quality 660-661 (64-65%)', + '8e4f695afcf2a06254561e5e22b7a80b:221111' => 'Apple QuickTime, Quality 662 (65%)', + 'd053fd2c67ce96b0ecf9ffc4b7f7775d:221111' => 'Apple QuickTime, Quality 663 (65%)', + '326c33f64f96592487d2bfdd198738bf:221111' => 'Apple QuickTime, Quality 664 (65%)', + '1ff8f5ff33353a3ee0b6dc8fbb6321a0:221111' => 'Apple QuickTime, Quality 665 (65%)', + '14a5534e4216458662a43101d56d84c8:221111' => 'Apple QuickTime, Quality 666 (65%)', + '0643b87475939754c8d56825cd96242f:221111' => 'Apple QuickTime, Quality 667 (65%)', + '45c46a02a434d8ea759742907bfa0ee5:221111' => 'Apple QuickTime, Quality 668 (65%)', + '2916d9453b885ee4123e6e3ee94ccbc7:221111' => 'Apple QuickTime, Quality 669-671 (65-66%)', + 'b8fca611f92cbc459fe21e11f0214328:221111' => 'Apple QuickTime, Quality 672-673 (66%)', + 'f40fb322c4bde68a2902c86c613af841:221111' => 'Apple QuickTime, Quality 674 (66%)', + '1cbd419717a2916b53f9f504ec1167ca:221111' => 'Apple QuickTime, Quality 675 (66%)', + '79f546689b548868a904f50214928aa1:221111' => 'Apple QuickTime, Quality 676 (66%)', + '8ff6f2d4369155b0474417b00c3c4ac9:221111' => 'Apple QuickTime, Quality 677 (66%)', + 'c60dbbefd4f215b9359dd004f4fb0fd3:221111' => 'Apple QuickTime, Quality 678 (66%)', + 'c192d5847d1146a31db621263a9ce2f5:221111' => 'Apple QuickTime, Quality 679 (66%)', + '4a2361c48a583f6df779d1e6088ed83c:221111' => 'Apple QuickTime, Quality 680 (66%)', + '6c6260b84a3a588614d65133430289ea:221111' => 'Apple QuickTime, Quality 681 (67%)', + '6773f3db56ae831012dbe43c1650571a:221111' => 'Apple QuickTime, Quality 682 (67%)', + '813b89236cfe429fe534361f28ace015:221111' => 'Apple QuickTime, Quality 683 (67%)', + '363b54d38094e5f2e2d63c50870ae76c:221111' => 'Apple QuickTime, Quality 684 (67%)', + '7b17607b9954c37e525b1fbc35271553:221111' => 'Apple QuickTime, Quality 685 (67%)', + '8b1138e2d88033d42698a386a2e8605b:221111' => 'Apple QuickTime, Quality 686 (67%)', + 'c029b8a48e3c93f7c0367f2a149491c7:221111' => 'Apple QuickTime, Quality 687 (67%)', + 'a36199f5a090de94b10a32fbe05f2916:221111' => 'Apple QuickTime, Quality 688-689 (67%)', + 'a873e49b871c32bcaf8e3c6622744e70:221111' => 'Apple QuickTime, Quality 690 (67%)', + 'b9d16f36087d4cca70eef1512c4be569:221111' => 'Apple QuickTime, Quality 691 (67%)', + 'd5994dbe056ea3544b3256a7a6b53749:221111' => 'Apple QuickTime, Quality 692 (68%)', + '0106cf02dcf4109cc6f02fa4ec0e2700:221111' => 'Apple QuickTime, Quality 693 (68%)', + '7d71776416a8771d10e3c2e6dc6a5f21:221111' => 'Apple QuickTime, Quality 694-695 (68%)', + 'c1557f789acc622c8858be4dfbc53c31:221111' => 'Apple QuickTime, Quality 696 (68%)', + '5a54f085c1780cadb13a7dea8347c7c6:221111' => 'Apple QuickTime, Quality 697 (68%)', + '04a5bb959bc203221e72e6575ff39602:221111' => 'Apple QuickTime, Quality 698 (68%)', + '116e3d5fee4e3a695c0f79c09c89ff84:221111' => 'Apple QuickTime, Quality 699 (68%)', + '145bfd5481e99e18c4c3707228557fa5:221111' => 'Apple QuickTime, Quality 700 (68%)', + '19ceef79e864691318beea6502ddc3e1:221111' => 'Apple QuickTime, Quality 701 (68%)', + 'dd0a023941d7bfd118d272f4f925e6e2:221111' => 'Apple QuickTime, Quality 702 (69%)', + '81f039d6a0ded8227dc51273d153b295:221111' => 'Apple QuickTime, Quality 703-704 (69%)', + '9a7ebf265afce16abaa6ca2fbb550b63:221111' => 'Apple QuickTime, Quality 705 (69%)', + '8d0fed09156984328f90f9f19fb5a079:221111' => 'Apple QuickTime, Quality 706 (69%)', + 'be7c72e09c46622b0d2b93e170a03e17:221111' => 'Apple QuickTime, Quality 707 (69%)', + '50a510968effffab80bed1d08c6c5ccc:221111' => 'Apple QuickTime, Quality 708 (69%)', + 'da2501a6f59b2256adb0833b58b504f2:221111' => 'Apple QuickTime, Quality 709 (69%)', + '2a1b83345108443a090cdab4c83143fb:221111' => 'Apple QuickTime, Quality 710 (69%)', + 'e7f293f640878b53fe95a7cb0b1dcc83:221111' => 'Apple QuickTime, Quality 711-712 (69-70%)', + 'd9e0a4c08ef5d7f72eecce74c94c054d:221111' => 'Apple QuickTime, Quality 713 (70%)', + 'c5774ffb4573926fd03d4175818c0e5d:221111' => 'Apple QuickTime, Quality 714 (70%)', + 'e2b368a164b67e15598683f9f184bd77:221111' => 'Apple QuickTime, Quality 715 (70%)', + 'f30792e8fad278c3e1677b5f5b74c682:221111' => 'Apple QuickTime, Quality 716-717 (70%)', + '6f6bfc10750e6717cc3791a9ea1d7569:221111' => 'Apple QuickTime, Quality 718-719 (70%)', + '5e3981a937c61480451d5bdc253e5472:221111' => 'Apple QuickTime, Quality 720 (70%)', + 'c4fb82f47a7b002d5cab421592ae4972:221111' => 'Apple QuickTime, Quality 721 (70%)', + 'a6c4a173169d168e003839e51f035661:221111' => 'Apple QuickTime, Quality 722 (71%)', + '72df283a5c07671eba341500a3fc18f1:221111' => 'Apple QuickTime, Quality 723 (71%)', + 'dfb203555c34fe146c526350e11309eb:221111' => 'Apple QuickTime, Quality 724 (71%)', + '033472a8a855fab8cd8f6a5788dd07c8:221111' => 'Apple QuickTime, Quality 725 (71%)', + '5b8a79eec9b7eb7755deb7f2c189e94a:221111' => 'Apple QuickTime, Quality 726 (71%)', + 'ad3aad027e3829959ebeb6288bfab268:221111' => 'Apple QuickTime, Quality 727 (71%)', + '2234156f0550a047700c2a08459c8242:221111' => 'Apple QuickTime, Quality 728 (71%)', + '0c0351c3a444b851cd105dd5cc4db59c:221111' => 'Apple QuickTime, Quality 729 (71%)', + 'c10fca5e6f66238ab09f7e8105f54e39:221111' => 'Apple QuickTime, Quality 730 (71%)', + '74cc07bbb7049d59aff0c4965d4d5084:221111' => 'Apple QuickTime, Quality 731 (71%)', + 'ce9ad8466ffd84b91039326e8688c44a:221111' => 'Apple QuickTime, Quality 732-733 (71-72%)', + 'e4b0c56d41f4af9e10971876ad7ad56d:221111' => 'Apple QuickTime, Quality 734 (72%)', + '96076425ecc546ec028d0eab48332756:221111' => 'Apple QuickTime, Quality 735 (72%)', + 'ba49b0656894f3c76d852223721b3b1f:221111' => 'Apple QuickTime, Quality 736 (72%)', + 'ae5c6eab0d57249acbcb8b1990b2602f:221111' => 'Apple QuickTime, Quality 737-738 (72%)', + '72f08842473a6c504469d341259e5cd7:221111' => 'Apple QuickTime, Quality 739-740 (72%)', + 'c9f953acdfc1f5afdbb9e9f74692d23e:221111' => 'Apple QuickTime, Quality 741 (72%)', + '5a1b57a2583acf5c2428cd62fe24b773:221111' => 'Apple QuickTime, Quality 742 (72%)', + '6a9ead8b2339567482a172a581e86c15:221111' => 'Apple QuickTime, Quality 743-744 (73%)', + '513d9e9dabbb480eb60f7ef76b1d755e:221111' => 'Apple QuickTime, Quality 745 (73%)', + 'b99bdcd0145833d52b916e71f2c20a04:221111' => 'Apple QuickTime, Quality 746 (73%)', + 'ff084566430a3ed4733cd59aec26a55d:221111' => 'Apple QuickTime, Quality 747 (73%)', + '76bcc27918d8f12b343e6e5a41108781:221111' => 'Apple QuickTime, Quality 748 (73%)', + '7bf7022a7c12b3b7ea085b46158253e6:221111' => 'Apple QuickTime, Quality 749 (73%)', + '4baf3b1df2426fbdac3d0aaa0503ee94:221111' => 'Apple QuickTime, Quality 750 (73%)', + 'bb0180b9eda074c3f913c8ada3d4c1ad:221111' => 'Apple QuickTime, Quality 751 (73%)', + 'c5fcb1748f616ac97794d34b1b93616e:221111' => 'Apple QuickTime, Quality 752-753 (73-74%)', + '0da77ccec22a9cff9a049a47e86d3502:221111' => 'Apple QuickTime, Quality 754 (74%)', + 'c31f71de437dc301d34f847d95267d9e:221111' => 'Apple QuickTime, Quality 755 (74%)', + '01137dc7ef90f0aee15362c221f7b1d3:221111' => 'Apple QuickTime, Quality 756-758 (74%)', + '026780f2172c289bc1ff73a34c6aee57:221111' => 'Apple QuickTime, Quality 759-760 (74%)', + '3fab8f2b141f95a989fc4b046ad825cb:221111' => 'Apple QuickTime, Quality 761 (74%)', + 'cd091eeb9d27d9dc7cdb5bff73572679:221111' => 'Apple QuickTime, Quality 762 (74%)', + 'ad2221ee8bb94a3558ed16766efaec4f:221111' => 'Apple QuickTime, Quality 763 (75%)', + '8a4ff70dce3efc9312ff7239e79b6bc9:221111' => 'Apple QuickTime, Quality 764 (75%)', + 'b8d1fcda3a19d00788c2be73fd4c2c8e:221111' => 'Apple QuickTime, Quality 765-766 (75%)', + '3af16b87c33bb2e48152e249beb9147b:221111' => 'Apple QuickTime, Quality 767 (75%)', + '3af16b87c33bb2e48152e249beb9147b:211111' => 'Apple QuickTime, Quality 768 (75%)', + '683270dbffdc5cd2d4e6cb841f17b206:211111' => 'Apple QuickTime, Quality 769 (75%)', + '285bdd58fac87b174a22d2a93d69cd7c:211111' => 'Apple QuickTime, Quality 770 (75%)', + '312e047b5d9076cd1e126f3dbce928e5:211111' => 'Apple QuickTime, Quality 771 (75%)', + '99458d7a01a39fe126592d9afb1402ce:211111' => 'Apple QuickTime, Quality 772 (75%)', + 'b4633256b0e0d5e2a5021f01ebabc105:211111' => 'Apple QuickTime, Quality 773 (75%)', + '90d39fd222f9114f613a315a894283ca:211111' => 'Apple QuickTime, Quality 774 (76%)', + '61b1d4a02498b7467f2c8e8cfebdfae9:211111' => 'Apple QuickTime, Quality 775-776 (76%)', + '987ebcbd20b633b40241fcd30266e986:211111' => 'Apple QuickTime, Quality 777 (76%)', + '31e214243395b008048469d4bc4dc780:211111' => 'Apple QuickTime, Quality 778 (76%)', + 'db5b3a078a942131b5d86bc189baac24:211111' => 'Apple QuickTime, Quality 779 (76%)', + 'ec440a2ffcbce8895beb663b36975073:211111' => 'Apple QuickTime, Quality 780-781 (76%)', + '93d7ac97a931be74c7fe849edc482ea1:211111' => 'Apple QuickTime, Quality 782 (76%)', + '3974d72e6831171ec970bbb09b9cc506:211111' => 'Apple QuickTime, Quality 783 (76%)', + '07bd22218437079a86ce0b93ffa9cc90:211111' => 'Apple QuickTime, Quality 784 (77%)', + '32757023bb5e7f703acf737a5a29c9d6:211111' => 'Apple QuickTime, Quality 785-786 (77%)', + '6096eb584b99a587f5527e20473aa9d1:211111' => 'Apple QuickTime, Quality 787 (77%)', + 'c6d134475eb85bd454f2ee5153366c51:211111' => 'Apple QuickTime, Quality 788 (77%)', + 'a3ba20f325ff36f874d633919185f92d:211111' => 'Apple QuickTime, Quality 789 (77%)', + 'af10133169e143a2b3634c48dede9440:211111' => 'Apple QuickTime, Quality 790 (77%)', + '9dbb8223620e7f25ca3292849f7aa025:211111' => 'Apple QuickTime, Quality 791-792 (77%)', + '5071640a38c5898dd5d2043346fd23e1:211111' => 'Apple QuickTime, Quality 793-795 (77-78%)', + '60a0ca27f3e7289d97c033ca217899cc:211111' => 'Apple QuickTime, Quality 796-798 (78%)', + 'f7a5ea485a254cba0d39cdeaf89ad344:211111' => 'Apple QuickTime, Quality 799 (78%)', + 'd8cd0ca367d9afaf9a1aca0415da5361:211111' => 'Apple QuickTime, Quality 800 (78%)', + '87fb3c7402ba4edcda34b71696d2b0e3:211111' => 'Apple QuickTime, Quality 801 (78%)', + 'f8df76525f7f97d2e89173989e6786af:211111' => 'Apple QuickTime, Quality 802-804 (78-79%)', + '64677161baed1c47d2fdd6eefd779583:211111' => 'Apple QuickTime, Quality 805 (79%)', + 'ca39dde8e9b4ccd6261b28e089181639:211111' => 'Apple QuickTime, Quality 806-807 (79%)', + 'e6c99d520b86fd6f5eb513d1a084324e:211111' => 'Apple QuickTime, Quality 808 (79%)', + '9e048c787b12b9ab47d6166e81bc8bda:211111' => 'Apple QuickTime, Quality 809 (79%)', + '03c035b39889356e0b10805d8549a1f7:211111' => 'Apple QuickTime, Quality 810 (79%)', + '15de51ede231cfbe123daa42a1a46070:211111' => 'Apple QuickTime, Quality 811-813 (79%)', + '725bcc59a6f5a1436dfa0dfd96cdcf44:211111' => 'Apple QuickTime, Quality 814 (79%)', + 'd00103d50108e8be370a78d47f51aba0:211111' => 'Apple QuickTime, Quality 815 (80%)', + '1c4c74ccc581b11050cfe18792246e5e:211111' => 'Apple QuickTime, Quality 816 (80%)', + 'b63e97c56859f2476ed3f15f40775fb5:211111' => 'Apple QuickTime, Quality 817 (80%)', + 'aac2510e3cd617eb2cd60e7dc6f5d252:211111' => 'Apple QuickTime, Quality 818 (80%)', + '028caa124d0837dd9b1a64028e4f2965:211111' => 'Apple QuickTime, Quality 819 (80%)', + '0440231d1a4a1187bffaa5b5576827f9:211111' => 'Apple QuickTime, Quality 820 (80%)', + '6f879b2b5642ee3d01faf3410a721e2d:211111' => 'Apple QuickTime, Quality 821 (80%)', + '4642245b427d5dd5c1c3766c323204ac:211111' => 'Apple QuickTime, Quality 822-824 (80%)', + '8bd486eb557ae8f39948775aba222731:211111' => 'Apple QuickTime, Quality 825 (81%)', + '8bc4e4bec8e9b193c11ad90c7f8bfaf3:211111' => 'Apple QuickTime, Quality 826 (81%)', + 'f54c2ea8437408238f6c181a355af6cb:211111' => 'Apple QuickTime, Quality 827-829 (81%)', + '0f58458f2b9959dbc57b4868200c0432:211111' => 'Apple QuickTime, Quality 830-832 (81%)', + '24f95056dce30d11bad39b33ab271262:211111' => 'Apple QuickTime, Quality 833-834 (81%)', + 'bad6fdd8761fb9d0921384013acf783f:211111' => 'Apple QuickTime, Quality 835 (82%)', + '8c482fe6aef2a59a94cb779e6795e512:211111' => 'Apple QuickTime, Quality 836 (82%)', + '50b309f18bcf477742aa491ea55af777:211111' => 'Apple QuickTime, Quality 837 (82%)', + '92a9e0d027a1b2e5f7e49f7ffd96277e:211111' => 'Apple QuickTime, Quality 838-839 (82%)', + 'a6df2748a4972d4323f0386820ce35a4:211111' => 'Apple QuickTime, Quality 840 (82%)', + '9ffb80389e2eed2301e6b07860c2fbd7:211111' => 'Apple QuickTime, Quality 841 (82%)', + '6042038094d7f4ad72c61c2a2e7a467f:211111' => 'Apple QuickTime, Quality 842 (82%)', + '78d004490e822405acded09846135e50:211111' => 'Apple QuickTime, Quality 843 (82%)', + 'a589d880de576ed888c57814ccea47a0:211111' => 'Apple QuickTime, Quality 844 (82%)', + 'beee113eea5950b8211cdc49e5a04099:211111' => 'Apple QuickTime, Quality 845 (83%)', + 'f04fed79cdc47709d649187cfcc7e342:211111' => 'Apple QuickTime, Quality 846-849 (83%)', + 'edb0be7fcce943c28d02ff78ae600afb:211111' => 'Apple QuickTime, Quality 850 (83%)', + '0e9648c1f28b99a377dcf7deec6450e6:211111' => 'Apple QuickTime, Quality 851-852 (83%)', + '2dffe433bbb9c81b05e569afd3d9b585:211111' => 'Apple QuickTime, Quality 853 (83%)', + '0ef4f8fa922f87f1be646fccaa0ef42e:211111' => 'Apple QuickTime, Quality 854 (83%)', + '4b799df6fc9476102f890343080e66f5:211111' => 'Apple QuickTime, Quality 855-856 (83-84%)', + '53a66cb32deb83c855f36b26527f4c10:211111' => 'Apple QuickTime, Quality 857 (84%)', + '151d7cd5a95929d45c6790beb87705fe:211111' => 'Apple QuickTime, Quality 858 (84%)', + 'bc2afe0a9c7c68b8d84bd231209be3e2:211111' => 'Apple QuickTime, Quality 859-860 (84%)', + 'b9d66564ab9c4bb0910eb228aa9a48e1:211111' => 'Apple QuickTime, Quality 861-863 (84%)', + '6808ca55a29fcb9c15db1925a84370c3:211111' => 'Apple QuickTime, Quality 864 (84%)', + 'ee5b4ed7f04821d1e3a509d7565cb10d:211111' => 'Apple QuickTime, Quality 865 (84%)', + 'd38be79f7c8c6c27a3268275b144add6:211111' => 'Apple QuickTime, Quality 866 (85%)', + '59eedef87f255db058b5ba0b1d3a4ce8:211111' => 'Apple QuickTime, Quality 867 (85%)', + '5e5530c45def7006a7f672ce5778513d:211111' => 'Apple QuickTime, Quality 868 (85%)', + 'b09abfa40fc6607dc26d8b5df48c72fc:211111' => 'Apple QuickTime, Quality 869 (85%)', + 'cfc78404529f2b81b16d3f25fc96e8f4:211111' => 'Apple QuickTime, Quality 870 (85%)', + '14c62682032efe8dc2de80c9330c6206:211111' => 'Apple QuickTime, Quality 871-872 (85%)', + 'ffadac945c3420537e21e67ab3a843d6:211111' => 'Apple QuickTime, Quality 873-875 (85%)', + 'e67a8a7e92a9f03413e9a67b99624b8b:211111' => 'Apple QuickTime, Quality 876-877 (86%)', + 'ba4af3bb30dda0a7be4c04ff1ebbd9ef:211111' => 'Apple QuickTime, Quality 878-880 (86%)', + '3eedb8a357141ff5ae765fd3be2b232f:211111' => 'Apple QuickTime, Quality 881-886 (86-87%)', + '127b0599fc6804909a33832be7a9dd36:211111' => 'Apple QuickTime, Quality 887 (87%)', + 'b697448eec21ef07f3111b62d592c423:211111' => 'Apple QuickTime, Quality 888-890 (87%)', + 'a08a6b6535f292518b5ff6d0d05ae187:211111' => 'Apple QuickTime, Quality 891-893 (87%)', + 'a439b365c2d0cf1fbaad2e42d331d759:211111' => 'Apple QuickTime, Quality 894 (87%)', + 'bf0c20b20af6473b7c4a338ba57d1a96:211111' => 'Apple QuickTime, Quality 895 (87%)', + '09cf94311753aa9796ffd720749c51f7:211111' => 'Apple QuickTime, Quality 896 (88%)', + 'a60bbd6538af00192c411020d7494a1d:211111' => 'Apple QuickTime, Quality 897-898 (88%)', + 'df8ea903695e76e4b1466bdd3a3480c7:211111' => 'Apple QuickTime, Quality 899 (88%)', + 'eb4eb617beaa4f23acf41167742806fc:211111' => 'Apple QuickTime, Quality 900-901 (88%)', + '591c923a44c635c33769704c9cfa6ab7:211111' => 'Apple QuickTime, Quality 902 (88%)', + '960caf85ef273541ac2e76c9554dc860:211111' => 'Apple QuickTime, Quality 903 (88%)', + '22c77ec6f4e8f75d48f98473abe62e59:211111' => 'Apple QuickTime, Quality 904-905 (88%)', + 'fc8d384969030e7bc0255d34a7a5c0b0:211111' => 'Apple QuickTime, Quality 906 (88%)', + '42e7323506b113685e82e6d42664626f:211111' => 'Apple QuickTime, Quality 907-908 (89%)', + '7163b345b90553e246296a48b46cc0b3:211111' => 'Apple QuickTime, Quality 909-910 (89%)', + '52f25cf8c4d610dffcc45681def8fb49:211111' => 'Apple QuickTime, Quality 911-914 (89%)', + '5554cfd817a2713a690b957145b088ed:211111' => 'Apple QuickTime, Quality 915-917 (89-90%)', + '6ef0b71a5676c4645a3166b9c34744fa:211111' => 'Apple QuickTime, Quality 918-920 (90%)', + '1228da2b97793a88a41542ddcfca7ad2:211111' => 'Apple QuickTime, Quality 921-922 (90%)', + '9060906039e9ff37171ba48d908f6ad5:211111' => 'Apple QuickTime, Quality 923-924 (90%)', + '6eb301fb89e7d625129b77a53fe30dcc:211111' => 'Apple QuickTime, Quality 925-926 (90%)', + 'ad5399708089baad5891319303ba92df:211111' => 'Apple QuickTime, Quality 927 (91%)', + 'afd16e145464c7c5a3cd703017b4ef7a:211111' => 'Apple QuickTime, Quality 928 (91%)', + '4271405c840705072a102d7e18b374d9:211111' => 'Apple QuickTime, Quality 929 (91%)', + '72a91837a63fa7444416bc00a05d988b:211111' => 'Apple QuickTime, Quality 930 (91%)', + '8fe3845bafb06ee4de1a6f75c2a42e9b:211111' => 'Apple QuickTime, Quality 931 (91%)', + '8d3b678651ec71f27e3727718123f354:211111' => 'Apple QuickTime, Quality 932-933 (91%)', + '36d42b031eea0c9f626f15533e72162a:211111' => 'Apple QuickTime, Quality 934-936 (91%)', + '789076781ff1e18154091f2460c1bab5:211111' => 'Apple QuickTime, Quality 937-938 (92%)', + '07464723ecfd8e5ed8fd6904e9d15a23:211111' => 'Apple QuickTime, Quality 939 (92%)', + '0efd0d9423b440cfc8efacf2e4dfcb7f:211111' => 'Apple QuickTime, Quality 940 (92%)', + '80409b38f84336548b62e337a850e9cb:211111' => 'Apple QuickTime, Quality 941-943 (92%)', + '5fa6bb26309d43ca6c89d6cc776a68a4:211111' => 'Apple QuickTime, Quality 944-946 (92%)', + '705064f644ac4b24884500a40ad0f7cf:211111' => 'Apple QuickTime, Quality 947-948 (92-93%)', + 'c181c79bc41cf5fe11e6f253242ce2c4:211111' => 'Apple QuickTime, Quality 949-951 (93%)', + '1a7da03994ee019a30dbd37117761467:211111' => 'Apple QuickTime, Quality 952-954 (93%)', + '070620a25578b4a38ed0c09d6d512de8:211111' => 'Apple QuickTime, Quality 955 (93%)', + '6a092d8fd56ca0e852d74bd86cfc4f47:211111' => 'Apple QuickTime, Quality 956-957 (93%)', + '66e85870faf72f4f3fe25486409b286a:211111' => 'Apple QuickTime, Quality 958 (94%)', + '31365833a4d7d0ef2c1db9b90e515f7f:211111' => 'Apple QuickTime, Quality 959-961 (94%)', + '2edccd94198ab5a459a8396d9a0be4aa:211111' => 'Apple QuickTime, Quality 962 (94%)', + 'ca0bf66c467278f9d5ca5301840e7a7f:211111' => 'Apple QuickTime, Quality 963-967 (94%)', + '261bdba7fe6d8bca5302e4e93b52c1fb:211111' => 'Apple QuickTime, Quality 968-970 (95%)', + '762f9501e83d58307d1e102ddb343207:211111' => 'Apple QuickTime, Quality 971 (95%)', + 'ba18a8f4175bdedfea7af9bf5fe8dd9c:211111' => 'Apple QuickTime, Quality 972-973 (95%)', + 'd1a8052e7152e0c35d167e9e56418eb7:211111' => 'Apple QuickTime, Quality 974 (95%)', + '32682ece28c3bee7754fde6fec109b47:211111' => 'Apple QuickTime, Quality 975-977 (95%)', + 'a8780d0f85eef638c6a448e57b157378:211111' => 'Apple QuickTime, Quality 978-979 (96%)', + 'b79ff1a16807a48a31d457ad7e0b94f2:211111' => 'Apple QuickTime, Quality 980-984 (96%)', + '2bf80ea6a878f7ecb88ea827b58c98f8:211111' => 'Apple QuickTime, Quality 985-987 (96%)', + 'add779ad00786bd2ccb9dcc226386b1a:211111' => 'Apple QuickTime, Quality 988-991 (96-97%)', + '56c4efb597cc30275229486199e60f70:211111' => 'Apple QuickTime, Quality 992-993 (97%)', + 'c2df556e8ede9fb199b9a16e01279c6b:211111' => 'Apple QuickTime, Quality 994-996 (97%)', + '6af868a0eececd267495f749a38b4f95:211111' => 'Apple QuickTime, Quality 997-998 (97%)', + 'c92c755320e7ce8f46f644b90b7907e8:211111' => 'Apple QuickTime, Quality 999-1000 (98%)', + '6fcbaaa11108d1712bad5410b3db5b91:211111' => 'Apple QuickTime, Quality 1001-1002 (98%)', + 'f7d803e16f0c66df7d46747715b1ae24:211111' => 'Apple QuickTime, Quality 1003 (98%)', + '7f51ebf21174bcd3b027ae3cc77c4459:211111' => 'Apple QuickTime, Quality 1004 (98%)', + 'f2423a8ae68a49cc6191a2ec80367893:211111' => 'Apple QuickTime, Quality 1005-1006 (98%)', + 'f97cd4c7b1125556dc3eb57fc494e6b5:211111' => 'Apple QuickTime, Quality 1007-1009 (98-99%)', + '389e1ca056b1bd05dd29ecaecae5b4ae:211111' => 'Apple QuickTime, Quality 1010-1013 (99%)', + '43f9929d00af93968662983b891364d8:211111' => 'Apple QuickTime, Quality 1014-1016 (99%)', + '7e1453eec55a8c40166b2d8985ad6bdc:211111' => 'Apple QuickTime, Quality 1017 (99%)', + '31697e4b294a13e35ab8d55d3a9612ca:211111' => 'Apple QuickTime, Quality 1018-1020 (99-100%)', + 'ec76274ff22c07e53299ad34633ba88f:211111' => 'Apple QuickTime, Quality 1021-1023 (100%)', + '7f8b33a26e7f35a6eaf2e95df81e1cca:111111' => 'Apple QuickTime, Quality 1024 (Lossless)', + + # Apple QuickTime (Grayscale) + # + # Tested with: + # - QuickTime 7.5.0 (Win) + '7e6246d9be5273b979beb680b284e7b8:11' => 'Apple QuickTime, Quality 0-63 (0-6%)', + 'caf33ddc94762bf60a8c5e5024550b21:11' => 'Apple QuickTime, Quality 64-80 (6-8%)', + '042ae0dbef2b1e91c4eb36e66a39b5b9:11' => 'Apple QuickTime, Quality 81-92 (8-9%)', + 'bdcc7abca09941326c079bb3bc30de4d:11' => 'Apple QuickTime, Quality 93-101 (9-10%)', + '8edf0677ca6be750511593fad835bbb5:11' => 'Apple QuickTime, Quality 102-109 (10-11%)', + 'dd54b4e3d8801f3a7969be542d165c6b:11' => 'Apple QuickTime, Quality 110-116 (11%)', + 'c00374dece11c3cab5f2c3bf9621d365:11' => 'Apple QuickTime, Quality 117-122 (11-12%)', + 'a2e3baa02454492ef811619ac18c65da:11' => 'Apple QuickTime, Quality 123-127 (12%)', + '8f699e4439175f5f0cf0f903040fb3c5:11' => 'Apple QuickTime, Quality 128-133 (13%)', + '50f9224c87a32486851bdbd3e686fd5b:11' => 'Apple QuickTime, Quality 134-137 (13%)', + 'cccd5f36920fbe8ad77da2214f8ab6ed:11' => 'Apple QuickTime, Quality 138-142 (13-14%)', + '8bc7e3b8f24507e284075ebeb272c3f4:11' => 'Apple QuickTime, Quality 143-146 (14%)', + 'bc156b933365b88e5ba9f1bd4b2fee4e:11' => 'Apple QuickTime, Quality 147-150 (14-15%)', + 'a50ff29c6c2a7e73f742ca94678956ba:11' => 'Apple QuickTime, Quality 151-154 (15%)', + 'd0a67359275cf9e2e8f35de79d2e28ae:11' => 'Apple QuickTime, Quality 155-157 (15%)', + '37914b5d31e7f0f13066e5292c07c305:11' => 'Apple QuickTime, Quality 158-161 (15-16%)', + '340aeb15b2b6c05968bb2c6e3d85cbed:11' => 'Apple QuickTime, Quality 162-164 (16%)', + 'bc93228921ec863e90850325cfd90dd2:11' => 'Apple QuickTime, Quality 165-167 (16%)', + 'd5c95455812515ad4855ed725d5bf2d9:11' => 'Apple QuickTime, Quality 168-170 (16-17%)', + 'd018c811df2390446b43cc702888864c:11' => 'Apple QuickTime, Quality 171-173 (17%)', + '824a9788f50aad6ca26ada301cae5c72:11' => 'Apple QuickTime, Quality 174-176 (17%)', + 'd35254d58224b1b6babda94d7f1a5ffe:11' => 'Apple QuickTime, Quality 177-179 (17%)', + '4177be1c82543b32bf6578dc3a78d49d:11' => 'Apple QuickTime, Quality 180-182 (18%)', + '88b94edfd7a6c7aadac520905e6cfa0a:11' => 'Apple QuickTime, Quality 183-184 (18%)', + '589b1ef8cc8bece150218e4646d9dfd6:11' => 'Apple QuickTime, Quality 185-187 (18%)', + 'a6c15a75ab70e28c78e6084f909523bf:11' => 'Apple QuickTime, Quality 188-189 (18%)', + 'd052e48078f986c715e68f502d371ccc:11' => 'Apple QuickTime, Quality 190-191 (19%)', + '7d4205e3d4e0b6c7071a418c9b5840cb:11' => 'Apple QuickTime, Quality 192-194 (19%)', + '2200d1873e51bf812bdcb57c10c6c14b:11' => 'Apple QuickTime, Quality 195-196 (19%)', + '395ef59782311cd2081887c78c40c4bc:11' => 'Apple QuickTime, Quality 197-198 (19%)', + 'd33d12dc779097bee959fefac6de9a3e:11' => 'Apple QuickTime, Quality 199-201 (19-20%)', + '64ff54dc33f610e3705cae31428ce43d:11' => 'Apple QuickTime, Quality 202-203 (20%)', + 'dbee605b07dfe30c992622877dffb049:11' => 'Apple QuickTime, Quality 204-205 (20%)', + 'aa5a427657696f05da789e1516b8c2ff:11' => 'Apple QuickTime, Quality 206-207 (20%)', + 'cf8fce0d4bde00a2feb680bb52667c8f:11' => 'Apple QuickTime, Quality 208-209 (20%)', + '81ac42cc63416f7c66cd2a51a8801cbd:11' => 'Apple QuickTime, Quality 210-211 (21%)', + '5e55cc3328e61e88b9f2a49af4ec2268:11' => 'Apple QuickTime, Quality 212-213 (21%)', + 'ef938a0533502fe19f311d46c43fa86c:11' => 'Apple QuickTime, Quality 214-215 (21%)', + 'f841cbd6a77d64924ab19845219f3399:11' => 'Apple QuickTime, Quality 216-217 (21%)', + '98b684f30055c84ba5734e29f7b98b5f:11' => 'Apple QuickTime, Quality 218 (21%)', + '8d4f697b3a2baaecc8765f31f54a76ae:11' => 'Apple QuickTime, Quality 219-220 (21%)', + '6fc283989bb3a8c91f6c4384df2fa25d:11' => 'Apple QuickTime, Quality 221-222 (22%)', + 'dccca51d261b315120f069697872377d:11' => 'Apple QuickTime, Quality 223-224 (22%)', + '5869e4a9592a7900e740b09fe19261a1:11' => 'Apple QuickTime, Quality 225 (22%)', + 'ebd575cf069eb906d2f2b2e202f67247:11' => 'Apple QuickTime, Quality 226-227 (22%)', + '7ed52852c280b97fd44def8434d84051:11' => 'Apple QuickTime, Quality 228-229 (22%)', + '984d291debac8a0caeaccccea5fbfbdf:11' => 'Apple QuickTime, Quality 230 (22%)', + '9b2247e0f55b4485e7c55a04ee6a801c:11' => 'Apple QuickTime, Quality 231-232 (23%)', + 'd2a1887cf45aecd63d838e585dbb5794:11' => 'Apple QuickTime, Quality 233-234 (23%)', + '6bb5ab15f80beebcb73fae0ef089fa61:11' => 'Apple QuickTime, Quality 235 (23%)', + '281f65a19e5de33d9ff5f3afeda06973:11' => 'Apple QuickTime, Quality 236-237 (23%)', + '563f732877b2c654d571c269bbb36a40:11' => 'Apple QuickTime, Quality 238 (23%)', + 'fa11118bb9f90b1464e34c785d0da357:11' => 'Apple QuickTime, Quality 239-240 (23%)', + '8dc4cff27c3c5196b4bc8905ef32f119:11' => 'Apple QuickTime, Quality 241 (24%)', + '2ac28889e4ad4724d49f8b4c36b0cece:11' => 'Apple QuickTime, Quality 242-243 (24%)', + '5cbeb8f83a47b6a5e8711fe0ea7c42d7:11' => 'Apple QuickTime, Quality 244 (24%)', + 'd5d329f5687d154e4ceeb48697b848ba:11' => 'Apple QuickTime, Quality 245-246 (24%)', + 'd3eaad34ae4fc8a3ac6330c1c9dceb28:11' => 'Apple QuickTime, Quality 247 (24%)', + '29b74834ce7570b9c175d0200e75316e:11' => 'Apple QuickTime, Quality 248-249 (24%)', + '850f2b2aaa99ad390bc9443be1b587dc:11' => 'Apple QuickTime, Quality 250 (24%)', + '036d2395718f99bf916486e1af42cb92:11' => 'Apple QuickTime, Quality 251 (25%)', + 'e9275719ef4cb335f9dfed63c3737f0e:11' => 'Apple QuickTime, Quality 252-253 (25%)', + 'dfcbd3df5c6b96106e6348b77f89c56a:11' => 'Apple QuickTime, Quality 254 (25%)', + 'f9ef906cd67c9f9b62514a6ac1f8bd3f:11' => 'Apple QuickTime, Quality 255 (25%)', + '469d14cef27dbb7c1f6f49324c077852:11' => 'Apple QuickTime, Quality 256-257 (25%)', + '65d7471a913f6cc87e9dc65ea594606b:11' => 'Apple QuickTime, Quality 258 (25%)', + '6b590185b5d6ecbc1d79c2624a0d5319:11' => 'Apple QuickTime, Quality 259 (25%)', + 'fbf3d8d87f68077aa95e5e40047c1607:11' => 'Apple QuickTime, Quality 260-261 (25%)', + '7e3999424de8a8f6bb84e3cfc07628e8:11' => 'Apple QuickTime, Quality 262 (26%)', + '6c0476ba4b3fcc4675cfab20d3c96368:11' => 'Apple QuickTime, Quality 263 (26%)', + '0bb76dd0e08175a90343a9c7dab48bfa:11' => 'Apple QuickTime, Quality 264-265 (26%)', + '83c8ceab43dedde06d8068e5b8ccdc2b:11' => 'Apple QuickTime, Quality 266 (26%)', + '5aee693372b77c9721dba9d3596e371c:11' => 'Apple QuickTime, Quality 267 (26%)', + '1312bc5c7456856400f43749d407fb9f:11' => 'Apple QuickTime, Quality 268 (26%)', + '3f01645e33791ef09fbeb6c0e63db6a9:11' => 'Apple QuickTime, Quality 269 (26%)', + '785c36a6aa2bedd207cb1fa450a5e6d4:11' => 'Apple QuickTime, Quality 270-271 (26%)', + '84788c494352a07ab54f360f4a2a3d34:11' => 'Apple QuickTime, Quality 272 (27%)', + 'bf29abfdf0086437452e2ca220e69cae:11' => 'Apple QuickTime, Quality 273 (27%)', + 'c7da2e951711b8b1314a7c531e09cbdc:11' => 'Apple QuickTime, Quality 274 (27%)', + 'fb549f21b7ad3b556bc91165b3067a77:11' => 'Apple QuickTime, Quality 275 (27%)', + '0a7497e67acef345c655f79fd00b26de:11' => 'Apple QuickTime, Quality 276 (27%)', + '1e2be0dde2c5d2216bca879a3f89c565:11' => 'Apple QuickTime, Quality 277-278 (27%)', + 'd09f78b68290ff6b470720ead4d79b15:11' => 'Apple QuickTime, Quality 279 (27%)', + '5b54396a8a725e49e9bd4c9883b151df:11' => 'Apple QuickTime, Quality 280 (27%)', + 'f60d4afe566a641f0187a42ca6462560:11' => 'Apple QuickTime, Quality 281 (27%)', + 'b69090d1ab951e6355ab193b1f20bf48:11' => 'Apple QuickTime, Quality 282 (28%)', + '7ce7d00283cada911c3ebc347680bc7d:11' => 'Apple QuickTime, Quality 283 (28%)', + '2502314c1b957a0e4f911d17db770a01:11' => 'Apple QuickTime, Quality 284 (28%)', + '100f3392aa8292fb78548513a619671a:11' => 'Apple QuickTime, Quality 285 (28%)', + 'af683de3118ab595c41b5796b57a9540:11' => 'Apple QuickTime, Quality 286 (28%)', + '1228f1572d76b53658f4042bda8e99a2:11' => 'Apple QuickTime, Quality 287 (28%)', + 'e9c647b8bf2d7535d259eed6fbabe206:11' => 'Apple QuickTime, Quality 288 (28%)', + '9ab0afefad0e6bb7c3c1a8bca0c3f987:11' => 'Apple QuickTime, Quality 289 (28%)', + 'b6900aafebce0e59136abb701eacb1e5:11' => 'Apple QuickTime, Quality 290 (28%)', + 'a3c40b635e584c8f49d6b6b110846fee:11' => 'Apple QuickTime, Quality 291-292 (28-29%)', + '80175a9dbb871d045c738fdeb6fcbdc7:11' => 'Apple QuickTime, Quality 293 (29%)', + 'c79231716eff96853fe03a26c1c38120:11' => 'Apple QuickTime, Quality 294 (29%)', + '8f96a0f2af7f1f1b0b2d4895bced1326:11' => 'Apple QuickTime, Quality 295 (29%)', + 'ba3c103d00719e795b093ac7a75e6fac:11' => 'Apple QuickTime, Quality 296 (29%)', + '42fd2864197991a38b3f80374a69d4e9:11' => 'Apple QuickTime, Quality 297 (29%)', + '76bc1d777c94b680683610218732eb11:11' => 'Apple QuickTime, Quality 298 (29%)', + '8b9e19fe69d7c7e1989018aca76c0aea:11' => 'Apple QuickTime, Quality 299 (29%)', + 'd3c0e7437c630f3bed0867737c5f1921:11' => 'Apple QuickTime, Quality 300 (29%)', + 'a8ecf55a88fd0e1b29646207aff8c36f:11' => 'Apple QuickTime, Quality 301 (29%)', + 'eaffe0714878be5fb67a914f5bb79fef:11' => 'Apple QuickTime, Quality 302 (29%)', + 'a6a49ea0300157ecb401ce45d7f1f850:11' => 'Apple QuickTime, Quality 303 (30%)', + 'fc28ca358af7cd55dc78853e4288f26d:11' => 'Apple QuickTime, Quality 304 (30%)', + '61cb5e93e3e69f6929d97653824733b0:11' => 'Apple QuickTime, Quality 305 (30%)', + '2cba6ba1aede8c791ada1acaba8c162e:11' => 'Apple QuickTime, Quality 306 (30%)', + 'c1bcc3db9f417dc52595f2bb224e30d7:11' => 'Apple QuickTime, Quality 307 (30%)', + '2273274a8d695da4bebff145cbcbafcc:11' => 'Apple QuickTime, Quality 308 (30%)', + 'e8bdbff8c7908e36c51e1344c0e99746:11' => 'Apple QuickTime, Quality 309 (30%)', + 'ffb8ea8efdb22c5c8256cc4e4008f11c:11' => 'Apple QuickTime, Quality 310 (30%)', + 'a1a8f92dc00c42877eb9a1d7462f8408:11' => 'Apple QuickTime, Quality 311 (30%)', + '723c2a2de195391f2db06456e9345c5b:11' => 'Apple QuickTime, Quality 312 (30%)', + '916225049ab8d411a5e0138ea9087e37:11' => 'Apple QuickTime, Quality 313 (31%)', + '3b0315316de45b649bd8ba5b5471ab81:11' => 'Apple QuickTime, Quality 314 (31%)', + '6cf948e65c9d32279c757394a4f5b77e:11' => 'Apple QuickTime, Quality 315 (31%)', + '4c4b7fc28e54a2bbdccd90d3618f01e8:11' => 'Apple QuickTime, Quality 316 (31%)', + '767c20d7d54970b0974f205c790d7d04:11' => 'Apple QuickTime, Quality 317 (31%)', + '81c1ce1c7d15394d95eaf2d6bd1495e3:11' => 'Apple QuickTime, Quality 318 (31%)', + '6547daee398d39f773742be92ef2d0d0:11' => 'Apple QuickTime, Quality 319 (31%)', + '65edf81f975f01a7b3ad1c16a1af64cb:11' => 'Apple QuickTime, Quality 320 (31%)', + 'f8948967aeda9fb6ca1637a082ed04db:11' => 'Apple QuickTime, Quality 321 (31%)', + '2444e1c407a9965fb5ea2dafd269911f:11' => 'Apple QuickTime, Quality 322-324 (31-32%)', + '7c8242581553e818ef243fc680879a19:11' => 'Apple QuickTime, Quality 325 (32%)', + 'e2fe91d57078586f15b09e3b9c8cd3fa:11' => 'Apple QuickTime, Quality 326 (32%)', + '0740db8af7951c1363f2c8d75462d378:11' => 'Apple QuickTime, Quality 327 (32%)', + '3c1ff7ebab192163b4578e7dfcf63ce6:11' => 'Apple QuickTime, Quality 328 (32%)', + '705ae76b905302bd9f3b78cc8d1cb28f:11' => 'Apple QuickTime, Quality 329 (32%)', + '9438633929a283aac168f415d8ca44d6:11' => 'Apple QuickTime, Quality 330 (32%)', + '68799ccfa08e2f55b5be79264d3ca58a:11' => 'Apple QuickTime, Quality 331 (32%)', + '9bda57f21c56ea0dc971164b8dc56394:11' => 'Apple QuickTime, Quality 332 (32%)', + 'f9988c61ae580fcfc8bf929134b07c2e:11' => 'Apple QuickTime, Quality 333 (33%)', + '59faa8c6fb70d4cf42765a92c1c7afc1:11' => 'Apple QuickTime, Quality 334 (33%)', + '277982593a55786fe424c80a17224cd7:11' => 'Apple QuickTime, Quality 335 (33%)', + 'c2a8a67d050b22a0673ee9ad6685a540:11' => 'Apple QuickTime, Quality 336 (33%)', + '040e09f495355470a44c580bca654693:11' => 'Apple QuickTime, Quality 337 (33%)', + '93173762094b6b506aa495e022ced65f:11' => 'Apple QuickTime, Quality 338 (33%)', + '281c39340554f672ff62c65e0bf1036b:11' => 'Apple QuickTime, Quality 339 (33%)', + '82d40afcb23ac10dba01bbab101da176:11' => 'Apple QuickTime, Quality 340 (33%)', + 'f56a4679494e5af4692381caa63b9062:11' => 'Apple QuickTime, Quality 341 (33%)', + '78787c9f0aae4ab8d15ab47eaea5035c:11' => 'Apple QuickTime, Quality 342 (33%)', + 'a1664b510ce4c6aa3588cdbc327a6f57:11' => 'Apple QuickTime, Quality 343 (33%)', + 'f6150beda200179d9744527637e52baa:11' => 'Apple QuickTime, Quality 344 (34%)', + '620244f053fef313466fbcb232077aca:11' => 'Apple QuickTime, Quality 345 (34%)', + '91c1b36d4411306ba3afaea0658f1ad8:11' => 'Apple QuickTime, Quality 346 (34%)', + '0381b4e34e700adecd618afdcfb5513e:11' => 'Apple QuickTime, Quality 347 (34%)', + '4d8f909ee8cb53e0386eb09c1591099b:11' => 'Apple QuickTime, Quality 348 (34%)', + 'f7425d5d0a0207e6dfaa0ee7c35d4ec6:11' => 'Apple QuickTime, Quality 349 (34%)', + '8d0663f8149a308365e18bdeb8c867e8:11' => 'Apple QuickTime, Quality 350 (34%)', + '4fa58542b5953534072b6dc1085deadf:11' => 'Apple QuickTime, Quality 351 (34%)', + '2358594d2a85b48dc0bd03e024dec9bd:11' => 'Apple QuickTime, Quality 352 (34%)', + 'b9594c8100236f288cdc01e6488cbc41:11' => 'Apple QuickTime, Quality 353 (34%)', + '3542444d51fa859ed5af78a1f5fc4f36:11' => 'Apple QuickTime, Quality 354 (35%)', + '7c95c94440f652232530fe4c411be1a2:11' => 'Apple QuickTime, Quality 355 (35%)', + '8361a9dbb5d93ad098a0ce2091b0bdf5:11' => 'Apple QuickTime, Quality 356 (35%)', + '44c8e4d0d7678034cb206609652ffeef:11' => 'Apple QuickTime, Quality 357 (35%)', + '4694896b11fb898106e30fd4ed50cded:11' => 'Apple QuickTime, Quality 358 (35%)', + '9ddc6134fe65ea64048fdfd27c82bed7:11' => 'Apple QuickTime, Quality 359 (35%)', + 'c60f75f7e09f0454db9cc48392a7eeed:11' => 'Apple QuickTime, Quality 360 (35%)', + '151731e5cd38be847f4dad794c023a69:11' => 'Apple QuickTime, Quality 361 (35%)', + '0468ecbf6fc1303467adfdcab8edfe6d:11' => 'Apple QuickTime, Quality 362 (35%)', + 'debd5adf671e3b907c10155cc910dcc1:11' => 'Apple QuickTime, Quality 363 (35%)', + '6385ee79b090ea430190dbe1ee93ddca:11' => 'Apple QuickTime, Quality 364 (36%)', + '67ed20f2fe283549dae4ba40860c3777:11' => 'Apple QuickTime, Quality 365 (36%)', + 'e168523157ee45551ba30378d597dfd6:11' => 'Apple QuickTime, Quality 366 (36%)', + 'd0cbe6c7372724a802d0183c6de66f8b:11' => 'Apple QuickTime, Quality 367 (36%)', + '38a1f9d86241eb3b96d5d42bc6587598:11' => 'Apple QuickTime, Quality 368 (36%)', + '4dc4b433113acbde9d77a4cbad69bb14:11' => 'Apple QuickTime, Quality 369 (36%)', + '186948d91ea43a64f874ebb9dee44564:11' => 'Apple QuickTime, Quality 370 (36%)', + '786aa4e46172ac65e10b230f3dcaadb2:11' => 'Apple QuickTime, Quality 371 (36%)', + 'ac76c6ebb64c843736fc765a03674d94:11' => 'Apple QuickTime, Quality 372 (36%)', + '38a60cdb8033a9f90027895eab0c40ba:11' => 'Apple QuickTime, Quality 373 (36%)', + 'ce48f7fb2ba9edee46c3f4839b40ef60:11' => 'Apple QuickTime, Quality 374 (37%)', + '7b3058792db9876a86c65ec44c0261b3:11' => 'Apple QuickTime, Quality 375 (37%)', + '5e983407295808e244f6bdece469c8be:11' => 'Apple QuickTime, Quality 376 (37%)', + '68ff8bfc0e15c93586ef6b4cf347469c:11' => 'Apple QuickTime, Quality 377 (37%)', + '9d4a8c44917390e56bca2352a8a4b1be:11' => 'Apple QuickTime, Quality 378 (37%)', + '36e7560256c5ffd285a1ca0f6d4bf97d:11' => 'Apple QuickTime, Quality 379 (37%)', + 'a88bad671d80cf6a70bd6e37be9c95c9:11' => 'Apple QuickTime, Quality 380 (37%)', + '23ab27876006666358e95d9c1104bcd0:11' => 'Apple QuickTime, Quality 381 (37%)', + 'b87750acf49940bf1f01f6a134a600b1:11' => 'Apple QuickTime, Quality 382 (37%)', + '731fa7404c090db157030e40804604b6:11' => 'Apple QuickTime, Quality 383 (37%)', + '442c2664c07af1ec15d86581f43aab0b:11' => 'Apple QuickTime, Quality 384 (38%)', + '145c52a48a9b2e954e785c3f8df5c27e:11' => 'Apple QuickTime, Quality 385 (38%)', + '55d37ee1e3c8d12a70e67206fa1c9b0c:11' => 'Apple QuickTime, Quality 386 (38%)', + '60880ff1f7bfe6a85cd80c2d4582395b:11' => 'Apple QuickTime, Quality 387 (38%)', + '85fc5daf51e6cbb04352016c817e5714:11' => 'Apple QuickTime, Quality 388 (38%)', + 'd7c835210eec5a8bedb3a18d32cbe066:11' => 'Apple QuickTime, Quality 389 (38%)', + '315e7fee22864b37b1b7670957f259fe:11' => 'Apple QuickTime, Quality 390 (38%)', + '46dd3917c1473ed0f8fc3f1e6f08416d:11' => 'Apple QuickTime, Quality 391 (38%)', + '1e93645e6163af46937c35a18b55c601:11' => 'Apple QuickTime, Quality 392 (38%)', + 'ba1a32697c0ae4e76a78f4b5624a8ce0:11' => 'Apple QuickTime, Quality 393 (38%)', + '68a0d6250be9df2c05556ff59988c499:11' => 'Apple QuickTime, Quality 394 (38%)', + '13b1310840627eddaf435e9feffebebe:11' => 'Apple QuickTime, Quality 395 (39%)', + '2e420a34dcf01dab91fd8509d4dbaab5:11' => 'Apple QuickTime, Quality 396 (39%)', + 'eef3afec34329517513541a8509b7aab:11' => 'Apple QuickTime, Quality 397 (39%)', + '80bdd75a2fc87b5288bc77763481df83:11' => 'Apple QuickTime, Quality 398 (39%)', + 'e230e3ac7c740f3e8fe6bc74fff72c10:11' => 'Apple QuickTime, Quality 399 (39%)', + '68b07a219cda4b9fc9a8507b788d8230:11' => 'Apple QuickTime, Quality 400 (39%)', + 'f1c23475d19d9e950dbc4086902365a3:11' => 'Apple QuickTime, Quality 401 (39%)', + 'dc2af4340202aa481491b86539888720:11' => 'Apple QuickTime, Quality 402 (39%)', + '495aeee0f43a596938c98c5364feb2ee:11' => 'Apple QuickTime, Quality 403 (39%)', + '8319dfe3caedea6988e5024b0196d317:11' => 'Apple QuickTime, Quality 404 (39%)', + 'd62cd17e8e04ebd568a8f5abc38cad4a:11' => 'Apple QuickTime, Quality 405 (40%)', + '047e1711c44262f352034452d0b0d07b:11' => 'Apple QuickTime, Quality 406 (40%)', + '552bf986ae119444955ded5f485d5dc4:11' => 'Apple QuickTime, Quality 407 (40%)', + 'd39329b38fdcabe9e1ae5f1b205c825a:11' => 'Apple QuickTime, Quality 408 (40%)', + 'bf2904a3e3870a2b4d060e0863530d92:11' => 'Apple QuickTime, Quality 409 (40%)', + '1acceb7ae4f9edbb835006d97ca30094:11' => 'Apple QuickTime, Quality 410 (40%)', + '5de50c687a6e885634bf16adfd75e6bc:11' => 'Apple QuickTime, Quality 411 (40%)', + 'd92c5bba7cfd1bfbb8c662c1a27ca413:11' => 'Apple QuickTime, Quality 412 (40%)', + 'cea44b5645cd1dbf469c8ae5600e4ff5:11' => 'Apple QuickTime, Quality 413 (40%)', + '5caf3989a757842c716220e4e426bde2:11' => 'Apple QuickTime, Quality 414 (40%)', + 'fd2f7a6518c12848a9ecdb1c3beb1fa8:11' => 'Apple QuickTime, Quality 415 (41%)', + 'de0547c872fed9c9c75c8fec2fe010e6:11' => 'Apple QuickTime, Quality 416 (41%)', + '6cf4dfbe3df89d9728e0f34b7b145223:11' => 'Apple QuickTime, Quality 417 (41%)', + 'd94d79b70686d3e2568d61d07e5819eb:11' => 'Apple QuickTime, Quality 418 (41%)', + '9ec82f50503769a9bb17e876594833b6:11' => 'Apple QuickTime, Quality 419 (41%)', + '4a39b0ae55f0eaa5672f00015cae2d40:11' => 'Apple QuickTime, Quality 420 (41%)', + '42bae7ef4a41562b2e98d74248f4f22e:11' => 'Apple QuickTime, Quality 421 (41%)', + '8c0ea132cfacf212c518ad297229be34:11' => 'Apple QuickTime, Quality 422 (41%)', + 'c1af7f1a3716bef087124306b068605c:11' => 'Apple QuickTime, Quality 423 (41%)', + 'd3ea3c519f92dd870fed03f63cabf05e:11' => 'Apple QuickTime, Quality 424 (41%)', + '0442196d850319833f27df632e92f064:11' => 'Apple QuickTime, Quality 425 (42%)', + '8c372e99fa96d2598e431f8137e47da6:11' => 'Apple QuickTime, Quality 426 (42%)', + '9bade640c3fcb807ed1322479f9e7f1c:11' => 'Apple QuickTime, Quality 427 (42%)', + '8015ad9fa22d6565ca61ce9979f3663f:11' => 'Apple QuickTime, Quality 428 (42%)', + '09a13f94022839a24065b82d5f4ffdbd:11' => 'Apple QuickTime, Quality 429 (42%)', + '0e570bc627acaee0962472a1a646816b:11' => 'Apple QuickTime, Quality 430 (42%)', + 'be7e7114f08e1775ca9676d2feeeccca:11' => 'Apple QuickTime, Quality 431 (42%)', + '44be972c54cd64be7524a133a7395401:11' => 'Apple QuickTime, Quality 432 (42%)', + 'b2f7b5e3007387aa22df74e82e916195:11' => 'Apple QuickTime, Quality 433 (42%)', + '5c13c8db3a0b590f4fa3ec462b8890c3:11' => 'Apple QuickTime, Quality 434 (42%)', + '2733a3cb2e0a2313b74d686437fa3ae2:11' => 'Apple QuickTime, Quality 435 (42%)', + '66309175abaa59d6246237a77ce9eb76:11' => 'Apple QuickTime, Quality 436 (43%)', + '6a2eb9f07f3c96365a06d91da171e673:11' => 'Apple QuickTime, Quality 437 (43%)', + 'e395118c42b6492dd4d9d30754f0a697:11' => 'Apple QuickTime, Quality 438 (43%)', + '7a75abc5c5ec8cc0fa43f239ab048c08:11' => 'Apple QuickTime, Quality 439 (43%)', + 'c558f3407dc549c902efad68c54920de:11' => 'Apple QuickTime, Quality 440 (43%)', + '49cd1849b501868260d8a3b1e96d8625:11' => 'Apple QuickTime, Quality 441 (43%)', + 'f7d70cfab7ff888c97078d277fa01307:11' => 'Apple QuickTime, Quality 442 (43%)', + 'f06ddea698cebe653bdd0c208c3d8c95:11' => 'Apple QuickTime, Quality 443 (43%)', + '73478bb7714d1d2342bbf22c5fdc04d6:11' => 'Apple QuickTime, Quality 444 (43%)', + '24406aee81b89ea50881ae71f878d0ec:11' => 'Apple QuickTime, Quality 445 (43%)', + 'e3e88302627b6743725cace74ddb17f9:11' => 'Apple QuickTime, Quality 446 (44%)', + '3fb9c046dff30dcb4128df984532d6ba:11' => 'Apple QuickTime, Quality 447 (44%)', + 'c9a4b04bc8e580608014b6f3111322d7:11' => 'Apple QuickTime, Quality 448 (44%)', + '7749ec06b1f1b1be30aa58dbef838d49:11' => 'Apple QuickTime, Quality 449 (44%)', + 'c0a54e87a2ef1c163311bcc1abf85214:11' => 'Apple QuickTime, Quality 450 (44%)', + 'f20a253d2513f4d8f2cfeea980852820:11' => 'Apple QuickTime, Quality 451 (44%)', + '6538fc6f5f1744b40c0b8b5bc7179983:11' => 'Apple QuickTime, Quality 452 (44%)', + '68a4a67af696f82bbbb7db15a16c0c46:11' => 'Apple QuickTime, Quality 453 (44%)', + 'e477932560b308940ac7439eed9f63da:11' => 'Apple QuickTime, Quality 454 (44%)', + 'fd732b0493e7ff16da4bde7faa88e22d:11' => 'Apple QuickTime, Quality 455 (44%)', + '61884dc8b93e63c07bb487a6e29d6fb7:11' => 'Apple QuickTime, Quality 456 (45%)', + '67515a725833d40535a54b4ef9551e05:11' => 'Apple QuickTime, Quality 457 (45%)', + 'cc6bb734b742b0631ab6562a329e1603:11' => 'Apple QuickTime, Quality 458 (45%)', + '1801686a97836f690ce3d5523ffcfa9a:11' => 'Apple QuickTime, Quality 459 (45%)', + 'f73f690cacd5d4e247f59964ad0f43b9:11' => 'Apple QuickTime, Quality 460 (45%)', + '853946ede6a624136546ec5b68ecdc49:11' => 'Apple QuickTime, Quality 461 (45%)', + 'f05c48d79edbefdb4d260dc23cf258e6:11' => 'Apple QuickTime, Quality 462 (45%)', + '8dc8361e94137f5466c8dd1f9aa06781:11' => 'Apple QuickTime, Quality 463 (45%)', + '6c121faf4784a5a93fbf7fff4470dea4:11' => 'Apple QuickTime, Quality 464-465 (45%)', + 'd0eaa368737f17f6037757d393a22599:11' => 'Apple QuickTime, Quality 466-467 (46%)', + '9c6f5faa1009cafe8bc3060fe18d4b60:11' => 'Apple QuickTime, Quality 468 (46%)', + 'ac47d493602dddace7844a9bc962e5ed:11' => 'Apple QuickTime, Quality 469 (46%)', + '24784b5651e1790242c01de522a6e05b:11' => 'Apple QuickTime, Quality 470 (46%)', + 'adbb56f1f0e0392392f9c7a38351a9ec:11' => 'Apple QuickTime, Quality 471 (46%)', + '6e0952a44c37bc2d98dbede4ec429c99:11' => 'Apple QuickTime, Quality 472 (46%)', + '20c7942ddec30475a182cb281f12bc03:11' => 'Apple QuickTime, Quality 473 (46%)', + '4080277d75b20871d00ebc01ffbdb848:11' => 'Apple QuickTime, Quality 474 (46%)', + '4f15f7e4c56e7a75c0fe5454ab7e8f72:11' => 'Apple QuickTime, Quality 475 (46%)', + 'ff82adb92189413246aee9a992eb2013:11' => 'Apple QuickTime, Quality 476 (46%)', + '16df79eb7c5f062aeebde385fbce1553:11' => 'Apple QuickTime, Quality 477 (47%)', + 'df02b0ea9dab7d291950b6cfc65c4bb1:11' => 'Apple QuickTime, Quality 478 (47%)', + '4ca8ec2a0c651e0508aab3b153cfee23:11' => 'Apple QuickTime, Quality 479 (47%)', + 'bbbae155e558e9d37686ec34bd065a53:11' => 'Apple QuickTime, Quality 480 (47%)', + '9bf86a5ec6e5382f214e07364a62b1b3:11' => 'Apple QuickTime, Quality 481 (47%)', + '41d873034f29b298d899b48cd321c93f:11' => 'Apple QuickTime, Quality 482 (47%)', + '52092035b4e3fd45de3298c4d641385a:11' => 'Apple QuickTime, Quality 483 (47%)', + '70e5babe9507bae6725e401a36903070:11' => 'Apple QuickTime, Quality 484 (47%)', + '3cfa966dde2536c83c921aa250b978b3:11' => 'Apple QuickTime, Quality 485 (47%)', + 'b0144b1d2671d145d29812ebcebd863d:11' => 'Apple QuickTime, Quality 486 (47%)', + '2a6a136faaf1f13c2b80dcb4786d90b2:11' => 'Apple QuickTime, Quality 487 (48%)', + '3a6eac793d818f378e7b24826c9115cc:11' => 'Apple QuickTime, Quality 488 (48%)', + '4a78c6570fc84378e3334bfcd8a5680f:11' => 'Apple QuickTime, Quality 489 (48%)', + '0709c0afc0eae932a50903e56ec95ad2:11' => 'Apple QuickTime, Quality 490 (48%)', + 'b013b5c9b7bafc9dcad9a1e87fc629ff:11' => 'Apple QuickTime, Quality 491 (48%)', + '7cb380e582317b8387037450cc68db5e:11' => 'Apple QuickTime, Quality 492 (48%)', + 'f94618c1a011209cb3b060887c7e244e:11' => 'Apple QuickTime, Quality 493 (48%)', + '649a90949cab8f45d3ecef78068165d1:11' => 'Apple QuickTime, Quality 494 (48%)', + '70e105a22b036f7c1ce0b5d02fa1c34e:11' => 'Apple QuickTime, Quality 495 (48%)', + '18c10ea6fe5918e09daf1a3a7a74e678:11' => 'Apple QuickTime, Quality 496 (48%)', + '23822cafcc61ce2a52691f1fc963ff18:11' => 'Apple QuickTime, Quality 497 (49%)', + '5bb2cf3e6721c2dd8eb3341f9bff4159:11' => 'Apple QuickTime, Quality 498 (49%)', + 'e55b5345d9668d1b11b657537f707072:11' => 'Apple QuickTime, Quality 499 (49%)', + '4cbebcb06d1003e29429e9d5c9445919:11' => 'Apple QuickTime, Quality 500 (49%)', + '916b16f020b2b21e4c8114da8c05d584:11' => 'Apple QuickTime, Quality 501 (49%)', + '98abef3366c7f451e44f5c2799e2be6d:11' => 'Apple QuickTime, Quality 502 (49%)', + 'f8e99ed03828752f16c51bb8c9887e9e:11' => 'Apple QuickTime, Quality 503 (49%)', + 'eef05c558c1aba5cf2891fb13ee07167:11' => 'Apple QuickTime, Quality 504 (49%)', + 'cb5fc7927d88ac99f556b2dd7985eaf9:11' => 'Apple QuickTime, Quality 505 (49%)', + 'f0e3f635bbcf96654812e8c78b227701:11' => 'Apple QuickTime, Quality 506 (49%)', + '234c9cf6d7fe671b52c3ec5a20046ec8:11' => 'Apple QuickTime, Quality 507 (50%)', + '9dfcc9ae3baee4bb4ad63abf2f740275:11' => 'Apple QuickTime, Quality 508 (50%)', + 'b1f1b6519991ac7696b233dd9b9de6b5:11' => 'Apple QuickTime, Quality 509 (50%)', + 'dba2f5203ffecada66a8bf9b1272f1eb:11' => 'Apple QuickTime, Quality 510 (50%)', + '367b3d63cddc0cd27e58030c2b8f1aaa:11' => 'Apple QuickTime, Quality 511 (50%)', + 'c28ab3fd6480c92028327957228c0a11:11' => 'Apple QuickTime, Quality 512 (50%)', + '6bc9ebaf9f3ed62ec8818076f6f81c7f:11' => 'Apple QuickTime, Quality 513 (50%)', + '3bbfcd817441d2267a49bf76b48c5f47:11' => 'Apple QuickTime, Quality 514 (50%)', + '27e6ed2cecfebe31eb3d66128c926562:11' => 'Apple QuickTime, Quality 515 (50%)', + '3cf112c5843f98410599ea2a197e5cf6:11' => 'Apple QuickTime, Quality 516 (50%)', + '2821aae8108df4bd98e5eaa451a351d2:11' => 'Apple QuickTime, Quality 517 (50%)', + '798f48b6dbe3f1cd7b40b03fae8d2611:11' => 'Apple QuickTime, Quality 518 (51%)', + '67a7c8896d03a030b56130e1f9c5caad:11' => 'Apple QuickTime, Quality 519 (51%)', + '4bf1b53c292dec3f7cf3c020a3a9d911:11' => 'Apple QuickTime, Quality 520 (51%)', + '2bfe0ace876b80be6f601a1703187d94:11' => 'Apple QuickTime, Quality 521 (51%)', + '7590bc1a40090163a101bfd28daa3fc2:11' => 'Apple QuickTime, Quality 522 (51%)', + '118c7b118b1df404c90cfb1d10cf2a77:11' => 'Apple QuickTime, Quality 523 (51%)', + '86cfac24ca9f4ab254f882ad399ea758:11' => 'Apple QuickTime, Quality 524 (51%)', + '0268c3e9e3e1c3e6eb25fe0d31940c7f:11' => 'Apple QuickTime, Quality 525 (51%)', + '9beb1b7c55129a34c850c359d7263457:11' => 'Apple QuickTime, Quality 526 (51%)', + '0cec2c8f96c092bd6e7cf0f7ea294c99:11' => 'Apple QuickTime, Quality 527 (51%)', + 'd8c5179c2419775f43e9a7899bacddd7:11' => 'Apple QuickTime, Quality 528 (52%)', + '9ce50f6e0b00d2e601f2fcc151abc4d8:11' => 'Apple QuickTime, Quality 529 (52%)', + '80db52b1671d32d8bd3126bf1d7db8ec:11' => 'Apple QuickTime, Quality 530 (52%)', + 'f3ef06f90579eaf1008e07b94e818a40:11' => 'Apple QuickTime, Quality 531 (52%)', + '3c85026793f58eb45141847a27854fe2:11' => 'Apple QuickTime, Quality 532-533 (52%)', + 'e3042cbd43d2067ae92e1a8ce3f2c5a1:11' => 'Apple QuickTime, Quality 534 (52%)', + 'dd71fdab3d46341a9b6ca0b6c6929d23:11' => 'Apple QuickTime, Quality 535 (52%)', + 'a451c79ccddcd543a80e1ce0449dcb0d:11' => 'Apple QuickTime, Quality 536 (52%)', + '2da67fe5f0bb3c8b10403295895fb154:11' => 'Apple QuickTime, Quality 537 (52%)', + '4f72f3cdc82d433e7f749be8036d4ce0:11' => 'Apple QuickTime, Quality 538 (53%)', + 'da29cc9a4d5fd7e0dc36a2dd0c70e84f:11' => 'Apple QuickTime, Quality 539 (53%)', + '63f61a0d3c4f1ace8ebe5b6ae23e3f25:11' => 'Apple QuickTime, Quality 540 (53%)', + 'fde14219617069bbf6b26dcb42036de7:11' => 'Apple QuickTime, Quality 541 (53%)', + 'c84313bc621c6d05999510fa57c56d05:11' => 'Apple QuickTime, Quality 542 (53%)', + '92658d4c879d6e48bfda1a6e9f49ef8d:11' => 'Apple QuickTime, Quality 543 (53%)', + '3deffd01a1c03929873dddd86a5339f1:11' => 'Apple QuickTime, Quality 544 (53%)', + 'e76c1b26bbd196efe2e793e27727704d:11' => 'Apple QuickTime, Quality 545 (53%)', + '9f3289994c790a10ecb2d93021677840:11' => 'Apple QuickTime, Quality 546 (53%)', + 'f7493b01895b7880c651841c73678d33:11' => 'Apple QuickTime, Quality 547 (53%)', + '3c9d094741c995c2c0ac9daf14c4e683:11' => 'Apple QuickTime, Quality 548 (54%)', + '8c0e1d4cd6138817963af6ca149cb5d5:11' => 'Apple QuickTime, Quality 549 (54%)', + 'd781cc6f686fc7c7b9b6eef90fab4d87:11' => 'Apple QuickTime, Quality 550 (54%)', + '7dd6377a907070b1ca7e05f770ca2aab:11' => 'Apple QuickTime, Quality 551-552 (54%)', + 'c2d5e2e93ec191015d8181c9e25387d8:11' => 'Apple QuickTime, Quality 553 (54%)', + '65d20361f4ba0725cf150c7ae2033776:11' => 'Apple QuickTime, Quality 554 (54%)', + '2d7eb8eb9df9f4831a843626f4fc7e19:11' => 'Apple QuickTime, Quality 555 (54%)', + 'ce0e14187fec73f57242becd633a89a3:11' => 'Apple QuickTime, Quality 556 (54%)', + '140cc5a99ef865e318a217ea069aa84d:11' => 'Apple QuickTime, Quality 557 (54%)', + '0db59bd18beb49f9beb901f3435e22a5:11' => 'Apple QuickTime, Quality 558 (54%)', + '78d19da8de8095644aa31fb409033fe7:11' => 'Apple QuickTime, Quality 559 (55%)', + '00687c4e4852ed1cd446c09a3764e505:11' => 'Apple QuickTime, Quality 560 (55%)', + 'f3795398903c82e1beababf95d3a8413:11' => 'Apple QuickTime, Quality 561 (55%)', + 'b749b90354443bf17da7a67a5ad53397:11' => 'Apple QuickTime, Quality 562 (55%)', + 'c722656df4bb0651821cd90880953a20:11' => 'Apple QuickTime, Quality 563 (55%)', + '4d17c873e65b9d398f27735b0020c777:11' => 'Apple QuickTime, Quality 564 (55%)', + '067a76c2e5386ae85f9187e3e2134621:11' => 'Apple QuickTime, Quality 565 (55%)', + '09b689f7d0c1d4bb0d96d06c02b8dcf8:11' => 'Apple QuickTime, Quality 566 (55%)', + 'ffc0192eb5a182370a641cffe9b1d71f:11' => 'Apple QuickTime, Quality 567 (55%)', + '3af2163438180050bbcf123d4f4587d3:11' => 'Apple QuickTime, Quality 568 (55%)', + '3bdb097a9791f3ce6d7bbc4d6a194aa4:11' => 'Apple QuickTime, Quality 569 (56%)', + '8c1fead15819016583650eff5a4f5bda:11' => 'Apple QuickTime, Quality 570 (56%)', + '967aeb5bc4d75a0d5c0998bbfb282982:11' => 'Apple QuickTime, Quality 571 (56%)', + 'cdd7bd689f14d5f7c3ea790f6f09ae64:11' => 'Apple QuickTime, Quality 572 (56%)', + '6a20041beb5b67d38525bb7507ffeb49:11' => 'Apple QuickTime, Quality 573 (56%)', + '2bf57fbe54370c4d917f259631af033e:11' => 'Apple QuickTime, Quality 574 (56%)', + 'd2e983c44eae2983f48f526992fbbfb4:11' => 'Apple QuickTime, Quality 575 (56%)', + 'c5bb48d86e26ac496bb4b4bc888cc06a:11' => 'Apple QuickTime, Quality 576 (56%)', + 'a595c40b5dbd45557c3c8d23ebee5e24:11' => 'Apple QuickTime, Quality 577 (56%)', + 'f2d84e1114ef85682818b96720d439b5:11' => 'Apple QuickTime, Quality 578 (56%)', + '332d9c49c5b32ae2addbb06a1e32fd49:11' => 'Apple QuickTime, Quality 579 (57%)', + '19c5c7c0270bd36c49f695475a62c293:11' => 'Apple QuickTime, Quality 580 (57%)', + '6516e60b3995e21b6750ebca1ddcfee5:11' => 'Apple QuickTime, Quality 581 (57%)', + '8daf4a87b28106876529a549cf1040b8:11' => 'Apple QuickTime, Quality 582 (57%)', + '6b37d6acc52259bf972a41e84dea7754:11' => 'Apple QuickTime, Quality 583 (57%)', + '588666e111892f10ca3f17bc362d9276:11' => 'Apple QuickTime, Quality 584 (57%)', + '9ec2859c370f557783903608748e7fb1:11' => 'Apple QuickTime, Quality 585 (57%)', + '18e3ac85da74fe92ab5da3d5f7614e09:11' => 'Apple QuickTime, Quality 586 (57%)', + 'da4c88f145393972fbe9d3f40838cab9:11' => 'Apple QuickTime, Quality 587 (57%)', + '8ae7d2b569c437904a20a10bbd21fe89:11' => 'Apple QuickTime, Quality 588 (57%)', + 'fc6dfb9669566b249cb03228aeb020c3:11' => 'Apple QuickTime, Quality 589 (58%)', + '198f3a32e4036d7c37fbc0c343d883af:11' => 'Apple QuickTime, Quality 590 (58%)', + '876ec039f82e49b925b232843b4703d4:11' => 'Apple QuickTime, Quality 591 (58%)', + '673b05962b8255cbc9bdbbc48965b4b7:11' => 'Apple QuickTime, Quality 592 (58%)', + '02e9a58edf45d75be000dee144316c66:11' => 'Apple QuickTime, Quality 593 (58%)', + '2abebf7a61009c5c1aa9516539b9084e:11' => 'Apple QuickTime, Quality 594 (58%)', + 'fe44d8625d6242f4b5deb82be8ccaacf:11' => 'Apple QuickTime, Quality 595 (58%)', + '66529cc8ef9694e6a37e8787d0f160fd:11' => 'Apple QuickTime, Quality 596 (58%)', + '2129ee2bff47bfa8a8bb79ea9fb67b92:11' => 'Apple QuickTime, Quality 597 (58%)', + 'ccb55ec1549a51212859495e104c626b:11' => 'Apple QuickTime, Quality 598 (58%)', + '05e53fb216ba4a1734eefaccd249d8e2:11' => 'Apple QuickTime, Quality 599 (58%)', + 'f4923d7b7dedd365646169e720eee427:11' => 'Apple QuickTime, Quality 600 (59%)', + 'c0f2265630bdf5f29e8c95df25c89edb:11' => 'Apple QuickTime, Quality 601 (59%)', + '0fdd23e8274090da3c925a3db7303adf:11' => 'Apple QuickTime, Quality 602 (59%)', + 'a5bcbd80472fdf697db770ac78d6a4e3:11' => 'Apple QuickTime, Quality 603 (59%)', + 'b157c4aabba2816f391c8f76ca3d4072:11' => 'Apple QuickTime, Quality 604 (59%)', + 'b8ef26dabc2d81a8ba13b1f49ea711d3:11' => 'Apple QuickTime, Quality 605 (59%)', + '8a983844f9b0aec26fc8ac75a258e3ac:11' => 'Apple QuickTime, Quality 606 (59%)', + '44ced96f11e3a410201beed353a864cf:11' => 'Apple QuickTime, Quality 607 (59%)', + '4a14a3e37c89e5a7570f672b1970ca55:11' => 'Apple QuickTime, Quality 608 (59%)', + 'e5ec78e112e3ba6463de24b3518347eb:11' => 'Apple QuickTime, Quality 609 (59%)', + '29b7cdc7a570b950457d20541c22c4ce:11' => 'Apple QuickTime, Quality 610 (60%)', + '470c0c761e2bb5e314a7112f3d64b277:11' => 'Apple QuickTime, Quality 611 (60%)', + 'ced483058f2abf19df0f7935dafd217a:11' => 'Apple QuickTime, Quality 612 (60%)', + '8a202c89c57e77f50e1df27a3be7d5b7:11' => 'Apple QuickTime, Quality 613 (60%)', + '7eb9fe0338a7b802860a60e0088418fd:11' => 'Apple QuickTime, Quality 614 (60%)', + 'ac25112c596d62f95518af109457975c:11' => 'Apple QuickTime, Quality 615 (60%)', + 'f57e9a5f1d8dea7fd83a1b5840243686:11' => 'Apple QuickTime, Quality 616-617 (60%)', + '0eef5c6ff8ba65ff799081a9c96a2297:11' => 'Apple QuickTime, Quality 618-619 (60%)', + '05f98e12bfa14ba6347fb43f2241ba43:11' => 'Apple QuickTime, Quality 620 (61%)', + '91885755c780ebe16b1278a0359eda83:11' => 'Apple QuickTime, Quality 621 (61%)', + 'b44cb1ca15fc9e3a27420df2ddae5879:11' => 'Apple QuickTime, Quality 622 (61%)', + 'ae6c2112dd560530b7bacc8bfa9fb7f6:11' => 'Apple QuickTime, Quality 623 (61%)', + 'd3b05f3cd78e0ac3ab37a02152e22831:11' => 'Apple QuickTime, Quality 624 (61%)', + 'b0c2c3f76d848ee2e8f47a9a90131a21:11' => 'Apple QuickTime, Quality 625 (61%)', + '752fbc15f77a8c2149f5ae6bf49204b8:11' => 'Apple QuickTime, Quality 626 (61%)', + '9c34d3dedfe47d95edabdcbc5568a2a8:11' => 'Apple QuickTime, Quality 627 (61%)', + '252ba8a31aeb601e23b3a70f9af7abc1:11' => 'Apple QuickTime, Quality 628 (61%)', + '359038cd7c45242e96e176e91210922d:11' => 'Apple QuickTime, Quality 629 (61%)', + '8ab83dc2e7ca8b9db1f3b0ab500f3aca:11' => 'Apple QuickTime, Quality 630 (62%)', + '21c9f9a0ff71d4528ef7a19d2cfd0b6c:11' => 'Apple QuickTime, Quality 631 (62%)', + 'a62fb887c209e0fab99fcb7ac81137a2:11' => 'Apple QuickTime, Quality 632 (62%)', + 'e454ca92aca849d59b873d9be817baea:11' => 'Apple QuickTime, Quality 633 (62%)', + '9ad6008e7b4f8478043bfa54e1d9e48e:11' => 'Apple QuickTime, Quality 634 (62%)', + '45b20f0b0d7d88d8330354212af2e087:11' => 'Apple QuickTime, Quality 635 (62%)', + 'b0a00ffee2e55457cd999bba2d07f63e:11' => 'Apple QuickTime, Quality 636 (62%)', + '5dfcb96d9a1186f662c6adb38bb9520a:11' => 'Apple QuickTime, Quality 637 (62%)', + 'd973f38c501796adff40c4f70cbd8885:11' => 'Apple QuickTime, Quality 638 (62%)', + 'dcfe5898ec101a8b2bf98330445dd1bf:11' => 'Apple QuickTime, Quality 639 (62%)', + '2b81eecf0fecd33679adac27e79ef3f4:11' => 'Apple QuickTime, Quality 640-641 (63%)', + '5aad44c55bf4f6dc538eaca006cafac2:11' => 'Apple QuickTime, Quality 642 (63%)', + '7079c2d71ff33e7c4e8efdece23c307b:11' => 'Apple QuickTime, Quality 643 (63%)', + 'a5f724e9d7148f1a84ee597f45c33141:11' => 'Apple QuickTime, Quality 644 (63%)', + '3ae705fae9e895eda345d482525215e3:11' => 'Apple QuickTime, Quality 645 (63%)', + '7cbd635e5fee8bbd290b0d383b03da5a:11' => 'Apple QuickTime, Quality 646 (63%)', + '0f125e2c5ee6b123cf67b586ea23d422:11' => 'Apple QuickTime, Quality 647 (63%)', + '87eac5c1375cca9aa16eba0704616a7b:11' => 'Apple QuickTime, Quality 648-649 (63%)', + 'aa83fd556c569ddcd81e0cc1ba866373:11' => 'Apple QuickTime, Quality 650 (63%)', + 'dab4fa97da49aa37889185c5b43917c1:11' => 'Apple QuickTime, Quality 651 (64%)', + '51ad55cb254f36748123ca83f43556f4:11' => 'Apple QuickTime, Quality 652 (64%)', + '86e707c017682fe08213216d064b1b51:11' => 'Apple QuickTime, Quality 653 (64%)', + '3730182602996b4a1d540eb3fd970072:11' => 'Apple QuickTime, Quality 654 (64%)', + '1bf7a5d7477ad75b9c7b281de622d53b:11' => 'Apple QuickTime, Quality 655 (64%)', + '82b4bc7c4a832b620e810311a33c9771:11' => 'Apple QuickTime, Quality 656 (64%)', + '6502d634e5bf3f849e9d382886fc32fe:11' => 'Apple QuickTime, Quality 657 (64%)', + 'a10e87fa030f8177a4f59f8d16a20afd:11' => 'Apple QuickTime, Quality 658 (64%)', + '338a78a7658ff3c1de33d88aa0ab7c74:11' => 'Apple QuickTime, Quality 659 (64%)', + '4c30c4399ef4bb2920601d940ed404eb:11' => 'Apple QuickTime, Quality 660-661 (64-65%)', + 'ab7cfb73667875854893982a8cfcfab9:11' => 'Apple QuickTime, Quality 662 (65%)', + '7bff346b97abf46ca005af4e74b560fa:11' => 'Apple QuickTime, Quality 663 (65%)', + '2eae93ed601a50284ee31c20651584cb:11' => 'Apple QuickTime, Quality 664 (65%)', + 'e566eaef7eacd6c7161feebf4cec79e8:11' => 'Apple QuickTime, Quality 665 (65%)', + 'a9f461d3bca42dfab57c834fa5f34419:11' => 'Apple QuickTime, Quality 666 (65%)', + '2b394105d4dd418e79b32e66496679d4:11' => 'Apple QuickTime, Quality 667 (65%)', + 'c65677d79e37baf57767e10d7b7f1ce8:11' => 'Apple QuickTime, Quality 668 (65%)', + '688c7dca6b12c22a21e0caf1a0336c80:11' => 'Apple QuickTime, Quality 669-671 (65-66%)', + '20d4b3c9e3c292c68181974704fe5048:11' => 'Apple QuickTime, Quality 672-673 (66%)', + '3bc3948025869f25b143aa517b2154ac:11' => 'Apple QuickTime, Quality 674 (66%)', + '8a2ae82991917070de49cc48d104446f:11' => 'Apple QuickTime, Quality 675 (66%)', + 'b5424d9dce37dd5c9e0e38bcc775f48e:11' => 'Apple QuickTime, Quality 676 (66%)', + '28f718af4edb0069a1fdab00f6ea978d:11' => 'Apple QuickTime, Quality 677 (66%)', + '910416483a49503202cbe3ecee33afc9:11' => 'Apple QuickTime, Quality 678 (66%)', + '153196d4f99569f9bbd3fe0e96d2909c:11' => 'Apple QuickTime, Quality 679 (66%)', + '919a38ebb9fc0bcba388643a9b3ef27c:11' => 'Apple QuickTime, Quality 680 (66%)', + 'ef511ac2c9d7153c16e3e1846325b727:11' => 'Apple QuickTime, Quality 681 (67%)', + 'e8b4ef8f94d89c59c855758a73ec451f:11' => 'Apple QuickTime, Quality 682 (67%)', + 'a09fe2e60a7ff12e1e5ca00afa9719ef:11' => 'Apple QuickTime, Quality 683 (67%)', + 'e56cf84423c16869a9a4fd6605b15ba4:11' => 'Apple QuickTime, Quality 684 (67%)', + 'f64d88456f97a65fe562eb69e619782a:11' => 'Apple QuickTime, Quality 685 (67%)', + '8cbf6cda8ae0249fb91c1ff5ab788a04:11' => 'Apple QuickTime, Quality 686 (67%)', + 'f0ebdd8d44ac1a80727041a087553847:11' => 'Apple QuickTime, Quality 687 (67%)', + 'c8f917220d6285cda6428a2cf6a9a1b3:11' => 'Apple QuickTime, Quality 688-689 (67%)', + '83ff61ebceff5f888b9615b250aa7b76:11' => 'Apple QuickTime, Quality 690 (67%)', + 'a2d1de53a0882047287a954f86bc783d:11' => 'Apple QuickTime, Quality 691 (67%)', + 'c78717ac2705274888912f349eeb2c8e:11' => 'Apple QuickTime, Quality 692 (68%)', + 'e032225ecdcf1d91d85626df59a2d0c6:11' => 'Apple QuickTime, Quality 693 (68%)', + 'ebf82c50697d66a6913727095299f192:11' => 'Apple QuickTime, Quality 694-695 (68%)', + 'bcc29022955cc7532b08640ab118259c:11' => 'Apple QuickTime, Quality 696 (68%)', + '6a87dd29703c2b3ef80f1b5d2cc8d26a:11' => 'Apple QuickTime, Quality 697 (68%)', + '91c9d96e11d96e10b328a5f18960247b:11' => 'Apple QuickTime, Quality 698 (68%)', + '6eeaaacec8edc933b68602b01d16204e:11' => 'Apple QuickTime, Quality 699 (68%)', + 'c638d9151dc650993b56f4effc0fe19c:11' => 'Apple QuickTime, Quality 700 (68%)', + 'c67d246229fcc0dd1b974f7df556d247:11' => 'Apple QuickTime, Quality 701 (68%)', + '7a52e3960831057d58e9b1ba03b87cf3:11' => 'Apple QuickTime, Quality 702 (69%)', + '907e599e3c462b498e936dfc35b20bb9:11' => 'Apple QuickTime, Quality 703-704 (69%)', + '65bf1ddc176fe4002a7a2ecaac60e58c:11' => 'Apple QuickTime, Quality 705 (69%)', + '40e59fdb430180502ceacf7b4034eff8:11' => 'Apple QuickTime, Quality 706 (69%)', + '4205aec34791d70be03b90ab1e54ef8c:11' => 'Apple QuickTime, Quality 707 (69%)', + '5c0a83e613d3bdd9ec7e86983f75b5be:11' => 'Apple QuickTime, Quality 708 (69%)', + 'b3ebdf0376c9c48cca51ea8b550f6c51:11' => 'Apple QuickTime, Quality 709 (69%)', + '72161116404ed3cb449674760d0e4776:11' => 'Apple QuickTime, Quality 710 (69%)', + '35b3697c265e35185e9463aac6ce9b2d:11' => 'Apple QuickTime, Quality 711-712 (69-70%)', + '85adcc8c52c25334a9e7ea9d79433f8d:11' => 'Apple QuickTime, Quality 713 (70%)', + '8f72f67948f264bdbd33107c33b1e0a0:11' => 'Apple QuickTime, Quality 714 (70%)', + 'c25ed5069735a3f9677ee494108a52bc:11' => 'Apple QuickTime, Quality 715 (70%)', + 'fd3167b1cdcfa1bdd37a4841d37b1624:11' => 'Apple QuickTime, Quality 716-717 (70%)', + 'a02b6b8286cf6d036961911e98bd8f89:11' => 'Apple QuickTime, Quality 718-719 (70%)', + 'd876e8934da14a985abda0ebe722bbee:11' => 'Apple QuickTime, Quality 720 (70%)', + '31852b7659883eade6e273ac61ef0262:11' => 'Apple QuickTime, Quality 721 (70%)', + 'de3aa6ed96eaf3ed3cd3ea70a2f75002:11' => 'Apple QuickTime, Quality 722 (71%)', + 'f178977e9e0133711f395943816d26aa:11' => 'Apple QuickTime, Quality 723 (71%)', + '18fce3103e312ce26252ec4af6cd1350:11' => 'Apple QuickTime, Quality 724 (71%)', + 'fdf6b04a2d8ac06d3fe64d1dceba4cd9:11' => 'Apple QuickTime, Quality 725 (71%)', + '6a37c2572bb47dff514aa4b343c104b5:11' => 'Apple QuickTime, Quality 726 (71%)', + 'fdbe851f6e559bc17ce3610b91e7fead:11' => 'Apple QuickTime, Quality 727 (71%)', + '9fee7fc42e670d6e30a5e9fcf696241d:11' => 'Apple QuickTime, Quality 728 (71%)', + '5aedf3816a813ed63b0521b0c384a677:11' => 'Apple QuickTime, Quality 729 (71%)', + 'c1278992838bdd62e71bf41c20126a5f:11' => 'Apple QuickTime, Quality 730 (71%)', + '791e3897f6ac92fb5e708b28dbd361b1:11' => 'Apple QuickTime, Quality 731 (71%)', + 'd5b2902ae3fcd87e1521da86585e7b3a:11' => 'Apple QuickTime, Quality 732-733 (71-72%)', + 'a99810db58e835fe4b213d707dc0b754:11' => 'Apple QuickTime, Quality 734 (72%)', + 'e8032085aa55f664f7f74201ac10bb99:11' => 'Apple QuickTime, Quality 735 (72%)', + '488e5d04f779b15c53f76e67cccdb2ed:11' => 'Apple QuickTime, Quality 736 (72%)', + '548a841c0a8c3b2beeb134c6c3b922fc:11' => 'Apple QuickTime, Quality 737-738 (72%)', + 'cfe4549eb2dd81684920aa32b598260c:11' => 'Apple QuickTime, Quality 739-740 (72%)', + 'b6ff9215f87e4b053aaee36381f59005:11' => 'Apple QuickTime, Quality 741 (72%)', + 'd1c8c1e1fc2bfb776d2ee1aace3fc6f9:11' => 'Apple QuickTime, Quality 742 (72%)', + '365693ebd558aebc31a79a1abff9709d:11' => 'Apple QuickTime, Quality 743-744 (73%)', + '0233ba670d2891e75da3ce5e7664cb67:11' => 'Apple QuickTime, Quality 745 (73%)', + 'a91f5f8e8d743e52169d965992c5021e:11' => 'Apple QuickTime, Quality 746 (73%)', + '1a0487e7e1a8f4ade97b2e8a4cab46ec:11' => 'Apple QuickTime, Quality 747 (73%)', + '5a2311c438c7183f6cd1f45c10e5783a:11' => 'Apple QuickTime, Quality 748 (73%)', + '2750f3df7a97d6007d6a17f5dd27790a:11' => 'Apple QuickTime, Quality 749 (73%)', + '74fddf6faaf251b28a00b4d0cd9e5621:11' => 'Apple QuickTime, Quality 750 (73%)', + 'ea65bdd87f78f7507fe6098473cbe0c9:11' => 'Apple QuickTime, Quality 751 (73%)', + '26d087368a13e3aca9ca13a54bcc648f:11' => 'Apple QuickTime, Quality 752-753 (73-74%)', + '5664c6ca557bc75526f59bea6aebde51:11' => 'Apple QuickTime, Quality 754 (74%)', + 'ff7a6007b6aab26f3c72c715ce487d72:11' => 'Apple QuickTime, Quality 755 (74%)', + '912804912a3914f0b470b29495810d8c:11' => 'Apple QuickTime, Quality 756-758 (74%)', + '6537be61d21f1b6ded3253fdd84f599b:11' => 'Apple QuickTime, Quality 759-760 (74%)', + '72d947637340246a35ff3ee969fd613f:11' => 'Apple QuickTime, Quality 761 (74%)', + '8c5c788bd53945222fc98f1a6155004c:11' => 'Apple QuickTime, Quality 762 (74%)', + '9fa9c3d1041911322544aef0298695ba:11' => 'Apple QuickTime, Quality 763 (75%)', + '33113dc71a90e8db06b43dadfe36b020:11' => 'Apple QuickTime, Quality 764 (75%)', + '55e0cf02a898abf8e224e2e9cf6e6ca5:11' => 'Apple QuickTime, Quality 765-766 (75%)', + '4f00127e7931d668a7b472c8a669925a:11' => 'Apple QuickTime, Quality 767-768 (75%)', + '32aa33dc6de46b7c5c5948b0ae06cb0e:11' => 'Apple QuickTime, Quality 769 (75%)', + 'a2b6067d9e5731be8029e17c00d7e043:11' => 'Apple QuickTime, Quality 770 (75%)', + 'cb6bc96131c4a5f762b5e5f79e7c4b66:11' => 'Apple QuickTime, Quality 771 (75%)', + 'e582a5f93f66cf34facfba5918a1d9e2:11' => 'Apple QuickTime, Quality 772 (75%)', + '54ab2e8fbd7c4ecac9eba5fb02a5ccd9:11' => 'Apple QuickTime, Quality 773 (75%)', + 'c71131cb485b59faf920d11982f7d454:11' => 'Apple QuickTime, Quality 774 (76%)', + 'c18239304e22bd19e3c8a21f9875ba39:11' => 'Apple QuickTime, Quality 775-776 (76%)', + '8278e4f14c7bf6efd2a847ef40f392e3:11' => 'Apple QuickTime, Quality 777 (76%)', + '6c0e396c705a59ec610a22f11466621b:11' => 'Apple QuickTime, Quality 778 (76%)', + 'a0c4d0114c04c89c879d9dc03463b347:11' => 'Apple QuickTime, Quality 779 (76%)', + 'c804929d3963c7427fa143e0d1e8c94e:11' => 'Apple QuickTime, Quality 780-781 (76%)', + 'e331a0dd2c53616c2881bb381fc4c1e2:11' => 'Apple QuickTime, Quality 782 (76%)', + '24ec8f0996e5e8d4dd7019d2b6063290:11' => 'Apple QuickTime, Quality 783 (76%)', + '36e9cb02d3ef245a3e15272c5071b0ee:11' => 'Apple QuickTime, Quality 784 (77%)', + 'b691578c1d6b16687fe2df12843d0642:11' => 'Apple QuickTime, Quality 785-786 (77%)', + 'ecbf939a145939d5aa48fc3c9e19cfe8:11' => 'Apple QuickTime, Quality 787 (77%)', + '9440b11ee5eb970a3ea6de9353099761:11' => 'Apple QuickTime, Quality 788 (77%)', + '282914c43bab6e5c62f3caaf549f1510:11' => 'Apple QuickTime, Quality 789-790 (77%)', + '040c8ed8b19485d8677b964b03bc9929:11' => 'Apple QuickTime, Quality 791-792 (77%)', + 'd9e503dc2dd4f6493be988ecb0f44f2c:11' => 'Apple QuickTime, Quality 793-795 (77-78%)', + '64d056c9e5e558d6c04d07d9d21aa7a3:11' => 'Apple QuickTime, Quality 796-798 (78%)', + '498f446de17202060a4752434df1ed7b:11' => 'Apple QuickTime, Quality 799 (78%)', + '5519e1c07692f51d0ee421ede78fb907:11' => 'Apple QuickTime, Quality 800 (78%)', + '511c5bddc18566a2544732291920caf3:11' => 'Apple QuickTime, Quality 801 (78%)', + '659f7466f80a8034f74a00ba07b8c3fb:11' => 'Apple QuickTime, Quality 802-804 (78-79%)', + 'fb64b35fe4021c34f16cf5bb1e59c0e8:11' => 'Apple QuickTime, Quality 805 (79%)', + '54fcb6649f5ba51c32c68970797e41ea:11' => 'Apple QuickTime, Quality 806-807 (79%)', + '80ef22ca4475af1bbb8963ac511144d7:11' => 'Apple QuickTime, Quality 808 (79%)', + 'ccdf1a403ec068ad21ee78686a86dd10:11' => 'Apple QuickTime, Quality 809 (79%)', + '1487f0cfc64949393aee2eab71b6b72c:11' => 'Apple QuickTime, Quality 810 (79%)', + 'a8be3b3791e958d092b3e37286802e0c:11' => 'Apple QuickTime, Quality 811-813 (79%)', + 'f9176b3ef0b4038c6c52b30ba033eb7f:11' => 'Apple QuickTime, Quality 814 (79%)', + '60264e35250325032bf7866ca8beaf58:11' => 'Apple QuickTime, Quality 815 (80%)', + '5efe038d405e029badcea4c8ee2bfc88:11' => 'Apple QuickTime, Quality 816 (80%)', + '717cbe19ae1dc9f72c86ef518aefea16:11' => 'Apple QuickTime, Quality 817 (80%)', + '9f490145dcc00db3e57014d41d2f99f2:11' => 'Apple QuickTime, Quality 818 (80%)', + '120b93a6ab4a1e8c78578e86e3ef837f:11' => 'Apple QuickTime, Quality 819 (80%)', + '9d765f3947408b2c6f26163d7b072895:11' => 'Apple QuickTime, Quality 820 (80%)', + 'a9c018e06868989776a81650300bcfce:11' => 'Apple QuickTime, Quality 821 (80%)', + '2c6581e20fa5393b3dd4d58f0df01957:11' => 'Apple QuickTime, Quality 822-824 (80%)', + '925b6581f0ae2f288530b00168152b80:11' => 'Apple QuickTime, Quality 825 (81%)', + 'c94e09eec2df4a41b2806c23d9939cb6:11' => 'Apple QuickTime, Quality 826 (81%)', + '68d5ce8ce1a9e337ee9630dadad0650e:11' => 'Apple QuickTime, Quality 827-829 (81%)', + 'f73704219e174961963f0fcd832b09a8:11' => 'Apple QuickTime, Quality 830-832 (81%)', + 'b783df92ec8a787b1eae4e05888b184b:11' => 'Apple QuickTime, Quality 833-834 (81%)', + '55cd2cad99821382b1bd78355980b1d1:11' => 'Apple QuickTime, Quality 835 (82%)', + '9ebd96ea70c2bcf4f377a175c71baf2c:11' => 'Apple QuickTime, Quality 836 (82%)', + '12d303b2e6a467b4f20a34e695f9da7e:11' => 'Apple QuickTime, Quality 837 (82%)', + '8711d6e1c56049c0e643bc6cf19a735c:11' => 'Apple QuickTime, Quality 838-839 (82%)', + '88558d6e9a513ff713945bd60ed19cc7:11' => 'Apple QuickTime, Quality 840 (82%)', + '25b45d6c1668613a61b81c6b60fa158a:11' => 'Apple QuickTime, Quality 841 (82%)', + 'b2f95d6a0eec4de39e0964a3b7303e9f:11' => 'Apple QuickTime, Quality 842 (82%)', + '631548841b70e871ee16009737dd4b9c:11' => 'Apple QuickTime, Quality 843-844 (82%)', + '7fac641c5b795e68ca8cfae4466a19c7:11' => 'Apple QuickTime, Quality 845 (83%)', + 'a15a74418a924874c5f3d2ca20e7af90:11' => 'Apple QuickTime, Quality 846-849 (83%)', + 'e4d76c3cd4d36b72537a2234a3597933:11' => 'Apple QuickTime, Quality 850 (83%)', + '36f1ec430bae8e5c72af6388e2a4d807:11' => 'Apple QuickTime, Quality 851-852 (83%)', + 'b558f097ed59f547d2b370a73145caf9:11' => 'Apple QuickTime, Quality 853 (83%)', + 'ceecacb651d0e01e9b1c78cde2d7835a:11' => 'Apple QuickTime, Quality 854 (83%)', + '82a9cce34fb9c7c3c0ab908533a9a9bf:11' => 'Apple QuickTime, Quality 855-856 (83-84%)', + 'e93244fdb14bb27a2c30ee133b3e9f5e:11' => 'Apple QuickTime, Quality 857 (84%)', + '7a12ccd01bfdd2cf3b8ee2df498b8ae0:11' => 'Apple QuickTime, Quality 858 (84%)', + 'd0d6f781130c0fecd985df78c15c5c16:11' => 'Apple QuickTime, Quality 859-860 (84%)', + '1c19e4fde384a33f208074c73775d990:11' => 'Apple QuickTime, Quality 861-863 (84%)', + '8fb281fcf4d481e59e1c15ed51ef8f19:11' => 'Apple QuickTime, Quality 864 (84%)', + 'c3f615274e58eb887a2aa75acad436ff:11' => 'Apple QuickTime, Quality 865 (84%)', + '9146c5df73615b0f2a470521bab7e4c4:11' => 'Apple QuickTime, Quality 866 (85%)', + 'ac2d99dd3ff609760c207419312e7b30:11' => 'Apple QuickTime, Quality 867 (85%)', + '7c7d225760bce3b4e479aca8bcd2b850:11' => 'Apple QuickTime, Quality 868 (85%)', + '9da4a7e310cb44578b009e78458d3b19:11' => 'Apple QuickTime, Quality 869 (85%)', + '1ae782c12797f5e5c9b083099148e43a:11' => 'Apple QuickTime, Quality 870 (85%)', + '193ace8d9e274bb9188b1a9a7bdee777:11' => 'Apple QuickTime, Quality 871-872 (85%)', + '9160a8eeb898a05dcb02206603a45a65:11' => 'Apple QuickTime, Quality 873-877 (85-86%)', + '0443da2c934e95fca0df8a0a1433eea4:11' => 'Apple QuickTime, Quality 878-880 (86%)', + 'fa99ff1ecc29c5caa95fa62189fca670:11' => 'Apple QuickTime, Quality 881-886 (86-87%)', + 'd9a914baea5468bb52c09d1d0b5bd131:11' => 'Apple QuickTime, Quality 887 (87%)', + '6c0ac535ec30285b609e0b8ca18e4dc0:11' => 'Apple QuickTime, Quality 888-890 (87%)', + 'dffb0a244fa54783569693edf84d1cda:11' => 'Apple QuickTime, Quality 891-893 (87%)', + '507b49a59dce17c02dc16fcb329352eb:11' => 'Apple QuickTime, Quality 894 (87%)', + 'dd757185a44c3d6222e9d16a0c2ee890:11' => 'Apple QuickTime, Quality 895 (87%)', + 'f3526abe33de71ad0eb728c9d446b545:11' => 'Apple QuickTime, Quality 896 (88%)', + '34466385e7bf9b2708adf19be1eb3c2d:11' => 'Apple QuickTime, Quality 897-898 (88%)', + 'e43438348a912a2210261472d1a747ab:11' => 'Apple QuickTime, Quality 899 (88%)', + '184d01e77f6239f63fd6ab6d36761e64:11' => 'Apple QuickTime, Quality 900-901 (88%)', + '26005cdf9397dcce883660aeecb0426b:11' => 'Apple QuickTime, Quality 902 (88%)', + '09321d810a54503da7ad7b8e883227ea:11' => 'Apple QuickTime, Quality 903 (88%)', + 'd6438ea5a93b6d4d0ba26de7c56f2634:11' => 'Apple QuickTime, Quality 904-905 (88%)', + 'ddc90333cb2279aa533a339710bd81ef:11' => 'Apple QuickTime, Quality 906 (88%)', + '14a352b80a350e2df6b2bc444ccc74f6:11' => 'Apple QuickTime, Quality 907-908 (89%)', + '91a7f0747ed633f481918a83b1a7c77c:11' => 'Apple QuickTime, Quality 909-914 (89%)', + 'a3bb9728b3dfa7002364659db0c420fc:11' => 'Apple QuickTime, Quality 915-917 (89-90%)', + '9df94f927ffc1f3345923232691fab3b:11' => 'Apple QuickTime, Quality 918-920 (90%)', + '259764d950c1f1e399cdb27e159c8985:11' => 'Apple QuickTime, Quality 921-922 (90%)', + '73313d816524749545292ed2284c804c:11' => 'Apple QuickTime, Quality 923-924 (90%)', + '449ed4370a849e0f736b57ee7ccab942:11' => 'Apple QuickTime, Quality 925-926 (90%)', + 'bd1f81bd50cf9859eb0ae6d2dbf75d09:11' => 'Apple QuickTime, Quality 927 (91%)', + '820db98d1ee91bb648e7a05498a340b0:11' => 'Apple QuickTime, Quality 928 (91%)', + '93c1ba0af1f50d889cb5e2364be3a056:11' => 'Apple QuickTime, Quality 929 (91%)', + 'cc96e1c8906353c4023bc7e6b72bb684:11' => 'Apple QuickTime, Quality 930 (91%)', + 'eb728dc3105ddb5a0597384b54ed948c:11' => 'Apple QuickTime, Quality 931 (91%)', + 'dc0278d78fa5c8daf84f8c2672f582c6:11' => 'Apple QuickTime, Quality 932-933 (91%)', + '1a603cba63dbba0d0815fc7319271b93:11' => 'Apple QuickTime, Quality 934-936 (91%)', + '3d8f4957eab9756993a78efe08ba3798:11' => 'Apple QuickTime, Quality 937-938 (92%)', + 'cef5a49e1834c316a4a9e7dca8d69157:11' => 'Apple QuickTime, Quality 939 (92%)', + 'ca21386b17f3866a235fca4b6e72b124:11' => 'Apple QuickTime, Quality 940 (92%)', + 'ec662935c494c5abd6f6c907f77be65c:11' => 'Apple QuickTime, Quality 941-943 (92%)', + '190a54eb1127ee87231795bc3d661b5a:11' => 'Apple QuickTime, Quality 944-946 (92%)', + 'e78229129afca214a07ad978262c545e:11' => 'Apple QuickTime, Quality 947-951 (92-93%)', + 'c31cb63954b137b62c5fe35379235e2e:11' => 'Apple QuickTime, Quality 952-954 (93%)', + '25ca43baa972ad9c82128606cd383805:11' => 'Apple QuickTime, Quality 955 (93%)', + '334c67d739adf957d1620201cb7a521c:11' => 'Apple QuickTime, Quality 956-957 (93-93%)', + '29c42d951dc84d62bd134bec71bf731b:11' => 'Apple QuickTime, Quality 958 (94%)', + 'fa6f80883480ab3ddea8ee2f6796a14b:11' => 'Apple QuickTime, Quality 959-961 (94%)', + 'e40f6a9a3daf4bfc42aedcb9107076ea:11' => 'Apple QuickTime, Quality 962 (94%)', + 'd26a06f6114d83714e3b64b6dbe97e6f:11' => 'Apple QuickTime, Quality 963-967 (94%)', + 'c40848be9d1d1018747630cdac2d7294:11' => 'Apple QuickTime, Quality 968-970 (95%)', + 'ab2b6d0624f294bf4e53e34208caeaa6:11' => 'Apple QuickTime, Quality 971 (95%)', + 'b6ea2f838fa1942a21e41f6bba417782:11' => 'Apple QuickTime, Quality 972-973 (95%)', + 'ff765e75c06c9db34f66ae7ee0202d05:11' => 'Apple QuickTime, Quality 974 (95%)', + 'c33573208ef877f1bc9a64f595e00c4d:11' => 'Apple QuickTime, Quality 975-977 (95%)', + '6528da6df208ce35fd84dccabc81d4da:11' => 'Apple QuickTime, Quality 978-979 (96%)', + '420d094d00a4a8aec94c5667254d2053:11' => 'Apple QuickTime, Quality 980-984 (96%)', + '427271dd1e2a3d7a7ce54af73d9e6c77:11' => 'Apple QuickTime, Quality 985-987 (96%)', + '99589fb7d66a29f15d9ff0f37235e7a2:11' => 'Apple QuickTime, Quality 988-991 (96-97%)', + '98fddd9e5862e06385b46a016597c02f:11' => 'Apple QuickTime, Quality 992-993 (97%)', + '381d1ca1d61986f28cfd6da0fca348da:11' => 'Apple QuickTime, Quality 994-996 (97%)', + '11a232fa9de634fadde1869007baab9c:11' => 'Apple QuickTime, Quality 997-998 (97%)', + '02374d6405239e8fe5ab939b92f4fd03:11' => 'Apple QuickTime, Quality 999-1000 (98%)', + 'f91cfb708c99c2fef0f7148976514f44:11' => 'Apple QuickTime, Quality 1001-1002 (98%)', + '83f3452abc7906930b228c29a4320089:11' => 'Apple QuickTime, Quality 1003 (98%)', + '4379016ba81dc331ffd5f9a8ab5b6399:11' => 'Apple QuickTime, Quality 1004 (98%)', + 'e2cccecebc01c7d8a4fca2dab682ba8f:11' => 'Apple QuickTime, Quality 1005-1009 (98-99%)', + '8d4b2a14a176d63e509684aa4246dabb:11' => 'Apple QuickTime, Quality 1010-1013 (99%)', + '40a7c1d8f58612f4470c2531768d93b5:11' => 'Apple QuickTime, Quality 1014-1016 (99%)', + '8392742f8f5971ed08c7520d0e9c81f3:11' => 'Apple QuickTime, Quality 1017 (99%)', + '14040c7711b6fa62383da3edc9ade1b7:11' => 'Apple QuickTime, Quality 1018-1020 (99-100%)', + '22ccf9c976b36da34f48385a09b1951b:11' => 'Apple QuickTime, Quality 1021-1023 (100%)', + '4aa632db3be6b6e85565c1fe66cb22d1:11' => 'Apple QuickTime, Quality 1024 (lossless)', + + # Apple Aperture 2.1.3 (ref 2) + '60cb2afa0cfa7395635a9360fc690b46:221111' => 'Apple Aperture Quality 0', + '6b9be09d6ec6491a20c2827dbeb678c0:221111' => 'Apple Aperture Quality 1', + 'dbb17a02e661f2475411fc1dc37902ef:221111' => 'Apple Aperture Quality 2', + '8a5df2b5337bf8251c3f66f6adbb5262:221111' => 'Apple Aperture Quality 3', + '3841f0f3be30520a1a57f41c449588ee:221111' => 'Apple Aperture Quality 4', + '2b1dba266c728a9f46d06e6e5c247953:221111' => 'Apple Aperture Quality 5', + # 'Independent JPEG Group library (used by many applications), Quality 91' => 'Apple Aperture Quality 6', + '93818f3a0e6d491500cb62e1f683da22:221111' => 'Apple Aperture Quality 7', + '8c0c36696a99fd889e0f0c7d64824f3c:221111' => 'Apple Aperture Quality 8', + '043645382c79035b6f2afc62d373a37f:221111' => 'Apple Aperture Quality 9', + '558d017ce6d5b5282ce76727fe99b91e:221111' => 'Apple Aperture Quality 10', + '0b52b82694040193aee10e8074cd7ad5:221111' => 'Apple Aperture Quality 11', + # 'Independent JPEG Group library (used by many applications), Quality 100' => 'Apple Aperture Quality 12', + + # Tested with Corel Paint Shop Pro PHOTO X2 (Win) - Different subsamplings possible + '1c78c0daaa0bbfd4a1678b5569b0fa13' => 'Corel Paint Shop Pro PHOTO, Quality 1', + '5ffdd2e918ec293efc79083703737290' => 'Corel Paint Shop Pro PHOTO, Quality 2', + '4ed4751d772933938600c4e7560bf19c' => 'Corel Paint Shop Pro PHOTO, Quality 3', + 'f647f0fb4320c61f52e2a79d12bbc8cc' => 'Corel Paint Shop Pro PHOTO, Quality 4', + '6194167174dfcb4a769cf26f5c7a018d' => 'Corel Paint Shop Pro PHOTO, Quality 5', + '6120ded86d4cc42cd7ca2131b1f51fad' => 'Corel Paint Shop Pro PHOTO, Quality 6', + 'c07a6430e56ef16a0526673398e87ac6' => 'Corel Paint Shop Pro PHOTO, Quality 7', + '507cc511e561916efa3b49228ffc8c9a' => 'Corel Paint Shop Pro PHOTO, Quality 8', + '612941a50f2c0992938bc13106caf228' => 'Corel Paint Shop Pro PHOTO, Quality 9', + '7624f08396d811fdb6f1ead575e67e58' => 'Corel Paint Shop Pro PHOTO, Quality 10', + 'e215df38e258b3d8bceb57aa64388d26' => 'Corel Paint Shop Pro PHOTO, Quality 11', + '78f66ee0bc442950808e25daa02a2b02' => 'Corel Paint Shop Pro PHOTO, Quality 12', + '14efb0bb5124910a37bcbd5f06de9aa9' => 'Corel Paint Shop Pro PHOTO, Quality 13', + 'd61168238621bd221ef1eb3dcbe270a3' => 'Corel Paint Shop Pro PHOTO, Quality 14', + 'e2d2755891b4e4bc5f7c8d76dcbb0d53' => 'Corel Paint Shop Pro PHOTO, Quality 15', + 'f6c4502144a2e5c82c07994d3cd01665' => 'Corel Paint Shop Pro PHOTO, Quality 16', + '78801638505e95827c2f7cc0c7ef78f4' => 'Corel Paint Shop Pro PHOTO, Quality 17', + 'e8ff3d165b4c028c18ec8a8f940a12a1' => 'Corel Paint Shop Pro PHOTO, Quality 18', + '984c359b9fbcc4d6f805946aa23ae708' => 'Corel Paint Shop Pro PHOTO, Quality 19', + 'd1dc48d911055bc533779d6e086f7242' => 'Corel Paint Shop Pro PHOTO, Quality 20', + 'd7437a18e86ac2832d73204acd82aa89' => 'Corel Paint Shop Pro PHOTO, Quality 21', + 'bceaee6c1a150006b3643de6942ccfa3' => 'Corel Paint Shop Pro PHOTO, Quality 22', + 'c448e6817efa9acdad225e60ed0013f9' => 'Corel Paint Shop Pro PHOTO, Quality 23', + '904f231c98f390400ba7ae17c252813f' => 'Corel Paint Shop Pro PHOTO, Quality 24', + 'ccd6708ca1dbd66a23d40cee635a0f76' => 'Corel Paint Shop Pro PHOTO, Quality 25', + '10d87624d888b75b29e156be8dad35f4' => 'Corel Paint Shop Pro PHOTO, Quality 26', + '8558c6d41f03db192198dceefbd1e89b' => 'Corel Paint Shop Pro PHOTO, Quality 27', + '058fc759cff9d615f91d9ffb4b46436a' => 'Corel Paint Shop Pro PHOTO, Quality 28', + '5c606e0f7168a78fd8d0c91646c801a3' => 'Corel Paint Shop Pro PHOTO, Quality 29', + 'e9555e593a6fd9aeee399de16080cd61' => 'Corel Paint Shop Pro PHOTO, Quality 30', + '2c2726484978a15d3d756d43b0baa290' => 'Corel Paint Shop Pro PHOTO, Quality 31', + '8b1d11d31bc9445278cf9af55b0c156b' => 'Corel Paint Shop Pro PHOTO, Quality 32', + 'aa4a5528ae18ecd36ec052014b91f651' => 'Corel Paint Shop Pro PHOTO, Quality 33', + '9a26194b114b7db253601ff80b03da9a' => 'Corel Paint Shop Pro PHOTO, Quality 34', + '3fa780a3dff1d787f7d883585a46dcfb' => 'Corel Paint Shop Pro PHOTO, Quality 35', + '0a899361ed0d51e224dc535ceb02f9a1' => 'Corel Paint Shop Pro PHOTO, Quality 36', + '3a2ab96a6ad9612e1377ddc822f02ddd' => 'Corel Paint Shop Pro PHOTO, Quality 37', + '315f4faadd967e72d730155091c4912f' => 'Corel Paint Shop Pro PHOTO, Quality 38', + '5f6e3a66672d6e4c41b1689996ca57d3' => 'Corel Paint Shop Pro PHOTO, Quality 39', + '9503a86793e86d1fca3d8797548fa243' => 'Corel Paint Shop Pro PHOTO, Quality 40', + '3b95f11bd77cb8af977c09d5851131f8' => 'Corel Paint Shop Pro PHOTO, Quality 41', + 'ececf8dfa473110534b506db58d98f15' => 'Corel Paint Shop Pro PHOTO, Quality 42', + 'cfe3144d4f8048a0507269a9d8a85993' => 'Corel Paint Shop Pro PHOTO, Quality 43', + 'eb9d48d135b2c61c51fc3f23b0001b4d' => 'Corel Paint Shop Pro PHOTO, Quality 44', + 'b08313a6919d308e50b806f138a8a2a1' => 'Corel Paint Shop Pro PHOTO, Quality 45', + '7c34e6e7fe2cc760fa5c3ed812a8b74c' => 'Corel Paint Shop Pro PHOTO, Quality 46', + '90ece7123e8d614d9aab55eaba6dd7da' => 'Corel Paint Shop Pro PHOTO, Quality 47', + '6d79fe623c4c5320bdbe4d3026f4e71a' => 'Corel Paint Shop Pro PHOTO, Quality 48', + 'a7e85552c3e5e40288891d225f308590' => 'Corel Paint Shop Pro PHOTO, Quality 49', + '67b9a678d9f669167c5b4bf12422ad50' => 'Corel Paint Shop Pro PHOTO, Quality 50', + '1fab112b17e94f53e94a9208e9091b7b' => 'Corel Paint Shop Pro PHOTO, Quality 51', + '4971237e046795a030a99a0e8d2c5acb' => 'Corel Paint Shop Pro PHOTO, Quality 52', + 'f3e1672b93ff159231c51b1b157e45fd' => 'Corel Paint Shop Pro PHOTO, Quality 53', + '6e9cfb8131373c3d1873e3f497e46b64' => 'Corel Paint Shop Pro PHOTO, Quality 54', + '9155c8acf8322e8af898272c694fa1d6' => 'Corel Paint Shop Pro PHOTO, Quality 55', + '52b20edc779f206f2aed50610971f181' => 'Corel Paint Shop Pro PHOTO, Quality 56', + 'ad801813f822ef9774801ab4d9145a61' => 'Corel Paint Shop Pro PHOTO, Quality 57', + '07259679e2a842478df97c7f0ddd4df3' => 'Corel Paint Shop Pro PHOTO, Quality 58', + '67db25c57803c34b065736f46f6afadb' => 'Corel Paint Shop Pro PHOTO, Quality 59', + 'c7498fc4b3802b290a452631dd1e1b63' => 'Corel Paint Shop Pro PHOTO, Quality 60', + '3f7b04c7952f96d2624813ed9896f128' => 'Corel Paint Shop Pro PHOTO, Quality 61', + 'd5ec901d20f3887007d0f4cfb7d1460d' => 'Corel Paint Shop Pro PHOTO, Quality 62', + '61bb38e23040b6a8b0e8721e6d6eff66' => 'Corel Paint Shop Pro PHOTO, Quality 63', + '48fac53d9d168eab3ce9b6edc4b9fcb1' => 'Corel Paint Shop Pro PHOTO, Quality 64', + '8cb101a5ae986e45cc31a9e19a35535d' => 'Corel Paint Shop Pro PHOTO, Quality 65', + '0e08dc629e883530cb2ae78c90f125b3' => 'Corel Paint Shop Pro PHOTO, Quality 66', + '5134762d2d4baac8711a52e76730591c' => 'Corel Paint Shop Pro PHOTO, Quality 67', + '14b57dc6d5381fd0a743c7bd8b28bed1' => 'Corel Paint Shop Pro PHOTO, Quality 68', + '9d398f1b1f40b7aaec1bd9cdb6922530' => 'Corel Paint Shop Pro PHOTO, Quality 69', + 'c7e68d88bee5c2ee4b61a11bc2e68c80' => 'Corel Paint Shop Pro PHOTO, Quality 70', + '917fe67f6ded5decac1820642239622c' => 'Corel Paint Shop Pro PHOTO, Quality 71', + '362c3e0c08f6951018cde7b412cd513f' => 'Corel Paint Shop Pro PHOTO, Quality 72', + 'd91cd4a2dcd1a29e6ef652ebcfdd58d7' => 'Corel Paint Shop Pro PHOTO, Quality 73', + '11f5fbd5e74e5c5e305b95dbbc4356a8' => 'Corel Paint Shop Pro PHOTO, Quality 74', + 'bf010771f909049fc5fceedcaa0f917c' => 'Corel Paint Shop Pro PHOTO, Quality 75', + 'a455a3149812ba6951a016ee6114f9da' => 'Corel Paint Shop Pro PHOTO, Quality 76', + '42e0c4082ec4d026c77d19a053a983f4' => 'Corel Paint Shop Pro PHOTO, Quality 77', + '326bd5938e2db7de9250a9fb0efc6692' => 'Corel Paint Shop Pro PHOTO, Quality 78', + 'a3e2cc4ea95cda49501bc73c494e9420' => 'Corel Paint Shop Pro PHOTO, Quality 79', + '8c89043f00678bb5c68ee90390c1b43b' => 'Corel Paint Shop Pro PHOTO, Quality 80', + 'fc5812ad9a4cd0122eb1c63f0ac3b5a3' => 'Corel Paint Shop Pro PHOTO, Quality 81', + '84dbe33962674aab86e03681ac3bd35f' => 'Corel Paint Shop Pro PHOTO, Quality 82', + 'b6b80a78472dca05c9135702e96fdad9' => 'Corel Paint Shop Pro PHOTO, Quality 83', + '01f997907a4c1dfd1e6b00aca9ff5d80' => 'Corel Paint Shop Pro PHOTO, Quality 84', + '8431e86434062b325c519fd836353cd0' => 'Corel Paint Shop Pro PHOTO, Quality 85', + '15f375a620952738ff21ff4aa496b8f7' => 'Corel Paint Shop Pro PHOTO, Quality 86', + '7b0f02aa96271376d3f81658d98fb1df' => 'Corel Paint Shop Pro PHOTO, Quality 87', + '86e7666b05bd1fc130fbf4b48f854288' => 'Corel Paint Shop Pro PHOTO, Quality 88', + '6af05d547e8911fe2d1f2b4d968a477e' => 'Corel Paint Shop Pro PHOTO, Quality 89', + '8baa876790518bf509dd09093759331d' => 'Corel Paint Shop Pro PHOTO, Quality 90', + 'eb7d90d291044d1bd8f40ca1b3ce0ddf' => 'Corel Paint Shop Pro PHOTO, Quality 91', + '6f338385a8f2cd2dd3420a4f6138a206' => 'Corel Paint Shop Pro PHOTO, Quality 92', + 'b0a0fd1ec2dd366ad00d3e83d6dedec2' => 'Corel Paint Shop Pro PHOTO, Quality 93', + 'e09026128c9880b44ac71224f477cd3b' => 'Corel Paint Shop Pro PHOTO, Quality 94', + 'd0a8f50ff547da69a57eeb892e194cff' => 'Corel Paint Shop Pro PHOTO, Quality 95', + '7849ba902d96273b5ac7b6eb98f4d009' => 'Corel Paint Shop Pro PHOTO, Quality 96', + '379f9f196d4190298a732ab9a7031001' => 'Corel Paint Shop Pro PHOTO, Quality 97', + 'c3d1601f84ec3adfbc8ca17883ef6378' => 'Corel Paint Shop Pro PHOTO, Quality 98', + '1f5e87bec674bdd7dff166c2ea9ca004' => 'Corel Paint Shop Pro PHOTO, Quality 99', + + # Tested with FixFoto Version 2.90 Build 136 (Win) - different subsamplings possible + '866dd04cb0fe2e00cda7395162480117' => 'FixFoto, Quality 0 or 1', + '1e400ba25fa835e2771772bbfb15b94b' => 'FixFoto, Quality 2', + '302ff1ad1a50d0f01a82cc88f286c649' => 'FixFoto, Quality 3', + '1343a117f5fab26d556a3e7558366591' => 'FixFoto, Quality 4', + '8fbb8cc5368224625689df80bf4d2a04' => 'FixFoto, Quality 5', + 'a371d1ffc8d85d502854a356f3b0ea74' => 'FixFoto, Quality 6', + 'a9a0a5000cd6fb322960a4c45cf1d032' => 'FixFoto, Quality 7', + 'aaac84043224d33e1d3a1723b653b0cd' => 'FixFoto, Quality 8', + '701e4820f6d0b68e67b6a2b90a7baa0c' => 'FixFoto, Quality 9', + '877d03a5abf5b6c4ad03c39afd97f4a2' => 'FixFoto, Quality 10', + 'b3d9bdc2090200537fb42f4d69631150' => 'FixFoto, Quality 11', + '3cf156d54120b53057f56e9f38ee2896' => 'FixFoto, Quality 12', + '69fe5c29b9d5e4c823f8a082ab7b3285' => 'FixFoto, Quality 13', + 'cf8573af40ced1793dcbc2346f969240' => 'FixFoto, Quality 14', + '22944c3bc03d6adea8d6819f914452c3' => 'FixFoto, Quality 15', + 'd768df38fb51c4b9977e5d7185f97a6c' => 'FixFoto, Quality 16', + '7ef2cd2b66d51fe80d94d5db427ee9ef' => 'FixFoto, Quality 17', + 'ed3d3b9ff9faf0009e44b9803f6295d7' => 'FixFoto, Quality 18', + '70a0b15e2e5f97e0a9333a2011afe5cd' => 'FixFoto, Quality 19', + 'd798b707a6b83eb54664abe0833b46aa' => 'FixFoto, Quality 20', + 'bf68d1866b75cea8f99cf2fc46f9d686' => 'FixFoto, Quality 21', + 'b98b8adb8f1f78b65800efe6c329ceab' => 'FixFoto, Quality 22', + 'c063344185079018af9fcf161a3fdf98' => 'FixFoto, Quality 23', + + # Tested with Nikon Capture NX Version 2.0.0 (Win) + '0ef9d9f62ab68807eedf6cb8c2ec120b:221111' => 'Nikon Capture NX, Quality 0', + 'efbc50df45bc1d1fbbbd29c3e5de04b2:221111' => 'Nikon Capture NX, Quality 1', + 'cbde745c78fd546d6e83dd7512ebe863:221111' => 'Nikon Capture NX, Quality 2', + '33731f743fc28e9d81e542f0ed7cdfba:221111' => 'Nikon Capture NX, Quality 3', + '866fcb1296d7da02b4ad31afb242f25f:221111' => 'Nikon Capture NX, Quality 4', + 'cfbe44397240092d3a67241a23342528:221111' => 'Nikon Capture NX, Quality 5', + 'a4b8b3408ae302ae81f125e972901131:221111' => 'Nikon Capture NX, Quality 6', + '3a6cefd4f43c513fdf0858f26afeab5a:221111' => 'Nikon Capture NX, Quality 7', + '1e861ce223babf95bc795e18cbdb49d1:221111' => 'Nikon Capture NX, Quality 8', + '4d5b512d8bc173f14e6a3cf8574f670a:221111' => 'Nikon Capture NX, Quality 9', + '9b1e6d379d3030dfa313bcaedc1ef3c7:221111' => 'Nikon Capture NX, Quality 10', + 'e39b60fcecf3221d14c62dc13ddf4726:221111' => 'Nikon Capture NX, Quality 11', + '3654bbf4a45e0c0758a82a075b3f77cc:221111' => 'Nikon Capture NX, Quality 12', + '4f5889173779409ec604622a1894ab4a:221111' => 'Nikon Capture NX, Quality 13', + '738685b86b80ff0e8b562102d1b58f71:221111' => 'Nikon Capture NX, Quality 14', + '48a53035374c08e6490893d8113ed6b3:221111' => 'Nikon Capture NX, Quality 15', + '03651ac1d15043f77949a63ac3762584:221111' => 'Nikon Capture NX, Quality 16', + '27811b28d02bd417857904f0a9e1ed58:221111' => 'Nikon Capture NX, Quality 17', + '03201bd5642a451d99b99bfd10fc42df:221111' => 'Nikon Capture NX, Quality 18', + '67d5eb5f55c9a5baa0a67d42a841d77b:221111' => 'Nikon Capture NX, Quality 19', + '18392b08bf8cf788a579f376297c3334:221111' => 'Nikon Capture NX, Quality 20', + 'de0c784b75953851dc370f4daecfa1a9:221111' => 'Nikon Capture NX, Quality 21', + '75f260644b87a9779188126da8709e7f:221111' => 'Nikon Capture NX, Quality 22', + 'c44701e8185306f5e6d09be16a2b0fbd:221111' => 'Nikon Capture NX, Quality 23', + '086e5ce1149e14efd9e424956734fe05:221111' => 'Nikon Capture NX, Quality 24', + 'aad1109d9c49b8170feac125148b2a50:221111' => 'Nikon Capture NX, Quality 25', + 'c97965ce5392623f668a386b30e41cee:221111' => 'Nikon Capture NX, Quality 26', + 'd9dadfb6f0a25765abe00e69857c5520:221111' => 'Nikon Capture NX, Quality 27', + '0ee9ca02a1fe8a17b6e50a2e86d19a7c:221111' => 'Nikon Capture NX, Quality 28', + '88b1726a20759f29eecfa2b129773127:221111' => 'Nikon Capture NX, Quality 29', + '70a311935ed066da954897fad5079377:221111' => 'Nikon Capture NX, Quality 30', + 'aa2d374bbab2a30e00c1863264588a42:221111' => 'Nikon Capture NX, Quality 31', + '097b684846696b3a8bbdf2bd2f9ded9c:221111' => 'Nikon Capture NX, Quality 32', + 'bb313d5398065376c7765092fc8ea0f0:221111' => 'Nikon Capture NX, Quality 33', + 'aa049fdc1387851a664143df0408f55c:221111' => 'Nikon Capture NX, Quality 34', + '087c1c1a368adc82900d83235f432d3f:221111' => 'Nikon Capture NX, Quality 35', + '7dec6568dbad7a70622c994a326957e2:221111' => 'Nikon Capture NX, Quality 36', + 'd2e14d8ba7d38f7544b569eea7221255:221111' => 'Nikon Capture NX, Quality 37', + 'ce6bcb98c5f9358594f5934e64b4ecc3:221111' => 'Nikon Capture NX, Quality 38', + '4785aafc8471873402819e423b8969a9:221111' => 'Nikon Capture NX, Quality 39', + '66ae78a749b520b35d4daf4531df8ae5:221111' => 'Nikon Capture NX, Quality 40', + '946d9f9346a0c65eec478945ad3d6143:221111' => 'Nikon Capture NX, Quality 41', + 'f46e96afa026233c1662c9114feb61e9:221111' => 'Nikon Capture NX, Quality 42', + '96a267e050b6d8a13439f8a9bb89722c:221111' => 'Nikon Capture NX, Quality 43', + '27c301566e155f700b01906a43473ffe:221111' => 'Nikon Capture NX, Quality 44', + 'ceff136f6dd88242500bfd639cb0c003:221111' => 'Nikon Capture NX, Quality 45', + '939b804eefc95158a934bb48e3f3b545:221111' => 'Nikon Capture NX, Quality 46', + '06186292fe0ccaaeb5999319a366c4b4:221111' => 'Nikon Capture NX, Quality 47', + 'e456c998dc126c1efad013eb7b0186c1:221111' => 'Nikon Capture NX, Quality 48', + 'ef0cd1902fb1afe284468a67eaffd078:221111' => 'Nikon Capture NX, Quality 49', + 'f4693035f8db19e0788f41255c3c052e:221111' => 'Nikon Capture NX, Quality 50', + '40c6f2886cdca8f19a654ce321ea993e:221111' => 'Nikon Capture NX, Quality 51', + 'e9387b4065bba8570375d6535ab2124b:221111' => 'Nikon Capture NX, Quality 52', + 'f3a55e422a4ab829b2c1f5a1784ce9f6:221111' => 'Nikon Capture NX, Quality 53', + '2fff3c6e48247992d1543d9e5c679759:221111' => 'Nikon Capture NX, Quality 54', + '5a1849b49122ff09949f1d355b4f9eaa:221111' => 'Nikon Capture NX, Quality 55', + 'a582968bb1890620ffbae916ebafcb64:221111' => 'Nikon Capture NX, Quality 56', + '81597eb992e32e186d2b5565bbe4ae3a:221111' => 'Nikon Capture NX, Quality 57', + '7364416ce4f2a9282efdbe052574527b:221111' => 'Nikon Capture NX, Quality 58', + '5301c2bcae09fd4305e47ffc56b2c8a7:221111' => 'Nikon Capture NX, Quality 59', + '5a1849b49122ff09949f1d355b4f9eaa:211111' => 'Nikon Capture NX, Quality 60', + '9be2446f168941ff42d9fc7441f2429b:211111' => 'Nikon Capture NX, Quality 61', + 'bbba80e58afae43278e287021d4f1499:211111' => 'Nikon Capture NX, Quality 62', + '2a9ae394dc32a418960522cbe9c6df24:211111' => 'Nikon Capture NX, Quality 63', + '67fbe0dce139b6db1813e30bbbceccf3:211111' => 'Nikon Capture NX, Quality 64', + '17bce376f588ebf2b3e9002a337c239d:211111' => 'Nikon Capture NX, Quality 65', + 'cd2c6c01d8eb8d985086b54e2269278a:211111' => 'Nikon Capture NX, Quality 66', + '34b25782fc089616807bbbe7f7cd8413:211111' => 'Nikon Capture NX, Quality 67', + '37b8bbab382a228eabb0dc64c0edcb0f:211111' => 'Nikon Capture NX, Quality 68', + 'b163f35baed567d70aa2536695558724:211111' => 'Nikon Capture NX, Quality 69', + '251eb2d7903f63b168348ec483ba499a:211111' => 'Nikon Capture NX, Quality 70', + '42e7cdf33b9067a7124dd27020704f9a:211111' => 'Nikon Capture NX, Quality 71', + '032678d9de74e5530896c28079f666af:211111' => 'Nikon Capture NX, Quality 72', + '30d7b6db02954dfc4ce47a089d0f40d9:211111' => 'Nikon Capture NX, Quality 73', + '5c1a40094128ac76eab0405dcb4ae3c7:211111' => 'Nikon Capture NX, Quality 74', + '2706b8b0cf6686148e285b6d3e44dd72:211111' => 'Nikon Capture NX, Quality 75', + '6ca4a27cb36f35ab84b0e2df06bb32f4:211111' => 'Nikon Capture NX, Quality 76', + '6f9cae52d3f47f514f7c927314455a5a:211111' => 'Nikon Capture NX, Quality 77', + 'c0204862b8aafa2c286c7b58d755c31f:211111' => 'Nikon Capture NX, Quality 78', + 'd8ef40736b072f09bead5f73f5ec1372:211111' => 'Nikon Capture NX, Quality 79', + '8c389c29eca238b3b331f65f7e124a27:111111' => 'Nikon Capture NX, Quality 80', + '6f9cae52d3f47f514f7c927314455a5a:111111' => 'Nikon Capture NX, Quality 81', + '8e1ceace8fafe31282393d8677e76994:111111' => 'Nikon Capture NX, Quality 82', + '60f75a915647ed50d1724179d50a35d2:111111' => 'Nikon Capture NX, Quality 83', + 'df54eb20ec90f41f1e6c37e241ee381c:111111' => 'Nikon Capture NX, Quality 84', + '5522213c915e2af3ad01ee2ec27ee3ed:111111' => 'Nikon Capture NX, Quality 85', + '08c063f0997262d9977df4b44e682d82:111111' => 'Nikon Capture NX, Quality 86', + 'd2e34c70872ac119dda6bdeeb36bf229:111111' => 'Nikon Capture NX, Quality 87', + 'e5abf48ce0cc2b4a3db7eca3a1112b7a:111111' => 'Nikon Capture NX, Quality 88', + 'b69dcb672088f296323d891219464ad8:111111' => 'Nikon Capture NX, Quality 89', + 'b6d1c6efb27ea721577888b5f981ad7b:111111' => 'Nikon Capture NX, Quality 90', + 'b023f424f81c8cbbab20119c06163dce:111111' => 'Nikon Capture NX, Quality 91', + '77f680490d08697cb0f11ff3fe76b7e8:111111' => 'Nikon Capture NX, Quality 92', + '1860106097672532e7ebc2026d7f9681:111111' => 'Nikon Capture NX, Quality 93', + '0c7d4861b3bee5d766a93f2d34027bfa:111111' => 'Nikon Capture NX, Quality 94', + '3adf9a0b85a4000243bbf833cd8e6966:111111' => 'Nikon Capture NX, Quality 95', + '9530dfffc5574606841a597212ec25b4:111111' => 'Nikon Capture NX, Quality 96', + 'c7294290fe26155147072f9041705cfb:111111' => 'Nikon Capture NX, Quality 97', + 'c24c44a4dadd77c15e0b4c741a2d4bd5:111111' => 'Nikon Capture NX, Quality 98', + '36016cd5527c505ef3bbba8b3e22f9db:111111' => 'Nikon Capture NX, Quality 99', + 'c9309ab058680151be5f97e6c54dc687:111111' => 'Nikon Capture NX, Quality 100', + + # Tested with ACDsee PhotoEditor 4.0.208c-de (Win) + '2ab2f6a116ca6fc0bbf188b19b9de967' => 'ACD Systems Digital Imaging, Quality 0 or 1', + 'f4f9d5c07c78e8700a6f3def0782a18e' => 'ACD Systems Digital Imaging, Quality 2', + '66fc410ab8f71a7fdef86fd70b742dc1' => 'ACD Systems Digital Imaging, Quality 3', + '8e763b5b9255df1f4cb7b9732e99c210' => 'ACD Systems Digital Imaging, Quality 4', + 'fd3eed19f6667ab0bedfa3263390ce25' => 'ACD Systems Digital Imaging, Quality 5 or 6', + 'dc0dc92085037072e27247f64af0f22d' => 'ACD Systems Digital Imaging, Quality 7', + '233ed690eb7e9008c20ed16e79aa3eb5' => 'ACD Systems Digital Imaging, Quality 8', + '684649f6c1590f5a912a827a6d8bfc6b' => 'ACD Systems Digital Imaging, Quality 9', + 'ed6aec096e8776b483b2c2b3d7e15d76' => 'ACD Systems Digital Imaging, Quality 10 or 11', + '9cd85933ddb1101d9b859a19e9a30334' => 'ACD Systems Digital Imaging, Quality 12', + '222a8769205a592ec834b6f5fc654a21' => 'ACD Systems Digital Imaging, Quality 13', + '29f957e2a0af0f44d271c3c4e27eec4b' => 'ACD Systems Digital Imaging, Quality 14', + 'c46c764191f9c3db2bfe8d134512bcd8' => 'ACD Systems Digital Imaging, Quality 15 or 16', + '56caa684ce7eb0b1cf662e1c88ed1614' => 'ACD Systems Digital Imaging, Quality 17', + 'cedc5208c6e1cbffd8be0e47bfd76698' => 'ACD Systems Digital Imaging, Quality 18', + 'dec0717305bae8309a934e1d6a251d88' => 'ACD Systems Digital Imaging, Quality 19', + '8c85e0e8f41257e2cd739a5b158ec218' => 'ACD Systems Digital Imaging, Quality 20 or 21', + '6ae7ab4e6d5e0e67006cca59c70f843c' => 'ACD Systems Digital Imaging, Quality 22', + '840be626ed18db6cdef3c5c357e24d34' => 'ACD Systems Digital Imaging, Quality 23', + 'd48c2b9e514e25fcc4b3f2408d168d72' => 'ACD Systems Digital Imaging, Quality 24', + 'b9eb63b89c80c71f4eac8c6e27d272f1' => 'ACD Systems Digital Imaging, Quality 25 or 26', + 'bcd4d36a9db91a51d1a571f71f8230d4' => 'ACD Systems Digital Imaging, Quality 27', + 'ac2f66ab2559019fcf021b9a32b049ab' => 'ACD Systems Digital Imaging, Quality 28', + '4208fca702ec702bd5d41c8231883057' => 'ACD Systems Digital Imaging, Quality 29', + 'fa620c67ab09a4c0d1c5b8e65ade361e' => 'ACD Systems Digital Imaging, Quality 30 or 31', + '679dea81c8d4563e07efac4fab6b89ca' => 'ACD Systems Digital Imaging, Quality 32', + '43ceb0c1a5d94d55ee20dc3a168498b2' => 'ACD Systems Digital Imaging, Quality 33', + 'a9cc8a19ae25bc024c3d92d84c13c7a5' => 'ACD Systems Digital Imaging, Quality 34', + 'e3e7280c8a9e82d31e22d24d5b733580' => 'ACD Systems Digital Imaging, Quality 35 or 36', + 'a06d250213e349005897bd6fa5bebca8' => 'ACD Systems Digital Imaging, Quality 37', + '40d08b823fa60b838dd9998d1e2b550a' => 'ACD Systems Digital Imaging, Quality 38', + '4998abefc838e35cf0180395309e2e33' => 'ACD Systems Digital Imaging, Quality 39', + '280205c47c8d3706c2f36b1986e9b149' => 'ACD Systems Digital Imaging, Quality 40 or 41', + '8534b67f8115ddc0296623a1ed3fc8ec' => 'ACD Systems Digital Imaging, Quality 42', + '292b83b37765408b65f496cddd3f96ea' => 'ACD Systems Digital Imaging, Quality 43', + 'cae0c8eb9a11a1f6eb7eca9651d8dbc0' => 'ACD Systems Digital Imaging, Quality 44', + '078db0d0bffafa44def2e8b85eec26f6' => 'ACD Systems Digital Imaging, Quality 45 or 46', + '6a26a11cc28df00e01d5979e2e0fb4f7' => 'ACD Systems Digital Imaging, Quality 47', + 'b41b3d226ba21244b8070ba719ec721a' => 'ACD Systems Digital Imaging, Quality 48', + '9a8a54328e297faa0a546c46145c9aa8' => 'ACD Systems Digital Imaging, Quality 49', + '256e617be51dade18503fcbbe87cd4a6' => 'ACD Systems Digital Imaging, Quality 50 or 51', + '064f160a8504465551738c9071f3850f' => 'ACD Systems Digital Imaging, Quality 52', + '5aef4c0bc6a5c8f1baded29946a56310' => 'ACD Systems Digital Imaging, Quality 53', + 'c20f4841a1ff7e393af8f6ea4124403c' => 'ACD Systems Digital Imaging, Quality 54', + '14afe9b58e0eacef42db61e1d7fdd09c' => 'ACD Systems Digital Imaging, Quality 55 or 56', + '147598404233439485574200e253f88e' => 'ACD Systems Digital Imaging, Quality 57', + '17479c1e73d2c062872c871db80d949b' => 'ACD Systems Digital Imaging, Quality 58', + 'd237b1202f88ba8183bc1cb69dd4be66' => 'ACD Systems Digital Imaging, Quality 59', + 'fc923f2d38e0e549134e1ec86f58149a' => 'ACD Systems Digital Imaging, Quality 60 or 61', + '93b4929d4a3b955f4996ab7e3b6fbe53' => 'ACD Systems Digital Imaging, Quality 62', + '054f418c24a6a733186a27aa739dc93a' => 'ACD Systems Digital Imaging, Quality 63', + '0df2be705ae86e5de1e508db95efb182' => 'ACD Systems Digital Imaging, Quality 64', + 'c1978a445de1173b5039b0cf8d8a91fe' => 'ACD Systems Digital Imaging, Quality 65 or 66', + '3d8e25b74d0d9be662f26ec5fed6fe94' => 'ACD Systems Digital Imaging, Quality 67', + '8887b718c97e0d80ed8d9a198387e2eb' => 'ACD Systems Digital Imaging, Quality 68', + '8cdb9100cfbb246d440d469e72ce37a6' => 'ACD Systems Digital Imaging, Quality 69', + '379efafa6e71a90ccfcb57073d0bc5c8' => 'ACD Systems Digital Imaging, Quality 70 or 71', + 'e1e122ebb2733a5ccdb5ff1cdce86d4d' => 'ACD Systems Digital Imaging, Quality 72', + '41dd47887a2b87e22ad3bbacc022374e' => 'ACD Systems Digital Imaging, Quality 73', + 'a0a30c816d5d47a91c66e5645eb5fdb8' => 'ACD Systems Digital Imaging, Quality 74', + '731f7ffedba80407d039c1db5a785f95' => 'ACD Systems Digital Imaging, Quality 75 or 76', + '7cfd092a41a0e1c029e82467cb4c034f' => 'ACD Systems Digital Imaging, Quality 77', + 'f1b005980104aac41b49973beed9c8c2' => 'ACD Systems Digital Imaging, Quality 78', + 'ba12dbfbd652c9cde69822996bdb2139' => 'ACD Systems Digital Imaging, Quality 79', + 'd3784280d08a8df51e607bde8c8b5ead' => 'ACD Systems Digital Imaging, Quality 80 or 81', + '7ed560efea0b44168d910a73fab9204c' => 'ACD Systems Digital Imaging, Quality 82', + 'deaa8bbd7c5414b93d8029aa14a76d3a' => 'ACD Systems Digital Imaging, Quality 83', + '9ae3a57ce98290176c4700baaff5661f' => 'ACD Systems Digital Imaging, Quality 84', + 'cb99b9bd30ae36929755fee9208ab36b' => 'ACD Systems Digital Imaging, Quality 85 or 86', + '75ff62bbf17aa1762dd15677e961ce67' => 'ACD Systems Digital Imaging, Quality 87', + 'd4f1922c71a6c96a530a9a8268fbc63b' => 'ACD Systems Digital Imaging, Quality 88', + 'ec994ef421efd6bc78671858b9f942ad' => 'ACD Systems Digital Imaging, Quality 89', + '5ca52e1ffe2c84660d7377c33c88ad53' => 'ACD Systems Digital Imaging, Quality 90 or 91', + '5522213c915e2af3ad01ee2ec27ee3ed' => 'ACD Systems Digital Imaging, Quality 92', + '21aa1a0036251eecfffd24e37d7ce3dd' => 'ACD Systems Digital Imaging, Quality 93', + '3233b63fc39fbbaa9af364e8a33862ff' => 'ACD Systems Digital Imaging, Quality 94', + '1860106097672532e7ebc2026d7f9681' => 'ACD Systems Digital Imaging, Quality 95 or 96', + '0c7d4861b3bee5d766a93f2d34027bfa' => 'ACD Systems Digital Imaging, Quality 97', + 'c9309ab058680151be5f97e6c54dc687' => 'ACD Systems Digital Imaging, Quality 98', + 'ffe6bb565b2c9008ab917c57ba94cd67' => 'ACD Systems Digital Imaging, Quality 99', + 'd6390cc36d2f03c1d2dd13d6910ca46b' => 'ACD Systems Digital Imaging, Quality 100; Pentax K20D/OptioE60 Premium', + + # StereoPhoto Maker Version 3.25 - Option "No compression ghosting" activated + '185893c53196f6156d458a84e1135c43:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 1', + 'b41ccbe66e41a05de5e68832c07969a7:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 2', + 'efa024d741ecc5204e7edd4f590a7a25:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 3', + '3396344724a1868ada2330ebaeb9448e:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 4', + '14276fffb98deb42b7dbce30abb8425f:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 5', + 'a99e2826c10d0922ce8942c5437f53a6:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 6', + '0d3de456aa5cbb8a2578208250aa9b88:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 7', + 'fa987940fdedbe883cc0e9fcc907f89e:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 8', + '1c9bb67190ee64e82d3c67f7943bf4a4:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 9', + '57d20578d190b04c7667b10d3df241bb:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 10', + '619fd49197f0403ce13d86cffec46419:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 11', + '327f47dd8f999b2bbb3bb25c43cf5be5:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 12', + 'e4e5bc705c40cfaffff6565f16fe98a9:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 13', + '6c64fa9ad302624a826f04ecc80459be:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 14', + '039a3f0e101f1bcdb6bb81478cf7ae6b:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 15', + 'c23b08c94d7537c9447691d54ae1080c:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 16', + '200107bc0174104bbf1d4653c4b05058:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 17', + '72abfdc6e65b32ded2cd7ac77a04f447:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 18', + '1799a236c36da0b30729d9005ca7c7f9:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 19', + 'c33a667bff7f590655d196010c5e39f3:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 20', + 'b1dc98f6a2f8828f8432872da43e7d94:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 21', + '07318a0acfebe9086f0e04a4c4f5398a:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 22', + 'a295b7163305f327a5a45ae177a0a19c:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 23', + 'c741c1b134cf81ab69acc81f15a67137:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 24', + 'a68893776502a591548c7b5bece13e1b:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 25', + '111848d9e41f6f408ef70841f90c0519:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 26', + '886374ceebcfd4dfed200b0b34b4baca:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 27', + '666dd95fd0e20f5c20bc44d78d528869:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 28', + '1aa58cb85dda84de2ddf436667124dcd:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 29', + '9d321ab2bdda6f3cb76d2d88838aa8c3:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 30', + '6ad87d648101c268f83fa379d4c773f2:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 31', + 'cdf8e921300f27a4af7661a2de16e91a:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 32', + '3f48672e37b6dd2e571b222e4b7ff97d:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 33', + 'a53a7d4cc86d01f4c1b867270c9c078f:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 34', + '09ec03f5096df106c692123f3fd34296:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 35', + 'a946498fd1902c9de87a1f5182966742:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 36', + '5d650a1d38108fd79d4f336ba8e254c2:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 37', + '81d620f1b470fd535b26544b4ea20643:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 38', + '892788bdf8cbef5c6fbd7019a079bf8e:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 39', + 'cf3929fd4c1e5c28b7f137f982178ad1:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 40', + '31f288945896ed839f1d936bff06fb03:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 41', + 'e0c38f0c5e6562445d4e92bae51713be:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 42', + '18fa29d1164984883a6af76377b60d5a:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 43', + 'eff737b226fbce48c42625c5bf9dabb6:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 44', + 'b900f91ee8697255d5daebce858caaeb:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 45', + 'ab2f8513823067af242f7e3c04a88a9c:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 46', + '60b682c4d412f5255efbaa32787c46ca:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 47', + 'ea50813e06203c2ad1165252bcb99a1d:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 48', + 'f6308a717437d3653b0751ebf511db0f:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 49', + '7c8242581553e818ef243fc680879a19:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 50', + 'fc41ab8251718977bc6676f502f457e0:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 51', + '606c4c78c0226646bf4d3c5a5898fb17:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 52', + '0e6c6a5440d33d25f1c25836a45cfa69:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 53', + '7464b2361e5b5f5a9ba74a87475dda91:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 54', + 'aeaa2ca48eabb3088ebb713b3c4e1a67:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 55', + '3f36450b0ba074578391e77f7340cef0:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 56', + 'be232444027e83db6f8d8b79d078442e:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 57', + '712c145d6472a2b315b2ecfb916d1590:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 58', + 'ae3dd4568cc71c47d068cf831c66b59d:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 59', + 'b290e52c21a435fede4586636ef5e287:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 60', + 'a09ca4c4391e0221396a08f229a65f9d:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 61', + '0818578fc5fc571b4f8d5ffefc9dc0d8:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 62', + '7c685e2916555eda34cb37a1e71adc6a:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 63', + '69c6b9440342adfc0db89a6c91aba332:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 64', + 'd5d484b68e25b44288e67e699829695c:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 65', + 'de8310d09116a7a62965f3e0e43ef525:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 66', + 'e4735f63e88baf04599afc034e690845:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 67', + 'b4ef810b14dee9c6d6d8cace98f799a6:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 68', + '52886ef80147c9a136e20b2bc3b76f52:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 69', + '9c62dbc848be82ef91219ba9843998be:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 70', + 'bfe8c1c73eea84b85673487a82f67627:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 71', + 'ea445840d29c51009a2a8cd49b96ccee:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 72', + '71c1a56890fff9b0a095fa5a1c96132b:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 73', + 'f080b02331ac8adf03de2281042d2b49:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 74', + 'd0eaa368737f17f6037757d393a22599:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 75', + '303663905d055b77bb547fe0b0beb9c5:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 76', + '5cdf1d5bbe19375ad5c7237273dddede:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 77', + 'd64e7ff8292fd77131932864d3c9ce7c:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 78', + '12b4cc13891c5aef3dadb3405b6fa65d:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 79', + 'b008cd63591f8fd366f77d2b224b9c9c:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 80', + '49b6e472c7d5ecead593c6009768e765:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 81', + 'bce6fa61623ad4f65ff3fec1528cb026:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 82', + 'c2b037bf9f5e5baba804d7bbbb2dc73b:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 83', + '7fe7b339c6ffc62b984eeab4b0df9168:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 84', + '274bbeb0ac3939f90c578ebb1f5a9eef:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 85', + '0a0268c655d616b0e4af2851533aa3af:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 86', + '52318e260c0d6b3dbee85c87f9b94e63:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 87', + 'b64cc19a0f81a506ed5bcfb9c131c8fe:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 88', + 'd8c54333eb475b8db9f32f11fe96337e:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 89', + '12fe6b9bfd20f4d7f0ac2a221c566c45:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 90', + '12aefbf7689633c83da714c9f0e90e05:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 91', + 'a3a96add050fc51a2b3ce59a9a491034:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 92', + '7b0242bd9aaeab4962f5d5b39b9a4027:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 93', + '12fc29c1d8940c93a47ee9d927a17561:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 94', + 'e1fedef5184beeb7b0f5c055c7ae1d31:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 95', + 'ae9202355f603776794d3e62c43578d6:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 96', + '36da00bae6cd81d1f97e32748c07e33f:111111' => 'StereoPhoto Maker, No compression ghosting, Quality 97', + + # Tested with FujiFilm FinePixViewer Ver 5.4.11G (Win) + '3a8a34631e388e39d13616d003f05957:211111' => 'FinePixViewer, Basic', + 'b6a2598792fd87b7eb0c094cbd52862f:211111' => 'FinePixViewer, Fine', + '4ee61c39b97558a273f310e085d0bdd2:211111' => 'FinePixViewer, Normal', + + # Tested with Canon Digital Photo Professional Version 3.4.1.1 (Win) + '252482232ff1c8cf77db4f0c6402f858:211111' => 'Canon Digital Photo Professional, Quality 1', + 'ec6c55677b94970bc09f70265f1d5b55:211111' => 'Canon Digital Photo Professional, Quality 2', + 'a1085c167f1cd610258fe38c8a84a8b9:211111' => 'Canon Digital Photo Professional, Quality 3', + '8ab1119f4ed4941736cb8ec1796f5674:211111' => 'Canon Digital Photo Professional, Quality 4', + 'e66c03f97b19213f385136f014c78ac1:211111' => 'Canon Digital Photo Professional, Quality 5', + 'a2f4b6ac52f87791380bdfe38ae333e1:211111' => 'Canon Digital Photo Professional, Quality 6', + 'fe85b802c5779dcf45ea4bb7749ee886:211111' => 'Canon Digital Photo Professional, Quality 7', + '35686967efa5fb333fb8f4844efc33a3:211111' => 'Canon Digital Photo Professional, Quality 8', + 'a5894172d7ec5f0c1550934c9e9385c9:211111' => 'Canon Digital Photo Professional, Quality 9', + 'd6390cc36d2f03c1d2dd13d6910ca46b:211111' => 'Canon Digital Photo Professional, Quality 10', + + # Tested with Canon ZoomBrowser EX 6.1.1.21 (Win) + 'e66c03f97b19213f385136f014c78ac1:211111' => 'Canon ZoomBrowser, Low', + 'bf72e4d4aacbdaeb86fd3f67c8df2667:211111' => 'Canon ZoomBrowser, Medium', + 'd6390cc36d2f03c1d2dd13d6910ca46b:211111' => 'Canon ZoomBrowser, Highest', + 'aeb34eb083acc888770d65e691497bcf:211111' => 'Canon ZoomBrowser, High', + + # Tested with PENTAX PHOTO Laboratory 3.51 (Win) + '76d958276bf2cac3c36b7d9a677094a7:211111' => 'PENTAX PHOTO Laboratory, Highest compression', + 'bf72e4d4aacbdaeb86fd3f67c8df2667:211111' => 'PENTAX PHOTO Laboratory, High compression', + 'fa8720d025f2a164542b6a8e31112991:211111' => 'PENTAX PHOTO Laboratory, Medium quality', + 'f3235a7d187d083b7b7ead949653f730:211111' => 'PENTAX PHOTO Laboratory, High quality', + 'd6390cc36d2f03c1d2dd13d6910ca46b:211111' => 'PENTAX PHOTO Laboratory, Highest quality', + + # Tested with Sony Image Data Converter SR Version 2.0.00.08150 (Win) + 'd6390cc36d2f03c1d2dd13d6910ca46b:211111' => 'Sony Image Data Suite, Quality 1 (high quality)', + 'aeb34eb083acc888770d65e691497bcf:211111' => 'Sony Image Data Suite, Quality 2', + '524742ca0cff64ecc0c7d7413e7d4b8d:211111' => 'Sony Image Data Suite, Quality 3', + 'c44701e8185306f5e6d09be16a2b0fbd:211111' => 'Sony Image Data Suite, Quality 4 (high compression)', + + # Devices + + # Canon + '0147c5088beb16642f9754f8671f13b3:211111' => 'Canon PowerShot, Fine', + '586b40c7d4b95e11309636703e81fbe9:211111' => 'Canon EOS 20D, Fine', + '6640ae3bb6f646013769b182c74931b5:211111' => 'Canon PowerShot, Normal', + '83d6d7dd7ace56feeeb65b88accae1bc:211111' => 'Canon PowerShot, Normal Small', + 'b8548a302585d78a0c269b54bff86541:211111' => 'Canon PowerShot, Fine Small', + '9d125046484461bbc155d8eff6d4e8f0:211111' => 'Canon PowerShot, Superfine (A430/A460)', + '0e618a0e79b4d540da1f6e07fcdce354:211111' => 'Canon PowerShot, Superfine Small', + 'd255f70a910a2d0039f4e792d2c01210:211111' => 'Canon PowerShot, Superfine Medium2', + '8bc267b04a54c02fdee1f4fdf0bcce83:211111' => 'Canon EOS 1DmkIII/5DmkII/40D/1000D, Fine', + '17cb779485969589a5c7eb07a5d53247:211111' => 'Canon EOS 1DmkIII, Fine (pre-production)', + 'ee1c033afaf4cd5263ff2b1c1ff8966c:211111' => 'Canon PowerShot, Superfine', + 'a92912eb3c81e5c873d49433264af842:211111' => 'Canon EOS 30D/40D/50D/300D, Normal', + '0cec88a0cd8fe35720e78cdcdbdadef6:121111' => 'Canon EOS 1DmkII, Fine (A)', + '72cdcc91e3ddc2c3d17c20173b75c5ef:211111' => 'Canon EOS 1DmkII, Fine (B)', + '483b5288e4256aa8ff96d6ccb96eba43:211111' => 'Canon EOS 1DmkII, Fine (C)', + 'ea2f997a0261bab501bf122b04cbc859:211111' => 'Canon EOS 1DSmkII, Fine', + '98af13526b7e4bbf73a9fb11a8fa789d:121111' => 'Canon EOS 1DSmkII, Fine (vertical)', + '9e6abfb26d3b95b8cd2f710e78def947:121111' => 'Canon EOS 300D, Fine (vertical)', + '4d6b36e81fe30c67dd53edb4d7c05422:121111' => 'Canon EOS 40D, Fine (vertical)', + '92c1557deaa14f1cdaf92cf0531487f1:121111' => 'Canon EOS 1D/1DS, Fine', + 'db8d4df12405d0d69eb25f06a963ac5b:211111' => 'Canon DV', + 'eaead98bbdfde35210f48286662e8ad2:211111' => 'Canon DV Hi-Res', + '74f0ef9476707be45f06951ca9a809ba:211111' => 'Canon DV/Optura/Elura, Superfine', + + # HTC + 'bf72e4d4aacbdaeb86fd3f67c8df2667:221111' => 'HTC Touch Diamond P3700, Quality Unknown', + + # Konica/Minolta + 'b5c213a3785c4c62b25d8f8c30758593:211111' => 'Konica/Minolta DYNAX 7D, Fine', + + # Nikon + '118a60a90c56bcb363fdd93b911a3371:211111' => 'Nikon D50 / D80, Fine', + '457b05fd0787a8e29bd43cd65911d6ca:211111' => 'Nikon D80, Basic', + '5701582a0da2e9e8dcd923a5cf877494:211111' => 'Nikon D50, Fine', + '662bd7fb9dff6426e310f9261a3703d0:211111' => 'Nikon D50, Fine', + 'e06eb7848ec8766239ff014aa8b62e49:211111' => 'Nikon D80, Normal', + '9e201a496a3700a77d9102c0dd0f8dbf:211111' => 'Nikon D300, Basic', + + # Panasonic + '07d3cd227395b060a132411cbfc22593:211111' => 'Panasonic DMC-FZ50, High (A)', + '118a60a90c56bcb363fdd93b911a3371:211111' => 'Panasonic DMC-FZ50/TZ3, High (A)', + '1b8d04b1d56a4c0c811a0d3a68e86d06:211111' => 'Panasonic DMC-FZ50, High (B)', + '1e619cbdee1f8ff196d34dad9140876f:211111' => 'Panasonic DMC-FZ50, High (C)', + '493abc7f4b392a0341bfcac091edb8f8:211111' => 'Panasonic DMC-FZ30, High (B)', + '4aa883c43840de7f0d090284120c69bc:211111' => 'Panasonic DMC-FZ50, High (D)', + '7eafb9874384d391836e64911e912295:211111' => 'Panasonic DMC-FZ50, High (E)', + '82b56237e4eccde035edff4a5abdba44:211111' => 'Panasonic DMC-FZ50, High (F)', + '8335023e5a1ee8df80d52327b0556c44:211111' => 'Panasonic DMC-FZ30, High (C)', + '8c105b3669931607853fa5ba4fffb839:211111' => 'Panasonic DMC-FZ30, High (D)', + '8ecfb959bc76e5d6703f3f3bba2c5529:211111' => 'Panasonic DMC-FZ30, High (E)', + '96eda111b2153648b3f27d6c1a9ec48f:211111' => 'Panasonic DMC-FZ50/TZ3, High (B)', + '99f76923cfbd774febea883b603b8103:211111' => 'Panasonic DMC-FZ30, High (F)', + '9b3475b865b9d31e433538460b75a588:211111' => 'Panasonic DMC-FZ10, High', + '9eb7cdfd07099c1bb8e2c6c04b20b8ba:211111' => 'Panasonic DMC-FZ30, High (G)', + '9fc030294fa5c4044dbb0cb461b0cf93:211111' => 'Panasonic DMC-TZ5, High (A)', + 'a8779af4cb8afa2def1d346a9b16e81a:211111' => 'Panasonic DMC-TZ5, High (B)', + 'bebd334aca511e2a2b6c60f43f9e6cf1:211111' => 'Panasonic DMC-FZ30, High (H)', + 'c871ce0851d4647f226b2dcfd49fe9a9:211111' => 'Panasonic DMC-L1, Very High', + 'eb625c64e32314f51dc4286564a71f7b:211111' => 'Panasonic DMC-FZ10, High', + + # Pentax + # (K10D uses same DQT tables for different qualities) + '1027a4af6a2a07e58bbd6df5b197d44e:211111' => 'Pentax K10D (A)', + '17a77c2574ff5b72b3284f57977187f3:211111' => 'Pentax K10D (B)', + '1aee684c7eb75320d988f6296c4c16ea:211111' => 'Pentax K10D (C)', + '32386501afff88b45432b23fe41593e8:211111' => 'Pentax K10D (D)', + '35ad02c3d8237a074b67423c39d3d61c:211111' => 'Pentax K10D (E)', + '39d929c095f37a90e7d083db40e8642d:211111' => 'Pentax K10D (F)', + '4127433151f74654762b1ef3293781f4:211111' => 'Pentax K10D (G)', + '599a7794c32b9d60e80426909ed40a09:211111' => 'Pentax K10D (H)', + '641812174c82d5b62ec86c33bd852204:211111' => 'Pentax K10D (I)', + '76d958276bf2cac3c36b7d9a677094a7:211111' => 'Pentax K10D (J)', + '79b07131be4827795315bf42c65212f2:211111' => 'Pentax K10D (K)', + '836448ef538366adb50202927b53808a:211111' => 'Pentax K10D (L)', + '8f70e4a31ad4584043ddc655eca17e89:211111' => 'Pentax K10D (M)', + '90d3c964eaf6e4bd12cf5ca791a7d753:211111' => 'Pentax K10D (N)', + '994a9f2060976d95719ca7064be3a99c:211111' => 'Pentax K10D (0)', + '994a9f2060976d95719ca7064be3a99c:211111' => 'Pentax K10D/K20D (P)', + '9971f02a466c47d640e8f20a2e4b55b9:211111' => 'Pentax K10D (Q)', + 'a16626c285e5a2290d331f99f4eec774:211111' => 'Pentax K10D (R)', + 'a64569d6387a118992e44e41aaeac27e:211111' => 'Pentax K10D (S)', + 'a8055a53fda7f9a0e387026c81960aa4:211111' => 'Pentax K10D (T)', + 'ab50a9f53a44ffecc54efe1cb7c6620a:211111' => 'Pentax K10D (U)', + 'aeb34eb083acc888770d65e691497bcf:211111' => 'Pentax K10D (V)', + 'af2a112c30fa29213a402dbd3c2b2d3a:211111' => 'Pentax K10D (W)', + 'bb4475a9e14464eb4682fd81cceb1f91:211111' => 'Pentax K10D (X)', + 'bf72e4d4aacbdaeb86fd3f67c8df2667:211111' => 'Pentax K10D (Y)', + '0a953ba56b59fa0bbbdac0162ea1c96b:211111' => 'Pentax K10D (Z)', + '387354b46b9726f33da5c0c1a0c383a0:211111' => 'Pentax K10D/K20D (AA)', + '4e7f4e5cd15f4fc089ab25890619dc60:211111' => 'Pentax K10D (AB)', + '6518270228fd20730740a08cc8a171f6:211111' => 'Pentax K10D (AC)', + '72bce7df55635509eb6468fc6406941d:211111' => 'Pentax K10D (AD)', + '7cafc25f204fc4ddf39d86e2f0f07b62:211111' => 'Pentax K10D (AE)', + '811e5b0229f0e8baf4b40cd2d8777550:211111' => 'Pentax K10D (AF)', + '9282a1cec6bbd1232b3673091164d43d:211111' => 'Pentax K10D (AG)', + 'c59a4cf0beedbfd1b102dc3d3c8e73ac:211111' => 'Pentax K10D (AH)', + 'd97b27b45fdbe82a79364e0939adbf90:121111' => 'Pentax K10D (AI)', + 'db87a4c5c1d4e03dc6645bcf0535a930:211111' => 'Pentax K10D (AJ)', + 'f9a93cb70da7bbe87e35cd9980a5fd47:211111' => 'Pentax K10D (AK)', + 'ff6a158f803e42bfbf9f702c016b84b3:211111' => 'Pentax K10D (AL)', + 'ff6d4a4a60a1c5e032e7fb7d9c91f817:211111' => 'Pentax K10D (AM)', + 'dca5476d81d0ceca97f480fecd09b23c:211111' => 'Pentax K10D (AN)', + 'efbe7634221900639b3c072395c61bef:211111' => 'Pentax K10D (AO)', + 'f4dba22dd251350a21f8122f2777e7b0:211111' => 'Pentax K10D (AP)', + 'f90135fcff0e1720dda86e9ad718c0c0:211111' => 'Pentax K10D (AQ)', + 'fa3d7753be7b329ab9961657cbc65386:211111' => 'Pentax K10D (AR)', + 'fa8720d025f2a164542b6a8e31112991:211111' => 'Pentax K10D (AS)', + '2941d12ef34511d96b659ba30d682cd1:211111' => 'Pentax K10D (AT)', + '2aa82b6717f1cdfe6b6d60a4486b5671:211111' => 'Pentax K10D (AU)', + '2aa82b6717f1cdfe6b6d60a4486b5671:211111' => 'Pentax K10D (AV)', + '3527616df6f26a3ab36b80a8d885fc07:211111' => 'Pentax K10D (AW)', + '3527616df6f26a3ab36b80a8d885fc07:211111' => 'Pentax K10D (AX)', + '3527616df6f26a3ab36b80a8d885fc07:211111' => 'Pentax K10D (AY)', + '5ea9e766888399a41f3f1a3c5c15cd90:211111' => 'Pentax K10D (AZ)', + 'f83d978290d0699054eabb0a7811c7a4:211111' => 'Pentax K10D (BA)', + 'f83d978290d0699054eabb0a7811c7a4:211111' => 'Pentax K10D (BB)', + 'fa8720d025f2a164542b6a8e31112991:211111' => 'Pentax K10D/K100D', + '586b40c7d4b95e11309636703e81fbe9:211111' => 'Pentax K20D/K200D/Optio 230, Best; Canon EOS 10D/300D/350D, Fine', + 'b73481179da895f3b9ecea1737054a9c:211111' => 'Pentax K20D, Best (B)', + 'b8fce00f93108e7db57a012c51fad341:211111' => 'Pentax K20D, Best (C)', + '5ee766b90badc8fed5a5386e78a80783:211111' => 'Pentax *istDS, Good (edit in camera)', + 'd528fac9b63536ff52041745945dcb09:211111' => 'Pentax *istDS, Better (edit in camera)', + 'd6390cc36d2f03c1d2dd13d6910ca46b:211111' => 'Pentax *istDS, Best (edit in camera)', + 'dc149d41f08d16cb9d52a5bdd487a67e:121111' => 'Pentax *istD/K100Dsuper/Optio300GS, Best', + 'e10030f09a14acdd647eff13c0bf333a:211111' => 'Pentax *istD/DS/DS2/K100D/Optio330GS/33L, Best', + 'ef0cd1902fb1afe284468a67eaffd078:211111' => 'Pentax *istDS/K100D/K100Dsuper, Good', + 'f1262dfcada6e6c2cd4b9fa7e881233b:211111' => 'Pentax *istDL/DS, Better', + 'f3235a7d187d083b7b7ead949653f730:211111' => 'Pentax K20D/K200D, Best (D)', + '6686cddc46088f0987e7476861fbfb47:211111' => 'Pentax K2000, Best (A)', + '5910b8431fdd8ab93ce258f366c4b867:211111' => 'Pentax K2000, Best (B)', + 'c8bfcc60aeec937300405f59373be4ef:211111' => 'Pentax K2000, Best (C)', + '689a0e3511f2aea75637f46e6af9fd9f:211111' => 'Pentax Optio A40, Best (edit in camera)', + '8d14598ae9cc1b7f5357424a19d05a71:211111' => 'Pentax Optio A30/A40, Good', + 'a4cb8a3a000484b37c4373cde1170091:211111' => 'Pentax Optio A30/A40/S10/S12, Best', + '0ac5cb651c496369d0e924ae070b7c53:211111' => 'Pentax Optio A40, Better (edit in camera)', + '1068be028c278941bd8abf3b0021655e:211111' => 'Pentax Optio A40, Good (edit in camera)', + '336eeeb78e386bf66fe6325b4a0fcfa6:211111' => 'Pentax Optio A40, Better', + 'ae2efaf1a96a4fdcfa9003b9aa963ae4:221111' => 'Pentax Optio 330, Best (vertical)', + '3803d7f6b7aed64c658c21dbb2bc0797:221111' => 'Pentax Optio 330, Best', + '353bf09900feb764885329e7bebfd95e:211111' => 'Pentax Optio 330GS, Good', + '6c2bc41a4b6ad1e20655ffcc0dfd2c41:221111' => 'Pentax Optio 330RS, Fine', + 'e9206045838e9f5f9bd207744254e96d:221111' => 'Pentax Optio 430, Best', + '759fb7011e13fa5f975bb668f5b94d8b:211111' => 'Pentax Optio 550/750Z/M60/X, Best', + '637103ef9d8e84f8345f8218f158fc3c:211111' => 'Pentax Optio 550/M10/T30/W30, Best', + '23f2a5970523c5f7fd2ab7fa3b09dff9:211111' => 'Pentax Optio 550/555/M20/M30/W10/W20, Best', + '8d2f02a07bad6b5cec48466036fef319:121111' => 'Pentax Optio 550, Better', + '27297008a89ee49804f0859ea6435878:211111' => 'Pentax Optio MX, Best', + '6cfe3833aadd87487afc11129d8cb2aa:221111' => 'Pentax Optio S, Better', + 'fcef35c97674aeb26c67e539b726057f:221111' => 'Pentax Optio S, Best (A)', + '13b2644cdad6f75767667e8ea5c218a3:221111' => 'Pentax Optio S, Best (B)', + '310b70bc4fac884f64a07040a4b87468:221111' => 'Pentax Optio S, Best (C)', + 'aa05fbe795d86a1063c55865e8613536:221111' => 'Pentax Optio S, Best (D)', + 'd57ac6956e4fe86c386f0eef00a5e021:221111' => 'Pentax Optio S, Best (E)', + '28782f5ee24fe983fe90b9438b39ae2e:221111' => 'Pentax Optio S4, Best', + '804bd63907214e005f01fb65a2bb00e6:221111' => 'Pentax Optio S4i, Best', + '84285f5b3248884488e5142b8c7210e2:211111' => 'Pentax Optio S6, Good', + 'e97694f0093de13987a335e131b30eb0:221111' => 'Pentax Optio SVi, Best', + '037d043c8a8d5332c28d59f71a0dcfd2:211111' => 'Pentax Optio E35', + 'dd8ad8ce688c4248f924022c38d3228c:211111' => 'Pentax Optio 43WR, Good', + 'e55e0c1adbbca8b9d100881248050eb5:211111' => 'Pentax Optio 43WR, Better', + '7770d784d852b3333f9213713e481125:211111' => 'Pentax Optio 450, Best', + '61d311bde22762ae0e88b768e835eced:211111' => 'Pentax Optio 33WR/M50, Best', + 'bc066ff3fbea8a290c6f9882687945e0:221111' => 'Pentax Optio 430RS, Fine', + 'b6bd9f956309a20e3a56294077536391:211111' => 'Pentax Optio A10/S7, Best', + 'a4ecd6b77f06671530942783c3595aca:211111' => 'Pentax Optio A20, Best', + '40f66b0a209f24716320636b776dda94:211111' => 'Pentax Optio E30/E40, Best', + '59a868b3d11d9cdc87859c02757e13bb:211111' => 'Pentax Optio E50, Best', + '9570584f017ed2c4f0fb91782b51faa9:211111' => 'Pentax Optio M40/Z10, Best', + '5a74f09fb2586fa000c42e98e3b9f2d8:211111' => 'Pentax Optio T10', + '0867bdf854d1fbb141411de518a66ba6:211111' => 'Pentax Optio T20 (A)', + 'f74b3853185743c111ccb13e6febdc21:211111' => 'Pentax Optio T20 (B)', + 'b6640d3879f9922708d23e6adb3d61c9:211111' => 'Pentax Optio V10, Best', + '253467dc35dfbb32cb3d619fc635d689:211111' => 'Pentax Optio V20/W60, Best', + + # Sony + '6bd350bf5df27ed1b5bf1d83fa9d021f:211111' => 'Sony DSLR-A700, Fine', +); + +#------------------------------------------------------------------------------ +# Estimate JPEG quality from quantization tables (ref 3) +# Inputs: 0) 1) DQT segments array ref +# Returns: JPEG quality, or undefined if it can't be calculated +sub EstimateQuality($) +{ + local $_; + my $dqtList = shift; + my ($i, $dqt, @qtbl, $quality, @hash, @sums); + + # unpack DQT segments and sum quantization tables + my $sum=0; +DQT: foreach $dqt (@$dqtList) { + next unless defined $dqt; + for ($i=1; $i+64<=length($dqt); $i+=65) { + my @qt = unpack("x$i C64", $dqt); + $sum += $_ foreach @qt; + push @qtbl, \@qt; + last DQT if @qtbl >= 4; + } + } + return undef unless @qtbl; + + my $qval = $qtbl[0][2] + $qtbl[0][53]; + if (@qtbl > 1) { + # color JPEG + $qval += $qtbl[1][0] + $qtbl[1][63]; + @hash =( + 1020, 1015, 932, 848, 780, 735, 702, 679, 660, 645, + 632, 623, 613, 607, 600, 594, 589, 585, 581, 571, + 555, 542, 529, 514, 494, 474, 457, 439, 424, 410, + 397, 386, 373, 364, 351, 341, 334, 324, 317, 309, + 299, 294, 287, 279, 274, 267, 262, 257, 251, 247, + 243, 237, 232, 227, 222, 217, 213, 207, 202, 198, + 192, 188, 183, 177, 173, 168, 163, 157, 153, 148, + 143, 139, 132, 128, 125, 119, 115, 108, 104, 99, + 94, 90, 84, 79, 74, 70, 64, 59, 55, 49, + 45, 40, 34, 30, 25, 20, 15, 11, 6, 4 + ); + @sums = ( + 32640, 32635, 32266, 31495, 30665, 29804, 29146, 28599, 28104, 27670, + 27225, 26725, 26210, 25716, 25240, 24789, 24373, 23946, 23572, 22846, + 21801, 20842, 19949, 19121, 18386, 17651, 16998, 16349, 15800, 15247, + 14783, 14321, 13859, 13535, 13081, 12702, 12423, 12056, 11779, 11513, + 11135, 10955, 10676, 10392, 10208, 9928, 9747, 9564, 9369, 9193, + 9017, 8822, 8639, 8458, 8270, 8084, 7896, 7710, 7527, 7347, + 7156, 6977, 6788, 6607, 6422, 6236, 6054, 5867, 5684, 5495, + 5305, 5128, 4945, 4751, 4638, 4442, 4248, 4065, 3888, 3698, + 3509, 3326, 3139, 2957, 2775, 2586, 2405, 2216, 2037, 1846, + 1666, 1483, 1297, 1109, 927, 735, 554, 375, 201, 128 + ); + } else { + # greyscale JPEG + @hash = ( + 510, 505, 422, 380, 355, 338, 326, 318, 311, 305, + 300, 297, 293, 291, 288, 286, 284, 283, 281, 280, + 279, 278, 277, 273, 262, 251, 243, 233, 225, 218, + 211, 205, 198, 193, 186, 181, 177, 172, 168, 164, + 158, 156, 152, 148, 145, 142, 139, 136, 133, 131, + 129, 126, 123, 120, 118, 115, 113, 110, 107, 105, + 102, 100, 97, 94, 92, 89, 87, 83, 81, 79, + 76, 74, 70, 68, 66, 63, 61, 57, 55, 52, + 50, 48, 44, 42, 39, 37, 34, 31, 29, 26, + 24, 21, 18, 16, 13, 11, 8, 6, 3, 2 + ); + @sums = ( + 16320, 16315, 15946, 15277, 14655, 14073, 13623, 13230, 12859, 12560, + 12240, 11861, 11456, 11081, 10714, 10360, 10027, 9679, 9368, 9056, + 8680, 8331, 7995, 7668, 7376, 7084, 6823, 6562, 6345, 6125, + 5939, 5756, 5571, 5421, 5240, 5086, 4976, 4829, 4719, 4616, + 4463, 4393, 4280, 4166, 4092, 3980, 3909, 3835, 3755, 3688, + 3621, 3541, 3467, 3396, 3323, 3247, 3170, 3096, 3021, 2952, + 2874, 2804, 2727, 2657, 2583, 2509, 2437, 2362, 2290, 2211, + 2136, 2068, 1996, 1915, 1858, 1773, 1692, 1620, 1552, 1477, + 1398, 1326, 1251, 1179, 1109, 1031, 961, 884, 814, 736, + 667, 592, 518, 441, 369, 292, 221, 151, 86, 64 + ); + } + for ($i=0; $i<100; ++$i) { + next if $qval < $hash[$i] and $sum < $sums[$i]; + $quality = $i + 1 if ($qval <= $hash[$i] and $sum <= $sums[$i]) or $i >= 50; + last; + } + return $quality; +} + +#------------------------------------------------------------------------------ +# Calculate JPEGDigest and/or JPEGQualityEstimate +# Inputs: 0) ExifTool object ref, 1) DQT segments array ref, 2) subsampling string +sub Calculate($$$) +{ + my ($et, $dqtList, $subSampling) = @_; + + # estimate JPEG quality if requested + my $all = ($$et{OPTIONS}{RequestAll} and $$et{OPTIONS}{RequestAll} > 2); + if ($all or $$et{REQ_TAG_LOOKUP}{jpegqualityestimate}) { + my $quality = EstimateQuality($dqtList); + $quality = '<unknown>' unless defined $quality; + $et->FoundTag('JPEGQualityEstimate', $quality); + } + return unless ($all or $$et{REQ_TAG_LOOKUP}{jpegdigest}) and $subSampling; + + unless (eval { require Digest::MD5 }) { + $et->Warn('Digest::MD5 must be installed to calculate JPEGDigest'); + return; + } + # create a string of DQT tables (in indexed order), separated by zero bytes + my $dqt = ''; + my $dat; + foreach $dat (@$dqtList) { + next unless $dat; + $dqt .= "\0" if $dqt; + $dqt .= $dat; + } + # generate ASCII-hex string of DQT MD5 digest + my $md5 = unpack 'H*', Digest::MD5::md5($dqt); + + # add sub-sampling string unless we get a match without it + $md5 .= ':' . $subSampling unless $PrintConv{$md5}; + + # add print conversion for JPEGDigest dynamically so it doesn't + # bulk up the documentation and slow down loading unnecessarily + $Image::ExifTool::Extra{JPEGDigest}{PrintConv} = \%PrintConv; + $et->FoundTag('JPEGDigest', $md5); +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::JPEGDigest - Calculate JPEGDigest and JPEGQualityEstimate + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains a lookup for values of the JPEG DQT digest, allowing +some image identification from JPEG data alone. It also calculates an +estimated JPEG quality if requested. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://github.com/ImageMagick/ImageMagick/blob/master/coders/jpeg.c> + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke for most of the work that went into this module, and +to Franz Buchinger for the values he added. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/JPEG Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/JSON.pm b/lib/Image/ExifTool/JSON.pm new file mode 100644 index 0000000..daff804 --- /dev/null +++ b/lib/Image/ExifTool/JSON.pm @@ -0,0 +1,190 @@ +#------------------------------------------------------------------------------ +# File: JSON.pm +# +# Description: Read JSON files +# +# Notes: Set ExifTool MissingTagValue to "null" to ignore JSON nulls +# +# Revisions: 2017/03/13 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::JSON; +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Import; + +$VERSION = '1.05'; + +sub ProcessJSON($$); +sub ProcessTag($$$$%); + +%Image::ExifTool::JSON::Main = ( + GROUPS => { 0 => 'JSON', 1 => 'JSON', 2 => 'Other' }, + VARS => { NO_ID => 1 }, + PROCESS_PROC => \&ProcessJSON, + NOTES => q{ + Other than a few tags in the table below, JSON tags have not been + pre-defined. However, ExifTool will read any existing tags from basic + JSON-formatted files. + }, + # ON1 settings tags + ON1_SettingsData => { + RawConv => q{ + require Image::ExifTool::XMP; + $val = Image::ExifTool::XMP::DecodeBase64($val); + }, + SubDirectory => { TagTable => 'Image::ExifTool::PLIST::Main' }, + }, + ON1_SettingsMetadataCreated => { Groups => { 2 => 'Time' } }, + ON1_SettingsMetadataModified => { Groups => { 2 => 'Time' } }, + ON1_SettingsMetadataName => { }, + ON1_SettingsMetadataPluginID => { }, + ON1_SettingsMetadataTimestamp => { Groups => { 2 => 'Time' } }, + ON1_SettingsMetadataUsage => { }, + ON1_SettingsMetadataVisibleToUser=>{ }, +); + +#------------------------------------------------------------------------------ +# Store a tag value +# Inputs: 0) ExifTool ref, 1) tag table, 2) tag ID, 3) value, 4) tagInfo flags +sub FoundTag($$$$%) +{ + my ($et, $tagTablePtr, $tag, $val, %flags) = @_; + + # special case to reformat ON1 tag names + if ($tag =~ s/^settings\w{8}-\w{4}-\w{4}-\w{4}-\w{12}(Data|Metadata.+)$/ON1_Settings$1/) { + $et->OverrideFileType('ONP','application/on1') if $$et{FILE_TYPE} eq 'JSON'; + } + + # avoid conflict with special table entries + $tag .= '!' if $Image::ExifTool::specialTags{$tag}; + + AddTagToTable($tagTablePtr, $tag, { + Name => Image::ExifTool::MakeTagName($tag), + %flags, + Temporary => 1, + }) unless $$tagTablePtr{$tag}; + + $et->HandleTag($tagTablePtr, $tag, $val); +} + +#------------------------------------------------------------------------------ +# Process a JSON tag +# Inputs: 0) ExifTool ref, 1) tag table, 2) tag ID, 3) value, 4) tagInfo flags +# - expands structures into flattened tags as required +sub ProcessTag($$$$%) +{ + local $_; + my ($et, $tagTablePtr, $tag, $val, %flags) = @_; + + if (ref $val eq 'HASH') { + if ($et->Options('Struct')) { + FoundTag($et, $tagTablePtr, $tag, $val, %flags, Struct => 1); + return unless $et->Options('Struct') > 1; + } + # support hashes with ordered keys + my @keys = $$val{_ordered_keys_} ? @{$$val{_ordered_keys_}} : sort keys %$val; + foreach (@keys) { + my $tg = $tag . ((/^\d/ and $tag =~ /\d$/) ? '_' : '') . ucfirst; + $tg =~ s/([^a-zA-Z])([a-z])/$1\U$2/g; + ProcessTag($et, $tagTablePtr, $tg, $$val{$_}, %flags, Flat => 1); + } + } elsif (ref $val eq 'ARRAY') { + foreach (@$val) { + ProcessTag($et, $tagTablePtr, $tag, $_, %flags, List => 1); + } + } elsif (defined $val) { + FoundTag($et, $tagTablePtr, $tag, $val, %flags); + } +} + +#------------------------------------------------------------------------------ +# Extract meta information from a JSON file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a recognized JSON file +sub ProcessJSON($$) +{ + local $_; + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $structOpt = $et->Options('Struct'); + my (%database, $key, $tag, $dataPt); + + unless ($raf) { + $dataPt = $$dirInfo{DataPt}; + if ($$dirInfo{DirStart} or ($$dirInfo{DirLen} and $$dirInfo{DirLen} ne length($$dataPt))) { + my $buff = substr(${$$dirInfo{DataPt}}, $$dirInfo{DirStart}, $$dirInfo{DirLen}); + $dataPt = \$buff; + } + $raf = new File::RandomAccess($dataPt); + # extract as a block if requested + my $blockName = $$dirInfo{BlockInfo} ? $$dirInfo{BlockInfo}{Name} : ''; + my $blockExtract = $et->Options('BlockExtract'); + if ($blockName and ($blockExtract or $$et{REQ_TAG_LOOKUP}{lc $blockName} or + ($$et{TAGS_FROM_FILE} and not $$et{EXCL_TAG_LOOKUP}{lc $blockName}))) + { + $et->FoundTag($$dirInfo{BlockInfo}, $$dataPt); + return 1 if $blockExtract and $blockExtract > 1; + } + $et->VerboseDir('JSON'); + } + + # read information from JSON file into database structure + my $err = Image::ExifTool::Import::ReadJSON($raf, \%database, + $et->Options('MissingTagValue'), $et->Options('Charset')); + + return 0 if $err or not %database; + + $et->SetFileType() unless $dataPt; + + my $tagTablePtr = GetTagTable('Image::ExifTool::JSON::Main'); + + # remove any old tag definitions in case they change flags + foreach $key (TagTableKeys($tagTablePtr)) { + delete $$tagTablePtr{$key} if $$tagTablePtr{$key}{Temporary}; + } + + # extract tags from JSON database + foreach $key (sort keys %database) { + foreach $tag (sort keys %{$database{$key}}) { + my $val = $database{$key}{$tag}; + # (ignore SourceFile if generated automatically by ReadJSON) + next if $tag eq 'SourceFile' and defined $val and $val eq '*'; + ProcessTag($et, $tagTablePtr, $tag, $val); + } + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::JSON - Read JSON files + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool read +information from JSON files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/JSON Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/JVC.pm b/lib/Image/ExifTool/JVC.pm new file mode 100644 index 0000000..5339224 --- /dev/null +++ b/lib/Image/ExifTool/JVC.pm @@ -0,0 +1,130 @@ +#------------------------------------------------------------------------------ +# File: JVC.pm +# +# Description: JVC EXIF maker notes tags +# +# Revisions: 12/21/2005 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::JVC; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.03'; + +sub ProcessJVCText($$$); + +# JVC EXIF-based maker notes +%Image::ExifTool::JVC::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'JVC EXIF maker note tags.', + #0x0001 - almost always '2', but '3' for GR-DV700 samples + 0x0002 => { #PH + Name => 'CPUVersions', + # remove trailing nulls/spaces and split at remaining nulls/spaces + ValueConv => '$_=$val; s/(\s*\0)+$//; s/(\s*\0)+/, /g; $_', + }, + 0x0003 => { #PH + Name => 'Quality', + PrintConv => { + 0 => 'Low', + 1 => 'Normal', + 2 => 'Fine', + }, + }, +); + +# JVC text-based maker notes +%Image::ExifTool::JVC::Text = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessJVCText, + NOTES => 'JVC/Victor text-based maker note tags.', + VER => 'MakerNoteVersion', #PH + QTY => { #PH + Name => 'Quality', + PrintConv => { + STND => 'Normal', + STD => 'Normal', + FINE => 'Fine', + }, + }, +); + +#------------------------------------------------------------------------------ +# Process JVC text-based maker notes +# Inputs: 0) ExifTool object reference +# 1) Reference to directory information hash +# 2) Pointer to tag table for this directory +# Returns: 1 on success, otherwise returns 0 and sets a Warning +sub ProcessJVCText($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dataLen = $$dirInfo{DataLen}; + my $dirLen = $$dirInfo{DirLen} || $dataLen - $dirStart; + my $verbose = $et->Options('Verbose'); + + my $data = substr($$dataPt, $dirStart, $dirLen); + # validate text maker notes + unless ($data =~ /^VER:/) { + $et->Warn('Bad JVC text maker notes'); + return 0; + } + while ($data =~ m/([A-Z]+):(.{3,4})/sg) { + my ($tag, $val) = ($1, $2); + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + $et->VerboseInfo($tag, $tagInfo, + Table => $tagTablePtr, + Value => $val, + ) if $verbose; + unless ($tagInfo) { + next unless $$et{OPTIONS}{Unknown}; + $tagInfo = { + Name => "JVC_Text_$tag", + Unknown => 1, + PrintConv => 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val', + }; + # add tag information to table + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + $et->FoundTag($tagInfo, $val); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::JVC - JVC EXIF maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains routines used by Image::ExifTool to interpret JVC maker +notes. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/JVC Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Jpeg2000.pm b/lib/Image/ExifTool/Jpeg2000.pm new file mode 100644 index 0000000..76fb5ff --- /dev/null +++ b/lib/Image/ExifTool/Jpeg2000.pm @@ -0,0 +1,1379 @@ +#------------------------------------------------------------------------------ +# File: Jpeg2000.pm +# +# Description: Read JPEG 2000 meta information +# +# Revisions: 02/11/2005 - P. Harvey Created +# 06/22/2007 - PH Added write support (EXIF, IPTC and XMP only) +# +# References: 1) http://www.jpeg.org/public/fcd15444-2.pdf +# 2) ftp://ftp.remotesensing.org/jpeg2000/fcd15444-1.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::Jpeg2000; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.32'; + +sub ProcessJpeg2000Box($$$); +sub ProcessJUMD($$$); + +my %resolutionUnit = ( + -3 => 'km', + -2 => '100 m', + -1 => '10 m', + 0 => 'm', + 1 => '10 cm', + 2 => 'cm', + 3 => 'mm', + 4 => '0.1 mm', + 5 => '0.01 mm', + 6 => 'um', +); + +# map of where information is written in JPEG2000 image +my %jp2Map = ( + IPTC => 'UUID-IPTC', + IFD0 => 'UUID-EXIF', + XMP => 'UUID-XMP', + 'UUID-IPTC' => 'JP2', + 'UUID-EXIF' => 'JP2', + 'UUID-XMP' => 'JP2', + jp2h => 'JP2', + colr => 'jp2h', + ICC_Profile => 'colr', + IFD1 => 'IFD0', + EXIF => 'IFD0', # to write EXIF as a block + ExifIFD => 'IFD0', + GPS => 'IFD0', + SubIFD => 'IFD0', + GlobParamIFD => 'IFD0', + PrintIM => 'IFD0', + InteropIFD => 'ExifIFD', + MakerNotes => 'ExifIFD', +); + +# map of where information is written in a JXL image +my %jxlMap = ( + IFD0 => 'Exif', + XMP => 'XML', + 'Exif' => 'JP2', + IFD1 => 'IFD0', + EXIF => 'IFD0', # to write EXIF as a block + ExifIFD => 'IFD0', + GPS => 'IFD0', + SubIFD => 'IFD0', + GlobParamIFD => 'IFD0', + PrintIM => 'IFD0', + InteropIFD => 'ExifIFD', + MakerNotes => 'ExifIFD', +); + +# UUID's for writable UUID directories (by tag name) +my %uuid = ( + 'UUID-EXIF' => 'JpgTiffExif->JP2', + 'UUID-EXIF2' => '', # (flags a warning when writing) + 'UUID-EXIF_bad' => '0', # (flags a warning when reading and writing) + 'UUID-IPTC' => "\x33\xc7\xa4\xd2\xb8\x1d\x47\x23\xa0\xba\xf1\xa3\xe0\x97\xad\x38", + 'UUID-XMP' => "\xbe\x7a\xcf\xcb\x97\xa9\x42\xe8\x9c\x71\x99\x94\x91\xe3\xaf\xac", + # (can't yet write GeoJP2 information) + # 'UUID-GeoJP2' => "\xb1\x4b\xf8\xbd\x08\x3d\x4b\x43\xa5\xae\x8c\xd7\xd5\xa6\xce\x03", +); + +# JPEG2000 codestream markers (ref ISO/IEC FCD15444-1/2) +my %j2cMarker = ( + 0x4f => 'SOC', # start of codestream + 0x51 => 'SIZ', # image and tile size + 0x52 => 'COD', # coding style default + 0x53 => 'COC', # coding style component + 0x55 => 'TLM', # tile-part lengths + 0x57 => 'PLM', # packet length, main header + 0x58 => 'PLT', # packet length, tile-part header + 0x5c => 'QCD', # quantization default + 0x5d => 'QCC', # quantization component + 0x5e => 'RGN', # region of interest + 0x5f => 'POD', # progression order default + 0x60 => 'PPM', # packed packet headers, main + 0x61 => 'PPT', # packed packet headers, tile-part + 0x63 => 'CRG', # component registration + 0x64 => 'CME', # comment and extension + 0x90 => 'SOT', # start of tile-part + 0x91 => 'SOP', # start of packet + 0x92 => 'EPH', # end of packet header + 0x93 => 'SOD', # start of data + # extensions (ref ISO/IEC FCD15444-2) + 0x70 => 'DCO', # variable DC offset + 0x71 => 'VMS', # visual masking + 0x72 => 'DFS', # downsampling factor style + 0x73 => 'ADS', # arbitrary decomposition style + # 0x72 => 'ATK', # arbitrary transformation kernels ? + 0x78 => 'CBD', # component bit depth + 0x74 => 'MCT', # multiple component transformation definition + 0x75 => 'MCC', # multiple component collection + 0x77 => 'MIC', # multiple component intermediate collection + 0x76 => 'NLT', # non-linearity point transformation +); + +# JPEG 2000 "box" (ie. atom) names +# Note: only tags with a defined "Format" are extracted +%Image::ExifTool::Jpeg2000::Main = ( + GROUPS => { 2 => 'Image' }, + PROCESS_PROC => \&ProcessJpeg2000Box, + WRITE_PROC => \&ProcessJpeg2000Box, + PREFERRED => 1, # always add these tags when writing + NOTES => q{ + The tags below are found in JPEG 2000 images and the JUMBF metadata in JPEG + images, but not all of these are extracted. Note that ExifTool currently + writes only EXIF, IPTC and XMP tags in Jpeg2000 images. + }, +# +# NOTE: ONLY TAGS WITH "Format" DEFINED ARE EXTRACTED! +# + 'jP ' => 'JP2Signature', # (ref 1) + "jP\x1a\x1a" => 'JP2Signature', # (ref 2) + prfl => 'Profile', + ftyp => { + Name => 'FileType', + SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::FileType' }, + }, + rreq => 'ReaderRequirements', + jp2h => { + Name => 'JP2Header', + SubDirectory => { }, + }, + # JP2Header sub boxes... + ihdr => { + Name => 'ImageHeader', + SubDirectory => { + TagTable => 'Image::ExifTool::Jpeg2000::ImageHeader', + }, + }, + bpcc => 'BitsPerComponent', + colr => { + Name => 'ColorSpecification', + SubDirectory => { + TagTable => 'Image::ExifTool::Jpeg2000::ColorSpec', + }, + }, + pclr => 'Palette', + cdef => 'ComponentDefinition', + 'res '=> { + Name => 'Resolution', + SubDirectory => { }, + }, + # Resolution sub boxes... + resc => { + Name => 'CaptureResolution', + SubDirectory => { + TagTable => 'Image::ExifTool::Jpeg2000::CaptureResolution', + }, + }, + resd => { + Name => 'DisplayResolution', + SubDirectory => { + TagTable => 'Image::ExifTool::Jpeg2000::DisplayResolution', + }, + }, + jpch => { + Name => 'CodestreamHeader', + SubDirectory => { }, + }, + # CodestreamHeader sub boxes... + 'lbl '=> { + Name => 'Label', + Format => 'string', + }, + cmap => 'ComponentMapping', + roid => 'ROIDescription', + jplh => { + Name => 'CompositingLayerHeader', + SubDirectory => { }, + }, + # CompositingLayerHeader sub boxes... + cgrp => 'ColorGroup', + opct => 'Opacity', + creg => 'CodestreamRegistration', + dtbl => 'DataReference', + ftbl => { + Name => 'FragmentTable', + Subdirectory => { }, + }, + # FragmentTable sub boxes... + flst => 'FragmentList', + cref => 'Cross-Reference', + mdat => 'MediaData', + comp => 'Composition', + copt => 'CompositionOptions', + inst => 'InstructionSet', + asoc => { + Name => 'Association', + SubDirectory => { }, + }, + # (Association box may contain any other sub-box) + nlst => 'NumberList', + bfil => 'BinaryFilter', + drep => 'DesiredReproductions', + # DesiredReproductions sub boxes... + gtso => 'GraphicsTechnologyStandardOutput', + chck => 'DigitalSignature', + mp7b => 'MPEG7Binary', + free => 'Free', + jp2c => [{ + Name => 'ContiguousCodestream', + Condition => 'not $$self{jumd_level}', + },{ + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Format => 'undef', + Binary => 1, + }], + jp2i => { + Name => 'IntellectualProperty', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, + 'xml '=> [{ + Name => 'XML', + Condition => 'not $$self{IsJXL}', + Writable => 'undef', + Flags => [ 'Binary', 'Protected', 'BlockExtract' ], + List => 1, + Notes => q{ + by default, the XML data in this tag is parsed using the ExifTool XMP module + to to allow individual tags to be accessed when reading, but it may also be + extracted as a block via the "XML" tag, which is also how this tag is + written and copied. It may also be extracted as a block by setting the API + BlockExtract option. This is a List-type tag because multiple XML blocks + may exist + }, + # (note: extracting as a block was broken in 11.04, and finally fixed in 12.14) + SubDirectory => { TagTable => 'Image::ExifTool::XMP::XML' }, + },{ + Name => 'XMP', + Notes => 'used for XMP in JPEG XL files', + # NOTE: the hacked code relies on this being at index 1 of the tagInfo list! + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }], + uuid => [ + { + Name => 'UUID-EXIF', + # (this is the EXIF that we create) + Condition => '$$valPt=~/^JpgTiffExif->JP2(?!Exif\0\0)/', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + WriteProc => \&Image::ExifTool::WriteTIFF, + DirName => 'EXIF', + Start => '$valuePtr + 16', + }, + }, + { + Name => 'UUID-EXIF2', + # written by Photoshop 7.01+Adobe JPEG2000-plugin v1.5 + Condition => '$$valPt=~/^\x05\x37\xcd\xab\x9d\x0c\x44\x31\xa7\x2a\xfa\x56\x1f\x2a\x11\x3e/', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + WriteProc => \&Image::ExifTool::WriteTIFF, + DirName => 'EXIF', + Start => '$valuePtr + 16', + }, + }, + { + Name => 'UUID-EXIF_bad', + # written by Digikam + Condition => '$$valPt=~/^JpgTiffExif->JP2/', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + WriteProc => \&Image::ExifTool::WriteTIFF, + DirName => 'EXIF', + Start => '$valuePtr + 22', + }, + }, + { + Name => 'UUID-IPTC', + # (this is the IPTC that we create) + Condition => '$$valPt=~/^\x33\xc7\xa4\xd2\xb8\x1d\x47\x23\xa0\xba\xf1\xa3\xe0\x97\xad\x38/', + SubDirectory => { + TagTable => 'Image::ExifTool::IPTC::Main', + Start => '$valuePtr + 16', + }, + }, + { + Name => 'UUID-IPTC2', + # written by Photoshop 7.01+Adobe JPEG2000-plugin v1.5 + Condition => '$$valPt=~/^\x09\xa1\x4e\x97\xc0\xb4\x42\xe0\xbe\xbf\x36\xdf\x6f\x0c\xe3\x6f/', + SubDirectory => { + TagTable => 'Image::ExifTool::IPTC::Main', + Start => '$valuePtr + 16', + }, + }, + { + Name => 'UUID-XMP', + # ref http://www.adobe.com/products/xmp/pdfs/xmpspec.pdf + Condition => '$$valPt=~/^\xbe\x7a\xcf\xcb\x97\xa9\x42\xe8\x9c\x71\x99\x94\x91\xe3\xaf\xac/', + SubDirectory => { + TagTable => 'Image::ExifTool::XMP::Main', + Start => '$valuePtr + 16', + }, + }, + { + Name => 'UUID-GeoJP2', + # ref http://www.remotesensing.org/jpeg2000/ + Condition => '$$valPt=~/^\xb1\x4b\xf8\xbd\x08\x3d\x4b\x43\xa5\xae\x8c\xd7\xd5\xa6\xce\x03/', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + Start => '$valuePtr + 16', + }, + }, + { + Name => 'UUID-Photoshop', + # written by Photoshop 7.01+Adobe JPEG2000-plugin v1.5 + Condition => '$$valPt=~/^\x2c\x4c\x01\x00\x85\x04\x40\xb9\xa0\x3e\x56\x21\x48\xd6\xdf\xeb/', + SubDirectory => { + TagTable => 'Image::ExifTool::Photoshop::Main', + Start => '$valuePtr + 16', + }, + }, + { + Name => 'UUID-Signature', # (seen in JUMB data of JPEG images) + # (may be able to remove this when JUMBF specification is finalized) + Condition => '$$valPt=~/^casg\x00\x11\x00\x10\x80\x00\x00\xaa\x00\x38\x9b\x71/', + Format => 'undef', + ValueConv => 'substr($val,16)', + }, + { + Name => 'UUID-C2PAClaimSignature', # (seen in incorrectly-formatted JUMB data of JPEG images) + # (may be able to remove this when JUMBF specification is finalized) + Condition => '$$valPt=~/^c2cs\x00\x11\x00\x10\x80\x00\x00\xaa\x00\x38\x9b\x71/', + SubDirectory => { + TagTable => 'Image::ExifTool::CBOR::Main', + Start => '$valuePtr + 16', + }, + }, + { + Name => 'UUID-Unknown', + }, + # also written by Adobe JPEG2000 plugin v1.5: + # 3a 0d 02 18 0a e9 41 15 b3 76 4b ca 41 ce 0e 71 - 1 byte (01) + # 47 c9 2c cc d1 a1 45 81 b9 04 38 bb 54 67 71 3b - 1 byte (01) + # bc 45 a7 74 dd 50 4e c6 a9 f6 f3 a1 37 f4 7e 90 - 4 bytes (00 00 00 32) + # d7 c8 c5 ef 95 1f 43 b2 87 57 04 25 00 f5 38 e8 - 4 bytes (00 00 00 32) + ], + uinf => { + Name => 'UUIDInfo', + SubDirectory => { }, + }, + # UUIDInfo sub boxes... + ulst => 'UUIDList', + 'url '=> { + Name => 'URL', + Format => 'string', + }, + # JUMBF boxes (ref https://github.com/thorfdbg/codestream-parser) + jumd => { + Name => 'JUMBFDescr', + SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::JUMD' }, + }, + jumb => { + Name => 'JUMBFBox', + SubDirectory => { + TagTable => 'Image::ExifTool::Jpeg2000::Main', + ProcessProc => \&ProcessJUMB, + }, + }, + json => { + Name => 'JSONData', + Flags => [ 'Binary', 'Protected', 'BlockExtract' ], + Notes => q{ + by default, data in this tag is parsed using the ExifTool JSON module to to + allow individual tags to be accessed when reading, but it may also be + extracted as a block via the "JSONData" tag or by setting the API + BlockExtract option + }, + SubDirectory => { TagTable => 'Image::ExifTool::JSON::Main' }, + }, + cbor => { + Name => 'CBORData', + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { TagTable => 'Image::ExifTool::CBOR::Main' }, + }, + bfdb => { # used in JUMBF (see # (used when tag is renamed according to JUMDLabel) + Name => 'BinaryDataType', + Notes => 'JUMBF, MIME type and optional file name', + Format => 'undef', + # (ignore "toggles" byte and just extract MIME type and file name) + ValueConv => '$_=substr($val,1); s/\0+$//; s/\0/, /; $_', + JUMBF_Suffix => 'Type', # (used when tag is renamed according to JUMDLabel) + }, + bidb => { # used in JUMBF + Name => 'BinaryData', + Notes => 'JUMBF', + Groups => { 2 => 'Preview' }, + Format => 'undef', + Binary => 1, + JUMBF_Suffix => 'Data', # (used when tag is renamed according to JUMDLabel) + }, +# +# stuff seen in JPEG XL images: +# + # jbrd - JPEG Bitstream Reconstruction Data (allows lossless conversion back to original JPG) + jxlc => { + Name => 'JXLCodestream', + Format => 'undef', + Notes => q{ + Codestream in JPEG XL image. Currently processed only to determine + ImageSize + }, + RawConv => 'Image::ExifTool::Jpeg2000::ProcessJXLCodestream($self,\$val); undef', + }, + Exif => { + Name => 'EXIF', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + WriteProc => \&Image::ExifTool::WriteTIFF, + DirName => 'EXIF', + Start => '$valuePtr + 4', + }, + }, +); + +%Image::ExifTool::Jpeg2000::ImageHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'ImageHeight', + Format => 'int32u', + }, + 4 => { + Name => 'ImageWidth', + Format => 'int32u', + }, + 8 => { + Name => 'NumberOfComponents', + Format => 'int16u', + }, + 10 => { + Name => 'BitsPerComponent', + PrintConv => q{ + $val == 0xff and return 'Variable'; + my $sign = ($val & 0x80) ? 'Signed' : 'Unsigned'; + return (($val & 0x7f) + 1) . " Bits, $sign"; + }, + }, + 11 => { + Name => 'Compression', + PrintConv => { + 0 => 'Uncompressed', + 1 => 'Modified Huffman', + 2 => 'Modified READ', + 3 => 'Modified Modified READ', + 4 => 'JBIG', + 5 => 'JPEG', + 6 => 'JPEG-LS', + 7 => 'JPEG 2000', + 8 => 'JBIG2', + }, + }, +); + +# (ref fcd15444-1/2/6.pdf) +# (also see http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html) +%Image::ExifTool::Jpeg2000::FileType = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int32u', + 0 => { + Name => 'MajorBrand', + Format => 'undef[4]', + PrintConv => { + 'jp2 ' => 'JPEG 2000 Image (.JP2)', # image/jp2 + 'jpm ' => 'JPEG 2000 Compound Image (.JPM)', # image/jpm + 'jpx ' => 'JPEG 2000 with extensions (.JPX)', # image/jpx + 'jxl ' => 'JPEG XL Image (.JXL)', # image/jxl + }, + }, + 1 => { + Name => 'MinorVersion', + Format => 'undef[4]', + ValueConv => 'sprintf("%x.%x.%x", unpack("nCC", $val))', + }, + 2 => { + Name => 'CompatibleBrands', + Format => 'undef[$size-8]', + # ignore any entry with a null, and return others as a list + ValueConv => 'my @a=($val=~/.{4}/sg); @a=grep(!/\0/,@a); \@a', + }, +); + +%Image::ExifTool::Jpeg2000::CaptureResolution = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + FORMAT => 'int8s', + 0 => { + Name => 'CaptureYResolution', + Format => 'rational32u', + }, + 4 => { + Name => 'CaptureXResolution', + Format => 'rational32u', + }, + 8 => { + Name => 'CaptureYResolutionUnit', + SeparateTable => 'ResolutionUnit', + PrintConv => \%resolutionUnit, + }, + 9 => { + Name => 'CaptureXResolutionUnit', + SeparateTable => 'ResolutionUnit', + PrintConv => \%resolutionUnit, + }, +); + +%Image::ExifTool::Jpeg2000::DisplayResolution = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + FORMAT => 'int8s', + 0 => { + Name => 'DisplayYResolution', + Format => 'rational32u', + }, + 4 => { + Name => 'DisplayXResolution', + Format => 'rational32u', + }, + 8 => { + Name => 'DisplayYResolutionUnit', + SeparateTable => 'ResolutionUnit', + PrintConv => \%resolutionUnit, + }, + 9 => { + Name => 'DisplayXResolutionUnit', + SeparateTable => 'ResolutionUnit', + PrintConv => \%resolutionUnit, + }, +); + +%Image::ExifTool::Jpeg2000::ColorSpec = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, # (we don't actually call this) + GROUPS => { 2 => 'Image' }, + FORMAT => 'int8s', + WRITABLE => 1, + # (Note: 'colr' is not a real group, but is used as a hack to write the + # necessary colr box. This hack necessitated another hack in TagInfoXML.pm + # to avoid reporting this fake group in the XML output) + WRITE_GROUP => 'colr', + DATAMEMBER => [ 0 ], + IS_SUBDIR => [ 3 ], + NOTES => q{ + The table below contains tags in the color specification (colr) box. This + box may be rewritten by writing either ICC_Profile, ColorSpace or + ColorSpecData. When writing, any existing colr boxes are replaced with the + newly created colr box. + + B<NOTE>: Care must be taken when writing this color specification because + writing a specification that is incompatible with the image data may make + the image undisplayable. + }, + 0 => { + Name => 'ColorSpecMethod', + RawConv => '$$self{ColorSpecMethod} = $val', + Protected => 1, + Notes => q{ + default for writing is 2 when writing ICC_Profile, 1 when writing + ColorSpace, or 4 when writing ColorSpecData + }, + PrintConv => { + 1 => 'Enumerated', + 2 => 'Restricted ICC', + 3 => 'Any ICC', + 4 => 'Vendor Color', + }, + }, + 1 => { + Name => 'ColorSpecPrecedence', + Notes => 'default for writing is 0', + Protected => 1, + }, + 2 => { + Name => 'ColorSpecApproximation', + Notes => 'default for writing is 0', + Protected => 1, + PrintConv => { + 0 => 'Not Specified', + 1 => 'Accurate', + 2 => 'Exceptional Quality', + 3 => 'Reasonable Quality', + 4 => 'Poor Quality', + }, + }, + 3 => [ + { + Name => 'ICC_Profile', + Condition => q{ + $$self{ColorSpecMethod} == 2 or + $$self{ColorSpecMethod} == 3 + }, + Format => 'undef[$size-3]', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + }, + }, + { + Name => 'ColorSpace', + Condition => '$$self{ColorSpecMethod} == 1', + Format => 'int32u', + Protected => 1, + PrintConv => { # ref 15444-2 2002-05-15 + 0 => 'Bi-level', + 1 => 'YCbCr(1)', + 3 => 'YCbCr(2)', + 4 => 'YCbCr(3)', + 9 => 'PhotoYCC', + 11 => 'CMY', + 12 => 'CMYK', + 13 => 'YCCK', + 14 => 'CIELab', + 15 => 'Bi-level(2)', # (incorrectly listed as 18 in 15444-2 2000-12-07) + 16 => 'sRGB', + 17 => 'Grayscale', + 18 => 'sYCC', + 19 => 'CIEJab', + 20 => 'e-sRGB', + 21 => 'ROMM-RGB', + # incorrect in 15444-2 2000-12-07 + #22 => 'sRGB based YCbCr', + #23 => 'YPbPr(1125/60)', + #24 => 'YPbPr(1250/50)', + 22 => 'YPbPr(1125/60)', + 23 => 'YPbPr(1250/50)', + 24 => 'e-sYCC', + }, + }, + { + Name => 'ColorSpecData', + Format => 'undef[$size-3]', + Writable => 'undef', + Protected => 1, + Binary => 1, + }, + ], +); + +# JUMBF description box +%Image::ExifTool::Jpeg2000::JUMD = ( + PROCESS_PROC => \&ProcessJUMD, + GROUPS => { 0 => 'JUMBF', 1 => 'JUMBF', 2 => 'Image' }, + NOTES => 'Information extracted from the JUMBF description box.', + 'type' => { + Name => 'JUMDType', + ValueConv => 'unpack "H*", $val', + PrintConv => q{ + my @a = $val =~ /^(\w{8})(\w{4})(\w{4})(\w{16})$/; + return $val unless @a; + my $ascii = pack 'H*', $a[0]; + $a[0] = "($ascii)" if $ascii =~ /^[a-zA-Z0-9]{4}$/; + return join '-', @a; + }, + # seen: + # cacb/cast/caas/cacl/casg/json-00110010800000aa00389b71 + # 6579d6fbdba2446bb2ac1b82feeb89d1 - JPEG image + }, + 'label' => { Name => 'JUMDLabel' }, + 'toggles' => { + Name => 'JUMDToggles', + Unknown => 1, + PrintConv => { BITMASK => { + 0 => 'Requestable', + 1 => 'Label', + 2 => 'ID', + 3 => 'Signature', + }}, + }, + 'id' => { Name => 'JUMDID', Description => 'JUMD ID' }, + 'sig' => { Name => 'JUMDSignature', PrintConv => 'unpack "H*", $val' }, +); + +#------------------------------------------------------------------------------ +# Read JUMBF box to keep track of sub-document numbers +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessJUMB($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + if ($$et{jumd_level}) { + ++$$et{jumd_level}[-1]; # increment current sub-document number + } else { + $$et{jumd_level} = [ ++$$et{DOC_COUNT} ]; # new top-level sub-document + $$et{SET_GROUP0} = 'JUMBF'; + } + $$et{DOC_NUM} = join '-', @{$$et{jumd_level}}; + push @{$$et{jumd_level}}, 0; + ProcessJpeg2000Box($et, $dirInfo, $tagTablePtr); + delete $$et{DOC_NUM}; + delete $$et{JUMBFLabel}; + pop @{$$et{jumd_level}}; + if (@{$$et{jumd_level}} < 2) { + delete $$et{jumd_level}; + delete $$et{SET_GROUP0}; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Read JUMBF description box (ref https://github.com/thorfdbg/codestream-parser) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessJUMD($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $end = $pos + $$dirInfo{DirLen}; + $et->VerboseDir('JUMD', 0, $end-$pos); + delete $$et{JUMBFLabel}; + $$dirInfo{DirLen} < 17 and $et->Warn('Truncated JUMD directory'), return 0; + my $type = substr($$dataPt, $pos, 4); + $et->HandleTag($tagTablePtr, 'type', substr($$dataPt, $pos, 16)); + $pos += 16; + my $flags = Get8u($dataPt, $pos++); + $et->HandleTag($tagTablePtr, 'toggles', $flags); + if ($flags & 0x02) { # label exists? + pos($$dataPt) = $pos; + $$dataPt =~ /\0/g or $et->Warn('Missing JUMD label terminator'), return 0; + my $len = pos($$dataPt) - $pos; + my $name = substr($$dataPt, $pos, $len); + $et->HandleTag($tagTablePtr, 'label', $name); + $pos += $len; + if ($len) { + $name =~ s/[^-_a-zA-Z0-9]([a-z])/\U$1/g; # capitalize characters after illegal characters + $name =~ tr/-_a-zA-Z0-9//dc; # remove other illegal characters + $name =~ s/__/_/; # collapse double underlines + $name = ucfirst $name; # capitalize first letter + $name = "Tag$name" if length($name) < 2; # must at least 2 characters long + $$et{JUMBFLabel} = $name; + } + } + if ($flags & 0x04) { # ID exists? + $pos + 4 > $end and $et->Warn('Missing JUMD ID'), return 0; + $et->HandleTag($tagTablePtr, 'id', Get32u($dataPt, $pos)); + $pos += 4; + } + if ($flags & 0x08) { # signature exists? + $pos + 32 > $end and $et->Warn('Missing JUMD signature'), return 0; + $et->HandleTag($tagTablePtr, 'sig', substr($$dataPt, $pos, 32)); + $pos += 32; + } + $pos == $end or $et->Warn('Extra data in JUMD box'." $pos $end", 1); + return 1; +} + +#------------------------------------------------------------------------------ +# Create new JPEG 2000 boxes when writing +# (Currently only supports adding top-level Writable JPEG2000 tags and certain UUID boxes) +# Inputs: 0) ExifTool object ref, 1) Output file or scalar ref +# Returns: 1 on success +sub CreateNewBoxes($$) +{ + my ($et, $outfile) = @_; + my $addTags = $$et{AddJp2Tags}; + my $addDirs = $$et{AddJp2Dirs}; + delete $$et{AddJp2Tags}; + delete $$et{AddJp2Dirs}; + my ($tag, $dirName); + # add JPEG2000 tags + foreach $tag (sort keys %$addTags) { + my $tagInfo = $$addTags{$tag}; + my $nvHash = $et->GetNewValueHash($tagInfo); + # (native JPEG2000 information is always preferred, so don't check IsCreating) + next unless $$tagInfo{List} or $et->IsOverwriting($nvHash) > 0; + next if $$nvHash{EditOnly}; + my @vals = $et->GetNewValue($nvHash); + my $val; + foreach $val (@vals) { + my $boxhdr = pack('N', length($val) + 8) . $$tagInfo{TagID}; + Write($outfile, $boxhdr, $val) or return 0; + ++$$et{CHANGED}; + $et->VerboseValue("+ Jpeg2000:$$tagInfo{Name}", $val); + } + } + # add UUID boxes (and/or JXL Exif/XML boxes) + foreach $dirName (sort keys %$addDirs) { + # handle JPEG XL XMP and EXIF + if ($dirName eq 'XML' or $dirName eq 'Exif') { + my ($tag, $dir) = $dirName eq 'XML' ? ('xml ', 'XMP') : ('Exif', 'EXIF'); + my $tagInfo = $Image::ExifTool::Jpeg2000::Main{$tag}; + $tagInfo = $$tagInfo[1] if ref $tagInfo eq 'ARRAY'; # (hack for stupid JXL XMP) + my $subdir = $$tagInfo{SubDirectory}; + my $tagTable = GetTagTable($$subdir{TagTable}); + $tagTable = GetTagTable('Image::ExifTool::XMP::Main') if $dir eq 'XMP'; + my %dirInfo = ( + DirName => $dir, + Parent => 'JP2', + ); + my $newdir = $et->WriteDirectory(\%dirInfo, $tagTable, $$subdir{WriteProc}); + if (defined $newdir and length $newdir) { + # not sure why, but EXIF box is padded with leading 0's in my sample + my $pad = $dirName eq 'Exif' ? "\0\0\0\0" : ''; + my $boxhdr = pack('N', length($newdir) + length($pad) + 8) . $tag; + Write($outfile, $boxhdr, $pad, $newdir) or return 0; + next; + } + } + next unless $uuid{$dirName}; + my $tagInfo; + foreach $tagInfo (@{$Image::ExifTool::Jpeg2000::Main{uuid}}) { + next unless $$tagInfo{Name} eq $dirName; + my $subdir = $$tagInfo{SubDirectory}; + my $tagTable = GetTagTable($$subdir{TagTable}); + my %dirInfo = ( + DirName => $$subdir{DirName} || $dirName, + Parent => 'JP2', + ); + # remove "UUID-" from start of directory name to allow appropriate + # directories to be written as a block + $dirInfo{DirName} =~ s/^UUID-//; + my $newdir = $et->WriteDirectory(\%dirInfo, $tagTable, $$subdir{WriteProc}); + if (defined $newdir and length $newdir) { + my $boxhdr = pack('N', length($newdir) + 24) . 'uuid' . $uuid{$dirName}; + Write($outfile, $boxhdr, $newdir) or return 0; + last; + } + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Create Color Specification Box +# Inputs: 0) ExifTool object ref, 1) Output file or scalar ref +# Returns: 1 on success +sub CreateColorSpec($$) +{ + my ($et, $outfile) = @_; + my $meth = $et->GetNewValue('Jpeg2000:ColorSpecMethod'); + my $prec = $et->GetNewValue('Jpeg2000:ColorSpecPrecedence') || 0; + my $approx = $et->GetNewValue('Jpeg2000:ColorSpecApproximation') || 0; + my $icc = $et->GetNewValue('ICC_Profile'); + my $space = $et->GetNewValue('Jpeg2000:ColorSpace'); + my $cdata = $et->GetNewValue('Jpeg2000:ColorSpecData'); + unless ($meth) { + if ($icc) { + $meth = 2; + } elsif (defined $space) { + $meth = 1; + } elsif (defined $cdata) { + $meth = 4; + } else { + $et->Warn('Color space not defined'), return 0; + } + } + if ($meth eq '1') { + defined $space or $et->Warn('Must specify ColorSpace'), return 0; + $cdata = pack('N', $space); + } elsif ($meth eq '2' or $meth eq '3') { + defined $icc or $et->Warn('Must specify ICC_Profile'), return 0; + $cdata = $icc; + } elsif ($meth eq '4') { + defined $cdata or $et->Warn('Must specify ColorSpecData'), return 0; + } else { + $et->Warn('Unknown ColorSpecMethod'), return 0; + } + my $boxhdr = pack('N', length($cdata) + 11) . 'colr'; + Write($outfile, $boxhdr, pack('CCC',$meth,$prec,$approx), $cdata) or return 0; + ++$$et{CHANGED}; + $et->VPrint(1, " + Jpeg2000:ColorSpec\n"); + return 1; +} + +#------------------------------------------------------------------------------ +# Process JPEG 2000 box +# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) Pointer to tag table +# Returns: 1 on success when reading, or -1 on write error +# (or JP2 box or undef when writing from buffer) +sub ProcessJpeg2000Box($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataLen = $$dirInfo{DataLen}; + my $dataPos = $$dirInfo{DataPos}; + my $dirLen = $$dirInfo{DirLen} || 0; + my $dirStart = $$dirInfo{DirStart} || 0; + my $base = $$dirInfo{Base} || 0; + my $raf = $$dirInfo{RAF}; + my $outfile = $$dirInfo{OutFile}; + my $dirEnd = $dirStart + $dirLen; + my ($err, $outBuff, $verbose, $doColour); + + if ($outfile) { + unless ($raf) { + # buffer output to be used for return value + $outBuff = ''; + $outfile = \$outBuff; + } + # determine if we will be writing colr box + if ($$dirInfo{DirName} and $$dirInfo{DirName} eq 'JP2Header') { + $doColour = 2 if defined $et->GetNewValue('ColorSpecMethod') or $et->GetNewValue('ICC_Profile') or + defined $et->GetNewValue('ColorSpecPrecedence') or defined $et->GetNewValue('ColorSpace') or + defined $et->GetNewValue('ColorSpecApproximation') or defined $et->GetNewValue('ColorSpecData'); + } + } else { + # (must not set verbose flag when writing!) + $verbose = $$et{OPTIONS}{Verbose}; + $et->VerboseDir($$dirInfo{DirName}) if $verbose; + } + # loop through all contained boxes + my ($pos, $boxLen, $lastBox); + for ($pos=$dirStart; ; $pos+=$boxLen) { + my ($boxID, $buff, $valuePtr); + my $hdrLen = 8; # the box header length + if ($raf) { + $dataPos = $raf->Tell() - $base; + my $n = $raf->Read($buff,$hdrLen); + unless ($n == $hdrLen) { + $n and $err = '', last; + CreateNewBoxes($et, $outfile) or $err = 1 if $outfile; + last; + } + $dataPt = \$buff; + $dirLen = $dirEnd = $hdrLen; + $pos = 0; + } elsif ($pos >= $dirEnd - $hdrLen) { + $err = '' unless $pos == $dirEnd; + last; + } + $boxLen = unpack("x$pos N",$$dataPt); # (length includes header and data) + $boxID = substr($$dataPt, $pos+4, 4); + # remove old colr boxes if necessary + if ($doColour and $boxID eq 'colr') { + if ($doColour == 1) { # did we successfully write the new colr box? + $et->VPrint(1," - Jpeg2000:ColorSpec\n"); + ++$$et{CHANGED}; + next; + } + $et->Warn('Out-of-order colr box encountered'); + undef $doColour; + } + $lastBox = $boxID; + $pos += $hdrLen; # move to end of box header + if ($boxLen == 1) { + # box header contains an additional 8-byte integer for length + $hdrLen += 8; + if ($raf) { + my $buf2; + if ($raf->Read($buf2,8) == 8) { + $buff .= $buf2; + $dirLen = $dirEnd = $hdrLen; + } + } + $pos > $dirEnd - 8 and $err = '', last; + my ($hi, $lo) = unpack("x$pos N2",$$dataPt); + $hi and $err = "Can't currently handle JPEG 2000 boxes > 4 GB", last; + $pos += 8; # move to end of extended-length box header + $boxLen = $lo - $hdrLen; # length of remaining box data + } elsif ($boxLen == 0) { + if ($raf) { + if ($outfile) { + CreateNewBoxes($et, $outfile) or $err = 1; + # copy over the rest of the file + Write($outfile, $$dataPt) or $err = 1; + while ($raf->Read($buff, 65536)) { + Write($outfile, $buff) or $err = 1; + } + } elsif ($verbose) { + my $msg = sprintf("offset 0x%.4x to end of file", $dataPos + $base + $pos); + $et->VPrint(0, "$$et{INDENT}- Tag '${boxID}' ($msg)\n"); + } + last; # (ignore the rest of the file when reading) + } + $boxLen = $dirEnd - $pos; # data runs to end of file + } else { + $boxLen -= $hdrLen; # length of remaining box data + } + $boxLen < 0 and $err = 'Invalid JPEG 2000 box length', last; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $boxID); + unless (defined $tagInfo or $verbose) { + # no need to process this box + if ($raf) { + if ($outfile) { + Write($outfile, $$dataPt) or $err = 1; + $raf->Read($buff,$boxLen) == $boxLen or $err = '', last; + Write($outfile, $buff) or $err = 1; + } else { + $raf->Seek($boxLen, 1) or $err = 'Seek error', last; + } + } elsif ($outfile) { + Write($outfile, substr($$dataPt, $pos-$hdrLen, $boxLen+$hdrLen)) or $err = '', last; + } + next; + } + if ($raf) { + # read the box data + $dataPos = $raf->Tell() - $base; + $raf->Read($buff,$boxLen) == $boxLen or $err = '', last; + $valuePtr = 0; + $dataLen = $boxLen; + } elsif ($pos + $boxLen > $dirEnd) { + $err = ''; + last; + } else { + $valuePtr = $pos; + } + if (defined $tagInfo and not $tagInfo) { + # GetTagInfo() required the value for a Condition + my $tmpVal = substr($$dataPt, $valuePtr, $boxLen < 128 ? $boxLen : 128); + $tagInfo = $et->GetTagInfo($tagTablePtr, $boxID, \$tmpVal); + } + # delete all UUID boxes and any writable box if deleting all information + if ($outfile and $tagInfo) { + if ($boxID eq 'uuid' and $$et{DEL_GROUP}{'*'}) { + $et->VPrint(0, " Deleting $$tagInfo{Name}\n"); + ++$$et{CHANGED}; + next; + } elsif ($$tagInfo{Writable}) { + my $isOverwriting; + if ($$et{DEL_GROUP}{Jpeg2000}) { + $isOverwriting = 1; + } else { + my $nvHash = $et->GetNewValueHash($tagInfo); + $isOverwriting = $et->IsOverwriting($nvHash); + } + if ($isOverwriting) { + my $val = substr($$dataPt, $valuePtr, $boxLen); + $et->VerboseValue("- Jpeg2000:$$tagInfo{Name}", $val); + ++$$et{CHANGED}; + next; + } elsif (not $$tagInfo{List}) { + delete $$et{AddJp2Tags}{$boxID}; + } + } + } + # create new tag for JUMBF data values with name corresponding to JUMBFLabel + if ($tagInfo and $$et{JUMBFLabel} and (not $$tagInfo{SubDirectory} or $$tagInfo{BlockExtract})) { + $tagInfo = { %$tagInfo, Name => $$et{JUMBFLabel} . ($$tagInfo{JUMBF_Suffix} || '') }; + delete $$tagInfo{Description}; + AddTagToTable($tagTablePtr, '_JUMBF_' . $$et{JUMBFLabel}, $tagInfo); + delete $$tagInfo{Protected}; # (must do this so -j -b returns JUMBF binary data) + $$tagInfo{TagID} = $boxID; + } + if ($verbose) { + $et->VerboseInfo($boxID, $tagInfo, + Table => $tagTablePtr, + DataPt => $dataPt, + Size => $boxLen, + Start => $valuePtr, + Addr => $valuePtr + $dataPos + $base, + ); + next unless $tagInfo; + } + if ($$tagInfo{SubDirectory}) { + my $subdir = $$tagInfo{SubDirectory}; + my $subdirStart = $valuePtr; + if (defined $$subdir{Start}) { + #### eval Start ($valuePtr) + $subdirStart = eval($$subdir{Start}); + } + my $subdirLen = $boxLen - ($subdirStart - $valuePtr); + my %subdirInfo = ( + Parent => 'JP2', + DataPt => $dataPt, + DataPos => -$subdirStart, # (relative to Base) + DataLen => $dataLen, + DirStart => $subdirStart, + DirLen => $subdirLen, + DirName => $$subdir{DirName} || $$tagInfo{Name}, + OutFile => $outfile, + Base => $base + $dataPos + $subdirStart, + ); + my $uuid = $uuid{$$tagInfo{Name}}; + # remove "UUID-" prefix to allow appropriate directories to be written as a block + $subdirInfo{DirName} =~ s/^UUID-//; + my $subTable = GetTagTable($$subdir{TagTable}) || $tagTablePtr; + if ($outfile) { + # remove this directory from our create list + delete $$et{AddJp2Dirs}{$$tagInfo{Name}}; + my $newdir; + # only edit writable UUID, Exif and jp2h boxes + if ($uuid or $boxID eq 'Exif' or ($boxID eq 'xml ' and $$et{IsJXL}) or + ($boxID eq 'jp2h' and $$et{EDIT_DIRS}{jp2h})) + { + $newdir = $et->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc}); + next if defined $newdir and not length $newdir; # next if deleting the box + } elsif (defined $uuid) { + $et->Warn("Not editing $$tagInfo{Name} box", 1); + } + # use old box data if not changed + defined $newdir or $newdir = substr($$dataPt, $subdirStart, $subdirLen); + my $prefixLen = $subdirStart - $valuePtr; + my $boxhdr = pack('N', length($newdir) + 8 + $prefixLen) . $boxID; + $boxhdr .= substr($$dataPt, $valuePtr, $prefixLen) if $prefixLen; + Write($outfile, $boxhdr, $newdir) or $err = 1; + # write new colr box immediately after ihdr + if ($doColour and $boxID eq 'ihdr') { + # (shouldn't be multiple ihdr boxes, but just in case, write only 1) + $doColour = $doColour==2 ? CreateColorSpec($et, $outfile) : 0; + } + } else { + # extract as a block if specified + $subdirInfo{BlockInfo} = $tagInfo if $$tagInfo{BlockExtract}; + $et->Warn("Reading non-standard $$tagInfo{Name} box") if defined $uuid and $uuid eq '0'; + unless ($et->ProcessDirectory(\%subdirInfo, $subTable, $$subdir{ProcessProc})) { + if ($subTable eq $tagTablePtr) { + $err = 'JPEG 2000 format error'; + last; + } + $et->Warn("Unrecognized $$tagInfo{Name} box"); + } + } + } elsif ($$tagInfo{Format} and not $outfile) { + # only save tag values if Format was specified + my $rational; + my $val = ReadValue($dataPt, $valuePtr, $$tagInfo{Format}, undef, $boxLen, \$rational); + if (defined $val) { + my $key = $et->FoundTag($tagInfo, $val); + # save Rational value + $$et{RATIONAL}{$key} = $rational if defined $rational and defined $key; + } + } elsif ($outfile) { + my $boxhdr = pack('N', $boxLen + 8) . $boxID; + Write($outfile, $boxhdr, substr($$dataPt, $valuePtr, $boxLen)) or $err = 1; + } + } + if (defined $err) { + $err or $err = 'Truncated JPEG 2000 box'; + if ($outfile) { + $et->Error($err) unless $err eq '1'; + return $raf ? -1 : undef; + } + $et->Warn($err); + } + return $outBuff if $outfile and not $raf; + return 1; +} + +#------------------------------------------------------------------------------ +# Return bits from a bitstream object +# Inputs: 0) array ref, 1) number of bits +# Returns: specified number of bits as an integer, and shifts input bitstream +sub GetBits($$) +{ + my ($a, $n) = @_; + my $v = 0; + my $bit = 1; + my $i; + while ($n--) { + for ($i=0; $i<@$a; ++$i) { + # consume bits LSB first + my $set = $$a[$i] & 1; + $$a[$i] >>= 1; + if ($i) { + $$a[$i-1] |= 0x80 if $set; + } else { + $v |= $bit if $set; + $bit <<= 1; + } + } + } + return $v; +} + +#------------------------------------------------------------------------------ +# Extract parameters from JPEG XL codestream [unverified!] +# Inputs: 0) ExifTool ref, 1) codestream ref +# Returns: 1 +sub ProcessJXLCodestream($$) +{ + my ($et, $dataPt) = @_; + # add padding if necessary to avoid unpacking past end of data + if (length $$dataPt < 14) { + my $tmp = $$dataPt . ("\0" x 14); + $dataPt = \$tmp; + } + my @a = unpack 'x2C12', $$dataPt; + my ($x, $y); + my $small = GetBits(\@a, 1); + if ($small) { + $y = (GetBits(\@a, 5) + 1) * 8; + } else { + $y = GetBits(\@a, [9, 13, 18, 30]->[GetBits(\@a, 2)]) + 1; + } + my $ratio = GetBits(\@a, 3); + if ($ratio == 0) { + if ($small) { + $x = (GetBits(\@a, 5) + 1) * 8;; + } else { + $x = GetBits(\@a, [9, 13, 18, 30]->[GetBits(\@a, 2)]) + 1; + } + } else { + my $r = [[1,1],[12,10],[4,3],[3,2],[16,9],[5,4],[2,1]]->[$ratio-1]; + $x = int($y * $$r[0] / $$r[1]); + } + $et->FoundTag(ImageWidth => $x); + $et->FoundTag(ImageHeight => $y); + return 1; +} + +#------------------------------------------------------------------------------ +# Read/write meta information from a JPEG 2000 image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid JPEG 2000 file, or -1 on write error +sub ProcessJP2($$) +{ + local $_; + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $outfile = $$dirInfo{OutFile}; + my $hdr; + + # check to be sure this is a valid JPG2000 file + return 0 unless $raf->Read($hdr,12) == 12; + unless ($hdr eq "\0\0\0\x0cjP \x0d\x0a\x87\x0a" or # (ref 1) + $hdr eq "\0\0\0\x0cjP\x1a\x1a\x0d\x0a\x87\x0a" or # (ref 2) + $$et{IsJXL}) + { + return 0 unless $hdr =~ /^\xff\x4f\xff\x51\0/; # check for JP2 codestream format + if ($outfile) { + $et->Error('Writing of J2C files is not yet supported'); + return 0 + } + # add J2C markers if not done already + unless ($Image::ExifTool::jpegMarker{0x4f}) { + $Image::ExifTool::jpegMarker{$_} = $j2cMarker{$_} foreach keys %j2cMarker; + } + $et->SetFileType('J2C'); + $raf->Seek(0,0); + return $et->ProcessJPEG($dirInfo); # decode with JPEG processor + } + if ($outfile) { + Write($outfile, $hdr) or return -1; + if ($$et{IsJXL}) { + $et->InitWriteDirs(\%jxlMap); + $$et{AddJp2Tags} = { }; # (don't add JP2 tags in JXL files) + } else { + $et->InitWriteDirs(\%jp2Map); + $$et{AddJp2Tags} = $et->GetNewTagInfoHash(\%Image::ExifTool::Jpeg2000::Main); + } + # save list of directories to create + my %addDirs = %{$$et{ADD_DIRS}}; # (make a copy) + $$et{AddJp2Dirs} = \%addDirs; + } else { + my ($buff, $fileType); + # recognize JPX and JPM as unique types of JP2 + if ($raf->Read($buff, 12) == 12 and $buff =~ /^.{4}ftyp(.{4})/s) { + $fileType = 'JPX' if $1 eq 'jpx '; + $fileType = 'JPM' if $1 eq 'jpm '; + $fileType = 'JXL' if $1 eq 'jxl '; + } + $raf->Seek(-length($buff), 1) if defined $buff; + $et->SetFileType($fileType); + } + SetByteOrder('MM'); # JPEG 2000 files are big-endian + my %dirInfo = ( + RAF => $raf, + DirName => 'JP2', + OutFile => $$dirInfo{OutFile}, + ); + my $tagTablePtr = GetTagTable('Image::ExifTool::Jpeg2000::Main'); + return $et->ProcessDirectory(\%dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Read meta information from a JPEG XL image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid JPEG XL file, -1 on write error +sub ProcessJXL($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $outfile = $$dirInfo{OutFile}; + my ($hdr, $buff); + + return 0 unless $raf->Read($hdr,12) == 12; + if ($hdr eq "\0\0\0\x0cJXL \x0d\x0a\x87\x0a") { + # JPEG XL in ISO BMFF container + $$et{IsJXL} = 1; + } elsif ($hdr =~ /^\xff\x0a/) { + # JPEG XL codestream + if ($outfile) { + if ($$et{OPTIONS}{IgnoreMinorErrors}) { + $et->Warn('Wrapped JXL codestream in ISO BMFF container'); + } else { + $et->Error('Will wrap JXL codestream in ISO BMFF container for writing',1); + return 0; + } + $$et{IsJXL} = 2; + my $buff = "\0\0\0\x0cJXL \x0d\x0a\x87\x0a\0\0\0\x14ftypjxl \0\0\0\0jxl "; + # add metadata to empty ISO BMFF container + $$dirInfo{RAF} = new File::RandomAccess(\$buff); + } else { + $et->SetFileType('JXL Codestream','image/jxl', 'jxl'); + return ProcessJXLCodestream($et, \$hdr); + } + } else { + return 0; + } + $raf->Seek(0,0) or $et->Error('Seek error'), return 0; + + my $success = ProcessJP2($et, $dirInfo); + + if ($outfile and $success > 0 and $$et{IsJXL} == 2) { + # attach the JXL codestream box to the ISO BMFF file + $raf->Seek(0,2) or return -1; + my $size = $raf->Tell(); + $raf->Seek(0,0) or return -1; + SetByteOrder('MM'); + Write($outfile, Set32u($size + 8), 'jxlc') or return -1; + while ($raf->Read($buff, 65536)) { + Write($outfile, $buff) or return -1; + } + } + return $success; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Jpeg2000 - Read JPEG 2000 meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to read JPEG 2000 +files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.jpeg.org/public/fcd15444-2.pdf> + +=item L<ftp://ftp.remotesensing.org/jpeg2000/fcd15444-1.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Jpeg2000 Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Kodak.pm b/lib/Image/ExifTool/Kodak.pm new file mode 100644 index 0000000..18c5eb5 --- /dev/null +++ b/lib/Image/ExifTool/Kodak.pm @@ -0,0 +1,3279 @@ +#------------------------------------------------------------------------------ +# File: Kodak.pm +# +# Description: Kodak EXIF maker notes and APP3 "Meta" tags +# +# Revisions: 03/28/2005 - P. Harvey Created +# +# References: 1) http://search.cpan.org/dist/Image-MetaData-JPEG/ +# 2) http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html +# 3) http://www.cybercom.net/~dcoffin/dcraw/ +# 4) Jim McGarvey private communication +# IB) Iliah Borg private communication (LibRaw) +# +# Notes: There really isn't much public information about Kodak formats. +# The only source I could find was Image::MetaData::JPEG, which +# didn't provide information about decoding the tag values. So +# this module represents a lot of work downloading sample images +# (about 100MB worth!), and testing with my daughter's CX4200. +#------------------------------------------------------------------------------ + +package Image::ExifTool::Kodak; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.47'; + +sub ProcessKodakIFD($$$); +sub ProcessKodakText($$$); +sub ProcessPose($$$); +sub WriteKodakIFD($$$); + +# Kodak type 1 maker notes (ref 1) +%Image::ExifTool::Kodak::Main = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + NOTES => q{ + The table below contains the most common set of Kodak tags. The following + Kodak camera models have been tested and found to use these tags: C360, + C663, C875, CX6330, CX6445, CX7330, CX7430, CX7525, CX7530, DC4800, DC4900, + DX3500, DX3600, DX3900, DX4330, DX4530, DX4900, DX6340, DX6440, DX6490, + DX7440, DX7590, DX7630, EasyShare-One, LS420, LS443, LS633, LS743, LS753, + V530, V550, V570, V603, V610, V705, Z650, Z700, Z710, Z730, Z740, Z760 and + Z7590. + }, + WRITABLE => 1, + FIRST_ENTRY => 8, + 0x00 => { + Name => 'KodakModel', + Format => 'string[8]', + }, + 0x09 => { + Name => 'Quality', + PrintConv => { #PH + 1 => 'Fine', + 2 => 'Normal', + }, + }, + 0x0a => { + Name => 'BurstMode', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x0c => { + Name => 'KodakImageWidth', + Format => 'int16u', + }, + 0x0e => { + Name => 'KodakImageHeight', + Format => 'int16u', + }, + 0x10 => { + Name => 'YearCreated', + Groups => { 2 => 'Time' }, + Format => 'int16u', + }, + 0x12 => { + Name => 'MonthDayCreated', + Groups => { 2 => 'Time' }, + Format => 'int8u[2]', + ValueConv => 'sprintf("%.2d:%.2d",split(" ", $val))', + ValueConvInv => '$val=~tr/:./ /;$val', + }, + 0x14 => { + Name => 'TimeCreated', + Groups => { 2 => 'Time' }, + Format => 'int8u[4]', + Shift => 'Time', + ValueConv => 'sprintf("%.2d:%.2d:%.2d.%.2d",split(" ", $val))', + ValueConvInv => '$val=~tr/:./ /;$val', + }, + 0x18 => { + Name => 'BurstMode2', + Format => 'int16u', + Unknown => 1, # not sure about this tag (or other 'Unknown' tags) + }, + 0x1b => { + Name => 'ShutterMode', + PrintConv => { #PH + 0 => 'Auto', + 8 => 'Aperture Priority', + 32 => 'Manual?', + }, + }, + 0x1c => { + Name => 'MeteringMode', + PrintConv => { #PH + 0 => 'Multi-segment', + 1 => 'Center-weighted average', + 2 => 'Spot', + }, + }, + 0x1d => 'SequenceNumber', + 0x1e => { + Name => 'FNumber', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => 'int($val * 100 + 0.5)', + }, + 0x20 => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val / 1e5', + ValueConvInv => '$val * 1e5', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x24 => { + Name => 'ExposureCompensation', + Format => 'int16s', + ValueConv => '$val / 1000', + ValueConvInv => '$val * 1000', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x26 => { + Name => 'VariousModes', + Format => 'int16u', + Unknown => 1, + }, + 0x28 => { + Name => 'Distance1', + Format => 'int32u', + Unknown => 1, + }, + 0x2c => { + Name => 'Distance2', + Format => 'int32u', + Unknown => 1, + }, + 0x30 => { + Name => 'Distance3', + Format => 'int32u', + Unknown => 1, + }, + 0x34 => { + Name => 'Distance4', + Format => 'int32u', + Unknown => 1, + }, + 0x38 => { + Name => 'FocusMode', + PrintConv => { + 0 => 'Normal', + 2 => 'Macro', + }, + }, + 0x3a => { + Name => 'VariousModes2', + Format => 'int16u', + Unknown => 1, + }, + 0x3c => { + Name => 'PanoramaMode', + Format => 'int16u', + Unknown => 1, + }, + 0x3e => { + Name => 'SubjectDistance', + Format => 'int16u', + Unknown => 1, + }, + 0x40 => { + Name => 'WhiteBalance', + Priority => 0, + PrintConv => { #PH + 0 => 'Auto', + 1 => 'Flash?', + 2 => 'Tungsten', + 3 => 'Daylight', + # 5 - seen this for "Auto" with a ProBack 645M + }, + }, + 0x5c => { + Name => 'FlashMode', + Flags => 'PrintHex', + # various models express this number differently + PrintConv => { #PH + 0x00 => 'Auto', + 0x01 => 'Fill Flash', + 0x02 => 'Off', + 0x03 => 'Red-Eye', + 0x10 => 'Fill Flash', + 0x20 => 'Off', + 0x40 => 'Red-Eye?', + }, + }, + 0x5d => { + Name => 'FlashFired', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0x5e => { + Name => 'ISOSetting', + Format => 'int16u', + PrintConv => '$val ? $val : "Auto"', + PrintConvInv => '$val=~/^\d+$/ ? $val : 0', + }, + 0x60 => { + Name => 'ISO', + Format => 'int16u', + }, + 0x62 => { + Name => 'TotalZoom', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + }, + 0x64 => { + Name => 'DateTimeStamp', + Format => 'int16u', + PrintConv => '$val ? "Mode $val" : "Off"', + PrintConvInv => '$val=~tr/0-9//dc; $val ? $val : 0', + }, + 0x66 => { + Name => 'ColorMode', + Format => 'int16u', + Flags => 'PrintHex', + # various models express this number differently + PrintConv => { #PH + 0x01 => 'B&W', + 0x02 => 'Sepia', + 0x03 => 'B&W Yellow Filter', + 0x04 => 'B&W Red Filter', + 0x20 => 'Saturated Color', + 0x40 => 'Neutral Color', + 0x100 => 'Saturated Color', + 0x200 => 'Neutral Color', + 0x2000 => 'B&W', + 0x4000 => 'Sepia', + }, + }, + 0x68 => { + Name => 'DigitalZoom', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + }, + 0x6b => { + Name => 'Sharpness', + Format => 'int8s', + %Image::ExifTool::Exif::printParameter, + }, +); + +# Kodak type 2 maker notes (ref PH) +%Image::ExifTool::Kodak::Type2 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + NOTES => q{ + These tags are used by the Kodak DC220, DC260, DC265 and DC290, + Hewlett-Packard PhotoSmart 618, C500 and C912, Pentax EI-200 and EI-2000, + and Minolta EX1500Z. + }, + WRITABLE => 1, + FIRST_ENTRY => 0, + 0x08 => { + Name => 'KodakMaker', + Format => 'string[32]', + }, + 0x28 => { + Name => 'KodakModel', + Format => 'string[32]', + }, + 0x6c => { + Name => 'KodakImageWidth', + Format => 'int32u', + }, + 0x70 => { + Name => 'KodakImageHeight', + Format => 'int32u', + }, +); + +# Kodak type 3 maker notes (ref PH) +%Image::ExifTool::Kodak::Type3 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + NOTES => 'These tags are used by the DC240, DC280, DC3400 and DC5000.', + WRITABLE => 1, + FIRST_ENTRY => 0, + 0x0c => { + Name => 'YearCreated', + Groups => { 2 => 'Time' }, + Format => 'int16u', + }, + 0x0e => { + Name => 'MonthDayCreated', + Groups => { 2 => 'Time' }, + Format => 'int8u[2]', + ValueConv => 'sprintf("%.2d:%.2d",split(" ", $val))', + ValueConvInv => '$val=~tr/:./ /;$val', + }, + 0x10 => { + Name => 'TimeCreated', + Groups => { 2 => 'Time' }, + Format => 'int8u[4]', + Shift => 'Time', + ValueConv => 'sprintf("%2d:%.2d:%.2d.%.2d",split(" ", $val))', + ValueConvInv => '$val=~tr/:./ /;$val', + }, + 0x1e => { + Name => 'OpticalZoom', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + }, + 0x37 => { + Name => 'Sharpness', + Format => 'int8s', + %Image::ExifTool::Exif::printParameter, + }, + 0x38 => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val / 1e5', + ValueConvInv => '$val * 1e5', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x3c => { + Name => 'FNumber', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => 'int($val * 100 + 0.5)', + }, + 0x4e => { + Name => 'ISO', + Format => 'int16u', + }, +); + +# Kodak type 4 maker notes (ref PH) +%Image::ExifTool::Kodak::Type4 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + NOTES => 'These tags are used by the DC200 and DC215.', + WRITABLE => 1, + FIRST_ENTRY => 0, + 0x20 => { + Name => 'OriginalFileName', + Format => 'string[12]', + }, +); + +# Kodak type 5 maker notes (ref PH) +%Image::ExifTool::Kodak::Type5 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + NOTES => q{ + These tags are used by the CX4200, CX4210, CX4230, CX4300, CX4310, CX6200 + and CX6230. + }, + WRITABLE => 1, + FIRST_ENTRY => 0, + 0x14 => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val / 1e5', + ValueConvInv => '$val * 1e5', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x1a => { + Name => 'WhiteBalance', + PrintConv => { + 1 => 'Daylight', + 2 => 'Flash', + 3 => 'Tungsten', + }, + }, + 0x1c => { + Name => 'FNumber', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => 'int($val * 100 + 0.5)', + }, + 0x1e => { + Name => 'ISO', + Format => 'int16u', + }, + 0x20 => { + Name => 'OpticalZoom', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + }, + 0x22 => { + Name => 'DigitalZoom', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + }, + 0x27 => { + Name => 'FlashMode', + PrintConv => { + 0 => 'Auto', + 1 => 'On', + 2 => 'Off', + 3 => 'Red-Eye', + }, + }, + 0x2a => { + Name => 'ImageRotated', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0x2b => { + Name => 'Macro', + PrintConv => { 0 => 'On', 1 => 'Off' }, + }, +); + +# Kodak type 6 maker notes (ref PH) +%Image::ExifTool::Kodak::Type6 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + NOTES => 'These tags are used by the DX3215 and DX3700.', + WRITABLE => 1, + FIRST_ENTRY => 0, + 0x10 => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val / 1e5', + ValueConvInv => '$val * 1e5', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x14 => { + Name => 'ISOSetting', + Format => 'int32u', + Unknown => 1, + }, + 0x18 => { + Name => 'FNumber', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => 'int($val * 100 + 0.5)', + }, + 0x1a => { + Name => 'ISO', + Format => 'int16u', + }, + 0x1c => { + Name => 'OpticalZoom', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + }, + 0x1e => { + Name => 'DigitalZoom', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + }, + 0x22 => { + Name => 'Flash', + Format => 'int16u', + PrintConv => { + 0 => 'No Flash', + 1 => 'Fired', + }, + }, +); + +# Kodak type 7 maker notes (ref PH) +%Image::ExifTool::Kodak::Type7 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + NOTES => q{ + The maker notes of models such as the C340, C433, CC533, LS755, V803 and + V1003 seem to start with the camera serial number. The C310, C315, C330, + C643, C743, CD33, CD43, CX7220 and CX7300 maker notes are also decoded using + this table, although the strings for these cameras don't conform to the + usual Kodak serial number format, and instead have the model name followed + by 8 digits. + }, + 0 => { # (not confirmed) + Name => 'SerialNumber', + Format => 'string[16]', + ValueConv => '$val=~s/\s+$//; $val', # remove trailing whitespace + ValueConvInv => '$val', + }, +); + +# Kodak IFD-format maker notes (ref PH) +%Image::ExifTool::Kodak::Type8 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + Kodak models such as the ZD710, P712, P850, P880, V1233, V1253, V1275, + V1285, Z612, Z712, Z812, Z885 use standard TIFF IFD format for the maker + notes. In keeping with Kodak's strategy of inconsistent makernotes, models + such as the M380, M1033, M1093, V1073, V1273, Z1012, Z1085 and Z8612 + also use these tags, but these makernotes begin with a TIFF header instead + of an IFD entry count and use relative instead of absolute offsets. There + is a large amount of information stored in these maker notes (apparently + with much duplication), but relatively few tags have so far been decoded. + }, + 0xfc00 => [{ + Name => 'SubIFD0', + Condition => '$format eq "undef"', + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + NestedHtmlDump => 2, # (so HtmlDump doesn't show these as double-referenced) + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD0', + Base => '$start', + ProcessProc => \&ProcessKodakIFD, + WriteProc => \&WriteKodakIFD, + }, + },{ + Name => 'SubIFD0', + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD0', + Start => '$val', + # (odd but true: the Base for this SubIFD is different than 0xfc01-0xfc06) + }, + }], + # SubIFD1 and higher data is preceded by a TIFF byte order mark to indicate + # the byte ordering used. Beginning with the M580, these subdirectories are + # stored as 'undef' data rather than as a standard EXIF SubIFD. + 0xfc01 => [{ + Name => 'SubIFD1', + Condition => '$format eq "undef"', + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD1', + Base => '$start', + }, + },{ + Name => 'SubIFD1', + Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD1', + Start => '$val', + Base => '$start', + }, + }], + 0xfc02 => [{ + Name => 'SubIFD2', + Condition => '$format eq "undef"', + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD2', + Base => '$start', + }, + },{ + Name => 'SubIFD2', + Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD2', + Start => '$val', + Base => '$start', + }, + }], + 0xfc03 => [{ + Name => 'SubIFD3', + Condition => '$format eq "undef"', + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD3', + Base => '$start', + }, + },{ + Name => 'SubIFD3', + Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD3', + Start => '$val', + Base => '$start', + }, + }], + # (SubIFD4 has the pointer zeroed in my samples, but support it + # in case it is used by future models -- ignored if pointer is zero) + 0xfc04 => [{ + Name => 'SubIFD4', + Condition => '$format eq "undef"', + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD4', + Base => '$start', + }, + },{ + Name => 'SubIFD4', + Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD4', + Start => '$val', + Base => '$start', + }, + }], + 0xfc05 => [{ + Name => 'SubIFD5', + Condition => '$format eq "undef"', + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD5', + Base => '$start', + }, + },{ + Name => 'SubIFD5', + Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD5', + Start => '$val', + Base => '$start', + }, + }], + 0xfc06 => [{ # new for the M580 + Name => 'SubIFD6', + Condition => '$format eq "undef"', + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD6', + Base => '$start', + }, + },{ + Name => 'SubIFD6', + Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD6', + Start => '$val', + Base => '$start', + }, + }], + 0xfcff => { + Name => 'SubIFD255', + Condition => '$format eq "undef"', + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SubIFD0', + # (uses the same Base as the main MakerNote IFD) + }, + }, + 0xff00 => { + Name => 'CameraInfo', + Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::CameraInfo', + Start => '$val', + # (uses the same Base as the main MakerNote IFD) + }, + }, +); + +# Kodak type 9 maker notes (ref PH) +%Image::ExifTool::Kodak::Type9 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + NOTES => q{ + These tags are used by the Kodak C140, C180, C913, C1013, M320, M340 and + M550, as well as various cameras marketed by other manufacturers. + }, + 0x0c => [ + { + Name => 'FNumber', + Condition => '$$self{Make} =~ /Kodak/i', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => 'int($val * 100 + 0.5)', + },{ + Name => 'FNumber', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => 'int($val * 10 + 0.5)', + }, + ], + 0x10 => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val / 1e6', + ValueConvInv => '$val * 1e6', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x14 => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Format => 'string[20]', + Shift => 'Time', + ValueConv => '$val=~s{/}{:}g; $val', + ValueConvInv => '$val=~s{^(\d{4}):(\d{2}):}{$1/$2/}; $val', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,0)', + }, + 0x34 => { + Name => 'ISO', + Format => 'int16u', + }, + 0x57 => { + Name => 'FirmwareVersion', + Condition => '$$self{Make} =~ /Kodak/i', + Format => 'string[16]', + Notes => 'Kodak only', + }, + 0xa8 => { + Name => 'UnknownNumber', # (was SerialNumber, but not unique for all cameras. eg. C1013) + Condition => '$$self{Make} =~ /Kodak/i and $$valPt =~ /^([A-Z0-9]{1,11}\0|[A-Z0-9]{12})/i', + Format => 'string[12]', + Notes => 'Kodak only', + Writable => 0, + }, + 0xc4 => { + Name => 'UnknownNumber', # (confirmed NOT to be serial number for Easyshare Mini - PH) + Condition => '$$self{Make} =~ /Kodak/i and $$valPt =~ /^([A-Z0-9]{1,11}\0|[A-Z0-9]{12})/i', + Format => 'string[12]', + Notes => 'Kodak only', + Writable => 0, + }, +); + +# more Kodak IFD-format maker notes (ref PH) +%Image::ExifTool::Kodak::Type10 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PRIORITY => 0, + NOTES => q{ + Another variation of the IFD-format type, this time with just a byte order + indicator instead of a full TIFF header. These tags are used by the Z980. + }, + # 0x01 int16u - always 0 + 0x02 => { + Name => 'PreviewImageSize', + Writable => 'int16u', + Count => 2, + PrintConv => '$val =~ tr/ /x/; $val', + PrintConvInv => '$val =~ tr/x/ /; $val', + }, + # 0x03 int32u - ranges from about 33940 to 40680 + # 0x04 int32u - always 18493 + # 0x06 undef[4] - 07 d9 04 11 + # 0x07 undef[3] - varies + # 0x08 int16u - 1 (mostly), 2 + # 0x09 int16u - 255 + # 0x0b int16u[2] - '0 0' (mostly), '20 0', '21 0', '1 0' + # 0x0c int16u - 1 (mostly), 3, 259, 260 + # 0x0d int16u - 0 + # 0x0e int16u - 0, 1, 2 (MeteringMode? 0=Partial, 1,2=Multi) + # 0x0f int16u - 0, 5 (MeteringMode? 0=Multi, 5=Partial) + # 0x10 int16u - ranges from about 902 to 2308 + 0x12 => { + Name => 'ExposureTime', + Writable => 'int32u', + ValueConv => '$val / 1e5', + ValueConvInv => '$val * 1e5', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x13 => { + Name => 'FNumber', + Writable => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x14 => { + Name => 'ISO', + Writable => 'int16u', + ValueConv => 'exp($val/3*log(2))*25', + ValueConvInv => '3*log($val/25)/log(2)', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + # 0x15 int16u - 18-25 (SceneMode? 21=auto, 24=Aperture Priority, 19=high speed) + # 0x16 int16u - 50 + # 0x17 int16u - 0, 65535 (MeteringMode? 0=Multi, 65535=Partial) + # 0x19 int16u - 0, 4 (WhiteBalance? 0=Auto, 4=Manual) + # 0x1a int16u - 0, 65535 + # 0x1b int16u - 416-696 + # 0x1c int16u - 251-439 (low when 0x1b is high) + 0x1d => { + Name => 'FocalLength', + Writable => 'int32u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm//;$val', + }, + # 0x1e int16u - 100 + # 0x1f int16u - 0, 1 + # 0x20,0x21 int16u - 1 + # 0x27 undef[4] - fe ff ff ff + # 0x32 undef[4] - 00 00 00 00 + # 0x61 int32u[2] - '0 0' or '34050 0' + # 0x62 int8u - 0, 1 + # 0x63 int8u - 1 + # 0x64,0x65 int8u - 0, 1, 2 + # 0x66 int32u - 0 + # 0x67 int32u - 3 + # 0x68 int32u - 0 + # 0x3fe undef[2540] +); + +# Kodak PixPro S-1 maker notes (ref PH) +# (similar to Ricoh::Type2 and GE::Main) +%Image::ExifTool::Kodak::Type11 = ( + # (can't currently write these) + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES =>q{ + These tags are found in models such as the PixPro S-1. They are not + writable because the inconsistency of Kodak maker notes is beginning to get + on my nerves. + }, + # (these are related to the Kodak QuickTime UserData tags) + 0x0104 => 'FirmwareVersion', + 0x0203 => { + Name => 'PictureEffect', + PrintConv => { + 0 => 'None', + 3 => 'Monochrome', + 9 => 'Kodachrome', + }, + }, + # 0x0204 - ExposureComp or FlashExposureComp maybe? + 0x0207 => 'KodakModel', + 0x0300 => 'KodakMake', + 0x0308 => 'LensSerialNumber', + 0x0309 => 'LensModel', + 0x030d => { Name => 'LevelMeter', Unknown => 1 }, # (guess) + 0x0311 => 'Pitch', # Units?? + 0x0312 => 'Yaw', # Units?? + 0x0313 => 'Roll', # Units?? + 0x0314 => { Name => 'CX', Unknown => 1 }, + 0x0315 => { Name => 'CY', Unknown => 1 }, + 0x0316 => { Name => 'Rads', Unknown => 1 }, +); + +# Kodak SubIFD0 tags (ref PH) +%Image::ExifTool::Kodak::SubIFD0 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'SubIFD0 through SubIFD5 tags are written a number of newer Kodak models.', + 0xfa02 => { + Name => 'SceneMode', + Writable => 'int16u', + Notes => 'may not be valid for some models', # eg. M580? + PrintConvColumns => 2, + PrintConv => { + 1 => 'Sport', + 3 => 'Portrait', + 4 => 'Landscape', + 6 => 'Beach', + 7 => 'Night Portrait', + 8 => 'Night Landscape', + 9 => 'Snow', + 10 => 'Text', + 11 => 'Fireworks', + 12 => 'Macro', + 13 => 'Museum', + 16 => 'Children', + 17 => 'Program', + 18 => 'Aperture Priority', + 19 => 'Shutter Priority', + 20 => 'Manual', + 25 => 'Back Light', + 28 => 'Candlelight', + 29 => 'Sunset', + 31 => 'Panorama Left-right', + 32 => 'Panorama Right-left', + 33 => 'Smart Scene', + 34 => 'High ISO', + }, + }, + # 0xfa04 - values: 0 (normally), 2 (panorama shots) + # 0xfa0f - values: 0 (normally), 1 (macro?) + # 0xfa11 - some sort of FNumber (x 100) + 0xfa19 => { + Name => 'SerialNumber', # (verified with Z712 - PH) + Writable => 'string', + }, + 0xfa1d => { + Name => 'KodakImageWidth', + Writable => 'int16u', + }, + 0xfa1e => { + Name => 'KodakImageHeight', + Writable => 'int16u', + }, + 0xfa20 => { + Name => 'SensorWidth', + Writable => 'int16u', + }, + 0xfa21 => { + Name => 'SensorHeight', + Writable => 'int16u', + }, + 0xfa23 => { + Name => 'FNumber', + Writable => 'int16u', + Priority => 0, + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + }, + 0xfa24 => { + Name => 'ExposureTime', + Writable => 'int32u', + Priority => 0, + ValueConv => '$val / 1e5', + ValueConvInv => '$val * 1e5', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0xfa2e => { + Name => 'ISO', + Writable => 'int16u', + Priority => 0, + }, + 0xfa3d => { + Name => 'OpticalZoom', + Writable => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => 'sprintf("%.2f",$val)', + PrintConvInv => '$val=~s/ ?x//; $val', + }, + 0xfa46 => { + Name => 'ISO', + Writable => 'int16u', + Priority => 0, + }, + # 0xfa4c - related to focal length (1=wide, 32=full zoom) + 0xfa51 => { + Name => 'KodakImageWidth', + Writable => 'int16u', + }, + 0xfa52 => { + Name => 'KodakImageHeight', + Writable => 'int16u', + }, + 0xfa54 => { + Name => 'ThumbnailWidth', + Writable => 'int16u', + }, + 0xfa55 => { + Name => 'ThumbnailHeight', + Writable => 'int16u', + }, + 0xfa57 => { + Name => 'PreviewImageWidth', + Writable => 'int16u', + }, + 0xfa58 => { + Name => 'PreviewImageHeight', + Writable => 'int16u', + }, +); + +# Kodak SubIFD1 tags (ref PH) +%Image::ExifTool::Kodak::SubIFD1 = ( + PROCESS_PROC => \&ProcessKodakIFD, + WRITE_PROC => \&WriteKodakIFD, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x0027 => { + Name => 'ISO', + Writable => 'int16u', + Priority => 0, + }, + 0x0028 => { + Name => 'ISO', + Writable => 'int16u', + Priority => 0, + }, +); + +my %sceneModeUsed = ( + 0 => 'Program', + 2 => 'Aperture Priority', + 3 => 'Shutter Priority', + 4 => 'Manual', + 5 => 'Portrait', + 6 => 'Sport', + 7 => 'Children', + 8 => 'Museum', + 10 => 'High ISO', + 11 => 'Text', + 12 => 'Macro', + 13 => 'Back Light', + 16 => 'Landscape', + 17 => 'Night Landscape', + 18 => 'Night Portrait', + 19 => 'Snow', + 20 => 'Beach', + 21 => 'Fireworks', + 22 => 'Sunset', + 23 => 'Candlelight', + 28 => 'Panorama', +); + +# Kodak SubIFD2 tags (ref PH) +%Image::ExifTool::Kodak::SubIFD2 = ( + PROCESS_PROC => \&ProcessKodakIFD, + WRITE_PROC => \&WriteKodakIFD, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x6002 => { + Name => 'SceneModeUsed', + Writable => 'int32u', + PrintConvColumns => 2, + PrintConv => \%sceneModeUsed, + }, + 0x6006 => { + Name => 'OpticalZoom', + Writable => 'int32u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => 'sprintf("%.2f",$val)', + PrintConvInv => '$val=~s/ ?x//; $val', + }, + # 0x6009 - some sort of FNumber (x 100) + 0x6103 => { + Name => 'MaxAperture', + Writable => 'int32u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + }, + 0xf002 => { + Name => 'SceneModeUsed', + Writable => 'int32u', + PrintConvColumns => 2, + PrintConv => \%sceneModeUsed, + }, + 0xf006 => { + Name => 'OpticalZoom', + Writable => 'int32u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => 'sprintf("%.2f",$val)', + PrintConvInv => '$val=~s/ ?x//; $val', + }, + # 0xf009 - some sort of FNumber (x 100) + 0xf103 => { + Name => 'FNumber', + Writable => 'int32u', + Priority => 0, + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + }, + 0xf104 => { + Name => 'ExposureTime', + Writable => 'int32u', + Priority => 0, + ValueConv => '$val / 1e6', + ValueConvInv => '$val * 1e6', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0xf105 => { + Name => 'ISO', + Writable => 'int32u', + Priority => 0, + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, +); + +# Kodak SubIFD3 tags (ref PH) +%Image::ExifTool::Kodak::SubIFD3 = ( + PROCESS_PROC => \&ProcessKodakIFD, + WRITE_PROC => \&WriteKodakIFD, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x1000 => { + Name => 'OpticalZoom', + Writable => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => 'sprintf("%.2f",$val)', + PrintConvInv => '$val=~s/ ?x//; $val', + }, + # 0x1002 - related to focal length (1=wide, 32=full zoom) + # 0x1006 - pictures remaining? (gradually decreases as pictures are taken) +# +# the following unknown Kodak tags in subIFD3 may store an IFD count of 0 or 1 instead +# of the correct value (which changes from model to model). This bad count is fixed +# with the "FixCount" patch. Models known to have this problem include: +# M380, M1033, M1093IS, V1073, V1233, V1253, V1273, V1275, V1285, Z612, Z712, +# Z812, Z885, Z915, Z950, Z1012IS, Z1085IS, ZD710 +# + 0x2007 => { + Name => 'Kodak_SubIFD3_0x2007', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x2008 => { + Name => 'Kodak_SubIFD3_0x2008', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x2009 => { + Name => 'Kodak_SubIFD3_0x2009', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x200a => { + Name => 'Kodak_SubIFD3_0x200a', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x200b => { + Name => 'Kodak_SubIFD3_0x200b', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x3020 => { + Name => 'Kodak_SubIFD3_0x3020', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x3030 => { + Name => 'Kodak_SubIFD3_0x3030', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x3040 => { + Name => 'Kodak_SubIFD3_0x3040', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x3050 => { + Name => 'Kodak_SubIFD3_0x3050', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x3060 => { + Name => 'Kodak_SubIFD3_0x3060', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x8001 => { + Name => 'Kodak_SubIFD3_0x8001', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x8002 => { + Name => 'Kodak_SubIFD3_0x8002', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x8003 => { + Name => 'Kodak_SubIFD3_0x8003', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x8004 => { + Name => 'Kodak_SubIFD3_0x8004', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x8005 => { + Name => 'Kodak_SubIFD3_0x8005', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x8006 => { + Name => 'Kodak_SubIFD3_0x8006', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x8007 => { + Name => 'Kodak_SubIFD3_0x8007', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x8008 => { + Name => 'Kodak_SubIFD3_0x8008', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x8009 => { + Name => 'Kodak_SubIFD3_0x8009', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x800a => { + Name => 'Kodak_SubIFD3_0x800a', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x800b => { + Name => 'Kodak_SubIFD3_0x800b', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, + 0x800c => { + Name => 'Kodak_SubIFD3_0x800c', + Flags => [ 'FixCount', 'Unknown', 'Hidden' ], + }, +); + +# Kodak SubIFD4 tags (ref PH) +%Image::ExifTool::Kodak::SubIFD4 = ( + PROCESS_PROC => \&ProcessKodakIFD, + WRITE_PROC => \&WriteKodakIFD, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, +); + +# Kodak SubIFD5 tags (ref PH) +%Image::ExifTool::Kodak::SubIFD5 = ( + PROCESS_PROC => \&ProcessKodakIFD, + WRITE_PROC => \&WriteKodakIFD, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x000f => { + Name => 'OpticalZoom', + Writable => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => 'sprintf("%.2f",$val)', + PrintConvInv => '$val=~s/ ?x//; $val', + }, +); + +# Kodak SubIFD6 tags (ref PH) +%Image::ExifTool::Kodak::SubIFD6 = ( + PROCESS_PROC => \&ProcessKodakIFD, + WRITE_PROC => \&WriteKodakIFD, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'SubIFD6 is written by the M580.', +); + +# Decoded from P712, P850 and P880 samples (ref PH) +%Image::ExifTool::Kodak::CameraInfo = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are used by the P712, P850 and P880.', + 0xf900 => { + Name => 'SensorWidth', + Writable => 'int16u', + Notes => 'effective sensor size', + }, + 0xf901 => { + Name => 'SensorHeight', + Writable => 'int16u', + }, + 0xf902 => { + Name => 'BayerPattern', + Writable => 'string', + }, + 0xf903 => { + Name => 'SensorFullWidth', + Writable => 'int16u', + Notes => 'includes black border?', + }, + 0xf904 => { + Name => 'SensorFullHeight', + Writable => 'int16u', + }, + 0xf907 => { + Name => 'KodakImageWidth', + Writable => 'int16u', + }, + 0xf908 => { + Name => 'KodakImageHeight', + Writable => 'int16u', + }, + 0xfa00 => { + Name => 'KodakInfoType', + Writable => 'string', + }, + 0xfa04 => { + Name => 'SerialNumber', # (unverified) + Writable => 'string', + }, + 0xfd04 => { + Name => 'FNumber', + Writable => 'int16u', + Priority => 0, + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + }, + 0xfd05 => { + Name => 'ExposureTime', + Writable => 'int32u', + Priority => 0, + ValueConv => '$val / 1e6', + ValueConvInv => '$val * 1e6', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0xfd06 => { + Name => 'ISO', + Writable => 'int16u', + Priority => 0, + }, +); + +# treat unknown maker notes as binary data (allows viewing with -U) +%Image::ExifTool::Kodak::Unknown = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, +); + +# tags found in the KodakIFD (in IFD0 of KDC, DCR, TIFF and JPEG images) (ref PH) +%Image::ExifTool::Kodak::IFD = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'KodakIFD', 2 => 'Image'}, + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITE_GROUP => 'KodakIFD', + SET_GROUP1 => 1, + NOTES => q{ + These tags are found in a separate IFD of JPEG, TIFF, DCR and KDC images + from some older Kodak models such as the DC50, DC120, DCS760C, DCS Pro 14N, + 14nx, SLR/n, Pro Back and Canon EOS D2000. + }, + # 0x0000: int8u[4] - values: "1 0 0 0" (DC50), "1 1 0 0" (DC120) + 0x0000 => { #4 + Name => 'KodakVersion', + Writable => 'int8u', + Count => 4, + PrintConv => '$val =~ tr/ /./; $val', + PrintConvInv => '$val =~ tr/./ /; $val', + }, + 0x0001 => { + # (related to EV but exact meaning unknown) + Name => 'UnknownEV', # ("DeletedTag", ref 4) + Writable => 'rational64u', + Unknown => 1, + }, + # 0x0002: int8u - values: 0 + 0x0003 => { Name => 'ExposureValue', Writable => 'rational64u' }, + # 0x0004: rational64u - values: 2.875,3.375,3.625,4,4.125,7.25 + # 0x0005: int8u - values: 0 + # 0x0006: int32u[12] - ? + # 0x0007: int32u[3] - values: "65536 67932 69256" + 0x03e9 => { Name => 'OriginalFileName', Writable => 'string' }, + 0x03ea => { Name => 'KodakTag', Writable => 'int32u' }, #4 + 0x03eb => { Name => 'SensorLeftBorder', Writable => 'int16u' }, # ("FinishedImageX", ref 4) + 0x03ec => { Name => 'SensorTopBorder', Writable => 'int16u' }, # ("FinishedImageY", ref 4) + 0x03ed => { Name => 'SensorImageWidth', Writable => 'int16u' }, # ("FinishedImageWidth", ref 4) + 0x03ee => { Name => 'SensorImageHeight',Writable => 'int16u' }, # ("FinishedImageHeight", ref 4) + 0x03ef => { Name => 'BlackLevelTop', Writable => 'int16u' }, #4 + 0x03f0 => { Name => 'BlackLevelBottom', Writable => 'int16u' }, #4 + 0x03f1 => { + Name => 'TextualInfo', # ("CameraSettingString", ref 4) + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::TextualInfo', + }, + }, + 0x03f2 => { #IB/4 + Name => 'FlashMode', + Writable => 'int16u', + Unknown => 1, + Priority => 0, + }, + 0x03f3 => { #IB/4 + Name => 'FlashCompensation', + Writable => 'rational64s', + }, + 0x03f4 => { #4 + Name => 'WindMode', + Writable => 'int16u', + Unknown => 1, + }, + 0x03f5 => { #4 + Name => 'FocusMode', + Writable => 'int16u', + Unknown => 1, + Priority => 0, + }, + 0x03f8 => { #IB/4 + Name => 'MinAperture', + Writable => 'rational64u', + }, + 0x03f9 => { #IB/4 + Name => 'MaxAperture', + Writable => 'rational64u', + }, + 0x03fa => { #4 + Name => 'WhiteBalanceMode', + Writable => 'int16u', + Unknown => 1, + }, + 0x03fb => { #4 + Name => 'WhiteBalanceDetected', + Writable => 'int16u', + Unknown => 1, + }, + 0x03fc => { #3 + Name => 'WhiteBalance', + Writable => 'int16u', + Priority => 0, + PrintConv => { }, # no values yet known + }, + 0x03fd => [{ #3 + Name => 'Processing', + Condition => '$count == 72', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Processing', + }, + },{ + Name => 'ProcessingParameters', #4 + Binary => 1, + # int8u[256] + }], + 0x03fe => { Name => 'ImageAbsoluteX', Writable => 'int16s', }, #4 + 0x03ff => { Name => 'ImageAbsoluteY', Writable => 'int16s' }, #4 + 0x0400 => { Name => 'ApplicationKeyString', Writable => 'string' }, #4 + 0x0401 => { + Name => 'Time', # ("CaptureTime", ref 4) + Groups => { 2 => 'Time' }, + Writable => 'string', + }, + 0x0402 => { #4 + Name => 'GPSString', + Groups => { 2 => 'Location' }, + Writable => 'string', + }, + 0x0403 => { #4 + Name => 'EventLogCapture', + Binary => 1, + Unknown => 1, + # int32u[3072] + }, + 0x0404 => { #4 + Name => 'ComponentTable', + Binary => 1, + Unknown => 1, + }, + 0x0405 => { #4 + Name => 'CustomIlluminant', + Writable => 'int16u', + Unknown => 1, + }, + 0x0406 => [{ #IB/4 + Name => 'CameraTemperature', + Condition => '$count == 1', + Groups => { 2 => 'Camera' }, + Writable => 'rational64s', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + },{ + Name => 'CameraTemperature', + # (when count is 2, values seem related to temperature, but are not Celius) + }], + 0x0407 => { #IB/4 + Name => 'AdapterVoltage', + Groups => { 2 => 'Camera' }, + Writable => 'rational64u', + }, + 0x0408 => { #IB/4 + Name => 'BatteryVoltage', + Groups => { 2 => 'Camera' }, + Writable => 'rational64u', + }, + 0x0409 => { #4 + Name => 'DacVoltages', + # rational64u[8] + }, + 0x040a => { #4 + Name => 'IlluminantDetectorData', + Binary => 1, + Unknown => 1, + }, + 0x040b => { #4 + Name => 'PixelClockFrequency', + Writable => 'int32u', + }, + 0x040c => { #4 + Name => 'CenterPixel', + Writable => 'int16u', + Count => 3, + }, + 0x040d => { #4 + Name => 'BurstCount', + Writable => 'int16u', + }, + 0x040e => { #4 + Name => 'BlackLevelRough', + Writable => 'int16u', + }, + 0x040f => { #4 + Name => 'OffsetMapHorizontal', + Binary => 1, + Unknown => 1, + # int16s[1736] + }, + 0x0410 => { #4 + Name => 'OffsetMapVertical', + Binary => 1, + Unknown => 1, + # int16s[1160] + }, + 0x0411 => { #4 + Name => 'Histogram', + Binary => 1, + Unknown => 1, + # int16u[256] + }, + 0x0412 => { #4 + Name => 'VerticalClockOverlaps', + Writable => 'int16u', + Count => 2, + }, + 0x0413 => 'SensorTemperature', #4 + 0x0414 => { Name => 'XilinxVersion', Writable => 'string' }, #4 + 0x0415 => { Name => 'FirmwareVersion', Writable => 'int32u' }, #4 + 0x0416 => { Name => 'BlackLevelRoughAfter', Writable => 'int16u' }, #4 + 0x0417 => 'BrightRowsTop', #4 + 0x0418 => 'EventLogProcess', #4 + 0x0419 => 'DacVoltagesFlush', #4 + 0x041a => 'FlashUsed', #4 + 0x041b => 'FlashType', #4 + 0x041c => 'SelfTimer', #4 + 0x041d => 'AFMode', #4 + 0x041e => 'LensType', #4 + 0x041f => { Name => 'ImageCropX', Writable => 'int16s' }, #4 + 0x0420 => { Name => 'ImageCropY', Writable => 'int16s' }, #4 + 0x0421 => 'AdjustedTbnImageWidth', #4 + 0x0422 => 'AdjustedTbnImageHeight', #4 + 0x0423 => { Name => 'IntegrationTime', Writable => 'int32u' }, #4 + 0x0424 => 'BracketingMode', #4 + 0x0425 => 'BracketingStep', #4 + 0x0426 => 'BracketingCounter', #4 + 0x042e => 'HuffmanTableLength', #4 (int8u[16]) + 0x042f => 'HuffmanTableValue', #4 (int8u[13]) + 0x0438 => { Name => 'MainBoardVersion', Writable => 'int32u' }, #4 + 0x0439 => { Name => 'ImagerBoardVersion', Writable => 'int32u' }, #4 + 0x044c => 'FocusEdgeMap', #4 + 0x05e6 => 'IdleTiming', #4 + 0x05e7 => 'FlushTiming', #4 + 0x05e8 => 'IntegrateTiming', #4 + 0x05e9 => 'RegisterReadTiming', #4 + 0x05ea => 'FirstLineTransferTiming', #4 + 0x05eb => 'ShiftTiming', #4 + 0x05ec => 'NormalLineTransferTiming', #4 + 0x05ed => 'TestTransferTiming', #4 + # 0x05f0-0x05f9 "TestTiming", ref 4 + 0x05fa => 'MinimumFlushRows', #4 + 0x05fd => { Name => 'ImagerPowerOnDelayMsec', Writable => 'int32u' }, #4 + 0x05fe => 'ImagerInitialTimingCode', #4 + 0x05ff => 'ImagerLogicProgram', #4 + 0x0600 => { Name => 'ImagerBiasSettlingDelayMsec', Writable => 'int32u' }, #4 + 0x0604 => 'IdleSequence', #4 + 0x0605 => 'FirstFlushSequence', #4 + 0x0606 => 'FinalFlushSequence', #4 + 0x0607 => 'SampleBlackSequence', #4 + 0x0608 => 'TransferSequence', #4 + 0x060e => 'DacCountsPerVolt', #4 + 0x060f => 'BlackDacChannel', #4 + 0x0610 => 'BlackAdCountsPerDacVolt', #4 + 0x0611 => 'BlackTarget', #4 + 0x0612 => 'BlackDacSettlingMsec', #4 + # 0x0618-0x062b - reserved for .IF file use, ref 4 + 0x07d0 => { #4 + Name => 'StandardMatrixDaylight', + Writable => 'rational64s', + Count => 9, + }, + 0x07d1 => { #4 + Name => 'StandardMatrixTungsten', + Writable => 'rational64s', + Count => 9, + }, + 0x07d2 => { #4 + Name => 'StandardMatrixFluorescent', + Writable => 'rational64s', + Count => 9, + }, + 0x07d3 => { #4 + Name => 'StandardMatrixFlash', + Writable => 'rational64s', + Count => 9, + }, + 0x07d4 => { #4 (never used) + Name => 'StandardMatrixCustom', + Writable => 'rational64s', + Count => 9, + }, + 0x07da => { #4 + Name => 'DeviantMatrixDaylight', + Writable => 'rational64s', + Count => 9, + }, + 0x07db => { #4 + Name => 'DeviantMatrixTungsten', + Writable => 'rational64s', + Count => 9, + }, + 0x07dc => { #4 + Name => 'DeviantMatrixFluorescent', + Writable => 'rational64s', + Count => 9, + }, + 0x07dd => { #4 + Name => 'DeviantMatrixFlash', + Writable => 'rational64s', + Count => 9, + }, + 0x07de => { #4 (never used) + Name => 'DeviantMatrixCustom', + Writable => 'rational64s', + Count => 9, + }, + 0x07e4 => { #4 + Name => 'UniqueMatrixDaylight', + Writable => 'rational64s', + Count => 9, + }, + 0x07e5 => { #4 + Name => 'UniqueMatrixTungsten', + Writable => 'rational64s', + Count => 9, + }, + 0x07e6 => { #4 + Name => 'UniqueMatrixFluorescent', + Writable => 'rational64s', + Count => 9, + }, + 0x07e7 => { #4 + Name => 'UniqueMatrixFlash', + Writable => 'rational64s', + Count => 9, + }, + 0x07e8 => { #4 + Name => 'UniqueMatrixCustom', + Writable => 'rational64s', + Count => 9, + }, + 0x07e9 => { #4 + Name => 'UniqueMatrixAuto', + Writable => 'rational64s', + Count => 9, + }, + 0x0834 => { #4 + Name => 'StandardWhiteDaylight', + Writable => 'rational64s', + Count => 3, + }, + 0x0835 => { #4 + Name => 'StandardWhiteTungsten', + Writable => 'rational64s', + Count => 3, + }, + 0x0836 => { #4 + Name => 'StandardWhiteFluorescent', + Writable => 'rational64s', + Count => 3, + }, + 0x0837 => { #4 + Name => 'StandardWhiteFlash', + Writable => 'rational64s', + Count => 3, + }, + 0x0838 => { #4 (never used) + Name => 'StandardWhiteCustom', + Writable => 'rational64s', + Count => 3, + }, + 0x083e => { #4 + Name => 'DeviantWhiteDaylight', + Writable => 'rational64s', + Count => 3, + }, + 0x083f => { #4 + Name => 'DeviantWhiteTungsten', + Writable => 'rational64s', + Count => 3, + }, + 0x0840 => { #4 + Name => 'DeviantWhiteFluorescent', + Writable => 'rational64s', + Count => 3, + }, + 0x0841 => { #4 + Name => 'DeviantWhiteFlash', + Writable => 'rational64s', + Count => 3, + }, + 0x0842 => { #4 (never used) + Name => 'DeviantWhiteCustom', + Writable => 'rational64s', + Count => 3, + }, + # 0x0843 - rational64u[3] + # 0x0844 - rational64u[3] + 0x0846 => { #3 ("WhiteBalanceKelvin", ref 4) + Name => 'ColorTemperature', + Writable => 'int16u', + }, + 0x0847 => 'WB_RGBLevelsAsShot', #4 + 0x0848 => 'WB_RGBLevelsDaylight', #IB (rational64s/u[3]) ("UniqueWhiteDaylight", ref 4) + 0x0849 => 'WB_RGBLevelsTungsten', #IB (rational64s/u[3]) ("UniqueWhiteTungsten", ref 4) + 0x084a => 'WB_RGBLevelsFluorescent', #IB (rational64s/u[3]) ("UniqueWhiteFluorescent", ref 4) + 0x084b => 'WB_RGBLevelsFlash', #IB (rational64s/u[3]) ("UniqueWhiteFlash", ref 4) + 0x084c => 'WB_RGBLevelsCustom', #IB (rational64u[3]) ("UniqueWhiteCustom", ref 4) + 0x084d => 'WB_RGBLevelsAuto', #IB (rational64u[3]) ("UniqueWhiteAuto", ref 4) + 0x0852 => { #3/4 + Name => 'WB_RGBMulDaylight', # ("AdjustWhiteFactorsDaylight", ref 4) + Writable => 'rational64u', + Count => 3, + }, + 0x0853 => { #3/4 + Name => 'WB_RGBMulTungsten', # ("AdjustWhiteFactorsTungsten", ref 4) + Writable => 'rational64u', + Count => 3, + }, + 0x0854 => { #3/4 + Name => 'WB_RGBMulFluorescent', # ("AdjustWhiteFactorsFluorescent", ref 4) + Writable => 'rational64u', + Count => 3, + }, + 0x0855 => { #3/4 + Name => 'WB_RGBMulFlash', # ("AdjustWhiteFactorsFlash", ref 4) + Writable => 'rational64u', + Count => 3, + }, + 0x085c => { Name => 'WB_RGBCoeffsDaylight', Binary => 1 }, #3 ("WhiteBalanceParametersDaylight", ref 4) + 0x085d => { Name => 'WB_RGBCoeffsTungsten', Binary => 1 }, #3 ("WhiteBalanceParametersTungsten", ref 4) + 0x085e => { Name => 'WB_RGBCoeffsFluorescent',Binary=>1 }, #3 ("WhiteBalanceParametersFluorescent", ref 4) + 0x085f => { Name => 'WB_RGBCoeffsFlash', Binary => 1 }, #3 ("WhiteBalanceParametersFlash", ref 4) + 0x0898 => { Name => 'ExposureGainDaylight', Writable => 'rational64s' }, #4 + 0x0899 => { Name => 'ExposureGainTungsten', Writable => 'rational64s' }, #4 + 0x089a => { Name => 'ExposureGainFluorescent',Writable=>'rational64s' }, #4 + 0x089b => { Name => 'ExposureGainFlash', Writable => 'rational64s' }, #4 + 0x089c => { Name => 'ExposureGainCustom', Writable => 'rational64s' }, #4 (never used) + 0x089d => { Name => 'AnalogISOTable', Writable => 'rational64u', Count => 3 }, #4 + 0x089e => { Name => 'AnalogCaptureISO', Writable => 'int32u' }, #4 + 0x089f => { Name => 'ISOCalibrationGain', Writable => 'rational64u' }, #4 + 0x08a0 => 'ISOCalibrationGainTable', #4 + 0x08a1 => 'ExposureHeadroomFactor', #4 + 0x08ab => 'LinearitySplineTags', #4 (int16u[24]) + # 0x08ac-0x08fb - LinearitySpline(n) (rational64s[75]) + 0x08fc => { #4 + Name => 'MonitorMatrix', + Writable => 'rational64s', + Count => 9, + }, + 0x08fd => 'TonScaleTable', #4 + 0x08fe => { Name => 'Gamma', Writable => 'rational64u' }, #4 + 0x08ff => 'LogLinTable', #4 + 0x0900 => 'LinLogTable', #4 + 0x0901 => { Name => 'GammaTable', Binary => 1 }, #4 (int16u[4096]) + 0x0902 => { Name => 'LogScale', Writable => 'rational64u' }, #4 + 0x0903 => { Name => 'BaseISO', Writable => 'rational64u' }, #IB (ISO before digital gain) + 0x0904 => { Name => 'LinLogCoring', Writable => 'int16u' }, #4 + 0x0905 => { Name => 'PatternGainConversionTable', Binary => 1 }, #4 (int8u[256]) + 0x0906 => 'DefectCount', #4 + 0x0907 => { Name => 'DefectList', Binary => 1 }, #4 (undef[48]) + 0x0908 => { Name => 'DefectListPacked', Binary => 1 }, #4 (int16u[296]) + 0x0909 => { Name => 'ImageSpace', Writable => 'int16u' }, #4 + 0x090a => { Name => 'ThumbnailCompressionTable',Binary => 1 }, #4 (int8u[4096]) + 0x090b => { Name => 'ThumbnailExpansionTable', Binary => 1 }, #4 (int16u[256]) + 0x090c => { Name => 'ImageCompressionTable', Binary => 1 }, #4 (int16u[4096]) + 0x090d => { Name => 'ImageExpansionTable', Binary => 1 }, #4 (int16u[1024/4096]) + 0x090e => 'EighteenPercentPoint', #4 + 0x090f => { Name => 'DefectIsoCode', Writable => 'int16u' }, #4 + 0x0910 => { Name => 'BaseISODaylight', Writable => 'rational64u' }, #4 + 0x0911 => { Name => 'BaseISOTungsten', Writable => 'rational64u' }, #4 + 0x0912 => { Name => 'BaseISOFluorescent', Writable => 'rational64u' }, #4 + 0x0913 => { Name => 'BaseISOFlash', Writable => 'rational64u' }, #4 + 0x091a => { Name => 'MatrixSelectThreshold',Writable => 'int16s' }, #4 + 0x091b => { Name => 'MatrixSelectK', Writable => 'rational64u' }, #4 + 0x091c => { Name => 'IlluminantDetectTable',Binary => 1 }, #4 (int16u[200]) + 0x091d => 'RGTable', #4 + 0x091e => { Name => 'MatrixSelectThreshold1', Writable => 'int16s' }, #4 + 0x091f => { Name => 'MatrixSelectThreshold2', Writable => 'int16s' }, #4 + 0x0924 => 'PortraitMatrix', #4 + 0x0925 => 'PortraitToneScaleTable', #4 + 0x092e => { Name => 'EnableSharpening', Writable => 'int16u' }, #4 + 0x092f => { #4 + Name => 'SharpeningKernel', + Writable => 'int16s', + Count => 25, + }, + 0x0930 => { Name => 'EdgeMapSlope', Writable => 'int16u' }, #4 + 0x0931 => { Name => 'EdgeMapX1', Writable => 'int16u' }, #4 + 0x0932 => { Name => 'EdgeMapX2', Writable => 'int16u' }, #4 + 0x0933 => { #4 + Name => 'KernelDenominators', + Writable => 'int16u', + Count => 3, + }, + 0x0934 => { Name => 'EdgeMapX3', Writable => 'int16u' }, #4 + 0x0935 => { Name => 'EdgeMapX4', Writable => 'int16u' }, #4 + 0x0936 => 'SharpenForThumbnail', #4 + 0x0937 => 'EdgeSpline', #4 + 0x0938 => 'DownSampleBy2Hor', #4 (int16s[4]) + 0x0939 => 'DownSampleBy2Ver', #4 (int16s[4]) + 0x093a => 'DownSampleBy4Hor', #4 (int16s[6]) + 0x093b => 'DownSampleBy4Ver', #4 (int16s[6]) + 0x093c => 'DownSampleBy3Hor', #4 (int16s[6]) + 0x093d => 'DownSampleBy3Ver', #4 (int16s[6]) + 0x093e => 'DownSampleBy6Hor', #4 (int16s[8]) + 0x093f => 'DownSampleBy6Ver', #4 (int16s[8]) + 0x0940 => 'DownSampleBy2Hor3MPdcr', #4 + 0x0941 => 'DownSampleBy2Ver3MPdcr', #4 + 0x0942 => 'ThumbnailResizeRatio', #4 + 0x0943 => { Name => 'AtCaptureUserCrop', Writable => 'int32u', Count => 4 }, #4 (Top, Left, Bottom, Right) + 0x0944 => { Name => 'ImageResolution', Writable => 'int32u' }, #4 (Contains enum for imageDcrRes or imageJpegRes) + 0x0945 => { Name => 'ImageResolutionJpg', Writable => 'int32u' }, #4 (Contains enum for imageJpegRes) + 0x094c => 'USMParametersLow', #4 (int16s[8]) + 0x094d => 'USMParametersMed', #4 (int16s[8]) + 0x094e => 'USMParametersHigh', #4 (int16s[8]) + 0x094f => 'USMParametersHost', #4 (int16s[10]) + 0x0950 => { Name => 'EdgeSplineLow', Binary => 1 }, #4 (rational64s[57]) + 0x0951 => { Name => 'EdgeSplineMed', Binary => 1 }, #4 (rational64s[69]) + 0x0952 => { Name => 'EdgeSplineHigh',Binary => 1 }, #4 (rational64s[69]) + 0x0953 => 'USMParametersHost6MP', #4 (int16s[10]) + 0x0954 => 'USMParametersHost3MP', #4 (int16s[10]) + 0x0960 => { Name => 'PatternImagerWidth', Writable => 'int16u' }, #4 + 0x0961 => { Name => 'PatternImagerHeight', Writable => 'int16u' }, #4 + 0x0962 => { Name => 'PatternAreaWidth', Writable => 'int16u' }, #4 + 0x0963 => { Name => 'PatternAreaHeight', Writable => 'int16u' }, #4 + 0x0964 => { Name => 'PatternCorrectionGains', Binary => 1 }, #4 (undef[48174]) + 0x0965 => 'PatternCorrectionOffsets', #4 + 0x0966 => { Name => 'PatternX', Writable => 'int16u' }, #4 + 0x0967 => { Name => 'PatternY', Writable => 'int16u' }, #4 + 0x0968 => { Name => 'PatternCorrectionFactors', Binary => 1 }, #4 (undef[48174]) + 0x0969 => { Name => 'PatternCorrectionFactorScale', Writable => 'int16u' }, #4 + 0x096a => { Name => 'PatternCropRows1', Writable => 'int16u' }, #4 + 0x096b => { Name => 'PatternCropRows2', Writable => 'int16u' }, #4 + 0x096c => { Name => 'PatternCropCols1', Writable => 'int16u' }, #4 + 0x096d => { Name => 'PatternCropCols2', Writable => 'int16u' }, #4 + 0x096e => 'PixelCorrectionGains', #4 + 0x096f => 'StitchRows', #4 (int16u[6]) + 0x0970 => 'StitchColumns', #4 (int16u) + 0x0971 => { Name => 'PixelCorrectionScale', Writable => 'int16u' }, #4 + 0x0972 => { Name => 'PixelCorrectionOffset',Writable => 'int16u' }, #4 + 0x0988 => 'LensTableIndex', #4 + 0x0992 => 'DiffTileGains602832', #4 + 0x0993 => 'DiffTileGains24t852822', #4 (reserved tags 2450-2459) + 0x099c => 'TileGainDeterminationTable', #4 (int16s[0]) + 0x099d => 'NemoBlurKernel', #4 (int16s[14]) + 0x099e => 'NemoTileSize', #4 (int16u) + 0x099f => 'NemoGainFactors', #4 (rational64s[4]) + 0x09a0 => 'NemoDarkLimit', #4 (int16u) + 0x09a1 => 'NemoHighlight12Limit', #4 + 0x09c4 => { Name => 'ImagerFileProductionLevel',Writable => 'int16u' }, #4 + 0x09c5 => { Name => 'ImagerFileDateCreated', Writable => 'int32u' }, #4 (unknown encoding - PH) + 0x09c6 => { Name => 'CalibrationVersion', Writable => 'string' }, #4 + 0x09c7 => { Name => 'ImagerFileTagsVersionStandard', Writable => 'int16u' }, #4 + 0x09c8 => { Name => 'IFCameraModel', Writable => 'string' }, #4 + 0x09c9 => { Name => 'CalibrationHistory', Writable => 'string' }, #4 + 0x09ca => { Name => 'CalibrationLog', Binary => 1 }, #4 (undef[1140]) + 0x09ce => { Name => 'SensorSerialNumber', Writable => 'string', Groups => { 2 => 'Camera' } }, #IB/4 + 0x09f6 => 'DefectConcealArtCorrectThres', #4 (no longer used) + 0x09f7 => 'SglColDCACThres1', #4 + 0x09f8 => 'SglColDCACThres2', #4 + 0x09f9 => 'SglColDCACTHres3', #4 + 0x0a01 => 'DblColDCACThres1', #4 + 0x0a02 => 'DblColDCACThres2', #4 + 0x0a0a => { Name => 'DefectConcealThresTable', Binary => 1 }, #4 (int16u[121/79]) + 0x0a28 => 'MonoUniqueMatrix', #4 + 0x0a29 => 'MonoMonitorMatrix', #4 + 0x0a2a => 'MonoToneScaleTable', #4 + # 0x0a32-0x0a3b "OmenInitialSurfaceRed(n)", ref 4 + # 0x0a3c-0x0a45 "OmenInitialSurfaceGoR(n)", ref 4 + # 0x0a46-0x0a4f "OmenInitialSurfaceBlue(n)", ref 4 + # 0x0a50-0x0a59 "OmenInitialSurfaceGoB(n)", ref 4 + 0x0a5a => 'OmenInitialScaling', #4 + 0x0a5b => 'OmenInitialRows', #4 + 0x0a5c => 'OmenInitialColumns', #4 + 0x0a5d => { Name => 'OmenInitialIPFStrength',Writable => 'int32s', Count => 4 }, #4 + 0x0a5e => { Name => 'OmenEarlyStrength', Writable => 'int32s', Count => 4 }, #4 + 0x0a5f => { Name => 'OmenAutoStrength', Writable => 'int32s', Count => 4 }, #4 + 0x0a60 => { Name => 'OmenAtCaptureStrength', Writable => 'int32s', Count => 4 }, #4 + 0x0a61 => 'OmenAtCaptureMode', #4 + 0x0a62 => { Name => 'OmenFocalLengthLimit', Writable => 'int16s' }, #4 + 0x0a64 => { Name => 'OmenSurfaceIndex', Writable => 'int16s' }, #4 (which InitialSurface to use) + 0x0a65 => 'OmenPercentToRationalLimitsRed', #4 (signed rationals for 0 and 100) + 0x0a66 => 'OmenPercentToRationalLimitsGoR', #4 (signed rationals for 0 and 100) + 0x0a67 => 'OmenPercentToRationalLimitsBlue', #4 (signed rationals for 0 and 100) + 0x0a68 => 'OmenPercentToRationalLimitsGoB', #4 (signed rationals for 0 and 100) + 0x0a6e => 'OmenEarlyGoBSurface', #4 + 0x0a6f => 'OmenEarlyGoBRows', #4 + 0x0a70 => 'OmenEarlyGoBColumns', #4 + 0x0a73 => 'OmenSmoothingKernel', #4 + 0x0a74 => 'OmenGradientOffset', #4 + 0x0a75 => 'OmenGradientKernel', #4 + 0x0a76 => 'OmenGradientKernelTaps', #4 + 0x0a77 => 'OmenRatioClipFactors', #4 + 0x0a78 => 'OmenRatioExclusionFactors', #4 + 0x0a79 => 'OmenGradientExclusionLimits', #4 + 0x0a7a => 'OmenROICoordinates', #4 + 0x0a7b => 'OmenROICoefficients', #4 + 0x0a7c => 'OmenRangeWeighting', #4 + 0x0a7d => 'OmenMeanToStrength', #4 + 0x0bb8 => 'FactoryWhiteGainsDaylight', #4 + 0x0bb9 => 'FactoryWhiteOffsetsDaylight', #4 + 0x0bba => 'DacGainsCoarse', #4 + 0x0bbb => 'DacGainsFine', #4 + 0x0bbc => 'DigitalExposureGains', #4 + 0x0bbd => 'DigitalExposureBiases', #4 + 0x0bbe => 'BlackClamp', #4 + 0x0bbf => 'ChannelCoarseGainAdjust', #4 + 0x0bc0 => 'BlackClampOffset', #4 + 0x0bf4 => 'DMPixelThresholdFactor', #4 (TIFF_RATIONAL) + 0x0bf5 => 'DMWindowThresholdFactor', #4 (TIFF_RATIONAL) + 0x0bf6 => 'DMTrimFraction', #4 (TIFF_RATIONAL) + 0x0bf7 => 'DMSmoothRejThresh', #4 (TIFF_RATIONAL) + 0x0bf8 => 'DMFillRejThresh', #4 (TIFF_RATIONAL) + 0x0bf9 => 'VMWsize', #4 (TIFF_SHORT) + 0x0bfa => 'DMErodeRadius', #4 (TIFF_SHORT) + 0x0bfb => 'DMNumPatches', #4 (TIFF_SHORT) + 0x0bfc => 'DMNoiseScale', #4 (TIFF_RATIONAL) + 0x0bfe => 'BrightDefectThreshold', #4 + 0x0bff => 'BrightDefectIntegrationMS', #4 + 0x0c00 => 'BrightDefectIsoCode', #4 + 0x0c03 => 'TopDarkRow1', #4 (support 330 dark map generation algorithm) + 0x0c04 => 'TopDarkRow2', #4 (these tags were 3175-3192 prior to 18Jan2001) + 0x0c05 => 'BottomDarkRow1', #4 + 0x0c06 => 'BottomDarkRow2', #4 + 0x0c07 => 'LeftDarkCol1', #4 + 0x0c08 => 'LeftDarkCol2', #4 + 0x0c09 => 'RightDarkCol1', #4 + 0x0c0a => 'RightDarkCol2', #4 + 0x0c0b => 'HMPixThresh', #4 + 0x0c0c => 'HMColThresh', #4 + 0x0c0d => 'HMWsize', #4 + 0x0c0e => 'HMColRejThresh', #4 + 0x0c0f => 'VMPixThresh', #4 + 0x0c10 => 'VMColThresh', #4 + 0x0c11 => 'VMNbands', #4 + 0x0c12 => 'VMColDropThresh', #4 + 0x0c13 => 'VMPatchResLimit', #4 + 0x0c14 => 'MapScale', #4 + 0x0c1c => 'Klut', #4 + 0x0c1d => 'RimNonlinearity', #4 (Obsolete) + 0x0c1e => 'InverseRimNonlinearity', #4 (Obsolete) + 0x0c1f => 'RembrandtToneScale', #4 (Obsolete) + 0x0c20 => 'RimToNifColorTransform', #4 (Obsolete) + 0x0c21 => 'RimToNifScaleFactor', #4 (Obsolete) + 0x0c22 => 'NifNonlinearity', #4 (Obsolete) + 0x0c23 => 'SBALogTransform', #4 (Obsolete) + 0x0c24 => 'InverseSBALogTransform', #4 (Obsolete) + 0x0c25 => { Name => 'SBABlack', Writable => 'int16u' }, #4 + 0x0c26 => { Name => 'SBAGray', Writable => 'int16u' }, #4 + 0x0c27 => { Name => 'SBAWhite', Writable => 'int16u' }, #4 + 0x0c28 => { Name => 'GaussianWeights', Binary => 1 }, #4 (int16u[864]) + 0x0c29 => { Name => 'SfsBoundary', Binary => 1 }, #4 (int16u[6561]) + 0x0c2a => 'CoringTableBest', #4 (Obsolete) + 0x0c2b => 'CoringTableBetter', #4 (Obsolete) + 0x0c2c => 'CoringTableGood', #4 (Obsolete) + 0x0c2d => 'ExposureReferenceGain', #4 (Obsolete) + 0x0c2e => 'ExposureReferenceOffset', #4 (Obsolete) + 0x0c2f => 'SBARedBalanceLut', #4 (Obsolete) + 0x0c30 => 'SBAGreenBalanceLut', #4 (Obsolete) + 0x0c31 => 'SBABlueBalanceLut', #4 (Obsolete) + 0x0c32 => { Name => 'SBANeutralBAL', Writable => 'int32s' }, #4 + 0x0c33 => { Name => 'SBAGreenMagentaBAL', Writable => 'int32s' }, #4 + 0x0c34 => { Name => 'SBAIlluminantBAL', Writable => 'int32s' }, #4 + 0x0c35 => { Name => 'SBAAnalysisComplete', Writable => 'int8u' }, #4 + 0x0c36 => 'JPEGQTableBest', #4 + 0x0c37 => 'JPEGQTableBetter', #4 + 0x0c38 => 'JPEGQTableGood', #4 + 0x0c39 => 'RembrandtPortraitToneScale', #4 (Obsolete) + 0x0c3a => 'RembrandtConsumerToneScale', #4 (Obsolete) + 0x0c3b => 'CFAGreenThreshold1', #4 (Now CFAGreenThreshold1H) + 0x0c3c => 'CFAGreenThreshold2', #4 (Now CFAGreenThreshold2V) + 0x0c3d => { Name => 'QTableLarge50Pct', Binary => 1 }, #4 (undef[130]) + 0x0c3e => { Name => 'QTableLarge67Pct', Binary => 1 }, #4 (undef[130]) + 0x0c3f => { Name => 'QTableLarge100Pct', Binary => 1 }, #4 (undef[130]) + 0x0c40 => { Name => 'QTableMedium50Pct', Binary => 1 }, #4 (undef[130]) + 0x0c41 => { Name => 'QTableMedium67Pct', Binary => 1 }, #4 (undef[130]) + 0x0c42 => { Name => 'QTableMedium100Pct', Binary => 1 }, #4 (undef[130]) + 0x0c43 => { Name => 'QTableSmall50Pct', Binary => 1 }, #4 (undef[130]) + 0x0c44 => { Name => 'QTableSmall67Pct', Binary => 1 }, #4 (undef[130]) + 0x0c45 => { Name => 'QTableSmall100Pct', Binary => 1 }, #4 (undef[130]) + 0x0c46 => { Name => 'SBAHighGray', Writable => 'int16u' }, #4 + 0x0c47 => { Name => 'SBALowGray', Writable => 'int16u' }, #4 + 0x0c48 => { Name => 'CaptureLook', Writable => 'int16u' }, #4 (was "ToneScaleFlag") + 0x0c49 => { Name => 'SBAIllOffset', Writable => 'int16s' }, #4 + 0x0c4a => { Name => 'SBAGmOffset', Writable => 'int16s' }, #4 + 0x0c4b => 'NifNonlinearity12Bit', #4 (Obsolete) + 0x0c4c => 'SharpeningOn', #4 (Obsolete) + 0x0c4d => 'NifNonlinearity16Bit', #4 (Obsolete) + 0x0c4e => 'RawHistogram', #4 + 0x0c4f => 'RawCFAComponentAverages', #4 + 0x0c50 => 'DisableFlagsPresent', #4 + 0x0c51 => 'DelayCols', #4 + 0x0c52 => 'DummyColsLeft', #4 + 0x0c53 => 'TrashColsRight', #4 + 0x0c54 => 'BlackColsRight', #4 + 0x0c55 => 'DummyColsRight', #4 + 0x0c56 => 'OverClockColsRight', #4 + 0x0c57 => 'UnusedBlackRowsTopOut', #4 + 0x0c58 => 'TrashRowsBottom', #4 + 0x0c59 => 'BlackRowsBottom', #4 + 0x0c5a => 'OverClockRowsBottom', #4 + 0x0c5b => 'BlackColsLeft', #4 + 0x0c5c => 'BlackRowsTop', #4 + 0x0c5d => 'PartialActiveColsLeft', #4 + 0x0c5e => 'PartialActiveColsRight', #4 + 0x0c5f => 'PartialActiveRowsTop', #4 + 0x0c60 => 'PartialActiveRowsBottom', #4 + 0x0c61 => { Name => 'ProcessBorderColsLeft', Writable => 'int16u' }, #4 + 0x0c62 => { Name => 'ProcessBorderColsRight', Writable => 'int16u' }, #4 + 0x0c63 => { Name => 'ProcessBorderRowsTop', Writable => 'int16u' }, #4 + 0x0c64 => { Name => 'ProcessBorderRowsBottom', Writable => 'int16u' }, #4 + 0x0c65 => 'ActiveCols', #4 + 0x0c66 => 'ActiveRows', #4 + 0x0c67 => 'FirstLines', #4 + 0x0c68 => 'UnusedBlackRowsTopIn', #4 + 0x0c69 => 'UnusedBlackRowsBottomIn', #4 + 0x0c6a => 'UnusedBlackRowsBottomOut', #4 + 0x0c6b => 'UnusedBlackColsLeftOut', #4 + 0x0c6c => 'UnusedBlackColsLeftIn', #4 + 0x0c6d => 'UnusedBlackColsRightIn', #4 + 0x0c6e => 'UnusedBlackColsRightOut', #4 + 0x0c6f => { Name => 'CFAOffsetRows', Writable => 'int32u' }, #4 + 0x0c70 => { Name => 'ShiftCols', Writable => 'int16s' }, #4 + 0x0c71 => { Name => 'CFAOffsetCols', Writable => 'int32u' }, #4 + 0x0c76 => 'DarkMapScale', #4 + 0x0c77 => 'HMapHandling', #4 + 0x0c78 => 'VMapHandling', #4 + 0x0c79 => 'DarkThreshold', #4 + 0x0c7a => { Name => 'DMDitherMatrix', Writable => 'int16u' }, #4 + 0x0c7b => { Name => 'DMDitherMatrixWidth', Writable => 'int16u' }, #4 + 0x0c7c => { Name => 'DMDitherMatrixHeight', Writable => 'int16u' }, #4 + 0x0c7d => { Name => 'MaxPixelValueThreshold', Writable => 'int16u' }, #4 + 0x0c7e => { Name => 'HoleFillDeltaThreshold', Writable => 'int16u' }, #4 + 0x0c7f => { Name => 'DarkPedestal', Writable => 'int16u' }, #4 + 0x0c80 => { Name => 'ImageProcessingFileTagsVersionNumber', Writable => 'int16u' }, #4 + 0x0c81 => { Name => 'ImageProcessingFileDateCreated', Writable => 'string', Groups => { 2 => 'Time' } }, #4 + 0x0c82 => { Name => 'DoublingMicrovolts', Writable => 'int32s' }, #4 + 0x0c83 => { #4 + Name => 'DarkFrameShortExposure', + Writable => 'int32u', + ValueConv => '$val / 1e6', # (microseconds) + ValueConvInv => '$val * 1e6', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => '$val', + }, + 0x0c84 => { #4 + Name => 'DarkFrameLongExposure', + Writable => 'int32u', + ValueConv => '$val / 1e6', # (microseconds) + ValueConvInv => '$val * 1e6', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => '$val', + }, + 0x0c85 => { Name => 'DarkFrameCountFactor', Writable => 'rational64u' }, #4 + 0x0c88 => { Name => 'HoleFillDarkDeltaThreshold', Writable => 'int16u' }, #4 + 0x0c89 => 'FarkleWhiteThreshold', #4 + 0x0c8a => { Name => 'ColumnResetOffsets', Binary => 1 }, #4 (int16u[3012]) + 0x0c8b => { Name => 'ColumnGainFactors', Binary => 1 }, #4 (int16u[3012]) + # 0x0c94-0x0c9d ColumnOffsets (int16u[3012]), ref 4 + 0x0c8c => 'Channel0LagKernel', #4 + 0x0c8d => 'Channel1LagKernel', #4 + 0x0c8e => 'Channel2LagKernel', #4 + 0x0c8f => 'Channel3LagKernel', #4 + 0x0c90 => 'BluegrassTable', #4 + 0x0c91 => 'BluegrassScale1', #4 + 0x0c92 => 'BluegrassScale2', #4 + 0x0ce4 => 'FinishedFileProcessingRequest', #4 + 0x0ce5 => { Name => 'FirmwareVersion', Writable => 'string', Groups => { 2 => 'Camera' } }, # ("ProcessingSoftware", ref 4) + 0x0ce6 => 'HostSoftwareExportVersion', #4 (ULONG only exists if made by host SW) + 0x0ce7 => { #4 + Name => 'HostSoftwareRendering', + Writable => 'int32u', + PrintConv => { + 0 => 'Normal (sRGB)', + 1 => 'Linear (camera RGB)', + 2 => 'Pro Photo RGB', + 3 => 'Unknown', + 4 => 'Other Profile', + }, + }, + 0x0dac => 'DCS3XXProcessingInfoIFD', #4 (Obsolete) + 0x0dad => 'DCS3XXProcessingInfo', #4 (Obsolete) + 0x0dae => { Name => 'IPAVersion', Writable => 'int32u' }, #4 + 0x0db6 => 'FinishIPAVersion', #4 + 0x0db7 => 'FinishIPFVersion', #4 + 0x0db8 => { #4 + Name => 'FinishFileType', + Writable => 'int32u', + PrintConv => { + 0 => 'JPEG Best', + 1 => 'JPEG Better', + 2 => 'JPEG Good', + 3 => 'TIFF RGB', + }, + }, + 0x0db9 => { #4 + Name => 'FinishResolution', + Writable => 'int32u', + PrintConv => { + 0 => '100%', + 1 => '67%', + 2 => '50%', + 3 => '25%', + }, + }, + 0x0dba => { #4 + Name => 'FinishNoise', + Writable => 'int32u', + PrintConv => { + 0 => 'Normal', + 1 => 'Strong', + 2 => 'Low', + }, + }, + 0x0dbb => { #4 + Name => 'FinishSharpening', + Writable => 'int32u', + PrintConv => { + 0 => 'None', + 1 => 'High', + 2 => 'Medium', + 3 => 'Low', + }, + }, + 0x0dbc => { #4 + Name => 'FinishLook', + Writable => 'int32u', + PrintConv => { + 0 => 'Product', + 1 => 'Portrait', + 2 => 'Product Reduced', + 3 => 'Portrait Reduced', + 4 => 'Monochrome Product', + 5 => 'Monochrome Portrait', + 6 => 'Wedding', + 7 => 'Event', + 8 => 'Product Hi Color', + 9 => 'Portrait Hi Color', + # (past this is not yet implemented) + 10 => 'Product Hi Color Hold', + 11 => 'Portrait Hi Color Hold', + 13 => 'DCS BW Normal', + 14 => 'DCS BW Wratten 8', + 15 => 'DCS BW Wratten 25', + 16 => 'DCS Sepia 1', + 17 => 'DCS Sepia 2', + }, + }, + 0x0dbd => { #4 + Name => 'FinishExposure', + Writable => 'int32u', + PrintConv => { 0 => 'Yes', 1 => 'No' }, + }, + 0x0e0b => { Name => 'SigmaScalingFactorLowRes', Writable => 'rational64u' }, #4 (for scaling sigma tables in-camera) + 0x0e0c => { Name => 'SigmaScalingFactorCamera', Writable => 'rational64u' }, #4 (for scaling sigma tables in-camera) + 0x0e0d => { Name => 'SigmaImpulseParameters', Writable => 'int16u', Count => -1 }, #4 (for impulse reduction control) + 0x0e0e => { Name => 'SigmaNoiseThreshTableV2', Binary => 1 }, #4 (replaces V2 caltable) + 0x0e0f => { Name => 'SigmaSizeTable', Writable => 'int16u', Count => -1 }, #4 + 0x0e10 => 'DacGainsCoarseAdjPreIF41', #4 (Tag not used due to abandoned implementation) + 0x0e11 => { Name => 'SigmaNoiseFilterCalTableV1', Binary => 1 }, #4 (undef[418]) (Defines Version 1 of Sigma Noise Filter table within .IF/.IPF) + 0x0e12 => { Name => 'SigmaNoiseFilterTableV1', Binary => 1}, #4 (Defines Version 1 of Sigma Noise Filter table within image) + 0x0e13 => 'Lin12ToKlut8', #4 + 0x0e14 => 'SigmaNoiseFilterTableV1Version', #4 (int16u/int32u) (This tag describes the version level of the SigmaNoiseFilterTableV1 class of tags) + 0x0e15 => 'Lin12ToKlut12', #4 + 0x0e16 => 'Klut12ToLin12', #4 + 0x0e17 => { Name => 'NifNonlinearity12To16', Binary => 1 }, #4 (int16u[4096]) + 0x0e18 => { Name => 'SBALog12Transform', Binary => 1 }, #4 (int16u[4096]) + 0x0e19 => { Name => 'InverseSBALog12Transform', Binary=> 1 }, #4 (int16u[3613]) + 0x0e1a => { Name => 'ToneScale0', Binary => 1 }, #4 (int16u[4096]) (Was Portrait12ToneScale on DCS3XX 1.3.1) + 0x0e1b => { Name => 'ToneScale1', Binary => 1 }, #4 (int16u[4096]) (Was Consumer12ToneScale on DCS3XX 1.3.1) + 0x0e1c => { Name => 'ToneScale2', Binary => 1 }, #4 (int16u[4096]) + 0x0e1d => { Name => 'ToneScale3', Binary => 1 }, #4 (int16u[4096]) + 0x0e1e => { Name => 'ToneScale4', Binary => 1 }, #4 (int16u[4096]) + 0x0e1f => { Name => 'ToneScale5', Binary => 1 }, #4 (int16u[4096]) + 0x0e20 => { Name => 'ToneScale6', Binary => 1 }, #4 (int16u[4096]) + 0x0e21 => { Name => 'ToneScale7', Binary => 1 }, #4 (int16u[4096]) + 0x0e22 => { Name => 'ToneScale8', Binary => 1 }, #4 (int16u[4096]) + 0x0e23 => { Name => 'ToneScale9', Binary => 1 }, #4 (int16u[4096]) + 0x0e24 => 'DayMat0', #4 (Obsolete) + 0x0e25 => 'DayMat1', #4 (Obsolete) + 0x0e26 => 'DayMat2', #4 (Obsolete) + 0x0e27 => 'DayMat3', #4 (Obsolete) + 0x0e28 => 'DayMat4', #4 (Obsolete) + 0x0e29 => 'DayMat5', #4 (Obsolete) + 0x0e2a => 'DayMat6', #4 (Obsolete) + 0x0e2b => 'DayMat7', #4 (Obsolete) + 0x0e2c => 'DayMat8', #4 (Obsolete) + 0x0e2d => 'DayMat9', #4 (Obsolete) + 0x0e2e => 'TungMat0', #4 (Obsolete) + 0x0e2f => 'TungMat1', #4 (Obsolete) + 0x0e30 => 'TungMat2', #4 (Obsolete) + 0x0e31 => 'TungMat3', #4 (Obsolete) + 0x0e32 => 'TungMat4', #4 (Obsolete) + 0x0e33 => 'TungMat5', #4 (Obsolete) + 0x0e34 => 'TungMat6', #4 (Obsolete) + 0x0e35 => 'TungMat7', #4 (Obsolete) + 0x0e36 => 'TungMat8', #4 (Obsolete) + 0x0e37 => 'TungMat9', #4 (Obsolete) + 0x0e38 => 'FluorMat0', #4 (Obsolete) + 0x0e39 => 'FluorMat1', #4 (Obsolete) + 0x0e3a => 'FluorMat2', #4 (Obsolete) + 0x0e3b => 'FluorMat3', #4 (Obsolete) + 0x0e3c => 'FluorMat4', #4 (Obsolete) + 0x0e3d => 'FluorMat5', #4 (Obsolete) + 0x0e3e => 'FluorMat6', #4 (Obsolete) + 0x0e3f => 'FluorMat7', #4 (Obsolete) + 0x0e40 => 'FluorMat8', #4 (Obsolete) + 0x0e41 => 'FluorMat9', #4 (Obsolete) + 0x0e42 => 'FlashMat0', #4 (Obsolete) + 0x0e43 => 'FlashMat1', #4 (Obsolete) + 0x0e44 => 'FlashMat2', #4 (Obsolete) + 0x0e45 => 'FlashMat3', #4 (Obsolete) + 0x0e46 => 'FlashMat4', #4 (Obsolete) + 0x0e47 => 'FlashMat5', #4 (Obsolete) + 0x0e48 => 'FlashMat6', #4 (Obsolete) + 0x0e49 => 'FlashMat7', #4 (Obsolete) + 0x0e4a => 'FlashMat8', #4 (Obsolete) + 0x0e4b => 'FlashMat9', #4 (Obsolete) + 0x0e4c => { #IB + Name => 'KodakLook', # ("LookNameTable", ref 4) + Format => 'undef', + Writable => 'string', + ValueConv => '$val=~tr/\0/\n/; $val', + ValueConvInv => '$val=~tr/\n/\0/; $val', + }, + 0x0e4d => { Name => 'IPFCameraModel', Writable => 'string' }, #4 + 0x0e4e => { Name => 'AH2GreenInterpolationThreshold', Writable => 'int16u' }, #4 + 0x0e4f => { Name => 'ResamplingKernelDenominators067', Writable => 'int16u', Count => 3 }, #4 (table of sharpening denoms; 0=Low, 1=Medium, 2=High) + 0x0e50 => { Name => 'ResamplingKernelDenominators050', Writable => 'int16u', Count => 3 }, #4 (table of sharpening denoms; 0=Low, 1=Medium, 2=High) + 0x0e51 => { Name => 'ResamplingKernelDenominators100', Writable => 'int16u', Count => 3 }, #4 (table of sharpening denoms; 0=Low, 1=Medium, 2=High) + 0x0e56 => 'LookMat0', #4 (rational64s[9]) + 0x0e57 => 'LookMat1', #4 (rational64s[9]) + 0x0e58 => 'LookMat2', #4 (rational64s[9]) + 0x0e59 => 'LookMat3', #4 (rational64s[9]) + 0x0e5a => 'LookMat4', #4 (rational64s[9]) + 0x0e5b => 'LookMat5', #4 (rational64s[9]) + 0x0e5c => 'LookMat6', #4 (rational64s[9]) + 0x0e5d => 'LookMat7', #4 (rational64s[9]) + 0x0e5e => 'LookMat8', #4 (rational64s[9]) + 0x0e5f => 'LookMat9', #4 (rational64s[9]) + 0x0e60 => { #4 + Name => 'CFAInterpolationAlgorithm', + Writable => 'int16u', + PrintConv => { 0 => 'AH2', 1 => 'Karnak' }, + }, + 0x0e61 => { #4 + Name => 'CFAInterpolationMetric', + Writable => 'int16u', + PrintConv => { 0 => 'Linear12', 1 => 'KLUT12' }, + }, + 0x0e62 => { Name => 'CFAZipperFixThreshold', Writable => 'int16u' }, #4 + 0x0e63 => { Name => 'NoiseReductionParametersKhufuRGB', Writable => 'int16u', Count => 9 }, #4 + 0x0e64 => { Name => 'NoiseReductionParametersKhufu6MP', Writable => 'int16u', Count => 9 }, #4 + 0x0e65 => { Name => 'NoiseReductionParametersKhufu3MP', Writable => 'int16u', Count => 9 }, #4 + 0x0e6a => { Name => 'ChromaNoiseHighFThresh', Writable => 'int32u', Count => 2 }, #4 + 0x0e6b => { Name => 'ChromaNoiseLowFThresh', Writable => 'int32u', Count => 2 }, #4 + 0x0e6c => { Name => 'ChromaNoiseEdgeMapThresh', Writable => 'int32u' }, #4 + 0x0e6d => { Name => 'ChromaNoiseColorSpace', Writable => 'int32u' }, #4 + 0x0e6e => { Name => 'EnableChromaNoiseReduction', Writable => 'int16u' }, #4 + # 9 values for noise reduction parameters: + # 0 - NRLowType + # 1 - NRLowRadius + # 2 - NRLowStrength + # 3 - NRMediumType + # 4 - NRMediumRadius + # 5 - NRMediumStrength + # 6 - NRHighType + # 7 - NRHighRadius + # 8 - NRHighStrength + # NRType values: + # 0 = None + # 1 = SigmaChroma + # 2 = SigmaOnly + # 3 = SigmaMoire + # 4 = SigmaChromaWithRadius + # 5 = SigmaMoireWithRadius + # 6 = SigmaExpert (aka Khufu) + # 7 = SigmaWithRadius + 0x0e6f => { Name => 'NoiseReductionParametersHostRGB', Writable => 'int16u', Count => 9 }, #4 + 0x0e70 => { Name => 'NoiseReductionParametersHost6MP', Writable => 'int16u', Count => 9 }, #4 + 0x0e71 => { Name => 'NoiseReductionParametersHost3MP', Writable => 'int16u', Count => 9 }, #4 + 0x0e72 => { Name => 'NoiseReductionParametersCamera', Writable => 'int16u', Count => 6 }, #4 + 0x0e73 => { #4 + Name => 'NoiseReductionParametersAtCapture', + Writable => 'int16u', + Count => 6, + # 6 values: + # 0 - Algorithm type + # 1 - Radius + # 2 - Strength + # 3 - Khufu Luma + # 4 - Reserved 1 + # 5 - Reserved 2 + }, + 0x0e74 => { Name => 'LCDMatrix', Writable => 'rational64s', Count => 9 }, #4 + 0x0e75 => { Name => 'LCDMatrixChickFix', Writable => 'rational64s', Count => 9 }, #4 + 0x0e76 => { Name => 'LCDMatrixMarvin', Writable => 'rational64s', Count => 9 }, #4 + 0x0e7c => { Name => 'LCDGammaTableChickFix',Binary => 1 }, #4 (int16u[4096]) + 0x0e7d => { Name => 'LCDGammaTableMarvin', Binary => 1 }, #4 (int16u[4096]) + 0x0e7e => { Name => 'LCDGammaTable', Binary => 1 }, #4 (int16u[4096]) + 0x0e7f => 'LCDSharpeningF1', #4 (int16s[4]) + 0x0e80 => 'LCDSharpeningF2', #4 + 0x0e81 => 'LCDSharpeningF3', #4 + 0x0e82 => 'LCDSharpeningF4', #4 + 0x0e83 => 'LCDEdgeMapX1', #4 + 0x0e84 => 'LCDEdgeMapX2', #4 + 0x0e85 => 'LCDEdgeMapX3', #4 + 0x0e86 => 'LCDEdgeMapX4', #4 + 0x0e87 => 'LCDEdgeMapSlope', #4 + 0x0e88 => 'YCrCbMatrix', #4 + 0x0e89 => 'LCDEdgeSpline', #4 (rational64s[9]) + 0x0e92 => { Name => 'Fac18Per', Writable => 'int16u' }, #4 + 0x0e93 => { Name => 'Fac170Per', Writable => 'int16u' }, #4 + 0x0e94 => { Name => 'Fac100Per', Writable => 'int16u' }, #4 + 0x0e9b => 'ExtraTickLocations', #4 (int16u[7]) + 0x0e9c => { Name => 'RGBtoeV0', Binary => 1 }, #4 (int16s[256]) + 0x0e9d => { Name => 'RGBtoeV1', Binary => 1 }, #4 (int16s[256]) + 0x0e9e => { Name => 'RGBtoeV2', Binary => 1 }, #4 (int16s[256]) + 0x0e9f => { Name => 'RGBtoeV3', Binary => 1 }, #4 (int16s[256]) + 0x0ea0 => { Name => 'RGBtoeV4', Binary => 1 }, #4 (int16s[256]) + 0x0ea1 => { Name => 'RGBtoeV5', Binary => 1 }, #4 (int16s[256]) + 0x0ea2 => { Name => 'RGBtoeV6', Binary => 1 }, #4 (int16s[256]) + 0x0ea3 => { Name => 'RGBtoeV7', Binary => 1 }, #4 (int16s[256]) + 0x0ea4 => { Name => 'RGBtoeV8', Binary => 1 }, #4 (int16s[256]) + 0x0ea5 => { Name => 'RGBtoeV9', Binary => 1 }, #4 (int16s[256]) + 0x0ea6 => { Name => 'LCDHistLUT0', Binary => 1 }, #4 (rational64s[48]) + 0x0ea7 => { Name => 'LCDHistLUT1', Binary => 1 }, #4 (rational64s[57]) + 0x0ea8 => { Name => 'LCDHistLUT2', Binary => 1 }, #4 (rational64s[48]) + 0x0ea9 => { Name => 'LCDHistLUT3', Binary => 1 }, #4 (rational64s[57]) + 0x0eaa => { Name => 'LCDHistLUT4', Binary => 1 }, #4 (rational64s[48]) + 0x0eab => { Name => 'LCDHistLUT5', Binary => 1 }, #4 (rational64s[57]) + 0x0eac => { Name => 'LCDHistLUT6', Binary => 1 }, #4 (rational64s[48]) + 0x0ead => { Name => 'LCDHistLUT7', Binary => 1 }, #4 (rational64s[48]) + 0x0eae => { Name => 'LCDHistLUT8', Binary => 1 }, #4 + 0x0eaf => { Name => 'LCDHistLUT9', Binary => 1 }, #4 + 0x0eb0 => 'LCDLinearClipValue', #4 + 0x0ece => 'LCDStepYvalues', #4 (int8u[10]) + 0x0ecf => 'LCDStepYvaluesChickFix', #4 (int8u[10]) + 0x0ed0 => 'LCDStepYvaluesMarvin', #4 (int8u[10]) + 0x0ed8 => { Name => 'InterpolationCoefficients', Binary => 1 }, #4 (int16s[69]) + 0x0ed9 => 'InterpolationCoefficients6MP', #4 + 0x0eda => 'InterpolationCoefficients3MP', #4 + 0x0f00 => { Name => 'NoiseReductionParametersHostNormal', Binary => 1 }, #4 (int16u[140]) + 0x0f01 => { Name => 'NoiseReductionParametersHostStrong', Binary => 1 }, #4 (int16u[140]) + 0x0f02 => { Name => 'NoiseReductionParametersHostLow', Binary => 1 }, #4 + 0x0f0a => { Name => 'MariahTextureThreshold', Writable => 'int16u' }, #4 + 0x0f0b => { Name => 'MariahMapLoThreshold', Writable => 'int16u' }, #4 + 0x0f0c => { Name => 'MariahMapHiThreshold', Writable => 'int16u' }, #4 + 0x0f0d => { Name => 'MariahChromaBlurSize', Writable => 'int16u' }, #4 + 0x0f0e => { Name => 'MariahSigmaThreshold', Writable => 'int16u' }, #4 + 0x0f0f => { Name => 'MariahThresholds', Binary => 1 }, #4 + 0x0f10 => { Name => 'MariahThresholdsNormal', Binary => 1 }, #4 (int16u[140]) + 0x0f11 => { Name => 'MariahThresholdsStrong', Binary => 1 }, #4 (int16u[140]) + 0x0f12 => { Name => 'MariahThresholdsLow', Binary => 1 }, #4 + 0x0f14 => 'KhufuLinearRedMixingCoefficient', #4 + 0x0f15 => 'KhufuLinearGreenMixingCoefficient', #4 + 0x0f16 => 'KhufuLinearBlueMixingCoefficient', #4 + 0x0f17 => 'KhufuUSpaceC2MixingCoefficient', #4 + 0x0f18 => 'KhufuSigmaGaussianWeights', #4 + 0x0f19 => 'KhufuSigmaScalingFactors6MP', #4 (rational64u[6]) + 0x0f1a => 'KhufuSigmaScalingFactors3MP', #4 (rational64u[6]) + 0x0f1b => 'KhufuSigmaScalingFactors14MP', #4 + # 0x0f1e-0x0f27 - KhufuLinearRGBtoLogRGB(n), (for Khufu) ref 4 + # 0x0f28-0x0f31 - KhufuLogRGBtoLinearRGB(n), (for Khufu) ref 4 + 0x0f32 => { Name => 'KhufuI0Thresholds', Binary => 1 }, #4 (int32s[348]) + 0x0f33 => { Name => 'KhufuI1Thresholds', Binary => 1 }, #4 (int32s[348]) + 0x0f34 => { Name => 'KhufuI2Thresholds', Binary => 1 }, #4 (int32s[348]) + 0x0f35 => { Name => 'KhufuI3Thresholds', Binary => 1 }, #4 (int32s[348]) + 0x0f36 => { Name => 'KhufuI4Thresholds', Binary => 1 }, #4 (int32s[348]) + 0x0f37 => { Name => 'KhufuI5Thresholds', Binary => 1 }, #4 (int32s[348]) + 0x0f3c => { Name => 'CondadoDayBVThresh', Writable => 'int16u' }, #4 + 0x0f3d => { Name => 'CondadoNeuRange', Writable => 'int16u' }, #4 + 0x0f3e => { Name => 'CondadoBVFactor', Writable => 'int16s' }, #4 + 0x0f3f => { Name => 'CondadoIllFactor', Writable => 'int16s' }, #4 + 0x0f40 => { Name => 'CondadoTunThresh', Writable => 'int16s' }, #4 + 0x0f41 => { Name => 'CondadoFluThresh', Writable => 'int16s' }, #4 + 0x0f42 => { Name => 'CondadoDayOffsets', Writable => 'int16s', Count => 2 }, #4 + 0x0f43 => { Name => 'CondadoTunOffsets', Writable => 'int16s', Count => 2 }, #4 + 0x0f44 => { Name => 'CondadoFluOffsets', Writable => 'int16s', Count => 2 }, #4 + 0x0f5a => 'ERIMMToCRGB0Spline', #4 (rational64s[33]) + 0x0f5b => 'ERIMMToCRGB1Spline', #4 (rational64s[36]) + 0x0f5c => 'ERIMMToCRGB2Spline', #4 (rational64s[33]) + 0x0f5d => 'ERIMMToCRGB3Spline', #4 (rational64s[33]) + 0x0f5e => 'ERIMMToCRGB4Spline', #4 (rational64s[33]) + 0x0f5f => 'ERIMMToCRGB5Spline', #4 (rational64s[33]) + 0x0f60 => 'ERIMMToCRGB6Spline', #4 (rational64s[33]) + 0x0f61 => 'ERIMMToCRGB7Spline', #4 (rational64s[33]) + 0x0f62 => 'ERIMMToCRGB8Spline', #4 + 0x0f63 => 'ERIMMToCRGB9Spline', #4 + 0x0f64 => 'CRGBToERIMM0Spline', #4 (rational64s[27]) + 0x0f65 => 'CRGBToERIMM1Spline', #4 (rational64s[54]) + 0x0f66 => 'CRGBToERIMM2Spline', #4 (rational64s[27]) + 0x0f67 => 'CRGBToERIMM3Spline', #4 (rational64s[54]) + 0x0f68 => 'CRGBToERIMM4Spline', #4 (rational64s[27]) + 0x0f69 => 'CRGBToERIMM5Spline', #4 (rational64s[54]) + 0x0f6a => 'CRGBToERIMM6Spline', #4 (rational64s[27]) + 0x0f6b => 'CRGBToERIMM7Spline', #4 (rational64s[27]) + 0x0f6c => 'CRGBToERIMM8Spline', #4 + 0x0f6d => 'CRGBToERIMM9Spline', #4 + 0x0f6e => 'ERIMMNonLinearitySpline', #4 (rational64s[42]) + 0x0f6f => 'Delta12To8Spline', #4 (rational64s[12]) + 0x0f70 => 'Delta8To12Spline', #4 (rational64s[12]) + 0x0f71 => 'InverseMonitorMatrix', #4 (rational64s[9]) + 0x0f72 => { Name => 'NifNonlinearityExt', Binary => 1 }, #4 (int16s[8000]) + 0x0f73 => { Name => 'InvNifNonLinearity', Binary => 1 }, #4 (int16u[256]) + 0x0f74 => 'RIMM13ToERIMM12Spline', #4 (rational64s[51]) + 0x0f78 => 'ToneScale0Spline', #4 (rational64s[57]) + 0x0f79 => 'ToneScale1Spline', #4 (rational64s[51]) + 0x0f7a => 'ToneScale2Spline', #4 (rational64s[57]) + 0x0f7b => 'ToneScale3Spline', #4 (rational64s[51]) + 0x0f7c => 'ToneScale4Spline', #4 (rational64s[57]) + 0x0f7d => 'ToneScale5Spline', #4 (rational64s[51]) + 0x0f7e => 'ToneScale6Spline', #4 (rational64s[57]) + 0x0f7f => 'ToneScale7Spline', #4 (rational64s[57]) + 0x0f80 => 'ToneScale8Spline', #4 + 0x0f81 => 'ToneScale9Spline', #4 + 0x0f82 => 'ERIMMToneScale0Spline', #4 (rational64s[60]) + 0x0f83 => 'ERIMMToneScale1Spline', #4 (rational64s[54]) + 0x0f84 => 'ERIMMToneScale2Spline', #4 (rational64s[60]) + 0x0f85 => 'ERIMMToneScale3Spline', #4 (rational64s[54]) + 0x0f86 => 'ERIMMToneScale4Spline', #4 (rational64s[60]) + 0x0f87 => 'ERIMMToneScale5Spline', #4 (rational64s[54]) + 0x0f88 => 'ERIMMToneScale6Spline', #4 (rational64s[60]) + 0x0f89 => 'ERIMMToneScale7Spline', #4 (rational64s[60]) + 0x0f8a => 'ERIMMToneScale8Spline', #4 + 0x0f8b => 'ERIMMToneScale9Spline', #4 + 0x0f8c => 'RIMMToCRGB0Spline', #4 (rational64s[66]) + 0x0f8d => 'RIMMToCRGB1Spline', #4 (rational64s[84]) + 0x0f8e => 'RIMMToCRGB2Spline', #4 (rational64s[66]) + 0x0f8f => 'RIMMToCRGB3Spline', #4 (rational64s[84]) + 0x0f90 => 'RIMMToCRGB4Spline', #4 (rational64s[66]) + 0x0f91 => 'RIMMToCRGB5Spline', #4 (rational64s[84]) + 0x0f92 => 'RIMMToCRGB6Spline', #4 (rational64s[66]) + 0x0f93 => 'RIMMToCRGB7Spline', #4 (rational64s[66]) + 0x0f94 => 'RIMMToCRGB8Spline', #4 + 0x0f95 => 'RIMMToCRGB9Spline', #4 + 0x0fa0 => 'QTableLarge25Pct', #4 + 0x0fa1 => 'QTableMedium25Pct', #4 + 0x0fa2 => 'QTableSmall25Pct', #4 + 0x1130 => 'NoiseReductionKernel', #4 (Noise filter kernel. No longer needed) + 0x1388 => 'UserMetaData', #4 (undef[0]) + 0x1389 => { Name => 'InputProfile', Writable => 'undef', Binary => 1 }, #IB ("SourceProfile", ref 4) + 0x138a => { Name => 'KodakLookProfile', Writable => 'undef', Binary => 1 }, #IB ("LookProfile", ref 4) + 0x138b => { Name => 'OutputProfile', Writable => 'undef', Binary => 1 }, #IB ("DestinationProfile", ref 4) + 0x1390 => { Name => 'SourceProfilePrefix', Writable => 'string' }, #4 (eg. 'DCSProSLRn') + 0x1391 => { Name => 'ToneCurveProfileName', Writable => 'string' }, #4 + 0x1392 => { Name => 'InputProfile', SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' } }, #4 + 0x1393 => { Name => 'ProcessParametersV2', Binary => 1 }, #4 (Used by the SDK, Firmware should not use!) + 0x1394 => 'ReservedBlob2', #4 + 0x1395 => 'ReservedBlob3', #4 + 0x1396 => 'ReservedBlob4', #4 + 0x1397 => 'ReservedBlob5', #4 + 0x1398 => 'ReservedBlob6', #4 + 0x1399 => 'ReservedBlob7', #4 + 0x139a => 'ReservedBlob8', #4 + 0x139b => 'ReservedBlob9', #4 + 0x1770 => { Name => 'ScriptVersion', Writable => 'int32u' }, #4 + 0x177a => 'ImagerTimingData', #4 + 0x1784 => { Name => 'ISO', Writable => 'int32u' }, #3 ("NsecPerIcCode", ref 4) + 0x17a2 => 'Scav11Cols', #4 + 0x17a3 => 'Scav12Cols', #4 + 0x17a4 => 'Scav21Cols', #4 + 0x17a5 => 'Scav22Cols', #4 + 0x17a6 => 'ActiveCTEMonitor1Cols', #4 + 0x17a7 => 'ActiveCTEMonitor2Cols', #4 + 0x17a8 => 'ActiveCTEMonitorRows', #4 + 0x17a9 => 'ActiveBuf1Cols', #4 + 0x17aa => 'ActiveBuf2Cols', #4 + 0x17ab => 'ActiveBuf1Rows', #4 + 0x17ac => 'ActiveBuf2Rows', #4 + 0x17c0 => 'HRNoiseLines', #4 + 0x17c1 => 'RNoiseLines', #4 + 0x17c2 => 'ANoiseLines', #4 + 0x17d4 => { Name => 'ImagerCols', Writable => 'int16u' }, #4 + 0x17de => { Name => 'ImagerRows', Writable => 'int16u' }, #4 + 0x17e8 => { Name => 'PartialActiveCols1', Writable => 'int32u' }, #4 + 0x17f2 => { Name => 'PartialActiveCols2', Writable => 'int32u' }, #4 + 0x17fc => { Name => 'PartialActiveRows1', Writable => 'int32u' }, #4 + 0x1806 => { Name => 'PartialActiveRows2', Writable => 'int32u' }, #4 + 0x1810 => { Name => 'ElectricalBlackColumns',Writable=> 'int32u' }, #4 + 0x181a => { Name => 'ResetBlackSegRows', Writable => 'int32u' }, #4 + 0x1838 => { Name => 'CaptureWidthNormal', Writable => 'int32u' }, #4 + 0x1839 => { Name => 'CaptureHeightNormal', Writable => 'int32u' }, #4 + 0x183a => 'CaptureWidthResetBlackSegNormal', #4 + 0x183b => 'CaptureHeightResetBlackSegNormal', #4 + 0x183c => 'DarkRefOffsetNormal', #4 + 0x1842 => { Name => 'CaptureWidthTest', Writable => 'int32u' }, #4 + 0x1843 => 'CaptureHeightTest', #4 + 0x1844 => 'CaptureWidthResetBlackSegTest', #4 + 0x1845 => 'CaptureHeightResetBlackSegTest', #4 + 0x1846 => 'DarkRefOffsetTest', #4 + 0x184c => { Name => 'ImageSegmentStartLine',Writable => 'int32u' }, #4 + 0x184d => { Name => 'ImageSegmentLines', Writable => 'int32u' }, #4 + 0x184e => { Name => 'SkipLineTime', Writable => 'int32u' }, #4 + 0x1860 => { Name => 'FastResetLineTime', Writable => 'int32u' }, #4 + 0x186a => { Name => 'NormalLineTime', Writable => 'int32u' }, #4 + 0x1874 => { Name => 'MinIntegrationRows', Writable => 'int32u' }, #4 + 0x187e => { Name => 'PreReadFastResetCount',Writable => 'int32u' }, #4 + 0x1888 => { Name => 'TransferTimeNormal', Writable => 'int32u' }, #4 + 0x1889 => { Name => 'TransferTimeTest', Writable => 'int32u' }, #4 + 0x188a => { Name => 'QuietTime', Writable => 'int32u' }, #4 + 0x189c => { Name => 'OverClockCols', Writable => 'int16u' }, #4 + 0x18a6 => { Name => 'H2ResetBlackPixels', Writable => 'int32u' }, #4 + 0x18b0 => { Name => 'H3ResetBlackPixels', Writable => 'int32u' }, #4 + 0x18ba => { Name => 'BlackAcquireRows', Writable => 'int32u' }, #4 + 0x18c4 => { Name => 'OverClockRows', Writable => 'int16u' }, #4 + 0x18ce => { Name => 'H3ResetBlackColumns', Writable => 'int32u' }, #4 + 0x18d8 => { Name => 'DarkBlackSegRows', Writable => 'int32u' }, #4 + 0x1900 => 'CrossbarEnable', #4 + 0x1901 => { Name => 'FifoenOnePixelDelay', Writable => 'int32u' }, #4 + 0x1902 => { Name => 'ReadoutTypeRequested', Writable => 'int32u' }, #4 + 0x1903 => { Name => 'ReadoutTypeActual', Writable => 'int32u' }, #4 + 0x190a => { Name => 'OffsetDacValue', Writable => 'int32u' }, #4 + 0x1914 => { Name => 'TempAmpGainX100', Writable => 'int32u' }, #4 + 0x191e => { Name => 'VarrayDacNominalValues',Writable=> 'int32u', Count => 3 }, #4 + 0x1928 => 'VddimDacNominalValues', #4 + 0x1964 => { Name => 'C14Configuration', Writable => 'int32u' }, #4 + 0x196e => { Name => 'TDA1Offset', Writable => 'int32u', Count => 3 }, #4 + 0x196f => { Name => 'TDA1Bandwidth', Writable => 'int32u' }, #4 + 0x1970 => { Name => 'TDA1Gain', Writable => 'int32u', Count => 3 }, #4 + 0x1971 => { Name => 'TDA1EdgePolarity', Writable => 'int32u' }, #4 + 0x1978 => { Name => 'TDA2Offset', Writable => 'int32u', Count => 3 }, #4 + 0x1979 => { Name => 'TDA2Bandwidth', Writable => 'int32u' }, #4 + 0x197a => { Name => 'TDA2Gain', Writable => 'int32u', Count => 3 }, #4 + 0x197b => { Name => 'TDA2EdgePolarity', Writable => 'int32u' }, #4 + 0x1982 => { Name => 'TDA3Offset', Writable => 'int32u', Count => 3 }, #4 + 0x1983 => { Name => 'TDA3Bandwidth', Writable => 'int32u' }, #4 + 0x1984 => { Name => 'TDA3Gain', Writable => 'int32u', Count => 3 }, #4 + 0x1985 => { Name => 'TDA3EdgePolarity', Writable => 'int32u' }, #4 + 0x198c => { Name => 'TDA4Offset', Writable => 'int32u', Count => 3 }, #4 + 0x198d => { Name => 'TDA4Bandwidth', Writable => 'int32u' }, #4 + 0x198e => { Name => 'TDA4Gain', Writable => 'int32u', Count => 3 }, #4 + 0x198f => { Name => 'TDA4EdgePolarity', Writable => 'int32u' }, #4 + 0xfde8 => { Name => 'ComLenBlkSize', Writable => 'int16u' }, #4 +); + +# contains WB adjust set in software (ref 3) +%Image::ExifTool::Kodak::Processing = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + 20 => { + Name => 'WB_RGBLevels', + Format => 'int16u[3]', + ValueConv => q{ + my @a = split ' ',$val; + foreach (@a) { + $_ = 2048 / $_ if $_; + } + return join ' ', @a; + } + }, +); + +# tags found in the Kodak KDC_IFD (in IFD0 of KDC images) (ref 3) +%Image::ExifTool::Kodak::KDC_IFD = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'KDC_IFD', 2 => 'Image'}, + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITE_GROUP => 'KDC_IFD', + SET_GROUP1 => 1, + NOTES => q{ + These tags are found in a separate IFD of KDC images from some newer Kodak + models such as the P880 and Z1015IS. + }, + 0xfa00 => { + Name => 'SerialNumber', #PH (unverified) + Writable => 'string', + }, + 0xfa0d => { + Name => 'WhiteBalance', + Writable => 'int8u', + PrintConv => { #PH + 0 => 'Auto', + 1 => 'Fluorescent', # (NC) + 2 => 'Tungsten', # (NC) + 3 => 'Daylight', # (NC) + 6 => 'Shade', # (NC, called "Open Shade" by Kodak) + }, + }, + # the following tags are numbered for use in the Composite tag lookup + 0xfa25 => 'WB_RGBLevelsAuto', + 0xfa27 => 'WB_RGBLevelsTungsten', # (NC) + 0xfa28 => 'WB_RGBLevelsFluorescent', # (NC) + 0xfa29 => 'WB_RGBLevelsDaylight', # (NC) + 0xfa2a => 'WB_RGBLevelsShade', # (NC) +); + +# textual-based Kodak TextualInfo tags (not found in KDC images) (ref PH) +%Image::ExifTool::Kodak::TextualInfo = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'Kodak', 2 => 'Image'}, + PROCESS_PROC => \&ProcessKodakText, + NOTES => q{ + Below is a list of tags which have been observed in the Kodak TextualInfo + data, however ExifTool will extract information from any tags found here. + }, + 'Actual Compensation' => 'ActualCompensation', + 'AF Function' => 'AFMode', # values: "S" (=Single?, then maybe C for Continuous, M for Manual?) - PH + 'Aperture' => { + Name => 'Aperture', + ValueConv => '$val=~s/^f//i; $val', + }, + 'Auto Bracket' => 'AutoBracket', + 'Brightness Value' => 'BrightnessValue', + 'Camera' => 'CameraModel', + 'Camera body' => 'CameraBody', + 'Compensation' => 'ExposureCompensation', + 'Date' => { + Name => 'Date', + Groups => { 2 => 'Time' }, + }, + 'Exposure Bias' => 'ExposureBias', + 'Exposure Mode' => { + Name => 'ExposureMode', + PrintConv => { + OTHER => sub { shift }, # pass other values straight through + 'M' => 'Manual', + 'A' => 'Aperture Priority', #(NC -- I suppose this could be "Auto" too) + 'S' => 'Shutter Priority', #(NC) + 'P' => 'Program', #(NC) + 'B' => 'Bulb', #(NC) + # have seen "Manual (M)" written by DCS760C - PH + # and "Aperture priority AE (Av)" written by a ProBack 645M + }, + }, + 'Firmware Version' => 'FirmwareVersion', + 'Flash Compensation' => 'FlashExposureComp', + 'Flash Fired' => 'FlashFired', + 'Flash Sync Mode' => 'FlashSyncMode', + 'Focal Length' => { + Name => 'FocalLength', + PrintConv => '"$val mm"', + }, + 'Height' => 'KodakImageHeight', + 'Image Number' => 'ImageNumber', + 'ISO' => 'ISO', + 'ISO Speed' => 'ISO', + 'Lens' => { Name => 'Lens', Priority => 0 }, + 'Max Aperture' => { + Name => 'MaxAperture', + ValueConv => '$val=~s/^f//i; $val', + }, + 'Meter Mode' => 'MeterMode', + 'Min Aperture' => { + Name => 'MinAperture', + ValueConv => '$val=~s/^f//i; $val', + }, + 'Popup Flash' => 'PopupFlash', + 'Serial Number' => 'SerialNumber', + 'Shooting Mode' => 'ShootingMode', + 'Shutter' => 'ShutterSpeed', + 'Temperature' => 'Temperature', # with a value of 15653, what could this be? - PH + 'Time' => { + Name => 'Time', + Groups => { 2 => 'Time' }, + }, + 'White balance' => 'WhiteBalance', + 'Width' => 'KodakImageWidth', + '_other_info' => { + Name => 'OtherInfo', + Notes => 'any other information without a tag name', + }, +); + +# Kodak APP3 "Meta" tags (ref 2) +%Image::ExifTool::Kodak::Meta = ( + GROUPS => { 0 => 'Meta', 1 => 'MetaIFD', 2 => 'Image'}, + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITE_GROUP => 'MetaIFD', # default write group + NOTES => q{ + These tags are found in the APP3 "Meta" segment of JPEG images from Kodak + cameras such as the DC280, DC3400, DC5000, MC3, M580, Z950 and Z981. The + structure of this segment is similar to the APP1 "Exif" segment, but a + different set of tags is used. + }, + 0xc350 => 'FilmProductCode', + 0xc351 => 'ImageSourceEK', + 0xc352 => 'CaptureConditionsPAR', + 0xc353 => { + Name => 'CameraOwner', + Writable => 'undef', + RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,$tag)', + RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)', + }, + 0xc354 => { + Name => 'SerialNumber', + Writable => 'undef', + Groups => { 2 => 'Camera' }, + RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,$tag)', #PH + RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)', + }, + 0xc355 => 'UserSelectGroupTitle', + 0xc356 => 'DealerIDNumber', + 0xc357 => 'CaptureDeviceFID', + 0xc358 => 'EnvelopeNumber', + 0xc359 => 'FrameNumber', + 0xc35a => 'FilmCategory', + 0xc35b => 'FilmGencode', + 0xc35c => 'ModelAndVersion', + 0xc35d => 'FilmSize', + 0xc35e => 'SBA_RGBShifts', + 0xc35f => 'SBAInputImageColorspace', + 0xc360 => 'SBAInputImageBitDepth', + 0xc361 => { + Name => 'SBAExposureRecord', + Binary => 1, + }, + 0xc362 => { + Name => 'UserAdjSBA_RGBShifts', + Binary => 1, + }, + 0xc363 => 'ImageRotationStatus', + 0xc364 => 'RollGuidElements', + 0xc365 => 'MetadataNumber', + 0xc366 => 'EditTagArray', + 0xc367 => 'Magnification', + # 0xc36b - string[8]: "1.0" + 0xc36c => 'NativeXResolution', + 0xc36d => 'NativeYResolution', + 0xc36e => { + Name => 'KodakEffectsIFD', + Flags => 'SubIFD', + Groups => { 1 => 'KodakEffectsIFD' }, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::SpecialEffects', + Start => '$val', + }, + }, + 0xc36f => { + Name => 'KodakBordersIFD', + Flags => 'SubIFD', + Groups => { 1 => 'KodakBordersIFD' }, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Borders', + Start => '$val', + }, + }, + 0xc37a => 'NativeResolutionUnit', + 0xc418 => 'SourceImageDirectory', + 0xc419 => 'SourceImageFileName', + 0xc41a => 'SourceImageVolumeName', + 0xc46c => 'PrintQuality', + 0xc46e => 'ImagePrintStatus', + # 0cx46f - int16u: 1 +); + +# Kodak APP3 "Meta" Special Effects sub-IFD (ref 2) +%Image::ExifTool::Kodak::SpecialEffects = ( + GROUPS => { 0 => 'Meta', 1 => 'KodakEffectsIFD', 2 => 'Image'}, + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + 0 => 'DigitalEffectsVersion', + 1 => { + Name => 'DigitalEffectsName', + PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,"DigitalEffectsName")', + }, + 2 => 'DigitalEffectsType', +); + +# Kodak APP3 "Meta" Borders sub-IFD (ref 2) +%Image::ExifTool::Kodak::Borders = ( + GROUPS => { 0 => 'Meta', 1 => 'KodakBordersIFD', 2 => 'Image'}, + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + 0 => 'BordersVersion', + 1 => { + Name => 'BorderName', + PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,"BorderName")', + }, + 2 => 'BorderID', + 3 => 'BorderLocation', + 4 => 'BorderType', + 8 => 'WatermarkType', +); + +# tags in Kodak MOV videos (ref PH) +# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos) +%Image::ExifTool::Kodak::MOV = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => q{ + This information is found in the TAGS atom of MOV videos from Kodak models + such as the P880. + }, + 0 => { + Name => 'Make', + Format => 'string[21]', + }, + 0x16 => { + Name => 'Model', + Format => 'string[42]', + }, + 0x40 => { + Name => 'ModelType', + Format => 'string[8]', + }, + # (01 00 at offset 0x48) + 0x4e => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val ? 10 / $val : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x52 => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x5a => { + Name => 'ExposureCompensation', + Format => 'rational64s', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + # 0x6c => 'WhiteBalance', ? + 0x70 => { + Name => 'FocalLength', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f mm",$val)', + }, +); + +# Kodak DcMD atoms (ref PH) +%Image::ExifTool::Kodak::DcMD = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Video' }, + NOTES => 'Metadata directory found in MOV and MP4 videos from some Kodak cameras.', + Cmbo => { + Name => 'CameraByteOrder', + PrintConv => { + II => 'Little-endian (Intel, II)', + MM => 'Big-endian (Motorola, MM)', + }, + }, + CMbo => { # (as written by Kodak Playsport video camera) + Name => 'CameraByteOrder', + PrintConv => { + II => 'Little-endian (Intel, II)', + MM => 'Big-endian (Motorola, MM)', + }, + }, + DcME => { + Name => 'DcME', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::DcME', + }, + }, + DcEM => { + Name => 'DcEM', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::DcEM', + }, + }, +); + +# Kodak DcME atoms (ref PH) +%Image::ExifTool::Kodak::DcME = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Video' }, + # Mtmd - 24 bytes: ("00 00 00 00 00 00 00 01" x 3) + # Keyw - keywords? (six bytes all zero) + # Rate - 2 bytes: 00 00 +); + +# Kodak DcEM atoms (ref PH) +%Image::ExifTool::Kodak::DcEM = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Video' }, + # Mtmd - 24 bytes: ("00 00 00 00 00 00 00 01" x 3) + # Csat - 16 bytes: 00 06 00 00 62 00 61 00 73 00 69 00 63 00 00 00 [....b.a.s.i.c...] + # Ksre - 8 bytes: 00 01 00 00 00 00 +); + +# tags in "free" atom of Kodak M5370 MP4 videos (ref PH) +%Image::ExifTool::Kodak::Free = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Video' }, + NOTES => q{ + Information stored in the "free" atom of Kodak MP4 videos. (VERY bad form + for Kodak to store useful information in an atom intended for unused space!) + }, + # (2012/01/19: Kodak files for bankruptcy -- this is poetic metadata justice) + Seri => { + Name => 'SerialNumber', + # byte 0 is string length; byte 1 is zero; string starts at byte 2 + ValueConv => 'substr($val, 2, unpack("C",$val))', + }, + SVer => { + Name => 'FirmwareVersion', + ValueConv => 'substr($val, 2, unpack("C",$val))', + }, + # Clor - 2 bytes: 0 1 (?) + # CapM - 2 bytes: 0 1 (capture mode? = exposure mode?) + # WBMD - 2 bytes: 0 0 (white balance?) + Expc => { # (NC) + Name => 'ExposureCompensation', + Format => 'int16s', + ValueConv => '$val / 3', # (guess) + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + # Zone - 2 bytes: 0 2 (time zone? focus zone?) + # FoMD - 2 bytes: 0 0 (focus mode?) + # Shap - 2 bytes: 0 2 (sharpness?) + Expo => { + Name => 'ExposureTime', + Format => 'rational32u', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + FNum => { + Name => 'FNumber', + Format => 'int16u', + ValueConv => '$val / 100', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + }, + ISOS => { Name => 'ISO', Format => 'int16u' }, + StSV => { + Name => 'ShutterSpeedValue', + Format => 'int16s', + ValueConv => 'abs($val)<100 ? 2**(-$val/3) : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + AprV => { + Name => 'ApertureValue', + Format => 'int16s', + ValueConv => '2 ** ($val / 2000)', + PrintConv => 'sprintf("%.1f",$val)', + }, + BrtV => { # (NC) + Name => 'BrightnessValue', + Format => 'int32s', + ValueConv => '$val / 1000', # (guess) + }, + FoLn => { + Name => 'FocalLength', + Groups => { 2 => 'Camera' }, + Format => 'int16u', + PrintConv => 'sprintf("%.1f mm",$val)', + }, + FL35 => { + Name => 'FocalLengthIn35mmFormat', + Groups => { 2 => 'Camera' }, + Format => 'int16u', + PrintConv => '"$val mm"', + }, + Scrn => { + Name => 'PreviewInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Kodak::Scrn' }, + }, +); + +# tags in "frea" atom of Kodak PixPro SP360 MP4 videos (ref PH) +%Image::ExifTool::Kodak::frea = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + NOTES => 'Information stored in the "frea" atom of Kodak PixPro SP360 MP4 videos.', + tima => { + Name => 'Duration', + Format => 'int32u', + Priority => 0, # (only integer seconds) + PrintConv => 'ConvertDuration($val)', + }, + 'ver '=> { Name => 'KodakVersion' }, + thma => { Name => 'ThumbnailImage', Groups => { 2 => 'Preview' }, Binary => 1 }, + scra => { Name => 'PreviewImage', Groups => { 2 => 'Preview' }, Binary => 1 }, +); + +# preview information in free/Scrn atom of MP4 videos (ref PH) +%Image::ExifTool::Kodak::Scrn = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int16u', + 0 => 'PreviewImageWidth', + 1 => 'PreviewImageHeight', + 2 => { Name => 'PreviewImageLength', Format => 'int32u' }, + 4 => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Format => 'undef[$val{2}]', + RawConv => '$self->ValidateImage(\$val, $tag)', + }, +); + +# acceleration information extracted from 'pose' atom of MP4 videos (ref PH, PixPro 4KVR360) +%Image::ExifTool::Kodak::pose = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Video' }, + PROCESS_PROC => \&ProcessPose, + NOTES => q{ + Streamed orientation information from the PixPro 4KVR360, extracted as + sub-documents when the L<Duplicates|../ExifTool.html#Duplicates> option is used. + }, + Accelerometer => { }, # up, back, left? units of g + AngularVelocity => { } # left, up, ccw? units? +); + +# Kodak composite tags +%Image::ExifTool::Kodak::Composite = ( + GROUPS => { 2 => 'Camera' }, + DateCreated => { + Groups => { 2 => 'Time' }, + Require => { + 0 => 'Kodak:YearCreated', + 1 => 'Kodak:MonthDayCreated', + }, + ValueConv => '"$val[0]:$val[1]"', + }, + WB_RGBLevels => { + Require => { + 0 => 'KDC_IFD:WhiteBalance', + }, + # indices of the following entries are KDC_IFD:WhiteBalance + 1 + Desire => { + 1 => 'WB_RGBLevelsAuto', + 2 => 'WB_RGBLevelsFluorescent', + 3 => 'WB_RGBLevelsTungsten', + 4 => 'WB_RGBLevelsDaylight', + 5 => 'WB_RGBLevels4', + 6 => 'WB_RGBLevels5', + 7 => 'WB_RGBLevelsShade', + }, + ValueConv => '$val[$val[0] + 1]', + }, + WB_RGBLevels2 => { + Name => 'WB_RGBLevels', + Require => { + 0 => 'KodakIFD:WhiteBalance', + 1 => 'WB_RGBMul0', + 2 => 'WB_RGBMul1', + 3 => 'WB_RGBMul2', + 4 => 'WB_RGBMul3', + 5 => 'WB_RGBCoeffs0', + 6 => 'WB_RGBCoeffs1', + 7 => 'WB_RGBCoeffs2', + 8 => 'WB_RGBCoeffs3', + }, + # indices of the following entries are KDC_IFD:WhiteBalance + 1 + Desire => { + 9 => 'KodakIFD:ColorTemperature', + 10 => 'Kodak:WB_RGBLevels', + }, + ValueConv => 'Image::ExifTool::Kodak::CalculateRGBLevels(@val)', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::Kodak'); + +#------------------------------------------------------------------------------ +# Process Kodak accelerometer data (ref PH) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessPose($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = length $$dataPt; + my $ee = $et->Options('ExtractEmbedded'); + my ($i, $pos); + + return 0 if $dirLen < 0x14; + my $num = Get32u($dataPt, 0x10); + return 0 if $dirLen < 0x14 + $num * 24; + + $et->VerboseDir('Kodak pose', undef, $dirLen); + + $$et{DOC_NUM} = 0; + for ($i=0, $pos=0x14; $i<$num; ++$i, $pos+=24) { + $et->HandleTag($tagTablePtr, AngularVelocity => + Image::ExifTool::GetRational64s($dataPt, $pos) . ' ' . + Image::ExifTool::GetRational64s($dataPt, $pos + 8) . ' ' . + Image::ExifTool::GetRational64s($dataPt, $pos + 16)); + $ee or $pos += $num * 24, last; + ++$$et{DOC_NUM}; + } + $$et{DOC_NUM} = 0; + + return 1 if $dirLen < $pos + 0x10; + $num = Get32u($dataPt, $pos + 0x0c); + return 1 if $dirLen < $pos + 0x10 + $num * 24; + + for ($i=0, $pos+=0x10; $i<$num; ++$i, $pos+=24) { + $et->HandleTag($tagTablePtr, Accelerometer => + Image::ExifTool::GetRational64s($dataPt, $pos) . ' ' . + Image::ExifTool::GetRational64s($dataPt, $pos + 8) . ' ' . + Image::ExifTool::GetRational64s($dataPt, $pos + 16)); + $ee or $pos += $num * 24, last; + ++$$et{DOC_NUM}; + } + $$et{DOC_NUM} = 0; + $ee or $et->Warn('Use the ExtractEmbedded option to extract all accelerometer data',3); + return 1; +} + +#------------------------------------------------------------------------------ +# Calculate RGB levels from associated tags (ref 3) +# Inputs: 0) KodakIFD:WhiteBalance, 1-4) WB_RGBMul0-3, 5-8) WB_RGBCoeffs0-3 +# 9) (optional) KodakIFD:ColorTemperature, 10) (optional) Kodak:WB_RGBLevels +# Returns: WB_RGBLevels or undef +sub CalculateRGBLevels(@) +{ + return undef if $_[10]; # use existing software levels if they exist + my $wbi = $_[0]; + return undef if $wbi < 0 or $wbi > 3; + my @mul = split ' ', $_[$wbi + 1], 13; # (only use the first 12 coeffs) + my @coefs = split ' ', ${$_[$wbi + 5]}; # (extra de-reference for Binary data) + my $wbtemp100 = ($_[9] || 6500) / 100; + return undef unless @mul >= 3 and @coefs >= 12; + my ($i, $c, $n, $num, @cam_mul); + for ($c=$n=0; $c<3; ++$c) { + for ($num=$i=0; $i<4; ++$i) { + $num += $coefs[$n++] * ($wbtemp100 ** $i); + } + $cam_mul[$c] = 2048 / ($num * $mul[$c]); + } + return join(' ', @cam_mul); +} + +#------------------------------------------------------------------------------ +# Process Kodak textual TextualInfo +# Inputs: 0) ExifTool object ref, 1) dirInfo hash ref, 2) tag table ref +# Returns: 1 on success +sub ProcessKodakText($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $dirStart; + my $data = substr($$dataPt, $dirStart, $dirLen); + $data =~ s/\0.*//s; # truncate at null if it exists + my @lines = split /[\n\r]+/, $data; + my ($line, $success, @other, $tagInfo); + $et->VerboseDir('Kodak Text'); + foreach $line (@lines) { + if ($line =~ /(.*?):\s*(.*)/) { + my ($tag, $val) = ($1, $2); + if ($$tagTablePtr{$tag}) { + $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + } else { + my $tagName = $tag; + $tagName =~ s/([A-Z])\s+([A-Za-z])/${1}_\U$2/g; + $tagName =~ s/([a-z])\s+([A-Za-z0-9])/${1}\U$2/g; + $tagName =~ s/\s+//g; + $tagName =~ s/[^-\w]+//g; # delete remaining invalid characters + $tagName = 'NoName' unless $tagName; + $tagInfo = { Name => $tagName }; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + $et->HandleTag($tagTablePtr, $tag, $val, TagInfo => $tagInfo); + $success = 1; + } else { + # strip off leading/trailing white space and ignore blank lines + push @other, $1 if $line =~ /^\s*(\S.*?)\s*$/; + } + } + if ($success) { + if (@other) { + $tagInfo = $et->GetTagInfo($tagTablePtr, '_other_info'); + $et->FoundTag($tagInfo, \@other); + } + } else { + $et->Warn("Can't parse Kodak TextualInfo data", 1); + } + return $success; +} + +#------------------------------------------------------------------------------ +# Process Kodak IFD (with leading byte order mark) +# Inputs: 0) ExifTool object ref, 1) dirInfo hash ref, 2) tag table ref +# Returns: 1 on success, otherwise returns 0 and sets a Warning +sub ProcessKodakIFD($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dirStart = $$dirInfo{DirStart} || 0; + return 1 if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen}; + my $byteOrder = substr(${$$dirInfo{DataPt}}, $dirStart, 2); + unless (Image::ExifTool::SetByteOrder($byteOrder)) { + $et->Warn("Invalid Kodak $$dirInfo{Name} directory"); + return 1; + } + $$dirInfo{DirStart} += 2; # skip byte order mark + $$dirInfo{DirLen} -= 2; + if ($$et{HTML_DUMP}) { + my $base = $$dirInfo{Base} + $$dirInfo{DataPos}; + $et->HDump($dirStart+$base, 2, "Byte Order Mark"); + } + return Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Write Kodak IFD (with leading byte order mark) +# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref +# Returns: Exif data block (may be empty if no Exif data) or undef on error +sub WriteKodakIFD($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dirStart = $$dirInfo{DirStart} || 0; + return '' if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen}; + my $byteOrder = substr(${$$dirInfo{DataPt}}, $dirStart, 2); + return '' unless Image::ExifTool::SetByteOrder($byteOrder); + $$dirInfo{DirStart} += 2; # skip byte order mark + $$dirInfo{DirLen} -= 2; + my $buff = Image::ExifTool::Exif::WriteExif($et, $dirInfo, $tagTablePtr); + return $buff unless defined $buff and length $buff; + # apply one-time fixup for length of byte order mark + if ($$dirInfo{Fixup}) { + $dirInfo->{Fixup}->{Shift} += 2; + $$dirInfo{Fixup}->ApplyFixup(\$buff); + delete $$dirInfo{Fixup}; + } + return Image::ExifTool::GetByteOrder() . $buff; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Kodak - Kodak EXIF maker notes and APP3 "Meta" tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to +interpret Kodak maker notes EXIF meta information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<Image::MetaData::JPEG|Image::MetaData::JPEG> + +=item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html> + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=item (...plus lots of testing with my daughter's CX4200!) + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Kodak Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/KyoceraRaw.pm b/lib/Image/ExifTool/KyoceraRaw.pm new file mode 100644 index 0000000..f8d3cd7 --- /dev/null +++ b/lib/Image/ExifTool/KyoceraRaw.pm @@ -0,0 +1,173 @@ +#------------------------------------------------------------------------------ +# File: KyoceraRaw.pm +# +# Description: Read Kyocera RAW meta information +# +# Revisions: 02/17/2006 - P. Harvey Created +# +# References: 1) http://www.cybercom.net/~dcoffin/dcraw/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::KyoceraRaw; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.03'; + +sub ProcessRAW($$); + +# utility to reverse order of characters in a string +sub ReverseString($) { pack('C*',reverse unpack('C*',shift)) } + +# Contax N Digital tags (ref PH) +%Image::ExifTool::KyoceraRaw::Main = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Tags for Kyocera Contax N Digital RAW images.', + 0x01 => { + Name => 'FirmwareVersion', + Format => 'string[10]', + ValueConv => \&ReverseString, + }, + 0x0c => { + Name => 'Model', + Format => 'string[12]', + ValueConv => \&ReverseString, + }, + 0x19 => { #1 + Name => 'Make', + Format => 'string[7]', + ValueConv => \&ReverseString, + }, + 0x21 => { #1 + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Format => 'string[20]', + ValueConv => \&ReverseString, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x34 => { + Name => 'ISO', + Groups => { 2 => 'Image' }, + Format => 'int32u', + PrintConv => { + 7 => 25, + 8 => 32, + 9 => 40, + 10 => 50, + 11 => 64, + 12 => 80, + 13 => 100, + 14 => 125, + 15 => 160, + 16 => 200, + 17 => 250, + 18 => 320, + 19 => 400, + }, + }, + 0x38 => { + Name => 'ExposureTime', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '2**($val / 8) / 16000', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x3c => { #1 + Name => 'WB_RGGBLevels', + Groups => { 2 => 'Image' }, + Format => 'int32u[4]', + }, + 0x58 => { + Name => 'FNumber', + Groups => { 2 => 'Image' }, + Format => 'int32u', + ValueConv => '2**($val/16)', + PrintConv => 'sprintf("%.2g",$val)', + }, + 0x68 => { + Name => 'MaxAperture', + Format => 'int32u', + ValueConv => '2**($val/16)', + PrintConv => 'sprintf("%.2g",$val)', + }, + 0x70 => { + Name => 'FocalLength', + Format => 'int32u', + PrintConv => '"$val mm"', + }, + 0x7c => { + Name => 'Lens', + Format => 'string[32]', + }, +); + +#------------------------------------------------------------------------------ +# Extract information from Kyocera RAW image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 if this was a valid Kyocera RAW image +sub ProcessRAW($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $size = 156; # size of header + my $buff; + + $raf->Read($buff, $size) == $size or return 0; + # validate Make string ('KYOCERA' reversed) + substr($buff, 0x19, 7) eq 'ARECOYK' or return 0; + $et->SetFileType(); + SetByteOrder('MM'); + my %dirInfo = ( + DataPt => \$buff, + DataPos => 0, + DataLen => $size, + DirStart => 0, + DirLen => $size, + ); + my $tagTablePtr = GetTagTable('Image::ExifTool::KyoceraRaw::Main'); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::KyoceraRaw - Read Kyocera RAW meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read +meta information from Kyocera Contax N Digital RAW images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/KyoceraRaw Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/LIF.pm b/lib/Image/ExifTool/LIF.pm new file mode 100644 index 0000000..3065c5c --- /dev/null +++ b/lib/Image/ExifTool/LIF.pm @@ -0,0 +1,153 @@ +#------------------------------------------------------------------------------ +# File: LIF.pm +# +# Description: Read LIF (Leica Image File) files +# +# Revisions: 2021-06-21 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::LIF; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::XMP; + +$VERSION = '1.00'; + +%Image::ExifTool::LIF::Main = ( + GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP, + VARS => { NO_ID => 1 }, + NOTES => q{ + Tags extracted from Leica Image Format (LIF) imaging files. As well as the + tags listed below, all available information is extracted from the + XML-format metadata in the LIF header. + }, + TimeStampList => { + Groups => { 2 => 'Time' }, + ValueConv => q{ + my $unixTimeZero = 134774 * 24 * 3600; + my @vals = split ' ', $val; + foreach (@vals) { + $_ = 1e-7 * hex($_); + # shift from Jan 1, 1601 to Jan 1, 1970 + $_ = Image::ExifTool::ConvertUnixTime($_ - $unixTimeZero); + } + return \@vals; + }, + }, +); + +#------------------------------------------------------------------------------ +# Shorten obscenely long LIF tag names +# Inputs: Tag name +# Returns: Shortened tag name +sub ShortenTagNames($) +{ + local $_; + $_ = shift; + s/DescriptionDimensionsDimensionDescription/Dimensions/; + s/DescriptionChannelsChannelDescription/Channel/; + s/ShutterListShutter/Shutter/; + s/SettingDefinition/Setting/; + s/AdditionalZPositionListAdditionalZPosition/AdditionalZPosition/; + s/LMSDataContainerHeader//g; + s/FilterWheelWheel/FilterWheel/; + s/FilterWheelFilter/FilterWheel/; + s/DetectorListDetector/Detector/; + s/OnlineDyeSeparationOnlineDyeSeparation/OnlineDyeSeparation/; + s/AotfListAotf/Aotf/; + s/SettingAotfLaserLineSetting/SettingAotfLaser/; + s/DataROISetROISet/DataROISet/; + s/AdditionalZPosition/AddZPos/; + s/FRAPplusBlock_FRAPBlock_FRAP_PrePost_Info/FRAP_/; + s/FRAPplusBlock_FRAPBlock_FRAP_(Master)?/FRAP_/; + s/LDM_Block_SequentialLDM_Block_Sequential_/LDM_/; + s/ATLConfocalSetting/ATLConfocal/; + s/LaserArrayLaser/Laser/; + s/LDM_Master/LDM_/; + s/(List)?ATLConfocal/ATL_/; + s/Separation/Sep/; + s/BleachPointsElement/BleachPoint/; + s/BeamPositionBeamPosition/BeamPosition/; + s/DataROISetPossible(ROI)?/DataROISet/; + s/RoiElementChildrenElementDataROISingle(Roi)?/Roi/; + s/InfoLaserLineSettingArrayLaserLineSetting/LastLineSetting/; + s/FilterWheelWheelNameFilterName/FilterWheelFilterName/; + s/LUT_ListLut/Lut/; + s/ROI_ListRoiRoidata/ROI_/; + s/LaserLineSettingArrayLaserLineSetting/LaserLineSetting/; + return $_; +} + +#------------------------------------------------------------------------------ +# Extract metadata from a LIF image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid LIF file +sub ProcessLIF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + + # verify this is a valid LIF file + return 0 unless $raf->Read($buff, 15) == 15 and $buff =~ /^\x70\0{3}.{4}\x2a.{4}<\0/s; + + $et->SetFileType(); + SetByteOrder('II'); + + my $size = Get32u(\$buff, 4); # XML chunk size + my $len = Get32u(\$buff, 9) * 2; # XML data length + + $size < $len and $et->Error('Corrupted LIF XML block'), return 1; + $size > 100000000 and $et->Error('LIF XML block too large'), return 1; + + $raf->Seek(-2, 1) and $raf->Read($buff, $len) == $len or $et->Error('Truncated LIF XML block'), return 1; + + my $tagTablePtr = GetTagTable('Image::ExifTool::LIF::Main'); + + # convert from UCS2 to UTF8 + my $xml = Image::ExifTool::Decode($et, $buff, 'UCS2', 'II', 'UTF8'); + + my %dirInfo = ( DataPt => \$xml ); + + $$et{XmpIgnoreProps} = [ 'LMSDataContainerHeader', 'Element', 'Children', 'Data', 'Image', 'Attachment' ]; + $$et{ShortenXmpTags} = \&ShortenTagNames; + + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::LIF - Read LIF meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read +metadata from Leica Image File (LIF) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/LIF Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/LNK.pm b/lib/Image/ExifTool/LNK.pm new file mode 100644 index 0000000..f66496a --- /dev/null +++ b/lib/Image/ExifTool/LNK.pm @@ -0,0 +1,726 @@ +#------------------------------------------------------------------------------ +# File: LNK.pm +# +# Description: Read meta information from MS Shell Link files +# +# Revisions: 2009/09/19 - P. Harvey Created +# +# References: 1) http://msdn.microsoft.com/en-us/library/dd871305(PROT.10).aspx +# 2) http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::LNK; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.08'; + +sub ProcessItemID($$$); +sub ProcessLinkInfo($$$); + +# Information extracted from LNK (Windows Shortcut) files +%Image::ExifTool::LNK::Main = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + VARS => { HEX_ID => 1 }, # print hex ID's in documentation + NOTES => 'Information extracted from MS Shell Link (Windows shortcut) files.', + # maybe the Flags aren't very useful to the user (since they are + # mainly structural), but extract them anyway for completeness + 0x14 => { + Name => 'Flags', + Format => 'int32u', + PrintConv => { BITMASK => { + 0 => 'IDList', + 1 => 'LinkInfo', + 2 => 'Description', + 3 => 'RelativePath', + 4 => 'WorkingDir', + 5 => 'CommandArgs', + 6 => 'IconFile', + 7 => 'Unicode', + 8 => 'NoLinkInfo', + 9 => 'ExpString', + 10 => 'SeparateProc', + 12 => 'DarwinID', + 13 => 'RunAsUser', + 14 => 'ExpIcon', + 15 => 'NoPidAlias', + 17 => 'RunWithShim', + 18 => 'NoLinkTrack', + 19 => 'TargetMetadata', + 20 => 'NoLinkPathTracking', + 21 => 'NoKnownFolderTracking', + 22 => 'NoKnownFolderAlias', + 23 => 'LinkToLink', + 24 => 'UnaliasOnSave', + 25 => 'PreferEnvPath', + 26 => 'KeepLocalIDList', + }}, + }, + 0x18 => { + Name => 'FileAttributes', + Format => 'int32u', + PrintConv => { BITMASK => { + 0 => 'Read-only', + 1 => 'Hidden', + 2 => 'System', + 3 => 'Volume', #(not used) + 4 => 'Directory', + 5 => 'Archive', + 6 => 'Encrypted?', #(ref 2, not used in XP) + 7 => 'Normal', + 8 => 'Temporary', + 9 => 'Sparse', + 10 => 'Reparse point', + 11 => 'Compressed', + 12 => 'Offline', + 13 => 'Not indexed', + 14 => 'Encrypted', + }}, + }, + 0x1c => { + Name => 'CreateDate', + Format => 'int64u', + Groups => { 2 => 'Time' }, + # convert time from 100-ns intervals since Jan 1, 1601 + RawConv => '$val ? $val : undef', + ValueConv => '$val=$val/1e7-11644473600; ConvertUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x24 => { + Name => 'AccessDate', + Format => 'int64u', + Groups => { 2 => 'Time' }, + RawConv => '$val ? $val : undef', + ValueConv => '$val=$val/1e7-11644473600; ConvertUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x2c => { + Name => 'ModifyDate', + Format => 'int64u', + Groups => { 2 => 'Time' }, + RawConv => '$val ? $val : undef', + ValueConv => '$val=$val/1e7-11644473600; ConvertUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x34 => { + Name => 'TargetFileSize', + Format => 'int32u', + }, + 0x38 => { + Name => 'IconIndex', + Format => 'int32u', + PrintConv => '$val ? $val : "(none)"', + }, + 0x3c => { + Name => 'RunWindow', + Format => 'int32u', + PrintConv => { + 0 => 'Hide', + 1 => 'Normal', + 2 => 'Show Minimized', + 3 => 'Show Maximized', + 4 => 'Show No Activate', + 5 => 'Show', + 6 => 'Minimized', + 7 => 'Show Minimized No Activate', + 8 => 'Show NA', + 9 => 'Restore', + 10 => 'Show Default', + }, + }, + 0x40 => { + Name => 'HotKey', + Format => 'int32u', + PrintHex => 1, + PrintConv => { + OTHER => sub { + my $val = shift; + my $ch = $val & 0xff; + if (chr $ch =~ /^[A-Z0-9]$/) { + $ch = chr $ch; + } elsif ($ch >= 0x70 and $ch <= 0x87) { + $ch = 'F' . ($ch - 0x6f); + } elsif ($ch == 0x90) { + $ch = 'Num Lock'; + } elsif ($ch == 0x91) { + $ch = 'Scroll Lock'; + } else { + $ch = sprintf('Unknown (0x%x)', $ch); + } + $ch = "Alt-$ch" if $val & 0x400; + $ch = "Control-$ch" if $val & 0x200; + $ch = "Shift-$ch" if $val & 0x100; + return $ch; + }, + 0x00 => '(none)', + # these entries really only for documentation + 0x90 => 'Num Lock', + 0x91 => 'Scroll Lock', + "0x30'-'0x39" => "0-9", + "0x41'-'0x5a" => "A-Z", + "0x70'-'0x87" => "F1-F24", + 0x100 => 'Shift', + 0x200 => 'Control', + 0x400 => 'Alt', + }, + }, + # note: tags 0x10xx are synthesized tag ID's + 0x10000 => { + Name => 'ItemID', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::ItemID' }, + }, + 0x20000 => { + Name => 'LinkInfo', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::LinkInfo' }, + }, + 0x30004 => 'Description', + 0x30008 => 'RelativePath', + 0x30010 => 'WorkingDirectory', + 0x30020 => 'CommandLineArguments', + 0x30040 => 'IconFileName', + # note: tags 0xa000000x are actually ID's (not indices) + 0xa0000000 => { + Name => 'UnknownData', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' }, + }, + 0xa0000001 => { + Name => 'EnvVarData', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' }, + }, + 0xa0000002 => { + Name => 'ConsoleData', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::ConsoleData' }, + }, + 0xa0000003 => { + Name => 'TrackerData', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::TrackerData' }, + }, + 0xa0000004 => { + Name => 'ConsoleFEData', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::ConsoleFEData' }, + }, + 0xa0000005 => { + Name => 'SpecialFolderData', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' }, + }, + 0xa0000006 => { + Name => 'DarwinData', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' }, + }, + 0xa0000007 => { + Name => 'IconEnvData', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' }, + }, + 0xa0000008 => { + Name => 'ShimData', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' }, + }, + 0xa0000009 => { + Name => 'PropertyStoreData', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' }, + }, + 0xa000000b => { + Name => 'KnownFolderData', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' }, + }, + 0xa000000c => { + Name => 'VistaIDListData', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' }, + }, +); + +%Image::ExifTool::LNK::ItemID = ( + GROUPS => { 2 => 'Other' }, + PROCESS_PROC => \&ProcessItemID, + # (can't find any documentation on these items) + 0x0032 => { + Name => 'Item0032', + SubDirectory => { TagTable => 'Image::ExifTool::LNK::Item0032' }, + }, +); + +%Image::ExifTool::LNK::Item0032 = ( + GROUPS => { 2 => 'Other' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + 0x0e => { + Name => 'TargetFileDOSName', + Format => 'var_string', + }, + #not at a fixed offset -- offset is given by last 2 bytes of the item + 0x14 + #0x22 => { + # Name => 'TargetFileName', + # Format => 'var_ustring', + #}, +); + +%Image::ExifTool::LNK::LinkInfo = ( + GROUPS => { 2 => 'Other' }, + PROCESS_PROC => \&ProcessLinkInfo, + FORMAT => 'int32u', + VARS => { NO_ID => 1 }, + VolumeID => { }, + DriveType => { + PrintConv => { + 0 => 'Unknown', + 1 => 'Invalid Root Path', + 2 => 'Removable Media', + 3 => 'Fixed Disk', + 4 => 'Remote Drive', + 5 => 'CD-ROM', + 6 => 'Ram Disk', + }, + }, + DriveSerialNumber => { + PrintConv => 'join("-", unpack("A4 A4", sprintf("%08X", $val)))', + }, + VolumeLabel => { }, + LocalBasePath => { }, + CommonNetworkRelLink => { }, + CommonPathSuffix => { }, + NetName => { }, + DeviceName => { }, + NetProviderType => { + PrintHex => 1, + PrintConv => { + 0x1a0000 => 'AVID', + 0x1b0000 => 'DOCUSPACE', + 0x1c0000 => 'MANGOSOFT', + 0x1d0000 => 'SERNET', + 0x1e0000 => 'RIVERFRONT1', + 0x1f0000 => 'RIVERFRONT2', + 0x200000 => 'DECORB', + 0x210000 => 'PROTSTOR', + 0x220000 => 'FJ_REDIR', + 0x230000 => 'DISTINCT', + 0x240000 => 'TWINS', + 0x250000 => 'RDR2SAMPLE', + 0x260000 => 'CSC', + 0x270000 => '3IN1', + 0x290000 => 'EXTENDNET', + 0x2a0000 => 'STAC', + 0x2b0000 => 'FOXBAT', + 0x2c0000 => 'YAHOO', + 0x2d0000 => 'EXIFS', + 0x2e0000 => 'DAV', + 0x2f0000 => 'KNOWARE', + 0x300000 => 'OBJECT_DIRE', + 0x310000 => 'MASFAX', + 0x320000 => 'HOB_NFS', + 0x330000 => 'SHIVA', + 0x340000 => 'IBMAL', + 0x350000 => 'LOCK', + 0x360000 => 'TERMSRV', + 0x370000 => 'SRT', + 0x380000 => 'QUINCY', + 0x390000 => 'OPENAFS', + 0x3a0000 => 'AVID1', + 0x3b0000 => 'DFS', + }, + }, +); + +%Image::ExifTool::LNK::UnknownData = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, +); + +%Image::ExifTool::LNK::ConsoleData = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + 0x08 => { + Name => 'FillAttributes', + Format => 'int16u', + PrintConv => 'sprintf("0x%.2x", $val)', + }, + 0x0a => { + Name => 'PopupFillAttributes', + Format => 'int16u', + PrintConv => 'sprintf("0x%.2x", $val)', + }, + 0x0c => { + Name => 'ScreenBufferSize', + Format => 'int16u[2]', + PrintConv => '$val=~s/ / x /; $val', + }, + 0x10 => { + Name => 'WindowSize', + Format => 'int16u[2]', + PrintConv => '$val=~s/ / x /; $val', + }, + 0x14 => { + Name => 'WindowOrigin', + Format => 'int16u[2]', + PrintConv => '$val=~s/ / x /; $val', + }, + 0x20 => { + Name => 'FontSize', + Format => 'int16u[2]', + PrintConv => '$val=~s/ / x /; $val', + }, + 0x24 => { + Name => 'FontFamily', + Format => 'int32u', + PrintHex => 1, + PrintConv => { + 0 => "Don't Care", + 0x10 => 'Roman', + 0x20 => 'Swiss', + 0x30 => 'Modern', + 0x40 => 'Script', + 0x50 => 'Decorative', + }, + }, + 0x28 => { + Name => 'FontWeight', + Format => 'int32u', + }, + 0x2c => { + Name => 'FontName', + Format => 'undef[64]', + RawConv => q{ + $val = $self->Decode($val, 'UCS2'); + $val =~ s/\0.*//s; + return length($val) ? $val : undef; + }, + }, + 0x6c => { + Name => 'CursorSize', + Format => 'int32u', + }, + 0x70 => { + Name => 'FullScreen', + Format => 'int32u', + PrintConv => '$val ? "Yes" : "No"', + }, + 0x74 => { #PH (MISSING FROM MS DOCUMENTATION! -- screws up subsequent offsets) + Name => 'QuickEdit', + Format => 'int32u', + PrintConv => '$val ? "Yes" : "No"', + }, + 0x78 => { + Name => 'InsertMode', + Format => 'int32u', + PrintConv => '$val ? "Yes" : "No"', + }, + 0x7c => { + Name => 'WindowOriginAuto', + Format => 'int32u', + PrintConv => '$val ? "Yes" : "No"', + }, + 0x80 => { + Name => 'HistoryBufferSize', + Format => 'int32u', + }, + 0x84 => { + Name => 'NumHistoryBuffers', + Format => 'int32u', + }, + 0x88 => { + Name => 'RemoveHistoryDuplicates', + Format => 'int32u', + PrintConv => '$val ? "Yes" : "No"', + }, +); + +%Image::ExifTool::LNK::TrackerData = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + 0x10 => { + Name => 'MachineID', + Format => 'var_string', + }, +); + +%Image::ExifTool::LNK::ConsoleFEData = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + 0x08 => { + Name => 'CodePage', + Format => 'int32u', + }, +); + +#------------------------------------------------------------------------------ +# Extract null-terminated ASCII or Unicode string from buffer +# Inputs: 0) buffer ref, 1) start position, 2) flag for unicode string +# Return: string or undef if start position is outside bounds +sub GetString($$;$) +{ + my ($dataPt, $pos, $unicode) = @_; + return undef if $pos >= length($$dataPt); + pos($$dataPt) = $pos; + return $1 if ($unicode ? $$dataPt=~/\G((?:..)*?)\0\0/sg : $$dataPt=~/\G(.*?)\0/sg); + return substr($$dataPt, $pos); +} + +#------------------------------------------------------------------------------ +# Process item ID data +# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref +# Returns: 1 on success +sub ProcessItemID($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataLen = length $$dataPt; + my $pos = 0; + my %opts = ( + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + ); + $et->VerboseDir('ItemID', undef, $dataLen); + for (;;) { + last if $pos + 4 >= $dataLen; + my $size = Get16u($dataPt, $pos); + last if $size < 2 or $pos + $size > $dataLen; + my $tag = Get16u($dataPt, $pos+2); # (just a guess -- may not be a tag at all) + AddTagToTable($tagTablePtr, $tag, { + Name => sprintf('Item%.4x', $tag), + SubDirectory => { TagTable => 'Image::ExifTool::LNK::UnknownData' }, + }) unless $$tagTablePtr{$tag}; + $et->HandleTag($tagTablePtr, $tag, undef, %opts, Start => $pos, Size => $size); + $pos += $size; + } +} + +#------------------------------------------------------------------------------ +# Process link information data +# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref +# Returns: 1 on success +sub ProcessLinkInfo($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataLen = length $$dataPt; + return 0 if $dataLen < 0x20; + my $hdrLen = Get32u($dataPt, 4); + my $lif = Get32u($dataPt, 8); # link info flags + my %opts = ( + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + Size => 4, # (typical value size) + ); + my ($off, $unicode, $pos, $val, $size); + $et->VerboseDir('LinkInfo', undef, $dataLen); + if ($lif & 0x01) { + # read Volume ID + $off = Get32u($dataPt, 0x0c); + if ($off + 0x20 <= $dataLen) { + # my $len = Get32u($dataPt, $off); + $et->HandleTag($tagTablePtr, 'DriveType', undef, %opts, Start=>$off+4); + $et->HandleTag($tagTablePtr, 'DriveSerialNumber', undef, %opts, Start=>$off+8); + $pos = Get32u($dataPt, $off + 0x0c); + if ($pos == 0x14) { + # use VolumeLabelOffsetUnicode instead + $pos = Get32u($dataPt, $off + 0x10); + $unicode = 1; + } + $pos += $off; + $val = GetString($dataPt, $pos, $unicode); + if (defined $val) { + $size = length $val; + $val = $et->Decode($val, 'UCS2') if $unicode; + $et->HandleTag($tagTablePtr, 'VolumeLabel', $val, %opts, Start=>$pos, Size=>$size); + } + } + # read local base path + if ($hdrLen >= 0x24) { + $pos = Get32u($dataPt, 0x1c); + $unicode = 1; + } else { + $pos = Get32u($dataPt, 0x10); + undef $unicode; + } + $val = GetString($dataPt, $pos, $unicode); + if (defined $val) { + $size = length $val; + $val = $et->Decode($val, 'UCS2') if $unicode; + $et->HandleTag($tagTablePtr, 'LocalBasePath', $val, %opts, Start=>$pos, Size=>$size); + } + } + if ($lif & 0x02) { + # read common network relative link + $off = Get32u($dataPt, 0x14); + if ($off and $off + 0x14 <= $dataLen) { + my $siz = Get32u($dataPt, $off); + $pos = Get32u($dataPt, $off + 0x08); + if ($pos > 0x14 and $siz >= 0x18) { + $pos = Get32u($dataPt, $off + 0x14); + $unicode = 1; + } else { + undef $unicode; + } + $val = GetString($dataPt, $pos, $unicode); + if (defined $val) { + $size = length $val; + $val = $et->Decode($val, 'UCS2') if $unicode; + $et->HandleTag($tagTablePtr, 'NetName', $val, %opts, Start=>$pos, Size=>$size); + } + my $flg = Get32u($dataPt, $off + 0x04); + if ($flg & 0x01) { + $pos = Get32u($dataPt, $off + 0x0c); + if ($pos > 0x14 and $siz >= 0x1c) { + $pos = Get32u($dataPt, $off + 0x18); + $unicode = 1; + } else { + undef $unicode; + } + $val = GetString($dataPt, $pos, $unicode); + if (defined $val) { + $size = length $val; + $val = $et->Decode($val, 'UCS2') if $unicode; + $et->HandleTag($tagTablePtr, 'DeviceName', $val, %opts, Start=>$pos, Size=>$size); + } + } + if ($flg & 0x02) { + $val = Get32u($dataPt, $off + 0x10); + $et->HandleTag($tagTablePtr, 'NetProviderType', $val, %opts, Start=>$off + 0x10); + } + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from a MS Shell Link (Windows shortcut) file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid LNK file +sub ProcessLNK($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $buf2, $len, $i); + + # read LNK file header + $raf->Read($buff, 0x4c) == 0x4c or return 0; + $buff =~ /^.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46/s or return 0; + $len = unpack('V', $buff); + $len >= 0x4c or return 0; + if ($len > 0x4c) { + $raf->Read($buf2, $len - 0x4c) == $len - 0x4c or return 0; + $buff .= $buf2; + } + $et->SetFileType(); + SetByteOrder('II'); + + my $tagTablePtr = GetTagTable('Image::ExifTool::LNK::Main'); + my %dirInfo = ( + DataPt => \$buff, + DataPos => 0, + DataLen => length $buff, + DirLen => length $buff, + ); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + + my $flags = Get32u(\$buff, 0x14); + + # read link target ID list + if ($flags & 0x01) { + $raf->Read($buff, 2) or return 1; + $len = unpack('v', $buff); + $raf->Read($buff, $len) == $len or return 1; + $et->HandleTag($tagTablePtr, 0x10000, undef, + DataPt => \$buff, + DataPos => $raf->Tell() - $len, + Size => $len, + ); + } + + # read link information + if ($flags & 0x02) { + $raf->Read($buff, 4) or return 1; + $len = unpack('V', $buff); + return 1 if $len < 4; + $raf->Read($buf2, $len - 4) == $len - 4 or return 1; + $buff .= $buf2; + $et->HandleTag($tagTablePtr, 0x20000, undef, + DataPt => \$buff, + DataPos => $raf->Tell() - $len, + Size => $len, + ); + } + + # read string data + my @strings = qw(Description RelativePath WorkingDirectory + CommandLineArguments IconFileName); + for ($i=0; $i<@strings; ++$i) { + my $mask = 0x04 << $i; + next unless $flags & $mask; + $raf->Read($buff, 2) or return 1; + $len = unpack('v', $buff); + $len *= 2 if $flags & 0x80; # characters are 2 bytes if Unicode flag is set + $raf->Read($buff, $len) or return 1; + my $val; + $val = $et->Decode($buff, 'UCS2') if $flags & 0x80; + $et->HandleTag($tagTablePtr, 0x30000 | $mask, $val, + DataPt => \$buff, + DataPos => $raf->Tell() - $len, + Size => $len, + ); + } + + # read extra data + while ($raf->Read($buff, 4) == 4) { + $len = unpack('V', $buff); + last if $len < 4; + $len -= 4; + $raf->Read($buf2, $len) == $len or last; + next unless $len > 4; + $buff .= $buf2; + my $tag = Get32u(\$buff, 4); + my $tagInfo = $$tagTablePtr{$tag}; + unless (ref $tagInfo eq 'HASH' and $$tagInfo{SubDirectory}) { + $tagInfo = $$tagTablePtr{0xa0000000}; + } + $et->HandleTag($tagTablePtr, $tag, undef, + DataPt => \$buff, + DataPos => $raf->Tell() - $len - 4, + TagInfo => $tagInfo, + ); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::LNK - Read MS Shell Link (.LNK) meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information MS Shell Link (Windows shortcut) files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://msdn.microsoft.com/en-us/library/dd871305(PROT.10).aspx> + +=item L<http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/LNK Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Lang/cs.pm b/lib/Image/ExifTool/Lang/cs.pm new file mode 100644 index 0000000..56fc3d1 --- /dev/null +++ b/lib/Image/ExifTool/Lang/cs.pm @@ -0,0 +1,1588 @@ +#------------------------------------------------------------------------------ +# File: cs.pm +# +# Description: ExifTool Czech language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::cs; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.07'; + +%Image::ExifTool::Lang::cs::Translate = ( + 'AEMeteringMode' => { + PrintConv => { + 'Multi-segment' => 'Multi segment', + }, + }, + 'AEProgramMode' => { + PrintConv => { + 'Landscape' => 'Krajina', + 'Macro' => 'Makro', + 'Portrait' => 'Portrét', + }, + }, + 'AFPoint' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'AFPointBrightness' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'AFPointSelectionMethod' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'AFPointsInFocus' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'APEVersion' => 'APE verze', + 'ActiveD-Lighting' => { + PrintConv => { + 'Low' => 'MénÄ›', + 'Normal' => 'Normální', + }, + }, + 'ActiveD-LightingMode' => { + PrintConv => { + 'Low' => 'MénÄ›', + 'Normal' => 'Normální', + }, + }, + 'AdultContentWarning' => { + PrintConv => { + 'Unknown' => 'Neznámý', + }, + }, + 'Annotations' => 'Poznámky Photoshop', + 'Aperture' => 'Clona', + 'ApertureValue' => 'Clona', + 'Artist' => 'Autor', + 'AssistButtonFunction' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'Author' => 'Autor', + 'AuthorsPosition' => 'Pozice autora', + 'AutoLightingOptimizer' => { + PrintConv => { + 'Low' => 'MénÄ›', + }, + }, + 'AutoRotate' => { + PrintConv => { + 'None' => 'Žádná', + 'Rotate 180' => '180° (dolů/vpravo)', + 'Rotate 270 CW' => '90° po smÄ›ru HR (vlevo/dolů)', + 'Rotate 90 CW' => '90° ptoti smÄ›ru HR (vpravo/nahoru)', + 'n/a' => 'Neznámý', + }, + }, + 'BadFaxLines' => 'Å patné faxové řádky', + 'BannerImageType' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'BatteryLevel' => 'Stav baterie', + 'BitsPerSample' => 'PoÄet bitů na složku', + 'BlurWarning' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'Brightness' => 'Jas', + 'BrightnessValue' => 'Jas', + 'By-line' => 'Autor', + 'CFAPattern' => 'CFA matrice', + 'CFAPattern2' => 'CFA matice 2', + 'CFARepeatPatternDim' => 'Velikost berevné matice CFA', + 'CPUType' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'CalibrationIlluminant1' => { + PrintConv => { + 'Cloudy' => 'Zataženo', + 'Cool White Fluorescent' => 'Studená zářivka', + 'Day White Fluorescent' => 'Denní zářivka', + 'Daylight' => 'Denní svÄ›tlo', + 'Daylight Fluorescent' => 'Denní svÄ›tlo', + 'Fine Weather' => 'SluneÄno', + 'Flash' => 'Blesk', + 'Fluorescent' => 'Žárovka', + 'ISO Studio Tungsten' => 'Studiová svÄ›tla', + 'Other' => 'Jiné osvÄ›tlení', + 'Shade' => 'Stíny', + 'Standard Light A' => 'Standardní svÄ›tlo A', + 'Standard Light B' => 'Standardní svÄ›tlo B', + 'Standard Light C' => 'Standardní svÄ›tlo C', + 'Tungsten (Incandescent)' => 'Zářivka', + 'Unknown' => 'Neznámý', + 'White Fluorescent' => 'Bílá zářivka', + }, + }, + 'CalibrationIlluminant2' => { + PrintConv => { + 'Cloudy' => 'Zataženo', + 'Cool White Fluorescent' => 'Studená zářivka', + 'Day White Fluorescent' => 'Denní zářivka', + 'Daylight' => 'Denní svÄ›tlo', + 'Daylight Fluorescent' => 'Denní svÄ›tlo', + 'Fine Weather' => 'SluneÄno', + 'Flash' => 'Blesk', + 'Fluorescent' => 'Žárovka', + 'ISO Studio Tungsten' => 'Studiová svÄ›tla', + 'Other' => 'Jiné osvÄ›tlení', + 'Shade' => 'Stíny', + 'Standard Light A' => 'Standardní svÄ›tlo A', + 'Standard Light B' => 'Standardní svÄ›tlo B', + 'Standard Light C' => 'Standardní svÄ›tlo C', + 'Tungsten (Incandescent)' => 'Zářivka', + 'Unknown' => 'Neznámý', + 'White Fluorescent' => 'Bílá zářivka', + }, + }, + 'CameraOrientation' => { + Description => 'Orientace', + PrintConv => { + 'Horizontal (normal)' => '0° (nahoru/vlevo)', + 'Rotate 270 CW' => '90° po smÄ›ru HR (vlevo/dolů)', + 'Rotate 90 CW' => '90° ptoti smÄ›ru HR (vpravo/nahoru)', + }, + }, + 'CanonExposureMode' => { + PrintConv => { + 'Aperture-priority AE' => 'Priorita clony', + 'Manual' => 'Manuální', + 'Shutter speed priority AE' => 'Priorita Äasu', + }, + }, + 'Caption-Abstract' => 'Popisek', + 'CaptionWriter' => 'Autor popisku', + 'CaptureXResolutionUnit' => { + PrintConv => { + 'um' => 'µm (mikrometr)', + }, + }, + 'CaptureYResolutionUnit' => { + PrintConv => { + 'um' => 'µm (mikrometr)', + }, + }, + 'Categories' => 'Kategorie', + 'Category' => 'Kategorie', + 'CellLength' => 'Délka buňky', + 'CellWidth' => 'Šířka buňky', + 'CenterWeightedAreaSize' => { + PrintConv => { + 'Average' => 'PrůmÄ›r', + }, + }, + 'ChrominanceNR_TIFF_JPEG' => { + PrintConv => { + 'Low' => 'MénÄ›', + }, + }, + 'ChrominanceNoiseReduction' => { + PrintConv => { + 'Low' => 'MénÄ›', + }, + }, + 'City' => 'MÄ›sto', + 'CleanFaxData' => 'ÄŒistá fax data', + 'ColorEffect' => { + PrintConv => { + 'Sepia' => 'Sépie', + }, + }, + 'ColorFilter' => 'Barevný filtr', + 'ColorMap' => 'Barevná mapa', + 'ColorMode' => { + PrintConv => { + 'Landscape' => 'Krajina', + 'Normal' => 'Normální', + 'Portrait' => 'Portrét', + }, + }, + 'ColorMoireReductionMode' => { + PrintConv => { + 'Low' => 'MénÄ›', + }, + }, + 'ColorResponseUnit' => 'Odpovídající barevná jednotka', + 'ColorSpace' => { + Description => 'Barevný prostor', + PrintConv => { + 'ICC Profile' => 'ICC Profil', + 'Uncalibrated' => 'Nekalibrován', + }, + }, + 'ColorTemperature' => 'Teplota barev', + 'ColorTone' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'CommanderGroupAMode' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'CommanderGroupBMode' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'CommanderInternalFlash' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'Comment' => 'Komentář', + 'ComponentsConfiguration' => 'UrÄení složek', + 'CompressedBitsPerPixel' => 'KomprimaÄní mod', + 'Compression' => { + Description => 'Kompresní algoritmus', + PrintConv => { + 'JPEG' => 'JPEG komprese', + 'JPEG (old-style)' => 'JPEG (pův. verze)', + 'Kodak DCR Compressed' => 'Kodak DCR komprese', + 'Kodak KDC Compressed' => 'Kodak KDC komprese', + 'Next' => 'Kódování NeXT 2-bit', + 'Nikon NEF Compressed' => 'Nikon NEF komprese', + 'None' => 'Žádná', + 'Pentax PEF Compressed' => 'Pentax PEF komprese', + 'SGILog' => 'Kódování SGI 32-bit Log Luminance', + 'SGILog24' => 'Kódování SGI 24-bit Log Luminance', + 'Sony ARW Compressed' => 'Sony ARW komprese', + 'Thunderscan' => 'Kódování ThunderScan 4-bit', + 'Uncompressed' => 'Bez komprese', + }, + }, + 'CompressionType' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'ConsecutiveBadFaxLines' => 'Sekvence vadných faxových řádků', + 'Contrast' => { + Description => 'Kontrast', + PrintConv => { + 'High' => 'Více', + 'Low' => 'MénÄ›', + 'Normal' => 'Normální', + }, + }, + 'ConversionLens' => { + PrintConv => { + 'Macro' => 'Makro', + }, + }, + 'Copyright' => 'Držitel práv', + 'CopyrightNotice' => 'Oznámení o autorských právech', + 'CopyrightStatus' => { + PrintConv => { + 'Unknown' => 'Neznámý', + }, + }, + 'Country' => 'ZemÄ›', + 'Country-PrimaryLocationName' => 'ZemÄ›', + 'CreateDate' => 'Datum a Äas generování digitálních dat', + 'CreationDate' => 'Datum vytvoÅ™ení', + 'Credit' => 'Kredit', + 'CropUnit' => { + PrintConv => { + 'inches' => 'Palce', + }, + }, + 'CropUnits' => { + PrintConv => { + 'inches' => 'Palce', + }, + }, + 'CustomRendered' => { + Description => 'Zpracování obrazu', + PrintConv => { + 'Custom' => 'Uživatelské zpracování', + 'Normal' => 'Normální proces', + }, + }, + 'DataImprint' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'DateCreated' => 'Datum vytvoÅ™ení', + 'DateTime' => 'Datum a Äas zmÄ›ny souboru', + 'DateTimeOriginal' => 'Datum a Äas vzniku originálních dat', + 'Description' => 'Popis', + 'DeviceSettingDescription' => 'Popis nastavení zařízení', + 'DialDirectionTvAv' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'DigitalZoom' => { + Description => 'Digitální pÅ™iblížení', + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'DigitalZoomRatio' => 'Digitální zoom', + 'Directory' => 'UmístÄ›ní souboru', + 'DisplaySize' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'DisplayUnits' => { + PrintConv => { + 'inches' => 'Palce', + }, + }, + 'DisplayXResolutionUnit' => { + PrintConv => { + 'um' => 'µm (mikrometr)', + }, + }, + 'DisplayYResolutionUnit' => { + PrintConv => { + 'um' => 'µm (mikrometr)', + }, + }, + 'DisplayedUnitsX' => { + PrintConv => { + 'inches' => 'Palce', + }, + }, + 'DisplayedUnitsY' => { + PrintConv => { + 'inches' => 'Palce', + }, + }, + 'DjVuVersion' => 'DjVu verze', + 'DocumentName' => 'Jméno dokumentu', + 'DotRange' => 'Bodová rozteÄ', + 'DriveMode' => 'Režim spouÅ¡tÄ›', + 'ETTLII' => { + PrintConv => { + 'Average' => 'PrůmÄ›r', + }, + }, + 'EasyMode' => { + PrintConv => { + 'Landscape' => 'Krajina', + 'Macro' => 'Makro', + 'Manual' => 'Manuální', + 'Night' => 'NoÄní foto', + 'Portrait' => 'Portrét', + }, + }, + 'Emphasis' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'ExifImageHeight' => 'Výška', + 'ExifImageWidth' => 'Šířka', + 'ExifOffset' => 'Ukazatel Exif IFD', + 'ExifToolVersion' => 'ExifTool verze', + 'ExifVersion' => 'Exif verze', + 'ExpandFilm' => 'Ext. film', + 'ExpandFilterLens' => 'Ext. filtr objektivu', + 'ExpandFlashLamp' => 'Ext. svÄ›tlo blesku', + 'ExpandLens' => 'Ext. objektiv', + 'ExpandScanner' => 'Ext. skener', + 'ExpandSoftware' => 'Ext. Software', + 'ExposureCompensation' => 'Korekce expozice', + 'ExposureIndex' => 'Index expozice', + 'ExposureMode' => { + Description => 'Mód expozice', + PrintConv => { + 'Aperture Priority' => 'Priorita clony', + 'Aperture-priority AE' => 'Priorita clony', + 'Auto' => 'Automatická expozice', + 'Auto bracket' => 'Auto braketing', + 'Landscape' => 'Krajina', + 'Manual' => 'Manuální expozice', + 'Portrait' => 'Portrét', + 'Shutter Priority' => 'Priorita Äasu', + 'Shutter speed priority AE' => 'Priorita Äasu', + }, + }, + 'ExposureModeInManual' => { + PrintConv => { + 'Center-weighted average' => 'ZvýraznÄ›ný stÅ™ed', + 'Partial metering' => 'Blokové', + 'Spot metering' => 'StÅ™edový bod', + }, + }, + 'ExposureProgram' => { + Description => 'ExpoziÄní mod', + PrintConv => { + 'Action (High speed)' => 'AkÄní program (ovlivnÄ›ný Äas závÄ›rky)', + 'Aperture Priority' => 'Priorita clony', + 'Aperture-priority AE' => 'Priorita clony', + 'Bulb' => 'Žárovka', + 'Creative (Slow speed)' => 'Kreativní program (ovlivnÄ›ná hloubka ostrosti)', + 'Landscape' => 'Krajina', + 'Manual' => 'Manuální', + 'Not Defined' => 'Nedefinovaný', + 'Portrait' => 'Portrét', + 'Program AE' => 'Normální program', + 'Shutter Priority' => 'Priorita Äasu', + 'Shutter speed priority AE' => 'Priorita Äasu', + }, + }, + 'ExposureTime' => 'ExpoziÄní Äas', + 'ExposureTime2' => 'ExpoziÄní Äas 2', + 'FNumber' => 'F hodnota', + 'FaceOrientation' => { + PrintConv => { + 'Horizontal (normal)' => '0° (nahoru/vlevo)', + 'Rotate 180' => '180° (dolů/vpravo)', + 'Rotate 270 CW' => '90° po smÄ›ru HR (vlevo/dolů)', + 'Rotate 90 CW' => '90° ptoti smÄ›ru HR (vpravo/nahoru)', + }, + }, + 'FaxProfile' => { + PrintConv => { + 'Unknown' => 'Neznámý', + }, + }, + 'FaxRecvParams' => 'Parametry příjemce faxu', + 'FaxRecvTime' => 'ÄŒas příjmu faxu', + 'FaxSubAddress' => 'Sub adresa faxu', + 'FileFormat' => 'Formát', + 'FileModifyDate' => 'Datum úpravy', + 'FileName' => 'Jméno', + 'FileSize' => 'Velikost', + 'FileSource' => { + Description => 'Zdroj dat', + PrintConv => { + 'Digital Camera' => 'Digitální fotoaparát', + 'Film Scanner' => 'Filmový skener', + 'Reflection Print Scanner' => 'Skener', + }, + }, + 'FileType' => 'Typ', + 'Filename' => 'Jméno', + 'FillOrder' => { + Description => 'PoÅ™adí výplnÄ›', + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'FilterEffect' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'FilterEffectMonochrome' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'Flash' => { + Description => 'Blesk', + PrintConv => { + 'Auto, Did not fire' => 'Blesk nepoužit, auto mod', + 'Auto, Did not fire, Red-eye reduction' => 'Auto mod, nepoužit, redukce Äervených oÄí', + 'Auto, Fired' => 'Blesk použit, auto mod', + 'Auto, Fired, Red-eye reduction' => 'Blesk použit, auto mod, redukce Äervených oÄí', + 'Auto, Fired, Red-eye reduction, Return detected' => 'Blesk použit, auto mod, redukce Äervených oÄí, odraz detekován', + 'Auto, Fired, Red-eye reduction, Return not detected' => 'Blesk použit, auto mod, redukce Äervených oÄí, odraz nezjiÅ¡tÄ›n', + 'Auto, Fired, Return detected' => 'Blesk použit, auto mod, odraz detekován', + 'Auto, Fired, Return not detected' => 'Blesk použit, auto mod, odraz nedetekován', + 'Did not fire' => 'Blesk ne', + 'Fired' => 'Blesk ano', + 'Fired, Red-eye reduction' => 'Blesk použit, redukce Äervených oÄí', + 'Fired, Red-eye reduction, Return detected' => 'Blesk použit, redukce Äervených oÄí, odraz detekován', + 'Fired, Red-eye reduction, Return not detected' => 'Blesk použit, redukce Äervených oÄí, odraz nezjiÅ¡tÄ›n', + 'Fired, Return detected' => 'Odraz strobozáblesků detekován', + 'Fired, Return not detected' => 'Odraz strobozáblesků nezjiÅ¡tÄ›n', + 'No Flash' => 'Blesk ne', + 'No flash function' => 'Blesk nezjiÅ¡tÄ›n', + 'Off' => 'Blesk nepoužit, vynucený mod', + 'Off, Did not fire' => 'Blesk nepoužit, vynucený mod', + 'Off, Did not fire, Return not detected' => 'Blesk vypnut, bez záblesku, odraz nezachycen', + 'Off, No flash function' => 'Neaktivní, bez funkce blesku', + 'Off, Red-eye reduction' => 'Neaktivní, redukce Äervených oÄí', + 'On' => 'Blesk použit, vynucený mod', + 'On, Did not fire' => 'Blesk zapnut, nepoužit', + 'On, Fired' => 'Blesk použit, vynucený mod', + 'On, Red-eye reduction' => 'Blesk použit, vynucený mod, redukce Äervených oÄí', + 'On, Red-eye reduction, Return detected' => 'Blesk použit, vynucený mod, redukce Äervených oÄí, odraz detekován', + 'On, Red-eye reduction, Return not detected' => 'Blesk použit, vynucený mod, redukce Äervených oÄí, odraz nezjiÅ¡tÄ›n', + 'On, Return detected' => 'Blesk použit, vynucený mod, odraz detekován', + 'On, Return not detected' => 'Blesk použit, vynucený mod, odraz nezjiÅ¡tÄ›n', + }, + }, + 'FlashControlMode' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'FlashDevice' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'FlashEnergy' => 'Síla záblesku', + 'FlashExposureComp' => 'Kompenzace blesku', + 'FlashGroupAControlMode' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'FlashGroupBControlMode' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'FlashGroupCControlMode' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'FlashIntensity' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'FlashMode' => { + PrintConv => { + 'Normal' => 'Normální', + 'Unknown' => 'Neznámý', + }, + }, + 'FlashModel' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'FlashOptions' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'FlashOptions2' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'FlashType' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'FlashpixVersion' => 'Podporovaná verze Flashpix', + 'FocalLength' => 'Ohnisková vzdálenost', + 'FocalLength35efl' => 'Ohnisková vzdálenost', + 'FocalLengthIn35mmFormat' => 'PÅ™epoÄtená ohnisková vzdálenost (35mm)', + 'FocalPlaneResolutionUnit' => { + Description => 'Jednotka rozliÅ¡ení senzoru', + PrintConv => { + 'None' => 'Žádná', + 'inches' => 'Palce', + 'um' => 'µm (mikrometr)', + }, + }, + 'FocalPlaneXResolution' => 'Horizontální rozliÅ¡ení senzoru', + 'FocalPlaneYResolution' => 'Vertikální rozliÅ¡ení senzoru', + 'Focus' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'FocusContinuous' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'FocusMode' => { + Description => 'OstÅ™ení', + PrintConv => { + 'Macro' => 'Makro', + 'Manual' => 'Manuální', + 'Normal' => 'Normální', + }, + }, + 'FocusMode2' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'FocusModeSetting' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'FocusRange' => { + PrintConv => { + 'Macro' => 'Makro', + 'Manual' => 'Manuální', + 'Normal' => 'Normální', + }, + }, + 'FocusTrackingLockOn' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'FrameRate' => 'Snímkovací frekvence', + 'FrameSize' => 'Velikost snímku', + 'FreeByteCounts' => 'PoÄet volných bytů', + 'FreeOffsets' => 'Volná datová pozice', + 'GIFVersion' => 'GIF verze', + 'GPSAltitude' => 'NadmoÅ™ská výška', + 'GPSAltitudeRef' => { + Description => 'NadmoÅ™ská výška', + PrintConv => { + 'Above Sea Level' => 'NadmoÅ™ská výška', + 'Below Sea Level' => 'NadmoÅ™ská výška (záporná hodnota)', + }, + }, + 'GPSAreaInformation' => 'Název GPS oblasti', + 'GPSDOP' => 'PÅ™esnost měření', + 'GPSDateStamp' => 'GPS Datum', + 'GPSDateTime' => 'GPS Äas (atomový Äas)', + 'GPSDestBearing' => 'Azimut cíle', + 'GPSDestBearingRef' => { + Description => 'Reference azimutu cíle.', + PrintConv => { + 'Magnetic North' => 'Magnetický smÄ›r', + 'True North' => 'Geografický smÄ›r', + }, + }, + 'GPSDestDistance' => 'Vzdálenost k cíli', + 'GPSDestDistanceRef' => { + Description => 'Reference vzdálenosti cíle', + PrintConv => { + 'Kilometers' => 'Kilometry', + 'Miles' => 'Míle', + 'Nautical Miles' => 'Uzle', + }, + }, + 'GPSDestLatitude' => 'ZemÄ›pisná šířka cíle', + 'GPSDestLatitudeRef' => { + Description => 'Reference pro zemÄ›pisnou šířku cíle', + PrintConv => { + 'North' => 'Severní šířka', + 'South' => 'Jižní šířka', + }, + }, + 'GPSDestLongitude' => 'ZemÄ›pisná délka cíle', + 'GPSDestLongitudeRef' => { + Description => 'Reference pro zemÄ›pisnou délku cíle', + PrintConv => { + 'East' => 'Východní délka', + 'West' => 'Západní délka', + }, + }, + 'GPSDifferential' => { + Description => 'GPS rozdílová korekce', + PrintConv => { + 'Differential Corrected' => 'ZapoÄítaná rozdílová korekce', + 'No Correction' => 'Měření bez korekce', + }, + }, + 'GPSImgDirection' => 'Orientace obrázku', + 'GPSImgDirectionRef' => { + Description => 'Reference k orientaci obrázku', + PrintConv => { + 'Magnetic North' => 'Magnetický smÄ›r', + 'True North' => 'Geografický smÄ›r', + }, + }, + 'GPSInfo' => 'IFD ukazatel v GPS informacích', + 'GPSLatitude' => 'ZemÄ›pisná šířka', + 'GPSLatitudeRef' => { + Description => 'Severní nebo Jižní šířka', + PrintConv => { + 'North' => 'Severní šířka', + 'South' => 'Jižní šířka', + }, + }, + 'GPSLongitude' => 'ZemÄ›pisná délka', + 'GPSLongitudeRef' => { + Description => 'Východní nebo západní délka', + PrintConv => { + 'East' => 'Východní délka', + 'West' => 'Západní délka', + }, + }, + 'GPSMapDatum' => 'Geodetická data', + 'GPSMeasureMode' => { + Description => 'Mod GPS', + PrintConv => { + '2-D' => '2-dimenzionální měření', + '2-Dimensional' => '2-dimenzionální měření', + '2-Dimensional Measurement' => '2-dimenzionální měření', + '3-D' => '3-dimenzionální měření', + '3-Dimensional' => '3-dimenzionální měření', + '3-Dimensional Measurement' => '3-dimenzionální měření', + }, + }, + 'GPSProcessingMethod' => 'Název procesní metody GPS', + 'GPSSatellites' => 'GPS satelity využité pÅ™i měření', + 'GPSSpeed' => 'Rychlost GPS pÅ™ijímaÄe', + 'GPSSpeedRef' => { + Description => 'Jednotka rychlosti', + PrintConv => { + 'km/h' => 'Kilometry za hodinu', + 'knots' => 'Uzle', + 'mph' => 'Míle za hodinu', + }, + }, + 'GPSStatus' => { + Description => 'Stav GPS pÅ™ijímaÄe', + PrintConv => { + 'Measurement Active' => 'Probíhá měření', + 'Measurement Void' => 'Vzájemné měření', + }, + }, + 'GPSTimeStamp' => 'GPS Äas (atomový Äas)', + 'GPSTrack' => 'SmÄ›r pohybu', + 'GPSTrackRef' => { + Description => 'Reference pro smÄ›r pohybu', + PrintConv => { + 'Magnetic North' => 'Magnetický smÄ›r', + 'True North' => 'Geografický smÄ›r', + }, + }, + 'GPSVersionID' => 'Verze GPS TAGu', + 'GainControl' => { + Description => 'Míra jasu', + PrintConv => { + 'High gain down' => 'Silné zeslabení', + 'High gain up' => 'Silné zesílení', + 'Low gain down' => 'Slabé zeslabení', + 'Low gain up' => 'Slabé zesílení', + 'None' => 'Žádná', + }, + }, + 'Gradation' => 'Pusobivy', + 'GrayResponseCurve' => 'Å edá referenÄní kÅ™ivka', + 'GrayResponseUnit' => { + Description => 'Jednotka odezvy Å¡edé', + PrintConv => { + '0.0001' => 'Číslo udávající tisíce jednotek', + '0.001' => 'Číslo udávající stovky jednotek', + '0.1' => 'Číslo udávající desítky jednotek', + '1e-05' => 'Číslo udávající desetitisíce jednotek', + '1e-06' => 'Číslo udávající statisíce jednotek', + }, + }, + 'HalftoneHints' => 'Půltóny', + 'Headline' => 'Titulek', + 'HighISONoiseReduction' => { + PrintConv => { + 'Low' => 'MénÄ›', + 'Normal' => 'Normální', + }, + }, + 'HostComputer' => 'Host', + 'Hue' => 'Odstín', + 'ICCProfile' => 'ICC-Profil', + 'IPTC-NAA' => 'IPTC-NAA metadata', + 'ISO' => 'Citlivost ISO', + 'ISOSetting' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'ImageDescription' => 'Popis obrázku', + 'ImageHeight' => 'Výška', + 'ImageHistory' => 'Historie obrázku', + 'ImageNumber' => 'Číslo obrázku', + 'ImageOrientation' => { + PrintConv => { + 'Portrait' => 'Portrét', + }, + }, + 'ImageQuality' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'ImageSize' => 'Velikost snímku', + 'ImageSourceData' => 'Zdrojová data obrázku', + 'ImageTone' => { + PrintConv => { + 'Landscape' => 'Krajina', + 'Portrait' => 'Portrét', + }, + }, + 'ImageUniqueID' => 'JedineÄné ID obrázku', + 'ImageWidth' => 'Šířka', + 'Index' => 'NápovÄ›da', + 'InkNames' => 'Název náplnÄ›', + 'InkSet' => 'Inkoustová sada', + 'Instructions' => 'Pokyny', + 'InternalFlash' => { + PrintConv => { + 'Fired' => 'Blesk ano', + 'Manual' => 'Manuální', + 'No' => 'Blesk ne', + }, + }, + 'InteropIndex' => { + Description => 'Identifikace', + PrintConv => { + 'R03 - DCF option file (Adobe RGB)' => 'R03: DCF option file (Adobe RGB)', + 'R98 - DCF basic file (sRGB)' => 'R98: DCF basic file (sRGB)', + 'THM - DCF thumbnail file' => 'THM: DCF thumbnail file', + }, + }, + 'InteropOffset' => 'ZnaÄka souÄinnosti', + 'InteropVersion' => 'Verze kompatibility', + 'JFIFVersion' => 'JFIF verze', + 'JPEGQuality' => { + PrintConv => { + 'Standard' => 'Normální', + }, + }, + 'Keyword' => 'KlíÄová slova', + 'Keywords' => 'KlíÄová slova', + 'LeafData' => 'Leaf data', + 'Lens' => 'Objektiv', + 'LensInfo' => 'Informace o optice', + 'LicenseType' => { + PrintConv => { + 'Unknown' => 'Neznámý', + }, + }, + 'LightSource' => { + Description => 'Zdroj svÄ›tla', + PrintConv => { + 'Cloudy' => 'Zataženo', + 'Cool White Fluorescent' => 'Studená zářivka', + 'Day White Fluorescent' => 'Denní zářivka', + 'Daylight' => 'Denní svÄ›tlo', + 'Daylight Fluorescent' => 'Denní svÄ›tlo', + 'Fine Weather' => 'SluneÄno', + 'Flash' => 'Blesk', + 'Fluorescent' => 'Žárovka', + 'ISO Studio Tungsten' => 'Studiová svÄ›tla', + 'Other' => 'Jiné osvÄ›tlení', + 'Shade' => 'Stíny', + 'Standard Light A' => 'Standardní svÄ›tlo A', + 'Standard Light B' => 'Standardní svÄ›tlo B', + 'Standard Light C' => 'Standardní svÄ›tlo C', + 'Tungsten (Incandescent)' => 'Zářivka', + 'Unknown' => 'Neznámý', + 'White Fluorescent' => 'Bílá zářivka', + }, + }, + 'Lightness' => 'Jas', + 'Location' => 'Lokalita', + 'LoopStyle' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'LuminanceNoiseReduction' => { + PrintConv => { + 'Low' => 'MénÄ›', + }, + }, + 'MIEVersion' => 'MIE verze', + 'Macro' => { + PrintConv => { + 'Macro' => 'Makro', + 'Manual' => 'Manuální', + 'Normal' => 'Normální', + }, + }, + 'MacroMode' => { + PrintConv => { + 'Macro' => 'Makro', + 'Normal' => 'Normální', + }, + }, + 'Make' => 'Výrobce', + 'MakerNote' => 'Privátní data výrobce', + 'MakerNotes' => 'Poznámka výrobce', + 'ManualFlashOutput' => { + PrintConv => { + 'Low' => 'MénÄ›', + }, + }, + 'MaxAperture' => 'Maximální clona+C1233 objektivu', + 'MaxApertureValue' => 'Max clona objektivu', + 'MaxSampleValue' => 'Max. hodnota vzorku', + 'MediaType' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'Metering' => { + PrintConv => { + 'Spot' => 'StÅ™edový bod', + }, + }, + 'MeteringMode' => { + Description => 'Režim měření expozice', + PrintConv => { + 'Average' => 'PrůmÄ›r', + 'Center-weighted average' => 'ZvýraznÄ›ný stÅ™ed', + 'Multi-segment' => 'Multi segment', + 'Multi-spot' => 'Vícebodové', + 'Other' => 'Jiné', + 'Partial' => 'Blokové', + 'Spot' => 'StÅ™edový bod', + 'Unknown' => 'Neznámý', + }, + }, + 'MeteringMode2' => { + PrintConv => { + 'Multi-segment' => 'Multi segment', + }, + }, + 'MeteringMode3' => { + PrintConv => { + 'Multi-segment' => 'Multi segment', + }, + }, + 'MinSampleValue' => 'Min. hodnota vzorku', + 'MinoltaQuality' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'Model' => 'Typ fotoaparátu', + 'Model2' => 'Typ zařízení (2)', + 'ModifiedPictureStyle' => { + PrintConv => { + 'Landscape' => 'Krajina', + 'None' => 'Žádná', + 'Portrait' => 'Portrét', + }, + }, + 'ModifiedSharpnessFreq' => { + PrintConv => { + 'Low' => 'MénÄ›', + }, + }, + 'ModifiedToneCurve' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'ModifiedWhiteBalance' => { + PrintConv => { + 'Cloudy' => 'Zataženo', + 'Daylight' => 'Denní svÄ›tlo', + 'Daylight Fluorescent' => 'Denní svÄ›tlo', + 'Flash' => 'Blesk', + 'Fluorescent' => 'Žárovka', + 'Shade' => 'Stíny', + 'Tungsten' => 'Zářivka', + }, + }, + 'ModifyDate' => 'Datum a Äas zmÄ›ny souboru', + 'MonochromeFilterEffect' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'MonochromeToningEffect' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'NEFCompression' => { + PrintConv => { + 'Uncompressed' => 'Bez komprese', + }, + }, + 'Noise' => 'Å um', + 'NoiseFilter' => { + PrintConv => { + 'Low' => 'MénÄ›', + }, + }, + 'NoiseReduction' => { + Description => 'PotlaÄení Å¡umu', + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'NumberofInks' => 'Číslo náplnÄ›', + 'ObjectFileType' => { + PrintConv => { + 'None' => 'Žádná', + 'Unknown' => 'Neznámý', + }, + }, + 'OldSubfileType' => 'Typ podsekce', + 'Opto-ElectricConvFactor' => 'Optoel. konverzní faktor (OECF)', + 'Orientation' => { + Description => 'Orientace', + PrintConv => { + 'Horizontal (normal)' => '0° (nahoru/vlevo)', + 'Mirror horizontal' => '0° (nahoru/vpravo)', + 'Mirror horizontal and rotate 270 CW' => '90° po smÄ›ru HR (vlevo/nahoru)', + 'Mirror horizontal and rotate 90 CW' => '90° ptoti smÄ›ru HR (vpravo/dolů)', + 'Mirror vertical' => '180° (dolů/vlevo)', + 'Rotate 180' => '180° (dolů/vpravo)', + 'Rotate 270 CW' => '90° po smÄ›ru HR (vlevo/dolů)', + 'Rotate 90 CW' => '90° ptoti smÄ›ru HR (vpravo/nahoru)', + }, + }, + 'PEFVersion' => 'PEF verze', + 'Padding' => 'Náhradní znaky', + 'PageName' => 'Jméno stránky', + 'PageNumber' => 'Číslo stránky', + 'PhotoEffectsType' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'PhotometricInterpretation' => { + Description => 'Pixelové schéma', + PrintConv => { + 'BlackIsZero' => 'ÄŒerná je nula', + 'Color Filter Array' => 'CFA (Color Filter Matrix)', + 'Pixar LogL' => 'CIE Log2(L) (Log luminance)', + 'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (Log luminance and chrominance)', + 'RGB Palette' => 'Barevné schema', + 'Transparency Mask' => 'Průhlednost', + 'WhiteIsZero' => 'Bílá je nula', + }, + }, + 'PhotoshopAnnotations' => 'Poznámky Photoshop', + 'PictureFinish' => { + PrintConv => { + 'Portrait' => 'Portrét', + }, + }, + 'PictureMode' => { + PrintConv => { + 'Aperture-priority AE' => 'Priorita clony', + 'Landscape' => 'Krajina', + 'Macro' => 'Makro', + 'Manual' => 'Manuální', + 'Portrait' => 'Portrét', + 'Shutter speed priority AE' => 'Priorita Äasu', + }, + }, + 'PictureMode2' => { + PrintConv => { + 'Aperture Priority' => 'Priorita clony', + 'Manual' => 'Manuální', + 'Shutter Speed Priority' => 'Priorita Äasu', + }, + }, + 'PictureStyle' => { + PrintConv => { + 'Landscape' => 'Krajina', + 'None' => 'Žádná', + 'Portrait' => 'Portrét', + }, + }, + 'PixelUnits' => { + PrintConv => { + 'Unknown' => 'Neznámý', + }, + }, + 'PlanarConfiguration' => { + Description => 'Uspořádání obrazových dat', + PrintConv => { + 'Chunky' => 'Chunky Format (prokládaný)', + 'Planar' => 'Planární (dvojrozmÄ›rný)', + }, + }, + 'Predictor' => { + Description => 'Predikce', + PrintConv => { + 'Horizontal differencing' => 'Horizontální diferenciace', + 'None' => 'Bez predikce', + }, + }, + 'PreviewColorSpace' => { + PrintConv => { + 'Unknown' => 'Neznámý', + }, + }, + 'PreviewImage' => 'Náhled', + 'PreviewQuality' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'PrimaryChromaticities' => 'ChromatiÄnost primárních barev', + 'ProgramLine' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'ProgramMode' => { + PrintConv => { + 'None' => 'Žádná', + 'Portrait' => 'Portrét', + }, + }, + 'Province-State' => 'Stát/provincie', + 'Quality' => { + PrintConv => { + 'Low' => 'MénÄ›', + 'Normal' => 'Normální', + }, + }, + 'QualityMode' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'RAFVersion' => 'RAF verze', + 'Rating' => 'Hodnocení', + 'RatingPercent' => 'Hodnocení v procentech', + 'RawJpgQuality' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'RecordMode' => { + Description => 'Režim záznamu', + PrintConv => { + 'Aperture Priority' => 'Priorita clony', + 'Manual' => 'Manuální', + 'Shutter Priority' => 'Priorita Äasu', + }, + }, + 'RecordingMode' => { + PrintConv => { + 'Landscape' => 'Krajina', + 'Manual' => 'Manuální', + 'Portrait' => 'Portrét', + }, + }, + 'ReferenceBlackWhite' => 'ÄŒerný a bílý referenÄní bod', + 'RelatedImageFileFormat' => 'Obrazový formát', + 'RelatedImageHeight' => 'Výška obrázku', + 'RelatedImageWidth' => 'Šířka obrázku', + 'RelatedSoundFile' => 'Audio soubor', + 'ResampleParamsQuality' => { + PrintConv => { + 'Low' => 'MénÄ›', + }, + }, + 'ResolutionUnit' => { + Description => 'Jednotka X a Y rozliÅ¡ení', + PrintConv => { + 'None' => 'Žádná', + 'cm' => 'Pixely/cm', + 'inches' => 'Palce', + }, + }, + 'RetouchHistory' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'Rotation' => { + PrintConv => { + 'Horizontal' => '0° (nahoru/vlevo)', + 'Horizontal (Normal)' => '0° (nahoru/vlevo)', + 'Horizontal (normal)' => '0° (nahoru/vlevo)', + 'Rotate 180' => '180° (dolů/vpravo)', + 'Rotate 270 CW' => '90° po smÄ›ru HR (vlevo/dolů)', + 'Rotate 90 CW' => '90° ptoti smÄ›ru HR (vpravo/nahoru)', + 'Rotated 180' => '180° (dolů/vpravo)', + 'Rotated 270 CW' => '90° po smÄ›ru HR (vlevo/dolů)', + 'Rotated 90 CW' => '90° ptoti smÄ›ru HR (vpravo/nahoru)', + }, + }, + 'RowsPerStrip' => 'PoÄet řádek v Äásti', + 'SPIFFVersion' => 'SPIFF verze', + 'SVGVersion' => 'SVG verze', + 'SampleFormat' => { + Description => 'Formát vzorku', + PrintConv => { + 'Complex int' => 'Komplexní Äíslo', + 'Float' => 'Desetinná Äárka', + 'Signed' => 'Záporné Äíslo', + 'Undefined' => 'Nedefinované', + 'Unsigned' => 'Kladné Äíslo', + }, + }, + 'SamplesPerPixel' => 'PoÄet složek', + 'Saturation' => { + Description => 'Saturace', + PrintConv => { + 'High' => 'Vysoká', + 'Low' => 'Nízká', + 'Normal' => 'Normální', + }, + }, + 'SceneCaptureType' => { + Description => 'Typ scény', + PrintConv => { + 'Landscape' => 'Krajina', + 'Night' => 'NoÄní foto', + 'Portrait' => 'Portrét', + }, + }, + 'SceneMode' => { + PrintConv => { + 'Aperture Priority' => 'Priorita clony', + 'Landscape' => 'Krajina', + 'Macro' => 'Makro', + 'Manual' => 'Manuální', + 'Normal' => 'Normální', + 'Portrait' => 'Portrét', + 'Shutter Priority' => 'Priorita Äasu', + 'Spot' => 'StÅ™edový bod', + 'Sunset' => 'Západ', + }, + }, + 'SceneModeUsed' => { + PrintConv => { + 'Aperture Priority' => 'Priorita clony', + 'Landscape' => 'Krajina', + 'Macro' => 'Makro', + 'Manual' => 'Manuální', + 'Portrait' => 'Portrét', + 'Shutter Priority' => 'Priorita Äasu', + }, + }, + 'SceneSelect' => { + PrintConv => { + 'Night' => 'NoÄní foto', + }, + }, + 'SceneType' => { + Description => 'Typ scény', + PrintConv => { + 'Directly photographed' => 'Přímo pořízený snímek', + }, + }, + 'SecurityClassification' => { + Description => 'BezpeÄnostní klasifikace', + PrintConv => { + 'Confidential' => 'DůvÄ›rný', + 'Restricted' => 'Vyhrazený', + 'Secret' => 'Tajný', + 'Top Secret' => 'Velmi tajný', + 'Unclassified' => 'NeurÄeno', + }, + }, + 'SelfTimerMode' => 'SamospouÅ¡Å¥', + 'SensingMethod' => { + Description => 'Metoda měření', + PrintConv => { + 'Color sequential area' => 'Barevný sekvenÄní ploÅ¡ný sensor', + 'Color sequential linear' => 'Barevný sekvenÄné-lineární senzor', + 'Monochrome area' => 'Monochromatický senzor', + 'Monochrome linear' => 'Monochromatický lineární senzor', + 'Not defined' => 'Nedefinovaný', + 'One-chip color area' => 'JednoÄipový barevný senzor', + 'Three-chip color area' => 'TříÄipový barevný senzor', + 'Trilinear' => 'Třílineární senzor', + 'Two-chip color area' => 'DvouÄipový barevný senzor', + }, + }, + 'SequentialShot' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'SerialNumber' => 'ID fotoaparátu', + 'SetButtonCrossKeysFunc' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'ShadingCompensation' => 'Kompenzace stínování', + 'Sharpness' => { + Description => 'DoostÅ™ení', + PrintConv => { + 'Hard' => 'Silné', + 'Normal' => 'Normální', + 'Soft' => 'Lehké', + }, + }, + 'SharpnessFrequency' => { + PrintConv => { + 'Low' => 'MénÄ›', + }, + }, + 'ShootingMode' => { + Description => 'Režim focení', + PrintConv => { + 'Aperture Priority' => 'Priorita clony', + 'Macro' => 'Makro', + 'Manual' => 'Manuální', + 'Normal' => 'Normální', + 'Portrait' => 'Portrét', + 'Shutter Priority' => 'Priorita Äasu', + 'Spot' => 'StÅ™edový bod', + }, + }, + 'ShutterMode' => { + PrintConv => { + 'Aperture Priority' => 'Priorita clony', + }, + }, + 'ShutterSpeed' => 'ExpoziÄní Äas', + 'ShutterSpeedValue' => 'ÄŒas závÄ›rky', + 'SlowShutter' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'Software' => 'Použitý software', + 'Source' => 'Zdroj', + 'SpatialFrequencyResponse' => 'Spatial frequency response', + 'SpecialEffectsOpticalFilter' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'SpectralSensitivity' => 'Spektrální citlivost', + 'State' => 'Stát', + 'StripByteCounts' => 'Bytů na komprimovanou Äást', + 'StripOffsets' => 'Pozice obrazových dat', + 'SubSecCreateDate' => 'Datum a Äas generování digitálních dat', + 'SubSecDateTimeOriginal' => 'Datum a Äas vzniku originálních dat', + 'SubSecModifyDate' => 'Datum a Äas zmÄ›ny souboru', + 'SubSecTime' => 'DateTime 1/100 sekundy', + 'SubSecTimeDigitized' => 'DateTimeDigitized 1/100 sekund', + 'SubSecTimeOriginal' => 'DateTimeOriginal 1/100 sekund', + 'SubfileType' => 'Nový typ podsekce', + 'Subject' => 'Popis', + 'SubjectArea' => 'Pozice hlavního objektu', + 'SubjectDistance' => 'Vzdálenost objektu', + 'SubjectDistanceRange' => { + Description => 'Rozsah vzdálenosti objektu', + PrintConv => { + 'Close' => 'Blízký', + 'Distant' => 'Vzdálený', + 'Macro' => 'Makro', + 'Unknown' => 'Neznámý', + }, + }, + 'SubjectLocation' => 'Pozice hlavního objektu', + 'SubjectProgram' => { + PrintConv => { + 'None' => 'Žádná', + 'Portrait' => 'Portrét', + }, + }, + 'Subsystem' => { + PrintConv => { + 'Unknown' => 'Neznámý', + }, + }, + 'SupplementalCategories' => 'Doplňkové kategorie', + 'T4Options' => 'Plné bity', + 'T6Options' => 'Volby T6', + 'TargetPrinter' => 'Cílová tiskárna', + 'Teleconverter' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'Thresholding' => 'Práh', + 'ThumbnailImage' => 'Náhled', + 'ThumbnailImageSize' => 'Velkost náhledu', + 'TileByteCounts' => 'PoÄet bytů prvku', + 'TileLength' => 'Délka prvku', + 'TileOffsets' => 'Offset prvku', + 'TileWidth' => 'Šířka prvku', + 'TimeScaleParamsQuality' => { + PrintConv => { + 'Low' => 'MénÄ›', + }, + }, + 'Title' => 'Název', + 'ToneCurve' => { + PrintConv => { + 'Manual' => 'Manuální', + }, + }, + 'ToningEffect' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'ToningEffectMonochrome' => { + PrintConv => { + 'None' => 'Žádná', + }, + }, + 'TransferFunction' => 'Transfer funkce', + 'Transformation' => { + PrintConv => { + 'Horizontal (normal)' => '0° (nahoru/vlevo)', + 'Mirror horizontal' => '0° (nahoru/vpravo)', + 'Mirror horizontal and rotate 270 CW' => '90° po smÄ›ru HR (vlevo/nahoru)', + 'Mirror horizontal and rotate 90 CW' => '90° ptoti smÄ›ru HR (vpravo/dolů)', + 'Mirror vertical' => '180° (dolů/vlevo)', + 'Rotate 180' => '180° (dolů/vpravo)', + 'Rotate 270 CW' => '90° po smÄ›ru HR (vlevo/dolů)', + 'Rotate 90 CW' => '90° ptoti smÄ›ru HR (vpravo/nahoru)', + }, + }, + 'TransmissionReference' => 'Reference pÅ™enosu', + 'Trapped' => { + PrintConv => { + 'Unknown' => 'Neznámý', + }, + }, + 'Urgency' => 'Naléhavost', + 'UserComment' => 'Komentář', + 'UserDef1PictureStyle' => { + PrintConv => { + 'Landscape' => 'Krajina', + 'Portrait' => 'Portrét', + }, + }, + 'UserDef2PictureStyle' => { + PrintConv => { + 'Landscape' => 'Krajina', + 'Portrait' => 'Portrét', + }, + }, + 'UserDef3PictureStyle' => { + PrintConv => { + 'Landscape' => 'Krajina', + 'Portrait' => 'Portrét', + }, + }, + 'VRDVersion' => 'VRD verze', + 'Version' => 'Verze', + 'VignetteControl' => { + PrintConv => { + 'Normal' => 'Normální', + }, + }, + 'WBAdjLighting' => { + PrintConv => { + 'Daylight (direct sunlight)' => 'Denní svÄ›tlo (0)', + 'Daylight (shade)' => 'Denní svÄ›tlo (1)', + 'Daylight (cloudy)' => 'Denní svÄ›tlo (2)', + 'Flash' => 'Blesk', + 'None' => 'Žádná', + }, + }, + 'WhiteBalance' => { + Description => 'Vyvážení bílé', + PrintConv => { + 'Auto' => 'Automatické vyvážení bílé', + 'Black & White' => 'ÄŒernobílé foto', + 'Cloudy' => 'Zataženo', + 'Cool White Fluorescent' => 'Chladná bílá fluorescentní', + 'Custom 1' => 'VLASTNÃ1', + 'Custom 2' => 'VLASTNÃ2', + 'Custom 3' => 'VLASTNÃ3', + 'Custom 4' => 'VLASTNÃ4', + 'Day White Fluorescent' => 'Denní zářivka', + 'Daylight' => 'Denní svÄ›tlo', + 'Daylight Fluorescent' => 'Denní svÄ›tlo', + 'Flash' => 'Blesk', + 'Fluorescent' => 'Žárovka', + 'Manual' => 'Manuální', + 'Shade' => 'Stíny', + 'Tungsten' => 'Zářivka', + 'Unknown' => 'Neznámý', + 'White Fluorescent' => 'Bílá zářivka', + }, + }, + 'WhiteBalanceAdj' => { + PrintConv => { + 'Cloudy' => 'Zataženo', + 'Daylight' => 'Denní svÄ›tlo', + 'Flash' => 'Blesk', + 'Fluorescent' => 'Žárovka', + 'Shade' => 'Stíny', + 'Tungsten' => 'Zářivka', + }, + }, + 'WhiteBalanceMode' => { + PrintConv => { + 'Unknown' => 'Neznámý', + }, + }, + 'WhiteBalanceSet' => { + PrintConv => { + 'Cloudy' => 'Zataženo', + 'Daylight' => 'Denní svÄ›tlo', + 'Daylight Fluorescent' => 'Denní svÄ›tlo', + 'Flash' => 'Blesk', + 'Manual' => 'Manuální', + 'Shade' => 'Stíny', + 'Tungsten' => 'Zářivka', + 'White Fluorescent' => 'Bílá zářivka', + }, + }, + 'WhitePoint' => 'ChromatiÄnost bílého bodu', + 'Writer-Editor' => 'Autor popisku', + 'XMP' => 'XMP metadata', + 'XPAuthor' => 'Autor', + 'XPComment' => 'Komentář', + 'XPKeywords' => 'KlíÄová slova', + 'XPSubject' => 'Popis', + 'XPTitle' => 'Název', + 'XPosition' => 'X-pozice', + 'XResolution' => 'RozliÅ¡ení obrázku na šířku', + 'YCbCrCoefficients' => 'Koeficienty transformaÄní YCbCr matrice', + 'YCbCrPositioning' => { + Description => 'Y a C pozice', + PrintConv => { + 'Centered' => 'Centrované', + 'Co-sited' => 'Po stranách', + }, + }, + 'YCbCrSubSampling' => 'Vzorkovací pomÄ›r Y k C', + 'YPosition' => 'Y-pozice', + 'YResolution' => 'RozliÅ¡ení obrázku na výšku', +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::cs.pm - ExifTool Czech language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke and Petr MichE<aacute>lek for providing this +translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/de.pm b/lib/Image/ExifTool/Lang/de.pm new file mode 100644 index 0000000..d5f89f9 --- /dev/null +++ b/lib/Image/ExifTool/Lang/de.pm @@ -0,0 +1,8720 @@ +#------------------------------------------------------------------------------ +# File: de.pm +# +# Description: ExifTool German language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::de; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.36'; + +%Image::ExifTool::Lang::de::Translate = ( + 'AEAperture' => 'AE-Blende', + 'AEBAutoCancel' => { + Description => 'Automatisches Bracketingende', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'AEBBracketValue' => 'AEB-Korrekturwert', + 'AEBSequence' => 'Bracketing-Sequenz', + 'AEBSequenceAutoCancel' => { + Description => 'WB-Sequenz/autom. Abschaltung', + PrintConv => { + '-,0,+/Disabled' => '-,0,+/Aus', + '-,0,+/Enabled' => '-,0,+/Ein', + '0,-,+/Disabled' => '0,-,+/Aus', + '0,-,+/Enabled' => '0,-,+/Ein', + }, + }, + 'AEBShotCount' => 'Anzahl Belichtungsreihenaufnahmen', + 'AEBXv' => 'AEB-Belichtungskorrektur', + 'AEExposureTime' => 'AE-Belichtungszeit', + 'AEExtra' => 'AE-Extra?', + 'AEFlags' => { + PrintConv => { + 'AE lock' => 'AE Speicherung', + 'Aperture wide open' => 'Offene Blende', + 'Flash recommended?' => 'Blitz erforderlich', + }, + }, + 'AEInfo' => 'Automatikbelichtungs-Informationen', + 'AELock' => { + Description => 'Belichtungsspeicher', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'AELockButton' => { + Description => 'AE-L/AF-L-Taste', + PrintConv => { + 'AE Lock (hold)' => 'Nur Belichtung (halten)', + 'AE Lock Only' => 'Nur Belichtung', + 'AE-L/AF Area' => 'Belichtung & Messfeld', + 'AE-L/AF-L/AF Area' => 'Bel. & Fokus & Messfeld', + 'AE/AF Lock' => 'Belichtung & Fokus', + 'AF Lock Only' => 'Nur Fokus', + 'AF-L/AF Area' => 'Fokus & Messfeld', + 'AF-ON' => 'AF-Aktivierung', + 'AF-ON/AF Area' => 'AF-Aktiv. & Messfeld', + 'FV Lock' => 'FV-Messwertspeicher', + 'Focus Area Selection' => 'AF-Messfeldauswahl', + }, + }, + 'AEMaxAperture' => 'Größte AE-Blende', + 'AEMaxAperture2' => 'Größte AE-Blende (2)', + 'AEMeteringMode' => { + Description => 'AE Belichtungs-Messmethode', + PrintConv => { + 'Center-weighted average' => 'Mittenbetont', + 'Multi-segment' => 'Multi-Segment', + }, + }, + 'AEMeteringSegments' => 'AE-Messfelder', + 'AEMicroadjustment' => { + Description => 'AE Feinabstimmung', + PrintConv => { + 'Disable' => 'Deaktiviert', + 'Enable' => 'Aktiviert', + }, + }, + 'AEMinAperture' => 'Kleinste AE-Blende', + 'AEMinExposureTime' => 'Kürzeste AE Belichtungszeit', + 'AEProgramMode' => { + Description => 'AE-Programm-Modus', + PrintConv => { + 'Av, B or X' => 'Av, B oder X', + 'Candlelight' => 'Kerzenlicht', + 'DOF Program' => 'Schärfentiefe-Priorität', + 'DOF Program (P-Shift)' => 'Schärfentiefe-Priorität (P Shift)', + 'Hi-speed Program' => 'HS-Priorität', + 'Hi-speed Program (P-Shift)' => 'HS-Priorität (P Shift)', + 'Kids' => 'Kinder', + 'Landscape' => 'Landschaft', + 'M, P or TAv' => 'M, P oder TAv', + 'MTF Program' => 'MTF-Priorität', + 'MTF Program (P-Shift)' => 'MTF-Priorität (P Shift)', + 'Macro' => 'Makro', + 'Night Scene' => 'Nachtszene', + 'Night Scene Portrait' => 'Nacht-Porträt', + 'No Flash' => 'Kein Blitz', + 'Pet' => 'Haustiere', + 'Portrait' => 'Porträt', + 'Sunset' => 'Sonnenuntergang', + 'Surf & Snow' => 'Surf & Schnee', + 'Sv or Green Mode' => 'Sv oder "Grünes" AE-Programm', + }, + }, + 'AESetting' => { + Description => 'AE-Einstellung', + PrintConv => { + 'AE Lock' => 'AE-Speicherung', + 'AE Lock + Exposure Comp.' => 'AE-Speicherung + Belichtungskorrektur', + 'Exposure Compensation' => 'Belichtungskorrektur', + 'No AE' => 'Kein AE', + }, + }, + 'AEXv' => 'AE-Belichtungskorrektur', + 'AE_ISO' => 'AE-ISO-Empfindlichkeit', + 'AF-CPrioritySelection' => { + Description => 'Priorität bei AF-C', + PrintConv => { + 'Focus' => 'Schärfepriorität', + 'Release' => 'Auslösepriorität', + 'Release + Focus' => 'Auslösepriorität & AF', + }, + }, + 'AF-OnForMB-D10' => { + Description => 'AF-ON-Taste (MB-D10)', + PrintConv => { + 'AE Lock (hold)' => 'Belichtung speichern ein/aus', + 'AE Lock (reset on release)' => 'Bel. speichern ein/aus (Reset)', + 'AE Lock Only' => 'Belichtung speichern', + 'AE/AF Lock' => 'Belichtung & Fokus speichern', + 'AF Lock Only' => 'Fokus speichern', + 'AF-On' => 'Autofokus aktiviert', + 'Same as FUNC Button' => 'Wie Funktionstaste', + }, + }, + 'AF-SPrioritySelection' => { + Description => 'Priorität bei AF-S (Einzel-AF)', + PrintConv => { + 'Focus' => 'Schärfepriorität', + 'Release' => 'Auslösepriorität', + }, + }, + 'AFActivation' => { + Description => 'AF-Aktivierung', + PrintConv => { + 'AF-On Only' => 'Nur AF-ON-Taste', + 'Shutter/AF-On' => 'AF-On-Taste & Auslöser', + }, + }, + 'AFAdjustment' => 'AF-Korrektur', + 'AFAndMeteringButtons' => { + Description => 'AF And Mess-Tasten', + PrintConv => { + 'AE lock' => 'AE Speicherung', + 'AF stop' => 'AE Stopp', + 'Metering + AF start' => 'Messung + AF Start', + 'Metering start' => 'Messung Start', + 'No function' => 'Keine Funktion', + }, + }, + 'AFAperture' => 'AF-Blende', + 'AFArea' => 'AF Bereich', + 'AFAreaHeight' => 'AF-Bereichshöhe', + 'AFAreaHeights' => 'AF-Bereichshöhe', + 'AFAreaIllumination' => { + Description => 'Messfeld-LED', + PrintConv => { + 'Auto' => 'Automatisch', + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'AFAreaMode' => { + Description => 'Messfeldsteuerung', + PrintConv => { + '1-area' => '1 Bereich', + '1-area (high speed)' => '1 Bereich (kurze Verschlußzeit)', + '23-area' => '23 Bereiche', + '3-area (center)?' => '3 Bereiche (mitte)', + '3-area (high speed)' => '3 Bereiche (kurze Verschlußzeit)', + '3-area (left)?' => '3 Bereiche (links)', + '3-area (right)?' => '3 Bereiche (rechts)', + '5-area' => '5 Bereiche', + '9-area' => '9 Bereiche', + 'AF Point Expansion' => 'AF Punkt-Erweiterung', + 'Auto (41 points)' => 'Automatisch (41 Punkte)', + 'Auto-area' => 'Autom. Messfeldgr.', + 'Center' => 'Mitte', + 'Contrast-detect' => 'Kontrasterkennung', + 'Contrast-detect (face priority)' => 'Kontrasterkennung (Gesichtserkennung)', + 'Contrast-detect (normal area)' => 'Kontrasterkennung (Standardbereich)', + 'Contrast-detect (subject tracking)' => 'Kontrasterkennung (Objektverfolgung)', + 'Contrast-detect (wide area)' => 'Kontrasterkennung (großer Bereich)', + 'Default' => 'Standard', + 'Dynamic Area' => 'Dynamisch', + 'Dynamic Area (21 points)' => 'Dynamischer Bereich (21 Punkte)', + 'Dynamic Area (3D-tracking)' => 'Dynamischer Bereich (3D-Nachführung)', + 'Dynamic Area (51 points)' => 'Dynamischer Bereich (51 Punkte)', + 'Dynamic Area (51 points, 3D-tracking)' => 'Dynamischer Bereich (51 Punkte, 3D-Nachführung)', + 'Dynamic Area (9 points)' => 'Dynamischer Bereich (9 Punkte)', + 'Dynamic Area (closest subject)' => 'Dynamic Messfeldgruppensteuerung (priorität der kürzesten Aufnahmedistanz)', + 'Dynamic Area (wide)' => 'Dynamische Messfeldsteuerung (groß)', + 'Dynamic Area (wide, 3D-tracking)' => 'Dynamischer Bereich (groß, 3D-Nachführung)', + 'Face + Tracking' => 'Gesichtserkennung + Nachführung', + 'Face Detect' => 'Gesichtserkennung', + 'Face Detect AF' => 'Gesichtserkennung AF', + 'Face Priority (41 points)' => 'Gesichtserkennung (41 Punkte)', + 'Face Tracking' => 'Gesichtserkennung', + 'Flexible' => 'Angepasst', + 'Flexible Spot' => 'Gesetzter Punkt', + 'Flexizone Multi' => 'Mehrpunkt-Bereich', + 'Flexizone Single' => 'Einpunkt-Bereich', + 'Group Dynamic' => 'Dynamische Messfeldgruppensteuerung', + 'Local' => 'Lokal', + 'Manual' => 'Manuell', + 'Multi' => 'Mehrpunkt', + 'Multi-point AF or AI AF' => 'Mehrpunkt AF oder AI AF', + 'Normal?' => 'Normal', + 'Off (Manual Focus)' => 'Aus (Manueller Fokus)', + 'Selective (for Miniature effect)' => 'Selektiv (für Vorschau-Effekt)', + 'Single (135 points)' => 'Einpunkt (135 Punkte)', + 'Single Area' => 'Einzelfeld', + 'Single Area (wide)' => 'Einzelfeldmessung (groß)', + 'Single-point AF' => 'Einpunkt AF', + 'Spot Focusing' => 'Spotfokussierung', + 'Spot Focusing 2' => 'Spotfokussierung 2', + 'Spot Mode Off' => 'Spot-Modus Aus', + 'Spot Mode On' => 'Spot-Modus Ein', + 'Subject Tracking (41 points)' => 'Objektverfolgung (41 Punkte)', + 'Touch' => 'Berührungspunkt', + 'Tracking' => 'Nachführung', + 'Wide' => 'Weit', + 'Zone' => 'Bereich', + 'Zone AF' => 'Zonen AF', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'AFAreaModeSetting' => { + Description => 'Messfeldsteuerung', + PrintConv => { + '3D-tracking (11 points)' => '3D Nachführung (11 Punkte)', + 'Auto-area' => 'Automatischer Bereich', + 'Center' => 'Mitte', + 'Closest Subject' => 'Nächstes Objekt', + 'Dynamic Area' => 'Dynamisch', + 'Flexible Spot' => 'Gesetzter Punkt', + 'Local' => 'Lokal', + 'Multi' => 'Mehrpunkt', + 'Single Area' => 'Einzelfeld', + 'Wide' => 'Weit', + 'Zone' => 'Bereich', + }, + }, + 'AFAreaWidth' => 'AF-Bereichsbreite', + 'AFAreaWidths' => 'AF-Bereichsbreite', + 'AFAreaXPosition' => 'AF-Bereich X Position', + 'AFAreaXPosition1' => 'AF-Bereich X Position 1', + 'AFAreaXPositions' => 'AF Bereich X Positionen', + 'AFAreaYPosition' => 'AF-Bereich Y Position', + 'AFAreaYPosition1' => 'AF-Bereich Y Position 1', + 'AFAreaYPositions' => 'AF Bereich Y Positionen', + 'AFAreas' => 'AF-Bereiche', + 'AFAssist' => { + Description => 'AF-Hilfslicht', + PrintConv => { + 'Does not emit/Fires' => 'Kein Messlicht/Zündung', + 'Emits/Does not fire' => 'Messlicht/keine Zündung', + 'Emits/Fires' => 'Messlicht/Zündung', + 'Off' => 'Aus', + 'On' => 'Ein', + 'Only ext. flash emits/Fires' => 'Nur ext. Messl./Zündung', + }, + }, + 'AFAssistBeam' => { + Description => 'AF-Hilfslicht Aussendung', + PrintConv => { + 'Does not emit' => 'Deaktiv', + 'Emits' => 'Aktiv', + 'Only ext. flash emits' => 'Nur bei ext. Blitz aktiv', + }, + }, + 'AFAssistLamp' => { + Description => 'AF Hilfslicht', + PrintConv => { + 'Disabled and Not Required' => 'Nicht eingestellt, war nicht nötig', + 'Disabled but Required' => 'Nicht eingestellt, war aber nötig', + 'Enabled but Not Used' => 'Eingestellt, aber nicht verwendet', + 'Fired' => 'Blitz wurde ausgelöst', + }, + }, + 'AFDefocus' => 'AF-Defocus', + 'AFDuringLiveView' => { + Description => 'AF bei Live View-Aufnahmen', + PrintConv => { + 'Disable' => 'Inaktiv', + 'Enable' => 'Aktiv', + 'Live mode' => 'LiveModus', + 'Quick mode' => 'QuickModus', + }, + }, + 'AFFineTune' => { + Description => 'AF-Feinabstimmung', + PrintConv => { + 'Off' => 'Aus', + 'On (1)' => 'Ein (1)', + 'On (2)' => 'Ein (2)', + }, + }, + 'AFFineTuneAdj' => 'AF-Feinabstimmung', + 'AFIlluminator' => { + PrintConv => { + 'Off' => 'Aus', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'AFImageHeight' => 'AF-Bildhöhe', + 'AFImageWidth' => 'AF-Bildbreite', + 'AFInFocus' => 'AF in Fokus', + 'AFInfo' => 'AF-Modus', + 'AFInfo2' => 'AF-Informationen', + 'AFInfo2Version' => 'AF-Info-Version', + 'AFIntegrationTime' => 'AF-Messzeit', + 'AFMicroAdj' => 'AF Feinabstimmung', + 'AFMicroAdjMode' => { + Description => 'AF Feinabstimmung Modus', + PrintConv => { + 'Adjust all by the same amount' => 'Korrektur immer um gleichen Wert', + 'Adjust by lens' => 'Korrektur objektivabhängig', + 'Disable' => 'Deaktiviert', + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'AFMicroAdjRegisteredLenses' => 'AF Feinabstimmung bekannte Objektive', + 'AFMicroAdjValue' => 'AF Feinabstimmung Wert', + 'AFMicroadjustment' => { + Description => 'AF Feinabstimmung', + PrintConv => { + 'Adjust all by same amount' => 'Alle auf gleichen Wert', + 'Adjust by lens' => 'Abstimmung pro Objektiv', + 'Disable' => 'Deaktivieren', + }, + }, + 'AFMode' => { + Description => 'AF-Modus', + PrintConv => { + 'Face Detection' => 'Gesichtserkennung', + 'Off' => 'Aus', + 'Tracking' => 'Nachführung', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'AFOnAELockButtonSwitch' => { + Description => 'AF-ON/AELocktaste- Schalter', + PrintConv => { + 'Disable' => 'Deaktiviert', + 'Enable' => 'Aktiviert', + }, + }, + 'AFPoint' => { + Description => 'Gewählter AF-Punkt', + PrintConv => { + '(none)' => '(keiner)', + 'Auto AF point selection' => 'Automatische Wahl des AF-Punktes', + 'Bottom' => 'Unten', + 'Bottom (horizontal)' => 'Unten (horizontal)', + 'Bottom (vertical)' => 'Unten (vertikal)', + 'Bottom Center' => 'Unten Mitte', + 'Bottom Left' => 'Unten Links', + 'Bottom Right' => 'Unten Rechts', + 'Bottom-center (horizontal)' => 'Unten Mitte (horizontal)', + 'Bottom-center (vertical)' => 'Unten Mitte (vertikal)', + 'Bottom-left' => 'Unten Links', + 'Bottom-left (horizontal)' => 'Unten Links (horizontal)', + 'Bottom-left (vertical)' => 'Unten Links (vertikal)', + 'Bottom-right' => 'Unten Rechts', + 'Bottom-right (horizontal)' => 'Unten Rechts (horizontal)', + 'Bottom-right (vertical)' => 'Unten Rechts (vertikal)', + 'Center' => 'Mitte', + 'Center (horizontal)' => 'Mitte (horizontal)', + 'Center (vertical)' => 'Mitte (vertikal)', + 'Center Left' => 'Mitte Links', + 'Center Right' => 'Mitte Rechts', + 'Face Detect' => 'Gesichtserkennung', + 'Far Left' => 'Weit links', + 'Far Left (horizontal)' => 'Weit links (horizontal)', + 'Far Left (vertical)' => 'Weit links (vertikal)', + 'Far Left/Right of Center' => 'Weit Links/Rechts der Mitte', + 'Far Left/Right of Center/Bottom' => 'Weit Links/Rechts der Mitte/Unten', + 'Far Right' => 'Weit rechts', + 'Far Right (horizontal)' => 'Weit rechts (horizontal)', + 'Far Right (vertical)' => 'Weit rechts (vertikal)', + 'Left' => 'Links', + 'Left (horizontal)' => 'Links (horizontal)', + 'Left (or n/a)' => 'Links (oder Nicht gesetzt)', + 'Left (vertical)' => 'Links (vertikal)', + 'Lower Far Left' => 'Unten ganz links', + 'Lower Far Right' => 'Unten ganz rechts', + 'Lower-left' => 'Links unten', + 'Lower-left (horizontal)' => 'Links unten (horizontal)', + 'Lower-left (vertical)' => 'Links unten (vertikal)', + 'Lower-middle' => 'Untere Mitte', + 'Lower-right' => 'Rechts unten', + 'Lower-right (horizontal)' => 'Rechts unten (horizontal)', + 'Lower-right (vertical)' => 'Unten rechts (vertikal)', + 'Manual AF point selection' => 'Manuell gewählter AF-Punkt', + 'Mid-left' => 'Links mitte', + 'Mid-left (horizontal)' => 'Links mitte (horizontal)', + 'Mid-left (vertical)' => 'Links mitte (vertikal)', + 'Mid-right' => 'Rechts mitte', + 'Mid-right (horizontal)' => 'Rechts mitte (horizontal)', + 'Mid-right (vertical)' => 'Rechts mitte (vertikal)', + 'Near Left' => 'Nahe Links', + 'Near Left/Right of Center' => 'Nahe Links/Rechts der Mitte', + 'Near Right' => 'Nahe Rechts', + 'Near Upper/Left' => 'Nahe Links oben', + 'None' => 'Keiner', + 'None (MF)' => 'Keiner (MF)', + 'Right' => 'Rechts', + 'Right (horizontal)' => 'Rechts (horizontal)', + 'Right (vertical)' => 'Rechts (vertikal)', + 'Top' => 'Oben', + 'Top (horizontal)' => 'Oben (horizontal)', + 'Top (vertical)' => 'Oben (vertikal)', + 'Top Center' => 'Oben Mitte', + 'Top Left' => 'Oben Links', + 'Top Near-left' => 'Oben nahe-Links', + 'Top Near-right' => 'Nahe Rechts-oben', + 'Top Right' => 'Oben Rechts', + 'Top-center (horizontal)' => 'Oben Mitte (horizontal)', + 'Top-center (vertical)' => 'Oben Mitte (vertikal)', + 'Top-left' => 'Oben Links', + 'Top-left (horizontal)' => 'Oben Links (horizontal)', + 'Top-left (vertical)' => 'Oben Links (vertikal)', + 'Top-right' => 'Oben Rechts', + 'Top-right (horizontal)' => 'Oben Rechts (horizontal)', + 'Top-right (vertical)' => 'Oben Rechts (vertikal)', + 'Upper Far Left' => 'Oben ganz links', + 'Upper Far Right' => 'Oben ganz rechts', + 'Upper Left' => 'Links oben', + 'Upper Right' => 'Rechts oben', + 'Upper-left' => 'Links oben', + 'Upper-left (horizontal)' => 'Links oben (horizontal)', + 'Upper-left (vertical)' => 'Links oben (vertikal)', + 'Upper-middle' => 'Obere Mitte', + 'Upper-right' => 'Rechts oben', + 'Upper-right (horizontal)' => 'Rechts oben (horizontal)', + 'Upper-right (vertical)' => 'Oben rechts (vertikal)', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'AFPointActivationArea' => { + Description => 'AF-Messfeld-Aktivierungsbereich', + PrintConv => { + 'Expanded' => 'Erweitert', + }, + }, + 'AFPointAreaExpansion' => { + Description => 'AF-Messbereich Ausweitung', + PrintConv => { + 'All 45 points area' => 'Alle 45 Punkte', + 'Disable' => 'Aus', + 'Enable' => 'Ein', + 'Left/right AF points' => 'Möglich (linkes/rechtes zusätzliches AF-Messfeld)', + 'Surrounding AF points' => 'Möglich (entsprechendes zusätzliches AF-Messfeld)', + }, + }, + 'AFPointAtShutterRelease' => { + Description => 'AF-Punkt beim Auslösen', + PrintConv => { + '(out of focus)' => '(ausserhalb Fokus)', + 'Bottom (horizontal)' => 'Unten (horizontal)', + 'Bottom (vertical)' => 'Unten (vertikal)', + 'Center (horizontal)' => 'Mitte (horizontal)', + 'Center (vertical)' => 'Mitte (vertikal)', + 'Far Left' => 'Weit links', + 'Far Left (horizontal)' => 'Weit links (horizontal)', + 'Far Left (vertical)' => 'Weit links (vertikal)', + 'Far Right' => 'Weit rechts', + 'Far Right (horizontal)' => 'Weit rechts (horizontal)', + 'Far Right (vertical)' => 'Weit rechts (vertikal)', + 'Left' => 'Links', + 'Left (horizontal)' => 'Links (horizontal)', + 'Left (vertical)' => 'Links (vertikal)', + 'Lower Far Left' => 'Unten ganz links', + 'Lower Far Right' => 'Unten ganz rechts', + 'Lower-left' => 'Links unten', + 'Lower-left (horizontal)' => 'Links unten (horizontal)', + 'Lower-left (vertical)' => 'Links unten (vertikal)', + 'Lower-middle' => 'Unten mitte', + 'Lower-right' => 'Rechts unten', + 'Lower-right (horizontal)' => 'Rechts unten (horizontal)', + 'Lower-right (vertical)' => 'Rechts unten (vertikal)', + 'Near Left' => 'Nahe links', + 'Near Right' => 'Nahe rechts', + 'Right' => 'Rechts', + 'Right (horizontal)' => 'Rechts (horizontal)', + 'Right (vertical)' => 'Rechts (vertikal)', + 'Top (horizontal)' => 'Oben (horizontal)', + 'Top (vertical)' => 'Oben (vertikal)', + 'Upper Far Left' => 'Oben ganz links', + 'Upper Far Right' => 'Oben ganz rechts', + 'Upper-left' => 'Links oben', + 'Upper-left (horizontal)' => 'Links oben (horizontal)', + 'Upper-left (vertical)' => 'Links oben (vertikal)', + 'Upper-middle' => 'Oben mitte', + 'Upper-right' => 'Rechts oben', + 'Upper-right (horizontal)' => 'Rechts oben (horizontal)', + 'Upper-right (vertical)' => 'Rechts oben (vertikal)', + }, + }, + 'AFPointAutoSelection' => { + Description => 'Automatische AF-Feldwahl', + PrintConv => { + 'Control-direct:disable/Main:disable' => 'Schnelleinstellrad-Direkt:nicht möglich/Haupt-Wahlrad:nein', + 'Control-direct:disable/Main:enable' => 'Schnelleinstellrad-Direkt:nicht möglich/Haupt-Wahlrad:möglich', + 'Control-direct:enable/Main:enable' => 'Schnelleinstellrad-Direkt:möglich/Haupt-Wahlrad:möglich', + }, + }, + 'AFPointBrightness' => { + Description => 'AF-Feld Helligkeit', + PrintConv => { + 'Brighter' => 'Heller', + 'Extra High' => 'Extra Hoch', + 'High' => 'Hoch', + 'Low' => 'Niedrig', + }, + }, + 'AFPointDisplayDuringFocus' => { + Description => 'AF-Feld Anzeige während Fokus', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + 'On (when focus achieved)' => 'Ein (nach Scharfeinstellung)', + }, + }, + 'AFPointIllumination' => { + Description => 'Messfeld-LED', + PrintConv => { + 'Auto' => 'Automatisch', + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'AFPointInFocus' => { + Description => 'AF-Punkt im Fokus', + PrintConv => { + '(none)' => '(keiner)', + 'Bottom (horizontal)' => 'Unten (horizontal)', + 'Bottom (vertical)' => 'Unten (vertikal)', + 'Center (horizontal)' => 'Mitte (horizontal)', + 'Center (vertical)' => 'Mitte (vertikal)', + 'Far Left' => 'Weit links', + 'Far Left (horizontal)' => 'Weit links(horizontal)', + 'Far Left (vertical)' => 'Weit links (vertikal)', + 'Far Right' => 'Weit rechts', + 'Far Right (horizontal)' => 'Weit rechts (horizontal)', + 'Far Right (vertical)' => 'Weit rechts (vertikal)', + 'Left' => 'Links', + 'Left (horizontal)' => 'Links (horizontal)', + 'Left (vertical)' => 'Links (vertikal)', + 'Lower Far Left' => 'Unten ganz Links', + 'Lower Far Right' => 'Unten ganz rechts', + 'Lower-left' => 'Links unten', + 'Lower-left (horizontal)' => 'Links unten (horizontal)', + 'Lower-left (vertical)' => 'Links unten (vertikal)', + 'Lower-middle' => 'Unten mitte', + 'Lower-right' => 'Rechts unten', + 'Lower-right (horizontal)' => 'Rechts unten (horizontal)', + 'Lower-right (vertical)' => 'Rechts unten (vertikal)', + 'Near Left' => 'Nahe links', + 'Near Right' => 'Nahe rechts', + 'Right' => 'Rechts', + 'Right (horizontal)' => 'Rechts (horizontal)', + 'Right (vertical)' => 'Rechts (vertikal)', + 'Top (horizontal)' => 'Oben (horizontal)', + 'Top (vertical)' => 'Oben (vertikal)', + 'Upper Far Left' => 'Oben ganz links', + 'Upper Far Right' => 'Oben ganz rechts', + 'Upper-left' => 'Links oben', + 'Upper-left (horizontal)' => 'Links oben (horizontal)', + 'Upper-left (vertical)' => 'Links oben (vertikal)', + 'Upper-middle' => 'Oben mitte', + 'Upper-right' => 'Rechts oben', + 'Upper-right (horizontal)' => 'Rechts oben (horizontal)', + 'Upper-right (vertical)' => 'Rechts oben (vertikal)', + }, + }, + 'AFPointMode' => { + Description => 'AF-Punkt-Modus', + PrintConv => { + 'Auto' => 'Automatisch', + }, + }, + 'AFPointPosition' => 'AF-Punkt Position', + 'AFPointRegistration' => { + Description => 'AF-Feld Speicherung', + PrintConv => { + 'Automatic' => 'Automatisch', + 'Bottom' => 'Unten', + 'Center' => 'Mitte', + 'Extreme Left' => 'Ganz links', + 'Extreme Right' => 'Ganz rechts', + 'Left' => 'Links', + 'Right' => 'Rechts', + 'Top' => 'Oben', + }, + }, + 'AFPointSelected' => { + Description => 'AF gewählter Punkt', + PrintConv => { + 'Auto' => 'Automatisch', + 'Automatic Tracking AF' => 'Nachführ AF', + 'Bottom' => 'Unten', + 'Bottom-left' => 'Unten-links', + 'Bottom-right' => 'Unten-rechts', + 'Center' => 'Mitte', + 'Face Detect AF' => 'Gesichtserkennungs-AF', + 'Far Left' => 'Weit links', + 'Far Right' => 'Weit rechts', + 'Fixed Center' => 'Auf Mitte fixiert', + 'Left' => 'Links', + 'Lower Far Left' => 'Unten weit Links', + 'Lower Far Right' => 'Unten weit Rechts', + 'Lower-left' => 'Links unten', + 'Lower-middle' => 'Untere Mitte', + 'Lower-right' => 'Rechts unten', + 'Mid-left' => 'Links mitte', + 'Mid-right' => 'Rechts mitte', + 'Near Left' => 'Nahe Links', + 'Near Right' => 'Nahe Rechts', + 'Right' => 'Rechts', + 'Top' => 'Oben', + 'Top-left' => 'Oben-links', + 'Top-right' => 'Oben-rechts', + 'Upper Far Left' => 'Oben weit Links', + 'Upper Far Right' => 'Oben weit Rechts', + 'Upper-left' => 'Links oben', + 'Upper-middle' => 'Obere Mitte', + 'Upper-right' => 'Rechts oben', + }, + }, + 'AFPointSelected2' => { + Description => 'AF gewählter Punkt 2', + PrintConv => { + 'Auto' => 'Automatisch', + 'Bottom' => 'Unten', + 'Center' => 'Mitte', + 'Left' => 'Links', + 'Lower-left' => 'Links unten', + 'Lower-right' => 'Rechts unten', + 'Mid-left' => 'Links mitte', + 'Mid-right' => 'Rechts mitte', + 'Right' => 'Rechts', + 'Top' => 'Oben', + 'Upper-left' => 'Links oben', + 'Upper-right' => 'Rechts oben', + }, + }, + 'AFPointSelection' => { + Description => 'AF-Messfeldauswahl', + PrintConv => { + '11 Points' => '11 Messfelder', + '51 Points' => '51 Messfelder (3D-Tracking)', + }, + }, + 'AFPointSelectionMethod' => { + Description => 'Wahlmethode für AF-Messfeld', + PrintConv => { + 'Multi-controller direct' => 'Multicontroller', + 'Quick Control Dial direct' => 'Schnelleinstellrad', + }, + }, + 'AFPointSet' => { + Description => 'AF-Punkt Einstellung', + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'AFPointSpotMetering' => 'Anzahl AF-Messff./Spotmsg.', + 'AFPoints' => 'AF-Punkte', + 'AFPointsInFocus' => { + Description => 'AF-Punkte im Fokus', + PrintConv => { + '(none)' => '(Keine)', + 'All' => 'Alle', + 'All 11 Points' => 'Alle 11 Punkte', + 'Bottom' => 'Unten', + 'Bottom, Center' => 'Unten, Mitte', + 'Bottom-center' => 'Unten-mitte', + 'Bottom-left' => 'Unten-links', + 'Bottom-right' => 'Unten-rechts', + 'Center' => 'Mitte', + 'Center (horizontal)' => 'Mitte (horizontal)', + 'Center (vertical)' => 'Mitte (vertikal)', + 'Center+Right' => 'Mitte Rechts', + 'Far Left' => 'Weit links', + 'Far Right' => 'Weit rechts', + 'Fixed Center or Multiple' => 'Auf Mitte fixiert oder mehrere', + 'Left' => 'Links', + 'Left+Center' => 'Links Mitte', + 'Left+Right' => 'Links Rechts', + 'Lower-left' => 'Links unten', + 'Lower-left, Bottom' => 'Links unten, Unten', + 'Lower-left, Mid-left' => 'Links unten, Links mitte', + 'Lower-right' => 'Rechts unten', + 'Lower-right, Bottom' => 'Rechts unten, Unten', + 'Lower-right, Mid-right' => 'Rechts unten, Rechts mitte', + 'Mid-left' => 'Links mitte', + 'Mid-left, Center' => 'Links mitte, Mitte', + 'Mid-right' => 'Rechts mitte', + 'Mid-right, Center' => 'Rechts mitte, Mitte', + 'None' => 'Keiner', + 'None (MF)' => 'Keiner (MF)', + 'Right' => 'Rechts', + 'Top' => 'Oben', + 'Top, Center' => 'Oben, Mitte', + 'Top-center' => 'Oben-Mitte', + 'Top-left' => 'Oben-links', + 'Top-right' => 'Oben-rechts', + 'Upper-left' => 'Links oben', + 'Upper-left, Mid-left' => 'Links oben, Links mitte', + 'Upper-left, Top' => 'Links oben, Oben', + 'Upper-right' => 'Rechts oben', + 'Upper-right, Mid-right' => 'Rechts oben, Rechts mitte', + 'Upper-right, Top' => 'Rechts oben, Oben', + }, + }, + 'AFPointsInFocus1D' => 'AF-Punkte im Fokus 1D', + 'AFPointsInFocus5D' => { + Description => 'AF-Punkte im Fokus', + PrintConv => { + 'Bottom' => 'Unten', + 'Center' => 'Mitte', + 'Left' => 'Links', + 'Lower-left' => 'Unten links', + 'Lower-right' => 'Rechts unten', + 'Right' => 'Rechts', + 'Top' => 'Oben', + 'Upper-left' => 'Links oben', + 'Upper-right' => 'Rechts oben', + }, + }, + 'AFPointsSelected' => 'AF gewählte Punkte', + 'AFPointsUnknown1' => { + Description => 'AF-Punkte Unbekannt 1', + PrintConv => { + 'All' => 'Alle', + 'Bottom' => 'Unten', + 'Center' => 'Mitte', + 'Central 9 points' => 'Alle mittleren 9 Punkte', + 'Left' => 'Links', + 'Lower-left' => 'Links unten', + 'Lower-right' => 'Rechts unten', + 'Mid-left' => 'Links mitte', + 'Mid-right' => 'Rechts mitte', + 'Right' => 'Rechts', + 'Top' => 'Oben', + 'Upper-left' => 'Links oben', + 'Upper-right' => 'Rechts oben', + }, + }, + 'AFPointsUnknown2' => { + Description => 'AF-Punkte Unbekannt 2?', + PrintConv => { + 'Auto' => 'Automatisch', + 'Bottom' => 'Unten', + 'Center' => 'Mitte', + 'Left' => 'Links', + 'Lower-left' => 'Links unten', + 'Lower-right' => 'Rechts unten', + 'Mid-left' => 'Links mitte', + 'Mid-right' => 'Rechts mitte', + 'Right' => 'Rechts', + 'Top' => 'Oben', + 'Upper-left' => 'Links oben', + 'Upper-right' => 'Rechts oben', + }, + }, + 'AFPointsUsed' => { + Description => 'Verwendete AF-Punkte', + PrintConv => { + 'All 11 Points' => 'Alle 11 Punkte', + 'Bottom' => 'Unten', + 'Center' => 'Mitte', + 'Far Left' => 'Weit links', + 'Far Right' => 'Weit rechts', + 'Lower-left' => 'Links unten', + 'Lower-right' => 'Rechts unten', + 'Mid-left' => 'Links mitte', + 'Mid-right' => 'Rechts mitte', + 'Top' => 'Oben', + 'Upper-left' => 'Links oben', + 'Upper-right' => 'Rechts oben', + }, + }, + 'AFPredictor' => 'AF-Prädiktor', + 'AFResponse' => 'Verwendeter AF', + 'AFSearch' => { + Description => 'AF Fokussierung', + PrintConv => { + 'Not Ready' => 'Nicht bereit', + 'Ready' => 'Bereit', + }, + }, + 'AFSensorActive' => { + Description => 'Aktiver AF Sensor', + PrintConv => { + 'Bottom' => 'Unten', + 'Bottom-left' => 'Unten Links', + 'Bottom-right' => 'Unten Rechts', + 'Center Vertical' => 'Mitte vertikal', + 'Middle Horizontal' => 'Mitte horizontal', + 'Top' => 'Oben', + 'Top-left' => 'Oben Links', + 'Top-right' => 'Rechts Oben', + }, + }, + 'AFStatusActiveSensor' => { + Description => 'Status aktiver AF Sensor', + PrintConv => { + 'In Focus' => 'Im Fokus', + 'Out of Focus' => 'Nicht im Fokus', + }, + }, + 'AFStatusBottom' => { + Description => 'AF Status Unten', + PrintConv => { + 'In Focus' => 'Im Fokus', + 'Out of Focus' => 'Nicht im Fokus', + }, + }, + 'AFStatusBottom-left' => { + Description => 'AF Status Unten Links', + PrintConv => { + 'In Focus' => 'Im Fokus', + 'Out of Focus' => 'Nicht im Fokus', + }, + }, + 'AFStatusBottom-right' => { + Description => 'AF Status Unten Rechts', + PrintConv => { + 'In Focus' => 'Im Fokus', + 'Out of Focus' => 'Nicht im Fokus', + }, + }, + 'AFStatusCenterHorizontal' => { + Description => 'AF Status Mitte horizontal', + PrintConv => { + 'In Focus' => 'Im Fokus', + 'Out of Focus' => 'Nicht im Fokus', + }, + }, + 'AFStatusCenterVertical' => { + Description => 'AF Status Mitte vertikal', + PrintConv => { + 'In Focus' => 'Im Fokus', + 'Out of Focus' => 'Nicht im Fokus', + }, + }, + 'AFStatusLeft' => { + Description => 'AF Status Links', + PrintConv => { + 'In Focus' => 'Im Fokus', + 'Out of Focus' => 'Nicht im Fokus', + }, + }, + 'AFStatusMiddleHorizontal' => { + Description => 'AF Status Mitte horizontal', + PrintConv => { + 'In Focus' => 'Im Fokus', + 'Out of Focus' => 'Nicht im Fokus', + }, + }, + 'AFStatusRight' => { + Description => 'AF Status Rechts', + PrintConv => { + 'In Focus' => 'Im Fokus', + 'Out of Focus' => 'Nicht im Fokus', + }, + }, + 'AFStatusTop' => { + Description => 'AF Status Oben', + PrintConv => { + 'In Focus' => 'Im Fokus', + 'Out of Focus' => 'Nicht im Fokus', + }, + }, + 'AFStatusTop-left' => { + Description => 'AF Status Oben Links', + PrintConv => { + 'In Focus' => 'Im Fokus', + 'Out of Focus' => 'Nicht im Fokus', + }, + }, + 'AFStatusTop-right' => { + Description => 'AF Status Oben Rechts', + PrintConv => { + 'In Focus' => 'Im Fokus', + 'Out of Focus' => 'Nicht im Fokus', + }, + }, + 'AFType' => { + Description => 'AF-Typ', + PrintConv => { + '15-point' => '15 Punkte', + '19-point' => '19 Punkte', + }, + }, + 'AIServoContinuousShooting' => 'Auslösepriorität', + 'AIServoImagePriority' => { + Description => 'AI Servo Priorität 1./2. Bild', + PrintConv => { + '1: AF, 2: Drive speed' => 'AF-Priorität/Transportgeschwindigkeit', + '1: AF, 2: Tracking' => 'AF-Priorität/Nachführpriorität', + '1: Release, 2: Drive speed' => 'Auslösung/Transportgeschwindigkeit', + '1: Release, 2: Tracking' => '1: Auslösung, 2: Nachführung', + }, + }, + 'AIServoTrackingMethod' => { + Description => 'AI Servo AF Nachführung', + PrintConv => { + 'Continuous AF track priority' => 'AF Nachführ-Priorität', + 'Main focus point priority' => 'Hauptfokussierungsfeld', + }, + }, + 'AIServoTrackingSensitivity' => { + Description => 'AI Servo Empfindlichkeit', + PrintConv => { + 'Fast' => 'Schnell', + 'Medium Fast' => 'Mittel-Schnell', + 'Medium Slow' => 'Mittel', + 'Slow' => 'Langsam', + }, + }, + 'APEVersion' => 'APE-Version', + 'ARMVersion' => 'ARM-Version', + 'AccessDate' => 'Zugriffsdatum', + 'AccessoryType' => 'Zubehör-Typ', + 'ActionAdvised' => 'Aktion empfohlen', + 'ActiveArea' => 'Aktiver Bereich', + 'ActiveD-Lighting' => { + Description => 'Aktives D-Lighting', + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Leicht', + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ActiveD-LightingMode' => { + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Leicht', + 'Off' => 'Aus', + }, + }, + 'AddAspectRatioInfo' => { + Description => 'Seitenverhältnisinfo zufügen', + PrintConv => { + 'Off' => 'Aus', + }, + }, + 'AddOriginalDecisionData' => { + Description => 'Originaldaten zufügen', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Address' => 'Adresse', + 'AdjustmentMode' => 'Korrekturmodus', + 'AdultContentWarning' => { + PrintConv => { + 'Unknown' => 'Unbekannt', + }, + }, + 'AdvancedRaw' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'AdvancedSceneMode' => { + Description => 'Erweiteter Szenenmodus', + PrintConv => { + 'Off' => 'Aus', + 'Creative Macro' => 'Makro kreativ', + 'Flower' => 'Blumen', + 'HDR B&W' => 'HDR Schwarz-Weiß', + 'High Key' => 'High-Key', + 'Indoor Sports' => 'Hallensport', + 'Low Key' => 'Low-Key', + 'Outdoor Sports' => 'Freiluftsport', + }, + }, + 'AdvancedSceneType' => 'Erweiterter Szenentyp', + 'AlphaByteCount' => 'Anzahl Bytes der Alpha-Kanal-Daten', + 'AlphaChannelsNames' => 'Alpha-Kanal-Namen', + 'AlphaDataDiscard' => { + Description => 'Verworfene Alpha-Kanal-Daten', + PrintConv => { + 'Flexbits Discarded' => 'FlexBits verworfen', + 'Full Resolution' => 'Volle Auflösung', + 'HighPass Frequency Data Discarded' => 'Hochpass-Frequenz-Daten verworfen', + 'Highpass and LowPass Frequency Data Discarded' => 'Hochpass- und Tiefpass-Frequenz-Daten verworfen', + }, + }, + 'AlphaOffset' => 'Alpha-Kanal-Datenposition', + 'AlreadyApplied' => 'Bereits zugewiesen', + 'AnalogBalance' => 'Analog-Balance', + 'Annotation' => 'Anmerkung', + 'Annotations' => 'Anmerkungen', + 'Anti-Blur' => { + Description => 'Verwacklungsschutz', + PrintConv => { + 'Off' => 'Aus', + 'On (Continuous)' => 'Ein (Kontinuierlich)', + 'On (Shooting)' => 'Ein (Aufnahme)', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'AntiAliasStrength' => 'Anti-Aliasing Stärke', + 'Aperture' => 'Blende', + 'ApertureDisplayed' => 'Angezeigte Blende', + 'ApertureRange' => { + Description => 'Einstellung Verschlusszeitenbereich', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'ApertureRingUse' => { + Description => 'Blendenring-Verwendung', + PrintConv => { + 'Permitted' => 'Erlaubt', + 'Prohibited' => 'Nicht erlaubt', + }, + }, + 'ApertureSetting' => 'Blendeneinstellung', + 'ApertureValue' => 'Blende', + 'ApplicationRecordVersion' => 'IPTC-Modell-2-Version', + 'ApplyShootingMeteringMode' => { + Description => 'Angewandter Belichtungs-/Messmodus', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'ApproximateFNumber' => 'F-Wert angenähert', + 'ApproximateFocusDistance' => 'Fokus-Distanz angenähert', + 'ArtFilter' => { + Description => 'Kunst Filter', + PrintConv => { + 'Drawing' => 'Zeichnung', + 'Fish Eye' => 'Fischauge', + 'Off' => 'Aus', + 'Reflection' => 'Reflektierung', + 'Soft Focus' => 'Weichzeichner', + 'Soft Focus 2' => 'Weichzeichner 2', + 'Sparkle' => 'Perleffekt', + 'Watercolor' => 'Wasserfarbe', + 'Watercolor II' => 'Wasserfarbe II', + }, + }, + 'ArtFilterEffect' => { + Description => 'Filtereffekt Kunst', + PrintConv => { + 'B&W' => 'Schwarz/Weiß', + 'Drawing' => 'Zeichnung', + 'Fish Eye' => 'Fischauge', + 'No Effect' => 'Ohne Effekt', + 'Off' => 'Aus', + 'Reflection' => 'Reflektierung', + 'Soft Focus' => 'Weichzeichner', + 'Soft Focus 2' => 'Weichzeichner 2', + 'Sparkle' => 'Perleffekt', + 'Watercolor' => 'Wasserfarbe', + 'Watercolor II' => 'Wasserfarbe II', + }, + }, + 'ArtMode' => { + PrintConv => { + 'Silent Movie' => 'Stillleben', + }, + }, + 'Artist' => 'Künstler', + 'ArtworkCreator' => 'Artwork Ersteller', + 'AsShotICCProfile' => 'Aufnahme Farbprofil', + 'AsShotNeutral' => 'Aufnahme Neutral', + 'AsShotPreProfileMatrix' => 'Aufnahme Pre Profil Matrix', + 'AsShotProfileName' => 'Aufnahme Pre Profilname', + 'AsShotWhiteXY' => 'Aufnahme Weiß XY', + 'AspectRatio' => 'Bildformat', + 'AssignBktButton' => { + Description => 'Zugeordnete Belichtungsreihen-Taste', + PrintConv => { + 'Auto Bracketing' => 'Automatische Belichtungsreihe', + 'Multiple Exposure' => 'Mehrfachbelichtung', + }, + }, + 'AssignFuncButton' => { + Description => 'FUNC.-Taste zuordnen', + PrintConv => { + 'Exposure comp./AEB setting' => 'Belichtungskorrektur/AEB-Einstellung', + 'Image jump with main dial' => 'Bildsprung mit Haupt-Wahlrad', + 'Image quality' => 'Qualität ändern', + 'LCD brightness' => 'LCD-Helligkeit', + 'Live view function settings' => 'Livebild Funktionseinstellung', + }, + }, + 'AssistButtonFunction' => { + Description => 'Funktion Assist-Taste', + PrintConv => { + 'Av+/- (AF point by QCD)' => 'Av+/- (AF-Feld mit Daumenrad)', + 'FE lock' => 'FE Blitzmesswertspeicherung', + 'Select HP (while pressing)' => 'Ausw.G.pos.(Ass-Taste gedr.)', + 'Select Home Position' => 'Auswahl Grundposition', + }, + }, + 'Audio' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'AudioCodecID' => { + PrintConv => { + 'Unknown -' => 'Unbekannt -', + }, + }, + 'AudioDuration' => 'Audiodauer', + 'AudioOutcue' => 'Audio-Outcue', + 'AudioSamplingRate' => 'Audio-Samplingrate', + 'AudioSamplingResolution' => 'Audio-Samplingauflösung', + 'AudioType' => 'Audiotyp', + 'Author' => 'Autor', + 'AuthorURL' => 'Autor URL', + 'AuthorsPosition' => 'Autorenposition', + 'AutoAperture' => { + Description => 'Blendenring auf A', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'AutoBracket' => 'Automatische Belichtungsreihe', + 'AutoBracketModeM' => { + Description => 'Belichtungsreihen bei M', + PrintConv => { + 'Flash Only' => 'Nur Blitz', + 'Flash/Aperture' => 'Blitz & Blende', + 'Flash/Speed' => 'Blitz & Zeit', + 'Flash/Speed/Aperture' => 'Blitz, Zeit & Blende', + }, + }, + 'AutoBracketOrder' => 'BKT-Reihenfolge', + 'AutoBracketSet' => { + Description => 'Belichtungsreihen', + PrintConv => { + 'AE & Flash' => 'Belichtung & Blitz', + 'AE Only' => 'Nur Belichtung', + 'Exposure' => 'Belichtung', + 'Flash Only' => 'Nur Blitz', + 'WB Bracketing' => 'Weißabgleichs-Belichtungsreihe', + }, + }, + 'AutoBracketing' => { + Description => 'Automatische Belichtungsreihe', + PrintConv => { + 'AE' => 'Belichtung', + 'Contrast' => 'Kontrast', + 'Effect' => 'Effekt', + 'No flash & flash' => 'Kein Blitz & Blitz', + 'Off' => 'Aus', + 'On' => 'Ein', + 'Pre-shot' => 'Vorauslösung', + 'WB' => 'Weißabgleich', + 'WB2' => 'Weißabgleich 2', + }, + }, + 'AutoBracketingSet' => { + Description => 'Automatische Belichtungsreihen-Einstellung', + PrintConv => { + 'AE & Flash' => 'Belichtung & Blitz', + 'AE Only' => 'Nur Belichtung', + 'Flash Only' => 'Nur Blitz', + 'WB Bracketing' => 'Weißabgleich-Belichtungsreihe', + }, + }, + 'AutoBrightness' => 'Helligkeit Auto', + 'AutoContrast' => 'Kontrast Auto', + 'AutoDistortionControl' => { + Description => 'Automatische Verzeichnungskontrolle', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'AutoExposure' => 'Belichtung Auto', + 'AutoExposureBracketing' => { + Description => 'Auto-Belichtungsreihe', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'AutoFP' => { + Description => 'FP-Kurzzeitsynchr.', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'AutoFocus' => { + Description => 'Auto-Fokus', + PrintConv => { + 'Off' => 'Deaktiviert', + 'On' => 'Aktiviert', + }, + }, + 'AutoISO' => { + Description => 'ISO-Automatik', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + 'On (high sensitivity)' => 'Ein (Hohe Empfindlichkeit)', + }, + }, + 'AutoISOMax' => 'ISO-Automatik Max', + 'AutoISOMinShutterSpeed' => 'ISO-Automatik Längste Belichtungszeit', + 'AutoLightingOptimizer' => { + Description => 'Autom. Belichtungsoptimierung', + PrintConv => { + 'Disable' => 'Inaktiv', + 'Enable' => 'Aktiv', + 'Low' => 'Gering', + 'Off' => 'Aus', + 'Strong' => 'Stark', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'AutoLightingOptimizerOn' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'AutoPortraitFramed' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'AutoRedEye' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'AutoRotate' => { + Description => 'Automatische Bilddrehung', + PrintConv => { + 'None' => 'Keine', + 'Rotate 180' => '180° gedreht', + 'Rotate 270 CW' => '90° gegen den Uhrzeigersinn', + 'Rotate 90 CW' => '90° im Uhrzeigersinn', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'AutoShadows' => 'Schatten Auto', + 'AuxiliaryLens' => 'Vorsatzlinse', + 'AvApertureSetting' => 'Av Blenden-Einstellung', + 'AvSettingWithoutLens' => { + Description => 'Blendeneinstellung ohne Objektiv', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'BWFilter' => 'S/W-Filter', + 'BWMode' => { + Description => 'Schwarz-Weiß Modus', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'BabyAge' => 'Kindesalter', + 'BabyName' => 'Kindesname', + 'BackLight' => 'Hintergrundbeleuchtung', + 'BackgroundColor' => 'Hintergrundfarbe', + 'BackgroundColorIndicator' => 'Indikator Hintergrundfarbe', + 'BackgroundColorValue' => 'Hintergrundfarbwert', + 'BackgroundTiling' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'BannerImageType' => { + PrintConv => { + 'None' => 'Keines', + }, + }, + 'BaseExposureCompensation' => 'Basis-Belichtungskorrektur', + 'BaseISO' => 'Basis-ISO', + 'BaseName' => 'Basisname', + 'BaseURL' => 'Basis URL', + 'BaselineExposure' => 'Referenzbelichtung', + 'BaselineExposureOffset' => 'Referenzbelichtung Abweichung', + 'BaselineNoise' => 'Grundrauschen', + 'BaselineSharpness' => 'Referenzschärfe', + 'BatteryInfo' => 'Stromquelle', + 'BatteryLevel' => 'Batteriestatus', + 'BatteryOrder' => { + Description => 'Akkureihenfolge', + PrintConv => { + 'Camera Battery First' => 'Zuerst Akku in der Kamera', + 'MB-D10 First' => 'Zuerst Akkus im MB-D10', + }, + }, + 'BatteryState' => { + Description => 'Batteriestatus', + PrintConv => { + 'Almost full' => 'Fast Voll', + 'Empty' => 'Leer', + 'Full' => 'Voll', + 'Half full' => 'Halb Voll', + 'Low' => 'Niedrig', + }, + }, + 'BayerGreenSplit' => 'Pixelaufteilung nach Bayer', + 'BayerPattern' => 'Bayer Matrix', + 'Beep' => { + Description => 'Tonsignal', + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Tief', + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'BestShotMode' => { + Description => 'Bester Aufnahmemodus', + PrintConv => { + 'Autumn Leaves' => 'Herbstlaub', + 'Baby CS' => 'Kleinkind', + 'Backlight' => 'Hintergrundbeleuchtung', + 'Beach' => 'Strand', + 'Candlelight Portrait' => 'Kerzenlicht Porträt', + 'Child CS' => 'Kinder', + 'Children' => 'Kinder', + 'Collection' => 'Sammlung', + 'Fireworks' => 'Feuerwerk', + 'Flower' => 'Blumen', + 'Food' => 'Lebensmittel', + 'For YouTube' => 'Für YouTube', + 'For eBay' => 'Für eBay', + 'High Sensitivity' => 'Hohe Empfindlichkeit', + 'Natural Green' => 'Naturgrün', + 'Night Scene' => 'Nachtszene', + 'Night Scene Portrait' => 'Nacht-Porträt', + 'People' => 'Menschen', + 'Pet' => 'Haustiere', + 'Pet CS' => 'Haustiere', + 'Portrait' => 'Porträt', + 'Silent' => 'Stillleben', + 'Snow' => 'Schnee', + 'Sports' => 'Sport', + 'Sports CS' => 'Sport CS', + 'Sundown' => 'Sonnenuntergang', + 'Twilight' => 'Dämmerung', + 'Underwater' => 'Unterwasser', + }, + }, + 'BigImage' => 'Big Image Vorschaubild', + 'BitDepth' => 'Bit-Tiefe', + 'BitsPerSample' => 'Anzahl der Bits pro Komponente', + 'BlackLevel' => 'Schwarzwert', + 'BlackLevel2' => 'Schwarzwert 2', + 'BlackLevelData' => 'Schwarzwert Daten', + 'BlackLevelDeltaH' => 'Schwarzwert Delta H', + 'BlackLevelDeltaV' => 'Schwarzwert Delta V', + 'BlackPoint' => 'Schwarzpunkt', + 'BlueAdjust' => 'Blau-Korrektur', + 'BlueBalance' => 'Farbabgleich Blau', + 'BlueHue' => 'Farbton Blau', + 'BlueMatrixColumn' => 'Blau-Matrixspalte', + 'BlueSaturation' => 'Sättigung Blau', + 'BlueTRC' => 'Blau-Tonwertwiedergabe-Kurve', + 'BlueX' => 'Blaupunkt X', + 'BlueY' => 'Blaupunkt Y', + 'BlurControl' => { + Description => 'Bildstabilisierung', + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Niedrig', + 'Medium' => 'Mittel', + 'Off' => 'Aus', + }, + }, + 'BlurWarning' => { + Description => 'Verwackelungswarnung', + PrintConv => { + 'Blur Warning' => 'Verwackelungswarnung', + 'None' => 'Keine', + }, + }, + 'BodyBatteryADLoad' => 'Kamerabatterie A/D unter Last', + 'BodyBatteryADNoLoad' => 'Kamerabatterie A/D im Leerlauf', + 'BodyBatteryState' => { + Description => 'Kamerabatterie-Status', + PrintConv => { + 'Almost Empty' => 'Fast leer', + 'Empty or Missing' => 'Leer oder nicht vorhanden', + 'Full' => 'Voll geladen', + 'Running Low' => 'Schwach', + }, + }, + 'BodyFirmwareVersion' => 'Kamera-Firmware-Version', + 'BracketMode' => { + Description => 'Belichtungsreihen-Modus', + PrintConv => { + 'Off' => 'Aus', + }, + }, + 'BracketSequence' => 'Belichtungsreihen-Abfolge', + 'BracketShot' => 'Belichtungsreihen-Aufnahme', + 'BracketShotNumber' => { + Description => 'Belichtungsreihen-Bildnummer', + PrintConv => { + '1 of 2' => '1 von 2', + '1 of 3' => '1 von 3', + '1 of 5' => '1 von 5', + '2 of 2' => '2 von 2', + '2 of 3' => '2 von 3', + '2 of 5' => '2 von 5', + '3 of 3' => '3 von 3', + '3 of 5' => '3 von 5', + '4 of 5' => '4 von 5', + '5 of 5' => '5 von 5', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'BracketStep' => { + Description => 'Belichtungsreihenschritte', + PrintConv => { + '1 EV' => '1 LW', + '1/3 EV' => '1/3 LW', + '2/3 EV' => '2/3 LW', + }, + }, + 'BracketValue' => 'Belichtungsreihen-Wert', + 'Brightness' => 'Helligkeit', + 'BrightnessAdj' => 'Helligkeitskorrektur', + 'BrightnessValue' => 'Helligkeit', + 'BulbDuration' => 'Bulb-Dauer', + 'BurstMode' => { + Description => 'Burst Modus', + PrintConv => { + 'Auto Exposure Bracketing (AEB)' => 'Automatische Belichtungsreihe', + 'Off' => 'Aus', + 'On' => 'Ein', + 'Unlimited' => 'Unbegrenzt', + }, + }, + 'BurstMode2' => 'Burst Modus 2', + 'BurstShot' => 'Burst Aufnahme', + 'ButtonFunctionControlOff' => { + Description => 'Tastenfunktion wenn Schnelleinstellrad OFF', + PrintConv => { + 'Disable main, Control, Multi-control' => 'Deaktiv Haupt-Wahlrad, Schnelleinstellrad, Multicontroller', + 'Normal (enable)' => 'Normal (eingeschaltet)', + }, + }, + 'By-line' => 'Ersteller', + 'By-lineTitle' => 'Beruf des Erstellers', + 'ByteOrder' => 'Bytereihenfolge', + 'CCDSensitivity' => 'CCD Empfindlichkeit', + 'CFALayout' => { + Description => 'Farbfilter Anordnung', + PrintConv => { + 'Rectangular' => 'Rechteckig', + }, + }, + 'CFAPattern' => 'Farbfiltermatrix', + 'CFAPattern2' => 'Farbfiltermatrix 2', + 'CFAPatternColumns' => 'Farbfiltermatrix Spalten', + 'CFAPatternRows' => 'Farbfiltermatrix Zeilen', + 'CFAPatternValues' => 'Farbfiltermatrix Werte', + 'CFARepeatPatternDim' => 'Farbfiltermatrix-Größe', + 'CLModeShootingSpeed' => 'Lowspeed-Bildrate', + 'CMContrast' => 'CM Kontrast', + 'CMExposureCompensation' => 'CM Belichtungskorrektur', + 'CMHue' => 'CM Farbton', + 'CMMFlags' => 'CMM-Flags', + 'CMSaturation' => 'CM Farbsättigung', + 'CMSharpness' => 'CM Schärfe', + 'CMWhiteBalance' => 'CM Weißabgleich', + 'CMWhiteBalanceComp' => 'CM Weißabgleichsausgleich', + 'CMWhiteBalanceGrayPoint' => 'CM Weißabgleich Graupunkt', + 'CPUArchitecture' => 'CPU Architektur', + 'CPUByteOrder' => { + Description => 'CPU Bytereihenfolge', + PrintConv => { + 'Big endian' => 'Big-endian', + 'Little endian' => 'Little-endian', + }, + }, + 'CPUCount' => 'Anzahl CPU', + 'CPUFirmwareVersion' => 'CPU-Firmware-Version', + 'CPUSubtype' => 'CPU Subtyp', + 'CPUType' => { + Description => 'CPU Typ', + PrintConv => { + 'Any' => 'Unbestimmt', + 'None' => 'Unbestimmt', + 'i860 big endian' => 'i860 big-endian', + 'i860 little endian' => 'i860 little-endian', + }, + }, + 'CalibrationIlluminant1' => { + Description => 'Lichtquellenkalibrierung 1', + PrintConv => { + 'Cloudy' => 'Bewölkt', + 'Cool White Fluorescent' => 'Neonlicht kaltweiß', + 'Day White Fluorescent' => 'Neonlicht neutralweiß', + 'Daylight' => 'Tageslicht', + 'Daylight Fluorescent' => 'Neonlicht tageslichtweiß', + 'Fine Weather' => 'Wolkenlos', + 'Flash' => 'Blitz', + 'Fluorescent' => 'Neonlicht', + 'ISO Studio Tungsten' => 'ISO Studio-Kunstlicht (Glühbirne)', + 'Other' => 'Andere Lichtquelle', + 'Shade' => 'Schatten', + 'Standard Light A' => 'Standard-Licht A', + 'Standard Light B' => 'Standard-Licht B', + 'Standard Light C' => 'Standard-Licht C', + 'Tungsten (Incandescent)' => 'Kunstlicht (Glühbirne)', + 'Unknown' => 'Unbekannt', + 'Warm White Fluorescent' => 'Neonlicht warmweiß', + 'White Fluorescent' => 'Neonlicht universalweiß', + }, + }, + 'CalibrationIlluminant2' => { + Description => 'Lichtquellenkalibrierung 2', + PrintConv => { + 'Cloudy' => 'Bewölkt', + 'Cool White Fluorescent' => 'Neonlicht kaltweiß', + 'Day White Fluorescent' => 'Neonlicht neutralweiß', + 'Daylight' => 'Tageslicht', + 'Daylight Fluorescent' => 'Neonlicht tageslichtweiß', + 'Fine Weather' => 'Wolkenlos', + 'Flash' => 'Blitz', + 'Fluorescent' => 'Neonlicht', + 'ISO Studio Tungsten' => 'ISO Studio-Kunstlicht (Glühbirne)', + 'Other' => 'Andere Lichtquelle', + 'Shade' => 'Schatten', + 'Standard Light A' => 'Standard-Licht A', + 'Standard Light B' => 'Standard-Licht B', + 'Standard Light C' => 'Standard-Licht C', + 'Tungsten (Incandescent)' => 'Kunstlicht (Glühbirne)', + 'Unknown' => 'Unbekannt', + 'Warm White Fluorescent' => 'Neonlicht warmweiß', + 'White Fluorescent' => 'Neonlicht universalweiß', + }, + }, + 'CameraBody' => 'Kamera Gehäuse', + 'CameraByteOrder' => 'Kamera Bytereihenfolge', + 'CameraCalibration1' => 'Kamerakalibrierung 1', + 'CameraCalibration2' => 'Kamerakalibrierung 2', + 'CameraColorCalibration01' => 'Kamera Farbkalibrierung 01', + 'CameraColorCalibration02' => 'Kamera Farbkalibrierung 02', + 'CameraColorCalibration03' => 'Kamera Farbkalibrierung 03', + 'CameraColorCalibration04' => 'Kamera Farbkalibrierung 04', + 'CameraColorCalibration05' => 'Kamera Farbkalibrierung 05', + 'CameraColorCalibration06' => 'Kamera Farbkalibrierung 06', + 'CameraColorCalibration07' => 'Kamera Farbkalibrierung 07', + 'CameraColorCalibration08' => 'Kamera Farbkalibrierung 08', + 'CameraColorCalibration09' => 'Kamera Farbkalibrierung 09', + 'CameraColorCalibration10' => 'Kamera Farbkalibrierung 10', + 'CameraColorCalibration11' => 'Kamera Farbkalibrierung 11', + 'CameraColorCalibration12' => 'Kamera Farbkalibrierung 12', + 'CameraColorCalibration13' => 'Kamera Farbkalibrierung 13', + 'CameraColorCalibration14' => 'Kamera Farbkalibrierung 14', + 'CameraColorCalibration15' => 'Kamera Farbkalibrierung 15', + 'CameraID' => 'Kamera ID', + 'CameraISO' => 'Kamera-ISO', + 'CameraInfo' => 'Pentax-Modell', + 'CameraInfoByteOrder' => 'Kamerainformation Bytereihenfolge', + 'CameraModel' => 'Kamera Modell', + 'CameraOrientation' => { + Description => 'Ausrichtung der Kamera', + PrintConv => { + 'Downwards' => 'Abwärts', + 'Rotate 180' => '180° gedreht', + 'Rotate 270 CW' => '90° gegen den Uhrzeigersinn', + 'Rotate 90 CW' => '90° im Uhrzeigersinn', + 'Upwards' => 'Aufwärts', + }, + }, + 'CameraProfile' => 'Kameraprofil', + 'CameraProfileDigest' => 'Kennwert des Kameraprofils', + 'CameraSerialNumber' => 'Kamera-Seriennummer', + 'CameraSettings' => 'Kameraeinstellungen', + 'CameraSettingsVersion' => 'Kameraeinstellungen-Version', + 'CameraTemperature' => 'Kamera-Temperatur', + 'CameraType' => { + Description => 'Kameratyp', + PrintConv => { + 'Compact' => 'Kompakt', + 'DV Camera' => 'DV Kamera', + 'EOS High-end' => 'EOS Highend', + 'EOS Mid-range' => 'EOS Mittelklasse', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'CameraType2' => 'Kameratyp 2', + 'CanonAFInfo' => 'AF-Info', + 'CanonAFInfo2' => 'AF-Info (2)', + 'CanonExposureMode' => { + Description => 'Belichtungsmodus', + PrintConv => { + 'Aperture-priority AE' => 'Blendenpriorität', + 'Bulb' => 'Bulb-Modus', + 'Manual' => 'Manuell', + 'Program AE' => 'Programmautomatik', + 'Shutter speed priority AE' => 'Verschlusspriorität', + }, + }, + 'CanonFileDescription' => 'Canon Dateibeschreibung', + 'CanonFileInfo' => 'Dateiinformationen', + 'CanonFileLength' => 'Dateilänge', + 'CanonFirmwareVersion' => 'Firmware-Version', + 'CanonFlashMode' => { + Description => 'Blitz-Modus', + PrintConv => { + 'Auto' => 'Automatisch', + 'External flash' => 'Externer Blitz', + 'Off' => 'Aus', + 'On' => 'Ein', + 'Red-eye reduction' => 'Rote-Augen-Reduzierung', + 'Red-eye reduction (Auto)' => 'Rote-Augen-Reduzierung (Automatisch)', + 'Red-eye reduction (On)' => 'Rote-Augen-Reduzierung (Ein)', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'CanonFocalLength' => 'Objektivart', + 'CanonImageHeight' => 'Canon-Bildhöhe', + 'CanonImageSize' => { + Description => 'Canon-Bildgröße', + PrintConv => { + 'Large' => 'Groß', + 'Medium' => 'Mittelgroß', + 'Medium 1' => 'Mittelgroß 1', + 'Medium 2' => 'Mittelgroß 2', + 'Medium 3' => 'Mittelgroß 3', + 'Medium Movie' => 'Mittelgroßer Film', + 'Postcard' => 'Postkarte', + 'Small' => 'Klein', + 'Small 1' => 'Klein 1', + 'Small 2' => 'Klein 2', + 'Small 3' => 'Klein 3', + 'Small Movie' => 'Kleiner Film', + 'Widescreen' => 'Breitbild', + }, + }, + 'CanonImageType' => 'Canon-Bildtyp', + 'CanonImageWidth' => 'Canon-Bildbreite', + 'CanonModelID' => 'Canon-Modell ID', + 'Caption' => 'Bildtext', + 'Caption-Abstract' => 'Beschreibung/Zusammenfassung', + 'CaptionWriter' => 'Bildtextautor', + 'CaptureXResolutionUnit' => { + PrintConv => { + 'um' => 'µm (Mikrometer)', + }, + }, + 'CaptureYResolutionUnit' => { + PrintConv => { + 'um' => 'µm (Mikrometer)', + }, + }, + 'CasioImageSize' => 'Casio Bildgröße', + 'CatalogSets' => 'Katalogzusammenstellungen', + 'Categories' => { + Description => 'Kategorien', + PrintConv => { + 'People' => 'Menschen', + 'Scenery' => 'Szene', + }, + }, + 'Category' => 'Kategorie', + 'CenterAFArea' => { + Description => 'AF-Messfeld Mitte', + PrintConv => { + 'Normal Zone' => 'Normal', + 'Wide Zone' => 'Groß', + }, + }, + 'CenterFocusPoint' => { + Description => 'Fokuspunkt Mitte', + PrintConv => { + 'Normal Zone' => 'Normaler Bereich', + 'Wide Zone' => 'Großer Bereich', + }, + }, + 'CenterWeightedAreaSize' => { + Description => 'Messfeldgröße Mitte', + PrintConv => { + 'Average' => 'Durchschnitt', + }, + }, + 'Certificate' => 'Zertifikat', + 'Channels' => 'Kanäle', + 'Chapter' => 'Kapitel', + 'CharacterSet' => 'Zeichensatz', + 'Children' => 'Kinder', + 'ChromaticAberration' => 'Farbabweichung', + 'ChromaticAberrationB' => 'Farbabweichung B', + 'ChromaticAberrationBlue' => 'Farbabweichung Blau', + 'ChromaticAberrationCorr' => { + Description => 'Farbabweichung Korrektur', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ChromaticAberrationCorrection' => { + Description => 'Farbabweichung Korrektur', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ChromaticAberrationOn' => 'Farbabweichung Ein', + 'ChromaticAberrationR' => 'Farbabweichung R', + 'ChromaticAberrationRed' => 'Farbabweichung Rot', + 'ChromaticAberrationSetting' => { + Description => 'Farbabweichung Einstellung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Chromaticity' => 'Chromatizität', + 'ChrominanceNR_TIFF_JPEG' => { + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Leicht', + 'Off' => 'Aus', + }, + }, + 'ChrominanceNoiseReduction' => { + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Leicht', + 'Off' => 'Aus', + }, + }, + 'CircleOfConfusion' => 'Unschärfekreis', + 'City' => 'Stadt/Ort', + 'ClassifyState' => 'Klassifizierungs-Status', + 'CodePage' => { + PrintConv => { + 'Unicode UTF-16, big endian' => 'Unicode UTF-16, Big-endian', + 'Unicode UTF-16, little endian' => 'Unicode UTF-16, Little-endian', + 'Unicode UTF-32, big endian' => 'Unicode UTF-32, Big-endian', + 'Unicode UTF-32, little endian' => 'Unicode UTF-32, Little-endian', + }, + }, + 'CodedCharacterSet' => 'IPTC Characterset', + 'CodedContentScanningKind' => { + PrintConv => { + 'Unknown' => 'Unbekannt', + }, + }, + 'ColorAberrationControl' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ColorAdjustment' => 'Farbeinstellung', + 'ColorAdjustmentMode' => { + Description => 'Farbeinstellung Modus', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ColorBW' => 'Schwarz/Weiß', + 'ColorBalance' => 'Farbabgleich', + 'ColorBalance1' => 'Farbabgleich 1', + 'ColorBalanceA' => 'Farbabgleich A', + 'ColorBalanceAdj' => { + Description => 'Farbabgleich Korrektur', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ColorBalanceBlue' => 'Farbabgleich Blau', + 'ColorBalanceGreen' => 'Farbabgleich Grün', + 'ColorBalanceRed' => 'Farbangleich Rot', + 'ColorBalanceVersion' => 'Farbabgleich Version', + 'ColorBitDepth' => 'Farbtiefe', + 'ColorBoostType' => { + PrintConv => { + 'Nature' => 'Natur', + 'People' => 'Menschen', + }, + }, + 'ColorBooster' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ColorCompensationFilter' => 'Farbkorrektur-Filter', + 'ColorComponents' => 'Anzahl der Bildkomponenten', + 'ColorCorrection' => 'Farbkorrektur', + 'ColorDataVersion' => 'Farbdaten Version', + 'ColorEffect' => { + Description => 'Farbeffekt', + PrintConv => { + 'Black & White' => 'Schwarz/Weiß', + 'Cool' => 'Kühl', + 'Off' => 'Aus', + }, + }, + 'ColorFilter' => { + Description => 'Farbfilter', + PrintConv => { + 'Black & White' => 'Schwarz/Weiß', + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'Off' => 'Aus', + 'Purple' => 'Lila', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + }, + }, + 'ColorHue' => 'Farbwiedergabe', + 'ColorInfo' => 'Farb-Informationen', + 'ColorMap' => 'Farbtafel', + 'ColorMatrix' => 'Farb-Matrix', + 'ColorMatrix1' => 'Farbmatrix 1', + 'ColorMatrix2' => 'Farbmatrix 2', + 'ColorMatrixNumber' => 'Farbmatrix Nummer', + 'ColorMode' => { + Description => 'Farbmodus', + PrintConv => { + 'Autumn' => 'Herbst', + 'Autumn Leaves' => 'Herbstlaub', + 'B & W' => 'S/W', + 'B&W' => 'Schwarz/Weiß', + 'B&W Red Filter' => 'Schwarz-Weiß Rotfilter', + 'B&W Yellow Filter' => 'Schwarz-Weiß Gelbfilter', + 'Black & White' => 'Schwarz/Weiß', + 'Chrome' => 'Farbe', + 'Clear' => 'Klar', + 'Deep' => 'Tief', + 'Duotone' => 'Zweiton', + 'Evening' => 'Abends', + 'Grayscale' => 'Graustufen', + 'Indexed' => 'Indiziert', + 'Indexed Color' => 'Indizierte Farben', + 'Landscape' => 'Landschaft', + 'Light' => 'Hell', + 'Multichannel' => 'Mehrkanal', + 'Natural' => 'Natürlich', + 'Natural color' => 'Natürliche Farben', + 'Natural sRGB' => 'Neutral sRGB', + 'Natural+ sRGB' => 'Neutral+ sRGB', + 'Night Portrait' => 'Nachtporträt', + 'Night Scene' => 'Nachtszene', + 'Night View' => 'Abendszene', + 'Night View/Portrait' => 'Abendszene/Porträt', + 'Off' => 'Aus', + 'Portrait' => 'Porträt', + 'RGB Color' => 'RGB Farbe', + 'Solarization' => 'Solarisation', + 'Sunset' => 'Sonnenuntergang', + 'Vivid' => 'Lebhafte Farbe', + 'Vivid color' => 'Lebhafte Farbe', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ColorMoireReduction' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ColorMoireReductionMode' => { + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Leicht', + 'Off' => 'Aus', + }, + }, + 'ColorNoiseReduction' => 'Farbrauschunterdrückung', + 'ColorNoiseReductionDetail' => 'Farbrauschunterdrückung Detail', + 'ColorPalette' => 'Farbpalette', + 'ColorPlanes' => 'Farbebenen', + 'ColorProfile' => { + Description => 'Farbprofil', + PrintConv => { + 'Embedded' => 'Eingebunden', + 'Not Embedded' => 'Nicht eingebunden', + }, + }, + 'ColorRepresentation' => 'Farbdarstellung', + 'ColorReproduction' => 'Farbreproduktion', + 'ColorSequence' => 'Farbreihenfolge', + 'ColorSpace' => { + Description => 'Farbraum', + PrintConv => { + 'B&W' => 'Schwarz/Weiß', + 'ICC Profile' => 'ICC-Profil', + 'Monochrome' => 'Monochrom', + 'Natural sRGB' => 'Neutral sRGB', + 'Natural+ sRGB' => 'Neutral+ sRGB', + 'Uncalibrated' => 'Nicht festgelegt', + 'Undefined' => 'Nicht definiert', + }, + }, + 'ColorSpaceData' => 'Farbraum Daten', + 'ColorTempAsShot' => 'Farbtemperatur Aufnahme', + 'ColorTempAuto' => 'Farbtemperatur Auto', + 'ColorTempCloudy' => 'Farbtemperatur Bewölkt', + 'ColorTempCustom' => 'Farbtemperatur Benutzerdefiniert', + 'ColorTempCustom1' => 'Farbtemperatur Benutzerdefiniert 1', + 'ColorTempCustom2' => 'Farbtemperatur Benutzerdefiniert 2', + 'ColorTempDaylight' => 'Farbtemperatur Tageslicht', + 'ColorTempFlash' => 'Farbtemperatur Blitz', + 'ColorTempFlashData' => 'Farbtemperatur Blitzdaten', + 'ColorTempFluorescent' => 'Farbtemperatur Neonlicht', + 'ColorTempKelvin' => 'Farbtemperatur Kelvin', + 'ColorTempMeasured' => 'Farbtemperatur Messung', + 'ColorTempPC1' => 'Farbtemperatur PC1', + 'ColorTempPC2' => 'Farbtemperatur PC2', + 'ColorTempPC3' => 'Farbtemperatur PC3', + 'ColorTempShade' => 'Farbtemperatur Schatten', + 'ColorTempTungsten' => 'Farbtemperatur Glühbirne', + 'ColorTempUnknown' => 'Farbtemperatur Unbekannt', + 'ColorTempUnknown10' => 'Farbtemperatur Unbekannt 10', + 'ColorTempUnknown11' => 'Farbtemperatur Unbekannt 11', + 'ColorTempUnknown12' => 'Farbtemperatur Unbekannt 12', + 'ColorTempUnknown13' => 'Farbtemperatur Unbekannt 13', + 'ColorTempUnknown14' => 'Farbtemperatur Unbekannt 14', + 'ColorTempUnknown15' => 'Farbtemperatur Unbekannt 15', + 'ColorTempUnknown16' => 'Farbtemperatur Unbekannt 16', + 'ColorTempUnknown17' => 'Farbtemperatur Unbekannt 17', + 'ColorTempUnknown18' => 'Farbtemperatur Unbekannt 18', + 'ColorTempUnknown19' => 'Farbtemperatur Unbekannt 19', + 'ColorTempUnknown2' => 'Farbtemperatur Unbekannt 2', + 'ColorTempUnknown20' => 'Farbtemperatur Unbekannt 20', + 'ColorTempUnknown3' => 'Farbtemperatur Unbekannt 3', + 'ColorTempUnknown4' => 'Farbtemperatur Unbekannt 4', + 'ColorTempUnknown5' => 'Farbtemperatur Unbekannt 5', + 'ColorTempUnknown6' => 'Farbtemperatur Unbekannt 6', + 'ColorTempUnknown7' => 'Farbtemperatur Unbekannt 7', + 'ColorTempUnknown8' => 'Farbtemperatur Unbekannt 8', + 'ColorTempUnknown9' => 'Farbtemperatur Unbekannt 9', + 'ColorTemperature' => 'Farbtemperatur', + 'ColorTemperatureAdj' => 'Farbtemperaturkorrektur', + 'ColorTemperatureSetting' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + }, + }, + 'ColorTone' => 'Farbton', + 'ColorToneAdj' => 'Farbtonkorrektur', + 'ColorToneFaithful' => { + Description => 'Farbton Natürlich', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ColorToneLandscape' => { + Description => 'Farbton Landschaft', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ColorToneMonochrome' => { + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ColorToneNeutral' => { + Description => 'Farbton Neutral', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ColorTonePortrait' => { + Description => 'Farbton Porträt', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ColorToneStandard' => { + Description => 'Farbton Standard', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ColorToneUnknown' => { + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ColorToneUserDef1' => { + Description => 'Farbton Benutzerdefiniert 1', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ColorToneUserDef2' => { + Description => 'Farbton Benutzerdefiniert 2', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ColorToneUserDef3' => { + Description => 'Farbton Benutzerdefiniert 3', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ColorTransform' => { + Description => 'Farbtransformation', + PrintConv => { + 'Unknown (RGB or CMYK)' => 'Unbekannt (RGB oder CMYK)', + }, + }, + 'ColorimetricReference' => 'Farbmetrische Referenz', + 'CommandDials' => { + Description => 'Einstellräder', + PrintConv => { + 'Reversed (Main Aperture, Sub Shutter)' => 'Vertauscht', + 'Standard (Main Shutter, Sub Aperture)' => 'Standard', + }, + }, + 'CommandDialsApertureSetting' => { + Description => 'Einstellräder Blendeneinstellung', + PrintConv => { + 'Aperture Ring' => 'Mit Blendenring', + 'Sub-command Dial' => 'Mit Einstellrad', + }, + }, + 'CommandDialsChangeMainSub' => { + Description => 'Einstellräder Funktionsbelegung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'CommandDialsMenuAndPlayback' => { + Description => 'Einstellräder Menüs und Wiedergabe', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'CommandDialsReverseRotation' => { + Description => 'Einstellräder Auswahlrichtung', + PrintConv => { + 'No' => 'Standard', + 'Yes' => 'Umgekehrt', + }, + }, + 'CommanderChannel' => 'Master-Steuerung Kanal', + 'CommanderGroupAManualOutput' => 'Master-Steuerung Gruppe A M Korr', + 'CommanderGroupAMode' => { + Description => 'Master-Steuerung Gruppe A Modus', + PrintConv => { + 'Auto Aperture' => 'Blendenautomatik (AA)', + 'Manual' => 'Manuell', + 'Off' => 'Aus', + }, + }, + 'CommanderGroupA_TTL-AAComp' => 'Master-Steuerung Gruppe A TTL/AA Korr', + 'CommanderGroupA_TTLComp' => 'Master-Steuerung Gruppe-A TTL-Korrektur', + 'CommanderGroupBManualOutput' => 'Master-Steuerung Gruppe B M Korr', + 'CommanderGroupBMode' => { + Description => 'Master-Steuerung Gruppe B Modus', + PrintConv => { + 'Auto Aperture' => 'Blendenautomatik (AA)', + 'Manual' => 'Manuell', + 'Off' => 'Aus', + }, + }, + 'CommanderGroupB_TTL-AAComp' => 'Master-Steuerung Gruppe B TTL/AA Korr', + 'CommanderGroupB_TTLComp' => 'Master-Steuerung Gruppe-B TTL-Korrektur', + 'CommanderInternalFlash' => { + Description => 'Master-Steuerung Intgr. Blitz Modus', + PrintConv => { + 'Manual' => 'Manuell', + 'Off' => 'Aus', + }, + }, + 'CommanderInternalManualOutput' => 'Master-Steuerung Intgr. Blitz M Korr', + 'CommanderInternalTTLComp' => 'Master-Steuerung Intgr. Blitz TTL Korr', + 'Comment' => 'Kommentar', + 'Comments' => 'Kommentare', + 'Compilation' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'ComponentBitDepth' => 'Komponente Farbtiefe', + 'ComponentsConfiguration' => 'Bedeutung jeder Komponente', + 'CompressedBitsPerPixel' => 'Bildkomprimierungsmodus', + 'CompressedImageSize' => 'Komprimierte Bildgröße', + 'Compression' => { + Description => 'Komprimierungsschema', + PrintConv => { + 'Bitfields' => 'Bitfelder', + 'JBIG B&W' => 'JBIG Schwarz-Weiß', + 'JBIG Color' => 'JBIG Farbe', + 'JPEG' => 'JPEG-Komprimierung', + 'JPEG (old-style)' => 'JPEG (alte Version)', + 'Kodak DCR Compressed' => 'Kodak DCR-Komprimierung', + 'Kodak KDC Compressed' => 'Kodak KDC-Komprimierung', + 'Next' => 'NeXT 2-Bit Kodierung', + 'Nikon NEF Compressed' => 'Nikon NEF-Komprimierung', + 'None' => 'Keines', + 'PNG' => 'PNG-Komprimierung', + 'Pentax PEF Compressed' => 'Pentax PEF-Komprimierung', + 'SGILog' => 'SGI 32-Bit Log Luminance Kodierung', + 'SGILog24' => 'SGI 24-Bit Log Luminance Kodierung', + 'Sony ARW Compressed' => 'Sony ARW-Komprimierung', + 'Thunderscan' => 'ThunderScan 4-Bit Kodierung', + 'Uncompressed' => 'Nicht komprimiert', + }, + }, + 'CompressionFactor' => 'Komprimierungsfaktor', + 'CompressionLevel' => 'Komprimierungsgrad', + 'CompressionRatio' => 'Komprimierungsrate', + 'CompressionType' => { + Description => 'Komprimierungsschema', + PrintConv => { + 'Little-endian, no compression' => 'Little-endian, keine Komprimierung', + 'None' => 'Keines', + }, + }, + 'ConditionalFEC' => 'Blitzbelichtungskorrektur', + 'ConnectionSpaceIlluminant' => 'Weißpunkt des Verbindungsfarbraums', + 'ConstrainedCropHeight' => 'Ausschnitt erzeugte Höhe', + 'ConstrainedCropWidth' => 'Ausschnitt erzeugte Breite', + 'Contact' => 'Kontakt', + 'ContentLocationCode' => 'Inhaltspositionscode', + 'ContentLocationName' => 'Inhaltspositionsname', + 'ContinuousBracketing' => { + Description => 'Serienbild-Belichtungsreihe', + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Niedrig', + }, + }, + 'ContinuousDrive' => { + Description => 'Aufnahme-Modus', + PrintConv => { + 'Continuous' => 'Serienaufnahme', + 'Movie' => 'Filmen', + 'Silent Single' => 'Stillleben', + 'Single' => 'Einzelbild', + }, + }, + 'ContinuousShootingSpeed' => { + Description => 'Geschwindigkeit Reihenaufnahmen', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'ContinuousShotLimit' => { + Description => 'Limit Anzahl Reihenaufnahmen', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'Contrast' => { + Description => 'Kontrast', + PrintConv => { + '+1 (medium high)' => '+1 (Leicht erhöht)', + '+2 (high)' => '+2 (Stark)', + '+3 (very high)' => '+3 (Sehr hoch)', + '-1 (medium low)' => '-1 (Leicht verringert)', + '-2 (low)' => '-2 (Leicht)', + '-3 (very low)' => '-3 (Sehr gering)', + 'Film Simulation' => 'Film-Simulation', + 'High' => 'Stark', + 'Low' => 'Leicht', + 'Med High' => 'Leicht erhöht', + 'Med Low' => 'Leicht verringert', + 'Medium High' => 'Mittel-Hoch', + 'Medium Low' => 'Mittel-Gering', + 'Very High' => 'Sehr hoch', + 'Very Low' => 'Sehr gering', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'Contrast2012' => 'Kontrast 2012', + 'ContrastAdj' => 'Kontrastkorrektur', + 'ContrastAdjustment' => 'Kontrastkorrektur', + 'ContrastCurve' => 'Kontrast-Kurve', + 'ContrastDetectAFArea' => 'AF-Bereich Kontrast gesteuert', + 'ContrastFaithful' => { + Description => 'Kontrast Natürlich', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ContrastHighlightShadowAdj' => { + Description => 'Kontrast helle Stellen', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ContrastLandscape' => { + Description => 'Kontrast Landschaft', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ContrastMode' => { + Description => 'Kontrast Modus', + PrintConv => { + 'High' => 'Hoch', + 'High Dynamic' => 'Hoch dynamisch', + 'Low' => 'Niedrig', + 'Low Key' => 'Low-Key', + 'Medium High' => 'Mitte hoch', + 'Medium Low' => 'Mitte niedrig', + }, + }, + 'ContrastMonochrome' => { + Description => 'Kontrast Monochrom', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ContrastNeutral' => { + Description => 'Kontrast Neutral', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ContrastPortrait' => { + Description => 'Kontrast Porträt', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ContrastSetting' => 'Kontrasteinstellung', + 'ContrastShadow' => 'Kontrast dunkle Stellen', + 'ContrastStandard' => { + Description => 'Kontrast Standard', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ContrastUnknown' => { + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ContrastUserDef1' => { + Description => 'Kontrast Benutzerdefiniert 1', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ContrastUserDef2' => { + Description => 'Kontrast Benutzerdefiniert 2', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ContrastUserDef3' => { + Description => 'Kontrast Benutzerdefiniert 3', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'Contributor' => 'Mitwirkender', + 'Contributors' => 'Mitwirkende', + 'ControlDialSet' => { + PrintConv => { + 'Aperture' => 'Blende', + 'Shutter Speed' => 'Belichtungszeit', + }, + }, + 'ControlMode' => { + Description => 'Steuerungsmethode', + PrintConv => { + 'Camera Local Control' => 'Lokale Kamerasteuerung', + 'Computer Remote Control' => 'Kamerasteuerung per Computer', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ConversionLens' => { + Description => 'Vorsatzlinse', + PrintConv => { + 'Macro' => 'Makro', + 'Off' => 'Aus', + 'Telephoto' => 'Tele', + }, + }, + 'Converter' => 'Konverter', + 'Copyright' => 'Urheberrechtsvermerk', + 'CopyrightNotice' => 'Urheberrechtsvermerk', + 'CopyrightStatus' => { + PrintConv => { + 'Unknown' => 'Unbekannt', + }, + }, + 'CoringValues' => 'Coring Werte', + 'Country' => 'Land', + 'Country-PrimaryLocationCode' => 'ISO-Ländercode', + 'Country-PrimaryLocationName' => 'Land', + 'CountryCode' => 'ISO-Ländercode', + 'Coverage' => 'Anwendungsbereich', + 'CreateDate' => 'Digitalisierungsdatum/-uhrzeit', + 'CreationDate' => 'Aufnahmedatum', + 'CreativeStyle' => { + Description => 'Kreativmodus', + PrintConv => { + 'Autumn' => 'Herbst', + 'Autumn Leaves' => 'Herbstlaub', + 'B&W' => 'Schwarz/Weiß', + 'Clear' => 'Klar', + 'Deep' => 'Tief', + 'Landscape' => 'Landschaft', + 'Light' => 'Hell', + 'Night View/Portrait' => 'Abendszene/Porträt', + 'Portrait' => 'Porträt', + 'Sunset' => 'Sonnenuntergang', + 'Vivid' => 'Lebhafte Farbe', + }, + }, + 'CreativeStyleSetting' => { + PrintConv => { + 'B&W' => 'Schwarz/Weiß', + 'Landscape' => 'Landschaft', + 'Portrait' => 'Porträt', + 'Sunset' => 'Sonnenuntergang', + }, + }, + 'Creator' => 'Ersteller', + 'CreatorAddress' => 'Ersteller - Adresse', + 'CreatorAppID' => { + Description => 'Ersteller App ID', + PrintConv => { + 'Unknown' => 'Unbekannt', + }, + }, + 'CreatorAppVersion' => 'Ersteller App Version', + 'CreatorApplication' => 'Ersteller der Applikation', + 'CreatorCity' => 'Ersteller - Ort', + 'CreatorContactInfo' => 'Ersteller Kontaktinfo', + 'CreatorCountry' => 'Ersteller - Land', + 'CreatorPostalCode' => 'Ersteller - PLZ', + 'CreatorRegion' => 'Ersteller - Bundesland/Kanton', + 'CreatorTool' => 'Erstellertool', + 'CreatorWorkEmail' => 'Ersteller - E-Mail', + 'CreatorWorkTelephone' => 'Ersteller - Telefon', + 'CreatorWorkURL' => 'Ersteller - Webseite(n)', + 'Credit' => 'Anbieter', + 'CropActive' => { + Description => 'Ausschnitt aktiviert', + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'CropAngle' => 'Ausschnitt Winkel', + 'CropAspectRatio' => { + Description => 'Ausschnitt Bildformat', + PrintConv => { + 'A-size Landscape' => 'DIN A Querformat', + 'A-size Portrait' => 'DIN A Hochformat', + 'Circle' => 'Kreis', + 'Custom' => 'Benutzerdefiniert', + 'Free' => 'Frei', + 'Letter-size Landscape' => 'Letter Querformat', + 'Letter-size Portrait' => 'Letter Querformat', + }, + }, + 'CropBottom' => 'Ausschnitt Unten', + 'CropBottomMargin' => 'Ausschnitt Rand Unten', + 'CropCircleActive' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'CropHeight' => 'Ausschnitt Höhe', + 'CropHiSpeed' => 'Ausschnitt Highspeed', + 'CropLeft' => 'Ausschnitt Links', + 'CropLeftMargin' => 'Ausschnitt Rand Links', + 'CropRight' => 'Ausschnitt Rechts', + 'CropRightMargin' => 'Ausschnitt Rand Rechts', + 'CropRotation' => 'Ausschnitt Drehung', + 'CropTop' => 'Ausschnitt Oben', + 'CropTopMargin' => 'Ausschnitt Rand Oben', + 'CropUnit' => { + Description => 'Ausschnitt Einheit', + PrintConv => { + 'inches' => 'Zoll', + 'pixels' => 'Pixel', + }, + }, + 'CropUnits' => { + Description => 'Ausschnitt Einheiten', + PrintConv => { + 'inches' => 'Zoll', + 'pixels' => 'Pixel', + }, + }, + 'CropWidth' => 'Ausschnitt Breite', + 'CroppedImageHeight' => 'Ausschnitt Bildhöhe', + 'CroppedImageLeft' => 'Ausschnitt Bildanfang Links', + 'CroppedImageTop' => 'Ausschnitt Bildanfang Oben', + 'CroppedImageWidth' => 'Ausschnitt Bildbreite', + 'CurrentICCProfile' => 'Aktuelles ICC-Profile', + 'CurrentIPTCDigest' => 'Aktueller IPTC Kennwert', + 'Curves' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Custom1' => 'Benutzerdefiniert 1', + 'Custom2' => 'Benutzerdefiniert 2', + 'Custom3' => 'Benutzerdefiniert 3', + 'Custom4' => 'Benutzerdefiniert 4', + 'CustomLinear' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'CustomPictureStyleFileName' => 'Benutzer-Bildstil Dateiname', + 'CustomRendered' => { + Description => 'Benutzerdefinierte Bildverarbeitung', + PrintConv => { + 'Custom' => 'Benutzerdefinierter Prozess', + 'Normal' => 'Standard-Prozess', + }, + }, + 'D-LightingHQ' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'D-LightingHQSelected' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'D-LightingHS' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'D-RangeOptimizerMode' => { + PrintConv => { + 'Manual' => 'Manuell', + 'Off' => 'Aus', + }, + }, + 'DECPosition' => { + Description => 'DEC-Position', + PrintConv => { + 'Contrast' => 'Kontrast', + 'Exposure' => 'Belichtung', + 'Saturation' => 'Sättigung', + }, + }, + 'DLOOn' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'DNGBackwardVersion' => 'DNG Versionskompatibilität', + 'DNGLensInfo' => 'DNG Objektiv-Informationen', + 'DNGVersion' => 'DNG-Version', + 'DOF' => 'Schärfentiefe', + 'DSPFirmwareVersion' => 'DSP-Firmware-Version', + 'DataCompressionMethod' => 'Daten Komprimierungsmethode', + 'DataDump' => 'Daten-Dump', + 'DataDump2' => 'Daten-Dump 2', + 'DataImprint' => { + Description => 'Daten-Einblendung', + PrintConv => { + 'MM/DD/HH:MM' => 'MM/TT/SS:MM', + 'None' => 'Keine', + 'YYYY/MM/DD' => 'JJJJ/MM/TT', + }, + }, + 'DataLength' => 'Datenlänge', + 'Date' => 'Datum', + 'DateCreated' => 'Erstellungsdatum', + 'DateDisplayFormat' => { + Description => 'Datumsformat', + PrintConv => { + 'D/M/Y' => 'Tag/Monat/Jahr', + 'M/D/Y' => 'Monat/Tag/Jahr', + 'Y/M/D' => 'Jahr/Monat/Tag', + }, + }, + 'DateSent' => 'Absendedatum', + 'DateStampMode' => { + Description => 'Zeitstempel-Modus', + PrintConv => { + 'Date' => 'Datum', + 'Off' => 'Aus', + }, + }, + 'DateTime' => 'Änderungsdatum', + 'DateTimeCreated' => 'Erstellungsdatum/-uhrzeit', + 'DateTimeDigitized' => 'Datum/Uhrzeit der Digitalisierung', + 'DateTimeOriginal' => 'Erstellungsdatum/-uhrzeit', + 'DateTimeStamp' => 'Datum Uhrzeitangabe', + 'DaylightSavings' => { + Description => 'Sommerzeit', + PrintConv => { + 'No' => 'Aus', + 'Yes' => 'Ein', + }, + }, + 'Declination' => 'Deklination', + 'DefaultCropOrigin' => 'System-Ausschnitt Beginn', + 'DefaultCropSize' => 'System-Ausschnitt Größe', + 'DefaultDisplayHeight' => 'Default Anzeigehöhe', + 'DefaultDisplayWidth' => 'Default Anzeigebreite', + 'DefaultEraseOption' => { + Description => 'System-Löscheinstellung', + PrintConv => { + 'Cancel selected' => 'Abbruch', + 'Erase selected' => 'Löschen', + }, + }, + 'DefaultImageColor' => 'System-Bildfarbe', + 'DefaultScale' => 'Systemmaß', + 'DeletedImageCount' => 'Anzahl gelöschter Bilder', + 'Description' => 'Beschreibung', + 'Destination' => 'Ziel', + 'DestinationCity' => 'Zielort', + 'DestinationCityCode' => 'Zielort-Code', + 'DestinationDST' => { + Description => 'Zielort Sommerzeit (DST)', + PrintConv => { + 'No' => 'Deaktiviert', + 'Yes' => 'Aktiviert', + }, + }, + 'DevelopmentDynamicRange' => 'Dynamikbereich Entwicklung', + 'DeviceAttributes' => 'Geräte-Eigenschaften', + 'DeviceManufacturer' => 'Gerätehersteller', + 'DeviceMfgDesc' => 'Gerätehersteller-Bezeichnung', + 'DeviceModel' => 'Geräte-Modell', + 'DeviceModelDesc' => 'Geräte-Modell-Bezeichnung', + 'DeviceSettingDescription' => 'Geräteeinstellung', + 'DialDirectionTvAv' => { + Description => 'Drehung Wählrad bei Tv/Av', + PrintConv => { + 'Reversed' => 'Umgekehrt', + }, + }, + 'DigitalCreationDate' => 'Digitalisierungsdatum', + 'DigitalCreationDateTime' => 'Digitalisierungsdatum/-uhrzeit', + 'DigitalCreationTime' => 'Digitalisierungszeit', + 'DigitalFilter01' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter02' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter03' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter04' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter05' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter06' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter07' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter08' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter09' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter10' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter11' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter12' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter13' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter14' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter15' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter16' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter17' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter18' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter19' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalFilter20' => { + PrintConv => { + 'Color Filter' => 'Farbfilter', + 'Fisheye' => 'Fischauge', + 'High Contrast' => 'Hoher Kontrast', + }, + }, + 'DigitalGain' => 'Digitale Verstärkung', + 'DigitalZoom' => { + Description => 'Digital-Zoom', + PrintConv => { + 'Electronic magnification' => 'Elektronische Vergrößerung', + 'None' => 'Kein', + 'Off' => 'Aus', + 'Other' => 'Unbekannt', + }, + }, + 'DigitalZoomOn' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'DigitalZoomRatio' => 'Digitaler Zoom-Faktor', + 'Directory' => 'Verzeichnis', + 'DirectoryIndex' => 'Verzeichnis-Index', + 'DirectoryNumber' => 'Ordner-Nummer', + 'Disclaimer' => 'Haftungsbeschränkung', + 'DisplayAllAFPoints' => { + Description => 'Anzeige aller AF-Punkte', + PrintConv => { + 'Disable' => 'Deaktiviert', + 'Enable' => 'Aktiviert', + }, + }, + 'DisplayAperture' => 'Angezeigte Blende', + 'DisplayHeight' => 'Anzeigehöhe', + 'DisplayUnit' => { + PrintConv => { + 'Pixels' => 'Pixel', + 'inches' => 'Zoll', + }, + }, + 'DisplayUnits' => { + Description => 'Anzeigeeinheit', + PrintConv => { + 'inches' => 'Zoll', + 'meters' => 'Meter', + }, + }, + 'DisplayXResolutionUnit' => { + PrintConv => { + 'um' => 'µm (Mikrometer)', + }, + }, + 'DisplayYResolutionUnit' => { + PrintConv => { + 'um' => 'µm (Mikrometer)', + }, + }, + 'DisplayedUnitsX' => { + Description => 'Einheit der horiz. Auflösung', + PrintConv => { + 'inches' => 'Zoll', + }, + }, + 'DisplayedUnitsY' => { + Description => 'Einheit der vert. Auflösung', + PrintConv => { + 'inches' => 'Zoll', + }, + }, + 'DistortionControl' => { + Description => 'Verzeichnungskontrolle', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'DistortionCorrection' => { + Description => 'Verzeichnungskorrektur', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'DistortionCorrection2' => { + Description => 'Verzeichnungskorrektur 2', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'DistortionCorrectionOn' => 'Verzeichnungskorrektur Ein', + 'DistortionN' => 'Verzeichnung N', + 'DistortionParam02' => 'Verzeichnungsparameter 02', + 'DistortionParam04' => 'Verzeichnungsparameter 04', + 'DistortionParam08' => 'Verzeichnungsparameter 08', + 'DistortionParam09' => 'Verzeichnungsparameter 09', + 'DistortionParam11' => 'Verzeichnungsparameter 11', + 'DistortionScale' => 'Verzeichnungsausmaß', + 'DistortionVersion' => 'Verzeichnung Version', + 'DjVuVersion' => 'DjVu-Version', + 'DocSecurity' => { + Description => 'Dokumentensicherheit', + PrintConv => { + 'Locked for annotations' => 'Gesperrt für Anmerkungen', + 'None' => 'Keine', + 'Password protected' => 'Passwort geschützt', + 'Read-only enforced' => 'Nur Lesen - erzwungen', + 'Read-only recommended' => 'Nur Lesen - vorgeschlagen', + }, + }, + 'Document' => 'Dokument', + 'DocumentHistory' => 'Historie des Dokuments', + 'DocumentName' => 'Dokumentenname', + 'DocumentNotes' => 'Notizen zum Dokument', + 'DriveMode' => { + Description => 'Aufnahmeart', + PrintConv => { + '10 s Timer' => 'Selbstauslöser 10 s', + '2 s Timer' => 'Selbstauslöser 2 s', + 'Auto Bracket' => 'Belichtungsreihe', + 'Bracketing' => 'Belichtungsreihe', + 'Continuous' => 'Serienaufnahme', + 'Continuous (Lo)' => 'Serienaufnahme (Niedrig)', + 'Continuous Bracketing' => 'Serienbild-Belichtungsreihe', + 'Continuous Exposure Bracketing' => 'Serienaufnahme Belichtungsreihe', + 'Continuous High' => 'Serienaufnahme (Hi)', + 'Continuous Low' => 'Serienaufnahme Niedrig', + 'Continuous Shooting' => 'Serienaufnahme', + 'HS continuous' => 'High-Speed Serienbild', + 'Mirror Lock-up' => 'Spiegel hochgeklappt', + 'Multi Shot' => 'Serienaufnahme', + 'Multiple Exposure' => 'Mehrfachbelichtung', + 'No Timer' => 'Ohne Selbstauslöser', + 'Off' => 'Aus', + 'Remote Control' => 'Fernauslöser', + 'Remote Control (3 s delay)' => 'Fernauslöser (3 Sek. Verzögerung)', + 'Self-Timer 2 sec' => 'Selbstauslöser 2 s', + 'Self-timer' => 'Selbstauslöser', + 'Self-timer (12 s)' => 'Selbstauslöser (12 Sek.)', + 'Self-timer (2 s)' => 'Selbstauslöser (2 Sek.)', + 'Self-timer 10 sec' => 'Selbstauslöser 10 s', + 'Self-timer 2 sec, Mirror Lock-up' => 'Selbstauslöser 2 s, Spiegel hochgeklappt', + 'Self-timer Operation' => 'Selbstauslöser', + 'Shutter Button' => 'Kamera-Auslöser', + 'Single' => 'Einzelbild', + 'Single Exposure' => 'Einzelbelichtung', + 'Single Frame' => 'Einzelbild', + 'Single Shot' => 'Einzelbild', + 'Single-Frame Bracketing' => 'Einzelbild-Belichtungsreihe', + 'Single-frame' => 'Einzelbild', + 'Single-frame Bracketing' => 'Einzelbild-Belichtungsreihe', + 'Single-frame Exposure Bracketing' => 'Einzelbild Belichtungsreihe', + 'Single-frame Shooting' => 'Einzelbild', + 'UHS continuous' => 'Ultra High-Speed Serienbild', + 'White Balance Bracketing' => 'Weißabgleichs-Belichtungsreihe', + 'White Balance Bracketing High' => 'Weißabgleich-Belichtungsreihe Hoch', + 'White Balance Bracketing Low' => 'Weißabgleich-Belichtungsreihe Niedrig', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'DriveMode2' => { + Description => 'Mehrfachbelichtung', + PrintConv => { + 'Continous Bracketing Low' => 'Serienaufnahme Belichtungsreihe Niedrig', + 'Continuous' => 'Serienaufnahme', + 'Continuous (Lo)' => 'Serienaufnahme (Niedrig)', + 'Continuous Bracketing' => 'Serienaufnahme Belichtungsreihe', + 'Continuous Bracketing 0.3 EV' => 'Serienaufnahme Belichtungsreihe 0.3 EV', + 'Continuous Bracketing 0.7 EV' => 'Serienaufnahme Belichtungsreihe 0.7 EV', + 'Continuous Bracketing High' => 'Serienaufnahme Belichtungsreihe Hoch', + 'Continuous High' => 'Serienaufnahme Hoch', + 'Continuous Low' => 'Serienaufnahme Niedrig', + 'Exposure Bracket' => 'Belichtungsreihe', + 'Mirror Lock-up' => 'Spiegel hochgeklappt', + 'Multiple Exposure' => 'Mehrfachbelichtung', + 'Remote Control' => 'Fernauslöser', + 'Remote Control (3 s delay)' => 'Fernauslöser (3 s verzögert)', + 'Self-timer (12 s)' => 'Selbstauslöser (12 s)', + 'Self-timer (2 s)' => 'Selbstauslöser (2 s)', + 'Self-timer 10 sec' => 'Selbstauslöser 10 s', + 'Self-timer 2 sec' => 'Selbstauslöser 2 s', + 'Self-timer 2 sec, Mirror Lock-up' => 'Selbstauslöser 2 s, Spiegel hochgeklappt', + 'Single Frame' => 'Einzelbild', + 'Single-frame' => 'Einzelbildaufnahme', + 'Single-frame Bracketing' => 'Einzelbild Belichtungsreihe', + 'Single-frame Bracketing High' => 'Einzelbild Belichtungsreihe Hoch', + 'Single-frame Bracketing Low' => 'Einzelbild Belichtungsreihe Niedrig', + 'White Balance Bracketing High' => 'Weißabgleich Belichtungsreihe Hoch', + 'White Balance Bracketing Low' => 'Weißabgleich Belichtungsreihe Niedrig', + }, + }, + 'DriveModeSetting' => { + Description => 'Aufnahmeart Einstellung', + PrintConv => { + 'Continuous High' => 'Serienaufnahme Hoch', + 'Continuous Low' => 'Serienaufnahme Niedrig', + 'Self-timer 10 sec' => 'Selbstauslöser 10 s', + 'Self-timer 2 sec, Mirror Lock-up' => 'Selbstauslöser 2 s, Spiegel hochgeklappt', + 'Single Frame' => 'Einzelbild', + }, + }, + 'DriveType' => { + PrintConv => { + 'Unknown' => 'Unbekannt', + }, + }, + 'Duration' => 'Dauer', + 'DustRemovalData' => 'Dunstentfernungsdaten', + 'DynamicAFArea' => { + Description => 'Dynamisches AF-Messfeld', + PrintConv => { + '21 Points' => '21 Messfelder', + '51 Points' => '51 Messfelder', + '51 Points (3D-tracking)' => '51 Messfelder (3D-Tracking)', + '9 Points' => '9 Messfelder', + }, + }, + 'DynamicRange' => { + Description => 'Dynamikbereich', + PrintConv => { + 'Wide' => 'Weit', + }, + }, + 'DynamicRangeExpansion' => { + Description => 'Dynamikbereich-Erweiterung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'DynamicRangeOptimizer' => { + Description => 'Dynamikbereich-Optimierung', + PrintConv => { + 'Advanced Auto' => 'Erw. Automatik', + 'Advanced Lv1' => 'Erw. Stufe 1', + 'Advanced Lv2' => 'Erw. Stufe 2', + 'Advanced Lv3' => 'Erw. Stufe 3', + 'Advanced Lv4' => 'Erw. Stufe 4', + 'Advanced Lv5' => 'Erw. Stufe 5', + 'Auto' => 'Automatisch', + 'Off' => 'Aus', + }, + }, + 'DynamicRangeOptimizerBracket' => { + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Niedrig', + 'Off' => 'Aus', + }, + }, + 'DynamicRangeOptimizerMode' => { + PrintConv => { + 'Off' => 'Aus', + }, + }, + 'DynamicRangeSetting' => { + Description => 'Dynamikbereich-Einstellungen', + PrintConv => { + 'Film Simulation' => 'Film-Simulation', + 'Wide1 (230%)' => 'Weit1 (230%)', + 'Wide2 (400%)' => 'Weit2 (400%)', + }, + }, + 'E-DialInProgram' => { + PrintConv => { + 'Tv or Av' => 'Tv oder Av', + }, + }, + 'ETTLII' => { + PrintConv => { + 'Average' => 'Integralmessung', + 'Evaluative' => 'Mehrfeldmessung', + }, + }, + 'EVStepInfo' => 'EV-Schritte Information', + 'EVStepSize' => { + Description => 'Belichtungswerte', + PrintConv => { + '1/2 EV' => '1/2 LW', + '1/3 EV' => '1/3 LW', + }, + }, + 'EVSteps' => { + Description => 'LW-Schritte', + PrintConv => { + '1/2 EV Steps' => '1/2 LW-Schritte', + '1/3 EV Steps' => '1/3 LW-Schritte', + }, + }, + 'EasyExposureComp' => 'Easy Belichtungskorrektur', + 'EasyExposureCompensation' => { + Description => 'Easy Belichtungskorrektur', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + 'On (auto reset)' => 'Einstellrad (Reset)', + }, + }, + 'EasyMode' => { + Description => 'Easy-Modus', + PrintConv => { + 'Beach' => 'Strand', + 'Black & White' => 'Schwarz/Weiß', + 'Blur Reduction' => 'Unschärfereduktion', + 'Color Accent' => 'Farbton', + 'Color Swap' => 'Farbwechsel', + 'Digital Macro' => 'Digitales Makro', + 'Fireworks' => 'Feuerwerk', + 'Foliage' => 'Laub', + 'Full auto' => 'Vollautomatisch', + 'Indoor' => 'Innenaufnahme', + 'Kids & Pets' => 'Kinder & Tiere', + 'Landscape' => 'Landschaft', + 'Live View Control' => 'Live View Kontrolle', + 'Low Light' => 'Wenig Licht', + 'Low Light 2' => 'Wenig Licht 2', + 'Macro' => 'Makro', + 'Manual' => 'Manuell', + 'Night' => 'Nachtszene', + 'Night Scene' => 'Nachtszene', + 'Night Snapshot' => 'Nacht Schnappschuss', + 'Pan focus' => 'Pan Fokus', + 'Portrait' => 'Porträt', + 'Snow' => 'Schnee', + 'Sports' => 'Sport', + 'Sunset' => 'Sonnenuntergang', + 'Super Macro' => 'Super-Makro', + 'Super Macro 2' => 'Super Makro 2', + 'Underwater' => 'Unterwasser', + 'Zoom Blur' => 'Zoom Unschärfe', + }, + }, + 'EdgeNoiseReduction' => { + Description => 'Rauschunterdrückung Ecken', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'EditStatus' => 'Bearbeitungsstatus', + 'Edition' => 'Ausgabe', + 'EditorialUpdate' => 'Redaktionelle Ãœberarbeitung', + 'EffectiveLV' => 'Effektiver LW', + 'EffectiveMaxAperture' => 'Effektiv größte Blende', + 'Email' => 'E-Mail', + 'EmbeddedImage' => 'Eingebettetes Bild', + 'EmbeddedImageByteOrder' => 'Eingebettetes Bild Bytereihenfolge', + 'EmbeddedImageHeight' => 'Eingebettetes Bild Bildhöhe', + 'EmbeddedImageType' => 'Eingebettetes Bild Bildtyp', + 'EmbeddedImageWidth' => 'Eingebettetes Bild Bildbreite', + 'Emphasis' => { + PrintConv => { + 'None' => 'Keine', + 'reserved' => 'reserviert', + }, + }, + 'Encoding' => { + PrintConv => { + 'Unknown -' => 'Unbekannt -', + }, + }, + 'EncodingProcess' => 'JPEG-Kodierung Prozess', + 'Encryption' => 'Verschlüsselung', + 'EnhanceDarkTones' => { + Description => 'Dunkle Stellen aufhellen', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Enhancement' => { + PrintConv => { + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'Off' => 'Aus', + 'Red' => 'Rot', + 'Underwater' => 'Unterwasser', + }, + }, + 'EnvelopePriority' => { + Description => 'Priorität', + PrintConv => { + '0 (reserved)' => '0 (reserviert)', + '1 (most urgent)' => '1 (sehr dringend)', + '5 (normal urgency)' => '5 (normale Dringlichkeit)', + '8 (least urgent)' => '8 (geringe Wichtigkeit)', + '9 (user-defined priority)' => '9 (benutzerdefinierte Priorität)', + }, + }, + 'EnvelopeRecordVersion' => 'IPTC-Modell-1-Version', + 'EpsonImageHeight' => 'Epson-Bildhöhe', + 'EpsonImageWidth' => 'Epson-Bildbreite', + 'Equipment' => 'Equipment-IFD-Zeiger', + 'EquipmentVersion' => 'Equipment-Version', + 'Error' => 'Fehler', + 'ExifByteOrder' => 'Exif Byte-Reihenfolge', + 'ExifCameraInfo' => 'Exif Kamerainformationen', + 'ExifImageHeight' => 'Exif-Bildhöhe', + 'ExifImageWidth' => 'Exif-Bildbreite', + 'ExifOffset' => 'Exif IFD-Zeiger', + 'ExifToolVersion' => 'ExifTool-Version', + 'ExifUnicodeByteOrder' => 'Exif Unicode Byte-Reihenfolge', + 'ExifVersion' => 'Exif-Version', + 'ExitPupilPosition' => 'Austrittspupillenposition', + 'ExpandFilm' => 'Erweitert Film', + 'ExpandFilterLens' => 'Erweitert Filterlinse', + 'ExpandFlashLamp' => 'Erweitert Blitzlicht', + 'ExpandLens' => 'Erweitert Objektiv', + 'ExpandScanner' => 'Erweitert Scanner', + 'ExpandSoftware' => 'Erweitert Software', + 'ExpirationDate' => 'Ablaufdatum', + 'ExpirationTime' => 'Ablaufzeit', + 'Exposure' => 'Belichtung', + 'Exposure2012' => 'Belichtung 2012', + 'ExposureAdj' => 'Belichtungskorrektur', + 'ExposureAdj2' => 'Belichtungskorrektur 2', + 'ExposureAdjust' => 'Belichtungskorrektur', + 'ExposureBias' => 'Belichtungskorrekturwert', + 'ExposureBracketShotNumber' => 'Belichtungsreihen-Bildnummer', + 'ExposureBracketStepSize' => 'Belichtungsreihen-Stufenabstand', + 'ExposureBracketValue' => 'Belichtungsreihenwert', + 'ExposureCompStepSize' => { + Description => 'Belichtungskorrekturstufe', + PrintConv => { + '1 EV' => '1 LW', + '1/2 EV' => '1/2 LW', + '1/3 EV' => '1/3 LW', + }, + }, + 'ExposureCompensation' => 'Belichtungskorrektur', + 'ExposureCompensation2' => 'Belichtungskorrektur 2', + 'ExposureCompensationMode' => 'Belichtungskorrekturmodus', + 'ExposureControlStepSize' => { + Description => 'Belichtungswert', + PrintConv => { + '1 EV' => '1 LW', + '1/2 EV' => '1/2 LW', + '1/3 EV' => '1/3 LW', + }, + }, + 'ExposureDelayMode' => { + Description => 'Spiegelvorauslösung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ExposureDifference' => 'Belichtungsabweichung', + 'ExposureIndex' => 'Belichtungsindex', + 'ExposureLevelIncrements' => { + Description => 'Belichtungswert', + PrintConv => { + '1-stop set, 1/3-stop comp.' => '1-Blende, 1/3-Blendenkompensation', + '1/2 Stop' => '1/2 LW', + '1/2-stop set, 1/2-stop comp.' => '1/2-Blende, 1/2-Blendenkompensation', + '1/3 Stop' => '1/3 LW', + '1/3-stop set, 1/3-stop comp.' => '1/3-Blende, 1/3-Blendenkompensation', + }, + }, + 'ExposureMode' => { + Description => 'Belichtungsmodus', + PrintConv => { + 'Anti Motion Blur' => 'Verwackelungsschutz', + 'Aperture Priority' => 'Blendenpriorität', + 'Aperture-priority AE' => 'Blendenpriorität', + 'Auto' => 'Automatische Belichtung', + 'Auto bracket' => 'Belichtungsreihe', + 'Auto?' => 'Automatisch?', + 'Backlight Correction HDR' => 'Hintergrundbeleuchtung HDR Korrektur', + 'Beach' => 'Strand', + 'Bulb' => 'Bulb-Modus', + 'Fireworks' => 'Feuerwerk', + 'Food' => 'Lebensmittel', + 'High Sensitivity' => 'Hohe Empfindlichkeit', + 'Landscape' => 'Landschaft', + 'Macro' => 'Makro', + 'Manual' => 'Manuelle Belichtung', + 'Night Scene / Twilight' => 'Nachtszene / Dämmerung', + 'Night View/Portrait' => 'Abendszene/Porträt', + 'Pet' => 'Haustiere', + 'Portrait' => 'Porträt', + 'Program' => 'Programmautomatik', + 'Program AE' => 'Programmautomatik', + 'Program-shift' => 'Programm-Shift', + 'Program-shift A' => 'Programmverschiebung A', + 'Program-shift S' => 'Programmverschiebung S', + 'Shutter Priority' => 'Verschlusspriorität', + 'Shutter speed priority AE' => 'Verschlusspriorität', + 'Snow' => 'Schnee', + 'Sports' => 'Sport', + 'Sunset' => 'Sonnenuntergang', + 'Twilight Portrait' => 'Dämmerung Portät', + 'Underwater' => 'Unterwasser', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ExposureModeInManual' => { + Description => 'Belichtungsmodus bei manueller Belichtung', + PrintConv => { + 'Center-weighted average' => 'Mittenbetont', + 'Evaluative metering' => 'Mehrfeldmessung', + 'Partial metering' => 'Teilbild', + 'Specified metering mode' => 'Spezifizierte Messmethode', + 'Spot metering' => 'Spotmessung', + }, + }, + 'ExposureProgram' => { + Description => 'Belichtungsprogramm', + PrintConv => { + 'Action (High speed)' => 'Kreativ-Programm (ausgerichtet auf schnelle Verschlussgeschwindigkeit)', + 'Anti Motion Blur' => 'Verwackelungsschutz', + 'Aperture Priority' => 'Blendenpriorität', + 'Aperture-priority AE' => 'Blendenpriorität', + 'Creative (Slow speed)' => 'Kreativ-Programm (ausgerichtet auf Schärfentiefe)', + 'Landscape' => 'Landschaft', + 'Macro' => 'Makro', + 'Manual' => 'Manuell', + 'Night Portrait' => 'Nachtporträt', + 'Night view' => 'Abendszene', + 'Night view/portrait' => 'Abendszene/Porträt', + 'Not Defined' => 'Nicht definiert', + 'Portrait' => 'Porträt', + 'Program' => 'Programmautomatik', + 'Program AE' => 'Programmautomatik', + 'Shutter Priority' => 'Verschlusspriorität', + 'Shutter speed priority AE' => 'Verschlusspriorität', + 'Sports' => 'Sport', + 'Sunset' => 'Sonnenuntergang', + }, + }, + 'ExposureTime' => 'Belichtungsdauer', + 'ExposureTime2' => 'Belichtungsdauer 2', + 'ExposureValue' => 'Belichtungsdauer', + 'ExposureWarning' => { + Description => 'Belichtungswarnung', + PrintConv => { + 'Bad exposure' => 'Schlechte Belichtung', + 'Good' => 'OK', + }, + }, + 'ExtendedWBDetect' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Extender' => { + Description => 'Konverter', + PrintConv => { + 'None' => 'Keiner', + }, + }, + 'ExtenderFirmwareVersion' => 'Konverter-Firmware-Version', + 'ExtenderMake' => 'Konverterhersteller', + 'ExtenderModel' => 'Konverter-Modell', + 'ExtenderSerialNumber' => 'Konverter-Seriennummer', + 'ExtenderStatus' => { + Description => 'Status Telekonverter', + PrintConv => { + 'Attached' => 'Angesetzt', + 'Not attached' => 'Nicht angesetzt', + 'Removed' => 'Entfernt', + }, + }, + 'ExternalFlash' => { + Description => 'Externer Blitz', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ExternalFlashAE1' => 'Externer Blitz AE1', + 'ExternalFlashAE1_0' => 'Externer Blitz AE1 0', + 'ExternalFlashAE2' => 'Externer Blitz AE2', + 'ExternalFlashAE2_0' => 'Externer Blitz AE2 0', + 'ExternalFlashBounce' => { + Description => 'Externer Blitz - Bounce', + PrintConv => { + 'Bounce' => 'Mit Bounce', + 'Direct' => 'Direkt', + 'No' => 'Nein', + 'Yes' => 'Ja', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ExternalFlashCompensation' => 'Externe Blitzbelichtungskorrektur', + 'ExternalFlashExposureComp' => { + Description => 'Belichtungskorrektur des externen Blitzgeräts', + PrintConv => { + '-0.5' => '-0.5 LW', + '-1.0' => '-1.0 LW', + '-1.5' => '-1.5 LW', + '-2.0' => '-2.0 LW', + '-2.5' => '-2.5 LW', + '-3.0' => '-3.0 LW', + '0.0' => '0.0 LW', + '0.5' => '0.5 LW', + '1.0' => '1.0 LW', + 'n/a' => 'Nicht gesetzt (Aus oder Auto-Modi)', + 'n/a (Manual Mode)' => 'Nicht gesetzt (Manueller Modus)', + }, + }, + 'ExternalFlashFirmware' => { + Description => 'Externer Blitz Firmware', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ExternalFlashFlags' => { + Description => 'Externer Blitz Flags', + PrintConv => { + 'Fired' => 'Ausgelöst', + }, + }, + 'ExternalFlashGValue' => 'Externer Blitz Leitzahl', + 'ExternalFlashGuideNumber' => 'Leitzahl des externen Blitzgeräts', + 'ExternalFlashMode' => { + Description => 'Slave-Blitz-Messfeld 3', + PrintConv => { + 'Off' => 'Aus', + 'On, Auto' => 'Ein, Auto', + 'On, Contrast-control Sync' => 'Ein, Kontrast-Steuerungs-Synchronisation', + 'On, Flash Problem' => 'Ein, Blitzproblem?', + 'On, High-speed Sync' => 'Ein, High-Speed-Synchronisation', + 'On, Manual' => 'Ein, Manuell', + 'On, P-TTL Auto' => 'Ein, P-TTL-Blitzautomatik', + 'On, Wireless' => 'Ein, Drahtlos', + 'On, Wireless, High-speed Sync' => 'Ein, Drahtlos, High-Speed-Synchronisation', + 'n/a - Off-Auto-Aperture' => 'K/A - Blendenring nicht auf A', + }, + }, + 'ExternalFlashZoom' => 'Externer Blitz-Zoom', + 'ExternalSensorBrightnessValue' => 'Externer Sensor Helligkeitswert', + 'ExtraSamples' => 'Zusätzliche Komponenten', + 'FEMicroadjustment' => { + Description => 'FE Feinabstimmung', + PrintConv => { + 'Disable' => 'Deaktiviert', + 'Enable' => 'Aktiviert', + }, + }, + 'FNumber' => 'F-Wert', + 'FOV' => 'Sichtfeld', + 'Face0Position' => 'Position, 0. Gesicht', + 'Face10Position' => 'Position, 10. Gesicht', + 'Face10Size' => 'Größe, 10. Gesicht', + 'Face11Position' => 'Position, 11. Gesicht', + 'Face11Size' => 'Größe, 11. Gesicht', + 'Face12Position' => 'Position, 12. Gesicht', + 'Face12Size' => 'Größe, 12. Gesicht', + 'Face13Position' => 'Position, 13. Gesicht', + 'Face13Size' => 'Größe, 13. Gesicht', + 'Face14Position' => 'Position, 14. Gesicht', + 'Face14Size' => 'Größe, 14. Gesicht', + 'Face15Position' => 'Position, 15. Gesicht', + 'Face15Size' => 'Größe, 15. Gesicht', + 'Face16Position' => 'Position, 16. Gesicht', + 'Face16Size' => 'Größe, 16. Gesicht', + 'Face17Position' => 'Position, 17. Gesicht', + 'Face17Size' => 'Größe, 17. Gesicht', + 'Face18Position' => 'Position, 18. Gesicht', + 'Face18Size' => 'Größe, 18. Gesicht', + 'Face19Position' => 'Position, 19. Gesicht', + 'Face19Size' => 'Größe, 19. Gesicht', + 'Face1Position' => 'Position, 1. Gesicht', + 'Face1Size' => 'Größe, 1. Gesicht', + 'Face20Position' => 'Position, 20. Gesicht', + 'Face20Size' => 'Größe, 20. Gesicht', + 'Face21Position' => 'Position, 21. Gesicht', + 'Face21Size' => 'Größe, 21. Gesicht', + 'Face22Position' => 'Position, 22. Gesicht', + 'Face22Size' => 'Größe, 22. Gesicht', + 'Face23Position' => 'Position, 23. Gesicht', + 'Face23Size' => 'Größe, 23. Gesicht', + 'Face24Position' => 'Position, 24. Gesicht', + 'Face24Size' => 'Größe, 24. Gesicht', + 'Face25Position' => 'Position, 25. Gesicht', + 'Face25Size' => 'Größe, 25. Gesicht', + 'Face26Position' => 'Position, 26. Gesicht', + 'Face26Size' => 'Größe, 26. Gesicht', + 'Face27Position' => 'Position, 27. Gesicht', + 'Face27Size' => 'Größe, 27. Gesicht', + 'Face28Position' => 'Position, 28. Gesicht', + 'Face28Size' => 'Größe, 28. Gesicht', + 'Face29Position' => 'Position, 29. Gesicht', + 'Face29Size' => 'Größe, 29. Gesicht', + 'Face2Position' => 'Position, 2. Gesicht', + 'Face2Size' => 'Größe, 2. Gesicht', + 'Face30Position' => 'Position, 30. Gesicht', + 'Face30Size' => 'Größe, 30. Gesicht', + 'Face31Position' => 'Position, 31. Gesicht', + 'Face31Size' => 'Größe, 31. Gesicht', + 'Face32Position' => 'Position, 32. Gesicht', + 'Face32Size' => 'Größe, 32. Gesicht', + 'Face3Position' => 'Position, 3. Gesicht', + 'Face3Size' => 'Größe, 3. Gesicht', + 'Face4Position' => 'Position, 4. Gesicht', + 'Face4Size' => 'Größe, 4. Gesicht', + 'Face5Position' => 'Position, 5. Gesicht', + 'Face5Size' => 'Größe, 5. Gesicht', + 'Face6Position' => 'Position, 6. Gesicht', + 'Face6Size' => 'Größe, 6. Gesicht', + 'Face7Position' => 'Position, 7. Gesicht', + 'Face7Size' => 'Größe, 7. Gesicht', + 'Face8Position' => 'Position, 8. Gesicht', + 'Face8Size' => 'Größe, 8. Gesicht', + 'Face9Position' => 'Position, 9. Gesicht', + 'Face9Size' => 'Größe, 9. Gesicht', + 'FaceDetect' => { + Description => 'Gesichtserkennung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'FaceDetectArea' => 'Gesichtserkennung Bereich', + 'FaceDetectFrameSize' => 'Gesichtserkennung Bereichsgröße', + 'FaceInfoUnknown' => 'Gesichterinformation Unbekannt', + 'FaceOrientation' => { + Description => 'Ausrichtung Gesichtserkennung', + PrintConv => { + 'Rotate 180' => '180° gedreht', + 'Rotate 270 CW' => '90° gegen den Uhrzeigersinn', + 'Rotate 90 CW' => '90° im Uhrzeigersinn', + }, + }, + 'FacePositions' => 'Positionen der Gesichter', + 'FacesDetected' => { + Description => 'Gesichter erkannt', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FacesRecognized' => 'Gesichter erkannt', + 'FastSeek' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'FaxProfile' => { + Description => 'Faxprofil', + PrintConv => { + 'Unknown' => 'Unbekannt', + }, + }, + 'FaxRecvParams' => 'Fax-Empfangsparameter', + 'FaxRecvTime' => 'Fax-Empfangszeit', + 'FaxSubAddress' => 'Fax-Sub-Adresse', + 'FileAccessDate' => 'Datum/Uhrzeit des letzten Dateizugriffs', + 'FileCreateDate' => 'Datum/Uhrzeit der Dateierstellung', + 'FileDescription' => 'Dateibeschreibung', + 'FileExtension' => 'Dateiendung', + 'FileFormat' => 'Dateiformat', + 'FileIndex' => 'Datei-Index', + 'FileInfo' => 'Datei-Informationen', + 'FileInfoVersion' => 'Datei-Informationen-Version', + 'FileInodeChangeDate' => 'Datum/Uhrzeit der letzten Inode-Änderung', + 'FileModifyDate' => 'Datum/Uhrzeit der Dateiänderung', + 'FileName' => 'Dateiname', + 'FileNumber' => 'Dateinummer', + 'FileNumberMemory' => { + Description => 'Dateinummernspeicher', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'FileNumberSequence' => { + Description => 'Nummernspeicher', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'FilePermissions' => 'Dateiberechtigungen', + 'FileSequence' => 'Dateireihenfolge', + 'FileSize' => 'Dateigröße', + 'FileSource' => { + Description => 'Dateiquelle', + PrintConv => { + 'Digital Camera' => 'Digital-Kamera', + 'Film Scanner' => 'Film-Scanner', + 'Reflection Print Scanner' => 'Scanner', + 'Sigma Digital Camera' => 'Sigma Digital-Kamera', + }, + }, + 'FileType' => 'Dateityp', + 'FileTypeDescription' => 'Dateityp Beschreibung', + 'FileVersion' => 'Dateiformatversion', + 'Filename' => 'Dateiname', + 'FillFlashAutoReduction' => { + Description => 'E-TTL II-Automatikblitz-System', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'FilmMode' => { + Description => 'Film-Modus', + PrintConv => { + 'F1/Studio Portrait' => 'F1/Studio-Porträt', + 'F1a/Studio Portrait Enhanced Saturation' => 'F1a/Studio-Porträt Erweiterte Sättigung', + 'F1b/Studio Portrait Smooth Skin Tone (ASTIA)' => 'F1b/Studio-Porträt Weiche Hauttöne', + 'F1b/Studio Portrait Smooth Skin Tone (Astia)' => 'F1b/Studio-Porträt Weiche Hauttöne', + 'F1c/Studio Portrait Increased Sharpness' => 'F1c/Studio-Porträt Erhöhte Schärfe', + 'F3/Studio Portrait Ex' => 'F3/Studio Porträt Ex', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FilmType' => 'Filmtyp', + 'FilterEffect' => { + Description => 'Filtereffekt', + PrintConv => { + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Off' => 'Aus', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FilterEffectFaithful' => { + Description => 'Filtereffekt Natürlich', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FilterEffectLandscape' => { + Description => 'Filtereffekt Landschaft', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FilterEffectMonochrome' => { + Description => 'Filtereffekt Monochrom', + PrintConv => { + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FilterEffectNeutral' => { + Description => 'Filtereffekt Neutral', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FilterEffectPortrait' => { + Description => 'Filtereffekt Porträt', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FilterEffectStandard' => { + Description => 'Filtereffekt Standard', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FilterEffectUnknown' => { + Description => 'Filtereffekt Unbekannt', + PrintConv => { + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FilterEffectUserDef1' => { + Description => 'Filtereffekt Benutzerdefiniert 1', + PrintConv => { + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FilterEffectUserDef2' => { + Description => 'Filtereffekt Benutzerdefineirt 2', + PrintConv => { + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FilterEffectUserDef3' => { + Description => 'Filtereffekt Benutzerdefiniert 3', + PrintConv => { + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FinderDisplayDuringExposure' => { + Description => 'Sucheranzeige bei Belichtung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'FineSharpness' => { + Description => 'Detail-Schärfe', + PrintConv => { + 'Extra fine' => 'Extra', + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'FineTuneOptCenterWeighted' => 'Feinabstimmung Mittenbetonte Messung', + 'FineTuneOptMatrixMetering' => 'Feinabstimmung Matrixmessung', + 'FineTuneOptSpotMetering' => 'Feinabstimmung Spotmessung', + 'FirmwareRevision' => 'Firmware-Revision', + 'FirmwareRevision2' => 'Firmware-Revision 2', + 'FirmwareVersion' => 'Firmware-Version', + 'FixtureIdentifier' => 'Kennzeichnung', + 'Flash' => { + Description => 'Blitzmodus', + PrintConv => { + 'Auto, Did not fire' => 'Blitz wurde nicht ausgelöst, Automodus', + 'Auto, Did not fire, Red-eye reduction' => 'Blitz wurde nicht ausgelöst, Rote-Augen-Reduzierung', + 'Auto, Fired' => 'Blitz wurde ausgelöst, Automodus', + 'Auto, Fired, Red-eye reduction' => 'Blitz wurde ausgelöst, Automodus, Rote-Augen-Reduzierung', + 'Auto, Fired, Red-eye reduction, Return detected' => 'Blitz wurde ausgelöst, Automodus, Messblitz-Licht zurückgeworfen, Rote-Augen-Reduzierung', + 'Auto, Fired, Red-eye reduction, Return not detected' => 'Blitz wurde ausgelöst, Automodus, kein Messblitz-Licht zurückgeworfen, Rote-Augen-Reduzierung', + 'Auto, Fired, Return detected' => 'Blitz wurde ausgelöst, Automodus, Messblitz-Licht zurückgeworfen', + 'Auto, Fired, Return not detected' => 'Blitz wurde ausgelöst, Automodus, kein Messblitz-Licht zurückgeworfen', + 'Did not fire' => 'Blitz wurde nicht ausgelöst', + 'Fired' => 'Blitz wurde ausgelöst', + 'Fired, Red-eye reduction' => 'Blitz wurde ausgelöst, Rote-Augen-Reduzierung', + 'Fired, Red-eye reduction, Return detected' => 'Blitz wurde ausgelöst, Rote-Augen-Reduzierung, Messblitz-Licht zurückgeworfen', + 'Fired, Red-eye reduction, Return not detected' => 'Blitz wurde ausgelöst, Rote-Augen-Reduzierung, kein Messblitz-Licht zurückgeworfen', + 'Fired, Return detected' => 'Messblitz-Licht zurückgeworfen', + 'Fired, Return not detected' => 'Kein Messblitz-Licht zurückgeworfen', + 'No Flash' => 'Blitz wurde nicht ausgelöst', + 'No flash function' => 'Keine Blitzfunktion', + 'Off' => 'Aus', + 'Off, Did not fire' => 'Blitz wurde nicht ausgelöst, Blitz unterdrücken-Modus', + 'Off, Did not fire, Return not detected' => 'Deaktiviert, Blitz wurde nicht ausgelöst, kein Messblitz-Licht zurückgeworfen', + 'Off, No flash function' => 'Deaktiviert, Keine Blitzfunktion', + 'Off, Red-eye reduction' => 'Deaktiviert, Rote-Augen-Reduzierung', + 'On' => 'Ein', + 'On, Did not fire' => 'Ein, Blitz wurde nicht ausgelöst', + 'On, Fired' => 'Blitz wurde ausgelöst, Blitz erzwingen-Modus', + 'On, Red-eye reduction' => 'Blitz wurde ausgelöst, Blitz erzwingen-Modus, Rote-Augen-Reduzierung', + 'On, Red-eye reduction, Return detected' => 'Blitz wurde ausgelöst, Blitz erzwingen-Modus, Rote-Augen-Reduzierung, Messblitz-Licht zurückgeworfen', + 'On, Red-eye reduction, Return not detected' => 'Blitz wurde ausgelöst, Blitz erzwingen-Modus, Rote-Augen-Reduzierung, kein Messblitz-Licht zurückgeworfen', + 'On, Return detected' => 'Blitz wurde ausgelöst, Blitz erzwingen-Modus, Messblitz-Licht zurückgeworfen', + 'On, Return not detected' => 'Blitz wurde ausgelöst, Blitz erzwingen-Modus, kein Messblitz-Licht zurückgeworfen', + }, + }, + 'FlashAction2' => { + PrintConv => { + 'Did not fire' => 'Blitz wurde nicht ausgelöst', + 'Fired' => 'Blitz wurde ausgelöst', + }, + }, + 'FlashActivity' => 'Blitz-Leistung', + 'FlashBatteryLevel' => 'Blitz Batteriestatus', + 'FlashBias' => 'Blitzkorrektur', + 'FlashBits' => { + Description => 'Blitz-Details', + PrintConv => { + '2nd-curtain sync used' => 'Synchronisatiopn auf 2. Verschlußvorhang', + 'Built-in' => 'Integrierter Blitz', + 'External' => 'Extern', + 'FP sync enabled' => 'FP Synchronisation eingestellt', + 'FP sync used' => 'FP Synchronistaion', + 'Manual' => 'Manuell', + }, + }, + 'FlashColorFilter' => 'Blitz Farbfilter', + 'FlashCommanderMode' => { + Description => 'Master-Steuerung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'FlashCompensation' => 'Blitzbelichtungs-Korrektur', + 'FlashControlBuilt-in' => { + PrintConv => { + 'Commander Mode' => 'Master-Steuerung', + }, + }, + 'FlashControlMode' => { + Description => 'Blitzlichtsteuerungsmodus', + PrintConv => { + 'Auto Aperture' => 'Blendenautomatik (AA)', + 'Manual' => 'Manuell', + 'Off' => 'Aus', + 'Repeating Flash' => 'Stroboskopblitz', + }, + }, + 'FlashCurtain' => { + Description => 'Blitzsynchronisation auf Verschluß', + PrintConv => { + '1st' => '1. Vorhang', + '2nd' => '2. Vorhang', + }, + }, + 'FlashDefault' => { + Description => 'Systemblitz', + PrintConv => { + 'Fill Flash' => 'Aufhellblitz', + }, + }, + 'FlashDevice' => { + Description => 'Blitzgerät', + PrintConv => { + 'External' => 'Extern', + 'Internal' => 'Intern', + 'Internal + External' => 'Intern + Extern', + 'None' => 'Keines', + }, + }, + 'FlashDistance' => 'Blitzabstand', + 'FlashEnergy' => 'Blitzstärke', + 'FlashExposureBracketValue' => 'Blitzbelichtungsreihenwert', + 'FlashExposureComp' => 'Blitzbelichtungskorrektur', + 'FlashExposureComp2' => 'Blitzbelichtungskorrektur 2', + 'FlashExposureComp3' => 'Blitzbelichtungskorrektur 3', + 'FlashExposureComp4' => 'Blitzbelichtungskorrektur 4', + 'FlashExposureCompSet' => 'Eingestellte Blitz-Belichtungskorrektur', + 'FlashExposureCompSet2' => 'Blitzbelichtungskorrektur 2', + 'FlashExposureIndicator' => { + Description => 'Blitz-Belichtungsindikator', + PrintConv => { + 'Bottom of Scale' => 'Unterer Wert', + 'Not Indicated' => 'Nicht angezeigt', + 'Over Scale' => 'Wert zu hoch', + 'Top of Scale' => 'Oberer Wert', + 'Under Scale' => 'Wert zu niedrig', + }, + }, + 'FlashExposureIndicatorLast' => { + Description => 'Blitz-Ende-Belichtungsindikator', + PrintConv => { + 'Bottom of Scale' => 'Unterer Wert', + 'Not Indicated' => 'Nicht angezeigt', + 'Over Scale' => 'Wert zu hoch', + 'Top of Scale' => 'Oberer Wert', + 'Under Scale' => 'Wert zu niedrig', + }, + }, + 'FlashExposureIndicatorNext' => { + Description => 'Blitz-Folge-Belichtungsindikator', + PrintConv => { + 'Bottom of Scale' => 'Unterer Wert', + 'Not Indicated' => 'Nicht angezeigt', + 'Over Scale' => 'Wert zu hoch', + 'Top of Scale' => 'Oberer Wert', + 'Under Scale' => 'Wert zu niedrig', + }, + }, + 'FlashExposureLock' => { + Description => 'Blitzbelichtung-Speicherung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'FlashFired' => { + Description => 'Blitz wurde ausgelöst', + PrintConv => { + 'False' => 'Nein', + 'No' => 'Nein', + 'True' => 'Ja', + 'Yes' => 'Ja', + }, + }, + 'FlashFiring' => { + Description => 'Blitzzündung', + PrintConv => { + 'Does not fire' => 'Unterdrückt', + 'Fires' => 'Aktiv', + }, + }, + 'FlashFirmwareVersion' => 'Blitz-Firmware-Version', + 'FlashFocalLength' => 'Blitz-Brennweite', + 'FlashFunction' => { + Description => 'Blitzfunktion', + PrintConv => { + 'Built-in flash' => 'Integrierter Blitz', + 'False' => 'Nein', + 'Manual' => 'Manuell', + 'No flash' => 'Kein Blitz', + 'Strobe' => 'Stroboskop', + 'True' => 'Ja', + }, + }, + 'FlashGNDistance' => { + Description => 'Blitzleitzahl Entfernung', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FlashGroupACompensation' => 'Gruppe A, Blitzbelichtungs-Korrektur', + 'FlashGroupAControlMode' => { + Description => 'Gruppe A, Blitzlichtsteuerungsmodus', + PrintConv => { + 'Auto Aperture' => 'Blendenautomatik (AA)', + 'Manual' => 'Manuell', + 'Off' => 'Aus', + 'Repeating Flash' => 'Stroboskopblitz', + }, + }, + 'FlashGroupAOutput' => 'Gruppe A, Blitz-Leistung', + 'FlashGroupBCompensation' => 'Gruppe B, Blitzbelichtungs-Korrektur', + 'FlashGroupBControlMode' => { + Description => 'Gruppe B, Blitzlichtsteuerungsmodus', + PrintConv => { + 'Auto Aperture' => 'Blendenautomatik (AA)', + 'Automatic' => 'Automatik', + 'Manual' => 'Manuell', + 'Off' => 'Aus', + 'Repeating Flash' => 'Stroboskopblitz', + }, + }, + 'FlashGroupBOutput' => 'Gruppe B, Blitz-Leistung', + 'FlashGroupCCompensation' => 'Gruppe C, Blitzbelichtungs-Korrektur', + 'FlashGroupCControlMode' => { + Description => 'Gruppe C, Blitzlichtsteuerungsmodus', + PrintConv => { + 'Auto Aperture' => 'Blendenautomatik (AA)', + 'Manual' => 'Manuell', + 'Off' => 'Aus', + 'Repeating Flash' => 'Stroboskopblitz', + }, + }, + 'FlashGroupCOutput' => 'Gruppe C, Blitz-Leistung', + 'FlashGuideNumber' => 'Blitzleitzahl', + 'FlashInfo' => 'Blitz-Informationen', + 'FlashInfoVersion' => 'Blitz-Informationen-Version', + 'FlashIntensity' => { + Description => 'Blitz Stärke', + PrintConv => { + 'High' => 'Hoch', + 'Strong' => 'Stark', + }, + }, + 'FlashLevel' => { + Description => 'Blitzbelichtungskorr.', + PrintConv => { + 'High' => 'Hoch', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FlashMake' => 'Blitzgerätehersteller', + 'FlashMetering' => { + Description => 'Blitz-Messung', + PrintConv => { + 'Manual flash control' => 'Manuelle Blitz-Kontrolle', + 'Pre-flash TTL' => 'Vorblitz TTL', + }, + }, + 'FlashMeteringMode' => { + Description => 'Blitz-Belichtungsmessmethode', + PrintConv => { + 'External Auto' => 'Extern Automatisch', + 'External Manual' => 'Extern Manuell', + 'Off' => 'Aus', + }, + }, + 'FlashMeteringSegments' => 'Blitz-Messfelder', + 'FlashMode' => { + Description => 'Blitz-Modus', + PrintConv => { + '2nd Curtain' => 'Auf 2. Verschlußvorhang', + 'Auto' => 'Automatisch', + 'Auto, Did not fire' => 'Auto, nicht ausgelöst', + 'Auto, Did not fire, Red-eye reduction' => 'Auto, nicht ausgelöst, Rote-Augen-Reduzierung', + 'Auto, Fired' => 'Auto, ausgelöst', + 'Auto, Fired, Red-eye reduction' => 'Auto, ausgelöst, Rote-Augen-Reduzierung', + 'Did Not Fire' => 'Nicht ausgelöst', + 'Disabled' => 'Deaktiviert', + 'External, Auto' => 'Extern, Auto', + 'External, Contrast-control Sync' => 'Extern, Kontrast-Steuerungs-Synchronisation', + 'External, Flash Problem' => 'Extern, Blitzproblem?', + 'External, High-speed Sync' => 'Extern, High-Speed-Synchronisation', + 'External, Manual' => 'Extern, Manuell', + 'External, P-TTL Auto' => 'Extern, P-TTL-Blitzautomatik', + 'External, Wireless' => 'Extern, Drahtlos', + 'External, Wireless, High-speed Sync' => 'Extern, Drahtlos, High-Speed-Synchronisation', + 'Fill flash' => 'Aufhellblitz', + 'Fill-in' => 'Aufhellen', + 'Fired, Commander Mode' => 'Ausgelöst, Befehlsmodus', + 'Fired, External' => 'Ausgelöst, Extern', + 'Fired, Manual' => 'Ausgelöst, Manuell', + 'Fired, TTL Mode' => 'Ausgelöst, TTL-Modus', + 'Internal' => 'Intern', + 'Not Ready' => 'Nicht bereit', + 'Off' => 'Aus', + 'Off, Did not fire' => 'Aus', + 'Off?' => 'Aus?', + 'On' => 'Ein', + 'On, Did not fire' => 'Ein, nicht ausgelöst', + 'On, Did not fire, Wireless (Master)' => 'Ein, nicht ausgelöst, Drahtlos (Hauptblitz)', + 'On, Fired' => 'Ein', + 'On, Red-eye reduction' => 'Ein, Rote-Augen-Reduzierung', + 'On, Slow-sync' => 'Ein, Langzeit-Synchronisation', + 'On, Slow-sync, Red-eye reduction' => 'Ein, Langzeit-Synchronisation, Rote-Augen-Reduzierung', + 'On, Soft' => 'Ein, Softblitz', + 'On, Trailing-curtain Sync' => 'Ein, 2. Verschlussvorhang', + 'On, Wireless (Control)' => 'Ein, Drahtlos (Steuerblitz)', + 'On, Wireless (Master)' => 'Ein, Drahtlos (Hauptblitz)', + 'Rear flash sync' => 'Synchronisation auf den zweiten Verschlussvorhang', + 'Red eye' => 'Rote-Augen-Reduzierung', + 'Red-eye' => 'Rote Augen', + 'Red-eye Reduction' => 'Rote-Augen-Reduzierung', + 'Red-eye reduction' => 'Rote-Augen-Reduzierung', + 'Unknown' => 'Unbekannt', + 'Wireless' => 'Drahtlos', + 'n/a - Off-Auto-Aperture' => 'K/A - Blendenring nicht auf A', + }, + }, + 'FlashModel' => { + Description => 'Blitz-Modell', + PrintConv => { + 'None' => 'Keines', + }, + }, + 'FlashOptions' => { + Description => 'Blitz-Optionen', + PrintConv => { + 'Auto' => 'Automatisch', + 'Auto, Red-eye reduction' => 'Auto, Rote-Augen-Reduzierung', + 'Red-eye reduction' => 'Rote-Augen-Reduzierung', + 'Slow-sync' => 'Langzeit-Synchronisation', + 'Slow-sync, Red-eye reduction' => 'Langzeit-Synchronisation, Rote-Augen-Reduzierung', + 'Trailing-curtain Sync' => '2. Verschlussvorhang', + 'Wireless (Control)' => 'Drahtlos (Steuerblitz)', + 'Wireless (Master)' => 'Drahtlos (Hauptblitz)', + }, + }, + 'FlashOptions2' => { + Description => 'Blitz-Optionen (2)', + PrintConv => { + 'Auto' => 'Automatisch', + 'Auto, Red-eye reduction' => 'Auto, Rote-Augen-Reduzierung', + 'Red-eye reduction' => 'Rote-Augen-Reduzierung', + 'Slow-sync' => 'Langzeit-Synchronisation', + 'Slow-sync, Red-eye reduction' => 'Langzeit-Synchronisation, Rote-Augen-Reduzierung', + 'Trailing-curtain Sync' => '2. Verschlussvorhang', + 'Wireless (Control)' => 'Drahtlos (Steuerblitz)', + 'Wireless (Master)' => 'Drahtlos (Hauptblitz)', + }, + }, + 'FlashOutput' => 'Blitzstärke', + 'FlashRedEyeMode' => { + Description => 'Blitz Rote-Augen-Modus', + PrintConv => { + 'False' => 'Nein', + 'True' => 'Ja', + }, + }, + 'FlashRemoteControl' => { + Description => 'Blitz Fernauslöser', + PrintConv => { + 'Off' => 'Aus', + }, + }, + 'FlashReturn' => { + Description => 'Blitz Reflexion', + PrintConv => { + 'No return detection' => 'Keine Erkennung', + 'Return detected' => 'Reflexion erkannt', + 'Return not detected' => 'Reflexion nicht erkannt', + 'Subject Inside Flash Range' => 'Objekt innerhalb der Blitzreichweite', + 'Subject Outside Flash Range' => 'Objekt ausserhalb der Blitzreichweite', + }, + }, + 'FlashSerialNumber' => 'Blitz-Seriennummer', + 'FlashSetting' => 'Blitzeinstellung', + 'FlashShutterSpeed' => 'Längste Verschlussz. (Blitz)', + 'FlashStatus' => { + Description => 'Slave-Blitz-Messfeld 1', + PrintConv => { + 'Built-in Flash present' => 'Integrierter Blitz vorhanden', + 'Built-in Flash present and fired' => 'Integrierter Blitz vorhanden und ausgelöst', + 'External Flash present' => 'Externer Blitz vorhanden', + 'External Flash present and fired' => 'Externer Blitz vorhanden und ausgelöst', + 'External, Did not fire' => 'Extern, nicht ausgelöst', + 'External, Fired' => 'Extern, ausgelöst', + 'Internal, Did not fire' => 'Intern, nicht ausgelöst', + 'Internal, Did not fire (0x08)' => 'Intern, nicht ausgelöst', + 'Internal, Fired' => 'Intern, ausgelöst', + 'No Flash present' => 'Kein Blitz vorhanden', + 'Off' => 'Aus', + 'Off (1)' => 'Aus (1)', + }, + }, + 'FlashSyncMode' => 'Blitz-Synchronisationsmodus', + 'FlashSyncSpeed' => 'Blitzsynchronzeit', + 'FlashSyncSpeedAv' => { + Description => 'Blitzsynchronzeit bei Av', + PrintConv => { + '1/200 Fixed' => '1/200 Fest', + '1/200-1/60 Auto' => '1/200-1/60 automatisch', + '1/250 Fixed' => '1/250 Fest', + '1/250-1/60 Auto' => '1/200-1/60 automatisch', + '1/300 Fixed' => '1/300 Fest', + 'Auto' => 'Automatisch', + }, + }, + 'FlashTTLMode' => 'Blitz TTL-Modus', + 'FlashType' => { + Description => 'Blitztyp', + PrintConv => { + 'Built-In Flash' => 'Intern', + 'External' => 'Extern', + 'None' => 'Keiner', + }, + }, + 'FlashWarning' => { + Description => 'Blitzsymbol', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'FlashpixVersion' => 'Unterstützte Flashpix-Version', + 'FlickerReduce' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'FlipHorizontal' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'FocalLength' => 'Brennweite', + 'FocalLength35efl' => 'Brennweite', + 'FocalLengthIn35mmFormat' => 'Brennweite in 35 mm-Kleinbildformat', + 'FocalPlaneDiagonal' => 'Diagonale des Sensors', + 'FocalPlaneResolutionUnit' => { + Description => 'Einheit der Sensorauflösung', + PrintConv => { + 'None' => 'Keine', + 'inches' => 'Zoll', + 'um' => 'µm (Mikrometer)', + }, + }, + 'FocalPlaneXResolution' => 'Sensorauflösung horizontal', + 'FocalPlaneXSize' => 'Sensorgröße horizontal', + 'FocalPlaneXUnknown' => 'Sensorgröße horizontal unbekannt', + 'FocalPlaneYResolution' => 'Sensorauflösung vertikal', + 'FocalPlaneYSize' => 'Sensorgröße vertikal', + 'FocalPlaneYUnknown' => 'Sensorgröße vertikal unbekannt', + 'FocalType' => { + Description => 'Objektivart', + PrintConv => { + 'Fixed' => 'Festbrennweite', + 'Zoom' => 'Zoom-Objektiv', + }, + }, + 'FocalUnits' => 'Fokussiereinheit', + 'Focus' => { + Description => 'Schärfepriorität', + PrintConv => { + 'Auto-focus Didn\'t Lock' => 'Autofokus nicht gesperrt', + 'Auto-focus Locked' => 'Autofokus gesperrt', + 'Manual' => 'Manuell', + }, + }, + 'FocusArea' => { + Description => 'Fokus-Bereich', + PrintConv => { + 'Spot Focus' => 'Spot-AF-Messfeld', + 'Wide Focus (normal)' => 'Großes AF-Messfeld (normal)', + }, + }, + 'FocusAreaSelection' => { + Description => 'Scrollen bei Messfeldauswahl', + PrintConv => { + 'No Wrap' => 'Am Rand stoppen', + 'Wrap' => 'Umlaufend', + }, + }, + 'FocusContinuous' => { + Description => 'Fortlaufende Fokussierung', + PrintConv => { + 'Continuous' => 'Serienaufnahme', + 'Manual' => 'Manuell', + }, + }, + 'FocusDisplayAIServoAndMF' => { + PrintConv => { + 'Disable' => 'Deaktiviert', + 'Enable' => 'Aktiviert', + }, + }, + 'FocusDistance' => 'Fokus-Distanz', + 'FocusDistanceLower' => 'Nahe Fokus-Distanz', + 'FocusDistanceUpper' => 'Entfernte Fokus-Distanz', + 'FocusInfoVersion' => 'FokusInfo Version', + 'FocusMode' => { + Description => 'Fokus-Modus', + PrintConv => { + 'AF-C' => 'AF-C (Kontinuierlicher Autofokus)', + 'AF-S' => 'AF-S (Einzelautofokus)', + 'AI Focus AF' => 'AI Fokus AF', + 'Auto' => 'Automatisch', + 'Continuous' => 'Serienaufnahme', + 'Custom' => 'Benutzerdefiniert', + 'Face detect' => 'Gesichtserkennung AF', + 'Infinity' => 'Unendlich', + 'Macro' => 'Makro', + 'Macro (1)' => 'Makro (1)', + 'Macro (2)' => 'Makro (2)', + 'Manual' => 'Manuell', + 'Manual Focus (3)' => 'Manueller Fokus (3)', + 'Manual Focus (6)' => 'Manueller Fokus (6)', + 'Multi AF' => 'Mehrpunkt AF', + 'One-shot AF' => 'One-Shot AF', + 'Pan Focus' => 'Pan-Fokus', + 'Single' => 'Einzelbild', + 'Single AF' => 'Einpunkt AF', + 'Super Macro' => 'Super-Makro', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'FocusMode2' => { + Description => 'Fokus-Modus 2', + PrintConv => { + 'AF-C' => 'AF-C (Kontinuierlicher Autofokus)', + 'AF-S' => 'AF-S (Einzelautofokus)', + 'Manual' => 'Manuell', + }, + }, + 'FocusModeSetting' => { + Description => 'Autofokus', + PrintConv => { + 'AF-A' => 'AF-Automatik', + 'AF-C' => 'AF-C (Kontinuierlicher Autofokus)', + 'AF-S' => 'AF-S (Einzelautofokus)', + 'Manual' => 'Manuell', + }, + }, + 'FocusModeSwitch' => { + Description => 'Fokus-Modus Schalter', + PrintConv => { + 'Manual' => 'Manuell', + }, + }, + 'FocusPixel' => 'Fokus-Pixel', + 'FocusPointWrap' => { + Description => 'Scrollen bei Messfeldauswahl', + PrintConv => { + 'No Wrap' => 'Am Rand stoppen', + 'Wrap' => 'Umlaufend', + }, + }, + 'FocusPos' => 'Fokus-Position', + 'FocusPosition' => 'Fokus-Distanz', + 'FocusProcess' => { + Description => 'Fokussierung', + PrintConv => { + 'AF Not Used' => 'Ohne AF', + 'AF Used' => 'Mit AF', + }, + }, + 'FocusRange' => { + Description => 'Fokus-Bereich', + PrintConv => { + 'Auto' => 'Automatisch', + 'Close' => 'Nah', + 'Far Range' => 'Entfernt', + 'Infinity' => 'Unendlich', + 'Macro' => 'Makro', + 'Manual' => 'Manuell', + 'Middle Range' => 'Mittlerer Bereich', + 'Not Known' => 'Nicht bekannt', + 'Pan Focus' => 'Pan-Fokus', + 'Super Macro' => 'Super-Makro', + 'Very Close' => 'Sehr nah', + }, + }, + 'FocusStepCount' => 'Fokus-Stufenzähler', + 'FocusStepInfinity' => 'Fokus-Stufe Unendlich', + 'FocusStepNear' => 'Fokus-Stufe Nah', + 'FocusTrackingLockOn' => { + Description => 'Schärfenarchiv. mit Lock-On', + PrintConv => { + '1 (Short)' => '5 (Kurz)', + '1 Short' => '1 Kurz', + '5 (Long)' => '5 (Lang)', + '5 Long' => '5 Lang', + 'Long' => 'Lang', + 'Off' => 'Aus', + 'Short' => 'Kurz', + }, + }, + 'FocusWarning' => { + Description => 'Fokus-Warnung', + PrintConv => { + 'Good' => 'OK', + 'Out of focus' => 'Ausserhalb des Fokus', + }, + }, + 'FocusingScreen' => 'Mattscheibe', + 'FolderName' => 'Ordner-Name', + 'FrameHeight' => 'Bereichshöhe', + 'FrameNumber' => 'Bildnummer', + 'FrameRate' => 'Bildwechselfrequenz', + 'FrameSize' => 'Einzelbildgröße', + 'FrameWidth' => 'Bereichsbreite', + 'FreeByteCounts' => 'Anzahl Bytes des leeren Datenbereiches', + 'FreeMemoryCardImages' => 'Platz auf Speicherkarten für', + 'FreeOffsets' => 'Leerdatenposition', + 'FujiFlashMode' => { + Description => 'Blitz-Modus', + PrintConv => { + 'Auto' => 'Automatisch', + 'External' => 'Externer Blitz', + 'Off' => 'Unterdrückter Blitz', + 'On' => 'Erzwungener Blitz', + 'Red-eye reduction' => 'Rote-Augen-Reduzierung', + }, + }, + 'FullImageSize' => 'Volle Bildgröße', + 'FunctionButton' => { + Description => 'Funktionstaste', + PrintConv => { + 'AF-area Mode' => 'Messfeldsteuerung', + 'Auto Bracketing' => 'Belichtungsreihe', + 'Center AF Area' => 'AF-Messfeldgröße', + 'Center-weighted' => 'Mittenbetont', + 'FV Lock' => 'FV-Messwertspeicher', + 'Flash Off' => 'Blitz aus', + 'Framing Grid' => 'Gitterlinien', + 'ISO Display' => 'ISO-Anzeige', + 'Image Quality' => 'Bildqualität', + 'Matrix Metering' => 'Matrixmessung', + 'Spot Metering' => 'Spotmessung', + 'White Balance' => 'Weißabgleich', + }, + }, + 'GEImageSize' => 'GE Bildgröße', + 'GIFVersion' => 'GIF-Version', + 'GPSAltitude' => 'GPS Höhe', + 'GPSAltitudeRef' => { + Description => 'GPS-Höhe Bezug', + PrintConv => { + 'Above Sea Level' => 'Höhe über Normal-Null (Meeresspiegel)', + 'Below Sea Level' => 'Höhe unter Normal-Null (Meeresspiegel)', + }, + }, + 'GPSAreaInformation' => 'Name des GPS-Gebietes', + 'GPSDOP' => 'Messgenauigkeit', + 'GPSDateStamp' => 'GPS Datum', + 'GPSDateTime' => 'GPS Zeitstempel', + 'GPSDestBearing' => 'Motivrichtung', + 'GPSDestBearingRef' => { + Description => 'Referenz für Motivrichtung', + PrintConv => { + 'Magnetic North' => 'Magnetische Ausrichtung', + 'True North' => 'Geographische Ausrichtung', + }, + }, + 'GPSDestDistance' => 'GPS Zielentfernung', + 'GPSDestDistanceRef' => { + Description => 'GPS-Zielentfernung Maßeinheit', + PrintConv => { + 'Kilometers' => 'Kilometer', + 'Miles' => 'Meilen', + 'Nautical Miles' => 'Knoten', + }, + }, + 'GPSDestLatitude' => 'Breite des Zieles', + 'GPSDestLatitudeRef' => { + Description => 'Referenz für die Breite des Zieles', + PrintConv => { + 'North' => 'Nördliche Breite', + 'South' => 'Südliche Breite', + }, + }, + 'GPSDestLongitude' => 'Längengrad des Ziels', + 'GPSDestLongitudeRef' => { + Description => 'Referenz für die Länge des Zieles', + PrintConv => { + 'East' => 'Östliche Länge', + 'West' => 'Westliche Länge', + }, + }, + 'GPSDifferential' => { + Description => 'GPS Differentialkorrektur', + PrintConv => { + 'Differential Corrected' => 'Differentialkorrektur angewandt', + 'No Correction' => 'Messung ohne Differentialkorrektur', + }, + }, + 'GPSImgDirection' => 'Bildrichtung', + 'GPSImgDirectionRef' => { + Description => 'Referenz für die Ausrichtung des Bildes', + PrintConv => { + 'Magnetic North' => 'Magnetische Ausrichtung', + 'True North' => 'Geographische Ausrichtung', + }, + }, + 'GPSInfo' => 'GPS Info IFD-Zeiger', + 'GPSLatitude' => 'Geografische Breite', + 'GPSLatitudeRef' => { + Description => 'Nördl. oder südl. Breite', + PrintConv => { + 'North' => 'Nördliche Breite', + 'South' => 'Südliche Breite', + }, + }, + 'GPSLongitude' => 'Geografische Länge', + 'GPSLongitudeRef' => { + Description => 'östl. oder westl. Länge', + PrintConv => { + 'East' => 'Östliche Länge', + 'West' => 'Westliche Länge', + }, + }, + 'GPSMapDatum' => 'Geodätisches Datum', + 'GPSMeasureMode' => { + Description => 'GPS Messverfahren', + PrintConv => { + '2-D' => '2-Dimensionale Messung', + '2-Dimensional' => '2-Dimensionale Messung', + '2-Dimensional Measurement' => '2-Dimensionale Messung', + '3-D' => '3-Dimensionale Messung', + '3-Dimensional' => '3-Dimensionale Messung', + '3-Dimensional Measurement' => '3-Dimensionale Messung', + }, + }, + 'GPSProcessingMethod' => 'Name der GPS-Verarbeitungsmethode', + 'GPSSatellites' => 'Für die Messung verwendete Satelliten', + 'GPSSpeed' => 'Geschwindigkeit des GPS-Empfängers', + 'GPSSpeedRef' => { + Description => 'Geschwindigkeitseinheit', + PrintConv => { + 'km/h' => 'Kilometer pro Stunde', + 'knots' => 'Knoten', + 'mph' => 'Meilen pro Stunde', + }, + }, + 'GPSStatus' => { + Description => 'GPS-Empfänger Status', + PrintConv => { + 'Measurement Active' => 'Messung aktiv', + 'Measurement Void' => 'Messung ungültig', + }, + }, + 'GPSTimeStamp' => 'GPS-Zeit UTC', + 'GPSTrack' => 'Bewegungsrichtung', + 'GPSTrackRef' => { + Description => 'Referenz für Bewegungsrichtung', + PrintConv => { + 'Magnetic North' => 'Magnetische Ausrichtung', + 'True North' => 'Geographische Ausrichtung', + }, + }, + 'GPSVersionID' => 'GPS-Tag-Version', + 'GainControl' => { + Description => 'Belichtungsverstärkung', + PrintConv => { + 'High gain down' => 'Hohe Helligkeitsminderung', + 'High gain up' => 'Hohe Helligkeitsverstärkung', + 'Low gain down' => 'Geringe Helligkeitsminderung', + 'Low gain up' => 'Geringe Helligkeitsverstärkung', + 'None' => 'Keine', + }, + }, + 'Gapless' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'Gradation' => { + PrintConv => { + 'Auto-Override' => 'Automatisch', + 'High Key' => 'High-Key', + 'Low Key' => 'Low-Key', + 'User-Selected' => 'Benutzerauswahl', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'GrayResponseUnit' => { + PrintConv => { + '0.0001' => 'Nummer stellt ein 1000tel einer Einheit dar', + '0.001' => 'Nummer stellt ein 100tel einer Einheit dar', + '0.1' => 'Nummer stellt ein 10tel einer Einheit dar', + '1e-05' => 'Nummer stellt ein 10000tel einer Einheit dar', + '1e-06' => 'Nummer stellt ein 100000tel einer Einheit dar', + }, + }, + 'GrayTRC' => 'Grau-Tonwertwiedergabe-Kurve', + 'GreenAdjust' => 'Grün-Korrektur', + 'GreenMatrixColumn' => 'Grün-Matrixspalte', + 'GreenTRC' => 'Grün-Tonwertwiedergabe-Kurve', + 'GreenX' => 'Grünpunkt X', + 'GreenY' => 'Grünpunkt Y', + 'GridDisplay' => { + Description => 'Gitterlinien', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'GripBatteryADLoad' => 'Griffbatterie A/D unter Last', + 'GripBatteryADNoLoad' => 'Griffbatterie A/D im Leerlauf', + 'GripBatteryState' => { + Description => 'Griffbatterie-Status', + PrintConv => { + 'Almost Empty' => 'Fast leer', + 'Empty or Missing' => 'Leer oder nicht vorhanden', + 'Full' => 'Voll geladen', + 'Running Low' => 'Schwach', + }, + }, + 'Grouping' => 'Gruppierung', + 'HDR' => { + Description => 'Auto HDR', + PrintConv => { + 'Off' => 'Aus', + }, + }, + 'HDRImageType' => { + Description => 'HDR Bildtyp', + PrintConv => { + 'HDR Image' => 'HDR Bild', + 'Original Image' => 'Originalbild', + }, + }, + 'Headline' => 'Ãœberschrift', + 'HeightResolution' => 'Vertikale Bildauflösung', + 'HierarchicalSubject' => 'Hierarchische Schlüsselwörter', + 'HighISONoiseReduction' => { + Description => 'Rauschunterdrückung bei hoher Empfindlichkeit', + PrintConv => { + '+1 (medium strong)' => '+1', + '+2 (strong)' => '+2 (Stark)', + '+3 (very strong)' => '+3', + '+4 (strongest)' => '+4', + '-1 (medium weak)' => '-1', + '-2 (weak)' => '-2 (Gering)', + '-3 (very weak)' => '-3', + '-4 (weakest)' => '-4 (Sehr gering)', + '0 (normal)' => '0 (Normal)', + 'Auto' => 'Automatisch', + 'High' => 'Stärker', + 'Low' => 'Schwächer', + 'Off' => 'Aus', + 'On' => 'Ein', + 'Strong' => 'Stark', + 'Weak' => 'Gering', + 'Weakest' => 'Sehr gering', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'HighISONoiseReduction2' => { + Description => 'Rauschunterdrückung bei hoher Empfindlichkeit', + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Niedrig', + 'Off' => 'Aus', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'HighLowKeyAdj' => 'High-/Low-Key Abstimmung', + 'Highlight' => 'Helle Stellen', + 'HighlightTonePriority' => { + Description => 'Tonwert Priorität', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'HometownCity' => 'Heimatort', + 'HometownCityCode' => 'Heimatort-Code', + 'HometownDST' => { + Description => 'Heimatort Sommerzeit (DST)', + PrintConv => { + 'No' => 'Deaktiviert', + 'Yes' => 'Aktiviert', + }, + }, + 'Hue' => 'Farbton', + 'HueAdj' => 'Farbtonkorrektur', + 'HueAdjust' => { + Description => 'Farbtonkorrektur', + PrintConv => { + 'Cool' => 'Kühl', + 'Off' => 'Aus', + 'Yellow' => 'Gelb', + }, + }, + 'HueAdjustment' => 'Farbtonkorrektur', + 'HueSetting' => 'Farbtoneinstellung', + 'HuffmanTable' => 'Huffman Tabelle', + 'HyperfocalDistance' => 'Hyperfokale Entfernung', + 'ICCProfile' => 'ICC-Profil', + 'ICCProfileName' => 'ICC-Profil Name', + 'ICC_Profile' => 'ICC-Profil', + 'ID3Size' => 'ID3 Datenlänge', + 'IDCCreativeStyle' => { + PrintConv => { + 'Autumn Leaves' => 'Herbstlaub', + 'B&W' => 'Schwarz/Weiß', + 'Landscape' => 'Landschaft', + 'Night View' => 'Abendszene', + 'Portrait' => 'Porträt', + 'Sunset' => 'Sonnenuntergang', + }, + }, + 'IDCPreviewImage' => 'IDC Vorschaubild', + 'IDCPreviewLength' => 'IDC Vorschaubild-Datenlänge', + 'IDCPreviewStart' => 'IDC Vorschaubild-Datenposition', + 'IPTC-NAA' => 'IPTC-NAA Metadaten', + 'IPTCDigest' => 'IPTC Kennwert', + 'IPTCImageHeight' => 'IPTC-Bildhöhe', + 'IPTCImageRotation' => { + Description => 'IPTC Bildausrichtung', + PrintConv => { + '0' => 'Normal', + '180' => '180° gedreht', + '270' => '90° gegen den Uhrzeigersinn', + '90' => '90° im Uhrzeigersinn', + }, + }, + 'IPTCImageWidth' => 'IPTC-Bildbreite', + 'IPTCPictureNumber' => 'IPTC Bildnummer', + 'IPTCPixelHeight' => 'IPTC-Pixelhöhe', + 'IPTCPixelWidth' => 'IPTC-Pixelbreite', + 'ISO' => 'ISO-Empfindlichkeit', + 'ISO2' => 'ISO-Empfindlichkeit (2)', + 'ISOAuto' => 'ISO-Automatik', + 'ISODisplay' => 'ISO-Anzeige', + 'ISOExpansion' => { + Description => 'ISO-Erweiterung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ISOExpansion2' => { + Description => 'ISO-Erweiterung (2)', + PrintConv => { + 'Off' => 'Aus', + }, + }, + 'ISOFloor' => 'ISO-Untergrenze', + 'ISOInfo' => 'ISO-Informationen', + 'ISOSelection' => 'ISO-Auswahl', + 'ISOSetting' => { + Description => 'ISO-Einstellung', + PrintConv => { + '200 (Zone Matching High)' => '200 (Zonenabgleich High)', + '80 (Zone Matching Low)' => '80 (Zonenabgleich Low)', + 'Auto' => 'Automatisch', + 'Manual' => 'Manuell', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ISOSpeedExpansion' => { + Description => 'ISO-Erweiterung', + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'ISOSpeedIncrements' => { + Description => 'ISO-Schrittweite', + PrintConv => { + '1 Stop' => '1 LW', + '1/3 Stop' => '1/3 LW', + }, + }, + 'ISOSpeedRange' => { + Description => 'Einstellung ISO-Bereich', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'ISOStepSize' => { + Description => 'ISO-Schrittweite', + PrintConv => { + '1 EV' => '1 LW', + '1/2 EV' => '1/2 LW', + '1/3 EV' => '1/3 LW', + }, + }, + 'ISRCNumber' => 'ISRC Nummer', + 'Illumination' => { + Description => 'Displaybeleuchtung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Image::ExifTool::APP12::PictureInfo' => 'APP12 Bildinformation', + 'Image::ExifTool::Canon::AFMicroAdj' => 'Canon AF Feinabstimmung', + 'Image::ExifTool::Canon::CameraInfo1000D' => 'Canon KameraInfo 1000D', + 'Image::ExifTool::Canon::CameraInfo1D' => 'Canon KameraInfo 1D', + 'Image::ExifTool::Canon::CameraInfo1DX' => 'Canon KameraInfo 1DX', + 'Image::ExifTool::Canon::CameraInfo1DmkII' => 'Canon KameraInfo 1DmkII', + 'Image::ExifTool::Canon::CameraInfo1DmkIII' => 'Canon KameraInfo 1DmkIII', + 'Image::ExifTool::Canon::CameraInfo1DmkIIN' => 'Canon KameraInfo 1DmkIIN', + 'Image::ExifTool::Canon::CameraInfo1DmkIV' => 'Canon KameraInfo 1DmkIV', + 'Image::ExifTool::Canon::CameraInfo40D' => 'Canon KameraInfo 40D', + 'Image::ExifTool::Canon::CameraInfo450D' => 'Canon KameraInfo 450D', + 'Image::ExifTool::Canon::CameraInfo500D' => 'Canon KameraInfo 500D', + 'Image::ExifTool::Canon::CameraInfo50D' => 'Canon KameraInfo 50D', + 'Image::ExifTool::Canon::CameraInfo550D' => 'Canon KameraInfo 550D', + 'Image::ExifTool::Canon::CameraInfo5D' => 'Canon KameraInfo 5D', + 'Image::ExifTool::Canon::CameraInfo5DmkII' => 'Canon KameraInfo 5DmkII', + 'Image::ExifTool::Canon::CameraInfo5DmkIII' => 'Canon KameraInfo 5DmkIII', + 'Image::ExifTool::Canon::CameraInfo600D' => 'Canon KameraInfo 600D', + 'Image::ExifTool::Canon::CameraInfo60D' => 'Canon KameraInfo 60D', + 'Image::ExifTool::Canon::CameraInfo650D' => 'Canon KameraInfo 650D', + 'Image::ExifTool::Canon::CameraInfo7D' => 'Canon KameraInfo 7D', + 'Image::ExifTool::Canon::CameraInfoPowerShot' => 'Canon KameraInfo PowerShot', + 'Image::ExifTool::Canon::CameraInfoPowerShot2' => 'Canon KameraInfo PowerShot2', + 'Image::ExifTool::Canon::CameraInfoUnknown32' => 'Canon KameraInfo Unbekannt32', + 'Image::ExifTool::Canon::CropInfo' => 'Canon Ausschnitt Info', + 'Image::ExifTool::CanonRaw::ImageFormat' => 'CanonRaw Bildformat', + 'Image::ExifTool::DNG::OriginalRaw' => 'DNG Original RAW', + 'Image::ExifTool::ICC_Profile::Measurement' => 'ICC_Profil Messung', + 'Image::ExifTool::IPTC::ApplicationRecord' => 'IPTC Modell', + 'Image::ExifTool::Jpeg2000::FileType' => 'Jpeg2000 Dateityp', + 'Image::ExifTool::Jpeg2000::ImageHeader' => 'Jpeg2000 Bild-Header', + 'Image::ExifTool::Kodak::CameraInfo' => 'Kodak KameraInfo', + 'Image::ExifTool::MIE::Meta' => 'MIE Metadaten', + 'Image::ExifTool::Minolta::CameraInfoA100' => 'Minolta KameraInfo A100', + 'Image::ExifTool::Olympus::CameraSettings' => 'Olympus Kameraeinstellungen', + 'Image::ExifTool::Olympus::FocusInfo' => 'Olympus FokusInfo', + 'Image::ExifTool::Olympus::ImageProcessing' => 'Olympus Bildverarbeitung', + 'Image::ExifTool::PNG::ImageHeader' => 'PNG Bild-Header', + 'Image::ExifTool::PNG::PhysicalPixel' => 'PNG physikalische Pixel', + 'Image::ExifTool::PNG::PrimaryChromaticities' => 'PNG primäre Chromatizität', + 'Image::ExifTool::PNG::StereoImage' => 'PNG Stereobild', + 'Image::ExifTool::PNG::TextualData' => 'PNG Textdaten', + 'Image::ExifTool::PNG::VirtualPage' => 'PNG virtuelle Seite', + 'Image::ExifTool::PSP::Creator' => 'PSP Ersteller', + 'Image::ExifTool::Pentax::CameraInfo' => 'Pentax KameraInfo', + 'Image::ExifTool::Sony::CameraInfo' => 'Sony KameraInfo', + 'Image::ExifTool::Sony::CameraInfo2' => 'Sony KameraInfo2', + 'ImageAdjustment' => 'Bildanpassung', + 'ImageAreaOffset' => 'Bildbereichsoffset', + 'ImageAuthentication' => { + Description => 'Bild-Authentifikation', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ImageBoundary' => 'Bildbegrenzung', + 'ImageByteCount' => 'Anzahl Bytes der Bilddaten', + 'ImageCount' => 'Bildzähler', + 'ImageDataDiscard' => { + Description => 'Verworfene Bilddaten', + PrintConv => { + 'Flexbits Discarded' => 'FlexBits verworfen', + 'Full Resolution' => 'Volle Auflösung', + 'HighPass Frequency Data Discarded' => 'Hochpass-Frequenz-Daten verworfen', + 'Highpass and LowPass Frequency Data Discarded' => 'Hochpass- und Tiefpass-Frequenz-Daten verworfen', + }, + }, + 'ImageDataSize' => 'Bilddatengröße', + 'ImageDescription' => 'Bildbeschreibung', + 'ImageDustOff' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ImageEditCount' => 'Bildverarbeitungszähler', + 'ImageEditing' => { + Description => 'Bildverarbeitung', + PrintConv => { + 'Cropped' => 'Beschnitten', + 'Digital Filter' => 'Digitalfilter', + 'Frame Synthesis?' => 'Rahmen?', + 'None' => 'Unbearbeitet', + }, + }, + 'ImageEffects' => { + PrintConv => { + 'High Key' => 'High-Key', + }, + }, + 'ImageGeneration' => { + Description => 'Bilderstellung', + PrintConv => { + 'Original Image' => 'Originalbild', + 'Re-developed from RAW' => 'RAW generiert', + }, + }, + 'ImageHeight' => 'Bildhöhe', + 'ImageHistory' => 'Bild-Historie', + 'ImageLength' => 'Bild-Datenlänge', + 'ImageNumber' => 'Bildnummer', + 'ImageNumber2' => 'Bildnummer (2)', + 'ImageOffset' => 'Bilddatenposition', + 'ImageOptimization' => 'Bildoptimierung', + 'ImageOrientation' => { + Description => 'Bildausrichtung', + PrintConv => { + 'Landscape' => 'Querformat', + 'Portrait' => 'Porträt', + 'Square' => 'Quadratisch', + }, + }, + 'ImageProcessing' => 'Bildverarbeitung', + 'ImageProcessingVersion' => 'Bildverarbeitung Version', + 'ImageQuality' => { + Description => 'Bildqualität', + PrintConv => { + 'High' => 'Hoch', + }, + }, + 'ImageQuality2' => 'Bildqualität 2', + 'ImageReview' => { + Description => 'Bildkontrolle', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ImageReviewTime' => 'Ausschaltzeit Bildkontrolle', + 'ImageRotated' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'ImageRotation' => { + Description => 'Bildausrichtung', + PrintConv => { + 'None' => 'Keine', + }, + }, + 'ImageSize' => 'Bildgröße', + 'ImageStabilization' => { + Description => 'Bildstabilisierung', + PrintConv => { + 'Anti-Shake' => 'Verwackeln', + 'Best Shot' => 'Beste Aufnahme', + 'CCD Shift + High Sensitivity' => 'CCD Shift + Hohe Empfindlichkeit', + 'Dynamic' => 'Dynamisch', + 'Dynamic (2)' => 'Dynamisch (2)', + 'High Sensitivity' => 'Hohe Empfindlichkeit', + 'None' => 'Keine', + 'Off' => 'Aus', + 'Off (0xbf)' => 'Aus (0xbf)', + 'Off (1)' => 'Aus (1)', + 'Off (2)' => 'Aus (2)', + 'On' => 'Ein', + 'On (0x3f)' => 'Ein (0x3f)', + 'On (2)' => 'Ein (2)', + 'On (mode 1, continuous)' => 'Ein (Modus 1, nachführend)', + 'On (mode 2, shooting only)' => 'Ein (Modus 2, Aufnahme)', + 'On, Mode 1' => 'Ein, Modus 1', + 'On, Mode 2' => 'Ein, Modus 2', + 'On, Mode 3' => 'Ein, Modus 3', + 'On, Mode 4' => 'Ein, Modus 4', + 'Optical' => 'Optisch', + 'Panning' => 'Schwenken', + 'Panning (2)' => 'Schwenken (2)', + 'Sensor-shift' => 'Sensor-Shift', + 'Shoot Only' => 'Aufnahme', + 'Shoot Only (2)' => 'Aufnahme (2)', + 'Slow Shutter' => 'Kurzer Verschluß', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ImageStabilizationSetting' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ImageStyle' => { + PrintConv => { + 'B&W' => 'Schwarz/Weiß', + 'Landscape' => 'Landschaft', + 'Night View/Portrait' => 'Abendszene/Porträt', + 'Portrait' => 'Porträt', + 'Sunset' => 'Sonnenuntergang', + }, + }, + 'ImageTone' => { + Description => 'Farbdynamik', + PrintConv => { + 'Bright' => 'Leuchtend', + 'Landscape' => 'Landschaft', + 'Monochrome' => 'Monochrom', + 'Natural' => 'Natürlich', + 'Portrait' => 'Porträt', + }, + }, + 'ImageType' => { + Description => 'Bildtyp', + PrintConv => { + 'Page' => 'Seite', + 'Preview' => 'Vorschau', + }, + }, + 'ImageUIDList' => 'Bilder UID Liste', + 'ImageUniqueID' => 'Eindeutige Bild-ID', + 'ImageWidth' => 'Bildbreite', + 'InfoButtonWhenShooting' => { + Description => 'INFO-Taste bei Aufnahme', + PrintConv => { + 'Displays camera settings' => 'Anzeige Kameradaten', + 'Displays shooting functions' => 'Anzeige Aufnahmedaten', + }, + }, + 'InitialZoomSetting' => { + Description => 'Erste Vergrößerungsstufe', + PrintConv => { + 'High Magnification' => 'Starke Vergrößerung', + 'Low Magnification' => 'Geringe Vergrößerung', + 'Medium Magnification' => 'Mittlere Vergrößerung', + }, + }, + 'Instructions' => 'Anweisungen', + 'IntellectualGenre' => 'Intellektuelles Genre', + 'IntelligentAuto' => { + PrintConv => { + 'Advanced' => 'Erweitert', + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'IntelligentContrast' => { + Description => 'Intelligenter Kontrast', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'IntelligentD-Range' => { + Description => 'Intelligenter D-Bereich', + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Niedrig', + 'Off' => 'Aus', + }, + }, + 'IntelligentExposure' => { + Description => 'Intelligente Belichtung', + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Niedrig', + 'Off' => 'Aus', + }, + }, + 'IntelligentResolution' => { + Description => 'Intelligente Bildauflösung', + PrintConv => { + 'Extended' => 'Erweitert', + 'High' => 'Hoch', + 'Low' => 'Niedrig', + 'Off' => 'Aus', + }, + }, + 'IntensityStereo' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'InternalFlash' => { + Description => 'Integriertes Blitzgerät', + PrintConv => { + 'Commander Mode' => 'Master-Steuerung', + 'Fired' => 'Blitz wurde ausgelöst', + 'Manual' => 'Manuell', + 'No' => 'Blitz wurde nicht ausgelöst', + 'Off' => 'Aus', + 'On' => 'Ein', + 'Repeating Flash' => 'Stroboskopblitz', + }, + }, + 'InternalFlashAE1' => 'Integriertes Blitzgerät AE1', + 'InternalFlashAE1_0' => 'Integriertes Blitzgerät AE1 0', + 'InternalFlashAE2' => 'Integriertes Blitzgerät AE2', + 'InternalFlashAE2_0' => 'Integriertes Blitzgerät AE2 0', + 'InternalFlashMode' => { + Description => 'Slave-Blitz-Messfeld 2', + PrintConv => { + 'Did not fire, (Unknown 0xf4)' => 'Aus (Unbekannt 0xF4?)', + 'Did not fire, Auto' => 'Aus, Auto', + 'Did not fire, Auto, Red-eye reduction' => 'Aus, Auto, Rote-Augen-Reduzierung', + 'Did not fire, Normal' => 'Aus, Normal', + 'Did not fire, Red-eye reduction' => 'Aus, Rote-Augen-Reduzierung', + 'Did not fire, Slow-sync' => 'Aus, Langzeit-Synchronisation', + 'Did not fire, Slow-sync, Red-eye reduction' => 'Aus, Langzeit-Synchronisation, Rote-Augen-Reduzierung', + 'Did not fire, Trailing-curtain Sync' => 'Aus, 2. Verschlussvorhang', + 'Did not fire, Wireless (Control)' => 'Aus, Drahtlos (Steuerblitz)', + 'Did not fire, Wireless (Master)' => 'Aus, Drahtlos (Hauptblitz)', + 'Fired' => 'Ein', + 'Fired, Auto' => 'Ein, Auto', + 'Fired, Auto, Red-eye reduction' => 'Ein, Auto, Rote-Augen-Reduzierung', + 'Fired, Red-eye reduction' => 'Ein, Rote-Augen-Reduzierung', + 'Fired, Slow-sync' => 'Ein, Langzeit-Synchronisation', + 'Fired, Slow-sync, Red-eye reduction' => 'Ein, Langzeit-Synchronisation, Rote-Augen-Reduzierung', + 'Fired, Trailing-curtain Sync' => 'Ein, 2. Verschlussvorhang', + 'Fired, Wireless (Control)' => 'Ein, Drahtlos (Steuerblitz)', + 'Fired, Wireless (Master)' => 'Ein, Drahtlos (Hauptblitz)', + 'n/a - Off-Auto-Aperture' => 'K/A - Blendenring nicht auf A', + }, + }, + 'InternalFlashStrength' => 'Slave-Blitz-Messfeld 4', + 'InternalName' => 'Interner Name', + 'InternalSerialNumber' => 'Interne Seriennummer', + 'InteropIndex' => { + Description => 'Interoperabilität Identifikation', + PrintConv => { + 'R03 - DCF option file (Adobe RGB)' => 'R03: DCF Option-Format (Adobe RGB)', + 'R98 - DCF basic file (sRGB)' => 'R98: DCF Basic-Format (sRGB)', + 'THM - DCF thumbnail file' => 'THM: DCF Miniaturbild-Format', + }, + }, + 'InteropOffset' => 'Interoperabilitäts-Tag', + 'InteropVersion' => 'Interoperabilitäts-Version', + 'IntervalLength' => 'Intervallänge', + 'IntervalMode' => { + Description => 'Interval-Modus', + PrintConv => { + 'Still Image' => 'Standbild', + 'Time-lapse Movie' => 'Zeitraffer-Film', + }, + }, + 'IntervalNumber' => 'Intervalnummer', + 'IsCustomPictureStyle' => { + Description => 'Bildstil benutzerdefinert', + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'JFIFVersion' => 'JFIF-Version', + 'JPEGDigest' => 'JPEG Kennwert', + 'JPEGProc' => { + Description => 'JPEG Verfahren', + PrintConv => { + 'Lossless' => 'Verlustfrei', + }, + }, + 'JPEGQuality' => { + Description => 'Bildqualität', + PrintConv => { + 'Extra Fine' => 'Extra-Fein', + 'Fine' => 'Fein', + 'Standard' => 'Standardqualität', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'JPEGSize' => 'JPEG Größe', + 'JPEGTables' => 'JPEG Tabellen', + 'JobID' => 'Job-Kennung', + 'JpgFromRaw' => 'Jpg From Raw Bild', + 'JpgFromRawLength' => 'Jpg From Raw Datenlänge', + 'JpgFromRawStart' => 'Jpg From Raw Datenposition', + 'JpgRecordedPixels' => 'JPEG-Auflösung', + 'Key' => 'Schlüssel', + 'Keyword' => 'Schlüsselwort', + 'Keywords' => 'Schlüsselwörter', + 'KodakImageHeight' => 'Kodak-Bildhöhe', + 'KodakImageWidth' => 'Kodak-Bildbreite', + 'LC1' => 'Objektiv-Wert', + 'LC10' => 'Mv\' nv\'-Daten', + 'LC11' => 'AVC 1/EXP-Wert', + 'LC12' => 'Mv1 Avminsif-Wert', + 'LC14' => 'UNT_12 UNT_6-Wert', + 'LC15' => 'Incorporated Flash Suited END-Wert', + 'LC2' => 'Entfernungscode', + 'LC3' => 'K-Wert (LC3)', + 'LC4' => 'Wert für Aberrationskorrektur im Nahbereich', + 'LC5' => 'Wert für Aberrationskorrektur heller Farben', + 'LC6' => 'Wert für Aberrationskorrektur bei offener Blende', + 'LC7' => 'AF Minimum Actuation Condition-Wert', + 'LCDDisplayAtPowerOn' => { + Description => 'LCD-Display bei Kamera Ein', + PrintConv => { + 'Retain power off status' => 'Aus-Status beibehalten', + }, + }, + 'LCDDisplayReturnToShoot' => { + Description => 'LC-Display->Zurück zur Aufn.', + PrintConv => { + 'Also with * etc.' => 'Auch mit * etc.', + 'With Shutter Button only' => 'Nur mit Auslöser', + }, + }, + 'LCDIllumination' => { + Description => 'Displaybeleuchtung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'LCDIlluminationDuringBulb' => { + Description => 'LCD-Beleuchtung bei Langzeitaufnahme', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'LCDPanels' => 'LCD oben/LCD Rückwand', + 'LCHEditor' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Label' => 'Beschriftung', + 'Landmark' => 'Sehenswürdigkeit', + 'Language' => 'Sprache', + 'LanguageCode' => { + Description => 'Sprache', + PrintConv => { + 'Process default' => 'Systemeinstellung', + }, + }, + 'LanguageIdentifier' => 'Sprachkennung', + 'LastFileNumber' => 'Letzte Dateinummer', + 'LastKeywordIPTC' => 'Letztes IPTC Schlüsselwort', + 'LastKeywordXMP' => 'Letztes XMP Schlüsselwort', + 'LateralChromaticAberration' => { + Description => 'Laterale Farbabweichung', + PrintConv => { + 'Off' => 'Aus', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'LeafData' => 'Leaf Daten', + 'LegacyIPTCDigest' => 'Bisheriger IPTC Kennwert', + 'Lens' => 'Objektiv', + 'Lens35efl' => 'Objektiv', + 'LensAFStopButton' => { + Description => 'Funktion Objektiv-AF-Stopptaste', + PrintConv => { + 'AE lock' => 'AE-Speicherung', + 'AE lock while metering' => 'AE-Sperre b. aktiv. Messung', + 'AF Stop' => 'AF-Stopp', + 'AF point: M->Auto/Auto->ctr' => 'AF-Messf: M->Aut./Aut.->Ctr', + 'AF start' => 'AF-Start', + 'AF stop' => 'AF-Stopp', + 'IS start' => 'Start Bildstabilisierung', + 'Switch to registered AF point' => 'Auf gesp. AF-Messf. schalten', + }, + }, + 'LensApertureRange' => 'Objektiv Blendenbereich', + 'LensData' => 'K-Wert', + 'LensDataVersion' => 'Objektivdaten-Version', + 'LensDistortionParams' => 'Objektiv Verzeichnungsparameter', + 'LensDriveNoAF' => { + Description => 'Schärfensuche wenn AF unmöglich', + PrintConv => { + 'Focus search off' => 'Schärfensuche aus', + 'Focus search on' => 'Schärfensuche ein', + }, + }, + 'LensFStops' => 'Objektiv-Blendenstufen', + 'LensFirmwareVersion' => 'Objektiv-Firmware-Version', + 'LensID' => 'Objektiv-ID', + 'LensIDNumber' => 'Objektivkennnummer', + 'LensInfo' => 'Objektiv-Informationen', + 'LensKind' => 'Objektivtyp / Version (LC0)', + 'LensMake' => 'Objektivhersteller', + 'LensManufacturer' => 'Objektivhersteller', + 'LensMaxApertureRange' => 'Objektiv Blendenbereich', + 'LensModel' => 'Objektiv-Typ', + 'LensProfileDigest' => 'Kennwert des Objektivprofils', + 'LensProperties' => 'Objektivfunktionen?', + 'LensSerialNumber' => 'Objektiv-Seriennummer', + 'LensSpec' => 'Objektiv', + 'LensType' => { + Description => 'Objektivtyp', + PrintConv => { + 'Uncoded lens' => 'Nicht kodiertes Objektiv', + }, + }, + 'LevelOrientation' => { + Description => 'Level Ausrichtung', + PrintConv => { + 'Downwards' => 'Abwärts', + 'Horizontal; Off Level' => 'Horizontal; ohne Level', + 'Rotate 180' => '180° gedreht', + 'Rotate 180; Off Level' => '180° gedreht; ohne Level', + 'Rotate 270 CW' => '90° gegen den Uhrzeigersinn', + 'Rotate 270 CW; Off Level' => '90° gegen den Uhrzeigersinn; ohne Level', + 'Rotate 90 CW' => '90° im Uhrzeigersinn', + 'Rotate 90 CW; Off Level' => '90° im Uhrzeigersinn; ohne Level', + 'Upwards' => 'Aufwärts', + }, + }, + 'License' => 'Lizenz', + 'LicenseType' => { + Description => 'Lizenztyp', + PrintConv => { + 'Commercial' => 'Kommerziell', + 'Unknown' => 'Unbekannt', + }, + }, + 'LightReading' => 'Helligkeitsauswertung', + 'LightSource' => { + Description => 'Lichtquelle', + PrintConv => { + 'Cloudy' => 'Bewölkt', + 'Cool White Fluorescent' => 'Neonlicht kaltweiß', + 'Day White Fluorescent' => 'Neonlicht neutralweiß', + 'Daylight' => 'Tageslicht', + 'Daylight Fluorescent' => 'Neonlicht tageslichtweiß', + 'Evening Sunlight' => 'Abendstimmung', + 'Fine Weather' => 'Wolkenlos', + 'Flash' => 'Blitz', + 'Fluorescent' => 'Neonlicht', + 'ISO Studio Tungsten' => 'ISO Studio-Kunstlicht (Glühbirne)', + 'One Touch White Balance' => 'Sofort-Weißabgleich', + 'Other' => 'Andere Lichtquelle', + 'Shade' => 'Schatten', + 'Standard Light A' => 'Standard-Licht A', + 'Standard Light B' => 'Standard-Licht B', + 'Standard Light C' => 'Standard-Licht C', + 'Tungsten' => 'Glühbirne', + 'Tungsten (Incandescent)' => 'Kunstlicht (Glühbirne)', + 'Unknown' => 'Unbekannt', + 'Warm White Fluorescent' => 'Neonlicht warmweiß', + 'White Fluorescent' => 'Neonlicht universalweiß', + }, + }, + 'LightSourceSpecial' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'LightValue' => 'Lichtwert(ISO)', + 'Lightness' => 'Graustufung', + 'LinearizationTable' => 'Linearisierungstabelle', + 'Lit' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'LiveViewAFAreaMode' => { + Description => 'Live-View AF-Modus', + PrintConv => { + 'Face-Priority' => 'Gesichtserkennung', + 'NormalArea' => 'Normaler Bereich', + 'SubjectTracking' => 'Objektnachführung', + 'WideArea' => 'Großer Bereich', + }, + }, + 'LiveViewAFMethod' => { + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'LiveViewAFMode' => 'Live-View AF-Modus', + 'LiveViewAFSetting' => { + Description => 'Live View AF Einstellung', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'LiveViewExposureSimulation' => { + Description => 'Livebild-Belichtungssimulator', + PrintConv => { + 'Disable (LCD auto adjust)' => 'Inaktiv (automatische LCD-Anzeige)', + 'Enable (simulates exposure)' => 'Aktiv (simuliert Belichtung)', + }, + }, + 'LiveViewFocusMode' => { + Description => 'Live-View Fokus-Modus', + PrintConv => { + 'Manual' => 'Manuell', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'LiveViewMetering' => { + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'LiveViewShooting' => { + Description => 'Live View Aufnahme', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'LocalizedCameraModel' => 'Lokalisiertes Kameramodell', + 'Location' => 'Aufnahmeort', + 'LockMicrophoneButton' => { + Description => 'Mikrofone-Tastenfunktion', + PrintConv => { + 'Protect (hold:record memo)' => 'Geschützt (drücken:Tonaufnahme)', + 'Record memo (protect:disable)' => 'Tonaufnahme (ungeschützt)', + }, + }, + 'LongExposureNoiseReduction' => { + Description => 'Langzeit-Rauschminderung', + PrintConv => { + 'Auto' => 'Automatisch', + 'Off' => 'Aus', + 'On' => 'Ein', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'LongExposureNoiseReduction2' => { + Description => 'Langzeit Rauschunterdrückung 2', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + 'On (1D)' => 'Ein (1D)', + }, + }, + 'Luminance' => 'Luminanz', + 'LuminanceNoiseReduction' => { + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Leicht', + 'Off' => 'Aus', + }, + }, + 'MB-D10Batteries' => { + Description => 'Akku-/Batterietyp', + PrintConv => { + 'FR6 (AA lithium)' => 'FR6 (Mignon, Lithium)', + 'HR6 (AA Ni-MH)' => 'HR6 (Mignon, NiMH)', + 'LR6 (AA alkaline)' => 'LR6 (Mignon, Alkaline)', + 'ZR6 (AA Ni-Mn)' => 'ZR6 (Mignon, NiMn)', + }, + }, + 'MB-D10BatteryType' => 'Akku-/Batterietyp', + 'MB-D80Batteries' => { + Description => 'Akku-/Batterietyp', + PrintConv => { + 'FR6 (AA Lithium)' => 'FR6 (Mignon-Lithium)', + 'HR6 (AA Ni-MH)' => 'HR6 (Mignon-Ni-MH)', + 'LR6 (AA Alkaline)' => 'LR6 (Mignon-Alkaline)', + 'ZR6 (AA Ni-Mg)' => 'ZR6 (Mignon-Ni-Mg)', + }, + }, + 'MB-D80BatteryType' => 'MB-D80 Batterietyp', + 'MCUVersion' => 'MCU-Version', + 'MD5Digest' => 'MD5 Kennwert', + 'MIEVersion' => 'MIE-Version', + 'MIMEType' => 'MIME-Typ', + 'MPImage' => 'MP Vorschaubild', + 'MPImageFlags' => 'MP Vorschaubild Flags', + 'MPImageFormat' => 'MP Vorschaubild Format', + 'MPImageLength' => 'MP Vorschaubild-Datenlänge', + 'MPImageStart' => 'MP Vorschaubild Datenposition', + 'MPImageType' => { + Description => 'MP Vorschaubild Typ', + PrintConv => { + 'Large Thumbnail (VGA equivalent)' => 'Vorschaubild groß (VGA)', + 'Large Thumbnail (full HD equivalent)' => 'Vorschaubild groß (HD)', + 'Multi-frame Panorama' => 'Mehrbild Panorama', + 'Undefined' => 'Nicht definiert', + }, + }, + 'MSStereo' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Macro' => { + Description => 'Makro', + PrintConv => { + 'Macro' => 'Makro', + 'Manual' => 'Manuell', + 'Off' => 'Aus', + 'On' => 'Ein', + 'Super Macro' => 'Super-Makro', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'MacroLED' => { + Description => 'Makro LED', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'MacroMagnification' => 'Makro Vergrößerung', + 'MacroMode' => { + Description => 'Makro-Modus', + PrintConv => { + 'Macro' => 'Makro', + 'Macro Zoom' => 'Makro-Zoom', + 'Off' => 'Aus', + 'On' => 'Ein', + 'Super Macro' => 'Super-Makro', + 'Tele-Macro' => 'Tele-Makro', + }, + }, + 'MagicFilter' => { + PrintConv => { + 'Drawing' => 'Zeichnung', + 'Fish Eye' => 'Fischauge', + 'Off' => 'Aus', + 'Reflection' => 'Reflektierung', + 'Soft Focus' => 'Weichzeichner', + 'Soft Focus 2' => 'Weichzeichner 2', + 'Sparkle' => 'Perleffekt', + 'Watercolor' => 'Wasserfarben', + }, + }, + 'MagnifiedView' => { + Description => 'Lupenfunktion', + PrintConv => { + 'Image playback only' => 'Nur bei Bildwiedergabe', + 'Image review and playback' => 'Sofortbild u. Wiedergabe', + }, + }, + 'MainDialExposureComp' => { + Description => 'Main Dial Belichtungskorrektur', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Make' => 'Gerätehersteller', + 'MakeAndModel' => 'Hersteller und Modell', + 'MakerNote' => 'Hersteller-eigene Daten', + 'MakerNoteApple' => 'Herstellerdaten Apple', + 'MakerNoteCanon' => 'Herstellerdaten Canon', + 'MakerNoteCasio' => 'Herstellerdaten Casio', + 'MakerNoteCasio2' => 'Herstellerdaten Casio 2', + 'MakerNoteFLIR' => 'Herstellerdaten FLIR', + 'MakerNoteFujiFilm' => 'Herstellerdaten Fuji Film', + 'MakerNoteGE' => 'Herstellerdaten GE', + 'MakerNoteGE2' => 'Herstellerdaten GE2', + 'MakerNoteHP' => 'Herstellerdaten HP', + 'MakerNoteHP2' => 'Herstellerdaten HP2', + 'MakerNoteHP4' => 'Herstellerdaten HP4', + 'MakerNoteHP6' => 'Herstellerdaten HP6', + 'MakerNoteHasselblad' => 'Herstellerdaten Hasselblad', + 'MakerNoteISL' => 'Herstellerdaten ISL', + 'MakerNoteJVC' => 'Herstellerdaten JVC', + 'MakerNoteJVCText' => 'Herstellerdaten JVC Text', + 'MakerNoteKodak10' => 'Herstellerdaten Kodak 10', + 'MakerNoteKodak1a' => 'Herstellerdaten Kodak 1a', + 'MakerNoteKodak1b' => 'Herstellerdaten Kodak 1b', + 'MakerNoteKodak2' => 'Herstellerdaten Kodak 2', + 'MakerNoteKodak3' => 'Herstellerdaten Kodak 3', + 'MakerNoteKodak4' => 'Herstellerdaten Kodak 4', + 'MakerNoteKodak5' => 'Herstellerdaten Kodak 5', + 'MakerNoteKodak6a' => 'Herstellerdaten Kodak 6a', + 'MakerNoteKodak6b' => 'Herstellerdaten Kodak 6b', + 'MakerNoteKodak7' => 'Herstellerdaten Kodak 7', + 'MakerNoteKodak8a' => 'Herstellerdaten Kodak 8a', + 'MakerNoteKodak8b' => 'Herstellerdaten Kodak 8b', + 'MakerNoteKodak9' => 'Herstellerdaten Kodak 9', + 'MakerNoteKodakUnknown' => 'Herstellerdaten Kodak Unbekannt', + 'MakerNoteKyocera' => 'Herstellerdaten Kyocera', + 'MakerNoteLeica' => 'Herstellerdaten Leica', + 'MakerNoteLeica2' => 'Herstellerdaten Leica 2', + 'MakerNoteLeica3' => 'Herstellerdaten Leica 3', + 'MakerNoteLeica4' => 'Herstellerdaten Leica 4', + 'MakerNoteLeica5' => 'Herstellerdaten Leica 5', + 'MakerNoteLeica6' => 'Herstellerdaten Leica 6', + 'MakerNoteMinolta' => 'Herstellerdaten Minolta', + 'MakerNoteMinolta2' => 'Herstellerdaten Minolta 2', + 'MakerNoteMinolta3' => 'Herstellerdaten Minolta 3', + 'MakerNoteNikon' => 'Herstellerdaten Nikon', + 'MakerNoteNikon2' => 'Herstellerdaten Nikon 2', + 'MakerNoteNikon3' => 'Herstellerdaten Nikon 3', + 'MakerNoteOlympus' => 'Herstellerdaten Olympus', + 'MakerNoteOlympus2' => 'Herstellerdaten Olympus 2', + 'MakerNotePanasonic' => 'Herstellerdaten Panasonic', + 'MakerNotePanasonic2' => 'Herstellerdaten Panasonic 2', + 'MakerNotePentax' => 'Herstellerdaten Pentax', + 'MakerNotePentax2' => 'Herstellerdaten Pentax 2', + 'MakerNotePentax3' => 'Herstellerdaten Pentax 3', + 'MakerNotePentax4' => 'Herstellerdaten Pentax 4', + 'MakerNotePentax5' => 'Herstellerdaten Pentax 5', + 'MakerNotePentax6' => 'Herstellerdaten Pentax 6', + 'MakerNotePhaseOne' => 'Herstellerdaten Phase One', + 'MakerNoteReconyx' => 'Herstellerdaten Reconyx', + 'MakerNoteRicoh' => 'Herstellerdaten Ricoh', + 'MakerNoteRicohText' => 'Herstellerdaten Ricoh Text', + 'MakerNoteSafety' => { + Description => 'Sicherheit der Hersteller-Informationsdaten', + PrintConv => { + 'Safe' => 'Sicher', + 'Unsafe' => 'Unsicher', + }, + }, + 'MakerNoteSamsung1a' => 'Herstellerdaten Samsung 1a', + 'MakerNoteSamsung1b' => 'Herstellerdaten Samsung 1b', + 'MakerNoteSamsung2' => 'Herstellerdaten Samsung 2', + 'MakerNoteSanyo' => 'Herstellerdaten Sanyo', + 'MakerNoteSanyoC4' => 'Herstellerdaten Sanyo C4', + 'MakerNoteSanyoPatch' => 'Herstellerdaten Sanyo Patch', + 'MakerNoteSigma' => 'Herstellerdaten Sigma', + 'MakerNoteSony' => 'Herstellerdaten Sony', + 'MakerNoteSony2' => 'Herstellerdaten Sony 2', + 'MakerNoteSony3' => 'Herstellerdaten Sony 3', + 'MakerNoteSony4' => 'Herstellerdaten Sony 4', + 'MakerNoteSony5' => 'Herstellerdaten Sony 5', + 'MakerNoteSonyEricsson' => 'Herstellerdaten Sony Ericsson', + 'MakerNoteSonySRF' => 'Herstellerdaten Sony SRF', + 'MakerNoteType' => 'Benutzerdaten Typ', + 'MakerNoteUnknown' => 'Herstellerdaten Unbekannt', + 'MakerNoteUnknownBinary' => 'Herstellerdaten Unbekannt-Binär', + 'MakerNoteUnknownText' => 'Herstellerdaten Unbekannt-Text', + 'MakerNoteVersion' => 'MakerNote-Version', + 'MakerNotes' => 'Hinweise des Herstellers', + 'ManometerPressure' => 'Gemessener Luft- bzw. Wasserdruck', + 'ManometerReading' => 'Berechnete Höhe oder Tauchtiefe', + 'ManualAFPointSelectPattern' => 'Manuelle Wahl der AF-Punkte', + 'ManualFlash' => 'Manueller Blitz', + 'ManualFlashOutput' => { + Description => 'Manuelle Blitzstärke', + PrintConv => { + 'Full' => 'Voll', + 'Low' => 'Gering', + 'Medium' => 'Mittel', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ManualFlashStrength' => 'Manuelle Blitzstärke', + 'ManualFocusDistance' => 'Manuelle Fokusdistanz', + 'ManualTv' => { + Description => 'Manuelle Tv/Av-Einstellung für Manuelle Belichtung', + PrintConv => { + 'Tv=Control/Av=Main' => 'Tv=Schnelleinstellrad/Av=Haupt-Wahlrad', + 'Tv=Main/Av=Control' => 'Tv=Haupt-Wahlrad/Av=Schnelleinstellrad', + }, + }, + 'ManufactureDate' => 'Herstellungsdatum', + 'Marked' => 'Markiert', + 'MasterDocumentID' => 'ID des Originaldokuments', + 'MatrixMetering' => 'Mehrfeldmessung', + 'MaxAperture' => 'Größte Blende', + 'MaxApertureAtCurrentFocal' => 'Größte Blende bei aktueller Brennweite', + 'MaxApertureAtMaxFocal' => 'Größte Blende bei größter Brennweite', + 'MaxApertureAtMinFocal' => 'Größte Blende bei geringster Brennweite', + 'MaxApertureValue' => 'Größtmögliche Blende', + 'MaxContinuousRelease' => 'Max. Bildanzahl pro Serie', + 'MaxFocalLength' => 'Größte Brennweite', + 'MaxJPEGTableIndex' => 'Größter Index JPEG Tabellen', + 'MaxSampleValue' => 'Größter Sample Wert', + 'MeasuredEV' => 'Gemessener LW', + 'MeasuredLV' => 'Lichtwert gemessen', + 'MeasuredRGGB' => 'Messung RGGB', + 'MeasuredRGGBData' => 'Messung RGGB', + 'MeasurementBacking' => 'Basis der Messung', + 'MeasurementFlare' => 'Messung Lichtschein', + 'MeasurementGeometry' => { + Description => 'Geometrie der Messung', + PrintConv => { + '0/45 or 45/0' => '0/45 oder 45/0', + '0/d or d/0' => '0/d oder d/0', + }, + }, + 'MeasurementIlluminant' => 'Messung Beleuchtung', + 'MeasurementObserver' => 'Messung nach', + 'MediaBlackPoint' => 'Medium-Schwarzpunkt', + 'MediaWhitePoint' => 'Medium-Weißpunkt', + 'Medium' => 'Mittelgroß', + 'MenuButtonDisplayPosition' => { + Description => 'Positionsanzeige Menuetaste', + PrintConv => { + 'Previous' => 'Vorherige Anzeige', + 'Previous (top if power off)' => 'Vorherige (Anfang nach AUS)', + 'Top' => 'Oben', + }, + }, + 'MenuButtonReturn' => { + PrintConv => { + 'Previous' => 'Vorherige Anzeige', + 'Top' => 'Oben', + }, + }, + 'MetadataCreator' => 'Metadaten Ersteller', + 'MetadataDate' => 'Datum der Metadaten', + 'MetadataID' => 'Metadaten ID', + 'Metering' => { + Description => 'Belichtungsmessung', + PrintConv => { + 'Center-weighted' => 'Mittenbetont', + 'Matrix' => 'Mehrfeldmessung', + 'Spot' => 'Spotmessung', + }, + }, + 'MeteringMode' => { + Description => 'Belichtungsmessmethode', + PrintConv => { + 'Average' => 'Integralmessung', + 'Center-weighted Average' => 'Mittenbetont', + 'Center-weighted average' => 'Mittenbetont', + 'Default' => 'System', + 'Evaluative' => 'Mehrfeldmessung', + 'Multi-segment' => 'Multi-Segment', + 'Multi-spot' => 'MultiSpot', + 'Other' => 'Andere', + 'Partial' => 'Teilbild', + 'Spot' => 'Spotmessung', + 'Spot+Highlight control' => 'Spot+Helligkeitsbetont', + 'Spot+Shadow control' => 'Spot+Schattenbetont', + 'Unknown' => 'Unbekannt', + }, + }, + 'MeteringMode2' => { + Description => 'Belichtungs-Messmethode 2', + PrintConv => { + 'Center-weighted average' => 'Mittenbetont', + 'Multi-segment' => 'Multi-Segment', + }, + }, + 'MeteringMode3' => { + Description => 'Belichtungs-Messmethode (3)', + PrintConv => { + 'Multi-segment' => 'Multi-Segment', + }, + }, + 'MeteringTime' => { + Description => 'Ausschaltzeit Belichtungsmesser', + PrintConv => { + 'No Limit' => 'Unbegrenzt', + }, + }, + 'MinAperture' => 'Kleinste Blende', + 'MinApertureValue' => 'Kleinste Blende', + 'MinFocalLength' => 'Kleinste Brennweite', + 'MinSampleValue' => 'Kleinster Sample Wert', + 'MiniatureFilterOrientation' => { + PrintConv => { + 'Vertical' => 'Vertikal', + }, + }, + 'MinoltaCameraSettings2' => 'Kameraeinstellungen 2', + 'MinoltaCameraSettings5D' => 'Kameraeinstellungen (5D)', + 'MinoltaCameraSettings7D' => 'Kameraeinstellungen (7D)', + 'MinoltaDate' => 'Minolta-Datum', + 'MinoltaImageSize' => { + Description => 'Minolta-Bildgröße', + PrintConv => { + 'Full' => 'Volle Größe', + 'Large' => 'Groß', + 'Medium' => 'Mittelgroß', + 'Small' => 'Klein', + }, + }, + 'MinoltaMakerNote' => 'Minolta-Herstellerinformationen', + 'MinoltaModelID' => 'Minolta-Modell ID', + 'MinoltaQuality' => { + Description => 'Minolta-Bildqualität', + PrintConv => { + 'Extra Fine' => 'Extra-Fein', + 'Fine' => 'Fein', + 'RAW+JPEG' => 'RAW + JPEG', + 'Super Fine' => 'Super-Fein', + }, + }, + 'MinoltaTime' => 'Minolta-Zeit', + 'MirrorLockup' => { + Description => 'Spiegelverriegelung', + PrintConv => { + 'Disable' => 'Ausgeschaltet', + 'Enable' => 'Eingeschaltet', + 'Enable: Down with Set' => 'Eingeschaltet: Abwärts mit SET (Taste)', + }, + }, + 'ModeDialPosition' => { + PrintConv => { + 'Aperture-priority AE' => 'Blendenpriorität', + 'Manual' => 'Manuell', + 'No Flash' => 'Kein Blitz', + 'Program AE' => 'Programmautomatik', + 'Shutter speed priority AE' => 'Verschlußpriorität', + }, + }, + 'Model' => 'Kameramodell', + 'Model2' => 'Kameramodell (2)', + 'ModelID' => 'Modell ID', + 'ModelingFlash' => { + Description => 'Einstelllicht', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ModifiedColorTemp' => 'Geänderte Farbtemperatur', + 'ModifiedDigitalGain' => 'Digitale Verstärkung geändert', + 'ModifiedPictureStyle' => { + Description => 'Geänderter Bildstil', + PrintConv => { + 'Faithful' => 'Natürlich', + 'Landscape' => 'Landschaft', + 'Monochrome' => 'Monochrom', + 'None' => 'Keiner', + 'Portrait' => 'Porträt', + 'User Def. 1' => 'Benutzerdefiniert 1', + 'User Def. 2' => 'Benutzerdefiniert 2', + 'User Def. 3' => 'Benutzerdefiniert 3', + }, + }, + 'ModifiedSaturation' => { + PrintConv => { + 'Off' => 'Aus', + }, + }, + 'ModifiedSharpness' => 'Schärfe verändert', + 'ModifiedSharpnessFreq' => { + PrintConv => { + 'High' => 'Hoch', + 'Highest' => 'Höchste', + 'Low' => 'Leicht', + 'Lowest' => 'Niedrigste', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ModifiedToneCurve' => { + Description => 'Tonwertkurve verändert', + PrintConv => { + 'Custom' => 'Benutzerdefiniert', + 'Manual' => 'Manuell', + }, + }, + 'ModifiedWhiteBalance' => { + PrintConv => { + 'Auto' => 'Automatisch', + 'Black & White' => 'Schwarz/Weiß', + 'Cloudy' => 'Bewölkt', + 'Custom' => 'Benutzerdefiniert', + 'Custom 1' => 'Benutzerdefiniert 1', + 'Custom 2' => 'Benutzerdefiniert 2', + 'Custom 3' => 'Benutzerdefiniert 3', + 'Custom 4' => 'Benutzerdefiniert 4', + 'Daylight' => 'Tageslicht', + 'Daylight Fluorescent' => 'Neonlicht tageslichtweiß', + 'Flash' => 'Blitz', + 'Fluorescent' => 'Neonlicht', + 'Manual Temperature (Kelvin)' => 'Manuelle Temperatur (Kelvin)', + 'Shade' => 'Schatten', + 'Tungsten' => 'Glühbirne', + 'Underwater' => 'Unterwasser', + }, + }, + 'ModifyDate' => 'Änderungsdatum', + 'MoireFilter' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'MonitorOffTime' => 'Ausschaltzeit des Monitors', + 'MonochromeFilterEffect' => { + Description => 'Filtereffekt Monochrom', + PrintConv => { + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + }, + }, + 'MonochromeLinear' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'MonochromeToningEffect' => { + Description => 'Tönungseffekt Monochrom', + PrintConv => { + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Purple' => 'Lila', + }, + }, + 'Month' => 'Monat', + 'MultiBurstImageHeight' => 'Multi-Burst Bildhöhe', + 'MultiBurstImageWidth' => 'Multi-Burst Bildbreite', + 'MultiBurstMode' => { + Description => 'Mehrfach-Burst Modus', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'MultiControllerWhileMetering' => { + Description => 'Multicontroller bei Messung', + PrintConv => { + 'AF point selection' => 'AF-Punkt-Auswahl', + 'Off' => 'Aus', + }, + }, + 'MultiExposure' => 'Mehrfachbelichtungsdaten', + 'MultiExposureAutoGain' => { + Description => 'Mehrfachbelichtung Automatik', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'MultiExposureMode' => { + Description => 'Mehrfachbelichtungsmodus', + PrintConv => { + 'Image Overlay' => 'Bildüberlagerung', + 'Multiple Exposure' => 'Mehrfachbelichtung', + 'Off' => 'Aus', + }, + }, + 'MultiExposureShots' => 'Mehrfachbelichtung Anzahl Aufnahmen', + 'MultiExposureVersion' => 'Mehrfachbelichtungsdaten-Version', + 'MultiFrameNoiseReduction' => { + Description => 'Ruisond. Multi Frame', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'MultiFunctionLock' => { + PrintConv => { + 'Main dial' => 'Haupt-Wahlrad', + 'Multi-controller' => 'Multicontroller', + 'Off' => 'Aus', + 'On' => 'Ein', + 'Quick control dial' => 'Schnelleinstellrad', + }, + }, + 'MultiSelector' => { + Description => 'Multifunktionswähler', + PrintConv => { + 'Do Nothing' => 'Ohne Funktion', + 'Reset Meter-off Delay' => 'Ruhezustand verzögern', + }, + }, + 'MultiSelectorPlaybackMode' => { + Description => 'Mitteltaste Bei Wiedergabe', + PrintConv => { + 'Choose Folder' => 'Ordner auswählen', + 'Thumbnail On/Off' => 'Bildindex ein/aus', + 'View Histograms' => 'Histogramme anzeigen', + 'Zoom On/Off' => 'Ausschnitt ein/aus', + }, + }, + 'MultiSelectorShootMode' => { + Description => 'Mitteltaste Bei Aufnahme', + PrintConv => { + 'Highlight Active Focus Point' => 'AF-Messfeld hervorheben', + 'Not Used' => 'Ohne Funktion', + 'Select Center Focus Point' => 'Mittleres AF-Messfeld', + }, + }, + 'MultipleExposureMode' => { + PrintConv => { + 'Off' => 'Aus', + 'On (2 frames)' => 'Ein (2 Bilder', + 'On (3 frames)' => 'Ein (3 Bilder', + }, + }, + 'MultipleExposureSet' => { + Description => 'Mehrfachbelichtung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Mute' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'MyColorMode' => { + Description => 'My Color-Modus', + PrintConv => { + 'B&W' => 'Schwarz/Weiß', + 'Custom' => 'Benutzerdefiniert', + 'Off' => 'Aus', + }, + }, + 'MyColors' => 'My Color-Modus', + 'NDFilter' => { + Description => 'ND-Filter', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'NEFBitDepth' => { + PrintConv => { + 'n/a (JPEG)' => 'Nicht gesetzt (JPEG)', + }, + }, + 'NEFCompression' => { + Description => 'RAW-Komprimierung', + PrintConv => { + 'Lossless' => 'Verlustfrei', + 'Lossy (type 1)' => 'Verlustbehaftet (Type 1)', + 'Lossy (type 2)' => 'Verlustbehaftet (Type 2)', + 'Uncompressed' => 'Nicht komprimiert', + }, + }, + 'NEFLinearizationTable' => 'Linearisierungstabelle', + 'NativeDigest' => 'EXIF Kennwert', + 'NetExposureCompensation' => 'Net Belichtungskorrektur', + 'NewMieTag1' => 'Weiterer MIE Tag 1', + 'NewPngTag1' => 'Weiterer PNG Tag 1', + 'NewPngTag2' => 'Weiterer PNG Tag 2', + 'NewPngTag3' => 'Weiterer PNG Tag 3', + 'NewRawImageDigest' => 'Neuer RAW Image Kennwert', + 'NewsPhotoVersion' => 'IPTC-Modell-3-Version', + 'NikonCaptureData' => 'Nikon Capture-Daten', + 'NikonCaptureOutput' => 'Nikon Capture-Ausgabe', + 'NikonCaptureVersion' => 'Nikon Capture-Version', + 'NikonICCProfile' => 'Nikon ICC-Profil', + 'NikonImageSize' => { + Description => 'Nikon Bildgröße', + PrintConv => { + 'Large' => 'Groß', + 'Large (10.0 M)' => 'Groß (10.0M)', + 'Medium' => 'Mittel', + 'Medium (5.6 M)' => 'Mittel (5.6M)', + 'Small' => 'Klein', + 'Small (2.5 M)' => 'Klein (2.5M)', + }, + }, + 'NoMemoryCard' => { + Description => 'Auslösesperre', + PrintConv => { + 'Enable Release' => 'Aus', + 'Release Locked' => 'Ein', + }, + }, + 'Noise' => 'Bildrauschen', + 'NoiseFilter' => { + Description => 'Rauschfilter', + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Leicht', + 'Off' => 'Aus', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'NoiseReduction' => { + Description => 'Rauschreduktion', + PrintConv => { + 'Auto' => 'Automatisch', + 'High (+1)' => 'Hoch (+1)', + 'Highest (+2)' => 'Am höchsten (+2)', + 'Low' => 'Gering', + 'Low (-1)' => 'Niedrig (-1)', + 'Lowest (-2)' => 'Am niedrigsten (+2)', + 'Max' => 'Maximal', + 'Noise Filter' => 'Rauschfilter', + 'Noise Filter (ISO Boost)' => 'Rauschfilter (ISO Boost)', + 'Noise Reduction' => 'Rauschreduktion', + 'Off' => 'Aus', + 'On' => 'Ein', + 'Strong' => 'Stark', + 'Weak' => 'Schwach', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'NoiseReduction2' => { + Description => 'Rauschunterdrückung 2', + PrintConv => { + 'Noise Filter' => 'Rauschfilter', + 'Noise Filter (ISO Boost)' => 'Rauschfilter (ISO Boost)', + 'Noise Reduction' => 'Rauschreduktion', + }, + }, + 'NoiseReductionIntensity' => 'Stärke Rauschunterdrückung', + 'NoiseReductionMethod' => { + Description => 'Rauschunterdrückung Methode', + PrintConv => { + 'Better Quality' => 'Bessere Qualität"', + 'Faster' => 'Schneller', + }, + }, + 'NoiseReductionMode' => { + Description => 'Rauschunterdrückungsmodus', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'NoiseReductionSharpness' => 'Rauschunterdrückung Schärfe', + 'NoiseReductionValue' => 'Rauschunterdrückungswert', + 'NominalMaxAperture' => 'Nominaler AVmin', + 'NominalMinAperture' => 'Nominaler AVmax', + 'Notes' => 'Hinweise', + 'NumAFPoints' => 'Anzahl der AF-Punkte', + 'NumChannels' => 'Anzahl Kanäle', + 'NumColors' => 'Anzahl Farben', + 'NumFacePositions' => 'Gesichtspositionen', + 'NumImportantColors' => 'Anzahl Hauptfarben', + 'NumberOfFocusPoints' => { + Description => 'Anzahl AF-Punkte', + PrintConv => { + '11 Points' => '11 Punkte', + '39 Points' => '39 Punkte', + }, + }, + 'NumberOfImages' => 'Anzahl Bilder', + 'NumberOfPlanes' => 'Anzahl Ebenen', + 'OPIProxy' => { + PrintConv => { + 'Higher resolution image does not exist' => 'Höher aufgelöstes Bild nicht vorhanden', + 'Higher resolution image exists' => 'Höher aufgelöstes Bild vorhanden', + }, + }, + 'ObjectAttributeReference' => 'Gattung', + 'ObjectCycle' => { + Description => 'Objektzyklus', + PrintConv => { + 'Both Morning and Evening' => 'Beides', + 'Evening' => 'Abends', + 'Morning' => 'Morgens', + }, + }, + 'ObjectDistance' => 'Objektabstand', + 'ObjectFileType' => { + Description => 'Objekt Dateityp', + PrintConv => { + 'Executable file' => 'Ausführbare Datei', + 'None' => 'Keiner', + 'Unknown' => 'Unbekannt', + }, + }, + 'ObjectName' => 'Titel', + 'ObjectPreviewData' => 'Objektdatenvorschau', + 'ObjectPreviewFileFormat' => 'Dateiformat der Objektdatenvorschau', + 'ObjectPreviewFileVersion' => 'Dateiformatversion der Objektdatenvorschau', + 'ObjectTypeReference' => 'Objekttypreferenz', + 'OffsetSchema' => 'Offset-Schema', + 'OldSubfileType' => { + Description => 'Unterdatei-Typ', + PrintConv => { + 'Full-resolution image' => 'Bild in voller Auflösung', + 'Reduced-resolution image' => 'Bild in reduzierter Auflösung', + 'Single page of multi-page image' => 'Einzelbild eines mehrseitigen Bildes', + }, + }, + 'OlympusImageHeight' => 'Olympus-Bildhöhe', + 'OlympusImageWidth' => 'Olympus-Bildbreite', + 'OneTouchWB' => { + Description => 'Sofort-Weißabgleich', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + 'On (Preset)' => 'Ein (Preset)', + }, + }, + 'OperatingSystem' => { + PrintConv => { + 'unknown' => 'Unbekannt', + }, + }, + 'OpticalZoom' => 'Optischer Zoom', + 'OpticalZoomCode' => 'Optischer Zoom-Code', + 'OpticalZoomMode' => { + Description => 'Optischer Zoom-Modus', + PrintConv => { + 'Extended' => 'Erweitert', + }, + }, + 'OpticalZoomOn' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Opto-ElectricConvFactor' => 'Optoelektronischer Umrechnungsfaktor', + 'OrderNumber' => 'Auftragsnummer', + 'Organization' => 'Organisation', + 'Orientation' => { + Description => 'Ausrichtung', + PrintConv => { + 'Mirror horizontal' => 'Horizontal gespiegelt', + 'Mirror horizontal and rotate 270 CW' => 'Horizontal gespiegelt und 90° gegen den Uhrzeigersinn', + 'Mirror horizontal and rotate 90 CW' => 'Horizontal gespiegelt und 90° im Uhrzeigersinn', + 'Mirror vertical' => 'Vertikal gespiegelt', + 'Rotate 180' => '180° gedreht', + 'Rotate 270 CW' => '90° gegen den Uhrzeigersinn', + 'Rotate 90 CW' => '90° im Uhrzeigersinn', + }, + }, + 'Orientation2' => { + Description => 'Ausrichtung 2', + PrintConv => { + 'Rotate 180' => '180° gedreht', + 'Rotate 270 CW' => '90° gegen den Uhrzeigersinn', + 'Rotate 90 CW' => '90° im Uhrzeigersinn', + }, + }, + 'OriginalFileName' => 'Original Dateiname', + 'OriginalFileType' => 'Original Dateityp', + 'OriginalImageHeight' => 'Bildbreite Original', + 'OriginalImageWidth' => 'Bildbreite Original', + 'OriginalRawCreator' => 'Original RAW Ersteller', + 'OriginalRawFileData' => 'Original Raw Daten', + 'OriginalRawFileDigest' => 'Original RAW Image Kennwert', + 'OriginalRawFileName' => 'Original Raw Dateiname', + 'OriginalRawFileType' => 'Original RAW Dateityp', + 'OriginalRawImage' => 'Original RAW Bild', + 'OriginalRawResource' => 'Original RAW Basisdaten', + 'OriginalTHMCreator' => 'Original THM Ersteller', + 'OriginalTHMFileType' => 'Original THM Dateityp', + 'OriginalTHMImage' => 'Original THM Bild', + 'OriginalTHMResource' => 'Original THM Basisdaten', + 'OriginalTransmissionReference' => 'Anbietervermerk Verweis', + 'OriginatingProgram' => 'Erstellungsprogramm', + 'OtherImage' => 'Other Image Vorschaubild', + 'OtherImageLength' => 'OtherImage Datenlänge', + 'OtherImageStart' => 'Other Image Datenposition', + 'OutputImageHeight' => 'Ausgabe-Bildhöhe', + 'OutputImageWidth' => 'Ausgabe-Bildbreite', + 'OutputResolution' => 'Ausgabe Auflösung', + 'OverlayPlanes' => 'Ãœberlagerungsebenen', + 'Owner' => 'Besitzer', + 'OwnerID' => 'Besitzer-ID', + 'OwnerName' => 'Name des Besitzers', + 'PEFVersion' => 'PEF-Version', + 'PNGWarning' => 'PNG Warnung', + 'Padding' => 'Platzhalter', + 'PageName' => 'Seitenname', + 'PageNumber' => 'Seitenummer', + 'Pages' => 'Seiten', + 'PanOrientation' => { + Description => 'Pan Ausrichtung', + PrintConv => { + 'Bottom to top' => 'Von Unten nach Oben', + 'Clockwise' => 'Im Uhrzeigersinn', + 'Counter clockwise' => 'Gegen den Uhrzeigersinn', + 'Left to right' => 'Von Links nach Rechts', + 'Right to left' => 'Von Rechts nach Links', + 'Start at bottom left' => 'Links unten beginnend', + 'Start at bottom right' => 'Rechts unten beginnend', + 'Start at top left' => 'Links oben beginnend', + 'Start at top right' => 'Rechts oben beginnend', + 'Top to bottom' => 'Von Oben nach Unten', + '[unused]' => '[nicht verwendet]', + }, + }, + 'PanasonicImageHeight' => 'Panasonic Bildhöhe', + 'PanasonicImageWidth' => 'Panasonic Bildbreite', + 'PanasonicTitle' => 'Titel', + 'PanoramaCropBottom' => 'Panorama Ausschnitt Unten', + 'PanoramaCropLeft' => 'Panorama Ausschnitt Links', + 'PanoramaCropRight' => 'Panorame Ausschnitt Rechts', + 'PanoramaCropTop' => 'Panorama Ausschnitt Oben', + 'PanoramaDirection' => { + Description => 'Panorama-Richtung', + PrintConv => { + '2x2 Matrix (Clockwise)' => '2x2 Matrix (im Uhrzeigersinn)', + 'Bottom to Top' => 'Unten nach Oben', + 'Left to Right' => 'Links nach Rechts', + 'Right to Left' => 'Rechts nach Links', + 'Top to Bottom' => 'Oben nach Unten', + }, + }, + 'PanoramaFrameNumber' => 'Panorama-Bild', + 'PanoramaMode' => 'Panorama Modus', + 'PanoramaSize3D' => { + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'PentaxImageSize' => { + Description => 'Pentax-Bildgröße', + PrintConv => { + '2304x1728 or 2592x1944' => '2304 x 1728 oder 2592 x 1944', + '2560x1920 or 2304x1728' => '2560 x 1920 oder 2304 x 1728', + '2816x2212 or 2816x2112' => '2816 x 2212 oder 2816 x 2112', + '3008x2008 or 3040x2024' => '3008 x 2008 oder 3040 x 2024', + 'Full' => 'Voll', + }, + }, + 'PentaxModelID' => 'Pentax-Modell ID', + 'PentaxVersion' => 'Pentax-Version', + 'People' => 'Menschen', + 'Permits' => { + PrintConv => { + 'Distribution' => 'Verteilung', + 'Reproduction' => 'Reproduktion', + }, + }, + 'PhaseDetectAF' => { + Description => 'Auto-Fokus', + PrintConv => { + 'Off' => 'Aus', + 'On (11-point)' => 'Ein (11-Punkt)', + 'On (39-point)' => 'Ein (39 Punkte)', + 'On (51-point)' => 'Ein (51-Punkt)', + 'On (hybrid)' => 'Ein (Hybrid)', + }, + }, + 'PhoneNumber' => 'Telefonnummer', + 'PhotoEffect' => { + Description => 'Foto-Effekt', + PrintConv => { + 'B&W' => 'Schwarz/Weiß', + 'Custom' => 'Benutzerdefiniert', + 'Off' => 'Aus', + }, + }, + 'PhotoEffects' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'PhotoEffectsData' => 'Bildeffekt-Daten', + 'PhotoEffectsType' => { + Description => 'Bildeffekt-Methode', + PrintConv => { + 'B&W' => 'Schwarz/Weiß', + 'None' => 'Keine', + 'Tinted' => 'Getont', + }, + }, + 'PhotoInfoPlayback' => { + Description => 'Bildinfos & Wiedergabe', + PrintConv => { + 'Info Left-right, Playback Up-down' => 'Info <> / Wiedergabe', + 'Info Up-down, Playback Left-right' => 'Info / Wiedergabe <>', + }, + }, + 'PhotoStyle' => { + Description => 'Fotostil', + PrintConv => { + 'Monochrome' => 'Schwarz/Weiß', + 'Natural' => 'Natürlich', + 'Portrait' => 'Porträt', + 'Scenery' => 'Szene', + 'Standard or Custom' => 'Standard oder benutzerdefiniert', + 'Vivid' => 'Lebendig', + }, + }, + 'PhotometricInterpretation' => { + Description => 'Pixel-Schema', + PrintConv => { + 'BlackIsZero' => 'Schwarz ist Null', + 'Color Filter Array' => 'CFA (Farbfiltermatrix)', + 'Pixar LogL' => 'CIE Log2(L) (Log Luminanz)', + 'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (Log Luminanz und Chrominanz)', + 'Transparency Mask' => 'Transparenzmaske', + 'WhiteIsZero' => 'Weiß ist Null', + }, + }, + 'PhotoshopBGRThumbnail' => 'Photoshop BGR-Vorschaubild', + 'PhotoshopFormat' => 'Photoshop-Format', + 'PhotoshopQuality' => 'Photoshop-Qualität', + 'PhysicalImageSize' => 'Physikalische Bildgröße', + 'PictureControl' => { + Description => 'Bildoptimierung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'PictureControlActive' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'PictureControlAdjust' => { + Description => 'Bildoptimierung-Anpassung', + PrintConv => { + 'Default Settings' => 'Standardeinstellungen', + 'Full Control' => 'Manuelle Einstellung', + 'Quick Adjust' => 'Schnelleinstellung', + }, + }, + 'PictureControlBase' => 'Bildoptimierung-Basis', + 'PictureControlName' => 'Bildoptimierung-Name', + 'PictureControlQuickAdjust' => 'Bildoptimierung-Schnelleinstellung', + 'PictureControlVersion' => 'Bildoptimierung-Version', + 'PictureFinish' => { + PrintConv => { + 'Evening Scene' => 'Abendszene', + 'Monochrome' => 'Monochrom', + 'Natural' => 'Natürlich', + 'Natural+' => 'Natürlich+', + 'Night Portrait' => 'Nachtporträt', + 'Night Scene' => 'Nachtszene', + 'Portrait' => 'Porträt', + 'Wind Scene' => 'Windszene', + }, + }, + 'PictureMode' => { + Description => 'Motivprogramm', + PrintConv => { + '1/2 EV steps' => '1/2 LW Schritte', + '1/3 EV steps' => '1/3 LW Schitte', + 'Anti-blur' => 'Motivschärfe-Modus', + 'Aperture Priority' => 'Zeitautomatik', + 'Aperture Priority, Off-Auto-Aperture' => 'Zeitautomatik (Blendenring nicht auf A)', + 'Aperture-priority AE' => 'Blendenpriorität', + 'Auto' => 'Automatisch', + 'Auto PICT (Landscape)' => 'Auto PICT (Landschaft)', + 'Auto PICT (Macro)' => 'Auto PICT (Makro)', + 'Auto PICT (Portrait)' => 'Auto PICT (Porträt)', + 'Auto PICT (Sport)' => 'Auto PICT (Motiv in Bewegung)', + 'Auto PICT (Standard)' => 'Auto PICT (Normal)', + 'Autumn' => 'Herbst', + 'Backlight Silhouette' => 'Hintergrundbeleuchtung Silhouette', + 'Beach' => 'Strand', + 'Beach & Snow' => 'Strand & Schnee', + 'Black & White' => 'Schwarz/Weiß', + 'Blue' => 'Blau', + 'Blur Control' => 'Bildstabilisierung', + 'Blur Reduction' => 'Unschärfereduktion', + 'Bulb' => 'Bulb-Modus', + 'Bulb, Off-Auto-Aperture' => 'Bulb (Blendenring nicht auf A)', + 'Candlelight' => 'Kerzenlicht', + 'DOF Program' => 'Schärfentiefe-Priorität', + 'DOF Program (HyP)' => 'Schärfentiefe-Priorität (Hyper-Programm)', + 'Dark Pet' => 'Haustier (Dunkel)', + 'Digital Filter' => 'Digitalfilter', + 'Fireworks' => 'Feuerwerk', + 'Fisheye' => 'Fischauge', + 'Flash X-Sync Speed AE' => 'Blitz X-synch. Zeit', + 'Flower' => 'Blumen', + 'Food' => 'Lebensmittel', + 'Forest' => 'Wald', + 'Frame Composite' => 'Rahmen', + 'Green' => 'Grün', + 'Green Mode' => 'Grüner Modus', + 'Half-length Portrait' => 'Brustbild', + 'Hi-speed Program' => 'HS-Priorität', + 'Hi-speed Program (HyP)' => 'HS-Priorität (Hyper-Programm)', + 'Illustrations' => 'Dokument', + 'Kids' => 'Kinder', + 'Landscape' => 'Landschaft', + 'Light Pet' => 'Haustier (Hell)', + 'MTF Program' => 'MTF-Priorität', + 'MTF Program (HyP)' => 'MTF-Priorität (Hyper-Programm)', + 'Macro' => 'Makro', + 'Manual' => 'Manuell', + 'Manual, Off-Auto-Aperture' => 'Manuell (Blendenring nicht auf A)', + 'Medium Pet' => 'Haustier (Neutrale Helligkeit)', + 'Natural' => 'Natur', + 'Natural Light' => 'Umgebungslicht', + 'Natural Light & Flash' => 'Umgebungslicht & Blitz', + 'Natural Skin Tone' => 'Nat. Hautton', + 'Night Scene' => 'Nachtszene', + 'Night Scene HDR' => 'Nachtszene', + 'Night Scene Portrait' => 'Nacht-Porträt', + 'No Flash' => 'Kein Blitz', + 'Pet' => 'Haustiere', + 'Pink' => 'Rosa', + 'Portrait' => 'Porträt', + 'Portrait 2' => 'Porträt 2', + 'Program' => 'Programmautomatik', + 'Program (HyP)' => 'Programmautomatik (Hyper-Programm)', + 'Program AE' => 'Programmautomatik', + 'Program Av Shift' => 'Av Shift-Belichtungsprogramm', + 'Program Tv Shift' => 'Tv Shift-Belichtungsprogramm', + 'Purple' => 'Violett', + 'Red' => 'Rot', + 'Self Portrait' => 'Selbstporträt', + 'Sensitivity Priority AE' => 'Blenden- & Zeitautomatik (Sv, ISO-Vorgabe)', + 'Shutter & Aperture Priority AE' => 'Empfindlichkeitsautomatik (TAv, Zeit-/Blendenvorgabe)', + 'Shutter Speed Priority' => 'Verschlusspriorität', + 'Shutter speed priority AE' => 'Verschlusspriorität', + 'Snow' => 'Schnee', + 'Soft' => 'Soft (Weichzeichnung)', + 'Sports' => 'Sport', + 'Sunset' => 'Sonnenuntergang', + 'Surf & Snow' => 'Surf & Schnee', + 'Synchro Sound Record' => 'Synchr. Sprachnotiz', + 'Underwater' => 'Unterwasser', + 'Yellow' => 'Gelb', + }, + }, + 'PictureMode2' => { + Description => 'Motivprogramm 2', + PrintConv => { + 'Aperture Priority' => 'Blendenpriorität', + 'Aperture Priority, Off-Auto-Aperture' => 'Zeitautomatik (Blendenring nicht auf A)', + 'Bulb' => 'Bulb-Modus', + 'Bulb, Off-Auto-Aperture' => 'Bulb (Blendenring nicht auf A)', + 'Flash X-Sync Speed AE' => 'Blitz X-synch. Zeit', + 'Green Mode' => '"Grünes" AE-Programm', + 'Manual' => 'Manuell', + 'Manual, Off-Auto-Aperture' => 'Manuell (Blendenring nicht auf A)', + 'Program AE' => 'Programmautomatik', + 'Program Av Shift' => 'Av Shift-Belichtungsprogramm', + 'Program Tv Shift' => 'Tv Shift-Belichtungsprogramm', + 'Scene Mode' => 'Motivprogramm', + 'Sensitivity Priority AE' => 'Blenden- & Zeitautomatik (Sv, ISO-Vorgabe)', + 'Shutter & Aperture Priority AE' => 'Empfindlichkeitsautomatik (TAv, Zeit-/Blendenvorgabe)', + 'Shutter Speed Priority' => 'Verschlusspriorität', + }, + }, + 'PictureModeBWFilter' => { + Description => 'Motivprogramm S/W Filter', + PrintConv => { + 'Green' => 'Grün', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'PictureModeContrast' => 'Motivprogramm Kontrast', + 'PictureModeEffect' => { + Description => 'Motivprogramm Effekt', + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Niedrig', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'PictureModeHue' => 'Motivprogramm Farbton', + 'PictureModeSaturation' => 'Motivprogramm Farbsättigung', + 'PictureModeSharpness' => 'Motivprogramm Schärfe', + 'PictureModeTone' => { + Description => 'Motivprogramm Tonwert', + PrintConv => { + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'Purple' => 'Lila', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'PictureStyle' => { + Description => 'Bildstil', + PrintConv => { + 'Custom' => 'Benutzerdefiniert', + 'Faithful' => 'Natürlich', + 'High Saturation' => 'Hohe Farbsättigung', + 'Landscape' => 'Landschaft', + 'Low Saturation' => 'Geringe Farbsättigung', + 'Monochrome' => 'Monochrom', + 'None' => 'Keiner', + 'Portrait' => 'Porträt', + 'Unknown?' => 'Unbekannt?', + 'User Def. 1' => 'Benutzerdefiniert 1', + 'User Def. 2' => 'Benutzerdefiniert 2', + 'User Def. 3' => 'Benutzerdefiniert 3', + }, + }, + 'PictureWizardMode' => { + PrintConv => { + 'Forest' => 'Wald', + 'Landscape' => 'Landschaft', + 'Portrait' => 'Porträt', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'PixelFormat' => { + Description => 'Pixel-Format', + PrintConv => { + 'Black & White' => 'Schwarz/Weiß', + }, + }, + 'PixelUnits' => { + Description => 'Pixel Einheit', + PrintConv => { + 'Unknown' => 'Unbekannt', + 'meters' => 'Meter', + }, + }, + 'PixelsPerMeterX' => 'Pixel per Meter X', + 'PixelsPerMeterY' => 'Pixel per Meter Y', + 'PixelsPerUnitX' => 'Pixel pro X-Einheit', + 'PixelsPerUnitY' => 'Pixel pro Y-Einheit', + 'PlanarConfiguration' => { + Description => 'Bilddatenausrichtung', + PrintConv => { + 'Chunky' => 'Kompaktformat', + 'Planar' => 'Ebenes Format', + }, + }, + 'Planes' => 'Ebenen', + 'PostalCode' => 'Postleitzahl', + 'PowerSource' => { + Description => 'Stromquelle', + PrintConv => { + 'Body Battery' => 'Batterie im Gehäuse', + 'External Power Supply' => 'Externe Stromversorgung', + 'Grip Battery' => 'Batterie im Griff', + }, + }, + 'Predictor' => { + Description => 'Prädiktor', + PrintConv => { + 'Horizontal differencing' => 'Horizontale Differenzierung', + 'None' => 'Kein Prädiktor-Schema in Benutzung', + }, + }, + 'PresetWhiteBalance' => { + Description => 'Weißabgleich Voreinstellung', + PrintConv => { + 'Cloudy' => 'Bewölkt', + 'Daylight' => 'Tageslicht', + 'Flash' => 'Blitz', + 'Fluorescent' => 'Neonlicht', + 'Shade' => 'Schatten', + 'Tungsten' => 'Glühbirne', + }, + }, + 'PresetWhiteBalanceAdj' => 'Weißabgleichkorrektur-Einstellung', + 'Preview' => 'Preview-IFD-Zeiger', + 'Preview0' => 'Vorschau 0', + 'Preview1' => 'Vorschau 1', + 'Preview2' => 'Vorschau 2', + 'PreviewColorSpace' => { + PrintConv => { + 'Unknown' => 'Unbekannt', + }, + }, + 'PreviewCropBottom' => 'Vorschau Ausschnitt Unten', + 'PreviewCropLeft' => 'Vorschau Ausschnitt Links', + 'PreviewCropRight' => 'Vorschau Ausschnitt Rechts', + 'PreviewCropTop' => 'Vorschau Ausschnitt Oben', + 'PreviewIFD' => 'Preview-IFD-Zeiger', + 'PreviewImage' => 'Vorschaubild', + 'PreviewImageBorders' => 'Vorschaubild-Ränder', + 'PreviewImageData' => 'Vorschaubild-Daten', + 'PreviewImageHeight' => 'Vorschaubild-Höhe', + 'PreviewImageLength' => 'Vorschaubild-Datenlänge', + 'PreviewImageName' => 'Vorschaubild-Name', + 'PreviewImageSize' => 'Vorschaubild-Größe', + 'PreviewImageStart' => 'Vorschaubild-Datenposition', + 'PreviewImageType' => 'Vorschaubild-Typ', + 'PreviewImageValid' => { + Description => 'Vorschaubild gültig', + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'PreviewImageWidth' => 'Vorschaubild-Breite', + 'PreviewPNG' => 'PNG Vorschaubild', + 'PreviewQuality' => { + Description => 'Vorschaubild-Qualität', + PrintConv => { + 'Fine' => 'Fein', + 'Superfine' => 'Superfein', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'PreviewSettingsDigest' => 'Kennwert der Voreinstellungen', + 'PreviewWMF' => 'WMF Vorschaubild', + 'PrimaryAFPoint' => { + Description => 'Primärer AF-Punkt', + PrintConv => { + '(none)' => '(keiner)', + 'Bottom' => 'Unten', + 'C6 (Center)' => 'C6 (Mitte)', + 'Center' => 'Mitte', + 'Far Left' => 'Weit links', + 'Far Right' => 'Weit rechts', + 'Lower-left' => 'Links unten', + 'Lower-right' => 'Rechts unten', + 'Mid-left' => 'Links mitte', + 'Mid-right' => 'Rechts mitte', + 'Top' => 'Oben', + 'Upper-left' => 'Links oben', + 'Upper-right' => 'Rechts oben', + }, + }, + 'PrimaryChromaticities' => 'Chromatizität der Primärfarben', + 'PrimaryPlatform' => 'Hauptplattform', + 'ProcessingInfo' => 'Verarbeitungsinformationen', + 'ProcessingSoftware' => 'Verarbeitungssoftware', + 'Producer' => 'Produzent', + 'ProducerKeywords' => 'Hersteller Schlüsselwörter', + 'Producers' => 'Produzent', + 'ProductID' => 'Produkt-ID', + 'ProductionCode' => 'Herstellungskennzeichen', + 'ProfileCMMType' => 'Profil CMM-Typ', + 'ProfileClass' => { + Description => 'Profil-Klasse', + PrintConv => { + 'Abstract Profile' => 'Abstract-Profil', + 'ColorSpace Conversion Profile' => 'Farbraum-Konvertierungsprofile', + 'DeviceLink Profile' => 'DeviceLink-Profil', + 'Display Device Profile' => 'Bildschirm-Geräteprofil', + 'Input Device Profile' => 'Eingabe-Geräteprofil', + 'NamedColor Profile' => 'Named Color-Profil', + 'Nikon Input Device Profile (NON-STANDARD!)' => 'Nikon-Profil ("nkpf")', + 'Output Device Profile' => 'Ausgabe-Geräteprofil', + }, + }, + 'ProfileConnectionSpace' => 'Profil-Verbindungsfarbraum', + 'ProfileCopyright' => 'Urheberrechtsvermerk', + 'ProfileCreator' => 'Profilersteller', + 'ProfileDateTime' => 'Profil-Erstellungszeit', + 'ProfileDescription' => 'Farbprofil Name', + 'ProfileDescriptionML' => 'Farbprofil Name mehrsprachig', + 'ProfileFileSignature' => 'Profil-Datei-Signatur', + 'ProfileID' => 'Profile-ID', + 'ProfileSequenceDesc' => 'Profilsequenz-Beschreibung', + 'ProfileToneCurve' => 'Tonwertkurve Profil', + 'ProfileType' => { + Description => 'Profiltyp', + PrintConv => { + 'Group 3 FAX' => 'Gruppe 3 Fax', + 'Unspecified' => 'Nicht bekannt', + }, + }, + 'ProfileVersion' => 'Profil-Version', + 'ProgramISO' => { + Description => 'ISO Programm', + PrintConv => { + 'Intelligent ISO' => 'ISO intelligent', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ProgramLine' => { + Description => 'Belichtungsprogrammtyp', + PrintConv => { + 'Depth' => 'Schärfentiefe-Priorität', + 'Hi Speed' => 'HS-Priorität', + 'MTF' => 'MTF-Priorität', + }, + }, + 'ProgramMode' => { + Description => 'Programmmodus', + PrintConv => { + 'Night Portrait' => 'Nachtporträt', + 'None' => 'Keiner', + 'Portrait' => 'Porträt', + 'Sports' => 'Sport', + 'Sunset' => 'Sonnenuntergang', + }, + }, + 'ProgramShift' => 'Programmverschiebung', + 'ProgramVersion' => 'Programmversion', + 'Prohibits' => { + Description => 'Verbote', + PrintConv => { + 'Commercial Use' => 'Kommerzielle Verwendung', + }, + }, + 'Protect' => 'Schutz', + 'Province-State' => 'Bundesland/Kanton', + 'Publisher' => 'Herausgeber', + 'Quality' => { + Description => 'Qualität', + PrintConv => { + 'Best' => 'Optimal', + 'Better' => 'Besser', + 'Compressed RAW' => 'Komprimiertes RAW', + 'Compressed RAW + JPEG' => 'Komprimiertes RAW + JPEG', + 'Extra Fine' => 'Extra-Fein', + 'Fine' => 'Fein', + 'Good' => 'Gut', + 'High' => 'Hoch', + 'Low' => 'Leicht', + 'Normal' => 'Standardqualität', + 'RAW + JPEG' => 'RAW+JPEG', + 'Super Fine' => 'Super-Fein', + 'Superfine' => 'Superfein', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'Quality2' => 'Qualität 2', + 'QualityMode' => { + PrintConv => { + 'Fine' => 'Fein', + }, + }, + 'QuickAdjust' => 'Schnelleinstellung', + 'QuickControlDialInMeter' => { + Description => 'Schnelleinstellrad bei Messung', + PrintConv => { + 'AF point selection' => 'Auswahl des AF-Messfelds', + 'Exposure comp/Aperture' => 'Belichtungskorrektur/Blende', + 'ISO speed' => 'ISO-Empfindlichkeit', + }, + }, + 'QuickShot' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'RAFVersion' => 'RAF-Version', + 'RasterizedCaption' => 'Rasterbeschreibung', + 'Rating' => 'Bewertung', + 'RatingPercent' => 'Bewertung in Prozent', + 'RawAndJpgRecording' => { + Description => 'Dateiformat und JPEG-Qualität', + PrintConv => { + 'JPEG (Best)' => 'JPEG (Optimal)', + 'JPEG (Better)' => 'JPEG (Besser)', + 'JPEG (Good)' => 'JPEG (Gut)', + 'RAW (DNG, Best)' => 'RAW (DNG, Optimal)', + 'RAW (DNG, Better)' => 'RAW (DNG, Besser)', + 'RAW (DNG, Good)' => 'RAW (DNG, Gut)', + 'RAW (PEF, Best)' => 'RAW (PEF, Optimal)', + 'RAW (PEF, Better)' => 'RAW (PEF, Besser)', + 'RAW (PEF, Good)' => 'RAW (PEF, Gut)', + 'RAW+JPEG (DNG, Best)' => 'RAW+JPEG (DNG, Optimal)', + 'RAW+JPEG (DNG, Better)' => 'RAW+JPEG (DNG, Besser)', + 'RAW+JPEG (DNG, Good)' => 'RAW+JPEG (DNG, Gut)', + 'RAW+JPEG (PEF, Best)' => 'RAW+JPEG (PEF, Optimal)', + 'RAW+JPEG (PEF, Better)' => 'RAW+JPEG (PEF, Besser)', + 'RAW+JPEG (PEF, Good)' => 'RAW+JPEG (PEF, Gut)', + 'RAW+Large/Fine' => 'RAW+Groß/Fein', + 'RAW+Large/Normal' => 'RAW+Groß/Normal', + 'RAW+Medium/Fine' => 'RAW+Mittel/Fein', + 'RAW+Medium/Normal' => 'RAW+Mittel/Normal', + 'RAW+Small/Fine' => 'RAW+Klein/Fein', + 'RAW+Small/Normal' => 'RAW+Klein/Normal', + }, + }, + 'RawBrightnessAdj' => 'Raw Helligkeitskorrektur', + 'RawColorAdj' => { + Description => 'Raw Farbkorrektur', + PrintConv => { + 'Custom' => 'Benutzerdefiniert', + 'Faithful' => 'Natürlich', + 'Shot Settings' => 'Aufnahmeeinstellung', + }, + }, + 'RawCropBottom' => 'Raw Ausschnitt Unten', + 'RawCropLeft' => 'Raw Ausschnitt Links', + 'RawCropRight' => 'Raw Ausschnitt Rechts', + 'RawCropTop' => 'Raw Ausschnitt Oben', + 'RawData' => 'Raw-Daten', + 'RawDataByteOrder' => 'RAW Daten Bytereihenfolge', + 'RawDataLength' => 'RAW-Daten Länge', + 'RawDataOffset' => 'RAW-Daten Offset', + 'RawDataUniqueID' => 'Raw-Daten eindeutige ID', + 'RawDevArtFilter' => { + PrintConv => { + 'Drawing' => 'Zeichnung', + 'Fish Eye' => 'Fischauge', + 'Off' => 'Aus', + 'Reflection' => 'Reflektierung', + 'Soft Focus' => 'Weichzeichner', + 'Soft Focus 2' => 'Weichzeichner 2', + 'Sparkle' => 'Perleffekt', + 'Watercolor' => 'Wasserfarbe', + 'Watercolor II' => 'Wasserfarbe II', + }, + }, + 'RawDevAutoGradation' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'RawDevNoiseReduction' => { + Description => 'RAW Rauschunterdrückung', + PrintConv => { + 'Noise Filter' => 'Rauschfilter', + 'Noise Filter (ISO Boost)' => 'Rauschfilter (ISO Boost)', + 'Noise Reduction' => 'Rauschreduktion', + }, + }, + 'RawDevPMPictureTone' => { + PrintConv => { + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'Purple' => 'Lila', + }, + }, + 'RawDevPM_BWFilter' => { + PrintConv => { + 'Green' => 'Grün', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + }, + }, + 'RawDevPictureMode' => { + PrintConv => { + 'Natural' => 'Natürlich', + }, + }, + 'RawDevWhiteBalance' => { + PrintConv => { + 'Color Temperature' => 'Farbtemperatur', + }, + }, + 'RawFile' => 'RAW Datei', + 'RawFileName' => 'RAW Dateiname', + 'RawImageCenter' => 'RAW-Bildmitte', + 'RawImageDigest' => 'RAW Image Kennwert', + 'RawImageHeight' => 'Raw Bildhöhe', + 'RawImageSegmentation' => 'Raw Bild Aufteilung', + 'RawImageSize' => 'RAW-Bildgröße', + 'RawImageWidth' => 'Raw Bildbreite', + 'RawInfoVersion' => 'RawInfo Version', + 'RawJpgQuality' => { + Description => 'RAW JPEG-Qualität', + PrintConv => { + 'Fine' => 'Fein', + 'Superfine' => 'Superfein', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'RawJpgSize' => { + Description => 'RAW JPEG-Größe', + PrintConv => { + 'Large' => 'Groß', + 'Medium' => 'Mittelgroß', + 'Medium 1' => 'Mittelgroß 1', + 'Medium 2' => 'Mittelgroß 2', + 'Medium 3' => 'Mittelgroß 3', + 'Medium Movie' => 'Mittelgroßer Film', + 'Postcard' => 'Postkarte', + 'Small' => 'Klein', + 'Small Movie' => 'Kleiner Film', + 'Widescreen' => 'Breitbild', + }, + }, + 'RawMeasuredRGGB' => 'Raw Messung RGGB', + 'RecognizedFace1Age' => 'Alter erkanntes Gesicht 1', + 'RecognizedFace1Name' => 'Name erkanntes Gesicht 1', + 'RecognizedFace1Position' => 'Position erkanntes Gesicht 1', + 'RecognizedFace2Age' => 'Alter erkanntes Gesicht 2', + 'RecognizedFace2Name' => 'Name erkanntes Gesicht 2', + 'RecognizedFace2Position' => 'Position erkanntes Gesicht 2', + 'RecognizedFace3Age' => 'Alter erkanntes Gesicht 3', + 'RecognizedFace3Name' => 'Name erkanntes Gesicht 3', + 'RecognizedFace3Position' => 'Position erkanntes Gesicht 3', + 'RecordMode' => { + Description => 'Aufzeichnungsmodus', + PrintConv => { + 'Aperture Priority' => 'Blendenpriorität', + 'Manual' => 'Manuell', + 'Shutter Priority' => 'Verschlusspriorität', + }, + }, + 'RecordingMode' => { + PrintConv => { + 'Auto' => 'Automatisch', + 'Landscape' => 'Landschaft', + 'Manual' => 'Manuell', + 'Night Scene' => 'Nachtszene', + 'Portrait' => 'Porträt', + }, + }, + 'RedAdjust' => 'Rot-Korrektur', + 'RedBalance' => 'Farbabgleich Rot', + 'RedEyeCorrection' => { + Description => 'Rote-Augen-Reduzierung', + PrintConv => { + 'Automatic' => 'Automatisch', + 'Click on Eyes' => 'Klick auf Augen', + 'Off' => 'Aus', + }, + }, + 'RedEyeReduction' => { + Description => 'Rote Augen Reduzierung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'RedMatrixColumn' => 'Rot-Matrixspalte', + 'RedSaturation' => 'Farbsättingung Rot', + 'RedTRC' => 'Rot-Tonwertwiedergabe-Kurve', + 'RedX' => 'Rotpunkt X', + 'RedY' => 'Rotpunkt Y', + 'ReductionMatrix1' => 'Reduktionsmatrix 1', + 'ReductionMatrix2' => 'Reduktionsmatrix 2', + 'ReferenceBlackWhite' => 'Schwarz-Weiß-Referenzpunkte', + 'ReferenceDate' => 'Referenzdatum', + 'ReferenceNumber' => 'Referenznummer', + 'ReferenceService' => 'Referenzdienst', + 'References' => 'Verweise', + 'RelatedImageFileFormat' => 'Dateiformat der Bilddaten', + 'RelatedImageHeight' => 'Bildhöhe', + 'RelatedImageWidth' => 'Bildbreite', + 'RelatedSoundFile' => 'Zugehörige Audio-Datei', + 'ReleaseButtonToUseDial' => { + Description => 'Tastenverhalten', + PrintConv => { + 'No' => 'Gedrückt halten', + 'Yes' => 'Ein & aus', + }, + }, + 'ReleaseDate' => 'Veröffentlichungsdatum', + 'ReleaseMode' => { + Description => 'Auslösemodus', + PrintConv => { + 'AE Bracketing' => 'Belichtungsreihe', + 'Contrast Bracketing' => 'Kontrast Belichtungsreihe', + 'High Speed Burst' => 'Aufnahme Burst', + 'WB Bracketing' => 'Weißabgleich-Belichtungsreihe', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ReleaseTime' => 'Veröffentlichungszeit', + 'RemoteOnDuration' => 'Fernauslöser', + 'RenderingIntent' => { + Description => 'Umrechnungsmethode', + PrintConv => { + 'ICC-Absolute Colorimetric' => 'Absolut farbmetrisch', + 'Media-Relative Colorimetric' => 'Relativ farbmetrisch', + 'Perceptual' => 'Wahrnehmungsorientiert (perzeptiv, fotografisch)', + 'Saturation' => 'Sättigungserhaltend', + }, + }, + 'RepeatingFlashCount' => 'Stroboskopblitz Anzahl', + 'RepeatingFlashOutput' => 'Stroboskopblitz Leistung', + 'RepeatingFlashRate' => 'Stroboskopblitz Freq.', + 'ResampleParamsQuality' => { + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Leicht', + }, + }, + 'Resaved' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'Resolution' => 'Bildauflösung', + 'ResolutionUnit' => { + Description => 'Einheit der X- und Y-Auflösung', + PrintConv => { + 'None' => 'Keine', + 'inches' => 'Zoll', + }, + }, + 'RetouchHistory' => { + Description => 'Bildbearbeitungsschritte', + PrintConv => { + 'B & W' => 'Schwarz/Weiß', + 'Color Custom' => 'Farbabgleich', + 'Cyanotype' => 'Blauton', + 'Distortion Control' => 'Verzeichnungskontrolle', + 'Fisheye' => 'Fischauge', + 'Image Overlay' => 'Bildmontage', + 'None' => 'Keine', + 'Perspective Control' => 'Perspektivenkontrolle', + 'Red Eye' => 'Rote-Augen-Korrektur', + 'Sky Light' => 'Skylight', + 'Small Picture' => 'Kompaktbild', + 'Soft Filter' => 'Weichzeichner', + 'Trim' => 'Beschneiden', + 'Warm Tone' => 'Warmer Farbton', + }, + }, + 'ReverseIndicators' => 'Skalen spiegeln', + 'ReverseShutterSpeedAperture' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'RevisionDate' => 'Revisionsdatum', + 'RevisionNumber' => 'Revisionsnummer', + 'RicohDate' => 'Ricoh Datum', + 'RicohImageHeight' => 'Ricoh-Bildhöhe', + 'RicohImageWidth' => 'Ricoh-Bildbreite', + 'Rights' => 'Rechte', + 'Rotation' => { + Description => 'Ausrichtung', + PrintConv => { + 'Horizontal (Normal)' => 'Horizontal (normal)', + 'Rotate 180' => '180° gedreht', + 'Rotate 270 CW' => '90° gegen den Uhrzeigersinn', + 'Rotate 90 CW' => '90° im Uhrzeigersinn', + 'Rotated 180' => '180° gedreht', + 'Rotated 270 CW' => '90° gegen den Uhrzeigersinn', + 'Rotated 90 CW' => '90° im Uhrzeigersinn', + }, + }, + 'RowsPerStrip' => 'Anzahl der Bild-Zeilen', + 'SPIFFVersion' => 'SPIFF-Version', + 'SRAWQuality' => { + Description => 'SRAW Qualität', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SRActive' => { + Description => 'Bildstabilisator', + PrintConv => { + 'No' => 'Deaktiviert', + 'Yes' => 'Aktiviert', + }, + }, + 'SRFocalLength' => 'SR Brennweite', + 'SRHalfPressTime' => 'Auslöseverzögerung', + 'SRResult' => { + Description => 'Bildstabilisator', + PrintConv => { + 'Not stabilized' => 'Nicht stabilisiert', + }, + }, + 'SVGVersion' => 'SVG-Version', + 'SafetyShift' => { + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable (ISO speed)' => 'Möglich (ISO Empfindlichkeit)', + 'Enable (Tv/Av)' => 'Möglich (Tv/Av)', + }, + }, + 'SafetyShiftInAvOrTv' => { + Description => 'Safety Shift in AV oder TV', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'SampleFormat' => { + PrintConv => { + 'Complex int' => 'Komplexer Integer', + 'Float' => 'Fließkommawert', + 'Signed' => 'Vorzeichenbehafteter Integer', + 'Undefined' => 'Nicht definiert', + 'Unsigned' => 'Vorzeichenloser Integer', + }, + }, + 'SamplesPerPixel' => 'Anzahl der Komponenten', + 'Saturation' => { + Description => 'Farbsättigung', + PrintConv => { + '+1 (medium high)' => '+1 (Leicht erhöht)', + '+2 (high)' => '+2 (Hohe Farbsättigung)', + '+3 (very high)' => '+3 (Sehr hoch)', + '+4 (highest)' => '+4', + '+4 (maximum)' => '+4', + '-1 (medium low)' => '-1 (Leicht verringert)', + '-2 (low)' => '-2 (Geringe Farbsättigung)', + '-3 (very low)' => '-3 (Sehr gering)', + '-4 (lowest)' => '-4', + '-4 (minimum)' => '-4', + '0 (normal)' => '0 (Normal)', + 'B&W' => 'Schwarz/Weiß', + 'B&W Green Filter' => 'Schwarz-Weiß Grünfilter', + 'B&W Red Filter' => 'Schwarz-Weiß Rotfilter', + 'B&W Sepia' => 'Schwarz-Weiß Sepia', + 'B&W Yellow Filter' => 'Schwarz-Weiß Gelbfilter', + 'Black & White' => 'Schwarz/Weiß', + 'Film Simulation' => 'Film-Simulation', + 'High' => 'Hohe Farbsättigung', + 'Low' => 'Geringe Farbsättigung', + 'Medium High' => 'Mittel-Hoch', + 'Medium Low' => 'Mittel-Gering', + 'Natural' => 'Natürlich', + 'None' => 'Nicht gesetzt', + 'None (B&W)' => 'Keine (S&W)', + 'Toning Effect' => 'Tönungseffekt', + 'Vintage B&W' => 'Vintage Schwarz-Weiß', + 'Vivid' => 'Lebhaft', + }, + }, + 'SaturationAdj' => 'Sättigungskorrektur', + 'SaturationAdjustmentAqua' => 'Farbsättigung Korrektur Cyan', + 'SaturationAdjustmentBlue' => 'Farbsättigung Korrektur Blau', + 'SaturationAdjustmentGreen' => 'Farbsättigung Korrektur Grün', + 'SaturationAdjustmentMagenta' => 'Farbsättigung Korrektur Magenta', + 'SaturationAdjustmentOrange' => 'Farbsättigung Korrektur Orange', + 'SaturationAdjustmentPurple' => 'Farbsättigung Korrektur Lila', + 'SaturationAdjustmentRed' => 'Farbsättigung Korrektur Rot', + 'SaturationAdjustmentYellow' => 'Farbsättigung Korrektur Gelb', + 'SaturationFaithful' => { + Description => 'Farbsättigung Natürlich', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SaturationInfo' => 'Farbsättigung', + 'SaturationLandscape' => { + Description => 'Farbsättigung Landschaft', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SaturationMonochrome' => { + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SaturationNeutral' => { + Description => 'Farbsättigung Neutral', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SaturationPlanes' => 'Sättigungsebenen', + 'SaturationPortrait' => { + Description => 'Farbsättigung Porträt', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SaturationSetting' => 'Sättigungseinstellung', + 'SaturationStandard' => { + Description => 'Farbsättigung Standard', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SaturationUnknown' => { + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SaturationUserDef1' => { + Description => 'Farbsättigung Benutzerdefiniert 1', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SaturationUserDef2' => { + Description => 'Farbsättigung Benutzerdefiniert 2', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SaturationUserDef3' => { + Description => 'Farbsättigung Benutzerdefiniert 3', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ScaleFactor35efl' => 'Formatfaktor zu 35 mm', + 'ScanImageEnhancer' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Scene' => 'Szene', + 'SceneAssist' => 'Szenen-Assistent', + 'SceneCaptureType' => { + Description => 'Szenenaufnahmetyp', + PrintConv => { + 'Landscape' => 'Landschaft', + 'Night' => 'Nachtszene', + 'Portrait' => 'Porträt', + }, + }, + 'SceneMode' => { + Description => 'Szenen-Modus', + PrintConv => { + '3D Sweep Panorama' => '3D Sweep-Panorama', + 'Anti Motion Blur' => 'Verwackelungsschutz', + 'Aperture Priority' => 'Blendenpriorität', + 'Auto' => 'Automatisch', + 'Available Light' => 'Verfügbares Licht', + 'Baby' => 'Kleinkind', + 'Beach' => 'Strand', + 'Beach & Snow' => 'Strand & Schnee', + 'Behind Glass' => 'Hinterglas', + 'Candle' => 'Kerzenlicht', + 'Candlelight' => 'Kerzenlicht', + 'Children' => 'Kinder', + 'Color Effects' => 'Farbeffekte', + 'Cont. Priority AE' => 'Andauernde AE Priorität', + 'Creative Control' => 'Kreativprogramm', + 'Digital Filter' => 'Digitaler Filter', + 'Documents' => 'Dokumente', + 'Fireworks' => 'Feuerwerk', + 'Food' => 'Lebensmittel', + 'Handheld Night Shot' => 'Nachtaufnahme händisch', + 'High Key' => 'High-Key', + 'High Sensitivity' => 'Hohe Empfindlichkeit', + 'Indoor' => 'Innenaufnahme', + 'Intelligent ISO' => 'Iso Intelligent', + 'Landscape' => 'Landschaft', + 'Landscape+Portrait' => 'Landschaft+Porträt', + 'Low Key' => 'Low-Key', + 'Macro' => 'Makro', + 'Manual' => 'Manuell', + 'My Mode' => 'Benutzerdefiniert', + 'Night Landscape' => 'Landschaft bei Nacht', + 'Night Portrait' => 'Nachtporträt', + 'Night Scene' => 'Nachtszene', + 'Night Scenery' => 'Nachtszene', + 'Night View/Portrait' => 'Abendszene/Porträt', + 'Night+Portrait' => 'Nacht+Porträt', + 'Off' => 'Aus', + 'Pet' => 'Haustiere', + 'Portrait' => 'Porträt', + 'Program' => 'Programmautomatik', + 'Self Portrait' => 'Selbstporträt', + 'Self Portrait+Self Timer' => 'Selbstporträt+Selbstauslöser', + 'Shutter Priority' => 'Verschlusspriorität', + 'Snow' => 'Schnee', + 'Sports' => 'Sport', + 'Spot' => 'Spotmessung', + 'Starry Night' => 'Sternennacht', + 'Sunset' => 'Sonnenuntergang', + 'Super Macro' => 'Super-Makro', + 'Sweep Panorama' => 'Sweep-Panorama', + 'Underwater' => 'Unterwasser', + 'Underwater Macro' => 'Unterwasser Makro', + 'Underwater Wide1' => 'Unterwasserlandschaft', + 'Underwater Wide2' => 'Unterwasserlandschaft 2', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SceneModeUsed' => { + Description => 'Szenen-Modus', + PrintConv => { + 'Aperture Priority' => 'Blendenpriorität', + 'Beach' => 'Strand', + 'Candlelight' => 'Kerzenlicht', + 'Children' => 'Kinder', + 'Fireworks' => 'Feuerwerk', + 'Landscape' => 'Landschaft', + 'Macro' => 'Makro', + 'Manual' => 'Manuell', + 'Night Landscape' => 'Landschaft bei Nacht', + 'Night Portrait' => 'Nachtporträt', + 'Portrait' => 'Porträt', + 'Program' => 'Programmautomatik', + 'Shutter Priority' => 'Verschlusspriorität', + 'Snow' => 'Schnee', + 'Sunset' => 'Sonnenuntergang', + }, + }, + 'SceneSelect' => { + PrintConv => { + 'Night' => 'Nachtszene', + 'Off' => 'Aus', + }, + }, + 'SceneType' => { + Description => 'Szenentyp', + PrintConv => { + 'Directly photographed' => 'Direkt aufgenommenes Bild', + }, + }, + 'Security' => { + Description => 'Sicherheit', + PrintConv => { + 'Locked for annotations' => 'Gesperrt für Anmerkungen', + 'None' => 'Keine', + 'Password protected' => 'Passwort geschützt', + 'Read-only enforced' => 'Nur Lesen - erzwungen', + 'Read-only recommended' => 'Nur Lesen - vorgeschlagen', + }, + }, + 'SecurityClassification' => { + Description => 'Sicherheitsklassifizierung', + PrintConv => { + 'Confidential' => 'Vertraulich', + 'Restricted' => 'Eingeschränkt', + 'Secret' => 'Geheim', + 'Top Secret' => 'Streng geheim', + 'Unclassified' => 'Nicht klassifiziert', + }, + }, + 'SelectAFAreaSelectMode' => { + Description => 'AF-Bereich Auswahlmodus', + PrintConv => { + 'Disable' => 'Deaktiviert', + 'Enable' => 'Aktiviert', + 'Select AF-modes' => 'Wahl AF-Modus', + }, + }, + 'SelectableAFPoint' => { + Description => 'Wählbares AF-Feld', + PrintConv => { + '11 points' => '11 Felder', + '19 Points, Multi-controller selectable' => '19 Punkte, wählbar mit Multicontroller', + '19 points' => '19 Felder', + '45 points' => '45 Felder', + 'Inner 9 Points, Multi-controller selectable' => 'Innere 9 Punkte, wählbar mit Multicontroller', + 'Inner 9 points' => 'Innere 9 Felder', + 'Outer 9 Points, Multi-controller selectable' => 'Äußere 9 Punkte, wählbar mit Multicontroller', + 'Outer 9 points' => 'Äußere 9 Felder', + }, + }, + 'SelfTimer' => { + Description => 'Selbstauslöser', + PrintConv => { + '10 s / 3 pictures' => '10 s / 3 Bilder', + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'SelfTimer2' => 'Selbstauslöser (2)', + 'SelfTimerMode' => 'Selbstauslösermodus', + 'SelfTimerTime' => 'Selbstauslöser-Vorlaufzeit', + 'SensingMethod' => { + Description => 'Messmethode', + PrintConv => { + 'Color sequential area' => 'Color-Sequential-Area-Sensor', + 'Color sequential linear' => 'Color-Sequential-Linear-Sensor', + 'Monochrome area' => 'Monochrom-Sensor', + 'Monochrome linear' => 'Monochrom-linearer Sensor', + 'Not defined' => 'Nicht definiert', + 'One-chip color area' => 'Ein-Chip-Farbsensor', + 'Three-chip color area' => 'Drei-Chip-Farbsensor', + 'Trilinear' => 'Trilinearer Sensor', + 'Two-chip color area' => 'Zwei-Chip-Farbsensor', + }, + }, + 'SensitivityAdjust' => 'ISO-Empfindlichkeitsanpassung', + 'SensitivitySteps' => { + Description => 'Empfindlichkeits-Schritte', + PrintConv => { + '1 EV Steps' => '1 LW-Schritte', + 'As EV Steps' => 'Wie LW-Schritte', + }, + }, + 'SensitivityType' => { + Description => 'Art der Empfindlichkeit', + PrintConv => { + 'ISO Speed' => 'ISO Empfindlichkeit', + 'Recommended Exposure Index' => 'Empfohlener Belichtungsindex', + 'Recommended Exposure Index and ISO Speed' => 'Empfohlener Belichtungsindex und ISO Empfindlichkeit', + 'Standard Output Sensitivity' => 'Standard Ausgabeempfindlichkeit', + 'Standard Output Sensitivity and ISO Speed' => 'Standard Ausgabeempfindlichkeit und ISO Empfindlichkeit', + 'Standard Output Sensitivity and Recommended Exposure Index' => 'Standard Ausgabeempfindlichkeit und empfohlener Belichtungsindex', + 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed' => 'Standard Ausgabeempfindlichkeit,empfohlener Belichtungsindex und ISO Empfindlichkeit', + 'Unknown' => 'Unbekannt', + }, + }, + 'SensorBlueLevel' => 'Sensor Blau-Level', + 'SensorBottomBorder' => 'Sensor unterer Rand', + 'SensorCleaning' => { + Description => 'Sensorreinigung', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'SensorHeight' => 'Sensor Höhe', + 'SensorImageHeight' => 'Sensor-Bildhöhe', + 'SensorImageWidth' => 'Sensor-Bildbreite', + 'SensorLeftBorder' => 'Sensor linker Rand', + 'SensorPixelSize' => 'Sensor-Pixelgröße', + 'SensorRedLevel' => 'Sensor Rot-Level', + 'SensorRightBorder' => 'Sensor rechter Rand', + 'SensorSize' => 'Sensorgröße', + 'SensorTemperature' => 'Sensor Temperatur', + 'SensorTopBorder' => 'Sensor oberer Rand', + 'SensorWidth' => 'Sensor Breite', + 'SequenceNumber' => { + Description => 'Bildsequenznummer', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SequentialShot' => { + Description => 'Reihenaufnahme', + PrintConv => { + 'Adjust Exposure' => 'Belichtungskorrektur', + 'Best' => 'Beste', + 'None' => 'Keine', + }, + }, + 'SerialNumber' => 'Seriennummer', + 'SerialNumberFormat' => 'Seriennummer-Format', + 'ServiceIdentifier' => 'Service-ID', + 'SetButtonCrossKeysFunc' => { + Description => 'SET Taste/Kreuztaste Funkt.', + PrintConv => { + 'Cross keys: AF point select' => 'Kreuztaste:AF Feld Auswahl', + 'Set: Flash Exposure Comp' => 'SET:Blitzbelichtungskorrektur', + 'Set: Parameter' => 'SET:Parameter ändern', + 'Set: Picture Style' => 'SET:Bildstil', + 'Set: Playback' => 'SET:Wiedergabe', + 'Set: Quality' => 'SET:Qualität', + }, + }, + 'SetButtonFunction' => 'Funktion SET-Taste b. Aufnahme', + 'SetButtonWhenShooting' => { + Description => 'SET-Taste bei Aufnahme', + PrintConv => { + 'Change ISO speed' => 'ISO-Wert ändern', + 'Change parameters' => 'Parameter ändern', + 'Default (no function)' => 'Normal (gesperrt)', + 'Disabled' => 'Gesperrt', + 'Flash exposure compensation' => 'Blitzbelichtungskorrektur', + 'ISO speed' => 'ISO-Empfindlichkeit', + 'Image playback' => 'Bildwiedergabe', + 'Image quality' => 'Qualität ändern', + 'Image size' => 'Bildgröße', + 'LCD monitor On/Off' => 'LCD-Monitor Ein/Aus', + 'Menu display' => 'Menüanzeige', + 'Normal (disabled)' => 'Normal (gesperrt)', + 'Picture style' => 'Bildstil', + 'Quick control screen' => 'Schnelleinstellung Bildschirm', + 'Record func. + media/folder' => 'Aufnahme-Funktion + Medium/Ordner', + 'Record movie (Live View)' => 'Movie-Aufnahme (Livebild)', + 'White balance' => 'Weißabgleich', + }, + }, + 'SetFunctionWhenShooting' => { + Description => 'SET-Taste bei Aufnahme', + PrintConv => { + 'Change Parameters' => 'Parameter ändern', + 'Change Picture Style' => 'Bildstil', + 'Change quality' => 'Qualität ändern', + 'Default (no function)' => 'Normal (gesperrt)', + 'Image replay' => 'Bildwiedergabe', + 'Menu display' => 'Menüanzeige', + }, + }, + 'ShadingCompensation' => { + Description => 'Schattenaufhellung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ShadingCompensation2' => { + Description => 'Schattenaufhellung 2', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Shadow' => 'Schatten', + 'Shadows' => 'Schatten', + 'ShakeReduction' => { + Description => 'Bildstabilisator (Einstellung)', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ShakeReductionInfo' => 'Bildstabilisator', + 'SharpenDetail' => 'Schärfungsdetail', + 'SharpenRadius' => 'Schärfungsradius', + 'Sharpening' => { + Description => 'Schärfung', + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Niedrig', + 'Medium High' => 'Mittel', + 'Off' => 'Aus', + }, + }, + 'SharpeningAdj' => 'Schärfekorrektur', + 'Sharpness' => { + Description => 'Schärfe', + PrintConv => { + '+1 (medium hard)' => '+1 (Leicht erhöht)', + '+2 (hard)' => '+2 (Stark)', + '+3 (very hard)' => '+3 (Sehr hoch)', + '+4 (hardest)' => '+4', + '+4 (maximum)' => '+4', + '-1 (medium soft)' => '-1 (Leicht verringert)', + '-2 (soft)' => '-2 (Leicht)', + '-3 (very soft)' => '-3 (Sehr weich)', + '-4 (minimum)' => '-4', + '-4 (softest)' => '-4', + '0 (normal)' => '0 (Normal)', + 'Film Simulation' => 'Film-Simulation', + 'Hard' => 'Stark', + 'Sharp' => 'Hart', + 'Soft' => 'Leicht', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SharpnessAdj' => 'Schärfekorrektur', + 'SharpnessFactor' => 'Schärfungsfaktor', + 'SharpnessFaithful' => { + Description => 'Schärfe Natürlich', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SharpnessFrequency' => { + PrintConv => { + 'High' => 'Hoch', + 'Highest' => 'Höchste', + 'Low' => 'Leicht', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SharpnessLandscape' => { + Description => 'Schärfe Landschaft', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SharpnessMonochrome' => { + Description => 'Schärfe Monochrom', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SharpnessNeutral' => { + Description => 'Schärfe Neutral', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SharpnessOvershoot' => 'Schärfe Grenzwertüberschreitung', + 'SharpnessPortrait' => { + Description => 'Schärfe Porträt', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SharpnessSetting' => 'Schärfeeinstellung', + 'SharpnessStandard' => { + Description => 'Schärfe Standard', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SharpnessTable' => 'Schärfe Tabelle', + 'SharpnessThreshold' => 'Schärfe Grenzwert', + 'SharpnessUndershoot' => 'Schärfe Grenzwertunterschreitung', + 'SharpnessUnknown' => { + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SharpnessUserDef1' => { + Description => 'Schärfe Benutzerdefiniert 1', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SharpnessUserDef2' => { + Description => 'Schärfe Benutzerdefiniert 2', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SharpnessUserDef3' => { + Description => 'Schärfe Benutzerdefiniert 3', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ShootingInfoDisplay' => { + Description => 'Aufnahmeinfo-Ansicht', + PrintConv => { + 'Auto' => 'Automatisch', + 'Manual (dark on light)' => 'Manuell - Dunkel auf Hell', + 'Manual (light on dark)' => 'Manuell - Hell auf dunkel', + }, + }, + 'ShootingMode' => { + Description => 'Aufnahmemodus', + PrintConv => { + 'Aperture Priority' => 'Blendenpriorität', + 'Baby' => 'Kleinkind', + 'Beach' => 'Strand', + 'Candlelight' => 'Kerzenlicht', + 'Color Effects' => 'Farbeffekte', + 'Fireworks' => 'Feuerwerk', + 'Food' => 'Lebensmittel', + 'High Sensitivity' => 'Hohe Empfindlichkeit', + 'Macro' => 'Makro', + 'Manual' => 'Manuell', + 'Night Portrait' => 'Nachtporträt', + 'Night Scenery' => 'Nachtszene', + 'Pet' => 'Haustiere', + 'Portrait' => 'Porträt', + 'Program' => 'Programmautomatik', + 'Self Portrait' => 'Selbstportait', + 'Shutter Priority' => 'Verschlusspriorität', + 'Snow' => 'Schnee', + 'Sports' => 'Sport', + 'Spot' => 'Spotmessung', + 'Starry Night' => 'Sternennacht', + 'Sunset' => 'Sonnenuntergang', + 'Underwater' => 'Unterwasser', + }, + }, + 'ShootingModeSetting' => { + Description => 'Messfeldsteuerung', + PrintConv => { + 'Continuous' => 'Serienaufnahme', + 'Delayed Remote' => 'Fernauslöser m. Vorlauf', + 'Quick-response Remote' => 'Fernauslöser', + 'Self-timer' => 'Selbstauslöser', + 'Single Frame' => 'Einzelbild', + }, + }, + 'ShortDescription' => 'Kurzbeschreibung', + 'ShortDocumentID' => 'Kurze Bild-ID', + 'ShortReleaseTimeLag' => { + Description => 'Verkürzte Auslöseverzögerung', + PrintConv => { + 'Disable' => 'Ausgeschaltet', + 'Enable' => 'Eingeschaltet', + }, + }, + 'ShotInfoVersion' => 'Aufnahmeinfo-Version', + 'Shutter-AELock' => { + Description => 'Auslöser/AE-Speicherung', + PrintConv => { + 'AE lock/AF' => 'AE-Speicherung/AF', + 'AE/AF, No AE lock' => 'AE/AF, keine AE-Speicherung', + 'AF/AE lock' => 'AF/AE-Speicherung', + 'AF/AF lock' => 'AF/AF-Speicherung', + 'AF/AF lock, No AE lock' => 'AF/AF-Speicherung, keine AE-Speicherung', + }, + }, + 'ShutterAELButton' => 'Auslöser/AE-Speichertaste', + 'ShutterButtonAFOnButton' => { + Description => 'Auslöser/AF-Starttaste', + PrintConv => { + 'AE lock/Metering + AF start' => 'AESpeicherung/Messung+AFStart', + 'Metering + AF start' => 'Messung+AFStart', + 'Metering + AF start/AF stop' => 'Messung+AFStart / AFStopp', + 'Metering + AF start/disable' => 'Messung+AFStart/Deaktiviert', + 'Metering start/Meter + AF start' => 'Messung Start/Mess.+AFStart', + }, + }, + 'ShutterCount' => 'Anzahl der Auslösungen', + 'ShutterCurtainSync' => { + Description => 'Verschluss-Synchronisation', + PrintConv => { + '1st-curtain sync' => '1. Verschlussvorhang', + '2nd-curtain sync' => '2. Verschlussvorhang', + }, + }, + 'ShutterMode' => { + PrintConv => { + 'Aperture Priority' => 'Blendenpriorität', + 'Auto' => 'Automatisch', + }, + }, + 'ShutterReleaseButtonAE-L' => { + Description => 'Belichtungsspeicher', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ShutterReleaseMethod' => { + PrintConv => { + 'Continuous Shooting' => 'Serienaufnahme', + 'Single Shot' => 'Einzelbild', + }, + }, + 'ShutterReleaseNoCFCard' => { + Description => 'Verschlussausl. ohne Karte', + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'ShutterReleaseTiming' => { + PrintConv => { + 'Priority on focus' => 'Schärfepriorität', + 'Priority on shutter' => 'Verschlußpriorität', + }, + }, + 'ShutterSpeed' => 'Belichtungsdauer', + 'ShutterSpeedDisplayed' => 'Angezeigte Belichtungszeit', + 'ShutterSpeedRange' => { + Description => 'Einstellung Blendenbereich', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'ShutterSpeedSetting' => 'Belichtungszeit Einstellung', + 'ShutterSpeedValue' => 'Belichtungszeit', + 'SimilarityIndex' => 'Bildgleichheits-Index', + 'SingleFrameBracketing' => { + Description => 'Einzelbild-Belichtungsreihe', + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Niedrig', + }, + }, + 'SlaveFlashMeteringSegments' => 'Slave-Blitz-Messfeld', + 'SlideShow' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'SlowShutter' => { + Description => 'Langzeitbelichtungseinstellung', + PrintConv => { + 'Night Scene' => 'Nachtszene', + 'None' => 'Keine', + 'Off' => 'Aus', + 'On' => 'Ein', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SlowSync' => { + Description => 'Slow-Synchro', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'SoftSkinEffect' => { + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'SonyImageSize' => { + Description => 'Sony Bildgröße', + PrintConv => { + 'Large' => 'Groß', + 'Large (16:9)' => 'Groß (16:9)', + 'Large (3:2)' => 'Groß (3:2)', + 'Medium' => 'Mittel', + 'Medium (16:9)' => 'Mittel (16:9)', + 'Medium (3:2)' => 'Mittel (3:2)', + 'Small' => 'Klein', + 'Small (16:9)' => 'Klein (16:9)', + 'Small (3:2)' => 'Klein (3:2)', + }, + }, + 'Source' => 'Quelle', + 'SpatialFrequencyResponse' => 'Raumfrequenz-Antwort', + 'SpecialEffectMode' => { + Description => 'Spezialeffekte Modus', + PrintConv => { + 'Mist Removal' => 'Dunstentfernung', + 'Off' => 'Aus', + 'Vivid Landscape' => 'Lebende Landschaft', + }, + }, + 'SpecialEffectsOpticalFilter' => { + Description => 'Spezialeffekt Filter', + PrintConv => { + 'Colored' => 'Farbfilter', + 'Diffusion' => 'Diffusionsfilter', + 'Multi-image' => 'Mehrfachbildfilter', + 'None' => 'Keiner', + 'Polarizing' => 'Polarisationsfilter', + 'Split-field' => 'Splitfilter', + 'Star' => 'Sternenfilter', + }, + }, + 'SpecialInstructions' => 'Anweisungen', + 'SpecialMode' => 'Spezialmodus', + 'SpectralSensitivity' => 'Spektralempfindlichkeit', + 'SpotFocusPointX' => 'Spot-Fokuspunkt X', + 'SpotFocusPointY' => 'Spot-Fokuspunkt Y', + 'SpotMeterLinkToAFPoint' => { + Description => 'Spotmessung AF-Feld verknüpft', + PrintConv => { + 'Disable (use center AF point)' => 'Deaktiviert (zentrales AF-Feld)', + 'Enable (use active AF point)' => 'Aktiviert (aktives AF-Feld)', + }, + }, + 'SpotMeteringMode' => { + Description => 'Spot-Messmethode', + PrintConv => { + 'AF Point' => 'AF-Punkt', + 'Center' => 'Mitte', + }, + }, + 'State' => 'Bundesland/Kanton', + 'StereoMode' => 'Stereomodus', + 'StripByteCounts' => 'Anzahl Bytes pro komprimiertem Bildabschnitt', + 'StripOffsets' => 'Bilddatenposition', + 'Sub-location' => 'Ort des Motivs', + 'SubSecCreateDate' => 'Digitalisierungsdatum/-uhrzeit', + 'SubSecDateTimeOriginal' => 'Erstellungsdatum/-uhrzeit', + 'SubSecModifyDate' => 'Änderungsdatum', + 'SubSecTime' => 'Datum/Uhrzeit 1/100 Sekunden', + 'SubSecTimeDigitized' => 'Digitalisierungsdatum/-uhrzeit 1/100 Sekunden', + 'SubSecTimeOriginal' => 'Erstellungsdatum/-uhrzeit 1/100 Sekunden', + 'SubfileType' => { + Description => 'Unterdatei-Typ', + PrintConv => { + 'Alternate reduced-resolution image' => 'Alternatives Bild in reduzierter Auflösung', + 'Full-resolution image' => 'Bild in voller Auflösung', + 'Reduced-resolution image' => 'Bild in reduzierter Auflösung', + 'Single page of multi-page image' => 'Einzelbild eines mehrseitigen Bildes', + 'Single page of multi-page reduced-resolution image' => 'Einzelbild eines mehrseitigen Bildes in reduzierter Auflösung', + 'TIFF-FX mixed raster content' => 'TIFF-FX gersteter Inhalt', + 'TIFF/IT final page' => 'TIFF/IT endgültige Seite', + 'Thumbnail image' => 'Miniaturbild', + 'Transparency mask' => 'Transparenzmaske', + 'Transparency mask of multi-page image' => 'Transparenzmaske eines mehrseitigen Bildes', + 'Transparency mask of reduced-resolution image' => 'Transparenzmaske eines Bildes in reduzierter Auflösung', + 'Transparency mask of reduced-resolution multi-page image' => 'Transparenzmaske eines mehrseitigen Bildes in reduzierter Auflösung', + }, + }, + 'SubimageColor' => { + PrintConv => { + 'Monochrome' => 'Monochrom', + }, + }, + 'Subject' => 'Themen/Schlüsselwörter', + 'SubjectArea' => 'Hauptobjektposition', + 'SubjectCode' => 'IPTC Themencode', + 'SubjectDistance' => 'Objektentfernung', + 'SubjectDistanceRange' => { + Description => 'Objektdistanzbereich', + PrintConv => { + 'Close' => 'Nahaufnahme', + 'Distant' => 'Fernaufnahme', + 'Macro' => 'Makro', + 'Unknown' => 'Unbekannt', + }, + }, + 'SubjectLocation' => 'Hauptobjektposition', + 'SubjectProgram' => { + Description => 'Szenenauswahl', + PrintConv => { + 'Night portrait' => 'Nachtporträt', + 'None' => 'Keine', + 'Portrait' => 'Porträt', + 'Sports action' => 'Sportereignis', + 'Sunset' => 'Sonnenuntergang', + }, + }, + 'SubjectReference' => 'Themencode', + 'SubjectUnits' => { + PrintConv => { + 'meters' => 'Meter', + 'radians' => 'Winkelgrade', + }, + }, + 'Subsystem' => { + PrintConv => { + 'Unknown' => 'Unbekannt', + }, + }, + 'SuperMacro' => { + Description => 'Super Makro', + PrintConv => { + 'Off' => 'Aus', + }, + }, + 'SuperimposedDisplay' => { + Description => 'Eingeblendete Anzeige', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'SupplementalCategories' => 'Zusätzliche Kategorien', + 'SvISOSetting' => 'Sv ISO-Einstellung', + 'SwitchToRegisteredAFPoint' => { + Description => 'Auf gesp. AF-Messf. schalten', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + 'Only while AEL is pressed' => 'Nur während AEL gedrückt', + 'Switch with multi-controller' => 'Wechseln mit Multicontroller', + }, + }, + 'T4Options' => 'Füllbits hinzugefügt', + 'T6Options' => 'T6 Optionen', + 'T82Options' => 'T82 Option', + 'TIFFPreview' => 'TIFF Vorschaubild', + 'TIFF_FXExtensions' => { + PrintConv => { + 'B&W JBIG2' => 'Schwarz-Weiß JBIG2', + }, + }, + 'TTL_DA_ADown' => 'Slave-Blitz-Messfeld 6', + 'TTL_DA_AUp' => 'Slave-Blitz-Messfeld 5', + 'TTL_DA_BDown' => 'Slave-Blitz-Messfeld 8', + 'TTL_DA_BUp' => 'Slave-Blitz-Messfeld 7', + 'Tagged' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'TargetAperture' => 'Zielblendenwert', + 'TargetCompressionRatio' => 'Ziel-Komprimierungsrate', + 'TargetExposureTime' => 'Zielbelichtungszeit', + 'Technology' => { + Description => 'Technologie', + PrintConv => { + 'Active Matrix Display' => 'Aktives Matrix-Display', + 'Cathode Ray Tube Display' => 'Kathodenstrahlröhrenbildschirm', + 'Digital Camera' => 'Digitalkamera', + 'Dye Sublimation Printer' => 'Thermosublimationsdrucker', + 'Electrophotographic Printer' => 'Laserdrucker', + 'Electrostatic Printer' => 'Elektrostatischer Drucker', + 'Film Scanner' => 'Film-Scanner', + 'Film Writer' => 'Film-Writer', + 'Flexography' => 'Flexographie', + 'Gravure' => 'Gravur', + 'Ink Jet Printer' => 'Tintenstrahldrucker', + 'Offset Lithography' => 'Offset Lithographie', + 'Passive Matrix Display' => 'Passives Matrix-Display', + 'Photo CD' => 'Photo-CD', + 'Photo Image Setter' => 'Foto-Filmbelichter', + 'Photographic Paper Printer' => 'Fotopapierdrucker', + 'Projection Television' => 'Projektionsfernsehgerät', + 'Reflective Scanner' => 'Reflexionsscanner', + 'Thermal Wax Printer' => 'Thermowachsdrucker', + 'Video Camera' => 'Videokamera', + 'Video Monitor' => 'Video-Monitor', + }, + }, + 'Teleconverter' => { + Description => 'Telekonverter', + PrintConv => { + 'None' => 'Keiner', + }, + }, + 'TextEncoding' => { + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'TextStamp' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ThumbnailFileName' => 'Miniaturbild-Dateiname', + 'ThumbnailFormat' => 'Miniaturbild-Format', + 'ThumbnailHeight' => 'Miniaturbild-Höhe', + 'ThumbnailImage' => 'Miniaturbild', + 'ThumbnailImageName' => 'Miniaturbild-Name', + 'ThumbnailImageSize' => 'Miniaturbild-Größe', + 'ThumbnailImageType' => 'Miniaturbild-Typ', + 'ThumbnailImageValidArea' => 'Gültiger Bereich des Miniaturbildes', + 'ThumbnailLength' => 'Miniaturbild-Datenlänge', + 'ThumbnailOffset' => 'Miniaturbild-Datenposition', + 'ThumbnailWidth' => 'Miniaturbild-Breite', + 'Time' => 'Zeit', + 'TimeCreated' => 'Erstellungszeit', + 'TimeScaleParamsQuality' => { + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Leicht', + }, + }, + 'TimeSent' => 'Absendezeit', + 'TimeSincePowerOn' => 'Einschaltdauer', + 'TimeStamp' => 'Zeitstempel', + 'TimeStamp1' => 'Zeitstempel (1)', + 'TimeZone' => 'Zeitzone', + 'TimeZoneCity' => { + Description => 'Zeitzone Stadt', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'TimeZoneCode' => 'Zeitzonen-Code', + 'TimeZoneInfo' => 'Zeitzonen-Info', + 'TimeZoneOffset' => 'Zeitzonen-Offset', + 'TimerFunctionButton' => { + Description => 'Funktionstaste', + PrintConv => { + 'Auto Bracketing' => 'Belichtungsreihe', + 'ISO' => 'ISO-Empfindlichkeit', + 'Image Quality/Size' => 'Bildqualität/-größe', + 'Self-timer' => 'Selbstauslöser', + 'Shooting Mode' => 'Aufnahmebetriebsart', + 'White Balance' => 'Weißabgleich', + }, + }, + 'TimerLength' => { + Description => 'Intervalldauer für Timer', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'Title' => 'Titel', + 'ToneComp' => 'Tonwertkorrektur', + 'ToneCurve' => { + Description => 'Ton-Kurve', + PrintConv => { + 'Custom' => 'Benutzerdefiniert', + 'Manual' => 'Manuell', + }, + }, + 'ToneCurve1' => 'Tonwertkurve 1', + 'ToneCurve2' => 'Tonwertkurve 2', + 'ToneCurve3' => 'Tonwertkurve 3', + 'ToneCurve4' => 'Tonwertkurve 4', + 'ToneCurveActive' => { + Description => 'Tonwertkurve aktiv', + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'ToneCurveBlue' => 'Tonwertkurve Blau', + 'ToneCurveBlueX' => 'Tonwertkurve Blau X', + 'ToneCurveBlueY' => 'Tonwertkurve Blau Y', + 'ToneCurveBrightnessX' => 'Tonwertkurve Helligkeit X', + 'ToneCurveBrightnessY' => 'Tonwertkurve Helligkeit Y', + 'ToneCurveFileName' => 'Tonwertkurve Dateiname', + 'ToneCurveGreen' => 'Tonwertkurve Grün', + 'ToneCurveGreenX' => 'Tonwertkurve Grün X', + 'ToneCurveGreenY' => 'Tonwertkurve Grün Y', + 'ToneCurveInterpolation' => { + Description => 'Tonwertkurve Interpolation', + PrintConv => { + 'Curve' => 'Kurve', + 'Straight' => 'Gerade', + }, + }, + 'ToneCurveMatching' => 'Tonwertkurve Ãœbereinstimmung', + 'ToneCurveMode' => { + Description => 'Tonwertkurve Modus', + PrintConv => { + 'Luminance' => 'Luminanz', + }, + }, + 'ToneCurveName' => { + Description => 'Tonwertkurve Name', + PrintConv => { + 'Custom' => 'Benutzerdefiniert', + 'Medium Contrast' => 'Kontrast mittel', + 'Strong Contrast' => 'Kontrast stark', + }, + }, + 'ToneCurveName2012' => 'Tonwertkurve Name 2012', + 'ToneCurvePV2012' => 'Tonwertkurve PV2012', + 'ToneCurvePV2012Blue' => 'Tonwertkurve PV2012 Blau', + 'ToneCurvePV2012Green' => 'Tonwertkurve PV2012 Grün', + 'ToneCurvePV2012Red' => 'Tonwertkurve PV2012 Rot', + 'ToneCurveProperty' => { + Description => 'Tonwertkurve Eigenschaft', + PrintConv => { + 'Custom 1' => 'Benutzerdefiniert 1', + 'Custom 2' => 'Benutzerdefiniert 2', + 'Custom 3' => 'Benutzerdefiniert 3', + 'Custom 4' => 'Benutzerdefiniert 4', + 'Custom 5' => 'Benutzerdefiniert 5', + 'Shot Settings' => 'Aufnahmeeinstellung', + }, + }, + 'ToneCurveRed' => 'Tonwertkurve Rot', + 'ToneCurveRedX' => 'Tonwertkurve Rot X', + 'ToneCurveRedY' => 'Tonwertkurve Rot Y', + 'ToneCurveTable' => 'Tonwertkurve Tabelle', + 'ToneCurves' => 'Ton-Kurven', + 'ToningEffect' => { + Description => 'Tönungseffekt', + PrintConv => { + 'B&W' => 'Schwarz/Weiß', + 'Blue' => 'Blau', + 'Blue-green' => 'Blau-Grün', + 'Color' => 'Farbe', + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Purple' => 'Lila', + 'Purple-blue' => 'Violett-Blau', + 'Red' => 'Rot', + 'Red-purple' => 'Rot-Violett', + 'Yellow' => 'Gelb', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ToningEffectFaithful' => { + Description => 'Tönungseffekt Natürlich', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ToningEffectLandscape' => { + Description => 'Tönungseffekt Landschaft', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ToningEffectMonochrome' => { + Description => 'Tönungseffekt Monochrom', + PrintConv => { + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Purple' => 'Lila', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ToningEffectNeutral' => { + Description => 'Tönungseffekt Neutral', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ToningEffectPortrait' => { + Description => 'Tönungseffekt Porträt', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ToningEffectStandard' => { + Description => 'Tönungseffekt Standard', + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ToningEffectUnknown' => { + Description => 'Tönungseffekt Unbekannt', + PrintConv => { + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Purple' => 'Lila', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ToningEffectUserDef1' => { + Description => 'Tönungseffekt Benutzerdefiniert 1', + PrintConv => { + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Purple' => 'Lila', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ToningEffectUserDef2' => { + Description => 'Tönungseffekt Benutzerdefiniert 2', + PrintConv => { + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Purple' => 'Lila', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ToningEffectUserDef3' => { + Description => 'Tönungseffekt Benutzerdefiniert 3', + PrintConv => { + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'None' => 'Keiner', + 'Purple' => 'Lila', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ToningSaturation' => 'Tönungssättigung', + 'TotalZoom' => 'Gesamtzoom', + 'TrailerSignature' => 'Signatur des Nachspanns', + 'TransferFunction' => 'Transformationsfunktion', + 'Transform' => { + Description => 'Transformation', + PrintConv => { + 'Off' => 'Aus', + 'Slim High' => 'Stark abnehmend', + 'Slim Low' => 'Wenig abnehmend', + 'Stretch High' => 'Stark streckend', + 'Stretch Low' => 'Wenig streckend', + }, + }, + 'Transformation' => { + PrintConv => { + 'Mirror horizontal' => 'Horizontal gespiegelt', + 'Mirror horizontal and rotate 270 CW' => 'Horizontal gespiegelt und 90° gegen den Uhrzeigersinn', + 'Mirror horizontal and rotate 90 CW' => 'Horizontal gespiegelt und 90° im Uhrzeigersinn', + 'Mirror vertical' => 'Vertikal gespiegelt', + 'Rotate 180' => '180° gedreht', + 'Rotate 270 CW' => '90° gegen den Uhrzeigersinn', + 'Rotate 90 CW' => '90° im Uhrzeigersinn', + }, + }, + 'TransmissionReference' => 'Anbietervermerk', + 'Trapped' => { + PrintConv => { + 'Unknown' => 'Unbekannt', + }, + }, + 'TravelDay' => 'Reisetag', + 'TvExposureTimeSetting' => 'Tv Belichtungszeit-Einstellung', + 'Type' => 'Typ', + 'TypeOfOriginal' => { + PrintConv => { + 'B&W Document' => 'Schwarz-Weiß Dokument', + 'B&W Print' => 'Schwarz-Weiß Druck', + 'Color Document' => 'Farb Dokument', + 'Color Print' => 'Farbdruck', + }, + }, + 'USMLensElectronicMF' => { + Description => 'USM-Objektiv, elektr. MF', + PrintConv => { + 'Disable after one-shot AF' => 'Nicht mögl. nach One-Shot AF', + 'Disable in AF mode' => 'Nicht möglich im AF-Modus', + 'Enable after one-shot AF' => 'Möglich nach One-Shot AF', + }, + }, + 'Uncompressed' => { + Description => 'Unkomprimiert', + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'UniqueCameraModel' => 'Eindeutige Kamerabezeichnung', + 'UniqueDocumentID' => 'Eindeutige Bild-ID', + 'Unknown' => 'Unbekannt', + 'UnknownInfoVersion' => 'Unbekannte Info Version', + 'UnknownLinear' => { + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'Unknown_CNDB' => 'CNDB unbekannt', + 'Unsharp1Color' => { + PrintConv => { + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + }, + }, + 'Unsharp2Color' => { + PrintConv => { + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + }, + }, + 'Unsharp3Color' => { + PrintConv => { + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + }, + }, + 'Unsharp4Color' => { + PrintConv => { + 'Blue' => 'Blau', + 'Green' => 'Grün', + 'Red' => 'Rot', + 'Yellow' => 'Gelb', + }, + }, + 'UnsharpMask' => { + Description => 'Unschärfemaske', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Urgency' => { + Description => 'Dringlichkeit', + PrintConv => { + '0 (reserved)' => '0 (reserviert)', + '1 (most urgent)' => '1 (sehr dringend)', + '5 (normal urgency)' => '5 (normale Dringlichkeit)', + '8 (least urgent)' => '8 (geringe Dringlichkeit)', + '9 (user-defined priority)' => '9 (benutzerdefinierte Priorität)', + }, + }, + 'UsableMeteringModes' => { + Description => 'Wahl nutzbarer Messmethoden', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'UsableShootingModes' => { + Description => 'Wahl nutzbarer Aufnahmemodi', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'UsageTerms' => 'Nutzungsbedingungen', + 'UserComment' => 'Benutzerkommentar', + 'UserDef1PictureStyle' => { + Description => 'Bildstil Benutzerdefiniert 1', + PrintConv => { + 'Faithful' => 'Natürlich', + 'Landscape' => 'Landschaft', + 'Monochrome' => 'Monochrom', + 'Portrait' => 'Porträt', + }, + }, + 'UserDef2PictureStyle' => { + Description => 'Bildstil Benutzerdefiniert 2', + PrintConv => { + 'Faithful' => 'Natürlich', + 'Landscape' => 'Landschaft', + 'Monochrome' => 'Monochrom', + 'Portrait' => 'Porträt', + }, + }, + 'UserDef3PictureStyle' => { + Description => 'Bildstil Benutzerdefiniert 3', + PrintConv => { + 'Faithful' => 'Natürlich', + 'Landscape' => 'Landschaft', + 'Monochrome' => 'Monochrom', + 'Portrait' => 'Porträt', + }, + }, + 'UserFields' => 'Benutzerfelder', + 'UserProfile' => { + Description => 'Benutzerprofil', + PrintConv => { + 'User Profile 0 (Dynamic)' => 'Benutzerprofil 0 (dynamisch)', + 'User Profile 1' => 'Benutzerprofil 1', + 'User Profile 2' => 'Benutzerprofil 2', + 'User Profile 3' => 'Benutzerprofil 3', + }, + }, + 'VFDisplayIllumination' => { + PrintConv => { + 'Disable' => 'Deaktiviert', + 'Enable' => 'Aktiviert', + }, + }, + 'VRDVersion' => 'VRD-Version', + 'VRInfo' => 'Bildstabilisator-Informationen', + 'VRInfoVersion' => 'VR-Info-Version', + 'VR_0x66' => { + PrintConv => { + 'Off' => 'Aus', + 'On (active)' => 'Ein (Aktiv)', + 'On (normal)' => 'Ein (Normal)', + }, + }, + 'ValidAFPoints' => 'Gültige AF-Punkte', + 'ValidBits' => 'Verwendete Bits', + 'ValidPixelDepth' => 'Farbtiefe', + 'VariProgram' => 'Aufnahmeprogramm', + 'VibrationReduction' => { + Description => 'Bildstabilisation', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + 'On (1)' => 'Ein (1)', + 'On (2)' => 'Ein (2)', + 'On (3)' => 'Ein (3)', + 'n/a' => '(nicht gesetzt)', + }, + }, + 'ViewInfoDuringExposure' => { + Description => 'Sucherinfo bei Belichtung', + PrintConv => { + 'Disable' => 'Nicht möglich', + 'Enable' => 'Möglich', + }, + }, + 'ViewfinderWarning' => { + Description => 'Warnsymbol im Sucher', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'ViewfinderWarnings' => { + PrintConv => { + 'ISO expansion' => 'ISO-Erweiterung', + }, + }, + 'ViewingMode2' => { + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'VignetteControl' => { + Description => 'Vignettierungskorrektur', + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Schwach', + 'Normal' => 'Mittel', + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'VignetteControlIntensity' => 'Vignettierungskorrektur Stärke', + 'VignettingCorrection' => { + PrintConv => { + 'n/a' => '(nicht gesetzt)', + }, + }, + 'VirtualImageHeight' => 'Virtuelle Bildhöhe', + 'VirtualImageWidth' => 'Virtuelle Bildbreite', + 'VirtualPageUnits' => 'Virtuelle Seitenzahl', + 'VoiceMemo' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Volume' => 'Band', + 'WBAdjColorTemp' => 'Weißabgleich Farbtemperaturkorrektur', + 'WBAdjLighting' => { + PrintConv => { + 'Daylight (cloudy)' => 'Tageslicht (2)', + 'Daylight (direct sunlight)' => 'Tageslicht (0)', + 'Daylight (shade)' => 'Tageslicht (1)', + 'Flash' => 'Blitz', + 'Incandescent' => 'Glühbirne', + 'None' => 'Keines', + }, + }, + 'WBBlueLevel' => 'Farbabgleich Blau', + 'WBBracketMode' => { + Description => 'Weißabgleich Belichtungsreihen-Modus', + PrintConv => { + 'Off' => 'Aus', + 'On (shift AB)' => 'Ein (AB-Verschiebung)', + 'On (shift GM)' => 'Ein (GM-Verschiebung)', + }, + }, + 'WBBracketShotNumber' => 'Weißabgleich-Belichtungsreihen-Bildnummer', + 'WBBracketValueAB' => 'Weißabgleich AB-Belichtungsreihen-Wert', + 'WBBracketValueGM' => 'Weißabgleich GM-Belichtungsreihen-Wert', + 'WBFineTuneActive' => { + Description => 'Weißabgleich Feinabstimmung aktiv', + PrintConv => { + 'No' => 'Nein', + 'Yes' => 'Ja', + }, + }, + 'WBFineTuneSaturation' => 'Weißabgleich Sättigung Feinabstimmung', + 'WBFineTuneTone' => 'Weißabgleich Farbton Feinabstimmung', + 'WBGreenLevel' => 'Farbabgleich Grün', + 'WBMediaImageSizeSetting' => { + Description => 'WB+Media/Bildgrößeneinstellung', + PrintConv => { + 'LCD monitor' => 'LCD-Monitor', + 'Rear LCD panel' => 'Hinteres LCD-Panel', + }, + }, + 'WBMode' => { + PrintConv => { + 'Auto' => 'Automatisch', + }, + }, + 'WBRedLevel' => 'Farbabgleich Rot', + 'WBShiftAB' => 'Weißabgleich AB-Korrektur', + 'WBShiftGM' => 'Weißabgleich GM-Korrektur', + 'WB_GBRGLevels' => 'Weißabgleich GBRG-Farbverteilung', + 'WB_GLevel' => 'Weißabgleich G-Farbverteilung', + 'WB_GLevel3000K' => 'Weißabgleich G-Farbverteilung 3000K', + 'WB_GLevel3300K' => 'Weißabgleich G-Farbverteilung 3300K', + 'WB_GLevel3600K' => 'Weißabgleich G-Farbverteilung 3600K', + 'WB_GLevel3900K' => 'Weißabgleich G-Farbverteilung 3900K', + 'WB_GLevel4000K' => 'Weißabgleich G-Farbverteilung 4000K', + 'WB_GLevel4300K' => 'Weißabgleich G-Farbverteilung 4300K', + 'WB_GLevel4500K' => 'Weißabgleich G-Farbverteilung 4500K', + 'WB_GLevel4800K' => 'Weißabgleich G-Farbverteilung 4800K', + 'WB_GLevel5300K' => 'Weißabgleich G-Farbverteilung 5300K', + 'WB_GLevel6000K' => 'Weißabgleich G-Farbverteilung 6000K', + 'WB_GLevel6600K' => 'Weißabgleich G-Farbverteilung 6600K', + 'WB_GLevel7500K' => 'Weißabgleich G-Farbverteilung 7500K', + 'WB_GRBGLevels' => 'Weißabgleich GRBG-Farbverteilung', + 'WB_GRGBLevels' => 'Weißabgleich GRGB-Farbverteilung', + 'WB_RBGGLevels' => 'Weißabgleich RBGG-Farbverteilung', + 'WB_RBLevels' => 'Weißabgleich RB-Farbverteilung', + 'WB_RBLevels3000K' => 'Weißabgleich RB-Farbverteilung 3000K', + 'WB_RBLevels3300K' => 'Weißabgleich RB-Farbverteilung 3300K', + 'WB_RBLevels3600K' => 'Weißabgleich RB-Farbverteilung 3600K', + 'WB_RBLevels3900K' => 'Weißabgleich RB-Farbverteilung 3800K', + 'WB_RBLevels4000K' => 'Weißabgleich RB-Farbverteilung 4000K', + 'WB_RBLevels4300K' => 'Weißabgleich RB-Farbverteilung 4300K', + 'WB_RBLevels4500K' => 'Weißabgleich RB-Farbverteilung 4500K', + 'WB_RBLevels4800K' => 'Weißabgleich RB-Farbverteilung 4800K', + 'WB_RBLevels5300K' => 'Weißabgleich RB-Farbverteilung 5300K', + 'WB_RBLevels6000K' => 'Weißabgleich RB-Farbverteilung 6000K', + 'WB_RBLevels6600K' => 'Weißabgleich RB-Farbverteilung 6600K', + 'WB_RBLevels7500K' => 'Weißabgleich RB-Farbverteilung 7500K', + 'WB_RBLevelsAuto' => 'Weißabgleich RB-Farbverteilung Automatik', + 'WB_RBLevelsCWB1' => 'Weißabgleich RB-Farbverteilung CWB1', + 'WB_RBLevelsCWB2' => 'Weißabgleich RB-Farbverteilung CWB2', + 'WB_RBLevelsCWB3' => 'Weißabgleich RB-Farbverteilung CWB3', + 'WB_RBLevelsCWB4' => 'Weißabgleich RB-Farbverteilung CWB4', + 'WB_RBLevelsCloudy' => 'Weißabgleich RB-Farbverteilung Bewölkt', + 'WB_RBLevelsCoolWhiteFluor' => 'Weißabgleich RB-Farbverteilung Neonlicht kaltweiß', + 'WB_RBLevelsDayWhiteFluor' => 'Weißabgleich RB-Farbverteilung Neonlicht neutralweiß', + 'WB_RBLevelsDaylightFluor' => 'Weißabgleich RB-Farbverteilung Neonlicht tageslichtweiß', + 'WB_RBLevelsEveningSunlight' => 'Weißabgleich RB-Farbverteilung Sonnenuntergang', + 'WB_RBLevelsFineWeather' => 'Weißabgleich RB-Farbverteilung Wolkenlos', + 'WB_RBLevelsShade' => 'Weißabgleich RB-Farbverteilung Schatten', + 'WB_RBLevelsTungsten' => 'Weißabgleich RB-Farbverteilung Glühbirne', + 'WB_RBLevelsUsed' => 'Weißabgleich RB-Farbverteilung verwendet', + 'WB_RBLevelsWhiteFluorescent' => 'Weißabgleich RB-Farbverteilung Neonlicht universalweiß', + 'WB_RGBGLevels' => 'Weißabgleich RGBG-Farbverteilung', + 'WB_RGBLevels' => 'Weißabgleich RGB-Farbverteilung', + 'WB_RGBLevelsCloudy' => 'Weißabgleich RGB-Farbverteilung Bewölkt', + 'WB_RGBLevelsDaylight' => 'Weißabgleich RGB-Farbverteilung Tageslicht', + 'WB_RGBLevelsFlash' => 'Weißabgleich RGB-Farbverteilung Blitz', + 'WB_RGBLevelsFluorescent' => 'Weißabgleich RGB-Farbverteilung Neonlicht', + 'WB_RGBLevelsShade' => 'Weißabgleich RGB-Farbverteilung Schatten', + 'WB_RGBLevelsTungsten' => 'Weißabgleich RGB-Farbverteilung Glühbirne', + 'WB_RGGBLevels' => 'Weißabgleich RGGB-Farbverteilung', + 'WB_RGGBLevelsAsShot' => 'Weißabgleich RGGB-Farbverteilung Aufnahme', + 'WB_RGGBLevelsAuto' => 'Weißabgleich RGGB-Farbverteilung Auto', + 'WB_RGGBLevelsCloudy' => 'Weißabgleich RGGB-Farbverteilung Bewölkt', + 'WB_RGGBLevelsCustom' => 'Weißabgleich RGGB-Farbverteilung Benutzerdefiniert', + 'WB_RGGBLevelsCustom1' => 'Weißabgleich RGGB-Farbverteilung Benutzerdefiniert 1', + 'WB_RGGBLevelsCustom2' => 'Weißabgleich RGGB-Farbverteilung Benutzerdefiniert 2', + 'WB_RGGBLevelsDaylight' => 'Weißabgleich RGGB-Farbverteilung Tageslicht', + 'WB_RGGBLevelsFlash' => 'Weißabgleich RGGB-Farbverteilung Blitz', + 'WB_RGGBLevelsFluorescent' => 'Weißabgleich RGGB-Farbverteilung Neonlicht', + 'WB_RGGBLevelsFluorescentD' => 'Weißabgleich RGGB-Farbverteilung Neonlicht D', + 'WB_RGGBLevelsFluorescentN' => 'Weißabgleich RGGB-Farbverteilung Neonlicht N', + 'WB_RGGBLevelsFluorescentW' => 'Weißabgleich RGGB-Farbverteilung Neonlicht W', + 'WB_RGGBLevelsKelvin' => 'Weißabgleich RGGB-Farbverteilung Kelvin', + 'WB_RGGBLevelsMeasured' => 'Weißabgleich RGGB-Farbverteilung Messung', + 'WB_RGGBLevelsPC1' => 'Weißabgleich RGGB-Farbverteilung PC1', + 'WB_RGGBLevelsPC2' => 'Weißabgleich RGGB-Farbverteilung PC2', + 'WB_RGGBLevelsPC3' => 'Weißabgleich RGGB-Farbverteilung PC3', + 'WB_RGGBLevelsShade' => 'Weißabgleich RGGB-Farbverteilung Schatten', + 'WB_RGGBLevelsTungsten' => 'Weißabgleich RGGB-Farbverteilung Glühbirne', + 'WB_RGGBLevelsUnknown' => 'Weißabgleich RGGB-Farbverteilung Unbekannt', + 'WB_RGGBLevelsUnknown10' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 10', + 'WB_RGGBLevelsUnknown11' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 11', + 'WB_RGGBLevelsUnknown12' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 12', + 'WB_RGGBLevelsUnknown13' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 13', + 'WB_RGGBLevelsUnknown14' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 14', + 'WB_RGGBLevelsUnknown15' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 15', + 'WB_RGGBLevelsUnknown16' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 16', + 'WB_RGGBLevelsUnknown17' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 17', + 'WB_RGGBLevelsUnknown18' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 18', + 'WB_RGGBLevelsUnknown19' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 19', + 'WB_RGGBLevelsUnknown2' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 2', + 'WB_RGGBLevelsUnknown20' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 20', + 'WB_RGGBLevelsUnknown3' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 3', + 'WB_RGGBLevelsUnknown4' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 4', + 'WB_RGGBLevelsUnknown5' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 5', + 'WB_RGGBLevelsUnknown6' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 6', + 'WB_RGGBLevelsUnknown7' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 7', + 'WB_RGGBLevelsUnknown8' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 8', + 'WB_RGGBLevelsUnknown9' => 'Weißabgleich RGGB-Farbverteilung Unbekannt 9', + 'WCSProfiles' => 'Windows Color System-Profil', + 'WangAnnotation' => 'Wang Anmerkung', + 'Warning' => 'Warnung', + 'Watermark' => 'Wasserzeichen', + 'WhiteBalance' => { + Description => 'Weißabgleich', + PrintConv => { + 'As Shot' => 'Aufnahme', + 'Auto' => 'Automatisch', + 'Black & White' => 'Schwarz/Weiß', + 'Cloudy' => 'Bewölkt', + 'Color Temperature/Color Filter' => 'Farbtemperatur/Farbfilter', + 'Cool White Fluorescent' => 'Neonlicht kaltweiß', + 'Custom' => 'Benutzerdefiniert', + 'Custom 1' => 'Benutzerdefiniert 1', + 'Custom 2' => 'Benutzerdefiniert 2', + 'Custom 3' => 'Benutzerdefiniert 3', + 'Custom 4' => 'Benutzerdefiniert 4', + 'Custom2' => 'Benutzerdefiniert 2', + 'Custom3' => 'Benutzerdefiniert 3', + 'Custom4' => 'Benutzerdefiniert 4', + 'Custom5' => 'Benutzerdefiniert 5', + 'Day White Fluorescent' => 'Neonlicht neutralweiß', + 'Daylight' => 'Tageslicht', + 'Daylight Fluorescent' => 'Neonlicht tageslichtweiß', + 'Flash' => 'Blitz', + 'Flash?' => 'Blitz', + 'Fluorescent' => 'Neonlicht', + 'Incandescent' => 'Glühbirne', + 'Living Room Warm White Fluorescent' => 'Neonlicht Wohnzimmer-warmweiß)', + 'Manual' => 'Manuell', + 'Manual Temperature (Kelvin)' => 'Manuelle Temperatur (Kelvin)', + 'Shade' => 'Schatten', + 'Tungsten' => 'Glühbirne', + 'Underwater' => 'Unterwasser', + 'Underwater 1 (Blue Water)' => 'Unterwasser 1 (blaues Wasser)', + 'Underwater 2 (Green Water)' => 'Unterwasser 2 (grünes Wasser)', + 'Unknown' => 'Unbekannt', + 'User-Selected' => 'Benutzerdefiniert', + 'Warm White Fluorescent' => 'Neonlicht warmweiß', + 'White Fluorescent' => 'Neonlicht universalweiß', + }, + }, + 'WhiteBalance2' => { + Description => 'Weißabgleich 2', + PrintConv => { + '3000K (Tungsten light)' => '3000K (Glühbirne)', + '3600K (Tungsten light-like)' => '3600K (ähnlich Glühbirne)', + '4000K (Cool white fluorescent)' => '4000K (Neonlicht kaltweiß)', + '4500K (Neutral white fluorescent)' => '4500K (Neonlicht neutralweiß)', + '5300K (Fine Weather)' => '5300K (Wolkenlos)', + '6000K (Cloudy)' => '6000K (Bewölkt)', + '6600K (Daylight fluorescent)' => '6600K (Neonlicht tageslichtweiß)', + '7500K (Fine Weather with Shade)' => '7500K (Sonne und Schatten)', + 'Auto' => 'Automatisch', + }, + }, + 'WhiteBalanceAdj' => { + Description => 'Weißabgleich Korrektur', + PrintConv => { + 'Auto' => 'Automatisch', + 'Cloudy' => 'Bewölkt', + 'Daylight' => 'Tageslicht', + 'Flash' => 'Blitz', + 'Fluorescent' => 'Neonlicht', + 'Off' => 'Aus', + 'On' => 'Ein', + 'Shade' => 'Schatten', + 'Tungsten' => 'Glühbirne', + }, + }, + 'WhiteBalanceAutoAdjustment' => { + Description => 'Weißabgleich automatische Abstimmung', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'WhiteBalanceBias' => 'Weißabgleich Bias', + 'WhiteBalanceBlue' => 'Farbabgleich Blau', + 'WhiteBalanceBracket' => 'Weißabgleichs-Belichtungsreihe', + 'WhiteBalanceBracketing' => { + Description => 'Weißabgleichs-Belichtungsreihe', + PrintConv => { + 'High' => 'Hoch', + 'Low' => 'Niedrig', + 'Off' => 'Aus', + }, + }, + 'WhiteBalanceComp' => 'Weißabgleichsausgleich', + 'WhiteBalanceFineTune' => 'Weißabgleichsfeineinstellung', + 'WhiteBalanceMatching' => 'Weißabgleich Ãœbereinstimmung', + 'WhiteBalanceMode' => { + Description => 'Weißabgleich-Modus', + PrintConv => { + 'Auto (Cloudy)' => 'Automatisch (Bewölkt)', + 'Auto (Day White Fluorescent)' => 'Automatisch (Neonlicht neutralweiß)', + 'Auto (Daylight Fluorescent)' => 'Automatisch (Neonlicht tageslichtweiß)', + 'Auto (Daylight)' => 'Automatisch (Tageslicht)', + 'Auto (Flash)' => 'Automatisch (Blitz)', + 'Auto (Shade)' => 'Automatisch (Schatten)', + 'Auto (Tungsten)' => 'Automatisch (Glühbirne)', + 'Auto (White Fluorescent)' => 'Automatisch (Neonlicht universalweiß)', + 'Unknown' => 'Unbekannt', + 'User-Selected' => 'Benutzerdefiniert', + }, + }, + 'WhiteBalanceRed' => 'Farbabgleich Rot', + 'WhiteBalanceSet' => { + Description => 'Eingestellter Weißabgleich', + PrintConv => { + 'Auto' => 'Automatisch', + 'Cloudy' => 'Bewölkt', + 'Day White Fluorescent' => 'Neonlicht neutralweiß', + 'Daylight' => 'Tageslicht', + 'Daylight Fluorescent' => 'Neonlicht tageslichtweiß', + 'Flash' => 'Blitz', + 'Manual' => 'Manuell', + 'Set Color Temperature 1' => 'Farbtemperatur-Einstellung 1', + 'Set Color Temperature 2' => 'Farbtemperatur-Einstellung 2', + 'Set Color Temperature 3' => 'Farbtemperatur-Einstellung 3', + 'Shade' => 'Schatten', + 'Tungsten' => 'Glühbirne', + 'White Fluorescent' => 'Neonlicht universalweiß', + }, + }, + 'WhiteBalanceSetting' => { + Description => 'Weißabgleichs-Einstellung', + PrintConv => { + 'Color Temperature/Color Filter' => 'Farbtemperatur/Farbfilter', + 'Custom' => 'Benutzerdefiniert', + 'Preset' => 'Voreinstellung', + }, + }, + 'WhiteBalanceTable' => 'Weißabgleich Tabelle', + 'WhiteBalanceTemperature' => 'Weißabgleich Farbtemperatur', + 'WhiteBoard' => 'Whiteboard Funktion', + 'WhiteLevel' => 'Weißwert', + 'WhitePoint' => 'Weißpunkt-Chromatizität', + 'WhitePointX' => 'Weißpunkt X', + 'WhitePointY' => 'Weißpunkt Y', + 'Wide' => 'Breit', + 'WideFocusZone' => { + Description => 'Zone des großen AF-Messfeldes', + PrintConv => { + 'Center zone (horizontal orientation)' => 'Mittlere Zone (horizontale Ausrichtung)', + 'Center zone (vertical orientation)' => 'Mittlere Zone (vertikale Ausrichtung)', + 'Left zone' => 'Linke Zone', + 'No zone' => 'Keine Zone', + 'Right zone' => 'Rechte Zone', + }, + }, + 'WideRange' => { + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'WidthResolution' => 'Horizontale Bildauflösung', + 'WorldTime' => 'Zeitzone', + 'WorldTimeLocation' => { + Description => 'Weltzeit-Position', + PrintConv => { + 'Destination' => 'Zielort', + 'Home' => 'Heimatort', + 'Hometown' => 'Heimatort', + }, + }, + 'Writer-Editor' => 'Verfasser der Beschreibung', + 'Writers' => 'Schreiber', + 'XMP' => 'XMP Metadaten', + 'XPAuthor' => 'XP Autor', + 'XPComment' => 'XP Kommentar', + 'XPKeywords' => 'XP Schlüsselwörter', + 'XPSubject' => 'XP Thema', + 'XPTitle' => 'XP Titel', + 'XResolution' => 'Horizontale Bildauflösung', + 'XYResolution' => 'XY Auflösung', + 'YCbCrCoefficients' => 'YCbCr-Koeffizienten', + 'YCbCrPositioning' => { + Description => 'Y und C Ausrichtung', + PrintConv => { + 'Centered' => 'Zentriert', + 'Co-sited' => 'Benachbart', + }, + }, + 'YCbCrSubSampling' => 'Subsampling Rate von Y bis C', + 'YResolution' => 'Vertikale Bildauflösung', + 'Year' => 'Jahr', + 'ZipCompression' => 'Zip Komprimierung', + 'ZoneMatching' => { + Description => 'Zonenabgleich', + PrintConv => { + 'High Key' => 'Hi', + 'ISO Setting Used' => 'Aus (ISO-Einstellung verwendet)', + 'Low Key' => 'Lo', + }, + }, + 'ZoneMatchingOn' => { + Description => 'Zonenabgleich', + PrintConv => { + 'Off' => 'Aus', + 'On' => 'Ein', + }, + }, + 'Zoom' => 'Zoom-Objektiv', + 'ZoomPos' => 'Zoom Position', + 'ZoomSourceWidth' => 'Vergrößerungs-Ursprungsgröße', + 'ZoomStepCount' => 'Zoom-Stufenzähler', + 'ZoomTargetWidth' => 'Vergrößerungs-Endgröße', + 'ZoomedPreviewImage' => 'Vergrößertes Vorschaubild', + 'ZoomedPreviewLength' => 'Vergößertes Vorschaubild-Datenlänge', + 'ZoomedPreviewSize' => 'Vergößertes Vorschaubild-Größe', + 'ZoomedPreviewStart' => 'Vergößertes Vorschaubild-Datenposition', +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::de.pm - ExifTool German language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke, Herbert Kauer and Jobi for providing this +translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/en_ca.pm b/lib/Image/ExifTool/Lang/en_ca.pm new file mode 100644 index 0000000..ce4bb91 --- /dev/null +++ b/lib/Image/ExifTool/Lang/en_ca.pm @@ -0,0 +1,1002 @@ +#------------------------------------------------------------------------------ +# File: en_ca.pm +# +# Description: ExifTool Canadian English language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::en_ca; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.12'; + +%Image::ExifTool::Lang::en_ca::Translate = ( + 'AboveColor' => 'Above Colour', + 'AdvancedFilter' => { + PrintConv => { + 'Partial Color Blue' => 'Partial Colour Blue', + 'Partial Color Green' => 'Partial Colour Green', + 'Partial Color Orange' => 'Partial Colour Orange', + 'Partial Color Purple' => 'Partial Colour Purple', + 'Partial Color Red' => 'Partial Colour Red', + 'Partial Color Yellow' => 'Partial Colour Yellow', + 'Pop Color' => 'Pop Colour', + }, + }, + 'AdvancedSceneMode' => { + PrintConv => { + 'Color Select' => 'Colour Select', + }, + }, + 'AllColorFlatField1' => 'All Colour Flat Field 1', + 'AllColorFlatField2' => 'All Colour Flat Field 2', + 'AllColorFlatField3' => 'All Colour Flat Field 3', + 'Alpha' => { + PrintConv => { + 'Alpha Exists (W color component)' => 'Alpha Exists (W colour component)', + 'Alpha Exists (color not premultiplied)' => 'Alpha Exists (colour not premultiplied)', + 'Alpha Exists (color premultiplied)' => 'Alpha Exists (colour premultiplied)', + }, + }, + 'AlternateDuotoneColors' => 'Alternate Duotone Colours', + 'AlternateSpotColors' => 'Alternate Spot Colours', + 'ArtFilter' => { + PrintConv => { + 'Pale & Light Color' => 'Pale & Light Colour', + 'Pale & Light Color II' => 'Pale & Light Colour II', + 'Partial Color' => 'Partial Colour', + 'Partial Color II' => 'Partial Colour II', + 'Partial Color III' => 'Partial Colour III', + 'Watercolor' => 'Watercolour', + 'Watercolor I' => 'Watercolour I', + 'Watercolor II' => 'Watercolour II', + }, + }, + 'ArtFilterEffect' => { + PrintConv => { + 'Green Color Filter' => 'Green Colour Filter', + 'No Color Filter' => 'No Colour Filter', + 'Orange Color Filter' => 'Orange Colour Filter', + 'Pale & Light Color' => 'Pale & Light Colour', + 'Pale & Light Color II' => 'Pale & Light Colour II', + 'Partial Color' => 'Partial Colour', + 'Partial Color II' => 'Partial Colour II', + 'Partial Color III' => 'Partial Colour III', + 'Red Color Filter' => 'Red Colour Filter', + 'Watercolor' => 'Watercolour', + 'Watercolor I' => 'Watercolour I', + 'Watercolor II' => 'Watercolour II', + 'Yellow Color Filter' => 'Yellow Colour Filter', + }, + }, + 'AutoAFPointColorTracking' => 'Auto AF Point Colour Tracking', + 'BackgroundColor' => 'Background Colour', + 'BackgroundColorIndicator' => { + Description => 'Background Colour Indicator', + PrintConv => { + 'Specified Background Color' => 'Specified Background Colour', + 'Unspecified Background Color' => 'Unspecified Background Colour', + }, + }, + 'BackgroundColorValue' => 'Background Colour Value', + 'BasicColorImageSequence' => 'Basic Colour Image Sequence', + 'BelowColor' => 'Below Colour', + 'BestShotMode' => { + PrintConv => { + 'Water Color' => 'Water Colour', + }, + }, + 'BkColor' => 'Background Colour', + 'BluePaletteColorTableData' => 'Blue Palette Colour Table Data', + 'BluePaletteColorTableDescriptor' => 'Blue Palette Colour Table Descriptor', + 'BorderColor' => 'Border Colour', + 'CFAPlaneColor' => 'CFA Plane Colour', + 'CameraColorCalibration01' => 'Camera Colour Calibration 01', + 'CameraColorCalibration02' => 'Camera Colour Calibration 02', + 'CameraColorCalibration03' => 'Camera Colour Calibration 03', + 'CameraColorCalibration04' => 'Camera Colour Calibration 04', + 'CameraColorCalibration05' => 'Camera Colour Calibration 05', + 'CameraColorCalibration06' => 'Camera Colour Calibration 06', + 'CameraColorCalibration07' => 'Camera Colour Calibration 07', + 'CameraColorCalibration08' => 'Camera Colour Calibration 08', + 'CameraColorCalibration09' => 'Camera Colour Calibration 09', + 'CameraColorCalibration10' => 'Camera Colour Calibration 10', + 'CameraColorCalibration11' => 'Camera Colour Calibration 11', + 'CameraColorCalibration12' => 'Camera Colour Calibration 12', + 'CameraColorCalibration13' => 'Camera Colour Calibration 13', + 'CameraColorCalibration14' => 'Camera Colour Calibration 14', + 'CameraColorCalibration15' => 'Camera Colour Calibration 15', + 'CameraRawColorTone' => 'Camera Raw Colour Tone', + 'CanonColorInfo1' => 'Canon Colour Info 1', + 'CanonColorInfo2' => 'Canon Colour Info 2', + 'ChromaticityColorant' => 'Chromaticity Colourant', + 'CodingMethods' => { + PrintConv => { + 'JBIG color' => 'JBIG colour', + }, + }, + 'Color' => { + Description => 'Colour', + PrintConv => { + 'Color' => 'Colour', + }, + }, + 'ColorAberrationControl' => 'Colour Aberration Control', + 'ColorAdjustment' => 'Colour Adjustment', + 'ColorAdjustmentMode' => 'Colour Adjustment Mode', + 'ColorAverages' => 'Colour Averages', + 'ColorBW' => 'Colour BW', + 'ColorBalance' => 'Colour Balance', + 'ColorBalanceAdj' => 'Colour Balance Adj', + 'ColorBalanceBlue' => 'Colour Balance Blue', + 'ColorBalanceGreen' => 'Colour Balance Green', + 'ColorBalanceRed' => 'Colour Balance Red', + 'ColorBalanceUnknown' => 'Colour Balance Unknown', + 'ColorBalanceVersion' => 'Colour Balance Version', + 'ColorBitDepth' => 'Colour Bit Depth', + 'ColorBlur' => 'Colour Blur', + 'ColorBlurOn' => 'Colour Blur On', + 'ColorBoostLevel' => 'Colour Boost Level', + 'ColorBoostType' => 'Colour Boost Type', + 'ColorBooster' => 'Colour Booster', + 'ColorCalibrationMatrix' => 'Colour Calibration Matrix', + 'ColorCasts' => 'Colour Casts', + 'ColorCharacterization' => 'Colour Characterization', + 'ColorClass' => 'Colour Class', + 'ColorCompensationFilter' => 'Colour Compensation Filter', + 'ColorCompensationFilterCustom' => 'Colour Compensation Filter Custom', + 'ColorCompensationFilterSet' => 'Colour Compensation Filter Set', + 'ColorComponents' => 'Colour Components', + 'ColorControl' => 'Colour Control', + 'ColorCorrection' => 'Colour Correction', + 'ColorCreatorEffect' => 'Colour Creator Effect', + 'ColorDataVersion' => 'Colour Data Version', + 'ColorDescriptor' => 'Colour Descriptor', + 'ColorEffect' => 'Colour Effect', + 'ColorFieldCode' => 'Colour Field Code', + 'ColorFilter' => 'Colour Filter', + 'ColorGain' => 'Colour Gain', + 'ColorGroup' => 'Colour Group', + 'ColorHalftoningInfo' => 'Colour Halftoning Info', + 'ColorHue' => 'Colour Hue', + 'ColorImagePrintingFlag' => 'Colour Image Printing Flag', + 'ColorLabel' => 'Colour Label', + 'ColorMap' => 'Colour Map', + 'ColorMatrix' => 'Colour Matrix', + 'ColorMatrix1' => 'Colour Matrix 1', + 'ColorMatrix2' => 'Colour Matrix 2', + 'ColorMatrixA' => 'Colour Matrix A', + 'ColorMatrixAdobeRGB' => 'Colour Matrix Adobe RGB', + 'ColorMatrixB' => 'Colour Matrix B', + 'ColorMatrixNumber' => 'Colour Matrix Number', + 'ColorMatrixSRGB' => 'Colour Matrix sRGB', + 'ColorMode' => { + Description => 'Colour Mode', + PrintConv => { + 'Indexed Color' => 'Indexed Colour', + 'Natural color' => 'Natural colour', + 'Neutral Color' => 'Neutral Colour', + 'RGB Color' => 'RGB Colour', + 'Saturated Color' => 'Saturated Colour', + 'Vivid color' => 'Vivid colour', + }, + }, + 'ColorMoireReduction' => 'Colour Moire Reduction', + 'ColorMoireReductionMode' => 'Colour Moire Reduction Mode', + 'ColorNoiseReduction' => 'Colour Noise Reduction', + 'ColorNoiseReductionDetail' => 'Colour Noise Reduction Detail', + 'ColorNoiseReductionIntensity' => 'Colour Noise Reduction Intensity', + 'ColorNoiseReductionSharpness' => 'Colour Noise Reduction Sharpness', + 'ColorNoiseReductionSmoothness' => 'Colour Noise Reduction Smoothness', + 'ColorObjBackType' => 'Colour Obj Back Type', + 'ColorObjName' => 'Colour Obj Name', + 'ColorObjType' => 'Colour Obj Type', + 'ColorObjVersion' => 'Colour Obj Version', + 'ColorPalette' => 'Colour Palette', + 'ColorPlanes' => 'Colour Planes', + 'ColorPrimaries' => 'Colour Primaries', + 'ColorProfile' => 'Colour Profile', + 'ColorProfileSettings' => 'Colour Profile Settings', + 'ColorRangeLevels' => 'Colour Range Levels', + 'ColorRepresentation' => 'Colour Representation', + 'ColorReproduction' => 'Colour Reproduction', + 'ColorResolutionDepth' => 'Colour Resolution Depth', + 'ColorResponseUnit' => 'Colour Response Unit', + 'ColorSamplersResource' => 'Colour Samplers Resource', + 'ColorSamplersResource2' => 'Colour Samplers Resource 2', + 'ColorSaturationAdj' => 'Colour Saturation Adj', + 'ColorSequence' => 'Colour Sequence', + 'ColorSiting' => 'Colour Siting', + 'ColorSpace' => { + Description => 'Colour Space', + PrintConv => { + 'Embedded Color Profile' => 'Embedded Colour Profile', + 'Linked Color Profile' => 'Linked Colour Profile', + 'No color space specified' => 'No colour space specified', + 'Windows Color Space' => 'Windows Colour Space', + }, + }, + 'ColorSpaceData' => 'Colour Space Data', + 'ColorSpecApproximation' => 'Colour Spec Approximation', + 'ColorSpecData' => 'Colour Spec Data', + 'ColorSpecMethod' => { + Description => 'Colour Spec Method', + PrintConv => { + 'Vendor Color' => 'Vendor Colour', + }, + }, + 'ColorSpecPrecedence' => 'Colour Spec Precedence', + 'ColorSpecification' => 'Colour Specification', + 'ColorTable' => 'Colour Table', + 'ColorTempAsShot' => 'Colour Temp As Shot', + 'ColorTempAuto' => 'Colour Temp Auto', + 'ColorTempCloudy' => 'Colour Temp Cloudy', + 'ColorTempCustom' => 'Colour Temp Custom', + 'ColorTempCustom1' => 'Colour Temp Custom 1', + 'ColorTempCustom2' => 'Colour Temp Custom 2', + 'ColorTempDaylight' => 'Colour Temp Daylight', + 'ColorTempFlash' => 'Colour Temp Flash', + 'ColorTempFlashData' => 'Colour Temp Flash Data', + 'ColorTempFluorescent' => 'Colour Temp Fluorescent', + 'ColorTempFluorescentD' => 'Colour Temp Fluorescent D', + 'ColorTempFluorescentN' => 'Colour Temp Fluorescent N', + 'ColorTempFluorescentW' => 'Colour Temp Fluorescent W', + 'ColorTempKelvin' => 'Colour Temp Kelvin', + 'ColorTempMeasured' => 'Colour Temp Measured', + 'ColorTempPC1' => 'Colour Temp PC1', + 'ColorTempPC2' => 'Colour Temp PC2', + 'ColorTempPC3' => 'Colour Temp PC3', + 'ColorTempShade' => 'Colour Temp Shade', + 'ColorTempTungsten' => 'Colour Temp Tungsten', + 'ColorTempUnknown' => 'Colour Temp Unknown', + 'ColorTempUnknown10' => 'Colour Temp Unknown 10', + 'ColorTempUnknown11' => 'Colour Temp Unknown 11', + 'ColorTempUnknown12' => 'Colour Temp Unknown 12', + 'ColorTempUnknown13' => 'Colour Temp Unknown 13', + 'ColorTempUnknown14' => 'Colour Temp Unknown 14', + 'ColorTempUnknown15' => 'Colour Temp Unknown 15', + 'ColorTempUnknown16' => 'Colour Temp Unknown 16', + 'ColorTempUnknown17' => 'Colour Temp Unknown 17', + 'ColorTempUnknown18' => 'Colour Temp Unknown 18', + 'ColorTempUnknown19' => 'Colour Temp Unknown 19', + 'ColorTempUnknown2' => 'Colour Temp Unknown 2', + 'ColorTempUnknown20' => 'Colour Temp Unknown 20', + 'ColorTempUnknown21' => 'Colour Temp Unknown 21', + 'ColorTempUnknown22' => 'Colour Temp Unknown 22', + 'ColorTempUnknown23' => 'Colour Temp Unknown 23', + 'ColorTempUnknown24' => 'Colour Temp Unknown 24', + 'ColorTempUnknown25' => 'Colour Temp Unknown 25', + 'ColorTempUnknown26' => 'Colour Temp Unknown 26', + 'ColorTempUnknown27' => 'Colour Temp Unknown 27', + 'ColorTempUnknown28' => 'Colour Temp Unknown 28', + 'ColorTempUnknown29' => 'Colour Temp Unknown 29', + 'ColorTempUnknown3' => 'Colour Temp Unknown 3', + 'ColorTempUnknown30' => 'Colour Temp Unknown 30', + 'ColorTempUnknown4' => 'Colour Temp Unknown 4', + 'ColorTempUnknown5' => 'Colour Temp Unknown 5', + 'ColorTempUnknown6' => 'Colour Temp Unknown 6', + 'ColorTempUnknown7' => 'Colour Temp Unknown 7', + 'ColorTempUnknown8' => 'Colour Temp Unknown 8', + 'ColorTempUnknown9' => 'Colour Temp Unknown 9', + 'ColorTemperature' => 'Colour Temperature', + 'ColorTemperatureAdj' => 'Colour Temperature Adj', + 'ColorTemperatureAuto' => 'Colour Temperature Auto', + 'ColorTemperatureBG' => 'Colour Temperature BG', + 'ColorTemperatureCustom' => 'Colour Temperature Custom', + 'ColorTemperatureRG' => 'Colour Temperature RG', + 'ColorTemperatureSet' => 'Colour Temperature Set', + 'ColorTemperatureSetting' => { + Description => 'Colour Temperature Setting', + PrintConv => { + 'Color Filter' => 'Colour Filter', + }, + }, + 'ColorTone' => 'Colour Tone', + 'ColorToneAdj' => 'Colour Tone Adj', + 'ColorToneAuto' => 'Colour Tone Auto', + 'ColorToneFaithful' => 'Colour Tone Faithful', + 'ColorToneLandscape' => 'Colour Tone Landscape', + 'ColorToneMonochrome' => 'Colour Tone Monochrome', + 'ColorToneNeutral' => 'Colour Tone Neutral', + 'ColorTonePortrait' => 'Colour Tone Portrait', + 'ColorToneStandard' => 'Colour Tone Standard', + 'ColorToneUserDef1' => 'Colour Tone User Def 1', + 'ColorToneUserDef2' => 'Colour Tone User Def 2', + 'ColorToneUserDef3' => 'Colour Tone User Def 3', + 'ColorTransferFuncs' => 'Colour Transfer Funcs', + 'ColorTransform' => 'Colour Transform', + 'ColorTwistMatrix' => 'Colour Twist Matrix', + 'ColorType' => { + Description => 'Colour Type', + PrintConv => { + 'Color' => 'Colour', + 'Color Alpha' => 'Colour Alpha', + }, + }, + 'Colorant1Coordinates' => 'Colourant 1 Coordinates', + 'Colorant1Name' => 'Colourant 1 Name', + 'Colorant2Coordinates' => 'Colourant 2 Coordinates', + 'Colorant2Name' => 'Colourant 2 Name', + 'Colorant3Coordinates' => 'Colourant 3 Coordinates', + 'Colorant3Name' => 'Colourant 3 Name', + 'ColorantA' => 'Colourant A', + 'ColorantB' => 'Colourant B', + 'ColorantBlack' => 'Colourant Black', + 'ColorantBlue' => 'Colourant Blue', + 'ColorantCount' => 'Colourant Count', + 'ColorantCyan' => 'Colourant Cyan', + 'ColorantGray' => 'Colourant Gray', + 'ColorantGreen' => 'Colourant Green', + 'ColorantL' => 'Colourant L', + 'ColorantMagenta' => 'Colourant Magenta', + 'ColorantMode' => 'Colourant Mode', + 'ColorantOrder' => 'Colourant Order', + 'ColorantRed' => 'Colourant Red', + 'ColorantSwatchName' => 'Colourant Swatch Name', + 'ColorantTableOut' => 'Colourant Table Out', + 'ColorantTint' => 'Colourant Tint', + 'ColorantType' => 'Colourant Type', + 'ColorantYellow' => 'Colourant Yellow', + 'Colorants' => 'Colourants', + 'ColorimetricIntentImageState' => 'Colourimetric Intent Image State', + 'ColorimetricReference' => 'Colourimetric Reference', + 'Colorimetry' => 'Colourimetry', + 'ColorimetryCode' => 'Colourimetry Code', + 'Colors' => 'Colours', + 'Compression' => { + PrintConv => { + 'JBIG Color' => 'JBIG Colour', + }, + }, + 'ContrastMode' => { + PrintConv => { + 'Dynamic (Color Film)' => 'Dynamic (Colour Film)', + 'Dynamic Art (My Color)' => 'Dynamic Art (My Colour)', + 'Elegant (My Color)' => 'Elegant (My Colour)', + 'Nature (Color Film)' => 'Nature (Colour Film)', + 'Nostalgic (Color Film)' => 'Nostalgic (Colour Film)', + 'Retro (My Color)' => 'Retro (My Colour)', + 'Smooth (Color Film) or Pure (My Color)' => 'Smooth (Colour Film) or Pure (My Colour)', + 'Vibrant (Color Film) or Expressive (My Color)' => 'Vibrant (Colour Film) or Expressive (My Colour)', + }, + }, + 'CustomColorTone' => 'Custom Colour Tone', + 'D-LightingHQColorBoost' => 'D-Lighting HQ Colour Boost', + 'D-LightingHSColorBoost' => 'D-Lighting HS Colour Boost', + 'DefHilite' => 'Use Default Highlight Colour', + 'DefaultImageColor' => 'Default Image Colour', + 'DeltaType' => { + PrintConv => { + 'Color Addition' => 'Colour Addition', + 'Color Replacement' => 'Colour Replacement', + }, + }, + 'DigitalFilter01' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Replace Color' => 'Replace Colour', + 'Unicolor Bold' => 'Unicolour Bold', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter02' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter03' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter04' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter05' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter06' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter07' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter08' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter09' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter10' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter11' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter12' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter13' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter14' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter15' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter16' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter17' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter18' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter19' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter20' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DisplayUnits' => { + PrintConv => { + 'meters' => 'Metres', + }, + }, + 'EasyMode' => { + PrintConv => { + 'Color Accent' => 'Colour Accent', + 'Color Swap' => 'Colour Swap', + 'My Colors' => 'My Colours', + }, + }, + 'EmbeddedImageColorSpace' => 'Embedded Image Colour Space', + 'ExposureProgram' => { + PrintConv => { + 'Partial Color Blue' => 'Partial Colour Blue', + 'Partial Color Green' => 'Partial Colour Green', + 'Partial Color Red' => 'Partial Colour Red', + 'Partial Color Yellow' => 'Partial Colour Yellow', + 'Pop Color' => 'Pop Colour', + }, + }, + 'FaithfulRawColorTone' => 'Faithful Raw Colour Tone', + 'FaxProfile' => { + PrintConv => { + 'Lossless color and grayscale, L' => 'Lossless colour and grayscale, L', + 'Lossy color and grayscale, C' => 'Lossy colour and grayscale, C', + }, + }, + 'FgColor' => 'Foreground Colour', + 'FilmColorProcess' => 'Film Colour Process', + 'FilmMode' => { + PrintConv => { + 'Dynamic (color)' => 'Dynamic (colour)', + 'Nature (color)' => 'Nature (colour)', + 'Smooth (color)' => 'Smooth (colour)', + 'Standard (color)' => 'Standard (colour)', + }, + }, + 'FlagColor' => 'Flag Colour', + 'FlashColorFilter' => 'Flash Colour Filter', + 'FocalPlaneColorimetryEstimates' => 'Focal Plane Colourimetry Estimates', + 'GammaColorTone' => 'Gamma Colour Tone', + 'GenOpColor' => 'Gen Op Colour', + 'GenreID' => { + PrintConv => { + 'Books|Kids|Basic Concepts|Colors' => 'Books|Kids|Basic Concepts|Colours', + }, + }, + 'GreenPaletteColorTableData' => 'Green Palette Colour Table Data', + 'GreenPaletteColorTableDescriptor' => 'Green Palette Colour Table Descriptor', + 'HasColorMap' => 'Has Colour Map', + 'HighlightColorDistortReduct' => 'Highlight Colour Distort Reduct', + 'HiliteColor' => 'Highlight Colour', + 'ImageAlterationConstraints' => { + PrintConv => { + 'No Colorization' => 'No Colourization', + 'No De-Colorization' => 'No De-Colourization', + }, + }, + 'ImageColor' => 'Image Colour', + 'ImageColorIndicator' => { + Description => 'Image Colour Indicator', + PrintConv => { + 'Specified Image Color' => 'Specified Image Colour', + 'Unspecified Image Color' => 'Unspecified Image Colour', + }, + }, + 'ImageColorValue' => 'Image Colour Value', + 'ImageMedium' => { + PrintConv => { + 'Color hard copy' => 'Colour hard copy', + 'Color negative' => 'Colour negative', + 'Color reversal' => 'Colour reversal', + }, + }, + 'IndexedColorTableCount' => 'Indexed Colour Table Count', + 'InterchangeColorSpace' => 'Interchange Colour Space', + 'Isotherm1Color' => 'Isotherm 1 Colour', + 'Isotherm2Color' => 'Isotherm 2 Colour', + 'LandscapeRawColorTone' => 'Landscape Raw Colour Tone', + 'LargeBluePaletteColorTableData' => 'Large Blue Palette Colour Table Data', + 'LargeBluePaletteColorTableDescr' => 'Large Blue Palette Colour Table Descr', + 'LargeGreenPaletteColorTableData' => 'Large Green Palette Colour Table Data', + 'LargeGreenPaletteColorTableDescr' => 'Large Green Palette Colour Table Descr', + 'LargePaletteColorLookupTableUID' => 'Large Palette Colour Lookup Table UID', + 'LargeRedPaletteColorTableData' => 'Large Red Palette Colour Table Data', + 'LargeRedPaletteColorTableDescr' => 'Large Red Palette Colour Table Descr', + 'LayerBlendModes' => { + PrintConv => { + 'Color' => 'Colour', + 'Color Burn' => 'Colour Burn', + 'Color Dodge' => 'Colour Dodge', + 'Darker Color' => 'Darker Colour', + 'Lighter Color' => 'Lighter Colour', + }, + }, + 'MDColorTable' => 'MD Colour Table', + 'MDItemColorSpace' => 'MD Item Colour Space', + 'MagicFilter' => { + PrintConv => { + 'Pale & Light Color' => 'Pale & Light Colour', + 'Pale & Light Color II' => 'Pale & Light Colour II', + 'Partial Color' => 'Partial Colour', + 'Partial Color II' => 'Partial Colour II', + 'Partial Color III' => 'Partial Colour III', + 'Watercolor' => 'Watercolour', + 'Watercolor I' => 'Watercolour I', + 'Watercolor II' => 'Watercolour II', + }, + }, + 'MandatoryBackground' => { + PrintConv => { + 'Color Advisory, Image Mandatory' => 'Colour Advisory, Image Mandatory', + 'Color Mandatory, Image Advisory' => 'Colour Mandatory, Image Advisory', + 'Color and Image Advisory' => 'Colour and Image Advisory', + 'Color and Image Mandatory' => 'Colour and Image Mandatory', + }, + }, + 'MattColor' => 'Matt Colour', + 'MediaColor' => 'Media Colour', + 'ModifiedColorTemp' => 'Modified Colour Temp', + 'MonochromeColor' => 'Monochrome Colour', + 'MyColorMode' => { + Description => 'My Colour Mode', + PrintConv => { + 'Color Accent' => 'Colour Accent', + 'Color Swap' => 'Colour Swap', + }, + }, + 'NamedColor' => 'Named Colour', + 'NamedColor2' => 'Named Colour 2', + 'NeutralRawColorTone' => 'Neutral Raw Colour Tone', + 'NewColorType' => 'New Colour Type', + 'NumColors' => 'Num Colours', + 'NumImportantColors' => 'Num Important Colours', + 'OpColor' => 'Op Colour', + 'OverflowColor' => 'Overflow Colour', + 'PF25ColorMatrix' => 'PF25 Colour Matrix', + 'PaletteColorTableUID' => 'Palette Colour Table UID', + 'PaletteColors' => 'Palette Colours', + 'PhotoEffect' => { + PrintConv => { + 'My Color Data' => 'My Colour Data', + }, + }, + 'PhotometricInterpretation' => { + PrintConv => { + 'Color Filter Array' => 'Colour Filter Array', + }, + }, + 'Photoshop2ColorTable' => 'Photoshop 2 Colour Table', + 'PictureEffect' => { + PrintConv => { + 'Partial Color (blue)' => 'Partial Colour (blue)', + 'Partial Color (green)' => 'Partial Colour (green)', + 'Partial Color (red)' => 'Partial Colour (red)', + 'Partial Color (yellow)' => 'Partial Colour (yellow)', + 'Pop Color' => 'Pop Colour', + 'Water Color' => 'Water Colour', + 'Water Color 2' => 'Water Colour 2', + }, + }, + 'PictureEffect2' => { + PrintConv => { + 'Partial Color' => 'Partial Colour', + 'Pop Color' => 'Pop Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'PictureIndexedColors' => 'Picture Indexed Colours', + 'PictureMode' => { + PrintConv => { + 'Color Creator' => 'Colour Creator', + 'Color Profile 1' => 'Colour Profile 1', + 'Color Profile 2' => 'Colour Profile 2', + 'Color Profile 3' => 'Colour Profile 3', + }, + }, + 'PictureType' => { + PrintConv => { + 'Bright(ly) Colored Fish' => 'Bright(ly) Coloured Fish', + }, + }, + 'PictureWizardColor' => 'Picture Wizard Colour', + 'PortraitRawColorTone' => 'Portrait Raw Colour Tone', + 'PresetWhiteBalance' => { + PrintConv => { + 'Color Temperature' => 'Colour Temperature', + }, + }, + 'PreviewColorSpace' => 'Preview Colour Space', + 'ProfileClass' => { + PrintConv => { + 'ColorSpace Conversion Profile' => 'ColourSpace Conversion Profile', + 'NamedColor Profile' => 'Named Colour Profile', + }, + }, + 'PseudoColorType' => 'Pseudo Colour Type', + 'QuantizationMethod' => { + PrintConv => { + 'Color Space Specific' => 'Colour Space Specific', + }, + }, + 'RGBBkCol' => 'Background Colour', + 'RGBFgCol' => 'Foreground Colour', + 'ROIDisplayColor' => 'ROI Display Colour', + 'RawColorAdj' => 'Raw Colour Adj', + 'RawDevArtFilter' => { + PrintConv => { + 'Pale & Light Color' => 'Pale & Light Colour', + 'Pale & Light Color II' => 'Pale & Light Colour II', + 'Partial Color' => 'Partial Colour', + 'Partial Color II' => 'Partial Colour II', + 'Partial Color III' => 'Partial Colour III', + 'Watercolor' => 'Watercolour', + 'Watercolor I' => 'Watercolour I', + 'Watercolor II' => 'Watercolour II', + }, + }, + 'RawDevColorSpace' => 'Raw Dev Colour Space', + 'RawDevMemoryColorEmphasis' => 'Raw Dev Memory Colour Emphasis', + 'RawDevSettings' => { + PrintConv => { + 'Color Space' => 'Colour Space', + 'WB Color Temp' => 'WB Colour Temp', + }, + }, + 'RawDevWhiteBalance' => { + PrintConv => { + 'Color Temperature' => 'Colour Temperature', + }, + }, + 'RedPaletteColorTableData' => 'Red Palette Colour Table Data', + 'RedPaletteColorTableDescriptor' => 'Red Palette Colour Table Descriptor', + 'ReflectionHardcopyOrigColorimetry' => 'Reflection Hardcopy Orig Colourimetry', + 'ReflectionPrintOutputColorimetry' => 'Reflection Print Output Colourimetry', + 'RenderingIntent' => { + PrintConv => { + 'Absolute Colorimetric (LCS_GM_ABS_COLORIMETRIC)' => 'Absolute Colourimetric (LCS_GM_ABS_COLORIMETRIC)', + 'ICC-Absolute Colorimetric' => 'ICC-Absolute Colourimetric', + 'Media-Relative Colorimetric' => 'Media-Relative Colourimetric', + }, + }, + 'RetouchHistory' => { + PrintConv => { + 'Color Custom' => 'Colour Custom', + 'Color Outline' => 'Colour Outline', + 'Color Sketch' => 'Colour Sketch', + 'Selective Color' => 'Selective Colour', + }, + }, + 'SBAInputImageColorspace' => 'SBA Input Image Colourspace', + 'SRGBRendering' => { + PrintConv => { + 'Absolute Colorimetric' => 'Absolute Colourimetric', + 'Relative Colorimetric' => 'Relative Colourimetric', + }, + }, + 'SceneBalanceAlgorithmCommand' => { + PrintConv => { + 'Neutral SBA Off, Color SBA Off' => 'Neutral SBA Off, Colour SBA Off', + 'Neutral SBA Off, Color SBA On' => 'Neutral SBA Off, Colour SBA On', + 'Neutral SBA On, Color SBA Off' => 'Neutral SBA On, Colour SBA Off', + 'Neutral SBA On, Color SBA On' => 'Neutral SBA On, Colour SBA On', + }, + }, + 'SceneColorimetryEstimates' => 'Scene Colourimetry Estimates', + 'SceneMode' => { + PrintConv => { + 'Color Effects' => 'Colour Effects', + 'My Color' => 'My Colour', + }, + }, + 'ScreenMinimumColorBitDepth' => 'Screen Minimum Colour Bit Depth', + 'SegmentedBlueColorTableData' => 'Segmented Blue Colour Table Data', + 'SegmentedGreenColorTableData' => 'Segmented Green Colour Table Data', + 'SegmentedRedColorTableData' => 'Segmented Red Colour Table Data', + 'SensingMethod' => { + PrintConv => { + 'Color sequential area' => 'Colour sequential area', + 'Color sequential linear' => 'Colour sequential linear', + 'One-chip color area' => 'One-chip colour area', + 'Three-chip color area' => 'Three-chip colour area', + 'Two-chip color area' => 'Two-chip colour area', + }, + }, + 'ShootingMode' => { + PrintConv => { + 'Color Effects' => 'Colour Effects', + 'My Color' => 'My Colour', + }, + }, + 'ShutterPresentationColorCIELabVal' => 'Shutter Presentation Colour CIE Lab Val', + 'SmartAlbumColor' => 'Smart Album Colour', + 'SpecialEffectsOpticalFilter' => { + PrintConv => { + 'Colored' => 'Coloured', + }, + }, + 'StandardRawColorTone' => 'Standard Raw Colour Tone', + 'StdOutputColorMode' => 'Std Output Colour Mode', + 'StreamColor' => 'Stream Colour', + 'SubfileType' => { + PrintConv => { + 'Color IW44' => 'Colour IW44', + }, + }, + 'SubimageColor' => 'Subimage Colour', + 'SwatchColorantA' => 'Swatch Colourant A', + 'SwatchColorantB' => 'Swatch Colourant B', + 'SwatchColorantBlack' => 'Swatch Colourant Black', + 'SwatchColorantBlue' => 'Swatch Colourant Blue', + 'SwatchColorantCyan' => 'Swatch Colourant Cyan', + 'SwatchColorantGray' => 'Swatch Colourant Gray', + 'SwatchColorantGreen' => 'Swatch Colourant Green', + 'SwatchColorantL' => 'Swatch Colourant L', + 'SwatchColorantMagenta' => 'Swatch Colourant Magenta', + 'SwatchColorantMode' => 'Swatch Colourant Mode', + 'SwatchColorantRed' => 'Swatch Colourant Red', + 'SwatchColorantSwatchName' => 'Swatch Colourant Swatch Name', + 'SwatchColorantTint' => 'Swatch Colourant Tint', + 'SwatchColorantType' => 'Swatch Colourant Type', + 'SwatchColorantYellow' => 'Swatch Colourant Yellow', + 'SwatchGroupsColorants' => 'Swatch Groups Colourants', + 'TestTarget' => { + PrintConv => { + 'Color Chart' => 'Colour Chart', + }, + }, + 'TextColor' => 'Text Colour', + 'ToneCurveColorSpace' => 'Tone Curve Colour Space', + 'ToningEffect' => { + PrintConv => { + 'Color' => 'Colour', + }, + }, + 'TypeOfOriginal' => { + PrintConv => { + 'Color Document' => 'Colour Document', + 'Color Print' => 'Colour Print', + }, + }, + 'UCRBG' => 'Under Colour Removal & Black Gen.', + 'USPTOOriginalContentType' => { + PrintConv => { + 'Color' => 'Colour', + }, + }, + 'UltrasoundColorDataPresent' => 'Ultrasound Colour Data Present', + 'UnderflowColor' => 'Underflow Colour', + 'Unsharp1Color' => 'Unsharp 1 Colour', + 'Unsharp2Color' => 'Unsharp 2 Colour', + 'Unsharp3Color' => 'Unsharp 3 Colour', + 'Unsharp4Color' => 'Unsharp 4 Colour', + 'VideoAlphaPremultipleColor' => 'Video Alpha Premultiple Colour', + 'VideoAlphaPremultipleColorA' => 'Video Alpha Premultiple Colour A', + 'VideoAlphaPremultipleColorB' => 'Video Alpha Premultiple Colour B', + 'VideoAlphaPremultipleColorBlack' => 'Video Alpha Premultiple Colour Black', + 'VideoAlphaPremultipleColorBlue' => 'Video Alpha Premultiple Colour Blue', + 'VideoAlphaPremultipleColorCyan' => 'Video Alpha Premultiple Colour Cyan', + 'VideoAlphaPremultipleColorGray' => 'Video Alpha Premultiple Colour Gray', + 'VideoAlphaPremultipleColorGreen' => 'Video Alpha Premultiple Colour Green', + 'VideoAlphaPremultipleColorL' => 'Video Alpha Premultiple Colour L', + 'VideoAlphaPremultipleColorMagenta' => 'Video Alpha Premultiple Colour Magenta', + 'VideoAlphaPremultipleColorMode' => 'Video Alpha Premultiple Colour Mode', + 'VideoAlphaPremultipleColorRed' => 'Video Alpha Premultiple Colour Red', + 'VideoAlphaPremultipleColorSwatchName' => 'Video Alpha Premultiple Colour Swatch Name', + 'VideoAlphaPremultipleColorTint' => 'Video Alpha Premultiple Colour Tint', + 'VideoAlphaPremultipleColorType' => 'Video Alpha Premultiple Colour Type', + 'VideoAlphaPremultipleColorYellow' => 'Video Alpha Premultiple Colour Yellow', + 'VideoColorKind' => 'Video Colour Kind', + 'VideoColorSpace' => 'Video Colour Space', + 'VisualColor' => { + Description => 'Visual Colour', + PrintConv => { + 'Color' => 'Colour', + }, + }, + 'WBAdjColorTemp' => 'WB Adj Colour Temp', + 'WBAdjLighting' => { + PrintConv => { + 'High Color Rendering Fluorescent (3700K)' => 'High Colour Rendering Fluorescent (1)', + 'High Color Rendering Fluorescent (5000K)' => 'High Colour Rendering Fluorescent (3)', + 'High Color Rendering Fluorescent (cool white)' => 'High Colour Rendering Fluorescent (2)', + 'High Color Rendering Fluorescent (daylight)' => 'High Colour Rendering Fluorescent (4)', + 'High Color Rendering Fluorescent (warm white)' => 'High Colour Rendering Fluorescent (0)', + 'Sodium Vapor Lamps' => 'Sodium Vapour Lamps', + 'Standard Fluorescent (high temperature mercury vapor)' => 'Standard Fluorescent (high temperature mercury vapour)', + }, + }, + 'WatercolorFilter' => 'Watercolour Filter', + 'WhiteBalance' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Color Temperature' => 'Colour Temperature', + 'Color Temperature Enhancement' => 'Colour Temperature Enhancement', + 'Color Temperature/Color Filter' => 'Colour Temperature/Colour Filter', + }, + }, + 'WhiteBalance2' => { + PrintConv => { + 'Auto (Keep Warm Color Off)' => 'Auto (Keep Warm Colour Off)', + }, + }, + 'WhiteBalanceSet' => { + PrintConv => { + 'Set Color Temperature 1' => 'Set Colour Temperature 1', + 'Set Color Temperature 2' => 'Set Colour Temperature 2', + 'Set Color Temperature 3' => 'Set Colour Temperature 3', + }, + }, + 'WhiteBalanceSetting' => { + PrintConv => { + 'Color Temperature/Color Filter' => 'Colour Temperature/Colour Filter', + }, + }, + 'WorkColorSpace' => { + Description => 'Work Colour Space', + PrintConv => { + 'ColorMatch RGB' => 'ColourMatch RGB', + }, + }, + 'XMethod' => { + PrintConv => { + 'Color Closest Pixel and Alpha Linear Interpolation' => 'Colour Closest Pixel and Alpha Linear Interpolation', + 'Color Linear Interpolation and Alpha Closest Pixel' => 'Colour Linear Interpolation and Alpha Closest Pixel', + }, + }, + 'YMethod' => { + PrintConv => { + 'Color Closest Pixel and Alpha Linear Interpolation' => 'Colour Closest Pixel and Alpha Linear Interpolation', + 'Color Linear Interpolation and Alpha Closest Pixel' => 'Colour Linear Interpolation and Alpha Closest Pixel', + }, + }, +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::en_ca.pm - ExifTool Canadian English language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/en_gb.pm b/lib/Image/ExifTool/Lang/en_gb.pm new file mode 100644 index 0000000..f367440 --- /dev/null +++ b/lib/Image/ExifTool/Lang/en_gb.pm @@ -0,0 +1,1045 @@ +#------------------------------------------------------------------------------ +# File: en_gb.pm +# +# Description: ExifTool British English language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::en_gb; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.13'; + +%Image::ExifTool::Lang::en_gb::Translate = ( + 'AboveColor' => 'Above Colour', + 'AdvancedFilter' => { + PrintConv => { + 'Partial Color Blue' => 'Partial Colour Blue', + 'Partial Color Green' => 'Partial Colour Green', + 'Partial Color Orange' => 'Partial Colour Orange', + 'Partial Color Purple' => 'Partial Colour Purple', + 'Partial Color Red' => 'Partial Colour Red', + 'Partial Color Yellow' => 'Partial Colour Yellow', + 'Pop Color' => 'Pop Colour', + }, + }, + 'AdvancedSceneMode' => { + PrintConv => { + 'Color Select' => 'Colour Select', + }, + }, + 'AllColorFlatField1' => 'All Colour Flat Field 1', + 'AllColorFlatField2' => 'All Colour Flat Field 2', + 'AllColorFlatField3' => 'All Colour Flat Field 3', + 'Alpha' => { + PrintConv => { + 'Alpha Exists (W color component)' => 'Alpha Exists (W colour component)', + 'Alpha Exists (color not premultiplied)' => 'Alpha Exists (colour not premultiplied)', + 'Alpha Exists (color premultiplied)' => 'Alpha Exists (colour premultiplied)', + }, + }, + 'AlternateDuotoneColors' => 'Alternate Duotone Colours', + 'AlternateSpotColors' => 'Alternate Spot Colours', + 'ArtFilter' => { + PrintConv => { + 'Pale & Light Color' => 'Pale & Light Colour', + 'Pale & Light Color II' => 'Pale & Light Colour II', + 'Partial Color' => 'Partial Colour', + 'Partial Color II' => 'Partial Colour II', + 'Partial Color III' => 'Partial Colour III', + 'Watercolor' => 'Watercolour', + 'Watercolor I' => 'Watercolour I', + 'Watercolor II' => 'Watercolour II', + }, + }, + 'ArtFilterEffect' => { + PrintConv => { + 'Green Color Filter' => 'Green Colour Filter', + 'No Color Filter' => 'No Colour Filter', + 'Orange Color Filter' => 'Orange Colour Filter', + 'Pale & Light Color' => 'Pale & Light Colour', + 'Pale & Light Color II' => 'Pale & Light Colour II', + 'Partial Color' => 'Partial Colour', + 'Partial Color II' => 'Partial Colour II', + 'Partial Color III' => 'Partial Colour III', + 'Red Color Filter' => 'Red Colour Filter', + 'Watercolor' => 'Watercolour', + 'Watercolor I' => 'Watercolour I', + 'Watercolor II' => 'Watercolour II', + 'Yellow Color Filter' => 'Yellow Colour Filter', + }, + }, + 'AudioIsInitialized' => 'Audio Is Initialised', + 'AutoAFPointColorTracking' => 'Auto AF Point Colour Tracking', + 'AutoLightingOptimizer' => 'Auto Lighting Optimiser', + 'AutoLightingOptimizerOn' => 'Auto Lighting Optimiser On', + 'BackgroundColor' => 'Background Colour', + 'BackgroundColorIndicator' => { + Description => 'Background Colour Indicator', + PrintConv => { + 'Specified Background Color' => 'Specified Background Colour', + 'Unspecified Background Color' => 'Unspecified Background Colour', + }, + }, + 'BackgroundColorValue' => 'Background Colour Value', + 'BasicColorImageSequence' => 'Basic Colour Image Sequence', + 'BelowColor' => 'Below Colour', + 'BestShotMode' => { + PrintConv => { + 'Water Color' => 'Water Colour', + }, + }, + 'BkColor' => 'Background Colour', + 'BluePaletteColorTableData' => 'Blue Palette Colour Table Data', + 'BluePaletteColorTableDescriptor' => 'Blue Palette Colour Table Descriptor', + 'BorderColor' => 'Border Colour', + 'CFAPlaneColor' => 'CFA Plane Colour', + 'CameraColorCalibration01' => 'Camera Colour Calibration 01', + 'CameraColorCalibration02' => 'Camera Colour Calibration 02', + 'CameraColorCalibration03' => 'Camera Colour Calibration 03', + 'CameraColorCalibration04' => 'Camera Colour Calibration 04', + 'CameraColorCalibration05' => 'Camera Colour Calibration 05', + 'CameraColorCalibration06' => 'Camera Colour Calibration 06', + 'CameraColorCalibration07' => 'Camera Colour Calibration 07', + 'CameraColorCalibration08' => 'Camera Colour Calibration 08', + 'CameraColorCalibration09' => 'Camera Colour Calibration 09', + 'CameraColorCalibration10' => 'Camera Colour Calibration 10', + 'CameraColorCalibration11' => 'Camera Colour Calibration 11', + 'CameraColorCalibration12' => 'Camera Colour Calibration 12', + 'CameraColorCalibration13' => 'Camera Colour Calibration 13', + 'CameraColorCalibration14' => 'Camera Colour Calibration 14', + 'CameraColorCalibration15' => 'Camera Colour Calibration 15', + 'CameraRawColorTone' => 'Camera Raw Colour Tone', + 'CanonColorInfo1' => 'Canon Colour Info 1', + 'CanonColorInfo2' => 'Canon Colour Info 2', + 'ChromaticityColorant' => 'Chromaticity Colourant', + 'CodingMethods' => { + PrintConv => { + 'JBIG color' => 'JBIG colour', + }, + }, + 'Color' => { + Description => 'Colour', + PrintConv => { + 'Color' => 'Colour', + }, + }, + 'ColorAberrationControl' => 'Colour Aberration Control', + 'ColorAdjustment' => 'Colour Adjustment', + 'ColorAdjustmentMode' => 'Colour Adjustment Mode', + 'ColorAverages' => 'Colour Averages', + 'ColorBW' => 'Colour BW', + 'ColorBalance' => 'Colour Balance', + 'ColorBalanceAdj' => 'Colour Balance Adj', + 'ColorBalanceBlue' => 'Colour Balance Blue', + 'ColorBalanceGreen' => 'Colour Balance Green', + 'ColorBalanceRed' => 'Colour Balance Red', + 'ColorBalanceUnknown' => 'Colour Balance Unknown', + 'ColorBalanceVersion' => 'Colour Balance Version', + 'ColorBitDepth' => 'Colour Bit Depth', + 'ColorBlur' => 'Colour Blur', + 'ColorBlurOn' => 'Colour Blur On', + 'ColorBoostLevel' => 'Colour Boost Level', + 'ColorBoostType' => 'Colour Boost Type', + 'ColorBooster' => 'Colour Booster', + 'ColorCalibrationMatrix' => 'Colour Calibration Matrix', + 'ColorCasts' => 'Colour Casts', + 'ColorCharacterization' => 'Colour Characterization', + 'ColorClass' => 'Colour Class', + 'ColorCompensationFilter' => 'Colour Compensation Filter', + 'ColorCompensationFilterCustom' => 'Colour Compensation Filter Custom', + 'ColorCompensationFilterSet' => 'Colour Compensation Filter Set', + 'ColorComponents' => 'Colour Components', + 'ColorControl' => 'Colour Control', + 'ColorCorrection' => 'Colour Correction', + 'ColorCreatorEffect' => 'Colour Creator Effect', + 'ColorDataVersion' => 'Colour Data Version', + 'ColorDescriptor' => 'Colour Descriptor', + 'ColorEffect' => 'Colour Effect', + 'ColorFieldCode' => 'Colour Field Code', + 'ColorFilter' => 'Colour Filter', + 'ColorGain' => 'Colour Gain', + 'ColorGroup' => 'Colour Group', + 'ColorHalftoningInfo' => 'Colour Halftoning Info', + 'ColorHue' => 'Colour Hue', + 'ColorImagePrintingFlag' => 'Colour Image Printing Flag', + 'ColorLabel' => 'Colour Label', + 'ColorMap' => 'Colour Map', + 'ColorMatrix' => 'Colour Matrix', + 'ColorMatrix1' => 'Colour Matrix 1', + 'ColorMatrix2' => 'Colour Matrix 2', + 'ColorMatrixA' => 'Colour Matrix A', + 'ColorMatrixAdobeRGB' => 'Colour Matrix Adobe RGB', + 'ColorMatrixB' => 'Colour Matrix B', + 'ColorMatrixNumber' => 'Colour Matrix Number', + 'ColorMatrixSRGB' => 'Colour Matrix sRGB', + 'ColorMode' => { + Description => 'Colour Mode', + PrintConv => { + 'Indexed Color' => 'Indexed Colour', + 'Natural color' => 'Natural colour', + 'Neutral Color' => 'Neutral Colour', + 'RGB Color' => 'RGB Colour', + 'Saturated Color' => 'Saturated Colour', + 'Vivid color' => 'Vivid colour', + }, + }, + 'ColorMoireReduction' => 'Colour Moire Reduction', + 'ColorMoireReductionMode' => 'Colour Moire Reduction Mode', + 'ColorNoiseReduction' => 'Colour Noise Reduction', + 'ColorNoiseReductionDetail' => 'Colour Noise Reduction Detail', + 'ColorNoiseReductionIntensity' => 'Colour Noise Reduction Intensity', + 'ColorNoiseReductionSharpness' => 'Colour Noise Reduction Sharpness', + 'ColorNoiseReductionSmoothness' => 'Colour Noise Reduction Smoothness', + 'ColorObjBackType' => 'Colour Obj Back Type', + 'ColorObjName' => 'Colour Obj Name', + 'ColorObjType' => 'Colour Obj Type', + 'ColorObjVersion' => 'Colour Obj Version', + 'ColorPalette' => 'Colour Palette', + 'ColorPlanes' => 'Colour Planes', + 'ColorPrimaries' => 'Colour Primaries', + 'ColorProfile' => 'Colour Profile', + 'ColorProfileSettings' => 'Colour Profile Settings', + 'ColorRangeLevels' => 'Colour Range Levels', + 'ColorRepresentation' => 'Colour Representation', + 'ColorReproduction' => 'Colour Reproduction', + 'ColorResolutionDepth' => 'Colour Resolution Depth', + 'ColorResponseUnit' => 'Colour Response Unit', + 'ColorSamplersResource' => 'Colour Samplers Resource', + 'ColorSamplersResource2' => 'Colour Samplers Resource 2', + 'ColorSaturationAdj' => 'Colour Saturation Adj', + 'ColorSequence' => 'Colour Sequence', + 'ColorSiting' => 'Colour Siting', + 'ColorSpace' => { + Description => 'Colour Space', + PrintConv => { + 'Embedded Color Profile' => 'Embedded Colour Profile', + 'Linked Color Profile' => 'Linked Colour Profile', + 'No color space specified' => 'No colour space specified', + 'Windows Color Space' => 'Windows Colour Space', + }, + }, + 'ColorSpaceData' => 'Colour Space Data', + 'ColorSpecApproximation' => 'Colour Spec Approximation', + 'ColorSpecData' => 'Colour Spec Data', + 'ColorSpecMethod' => { + Description => 'Colour Spec Method', + PrintConv => { + 'Vendor Color' => 'Vendor Colour', + }, + }, + 'ColorSpecPrecedence' => 'Colour Spec Precedence', + 'ColorSpecification' => 'Colour Specification', + 'ColorTable' => 'Colour Table', + 'ColorTempAsShot' => 'Colour Temp As Shot', + 'ColorTempAuto' => 'Colour Temp Auto', + 'ColorTempCloudy' => 'Colour Temp Cloudy', + 'ColorTempCustom' => 'Colour Temp Custom', + 'ColorTempCustom1' => 'Colour Temp Custom 1', + 'ColorTempCustom2' => 'Colour Temp Custom 2', + 'ColorTempDaylight' => 'Colour Temp Daylight', + 'ColorTempFlash' => 'Colour Temp Flash', + 'ColorTempFlashData' => 'Colour Temp Flash Data', + 'ColorTempFluorescent' => 'Colour Temp Fluorescent', + 'ColorTempFluorescentD' => 'Colour Temp Fluorescent D', + 'ColorTempFluorescentN' => 'Colour Temp Fluorescent N', + 'ColorTempFluorescentW' => 'Colour Temp Fluorescent W', + 'ColorTempKelvin' => 'Colour Temp Kelvin', + 'ColorTempMeasured' => 'Colour Temp Measured', + 'ColorTempPC1' => 'Colour Temp PC1', + 'ColorTempPC2' => 'Colour Temp PC2', + 'ColorTempPC3' => 'Colour Temp PC3', + 'ColorTempShade' => 'Colour Temp Shade', + 'ColorTempTungsten' => 'Colour Temp Tungsten', + 'ColorTempUnknown' => 'Colour Temp Unknown', + 'ColorTempUnknown10' => 'Colour Temp Unknown 10', + 'ColorTempUnknown11' => 'Colour Temp Unknown 11', + 'ColorTempUnknown12' => 'Colour Temp Unknown 12', + 'ColorTempUnknown13' => 'Colour Temp Unknown 13', + 'ColorTempUnknown14' => 'Colour Temp Unknown 14', + 'ColorTempUnknown15' => 'Colour Temp Unknown 15', + 'ColorTempUnknown16' => 'Colour Temp Unknown 16', + 'ColorTempUnknown17' => 'Colour Temp Unknown 17', + 'ColorTempUnknown18' => 'Colour Temp Unknown 18', + 'ColorTempUnknown19' => 'Colour Temp Unknown 19', + 'ColorTempUnknown2' => 'Colour Temp Unknown 2', + 'ColorTempUnknown20' => 'Colour Temp Unknown 20', + 'ColorTempUnknown21' => 'Colour Temp Unknown 21', + 'ColorTempUnknown22' => 'Colour Temp Unknown 22', + 'ColorTempUnknown23' => 'Colour Temp Unknown 23', + 'ColorTempUnknown24' => 'Colour Temp Unknown 24', + 'ColorTempUnknown25' => 'Colour Temp Unknown 25', + 'ColorTempUnknown26' => 'Colour Temp Unknown 26', + 'ColorTempUnknown27' => 'Colour Temp Unknown 27', + 'ColorTempUnknown28' => 'Colour Temp Unknown 28', + 'ColorTempUnknown29' => 'Colour Temp Unknown 29', + 'ColorTempUnknown3' => 'Colour Temp Unknown 3', + 'ColorTempUnknown30' => 'Colour Temp Unknown 30', + 'ColorTempUnknown4' => 'Colour Temp Unknown 4', + 'ColorTempUnknown5' => 'Colour Temp Unknown 5', + 'ColorTempUnknown6' => 'Colour Temp Unknown 6', + 'ColorTempUnknown7' => 'Colour Temp Unknown 7', + 'ColorTempUnknown8' => 'Colour Temp Unknown 8', + 'ColorTempUnknown9' => 'Colour Temp Unknown 9', + 'ColorTemperature' => 'Colour Temperature', + 'ColorTemperatureAdj' => 'Colour Temperature Adj', + 'ColorTemperatureAuto' => 'Colour Temperature Auto', + 'ColorTemperatureBG' => 'Colour Temperature BG', + 'ColorTemperatureCustom' => 'Colour Temperature Custom', + 'ColorTemperatureRG' => 'Colour Temperature RG', + 'ColorTemperatureSet' => 'Colour Temperature Set', + 'ColorTemperatureSetting' => { + Description => 'Colour Temperature Setting', + PrintConv => { + 'Color Filter' => 'Colour Filter', + }, + }, + 'ColorTone' => 'Colour Tone', + 'ColorToneAdj' => 'Colour Tone Adj', + 'ColorToneAuto' => 'Colour Tone Auto', + 'ColorToneFaithful' => 'Colour Tone Faithful', + 'ColorToneLandscape' => 'Colour Tone Landscape', + 'ColorToneMonochrome' => 'Colour Tone Monochrome', + 'ColorToneNeutral' => 'Colour Tone Neutral', + 'ColorTonePortrait' => 'Colour Tone Portrait', + 'ColorToneStandard' => 'Colour Tone Standard', + 'ColorToneUserDef1' => 'Colour Tone User Def 1', + 'ColorToneUserDef2' => 'Colour Tone User Def 2', + 'ColorToneUserDef3' => 'Colour Tone User Def 3', + 'ColorTransferFuncs' => 'Colour Transfer Funcs', + 'ColorTransform' => 'Colour Transform', + 'ColorTwistMatrix' => 'Colour Twist Matrix', + 'ColorType' => { + Description => 'Colour Type', + PrintConv => { + 'Color' => 'Colour', + 'Color Alpha' => 'Colour Alpha', + }, + }, + 'Colorant1Coordinates' => 'Colourant 1 Coordinates', + 'Colorant1Name' => 'Colourant 1 Name', + 'Colorant2Coordinates' => 'Colourant 2 Coordinates', + 'Colorant2Name' => 'Colourant 2 Name', + 'Colorant3Coordinates' => 'Colourant 3 Coordinates', + 'Colorant3Name' => 'Colourant 3 Name', + 'ColorantA' => 'Colourant A', + 'ColorantB' => 'Colourant B', + 'ColorantBlack' => 'Colourant Black', + 'ColorantBlue' => 'Colourant Blue', + 'ColorantCount' => 'Colourant Count', + 'ColorantCyan' => 'Colourant Cyan', + 'ColorantGray' => 'Colourant Gray', + 'ColorantGreen' => 'Colourant Green', + 'ColorantL' => 'Colourant L', + 'ColorantMagenta' => 'Colourant Magenta', + 'ColorantMode' => 'Colourant Mode', + 'ColorantOrder' => 'Colourant Order', + 'ColorantRed' => 'Colourant Red', + 'ColorantSwatchName' => 'Colourant Swatch Name', + 'ColorantTableOut' => 'Colourant Table Out', + 'ColorantTint' => 'Colourant Tint', + 'ColorantType' => 'Colourant Type', + 'ColorantYellow' => 'Colourant Yellow', + 'Colorants' => 'Colourants', + 'ColorimetricIntentImageState' => 'Colourimetric Intent Image State', + 'ColorimetricReference' => 'Colourimetric Reference', + 'Colorimetry' => 'Colourimetry', + 'ColorimetryCode' => 'Colourimetry Code', + 'Colors' => 'Colours', + 'Compression' => { + PrintConv => { + 'JBIG Color' => 'JBIG Colour', + }, + }, + 'ContrastMode' => { + PrintConv => { + 'Dynamic (Color Film)' => 'Dynamic (Colour Film)', + 'Dynamic Art (My Color)' => 'Dynamic Art (My Colour)', + 'Elegant (My Color)' => 'Elegant (My Colour)', + 'Nature (Color Film)' => 'Nature (Colour Film)', + 'Nostalgic (Color Film)' => 'Nostalgic (Colour Film)', + 'Retro (My Color)' => 'Retro (My Colour)', + 'Smooth (Color Film) or Pure (My Color)' => 'Smooth (Colour Film) or Pure (My Colour)', + 'Vibrant (Color Film) or Expressive (My Color)' => 'Vibrant (Colour Film) or Expressive (My Colour)', + }, + }, + 'CustomColorTone' => 'Custom Colour Tone', + 'D-LightingHQColorBoost' => 'D-Lighting HQ Colour Boost', + 'D-LightingHSColorBoost' => 'D-Lighting HS Colour Boost', + 'D-RangeOptimizerHighlight' => 'D-Range Optimiser Highlight', + 'D-RangeOptimizerMode' => 'D-Range Optimiser Mode', + 'D-RangeOptimizerShadow' => 'D-Range Optimiser Shadow', + 'D-RangeOptimizerValue' => 'D-Range Optimiser Value', + 'DateTimeDigitized' => 'Date/Time Digitised', + 'DefHilite' => 'Use Default Highlight Colour', + 'DefaultImageColor' => 'Default Image Colour', + 'DefineQuantizationTable' => 'Define Quantisation Table', + 'DeltaType' => { + PrintConv => { + 'Color Addition' => 'Colour Addition', + 'Color Replacement' => 'Colour Replacement', + }, + }, + 'DigitalFilter01' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Replace Color' => 'Replace Colour', + 'Unicolor Bold' => 'Unicolour Bold', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter02' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter03' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter04' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter05' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter06' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter07' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter08' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter09' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter10' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter11' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter12' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter13' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter14' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter15' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter16' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter17' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter18' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter19' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DigitalFilter20' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Extract Color' => 'Extract Colour', + 'Invert Color' => 'Invert Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'DisplayUnits' => { + PrintConv => { + 'meters' => 'Metres', + }, + }, + 'DriveMode' => { + PrintConv => { + 'D-Range Optimizer Bracketing High' => 'D-Range Optimiser Bracketing High', + 'D-Range Optimizer Bracketing Low' => 'D-Range Optimiser Bracketing Low', + }, + }, + 'DriveMode2' => { + PrintConv => { + 'D-Range Optimizer Bracketing High' => 'D-Range Optimiser Bracketing High', + 'D-Range Optimizer Bracketing Low' => 'D-Range Optimiser Bracketing Low', + }, + }, + 'DynamicRangeOptimizer' => 'Dynamic Range Optimiser', + 'DynamicRangeOptimizerBracket' => 'Dynamic Range Optimiser Bracket', + 'DynamicRangeOptimizerLevel' => 'Dynamic Range Optimiser Level', + 'DynamicRangeOptimizerMode' => 'Dynamic Range Optimiser Mode', + 'DynamicRangeOptimizerSetting' => 'Dynamic Range Optimiser Setting', + 'EasyMode' => { + PrintConv => { + 'Color Accent' => 'Colour Accent', + 'Color Swap' => 'Colour Swap', + 'My Colors' => 'My Colours', + }, + }, + 'EmbeddedImageColorSpace' => 'Embedded Image Colour Space', + 'ExposureProgram' => { + PrintConv => { + 'Partial Color Blue' => 'Partial Colour Blue', + 'Partial Color Green' => 'Partial Colour Green', + 'Partial Color Red' => 'Partial Colour Red', + 'Partial Color Yellow' => 'Partial Colour Yellow', + 'Pop Color' => 'Pop Colour', + }, + }, + 'FaithfulRawColorTone' => 'Faithful Raw Colour Tone', + 'FaxProfile' => { + PrintConv => { + 'Lossless color and grayscale, L' => 'Lossless colour and grayscale, L', + 'Lossy color and grayscale, C' => 'Lossy colour and grayscale, C', + }, + }, + 'FgColor' => 'Foreground Colour', + 'FileFormat' => { + PrintConv => { + 'JPEG (lossy/non-quantization toggled)' => 'JPEG (lossy/non-quantisation toggled)', + 'JPEG (non-quantization)' => 'JPEG (non-quantisation)', + }, + }, + 'FilmColorProcess' => 'Film Colour Process', + 'FilmMode' => { + PrintConv => { + 'Dynamic (color)' => 'Dynamic (colour)', + 'Nature (color)' => 'Nature (colour)', + 'Smooth (color)' => 'Smooth (colour)', + 'Standard (color)' => 'Standard (colour)', + }, + }, + 'FlagColor' => 'Flag Colour', + 'FlashColorFilter' => 'Flash Colour Filter', + 'FocalPlaneColorimetryEstimates' => 'Focal Plane Colourimetry Estimates', + 'GammaColorTone' => 'Gamma Colour Tone', + 'GenOpColor' => 'Gen Op Colour', + 'GenreID' => { + PrintConv => { + 'Books|Kids|Basic Concepts|Colors' => 'Books|Kids|Basic Concepts|Colours', + }, + }, + 'GreenPaletteColorTableData' => 'Green Palette Colour Table Data', + 'GreenPaletteColorTableDescriptor' => 'Green Palette Colour Table Descriptor', + 'HasColorMap' => 'Has Colour Map', + 'HighlightColorDistortReduct' => 'Highlight Colour Distort Reduct', + 'HiliteColor' => 'Highlight Colour', + 'ImageAlterationConstraints' => { + PrintConv => { + 'No Colorization' => 'No Colourization', + 'No De-Colorization' => 'No De-Colourization', + }, + }, + 'ImageColor' => 'Image Colour', + 'ImageColorIndicator' => { + Description => 'Image Colour Indicator', + PrintConv => { + 'Specified Image Color' => 'Specified Image Colour', + 'Unspecified Image Color' => 'Unspecified Image Colour', + }, + }, + 'ImageColorValue' => 'Image Colour Value', + 'ImageMedium' => { + PrintConv => { + 'Color hard copy' => 'Colour hard copy', + 'Color negative' => 'Colour negative', + 'Color reversal' => 'Colour reversal', + }, + }, + 'ImageOptimization' => 'Image Optimisation', + 'IndexedColorTableCount' => 'Indexed Colour Table Count', + 'InitializedDataSize' => 'Initialised Data Size', + 'InterchangeColorSpace' => 'Interchange Colour Space', + 'Isotherm1Color' => 'Isotherm 1 Colour', + 'Isotherm2Color' => 'Isotherm 2 Colour', + 'LandscapeRawColorTone' => 'Landscape Raw Colour Tone', + 'LargeBluePaletteColorTableData' => 'Large Blue Palette Colour Table Data', + 'LargeBluePaletteColorTableDescr' => 'Large Blue Palette Colour Table Descr', + 'LargeGreenPaletteColorTableData' => 'Large Green Palette Colour Table Data', + 'LargeGreenPaletteColorTableDescr' => 'Large Green Palette Colour Table Descr', + 'LargePaletteColorLookupTableUID' => 'Large Palette Colour Lookup Table UID', + 'LargeRedPaletteColorTableData' => 'Large Red Palette Colour Table Data', + 'LargeRedPaletteColorTableDescr' => 'Large Red Palette Colour Table Descr', + 'LayerBlendModes' => { + PrintConv => { + 'Color' => 'Colour', + 'Color Burn' => 'Colour Burn', + 'Color Dodge' => 'Colour Dodge', + 'Darker Color' => 'Darker Colour', + 'Lighter Color' => 'Lighter Colour', + }, + }, + 'MDColorTable' => 'MD Colour Table', + 'MDItemColorSpace' => 'MD Item Colour Space', + 'MagicFilter' => { + PrintConv => { + 'Pale & Light Color' => 'Pale & Light Colour', + 'Pale & Light Color II' => 'Pale & Light Colour II', + 'Partial Color' => 'Partial Colour', + 'Partial Color II' => 'Partial Colour II', + 'Partial Color III' => 'Partial Colour III', + 'Watercolor' => 'Watercolour', + 'Watercolor I' => 'Watercolour I', + 'Watercolor II' => 'Watercolour II', + }, + }, + 'MandatoryBackground' => { + PrintConv => { + 'Color Advisory, Image Mandatory' => 'Colour Advisory, Image Mandatory', + 'Color Mandatory, Image Advisory' => 'Colour Mandatory, Image Advisory', + 'Color and Image Advisory' => 'Colour and Image Advisory', + 'Color and Image Mandatory' => 'Colour and Image Mandatory', + }, + }, + 'MattColor' => 'Matt Colour', + 'MediaColor' => 'Media Colour', + 'ModifiedColorTemp' => 'Modified Colour Temp', + 'MonochromeColor' => 'Monochrome Colour', + 'MyColorMode' => { + Description => 'My Colour Mode', + PrintConv => { + 'Color Accent' => 'Colour Accent', + 'Color Swap' => 'Colour Swap', + }, + }, + 'NamedColor' => 'Named Colour', + 'NamedColor2' => 'Named Colour 2', + 'NeutralRawColorTone' => 'Neutral Raw Colour Tone', + 'NewColorType' => 'New Colour Type', + 'NumColors' => 'Num Colours', + 'NumImportantColors' => 'Num Important Colours', + 'OpColor' => 'Op Colour', + 'OverflowColor' => 'Overflow Colour', + 'PF25ColorMatrix' => 'PF25 Colour Matrix', + 'PaletteColorTableUID' => 'Palette Colour Table UID', + 'PaletteColors' => 'Palette Colours', + 'PhotoEffect' => { + PrintConv => { + 'My Color Data' => 'My Colour Data', + }, + }, + 'PhotometricInterpretation' => { + PrintConv => { + 'Color Filter Array' => 'Colour Filter Array', + }, + }, + 'Photoshop2ColorTable' => 'Photoshop 2 Colour Table', + 'PhotoshopFormat' => { + PrintConv => { + 'Optimized' => 'Optimised', + }, + }, + 'PictureEffect' => { + PrintConv => { + 'Partial Color (blue)' => 'Partial Colour (blue)', + 'Partial Color (green)' => 'Partial Colour (green)', + 'Partial Color (red)' => 'Partial Colour (red)', + 'Partial Color (yellow)' => 'Partial Colour (yellow)', + 'Pop Color' => 'Pop Colour', + 'Water Color' => 'Water Colour', + 'Water Color 2' => 'Water Colour 2', + }, + }, + 'PictureEffect2' => { + PrintConv => { + 'Partial Color' => 'Partial Colour', + 'Pop Color' => 'Pop Colour', + 'Water Color' => 'Water Colour', + }, + }, + 'PictureIndexedColors' => 'Picture Indexed Colours', + 'PictureMode' => { + PrintConv => { + 'Color Creator' => 'Colour Creator', + 'Color Profile 1' => 'Colour Profile 1', + 'Color Profile 2' => 'Colour Profile 2', + 'Color Profile 3' => 'Colour Profile 3', + }, + }, + 'PictureType' => { + PrintConv => { + 'Bright(ly) Colored Fish' => 'Bright(ly) Coloured Fish', + }, + }, + 'PictureWizardColor' => 'Picture Wizard Colour', + 'PortraitRawColorTone' => 'Portrait Raw Colour Tone', + 'PresetWhiteBalance' => { + PrintConv => { + 'Color Temperature' => 'Colour Temperature', + }, + }, + 'PreviewColorSpace' => 'Preview Colour Space', + 'ProfileClass' => { + PrintConv => { + 'ColorSpace Conversion Profile' => 'ColourSpace Conversion Profile', + 'NamedColor Profile' => 'Named Colour Profile', + }, + }, + 'PseudoColorType' => 'Pseudo Colour Type', + 'QuantizationDefault' => 'Quantisation Default', + 'QuantizationMethod' => { + Description => 'Quantisation Method', + PrintConv => { + 'Color Space Specific' => 'Colour Space Specific', + }, + }, + 'RGBBkCol' => 'Background Colour', + 'RGBFgCol' => 'Foreground Colour', + 'ROIDisplayColor' => 'ROI Display Colour', + 'RawColorAdj' => 'Raw Colour Adj', + 'RawDevArtFilter' => { + PrintConv => { + 'Pale & Light Color' => 'Pale & Light Colour', + 'Pale & Light Color II' => 'Pale & Light Colour II', + 'Partial Color' => 'Partial Colour', + 'Partial Color II' => 'Partial Colour II', + 'Partial Color III' => 'Partial Colour III', + 'Watercolor' => 'Watercolour', + 'Watercolor I' => 'Watercolour I', + 'Watercolor II' => 'Watercolour II', + }, + }, + 'RawDevColorSpace' => 'Raw Dev Colour Space', + 'RawDevMemoryColorEmphasis' => 'Raw Dev Memory Colour Emphasis', + 'RawDevSettings' => { + PrintConv => { + 'Color Space' => 'Colour Space', + 'WB Color Temp' => 'WB Colour Temp', + }, + }, + 'RawDevWhiteBalance' => { + PrintConv => { + 'Color Temperature' => 'Colour Temperature', + }, + }, + 'RedPaletteColorTableData' => 'Red Palette Colour Table Data', + 'RedPaletteColorTableDescriptor' => 'Red Palette Colour Table Descriptor', + 'ReflectionHardcopyOrigColorimetry' => 'Reflection Hardcopy Orig Colourimetry', + 'ReflectionPrintOutputColorimetry' => 'Reflection Print Output Colourimetry', + 'RenderingIntent' => { + PrintConv => { + 'Absolute Colorimetric (LCS_GM_ABS_COLORIMETRIC)' => 'Absolute Colourimetric (LCS_GM_ABS_COLORIMETRIC)', + 'ICC-Absolute Colorimetric' => 'ICC-Absolute Colourimetric', + 'Media-Relative Colorimetric' => 'Media-Relative Colourimetric', + }, + }, + 'RetouchHistory' => { + PrintConv => { + 'Color Custom' => 'Colour Custom', + 'Color Outline' => 'Colour Outline', + 'Color Sketch' => 'Colour Sketch', + 'Selective Color' => 'Selective Colour', + }, + }, + 'SBAInputImageColorspace' => 'SBA Input Image Colourspace', + 'SRGBRendering' => { + PrintConv => { + 'Absolute Colorimetric' => 'Absolute Colourimetric', + 'Relative Colorimetric' => 'Relative Colourimetric', + }, + }, + 'SceneBalanceAlgorithmCommand' => { + PrintConv => { + 'Neutral SBA Off, Color SBA Off' => 'Neutral SBA Off, Colour SBA Off', + 'Neutral SBA Off, Color SBA On' => 'Neutral SBA Off, Colour SBA On', + 'Neutral SBA On, Color SBA Off' => 'Neutral SBA On, Colour SBA Off', + 'Neutral SBA On, Color SBA On' => 'Neutral SBA On, Colour SBA On', + }, + }, + 'SceneColorimetryEstimates' => 'Scene Colourimetry Estimates', + 'SceneMode' => { + PrintConv => { + 'Color Effects' => 'Colour Effects', + 'My Color' => 'My Colour', + }, + }, + 'ScreenMinimumColorBitDepth' => 'Screen Minimum Colour Bit Depth', + 'SegmentedBlueColorTableData' => 'Segmented Blue Colour Table Data', + 'SegmentedGreenColorTableData' => 'Segmented Green Colour Table Data', + 'SegmentedRedColorTableData' => 'Segmented Red Colour Table Data', + 'SensingMethod' => { + PrintConv => { + 'Color sequential area' => 'Colour sequential area', + 'Color sequential linear' => 'Colour sequential linear', + 'One-chip color area' => 'One-chip colour area', + 'Three-chip color area' => 'Three-chip colour area', + 'Two-chip color area' => 'Two-chip colour area', + }, + }, + 'ShootingMode' => { + PrintConv => { + 'Color Effects' => 'Colour Effects', + 'My Color' => 'My Colour', + }, + }, + 'ShutterPresentationColorCIELabVal' => 'Shutter Presentation Colour CIE Lab Val', + 'SmartAlbumColor' => 'Smart Album Colour', + 'SpecialEffectsOpticalFilter' => { + PrintConv => { + 'Colored' => 'Coloured', + }, + }, + 'StandardRawColorTone' => 'Standard Raw Colour Tone', + 'StdOutputColorMode' => 'Std Output Colour Mode', + 'StreamColor' => 'Stream Colour', + 'SubSecTimeDigitized' => 'Sub Sec Time Digitised', + 'SubfileType' => { + PrintConv => { + 'Color IW44' => 'Colour IW44', + }, + }, + 'SubimageColor' => 'Subimage Colour', + 'SwatchColorantA' => 'Swatch Colourant A', + 'SwatchColorantB' => 'Swatch Colourant B', + 'SwatchColorantBlack' => 'Swatch Colourant Black', + 'SwatchColorantBlue' => 'Swatch Colourant Blue', + 'SwatchColorantCyan' => 'Swatch Colourant Cyan', + 'SwatchColorantGray' => 'Swatch Colourant Gray', + 'SwatchColorantGreen' => 'Swatch Colourant Green', + 'SwatchColorantL' => 'Swatch Colourant L', + 'SwatchColorantMagenta' => 'Swatch Colourant Magenta', + 'SwatchColorantMode' => 'Swatch Colourant Mode', + 'SwatchColorantRed' => 'Swatch Colourant Red', + 'SwatchColorantSwatchName' => 'Swatch Colourant Swatch Name', + 'SwatchColorantTint' => 'Swatch Colourant Tint', + 'SwatchColorantType' => 'Swatch Colourant Type', + 'SwatchColorantYellow' => 'Swatch Colourant Yellow', + 'SwatchGroupsColorants' => 'Swatch Groups Colourants', + 'TestTarget' => { + PrintConv => { + 'Color Chart' => 'Colour Chart', + }, + }, + 'TextColor' => 'Text Colour', + 'ToneCurveColorSpace' => 'Tone Curve Colour Space', + 'ToningEffect' => { + PrintConv => { + 'Color' => 'Colour', + }, + }, + 'TypeOfOriginal' => { + PrintConv => { + 'Color Document' => 'Colour Document', + 'Color Print' => 'Colour Print', + }, + }, + 'UCRBG' => 'Under Colour Removal & Black Gen.', + 'USPTOOriginalContentType' => { + PrintConv => { + 'Color' => 'Colour', + }, + }, + 'UltrasoundColorDataPresent' => 'Ultrasound Colour Data Present', + 'UnderflowColor' => 'Underflow Colour', + 'UninitializedDataSize' => 'Uninitialised Data Size', + 'Unsharp1Color' => 'Unsharp 1 Colour', + 'Unsharp2Color' => 'Unsharp 2 Colour', + 'Unsharp3Color' => 'Unsharp 3 Colour', + 'Unsharp4Color' => 'Unsharp 4 Colour', + 'VideoAlphaPremultipleColor' => 'Video Alpha Premultiple Colour', + 'VideoAlphaPremultipleColorA' => 'Video Alpha Premultiple Colour A', + 'VideoAlphaPremultipleColorB' => 'Video Alpha Premultiple Colour B', + 'VideoAlphaPremultipleColorBlack' => 'Video Alpha Premultiple Colour Black', + 'VideoAlphaPremultipleColorBlue' => 'Video Alpha Premultiple Colour Blue', + 'VideoAlphaPremultipleColorCyan' => 'Video Alpha Premultiple Colour Cyan', + 'VideoAlphaPremultipleColorGray' => 'Video Alpha Premultiple Colour Gray', + 'VideoAlphaPremultipleColorGreen' => 'Video Alpha Premultiple Colour Green', + 'VideoAlphaPremultipleColorL' => 'Video Alpha Premultiple Colour L', + 'VideoAlphaPremultipleColorMagenta' => 'Video Alpha Premultiple Colour Magenta', + 'VideoAlphaPremultipleColorMode' => 'Video Alpha Premultiple Colour Mode', + 'VideoAlphaPremultipleColorRed' => 'Video Alpha Premultiple Colour Red', + 'VideoAlphaPremultipleColorSwatchName' => 'Video Alpha Premultiple Colour Swatch Name', + 'VideoAlphaPremultipleColorTint' => 'Video Alpha Premultiple Colour Tint', + 'VideoAlphaPremultipleColorType' => 'Video Alpha Premultiple Colour Type', + 'VideoAlphaPremultipleColorYellow' => 'Video Alpha Premultiple Colour Yellow', + 'VideoColorKind' => 'Video Colour Kind', + 'VideoColorSpace' => 'Video Colour Space', + 'VisualColor' => { + Description => 'Visual Colour', + PrintConv => { + 'Color' => 'Colour', + }, + }, + 'WBAdjColorTemp' => 'WB Adj Colour Temp', + 'WBAdjLighting' => { + PrintConv => { + 'High Color Rendering Fluorescent (3700K)' => 'High Colour Rendering Fluorescent (1)', + 'High Color Rendering Fluorescent (5000K)' => 'High Colour Rendering Fluorescent (3)', + 'High Color Rendering Fluorescent (cool white)' => 'High Colour Rendering Fluorescent (2)', + 'High Color Rendering Fluorescent (daylight)' => 'High Colour Rendering Fluorescent (4)', + 'High Color Rendering Fluorescent (warm white)' => 'High Colour Rendering Fluorescent (0)', + 'Sodium Vapor Lamps' => 'Sodium Vapour Lamps', + 'Standard Fluorescent (high temperature mercury vapor)' => 'Standard Fluorescent (high temperature mercury vapour)', + }, + }, + 'WatercolorFilter' => 'Watercolour Filter', + 'WhiteBalance' => { + PrintConv => { + 'Color Filter' => 'Colour Filter', + 'Color Temperature' => 'Colour Temperature', + 'Color Temperature Enhancement' => 'Colour Temperature Enhancement', + 'Color Temperature/Color Filter' => 'Colour Temperature/Colour Filter', + }, + }, + 'WhiteBalance2' => { + PrintConv => { + 'Auto (Keep Warm Color Off)' => 'Auto (Keep Warm Colour Off)', + }, + }, + 'WhiteBalanceSet' => { + PrintConv => { + 'Set Color Temperature 1' => 'Set Colour Temperature 1', + 'Set Color Temperature 2' => 'Set Colour Temperature 2', + 'Set Color Temperature 3' => 'Set Colour Temperature 3', + }, + }, + 'WhiteBalanceSetting' => { + PrintConv => { + 'Color Temperature/Color Filter' => 'Colour Temperature/Colour Filter', + }, + }, + 'WorkColorSpace' => { + Description => 'Work Colour Space', + PrintConv => { + 'ColorMatch RGB' => 'ColourMatch RGB', + }, + }, + 'XMethod' => { + PrintConv => { + 'Color Closest Pixel and Alpha Linear Interpolation' => 'Colour Closest Pixel and Alpha Linear Interpolation', + 'Color Linear Interpolation and Alpha Closest Pixel' => 'Colour Linear Interpolation and Alpha Closest Pixel', + }, + }, + 'YMethod' => { + PrintConv => { + 'Color Closest Pixel and Alpha Linear Interpolation' => 'Colour Closest Pixel and Alpha Linear Interpolation', + 'Color Linear Interpolation and Alpha Closest Pixel' => 'Colour Linear Interpolation and Alpha Closest Pixel', + }, + }, +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::en_gb.pm - ExifTool British English language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/es.pm b/lib/Image/ExifTool/Lang/es.pm new file mode 100644 index 0000000..10641b1 --- /dev/null +++ b/lib/Image/ExifTool/Lang/es.pm @@ -0,0 +1,4023 @@ +#------------------------------------------------------------------------------ +# File: es.pm +# +# Description: ExifTool Spanish language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::es; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.16'; + +%Image::ExifTool::Lang::es::Translate = ( + 'AEAperture' => 'Aperture AE', + 'AELock' => 'Bloqueo AE', + 'AELockButton' => { + Description => 'Botón Bloqueo AE', + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'AELockButtonPlusDials' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'AEMaxAperture2' => 'Apertura máxima AE 2', + 'AEMinAperture' => 'Apertura mínima AE', + 'AEProgramMode' => { + PrintConv => { + 'Landscape' => 'Paisaje', + 'Portrait' => 'Retrato', + 'Standard' => 'Estándar', + }, + }, + 'AESetting' => { + PrintConv => { + 'AE Lock' => 'Bloqueo AE', + 'Exposure Compensation' => 'Compensación Exposición', + }, + }, + 'AFAperture' => 'Apertura AF', + 'AFAreaHeight' => 'AF Alto Ãrea', + 'AFAreaHeights' => 'AF Alto Ãrea', + 'AFAreaIllumination' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'AFAreaMode' => { + Description => 'AF Modo Ãrea', + PrintConv => { + 'Face Detect AF' => 'Detección Caras AF', + 'Multi-point AF or AI AF' => 'Multipunto AF o AI AF', + 'Off (Manual Focus)' => 'Desactivado (Enfoque Manual)', + 'Single-point AF' => 'Punto único AF)', + 'Zone AF' => 'Zona AF', + }, + }, + 'AFAreaWidth' => 'AF Ancho Ãrea', + 'AFAreaWidths' => 'AF Ancho Ãrea', + 'AFAssist' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'AFImageHeight' => 'AF Alto Imágen', + 'AFImageWidth' => 'AF Ancho Imágen', + 'AFMode' => 'Modo AF', + 'AFPoint' => { + Description => 'Punto AF', + PrintConv => { + 'Center' => 'Centro', + 'Face Detect' => 'Detección Caras', + 'Left' => 'Izquierda', + 'None' => 'Ninguno', + 'None (MF)' => 'Ninguno (MF)', + 'Right' => 'Derecha', + }, + }, + 'AFPointActivationArea' => { + Description => 'Area de Activación Punto AF', + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'AFPointAreaExpansion' => { + Description => 'Area Expansion Punto AF', + PrintConv => { + 'Disable' => 'Desactivado', + }, + }, + 'AFPointAutoSelection' => 'Autoselección Punto AF', + 'AFPointBrightness' => { + Description => 'Brillo Punto AF', + PrintConv => { + 'Brighter' => 'Brillante', + 'High' => 'Alto', + 'Low' => 'Bajo', + }, + }, + 'AFPointDisplayDuringFocus' => { + Description => 'Mostrar Punto AF durante el enfoque', + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'AFPointIllumination' => { + Description => 'Iluminación de Punto AF', + PrintConv => { + 'Brighter' => 'Brillante', + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'AFPointMode' => 'Modo Punto AF', + 'AFPointPosition' => 'Posición Punto AF', + 'AFPointRegistration' => 'Registro de Puntos AF', + 'AFPointSelected' => { + Description => 'Punto AF Seleccionado', + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'AFPointSelected2' => 'Punto AF Seleccionado 2 ', + 'AFPointSelection' => 'Selección de Punto AF', + 'AFPointSelectionMethod' => 'Método Selección Punto AF', + 'AFPoints' => 'Punto AF', + 'AFPointsInFocus' => { + Description => 'Puntos AF en foco', + PrintConv => { + 'All' => 'Todo', + 'None' => 'Ninguno', + }, + }, + 'AFPointsInFocus1D' => 'Puntos AF en foco', + 'AFPointsInFocus5D' => { + Description => 'Puntos AF en foco 5D', + PrintConv => { + 'Bottom' => 'Abajo', + 'Center' => 'Centro', + 'Left' => 'Izquierda', + 'Lower-left' => 'Inferior izquierda', + 'Lower-right' => 'Inferior derecha', + 'Right' => 'Derecha', + 'Top' => 'Arriba', + 'Upper-left' => 'Superior izquierda', + 'Upper-right' => 'Superior derecha', + }, + }, + 'AFPointsSelected' => 'Puntos AF seleccionados', + 'AFPointsUnknown1' => { + PrintConv => { + 'All' => 'Todo', + }, + }, + 'AFPointsUsed' => 'Puntos AF utilizados', + 'AIServoTrackingSensitivity' => { + PrintConv => { + 'Fast' => 'Rápido', + 'Standard' => 'Estándar', + }, + }, + 'APEVersion' => 'Versión APE', + 'ARMIdentifier' => 'Identificador ARM', + 'ARMVersion' => 'Versión ARM', + 'AToB0' => 'A a B0', + 'AToB1' => 'A a B1', + 'AToB2' => 'A a B2', + 'ActionAdvised' => { + Description => 'Acción Aconsejada', + PrintConv => { + 'Object Append' => 'Añadir Objeto', + 'Object Kill' => 'Destruir Objecto', + 'Object Reference' => 'Referencia Objecto', + 'Object Replace' => 'Reemplazar Objecto', + 'Ojbect Append' => 'Añadir Objeto', + }, + }, + 'ActiveArea' => 'Ãrea Activa', + 'ActiveD-Lighting' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ActiveD-LightingMode' => { + PrintConv => { + 'High' => 'Alto', + 'Off' => 'Desactivado', + }, + }, + 'AddAspectRatioInfo' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'AddOriginalDecisionData' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'AdjustmentMode' => 'Modo Ajuste', + 'AdvancedRaw' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'AdvancedSceneMode' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + 'Soft' => 'Suave', + }, + }, + 'Album' => 'Ãlbum', + 'AlphaByteCount' => 'Número Byte Alfa', + 'AlphaDataDiscard' => { + Description => 'Datos Alfa Descartados', + PrintConv => { + 'Flexbits Discarded' => 'FlexBits Descartado', + 'Full Resolution' => 'Resolución Total', + 'HighPass Frequency Data Discarded' => 'Datos Frecuencia High-Pass Descartados', + 'Highpass and LowPass Frequency Data Discarded' => 'Dato Frecuencia High-Pass y Low-Pass Descartados', + }, + }, + 'AlphaOffset' => 'Offset Alfa', + 'AmbienceSelection' => { + PrintConv => { + 'Brighter' => 'Brillante', + 'Cool' => 'Frío', + 'Darker' => 'Oscuro', + 'Intense' => 'Intenso', + 'Monochrome' => 'Monocromo', + 'Soft' => 'Suave', + 'Standard' => 'Estándar', + 'Vivid' => 'Vívido', + 'Warm' => 'Cálido', + }, + }, + 'AnalogBalance' => 'Balance Analógico', + 'Annotation' => 'Anotación', + 'Annotations' => 'Anotaciones', + 'Anti-Blur' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'AntiAliasStrength' => 'Potencia Relativa del Filtro Antialiasing', + 'Aperture' => 'Apertura', + 'ApertureRange' => 'Rango Apertura', + 'ApertureSetting' => 'Ajustes Apertura', + 'ApertureValue' => 'Apertura', + 'ApplicationRecordVersion' => 'Versión Registro Aplicación', + 'ArtMode' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + 'Panorama' => 'Panoramica', + }, + }, + 'Artist' => 'Autor', + 'AsShotICCProfile' => 'Perfil ICC Captura', + 'AsShotNeutral' => 'Captura Neutral', + 'AsShotPreProfileMatrix' => 'Matriz Pre Perfil Captura', + 'AsShotProfileName' => 'Nombre Perfil Captura', + 'AsShotWhiteXY' => 'Captura Blanco X-Y', + 'Audio' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'AudioChannelType' => { + PrintConv => { + 'Other' => 'Otro', + }, + }, + 'AudioChannels' => 'Canales Audio', + 'AudioCodecID' => { + PrintConv => { + 'Unknown -' => 'Desconocido -', + }, + }, + 'AudioDuration' => 'Duración Audio', + 'AudioOutcue' => 'Cola Audio', + 'AudioSampleType' => { + PrintConv => { + 'Other' => 'Otro', + }, + }, + 'AudioSamplingRate' => 'Ratio Muestreo Audio', + 'AudioSamplingResolution' => 'Resolución Muestreo Audio', + 'AudioType' => { + Description => 'Tipo Audio', + PrintConv => { + 'Mono Actuality' => 'Actualidad (audio mono (1 canal))', + 'Mono Music' => 'Música transmitida por si misma (audio mono (1 canal))', + 'Mono Question and Answer Session' => 'Sesión pregunta y respuesta (audio mono (1 canal))', + 'Mono Raw Sound' => 'Sonido bruto (audio mono (1 canal))', + 'Mono Response to a Question' => 'Respuesta a una pregunta (audio mono (1 canal))', + 'Mono Scener' => 'Escena (audio mono (1 canal))', + 'Mono Voicer' => 'Voz (audio mono (1 canal))', + 'Mono Wrap' => 'Envolvente (audio mono (1 canal))', + 'Stereo Actuality' => 'Actualidad (audio estéreo (2 canales))', + 'Stereo Music' => 'Música transmitida por si misma (audio estéreo (2 canales))', + 'Stereo Question and Answer Session' => 'Sesión pregunta y respuesta (audio estéreo (2 canales))', + 'Stereo Raw Sound' => 'Sonido bruto (audio estéreo (2 canales))', + 'Stereo Response to a Question' => 'Respuesta a una pregunta (audio estéreo (2 canales))', + 'Stereo Scener' => 'Escena (audio estéreo (2 canales))', + 'Stereo Voicer' => 'Voz (audio estéreo (2 canales))', + 'Stereo Wrap' => 'Envolvente (audio estéreo (2 canales))', + 'Text Only' => 'Solo texto (sin dato de objeto)', + }, + }, + 'Author' => 'Autor', + 'AuthorsPosition' => 'Posición del Autor', + 'AutoAperture' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'AutoBracket' => 'Auto-horquillado', + 'AutoExposureBracketing' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'AutoFP' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'AutoLightingOptimizer' => { + PrintConv => { + 'Low' => 'Bajo', + 'Off' => 'Desactivado', + 'Standard' => 'Estándar', + 'Strong' => 'Fuerte', + }, + }, + 'AutoLightingOptimizerOn' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'AutoRedEye' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'AutoRotate' => { + PrintConv => { + 'None' => 'Ninguno', + 'Rotate 180' => 'Girado 180°', + 'Rotate 270 CW' => 'Girado 270° sentido reloj', + 'Rotate 90 CW' => 'Girado 90° sentido reloj', + }, + }, + 'AverageLevel' => 'Nivel Medio', + 'BToA0' => 'B a A0', + 'BToA1' => 'B a A1', + 'BToA2' => 'B a A2', + 'BackgroundColorIndicator' => 'Indicador Color Fondo', + 'BackgroundColorValue' => 'Valor Color Fondo', + 'BackgroundTiling' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'BadFaxLines' => 'Líneas Fax Malas', + 'BannerImageType' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'BaselineExposure' => 'Exposición Base', + 'BaselineNoise' => 'Ruido Base', + 'BaselineSharpness' => 'Nitidez Base', + 'BatteryLevel' => 'Nivel Batería', + 'BatteryState' => { + PrintConv => { + 'Low' => 'Bajo', + }, + }, + 'BayerGreenSplit' => 'Mosaico Bayer Verde', + 'Beep' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'BeepPitch' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + }, + }, + 'BestQualityScale' => 'Escala Mayor Calidad', + 'BestShotMode' => { + PrintConv => { + 'Beach' => 'Playa', + 'Fireworks' => 'Fuegos Artificiales', + 'Food' => 'Comida', + 'Monochrome' => 'Monocromo', + 'Portrait' => 'Retrato', + 'Snow' => 'Nieve', + 'Underwater' => 'Subacuatica', + }, + }, + 'BitsPerComponent' => 'Bits Por Componente', + 'BitsPerExtendedRunLength' => 'Bits Por "Run Length" Extendido', + 'BitsPerRunLength' => 'Bits Por "Run Length"', + 'BitsPerSample' => 'Número de Bits Por Muestra', + 'BlackLevel' => 'Nivel Negro', + 'BlackLevelDeltaH' => 'Nivel Negro Delta H', + 'BlackLevelDeltaV' => 'Nivel Negro Delta V', + 'BlackLevelRepeatDim' => 'Dimensión Repetición Nivel Negro', + 'BleachBypassToning' => { + PrintConv => { + 'Green' => 'Verde', + 'Orange' => 'Naranja', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'BlocksPerFrame' => 'Bloques por Imagen', + 'BlueBalance' => 'Balance de azules', + 'BlueMatrixColumn' => 'Columna Matriz Azul', + 'BlueTRC' => 'Curva Reproducción Tono Azul', + 'BlurControl' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + }, + }, + 'BlurWarning' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'BodyFirmwareVersion' => 'Versión Firmware del cuerpo de la cámara', + 'BracketMode' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'Brightness' => 'Brillo', + 'BrightnessValue' => 'Luminosidad', + 'By-line' => 'Creador', + 'By-lineTitle' => 'Puesto del Creador', + 'CFALayout' => { + Description => 'Distribución CFA', + PrintConv => { + 'Even columns offset down 1/2 row' => 'Distribución escalonada A: columnas pares son movidas hacia abajo 1/2 fila', + 'Even columns offset up 1/2 row' => 'Distribución escalonada B: columnas pares son movidas hacia arriba 1/2 fila', + 'Even rows offset left 1/2 column' => 'Distribución escalonada D: filas pares son movidas a la izquierda 1/2 columna', + 'Even rows offset right 1/2 column' => 'Distribución escalonada C: filas pares son movidas a la derecha 1/2 columna', + 'Rectangular' => 'Distribución Rectangular (o cuadrada)', + }, + }, + 'CFAPattern' => 'Patrón CFA', + 'CFAPattern2' => 'Patrón CFA 2', + 'CFAPlaneColor' => 'Color Plano CFA', + 'CFARepeatPatternDim' => 'Dimensión Patrón Repetición CFA', + 'CMMFlags' => 'Banderas CMM', + 'CMYKEquivalent' => 'CMYK Equivalente', + 'CPUType' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'CalibrationDateTime' => 'Fecha y Hora Calibración', + 'CalibrationIlluminant1' => { + Description => 'Calibración Iluminación 1', + PrintConv => { + 'Cloudy' => 'Tiempo Nublado', + 'Cool White Fluorescent' => 'Fluorescente blanco cálido (W 3800 - 4500K)', + 'Day White Fluorescent' => 'Fluorescente blanco día (N 4600 - 5500K)', + 'Daylight' => 'Luz del día', + 'Daylight Fluorescent' => 'Fluorescente luz de día (D 5700 - 7100K)', + 'Fine Weather' => 'Buen tiempo', + 'Fluorescent' => 'Fluorescente', + 'ISO Studio Tungsten' => 'Tungsteno estudio ISO', + 'Other' => 'Otras Fuentes Luz', + 'Shade' => 'Sombrío', + 'Standard Light A' => 'Luz Estándar A', + 'Standard Light B' => 'Luz Estándar B', + 'Standard Light C' => 'Luz Estándar C', + 'Tungsten (Incandescent)' => 'Tungsteno (luz incandescente)', + 'Unknown' => 'Desconocido', + 'Warm White Fluorescent' => 'Fluorescente blanco cálido (L 2600 - 3250K)', + 'White Fluorescent' => 'Fluorescente blanco (WW 3250 - 3800K)', + }, + }, + 'CalibrationIlluminant2' => { + Description => 'Calibración Iluminación 2', + PrintConv => { + 'Cloudy' => 'Tiempo Nublado', + 'Cool White Fluorescent' => 'Fluorescente blanco cálido (W 3800 - 4500K)', + 'Day White Fluorescent' => 'Fluorescente blanco día (N 4600 - 5500K)', + 'Daylight' => 'Luz del día', + 'Daylight Fluorescent' => 'Fluorescente luz de día (D 5700 - 7100K)', + 'Fine Weather' => 'Buen tiempo', + 'Fluorescent' => 'Fluorescente', + 'ISO Studio Tungsten' => 'Tungsteno estudio ISO', + 'Other' => 'Otras Fuentes Luz', + 'Shade' => 'Sombrío', + 'Standard Light A' => 'Luz Estándar A', + 'Standard Light B' => 'Luz Estándar B', + 'Standard Light C' => 'Luz Estándar C', + 'Tungsten (Incandescent)' => 'Tungsteno (luz incandescente)', + 'Unknown' => 'Desconocido', + 'Warm White Fluorescent' => 'Fluorescente blanco cálido (L 2600 - 3250K)', + 'White Fluorescent' => 'Fluorescente blanco (WW 3250 - 3800K)', + }, + }, + 'CameraCalibration1' => 'Calibración Cámara 1', + 'CameraCalibration2' => 'Calibración Cámara 2', + 'CameraCalibrationSig' => 'Firma Calibración Cámara', + 'CameraISO' => 'Camara-ISO', + 'CameraOrientation' => { + Description => 'Orientación Cámara', + PrintConv => { + 'Rotate 270 CW' => 'Girado 270° sentido reloj', + 'Rotate 90 CW' => 'Girado 90° sentido reloj', + }, + }, + 'CameraSerialNumber' => 'Número Serie Cámara', + 'CameraTemperature' => 'Temperatura Cámara', + 'CameraType' => 'Tipo Cámara', + 'CameraType2' => 'Tipo Cámara', + 'CanonFileLength' => 'Tamaño Archivo', + 'CanonFlashMode' => { + PrintConv => { + 'Auto' => 'Automático', + 'External flash' => 'Flash Externo', + 'Off' => 'Desactivado', + 'On' => 'Activado', + 'Red-eye reduction' => 'Réducción ojos rojos', + 'Red-eye reduction (Auto)' => 'Réducción ojos rojos (Automático)', + 'Red-eye reduction (On)' => 'Réducción ojos rojos (Activado)', + }, + }, + 'CanonImageSize' => { + PrintConv => { + '1280x720 Movie' => 'Película 1280x720', + '1920x1080 Movie' => 'Película 1920x1080', + '640x480 Movie' => 'Película 640x480', + 'Large' => 'Ancho', + 'Medium' => 'Medio', + 'Medium 1' => 'Medio 1', + 'Medium 2' => 'Medio 2', + 'Medium 3' => 'Medio 3', + 'Small' => 'Pequeño', + 'Small 1' => 'Pequeño 1', + 'Small 2' => 'Pequeño 2', + 'Small 3' => 'Pequeño 3', + 'Small Movie' => 'Película Pequeña', + }, + }, + 'Caption-Abstract' => 'Título/Descripción', + 'CaptionWriter' => 'Autor del Pie de Foto', + 'Categories' => 'Categorías', + 'Category' => 'Categoría', + 'CellLength' => 'Alto Celda', + 'CellWidth' => 'Ancho Celda', + 'Certificate' => 'Certificado', + 'Channels' => 'Canales', + 'CharTarget' => 'Objetivo Caracter', + 'CharacterSet' => 'Conjunto de Caracteres', + 'ChromaBlurRadius' => 'Radio Mezcla Croma', + 'ChromaticAdaptation' => 'Adaptación Cromática', + 'Chromaticity' => 'Cromaticidad', + 'ChrominanceNR_TIFF_JPEG' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Off' => 'Desactivado', + }, + }, + 'ChrominanceNoiseReduction' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Off' => 'Desactivado', + }, + }, + 'City' => 'Ciudad', + 'ClassifyState' => 'Clasificar Estado', + 'CleanFaxData' => 'Datos Fax Claro', + 'ClipPath' => 'Camino Fragmento', + 'CodedCharacterSet' => 'Juego Caracteres Codificado', + 'ColorAberrationControl' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ColorAdjustment' => 'Ajuste Color', + 'ColorAdjustmentMode' => { + Description => 'Modo Ajuste Color', + PrintConv => { + 'Off' => 'Apagado', + 'On' => 'Encendido', + }, + }, + 'ColorBalanceAdj' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ColorBooster' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ColorCalibrationMatrix' => 'Tabla Matriz Calibración Color', + 'ColorCharacterization' => 'Caracterización Color', + 'ColorComponents' => 'Componentes de Color', + 'ColorEffect' => { + PrintConv => { + 'Cool' => 'Frío', + 'Warm' => 'Cálido', + }, + }, + 'ColorFilter' => { + Description => 'Filtro de Color', + PrintConv => { + 'Green' => 'Verde', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'ColorMap' => 'Mapa Color', + 'ColorMatrix' => 'Matriz de Color', + 'ColorMatrix1' => 'Matriz Color 1', + 'ColorMatrix2' => 'Matriz Color 2', + 'ColorMatrixA' => 'Matriz de Color A', + 'ColorMatrixAdobeRGB' => 'Matriz de Color Adobe RGB', + 'ColorMatrixB' => 'Matriz de Color B', + 'ColorMatrixNumber' => 'Número de Matriz de Color', + 'ColorMatrixSRGB' => 'Matriz de Color SRGB', + 'ColorMode' => { + Description => 'Modo de Color', + PrintConv => { + 'Autumn Leaves' => 'Hojas de otoño', + 'B&W' => 'ByN', + 'Clear' => 'Claro', + 'Deep' => 'Profundo', + 'Evening' => 'Tarde', + 'Landscape' => 'Paisaje', + 'Light' => 'Luz', + 'Neutral' => 'Neutro', + 'Night View' => 'Vista nocturna', + 'Night View/Portrait' => 'Retrato noct.', + 'Portrait' => 'Retrato', + 'Standard' => 'Estándar', + 'Sunset' => 'Puesta sol', + 'Vivid' => 'Vívido', + }, + }, + 'ColorMoireReduction' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ColorMoireReductionMode' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Off' => 'Desactivado', + }, + }, + 'ColorPalette' => 'Paleta Color', + 'ColorRepresentation' => { + Description => 'Representación Color', + PrintConv => { + '3 Components, Frame Sequential in Multiple Objects' => 'Tres componentes, Marco secuencial en múltiples objectos', + '3 Components, Frame Sequential in One Object' => 'Tres componentes, Marco secuencial en un único objeto', + '3 Components, Line Sequential' => 'Tres componentes, Línea secuencial', + '3 Components, Pixel Sequential' => 'Tres componentes, Pixel secuencial', + '3 Components, Single Frame' => 'Tres componentes, Marco simple', + '3 Components, Special Interleaving' => 'Tres componentes, Entrelazado especial', + '4 Components, Frame Sequential in Multiple Objects' => 'Cuatro componentes, Marco secuencial en múltiples objectos', + '4 Components, Frame Sequential in One Object' => 'Cuatro componentes, Marco secuencial en un único objeto', + '4 Components, Line Sequential' => 'Cuatro componentes, Línea secuencial', + '4 Components, Pixel Sequential' => 'Cuatro componentes, Pixel secuencial', + '4 Components, Single Frame' => 'Cuatro componentes, Marco simple', + '4 Components, Special Interleaving' => 'Cuatro componentes, Entrelazado especial', + 'Monochrome, Single Frame' => 'Monocromo, Marco simple', + 'No Image, Single Frame' => 'Sin imagen, Marco simple', + }, + }, + 'ColorResponseUnit' => 'Unidad Respuesta Color', + 'ColorSequence' => 'Representación de Color', + 'ColorSpace' => { + Description => 'Espacio Color', + PrintConv => { + 'ICC Profile' => 'Perfil ICC', + 'Monochrome' => 'Monocromo', + 'Uncalibrated' => 'Sin calibrar', + 'Wide Gamut RGB' => 'Gamut RVB Grande', + }, + }, + 'ColorSpaceData' => 'Espacio Color Datos', + 'ColorTable' => 'Tabla Color', + 'ColorTempAuto' => 'Temperatura Color Automática', + 'ColorTempCloudy' => 'Temperatura Color Nublado', + 'ColorTempCustom' => 'Temperatura Color Personalizada', + 'ColorTempCustom1' => 'Temperatura Color Personalizada 1', + 'ColorTempCustom2' => 'Temperatura Color Personalizada 2', + 'ColorTempDaylight' => 'Temperatura Color Luz de Día', + 'ColorTempFlash' => 'Temperatura Color Flash', + 'ColorTempFluorescent' => 'Temperatura Color Fluorescente', + 'ColorTempKelvin' => 'Temperatura Color Kelvin', + 'ColorTempMeasured' => 'Temperatura Color Medida', + 'ColorTempShade' => 'Temperatura Color Sombrío', + 'ColorTempTungsten' => 'Temperatura Color Tungsteno', + 'ColorTempUnknown' => 'Temperatura de Color Desconocida', + 'ColorTempUnknown10' => 'Temperatura de Color Desconocida 10', + 'ColorTempUnknown11' => 'Temperatura de Color Desconocida 11', + 'ColorTempUnknown12' => 'Temperatura de Color Desconocida 12', + 'ColorTempUnknown13' => 'Temperatura de Color Desconocida 13', + 'ColorTempUnknown14' => 'Temperatura de Color Desconocida 14', + 'ColorTempUnknown15' => 'Temperatura de Color Desconocida 15', + 'ColorTempUnknown16' => 'Temperatura de Color Desconocida 16', + 'ColorTempUnknown17' => 'Temperatura de Color Desconocida 17', + 'ColorTempUnknown18' => 'Temperatura de Color Desconocida 18', + 'ColorTempUnknown19' => 'Temperatura de Color Desconocida 19', + 'ColorTempUnknown2' => 'Temperatura de Color Desconocida 2', + 'ColorTempUnknown20' => 'Temperatura de Color Desconocida 20', + 'ColorTempUnknown3' => 'Temperatura de Color Desconocida 3', + 'ColorTempUnknown4' => 'Temperatura de Color Desconocida 4', + 'ColorTempUnknown5' => 'Temperatura de Color Desconocida 5', + 'ColorTempUnknown6' => 'Temperatura de Color Desconocida 6', + 'ColorTempUnknown7' => 'Temperatura de Color Desconocida 7', + 'ColorTempUnknown8' => 'Temperatura de Color Desconocida 8', + 'ColorTempUnknown9' => 'Temperatura de Color Desconocida 9', + 'ColorTemperature' => 'Temperatura de Color', + 'ColorTone' => { + Description => 'Tono de Color', + PrintConv => { + 'Normal' => 'Estándar', + }, + }, + 'ColorantOrder' => 'Orden Colorante', + 'ColorantTable' => 'Tabla Colorante', + 'ColorimetricReference' => 'Referencia Colorimétrica', + 'CommandDialsChangeMainSub' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'CommandDialsMenuAndPlayback' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'CommandDialsReverseRotation' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'CommanderGroupAMode' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'CommanderGroupBMode' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'CommanderInternalFlash' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'Comment' => 'Comentario', + 'Compatibility' => 'Compatibilidad', + 'Compilation' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'ComponentsConfiguration' => 'Configuración de Componentes', + 'Composer' => 'Compositor', + 'CompressedBitsPerPixel' => 'Modo Compresión Imagen', + 'CompressedSize' => 'Tamaño Comprimido', + 'Compression' => { + Description => 'Compresión', + PrintConv => { + 'JPEG' => 'Compresión JPEG', + 'JPEG (old-style)' => 'JPEG (estilo antiguo)', + 'Kodak DCR Compressed' => 'Compresión Kodak DCR', + 'Kodak KDC Compressed' => 'Compresión Kodak KDC', + 'Next' => 'Codificación NeXT 2-bit', + 'Nikon NEF Compressed' => 'Compresión Nikon NEF', + 'None' => 'Ninguno', + 'Pentax PEF Compressed' => 'Compresión Pentax PEF', + 'SGILog' => 'Codificación Log Luminancia SGI 32-bit', + 'SGILog24' => 'Codificación Log Luminancia SGI 24-bit', + 'Sony ARW Compressed' => 'Compresión Sony ARW', + 'Thunderscan' => 'Codificación ThunderScan 4-bit', + 'Uncompressed' => 'Sin comprimir', + }, + }, + 'CompressionFactor' => 'Factor de compresión', + 'CompressionLevel' => 'Nivel Compresión', + 'CompressionType' => { + Description => 'Tipo Compresión', + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'CompressorName' => 'Nombre Compresor', + 'Conductor' => 'Director', + 'Conductors' => 'Directores', + 'ConnectionSpaceIlluminant' => 'Iluminación Espacio Conexión', + 'ConsecutiveBadFaxLines' => 'Líneas Fax Malas Consecutivas', + 'Contact' => 'Contacto', + 'ContentLocationCode' => 'Código Localización Contenido', + 'ContentLocationName' => 'Nombre Localización Contenido', + 'ContinuousBracketing' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + }, + }, + 'ContinuousDrive' => { + PrintConv => { + 'Continuous' => 'Continuo', + 'Continuous, High' => 'Continuo, Alto', + 'Continuous, Low' => 'Continuo, Bajo', + 'Continuous, Speed Priority' => 'Continuo, Prioridad Velocidad', + 'Movie' => 'Película', + 'Single' => 'Simple', + }, + }, + 'Contrast' => { + Description => 'Contraste', + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Normal' => 'Estándar', + }, + }, + 'ContrastMode' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + }, + }, + 'ContrastSetting' => 'Ajustes de Contraste', + 'Copyright' => 'Copyright Perfil', + 'CopyrightNotice' => 'Aviso Copyright', + 'Country' => 'País', + 'Country-PrimaryLocationCode' => 'Código País ISO', + 'Country-PrimaryLocationName' => 'País', + 'CountryCode' => 'Código País', + 'CreateDate' => 'Fecha y Hora de Datos Digital', + 'CreationDate' => 'Fecha Creación', + 'CreativeStyle' => { + PrintConv => { + 'Autumn Leaves' => 'Hojas de otoño', + 'B&W' => 'ByN', + 'Clear' => 'Claro', + 'Deep' => 'Profundo', + 'Landscape' => 'Paisaje', + 'Light' => 'Luz', + 'Neutral' => 'Neutro', + 'Night View/Portrait' => 'Retrato noct.', + 'Portrait' => 'Retrato', + 'Standard' => 'Estándar', + 'Sunset' => 'Puesta sol', + 'Vivid' => 'Vívido', + }, + }, + 'CreativeStyleSetting' => { + PrintConv => { + 'Landscape' => 'Paisaje', + 'Portrait' => 'Retrato', + 'Standard' => 'Estándar', + 'Vivid' => 'Vívido', + }, + }, + 'Creator' => 'Creador', + 'CreatorAddress' => 'Creador - Dirección', + 'CreatorCity' => 'Creador - Ciudad', + 'CreatorContactInfo' => 'Contacto Creador', + 'CreatorCountry' => 'Creador - País', + 'CreatorPostalCode' => 'Creador - Código Postal', + 'CreatorRegion' => 'Creador - Estado/Provincia', + 'CreatorWorkEmail' => 'Creador - Email(s)', + 'CreatorWorkTelephone' => 'Creador - Teléfono(s)', + 'CreatorWorkURL' => 'Creador - Website(s)', + 'Credit' => 'Proveedor', + 'CropActive' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'CropHeight' => 'Recorte Altura', + 'CropLeft' => 'Recorte Izquierda', + 'CropTop' => 'Recorte Arriba', + 'CropWidth' => 'Recorte Anchura', + 'CroppedImageHeight' => 'Alto Imágen Recortada', + 'CroppedImageLeft' => 'Izquierda Imágen Recortada', + 'CroppedImageTop' => 'Superior Imágen Recortada', + 'CroppedImageWidth' => 'Ancho Imágen Recortada', + 'CurrentICCProfile' => 'Perfil ICC Actual', + 'CurrentPreProfileMatrix' => 'Matriz Pre Perfil Actual', + 'Curves' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'CustomRendered' => { + Description => 'Proceso Imagen Personalizado', + PrintConv => { + 'Custom' => 'Proceso personalizado', + 'Normal' => 'Proceso normal', + }, + }, + 'CustomSaturation' => 'Saturación personalizada', + 'D-LightingHQ' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'D-LightingHQSelected' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'D-LightingHS' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'DNGBackwardVersion' => 'Versión Antigua DNG', + 'DNGLensInfo' => 'Distancia Focal Mínima', + 'DNGVersion' => 'Versión DNG', + 'DOF' => 'Profundidad de campo', + 'Data' => 'Datos', + 'DataCompressionMethod' => 'Proveedor/Propietario Algoritmo Compresión Datos', + 'DataImprint' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'DataPackets' => ' Paquetes de Datos', + 'DataType' => 'Tipo Datos', + 'Date' => 'Fecha', + 'DateCreated' => 'Fecha Creación', + 'DateSent' => 'Fecha Envío', + 'DateStampMode' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'DateTimeDigitized' => 'Fecha y Hora Digital', + 'DateTimeOriginal' => 'Fecha y Hora de Datos Original', + 'DaylightSavings' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'DefaultBlackRender' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'DefaultCropOrigin' => 'Origen Corte Defecto', + 'DefaultCropSize' => 'Tamaño Corte Defecto', + 'DefaultScale' => 'Escala por Defecto', + 'DerivedFromMaskMarkers' => { + PrintConv => { + 'All' => 'Todo', + 'None' => 'Ninguno', + }, + }, + 'Description' => 'Descripción', + 'Destination' => 'Destino', + 'DestinationDST' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'DeviceAttributes' => 'Atributos Dispositivo', + 'DeviceManufacturer' => 'Fabricante Dispositivo', + 'DeviceMfgDesc' => 'Descripción Fabricante Dispositivo', + 'DeviceModel' => 'Modelo Dispositivo', + 'DeviceModelDesc' => 'Descripción Modelo Dispositivo', + 'DeviceSettingDescription' => 'Descripción Ajustes Dispositivo', + 'DigitalCreationDate' => 'Fecha Creación Digital', + 'DigitalCreationTime' => 'Hora Creación Digital', + 'DigitalFilter01' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter02' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter03' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter04' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter05' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter06' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter07' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter08' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter09' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter10' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter11' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter12' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter13' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter14' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter15' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter16' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter17' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter18' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter19' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalFilter20' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'DigitalSignature' => 'Firma Digital', + 'DigitalZoom' => { + Description => 'Zoom Digital', + PrintConv => { + 'None' => 'Ninguno', + 'Off' => 'Desactivado', + }, + }, + 'DigitalZoomOn' => { + Description => 'Zoom Digital Encendido', + PrintConv => { + 'Off' => 'Apagado', + 'On' => 'Encendido', + }, + }, + 'DigitalZoomRatio' => 'Ratio Zoom Digital', + 'Directory' => 'Ubicación del Fichero', + 'DistortionControl' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'DistortionCorrection' => { + Description => 'Corrección Distorsión', + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'DistortionCorrection2' => { + Description => 'Corrección Distorsión 2', + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'DistortionCorrectionOn' => 'Corrección Distorsión Activada', + 'DocSecurity' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'DocumentHistory' => 'Historial del Documento', + 'DocumentName' => 'Nombre Documento', + 'DocumentNotes' => 'Notas del Documento', + 'DotRange' => 'Intervalo Puntos', + 'DriveMode' => { + Description => 'Modo Entrada', + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'Duration' => 'Duración', + 'DynamicRange' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'DynamicRangeOptimizer' => { + Description => 'Optim.gama diná', + PrintConv => { + 'Advanced Auto' => 'Avanzado Autom', + 'Advanced Lv1' => 'Avanzado Nvl.1', + 'Advanced Lv2' => 'Avanzado Nvl.2', + 'Advanced Lv3' => 'Avanzado Nvl.3', + 'Advanced Lv4' => 'Avanzado Nvl.4', + 'Advanced Lv5' => 'Avanzado Nvl.5', + 'Off' => 'Desactivado', + 'Standard' => 'Estándar', + }, + }, + 'DynamicRangeOptimizerBracket' => { + PrintConv => { + 'Low' => 'Bajo', + }, + }, + 'DynamicRangeOptimizerMode' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'DynamicRangeOptimizerSetting' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'EasyExposureCompensation' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'EasyMode' => { + PrintConv => { + 'Beach' => 'Playa', + 'Black & White' => 'Blanco y Negro', + 'Digital Macro' => 'Macro digital', + 'Easy' => 'Fácil', + 'Fireworks' => 'Fuegos Artificiales', + 'Fisheye Effect' => 'Efecto Ojo de Pez', + 'Flash Off' => 'Flash Desactivado', + 'Foliage' => 'Follaje', + 'Gray Scale' => 'Escala de Grises', + 'Indoor' => 'Interior', + 'Kids & Pets' => 'Niños y Mascotas', + 'Landscape' => 'Paisaje', + 'Monochrome' => 'Monocromo', + 'Neutral' => 'Neutro', + 'Night' => 'Nocturno', + 'Night Scene' => 'Escena Nocturna', + 'Night Snapshot' => 'Fotografía Nocturna', + 'Nostalgic' => 'Nostalgico', + 'Portrait' => 'Retrato', + 'Smile' => 'Sonrisa', + 'Snow' => 'Nieve', + 'Sports' => 'Deportes', + 'Sunset' => 'Puesta de sol', + 'Surface' => 'Superficie', + 'Underwater' => 'Subacuatica', + 'Vivid' => 'Vívido', + }, + }, + 'EdgeNoiseReduction' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'EditStatus' => 'Estado Edición', + 'EditorialUpdate' => { + Description => 'Actualización Editorial', + PrintConv => { + 'Additional language' => 'Idioma Adicional', + }, + }, + 'EffectiveMaxAperture' => 'Aperture Máxima Efectiva', + 'Emphasis' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'EncodedBy' => 'Codificado por', + 'EncodingProcess' => 'Proceso de codificación', + 'EncodingSettings' => 'Ajustes de Codificación', + 'EncodingTime' => 'Hora de codificación', + 'EndPoints' => 'Puntos Finales', + 'EnhanceDarkTones' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'Enhancement' => { + PrintConv => { + 'Green' => 'Verde', + 'Red' => 'Rojo', + 'Underwater' => 'Subacuatica', + }, + }, + 'EnvelopeNumber' => 'Número Sobre', + 'EnvelopePriority' => { + Description => 'Prioridad Sobre', + PrintConv => { + '0 (reserved)' => '0 (reservada para uso futuro)', + '1 (most urgent)' => '1 (más urgente)', + '5 (normal urgency)' => '5 (urgencia normal)', + '8 (least urgent)' => '8 (menos urgente)', + '9 (user-defined priority)' => '9 (prioridad definida por el usuario)', + }, + }, + 'EnvelopeRecordVersion' => 'Versión Registro Sobre', + 'EquipmentVersion' => 'Versión Equipo', + 'ErrorCorrection' => 'Correción Error', + 'ErrorCorrectionType' => 'Tipo Corrección Error', + 'ExcursionTolerance' => { + Description => 'Tolerancia Excursión', + PrintConv => { + 'Allowed' => 'Puede ocurrir', + 'Not Allowed' => 'No Permitido (defecto)', + }, + }, + 'ExifCameraInfo' => 'Información Cámara Exif', + 'ExifImageHeight' => 'Alto Imagen', + 'ExifImageWidth' => 'Ancho Imagen', + 'ExifOffset' => 'Puntero Exif IFD', + 'ExifToolVersion' => 'Versión ExifTool', + 'ExifVersion' => 'Versión Exif', + 'ExpandFilm' => 'Película Expandida', + 'ExpandFilterLens' => 'Filtro Objetivo Expandida', + 'ExpandFlashLamp' => 'Lampara Flash Expandida', + 'ExpandLens' => 'Objetivo Expandido', + 'ExpandScanner' => 'Escaner Expandido', + 'ExpandSoftware' => 'Software Expandido', + 'ExpirationDate' => 'Fecha Expiración', + 'ExpirationTime' => 'Hora Expiración', + 'ExposureCompensation' => 'Compensación Exposición', + 'ExposureDelayMode' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ExposureIndex' => 'Ãndice Exposición', + 'ExposureMode' => { + Description => 'Modo Exposición', + PrintConv => { + 'Aperture-priority AE' => 'Prioridad Aberture AE', + 'Auto' => 'Exposición automática', + 'Auto bracket' => 'Auto-horquillado', + 'Beach' => 'Playa', + 'Fireworks' => 'Fuegos Artificiales', + 'Food' => 'Comida', + 'Landscape' => 'Paisaje', + 'Manual' => 'Exposición manual', + 'Panorama' => 'Panoramica', + 'Portrait' => 'Retrato', + 'Program AE' => 'Programa AE', + 'Shutter speed priority AE' => 'Prioridad velocidad obturador AE', + 'Snow' => 'Nieve', + 'Underwater' => 'Subacuatica', + }, + }, + 'ExposureProgram' => { + Description => 'Programa Exposición', + PrintConv => { + 'Action (High speed)' => 'Programa acción (orientado a velocidad de obturación rápida)', + 'Aperture-priority AE' => 'Prioridad Apertura', + 'Creative (Slow speed)' => 'Programa creativo (orientado a profundidad de campo)', + 'Landscape' => 'Modo paisaje (para fotos de paisaje con el fondo en enfoque)', + 'Manual' => 'Exposición manual', + 'Not Defined' => 'No definido', + 'Portrait' => 'Modo retrato (para fotos de cerca con el fondo fuera de enfoque)', + 'Program AE' => 'Programa normal', + 'Shutter speed priority AE' => 'Prioridad obturador', + }, + }, + 'ExposureTime' => 'Tiempo de Exposición', + 'ExposureTime2' => 'Tiempo de Exposición 2', + 'Extender' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'ExternalFlash' => { + Description => 'Flash Externo', + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ExternalFlashBounce' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'ExternalFlashMode' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'ExternalFlashZoom' => 'Zoom Flash Externo', + 'ExtraSamples' => 'Muestra Extra', + 'FNumber' => 'Número F', + 'FOV' => 'Angulo de Visión', + 'FaceDetectArea' => 'Area detección caras', + 'FaceDetectFrameSize' => 'Tamaño Area detección caras', + 'FaceOrientation' => { + PrintConv => { + 'Horizontal (normal)' => '0° (arriba/izquierda)', + 'Rotate 180' => 'Girado 180°', + 'Rotate 270 CW' => 'Girado 270° sentido reloj', + 'Rotate 90 CW' => 'Girado 90° sentido reloj', + }, + }, + 'FacesDetected' => 'Caras Detectadas', + 'FastSeek' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'FaxProfile' => { + PrintConv => { + 'Unknown' => 'Desconocido', + }, + }, + 'FaxRecvParams' => 'Parámetros Recepción Fax', + 'FaxRecvTime' => 'Hora Recepción Fax', + 'FaxSubAddress' => 'Subdirección Fax', + 'FileAccessDate' => 'Fecha y Hora de Acceso', + 'FileCreateDate' => 'Fecha y Hora de Creación', + 'FileFormat' => 'Formato Archivo', + 'FileLength' => 'Tamaño Archivo', + 'FileModifyDate' => 'Fecha Actualización', + 'FileName' => 'Nombre Archivo', + 'FileNumberMemory' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'FileNumberSequence' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'FileOwner' => 'Propietario del Archivo', + 'FilePermissions' => 'Permisos', + 'FileSize' => 'Tamaño Archivo', + 'FileSource' => { + Description => 'Fuente Archivo', + PrintConv => { + 'Digital Camera' => 'Cámara Digital', + 'Film Scanner' => 'Escaner Película', + 'Reflection Print Scanner' => 'Escaner de Reflexión', + }, + }, + 'FileType' => 'Tipo Archivo', + 'FileVersion' => 'Versión Formato Archivo', + 'Filename' => 'Nombre archivo', + 'FillOrder' => 'Orden Rellenado', + 'FilterEffect' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + 'Off' => 'Desactivado', + 'Orange' => 'Naranja', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'FilterEffectMonochrome' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + 'Orange' => 'Naranja', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'FilterEffectUnknown' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + 'Orange' => 'Naranja', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'FilterEffectUserDef1' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + 'Orange' => 'Naranja', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'FilterEffectUserDef2' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + 'Orange' => 'Naranja', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'FilterEffectUserDef3' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + 'Orange' => 'Naranja', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'FinderDisplayDuringExposure' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'FirmwareVersion' => 'Versión Firmware', + 'FixtureIdentifier' => 'Identificador Marca', + 'Flags' => { + PrintConv => { + 'Comment' => 'Comentario', + 'FileName' => 'Nombre de Archivo', + 'Text' => 'Texto', + }, + }, + 'Flash' => { + PrintConv => { + 'Auto, Did not fire' => 'Flash no disparado, modo automático', + 'Auto, Did not fire, Red-eye reduction' => 'Auto, Flash no disparado, modo reducción ojos rojos', + 'Auto, Fired' => 'Flash disparado, modo automático', + 'Auto, Fired, Red-eye reduction' => 'Flash disparado, modo automático, modo reducción ojos rojos', + 'Auto, Fired, Red-eye reduction, Return detected' => 'Flash disparado, modo automático, retorno luz detectado, modo reducción ojos rojos', + 'Auto, Fired, Red-eye reduction, Return not detected' => 'Flash disparado, modo automático, retorno luz no detectado, modo reducción ojos rojos', + 'Auto, Fired, Return detected' => 'Flash disparado, modo automático, retorno luz detectado', + 'Auto, Fired, Return not detected' => 'Flash disparado, modo automático, retorno luz no detectado', + 'Did not fire' => 'No se ha disparado el flash', + 'Fired' => 'Flash disparado', + 'Fired, Red-eye reduction' => 'Flash disparado, modo reducción ojos rojos', + 'Fired, Red-eye reduction, Return detected' => 'Flash disparado, modo reducción ojos rojos, retorno luz detectado', + 'Fired, Red-eye reduction, Return not detected' => 'Flash disparado, modo reducción ojos rojos, retorno luz no detectado', + 'Fired, Return detected' => 'Luz devuelta en captador detectada', + 'Fired, Return not detected' => 'Luz devuelta en captador no detectada', + 'No Flash' => 'Flash no disparado', + 'No flash function' => 'Sin función flash', + 'Off' => 'Desactivado', + 'Off, Did not fire' => 'Flash no disparado, modo flash forzado', + 'Off, Did not fire, Return not detected' => 'Apagado, flash no disparado, retorno luz no detectado', + 'Off, No flash function' => 'Apagado, sin función flash', + 'Off, Red-eye reduction' => 'Apagado, modo reducción ojos rojos', + 'On' => 'Activado', + 'On, Did not fire' => 'Encendido, flash no disparado', + 'On, Fired' => 'Flash disparado, modo flash forzardo', + 'On, Red-eye reduction' => 'Flash disparado, modo flash forzado, modo reducción ojos rojos', + 'On, Red-eye reduction, Return detected' => 'Flash disparado, modo flash forzado, modo reducción ojos rojos, retorno luz detectado', + 'On, Red-eye reduction, Return not detected' => 'Flash disparado, modo flash forzado, modo reducción ojos rojos, retorno luz no detectado', + 'On, Return detected' => 'Flash disparado, modo flash forzado, retorno luz detectado', + 'On, Return not detected' => 'Flash disparado, modo flash forzado, retorno luz no detectado', + }, + }, + 'FlashColorFilter' => { + PrintConv => { + 'None' => 'Ninguno', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'FlashCommanderMode' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'FlashControlMode' => { + Description => 'Modo Control Flash', + PrintConv => { + 'Off' => 'Desactivado', + 'Repeating Flash' => 'Flash Estroboscopico', + }, + }, + 'FlashDevice' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'FlashEnergy' => 'Energía Flash', + 'FlashExposureComp' => 'Compensación Exposición Flash', + 'FlashExposureLock' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'FlashFired' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'FlashFocalLength' => 'Longitud Flash Flash', + 'FlashGroupAControlMode' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'FlashGroupBControlMode' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'FlashGroupCControlMode' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'FlashIntensity' => { + Description => 'Intensidad Flash', + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + }, + }, + 'FlashLevel' => { + PrintConv => { + 'Low' => 'Bajo', + }, + }, + 'FlashMeteringMode' => { + PrintConv => { + 'External Auto' => 'Externo Automatico', + 'External Manual' => 'Externo Manual', + 'Off' => 'Desactivado', + }, + }, + 'FlashMode' => { + Description => 'Modo Flash', + PrintConv => { + 'Auto' => 'Automático', + 'Disabled' => 'Desactivado', + 'Force' => 'Forzado', + 'Off' => 'Apagado', + 'On' => 'Encendido', + 'Red eye' => 'Ojos rojos', + }, + }, + 'FlashModel' => { + Description => 'Modelo Flash', + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'FlashOutput' => 'Flash Salida', + 'FlashRemoteControl' => 'Control Remote Flash', + 'FlashSerialNumber' => 'Número Serie Flash', + 'FlashSource' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'FlashStatus' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'FlashType' => { + Description => 'Tipo Flash', + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'FlashWarning' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'FlashpixVersion' => 'Versión Flashpix Soportado', + 'FlickerReduce' => { + Description => 'Reducir Parpadeo', + PrintConv => { + 'Off' => 'Apagado', + 'On' => 'Encendido', + }, + }, + 'FlipHorizontal' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'FocalLength' => 'Distancia Focal Objetivo', + 'FocalLength35efl' => 'Longitud Focal (Conversión a 35 mm)', + 'FocalLengthIn35mmFormat' => 'Distancia Focal en Película de 35 mm', + 'FocalPlaneResolutionUnit' => { + Description => 'Unidad Resolución Plano Focal', + PrintConv => { + 'None' => 'Ninguno', + 'inches' => 'Pulgada', + 'um' => 'µm (Micrometro)', + }, + }, + 'FocalPlaneXResolution' => 'Resolución X Plano Focal', + 'FocalPlaneYResolution' => 'Resolución Y Plano Focal', + 'FocusContinuous' => { + PrintConv => { + 'Continuous' => 'Continuo', + 'Single' => 'Sencillo', + }, + }, + 'FocusMode' => { + Description => 'Modo Enfoque', + PrintConv => { + 'Continuous' => 'Continuo', + 'Manual Focus (3)' => 'Enfoque Manual (6)', + 'Manual Focus (6)' => 'Enfoque Manual (6)', + 'Single' => 'Simple', + }, + }, + 'FocusRange' => { + Description => 'Rango de Enfoque', + PrintConv => { + 'Close' => 'Próximo', + 'Infinity' => 'Infinito', + 'Not Known' => 'Desconocido', + 'Very Close' => 'Muy Próximo', + }, + }, + 'FocusSetting' => 'Ajuste Enfoque', + 'FocusTrackingLockOn' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'ForwardMatrix1' => 'Matriz Avance 1', + 'ForwardMatrix2' => 'Matriz Avance 2', + 'FrameRate' => 'Velocidad del Fotograma', + 'FrameSize' => 'Tamaño del Fotograma', + 'FreeByteCounts' => 'Número Bytes Libres', + 'FreeOffsets' => 'Offsets Libres', + 'FuncButton' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'FuncButtonPlusDials' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'GEModel' => 'Modelo', + 'GPSAltitude' => 'Altitud', + 'GPSAltitudeRef' => { + Description => 'Referencia Altitud', + PrintConv => { + 'Above Sea Level' => 'Nivel del Mar', + 'Below Sea Level' => 'Referencia Nivel del Mar (valor negativo)', + }, + }, + 'GPSAreaInformation' => 'Nombre de Zona GPS', + 'GPSDOP' => 'Precisión Medición', + 'GPSDateStamp' => 'Fecha GPS', + 'GPSDateTime' => 'Fecha y Hora GPS', + 'GPSDestBearing' => 'Orientación de Destino', + 'GPSDestBearingRef' => { + Description => 'Referencia para Orientación de Destino', + PrintConv => { + 'Magnetic North' => 'Dirección magnética', + 'True North' => 'Dirección real', + }, + }, + 'GPSDestDistance' => 'Distancia a Destino', + 'GPSDestDistanceRef' => { + Description => 'Referencia para Distancia a Destino', + PrintConv => { + 'Kilometers' => 'Kilómetros', + 'Miles' => 'Millas', + 'Nautical Miles' => 'Nudos', + }, + }, + 'GPSDestLatitude' => 'Latitud de Destino', + 'GPSDestLatitudeRef' => { + Description => 'Referencia para Latitud de Destino', + PrintConv => { + 'North' => 'Latitud norte', + 'South' => 'Latitud sur', + }, + }, + 'GPSDestLongitude' => 'Longitud de Destino', + 'GPSDestLongitudeRef' => { + Description => 'Referencia para Longitud de Destino', + PrintConv => { + 'East' => 'Longitud este', + 'West' => 'Longitud oeste', + }, + }, + 'GPSDifferential' => { + Description => 'Corrección Diferencial GPS', + PrintConv => { + 'Differential Corrected' => 'Corrección diferencial aplicada', + 'No Correction' => 'Medición sin corrección diferencial', + }, + }, + 'GPSImgDirection' => 'Dirección de Imagen', + 'GPSImgDirectionRef' => { + Description => 'Referencia para Dirección de Imagen', + PrintConv => { + 'Magnetic North' => 'Dirección magnética', + 'True North' => 'Dirección real', + }, + }, + 'GPSInfo' => 'Puntero IFD de Información GPS', + 'GPSLatitude' => 'Latitud', + 'GPSLatitudeRef' => { + Description => 'Latitud Norte o Sur', + PrintConv => { + 'North' => 'Latitud norte', + 'South' => 'Latitud sur', + }, + }, + 'GPSLongitude' => 'Longitud', + 'GPSLongitudeRef' => { + Description => 'Longitud Este u Oeste', + PrintConv => { + 'East' => 'Longitud Este', + 'West' => 'Longitud Oeste', + }, + }, + 'GPSMapDatum' => 'Dato Medición Geodésica Usado', + 'GPSMeasureMode' => { + Description => 'Modo Medición GPS', + PrintConv => { + '2-Dimensional Measurement' => 'Medición bidimensional', + '3-Dimensional Measurement' => 'Medición tridimensional', + }, + }, + 'GPSProcessingMethod' => 'Nombre del Método de Procesado GPS', + 'GPSSatellites' => 'Satélites GPS Usados para Medida', + 'GPSSpeed' => 'Velocidad del Receptor GPS', + 'GPSSpeedRef' => { + Description => 'Unidad Velocidad', + PrintConv => { + 'km/h' => 'Kilómetros por hora', + 'knots' => 'Nudos', + 'mph' => 'Millas por hora', + }, + }, + 'GPSStatus' => { + Description => 'Estado Receptor GPS', + PrintConv => { + 'Measurement Active' => 'Medición Activa', + 'Measurement Void' => 'Medición Vacía', + }, + }, + 'GPSTimeStamp' => 'Hora GPS (reloj atómico)', + 'GPSTrack' => 'Dirección de Movimiento', + 'GPSTrackRef' => { + Description => 'Referencia de Dirección de Movimiento', + PrintConv => { + 'Magnetic North' => 'Dirección magnética', + 'True North' => 'Dirección real', + }, + }, + 'GPSVersionID' => 'Versión Etiqueta GPS', + 'GainControl' => { + Description => 'Control Ganancia', + PrintConv => { + 'High gain down' => 'Atenuación alta', + 'High gain up' => 'Ganancia alta', + 'Low gain down' => 'Atenuación baja', + 'Low gain up' => 'Ganancia debil', + 'None' => 'Ninguno', + }, + }, + 'GammaCompensatedValue' => 'Valor Compensado Gamma', + 'Gapless' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'Genre' => { + Description => 'Género', + PrintConv => { + 'None' => 'Ninguno', + 'Other' => 'Otro', + }, + }, + 'GenreID' => 'ID Género', + 'GeoTiffAsciiParams' => 'Etiqueta Parámetros Ascii Geo', + 'GeoTiffDirectory' => 'Etiqueta Directorio Clave Geo', + 'GeoTiffDoubleParams' => 'Etiqueta Parámetros Doble Geo', + 'Gradation' => 'Luminosidad', + 'GrayResponseCurve' => 'Curva Respuesta Gris', + 'GrayResponseUnit' => { + Description => 'Unidad Respuesta Gris', + PrintConv => { + '0.0001' => 'Número representa la milésima de una unidad', + '0.001' => 'Número representa la centésima de una unidad', + '0.1' => 'Número representa la décima de una unidad', + '1e-05' => 'Número representa la diezmilésima de una unidad', + '1e-06' => 'Número representa la cienmilésima de una unidad', + }, + }, + 'GrayTRC' => 'Columna Matriz Gris', + 'GreenMatrixColumn' => 'Columna Matriz Verde', + 'GreenTRC' => 'Curva Reproducción Tono Verde', + 'GridDisplay' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'HCUsage' => 'Uso HC', + 'HDR' => { + Description => 'Auto HDR', + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'HDRSmoothing' => { + PrintConv => { + 'Low' => 'Bajo', + 'Off' => 'Desactivado', + }, + }, + 'HalftoneHints' => 'Indicación Medio Tono', + 'HasAttachedImages' => 'Tiene Imagenes Adjuntas', + 'HasAudio' => 'Tiene Audio', + 'HasImage' => 'Tiene Imagen', + 'HasScript' => 'Tiene Script', + 'HasVideo' => 'Tiene Video', + 'Headline' => 'Titular', + 'HeightResolution' => 'Resolución Imagen Vertical', + 'HighISONoiseReduction' => { + Description => 'Reducción Ruido ISO Alta', + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Off' => 'Desactivado', + 'On' => 'Activado', + 'Standard' => 'Estándar', + 'Strong' => 'Fuerte', + }, + }, + 'HighISONoiseReduction2' => { + PrintConv => { + 'Low' => 'Bajo', + }, + }, + 'Highlight' => 'Realce', + 'HighlightColorDistortReduct' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'HighlightTonePriority' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'HometownDST' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'HostComputer' => 'Ordenador Principal', + 'Hue' => { + Description => 'Tono', + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'HyperfocalDistance' => 'Distancia Hiperfocal', + 'ICCProfile' => 'Perfil ICC', + 'ICC_Profile' => 'Perfil Color Entrada ICC', + 'IDCCreativeStyle' => { + PrintConv => { + 'Landscape' => 'Retrato', + 'Neutral' => 'Neutro', + 'Standard' => 'Estándar', + 'Vivid' => 'Vívido', + }, + }, + 'IPTC-NAA' => 'Metadato IPTC-NAA', + 'IPTCBitsPerSample' => 'Número de Bits por Muestra', + 'IPTCImageHeight' => 'Número de Líneas', + 'IPTCImageRotation' => { + Description => 'Rotación Imagen', + PrintConv => { + '0' => 'Sin rotación', + '180' => 'Rotación 180 grados', + '270' => 'Rotación 270 grados', + '90' => 'Rotación 90 grados', + }, + }, + 'IPTCImageWidth' => 'Pixels por Línea', + 'IPTCPictureNumber' => 'Número Imagen', + 'IPTCPixelHeight' => 'Tamaño Pixel Perpendicular a Dirección Escaneo', + 'IPTCPixelWidth' => 'Tamaño Pixel en Dirección Escaneo', + 'ISO' => 'Ratio Velocidad ISO', + 'ISOAutoParameters' => { + PrintConv => { + 'Fast' => 'Rápido', + 'Standard' => 'Estándar', + }, + }, + 'ISOExpansion' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'ISOExpansion2' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'ISOSetting' => 'Ajuste ISO', + 'ISOSpeedExpansion' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'IT8Header' => 'Cabecera IT8', + 'Illumination' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'Image::ExifTool::AIFF::Comment' => 'Comentario AIFF', + 'ImageAuthentication' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'ImageByteCount' => 'Número Byte Imagen', + 'ImageColor' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'ImageColorIndicator' => 'Indicador Color Imagen', + 'ImageColorValue' => 'Valor Color Imagen', + 'ImageDataDiscard' => { + Description => 'Datos Imagen Descartado', + PrintConv => { + 'Flexbits Discarded' => 'FlexBits Descartados', + 'Full Resolution' => 'Resolución Total', + 'HighPass Frequency Data Discarded' => 'Datos Frecuencia High-Pass Descartados', + 'Highpass and LowPass Frequency Data Discarded' => 'Dato Frecuencia High-Pass y Low-Pass Descartados', + }, + }, + 'ImageDepth' => 'Ancho Imagen', + 'ImageDescription' => 'Título Imagen', + 'ImageDustOff' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ImageEditing' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'ImageFileFormatAsDelivered' => { + PrintConv => { + 'Other' => 'Otro', + }, + }, + 'ImageHeight' => 'Alto Imagen', + 'ImageHistory' => 'Historia Imagen', + 'ImageID' => 'ID Imagen', + 'ImageInfo' => 'Info Imagen', + 'ImageLayer' => 'Capa Imagen', + 'ImageLength' => 'Longitud Imagen', + 'ImageNumber' => 'Número Imagen', + 'ImageOffset' => 'Offset Imagen', + 'ImageOrientation' => { + Description => 'Orientación Imagen', + PrintConv => { + 'Landscape' => 'Paisaje', + 'Portrait' => 'Retrato', + 'Square' => 'Cuadro', + }, + }, + 'ImageQuality' => { + PrintConv => { + 'High' => 'Alto', + 'Standard' => 'Estándar', + }, + }, + 'ImageResourceBlocks' => 'Bloques Recursos Imagen', + 'ImageReview' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ImageRotated' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'ImageRotation' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'ImageSize' => 'Tamaño de la Imagen', + 'ImageSourceData' => 'Datos Fuente Imagen', + 'ImageStabilization' => { + Description => 'Estabilización Imagen', + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ImageStabilizationSetting' => 'Ajustes Estabilización Imagen', + 'ImageStyle' => { + PrintConv => { + 'Landscape' => 'Paisaje', + 'Neutral' => 'Neutro', + 'Portrait' => 'Retrato', + 'Standard' => 'Estándar', + 'Vivid' => 'Vívido', + }, + }, + 'ImageTone' => { + PrintConv => { + 'Landscape' => 'Paisaje', + 'Monochrome' => 'Monocromo', + 'Portrait' => 'Retrato', + }, + }, + 'ImageType' => { + Description => 'Tipo Imagen', + PrintConv => { + 'Other' => 'Otro', + }, + }, + 'ImageUniqueID' => 'ID Único Imagen', + 'ImageWidth' => 'Ancho Imagen', + 'Index' => 'Ãndice', + 'Indexed' => 'Indizado', + 'IngredientsMaskMarkers' => { + PrintConv => { + 'All' => 'Todo', + 'None' => 'Ninguno', + }, + }, + 'InitialKey' => 'Clave inicial', + 'InkNames' => 'Nombres Tinta', + 'InkSet' => 'Conjunto Tinta', + 'Instructions' => 'Instrucciones', + 'IntellectualGenre' => 'Género Intelectual', + 'IntelligentContrast' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + 'n/a' => 'No Aplica', + }, + }, + 'IntelligentD-Range' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Standard' => 'Estándar', + }, + }, + 'IntelligentExposure' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Standard' => 'Estándar', + }, + }, + 'IntelligentResolution' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Standard' => 'Estándar', + }, + }, + 'IntensityStereo' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'InterchangeColorSpace' => { + PrintConv => { + 'CMY (K) Device Dependent' => 'Dispositivo dependiente CMY(K)', + 'RGB Device Dependent' => 'Dispositivo dependiente RGB', + }, + }, + 'IntergraphMatrix' => 'Etiqueta Matriz Intergráfica', + 'Interlace' => 'Entrelazado', + 'InternalFlash' => 'Flash Interno', + 'InternalFlashAE1' => 'Flash Interno AE1', + 'InternalFlashAE1_0' => 'Flash Interno', + 'InternalFlashAE2' => 'Flash Interno AE2', + 'InternalFlashAE2_0' => 'Flash Interno AE2', + 'InternalFlashMode' => { + Description => 'Modo Flash Interno', + PrintConv => { + 'Fired' => 'Activado', + }, + }, + 'InternalFlashTable' => 'Tabla Flash Interno', + 'InternalSerialNumber' => 'Número Serie Interno', + 'InteropIndex' => { + Description => 'Identificación Interoperabilidad', + PrintConv => { + 'R03 - DCF option file (Adobe RGB)' => 'R03: Archivo opción DCF (Adobe RGB)', + 'R98 - DCF basic file (sRGB)' => 'R98: Archivo básico DCF (sRGB)', + 'THM - DCF thumbnail file' => 'THM: Archivo miniatura DCF', + }, + }, + 'InteropOffset' => 'Etiqueta de Interoperabilidad', + 'InteropVersion' => 'Versión Interoperabilidad', + 'Is_Protected' => 'Está protegido', + 'Is_Trusted' => 'Es de confianza', + 'JFIFVersion' => 'Versión JFIF', + 'JPEGACTables' => 'Tablas AC JPEG', + 'JPEGDCTables' => 'Tablas DC JPEG', + 'JPEGLosslessPredictors' => 'Predictores Sin Perdidas JPEG', + 'JPEGPointTransforms' => 'Tranformadores Puntos JPEG', + 'JPEGProc' => 'Proc JPEG', + 'JPEGQTables' => 'Tablas Q JPEG', + 'JPEGQuality' => { + Description => 'Calidad', + PrintConv => { + 'Extra Fine' => 'Extrafina', + 'Fine' => 'Fina', + 'Standard' => 'Calidad estándar', + }, + }, + 'JPEGRestartInterval' => 'Intervalo Reinicio JPEG', + 'JPEGTables' => 'Tablas JPEG', + 'JobID' => 'ID del Trabajo', + 'JobTitle' => 'Cargo', + 'Keyword' => 'Palabras Clave', + 'Keywords' => 'Clave', + 'LCDIllumination' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'LCDIlluminationDuringBulb' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'LCHEditor' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'Language' => 'Idioma', + 'LanguageCode' => { + PrintConv => { + 'Neutral' => 'Neutro', + }, + }, + 'LanguageIdentifier' => 'Identificador Idioma', + 'LanguageList' => 'Lista de Idiomas', + 'LeafData' => 'Datos Hoja', + 'Lens' => 'Objetivo', + 'LensApertureRange' => 'Intervalo Apertura Objetivo', + 'LensFirmwareVersion' => 'Versión Firmware Objetivo', + 'LensID' => 'ID Objetivo', + 'LensIDNumber' => 'Número ID Objetivo', + 'LensInfo' => 'Información del Objetivo', + 'LensModel' => 'Modelo Objetivo', + 'LensProperties' => 'Propiedades Objetivo', + 'LensSerialNumber' => 'Número Serie Objetivo', + 'LensType' => { + Description => 'Tipo Objetivo', + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'LightSource' => { + Description => 'Fuente Luz', + PrintConv => { + 'Cloudy' => 'Tiempo Nublado', + 'Cool White Fluorescent' => 'Fluorescente blanco cálido (W 3800 - 4500K)', + 'Day White Fluorescent' => 'Fluorescente blanco día (N 4600 - 5500K)', + 'Daylight' => 'Luz del día', + 'Daylight Fluorescent' => 'Fluorescente luz de día (D 5700 - 7100K)', + 'Fine Weather' => 'Buen tiempo', + 'Fluorescent' => 'Fluorescente', + 'ISO Studio Tungsten' => 'Tungsteno estudio ISO', + 'Other' => 'Otras Fuentes Luz', + 'Shade' => 'Sombrío', + 'Standard Light A' => 'Luz Estándar A', + 'Standard Light B' => 'Luz Estándar B', + 'Standard Light C' => 'Luz Estándar C', + 'Tungsten (Incandescent)' => 'Tungsteno (luz incandescente)', + 'Unknown' => 'Desconocido', + 'Warm White Fluorescent' => 'Fluorescente blanco cálido (L 2600 - 3250K)', + 'White Fluorescent' => 'Fluorescente blanco (WW 3250 - 3800K)', + }, + }, + 'LightSourceSpecial' => { + Description => 'Fuente Luz Especial', + PrintConv => { + 'Off' => 'Apagado', + 'On' => 'Encendido', + }, + }, + 'Lightness' => 'Luminosidad', + 'LinearResponseLimit' => 'Límite Respuesta Lineal', + 'LinearizationTable' => 'Tabla Linearización', + 'Lit' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'LiveViewShooting' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'LocalizedCameraModel' => 'Modelo Cámara Traducido', + 'Location' => 'Localización', + 'LongExposureNoiseReduction' => { + Description => 'RR Exp.Larga', + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'LookupTable' => 'Tabla de Consulta', + 'Luminance' => 'Luminancia', + 'LuminanceNoiseReduction' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Off' => 'Desactivado', + }, + }, + 'Lyrics' => 'Letras', + 'Lyrics_Synchronised' => 'Letras Sincronizadas', + 'MSStereo' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'Macro' => { + PrintConv => { + 'Off' => 'Apagado', + 'On' => 'Encendido', + 'View' => 'Vista', + }, + }, + 'MacroMode' => 'Modo Macro', + 'MainDialExposureComp' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'Make' => 'Marca', + 'MakeAndModel' => 'Marca y Modelo', + 'MakerNote' => 'Dato Privado DNG', + 'MakerNoteOffset' => 'Offset Maker Note', + 'MakerNoteSafety' => { + Description => 'Seguridad Maker Note', + PrintConv => { + 'Safe' => 'Seguro', + 'Unsafe' => 'No Seguro', + }, + }, + 'MakerNoteType' => 'Tipo Maker Note', + 'MakerNoteVersion' => 'Versión nota Fabricante', + 'MakerNotes' => 'Notas del Fabricante', + 'ManagedFromMaskMarkers' => { + PrintConv => { + 'All' => 'Todo', + 'None' => 'Ninguno', + }, + }, + 'ManifestReferenceMaskMarkers' => { + PrintConv => { + 'All' => 'Todo', + 'None' => 'Ninguno', + }, + }, + 'ManometerPressure' => 'Presión Manometrica', + 'ManometerReading' => 'Lectura Manometrica', + 'ManualFlashOutput' => { + PrintConv => { + 'Full' => 'Completo', + 'Low' => 'Bajo', + 'Medium' => 'Medio', + 'n/a' => 'No Aplica', + }, + }, + 'ManualFocusDistance' => 'Distancia Enfoque Manual', + 'Marker' => 'Marcador', + 'MaskedAreas' => 'Ãrea Oculta', + 'MasterDocumentID' => 'ID de Documento Maestro', + 'Matteing' => 'Mate', + 'MaxAperture' => 'Máxima Apertura del Objetivo', + 'MaxApertureAtMaxFocal' => 'Apertura máxima a focal máxima', + 'MaxApertureAtMinFocal' => 'Apertura máxima a focal mínima', + 'MaxApertureValue' => 'Apertura Lente Máxima', + 'MaxFaces' => 'Máximo caras', + 'MaxFocalLength' => 'Longitud focal máxima', + 'MaxPacketSize' => 'Tamaño Máximo Paquete', + 'MaxSampleValue' => 'Valor Muestra Max', + 'MaximumDensityRange' => 'Rango Densidad Maxima', + 'Measurement' => 'Observador de Medida', + 'MeasurementBacking' => 'Apoyo de Medida', + 'MeasurementFlare' => 'Llama de Medida', + 'MeasurementGeometry' => { + Description => 'Geometría de Medida', + PrintConv => { + '0/45 or 45/0' => '0/45 o 45/0', + '0/d or d/0' => '0/d o d/0', + }, + }, + 'MeasurementIlluminant' => 'Iluminación de Medida', + 'MeasurementObserver' => 'Observador de Medida', + 'MediaBlackPoint' => 'Punto Negro Medio', + 'MediaWhitePoint' => 'Punto Blanco Medio', + 'MeteringMode' => { + Description => 'Modo Medición', + PrintConv => { + 'Average' => 'Promedio', + 'Center-weighted average' => 'Media ponderada al centro', + 'Multi-segment' => 'Multi-segmento', + 'Multi-spot' => 'Multi-puntual', + 'Other' => 'Otro', + 'Partial' => 'Parcial', + 'Spot' => 'Puntual', + 'Unknown' => 'Desconocido', + }, + }, + 'MinAperture' => 'Apertura mínima', + 'MinFocalLength' => 'Longitud focal mínima', + 'MinPacketSize' => 'Tamaño Mínimo Paquete', + 'MinSampleValue' => 'Valor Muestra Min', + 'MinoltaQuality' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'ModeDialPosition' => { + PrintConv => { + 'Panorama' => 'Panoramica', + }, + }, + 'Model' => 'Modelo', + 'Model2' => 'Modelo Equipamiento Entrada Imagen (2)', + 'ModelReleaseStatus' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'ModelTiePoint' => 'Etiqueta Modelo Punto Lazo', + 'ModelTransform' => 'Etiqueta Modelo Transformación', + 'ModelingFlash' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ModifiedBy' => 'Modificado por', + 'ModifiedPictureStyle' => { + PrintConv => { + 'High Saturation' => 'Saturación Alta', + 'Landscape' => 'Paisaje', + 'Low Saturation' => 'Saturación Baja', + 'Monochrome' => 'Monocromo', + 'Neutral' => 'Neutro', + 'None' => 'Ninguno', + 'Portrait' => 'Retrato', + 'Standard' => 'Estándar', + }, + }, + 'ModifiedSharpnessFreq' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Standard' => 'Estándar', + }, + }, + 'ModifiedToneCurve' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'ModifiedWhiteBalance' => { + PrintConv => { + 'Underwater' => 'Subacuatica', + }, + }, + 'ModifyDate' => 'Fecha y Hora de Cambio del Archivo', + 'MoireFilter' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'MonochromeFilterEffect' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + 'Orange' => 'Naranja', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'MonochromeLinear' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'MonochromeToning' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'MonochromeToningEffect' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + }, + }, + 'MultiExposureAutoGain' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'MultiExposureMode' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'MultiFrameNoiseReduction' => { + Description => 'Reduc. ruido varios fotogr.', + PrintConv => { + 'None' => 'Ninguno', + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'MultipleExposureMode' => 'Modo Exposición Múltiple', + 'MultipleExposureSet' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'Mute' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'MyColorMode' => { + PrintConv => { + 'Neutral' => 'Neutro', + 'Off' => 'Desactivado', + 'Vivid' => 'Vívido', + }, + }, + 'NDFilter' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'NSC_Description' => 'Descripción NSC', + 'Name' => 'Nombre', + 'NamedColor2' => 'Color Llamado 2', + 'NativeDisplayInfo' => 'Información Pantalla Nativa', + 'NewsPhotoVersion' => 'Versión Registro Foto Noticias', + 'Noise' => 'Ruido', + 'NoiseFilter' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Off' => 'Desactivado', + 'Standard' => 'Estándar', + }, + }, + 'NoiseReduction' => { + Description => 'Reducción Ruido', + PrintConv => { + 'Low' => 'Bajo', + 'Off' => 'Desactivado', + 'Standard' => 'Estándar', + }, + }, + 'NoiseReductionApplied' => 'Reducción Ruido Aplicada', + 'NominalMaxAperture' => 'Apertura máxima nominal', + 'NominalMinAperture' => 'Apertura mínima nominal', + 'NumAFPoints' => 'Número de Puntos AF', + 'NumChannels' => 'Número Canales', + 'NumColors' => 'Número de colores', + 'NumImportantColors' => 'Número Colores Importantes', + 'NumIndexEntries' => 'Número de Entradas de Ãndice', + 'NumSampleFrames' => 'Número de fotogramas', + 'NumberOfFrames' => 'Número de imágenes', + 'NumberofInks' => 'Número de Tintas', + 'OPIProxy' => 'Proxy OPI', + 'ObjectAttributeReference' => 'Género Intelectual', + 'ObjectCycle' => { + Description => 'Ciclo Objecto', + PrintConv => { + 'Both Morning and Evening' => 'Ambos', + 'Evening' => 'Tarde', + 'Morning' => 'Mañana', + }, + }, + 'ObjectFileType' => { + PrintConv => { + 'None' => 'Ninguno', + 'Unknown' => 'Desconocido', + }, + }, + 'ObjectName' => 'Título', + 'ObjectPreviewData' => 'Datos Previos del Objecto', + 'ObjectPreviewFileFormat' => 'Formato Archivo Previo de Objecto', + 'ObjectPreviewFileVersion' => 'Versión Formato Archivo Previo del Objecto', + 'ObjectTypeReference' => 'Referencia Tipo Objeto', + 'OffsetSchema' => 'Offset Esquema', + 'OperatingSystem' => { + Description => 'Sistema Operativo', + PrintConv => { + 'unknown' => 'desconocido', + }, + }, + 'OpticalZoomMode' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'OpticalZoomOn' => { + Description => 'Zoom Óptico Encendido', + PrintConv => { + 'Off' => 'Apagado', + 'On' => 'Encendido', + }, + }, + 'Opto-ElectricConvFactor' => 'Factor Conversión Optoeléctrico', + 'Orientation' => { + Description => 'Orientación de Imagen', + PrintConv => { + 'Horizontal (normal)' => '0° (arriba/izquierda)', + 'Mirror horizontal' => 'Invertir horizontal', + 'Mirror horizontal and rotate 270 CW' => 'Invertir horizontal y rotar 270° sentido reloj', + 'Mirror horizontal and rotate 90 CW' => 'Invertir horizontal y rotar 90° sentido reloj', + 'Mirror vertical' => 'Invertir vertical', + 'Rotate 180' => 'Girado 180°', + 'Rotate 270 CW' => 'Girado 270° sentido reloj', + 'Rotate 90 CW' => 'Girado 90° sentido reloj', + }, + }, + 'OriginPlatform' => { + PrintConv => { + 'Other' => 'Otro', + }, + }, + 'OriginalAlbumTitle' => 'Título Original Album', + 'OriginalArtist' => 'Artista original', + 'OriginalFileName' => 'Nombre archivo original', + 'OriginalLyricist' => 'Letrista Original', + 'OriginalRawFileData' => 'Dato Archivo Raw Original', + 'OriginalRawFileDigest' => 'Cifrado Archivo Raw Original', + 'OriginalRawFileName' => 'Nombre Archivo Raw Original', + 'OriginalReleaseYear' => 'Año Versión Original', + 'OriginalTransmissionReference' => 'Identificador de Trabajo', + 'OriginatingProgram' => 'Programa Originario', + 'OutputResponse' => 'Respuesta Salida', + 'Owner' => 'Propietario', + 'OwnerID' => 'ID del Propietario', + 'OwnerName' => 'Nombre del Propietario', + 'PF25ColorMatrix' => 'Matriz de Color PF25', + 'PackingMethod' => { + PrintConv => { + 'Best Compression' => 'Mejor Compresión', + 'Fast' => 'Rápido', + 'Fastest' => 'Mas Rápido', + 'Good Compression' => 'Buena Compresión', + 'Stored' => 'Almacenado', + }, + }, + 'Padding' => 'Margen Inferior', + 'PageName' => 'Nombre Página', + 'PageNumber' => 'Número Página', + 'PanoramaSize3D' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'Period' => 'Período', + 'PhotoEffect' => { + PrintConv => { + 'B&W' => 'Blanco y Negro', + 'Custom' => 'Personalizado', + 'Neutral' => 'Neutro', + 'Off' => 'Desactivado', + 'Vivid' => 'Vívido', + }, + }, + 'PhotoEffects' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'PhotoEffectsType' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'PhotometricInterpretation' => { + Description => 'Interpretación Fotométrica', + PrintConv => { + 'BlackIsZero' => 'Negro es cero', + 'Color Filter Array' => 'CFA (Matriz Filtro Color)', + 'Pixar LogL' => 'CIE Log2(L) (Log luminancia)', + 'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (Log luminancia y crominancia)', + 'RGB Palette' => 'Paleta Color', + 'Transparency Mask' => 'Máscara de transparencia', + 'WhiteIsZero' => 'Blanco es cero', + }, + }, + 'PhotoshopAnnotations' => 'Anotaciones Photoshop', + 'PhotoshopFormat' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'PictInfo' => 'Info Imagen', + 'Picture' => 'Imágen', + 'PictureControl' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'PictureControlActive' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'PictureDescription' => 'Descripción Imágen', + 'PictureFinish' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + 'Portrait' => 'Retrato', + }, + }, + 'PictureMode' => { + PrintConv => { + 'Beach' => 'Playa', + 'Fireworks' => 'Fuegos Artificiales', + 'Food' => 'Comida', + 'Green' => 'Verde', + 'Landscape' => 'Paisaje', + 'Panorama' => 'Panoramica', + 'Portrait' => 'Retrato', + 'Red' => 'Rojo', + 'Snow' => 'Nieve', + 'Soft' => 'Suave', + 'Standard' => 'Estándar', + 'Underwater' => 'Subacuatica', + 'Vivid' => 'Vívido', + 'Yellow' => 'Amarillo', + }, + }, + 'PictureModeBWFilter' => { + PrintConv => { + 'Green' => 'Verde', + 'Neutral' => 'Neutro', + 'Orange' => 'Naranja', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'PictureModeEffect' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Standard' => 'Estándar', + }, + }, + 'PictureModeTone' => { + PrintConv => { + 'Green' => 'Verde', + 'Neutral' => 'Neutro', + }, + }, + 'PictureStyle' => { + PrintConv => { + 'Faithful' => 'Fiel', + 'High Saturation' => 'Saturación Alta', + 'Landscape' => 'Paisaje', + 'Low Saturation' => 'Saturación Baja', + 'Monochrome' => 'Monocromo', + 'Neutral' => 'Neutro', + 'None' => 'Ninguno', + 'Portrait' => 'Retrato', + 'Standard' => 'Estándar', + }, + }, + 'PictureType' => { + Description => 'Tipo Imágen', + PrintConv => { + '32x32 PNG Icon' => 'Icono PNG 32x32', + 'Artist' => 'Artista', + 'Back Cover' => 'Cubierta Posterior', + 'Composer' => 'Compositor', + 'Conductor' => 'Director', + 'Front Cover' => 'Cubierta Frontal', + 'Illustration' => 'Ilustración', + 'Lyricist' => 'Letrista', + 'Media' => 'Soporte', + 'Other' => 'Otro', + 'Other Icon' => 'Otro Icono', + 'Performance' => 'Interpretación', + 'Recording Session' => 'Sesión Grabación', + }, + }, + 'PictureWizardMode' => { + PrintConv => { + 'Cool' => 'Frío', + 'Landscape' => 'Paisaje', + 'Portrait' => 'Retrato', + 'Standard' => 'Estándar', + 'Vivid' => 'Vívido', + }, + }, + 'PixelFormat' => 'Formato Pixel', + 'PixelIntensityRange' => 'Intervalo Intensidad Pixel', + 'PixelScale' => 'Etiqueta Escala Pixel Modelo', + 'PlanarConfiguration' => { + Description => 'Ajuste Datos Imagen', + PrintConv => { + 'Chunky' => 'Formato \'Chunky\' (Entrelazado)', + 'Planar' => 'Formato \'Planar\'', + }, + }, + 'Predictor' => { + PrintConv => { + 'Horizontal differencing' => 'Diferenciación Horizontal', + 'None' => 'No se usa esquema de predicción antes de codificar', + }, + }, + 'Preview0' => 'Previa 0', + 'Preview1' => 'Previa 1', + 'Preview2' => 'Previa 2', + 'PreviewApplicationName' => 'Nombre Aplicación Previa', + 'PreviewApplicationVersion' => 'Versión Aplicación Previa', + 'PreviewButton' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'PreviewButtonPlusDials' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'PreviewColorSpace' => { + Description => 'Espacio Color Previa', + PrintConv => { + 'Unknown' => 'Desconocido', + }, + }, + 'PreviewDateTime' => 'Fecha y Hora Previa', + 'PreviewImage' => 'Vista Previa', + 'PreviewImageLength' => 'Longitud Imagen Previa', + 'PreviewImageSize' => 'Tamaño Imagen Previa', + 'PreviewImageStart' => 'Inicio Imagen Previa', + 'PreviewImageValid' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'PreviewSettingsDigest' => 'Cifrado Configuración Previa', + 'PreviewSettingsName' => 'Nombre Configuración Previa', + 'PrimaryAFPoint' => 'Punto AF primario', + 'PrimaryChromaticities' => 'Cromaticidades de Colores Primarios', + 'PrimaryPlatform' => 'Plataforma Primaria', + 'ProcessingSoftware' => 'Tratamiendo de Software', + 'Producer' => 'Productor', + 'ProductID' => 'ID Producto', + 'ProfileCMMType' => 'Tipo Perfil CMM', + 'ProfileCalibrationSig' => 'Firma Perfil Calibración', + 'ProfileClass' => { + Description => 'Clase Perfil', + PrintConv => { + 'Abstract Profile' => 'Perfil Abstracto', + 'ColorSpace Conversion Profile' => 'Perfil Conversión Espacio Color', + 'DeviceLink Profile' => 'Perfil Dispositivo Conexión', + 'Display Device Profile' => 'Perfil Dispositivo Pantalla', + 'Input Device Profile' => 'Perfil Dispositivo Entrada', + 'NamedColor Profile' => 'Perfil Color Nombrado', + 'Nikon Input Device Profile (NON-STANDARD!)' => 'Perfil Nikon ("nkpf")', + 'Output Device Profile' => 'Perfil Dispositivo Salida', + }, + }, + 'ProfileConnectionSpace' => 'Espacio Conexión Perfil', + 'ProfileCopyright' => 'Copyright', + 'ProfileCreator' => 'Creador Perfil', + 'ProfileDateTime' => 'Fecha y Hora Perfil', + 'ProfileDescription' => 'Descripción Perfil', + 'ProfileDescriptionML' => 'Descripción Perfil ML', + 'ProfileEmbedPolicy' => { + Description => 'Perfil Política Incrustada', + PrintConv => { + 'Allow Copying' => 'Permitir copia', + 'Embed if Used' => 'Incrustar si se usa', + 'Never Embed' => 'Incrustado nunca', + 'No Restrictions' => 'Sin restricciones', + }, + }, + 'ProfileFileSignature' => 'Firma Archivo Perfil', + 'ProfileHueSatMapData1' => 'Perfil Matiz Sat. Mapa Dato 1', + 'ProfileHueSatMapData2' => 'Perfil Matiz Sat. Mapa Dato 2', + 'ProfileHueSatMapDims' => 'Divisiones Matiz', + 'ProfileID' => 'ID Perfil', + 'ProfileLookTableData' => 'Perfil Datos Tabla Consulta', + 'ProfileLookTableDims' => 'Divisiones Matiz', + 'ProfileName' => 'Nombre Perfil', + 'ProfileSequenceDesc' => 'Descripción Secuencia Perfil', + 'ProfileToneCurve' => 'Perfil Curva Tono', + 'ProfileVersion' => 'Versión Perfil', + 'ProgramMode' => { + PrintConv => { + 'None' => 'Ninguno', + 'Portrait' => 'Retrato', + }, + }, + 'ProgramVersion' => 'Versión Programa', + 'Projects' => 'Proyectos', + 'PromotionURL' => 'URL Promocional', + 'PropertyReleaseStatus' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'Protect' => 'Protección', + 'ProtectionType' => 'Tipo Protección', + 'Provider' => 'Proveedor', + 'ProviderCopyright' => 'Copyright Proveedor', + 'Province-State' => 'Provincia/Estado', + 'Publisher' => 'Editor', + 'Quality' => { + Description => 'Calidad', + PrintConv => { + 'Compressed RAW' => 'cRAW', + 'Compressed RAW + JPEG' => 'cRAW+JPEG', + 'Extra Fine' => 'Extrafina', + 'Fine' => 'Fina', + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Normal' => 'Calidad estándar', + 'RAW + JPEG' => 'RAW+JPEG', + 'Standard' => 'Estándar', + 'n/a' => 'no aplica', + }, + }, + 'QuantizationMethod' => { + Description => 'Método Cuantización', + PrintConv => { + 'AP Domestic Analogue' => 'AP Doméstico Análogo', + 'Color Space Specific' => 'Espacio Color Específico', + 'Compression Method Specific' => 'Método Compresión Específico', + 'Gamma Compensated' => 'Gamma Compensada', + 'IPTC Ref B' => 'IPTC ref "B"', + 'Linear Density' => 'Densidad lineal', + 'Linear Dot Percent' => 'Porcentaje Punto lineal', + 'Linear Reflectance/Transmittance' => 'Reflectancia/transmitancia lineal', + }, + }, + 'QuickShot' => { + Description => 'Disparo Rápido', + PrintConv => { + 'Off' => 'Apagado', + 'On' => 'Encendido', + }, + }, + 'RadioStationName' => 'Nombre Emisora Radio', + 'RadioStationOwner' => 'Propietario Emisora Radio', + 'RasterPadding' => 'Relleno Trama', + 'RasterizedCaption' => 'Título Rasterizado', + 'Rating' => { + Description => 'Clasificación', + PrintConv => { + 'none' => 'Ninguno', + }, + }, + 'RatingPercent' => 'Valoración en Porcentaje', + 'RawCustomSaturation' => 'Raw Saturación personalizada', + 'RawDataUniqueID' => 'ID Único Dato Raw', + 'RawDevAutoGradation' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'RawDevNoiseReduction' => { + PrintConv => { + 'Noise Filter' => 'Filtro ruido', + 'Noise Filter (ISO Boost)' => 'Filtro ruido (ISO Boost)', + 'Noise Reduction' => 'Reducción ruido', + }, + }, + 'RawDevPMPictureTone' => { + PrintConv => { + 'Green' => 'Verde', + 'Neutral' => 'Neutro', + }, + }, + 'RawDevPM_BWFilter' => { + PrintConv => { + 'Green' => 'Verde', + 'Neutral' => 'Neutro', + 'Orange' => 'Naranja', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'RawDevPictureMode' => { + PrintConv => { + 'Vivid' => 'Vívido', + }, + }, + 'RawDevSettings' => { + PrintConv => { + 'Noise Reduction' => 'Reducción ruido', + }, + }, + 'RawImageDigest' => 'Cifrado Imagen RAW', + 'RawJpgSize' => { + PrintConv => { + 'Medium' => 'Medio', + 'Medium 1' => 'Medio 1 ', + 'Medium 2' => 'Medio 2', + 'Medium 3' => 'Medio 3', + 'Postcard' => 'Tarjeta Postal', + 'Small 1' => 'Pequeño 1', + 'Small 2' => 'Pequeño 21', + 'Small 3' => 'Pequeño 3', + }, + }, + 'RecordMode' => 'Modo de Grabación', + 'RecordShutterRelease' => { + Description => 'Soltar Obturador Grabación', + PrintConv => { + 'Press start, press stop' => 'Pulsa para iniciar, pulsa para parar', + 'Record while down' => 'Grabar mientras se pulsa', + }, + }, + 'RecordedTrackNumber' => 'Número Pista grabada', + 'RecordingMode' => { + PrintConv => { + 'Panorama' => 'Panoramica', + 'Portrait' => 'Retrato', + }, + }, + 'RedEyeCorrection' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'RedEyeReduction' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'RedMatrixColumn' => 'Columna Matriz Rojo', + 'RedTRC' => 'Curva Reproducción Tono Rojo', + 'ReductionMatrix1' => 'Matriz Reducción 1', + 'ReductionMatrix2' => 'Matriz Reducción 2', + 'ReferenceBlackWhite' => 'Par de Valores de Referencia Blanco y Negro', + 'ReferenceDate' => 'Fecha Referencia', + 'ReferenceNumber' => 'Número Referencia', + 'ReferenceService' => 'Servicio Referencia', + 'RelatedImageFileFormat' => 'Formato Archivo Imagen Relacionado', + 'RelatedImageHeight' => 'Alto Imagen Relacionada', + 'RelatedImageWidth' => 'Ancho Imagen Relacionada', + 'RelatedSoundFile' => 'Archivo Audio Relacionado', + 'ReleaseButtonToUseDial' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'ReleaseDate' => 'Fecha Lanzamiento', + 'ReleaseTime' => 'Hora Lanzamiento', + 'RenderingIntent' => { + Description => 'Intento Interpretación', + PrintConv => { + 'ICC-Absolute Colorimetric' => 'Colorimétrica Absoluta', + 'Media-Relative Colorimetric' => 'Colorimétrica Relativa', + 'Saturation' => 'Saturación', + }, + }, + 'RenditionOfMaskMarkers' => { + PrintConv => { + 'All' => 'Todo', + 'None' => 'Ninguno', + }, + }, + 'ResampleParamsQuality' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + }, + }, + 'Resaved' => { + Description => 'Regrabado', + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'Reserved1' => 'Reservado 1', + 'Resolution' => 'Resolución', + 'ResolutionMode' => 'Modo Resolución', + 'ResolutionUnit' => { + Description => 'Unidad de Resolución de X e Y', + PrintConv => { + 'None' => 'Ninguno', + 'cm' => 'Píxeles/cm', + 'inches' => 'Pulgada', + }, + }, + 'RetouchHistory' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'RevisionNumber' => 'Número Revisión', + 'Rotation' => { + Description => 'Rotación', + PrintConv => { + 'Rotate 180' => 'Girado 180°', + 'Rotate 270 CW' => 'Girado 270° sentido reloj', + 'Rotate 90 CW' => 'Girado 90° sentido reloj', + 'Rotated 180' => 'Girado 180°', + 'Rotated 270 CW' => 'Girado 270° sentido reloj', + 'Rotated 90 CW' => 'Girado 90° sentido reloj', + }, + }, + 'RowInterleaveFactor' => 'Factor Interpolar Fila', + 'RowsPerStrip' => 'Número de Filas por Tira', + 'SMaxSampleValue' => 'Valor Muestra Max S', + 'SMinSampleValue' => 'Valor Muestra Min S', + 'SRAWQuality' => { + PrintConv => { + 'n/a' => 'No Aplica', + }, + }, + 'SRActive' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'SampleFormat' => 'Formato Muestra', + 'SampleRate' => 'Frecuencia muestreo', + 'SampleSize' => 'Tamaño muestra', + 'SampleStructure' => { + Description => 'Estructura Muestreo', + PrintConv => { + 'CompressionDependent' => 'Definido dentro del proceso de compresión', + 'Orthogonal4-2-2Sampling' => 'Ortogonal con las frecuencias de muestreo en el ratio de 4:2:2:(4)', + 'OrthogonalConstangSampling' => 'Ortogonal con la mismas frecuencias de muestreo relativo en cada componente', + }, + }, + 'SamplesPerPixel' => 'Número de Componentes', + 'SanyoQuality' => { + Description => 'Calidad Sanyo', + PrintConv => { + 'Fine/High' => 'Fino/Alto', + 'Fine/Low' => 'Fino/Bajo', + 'Fine/Medium' => 'Fino/Medio', + 'Fine/Medium High' => 'Fino/Medio Alto', + 'Fine/Medium Low' => 'Fino/Medio bajo', + 'Fine/Super High' => 'Fino/Super Alto', + 'Fine/Very High' => 'Fino/Muy Alto', + 'Fine/Very Low' => 'Fino/Muy bajo', + 'Normal/High' => 'Normal/Alto', + 'Normal/Low' => 'Normal/Bajo', + 'Normal/Medium' => 'Normal/Medio', + 'Normal/Medium High' => 'Normal/Medio Alto', + 'Normal/Medium Low' => 'Normal/Medio bajo', + 'Normal/Super High' => 'Normal/Super Alto', + 'Normal/Very High' => 'Normal/Muy Alto', + 'Normal/Very Low' => 'Normal/Muy bajo', + 'Super Fine/High' => 'Super Fino/Alto', + 'Super Fine/Low' => 'Super Fino/Bajo', + 'Super Fine/Medium' => 'Super Fino/Medio', + 'Super Fine/Medium High' => 'Super Fino/Medio Alto', + 'Super Fine/Medium Low' => 'Super Fino/Medio Bajo', + 'Super Fine/Super High' => 'Super Fino/Super Alto', + 'Super Fine/Very High' => 'Super Fino/Muy Alto', + 'Super Fine/Very Low' => 'Super Fino/Muy Bajo', + }, + }, + 'SanyoThumbnail' => 'Miniatura Sanyo', + 'Saturation' => { + Description => 'Saturación', + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'None' => 'Ninguno', + 'None (B&W)' => 'Ninguna (N&B)', + 'Normal' => 'Estándar', + 'Vivid' => 'Vívido', + }, + }, + 'ScanImageEnhancer' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ScanningDirection' => { + Description => 'Dirección Escaneo', + PrintConv => { + 'Bottom-Top, L-R' => 'Abajo a arriba, izquierda a derecha', + 'Bottom-Top, R-L' => 'Abajo a arriba, derecha a izquierda', + 'L-R, Bottom-Top' => 'Izquierda a derecha, abajo a arriba', + 'L-R, Top-Bottom' => 'Izquierda a derecha, arriba a abajo', + 'R-L, Bottom-Top' => 'Derecha a izquierda, abajo a arriba', + 'R-L, Top-Bottom' => 'Derecha a izquierda, arriba a abajo', + 'Top-Bottom, L-R' => 'Arriba a abajo, izquierda a derecha', + 'Top-Bottom, R-L' => 'Arriba a abajo, derecha a izquierda', + }, + }, + 'Scene' => 'Escena', + 'SceneCaptureType' => { + Description => 'Tipo Captura Escena', + PrintConv => { + 'Landscape' => 'Paisaje', + 'Night' => 'Escena nocturna', + 'Portrait' => 'Retrato', + 'Standard' => 'Estándar', + }, + }, + 'SceneMode' => { + Description => 'Selección de escena', + PrintConv => { + '3D Sweep Panorama' => '3D', + 'Anti Motion Blur' => 'Anti movimiento', + 'Beach' => 'Playa', + 'Cont. Priority AE' => 'AE prioridad cont.', + 'Fireworks' => 'Fuegos Artificiales', + 'Food' => 'Comida', + 'Handheld Night Shot' => 'Toma noct. manual', + 'Indoor' => 'Interior', + 'Landscape' => 'Paisaje', + 'Night Portrait' => 'Retrato noct.', + 'Night Scene' => 'Vista nocturna', + 'Night View/Portrait' => 'Vista/retrato nocturno', + 'Off' => 'Desactivado', + 'Panorama' => 'Panoramica', + 'Portrait' => 'Retrato', + 'Snow' => 'Nieve', + 'Sports' => 'Acción deportiva', + 'Standard' => 'Estándar', + 'Sunset' => 'Puesta sol', + 'Sweep Panorama' => 'Barrido panorámico', + 'Underwater' => 'Subacuatica', + 'Vivid' => 'Vívido', + }, + }, + 'SceneModeUsed' => { + PrintConv => { + 'Beach' => 'Playa', + 'Fireworks' => 'Fuegos Artificiales', + 'Landscape' => 'Paisaje', + 'Panorama' => 'Panoramica', + 'Portrait' => 'Retrato', + 'Snow' => 'Nieve', + }, + }, + 'SceneSelect' => { + Description => 'Selección Escena', + PrintConv => { + 'Lamp' => 'Lámpara', + 'Night' => 'Noche', + 'Off' => 'Apagado', + 'Sport' => 'Deporte', + 'User 1' => 'Usuario 1', + 'User 2' => 'Usuario 2', + }, + }, + 'SceneType' => { + Description => 'Tipo Escena', + PrintConv => { + 'Directly photographed' => 'Imagen fotografiada directamente', + }, + }, + 'Security' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'SecurityClassification' => { + Description => 'Clasificación Seguridad', + PrintConv => { + 'Confidential' => 'Confidencial', + 'Restricted' => 'Restringida', + 'Secret' => 'Secreta', + 'Top Secret' => 'Alto secreto', + 'Unclassified' => 'Sin clasificar', + }, + }, + 'SelectableAFPoint' => 'Punto AF seleccionable', + 'SelfTimer' => { + Description => 'Temporizador Automático', + PrintConv => { + 'Off' => 'Apagado', + 'On' => 'Encendido', + }, + }, + 'SelfTimerMode' => 'Modo Automático', + 'SensingMethod' => { + Description => 'Método Sensor', + PrintConv => { + 'Color sequential area' => 'Sensor de color secuencial', + 'Color sequential linear' => 'Sensor lineal de color secuencial', + 'Monochrome area' => 'Sensor monocromo', + 'Monochrome linear' => 'Sensor lineal monocromo', + 'Not defined' => 'No definido', + 'One-chip color area' => 'Sensor monochip de color', + 'Three-chip color area' => 'Sensor tres chips de color', + 'Trilinear' => 'Sensor trilineal', + 'Two-chip color area' => 'Sensor bichip de color', + }, + }, + 'SensitivityType' => { + PrintConv => { + 'Unknown' => 'Desconocido', + }, + }, + 'SequenceShotInterval' => { + Description => 'Intervalo Disparo Secuencial', + PrintConv => { + '10 frames/s' => '10 cuadros/s', + '15 frames/s' => '15 cuadros/s', + '20 frames/s' => '20 cuadros/s', + '5 frames/s' => '5 cuadros/s', + }, + }, + 'SequentialShot' => { + Description => 'Disparo Secuencial', + PrintConv => { + 'Adjust Exposure' => 'Ajustar Exposición', + 'Best' => 'Mejor', + 'None' => 'Ninguno', + 'Standard' => 'Estándar', + }, + }, + 'SerialNumber' => 'Número Serie', + 'ServiceIdentifier' => 'Identificador Servicio', + 'ShadingCompensation' => 'Compensación de Sombreado', + 'ShadingCompensation2' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'Shadow' => 'Sombrío', + 'ShadowScale' => 'Escala Sombrío', + 'ShakeReduction' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'Sharpening' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + }, + }, + 'Sharpness' => { + Description => 'Nitidez', + PrintConv => { + 'Hard' => 'Fuerte', + 'Normal' => 'Estándar', + 'Sharp' => 'Nitido', + 'Soft' => 'Suave', + }, + }, + 'SharpnessFrequency' => { + PrintConv => { + 'High' => 'Alto', + 'Highest' => 'Muy Alto', + 'Low' => 'Bajo', + 'Lowest' => 'Mas bajo', + 'Standard' => 'Estándar', + 'n/a' => 'No Aplica', + }, + }, + 'ShootingMode' => { + Description => 'Modo de Disparo', + PrintConv => { + 'Beach' => 'Playa', + 'Fireworks' => 'Fuegos Artificiales', + 'Food' => 'Comida', + 'Portrait' => 'Retrato', + 'Snow' => 'Nieve', + 'Underwater' => 'Subacuatica', + }, + }, + 'ShortDocumentID' => 'ID Corta del Documento', + 'Shutter-AELock' => 'Disparador Bloqueo AE', + 'ShutterCount' => 'Contador de disparos', + 'ShutterReleaseButtonAE-L' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ShutterReleaseNoCFCard' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'ShutterSpeed' => 'Tiempo de Exposición', + 'ShutterSpeedValue' => 'Velocidad Obturación', + 'Signature_Name' => 'Firma', + 'SimilarityIndex' => 'Ãndice de Similitudes', + 'SingleFrameBracketing' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + }, + }, + 'Site' => 'Sitio', + 'SlideShow' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'SlowShutter' => { + PrintConv => { + 'None' => 'Ninguno', + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'SoftSkinEffect' => { + PrintConv => { + 'Low' => 'Bajo', + }, + }, + 'Software' => 'Programa Utilizado', + 'SoftwareVersion' => 'Versión Software', + 'SonyImageSize' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'SonyQuality' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'Source' => 'Fuente', + 'SpatialFrequencyResponse' => 'Respuesta Frecuencia Espacial', + 'SpecialEffectsOpticalFilter' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'SpecialInstructions' => 'Instrucciones', + 'SpecialMode' => 'Modo Especial', + 'SpectralSensitivity' => 'Sensibilidad Espectral', + 'Speed' => { + PrintConv => { + 'Fast' => 'Rápido', + }, + }, + 'SpotMeteringMode' => { + PrintConv => { + 'AF Point' => 'Punto AF', + 'Center' => 'Centro', + }, + }, + 'State' => 'Estado', + 'StreamColor' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'StreamType' => { + PrintConv => { + 'Binary' => 'Binario', + 'File Transfer' => 'Transferencia Archivo', + }, + }, + 'StripByteCounts' => 'Bytes por Tira Comprimida', + 'StripOffsets' => 'Localización Datos Imagen', + 'Sub-location' => 'Localización', + 'SubSecTime' => 'Subsegundos DateTime', + 'SubSecTimeDigitized' => 'Subsegundos DateTimeDigitized', + 'SubSecTimeOriginal' => 'Subsegundos DateTimeOriginal', + 'SubTileBlockSize' => 'Tamaño Bloque Submosaico', + 'SubfileType' => 'Nuevo Tipo Subarchivo', + 'SubimageColor' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'Subject' => 'Sujeto', + 'SubjectArea' => 'Zona Sujeto', + 'SubjectDistance' => 'Distancia Sujeto', + 'SubjectDistanceRange' => { + Description => 'Intervalo Distancia Sujeto', + PrintConv => { + 'Close' => 'Vista cercana', + 'Distant' => 'Vista alejada', + 'Unknown' => 'Desconocido', + }, + }, + 'SubjectLocation' => 'Localización Sujeto', + 'SubjectProgram' => { + PrintConv => { + 'None' => 'Ninguno', + 'Portrait' => 'Retrato', + }, + }, + 'SubjectReference' => 'Código Sujeto', + 'Subsystem' => { + PrintConv => { + 'Unknown' => 'Desconocido', + }, + }, + 'Subtitle' => 'Subtitulo', + 'SubtitleDescription' => 'Descripción Subtitulo', + 'SuperimposedDisplay' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'SupplementalCategories' => 'Categoría Suplementaria', + 'SupplementalType' => { + Description => 'Tipo Suplemento', + PrintConv => { + 'Main Image' => 'No Definido', + 'Rasterized Caption' => 'Título Rasterizado', + 'Reduced Resolution Image' => 'Imagen resolución reducida', + }, + }, + 'SweepPanoramaSize' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'SwitchToRegisteredAFPoint' => 'Conmutación de Punto AF registrado', + 'SynchronizedLyricsType' => { + PrintConv => { + 'Other' => 'Otro', + }, + }, + 'T4Options' => 'Opciones T4', + 'T6Options' => 'Opciones T6', + 'TIFF-EPStandardID' => 'ID Estándar TIFF/EP', + 'Tagged' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'TargetPrinter' => 'Impresora Objetivo', + 'Technology' => { + Description => 'Tecnología', + PrintConv => { + 'Active Matrix Display' => 'Pantalla Matriz Activa', + 'Cathode Ray Tube Display' => 'Pantalla Tubo Rayos Catódicos', + 'Digital Camera' => 'Cámara Digital', + 'Dye Sublimation Printer' => 'Impresora Sublimación', + 'Electrophotographic Printer' => 'Impresora Electrofotográfica (Laser)', + 'Electrostatic Printer' => 'Impresora Electrostática', + 'Film Scanner' => 'Escaner Película', + 'Film Writer' => 'Impresora Película', + 'Flexography' => 'Flexografía', + 'Gravure' => 'Grabado', + 'Ink Jet Printer' => 'Impresora Inyección Tinta', + 'Offset Lithography' => 'Litografía Offset', + 'Passive Matrix Display' => 'Pantalla Matriz Pasiva', + 'Photo Image Setter' => 'Marco Foto', + 'Photographic Paper Printer' => 'Impresora Papel Fotográfico', + 'Projection Television' => 'Televisión Proyección', + 'Reflective Scanner' => 'Escaner Reflectivo', + 'Silkscreen' => 'Pantalla Sedosa', + 'Thermal Wax Printer' => 'Impresora Cera Termal', + 'Video Camera' => 'Videocámara', + 'Video Monitor' => 'Monitor Video', + }, + }, + 'Teleconverter' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'Text' => 'Texto', + 'TextStamp' => { + PrintConv => { + 'On' => 'Activado', + }, + }, + 'Thresholding' => 'Umbral', + 'ThumbnailImage' => 'Miniatura', + 'ThumbnailImageSize' => 'Tamaño de la Vista en Miniatura', + 'TileByteCounts' => 'Número Byte Elemento', + 'TileDepth' => 'Ancho Elemento', + 'TileLength' => 'Largo Elemento', + 'TileOffsets' => 'Offsets Elemento', + 'TileWidth' => 'Ancho Elemento', + 'TimeCreated' => 'Hora Creación', + 'TimeScaleParamsQuality' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + }, + }, + 'TimeSent' => 'Hora Envío', + 'TimeSignature' => { + PrintConv => { + 'other' => 'Otro', + }, + }, + 'TimeStamp' => 'Marca de Tiempo', + 'TimeStamp1' => 'Marca de Tiempo 1', + 'TimeZoneOffset' => 'Offset Zona Horaria', + 'Title' => 'Título', + 'ToneCurve' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'ToneCurveActive' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'ToningEffect' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'ToningEffectMonochrome' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + }, + }, + 'ToningEffectUnknown' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + }, + }, + 'ToningEffectUserDef1' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + }, + }, + 'ToningEffectUserDef2' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + }, + }, + 'ToningEffectUserDef3' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Ninguno', + }, + }, + 'ToolName' => 'Nombre Herramienta', + 'ToolVersion' => 'Versión Herramienta', + 'TotalFrames' => 'Total Imagenes', + 'Track' => 'Pista', + 'TrackCreateDate' => 'Fecha creación Track', + 'TrackDefault' => 'Pista Defecto', + 'TrackForced' => 'Pista Forzada', + 'TrackHeaderVersion' => 'Versión cabecera Pista', + 'TrackID' => 'ID Pista', + 'TrackName' => 'Nombre Pista', + 'TrackNumber' => 'Número Pista', + 'TrackType' => 'Tipo Pista', + 'TrackUsed' => 'Pista utilizada', + 'Tracks' => 'Pistas', + 'TransferFunction' => 'Función Transferencia', + 'TransferRange' => 'Intervalo Transferencia', + 'Transformation' => { + Description => 'Transformación', + PrintConv => { + 'Mirror horizontal' => 'Invertir horizontal', + 'Mirror horizontal and rotate 270 CW' => 'Invertir horizontal y rotar 270° sentido reloj', + 'Mirror horizontal and rotate 90 CW' => 'Invertir horizontal y rotar 90° sentido reloj', + 'Mirror vertical' => 'Invertir vertical', + 'Rotate 180' => 'Girado 180°', + 'Rotate 270 CW' => 'Girado 270° sentido reloj', + 'Rotate 90 CW' => 'Girado 90° sentido reloj', + }, + }, + 'TransmissionReference' => 'Referencia de Transmisión', + 'TransparencyIndicator' => 'Indicador Transparencia', + 'TrapIndicator' => 'Indicador Tampa', + 'Type' => 'Tipo', + 'Uncompressed' => { + Description => 'Sin Comprimir', + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'UncompressedSize' => 'Tamaño Descomprimido', + 'UniqueCameraModel' => 'Modelo Cámara Unico', + 'UniqueDocumentID' => 'ID de Documento Única', + 'UniqueFileIdentifier' => 'Identificador Unico Archivo', + 'UniqueObjectName' => 'Nombre Único de Objeto', + 'Unknown' => 'Desconocido', + 'Unsharp1Color' => { + PrintConv => { + 'Green' => 'Verde', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'Unsharp2Color' => { + PrintConv => { + 'Green' => 'Verde', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'Unsharp3Color' => { + PrintConv => { + 'Green' => 'Verde', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'Unsharp4Color' => { + PrintConv => { + 'Green' => 'Verde', + 'Red' => 'Rojo', + 'Yellow' => 'Amarillo', + }, + }, + 'UnsharpMask' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'Urgency' => { + Description => 'Urgencia', + PrintConv => { + '0 (reserved)' => '0 (reservado para futuro uso)', + '1 (most urgent)' => '1 (más urgente)', + '5 (normal urgency)' => '5 (urgencia normal)', + '8 (least urgent)' => '8 (menos urgente)', + '9 (user-defined priority)' => '9 (reservado para futuro uso)', + }, + }, + 'UserComment' => 'Comentarios Usuario', + 'UserDef1PictureStyle' => { + PrintConv => { + 'Landscape' => 'Paisaje', + 'Monochrome' => 'Monocromo', + 'Neutral' => 'Neutro', + 'Portrait' => 'Retrato', + 'Standard' => 'Estándar', + }, + }, + 'UserDef2PictureStyle' => { + PrintConv => { + 'Landscape' => 'Paisaje', + 'Monochrome' => 'Monocromo', + 'Neutral' => 'Neutro', + 'Portrait' => 'Retrato', + 'Standard' => 'Estándar', + }, + }, + 'UserDef3PictureStyle' => { + PrintConv => { + 'Landscape' => 'Paisaje', + 'Monochrome' => 'Monocromo', + 'Neutral' => 'Neutro', + 'Portrait' => 'Retrato', + 'Standard' => 'Estándar', + }, + }, + 'VR_0x66' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'ValidAFPoints' => 'Puntos AF validos', + 'Version' => 'Versión PrintIM', + 'VersionYear' => 'Año versión', + 'VibrationReduction' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'VideoAlphaMode' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'VideoCardGamma' => 'Tarjeta Video Gamma', + 'VideoCompressor' => 'Video Compresor', + 'VideoFieldOrder' => { + PrintConv => { + 'Lower' => 'Inferior', + 'Progressive' => 'Progresivo', + 'Upper' => 'Superior', + }, + }, + 'VideoHeight' => 'Altura Video', + 'VideoPixelDepth' => { + PrintConv => { + '16-bit integer' => 'Entero 16-bits', + '24-bit integer' => 'Entero 24-bits', + '32-bit float' => 'Flotante 32-bits', + '32-bit integer' => 'Entero 32-bits', + '8-bit integer' => 'Entero 8-bits', + 'Other' => 'Otro', + }, + }, + 'VideoQuality' => { + PrintConv => { + 'Low' => 'Bajo', + 'Standard' => 'Estándar', + }, + }, + 'VideoWidth' => 'Ancho Video', + 'ViewCompressionFactor' => 'Ver Factor de compresión', + 'ViewfinderWarning' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ViewfinderWarnings' => { + PrintConv => { + 'Monochrome' => 'Monocromo', + }, + }, + 'ViewingCondDesc' => 'Descripción en Condiciones de Visión', + 'ViewingCondIlluminant' => 'Iluminación en Condiciones de Visión', + 'ViewingCondIlluminantType' => 'Tipo Iluminación en Condiciones de Visión', + 'ViewingCondSurround' => 'Entorno en Condiciones de Visión', + 'ViewingConditions' => 'Iluminación en Condiciones de Visión', + 'VignetteControl' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'VoiceMemo' => { + Description => 'Notas Voz', + PrintConv => { + 'Off' => 'Apagado', + 'On' => 'Encendido', + }, + }, + 'WBAdjLighting' => { + PrintConv => { + 'None' => 'Ninguno', + }, + }, + 'WBBracketMode' => { + PrintConv => { + 'Off' => 'Desactivado', + }, + }, + 'WBFineTuneActive' => { + PrintConv => { + 'Yes' => 'Si', + }, + }, + 'WCSProfiles' => 'Perfil Sistema Color Windows', + 'WhiteBalance' => { + Description => 'Balance de Blancos', + PrintConv => { + 'Auto' => 'Automático', + 'Black & White' => 'Monocromo', + 'Cloudy' => 'Nublado', + 'Color Temperature/Color Filter' => 'Temperatura de color / Filtro de color', + 'Cool White Fluorescent' => 'Fluorescente blanco frío', + 'Custom' => 'Personalizado', + 'Custom 1' => 'Personalizado 1', + 'Custom 2' => 'Personalizado 2', + 'Custom 3' => 'Personalizado 3', + 'Custom 4' => 'Personalizado 4', + 'Day White Fluorescent' => 'Fluorescente blanco de día', + 'Daylight' => 'Luz de día', + 'Daylight Fluorescent' => 'Fluorescente luz de día', + 'Fluorescent' => 'Flourescente', + 'Manual' => 'Equilibrio del blanco manual', + 'Manual Temperature (Kelvin)' => 'Temperatura Manual (Kelvin)', + 'Shade' => 'Sombrío', + 'Tungsten' => 'Tungsteno', + 'Underwater' => 'Subacuatica', + 'Unknown' => 'Desconocido', + 'Warm White Fluorescent' => 'Fluorescente blanco cálido', + 'White Fluorescent' => 'Fluorescente blanco', + }, + }, + 'WhiteBalanceAdj' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'WhiteBalanceBracketing' => { + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Bajo', + }, + }, + 'WhiteLevel' => 'Nivel Blanco', + 'WhitePoint' => 'Cromaticidad Punto Blanco', + 'WideRange' => { + Description => 'Intervalo Extendido', + PrintConv => { + 'Off' => 'Apagado', + 'On' => 'Encendido', + }, + }, + 'WidthResolution' => 'Resolución Imagen Horizontal', + 'Writer' => 'Escritor', + 'Writer-Editor' => 'Título/Descripción Escritor', + 'X3FillLight' => 'Luz Relleno X3', + 'XClipPathUnits' => 'Unidades Camino Fragmento X', + 'XMP' => 'Metadatos XMP', + 'XPosition' => 'Posición X', + 'XResolution' => 'Resolución Imagen Horizontal', + 'YCbCrCoefficients' => 'Coeficientes de Matriz de Tranformación de Espacio de Color', + 'YCbCrPositioning' => { + Description => 'Posicionamiento Y y C', + PrintConv => { + 'Centered' => 'Centrado', + 'Co-sited' => 'Vecino', + }, + }, + 'YCbCrSubSampling' => 'Ratio Submuestreo de Y a C', + 'YClipPathUnits' => 'Unidades Camino Fragmento Y', + 'YPosition' => 'Posición Y', + 'YResolution' => 'Resolución Imagen Vertical', + 'Year' => 'Año', + 'YearCreated' => 'Año Creación', + 'ZipCompressedSize' => 'Zip Tamaño Comprimido', + 'ZipCompression' => { + Description => 'Compresión Zip', + PrintConv => { + 'None' => 'Ninguno', + 'Reduced with compression factor 1' => 'Reducido con factor de compresión 1', + 'Reduced with compression factor 2' => 'Reducido con factor de compresión 2', + 'Reduced with compression factor 3' => 'Reducido con factor de compresión 3', + 'Reduced with compression factor 4' => 'Reducido con factor de compresión 4', + }, + }, + 'ZipUncompressedSize' => 'Zip Tamaño Descomprimido', + 'ZoneMatching' => { + Description => 'Zone matching', + PrintConv => { + 'High Key' => 'Alto', + 'ISO Setting Used' => 'Desactivado', + 'Low Key' => 'Bajo', + }, + }, + 'ZoneMatchingMode' => { + PrintConv => { + 'Standard' => 'Estándar', + }, + }, + 'ZoneMatchingOn' => { + PrintConv => { + 'Off' => 'Desactivado', + 'On' => 'Activado', + }, + }, + 'ZoomPos' => 'Posición Zoom', +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::es.pm - ExifTool Spanish language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke, Santiago del BrE<iacute>o GonzE<aacute>lez and Emilio +Sancha for providing this translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/fi.pm b/lib/Image/ExifTool/Lang/fi.pm new file mode 100644 index 0000000..5a35b1c --- /dev/null +++ b/lib/Image/ExifTool/Lang/fi.pm @@ -0,0 +1,2896 @@ +#------------------------------------------------------------------------------ +# File: fi.pm +# +# Description: ExifTool Finnish language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::fi; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.04'; + +%Image::ExifTool::Lang::fi::Translate = ( + 'AEAperture' => 'AE-aukko', + 'AEBBracketValue' => 'AEB-haarukointiarvo', + 'AEBXv' => 'AEB-valotuksen korjaus', + 'AEExposureTime' => 'AE-valotusaika', + 'AEInfo' => 'Automaattivalotustiedot', + 'AELock' => { + Description => 'AE-lukitus', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'AELockButton' => 'AE-lukituspainike', + 'AEMeteringMode' => 'AE-valotuksen mittaustapa', + 'AEMeteringSegments' => 'AE-mittaussegmentit', + 'AEProgramMode' => 'AE-ohjelmatapa', + 'AESetting' => 'AE-asetus', + 'AEXv' => 'AE-valotuksen korjaus', + 'AF-CPrioritySelection' => 'AF-C -esivalinnat', + 'AF-OnForMB-D10' => 'AF-ON -painike (MB-D10)', + 'AF-SPrioritySelection' => 'AF-S -esivalinnat', + 'AFActivation' => 'AF-aktivointi', + 'AFAdjustment' => 'AF-säätö', + 'AFAperture' => 'AF-aukko', + 'AFArea' => 'AF-alue', + 'AFAreaHeight' => 'AF-alueen korkeus', + 'AFAreaIllumination' => 'AF-alueen valaisu', + 'AFAreaMode' => 'AF-aluetarkennus', + 'AFAreaModeSetting' => 'AF-aluemittaustavan asetus', + 'AFAreaWidth' => 'AF-alueen leveys', + 'AFAreas' => 'AF-alueet', + 'AFAssist' => 'AF-apu', + 'AFAssistLamp' => { + PrintConv => { + 'Disabled and Not Required' => 'Deaktivoitu eikä tarpeen', + 'Disabled but Required' => 'Deaktivoitu mutta tarpeen', + 'Enabled but Not Used' => 'Aktivoitu muttei käytetty', + 'Fired' => 'Lauennut', + }, + }, + 'AFDefocus' => 'AF-defokus (poikkeama polttopisteestä)', + 'AFFineTune' => 'AF-hienosäätö', + 'AFImageHeight' => 'AF-kuvan korkeus', + 'AFImageWidth' => 'AF-kuvan leveys', + 'AFInfo' => 'Automaattitarkennustiedot', + 'AFInfo2' => 'AF-tiedot', + 'AFInfo2Version' => 'AF-tietojen versio', + 'AFIntegrationTime' => 'AF-integrointiaika', + 'AFMode' => 'AF-muoto', + 'AFPoint' => { + Description => 'AF-piste', + PrintConv => { + 'Bottom Center' => 'Alhaalla keskellä', + 'Bottom Left' => 'Alavasemmalla', + 'Bottom Right' => 'Alaoikealla', + 'Center' => 'Keskellä', + 'Center Left' => 'Keskellä vasemmalla', + 'Center Right' => 'Keskellä oikealla', + 'Far Left/Right of Center' => 'Kaukana vasemmalla/keskioikealla', + 'Far Left/Right of Center/Bottom' => 'Kaukana vasemmalla/keskioikealla/alhaalla', + 'Near Left/Right of Center' => 'Hieman vasemmalla/keskioikealla', + 'Near Upper/Left' => 'Hieman ylhäällä/vasemmalla', + 'Top Center' => 'Ylhäällä keskellä', + 'Top Left' => 'Ylävasemmalla', + 'Top Near-left' => 'Hieman ylävasemmalla', + 'Top Near-right' => 'Hieman yläoikealla', + 'Top Right' => 'Yläoikealla', + 'Upper Left' => 'Ylävasemmalla', + 'Upper Right' => 'Yläoikealla', + }, + }, + 'AFPointIllumination' => 'AF -pistevalaisu', + 'AFPointMode' => 'AF-pistetapa', + 'AFPointSelected' => { + Description => 'Valittu AF-piste', + PrintConv => { + 'Auto' => 'Automaattinen', + 'Automatic Tracking AF' => 'Automaattiseuranta-AF', + 'Bottom' => 'Alas', + 'Center' => 'Keskelle', + 'Face Detect AF' => 'Kasvojentunnistus-AF', + 'Fixed Center' => 'Kiinteästi keskustaan', + 'Left' => 'Vasemmalle', + 'Lower-left' => 'Alavasemmalle', + 'Lower-right' => 'Alaoikealle', + 'Mid-left' => 'Keskivasemmalle', + 'Mid-right' => 'Keskioikealle', + 'Right' => 'Oikealle', + 'Top' => 'Ylös', + 'Upper-left' => 'Ylävasemmalle', + 'Upper-right' => 'Yläoikealle', + }, + }, + 'AFPointSelected2' => 'Valittu AF-piste 2', + 'AFPointSelection' => 'AF-pistevalinnat', + 'AFPoints' => 'AF-pisteet', + 'AFPointsInFocus' => { + Description => 'Tarkennuksen AF-pisteet', + PrintConv => { + 'Bottom-center' => 'Alakeski', + 'Bottom-left' => 'Alavasen', + 'Bottom-right' => 'Alaoikea', + 'Center' => 'Keski', + 'Fixed Center or Multiple' => 'Kiinteästi keskellä tai useita', + 'Left' => 'Vasen', + 'None' => 'Ei yhtään', + 'Right' => 'Oikea', + 'Top-center' => 'Yläkeski', + 'Top-left' => 'Yläoikea', + 'Top-right' => 'Yläoikea', + }, + }, + 'AFPointsSelected' => 'Valitut AF-pisteet', + 'AFPointsUsed' => 'Käytetyt AF-pisteet', + 'AFPredictor' => 'Ennakoiva AF', + 'AFResponse' => 'Käytetty AF', + 'AFResult' => 'AF-tulos', + 'AFSearch' => { + Description => 'AF-haku', + PrintConv => { + 'Not Ready' => 'Ei valmis', + 'Ready' => 'Valmis', + }, + }, + 'ARMIdentifier' => 'ARM-tunnistin', + 'ARMVersion' => 'ARM-versio', + 'AToB0' => 'A - B0', + 'AToB1' => 'A - B1', + 'AToB2' => 'A - B2', + 'AccessoryType' => 'Lisälaitetyyppi', + 'ActionAdvised' => { + Description => 'Suositettava toiminto', + PrintConv => { + 'Object Append' => 'Objektiliitäntä', + 'Object Kill' => 'Objektin tuhonta', + 'Object Reference' => 'Objektiviite', + 'Object Replace' => 'Objektin korvaus', + 'Ojbect Append' => 'Objektiliitäntä', + }, + }, + 'ActiveArea' => 'Aktiivialue', + 'ActiveD-Lighting' => 'Aktiivinen D-Lighting', + 'ActiveD-LightingMode' => 'Aktivoitu D-Lighting-tapa', + 'AdjustmentMode' => 'Säätötapa', + 'AdvancedRaw' => 'Edistynyt RAW', + 'AdvancedSceneMode' => { + Description => 'Edistynyt näkymätapa', + PrintConv => { + 'Auto' => 'Automaattinen', + 'Creative' => 'Luova', + 'Indoor/Architecture/Objects/HDR B&W' => 'Sisällä/arkkitehtuuri/kohteet', + 'Normal' => 'Normaali', + 'Outdoor/Illuminations/Flower/HDR Art' => 'Ulkona/valaistukset/kukka', + }, + }, + 'AlphaByteCount' => 'Alfa-tavujen määrä', + 'AlphaChannelsNames' => 'Alfa-kanavien nimet', + 'AlphaDataDiscard' => { + Description => 'Alfa-data hylätty', + PrintConv => { + 'Flexbits Discarded' => 'FlexBits hylätty', + 'Full Resolution' => 'Täysi resoluutio', + 'HighPass Frequency Data Discarded' => 'Ylipäästötaajuusdata hylätty', + 'Highpass and LowPass Frequency Data Discarded' => 'Yli- ja alipäästötaajuusdata hylätty', + }, + }, + 'AlphaOffset' => 'Alfa-siirtymä', + 'AnalogBalance' => 'Analoginen tasapaino', + 'AntiAliasStrength' => 'Kameran anti-alias -suotimen suhteellinen vahvuus', + 'Aperture' => 'Aukko', + 'ApertureRingUse' => 'Himmenninrenkaan käyttö', + 'ApertureValue' => 'Aukkoarvo', + 'ApplicationRecordVersion' => 'Sovellustietueen versio', + 'ArtFilter' => 'Taidesuodin', + 'Artist' => 'Kuvan luonut henkilö', + 'AsShotICCProfile' => 'Kuin kuvatessa -ICC-profiili', + 'AsShotNeutral' => 'Kuin kuvatessa -neutraali', + 'AsShotPreProfileMatrix' => 'Kuin kuvatessa -pre-profiilimatriisi', + 'AsShotProfileName' => 'Kuin kuvatessa -profiilin nimi', + 'AsShotWhiteXY' => 'Kuin kuvatessa -valkoinen X-Y', + 'Audio' => { + Description => 'Ääni', + PrintConv => { + 'No' => 'Ei', + 'Yes' => 'Kyllä', + }, + }, + 'AudioDuration' => 'Audion kesto', + 'AudioOutcue' => 'Audion lopetus', + 'AudioSamplingRate' => 'Audion näytetaajuus', + 'AudioSamplingResolution' => 'Audion näyteresoluutio', + 'AudioType' => { + Description => 'Audiotyyppi', + PrintConv => { + 'Mono Actuality' => 'Aktuaalisuus (monoaudio (1 kanava))', + 'Mono Music' => 'Musiikki, itsensä välittämä (monoaudio (1 kanava))', + 'Mono Question and Answer Session' => 'Kysymys- ja vastausistunto (monoaudio (1 kanava))', + 'Mono Raw Sound' => 'Raakaääni (monoaudio (1 kanava))', + 'Mono Response to a Question' => 'Vastaus kysymykseen (monoaudio (1 kanava))', + 'Mono Scener' => 'Kohtaus (monoaudio (1 kanava))', + 'Mono Voicer' => 'Ihmisääni (monoaudio (1 kanava))', + 'Mono Wrap' => 'Pakkaus (monoaudio (1 kanava))', + 'Stereo Actuality' => 'Aktuaalisuus (stereoaudio (2 kanavaa))', + 'Stereo Music' => 'Musiikki, itsensä välittämä (stereomono (2 kanavaa))', + 'Stereo Question and Answer Session' => 'Kysymys- ja vastausistunto (stereoaudio (2 kanavaa))', + 'Stereo Raw Sound' => 'Raakaääni (stereoaudio (2 kanavaa))', + 'Stereo Response to a Question' => 'Vastaus kysymykseen (stereoaudio (2 kanavaa))', + 'Stereo Scener' => 'Kohtaus (stereoaudio (2 kanavaa))', + 'Stereo Voicer' => 'Ihmisääni (stereoaudio (2 kanavaa))', + 'Stereo Wrap' => 'Pakkaus (stereoaudio (2 kanavaa))', + 'Text Only' => 'Vain teksti (ei objektidataa)', + }, + }, + 'Author' => 'Tekijä', + 'AutoAperture' => 'Himmenninrengas A:ssa', + 'AutoBracket' => 'Automaattihaarukointi', + 'AutoBracketSet' => 'Haarukointisarja', + 'AutoBracketing' => { + Description => 'Automaattinen haarukointi', + PrintConv => { + 'No flash & flash' => 'Ei salamaa & Salama', + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'AutoBracketingSet' => 'Haarukointisarja', + 'AutoDistortionControl' => 'Automaattinen vääristymäkorjaus', + 'AutoExposureBracketing' => 'Automaattinen valotuksen haarukointi', + 'AutoFP' => 'Automaattinen FP', + 'AutoFocus' => { + Description => 'Automaattitarkennus', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'AutoISO' => { + Description => 'Automaatti-ISO', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'AutoRedEye' => 'Automaattinen punasilmien esto', + 'AutoRotate' => 'Automaattinen kuvankierto', + 'AuxiliaryLens' => 'Lisälinssi', + 'AvApertureSetting' => 'Av-aukkoasetus', + 'BToA0' => 'B - A0', + 'BToA1' => 'B - A1', + 'BToA2' => 'B - A2', + 'BWMode' => { + Description => 'M/V-muoto', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'BackgroundColor' => 'Taustaväri', + 'BackgroundColorIndicator' => 'Taustavärin ilmaisin', + 'BackgroundColorValue' => 'Taustavärin arvo', + 'BadFaxLines' => 'Huonot faksirivit', + 'BaseExposureCompensation' => 'Valotuksen perussäätö', + 'BaseISO' => 'Perus-ISO', + 'BaselineExposure' => 'Valotuksen perusta', + 'BaselineNoise' => 'Kohinan perusta', + 'BaselineSharpness' => 'Terävyyden perusta', + 'BatteryLevel' => 'Pariston varaus', + 'BatteryOrder' => 'Paristojärjestys', + 'BayerGreenSplit' => 'Bayer Green Split -suodin', + 'Beep' => 'Äänimerkki', + 'BestQualityScale' => 'Parhaan laadun asteikko', + 'BestShotMode' => { + Description => 'Parhaan kuvan tapa', + PrintConv => { + 'Off' => 'Pois', + }, + }, + 'BitDepth' => 'Bittisyvyys', + 'BitsPerComponent' => 'Bittejä per komponentti', + 'BitsPerExtendedRunLength' => 'Bittejä per jatkettu jakson pituus', + 'BitsPerPixel' => 'Bittejä per pikseli', + 'BitsPerRunLength' => 'Bittejä per jakson pituus', + 'BitsPerSample' => 'Bittejä per näyte', + 'BlackLevel' => 'Mustan taso', + 'BlackLevel2' => 'Mustan taso 2', + 'BlackLevelDeltaH' => 'Mustan tason Delta H', + 'BlackLevelDeltaV' => 'Mustan tason Delta V', + 'BlackLevelRepeatDim' => 'Mustan tason toiston dimensio', + 'BlackMaskBottomBorder' => 'Mustan maskin alareuna', + 'BlackMaskLeftBorder' => 'Mustan maskin vasen reuna', + 'BlackMaskRightBorder' => 'Mustan maskin oikea reuna', + 'BlackMaskTopBorder' => 'Mustan maskin yläreuna', + 'BlackPoint' => 'Musta piste', + 'BlueBalance' => 'Sinitasapaino', + 'BlueMatrixColumn' => 'Sinisen matriisin sarake', + 'BlueTRC' => 'Sinisen toonin toistokäyrä', + 'BlueX' => 'Sininen X', + 'BlueY' => 'Sininen Y', + 'BlurWarning' => { + Description => 'Tärinävaroitus', + PrintConv => { + 'Blur Warning' => 'Tärinävaroitus', + 'None' => 'Ei mitään', + }, + }, + 'BodyFirmwareVersion' => 'Rungon laiteohjelmistoversio', + 'BorderID' => 'Kehyksen ID', + 'BorderLocation' => 'Kehyksen sijainti', + 'BorderName' => 'Kehyksen nimi', + 'BorderType' => 'Kehyksen tyyppi', + 'BordersVersion' => 'Kehysten versio', + 'BracketMode' => 'Haarukointitapa', + 'BracketSequence' => 'Haarukointijärjestys', + 'BracketShotNumber' => 'Haarukoinnin otosnumero', + 'BracketStep' => 'Haarukointiväli', + 'BracketValue' => 'Haarukointiarvo', + 'Brightness' => 'Kirkkaus', + 'BrightnessData' => 'Kirkkausdata', + 'BrightnessValue' => 'Kirkkausarvo', + 'BulbDuration' => 'Aikavalotuksen kesto', + 'BurstMode' => { + Description => 'Sarjatapa', + PrintConv => { + 'Auto Exposure Bracketing (AEB)' => 'Ääretön', + 'Infinite' => 'Ääretön', + 'Off' => 'Pois', + 'On' => 'Matala/korkea laatu', + 'Unlimited' => 'Rajaton', + }, + }, + 'By-line' => 'Tekijä', + 'By-lineTitle' => 'Tekijän ammattinimike', + 'CCDScanMode' => { + Description => 'CCD-skannaustapa', + PrintConv => { + 'Interlaced' => 'Lomitettu', + 'Progressive' => 'Progressiivinen', + }, + }, + 'CFALayout' => { + Description => 'CFA-sommitelma', + PrintConv => { + 'Even columns offset down 1/2 row' => 'Horjahtanut sommitelma A: parilliset sarakkeet siirtyneet alas 1/2 riviä', + 'Even columns offset up 1/2 row' => 'Horjahtanut sommitelma B: parilliset sarakkeet osiirtyneet ylös 1/2 riviä', + 'Even rows offset left 1/2 column' => 'Horjahtanut sommitelma D: parilliset rivit siirtyneet vasemmalle 1/2 saraketta', + 'Even rows offset right 1/2 column' => 'Horjahtanut sommitelma C: parilliset rivit siirtyneet oikealle 1/2 saraketta', + 'Rectangular' => 'Suorakulmainen (tai neliömäinen) sommitelma', + }, + }, + 'CFAPattern' => 'CFA-kuvio', + 'CFAPattern2' => 'CFA-kuvio 2', + 'CFAPlaneColor' => 'CFA-tasoväri', + 'CFARepeatPatternDim' => 'Toistuvan CFA-kuvion laajuus', + 'CLModeShootingSpeed' => 'Hidas jatkuva kuvaus (CL)', + 'CMContrast' => 'CM:n kontrasti', + 'CMExposureCompensation' => 'CM:n valotuksen säätö', + 'CMHue' => 'CM:n sävy', + 'CMMFlags' => 'CMM-liput', + 'CMSaturation' => 'CM:n värikylläisyys', + 'CMSharpness' => 'CM:n terävyys', + 'CMWhiteBalance' => 'CM:n valkotasapaino', + 'CMWhiteBalanceComp' => 'CM:n valkotasapainon säätö', + 'CMWhiteBalanceGrayPoint' => 'CM:n valkotasapainon harmaapiste', + 'CMYKEquivalent' => 'CMYK-vastaava', + 'CPUFirmwareVersion' => 'CPU-laiteohjelmistoversio', + 'CalibrationDateTime' => 'Kalibroinnin päiväysaika', + 'CalibrationIlluminant1' => { + Description => 'Valaistuksen kalibrointi 1', + PrintConv => { + 'Unknown' => 'Tuntematon', + }, + }, + 'CalibrationIlluminant2' => { + Description => 'Valaistuksen kalibrointi 2', + PrintConv => { + 'Unknown' => 'Tuntematon', + }, + }, + 'CameraCalibration1' => 'Kameran kalibrointi 1', + 'CameraCalibration2' => 'Kameran kalibrointi 2', + 'CameraCalibrationSig' => 'Kameran kalibrointitunniste', + 'CameraID' => 'Kameran ID', + 'CameraISO' => 'Kamera-ISO', + 'CameraOwner' => 'Kameran omistaja', + 'CameraParameters' => 'Kameran parametrit', + 'CameraSerialNumber' => 'Kameran rungon nro', + 'CameraSettings' => 'Kameran asetukset', + 'CameraSettingsVersion' => 'Kamera-asetusten versio', + 'CameraTemperature' => 'Kameran lämpötila', + 'CameraType' => 'Kameratyyppi', + 'CameraType2' => 'Kameratyyppi 2', + 'CanonAFInfo' => 'AF-info', + 'CanonAFInfo2' => 'AF-info (2)', + 'CanonFileInfo' => 'Tiedostoinfo', + 'CanonFileLength' => 'Tiedoston pituus', + 'CanonFirmwareVersion' => 'Laiteohjelmiston versio', + 'CanonFlags' => 'Canon-liput', + 'CanonImageType' => 'Kuvatyyppi', + 'CanonModelID' => 'Mallin ID', + 'Caption-Abstract' => 'Seloste/Kuvaus', + 'CaptureConditionsPAR' => 'PAR-kuvausolosuhteet', + 'CaptureDeviceFID' => 'Kuvauslaitteen FID', + 'CasioImageSize' => 'Casion kuvakoko', + 'Category' => 'Kategoria', + 'CellLength' => 'Kennon pituus', + 'CellWidth' => 'Kennon leveys', + 'CenterAFArea' => 'Keskialueen AF', + 'CharTarget' => 'Kirjainmerkin kohde', + 'CharacterSet' => 'Merkistö', + 'ChromaBlurRadius' => 'Kromaattisen sumeuden säde', + 'ChromaticAdaptation' => 'Kromaattinen adaptaatio', + 'Chromaticity' => 'Kromaattisuus', + 'City' => 'Kaupunki', + 'ClassifyState' => 'Luokitustila', + 'CleanFaxData' => 'Poista faksidata', + 'ClipPath' => 'Leikepolku', + 'CodedCharacterSet' => 'Koodattu merkistö', + 'ColorAberrationControl' => 'Väripoikkeaman hallinta', + 'ColorAdjustment' => 'Värien säätö', + 'ColorAdjustmentMode' => { + Description => 'Värin säätötapa', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'ColorBalance' => 'Väritasapaino', + 'ColorBalanceAdj' => 'Väritasapainon säätö', + 'ColorBalanceBlue' => 'Väritasapaino sininen', + 'ColorBalanceGreen' => 'Väritasapaino vihreä', + 'ColorBalanceRed' => 'Väritasapaino punainen', + 'ColorBalanceVersion' => 'Väritasapainon versio', + 'ColorBoostData' => 'Väritehostusdata', + 'ColorBoostLevel' => 'Väritehostustaso', + 'ColorBoostType' => 'Väritehostustyyppi', + 'ColorBooster' => 'Väritehostus', + 'ColorCalibrationMatrix' => 'Värien kalibrointimatriisitaulukko', + 'ColorCharacterization' => 'Värin luonnehdinta', + 'ColorCompensationFilter' => 'Värikorjailusuodin', + 'ColorControl' => 'Värisäätö', + 'ColorEffect' => { + Description => 'Väriefekti', + PrintConv => { + 'Black & White' => 'Musta & Valkoinen', + 'Cool' => 'Viileä', + 'Off' => 'Pois', + 'Sepia' => 'Seepia', + 'Warm' => 'Lämmin', + }, + }, + 'ColorFilter' => { + Description => 'Värisuodin', + PrintConv => { + 'Off' => 'Pois', + }, + }, + 'ColorGain' => 'Värien vahvistus', + 'ColorHue' => 'Värisävy', + 'ColorInfo' => 'Väritiedot', + 'ColorMap' => 'Värikartta', + 'ColorMatrix' => 'Värimatriisi', + 'ColorMatrix1' => 'Värimatriisi 1', + 'ColorMatrix2' => 'Värimatriisi 2', + 'ColorMatrixNumber' => 'Värimatriisin numero', + 'ColorMode' => { + Description => 'Värimuoto', + PrintConv => { + 'Autumn Leaves' => 'Syksyn lehdet', + 'B & W' => 'M & V', + 'B&W' => 'M&V', + 'Black & White' => 'Heleät värit', + 'Chrome' => 'Kellastunut', + 'Clear' => 'Selkeä', + 'Deep' => 'Syvä', + 'Evening' => 'Ilta', + 'Landscape' => 'Maisema', + 'Light' => 'Valoisa', + 'Natural' => 'Luonnollinen', + 'Natural color' => 'Luonnonvalo', + 'Natural sRGB' => 'Luonnollinen sRGB', + 'Natural+ sRGB' => 'Luonnollinen+ sRGB', + 'Neutral' => 'Neutraali', + 'Night Portrait' => 'Yön muotokuva', + 'Night Scene' => 'Yönäkymä', + 'Night View' => 'Iltanäkymä', + 'Night View/Portrait' => 'Yönäkymä', + 'Normal' => 'Normaali', + 'Off' => 'Pois', + 'Portrait' => 'Muotokuva', + 'Sepia' => 'Seepia', + 'Solarization' => 'Solarisaatio', + 'Standard' => 'Vakio', + 'Sunset' => 'Auringonlasku', + 'Vivid' => 'Heleät värit', + 'Vivid color' => 'Heleä väri', + }, + }, + 'ColorMoireReduction' => 'Värimoareen vaimennus', + 'ColorMoireReductionMode' => 'Värimoareen vaimennustapa', + 'ColorPalette' => 'Väripaletti', + 'ColorProfile' => 'Väriprofiili', + 'ColorRepresentation' => 'Väriesitys', + 'ColorReproduction' => 'Värientoisto', + 'ColorResponseUnit' => 'Värin vasteyksikkö', + 'ColorSamplersResource' => 'Värinäytteenotinresurssit', + 'ColorSequence' => 'Värien esitys', + 'ColorSpace' => { + Description => 'Väriavaruus', + PrintConv => { + 'ICC Profile' => 'ICC-profiili', + 'Uncalibrated' => 'Kalibroimaton', + 'Wide Gamut RGB' => 'Laaja Gamut RVB', + }, + }, + 'ColorTable' => 'Väritaulukko', + 'ColorTemperature' => 'Värilämpötila', + 'ColorTone' => 'Värisävy', + 'ColorToneFaithful' => 'Kohdeuskollinen värisävy', + 'ColorToneLandscape' => 'Maisemakuvan värisävy', + 'ColorToneNeutral' => 'Neutraali värisävy', + 'ColorTonePortrait' => 'Muotokuvan värisävy', + 'ColorToneStandard' => 'Vakiovärisävy', + 'ColorType' => 'Värityyppi', + 'ColorantOrder' => 'Väriainejärjestys', + 'ColorantTable' => 'Väriainetaulukko', + 'ColorimetricReference' => 'Kolorimetrinen referenssi', + 'Comment' => 'Kommentti', + 'ComponentsConfiguration' => 'Kunkin komponentin tarkoitus', + 'CompressedBitsPerPixel' => 'Kuvan pakkausmuoto', + 'CompressedImageSize' => 'Pakatun kuvan koko', + 'Compression' => 'Pakkausskeema', + 'CompressionRatio' => 'Pakkaussuhde', + 'ConnectionSpaceIlluminant' => 'Yhteystilan valaistus', + 'ConsecutiveBadFaxLines' => 'Peräkkäiset huonot faksirivit', + 'Contact' => 'Kontakti', + 'ContentLocationCode' => 'Sisällön sijaintikoodi', + 'ContentLocationName' => 'Sisällön sijaintinimi', + 'ContinuousBracketing' => 'Jatkuva haarukointi', + 'Contrast' => { + Description => 'Kontrasti', + PrintConv => { + 'Film Simulation' => 'Filminsimulaatio', + 'High' => 'Korkea', + 'Low' => 'Matala', + 'Medium High' => 'Korkeahko', + 'Medium Low' => 'Matalahko', + 'Normal' => 'Vakio', + }, + }, + 'ContrastAdjustment' => 'Kontrastin säätö', + 'ContrastCurve' => 'Kontrastikäyrä', + 'ContrastFaithful' => 'Kohdeuskollinen kontrasti', + 'ContrastLandscape' => 'Maisemakuvan kontrasti', + 'ContrastMonochrome' => 'Yksivärikuvan kontrasti', + 'ContrastNeutral' => 'Neutraali kontrasti', + 'ContrastPortrait' => 'Muotokuvan kontrasti', + 'ContrastSetting' => 'Kontrastiasetus', + 'ContrastStandard' => 'Vakiokontrasti', + 'ControlMode' => 'Ohjaustapa', + 'ConversionLens' => { + Description => 'Objektiivilisäke', + PrintConv => { + 'Macro' => 'Makro', + 'Off' => 'Pois', + 'Telephoto' => 'Tele', + 'Wide' => 'Laajakulma', + }, + }, + 'Converter' => 'Konvertteri', + 'Copyright' => 'Profiilin copyright', + 'CopyrightFlag' => 'Copyright-lippu', + 'CopyrightNotice' => 'Tekijänoikeusilmoitus', + 'CoringFilter' => 'Ydinsuodin', + 'CoringValues' => 'Ydinsuodatusarvot', + 'Country-PrimaryLocationCode' => 'ISO-maakoodi', + 'Country-PrimaryLocationName' => 'Maa', + 'CreateDate' => 'Digitaalisen datan luonnin päiväys ja aika', + 'CreationDate' => 'Luontipäivä', + 'CreativeStyle' => { + Description => 'Luova tyyli', + PrintConv => { + 'Autumn Leaves' => 'Syksyn lehdet', + 'B&W' => 'M&V', + 'Clear' => 'Selkeä', + 'Deep' => 'Syvä', + 'Landscape' => 'Maisema', + 'Light' => 'Valoisa', + 'Neutral' => 'Neutraali', + 'Night View/Portrait' => 'Yönäkymä', + 'Portrait' => 'Muotokuva', + 'Sepia' => 'Seepia', + 'Standard' => 'Vakio', + 'Sunset' => 'Auringonlasku', + 'Vivid' => 'Heleät värit', + }, + }, + 'CreatorAddress' => 'Tekijä - Osoite', + 'CreatorCity' => 'Tekijä - Kaupunki', + 'CreatorCountry' => 'Tekijä - Maa', + 'CreatorPostalCode' => 'Tekijä - Postinumero', + 'CreatorRegion' => 'Tekijä - Valtio/Provinssi', + 'CreatorWorkEmail' => 'Tekijä - email(it)', + 'CreatorWorkTelephone' => 'Tekijä - Puhelinnumero(t)', + 'CreatorWorkURL' => 'Tekijä - Web-sivusto(t)', + 'Credit' => 'Tarjoaja', + 'CropBottom' => 'Rajaus alhaalta', + 'CropData' => 'Rajausdata', + 'CropLeft' => 'Rajaus vasemmalta', + 'CropOutputHeight' => 'Rajaustuloksen korkeus', + 'CropOutputPixels' => 'Rajaustulokset pikselit', + 'CropOutputResolution' => 'Rajaustuloksen resoluutio', + 'CropOutputScale' => 'Rajaustuloksen mittasuhteet', + 'CropOutputWidth' => 'Rajaustuloksen leveys', + 'CropRight' => 'Rajaus oikealta', + 'CropScaledResolution' => 'Rajauksen skaalausresoluutio', + 'CropSourceResolution' => 'Rajauslähteen resoluutio', + 'CropTop' => 'Rajaus ylhäältä', + 'CurrentICCProfile' => 'Nykyinen ICC-profiili', + 'CurrentPreProfileMatrix' => 'Nykyinen pre-profiilimatriisi', + 'Curves' => 'Käyrät', + 'Custom1' => 'Mukautus 1', + 'Custom2' => 'Mukautus 2', + 'Custom3' => 'Mukautus 3', + 'Custom4' => 'Mukautus 4', + 'CustomRendered' => { + Description => 'Mukautettu kuvankäsittely', + PrintConv => { + 'Custom' => 'Mukautettu käsittely', + 'Normal' => 'Normaali käsittely', + }, + }, + 'CustomSaturation' => 'Mukautettu värikylläisyys', + 'D-LightingHQColorBoost' => 'D-Lighting HQ -väritehostus', + 'D-LightingHQHighlight' => 'D-Lighting HQ -valoalue', + 'D-LightingHQSelected' => 'Valittu D-Lighting HQ', + 'D-LightingHQShadow' => 'D-Lighting HQ -varjoalue', + 'D-LightingHSAdjustment' => 'D-Lighting HS -säätö', + 'D-LightingHSColorBoost' => 'D-Lighting HS -väritehostus', + 'DECPosition' => 'DEC-sijainti', + 'DNGBackwardVersion' => 'Edellinen DNG-versio', + 'DNGVersion' => 'DNG-versio', + 'DSPFirmwareVersion' => 'DSP-laiteohjelmistoversio', + 'DataDump' => 'Datadumppi', + 'DataImprint' => 'Datan sisällytys', + 'DataType' => 'Mattaus', + 'Date' => 'Päiväys', + 'DateCreated' => 'Luontipäiväys', + 'DateImprint' => 'Päiväysleima', + 'DateSent' => 'Lähetyspäivä', + 'DateStampMode' => 'Päiväysleiman muoto', + 'DateTime' => 'Päiväysaika', + 'DateTimeOriginal' => 'Alkuperäisen datan luonnin päiväys ja aika', + 'DealerIDNumber' => 'Myyjän ID-numero', + 'DefaultCropOrigin' => 'Oletusrajauksen alkuperä', + 'DefaultCropSize' => 'Oletusrajauskoko', + 'DefaultScale' => 'Oletusasteikko', + 'DelayTime' => 'Viiveaika', + 'DeletedImageCount' => 'Poistettujen kuvien määrä', + 'Description' => 'Deskriptio', + 'Destination' => 'Kohde', + 'DestinationCity' => 'Kohdepaikkakunta', + 'DestinationCityCode' => 'Kohdepaikkakoodi', + 'DestinationDST' => { + Description => 'Kohteen kesäaika (DST)', + PrintConv => { + 'No' => 'Ei', + 'Yes' => 'Kyllä', + }, + }, + 'DevelopmentDynamicRange' => 'Dynamiikka-alueen kehitys', + 'DeviceAttributes' => 'Laiteattribuutit', + 'DeviceManufacturer' => 'Laitteen valmistaja', + 'DeviceMfgDesc' => 'Laitteen valmistajan kuvaus', + 'DeviceModel' => 'Laitteen malli', + 'DeviceModelDesc' => 'Laitemallin kuvaus', + 'DeviceSettingDescription' => 'Laiteasetusten kuvaus', + 'DigitalCreationDate' => 'Digitalisointipäiväys', + 'DigitalCreationTime' => 'Digitalisointiaika', + 'DigitalDEEHighlightAdj' => 'Digitaalinen DEE -vaalean pään säätö', + 'DigitalDEEShadowAdj' => 'Digitaalinen DEE-varjonsäätö', + 'DigitalDEEThreshold' => 'Digitaalinen DEE-kynnys', + 'DigitalEffectsName' => 'Digitaalisten efektien nimi', + 'DigitalEffectsType' => 'Digitaalisten efektien tyyppi', + 'DigitalEffectsVersion' => 'Digitaalisten efektien versio', + 'DigitalGEM' => 'Digitaalinen GEM', + 'DigitalGain' => 'Digitaalinen vahvistus', + 'DigitalICE' => 'Digitaalinen ICE', + 'DigitalROC' => 'Digitaalinen ROC', + 'DigitalZoom' => 'Digitaalinen zoom', + 'DigitalZoomOn' => { + Description => 'Digitaalinen zoom', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'DigitalZoomRatio' => 'Digitaalinen zoomaussuhde', + 'DirectoryIndex' => 'Kansioindeksi', + 'DirectoryNumber' => 'Kansion numero', + 'DisplayAperture' => 'Aukon näyttö', + 'DisplayedUnitsX' => 'Vaakaresoluution yksikkö', + 'DisplayedUnitsY' => 'Pystyresoluution yksikkö', + 'DistortionCorrection' => 'Vääristymäkorjaus', + 'DocumentHistory' => 'Dokumentin historia', + 'DocumentName' => 'Dokumentin nimi', + 'DocumentNotes' => 'Dokumentin huomautukset', + 'DotRange' => 'Pisteiden määrä', + 'DriveMode' => 'Kuvaustapa', + 'DriveMode2' => 'Kuvaustapa 2', + 'DustRemovalData' => 'Pölynpoistodata', + 'DynamicAFArea' => 'Dynaamisen alueen AF', + 'DynamicRange' => { + Description => 'Dynamiikka-alue', + PrintConv => { + 'Standard' => 'Vakio', + 'Wide' => 'Laaja', + }, + }, + 'DynamicRangeExpansion' => { + Description => 'Dynamiikka-alueen laajennus', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'DynamicRangeOptimizer' => { + Description => 'Dynamiikka-alueen optimointi', + PrintConv => { + 'Advanced Auto' => 'Edistynyt automatiikka', + 'Advanced Lv1' => 'Edistynyt taso 1', + 'Advanced Lv2' => 'Edistynyt taso 2', + 'Advanced Lv3' => 'Edistynyt taso 3', + 'Advanced Lv4' => 'Edistynyt taso 4', + 'Advanced Lv5' => 'Edistynyt taso 5', + 'Off' => 'Pois', + 'Standard' => 'Vakio', + }, + }, + 'DynamicRangeSetting' => { + Description => 'Dynamiikka-alueen säätö', + PrintConv => { + 'Film Simulation' => 'Filminsimulaatio', + 'Standard (100%)' => 'Vakio (100%)', + 'Wide1 (230%)' => 'Laaja 1 (230%)', + 'Wide2 (400%)' => 'Laaja 2 (400%)', + }, + }, + 'E-DialInProgram' => 'Säätökiekko ohjelmassa', + 'EVStepInfo' => 'EV-askeltiedot', + 'EVStepSize' => 'EV-askeleen koko', + 'EVSteps' => 'EV-askeleet', + 'EasyExposureCompensation' => 'Valotuksen pikakorjaus', + 'EasyMode' => 'Helppo tapa', + 'EdgeNoiseReduction' => 'Reunakohinan vaimennus', + 'EditStatus' => 'Editoinnin tila', + 'EditTagArray' => 'Muokkaa tagiryhmää', + 'EditorialUpdate' => { + Description => 'Sisällön päivitys', + PrintConv => { + 'Additional language' => 'Lisäkielet', + }, + }, + 'EffectiveLV' => 'Tehollinen valoarvo (LV)', + 'EffectiveMaxAperture' => 'Suurin tehollinen aukko', + 'Encoder' => 'Kooderi', + 'EncodingProcess' => 'Koodausmetodi', + 'EndPoints' => 'Loppupisteet', + 'EnhanceDarkTones' => 'Tummien sävyjen parantelu', + 'Enhancement' => { + Description => 'Parantelu', + PrintConv => { + 'Blue' => 'Sininen', + 'Flesh Tones' => 'Lihanvärinen', + 'Green' => 'Vihreä', + 'Off' => 'Pois', + 'Red' => 'Punainen', + }, + }, + 'EnhancerValues' => 'Korjainarvot', + 'EnvelopeNumber' => 'Pakkauksen numero', + 'EnvelopePriority' => { + Description => 'Pakkauksen prioriteetti', + PrintConv => { + '0 (reserved)' => '0 (varattu tulevaan käyttöön)', + '1 (most urgent)' => '1 (hyvin kiireellinen)', + '5 (normal urgency)' => '5 (normaali kiireellisyys)', + '8 (least urgent)' => '8 (lievän kiireellinen)', + '9 (user-defined priority)' => '9 (käyttäjän määrittämä prioriteetti)', + }, + }, + 'EnvelopeRecordVersion' => 'Pakkaustietueen versio', + 'EpsonImageHeight' => 'Epson-kuvan korkeus', + 'EpsonImageWidth' => 'Epson-kuvan leveys', + 'EpsonSoftware' => 'Epson-ohjelmisto', + 'Equipment' => 'Välineistön IFD-osoitin', + 'EquipmentVersion' => 'Välineistöversio', + 'ExcursionTolerance' => { + Description => 'Toleranssin ekskursio', + PrintConv => { + 'Allowed' => 'Voi toteutua', + 'Not Allowed' => 'Ei sallittu (oletus)', + }, + }, + 'ExifCameraInfo' => 'Exif-kameratiedot', + 'ExifImageHeight' => 'Kuvan korkeus', + 'ExifImageWidth' => 'Kuvan leveys', + 'ExifVersion' => 'Exif-versio', + 'ExitPupilPosition' => 'Lähtöpupillin sijainti', + 'ExpandFilm' => 'Filmilaajennus', + 'ExpandFilterLens' => 'Suodinlinssilaajennus', + 'ExpandFlashLamp' => 'Salamavalolaajennus', + 'ExpandLens' => 'Objektiivilaajennus', + 'ExpandScanner' => 'Skannerilaajennus', + 'ExpandSoftware' => 'Ohjelmistolaajennus', + 'ExpirationDate' => 'Päättymispäiväys', + 'ExpirationTime' => 'Päättymisaika', + 'Exposure' => 'Valotus', + 'ExposureBracketStepSize' => 'Valotuksen haarukointiväli', + 'ExposureBracketValue' => 'Valotushaarukoinnin arvo', + 'ExposureCompensation' => 'Valotuksen korjaus', + 'ExposureDelayMode' => 'Valotuksen viivetila', + 'ExposureDifference' => 'Valotusero', + 'ExposureIndex' => 'Valotusindeksi', + 'ExposureMode' => { + Description => 'Valotustapa', + PrintConv => { + 'Aperture Priority' => 'Aukon esivalinta', + 'Aperture-priority AE' => 'Aukon esivalinta AE', + 'Auto' => 'Automaattinen', + 'Auto bracket' => 'Automaattihaarukointi', + 'Landscape' => 'Maisema', + 'Manual' => 'Manuaalinen', + 'Night Scene / Twilight' => 'Yönäkymä', + 'Program' => 'Ohjelma', + 'Program AE' => 'Ohjelma-AE', + 'Program-shift' => 'Ohjelma-siirto', + 'Shutter Priority' => 'Ajan esivalinta', + 'Shutter speed priority AE' => 'Ajan esivalinta AE', + 'n/a' => 'Ei asetettu', + }, + }, + 'ExposureProgram' => { + Description => 'Valotusohjelma', + PrintConv => { + 'Action (High speed)' => 'Toimintaohjelma (painotettu suljinnopeutta)', + 'Aperture-priority AE' => 'Aukon esivalinta', + 'Creative (Slow speed)' => 'Luova ohjelma (painotettu syväterävyyttä)', + 'Landscape' => 'Maisemamoodi (maisemakuviin terävällä taustalla)', + 'Manual' => 'Manuaalinen', + 'Not Defined' => 'Ei määritetty', + 'Portrait' => 'Muotokuvamoodi (lähikuviin epäterävällä taustalla)', + 'Program AE' => 'Normaali ohjelma', + 'Shutter speed priority AE' => 'Ajan esivalinta', + }, + }, + 'ExposureTime' => 'Valotusaika', + 'ExposureTime2' => 'Valotusaika 2', + 'ExposureWarning' => { + Description => 'Valotusvaroitus', + PrintConv => { + 'Bad exposure' => 'Valotusvirhe', + 'Good' => 'OK', + }, + }, + 'ExtendedWBDetect' => { + Description => 'Laajennettu valkotas. tunnistus', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'Extender' => 'Konvertteri', + 'ExtenderFirmwareVersion' => 'Konvertterin laiteohjelmistoversio', + 'ExtenderModel' => 'Konvertterimalli', + 'ExtenderSerialNumber' => 'Konvertterin sarjanumero', + 'ExternalFlash' => 'Ulkoinen salama', + 'ExternalFlashAE1' => 'Ulkoinen salama AE 1?', + 'ExternalFlashAE1_0' => 'Ulkoinen salama AE 1 (0)?', + 'ExternalFlashAE2' => 'Ulkoinen salama AE 2?', + 'ExternalFlashAE2_0' => 'Ulkoinen salama AE 2 (0)?', + 'ExternalFlashBounce' => { + Description => 'Ulkoisen salaman heijastus', + PrintConv => { + 'Bounce or Off' => 'Heijastus tai pois', + 'Direct' => 'Suora', + 'No' => 'Ei', + 'Yes' => 'Kyllä', + }, + }, + 'ExternalFlashExposureComp' => 'Ulkoisen salaman valotuksen säätö', + 'ExternalFlashFlags' => 'Ulkoisen salaman liput', + 'ExternalFlashGuideNumber' => 'Ulkoisen salaman ohjeluku?', + 'ExternalFlashMode' => 'Ulkoisen salaman tapa', + 'ExternalFlashZoom' => 'Ulkoisen salaman zoom', + 'ExtraSamples' => 'Lisänäytteet', + 'FNumber' => 'Aukkoarvo', + 'Face1Position' => 'Kasvojen 1 sijainti', + 'Face2Position' => 'Kasvojen 2 sijainti', + 'Face3Position' => 'Kasvojen 3 sijainti', + 'Face4Position' => 'Kasvojen 4 sijainti', + 'Face5Position' => 'Kasvojen 5 sijainti', + 'Face6Position' => 'Kasvojen 6 sijainti', + 'Face7Position' => 'Kasvojen 7 sijainti', + 'Face8Position' => 'Kasvojen 8 sijainti', + 'Face9Position' => 'Kasvojen 9 sijainti', + 'FaceDetect' => 'Kasvojen tunnistus', + 'FacePositions' => 'Kasvojen sijainnit', + 'FacesDetected' => 'Tunnistetut kasvot', + 'FaxRecvParams' => 'Faxin vastaanottoparametrit', + 'FaxRecvTime' => 'Faxin vastaanottoaika', + 'FaxSubAddress' => 'Faxin alaosoite', + 'FileFormat' => 'Tiedostomuoto', + 'FileIndex' => 'Tiedostoindeksi', + 'FileInfo' => 'Tiedostoinfot', + 'FileInfoVersion' => 'Tiedostoinfojen versio', + 'FileName' => 'Tiedostonimi', + 'FileNumber' => 'Tiedoston numero', + 'FileNumberMemory' => 'Tiedostonumeromuisti', + 'FileNumberSequence' => 'Tiedostojen numerojärjestys', + 'FileSize' => 'Tiedoston koko', + 'FileSource' => { + Description => 'Tiedoston lähde', + PrintConv => { + 'Digital Camera' => 'Digitaalikamera', + 'Film Scanner' => 'Filmiskanneri', + 'Reflection Print Scanner' => 'Heijastava skanneri', + }, + }, + 'FileType' => 'Tiedostotyyppi', + 'Filename' => 'Tiedostonimi', + 'FillOrder' => 'Täyttöjärjestys', + 'FilmCategory' => 'Filmiluokka', + 'FilmGencode' => 'Filmin gencode', + 'FilmMode' => { + Description => 'Filmitila', + PrintConv => { + 'Dynamic (B&W)' => 'Dynaaminen (M&V)', + 'Dynamic (color)' => 'Dynaaminen (väri)', + 'F0/Standard (PROVIA)' => 'F0/vakio', + 'F0/Standard (Provia)' => 'F0/vakio', + 'F1/Studio Portrait' => 'F1/studiomuotokuva', + 'F1a/Studio Portrait Enhanced Saturation' => 'F1a/studiomuotokuva laajennettu värikylläisyys', + 'F1b/Studio Portrait Smooth Skin Tone (ASTIA)' => 'F1b/studiomuotokuva pehmeä ihonväri', + 'F1b/Studio Portrait Smooth Skin Tone (Astia)' => 'F1b/studiomuotokuva pehmeä ihonväri', + 'F1c/Studio Portrait Increased Sharpness' => 'F1c/studiomuotokuva lisätty terävyys', + 'F3/Studio Portrait Ex' => 'F3/studiomuotokuva Ex', + 'Nature (color)' => 'Luonnollinen (väri)', + 'Nostalgic' => 'Nostalginen väri', + 'Smooth (B&W)' => 'Pehmeä (M&V)', + 'Smooth (color)' => 'Pehmeä (väri)', + 'Standard (B&W)' => 'Vakio (M&V)', + 'Standard (color)' => 'Vakio (väri)', + 'Vibrant' => 'Eloisa väri', + }, + }, + 'FilmProductCode' => 'Filmin tuotekoodi', + 'FilmType' => 'Filmityyppi', + 'Filter' => 'Suodin', + 'FilterEffect' => 'Suodinefekti', + 'FilterEffectMonochrome' => 'Yksivärisuodintehoste', + 'Firmware' => 'Laiteohjelmisto', + 'FirmwareDate' => 'Laiteohjelmiston päiväys', + 'FirmwareID' => 'Laiteohjelmiston ID', + 'FirmwareRevision' => 'Laiteohjelmiston revisio', + 'FirmwareVersion' => 'Laiteohjelmiston versio', + 'FixtureIdentifier' => 'Ominaisuuden tunnistin', + 'Flash' => { + Description => 'Salama', + PrintConv => { + 'Auto, Did not fire' => 'Salama ei lauennut, automaattimoodi', + 'Auto, Did not fire, Red-eye reduction' => 'Automaattinen, salama ei lauennut, punasilmien esto', + 'Auto, Fired' => 'Salama lauennut, automaattimoodi', + 'Auto, Fired, Red-eye reduction' => 'Salama lauennut, automaattimoodi, punasilmien estomoodi', + 'Auto, Fired, Red-eye reduction, Return detected' => 'Salama lauennut, automaattimoodi, heijastusvalo havaittu, punasilmien estomoodi', + 'Auto, Fired, Red-eye reduction, Return not detected' => 'Salama lauennut, automaattimoodi, heijastusvaloa ei havaittu, punasilmien estomoodi', + 'Auto, Fired, Return detected' => 'Salama lauennut, automaattimoodi. heijastusvalo havaittu', + 'Auto, Fired, Return not detected' => 'Salama lauennut, automaattimoodi, heijastusvaloa ei havaittu', + 'Fired' => 'Salama lauennut', + 'Fired, Red-eye reduction' => 'Salama lauennut, punasilmien estomoodi', + 'Fired, Red-eye reduction, Return detected' => 'Salama lauennut, punasilmien estomoodi, heijastusvalo havaittu', + 'Fired, Red-eye reduction, Return not detected' => 'Salama lauennut, punasilmien estomoodi, heijastusvaloa ei havaittu', + 'Fired, Return detected' => 'Strobo-salaman heijastus havaittu', + 'Fired, Return not detected' => 'Strobo-salaman heijastusta ei havaittu', + 'No Flash' => 'Salama ei lauennut', + 'No flash function' => 'Ei salamatoimintoa', + 'Off, Did not fire' => 'Salama ei lauennut, pakkosalamatila', + 'Off, Did not fire, Return not detected' => 'Pois, salama ei lauennut, heijastusta ei havaittu', + 'Off, No flash function' => 'Pois, ei salamatoimintoa', + 'Off, Red-eye reduction' => 'Pois, punasilmien esto', + 'On, Did not fire' => 'Päällä, salama ei lauennut', + 'On, Fired' => 'Salama lauennut, pakkosalamatila', + 'On, Red-eye reduction' => 'Salama lauennut, pakkosalamatila, punasilmien estomoodi', + 'On, Red-eye reduction, Return detected' => 'Salama lauennut, pakkosalamatila, punasilmien estomoodi, heijastusvalo havaittu', + 'On, Red-eye reduction, Return not detected' => 'Salama lauennut, pakkosalamatila, punasilmien estomoodi, heijastusvaloa ei havaittu', + 'On, Return detected' => 'Salama lauennut, pakkosalamatila, heijastusvalo havaittu', + 'On, Return not detected' => 'Salama lauennut, pakkosalamatila, heijastusvaloa ei havaittu', + }, + }, + 'FlashActivity' => 'Salaman toiminta', + 'FlashBias' => 'Salaman muutos', + 'FlashChargeLevel' => 'Salaman varaustila', + 'FlashCompensation' => 'Salaman säätö', + 'FlashControlMode' => 'Salaman ohjaustapa', + 'FlashDevice' => 'Salamalaite', + 'FlashDistance' => 'Salamaetäisyys', + 'FlashEnergy' => 'Salaman teho', + 'FlashExposureBracketValue' => 'Salamavalotuksen haarukoinnin arvo', + 'FlashExposureComp' => 'Salaman kirkkauden säätö', + 'FlashExposureComp2' => 'Salaman kirkkauden säätö 2', + 'FlashFired' => { + Description => 'Salama lauennut', + PrintConv => { + 'No' => 'Ei', + 'Yes' => 'Kyllä', + }, + }, + 'FlashFirmwareVersion' => 'Salaman laiteohjelmistoversio', + 'FlashFocalLength' => 'Salaman polttoväli', + 'FlashGuideNumber' => 'Salaman ohjeluku', + 'FlashInfoVersion' => 'Salaman tietojen versio', + 'FlashIntensity' => { + Description => 'Salaman teho', + PrintConv => { + 'High' => 'Korkea', + 'Low' => 'Matala', + 'Normal' => 'Normaali', + 'Strong' => 'Voimakas', + 'Weak' => 'Heikko', + }, + }, + 'FlashMetering' => 'Salamamittaus', + 'FlashMeteringSegments' => 'Salaman mittaussegmentit', + 'FlashMode' => { + Description => 'Salamatapa', + PrintConv => { + 'Auto' => 'Automaattinen', + 'Did Not Fire' => 'Ei lauennut', + 'Disabled' => 'Deaktivoitu', + 'Fired, Commander Mode' => 'Lauennut, pakkotapa', + 'Fired, External' => 'Lauennut, ulkoinen', + 'Fired, Manual' => 'Lauennut, manuaalinen', + 'Fired, TTL Mode' => 'Lauennut, TTL-tapa', + 'Force' => 'Pakkotapa', + 'Not Ready' => 'Ei valmis', + 'Off' => 'Pois (3)', + 'On' => 'Päällä (2)', + 'Red eye' => 'Punasilmien esto', + }, + }, + 'FlashModel' => { + Description => 'Salaman malli', + PrintConv => { + 'None' => 'Ei mitään', + }, + }, + 'FlashOptions' => 'Salamavalinnat', + 'FlashOutput' => 'Salaman teho', + 'FlashRemoteControl' => 'Salaman kaukosäätö', + 'FlashSerialNumber' => 'Salaman sarjanumero', + 'FlashSetting' => 'Salaman asetus', + 'FlashShutterSpeed' => 'Suljinaika salamakuvauksessa', + 'FlashStatus' => 'Salaman tila', + 'FlashSyncSpeed' => 'Salaman täsmäysaika', + 'FlashType' => { + Description => 'Salamatyyppi', + PrintConv => { + 'E-System' => 'E-järjestelmä', + 'None' => 'Ei mitään', + 'Simple E-System' => 'Yksinkertainen E-järjestelmä', + }, + }, + 'FlashWarning' => 'Salamavaroitus', + 'FlashpixVersion' => 'Tuettu Flashpix-versio', + 'FlickerReduce' => { + Description => 'Värinän vaimennus', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'FlipHorizontal' => 'Kiepautus vaakatasossa', + 'FocalLength' => 'Polttoväli', + 'FocalLengthIn35mmFormat' => 'Polttoväli 35 mm filmikoolla', + 'FocalPlaneDiagonal' => 'Polttopistetason lävistäjä', + 'FocalPlaneResolutionUnit' => { + Description => 'Polttopistetason resoluutioyksikkö', + PrintConv => { + 'None' => 'Ei mitään', + 'inches' => 'Tuuma', + 'um' => 'µm (mikrometri)', + }, + }, + 'FocalPlaneXResolution' => 'Polttopistetason vaakaresoluutio', + 'FocalPlaneXSize' => 'Polttopistetason leveys', + 'FocalPlaneYResolution' => 'Polttopistetason pystyresoluutio', + 'FocalPlaneYSize' => 'Polttopistetason korkeus', + 'FocalType' => 'Objektiivityyppi', + 'Focus' => 'Tarkennusesivalinta', + 'FocusArea' => 'Tarkennusalue', + 'FocusAreaSelection' => 'Tarkennusalueen valinta', + 'FocusContinuous' => 'Jatkuva tarkennus', + 'FocusDistance' => 'Tarkennusetäisyys', + 'FocusDistanceLower' => 'Lähitarkennus', + 'FocusDistanceUpper' => 'Kaukotarkennus', + 'FocusMode' => { + Description => 'Tarkennustapa', + PrintConv => { + 'Auto' => 'Automaattinen', + 'Manual' => 'Manuaalinen', + }, + }, + 'FocusMode2' => 'Tarkennustapa', + 'FocusPixel' => 'Tarkennuspikseli', + 'FocusPosition' => 'Polttopisteen paikka', + 'FocusProcess' => 'Tarkennusprosessi', + 'FocusRange' => { + Description => 'Tarkennusalue', + PrintConv => { + 'Macro' => 'Makro', + 'Normal' => 'Normaali', + }, + }, + 'FocusSetting' => 'Tarkennusasetus', + 'FocusStepCount' => 'Tarkennusaskelmäärä', + 'FocusWarning' => { + Description => 'Tarkennusvaroitus', + PrintConv => { + 'Good' => 'OK', + 'Out of focus' => 'Epätarkka', + }, + }, + 'FolderName' => 'Kansion nimi', + 'ForwardMatrix1' => 'Eteenpäin-matriisi 1', + 'ForwardMatrix2' => 'Eteenpäin-matriisi 2', + 'FrameHeight' => 'Ruudun korkeus', + 'FrameNumber' => 'Ruudun numero', + 'FrameWidth' => 'Ruudun leveys', + 'FreeByteCounts' => 'Vapaiden tavujen määrät', + 'FreeMemoryCardImages' => 'Muistikortilla tilaa', + 'FreeOffsets' => 'Vapaat siirtymät', + 'FujiFlashMode' => { + Description => 'Salamatila', + PrintConv => { + 'External' => 'Ulkoinen salama', + 'Off' => 'Pois', + 'On' => 'Päällä', + 'Red-eye reduction' => 'Punasilmäisyyden vähennys', + }, + }, + 'GEMInfo' => 'GEM-tiedot', + 'GEModel' => 'Malli', + 'GIFVersion' => 'GIF-versio', + 'GPSAltitude' => 'Korkeus', + 'GPSAltitudeRef' => { + Description => 'Viitekorkeus', + PrintConv => { + 'Above Sea Level' => 'Merenpinnan korkeus', + 'Below Sea Level' => 'Merenpinnan viitekorkeus (negatiivinen arvo)', + }, + }, + 'GPSAreaInformation' => 'GPS-alueen nimi', + 'GPSDOP' => 'Mittaustarkkuus', + 'GPSDateStamp' => 'GPS-päiväys', + 'GPSDestBearing' => 'Kohteen suuntima', + 'GPSDestBearingRef' => { + Description => 'Kohteen suuntiman viite', + PrintConv => { + 'Magnetic North' => 'Magneettinen suunta', + 'True North' => 'Todellinen suunta', + }, + }, + 'GPSDestDistance' => 'Etäisyys kohteeseen', + 'GPSDestDistanceRef' => { + Description => 'Viite etäisyydelle kohteeseen', + PrintConv => { + 'Kilometers' => 'Kilometriä', + 'Miles' => 'Mailia', + 'Nautical Miles' => 'Solmua', + }, + }, + 'GPSDestLatitude' => 'Kohteen leveysaste', + 'GPSDestLatitudeRef' => { + Description => 'Kohteen leveysasteen viite', + PrintConv => { + 'North' => 'Pohjoista leveyttä', + 'South' => 'Eteläistä leveyttä', + }, + }, + 'GPSDestLongitude' => 'Kohteen pituusaste', + 'GPSDestLongitudeRef' => { + Description => 'Kohteen pituusasteen viite', + PrintConv => { + 'East' => 'Itäistä pituutta', + 'West' => 'Läntistä pituutta', + }, + }, + 'GPSDifferential' => { + Description => 'GPS-differentiaalikorjaus', + PrintConv => { + 'Differential Corrected' => 'Differentiaalikorjausta käytetty', + 'No Correction' => 'Mittaus ilman differentiaalikorjausta', + }, + }, + 'GPSImgDirection' => 'Kuvan´ suunta', + 'GPSImgDirectionRef' => { + Description => 'Kuvan suunnan viite', + PrintConv => { + 'Magnetic North' => 'Magneettinen suunta', + 'True North' => 'Todellinen suunta', + }, + }, + 'GPSLatitude' => 'Leveysaste', + 'GPSLatitudeRef' => { + Description => 'Pohjoista tai eteläistä leveyttä', + PrintConv => { + 'North' => 'Pohjoista leveyttä', + 'South' => 'Eteläistä leveyttä', + }, + }, + 'GPSLongitude' => 'Pituusaste', + 'GPSLongitudeRef' => { + Description => 'Itäistä tai läntistä pituutta', + PrintConv => { + 'East' => 'Itäistä pituutta', + 'West' => 'Läntistä pituutta', + }, + }, + 'GPSMapDatum' => 'Käytetty geodeettinen karttadata', + 'GPSMeasureMode' => { + Description => 'GPS-mittaustapa', + PrintConv => { + '2-Dimensional Measurement' => '2-ulotteinen mittaus', + '3-Dimensional Measurement' => '3-ulotteinen mittaus', + }, + }, + 'GPSProcessingMethod' => 'GPS-prosessointimetodin nimi', + 'GPSSatellites' => 'Mittaukseen käytetyt GPS-satelliitit', + 'GPSSpeed' => 'GPS-vastaanottimen nopeus', + 'GPSSpeedRef' => { + Description => 'Nopeusyksikkö', + PrintConv => { + 'km/h' => 'Kilometriä per tunti', + 'knots' => 'Solmua', + 'mph' => 'Mailia per tunti', + }, + }, + 'GPSStatus' => { + Description => 'GPS-vastaanottimen tila', + PrintConv => { + 'Measurement Active' => 'Mittaus aktiivinen', + 'Measurement Void' => 'Mittaus virheellinen', + }, + }, + 'GPSTimeStamp' => 'GPS-aika (atomikello)', + 'GPSTrack' => 'Liikkeen suunta', + 'GPSTrackRef' => { + Description => 'Liikkeen suunnan viite', + PrintConv => { + 'Magnetic North' => 'Magneettinen suunta', + 'True North' => 'Todellinen suunta', + }, + }, + 'GPSVersionID' => 'GPS-tagin versio', + 'GainBase' => 'Perusvahvistus', + 'GainControl' => { + Description => 'Herkkyyden säätö', + PrintConv => { + 'High gain down' => 'Suuri valoisuuden vähennys', + 'High gain up' => 'Suuri valoisuuden lisäys', + 'Low gain down' => 'Pieni valoisuuden vähennys', + 'Low gain up' => 'Pieni valoisuuden lisäys', + 'None' => 'Ei mitään', + }, + }, + 'GammaCompensatedValue' => 'Kompensoidun gamman arvo', + 'GeoTiffAsciiParams' => 'Geo-ASCII -parametrien tagi', + 'GeoTiffDirectory' => 'Geo-avain -hakemiston tagi', + 'GeoTiffDoubleParams' => 'Geo-kaksoisparametrien tagi', + 'Gradation' => 'Porrastus', + 'GrayPoint' => 'Harmaapiste', + 'GrayResponseCurve' => 'Harmaan vastekäyrä', + 'GrayResponseUnit' => { + Description => 'Harmaan vasteyksikkö', + PrintConv => { + '0.0001' => 'Numero edustaa yksikön tuhannesosia', + '0.001' => 'Numero edustaa yksikön sadasosia', + '0.1' => 'Numero edustaa yksikön kymmenyksiä', + '1e-05' => 'Numero edustaa yksikön kymmenestuhannesosia', + '1e-06' => 'Numero edustaa yksikön sadastuhannesosia', + }, + }, + 'GrayScale' => 'Harmaa-asteikko', + 'GrayTRC' => 'Harmaan toonin toistokäyrä', + 'GreenMatrixColumn' => 'Vihreän matriisin sarake', + 'GreenTRC' => 'Vihreän toonin toistokäyrä', + 'GreenX' => 'Vihreä X', + 'GreenY' => 'Vihreä Y', + 'GridDisplay' => 'Ristikko', + 'HCUsage' => 'HC-käyttö', + 'HalftoneHints' => 'Puolisävyviitteet', + 'Headline' => 'Otsikko', + 'HighISONoiseReduction' => { + Description => 'Korkean ISO-tason kohinan vaimennus', + PrintConv => { + 'High' => 'Korkea', + 'Low' => 'Matala', + 'Minimal' => 'Minimaalinen', + 'Normal' => 'Normaali', + 'Off' => 'Pois', + }, + }, + 'Highlight' => 'Valoalue', + 'HighlightData' => 'Valoalueen data', + 'HighlightProtection' => 'Valoalueen suojaus', + 'HometownCity' => 'Kotiseutu', + 'HometownCityCode' => 'Kotiseutukoodi', + 'HometownDST' => { + Description => 'Kotiseudun kesäaika (DST)', + PrintConv => { + 'No' => 'Ei', + 'Yes' => 'Kyllä', + }, + }, + 'HostComputer' => 'Isäntätietokone', + 'Hue' => 'Sävy', + 'HueAdjustment' => 'Värisävyn säätö', + 'HueSetting' => 'Sävyn asetus', + 'HuffmanTable' => 'Huffman-taulukko', + 'ICCProfile' => 'ICC-profiili', + 'ICC_Profile' => 'ICC-syötteen väriprofiili', + 'IPTC-NAA' => 'IPTC-NAA -metadata', + 'IPTCBitsPerSample' => 'Bittien määrä per näyte', + 'IPTCData' => 'IPTC-data', + 'IPTCDigest' => 'IPTC-yhteenveto', + 'IPTCImageHeight' => 'Viivojen määrä', + 'IPTCImageRotation' => { + Description => 'Kuvan kierto', + PrintConv => { + '0' => 'Ei kiertoa', + '180' => '180 asteen kierto', + '270' => '270 asteen kierto', + '90' => '90 asteen kierto', + }, + }, + 'IPTCImageWidth' => 'Pikseleitä per viiva', + 'IPTCPictureNumber' => 'Kuvan numero', + 'IPTCPixelHeight' => 'Pikselikoko suorassa kulmassa skannaussuuntaan', + 'IPTCPixelWidth' => 'Pikselikoko skannaussuunnassa', + 'ISO' => 'ISO-herkkyys', + 'ISOAuto' => 'Automaattinen ISO', + 'ISODisplay' => 'ISO-näyttö', + 'ISOExpansion' => 'ISO-laajennus', + 'ISOFloor' => 'ISO-alaraja', + 'ISOInfo' => 'ISO-tiedot', + 'ISOSelection' => 'ISO-valinta', + 'ISOSetting' => 'ISO-asetus', + 'ISOValue' => 'ISO-arvo', + 'IT8Header' => 'IT8-ylätunniste', + 'Illumination' => 'Näytön valaisu', + 'ImageAdjustment' => 'Kuvan säätö', + 'ImageAreaOffset' => 'Kuva-alueen siirtymä', + 'ImageAuthentication' => { + Description => 'Kuvan aitoustodennus', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'ImageBoundary' => 'Kuvan rajat', + 'ImageByteCount' => 'Kuvan tavumäärä', + 'ImageColorIndicator' => 'Kuvan värin ilmaisin', + 'ImageColorValue' => 'Kuvan värin arvo', + 'ImageCount' => 'Kuvamäärä', + 'ImageData' => 'Kuvadata', + 'ImageDataDiscard' => { + Description => 'Kuvadatan hylkäys', + PrintConv => { + 'Flexbits Discarded' => 'FlexBits hylätty', + 'Full Resolution' => 'Täysi resoluutio', + 'HighPass Frequency Data Discarded' => 'Ylipäästötaajuusdata hylätty', + 'Highpass and LowPass Frequency Data Discarded' => 'Yli- ja alipäästötaajuusdata hylätty', + }, + }, + 'ImageDataSize' => 'Kuvadatan koko', + 'ImageDepth' => 'Kuvan syvyys', + 'ImageDescription' => 'Kuvan otsake', + 'ImageDustOff' => 'Kuvan pölynpoisto', + 'ImageEditCount' => 'Kuvan prosessointimäärä', + 'ImageHeight' => 'Kuvan korkeus', + 'ImageHistory' => 'Kuvahistoria', + 'ImageID' => 'Kuvan ID', + 'ImageInfo' => 'Kuvatiedot', + 'ImageLayer' => 'Kuvataso', + 'ImageNumber' => 'Tiedostonumero', + 'ImageOffset' => 'Kuvan siirtrymä', + 'ImageOptimization' => 'Kuvan optimointi', + 'ImageOrientation' => { + Description => 'Kuvan suunta', + PrintConv => { + 'Landscape' => 'Vaakakuva', + 'Portrait' => 'Pystykuva', + 'Square' => 'Neliömäinen', + }, + }, + 'ImagePrintStatus' => 'Kuvan tulostuksen tila', + 'ImageProcessing' => 'Kuvan prosessointi', + 'ImageProcessingVersion' => 'Kuvaprosessoinnin versio', + 'ImageQuality' => 'Kuvan laatu', + 'ImageQuality2' => 'Kuvan laatu 2', + 'ImageReview' => 'Kuvan tarkastelu', + 'ImageReviewTime' => 'Kuvan katseluaika', + 'ImageRotationStatus' => 'Kuvan kierron tila', + 'ImageSize' => 'Kuvakoko', + 'ImageSourceData' => 'Kuvan lähdedata', + 'ImageSourceEK' => 'EK-kuvalähde', + 'ImageStabilization' => { + Description => 'Kuvanvakautus', + PrintConv => { + 'Best Shot' => 'Paras kuva', + 'Off' => 'Pois', + 'On' => 'Päällä', + 'On, Mode 1' => 'Päällä, tapa 1', + 'On, Mode 2' => 'Päällä, tapa 2', + }, + }, + 'ImageTone' => { + Description => 'Kuvamuoto', + PrintConv => { + 'Bleach Bypass' => 'Bleach bypass -esivalotus', + 'Bright' => 'Kirkas', + 'Landscape' => 'Maisema', + 'Monochrome' => 'Yksivärinen', + 'Muted' => 'Vaimennettu', + 'Natural' => 'Luonnollinen', + 'Portrait' => 'Muotokuva', + 'Reversal Film' => 'Kääntöfilmi', + 'Vibrant' => 'Eloisa', + }, + }, + 'ImageType' => 'Sivu', + 'ImageUniqueID' => 'Kuvan uniikki ID', + 'ImageWidth' => 'Kuvan leveys', + 'Indexed' => 'Indeksoitu', + 'InkNames' => 'Musteiden nimet', + 'InkSet' => 'Mustesarja', + 'IntellectualGenre' => 'Intellektuaalinen genre', + 'IntelligentAuto' => 'Intelligentti automatiikka', + 'IntergraphMatrix' => 'Intergraph-matriisi -tagi', + 'Interlace' => 'Lomitus', + 'InternalFlash' => { + Description => 'Sisäinen salama', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'InternalFlashAE1' => 'Sisäinen salama AE 1?', + 'InternalFlashAE1_0' => 'Sisäinen salama AE 1 (0)?', + 'InternalFlashAE2' => 'Sisäinen salama AE 2?', + 'InternalFlashAE2_0' => 'Sisäinen salama AE 2 (0)?', + 'InternalFlashMode' => 'Sisäisen salaman tapa', + 'InternalFlashStrength' => 'Sisäisen salaman teho', + 'InternalFlashTable' => 'Sisäisen salaman taulukko', + 'InternalSerialNumber' => 'Sisäinen sarjanumero', + 'InteropIndex' => { + Description => 'Interoperabiliteetin identifiointi', + PrintConv => { + 'R03 - DCF option file (Adobe RGB)' => 'R03: DCF-valintatiedosto (Adobe RGB)', + 'R98 - DCF basic file (sRGB)' => 'R98: DCF-perustiedosto (sRGB)', + 'THM - DCF thumbnail file' => 'THM: DCF-näytekuvatiedosto', + }, + }, + 'InteropVersion' => 'Interoperabiliteetin versio', + 'IntervalLength' => 'Ajastusvälin pituus', + 'IntervalMode' => 'Ajastettu kuvaustapa', + 'IntervalNumber' => 'Ajastuksen numero', + 'JFIFVersion' => 'JFIF-versio', + 'JPEGACTables' => 'JPEG:n AC-taulukot', + 'JPEGDCTables' => 'JPEG:n DC-taulukot', + 'JPEGLosslessPredictors' => 'JPEG:n häviöttömät prediktorit', + 'JPEGPointTransforms' => 'JPEG:n pistemuunnot', + 'JPEGProc' => 'JPEG-proc', + 'JPEGQTables' => 'JPEG:n Q-taulukot', + 'JPEGQuality' => { + Description => 'JPEG-laatu', + PrintConv => { + 'Extra Fine' => 'Erityishieno', + 'Fine' => 'Hieno', + 'Standard' => 'Normaali', + 'n/a' => 'Ei asetettu', + }, + }, + 'JPEGRestartInterval' => 'JPEG:n uudelleenaloitusväli', + 'JPEGTables' => 'JPEG-taulukot', + 'JobID' => 'Työn ID', + 'Keyword' => 'Avainsana', + 'Keywords' => 'Avainsana', + 'LCDIllumination' => 'LCD:n valaisu', + 'Language' => 'Kieli', + 'LanguageIdentifier' => 'Kielen tunnistin', + 'LastFileNumber' => 'Viimeinen tiedostonumero', + 'LeafData' => 'Leaf-data', + 'Lens' => 'Objektiivi', + 'LensApertureRange' => 'Objektiivin aukkoalue', + 'LensDataVersion' => 'Objektiividatan versio', + 'LensDistortionParams' => 'Linssivääristymän parametrit', + 'LensFStops' => 'Objektiivin aukkoarvot', + 'LensFirmwareVersion' => 'Objektiivin laiteohjelmistoversio', + 'LensID' => 'Objektiivin ID', + 'LensIDNumber' => 'Objektiivin ID-numero', + 'LensInfo' => 'Objektiivin tiedot', + 'LensSerialNumber' => 'Objektiivin sarjanumero', + 'LensTemperature' => 'Objektiivin lämpötila', + 'LensType' => 'Objektiivityyppi', + 'LightCondition' => 'Valaistusolot', + 'LightReading' => 'Valolukema', + 'LightSource' => { + Description => 'Valonlähde', + PrintConv => { + 'Cloudy' => 'Pilvinen', + 'Cool White Fluorescent' => 'Viileä valkoinen loistelamppu (W 3900 - 4500K)', + 'Day White Fluorescent' => 'Valkoinen päivänvaloloistelamppu (N 4600 - 5400K)', + 'Daylight' => 'Päivänvalo', + 'Daylight Fluorescent' => 'Päivänvaloloistelamppu (D 5700 - 7100K)', + 'Fine Weather' => 'Pilvetön', + 'Flash' => 'Salama', + 'Fluorescent' => 'Loistevalo', + 'ISO Studio Tungsten' => 'ISO studiokeinovalo (hehkulamppu)', + 'Other' => 'Muu valonlähde', + 'Shade' => 'Varjo', + 'Standard Light A' => 'Standardivalo A', + 'Standard Light B' => 'Standardivalo B', + 'Standard Light C' => 'Standardivalo C', + 'Tungsten (Incandescent)' => 'Keinovalo (hehkulamppu)', + 'Unknown' => 'Tuntematon', + 'White Fluorescent' => 'Lämmin valkoinen loistelamppu (WW 3200 - 3700K)', + }, + }, + 'LightSourceSpecial' => { + Description => 'Erikoisvalonlähde', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'LinearResponseLimit' => 'Lineaarisen vasteen raja', + 'LinearizationTable' => 'Linearisaatiotaulukko', + 'LiveViewAF' => 'Suoranäyttö-AF', + 'LocalizedCameraModel' => 'Lokalisoitu kameramalli', + 'Location' => 'Sijainti', + 'LongExposureNoiseReduction' => { + Description => 'Pitkien valotusten kohinan vaimennus', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + 'n/a' => 'Ei asetettu', + }, + }, + 'LookupTable' => 'Hakutaulukko', + 'Luminance' => 'Luminanssi', + 'MB-D10BatteryType' => 'MB-D10 -paristotyyppi', + 'MB-D80Batteries' => 'MB-D80 -paristot', + 'MCUVersion' => 'MCU-versio', + 'Macro' => { + Description => 'Makro', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + 'n/a' => 'Ei asetettu', + }, + }, + 'MacroMode' => { + Description => 'Makrotapa', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + 'Super Macro' => 'Supermakro', + 'Tele-Macro' => 'Telemakro', + }, + }, + 'Magnification' => 'Suurennus', + 'Make' => 'Valmistaja', + 'MakeAndModel' => 'Valmistaja ja malli', + 'MakerNote' => 'DNG-erityistiedot', + 'MakerNoteOffset' => 'Valmistajatietojen siirtymä', + 'MakerNoteSafety' => { + Description => 'Valmistatietojen turvallisuus', + PrintConv => { + 'Safe' => 'Turvallinen', + 'Unsafe' => 'Turvaton', + }, + }, + 'MakerNoteType' => 'Valmistajatietojen tyyppi', + 'MakerNoteVersion' => 'Valmistajatietojen versio', + 'ManometerPressure' => 'Manometrin ilmaisema paine', + 'ManualFlash' => 'Manuaalinen salama', + 'ManualFlashOutput' => 'Salaman käsisäätö', + 'ManualFocusDistance' => 'Manuaalinen etäisyydensäätö', + 'ManufactureDate' => 'Valmistuspäiväys', + 'MaskedAreas' => 'Maskilliset alueet', + 'MasterDocumentID' => 'Alkuperäisdokumentin ID', + 'MasterGain' => 'Yleisvahvistus', + 'MatrixMetering' => 'Matriisimittaus', + 'Matteing' => 'Mattaus', + 'MaxAperture' => 'Suurin aukko', + 'MaxApertureAtCurrentFocal' => 'Suurin aukko nykyisellä polttovälillä', + 'MaxApertureAtMaxFocal' => 'Suurin aukko pisimmällä polttovälillä', + 'MaxApertureAtMinFocal' => 'Suurin aukko lyhimmällä polttovälillä', + 'MaxApertureValue' => 'Objektiivin maksimiaukko', + 'MaxFocalLength' => 'Pisin polttoväli', + 'MaxSampleValue' => 'Näytteen maksimiarvo', + 'MaximumDensityRange' => 'Tiheyden maksimilaajuus', + 'MeasuredEV' => 'Mitattu EV', + 'MeasurementBacking' => 'Mittaustuenta', + 'MeasurementFlare' => 'Hajavalomittaus', + 'MeasurementGeometry' => 'Mittausgeometria', + 'MeasurementIlluminant' => 'Valaistusmittaus', + 'MeasurementObserver' => 'Mittauksen tarkkailija', + 'MediaBlackPoint' => 'Median musta piste', + 'MediaWhitePoint' => 'Median valkoinen piste', + 'Medium' => 'Keskikokoa', + 'MetadataNumber' => 'Metadatan määrä', + 'Metering' => 'Valonmittaus', + 'MeteringMode' => { + Description => 'Valonmittaustapa', + PrintConv => { + 'Average' => 'Keskiarvo', + 'Center-weighted average' => 'Keskustapainotteinen keskiarvo', + 'Multi-segment' => 'Monisegmenttimittaus', + 'Multi-spot' => 'Monipiste', + 'Other' => 'Muu', + 'Partial' => 'Osa-alue', + 'Pattern+AF' => 'Kuvio + AF', + 'Spot' => 'Pistemittaus', + 'Spot+Highlight control' => 'Pistemittaus + valoalueen säätö', + 'Spot+Shadow control' => 'Pistemittaus + varjoalueen säätö', + 'Unknown' => 'Tuntematon', + }, + }, + 'MeteringTime' => 'Mittausaika', + 'MinAperture' => 'Pienin aukko', + 'MinFocalLength' => 'Lyhin polttoväli', + 'MinSampleValue' => 'Näytteen minimiarvo', + 'MinoltaCameraSettings2' => 'Kameran asetukset 2', + 'MinoltaCameraSettings5D' => 'Kameran asetukset (5D)', + 'MinoltaCameraSettings7D' => 'Kamera-asetukset (7D)', + 'MinoltaMakerNote' => 'Minolta-valmistajatiedot', + 'MinoltaQuality' => { + Description => 'Kuvakoko', + PrintConv => { + 'Economy' => 'Taloudellinen', + 'Extra fine' => 'Erityishieno', + 'Fine' => 'Hieno', + 'Standard' => 'Normaali', + 'Super Fine' => 'Superhieno', + }, + }, + 'Model' => 'Malli', + 'Model2' => 'Kuvasyötelaitteen malli (2)', + 'ModelAndVersion' => 'Malli ja versio', + 'ModelID' => 'Mallin ID', + 'ModelTiePoint' => 'Sidospistemalli-tagi', + 'ModelTransform' => 'Muuntomalli-tagi', + 'ModelingFlash' => 'Mallinnussalama', + 'ModifiedDigitalGain' => 'Modifioitu digitaalinen vahvistus', + 'ModifiedInfo' => 'Modifioidut tiedot', + 'ModifiedParamFlag' => 'Modifioitu parametrilippu', + 'ModifiedPictureStyle' => 'Modifioitu kuvan tyyli', + 'ModifiedSaturation' => { + Description => 'Modifoitu värikylläisyys', + PrintConv => { + 'CM1 (Red Enhance)' => 'CM1 (punaisen parantelu)', + 'CM2 (Green Enhance)' => 'CM2 (vihreän parantelu)', + 'CM3 (Blue Enhance)' => 'CM3 (sinisen parantelu)', + 'CM4 (Skin Tones)' => 'CM4 (ihonvärin parantelu)', + 'Off' => 'Pois', + }, + }, + 'ModifiedSensorBlueLevel' => 'Modifioitu anturin sinitaso', + 'ModifiedSensorRedLevel' => 'Modifioitu anturin punataso', + 'ModifiedSharpness' => 'Modifioitu terävyys', + 'ModifiedToneCurve' => 'Modifioitu sävykäyrä', + 'ModifiedWhiteBalance' => 'Modifioitu valkotasapaino', + 'ModifiedWhiteBalanceBlue' => 'Modifioitu valkotasapainon sininen', + 'ModifiedWhiteBalanceRed' => 'Modifioitu valkotasapainon punainen', + 'ModifyDate' => 'Tiedostomuutoksen päiväys ja aika', + 'MultiExposure' => 'Monivalotusdata', + 'MultiExposureAutoGain' => 'Monivalotuksen automaattivalotus', + 'MultiExposureMode' => 'Monivalotustapa', + 'MultiExposureShots' => 'Monivalotusotoksia', + 'MultiExposureVersion' => 'Monivalotusdatan versio', + 'MultiSample' => 'Moninäyte', + 'MultiSelector' => 'Monivalitsin', + 'MultipleExposureSet' => 'Monivalotus', + 'MyColorMode' => 'Oma värimuoto', + 'NDFilter' => 'ND-suodin', + 'NEFLinearizationTable' => 'Linearisaatiotaulukko', + 'NamedColor2' => 'Nimetty väri 2', + 'NativeDisplayInfo' => 'Paikallisen näytön tiedot', + 'NativeResolutionUnit' => 'Paikallisen resoluution yksikkö', + 'NativeXResolution' => 'Paikallinen vaakaresoluutio', + 'NativeYResolution' => 'Paikallinen pystyresoluutio', + 'NikonCaptureData' => 'Nikon Capture -data', + 'NikonCaptureOffsets' => 'Nikon Capture -siirtymät', + 'NikonCaptureOutput' => 'Nikon Capture -tuotos', + 'NikonCaptureVersion' => 'Nikon Capture -versio', + 'NikonICCProfile' => 'Nikon ICC-profiilin osoitin', + 'NoMemoryCard' => 'Ei muistikorttia', + 'Noise' => 'Kohina', + 'NoiseFilter' => 'Kohinasuodin', + 'NoiseReduction' => { + Description => 'Kohinan vähennys', + PrintConv => { + 'High (+1)' => '+1 (korkea)', + 'Highest (+2)' => '+2 (korkein)', + 'Low' => 'Matala', + 'Low (-1)' => '-1 (matala)', + 'Lowest (-2)' => '-2 (matalin)', + 'Normal' => 'Vakio', + 'Off' => 'Pois', + 'On' => 'Päällä', + 'Standard' => '±0 (vakio)', + }, + }, + 'NoiseReductionApplied' => 'Suoritettu kohinan vähennys', + 'NoiseReductionData' => 'Kohinanvaimennusdata', + 'NoiseReductionIntensity' => 'Kohinanvaimennuksen voimakkuus', + 'NoiseReductionMethod' => 'Kohinanvaimennusmetodi', + 'NoiseReductionSharpness' => 'Kohinanvaimennuksen terävyys', + 'NumIndexEntries' => 'Indeksimerkintöjen määrä', + 'NumberOfChannels' => 'Kanavien määrä', + 'NumberofInks' => 'Musteiden numerot', + 'OPIProxy' => 'OPI-välipalvelin', + 'ObjectAttributeReference' => 'Intellektuaalinen genre', + 'ObjectCycle' => { + Description => 'Objektin sykli', + PrintConv => { + 'Both Morning and Evening' => 'Molempina', + 'Evening' => 'Iltaisin', + 'Morning' => 'Aamuisin', + }, + }, + 'ObjectDistance' => 'Kohteen etäisyys', + 'ObjectName' => 'Nimike', + 'ObjectPreviewData' => 'Objektidatan esikatseludata', + 'ObjectPreviewFileFormat' => 'Objektidatan esikatselun tiedostomuoto', + 'ObjectPreviewFileVersion' => 'Objektidatan esikatselun tiedostomuodon versio', + 'ObjectTypeReference' => 'Objektyypin viiteryhmä', + 'OffsetSchema' => 'Siirtymäskeema', + 'OlympusImageHeight' => 'Kuvan korkeus', + 'OlympusImageWidth' => 'Kuvan leveys', + 'OneTouchWB' => { + Description => 'Pikavalkotasapaino', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + 'On (Preset)' => 'Päällä (esiasetus)', + }, + }, + 'OpticalZoomCode' => 'Optisen zoomin koodi', + 'OpticalZoomMode' => { + Description => 'Optinen zoomaustapa', + PrintConv => { + 'Extended' => 'Laajennettu', + 'Standard' => 'Vakio', + }, + }, + 'OpticalZoomOn' => { + Description => 'Optinen zoom', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'Opto-ElectricConvFactor' => 'Optoelektrinen muuntokerroin', + 'OrderNumber' => 'Valokuva-CD:n ostotilausnumero', + 'Orientation' => { + Description => 'Kuvan suunta', + PrintConv => { + 'Horizontal (normal)' => '0° (ylä/vasen)', + 'Mirror horizontal' => '0° (ylä/oikea)', + 'Mirror horizontal and rotate 270 CW' => '90° myötäpäivään (vasen/ylä)', + 'Mirror horizontal and rotate 90 CW' => '90° vastapäivään (oikea/ala)', + 'Mirror vertical' => '180° (ala/vasen)', + 'Rotate 180' => '180° (ala/oikea)', + 'Rotate 270 CW' => '90° myötäpäivään (vasen/ala)', + 'Rotate 90 CW' => '90° vastapäivään (oikea/ylä)', + }, + }, + 'OriginalDecisionDataOffset' => 'Alkuperäisen ratkaisudatan siirtymä', + 'OriginalRawFileData' => 'Originaali raw-tiedoston data', + 'OriginalRawFileDigest' => 'Alkuperäisen raw-tiedoston tiivistelmä', + 'OriginalRawFileName' => 'Originaali raw-tiedoston nimi', + 'OriginalTransmissionReference' => 'Tehtävän tunnistin', + 'OriginatingProgram' => 'Luontiohjelma', + 'OutputImageHeight' => 'Tuotoskuvan korkeus', + 'OutputImageWidth' => 'Tuotoskuvan leveys', + 'OutputResolution' => 'Tuotoksen resoluutio', + 'OutputResponse' => 'Tuotosvaste', + 'OwnerID' => 'Omistajan ID', + 'OwnerName' => 'Omistajan nimi', + 'Padding' => 'Täyte', + 'PageName' => 'Sivun nimi', + 'PageNumber' => 'Sivunumero', + 'PanasonicExifVersion' => 'Panasonic-exif -versio', + 'PanasonicRawVersion' => 'Panasonic-RAW:n versio', + 'PanasonicTitle' => 'Otsikko', + 'PanoramaDirection' => 'Panoraaman suunta', + 'PanoramaMode' => 'Panoraamatapa', + 'PentaxImageSize' => { + Description => 'Pentax-kuvakoko', + PrintConv => { + '2304x1728 or 2592x1944' => '2304 x 1728 tai 2592 x 1944', + '2560x1920 or 2304x1728' => '2560 x 1920 tai 2304 x 1728', + '2816x2212 or 2816x2112' => '2816 x 2212 tai 2816 x 2112', + '3008x2008 or 3040x2024' => '3008 x 2008 tai 3040 x 2024', + 'Full' => 'Täysi', + }, + }, + 'PentaxVersion' => 'Pentax-versio', + 'People' => 'Ihmiset', + 'PeripheralLighting' => 'Oheislaitevalaistus', + 'PeripheralLightingSetting' => 'Oheislaitevalaistuksen asetus', + 'PeripheralLightingValue' => 'Oheislaitevalaistuksen arvo', + 'PhotoEffect' => 'Valokuvaefekti', + 'PhotoEffects' => 'Valokuvaefektit', + 'PhotoEffectsBlue' => 'Valokuvaefekti sininen', + 'PhotoEffectsData' => 'Valokuvaefektidata', + 'PhotoEffectsGreen' => 'Valokuvaefekti vihreä', + 'PhotoEffectsRed' => 'Valokuvaefekti punainen', + 'PhotoEffectsType' => 'Valokuvaefektityyppi', + 'PhotometricInterpretation' => { + Description => 'Pikseliskeema', + PrintConv => { + 'BlackIsZero' => 'Musta on nolla', + 'Color Filter Array' => 'CFA (värisuodinmatriisi)', + 'Pixar LogL' => 'CIE Log2(L) (Log-luminanssi)', + 'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (Log-luminanssi ja -krominanssi)', + 'RGB Palette' => 'Väripaletti', + 'Transparency Mask' => 'Läpinäkyvyysmaski', + 'WhiteIsZero' => 'Valkoinen on nolla', + }, + }, + 'PhotoshopBGRThumbnail' => 'Photoshopin BRG-näytekuva', + 'PhotoshopFormat' => 'Photoshop-muoto', + 'PhotoshopQuality' => 'Photoshop-laatu', + 'PictInfo' => 'Kuvatiedot', + 'PictureControl' => 'Kuvan optimointi', + 'PictureControlActive' => 'Kuvan käsittely aktivoitu', + 'PictureControlAdjust' => 'Kuvan optimoinnin säätö', + 'PictureControlBase' => 'Kuvan perusoptimointi', + 'PictureControlData' => 'Kuvan käsittely', + 'PictureControlMode' => 'Kuvan käsittelytapa', + 'PictureControlName' => 'Kuvan optimoinnin nimi', + 'PictureControlQuickAdjust' => 'Kuvan optimoinnin pikasäätö', + 'PictureControlVersion' => 'Kuvan optimoinnin versio', + 'PictureFinish' => 'Kuvan viimeistely', + 'PictureMode' => { + Description => 'Kuvausohjelma', + PrintConv => { + 'Anti-blur' => 'Epätarkkuden vähennys', + 'Aperture-priority AE' => 'Aukon esivalinta AE', + 'Auto' => 'Automaattinen', + 'Beach' => 'Hiekkaranta', + 'Beach & Snow' => 'Hiekkaranta & Lumi', + 'Fireworks' => 'Ilotulitus', + 'Flower' => 'Kukka', + 'Landscape' => 'Maisema', + 'Macro' => 'Lähikuva (Kukka)', + 'Manual' => 'Manuaalinen', + 'Museum' => 'Museo', + 'Natural Light' => 'Luonnonvalo', + 'Natural Light & Flash' => 'Luonnonvalo & Salama', + 'Night Scene' => 'Yö', + 'Party' => 'Juhlat', + 'Portrait' => 'Muotokuva', + 'Program AE' => 'Automaattinen valotusohjelma', + 'Shutter speed priority AE' => 'Ajan esivalinta AE', + 'Snow' => 'Lumi', + 'Sports' => 'Urheilu', + 'Sunset' => 'Auringonlasku', + 'Text' => 'Teksti', + 'Underwater' => 'Veden alla', + }, + }, + 'PictureMode2' => 'Kuvamuoto 2', + 'PictureModeBWFilter' => { + Description => 'BW-suodin -kuvamuoto', + PrintConv => { + 'Green' => 'Vihreä', + 'Neutral' => 'Neutraali', + 'Orange' => 'Oranssi', + 'Red' => 'Punainen', + 'Yellow' => 'Keltainen', + 'n/a' => 'E.s.', + }, + }, + 'PictureModeContrast' => 'Kontrastinen kuvamuoto', + 'PictureModeHue' => 'Sävykäs kuvamuoto?', + 'PictureModeSaturation' => 'Värikylläinen kuvamuoto', + 'PictureModeSharpness' => 'Terävä kuvamuoto', + 'PictureModeTone' => { + Description => 'Vivahteikas kuvamuoto', + PrintConv => { + 'Blue' => 'Sininen', + 'Green' => 'Vihreä', + 'Neutral' => 'Neutraali', + 'Purple' => 'Violetti', + 'Sepia' => 'Seepia', + 'n/a' => 'E.s.', + }, + }, + 'PictureStyle' => 'Kuvan tyyli', + 'PixelAspectRatio' => 'Pikselien kokosuhde', + 'PixelFormat' => 'Pikseliformaatti', + 'PixelIntensityRange' => 'Pikseli-intensiteetin alue', + 'PixelScale' => 'Pikseliasteikkomalli-tagi', + 'PlanarConfiguration' => { + Description => 'Kuvadatan järjestys', + PrintConv => { + 'Chunky' => 'Lohkoformaatti (lomitettu)', + 'Planar' => 'Tasoformaatti', + }, + }, + 'PlaybackMenusTime' => 'Toistovalikkojen aika', + 'PowerSource' => 'Virtalähde', + 'PreCaptureFrames' => 'Esiasetetut kehykset', + 'Predictor' => { + Description => 'Prediktori', + PrintConv => { + 'Horizontal differencing' => 'Horisontaalinen differointi', + 'None' => 'Prediktioskeemaa ei käytetty ennen koodausta', + }, + }, + 'Preview' => 'Esikatselu', + 'Preview0' => 'Esikatselu 0', + 'Preview1' => 'Esikatselu 1', + 'Preview2' => 'Esikatselu 2', + 'PreviewApplicationName' => 'Sovelluksen nimen esikatselu', + 'PreviewApplicationVersion' => 'Sovellusversion esikatselu', + 'PreviewColorSpace' => { + Description => 'Väriavaruuden esikatselu', + PrintConv => { + 'Unknown' => 'Tuntematon', + }, + }, + 'PreviewDateTime' => 'Päiväyksen ja ajan esikatselu', + 'PreviewImage' => 'Kuvan esikatselu', + 'PreviewImageBorders' => 'Kuvan reunojen esikatselu', + 'PreviewImageData' => 'Kuvadatan tarkastelu', + 'PreviewImageLength' => 'Kuvan pituuden esikatselu', + 'PreviewImageSize' => 'Kuvakoon esikatselu', + 'PreviewImageStart' => 'Esikatselukuvan alku', + 'PreviewImageValid' => { + Description => 'Kelvollinen esikatselukuva', + PrintConv => { + 'No' => 'Ei', + 'Yes' => 'Kyllä', + }, + }, + 'PreviewSettingsDigest' => 'Asetustiivistelmän esikatselu', + 'PreviewSettingsName' => 'Asetusten nimen esikatselu', + 'PrimaryAFPoint' => 'Ensisijainen AF-piste', + 'PrimaryChromaticities' => 'Päävärien kromaattisuudet', + 'PrimaryPlatform' => 'Primaari alusta', + 'PrintQuality' => 'Tulostuslaatu', + 'ProcessingInfo' => 'Prosessointitiedot', + 'ProcessingSoftware' => 'Prosessointiohjelmisto', + 'ProductID' => 'Tuotteen ID', + 'ProfileCMMType' => 'CMM-tyypin profiili', + 'ProfileCalibrationSig' => 'Profiilin kalibrointitunniste', + 'ProfileClass' => 'Profiilin luokka', + 'ProfileConnectionSpace' => 'Profiilin yhteystila', + 'ProfileCopyright' => 'Profiilin copyright', + 'ProfileCreator' => 'Profiilin luoja', + 'ProfileDateTime' => 'Profiilin päiväysaika', + 'ProfileDescription' => 'Profiilin kuvaus', + 'ProfileDescriptionML' => 'Monikieliprofiilin kuvaus', + 'ProfileEmbedPolicy' => { + Description => 'Profiilin upotusmenetelmä', + PrintConv => { + 'Allow Copying' => 'Salli kopiointi', + 'Embed if Used' => 'Upota jos käytössä', + 'Never Embed' => 'Älä koskaan upota', + 'No Restrictions' => 'Ei rajoituksia', + }, + }, + 'ProfileFileSignature' => 'Profiilidatan tunniste', + 'ProfileHueSatMapData1' => 'Profiilin Sävy Värik. -kartan data 1', + 'ProfileHueSatMapData2' => 'Profiilin Sävy Värik. -kartan data 2', + 'ProfileID' => 'Profiilin ID', + 'ProfileLookTableData' => 'Profiilin hakutaulukon data', + 'ProfileName' => 'Profiilin nimi', + 'ProfileSequenceDesc' => 'Profiilisarjan kuvaus', + 'ProfileToneCurve' => 'Profiilin toonin käyrä', + 'ProfileVersion' => 'Profiilin versio', + 'ProgramISO' => 'Ohjelma-ISO', + 'ProgramLine' => 'Valotusohjelma', + 'ProgramMode' => 'Ohjelman muoto', + 'ProgramShift' => 'Ohjelmasiirto', + 'ProgramVersion' => 'Ohjelmaversio', + 'ProgressiveScans' => 'Progressiiviset skannaukset', + 'Province-State' => 'Provinssi/Valtio', + 'Quality' => { + Description => 'Laatu', + PrintConv => { + 'Best' => 'Paras', + 'Better' => 'Parempi', + 'Compressed RAW' => 'Pakattu RAW', + 'Compressed RAW + JPEG' => 'Pakattu RAW + JPEG', + 'Economy' => 'Taloudellinen', + 'Extra Fine' => 'Erityishieno', + 'Fine' => 'Hieno', + 'Good' => 'Hyvä', + 'Normal' => 'Normaali', + 'Standard' => 'Vakio', + 'Super Fine' => 'Superhieno', + 'n/a' => 'Ei asetettu', + }, + }, + 'Quality2' => 'Laatu 2', + 'QualityMode' => { + Description => 'Kuvalaatu', + PrintConv => { + 'Economy' => 'Taloudellinen', + 'Fine' => 'Hieno', + 'Normal' => 'Normaali', + }, + }, + 'QuantizationMethod' => { + Description => 'Kvantisointimetodi', + PrintConv => { + 'AP Domestic Analogue' => 'AP domestinen analogia', + 'Color Space Specific' => 'Erityisväriavaruus', + 'Compression Method Specific' => 'Erityispakkausmetodi', + 'Gamma Compensated' => 'Kompensoitu gamma', + 'IPTC Ref B' => 'IPTC ref "B"', + 'Linear Density' => 'Lineaarinen tiheys', + 'Linear Dot Percent' => 'Lineaarinen pisteprosentti', + 'Linear Reflectance/Transmittance' => 'Lineaarinen heijastavuus/läpäisevyys', + }, + }, + 'QuickAdjust' => 'Pikasäätö', + 'QuickShot' => { + Description => 'Pikakuvaus', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'ROCInfo' => 'ROC-tiedot', + 'RangeFinder' => 'Alue-etsin', + 'RasterPadding' => 'Rasteritäyte', + 'RasterizedCaption' => 'Rasteroitu seloste', + 'Rating' => 'Arvostelu', + 'RawDataOffset' => 'RAW-datan siirtymä', + 'RawDataUniqueID' => 'Raw-datan uniikki ID', + 'RawDevColorSpace' => 'Väriavaruus', + 'RawDevContrastValue' => 'Kontrastiarvo', + 'RawDevEditStatus' => { + Description => 'Editointitila', + PrintConv => { + 'Edited (Landscape)' => 'Studio (maisema)', + 'Edited (Portrait)' => 'Studio (muotokuva)', + 'Original' => 'Alkuperäinen', + }, + }, + 'RawDevEngine' => { + Description => 'Moottori', + PrintConv => { + 'Advanced High Speed' => 'Edistynyt suurnopeus', + 'High Function' => 'Hyvä suorituskyky', + 'High Speed' => 'Suurnopeus', + }, + }, + 'RawDevExposureBiasValue' => 'Valotuksen korjausarvo', + 'RawDevGrayPoint' => 'Harmaapiste', + 'RawDevMemoryColorEmphasis' => 'Muistivärin korostus', + 'RawDevNoiseReduction' => 'Kohinasuodin (ISO-tehostus)', + 'RawDevSaturationEmphasis' => 'Värikylläisyyden korostus', + 'RawDevSettings' => 'Kohinanvaimennus', + 'RawDevSharpnessValue' => 'Kontrastiarvo', + 'RawDevVersion' => 'RAW-kehityksen versio', + 'RawDevWBFineAdjustment' => 'Valkotasapainon hienosäätö', + 'RawDevWhiteBalanceValue' => 'Valkotasapainon arvo', + 'RawImageCenter' => 'RAW-kuvan keskusta', + 'RawImageDigest' => 'RAW-kuvan tiivistelmä', + 'RawImageHeight' => 'Kuvan korkeus', + 'RawImageSize' => 'RAW-kuvakoko', + 'RawImageWidth' => 'Kuvan leveys', + 'RawInfoVersion' => 'RAW Info -versio', + 'RecognizedFace1Age' => 'Tunnistettujen kasvojen 1 ikä', + 'RecognizedFace1Name' => 'Tunnistettujen kasvojen 1 nimi', + 'RecognizedFace1Position' => 'Tunnistettujen kasvojen 1 sijainti', + 'RecognizedFace2Age' => 'Tunnistettujen kasvojen 2 ikä', + 'RecognizedFace2Name' => 'Tunnistettujen kasvojen 2 nimi', + 'RecognizedFace2Position' => 'Tunnistettujen kasvojen 2 sijainti', + 'RecognizedFace3Age' => 'Tunnistettujen kasvojen 2 ikä', + 'RecognizedFace3Name' => 'Tunnistettujen kasvojen 3 nimi', + 'RecognizedFace3Position' => 'Tunnistettujen kasvojen 3 sijainti', + 'RecognizedFaceFlags' => 'Tunnistettujen kasvojen liput', + 'RecordMode' => { + Description => 'Tallennustapa', + PrintConv => { + 'Aperture Priority' => 'Aukon esivalinta', + 'Best Shot' => 'Paras kuva', + 'Manual' => 'Manuaalinen', + 'Movie' => 'Elokuva', + 'Movie (19)' => 'Elokuva (19)', + 'Program AE' => 'AE-ohjelma', + 'Shutter Priority' => 'Ajan esivalinta', + 'YouTube Movie' => 'YouTube-elokuva', + }, + }, + 'RecordShutterRelease' => { + Description => 'Laukaisujen tallennus', + PrintConv => { + 'Press start, press stop' => 'Aloitus painaen, lopetus painaen', + 'Record while down' => 'Tallennus laukaisin alhaalla', + }, + }, + 'RecordingMode' => 'Tallennustapa', + 'RedBalance' => 'Punatasapaino', + 'RedEyeCorrection' => 'Punasilmäkorjaus', + 'RedEyeData' => 'Punasilmädata', + 'RedMatrixColumn' => 'Punaisen matriisin sarake', + 'RedTRC' => 'Punaisen toonin toistokäyrä', + 'RedX' => 'Punainen X', + 'RedY' => 'Punainen Y', + 'ReductionMatrix1' => 'Reduktiomatriisi 1', + 'ReductionMatrix2' => 'Reduktiomatriisi 2', + 'ReferenceBlackWhite' => 'Musta ja valkoinen viitearvopari', + 'ReferenceDate' => 'Viitepäiväys', + 'ReferenceNumber' => 'Viitenumero', + 'ReferenceService' => 'Viitepalvelu', + 'RelatedImageFileFormat' => 'Kuvatiedoston muoto', + 'RelatedImageHeight' => 'Kuvan korkeus', + 'RelatedImageWidth' => 'Kuvan leveys', + 'RelatedSoundFile' => 'Asiaan liittyvä audiotiedosto', + 'ReleaseButtonToUseDial' => 'Käytä valitsinta vapauttaen painike', + 'ReleaseDate' => 'Julkaisupäiväys', + 'ReleaseMode' => 'Laukaisutapa', + 'ReleaseTime' => 'Julkaisuaika', + 'RemoteOnDuration' => 'Kaukolaukaisin', + 'RenderingIntent' => 'Muokkausmenetelmä', + 'Resaved' => { + Description => 'Tallennus uudelleen', + PrintConv => { + 'No' => 'Ei', + 'Yes' => 'Kyllä', + }, + }, + 'ResolutionMode' => 'Resoluutiomuoto', + 'ResolutionUnit' => { + Description => 'X- ja Y-resoluution yksikkö', + PrintConv => { + 'None' => 'Ei mitään', + 'inches' => 'Tuuma', + }, + }, + 'RetouchHistory' => 'Korjailuhistoria', + 'ReverseIndicators' => 'Käänteiset ilmaisimet', + 'RevisionNumber' => 'Revision numero', + 'RollGuidElements' => 'Guid-elementtien vieritys', + 'Rotation' => { + Description => 'Kierto', + PrintConv => { + 'Horizontal (normal)' => 'Vaakatasossa (normaali)', + 'Rotate 270 CW' => 'Kierto 90° VP', + 'Rotate 90 CW' => 'Kierto 90° MP', + }, + }, + 'RowInterleaveFactor' => 'Rivin lomitusfaktori', + 'RowsPerStrip' => 'Rivien määrä per strippi', + 'SBAExposureRecord' => 'SBA-valotuksen tallennus', + 'SBAInputImageBitDepth' => 'SBA-syötekuvan bittisyvyys', + 'SBAInputImageColorspace' => 'SBA-syötekuvan väriavaruus', + 'SMaxSampleValue' => 'S-maksimiminäytteen arvo', + 'SMinSampleValue' => 'S-miniminäytteen arvo', + 'SRFocalLength' => 'Vakain (SR) eri polttoväleillä', + 'SRResult' => 'Kuvanvakain', + 'SampleFormat' => 'Näyteformaatti', + 'SampleStructure' => { + Description => 'Näytteiden rakenne', + PrintConv => { + 'CompressionDependent' => 'Määritetty pakkaustoiminnon yhteydessä', + 'Orthogonal4-2-2Sampling' => 'Toisistaan riippumattomat näytetaajuuksin suhteessa 4:2:2:(4)', + 'OrthogonalConstangSampling' => 'Toisistaan riippumattomat samoin suhteellisin näytetaajuuksin kussakin komponentissa', + }, + }, + 'SamplesPerPixel' => 'Komponenttien määrä', + 'SanyoQuality' => { + Description => 'Sanyo-laatu', + PrintConv => { + 'Fine/High' => 'Hieno/korkea', + 'Fine/Low' => 'Hieno/matala', + 'Fine/Medium' => 'Hieno/keskilaatu', + 'Fine/Medium High' => 'Hieno/korkeahko', + 'Fine/Medium Low' => 'Hieno/matalahko', + 'Fine/Super High' => 'Hieno/superkorkea', + 'Fine/Very High' => 'Hieno/hyvin korkea', + 'Fine/Very Low' => 'Hieno/hyvin matala', + 'Normal/High' => 'Normaali/korkea', + 'Normal/Low' => 'Normaali/matala', + 'Normal/Medium' => 'Normaali/keskilaatu', + 'Normal/Medium High' => 'Normaali/korkeahko', + 'Normal/Medium Low' => 'Normaali/matalahko', + 'Normal/Super High' => 'Normaali/superkorkea', + 'Normal/Very High' => 'Normaali/hyvin korkea', + 'Normal/Very Low' => 'Normaali/hyvin matala', + 'Super Fine/High' => 'Superhieno/korkea', + 'Super Fine/Low' => 'Superhieno/matala', + 'Super Fine/Medium' => 'Superhieno/keskilaatu', + 'Super Fine/Medium High' => 'Superhieno/korkeahko', + 'Super Fine/Medium Low' => 'Superhieno/matalahko', + 'Super Fine/Super High' => 'Superhieno/superkorkea', + 'Super Fine/Very High' => 'Superhieno/hyvin korkea', + 'Super Fine/Very Low' => 'Superhieno/hyvin matala', + }, + }, + 'SanyoThumbnail' => 'Sanyo-näytekuva', + 'Saturation' => { + Description => 'Värikylläisyys', + PrintConv => { + '+1 (medium high)' => 'Korkeahko', + '+2 (high)' => 'Korkea', + '-1 (medium low)' => 'Matalahko', + '0 (normal)' => 'Vakio', + 'Film Simulation' => 'Filminsimulaatio', + 'High' => 'Korkea', + 'Low' => 'Matala', + 'Medium High' => 'Korkeahko', + 'Medium Low' => 'Matalahko', + 'None (B&W)' => 'Ei mitään (M&V)', + 'Normal' => 'Vakio', + }, + }, + 'SaturationFaithful' => 'Kohdeuskollinen värikylläisyys', + 'SaturationLandscape' => 'Maisemakuvan värikylläisyys', + 'SaturationNeutral' => 'Neutraali värikylläisyys', + 'SaturationPortrait' => 'Muotokuvan värikylläisyys', + 'SaturationSetting' => 'Värikylläisyyden sasetus', + 'SaturationStandard' => 'Vakiovärikylläisyys', + 'ScanImageEnhancer' => { + Description => 'Skannauskuvan parantelu', + PrintConv => { + 'Off' => 'Pois', + }, + }, + 'ScanningDirection' => { + Description => 'Skannaussuunta', + PrintConv => { + 'Bottom-Top, L-R' => 'Alhaalta ylös, vasemmalta oikealle', + 'Bottom-Top, R-L' => 'Alhaalta ylös, oikealta vasemmalle', + 'L-R, Bottom-Top' => 'Vasemmalta oikealle, alhaalta ylös', + 'L-R, Top-Bottom' => 'Vasemmalta oikealle, ylhäältä alas', + 'R-L, Bottom-Top' => 'Oikealta vasemmalle, alhaalta ylös', + 'R-L, Top-Bottom' => 'Oikealta vasemmalle, ylhäältä alas', + 'Top-Bottom, L-R' => 'Ylhäältä alas, vasemmalta oikealle', + 'Top-Bottom, R-L' => 'Ylhäältä alas, oikealta vasemmalle', + }, + }, + 'Scene' => 'Näyttämö', + 'SceneArea' => 'Näkymäalue?', + 'SceneAssist' => 'Näkymä-avustaja', + 'SceneCaptureType' => { + Description => 'Kuvatun näkymän tyyppi', + PrintConv => { + 'Landscape' => 'Maisema', + 'Night' => 'Yönäkymä', + 'Portrait' => 'Muotokuva', + 'Standard' => 'Standardi', + }, + }, + 'SceneDetect' => 'Kohtauksen tunnistus', + 'SceneMode' => { + Description => 'Näkymän muoto', + PrintConv => { + '2 in 1' => '2 1:ssä', + 'Auction' => 'Huutokauppa', + 'Auto' => 'Automaattinen', + 'Available Light' => 'Vallitseva valo', + 'Beach' => 'Hiekkaranta', + 'Beach & Snow' => 'Hiekkaranta&Lumi', + 'Behind Glass' => 'Lasin takaa', + 'Candle' => 'Kynttilä', + 'Children' => 'Lapset', + 'Cuisine' => 'Ateria', + 'Digital Image Stabilization' => 'Digitaalinen kuvanvakautus', + 'Documents' => 'Dokumentit', + 'Face Portrait' => 'Kasvokuva', + 'Fireworks' => 'Ilotulitus', + 'Food' => 'Ateria', + 'High Key' => 'High key -yläsävykuva', + 'Indoor' => 'Sisäkuva', + 'Landscape' => 'Maisema', + 'Landscape+Portrait' => 'Maisema+muotokuva', + 'Low Key' => 'Low key -alasävykuva', + 'Macro' => 'Makro', + 'Movie' => 'Elokuva', + 'Museum' => 'Museo', + 'My Mode' => 'Oma tapa', + 'Nature Macro' => 'Luontomakro', + 'Night Portrait' => 'Yön muotokuva', + 'Night Scene' => 'Iltanäkymä', + 'Night View/Portrait' => 'Iltanäkymä/Yön muotokuva', + 'Night+Portrait' => 'Yö+muotokuva', + 'Normal' => 'Normaali', + 'Panorama' => 'Panoraama', + 'Pet' => 'Lemmikki', + 'Portrait' => 'Muotokuva', + 'Self Portrait' => 'Omakuva', + 'Self Portrait+Self Timer' => 'Omakuva+itselaukaisin', + 'Self Protrait+Timer' => 'Omakuva+itselaukaisin', + 'Shoot & Select' => 'Kuvaa & Valitse', + 'Shoot & Select1' => 'Kuvaus&valinta 1', + 'Shoot & Select2' => 'Kuvaus&valinta 2', + 'Shooting Guide' => 'Kuvausopas', + 'Smile Shot' => 'Hymykuva', + 'Snow' => 'Lumi', + 'Sport' => 'Urheilu', + 'Sports' => 'Urheilutapahtuma', + 'Standard' => 'Vakio', + 'Sunset' => 'Auringonlasku', + 'Super Macro' => 'Supermakro', + 'Text' => 'Teksti', + 'Underwater Macro' => 'Veden alla makro', + 'Underwater Snapshot' => 'Veden alla tilannekuva', + 'Underwater Wide1' => 'Veden alla laaja 1', + 'Underwater Wide2' => 'Veden alla laaja 2', + 'Vivid' => 'Heleä', + }, + }, + 'SceneSelect' => { + Description => 'Näkymän valinta', + PrintConv => { + 'Lamp' => 'Lamppu', + 'Night' => 'Yö', + 'Off' => 'Pois', + 'Sport' => 'Urheilu', + 'User 1' => 'Käyttäjä 1', + 'User 2' => 'Käyttäjä 2', + }, + }, + 'SceneType' => { + Description => 'Näkymätyyppi', + PrintConv => { + 'Directly photographed' => 'Suoraan otettu valokuva', + }, + }, + 'SecurityClassification' => { + Description => 'Turvallisuusluokitus', + PrintConv => { + 'Confidential' => 'Luottamuksellinen', + 'Restricted' => 'Rajoitettu', + 'Secret' => 'Salainen', + 'Top Secret' => 'Huippusalainen', + 'Unclassified' => 'Ei luokiteltu', + }, + }, + 'SelfTimer' => { + Description => 'Itselaukaisin', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'SelfTimerMode' => 'Itselaukaisumoodi', + 'SelfTimerShotCount' => 'Itselaukaisimen otosmäärä', + 'SelfTimerTime' => 'Itselaukaisimen viive', + 'SensingMethod' => { + Description => 'Mittausmetodi', + PrintConv => { + 'Color sequential area' => 'Peräkkäisvärialueen anturi', + 'Color sequential linear' => 'Peräkkäisvärien lineaarianturi', + 'Monochrome area' => 'Monokromialueen anturi', + 'Monochrome linear' => 'Monokromilineaarinen anturi', + 'Not defined' => 'Ei määritetty', + 'One-chip color area' => 'Yhden chipin värialueen anturi', + 'Three-chip color area' => 'Kolmen chipin värialueen anturi', + 'Trilinear' => 'Trilineaarinen anturi', + 'Two-chip color area' => 'Kahden chipin värialueen anturi', + }, + }, + 'SensitivityAdjust' => 'Herkkyyden asetus', + 'SensitivitySteps' => 'Herkkyysaskeleet', + 'SensorBlueLevel' => 'Anturin sinitaso', + 'SensorBottomBorder' => 'Anturin alareuna', + 'SensorHeight' => 'Anturin korkeus', + 'SensorLeftBorder' => 'Anturin vasen reuna', + 'SensorPixelSize' => 'Anturin pikselikoko', + 'SensorRedLevel' => 'Anturin punataso', + 'SensorRightBorder' => 'Anturin oikea reuna', + 'SensorTemperature' => 'Anturin lämpötila', + 'SensorTopBorder' => 'Anturin yläreuna', + 'SensorWidth' => 'Anturin leveys', + 'Sequence' => 'Järjestys', + 'SequenceNumber' => 'Järjestysnumero', + 'SequenceShotInterval' => { + Description => 'Sarjakuvauksen taajuus', + PrintConv => { + '10 frames/s' => '10 ruutua/s', + '15 frames/s' => '15 ruutua/s', + '20 frames/s' => '20 ruutua/s', + '5 frames/s' => '5 ruutua/s', + }, + }, + 'SequentialShot' => { + Description => 'Sarjakuvaus', + PrintConv => { + 'Adjust Exposure' => 'Valotuksen säätö', + 'Best' => 'Paras', + 'None' => 'Ei mitään', + 'Standard' => 'Vakio', + }, + }, + 'SerialNumber' => 'Sarjanumero', + 'SerialNumberFormat' => 'Sarjanumeron muoto', + 'ServiceIdentifier' => 'Palvelun tunnistin', + 'ShadingCompensation' => { + Description => 'Varjostumakorjaus', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'Shadow' => 'Varjo', + 'ShadowProtection' => 'Varjoalueen suojaus ', + 'ShadowScale' => 'Varjoasteikko', + 'Sharpness' => { + Description => 'Terävyys', + PrintConv => { + '+1 (medium hard)' => 'Kovahko', + '+2 (hard)' => 'Kova', + '+3 (very hard)' => 'Kova 2', + '-1 (medium soft)' => 'Pehmeähkö', + '-2 (soft)' => 'Pehmeä 2', + '-3 (very soft)' => 'Pehmeä', + '0 (normal)' => 'Vakio', + 'Film Simulation' => 'Filminsimulaatio', + 'Hard' => 'Kova', + 'Hard2' => 'Kova 2', + 'Medium Hard' => 'Kovahko', + 'Medium Soft' => 'Pehmeähkö', + 'Normal' => 'Vakio', + 'Soft' => 'Pehmeä', + 'Soft2' => 'Pehmeä 2', + 'n/a' => 'E.s.', + }, + }, + 'SharpnessFactor' => 'Terävöintikerroin', + 'SharpnessFaithful' => 'Kohdeuskollinen terävyys', + 'SharpnessFreqTable' => 'Terävyyden taajuustaulukko', + 'SharpnessFrequency' => 'Terävyystaajuus', + 'SharpnessLandscape' => 'Maisemakuvan terävyys', + 'SharpnessMonochrome' => 'Yksivärikuvan terävyys', + 'SharpnessNeutral' => 'Neutraali terävyys', + 'SharpnessPortrait' => 'Muotokuvan terävyys', + 'SharpnessSetting' => 'Terävyysasetus', + 'SharpnessStandard' => 'Vakioterävyys', + 'SharpnessTable' => 'Terävyystaulukko', + 'ShootingInfoDisplay' => 'Kuvaustietojen näyttö', + 'ShootingMode' => 'IR-kauko-ohjaus', + 'ShortDocumentID' => 'Lyhyt dokumentin ID', + 'ShortOwnerName' => 'Omistajan lyhyt nimi', + 'ShotInfoVersion' => 'Otostietojen versio', + 'ShutterCount' => 'Laukaisumäärä', + 'ShutterReleaseButtonAE-L' => 'Laukaisin AE-L', + 'ShutterSpeedValue' => 'Suljinnopeuden arvo', + 'SimilarityIndex' => 'Yhtäläisyysindeksi', + 'Site' => 'Sivusto', + 'SlaveFlashMeteringSegments' => 'Orjasalaman mittaussegmentit', + 'SlowShutter' => 'Hidas suljin', + 'SlowSync' => { + Description => 'Hidas suljin', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'Software' => 'Ohjelmisto', + 'SoftwareVersion' => 'Ohjelmistoversio', + 'Source' => 'Lähde', + 'SourceImageDirectory' => 'Lähdekuvan kansio', + 'SourceImageFileName' => 'Lähdekuvan tiedostonimi', + 'SourceImageVolumeName' => 'Lähdekuvan taltion nimi', + 'SpatialFrequencyResponse' => 'Spatiaalisen taajuuden vaste', + 'SpecialInstructions' => 'Ohjeet', + 'SpecialMode' => 'Erikoistapa', + 'SpectralSensitivity' => 'Spektraalinen herkkyys', + 'Sport' => 'Urheilu', + 'SpotFocusPointX' => 'Pistetarkennuksen piste X', + 'SpotFocusPointY' => 'Pistetarkennuksen piste Y', + 'SpotMeteringMode' => 'Pistemittaustapa', + 'StorageMethod' => 'Tallennusmetodi', + 'StraightenAngle' => 'Kuvan suoristus', + 'StripByteCounts' => 'Tavuja per pakattu strippi', + 'StripOffsets' => 'Kuvadatan sijainti', + 'Sub-location' => 'Sijainti', + 'SubSecTime' => 'DateTime sekunnin murto-osina', + 'SubSecTimeDigitized' => 'DateTimeDigitized sekunnin murto-osina', + 'SubSecTimeOriginal' => 'DateTimeOriginal sekunnin murto-osina', + 'SubTileBlockSize' => 'Alalaattalohkon koko', + 'Subject' => 'Aihe', + 'SubjectArea' => 'Kohdealue', + 'SubjectDistance' => 'Kohteen etäisyys', + 'SubjectDistanceRange' => { + Description => 'Objektiivin tarkennusetäisyys', + PrintConv => { + 'Close' => 'Lähikuva', + 'Distant' => 'Etäkuva', + 'Macro' => 'Makro', + 'Unknown' => 'Tuntematon', + }, + }, + 'SubjectLocation' => 'Kohteen sijainti', + 'SubjectProgram' => 'Kuvausohjelma', + 'SubjectReference' => 'Aiheen koodi', + 'SuperMacro' => { + Description => 'Supermakro', + PrintConv => { + 'Off' => 'Pois', + 'On (1)' => 'Päällä (1)', + 'On (2)' => 'Päällä (2)', + }, + }, + 'SupplementalCategories' => 'Täydentävä kategoria', + 'SupplementalType' => { + Description => 'Lisäystyyppi', + PrintConv => { + 'Main Image' => 'Ei asetettu', + 'Rasterized Caption' => 'Rasteroitu seloste', + 'Reduced Resolution Image' => 'Alennetun resoluution kuva', + }, + }, + 'SvISOSetting' => 'Sv-ISO-asetus', + 'T4Options' => 'Lisätyt täytebitit', + 'T6Options' => 'T6-valinnat', + 'TIFF-EPStandardID' => 'TIFF/EP-standardin ID', + 'TargetAperture' => 'Tavoiteaukko', + 'TargetExposureTime' => 'Tavoitevalotusaika', + 'TargetPrinter' => 'Kohdetulostin', + 'Technology' => { + Description => 'Teknologia', + PrintConv => { + 'Digital Camera' => 'Digitaalikamera', + 'Dye Sublimation Printer' => 'Lämpösublimaatiotulostin', + 'Electrophotographic Printer' => 'Lasertulostin', + 'Electrostatic Printer' => 'Sähköstaattinen tulostin', + 'Film Scanner' => 'Filmiskanneri', + 'Film Writer' => 'Filmitulostin', + 'Flexography' => 'Fleksografia', + 'Gravure' => 'Syväpaino', + 'Ink Jet Printer' => 'Mustesuihkutulostin', + 'Offset Lithography' => 'Offsetlitografia', + 'Photo CD' => 'Valokuva-CD', + 'Photo Image Setter' => 'Valokuvaimagesetteri', + 'Photographic Paper Printer' => 'Valokuvapaperitulostin', + 'Projection Television' => 'Projektiotelevisio', + 'Reflective Scanner' => 'Heijastusskanneri', + 'Silkscreen' => 'Silkkipaino', + 'Thermal Wax Printer' => 'Lämpövahatulostin', + 'Video Camera' => 'Videokamera', + 'Video Monitor' => 'Videomonitori', + }, + }, + 'Text' => 'Teksti', + 'TextInfo' => 'Tekstitiedot', + 'TextStamp' => { + Description => 'Tekstileimasin', + PrintConv => { + 'Off' => 'Päällä', + }, + }, + 'Thresholding' => 'Kynnystys', + 'ThumbnailImage' => 'Näytekuva', + 'ThumbnailImageValidArea' => 'Näytekuvan kelpaava alue', + 'TileByteCounts' => 'Ruutujen tavumäärät', + 'TileDepth' => 'Ruudun syvyys', + 'TileLength' => 'Ruudun pituus', + 'TileOffsets' => 'Ruutusiirtymät', + 'TileWidth' => 'Otsikon leveys', + 'Time' => 'Aika', + 'TimeCreated' => 'Luontiaika', + 'TimeSent' => 'Lähetysaika', + 'TimeSincePowerOn' => 'Virran päälläoloaika', + 'TimeStamp' => 'Aikaleima', + 'TimeZone' => 'Aikavyöhyke', + 'TimeZoneOffset' => 'Aikavyöhykkeen siirtymä', + 'TimerFunctionButton' => 'Ajastustoimintopainike', + 'Title' => 'Otsikko', + 'ToneComp' => 'Sävykorjailu', + 'ToneCurve' => 'Sävykäyrä', + 'ToneCurveMatching' => 'Sävykäyrän täsmäys', + 'ToneCurveTable' => 'Sävykäyrätaulukko', + 'ToneCurves' => 'Sävykäyrät', + 'ToningEffect' => 'Sävytysefekti', + 'ToningEffectMonochrome' => 'Yksivärisävytysefekti', + 'ToningSaturation' => 'Sävykylläisyys', + 'TransferFunction' => 'Muuntotoiminto', + 'TransferRange' => 'Siirtonopeus', + 'Transform' => 'Muunna', + 'Transformation' => { + Description => 'Muunto', + PrintConv => { + 'Mirror horizontal' => 'Peilaa vaakasuunnassa', + 'Mirror horizontal and rotate 270 CW' => 'Peilaa vaakasuunnassa ja kierrä 270° myötäpäivään', + 'Mirror horizontal and rotate 90 CW' => 'Peilaa vaakasuunnassa ja kierrä 90° myötäpäivään', + 'Mirror vertical' => 'Peilaa pystysuunnassa', + 'Rotate 180' => 'Kierrä 180°', + 'Rotate 270 CW' => 'Kierrä 90° myötäpäivään', + 'Rotate 90 CW' => 'Kierrä 90° myötäpäivään', + }, + }, + 'TransparencyIndicator' => 'Läpinäkyvyyden ilmaisin', + 'TravelDay' => 'Matkapäivä', + 'TvExposureTimeSetting' => 'Tv-valotusaikaasetus', + 'Type' => 'Tyyppi', + 'Uncompressed' => { + Description => 'Pakkaamaton', + PrintConv => { + 'No' => 'Ei', + 'Yes' => 'Kyllä', + }, + }, + 'UniqueCameraModel' => 'Uniikki kameramalli', + 'UniqueDocumentID' => 'Uniikin dokumentin ID', + 'Unknown' => 'Tuntematon', + 'Unsharp1Color' => 'Terävöinti 1 -väri', + 'Unsharp1HaloWidth' => 'Terävöinti 1 -halolaajuus', + 'Unsharp1Intensity' => 'Terävöinti 1 -voimakkuus', + 'Unsharp1Threshold' => 'Terävöinti 1 -kynnys', + 'Unsharp2Color' => 'Terävöinti 2 -väri', + 'Unsharp2HaloWidth' => 'Terävöinti 2 -halolaajuus', + 'Unsharp2Intensity' => 'Terävöinti 2 -voimakkuus', + 'Unsharp2Threshold' => 'Terävöinti 2 -kynnys', + 'Unsharp3Color' => 'Terävöinti 3 -väri', + 'Unsharp3HaloWidth' => 'Terävöinti 3 -halolaajuus', + 'Unsharp3Intensity' => 'Terävöinti 3 -voimakkuus', + 'Unsharp3Threshold' => 'Terävöinti 3 -kynnys', + 'Unsharp4Color' => 'Terävöinti 4 -väri', + 'Unsharp4HaloWidth' => 'Terävöinti 4 -halolaajuus', + 'Unsharp4Intensity' => 'Terävöinti 4 -voimakkuus', + 'Unsharp4Threshold' => 'Terävöinti 4 -kynnys', + 'UnsharpCount' => 'Terävöintimäärä', + 'UnsharpData' => 'Terävöintidata', + 'UnsharpMask' => 'Epäterävä maski', + 'Urgency' => { + Description => 'Kiireellisyys', + PrintConv => { + '0 (reserved)' => '0 (varattu tulevaan käyttöön)', + '1 (most urgent)' => '1 (hyvin kiireellinen)', + '5 (normal urgency)' => '5 (normaali kiirellisyys)', + '8 (least urgent)' => '8 (lievän kiireellinen)', + '9 (user-defined priority)' => '9 (varattu tulevaan käyttöön)', + }, + }, + 'UserComment' => 'Käyttäjän kommentti', + 'UserSelectGroupTitle' => 'Käyttäjän valitseman ryhmän otsikko', + 'VRDOffset' => 'VRD-siirtymä', + 'VRInfo' => 'Kuvanvakaimen tiedot', + 'VRInfoVersion' => 'VR- (kuvanvakain) tietojen versio', + 'ValidAFPoints' => 'Kelpaavat AF-pisteet', + 'VariProgram' => 'Kuvausohjelma', + 'Version' => 'Versio', + 'VibrationReduction' => 'Kuvanvakautus', + 'VideoCardGamma' => 'Grafiikkakortin gamma', + 'ViewfinderWarning' => 'Etsinvaroitus', + 'ViewingCondDesc' => 'Katseluolojen kuvaus', + 'VignetteControl' => { + Description => 'Vinjetoinnin korjaus', + PrintConv => { + 'High' => 'Korkea', + 'Low' => 'Matala', + 'Normal' => 'Normaali', + 'Off' => 'Pois', + }, + }, + 'VignetteControlIntensity' => 'Vinjetoinnin korjauksen voimakkuus', + 'VoiceMemo' => { + Description => 'Äänen tallennus', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'WBAdjData' => 'Valkotaspainon säätödata', + 'WBBlueLevel' => 'Valkotas. sinisen taso', + 'WBBracketMode' => 'Valkotasapaino-haarukointitapa', + 'WBBracketValueAB' => 'Valkotasapainon AB-haarukointiarvo', + 'WBBracketValueGM' => 'Valkotasapainon GM-haarukointiarvo', + 'WBGreenLevel' => 'Vihreän taso', + 'WBMode' => { + Description => 'Valkotasapainotila', + PrintConv => { + 'Auto' => 'Automaattinen', + }, + }, + 'WBRedLevel' => 'Valkotas. punaisen taso', + 'WBShiftAB' => 'Valkotas. säätö keltainen/sininen', + 'WBShiftGM' => 'Valkotas. säätö vihreä/magenta', + 'WB_RBLevels' => 'Valkotasapaino punainen/sininen', + 'WB_RBLevelsAuto' => 'Valkotas. RB-tasot, automatiikka', + 'WB_RBLevelsCoolWhiteFluor' => 'Valkotas. RB-tasot, viileän valk. loistel.', + 'WB_RBLevelsDayWhiteFluor' => 'Valkotas. RB-tasot, valk. päivänvaloloistel.', + 'WB_RBLevelsDaylightFluor' => 'Valkotas. RB-tasot, päivänvaloloistel.', + 'WB_RBLevelsEveningSunlight' => 'Valkotas. RB-tasot, ilta-aurinko', + 'WB_RBLevelsFineWeather' => 'Valkotas. RB-tasot, kaunis sää', + 'WB_RBLevelsShade' => 'Valkotas. RB-tasot, varjo', + 'WB_RBLevelsTungsten' => 'Valkotas. RB-tasot, hehkulamppu', + 'WB_RBLevelsUsed' => 'Käytetyt valkotas. RB-tasot', + 'WB_RBLevelsWhiteFluorescent' => 'Valkotas. RB-tasot, valk. loistelamppu', + 'WB_RGGBLevelsCloudy' => 'Valkotasapainon RGGB-tasojen pilvinen', + 'WB_RGGBLevelsDaylight' => 'Valkotasapainon RGGB-tasojen päivänvalo', + 'WB_RGGBLevelsFlash' => 'Valkotasapainon RGGB-tasojen salama', + 'WB_RGGBLevelsFluorescentD' => 'Valkotasapainon RGGB-tasojen loistelamppu D', + 'WB_RGGBLevelsFluorescentN' => 'Valkotasapainon RGGB-tasojen loistelamppu N', + 'WB_RGGBLevelsFluorescentW' => 'Valkotasapainon RGGB-tasojen loistelamppu W', + 'WB_RGGBLevelsShade' => 'Valkotasapainon RGGB-tasojen varjo', + 'WB_RGGBLevelsTungsten' => 'Valkotasapainon RGGB-tasojen hehkulamppu', + 'Watermark' => 'Vesileima', + 'WatermarkType' => 'Vesileiman tyyppi', + 'WhiteBalance' => { + Description => 'Valkotasapaino', + PrintConv => { + 'Auto' => 'Automaattinen', + 'Cloudy' => 'Pilvinen', + 'Custom' => 'Mukautus', + 'Custom2' => 'Mukautus 2', + 'Custom3' => 'Mukautus 3', + 'Custom4' => 'Mukautus 4', + 'Day White Fluorescent' => 'Valkoinen päivänvaloloistelamppu', + 'Daylight' => 'Auringonvalo', + 'Daylight Fluorescent' => 'Päivänvaloloistelamppu', + 'Flash' => 'Salama', + 'Incandescent' => 'Hehkulamppu', + 'Living Room Warm White Fluorescent' => 'Asuinhuoneen lämmin valkoinen loistelamppu', + 'Manual' => 'Manuaalinen', + 'Warm White Fluorescent' => 'Lämmin valkoinen loistelamppu', + 'White Fluorescent' => 'Valkoinen loistelamppu', + }, + }, + 'WhiteBalance2' => { + Description => 'Valkotasapaino', + PrintConv => { + '3000K (Tungsten light)' => '3000 K (hehkulamppu)', + '3600K (Tungsten light-like)' => '3600 K (hehkulamppumainen valo)', + '4000K (Cool white fluorescent)' => '4000 K (viileän valkoinen loistelamppu)', + '4500K (Neutral white fluorescent)' => '4500 K (neutraali valkoinen loistelamppu)', + '5300K (Fine Weather)' => '5300 K (kaunis sää)', + '6000K (Cloudy)' => '6000 K (pilvinen)', + '6600K (Daylight fluorescent)' => '6600 K (päivänvaloloistelamppu)', + '7500K (Fine Weather with Shade)' => '7500 K (kaunis sää ja varjoja)', + 'Auto' => 'Automaattinen', + 'Custom WB 1' => 'Mukautettu valkotasapaino 1', + 'Custom WB 2' => 'Mukautettu valkotasapaino 2', + 'Custom WB 2900K' => 'Mukautettu valkotasapaino 2900 K', + 'Custom WB 3' => 'Mukautettu valkotasapaino 3', + 'Custom WB 4' => 'Mukautettu valkotasapaino 4', + 'Custom WB 5400K' => 'Mukautettu valkotasapaino 5400 K', + 'Custom WB 8000K' => 'Mukautettu valkotasapaino 8000 K', + 'One Touch WB 1' => 'Mukautettu valkotasapaino 1', + 'One Touch WB 2' => 'Mukautettu valkotasapaino 2', + 'One Touch WB 3' => 'Mukautettu valkotasapaino 3', + 'One Touch WB 4' => 'Mukautettu valkotasapaino 4', + }, + }, + 'WhiteBalanceAdj' => 'Väritasapainon säätö', + 'WhiteBalanceBias' => 'Valkotasapainon korjaus', + 'WhiteBalanceBlue' => 'Valkotasapaino sininen', + 'WhiteBalanceBracket' => 'Valkotasapainon haarukointi', + 'WhiteBalanceBracketing' => 'Valkotasapainohaarukointi', + 'WhiteBalanceComp' => 'Valkotasapainon säätö', + 'WhiteBalanceFineTune' => 'Valkotasapainon hienosäätö', + 'WhiteBalanceMatching' => 'Valkotasapainon täsmäys', + 'WhiteBalanceMode' => { + Description => 'Valkotasapainon muoto', + PrintConv => { + 'Auto (Cloudy)' => 'Automaattinen (pilvinen)', + 'Auto (Day White Fluorescent)' => 'Automaattinen (valkoinen päivänvaloloistelamppu)', + 'Auto (Daylight Fluorescent)' => 'Automaattinen (päivänvaloloistelamppu)', + 'Auto (Daylight)' => 'Automaattinen (auringonvalo)', + 'Auto (Flash)' => 'Automaattinen (salama)', + 'Auto (Shade)' => 'Automaattinen (varjo)', + 'Auto (Tungsten)' => 'Automaattinen (hehkulamppu)', + 'Auto (White Fluorescent)' => 'Automaattinen (valkoinen loistelamppu)', + 'Unknown' => 'Automaattinen (ei tunnistettu)', + 'User-Selected' => 'Itse valittu', + }, + }, + 'WhiteBalanceRed' => 'Valkotasapaino punainen', + 'WhiteBalanceSet' => 'Asetettu valkotasapaino', + 'WhiteBalanceTable' => 'Valkotasapainotaulukko', + 'WhiteBalanceTemperature' => 'Valkotaspainon lämpötila', + 'WhiteBoard' => 'Valkoinen pohja', + 'WhiteLevel' => 'Valkoinen taso', + 'WhitePoint' => 'Valkoinen piste', + 'WhitePointX' => 'Valkoinen piste X', + 'WhitePointY' => 'Valkoinen piste Y', + 'Wide' => 'Laaja', + 'WideFocusZone' => 'Laaja-alatarkennuksen alue', + 'WideRange' => { + Description => 'Laaja alue', + PrintConv => { + 'Off' => 'Pois', + 'On' => 'Päällä', + }, + }, + 'WorldTimeLocation' => { + Description => 'Maailmanaikasijainti', + PrintConv => { + 'Destination' => 'Kohde', + 'Home' => 'Koti', + 'Hometown' => 'Kotiseutu', + }, + }, + 'Writer-Editor' => 'Selosteen/Kuvatekstin kirjoittaja', + 'X3FillLight' => 'X3-täytevalo', + 'XClipPathUnits' => 'X-leikepolkuyksiköt', + 'XMP' => 'XMP-metadata', + 'XPosition' => 'X-sijainti', + 'XResolution' => 'Kuvan vaakaresoluutio', + 'YCbCrCoefficients' => 'Väriavaruuden muunnon matriisikertoimet', + 'YCbCrPositioning' => { + Description => 'Y:n ja C:n sijoitus', + PrintConv => { + 'Centered' => 'Keskitetty', + 'Co-sited' => 'Vierekkäin', + }, + }, + 'YCbCrSubSampling' => 'Suhteen Y - C subsamplaus', + 'YClipPathUnits' => 'Y-leikepolkuyksiköt', + 'YPosition' => 'Y-sijainti', + 'YResolution' => 'Kuvan pystyresoluutio', + 'ZoneMatching' => { + Description => 'Yli/alivalotuksen esto', + PrintConv => { + 'High Key' => 'Yläsävykuva', + 'ISO Setting Used' => 'Pois (käytetty ISO-asetusta)', + 'Low Key' => 'Alasävykuva', + }, + }, + 'Zoom' => 'Zoom-objektiivi', + 'ZoomSourceWidth' => 'Zoomauksen lähtökoko', + 'ZoomStepCount' => 'Zoom-askelmäärä', + 'ZoomTargetWidth' => 'Zoomauksen loppukoko', +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::fi.pm - ExifTool Finnish language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke and Jarkko ME<auml>kineva for providing this +translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/fr.pm b/lib/Image/ExifTool/Lang/fr.pm new file mode 100644 index 0000000..12d1124 --- /dev/null +++ b/lib/Image/ExifTool/Lang/fr.pm @@ -0,0 +1,4769 @@ +#------------------------------------------------------------------------------ +# File: fr.pm +# +# Description: ExifTool French language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::fr; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.34'; + +%Image::ExifTool::Lang::fr::Translate = ( + 'AEAperture' => 'Ouverture AE', + 'AEBAutoCancel' => { + Description => 'Annulation bracketing auto', + PrintConv => { + 'Off' => 'Arrêt', + 'On' => 'Marche', + }, + }, + 'AEBSequence' => 'Séquence de bracketing', + 'AEBSequenceAutoCancel' => { + Description => 'Séquence auto AEB/annuler', + PrintConv => { + '-,0,+/Disabled' => '-,0,+/Désactivé', + '-,0,+/Enabled' => '-,0,+/Activé', + '0,-,+/Disabled' => '0,-,+/Désactivé', + '0,-,+/Enabled' => '0,-,+/Activé', + }, + }, + 'AEBShotCount' => 'Nombre de vues bracketées', + 'AEBXv' => 'Compensation d\'expo. auto en bracketing', + 'AEExposureTime' => 'Temps d\'exposition AE', + 'AEExtra' => 'Suppléments AE', + 'AEInfo' => 'Info sur l\'exposition auto', + 'AELock' => { + Description => 'Verrouillage AE', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'AEMaxAperture' => 'Ouverture maxi AE', + 'AEMaxAperture2' => 'Ouverture maxi AE (2)', + 'AEMeteringMode' => { + Description => 'Mode de mesure AE', + PrintConv => { + 'Multi-segment' => 'Multizone', + }, + }, + 'AEMeteringSegments' => 'Segments de mesure AE', + 'AEMinAperture' => 'Ouverture mini AE', + 'AEMinExposureTime' => 'Temps d\'exposition mini AE', + 'AEProgramMode' => { + Description => 'Mode programme AE', + PrintConv => { + 'Av, B or X' => 'Av, B ou X', + 'Candlelight' => 'Bougie', + 'DOF Program' => 'Programme PdC', + 'DOF Program (P-Shift)' => 'Programme PdC (décalage P)', + 'Hi-speed Program' => 'Programme grande vitesse', + 'Hi-speed Program (P-Shift)' => 'Programme grande vitesse (décalage P)', + 'Kids' => 'Enfants', + 'Landscape' => 'Paysage', + 'M, P or TAv' => 'M, P ou TAv', + 'MTF Program' => 'Programme FTM', + 'MTF Program (P-Shift)' => 'Programme FTM (décalage P)', + 'Museum' => 'Musée', + 'Night Scene' => 'Nocturne', + 'Night Scene Portrait' => 'Portrait nocturne', + 'No Flash' => 'Sans flash', + 'Pet' => 'Animaux de compagnie', + 'Sunset' => 'Coucher de soleil', + 'Surf & Snow' => 'Surf et neige', + 'Sv or Green Mode' => 'Sv ou mode vert', + 'Text' => 'Texte', + }, + }, + 'AEXv' => 'Compensation d\'exposition auto', + 'AE_ISO' => 'Sensibilité ISO AE', + 'AFAdjustment' => 'Ajustement AF', + 'AFAperture' => 'Ouverture AF', + 'AFAreaIllumination' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'AFAreaMode' => { + Description => 'Mode de zone AF', + PrintConv => { + '1-area' => 'Mise au point 1 zone', + '1-area (high speed)' => 'Mise au point 1 zone (haute vitesse)', + '3-area (center)?' => 'Mise au point 3 zones (au centre) ?', + '3-area (high speed)' => 'Mise au point 3 zones (haute vitesse)', + '3-area (left)?' => 'Mise au point 3 zones (à gauche) ?', + '3-area (right)?' => 'Mise au point 3 zones (à droite) ?', + '5-area' => 'Mise au point 5 zones', + '9-area' => 'Mise au point 9 zones', + 'Face Detect AF' => 'Dét. visage', + 'Spot Focusing' => 'Mise au point Spot', + 'Spot Mode Off' => 'Mode Spot désactivé', + 'Spot Mode On' => 'Mode Spot enclenché', + }, + }, + 'AFAssist' => { + Description => 'Faisceau d\'assistance AF', + PrintConv => { + 'Does not emit/Fires' => 'N\'émet pas/Se déclenche', + 'Emits/Does not fire' => 'Emet/Ne se déclenche pas', + 'Emits/Fires' => 'Emet/Se déclenche', + 'Off' => 'Désactivé', + 'On' => 'Activé', + 'Only ext. flash emits/Fires' => 'Flash ext émet/Se déclenche', + }, + }, + 'AFAssistBeam' => { + Description => 'Faisceau d\'assistance AF', + PrintConv => { + 'Does not emit' => 'Désactivé', + 'Emits' => 'Activé', + 'Only ext. flash emits' => 'Uniquement par flash ext.', + }, + }, + 'AFDefocus' => 'Défocalisation AF', + 'AFDuringLiveView' => { + Description => 'AF pendant la visée directe', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activé', + 'Live mode' => 'Mode visée directe', + 'Quick mode' => 'Mode rapide', + }, + }, + 'AFInfo' => 'Info autofocus', + 'AFInfo2' => 'Infos AF', + 'AFInfo2Version' => 'Version des infos AF', + 'AFIntegrationTime' => 'Temps d\'intégration AF', + 'AFMicroadjustment' => { + Description => 'Micro-ajustement de l\'AF', + PrintConv => { + 'Adjust all by same amount' => 'Ajuster idem tous obj', + 'Adjust by lens' => 'Ajuster par objectif', + 'Disable' => 'Désactivé', + }, + }, + 'AFMode' => 'Mode AF', + 'AFOnAELockButtonSwitch' => { + Description => 'Permutation touche AF/Mémo', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activé', + }, + }, + 'AFPoint' => { + Description => 'Point AF', + PrintConv => { + 'Bottom' => 'Bas', + 'Center' => 'Centre', + 'Far Left' => 'Extrême-gauche', + 'Far Right' => 'Extrême-droit', + 'Left' => 'Gauche', + 'Lower-left' => 'Bas-gauche', + 'Lower-right' => 'Bas-droit', + 'Mid-left' => 'Milieu gauche', + 'Mid-right' => 'Milieu droit', + 'None' => 'Aucune', + 'Right' => 'Droit', + 'Top' => 'Haut', + 'Upper-left' => 'Haut-gauche', + 'Upper-right' => 'Haut-droit', + }, + }, + 'AFPointActivationArea' => { + Description => 'Zone activation collimateurs AF', + PrintConv => { + 'Automatic expanded (max. 13)' => 'Expansion auto (13 max.)', + 'Expanded (TTL. of 7 AF points)' => 'Expansion (TTL 7 collimat.)', + 'Single AF point' => 'Un seul collimateur AF', + }, + }, + 'AFPointAreaExpansion' => { + Description => 'Extension de la zone AF', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activé', + 'Left/right AF points' => 'Activé (gauche/droite collimateurs autofocus d\'assistance)', + 'Surrounding AF points' => 'Activée (Collimateurs autofocus d\'assistance environnants)', + }, + }, + 'AFPointAutoSelection' => { + Description => 'Sélection des collimateurs automatique', + PrintConv => { + 'Control-direct:disable/Main:disable' => 'Contrôle rapide-Directe:désactivé/Principale:désactivé', + 'Control-direct:disable/Main:enable' => 'Contrôle rapide-Directe:désactivé/Principale:activé', + 'Control-direct:enable/Main:enable' => 'Contrôle rapide-Directe:activé/Principale:activé', + }, + }, + 'AFPointBrightness' => { + Description => 'Intensité d\'illumination AF', + PrintConv => { + 'Brighter' => 'Forte', + 'Normal' => 'Normale', + }, + }, + 'AFPointDisplayDuringFocus' => { + Description => 'Affichage de point AF pendant mise au point', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + 'On (when focus achieved)' => 'Activé (si mise au point effectuée)', + }, + }, + 'AFPointIllumination' => { + Description => 'Eclairage des collimateurs AF', + PrintConv => { + 'Brighter' => 'Plus brillant', + 'Off' => 'Désactivé', + 'On' => 'Activé', + 'On without dimming' => 'Activé sans atténuation', + }, + }, + 'AFPointMode' => 'Mode de mise au point AF', + 'AFPointRegistration' => { + Description => 'Validation du point AF', + PrintConv => { + 'Automatic' => 'Auto', + 'Bottom' => 'Bas', + 'Center' => 'Centre', + 'Extreme Left' => 'Extrême gauche', + 'Extreme Right' => 'Extrême droite', + 'Left' => 'Gauche', + 'Right' => 'Droit', + 'Top' => 'Haut', + }, + }, + 'AFPointSelected' => { + Description => 'Point AF sélectionné', + PrintConv => { + 'Automatic Tracking AF' => 'AF en suivi auto', + 'Bottom' => 'Bas', + 'Center' => 'Centre', + 'Face Detect AF' => 'AF en reconnaissance de visage', + 'Fixed Center' => 'Fixe au centre', + 'Left' => 'Gauche', + 'Lower-left' => 'Bas gauche', + 'Lower-right' => 'Bas droit', + 'Mid-left' => 'Milieu gauche', + 'Mid-right' => 'Milieu droit', + 'Right' => 'Droit', + 'Top' => 'Haut', + 'Upper-left' => 'Haut gauche', + 'Upper-right' => 'Haut droite', + }, + }, + 'AFPointSelected2' => 'Point AF sélectionné 2', + 'AFPointSelection' => 'Méthode sélect. collimateurs AF', + 'AFPointSelectionMethod' => { + Description => 'Méthode sélection collim. AF', + PrintConv => { + 'Multi-controller direct' => 'Multicontrôleur direct', + 'Normal' => 'Normale', + 'Quick Control Dial direct' => 'Molette AR directe', + }, + }, + 'AFPointSpotMetering' => { + Description => 'Nombre collimateurs/mesure spot', + PrintConv => { + '11/Active AF point' => '11/collimateur AF actif', + '11/Center AF point' => '11/collimateur AF central', + '45/Center AF point' => '45/collimateur AF central', + '9/Active AF point' => '9/collimateur AF actif', + }, + }, + 'AFPointsInFocus' => { + Description => 'Points AF nets', + PrintConv => { + 'All' => 'Tous', + 'Bottom' => 'Bas', + 'Bottom, Center' => 'Bas + centre', + 'Bottom-center' => 'Bas centre', + 'Bottom-left' => 'Bas gauche', + 'Bottom-right' => 'Bas droit', + 'Center' => 'Centre', + 'Center (horizontal)' => 'Centre (horizontal)', + 'Center (vertical)' => 'Centre (vertical)', + 'Center+Right' => 'Centre+droit', + 'Fixed Center or Multiple' => 'Centre fixe ou multiple', + 'Left' => 'Gauche', + 'Left+Center' => 'Gauch+centre', + 'Left+Right' => 'Gauche+droit', + 'Lower-left, Bottom' => 'Bas gauche + bas', + 'Lower-left, Mid-left' => 'Bas gauche + milieu gauche', + 'Lower-right, Bottom' => 'Bas droit + bas', + 'Lower-right, Mid-right' => 'Bas droit + milieu droit', + 'Mid-left' => 'Milieu gauche', + 'Mid-left, Center' => 'Milieu gauche + centre', + 'Mid-right' => 'Milieu droit', + 'Mid-right, Center' => 'Milieu droit + centre', + 'None' => 'Aucune', + 'None (MF)' => 'Aucune (MF)', + 'Right' => 'Droit', + 'Top' => 'Haut', + 'Top, Center' => 'Haut + centre', + 'Top-center' => 'Haut centre', + 'Top-left' => 'Haut gauche', + 'Top-right' => 'Haut droit', + 'Upper-left, Mid-left' => 'Haut gauche + milieu gauche', + 'Upper-left, Top' => 'Haut gauche + haut', + 'Upper-right, Mid-right' => 'Haut droit + milieu droit', + 'Upper-right, Top' => 'Haut droit + haut', + }, + }, + 'AFPointsSelected' => 'Points AF sélectionnés', + 'AFPointsUnknown1' => { + PrintConv => { + 'All' => 'Tous', + 'Central 9 points' => '9 points centraux', + }, + }, + 'AFPointsUnknown2' => 'Points AF inconnus 2', + 'AFPointsUsed' => { + Description => 'Points AF utilisés', + PrintConv => { + 'Bottom' => 'Bas', + 'Center' => 'Centre', + 'Mid-left' => 'Milieu gauche', + 'Mid-right' => 'Milieu droit', + 'Top' => 'Haut', + }, + }, + 'AFPredictor' => 'Prédicteur AF', + 'AFResponse' => 'Réponse AF', + 'AIServoContinuousShooting' => 'Priorité vit. méca. AI Servo', + 'AIServoImagePriority' => { + Description => '1er Servo Ai/2e priorité déclenchement', + PrintConv => { + '1: AF, 2: Drive speed' => 'Priorité AF/Priorité cadence vues', + '1: AF, 2: Tracking' => 'Priorité AF/Priorité suivi AF', + '1: Release, 2: Drive speed' => 'Déclenchement/Priorité cadence vues', + }, + }, + 'AIServoTrackingMethod' => { + Description => 'Méthode de suivi autofocus AI Servo', + PrintConv => { + 'Continuous AF track priority' => 'Priorité suivi AF en continu', + 'Main focus point priority' => 'Priorité point AF principal', + }, + }, + 'AIServoTrackingSensitivity' => { + Description => 'Sensibili. de suivi AI Servo', + PrintConv => { + 'Fast' => 'Rapide', + 'Medium Fast' => 'Moyenne rapide', + 'Medium Slow' => 'Moyenne lent', + 'Moderately fast' => 'Moyennement rapide', + 'Moderately slow' => 'Moyennement lent', + 'Slow' => 'Lent', + }, + }, + 'APEVersion' => 'Version APE', + 'ARMIdentifier' => 'Identificateur ARM', + 'ARMVersion' => 'Version ARM', + 'AToB0' => 'A à B0', + 'AToB1' => 'A à B1', + 'AToB2' => 'A à B2', + 'AccessoryType' => 'Type d\'accessoire', + 'ActionAdvised' => { + Description => 'Action conseillée', + PrintConv => { + 'Object Append' => 'Ajout d\'objet', + 'Object Kill' => 'Destruction d\'objet', + 'Object Reference' => 'Référence d\'objet', + 'Object Replace' => 'Remplacement d\'objet', + 'Ojbect Append' => 'Ajout d\'objet', + }, + }, + 'ActiveArea' => 'Zone active', + 'ActiveD-Lighting' => { + PrintConv => { + 'Low' => 'Bas', + 'Normal' => 'Normale', + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ActiveD-LightingMode' => { + PrintConv => { + 'Low' => 'Bas', + 'Normal' => 'Normale', + 'Off' => 'Désactivé', + }, + }, + 'AddAspectRatioInfo' => { + Description => 'Ajouter info ratio d\'aspect', + PrintConv => { + 'Off' => 'Désactivé', + }, + }, + 'AddOriginalDecisionData' => { + Description => 'Aj. données décis. origine', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'AdditionalModelInformation' => 'Modèle d\'Information additionnel', + 'Address' => 'Adresse', + 'AdultContentWarning' => { + PrintConv => { + 'Unknown' => 'Inconnu', + }, + }, + 'AdvancedRaw' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'AdvancedSceneMode' => { + PrintConv => { + 'Color Select' => 'Désaturation partielle', + 'Cross Process' => 'Dévelop. croisé', + 'Dynamic Monochrome' => 'Monochrome dynamique', + 'Expressive' => 'Expressif', + 'High Dynamic' => 'Dynamique haute', + 'High Key' => 'Tons clairs', + 'Impressive Art' => 'Impressionisme', + 'Low Key' => 'Clair-obscur', + 'Miniature' => 'Effet miniature', + 'Retro' => 'Rétro', + 'Sepia' => 'Sépia', + 'Soft' => 'Mise au point douce', + 'Star' => 'Filtre étoile', + 'Toy Effect' => 'Effet jouet', + }, + }, + 'Advisory' => 'Adversité', + 'AnalogBalance' => 'Balance analogique', + 'Annotations' => 'Annotations Photoshop', + 'Anti-Blur' => { + PrintConv => { + 'Off' => 'Désactivé', + 'n/a' => 'Non établie', + }, + }, + 'AntiAliasStrength' => 'Puissance relative du filtre anticrénelage de l\'appareil', + 'Aperture' => 'Ouverture', + 'ApertureRange' => { + Description => 'Régler gamme d\'ouvertures', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activée', + }, + }, + 'ApertureRingUse' => { + Description => 'Utilisation de la bague de diaphragme', + PrintConv => { + 'Permitted' => 'Autorisée', + 'Prohibited' => 'Interdite', + }, + }, + 'ApertureValue' => 'Ouverture', + 'ApplicationRecordVersion' => 'Version d\'enregistrement', + 'ApplyShootingMeteringMode' => { + Description => 'Appliquer mode de prise de vue/de mesure', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activée', + }, + }, + 'Artist' => 'Artiste', + 'ArtworkCopyrightNotice' => 'Notice copyright de l\'Illustration', + 'ArtworkCreator' => 'Créateur de l\'Illustration', + 'ArtworkDateCreated' => 'Date de création de l\'Illustration', + 'ArtworkSource' => 'Source de l\'Illustration', + 'ArtworkSourceInventoryNo' => 'No d\'Inventaire du source de l\'Illustration', + 'ArtworkTitle' => 'Titre de l\'Illustration', + 'AsShotICCProfile' => 'Profil ICC à la prise de vue', + 'AsShotNeutral' => 'Balance neutre à la prise de vue', + 'AsShotPreProfileMatrix' => 'Matrice de pré-profil à la prise de vue', + 'AsShotProfileName' => 'Nom du profil du cliché', + 'AsShotWhiteXY' => 'Balance blanc X-Y à la prise de vue', + 'AssignFuncButton' => { + Description => 'Changer fonct. touche FUNC.', + PrintConv => { + 'Exposure comp./AEB setting' => 'Correct. expo/réglage AEB', + 'Image jump with main dial' => 'Saut image par molette principale', + 'Image quality' => 'Changer de qualité', + 'LCD brightness' => 'Luminosité LCD', + 'Live view function settings' => 'Réglages Visée par l’écran', + }, + }, + 'AssistButtonFunction' => { + Description => 'Touche de fonction rapide', + PrintConv => { + 'Av+/- (AF point by QCD)' => 'Av+/- (AF par mol. AR)', + 'FE lock' => 'Mémo expo. au flash', + 'Normal' => 'Normale', + 'Select HP (while pressing)' => 'Sélect. HP (en appuyant)', + 'Select Home Position' => 'Sélect. position origine', + }, + }, + 'Audio' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'AudioDuration' => 'Durée audio', + 'AudioOutcue' => 'Queue audio', + 'AudioSamplingRate' => 'Taux d\'échantillonnage audio', + 'AudioSamplingResolution' => 'Résolution d\'échantillonnage audio', + 'AudioType' => { + Description => 'Type audio', + PrintConv => { + 'Mono Actuality' => 'Actualité (audio mono (1 canal))', + 'Mono Music' => 'Musique, transmise par elle-même (audio mono (1 canal))', + 'Mono Question and Answer Session' => 'Question et réponse (audio mono (1 canal))', + 'Mono Raw Sound' => 'Son brut (audio mono (1 canal))', + 'Mono Response to a Question' => 'Réponse à une question (audio mono (1 canal))', + 'Mono Scener' => 'Scener (audio mono (1 canal))', + 'Mono Voicer' => 'Voix (audio mono (1 canal))', + 'Mono Wrap' => 'Wrap (audio mono (1 canal))', + 'Stereo Actuality' => 'Actualité (audio stéréo (2 canaux))', + 'Stereo Music' => 'Musique, transmise par elle-même (audio stéréo (2 canaux))', + 'Stereo Question and Answer Session' => 'Question et réponse (audio stéréo (2 canaux))', + 'Stereo Raw Sound' => 'Son brut (audio stéréo (2 canaux))', + 'Stereo Response to a Question' => 'Réponse à une question (audio stéréo (2 canaux))', + 'Stereo Scener' => 'Scener (audio stéréo (2 canaux))', + 'Stereo Voicer' => 'Voix (audio stéréo (2 canaux))', + 'Stereo Wrap' => 'Wrap (audio stéréo (2 canaux))', + 'Text Only' => 'Texte seul (pas de données d\'objet)', + }, + }, + 'Author' => 'Auteur', + 'AuthorsPosition' => 'Titre du créateur', + 'AutoAperture' => { + Description => 'Auto-diaph', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'AutoBracketing' => { + Description => 'Bracketing auto', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'AutoExposureBracketing' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'AutoFP' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'AutoFocus' => { + Description => 'Auto-Focus', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'AutoISO' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'AutoLightingOptimizer' => { + Description => 'Correction auto de luminosité', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Actif', + 'Low' => 'Faible', + 'Off' => 'Désactivé', + 'Strong' => 'Importante', + 'n/a' => 'Non établie', + }, + }, + 'AutoLightingOptimizerOn' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'AutoRedEye' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'AutoRotate' => { + Description => 'Rotation automatique', + PrintConv => { + 'None' => 'Aucune', + 'Rotate 180' => '180° (bas/droit)', + 'Rotate 270 CW' => '90° sens horaire (gauche/bas)', + 'Rotate 90 CW' => '90° sens antihoraire (droit/haut)', + 'n/a' => 'Inconnu', + }, + }, + 'AuxiliaryLens' => 'Objectif Auxiliaire', + 'AvApertureSetting' => 'Réglage d\'ouverture Av', + 'AvSettingWithoutLens' => { + Description => 'Réglage Av sans objectif', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activé', + }, + }, + 'BToA0' => 'B à A0', + 'BToA1' => 'B à A1', + 'BToA2' => 'B à A2', + 'BWMode' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'BackgroundColorIndicator' => 'Indicateur de couleur d\'arrière-plan', + 'BackgroundColorValue' => 'Valeur de couleur d\'arrière-plan', + 'BackgroundTiling' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'BadFaxLines' => 'Mauvaises lignes de Fax', + 'BannerImageType' => { + PrintConv => { + 'None' => 'Aucune', + }, + }, + 'BaseExposureCompensation' => 'Compensation d\'exposition de base', + 'BaseURL' => 'URL de base', + 'BaselineExposure' => 'Exposition de base', + 'BaselineNoise' => 'Bruit de base', + 'BaselineSharpness' => 'Accentuation de base', + 'BatteryInfo' => 'Source d\'alimentation', + 'BatteryLevel' => 'Niveau de batterie', + 'BayerGreenSplit' => 'Séparation de vert Bayer', + 'Beep' => { + PrintConv => { + 'High' => 'Bruyant', + 'Low' => 'Calme', + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'BestQualityScale' => 'Echelle de meilleure qualité', + 'BitsPerComponent' => 'Bits par composante', + 'BitsPerExtendedRunLength' => 'Bits par « Run Length » étendue', + 'BitsPerRunLength' => 'Bits par « Run Length »', + 'BitsPerSample' => 'Nombre de bits par échantillon', + 'BlackLevel' => 'Niveau noir', + 'BlackLevelDeltaH' => 'Delta H du niveau noir', + 'BlackLevelDeltaV' => 'Delta V du niveau noir', + 'BlackLevelRepeatDim' => 'Dimension de répétition du niveau noir', + 'BlackPoint' => 'Point noir', + 'BlueBalance' => 'Balance bleue', + 'BlueMatrixColumn' => 'Colonne de matrice bleue', + 'BlueTRC' => 'Courbe de reproduction des tons bleus', + 'BlurWarning' => { + PrintConv => { + 'None' => 'Aucune', + }, + }, + 'BodyBatteryADLoad' => 'Tension accu boîtier en charge', + 'BodyBatteryADNoLoad' => 'Tension accu boîtier à vide', + 'BodyBatteryState' => { + Description => 'État de accu boîtier', + PrintConv => { + 'Almost Empty' => 'Presque vide', + 'Empty or Missing' => 'Vide ou absent', + 'Full' => 'Plein', + 'Running Low' => 'En baisse', + }, + }, + 'BracketMode' => { + PrintConv => { + 'Off' => 'Désactivé', + }, + }, + 'BracketShotNumber' => { + Description => 'Numéro de cliché en bracketing', + PrintConv => { + '1 of 3' => '1 sur 3', + '1 of 5' => '1 sur 5', + '2 of 3' => '2 sur 3', + '2 of 5' => '2 sur 5', + '3 of 3' => '3 sur 3', + '3 of 5' => '3 sur 5', + '4 of 5' => '4 sur 5', + '5 of 5' => '5 sur 5', + 'n/a' => 'Non établie', + }, + }, + 'Brightness' => 'Luminosité', + 'BrightnessValue' => 'Luminosité', + 'BulbDuration' => 'Durée du pose longue', + 'BurstMode' => { + Description => 'Mode Rafale', + PrintConv => { + 'Infinite' => 'Infini', + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ButtonFunctionControlOff' => { + Description => 'Fonction de touche si Contrôle Rapide OFF', + PrintConv => { + 'Disable main, Control, Multi-control' => 'Désactivés principale, Contrôle rapide, Multicontrôleur', + 'Normal (enable)' => 'Normale (activée)', + }, + }, + 'By-line' => 'Créateur', + 'By-lineTitle' => 'Fonction du créateur', + 'CFALayout' => { + Description => 'Organisation CFA', + PrintConv => { + 'Even columns offset down 1/2 row' => 'Organisation décalée A : les colonnes paires sont décalées vers le bas d\'une demi-rangée.', + 'Even columns offset up 1/2 row' => 'Organisation décalée B : les colonnes paires sont décalées vers le haut d\'une demi-rangée.', + 'Even rows offset left 1/2 column' => 'Organisation décalée D : les rangées paires sont décalées vers la gauche d\'une demi-colonne.', + 'Even rows offset right 1/2 column' => 'Organisation décalée C : les rangées paires sont décalées vers la droite d\'une demi-colonne.', + 'Rectangular' => 'Plan rectangulaire (ou carré)', + }, + }, + 'CFAPattern' => 'Matrice de filtrage couleur', + 'CFAPattern2' => 'Modèle CFA 2', + 'CFAPlaneColor' => 'Couleur de plan CFA', + 'CFARepeatPatternDim' => 'Dimension du modèle de répétition CFA', + 'CMMFlags' => 'Drapeaux CMM', + 'CMYKEquivalent' => 'Equivalent CMJK', + 'CPUFirmwareVersion' => 'Version de firmware de CPU', + 'CPUType' => { + PrintConv => { + 'None' => 'Aucune', + }, + }, + 'CalibrationDateTime' => 'Date et heure de calibration', + 'CalibrationIlluminant1' => { + Description => 'Illuminant de calibration 1', + PrintConv => { + 'Cloudy' => 'Temps nuageux', + 'Cool White Fluorescent' => 'Fluorescente type soft', + 'Day White Fluorescent' => 'Fluorescente type blanc', + 'Daylight' => 'Lumière du jour', + 'Daylight Fluorescent' => 'Fluorescente type jour', + 'Fine Weather' => 'Beau temps', + 'Fluorescent' => 'Fluorescente', + 'ISO Studio Tungsten' => 'Tungstène studio ISO', + 'Other' => 'Autre source de lumière', + 'Shade' => 'Ombre', + 'Standard Light A' => 'Lumière standard A', + 'Standard Light B' => 'Lumière standard B', + 'Standard Light C' => 'Lumière standard C', + 'Tungsten (Incandescent)' => 'Tungstène (lumière incandescente)', + 'Unknown' => 'Inconnue', + 'Warm White Fluorescent' => 'Fluorescent blanc chaud', + 'White Fluorescent' => 'Fluorescent blanc', + }, + }, + 'CalibrationIlluminant2' => { + Description => 'Illuminant de calibration 2', + PrintConv => { + 'Cloudy' => 'Temps nuageux', + 'Cool White Fluorescent' => 'Fluorescente type soft', + 'Day White Fluorescent' => 'Fluorescente type blanc', + 'Daylight' => 'Lumière du jour', + 'Daylight Fluorescent' => 'Fluorescente type jour', + 'Fine Weather' => 'Beau temps', + 'Fluorescent' => 'Fluorescente', + 'ISO Studio Tungsten' => 'Tungstène studio ISO', + 'Other' => 'Autre source de lumière', + 'Shade' => 'Ombre', + 'Standard Light A' => 'Lumière standard A', + 'Standard Light B' => 'Lumière standard B', + 'Standard Light C' => 'Lumière standard C', + 'Tungsten (Incandescent)' => 'Tungstène (lumière incandescente)', + 'Unknown' => 'Inconnue', + 'Warm White Fluorescent' => 'Fluorescent blanc chaud', + 'White Fluorescent' => 'Fluorescent blanc', + }, + }, + 'CameraCalibration1' => 'Calibration d\'appareil 1', + 'CameraCalibration2' => 'Calibration d\'appareil 2', + 'CameraCalibrationSig' => 'Signature de calibration de l\'appareil', + 'CameraOrientation' => { + Description => 'Orientation de l\'image', + PrintConv => { + 'Horizontal (normal)' => '0° (haut/gauche)', + 'Rotate 270 CW' => '90° sens horaire (gauche/bas)', + 'Rotate 90 CW' => '90° sens antihoraire (droit/haut)', + }, + }, + 'CameraSerialNumber' => 'Numéro de série de l\'appareil', + 'CameraSettings' => 'Réglages de l\'appareil', + 'CameraTemperature' => 'Température de l\'appareil', + 'CameraType' => 'Type d\'objectif Pentax', + 'CanonExposureMode' => { + PrintConv => { + 'Aperture-priority AE' => 'Priorité ouverture', + 'Bulb' => 'Pose B', + 'Manual' => 'Manuelle', + 'Program AE' => 'Programme d\'exposition automatique', + 'Shutter speed priority AE' => 'Priorité vitesse', + }, + }, + 'CanonFirmwareVersion' => 'Version de firmware', + 'CanonFlashMode' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + 'Red-eye reduction' => 'Réduction yeux rouges', + }, + }, + 'CanonImageSize' => { + PrintConv => { + 'Large' => 'Grande', + 'Medium' => 'Moyenne', + 'Medium 1' => 'Moyenne 1', + 'Medium 2' => 'Moyenne 2', + 'Medium 3' => 'Moyenne 3', + 'Small' => 'Petite', + 'Small 1' => 'Petite 1', + 'Small 2' => 'Petite 2', + 'Small 3' => 'Petite 3', + }, + }, + 'Caption-Abstract' => 'Légende / Description', + 'CaptionWriter' => 'Rédacteur', + 'CaptureXResolutionUnit' => { + PrintConv => { + 'um' => 'µm (micromètre)', + }, + }, + 'CaptureYResolutionUnit' => { + PrintConv => { + 'um' => 'µm (micromètre)', + }, + }, + 'Categories' => 'Catégories', + 'Category' => 'Catégorie', + 'CellLength' => 'Longueur de cellule', + 'CellWidth' => 'Largeur de cellule', + 'CenterWeightedAreaSize' => { + PrintConv => { + 'Average' => 'Moyenne', + }, + }, + 'Certificate' => 'Certificat', + 'CharTarget' => 'Cible caractère', + 'CharacterSet' => 'Jeu de caractères', + 'ChromaBlurRadius' => 'Rayon de flou de chromatisme', + 'ChromaticAdaptation' => 'Adaptation chromatique', + 'Chromaticity' => 'Chromaticité', + 'ChrominanceNR_TIFF_JPEG' => { + PrintConv => { + 'Low' => 'Bas', + 'Off' => 'Désactivé', + }, + }, + 'ChrominanceNoiseReduction' => { + PrintConv => { + 'Low' => 'Bas', + 'Off' => 'Désactivé', + }, + }, + 'CircleOfConfusion' => 'Cercle de confusion', + 'City' => 'Ville', + 'ClassifyState' => 'État de classification', + 'CleanFaxData' => 'Données de Fax propres', + 'ClipPath' => 'Chemin de rognage', + 'CodedCharacterSet' => 'Jeu de caractères codé', + 'CollectionName' => 'Nom de collection', + 'ColorAberrationControl' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ColorAdjustmentMode' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ColorBalance' => 'Balance des couleurs', + 'ColorBalanceAdj' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ColorBalanceVersion' => 'Version de la Balance des couleurs', + 'ColorBooster' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ColorCalibrationMatrix' => 'Table de matrice de calibration de couleur', + 'ColorCharacterization' => 'Caractérisation de couleur', + 'ColorComponents' => 'Composants colorimétriques', + 'ColorEffect' => { + Description => 'Effet de couleurs', + PrintConv => { + 'Black & White' => 'Noir et blanc', + 'Cool' => 'Froide', + 'Off' => 'Désactivé', + 'Sepia' => 'Sépia', + 'Warm' => 'Chaude', + }, + }, + 'ColorFilter' => { + Description => 'Filtre de couleur', + PrintConv => { + 'Blue' => 'Bleu', + 'Green' => 'Vert', + 'Off' => 'Désactivé', + 'Red' => 'Rouge', + 'Yellow' => 'Jaune', + }, + }, + 'ColorHue' => 'Teinte de couleur', + 'ColorInfo' => 'Info couleur', + 'ColorMap' => 'Charte de couleur', + 'ColorMatrix1' => 'Matrice de couleur 1', + 'ColorMatrix2' => 'Matrice de couleur 2', + 'ColorMode' => { + Description => 'Mode colorimétrique', + PrintConv => { + 'Adobe RGB' => 'AdobeRVB', + 'Autumn Leaves' => 'Feuilles automne', + 'B&W' => 'Noir & Blanc', + 'Clear' => 'Lumineux', + 'Deep' => 'Profond', + 'Evening' => 'Soir', + 'Landscape' => 'Paysage', + 'Light' => 'Pastel', + 'Natural' => 'Naturel', + 'Neutral' => 'Neutre', + 'Night Scene' => 'Nocturne', + 'Night View' => 'Vision nocturne', + 'Night View/Portrait' => 'Portrait nocturne', + 'Normal' => 'Normale', + 'Off' => 'Désactivé', + 'RGB' => 'RVB', + 'Sunset' => 'Coucher de soleil', + 'Vivid' => 'Vives', + }, + }, + 'ColorMoireReduction' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ColorMoireReductionMode' => { + PrintConv => { + 'Low' => 'Bas', + 'Off' => 'Désactivé', + }, + }, + 'ColorPalette' => 'Palette de couleur', + 'ColorRepresentation' => { + Description => 'Représentation de couleur', + PrintConv => { + '3 Components, Frame Sequential in Multiple Objects' => 'Trois composantes, Vue séquentielle dans différents objets', + '3 Components, Frame Sequential in One Object' => 'Trois composantes, Vue séquentielle dans un objet', + '3 Components, Line Sequential' => 'Trois composantes, Ligne séquentielle', + '3 Components, Pixel Sequential' => 'Trois composantes, Pixel séquentiel', + '3 Components, Single Frame' => 'Trois composantes, Vue unique', + '3 Components, Special Interleaving' => 'Trois composantes, Entrelacement spécial', + '4 Components, Frame Sequential in Multiple Objects' => 'Quatre composantes, Vue séquentielle dans différents objets', + '4 Components, Frame Sequential in One Object' => 'Quatre composantes, Vue séquentielle dans un objet', + '4 Components, Line Sequential' => 'Quatre composantes, Ligne séquentielle', + '4 Components, Pixel Sequential' => 'Quatre composantes, Pixel séquentiel', + '4 Components, Single Frame' => 'Quatre composantes, Vue unique', + '4 Components, Special Interleaving' => 'Quatre composantes, Entrelacement spécial', + 'Monochrome, Single Frame' => 'Monochrome, Vue unique', + 'No Image, Single Frame' => 'Pas d\'image, Vue unique', + }, + }, + 'ColorResponseUnit' => 'Unité de réponse couleur', + 'ColorSequence' => 'Séquence de couleur', + 'ColorSpace' => { + Description => 'Espace colorimétrique', + PrintConv => { + 'ICC Profile' => 'Profil ICC', + 'RGB' => 'RVB', + 'Uncalibrated' => 'Non calibré', + 'Wide Gamut RGB' => 'Wide Gamut RVB', + 'sRGB' => 'sRVB', + }, + }, + 'ColorSpaceData' => 'Espace de couleur de données', + 'ColorTable' => 'Tableau de couleurs', + 'ColorTemperature' => 'Température de couleur', + 'ColorTone' => { + Description => 'Teinte couleur', + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'ColorType' => { + PrintConv => { + 'RGB' => 'RVB', + }, + }, + 'ColorantOrder' => 'Ordre de colorant', + 'ColorantTable' => 'Table de colorant', + 'ColorimetricReference' => 'Référence colorimétrique', + 'CommandDialsChangeMainSub' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'CommandDialsMenuAndPlayback' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'CommandDialsReverseRotation' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'CommanderGroupAMode' => { + PrintConv => { + 'Manual' => 'Manuelle', + 'Off' => 'Désactivé', + }, + }, + 'CommanderGroupBMode' => { + PrintConv => { + 'Manual' => 'Manuelle', + 'Off' => 'Désactivé', + }, + }, + 'CommanderInternalFlash' => { + PrintConv => { + 'Manual' => 'Manuelle', + 'Off' => 'Désactivé', + }, + }, + 'Comment' => 'Commentaire', + 'Comments' => 'Commentaires', + 'Compilation' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'ComponentsConfiguration' => 'Signification de chaque composante', + 'CompressedBitsPerPixel' => 'Mode de compression d\'image', + 'Compression' => { + Description => 'Schéma de compression', + PrintConv => { + 'JBIG Color' => 'JBIG Couleur', + 'JPEG' => 'Compression JPEG', + 'JPEG (old-style)' => 'JPEG (ancien style)', + 'Kodak DCR Compressed' => 'Compression Kodak DCR', + 'Kodak KDC Compressed' => 'Compression Kodak KDC', + 'Next' => 'Encodage NeXT 2 bits', + 'Nikon NEF Compressed' => 'Compression Nikon NEF', + 'None' => 'Aucune', + 'Pentax PEF Compressed' => 'Compression Pentax PEF', + 'SGILog' => 'Encodage Log luminance SGI 32 bits', + 'SGILog24' => 'Encodage Log luminance SGI 24 bits', + 'Sony ARW Compressed' => 'Compression Sony ARW', + 'Thunderscan' => 'Encodage ThunderScan 4 bits', + 'Uncompressed' => 'Non compressé', + }, + }, + 'CompressionType' => { + PrintConv => { + 'None' => 'Aucune', + }, + }, + 'ConditionalFEC' => 'Compensation exposition flash', + 'ConnectionSpaceIlluminant' => 'Illuminant d\'espace de connexion', + 'ConsecutiveBadFaxLines' => 'Mauvaises lignes de Fax consécutives', + 'ContentLocationCode' => 'Code du lieu du contenu', + 'ContentLocationName' => 'Nom du lieu du contenu', + 'ContinuousDrive' => { + PrintConv => { + 'Movie' => 'Vidéo', + }, + }, + 'ContinuousShootingSpeed' => { + Description => 'Vitesse de prise de vues en continu', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activée', + }, + }, + 'ContinuousShotLimit' => { + Description => 'Limiter nombre de vues en continu', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activée', + }, + }, + 'Contrast' => { + Description => 'Contraste', + PrintConv => { + '+1 (medium high)' => '+1 (Assez fort)', + '+2 (high)' => '+2 (Forte)', + '+3 (very high)' => '+3 (Très fort)', + '-1 (medium low)' => '-1 (Assez faible)', + '-2 (low)' => '-2 (Faible)', + '-3 (very low)' => '-3 (Très faible)', + '0 (normal)' => '0 (Normale)', + 'High' => 'Dur', + 'Low' => 'Doux', + 'Medium High' => 'Moyen Haut', + 'Medium Low' => 'Moyen Faible', + 'Normal' => 'Normale', + 'n/a' => 'Non établie', + }, + }, + 'ContrastCurve' => 'Courbe de contraste', + 'Contributor' => 'Contributeur', + 'ControlMode' => { + PrintConv => { + 'n/a' => 'Non établie', + }, + }, + 'ConversionLens' => { + Description => 'Complément Optique', + PrintConv => { + 'Off' => 'Désactivé', + 'Telephoto' => 'Télé', + 'Wide' => 'Grand angulaire', + }, + }, + 'Copyright' => 'Propriétaire du copyright', + 'CopyrightNotice' => 'Mention de copyright', + 'CopyrightStatus' => { + PrintConv => { + 'Unknown' => 'Inconnu', + }, + }, + 'Country' => 'Pays', + 'Country-PrimaryLocationCode' => 'Code de pays ISO', + 'Country-PrimaryLocationName' => 'Pays', + 'CountryCode' => 'Code pays', + 'Coverage' => 'Couverture', + 'CreateDate' => 'Date de la création des données numériques', + 'CreationDate' => 'Date de création', + 'Creator' => 'Créateur', + 'CreatorAddress' => 'Adresse du créateur', + 'CreatorCity' => 'Lieu d\'Habitation du créateur', + 'CreatorContactInfo' => 'Contact créateur', + 'CreatorCountry' => 'Pays du créateur', + 'CreatorPostalCode' => 'Code postal du créateur', + 'CreatorRegion' => 'Région du créateur', + 'CreatorTool' => 'Outil de création', + 'CreatorWorkEmail' => 'Courriel professionnel du créateur', + 'CreatorWorkTelephone' => 'Téléphone professionnel créateur', + 'CreatorWorkURL' => 'URL professionnelle du créateur', + 'Credit' => 'Fournisseur', + 'CropActive' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'CropUnit' => { + PrintConv => { + 'inches' => 'Pouce', + }, + }, + 'CropUnits' => { + PrintConv => { + 'inches' => 'Pouce', + }, + }, + 'CurrentICCProfile' => 'Profil ICC actuel', + 'CurrentIPTCDigest' => 'Sommaire courant IPTC', + 'CurrentPreProfileMatrix' => 'Matrice de pré-profil actuelle', + 'Curves' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'CustomRendered' => { + Description => 'Traitement d\'image personnalisé', + PrintConv => { + 'Custom' => 'Traitement personnalisé', + 'Normal' => 'Traitement normal', + }, + }, + 'D-LightingHQ' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'D-LightingHQSelected' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'D-LightingHS' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'DNGBackwardVersion' => 'Version DNG antérieure', + 'DNGLensInfo' => 'Distance focale minimale', + 'DNGVersion' => 'Version DNG', + 'DOF' => 'Profondeur de champ', + 'DSPFirmwareVersion' => 'Version de firmware de DSP', + 'DataCompressionMethod' => 'Fournisseur/propriétaire de l\'algorithme de compression de données', + 'DataDump' => 'Vidage données', + 'DataImprint' => { + PrintConv => { + 'None' => 'Aucune', + 'Text' => 'Texte', + }, + }, + 'DataType' => 'Type de données', + 'DateCreated' => 'Date de création', + 'DateDisplayFormat' => { + Description => 'Format date', + PrintConv => { + 'D/M/Y' => 'Jour/Mois/Année', + 'M/D/Y' => 'Mois/Jour/Année', + 'Y/M/D' => 'Année/Mois/Jour', + }, + }, + 'DateSent' => 'Date d\'envoi', + 'DateStampMode' => { + PrintConv => { + 'Date & Time' => 'Date et heure', + 'Off' => 'Désactivé', + }, + }, + 'DateTime' => 'Date de modification du fichier', + 'DateTimeCreated' => 'Date/heure de création', + 'DateTimeDigitized' => 'Date/heure de la numérisation', + 'DateTimeOriginal' => 'Date de la création des données originales', + 'DaylightSavings' => { + Description => 'Heure d\'été', + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'DefaultCropOrigin' => 'Origine de rognage par défaut', + 'DefaultCropSize' => 'Taille de rognage par défaut', + 'DefaultScale' => 'Echelle par défaut', + 'DeletedImageCount' => 'Compteur d\'images supprimées', + 'DestinationCity' => 'Ville de destination', + 'DestinationCityCode' => 'Code ville de destination', + 'DestinationDST' => { + Description => 'Heure d\'été de destination', + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'DeviceAttributes' => 'Attributs d\'appareil', + 'DeviceManufacturer' => 'Fabricant de l\'appareil', + 'DeviceMfgDesc' => 'Description du fabricant d\'appareil', + 'DeviceModel' => 'Modèle de l\'appareil', + 'DeviceModelDesc' => 'Description du modèle d\'appareil', + 'DeviceSettingDescription' => 'Description des réglages du dispositif', + 'DialDirectionTvAv' => { + Description => 'Sens rotation molette Tv/Av', + PrintConv => { + 'Normal' => 'Normale', + 'Reversed' => 'Sens inversé', + }, + }, + 'DigitalCreationDate' => 'Date de numérisation', + 'DigitalCreationTime' => 'Heure de numérisation', + 'DigitalImageGUID' => 'GUID de l\'image numérique', + 'DigitalSourceFileType' => 'Type de fichier de la source numérique', + 'DigitalZoom' => { + Description => 'Zoom numérique', + PrintConv => { + 'None' => 'Aucune', + 'Off' => 'Désactivé', + }, + }, + 'DigitalZoomOn' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'DigitalZoomRatio' => 'Rapport de zoom numérique', + 'Directory' => 'Dossier', + 'DirectoryNumber' => 'Numéro de dossier', + 'DisplaySize' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'DisplayUnits' => { + PrintConv => { + 'inches' => 'Pouce', + }, + }, + 'DisplayXResolutionUnit' => { + PrintConv => { + 'um' => 'µm (micromètre)', + }, + }, + 'DisplayYResolutionUnit' => { + PrintConv => { + 'um' => 'µm (micromètre)', + }, + }, + 'DisplayedUnitsX' => { + PrintConv => { + 'inches' => 'Pouce', + }, + }, + 'DisplayedUnitsY' => { + PrintConv => { + 'inches' => 'Pouce', + }, + }, + 'DistortionCorrection' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'DistortionCorrection2' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'DjVuVersion' => 'Version DjVu', + 'DocumentHistory' => 'Historique du document', + 'DocumentName' => 'Nom du document', + 'DocumentNotes' => 'Remarques sur le document', + 'DotRange' => 'Étendue de points', + 'DriveMode' => { + Description => 'Mode de prise de vue', + PrintConv => { + 'Burst' => 'Rafale', + 'Continuous' => 'Continu', + 'Continuous High' => 'Continu (ultrarapide)', + 'Continuous Shooting' => 'Prise de vues en continu', + 'Multiple Exposure' => 'Exposition multiple', + 'No Timer' => 'Pas de retardateur', + 'Off' => 'Désactivé', + 'Remote Control' => 'Télécommande', + 'Remote Control (3 s delay)' => 'Télécommande (retard 3 s)', + 'Self-timer (12 s)' => 'Retardateur (12 s)', + 'Self-timer (2 s)' => 'Retardateur (2 s)', + 'Self-timer Operation' => 'Retardateur', + 'Shutter Button' => 'Déclencheur', + 'Single Exposure' => 'Exposition unique', + 'Single-frame' => 'Vue par vue', + 'Single-frame Shooting' => 'Prise de vue unique', + }, + }, + 'DriveMode2' => { + Description => 'Exposition multiple', + PrintConv => { + 'Single-frame' => 'Vue par vue', + }, + }, + 'Duration' => 'Durée', + 'DynamicRangeExpansion' => { + Description => 'Expansion de la dynamique', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'DynamicRangeOptimizer' => { + Description => 'Optimiseur Dyna', + PrintConv => { + 'Advanced Auto' => 'Avancé Auto', + 'Advanced Lv1' => 'Avancé Niv1', + 'Advanced Lv2' => 'Avancé Niv2', + 'Advanced Lv3' => 'Avancé Niv3', + 'Advanced Lv4' => 'Avancé Niv4', + 'Advanced Lv5' => 'Avancé Niv5', + 'Auto' => 'Auto.', + 'Off' => 'Désactivé', + }, + }, + 'E-DialInProgram' => { + PrintConv => { + 'P Shift' => 'Décalage P', + 'Tv or Av' => 'Tv ou Av', + }, + }, + 'ETTLII' => { + PrintConv => { + 'Average' => 'Moyenne', + 'Evaluative' => 'Évaluative', + }, + }, + 'EVStepInfo' => 'Info de pas IL', + 'EVSteps' => { + Description => 'Pas IL', + PrintConv => { + '1/2 EV Steps' => 'Pas de 1/2 IL', + '1/3 EV Steps' => 'Pas de 1/3 IL', + }, + }, + 'EasyExposureCompensation' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'EasyMode' => { + PrintConv => { + 'Beach' => 'Plage', + 'Color Accent' => 'Couleur contrastée', + 'Color Swap' => 'Permuter couleur', + 'Fireworks' => 'Feu d\'artifice', + 'Foliage' => 'Feuillages', + 'Indoor' => 'Intérieur', + 'Kids & Pets' => 'Enfants & animaux', + 'Landscape' => 'Paysage', + 'Manual' => 'Manuelle', + 'Night' => 'Scène de nuit', + 'Night Snapshot' => 'Mode Nuit', + 'Snow' => 'Neige', + 'Sports' => 'Sport', + 'Super Macro' => 'Super macro', + 'Underwater' => 'Sous-marin', + }, + }, + 'EdgeNoiseReduction' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'EditStatus' => 'Statut d\'édition', + 'EditorialUpdate' => { + Description => 'Mise à jour éditoriale', + PrintConv => { + 'Additional language' => 'Langues supplémentaires', + }, + }, + 'EffectiveLV' => 'Indice de lumination effectif', + 'EffectiveMaxAperture' => 'Ouverture effective maxi de l\'Objectif', + 'Emphasis' => { + PrintConv => { + 'None' => 'Aucune', + }, + }, + 'EncodingProcess' => { + Description => 'Procédé de codage', + PrintConv => { + 'Baseline DCT, Huffman coding' => 'Baseline DCT, codage Huffman', + 'Extended sequential DCT, Huffman coding' => 'Extended sequential DCT, codage Huffman', + 'Extended sequential DCT, arithmetic coding' => 'Extended sequential DCT, codage arithmétique', + 'Lossless, Differential Huffman coding' => 'Lossless, codage Huffman différentiel', + 'Lossless, Huffman coding' => 'Lossless, codage Huffman', + 'Lossless, arithmetic coding' => 'Lossless, codage arithmétique', + 'Lossless, differential arithmetic coding' => 'Lossless, codage arithmétique différentiel', + 'Progressive DCT, Huffman coding' => 'Progressive DCT, codage Huffman', + 'Progressive DCT, arithmetic coding' => 'Progressive DCT, codage arithmétique', + 'Progressive DCT, differential Huffman coding' => 'Progressive DCT, codage Huffman différentiel', + 'Progressive DCT, differential arithmetic coding' => 'Progressive DCT, codage arithmétique différentiel', + 'Sequential DCT, differential Huffman coding' => 'Sequential DCT, codage Huffman différentiel', + 'Sequential DCT, differential arithmetic coding' => 'Sequential DCT, codage arithmétique différentiel', + }, + }, + 'Encryption' => 'Chiffrage', + 'EndPoints' => 'Points de terminaison', + 'EnhanceDarkTones' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'Enhancement' => { + PrintConv => { + 'Blue' => 'Bleu', + 'Green' => 'Vert', + 'Off' => 'Désactivé', + 'Red' => 'Rouge', + }, + }, + 'EnvelopeNumber' => 'Numéro d\'enveloppe', + 'EnvelopePriority' => { + Description => 'Priorité d\'enveloppe', + PrintConv => { + '0 (reserved)' => '0 (réservé pour utilisation future)', + '1 (most urgent)' => '1 (très urgent)', + '5 (normal urgency)' => '5 (normalement urgent)', + '8 (least urgent)' => '8 (moins urgent)', + '9 (user-defined priority)' => '9 (priorité définie par l\'utilisateur)', + }, + }, + 'EnvelopeRecordVersion' => 'Version d\'enregistrement', + 'Error' => 'Erreur', + 'Event' => 'Evenement', + 'ExcursionTolerance' => { + Description => 'Tolérance d\'excursion ', + PrintConv => { + 'Allowed' => 'Possible', + 'Not Allowed' => 'Non permis (défaut)', + }, + }, + 'ExifByteOrder' => 'Indicateur d\'ordre des octets Exif', + 'ExifCameraInfo' => 'Info d\'appareil photo Exif', + 'ExifImageHeight' => 'Hauteur d\'image', + 'ExifImageWidth' => 'Largeur d\'image', + 'ExifOffset' => 'Pointeur Exif IFD', + 'ExifToolVersion' => 'Version ExifTool', + 'ExifUnicodeByteOrder' => 'Indicateur d\'ordre des octets Unicode Exif', + 'ExifVersion' => 'Version Exif', + 'ExitPupilPosition' => 'Position de la pupille de sortie', + 'ExpandFilm' => 'Extension film', + 'ExpandFilterLens' => 'Extension lentille filtre', + 'ExpandFlashLamp' => 'Extension lampe flash', + 'ExpandLens' => 'Extension objectif', + 'ExpandScanner' => 'Extension Scanner', + 'ExpandSoftware' => 'Extension logiciel', + 'ExpirationDate' => 'Date d\'expiration', + 'ExpirationTime' => 'Heure d\'expiration', + 'ExposureBracketStepSize' => 'Intervalle de bracketing d\'exposition', + 'ExposureBracketValue' => 'Valeur Bracketing Expo', + 'ExposureCompensation' => 'Décalage d\'exposition', + 'ExposureDelayMode' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ExposureDifference' => 'Correction d\'exposition', + 'ExposureIndex' => 'Indice d\'exposition', + 'ExposureLevelIncrements' => { + Description => 'Paliers de réglage d\'expo', + PrintConv => { + '1-stop set, 1/3-stop comp.' => 'Réglage 1 valeur, correction 1/3 val.', + '1/2 Stop' => 'Palier 1/2', + '1/2-stop set, 1/2-stop comp.' => 'Réglage 1/2 valeur, correction 1/2 val.', + '1/3 Stop' => 'Palier 1/3', + '1/3-stop set, 1/3-stop comp.' => 'Réglage 1/3 valeur, correction 1/3 val.', + }, + }, + 'ExposureMode' => { + Description => 'Mode d\'exposition', + PrintConv => { + 'Aperture Priority' => 'Priorité ouverture', + 'Aperture-priority AE' => 'Priorité ouverture', + 'Auto' => 'Exposition automatique', + 'Auto bracket' => 'Bracketting auto', + 'Bulb' => 'Pose B', + 'Landscape' => 'Paysage', + 'Manual' => 'Exposition manuelle', + 'Night Scene / Twilight' => 'Nocturne', + 'Shutter Priority' => 'Priorité vitesse', + 'Shutter speed priority AE' => 'Priorité vitesse', + }, + }, + 'ExposureModeInManual' => { + Description => 'Mode d\'exposition manuelle', + PrintConv => { + 'Center-weighted average' => 'Centrale pondérée', + 'Evaluative metering' => 'Mesure évaluativ', + 'Partial metering' => 'Partielle', + 'Specified metering mode' => 'Mode de mesure spécifié', + 'Spot metering' => 'Spot', + }, + }, + 'ExposureProgram' => { + Description => 'Programme d\'exposition', + PrintConv => { + 'Action (High speed)' => 'Programme action (orienté grandes vitesses d\'obturation)', + 'Aperture Priority' => 'Priorité ouverture', + 'Aperture-priority AE' => 'Priorité ouverture', + 'Creative (Slow speed)' => 'Programme créatif (orienté profondeur de champ)', + 'Landscape' => 'Mode paysage', + 'Manual' => 'Manuel', + 'Not Defined' => 'Non défini', + 'Portrait' => 'Mode portrait', + 'Program AE' => 'Programme normal', + 'Shutter Priority' => 'Priorité vitesse', + 'Shutter speed priority AE' => 'Priorité vitesse', + }, + }, + 'ExposureTime' => 'Temps de pose', + 'ExposureTime2' => 'Temps de pose 2', + 'ExtendedWBDetect' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ExtenderStatus' => { + PrintConv => { + 'Attached' => 'Attaché', + 'Not attached' => 'Non attaché', + 'Removed' => 'Retiré', + }, + }, + 'ExternalFlash' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ExternalFlashBounce' => { + Description => 'Réflexion flash externe', + PrintConv => { + 'Bounce' => 'Avec réflecteur', + 'No' => 'Non', + 'Yes' => 'Oui', + 'n/a' => 'Non établie', + }, + }, + 'ExternalFlashExposureComp' => { + Description => 'Compensation d\'exposition flash externe', + PrintConv => { + '-0.5' => '-0.5 IL', + '-1.0' => '-1.0 IL', + '-1.5' => '-1.5 IL', + '-2.0' => '-2.0 IL', + '-2.5' => '-2.5 IL', + '-3.0' => '-3.0 IL', + '0.0' => '0.0 IL', + '0.5' => '0.5 IL', + '1.0' => '1.0 IL', + 'n/a' => 'Non établie (éteint ou modes auto)', + 'n/a (Manual Mode)' => 'Non établie (mode manuel)', + }, + }, + 'ExternalFlashGuideNumber' => 'Nombre guide flash externe', + 'ExternalFlashMode' => { + Description => 'Segment de mesure flash esclave 3', + PrintConv => { + 'Off' => 'Désactivé', + 'On, Auto' => 'En service, auto', + 'On, Contrast-control Sync' => 'En service, synchro contrôle des contrastes', + 'On, Flash Problem' => 'En service, problème de flash', + 'On, High-speed Sync' => 'En service, synchro haute vitesse', + 'On, Manual' => 'En service, manuel', + 'On, P-TTL Auto' => 'En service, auto P-TTL', + 'On, Wireless' => 'En service, sans cordon', + 'On, Wireless, High-speed Sync' => 'En service, sans cordon, synchro haute vitesse', + 'n/a - Off-Auto-Aperture' => 'N/c - auto-diaph hors service', + }, + }, + 'ExtraSamples' => 'Echantillons supplémentaires', + 'FNumber' => 'Nombre F', + 'FOV' => 'Champ de vision', + 'FaceOrientation' => { + PrintConv => { + 'Horizontal (normal)' => '0° (haut/gauche)', + 'Rotate 180' => '180° (bas/droit)', + 'Rotate 270 CW' => '90° sens horaire (gauche/bas)', + 'Rotate 90 CW' => '90° sens antihoraire (droit/haut)', + }, + }, + 'FastSeek' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'FaxProfile' => { + PrintConv => { + 'Unknown' => 'Inconnu', + }, + }, + 'FaxRecvParams' => 'Paramètres de réception Fax', + 'FaxRecvTime' => 'Temps de réception Fax', + 'FaxSubAddress' => 'Sous-adresse Fax', + 'FileFormat' => 'Format de fichier', + 'FileInfo' => 'Infos Fichier', + 'FileInfoVersion' => 'Version des Infos Fichier', + 'FileModifyDate' => 'Date/heure de modification du fichier', + 'FileName' => 'Nom de fichier', + 'FileNumber' => 'Numéro de fichier', + 'FileNumberMemory' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'FileNumberSequence' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'FileSize' => 'Taille du fichier', + 'FileSource' => { + Description => 'Source du fichier', + PrintConv => { + 'Digital Camera' => 'Appareil photo numérique', + 'Film Scanner' => 'Scanner de film', + 'Reflection Print Scanner' => 'Scanner par réflexion', + }, + }, + 'FileType' => 'Type de fichier', + 'FileVersion' => 'Version de format de fichier', + 'Filename' => 'Nom du fichier ', + 'FillFlashAutoReduction' => { + Description => 'Mesure E-TTL', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activé', + }, + }, + 'FillOrder' => { + Description => 'Ordre de remplissage', + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'FilmMode' => { + Description => 'Mode Film', + PrintConv => { + 'Dynamic (B&W)' => 'Vives (N & Bà)', + 'Dynamic (color)' => 'Couleurs vives', + 'Nature (color)' => 'Couleurs naturelles', + 'Smooth (B&W)' => 'Pastel (N & B)', + 'Smooth (color)' => 'Couleurs pastel', + 'Standard (B&W)' => 'Normales (N & B)', + 'Standard (color)' => 'Couleurs normales', + }, + }, + 'FilterEffect' => { + Description => 'Effet de filtre', + PrintConv => { + 'Green' => 'Vert', + 'None' => 'Aucune', + 'Off' => 'Désactivé', + 'Red' => 'Rouge', + 'Yellow' => 'Jaune', + 'n/a' => 'Non établie', + }, + }, + 'FilterEffectMonochrome' => { + PrintConv => { + 'Green' => 'Vert', + 'None' => 'Aucune', + 'Red' => 'Rouge', + 'Yellow' => 'Jaune', + }, + }, + 'FinderDisplayDuringExposure' => { + Description => 'Affich. viseur pendant expo.', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'FirmwareVersion' => 'Version de firmware', + 'FixtureIdentifier' => 'Identificateur d\'installation', + 'Flash' => { + Description => 'Flash ', + PrintConv => { + 'Auto, Did not fire' => 'Flash non déclenché, mode auto', + 'Auto, Did not fire, Red-eye reduction' => 'Auto, flash non déclenché, mode réduction yeux rouges', + 'Auto, Fired' => 'Flash déclenché, mode auto', + 'Auto, Fired, Red-eye reduction' => 'Flash déclenché, mode auto, mode réduction yeux rouges, lumière renvoyée détectée', + 'Auto, Fired, Red-eye reduction, Return detected' => 'Flash déclenché, mode auto, lumière renvoyée détectée, mode réduction yeux rouges', + 'Auto, Fired, Red-eye reduction, Return not detected' => 'Flash déclenché, mode auto, lumière renvoyée non détectée, mode réduction yeux rouges', + 'Auto, Fired, Return detected' => 'Flash déclenché, mode auto, lumière renvoyée détectée', + 'Auto, Fired, Return not detected' => 'Flash déclenché, mode auto, lumière renvoyée non détectée', + 'Did not fire' => 'Flash non déclenché', + 'Fired' => 'Flash déclenché', + 'Fired, Red-eye reduction' => 'Flash déclenché, mode réduction yeux rouges', + 'Fired, Red-eye reduction, Return detected' => 'Flash déclenché, mode réduction yeux rouges, lumière renvoyée détectée', + 'Fired, Red-eye reduction, Return not detected' => 'Flash déclenché, mode réduction yeux rouges, lumière renvoyée non détectée', + 'Fired, Return detected' => 'Lumière renvoyée sur le capteur détectée', + 'Fired, Return not detected' => 'Lumière renvoyée sur le capteur non détectée', + 'No Flash' => 'Flash non déclenché', + 'No flash function' => 'Pas de fonction flash', + 'Off' => 'Désactivé', + 'Off, Did not fire' => 'Flash non déclenché, mode flash forcé', + 'Off, Did not fire, Return not detected' => 'Éteint, flash non déclenché, lumière renvoyée non détectée', + 'Off, No flash function' => 'Éteint, pas de fonction flash', + 'Off, Red-eye reduction' => 'Éteint, mode réduction yeux rouges', + 'On' => 'Activé', + 'On, Did not fire' => 'Hors service, flash non déclenché', + 'On, Fired' => 'Flash déclenché, mode flash forcé', + 'On, Red-eye reduction' => 'Flash déclenché, mode forcé, mode réduction yeux rouges', + 'On, Red-eye reduction, Return detected' => 'Flash déclenché, mode forcé, mode réduction yeux rouges, lumière renvoyée détectée', + 'On, Red-eye reduction, Return not detected' => 'Flash déclenché, mode forcé, mode réduction yeux rouges, lumière renvoyée non détectée', + 'On, Return detected' => 'Flash déclenché, mode flash forcé, lumière renvoyée détectée', + 'On, Return not detected' => 'Flash déclenché, mode flash forcé, lumière renvoyée non détectée', + }, + }, + 'FlashBias' => 'Décalage Flash', + 'FlashCommanderMode' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'FlashCompensation' => 'Compensation flash', + 'FlashControlMode' => { + Description => 'Mode de Contrôle du Flash', + PrintConv => { + 'Manual' => 'Manuelle', + 'Off' => 'Désactivé', + }, + }, + 'FlashDevice' => { + PrintConv => { + 'None' => 'Aucune', + }, + }, + 'FlashEnergy' => 'Énergie du flash', + 'FlashExposureBracketValue' => 'Valeur Bracketing Flash', + 'FlashExposureComp' => 'Compensation d\'exposition au flash', + 'FlashExposureCompSet' => 'Réglage de compensation d\'exposition au flash', + 'FlashExposureLock' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'FlashFired' => { + Description => 'Flash utilisé', + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'FlashFiring' => { + Description => 'Émission de l\'éclair', + PrintConv => { + 'Does not fire' => 'Désactivé', + 'Fires' => 'Activé', + }, + }, + 'FlashFocalLength' => 'Focale Flash', + 'FlashFunction' => 'Fonction flash', + 'FlashGroupAControlMode' => { + PrintConv => { + 'Manual' => 'Manuelle', + 'Off' => 'Désactivé', + }, + }, + 'FlashGroupBControlMode' => { + PrintConv => { + 'Manual' => 'Manuelle', + 'Off' => 'Désactivé', + }, + }, + 'FlashGroupCControlMode' => { + PrintConv => { + 'Manual' => 'Manuelle', + 'Off' => 'Désactivé', + }, + }, + 'FlashInfo' => 'Information flash', + 'FlashInfoVersion' => 'Version de l\'info Flash', + 'FlashIntensity' => { + PrintConv => { + 'High' => 'Haut', + 'Low' => 'Bas', + 'Normal' => 'Normale', + 'Strong' => 'Forte', + }, + }, + 'FlashMeteringSegments' => 'Segments de mesure flash', + 'FlashMode' => { + Description => 'Mode flash', + PrintConv => { + 'Auto, Did not fire' => 'Auto, non déclenché', + 'Auto, Did not fire, Red-eye reduction' => 'Auto, non déclenché, réduction yeux rouges', + 'Auto, Fired' => 'Auto, déclenché', + 'Auto, Fired, Red-eye reduction' => 'Auto, déclenché, réduction yeux rouges', + 'Did Not Fire' => 'Eclair non-déclenché', + 'External, Auto' => 'Externe, auto', + 'External, Contrast-control Sync' => 'Externe, synchro contrôle des contrastes', + 'External, Flash Problem' => 'Externe, problème de flash ?', + 'External, High-speed Sync' => 'Externe, synchro haute vitesse', + 'External, Manual' => 'Externe, manuel', + 'External, P-TTL Auto' => 'Externe, P-TTL', + 'External, Wireless' => 'Externe, sans cordon', + 'External, Wireless, High-speed Sync' => 'Externe, sans cordon, synchro haute vitesse', + 'Fired, Commander Mode' => 'Eclair déclenché, Mode maître', + 'Fired, External' => 'Eclair déclenché, Exterieur', + 'Fired, Manual' => 'Eclair déclenché, Manuel', + 'Fired, TTL Mode' => 'Eclair déclenché, Mode TTL', + 'Internal' => 'Interne', + 'Normal' => 'Normale', + 'Off' => 'Désactivé', + 'Off, Did not fire' => 'Hors service', + 'On' => 'Activé', + 'On, Did not fire' => 'En service, non déclenché', + 'On, Fired' => 'En service', + 'On, Red-eye reduction' => 'En service, réduction yeux rouges', + 'On, Slow-sync' => 'En service, synchro lente', + 'On, Slow-sync, Red-eye reduction' => 'En service, synchro lente, réduction yeux rouges', + 'On, Soft' => 'En service, doux', + 'On, Trailing-curtain Sync' => 'En service, synchro 2e rideau', + 'On, Wireless (Control)' => 'En service, sans cordon (esclave)', + 'On, Wireless (Master)' => 'En service, sans cordon (maître)', + 'Red-eye Reduction' => 'Réduction yeux rouges', + 'Red-eye reduction' => 'Réduction yeux rouges', + 'Unknown' => 'Inconnu', + 'n/a - Off-Auto-Aperture' => 'N/c - auto-diaph hors service', + }, + }, + 'FlashModel' => { + Description => 'Modèle de Flash', + PrintConv => { + 'None' => 'Aucune', + }, + }, + 'FlashOptions' => { + Description => 'Options de flash', + PrintConv => { + 'Auto, Red-eye reduction' => 'Auto, réduction yeux rouges', + 'Normal' => 'Normale', + 'Red-eye reduction' => 'Réduction yeux rouges', + 'Slow-sync' => 'Synchro lente', + 'Slow-sync, Red-eye reduction' => 'Synchro lente, réduction yeux rouges', + 'Trailing-curtain Sync' => 'Synchro 2e rideau', + 'Wireless (Control)' => 'Sans cordon (contrôleur)', + 'Wireless (Master)' => 'Sans cordon (maître)', + }, + }, + 'FlashOptions2' => { + Description => 'Options de flash (2)', + PrintConv => { + 'Auto, Red-eye reduction' => 'Auto, réduction yeux rouges', + 'Normal' => 'Normale', + 'Red-eye reduction' => 'Réduction yeux rouges', + 'Slow-sync' => 'Synchro lente', + 'Slow-sync, Red-eye reduction' => 'Synchro lente, réduction yeux rouges', + 'Trailing-curtain Sync' => 'Synchro 2e rideau', + 'Wireless (Control)' => 'Sans cordon (contrôleur)', + 'Wireless (Master)' => 'Sans cordon (maître)', + }, + }, + 'FlashOutput' => 'Puissance de l\'éclair', + 'FlashRedEyeMode' => 'Flash mode anti-yeux rouges', + 'FlashReturn' => { + PrintConv => { + 'No return detection' => 'Pas de détection de retour', + 'Return detected' => 'Retour détecté', + 'Return not detected' => 'Retour non détecté', + }, + }, + 'FlashSetting' => 'Réglages Flash', + 'FlashStatus' => { + Description => 'Segment de mesure flash esclave 1', + PrintConv => { + 'External, Did not fire' => 'Externe, non déclenché', + 'External, Fired' => 'Externe, déclenché', + 'Internal, Did not fire' => 'Interne, non déclenché', + 'Internal, Fired' => 'Interne, déclenché', + 'Off' => 'Désactivé', + }, + }, + 'FlashSyncSpeedAv' => { + Description => 'Vitesse synchro en mode Av', + PrintConv => { + '1/200 Fixed' => '1/200 fixe', + '1/250 Fixed' => '1/250 fixe', + '1/300 Fixed' => '1/300 fixe', + }, + }, + 'FlashType' => { + Description => 'Type de flash', + PrintConv => { + 'Built-In Flash' => 'Intégré', + 'External' => 'Externe', + 'None' => 'Aucune', + }, + }, + 'FlashWarning' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'FlashpixVersion' => 'Version Flashpix supportée', + 'FlickerReduce' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'FlipHorizontal' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'FocalLength' => 'Focale de l\'objectif', + 'FocalLength35efl' => 'Focale de l\'objectif', + 'FocalLengthIn35mmFormat' => 'Distance focale sur film 35 mm', + 'FocalPlaneResolutionUnit' => { + Description => 'Unité de résolution de plan focal', + PrintConv => { + 'None' => 'Aucune', + 'inches' => 'Pouce', + 'um' => 'µm (micromètre)', + }, + }, + 'FocalPlaneXResolution' => 'Résolution X du plan focal', + 'FocalPlaneYResolution' => 'Résolution Y du plan focal', + 'Focus' => { + PrintConv => { + 'Manual' => 'Manuelle', + }, + }, + 'FocusContinuous' => { + PrintConv => { + 'Manual' => 'Manuelle', + }, + }, + 'FocusDistance' => 'Distance de mise au point', + 'FocusMode' => { + Description => 'Mode mise au point', + PrintConv => { + 'AF-C' => 'AF-C (prise de vue en rafale)', + 'AF-S' => 'AF-S (prise de vue unique)', + 'Auto, Continuous' => 'Auto, continue', + 'Auto, Focus button' => 'Bouton autofocus', + 'Continuous' => 'Auto, continue', + 'Infinity' => 'Infini', + 'Manual' => 'Manuelle', + 'Normal' => 'Normale', + 'Pan Focus' => 'Hyperfocale', + }, + }, + 'FocusMode2' => { + Description => 'Mode mise au point 2', + PrintConv => { + 'AF-C' => 'AF-C (prise de vue en rafale)', + 'AF-S' => 'AF-S (prise de vue unique)', + 'Manual' => 'Manuelle', + }, + }, + 'FocusModeSetting' => { + PrintConv => { + 'AF-C' => 'AF-C (prise de vue en rafale)', + 'AF-S' => 'AF-S (prise de vue unique)', + 'Manual' => 'Manuelle', + }, + }, + 'FocusPosition' => 'Distance de mise au point', + 'FocusRange' => { + PrintConv => { + 'Infinity' => 'Infini', + 'Manual' => 'Manuelle', + 'Normal' => 'Normale', + 'Pan Focus' => 'Hyperfocale', + 'Super Macro' => 'Super macro', + }, + }, + 'FocusTrackingLockOn' => { + PrintConv => { + 'Normal' => 'Normale', + 'Off' => 'Désactivé', + }, + }, + 'FocusingScreen' => 'Verre de visée', + 'ForwardMatrix1' => 'Matrice forward 1', + 'ForwardMatrix2' => 'Matrice forward 2', + 'FrameNumber' => 'Numéro de vue', + 'FrameRate' => 'Vitesse', + 'FrameSize' => 'Taille du cadre', + 'FreeByteCounts' => 'Nombre d\'octets libres', + 'FreeOffsets' => 'Offsets libres', + 'FujiFlashMode' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + 'Red-eye reduction' => 'Réduction yeux rouges', + }, + }, + 'GIFVersion' => 'Version GIF', + 'GPSAltitude' => 'Altitude', + 'GPSAltitudeRef' => { + Description => 'Référence d\'altitude', + PrintConv => { + 'Above Sea Level' => 'Au-dessus du niveau de la mer', + 'Below Sea Level' => 'Au-dessous du niveau de la mer', + }, + }, + 'GPSAreaInformation' => 'Nom de la zone GPS', + 'GPSDOP' => 'Précision de mesure', + 'GPSDateStamp' => 'Date GPS', + 'GPSDateTime' => 'Date/heure GPS (horloge atomique)', + 'GPSDestBearing' => 'Orientation de la destination', + 'GPSDestBearingRef' => { + Description => 'Référence de l\'orientation de la destination', + PrintConv => { + 'Magnetic North' => 'Nord magnétique', + 'True North' => 'Direction vraie', + }, + }, + 'GPSDestDistance' => 'Distance à la destination', + 'GPSDestDistanceRef' => { + Description => 'Référence de la distance à la destination', + PrintConv => { + 'Kilometers' => 'Kilomètres', + 'Nautical Miles' => 'Milles marins', + }, + }, + 'GPSDestLatitude' => 'Latitude de destination', + 'GPSDestLatitudeRef' => { + Description => 'Référence de la latitude de destination', + PrintConv => { + 'North' => 'Latitude nord', + 'South' => 'Latitude sud', + }, + }, + 'GPSDestLongitude' => 'Longitude de destination', + 'GPSDestLongitudeRef' => { + Description => 'Référence de la longitude de destination', + PrintConv => { + 'East' => 'Longitude est', + 'West' => 'Longitude ouest', + }, + }, + 'GPSDifferential' => { + Description => 'Correction différentielle GPS', + PrintConv => { + 'Differential Corrected' => 'Correction différentielle appliquée', + 'No Correction' => 'Mesure sans correction différentielle', + }, + }, + 'GPSImgDirection' => 'Direction de l\'image', + 'GPSImgDirectionRef' => { + Description => 'Référence pour la direction l\'image', + PrintConv => { + 'Magnetic North' => 'Direction magnétique', + 'True North' => 'Direction vraie', + }, + }, + 'GPSInfo' => 'Pointeur IFD d\'informations GPS', + 'GPSLatitude' => 'Latitude', + 'GPSLatitudeRef' => { + Description => 'Latitude nord ou sud', + PrintConv => { + 'North' => 'Latitude nord', + 'South' => 'Latitude sud', + }, + }, + 'GPSLongitude' => 'Longitude', + 'GPSLongitudeRef' => { + Description => 'Longitude est ou ouest', + PrintConv => { + 'East' => 'Longitude est', + 'West' => 'Longitude ouest', + }, + }, + 'GPSMapDatum' => 'Données de surveillance géodésique utilisées', + 'GPSMeasureMode' => { + Description => 'Mode de mesure GPS', + PrintConv => { + '2-D' => 'Mesure à deux dimensions', + '2-Dimensional' => 'Mesure à deux dimensions', + '2-Dimensional Measurement' => 'Mesure à deux dimensions', + '3-D' => 'Mesure à trois dimensions', + '3-Dimensional' => 'Mesure à trois dimensions', + '3-Dimensional Measurement' => 'Mesure à trois dimensions', + }, + }, + 'GPSPosition' => 'Position GPS', + 'GPSProcessingMethod' => 'Nom de la méthode de traitement GPS', + 'GPSSatellites' => 'Satellites GPS utilisés pour la mesure', + 'GPSSpeed' => 'Vitesse du récepteur GPS', + 'GPSSpeedRef' => { + Description => 'Unité de vitesse', + PrintConv => { + 'km/h' => 'Kilomètres par heure', + 'knots' => 'NÅ“uds', + 'mph' => 'Miles par heure', + }, + }, + 'GPSStatus' => { + Description => 'État du récepteur GPS', + PrintConv => { + 'Measurement Active' => 'Mesure active', + 'Measurement Void' => 'Mesure vide', + }, + }, + 'GPSTimeStamp' => 'Heure GPS (horloge atomique)', + 'GPSTrack' => 'Direction de déplacement', + 'GPSTrackRef' => { + Description => 'Référence pour la direction de déplacement', + PrintConv => { + 'Magnetic North' => 'Direction magnétique', + 'True North' => 'Direction vraie', + }, + }, + 'GPSVersionID' => 'Version de tag GPS', + 'GainControl' => { + Description => 'Contrôle de gain', + PrintConv => { + 'High gain down' => 'Forte atténuation', + 'High gain up' => 'Fort gain', + 'Low gain down' => 'Faible atténuation', + 'Low gain up' => 'Faible gain', + 'None' => 'Aucune', + }, + }, + 'GammaCompensatedValue' => 'Valeur de compensation gamma', + 'Gapless' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'GeoTiffAsciiParams' => 'Tag de paramètres Ascii GeoTiff', + 'GeoTiffDirectory' => 'Tag de répertoire de clé GeoTiff', + 'GeoTiffDoubleParams' => 'Tag de paramètres doubles GeoTiff', + 'Gradation' => 'Gradation', + 'GrayResponseCurve' => 'Courbe de réponse du gris', + 'GrayResponseUnit' => { + Description => 'Unité de réponse en gris', + PrintConv => { + '0.0001' => 'Le nombre représente des millièmes d\'unité', + '0.001' => 'Le nombre représente des centièmes d\'unité', + '0.1' => 'Le nombre représente des dixièmes d\'unité', + '1e-05' => 'Le nombre représente des dix-millièmes d\'unité', + '1e-06' => 'Le nombre représente des cent-millièmes d\'unité', + }, + }, + 'GrayTRC' => 'Courbe de reproduction des tons gris', + 'GreenMatrixColumn' => 'Colonne de matrice verte', + 'GreenTRC' => 'Courbe de reproduction des tons verts', + 'GridDisplay' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'GripBatteryADLoad' => 'Tension accu poignée en charge', + 'GripBatteryADNoLoad' => 'Tension accu poignée à vide', + 'GripBatteryState' => { + Description => 'État de accu poignée', + PrintConv => { + 'Almost Empty' => 'Presque vide', + 'Empty or Missing' => 'Vide ou absent', + 'Full' => 'Plein', + 'Running Low' => 'En baisse', + }, + }, + 'HCUsage' => 'Usage HC', + 'HDR' => { + Description => 'HDR auto', + PrintConv => { + 'Off' => 'Désactivée', + }, + }, + 'HalftoneHints' => 'Indications sur les demi-teintes', + 'Headline' => 'Titre principal', + 'HierarchicalSubject' => 'Sujet hiérarchique', + 'HighISONoiseReduction' => { + Description => 'Réduction du bruit en haute sensibilité ISO', + PrintConv => { + 'Auto' => 'Auto.', + 'High' => 'Fort', + 'Low' => 'Bas', + 'Normal' => 'Normale', + 'Off' => 'Désactivé', + 'On' => 'Activé', + 'Strong' => 'Importante', + 'Weak' => 'Faible', + 'Weakest' => 'La plus faible', + }, + }, + 'HighlightTonePriority' => { + Description => 'Priorité hautes lumières', + PrintConv => { + 'Disable' => 'Désactivée', + 'Enable' => 'Activée', + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'History' => 'Récapitulatif', + 'HometownCity' => 'Ville de résidence', + 'HometownCityCode' => 'Code ville de résidence', + 'HometownDST' => { + Description => 'Heure d\'été de résidence', + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'HostComputer' => 'Ordinateur hôte', + 'Hue' => 'Nuance', + 'HueAdjustment' => 'Teinte', + 'HyperfocalDistance' => 'Distance hyperfocale', + 'ICCProfile' => 'Profil ICC', + 'ICCProfileName' => 'Nom du profil ICC', + 'ICC_Profile' => 'Profil de couleur ICC d\'entrée', + 'ID3Size' => 'Taille ID3', + 'IPTC-NAA' => 'Métadonnées IPTC-NAA', + 'IPTCBitsPerSample' => 'Nombre de bits par échantillon', + 'IPTCImageHeight' => 'Nombre de lignes', + 'IPTCImageRotation' => { + Description => 'Rotation d\'image', + PrintConv => { + '0' => 'Pas de rotation', + '180' => 'Rotation de 180 degrés', + '270' => 'Rotation de 270 degrés', + '90' => 'Rotation de 90 degrés', + }, + }, + 'IPTCImageWidth' => 'Pixels par ligne', + 'IPTCPictureNumber' => 'Numéro d\'image', + 'IPTCPixelHeight' => 'Taille de pixel perpendiculairement à la direction de scan', + 'IPTCPixelWidth' => 'Taille de pixel dans la direction de scan', + 'ISO' => 'Sensibilité ISO', + 'ISOExpansion' => { + Description => 'Extension sensibilité ISO', + PrintConv => { + 'Off' => 'Arrêt', + 'On' => 'Marche', + }, + }, + 'ISOExpansion2' => { + PrintConv => { + 'Off' => 'Désactivé', + }, + }, + 'ISOFloor' => 'Seuil ISO', + 'ISOInfo' => 'Info ISO', + 'ISOSelection' => 'Choix ISO', + 'ISOSetting' => { + Description => 'Réglage ISO', + PrintConv => { + 'Manual' => 'Manuelle', + }, + }, + 'ISOSpeedExpansion' => { + Description => 'Extension de sensibilité ISO', + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'ISOSpeedIncrements' => { + Description => 'Incréments de sensibilité ISO', + PrintConv => { + '1/3 Stop' => 'Palier 1/3', + }, + }, + 'ISOSpeedRange' => { + Description => 'Régler l\'extension de sensibilité ISO', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activée', + }, + }, + 'IT8Header' => 'En-tête IT8', + 'Identifier' => 'Identifiant', + 'Illumination' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ImageAdjustment' => 'Ajustement Image', + 'ImageAreaOffset' => 'Décalage de zone d\'image', + 'ImageAuthentication' => { + Description => 'Authentication de l\'image', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ImageBoundary' => 'Cadre Image', + 'ImageColorIndicator' => 'Indicateur de couleur d\'image', + 'ImageColorValue' => 'Valeur de couleur d\'image', + 'ImageCount' => 'Compteur d\'images', + 'ImageDataSize' => 'Taille de l\'image', + 'ImageDepth' => 'Profondeur d\'image', + 'ImageDescription' => 'Description d\'image', + 'ImageDustOff' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ImageEditCount' => 'Compteur de traitement d\'image', + 'ImageEditing' => { + Description => 'Traitement de l\'image', + PrintConv => { + 'Cropped' => 'Recadré', + 'Digital Filter' => 'Filtre numérique', + 'Frame Synthesis?' => 'Synthèse de vue ?', + 'None' => 'Aucun', + }, + }, + 'ImageHeight' => 'Hauteur d\'image', + 'ImageHistory' => 'Historique de l\'image', + 'ImageID' => 'ID d\'image', + 'ImageLayer' => 'Couche image', + 'ImageNumber' => 'Numéro d\'image', + 'ImageOptimization' => 'Optimisation d\'image', + 'ImageOrientation' => { + Description => 'Orientation d\'image', + PrintConv => { + 'Landscape' => 'Paysage', + 'Square' => 'Carré', + }, + }, + 'ImageProcessing' => 'Retouche d\'image', + 'ImageQuality' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'ImageReview' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ImageRotated' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'ImageSize' => 'Taille de l\'Image', + 'ImageSourceData' => 'Données source d\'image', + 'ImageStabilization' => { + Description => 'Stabilisation d\'image', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + 'On, Mode 1' => 'Enclenché, Mode 1', + 'On, Mode 2' => 'Enclenché, Mode 2', + }, + }, + 'ImageTone' => { + Description => 'Ton de l\'image', + PrintConv => { + 'Bright' => 'Brillant', + 'Landscape' => 'Paysage', + 'Natural' => 'Naturel', + }, + }, + 'ImageType' => 'Type d\'image', + 'ImageUniqueID' => 'Identificateur unique d\'image', + 'ImageWidth' => 'Largeur d\'image', + 'Indexed' => 'Indexé', + 'InfoButtonWhenShooting' => { + Description => 'Touche INFO au déclenchement', + PrintConv => { + 'Displays camera settings' => 'Affiche les réglages en cours', + 'Displays shooting functions' => 'Affiche les fonctions', + }, + }, + 'InkNames' => 'Nom des encres', + 'InkSet' => 'Encrage', + 'IntellectualGenre' => 'Genre intellectuel', + 'IntelligentAuto' => 'Mode Auto intelligent', + 'IntensityStereo' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'InterchangeColorSpace' => { + PrintConv => { + 'CMY (K) Device Dependent' => 'CMY(K) dépendant de l\'appareil', + 'RGB Device Dependent' => 'RVB dépendant de l\'appareil', + }, + }, + 'IntergraphMatrix' => 'Tag de matrice intergraphe', + 'Interlace' => 'Entrelacement', + 'InternalFlash' => { + PrintConv => { + 'Fired' => 'Flash déclenché', + 'Manual' => 'Manuelle', + 'No' => 'Flash non déclenché', + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'InternalFlashMode' => { + Description => 'Segment de mesure flash esclave 2', + PrintConv => { + 'Did not fire, (Unknown 0xf4)' => 'Hors service (inconnue 0xF4)', + 'Did not fire, Auto' => 'Hors service, auto', + 'Did not fire, Auto, Red-eye reduction' => 'Hors service, auto, réduction yeux rouges', + 'Did not fire, Normal' => 'Hors service, normal', + 'Did not fire, Red-eye reduction' => 'Hors service, réduction yeux rouges', + 'Did not fire, Slow-sync' => 'Hors service, synchro lente', + 'Did not fire, Slow-sync, Red-eye reduction' => 'Hors service, synchro lente, réduction yeux rouges', + 'Did not fire, Trailing-curtain Sync' => 'Hors service, synchro 2e rideau', + 'Did not fire, Wireless (Control)' => 'Hors service, sans cordon (contrôleur)', + 'Did not fire, Wireless (Master)' => 'Hors service, sans cordon (maître)', + 'Fired' => 'Activé', + 'Fired, Auto' => 'En service, auto', + 'Fired, Auto, Red-eye reduction' => 'En service, auto, réduction yeux rouges', + 'Fired, Red-eye reduction' => 'En service, réduction yeux rouges', + 'Fired, Slow-sync' => 'En service, synchro lente', + 'Fired, Slow-sync, Red-eye reduction' => 'En service, synchro lente, réduction yeux rouges', + 'Fired, Trailing-curtain Sync' => 'En service, synchro 2e rideau', + 'Fired, Wireless (Control)' => 'En service, sans cordon (contrôleur)', + 'Fired, Wireless (Master)' => 'En service, sans cordon (maître)', + 'n/a - Off-Auto-Aperture' => 'N/c - auto-diaph hors service', + }, + }, + 'InternalFlashStrength' => 'Segment de mesure flash esclave 4', + 'InternalSerialNumber' => 'Numéro de série interne', + 'InteropIndex' => { + Description => 'Identification d\'interopérabilité', + PrintConv => { + 'R03 - DCF option file (Adobe RGB)' => 'R03: fichier d\'option DCF (Adobe RGB)', + 'R98 - DCF basic file (sRGB)' => 'R98: fichier de base DCF (sRGB)', + 'THM - DCF thumbnail file' => 'THM: fichier de vignette DCF', + }, + }, + 'InteropOffset' => 'Indicateur d\'interfonctionnement', + 'InteropVersion' => 'Version d\'interopérabilité', + 'IptcLastEdited' => 'Dernière édition IPTC', + 'JFIFVersion' => 'Version JFIF', + 'JPEGACTables' => 'Tableaux AC JPEG', + 'JPEGDCTables' => 'Tableaux DC JPEG', + 'JPEGLosslessPredictors' => 'Prédicteurs JPEG sans perte', + 'JPEGPointTransforms' => 'Transformations de point JPEG', + 'JPEGProc' => 'Proc JPEG', + 'JPEGQTables' => 'Tableaux Q JPEG', + 'JPEGQuality' => { + Description => 'Qualité', + PrintConv => { + 'Extra Fine' => 'Extra fine', + 'Standard' => 'Normale', + }, + }, + 'JPEGRestartInterval' => 'Intervalle de redémarrage JPEG', + 'JPEGTables' => 'Tableaux JPEG', + 'JobID' => 'ID de la tâche', + 'JpgRecordedPixels' => { + Description => 'Pixels enregistrés JPEG', + PrintConv => { + '10 MP' => '10 Mpx', + '2 MP' => '2 Mpx', + '6 MP' => '6 Mpx', + }, + }, + 'Keyword' => 'Mots clé', + 'Keywords' => 'Mots-clés', + 'LC1' => 'Données d\'objectif', + 'LC10' => 'Données mv\' nv\'', + 'LC11' => 'Données AVC 1/EXP', + 'LC12' => 'Données mv1 Avminsif', + 'LC14' => 'Données UNT_12 UNT_6', + 'LC15' => 'Données d\'adaptation de flash incorporé', + 'LC2' => 'Code de distance', + 'LC3' => 'Valeur K', + 'LC4' => 'Données de correction d\'aberration à courte distance', + 'LC5' => 'Données de correction d\'aberration chromatique', + 'LC6' => 'Données d\'aberration d\'ouverture', + 'LC7' => 'Données de condition minimale de déclenchement AF', + 'LCDDisplayAtPowerOn' => { + Description => 'État LCD lors de l\'allumage', + PrintConv => { + 'Display' => 'Allumé', + 'Retain power off status' => 'État précédent', + }, + }, + 'LCDDisplayReturnToShoot' => { + Description => 'Affich. LCD -> Prise de vues', + PrintConv => { + 'Also with * etc.' => 'Aussi par * etc.', + 'With Shutter Button only' => 'Par déclencheur uniq.', + }, + }, + 'LCDIllumination' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'LCDIlluminationDuringBulb' => { + Description => 'Éclairage LCD pendant pose longue', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'LCDPanels' => { + Description => 'Ecran LCD supérieur/arrière', + PrintConv => { + 'ISO/File no.' => 'ISO/No. fichier', + 'ISO/Remain. shots' => 'ISO/Vues restantes', + 'Remain. shots/File no.' => 'Vues restantes/No. fichier', + 'Shots in folder/Remain. shots' => 'Vues dans dossier/Vues restantes', + }, + }, + 'LCHEditor' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'Language' => 'Langage', + 'LanguageIdentifier' => 'Identificateur de langue', + 'LastKeywordIPTC' => 'Dernier mot-clé IPTC', + 'LastKeywordXMP' => 'Dernier mot-clé XMP', + 'LeafData' => 'Données Leaf', + 'Lens' => 'Objectif ', + 'LensAFStopButton' => { + Description => 'Fonct. touche AF objectif', + PrintConv => { + 'AE lock' => 'Verrouillage AE', + 'AE lock while metering' => 'Verr. AE posemètre actif', + 'AF Stop' => 'Arrêt AF', + 'AF mode: ONE SHOT <-> AI SERVO' => 'Mode AF: ONE SHOT <-> AI SERVO', + 'AF point: M -> Auto / Auto -> Ctr.' => 'Colli: M -> Auto / Auto -> Ctr.', + 'AF point: M->Auto/Auto->ctr' => 'Collim.AF: M->Auto/Auto->ctr', + 'AF start' => 'Activation AF', + 'AF stop' => 'Arrêt AF', + 'IS start' => 'Activation stab. image', + 'Switch to registered AF point' => 'Activer le collimateur autofocus enregistré', + }, + }, + 'LensData' => 'Valeur K (LC3)', + 'LensDataVersion' => 'Version des Données Objectif', + 'LensDriveNoAF' => { + Description => 'Pilot. obj. si AF impossible', + PrintConv => { + 'Focus search off' => 'Pas de recherche du point', + 'Focus search on' => 'Recherche du point', + }, + }, + 'LensFStops' => 'Nombre de diaphs de l\'objectif', + 'LensID' => 'ID Lens', + 'LensIDNumber' => 'Numéro d\'Objectif', + 'LensInfo' => 'Informations sur l\'objectif', + 'LensKind' => 'Sorte d\'objectif / version (LC0)', + 'LensMake' => 'Fabricant d\'objectif', + 'LensModel' => 'Modèle d\'objectif', + 'LensSerialNumber' => 'Numéro de série objectif', + 'LensType' => 'Sorte d\'objectif', + 'LicenseType' => { + PrintConv => { + 'Unknown' => 'Inconnu', + }, + }, + 'LightReading' => 'Lecture de la lumière', + 'LightSource' => { + Description => 'Source de lumière', + PrintConv => { + 'Cloudy' => 'Temps nuageux', + 'Cool White Fluorescent' => 'Fluorescente type soft', + 'Day White Fluorescent' => 'Fluorescente type blanc', + 'Daylight' => 'Lumière du jour', + 'Daylight Fluorescent' => 'Fluorescente type jour', + 'Fine Weather' => 'Beau temps', + 'Fluorescent' => 'Fluorescente', + 'ISO Studio Tungsten' => 'Tungstène studio ISO', + 'Other' => 'Autre source de lumière', + 'Shade' => 'Ombre', + 'Standard Light A' => 'Lumière standard A', + 'Standard Light B' => 'Lumière standard B', + 'Standard Light C' => 'Lumière standard C', + 'Tungsten (Incandescent)' => 'Tungstène (lumière incandescente)', + 'Unknown' => 'Inconnue', + 'Warm White Fluorescent' => 'Fluorescent blanc chaud', + 'White Fluorescent' => 'Fluorescent blanc', + }, + }, + 'LightSourceSpecial' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'LightValue' => 'Luminosité', + 'Lightness' => 'Luminosité', + 'LinearResponseLimit' => 'Limite de réponse linéaire', + 'LinearizationTable' => 'Table de linéarisation', + 'Lit' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'LiveViewExposureSimulation' => { + Description => 'Simulation d\'exposition directe', + PrintConv => { + 'Disable (LCD auto adjust)' => 'Désactivée (réglage écran auto)', + 'Enable (simulates exposure)' => 'Activée (simulation exposition)', + }, + }, + 'LiveViewShooting' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'LocalizedCameraModel' => 'Nom traduit de modèle d\'appareil', + 'Location' => 'Lieu', + 'LockMicrophoneButton' => { + Description => 'Fonction de touche microphone', + PrintConv => { + 'Protect (hold:record memo)' => 'Protéger (maintien: enregistrement sonore)', + 'Record memo (protect:disable)' => 'Enregistrement sonore (protéger: désactivée)', + }, + }, + 'LongExposureNoiseReduction' => { + Description => 'Réduct. bruit longue expo.', + PrintConv => { + 'Off' => 'Arrêt', + 'On' => 'Marche', + }, + }, + 'LookupTable' => 'Table de correspondance', + 'LoopStyle' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'LuminanceNoiseReduction' => { + PrintConv => { + 'Low' => 'Bas', + 'Off' => 'Désactivé', + }, + }, + 'MCUVersion' => 'Version MCU', + 'MIEVersion' => 'Version MIE', + 'MIMEType' => 'Type MIME', + 'MSStereo' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'Macro' => { + PrintConv => { + 'Manual' => 'Manuelle', + 'Normal' => 'Normale', + 'Off' => 'Désactivé', + 'On' => 'Activé', + 'Super Macro' => 'Super macro', + }, + }, + 'MacroMode' => { + Description => 'Mode Macro', + PrintConv => { + 'Normal' => 'Normale', + 'Off' => 'Désactivé', + 'On' => 'Activé', + 'Super Macro' => 'Super macro', + 'Tele-Macro' => 'Macro en télé', + }, + }, + 'MagnifiedView' => { + Description => 'Agrandissement en lecture', + PrintConv => { + 'Image playback only' => 'Lecture image uniquement', + 'Image review and playback' => 'Aff. inst. et lecture', + }, + }, + 'MainDialExposureComp' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'Make' => 'Fabricant', + 'MakeAndModel' => 'Fabricant et modèle', + 'MakerNote' => 'Données privées DNG', + 'MakerNoteSafety' => { + Description => 'Sécurité de note de fabricant', + PrintConv => { + 'Safe' => 'Sûre', + 'Unsafe' => 'Pas sûre', + }, + }, + 'MakerNoteVersion' => 'Version des informations spécifiques fabricant', + 'MakerNotes' => 'Notes fabricant', + 'ManualFlashOutput' => { + PrintConv => { + 'Low' => 'Bas', + 'n/a' => 'Non établie', + }, + }, + 'ManualFocusDistance' => 'Distance de Mise-au-point Manuelle', + 'ManualTv' => { + Description => 'Régl. Tv/Av manuel pour exp. M', + PrintConv => { + 'Tv=Control/Av=Main' => 'Tv=Contrôle rapide/Av=Principale', + 'Tv=Control/Av=Main w/o lens' => 'Tv=Contrôle rapide/Av=Principale sans objectif', + 'Tv=Main/Av=Control' => 'Tv=Principale/Av=Contrôle rapide', + 'Tv=Main/Av=Main w/o lens' => 'Tv=Principale/Av=Contrôle rapide sans objectif', + }, + }, + 'ManufactureDate' => 'Date de fabrication', + 'Marked' => 'Marqué', + 'MaskedAreas' => 'Zones masquées', + 'MasterDocumentID' => 'ID du document maître', + 'Matteing' => 'Matité', + 'MaxAperture' => 'Données Avmin', + 'MaxApertureAtMaxFocal' => 'Ouverture à la focale maxi', + 'MaxApertureAtMinFocal' => 'Ouverture à la focale mini', + 'MaxApertureValue' => 'Ouverture maximale de l\'objectif', + 'MaxAvailHeight' => 'Hauteur max Disponible', + 'MaxAvailWidth' => 'Largeur max Disponible', + 'MaxFocalLength' => 'Focale maxi', + 'MaxSampleValue' => 'Valeur maxi d\'échantillon', + 'MaxVal' => 'Valeur max', + 'MaximumDensityRange' => 'Etendue maximale de densité', + 'Measurement' => 'Observateur de mesure', + 'MeasurementBacking' => 'Support de mesure', + 'MeasurementFlare' => 'Flare de mesure', + 'MeasurementGeometry' => { + Description => 'Géométrie de mesure', + PrintConv => { + '0/45 or 45/0' => '0/45 ou 45/0', + '0/d or d/0' => '0/d ou d/0', + }, + }, + 'MeasurementIlluminant' => 'Illuminant de mesure', + 'MeasurementObserver' => 'Observateur de mesure', + 'MediaBlackPoint' => 'Point noir moyen', + 'MediaType' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'MediaWhitePoint' => 'Point blanc moyen', + 'MenuButtonDisplayPosition' => { + Description => 'Position début touche menu', + PrintConv => { + 'Previous' => 'Précédente', + 'Previous (top if power off)' => 'Précédente (Haut si dés.)', + 'Top' => 'Haut', + }, + }, + 'MenuButtonReturn' => { + PrintConv => { + 'Previous' => 'Précédente', + 'Top' => 'Haut', + }, + }, + 'MetadataDate' => 'Date des metadonnées', + 'MeteringMode' => { + Description => 'Mode de mesure', + PrintConv => { + 'Average' => 'Moyenne', + 'Center-weighted average' => 'Centrale pondérée', + 'Evaluative' => 'Évaluative', + 'Multi-segment' => 'Multizone', + 'Multi-spot' => 'MultiSpot', + 'Other' => 'Autre', + 'Partial' => 'Partielle', + 'Unknown' => 'Inconnu', + }, + }, + 'MeteringMode2' => { + Description => 'Mode de mesure 2', + PrintConv => { + 'Multi-segment' => 'Multizone', + }, + }, + 'MeteringMode3' => { + Description => 'Mode de mesure (3)', + PrintConv => { + 'Multi-segment' => 'Multizone', + }, + }, + 'MinAperture' => 'Ouverture mini', + 'MinFocalLength' => 'Focale mini', + 'MinSampleValue' => 'Valeur mini d\'échantillon', + 'MinoltaQuality' => { + Description => 'Qualité', + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'MirrorLockup' => { + Description => 'Verrouillage du miroir', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activé', + 'Enable: Down with Set' => 'Activé: Retour par touche SET', + }, + }, + 'ModDate' => 'Date de modification', + 'Model' => 'Modèle d\'appareil photo', + 'Model2' => 'Modèle d\'équipement de prise de vue (2)', + 'ModelAge' => 'Age du modèle', + 'ModelTiePoint' => 'Tag de lien d modèle', + 'ModelTransform' => 'Tag de transformation de modèle', + 'ModelingFlash' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ModifiedPictureStyle' => { + PrintConv => { + 'Landscape' => 'Paysage', + 'None' => 'Aucune', + }, + }, + 'ModifiedSaturation' => { + PrintConv => { + 'Off' => 'Désactivé', + }, + }, + 'ModifiedSharpnessFreq' => { + PrintConv => { + 'High' => 'Haut', + 'Highest' => 'Plus haut', + 'Low' => 'Doux', + 'n/a' => 'Non établie', + }, + }, + 'ModifiedToneCurve' => { + PrintConv => { + 'Manual' => 'Manuelle', + }, + }, + 'ModifiedWhiteBalance' => { + PrintConv => { + 'Cloudy' => 'Temps nuageux', + 'Daylight' => 'Lumière du jour', + 'Daylight Fluorescent' => 'Fluorescente type jour', + 'Fluorescent' => 'Fluorescente', + 'Shade' => 'Ombre', + 'Tungsten' => 'Tungstène (lumière incandescente)', + }, + }, + 'ModifyDate' => 'Date de modification de fichier', + 'MoireFilter' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'MonochromeFilterEffect' => { + PrintConv => { + 'Green' => 'Vert', + 'None' => 'Aucune', + 'Red' => 'Rouge', + 'Yellow' => 'Jaune', + }, + }, + 'MonochromeLinear' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'MonochromeToningEffect' => { + PrintConv => { + 'Blue' => 'Bleu', + 'Green' => 'Vert', + 'None' => 'Aucune', + }, + }, + 'MultiExposure' => 'Infos Surimpression', + 'MultiExposureAutoGain' => { + Description => 'Auto-expo des surimpressions', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'MultiExposureMode' => { + Description => 'Mode de surimpression', + PrintConv => { + 'Off' => 'Désactivé', + }, + }, + 'MultiExposureShots' => 'Nombre de prises de vue', + 'MultiExposureVersion' => 'Version Surimpression', + 'MultiFrameNoiseReduction' => { + Description => 'Réduc. bruit multi-photos', + PrintConv => { + 'Off' => 'Désactivée', + 'On' => 'Activé(e)', + }, + }, + 'MultipleExposureSet' => { + Description => 'Exposition multiple', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'Mute' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'MyColorMode' => { + PrintConv => { + 'Off' => 'Désactivé', + }, + }, + 'NDFilter' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'NEFCompression' => { + PrintConv => { + 'Uncompressed' => 'Non compressé', + }, + }, + 'NEFLinearizationTable' => 'Table de Linearization', + 'Name' => 'Nom', + 'NamedColor2' => 'Couleur nommée 2', + 'NativeDigest' => 'Sommaire natif', + 'NativeDisplayInfo' => 'Information sur l\'affichage natif', + 'NewsPhotoVersion' => 'Version d\'enregistrement news photo', + 'Nickname' => 'Surnom', + 'NikonCaptureData' => 'Données Nikon Capture', + 'NikonCaptureVersion' => 'Version Nikon Capture', + 'Noise' => 'Bruit', + 'NoiseFilter' => { + PrintConv => { + 'Low' => 'Bas', + 'Off' => 'Désactivé', + }, + }, + 'NoiseReduction' => { + Description => 'Réduction du bruit', + PrintConv => { + 'High (+1)' => '+1 (haut)', + 'Highest (+2)' => '+2 (le plus haut)', + 'Low' => 'Bas', + 'Low (-1)' => '-1 (bas)', + 'Lowest (-2)' => '-2 (le plus bas)', + 'Normal' => 'Normale', + 'Off' => 'Désactivé', + 'On' => 'Activé', + 'Standard' => '±0 (normal)', + }, + }, + 'NoiseReductionApplied' => 'Réduction de bruit appliquée', + 'NominalMaxAperture' => 'Ouverture maxi nominal', + 'NominalMinAperture' => 'Ouverture mini nominal', + 'NumIndexEntries' => 'Nombre d\'entrées d\'index', + 'NumberofInks' => 'Nombre d\'encres', + 'OECFColumns' => 'Colonnes OECF', + 'OECFNames' => 'Noms OECF', + 'OECFRows' => 'Lignes OECF', + 'OECFValues' => 'Valeurs OECF', + 'OPIProxy' => 'Proxy OPI', + 'ObjectAttributeReference' => 'Genre intellectuel', + 'ObjectCycle' => { + Description => 'Cycle d\'objet', + PrintConv => { + 'Both Morning and Evening' => 'Les deux', + 'Evening' => 'Soir', + 'Morning' => 'Matin', + }, + }, + 'ObjectFileType' => { + PrintConv => { + 'None' => 'Aucune', + 'Unknown' => 'Inconnu', + }, + }, + 'ObjectName' => 'Titre', + 'ObjectPreviewData' => 'Données de la miniature de l\'objet', + 'ObjectPreviewFileFormat' => 'Format de fichier de la miniature de l\'objet', + 'ObjectPreviewFileVersion' => 'Version de format de fichier de la miniature de l\'objet', + 'ObjectTypeReference' => 'Référence de type d\'objet', + 'OffsetSchema' => 'Schéma de décalage', + 'OldSubfileType' => 'Type du sous-fichier', + 'OneTouchWB' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'OpticalZoomMode' => { + Description => 'Mode Zoom optique', + PrintConv => { + 'Extended' => 'Optique EX', + 'Standard' => 'Normal', + }, + }, + 'OpticalZoomOn' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'Opto-ElectricConvFactor' => 'Facteur de conversion optoélectrique', + 'Orientation' => { + Description => 'Orientation de l\'image', + PrintConv => { + 'Horizontal (normal)' => '0° (haut/gauche)', + 'Mirror horizontal' => '0° (haut/droit)', + 'Mirror horizontal and rotate 270 CW' => '90° sens horaire (gauche/haut)', + 'Mirror horizontal and rotate 90 CW' => '90° sens antihoraire (droit/bas)', + 'Mirror vertical' => '180° (bas/gauche)', + 'Rotate 180' => '180° (bas/droit)', + 'Rotate 270 CW' => '90° sens horaire (gauche/bas)', + 'Rotate 90 CW' => '90° sens antihoraire (droit/haut)', + }, + }, + 'OriginalRawFileData' => 'Données du fichier raw d\'origine', + 'OriginalRawFileDigest' => 'Digest du fichier raw original', + 'OriginalRawFileName' => 'Nom du fichier raw d\'origine', + 'OriginalTransmissionReference' => 'Identificateur de tâche', + 'OriginatingProgram' => 'Programme d\'origine', + 'OtherImage' => 'Autre image', + 'OutputResponse' => 'Réponse de sortie', + 'Owner' => 'Propriétaire', + 'OwnerID' => 'ID du propriétaire', + 'OwnerName' => 'Nom du propriétaire', + 'PDFVersion' => 'Version PDF', + 'PEFVersion' => 'Version PEF', + 'Padding' => 'Remplissage', + 'PageName' => 'Nom de page', + 'PageNumber' => 'Page numéro', + 'PanasonicExifVersion' => 'Version Exif Panasonic', + 'PanasonicRawVersion' => 'Version Panasonic RAW', + 'PanasonicTitle' => 'Titre', + 'PentaxImageSize' => { + Description => 'Taille d\'image Pentax', + PrintConv => { + '2304x1728 or 2592x1944' => '2304 x 1728 ou 2592 x 1944', + '2560x1920 or 2304x1728' => '2560 x 1920 ou 2304 x 1728', + '2816x2212 or 2816x2112' => '2816 x 2212 ou 2816 x 2112', + '3008x2008 or 3040x2024' => '3008 x 2008 ou 3040 x 2024', + 'Full' => 'Pleine', + }, + }, + 'PentaxModelID' => 'Modèle Pentax', + 'PentaxVersion' => 'Version Pentax', + 'PeripheralLighting' => { + Description => 'Correction éclairage périphérique', + PrintConv => { + 'Off' => 'Désactiver', + 'On' => 'Activer', + }, + }, + 'PersonInImage' => 'Personnage sur l\'Image', + 'PhaseDetectAF' => 'Auto-Focus', + 'PhotoEffect' => { + PrintConv => { + 'Off' => 'Désactivé', + }, + }, + 'PhotoEffects' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'PhotoEffectsType' => { + PrintConv => { + 'None' => 'Aucune', + }, + }, + 'PhotometricInterpretation' => { + Description => 'Schéma de pixel', + PrintConv => { + 'BlackIsZero' => 'Zéro pour noir', + 'Color Filter Array' => 'CFA (Matrice de filtre de couleur)', + 'Pixar LogL' => 'CIE Log2(L) (Log luminance)', + 'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (Log luminance et chrominance)', + 'RGB' => 'RVB', + 'RGB Palette' => 'Palette RVB', + 'Transparency Mask' => 'Masque de transparence', + 'WhiteIsZero' => 'Zéro pour blanc', + }, + }, + 'PhotoshopAnnotations' => 'Annotations Photoshop', + 'PictureControl' => { + Description => 'Optimisation d\'image', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'PictureControlActive' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'PictureControlAdjust' => { + Description => 'Ajustement de l\'optimisation d\'image', + PrintConv => { + 'Default Settings' => 'Paramètres par défault', + 'Full Control' => 'Réglages manuels', + 'Quick Adjust' => 'Réglages rapides', + }, + }, + 'PictureControlBase' => 'Optimisation d\'image de base', + 'PictureControlName' => 'Nom de l\'optimisation d\'image', + 'PictureControlQuickAdjust' => 'Optimisation d\'image - Réglages rapides', + 'PictureControlVersion' => 'Version de l\'Optimisation d\'image', + 'PictureFinish' => { + PrintConv => { + 'Natural' => 'Naturel', + 'Night Scene' => 'Nocturne', + }, + }, + 'PictureMode' => { + Description => 'Mode d\'image', + PrintConv => { + '1/2 EV steps' => 'Pas de 1/2 IL', + '1/3 EV steps' => 'Pas de 1/3 IL', + 'Aperture Priority' => 'Priorité ouverture', + 'Aperture Priority, Off-Auto-Aperture' => 'Priorité ouverture (auto-diaph hors service)', + 'Aperture-priority AE' => 'Priorité ouverture', + 'Auto PICT (Landscape)' => 'Auto PICT (paysage)', + 'Auto PICT (Macro)' => 'Auto PICT (macro)', + 'Auto PICT (Portrait)' => 'Auto PICT (portrait)', + 'Auto PICT (Sport)' => 'Auto PICT (sport)', + 'Auto PICT (Standard)' => 'Auto PICT (standard)', + 'Autumn' => 'Automne', + 'Blur Reduction' => 'Réduction du flou', + 'Bulb' => 'Pose B', + 'Bulb, Off-Auto-Aperture' => 'Pose B (auto-diaph hors service)', + 'Candlelight' => 'Bougie', + 'DOF Program' => 'Programme PdC', + 'DOF Program (HyP)' => 'Programme PdC (Hyper-programme)', + 'Dark Pet' => 'Animal foncé', + 'Digital Filter' => 'Filtre numérique', + 'Fireworks' => 'Feux d\'artifice', + 'Flash X-Sync Speed AE' => 'Synchro X flash vitesse AE', + 'Food' => 'Nourriture', + 'Frame Composite' => 'Vue composite', + 'Green Mode' => 'Mode vert', + 'Half-length Portrait' => 'Portrait (buste)', + 'Hi-speed Program' => 'Programme grande vitesse', + 'Hi-speed Program (HyP)' => 'Programme grande vitesse (Hyper-programme)', + 'Kids' => 'Enfants', + 'Landscape' => 'Paysage', + 'Light Pet' => 'Animal clair', + 'MTF Program' => 'Programme FTM', + 'MTF Program (HyP)' => 'Programme FTM (Hyper-programme)', + 'Manual' => 'Manuelle', + 'Manual, Off-Auto-Aperture' => 'Manuel (auto-diaph hors service)', + 'Medium Pet' => 'Animal demi-teintes', + 'Museum' => 'Musée', + 'Natural Skin Tone' => 'Ton chair naturel', + 'Night Scene' => 'Nocturne', + 'Night Scene Portrait' => 'Portrait nocturne', + 'No Flash' => 'Sans flash', + 'Pet' => 'Animaux de compagnie', + 'Program' => 'Programme', + 'Program (HyP)' => 'Programme AE (Hyper-programme)', + 'Program AE' => 'Priorité vitesse', + 'Program Av Shift' => 'Décalage programme Av', + 'Program Tv Shift' => 'Décalage programme Tv', + 'Self Portrait' => 'Autoportrait', + 'Sensitivity Priority AE' => 'Priorité sensibilité AE', + 'Shutter & Aperture Priority AE' => 'Priorité vitesse et ouverture AE', + 'Shutter Speed Priority' => 'Priorité vitesse', + 'Shutter speed priority AE' => 'Priorité vitesse', + 'Snow' => 'Neige', + 'Soft' => 'Doux', + 'Sunset' => 'Coucher de soleil', + 'Surf & Snow' => 'Surf et neige', + 'Synchro Sound Record' => 'Enregistrement de son synchro', + 'Text' => 'Texte', + 'Underwater' => 'Sous-marine', + }, + }, + 'PictureMode2' => { + Description => 'Mode d\'image 2', + PrintConv => { + 'Aperture Priority' => 'Priorité ouverture', + 'Aperture Priority, Off-Auto-Aperture' => 'Priorité ouverture (auto-diaph hors service)', + 'Auto PICT' => 'Image auto', + 'Bulb' => 'Pose B', + 'Bulb, Off-Auto-Aperture' => 'Pose B (auto-diaph hors service)', + 'Flash X-Sync Speed AE' => 'Expo auto, vitesse de synchro flash X', + 'Green Mode' => 'Mode vert', + 'Manual' => 'Manuelle', + 'Manual, Off-Auto-Aperture' => 'Manuel (auto-diaph hors service)', + 'Program AE' => 'Programme AE', + 'Program Av Shift' => 'Décalage programme Av', + 'Program Tv Shift' => 'Décalage programme Tv', + 'Scene Mode' => 'Mode scène', + 'Sensitivity Priority AE' => 'Expo auto, priorité sensibilité', + 'Shutter & Aperture Priority AE' => 'Expo auto, priorité vitesse et ouverture', + 'Shutter Speed Priority' => 'Priorité vitesse', + }, + }, + 'PictureModeBWFilter' => { + PrintConv => { + 'Green' => 'Vert', + 'Red' => 'Rouge', + 'Yellow' => 'Jaune', + 'n/a' => 'Non établie', + }, + }, + 'PictureModeTone' => { + PrintConv => { + 'Blue' => 'Bleu', + 'Green' => 'Vert', + 'n/a' => 'Non établie', + }, + }, + 'PictureStyle' => { + Description => 'Style d\'image', + PrintConv => { + 'Faithful' => 'Fidèle', + 'High Saturation' => 'Saturation élevée', + 'Landscape' => 'Paysage', + 'Low Saturation' => 'Faible saturation', + 'Neutral' => 'Neutre', + 'None' => 'Aucune', + }, + }, + 'PixelIntensityRange' => 'Intervalle d\'intensité de pixel', + 'PixelScale' => 'Tag d\'échelle de pixel modèle', + 'PixelUnits' => { + PrintConv => { + 'Unknown' => 'Inconnu', + }, + }, + 'PlanarConfiguration' => { + Description => 'Arrangement des données image', + PrintConv => { + 'Chunky' => 'Format « chunky » (entrelacé)', + 'Planar' => 'Format « planar »', + }, + }, + 'PostalCode' => 'Code Postal', + 'PowerSource' => { + Description => 'Source d\'alimentation', + PrintConv => { + 'Body Battery' => 'Accu boîtier', + 'External Power Supply' => 'Alimentation externe', + 'Grip Battery' => 'Accu poignée', + }, + }, + 'Predictor' => { + Description => 'Prédicteur', + PrintConv => { + 'Horizontal differencing' => 'Différentiation horizontale', + 'None' => 'Aucun schéma de prédicteur utilisé avant l\'encodage', + }, + }, + 'Preview0' => 'Aperçu 0', + 'Preview1' => 'Aperçu 1', + 'Preview2' => 'Aperçu 2', + 'PreviewApplicationName' => 'Nom de l\'application d\'aperçu', + 'PreviewApplicationVersion' => 'Version de l\'application d\'aperçu', + 'PreviewColorSpace' => { + Description => 'Espace de couleur de l\'aperçu', + PrintConv => { + 'Unknown' => 'Inconnu', + }, + }, + 'PreviewDateTime' => 'Horodatage d\'aperçu', + 'PreviewImage' => 'Aperçu', + 'PreviewImageBorders' => 'Limites d\'image miniature', + 'PreviewImageData' => 'Données d\'image miniature', + 'PreviewImageLength' => 'Longueur d\'image miniature', + 'PreviewImageSize' => 'Taille d\'image miniature', + 'PreviewImageStart' => 'Début d\'image miniature', + 'PreviewImageValid' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'PreviewQuality' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'PreviewSettingsDigest' => 'Digest des réglages d\'aperçu', + 'PreviewSettingsName' => 'Nom des réglages d\'aperçu', + 'PrimaryAFPoint' => { + PrintConv => { + 'Bottom' => 'Bas', + 'C6 (Center)' => 'C6 (Centre)', + 'Center' => 'Centre', + 'Mid-left' => 'Milieu gauche', + 'Mid-right' => 'Milieu droit', + 'Top' => 'Haut', + }, + }, + 'PrimaryChromaticities' => 'Chromaticité des couleurs primaires', + 'PrimaryPlatform' => 'Plateforme primaire', + 'ProcessingSoftware' => 'Logiciel de traitement', + 'Producer' => 'Producteur', + 'ProductID' => 'ID de produit', + 'ProductionCode' => 'L\'appareil est passé en SAV', + 'ProfileCMMType' => 'Type de profil CMM', + 'ProfileCalibrationSig' => 'Signature de calibration de profil', + 'ProfileClass' => { + Description => 'Classe de profil', + PrintConv => { + 'Abstract Profile' => 'Profil de résumé', + 'ColorSpace Conversion Profile' => 'Profil de conversion d\'espace de couleur', + 'DeviceLink Profile' => 'Profil de liaison', + 'Display Device Profile' => 'Profil d\'appareil d\'affichage', + 'Input Device Profile' => 'Profil d\'appareil d\'entrée', + 'NamedColor Profile' => 'Profil de couleur nommée', + 'Nikon Input Device Profile (NON-STANDARD!)' => 'Profil Nikon ("nkpf")', + 'Output Device Profile' => 'Profil d\'appareil de sortie', + }, + }, + 'ProfileConnectionSpace' => 'Espace de connexion de profil', + 'ProfileCopyright' => 'Copyright du profil', + 'ProfileCreator' => 'Créateur du profil', + 'ProfileDateTime' => 'Horodatage du profil', + 'ProfileDescription' => 'Description du profil', + 'ProfileDescriptionML' => 'Description de profil ML', + 'ProfileEmbedPolicy' => { + Description => 'Règles d\'usage du profil incluses', + PrintConv => { + 'Allow Copying' => 'Permet la copie', + 'Embed if Used' => 'Inclus si utilisé', + 'Never Embed' => 'Jamais inclus', + 'No Restrictions' => 'Pas de restriction', + }, + }, + 'ProfileFileSignature' => 'Signature de fichier de profil', + 'ProfileHueSatMapData1' => 'Données de profil teinte sat. 1', + 'ProfileHueSatMapData2' => 'Données de profil teinte sat. 2', + 'ProfileHueSatMapDims' => 'Divisions de teinte', + 'ProfileID' => 'ID du profil', + 'ProfileLookTableData' => 'Données de table de correspondance de profil', + 'ProfileLookTableDims' => 'Divisions de teinte', + 'ProfileName' => 'Nom du profil', + 'ProfileSequenceDesc' => 'Description de séquence du profil', + 'ProfileToneCurve' => 'Courbe de ton du profil', + 'ProfileVersion' => 'Version de profil', + 'ProgramISO' => 'Programme ISO', + 'ProgramLine' => { + Description => 'Ligne de programme', + PrintConv => { + 'Depth' => 'Priorité profondeur de champ', + 'Hi Speed' => 'Priorité grande vitesse', + 'MTF' => 'Priorité FTM', + 'Normal' => 'Normale', + }, + }, + 'ProgramMode' => { + PrintConv => { + 'None' => 'Aucune', + 'Sunset' => 'Coucher de soleil', + 'Text' => 'Texte', + }, + }, + 'ProgramShift' => 'Décalage Programme', + 'ProgramVersion' => 'Version du programme', + 'Protect' => 'Protéger', + 'Province-State' => 'État / Région', + 'Publisher' => 'Editeur', + 'Quality' => { + Description => 'Qualité', + PrintConv => { + 'Best' => 'La meilleure', + 'Better' => 'Meilleure', + 'Compressed RAW' => 'cRAW', + 'Compressed RAW + JPEG' => 'cRAW+JPEG', + 'Extra Fine' => 'Extra fine', + 'Good' => 'Bonne', + 'Low' => 'Bas', + 'Normal' => 'Normale', + 'RAW + JPEG' => 'RAW+JPEG', + }, + }, + 'QualityMode' => { + Description => 'Qualité', + PrintConv => { + 'Fine' => 'Haute', + 'Normal' => 'Normale', + }, + }, + 'QuantizationMethod' => { + Description => 'Méthode de quantification', + PrintConv => { + 'Color Space Specific' => 'Spécifique à l\'espace de couleur', + 'Compression Method Specific' => 'Spécifique à la méthode de compression', + 'Gamma Compensated' => 'Compensée gamma', + 'IPTC Ref B' => 'IPTC réf "B"', + 'Linear Density' => 'Densité linéaire', + 'Linear Dot Percent' => 'Pourcentage de point linéaire', + 'Linear Reflectance/Transmittance' => 'Réflectance/transmittance linéaire', + }, + }, + 'QuickAdjust' => 'Réglages rapides', + 'QuickControlDialInMeter' => { + Description => 'Molette de contrôle rapide en mesure', + PrintConv => { + 'AF point selection' => 'Sélection collimateur AF', + 'Exposure comp/Aperture' => 'Correction exposition/ouverture', + 'ISO speed' => 'Sensibilité ISO', + }, + }, + 'QuickShot' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'RAFVersion' => 'Version RAF', + 'RasterPadding' => 'Remplissage raster', + 'RasterizedCaption' => 'Légende rastérisée', + 'Rating' => 'Évaluation', + 'RatingPercent' => 'Rapport en pourcentage', + 'RawAndJpgRecording' => { + Description => 'Enregistrement RAW et JPEG', + PrintConv => { + 'JPEG (Best)' => 'JPEG (le meilleur)', + 'JPEG (Better)' => 'JPEG (meilleur)', + 'JPEG (Good)' => 'JPEG (bon)', + 'RAW (DNG, Best)' => 'RAW (DNG, le meilleur)', + 'RAW (DNG, Better)' => 'RAW (DNG, meilleur)', + 'RAW (DNG, Good)' => 'RAW (DNG, bon)', + 'RAW (PEF, Best)' => 'RAW (PEF, le meilleur)', + 'RAW (PEF, Better)' => 'RAW (PEF, meilleur)', + 'RAW (PEF, Good)' => 'RAW (PEF, bon)', + 'RAW+JPEG (DNG, Best)' => 'RAW+JPEG (DNG, le meilleur)', + 'RAW+JPEG (DNG, Better)' => 'RAW+JPEG (DNG, meilleur)', + 'RAW+JPEG (DNG, Good)' => 'RAW+JPEG (DNG, bon)', + 'RAW+JPEG (PEF, Best)' => 'RAW+JPEG (PEF, le meilleur)', + 'RAW+JPEG (PEF, Better)' => 'RAW+JPEG (PEF, meilleur)', + 'RAW+JPEG (PEF, Good)' => 'RAW+JPEG (PEF, bon)', + 'RAW+Large/Fine' => 'RAW+grande/fine', + 'RAW+Large/Normal' => 'RAW+grande/normale', + 'RAW+Medium/Fine' => 'RAW+moyenne/fine', + 'RAW+Medium/Normal' => 'RAW+moyenne/normale', + 'RAW+Small/Fine' => 'RAW+petite/fine', + 'RAW+Small/Normal' => 'RAW+petite/normale', + }, + }, + 'RawDataOffset' => 'Décalage données Raw', + 'RawDataUniqueID' => 'ID unique de données brutes', + 'RawDevAutoGradation' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'RawDevPMPictureTone' => { + PrintConv => { + 'Blue' => 'Bleu', + 'Green' => 'Vert', + }, + }, + 'RawDevPM_BWFilter' => { + PrintConv => { + 'Green' => 'Vert', + 'Red' => 'Rouge', + 'Yellow' => 'Jaune', + }, + }, + 'RawDevPictureMode' => { + PrintConv => { + 'Natural' => 'Naturel', + }, + }, + 'RawDevWhiteBalance' => { + PrintConv => { + 'Color Temperature' => 'Température de couleur', + }, + }, + 'RawImageCenter' => 'Centre Image RAW', + 'RawImageDigest' => 'Digest d\'image brute', + 'RawImageHeight' => 'Hauteur de l\'image brute', + 'RawImageSize' => 'Taille d\'image RAW', + 'RawImageWidth' => 'Largeur de l\'image brute', + 'RawJpgQuality' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'RecordMode' => { + Description => 'Mode d\'enregistrement', + PrintConv => { + 'Aperture Priority' => 'Priorité ouverture', + 'Manual' => 'Manuelle', + 'Shutter Priority' => 'Priorité vitesse', + }, + }, + 'RecordingMode' => { + PrintConv => { + 'Landscape' => 'Paysage', + 'Manual' => 'Manuelle', + 'Night Scene' => 'Nocturne', + }, + }, + 'RedBalance' => 'Balance rouge', + 'RedEyeCorrection' => { + PrintConv => { + 'Automatic' => 'Auto', + 'Off' => 'Désactivé', + }, + }, + 'RedEyeReduction' => { + Description => 'Réduction yeux rouges', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'RedMatrixColumn' => 'Colonne de matrice rouge', + 'RedTRC' => 'Courbe de reproduction des tons rouges', + 'ReductionMatrix1' => 'Matrice de réduction 1', + 'ReductionMatrix2' => 'Matrice de réduction 2', + 'ReferenceBlackWhite' => 'Paire de valeurs de référence noir et blanc', + 'ReferenceDate' => 'Date de référence', + 'ReferenceNumber' => 'Numéro de référence', + 'ReferenceService' => 'Service de référence', + 'RelatedImageFileFormat' => 'Format de fichier image apparenté', + 'RelatedImageHeight' => 'Hauteur d\'image apparentée', + 'RelatedImageWidth' => 'Largeur d\'image apparentée', + 'RelatedSoundFile' => 'Fichier audio apparenté', + 'ReleaseButtonToUseDial' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'ReleaseDate' => 'Date de version', + 'ReleaseTime' => 'Heure de version', + 'RenderingIntent' => { + Description => 'Intention de rendu', + PrintConv => { + 'ICC-Absolute Colorimetric' => 'Colorimétrique absolu', + 'Media-Relative Colorimetric' => 'Colorimétrique relatif', + 'Perceptual' => 'Perceptif', + }, + }, + 'ResampleParamsQuality' => { + PrintConv => { + 'Low' => 'Bas', + }, + }, + 'Resaved' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'Resolution' => 'Résolution d\'image', + 'ResolutionUnit' => { + Description => 'Unité de résolution en X et Y', + PrintConv => { + 'None' => 'Aucune', + 'cm' => 'Pixels/cm', + 'inches' => 'Pouce', + }, + }, + 'RetouchHistory' => { + Description => 'Historique retouche', + PrintConv => { + 'None' => 'Aucune', + }, + }, + 'RevisionNumber' => 'Numéro de révision', + 'Rights' => 'Droits', + 'Rotation' => { + PrintConv => { + 'Rotate 270 CW' => 'Rotation à 270 ° - sens antihoraire', + 'Rotate 90 CW' => 'Rotation 90 ° - sens horaire', + }, + }, + 'RowInterleaveFactor' => 'Facteur d\'entrelacement des lignes', + 'RowsPerStrip' => 'Nombre de rangées par bande', + 'SMaxSampleValue' => 'Valeur maxi d\'échantillon S', + 'SMinSampleValue' => 'Valeur mini d\'échantillon S', + 'SPIFFVersion' => 'Version SPIFF', + 'SRAWQuality' => { + PrintConv => { + 'n/a' => 'Non établie', + }, + }, + 'SRActive' => { + Description => 'Réduction de bougé active', + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'SRFocalLength' => 'Focale de réduction de bougé', + 'SRHalfPressTime' => 'Temps entre mesure et déclenchement', + 'SRResult' => { + Description => 'Stabilisation', + PrintConv => { + 'Not stabilized' => 'Non stabilisé', + }, + }, + 'SVGVersion' => 'Version SVG', + 'SafetyShift' => { + Description => 'Décalage de sécurité', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable (ISO speed)' => 'Activé (sensibilité ISO)', + 'Enable (Tv/Av)' => 'Activé (Tv/Av)', + }, + }, + 'SafetyShiftInAvOrTv' => { + Description => 'Décalage de sécurité Av ou Tv', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activé', + }, + }, + 'SampleFormat' => { + Description => 'Format d\'échantillon', + PrintConv => { + 'Complex int' => 'Entier complexe', + 'Float' => 'Réel à virgule flottante', + 'Signed' => 'Entier signé', + 'Undefined' => 'Non défini', + 'Unsigned' => 'Entier non signé', + }, + }, + 'SampleStructure' => { + Description => 'Structure d\'échantillonnage', + PrintConv => { + 'CompressionDependent' => 'Définie dans le processus de compression', + 'Orthogonal4-2-2Sampling' => 'Orthogonale, avec les fréquences d\'échantillonnage dans le rapport 4:2:2:(4)', + 'OrthogonalConstangSampling' => 'Orthogonale, avec les mêmes fréquences d\'échantillonnage relatives sur chaque composante', + }, + }, + 'SamplesPerPixel' => 'Nombre de composantes', + 'Saturation' => { + PrintConv => { + '+1 (medium high)' => '+1 (Assez fort)', + '+2 (high)' => '+2 (Forte)', + '+3 (very high)' => '+3 (Très fort)', + '+4 (highest)' => '+4', + '+4 (maximum)' => '+4', + '-1 (medium low)' => '-1 (Assez faible)', + '-2 (low)' => '-2 (Faible)', + '-3 (very low)' => '-3 (Très faible)', + '-4 (lowest)' => '-4', + '-4 (minimum)' => '-4', + '0 (normal)' => '0 (Normale)', + 'High' => 'Forte', + 'Low' => 'Faible', + 'None' => 'Non établie', + 'Normal' => 'Normale', + }, + }, + 'ScanImageEnhancer' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ScanningDirection' => { + Description => 'Direction de scannage', + PrintConv => { + 'Bottom-Top, L-R' => 'De bas en haut, de gauche à droite', + 'Bottom-Top, R-L' => 'De bas en haut, de droite à gauche', + 'L-R, Bottom-Top' => 'De gauche à droite, de bas en haut', + 'L-R, Top-Bottom' => 'De gauche à droite, de haut en bas', + 'R-L, Bottom-Top' => 'De droite à gauche, de bas en haut', + 'R-L, Top-Bottom' => 'De droite à gauche, de haut en bas', + 'Top-Bottom, L-R' => 'De haut en bas, de gauche à droite', + 'Top-Bottom, R-L' => 'De haut en bas, de droite à gauche', + }, + }, + 'Scene' => 'Scène', + 'SceneAssist' => 'Assistant Scene', + 'SceneCaptureType' => { + Description => 'Type de capture de scène', + PrintConv => { + 'Landscape' => 'Paysage', + 'Night' => 'Scène de nuit', + }, + }, + 'SceneMode' => { + Description => 'Modes scène', + PrintConv => { + '3D Sweep Panorama' => '3D', + 'Anti Motion Blur' => 'Anti-flou de mvt', + 'Aperture Priority' => 'Priorité ouverture', + 'Auto' => 'Auto.', + 'Candlelight' => 'Bougie', + 'Cont. Priority AE' => 'AE priorité continue', + 'Handheld Night Shot' => 'Vue de nuit manuelle', + 'Landscape' => 'Paysage', + 'Manual' => 'Manuelle', + 'Night Portrait' => 'Portrait nocturne', + 'Night Scene' => 'Nocturne', + 'Night View/Portrait' => 'Vision/portrait nocturne', + 'Normal' => 'Normale', + 'Off' => 'Désactivé', + 'Shutter Priority' => 'Priorité vitesse', + 'Snow' => 'Neige', + 'Sunset' => 'Coucher de soleil', + 'Super Macro' => 'Super macro', + 'Sweep Panorama' => 'Panora. par balayage', + 'Text' => 'Texte', + }, + }, + 'SceneModeUsed' => { + PrintConv => { + 'Aperture Priority' => 'Priorité ouverture', + 'Candlelight' => 'Bougie', + 'Landscape' => 'Paysage', + 'Manual' => 'Manuelle', + 'Shutter Priority' => 'Priorité vitesse', + 'Snow' => 'Neige', + 'Sunset' => 'Coucher de soleil', + 'Text' => 'Texte', + }, + }, + 'SceneSelect' => { + PrintConv => { + 'Night' => 'Scène de nuit', + 'Off' => 'Désactivé', + }, + }, + 'SceneType' => { + Description => 'Type de scène', + PrintConv => { + 'Directly photographed' => 'Image photographiée directement', + }, + }, + 'SecurityClassification' => { + Description => 'Classement de sécurité', + PrintConv => { + 'Confidential' => 'Confidentiel', + 'Restricted' => 'Restreint', + 'Top Secret' => 'Top secret', + 'Unclassified' => 'Non classé', + }, + }, + 'SelectableAFPoint' => { + Description => 'Collimateurs AF sélectionnables', + PrintConv => { + '11 points' => '11 collimateurs', + '19 points' => '19 collimateurs', + '45 points' => '45 collimateurs', + 'Inner 9 points' => '9 collimateurs centraux', + 'Outer 9 points' => '9 collimateurs périphériques', + }, + }, + 'SelfTimer' => { + Description => 'Retardateur', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'SelfTimer2' => 'Retardateur (2)', + 'SelfTimerMode' => 'Mode auto-timer', + 'SensingMethod' => { + Description => 'Méthode de capture', + PrintConv => { + 'Color sequential area' => 'Capteur couleur séquentiel', + 'Color sequential linear' => 'Capteur couleur séquentiel linéaire', + 'Monochrome area' => 'Capteur monochrome', + 'Monochrome linear' => 'Capteur linéaire monochrome', + 'Not defined' => 'Non définie', + 'One-chip color area' => 'Capteur monochip couleur', + 'Three-chip color area' => 'Capteur trois chips couleur', + 'Trilinear' => 'Capteur trilinéaire', + 'Two-chip color area' => 'Capteur deux chips couleur', + }, + }, + 'SensitivityAdjust' => 'Réglage de sensibilité', + 'SensitivitySteps' => { + Description => 'Pas de sensibilité', + PrintConv => { + '1 EV Steps' => 'Pas de 1 IL', + 'As EV Steps' => 'Comme pas IL', + }, + }, + 'SensitivityType' => 'Type de sensibilité', + 'SensorCleaning' => { + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activé', + }, + }, + 'SensorHeight' => 'Hauteur du capteur', + 'SensorPixelSize' => 'Taille des pixels du capteur', + 'SensorWidth' => 'Largeur du capteur', + 'SequenceNumber' => 'Numéro de Séquence', + 'SequentialShot' => { + PrintConv => { + 'None' => 'Aucune', + }, + }, + 'SerialNumber' => 'Numéro de série', + 'ServiceIdentifier' => 'Identificateur de service', + 'SetButtonCrossKeysFunc' => { + Description => 'Réglage touche SET/joypad', + PrintConv => { + 'Cross keys: AF point select' => 'Joypad:Sélec. collim. AF', + 'Normal' => 'Normale', + 'Set: Flash Exposure Comp' => 'SET:Cor expo flash', + 'Set: Parameter' => 'SET:Changer de paramètres', + 'Set: Picture Style' => 'SET:Style d’image', + 'Set: Playback' => 'SET:Lecture', + 'Set: Quality' => 'SET:Qualité', + }, + }, + 'SetButtonWhenShooting' => { + Description => 'Touche SET au déclenchement', + PrintConv => { + 'Change parameters' => 'Changer de paramètres', + 'Default (no function)' => 'Normal (désactivée)', + 'Disabled' => 'Désactivée', + 'Flash exposure compensation' => 'Correction expo flash', + 'ISO speed' => 'Sensibilité ISO', + 'Image playback' => 'Lecture de l\'image', + 'Image quality' => 'Changer de qualité', + 'Image size' => 'Taille d\'image', + 'LCD monitor On/Off' => 'Écran LCD On/Off', + 'Menu display' => 'Affichage du menu', + 'Normal (disabled)' => 'Normal (désactivée)', + 'Picture style' => 'Style d\'image', + 'Quick control screen' => 'Écran de contrôle rapide', + 'Record func. + media/folder' => 'Fonction enregistrement + média/dossier', + 'Record movie (Live View)' => 'Enr. vidéo (visée écran)', + 'White balance' => 'Balance des blancs', + }, + }, + 'SetFunctionWhenShooting' => { + Description => 'Touche SET au déclenchement', + PrintConv => { + 'Change Parameters' => 'Changer de paramètres', + 'Change Picture Style' => 'Style d\'image', + 'Change quality' => 'Changer de qualité', + 'Default (no function)' => 'Normal (désactivée)', + 'Image replay' => 'Lecture de l\'image', + 'Menu display' => 'Affichage du menu', + }, + }, + 'ShadingCompensation' => { + Description => 'Compensation de l\'ombrage', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ShadingCompensation2' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ShadowScale' => 'Echelle d\'ombre', + 'ShakeReduction' => { + Description => 'Réduction du bougé (réglage)', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ShakeReductionInfo' => 'Stabilisation', + 'Sharpness' => { + Description => 'Accentuation', + PrintConv => { + '+1 (medium hard)' => '+1 (Assez dure)', + '+2 (hard)' => '+2 (Dure)', + '+3 (very hard)' => '+3 (Très dure)', + '+4 (hardest)' => '+4', + '+4 (maximum)' => '+4', + '-1 (medium soft)' => '-1 (Assez dure)', + '-2 (soft)' => '-2 (Douce)', + '-3 (very soft)' => '-3 (Très douce)', + '-4 (minimum)' => '-4', + '-4 (softest)' => '-4', + '0 (normal)' => '0 (Normale)', + 'Hard' => 'Dure', + 'Normal' => 'Normale', + 'Sharp' => 'Dure', + 'Soft' => 'Douce', + 'n/a' => 'Non établie', + }, + }, + 'SharpnessFrequency' => { + PrintConv => { + 'High' => 'Haut', + 'Highest' => 'Plus haut', + 'Low' => 'Doux', + 'n/a' => 'Non établie', + }, + }, + 'ShootingMode' => { + Description => 'Télécommande IR', + PrintConv => { + 'Aerial Photo' => 'Photo aérienne', + 'Aperture Priority' => 'Priorité ouverture', + 'Baby' => 'Bébé', + 'Beach' => 'Plage', + 'Candlelight' => 'Eclairage Bougie', + 'Color Effects' => 'Effets de couleurs', + 'Fireworks' => 'Feu d\'artifice', + 'Food' => 'Nourriture', + 'High Sensitivity' => 'Haute sensibilité', + 'High Speed Continuous Shooting' => 'Déclenchement continu à grande vitesse', + 'Intelligent Auto' => 'Mode Auto intelligent', + 'Intelligent ISO' => 'ISO Intelligent', + 'Manual' => 'Manuel', + 'Movie Preview' => 'Prévisualisation vidéo', + 'Night Portrait' => 'Portrait de nuit', + 'Normal' => 'Normale', + 'Panning' => 'Panoramique', + 'Panorama Assist' => 'Assistant Panorama', + 'Party' => 'Fête', + 'Pet' => 'Animal domestique', + 'Program' => 'Programme', + 'Scenery' => 'Paysage', + 'Shutter Priority' => 'Priorité vitesse', + 'Snow' => 'Neige', + 'Soft Skin' => 'Peau douce', + 'Starry Night' => 'Nuit étoilée', + 'Sunset' => 'Coucher de soleil', + 'Underwater' => 'Subaquatique', + }, + }, + 'ShortDocumentID' => 'ID court de document', + 'ShortReleaseTimeLag' => { + Description => 'Inertie au déclenchement réduite', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activé', + }, + }, + 'ShotInfoVersion' => 'Version des Infos prise de vue', + 'Shutter-AELock' => { + Description => 'Déclencheur/Touche verr. AE', + PrintConv => { + 'AE lock/AF' => 'Verrouillage AE/autofocus', + 'AE/AF, No AE lock' => 'AE/AF, pas de verrou. AE', + 'AF/AE lock' => 'Autofocus/verrouillage AE', + 'AF/AF lock' => 'Autofocus/verrouillage AF', + 'AF/AF lock, No AE lock' => 'AF/verr.AF, pas de verr.AE', + }, + }, + 'ShutterAELButton' => { + Description => 'Déclencheur/Touche verr. AE', + PrintConv => { + 'AE lock/AF' => 'Verrouillage AE/Autofocus', + 'AE/AF, No AE lock' => 'AE/AF, pas de verrou. AE', + 'AF/AE lock stop' => 'Autofocus/Verrouillage AE', + 'AF/AF lock, No AE lock' => 'AF/verr.AF, pas de verr.AE', + }, + }, + 'ShutterButtonAFOnButton' => { + Description => 'Déclencheur/Touche AF', + PrintConv => { + 'AE lock/Metering + AF start' => 'Mémo expo/lct. mesure+AF', + 'Metering + AF start' => 'Mesure + lancement AF', + 'Metering + AF start/AF stop' => 'Mesure + lancement/arrêt AF', + 'Metering + AF start/disable' => 'Lct. mesure+AF/désactivée', + 'Metering start/Meter + AF start' => 'Lct. mesure/lct. mesure+AF', + }, + }, + 'ShutterCount' => 'Comptage des déclenchements', + 'ShutterCurtainSync' => { + Description => 'Synchronisation du rideau', + PrintConv => { + '1st-curtain sync' => 'Synchronisation premier rideau', + '2nd-curtain sync' => 'Synchronisation deuxième rideau', + }, + }, + 'ShutterMode' => { + PrintConv => { + 'Aperture Priority' => 'Priorité ouverture', + }, + }, + 'ShutterReleaseButtonAE-L' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ShutterReleaseNoCFCard' => { + Description => 'Déclench. obtur. sans carte', + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'ShutterSpeed' => 'Temps de pose', + 'ShutterSpeedRange' => { + Description => 'Régler gamme de vitesses', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activée', + }, + }, + 'ShutterSpeedValue' => 'Vitesse d\'obturation', + 'SidecarForExtension' => 'Extension', + 'SimilarityIndex' => 'Indice de similarité', + 'SlaveFlashMeteringSegments' => 'Segments de mesure flash esclave', + 'SlideShow' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'SlowShutter' => { + Description => 'Vitesse d\'obturation lente', + PrintConv => { + 'Night Scene' => 'Nocturne', + 'None' => 'Aucune', + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'SlowSync' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'Software' => 'Logiciel', + 'SpatialFrequencyResponse' => 'Réponse spatiale en fréquence', + 'SpecialEffectsOpticalFilter' => { + PrintConv => { + 'None' => 'Aucune', + }, + }, + 'SpectralSensitivity' => 'Sensibilité spectrale', + 'SpotMeterLinkToAFPoint' => { + Description => 'Mesure spot liée au collimateur AF', + PrintConv => { + 'Disable (use center AF point)' => 'Désactivée (utiliser collimateur AF central)', + 'Enable (use active AF point)' => 'Activé (utiliser collimateur AF actif)', + }, + }, + 'SpotMeteringMode' => { + PrintConv => { + 'Center' => 'Centre', + }, + }, + 'State' => 'État / Région', + 'StreamType' => { + PrintConv => { + 'Text' => 'Texte', + }, + }, + 'StripByteCounts' => 'Octets par bande compressée', + 'StripOffsets' => 'Emplacement des données image', + 'Sub-location' => 'Lieu', + 'SubSecCreateDate' => 'Date de la création des données numériques', + 'SubSecDateTimeOriginal' => 'Date de la création des données originales', + 'SubSecModifyDate' => 'Date de modification de fichier', + 'SubSecTime' => 'Fractions de seconde de DateTime', + 'SubSecTimeDigitized' => 'Fractions de seconde de DateTimeDigitized', + 'SubSecTimeOriginal' => 'Fractions de seconde de DateTimeOriginal', + 'SubTileBlockSize' => 'Taille de bloc de sous-tuile', + 'SubfileType' => 'Type du nouveau sous-fichier', + 'SubimageColor' => { + PrintConv => { + 'RGB' => 'RVB', + }, + }, + 'Subject' => 'Sujet', + 'SubjectArea' => 'Zone du sujet', + 'SubjectCode' => 'Code sujet', + 'SubjectDistance' => 'Distance du sujet', + 'SubjectDistanceRange' => { + Description => 'Intervalle de distance du sujet', + PrintConv => { + 'Close' => 'Vue rapprochée', + 'Distant' => 'Vue distante', + 'Unknown' => 'Inconnu', + }, + }, + 'SubjectLocation' => 'Zone du sujet', + 'SubjectProgram' => { + PrintConv => { + 'None' => 'Aucune', + 'Sunset' => 'Coucher de soleil', + 'Text' => 'Texte', + }, + }, + 'SubjectReference' => 'Code de sujet', + 'Subsystem' => { + PrintConv => { + 'Unknown' => 'Inconnu', + }, + }, + 'SuperMacro' => { + PrintConv => { + 'Off' => 'Désactivé', + }, + }, + 'SuperimposedDisplay' => { + Description => 'Affichage superposé', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'SupplementalCategories' => 'Catégorie d\'appoint', + 'SupplementalType' => { + Description => 'Type de supplément', + PrintConv => { + 'Main Image' => 'Non établi', + 'Rasterized Caption' => 'Titre rastérisé', + 'Reduced Resolution Image' => 'Image de résolution réduite', + }, + }, + 'SvISOSetting' => 'Réglage ISO Sv', + 'SwitchToRegisteredAFPoint' => { + Description => 'Activer collimateur enregistré', + PrintConv => { + 'Assist' => 'Touche d\'assistance', + 'Assist + AF' => 'Touche d\'assistance + touche AF', + 'Disable' => 'Désactivé', + 'Enable' => 'Activé', + 'Only while pressing assist' => 'Seulement en appuyant touche d\'assistance', + }, + }, + 'T4Options' => 'Bits de remplissage ajoutés', + 'T6Options' => 'Options T6', + 'TTL_DA_ADown' => 'Segment de mesure flash esclave 6', + 'TTL_DA_AUp' => 'Segment de mesure flash esclave 5', + 'TTL_DA_BDown' => 'Segment de mesure flash esclave 8', + 'TTL_DA_BUp' => 'Segment de mesure flash esclave 7', + 'Tagged' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'TargetPrinter' => 'Imprimante cible', + 'Technology' => { + Description => 'Technologie', + PrintConv => { + 'Active Matrix Display' => 'Afficheur à matrice active', + 'Cathode Ray Tube Display' => 'Afficheur à tube cathodique', + 'Digital Camera' => 'Appareil photo numérique', + 'Dye Sublimation Printer' => 'Imprimante à sublimation thermique', + 'Electrophotographic Printer' => 'Imprimante électrophotographique', + 'Electrostatic Printer' => 'Imprimante électrostatique', + 'Film Scanner' => 'Scanner de film', + 'Flexography' => 'Flexographie', + 'Ink Jet Printer' => 'Imprimante à jet d\'encre', + 'Offset Lithography' => 'Lithographie offset', + 'Passive Matrix Display' => 'Afficheur à matrice passive', + 'Photo CD' => 'CD photo', + 'Photo Image Setter' => 'Cadre photo', + 'Photographic Paper Printer' => 'Imprimante à papier photo', + 'Projection Television' => 'Téléviseur à projection', + 'Reflective Scanner' => 'Scanner à réflexion', + 'Silkscreen' => 'Ecran de soie', + 'Thermal Wax Printer' => 'Imprimante thermique à cire', + 'Video Camera' => 'Caméra vidéo', + 'Video Monitor' => 'Moniteur vidéo', + }, + }, + 'Teleconverter' => { + PrintConv => { + 'None' => 'Aucune', + }, + }, + 'Text' => 'Texte', + 'TextStamp' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'Thresholding' => 'Seuil', + 'ThumbnailHeight' => 'Hauteur de la vignette', + 'ThumbnailImage' => 'Vignette', + 'ThumbnailImageSize' => 'Taille des miniatures', + 'ThumbnailLength' => 'Longueur de la vignette', + 'ThumbnailOffset' => 'Décalage de la vignette', + 'ThumbnailWidth' => 'Hauteur de la vignette', + 'TileByteCounts' => 'Nombre d\'octets d\'élément', + 'TileDepth' => 'Profondeur d\'élément', + 'TileLength' => 'Longueur d\'élément', + 'TileOffsets' => 'Décalages d\'élément', + 'TileWidth' => 'Largeur d\'élément', + 'Time' => 'Heure', + 'TimeCreated' => 'Heure de création', + 'TimeScaleParamsQuality' => { + PrintConv => { + 'Low' => 'Bas', + }, + }, + 'TimeSent' => 'Heure d\'envoi', + 'TimeSincePowerOn' => 'Temps écoulé depuis la mise en marche', + 'TimeZone' => 'Fuseau horaire', + 'TimeZoneOffset' => 'Offset de zone de date', + 'TimerLength' => { + Description => 'Durée du retardateur', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activée', + }, + }, + 'Title' => 'Titre', + 'ToneComp' => 'Correction de tonalité', + 'ToneCurve' => { + Description => 'Courbe de ton', + PrintConv => { + 'Manual' => 'Manuelle', + }, + }, + 'ToneCurveActive' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'ToneCurves' => 'Courbes de ton', + 'ToningEffect' => { + Description => 'Virage', + PrintConv => { + 'Blue' => 'Bleu', + 'Green' => 'Vert', + 'None' => 'Aucune', + 'Red' => 'Rouge', + 'Yellow' => 'Jaune', + 'n/a' => 'Non établie', + }, + }, + 'ToningEffectMonochrome' => { + PrintConv => { + 'Blue' => 'Bleu', + 'Green' => 'Vert', + 'None' => 'Aucune', + }, + }, + 'ToningSaturation' => 'Saturation du virage', + 'TransferFunction' => 'Fonction de transfert', + 'TransferRange' => 'Intervalle de transfert', + 'Transformation' => { + PrintConv => { + 'Horizontal (normal)' => '0° (haut/gauche)', + 'Mirror horizontal' => '0° (haut/droit)', + 'Mirror horizontal and rotate 270 CW' => '90° sens horaire (gauche/haut)', + 'Mirror horizontal and rotate 90 CW' => '90° sens antihoraire (droit/bas)', + 'Mirror vertical' => '180° (bas/gauche)', + 'Rotate 180' => '180° (bas/droit)', + 'Rotate 270 CW' => '90° sens horaire (gauche/bas)', + 'Rotate 90 CW' => '90° sens antihoraire (droit/haut)', + }, + }, + 'TransmissionReference' => 'Référence transmission', + 'TransparencyIndicator' => 'Indicateur de transparence', + 'TrapIndicator' => 'Indicateur de piège', + 'Trapped' => { + Description => 'Piégé', + PrintConv => { + 'False' => 'Faux', + 'True' => 'Vrai', + 'Unknown' => 'Inconnu', + }, + }, + 'TravelDay' => 'Date du Voyage', + 'TvExposureTimeSetting' => 'Réglage de temps de pose Tv', + 'URL' => 'URL ', + 'USMLensElectronicMF' => { + Description => 'MF électronique à objectif USM', + PrintConv => { + 'Always turned off' => 'Toujours débrayé', + 'Disable after one-shot AF' => 'Désactivée après One-Shot AF', + 'Disable in AF mode' => 'Désactivée en mode AF', + 'Enable after one-shot AF' => 'Activée après AF One-Shot', + 'Turns off after one-shot AF' => 'Débrayé après One-Shot AF', + 'Turns on after one-shot AF' => 'Activé après One-Shot AF', + }, + }, + 'Uncompressed' => { + Description => 'Non.comprimé', + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'UniqueCameraModel' => 'Nom unique de modèle d\'appareil', + 'UniqueDocumentID' => 'ID unique de document', + 'UniqueObjectName' => 'Nom Unique d\'Objet', + 'Unknown' => 'Inconnu', + 'Unsharp1Color' => { + PrintConv => { + 'Blue' => 'Bleu', + 'Green' => 'Vert', + 'RGB' => 'RVB', + 'Red' => 'Rouge', + 'Yellow' => 'Jaune', + }, + }, + 'Unsharp2Color' => { + PrintConv => { + 'Blue' => 'Bleu', + 'Green' => 'Vert', + 'RGB' => 'RVB', + 'Red' => 'Rouge', + 'Yellow' => 'Jaune', + }, + }, + 'Unsharp3Color' => { + PrintConv => { + 'Blue' => 'Bleu', + 'Green' => 'Vert', + 'RGB' => 'RVB', + 'Red' => 'Rouge', + 'Yellow' => 'Jaune', + }, + }, + 'Unsharp4Color' => { + PrintConv => { + 'Blue' => 'Bleu', + 'Green' => 'Vert', + 'RGB' => 'RVB', + 'Red' => 'Rouge', + 'Yellow' => 'Jaune', + }, + }, + 'UnsharpMask' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'Urgency' => { + Description => 'Urgence', + PrintConv => { + '0 (reserved)' => '0 (réservé pour utilisation future)', + '1 (most urgent)' => '1 (très urgent)', + '5 (normal urgency)' => '5 (normalement urgent)', + '8 (least urgent)' => '8 (moins urgent)', + '9 (user-defined priority)' => '9 (réservé pour utilisation future)', + }, + }, + 'UsableMeteringModes' => { + Description => 'Sélectionner modes de mesure', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activée', + }, + }, + 'UsableShootingModes' => { + Description => 'Sélectionner modes de prise de vue', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activée', + }, + }, + 'UsageTerms' => 'Conditions d\'Utilisation', + 'UserComment' => 'Commentaire utilisateur', + 'UserDef1PictureStyle' => { + PrintConv => { + 'Landscape' => 'Paysage', + }, + }, + 'UserDef2PictureStyle' => { + PrintConv => { + 'Landscape' => 'Paysage', + }, + }, + 'UserDef3PictureStyle' => { + PrintConv => { + 'Landscape' => 'Paysage', + }, + }, + 'VRDVersion' => 'Version VRD', + 'VRInfo' => 'Information stabilisateur', + 'VRInfoVersion' => 'Info Version VR', + 'VR_0x66' => { + PrintConv => { + 'Off' => 'Désactivé', + }, + }, + 'VariProgram' => 'Variprogramme', + 'VibrationReduction' => { + Description => 'Reduction des vibrations', + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + 'n/a' => 'Non établie', + }, + }, + 'VideoCardGamma' => 'Gamma de la carte vidéo', + 'ViewInfoDuringExposure' => { + Description => 'Infos viseur pendant exposition', + PrintConv => { + 'Disable' => 'Désactivé', + 'Enable' => 'Activé', + }, + }, + 'ViewfinderWarning' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'ViewingCondDesc' => 'Description des conditions de visionnage', + 'ViewingCondIlluminant' => 'Illuminant des conditions de visionnage', + 'ViewingCondIlluminantType' => 'Type d\'illuminant des conditions de visionnage', + 'ViewingCondSurround' => 'Environnement des conditions de visionnage', + 'VignetteControl' => { + Description => 'Controle du vignettage', + PrintConv => { + 'High' => 'Haut', + 'Low' => 'Bas', + 'Normal' => 'Normale', + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'VoiceMemo' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'WBAdjLighting' => { + PrintConv => { + 'Daylight (cloudy)' => 'Lumière du jour (2)', + 'Daylight (direct sunlight)' => 'Lumière du jour (0)', + 'Daylight (shade)' => 'Lumière du jour (1)', + 'None' => 'Aucune', + }, + }, + 'WBBlueLevel' => 'Niveau Bleu Balance des Blancs', + 'WBBracketMode' => { + PrintConv => { + 'Off' => 'Désactivé', + }, + }, + 'WBFineTuneActive' => { + PrintConv => { + 'No' => 'Non', + 'Yes' => 'Oui', + }, + }, + 'WBGreenLevel' => 'Niveau Vert Balance des Blancs', + 'WBMediaImageSizeSetting' => { + Description => 'Réglage de balance des blancs + taille d\'image', + PrintConv => { + 'LCD monitor' => 'Écran LCD', + 'Rear LCD panel' => 'Panneau LCD arrière', + }, + }, + 'WBRedLevel' => 'Niveau Rouge Balance des Blancs', + 'WBShiftAB' => 'Décalage Balance Blancs ambre-bleu', + 'WBShiftGM' => 'Décalage Balance Blancs vert-magenta', + 'WB_GBRGLevels' => 'Niveaux BB VBRV', + 'WB_GRBGLevels' => 'Niveaux BB VRBV', + 'WB_GRGBLevels' => 'Niveaux BB VRVB', + 'WB_RBGGLevels' => 'Niveaux BB RBVV', + 'WB_RBLevels' => 'Niveaux BB RB', + 'WB_RBLevels3000K' => 'Niveaux BB RB 3000K', + 'WB_RBLevels3300K' => 'Niveaux BB RB 3300K', + 'WB_RBLevels3600K' => 'Niveaux BB RB 3600K', + 'WB_RBLevels3900K' => 'Niveaux BB RB 3800K', + 'WB_RBLevels4000K' => 'Niveaux BB RB 4000K', + 'WB_RBLevels4300K' => 'Niveaux BB RB 4300K', + 'WB_RBLevels4500K' => 'Niveaux BB RB 4500K', + 'WB_RBLevels4800K' => 'Niveaux BB RB 4800K', + 'WB_RBLevels5300K' => 'Niveaux BB RB 5300K', + 'WB_RBLevels6000K' => 'Niveaux BB RB 6000K', + 'WB_RBLevels6600K' => 'Niveaux BB RB 6600K', + 'WB_RBLevels7500K' => 'Niveaux BB RB 7500K', + 'WB_RBLevelsCloudy' => 'Niveaux BB RB nuageux', + 'WB_RBLevelsShade' => 'Niveaux BB RB ombre', + 'WB_RBLevelsTungsten' => 'Niveaux BB RB tungstène', + 'WB_RGBGLevels' => 'Niveaux BB RVBV', + 'WB_RGBLevels' => 'Niveaux BB RVB', + 'WB_RGBLevelsCloudy' => 'Niveaux BB RVB nuageux', + 'WB_RGBLevelsDaylight' => 'Niveaux BB RVB lumière jour', + 'WB_RGBLevelsFlash' => 'Niveaux BB RVB flash', + 'WB_RGBLevelsFluorescent' => 'Niveaux BB RVB fluorescent', + 'WB_RGBLevelsShade' => 'Niveaux BB RVB ombre', + 'WB_RGBLevelsTungsten' => 'Niveaux BB RVB tungstène', + 'WB_RGGBLevels' => 'Niveaux BB RVVB', + 'WB_RGGBLevelsCloudy' => 'Niveaux BB RVVB nuageux', + 'WB_RGGBLevelsDaylight' => 'Niveaux BB RVVB lumière jour', + 'WB_RGGBLevelsFlash' => 'Niveaux BB RVVB flash', + 'WB_RGGBLevelsFluorescent' => 'Niveaux BB RVVB fluorescent', + 'WB_RGGBLevelsFluorescentD' => 'Niveaux BB RVVB fluorescent', + 'WB_RGGBLevelsFluorescentN' => 'Niveaux BB RVVB fluo N', + 'WB_RGGBLevelsFluorescentW' => 'Niveaux BB RVVB fluo W', + 'WB_RGGBLevelsShade' => 'Niveaux BB RVVB ombre', + 'WB_RGGBLevelsTungsten' => 'Niveaux BB RVVB tungstène', + 'WCSProfiles' => 'Profil Windows Color System', + 'Warning' => 'Attention', + 'WebStatement' => 'Relevé Web', + 'WhiteBalance' => { + Description => 'Balance des blancs', + PrintConv => { + 'Auto' => 'Equilibrage des blancs automatique', + 'Black & White' => 'Monochrome', + 'Cloudy' => 'Temps nuageux', + 'Color Temperature/Color Filter' => 'Temp. Couleur / Filtre couleur', + 'Cool White Fluorescent' => 'Fluorescente type soft', + 'Custom' => 'Personnalisée', + 'Custom 1' => 'Personnalisée 1', + 'Custom 2' => 'Personnalisée 2', + 'Custom 3' => 'Personnalisée 3', + 'Custom 4' => 'Personnalisée 4', + 'Day White Fluorescent' => 'Fluorescente type blanc', + 'Daylight' => 'Lumière du jour', + 'Daylight Fluorescent' => 'Fluorescente type jour', + 'Fluorescent' => 'Fluorescente', + 'Manual' => 'Manuelle', + 'Manual Temperature (Kelvin)' => 'Température de couleur (Kelvin)', + 'Shade' => 'Ombre', + 'Tungsten' => 'Tungstène (lumière incandescente)', + 'Unknown' => 'Inconnu', + 'User-Selected' => 'Sélectionnée par l\'utilisateur', + 'Warm White Fluorescent' => 'Fluorescent blanc chaud', + 'White Fluorescent' => 'Fluorescent blanc', + }, + }, + 'WhiteBalanceAdj' => { + PrintConv => { + 'Cloudy' => 'Temps nuageux', + 'Daylight' => 'Lumière du jour', + 'Fluorescent' => 'Fluorescente', + 'Off' => 'Désactivé', + 'On' => 'Activé', + 'Shade' => 'Ombre', + 'Tungsten' => 'Tungstène (lumière incandescente)', + }, + }, + 'WhiteBalanceBias' => 'Décalage de Balance des blancs', + 'WhiteBalanceFineTune' => 'Balance des blancs - Réglage fin', + 'WhiteBalanceMode' => { + Description => 'Mode de balance des blancs', + PrintConv => { + 'Auto (Cloudy)' => 'Auto (nuageux)', + 'Auto (Day White Fluorescent)' => 'Auto (fluo jour)', + 'Auto (Daylight Fluorescent)' => 'Auto (fluo lum. jour)', + 'Auto (Daylight)' => 'Auto (lumière du jour)', + 'Auto (Flash)' => 'Auto (flash)', + 'Auto (Shade)' => 'Auto (ombre)', + 'Auto (Tungsten)' => 'Auto (tungstène)', + 'Auto (White Fluorescent)' => 'Auto (fluo blanc)', + 'Unknown' => 'Inconnu', + 'User-Selected' => 'Sélectionnée par l\'utilisateur', + }, + }, + 'WhiteBalanceSet' => { + Description => 'Réglage de balance des blancs', + PrintConv => { + 'Cloudy' => 'Temps nuageux', + 'Day White Fluorescent' => 'Fluorescent blanc jour', + 'Daylight' => 'Lumière du jour', + 'Daylight Fluorescent' => 'Fluorescente type jour', + 'Manual' => 'Manuelle', + 'Set Color Temperature 1' => 'Température de couleur définie 1', + 'Set Color Temperature 2' => 'Température de couleur définie 2', + 'Set Color Temperature 3' => 'Température de couleur définie 3', + 'Shade' => 'Ombre', + 'Tungsten' => 'Tungstène (lumière incandescente)', + 'White Fluorescent' => 'Fluorescent blanc', + }, + }, + 'WhiteLevel' => 'Niveau blanc', + 'WhitePoint' => 'Chromaticité du point blanc', + 'WideRange' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, + 'WorldTime' => 'Fuseau horaire', + 'WorldTimeLocation' => { + Description => 'Position en temps mondial', + PrintConv => { + 'Home' => 'Départ', + 'Hometown' => 'Résidence', + }, + }, + 'Writer-Editor' => 'Auteur de la légende / description', + 'XClipPathUnits' => 'Unités de chemin de rognage en X', + 'XMP' => 'Métadonnées XMP', + 'XPAuthor' => 'Auteur', + 'XPComment' => 'Commentaire', + 'XPKeywords' => 'Mots clé', + 'XPSubject' => 'Sujet', + 'XPTitle' => 'Titre', + 'XPosition' => 'Position en X', + 'XResolution' => 'Résolution d\'image horizontale', + 'YCbCrCoefficients' => 'Coefficients de la matrice de transformation de l\'espace de couleurs', + 'YCbCrPositioning' => { + Description => 'Positionnement Y et C', + PrintConv => { + 'Centered' => 'Centré', + 'Co-sited' => 'Côte à côte', + }, + }, + 'YCbCrSubSampling' => 'Rapport de sous-échantillonnage Y à C', + 'YClipPathUnits' => 'Unités de chemin de rognage en Y', + 'YPosition' => 'Position en Y', + 'YResolution' => 'Résolution d\'image verticale', + 'Year' => 'Année', + 'ZoneMatching' => { + Description => 'Ajustage de la zone', + PrintConv => { + 'High Key' => 'Hi', + 'ISO Setting Used' => 'Désactivée', + 'Low Key' => 'Lo', + }, + }, + 'ZoneMatchingOn' => { + PrintConv => { + 'Off' => 'Désactivé', + 'On' => 'Activé', + }, + }, +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::fr.pm - ExifTool French language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke, Bernard Guillotin, Jean Glasser, Jean Piquemal, Harry +Nizard and Alphonse Philippe for providing this translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/it.pm b/lib/Image/ExifTool/Lang/it.pm new file mode 100644 index 0000000..6d40317 --- /dev/null +++ b/lib/Image/ExifTool/Lang/it.pm @@ -0,0 +1,7921 @@ +#------------------------------------------------------------------------------ +# File: it.pm +# +# Description: ExifTool Italian language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::it; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.14'; + +%Image::ExifTool::Lang::it::Translate = ( + 'A100DataOffset' => 'Offset dati A100', + 'AAFManufacturerID' => 'ID AAF produttore', + 'ACoordOfBottomRightCorner' => 'Una coord in basso a destra', + 'ACoordOfTopRightCorner' => 'Una coord in alto a destra', + 'AEAperture' => 'Apertura esposizione automatica', + 'AEBAutoCancel' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AEBSequenceAutoCancel' => { + PrintConv => { + '-,0,+/Disabled' => '-,0,+/Disabilitato', + '-,0,+/Enabled' => '-,0,+/Abilitato', + '0,-,+/Disabled' => '0,-,+/Disabilitato', + '0,-,+/Enabled' => '0,-,+/Abilitato', + }, + }, + 'AEExposureTime' => 'Durata esposizione automatica', + 'AEFlags' => { + Description => 'Flag esposizione automatica', + PrintConv => { + 'AE lock' => 'Blocco esposizione automatica', + 'Aperture wide open' => 'Diaframma molto aperto', + 'Flash recommended?' => 'Flash consigliato?', + }, + }, + 'AELExposureIndicator' => { + PrintConv => { + 'Not Indicated' => 'Non indicato', + }, + }, + 'AELock' => { + Description => 'Blocco esposizione automatica', + PrintConv => { + 'Off' => 'Spento', + 'On' => 'Acceso', + }, + }, + 'AELockButton' => { + Description => 'Pulsante blocco esposizione automatica', + PrintConv => { + 'Flash Off' => 'Flash spento', + 'None' => 'Nessuno', + 'Preview' => 'Anteprima', + 'Virtual Horizon' => 'Orizzonte virtuale', + }, + }, + 'AELockButtonPlusDials' => { + PrintConv => { + 'Choose Image Area' => 'Seleziona area immagine', + 'None' => 'Nessuno', + }, + }, + 'AEMeteringMode' => { + PrintConv => { + 'Center-weighted average' => 'Media centrale ponderata', + 'Multi-segment' => 'Multi zona', + }, + }, + 'AEMicroadjustment' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'AEProgramMode' => { + PrintConv => { + 'Kids' => 'Bambini', + 'Landscape' => 'Orizzontale', + 'No Flash' => 'No flash', + 'Portrait' => 'Verticale', + 'Program' => 'Programma', + 'Sunset' => 'Tramonto', + 'Text' => 'Testo', + }, + }, + 'AESetting' => { + PrintConv => { + 'Exposure Compensation' => 'Compensazione esposizione', + }, + }, + 'AE_ISO' => 'ISO esposizione automatica', + 'AFAndMeteringButtons' => { + PrintConv => { + 'No function' => 'Nessuna funzione', + }, + }, + 'AFAperture' => 'Diaframma AF', + 'AFAreaIllumination' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AFAreaMode' => { + Description => 'Modo AF', + PrintConv => { + 'Dynamic Area' => 'Area Dinamica', + 'Dynamic Area (closest subject)' => 'Area Dinamica più Vicina al Soggetto', + 'Group Dynamic' => 'Gruppo Dinamico', + 'Local' => 'Locale', + 'Off (Manual Focus)' => 'Spento (focus manuale)', + 'Single Area' => 'Area Singola', + }, + }, + 'AFAssist' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AFDuringLiveView' => { + PrintConv => { + 'Enable' => 'Abilita', + 'Quick mode' => 'Modo veloce', + }, + }, + 'AFFineTune' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AFIlluminator' => { + PrintConv => { + 'Off' => 'Spento', + 'n/a' => 'n/d', + }, + }, + 'AFInfo' => 'Modo AF', + 'AFMode' => { + Description => 'Modo AF', + PrintConv => { + 'Off' => 'Spento', + 'n/a' => 'n/d', + }, + }, + 'AFOnAELockButtonSwitch' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'AFPoint' => { + Description => 'Punto AF', + PrintConv => { + '(none)' => '(nessuno)', + 'Bottom' => 'Basso', + 'Center' => 'Centro', + 'Far Left' => 'Tutto a sinistra', + 'Far Right' => 'Tutto a destra', + 'Left' => 'Sinistra', + 'Lower-left' => 'Inferiore sinistro', + 'Lower-right' => 'Inferiore destro', + 'Mid-left' => 'Centro/Sinistra', + 'Mid-right' => 'Centro/Destra', + 'None' => 'Nessuno', + 'Right' => 'Destra', + 'Right (horizontal)' => 'Destra (orizzontale)', + 'Right (vertical)' => 'Destra (verticale)', + 'Top' => 'Alto', + 'Upper-left' => 'Superiore sinistro', + 'Upper-right' => 'Superiore destro', + }, + }, + 'AFPointActivationArea' => { + PrintConv => { + 'Expanded' => 'Espanso', + }, + }, + 'AFPointAreaExpansion' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'AFPointBrightness' => { + PrintConv => { + 'Low' => 'Basso', + 'Normal' => 'Normale', + }, + }, + 'AFPointDisplayDuringFocus' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AFPointIllumination' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AFPointMode' => { + PrintConv => { + 'Fixed Center' => 'Centro fisso', + 'Select' => 'Seleziona', + }, + }, + 'AFPointRegistration' => { + PrintConv => { + 'Bottom' => 'Basso', + 'Center' => 'Centro', + 'Extreme Left' => 'Tutto a Sinistra', + 'Extreme Right' => 'Tutto a Destra', + 'Left' => 'Sinistra', + 'Right' => 'Destra', + 'Top' => 'Alto', + }, + }, + 'AFPointSelected' => { + PrintConv => { + 'Bottom' => 'Basso', + 'Center' => 'Centro', + 'Far Left' => 'Tutto a sinistra', + 'Far Right' => 'Tutto a destra', + 'Fixed Center' => 'Centro fisso', + 'Left' => 'Sinistra', + 'None' => 'Nessuno', + 'Right' => 'Destra', + 'Top' => 'Alto', + }, + }, + 'AFPointSelected2' => { + PrintConv => { + 'Center' => 'Centro', + 'Left' => 'Sinistra', + 'Right' => 'Destra', + }, + }, + 'AFPointSelection' => { + PrintConv => { + '11 Points' => '11 punti', + }, + }, + 'AFPointSelectionMethod' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'AFPoints' => { + PrintConv => { + 'Center' => 'Centro', + 'Left' => 'Sinistra', + 'Right' => 'Destra', + }, + }, + 'AFPointsInFocus' => { + Description => 'Punti a fuoco', + PrintConv => { + 'Bottom' => 'Basso', + 'Center' => 'Centro', + 'Far Left' => 'Tutto a sinistra', + 'Far Right' => 'Tutto a destra', + 'Left' => 'Sinistra', + 'Lower-left' => 'Inferiore sinistro', + 'Lower-right' => 'Inferiore destro', + 'None' => 'Nessuno', + 'Right' => 'Destra', + 'Top' => 'Alto', + 'Upper-left' => 'Superiore sinistro', + 'Upper-right' => 'Superiore destro', + }, + }, + 'AFPointsInFocus1D' => 'Punti a fuoco 1D', + 'AFPointsInFocus5D' => { + Description => 'Punti a fuoco 5D', + PrintConv => { + 'Center' => 'Centro', + 'Left' => 'Sinistra', + 'Right' => 'Destra', + }, + }, + 'AFPointsUnknown1' => { + PrintConv => { + 'Center' => 'Centro', + 'Left' => 'Sinistra', + 'Right' => 'Destra', + }, + }, + 'AFPointsUnknown2' => { + PrintConv => { + 'Center' => 'Centro', + 'Left' => 'Sinistra', + 'Right' => 'Destra', + }, + }, + 'AFPointsUsed' => { + PrintConv => { + 'Bottom' => 'Basso', + 'Center' => 'Centro', + 'Far Left' => 'Tutto a sinistra', + 'Far Right' => 'Tutto a destra', + 'Lower-left' => 'Inferiore sinistro', + 'Lower-right' => 'Inferiore destro', + 'Top' => 'Alto', + 'Upper-left' => 'Superiore sinistro', + 'Upper-right' => 'Superiore destro', + }, + }, + 'AFSearch' => { + PrintConv => { + 'Not Ready' => 'Non pronto', + 'Ready' => 'Pronto', + }, + }, + 'AFWithShutter' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AIServoImagePriority' => { + PrintConv => { + '1: AF, 2: Drive speed' => '1: AF, 2: drive speed', + '1: AF, 2: Tracking' => '1: AF, 2: puntamento', + '1: Release, 2: Drive speed' => '1: rilascio, 2: drive speed', + '1: Release, 2: Tracking' => '1: rilascio, 2: puntamento', + }, + }, + 'AIServoTrackingSensitivity' => { + PrintConv => { + 'Fast' => 'Veloce', + }, + }, + 'APEVersion' => 'Versione APE', + 'ARMIdentifier' => 'ID ARM', + 'ARMVersion' => 'Versione ARM', + 'AToB0' => 'Da A a B0', + 'AToB1' => 'Da A a B1', + 'AToB2' => 'Da A a B2', + 'AberrationCorrectionDistance' => 'Distanza della correzione di aberrazione', + 'About' => 'Informazioni su', + 'AbsPeakAudioFilePath' => 'Percorso file audio del picco assoluto', + 'AbsoluteChannelDisplayScale' => 'Scala assoluta canale', + 'Abstract' => 'Sommario', + 'AbstractPriorCodeSequence' => 'Sequenza codice precedente astratto', + 'AbstractPriorValue' => 'Valore codice precedente astratto', + 'AccessDate' => 'Data di accesso', + 'AccessionNumber' => 'Numero di adesione', + 'AccessoryCode' => 'Codice accessorio', + 'AccessoryType' => 'Tipo accessorio', + 'AccountName' => 'Nome account', + 'AccountingReferenceNumber' => 'Riferimento contabile', + 'AcqreconRecordChecksum' => 'Checksum del record AcqRecon', + 'AcquiredImageAreaDoseProduct' => 'Dose prodotto dell\'area acquisita', + 'AcquisitionComments' => 'Commenti acquisizione', + 'AcquisitionContextDescription' => 'Descrizione contesto acquisizione', + 'AcquisitionContextSequence' => 'Sequenza contesto acquisizione', + 'AcquisitionContrast' => 'Contrasto acquisizione', + 'AcquisitionDate' => 'Data acquisizione', + 'AcquisitionDateTime' => 'Data/ora acquisizione', + 'AcquisitionDeviceProcessingCode' => 'Codice processo di acquisizione del dispositivo', + 'AcquisitionDeviceProcessingDescr' => 'Descrizione processo di acquisizione del dispositivo', + 'AcquisitionDeviceTypeCodeSequence' => 'Sequenza codici tipo di acquisizione del dispositivo', + 'AcquisitionDuration' => 'Durata acquisizione', + 'AcquisitionEndConditionData' => 'Dati condizione fine acquisizione', + 'AcquisitionGroupLength' => 'Lunghezza gruppo di acquisizione', + 'AcquisitionIndex' => 'Indice acquisizione', + 'AcquisitionMatrix' => 'Matrice acquisizione', + 'AcquisitionNumber' => 'Numero acquisizione', + 'AcquisitionProtocolDescription' => 'Descrizione protocollo di acquisizione', + 'AcquisitionProtocolName' => 'Nome protocollo di acquisizione', + 'AcquisitionStartCondition' => 'Condizione iniziale acquisizione', + 'AcquisitionStartConditionData' => 'Dati condizione iniziale acquisizione', + 'AcquisitionTerminationCondition' => 'Condizione finale acquisizione', + 'AcquisitionTime' => 'Ora acquisizione', + 'AcquisitionTimeDay' => 'Ora acquisizione - Giorno', + 'AcquisitionTimeMonth' => 'Ora acquisizione - Mese', + 'AcquisitionTimeSynchronized' => 'Ora acquisizione sincronizzata', + 'AcquisitionTimeYear' => 'Ora acquisizione - Anno', + 'AcquisitionTimeYearMonth' => 'Ora acquisizione - Anno mese', + 'AcquisitionTimeYearMonthDay' => 'Ora acquisizione - Anno mese giorno', + 'AcquisitionType' => 'Tipo acquisizione', + 'AcquisitionsInSeries' => 'Acquisizioni in serie', + 'AcquisitionsInStudy' => 'Acquisizioni in esame', + 'AcrossScanSpatialResolution' => 'Attraverso risoluzione di scansione spaziale', + 'ActionAdvised' => { + Description => 'Azione consigliata', + PrintConv => { + 'Object Append' => 'Allega oggetto', + 'Object Kill' => 'Distruzione oggetto', + 'Object Reference' => 'Riferimento oggetto', + 'Object Replace' => 'Sostituzione oggetto', + }, + }, + 'ActiveArea' => 'Area attiva', + 'ActiveD-Lighting' => { + Description => 'D-Lighting attivo', + PrintConv => { + 'Extra High' => 'Molto alto', + 'High' => 'Alto', + 'Low' => 'Basso', + 'Normal' => 'Normale', + 'Off' => 'Spento', + 'On' => 'Acceso', + }, + }, + 'ActiveD-LightingMode' => { + Description => 'Modalità D-Lighting attiva', + PrintConv => { + 'Extra High' => 'Molto alto', + 'High' => 'Alto', + 'Low' => 'Basso', + 'Normal' => 'Normale', + 'Off' => 'Spento', + 'Unchanged' => 'Immutato', + }, + }, + 'ActiveFormatDescriptor' => 'Descrittore formato attivo', + 'ActiveLinesperFrame' => 'Linee per quadro attuali', + 'ActiveSamplesperLine' => 'Linee per campione attuali', + 'ActiveSourceDiameter' => 'Diametro sorgente attuale', + 'ActiveSourceLength' => 'Lunghezza sorgente attuale', + 'ActiveState' => 'Stato attivo', + 'Actor' => 'Attore', + 'ActualCardiacTriggerDelayTime' => 'Tempo di ritardo corrente trigger cardiaco', + 'ActualCompensation' => 'Compensazione corrente', + 'ActualFrameDuration' => 'Durata frame attuale', + 'ActualHumanPerformersSequence' => 'Sequenza attuale esecutori umani', + 'ActualReceiveGainAnalog' => 'Guadagno analogico in ricezione attuale', + 'ActualReceiveGainDigital' => 'Guadagno digitale in ricezione attuale', + 'ActualRespiratoryTriggerDelayTime' => 'Tempo di ritardo corrente trigger respiratorio', + 'ActualSeriesDataTimeStamp' => 'Marca temporale serie di dati attuali', + 'Ad-ID' => 'ID Ad', + 'AdaptiveMapFormat' => 'Formato mappa adattativa', + 'AddAspectRatioInfo' => { + Description => 'Aggiunta info rapporto di aspetto', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AddIntermediateSequence' => 'Aggiunta sequenza intermedia', + 'AddNearSequence' => 'Aggiunta sequenza vicina', + 'AddOriginalDecisionData' => { + Description => 'Aggiunta dati decisione originale', + PrintConv => { + 'Off' => 'Spento', + 'On' => 'Acceso', + }, + }, + 'AddOtherSequence' => 'Aggiunta altra sequenza', + 'AddPower' => 'Aggiunta potenza', + 'AdditionalDrugSequence' => 'Sequenza farmaci addizionali', + 'AdditionalModelInformation' => 'Ulteriori informazioni modello', + 'AdditionalPatientHistory' => 'Ulteriore storia del paziente', + 'Address' => 'Indirizzo', + 'AddressLine' => 'Linea indirizzo', + 'AddressNameValueSets' => 'Gruppi di valori nome indirizzo', + 'AddressSets' => 'Gruppi di indirizzi', + 'AddressTrial' => 'Studio indirizzo', + 'AdjustmentMode' => 'Modo adattamento', + 'AdministrationRouteCodeSequence' => 'Sequenza codici percorso di amministrazione', + 'AdmissionID' => 'ID ammissione', + 'AdmittingDate' => 'Data ammissione', + 'AdmittingDiagnosesCodeSequence' => 'Sequenza codici diagnosi ammissione', + 'AdmittingDiagnosesDescription' => 'Descrizioni diagnosi ammissione', + 'AdmittingTime' => 'Ora ammissione', + 'AdobeCMType' => 'Tipo Adobe CM', + 'AdoptedNeutral' => 'Adottato neutro', + 'AdultContentWarning' => { + Description => 'Avviso contenuto per adulti', + PrintConv => { + 'Adult Content Warning Required' => 'Avviso contenuto per adulti richiesto', + 'Not Required' => 'Non richiesto', + 'Unknown' => 'Sconosciuto', + }, + }, + 'AdvancedContentEncryption' => 'Crittografia avanzata del contenuto', + 'AdvancedMutualExcl' => 'Mutua esclusione avanzata', + 'AdvancedRaw' => { + Description => 'Raw avanzato', + PrintConv => { + 'Off' => 'Spento', + 'On' => 'Acceso', + }, + }, + 'AdvancedSceneMode' => { + Description => 'Modo scena avanzato', + PrintConv => { + 'Architecture' => 'Architettura', + 'Color Select' => 'Selezione colore', + 'Creative Macro' => 'Macro creativo', + 'Creative Night Scenery' => 'Scenario notturno creativo', + 'Creative Portrait' => 'Ritratto creativo', + 'Creative Scenery' => 'Scenario creativo', + 'Creative Sports' => 'Sport creativi', + 'Cross Process' => 'Cross process', + 'Dynamic Art' => 'Arte dinamica', + 'Dynamic Monochrome' => 'Monocromatico dinamico', + 'Elegant' => 'Elegante', + 'Expressive' => 'Espressivo', + 'Flower' => 'Fiore', + 'HDR Art' => 'HDR artistico', + 'HDR B&W' => 'HDR in bianco e nero', + 'High Dynamic' => 'High dynamic', + 'High Key' => 'High key', + 'Illuminations' => 'Illuminazioni', + 'Indoor Portrait' => 'Ritratto al chiuso', + 'Indoor Sports' => 'Sport al chiuso', + 'Low Key' => 'Low key', + 'Minature' => 'Minuatura', + 'Monochrome' => 'Monocromatico', + 'Nature' => 'Natura', + 'Objects' => 'Oggetti', + 'Off' => 'Spento', + 'Outdoor Portrait' => 'Ritratto all\'aperto', + 'Outdoor Sports' => 'Sport all\'aperto', + 'Pure' => 'Puro', + 'Retro' => 'Retrò', + 'Sepia' => 'Seppia', + 'Soft' => 'Morbido', + 'Star' => 'Stella', + 'Toy Effect' => 'Effetto giocattolo', + }, + }, + 'AdvancedSceneType' => 'Tipo scena avanzato', + 'AdvantageCompOverflow' => 'Overflow componente avanzato', + 'AdvantageCompUnderflow' => 'Underflow componente avanzato', + 'AdventRevision' => 'Revisione arrivo', + 'AdventScale' => 'Scala arrivo', + 'AdvertisingMaterialReference' => 'Riferimento materiale pubblicitario', + 'Advisory' => 'Consultivo', + 'AlbumArtistSortOrder' => 'Ordinamento album-artista', + 'AlbumSortOrder' => 'Ordinamento album', + 'AliasLayerMetadata' => 'Livello metadati alias', + 'AlphaByteCount' => 'Numero byte trasparenza', + 'AlphaDataDiscard' => { + Description => 'Scarto dati trasparenza', + PrintConv => { + 'Flexbits Discarded' => 'Flexbit scartati', + 'Full Resolution' => 'Risoluzione piena', + 'HighPass Frequency Data Discarded' => 'Dati in frequenza passa-alto scartati', + 'Highpass and LowPass Frequency Data Discarded' => 'Dati in frequenza passa-alto e passa-basso scartati', + }, + }, + 'AlphaInterlace' => { + PrintConv => { + 'Noninterlaced' => 'Non interlacciato', + }, + }, + 'AlphaOffset' => 'Scostamento trasparenza', + 'AlphaTransparency' => { + PrintConv => { + 'Not Inverted' => 'Non invertito', + }, + }, + 'AmbienceSelection' => { + PrintConv => { + 'Vivid' => 'Vivace', + }, + }, + 'AnalogBalance' => 'Bilanciamento analogico', + 'Annotation' => 'Annotazione', + 'Annotations' => 'Annotazioni', + 'Anti-Blur' => { + PrintConv => { + 'Off' => 'Spento', + 'n/a' => 'n/d', + }, + }, + 'AntiAliasStrength' => 'Forza antialiasing', + 'Aperture' => 'Diaframma', + 'ApertureDisplayed' => 'Diaframma mostrato', + 'ApertureRange' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'ApertureRingUse' => { + PrintConv => { + 'Prohibited' => 'Proibito', + }, + }, + 'ApertureValue' => 'Apertura diaframma', + 'AppleStoreCountry' => { + PrintConv => { + 'Italy' => 'Italia', + 'Japan' => 'Giappone', + 'Norway' => 'Norvegia', + 'Portugal' => 'Portogallo', + 'Sweden' => 'Svezia', + 'United Kingdom' => 'Regno Unito', + 'United States' => 'Stati Uniti', + }, + }, + 'ApplicationNotes' => 'Note applicazione', + 'ApplicationRecordVersion' => 'Versione Registrazione Applicazione', + 'ApplyShootingMeteringMode' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'ArtFilter' => { + PrintConv => { + 'Fish Eye' => 'Fish-eye', + 'Fragmented' => 'Frammentato', + 'Gentle Sepia' => 'Seppia leggero', + 'Off' => 'Spento', + 'Reflection' => 'Riflessione', + }, + }, + 'ArtFilterEffect' => { + PrintConv => { + 'Fish Eye' => 'Fish-eye', + 'Fragmented' => 'Frammentato', + 'Gentle Sepia' => 'Seppia leggero', + 'Off' => 'Spento', + 'Reflection' => 'Riflessione', + 'Star Light' => 'Luce stelle', + }, + }, + 'ArtMode' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'Artist' => 'Persona che ha creato l\'immagine', + 'Artist2' => 'Artista 2', + 'ArtistURL' => 'URL artista', + 'AsShotICCProfile' => 'Profilo ICC allo scatto', + 'AsShotNeutral' => 'Neutrale allo scatto', + 'AsShotPreProfileMatrix' => 'Matrice pre-profilo allo scatto', + 'AsShotProfileName' => 'Nome profilo allo scatto', + 'AsShotWhiteXY' => 'Bilanciamento del bianco X-T allo scatto', + 'AspectRatio' => 'Rapporto immagine', + 'AspectRatioType' => { + Description => 'Tipo rapporto immagine', + PrintConv => { + 'Fixed' => 'Fisso', + }, + }, + 'AspectRatioX' => 'Rapporto immagine X', + 'AspectRatioY' => 'Rapporto immagine Y', + 'AssistButtonFunction' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'Attachments' => 'Allegati', + 'Audio' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'AudioAttributes' => { + Description => 'Attributi audio', + PrintConv => { + 'Encrypted' => 'Crittografato', + }, + }, + 'AudioBytes' => 'Byte audio', + 'AudioChannelType' => 'Tipo canale audio', + 'AudioChannels' => 'Canali audio', + 'AudioCodec' => 'Codec audio', + 'AudioCodecDescription' => 'Descrizione codec audio', + 'AudioCodecID' => { + Description => 'ID codec audio', + PrintConv => { + 'QDesign Music' => 'Musica QDesign', + 'Unknown -' => 'Sconosciuto -', + }, + }, + 'AudioCodecInfo' => 'Info codec audio', + 'AudioCodecName' => 'Nome codec audio', + 'AudioCompression' => 'Compressione audio', + 'AudioCompressionAlgorithm' => 'Algoritmo di compressione audio', + 'AudioFormat' => 'Formato audio', + 'AudioLayer' => 'Livello audio', + 'AudioStreamType' => { + PrintConv => { + 'Reserved' => 'Riservato', + }, + }, + 'AudioType' => { + Description => 'Tipo Audio', + PrintConv => { + 'Text Only' => 'Solo testo', + }, + }, + 'Author' => 'Autore', + 'AuthorsPosition' => 'Posizione dell\'autore', + 'AutoAperture' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AutoBracketModeM' => { + PrintConv => { + 'Flash Only' => 'Solo flash', + }, + }, + 'AutoBracketSet' => { + PrintConv => { + 'Exposure' => 'Esposizione', + 'Flash Only' => 'Solo flash', + }, + }, + 'AutoBracketing' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AutoDistortionControl' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AutoExposureBracketing' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AutoFP' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AutoFocus' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AutoISO' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AutoLightingOptimizer' => { + PrintConv => { + 'Enable' => 'Abilita', + 'Low' => 'Basso', + 'Off' => 'Spento', + 'Strong' => 'Forte', + 'n/a' => 'n/d', + }, + }, + 'AutoLightingOptimizerOn' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'AutoRedEye' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'AutoRotate' => { + PrintConv => { + 'None' => 'Nessuno', + 'Rotate 180' => 'Ruota di 180°', + 'Rotate 270 CW' => 'Ruota di 270° in senso orario', + 'Rotate 90 CW' => 'Ruota di 90° senso orario', + 'n/a' => 'n/d', + }, + }, + 'AuxiliaryLens' => 'Obiettivo Ausiliario', + 'AvSettingWithoutLens' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'AverageLevel' => 'Livello medio', + 'Azimuth' => { + PrintConv => { + 'NNW' => 'NNO', + }, + }, + 'BWMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'BackgroundColorIndicator' => { + Description => 'Indicatore colore di sfondo', + PrintConv => { + 'Specified Background Color' => 'Colore di sfondo specificato', + 'Unspecified Background Color' => 'Colore di sfondo non specificato', + }, + }, + 'BackgroundColorValue' => 'Valore colore di sfondo', + 'BackgroundTiling' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'BadFaxLines' => 'Linee fax non valide', + 'BannerImageType' => { + PrintConv => { + 'None' => 'Nessuno', + }, + }, + 'BaselineExposure' => 'Esposizione di riferimento', + 'BaselineNoise' => 'Rumore di riferimento', + 'BaselineSharpness' => 'Nitidezza di riferimento', + 'BatteryLevel' => 'Livello batteria', + 'BatteryState' => { + PrintConv => { + 'Low' => 'Basso', + }, + }, + 'BeatsPerMinute' => 'Battiti al minuto', + 'Beep' => { + PrintConv => { + 'Low' => 'Basso', + 'Off' => 'Spento', + }, + }, + 'BeepPitch' => { + PrintConv => { + 'Low' => 'Basso', + 'Off' => 'Spento', + }, + }, + 'BeepVolume' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'BestQualityScale' => 'Scala qualità migliore', + 'BestShotMode' => { + PrintConv => { + 'Children' => 'Bambini', + 'Fireworks' => 'Fuochi artificiali', + 'Flower' => 'Fiore', + 'For YouTube' => 'Per YouTube', + 'For eBay' => 'Per eBay', + 'Off' => 'Spento', + 'Retro' => 'Retrò', + 'Scenery' => 'Paesaggio', + 'Short Movie' => 'Filmato breve', + 'Text' => 'Testo', + }, + }, + 'BitsPerComponent' => 'Bits per componente', + 'BitsPerExtendedRunLength' => 'Bit per rrun-length esteso', + 'BitsPerRunLength' => 'Bit per rrun-length', + 'BitsPerSample' => 'Numero di bit per componente', + 'BlackLevel' => 'Livello del nero', + 'BlackLevelDeltaH' => 'Livello del nero - Delta H', + 'BlackLevelDeltaV' => 'Livello del nero - Delta V', + 'BlackLevelRepeatDim' => 'Dim ripeti livello del nero', + 'BleachBypassToning' => { + PrintConv => { + 'Green' => 'Verde', + 'Off' => 'Spento', + 'Purple' => 'Porpora', + 'Red' => 'Rosso', + }, + }, + 'BlocksPerFrame' => 'Blocchi per frame', + 'BlueBalance' => 'Bilanciamento del blu', + 'BlueMatrixColumn' => 'Colonna della Matrice Blu', + 'BlueTRC' => 'Curva riproduzione tono blu', + 'BlurControl' => { + PrintConv => { + 'Low' => 'Basso', + 'Off' => 'Spento', + }, + }, + 'BlurWarning' => { + PrintConv => { + 'None' => 'Nessuno', + }, + }, + 'BracketMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'BracketShotNumber' => { + PrintConv => { + '1 of 2' => '1 di 5', + '1 of 3' => '1 di 3', + '1 of 5' => '1 di 2', + 'n/a' => 'n/d', + }, + }, + 'Brightness' => 'Luminosità', + 'BrightnessValue' => 'Valore di luminosità', + 'BuildDate' => 'Data compilazione', + 'BuildVersion' => 'Versione compilazione', + 'BurstMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ButtonFunctionControlOff' => { + PrintConv => { + 'Normal (enable)' => 'Normale (abilitato)', + }, + }, + 'By-line' => 'Creatore', + 'By-lineTitle' => 'Titolo Creatore', + 'CCDScanMode' => { + PrintConv => { + 'Progressive' => 'Progressivo', + }, + }, + 'CFALayout' => { + Description => 'Layout CFA', + PrintConv => { + 'Even columns offset down 1/2 row' => 'Colonne pari giù di 1/2 riga', + 'Even columns offset up 1/2 row' => 'Colonne pari su di 1/2 riga', + 'Even rows offset down by 1/2 row, even columns offset left by 1/2 column' => 'Righe pari giù di 1/2 riga, colonne pari a sinistra di 1/2 colonna', + 'Even rows offset down by 1/2 row, even columns offset right by 1/2 column' => 'Righe pari giù di 1/2 riga, colonne pari a destra di 1/2 colonna', + 'Even rows offset left 1/2 column' => 'Righe pari a sinistra di 1/2 colonna', + 'Even rows offset right 1/2 column' => 'Righe pari a destra di 1/2 colonna', + 'Even rows offset up by 1/2 row, even columns offset left by 1/2 column' => 'Righe pari su 1/2 riga, colonne pari a sinistra di 1/2 colonna', + 'Even rows offset up by 1/2 row, even columns offset right by 1/2 column' => 'Righe pari su 1/2 riga, colonne pari a destra di 1/2 colonna', + 'Rectangular' => 'Rettangolare', + }, + }, + 'CFAPattern' => 'Pattern CFA', + 'CFAPattern2' => 'Pattern CFA 2', + 'CFAPlaneColor' => 'Piano colori CFA', + 'CFARepeatPatternDim' => 'Dim pattern ripetuto CFA', + 'CHMVersion' => 'Versione CHM', + 'CIP3DataFile' => 'File di dati CIP3', + 'CIP3Sheet' => 'Foglio CIP3', + 'CIP3Side' => 'Lato CIP3', + 'CMYKEquivalent' => 'CMYK equivalente', + 'CPUArchitecture' => 'Architettura CPU', + 'CPUByteOrder' => { + Description => 'Ordine byte CPU', + PrintConv => { + 'Big endian' => 'Big-endian', + 'Little endian' => 'Little-endian', + }, + }, + 'CPUCount' => 'Numero processori', + 'CPUSubtype' => { + Description => 'Sottotipo CPU', + PrintConv => { + 'ARM (all)' => 'ARM (tutti)', + 'HPPA (all)' => 'HPPA (tutti)', + 'MC680x0 (all)' => 'MC680x0 (tutti)', + 'MC88000 (all)' => 'MC88000 (tutti)', + 'MC98000 (all)' => 'MC98000 (tutti)', + 'MIPS (all)' => 'MIPS (tutti)', + 'NS32032 (all)' => 'NS32032 (tutti)', + 'NS32032 DPC (032 CPU)' => 'NS32032 DPC (CPU 032)', + 'NS32332 (all)' => 'NS32332 (tutti)', + 'NS32332 DPC (032 CPU)' => 'NS32332 DPC (CPU 032)', + 'PowerPC (all)' => 'PowerPC (tutti)', + 'RS6000 (all)' => 'RS6000 (tutti)', + 'RT (all)' => 'RT (tutti)', + 'SPARC (all)' => 'SPARC (tutti)', + 'VAX (all)' => 'VAX (tutti)', + 'i386 (all)' => 'i386 (tutti)', + 'i860 (all)' => 'i860 (tutti)', + 'i860 little (all)' => 'i860 little (tutti)', + }, + }, + 'CPUType' => { + Description => 'Tipo CPU', + PrintConv => { + 'Any' => 'Qualsiasi', + 'Axis Communications 32-bit embedded processor' => 'Processore integrato a 32 bit Axis Communications', + 'None' => 'Nessuno', + 'S/390 (old)' => 'S/390 (precedente)', + 'i860 big endian' => 'i860 big-endian', + 'i860 little endian' => 'i860 little-endian', + 'm32r (old)' => 'm32r (precedente)', + 'v850 (old)' => 'v850 (precedente)', + }, + }, + 'CalibrationDateTime' => 'Data/ora di calibrazione', + 'CalibrationIlluminant1' => { + Description => 'Calibration illuminazione 1', + PrintConv => { + 'Cloudy' => 'Nuvoloso', + 'Cool White Fluorescent' => 'Fluorescente a luce calda', + 'Day White Fluorescent' => 'Fluorescente a luce del giorno bianca', + 'Daylight' => 'Luce del giorno', + 'Daylight Fluorescent' => 'Fluorescente a luce del giorno', + 'Fine Weather' => 'Bel tempo', + 'Fluorescent' => 'Fluorescente', + 'ISO Studio Tungsten' => 'Tungsteno studio ISO', + 'Other' => 'Altra Sorgente di Luce', + 'Shade' => 'Ombrato', + 'Standard Light A' => 'Luce standard A', + 'Standard Light B' => 'Luce standard B', + 'Standard Light C' => 'Luce standard C', + 'Tungsten (Incandescent)' => 'Tungsteno (luce incandescente)', + 'Unknown' => 'Sconosciuto', + 'Warm White Fluorescent' => 'Luce fluorescente bianca calda', + 'White Fluorescent' => 'Fluorescente bianca', + }, + }, + 'CalibrationIlluminant2' => { + Description => 'Calibration illuminazione 2', + PrintConv => { + 'Cloudy' => 'Nuvoloso', + 'Cool White Fluorescent' => 'Fluorescente a luce calda', + 'Day White Fluorescent' => 'Fluorescente a luce del giorno bianca', + 'Daylight' => 'Luce del giorno', + 'Daylight Fluorescent' => 'Fluorescente a luce del giorno', + 'Fine Weather' => 'Bel tempo', + 'Fluorescent' => 'Fluorescente', + 'ISO Studio Tungsten' => 'Tungsteno studio ISO', + 'Other' => 'Altra Sorgente di Luce', + 'Shade' => 'Ombrato', + 'Standard Light A' => 'Luce standard A', + 'Standard Light B' => 'Luce standard B', + 'Standard Light C' => 'Luce standard C', + 'Tungsten (Incandescent)' => 'Tungsteno (luce incandescente)', + 'Unknown' => 'Sconosciuto', + 'Warm White Fluorescent' => 'Luce fluorescente bianca calda', + 'White Fluorescent' => 'Fluorescente bianca', + }, + }, + 'CameraAngle' => 'Angolo fotocamera', + 'CameraBody' => 'Corpo fotocamera', + 'CameraByteOrder' => 'Ordine byte fotocamera', + 'CameraCalibration1' => 'Calibrazione fotocamera 1', + 'CameraCalibration2' => 'Calibrazione fotocamera 2', + 'CameraCalibrationSig' => 'Segnale calibrazione fotocamera', + 'CameraColorCalibration01' => 'Calibrazione colore fotocamera 01', + 'CameraColorCalibration02' => 'Calibrazione colore fotocamera 02', + 'CameraColorCalibration03' => 'Calibrazione colore fotocamera 03', + 'CameraColorCalibration04' => 'Calibrazione colore fotocamera 04', + 'CameraColorCalibration05' => 'Calibrazione colore fotocamera 05', + 'CameraColorCalibration06' => 'Calibrazione colore fotocamera 06', + 'CameraColorCalibration07' => 'Calibrazione colore fotocamera 07', + 'CameraColorCalibration08' => 'Calibrazione colore fotocamera 08', + 'CameraColorCalibration09' => 'Calibrazione colore fotocamera 09', + 'CameraColorCalibration10' => 'Calibrazione colore fotocamera 10', + 'CameraColorCalibration11' => 'Calibrazione colore fotocamera 11', + 'CameraColorCalibration12' => 'Calibrazione colore fotocamera 12', + 'CameraColorCalibration13' => 'Calibrazione colore fotocamera 13', + 'CameraColorCalibration14' => 'Calibrazione colore fotocamera 14', + 'CameraColorCalibration15' => 'Calibrazione colore fotocamera 15', + 'CameraDateTime' => 'Data/ora fotocamera', + 'CameraDirection' => 'Direzione fotocamera', + 'CameraID' => 'ID fotocamera', + 'CameraISO' => 'ISO fotocamera', + 'CameraIdentifier' => 'Identificativo fotocamera', + 'CameraLabel' => 'Etichetta fotocamera', + 'CameraMaker' => 'Marca fotocamera', + 'CameraManufacturer' => 'Produttore fotocamera', + 'CameraModel' => 'Modello fotocamera', + 'CameraMotion' => 'Camera motion', + 'CameraMove' => 'Sposta fotocamera', + 'CameraName' => 'Nome fotocamera', + 'CameraObjBackType' => 'Nome oggetto nero fotocamera', + 'CameraObjName' => 'Nome oggetto fotocamera', + 'CameraObjType' => 'Tipo oggetto fotocamera', + 'CameraObjVersion' => 'Versione oggetto fotocamera', + 'CameraOrientation' => { + Description => 'Orientazione fotocamera', + PrintConv => { + 'Horizontal (normal)' => 'Orizzontale (normale)', + 'Rotate 180' => 'Ruota di 180°', + 'Rotate 270 CW' => 'Ruota di 270° in senso orario', + 'Rotate 90 CW' => 'Ruota di 90° senso orario', + }, + }, + 'CameraOwner' => 'Proprietario fotocamera', + 'CameraParameters' => 'Parametri fotocamera', + 'CameraProfile' => 'Profilo fotocamera', + 'CameraProfileDigest' => 'Sommario profilo fotocamera', + 'CameraProfileVersion' => 'Versione profilo fotocamera', + 'CameraSerialNumber' => 'Numero di serie fotocamera', + 'CameraSettingsVersion' => 'Versione impostazioni fotocamera', + 'CameraTemperature' => 'Temperatura fotocamera', + 'CameraTemperature2' => 'Temperatura fotocamera 2', + 'CameraTemperature3' => 'Temperatura fotocamera 3', + 'CameraTemperature4' => 'Temperatura fotocamera 4', + 'CameraTemperature5' => 'Temperatura fotocamera 5', + 'CameraType' => { + Description => 'Tipo fotocamera', + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'CameraType2' => 'Tipo fotocamera 2', + 'CanonExposureMode' => { + PrintConv => { + 'Aperture-priority AE' => 'Priorità diaframma', + 'Manual' => 'Manuale', + 'Program AE' => 'Programma AE', + 'Shutter speed priority AE' => 'Priorità otturatore AE', + }, + }, + 'CanonFlashMode' => { + PrintConv => { + 'External flash' => 'Flash esterno', + 'Off' => 'Spento', + 'Red-eye reduction' => 'Riduzione occhi rossi', + 'Red-eye reduction (Auto)' => 'Riduzione occhi rossi (auto)', + 'Red-eye reduction (On)' => 'Riduzione occhi rossi (attivo)', + }, + }, + 'CanonImageSize' => { + PrintConv => { + 'Postcard' => 'Cartolina', + }, + }, + 'Caption-Abstract' => 'Didascalia/descrizione', + 'CaptionWriter' => 'Autore della didascalia', + 'CardShutterLock' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'CasioQuality' => { + Description => 'Qualità Casio', + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'Categories' => { + Description => 'Categorie', + PrintConv => { + 'Events' => 'Eventi', + 'Scenery' => 'Paesaggio', + 'To Do' => 'Da fare', + }, + }, + 'Category' => 'Categoria', + 'CellLength' => 'Lunghezza cella', + 'CellWidth' => 'Larghezza cella', + 'CenterWeightedAreaSize' => { + PrintConv => { + 'Average' => 'Media', + }, + }, + 'ChExtra' => 'Larghezza aggiunta per caratteri non spaziatori', + 'Channel' => 'Canale', + 'ChannelID' => 'ID canale', + 'ChannelIdentificationCode' => 'Codice identificativo canale', + 'ChannelLabel' => 'Etichetta canale', + 'ChannelLength' => 'Lunghezza canale', + 'ChannelMode' => 'Modo canale', + 'ChannelNumber' => 'Numero canale', + 'ChannelPositions' => 'Posizioni canale', + 'ChannelStatus' => 'Stato canale', + 'ChannelStatusMode' => 'Modo stato canale', + 'ChannelTotalTime' => 'Tempo totale canale', + 'ChannelWidth' => 'Larghezza canale', + 'Channels' => 'Canali', + 'Chapter' => 'Capitolo', + 'ChapterPhysicalEquivalent' => { + PrintConv => { + 'Session' => 'Sessione', + 'Side' => 'Lato', + }, + }, + 'ChapterProcessTime' => { + PrintConv => { + 'For Duration of Chapter' => 'Per la durata del capitolo', + }, + }, + 'CharacterSet' => { + Description => 'Set di caratteri', + PrintConv => { + 'Windows, Arabic' => 'Windows, Arabo', + 'Windows, Chinese (Simplified)' => 'Windows, Cinese semplificato', + 'Windows, Cyrillic' => 'Windows, Cirillico', + 'Windows, Greek' => 'Windows, Greco', + 'Windows, Hebrew' => 'Windows, Ebraico', + 'Windows, Japan (Shift - JIS X-0208)' => 'Windows, Giappone (Shift - JIS X-0208)', + 'Windows, Korea (Shift - KSC 5601)' => 'Windows, Corea (Shift - KSC 5601)', + 'Windows, Latin2 (Eastern European)' => 'Windows, Latin2 (Europa orientale)', + 'Windows, Turkish' => 'Windows, Turco', + }, + }, + 'Characters' => 'Caratteri', + 'CharactersWithSpaces' => 'Caratteri con spazi', + 'Children' => 'Bambini', + 'ChromaBlurRadius' => 'Raggio sfocatura cromatica', + 'ChromaticAberrationCorrection' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ChromaticAdaptation' => 'Adattamento cromatico', + 'Chromaticity' => 'Cromatismo', + 'ChrominanceNR_TIFF_JPEG' => { + PrintConv => { + 'Low' => 'Basso', + 'Off' => 'Spento', + }, + }, + 'ChrominanceNoiseReduction' => { + PrintConv => { + 'Low' => 'Basso', + 'Off' => 'Spento', + }, + }, + 'City' => 'Città', + 'ClassifyState' => 'Stato di Classificazione', + 'CleanFaxData' => { + Description => 'Dati fax precisi', + PrintConv => { + 'Clean' => 'Pulito', + 'Regenerated' => 'Rigenerato', + 'Unclean' => 'Sporco', + }, + }, + 'ClipPath' => 'Percoso clip', + 'CodePage' => { + PrintConv => { + 'Japanese (JIS 0208-1990 and 0121-1990)' => 'Giapponese (JIS 0208-1990 e 0121-1990)', + 'Russian/Cyrillic (KOI8-R)' => 'Russo/Cirillico (KOI8-R)', + }, + }, + 'CodeSize' => 'Dimensione codice', + 'CodedCharacterSet' => 'Impostazione Caratteri Codificati', + 'CodedContentScanningKind' => { + PrintConv => { + 'Mixed' => 'Misto', + 'Progressive' => 'Progressivo', + 'Unknown' => 'Sconosciuto', + }, + }, + 'CodingMethods' => { + Description => 'Metodi di codifica', + PrintConv => { + 'Baseline JPEG' => 'Linea di base JPEG', + 'JBIG color' => 'JBIG a colori', + 'Modified Huffman' => 'Huffman modificato', + 'Unspecified compression' => 'Compressione non specificata', + }, + }, + 'ColorAberrationControl' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ColorAdjustmentMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ColorBalance' => 'Bilanciamento Colore', + 'ColorBalanceAdj' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ColorBalanceVersion' => 'Versione Bilanciamento Colore', + 'ColorBooster' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ColorCharacterization' => 'Caratterizzazione colore', + 'ColorClass' => { + PrintConv => { + '0 (None)' => '0 (Nessuno)', + '1 (Winner)' => '1 (Vincitore)', + }, + }, + 'ColorEffect' => { + PrintConv => { + 'Off' => 'Spento', + 'Sepia' => 'Seppia', + }, + }, + 'ColorFilter' => { + Description => 'Filtro colori', + PrintConv => { + 'Green' => 'Verde', + 'Off' => 'Spento', + 'Purple' => 'Porpora', + 'Red' => 'Rosso', + 'Sepia' => 'Seppia', + 'Yellow' => 'Giallo', + }, + }, + 'ColorHue' => 'Colore Hue', + 'ColorMap' => 'Mappa colore', + 'ColorMatrix1' => 'Matrice colore 1', + 'ColorMatrix2' => 'Matrice colore 2', + 'ColorMode' => { + Description => 'Modo colore', + PrintConv => { + 'Autumn Leaves' => 'Foglie d\'autunno', + 'B&W' => 'B/N', + 'Clear' => 'Trasparente', + 'Deep' => 'Cupa', + 'Evening' => 'Sera', + 'Grayscale' => 'Scala di grigi', + 'Landscape' => 'Orizzontale', + 'Light' => 'Chiara', + 'Neutral' => 'Neutra', + 'Night View' => 'Visione notturna', + 'Night View/Portrait' => 'Rit. notturno', + 'Normal' => 'Normale', + 'Off' => 'Spento', + 'Portrait' => 'Verticale', + 'RGB Color' => 'Colore RGB', + 'Saturated Color' => 'Colore saturato', + 'Sepia' => 'Seppia', + 'Sunset' => 'Tramonto', + 'Vivid' => 'Vivace', + 'Vivid color' => 'Colore vivace', + 'n/a' => 'n/d', + }, + }, + 'ColorMoireReduction' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ColorMoireReductionMode' => { + PrintConv => { + 'Low' => 'Basso', + 'Off' => 'Spento', + }, + }, + 'ColorPalette' => 'Palette di Colore', + 'ColorProfile' => { + PrintConv => { + 'Not Embedded' => 'Non incorporato', + }, + }, + 'ColorRepresentation' => { + Description => 'Rappresentazione del Colore', + PrintConv => { + 'No Image, Single Frame' => 'Nessuna immagine, quadro singolo', + }, + }, + 'ColorResponseUnit' => 'Unità risposta colore', + 'ColorSequence' => 'Sequenza colori', + 'ColorSpace' => { + Description => 'Spazio colore', + PrintConv => { + 'Gray-scale' => 'Scala di grigi', + 'Grayscale' => 'Scala di grigi', + 'ICC Profile' => 'Profilo ICC', + 'Uncalibrated' => 'Non calibrato', + }, + }, + 'ColorSpaceData' => 'Dati Spazio Colore', + 'ColorSpecApproximation' => { + PrintConv => { + 'Not Specified' => 'Non specificato', + }, + }, + 'ColorSpecMethod' => { + PrintConv => { + 'Enumerated' => 'Enumerato', + }, + }, + 'ColorTable' => 'Tabella colore', + 'ColorTemperature' => 'Temperatura colore', + 'ColorTemperatureSetting' => { + PrintConv => { + 'Temperature' => 'Temperatura', + }, + }, + 'ColorTone' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'ColorToneFaithful' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ColorToneLandscape' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ColorToneMonochrome' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ColorToneNeutral' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ColorTonePortrait' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ColorToneStandard' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ColorToneUnknown' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ColorToneUserDef1' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ColorToneUserDef2' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ColorToneUserDef3' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ColorType' => { + PrintConv => { + 'Grayscale' => 'Scala di grigi', + 'RGB with Alpha' => 'RGB con trasparenza', + }, + }, + 'ColorimetricReference' => 'Riferimento colorimetrico', + 'CommandDialsChangeMainSub' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'CommandDialsMenuAndPlayback' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'CommandDialsReverseRotation' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'CommanderGroupAMode' => { + PrintConv => { + 'Auto Aperture' => 'Diaframma automatico', + 'Manual' => 'Manuale', + 'Off' => 'Spento', + }, + }, + 'CommanderGroupBMode' => { + PrintConv => { + 'Auto Aperture' => 'Diaframma automatico', + 'Manual' => 'Manuale', + 'Off' => 'Spento', + }, + }, + 'CommanderInternalFlash' => { + PrintConv => { + 'Manual' => 'Manuale', + 'Off' => 'Spento', + }, + }, + 'Comment' => 'Commento', + 'CommentTime' => 'Ora commento', + 'Comments' => 'Commenti', + 'CommercialURL' => 'URL pubblicitario', + 'CompanyName' => 'Nome azienda', + 'Compilation' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'ComponentsConfiguration' => 'Configurazione componenti', + 'Composer' => 'Compositore', + 'ComposerSortOrder' => 'Ordinamento compositore', + 'CompositionAdjust' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'CompositionMode' => { + PrintConv => { + 'Replace' => 'Sostituisci', + }, + }, + 'Compressed' => { + PrintConv => { + 'False' => 'Falso', + }, + }, + 'CompressedBitsPerPixel' => 'Bit per pixel compressi', + 'Compression' => { + Description => 'Compressione', + PrintConv => { + 'Adobe Deflate' => 'Deflate Adobe', + 'JBIG B&W' => 'JBIG B&N', + 'JBIG Color' => 'JBIG a colori', + 'JPEG' => 'Compressione JPEG', + 'JPEG (old-style)' => 'JPEG (vecchio stile)', + 'Kodak DCR Compressed' => 'Kodak DCR compresso', + 'Kodak KDC Compressed' => 'Kodak KDC compresso', + 'Microsoft Document Imaging (MDI) Binary Level Codec' => 'Microsoft Document Imaging (MDI) - Codec a livello binario', + 'Microsoft Document Imaging (MDI) Progressive Transform Codec' => 'Microsoft Document Imaging (MDI) - Codec a trasformazione progressiva', + 'Microsoft Document Imaging (MDI) Vector' => 'Microsoft Document Imaging (MDI) - Vettore', + 'Next' => 'Codifica NeXT', + 'Nikon NEF Compressed' => 'Nikon NEF compresso', + 'None' => 'Nessuno', + 'Packed RAW' => 'RAW pacchettizzato', + 'Pentax PEF Compressed' => 'Pentax PEF compresso', + 'RLE Encoding' => 'Codifica RLE', + 'Samsung SRW Compressed' => 'Samsung SRW compresso', + 'Sony ARW Compressed' => 'Sony ARW compresso', + 'T4/Group 3 Fax' => 'Fax T4/Group 3', + 'T6/Group 4 Fax' => 'Fax T6/Group 4', + 'Uncompressed' => 'Non compresso', + }, + }, + 'CompressionLevel' => 'Livello di compressione', + 'CompressionType' => { + Description => 'Tipo compressione', + PrintConv => { + 'Little-endian, no compression' => 'Little-endian, senza compressione', + 'None' => 'Nessuno', + }, + }, + 'CompressorName' => 'Nome compressione', + 'ConditionalFEC' => 'Compensazione Esposizione Flash', + 'Conductor' => 'Direttore d\'orchestra', + 'ConsecutiveBadFaxLines' => 'Linee fax non valide consecutive', + 'Contact' => 'Contatto', + 'ContentEncodingType' => { + PrintConv => { + 'Encryption' => 'Crittografia', + }, + }, + 'ContentEncryptionAlgorithm' => { + PrintConv => { + 'Not Encrypted' => 'Non crittografato', + }, + }, + 'ContentLocationCode' => 'Codice ubicazione contenuto', + 'ContentLocationName' => 'Nome Ubicazione Contenuto', + 'ContentSignatureAlgorithm' => { + PrintConv => { + 'Not Signed' => 'Senza segno', + }, + }, + 'ContentSignatureHashAlgorithm' => { + PrintConv => { + 'Not Signed' => 'Senza segno', + }, + }, + 'ContinuousBracketing' => { + PrintConv => { + 'Low' => 'Basso', + }, + }, + 'ContinuousShootingSpeed' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'ContinuousShotLimit' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'Contrast' => { + Description => 'Contrasto', + PrintConv => { + 'High' => 'Alto', + 'Low' => 'Basso', + 'Normal' => 'Normale', + }, + }, + 'ContrastCurve' => 'Curva di contrasto', + 'ContrastDetectAF' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ContrastFaithful' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ContrastHighlightShadowAdj' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ContrastLandscape' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ContrastMode' => { + PrintConv => { + 'Elegant (My Color)' => 'Elegante (mio colore)', + 'Expressive' => 'Espressivo', + 'Low' => 'Basso', + 'Normal' => 'Normale', + 'Nostalgic (Color Film)' => 'Nostalgico (pellicola a colori)', + 'Retro' => 'Retrò', + 'Retro (My Color)' => 'Retro (colore personalizzato)', + }, + }, + 'ContrastMonochrome' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ContrastNeutral' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ContrastPortrait' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ContrastStandard' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ContrastUnknown' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ContrastUserDef1' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ContrastUserDef2' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ContrastUserDef3' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ControlDialSet' => { + PrintConv => { + 'Shutter Speed' => 'Tempo esposizione', + }, + }, + 'ControlMode' => { + PrintConv => { + 'Camera Local Control' => 'Controllo locale fotocamera', + 'n/a' => 'n/d', + }, + }, + 'ConversionLens' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Converter' => 'Convertitore', + 'Copyright' => 'Titolare del copyright', + 'CopyrightFlag' => { + PrintConv => { + 'False' => 'Falso', + }, + }, + 'CopyrightNotice' => 'Info Copyright', + 'CopyrightStatus' => { + PrintConv => { + 'Not specified' => 'Non specificato', + 'Protected' => 'Protetto', + 'Public Domain' => 'Pubblico dominio', + 'Unknown' => 'Sconosciuto', + }, + }, + 'CopyrightURL' => 'URL copyright', + 'Country' => 'Paese', + 'Country-PrimaryLocationCode' => 'Codice ISO Nazione', + 'Country-PrimaryLocationName' => 'Nazione', + 'CreateDate' => 'Data di creazione', + 'CreationDate' => 'Data di creazione', + 'CreativeStyle' => { + PrintConv => { + 'Autumn Leaves' => 'Foglie d\'autunno', + 'B&W' => 'B/N', + 'Clear' => 'Trasparente', + 'Deep' => 'Cupa', + 'Landscape' => 'Orizzontale', + 'Light' => 'Chiara', + 'Neutral' => 'Neutra', + 'Night View/Portrait' => 'Rit. notturno', + 'Portrait' => 'Verticale', + 'Sepia' => 'Seppia', + 'Sunset' => 'Tramonto', + 'Vivid' => 'Vivace', + }, + }, + 'CreativeStyleSetting' => { + PrintConv => { + 'Landscape' => 'Orizzontale', + 'Sunset' => 'Tramonto', + 'Vivid' => 'Vivace', + }, + }, + 'Creator' => 'Creatore', + 'CreatorAddress' => 'Autore - Indirizzo', + 'CreatorAppID' => { + PrintConv => { + 'Unknown' => 'Sconosciuto', + }, + }, + 'CreatorCity' => 'Autore - Città', + 'CreatorCountry' => 'Autore - Nazione', + 'CreatorPostalCode' => 'Autore - Codice Postale', + 'CreatorRegion' => 'Autore - Stato/Provincia', + 'CreatorWorkEmail' => 'Autore - E.Mail', + 'CreatorWorkTelephone' => 'Autore - Numero di Telefono', + 'CreatorWorkURL' => 'Autore - Sito web', + 'Credit' => 'Fornitore', + 'CreditLineRequired' => { + PrintConv => { + 'Not Required' => 'Non richiesto', + }, + }, + 'CropActive' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'CropUnit' => { + PrintConv => { + 'inches' => 'Pollici', + }, + }, + 'CropUnits' => { + PrintConv => { + 'inches' => 'Pollici', + }, + }, + 'CrossProcess' => { + PrintConv => { + 'Favorite 1' => 'Preferito 1', + 'Favorite 2' => 'Preferito 2', + 'Favorite 3' => 'Preferito 3', + 'Off' => 'Spento', + 'Random' => 'Casuale', + }, + }, + 'CurrentICCProfile' => 'Profilo ICC attuale', + 'CurrentPreProfileMatrix' => 'Matrice di pre-profilo attuale', + 'Curves' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'CustomRendered' => { + Description => 'Resa personalizzata', + PrintConv => { + 'Custom' => 'Personalizzata', + 'Normal' => 'Normale', + }, + }, + 'CustomWBError' => { + PrintConv => { + 'Error' => 'Errore', + }, + }, + 'D-LightingHQ' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'D-LightingHQSelected' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'D-LightingHS' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'D-RangeOptimizerMode' => { + PrintConv => { + 'Manual' => 'Manuale', + 'Off' => 'Spento', + }, + }, + 'DECPosition' => { + PrintConv => { + 'Exposure' => 'Esposizione', + 'Saturation' => 'Saturazione', + }, + }, + 'DNGBackwardVersion' => 'Versione precedente DNG', + 'DNGLensInfo' => 'Informazioni lenti DNG', + 'DNGPrivateData' => 'Dati privati DNG', + 'DNGVersion' => 'Versione DNG', + 'DataImprint' => { + PrintConv => { + 'None' => 'Nessuno', + 'Text' => 'Testo', + }, + }, + 'DataType' => 'Tipo di dati', + 'Date' => 'Data', + 'DateCreated' => 'Data di creazione', + 'DateDisplayFormat' => { + Description => 'Formato Data', + PrintConv => { + 'D/M/Y' => 'Giorno/mese/anno', + 'M/D/Y' => 'Mese/giorno/anno', + 'Y/M/D' => 'Anno/mese/giorno', + }, + }, + 'DateImprint' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'DateSent' => 'Data d\'invio', + 'DateStampMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'DateTime' => 'Data/ora', + 'DateTimeOriginal' => 'Data/ora originale di creazione', + 'DaylightSavings' => { + PrintConv => { + 'Off' => 'Spento', + 'Yes' => 'Sì', + }, + }, + 'Decode' => 'Decodifica', + 'DefaultCropOrigin' => 'Ritaglio origine predefinito', + 'DefaultCropSize' => 'Ritaglio dimensione predefinito', + 'DefaultImageColor' => 'Colore immagine predefinito', + 'DefaultScale' => 'Scala predefinita', + 'DeletedImageCount' => 'Conteggio Immagini Cancellate', + 'DeltaType' => { + PrintConv => { + 'Absolute' => 'Assoluto', + }, + }, + 'Description' => 'Descrizione', + 'Destination' => 'Destinazione', + 'DestinationCity' => { + PrintConv => { + 'Jerusalem' => 'Gerusalemme', + 'Lisbon' => 'Lisbona', + 'London' => 'Londra', + 'Milan' => 'Milano', + 'Prague' => 'Praga', + 'Rome' => 'Roma', + 'Stockholm' => 'Stoccolma', + 'Tehran' => 'Teheran', + }, + }, + 'DestinationDST' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'DeviceAttributes' => 'Attributi Dispositivo', + 'DeviceManufacturer' => 'Costruttore dispositivo', + 'DeviceMfgDesc' => 'Descrizione del Costruttore Dispositivo', + 'DeviceModel' => 'Modello Dispositivo', + 'DeviceModelDesc' => 'Descrizione Modello Dispositivo', + 'DeviceSettingDescription' => 'Descrizione impostazioni dispositivo', + 'DialDirectionTvAv' => { + PrintConv => { + 'Normal' => 'Normale', + 'Reversed' => 'Invertito', + }, + }, + 'DigitalCreationDate' => 'Data di creazione digitale', + 'DigitalCreationTime' => 'Ora di Creazione Digitale', + 'DigitalFilter01' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter02' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter03' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter04' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter05' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter06' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter07' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter08' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter09' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter10' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter11' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter12' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter13' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter14' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter15' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter16' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter17' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter18' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter19' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalFilter20' => { + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Retro' => 'Retrò', + 'Shading' => 'Ombreggiatura', + 'Starburst' => 'Esplosione stellare', + }, + }, + 'DigitalZoom' => { + Description => 'Zoom Digitale', + PrintConv => { + 'None' => 'Nessuno', + 'Off' => 'Spento', + }, + }, + 'DigitalZoomOn' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'DigitalZoomRatio' => 'Rapporto zoom digitale', + 'Directory' => 'Posizione file', + 'DisplayAllAFPoints' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'DisplaySize' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'DisplayUnits' => { + PrintConv => { + 'inches' => 'Pollici', + }, + }, + 'DisplayedUnitsX' => { + PrintConv => { + 'inches' => 'Pollici', + }, + }, + 'DisplayedUnitsY' => { + PrintConv => { + 'inches' => 'Pollici', + }, + }, + 'DistortionControl' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'DistortionCorrection' => { + PrintConv => { + 'Off' => 'Spento', + 'n/a' => 'n/d', + }, + }, + 'DistortionCorrection2' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'DjVuVersion' => 'Versione DjVu', + 'DocSecurity' => { + PrintConv => { + 'None' => 'Nessuno', + }, + }, + 'DocumentHistory' => 'Cronologia documento', + 'DocumentName' => 'Nome documento', + 'DocumentNotes' => 'Note del Documento', + 'DotRange' => 'Intervallo puntuale', + 'DriveMode' => { + Description => 'Modalità esecuzione', + PrintConv => { + '10 s Timer' => 'Timer 10 s', + 'Off' => 'Spento', + 'Self-Timer 2 sec' => 'Autoscatto 2 sec', + 'Self-timer' => 'Autoscatto', + 'Self-timer (12 s)' => 'Autoscatto (12 s)', + 'Self-timer (2 s)' => 'Autoscatto (2 s)', + 'Self-timer 10 sec' => 'Autoscatto 10 sec', + 'Self-timer Operation' => 'Operazione autoscatto', + 'n/a' => 'n/d', + }, + }, + 'DriveMode2' => { + PrintConv => { + 'Self-timer (12 s)' => 'Autoscatto (12 s)', + 'Self-timer (2 s)' => 'Autoscatto (2 s)', + 'Self-timer 10 sec' => 'Autoscatto 10 sec', + 'Self-timer 2 sec' => 'Autoscatto 2 sec', + }, + }, + 'DriveModeSetting' => { + PrintConv => { + 'Self-timer 10 sec' => 'Autoscatto 10 sec', + }, + }, + 'DriveType' => { + PrintConv => { + 'Fixed Disk' => 'Disco fisso', + 'Unknown' => 'Sconosciuto', + }, + }, + 'DynamicRangeExpansion' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'DynamicRangeOptimizer' => { + Description => 'Ott.gamma din.', + PrintConv => { + 'Advanced Auto' => 'Avanz.autom.', + 'Advanced Lv1' => 'Liv.Avanzato 1', + 'Advanced Lv2' => 'Liv.Avanzato 2', + 'Advanced Lv3' => 'Liv.Avanzato 3', + 'Advanced Lv4' => 'Liv.Avanzato 4', + 'Advanced Lv5' => 'Liv.Avanzato 5', + 'Auto' => 'Automatico', + 'Off' => 'Spento', + }, + }, + 'DynamicRangeOptimizerBracket' => { + PrintConv => { + 'Low' => 'Basso', + 'Off' => 'Spento', + }, + }, + 'DynamicRangeOptimizerMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'DynamicRangeOptimizerSetting' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'DynamicRangeSetting' => { + PrintConv => { + 'Manual' => 'Manuale', + }, + }, + 'ETTLII' => { + PrintConv => { + 'Average' => 'Media', + }, + }, + 'EVSteps' => { + PrintConv => { + '1/2 EV Steps' => 'Step 1/2 EV', + '1/3 EV Steps' => 'Step 1/3 EV', + }, + }, + 'EXIFVersion' => 'Versione EXIF', + 'EXRAuto' => { + PrintConv => { + 'Manual' => 'Manuale', + }, + }, + 'EasyExposureComp' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'EasyExposureCompensation' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'EasyMode' => { + PrintConv => { + 'Fireworks' => 'Fuochi artificiali', + 'Fisheye Effect' => 'Effetto fish-eye', + 'Flash Off' => 'Flash spento', + 'Kids & Pets' => 'Bambini e animali dimestici', + 'Landscape' => 'Orizzontale', + 'Manual' => 'Manuale', + 'Night' => 'Scena notturna', + 'Nostalgic' => 'Nostalgico', + 'Portrait' => 'Verticale', + 'Quick Shot' => 'Scatto veloce', + 'Sepia' => 'Seppia', + 'Sunset' => 'Tramonto', + 'Vivid' => 'Vivace', + 'Zoom Blur' => 'Sfocatura zoom', + }, + }, + 'EdgeNoiseReduction' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'EditStatus' => 'Modifica Stato', + 'EditorialUpdate' => { + Description => 'Aggiornamento Editoriale', + PrintConv => { + 'Additional language' => 'Linguaggio addizionale', + }, + }, + 'EffectiveMaxAperture' => 'Diaframma massimo effettivo', + 'Elevation' => 'Elevazione', + 'Emphasis' => { + PrintConv => { + 'None' => 'Nessuno', + 'reserved' => 'riservato', + }, + }, + 'EncodedBy' => 'Codificato da', + 'EncodedPixelsDimensions' => 'Dimensioni pixel codificati', + 'EncodedUsing' => 'Codificato usando', + 'EncodedWith' => 'Codificato con', + 'Encoder' => 'Codificatore', + 'EncoderSettings' => 'Impostazioni codificatore', + 'EncoderVersion' => 'Versione codificatore', + 'Encoding' => { + Description => 'Codifica', + PrintConv => { + 'QDesign Music' => 'Musica QDesign', + 'Unknown -' => 'Sconosciuto -', + }, + }, + 'EncodingProcess' => 'Processo di codifica', + 'EncodingScheme' => 'Schema di codifica', + 'EncodingSettings' => 'Impostazioni di codifica', + 'EncodingTime' => 'Durata codifica', + 'Encryption' => 'Crittografia', + 'EndOfItems' => 'Fine elementi', + 'EndPoints' => 'Punti finali', + 'EndTime' => 'Ora fine', + 'EndUser' => 'Utente finale', + 'EndUserID' => 'ID utente finale', + 'EndUserName' => 'Nome utente finale', + 'EndingPage' => 'Pagina finale', + 'EnhanceDarkTones' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Enhancement' => { + Description => 'Miglioramento', + PrintConv => { + 'Green' => 'Verde', + 'Off' => 'Spento', + 'Red' => 'Rosso', + 'Scenery' => 'Paesaggio', + }, + }, + 'EnhancementOrModificationDescription' => 'Descrizione miglioramento/modifica', + 'EntryPoint' => 'Punto d\'ingresso', + 'EnvelopePriority' => { + PrintConv => { + '0 (reserved)' => '0 (riservato)', + '1 (most urgent)' => '1 (molto urgente)', + '5 (normal urgency)' => '5 (urgenza normale)', + '8 (least urgent)' => '8 (meno urgente)', + '9 (user-defined priority)' => '9 (priorità definita dall\'utente)', + }, + }, + 'Error' => 'Errore', + 'ErrorCorrection' => 'Correzione errore', + 'ErrorCorrectionType' => 'Tipo correzione errore', + 'EthnicGroup' => 'Gruppo etnico', + 'Event' => 'Evento', + 'EventAbsoluteDuration' => 'Durata assoluta evento', + 'Events' => 'Eventi', + 'ExcursionTolerance' => { + PrintConv => { + 'Allowed' => 'Possibile', + 'Not Allowed' => 'Non permesso', + }, + }, + 'ExecutionStatus' => 'Stato esecuzione', + 'ExecutionStatusInfo' => 'Info stato esecuzione', + 'ExifByteOrder' => 'Ordine dei byte Exif', + 'ExifCameraInfo' => 'Info Exif fotocamera', + 'ExifImageHeight' => 'Altezza immagine Exif', + 'ExifImageWidth' => 'Larghezza immagine Exif', + 'ExifInfo2' => 'Info 2 Exif', + 'ExifOffset' => 'Puntatore Exif IFD', + 'ExifToolVersion' => 'Numero versione ExifTool', + 'ExifUnicodeByteOrder' => 'Ordine unicode dei byte Exif', + 'ExifVersion' => 'Versione Exif', + 'ExitPupilPosition' => 'Posizione pupilla d\'uscita', + 'ExpirationDate' => 'Data scadenza', + 'ExpirationTime' => 'Ora scadenza', + 'Expires' => 'Scade', + 'ExposedArea' => 'Area esposta', + 'Exposure' => 'Esposizione', + 'Exposure2012' => 'Esposizione 2012', + 'ExposureBracketValue' => 'Valore Esposizione a Forcella', + 'ExposureBracketingIndicatorLast' => { + PrintConv => { + 'Not Indicated' => 'Non indicato', + }, + }, + 'ExposureCompensation' => 'Compensazione esposizione', + 'ExposureCompensationMode' => 'Modo compensazione esposizione', + 'ExposureControlMode' => 'Modo controllo esposizione', + 'ExposureControlModeDescription' => 'Descrizione modo controllo esposizione', + 'ExposureDelayMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ExposureDifference' => 'Differenza esposizione', + 'ExposureIndex' => 'Indice di esposizione', + 'ExposureIndicator' => { + PrintConv => { + 'Not Indicated' => 'Non indicato', + }, + }, + 'ExposureLevelIncrements' => { + PrintConv => { + '1/2 Stop' => '1/2 stop', + '1/3 Stop' => '1/3 stop', + }, + }, + 'ExposureMode' => { + Description => 'Modo esposizione', + PrintConv => { + 'Aperture Priority' => 'Priorità diaframma', + 'Aperture-priority AE' => 'Priorità diaframma', + 'Auto' => 'Esposizione automatica', + 'Auto bracket' => 'A forcella automatica', + 'Fireworks' => 'Fuochi artificiali', + 'Landscape' => 'Orizzontale', + 'Manual' => 'Manuale', + 'Portrait' => 'Verticale', + 'Program' => 'Programma', + 'Program AE' => 'Programma AE', + 'Shutter Priority' => 'Priorità otturatore', + 'Shutter speed priority AE' => 'Priorità otturatore AE', + 'Sunset' => 'Tramonto', + 'n/a' => 'n/d', + }, + }, + 'ExposureModeInManual' => { + Description => 'Modo esposizione in manuale', + PrintConv => { + 'Center-weighted average' => 'Media centrale ponderata', + 'Partial metering' => 'Parziale', + }, + }, + 'ExposureModulationType' => 'Tipo modulazione esposizione', + 'ExposureProgram' => { + Description => 'Programma esposizione', + PrintConv => { + 'Action (High speed)' => 'Azione (alta velocità)', + 'Aperture Priority' => 'Priorità diaframma', + 'Aperture-priority AE' => 'Priorità diaframma', + 'Bulb' => 'Bulbo', + 'Creative (Slow speed)' => 'Creativo (bassa velocità)', + 'Landscape' => 'Orizzontale', + 'Manual' => 'Manuale', + 'Not Defined' => 'Non definito', + 'Portrait' => 'Verticale', + 'Posterization' => 'Posterizzazione', + 'Posterization B/W' => 'Posterizzazione B&N', + 'Program' => 'Programma', + 'Program AE' => 'Programma AE', + 'Retro Photo' => 'Foto retrò', + 'Shutter Priority' => 'Priorità otturatore', + 'Shutter speed priority AE' => 'Priorità otturatore AE', + 'Sunset' => 'Tramonto', + 'Sweep Panorama' => 'Panoramica ad arco', + }, + }, + 'ExposureSequence' => 'Sequenza esposizione', + 'ExposureStatus' => 'Stato esposizione', + 'ExposureTime' => 'Tempo esposizione', + 'ExposureTime2' => 'Tempo esposizione 2', + 'ExposureTimeInMicroSec' => 'Tempo esposizione in microsecondi', + 'ExposureTimeInMilliSec' => 'Tempo esposizione in millisecondi', + 'ExposureTuning' => 'Sintonizzazione esposizione', + 'ExposureUnknown' => 'Esposizione sconosciuta', + 'ExposureValue' => 'Valore esposizione', + 'ExtendedWBDetect' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Extender' => { + PrintConv => { + 'None' => 'Nessuno', + }, + }, + 'ExtenderStatus' => { + PrintConv => { + 'Not attached' => 'Non applicabile', + 'Removed' => 'Rimosso', + }, + }, + 'ExtensionPersistence' => { + PrintConv => { + 'Potentially Invalidated By Modification' => 'Potenzialmente invalidato per modifica', + }, + }, + 'ExternalFlash' => { + Description => 'Flash esterno', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ExternalFlashBounce' => { + PrintConv => { + 'Yes' => 'Sì', + 'n/a' => 'n/d', + }, + }, + 'ExternalFlashExposureComp' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ExternalFlashFirmware' => { + PrintConv => { + '1.01 (SB-800 or Metz 58 AF-1)' => '1.01 (SB-800 o Metz 58 AF-1)', + 'n/a' => 'n/d', + }, + }, + 'ExternalFlashFlags' => 'Flags Flash Esterno', + 'ExternalFlashMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ExtraFlags' => { + PrintConv => { + '(none)' => '(nessuno)', + 'Fastest Algorithm' => 'Algoritmo più veloce', + }, + }, + 'ExtraSamples' => { + Description => 'Campioni extra', + PrintConv => { + 'Associated Alpha' => 'Associati alla trasparenza', + 'Unassociated Alpha' => 'Non associati alla trasparenza', + 'Unspecified' => 'Non specificati', + }, + }, + 'EyeStartAF' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'FEMicroadjustment' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'FNumber' => 'Numero F', + 'Face1Category' => { + PrintConv => { + 'Family' => 'Famiglia', + }, + }, + 'Face2Category' => { + PrintConv => { + 'Family' => 'Famiglia', + }, + }, + 'Face3Category' => { + PrintConv => { + 'Family' => 'Famiglia', + }, + }, + 'Face4Category' => { + PrintConv => { + 'Family' => 'Famiglia', + }, + }, + 'Face5Category' => { + PrintConv => { + 'Family' => 'Famiglia', + }, + }, + 'Face6Category' => { + PrintConv => { + 'Family' => 'Famiglia', + }, + }, + 'Face7Category' => { + PrintConv => { + 'Family' => 'Famiglia', + }, + }, + 'Face8Category' => { + PrintConv => { + 'Family' => 'Famiglia', + }, + }, + 'FaceDetection' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'FaceOrientation' => { + PrintConv => { + 'Horizontal (normal)' => 'Orizzontale (normale)', + 'Rotate 180' => 'Ruota di 180°', + 'Rotate 270 CW' => 'Ruota di 270° in senso orario', + 'Rotate 90 CW' => 'Ruota di 90° senso orario', + }, + }, + 'FacesDetected' => { + Description => 'Facce rimosse', + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'FacesRecognized' => 'Facce riconosciute', + 'FamilyName' => 'Nome famiglia', + 'FastSeek' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'FaxNumber' => 'Numero di fax', + 'FaxProfile' => { + Description => 'Profilo fax', + PrintConv => { + 'Extended B&W lossless, F' => 'Bianco e nero esteso senza perdita, F', + 'Lossless JBIG B&W, J' => 'Senza perdita JBIG bianco e nero, J', + 'Lossless color and grayscale, L' => 'Senza perdita a colori e scala di grigi, L', + 'Lossy color and grayscale, C' => 'Con perdita a colori e scala di grigi, C', + 'Minimal B&W lossless, S' => 'Bianco e nero minimale con perdita, S', + 'Mixed raster content, M' => 'Contenuto raster misto, M', + 'Multi Profiles' => 'Profili multipli', + 'Profile T' => 'Profilo T', + 'Unknown' => 'Sconosciuto', + }, + }, + 'FaxRecvParams' => 'Parametri ricezione fax', + 'FaxRecvTime' => 'Ora ricezione fax', + 'FaxSubAddress' => 'Sotto-indirizzo fax', + 'FileAttributes' => { + PrintConv => { + 'Encrypted' => 'Crittografato', + 'Encrypted?' => 'Crittografato?', + 'Normal' => 'Normale', + 'Not indexed' => 'Non indicizzato', + 'Read-only' => 'Sola lettura', + 'System' => 'Sistema', + }, + }, + 'FileDescription' => 'Descrizione file', + 'FileDescriptors' => 'Descrittori file', + 'FileFlags' => { + Description => 'Attributi file', + PrintConv => { + 'Info inferred' => 'Info desunte', + 'Private build' => 'Compilazione privata', + 'Special build' => 'Compilazione speciale', + }, + }, + 'FileFlagsMask' => 'Maschera attributi file', + 'FileFormat' => { + Description => 'Formato file', + PrintConv => { + 'Ritzaus Bureau NITF version (RBNITF DTD)' => 'Versione Ritzaus Bureau NITF (RBNITF DTD)', + }, + }, + 'FileFunctionFlags' => { + PrintConv => { + 'Fragmented' => 'Frammentato', + }, + }, + 'FileID' => 'ID file', + 'FileIndex' => 'Indice file', + 'FileIndex2' => 'Indice file 2', + 'FileLength' => 'Dimensioni file', + 'FileModifyDate' => 'Data aggiornamento', + 'FileName' => 'Nome file', + 'FileNameLength' => 'Lunghezza nome file', + 'FileNumber' => 'Numero file', + 'FileNumberMemory' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'FileNumberSequence' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'FileOS' => 'OS del file', + 'FileOwner' => 'Proprietario del file', + 'FilePermissions' => 'Permessi file', + 'FileProfileVersion' => 'Versione profilo file', + 'FileSecurityReport' => 'Rapporto sicurezza file', + 'FileSequence' => 'Sequenza file', + 'FileSetID' => 'ID gruppo file', + 'FileSize' => 'Dimensione file', + 'FileSizeBytes' => 'Dimensione file in byte', + 'FileSource' => { + Description => 'Origine file', + PrintConv => { + 'Digital Camera' => 'Fotocamera digitale', + 'Film Scanner' => 'Scanner per pellicola', + 'Reflection Print Scanner' => 'Scanner a riflessione', + 'Sigma Digital Camera' => 'Fotocamera digitale Sigma', + }, + }, + 'FileSubtype' => 'Sottotipo file', + 'FileType' => 'Tipo di file', + 'FileURL' => 'URL file', + 'FileVersion' => 'Versione file', + 'FileVersionNumber' => 'Numero versione file', + 'Filename' => 'Nome file', + 'Files' => 'File', + 'FillFlashAutoReduction' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'FillOrder' => { + Description => 'Ordine riempimento', + PrintConv => { + 'Normal' => 'Normale', + 'Reversed' => 'Invertito', + }, + }, + 'FilmMode' => { + PrintConv => { + 'Nostalgic' => 'Nostalgico', + 'Standard (B&W)' => 'Standard (B&N)', + 'Standard (color)' => 'Standard (colori)', + 'n/a' => 'n/d', + }, + }, + 'FilterEffect' => { + Description => 'Effetto Filtro', + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Off' => 'Spento', + 'Orange' => 'Arancio', + 'Red' => 'Rosso', + 'Yellow' => 'Giallo', + 'n/a' => 'n/d', + }, + }, + 'FilterEffectFaithful' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'FilterEffectLandscape' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'FilterEffectMonochrome' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Orange' => 'Arancio', + 'Red' => 'Rosso', + 'Yellow' => 'Giallo', + 'n/a' => 'n/d', + }, + }, + 'FilterEffectNeutral' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'FilterEffectPortrait' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'FilterEffectStandard' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'FilterEffectUnknown' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Red' => 'Rosso', + 'n/a' => 'n/d', + }, + }, + 'FilterEffectUserDef1' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Red' => 'Rosso', + 'n/a' => 'n/d', + }, + }, + 'FilterEffectUserDef2' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Red' => 'Rosso', + 'n/a' => 'n/d', + }, + }, + 'FilterEffectUserDef3' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Red' => 'Rosso', + 'n/a' => 'n/d', + }, + }, + 'FinalFrameBlocks' => 'Blocchi frame finali', + 'FinderDisplayDuringExposure' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'FineSharpness' => { + PrintConv => { + 'Normal' => 'Normale', + 'Off' => 'Spento', + }, + }, + 'FirmwareDate' => 'Data firmware', + 'FirmwareID' => 'ID firmware', + 'FirmwareName' => 'Nome firmware', + 'FirmwareRevision' => 'Revisione firmware', + 'FirmwareRevision2' => 'Revisione 2 firmware', + 'FirmwareVersion' => 'Versione firmware', + 'FirstChar' => 'Primo carattere', + 'FirstObject' => 'Primo oggetto', + 'FirstObjectID' => 'ID primo oggetto', + 'FixtureIdentifier' => 'Identificatore d\'installazione', + 'Flags' => { + PrintConv => { + 'FileName' => 'Nome file', + 'Text' => 'Testo', + }, + }, + 'Flash' => { + PrintConv => { + 'Auto, Did not fire' => 'Auto, flash non emesso', + 'Auto, Did not fire, Red-eye reduction' => 'Auto, flash non emesso, riduzione occhi rossi', + 'Auto, Fired' => 'Auto, flash emesso', + 'Auto, Fired, Red-eye reduction' => 'Auto, flash emesso, riduzione occhi rossi', + 'Auto, Fired, Red-eye reduction, Return detected' => 'Auto, flash emesso, riduzione occhi rossi, luce di ritorno rilevata', + 'Auto, Fired, Red-eye reduction, Return not detected' => 'Auto, flash emesso, riduzione occhi rossi, luce di ritorno non rilevata', + 'Auto, Fired, Return detected' => 'Auto, flash emesso, luce di ritorno rilevata', + 'Auto, Fired, Return not detected' => 'Auto, flash emesso, luce di ritorno non rilevata', + 'Did not fire' => 'Flash non emesso', + 'Fired' => 'Emesso', + 'Fired, Red-eye reduction' => 'Emesso, riduzione occhi rossi', + 'Fired, Red-eye reduction, Return detected' => 'Emesso, riduzione occhi rossi, ritorno rilevato', + 'Fired, Red-eye reduction, Return not detected' => 'Emesso, riduzione occhi rossi, ritorno non rilevato', + 'Fired, Return detected' => 'Emesso, ritorno rilevato', + 'Fired, Return not detected' => 'Emesso, ritorno non rilevato', + 'Flash Fired' => 'Flash emesso', + 'No Flash' => 'Flash non emesso', + 'No flash function' => 'Nessuna funzione flash', + 'Off' => 'Flash non emesso, modalità flash forzata', + 'Off, Did not fire' => 'Flash non emesso, modalità flash forzata', + 'Off, Did not fire, Return not detected' => 'Off, Non emesso. Luce di ritorno non rilevata', + 'Off, No flash function' => 'Off, Nessuna funzione flash', + 'Off, Red-eye reduction' => 'Disattivato, riduzione occhi rossi', + 'On' => 'Flash emesso, modalità flash forzata', + 'On, Did not fire' => 'Attivato, non emesso', + 'On, Fired' => 'Attivato, emesso', + 'On, Red-eye reduction' => 'Attivato, riiduzione occhi rossi', + 'On, Red-eye reduction, Return detected' => 'Attivato, riiduzione occhi rossi, ritorno rilevato', + 'On, Red-eye reduction, Return not detected' => 'Attivato, riiduzione occhi rossi, ritorno non rilevato', + 'On, Return detected' => 'Attivato, ritorno rilevato', + 'On, Return not detected' => 'Attivato, ritorno non rilevato', + }, + }, + 'FlashBits' => { + PrintConv => { + 'External' => 'Esterno', + 'Manual' => 'Manuale', + }, + }, + 'FlashButtonFunction' => { + PrintConv => { + 'ISO speed' => 'Velocità ISO', + }, + }, + 'FlashColorFilter' => { + PrintConv => { + 'None' => 'Nessuno', + 'Red' => 'Rosso', + }, + }, + 'FlashCommanderMode' => { + Description => 'Modo Commander', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'FlashCompensation' => 'Compensazione flash', + 'FlashControl' => 'Controllo flash', + 'FlashControlBuilt-in' => { + PrintConv => { + 'Manual' => 'Manuale', + 'Repeating Flash' => 'Ripetizione flash', + }, + }, + 'FlashControlMode' => { + Description => 'Modo Controllo Flash', + PrintConv => { + 'Auto Aperture' => 'Diaframma automatico', + 'Manual' => 'Manuale', + 'Off' => 'Spento', + 'Repeating Flash' => 'Ripetizione flash', + }, + }, + 'FlashDevice' => { + PrintConv => { + 'External' => 'Esterno', + 'None' => 'Nessuno', + }, + }, + 'FlashEnergy' => 'Energia del flash', + 'FlashExposureBracketValue' => 'Valore Esposizione a Forcella Flash', + 'FlashExposureComp' => 'Compensazione Esposizione Flash', + 'FlashExposureIndicator' => { + PrintConv => { + 'Not Indicated' => 'Non indicato', + }, + }, + 'FlashExposureIndicatorLast' => { + PrintConv => { + 'Not Indicated' => 'Non indicato', + }, + }, + 'FlashExposureIndicatorNext' => { + PrintConv => { + 'Not Indicated' => 'Non indicato', + }, + }, + 'FlashExposureLock' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'FlashFired' => { + Description => 'Flash emesso', + PrintConv => { + 'External' => 'Esterno', + 'Yes' => 'Sì', + }, + }, + 'FlashFiring' => 'Emissione flash', + 'FlashFirmwareVersion' => 'Versione firmware flash', + 'FlashFocalLength' => 'Lunghezza focale flash', + 'FlashFunction' => { + Description => 'Funzione flash', + PrintConv => { + 'Manual' => 'Manuale', + }, + }, + 'FlashGNDistance' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'FlashGroupAControlMode' => { + Description => 'Gruppo A Modo Controllo Flash', + PrintConv => { + 'Auto Aperture' => 'Diaframma automatico', + 'Manual' => 'Manuale', + 'Off' => 'Spento', + 'Repeating Flash' => 'Ripetizione flash', + }, + }, + 'FlashGroupBControlMode' => { + Description => 'Gruppo B Modo Controllo Flash', + PrintConv => { + 'Auto Aperture' => 'Diaframma automatico', + 'Manual' => 'Manuale', + 'Off' => 'Spento', + 'Repeating Flash' => 'Ripetizione flash', + }, + }, + 'FlashGroupCControlMode' => { + Description => 'Gruppo C Modo Controllo Flash', + PrintConv => { + 'Manual' => 'Manuale', + 'Off' => 'Spento', + 'Repeating Flash' => 'Ripetizione flash', + }, + }, + 'FlashInfoVersion' => 'Info Versione Flash', + 'FlashIntensity' => { + PrintConv => { + 'Low' => 'Basso', + 'Normal' => 'Normale', + 'Strong' => 'Forte', + }, + }, + 'FlashLevel' => { + Description => 'Livello flash', + PrintConv => { + 'Low' => 'Basso', + 'Normal' => 'Normale', + }, + }, + 'FlashMeteringMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'FlashMode' => { + Description => 'Modo flash', + PrintConv => { + 'Did Not Fire' => 'Non emesso', + 'Fired, Commander Mode' => 'Emesso, Modalità Commander', + 'Fired, External' => 'Emesso Esterno', + 'Fired, Manual' => 'Emesso, Manuale', + 'Fired, TTL Mode' => 'Emesso, Modalità TTL', + 'Flash Off' => 'Flash spento', + 'Normal' => 'Normale', + 'Not Ready' => 'Non pronto', + 'Off' => 'Spento', + 'Off, Did not fire' => 'Spendo, non emesso', + 'Off?' => 'Spento?', + 'Red eye' => 'Occhi rossi', + 'Red-Eye' => 'Occhi rossi', + 'Red-Eye?' => 'Occhi rossi?', + 'Red-eye' => 'Occhi rossi', + 'Red-eye Reduction' => 'Riduzione occhi rossi', + 'Red-eye reduction' => 'Riduzione occhi rossi', + 'Unknown' => 'Sconosciuta', + }, + }, + 'FlashModel' => { + Description => 'Modello flash', + PrintConv => { + 'None' => 'Nessuno', + }, + }, + 'FlashOptions' => { + Description => 'Opzioni flash', + PrintConv => { + 'Normal' => 'Normale', + 'Red-eye reduction' => 'Riduzione occhi rossi', + }, + }, + 'FlashOptions2' => { + Description => 'Opzioni 2 flash', + PrintConv => { + 'Normal' => 'Normale', + 'Red-eye reduction' => 'Riduzione occhi rossi', + }, + }, + 'FlashRemoteControl' => { + Description => 'Telecomando flash', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'FlashReturn' => 'Ritorno flash', + 'FlashSerialNumber' => 'Numero di serie del flash', + 'FlashSetting' => 'Impostazione flash', + 'FlashSource' => { + Description => 'Fonte flash', + PrintConv => { + 'External' => 'Esterno', + 'None' => 'Nessuno', + }, + }, + 'FlashStatus' => { + Description => 'Stato flash', + PrintConv => { + 'Off' => 'Spento', + 'Off (1)' => 'Spento (1)', + }, + }, + 'FlashSyncSpeed' => { + PrintConv => { + '1/250 s (auto FP)' => '1/250 s (piano focale auto)', + '1/320 s (auto FP)' => '1/320 s (piano focale auto)', + }, + }, + 'FlashSyncSpeedAv' => { + PrintConv => { + '1/200 Fixed' => '1/200 fisso', + '1/200-1/60 Auto' => '1/200-1/60 auto', + '1/250 Fixed' => '1/250 fisso', + '1/250-1/60 Auto' => '1/250-1/60 auto', + '1/300 Fixed' => '1/300 fisso', + '1/300-1/60 Auto' => '1/300-1/60 auto', + }, + }, + 'FlashType' => { + Description => 'Tipo di flash', + PrintConv => { + 'External' => 'Esterno', + 'None' => 'Nessuno', + 'Off' => 'Spento', + }, + }, + 'FlashVersion' => 'Versione del flash', + 'FlashWarning' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'FlashpixVersion' => 'Versione Flashpix', + 'FlickerReduce' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'FlipHorizontal' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'FocalLength' => 'Lunghezza focale', + 'FocalLength35efl' => 'Lunghezza focale', + 'FocalLength35mm' => 'Lunghezza focale 35mm', + 'FocalLengthIn35mmFormat' => 'Lunghezza focale in formato 35mm', + 'FocalPlaneDiagonal' => 'Diagonale piano focale', + 'FocalPlaneResolutionUnit' => { + Description => 'Unità risoluzione piano focale', + PrintConv => { + 'None' => 'Nessuno', + 'inches' => 'pollici', + }, + }, + 'FocalPlaneXResolution' => 'Risoluzione X del piano focale', + 'FocalPlaneXSize' => 'Dimensione X del piano focale', + 'FocalPlaneXUnknown' => 'X del piano focale sconisciuta', + 'FocalPlaneYResolution' => 'Risoluzione Y del piano focale', + 'FocalPlaneYSize' => 'Dimensione Y del piano focale', + 'FocalPlaneYUnknown' => 'Y del piano focale sconisciuta', + 'FocalType' => { + PrintConv => { + 'Fixed' => 'Fisso', + }, + }, + 'Focus' => { + PrintConv => { + 'Manual' => 'Manuale', + }, + }, + 'FocusContinuous' => { + PrintConv => { + 'Manual' => 'Manuale', + }, + }, + 'FocusDisplayAIServoAndMF' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'FocusDistance' => 'Distanza fuoco', + 'FocusMode' => { + Description => 'Modalità messa a fuoco', + PrintConv => { + 'Manual' => 'Manuale', + 'Normal' => 'Normale', + 'n/a' => 'n/d', + }, + }, + 'FocusMode2' => { + Description => 'Modalità messa a fuoco 2', + PrintConv => { + 'Manual' => 'Manuale', + }, + }, + 'FocusModeSetting' => { + PrintConv => { + 'Manual' => 'Manuale', + }, + }, + 'FocusModeSwitch' => { + PrintConv => { + 'Manual' => 'Manuale', + }, + }, + 'FocusPos' => 'Posizione fuoco', + 'FocusPosition' => 'Posizione fuoco', + 'FocusRange' => { + PrintConv => { + 'Manual' => 'Manuale', + 'Normal' => 'Normale', + 'Not Known' => 'Sconosciuto', + 'Very Close' => 'Molto vicino', + }, + }, + 'FocusStatus' => { + PrintConv => { + 'Failed' => 'Fallito', + 'Not confirmed' => 'Non confermato', + }, + }, + 'FocusTrackingLockOn' => { + PrintConv => { + '1 (Short)' => '1 (Breve)', + '1 Short' => '1 breve', + 'Normal' => 'Normale', + 'Off' => 'Spento', + 'Short' => 'Breve', + }, + }, + 'FontFamily' => { + Description => 'Tipo di carattere', + PrintConv => { + 'Swiss' => 'Svizzera', + }, + }, + 'FontFileName' => 'Nome file carattere', + 'FontName' => 'Nome carattere', + 'FontSize' => 'Dimensioni carattere', + 'FontSubfamily' => 'Sottotipo di carattere', + 'FontSubfamilyID' => 'ID sottotipo di carattere', + 'FontType' => 'Tipo di carattere', + 'FontVersion' => 'Versione carattere', + 'FontWeight' => 'Peso carattere', + 'Fonts' => 'Caratteri', + 'For' => 'Per', + 'Format' => 'Formato', + 'ForwardMatrix1' => 'Matrice predittiva 1', + 'ForwardMatrix2' => 'Matrice predittiva 2', + 'FrameRate' => 'Frequenza fotogramma', + 'FrameSize' => 'Dimensioni fotogrammi', + 'FreeByteCounts' => 'Byte disponibili', + 'FreeOffsets' => 'Offset disponibili', + 'FujiFlashMode' => { + PrintConv => { + 'External' => 'Esterno', + 'Off' => 'Spento', + 'Red-eye reduction' => 'Riduzione occhi rossi', + }, + }, + 'FuncButton' => { + PrintConv => { + 'Flash Off' => 'Flash spento', + 'None' => 'Nessuno', + 'Preview' => 'Anteprima', + 'Virtual Horizon' => 'Orizzonte virtuale', + }, + }, + 'FuncButtonPlusDials' => { + PrintConv => { + 'Choose Image Area' => 'Seleziona area immagine', + 'None' => 'Nessuno', + }, + }, + 'FunctionButton' => { + PrintConv => { + 'Flash Off' => 'Flash spento', + }, + }, + 'GDALMetadata' => 'Metadati GDAL', + 'GDALNoData' => 'Nessun dato GDAL', + 'GIFVersion' => 'Versione GIF', + 'GPSAltitude' => 'Altitudine GPS', + 'GPSAltitudeRef' => { + Description => 'Riferimento altitudine GPS', + PrintConv => { + 'Above Sea Level' => 'Sul livello del mare', + 'Below Sea Level' => 'Sotto il livello del mare', + }, + }, + 'GPSAreaInformation' => 'Informazioni area GPS', + 'GPSDOP' => 'Precisione misurazione GPS', + 'GPSDateStamp' => 'Data GPS', + 'GPSDateTime' => 'Ora GPS (orologio atomico)', + 'GPSDestBearing' => 'Direzione destinazione GPS', + 'GPSDestBearingRef' => { + Description => 'Riferimento direzione destinazione GPS', + PrintConv => { + 'Magnetic North' => 'Nord magnetico', + 'True North' => 'Nord geografico', + }, + }, + 'GPSDestDistance' => 'Distanza destinazione GPS', + 'GPSDestDistanceRef' => { + Description => 'Riferimento distanza destinazione GPS', + PrintConv => { + 'Kilometers' => 'Chilometri', + 'Miles' => 'Miglia', + 'Nautical Miles' => 'Miglia nautiche', + }, + }, + 'GPSDestLatitude' => 'Latitudine destinazione GPS', + 'GPSDestLatitudeRef' => { + Description => 'Riferimento latitudine destinazione GPS', + PrintConv => { + 'North' => 'Nord', + 'South' => 'Sud', + }, + }, + 'GPSDestLongitude' => 'Longitudine destinazione GPS', + 'GPSDestLongitudeRef' => { + Description => 'Riferimento per longitudine di destinazione', + PrintConv => { + 'East' => 'Est', + 'West' => 'Ovest', + }, + }, + 'GPSDifferential' => { + Description => 'Correzione differenziale GPS', + PrintConv => { + 'Differential Corrected' => 'Correzione differenziale applicata', + 'No Correction' => 'Misurazione senza correzione differenziale', + }, + }, + 'GPSHPositioningError' => 'Errore posizionamento orizzontale GPS', + 'GPSImgDirection' => 'Direzione di immagine', + 'GPSImgDirectionRef' => { + Description => 'Riferimento per direzione di immagine', + PrintConv => { + 'Magnetic North' => 'Nord magnetico', + 'True North' => 'Nord geografico', + }, + }, + 'GPSInfo' => 'Puntatore GPS Info IFD', + 'GPSLatitude' => 'Latitudine', + 'GPSLatitudeRef' => { + Description => 'Latitudine Nord o Sud', + PrintConv => { + 'North' => 'Latitudine Nord', + 'South' => 'Latitudine Sud', + }, + }, + 'GPSLongitude' => 'Longitudine', + 'GPSLongitudeRef' => { + Description => 'Longitudine Est o Ovest', + PrintConv => { + 'East' => 'Longitudine Est', + 'West' => 'Longitudine Ovest', + }, + }, + 'GPSMapDatum' => 'Dati di rilevamento geodetico utilizzati', + 'GPSMeasureMode' => { + Description => 'Modalità misurazione GPS', + PrintConv => { + '2-Dimensional Measurement' => 'Misurazione 2D', + '3-Dimensional Measurement' => 'Misurazione tridimensionale', + }, + }, + 'GPSProcessingMethod' => 'Nome metodo di elaborazione GPS', + 'GPSSatellites' => 'Satelliti GPS usati per la misurazione', + 'GPSSpeed' => 'Velocità ricevitore GPS', + 'GPSSpeedRef' => { + Description => 'Unità velocità', + PrintConv => { + 'km/h' => 'Chilometri all\'ora', + 'knots' => 'Nodi', + 'mph' => 'Miglie all\'ora', + }, + }, + 'GPSStatus' => { + Description => 'Stato ricevitore GPS', + PrintConv => { + 'Measurement Active' => 'Misurazione in corso', + 'Measurement Void' => 'Interoperatività misurazione', + }, + }, + 'GPSTimeStamp' => 'Ora GPS (orologio atomico)', + 'GPSTrack' => 'Direzione di movimento', + 'GPSTrackRef' => { + Description => 'Riferimento per direzione di movimento', + PrintConv => { + 'Magnetic North' => 'Direzione magnetica', + 'True North' => 'Direzione effettiva', + }, + }, + 'GPSVersionID' => 'Versione tag GPS', + 'GTModelType' => { + PrintConv => { + 'Projected' => 'Proiettato', + }, + }, + 'GainControl' => { + Description => 'Controllo di Guadagno', + PrintConv => { + 'High gain down' => 'Diminuire il guadagno alto', + 'High gain up' => 'Aumentare il guadagno alto', + 'Low gain down' => 'Diminuire il guadagno basso', + 'Low gain up' => 'Aumentare il guadagno basso', + 'None' => 'Nessuno', + }, + }, + 'GammaCompensatedValue' => 'Valore di Compensazione Gamma', + 'Gapless' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'Genre' => { + Description => 'Genere', + PrintConv => { + 'Acapella' => 'A cappella', + 'Acid Jazz' => 'Acid jazz', + 'Acid Punk' => 'Acid punk', + 'Acoustic' => 'Acustica', + 'Ambient' => 'Ambientale', + 'Avantgarde' => 'Avanguardia', + 'Ballad' => 'Ballata', + 'Bass' => 'Basso', + 'Big Band' => 'Big band', + 'Black Metal' => 'Black metal', + 'Booty Bass' => 'Basso booty', + 'Celtic' => 'Celtica', + 'Chamber Music' => 'Musica da camera', + 'Chorus' => 'Coro', + 'Christian Gangsta' => 'Gangsta cristiano', + 'Christian Rap' => 'Rap cristiano', + 'Christian Rock' => 'Rock cristiano', + 'Classic Rock' => 'Rock classico', + 'Classical' => 'Classica', + 'Club-House' => 'Club-house', + 'Comedy' => 'Commedia', + 'Contemporary C' => 'C contemporaneo', + 'Country' => 'Nazione', + 'Cover' => 'Copertina', + 'Dance Hall' => 'Dance hall', + 'Death Metal' => 'Death metal', + 'Drum & Bass' => 'Batteria e basso', + 'Drum Solo' => 'Batteria solo', + 'Duet' => 'Duetto', + 'Easy Listening' => 'Easy listening', + 'Electronic' => 'Elettronica', + 'Ethnic' => 'Etnica', + 'Euro-House' => 'Euro-house', + 'Euro-Techno' => 'Euro-techno', + 'Fast Fusion' => 'Fast fusion', + 'Folk-Rock' => 'Folk-rock', + 'Game' => 'Gioco', + 'Gothic' => 'Gotica', + 'Gothic Rock' => 'Rock gotico', + 'Hard Rock' => 'Hard rock', + 'Heavy Metal' => 'Heavy metal', + 'Hip-Hop' => 'Hip-hop', + 'Humour' => 'Umoristica', + 'Instrumental' => 'Strumentale', + 'Instrumental Pop' => 'Pop strumentale', + 'Instrumental Rock' => 'Rock strumentale', + 'Jazz+Funk' => 'Jazz+funk', + 'Latin' => 'Latina', + 'Lo-Fi' => 'Lo-fi', + 'Meditative' => 'Medidativa', + 'National Folk' => 'Folklore nazionale', + 'Native American' => 'Nativi americani', + 'New Age' => 'New age', + 'New Wave' => 'New wave', + 'Noise' => 'Rumore', + 'None' => 'Nessuno', + 'Oldies' => 'Vecchi successi', + 'Other' => 'Altro', + 'Polsk Punk' => 'Punk polacco', + 'Pop-Folk' => 'Pop-folk', + 'Pop/Funk' => 'Pop/funk', + 'Porn Groove' => 'Porn groove', + 'Power Ballad' => 'Power ballad', + 'Progressive Rock' => 'Progressive rock', + 'Psychadelic' => 'Psichedelica', + 'Psychedelic Rock' => 'Rock psichedelica', + 'Punk Rock' => 'Punk rock', + 'Retro' => 'Retrò', + 'Rhythmic Soul' => 'Rhythmic soul', + 'Rock & Roll' => 'Rock & roll', + 'Satire' => 'Satira', + 'Slow Jam' => 'Slow jam', + 'Slow Rock' => 'Slow rock', + 'Sound Clip' => 'Clip sonora', + 'Soundtrack' => 'Colonna sonora', + 'Southern Rock' => 'Southern rock', + 'Speech' => 'Parlato', + 'Symphonic Rock' => 'Rock sinfonico', + 'Symphony' => 'Sinfonia', + 'Techno-Industrial' => 'Techno-industrial', + 'Terror' => 'Terrore', + 'Thrash Metal' => 'Thrash metal', + 'Tribal' => 'Tribale', + 'Trip-Hop' => 'Trip-hop', + }, + }, + 'GenreID' => 'ID genere', + 'GeoTiffAsciiParams' => 'Parametri Geo Tiff Ascii', + 'GeoTiffDirectory' => 'Cartella Geo Tiff', + 'GeoTiffDoubleParams' => 'Parametri Geo Tiff Double', + 'GeogGeodeticDatum' => { + PrintConv => { + 'Lisbon' => 'Lisbona', + 'Stockholm 1938' => 'Stoccolma 1938', + }, + }, + 'GeogPrimeMeridian' => { + PrintConv => { + 'Lisbon' => 'Lisbona', + 'Rome' => 'Roma', + 'Stockholm' => 'Stoccolma', + }, + }, + 'GeographicType' => { + PrintConv => { + 'Greek' => 'Greco', + 'Lisbon' => 'Lisbona', + 'Stockholm 1938' => 'Stoccolma 1938', + }, + }, + 'Gradation' => { + Description => 'Ottimizzaz.', + PrintConv => { + 'Normal' => 'Normale', + 'n/a' => 'n/d', + }, + }, + 'GrayResponseCurve' => 'Curva di risposta Grigio', + 'GrayResponseUnit' => { + Description => 'Unità di risposta Grigio', + PrintConv => { + '1e-05' => '1e-005', + '1e-06' => '1e-006', + }, + }, + 'GrayTRC' => 'Curva Riproduzione Tono Grigio', + 'GreenMatrixColumn' => 'Colonna della Matrice Verde', + 'GreenTRC' => 'Curva Riproduziozne Tono Verde', + 'GridDisplay' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Grouping' => 'Raggruppamento', + 'HCUsage' => { + Description => 'Uso HC', + PrintConv => { + 'Line Art' => 'Line art', + }, + }, + 'HDR' => { + Description => 'HDR auto', + PrintConv => { + 'Off' => 'Disattivata', + }, + }, + 'HDRSetting' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'HalftoneHints' => 'Suggerimenti mezzi toni', + 'HandlerType' => { + PrintConv => { + 'Text' => 'Testo', + }, + }, + 'Headline' => 'Intestazione', + 'HeightResolution' => 'Risoluzione altezza', + 'HighISONoiseReduction' => { + Description => 'Riduzione Rumore High ISO', + PrintConv => { + 'Auto' => 'Automatico', + 'High' => 'Hi', + 'Low' => 'Leggero', + 'Normal' => 'Normale', + 'Off' => 'Disattivata', + 'Strong' => 'Forte', + 'n/a' => 'n/d', + }, + }, + 'HighSpeedSync' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'HighlightTonePriority' => { + PrintConv => { + 'Enable' => 'Abilita', + 'Off' => 'Spento', + }, + }, + 'HometownCity' => { + PrintConv => { + 'Jerusalem' => 'Gerusalemme', + 'Lisbon' => 'Lisbona', + 'London' => 'Londra', + 'Milan' => 'Milano', + 'Prague' => 'Praga', + 'Rome' => 'Roma', + 'Stockholm' => 'Stoccolma', + 'Tehran' => 'Teheran', + }, + }, + 'HometownDST' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'HostComputer' => 'Computer ospite', + 'HotKey' => { + PrintConv => { + '(none)' => '(nessuno)', + }, + }, + 'Hue' => { + Description => 'Tonalità', + PrintConv => { + 'None' => 'Nessuno', + 'Normal' => 'Normale', + }, + }, + 'HueAdjustment' => 'Regolazione Hue', + 'ICCProfile' => 'Profili ICC', + 'IDCCreativeStyle' => { + PrintConv => { + 'Camera Setting' => 'Impostazioni fotocamera', + 'Landscape' => 'Orizzontale', + 'Light' => 'Chiara', + 'Real' => 'Reale', + 'Sepia' => 'Seppia', + 'Sunset' => 'Tramonto', + 'Vivid' => 'Vivace', + }, + }, + 'INGRReserved' => 'Riseervato a INGR', + 'IPTC-NAA' => 'Metadati IPTC-NAA', + 'IPTCBitsPerSample' => 'Numero di Bits per Campione', + 'IPTCImageHeight' => 'Numero di linee', + 'IPTCImageRotation' => { + Description => 'Rotazione Immagine', + PrintConv => { + '0' => 'Nessuna rotazione', + '180' => 'Rotazione di 180 gradi', + '270' => 'Rotazione di 270 gradi', + '90' => 'Rotazione di 90 gradi', + }, + }, + 'IPTCImageWidth' => 'Pixels per linea', + 'IPTCPictureNumber' => 'Numero Immagine', + 'ISO' => 'Sensibilità ISO', + 'ISOAuto' => { + Description => 'ISO auto', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ISOAutoParameters' => { + Description => 'Parametri ISO auto', + PrintConv => { + 'Fast' => 'Veloce', + }, + }, + 'ISODisplay' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ISOExpansion' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ISOExpansion2' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ISOInfo' => 'Info ISO', + 'ISOSelection' => 'Selezione ISO', + 'ISOSensitivityStep' => 'Passo sensibilità ISO', + 'ISOSetting' => { + Description => 'Impostazione ISO', + PrintConv => { + '100 (Low)' => '100 (basso)', + 'Manual' => 'Manuale', + 'n/a' => 'n/d', + }, + }, + 'ISOSpeed' => 'Velocità ISO', + 'ISOSpeedExpansion' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'ISOSpeedIncrements' => { + PrintConv => { + '1 Stop' => '1 stop', + '1/3 Stop' => '1/3 stop', + }, + }, + 'ISOSpeedLatitudeyyy' => 'Velocità ISO - Latitudine yyy', + 'ISOSpeedLatitudezzz' => 'Velocità ISO - Latitudine zzz', + 'ISOSpeedRange' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'ISOValue' => 'Valore ISO', + 'IT8Header' => 'Intestazione IT8', + 'Illumination' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Image::ExifTool::AIFF::Comment' => 'Commento AIFF', + 'Image::ExifTool::EXE::CHM' => 'EXE CHM', + 'Image::ExifTool::EXE::ELF' => 'EXE ELF', + 'Image::ExifTool::EXE::MachO' => 'EXE MachO', + 'Image::ExifTool::EXE::Main' => 'EXE', + 'Image::ExifTool::EXE::PEF' => 'EXE PEF', + 'Image::ExifTool::EXE::PEString' => 'EXE PEString', + 'Image::ExifTool::EXE::PEVersion' => 'EXE PEVersion', + 'Image::ExifTool::Exif::Main' => 'Exif', + 'Image::ExifTool::FLAC::Main' => 'FLAC', + 'Image::ExifTool::Flash::Main' => 'Flash', + 'Image::ExifTool::Flash::Video' => 'Video flash', + 'Image::ExifTool::FlashPix::Main' => 'FlashPix', + 'Image::ExifTool::Font::Main' => 'Carattere', + 'Image::ExifTool::Font::Name' => 'Nome carattere', + 'Image::ExifTool::Font::PFM' => 'Carattere PFM', + 'Image::ExifTool::GPS::Main' => 'GPS', + 'Image::ExifTool::ID3::Private' => 'ID3 privato', + 'Image::ExifTool::ID3::v1' => 'ID3 v1', + 'Image::ExifTool::ID3::v1_Enh' => 'ID3 v1_Enh', + 'Image::ExifTool::ID3::v2_2' => 'ID3 v2_2', + 'Image::ExifTool::ID3::v2_3' => 'ID3 v2_3', + 'Image::ExifTool::ID3::v2_4' => 'ID3 v2_4', + 'Image::ExifTool::ITC::Main' => 'ITC', + 'Image::ExifTool::JFIF::Main' => 'JFIF', + 'Image::ExifTool::Kodak::DcMD' => 'Kodak DcMD', + 'Image::ExifTool::Kodak::Free' => 'Kodak Free', + 'Image::ExifTool::Kodak::KDC_IFD' => 'KDC_IFD Kodak', + 'Image::ExifTool::Kodak::Main' => 'Kodak', + 'Image::ExifTool::Microsoft::Stitch' => 'Microsoft Stitch', + 'Image::ExifTool::Olympus::AVI' => 'AVI Olympus', + 'Image::ExifTool::Olympus::Main' => 'Olympus', + 'Image::ExifTool::PSP::Creator' => 'Creatore PSP', + 'Image::ExifTool::PSP::Image' => 'Immagine PSP', + 'Image::ExifTool::PSP::Main' => 'PSP', + 'Image::ExifTool::PanasonicRaw::Main' => 'PanasonicRaw', + 'Image::ExifTool::PostScript::Main' => 'PostScript', + 'Image::ExifTool::PrintIM::Main' => 'PrintIM', + 'Image::ExifTool::Qualcomm::Main' => 'Qualcomm', + 'Image::ExifTool::QuickTime::Main' => 'QuickTime', + 'Image::ExifTool::RIFF::Main' => 'RIFF', + 'Image::ExifTool::Radiance::Main' => 'Radianza', + 'Image::ExifTool::Rawzor::Main' => 'Rawzor', + 'Image::ExifTool::Real::AudioV3' => 'Real AudioV3', + 'Image::ExifTool::Real::AudioV4' => 'Real AudioV4', + 'Image::ExifTool::Real::AudioV5' => 'Real AudioV5', + 'Image::ExifTool::Ricoh::AVI' => 'AVI Ricoh', + 'Image::ExifTool::Ricoh::FaceInfo' => 'FaceInfo Ricoh', + 'Image::ExifTool::Ricoh::FirmwareInfo' => 'Info firmware Ricoh', + 'Image::ExifTool::Ricoh::ImageInfo' => 'Info immagine Ricoh', + 'Image::ExifTool::Ricoh::Main' => 'Ricoh', + 'Image::ExifTool::Ricoh::RMETA' => 'RMETA Ricoh', + 'Image::ExifTool::Ricoh::SerialInfo' => 'Info seriale Ricoh', + 'Image::ExifTool::Ricoh::Subdir' => 'Sotto-cartella Ricoh', + 'Image::ExifTool::Ricoh::Text' => 'Testo Ricoh', + 'Image::ExifTool::Samsung::INFO' => 'Samsung INFO', + 'Image::ExifTool::Samsung::MP4' => 'Samsung MP4', + 'Image::ExifTool::Samsung::PictureWizard' => 'Samsung PictureWizard', + 'Image::ExifTool::Sanyo::Main' => 'Sanyo', + 'Image::ExifTool::Sigma::Main' => 'Sigma', + 'ImageAdjustment' => 'Regolazione Immagine', + 'ImageAlterationConstraints' => { + PrintConv => { + 'No Merging' => 'Nessuna fusione', + }, + }, + 'ImageAuthentication' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ImageByteCount' => 'Numero di byte dell\'immagine', + 'ImageColorIndicator' => { + Description => 'Indicazione colore dell\'immagine', + PrintConv => { + 'Specified Image Color' => 'Colore immagine specificato', + 'Unspecified Image Color' => 'Colore immagine non specificato', + }, + }, + 'ImageColorValue' => 'Valore colore dell\'immagine', + 'ImageCount' => 'Conteggio Immagini', + 'ImageDataDiscard' => { + Description => 'Dati scartati dell\'immagine', + PrintConv => { + 'Flexbits Discarded' => 'Flexbit scartati', + 'Full Resolution' => 'Risoluzione completa', + 'HighPass Frequency Data Discarded' => 'Dati in frequenza passa-alto scartati', + 'Highpass and LowPass Frequency Data Discarded' => 'Dati in frequenza passa-alto e passa-basso scartati', + }, + }, + 'ImageDataSize' => 'Dimensione Dati Immagine', + 'ImageDepth' => 'Profondità Immagine', + 'ImageDescription' => 'Descrizione Immagine', + 'ImageDustOff' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ImageEditing' => { + PrintConv => { + 'None' => 'Nessuno', + 'Resized' => 'Ridimensionato', + }, + }, + 'ImageHeight' => 'Altezza immagine', + 'ImageHistory' => 'Cronologia immagine', + 'ImageID' => 'ID Immagine', + 'ImageLayer' => 'Livello immagine', + 'ImageNumber' => 'Numero immagine', + 'ImageOffset' => 'Offset immagine', + 'ImageOptimization' => 'Ottimizzazione Immagine', + 'ImageOrientation' => { + Description => 'Orientamento Immagine', + PrintConv => { + 'Landscape' => 'Orizzontale', + 'Portrait' => 'Verticale', + 'Square' => 'Quadrata', + }, + }, + 'ImageQuality' => { + Description => 'Qualità Immagine', + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'ImageReview' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ImageRotated' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'ImageRotation' => { + PrintConv => { + 'None' => 'Nessuno', + }, + }, + 'ImageSize' => 'Dimensioni immagini', + 'ImageSourceData' => 'Dati origine immagine', + 'ImageStabilization' => { + Description => 'Stabilizzazione Immagine', + PrintConv => { + 'Off' => 'Spento', + 'Off (1)' => 'Spento (1)', + 'Off (2)' => 'Spento (2)', + 'n/a' => 'n/d', + }, + }, + 'ImageStabilizationSetting' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ImageStyle' => { + PrintConv => { + 'Landscape' => 'Orizzontale', + 'Sunset' => 'Tramonto', + 'Vivid' => 'Vivace', + }, + }, + 'ImageTone' => { + PrintConv => { + 'Landscape' => 'Orizzontale', + 'Portrait' => 'Verticale', + 'Radiant' => 'Radiante', + }, + }, + 'ImageType' => { + Description => 'Tipo immagine', + PrintConv => { + 'Page' => 'Pagina', + 'Preview' => 'Anteprima', + }, + }, + 'ImageUniqueID' => 'ID unico immagine', + 'ImageVersion' => 'Versione immagine', + 'ImageWidth' => 'Larghezza immagine', + 'Index' => 'Indice', + 'Indexable' => { + PrintConv => { + 'False' => 'Falso', + }, + }, + 'Indexed' => { + Description => 'Indicizzato', + PrintConv => { + 'Indexed' => 'Indicizzato', + 'Not indexed' => 'Non indicizzato', + }, + }, + 'InfraredIlluminator' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'InitialDisplayEffect' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'InitialKey' => 'Chiave iniziale', + 'InitializedDataSize' => 'Dimensione dati inizializzati', + 'InkNames' => 'Nomi inchiostri', + 'InkSet' => { + Description => 'Gruppo inchiostri', + PrintConv => { + 'Not CMYK' => 'Non CMYK', + }, + }, + 'Instructions' => 'Istruzioni', + 'IntellectualGenre' => 'Genere Intellettuale', + 'IntelligentAuto' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'IntelligentContrast' => { + PrintConv => { + 'Off' => 'Spento', + 'n/a' => 'n/d', + }, + }, + 'IntelligentD-Range' => { + PrintConv => { + 'Low' => 'Basso', + 'Off' => 'Spento', + }, + }, + 'IntelligentExposure' => { + PrintConv => { + 'Low' => 'Basso', + 'Off' => 'Spento', + }, + }, + 'IntelligentResolution' => { + PrintConv => { + 'Extended' => 'Esteso', + 'Low' => 'Basso', + 'Off' => 'Spento', + }, + }, + 'IntensityStereo' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Interlace' => { + Description => 'Interlacciamento', + PrintConv => { + 'Noninterlaced' => 'Non interlacciato', + 'Progressive' => 'Progressivo', + }, + }, + 'InterleavedField' => { + PrintConv => { + 'Even' => 'Pari', + }, + }, + 'InternalFlash' => { + PrintConv => { + 'Fired' => 'Flash emesso', + 'Manual' => 'Manuale', + 'No' => 'Flash non emesso', + 'Off' => 'Spento', + 'Repeating Flash' => 'Ripetizione flash', + }, + }, + 'InternalName' => 'Nome interno', + 'InternetRadioStationName' => 'Nome stazione radio internet', + 'InternetRadioStationOwner' => 'Proprietario stazione radio internet', + 'InternetRadioStationURL' => 'URL stazione radio internet', + 'InteropIndex' => { + Description => 'Identificazione interoperatività', + PrintConv => { + 'R03 - DCF option file (Adobe RGB)' => 'R03 - file opzioni DCF (Adobe RGB)', + 'R98 - DCF basic file (sRGB)' => 'R98 - file base DCF (sRGB)', + 'THM - DCF thumbnail file' => 'File miniatura THM - DCF', + }, + }, + 'InteropOffset' => 'Etichetta interoperatività', + 'InteropVersion' => 'Versione interoperatività', + 'InterpretedBy' => 'Interpetrato da', + 'InvolvedPeople' => 'Persone coinvolte', + 'Italic' => 'Corsivo', + 'JFIFVersion' => 'Versione JFIF', + 'JPEGACTables' => 'Tabelle JPEGAC', + 'JPEGDCTables' => 'Tabelle JPEGDC', + 'JPEGLosslessPredictors' => 'Predittori JPEG senza perdita', + 'JPEGPointTransforms' => 'Trasformazioni puntiali JPEG', + 'JPEGProc' => { + Description => 'Proc JPEG', + PrintConv => { + 'Baseline' => 'Linea di base', + 'Lossless' => 'Senza perdita', + }, + }, + 'JPEGQTables' => 'Tabelle JPEGQ', + 'JPEGQuality' => { + Description => 'Qualità', + PrintConv => { + 'Extra Fine' => 'Extra fine', + 'Standard' => 'Normale', + 'n/a' => 'n/d', + }, + }, + 'JPEGRestartInterval' => 'Intervallo riavvio JPEG', + 'JPEGTables' => 'Tabelle JPEG', + 'JobID' => 'ID processo', + 'JobName' => 'Nome processo', + 'JobRef' => 'Rif processo', + 'JobStatus' => 'Stato processo', + 'JpgFromRaw' => 'JPG da raw', + 'JpgFromRawLength' => 'Lunghezza JPG da raw', + 'JpgFromRawStart' => 'Inizio JPG da raw', + 'Keyword' => 'Parola chiave', + 'KeywordInfo' => 'Info parola chiave', + 'Keywords' => 'Parole chiave', + 'Kinds' => 'Tipi', + 'LCDIllumination' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'LCDIlluminationDuringBulb' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'LCHEditor' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Language' => 'Lingua', + 'LanguageCode' => { + Description => 'Codice lingua', + PrintConv => { + 'Albanian' => 'Albanese', + 'Arabic' => 'Arabo', + 'Armenian' => 'Armeno', + 'Azeri' => 'Azero', + 'Basque' => 'Basco', + 'Belarusian' => 'Bielorusso', + 'Breton' => 'Bretone', + 'Bulgarian' => 'Bulgaro', + 'Catalan' => 'Catalano', + 'Chinese (Simplified)' => 'Cinese (semplificato)', + 'Chinese (Traditional)' => 'Cinese (tradizionale)', + 'Croato-Serbian (Latin)' => 'Serbo-croato (alfabeto latino)', + 'Czech' => 'Ceco', + 'Danish' => 'Danese', + 'Dutch' => 'Olandese', + 'Dutch (Belgian)' => 'Olandese (Belgio)', + 'English (Australian)' => 'Inglese (Australia)', + 'English (British)' => 'Inglese (Gran Bretagna)', + 'English (Canadian)' => 'Inglese (Canada)', + 'English (U.S.)' => 'Inglese (U.S.A.)', + 'Estonian' => 'Estone', + 'Farsi' => 'Persiano', + 'Finnish' => 'Finlandese', + 'French' => 'Francese', + 'French (Belgian)' => 'Francese (Belgio)', + 'French (Canadian)' => 'Francese (Canada)', + 'French (Swiss)' => 'Francese (Svizzera)', + 'Gaelic' => 'Gaelico', + 'Galician' => 'Galiziano', + 'Georgian' => 'Georgiano', + 'German' => 'Tedesco', + 'German (Austrian)' => 'Tedesco (Austria)', + 'German (Swiss)' => 'Tedesco (Svizzera)', + 'Greek' => 'Greco', + 'Hebrew' => 'Ebraico', + 'Hungarian' => 'Ungherese', + 'Icelandic' => 'Islandese', + 'Indonesian' => 'Indonesiano', + 'Invariant' => 'Invariante', + 'Italian' => 'Italiano', + 'Italian (Swiss)' => 'Italiano (Svizzera)', + 'Japanese' => 'Giapponese', + 'Kazak' => 'Kazako', + 'Korean' => 'Coreano', + 'Kyrgyz' => 'Kirghizo', + 'Latvian' => 'Lettone', + 'Lithuanian' => 'Lituano', + 'Macedonian' => 'Macedone', + 'Mongolian' => 'Mongolo', + 'Nepali' => 'Nepalese', + 'Neutral' => 'Neutrale', + 'Neutral 2' => 'Neutrale 2', + 'Norwegian (Bokml)' => 'Norvegese (BokmÃ¥l)', + 'Norwegian (Nynorsk)' => 'Norvegese (Nynorsk)', + 'Polish' => 'Polacco', + 'Portuguese' => 'Portogese', + 'Portuguese (Brazilian)' => 'Portoghese (Brasile)', + 'Process default' => 'Predefinita del processo', + 'Rhaeto-Romanic' => 'Reto-romanico', + 'Romanian' => 'Rumeno', + 'Russian' => 'Russo', + 'Sanskrit' => 'Sanscrito', + 'Serbo-Croatian (Cyrillic)' => 'Serbo-croato (cirillico)', + 'Slovak' => 'Slovacco', + 'Slovenian' => 'Sloveno', + 'Spanish (Castilian)' => 'Spagnolo (Castiglia)', + 'Spanish (Mexican)' => 'Spagnolo (Messico)', + 'Spanish (Modern)' => 'Spagnolo moderno', + 'Swedish' => 'Svedese', + 'Syriac' => 'Siriaco', + 'Turkish' => 'Turco', + 'Ukrainian' => 'Ucraino', + 'Uzbek' => 'Usbeco', + 'Vietnamese' => 'Vietnamita', + 'Welsh' => 'Gallese', + }, + }, + 'LanguageIdentifier' => 'Identificativo lingua', + 'LanguageList' => 'Lista lingue', + 'LanguageName' => 'Nome lingua', + 'LateralChromaticAberration' => { + PrintConv => { + 'Off' => 'Spento', + 'n/a' => 'n/d', + }, + }, + 'Layout' => { + PrintConv => { + 'Tiles' => 'Tasselli', + }, + }, + 'LegalCopyright' => 'Copyright legali', + 'LegalTrademarks' => 'Marchi legali', + 'Length' => 'Durata', + 'Lens' => 'Obiettivo', + 'Lens35efl' => 'Obiettivo', + 'LensDataVersion' => 'Versione Dati Obiettivo', + 'LensFStops' => 'F-Stops Obiettivo', + 'LensID' => { + Description => 'Obiettivo Utilizzato', + PrintConv => { + 'Ricoh Lens A16 24-85mm F3.5-5.5' => 'Obiettivo Ricoh A16 24-85mm F3.5-5.5', + 'Ricoh Lens P10 28-300mm F3.5-5.6 VC' => 'Obiettivo Ricoh P10 28-300mm F3.5-5.6 VC', + 'Ricoh Lens S10 24-70mm F2.5-4.4 VC' => 'Obiettivo Ricoh S10 24-70mm F2.5-4.4 VC', + }, + }, + 'LensIDNumber' => 'Numero ID Obiettivo', + 'LensInfo' => 'Informazioni obiettivo', + 'LensMake' => 'Marca obiettivo', + 'LensModel' => 'Modello obiettivo', + 'LensSerialNumber' => 'Numero di serie obiettivo', + 'LensShutterLock' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'LensSpec' => 'Obiettivo', + 'LensType' => { + Description => 'Tipo obiettivo', + PrintConv => { + '02 Standard Zoom 5-15mm F2.8-4.5' => '02 Zoom standard 5-15mm F2.8-4.5', + '04 Toy Lens Wide 6.3mm F7.1' => '04 Grandangolare toy 6.3mm F7.1', + '05 Toy Lens Telephoto 18mm F8' => '05 Teleobiettivo toy 18mm F8', + '1.4x Teleconverter' => 'Moltiplicatore di focale 1.4x', + 'None' => 'Nessuno', + 'Sigma 100-300mm F4 EX (APO (D) or D IF)' => 'Sigma 100-300mm F4 EX (APO (D) o D IF)', + }, + }, + 'LevelGaugePitch' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'LevelGaugeRoll' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'LevelOrientation' => { + PrintConv => { + 'Horizontal (normal)' => 'Orizzontale', + 'Rotate 180' => 'Ruota di 180°', + 'Rotate 270 CW' => 'Ruota di 270° in senso orario', + 'Rotate 90 CW' => 'Ruota di 90° senso orario', + }, + }, + 'License' => 'Licenza', + 'LicenseID' => 'ID licenza', + 'LicenseType' => { + PrintConv => { + 'Public Domain' => 'Pubblico dominio', + 'Unknown' => 'Sconosciuto', + }, + }, + 'LightCondition' => 'Condizione luce', + 'LightSource' => { + Description => 'Sorgente di luce', + PrintConv => { + 'Cloudy' => 'Nuvoloso', + 'Cool White Fluorescent' => 'Fluorescente a luce calda', + 'Day White Fluorescent' => 'Fluorescente a luce del giorno bianca', + 'Daylight' => 'Luce del giorno', + 'Daylight Fluorescent' => 'Fluorescente a luce del giorno', + 'Evening Sunlight' => 'Luce solare serale', + 'Fine Weather' => 'Bel tempo', + 'Fluorescent' => 'Fluorescente', + 'ISO Studio Tungsten' => 'Tungsteno studio ISO', + 'Other' => 'Altra Sorgente di Luce', + 'Shade' => 'Ombrato', + 'Standard Light A' => 'Luce standard A', + 'Standard Light B' => 'Luce standard B', + 'Standard Light C' => 'Luce standard C', + 'Tungsten (Incandescent)' => 'Tungsteno (luce incandescente)', + 'Unknown' => 'Sconosciuto', + 'Warm White Fluorescent' => 'Luce fluorescente bianca calda', + 'White Fluorescent' => 'Fluorescente bianca', + }, + }, + 'LightSourceSpecial' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'LightingMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Lightness' => 'Luce', + 'Line' => 'Linea', + 'LineOrder' => { + PrintConv => { + 'Random Y' => 'Casuale Y', + }, + }, + 'LinearResponseLimit' => 'Limite risposta lineare', + 'LinearizationTable' => 'Tabella di linearizzazione', + 'Lines' => 'Linee', + 'LinkAEToAFPoint' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'LinkerVersion' => 'Versione linker', + 'Lit' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'LiveViewAFMethod' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'LiveViewAFSetting' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'LiveViewFocusMode' => { + PrintConv => { + 'Manual' => 'Manuale', + 'n/a' => 'n/d', + }, + }, + 'LiveViewMetering' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'LiveViewShooting' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'LocalDeltaType' => { + PrintConv => { + 'Absolute' => 'Assoluto', + }, + }, + 'LocalizedCameraModel' => 'Modello fotocamera localizzato', + 'Location' => 'Località', + 'LocationKind' => 'Tipo località', + 'LocationName' => 'Nome località', + 'LocationNote' => 'Note località', + 'LongDescription' => 'Descrizione estesa', + 'LongExposureNoiseReduction' => { + Description => 'Espososizione lunga riduzione rumore', + PrintConv => { + 'Off' => 'Spento', + 'Off (65535)' => 'Spento (65535)', + 'On' => 'Attivata', + 'n/a' => 'n/d', + }, + }, + 'LongExposureNoiseReduction2' => { + Description => 'Espososizione lunga riduzione rumore 2', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'LongText' => 'Testo lungo', + 'LoopStyle' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'LuminanceNoiseReduction' => { + PrintConv => { + 'Low' => 'Basso', + 'Off' => 'Spento', + }, + }, + 'Lyricist' => 'Paroliere', + 'Lyrics' => 'Testo', + 'MCUVersion' => 'Versione MCU', + 'MDColorTable' => 'Tabella colori MD', + 'MDFileTag' => 'Tag file MD', + 'MDFileUnits' => 'Unità file MD', + 'MDLabName' => 'Nome lab MD', + 'MDPrepDate' => 'Data prep MD', + 'MDPrepTime' => 'Ora prep MD', + 'MDSampleInfo' => 'Info campione MD', + 'MDScalePixel' => 'Scala pixel MD', + 'MIEVersion' => 'Versione MIE', + 'MIMEType' => 'Tipo mime', + 'MIMETypeOfEncapsulatedDocument' => 'Tipo mime del documento incapsulato', + 'MSDocumentText' => 'Testo documento MS', + 'MSDocumentTextPosition' => 'Posizione testo documento MS', + 'MSPropertySetStorage' => 'Gruppo di memoria proprietà MS', + 'MSStereo' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'MachineType' => { + Description => 'Tipo macchina', + PrintConv => { + 'ARM little endian' => 'ARM little-endian', + 'Alpha AXP (old)' => 'Alpha AXP (precedente)', + 'EFI Byte Code' => 'Byte code EFI', + 'Intel 386 or later, and compatibles' => 'Intel 386 o successivo e compatibili', + 'MIPS little endian (R4000)' => 'MIPS little-endian (R4000)', + 'MIPS little endian WCI v2' => 'MIPS little-endian WCI v2', + 'MIPS with FPU' => 'MIPS con FPU', + 'MIPS16 with FPU' => 'MIPS16 con FPU', + 'Mitsubishi M32R little endian' => 'Mitsubishi M32R little-endian', + 'Motorola 68000 series' => 'Serie Motorola 68000', + 'PowerPC little endian' => 'PowerPC little-endian', + 'PowerPC with floating point support' => 'PowerPC con supporto numeri in in virgola mobile', + 'clr pure MSIL' => 'clr con MSIL puro', + }, + }, + 'Macro' => { + PrintConv => { + 'Manual' => 'Manuale', + 'Normal' => 'Normale', + 'Off' => 'Spento', + 'n/a' => 'n/d', + }, + }, + 'MacroLED' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'MacroMode' => { + PrintConv => { + 'Normal' => 'Normale', + 'Off' => 'Spento', + }, + }, + 'MagicFilter' => { + PrintConv => { + 'Fish Eye' => 'Fish-eye', + 'Fragmented' => 'Frammentato', + 'Gentle Sepia' => 'Seppia leggero', + 'Off' => 'Spento', + 'Reflection' => 'Riflessione', + }, + }, + 'MainDialExposureComp' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Make' => 'Costruttore', + 'MakeAndModel' => 'Marca e Modello', + 'MakerNote' => 'Dati DNG Privati', + 'MakerNoteCanon' => 'Note marca Canon', + 'MakerNoteCasio' => 'Note marca Casio', + 'MakerNoteCasio2' => 'Note marca Casio 2', + 'MakerNoteFujiFilm' => 'Note marca Fuji Film', + 'MakerNoteGE' => 'Note marca GE', + 'MakerNoteGE2' => 'Note marca GE2', + 'MakerNoteHP' => 'Note marca HP', + 'MakerNoteHP2' => 'Note marca HP2', + 'MakerNoteHP4' => 'Note marca HP4', + 'MakerNoteHP6' => 'Note marca HP6', + 'MakerNoteHasselblad' => 'Note marca Hasselblad', + 'MakerNoteISL' => 'Note marca ISL', + 'MakerNoteJVC' => 'Note marca JVC', + 'MakerNoteJVCText' => 'Note marca JVC - Testo', + 'MakerNoteKodak10' => 'Note marca Kodak 10', + 'MakerNoteKodak1a' => 'Note marca Kodak 1a', + 'MakerNoteKodak1b' => 'Note marca Kodak 1b', + 'MakerNoteKodak2' => 'Note marca Kodak 2', + 'MakerNoteKodak3' => 'Note marca Kodak 3', + 'MakerNoteKodak4' => 'Note marca Kodak 4', + 'MakerNoteKodak5' => 'Note marca Kodak 5', + 'MakerNoteKodak6a' => 'Note marca Kodak 6a', + 'MakerNoteKodak6b' => 'Note marca Kodak 6b', + 'MakerNoteKodak7' => 'Note marca Kodak 7', + 'MakerNoteKodak8a' => 'Note marca Kodak 8a', + 'MakerNoteKodak8b' => 'Note marca Kodak 8b', + 'MakerNoteKodak9' => 'Note marca Kodak 9', + 'MakerNoteKodakUnknown' => 'Note marca Kodak sconosciuta', + 'MakerNoteKyocera' => 'Note marca Kyocera', + 'MakerNoteLeica' => 'Note marca Leica', + 'MakerNoteLeica2' => 'Note marca Leica 2', + 'MakerNoteLeica3' => 'Note marca Leica 3', + 'MakerNoteLeica4' => 'Note marca Leica 4', + 'MakerNoteLeica5' => 'Note marca Leica 5', + 'MakerNoteLeica6' => 'Note marca Leica 6', + 'MakerNoteMinolta' => 'Note marca Minolta', + 'MakerNoteMinolta2' => 'Note marca Minolta 2', + 'MakerNoteMinolta3' => 'Note marca Minolta 3', + 'MakerNoteNikon' => 'Note marca Nikon', + 'MakerNoteNikon2' => 'Note marca Nikon 2', + 'MakerNoteNikon3' => 'Note marca Nikon 3', + 'MakerNoteOlympus' => 'Note marca Olympus', + 'MakerNoteOlympus2' => 'Note marca Olympus 2', + 'MakerNotePanasonic' => 'Note marca Panasonic', + 'MakerNotePanasonic2' => 'Note marca Panasonic 2', + 'MakerNotePentax' => 'Note marca Pentax', + 'MakerNotePentax2' => 'Note marca Pentax 2', + 'MakerNotePentax3' => 'Note marca Pentax 3', + 'MakerNotePentax4' => 'Note marca Pentax 4', + 'MakerNotePentax5' => 'Note marca Pentax 5', + 'MakerNotePentax6' => 'Note marca Pentax 6', + 'MakerNotePhaseOne' => 'Note marca Phase One', + 'MakerNoteReconyx' => 'Note marca Reconyx', + 'MakerNoteRicoh' => 'Note marca Ricoh', + 'MakerNoteRicohText' => 'Note marca Ricoh - Testo', + 'MakerNoteSafety' => { + Description => 'Note marca Safety', + PrintConv => { + 'Safe' => 'Sicuro', + 'Unsafe' => 'Non sicuro', + }, + }, + 'MakerNoteSamsung1a' => 'Note marca Samsung 1a', + 'MakerNoteSamsung1b' => 'Note marca Samsung 1b', + 'MakerNoteSamsung2' => 'Note marca Samsung 2', + 'MakerNoteSanyo' => 'Note marca Sanyo', + 'MakerNoteSanyoC4' => 'Note marca Sanyo C4', + 'MakerNoteSanyoPatch' => 'Note marca Sanyo Patch', + 'MakerNoteSigma' => 'Note marca Sigma', + 'MakerNoteSony' => 'Note marca Sony', + 'MakerNoteSony2' => 'Note marca Sony 2', + 'MakerNoteSony3' => 'Note marca Sony 3', + 'MakerNoteSony4' => 'Note marca Sony 4', + 'MakerNoteSonyEricsson' => 'Note marca Sony Ericsson', + 'MakerNoteSonySRF' => 'Note marca Sony SRF', + 'MakerNoteUnknown' => 'Note marca sconosciuta', + 'MakerNoteUnknownText' => 'Note marca sconosciuta - Testo', + 'MakerNoteVersion' => 'Note Versione Costruttore', + 'MakerNotes' => 'Note produttore', + 'ManualFlashOutput' => { + PrintConv => { + 'Low' => 'Basso', + 'n/a' => 'n/d', + }, + }, + 'ManualFocusDistance' => 'Messa a Fuoco Manuale', + 'MarkerID' => 'ID marker', + 'MaskedAreas' => 'Aree mascherate', + 'MasterDocumentID' => 'ID Documento Principale', + 'Matteing' => 'Opacizzazione', + 'MaxAperture' => 'Massima apertura delle lenti', + 'MaxApertureAtMaxFocal' => 'Diaframma massimo alla focale massima', + 'MaxApertureAtMinFocal' => 'Diaframma massimo alla focale minima', + 'MaxApertureValue' => 'Diaframma massimo obiettivo', + 'MaxFocalLength' => 'Lunghezza focale massima', + 'MaxSampleValue' => 'Massimo valore campioni', + 'MeasurementGeometry' => { + PrintConv => { + '0/45 or 45/0' => '0/45 o 45/0', + '0/d or d/0' => '0/d o d/0', + }, + }, + 'MediaBlackPoint' => 'Media Punto Nero', + 'MediaType' => { + PrintConv => { + 'Normal (Music)' => 'Normale (musica)', + }, + }, + 'MediaWhitePoint' => 'Media Punto Bianco', + 'MenuButtonDisplayPosition' => { + PrintConv => { + 'Top' => 'Alto', + }, + }, + 'MenuButtonReturn' => { + PrintConv => { + 'Top' => 'Alto', + }, + }, + 'MeteringMode' => { + Description => 'Modalità misurazione', + PrintConv => { + 'Average' => 'Media', + 'Center-weighted Average' => 'Media centrale ponderata', + 'Center-weighted average' => 'Media centrale ponderata', + 'Multi-segment' => 'Multi-zona', + 'Multi-spot' => 'Multi-punto', + 'Other' => 'Altro', + 'Partial' => 'Parziale', + 'Spot' => 'Punto', + 'Unknown' => 'Sconosciuto', + }, + }, + 'MeteringMode2' => { + PrintConv => { + 'Center-weighted average' => 'Media centrale ponderata', + 'Multi-segment' => 'Multi zona', + }, + }, + 'MeteringMode3' => { + PrintConv => { + 'Center-weighted average' => 'Media centrale ponderata', + 'Multi-segment' => 'Multi zona', + }, + }, + 'MeteringTime' => { + PrintConv => { + 'No Limit' => 'Nessun limite', + }, + }, + 'MinFocalLength' => 'Lunghezza focale minima', + 'MinSampleValue' => 'Minimo valore campioni', + 'MiniatureFilterOrientation' => { + PrintConv => { + 'Horizontal' => 'Orizzontale', + 'Vertical' => 'Verticale', + }, + }, + 'MinoltaQuality' => { + Description => 'Qualità', + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'MirrorLockup' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'ModeNumber' => 'Numero modo', + 'Model' => 'Nome modello fotocamera', + 'Model2' => 'Modello 2', + 'ModelReleaseStatus' => { + PrintConv => { + 'None' => 'Nessuno', + 'Not Applicable' => 'Non applicabile', + }, + }, + 'ModelingFlash' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ModifiedPictureStyle' => { + PrintConv => { + 'Landscape' => 'Orizzontale', + 'None' => 'Nessuno', + 'Portrait' => 'Verticale', + }, + }, + 'ModifiedSaturation' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ModifiedSharpnessFreq' => { + PrintConv => { + 'Low' => 'Basso', + 'n/a' => 'n/d', + }, + }, + 'ModifiedToneCurve' => { + PrintConv => { + 'Manual' => 'Manuale', + }, + }, + 'ModifiedWhiteBalance' => { + PrintConv => { + 'Cloudy' => 'Nuvoloso', + 'Daylight' => 'Luce del giorno', + 'Daylight Fluorescent' => 'Fluorescente a luce del giorno', + 'Fluorescent' => 'Fluorescente', + 'Shade' => 'Ombrato', + 'Tungsten' => 'Tungsteno (luce incandescente)', + }, + }, + 'ModifyDate' => 'Data modifica', + 'MoireFilter' => { + Description => 'Filtro moire', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'MonitorDisplayOff' => { + PrintConv => { + 'Manual' => 'Manuale', + }, + }, + 'MonochromeFilterEffect' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Orange' => 'Arancio', + 'Red' => 'Rosso', + 'Yellow' => 'Giallo', + }, + }, + 'MonochromeLinear' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'MonochromeToning' => { + PrintConv => { + 'None' => 'Nessuno', + }, + }, + 'MonochromeToningEffect' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Purple' => 'Porpora', + 'Sepia' => 'Seppia', + }, + }, + 'MultiBurstMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'MultiControllerWhileMetering' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'MultiExposure' => 'Dati Esposizione Multipla', + 'MultiExposureAutoGain' => { + Description => 'Guadagno Automatico Esposizione Multipla', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'MultiExposureMode' => { + Description => 'Modo Esposizione Multipla', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'MultiExposureShots' => 'Scatti Esposizione Multipla', + 'MultiExposureVersion' => 'Versione Dati Esposizione Multipla', + 'MultiFrameNoiseReduction' => { + Description => 'Riduz. distur. su più fotogr.', + PrintConv => { + 'None' => 'Nessuno', + 'Off' => 'Spento', + 'On' => 'Attivata', + 'n/a' => 'n/d', + }, + }, + 'MultiFunctionLock' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'MultiProfiles' => { + Description => 'Profili multipli', + PrintConv => { + 'JBIG2 Profile M' => 'JBIG2 TIFF FX', + 'N Layer Profile M' => 'Livello N profilo M', + 'Profile C' => 'Profilo C', + 'Profile F' => 'Profilo F', + 'Profile J' => 'Profilo J', + 'Profile L' => 'Profilo L', + 'Profile M' => 'Profilo M', + 'Profile S' => 'Profilo S', + 'Profile T' => 'Profilo T', + 'Resolution/Image Width' => 'Risoluzione/larghezza immagine', + 'Shared Data' => 'Dati condivisi', + }, + }, + 'MultiSelectorLiveView' => { + PrintConv => { + 'Not Used' => 'Non usato', + 'Reset' => 'Reimposta', + 'Zoom On/Off' => 'Zoon sì/no', + }, + }, + 'MultiSelectorPlaybackMode' => { + PrintConv => { + 'Choose Folder' => 'Seleziona cartella', + 'Thumbnail On/Off' => 'Thumbnail sì/no', + 'Zoom On/Off' => 'Zoon sì/no', + }, + }, + 'MultiSelectorShootMode' => { + PrintConv => { + 'Not Used' => 'Non usato', + }, + }, + 'MultipleExposureMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'MultipleExposureSet' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'MusicCDIdentifier' => 'Identificativo CD musicale', + 'MusicianCredits' => 'Info sul musicista', + 'Mute' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'MyColorMode' => { + PrintConv => { + 'Off' => 'Spento', + 'Sepia' => 'Seppia', + 'Vivid' => 'Vivace', + 'Vivid Blue' => 'Blu vivace', + 'Vivid Green' => 'Verde vivace', + }, + }, + 'NDFilter' => { + PrintConv => { + 'Off' => 'Spento', + 'n/a' => 'n/d', + }, + }, + 'NEFCompression' => { + Description => 'Compressione RAW', + PrintConv => { + 'Lossless' => 'Senza perdita', + 'Uncompressed' => 'Non compresso', + }, + }, + 'Name' => 'Nome', + 'NamedColor2' => 'Colore Chiamato 2', + 'NativeDisplayInfo' => 'Info Display Nativo', + 'NeutralDensityFilter' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'NikonCaptureData' => 'Dati Nikon Capture', + 'NikonCaptureVersion' => 'Versione Nikon Capture', + 'NoMemoryCard' => 'Scheda di memoria assente', + 'Noise' => 'Rumore', + 'NoiseFilter' => { + Description => 'Filtro rumore', + PrintConv => { + 'Low' => 'Basso', + 'Off' => 'Spento', + 'n/a' => 'n/d', + }, + }, + 'NoiseProfile' => 'Profilo rumore', + 'NoiseReduction' => { + Description => 'Riduzione rumore', + PrintConv => { + 'Low' => 'Basso', + 'Low (-1)' => 'Basso (-1)', + 'Noise Filter' => 'Filtro rumore', + 'Noise Reduction' => 'Riduzione rumore', + 'Normal' => 'Normale', + 'Off' => 'Spento', + 'Strong' => 'Forte', + 'n/a' => 'n/d', + }, + }, + 'NoiseReduction2' => { + Description => 'Riduzione rumore 2', + PrintConv => { + 'Noise Filter' => 'Filtro rumore', + 'Noise Reduction' => 'Riduzione rumore', + }, + }, + 'NoiseReductionApplied' => 'Riduzione rumore applicata', + 'NoiseReductionIntensity' => 'Intensità riduzione rumore', + 'NoiseReductionMethod' => { + Description => 'Metodo riduzione rumore', + PrintConv => { + 'Faster' => 'Più veloce', + }, + }, + 'NoiseReductionMode' => { + Description => 'Modo riduzione rumore', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'NoiseReductionValue' => 'Valore riduzione rumore', + 'Notes' => 'Note', + 'Now' => 'Adesso', + 'NumChannels' => 'Numero canali', + 'NumSampleFrames' => 'Numero fotogrammi campionamento', + 'NumberOfFocusPoints' => { + PrintConv => { + '11 Points' => '11 punti', + }, + }, + 'NumberofInks' => 'Numero di inchiostri', + 'OKButton' => { + PrintConv => { + 'Not Used' => 'Non usato', + 'Off' => 'Spento', + }, + }, + 'OPIProxy' => { + Description => 'Proxy OPI', + PrintConv => { + 'Higher resolution image does not exist' => 'Immagine a risoluzione maggiore non esistente', + 'Higher resolution image exists' => 'Immagine a risoluzione maggiore esistente', + }, + }, + 'OSVersion' => 'Versione OS', + 'Object' => 'Oggetto', + 'ObjectAttributeReference' => 'Genere intellettuale', + 'ObjectCycle' => { + Description => 'Ciclo oggetto', + PrintConv => { + 'Both Morning and Evening' => 'Entrambi', + 'Evening' => 'Sera', + 'Morning' => 'Mattino', + }, + }, + 'ObjectFileType' => { + Description => 'Tipo file oggetto', + PrintConv => { + 'Core file' => 'File core', + 'Demand paged executable' => 'Eseguibile paginato a richiesta', + 'Dynamic link editor' => 'Editor con collegamenti dinamici', + 'Dynamic link library' => 'Libreria a collegamento dinamico', + 'Dynamically bound bundle' => 'Pacchetto incorporato dinamicamente', + 'Dynamically bound shared library' => 'Libreria condivisa collegata dinamicamente', + 'Executable application' => 'Applicazione eseguibile', + 'Executable file' => 'File eseguibile', + 'Fixed VM shared library' => 'Libreria fissa VM condivisa', + 'Font' => 'Carattere', + 'None' => 'Nessuno', + 'Preloaded executable' => 'Eseguibile precaricato', + 'Relocatable file' => 'File rilocabile', + 'Relocatable object' => 'Oggetto rilocabile', + 'Shared library stub for static linking' => 'Stub libreria condivisa per il collegamenti statici', + 'Shared object file' => 'File con oggetti condivisi', + 'Static library' => 'Libreria statica', + 'Unknown' => 'Sconosciuto', + }, + }, + 'ObjectName' => 'Titolo', + 'ObjectPreviewFileFormat' => { + PrintConv => { + 'Ritzaus Bureau NITF version (RBNITF DTD)' => 'Versione Ritzaus Bureau NITF (RBNITF DTD)', + }, + }, + 'ObjectTypeReference' => 'Riferimento Tipo Oggetto', + 'OffsetSchema' => 'Schema Offset', + 'OldSubfileType' => { + Description => 'Vecchio tipo sotto-file', + PrintConv => { + 'Full-resolution image' => 'Immagine con risoluzione originale', + 'Reduced-resolution image' => 'Immagine a risoluzione ridotta', + 'Single page of multi-page image' => 'Singola pagina di un\'immagine multi-pagina', + }, + }, + 'OneTouchWB' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'OpEndPic' => 'Fine immagine', + 'OpcodeList1' => 'Lista opcode 1', + 'OpcodeList2' => 'Lista opcode 2', + 'OpcodeList3' => 'Lista opcode 3', + 'OpticalZoomMode' => { + PrintConv => { + 'Extended' => 'Esteso', + }, + }, + 'OpticalZoomOn' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Opto-ElectricConvFactor' => 'Fattore di conversione optoelettrica', + 'Orientation' => { + Description => 'Orientamento', + PrintConv => { + 'Horizontal (normal)' => 'Orizzontale (normale)', + 'Mirror horizontal' => 'Rifletti orizzontalmente', + 'Mirror horizontal and rotate 270 CW' => 'Rifletti orizzontalmente e ruota di 270° in senso orario', + 'Mirror horizontal and rotate 90 CW' => 'Rifletti orizzontalmente e ruota di 90° in senso orario', + 'Mirror vertical' => 'Rifletti verticalmente', + 'Rotate 180' => 'Ruota di 180°', + 'Rotate 270 CW' => 'Ruota di 270° in senso orario', + 'Rotate 90 CW' => 'Ruota di 90° senso orario', + 'Tiled' => 'Tassellato', + }, + }, + 'Origin' => 'Origine', + 'OriginCode' => 'Codice origine', + 'OriginPlatform' => { + Description => 'Piattaforma origine', + PrintConv => { + 'Print' => 'Stampa', + }, + }, + 'OriginalAlbum' => 'Album originale', + 'OriginalAlbumTitle' => 'Titolo album originale', + 'OriginalArtist' => 'Artista originale', + 'OriginalFileName' => 'Nome file originale', + 'OriginalLyricist' => 'Paroliere originale', + 'OriginalMedia' => { + PrintConv => { + 'False' => 'Falso', + }, + }, + 'OriginalRawFileData' => 'Dati file raw originale', + 'OriginalRawFileDigest' => 'Sommario file raw originale', + 'OriginalRawFileName' => 'Nome file raw originale', + 'OriginalReleaseTime' => 'Ora di rilascio originale', + 'OriginalReleaseYear' => 'Anno di rilascio originale', + 'OriginalTransmissionReference' => 'ID Lavoro', + 'OriginatingProgram' => 'Programma d\'origine', + 'OtherCodecDescription' => 'Descrizione altro codec', + 'OtherCodecName' => 'Nome altro codec', + 'OtherImageLength' => 'Altra lunghezza immagine', + 'OtherImageStart' => 'Altro inizio immagine', + 'OwnerID' => 'ID proprietario', + 'OwnerName' => 'Nome proprietario', + 'PEFVersion' => 'Versione PEF', + 'PEType' => 'Tipo PE', + 'PackingMethod' => { + PrintConv => { + 'Fast' => 'Veloce', + 'Fastest' => 'Massimamente veloce', + 'Normal' => 'Normale', + }, + }, + 'PageName' => 'Nome pagina', + 'PageNumber' => 'Numero pagina', + 'PanOrientation' => { + PrintConv => { + '[unused]' => '[non usato]', + }, + }, + 'PanasonicRawVersion' => 'Versione raw Panasonic', + 'PanasonicTitle' => 'Titolo Panasonic', + 'PanasonicTitle2' => 'Titolo Panasonic 2', + 'PanoramaSize3D' => { + Description => 'Dimensione panomara 3D', + PrintConv => { + 'Wide' => 'Ampio', + 'n/a' => 'n/d', + }, + }, + 'PartOfSet' => 'Parte del gruppo', + 'PaymentURL' => 'URL pagamento', + 'PeakValue' => 'Valore di picco', + 'PerformerSortOrder' => 'Ordinamento interprete', + 'PeripheralLighting' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'PeripheralLightingSetting' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'PhaseDetectAF' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'PhotoEffect' => { + PrintConv => { + 'Off' => 'Spento', + 'Sepia' => 'Seppia', + 'Vivid' => 'Vivace', + }, + }, + 'PhotoEffects' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'PhotoEffectsType' => { + PrintConv => { + 'None' => 'Nessuno', + 'Sepia' => 'Seppia', + 'Tinted' => 'Tinteggiato', + }, + }, + 'PhotoInfoPlayback' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'PhotometricInterpretation' => { + Description => 'Interpretazione fotometrica', + PrintConv => { + 'BlackIsZero' => 'Nero è zero', + 'Color Filter Array' => 'Array filtro colore', + 'Linear Raw' => 'Raw lineare', + 'Pixar LogL' => 'Pixar LogLuv', + 'Pixar LogLuv' => 'Pixar LogL', + 'RGB Palette' => 'Tavolozza RGB', + 'Transparency Mask' => 'Maschera trasparenza', + 'WhiteIsZero' => 'Bianco è zero', + }, + }, + 'PhotoshopFormat' => { + PrintConv => { + 'Progressive' => 'Progressivo', + }, + }, + 'Picture' => 'Immagine', + 'PictureControl' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'PictureControlActive' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'PictureControlAdjust' => { + PrintConv => { + 'Default Settings' => 'Impostazioni Predefinite', + 'Full Control' => 'Controllo completo', + 'Quick Adjust' => 'Regolazione rapida', + }, + }, + 'PictureDescription' => 'Descrizione immagine', + 'PictureEffect' => { + PrintConv => { + 'Off' => 'Spento', + 'Posterization' => 'Posterizzazione', + 'Posterization B/W' => 'Posterizzazione B&N', + 'Retro Photo' => 'Foto retrò', + }, + }, + 'PictureFinish' => { + PrintConv => { + 'Evening Scene' => 'Scena serale', + 'Portrait' => 'Verticale', + }, + }, + 'PictureFormat' => 'Formato immagine', + 'PictureMIMEType' => 'MIME type immagine', + 'PictureMode' => { + PrintConv => { + '1/2 EV steps' => 'Step 1/2 EV', + '1/3 EV steps' => 'Step 1/3 EV', + 'Aperture-priority AE' => 'Priorità diaframma', + 'Fireworks' => 'Fuochi artificiali', + 'Fisheye' => 'Fish-eye', + 'Flower' => 'Fiore', + 'Forest' => 'Foresta', + 'Green' => 'Verde', + 'Kids' => 'Bambini', + 'Landscape' => 'Orizzontale', + 'Manual' => 'Manuale', + 'No Flash' => 'No flash', + 'Portrait' => 'Verticale', + 'Program' => 'Programma', + 'Program (HyP)' => 'Programma (HyP)', + 'Program AE' => 'Programma AE', + 'Purple' => 'Porpora', + 'Quick Macro' => 'Macro veloce', + 'Red' => 'Rosso', + 'Sepia' => 'Seppia', + 'Shutter speed priority AE' => 'Priorità otturatore AE', + 'Sunset' => 'Tramonto', + 'Text' => 'Testo', + 'Vivid' => 'Vivace', + }, + }, + 'PictureMode2' => { + PrintConv => { + 'Aperture Priority' => 'Priorità diaframma', + 'Manual' => 'Manuale', + 'Program AE' => 'Programma AE', + 'Scene Mode' => 'Modo scena', + 'Shutter Speed Priority' => 'Priorità otturatore', + }, + }, + 'PictureModeBWFilter' => { + PrintConv => { + 'Green' => 'Verde', + 'Orange' => 'Arancio', + 'Red' => 'Rosso', + 'Yellow' => 'Giallo', + 'n/a' => 'n/d', + }, + }, + 'PictureModeEffect' => { + PrintConv => { + 'Low' => 'Basso', + 'n/a' => 'n/d', + }, + }, + 'PictureModeTone' => { + PrintConv => { + 'Green' => 'Verde', + 'Purple' => 'Porpora', + 'Sepia' => 'Seppia', + 'n/a' => 'n/d', + }, + }, + 'PictureStyle' => { + PrintConv => { + 'Landscape' => 'Orizzontale', + 'None' => 'Nessuno', + 'Portrait' => 'Verticale', + }, + }, + 'PictureType' => { + Description => 'Tipo immagine', + PrintConv => { + '32x32 PNG Icon' => 'Icona PNG 32x32', + 'Artist' => 'Artista', + 'Back Cover' => 'Retrocopertina', + 'Band Logo' => 'Logo band', + 'Bright(ly) Colored Fish' => 'Pesci dai vivaci colori', + 'Capture from Movie or Video' => 'Acquisizione da film o video', + 'Composer' => 'Compositore', + 'Conductor' => 'Direttore d\'orchestra', + 'Front Cover' => 'Copertina', + 'Illustration' => 'Illustrazione', + 'Lead Artist' => 'Artista principale', + 'Leaflet' => 'Volantino', + 'Lyricist' => 'Paroliere', + 'Other' => 'Altro', + 'Other Icon' => 'Altra icona', + 'Performance' => 'Interpretazione', + 'Publisher Logo' => 'Logo editore', + 'Recording Session' => 'Sessione registrazione', + 'Recording Studio or Location' => 'Studio/luogo registrazione', + }, + }, + 'PictureWizardMode' => { + PrintConv => { + 'Forest' => 'Foresta', + 'Landscape' => 'Orizzontale', + 'Retro' => 'Retrò', + 'Vivid' => 'Vivace', + 'n/a' => 'n/d', + }, + }, + 'PixelFormat' => { + Description => 'Formato pixel', + PrintConv => { + '112-bit 6 Channels Alpha' => '112-bit 6 canali trasparenza', + '112-bit 7 Channels' => '112-bit 7 canali', + '128-bit 7 Channels Alpha' => '128-bit 7 canali trasparenza', + '128-bit 8 Channels' => '128-bit 8 canali', + '128-bit PRGBA Float' => '128-bit PRGBA virgola mobile', + '128-bit RGB Float' => '128-bit RGB virgola mobile', + '128-bit RGBA Fixed Point' => '128-bit RGBA virgola fissa', + '128-bit RGBA Float' => '128-bit RGBA virgola mobile', + '144-bit 8 Channels Alpha' => '144-bit 8 canali trasparenza', + '16-bit Gray' => '16-bit grigio', + '16-bit Gray Half' => '16-bit grigio metà', + '24-bit 3 Channels' => '24-bit 3 canali', + '32-bit 3 Channels Alpha' => '32-bit 3 canali trasparenza', + '32-bit 4 Channels' => '32-bit 4 canali', + '32-bit Gray Fixed Point' => '32-bit punto grigio virgola fissa', + '32-bit Gray Float' => '32-bit punto grigio virgola mobile', + '40-bit 4 Channels Alpha' => '40-bit 4 canali trasparenza', + '40-bit 5 Channels' => '40-bit 5 canali', + '40-bit CMYK Alpha' => '40-bit CMYK trasparenza', + '48-bit 3 Channels' => '48-bit 3 canali', + '48-bit 5 Channels Alpha' => '48-bit 5 canali trasparenza', + '48-bit 6 Channels' => '48-bit 6 canali', + '48-bit RGB Fixed Point' => '48-bit RGB virgola fissa', + '48-bit RGB Half' => '48-bit RGB metà', + '56-bit 6 Channels Alpha' => '56-bit 6 canali trasparenza', + '56-bit 7 Channels' => '56-bit 7 canali', + '64-bit 3 Channels Alpha' => '64-bit 3 canali trasparenza', + '64-bit 4 Channels' => '64-bit 4 canali', + '64-bit 7 Channels Alpha' => '64-bit 7 canali trasparenza', + '64-bit 8 Channels' => '64-bit 8 canali', + '64-bit RGBA Fixed Point' => '64-bit RGBA virgola fissa', + '64-bit RGBA Half' => '64-bit RGBA mezzi toni', + '72-bit 8 Channels Alpha' => '72-bit 8 canali trasparenza', + '8-bit Gray' => '8-bit grigio', + '80-bit 4 Channels Alpha' => '80-bit 4 canali trasparenza', + '80-bit 5 Channels' => '80-bit 5 canali', + '80-bit CMYK Alpha' => '80-bit CMYK trasparenza', + '96-bit 5 Channels Alpha' => '96-bit 5 canali trasparenza', + '96-bit 6 Channels' => '96-bit 6 canali', + '96-bit RGB Fixed Point' => '96-bit RGB virgola fissa', + 'Black & White' => 'Bianco e nero', + }, + }, + 'PixelIntensityRange' => 'Intervallo intensità pixel', + 'PixelMagicJBIGOptions' => 'Opzioni Pixel Magic JBIG', + 'PixelScale' => 'Scala pixel', + 'PixelUnits' => { + PrintConv => { + 'Unknown' => 'Sconosciuto', + }, + }, + 'PlanarConfiguration' => { + Description => 'Configurazione planare', + PrintConv => { + 'Chunky' => 'Spezzettato', + 'Planar' => 'Planare', + }, + }, + 'PlayCounter' => 'Conteggio esecuzioni', + 'PlayGap' => { + PrintConv => { + 'No Gap' => 'Nessun salto', + }, + }, + 'PlaylistDelay' => 'Attesa playlist', + 'PortraitRefiner' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Position' => 'Posizione', + 'PostScriptFontName' => 'Nome carattere PostScript', + 'PostprocessingFunction' => 'Funzione post-processamento', + 'PowerSource' => 'Fonte alimentazione', + 'PowerUpTime' => 'Ora accensione', + 'Predictor' => { + Description => 'Predittore', + PrintConv => { + 'Horizontal differencing' => 'Differenziazione orizzontale', + 'None' => 'Nessuno', + }, + }, + 'PredictorColumns' => 'Colonne predittore', + 'PredictorConstants' => 'Costanti predittore', + 'PredictorRows' => 'Righe predittore', + 'PreferredFamily' => 'Famiglia preferita', + 'PreferredSubfamily' => 'Sotto-famiglia preferita', + 'PreferredVolume' => 'Volume preferito', + 'Prefs' => 'Preferenze', + 'PresetWhiteBalance' => { + PrintConv => { + 'Camera Setting' => 'Impostazioni fotocamera', + 'Fluorescent' => 'Fluorescente', + 'Shade' => 'Ombrato', + }, + }, + 'PrevFileName' => 'Nome file precedente', + 'PrevSize' => 'Dimensione precedente', + 'PrevUID' => 'UID precedente', + 'Preview' => 'Anteprima', + 'Preview0' => 'Anteprima 0 ', + 'Preview1' => 'Anteprima 1 ', + 'Preview2' => 'Anteprima 2', + 'PreviewApplicationName' => 'Nome applicazione anteprima ', + 'PreviewApplicationVersion' => 'Versione applicazione anteprima ', + 'PreviewButton' => { + Description => 'Pulsante anteprima', + PrintConv => { + 'Flash Off' => 'Flash spento', + 'None' => 'Nessuno', + 'Preview' => 'Anteprima', + 'Virtual Horizon' => 'Orizzonte virtuale', + }, + }, + 'PreviewButtonPlusDials' => { + PrintConv => { + 'Choose Image Area' => 'Seleziona area immagine', + 'None' => 'Nessuno', + }, + }, + 'PreviewColorSpace' => { + Description => 'Spazio colore anteprima', + PrintConv => { + 'Gray Gamma 2.2' => 'Gamma grigio 2.2', + 'Unknown' => 'Sconosciuto', + }, + }, + 'PreviewDate' => 'Data anteprima', + 'PreviewDateTime' => 'Data ora anteprima', + 'PreviewDuration' => 'Durata anteprima', + 'PreviewIFD' => 'Anteprima Puntatore IFD', + 'PreviewImage' => 'Immagine anteprima', + 'PreviewImageBorders' => 'Bordi immagine anteprima', + 'PreviewImageData' => 'Altezza immagine anteprima', + 'PreviewImageHeight' => 'Altezza immagine anteprima', + 'PreviewImageLength' => 'Lunghezza immagine anteprima', + 'PreviewImageName' => 'Nome immagine anteprima', + 'PreviewImageSize' => 'Dimensioni immagine anteprima', + 'PreviewImageStart' => 'Inizio immagine anteprima', + 'PreviewImageType' => 'Tipo immagine anteprima', + 'PreviewImageValid' => { + Description => 'Immagine anteprima valida', + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'PreviewImageWidth' => 'Larghezza immagine anteprima', + 'PreviewInfo' => 'Info anteprima', + 'PreviewQuality' => { + Description => 'Qualtià anteprima', + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'PreviewSettingsDigest' => 'Sommario impostazioni anteprima', + 'PreviewSettingsName' => 'Nome impostazioni anteprima', + 'PrimaryAFPoint' => { + PrintConv => { + '(none)' => '(nessuno)', + 'Bottom' => 'Basso', + 'C6 (Center)' => 'C6 (Centro)', + 'Center' => 'Centro', + 'Far Left' => 'Tutto a sinistra', + 'Far Right' => 'Tutto a destra', + 'Lower-left' => 'Inferiore sinistro', + 'Lower-right' => 'Inferiore destro', + 'Mid-left' => 'Centro/sinistra', + 'Mid-right' => 'Centro/destra', + 'Top' => 'Alto', + 'Upper-left' => 'Superiore sinistro', + 'Upper-right' => 'Superiore destro', + }, + }, + 'PrimaryChromaticities' => 'Cromatismo dei colori primari', + 'PrimaryPlatform' => 'Piattaforma primaria', + 'PrintIM' => 'Stampa Image Matching', + 'PrintIMVersion' => 'Versione PrintIM', + 'PrintPriority' => 'Priorità stampa', + 'PrintQuality' => 'Qualità stampa', + 'PrintScale' => 'Scala stampa', + 'PrinterName' => 'Nome stampante', + 'Priority' => 'Priorità', + 'PrivateBuild' => 'Compilazione privata', + 'ProcessingSoftware' => 'Software di elaborazione', + 'ProducedNotice' => 'Note prodotte', + 'Product' => 'Prodotto', + 'ProductDescription' => 'Descrizione prodotto', + 'ProductID' => 'ID prodotto', + 'ProductName' => 'Nome prodotto', + 'ProductVersion' => 'Versione prodotto', + 'ProductVersionNumber' => 'Numero di versione prodotto', + 'Profession' => 'Professione', + 'Profile' => 'Profilo', + 'ProfileAndLevel' => 'Profilo e livello', + 'ProfileCMMType' => 'Tipo profilo CMM', + 'ProfileCalibrationSig' => 'Segn calibrazione profilo', + 'ProfileClass' => { + Description => 'Classe profilo', + PrintConv => { + 'Abstract Profile' => 'Profilo Astratto', + 'ColorSpace Conversion Profile' => 'Profilo Conversione Spazio Colore', + 'DeviceLink Profile' => 'Profilo Dispositivo di Collegamento', + 'Display Device Profile' => 'Profilo Dispositivo Visualizzazione', + 'Input Device Profile' => 'Profilo dispositivo di Input', + 'NamedColor Profile' => 'Profilo Colore Chiamato', + 'Nikon Input Device Profile (NON-STANDARD!)' => 'Profilo Nikon ("nkpf")', + 'Output Device Profile' => 'Profilo Dispositivo Output', + }, + }, + 'ProfileConnectionSpace' => 'Spazio connessione profilo', + 'ProfileCopyright' => 'Copyright profilo', + 'ProfileCreator' => 'Autore profilo', + 'ProfileDateTime' => 'Data/ora profilo', + 'ProfileDescription' => 'Descrizione del Profilo', + 'ProfileDescriptionML' => 'Descrizione profilo multilinguaggio.', + 'ProfileEmbedPolicy' => { + Description => 'Politica incorporamento profilo', + PrintConv => { + 'Allow Copying' => 'Permetti la copia', + 'Embed if Used' => 'Incorpora se usato', + 'Never Embed' => 'Non incorporare mai', + 'No Restrictions' => 'Nessuna restrizione', + }, + }, + 'ProfileFileSignature' => 'Firma file profilo', + 'ProfileID' => { + Description => 'ID profilo', + PrintConv => { + 'Not Specified' => 'Non specificato', + }, + }, + 'ProfileName' => 'Nome profilo', + 'ProfileSequenceDesc' => 'Descrizione della Sequenza del Profilo', + 'ProfileType' => { + Description => 'Tipo profilo', + PrintConv => { + 'Unspecified' => 'Non specificato', + }, + }, + 'ProfileVersion' => 'Versione profilo', + 'ProgID' => 'ID programma', + 'ProgramISO' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ProgramKind' => 'Tipo di programma', + 'ProgramLine' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'ProgramMode' => { + Description => 'Modo programma', + PrintConv => { + 'None' => 'Nessuno', + 'Portrait' => 'Verticale', + 'Sunset' => 'Tramonto', + 'Text' => 'Testo', + }, + }, + 'ProgramName' => 'Nome programma', + 'ProgramNumber' => 'Numero programma', + 'ProgramVersion' => 'Versione programma', + 'ProgrammingGroupKind' => 'Tipo gruppo programmazione', + 'ProgrammingGroupTitle' => 'Titolo gruppo programmazione', + 'ProgressiveScans' => 'Scansioni progressive', + 'Project' => 'Progetto', + 'ProjectName' => 'Nome progetto', + 'ProjectNumber' => 'Numero progetto', + 'ProjectRef' => 'Rif progetto', + 'ProjectSet' => 'Set progetto', + 'ProjectedCSType' => { + Description => 'Tipo CS proiettato', + PrintConv => { + 'ETRS89 Poland CS2000 zone 5' => 'ETRS89 Poland CS2000 zona 5', + 'ETRS89 Poland CS2000 zone 7' => 'ETRS89 Poland CS2000 zona 7', + 'ETRS89 Poland CS2000 zone 8' => 'ETRS89 Poland CS2000 zona 8', + 'PSAD56 UTM zone 17S' => 'PSAD56 UTM zona 17S', + 'PSAD56 UTM zone 18N' => 'PSAD56 UTM zona 18N', + 'PSAD56 UTM zone 18S' => 'PSAD56 UTM zona 18S', + 'PSAD56 UTM zone 19N' => 'PSAD56 UTM zona 19N', + 'PSAD56 UTM zone 19S' => 'PSAD56 UTM zona 19S', + 'PSAD56 UTM zone 20N' => 'PSAD56 UTM zona 20N', + 'PSAD56 UTM zone 20S' => 'PSAD56 UTM zona 20S', + 'PSAD56 UTM zone 21N' => 'PSAD56 UTM zona 21N', + 'Pulkovo Gauss zone 10' => 'Pulkovo Gauss zona 10', + 'Pulkovo Gauss zone 11' => 'Pulkovo Gauss zona 11', + 'Pulkovo Gauss zone 12' => 'Pulkovo Gauss zona 12', + 'Pulkovo Gauss zone 13' => 'Pulkovo Gauss zona 13', + 'Pulkovo Gauss zone 14' => 'Pulkovo Gauss zona 14', + 'Pulkovo Gauss zone 15' => 'Pulkovo Gauss zona 15', + 'Pulkovo Gauss zone 16' => 'Pulkovo Gauss zona 16', + 'Pulkovo Gauss zone 17' => 'Pulkovo Gauss zona 17', + 'Pulkovo Gauss zone 18' => 'Pulkovo Gauss zona 18', + 'Pulkovo Gauss zone 19' => 'Pulkovo Gauss zona 19', + 'Pulkovo Gauss zone 20' => 'Pulkovo Gauss zona 20', + 'Pulkovo Gauss zone 21' => 'Pulkovo Gauss zona 21', + 'Pulkovo Gauss zone 22' => 'Pulkovo Gauss zona 22', + 'Pulkovo Gauss zone 23' => 'Pulkovo Gauss zona 23', + 'Pulkovo Gauss zone 24' => 'Pulkovo Gauss zona 24', + 'Pulkovo Gauss zone 25' => 'Pulkovo Gauss zona 25', + 'Pulkovo Gauss zone 26' => 'Pulkovo Gauss zona 26', + 'Pulkovo Gauss zone 27' => 'Pulkovo Gauss zona 27', + 'Pulkovo Gauss zone 28' => 'Pulkovo Gauss zona 28', + 'Pulkovo Gauss zone 29' => 'Pulkovo Gauss zona 29', + 'Pulkovo Gauss zone 30' => 'Pulkovo Gauss zona 30', + 'Pulkovo Gauss zone 31' => 'Pulkovo Gauss zona 31', + 'Pulkovo Gauss zone 32' => 'Pulkovo Gauss zona 32', + 'Pulkovo Gauss zone 4' => 'Pulkovo Gauss zona 4', + 'Pulkovo Gauss zone 5' => 'Pulkovo Gauss zona 5', + 'Pulkovo Gauss zone 6' => 'Pulkovo Gauss zona 6', + 'Pulkovo Gauss zone 7' => 'Pulkovo Gauss zona 7', + 'Pulkovo Gauss zone 8' => 'Pulkovo Gauss zona 8', + 'Pulkovo Gauss zone 9' => 'Pulkovo Gauss zona 9', + 'Sudan UTM zone 35N' => 'Sudan UTM zona 35N', + 'Sudan UTM zone 36N' => 'Sudan UTM zona 36N', + }, + }, + 'Projection' => 'Proiezione', + 'ProjectionAlgorithm' => 'Algoritmo proiezione', + 'ProjectionAngle' => 'Angolo proiezione', + 'Projects' => 'Progetti', + 'Properties' => 'Proprietà', + 'PropertyReleaseStatus' => { + PrintConv => { + 'None' => 'Nessuno', + 'Not Applicable' => 'Non applicabile', + }, + }, + 'Protect' => 'Proteggi', + 'Protected' => 'Protetto', + 'ProtocolName' => 'Nome protocollo', + 'Province-State' => 'Provincia/Stato', + 'PublicationDate' => 'Data pubblicazione', + 'PublicationName' => 'Nome pubblicazione', + 'PublicationSets' => 'Set pupplicazione', + 'Publisher' => 'Editore', + 'PublisherURL' => 'URL editore', + 'PurchaseDate' => 'Data acquisto', + 'PurchaserAccountName' => 'Nome account acquirente', + 'PurchaserAccountNumber' => 'Numero account acquirente', + 'PurchaserIdentificationKind' => 'Tipo identificazione acquirente', + 'PurchaserIdentificationValue' => 'Valore identificazione acquirente', + 'PurchasingDepartment' => 'Reparto acquirente', + 'PurchasingOrganizationName' => 'Nome organizzazione acquirente', + 'Purpose' => 'Scopo', + 'PurposeOfReferenceCodeSequence' => 'Scopo sequenza codici riferimento', + 'PyramidLevels' => 'Livelli piramite', + 'Quality' => { + Description => 'Qualità', + PrintConv => { + 'Compressed RAW' => 'RAW compresso', + 'Compressed RAW + JPEG' => 'RAW+JPEG compresso', + 'Extra Fine' => 'Extra fine', + 'Low' => 'Basso', + 'Normal' => 'Normale', + 'RAW + JPEG' => 'RAW+JPEG', + 'n/a' => 'n/d', + }, + }, + 'QualityControlImage' => 'Immagine controllo qualità', + 'QualityFlag' => 'Indicatore qualità', + 'QualityMode' => { + Description => 'Modo qualità', + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'Quantity' => 'Quantità', + 'QuantitySequence' => 'Sequenza quantità', + 'QuantizationDefault' => 'Default quantizzazione', + 'QuantizationMethod' => 'Metodo quantizzazione', + 'QueueStatus' => 'Stato coda', + 'QuickAdjust' => 'Regolazione rapida', + 'QuickControlDialInMeter' => { + PrintConv => { + 'ISO speed' => 'Velocità ISO', + }, + }, + 'QuickEdit' => 'Modifica velote', + 'QuickMaskInfo' => 'Info maschera veloce', + 'QuickShot' => { + Description => 'Scatto veloce', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'R2ABlueCtbl00' => 'R2 A blu Stbl 30', + 'R2ABlueCtbl01' => 'R2 A blu Stbl 29', + 'R2ABlueCtbl02' => 'R2 A blu Stbl 28', + 'R2ABlueCtbl03' => 'R2 A blu Stbl 27', + 'R2ABlueCtbl04' => 'R2 A blu Stbl 26', + 'R2ABlueCtbl05' => 'R2 A blu Stbl 25', + 'R2ABlueCtbl06' => 'R2 A blu Stbl 24', + 'R2ABlueCtbl07' => 'R2 A blu Stbl 23', + 'R2ABlueCtbl08' => 'R2 A blu Stbl 22', + 'R2ABlueCtbl09' => 'R2 A blu Stbl 21', + 'R2ABlueCtbl10' => 'R2 A blu Stbl 20', + 'R2ABlueCtbl11' => 'R2 A blu Stbl 19', + 'R2ABlueCtbl12' => 'R2 A blu Stbl 18', + 'R2ABlueCtbl13' => 'R2 A blu Stbl 17', + 'R2ABlueCtbl14' => 'R2 A blu Stbl 16', + 'R2ABlueCtbl15' => 'R2 A blu Stbl 15', + 'R2ABlueCtbl16' => 'R2 A blu Stbl 14', + 'R2ABlueCtbl17' => 'R2 A blu Stbl 13', + 'R2ABlueCtbl18' => 'R2 A blu Stbl 12', + 'R2ABlueCtbl19' => 'R2 A blu Stbl 11', + 'R2ABlueCtbl20' => 'R2 A blu Stbl 10', + 'R2ABlueCtbl21' => 'R2 A blu Stbl 09', + 'R2ABlueCtbl22' => 'R2 A blu Stbl 08', + 'R2ABlueCtbl23' => 'R2 A blu Stbl 07', + 'R2ABlueCtbl24' => 'R2 A blu Stbl 06', + 'R2ABlueCtbl25' => 'R2 A blu Stbl 05', + 'R2ABlueCtbl26' => 'R2 A blu Stbl 04', + 'R2ABlueCtbl27' => 'R2 A blu Stbl 03', + 'R2ABlueCtbl28' => 'R2 A blu Stbl 02', + 'R2ABlueCtbl29' => 'R2 A blu Stbl 01', + 'R2ABlueCtbl30' => 'R2 A blu Stbl 00', + 'R2ABlueCtbl31' => 'R2 A blu Ctbl 31', + 'R2ABlueStbl00' => 'R2 A blu Ctbl 30', + 'R2ABlueStbl01' => 'R2 A blu Ctbl 29', + 'R2ABlueStbl02' => 'R2 A blu Ctbl 28', + 'R2ABlueStbl03' => 'R2 A blu Ctbl 27', + 'R2ABlueStbl04' => 'R2 A blu Ctbl 26', + 'R2ABlueStbl05' => 'R2 A blu Ctbl 25', + 'R2ABlueStbl06' => 'R2 A blu Ctbl 24', + 'R2ABlueStbl07' => 'R2 A blu Ctbl 23', + 'R2ABlueStbl08' => 'R2 A blu Ctbl 22', + 'R2ABlueStbl09' => 'R2 A blu Ctbl 21', + 'R2ABlueStbl10' => 'R2 A blu Ctbl 20', + 'R2ABlueStbl11' => 'R2 A blu Ctbl 19', + 'R2ABlueStbl12' => 'R2 A blu Ctbl 18', + 'R2ABlueStbl13' => 'R2 A blu Ctbl 17', + 'R2ABlueStbl14' => 'R2 A blu Ctbl 16', + 'R2ABlueStbl15' => 'R2 A blu Ctbl 15', + 'R2ABlueStbl16' => 'R2 A blu Ctbl 14', + 'R2ABlueStbl17' => 'R2 A blu Ctbl 13', + 'R2ABlueStbl18' => 'R2 A blu Ctbl 12', + 'R2ABlueStbl19' => 'R2 A blu Ctbl 11', + 'R2ABlueStbl20' => 'R2 A blu Ctbl 10', + 'R2ABlueStbl21' => 'R2 A blu Ctbl 09', + 'R2ABlueStbl22' => 'R2 A blu Ctbl 08', + 'R2ABlueStbl23' => 'R2 A blu Ctbl 07', + 'R2ABlueStbl24' => 'R2 A blu Ctbl 06', + 'R2ABlueStbl25' => 'R2 A blu Ctbl 05', + 'R2ABlueStbl26' => 'R2 A blu Ctbl 04', + 'R2ABlueStbl27' => 'R2 A blu Ctbl 03', + 'R2ABlueStbl28' => 'R2 A blu Ctbl 02', + 'R2ABlueStbl29' => 'R2 A blu Ctbl 01', + 'R2ABlueStbl30' => 'R2 A blu Ctbl 00', + 'R2ABlueStbl31' => 'R2 A blu Stbl 31', + 'R2AGreenCtbl00' => 'R2 A verde Ctbl 00', + 'R2AGreenCtbl01' => 'R2 A verde Ctbl 01', + 'R2AGreenCtbl02' => 'R2 A verde Ctbl 02', + 'R2AGreenCtbl03' => 'R2 A verde Ctbl 03', + 'R2AGreenCtbl04' => 'R2 A verde Ctbl 04', + 'R2AGreenCtbl05' => 'R2 A verde Ctbl 05', + 'R2AGreenCtbl06' => 'R2 A verde Ctbl 06', + 'R2AGreenCtbl07' => 'R2 A verde Ctbl 07', + 'R2AGreenCtbl08' => 'R2 A verde Ctbl 08', + 'R2AGreenCtbl09' => 'R2 A verde Ctbl 09', + 'R2AGreenCtbl10' => 'R2 A verde Ctbl 10', + 'R2AGreenCtbl11' => 'R2 A verde Ctbl 11', + 'R2AGreenCtbl12' => 'R2 A verde Ctbl 12', + 'R2AGreenCtbl13' => 'R2 A verde Ctbl 13', + 'R2AGreenCtbl14' => 'R2 A verde Ctbl 14', + 'R2AGreenCtbl15' => 'R2 A verde Ctbl 15', + 'R2AGreenCtbl16' => 'R2 A verde Ctbl 16', + 'R2AGreenCtbl17' => 'R2 A verde Ctbl 17', + 'R2AGreenCtbl18' => 'R2 A verde Ctbl 18', + 'R2AGreenCtbl19' => 'R2 A verde Ctbl 19', + 'R2AGreenCtbl20' => 'R2 A verde Ctbl 20', + 'R2AGreenCtbl21' => 'R2 A verde Ctbl 21', + 'R2AGreenCtbl22' => 'R2 A verde Ctbl 22', + 'R2AGreenCtbl23' => 'R2 A verde Ctbl 23', + 'R2AGreenCtbl24' => 'R2 A verde Ctbl 24', + 'R2AGreenCtbl25' => 'R2 A verde Ctbl 25', + 'R2AGreenCtbl26' => 'R2 A verde Ctbl 26', + 'R2AGreenCtbl27' => 'R2 A verde Ctbl 27', + 'R2AGreenCtbl28' => 'R2 A verde Ctbl 28', + 'R2AGreenCtbl29' => 'R2 A verde Ctbl 29', + 'R2AGreenCtbl30' => 'R2 A verde Ctbl 30', + 'R2AGreenCtbl31' => 'R2 A verde Ctbl 31', + 'R2AGreenStbl00' => 'R2 A verde Stbl 00', + 'R2AGreenStbl01' => 'R2 A verde Stbl 01', + 'R2AGreenStbl02' => 'R2 A verde Stbl 02', + 'R2AGreenStbl03' => 'R2 A verde Stbl 03', + 'R2AGreenStbl04' => 'R2 A verde Stbl 04', + 'R2AGreenStbl05' => 'R2 A verde Stbl 05', + 'R2AGreenStbl06' => 'R2 A verde Stbl 06', + 'R2AGreenStbl07' => 'R2 A verde Stbl 07', + 'R2AGreenStbl08' => 'R2 A verde Stbl 08', + 'R2AGreenStbl09' => 'R2 A verde Stbl 09', + 'R2AGreenStbl10' => 'R2 A verde Stbl 10', + 'R2AGreenStbl11' => 'R2 A verde Stbl 11', + 'R2AGreenStbl12' => 'R2 A verde Stbl 12', + 'R2AGreenStbl13' => 'R2 A verde Stbl 13', + 'R2AGreenStbl14' => 'R2 A verde Stbl 14', + 'R2AGreenStbl15' => 'R2 A verde Stbl 15', + 'R2AGreenStbl16' => 'R2 A verde Stbl 16', + 'R2AGreenStbl17' => 'R2 A verde Stbl 17', + 'R2AGreenStbl18' => 'R2 A verde Stbl 18', + 'R2AGreenStbl19' => 'R2 A verde Stbl 19', + 'R2AGreenStbl20' => 'R2 A verde Stbl 20', + 'R2AGreenStbl21' => 'R2 A verde Stbl 21', + 'R2AGreenStbl22' => 'R2 A verde Stbl 22', + 'R2AGreenStbl23' => 'R2 A verde Stbl 23', + 'R2AGreenStbl24' => 'R2 A verde Stbl 24', + 'R2AGreenStbl25' => 'R2 A verde Stbl 25', + 'R2AGreenStbl26' => 'R2 A verde Stbl 26', + 'R2AGreenStbl27' => 'R2 A verde Stbl 27', + 'R2AGreenStbl28' => 'R2 A verde Stbl 28', + 'R2AGreenStbl29' => 'R2 A verde Stbl 29', + 'R2AGreenStbl30' => 'R2 A verde Stbl 30', + 'R2AGreenStbl31' => 'R2 A verde Stbl 31', + 'R2AHeight' => 'R2 A altezza', + 'R2AIntervals' => 'R2 A intervalli', + 'R2ARedCtbl00' => 'R2 A rosso Ctbl 00', + 'R2ARedCtbl01' => 'R2 A rosso Ctbl 01', + 'R2ARedCtbl02' => 'R2 A rosso Ctbl 02', + 'R2ARedCtbl03' => 'R2 A rosso Ctbl 03', + 'R2ARedCtbl04' => 'R2 A rosso Ctbl 04', + 'R2ARedCtbl05' => 'R2 A rosso Ctbl 05', + 'R2ARedCtbl06' => 'R2 A rosso Ctbl 06', + 'R2ARedCtbl07' => 'R2 A rosso Ctbl 07', + 'R2ARedCtbl08' => 'R2 A rosso Ctbl 08', + 'R2ARedCtbl09' => 'R2 A rosso Ctbl 09', + 'R2ARedCtbl10' => 'R2 A rosso Ctbl 10', + 'R2ARedCtbl11' => 'R2 A rosso Ctbl 11', + 'R2ARedCtbl12' => 'R2 A rosso Ctbl 12', + 'R2ARedCtbl13' => 'R2 A rosso Ctbl 13', + 'R2ARedCtbl14' => 'R2 A rosso Ctbl 14', + 'R2ARedCtbl15' => 'R2 A rosso Ctbl 15', + 'R2ARedCtbl16' => 'R2 A rosso Ctbl 16', + 'R2ARedCtbl17' => 'R2 A rosso Ctbl 17', + 'R2ARedCtbl18' => 'R2 A rosso Ctbl 18', + 'R2ARedCtbl19' => 'R2 A rosso Ctbl 19', + 'R2ARedCtbl20' => 'R2 A rosso Ctbl 20', + 'R2ARedCtbl21' => 'R2 A rosso Ctbl 21', + 'R2ARedCtbl22' => 'R2 A rosso Ctbl 22', + 'R2ARedCtbl23' => 'R2 A rosso Ctbl 23', + 'R2ARedCtbl24' => 'R2 A rosso Ctbl 24', + 'R2ARedCtbl25' => 'R2 A rosso Ctbl 25', + 'R2ARedCtbl26' => 'R2 A rosso Ctbl 26', + 'R2ARedCtbl27' => 'R2 A rosso Ctbl 27', + 'R2ARedCtbl28' => 'R2 A rosso Ctbl 28', + 'R2ARedCtbl29' => 'R2 A rosso Ctbl 29', + 'R2ARedCtbl30' => 'R2 A rosso Ctbl 30', + 'R2ARedCtbl31' => 'R2 A rosso Ctbl 31', + 'R2ARedStbl00' => 'R2 A rosso Stbl 00', + 'R2ARedStbl01' => 'R2 A rosso Stbl 01', + 'R2ARedStbl02' => 'R2 A rosso Stbl 02', + 'R2ARedStbl03' => 'R2 A rosso Stbl 03', + 'R2ARedStbl04' => 'R2 A rosso Stbl 04', + 'R2ARedStbl05' => 'R2 A rosso Stbl 05', + 'R2ARedStbl06' => 'R2 A rosso Stbl 06', + 'R2ARedStbl07' => 'R2 A rosso Stbl 07', + 'R2ARedStbl08' => 'R2 A rosso Stbl 08', + 'R2ARedStbl09' => 'R2 A rosso Stbl 09', + 'R2ARedStbl10' => 'R2 A rosso Stbl 10', + 'R2ARedStbl11' => 'R2 A rosso Stbl 11', + 'R2ARedStbl12' => 'R2 A rosso Stbl 12', + 'R2ARedStbl13' => 'R2 A rosso Stbl 13', + 'R2ARedStbl14' => 'R2 A rosso Stbl 14', + 'R2ARedStbl15' => 'R2 A rosso Stbl 15', + 'R2ARedStbl16' => 'R2 A rosso Stbl 16', + 'R2ARedStbl17' => 'R2 A rosso Stbl 17', + 'R2ARedStbl18' => 'R2 A rosso Stbl 18', + 'R2ARedStbl19' => 'R2 A rosso Stbl 19', + 'R2ARedStbl20' => 'R2 A rosso Stbl 20', + 'R2ARedStbl21' => 'R2 A rosso Stbl 21', + 'R2ARedStbl22' => 'R2 A rosso Stbl 22', + 'R2ARedStbl23' => 'R2 A rosso Stbl 23', + 'R2ARedStbl24' => 'R2 A rosso Stbl 24', + 'R2ARedStbl25' => 'R2 A rosso Stbl 25', + 'R2ARedStbl26' => 'R2 A rosso Stbl 26', + 'R2ARedStbl27' => 'R2 A rosso Stbl 27', + 'R2ARedStbl28' => 'R2 A rosso Stbl 28', + 'R2ARedStbl29' => 'R2 A rosso Stbl 29', + 'R2ARedStbl30' => 'R2 A rosso Stbl 30', + 'R2ARedStbl31' => 'R2 A rosso Stbl 31', + 'R2AWidth' => 'R2 A larghezza', + 'R2D65BlueCtbl00' => 'R2 D65 blu Ctbl 00', + 'R2D65BlueCtbl01' => 'R2 D65 blu Ctbl 01', + 'R2D65BlueCtbl02' => 'R2 D65 blu Ctbl 02', + 'R2D65BlueCtbl03' => 'R2 D65 blu Ctbl 03', + 'R2D65BlueCtbl04' => 'R2 D65 blu Ctbl 04', + 'R2D65BlueCtbl05' => 'R2 D65 blu Ctbl 05', + 'R2D65BlueCtbl06' => 'R2 D65 blu Ctbl 06', + 'R2D65BlueCtbl07' => 'R2 D65 blu Ctbl 07', + 'R2D65BlueCtbl08' => 'R2 D65 blu Ctbl 08', + 'R2D65BlueCtbl09' => 'R2 D65 blu Ctbl 09', + 'R2D65BlueCtbl10' => 'R2 D65 blu Ctbl 10', + 'R2D65BlueCtbl11' => 'R2 D65 blu Ctbl 11', + 'R2D65BlueCtbl12' => 'R2 D65 blu Ctbl 12', + 'R2D65BlueCtbl13' => 'R2 D65 blu Ctbl 13', + 'R2D65BlueCtbl14' => 'R2 D65 blu Ctbl 14', + 'R2D65BlueCtbl15' => 'R2 D65 blu Ctbl 15', + 'R2D65BlueCtbl16' => 'R2 D65 blu Ctbl 16', + 'R2D65BlueCtbl17' => 'R2 D65 blu Ctbl 17', + 'R2D65BlueCtbl18' => 'R2 D65 blu Ctbl 18', + 'R2D65BlueCtbl19' => 'R2 D65 blu Ctbl 19', + 'R2D65BlueCtbl20' => 'R2 D65 blu Ctbl 20', + 'R2D65BlueCtbl21' => 'R2 D65 blu Ctbl 21', + 'R2D65BlueCtbl22' => 'R2 D65 blu Ctbl 22', + 'R2D65BlueCtbl23' => 'R2 D65 blu Ctbl 23', + 'R2D65BlueCtbl24' => 'R2 D65 blu Ctbl 24', + 'R2D65BlueCtbl25' => 'R2 D65 blu Ctbl 25', + 'R2D65BlueCtbl26' => 'R2 D65 blu Ctbl 26', + 'R2D65BlueCtbl27' => 'R2 D65 blu Ctbl 27', + 'R2D65BlueCtbl28' => 'R2 D65 blu Ctbl 28', + 'R2D65BlueCtbl29' => 'R2 D65 blu Ctbl 29', + 'R2D65BlueCtbl30' => 'R2 D65 blu Ctbl 30', + 'R2D65BlueCtbl31' => 'R2 D65 blu Ctbl 31', + 'R2D65BlueStbl00' => 'R2 D65 blu Stbl 00', + 'R2D65BlueStbl01' => 'R2 D65 blu Stbl 01', + 'R2D65BlueStbl02' => 'R2 D65 blu Stbl 02', + 'R2D65BlueStbl03' => 'R2 D65 blu Stbl 03', + 'R2D65BlueStbl04' => 'R2 D65 blu Stbl 04', + 'R2D65BlueStbl05' => 'R2 D65 blu Stbl 05', + 'R2D65BlueStbl06' => 'R2 D65 blu Stbl 06', + 'R2D65BlueStbl07' => 'R2 D65 blu Stbl 07', + 'R2D65BlueStbl08' => 'R2 D65 blu Stbl 08', + 'R2D65BlueStbl09' => 'R2 D65 blu Stbl 09', + 'R2D65BlueStbl10' => 'R2 D65 blu Stbl 10', + 'R2D65BlueStbl11' => 'R2 D65 blu Stbl 11', + 'R2D65BlueStbl12' => 'R2 D65 blu Stbl 12', + 'R2D65BlueStbl13' => 'R2 D65 blu Stbl 13', + 'R2D65BlueStbl14' => 'R2 D65 blu Stbl 14', + 'R2D65BlueStbl15' => 'R2 D65 blu Stbl 15', + 'R2D65BlueStbl16' => 'R2 D65 blu Stbl 16', + 'R2D65BlueStbl17' => 'R2 D65 blu Stbl 17', + 'R2D65BlueStbl18' => 'R2 D65 blu Stbl 18', + 'R2D65BlueStbl19' => 'R2 D65 blu Stbl 19', + 'R2D65BlueStbl20' => 'R2 D65 blu Stbl 20', + 'R2D65BlueStbl21' => 'R2 D65 blu Stbl 21', + 'R2D65BlueStbl22' => 'R2 D65 blu Stbl 22', + 'R2D65BlueStbl23' => 'R2 D65 blu Stbl 23', + 'R2D65BlueStbl24' => 'R2 D65 blu Stbl 24', + 'R2D65BlueStbl25' => 'R2 D65 blu Stbl 25', + 'R2D65BlueStbl26' => 'R2 D65 blu Stbl 26', + 'R2D65BlueStbl27' => 'R2 D65 blu Stbl 27', + 'R2D65BlueStbl28' => 'R2 D65 blu Stbl 28', + 'R2D65BlueStbl29' => 'R2 D65 blu Stbl 29', + 'R2D65BlueStbl30' => 'R2 D65 blu Stbl 30', + 'R2D65BlueStbl31' => 'R2 D65 blu Stbl 31', + 'R2D65GreenCtbl00' => 'R2 D65 verde Ctbl 00', + 'R2D65GreenCtbl01' => 'R2 D65 verde Ctbl 01', + 'R2D65GreenCtbl02' => 'R2 D65 verde Ctbl 02', + 'R2D65GreenCtbl03' => 'R2 D65 verde Ctbl 03', + 'R2D65GreenCtbl04' => 'R2 D65 verde Ctbl 04', + 'R2D65GreenCtbl05' => 'R2 D65 verde Ctbl 05', + 'R2D65GreenCtbl06' => 'R2 D65 verde Ctbl 06', + 'R2D65GreenCtbl07' => 'R2 D65 verde Ctbl 07', + 'R2D65GreenCtbl08' => 'R2 D65 verde Ctbl 08', + 'R2D65GreenCtbl09' => 'R2 D65 verde Ctbl 09', + 'R2D65GreenCtbl10' => 'R2 D65 verde Ctbl 10', + 'R2D65GreenCtbl11' => 'R2 D65 verde Ctbl 11', + 'R2D65GreenCtbl12' => 'R2 D65 verde Ctbl 12', + 'R2D65GreenCtbl13' => 'R2 D65 verde Ctbl 13', + 'R2D65GreenCtbl14' => 'R2 D65 verde Ctbl 14', + 'R2D65GreenCtbl15' => 'R2 D65 verde Ctbl 15', + 'R2D65GreenCtbl16' => 'R2 D65 verde Ctbl 16', + 'R2D65GreenCtbl17' => 'R2 D65 verde Ctbl 17', + 'R2D65GreenCtbl18' => 'R2 D65 verde Ctbl 18', + 'R2D65GreenCtbl19' => 'R2 D65 verde Ctbl 19', + 'R2D65GreenCtbl20' => 'R2 D65 verde Ctbl 20', + 'R2D65GreenCtbl21' => 'R2 D65 verde Ctbl 21', + 'R2D65GreenCtbl22' => 'R2 D65 verde Ctbl 22', + 'R2D65GreenCtbl23' => 'R2 D65 verde Ctbl 23', + 'R2D65GreenCtbl24' => 'R2 D65 verde Ctbl 24', + 'R2D65GreenCtbl25' => 'R2 D65 verde Ctbl 25', + 'R2D65GreenCtbl26' => 'R2 D65 verde Ctbl 26', + 'R2D65GreenCtbl27' => 'R2 D65 verde Ctbl 27', + 'R2D65GreenCtbl28' => 'R2 D65 verde Ctbl 28', + 'R2D65GreenCtbl29' => 'R2 D65 verde Ctbl 29', + 'R2D65GreenCtbl30' => 'R2 D65 verde Ctbl 30', + 'R2D65GreenCtbl31' => 'R2 D65 verde Ctbl 31', + 'R2D65GreenStbl00' => 'R2 D65 verde Stbl 00', + 'R2D65GreenStbl01' => 'R2 D65 verde Stbl 01', + 'R2D65GreenStbl02' => 'R2 D65 verde Stbl 02', + 'R2D65GreenStbl03' => 'R2 D65 verde Stbl 03', + 'R2D65GreenStbl04' => 'R2 D65 verde Stbl 04', + 'R2D65GreenStbl05' => 'R2 D65 verde Stbl 05', + 'R2D65GreenStbl06' => 'R2 D65 verde Stbl 06', + 'R2D65GreenStbl07' => 'R2 D65 verde Stbl 07', + 'R2D65GreenStbl08' => 'R2 D65 verde Stbl 08', + 'R2D65GreenStbl09' => 'R2 D65 verde Stbl 09', + 'R2D65GreenStbl10' => 'R2 D65 verde Stbl 10', + 'R2D65GreenStbl11' => 'R2 D65 verde Stbl 11', + 'R2D65GreenStbl12' => 'R2 D65 verde Stbl 12', + 'R2D65GreenStbl13' => 'R2 D65 verde Stbl 13', + 'R2D65GreenStbl14' => 'R2 D65 verde Stbl 14', + 'R2D65GreenStbl15' => 'R2 D65 verde Stbl 15', + 'R2D65GreenStbl16' => 'R2 D65 verde Stbl 16', + 'R2D65GreenStbl17' => 'R2 D65 verde Stbl 17', + 'R2D65GreenStbl18' => 'R2 D65 verde Stbl 18', + 'R2D65GreenStbl19' => 'R2 D65 verde Stbl 19', + 'R2D65GreenStbl20' => 'R2 D65 verde Stbl 20', + 'R2D65GreenStbl21' => 'R2 D65 verde Stbl 21', + 'R2D65GreenStbl22' => 'R2 D65 verde Stbl 22', + 'R2D65GreenStbl23' => 'R2 D65 verde Stbl 23', + 'R2D65GreenStbl24' => 'R2 D65 verde Stbl 24', + 'R2D65GreenStbl25' => 'R2 D65 verde Stbl 25', + 'R2D65GreenStbl26' => 'R2 D65 verde Stbl 26', + 'R2D65GreenStbl27' => 'R2 D65 verde Stbl 27', + 'R2D65GreenStbl28' => 'R2 D65 verde Stbl 28', + 'R2D65GreenStbl29' => 'R2 D65 verde Stbl 29', + 'R2D65GreenStbl30' => 'R2 D65 verde Stbl 30', + 'R2D65GreenStbl31' => 'R2 D65 verde Stbl 31', + 'R2D65Height' => 'R2 D65 altezza', + 'R2D65Intervals' => 'R2 D65 intervalli', + 'R2D65RedCtbl00' => 'R2 D65 rosso Ctbl 00', + 'R2D65RedCtbl01' => 'R2 D65 rosso Ctbl 01', + 'R2D65RedCtbl02' => 'R2 D65 rosso Ctbl 02', + 'R2D65RedCtbl03' => 'R2 D65 rosso Ctbl 03', + 'R2D65RedCtbl04' => 'R2 D65 rosso Ctbl 04', + 'R2D65RedCtbl05' => 'R2 D65 rosso Ctbl 05', + 'R2D65RedCtbl06' => 'R2 D65 rosso Ctbl 06', + 'R2D65RedCtbl07' => 'R2 D65 rosso Ctbl 07', + 'R2D65RedCtbl08' => 'R2 D65 rosso Ctbl 08', + 'R2D65RedCtbl09' => 'R2 D65 rosso Ctbl 09', + 'R2D65RedCtbl10' => 'R2 D65 rosso Ctbl 10', + 'R2D65RedCtbl11' => 'R2 D65 rosso Ctbl 11', + 'R2D65RedCtbl12' => 'R2 D65 rosso Ctbl 12', + 'R2D65RedCtbl13' => 'R2 D65 rosso Ctbl 13', + 'R2D65RedCtbl14' => 'R2 D65 rosso Ctbl 14', + 'R2D65RedCtbl15' => 'R2 D65 rosso Ctbl 15', + 'R2D65RedCtbl16' => 'R2 D65 rosso Ctbl 16', + 'R2D65RedCtbl17' => 'R2 D65 rosso Ctbl 17', + 'R2D65RedCtbl18' => 'R2 D65 rosso Ctbl 18', + 'R2D65RedCtbl19' => 'R2 D65 rosso Ctbl 19', + 'R2D65RedCtbl20' => 'R2 D65 rosso Ctbl 20', + 'R2D65RedCtbl21' => 'R2 D65 rosso Ctbl 21', + 'R2D65RedCtbl22' => 'R2 D65 rosso Ctbl 22', + 'R2D65RedCtbl23' => 'R2 D65 rosso Ctbl 23', + 'R2D65RedCtbl24' => 'R2 D65 rosso Ctbl 24', + 'R2D65RedCtbl25' => 'R2 D65 rosso Ctbl 25', + 'R2D65RedCtbl26' => 'R2 D65 rosso Ctbl 26', + 'R2D65RedCtbl27' => 'R2 D65 rosso Ctbl 27', + 'R2D65RedCtbl28' => 'R2 D65 rosso Ctbl 28', + 'R2D65RedCtbl29' => 'R2 D65 rosso Ctbl 29', + 'R2D65RedCtbl30' => 'R2 D65 rosso Ctbl 30', + 'R2D65RedCtbl31' => 'R2 D65 rosso Ctbl 31', + 'R2D65RedStbl00' => 'R2 D65 rosso Stbl 00', + 'R2D65RedStbl01' => 'R2 D65 rosso Stbl 01', + 'R2D65RedStbl02' => 'R2 D65 rosso Stbl 02', + 'R2D65RedStbl03' => 'R2 D65 rosso Stbl 03', + 'R2D65RedStbl04' => 'R2 D65 rosso Stbl 04', + 'R2D65RedStbl05' => 'R2 D65 rosso Stbl 05', + 'R2D65RedStbl06' => 'R2 D65 rosso Stbl 06', + 'R2D65RedStbl07' => 'R2 D65 rosso Stbl 07', + 'R2D65RedStbl08' => 'R2 D65 rosso Stbl 08', + 'R2D65RedStbl09' => 'R2 D65 rosso Stbl 09', + 'R2D65RedStbl10' => 'R2 D65 rosso Stbl 10', + 'R2D65RedStbl11' => 'R2 D65 rosso Stbl 11', + 'R2D65RedStbl12' => 'R2 D65 rosso Stbl 12', + 'R2D65RedStbl13' => 'R2 D65 rosso Stbl 13', + 'R2D65RedStbl14' => 'R2 D65 rosso Stbl 14', + 'R2D65RedStbl15' => 'R2 D65 rosso Stbl 15', + 'R2D65RedStbl16' => 'R2 D65 rosso Stbl 16', + 'R2D65RedStbl17' => 'R2 D65 rosso Stbl 17', + 'R2D65RedStbl18' => 'R2 D65 rosso Stbl 18', + 'R2D65RedStbl19' => 'R2 D65 rosso Stbl 19', + 'R2D65RedStbl20' => 'R2 D65 rosso Stbl 20', + 'R2D65RedStbl21' => 'R2 D65 rosso Stbl 21', + 'R2D65RedStbl22' => 'R2 D65 rosso Stbl 22', + 'R2D65RedStbl23' => 'R2 D65 rosso Stbl 23', + 'R2D65RedStbl24' => 'R2 D65 rosso Stbl 24', + 'R2D65RedStbl25' => 'R2 D65 rosso Stbl 25', + 'R2D65RedStbl26' => 'R2 D65 rosso Stbl 26', + 'R2D65RedStbl27' => 'R2 D65 rosso Stbl 27', + 'R2D65RedStbl28' => 'R2 D65 rosso Stbl 28', + 'R2D65RedStbl29' => 'R2 D65 rosso Stbl 29', + 'R2D65RedStbl30' => 'R2 D65 rosso Stbl 30', + 'R2D65RedStbl31' => 'R2 D65 rosso Stbl 31', + 'R2D65Width' => 'R2 D65 larghezza', + 'R2TL84BlueCtbl00' => 'R2 TL84 blu Ctbl 00', + 'R2TL84BlueCtbl01' => 'R2 TL84 blu Ctbl 01', + 'R2TL84BlueCtbl02' => 'R2 TL84 blu Ctbl 02', + 'R2TL84BlueCtbl03' => 'R2 TL84 blu Ctbl 03', + 'R2TL84BlueCtbl04' => 'R2 TL84 blu Ctbl 04', + 'R2TL84BlueCtbl05' => 'R2 TL84 blu Ctbl 05', + 'R2TL84BlueCtbl06' => 'R2 TL84 blu Ctbl 06', + 'R2TL84BlueCtbl07' => 'R2 TL84 blu Ctbl 07', + 'R2TL84BlueCtbl08' => 'R2 TL84 blu Ctbl 08', + 'R2TL84BlueCtbl09' => 'R2 TL84 blu Ctbl 09', + 'R2TL84BlueCtbl10' => 'R2 TL84 blu Ctbl 10', + 'R2TL84BlueCtbl11' => 'R2 TL84 blu Ctbl 11', + 'R2TL84BlueCtbl12' => 'R2 TL84 blu Ctbl 12', + 'R2TL84BlueCtbl13' => 'R2 TL84 blu Ctbl 13', + 'R2TL84BlueCtbl14' => 'R2 TL84 blu Ctbl 14', + 'R2TL84BlueCtbl15' => 'R2 TL84 blu Ctbl 15', + 'R2TL84BlueCtbl16' => 'R2 TL84 blu Ctbl 16', + 'R2TL84BlueCtbl17' => 'R2 TL84 blu Ctbl 17', + 'R2TL84BlueCtbl18' => 'R2 TL84 blu Ctbl 18', + 'R2TL84BlueCtbl19' => 'R2 TL84 blu Ctbl 19', + 'R2TL84BlueCtbl20' => 'R2 TL84 blu Ctbl 20', + 'R2TL84BlueCtbl21' => 'R2 TL84 blu Ctbl 21', + 'R2TL84BlueCtbl22' => 'R2 TL84 blu Ctbl 22', + 'R2TL84BlueCtbl23' => 'R2 TL84 blu Ctbl 23', + 'R2TL84BlueCtbl24' => 'R2 TL84 blu Ctbl 24', + 'R2TL84BlueCtbl25' => 'R2 TL84 blu Ctbl 25', + 'R2TL84BlueCtbl26' => 'R2 TL84 blu Ctbl 26', + 'R2TL84BlueCtbl27' => 'R2 TL84 blu Ctbl 27', + 'R2TL84BlueCtbl28' => 'R2 TL84 blu Ctbl 28', + 'R2TL84BlueCtbl29' => 'R2 TL84 blu Ctbl 29', + 'R2TL84BlueCtbl30' => 'R2 TL84 blu Ctbl 30', + 'R2TL84BlueCtbl31' => 'R2 TL84 blu Ctbl 31', + 'R2TL84BlueStbl00' => 'R2 TL84 blu Stbl 00', + 'R2TL84BlueStbl01' => 'R2 TL84 blu Stbl 01', + 'R2TL84BlueStbl02' => 'R2 TL84 blu Stbl 02', + 'R2TL84BlueStbl03' => 'R2 TL84 blu Stbl 03', + 'R2TL84BlueStbl04' => 'R2 TL84 blu Stbl 04', + 'R2TL84BlueStbl05' => 'R2 TL84 blu Stbl 05', + 'R2TL84BlueStbl06' => 'R2 TL84 blu Stbl 06', + 'R2TL84BlueStbl07' => 'R2 TL84 blu Stbl 07', + 'R2TL84BlueStbl08' => 'R2 TL84 blu Stbl 08', + 'R2TL84BlueStbl09' => 'R2 TL84 blu Stbl 09', + 'R2TL84BlueStbl10' => 'R2 TL84 blu Stbl 10', + 'R2TL84BlueStbl11' => 'R2 TL84 blu Stbl 11', + 'R2TL84BlueStbl12' => 'R2 TL84 blu Stbl 12', + 'R2TL84BlueStbl13' => 'R2 TL84 blu Stbl 13', + 'R2TL84BlueStbl14' => 'R2 TL84 blu Stbl 14', + 'R2TL84BlueStbl15' => 'R2 TL84 blu Stbl 15', + 'R2TL84BlueStbl16' => 'R2 TL84 blu Stbl 16', + 'R2TL84BlueStbl17' => 'R2 TL84 blu Stbl 17', + 'R2TL84BlueStbl18' => 'R2 TL84 blu Stbl 18', + 'R2TL84BlueStbl19' => 'R2 TL84 blu Stbl 19', + 'R2TL84BlueStbl20' => 'R2 TL84 blu Stbl 20', + 'R2TL84BlueStbl21' => 'R2 TL84 blu Stbl 21', + 'R2TL84BlueStbl22' => 'R2 TL84 blu Stbl 22', + 'R2TL84BlueStbl23' => 'R2 TL84 blu Stbl 23', + 'R2TL84BlueStbl24' => 'R2 TL84 blu Stbl 24', + 'R2TL84BlueStbl25' => 'R2 TL84 blu Stbl 25', + 'R2TL84BlueStbl26' => 'R2 TL84 blu Stbl 26', + 'R2TL84BlueStbl27' => 'R2 TL84 blu Stbl 27', + 'R2TL84BlueStbl28' => 'R2 TL84 blu Stbl 28', + 'R2TL84BlueStbl29' => 'R2 TL84 blu Stbl 29', + 'R2TL84BlueStbl30' => 'R2 TL84 blu Stbl 30', + 'R2TL84BlueStbl31' => 'R2 TL84 blu Stbl 31', + 'R2TL84GreenCtbl00' => 'R2 TL84 verde Ctbl 00', + 'R2TL84GreenCtbl01' => 'R2 TL84 verde Ctbl 01', + 'R2TL84GreenCtbl02' => 'R2 TL84 verde Ctbl 02', + 'R2TL84GreenCtbl03' => 'R2 TL84 verde Ctbl 03', + 'R2TL84GreenCtbl04' => 'R2 TL84 verde Ctbl 04', + 'R2TL84GreenCtbl05' => 'R2 TL84 verde Ctbl 05', + 'R2TL84GreenCtbl06' => 'R2 TL84 verde Ctbl 06', + 'R2TL84GreenCtbl07' => 'R2 TL84 verde Ctbl 07', + 'R2TL84GreenCtbl08' => 'R2 TL84 verde Ctbl 08', + 'R2TL84GreenCtbl09' => 'R2 TL84 verde Ctbl 09', + 'R2TL84GreenCtbl10' => 'R2 TL84 verde Ctbl 10', + 'R2TL84GreenCtbl11' => 'R2 TL84 verde Ctbl 11', + 'R2TL84GreenCtbl12' => 'R2 TL84 verde Ctbl 12', + 'R2TL84GreenCtbl13' => 'R2 TL84 verde Ctbl 13', + 'R2TL84GreenCtbl14' => 'R2 TL84 verde Ctbl 14', + 'R2TL84GreenCtbl15' => 'R2 TL84 verde Ctbl 15', + 'R2TL84GreenCtbl16' => 'R2 TL84 verde Ctbl 16', + 'R2TL84GreenCtbl17' => 'R2 TL84 verde Ctbl 17', + 'R2TL84GreenCtbl18' => 'R2 TL84 verde Ctbl 18', + 'R2TL84GreenCtbl19' => 'R2 TL84 verde Ctbl 19', + 'R2TL84GreenCtbl20' => 'R2 TL84 verde Ctbl 20', + 'R2TL84GreenCtbl21' => 'R2 TL84 verde Ctbl 21', + 'R2TL84GreenCtbl22' => 'R2 TL84 verde Ctbl 22', + 'R2TL84GreenCtbl23' => 'R2 TL84 verde Ctbl 23', + 'R2TL84GreenCtbl24' => 'R2 TL84 verde Ctbl 24', + 'R2TL84GreenCtbl25' => 'R2 TL84 verde Ctbl 25', + 'R2TL84GreenCtbl26' => 'R2 TL84 verde Ctbl 26', + 'R2TL84GreenCtbl27' => 'R2 TL84 verde Ctbl 27', + 'R2TL84GreenCtbl28' => 'R2 TL84 verde Ctbl 28', + 'R2TL84GreenCtbl29' => 'R2 TL84 verde Ctbl 29', + 'R2TL84GreenCtbl30' => 'R2 TL84 verde Ctbl 30', + 'R2TL84GreenCtbl31' => 'R2 TL84 verde Ctbl 31', + 'R2TL84GreenStbl00' => 'R2 TL84 verde Stbl 00', + 'R2TL84GreenStbl01' => 'R2 TL84 verde Stbl 01', + 'R2TL84GreenStbl02' => 'R2 TL84 verde Stbl 02', + 'R2TL84GreenStbl03' => 'R2 TL84 verde Stbl 03', + 'R2TL84GreenStbl04' => 'R2 TL84 verde Stbl 04', + 'R2TL84GreenStbl05' => 'R2 TL84 verde Stbl 05', + 'R2TL84GreenStbl06' => 'R2 TL84 verde Stbl 06', + 'R2TL84GreenStbl07' => 'R2 TL84 verde Stbl 07', + 'R2TL84GreenStbl08' => 'R2 TL84 verde Stbl 08', + 'R2TL84GreenStbl09' => 'R2 TL84 verde Stbl 09', + 'R2TL84GreenStbl10' => 'R2 TL84 verde Stbl 10', + 'R2TL84GreenStbl11' => 'R2 TL84 verde Stbl 11', + 'R2TL84GreenStbl12' => 'R2 TL84 verde Stbl 12', + 'R2TL84GreenStbl13' => 'R2 TL84 verde Stbl 13', + 'R2TL84GreenStbl14' => 'R2 TL84 verde Stbl 14', + 'R2TL84GreenStbl15' => 'R2 TL84 verde Stbl 15', + 'R2TL84GreenStbl16' => 'R2 TL84 verde Stbl 16', + 'R2TL84GreenStbl17' => 'R2 TL84 verde Stbl 17', + 'R2TL84GreenStbl18' => 'R2 TL84 verde Stbl 18', + 'R2TL84GreenStbl19' => 'R2 TL84 verde Stbl 19', + 'R2TL84GreenStbl20' => 'R2 TL84 verde Stbl 20', + 'R2TL84GreenStbl21' => 'R2 TL84 verde Stbl 21', + 'R2TL84GreenStbl22' => 'R2 TL84 verde Stbl 22', + 'R2TL84GreenStbl23' => 'R2 TL84 verde Stbl 23', + 'R2TL84GreenStbl24' => 'R2 TL84 verde Stbl 24', + 'R2TL84GreenStbl25' => 'R2 TL84 verde Stbl 25', + 'R2TL84GreenStbl26' => 'R2 TL84 verde Stbl 26', + 'R2TL84GreenStbl27' => 'R2 TL84 verde Stbl 27', + 'R2TL84GreenStbl28' => 'R2 TL84 verde Stbl 28', + 'R2TL84GreenStbl29' => 'R2 TL84 verde Stbl 29', + 'R2TL84GreenStbl30' => 'R2 TL84 verde Stbl 30', + 'R2TL84GreenStbl31' => 'R2 TL84 verde Stbl 31', + 'R2TL84Height' => 'R2 TL84 altezza', + 'R2TL84Intervals' => 'R2 TL84 intervalli', + 'R2TL84RedCtbl00' => 'R2 TL84 rosso Ctbl 00', + 'R2TL84RedCtbl01' => 'R2 TL84 rosso Ctbl 01', + 'R2TL84RedCtbl02' => 'R2 TL84 rosso Ctbl 02', + 'R2TL84RedCtbl03' => 'R2 TL84 rosso Ctbl 03', + 'R2TL84RedCtbl04' => 'R2 TL84 rosso Ctbl 04', + 'R2TL84RedCtbl05' => 'R2 TL84 rosso Ctbl 05', + 'R2TL84RedCtbl06' => 'R2 TL84 rosso Ctbl 06', + 'R2TL84RedCtbl07' => 'R2 TL84 rosso Ctbl 07', + 'R2TL84RedCtbl08' => 'R2 TL84 rosso Ctbl 08', + 'R2TL84RedCtbl09' => 'R2 TL84 rosso Ctbl 09', + 'R2TL84RedCtbl10' => 'R2 TL84 rosso Ctbl 10', + 'R2TL84RedCtbl11' => 'R2 TL84 rosso Ctbl 11', + 'R2TL84RedCtbl12' => 'R2 TL84 rosso Ctbl 12', + 'R2TL84RedCtbl13' => 'R2 TL84 rosso Ctbl 13', + 'R2TL84RedCtbl14' => 'R2 TL84 rosso Ctbl 14', + 'R2TL84RedCtbl15' => 'R2 TL84 rosso Ctbl 15', + 'R2TL84RedCtbl16' => 'R2 TL84 rosso Ctbl 16', + 'R2TL84RedCtbl17' => 'R2 TL84 rosso Ctbl 17', + 'R2TL84RedCtbl18' => 'R2 TL84 rosso Ctbl 18', + 'R2TL84RedCtbl19' => 'R2 TL84 rosso Ctbl 19', + 'R2TL84RedCtbl20' => 'R2 TL84 rosso Ctbl 20', + 'R2TL84RedCtbl21' => 'R2 TL84 rosso Ctbl 21', + 'R2TL84RedCtbl22' => 'R2 TL84 rosso Ctbl 22', + 'R2TL84RedCtbl23' => 'R2 TL84 rosso Ctbl 23', + 'R2TL84RedCtbl24' => 'R2 TL84 rosso Ctbl 24', + 'R2TL84RedCtbl25' => 'R2 TL84 rosso Ctbl 25', + 'R2TL84RedCtbl26' => 'R2 TL84 rosso Ctbl 26', + 'R2TL84RedCtbl27' => 'R2 TL84 rosso Ctbl 27', + 'R2TL84RedCtbl28' => 'R2 TL84 rosso Ctbl 28', + 'R2TL84RedCtbl29' => 'R2 TL84 rosso Ctbl 29', + 'R2TL84RedCtbl30' => 'R2 TL84 rosso Ctbl 30', + 'R2TL84RedCtbl31' => 'R2 TL84 rosso Ctbl 31', + 'R2TL84RedStbl00' => 'R2 TL84 rosso Stbl 00', + 'R2TL84RedStbl01' => 'R2 TL84 rosso Stbl 01', + 'R2TL84RedStbl02' => 'R2 TL84 rosso Stbl 02', + 'R2TL84RedStbl03' => 'R2 TL84 rosso Stbl 03', + 'R2TL84RedStbl04' => 'R2 TL84 rosso Stbl 04', + 'R2TL84RedStbl05' => 'R2 TL84 rosso Stbl 05', + 'R2TL84RedStbl06' => 'R2 TL84 rosso Stbl 06', + 'R2TL84RedStbl07' => 'R2 TL84 rosso Stbl 07', + 'R2TL84RedStbl08' => 'R2 TL84 rosso Stbl 08', + 'R2TL84RedStbl09' => 'R2 TL84 rosso Stbl 09', + 'R2TL84RedStbl10' => 'R2 TL84 rosso Stbl 10', + 'R2TL84RedStbl11' => 'R2 TL84 rosso Stbl 11', + 'R2TL84RedStbl12' => 'R2 TL84 rosso Stbl 12', + 'R2TL84RedStbl13' => 'R2 TL84 rosso Stbl 13', + 'R2TL84RedStbl14' => 'R2 TL84 rosso Stbl 14', + 'R2TL84RedStbl15' => 'R2 TL84 rosso Stbl 15', + 'R2TL84RedStbl16' => 'R2 TL84 rosso Stbl 16', + 'R2TL84RedStbl17' => 'R2 TL84 rosso Stbl 17', + 'R2TL84RedStbl18' => 'R2 TL84 rosso Stbl 18', + 'R2TL84RedStbl19' => 'R2 TL84 rosso Stbl 19', + 'R2TL84RedStbl20' => 'R2 TL84 rosso Stbl 20', + 'R2TL84RedStbl21' => 'R2 TL84 rosso Stbl 21', + 'R2TL84RedStbl22' => 'R2 TL84 rosso Stbl 22', + 'R2TL84RedStbl23' => 'R2 TL84 rosso Stbl 23', + 'R2TL84RedStbl24' => 'R2 TL84 rosso Stbl 24', + 'R2TL84RedStbl25' => 'R2 TL84 rosso Stbl 25', + 'R2TL84RedStbl26' => 'R2 TL84 rosso Stbl 26', + 'R2TL84RedStbl27' => 'R2 TL84 rosso Stbl 27', + 'R2TL84RedStbl28' => 'R2 TL84 rosso Stbl 28', + 'R2TL84RedStbl29' => 'R2 TL84 rosso Stbl 29', + 'R2TL84RedStbl30' => 'R2 TL84 rosso Stbl 30', + 'R2TL84RedStbl31' => 'R2 TL84 rosso Stbl 31', + 'R2TL84Width' => 'R2 TL84 larghezza', + 'RAFVersion' => 'Versione RAF', + 'RGBCurveLimits' => 'Limiti curva RGB', + 'RGBCurvePoints' => 'Punti curva RGB', + 'RadialPosition' => 'Posizione radiale', + 'RandomIndexMetadata' => 'Indice casuale metadati', + 'RandomIndexMetadataV10' => 'Indice casuale metadati V10', + 'RangeFinder' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'RasterPadding' => { + PrintConv => { + 'Long Sector' => 'Settore lungo', + 'Long Word' => 'Parola lunga', + 'Sector' => 'Settore', + 'Word' => 'Parola', + }, + }, + 'RasterizedCaption' => 'Didascalia rasterizzata', + 'Rating' => { + Description => 'Valutazione', + PrintConv => { + 'Explicit' => 'Esplicito', + }, + }, + 'RatingPercent' => 'Valutazione percentuale', + 'RawAndJpgRecording' => { + Description => 'Registrazione raw e jpg', + PrintConv => { + 'Off' => 'Spento', + 'RAW (DNG, Best)' => 'RAW (DNG, migliore)', + 'RAW (DNG, Better)' => 'RAW (DNG, più buona)', + 'RAW (DNG, Good)' => 'RAW (DNG, buona)', + 'RAW (PEF, Best)' => 'RAW (PEF, migliore)', + 'RAW (PEF, Better)' => 'RAW (PEF, più buona)', + 'RAW (PEF, Good)' => 'RAW (PEF, buona)', + 'RAW+JPEG (DNG, Best)' => 'RAW+JPEG (DNG, migliore)', + 'RAW+JPEG (DNG, Better)' => 'RAW+JPEG (DNG, più buona)', + 'RAW+JPEG (DNG, Good)' => 'RAW+JPEG (DNG, buona)', + 'RAW+JPEG (PEF, Best)' => 'RAW+JPEG (PEF, migliore)', + 'RAW+JPEG (PEF, Better)' => 'RAW+JPEG (PEF, più buona)', + 'RAW+JPEG (PEF, Good)' => 'RAW+JPEG (PEF, buona)', + }, + }, + 'RawColorAdj' => { + PrintConv => { + 'Shot Settings' => 'Impostazioni scatto', + }, + }, + 'RawDataOffset' => 'Offset dati raw', + 'RawDataUniqueID' => 'ID unico dati raw', + 'RawDepth' => 'Profondità raw', + 'RawDevAutoGradation' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'RawDevEditStatus' => { + PrintConv => { + 'Original' => 'Originale', + }, + }, + 'RawDevNoiseReduction' => { + PrintConv => { + 'Noise Filter' => 'Filtro rumore', + 'Noise Reduction' => 'Riduzione rumore', + }, + }, + 'RawDevPMPictureTone' => { + PrintConv => { + 'Green' => 'Verde', + 'Purple' => 'Porpora', + 'Sepia' => 'Seppia', + }, + }, + 'RawDevPM_BWFilter' => { + PrintConv => { + 'Green' => 'Verde', + 'Orange' => 'Arancio', + 'Red' => 'Rosso', + 'Yellow' => 'Giallo', + }, + }, + 'RawDevPictureMode' => { + PrintConv => { + 'Sepia' => 'Seppia', + 'Vivid' => 'Vivace', + }, + }, + 'RawDevSettings' => { + PrintConv => { + 'Noise Reduction' => 'Riduzione rumore', + 'Saturation' => 'Saturazione', + 'Sharpness' => 'Nitidezza', + }, + }, + 'RawFile' => 'File raw', + 'RawFileName' => 'Nome file raw', + 'RawImageCenter' => 'Centro immagine raw', + 'RawImageDigest' => 'Sommario file raw', + 'RawImageFullSize' => 'Dimensione finale immagine raw', + 'RawImageHeight' => 'Altezza immagine raw', + 'RawImageMode' => 'Modo immagine raw', + 'RawImageSegmentation' => 'Segmentazione file raw', + 'RawImageSize' => 'Dimensione immagine raw', + 'RawImageWidth' => 'Larghezza immagine raw', + 'RawInfoVersion' => 'Info versione raw', + 'RawJpgHeight' => 'Altezza jpg raw', + 'RawJpgQuality' => { + Description => 'Qualità jpg raw', + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'RawJpgSize' => { + Description => 'Dimensione jpg raw', + PrintConv => { + 'Postcard' => 'Cartolina', + }, + }, + 'RawJpgWidth' => 'Larghezza jpg raw', + 'ReadStatus' => 'Stato lettura', + 'RecommendedExposureIndex' => 'Indice esposizione raccomandato', + 'RecordDisplay' => { + PrintConv => { + 'Horizontal' => 'Orizzontale', + }, + }, + 'RecordMode' => { + Description => 'Modo registrazione', + PrintConv => { + 'Aperture Priority' => 'Priorità diaframma', + 'Manual' => 'Manuale', + 'Program AE' => 'Programma AE', + 'Shutter Priority' => 'Priorità otturatore', + }, + }, + 'RecordShutterRelease' => { + PrintConv => { + 'Press start, press stop' => 'Premi start, premi stop', + }, + }, + 'RecordedFormat' => 'Formato registrato', + 'RecordingDates' => 'Date registrazioni', + 'RecordingLabelName' => 'Nome etichetta registrazione', + 'RecordingMode' => { + Description => 'Modo registrazione', + PrintConv => { + 'Landscape' => 'Orizzontale', + 'Manual' => 'Manuale', + 'Portrait' => 'Verticale', + }, + }, + 'RecordingTime' => 'Tempo registrazione', + 'RedAdjust' => 'Correzione rosso', + 'RedBalance' => 'Bilanciamento del rosso', + 'RedCurveLimits' => 'Limiti curva rosso', + 'RedCurvePoints' => 'Punti curva rosso', + 'RedEyeCorrection' => { + Description => 'Correzione occhi rossi', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'RedEyeInfo' => 'Info occhi rossi', + 'RedEyeReduction' => { + Description => 'Riduzione occhi rossi', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'RedGain' => 'Guadagno rosso', + 'RedHue' => 'Tinta rosso', + 'RedMatrixColumn' => 'Colonna matrice rosso', + 'RedPaletteColorTableData' => 'Dati tabella tavolozza colori rosso', + 'RedPaletteColorTableDescriptor' => 'Descrittore tabella tavolozza colori rosso', + 'RedPrimary' => 'Rosso primario', + 'RedSample' => 'Campione rosso', + 'RedSaturation' => 'Saturazione rosso', + 'RedTRC' => 'Curva riproduzione tono rosso', + 'ReductionMatrix1' => 'Matrice di riduzione 1', + 'ReductionMatrix2' => 'Matrice di riduzione 2', + 'Reference' => 'Riferimento', + 'Reference1' => 'Riferimento 1', + 'Reference2' => 'Riferimento 2', + 'Reference3' => 'Riferimento 3', + 'Reference4' => 'Riferimento 4', + 'Reference5' => 'Riferimento 5', + 'Reference6' => 'Riferimento 6', + 'ReferenceBlackWhite' => 'Coppia valori riferimento di bianco e nero', + 'ReferenceBlock' => 'Blocco di riferimento', + 'ReferenceChannels' => 'Canali di riferimento', + 'ReferenceCoordinates' => 'Coordinate di riferimento', + 'ReferenceDate' => 'Data di riferimento', + 'ReferenceNumber' => 'Numero di riferimento', + 'ReferencePixelPhysicalValueX' => 'Valore fisico valore X pixel di riferimento', + 'ReferencePixelPhysicalValueY' => 'Valore fisico valore Y pixel di riferimento', + 'ReferencePixelX0' => 'Pixel X0 di riferimento', + 'ReferencePixelY0' => 'Pixel Y0 di riferimento', + 'ReferencePriority' => 'Priorità riferimento', + 'ReferenceService' => 'Riferimento di servizio', + 'ReferenceToRecordedSound' => 'Riferimento a suono registrato', + 'ReferenceVirtual' => 'Riferimento virtuale', + 'Refresh' => 'Aggiorna', + 'RegionCode' => 'Codice regione', + 'RegionInfo' => 'Info regione', + 'RegionList' => 'Elenco regioni', + 'RegionName' => 'Nome regione', + 'RegionOfResidence' => 'Regione di residenza', + 'RelatedImageFileFormat' => 'Formato file immagine correlato', + 'RelatedImageHeight' => 'Numero delle righe dei dati immagine', + 'RelatedImageWidth' => 'Larghezza immagine correlata', + 'RelatedSoundFile' => 'File audio relativo', + 'Relation' => 'Relazione', + 'RelativeVolumeAdjustment' => 'Correzione relativa volume', + 'ReleaseButtonToUseDial' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'ReleaseDate' => 'Data di rilascio', + 'ReleaseMode' => { + PrintConv => { + 'Normal' => 'Normale', + 'n/a' => 'n/d', + }, + }, + 'ReleaseTime' => 'Ora di rilascio', + 'RenderingIntent' => { + PrintConv => { + 'ICC-Absolute Colorimetric' => 'Colorimetrico Assoluto', + 'Media-Relative Colorimetric' => 'Colorimetrico Relativo', + 'Perceptual' => 'Percentuale', + 'Saturation' => 'Saturazione', + }, + }, + 'RenderingType3D' => 'Tipo resa 3D', + 'RepeatingFlashCount' => 'Conteggio ripetizione flash', + 'RepeatingFlashOutput' => 'Uscita ripetizione flash', + 'RepeatingFlashRate' => 'Frequenza ripetizione flash', + 'ReplyTo' => 'Rispondi a', + 'Resaved' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'Reserved' => 'Riservato', + 'Reserved1' => 'Riservato 1', + 'Resolution' => 'Risoluzione', + 'ResolutionMode' => 'Modo risoluzione', + 'ResolutionUnit' => { + Description => 'Unità risoluzione', + PrintConv => { + 'None' => 'Nessuno', + 'inches' => 'Pollici', + }, + }, + 'ResonantNucleus' => 'Nucleo risonante', + 'ResourceID' => 'ID risorsa', + 'ResourceType' => 'Tipo risorsa', + 'Resources' => 'Risorse', + 'ResourcesNeeded' => 'Risorse richieste', + 'Restrictions' => 'Restrizioni', + 'ResultsID' => 'ID risultati', + 'RetouchHistory' => { + Description => 'Cronologia ritocco', + PrintConv => { + 'Fisheye' => 'Fish-eye', + 'None' => 'Nessuno', + 'Quick Retouch' => 'Ritocco veloce', + 'Red Eye' => 'Occhi rossi', + 'Red Intensifier' => 'Intensificatore rosso', + 'Resize' => 'Ridimensione', + 'Sepia' => 'Seppia', + 'Straighten' => 'Raddrizza', + }, + }, + 'RetouchInfo' => 'Info ritocco', + 'Reuse' => { + Description => 'Riutilizza', + PrintConv => { + 'Not Applicable' => 'Non applicabile', + }, + }, + 'ReverseIndicators' => 'Inverti indicatori', + 'ReversedByteOrder' => 'Ordine byte invertito', + 'Revision' => 'Revisione', + 'RevisionDate' => 'Data revisione', + 'RevisionNumber' => 'Numero revisione', + 'RicohDate' => 'Data Ricoh', + 'RicohImageHeight' => 'Altezza immagine Ricoh', + 'RicohImageWidth' => 'Larghezza immagine Ricoh', + 'RicohRDC2' => 'RDC2 Ricoh', + 'RightAscension' => 'Ascensione retta', + 'Robots' => 'Robot', + 'RoleName' => 'Nome ruolo', + 'RoomNumber' => 'Numero stanza', + 'RoomOrSuiteName' => 'Numero stanza/suite', + 'RootFormatVersion' => 'Versione formato radice', + 'Rotation' => { + Description => 'Rotazione', + PrintConv => { + 'Horizontal' => 'Orizzontale', + 'Horizontal (Normal)' => 'Orizzontale (normale)', + 'Horizontal (normal)' => 'Orizzontale (normale)', + 'Rotate 180' => 'Ruota di 180°', + 'Rotate 270 CW' => 'Ruota di 270° in senso orario', + 'Rotate 90 CW' => 'Ruota di 90° senso orario', + 'Rotated 180' => 'Ruotato di 180°', + 'Rotated 270 CW' => 'Ruotato di 270° in senso orario', + 'Rotated 90 CW' => 'Ruotato di 90° in senso orario', + }, + }, + 'RotationAngle' => 'Angolo rotazione', + 'RotationDirection' => 'Direzione rotazione', + 'RowsPerStrip' => 'Righe per striscia', + 'RunWindow' => { + PrintConv => { + 'Normal' => 'Normale', + 'Restore' => 'Ripristina', + }, + }, + 'SEMInfo' => 'Info SEM', + 'SPIFFVersion' => 'Versione SPIFF', + 'SRAWQuality' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SRActive' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'SRGBRendering' => { + PrintConv => { + 'Saturation' => 'Saturazione', + }, + }, + 'SRResult' => { + PrintConv => { + 'Not ready' => 'Non pronto', + }, + }, + 'SVGVersion' => 'Versione SVG', + 'SafetyShiftInAvOrTv' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'SampleBits' => 'Bit campione', + 'SampleFormat' => { + Description => 'Formato campioni', + PrintConv => { + 'Complex float' => 'Virgola mobile immaginario', + 'Complex int' => 'Intero immaginario', + 'Float' => 'Virgola mobile', + 'Signed' => 'Con segno', + 'Undefined' => 'Non definito', + 'Unsigned' => 'Senza segno', + }, + }, + 'SampleIndex' => 'Indice campione', + 'SampleRate' => 'Frequenza campionamento', + 'SampleRate2' => 'Frequenza campionamento 2', + 'SampleSize' => 'Dimensione campione', + 'SampleSizes' => 'Dimensioni campione', + 'SampleStructure' => 'Struttura d\'esempio', + 'SampleText' => 'Testo d\'esempio', + 'SamplesPerPixel' => 'Campioni per pixel', + 'SamplesPerPixelUsed' => 'Campioni per pixel', + 'SamplingFrequency' => 'Frequenza campionamento', + 'Saturation' => { + Description => 'Saturazione', + PrintConv => { + 'High' => 'Alta', + 'Low' => 'Basso', + 'None' => 'Nessuno', + 'None (B&W)' => 'Nessuno (B&N)', + 'Normal' => 'Normale', + 'Vivid' => 'Vivace', + }, + }, + 'SaturationAdj' => 'Correzione saturazione', + 'SaturationFaithful' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SaturationLandscape' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SaturationMonochrome' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SaturationNeutral' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SaturationPortrait' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SaturationStandard' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SaturationUnknown' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SaturationUserDef1' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SaturationUserDef2' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SaturationUserDef3' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ScanImageEnhancer' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ScanningDirection' => { + PrintConv => { + 'R-L, Bottom-Top' => 'D-S, basso-alto', + 'R-L, Top-Bottom' => 'D-S, alto-basso', + }, + }, + 'Scene' => 'Scena', + 'SceneArea' => 'Area scena', + 'SceneCaptureType' => { + Description => 'Tipo cattura scena', + PrintConv => { + 'Landscape' => 'Orizzontale', + 'Night' => 'Notte', + 'Portrait' => 'Verticale', + }, + }, + 'SceneMode' => { + Description => 'Modo scena', + PrintConv => { + '3D Sweep Panorama' => '3D', + 'Anti Motion Blur' => 'Riduz. sfocat. movim.', + 'Aperture Priority' => 'Priorità diaframma', + 'Auto' => 'Automatico', + 'Children' => 'Bambini', + 'Cont. Priority AE' => 'AE prior. avan.cont.', + 'Fireworks' => 'Fuochi artificiali', + 'Handheld Night Shot' => 'Foto nott. senza trepp.', + 'Landscape' => 'Orizzontale', + 'Manual' => 'Manuale', + 'Night Portrait' => 'Rit. notturno', + 'Night Scene' => 'Visione notturna', + 'Night View/Portrait' => 'Visione/Ritratto notturni', + 'Normal' => 'Normale', + 'Off' => 'Spento', + 'Portrait' => 'Verticale', + 'Program' => 'Programma', + 'Scenery' => 'Paesaggio', + 'Shutter Priority' => 'Priorità otturatore', + 'Sports' => 'Evento sportivo', + 'Sunset' => 'Tramonto', + 'Sweep Panorama' => 'Panoramica ad arco', + 'Text' => 'Testo', + 'Vivid' => 'Vivace', + 'n/a' => 'n/d', + }, + }, + 'SceneModeUsed' => { + Description => 'Modo scena usato', + PrintConv => { + 'Aperture Priority' => 'Priorità diaframma', + 'Children' => 'Bambini', + 'Fireworks' => 'Fuochi artificiali', + 'Landscape' => 'Orizzontale', + 'Manual' => 'Manuale', + 'Portrait' => 'Verticale', + 'Program' => 'Programma', + 'Shutter Priority' => 'Priorità otturatore', + 'Sunset' => 'Tramonto', + 'Text' => 'Testo', + }, + }, + 'SceneNumber' => 'Numero scena', + 'SceneSelect' => { + PrintConv => { + 'Night' => 'Scena notturna', + 'Off' => 'Spento', + }, + }, + 'SceneType' => { + Description => 'Tipo scena', + PrintConv => { + 'Directly photographed' => 'Immagine fotografata direttamente', + }, + }, + 'School' => 'Scuola', + 'ScreenTips' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Section' => 'Sezione', + 'SectorSize' => 'Dimensione settore', + 'Security' => { + Description => 'Sicurezza', + PrintConv => { + 'None' => 'Nessuno', + }, + }, + 'SecurityClassification' => { + Description => 'Classificazione sicurezza', + PrintConv => { + 'Confidential' => 'Confidenziale', + 'Restricted' => 'Riservato', + 'Secret' => 'Segreto', + 'Top Secret' => 'Massima segretezza', + 'Unclassified' => 'Non classificato', + }, + }, + 'SelectAFAreaSelectMode' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'SelectableAFPoint' => { + PrintConv => { + '11 points' => '11 punti', + }, + }, + 'Selected' => 'Selezionato', + 'SelfTimer' => { + Description => 'Autoscatto', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'SelfTimer2' => 'Autoscatto 2', + 'SelfTimerInterval' => 'Intervallo autoscatto', + 'SelfTimerMode' => 'Modo autoscatto', + 'SelfTimerTime' => 'Tempo autoscatto', + 'SenderAddress' => 'Indirizzo mittente', + 'SenderName' => 'Nome mittente', + 'SensingMethod' => { + Description => 'Metodo misurazione esposimetrica', + PrintConv => { + 'Color sequential area' => 'Area sequenziale a colori', + 'Color sequential linear' => 'Lineare sequenziale a colori', + 'Not defined' => 'Non definito', + 'One-chip color area' => 'Sensore area a colori a un chip', + 'Three-chip color area' => 'Sensore area a colori a tre chip', + 'Trilinear' => 'Trilineare', + 'Two-chip color area' => 'Sensore area a colori a due chip', + }, + }, + 'Sensitivity' => 'Sensibilità', + 'SensitivityCalibrated' => 'Sensibilità calibrata', + 'SensitivitySteps' => { + Description => 'Passi sensibilità', + PrintConv => { + '1 EV Steps' => 'Step 1 EV', + }, + }, + 'SensitivityType' => { + Description => 'Tipo sensibilità', + PrintConv => { + 'ISO Speed' => 'Velocità ISO', + 'Recommended Exposure Index' => 'Indice esposizione raccomandato', + 'Recommended Exposure Index and ISO Speed' => 'Indice esposizione raccomandato e velocità ISO', + 'Standard Output Sensitivity' => 'Sensibilità predefinita uscita', + 'Standard Output Sensitivity and ISO Speed' => 'Sensibilità predefinita uscita e velocità ISO', + 'Standard Output Sensitivity and Recommended Exposure Index' => 'Sensibilità predefinita uscita e indice esposizione consigliato', + 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed' => 'Sensibilità predefinita uscita, indice esposizione consigliato e velocità ISO', + 'Unknown' => 'Sconosciuto', + }, + }, + 'SensorAreas' => 'Aree sensore', + 'SensorCleaning' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'SensorHeight' => 'Altezza sensore', + 'SensorID' => 'ID sensore', + 'SensorLeftBorder' => 'Bordo sinistro sensore', + 'SensorMode' => 'Modo sensore', + 'SensorPixelSize' => 'Dimensione pixel sensore', + 'SensorRedLevel' => 'Livello rosso sensore', + 'SensorSize' => 'Dimensione sensore', + 'SensorTemperature' => 'Temperatura sensore', + 'SensorTopBorder' => 'Bordo superiore sensore', + 'SensorType' => 'Tipo sensore', + 'SensorTypeCode' => 'Codice tipo sensore', + 'SensorWidth' => 'Larghezza sensore', + 'Sequence' => 'Sequenza', + 'SequenceName' => 'Nome sequenza', + 'SequenceNumber' => { + Description => 'Numero sequenza', + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SequenceShotInterval' => { + PrintConv => { + '10 frames/s' => '10 frame/s', + }, + }, + 'SequentialShot' => { + PrintConv => { + 'None' => 'Nessuno', + }, + }, + 'SerialNumber' => 'Numero di serie', + 'SerialNumberFormat' => { + Description => 'Formato numero di serie', + PrintConv => { + 'Format 1' => 'Formato 1', + 'Format 2' => 'Formato 2', + }, + }, + 'ServiceID' => 'ID servizio', + 'ServiceIdentifier' => 'Identificativo servizio', + 'ServiceOrganizationName' => 'Nome organizzazione servizio', + 'SetButtonCrossKeysFunc' => { + PrintConv => { + 'Normal' => 'Normale', + }, + }, + 'SetButtonWhenShooting' => { + PrintConv => { + 'Change ISO speed' => 'Cambia velocità ISO', + 'Change parameters' => 'Cambia parametri', + 'ISO speed' => 'Velocità ISO', + 'Normal (disabled)' => 'Normale (disabilitato)', + 'White balance' => 'Bilanciamento del bianco', + }, + }, + 'SetCookie' => 'Imposta cookie', + 'SetFunctionWhenShooting' => { + PrintConv => { + 'Change Parameters' => 'Cambia parametri', + }, + }, + 'SetInfo' => 'Imposta info', + 'SetSubtitle' => 'Imposta sottotitoli', + 'ShadingCompensation' => { + Description => 'Compensazione ombreggiatura', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ShadingCompensation2' => { + Description => 'Compensazione ombreggiatura 2', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Shadow' => 'Ombra', + 'ShadowCorrection' => { + PrintConv => { + 'Normal' => 'Normale', + 'Off' => 'Spento', + 'Strong' => 'Forte', + }, + }, + 'ShadowScale' => 'Scala ombre', + 'Shadows' => 'Ombre', + 'ShakeReduction' => { + PrintConv => { + 'Off' => 'Spento', + 'Off (4)' => 'Spento (4)', + }, + }, + 'SharedData' => 'Dati condivisi', + 'Sharpening' => { + PrintConv => { + 'Low' => 'Basso', + 'Normal' => 'Normale', + 'Off' => 'Spento', + }, + }, + 'Sharpness' => { + Description => 'Nitidezza', + PrintConv => { + 'Hard' => 'Forte', + 'Normal' => 'Normale', + 'Soft' => 'Leggera', + 'n/a' => 'n/d', + }, + }, + 'SharpnessFaithful' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SharpnessFrequency' => { + PrintConv => { + 'Low' => 'Basso', + 'n/a' => 'n/d', + }, + }, + 'SharpnessLandscape' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SharpnessMonochrome' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SharpnessNeutral' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SharpnessPortrait' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SharpnessStandard' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SharpnessUnknown' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SharpnessUserDef1' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SharpnessUserDef2' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'SharpnessUserDef3' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ShootingMode' => { + Description => 'Modo scatto', + PrintConv => { + 'Aperture Priority' => 'Priorità diaframma', + 'Fireworks' => 'Fuochi artificiali', + 'Manual' => 'Manuale', + 'Normal' => 'Normale', + 'Portrait' => 'Verticale', + 'Program' => 'Programma', + 'Scenery' => 'Paesaggio', + 'Shutter Priority' => 'Priorità otturatore', + 'Sunset' => 'Tramonto', + }, + }, + 'ShootingModeSetting' => { + Description => 'Impostazione modo scatto', + PrintConv => { + 'Self-timer' => 'Autoscatto', + }, + }, + 'ShortComment' => 'Commento breve', + 'ShortDescription' => 'Descrizione breve', + 'ShortDocumentID' => 'ID documento breve', + 'ShortReleaseTimeLag' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'ShotComment' => 'Commento scatto', + 'ShotCommentKind' => 'Tipo commento scatto', + 'ShotDate' => 'Data scatto', + 'ShotDay' => 'Giorno scatto', + 'ShotDescription' => 'Descrizione scatto', + 'ShotDuration' => 'Durata scatto', + 'ShotInfoVersion' => 'Info versione scatto', + 'ShotList' => 'Elenco scatti', + 'ShotLocation' => 'Posizione scatto', + 'ShotLocationSets' => 'Insiemi posizione scatto', + 'ShotName' => 'Nome scatto', + 'ShotNumber' => 'Numero scatto', + 'ShotSize' => 'Dimensione scatto', + 'ShutterCount' => 'Conteggio scatti', + 'ShutterMode' => { + PrintConv => { + 'Aperture Priority' => 'Priorità diaframma', + }, + }, + 'ShutterReleaseButtonAE-L' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ShutterReleaseNoCFCard' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'ShutterSpeed' => 'Tempo esposizione', + 'ShutterSpeedRange' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'ShutterSpeedValue' => 'Velocità otturatore', + 'SideNumber' => 'Numero lato', + 'Sidebars' => 'Barre laterali', + 'SimilarityIndex' => 'Indice di Somiglianza', + 'SingleFrameBracketing' => { + PrintConv => { + 'Low' => 'Basso', + }, + }, + 'Site' => 'Sito', + 'Size' => 'Dimensioni', + 'SlideShow' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'SlowShutter' => { + PrintConv => { + 'None' => 'Nessuno', + 'Off' => 'Spento', + 'n/a' => 'n/d', + }, + }, + 'SlowSync' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'SmartRange' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'SmileShutter' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Smoothness' => 'Arrotondamento', + 'Software' => 'Software utilizzato', + 'Source' => 'Origine', + 'SourceTitle' => 'Titolo fonte', + 'SourceTrackID' => 'ID traccia fonte', + 'SourceTrackIDs' => 'ID traccia fonte', + 'SourceType' => 'Tipo fonte', + 'SourceURL' => 'URL fonte', + 'SourceValue' => 'Valore fonte', + 'SpatialFrequencyResponse' => 'Risposta in frequenza spaziale', + 'SpecialBuild' => 'Compilazione speciale', + 'SpecialEffectMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'SpecialEffectSetting' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'SpecialEffectsOpticalFilter' => { + PrintConv => { + 'None' => 'Nessuno', + 'Star' => 'Stella', + }, + }, + 'SpecialInstructions' => 'Istruzioni', + 'SpectralSensitivity' => 'Sensibilità spettro', + 'Speed' => { + Description => 'Velocità', + PrintConv => { + 'Fast' => 'Veloce', + 'Medium' => 'Medio', + 'Slow' => 'Lento', + }, + }, + 'SpotMeteringMode' => { + PrintConv => { + 'Center' => 'Centro', + }, + }, + 'StandardOutputSensitivity' => 'Sensibilità predefinita uscita', + 'StartTime' => 'Ora inizio', + 'State' => 'Stato', + 'StorageMethod' => { + PrintConv => { + 'Linear' => 'Lineare', + }, + }, + 'StreamType' => { + PrintConv => { + 'File Transfer' => 'Trasferimento file', + 'Text' => 'Testo', + }, + }, + 'StretchMode' => { + PrintConv => { + 'Fixed length' => 'Lunghezza fissa', + }, + }, + 'StripByteCounts' => 'Byte per striscia', + 'StripOffsets' => 'Offset striscia', + 'StripRowCounts' => 'Numero righe striscia', + 'Sub-location' => 'Località', + 'SubSecCreateDate' => 'Data di creazione', + 'SubSecDateTimeOriginal' => 'Data/ora originali', + 'SubSecModifyDate' => 'Data modifica', + 'SubSecTime' => 'Sottosecondi ora', + 'SubSecTimeDigitized' => 'Sottosecondi ora digitalizzazione', + 'SubSecTimeOriginal' => 'Sottosecondi ora originale', + 'SubTileBlockSize' => 'Dimensione blocco sotto-tasselli', + 'SubfileType' => { + Description => 'Tipo sotto-file', + PrintConv => { + 'Full-resolution image' => 'Immagine con risoluzione originale', + 'Reduced-resolution image' => 'Immagine a risoluzione ridotta', + 'Single page of multi-page image' => 'Singola pagina di un\'immagine multi-pagina', + 'Single page of multi-page reduced-resolution image' => 'Singola pagina di un\'immagine multi-pagina a risoluzione ridotta', + 'TIFF-FX mixed raster content' => 'Contenuto raster misto TIFF-FX', + 'TIFF/IT final page' => 'Pagina finale TIFF/IT', + 'Thumbnail image' => 'Miniatura', + 'Transparency mask' => 'Maschera trasparenza', + 'Transparency mask of multi-page image' => 'Maschera trasparenza di immagine multi-pagina', + 'Transparency mask of reduced-resolution image' => 'Maschera trasparenza di immagine a risoluzione ridotta', + 'Transparency mask of reduced-resolution multi-page image' => 'Maschera trasparenza di immagine multi-pagina a risoluzione ridotta', + 'invalid' => 'non valido', + }, + }, + 'SubimageColor' => { + PrintConv => { + 'RGB (uncalibrated)' => 'RGB (non calibrato)', + 'RGB with Opacity' => 'RGB con opacità', + 'RGB with Opacity (uncalibrated)' => 'RGB con opacità (non calibrato)', + }, + }, + 'Subject' => 'Soggetto', + 'SubjectArea' => 'Area soggetto', + 'SubjectCode' => 'Codice sottetto', + 'SubjectDistance' => 'Distanza soggetto', + 'SubjectDistanceRange' => { + Description => 'Intervallo distanza soggetto', + PrintConv => { + 'Close' => 'Vicino', + 'Distant' => 'Lontano', + 'Unknown' => 'Sconosciuto', + }, + }, + 'SubjectLocation' => 'Posizione soggetto', + 'SubjectName' => 'Nome soggetto', + 'SubjectProgram' => { + PrintConv => { + 'None' => 'Nessuno', + 'Portrait' => 'Verticale', + 'Sunset' => 'Tramonto', + 'Text' => 'Testo', + }, + }, + 'SubjectReference' => 'Codice Soggetto', + 'SubjectUnits' => { + PrintConv => { + 'radians' => 'Radianti', + }, + }, + 'Subsystem' => { + Description => 'Sottosistema', + PrintConv => { + 'EFI ROM' => 'ROM EFI', + 'EFI application' => 'Applicazione EFI', + 'EFI boot service' => 'Servizio di avvio EFI', + 'EFI runtime driver' => 'Driver a runtine EFI', + 'Native' => 'Nativo', + 'OS/2 command line' => 'Linea di comando OS/2', + 'POSIX command line' => 'Linea di comando POSIX', + 'Unknown' => 'Sconosciuto', + 'Windows command line' => 'Linea di comando Windows', + }, + }, + 'SubsystemVersion' => 'Versione sottosistema', + 'Subtitle' => 'Sottotitolo', + 'Suffix' => 'Suffisso', + 'SuggestedPalette' => 'Tavolozza suggerita', + 'Summary' => 'Sommario', + 'SuperMacro' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'SuperimposedDisplay' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'SupplementalCategories' => 'Categoria Supplementare', + 'SupplementalType' => { + PrintConv => { + 'Main Image' => 'Non impostato', + 'Rasterized Caption' => 'Didascalia rasterizzata', + 'Reduced Resolution Image' => 'Risoluzione immagine ridotta', + }, + }, + 'SurroundMode' => { + PrintConv => { + 'Not Dolby surround' => 'Non Dolby surround', + 'Not indicated' => 'Non indicato', + }, + }, + 'SweepPanoramaDirection' => { + Description => 'Direzione panoramica ad arco', + PrintConv => { + 'Left' => 'Sinistra', + 'Right' => 'Destra', + }, + }, + 'SweepPanoramaSize' => 'Dimensione panoramica ad arco', + 'SwitchToRegisteredAFPoint' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'SynchronizedLyricText' => 'Testo sincronizzato', + 'SystemNameOrNumber' => 'Nome/numero sistema', + 'T4Options' => { + Description => 'Opzioni T4', + PrintConv => { + '2-Dimensional encoding' => 'Codifica 2D', + 'Fill bits added' => 'Bit di riempimento aggiunti', + 'Uncompressed' => 'Non compresso', + }, + }, + 'T6Options' => { + Description => 'Opzioni T6', + PrintConv => { + 'Uncompressed' => 'Non compresso', + }, + }, + 'T82Options' => 'Opzioni T82', + 'T88Options' => 'Opzioni T88', + 'TIFFPreview' => 'Anteprima TIFF', + 'TIFFSummary' => 'Sommario TIFF', + 'TIFF_FXExtensions' => { + Description => 'Estensioni TIFF FX', + PrintConv => { + 'B&W JBIG2' => 'JBIG2 bianco e nero', + 'JBIG2 Profile M' => 'JBIG2 TIFF FX', + 'N Layer Profile M' => 'Livello N profilo M', + 'Resolution/Image Width' => 'Risoluzione/larghezza immagine', + 'Shared Data' => 'Dati condivisi', + }, + }, + 'Tagged' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'TaggingTime' => 'Ora tag', + 'TargetDeltaType' => { + PrintConv => { + 'Absolute' => 'Assoluto', + }, + }, + 'TargetPrinter' => 'Stampante di destinazione', + 'Technology' => { + Description => 'Tecnologia', + PrintConv => { + 'Active Matrix Display' => 'Display a matrice attiva', + 'Cathode Ray Tube Display' => 'Monitor con Tubo a Raggi Catodici', + 'Digital Camera' => 'Fotocamera Digitale', + 'Dye Sublimation Printer' => 'Stampante a Sublimazione Termica', + 'Electrophotographic Printer' => 'Stampante Laser', + 'Electrostatic Printer' => 'Stampante Elettrostatica', + 'Film Scanner' => 'Scanner per Pellicola', + 'Ink Jet Printer' => 'Stampante Ink Jet', + 'Offset Lithography' => 'Litografía Offset', + 'Passive Matrix Display' => 'Display a Matrice passiva', + 'Photographic Paper Printer' => 'Stampante per Carta Fotografica', + 'Projection Television' => 'Proiettore televisivo', + 'Reflective Scanner' => 'Scanner a riflessione', + 'Thermal Wax Printer' => 'Stampante Thermal Wax', + }, + }, + 'Teleconverter' => { + PrintConv => { + 'None' => 'Nessuno', + }, + }, + 'Temperature' => 'Temperatura', + 'Template' => 'Modello', + 'TermsOfUse' => 'Termini di utilizzo', + 'TestTarget' => { + PrintConv => { + 'Grayscale' => 'Scala di grigi', + }, + }, + 'Text' => 'Testo', + 'TextColor' => 'Colore testo', + 'TextComments' => 'Testo commenti', + 'TextEncoding' => { + Description => 'Codifica testo', + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'TextFace' => { + Description => 'Aspetto testo', + PrintConv => { + 'Extend' => 'Estendi', + 'Italic' => 'Corsivo', + 'Shadow' => 'Ombra', + }, + }, + 'TextFont' => { + Description => 'Carattere testo', + PrintConv => { + 'System' => 'Sistema', + }, + }, + 'TextLayers' => 'Livelli testo', + 'TextSize' => 'Dimenione testo', + 'TextStamp' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'TextString' => 'Stringa testo', + 'TextValue' => 'Valore testo', + 'Thresholding' => { + Description => 'Soglia', + PrintConv => { + 'No dithering or halftoning' => 'Nessun dithering o resa a mezzi toni', + 'Randomized dither' => 'Dither casuale', + }, + }, + 'ThumbnailFileName' => 'Nome file miniatura', + 'ThumbnailFormat' => 'Formato miniatura', + 'ThumbnailHeight' => 'Miniatura', + 'ThumbnailImage' => 'Miniatura', + 'ThumbnailImageName' => 'Nome miniatura', + 'ThumbnailImageSize' => 'Dimensione miniatura', + 'ThumbnailImageType' => 'Tipo miniatura', + 'ThumbnailImageValidArea' => 'Area valida miniatura', + 'ThumbnailLength' => 'Dimensioni miniatura', + 'ThumbnailOffset' => 'Offset miniatura', + 'ThumbnailWidth' => 'Larghezza miniatura', + 'Thumbnails' => 'Miniature', + 'TileByteCounts' => 'Byte tassello', + 'TileDepth' => 'Profondità tassello', + 'TileLength' => 'Lunghezza tassello', + 'TileOffsets' => 'Offset tasselli', + 'TileWidth' => 'Larghezza tassello', + 'Tiles' => 'Tasselli', + 'Time' => 'Ora', + 'TimeCreated' => 'Ora di Creazione', + 'TimeSent' => 'Ora d\'invio', + 'TimeStamp' => 'Marcatura oraria', + 'TimeStamp1' => 'Marcatura oraria 1', + 'TimeZone' => 'Fuso orario', + 'TimeZoneCity' => { + Description => 'Città fuso orario', + PrintConv => { + 'London' => 'Londra', + 'Tehran' => 'Teheran', + 'n/a' => 'n/d', + }, + }, + 'TimeZoneCode' => 'Codice fuso orario', + 'TimeZoneInfo' => 'Info fuso orario', + 'TimeZoneOffset' => 'Scostamento fuso orario', + 'TimerFunctionButton' => { + PrintConv => { + 'Self-timer' => 'Autoscatto', + 'Shooting Mode' => 'Modo scatto', + 'White Balance' => 'Bilanciamento del bianco', + }, + }, + 'TimerLength' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'Tint' => 'Tinta', + 'Title' => 'Titolo', + 'Title2' => 'Titolo 2', + 'TitleKind' => 'Tipo titolo', + 'TitleLen' => 'Lungh titolo', + 'TitleNum' => 'Num titolo', + 'TitleOfParts' => 'Titolo parti', + 'TitleSortOrder' => 'Ordinamento titolo', + 'TitlesOfParts' => 'Titoli parti', + 'TitlesSets' => 'Insiemi di titoli', + 'ToDoTitle' => 'Titolo da fare', + 'ToneComp' => 'Compensazione Tono', + 'ToneCurve' => { + PrintConv => { + 'Manual' => 'Manuale', + }, + }, + 'ToneCurveActive' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'ToneCurveName' => { + PrintConv => { + 'Linear' => 'Lineare', + 'Strong Contrast' => 'Contrasto elevato', + }, + }, + 'ToneCurveProperty' => { + PrintConv => { + 'Linear' => 'Lineare', + 'Shot Settings' => 'Impostazioni scatto', + }, + }, + 'ToningEffect' => { + PrintConv => { + 'Blue-green' => 'Blu-Verde', + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Purple' => 'Porpora', + 'Purple-blue' => 'Porpora-blu', + 'Red' => 'Rosso', + 'Red-purple' => 'Rosso-porpora', + 'Sepia' => 'Seppia', + 'Yellow' => 'Giallo', + 'n/a' => 'n/d', + }, + }, + 'ToningEffectFaithful' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ToningEffectLandscape' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ToningEffectMonochrome' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Purple' => 'Porpora', + 'Sepia' => 'Seppia', + 'n/a' => 'n/d', + }, + }, + 'ToningEffectNeutral' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ToningEffectPortrait' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ToningEffectStandard' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'ToningEffectUnknown' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Purple' => 'Porpora', + 'Sepia' => 'Seppia', + 'n/a' => 'n/d', + }, + }, + 'ToningEffectUserDef1' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Purple' => 'Porpora', + 'Sepia' => 'Seppia', + 'n/a' => 'n/d', + }, + }, + 'ToningEffectUserDef2' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Purple' => 'Porpora', + 'Sepia' => 'Seppia', + 'n/a' => 'n/d', + }, + }, + 'ToningEffectUserDef3' => { + PrintConv => { + 'Green' => 'Verde', + 'None' => 'Nessuno', + 'Purple' => 'Porpora', + 'Sepia' => 'Seppia', + 'n/a' => 'n/d', + }, + }, + 'ToolName' => 'Nome strumento', + 'ToolVersion' => 'Versione strumento', + 'TotalFrames' => 'Frame totali', + 'Track' => 'Traccia', + 'TrackProperty' => { + PrintConv => { + 'Read only' => 'Sola lettura', + }, + }, + 'TransferFunction' => 'Funzione di trasferimento', + 'TransferRange' => 'Intervallo di trasferimento', + 'Transform' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Transformation' => { + Description => 'Trasformazione', + PrintConv => { + 'Horizontal (normal)' => 'Orizzontale (normale)', + 'Mirror horizontal' => 'Rifletti orizzontalmente', + 'Mirror horizontal and rotate 270 CW' => 'Rifletti orizzontalmente e ruota di 270° in senso orario', + 'Mirror horizontal and rotate 90 CW' => 'Rifletti orizzontalmente e ruota di 90° in senso orario', + 'Mirror vertical' => 'Rifletti verticalmente', + 'Rotate 180' => 'Ruota di 180°', + 'Rotate 270 CW' => 'Ruota di 270° in senso orario', + 'Rotate 90 CW' => 'Ruota di 90° senso orario', + }, + }, + 'TransmissionReference' => 'Riferimento trasmissione', + 'TransparencyIndicator' => 'Indicatore trasparenza', + 'TrapIndicator' => 'Indicatore trap', + 'Trapped' => { + PrintConv => { + 'False' => 'Falso', + 'Unknown' => 'Sconosciuto', + }, + }, + 'TungstenAWB' => { + PrintConv => { + 'Strong Correction' => 'Correzione elevata', + }, + }, + 'TxFace' => 'Stile carattere testo', + 'TxFont' => 'Numero carattere', + 'TxSize' => 'Dimenione testo', + 'UIC1Tag' => 'Tag UIC1', + 'UIC2Tag' => 'Tag UIC2', + 'UIC3Tag' => 'Tag UIC3', + 'UIC4Tag' => 'Tag UIC4', + 'USPTOOriginalContentType' => { + PrintConv => { + 'Color' => 'Colore', + 'Grayscale' => 'Scala di grigi', + 'Text or Drawing' => 'Testo o disegno', + }, + }, + 'UV-IRFilterCorrection' => { + PrintConv => { + 'Not Active' => 'Non attivo', + }, + }, + 'Uncompressed' => { + Description => 'Non compresso', + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'UninitializedDataSize' => 'Dimensione dati non inizializzati', + 'UniqueCameraModel' => 'Modello unico fotocamera', + 'UniqueDocumentID' => 'ID Unico del Documento', + 'Units' => 'Unità', + 'Unknown' => 'Sconosciuto', + 'Unsharp1Color' => { + PrintConv => { + 'Green' => 'Verde', + 'Red' => 'Rosso', + 'Yellow' => 'Giallo', + }, + }, + 'Unsharp2Color' => { + PrintConv => { + 'Green' => 'Verde', + 'Red' => 'Rosso', + 'Yellow' => 'Giallo', + }, + }, + 'Unsharp3Color' => { + PrintConv => { + 'Green' => 'Verde', + 'Red' => 'Rosso', + 'Yellow' => 'Giallo', + }, + }, + 'Unsharp4Color' => { + PrintConv => { + 'Green' => 'Verde', + 'Red' => 'Rosso', + 'Yellow' => 'Giallo', + }, + }, + 'UnsharpMask' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Urgency' => { + Description => 'Urgenza', + PrintConv => { + '0 (reserved)' => '0 (riservato)', + '1 (most urgent)' => '1 (molto urgente)', + '5 (normal urgency)' => '5 (urgenza normale)', + '8 (least urgent)' => '8 (meno urgent)e', + '9 (user-defined priority)' => '9 (riservato per usi futuri)', + }, + }, + 'UsableMeteringModes' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'UsableShootingModes' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'UserAccess' => { + PrintConv => { + 'Print' => 'Stampa', + }, + }, + 'UserComment' => 'Commento utente', + 'UserDef1PictureStyle' => { + PrintConv => { + 'Landscape' => 'Orizzontale', + 'Portrait' => 'Verticale', + }, + }, + 'UserDef2PictureStyle' => { + PrintConv => { + 'Landscape' => 'Orizzontale', + 'Portrait' => 'Verticale', + }, + }, + 'UserDef3PictureStyle' => { + PrintConv => { + 'Landscape' => 'Orizzontale', + 'Portrait' => 'Verticale', + }, + }, + 'UserDefinedText' => 'Testo personalizzato', + 'UserDefinedURL' => 'URL personalizzato', + 'VFDisplayIllumination' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'VRDVersion' => 'Versione VRD', + 'VRInfo' => 'Info Riduzione Vibrazione', + 'VRInfoVersion' => 'Info Versione VR', + 'VR_0x66' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'Value' => 'Valore', + 'VariousModes' => 'Modi vari', + 'VariousModes2' => 'Modi vari 2', + 'Version' => 'Numero versione immagine', + 'Version2' => 'Versione 2', + 'VersionBF' => 'Versione BF', + 'VersionCreateDate' => 'Data creazione versione', + 'VersionID' => 'ID versione', + 'VersionIdentifier' => 'Identificativo versione', + 'VersionInfo' => 'Info versione', + 'VersionModifyDate' => 'Data modifica versione', + 'VersionNumber' => 'Numero versione', + 'VersionNumberString' => 'Stringa numero versione', + 'VersionTitle' => 'Titolo versione', + 'VersionYear' => 'Anno versione', + 'Versions' => 'Versioni', + 'VerticalCSType' => { + PrintConv => { + 'Caspian Sea' => 'Mar Caspio', + 'WGS 84 ellipsoid' => 'Ellissoide WGS 84', + }, + }, + 'VerticalUnits' => 'Unità verticali', + 'VibrationReduction' => { + Description => 'Riduzione vibrazione', + PrintConv => { + 'Off' => 'Spento', + 'n/a' => 'n/d', + }, + }, + 'VideoAlphaMode' => { + PrintConv => { + 'None' => 'Nessuno', + }, + }, + 'VideoAttributes' => { + PrintConv => { + 'Encrypted' => 'Crittografato', + }, + }, + 'VideoBitrate' => 'Bitrate video', + 'VideoCardGamma' => 'Gamma della Scheda Video', + 'VideoCodec' => 'Codec video', + 'VideoCodecDescription' => 'Descrizione codec video', + 'VideoCodecID' => 'ID codec video', + 'VideoCodecInfo' => 'Info codec video', + 'VideoCodecName' => 'Nome codec video', + 'VideoFieldOrder' => { + PrintConv => { + 'Progressive' => 'Progressivo', + }, + }, + 'VideoQuality' => { + PrintConv => { + 'Low' => 'Basso', + }, + }, + 'VideoScanType' => { + PrintConv => { + 'Progressive' => 'Progressivo', + }, + }, + 'VideoStreamType' => { + PrintConv => { + 'Reserved' => 'Riservato', + }, + }, + 'ViewInfoDuringExposure' => { + PrintConv => { + 'Enable' => 'Abilita', + }, + }, + 'ViewfinderWarning' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ViewingCondDesc' => 'Descrizione Condizioni di Visualizzazione', + 'ViewingMode2' => { + PrintConv => { + 'n/a' => 'n/d', + }, + }, + 'VignetteControl' => { + PrintConv => { + 'Low' => 'Basso', + 'Normal' => 'Normale', + 'Off' => 'Spento', + }, + }, + 'VignettingCorrection' => { + PrintConv => { + 'Off' => 'Spento', + 'n/a' => 'n/d', + }, + }, + 'VirtualImageHeight' => 'Altezza immagine virtuale', + 'VirtualImageWidth' => 'Larghezza immagine virtuale', + 'VirtualPageUnits' => 'Unità pagina virtuale', + 'VoiceMemo' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'WBAdjLighting' => { + PrintConv => { + 'Daylight (cloudy)' => 'Luce del giorno (2)', + 'Daylight (direct sunlight)' => 'Luce del giorno (0)', + 'Daylight (shade)' => 'Luce del giorno (1)', + 'None' => 'Nessuno', + }, + }, + 'WBBracketMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'WBFineTuneActive' => { + PrintConv => { + 'Yes' => 'Sì', + }, + }, + 'WCSProfiles' => 'Profilo Windows Color System', + 'WhiteBalance' => { + Description => 'Bilanciamento del bianco', + PrintConv => { + 'Auto' => 'Equilibrio del bianco automatico', + 'Black & White' => 'Monocromatico', + 'Cloudy' => 'Nuvoloso', + 'Color Temperature/Color Filter' => 'Temperatura colore / Filtro colore', + 'Cool White Fluorescent' => 'Fluorescente bianca fredda', + 'Custom' => 'Personalizzato', + 'Custom 1' => 'PERSONAL.1', + 'Custom 2' => 'PERSONAL.2', + 'Custom 3' => 'PERSONAL.3', + 'Custom 4' => 'PERSONAL.4', + 'Day White Fluorescent' => 'Fluorescente a luce del giorno bianca', + 'Daylight' => 'Luce del giorno', + 'Daylight Fluorescent' => 'Fluorescente a luce del giorno', + 'Fluorescent' => 'Fluorescente', + 'Manual' => 'Manuale', + 'Shade' => 'Ombrato', + 'Tungsten' => 'Tungsteno (luce incandescente)', + 'Unknown' => 'Sconosciuto', + 'Warm White Fluorescent' => 'Luce fluorescente bianca calda', + 'White Fluorescent' => 'Fluorescente bianca', + }, + }, + 'WhiteBalance2' => 'Bilanciamento del bianco 2', + 'WhiteBalanceAdj' => { + Description => 'Adattamento bilanciamento bianco', + PrintConv => { + 'Cloudy' => 'Nuvoloso', + 'Daylight' => 'Luce del giorno', + 'Fluorescent' => 'Fluorescente', + 'Off' => 'Spento', + 'Shade' => 'Ombrato', + 'Shot Settings' => 'Impostazioni scatto', + 'Tungsten' => 'Tungsteno (luce incandescente)', + }, + }, + 'WhiteBalanceAutoAdjustment' => { + Description => 'Adattamento automatico bilanciamento bianco', + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'WhiteBalanceBracketing' => { + PrintConv => { + 'Low' => 'Basso', + 'Off' => 'Spento', + }, + }, + 'WhiteBalanceFineTune' => 'Regolazione Fine Bilanciamento Bianco', + 'WhiteBalanceMode' => { + PrintConv => { + 'Unknown' => 'Sconosciuto', + }, + }, + 'WhiteBalanceSet' => { + PrintConv => { + 'Cloudy' => 'Nuvoloso', + 'Daylight' => 'Luce del giorno', + 'Daylight Fluorescent' => 'Fluorescente a luce del giorno', + 'Manual' => 'Manuale', + 'Shade' => 'Ombrato', + 'Tungsten' => 'Tungsteno (luce incandescente)', + 'White Fluorescent' => 'Fluorescente bianca', + }, + }, + 'WhiteBalanceSetting' => { + PrintConv => { + 'Fluorescent (+1)' => 'Fluorescente (+1)', + 'Fluorescent (+2)' => 'Fluorescente (+2)', + 'Fluorescent (+3)' => 'Fluorescente (+3)', + 'Fluorescent (-1)' => 'Fluorescente (-1)', + 'Fluorescent (-2)' => 'Fluorescente (-2)', + 'Fluorescent (-3)' => 'Fluorescente (-3)', + 'Fluorescent (0)' => 'Fluorescente (0)', + 'Shade (+1)' => 'Ombrato (+1)', + 'Shade (+2)' => 'Ombrato (+2)', + 'Shade (+3)' => 'Ombrato (+3)', + 'Shade (-1)' => 'Ombrato (-1)', + 'Shade (-2)' => 'Ombrato (-2)', + 'Shade (-3)' => 'Ombrato (-3)', + 'Shade (0)' => 'Ombrato (0)', + }, + }, + 'WhiteLevel' => 'Livello bianco', + 'WhitePoint' => 'Punto bianco', + 'WideRange' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'WidthResolution' => 'Risoluzione larghezza', + 'Writer-Editor' => 'Autore Didascalia/Descrizione', + 'XMethod' => { + PrintConv => { + 'No Magnification' => 'Nessun ingrandimento', + }, + }, + 'XPAuthor' => 'Autore', + 'XPComment' => 'Commento XP', + 'XPKeywords' => 'Parole chiave XP', + 'XPSubject' => 'Soggetto XP', + 'XPTitle' => 'Titolo XP', + 'XPosition' => 'Posizione X', + 'XResolution' => 'Risoluzione orizzontale immagine', + 'YCbCrCoefficients' => 'Coefficienti matrice trasformazione spazio colori', + 'YCbCrPositioning' => { + Description => 'Posizionamento Y e C', + PrintConv => { + 'Centered' => 'Centrato', + 'Co-sited' => 'Affiancato', + }, + }, + 'YCbCrSubSampling' => 'Indice sottocampionamento da Y a C', + 'YMethod' => { + PrintConv => { + 'No Magnification' => 'Nessun ingrandimento', + }, + }, + 'YPosition' => 'Posizione Y', + 'YResolution' => 'Risoluzione verticale immagine', + 'Year' => 'Anno', + 'ZipCompression' => { + PrintConv => { + 'None' => 'Nessuno', + 'Reduced with compression factor 1' => 'Ridotto con fattore compressione 1', + 'Reduced with compression factor 2' => 'Ridotto con fattore compressione 2', + 'Reduced with compression factor 3' => 'Ridotto con fattore compressione 3', + 'Reduced with compression factor 4' => 'Ridotto con fattore compressione 4', + }, + }, + 'ZoneMatching' => { + Description => 'Adeguamento zona', + PrintConv => { + 'High Key' => 'Hi', + 'ISO Setting Used' => 'Impostazione ISO usata', + 'Low Key' => 'Lo', + }, + }, + 'ZoneMatchingMode' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ZoneMatchingOn' => { + PrintConv => { + 'Off' => 'Spento', + }, + }, + 'ZoomCenter' => 'Centro zoom', + 'ZoomFactor' => 'Fattore di zoom', + 'ZoomPos' => 'Posizione zoom', + 'iTunesU' => 'ITunes U', +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::it.pm - ExifTool Italian language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke, Ferdinando Agovino, Emilio Dati and Michele Locati +for providing this translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/ja.pm b/lib/Image/ExifTool/Lang/ja.pm new file mode 100644 index 0000000..9fb7d63 --- /dev/null +++ b/lib/Image/ExifTool/Lang/ja.pm @@ -0,0 +1,5858 @@ +#------------------------------------------------------------------------------ +# File: ja.pm +# +# Description: ExifTool Japanese language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::ja; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.25'; + +%Image::ExifTool::Lang::ja::Translate = ( + 'AEAperture' => 'AE絞り', + 'AEBAutoCancel' => { + Description => 'ブラケティング自動解除', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'AEBBracketValue' => 'AEBブラケット値', + 'AEBSequence' => 'ブラケティング順åº', + 'AEBSequenceAutoCancel' => { + Description => 'ブラケティング順åº/自動解除', + PrintConv => { + '-,0,+/Disabled' => 'ï¼â†’0 →+/ã—ãªã„', + '-,0,+/Enabled' => 'ï¼â†’0 →+/ã™ã‚‹', + '0,-,+/Disabled' => '0 →ï¼â†’+/ã—ãªã„', + '0,-,+/Enabled' => '0 →ï¼â†’+/ã™ã‚‹', + }, + }, + 'AEBShotCount' => 'ブラケティング時ã®æ’®å½±æžšæ•°', + 'AEBXv' => 'AEブラケット 露出補正', + 'AEExposureTime' => 'AE露出時間', + 'AEExtra' => 'AE特別?', + 'AEInfo' => '自動露出情報', + 'AELock' => { + Description => 'AEロック', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'AELockButton' => { + Description => 'AE-L/AF-L', + PrintConv => { + 'AE-L/AF Area' => 'AE-L/AFエリア', + 'AE-L/AF-L/AF Area' => 'AE-L/AF-L/AFエリア', + 'AF-L/AF Area' => 'AF-L/AFエリア', + 'AF-ON/AF Area' => 'AFオン/AFエリア', + 'FV Lock' => 'FVロック', + 'Focus Area Selection' => 'フォーカスエリアé¸æŠž', + }, + }, + 'AEMaxAperture' => 'AE最大絞り', + 'AEMaxAperture2' => 'AE最大絞り(2)', + 'AEMeteringMode' => { + Description => 'AE測光モード', + PrintConv => { + 'Multi-segment' => 'パターン', + }, + }, + 'AEMeteringSegments' => '自動露出測光値', + 'AEMinAperture' => 'AE最å°çµžã‚Š', + 'AEMinExposureTime' => 'AE最å°éœ²å‡ºæ™‚é–“', + 'AEProgramMode' => { + Description => 'AEプログラムモード', + PrintConv => { + 'Av, B or X' => 'Av, Bã‹X', + 'Candlelight' => 'キャンドルライト', + 'DOF Program' => '深度優先プログラム', + 'DOF Program (P-Shift)' => '深度優先プログラム(Pシフト)', + 'Hi-speed Program' => '高速優先プログラム', + 'Hi-speed Program (P-Shift)' => '高速優先プログラム(Pシフト)', + 'Kids' => 'キッズ', + 'Landscape' => '風景', + 'M, P or TAv' => 'M, Pã‹TAv', + 'MTF Program' => 'MTF優先プログラム', + 'MTF Program (P-Shift)' => 'MTF優先プログラム(Pシフト)', + 'Macro' => 'マクロ', + 'Museum' => 'ミュージアム', + 'Night Scene' => '夜景', + 'Night Scene Portrait' => '人物ã€å¤œæ™¯', + 'No Flash' => 'フラッシュ無ã—', + 'Pet' => 'ペット', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Sport' => 'スãƒãƒ¼ãƒ„', + 'Standard' => 'スタンダード', + 'Sunset' => '夕日', + 'Surf & Snow' => 'サーフ&スノー', + 'Sv or Green Mode' => 'Svã‹ã‚°ãƒªãƒ¼ãƒ³ãƒ¢ãƒ¼ãƒ‰', + 'Text' => 'テキスト', + }, + }, + 'AESetting' => { + Description => '自動露出設定', + PrintConv => { + 'Exposure Compensation' => '露出補正', + }, + }, + 'AEXv' => 'AE 露出補正', + 'AE_ISO' => 'AE ISO感度', + 'AF-CPrioritySelection' => { + Description => 'AF-Cプライオリティーé¸æŠž', + PrintConv => { + 'Focus' => 'フォーカス', + 'Release' => 'レリーズ', + 'Release + Focus' => 'レリーズ+フォーカス', + }, + }, + 'AF-OnForMB-D10' => { + Description => 'MB-D10用AFオン', + PrintConv => { + 'AE Lock (hold)' => 'AEロック(ホールド)', + 'AE Lock (reset on release)' => 'AEロック(レリーズ時リセット)', + 'AE Lock Only' => 'AEロックã®ã¿', + 'AE/AF Lock' => 'AE/AFロック', + 'AF Lock Only' => 'AFロックã®ã¿', + 'AF-On' => 'AFオン', + 'Same as FUNC Button' => 'ファンクションボタンã¨åŒä¸€', + }, + }, + 'AF-SPrioritySelection' => { + Description => 'AF-Sプライオリティーé¸æŠž', + PrintConv => { + 'Focus' => 'フォーカス', + 'Release' => 'レリーズ', + }, + }, + 'AFActivation' => { + Description => 'AFアクティベーション', + PrintConv => { + 'AF-On Only' => 'AFオンã®ã¿', + 'Shutter/AF-On' => 'シャッター/AFオン', + }, + }, + 'AFAdjustment' => 'AF微調整', + 'AFArea' => 'AFエリア', + 'AFAreaHeight' => 'AFエリア高ã•', + 'AFAreaHeights' => 'AFエリア高ã•', + 'AFAreaIllumination' => { + Description => 'AFエリアイルミãƒãƒ¼ã‚·ãƒ§ãƒ³', + PrintConv => { + 'Auto' => 'オート', + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'AFAreaMode' => { + Description => 'AFエリアモード', + PrintConv => { + '1-area' => '1点', + '1-area (high speed)' => '高速1点', + '3-area (center)?' => '3点中央?', + '3-area (left)?' => '3点左?', + '3-area (right)?' => '3点å³ï¼Ÿ', + '5-area' => '5点', + 'Auto-area' => '自動エリアAF', + 'Dynamic Area' => 'ダイナミックエリア', + 'Dynamic Area (closest subject)' => 'ダイナミック(é‡ç‚¹ä¸»é¡Œï¼‰', + 'Dynamic Area (wide)' => 'ダイナミック(ワイド)', + 'Face Detect AF' => '顔優先', + 'Group Dynamic' => 'グループダイナミック', + 'Normal?' => 'ノーマル?', + 'Single Area' => 'シングルãƒã‚¤ãƒ³ãƒˆ', + 'Single Area (wide)' => 'シングルãƒã‚¤ãƒ³ãƒˆï¼ˆãƒ¯ã‚¤ãƒ‰ï¼‰', + 'Spot Focusing' => 'スãƒãƒƒãƒˆãƒ•ã‚©ãƒ¼ã‚«ã‚¹', + 'Spot Mode On' => 'スãƒãƒƒãƒˆãƒ¢ãƒ¼ãƒ‰ã‚ªãƒ³', + }, + }, + 'AFAreaModeSetting' => { + Description => 'AFエリアモード', + PrintConv => { + 'Closest Subject' => 'オートエリア', + 'Dynamic Area' => 'ダイナミックエリア', + 'Single Area' => 'シングルãƒã‚¤ãƒ³ãƒˆ', + }, + }, + 'AFAreaWidth' => 'AFエリア幅', + 'AFAreaWidths' => 'AFエリア幅', + 'AFAreas' => 'AFエリア', + 'AFAssist' => { + Description => 'AFアシスト', + PrintConv => { + 'Does not emit/Fires' => 'ã—ãªã„/ã™ã‚‹', + 'Emits/Does not fire' => 'ã™ã‚‹/ã—ãªã„', + 'Emits/Fires' => 'ã™ã‚‹/ã™ã‚‹', + 'Off' => 'オフ', + 'On' => 'オン', + 'Only ext. flash emits/Fires' => '外部ストロボã®ã¿ã™ã‚‹/ã™ã‚‹', + }, + }, + 'AFAssistBeam' => { + Description => 'AF補助光ã®æŠ•å…‰', + PrintConv => { + 'Does not emit' => 'ã—ãªã„', + 'Emits' => 'ã™ã‚‹', + 'Only ext. flash emits' => '外部ストロボã®ã¿ã™ã‚‹', + }, + }, + 'AFDefocus' => 'AFã¼ã‘é‡', + 'AFDuringLiveView' => { + Description => 'ライブビュー撮影中ã®AF', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + 'Live mode' => 'ライブモード', + 'Quick mode' => 'クイックモード', + }, + }, + 'AFFineTune' => 'AFファインãƒãƒ¥ãƒ¼ãƒ³', + 'AFFineTuneAdj' => 'AFファインãƒãƒ¥ãƒ¼ãƒ³', + 'AFImageHeight' => 'AFç”»åƒé«˜ã•', + 'AFImageWidth' => 'AFç”»åƒå¹…', + 'AFInfo' => 'AFモード', + 'AFInfo2' => 'AF情報', + 'AFInfo2Version' => 'AF情報ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'AFIntegrationTime' => 'AF集ç©æ™‚é–“', + 'AFMicroadjustment' => { + Description => 'AFマイクロアジャストメント', + PrintConv => { + 'Adjust all by same amount' => '全レンズ一律調整', + 'Adjust by lens' => 'レンズã”ã¨ã«èª¿æ•´', + 'Disable' => 'ã—ãªã„', + }, + }, + 'AFMode' => 'AFモード', + 'AFOnAELockButtonSwitch' => { + Description => 'AF-ON/AEロックボタン入替', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'AFPoint' => { + Description => 'AFé¸æŠžãƒã‚¤ãƒ³ãƒˆ', + PrintConv => { + 'Auto AF point selection' => 'オートAFãƒã‚¤ãƒ³ãƒˆé¸æŠž', + 'Bottom' => '下', + 'Center' => '中央', + 'Face Detect' => 'é¡”èªè­˜', + 'Left' => 'å·¦', + 'Manual AF point selection' => 'マニュアルAFãƒã‚¤ãƒ³ãƒˆé¸æŠž', + 'Mid-left' => '中央左', + 'Mid-right' => '中央å³', + 'None' => 'ç„¡ã—', + 'None (MF)' => 'ç„¡ã—(MF)', + 'Right' => 'å³', + 'Top' => '上', + }, + }, + 'AFPointActivationArea' => { + Description => 'AFフレームã®é ˜åŸŸæ‹¡å¤§', + PrintConv => { + 'Standard' => 'スタンダード', + }, + }, + 'AFPointAreaExpansion' => { + Description => 'ä»»æ„é¸æŠžæ™‚ã®AFフレーム領域拡大', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + 'Left/right AF points' => 'ã™ã‚‹(å·¦å³1領域アシスト有効)', + 'Surrounding AF points' => 'ã™ã‚‹(周囲1領域アシスト有効)', + }, + }, + 'AFPointAutoSelection' => { + Description => 'AFフレーム自動é¸æŠžã®é¸æŠžå¯å¦', + PrintConv => { + 'Control-direct:disable/Main:disable' => 'サブ電å­ãƒ€ã‚¤ãƒ¤ãƒ«ç›´æŽ¥:ä¸å¯/メイン電å­ãƒ€ã‚¤ãƒ¤ãƒ«â†’ä¸å¯', + 'Control-direct:disable/Main:enable' => 'サブ電å­ãƒ€ã‚¤ãƒ¤ãƒ«ç›´æŽ¥:ä¸å¯/メイン電å­ãƒ€ã‚¤ãƒ¤ãƒ«â†’å¯', + 'Control-direct:enable/Main:enable' => 'サブ電å­ãƒ€ã‚¤ãƒ¤ãƒ«ç›´æŽ¥:å¯/メイン電å­ãƒ€ã‚¤ãƒ¤ãƒ«â†’å¯', + }, + }, + 'AFPointBrightness' => { + Description => 'AFフレーム点ç¯è¼åº¦', + PrintConv => { + 'Brighter' => '明るã„', + 'Normal' => '標準', + }, + }, + 'AFPointDisplayDuringFocus' => { + Description => '測è·æ™‚ã®AFフレーム表示', + PrintConv => { + 'Off' => 'ã—ãªã„', + 'On' => 'ã™ã‚‹', + 'On (when focus achieved)' => 'ã™ã‚‹(åˆç„¦æ™‚)', + }, + }, + 'AFPointIllumination' => { + Description => 'AFãƒã‚¤ãƒ³ãƒˆã‚¤ãƒ«ãƒŸãƒãƒ¼ã‚·ãƒ§ãƒ³', + PrintConv => { + 'Auto' => 'オート', + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'AFPointMode' => { + Description => 'AF測è·ç‚¹ãƒ¢ãƒ¼ãƒ‰', + PrintConv => { + 'Auto' => 'オート', + }, + }, + 'AFPointRegistration' => { + Description => 'AFフレームã®ç™»éŒ²', + PrintConv => { + 'Automatic' => 'オート', + 'Bottom' => '下', + 'Center' => '中央', + 'Extreme Left' => '左端', + 'Extreme Right' => 'å³ç«¯', + 'Left' => 'å·¦', + 'Right' => 'å³', + 'Top' => '上', + }, + }, + 'AFPointSelected' => { + Description => 'AF測è·ç‚¹', + PrintConv => { + 'Auto' => 'オート', + 'Automatic Tracking AF' => '自動追尾', + 'Bottom' => '下', + 'Center' => '中央', + 'Face Detect AF' => 'é¡”èªè­˜', + 'Fixed Center' => '中央固定', + 'Left' => 'å·¦', + 'Lower-left' => '左下', + 'Lower-right' => 'å³ä¸‹', + 'Mid-left' => '中央左', + 'Mid-right' => '中央å³', + 'Right' => 'å³', + 'Top' => '上', + 'Upper-left' => '左上', + 'Upper-right' => 'å³ä¸Š', + }, + }, + 'AFPointSelected2' => { + Description => 'AF測è·ç‚¹é¸æŠž2', + PrintConv => { + 'Auto' => 'オート', + }, + }, + 'AFPointSelection' => { + Description => 'AFãƒã‚¤ãƒ³ãƒˆé¸æŠž', + PrintConv => { + '11 Points' => '11点', + '51 Points' => '51点(3Dトラッキング)', + }, + }, + 'AFPointSelectionMethod' => { + Description => 'AFフレームé¸æŠžæ–¹æ³•', + PrintConv => { + 'Multi-controller direct' => 'マルãƒã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ©ãƒ¼ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ', + 'Normal' => '標準', + 'Quick Control Dial direct' => 'サブ電å­ãƒ€ã‚¤ãƒ¤ãƒ«ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ', + }, + }, + 'AFPointSpotMetering' => 'AFフレーム数ï¼ã‚¹ãƒãƒƒãƒˆæ¸¬å…‰', + 'AFPoints' => 'AFãƒã‚¤ãƒ³ãƒˆ', + 'AFPointsInFocus' => { + Description => 'AF測è·ç‚¹', + PrintConv => { + 'All' => 'å…¨ã¦', + 'Bottom' => '下', + 'Bottom, Center' => '下+中央', + 'Bottom-center' => '中央下', + 'Bottom-left' => '左下', + 'Bottom-right' => 'å³ä¸‹', + 'Center' => '中央', + 'Center (horizontal)' => '中央(水平)', + 'Center (vertical)' => '中央(水平)', + 'Center+Right' => '中央+å³', + 'Fixed Center or Multiple' => '中央固定ã¾ãŸã¯è¤‡æ•°', + 'Left' => 'å·¦', + 'Left+Center' => 'å·¦+中央', + 'Left+Right' => 'å·¦+å³', + 'Lower-left, Bottom' => '左下+下', + 'Lower-left, Mid-left' => '左下+中央左', + 'Lower-right, Bottom' => 'å³ä¸‹+下', + 'Lower-right, Mid-right' => 'å³ä¸‹+中央å³', + 'Mid-left' => '中央左', + 'Mid-left, Center' => '中央左+中央', + 'Mid-right' => '中央å³', + 'Mid-right, Center' => '中央å³+中央', + 'None' => 'ç„¡ã—', + 'None (MF)' => 'ç„¡ã—(MF)', + 'Right' => 'å³', + 'Top' => '上', + 'Top, Center' => '上+中央', + 'Top-center' => '中央上', + 'Top-left' => '左上', + 'Top-right' => 'å³ä¸Š', + 'Upper-left, Mid-left' => '左上+中央左', + 'Upper-left, Top' => '左上+上', + 'Upper-right, Mid-right' => 'å³ä¸Š+中央å³', + 'Upper-right, Top' => 'å³ä¸Š+上', + }, + }, + 'AFPointsInFocus1D' => 'AF測è·ç‚¹(1D)', + 'AFPointsInFocus5D' => 'AF測è·ç‚¹', + 'AFPointsSelected' => 'AFãƒã‚¤ãƒ³ãƒˆé¸æŠž', + 'AFPointsUnknown2' => { + Description => 'AF測è·ç‚¹ 未確èª2?', + PrintConv => { + 'Auto' => 'オート', + }, + }, + 'AFPointsUsed' => { + Description => 'AF測è·ç‚¹', + PrintConv => { + 'Bottom' => '下', + 'Center' => '中央', + 'Mid-left' => '中央左', + 'Mid-right' => '中央å³', + 'Top' => '上', + }, + }, + 'AFPredictor' => 'AF予測', + 'AFResponse' => 'AFレスãƒãƒ³ã‚¹', + 'AFResult' => 'AFçµæžœ', + 'AFSearch' => { + Description => 'AFサーãƒ', + PrintConv => { + 'Not Ready' => '準備ãŒã§ãã¦ã„ãªã„', + 'Ready' => '準備完了', + }, + }, + 'AIServoContinuousShooting' => 'AI SERVO 連続撮影・撮影速度優先', + 'AIServoImagePriority' => { + Description => 'AIサーボ1コマ目/2コマ目以é™å‹•ä½œ', + PrintConv => { + '1: AF, 2: Drive speed' => 'ピント優先/撮影速度優先', + '1: AF, 2: Tracking' => 'ピント優先/被写体追従優先', + '1: Release, 2: Drive speed' => 'レリーズ優先/撮影速度最優先', + }, + }, + 'AIServoTrackingMethod' => { + Description => 'AIサーボ時ã®æ¸¬è·ç‚¹é¸æŠžç‰¹æ€§', + PrintConv => { + 'Continuous AF track priority' => '測è·é€£ç¶šæ€§å„ªå…ˆ', + 'Main focus point priority' => '測è·ä¸­å¿ƒå„ªå…ˆ', + }, + }, + 'AIServoTrackingSensitivity' => { + Description => 'AIサーボ時ã®è¢«å†™ä½“追従æ•æ„Ÿåº¦', + PrintConv => { + 'Fast' => '速ã„', + 'Slow' => 'é…ã„', + 'Standard' => 'スタンダード', + }, + }, + 'APEVersion' => 'APEãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'ARMIdentifier' => 'ARM識別å­', + 'ARMVersion' => 'ARMãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'AToB0' => 'Aã‹ã‚‰B0', + 'AToB1' => 'Aã‹ã‚‰B1', + 'AToB2' => 'Aã‹ã‚‰B2', + 'AccessoryType' => 'アクセサリータイプ', + 'ActionAdvised' => '動作推奨', + 'ActiveArea' => 'アクティブ領域', + 'ActiveD-Lighting' => { + Description => 'アクティブDライティング', + PrintConv => { + 'High' => '高ã„', + 'Low' => 'ソフト', + 'Normal' => '標準', + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ActiveD-LightingMode' => { + PrintConv => { + 'High' => '高ã„', + 'Low' => 'ソフト', + 'Normal' => '標準', + 'Off' => 'オフ', + }, + }, + 'AddAspectRatioInfo' => { + Description => 'アスペクト比情報ã®ä»˜åŠ ', + PrintConv => { + 'Off' => 'オフ', + }, + }, + 'AddOriginalDecisionData' => { + Description => 'オリジナル画åƒåˆ¤å®šç”¨ãƒ‡ãƒ¼ã‚¿ã®ä»˜åŠ ', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'AdjustmentMode' => '調整モード', + 'AdultContentWarning' => { + PrintConv => { + 'Unknown' => 'ä¸æ˜Ž', + }, + }, + 'AdvancedRaw' => { + Description => 'アドãƒãƒ³ã‚¹RAW', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'AdvancedSceneMode' => { + PrintConv => { + 'Auto' => 'インテリジェントオート', + }, + }, + 'Album' => 'アルãƒãƒ ', + 'AlphaByteCount' => 'アルファãƒã‚¤ãƒˆæ•°', + 'AlphaDataDiscard' => { + Description => 'アルファデータ破棄', + PrintConv => { + 'Flexbits Discarded' => 'フレックスビット破棄', + 'Full Resolution' => '完全ãªè§£åƒåº¦', + 'HighPass Frequency Data Discarded' => 'ãƒã‚¤ãƒ‘ス周波数データ破棄', + 'Highpass and LowPass Frequency Data Discarded' => 'ãƒã‚¤ãƒ‘スã¨ãƒ­ãƒ¼ãƒ‘ス周波数データ破棄', + }, + }, + 'AlphaOffset' => 'アルファオフセット', + 'AnalogBalance' => 'アナログãƒãƒ©ãƒ³ã‚¹', + 'Annotations' => 'フォトショップ注釈', + 'Anti-Blur' => { + PrintConv => { + 'Off' => 'オフ', + 'On (Continuous)' => 'オン(連写)', + 'On (Shooting)' => 'オン(撮影)', + 'n/a' => '該当無ã—', + }, + }, + 'AntiAliasStrength' => 'カメラã®ã‚¢ãƒ³ãƒã‚¨ã‚¤ãƒªã‚¢ã‚¹ãƒ•ã‚£ãƒ«ã‚¿ã®ç›¸å¯¾çš„ãªå¼·åº¦', + 'Aperture' => '絞り', + 'ApertureRange' => { + Description => '絞り数値ã®åˆ¶å¾¡ç¯„囲ã®è¨­å®š', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'ApertureRingUse' => { + Description => '絞りリングã®ä½¿ç”¨', + PrintConv => { + 'Permitted' => '許å¯', + 'Prohibited' => 'ç¦æ­¢', + }, + }, + 'ApertureValue' => '絞り', + 'ApplicationRecordVersion' => 'アプリケーションレコードãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'ApplyShootingMeteringMode' => { + Description => '撮影・測光モードã®å‘¼å‡º', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'Artist' => 'ç”»åƒä½œæˆè€…', + 'AsShotICCProfile' => '撮影時ICCプロファイル', + 'AsShotNeutral' => 'ニュートラルショット', + 'AsShotPreProfileMatrix' => '撮影時プロファイルマトリックス', + 'AsShotProfileName' => '撮影時プロフィールå', + 'AsShotWhiteXY' => 'ホワイトX-Yショット', + 'AssignFuncButton' => { + Description => 'FUNC.ボタンã®æ©Ÿèƒ½', + PrintConv => { + 'Exposure comp./AEB setting' => '露出補正ï¼AEB設定', + 'Image jump with main dial' => 'メイン電å­ãƒ€ã‚¤ãƒ¤ãƒ« ã§ã®ç”»åƒé€ã‚Š', + 'Image quality' => '記録画質é¸æŠž', + 'LCD brightness' => '液晶ã®æ˜Žã‚‹ã•', + 'Live view function settings' => 'ライブビュー機能設定', + }, + }, + 'AssistButtonFunction' => { + Description => 'アシストボタンã®æ©Ÿèƒ½', + PrintConv => { + 'Av+/- (AF point by QCD)' => 'Av±(サブ電å­ï¼šAFフレームé¸æŠžï¼‰', + 'FE lock' => 'FEロック', + 'Normal' => '標準', + 'Select HP (while pressing)' => 'HPã«ç§»å‹•ï¼ˆæŠ¼ã—ã¦ã„る間)', + 'Select Home Position' => 'HPã«ç§»å‹•', + }, + }, + 'Audio' => { + Description => '音声', + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'AudioDuration' => 'オーディオ時間', + 'AudioOutcue' => 'オーディオ終了åˆå›³', + 'AudioSamplingRate' => 'オーディオサンプリングレート', + 'AudioSamplingResolution' => 'オーディオサンプリング解åƒåº¦', + 'AudioType' => 'オーディオタイプ', + 'Author' => '作者', + 'AuthorsPosition' => 'å½¹è·å', + 'AutoAperture' => { + Description => '自動絞り', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'AutoBracket' => 'オートブラケット', + 'AutoBracketModeM' => { + Description => 'オートブラケット(モードM)', + PrintConv => { + 'Flash Only' => 'フラッシュã®ã¿', + 'Flash/Aperture' => 'フラッシュ/絞り', + 'Flash/Speed' => 'フラッシュ/シャッター速度', + 'Flash/Speed/Aperture' => 'フラッシュ/シャッター速度/絞り', + }, + }, + 'AutoBracketOrder' => 'ブラケット順', + 'AutoBracketSet' => { + Description => 'オートブラケット設定', + PrintConv => { + 'AE & Flash' => '自動露出&フラッシュ', + 'AE Only' => '自動露出ã®ã¿', + 'Flash Only' => 'フラッシュã®ã¿', + 'WB Bracketing' => 'ホワイトãƒãƒ©ãƒ³ã‚¹ãƒ–ラケット', + }, + }, + 'AutoBracketing' => { + Description => 'オートブラケット', + PrintConv => { + 'No flash & flash' => 'フラッシュ無ã—&フラッシュ有り', + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'AutoBracketingSet' => 'オートブラケット設定', + 'AutoExposureBracketing' => { + Description => 'フラッシュãƒã‚¤ã‚¢ã‚¹', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + 'On (shot 1)' => 'オン(ショット1)', + 'On (shot 2)' => 'オン(ショット2)', + 'On (shot 3)' => 'オン(ショット3)', + }, + }, + 'AutoFP' => { + Description => 'オートFP', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'AutoFocus' => { + Description => 'オートフォーカス', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'AutoISO' => { + Description => 'ISOオート', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'AutoISOMax' => 'ISOオート 最大感度', + 'AutoISOMinShutterSpeed' => 'ISOオート 最å°ã‚·ãƒ£ãƒƒã‚¿ãƒ¼é€Ÿåº¦', + 'AutoLightingOptimizer' => { + Description => 'オートライティングオプティマイザ', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + 'Low' => 'ソフト', + 'Off' => 'オフ', + 'Standard' => 'スタンダード', + 'Strong' => 'å¼·', + 'n/a' => '該当無ã—', + }, + }, + 'AutoLightingOptimizerOn' => { + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'AutoRedEye' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'AutoRotate' => { + Description => '自動回転', + PrintConv => { + 'None' => 'ç„¡ã—', + 'Rotate 180' => '180度回転', + 'Rotate 270 CW' => '270度回転 CW', + 'Rotate 90 CW' => '90度回転 CW', + 'n/a' => 'ソフトウェアã§å›žè»¢', + }, + }, + 'AuxiliaryLens' => '補助レンズ', + 'AvApertureSetting' => 'Av絞り設定', + 'AvSettingWithoutLens' => { + Description => 'レンズ未装ç€æ™‚ã®çµžã‚Šæ•°å€¤è¨­å®š', + PrintConv => { + 'Disable' => 'ä¸å¯', + 'Enable' => 'å¯', + }, + }, + 'BToA0' => 'Bã‹ã‚‰A0', + 'BToA1' => 'Bã‹ã‚‰A1', + 'BToA2' => 'Bã‹ã‚‰A2', + 'BWFilter' => '白黒フィルター', + 'BWMode' => { + Description => '白黒モード', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'BabyAge' => '赤ã¡ã‚ƒã‚“/ペットã®å¹´é½¢', + 'BackgroundColorIndicator' => '背景色指標', + 'BackgroundColorValue' => '背景色値', + 'BackgroundTiling' => { + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'BadFaxLines' => '粗悪ãªFAXç·š', + 'BannerImageType' => { + PrintConv => { + 'None' => 'ç„¡ã—', + }, + }, + 'BaseExposureCompensation' => '基本露出補正', + 'BaseISO' => 'ベース感度', + 'BaselineExposure' => 'ベースライン露出', + 'BaselineNoise' => 'ベースラインノイズ', + 'BaselineSharpness' => 'ベースラインシャープãƒã‚¹', + 'BatteryInfo' => 'é›»æº', + 'BatteryLevel' => 'ãƒãƒƒãƒ†ãƒªãƒ¼ãƒ¬ãƒ™ãƒ«', + 'BatteryOrder' => { + Description => 'ãƒãƒƒãƒ†ãƒªãƒ¼é †', + PrintConv => { + 'Camera Battery First' => 'カメラã®ãƒãƒƒãƒ†ãƒªãƒ¼ã‚’最åˆã«ä½¿ã†', + 'MB-D10 First' => 'MB-D10ã®ãƒãƒƒãƒ†ãƒªãƒ¼ã‚’最åˆã«ä½¿ã†', + }, + }, + 'BayerGreenSplit' => 'ベイヤーグリーン分割', + 'Beep' => { + Description => 'ビープ', + PrintConv => { + 'High' => '高ã„', + 'Low' => '低ã„', + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'BestQualityScale' => '高å“質スケール', + 'BestShotMode' => { + Description => 'ベストショットモード', + PrintConv => { + 'Off' => 'オフ', + }, + }, + 'BitDepth' => 'ビット深度', + 'BitsPerComponent' => 'コンãƒãƒ¼ãƒãƒ³ãƒˆã‚ãŸã‚Šãƒ“ット', + 'BitsPerExtendedRunLength' => '拡張ランレングスã‚ãŸã‚Šã®ãƒ“ット', + 'BitsPerRunLength' => 'ランレングスã‚ãŸã‚Šã®ãƒ“ット', + 'BitsPerSample' => 'コンãƒãƒ¼ãƒãƒ³ãƒˆã®ãƒ“ット数', + 'BlackLevel' => '黒レベル', + 'BlackLevel2' => '黒レベル2', + 'BlackLevelDeltaH' => '黒レベルデルタH', + 'BlackLevelDeltaV' => '黒レベルデルタV', + 'BlackLevelRepeatDim' => '黒レベルå復値', + 'BlackPoint' => '黒点', + 'BlueBalance' => 'ブルーãƒãƒ©ãƒ³ã‚¹', + 'BlueMatrixColumn' => 'é’色マトリックス列', + 'BlueTRC' => 'é’色調増殖曲線', + 'BlurWarning' => { + Description => '手振れ警告', + PrintConv => { + 'Blur Warning' => '手振れ警告', + 'None' => 'ç„¡ã—', + }, + }, + 'BodyBatteryADLoad' => 'é›»æºA/D本体起動時', + 'BodyBatteryADNoLoad' => 'é›»æºA/D本体オフ時', + 'BodyBatteryState' => 'é›»æºçŠ¶æ…‹æœ¬ä½“', + 'BodyFirmwareVersion' => '本体ファームウェアãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'BracketMode' => { + Description => 'ブラケットモード', + PrintConv => { + 'Off' => 'オフ', + }, + }, + 'BracketSequence' => 'ブラケットシーケンス', + 'BracketShotNumber' => { + Description => 'ブラケットショット数', + PrintConv => { + 'n/a' => '該当無ã—', + }, + }, + 'BracketStep' => { + Description => 'ブラケットステップ', + PrintConv => { + '1 EV' => '1ステップ', + '1/3 EV' => '1/3ステップ', + '2/3 EV' => '2/3ステップ', + }, + }, + 'BracketValue' => 'ブラケット値', + 'Brightness' => 'ブライトãƒã‚¹', + 'BrightnessData' => 'ブライトãƒã‚¹ãƒ‡ãƒ¼ã‚¿', + 'BrightnessValue' => 'ブライトãƒã‚¹', + 'BulbDuration' => 'ãƒãƒ«ãƒ–時間', + 'BurstMode' => { + Description => 'ブラストモード', + PrintConv => { + 'Auto Exposure Bracketing (AEB)' => 'ç„¡é™', + 'Infinite' => 'ç„¡é™', + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ButtonFunctionControlOff' => { + Description => 'サブ電å­ãƒ€ã‚¤ãƒ¤ãƒ«ã€ˆOFF〉時ã®ãƒœã‚¿ãƒ³æ“作', + PrintConv => { + 'Disable main, Control, Multi-control' => 'メイン電å­ãƒ€ã‚¤ãƒ¤ãƒ«ã€ã‚µãƒ–é›»å­ãƒ€ã‚¤ãƒ¤ãƒ«ã€ãƒžãƒ«ãƒã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ©ãƒ¼ã¯ç„¡åŠ¹', + 'Normal (enable)' => '通常(有効)', + }, + }, + 'By-line' => '製作者', + 'By-lineTitle' => '製作者ã®è·ç¨®', + 'CCDScanMode' => { + Description => 'CCDスキャンモード', + PrintConv => { + 'Interlaced' => 'インタレース', + 'Progressive' => 'プログレッシブ', + }, + }, + 'CFALayout' => 'CFAレイアウト', + 'CFAPattern' => 'CFAパターン', + 'CFAPattern2' => 'CFAパターン2', + 'CFAPlaneColor' => 'CFAプレーン色', + 'CFARepeatPatternDim' => 'CFAå復パターン特性', + 'CLModeShootingSpeed' => 'CLモード撮影速度', + 'CMContrast' => 'CMコントラスト', + 'CMExposureCompensation' => 'CM露出補正', + 'CMHue' => 'CM色相', + 'CMMFlags' => 'CMMフラグ', + 'CMSaturation' => 'CM彩度', + 'CMSharpness' => 'CMシャープãƒã‚¹', + 'CMWhiteBalance' => 'CMホワイトãƒãƒ©ãƒ³ã‚¹', + 'CMWhiteBalanceComp' => 'CMホワイトãƒãƒ©ãƒ³ã‚¹è£œæ­£', + 'CMWhiteBalanceGrayPoint' => 'CMホワイトãƒãƒ©ãƒ³ã‚¹ã‚°ãƒ¬ãƒ¼ãƒã‚¤ãƒ³ãƒˆ', + 'CMYKEquivalent' => 'CMYK等価物', + 'CPUFirmwareVersion' => 'CPUファームウエアãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'CPUType' => { + PrintConv => { + 'None' => 'ç„¡ã—', + }, + }, + 'CalibrationDateTime' => 'キャリブレーション日時', + 'CalibrationIlluminant1' => { + Description => 'å…‰æºã‚­ãƒ£ãƒªãƒ–レーション1', + PrintConv => { + 'Cloudy' => '曇り', + 'Cool White Fluorescent' => '白色è›å…‰ç¯', + 'Day White Fluorescent' => '昼白色è›å…‰ç¯', + 'Daylight' => '昼光', + 'Daylight Fluorescent' => '昼光色è›å…‰ç¯', + 'Fine Weather' => '良ã„天気', + 'Flash' => 'ストロボ', + 'Fluorescent' => 'è›å…‰ç¯', + 'ISO Studio Tungsten' => 'ISOスタジオタングステン', + 'Other' => 'ãã®ä»–ã®å…‰æº', + 'Shade' => '日陰', + 'Standard Light A' => '標準ライトA', + 'Standard Light B' => '標準ライトB', + 'Standard Light C' => '標準ライトC', + 'Tungsten (Incandescent)' => 'タングステン(白熱ç¯)', + 'Unknown' => 'ä¸æ˜Ž', + 'Warm White Fluorescent' => '暖白光色è›å…‰ç¯', + 'White Fluorescent' => '温白色è›å…‰ç¯', + }, + }, + 'CalibrationIlluminant2' => { + Description => 'å…‰æºã‚­ãƒ£ãƒªãƒ–レーション2', + PrintConv => { + 'Cloudy' => '曇り', + 'Cool White Fluorescent' => '白色è›å…‰ç¯', + 'Day White Fluorescent' => '昼白色è›å…‰ç¯', + 'Daylight' => '昼光', + 'Daylight Fluorescent' => '昼光色è›å…‰ç¯', + 'Fine Weather' => '良ã„天気', + 'Flash' => 'ストロボ', + 'Fluorescent' => 'è›å…‰ç¯', + 'ISO Studio Tungsten' => 'ISOスタジオタングステン', + 'Other' => 'ãã®ä»–ã®å…‰æº', + 'Shade' => '日陰', + 'Standard Light A' => '標準ライトA', + 'Standard Light B' => '標準ライトB', + 'Standard Light C' => '標準ライトC', + 'Tungsten (Incandescent)' => 'タングステン(白熱ç¯)', + 'Unknown' => 'ä¸æ˜Ž', + 'Warm White Fluorescent' => '暖白光色è›å…‰ç¯', + 'White Fluorescent' => '温白色è›å…‰ç¯', + }, + }, + 'CameraCalibration1' => 'カメラキャリブレーション1', + 'CameraCalibration2' => 'カメラキャリブレーション2', + 'CameraCalibrationSig' => 'カメラキャリブレーションサイン', + 'CameraID' => 'カメラID', + 'CameraISO' => 'カメラISO', + 'CameraInfo' => 'ペンタックスモデル', + 'CameraOrientation' => { + Description => 'ç”»åƒã®å‘ã', + PrintConv => { + 'Horizontal (normal)' => '水平(標準)', + 'Rotate 270 CW' => '270度回転 CW', + 'Rotate 90 CW' => '90度回転 CW', + }, + }, + 'CameraParameters' => 'カメラパラメーター', + 'CameraSerialNumber' => 'カメラシリアル番å·', + 'CameraSettings' => 'カメラ設定', + 'CameraSettingsVersion' => 'カメラ設定ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'CameraTemperature' => 'カメラ温度', + 'CameraType' => { + Description => 'カメラタイプ', + PrintConv => { + 'Compact' => 'コンパクト', + 'DV Camera' => 'DVカメラ', + 'EOS High-end' => 'EOSãƒã‚¤ã‚¨ãƒ³ãƒ‰', + 'EOS Mid-range' => 'EOSミドルレンジ', + }, + }, + 'CameraType2' => 'カメラタイプ2', + 'CanonAFInfo' => 'AF情報', + 'CanonAFInfo2' => 'AF情報2', + 'CanonExposureMode' => { + Description => '露出モード', + PrintConv => { + 'Aperture-priority AE' => '絞り優先', + 'Bulb' => 'ãƒãƒ«ãƒ–', + 'Depth-of-field AE' => '被写界深度AE', + 'Easy' => 'ç°¡å˜', + 'Manual' => 'マニュアル', + 'Program AE' => 'プログラムAE', + 'Shutter speed priority AE' => 'シャッター優先', + }, + }, + 'CanonFileInfo' => 'ファイル情報', + 'CanonFileLength' => 'ファイル長', + 'CanonFirmwareVersion' => 'ファームウェアãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'CanonFlashMode' => { + Description => 'フラッシュモード', + PrintConv => { + 'Auto' => 'オート', + 'External flash' => '外付フラッシュ', + 'Off' => 'オフ', + 'On' => 'オン', + 'Red-eye reduction' => '赤目軽減', + 'Red-eye reduction (Auto)' => '赤目軽減(オート)', + 'Red-eye reduction (On)' => '赤目軽減(オン)', + 'Slow-sync' => 'スローシンクロ', + }, + }, + 'CanonFocalLength' => 'フォーカスタイプ', + 'CanonImageHeight' => 'ç”»åƒé«˜ã•', + 'CanonImageSize' => { + Description => 'イメージサイズ', + PrintConv => { + 'Large' => 'ラージ', + 'Medium' => 'ミドル', + 'Medium 1' => 'ミドル1', + 'Medium 2' => 'ミドル2', + 'Medium 3' => 'ミドル3', + 'Medium Movie' => 'ミディアム動画', + 'Postcard' => 'ãƒã‚¬ã‚­', + 'Small' => 'スモール', + 'Small 1' => 'スモール1', + 'Small 2' => 'スモール2', + 'Small 3' => 'スモール3', + 'Small Movie' => 'スモール動画', + 'Widescreen' => 'ワイド画é¢', + }, + }, + 'CanonImageType' => 'イメージタイプ', + 'CanonImageWidth' => 'ç”»åƒå¹…', + 'CanonModelID' => 'モデルID', + 'Caption-Abstract' => '表題/説明', + 'CaptionWriter' => 'キャプション作æˆè€…', + 'CasioImageSize' => 'カシオイメージサイズ', + 'Categories' => 'カテゴリー', + 'Category' => 'カテゴリー', + 'CellLength' => 'セル長', + 'CellWidth' => 'セル幅', + 'CenterAFArea' => { + Description => '中央AFエリア', + PrintConv => { + 'Normal Zone' => 'ノーマルゾーン', + 'Wide Zone' => 'ワイドゾーン', + }, + }, + 'CenterWeightedAreaSize' => { + Description => '中央é‡ç‚¹ã‚¨ãƒªã‚¢', + PrintConv => { + 'Average' => 'å¹³å‡', + }, + }, + 'CharTarget' => '目的文字', + 'CharacterSet' => 'キャラクターセット', + 'ChromaBlurRadius' => '彩度ã¼ã‘åŠå¾„', + 'ChromaticAdaptation' => '色彩順応化', + 'Chromaticity' => '色度', + 'ChrominanceNR_TIFF_JPEG' => { + PrintConv => { + 'High' => '高ã„', + 'Low' => 'ソフト', + 'Off' => 'オフ', + }, + }, + 'ChrominanceNoiseReduction' => { + PrintConv => { + 'High' => '高ã„', + 'Low' => 'ソフト', + 'Off' => 'オフ', + }, + }, + 'City' => '都市', + 'ClassifyState' => '分類状態', + 'CleanFaxData' => '純粋ãªFAXデータ', + 'ClipPath' => 'クリップパス', + 'CodedCharacterSet' => 'キャラクタセットコード', + 'ColorAberrationControl' => { + Description => '色åŽå·®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ColorAdjustment' => '色調整', + 'ColorAdjustmentMode' => { + Description => '色調整モード', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ColorBalance' => 'カラーãƒãƒ©ãƒ³ã‚¹', + 'ColorBalanceAdj' => { + Description => 'カラーãƒãƒ©ãƒ³ã‚¹èª¿æ•´', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ColorBalanceBlue' => 'カラーãƒãƒ©ãƒ³ã‚¹é’', + 'ColorBalanceGreen' => 'カラーãƒãƒ©ãƒ³ã‚¹ç·‘', + 'ColorBalanceRed' => 'カラーãƒãƒ©ãƒ³ã‚¹èµ¤', + 'ColorBoostData' => 'カラーブーストデータ', + 'ColorBoostLevel' => 'カラーブーストレベル1', + 'ColorBoostType' => { + Description => 'カラーブーストタイプ', + PrintConv => { + 'Nature' => '自然', + 'People' => '人々', + }, + }, + 'ColorBooster' => { + Description => 'カラーブースター', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ColorCalibrationMatrix' => 'カラーキャリブレーションマトリックステーブル', + 'ColorCharacterization' => 'カラー特徴æ写', + 'ColorControl' => 'カラーコントロール', + 'ColorEffect' => { + Description => 'カラーエフェクト', + PrintConv => { + 'Black & White' => '白黒', + 'Cool' => '冷色', + 'Off' => 'オフ', + 'Sepia' => 'セピア', + 'Warm' => '暖色', + }, + }, + 'ColorFilter' => { + Description => 'カラーフィルター', + PrintConv => { + 'Black & White' => '白黒', + 'Blue' => 'é’', + 'Green' => 'ç·‘', + 'Off' => 'オフ', + 'Pink' => 'ピンク', + 'Purple' => 'ç´«', + 'Red' => '赤', + 'Sepia' => 'セピア', + 'Yellow' => '黄色', + }, + }, + 'ColorGain' => 'カラーゲイン', + 'ColorHue' => '色相', + 'ColorInfo' => '色情報', + 'ColorMap' => 'カラーマップ', + 'ColorMatrix' => 'カラーマトリックス', + 'ColorMatrix1' => 'カラーマトリックス1', + 'ColorMatrix2' => 'カラーマトリックス2', + 'ColorMatrixNumber' => 'カラーマトリックス番å·', + 'ColorMode' => { + Description => 'カラーモード', + PrintConv => { + 'Autumn Leaves' => '紅葉', + 'B & W' => '白黒', + 'B&W' => '白黒', + 'Black & White' => '白黒', + 'Chrome' => 'クローム', + 'Clear' => 'クリアー', + 'Deep' => 'ディープ', + 'Evening' => '夕焼ã‘', + 'Landscape' => '風景', + 'Light' => 'ライト', + 'Natural' => 'ナãƒãƒ¥ãƒ©ãƒ«', + 'Natural color' => 'ナãƒãƒ¥ãƒ©ãƒ«ã‚«ãƒ©ãƒ¼', + 'Natural sRGB' => 'ナãƒãƒ¥ãƒ©ãƒ« sRGB', + 'Natural+ sRGB' => 'ナãƒãƒ¥ãƒ©ãƒ«+ sRGB', + 'Neutral' => 'ニュートラル', + 'Night Portrait' => '人物夜景', + 'Night Scene' => '夜景', + 'Night View' => 'ナイトビュー', + 'Night View/Portrait' => '夜景/夜景ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Normal' => 'ノーマル', + 'Off' => 'オフ', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Sepia' => 'セピア', + 'Solarization' => 'ソラリゼーション', + 'Standard' => 'スタンダード', + 'Sunset' => '夕日', + 'Vivid' => 'ビビッド', + 'Vivid color' => 'ビビッドカラー', + }, + }, + 'ColorMoireReduction' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ColorMoireReductionMode' => { + Description => '色モアレリダクション', + PrintConv => { + 'High' => '高ã„', + 'Low' => 'ソフト', + 'Off' => 'オフ', + }, + }, + 'ColorPalette' => 'カラーパレット', + 'ColorProfile' => { + Description => 'カラープロフィール', + PrintConv => { + 'Embedded' => '埋ã‚è¾¼ã¿', + 'Not Embedded' => '埋ã‚è¾¼ã¿ç„¡ã—', + }, + }, + 'ColorRepresentation' => '色表ç¾', + 'ColorReproduction' => '色å†ç¾', + 'ColorResponseUnit' => '色応答å˜ä½', + 'ColorSequence' => 'カラーシーケンス', + 'ColorSpace' => { + Description => '色空間', + PrintConv => { + 'ICC Profile' => 'ICCプロフィール', + 'Monochrome' => 'モノトーン', + 'Uncalibrated' => '未調整', + }, + }, + 'ColorSpaceData' => 'カラースペースデータ', + 'ColorTable' => 'カラーテーブル', + 'ColorTemperature' => '色温度', + 'ColorTone' => { + Description => 'カラートーン', + PrintConv => { + 'Normal' => '標準', + }, + }, + 'ColorToneFaithful' => 'カラートーン忠実設定', + 'ColorToneLandscape' => 'カラートーン風景', + 'ColorToneNeutral' => 'カラートーンニュートラル', + 'ColorTonePortrait' => 'カラートーンãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'ColorToneStandard' => 'カラートーンスタンダード', + 'ColorToneUserDef1' => 'カラートーンユーザ設定1', + 'ColorToneUserDef2' => 'カラートーンユーザ設定2', + 'ColorToneUserDef3' => 'カラートーンユーザ設定3', + 'ColorantOrder' => 'ç€è‰²é †', + 'ColorantTable' => 'ç€è‰²ãƒ†ãƒ¼ãƒ–ル', + 'ColorimetricReference' => '比色分æžå‚ç…§', + 'CommandDials' => { + Description => 'コマンダーダイヤル', + PrintConv => { + 'Reversed (Main Aperture, Sub Shutter)' => 'リãƒãƒ¼ã‚¹', + 'Standard (Main Shutter, Sub Aperture)' => 'デフォルト', + }, + }, + 'CommandDialsApertureSetting' => { + Description => 'コマンドダイヤルカスタマイズ 絞り設定', + PrintConv => { + 'Aperture Ring' => '絞りリング', + 'Sub-command Dial' => 'サブコントロールダイヤル', + }, + }, + 'CommandDialsChangeMainSub' => { + Description => 'コマンドダイヤルカスタマイズ メイン/サブ変更', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'CommandDialsMenuAndPlayback' => { + Description => 'コマンドダイヤルカスタマイズ メニューã¨å†ç”Ÿ', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'CommandDialsReverseRotation' => { + Description => 'コマンドダイヤルカスタマイズ 回転ä¿æŒ', + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'CommanderChannel' => 'コマンダーモード ãƒãƒ£ãƒ³ãƒãƒ«', + 'CommanderGroupAManualOutput' => 'コマンダーモード グループA M 補正', + 'CommanderGroupAMode' => { + Description => 'コマンダーモード グループA モード', + PrintConv => { + 'Auto Aperture' => '自動絞り(AA)', + 'Manual' => 'マニュアル', + 'Off' => 'オフ', + }, + }, + 'CommanderGroupA_TTL-AAComp' => 'コマンダーモード 内蔵フラッシュ TTL/AA 補正', + 'CommanderGroupBManualOutput' => 'コマンダーモード グループB M 補正', + 'CommanderGroupBMode' => { + Description => 'コマンダーモード グループB モード', + PrintConv => { + 'Auto Aperture' => '自動絞り(AA)', + 'Manual' => 'マニュアル', + 'Off' => 'オフ', + }, + }, + 'CommanderGroupB_TTL-AAComp' => 'コマンダーモード グループB TTL/AA 補正', + 'CommanderInternalFlash' => { + Description => 'コマンダーモード 内蔵フラッシュ モード', + PrintConv => { + 'Manual' => 'マニュアル', + 'Off' => 'オフ', + }, + }, + 'CommanderInternalManualOutput' => 'コマンダーモード 内蔵フラッシュ M 補正', + 'CommanderInternalTTLComp' => 'コマンダーモード 内蔵フラッシュ TTL 補正', + 'Comment' => 'コメント', + 'Compilation' => { + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'ComponentsConfiguration' => 'å„構æˆè¦ç´ ã®æ„味', + 'CompressedBitsPerPixel' => 'ç”»åƒåœ§ç¸®ãƒ¢ãƒ¼ãƒ‰', + 'CompressedImageSize' => '圧縮画åƒã‚µã‚¤ã‚º', + 'Compression' => { + Description => '圧縮計画', + PrintConv => { + 'JPEG' => 'JPEG圧縮率', + 'JPEG (old-style)' => 'JPEG (å¤ã„å½¢å¼)', + 'None' => 'ç„¡ã—', + 'Uncompressed' => 'éžåœ§ç¸®', + }, + }, + 'CompressionRatio' => '圧縮率', + 'CompressionType' => { + PrintConv => { + 'None' => 'ç„¡ã—', + }, + }, + 'ConditionalFEC' => 'フラッシュ露出補正', + 'ConnectionSpaceIlluminant' => '接続スペース光æº', + 'ConsecutiveBadFaxLines' => '連続的ã«ç²—悪ãªFAXç·š', + 'Contact' => '連絡', + 'ContentLocationCode' => '内容ä½ç½®ã‚³ãƒ¼ãƒ‰', + 'ContentLocationName' => '内容ä½ç½®å', + 'ContinuousDrive' => { + Description => 'ドライブモード', + PrintConv => { + 'Continuous' => '連続撮影', + 'Continuous, High' => '連写(High)', + 'Continuous, Low' => '連写(Low)', + 'Continuous, Speed Priority' => '高速連写', + 'Movie' => 'å‹•ç”»', + 'Single' => '1コマ撮影', + }, + }, + 'ContinuousShootingSpeed' => { + Description => '連続撮影速度', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'ContinuousShotLimit' => { + Description => '連続撮影時ã®æ’®å½±æžšæ•°åˆ¶é™', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'Contrast' => { + Description => 'コントラスト', + PrintConv => { + '+1 (medium high)' => '+1 (å°‘ã—高ã„)', + '+2 (high)' => '+2 (ãƒãƒ¼ãƒ‰)', + '+3 (very high)' => '+3 (ã‹ãªã‚Šé«˜ã„)', + '-1 (medium low)' => '-1 (å°‘ã—低ã„)', + '-2 (low)' => '-2 (ソフト)', + '-3 (very low)' => '-3 (ã‹ãªã‚Šä½Žã„)', + '0 (normal)' => '0 (スタンダード)', + 'Film Simulation' => 'フィルムシミュレーション', + 'High' => 'ãƒãƒ¼ãƒ‰', + 'Low' => 'ソフト', + 'Medium High' => 'å°‘ã—高ã„', + 'Medium Low' => 'å°‘ã—低ã„', + 'Normal' => 'スタンダード', + }, + }, + 'ContrastCurve' => 'コントラストカーブ', + 'ContrastFaithful' => 'コントラスト忠実設定', + 'ContrastLandscape' => 'コントラスト風景', + 'ContrastMonochrome' => 'コントラストモノクロ', + 'ContrastNeutral' => 'コントラストニュートラル', + 'ContrastPortrait' => 'コントラストãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'ContrastSetting' => 'コントラスト設定', + 'ContrastStandard' => 'コントラストスタンダード', + 'ContrastUserDef1' => 'コントラストユーザ設定1', + 'ContrastUserDef2' => 'コントラストユーザ設定2', + 'ContrastUserDef3' => 'コントラストユーザ設定3', + 'ControlMode' => { + Description => 'コントロールモード', + PrintConv => { + 'Camera Local Control' => 'カメラローカルコントロール', + 'Computer Remote Control' => 'コンピュータリモートコントロール', + 'n/a' => '該当無ã—', + }, + }, + 'ConversionLens' => { + Description => 'コンãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒ¬ãƒ³ã‚º', + PrintConv => { + 'Macro' => 'マクロ', + 'Off' => 'オフ', + 'Telephoto' => 'テレフォト', + 'Wide' => 'ワイド', + }, + }, + 'Converter' => 'コンãƒãƒ¼ã‚¿ãƒ¼', + 'Copyright' => '版権所有者', + 'CopyrightNotice' => '著作権表示', + 'CopyrightStatus' => { + PrintConv => { + 'Unknown' => 'ä¸æ˜Ž', + }, + }, + 'CoringFilter' => 'コアリングフィルタ', + 'CoringValues' => 'コアリング値', + 'Country' => '国å', + 'Country-PrimaryLocationCode' => 'ISO国コード', + 'Country-PrimaryLocationName' => '国', + 'CountryCode' => '撮影国コード', + 'CreateDate' => 'デジタルデータ作æˆæ—¥æ™‚', + 'CreationDate' => '作æˆæ—¥æ™‚', + 'CreativeStyle' => { + Description => 'クリエイティブスタイル', + PrintConv => { + 'Autumn' => '秋', + 'Autumn Leaves' => '紅葉', + 'B&W' => '白黒', + 'Clear' => 'クリアー', + 'Deep' => 'ディープ', + 'Landscape' => '風景', + 'Light' => 'ライト', + 'Neutral' => 'ニュートラル', + 'Night View/Portrait' => '夜景/夜景ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Sepia' => 'セピア', + 'Standard' => 'スタンダード', + 'Sunset' => '夕日', + 'Vivid' => 'ビビッド', + }, + }, + 'Creator' => '製作者', + 'CreatorAddress' => 'クリエーター - ä½æ‰€', + 'CreatorCity' => 'クリエーター - 街', + 'CreatorContactInfo' => '作æˆè€…ã®ã‚³ãƒ³ タクト先', + 'CreatorCountry' => 'クリエーター - 国', + 'CreatorPostalCode' => 'クリエーター - 郵便番å·', + 'CreatorRegion' => 'クリエーター - 国/å·ž', + 'CreatorWorkEmail' => 'クリエーター - 電å­ãƒ¡ãƒ¼ãƒ«', + 'CreatorWorkTelephone' => 'クリエーター - 電話番å·', + 'CreatorWorkURL' => 'クリエーター - WEBサイト', + 'Credit' => 'プロãƒã‚¤ãƒ€ãƒ¼', + 'CropActive' => { + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'CropData' => 'クロップデータ', + 'CropHeight' => '最終高ã•', + 'CropHiSpeed' => 'ãƒã‚¤ã‚¹ãƒ”ードクロップ', + 'CropLeft' => '開始オフセットX', + 'CropTop' => '開始オフセットY', + 'CropWidth' => '最終幅', + 'CurrentICCProfile' => 'カレントICCプロファイル', + 'CurrentPreProfileMatrix' => 'カレントプロファイルマトリックス', + 'Curves' => { + Description => 'カーブ', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Custom1' => 'カスタム1', + 'Custom2' => 'カスタム2', + 'Custom3' => 'カスタム3', + 'Custom4' => 'カスタム4', + 'CustomRendered' => { + Description => 'カスタム画åƒå‡¦ç†', + PrintConv => { + 'Custom' => 'カスタム処ç†', + 'Normal' => '標準処ç†', + }, + }, + 'CustomSaturation' => 'カスタム彩度', + 'D-LightingHQ' => { + Description => 'DライティングHQ', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'D-LightingHQColorBoost' => 'DライティングHQカラーブースト', + 'D-LightingHQHighlight' => 'DライティングHQãƒã‚¤ãƒ©ã‚¤ãƒˆ', + 'D-LightingHQSelected' => { + Description => 'DライティングHQé¸æŠž', + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'D-LightingHQShadow' => 'DライティングHQシャドウ', + 'D-LightingHS' => { + Description => 'DライティングHS', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'D-LightingHSAdjustment' => 'DライティングHS調整', + 'D-LightingHSColorBoost' => 'DライティングHSカラーブースト', + 'DECPosition' => { + Description => 'DECä½ç½®', + PrintConv => { + 'Contrast' => 'コントラスト', + 'Exposure' => '露出', + 'Filter' => 'フィルター', + 'Saturation' => '彩度', + }, + }, + 'DNGBackwardVersion' => 'DNGãƒãƒƒã‚¯ãƒ¯ãƒ¼ãƒ‰ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'DNGLensInfo' => 'レンズ情報', + 'DNGVersion' => 'DNGãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'DSPFirmwareVersion' => 'DSPファームウエアãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'DataCompressionMethod' => 'データ圧縮アルゴリズム プロãƒã‚¤ãƒ€ãƒ¼/オーナー', + 'DataDump' => 'データダンプ', + 'DataImprint' => { + Description => 'データインプリント', + PrintConv => { + 'None' => 'ç„¡ã—', + 'Text' => 'テキスト', + }, + }, + 'DataType' => '日付型', + 'Date' => '日付', + 'DateCreated' => '作æˆæ—¥ä»˜', + 'DateDisplayFormat' => { + Description => '日付形å¼', + PrintConv => { + 'D/M/Y' => 'æ—¥/月/å¹´', + 'M/D/Y' => '月/æ—¥/å¹´', + 'Y/M/D' => 'å¹´/月/æ—¥', + }, + }, + 'DateSent' => '発é€æ—¥ä»˜', + 'DateStampMode' => { + Description => '日付スタンプモード', + PrintConv => { + 'Date' => '日付', + 'Off' => 'オフ', + }, + }, + 'DateTime' => 'ファイル作æˆæ—¥æ™‚', + 'DateTimeOriginal' => 'オリジナルデータ作æˆæ—¥æ™‚', + 'DaylightSavings' => { + Description => 'å¤æ™‚é–“', + PrintConv => { + 'No' => 'オフ', + 'Yes' => 'オン', + }, + }, + 'DefaultCropOrigin' => 'デフォルト切å–り基点', + 'DefaultCropSize' => 'デフォルト切å–りサイズ', + 'DefaultScale' => 'デフォルトスケール', + 'DeletedImageCount' => '削除イメージカウント', + 'Description' => '説明', + 'Destination' => '宛先', + 'DestinationCity' => '目的地', + 'DestinationCityCode' => '目的地コード', + 'DestinationDST' => { + Description => '目的地DST', + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'DevelopmentDynamicRange' => '進化ダイナミックレンジ', + 'DeviceAttributes' => '機器属性', + 'DeviceManufacturer' => '機器メーカー', + 'DeviceMfgDesc' => '機器メーカー説明', + 'DeviceModel' => '機器モデル', + 'DeviceModelDesc' => '機器モデル説明', + 'DeviceSettingDescription' => 'デãƒã‚¤ã‚¹è¨­å®šã®èª¬æ˜Ž', + 'DialDirectionTvAv' => { + Description => 'Tv/Av値設定時ã®ãƒ€ã‚¤ãƒ¤ãƒ«å›žè»¢', + PrintConv => { + 'Normal' => '通常', + 'Reversed' => '設定方å‘ã‚’å転', + }, + }, + 'DigitalCreationDate' => 'デジタル作æˆæ—¥ä»˜', + 'DigitalCreationTime' => 'デジタル作æˆæ™‚é–“', + 'DigitalGEM' => 'デジタルGEM', + 'DigitalICE' => 'デジタルICE', + 'DigitalROC' => 'デジタルROC', + 'DigitalZoom' => { + Description => 'デジタルズーム', + PrintConv => { + 'None' => 'ç„¡ã—', + 'Off' => 'オフ', + 'Other' => '未確èª', + }, + }, + 'DigitalZoomOn' => { + Description => 'デジタルズームオン', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'DigitalZoomRatio' => 'デジタルズーム比率', + 'Directory' => 'ファイルã®å ´æ‰€', + 'DirectoryIndex' => 'ディレクトリ索引', + 'DirectoryNumber' => 'ディレクトリ番å·', + 'DisplayAperture' => '絞り表示', + 'DisplaySize' => { + PrintConv => { + 'Normal' => '標準', + }, + }, + 'DistortionCorrection' => { + Description => '歪曲修正', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'DistortionCorrection2' => { + Description => '歪曲補正編集', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'DjVuVersion' => 'DjVuãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'DocumentHistory' => '文書履歴', + 'DocumentName' => 'ドキュメントå', + 'DocumentNotes' => '文書ノート', + 'DotRange' => 'ドット範囲', + 'DriveMode' => { + Description => 'ドライブモード', + PrintConv => { + 'Bracketing' => 'ブラケット', + 'Burst' => '高速連射', + 'Continuous' => '連続撮影', + 'Continuous High' => '連射 (Hi)', + 'Continuous Shooting' => '連続撮影', + 'HS continuous' => 'HS連写', + 'Interval' => 'インターãƒãƒ«', + 'Multiple Exposure' => '複数ã®éœ²å‡º', + 'No Timer' => 'タイマー無ã—', + 'Off' => 'オフ', + 'Remote Control' => 'リモコン', + 'Remote Control (3 s delay)' => 'リモコン (3秒後レリーズ)', + 'Self-timer' => 'セルフタイマー', + 'Self-timer (12 s)' => 'セルフタイマー (12秒)', + 'Self-timer (2 s)' => 'セルフタイマー (2秒)', + 'Self-timer Operation' => 'セルフタイマー', + 'Shutter Button' => 'シャッターボタン', + 'Single' => '1コマ撮影', + 'Single Exposure' => 'シングル露出', + 'Single Frame' => '1コマ撮影', + 'Single Shot' => '1コマ撮影', + 'Single-frame' => '1コマ撮影', + 'Single-frame Shooting' => '1コマ撮影', + 'UHS continuous' => 'UHS連写', + }, + }, + 'DriveMode2' => { + Description => '多é‡éœ²å…‰', + PrintConv => { + 'Single-frame' => '1コマ撮影', + }, + }, + 'DynamicAFArea' => { + Description => 'ダイナミックAFエリア', + PrintConv => { + '21 Points' => '21点', + '51 Points' => '51点', + '51 Points (3D-tracking)' => '51点(3Dトラッキング)', + '9 Points' => '9点', + }, + }, + 'DynamicRange' => { + Description => 'ダイナミックレンジ', + PrintConv => { + 'Standard' => 'スタンダード', + 'Wide' => 'ワイド', + }, + }, + 'DynamicRangeExpansion' => { + Description => 'ダイナミックレンジ拡大', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'DynamicRangeOptimizer' => { + Description => 'Dレンジオプティマイザー', + PrintConv => { + 'Advanced Auto' => 'アドãƒãƒ³ã‚¹ã‚ªãƒ¼ãƒˆ', + 'Advanced Lv1' => 'アドãƒãƒ³ã‚¹Lv1', + 'Advanced Lv2' => 'アドãƒãƒ³ã‚¹Lv2', + 'Advanced Lv3' => 'アドãƒãƒ³ã‚¹Lv3', + 'Advanced Lv4' => 'アドãƒãƒ³ã‚¹Lv4', + 'Advanced Lv5' => 'アドãƒãƒ³ã‚¹Lv5', + 'Auto' => 'オート', + 'Off' => 'オフ', + 'Standard' => 'スタンダード', + }, + }, + 'DynamicRangeSetting' => 'ダイナミックレンジ設定', + 'E-DialInProgram' => { + Description => 'é›»å­ãƒ€ã‚¤ãƒ¤ãƒ«ãƒ—ログラム', + PrintConv => { + 'P Shift' => 'Pシフト', + 'Tv or Av' => 'Tvã‹Av', + }, + }, + 'ETTLII' => { + PrintConv => { + 'Average' => 'å¹³å‡', + 'Evaluative' => '評価', + }, + }, + 'EVStepInfo' => 'EVステップ情報', + 'EVStepSize' => { + Description => 'EVステップ', + PrintConv => { + '1/2 EV' => '1/2ステップ', + '1/3 EV' => '1/3ステップ', + }, + }, + 'EVSteps' => { + Description => '露出ステップ', + PrintConv => { + '1/2 EV Steps' => '1/2 EVステップ', + '1/3 EV Steps' => '1/3 EVステップ', + }, + }, + 'EasyExposureCompensation' => { + Description => 'ç°¡å˜ãªéœ²å‡ºè£œæ­£', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + 'On (auto reset)' => 'オン(自動リセット)', + }, + }, + 'EasyMode' => { + Description => 'ç°¡å˜ãƒ¢ãƒ¼ãƒ‰', + PrintConv => { + 'Aquarium' => 'æ°´æ—館', + 'Beach' => 'ビーãƒ', + 'Black & White' => '白黒', + 'Color Accent' => 'カラーアクセント', + 'Color Swap' => 'スイッãƒã‚«ãƒ©ãƒ¼', + 'Digital Macro' => 'デジタルマクロ', + 'Fast shutter' => '高速シャッター', + 'Fireworks' => '花ç«', + 'Flash Off' => 'フラッシュオフ', + 'Foliage' => '葉', + 'Full auto' => 'フルオート', + 'Gray Scale' => 'グレースケール', + 'ISO 3200' => 'ISO3200', + 'Indoor' => '室内', + 'Kids & Pets' => 'キッズ&ペット', + 'Landscape' => '風景', + 'Long Shutter' => '長秒シャッター', + 'Macro' => 'マクロ', + 'Manual' => 'マニュアル', + 'My Colors' => 'ワンãƒã‚¤ãƒ³ãƒˆã‚«ãƒ©ãƒ¼', + 'Neutral' => 'ニュートラル', + 'Night' => '夜景', + 'Night Scene' => '夜景', + 'Night Snapshot' => 'ナイトスナップ', + 'Pan focus' => 'パンフォーカス', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Sepia' => 'セピア', + 'Slow shutter' => 'スローシャッター', + 'Snow' => 'スノー', + 'Sports' => 'スãƒãƒ¼ãƒ„', + 'Still Image' => 'é™æ­¢ç”»åƒ', + 'Sunset' => '夕焼ã‘', + 'Super Macro' => 'スーパーマクロ', + 'Underwater' => '水中', + 'Vivid' => 'ビビッド', + }, + }, + 'EdgeNoiseReduction' => { + Description => 'エッジノイズリダクション', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'EditStatus' => '編集状態', + 'EditorialUpdate' => { + Description => '更新編集', + PrintConv => { + 'Additional language' => '追加言語', + }, + }, + 'EffectiveLV' => '効果レベル', + 'Emphasis' => { + PrintConv => { + 'None' => 'ç„¡ã—', + }, + }, + 'EncodingProcess' => 'JPEGã®ç¬¦å·åŒ–処ç†', + 'EndPoints' => '末端', + 'EnhanceDarkTones' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Enhancement' => { + Description => '強度', + PrintConv => { + 'Blue' => 'é’', + 'Flesh Tones' => '肌調', + 'Green' => 'ç·‘', + 'Off' => 'オフ', + 'Red' => '赤', + }, + }, + 'Enhancer' => '増大値2', + 'EnhancerValues' => '増大値', + 'EnvelopeNumber' => 'エンベロープ数', + 'EnvelopePriority' => { + Description => 'エンベロープ優先度', + PrintConv => { + '0 (reserved)' => '0 (å°†æ¥æ‹¡å¼µç”¨)', + '1 (most urgent)' => '1 (高ã„緊急性)', + '5 (normal urgency)' => '5 (普通ã®ç·Šæ€¥æ€§)', + '8 (least urgent)' => '8 (低ã„緊急性)', + '9 (user-defined priority)' => '9 (ユーザ定義優先度)', + }, + }, + 'EnvelopeRecordVersion' => 'エンベロープレコードãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'EpsonImageHeight' => 'エプソン画åƒé«˜', + 'EpsonImageWidth' => 'エプソン画åƒå¹…', + 'EpsonSoftware' => 'エプソンソフトウェア', + 'Equipment' => 'イクイップメントIFDãƒã‚¤ãƒ³ã‚¿ãƒ¼', + 'EquipmentVersion' => 'イクイップメントãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'ExcursionTolerance' => '振幅許容範囲', + 'ExifCameraInfo' => 'Exifカメラ情報', + 'ExifImageHeight' => 'ç”»åƒé«˜ã•', + 'ExifImageWidth' => 'ç”»åƒå¹…', + 'ExifOffset' => 'Exif IFDã¸ã®ãƒã‚¤ãƒ³ã‚¿', + 'ExifToolVersion' => 'ExifToolãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'ExifVersion' => 'Exifãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'ExpandFilm' => '拡張フイルム', + 'ExpandFilterLens' => '拡張レンズフィルター', + 'ExpandFlashLamp' => '拡張フラッシュランプ', + 'ExpandLens' => '拡張レンズ', + 'ExpandScanner' => '拡張スキャナー', + 'ExpandSoftware' => '拡張ソフト', + 'ExpirationDate' => '有効日付', + 'ExpirationTime' => '有効時間', + 'Exposure' => '露出', + 'ExposureBracketStepSize' => '露出ブラケットステップサイズ', + 'ExposureBracketValue' => '露出ブラケット値', + 'ExposureCompStepSize' => { + Description => '露出補正/ファインãƒãƒ¥ãƒ¼ãƒ³', + PrintConv => { + '1 EV' => '1ステップ', + '1/2 EV' => '1/2ステップ', + '1/3 EV' => '1/3ステップ', + }, + }, + 'ExposureCompensation' => '露出補正値', + 'ExposureControlStepSize' => { + Description => '露出制御ã®EVステップ', + PrintConv => { + '1 EV' => '1ステップ', + '1/2 EV' => '1/2ステップ', + '1/3 EV' => '1/3ステップ', + }, + }, + 'ExposureDelayMode' => { + Description => '露出é…延モード', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ExposureDifference' => '露出差', + 'ExposureIndex' => '露出指標', + 'ExposureLevelIncrements' => { + Description => '露出制御ã®EVステップ', + PrintConv => { + '1-stop set, 1/3-stop comp.' => '設定1 露出補正1/3', + '1/2 Stop' => '1/2ステップ', + '1/2-stop set, 1/2-stop comp.' => '設定1/2 露出補正1/2', + '1/3 Stop' => '1/3ステップ', + '1/3-stop set, 1/3-stop comp.' => '設定1/3 露出補正1/3', + }, + }, + 'ExposureMode' => { + Description => '露光モード', + PrintConv => { + 'Aperture Priority' => '絞り優先', + 'Aperture-priority AE' => '絞り優先', + 'Auto' => '自動露出', + 'Auto bracket' => 'オートブラケット', + 'Bulb' => 'ãƒãƒ«ãƒ–', + 'Landscape' => '風景', + 'Manual' => 'マニュアル露出', + 'Night Scene / Twilight' => '夜景', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Program' => 'プログラム', + 'Program AE' => 'プログラムAE', + 'Program-shift' => 'プログラムシフト', + 'Shutter Priority' => 'シャッター優先', + 'Shutter speed priority AE' => 'シャッター優先', + 'n/a' => '未設定', + }, + }, + 'ExposureModeInManual' => { + Description => 'マニュアル露出時ã®æ¸¬å…‰ãƒ¢ãƒ¼ãƒ‰', + PrintConv => { + 'Center-weighted average' => '中央é‡ç‚¹', + 'Evaluative metering' => '評価測光', + 'Partial metering' => '部分', + 'Specified metering mode' => '設定測光モード', + 'Spot metering' => 'スãƒãƒƒãƒˆ', + }, + }, + 'ExposureProgram' => { + Description => '露出プログラム', + PrintConv => { + 'Action (High speed)' => 'スãƒãƒ¼ãƒ„モード(高速シャッター優先)', + 'Aperture Priority' => '絞り優先', + 'Aperture-priority AE' => '絞り優先', + 'Bulb' => 'ãƒãƒ«ãƒ–', + 'Creative (Slow speed)' => 'クリエイティブプログラム(被写界深度優先)', + 'Landscape' => '風景モード', + 'Manual' => 'マニュアル', + 'Not Defined' => '未定義', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰', + 'Program' => 'プログラム', + 'Program AE' => 'ノーマルプログラム', + 'Shutter Priority' => 'シャッター優先', + 'Shutter speed priority AE' => 'シャッター優先', + }, + }, + 'ExposureTime' => '露出時間', + 'ExposureTime2' => '露出時間 2', + 'ExposureWarning' => { + Description => '露出警告', + PrintConv => { + 'Bad exposure' => '露出失敗', + 'Good' => 'é©æ­£', + }, + }, + 'ExtendedWBDetect' => { + Description => '延長WB検出', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Extender' => 'エクステンダー', + 'ExtenderFirmwareVersion' => 'エクステンダーファームウェアãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'ExtenderModel' => 'エクステンダーモデル', + 'ExtenderSerialNumber' => 'エクステンダーシリアル番å·', + 'ExternalFlash' => { + Description => '外付フラッシュ', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ExternalFlashAE1' => '外付フラッシュAE1?', + 'ExternalFlashAE1_0' => '外付フラッシュAE1(0)?', + 'ExternalFlashAE2' => '外付フラッシュAE2?', + 'ExternalFlashAE2_0' => '外付フラッシュAE2(0)?', + 'ExternalFlashBounce' => { + Description => '外付フラッシュãƒã‚¦ãƒ³ã‚¹', + PrintConv => { + 'Bounce' => 'ãƒã‚¦ãƒ³ã‚¹', + 'Bounce or Off' => 'ãƒã‚¦ãƒ³ã‚¹ã‹ã‚ªãƒ•', + 'Direct' => 'ダイレクト', + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + 'n/a' => '該当無ã—', + }, + }, + 'ExternalFlashExposureComp' => { + Description => '外付ストロボ露出補正', + PrintConv => { + 'n/a' => '未設定(オフã‹ã‚ªãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰ï¼‰', + 'n/a (Manual Mode)' => '未設定(マニュアルモード)', + }, + }, + 'ExternalFlashFlags' => '外付フラッシュフラグ', + 'ExternalFlashGuideNumber' => '外付フラッシュガイドナンãƒãƒ¼ï¼Ÿ', + 'ExternalFlashMode' => { + Description => '外付フラッシュモード', + PrintConv => { + 'Off' => 'オフ', + 'On, Auto' => 'オンã€ã‚ªãƒ¼ãƒˆ', + 'On, Contrast-control Sync' => 'オンã€å…‰é‡æ¯”制御シンクロ', + 'On, Flash Problem' => 'オンã€ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã®å•é¡Œï¼Ÿ', + 'On, High-speed Sync' => 'オンã€ãƒã‚¤ã‚¹ãƒ”ードシンクロ', + 'On, Manual' => 'オンã€ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«', + 'On, P-TTL Auto' => 'オンã€P-TTLオート', + 'On, Wireless' => 'オンã€ãƒ¯ã‚¤ãƒ¤ãƒ¬ã‚¹', + 'On, Wireless, High-speed Sync' => 'オンã€ãƒ¯ã‚¤ãƒ¤ãƒ¬ã‚¹ã€ãƒã‚¤ã‚¹ãƒ”ードシンクロ', + 'n/a - Off-Auto-Aperture' => '該当ãªã—-自動絞りオフ', + }, + }, + 'ExternalFlashZoom' => '外付フラッシュズーム', + 'ExtraSamples' => '特別サンプル', + 'FNumber' => 'F値', + 'Face0Position' => 'é¡”0ä½ç½®', + 'Face1Position' => 'é¡”1ä½ç½®', + 'Face2Position' => 'é¡”2ä½ç½®', + 'Face3Position' => 'é¡”3ä½ç½®', + 'Face4Position' => 'é¡”4ä½ç½®', + 'Face5Position' => 'é¡”5ä½ç½®', + 'Face6Position' => 'é¡”6ä½ç½®', + 'Face7Position' => 'é¡”7ä½ç½®', + 'Face8Position' => 'é¡”8ä½ç½®', + 'Face9Position' => 'é¡”9ä½ç½®', + 'FaceDetect' => { + Description => 'é¡”èªè­˜', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'FaceDetectArea' => '顔エリア', + 'FaceDetectFrameSize' => 'フレームサイズ', + 'FaceOrientation' => { + PrintConv => { + 'Horizontal (normal)' => '水平(標準)', + 'Rotate 180' => '180度回転', + 'Rotate 270 CW' => '270度回転 CW', + 'Rotate 90 CW' => '90度回転 CW', + }, + }, + 'FacesDetected' => 'é¡”èªè­˜', + 'FastSeek' => { + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'FaxProfile' => { + PrintConv => { + 'Unknown' => 'ä¸æ˜Ž', + }, + }, + 'FaxRecvParams' => 'FAXå—信パラメータ', + 'FaxRecvTime' => 'FAXå—信時間', + 'FaxSubAddress' => 'FAXサブアドレス', + 'FileFormat' => 'ファイル形å¼', + 'FileIndex' => 'ファイル索引', + 'FileInfo' => 'ファイル情報', + 'FileInfoVersion' => 'ファイル情報ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'FileModifyDate' => '更新日時', + 'FileName' => 'ファイルå', + 'FileNumber' => 'ファイル番å·', + 'FileNumberMemory' => { + Description => 'ファイル番å·ãƒ¡ãƒ¢ãƒª', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'FileNumberSequence' => { + Description => 'ファイル番å·é€£ç•ª', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'FileSize' => 'ファイルã®ã‚µã‚¤ã‚º', + 'FileSource' => { + Description => 'ファイルソース', + PrintConv => { + 'Digital Camera' => 'デジタルカメラ', + 'Film Scanner' => 'フィルムスキャナー', + 'Reflection Print Scanner' => 'åå°„å°åˆ·ã‚¹ã‚­ãƒ£ãƒŠãƒ¼', + }, + }, + 'FileType' => 'ファイルタイプ', + 'FileVersion' => 'ファイル形å¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'Filename' => 'ファイルå', + 'FillFlashAutoReduction' => { + Description => '日中シンクロ・ストロボ露出自動低減制御', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'FillOrder' => { + Description => 'フルオーダー', + PrintConv => { + 'Normal' => '標準', + }, + }, + 'FilmMode' => { + Description => 'フィルムモード', + PrintConv => { + 'Dynamic (B&W)' => 'ダイナミック(白黒)', + 'Dynamic (color)' => 'ダイナミック(カラー)', + 'Nature (color)' => 'ナãƒãƒ¥ãƒ©ãƒ«ï¼ˆã‚«ãƒ©ãƒ¼ï¼‰', + 'Smooth (B&W)' => '滑らã‹ï¼ˆç™½é»’)', + 'Smooth (color)' => '滑らã‹ï¼ˆã‚«ãƒ©ãƒ¼ï¼‰', + 'Standard (B&W)' => 'スタンダード(白黒)', + 'Standard (color)' => 'スタンダード(カラー)', + }, + }, + 'FilmType' => 'フィルムタイプ', + 'Filter' => { + Description => 'フィルター', + PrintConv => { + 'Off' => 'オフ', + }, + }, + 'FilterEffect' => { + Description => 'フィルター効果', + PrintConv => { + 'Green' => 'ç·‘', + 'None' => 'ç„¡ã—', + 'Off' => 'オフ', + 'Orange' => 'オレンジ', + 'Red' => '赤', + 'Yellow' => '黄色', + 'n/a' => '該当無ã—', + }, + }, + 'FilterEffectMonochrome' => { + Description => 'モノクロフィルター効果', + PrintConv => { + 'Green' => 'ç·‘', + 'None' => 'ç„¡ã—', + 'Orange' => 'オレンジ', + 'Red' => '赤', + 'Yellow' => '黄色', + }, + }, + 'FinderDisplayDuringExposure' => { + Description => '露光中ã®ãƒ•ã‚¡ã‚¤ãƒ³ãƒ€ãƒ¼å†…表示', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'FineTuneOptCenterWeighted' => '最é©éœ²å‡ºå¾®èª¿æ•´ 中央é‡ç‚¹æ¸¬å…‰', + 'FineTuneOptMatrixMetering' => '最é©éœ²å‡ºå¾®èª¿æ•´ 分割測光', + 'FineTuneOptSpotMetering' => '最é©éœ²å‡ºå¾®èª¿æ•´ スãƒãƒƒãƒˆæ¸¬å…‰', + 'Firmware' => 'ファームウェア', + 'FirmwareDate' => 'ファームウェア日付', + 'FirmwareRevision' => 'ファームウェアリビジョン', + 'FirmwareVersion' => 'ファームウェアãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'FixtureIdentifier' => 'フィクãƒãƒ£ãƒ¼è­˜åˆ¥å­', + 'Flash' => { + Description => 'ストロボ', + PrintConv => { + 'Auto, Did not fire' => 'フラッシュ未発光ã€ã‚ªãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰', + 'Auto, Did not fire, Red-eye reduction' => 'オートã€ãƒ•ãƒ©ãƒƒã‚·ãƒ¥æœªç™ºå…‰ã€èµ¤ç›®è»½æ¸›ãƒ¢ãƒ¼ãƒ‰', + 'Auto, Fired' => 'フラッシュ発光ã€ã‚ªãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰', + 'Auto, Fired, Red-eye reduction' => 'フラッシュ発光ã€ã‚ªãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰ã€èµ¤ç›®è»½æ¸›ãƒ¢ãƒ¼ãƒ‰', + 'Auto, Fired, Red-eye reduction, Return detected' => 'フラッシュ発光ã€ã‚ªãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰ã€ã‚¹ãƒˆãƒ­ãƒœå…‰æ¤œçŸ¥ã€èµ¤ç›®è»½æ¸›ãƒ¢ãƒ¼ãƒ‰', + 'Auto, Fired, Red-eye reduction, Return not detected' => 'フラッシュ発光ã€ã‚ªãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰ã€ã‚¹ãƒˆãƒ­ãƒœå…‰æœªæ¤œçŸ¥ã€èµ¤ç›®è»½æ¸›ãƒ¢ãƒ¼ãƒ‰', + 'Auto, Fired, Return detected' => 'フラッシュ発光ã€ã‚ªãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰ã€ã‚¹ãƒˆãƒ­ãƒœå…‰æ¤œçŸ¥', + 'Auto, Fired, Return not detected' => 'フラッシュ発光ã€ã‚ªãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰ã€ã‚¹ãƒˆãƒ­ãƒœå…‰æœªæ¤œçŸ¥', + 'Did not fire' => 'フラッシュ未発光', + 'Fired' => 'フラッシュ発光', + 'Fired, Red-eye reduction' => 'フラッシュ発光ã€èµ¤ç›®è»½æ¸›ãƒ¢ãƒ¼ãƒ‰', + 'Fired, Red-eye reduction, Return detected' => 'フラッシュ発光ã€èµ¤ç›®è»½æ¸›ãƒ¢ãƒ¼ãƒ‰ã€ã‚¹ãƒˆãƒ­ãƒœå…‰æ¤œçŸ¥', + 'Fired, Red-eye reduction, Return not detected' => 'フラッシュ発光ã€èµ¤ç›®è»½æ¸›ãƒ¢ãƒ¼ãƒ‰ã€ã‚¹ãƒˆãƒ­ãƒœå…‰æœªæ¤œçŸ¥', + 'Fired, Return detected' => 'ストロボ光検知', + 'Fired, Return not detected' => 'ストロボ光未検知', + 'No Flash' => 'フラッシュ未発光', + 'No flash function' => 'フラッシュ機能無ã—', + 'Off' => 'オフ', + 'Off, Did not fire' => 'フラッシュ未発光ã€å¼·åˆ¶ç™ºå…‰ãƒ¢ãƒ¼ãƒ‰', + 'Off, Did not fire, Return not detected' => 'オフã€ãƒ•ãƒ©ãƒƒã‚·ãƒ¥æœªç™ºå…‰ã€ã‚¹ãƒˆãƒ­ãƒœå…‰æœªæ¤œçŸ¥', + 'Off, No flash function' => 'オフã€ãƒ•ãƒ©ãƒƒã‚·ãƒ¥æ©Ÿèƒ½ç„¡ã—', + 'Off, Red-eye reduction' => 'オフã€èµ¤ç›®è»½æ¸›ãƒ¢ãƒ¼ãƒ‰', + 'On' => 'オン', + 'On, Did not fire' => 'オンã€ãƒ•ãƒ©ãƒƒã‚·ãƒ¥æœªç™ºå…‰', + 'On, Fired' => 'フラッシュ発光ã€å¼·åˆ¶ç™ºå…‰ãƒ¢ãƒ¼ãƒ‰', + 'On, Red-eye reduction' => 'フラッシュ発光ã€å¼·åˆ¶ç™ºå…‰ãƒ¢ãƒ¼ãƒ‰ã€èµ¤ç›®è»½æ¸›ãƒ¢ãƒ¼ãƒ‰', + 'On, Red-eye reduction, Return detected' => 'フラッシュ発光ã€å¼·åˆ¶ç™ºå…‰ãƒ¢ãƒ¼ãƒ‰ã€èµ¤ç›®è»½æ¸›ãƒ¢ãƒ¼ãƒ‰ã€ã‚¹ãƒˆãƒ­ãƒœå…‰æ¤œçŸ¥', + 'On, Red-eye reduction, Return not detected' => 'フラッシュ発光ã€å¼·åˆ¶ç™ºå…‰ãƒ¢ãƒ¼ãƒ‰ã€èµ¤ç›®è»½æ¸›ãƒ¢ãƒ¼ãƒ‰ã€ã‚¹ãƒˆãƒ­ãƒœå…‰æœªæ¤œçŸ¥', + 'On, Return detected' => 'フラッシュ発光ã€å¼·åˆ¶ç™ºå…‰ãƒ¢ãƒ¼ãƒ‰ã€ã‚¹ãƒˆãƒ­ãƒœå…‰æ¤œçŸ¥', + 'On, Return not detected' => 'フラッシュ発光ã€å¼·åˆ¶ç™ºå…‰ãƒ¢ãƒ¼ãƒ‰ã€ã‚¹ãƒˆãƒ­ãƒœå…‰æœªæ¤œçŸ¥', + }, + }, + 'FlashActivity' => 'フラッシュ稼åƒ', + 'FlashBias' => 'フラッシュãƒã‚¤ã‚¢ã‚¹', + 'FlashBits' => 'フラッシュ詳細', + 'FlashChargeLevel' => 'フラッシュãƒãƒ£ãƒ¼ã‚¸ãƒ¬ãƒ™ãƒ«', + 'FlashCommanderMode' => { + Description => 'コマンダーモード', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'FlashCompensation' => 'フラッシュ補正', + 'FlashControlMode' => { + Description => 'フラッシュコントロールモード', + PrintConv => { + 'Auto Aperture' => '自動絞り(AA)', + 'Manual' => 'マニュアル', + 'Off' => 'オフ', + 'Repeating Flash' => 'リピーティングフラッシュ', + }, + }, + 'FlashDevice' => { + Description => 'フラッシュデãƒã‚¤ã‚¹', + PrintConv => { + 'External' => '外付ã‘', + 'Internal' => '内蔵', + 'Internal + External' => '内蔵+外付ã‘', + 'None' => 'ç„¡ã—', + }, + }, + 'FlashDistance' => 'フラッシュ強度', + 'FlashEnergy' => 'フラッシュ強度', + 'FlashExposureBracketValue' => 'フラッシュ露出ブラケット値', + 'FlashExposureComp' => 'フラッシュ露出補正', + 'FlashExposureComp2' => 'フラッシュ露出補正', + 'FlashExposureCompSet' => 'ストロボ露出補正設定', + 'FlashExposureLock' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'FlashFired' => { + Description => 'フラッシュ発光', + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'FlashFiring' => { + Description => 'ストロボã®ç™ºå…‰', + PrintConv => { + 'Does not fire' => 'ã—ãªã„', + 'Fires' => 'ã™ã‚‹', + }, + }, + 'FlashFirmwareVersion' => 'フラッシュファームウェアãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'FlashFocalLength' => 'フラッシュ焦点è·é›¢', + 'FlashGroupACompensation' => 'グループAフラッシュ補正', + 'FlashGroupAControlMode' => { + Description => 'グループAフラッシュコントロールモード', + PrintConv => { + 'Auto Aperture' => '自動絞り(AA)', + 'Manual' => 'マニュアル', + 'Off' => 'オフ', + 'Repeating Flash' => 'リピーティングフラッシュ', + }, + }, + 'FlashGroupAOutput' => 'グループAフラッシュ出力', + 'FlashGroupBCompensation' => 'グループBフラッシュ補正', + 'FlashGroupBControlMode' => { + Description => 'グループBフラッシュコントロールモード', + PrintConv => { + 'Auto Aperture' => '自動絞り(AA)', + 'Manual' => 'マニュアル', + 'Off' => 'オフ', + 'Repeating Flash' => 'リピーティングフラッシュ', + }, + }, + 'FlashGroupBOutput' => 'グループBフラッシュ出力', + 'FlashGroupCCompensation' => 'グループCフラッシュ補正', + 'FlashGroupCControlMode' => { + Description => 'グループCフラッシュコントロールモード', + PrintConv => { + 'Auto Aperture' => '自動絞り(AA)', + 'Manual' => 'マニュアル', + 'Off' => 'オフ', + 'Repeating Flash' => 'リピーティングフラッシュ', + }, + }, + 'FlashGroupCOutput' => 'グループCフラッシュ出力', + 'FlashGuideNumber' => 'フラッシュガイドナンãƒãƒ¼', + 'FlashInfo' => 'ストロボ情報', + 'FlashInfoVersion' => 'フラッシュ情報ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'FlashIntensity' => { + Description => 'フラッシュ強度', + PrintConv => { + 'High' => '高ã„', + 'Low' => '低ã„', + 'Normal' => '標準', + 'Strong' => 'å¼·ã„', + 'Weak' => 'å¼±ã„', + }, + }, + 'FlashLevel' => 'フラッシュ補正', + 'FlashMetering' => 'フラッシュ計測', + 'FlashMeteringSegments' => 'フラッシュ測光値', + 'FlashMode' => { + Description => 'フラッシュモード', + PrintConv => { + 'Auto' => 'オート', + 'Auto, Did not fire' => 'オートã€ç™ºå…‰ç„¡ã—', + 'Auto, Did not fire, Red-eye reduction' => 'オートã€ç™ºå…‰ç„¡ã—ã€èµ¤ç›®è»½æ¸›', + 'Auto, Fired' => 'オートã€ç™ºå…‰', + 'Auto, Fired, Red-eye reduction' => 'オートã€ç™ºå…‰ã€èµ¤ç›®è»½æ¸›', + 'Did Not Fire' => '発光ç¦æ­¢', + 'External, Auto' => '外付ã€ã‚ªãƒ¼ãƒˆ', + 'External, Contrast-control Sync' => '外付ã€å…‰é‡æ¯”制御シンクロ', + 'External, Flash Problem' => '外付ã€ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã®å•é¡Œ?', + 'External, High-speed Sync' => '外付ã€ãƒã‚¤ã‚¹ãƒ”ードシンクロ', + 'External, Manual' => '外付ã€ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«', + 'External, P-TTL Auto' => '外付ã€P-TTL自動調光', + 'External, Wireless' => '外付ã€ãƒ¯ã‚¤ãƒ¤ãƒ¬ã‚¹', + 'External, Wireless, High-speed Sync' => '外付ã€ãƒ¯ã‚¤ãƒ¤ãƒ¬ã‚¹ã€ãƒã‚¤ã‚¹ãƒ”ードシンクロ', + 'Fill flash' => '強制発光', + 'Fired, Commander Mode' => '発光ã€ã‚³ãƒžãƒ³ãƒ€ãƒ¼ãƒ¢ãƒ¼ãƒ‰', + 'Fired, External' => '発光ã€å¤–付', + 'Fired, Manual' => '発光ã€ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«', + 'Fired, TTL Mode' => '発光ã€TTLモード', + 'Internal' => '内蔵', + 'Normal' => '標準', + 'Off' => 'オフ', + 'Off, Did not fire' => 'オフ', + 'Off?' => 'オフ?', + 'On' => 'オン', + 'On, Did not fire' => 'オンã€ç™ºå…‰ç„¡ã—', + 'On, Fired' => 'オン', + 'On, Red-eye reduction' => 'オンã€èµ¤ç›®è»½æ¸›', + 'On, Slow-sync' => 'オンã€ã‚¹ãƒ­ãƒ¼ã‚·ãƒ³ã‚¯ãƒ­', + 'On, Slow-sync, Red-eye reduction' => 'オンã€ã‚¹ãƒ­ãƒ¼ã‚·ãƒ³ã‚¯ãƒ­ã€èµ¤ç›®è»½æ¸›', + 'On, Soft' => 'オンã€ã‚½ãƒ•ãƒˆ', + 'On, Trailing-curtain Sync' => 'オンã€å¾Œå¹•ã‚·ãƒ³ã‚¯ãƒ­', + 'On, Wireless (Control)' => 'オンã€ãƒ¯ã‚¤ãƒ¤ãƒ¬ã‚¹ (コントロール)', + 'On, Wireless (Master)' => 'オンã€ãƒ¯ã‚¤ãƒ¤ãƒ¬ã‚¹ (マスター)', + 'Rear flash sync' => 'リアフラッシュシンクロ', + 'Red-eye Reduction' => '赤目軽減', + 'Red-eye reduction' => '赤目軽減', + 'Unknown' => 'ä¸æ˜Ž', + 'Wireless' => 'ワイヤレス', + 'n/a - Off-Auto-Aperture' => '該当ãªã—-自動絞りオフ', + }, + }, + 'FlashModel' => { + Description => 'フラッシュモデル', + PrintConv => { + 'None' => 'ç„¡ã—', + }, + }, + 'FlashOptions' => { + Description => 'フラッシュオプション', + PrintConv => { + 'Auto' => 'オート', + 'Auto, Red-eye reduction' => 'オートã€èµ¤ç›®è»½æ¸›', + 'Normal' => '標準', + 'Red-eye reduction' => '赤目軽減', + 'Slow-sync' => 'スローシンクロ', + 'Slow-sync, Red-eye reduction' => 'スローシンクロã€èµ¤ç›®è»½æ¸›', + 'Trailing-curtain Sync' => '後幕シンクロ', + 'Wireless (Control)' => 'ワイヤレス(コントロール発光)', + 'Wireless (Master)' => 'ワイヤレス(マスター発光)', + }, + }, + 'FlashOptions2' => { + Description => 'ストロボオプション(2)', + PrintConv => { + 'Auto' => 'オート', + 'Auto, Red-eye reduction' => 'オートã€èµ¤ç›®è»½æ¸›', + 'Normal' => '標準', + 'Red-eye reduction' => '赤目軽減', + 'Slow-sync' => 'スローシンクロ', + 'Slow-sync, Red-eye reduction' => 'スローシンクロã€èµ¤ç›®è»½æ¸›', + 'Trailing-curtain Sync' => '後幕シンクロ', + 'Wireless (Control)' => 'ワイヤレス(コントロール発光)', + 'Wireless (Master)' => 'ワイヤレス(マスター発光)', + }, + }, + 'FlashOutput' => 'フラッシュ出力', + 'FlashRemoteControl' => 'フラッシュリモートコントロール', + 'FlashSerialNumber' => 'フラッシュシリアル番å·', + 'FlashSetting' => 'フラッシュ設定', + 'FlashShutterSpeed' => 'フラッシュシャッター速度', + 'FlashStatus' => { + Description => 'ストロボ状態', + PrintConv => { + 'External, Did not fire' => '外付ã€æœªç™ºå…‰', + 'External, Fired' => '外付ã€ç™ºå…‰', + 'Internal, Did not fire' => '内蔵ã€æœªç™ºå…‰', + 'Internal, Fired' => '内蔵ã€ç™ºå…‰', + 'Off' => 'オフ', + }, + }, + 'FlashSyncSpeed' => 'フラッシュåŒèª¿é€Ÿåº¦', + 'FlashSyncSpeedAv' => { + Description => 'Avモード時ã®ã‚¹ãƒˆãƒ­ãƒœåŒèª¿é€Ÿåº¦', + PrintConv => { + '1/200 Fixed' => '1/200秒固定', + '1/250 Fixed' => '1/250秒固定', + '1/300 Fixed' => '1/300秒固定', + 'Auto' => 'オート', + }, + }, + 'FlashType' => { + Description => 'フラッシュタイプ', + PrintConv => { + 'E-System' => 'E-システム', + 'None' => 'ç„¡ã—', + 'Simple E-System' => 'シンプルE-システム', + }, + }, + 'FlashWarning' => { + Description => 'フラッシュ警告', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'FlashpixVersion' => 'サãƒãƒ¼ãƒˆãƒ•ãƒ©ãƒƒã‚·ãƒ¥ãƒ”ックスãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'FlickerReduce' => { + Description => 'フリッカー軽減', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'FlipHorizontal' => { + Description => '横フリップ', + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'FocalLength' => 'レンズ焦点è·é›¢', + 'FocalLength35efl' => 'レンズ焦点è·é›¢', + 'FocalLengthIn35mmFormat' => '35mmフイルムæ›ç®—焦点è·é›¢', + 'FocalPlaneDiagonal' => '焦点é¢å¯¾è§’ç·š', + 'FocalPlaneResolutionUnit' => { + Description => '焦点é¢è§£åƒåº¦å˜ä½', + PrintConv => { + 'None' => 'ç„¡ã—', + 'inches' => 'インãƒ', + }, + }, + 'FocalPlaneXResolution' => '焦点é¢X解åƒåº¦', + 'FocalPlaneXSize' => '焦点é¢Xサイズ', + 'FocalPlaneXUnknown' => '焦点é¢Xサイズ', + 'FocalPlaneYResolution' => '焦点é¢Y解åƒåº¦', + 'FocalPlaneYSize' => '焦点é¢Yサイズ', + 'FocalPlaneYUnknown' => '焦点é¢Yサイズ', + 'FocalType' => { + Description => 'フォーカスタイプ', + PrintConv => { + 'Fixed' => '固定', + 'Zoom' => 'ズーム', + }, + }, + 'FocalUnits' => '焦点å˜ä½/mm', + 'Focus' => { + Description => 'フォーカス', + PrintConv => { + 'Manual' => 'マニュアル', + }, + }, + 'FocusArea' => 'フォーカスエリア', + 'FocusAreaSelection' => { + Description => 'フォーカスãƒã‚¤ãƒ³ãƒˆãƒ©ãƒƒãƒ—アラウンド', + PrintConv => { + 'No Wrap' => 'ノーラップ', + 'Wrap' => 'ラップ', + }, + }, + 'FocusContinuous' => { + Description => '連続フォーカス', + PrintConv => { + 'Continuous' => '連続', + 'Manual' => 'マニュアル', + 'Single' => 'シングル', + }, + }, + 'FocusDistance' => '被写体è·é›¢', + 'FocusDistanceLower' => '焦点è·é›¢ä½Žéƒ¨åˆ†', + 'FocusDistanceUpper' => '焦点è·é›¢é«˜éƒ¨åˆ†', + 'FocusMode' => { + Description => 'フォーカスモード', + PrintConv => { + 'AI Focus AF' => 'AIフォーカスAF', + 'AI Servo AF' => 'AIサーボAF', + 'Auto' => 'オート', + 'Auto, Continuous' => 'オートã€ã‚³ãƒ³ãƒ†ã‚£ãƒ‹ãƒ¥ã‚¢ã‚¹', + 'Auto, Focus button' => 'オートã€ãƒ•ã‚©ãƒ¼ã‚«ã‚¹ãƒœã‚¿ãƒ³', + 'Continuous' => '連写', + 'Continuous AF' => 'コンティニュアスAF', + 'Custom' => 'カスタム', + 'Infinity' => 'ç„¡é™é ', + 'Macro' => 'マクロ', + 'Macro (1)' => 'マクロ(1)', + 'Macro (2)' => 'マクロ(2)', + 'Manual' => 'マニュアル', + 'Manual Focus (3)' => 'マニュアルフォーカス(3)', + 'Manual Focus (6)' => 'マニュアルフォーカス(6)', + 'Multi AF' => 'マルãƒAF', + 'Normal' => '標準', + 'One-shot AF' => 'ワンショットAF', + 'Pan Focus' => 'パンフォーカス', + 'Sequential shooting AF' => 'シーケンシャルシューティングAF', + 'Single' => 'シングル', + 'Single AF' => 'シングルAF', + 'Super Macro' => 'スーパーマクロ', + }, + }, + 'FocusMode2' => 'フォーカスモード2', + 'FocusModeSetting' => { + Description => 'フォーカスモード', + PrintConv => { + 'Manual' => 'マニュアル', + }, + }, + 'FocusPixel' => '焦点解åƒåº¦', + 'FocusPointWrap' => { + Description => 'フォーカスãƒã‚¤ãƒ³ãƒˆãƒ©ãƒƒãƒ—アラウンド', + PrintConv => { + 'No Wrap' => 'ノーラップ', + 'Wrap' => 'ラップ', + }, + }, + 'FocusPosition' => 'フォーカスè·é›¢', + 'FocusProcess' => { + Description => 'フォーカスプロセス', + PrintConv => { + 'AF Not Used' => 'AF未使用', + 'AF Used' => 'AF使用', + }, + }, + 'FocusRange' => { + Description => 'フォーカスレンジ', + PrintConv => { + 'Auto' => 'オート', + 'Close' => '近景', + 'Far Range' => 'é æ™¯', + 'Infinity' => 'ç„¡é™é ', + 'Macro' => 'マクロ', + 'Manual' => 'マニュアル', + 'Middle Range' => '中間範囲', + 'Normal' => 'ノーマル', + 'Not Known' => 'ä¸æ˜Ž', + 'Pan Focus' => 'パンフォーカス', + 'Super Macro' => 'スーパーマクロ', + 'Very Close' => '近接', + }, + }, + 'FocusSetting' => 'フォーカス設定', + 'FocusStepCount' => 'フォーカスステップ数', + 'FocusStepInfinity' => 'ç„¡é™ãƒ¬ãƒ³ã‚ºã‚¹ãƒ†ãƒƒãƒ—', + 'FocusStepNear' => 'ニアステップ数', + 'FocusTrackingLockOn' => { + Description => 'フォーカストラッキングã¨ãƒ­ãƒƒã‚¯ã‚ªãƒ³', + PrintConv => { + 'Long' => 'ロング', + 'Normal' => '標準', + 'Off' => 'オフ', + 'Short' => 'ショート', + }, + }, + 'FocusWarning' => { + Description => 'フォーカス警告', + PrintConv => { + 'Good' => 'ジャスピン', + 'Out of focus' => 'ピンボケ', + }, + }, + 'FocusingScreen' => 'フォーカシングスクリーン', + 'FolderName' => 'フォルダå', + 'ForwardMatrix1' => 'å‰è¡Œåˆ—1', + 'ForwardMatrix2' => 'å‰è¡Œåˆ—2', + 'FrameHeight' => 'フレーム高', + 'FrameNumber' => 'フレーム番å·', + 'FrameRate' => 'フレームレート', + 'FrameSize' => 'フレームサイズ', + 'FrameWidth' => 'フレーム幅', + 'FreeByteCounts' => 'フリーãƒã‚¤ãƒˆæ•°', + 'FreeMemoryCardImages' => 'フリーメモリーカードイメージ', + 'FreeOffsets' => 'フリーオフセット', + 'FujiFlashMode' => { + Description => 'フラッシュモード', + PrintConv => { + 'Auto' => 'オート', + 'External' => '外付フラッシュ', + 'Off' => 'オフ', + 'On' => 'オン', + 'Red-eye reduction' => '赤目軽減', + }, + }, + 'FunctionButton' => { + Description => 'FUNCボタン', + PrintConv => { + 'AF-area Mode' => 'AFエリアモード', + 'Center AF Area' => '中央AFエリア', + 'Center-weighted' => '中央é‡ç‚¹æ¸¬å…‰', + 'FV Lock' => 'FVロック', + 'Flash Off' => 'フラッシュオフ', + 'Framing Grid' => 'フレーミンググリッド', + 'ISO Display' => 'ISO表示', + 'Matrix Metering' => '分割測光', + 'Spot Metering' => 'スãƒãƒƒãƒˆæ¸¬å…‰', + }, + }, + 'GEMInfo' => 'GEM情報', + 'GEModel' => 'モデル', + 'GIFVersion' => 'GIFãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'GPSAltitude' => '高度', + 'GPSAltitudeRef' => { + Description => 'å‚照高度', + PrintConv => { + 'Above Sea Level' => 'æµ·æ°´é¢', + 'Below Sea Level' => 'å‚照海水é¢(è² ã®å€¤)', + }, + }, + 'GPSAreaInformation' => 'GPSエリアã®å称', + 'GPSDOP' => '測定精度', + 'GPSDateStamp' => 'GPSデータ', + 'GPSDateTime' => 'GPS時間(原å­æ™‚計)', + 'GPSDestBearing' => '目的地ã®æ–¹å‘', + 'GPSDestBearingRef' => { + Description => '目的地ã®æ–¹å‘ã®å‚ç…§', + PrintConv => { + 'Magnetic North' => 'ç£æ°—ã®æ–¹å‘', + 'True North' => '正常ãªæ–¹å‘', + }, + }, + 'GPSDestDistance' => '目的地ã®è·é›¢', + 'GPSDestDistanceRef' => { + Description => '目的地ã®è·é›¢ã®å‚ç…§', + PrintConv => { + 'Kilometers' => 'キロメートル', + 'Miles' => 'マイル', + 'Nautical Miles' => 'ノット', + }, + }, + 'GPSDestLatitude' => '目的地ã®ç·¯åº¦', + 'GPSDestLatitudeRef' => { + Description => '目的地ã®ç·¯åº¦ã®ãŸã‚ã®å‚ç…§', + PrintConv => { + 'North' => '北緯', + 'South' => 'å—ç·¯', + }, + }, + 'GPSDestLongitude' => '目的地ã®çµŒåº¦', + 'GPSDestLongitudeRef' => { + Description => '目的地ã®çµŒåº¦ã®ãŸã‚ã®å‚ç…§', + PrintConv => { + 'East' => 'æ±çµŒ', + 'West' => '西経', + }, + }, + 'GPSDifferential' => { + Description => 'GPS誤差修正', + PrintConv => { + 'Differential Corrected' => '誤差修正ã‚ã‚Š', + 'No Correction' => '誤差修正無ã—', + }, + }, + 'GPSImgDirection' => 'イメージã®æ–¹å‘', + 'GPSImgDirectionRef' => { + Description => 'ç”»åƒæ–¹å‘å‚ç…§', + PrintConv => { + 'Magnetic North' => 'ç£æ°—ã®æ–¹å‘', + 'True North' => '本当ã®æ–¹å‘', + }, + }, + 'GPSInfo' => 'GPS IFDã¸ã®ãƒã‚¤ãƒ³ã‚¿', + 'GPSLatitude' => '緯度', + 'GPSLatitudeRef' => { + Description => '北緯ã¾ãŸã¯å—ç·¯', + PrintConv => { + 'North' => '北緯', + 'South' => 'å—ç·¯', + }, + }, + 'GPSLongitude' => '経度', + 'GPSLongitudeRef' => { + Description => 'æ±çµŒã¾ãŸã¯è¥¿çµŒ', + PrintConv => { + 'East' => 'æ±çµŒ', + 'West' => '西経', + }, + }, + 'GPSMapDatum' => 'データãŒä½¿ã£ãŸæ¸¬åœ°æ¸¬é‡', + 'GPSMeasureMode' => { + Description => 'GPS測定モード', + PrintConv => { + '2-D' => '2次元測定', + '2-Dimensional' => '2次元測定', + '2-Dimensional Measurement' => '2次元測定', + '3-D' => '3次元測定', + '3-Dimensional' => '3次元測定', + '3-Dimensional Measurement' => '3次元測定', + }, + }, + 'GPSProcessingMethod' => 'GPS処ç†æ–¹æ³•ã®å称', + 'GPSSatellites' => '測定ã®ãŸã‚ã«ä½¿ã‚ã‚ŒãŸGPS衛星', + 'GPSSpeed' => 'GPSå—ä¿¡æ©Ÿã®ã‚¹ãƒ”ード', + 'GPSSpeedRef' => { + Description => 'スピードå˜ä½', + PrintConv => { + 'km/h' => '時速(km)', + 'knots' => 'ノット', + 'mph' => '時速(マイル)', + }, + }, + 'GPSStatus' => { + Description => 'GPSå—信機ステータス', + PrintConv => { + 'Measurement Active' => '測定アクティブ', + 'Measurement Void' => '測定無効', + }, + }, + 'GPSTimeStamp' => 'GPS時間(原å­æ™‚計)', + 'GPSTrack' => '動作方å‘', + 'GPSTrackRef' => { + Description => '動作方å‘ã®å‚ç…§', + PrintConv => { + 'Magnetic North' => 'ç£æ°—ã®æ–¹å‘', + 'True North' => '本当ã®æ–¹å‘', + }, + }, + 'GPSVersionID' => 'GPSã‚¿ã‚°ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'GainBase' => '基本ゲイン', + 'GainControl' => { + Description => 'ゲインコントロール', + PrintConv => { + 'High gain down' => '高ã„ゲインダウン', + 'High gain up' => '高ã„ゲインアップ', + 'Low gain down' => '低ã„ゲインダウン', + 'Low gain up' => '低ã„ゲインアップ', + 'None' => 'ç„¡ã—', + }, + }, + 'Gamma' => 'ガンマ', + 'GammaCompensatedValue' => 'ガンマ補償値', + 'Gamut' => '全域', + 'Gapless' => { + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'GeoTiffAsciiParams' => 'ジオアスキー設定タグ', + 'GeoTiffDirectory' => 'ジオキーディレクトリタグ', + 'GeoTiffDoubleParams' => 'ジオダブル設定タグ', + 'Gradation' => 'グラデーション', + 'GrayPoint' => 'グレーãƒã‚¤ãƒ³ãƒˆ', + 'GrayResponseCurve' => 'グレーå応曲線', + 'GrayResponseUnit' => { + Description => 'グレーåå¿œå˜ä½', + PrintConv => { + '0.0001' => 'å˜ä½ã®æ•°ã¯1000を表ã™', + '0.001' => 'å˜ä½ã®æ•°ã¯100を表ã™', + '0.1' => 'å˜ä½ã®æ•°ã¯10を表ã™', + '1e-05' => 'å˜ä½ã®æ•°ã¯10-1000を表ã™', + '1e-06' => 'å˜ä½ã®æ•°ã¯100-1000を表ã™', + }, + }, + 'GrayScale' => 'グレースケール', + 'GrayTRC' => 'ç°è‰²èª¿å¢—殖曲線', + 'GreenMatrixColumn' => '緑色マトリックス列', + 'GreenTRC' => '緑色調増殖曲線', + 'GridDisplay' => { + Description => 'ビューファインダーグリッド表示', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'GripBatteryADLoad' => 'é›»æºA/Dグリップ起動時', + 'GripBatteryADNoLoad' => 'é›»æºA/Dグリップオフ時', + 'GripBatteryState' => 'é›»æºçŠ¶æ…‹ã‚°ãƒªãƒƒãƒ—', + 'HCUsage' => 'HC使用', + 'HDR' => { + Description => 'オートHDR', + PrintConv => { + 'Off' => '切', + }, + }, + 'HalftoneHints' => 'ãƒãƒ¼ãƒ•ãƒˆãƒ¼ãƒ³ãƒ’ント', + 'Headline' => 'ヘッドライン', + 'HeightResolution' => '高ã•æ–¹å‘ã®ç”»åƒè§£åƒåº¦', + 'HighISONoiseReduction' => { + Description => '高感度ノイズリダクション', + PrintConv => { + '+2 (strong)' => '+2 (å¼·)', + '-2 (weak)' => '-2 (å¼±)', + '-4 (weakest)' => '-4 (微弱)', + 'Auto' => 'オート', + 'High' => '高ã„', + 'Low' => 'ソフト', + 'Minimal' => '最å°', + 'Normal' => '標準', + 'Off' => 'オフ', + 'On' => 'オン', + 'Standard' => 'スタンダード', + 'Strong' => 'å¼·', + 'Weak' => 'å¼±', + 'Weakest' => '微弱', + }, + }, + 'Highlight' => 'ãƒã‚¤ãƒ©ã‚¤ãƒˆ', + 'HighlightTonePriority' => { + Description => '高è¼åº¦å´ãƒ»éšŽèª¿å„ªå…ˆ', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'HometownCity' => 'ç¾åœ¨åœ°', + 'HometownCityCode' => 'ç¾åœ¨åœ°ã‚³ãƒ¼ãƒ‰', + 'HometownDST' => { + Description => 'ç¾åœ¨åœ°DST', + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'HostComputer' => 'ホストコンピューター', + 'Hue' => '色相', + 'HueAdjustment' => '色相調整', + 'HueSetting' => '色相設定', + 'ICCProfile' => 'ICCプロフィール', + 'ICC_Profile' => 'ICC入力色プロフィール', + 'IPTC-NAA' => 'IPTC-NAAメタデータ', + 'IPTCBitsPerSample' => 'サンプルã‚ãŸã‚Šãƒ“ット数', + 'IPTCData' => 'IPTCデータ', + 'IPTCImageHeight' => 'ライン数', + 'IPTCImageRotation' => 'イメージ回転', + 'IPTCImageWidth' => 'ラインã‚ãŸã‚Šã®ãƒ”クセル数', + 'IPTCPictureNumber' => '写真番å·', + 'IPTCPixelHeight' => 'スキャン方å‘垂直ピクセルサイズ', + 'IPTCPixelWidth' => 'スキャン方å‘ピクセルサイズ', + 'ISO' => 'ISOスピードレート', + 'ISO2' => 'ISO(2)', + 'ISOAuto' => 'ISOオート', + 'ISODisplay' => 'ISO表示', + 'ISOExpansion' => { + Description => 'ISO感度拡張', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ISOExpansion2' => { + Description => 'ISO拡大(2)', + PrintConv => { + 'Off' => 'オフ', + }, + }, + 'ISOFloor' => '最低感度', + 'ISOInfo' => 'ISO情報', + 'ISOSelection' => 'ISOé¸æŠž', + 'ISOSetting' => { + Description => 'ISO設定', + PrintConv => { + 'Auto' => 'オート', + 'Manual' => 'マニュアル', + }, + }, + 'ISOSpeedExpansion' => { + Description => 'ISO感度拡張', + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'ISOSpeedIncrements' => { + Description => 'ISO感度ステップ値', + PrintConv => { + '1 Stop' => '1ステップ', + '1/3 Stop' => '1/3ステップ', + }, + }, + 'ISOSpeedRange' => { + Description => 'ISO感度ã®åˆ¶å¾¡ç¯„囲ã®è¨­å®š', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'ISOStepSize' => { + Description => 'ISO感度ステップ値', + PrintConv => { + '1 EV' => '1ステップ', + '1/2 EV' => '1/2ステップ', + '1/3 EV' => '1/3ステップ', + }, + }, + 'ISOValue' => 'ISO感度', + 'IT8Header' => 'IT8ヘッダー', + 'Illumination' => { + Description => 'イルミãƒãƒ¼ã‚·ãƒ§ãƒ³', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Image::ExifTool::NikonCapture::RedEyeData' => 'Nikon Capture 赤目データ', + 'ImageAdjustment' => 'イメージ調整', + 'ImageAreaOffset' => 'イメージ領域オフセット', + 'ImageAuthentication' => { + Description => 'イメージèªè¨¼', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ImageBoundary' => 'イメージ境界線', + 'ImageByteCount' => 'ç”»åƒãƒã‚¤ãƒˆæ•°', + 'ImageColorIndicator' => 'ç”»åƒè‰²æŒ‡æ¨™', + 'ImageColorValue' => 'ç”»åƒè‰²å€¤', + 'ImageCount' => 'イメージカウント', + 'ImageDataDiscard' => { + Description => 'イメージデータ廃棄', + PrintConv => { + 'Flexbits Discarded' => 'フレックスビット破棄', + 'Full Resolution' => '完全ãªè§£åƒåº¦', + 'HighPass Frequency Data Discarded' => 'ãƒã‚¤ãƒ‘ス周波数データ破棄', + 'Highpass and LowPass Frequency Data Discarded' => 'ãƒã‚¤ãƒ‘スã¨ãƒ­ãƒ¼ãƒ‘ス周波数データ破棄', + }, + }, + 'ImageDataSize' => 'イメージデータサイズ', + 'ImageDepth' => 'イメージã®æ·±ã•', + 'ImageDescription' => 'イメージ説明', + 'ImageDustOff' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ImageEditCount' => 'ç”»åƒå‡¦ç†ã‚«ã‚¦ãƒ³ãƒˆ', + 'ImageEditing' => { + Description => 'イメージ処ç†', + PrintConv => { + 'Cropped' => 'クロップ', + 'Digital Filter' => 'デジタルフィルター', + 'Frame Synthesis?' => 'フレームåˆæˆï¼Ÿ', + 'None' => '未処ç†', + }, + }, + 'ImageHeight' => 'ç”»åƒé«˜ã•', + 'ImageHistory' => 'ç”»åƒå±¥æ­´', + 'ImageID' => 'イメージID', + 'ImageInfo' => 'ç”»åƒæƒ…å ±', + 'ImageLayer' => 'イメージレイヤー', + 'ImageNumber' => 'イメージ番å·', + 'ImageNumber2' => 'イメージ番å·(2)', + 'ImageOffset' => 'イメージオフセット', + 'ImageOptimization' => 'イメージ最é©åŒ–', + 'ImageOrientation' => { + Description => 'イメージ方å‘', + PrintConv => { + 'Landscape' => 'ランドスケープ', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Square' => '正方形', + }, + }, + 'ImageProcessing' => 'イメージ処ç†', + 'ImageProcessingVersion' => 'ç”»åƒå‡¦ç†ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'ImageQuality' => { + Description => 'ç”»åƒå“質', + PrintConv => { + 'High' => '高ã„', + 'Motion Picture' => 'å‹•ç”»', + 'Normal' => '標準', + }, + }, + 'ImageQuality2' => 'イメージå“質2', + 'ImageResourceBlocks' => 'イメージリソースブロック', + 'ImageReview' => { + Description => 'ç”»åƒè©•ä¾¡', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ImageReviewTime' => '自動オフタイマー ç”»åƒè©•ä¾¡æ™‚é–“', + 'ImageRotated' => { + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'ImageSize' => 'イメージサイズ', + 'ImageSourceData' => 'イメージソースデータ', + 'ImageStabilization' => { + Description => 'イメージスタビライザー', + PrintConv => { + 'Best Shot' => 'ベストショット', + 'Off' => 'オフ', + 'On' => 'オン', + 'On, Mode 1' => 'オンã€ãƒ¢ãƒ¼ãƒ‰ï¼‘', + 'On, Mode 2' => 'オンã€ãƒ¢ãƒ¼ãƒ‰ï¼’', + }, + }, + 'ImageTone' => { + Description => 'ç”»åƒä»•ä¸Š', + PrintConv => { + 'Bright' => '鮮やã‹', + 'Landscape' => '風景', + 'Monochrome' => 'モノトーン', + 'Natural' => 'ナãƒãƒ¥ãƒ©ãƒ«', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Vibrant' => 'é›…(MIYABI)', + }, + }, + 'ImageType' => 'ページ', + 'ImageUniqueID' => 'ユニークãªã‚¤ãƒ¡ãƒ¼ã‚¸ID', + 'ImageWidth' => 'ç”»åƒå¹…', + 'Index' => '目次', + 'Indexed' => 'インデックス', + 'InfoButtonWhenShooting' => { + Description => '撮影時ã®INFOボタン', + PrintConv => { + 'Displays camera settings' => 'カメラ設定内容を表示', + 'Displays shooting functions' => '撮影機能ã®è¨­å®šçŠ¶æ…‹ã‚’表示', + }, + }, + 'InitialZoomSetting' => { + Description => 'åˆæœŸã‚ºãƒ¼ãƒ è¨­å®š', + PrintConv => { + 'High Magnification' => '高ã„拡大', + 'Low Magnification' => '低ã„拡大', + 'Medium Magnification' => '中間拡大', + }, + }, + 'InkNames' => 'インクå', + 'InkSet' => 'インクセット', + 'Instructions' => '詳細', + 'IntellectualGenre' => 'インテリジャンル', + 'IntelligentAuto' => 'インテリジェントオート', + 'IntensityStereo' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'IntergraphMatrix' => '相互グラフマトリックスタグ', + 'Interlace' => 'インタレース', + 'InternalFlash' => { + Description => '内蔵フラッシュコントロール', + PrintConv => { + 'Commander Mode' => 'コマンダーモード', + 'Fired' => 'フラッシュ発光', + 'Manual' => 'マニュアル', + 'No' => 'フラッシュ未発光', + 'Off' => 'オフ', + 'On' => 'オン', + 'Repeating Flash' => 'リピーティングフラッシュ', + }, + }, + 'InternalFlashAE1' => '内蔵フラッシュAE1?', + 'InternalFlashAE1_0' => '内蔵フラッシュAE1(0)?', + 'InternalFlashAE2' => '内蔵フラッシュAE2?', + 'InternalFlashAE2_0' => '内蔵フラッシュAE2(0)?', + 'InternalFlashMode' => { + Description => '内蔵ストロボモード', + PrintConv => { + 'Did not fire, (Unknown 0xf4)' => 'ã‚ªãƒ•ï¼ˆæœªç¢ºèª 0xF4?)', + 'Did not fire, Auto' => 'オフã€ã‚ªãƒ¼ãƒˆ', + 'Did not fire, Auto, Red-eye reduction' => 'オフã€ã‚ªãƒ¼ãƒˆã€èµ¤ç›®è»½æ¸›', + 'Did not fire, Normal' => 'オフã€æ¨™æº–', + 'Did not fire, Red-eye reduction' => 'オフã€èµ¤ç›®è»½æ¸›', + 'Did not fire, Slow-sync' => 'オフã€ã‚¹ãƒ­ãƒ¼ã‚·ãƒ³ã‚¯ãƒ­', + 'Did not fire, Slow-sync, Red-eye reduction' => 'オフã€ã‚¹ãƒ­ãƒ¼ã‚·ãƒ³ã‚¯ãƒ­ã€èµ¤ç›®è»½æ¸›', + 'Did not fire, Trailing-curtain Sync' => 'オフã€å¾Œå¹•ã‚·ãƒ³ã‚¯ãƒ­', + 'Did not fire, Wireless (Control)' => 'オフã€ãƒ¯ã‚¤ãƒ¤ãƒ¬ã‚¹ï¼ˆã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ç™ºå…‰ï¼‰', + 'Did not fire, Wireless (Master)' => 'オフã€ãƒ¯ã‚¤ãƒ¤ãƒ¬ã‚¹ï¼ˆãƒžã‚¹ã‚¿ãƒ¼ç™ºå…‰ï¼‰', + 'Fired' => 'オン', + 'Fired, Auto' => 'オンã€ã‚ªãƒ¼ãƒˆ', + 'Fired, Auto, Red-eye reduction' => 'オンã€ã‚ªãƒ¼ãƒˆã€èµ¤ç›®è»½æ¸›', + 'Fired, Red-eye reduction' => 'オンã€èµ¤ç›®è»½æ¸›', + 'Fired, Slow-sync' => 'オンã€ã‚¹ãƒ­ãƒ¼ã‚·ãƒ³ã‚¯ãƒ­', + 'Fired, Slow-sync, Red-eye reduction' => 'オンã€ã‚¹ãƒ­ãƒ¼ã‚·ãƒ³ã‚¯ãƒ­ã€èµ¤ç›®è»½æ¸›', + 'Fired, Trailing-curtain Sync' => 'オンã€å¾Œå¹•ã‚·ãƒ³ã‚¯ãƒ­', + 'Fired, Wireless (Control)' => 'オンã€ãƒ¯ã‚¤ãƒ¤ãƒ¬ã‚¹ï¼ˆã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ç™ºå…‰ï¼‰', + 'Fired, Wireless (Master)' => 'オンã€ãƒ¯ã‚¤ãƒ¤ãƒ¬ã‚¹ï¼ˆãƒžã‚¹ã‚¿ãƒ¼ç™ºå…‰ï¼‰', + 'n/a - Off-Auto-Aperture' => '該当ãªã—-自動絞りオフ', + }, + }, + 'InternalFlashStrength' => '内蔵フラッシュ強度', + 'InternalFlashTable' => '内蔵フラッシュテーブル', + 'InternalSerialNumber' => '内部シリアル番å·', + 'InteropIndex' => { + Description => 'インターオペラビリティID', + PrintConv => { + 'R03 - DCF option file (Adobe RGB)' => 'R03: DCFオプションファイル(Adobe RGB)', + 'R98 - DCF basic file (sRGB)' => 'R98: DCF基本ファイル(sRGB)', + 'THM - DCF thumbnail file' => 'THM: DCFサムãƒã‚¤ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«', + }, + }, + 'InteropOffset' => '互æ›æ€§IFDã¸ã®ãƒã‚¤ãƒ³ã‚¿', + 'InteropVersion' => 'インターオペラビリティãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'IntervalLength' => 'インターãƒãƒ«é•·', + 'IntervalMode' => 'インターãƒãƒ«ãƒ¢ãƒ¼ãƒ‰', + 'IntervalNumber' => 'インターãƒãƒ«æ•°', + 'JFIFVersion' => 'JFIFãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'JPEGACTables' => 'JPEG AC テーブル', + 'JPEGDCTables' => 'JPEG DC テーブル', + 'JPEGLosslessPredictors' => 'JPEGロスレス予測', + 'JPEGPointTransforms' => 'JPEGä½ç½®å¤‰æ›', + 'JPEGProc' => 'JPEG処ç†', + 'JPEGQTables' => 'JPEG Q テーブル', + 'JPEGQuality' => { + Description => 'JPEG å“質', + PrintConv => { + 'Extra Fine' => 'エクストラファイン', + 'Fine' => 'ファイン', + 'Standard' => 'ノーマル', + 'n/a' => '未設定', + }, + }, + 'JPEGRestartInterval' => 'JPEGå†é–‹é–“éš”', + 'JPEGTables' => 'JPEGテーブル', + 'JobID' => 'ジョブID', + 'JpgRecordedPixels' => 'JPEG記録サイズ', + 'Keyword' => 'キーワード', + 'Keywords' => 'キーワード', + 'LC1' => 'レンズデータ', + 'LC10' => 'Mv\' nv\' データ', + 'LC11' => 'AVC 1/EXP データ', + 'LC12' => 'Mv1 Avminsifデータ', + 'LC14' => 'UNT_12 UNT_6 データ', + 'LC15' => 'çµ±åˆãƒ•ãƒ©ãƒƒã‚·ãƒ¥æœ€é©ã‚¨ãƒ³ãƒ‰ãƒ‡ãƒ¼ã‚¿', + 'LC2' => 'è·é›¢ã‚³ãƒ¼ãƒ‰ãƒ‡ãƒ¼ã‚¿', + 'LC3' => 'K値(', + 'LC4' => 'è¿‘è·é›¢åŽå·®è¨‚正データ', + 'LC5' => '明色åŽå·®è¨‚正データ', + 'LC6' => 'オープンåŽå·®ãƒ‡ãƒ¼ã‚¿', + 'LC7' => 'AF最低作動状態データ(LC7)', + 'LCDDisplayAtPowerOn' => { + Description => 'é›»æºã‚¹ã‚¤ãƒƒãƒã€ˆON〉時ã®æ¶²æ™¶ç‚¹ç¯', + PrintConv => { + 'Display' => '点ç¯', + 'Retain power off status' => 'é›»æºã€ˆOFF〉時ã®çŠ¶æ…‹ã‚’ä¿æŒ', + }, + }, + 'LCDDisplayReturnToShoot' => { + Description => '液晶モニター表示中ã®æ’®å½±çŠ¶æ…‹å¾©å¸°', + PrintConv => { + 'Also with * etc.' => '*ボタンãªã©ã§ã‚‚復帰', + 'With Shutter Button only' => 'シャッターボタンã§ã®ã¿å¾©å¸°', + }, + }, + 'LCDIllumination' => { + Description => 'LCDイルミãƒãƒ¼ã‚·ãƒ§ãƒ³', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'LCDIlluminationDuringBulb' => { + Description => 'ãƒãƒ«ãƒ–撮影中ã®è¡¨ç¤ºãƒ‘ãƒãƒ«ç…§æ˜Ž', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'LCDPanels' => '上é¢è¡¨ç¤ºãƒ‘ãƒãƒ«ï¼èƒŒé¢è¡¨ç¤ºãƒ‘ãƒãƒ«', + 'LCHEditor' => { + Description => 'LCHエディター', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'LanguageIdentifier' => '言語識別å­', + 'LastFileNumber' => '最終ファイル番å·', + 'LeafData' => 'リーフデータ', + 'Lens' => 'レンズ', + 'Lens35efl' => 'レンズ', + 'LensAFStopButton' => { + Description => 'レンズ・AFストップボタンã®æ©Ÿèƒ½', + PrintConv => { + 'AE lock' => 'AEロック', + 'AE lock while metering' => 'AEロック(タイマー中)', + 'AF Stop' => 'AFストップ', + 'AF point: M->Auto/Auto->ctr' => '測è·ç‚¹ ä»»æ„→自動/自動→中央', + 'AF start' => 'AFスタート', + 'AF stop' => 'AFストップ', + 'IS start' => '手ブレ補正機能作動', + 'One Shot <-> AI servo' => 'ワンショット/AIサーボ', + 'Switch to registered AF point' => '登録AFフレームã¸ã®åˆ‡ã‚Šæ›ãˆ', + }, + }, + 'LensApertureRange' => 'レンズ絞り範囲', + 'LensData' => 'K値(LC3)', + 'LensDistortionParams' => 'レンズ歪曲パラメータ', + 'LensDriveNoAF' => { + Description => 'AF測è·ä¸èƒ½æ™‚ã®ãƒ¬ãƒ³ã‚ºå‹•ä½œ', + PrintConv => { + 'Focus search off' => '駆動ã—ãªã„', + 'Focus search on' => 'サーãƒé§†å‹•ã™ã‚‹', + }, + }, + 'LensFStops' => 'レンズF値', + 'LensFirmwareVersion' => 'レンズファームウェアãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'LensID' => 'レンズID', + 'LensInfo' => 'レンズ情報', + 'LensKind' => 'レンズ種類/ãƒãƒ¼ã‚¸ãƒ§ãƒ³(LC0)', + 'LensProperties' => 'レンズ機能?', + 'LensSerialNumber' => 'レンズシリアル番å·', + 'LensSpec' => 'レンズ', + 'LensTemperature' => 'レンズ温度', + 'LensType' => 'レンズタイプ', + 'LicenseType' => { + PrintConv => { + 'Unknown' => 'ä¸æ˜Ž', + }, + }, + 'LightCondition' => 'ライトコンディション', + 'LightReading' => 'ライトリーディング', + 'LightSource' => { + Description => 'å…‰æº', + PrintConv => { + 'Cloudy' => '曇り', + 'Cool White Fluorescent' => '白色è›å…‰ç¯', + 'Custom 1-4' => 'カスタム1-4', + 'Day White Fluorescent' => '昼白色è›å…‰ç¯', + 'Daylight' => '昼光', + 'Daylight Fluorescent' => '昼光色è›å…‰ç¯', + 'Fine Weather' => '良ã„天気', + 'Flash' => 'ストロボ', + 'Fluorescent' => 'è›å…‰ç¯', + 'ISO Studio Tungsten' => 'ISOスタジオタングステン', + 'Other' => 'ãã®ä»–ã®å…‰æº', + 'Shade' => '日陰', + 'Standard Light A' => '標準ライトA', + 'Standard Light B' => '標準ライトB', + 'Standard Light C' => '標準ライトC', + 'Tungsten (Incandescent)' => 'タングステン(白熱ç¯)', + 'Unknown' => 'ä¸æ˜Ž', + 'Warm White Fluorescent' => '暖白光色è›å…‰ç¯', + 'White Fluorescent' => '温白色è›å…‰ç¯', + }, + }, + 'LightSourceSpecial' => { + Description => 'å…‰æºã‚¹ãƒšã‚·ãƒ£ãƒ«', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Lightness' => '明度', + 'LinearResponseLimit' => 'ç·šåž‹åå¿œé™ç•Œ', + 'LinearizationTable' => '線形化テーブル', + 'Lit' => { + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'LiveViewExposureSimulation' => { + Description => 'ライブビュー露出シミュレーション', + PrintConv => { + 'Disable (LCD auto adjust)' => 'ã—ãªã„(é©æ­£è¡¨ç¤º)', + 'Enable (simulates exposure)' => 'ã™ã‚‹(撮影露出イメージ表示)', + }, + }, + 'LiveViewShooting' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'LocalizedCameraModel' => 'é™å®šã‚«ãƒ¡ãƒ©ãƒ¢ãƒ‡ãƒ«', + 'Location' => '撮影場所', + 'LockMicrophoneButton' => { + Description => 'プロテクト/録音ボタン タンã®æ©Ÿèƒ½', + PrintConv => { + 'Protect (hold:record memo)' => 'プロテクト(長押ã—ã§éŒ²éŸ³)', + 'Record memo (protect:disable)' => '録音(プロテクトä¸å¯)', + }, + }, + 'LongExposureNoiseReduction' => { + Description => '長秒露光ノイズリダクション', + PrintConv => { + 'Auto' => 'オート', + 'Off' => 'オフ', + 'On' => 'オン', + 'n/a' => '未設定', + }, + }, + 'LookupTable' => 'ルックアップテーブル', + 'LoopStyle' => { + PrintConv => { + 'Normal' => '標準', + }, + }, + 'Luminance' => 'è¼åº¦', + 'LuminanceNoiseReduction' => { + PrintConv => { + 'High' => '高ã„', + 'Low' => 'ソフト', + 'Off' => 'オフ', + }, + }, + 'MB-D10Batteries' => 'MB-D10é›»æºã‚¿ã‚¤ãƒ—', + 'MB-D10BatteryType' => 'MB-D10é›»æºã‚¿ã‚¤ãƒ—', + 'MB-D80Batteries' => 'MB-D80ãƒãƒƒãƒ†ãƒªãƒ¼', + 'MIEVersion' => 'MIEãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'MIMEType' => 'MIMEタイプ', + 'MSStereo' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Macro' => { + Description => 'マクロ', + PrintConv => { + 'Macro' => 'マクロ', + 'Manual' => 'マニュアル', + 'Normal' => '標準', + 'Off' => 'オフ', + 'On' => 'オン', + 'Super Macro' => 'スーパーマクロ', + 'n/a' => '未設定', + }, + }, + 'MacroMode' => { + Description => 'マクロモード', + PrintConv => { + 'Macro' => 'マクロ', + 'Normal' => 'ノーマル', + 'Off' => 'オフ', + 'On' => 'オン', + 'Super Macro' => 'スーパーマクロ', + 'Tele-Macro' => 'テレマクロ', + }, + }, + 'MagnifiedView' => { + Description => '拡大ズーム表示', + PrintConv => { + 'Image playback only' => 'å†ç”Ÿæ™‚ã®ã¿', + 'Image review and playback' => '撮影直後ã¨å†ç”Ÿæ™‚', + }, + }, + 'MainDialExposureComp' => { + Description => 'Main Dial 露出補正', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Make' => 'メーカー', + 'MakeAndModel' => '作æˆã¨ãƒ¢ãƒ‡ãƒ«', + 'MakerNote' => 'DNGプライベートデータ', + 'MakerNoteOffset' => 'メーカーノートオフセット', + 'MakerNoteSafety' => { + Description => 'メーカーノートセーフティ', + PrintConv => { + 'Safe' => '安全', + 'Unsafe' => 'å±é™º', + }, + }, + 'MakerNoteType' => 'メーカーノートタイプ', + 'MakerNoteVersion' => 'メーカーノートãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'MakerNotes' => 'メーカーノート', + 'ManometerPressure' => '気圧計圧力', + 'ManometerReading' => '気圧計高度', + 'ManualFlash' => 'マニュアルフラッシュ', + 'ManualFlashOutput' => { + Description => 'マニュアルフラッシュ出力', + PrintConv => { + 'Low' => 'ソフト', + 'n/a' => '該当無ã—', + }, + }, + 'ManualFocusDistance' => 'マニュアルフォーカスè·é›¢', + 'ManualTv' => { + Description => 'マニュアル露出時Tvã€Av値設定', + PrintConv => { + 'Tv=Control/Av=Main' => 'Tv値=サブ電å­ãƒ€ã‚¤ãƒ¤ãƒ«/Av値=メイン電å­ãƒ€ã‚¤ãƒ¤ãƒ«', + 'Tv=Main/Av=Control' => 'Tv値=メイン電å­ãƒ€ã‚¤ãƒ¤ãƒ«/Av値=サブ電å­ãƒ€ã‚¤ãƒ¤ãƒ«', + }, + }, + 'ManufactureDate' => '製造日付?', + 'MaskedAreas' => 'マスク領域', + 'MasterDocumentID' => 'マスタ文書ID', + 'MasterGain' => 'マスターゲイン', + 'MatrixMetering' => '分割測光', + 'Matteing' => 'マッãƒãƒ³ã‚°', + 'MaxAperture' => '最大絞り', + 'MaxApertureAtCurrentFocal' => 'ç¾åœ¨ç„¦ç‚¹è·é›¢ã®æœ€å¤§çµžã‚Š', + 'MaxApertureAtMaxFocal' => '最大焦点時最大絞り', + 'MaxApertureAtMinFocal' => '最å°ç„¦ç‚¹æ™‚最大絞り', + 'MaxApertureValue' => '最大レンズå£å¾„', + 'MaxContinuousRelease' => '最大連写レリーズ', + 'MaxFocalLength' => '最大焦点è·é›¢', + 'MaxSampleValue' => '最大サンプル値', + 'MaximumDensityRange' => '最大密度範囲', + 'MeasuredEV' => '計測EV', + 'Measurement' => '測定オブザーãƒãƒ¼', + 'MeasurementBacking' => 'ãƒãƒƒã‚¯æ¸¬å®š', + 'MeasurementFlare' => 'フレア測定', + 'MeasurementGeometry' => '幾何学測定', + 'MeasurementIlluminant' => 'å…‰æºæ¸¬å®š', + 'MeasurementObserver' => '測定オブザーãƒãƒ¼', + 'MediaBlackPoint' => 'メディア黒点', + 'MediaType' => { + PrintConv => { + 'Movie' => 'å‹•ç”»', + 'Normal' => '標準', + }, + }, + 'MediaWhitePoint' => 'メディア白点', + 'Medium' => 'ミドル', + 'MenuButtonDisplayPosition' => { + Description => 'メニューã®è¡¨ç¤ºä½ç½®', + PrintConv => { + 'Previous' => 'ç›´å‰ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼', + 'Previous (top if power off)' => 'ç›´å‰ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ï¼ˆé›»æºåˆ‡ã§å…ˆé ­ï¼‰', + 'Top' => 'メニューã®å…ˆé ­', + }, + }, + 'MenuButtonReturn' => { + PrintConv => { + 'Previous' => 'ç›´å‰ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼', + 'Top' => '上', + }, + }, + 'Metering' => { + Description => '測光', + PrintConv => { + 'Center-weighted' => '中央é‡ç‚¹', + 'Matrix' => '分割', + 'Spot' => 'スãƒãƒƒãƒˆ', + }, + }, + 'MeteringMode' => { + Description => '測光モード', + PrintConv => { + 'Average' => 'å¹³å‡', + 'Center-weighted average' => '中央é‡ç‚¹', + 'Default' => 'デフォルト', + 'Evaluative' => '評価', + 'Multi-segment' => 'パターン', + 'Multi-spot' => 'マルãƒã‚¹ãƒãƒƒãƒˆ', + 'Other' => 'ãã®ä»–', + 'Partial' => '部分', + 'Pattern+AF' => 'パターン+AF', + 'Spot' => 'スãƒãƒƒãƒˆ', + 'Spot+Highlight control' => 'スãƒãƒƒãƒˆ+ãƒã‚¤ãƒ©ã‚¤ãƒˆã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«', + 'Spot+Shadow control' => 'スãƒãƒƒãƒˆ+シャドウコントロール', + 'Unknown' => 'ä¸æ˜Ž', + }, + }, + 'MeteringMode2' => { + Description => '測光モード2', + PrintConv => { + 'Multi-segment' => 'パターン', + }, + }, + 'MeteringMode3' => { + Description => '測光モード3', + PrintConv => { + 'Multi-segment' => 'パターン', + }, + }, + 'MeteringTime' => '自動オフタイマー メータオフ時間', + 'MinAperture' => '最å°çµžã‚Š', + 'MinFocalLength' => '最å°ç„¦ç‚¹è·é›¢', + 'MinSampleValue' => '最å°ã‚µãƒ³ãƒ—ル値', + 'MinoltaCameraSettings2' => 'カメラ設定2', + 'MinoltaCameraSettings5D' => 'カメラ設定(5D)', + 'MinoltaCameraSettings7D' => 'カメラ設定(7D)', + 'MinoltaDate' => '日付', + 'MinoltaImageSize' => { + Description => 'イメージサイズ', + PrintConv => { + 'Full' => 'フル', + 'Large' => 'ラージ', + 'Medium' => 'ミドル', + 'Small' => 'スモール', + }, + }, + 'MinoltaMakerNote' => 'ミノルタメーカーノート', + 'MinoltaModelID' => 'モデルID', + 'MinoltaQuality' => { + Description => 'イメージå“質', + PrintConv => { + 'Economy' => 'エコノミー', + 'Extra Fine' => 'エクストラファイン', + 'Extra fine' => 'エクストラファイン', + 'Fine' => 'ファイン', + 'Normal' => '標準', + 'Standard' => 'スタンダード', + 'Super Fine' => 'スーパーファイン', + }, + }, + 'MinoltaTime' => '時間', + 'MirrorLockup' => { + Description => 'ミラーアップ撮影', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + 'Enable: Down with Set' => 'ã™ã‚‹(SETボタンã§ãƒ€ã‚¦ãƒ³)', + }, + }, + 'Model' => 'ç”»åƒå…¥åŠ›æ©Ÿå™¨ãƒ¢ãƒ‡ãƒ«', + 'Model2' => 'ç”»åƒå…¥åŠ›æ©Ÿå™¨ãƒ¢ãƒ‡ãƒ«(2)', + 'ModelID' => 'モデルID', + 'ModelTiePoint' => 'モデル拘æŸãƒã‚¤ãƒ³ãƒˆã‚¿ã‚°', + 'ModelTransform' => 'モデル変化タグ', + 'ModelingFlash' => { + Description => 'モデリングフラッシュ', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ModifiedPictureStyle' => { + PrintConv => { + 'CM Set 1' => 'CMセット1', + 'CM Set 2' => 'CMセット2', + 'Faithful' => '忠実設定', + 'High Saturation' => '高彩度', + 'Landscape' => '風景', + 'Low Saturation' => '低彩度', + 'Monochrome' => 'モノトーン', + 'Neutral' => 'ニュートラル', + 'None' => 'ç„¡ã—', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Standard' => 'スタンダード', + 'User Def. 1' => 'ユーザ設定1', + 'User Def. 2' => 'ユーザ設定2', + 'User Def. 3' => 'ユーザ設定3', + }, + }, + 'ModifiedSaturation' => { + Description => '彩度修正', + PrintConv => { + 'CM1 (Red Enhance)' => 'CM1 (赤増)', + 'CM2 (Green Enhance)' => 'CM2 (緑増)', + 'CM3 (Blue Enhance)' => 'CM3 (é’増)', + 'CM4 (Skin Tones)' => 'CM4 (肌色増)', + 'Off' => 'オフ', + }, + }, + 'ModifiedSharpnessFreq' => { + PrintConv => { + 'High' => '高ã„', + 'Low' => 'ソフト', + 'Standard' => 'スタンダード', + 'n/a' => '該当無ã—', + }, + }, + 'ModifiedToneCurve' => { + PrintConv => { + 'Custom' => 'カスタム', + 'Manual' => 'マニュアル', + 'Standard' => 'スタンダード', + }, + }, + 'ModifiedWhiteBalance' => { + PrintConv => { + 'Auto' => 'オート', + 'Black & White' => '白黒', + 'Cloudy' => '曇り', + 'Custom' => 'カスタム', + 'Custom 1' => 'カスタム1', + 'Custom 2' => 'カスタム2', + 'Custom 3' => 'カスタム3', + 'Custom 4' => 'カスタム4', + 'Daylight' => '昼光', + 'Daylight Fluorescent' => '昼光色è›å…‰ç¯', + 'Flash' => 'ストロボ', + 'Fluorescent' => 'è›å…‰ç¯', + 'Manual Temperature (Kelvin)' => 'マニュアル白熱ç¯ï¼ˆã‚±ãƒ«ãƒ“ン)', + 'PC Set1' => 'PC設定1', + 'PC Set2' => 'PC設定2', + 'PC Set3' => 'PC設定3', + 'PC Set4' => 'PC設定4', + 'PC Set5' => 'PC設定5', + 'Shade' => '日陰', + 'Tungsten' => 'タングステン(白熱ç¯)', + 'Underwater' => '水中', + }, + }, + 'ModifyDate' => 'ファイル作æˆæ—¥æ™‚', + 'MoireFilter' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'MonitorOffTime' => 'モニターオフé…延時間', + 'MonochromeFilterEffect' => { + PrintConv => { + 'Green' => 'ç·‘', + 'None' => 'ç„¡ã—', + 'Orange' => 'オレンジ', + 'Red' => '赤', + 'Yellow' => '黄色', + }, + }, + 'MonochromeLinear' => { + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'MonochromeToningEffect' => { + PrintConv => { + 'Blue' => 'é’', + 'Green' => 'ç·‘', + 'None' => 'ç„¡ã—', + 'Purple' => 'ç´«', + 'Sepia' => 'セピア', + }, + }, + 'MultiExposure' => '多é‡éœ²å‡ºãƒ‡ãƒ¼ã‚¿', + 'MultiExposureAutoGain' => { + Description => '多é‡éœ²å‡ºè‡ªå‹•ã‚²ã‚¤ãƒ³', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'MultiExposureMode' => { + Description => '多é‡éœ²å‡ºãƒ¢ãƒ¼ãƒ‰', + PrintConv => { + 'Image Overlay' => 'イメージオーãƒãƒ¼ãƒ¬ã‚¤', + 'Multiple Exposure' => '多é‡éœ²å‡º', + 'Off' => 'オフ', + }, + }, + 'MultiExposureShots' => '多é‡éœ²å‡ºã‚·ãƒ§ãƒƒãƒˆ', + 'MultiExposureVersion' => '多é‡éœ²å‡ºãƒ‡ãƒ¼ã‚¿ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'MultiFrameNoiseReduction' => { + Description => 'マルãƒã‚·ãƒ§ãƒƒãƒˆãƒŽã‚¤ã‚ºãƒªãƒ€ã‚¯ã‚·ãƒ§ãƒ³', + PrintConv => { + 'Off' => '切', + 'On' => 'å…¥', + }, + }, + 'MultiSample' => 'マルãƒã‚µãƒ³ãƒ—ル', + 'MultiSelector' => { + Description => 'マルãƒé¸æŠž', + PrintConv => { + 'Do Nothing' => '何もã—ãªã„', + 'Reset Meter-off Delay' => 'メーターオフé…延時間リセット', + }, + }, + 'MultiSelectorPlaybackMode' => { + Description => 'マルãƒé¸æŠž å†ç”Ÿãƒ¢ãƒ¼ãƒ‰', + PrintConv => { + 'Choose Folder' => 'フォルダーé¸æŠž', + 'Thumbnail On/Off' => 'サムãƒã‚¤ãƒ«ã€€ã‚ªãƒ³/オフ', + 'View Histograms' => 'ヒストグラム表示', + 'Zoom On/Off' => 'ズーム オン/オフ', + }, + }, + 'MultiSelectorShootMode' => { + Description => 'マルãƒé¸æŠž 撮影モード', + PrintConv => { + 'Highlight Active Focus Point' => 'ãƒã‚¤ãƒ©ã‚¤ãƒˆã‚¢ã‚¯ãƒ†ã‚£ãƒ–フォーカスãƒã‚¤ãƒ³ãƒˆ', + 'Not Used' => '未使用', + 'Select Center Focus Point' => '中央フォーカスãƒã‚¤ãƒ³ãƒˆé¸æŠž', + }, + }, + 'MultipleExposureSet' => { + Description => '多é‡éœ²å‡ºè¨­å®š', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Mute' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'MyColorMode' => { + Description => 'マイカラーモード', + PrintConv => { + 'B&W' => '白黒', + 'Color Accent' => 'カラーアクセント', + 'Color Swap' => 'スイッãƒã‚«ãƒ©ãƒ¼', + 'Custom' => 'カスタム', + 'Dark Skin Tone' => 'ダークスキン調', + 'Light Skin Tone' => 'ライトスカイ調', + 'Neutral' => 'ニュートラル', + 'Off' => 'オフ', + 'Positive Film' => 'ãƒã‚¸ãƒ•ã‚£ãƒ«ãƒ ', + 'Sepia' => 'セピア', + 'Vivid' => 'ビビッド', + 'Vivid Blue' => 'ビビッドé’', + 'Vivid Green' => 'ビビッド緑', + 'Vivid Red' => 'ビビッド赤', + }, + }, + 'MyColors' => 'マイカラーモード', + 'NDFilter' => { + Description => 'NDフィルター', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'NEFCompression' => { + Description => 'RAW圧縮', + PrintConv => { + 'Lossless' => 'ロスレス', + 'Lossy (type 1)' => '圧縮(タイプ1)', + 'Lossy (type 2)' => '圧縮(タイプ2)', + 'Uncompressed' => 'éžåœ§ç¸®', + }, + }, + 'NEFLinearizationTable' => '線形化表', + 'NamedColor2' => '色å称2', + 'NativeDisplayInfo' => 'ãƒã‚¤ãƒ†ã‚£ãƒ–ディスプレイ情報', + 'NewsPhotoVersion' => 'å ±é“写真レコードãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'NikonCaptureData' => 'ニコンキャプãƒãƒ£ãƒ¼ãƒ‡ãƒ¼ã‚¿', + 'NikonCaptureOffsets' => 'ニコンキャプãƒãƒ£ãƒ¼ã‚ªãƒ•ã‚»ãƒƒãƒˆ', + 'NikonCaptureVersion' => 'ニコンキャプãƒãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'NoMemoryCard' => { + Description => 'メモリーカード無ã—', + PrintConv => { + 'Enable Release' => 'レリーズå¯èƒ½', + 'Release Locked' => 'レリーズロック', + }, + }, + 'Noise' => 'ノイズ', + 'NoiseFilter' => { + Description => 'ピクãƒãƒ£ãƒ¼ãƒ¢ãƒ¼ãƒ‰ãƒŽã‚¤ã‚ºãƒ•ã‚£ãƒ«ã‚¿ãƒ¼', + PrintConv => { + 'High' => '高ã„', + 'Low' => 'ソフト', + 'Off' => 'オフ', + 'Standard' => 'スタンダード', + }, + }, + 'NoiseReduction' => { + Description => 'ノイズリダクション', + PrintConv => { + 'Auto' => 'オート', + 'Low' => '低ã„', + 'Normal' => '標準', + 'Off' => 'オフ', + 'On' => 'オン', + 'Standard' => 'スタンダード', + }, + }, + 'NoiseReduction2' => 'ノイズリダクション2', + 'NoiseReductionApplied' => 'é©ç”¨ãƒŽã‚¤ã‚ºãƒªãƒ€ã‚¯ã‚·ãƒ§ãƒ³', + 'NoiseReductionData' => 'ノイズリダクションデータ', + 'NoiseReductionIntensity' => 'ノイズリダクション強度', + 'NoiseReductionMethod' => 'ノイズリダクション方法', + 'NoiseReductionSharpness' => 'ノイズリダクションシャープãƒã‚¹', + 'NominalMaxAperture' => '最大絞り', + 'NominalMinAperture' => '最å°çµžã‚Š', + 'NumAFPoints' => 'AFãƒã‚¤ãƒ³ãƒˆç•ªå·', + 'NumIndexEntries' => 'インデックスエントリ数', + 'NumberofInks' => 'インク番å·', + 'OPIProxy' => 'OPIプロキシー', + 'ObjectAttributeReference' => 'インテリジャンル', + 'ObjectCycle' => 'オブジェクトサイクル', + 'ObjectDistance' => '被写体ã¨ã®è·é›¢', + 'ObjectFileType' => { + PrintConv => { + 'None' => 'ç„¡ã—', + 'Unknown' => 'ä¸æ˜Ž', + }, + }, + 'ObjectName' => 'タイトル', + 'ObjectPreviewData' => 'オブジェクトデータプレビューデータ', + 'ObjectPreviewFileFormat' => 'オブジェクトデータプレビューファイル形å¼', + 'ObjectPreviewFileVersion' => 'オブジェクトデータプレビューファイル形å¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'ObjectTypeReference' => 'オブジェクトタイプå‚ç…§', + 'OffsetSchema' => 'オフセットã®æ¦‚è¦', + 'OlympusImageHeight' => 'イメージ高', + 'OlympusImageWidth' => 'イメージ幅', + 'OneTouchWB' => { + Description => 'ワンタッãƒãƒ›ãƒ¯ã‚¤ãƒˆãƒãƒ©ãƒ³ã‚¹', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + 'On (Preset)' => 'オン(プリセット)', + }, + }, + 'OpticalZoomCode' => '光学ズームコード', + 'OpticalZoomMode' => { + Description => '光学ズームモード', + PrintConv => { + 'Extended' => 'EX光学', + 'Standard' => 'スタンダード', + }, + }, + 'OpticalZoomOn' => { + Description => '光学ズームオン', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Opto-ElectricConvFactor' => '光電交æ›é–¢æ•°', + 'OrderNumber' => 'オーダー番å·', + 'Orientation' => { + Description => 'ç”»åƒã®å‘ã', + PrintConv => { + 'Horizontal (normal)' => '水平(標準)', + 'Rotate 180' => '180度回転', + 'Rotate 270 CW' => '270度回転 CW', + 'Rotate 90 CW' => '90度回転 CW', + }, + }, + 'OriginalDecisionDataOffset' => 'オリジナル決定データオフセット', + 'OriginalRawFileData' => 'オリジナルRAWファイルデータ', + 'OriginalRawFileDigest' => 'オリジナルRAWファイルè¦ç´„', + 'OriginalRawFileName' => 'オリジナルRAWファイルå', + 'OriginalTransmissionReference' => '作業識別å­', + 'OriginatingProgram' => '開始プログラム', + 'OutputResponse' => '出力åå¿œ', + 'OwnerID' => 'オーナーID', + 'OwnerName' => 'オーナーå', + 'PEFVersion' => 'PEFãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'Padding' => '引ã伸ã°ã—', + 'PageName' => 'ページå', + 'PageNumber' => 'ページ番å·', + 'PanasonicExifVersion' => 'パナソニックExifãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'PanasonicRawVersion' => 'パナソニックRAWãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'PanasonicTitle' => 'タイトル', + 'PanoramaDirection' => 'F値', + 'PanoramaMode' => 'パノラマモード', + 'PentaxImageSize' => 'ペンタックスイメージサイズ', + 'PentaxModelID' => 'ペンタックスモデル', + 'PentaxVersion' => 'ペンタックスãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'People' => '人々', + 'PhaseDetectAF' => { + Description => 'オートフォーカス', + PrintConv => { + 'Off' => 'オフ', + 'On (51-point)' => 'オン', + }, + }, + 'PhotoEffect' => { + Description => '写真効果', + PrintConv => { + 'B&W' => '白黒', + 'Custom' => 'カスタム', + 'Neutral' => 'ニュートラル', + 'Off' => 'オフ', + 'Sepia' => 'セピア', + 'Vivid' => 'ビビッド', + }, + }, + 'PhotoEffects' => { + Description => 'フォトエフェクト', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'PhotoEffectsBlue' => 'フォトエフェクトé’', + 'PhotoEffectsData' => 'フォトエフェクトデータ', + 'PhotoEffectsGreen' => 'フォトエフェクト緑', + 'PhotoEffectsRed' => 'フォトエフェクト赤', + 'PhotoEffectsType' => { + Description => 'フォトエフェクトタイプ', + PrintConv => { + 'B&W' => '白黒', + 'None' => 'ç„¡ã—', + 'Sepia' => 'セピア', + 'Tinted' => '淡調', + }, + }, + 'PhotoInfoPlayback' => { + Description => '写真情報/å†ç”Ÿ', + PrintConv => { + 'Info Left-right, Playback Up-down' => '情報<>/å†ç”Ÿ', + 'Info Up-down, Playback Left-right' => '情報/å†ç”Ÿ<>', + }, + }, + 'PhotometricInterpretation' => { + Description => 'ピクセル形å¼', + PrintConv => { + 'BlackIsZero' => 'é»’ã¯ã‚¼ãƒ­', + 'Color Filter Array' => 'CFA (カラーフィルターマトリックス)', + 'Pixar LogL' => 'CIE Log2(L) (ログè¼åº¦)', + 'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (ログè¼åº¦ã¨åŸºæº–色)', + 'RGB Palette' => 'パレット色', + 'Transparency Mask' => 'é€æ˜Žåº¦ãƒžã‚¹ã‚¯', + 'WhiteIsZero' => '白ã¯ã‚¼ãƒ­', + }, + }, + 'PhotoshopAnnotations' => 'フォトショップ注釈', + 'PhotoshopFormat' => { + PrintConv => { + 'Standard' => 'スタンダード', + }, + }, + 'PictInfo' => '写真情報', + 'PictureControl' => { + Description => 'ピクãƒãƒ£ãƒ¼ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'PictureControlActive' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'PictureControlAdjust' => { + Description => 'ピクãƒãƒ£ãƒ¼ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«èª¿æ•´', + PrintConv => { + 'Default Settings' => 'デフォルト設定', + 'Full Control' => 'フルコントロール', + 'Quick Adjust' => 'クイック調整', + }, + }, + 'PictureControlBase' => 'ピクãƒãƒ£ãƒ¼ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãƒ™ãƒ¼ã‚¹', + 'PictureControlName' => 'ピクãƒãƒ£ãƒ¼ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«å', + 'PictureControlQuickAdjust' => 'ピクãƒãƒ£ãƒ¼ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã‚¯ã‚¤ãƒƒã‚¯èª¿æ•´', + 'PictureControlVersion' => 'ピクãƒãƒ£ãƒ¼ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'PictureFinish' => { + Description => 'ピクãƒãƒ£ãƒ¼ãƒ•ã‚£ãƒ‹ãƒƒã‚·ãƒ¥', + PrintConv => { + 'Monochrome' => 'モノトーン', + 'Natural' => 'ナãƒãƒ¥ãƒ©ãƒ«', + 'Night Portrait' => '人物夜景', + 'Night Scene' => '夜景', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + }, + }, + 'PictureMode' => { + Description => 'ピクãƒãƒ£ãƒ¼ãƒ¢ãƒ¼ãƒ‰', + PrintConv => { + '1/2 EV steps' => '1/2 EVステップ', + '1/3 EV steps' => '1/3 EVステップ', + 'Anti-blur' => '手振れ補正', + 'Aperture Priority' => '絞り優先', + 'Aperture Priority, Off-Auto-Aperture' => '絞り優先(自動絞りOFF)', + 'Aperture-priority AE' => '絞り優先', + 'Auto' => 'オート', + 'Auto PICT (Landscape)' => 'オートピクãƒãƒ£ãƒ¼ï¼ˆé¢¨æ™¯ï¼‰', + 'Auto PICT (Macro)' => 'オートピクãƒãƒ£ãƒ¼ï¼ˆãƒžã‚¯ãƒ­ï¼‰', + 'Auto PICT (Portrait)' => 'オートピクãƒãƒ£ãƒ¼ï¼ˆãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆï¼‰', + 'Auto PICT (Sport)' => 'オートピクãƒãƒ£ãƒ¼ï¼ˆã‚¹ãƒãƒ¼ãƒ„)', + 'Auto PICT (Standard)' => 'オートピクãƒãƒ£ãƒ¼ï¼ˆæ¨™æº–)', + 'Autumn' => '秋', + 'Beach' => 'ビーãƒ', + 'Beach & Snow' => 'ビーãƒï¼†ã‚¹ãƒŽãƒ¼', + 'Blur Reduction' => 'Digital SR', + 'Bulb' => 'ãƒãƒ«ãƒ–', + 'Bulb, Off-Auto-Aperture' => 'ãƒãƒ«ãƒ–(自動絞りOFF)', + 'Candlelight' => 'キャンドルライト', + 'DOF Program' => '深度優先プログラム', + 'DOF Program (HyP)' => '深度優先プログラム(ãƒã‚¤ãƒ‘ープログラム)', + 'Dark Pet' => 'ペット黒色', + 'Digital Filter' => 'デジタルフィルター', + 'Fireworks' => '花ç«', + 'Flash X-Sync Speed AE' => 'ストロボåŒèª¿é€Ÿåº¦AE', + 'Flower' => '花', + 'Food' => 'æ–™ç†', + 'Frame Composite' => 'フレームåˆæˆ', + 'Green Mode' => 'グリーンモード', + 'Hi-speed Program' => '高速優先プログラム', + 'Hi-speed Program (HyP)' => '高速優先プログラム(ãƒã‚¤ãƒ‘ープログラム)', + 'Illustrations' => 'イラスト', + 'Kids' => 'キッズ', + 'Landscape' => '風景', + 'Light Pet' => 'ペット白色', + 'MTF Program' => 'MTF優先プログラム', + 'MTF Program (HyP)' => 'MTF優先プログラム(ãƒã‚¤ãƒ‘ープログラム)', + 'Macro' => 'マクロ', + 'Manual' => 'マニュアル', + 'Manual, Off-Auto-Aperture' => 'マニュアル(自動絞りOFF)', + 'Medium Pet' => 'ペットç°è‰²', + 'Monotone' => 'モノトーン', + 'Museum' => '美術館', + 'Muted' => 'å¼±ã‚ã‚‹', + 'Natural' => 'ナãƒãƒ¥ãƒ©ãƒ«', + 'Natural Light' => 'ナãƒãƒ¥ãƒ©ãƒ«ãƒ•ã‚©ãƒˆ', + 'Natural Light & Flash' => 'ナãƒãƒ¥ãƒ©ãƒ«ãƒ•ã‚©ãƒˆï¼†ãƒ•ãƒ©ãƒƒã‚·ãƒ¥', + 'Natural Skin Tone' => '美肌', + 'Night Scene' => '夜景', + 'Night Scene Portrait' => '人物ã€å¤œæ™¯', + 'No Flash' => 'フラッシュ無ã—', + 'Panorama' => 'パノラマ', + 'Party' => 'パーティ', + 'Pet' => 'ペット', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Program' => 'プログラム', + 'Program (HyP)' => 'プログラムAE(ãƒã‚¤ãƒ‘ープログラム)', + 'Program AE' => 'プログラムAE', + 'Program Av Shift' => 'プログラムAvシフト', + 'Program Tv Shift' => 'プログラムTvシフト', + 'Self Portrait' => '自分撮り', + 'Sensitivity Priority AE' => '感度優先AE', + 'Sepia' => 'セピア', + 'Shutter & Aperture Priority AE' => 'シャッター&絞り優先AE', + 'Shutter Speed Priority' => 'シャッター優先', + 'Shutter speed priority AE' => 'シャッター優先', + 'Snow' => 'スノー', + 'Soft' => 'ソフト', + 'Sport' => 'スãƒãƒ¼ãƒ„', + 'Sports' => 'スãƒãƒ¼ãƒ„', + 'Standard' => 'スタンダード', + 'Sunset' => '夕日', + 'Surf & Snow' => 'サーフ&スノー', + 'Synchro Sound Record' => 'ボイスレコーディング', + 'Text' => 'テキスト', + 'Underwater' => '水中', + 'Vivid' => 'ビビッド', + }, + }, + 'PictureMode2' => { + Description => 'ピクãƒãƒ£ãƒ¼ãƒ¢ãƒ¼ãƒ‰ 2', + PrintConv => { + 'Aperture Priority' => '絞り優先', + 'Aperture Priority, Off-Auto-Aperture' => '絞り優先(自動絞りオフ)', + 'Auto PICT' => 'オートピクãƒãƒ£', + 'Bulb' => 'ãƒãƒ«ãƒ–', + 'Bulb, Off-Auto-Aperture' => 'ãƒãƒ«ãƒ–(自動絞りオフ)', + 'Flash X-Sync Speed AE' => 'ストロボåŒèª¿é€Ÿåº¦AE', + 'Green Mode' => 'グリーンモード', + 'Manual' => 'マニュアル', + 'Manual, Off-Auto-Aperture' => 'マニュアル(自動絞りオフ)', + 'Program AE' => 'プログラムAE', + 'Program Av Shift' => 'プログラムAvシフト', + 'Program Tv Shift' => 'プログラムTvシフト', + 'Scene Mode' => 'シーンモード', + 'Sensitivity Priority AE' => '感度優先AE', + 'Shutter & Aperture Priority AE' => 'シャッター&絞り優先AE', + 'Shutter Speed Priority' => 'シャッター優先', + }, + }, + 'PictureModeBWFilter' => { + Description => 'ピクãƒãƒ£ãƒ¼ãƒ¢ãƒ¼ãƒ‰BWフィルター', + PrintConv => { + 'Green' => 'ç·‘', + 'Neutral' => 'ニュートラル', + 'Orange' => 'オレンジ', + 'Red' => '赤', + 'Yellow' => '黄色', + 'n/a' => '該当無ã—', + }, + }, + 'PictureModeContrast' => 'ピクãƒãƒ£ãƒ¼ãƒ¢ãƒ¼ãƒ‰ã‚³ãƒ³ãƒˆãƒ©ã‚¹ãƒˆ', + 'PictureModeHue' => 'ピクãƒãƒ£ãƒ¼ãƒ¢ãƒ¼ãƒ‰è‰²ç›¸ï¼Ÿ', + 'PictureModeSaturation' => 'ピクãƒãƒ£ãƒ¼ãƒ¢ãƒ¼ãƒ‰å½©åº¦', + 'PictureModeSharpness' => 'ピクãƒãƒ£ãƒ¼ãƒ¢ãƒ¼ãƒ‰ã‚·ãƒ£ãƒ¼ãƒ—ãƒã‚¹', + 'PictureModeTone' => { + Description => 'ピクãƒãƒ£ãƒ¼ãƒ¢ãƒ¼ãƒ‰ãƒˆãƒ¼ãƒ³', + PrintConv => { + 'Blue' => 'é’', + 'Green' => 'ç·‘', + 'Neutral' => 'ニュートラル', + 'Purple' => 'ç´«', + 'Sepia' => 'セピア', + 'n/a' => '該当無ã—', + }, + }, + 'PictureStyle' => { + Description => 'ピクãƒãƒ£ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ«', + PrintConv => { + 'CM Set 1' => 'CMセット1', + 'CM Set 2' => 'CMセット2', + 'Faithful' => '忠実設定', + 'High Saturation' => '高彩度', + 'Landscape' => '風景', + 'Low Saturation' => '低彩度', + 'Monochrome' => 'モノトーン', + 'Neutral' => 'ニュートラル', + 'None' => 'ç„¡ã—', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Standard' => 'スタンダード', + 'User Def. 1' => 'ユーザ設定1', + 'User Def. 2' => 'ユーザ設定2', + 'User Def. 3' => 'ユーザ設定3', + }, + }, + 'PixelFormat' => { + Description => 'ピクセルフォーマット', + PrintConv => { + 'Black & White' => '白黒', + }, + }, + 'PixelIntensityRange' => 'ピクセル強度範囲', + 'PixelScale' => 'モデル画素スケールタグ', + 'PixelUnits' => { + PrintConv => { + 'Unknown' => 'ä¸æ˜Ž', + }, + }, + 'PlanarConfiguration' => { + Description => 'ç”»åƒãƒ‡ãƒ¼ã‚¿ã®ä¸¦ã³', + PrintConv => { + 'Chunky' => 'ç‚¹é †æ¬¡å½¢å¼ (é‡ã­åˆã‚ã›)', + 'Planar' => 'å¹³é¢å½¢å¼', + }, + }, + 'PowerSource' => { + Description => 'é›»æº', + PrintConv => { + 'Body Battery' => '本体電æº', + 'External Power Supply' => '外部電æº', + 'Grip Battery' => 'ãƒãƒƒãƒ†ãƒªãƒ¼ã‚°ãƒªãƒƒãƒ—', + }, + }, + 'PreCaptureFrames' => 'プレキャプãƒãƒ£ãƒ¼ãƒ•ãƒ¬ãƒ¼ãƒ ', + 'Predictor' => '指標', + 'Preview' => 'プレビューIFDãƒã‚¤ãƒ³ã‚¿ãƒ¼', + 'Preview0' => 'プレビュー0', + 'Preview1' => 'プレビュー1', + 'Preview2' => 'プレビュー2', + 'PreviewApplicationName' => 'プレビューアプリケーションå', + 'PreviewApplicationVersion' => 'プレビューアプリケーションãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'PreviewColorSpace' => { + Description => 'プレビュー色空間', + PrintConv => { + 'Unknown' => 'ä¸æ˜Ž', + }, + }, + 'PreviewDateTime' => 'プレビュー日時', + 'PreviewIFD' => 'プレビューIFDãƒã‚¤ãƒ³ã‚¿ãƒ¼', + 'PreviewImage' => 'プレビューイメージ', + 'PreviewImageBorders' => 'プレビュー画åƒå¢ƒç•Œ', + 'PreviewImageData' => 'プレビュー画åƒãƒ‡ãƒ¼ã‚¿', + 'PreviewImageLength' => 'プレビューイメージ容é‡', + 'PreviewImageSize' => 'プレビューイメージサイズ', + 'PreviewImageStart' => 'プレビューイメージ開始', + 'PreviewImageValid' => { + Description => '有効プレビュー画åƒ', + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'PreviewQuality' => { + PrintConv => { + 'Economy' => 'エコノミー', + 'Fine' => 'ファイン', + 'Normal' => '標準', + 'Normal Movie' => '標準動画', + 'Superfine' => 'S.ファイン', + }, + }, + 'PreviewSettingsDigest' => 'プレビュー設定è¦ç´„', + 'PreviewSettingsName' => 'プレビュー設定å', + 'PrimaryAFPoint' => { + Description => 'プライマリAFãƒã‚¤ãƒ³ãƒˆ', + PrintConv => { + 'Bottom' => '下', + 'C6 (Center)' => 'C6 (中央)', + 'Center' => '中央', + 'Mid-left' => '中央左', + 'Mid-right' => '中央å³', + 'Top' => '上', + }, + }, + 'PrimaryChromaticities' => '原色色度', + 'PrimaryPlatform' => '主è¦ãƒ—ラットフォーム', + 'PrintIM' => 'プリントイメージマッãƒãƒ³ã‚°', + 'ProcessingSoftware' => '処ç†ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢', + 'ProductID' => '製å“ID', + 'ProductionCode' => 'カメラãŒä¿®ç†ã•ã‚ŒãŸã‹ï¼Ÿ', + 'ProfileCMMType' => 'CMMタイププロフィール', + 'ProfileCalibrationSig' => 'プロフィールキャリブレーションサイン', + 'ProfileClass' => { + Description => 'プロフィールクラス', + PrintConv => { + 'Abstract Profile' => '抜粋プロフィール', + 'ColorSpace Conversion Profile' => '色空間変æ›ãƒ—ロフィール', + 'DeviceLink Profile' => 'デãƒã‚¤ã‚¹ãƒªãƒ³ã‚¯ãƒ—ロフィール', + 'Display Device Profile' => '表示装置プロフィール', + 'Input Device Profile' => '入力装置プロフィール', + 'NamedColor Profile' => '色å称プロフィール', + 'Nikon Input Device Profile (NON-STANDARD!)' => 'ニコンプロフィール("nkpf")', + 'Output Device Profile' => '出力装置プロフィール', + }, + }, + 'ProfileConnectionSpace' => '接続スペースプロフィール', + 'ProfileCopyright' => 'プロフィール著作権', + 'ProfileCreator' => 'プロフィール製作者', + 'ProfileDateTime' => 'プロフィール日時', + 'ProfileDescription' => 'プロフィール説明', + 'ProfileDescriptionML' => 'プロフィール説明ML', + 'ProfileEmbedPolicy' => { + Description => 'プロフィール埋ã‚è¾¼ã¿æ–¹é‡', + PrintConv => { + 'Allow Copying' => 'コピー許å¯', + 'Embed if Used' => '埋ã‚è¾¼ã¿ä½¿ç”¨', + 'Never Embed' => '埋ã‚è¾¼ã¿ç¦æ­¢', + 'No Restrictions' => '無制é™', + }, + }, + 'ProfileFileSignature' => 'プロフィールファイルシグãƒãƒ¼ãƒãƒ£', + 'ProfileHueSatMapData1' => '色相Sat.マップデータプロフィール1', + 'ProfileHueSatMapData2' => '色相Sat.マップデータプロフィール2', + 'ProfileHueSatMapDims' => '色境界', + 'ProfileID' => 'プロフィールID', + 'ProfileLookTableData' => '表示テーブルデータプロフィール', + 'ProfileLookTableDims' => '色境界', + 'ProfileName' => 'プロフィールå', + 'ProfileSequenceDesc' => 'プロフィールシーケンス説明', + 'ProfileToneCurve' => 'トーンカーブプロフィール', + 'ProfileVersion' => 'プロフィールãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'ProgramISO' => 'プログラムISO', + 'ProgramLine' => { + Description => 'プログラムライン', + PrintConv => { + 'Depth' => '深度優先', + 'Hi Speed' => '高速優先', + 'MTF' => 'MTF優先', + 'Normal' => 'ノーマル', + }, + }, + 'ProgramMode' => { + PrintConv => { + 'Night Portrait' => '人物夜景', + 'None' => 'ç„¡ã—', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Sports' => 'スãƒãƒ¼ãƒ„', + 'Sunset' => '夕日', + 'Text' => 'テキスト', + }, + }, + 'ProgramShift' => 'プログラムシフト', + 'ProgramVersion' => 'プログラムãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'Province-State' => '行政区/å·ž', + 'Quality' => { + Description => 'å“質', + PrintConv => { + 'Best' => 'S.ファイン', + 'Better' => 'ファイン', + 'Compressed RAW' => 'cRAW', + 'Compressed RAW + JPEG' => 'cRAW+JPEG', + 'Economy' => 'エコノミー', + 'Extra Fine' => 'エクストラファイン', + 'Fine' => 'ファイン', + 'Good' => 'エコノミー', + 'Low' => '低画質', + 'Normal' => 'ノーマル', + 'Premium' => 'プレミアム', + 'RAW + JPEG' => 'RAW+JPEG', + 'Standard' => 'スタンダード', + 'n/a' => '未設定', + }, + }, + 'Quality2' => 'å“質', + 'QualityMode' => { + Description => 'å“質モード', + PrintConv => { + 'Economy' => 'エコノミー', + 'Fine' => 'ファイン', + 'Normal' => 'ノーマル', + }, + }, + 'QuantizationMethod' => 'é‡å­åŒ–方法', + 'QuickAdjust' => 'クイック調整', + 'QuickControlDialInMeter' => { + Description => '測光タイマー中ã®ã‚µãƒ–é›»å­ãƒ€ã‚¤ãƒ¤ãƒ«', + PrintConv => { + 'AF point selection' => 'AFフレームé¸æŠž', + 'Exposure comp/Aperture' => '露出補正/絞り数値', + 'ISO speed' => 'ISO感度', + }, + }, + 'QuickShot' => { + Description => 'クイックショット', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'RAFVersion' => 'RAFãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'ROCInfo' => 'ROC情報', + 'RasterPadding' => 'ラスタパディング', + 'RasterizedCaption' => 'ラスタ化表題', + 'Rating' => '格付ã‘', + 'RatingPercent' => '格付ã‘(%)', + 'RawAndJpgRecording' => { + Description => 'RAWã¨JPEG記録', + PrintConv => { + 'RAW+Large/Fine' => 'RAW+ラージï¼ãƒ•ã‚¡ã‚¤ãƒ³', + 'RAW+Large/Normal' => 'RAW+ラージï¼ãƒŽãƒ¼ãƒžãƒ«', + 'RAW+Medium/Fine' => 'RAW+ミドルï¼ãƒ•ã‚¡ã‚¤ãƒ³', + 'RAW+Medium/Normal' => 'RAW+ミドルï¼ãƒŽãƒ¼ãƒžãƒ«', + 'RAW+Small/Fine' => 'RAW+スモールï¼ãƒ•ã‚¡ã‚¤ãƒ³', + 'RAW+Small/Normal' => 'RAW+スモールï¼ãƒŽãƒ¼ãƒžãƒ«', + }, + }, + 'RawColorAdj' => { + PrintConv => { + 'Custom' => 'カスタム', + 'Faithful' => '忠実設定', + }, + }, + 'RawDataOffset' => 'RAWデータオフセット', + 'RawDataUniqueID' => 'RAWデータユニークID', + 'RawDevAutoGradation' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'RawDevColorSpace' => '色空間', + 'RawDevContrastValue' => 'コントラスト値', + 'RawDevEditStatus' => { + Description => '編集状態', + PrintConv => { + 'Edited (Landscape)' => 'スタジオ(風景)', + 'Edited (Portrait)' => 'スタジオ(ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆï¼‰', + 'Original' => 'オリジナル', + }, + }, + 'RawDevEngine' => { + Description => 'エンジン', + PrintConv => { + 'Advanced High Speed' => 'アドãƒãƒ³ã‚¹é«˜é€Ÿ', + 'High Function' => '高機能', + 'High Speed' => '高速', + }, + }, + 'RawDevExposureBiasValue' => '露出ãƒã‚¤ã‚¢ã‚¹å€¤', + 'RawDevGrayPoint' => 'グレーãƒã‚¤ãƒ³ãƒˆ', + 'RawDevMemoryColorEmphasis' => '記憶色強調', + 'RawDevNoiseReduction' => 'ノイズフィルター(増感)', + 'RawDevPMPictureTone' => { + PrintConv => { + 'Blue' => 'é’', + 'Green' => 'ç·‘', + 'Neutral' => 'ニュートラル', + 'Purple' => 'ç´«', + 'Sepia' => 'セピア', + }, + }, + 'RawDevPM_BWFilter' => { + PrintConv => { + 'Green' => 'ç·‘', + 'Neutral' => 'ニュートラル', + 'Orange' => 'オレンジ', + 'Red' => '赤', + 'Yellow' => '黄色', + }, + }, + 'RawDevPictureMode' => { + PrintConv => { + 'Natural' => 'ナãƒãƒ¥ãƒ©ãƒ«', + 'Sepia' => 'セピア', + 'Vivid' => 'ビビッド', + }, + }, + 'RawDevSaturationEmphasis' => '彩度強調', + 'RawDevSettings' => 'ノイズリダクション', + 'RawDevSharpnessValue' => 'コントラスト値', + 'RawDevVersion' => 'RAW展開ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'RawDevWBFineAdjustment' => 'ホワイトãƒãƒ©ãƒ³ã‚¹å¾®èª¿æ•´', + 'RawDevWhiteBalance' => { + PrintConv => { + 'Color Temperature' => '色温度', + }, + }, + 'RawDevWhiteBalanceValue' => 'ホワイトãƒãƒ©ãƒ³ã‚¹å€¤', + 'RawImageCenter' => 'RAWイメージセンター', + 'RawImageDigest' => 'RAWイメージè¦ç´„', + 'RawImageHeight' => 'イメージ高ã•', + 'RawImageSegmentation' => 'RAWイメージ部分番å·', + 'RawImageSize' => 'RAWイメージサイズ', + 'RawImageWidth' => 'イメージ幅', + 'RawInfoVersion' => 'RAW情報ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'RawJpgQuality' => { + Description => 'RAW JPEG å“質', + PrintConv => { + 'Economy' => 'エコノミー', + 'Fine' => 'ファイン', + 'Normal' => '標準', + 'Normal Movie' => '標準動画', + 'Superfine' => 'S.ファイン', + }, + }, + 'RawJpgSize' => { + Description => 'RAW JPEG サイズ', + PrintConv => { + 'Large' => 'ラージ', + 'Medium' => 'ミドル', + 'Medium 1' => 'ミドル1', + 'Medium 2' => 'ミドル2', + 'Medium 3' => 'ミドル3', + 'Medium Movie' => 'ミディアム動画', + 'Postcard' => 'ãƒã‚¬ã‚­', + 'Small' => 'スモール', + 'Small Movie' => 'スモール動画', + 'Widescreen' => 'ワイド画é¢', + }, + }, + 'RecordMode' => { + Description => '記録モード', + PrintConv => { + 'Aperture Priority' => '絞り優先', + 'Best Shot' => 'ベストショット', + 'Manual' => 'マニュアル', + 'Movie' => 'å‹•ç”»', + 'Movie (19)' => '動画(19)', + 'Program AE' => 'プログラムAE', + 'Shutter Priority' => 'シャッター優先', + 'YouTube Movie' => 'YouTubeå‹•ç”»', + }, + }, + 'RecordShutterRelease' => 'レコードシャッターレリーズ', + 'RecordingMode' => { + Description => '記録モード', + PrintConv => { + 'Auto' => 'オート', + 'Landscape' => '風景', + 'Manual' => 'マニュアル', + 'Night Scene' => '夜景', + 'Panorama' => 'パノラマ', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Single Shutter' => 'シングルシャッター', + }, + }, + 'RedBalance' => 'レッドãƒãƒ©ãƒ³ã‚¹', + 'RedEyeCorrection' => { + PrintConv => { + 'Automatic' => 'オート', + 'Off' => 'オフ', + }, + }, + 'RedEyeData' => '赤目データ', + 'RedEyeReduction' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'RedMatrixColumn' => '赤色マトリックス列', + 'RedTRC' => '赤色調増殖曲線', + 'ReductionMatrix1' => '縮å°ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹1', + 'ReductionMatrix2' => '縮å°ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹2', + 'ReferenceBlackWhite' => '白黒ã®åŸºæº–値ã®ä¸€çµ„', + 'ReferenceDate' => 'å‚照日付', + 'ReferenceNumber' => 'å‚照数', + 'ReferenceService' => 'å‚照サービス', + 'RelatedImageFileFormat' => '関連イメージファイル形å¼', + 'RelatedImageHeight' => '関連イメージ高', + 'RelatedImageWidth' => '関連イメージ幅', + 'RelatedSoundFile' => '関連オーディオファイル', + 'ReleaseButtonToUseDial' => { + Description => 'レリーズボタンã‹ã‚‰ä½¿ç”¨ãƒ€ã‚¤ãƒ¤ãƒ«', + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'ReleaseDate' => 'リリース日付', + 'ReleaseTime' => 'リリース時間', + 'RemoteOnDuration' => 'リモートæŒç¶šæ™‚é–“', + 'RenderingIntent' => { + Description => 'æ„æ€è¡¨ç¾', + PrintConv => { + 'ICC-Absolute Colorimetric' => '絶対比色分æž', + 'Media-Relative Colorimetric' => '相対比色分æž', + 'Perceptual' => '知覚的', + 'Saturation' => '飽和', + }, + }, + 'RepeatingFlashCount' => 'リピーティングフラッシュ 時間', + 'RepeatingFlashOutput' => 'リピーティングフラッシュ 出力', + 'RepeatingFlashRate' => 'リピーティングフラッシュ 周波数', + 'ResampleParamsQuality' => { + PrintConv => { + 'High' => '高ã„', + 'Low' => 'ソフト', + }, + }, + 'Resaved' => { + Description => '予約', + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'ResolutionMode' => '解åƒåº¦ãƒ¢ãƒ¼ãƒ‰', + 'ResolutionUnit' => { + Description => 'Xã¨Y解åƒåº¦å˜ä½', + PrintConv => { + 'None' => 'ç„¡ã—', + 'cm' => 'ピクセル/cm', + 'inches' => 'インãƒ', + }, + }, + 'RetouchHistory' => { + Description => 'レタッãƒå±¥æ­´', + PrintConv => { + 'None' => 'ç„¡ã—', + 'Sepia' => 'セピア', + }, + }, + 'ReverseIndicators' => '指標逆転', + 'Rotation' => { + Description => '回転', + PrintConv => { + 'Horizontal' => '水平(標準)', + 'Horizontal (Normal)' => '水平(標準)', + 'Horizontal (normal)' => '水平(標準)', + 'Rotate 180' => '180度回転', + 'Rotate 270 CW' => '270度回転 CW', + 'Rotate 90 CW' => '90度回転 CW', + 'Rotated 180' => '180度回転', + 'Rotated 270 CW' => '270度回転 CW', + 'Rotated 90 CW' => '90度回転 CW', + }, + }, + 'RowInterleaveFactor' => '列を挟むè¦å› ', + 'RowsPerStrip' => '1片ã®åˆ—æ•°', + 'SMaxSampleValue' => 'S 最大サンプル値', + 'SMinSampleValue' => 'S 最å°ã‚µãƒ³ãƒ—ル値', + 'SPIFFVersion' => 'SPIFFãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'SRAWQuality' => { + PrintConv => { + 'n/a' => '該当無ã—', + }, + }, + 'SRActive' => { + Description => '手ã¶ã‚Œè£œæ­£çŠ¶æ…‹', + PrintConv => { + 'No' => 'オフ', + 'Yes' => 'オン', + }, + }, + 'SRFocalLength' => 'SR焦点è·é›¢', + 'SRHalfPressTime' => 'シャッターåŠæŠ¼ã—時間', + 'SRResult' => { + Description => 'SR効果', + PrintConv => { + 'Not stabilized' => 'ãªã—', + }, + }, + 'SVGVersion' => 'SVGãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'SafetyShift' => { + Description => 'セイフティシフト', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable (ISO speed)' => 'ã™ã‚‹(ISO感度)', + 'Enable (Tv/Av)' => 'ã™ã‚‹(Tv/Av値)', + }, + }, + 'SafetyShiftInAvOrTv' => { + Description => 'セイフティシフトã®è¨­å®š', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'SampleFormat' => 'サンプル形å¼', + 'SampleStructure' => 'サンプリング構造', + 'SamplesPerPixel' => 'コンãƒãƒ¼ãƒãƒ³ãƒˆæ•°', + 'SanyoQuality' => 'サンヨーå“質', + 'SanyoThumbnail' => 'サンヨーサムãƒã‚¤ãƒ«', + 'Saturation' => { + Description => '彩度', + PrintConv => { + '+1 (medium high)' => '+1 (å°‘ã—高ã„)', + '+2 (high)' => '+2 (ãƒãƒ¼ãƒ‰)', + '+3 (very high)' => '+3 (ã‹ãªã‚Šé«˜ã„)', + '+4 (highest)' => '+4', + '+4 (maximum)' => '+4', + '-1 (medium low)' => '-1 (å°‘ã—低ã„)', + '-2 (low)' => '-2 (ソフト)', + '-3 (very low)' => '-3 (ã‹ãªã‚Šä½Žã„)', + '-4 (lowest)' => '-4', + '-4 (minimum)' => '-4', + '0 (normal)' => '0 (スタンダード)', + 'B&W' => '黒&白', + 'Film Simulation' => 'フィルムシミュレーション', + 'High' => '高ã„彩度', + 'Low' => '低ã„彩度', + 'Medium High' => 'å°‘ã—高ã„', + 'Medium Low' => 'å°‘ã—低ã„', + 'None' => '未設定', + 'None (B&W)' => 'ç„¡ã—(黒&白)', + 'Normal' => '標準', + }, + }, + 'SaturationFaithful' => '彩度忠実設定', + 'SaturationLandscape' => '彩度風景', + 'SaturationNeutral' => '彩度ニュートラル', + 'SaturationPortrait' => '彩度ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'SaturationSetting' => '彩度設定', + 'SaturationStandard' => '彩度スタンダード', + 'SaturationUserDef1' => '彩度ユーザ設定1', + 'SaturationUserDef2' => '彩度ユーザ設定2', + 'SaturationUserDef3' => '彩度ユーザ設定3', + 'ScanImageEnhancer' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ScanningDirection' => '走査方å‘', + 'Scene' => 'å ´é¢', + 'SceneArea' => 'シーンエリア?', + 'SceneAssist' => 'シーン調整', + 'SceneCaptureType' => { + Description => 'シーンキャプãƒãƒ£ã‚¿ã‚¤ãƒ—', + PrintConv => { + 'Landscape' => '風景', + 'Night' => '夜景', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Standard' => 'スタンダード', + }, + }, + 'SceneDetect' => 'シーン検出', + 'SceneDetectData' => 'シーン検出データ?', + 'SceneMode' => { + Description => 'シーンモード', + PrintConv => { + '2 in 1' => '2イン1', + '3D Sweep Panorama' => '3D', + 'Aerial Photo' => '空撮', + 'Anti Motion Blur' => '人物ブレ軽減', + 'Aperture Priority' => '絞り優先', + 'Auction' => 'アクション', + 'Auto' => 'オート', + 'Auto+' => 'Auto アドãƒãƒ³ã‚¹', + 'Available Light' => '自然光', + 'Baby' => '赤ã¡ã‚ƒã‚“', + 'Beach' => 'ビーãƒ', + 'Beach & Snow' => 'ビーãƒï¼†ã‚¹ãƒŽãƒ¼', + 'Behind Glass' => 'ガラス越ã—', + 'Candle' => 'キャンドル', + 'Candlelight' => 'キャンドルライト', + 'Children' => 'å­ä¾›', + 'Color Effects' => 'カラーエフェクト', + 'Cont. Priority AE' => '連続撮影優先AE', + 'Cuisine' => 'æ–™ç†', + 'Digital Image Stabilization' => 'デジタル手振れ補正', + 'Documents' => '文書', + 'Face Portrait' => 'å¯é¡”', + 'Fireworks' => '花ç«', + 'Food' => 'æ–™ç†', + 'Handheld Night Shot' => '手æŒã¡å¤œæ™¯', + 'High Key' => 'ãƒã‚¤ã‚­ãƒ¼', + 'High Sensitivity' => '高感度', + 'High Speed Continuous Shooting' => '高速連写', + 'Indoor' => '屋内撮影', + 'Intelligent Auto' => 'インテリジェントオート', + 'Intelligent ISO' => 'インテリジェントISO', + 'Landscape' => '風景', + 'Landscape+Portrait' => '風景+人物', + 'Low Key' => 'ローキー', + 'Macro' => 'マクロ', + 'Manual' => 'マニュアル', + 'Movie' => 'å‹•ç”»', + 'Movie Preview' => '動画プレビュー', + 'Museum' => '美術館', + 'My Mode' => 'マイモード', + 'Nature Macro' => '自然マクロ', + 'Night Portrait' => '人物夜景', + 'Night Scene' => '夜景', + 'Night Scenery' => '夜景', + 'Night View/Portrait' => 'ナイトビュー/ãƒãƒ¼ãƒˆãƒ¬ã‚¤ãƒˆ', + 'Night+Portrait' => '夜景+人物', + 'Normal' => 'ノーマル', + 'Off' => 'オフ', + 'Panning' => 'パンニング', + 'Panorama' => 'パノラマ', + 'Panorama Assist' => 'パノラマアシスト', + 'Party' => 'パーティ', + 'Pet' => 'ペット', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Program' => 'プログラム', + 'Scenery' => '風景', + 'Self Portrait' => '自分撮り', + 'Self Portrait+Self Timer' => '自分撮り+セルフタイマー', + 'Self Protrait+Timer' => '自分撮り+セルフタイマー', + 'Shoot & Select' => 'ショット&セレクト', + 'Shoot & Select1' => 'ショット&セレクト1', + 'Shoot & Select2' => 'ショット&セレクト2', + 'Shooting Guide' => '撮影ガイド', + 'Shutter Priority' => 'シャッター優先', + 'Simple' => 'シンプル', + 'Smile Shot' => 'スマイルショット', + 'Snow' => 'スノー', + 'Soft Skin' => 'ソフトスキン', + 'Sport' => 'スãƒãƒ¼ãƒ„', + 'Sports' => 'スãƒãƒ¼ãƒ„', + 'Spot' => 'スãƒãƒƒãƒˆ', + 'Standard' => 'スタンダード', + 'Starry Night' => '星空', + 'Sunset' => '夕日', + 'Super Macro' => 'スーパーマクロ', + 'Sweep Panorama' => 'スイングパノラマ', + 'Text' => 'テキスト', + 'Underwater' => '水中', + 'Underwater Macro' => '水中マクロ', + 'Underwater Snapshot' => '水中スナップ', + 'Underwater Wide1' => '水中ワイド1', + 'Underwater Wide2' => '水中ワイド2', + 'Vivid' => 'ビビッド', + }, + }, + 'SceneModeUsed' => { + Description => 'シーンモード', + PrintConv => { + 'Aperture Priority' => '絞り優先', + 'Beach' => 'ビーãƒ', + 'Candlelight' => 'キャンドルライト', + 'Fireworks' => '花ç«', + 'Landscape' => '風景', + 'Macro' => 'マクロ', + 'Manual' => 'マニュアル', + 'Night Portrait' => '人物夜景', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Program' => 'プログラム', + 'Shutter Priority' => 'シャッター優先', + 'Snow' => 'スノー', + 'Sunset' => '夕日', + 'Text' => 'テキスト', + }, + }, + 'SceneSelect' => { + Description => 'シーンé¸æŠž', + PrintConv => { + 'Lamp' => 'ランプ', + 'Night' => '夜景', + 'Off' => 'オフ', + 'Sport' => 'スãƒãƒ¼ãƒ„', + 'TV' => 'テレビ', + 'User 1' => 'ユーザー1', + 'User 2' => 'ユーザー2', + }, + }, + 'SceneType' => { + Description => 'シーンタイプ', + PrintConv => { + 'Directly photographed' => '直接撮影画åƒ', + }, + }, + 'SecurityClassification' => { + Description => 'セキュリティ区分', + PrintConv => { + 'Confidential' => '機密文書', + 'Restricted' => 'é™å®š', + 'Secret' => '秘密', + 'Top Secret' => '最高機密', + 'Unclassified' => '未分類', + }, + }, + 'SelectableAFPoint' => { + Description => 'ä»»æ„é¸æŠžå¯èƒ½ãªAFフレーム', + PrintConv => { + '11 points' => '11点', + '19 points' => '19点', + '45 points' => '45点', + 'Inner 9 points' => '9点(内å´)', + 'Outer 9 points' => '9点(外å´)', + }, + }, + 'SelfTimer' => { + Description => 'セルフタイマー長', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'SelfTimer2' => 'セルフタイマー(2)', + 'SelfTimerMode' => 'セルフタイマーモード', + 'SelfTimerTime' => 'セルフタイマーé…延時間', + 'SensingMethod' => { + Description => 'センサー方å¼', + PrintConv => { + 'Color sequential area' => 'シーケンシャルカラーセンサー', + 'Color sequential linear' => 'シーケンシャルカラーラインセンサー', + 'Monochrome area' => 'モノクロエリアセンサー', + 'Monochrome linear' => 'モノクロラインセンサー', + 'Not defined' => '未定義', + 'One-chip color area' => 'å˜æ¿å¼ã‚«ãƒ©ãƒ¼ã‚»ãƒ³ã‚µãƒ¼', + 'Three-chip color area' => '3æ¿å¼ã‚«ãƒ©ãƒ¼ã‚»ãƒ³ã‚µãƒ¼', + 'Trilinear' => '3ラインセンサー', + 'Two-chip color area' => 'ï¼’æ¿å¼ã‚«ãƒ©ãƒ¼ã‚»ãƒ³ã‚µãƒ¼', + }, + }, + 'SensitivityAdjust' => '感度調節', + 'SensitivitySteps' => { + Description => '感度ステップ', + PrintConv => { + '1 EV Steps' => '1EVステップ', + 'As EV Steps' => '露出ステップã«å¾“ã†', + }, + }, + 'SensorCleaning' => { + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'SensorHeight' => 'センサー高ã•', + 'SensorImageHeight' => 'センサー高ã•', + 'SensorImageWidth' => 'センサー幅', + 'SensorLeftBorder' => 'イメージ左部', + 'SensorPixelSize' => 'センサーピクセルサイズ', + 'SensorTemperature' => 'センサー温度', + 'SensorTopBorder' => 'イメージ上部', + 'SensorWidth' => 'センサー幅', + 'Sequence' => 'シーケンス', + 'SequenceNumber' => 'シーケンス番å·', + 'SequenceShotInterval' => 'シーケンスショットインターãƒãƒ«', + 'SequentialShot' => { + Description => 'シーケンシャルショット', + PrintConv => { + 'None' => 'ç„¡ã—', + 'Standard' => 'スタンダード', + }, + }, + 'SerialNumber' => 'シリアル番å·', + 'SerialNumberFormat' => 'シリアル番å·å½¢å¼', + 'ServiceIdentifier' => 'サービス識別å­', + 'SetButtonCrossKeysFunc' => { + Description => 'SETボタン/å字キー機能', + PrintConv => { + 'Cross keys: AF point select' => 'å字キー:AFフレームé¸æŠž', + 'Normal' => '標準', + 'Set: Flash Exposure Comp' => 'SET:調光補正', + 'Set: Parameter' => 'SET:ç¾åƒãƒ‘ラメーターé¸æŠž', + 'Set: Picture Style' => 'SET:ピクãƒãƒ£ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ«', + 'Set: Playback' => 'SET:ç”»åƒã®å†ç”Ÿ', + 'Set: Quality' => 'SET:記録画質', + }, + }, + 'SetButtonWhenShooting' => { + Description => '撮影時ã®SETボタン', + PrintConv => { + 'Change parameters' => 'ç¾åƒãƒ‘ラメーターé¸æŠž', + 'Default (no function)' => '通常(ãªã—)', + 'Disabled' => '無効', + 'Flash exposure compensation' => '調光補正', + 'ISO speed' => 'ISO感度', + 'Image playback' => 'ç”»åƒå†ç”Ÿ', + 'Image quality' => '記録画質é¸æŠž', + 'Image size' => 'ç”»åƒã‚µã‚¤ã‚º', + 'LCD monitor On/Off' => '液晶モニターã®å…¥/切', + 'Menu display' => 'メニュー表示', + 'Normal (disabled)' => '通常(無効)', + 'Picture style' => 'ピクãƒãƒ£ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ«', + 'Quick control screen' => 'クイック設定画é¢', + 'Record func. + media/folder' => '記録機能ã¨ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ»ãƒ•ã‚©ãƒ«ãƒ€', + 'Record movie (Live View)' => '動画撮影(ライブビュー)', + 'White balance' => 'ホワイトãƒãƒ©ãƒ³ã‚¹', + }, + }, + 'SetFunctionWhenShooting' => { + Description => '撮影時ã®ã‚»ãƒƒãƒˆãƒœã‚¿ãƒ³æ©Ÿèƒ½', + PrintConv => { + 'Change Parameters' => 'ç¾åƒãƒ‘ラメーターé¸æŠž', + 'Change quality' => '記録画質é¸æŠž', + 'Default (no function)' => '通常(ãªã—)', + 'Image replay' => 'ç”»åƒã®å†ç”Ÿ', + 'Menu display' => 'メニュー表示', + }, + }, + 'ShadingCompensation' => { + Description => '陰影修正', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ShadingCompensation2' => { + Description => '陰影補正編集', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Shadow' => 'シャドウ', + 'ShadowScale' => 'シャドウスケール', + 'Shadows' => 'シャドウ', + 'ShakeReduction' => { + Description => '手ã¶ã‚Œè£œæ­£(設定)', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ShakeReductionInfo' => 'SR効果', + 'Sharpness' => { + Description => 'シャープãƒã‚¹', + PrintConv => { + '+1 (medium hard)' => '+1 (å°‘ã—ãƒãƒ¼ãƒ‰)', + '+2 (hard)' => '+2 (ãƒãƒ¼ãƒ‰)', + '+3 (very hard)' => '+3 (ã‹ãªã‚Šãƒãƒ¼ãƒ‰)', + '+4 (hardest)' => '+4', + '+4 (maximum)' => '+4', + '-1 (medium soft)' => '-1 (ミドルソフト)', + '-2 (soft)' => '-2 (ソフト)', + '-3 (very soft)' => '-3 (ã‹ãªã‚Šã‚½ãƒ•ãƒˆ)', + '-4 (minimum)' => '-4', + '-4 (softest)' => '-4', + '0 (normal)' => '0 (ノーマル)', + 'Film Simulation' => 'フィルムシミュレーション', + 'Hard' => 'ãƒãƒ¼ãƒ‰', + 'Hard2' => 'ãƒãƒ¼ãƒ‰2', + 'Medium Hard' => 'ミドルãƒãƒ¼ãƒ‰', + 'Medium Soft' => 'ミドルソフト', + 'Normal' => 'ノーマル', + 'Sharp' => 'シャープ', + 'Soft' => 'ソフト', + 'Soft2' => 'ソフト2', + 'n/a' => '該当無ã—', + }, + }, + 'SharpnessFactor' => 'シャープãƒã‚¹è¦å› ', + 'SharpnessFaithful' => 'シャープãƒã‚¹å¿ å®Ÿè¨­å®š', + 'SharpnessFrequency' => { + PrintConv => { + 'High' => '高ã„', + 'Low' => 'ソフト', + 'Standard' => 'スタンダード', + 'n/a' => '該当無ã—', + }, + }, + 'SharpnessLandscape' => 'シャープãƒã‚¹é¢¨æ™¯', + 'SharpnessMonochrome' => 'シャープãƒã‚¹ãƒ¢ãƒŽã‚¯ãƒ­', + 'SharpnessNeutral' => 'シャープãƒã‚¹ãƒ‹ãƒ¥ãƒ¼ãƒˆãƒ©ãƒ«', + 'SharpnessPortrait' => 'シャープãƒã‚¹ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'SharpnessSetting' => 'シャープãƒã‚¹è¨­å®š', + 'SharpnessStandard' => 'シャープãƒã‚¹ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰', + 'SharpnessUserDef1' => 'シャープãƒã‚¹ãƒ¦ãƒ¼ã‚¶è¨­å®š1', + 'SharpnessUserDef2' => 'シャープãƒã‚¹ãƒ¦ãƒ¼ã‚¶è¨­å®š2', + 'SharpnessUserDef3' => 'シャープãƒã‚¹ãƒ¦ãƒ¼ã‚¶è¨­å®š3', + 'ShootingInfoDisplay' => { + Description => '撮影情報表示', + PrintConv => { + 'Auto' => 'オート', + 'Manual (dark on light)' => '手動-黒地ã«ç™½', + 'Manual (light on dark)' => '手動-白地ã«é»’', + }, + }, + 'ShootingMode' => { + Description => '撮影モード', + PrintConv => { + 'Aerial Photo' => '空撮', + 'Aperture Priority' => '絞り優先', + 'Baby' => '赤ã¡ã‚ƒã‚“', + 'Beach' => 'ビーãƒ', + 'Candlelight' => 'キャンドルライト', + 'Clipboard' => 'メモ', + 'Color Effects' => 'カラーエフェクト', + 'Economy' => 'エコモード', + 'Fireworks' => '花ç«', + 'Food' => 'æ–™ç†', + 'High Sensitivity' => '高感度', + 'High Speed Continuous Shooting' => '高速連写', + 'Intelligent Auto' => 'インテリジェントオート', + 'Intelligent ISO' => 'インテリジェントISO', + 'Macro' => 'マクロ', + 'Manual' => 'マニュアル', + 'Movie Preview' => '動画プレビュー', + 'Night Portrait' => '人物夜景', + 'Night Scenery' => '夜景', + 'Normal' => '標準', + 'Panning' => 'パンニング', + 'Panorama Assist' => 'パノラマアシスト', + 'Party' => 'パーティ', + 'Pet' => 'ペット', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Program' => 'プログラム', + 'Scenery' => '風景', + 'Self Portrait' => '自分撮り', + 'Shutter Priority' => 'シャッター優先', + 'Simple' => 'シンプル', + 'Snow' => 'スノー', + 'Soft Skin' => 'ソフトスキン', + 'Sports' => 'スãƒãƒ¼ãƒ„', + 'Spot' => 'スãƒãƒƒãƒˆ', + 'Starry Night' => '星空', + 'Sunset' => '夕日', + 'Underwater' => '水中', + }, + }, + 'ShootingModeSetting' => { + Description => '撮影モード', + PrintConv => { + 'Continuous' => '連続撮影', + 'Delayed Remote' => 'é…延リモート', + 'Quick-response Remote' => 'å³æ™‚リモート', + 'Self-timer' => 'セルフタイマー', + 'Single Frame' => '1コマ撮影', + }, + }, + 'ShortDocumentID' => '短文書ID', + 'ShortOwnerName' => '短ã„オーナーå', + 'ShortReleaseTimeLag' => { + Description => 'レリーズタイムラグ最速化', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'ShotInfoVersion' => 'ショット情報ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'Shutter-AELock' => { + Description => 'シャッターボタン/AEロックボタン', + PrintConv => { + 'AE lock/AF' => 'AEロック/AF', + 'AE/AF, No AE lock' => 'AE/AF(AEロックãªã—)', + 'AF/AE lock' => 'AF/AEロック', + 'AF/AF lock' => 'AF/AFロック', + 'AF/AF lock, No AE lock' => 'AF/AFロック(AEロックãªã—)', + }, + }, + 'ShutterAELButton' => 'シャッターボタンï¼AEロックボタン', + 'ShutterButtonAFOnButton' => { + Description => 'シャッター/AF-ONボタン', + PrintConv => { + 'AE lock/Metering + AF start' => 'AEロック/測光・AF開始', + 'Metering + AF start' => '測光・AF開始', + 'Metering + AF start/AF stop' => '測光・AF開始/AFストップ', + 'Metering + AF start/disable' => '測光・AF開始/無効', + 'Metering start/Meter + AF start' => '測光開始/測光・AF開始', + }, + }, + 'ShutterCount' => 'シャッター回数', + 'ShutterCurtainSync' => { + Description => 'ストロボã®ã‚·ãƒ³ã‚¯ãƒ­ã‚¿ã‚¤ãƒŸãƒ³ã‚°', + PrintConv => { + '1st-curtain sync' => '先幕シンクロ', + '2nd-curtain sync' => '後幕シンクロ', + }, + }, + 'ShutterMode' => { + PrintConv => { + 'Aperture Priority' => '絞り優先', + 'Auto' => 'オート', + }, + }, + 'ShutterReleaseButtonAE-L' => { + Description => 'シャッターレリーズボタン AE-L', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ShutterReleaseNoCFCard' => { + Description => 'CFカード未装填時ã®ãƒ¬ãƒªãƒ¼ã‚º', + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'ShutterSpeed' => '露出時間', + 'ShutterSpeedRange' => { + Description => 'シャッター速度ã®åˆ¶å¾¡ç¯„囲ã®è¨­å®š', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'ShutterSpeedValue' => 'シャッタースピード', + 'SimilarityIndex' => '類似インデックス', + 'Site' => 'サイト', + 'SlaveFlashMeteringSegments' => 'スレーブフラッシュ測光値', + 'SlideShow' => { + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'SlowShutter' => { + Description => 'スローシャッター', + PrintConv => { + 'Night Scene' => '夜景', + 'None' => 'ç„¡ã—', + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'SlowSync' => { + Description => 'スローシンクロ', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Software' => 'ソフトウェア', + 'SoftwareVersion' => 'ソフトウェアãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'Source' => 'ソース', + 'SpatialFrequencyResponse' => '空間周波数特性', + 'SpecialEffectsOpticalFilter' => { + PrintConv => { + 'None' => 'ç„¡ã—', + }, + }, + 'SpecialInstructions' => '手順', + 'SpecialMode' => 'スペシャルモード', + 'SpectralSensitivity' => 'スペクトル感度', + 'Sport' => 'スãƒãƒ¼ãƒ„', + 'SpotFocusPointX' => 'スãƒãƒƒãƒˆãƒ•ã‚©ãƒ¼ã‚«ã‚¹ãƒã‚¤ãƒ³ãƒˆX', + 'SpotFocusPointY' => 'スãƒãƒƒãƒˆãƒ•ã‚©ãƒ¼ã‚«ã‚¹ãƒã‚¤ãƒ³ãƒˆY', + 'SpotMeterLinkToAFPoint' => { + Description => '測è·ç‚¹é€£å‹•ã‚¹ãƒãƒƒãƒˆæ¸¬å…‰', + PrintConv => { + 'Disable (use center AF point)' => 'ã—ãªã„(中央固定', + 'Enable (use active AF point)' => 'ã™ã‚‹(測è·ç‚¹é€£å‹•)', + }, + }, + 'SpotMeteringMode' => { + Description => 'スãƒãƒƒãƒˆãƒ¡ãƒ¼ã‚¿ãƒ¼ãƒ¢ãƒ¼ãƒ‰', + PrintConv => { + 'Center' => '中央', + }, + }, + 'State' => '都é“府県å', + 'StoNits' => 'Stoニット', + 'StraightenAngle' => 'ストレートアングル', + 'StreamType' => { + PrintConv => { + 'Text' => 'テキスト', + }, + }, + 'StripByteCounts' => '圧縮片ã®ãƒã‚¤ãƒˆæ•°', + 'StripOffsets' => 'ç”»åƒãƒ‡ãƒ¼ã‚¿ä½ç½®', + 'Sub-location' => '場所', + 'SubSecCreateDate' => 'デジタルデータ作æˆæ—¥æ™‚', + 'SubSecDateTimeOriginal' => 'オリジナルデータ作æˆæ—¥æ™‚', + 'SubSecModifyDate' => 'ファイル作æˆæ—¥æ™‚', + 'SubSecTime' => 'DateTimeサブ秒', + 'SubSecTimeDigitized' => 'DateTimeDigitizedサブ秒', + 'SubSecTimeOriginal' => 'DateTimeOriginalサブ秒', + 'SubTileBlockSize' => 'サブタイトルブロックサイズ', + 'SubfileType' => 'æ–°è¦ã‚µãƒ–ファイルタイプ', + 'SubimageColor' => { + PrintConv => { + 'Monochrome' => 'モノトーン', + }, + }, + 'Subject' => 'サブジェクト', + 'SubjectArea' => '対象領域', + 'SubjectCode' => 'サブジェクトコード', + 'SubjectDistance' => '対象è·é›¢', + 'SubjectDistanceRange' => { + Description => '被写体è·é›¢ç¯„囲', + PrintConv => { + 'Close' => '近景', + 'Distant' => 'é æ™¯', + 'Macro' => 'マクロ', + 'Unknown' => 'ä¸æ˜Ž', + }, + }, + 'SubjectLocation' => '対象領域', + 'SubjectProgram' => { + Description => '被写体プログラム', + PrintConv => { + 'Night portrait' => '人物夜景', + 'None' => 'ç„¡ã—', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Sports action' => 'スãƒãƒ¼ãƒ„アクション', + 'Sunset' => '夕日', + 'Text' => 'テキスト', + }, + }, + 'SubjectReference' => 'サブジェクトコード', + 'Subsystem' => { + PrintConv => { + 'Unknown' => 'ä¸æ˜Ž', + }, + }, + 'SuperMacro' => { + Description => 'スーパーマクロ', + PrintConv => { + 'Off' => 'オフ', + 'On (1)' => 'オン(1)', + 'On (2)' => 'オン(2)', + }, + }, + 'SuperimposedDisplay' => { + Description => 'スーパーインãƒãƒ¼ã‚ºã®è¡¨ç¤º', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'SupplementalCategories' => '補足カテゴリー', + 'SupplementalType' => '補足タイプ', + 'SvISOSetting' => 'SVISO感度設定', + 'SwitchToRegisteredAFPoint' => { + Description => '登録AFフレームã¸ã®åˆ‡ã‚Šæ›ãˆ', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'T4Options' => 'T4オプション', + 'T6Options' => 'T6オプション', + 'TIFF-EPStandardID' => 'TIFF/EP標準ID', + 'TTL_DA_ADown' => 'TTL D/A Aãƒãƒ£ãƒ³ãƒãƒ«ã€€ãƒ€ã‚¦ãƒ³', + 'TTL_DA_AUp' => 'TTL D/A Aãƒãƒ£ãƒ³ãƒãƒ« アップ', + 'TTL_DA_BDown' => 'TTL D/A Bãƒãƒ£ãƒ³ãƒãƒ«ã€€ãƒ€ã‚¦ãƒ³', + 'TTL_DA_BUp' => 'TTL D/A Bãƒãƒ£ãƒ³ãƒãƒ«ã€€ã‚¢ãƒƒãƒ—', + 'Tagged' => { + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'TargetAperture' => 'ターゲット絞り', + 'TargetExposureTime' => 'ターゲット露出時間', + 'TargetPrinter' => '標的プリンタ', + 'Technology' => { + Description => 'テクノロジー', + PrintConv => { + 'Active Matrix Display' => 'アクティブマトリクス型ディスプレイ', + 'Cathode Ray Tube Display' => 'CRTディスプレイ', + 'Digital Camera' => 'デジタルカメラ', + 'Dye Sublimation Printer' => '昇è¯åž‹ãƒ—リンター', + 'Electrophotographic Printer' => 'é™é›»è¨˜éŒ²å¼ãƒ—リンター', + 'Electrostatic Printer' => 'é™é›»æ°—プリンター', + 'Film Scanner' => 'フイルムスキャナー', + 'Film Writer' => 'フィルムライター', + 'Flexography' => 'アニリンå°åˆ·', + 'Gravure' => 'グラビアå°åˆ·', + 'Ink Jet Printer' => 'インクジェットプリンター', + 'Offset Lithography' => 'オフセットå°åˆ·', + 'Passive Matrix Display' => 'å˜ç´”マトリクス型ディスプレイ', + 'Photo CD' => 'フォトCD', + 'Photo Image Setter' => 'フォトイメージセッター', + 'Photographic Paper Printer' => 'å°ç”»ç´™ãƒ—リンター', + 'Projection Television' => 'プロジェクションテレビ', + 'Reflective Scanner' => 'å射スキャナ', + 'Silkscreen' => 'シルクスクリーンå°åˆ·', + 'Thermal Wax Printer' => '熱転写プリンター', + 'Video Camera' => 'ビデオカメラ', + 'Video Monitor' => 'ビデオモニター', + }, + }, + 'Teleconverter' => { + PrintConv => { + 'None' => 'ç„¡ã—', + }, + }, + 'Text' => 'テキスト', + 'TextInfo' => 'テキスト情報', + 'TextStamp' => { + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Thresholding' => '閾値化', + 'ThumbnailImage' => 'サムãƒã‚¤ãƒ«ç”»åƒ', + 'ThumbnailImageSize' => 'サムãƒã‚¤ãƒ«ã‚µã‚¤ã‚º', + 'ThumbnailImageValidArea' => 'サムãƒã‚¤ãƒ«ç”»åƒæœ‰åŠ¹é ˜åŸŸ', + 'TileByteCounts' => 'タイルã®ãƒã‚¤ãƒˆæ•°', + 'TileDepth' => 'タイルã®æ·±ã•', + 'TileLength' => 'タイルã®é•·ã•', + 'TileOffsets' => 'タイルã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ', + 'TileWidth' => 'タイルã®å¹…', + 'Time' => '時間', + 'TimeCreated' => '作æˆæ™‚é–“', + 'TimeScaleParamsQuality' => { + PrintConv => { + 'High' => '高ã„', + 'Low' => 'ソフト', + }, + }, + 'TimeSent' => '発é€æ™‚é–“', + 'TimeSincePowerOn' => 'é›»æºã‚ªãƒ³çµŒéŽæ™‚é–“', + 'TimeStamp' => 'タイムスタンプ', + 'TimeStamp1' => 'タイムスタンプ1', + 'TimeZone' => 'タイムゾーン', + 'TimeZoneOffset' => 'タイムゾーンオフセット', + 'TimerFunctionButton' => { + Description => 'ファンクションボタン', + PrintConv => { + 'ISO' => 'ISO感度', + 'Image Quality/Size' => 'ç”»åƒå“質/サイズ', + 'Self-timer' => 'セルフタイマー', + 'Shooting Mode' => '撮影モード', + 'White Balance' => 'ホワイトãƒãƒ©ãƒ³ã‚¹', + }, + }, + 'TimerLength' => { + Description => 'å„種タイマーä¿æŒæ™‚é–“', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'Title' => 'タイトル', + 'ToneComp' => 'トーン補正', + 'ToneCurve' => { + Description => 'トーンカーブ', + PrintConv => { + 'Custom' => 'カスタム', + 'Manual' => 'マニュアル', + 'Standard' => 'スタンダード', + }, + }, + 'ToneCurveActive' => { + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'ToneCurveName' => { + PrintConv => { + 'Custom' => 'カスタム', + }, + }, + 'ToneCurves' => 'トーンカーブ(s)', + 'ToningEffect' => { + Description => 'トーン効果', + PrintConv => { + 'B&W' => '白黒', + 'Blue' => 'é’', + 'Blue-green' => 'é’ç·‘', + 'Cyanotype' => 'é’写真', + 'Green' => 'ç·‘', + 'None' => 'ç„¡ã—', + 'Purple' => 'ç´«', + 'Purple-blue' => 'é’ç´«', + 'Red' => '赤', + 'Red-purple' => '赤紫', + 'Sepia' => 'セピア', + 'Yellow' => '黄色', + 'n/a' => '該当無ã—', + }, + }, + 'ToningEffectMonochrome' => { + Description => 'モノクロトーン効果', + PrintConv => { + 'Blue' => 'é’', + 'Green' => 'ç·‘', + 'None' => 'ç„¡ã—', + 'Purple' => 'ç´«', + 'Sepia' => 'セピア', + }, + }, + 'ToningSaturation' => '彩度トーン', + 'TransferFunction' => '転é€æ©Ÿèƒ½', + 'TransferRange' => '転é€ç¯„囲', + 'Transformation' => { + Description => '変形', + PrintConv => { + 'Horizontal (normal)' => '水平(標準)', + 'Rotate 180' => '180度回転', + 'Rotate 270 CW' => '270度回転 CW', + 'Rotate 90 CW' => '90度回転 CW', + }, + }, + 'TransmissionReference' => 'é€ä¿¡å…ƒè¨˜éŒ²', + 'TransparencyIndicator' => 'é€æ˜Žåº¦æŒ‡æ¨™', + 'TrapIndicator' => 'トラップインジケーター', + 'Trapped' => { + PrintConv => { + 'Unknown' => 'ä¸æ˜Ž', + }, + }, + 'TravelDay' => 'トラベル日付', + 'TvExposureTimeSetting' => 'Tv露出時間設定', + 'Type' => 'タイプ', + 'USMLensElectronicMF' => { + Description => 'USMレンズã®é›»å­å¼æ‰‹å‹•ãƒ•ã‚©ãƒ¼ã‚«ã‚¹', + PrintConv => { + 'Disable after one-shot AF' => 'ワンショットAF作動後・ä¸å¯', + 'Disable in AF mode' => 'AF時ã™ã¹ã¦ä¸å¯', + 'Enable after one-shot AF' => 'ワンショットAF作動後・å¯', + }, + }, + 'Uncompressed' => { + Description => 'éžåœ§ç¸®', + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'UniqueCameraModel' => 'ユニークカメラモデル', + 'UniqueDocumentID' => 'ユニーク文書ID', + 'UniqueObjectName' => 'ユニーク・ãƒãƒ¼ãƒ ãƒ»ã‚ªãƒ–・オブジェクト', + 'Unknown' => 'ä¸æ˜Ž', + 'Unsharp1Color' => { + Description => 'アンシャープ1カラー', + PrintConv => { + 'Blue' => 'é’', + 'Cyan' => 'シアン', + 'Green' => 'ç·‘', + 'Magenta' => 'マゼンダ', + 'Red' => '赤', + 'Yellow' => '黄色', + }, + }, + 'Unsharp1HaloWidth' => 'アンシャープ1円光幅', + 'Unsharp1Intensity' => 'アンシャープ1強度', + 'Unsharp1Threshold' => 'アンシャープ1起点', + 'Unsharp2Color' => { + Description => 'アンシャープ2カラー', + PrintConv => { + 'Blue' => 'é’', + 'Cyan' => 'シアン', + 'Green' => 'ç·‘', + 'Magenta' => 'マゼンダ', + 'Red' => '赤', + 'Yellow' => '黄色', + }, + }, + 'Unsharp2HaloWidth' => 'アンシャープ2円光幅', + 'Unsharp2Intensity' => 'アンシャープ2強度', + 'Unsharp2Threshold' => 'アンシャープ2起点', + 'Unsharp3Color' => { + Description => 'アンシャープ3カラー', + PrintConv => { + 'Blue' => 'é’', + 'Cyan' => 'シアン', + 'Green' => 'ç·‘', + 'Magenta' => 'マゼンダ', + 'Red' => '赤', + 'Yellow' => '黄色', + }, + }, + 'Unsharp3HaloWidth' => 'アンシャープ3円光幅', + 'Unsharp3Intensity' => 'アンシャープ3強度', + 'Unsharp3Threshold' => 'アンシャープ3起点', + 'Unsharp4Color' => { + Description => 'アンシャープ4カラー', + PrintConv => { + 'Blue' => 'é’', + 'Cyan' => 'シアン', + 'Green' => 'ç·‘', + 'Magenta' => 'マゼンダ', + 'Red' => '赤', + 'Yellow' => '黄色', + }, + }, + 'Unsharp4HaloWidth' => 'アンシャープ4円光幅', + 'Unsharp4Intensity' => 'アンシャープ4強度', + 'Unsharp4Threshold' => 'アンシャープ4起点', + 'UnsharpCount' => 'アンシャープカウント', + 'UnsharpData' => 'アンシャープデータ', + 'UnsharpMask' => { + Description => 'アンシャープマスク', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Urgency' => '緊急性', + 'UsableMeteringModes' => { + Description => '測光モードã®é™å®š', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'UsableShootingModes' => { + Description => '撮影モードã®é™å®š', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'UserComment' => 'ユーザーコメント', + 'UserDef1PictureStyle' => { + Description => 'ユーザ設定1 ピクãƒãƒ£ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ«', + PrintConv => { + 'Faithful' => '忠実設定', + 'Landscape' => '風景', + 'Monochrome' => 'モノトーン', + 'Neutral' => 'ニュートラル', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Standard' => 'スタンダード', + }, + }, + 'UserDef2PictureStyle' => { + Description => 'ユーザ設定2 ピクãƒãƒ£ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ«', + PrintConv => { + 'Faithful' => '忠実設定', + 'Landscape' => '風景', + 'Monochrome' => 'モノトーン', + 'Neutral' => 'ニュートラル', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Standard' => 'スタンダード', + }, + }, + 'UserDef3PictureStyle' => { + Description => 'ユーザ設定3 ピクãƒãƒ£ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ«', + PrintConv => { + 'Faithful' => '忠実設定', + 'Landscape' => '風景', + 'Monochrome' => 'モノトーン', + 'Neutral' => 'ニュートラル', + 'Portrait' => 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ', + 'Standard' => 'スタンダード', + }, + }, + 'VRDVersion' => 'VRDãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'VRInfo' => 'VR(手振れ補正)情報', + 'VRInfoVersion' => 'VR情報ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'VR_0x66' => { + PrintConv => { + 'Off' => 'オフ', + 'On (active)' => 'オン(アクティブ)', + 'On (normal)' => 'オン(ノーマル)', + }, + }, + 'ValidAFPoints' => '有効ãªAFãƒã‚¤ãƒ³ãƒˆ', + 'ValidBits' => 'ピクセルã«ã¤ã有効ãªãƒ“ット', + 'VariProgram' => 'ãƒãƒªãƒ—ログラム', + 'Version' => 'ãƒãƒ¼ã‚¸ãƒ§ãƒ³', + 'VibrationReduction' => { + Description => '手振れ補正(VR)', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + 'On (1)' => 'オン(1)', + 'On (2)' => 'オン(2)', + 'On (3)' => 'オン(3)', + 'n/a' => '該当無ã—', + }, + }, + 'VideoCardGamma' => 'ビデオカードガンマ', + 'ViewInfoDuringExposure' => { + Description => '露光中ã®ãƒ•ã‚¡ã‚¤ãƒ³ãƒ€ãƒ¼å†…表示', + PrintConv => { + 'Disable' => 'ã—ãªã„', + 'Enable' => 'ã™ã‚‹', + }, + }, + 'ViewfinderWarning' => { + Description => 'ビューファインダー警告表示', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'ViewingCondDesc' => '視è´çŠ¶æ…‹èª¬æ˜Ž', + 'ViewingCondIlluminant' => '視è´çŠ¶æ…‹å…‰æº', + 'ViewingCondIlluminantType' => '視è´çŠ¶æ…‹å…‰æºã‚¿ã‚¤ãƒ—', + 'ViewingCondSurround' => '視è´çŠ¶æ…‹å‘¨è¾º', + 'ViewingConditions' => '視è´çŠ¶æ…‹å…‰æº', + 'VignetteControl' => { + Description => 'ビãƒãƒƒãƒˆã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«', + PrintConv => { + 'High' => '高ã„', + 'Low' => '低ã„', + 'Normal' => '標準', + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'VignetteControlIntensity' => 'ビãƒãƒƒãƒˆã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«å¼·åº¦', + 'VoiceMemo' => { + Description => 'ボイスメモ', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'WBAdjData' => 'ホワイトãƒãƒ©ãƒ³ã‚¹èª¿æ•´ãƒ‡ãƒ¼ã‚¿', + 'WBAdjLighting' => { + Description => 'ホワイトãƒãƒ©ãƒ³ã‚¹èª¿æ•´ã€ãƒ©ã‚¤ãƒ†ã‚£ãƒ³ã‚°', + PrintConv => { + 'Daylight' => '昼光', + 'Flash' => 'ストロボ', + 'High Color Rendering Fluorescent (3700K)' => 'ãƒã‚¤ã‚«ãƒ©ãƒ¼ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°è›å…‰ç¯ (1)', + 'High Color Rendering Fluorescent (5000K)' => 'ãƒã‚¤ã‚«ãƒ©ãƒ¼ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°è›å…‰ç¯ (3)', + 'High Color Rendering Fluorescent (cool white)' => 'ãƒã‚¤ã‚«ãƒ©ãƒ¼ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°è›å…‰ç¯ (2)', + 'High Color Rendering Fluorescent (daylight)' => 'ãƒã‚¤ã‚«ãƒ©ãƒ¼ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°è›å…‰ç¯ (4)', + 'High Color Rendering Fluorescent (warm white)' => 'ãƒã‚¤ã‚«ãƒ©ãƒ¼ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°è›å…‰ç¯ (0)', + 'Incandescent' => 'é›»çƒ', + 'None' => 'ç„¡ã—', + 'Standard Fluorescent (3700K)' => '標準è›å…‰ç¯ (1)', + 'Standard Fluorescent (5000K)' => '標準è›å…‰ç¯ (3)', + 'Standard Fluorescent (6500K)' => '標準è›å…‰ç¯ (4)', + 'Standard Fluorescent (cool white)' => '標準è›å…‰ç¯ (2)', + 'Standard Fluorescent (high temperature mercury vapor)' => '標準è›å…‰ç¯ (5)', + 'Standard Fluorescent (warm white)' => '標準è›å…‰ç¯ (0)', + }, + }, + 'WBAdjMode' => { + Description => 'ホワイトãƒãƒ©ãƒ³ã‚¹èª¿æ•´ãƒ¢ãƒ¼ãƒ‰', + PrintConv => { + 'Calculate Automatically' => '自動計算', + 'Recorded Value' => '記録値', + 'Use Gray Point' => 'グレーãƒã‚¤ãƒ³ãƒˆä½¿ç”¨', + 'Use Temperature' => '温度使用', + }, + }, + 'WBAdjTemperature' => 'ホワイトãƒãƒ©ãƒ³ã‚¹èª¿æ•´ã€è‰²æ¸©åº¦', + 'WBBlueLevel' => 'ホワイトãƒãƒ©ãƒ³ã‚¹é’レベル', + 'WBBracketMode' => { + Description => 'ホワイトãƒãƒ©ãƒ³ã‚¹ãƒ–ラケットモード', + PrintConv => { + 'Off' => 'オフ', + 'On (shift AB)' => 'オン(シフトAB)', + 'On (shift GM)' => 'オン(シフトGM)', + }, + }, + 'WBBracketValueAB' => 'ホワイトãƒãƒ©ãƒ³ã‚¹ãƒ–ラケット値AB', + 'WBBracketValueGM' => 'ホワイトãƒãƒ©ãƒ³ã‚¹ãƒ–ラケット値GM', + 'WBFineTuneActive' => { + PrintConv => { + 'No' => 'ã„ã„ãˆ', + 'Yes' => 'ã¯ã„', + }, + }, + 'WBGreenLevel' => 'ホワイトãƒãƒ©ãƒ³ã‚¹ç·‘レベル', + 'WBMediaImageSizeSetting' => { + Description => 'WB/メディア・画åƒã‚µã‚¤ã‚ºã®è¨­å®š', + PrintConv => { + 'LCD monitor' => '液晶モニター', + 'Rear LCD panel' => '背é¢è¡¨ç¤ºãƒ‘ãƒãƒ«', + }, + }, + 'WBMode' => { + Description => 'ホワイトãƒãƒ©ãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰', + PrintConv => { + 'Auto' => 'オート', + }, + }, + 'WBRedLevel' => 'ホワイトãƒãƒ©ãƒ³ã‚¹èµ¤ãƒ¬ãƒ™ãƒ«', + 'WBShiftAB' => 'WB AB補正', + 'WBShiftGM' => 'WB GM補正', + 'WB_GBRGLevels' => 'WB GBRG レベル', + 'WB_GRBGLevels' => 'WB GRBG レベル', + 'WB_GRGBLevels' => 'WB GRGB レベル', + 'WB_RBGGLevels' => 'WB RBGG レベル', + 'WB_RBLevels' => 'WB RBレベル', + 'WB_RBLevels3000K' => 'WB RGGB3000Kレベル', + 'WB_RBLevels3300K' => 'WB RGGB3300Kレベル', + 'WB_RBLevels3600K' => 'WB RGGB3600Kレベル', + 'WB_RBLevels3900K' => 'WB RGGB3800Kレベル', + 'WB_RBLevels4000K' => 'WB RGGB4000Kレベル', + 'WB_RBLevels4300K' => 'WB RGGB4300Kレベル', + 'WB_RBLevels4500K' => 'WB RGGB4500Kレベル', + 'WB_RBLevels4800K' => 'WB RGGB4800Kレベル', + 'WB_RBLevels5300K' => 'WB RGGB5300Kレベル', + 'WB_RBLevels6000K' => 'WB RGGB6000Kレベル', + 'WB_RBLevels6600K' => 'WB RGGB6600Kレベル', + 'WB_RBLevels7500K' => 'WB RGGB7500Kレベル', + 'WB_RBLevelsAuto' => 'WB RB レベル オート', + 'WB_RBLevelsCloudy' => 'WB RB レベル 曇天', + 'WB_RBLevelsCoolWhiteFluor' => 'WB RB レベル 冷白è›å…‰ç¯', + 'WB_RBLevelsDayWhiteFluor' => 'WB RB レベル 昼白è›å…‰ç¯', + 'WB_RBLevelsDaylightFluor' => 'WB RB レベル 昼光è›å…‰ç¯', + 'WB_RBLevelsEveningSunlight' => 'WB RB レベル 夕日', + 'WB_RBLevelsFineWeather' => 'WB RB レベル 晴天', + 'WB_RBLevelsShade' => 'WB RB レベル 日陰', + 'WB_RBLevelsTungsten' => 'WB RB レベル 白熱ç¯', + 'WB_RBLevelsUsed' => 'WB RB レベル使用', + 'WB_RBLevelsWhiteFluorescent' => 'WB RB レベル 白è›å…‰ç¯', + 'WB_RGBGLevels' => 'WB RGBG レベル', + 'WB_RGBLevels' => 'WB RGB レベル', + 'WB_RGBLevelsCloudy' => 'WB RGB レベル 曇天', + 'WB_RGBLevelsDaylight' => 'WB RGB レベル 昼光', + 'WB_RGBLevelsFlash' => 'WB RGB レベル ストロボ', + 'WB_RGBLevelsFluorescent' => 'WB RGGB レベル è›å…‰ç¯', + 'WB_RGBLevelsShade' => 'WB RGB レベル 日陰', + 'WB_RGBLevelsTungsten' => 'WB RGB レベル 白熱ç¯', + 'WB_RGGBLevels' => 'WB RGGB レベル', + 'WB_RGGBLevelsCloudy' => 'WB RGGB レベル 曇天', + 'WB_RGGBLevelsDaylight' => 'WB RGGB レベル 昼光', + 'WB_RGGBLevelsFlash' => 'WB RGGB レベル ストロボ', + 'WB_RGGBLevelsFluorescent' => 'WB RGGB レベル è›å…‰ç¯', + 'WB_RGGBLevelsFluorescentD' => 'WB RGGB レベル è›å…‰ç¯(D)', + 'WB_RGGBLevelsFluorescentN' => 'WB RGGB レベル è›å…‰ç¯(N)', + 'WB_RGGBLevelsFluorescentW' => 'WB RGGB レベル è›å…‰ç¯(W)', + 'WB_RGGBLevelsShade' => 'WB RGGB レベル 日陰', + 'WB_RGGBLevelsTungsten' => 'WB RGGB レベル 白熱ç¯', + 'WCSProfiles' => 'Windowsカラーシステムプロフィール', + 'WhiteBalance' => { + Description => 'ホワイトãƒãƒ©ãƒ³ã‚¹', + PrintConv => { + 'Auto' => 'オート', + 'Black & White' => '白黒', + 'Cloudy' => '曇り', + 'Color Temperature/Color Filter' => '色温度マニュアル指定', + 'Cool White Fluorescent' => '白色è›å…‰ç¯', + 'Custom' => 'カスタム', + 'Custom 1' => 'カスタム1', + 'Custom 2' => 'カスタム2', + 'Custom 3' => 'カスタム3', + 'Custom 4' => 'カスタム4', + 'Custom2' => 'カスタム2', + 'Custom3' => 'カスタム3', + 'Custom4' => 'カスタム4', + 'Custom5' => 'カスタム5', + 'Day White Fluorescent' => '昼白色è›å…‰ç¯', + 'Daylight' => '昼光', + 'Daylight Fluorescent' => '昼光色è›å…‰ç¯', + 'Flash' => 'ストロボ', + 'Fluorescent' => 'è›å…‰ç¯', + 'Incandescent' => 'é›»çƒ', + 'Kelvin' => 'ケルビン', + 'Living Room Warm White Fluorescent' => 'リビング暖白光色è›å…‰ç¯', + 'Manual' => 'マニュアル', + 'Manual Temperature (Kelvin)' => 'マニュアル白熱ç¯ï¼ˆã‚±ãƒ«ãƒ“ン)', + 'PC Set1' => 'PC設定1', + 'PC Set2' => 'PC設定2', + 'PC Set3' => 'PC設定3', + 'PC Set4' => 'PC設定4', + 'PC Set5' => 'PC設定5', + 'Shade' => '日陰', + 'Tungsten' => 'タングステン(白熱ç¯)', + 'Underwater' => '水中', + 'Unknown' => 'ä¸æ˜Ž', + 'User-Selected' => 'ユーザé¸æŠž', + 'Warm White Fluorescent' => '暖白光色è›å…‰ç¯', + 'White Fluorescent' => '温白色è›å…‰ç¯', + }, + }, + 'WhiteBalance2' => { + Description => 'ホワイトãƒãƒ©ãƒ³ã‚¹2', + PrintConv => { + '3000K (Tungsten light)' => '3000K (白熱電çƒ)', + '3600K (Tungsten light-like)' => '3600K (白熱電çƒ-like)', + '4000K (Cool white fluorescent)' => '4000K (è›å…‰ç¯ï¼‘)', + '4500K (Neutral white fluorescent)' => '4500K (è›å…‰ç¯ï¼’)', + '5300K (Fine Weather)' => '5300K (晴天)', + '6000K (Cloudy)' => '6000K (曇り)', + '6600K (Daylight fluorescent)' => '6600K (è›å…‰ç¯ï¼“)', + '7500K (Fine Weather with Shade)' => '7500K (晴天ã¨å½±)', + 'Auto' => 'オート', + 'Custom WB 1' => 'カスタムホワイトãƒãƒ©ãƒ³ã‚¹1', + 'Custom WB 2' => 'カスタムホワイトãƒãƒ©ãƒ³ã‚¹2', + 'Custom WB 2900K' => 'カスタムホワイトãƒãƒ©ãƒ³ã‚¹2900K', + 'Custom WB 3' => 'カスタムホワイトãƒãƒ©ãƒ³ã‚¹3', + 'Custom WB 4' => 'カスタムホワイトãƒãƒ©ãƒ³ã‚¹4', + 'Custom WB 5400K' => 'カスタムホワイトãƒãƒ©ãƒ³ã‚¹5400K', + 'Custom WB 8000K' => 'カスタムホワイトãƒãƒ©ãƒ³ã‚¹8000K', + 'One Touch WB 1' => 'カスタムホワイトãƒãƒ©ãƒ³ã‚¹1', + 'One Touch WB 2' => 'カスタムホワイトãƒãƒ©ãƒ³ã‚¹2', + 'One Touch WB 3' => 'カスタムホワイトãƒãƒ©ãƒ³ã‚¹3', + 'One Touch WB 4' => 'カスタムホワイトãƒãƒ©ãƒ³ã‚¹4', + }, + }, + 'WhiteBalanceAdj' => { + Description => 'ホワイトãƒãƒ©ãƒ³ã‚¹èª¿æ•´', + PrintConv => { + 'Auto' => 'オート', + 'Cloudy' => '曇り', + 'Daylight' => '昼光', + 'Flash' => 'ストロボ', + 'Fluorescent' => 'è›å…‰ç¯', + 'Off' => 'オフ', + 'On' => 'オン', + 'Shade' => '日陰', + 'Tungsten' => 'タングステン(白熱ç¯)', + }, + }, + 'WhiteBalanceBias' => 'ホワイトãƒãƒ©ãƒ³ã‚¹ãƒã‚¤ã‚¢ã‚¹', + 'WhiteBalanceBracket' => 'ホワイトãƒãƒ©ãƒ³ã‚¹ãƒ–ラケット', + 'WhiteBalanceComp' => 'ホワイトãƒãƒ©ãƒ³ã‚¹è£œæ­£', + 'WhiteBalanceFineTune' => 'ホワイトãƒãƒ©ãƒ³ã‚¹ãƒ•ã‚¡ã‚¤ãƒ³ãƒãƒ¥ãƒ¼ãƒ³', + 'WhiteBalanceMode' => { + Description => 'ホワイトãƒãƒ©ãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰', + PrintConv => { + 'Auto (Cloudy)' => 'オート(曇天)', + 'Auto (Day White Fluorescent)' => 'オート(昼白色è›å…‰ç¯ï¼‰', + 'Auto (Daylight Fluorescent)' => 'オート(昼光色è›å…‰ç¯ï¼‰', + 'Auto (Daylight)' => 'オート(昼光)', + 'Auto (Flash)' => 'オート(ストロボ)', + 'Auto (Shade)' => 'オート(日陰)', + 'Auto (Tungsten)' => 'オート(白熱ç¯ï¼‰', + 'Auto (White Fluorescent)' => 'オート(白色è›å…‰ç¯ï¼‰', + 'Unknown' => 'ä¸æ˜Ž', + 'User-Selected' => 'ユーザーé¸æŠž', + }, + }, + 'WhiteBalanceSet' => { + Description => 'ホワイトãƒãƒ©ãƒ³ã‚¹è¨­å®š', + PrintConv => { + 'Auto' => 'オート', + 'Cloudy' => '曇り', + 'Day White Fluorescent' => '昼白色è›å…‰ç¯', + 'Daylight' => '昼光', + 'Daylight Fluorescent' => '昼光色è›å…‰ç¯', + 'Flash' => 'ストロボ', + 'Manual' => 'マニュアル', + 'Set Color Temperature 1' => '色温度設定1', + 'Set Color Temperature 2' => '色温度設定2', + 'Set Color Temperature 3' => '色温度設定3', + 'Shade' => '日陰', + 'Tungsten' => 'タングステン(白熱ç¯)', + 'White Fluorescent' => '温白色è›å…‰ç¯', + }, + }, + 'WhiteBalanceTemperature' => 'ホワイトãƒãƒ©ãƒ³ã‚¹æ¸©åº¦', + 'WhiteBoard' => 'ホワイトボード', + 'WhiteLevel' => '白レベル', + 'WhitePoint' => '白点色度', + 'Wide' => 'ワイド', + 'WideFocusZone' => 'ワイドフォーカスゾーン', + 'WideRange' => { + Description => 'ワイドレンジ', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'WidthResolution' => 'å¹…æ–¹å‘ã®ç”»åƒè§£åƒåº¦', + 'WorldTime' => 'タイムゾーン', + 'WorldTimeLocation' => { + Description => 'ワールドタイムä½ç½®', + PrintConv => { + 'Destination' => '目的地', + 'Home' => '自宅', + 'Hometown' => 'ç¾åœ¨åœ°', + }, + }, + 'Writer-Editor' => '表題/説明ã®ä½œå®¶', + 'X3FillLight' => 'X3光を満ãŸã™', + 'XClipPathUnits' => 'Xクリップパスå˜ä½', + 'XMP' => 'XMPメタデータ', + 'XPAuthor' => '作者', + 'XPComment' => 'コメント', + 'XPKeywords' => 'キーワード', + 'XPSubject' => 'サブジェクト', + 'XPTitle' => 'タイトル', + 'XPosition' => 'Xä½ç½®', + 'XResolution' => 'ç”»åƒå¹…ã®è§£åƒåº¦', + 'YCbCrCoefficients' => 'カラースペース変化マトリックス係数', + 'YCbCrPositioning' => { + Description => 'Yã¨Cã®ä½ç½®', + PrintConv => { + 'Centered' => '中央', + 'Co-sited' => '相互é…ç½®', + }, + }, + 'YCbCrSubSampling' => 'Yã¨Cã®ã‚µãƒ–サンプリング比率', + 'YClipPathUnits' => 'Yクリップパスå˜ä½', + 'YPosition' => 'Yä½ç½®', + 'YResolution' => 'ç”»åƒé«˜ã•ã®è§£åƒåº¦', + 'ZoneMatching' => { + Description => 'ゾーンマッãƒãƒ³ã‚°', + PrintConv => { + 'High Key' => 'ãƒã‚¤ã‚­ãƒ¼', + 'ISO Setting Used' => 'オフ(ISO設定使用)', + 'Low Key' => 'ローキー', + }, + }, + 'ZoneMatchingOn' => { + Description => 'ゾーンマッãƒãƒ³ã‚°', + PrintConv => { + 'Off' => 'オフ', + 'On' => 'オン', + }, + }, + 'Zoom' => 'ズーム', + 'ZoomSourceWidth' => 'ズームソース幅', + 'ZoomStepCount' => 'ズームステップ数', + 'ZoomTargetWidth' => 'ズームターゲット幅', +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::ja.pm - ExifTool Japanese language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke and Kazunari Nishina for providing this translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/ko.pm b/lib/Image/ExifTool/Lang/ko.pm new file mode 100644 index 0000000..e53aca7 --- /dev/null +++ b/lib/Image/ExifTool/Lang/ko.pm @@ -0,0 +1,2333 @@ +#------------------------------------------------------------------------------ +# File: ko.pm +# +# Description: ExifTool Korean language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::ko; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.07'; + +%Image::ExifTool::Lang::ko::Translate = ( + 'AELock' => { + Description => 'AE ê³ ì •', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'AELockButton' => { + Description => 'AE-L/AF-L', + PrintConv => { + 'AE Lock (hold)' => 'AE ê³ ì •(유지)', + 'AE Lock Only' => 'AE ê³ ì •', + 'AE/AF Lock' => 'AE/AF ê³ ì •', + 'AF Lock Only' => 'AF ê³ ì •', + }, + }, + 'AF-CPrioritySelection' => { + Description => 'AF-C ì„ íƒ ìš°ì„ ', + PrintConv => { + 'Focus' => 'í¬ì»¤ìŠ¤', + 'Release' => '릴리즈', + 'Release + Focus' => '릴리즈 + í¬ì»¤ìŠ¤', + }, + }, + 'AF-OnForMB-D10' => { + Description => 'MB-D10ì—ì„œ AF-On', + PrintConv => { + 'AE Lock (hold)' => 'AE ê³ ì • (유지)', + 'AE Lock (reset on release)' => 'AE ê³ ì • (릴리즈때 리셋)', + 'AE Lock Only' => 'AE ê³ ì •', + 'AE/AF Lock' => 'AE/AF ê³ ì •', + 'AF Lock Only' => 'AF ê³ ì •', + 'AF-On' => 'AF-ON', + 'Same as FUNC Button' => 'FUNC 버튼과 ê°™ìŒ', + }, + }, + 'AF-SPrioritySelection' => { + Description => 'AF-S ì„ íƒ ìš°ì„ ', + PrintConv => { + 'Focus' => 'í¬ì»¤ìŠ¤', + 'Release' => '릴리즈', + }, + }, + 'AFActivation' => { + Description => 'AF ìž‘ë™', + PrintConv => { + 'AF-On Only' => 'AF-ON ê³ ì •', + 'Shutter/AF-On' => '셔터/AF-ON', + }, + }, + 'AFAperture' => 'AF 조리개', + 'AFAreaIllumination' => { + Description => 'AF í¬ì¸íŠ¸ 조명', + PrintConv => { + 'Auto' => 'ìžë™', + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'AFAreaMode' => { + Description => 'AF ì˜ì—­ 모드', + PrintConv => { + 'Auto-area' => 'ìžë™ ì˜ì—­ AF', + 'Dynamic Area' => '다ì´ë‚´ë¯¹ ì˜ì—­', + 'Dynamic Area (closest subject)' => '다ì´ë‚´ë¯¹ ì˜ì—­ (지근거리 ìš°ì„ )', + 'Dynamic Area (wide)' => '다ì´ë‚´ë¯¹ ì˜ì—­ (와ì´ë“œ)', + 'Group Dynamic' => '그룹 다ì´ë‚´ë¯¹', + 'Single Area' => '싱글 ì˜ì—­', + 'Single Area (wide)' => '싱글 ì˜ì—­ (와ì´ë“œ)', + }, + }, + 'AFAreaModeSetting' => { + Description => 'AF ì˜ì—­ 모드', + PrintConv => { + 'Closest Subject' => '접사', + 'Dynamic Area' => '다ì´ë‚´ë¯¹ ì˜ì—­', + 'Single Area' => '싱글 ì˜ì—­', + }, + }, + 'AFAssist' => { + Description => '내장 AF ë³´ì¡°ê´‘', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'AFFineTune' => 'AF 미세 ì¡°ì •', + 'AFFineTuneAdj' => 'AF 미세 ì¡°ì •', + 'AFInfo' => 'AF 모드', + 'AFInfo2' => 'AF ì •ë³´', + 'AFInfo2Version' => 'AF ì •ë³´ 버전', + 'AFMode' => 'AF 모드', + 'AFPoint' => { + Description => 'AF í¬ì¸íŠ¸', + PrintConv => { + 'Bottom' => '하단', + 'Center' => '중앙', + 'Far Left' => '맨 좌측', + 'Far Right' => '맨 우측', + 'Left' => '왼쪽', + 'Lower-left' => '좌하단', + 'Lower-right' => '우하단', + 'Mid-left' => '왼쪽', + 'Mid-right' => '오른쪽', + 'Right' => '오른쪽', + 'Top' => 'ìƒë‹¨', + 'Upper-left' => '좌ìƒë‹¨', + 'Upper-right' => 'ìš°ìƒë‹¨', + }, + }, + 'AFPointIllumination' => { + Description => 'AF í¬ì¸íŠ¸ 조명', + PrintConv => { + 'Auto' => 'ìžë™', + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'AFPointMode' => { + PrintConv => { + 'Auto' => 'ìžë™', + }, + }, + 'AFPointSelected' => { + PrintConv => { + 'Auto' => 'ìžë™', + }, + }, + 'AFPointSelected2' => { + PrintConv => { + 'Auto' => 'ìžë™', + }, + }, + 'AFPointSelection' => { + Description => 'AF í¬ì¸íŠ¸ ì„ íƒ', + PrintConv => { + '11 Points' => '11 í¬ì¸íŠ¸', + '51 Points' => '51 í¬ì¸íŠ¸', + }, + }, + 'AFPointsInFocus' => { + Description => 'ì´ˆì ì—ì„œì˜ AF í¬ì¸íŠ¸', + PrintConv => { + 'Far Left' => '맨 좌측', + 'Far Right' => '맨 우측', + 'Lower-left' => '좌하단', + 'Lower-right' => '우하단', + 'Upper-left' => '좌ìƒë‹¨', + 'Upper-right' => 'ìš°ìƒë‹¨', + }, + }, + 'AFPointsUnknown2' => { + PrintConv => { + 'Auto' => 'ìžë™', + }, + }, + 'AFPointsUsed' => { + Description => 'ì‚¬ìš©ëœ AF í¬ì¸íŠ¸', + PrintConv => { + 'Bottom' => '하단', + 'Center' => '중앙', + 'Far Left' => '맨 좌측', + 'Far Right' => '맨 우측', + 'Lower-left' => '좌하단', + 'Lower-right' => '우하단', + 'Top' => 'ìƒë‹¨', + 'Upper-left' => '좌ìƒë‹¨', + 'Upper-right' => 'ìš°ìƒë‹¨', + }, + }, + 'AFResponse' => 'AF ë°˜ì‘', + 'ActiveD-Lighting' => { + Description => '액티브 D-Lighting', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ActiveD-LightingMode' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'AddAspectRatioInfo' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'AddOriginalDecisionData' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'AdvancedRaw' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'Album' => '앨범', + 'Anti-Blur' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'Aperture' => '조리개', + 'ApertureValue' => '조리개', + 'ApplicationRecordVersion' => '어플리케ì´ì…˜ ê¸°ë¡ ë²„ì „', + 'Artist' => 'ì´ë¯¸ì§€ë¥¼ 만든 사람', + 'Author' => '작성ìž', + 'AuthorsPosition' => 'ì§ì±…', + 'AutoAperture' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'AutoBracketModeM' => { + Description => 'ìžë™ 브ë¼ì¼€íŒ… (모드 M)', + PrintConv => { + 'Flash Only' => '플래시', + 'Flash/Aperture' => '플래시/조리개', + 'Flash/Speed' => '플래시/스피드', + 'Flash/Speed/Aperture' => '플래시/스피드/조리개', + }, + }, + 'AutoBracketOrder' => '브ë¼ì¼€íŒ… 순서', + 'AutoBracketSet' => { + Description => 'ìžë™ 브ë¼ì¼€íŒ… 설정', + PrintConv => { + 'AE & Flash' => 'AE & 플래시', + 'AE Only' => 'AE 브ë¼ì¼€íŒ…', + 'Flash Only' => '플래시 브ë¼ì¼€íŒ…', + 'WB Bracketing' => 'WB 브ë¼ì¼€íŒ…', + }, + }, + 'AutoBracketing' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'AutoBracketingSet' => 'ìžë™ 브ë¼ì¼€íŒ… 설정', + 'AutoExposureBracketing' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'AutoFP' => { + Description => 'ìžë™ FP', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'AutoFocus' => { + Description => '오토í¬ì»¤ìŠ¤', + PrintConv => { + 'Off' => '비활성', + 'On' => '활성', + }, + }, + 'AutoISO' => { + Description => 'ìžë™ ISO', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'AutoISOMax' => 'ìžë™ ISO 최대 ê°ë„', + 'AutoISOMinShutterSpeed' => 'ìžë™ ISO 최소 셔터 ì†ë„', + 'AutoLightingOptimizer' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'AutoRedEye' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'AuxiliaryLens' => 'ë³´ì¡° 렌즈', + 'BWMode' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'BatteryLevel' => '베터리 레벨', + 'BatteryOrder' => { + Description => '배터리 순서', + PrintConv => { + 'Camera Battery First' => 'ì¹´ë©”ë¼ ë°°í„°ë¦¬ ìš°ì„ ', + 'MB-D10 First' => 'MB-D10 배터리 ìš°ì„ ', + }, + }, + 'Beep' => { + Description => 'ì „ìžìŒ', + PrintConv => { + 'High' => 'í¬ê²Œ', + 'Low' => '작게', + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'BitsPerSample' => 'ì„±ë¶„ì— ë”°ë¥¸ 비트 수', + 'BracketMode' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'Brightness' => 'ë°ê¸°', + 'BrightnessValue' => 'ë°ê¸°', + 'BurstMode' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'By-line' => '제작ìž', + 'CFAPattern' => 'CFA 패턴', + 'CLModeShootingSpeed' => 'CL 모드 ì´¬ì˜ ì†ë„', + 'CalibrationIlluminant1' => { + PrintConv => { + 'Cloudy' => 'í린 날씨', + 'Cool White Fluorescent' => '냉백색 형광등 (W 3800 - 4500K)', + 'Day White Fluorescent' => '주백색 형광등 (N 4600 - 5500K)', + 'Daylight' => '주광', + 'Daylight Fluorescent' => '주광색 형광등 (D 5700 - 7100K)', + 'Fine Weather' => 'ë§‘ì€ ë‚ ì”¨', + 'Flash' => '플래시', + 'Fluorescent' => '형광등', + 'ISO Studio Tungsten' => 'ISO 스튜디오 텅스í…', + 'Other' => '기타 ê´‘ì›', + 'Shade' => '그늘', + 'Standard Light A' => '표준 ê´‘ì› A', + 'Standard Light B' => '표준 ê´‘ì› B', + 'Standard Light C' => '표준 ê´‘ì› C', + 'Tungsten (Incandescent)' => 'í……ìŠ¤í… (백열등)', + 'Unknown' => 'ì•Œ 수 ì—†ìŒ', + 'Warm White Fluorescent' => '따뜻한 í°ìƒ‰ 형광 (L 2600 - 3250K)', + 'White Fluorescent' => '백색 형광등 (WW 3250 - 3800K)', + }, + }, + 'CalibrationIlluminant2' => { + PrintConv => { + 'Cloudy' => 'í린 날씨', + 'Cool White Fluorescent' => '냉백색 형광등 (W 3800 - 4500K)', + 'Day White Fluorescent' => '주백색 형광등 (N 4600 - 5500K)', + 'Daylight' => '주광', + 'Daylight Fluorescent' => '주광색 형광등 (D 5700 - 7100K)', + 'Fine Weather' => 'ë§‘ì€ ë‚ ì”¨', + 'Flash' => '플래시', + 'Fluorescent' => '형광등', + 'ISO Studio Tungsten' => 'ISO 스튜디오 텅스í…', + 'Other' => '기타 ê´‘ì›', + 'Shade' => '그늘', + 'Standard Light A' => '표준 ê´‘ì› A', + 'Standard Light B' => '표준 ê´‘ì› B', + 'Standard Light C' => '표준 ê´‘ì› C', + 'Tungsten (Incandescent)' => 'í……ìŠ¤í… (백열등)', + 'Unknown' => 'ì•Œ 수 ì—†ìŒ', + 'Warm White Fluorescent' => '따뜻한 í°ìƒ‰ 형광 (L 2600 - 3250K)', + 'White Fluorescent' => '백색 형광등 (WW 3250 - 3800K)', + }, + }, + 'CanonExposureMode' => { + PrintConv => { + 'Manual' => '수ë™', + }, + }, + 'CanonFlashMode' => { + PrintConv => { + 'Auto' => 'ìžë™', + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'Caption-Abstract' => '제목/설명', + 'CaptionWriter' => '캡션 작성ìž', + 'Categories' => '범주', + 'Category' => '범주', + 'CenterAFArea' => { + Description => '중앙 ì´ˆì  ì˜ì—­', + PrintConv => { + 'Normal Zone' => 'ì¼ë°˜ ì˜ì—­', + 'Wide Zone' => '와ì´ë“œ ì˜ì—­', + }, + }, + 'CenterWeightedAreaSize' => '중앙 ì¤‘ì  ì˜ì—­', + 'ChrominanceNR_TIFF_JPEG' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'ChrominanceNoiseReduction' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'City' => 'ë„ì‹œ', + 'CodedCharacterSet' => 'ì½”ë“œëœ ìºë¦­í„° 세트', + 'ColorAberrationControl' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ColorBalance' => '컬러 밸런스', + 'ColorBalanceAdj' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ColorBalanceVersion' => '컬러 밸런스 버전', + 'ColorBooster' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ColorEffect' => { + PrintConv => { + 'Off' => '꺼ì§', + 'Sepia' => '세피아', + }, + }, + 'ColorFilter' => { + Description => '색 í•„í„°', + PrintConv => { + 'Green' => '녹색', + 'Off' => '꺼ì§', + 'Red' => '빨강', + 'Yellow' => '노랑', + }, + }, + 'ColorHue' => 'ìƒ‰ìƒ í˜•ì‹', + 'ColorMode' => { + Description => '컬러 모드', + PrintConv => { + 'Autumn Leaves' => '단í’', + 'B&W' => 'í‘ë°±', + 'Clear' => '반투명', + 'Deep' => '진한', + 'Landscape' => 'í’ê²½', + 'Light' => 'ë¼ì´íŠ¸', + 'Neutral' => '뉴트럴', + 'Night View' => '야경', + 'Night View/Portrait' => '야경 ì¸ë¬¼', + 'Off' => '꺼ì§', + 'Portrait' => 'ì¸ë¬¼', + 'Standard' => '표준', + 'Sunset' => 'ì¼ëª°', + 'Vivid' => 'ìƒìƒí•œ', + }, + }, + 'ColorMoireReduction' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ColorMoireReductionMode' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'ColorSpace' => { + Description => '색공간', + PrintConv => { + 'ICC Profile' => 'ICC 프로필', + 'Uncalibrated' => 'ì¡°ì •ë˜ì§€ ì•ŠìŒ', + }, + }, + 'ColorTemperature' => '색 온ë„', + 'CommandDials' => { + Description => '커맨드 다ì´ì–¼', + PrintConv => { + 'Reversed (Main Aperture, Sub Shutter)' => 'ì—­ë°©í–¥', + 'Standard (Main Shutter, Sub Aperture)' => '기본', + }, + }, + 'CommandDialsApertureSetting' => { + Description => '커맨드 다ì´ì–¼ 수정 조리개 설정', + PrintConv => { + 'Aperture Ring' => '조리개 ë§', + 'Sub-command Dial' => '서브 커맨드 다ì´ì–¼', + }, + }, + 'CommandDialsChangeMainSub' => { + Description => '커맨드 다ì´ì–¼ 수정 매ì¸/서브 êµì²´', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'CommandDialsMenuAndPlayback' => { + Description => '커맨드 다ì´ì–¼ 수정 매뉴와 재ìƒ', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'CommandDialsReverseRotation' => { + Description => '커맨드 다ì´ì–¼ 수정 ë°©í–¥ 전환', + PrintConv => { + 'No' => '아니오', + 'Yes' => '예', + }, + }, + 'CommanderChannel' => '커맨드모드 채ë„', + 'CommanderGroupAManualOutput' => '커맨드모드 그룹 A M Comp', + 'CommanderGroupAMode' => { + Description => '커맨드모드 그룹 A 모드', + PrintConv => { + 'Auto Aperture' => 'ìžë™ 조리개 (AA)', + 'Manual' => '수ë™', + 'Off' => '꺼ì§', + }, + }, + 'CommanderGroupA_TTL-AAComp' => '커맨드모드 그룹 A TTL/AA Comp', + 'CommanderGroupBManualOutput' => '커맨드모드 그룹 B M Comp', + 'CommanderGroupBMode' => { + Description => '커맨드모드 그룹 B 모드', + PrintConv => { + 'Auto Aperture' => 'ìžë™ 조리개 (AA)', + 'Manual' => '수ë™', + 'Off' => '꺼ì§', + }, + }, + 'CommanderGroupB_TTL-AAComp' => '커맨드모드 그룹 B TTL/AA Comp', + 'CommanderInternalFlash' => { + Description => '커맨드모드 내장 플래시 모드', + PrintConv => { + 'Manual' => '수ë™', + 'Off' => '꺼ì§', + }, + }, + 'CommanderInternalManualOutput' => '커맨드모드 내장플래시 M Comp.', + 'CommanderInternalTTLComp' => '커맨드모드 내장플래시 TTL Comp', + 'Comment' => '코멘트', + 'ComponentsConfiguration' => 'ê° êµ¬ì„± ìš”ì†Œì˜ ì˜ë¯¸', + 'CompressedBitsPerPixel' => 'ì´ë¯¸ì§€ 압축 모드', + 'Compression' => { + Description => '압축 설계', + PrintConv => { + 'JPEG' => 'JPEG 압축', + 'JPEG (old-style)' => 'JPEG (예전 스타ì¼)', + 'Kodak DCR Compressed' => 'Kodak DCR 압축', + 'Kodak KDC Compressed' => 'Kodak KDC 압축', + 'Next' => 'NeXT 2-bit ì¸ì½”딩', + 'Nikon NEF Compressed' => 'Nikon NEF 압축', + 'Pentax PEF Compressed' => 'Pentax PEF 압축', + 'SGILog' => 'SGI 32-bit Log íœ˜ë„ ì¸ì½”딩', + 'SGILog24' => 'SGI 24-bit Log íœ˜ë„ ì¸ì½”딩', + 'Sony ARW Compressed' => 'Sony ARW 압축', + 'Thunderscan' => 'ThunderScan 4-bit ì¸ì½”딩', + 'Uncompressed' => '무압축', + }, + }, + 'Contact' => 'ì—°ë½ì²˜', + 'Contrast' => { + Description => '대비', + PrintConv => { + 'High' => '강하게', + 'Low' => '약하게', + 'Normal' => '표준', + }, + }, + 'ContrastCurve' => '대비 커브', + 'ConversionLens' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'Copyright' => '저작권 소유ìž', + 'CopyrightNotice' => '저작권 공고', + 'Country' => '국명', + 'Country-PrimaryLocationName' => 'êµ­ê°€', + 'CreateDate' => '디지털 ë°ì´í„° ìƒì„± ì¼ì‹œ', + 'CreationDate' => 'ì´¬ì˜ ë‚ ì§œ', + 'Credit' => 'ì •ë³´', + 'Curves' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'CustomRendered' => { + Description => 'ì‚¬ìš©ìž ì´ë¯¸ì§€ 처리', + PrintConv => { + 'Custom' => 'ì‚¬ìš©ìž ì²˜ë¦¬', + 'Normal' => '표준 처리', + }, + }, + 'D-LightingHQ' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'D-LightingHS' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'DataDump' => 'ë°ì´í„° ë¤í”„', + 'DateCreated' => '만들어진 날짜', + 'DateDisplayFormat' => { + Description => '날짜 형ì‹', + PrintConv => { + 'D/M/Y' => 'ì¼/ì›”/ë…„', + 'M/D/Y' => 'ì›”/ì¼/ë…„', + 'Y/M/D' => 'ë…„/ì›”/ì¼', + }, + }, + 'DateStampMode' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'DateTimeOriginal' => 'ì›ë³¸ ë°ì´í„° ìƒì„± ì¼ì‹œ', + 'DaylightSavings' => { + Description => 'ì¼ê´‘ 시간 절약', + PrintConv => { + 'No' => '꺼ì§', + 'Yes' => '켜ì§', + }, + }, + 'DeletedImageCount' => 'ì‚­ì œëœ ì´ë¯¸ì§€ 카운트', + 'DeviceSettingDescription' => '장비 설정 설명', + 'DigitalZoom' => { + Description => '디지털 줌', + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'DigitalZoomRatio' => '디지털 줌 비율', + 'Directory' => '파ì¼ìœ„치', + 'DirectoryNumber' => '디렉토리 숫ìž', + 'DistortionCorrection' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'DistortionCorrection2' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'DriveMode' => { + Description => 'ë“œë¼ì´ë¸Œ 모드', + PrintConv => { + 'Multiple Exposure' => '다중 노출', + 'Off' => '꺼ì§', + }, + }, + 'DynamicAFArea' => { + Description => '다ì´ë‚´ë¯¹ AF ì˜ì—­', + PrintConv => { + '21 Points' => '21 í¬ì¸íŠ¸', + '51 Points' => '51 í¬ì¸íŠ¸', + '51 Points (3D-tracking)' => '51í¬ì¸íŠ¸ (3D-트래킹)', + '9 Points' => '9 í¬ì¸íŠ¸', + }, + }, + 'DynamicRangeExpansion' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'DynamicRangeOptimizer' => { + Description => 'D-ë ˆì¸ì§€ 최ì í™”', + PrintConv => { + 'Advanced Auto' => '고급 ìžë™', + 'Advanced Lv1' => '고급 레벨1', + 'Advanced Lv2' => '고급 레벨2', + 'Advanced Lv3' => '고급 레벨3', + 'Advanced Lv4' => '고급 레벨4', + 'Advanced Lv5' => '고급 레벨5', + 'Auto' => 'ìžë™', + 'Off' => '꺼ì§', + 'Standard' => '표준', + }, + }, + 'EVStepSize' => { + Description => '노출 설정 간격', + PrintConv => { + '1/2 EV' => '1/2 스í…', + '1/3 EV' => '1/3 스í…', + }, + }, + 'EasyExposureCompensation' => { + Description => '쉬운 노출 ë³´ì •', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + 'On (auto reset)' => 'ì¼œì§ (ìžë™ 리셋)', + }, + }, + 'EasyMode' => { + PrintConv => { + 'Manual' => '수ë™', + }, + }, + 'EdgeNoiseReduction' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'EffectiveMaxAperture' => '유효 최대 조리개', + 'EnhanceDarkTones' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'Enhancement' => { + PrintConv => { + 'Green' => '녹색', + 'Off' => '꺼ì§', + 'Red' => '빨강', + }, + }, + 'EnvelopeRecordVersion' => '압축 ê¸°ë¡ ë²„ì „', + 'ExifImageHeight' => 'ì´ë¯¸ì§€ 높ì´', + 'ExifImageWidth' => 'ì´ë¯¸ì§€ ë„“ì´', + 'ExifOffset' => 'Exif IFD Pointer', + 'ExifVersion' => 'Exif 버전', + 'ExitPupilPosition' => '출구공 위치', + 'ExposureBracketValue' => '노출 브ë¼ì¼€íŒ… ê°’', + 'ExposureCompStepSize' => '노출보정/미세조정', + 'ExposureCompensation' => '노출 ë³´ì •', + 'ExposureControlStepSize' => '노출 ì¡°ì • EV 스í…', + 'ExposureDelayMode' => { + Description => '노출 대기 모드', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ExposureDifference' => '노출 ë³´ì •', + 'ExposureIndex' => '노출 ì¸ë±ìŠ¤', + 'ExposureMode' => { + Description => '노출 모드', + PrintConv => { + 'Auto' => 'ìžë™ 노출', + 'Auto bracket' => '오토 브ë¼ì¼€ìŠ¤íŒ…', + 'Manual' => 'ìˆ˜ë™ ë…¸ì¶œ', + }, + }, + 'ExposureProgram' => { + Description => '노출 프로그램', + PrintConv => { + 'Action (High speed)' => '스í¬ì¸  모드 (빠른 셔터 ìŠ¤í”¼ë“œì— íŽ¸í–¥ë¨)', + 'Aperture-priority AE' => '조리개 ìš°ì„ ', + 'Bulb' => '벌브', + 'Creative (Slow speed)' => 'ë…ì°½ì  í”„ë¡œê·¸ëž¨ (피사계심ë„ì— íŽ¸í–¥ë¨)', + 'Landscape' => 'í’ê²½ 모드 (ë°°ê²½ì˜ ì¸í¬ì»¤ìŠ¤ê°€ 있는 í’ê²½ 사진)', + 'Manual' => '수ë™', + 'Not Defined' => 'ì •ì˜ë˜ì§€ ì•ŠìŒ', + 'Portrait' => 'ì¸ë¬¼ 모드 (ë°°ê²½ì˜ ì•„ì›ƒí¬ì»¤ìŠ¤ê°€ 있는 근접 사진)', + 'Program AE' => '보통 프로그램', + 'Shutter speed priority AE' => '셔터 ìš°ì„ ', + }, + }, + 'ExposureTime' => '노출 시간', + 'ExtendedWBDetect' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ExternalFlash' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ExternalFlashFlags' => '외장 플래시 플래그', + 'ExternalFlashMode' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'FNumber' => 'F 숫ìž', + 'FaceOrientation' => { + PrintConv => { + 'Horizontal (normal)' => '0° (위쪽/좌측)', + 'Rotate 180' => '180° (아래/우측)', + 'Rotate 270 CW' => '90° 시계방향 (좌측/아래)', + 'Rotate 90 CW' => '90° 반시계방향 (우측/위쪽)', + }, + }, + 'FileFormat' => '형ì‹', + 'FileInfo' => 'íŒŒì¼ ì •ë³´', + 'FileInfoVersion' => 'íŒŒì¼ ì •ë³´ 버전', + 'FileModifyDate' => '갱신 ì¼ìž', + 'FileName' => '파ì¼ëª…', + 'FileNumber' => 'íŒŒì¼ ìˆ«ìž', + 'FileNumberMemory' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'FileNumberSequence' => { + Description => '파ì¼ëª… ì—°ì† ë²ˆí˜¸', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'FileSize' => '파ì¼í¬ê¸°', + 'FileSource' => { + Description => 'íŒŒì¼ ì¶œì²˜', + PrintConv => { + 'Digital Camera' => '디지털 ì¹´ë©”ë¼', + 'Film Scanner' => '필름 스ìºë„ˆ', + 'Reflection Print Scanner' => '반사 프린트 스ìºë„ˆ', + }, + }, + 'FileType' => '파ì¼í˜•ì‹', + 'Filename' => '파ì¼ëª…', + 'FilmType' => '필름 형ì‹', + 'Filter' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'FilterEffect' => { + Description => 'í•„í„° 효과', + PrintConv => { + 'Green' => '녹색', + 'Off' => '꺼ì§', + 'Orange' => '주황', + 'Red' => '빨강', + 'Yellow' => '노랑', + 'n/a' => '설정 안ë¨', + }, + }, + 'FilterEffectMonochrome' => { + PrintConv => { + 'Green' => '녹색', + 'Orange' => '주황', + 'Red' => '빨강', + 'Yellow' => '노랑', + }, + }, + 'FinderDisplayDuringExposure' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'FineTuneOptCenterWeighted' => 'ìµœì  ë…¸ì¶œ ì¡°ì • 중앙 중ì ', + 'FineTuneOptMatrixMetering' => 'ìµœì  ë…¸ì¶œ ì¡°ì • í‰ê°€ 측광', + 'FineTuneOptSpotMetering' => 'ìµœì  ë…¸ì¶œ ì¡°ì • 스팟', + 'Flash' => { + Description => '플래시', + PrintConv => { + 'Auto, Did not fire' => '플래시 발광 안ë¨, ìžë™ëª¨ë“œ', + 'Auto, Did not fire, Red-eye reduction' => 'ìžë™, 발광안ë¨, ì ëª©ê°ì†Œ', + 'Auto, Fired' => '플래시 발광, ìžë™ëª¨ë“œ', + 'Auto, Fired, Red-eye reduction' => '플래시 발광, ìžë™ëª¨ë“œ, ì ëª©ê°ì†Œëª¨ë“œ', + 'Auto, Fired, Red-eye reduction, Return detected' => '플래시 발광, ìžë™ëª¨ë“œ, 복귀광 ê°ì§€ë¨, ì ëª©ê°ì†Œëª¨ë“œ', + 'Auto, Fired, Red-eye reduction, Return not detected' => '플래시 발광, ìžë™ëª¨ë“œ, 복귀광 ê°ì§€ì•ˆë¨, ì ëª©ê°ì†Œëª¨ë“œ', + 'Auto, Fired, Return detected' => '플래시 발광, ìžë™ëª¨ë“œ, 복귀광 ê°ì§€ë¨', + 'Auto, Fired, Return not detected' => '플래시 발광, ìžë™ëª¨ë“œ, 복귀광 ê°ì§€ 안ë¨', + 'Did not fire' => '플래시가 ì ë“±í•˜ì§€ 않았습니다', + 'Fired' => '플래시 발광', + 'Fired, Red-eye reduction' => '플래시 발광, ì ëª©ê°ì†Œëª¨ë“œ', + 'Fired, Red-eye reduction, Return detected' => '플래시 발광, ì ëª©ê°ì†Œëª¨ë“œ, 복귀광 ê°ì§€ë¨', + 'Fired, Red-eye reduction, Return not detected' => '플래시 발광, ì ëª©ê°ì†Œëª¨ë“œ, 복귀광 ê°ì§€ 안ë¨', + 'Fired, Return detected' => '스트로브 복귀광 ê°ì§€ë¨', + 'Fired, Return not detected' => '스트로브 복귀광 ê°ì§€ 안ë¨', + 'No Flash' => '플래시 발광 안ë¨', + 'No flash function' => '플래시 ìž‘ë™ ì—†ìŒ', + 'Off, Did not fire' => '플래시 발광 안ë¨, 강제발광모드', + 'Off, Did not fire, Return not detected' => '꺼ì§, 발광 안ë¨, 복귀광 ê°ì§€ 안ë¨', + 'Off, No flash function' => '꺼ì§, 플래시 ìž‘ë™ ì—†ìŒ', + 'Off, Red-eye reduction' => '꺼ì§, ì ëª©ê°ì†Œ', + 'On, Did not fire' => '켜ì§, 플래시 발광 안ë¨', + 'On, Fired' => '플래시 발광, 강제발광모드', + 'On, Red-eye reduction' => '플래시 발광, 강제발광모드, ì ëª©ê°ì†Œëª¨ë“œ', + 'On, Red-eye reduction, Return detected' => '플래시 발광, 강제발광모드, ì ëª©ê°ì†Œëª¨ë“œ, 복귀광 ê°ì§€ë¨', + 'On, Red-eye reduction, Return not detected' => '플래시 발광, 강제발광모드, ì ëª©ê°ì†Œëª¨ë“œ, 복귀광 ê°ì§€ 안ë¨', + 'On, Return detected' => '플래시 발광, 강제발광모드, 복귀광 ê°ì§€ë¨', + 'On, Return not detected' => '플래시 발광, 강제발광모드, 복귀광 ê°ì§€ 안ë¨', + }, + }, + 'FlashCommanderMode' => { + Description => 'ì»¤ë§¨ë” ëª¨ë“œ', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'FlashCompensation' => '플래시 ë³´ì •', + 'FlashControlMode' => { + Description => '플래시 컨트롤 모드', + PrintConv => { + 'Auto Aperture' => 'ìžë™ 조리개 (AA)', + 'Manual' => '수ë™', + 'Off' => '꺼ì§', + 'Repeating Flash' => '리피팅 플래시', + }, + }, + 'FlashEnergy' => '플래시 ì—너지', + 'FlashExposureBracketValue' => '플래시 노출 브ë¼ì¼€íŒ… ê°’', + 'FlashExposureComp' => '플래시 노출 ë³´ì •', + 'FlashExposureLock' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'FlashFired' => '플래시 발광ë¨', + 'FlashFocalLength' => '플래시 ì´ˆì  ê¸¸ì´', + 'FlashGroupACompensation' => '그룹 A 플래시 ë³´ì •', + 'FlashGroupAControlMode' => { + Description => '그룹 A 플래시 모드', + PrintConv => { + 'Auto Aperture' => 'ìžë™ 조리개 (AA)', + 'Manual' => '수ë™', + 'Off' => '꺼ì§', + 'Repeating Flash' => '리피팅 플래시', + }, + }, + 'FlashGroupAOutput' => '그룹 A 플래시 출력', + 'FlashGroupBCompensation' => '그룹 B 플래시 ë³´ì •', + 'FlashGroupBControlMode' => { + Description => '그룹 B 플래시 모드', + PrintConv => { + 'Auto Aperture' => 'ìžë™ 조리개 (AA)', + 'Manual' => '수ë™', + 'Off' => '꺼ì§', + 'Repeating Flash' => '리피팅 플래시', + }, + }, + 'FlashGroupBOutput' => '그룹 B 플래시 출력', + 'FlashGroupCCompensation' => '그룹 C 플래시 ë³´ì •', + 'FlashGroupCControlMode' => { + Description => '그룹 C 플래시 컨트롤 모드', + PrintConv => { + 'Auto Aperture' => 'ìžë™ 조리개 (AA)', + 'Manual' => '수ë™', + 'Off' => '꺼ì§', + 'Repeating Flash' => '리피팅 플래시', + }, + }, + 'FlashGroupCOutput' => '그룹 C 플래시 출력', + 'FlashInfoVersion' => '플래시 ì •ë³´ 버전', + 'FlashLevel' => '플래시 ë³´ì •', + 'FlashMode' => { + Description => '플래시 모드', + PrintConv => { + 'Did Not Fire' => '발광 안ë¨', + 'Fired, Commander Mode' => '발광ë¨, ì»¤ë§¨ë” ëª¨ë“œ', + 'Fired, External' => '발광ë¨, 외장', + 'Fired, Manual' => '발광ë¨, 수ë™', + 'Fired, TTL Mode' => '발광ë¨, TTL 모드', + }, + }, + 'FlashModel' => '플래시 모ë¸', + 'FlashOptions' => { + PrintConv => { + 'Auto' => 'ìžë™', + }, + }, + 'FlashOptions2' => { + PrintConv => { + 'Auto' => 'ìžë™', + }, + }, + 'FlashOutput' => '플래시 출력', + 'FlashSetting' => '플래시 설정', + 'FlashShutterSpeed' => '플래시 셔터 스피드', + 'FlashStatus' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'FlashSyncSpeed' => '플래시 ë™ì¡° ì†ë„', + 'FlashSyncSpeedAv' => { + PrintConv => { + 'Auto' => 'ìžë™', + }, + }, + 'FlashType' => '플래시 형ì‹', + 'FlashWarning' => { + Description => '플래시 경고', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'FlashpixVersion' => '지ì›ë˜ëŠ” Flashpix 버전', + 'FocalLength' => 'ì´ˆì  ê¸¸ì´', + 'FocalLength35efl' => 'ì´ˆì ê±°ë¦¬ (35mm 변환)', + 'FocalLengthIn35mmFormat' => '35 mm 필름 환산 ì´ˆì ê¸¸ì´', + 'FocalPlaneResolutionUnit' => { + Description => 'ì´ˆì ë©´ í•´ìƒë„ 단위', + PrintConv => { + 'None' => 'ì—†ìŒ', + 'inches' => 'ì¸ì¹˜', + 'um' => 'µm (마ì´í¬ë¡œë¯¸í„°)', + }, + }, + 'FocalPlaneXResolution' => 'ìˆ˜í‰ í•´ìƒë„ ì´ˆì ë©´', + 'FocalPlaneYResolution' => 'ìˆ˜ì§ í•´ìƒë„ ì´ˆì ë©´', + 'Focus' => { + Description => 'í¬ì»¤ìŠ¤', + PrintConv => { + 'Manual' => '수ë™', + }, + }, + 'FocusArea' => 'AF í¬ì¸íŠ¸ 순환', + 'FocusAreaSelection' => { + Description => 'AF í¬ì¸íŠ¸ 순환', + PrintConv => { + 'No Wrap' => '꺼ì§', + 'Wrap' => '켜ì§', + }, + }, + 'FocusContinuous' => { + PrintConv => { + 'Manual' => '수ë™', + }, + }, + 'FocusDistance' => 'ì´ˆì  ê±°ë¦¬', + 'FocusMode' => { + Description => 'ì´ˆì ëª¨ë“œ', + PrintConv => { + 'Manual' => '수ë™', + }, + }, + 'FocusMode2' => { + PrintConv => { + 'Manual' => '수ë™', + }, + }, + 'FocusModeSetting' => { + Description => 'ì´ˆì  ëª¨ë“œ', + PrintConv => { + 'AF-A' => 'ìžë™ AF 서보', + 'AF-C' => '컨티뉴어스 AF 서보', + 'AF-S' => '싱글 AF 서보', + 'Manual' => '수ë™', + }, + }, + 'FocusPointWrap' => { + Description => 'ì´ˆì  í¬ì¸íŠ¸ 순환', + PrintConv => { + 'No Wrap' => '순환 안함', + 'Wrap' => '순환', + }, + }, + 'FocusPosition' => 'ì´ˆì  ìœ„ì¹˜', + 'FocusRange' => { + PrintConv => { + 'Auto' => 'ìžë™', + 'Manual' => '수ë™', + }, + }, + 'FocusTrackingLockOn' => { + Description => 'ì´ˆì  íŠ¸ëž˜í‚¹ Lock-On', + PrintConv => { + 'Long' => '길게', + 'Normal' => '표준', + 'Off' => '꺼ì§', + 'Short' => '짧게', + }, + }, + 'FrameRate' => '프레임 비율', + 'FrameSize' => '프레임 í¬ê¸°', + 'FujiFlashMode' => { + PrintConv => { + 'Auto' => 'ìžë™', + }, + }, + 'FunctionButton' => { + Description => '펑션 버튼', + PrintConv => { + 'AF-area Mode' => 'AF ì˜ì—­ 모드 설정', + 'Center AF Area' => '중앙 ì´ˆì  ì˜ì—­', + 'Center-weighted' => '중앙부 ì¤‘ì  ì¸¡ê´‘', + 'FV Lock' => 'FV ê³ ì •', + 'Flash Off' => '플래시 OFF', + 'Framing Grid' => '격ìžì„  표시', + 'ISO Display' => 'ISO 표시', + 'Matrix Metering' => '멀티 패턴 측광', + 'Spot Metering' => '스팟 측광', + }, + }, + 'GPSAltitude' => 'ê³ ë„', + 'GPSAltitudeRef' => { + Description => 'ê³ ë„ ì°¸ì¡°', + PrintConv => { + 'Above Sea Level' => 'í•´ë©´', + 'Below Sea Level' => 'í•´ë©´ 참조(ìŒìˆ˜ ê°’)', + }, + }, + 'GPSAreaInformation' => 'GPS ì˜ì—­ ì´ë¦„', + 'GPSDOP' => '측정 ì •ë°€ë„', + 'GPSDateStamp' => 'GPS 날짜', + 'GPSDestBearing' => '목ì ì§€ì˜ 방위', + 'GPSDestBearingRef' => '목ì ì§€ ë°©ìœ„ì˜ ê¸°ì¤€', + 'GPSDestDistance' => '목ì ì§€ê¹Œì§€ì˜ 거리', + 'GPSDestDistanceRef' => '목ì ì§€ê¹Œì§€ì˜ 거리 단위', + 'GPSDestLatitude' => '목ì ì§€ì˜ 위ë„', + 'GPSDestLatitudeRef' => '목ì ì§€ 위ë„ì˜ ê¸°ì¤€', + 'GPSDestLongitude' => '목ì ì§€ì˜ ê²½ë„', + 'GPSDestLongitudeRef' => '목ì ì§€ ê²½ë„ì˜ ê¸°ì¤€', + 'GPSDifferential' => { + Description => 'GPS 편차 ë³´ì •', + PrintConv => { + 'Differential Corrected' => '편차 ë³´ì • ì ìš©', + 'No Correction' => '편차 ë³´ì • ì—†ì´ ì¸¡ì •', + }, + }, + 'GPSImgDirection' => 'ì´ë¯¸ì§€ ë°©í–¥', + 'GPSImgDirectionRef' => 'ì´ë¯¸ì§€ ë°©í–¥ì˜ ê¸°ì¤€', + 'GPSInfo' => 'GPS Info IFD Pointer', + 'GPSLatitude' => '위ë„', + 'GPSLatitudeRef' => { + Description => 'ë¶ìœ„ ë˜ëŠ” 남위', + PrintConv => { + 'North' => 'ë¶ìœ„', + 'South' => '남위', + }, + }, + 'GPSLongitude' => 'ê²½ë„', + 'GPSLongitudeRef' => { + Description => 'ë™ê²½ ë˜ëŠ” 서경', + PrintConv => { + 'East' => 'ë™ê²½', + 'West' => '서경', + }, + }, + 'GPSMapDatum' => 'ì‚¬ìš©ëœ ì¸¡ì§€ ë°ì´í„°', + 'GPSMeasureMode' => { + Description => 'GPS 측정 모드', + PrintConv => { + '2-Dimensional Measurement' => '2-ì°¨ì› ì¸¡ëŸ‰(í‰ë©´ 측량)', + '3-Dimensional Measurement' => '3ì°¨ì› ì¸¡ì •', + }, + }, + 'GPSProcessingMethod' => 'GPS 처리 ë°©ì‹ ì´ë¦„', + 'GPSSatellites' => 'ì¸¡ì •ì— ì‚¬ìš©ëœ GPS 위성', + 'GPSSpeed' => 'GPS 수신기 ì†ë„', + 'GPSSpeedRef' => { + Description => 'ì†ë„ 단위', + PrintConv => { + 'km/h' => '시간당 킬로미터', + 'knots' => '노트', + 'mph' => '시간당 마ì¼', + }, + }, + 'GPSStatus' => { + Description => 'GPS 수신기 ìƒíƒœ', + PrintConv => { + 'Measurement Active' => '진행 ì¤‘ì¸ ì¸¡ì •', + 'Measurement Void' => '측정 ìƒí˜¸ 운용성', + }, + }, + 'GPSTimeStamp' => 'GPS 시간(ì›ìž 시계)', + 'GPSTrack' => 'ì´ë™ ë°©í–¥', + 'GPSTrackRef' => { + Description => 'ì´ë™ ë°©í–¥ì˜ ê¸°ì¤€', + PrintConv => { + 'Magnetic North' => 'ìžê¸° ë°©í–¥', + 'True North' => '실제 ë°©í–¥', + }, + }, + 'GPSVersionID' => 'GPS 태그 버전', + 'GainControl' => { + Description => 'ì´ë“ 제어', + PrintConv => { + 'High gain down' => 'ë†’ì€ ì´ë“ ê°ì†Œ', + 'High gain up' => 'ë†’ì€ ì´ë“ ì¦ê°€', + 'Low gain down' => 'ì ì€ ì´ë“ ê°ì†Œ', + 'Low gain up' => 'ì ì€ ì´ë“ ì¦ê°€', + 'None' => 'ì—†ìŒ', + }, + }, + 'Gamma' => 'ê°ë§ˆ', + 'Gradation' => '계조', + 'GridDisplay' => { + Description => 'ê²©ìž í‘œì‹œ', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'HDR' => { + Description => 'ìžë™ HDR', + PrintConv => { + 'Off' => 'ì—†ìŒ', + }, + }, + 'Headline' => '헤드ë¼ì¸', + 'HighISONoiseReduction' => { + Description => 'ê³ ISOì—ì„œ ë…¸ì´ì¦ˆì œê±°', + PrintConv => { + 'Auto' => 'ìžë™', + 'High' => '강함', + 'Low' => '약함', + 'Minimal' => '최소', + 'Normal' => '표준', + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'HighlightTonePriority' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'Hue' => '색ìƒ', + 'HueAdjustment' => '색조', + 'ISO' => 'ISO ì†ë„', + 'ISOAuto' => 'ìžë™ ISO', + 'ISODisplay' => 'ISO 표시', + 'ISOExpansion' => { + Description => 'ISO 확장', + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'ISOExpansion2' => { + Description => 'ISO 확장 (2)', + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'ISOInfo' => 'ISO ì •ë³´', + 'ISOSelection' => 'ISO ì„ íƒ', + 'ISOSetting' => { + Description => 'ISO 설정', + PrintConv => { + 'Auto' => 'ìžë™', + 'Manual' => '수ë™', + }, + }, + 'ISOStepSize' => 'ISO ê°ë„ ìŠ¤í… ìˆ˜ì¹˜', + 'Illumination' => { + Description => '조명', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ImageAdjustment' => 'ì´ë¯¸ì§€ ì¡°ì •', + 'ImageAuthentication' => { + Description => 'ì´ë¯¸ì§€ ì¸ì¦', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ImageBoundary' => 'ì´ë¯¸ì§€ 경계', + 'ImageCount' => 'ì´ë¯¸ì§€ 카운트', + 'ImageDataSize' => 'ì´ë¯¸ì§€ ë°ì´í„° í¬ê¸°', + 'ImageDustOff' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ImageHeight' => 'ì´ë¯¸ì§€ 높ì´', + 'ImageHistory' => 'ì´ë¯¸ì§€ ì´ë ¥', + 'ImageNumber' => 'ì´ë¯¸ì§€ 숫ìž', + 'ImageOptimization' => 'ì´ë¯¸ì§€ 최ì í™”', + 'ImageProcessing' => 'ì´ë¯¸ì§€ 처리', + 'ImageQuality' => 'ì´ë¯¸ì§€ 화질', + 'ImageReview' => { + Description => 'ì´ë¯¸ì§€ 미리보기', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ImageReviewTime' => 'ì´ë¯¸ì§€ ìž¬ìƒ ì‹œê°„', + 'ImageSize' => 'ì´ë¯¸ì§€ í¬ê¸°', + 'ImageStabilization' => { + Description => 'ì†ë–¨ë¦¼ ë³´ì •', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ImageUniqueID' => '고유 ì´ë¯¸ì§€ ID', + 'ImageWidth' => 'ì´ë¯¸ì§€ ë„“ì´', + 'Index' => '색ì¸', + 'InitialZoomSetting' => { + Description => 'ì´ë‹ˆì…œ 줌 설정', + PrintConv => { + 'High Magnification' => 'í° í™•ëŒ€', + 'Low Magnification' => 'ìž‘ì€ í™•ëŒ€', + 'Medium Magnification' => '중간 확대', + }, + }, + 'Instructions' => '안내', + 'IntensityStereo' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'InternalFlash' => { + Description => '내장플래시 컨트롤', + PrintConv => { + 'Commander Mode' => 'ì»¤ë§¨ë” ëª¨ë“œ', + 'Manual' => '수ë™', + 'Off' => '꺼ì§', + 'On' => '켜ì§', + 'Repeating Flash' => '리피팅 플래시', + }, + }, + 'InternalFlashMode' => { + PrintConv => { + 'On' => '켜ì§', + }, + }, + 'InteropIndex' => 'ìƒí˜¸ìš´ìš©ì„± ì¦ëª…', + 'InteropOffset' => 'ìƒí˜¸ 운용성 태그', + 'InteropVersion' => 'ìƒí˜¸ 운용성 버전', + 'JPEGQuality' => { + Description => '화질', + PrintConv => { + 'Extra Fine' => 'ì—‘ìŠ¤íŠ¸ë¼ íŒŒì¸', + 'Fine' => '파ì¸', + 'Standard' => '표준화질', + }, + }, + 'Keyword' => '키워드', + 'Keywords' => '키워드', + 'LCDIllumination' => { + Description => 'LCD 조명', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'LCDIlluminationDuringBulb' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'LCHEditor' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'Lens' => '렌즈', + 'LensDataVersion' => '렌즈 ë°ì´í„° 버전', + 'LensFStops' => '렌즈 F-숫ìž', + 'LensID' => 'ì‚¬ìš©ëœ ë Œì¦ˆ', + 'LensIDNumber' => '렌즈 ID 숫ìž', + 'LensInfo' => '렌즈 ì •ë³´', + 'LensType' => '렌즈 형ì‹', + 'LightSource' => { + Description => 'ê´‘ì› ì¢…ë¥˜', + PrintConv => { + 'Cloudy' => 'í린 날씨', + 'Cool White Fluorescent' => '냉백색 형광등 (W 3800 - 4500K)', + 'Day White Fluorescent' => '주백색 형광등 (N 4600 - 5500K)', + 'Daylight' => '주광', + 'Daylight Fluorescent' => '주광색 형광등 (D 5700 - 7100K)', + 'Fine Weather' => 'ë§‘ì€ ë‚ ì”¨', + 'Flash' => '플래시', + 'Fluorescent' => '형광등', + 'ISO Studio Tungsten' => 'ISO 스튜디오 텅스í…', + 'Other' => '기타 ê´‘ì›', + 'Shade' => '그늘', + 'Standard Light A' => '표준 ê´‘ì› A', + 'Standard Light B' => '표준 ê´‘ì› B', + 'Standard Light C' => '표준 ê´‘ì› C', + 'Tungsten (Incandescent)' => 'í……ìŠ¤í… (백열등)', + 'Unknown' => 'ì•Œ 수 ì—†ìŒ', + 'Warm White Fluorescent' => '따뜻한 í°ìƒ‰ 형광 (L 2600 - 3250K)', + 'White Fluorescent' => '백색 형광등 (WW 3250 - 3800K)', + }, + }, + 'Lightness' => '명ë„', + 'LinearizationTable' => '선형ë„í‘œ', + 'LiveViewShooting' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'Location' => '위치', + 'LongExposureNoiseReduction' => { + Description => '장시간 노출 NR', + PrintConv => { + 'Auto' => 'ìžë™', + 'Off' => 'ì—†ìŒ', + 'On' => '있ìŒ', + }, + }, + 'LuminanceNoiseReduction' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'MB-D10Batteries' => 'MB-D10 배터리 형ì‹', + 'MB-D10BatteryType' => 'MB-D10 배터리 형ì‹', + 'MB-D80Batteries' => { + Description => 'MB-D80 배터리', + PrintConv => { + 'FR6 (AA Lithium)' => 'FR6 (AA 리튬)', + 'LR6 (AA Alkaline)' => 'LR6 (AA 알카ë¼ì¸)', + }, + }, + 'MCUVersion' => 'MCU 버전', + 'MSStereo' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'Macro' => { + PrintConv => { + 'Manual' => '수ë™', + }, + }, + 'MacroMode' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'MainDialExposureComp' => { + Description => '노출 ë³´ì •', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'Make' => 'ë©”ì´ì»¤', + 'MakerNote' => '제조사 노트', + 'MakerNoteVersion' => '제조사노트 버전', + 'MakerNotes' => '제조업체 ì •ë³´', + 'ManualFlashOutput' => '내장 플래시 ìˆ˜ë™ ì¶œë ¥', + 'ManualFocusDistance' => 'ìˆ˜ë™ ì´ˆì  ê±°ë¦¬', + 'MatrixMetering' => '멀티 패턴 측광', + 'MaxAperture' => '최대 렌즈 조리개', + 'MaxApertureAtMaxFocal' => '최대 ì´ˆì ê¸¸ì´ì—ì„œ 최대 조리개', + 'MaxApertureAtMinFocal' => '최소 ì´ˆì ê¸¸ì´ì—ì„œ 최대 조리개', + 'MaxApertureValue' => '최대 렌즈 조리개', + 'MaxContinuousRelease' => '최대 연사 릴리즈', + 'MaxFocalLength' => '최대 ì´ˆì ê¸¸ì´', + 'Metering' => { + Description => '측광', + PrintConv => { + 'Center-weighted' => '중앙부 중ì ', + 'Matrix' => '멀티패턴', + 'Spot' => '스팟', + }, + }, + 'MeteringMode' => { + Description => '측광 모드', + PrintConv => { + 'Average' => 'í‰ê· ', + 'Center-weighted average' => 'ì¤‘ì•™ì¤‘ì  í‰ê· ', + 'Multi-segment' => '멀티 패턴', + 'Multi-spot' => '멀티 스팟', + 'Other' => '기타', + 'Partial' => '부분', + 'Spot' => '스팟', + 'Unknown' => 'ì•Œ 수 ì—†ìŒ', + }, + }, + 'MeteringTime' => { + Description => 'ìžë™ 측광 êº¼ì§ ì‹œê°„', + PrintConv => { + 'No Limit' => '무제한', + }, + }, + 'MinFocalLength' => '최소 ì´ˆì ê¸¸ì´', + 'Model' => 'ì¹´ë©”ë¼ ëª¨ë¸', + 'ModelingFlash' => { + Description => '최대', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ModifiedSaturation' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'ModifiedToneCurve' => { + PrintConv => { + 'Manual' => '수ë™', + }, + }, + 'ModifiedWhiteBalance' => { + PrintConv => { + 'Auto' => 'ìžë™', + }, + }, + 'ModifyDate' => 'íŒŒì¼ ë³€ê²½ 날짜 ë° ì‹œê°„', + 'MoireFilter' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'MonitorOffTime' => '모니터 êº¼ì§ ì‹œê°„', + 'MonochromeFilterEffect' => { + PrintConv => { + 'Green' => '녹색', + 'Orange' => '주황', + 'Red' => '빨강', + 'Yellow' => '노랑', + }, + }, + 'MonochromeToningEffect' => { + PrintConv => { + 'Green' => '녹색', + }, + }, + 'MultiExposure' => '다중 노출 ë°ì´í„°', + 'MultiExposureAutoGain' => { + Description => '다중 노출 ìžë™ 게ì¸', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'MultiExposureMode' => { + Description => '다중노출 모드', + PrintConv => { + 'Image Overlay' => 'ì´ë¯¸ì§€ 오버레ì´', + 'Multiple Exposure' => '다중 노출', + 'Off' => '꺼ì§', + }, + }, + 'MultiExposureShots' => '다중 노출 ì´¬ì˜', + 'MultiExposureVersion' => '다중 노출 ë°ì´í„° 버전', + 'MultiFrameNoiseReduction' => { + Description => '다중 프레임 ë…¸ì´ì¦ˆ ê°ì‡„', + PrintConv => { + 'Off' => 'ì—†ìŒ', + 'On' => '있ìŒ', + }, + }, + 'MultiSelector' => { + Description => '멀티셀렉터', + PrintConv => { + 'Do Nothing' => 'ì•„ë¬´ê²ƒë„ ì•ˆí•¨', + 'Reset Meter-off Delay' => '노출계 êº¼ì§ ì‹œê°„ 초기화', + }, + }, + 'MultiSelectorPlaybackMode' => { + Description => '멀티셀렉터 ìž¬ìƒ ëª¨ë“œ', + PrintConv => { + 'Choose Folder' => 'í´ë” ì„ íƒ', + 'Thumbnail On/Off' => 'ì„¬ë„¤ì¼ on/off', + 'View Histograms' => '히스토그램 표시', + 'Zoom On/Off' => '줌 on/off', + }, + }, + 'MultiSelectorShootMode' => { + Description => '멀티셀렉터 ì´¬ì˜ ëª¨ë“œ', + PrintConv => { + 'Highlight Active Focus Point' => '활성 ì´ˆì  í¬ì¸íŠ¸ 하ì´ë¼ì´íŠ¸', + 'Not Used' => '사용 안ë¨', + 'Select Center Focus Point' => '중앙 ì´ˆì  í¬ì¸íŠ¸ ì„ íƒ', + }, + }, + 'MultipleExposureSet' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'Mute' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'MyColorMode' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'NDFilter' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'NEFCompression' => { + Description => 'RAW 압축', + PrintConv => { + 'Lossless' => 'ì†ì‹¤ ì—†ìŒ', + 'Lossy (type 1)' => 'ì†ì‹¤ë¨ (타입 1)', + 'Lossy (type 2)' => 'ì†ì‹¤ë¨ (타입 2)', + 'Uncompressed' => '압축ë˜ì§€ ì•ŠìŒ', + }, + }, + 'NEFLinearizationTable' => '선형ë„í‘œ', + 'NikonCaptureData' => 'Nikon Capture ë°ì´í„°', + 'NikonCaptureVersion' => 'Nikon Capture 버전', + 'NikonImageSize' => { + Description => 'ì´ë¯¸ì§€ í¬ê¸°', + PrintConv => { + 'Large (10.0 M)' => 'í° (10.0M)', + 'Medium (5.6 M)' => '중간 (5.6M)', + 'Small (2.5 M)' => 'ìž‘ì€ (2.5M)', + }, + }, + 'NoMemoryCard' => { + Description => '메모리카드 ì—†ì„ ê²½ìš°', + PrintConv => { + 'Enable Release' => '릴리즈 허용', + 'Release Locked' => '릴리즈 잠금', + }, + }, + 'Noise' => 'ë…¸ì´ì¦ˆ', + 'NoiseFilter' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'NoiseReduction' => { + Description => 'ë…¸ì´ì¦ˆ 제거', + PrintConv => { + 'Auto' => 'ìžë™', + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'OneTouchWB' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'Opto-ElectricConvFactor' => 'ê´‘ì „ìž ë³€í™˜ 계수', + 'Orientation' => { + Description => 'ì´ë¯¸ì§€ 위치', + PrintConv => { + 'Horizontal (normal)' => '0° (위쪽/좌측)', + 'Mirror horizontal' => '0° (위쪽/우측)', + 'Mirror horizontal and rotate 270 CW' => '90° 시계방향 (좌측/위쪽)', + 'Mirror horizontal and rotate 90 CW' => '90° 반시계방향 (우측/아래)', + 'Mirror vertical' => '180° (아래/좌측)', + 'Rotate 180' => '180° (아래/우측)', + 'Rotate 270 CW' => '90° 시계방향 (좌측/아래)', + 'Rotate 90 CW' => '90° 반시계방향 (우측/위쪽)', + }, + }, + 'PhaseDetectAF' => { + Description => '오토í¬ì»¤ìŠ¤', + PrintConv => { + 'Off' => '비활성', + 'On (51-point)' => '활성', + }, + }, + 'PhotoEffect' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'PhotoEffects' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'PhotoInfoPlayback' => { + Description => '사진 ì •ë³´/재ìƒ', + PrintConv => { + 'Info Left-right, Playback Up-down' => 'ì •ë³´ <> / 재ìƒ', + 'Info Up-down, Playback Left-right' => 'ì •ë³´ / ìž¬ìƒ <>', + }, + }, + 'PhotometricInterpretation' => { + Description => '픽셀 형ì‹', + PrintConv => { + 'BlackIsZero' => 'ë¸”ëž™ì€ ì œë¡œìž„', + 'RGB Palette' => '팔렛트 컬러', + 'Transparency Mask' => '투명 마스í¬', + 'WhiteIsZero' => 'í™”ì´íŠ¸ëŠ” 제로임', + }, + }, + 'PictureControl' => { + Description => '픽ì³ì»¨íŠ¸ë¡¤', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'PictureControlActive' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'PictureControlAdjust' => { + Description => '픽ì³ì»¨íŠ¸ë¡¤ ì¡°ì •', + PrintConv => { + 'Default Settings' => '기본 설정', + 'Full Control' => 'ì „ì²´ 제어', + 'Quick Adjust' => '빠른 ì¡°ì •', + }, + }, + 'PictureControlBase' => '픽ì³ì»¨íŠ¸ë¡¤ 기초', + 'PictureControlName' => '픽ì³ì»¨íŠ¸ë¡¤ ì´ë¦„', + 'PictureControlQuickAdjust' => '픽ì³ì»¨íŠ¸ë¡¤ 빠른 ì¡°ì •', + 'PictureControlVersion' => '픽ì³ì»¨íŠ¸ë¡¤ 버전', + 'PictureMode' => { + PrintConv => { + 'Auto' => 'ìžë™', + 'Manual' => '수ë™', + }, + }, + 'PictureMode2' => { + PrintConv => { + 'Manual' => '수ë™', + }, + }, + 'PictureModeBWFilter' => { + PrintConv => { + 'Green' => '녹색', + 'Orange' => '주황', + 'Red' => '빨강', + 'Yellow' => '노랑', + }, + }, + 'PictureModeTone' => { + PrintConv => { + 'Green' => '녹색', + }, + }, + 'PlanarConfiguration' => { + Description => 'ì´ë¯¸ì§€ ë°ì´í„° ì •ë ¬', + PrintConv => { + 'Chunky' => '청키 형ì‹', + 'Planar' => 'í‰ë©´ 형ì‹', + }, + }, + 'Preview' => 'IFD í¬ì¸í„° 미리보기', + 'PreviewIFD' => 'IFD í¬ì¸í„° 미리보기', + 'PrimaryAFPoint' => { + PrintConv => { + 'Bottom' => '하단', + 'C6 (Center)' => 'C6 (중앙)', + 'Center' => '중앙', + 'Far Left' => '맨 좌측', + 'Far Right' => '맨 우측', + 'Lower-left' => '좌하단', + 'Lower-right' => '우하단', + 'Mid-left' => '왼쪽', + 'Mid-right' => '오른쪽', + 'Top' => 'ìƒë‹¨', + 'Upper-left' => '좌ìƒë‹¨', + 'Upper-right' => 'ìš°ìƒë‹¨', + }, + }, + 'PrimaryChromaticities' => '기본 색ë„', + 'ProgramShift' => '프로그램 쉬프트', + 'Province-State' => 'ë„', + 'Quality' => { + Description => '화질', + PrintConv => { + 'Compressed RAW' => 'cRAW', + 'Compressed RAW + JPEG' => 'cRAW+JPEG', + 'Extra Fine' => 'ì—‘ìŠ¤íŠ¸ë¼ íŒŒì¸', + 'Fine' => '파ì¸', + 'Low' => '저화질', + 'Normal' => '표준화질', + 'RAW + JPEG' => 'RAW+JPEG', + 'Standard' => '표준', + }, + }, + 'QuickAdjust' => '빠른 ì¡°ì •', + 'RawDevAutoGradation' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'RawDevPMPictureTone' => { + PrintConv => { + 'Green' => '녹색', + }, + }, + 'RawDevPM_BWFilter' => { + PrintConv => { + 'Green' => '녹색', + 'Orange' => '주황', + 'Red' => '빨강', + 'Yellow' => '노랑', + }, + }, + 'RawImageCenter' => 'RAW ì´ë¯¸ì§€ 중앙', + 'RecordMode' => { + Description => 'ì´ë¯¸ì§€ 화질 모드', + PrintConv => { + 'Manual' => '수ë™', + }, + }, + 'RecordingMode' => { + PrintConv => { + 'Auto' => 'ìžë™', + 'Manual' => '수ë™', + }, + }, + 'RedEyeCorrection' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'RedEyeReduction' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ReferenceBlackWhite' => 'í‘ë°± 참조 ê°’ì˜ ìŒ', + 'RelatedImageFileFormat' => '관련 ì´ë¯¸ì§€ íŒŒì¼ í˜•ì‹', + 'RelatedImageHeight' => '관련 ì´ë¯¸ì§€ 길ì´', + 'RelatedImageWidth' => '관련 ì´ë¯¸ì§€ 너비', + 'RelatedSoundFile' => 'ì—°ê´€ëœ ì˜¤ë””ì˜¤ 파ì¼', + 'ReleaseButtonToUseDial' => { + Description => '다ì´ì–¼ë¡œ 릴리즈 버튼 사용', + PrintConv => { + 'No' => '아니오', + 'Yes' => '예', + }, + }, + 'RemoteOnDuration' => '리모컨 ì§€ì† ì‹œê°„', + 'RepeatingFlashCount' => '리피팅 플래시 시간', + 'RepeatingFlashOutput' => '리피팅 플래시 출력', + 'RepeatingFlashRate' => '리피팅 플래시 간격', + 'ResolutionUnit' => { + Description => 'X 와 Y í•´ìƒë„ 단위', + PrintConv => { + 'None' => 'ì—†ìŒ', + 'cm' => '센티미터', + 'inches' => 'ì¸ì¹˜', + }, + }, + 'RetouchHistory' => { + Description => '리터치 ì´ë ¥', + PrintConv => { + 'B & W' => 'í‘ë°±', + 'Color Custom' => '커스텀 컬러', + 'Cyanotype' => '청사진', + 'Image Overlay' => 'ì´ë¯¸ì§€ 오버레ì´', + 'None' => 'ì—†ìŒ', + 'Sepia' => '세피아', + 'Sky Light' => 'ìŠ¤ì¹´ì´ ë¼ì´íŠ¸', + 'Small Picture' => '스몰', + 'Trim' => '트리ë°', + 'Warm Tone' => '따뜻한 톤', + }, + }, + 'ReverseIndicators' => 'ì¸ë””ì¼€ì´í„° 전환', + 'Rotation' => { + Description => 'ì¹´ë©”ë¼ íšŒì „ ë°©í–¥', + PrintConv => { + 'Horizontal' => '0° (수í‰)', + 'Rotated 180' => '180° (ìƒí•˜ë°˜ì „)', + 'Rotated 270 CW' => '90° 좌회전', + 'Rotated 90 CW' => '90° 우회전', + }, + }, + 'RowsPerStrip' => '스트립 당 í–‰ì˜ ìˆ˜', + 'SamplesPerPixel' => '구성 요소 수', + 'Saturation' => { + Description => '채ë„', + PrintConv => { + 'High' => '고채ë„', + 'Low' => '저채ë„', + 'Normal' => '표준', + }, + }, + 'ScanImageEnhancer' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'SceneAssist' => 'ë³´ì¡° 센서', + 'SceneCaptureType' => { + Description => '장면 ê¸°ë¡ í˜•ì‹', + PrintConv => { + 'Landscape' => 'í’ê²½', + 'Night' => '야경', + 'Portrait' => 'ì¸ë¬¼', + 'Standard' => '표준', + }, + }, + 'SceneMode' => { + Description => '장면 모드', + PrintConv => { + '3D Sweep Panorama' => '3D', + 'Anti Motion Blur' => 'ì¸ë¬¼ í”들림 방지', + 'Auto' => 'ìžë™', + 'Cont. Priority AE' => 'ì—°ì† ì´¬ì˜ ìš°ì„  AE', + 'Handheld Night Shot' => 'ì†ìœ¼ë¡œ 야간 ì´¬ì˜', + 'Landscape' => 'í’ê²½', + 'Macro' => '매í¬ë¡œ', + 'Manual' => '수ë™', + 'Night Portrait' => '야경 ì¸ë¬¼', + 'Night Scene' => '야경', + 'Night View/Portrait' => '야경/ì¸ë¬¼', + 'Off' => '꺼ì§', + 'Portrait' => 'ì¸ë¬¼', + 'Sports' => '스í¬ì¸  ì•¡ì…˜', + 'Sunset' => 'ì„ì–‘ì´¬ì˜', + 'Sweep Panorama' => '스위프 파노ë¼ë§ˆ', + }, + }, + 'SceneModeUsed' => { + PrintConv => { + 'Manual' => '수ë™', + }, + }, + 'SceneType' => { + Description => '장면 형ì‹', + PrintConv => { + 'Directly photographed' => 'ì§ì ‘ ì´¬ì˜ëœ ì´ë¯¸ì§€', + }, + }, + 'SecurityClassification' => { + Description => '보안 분류', + PrintConv => { + 'Confidential' => '기밀', + 'Restricted' => '제한', + 'Secret' => '비밀', + 'Top Secret' => '1급비밀', + 'Unclassified' => '분류안ë¨', + }, + }, + 'SelfTimerMode' => '셀프 타ì´ë¨¸ 모드', + 'SelfTimerTime' => '셀프타ì´ë¨¸', + 'SensingMethod' => { + Description => '검출 ë°©ì‹', + PrintConv => { + 'Color sequential area' => 'ìƒ‰ìƒ ìˆœì°¨ ì˜ì—­ 센서', + 'Color sequential linear' => 'ìƒ‰ìƒ ìˆœì°¨ 선형 센서', + 'Monochrome area' => '모노í¬ë¡¬ ì˜ì—­ 센서', + 'Monochrome linear' => '모노í¬ë¡¬ 선형 센서', + 'Not defined' => 'ì •ì˜ë˜ì§€ ì•ŠìŒ', + 'One-chip color area' => 'One-chip ìƒ‰ìƒ ì˜ì—­ 센서', + 'Three-chip color area' => 'Three-chip ìƒ‰ìƒ ì˜ì—­ 센서', + 'Trilinear' => 'Trilinear 센서', + 'Two-chip color area' => 'Two-chip ìƒ‰ìƒ ì˜ì—­ 센서', + }, + }, + 'SensorPixelSize' => '센서 픽셀 í¬ê¸°', + 'SerialNumber' => '시리얼번호', + 'ShadingCompensation' => { + Description => '주변광량 ë³´ì •', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ShadingCompensation2' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ShakeReduction' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'Sharpness' => { + Description => '선명ë„', + PrintConv => { + 'Hard' => '강하게', + 'Normal' => '표준', + 'Soft' => '약하게', + }, + }, + 'ShootingInfoDisplay' => { + Description => 'ì´¬ì˜ ì •ë³´ 표시', + PrintConv => { + 'Auto' => 'ìžë™', + 'Manual (dark on light)' => 'ìˆ˜ë™ - ë°ì€ë°°ê²½ì— ì–´ë‘움', + 'Manual (light on dark)' => 'ìˆ˜ë™ - ì–´ë‘ìš´ ë°°ê²½ì— ë°ìŒ', + }, + }, + 'ShootingMode' => { + Description => 'ì›ê²© 리모컨', + PrintConv => { + 'Manual' => '수ë™', + }, + }, + 'ShootingModeSetting' => { + Description => 'ì´¬ì˜ ëª¨ë“œ', + PrintConv => { + 'Continuous' => '연사', + 'Delayed Remote' => 'ì´¬ì˜ëŒ€ê¸° 리모컨', + 'Quick-response Remote' => 'ì¦‰ì‹œì´¬ì˜ ë¦¬ëª¨ì»¨', + 'Self-timer' => '셀프타ì´ë¨¸', + 'Single Frame' => '싱글 프레임', + }, + }, + 'ShotInfoVersion' => 'ì´¬ì˜ ì •ë³´ 버전', + 'ShutterCount' => '셔터 카운트', + 'ShutterMode' => { + PrintConv => { + 'Auto' => 'ìžë™', + }, + }, + 'ShutterReleaseButtonAE-L' => { + Description => '셔터 릴리즈 버튼 AE-L', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ShutterSpeed' => '노출 시간', + 'ShutterSpeedValue' => '셔터 ì†ë„', + 'SlowShutter' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'SlowSync' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'Software' => '소프트웨어', + 'Source' => '소스', + 'SpatialFrequencyResponse' => '공간 주파수 ì‘답', + 'SpectralSensitivity' => '분광 ê°ë„', + 'State' => 'ë„', + 'StripByteCounts' => 'ì••ì¶•ëœ ìŠ¤íŠ¸ë¦½ 당 ë°”ì´íŠ¸', + 'StripOffsets' => 'ì´ë¯¸ì§€ ë°ì´í„° 위치', + 'SubSecTime' => 'ì¼ì‹œ 1/100 ì´ˆ', + 'SubSecTimeDigitized' => '디지털화 ì¼ì‹œ 1/100 ì´ˆ', + 'SubSecTimeOriginal' => 'ì›ë³¸ì¼ì‹œ 1/100 ì´ˆ', + 'SubfileType' => '새로운 ì„œë¸ŒíŒŒì¼ í˜•ì‹', + 'SubjectArea' => '피사체 ì˜ì—­', + 'SubjectDistance' => 'í”¼ì‚¬ì²´ì˜ ê±°ë¦¬', + 'SubjectDistanceRange' => { + Description => '피사체 거리 한계', + PrintConv => { + 'Close' => '근경', + 'Distant' => 'ì›ê²½', + 'Macro' => '매í¬ë¡œ', + 'Unknown' => 'ì•Œ 수 ì—†ìŒ', + }, + }, + 'SubjectLocation' => '피사체 위치', + 'SuperMacro' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'SuperimposedDisplay' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'SupplementalCategories' => '보충 범주', + 'TextStamp' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ThumbnailImage' => '축소 그림', + 'ThumbnailImageSize' => '갤러리 í¬ê¸°', + 'TimeZone' => '표준 시간대', + 'TimerFunctionButton' => { + Description => 'Fn 버튼', + PrintConv => { + 'ISO' => 'ISO ê°ë„', + 'Image Quality/Size' => 'ì´ë¯¸ì§€ 화질/í¬ê¸°', + 'Self-timer' => '셀프타ì´ë¨¸', + 'Shooting Mode' => 'ì´¬ì˜ ëª¨ë“œ', + 'White Balance' => 'í™”ì´íŠ¸ 밸런스', + }, + }, + 'Title' => '제목', + 'ToneComp' => '계조 ë³´ì •', + 'ToneCurve' => { + PrintConv => { + 'Manual' => '수ë™', + }, + }, + 'ToningEffect' => { + Description => '조색 효과', + PrintConv => { + 'B&W' => 'í‘ë°±', + 'Blue' => '블루', + 'Blue-green' => '블루-그린', + 'Green' => '녹색', + 'Purple-blue' => 'í¼í”Œ-블루', + 'Red' => '빨강', + 'Red-purple' => '레드-í¼í”Œ', + 'Yellow' => '노랑', + 'n/a' => '설정 안ë¨', + }, + }, + 'ToningEffectMonochrome' => { + PrintConv => { + 'Green' => '녹색', + }, + }, + 'ToningSaturation' => 'ì±„ë„ ì¡°ì •', + 'TransferFunction' => '전송 기능', + 'TransmissionReference' => '전송 참조', + 'Uncompressed' => '압축ë˜ì§€ ì•ŠìŒ', + 'Unsharp1Color' => { + PrintConv => { + 'Green' => '녹색', + 'Red' => '빨강', + 'Yellow' => '노랑', + }, + }, + 'Unsharp2Color' => { + PrintConv => { + 'Green' => '녹색', + 'Red' => '빨강', + 'Yellow' => '노랑', + }, + }, + 'Unsharp3Color' => { + PrintConv => { + 'Green' => '녹색', + 'Red' => '빨강', + 'Yellow' => '노랑', + }, + }, + 'Unsharp4Color' => { + PrintConv => { + 'Green' => '녹색', + 'Red' => '빨강', + 'Yellow' => '노랑', + }, + }, + 'UnsharpMask' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'Urgency' => '중요ë„', + 'UserComment' => 'ì‚¬ìš©ìž ì½”ë©˜íŠ¸', + 'VRInfo' => 'ì†ë–¨ë¦¼ ë³´ì • ì •ë³´', + 'VRInfoVersion' => 'VR ì •ë³´ 버전', + 'VR_0x66' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'VariProgram' => '다중 프로그램', + 'VibrationReduction' => { + Description => 'ì†ë–¨ë¦¼ ë³´ì •', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'ViewfinderWarning' => { + Description => '뷰파ì¼ë” 경고', + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'VignetteControl' => { + Description => '비네팅 컨트롤', + PrintConv => { + 'High' => '높ìŒ', + 'Low' => 'ë‚®ìŒ', + 'Normal' => '표준', + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'WBBracketMode' => { + PrintConv => { + 'Off' => '꺼ì§', + }, + }, + 'WBMode' => { + PrintConv => { + 'Auto' => 'ìžë™', + }, + }, + 'WhiteBalance' => { + Description => 'í™”ì´íŠ¸ë°¸ëŸ°ìŠ¤', + PrintConv => { + 'Auto' => 'ìžë™', + 'Black & White' => 'í‘ë°±', + 'Cloudy' => 'í린날', + 'Color Temperature/Color Filter' => '색 ì˜¨ë„ / 컬러 í•„í„°', + 'Cool White Fluorescent' => '차가운 백색 형광', + 'Custom' => 'ì‚¬ìš©ìž ì •ì˜', + 'Custom 1' => 'ê°œì¸ì„¤ì •1', + 'Custom 2' => 'ê°œì¸ì„¤ì •2', + 'Custom 3' => 'ê°œì¸ì„¤ì •3', + 'Custom 4' => 'ê°œì¸ì„¤ì •4', + 'Day White Fluorescent' => '중성 백색 형광', + 'Daylight' => '맑ì€ë‚ ', + 'Daylight Fluorescent' => 'ì¼ê´‘ 형광', + 'Flash' => '플래시', + 'Fluorescent' => '형광등', + 'Manual' => '수ë™', + 'Shade' => '그늘', + 'Tungsten' => '백열등', + 'Unknown' => 'ì•Œ 수 ì—†ìŒ', + 'Warm White Fluorescent' => '따뜻한 í°ìƒ‰ 형광', + 'White Fluorescent' => '백색 형광등', + }, + }, + 'WhiteBalance2' => { + PrintConv => { + 'Auto' => 'ìžë™', + }, + }, + 'WhiteBalanceAdj' => { + PrintConv => { + 'Auto' => 'ìžë™', + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, + 'WhiteBalanceFineTune' => 'í™”ì´íŠ¸ë°¸ëŸ°ìŠ¤ ì¡°ì •', + 'WhiteBalanceSet' => { + PrintConv => { + 'Auto' => 'ìžë™', + 'Manual' => '수ë™', + }, + }, + 'WhitePoint' => 'í°ìƒ‰ ì  ìƒ‰ë„', + 'WorldTime' => '표준 시간대', + 'Writer-Editor' => '캡션 작성ìž', + 'XResolution' => 'ìˆ˜í‰ í•´ìƒë„', + 'YCbCrCoefficients' => 'ìƒ‰ìƒ ê³µê°„ 변환 매트릭스 계수', + 'YCbCrPositioning' => { + Description => 'Y and C 위치', + PrintConv => { + 'Centered' => '중앙', + 'Co-sited' => '주변', + }, + }, + 'YCbCrSubSampling' => 'Y->C ì„œë¸Œìƒ˜í”Œë§ ë¹„ìœ¨', + 'YResolution' => 'ìˆ˜ì§ í•´ìƒë„', + 'ZoneMatching' => { + Description => 'ì˜ì—­ 전환', + PrintConv => { + 'High Key' => 'Hi', + 'ISO Setting Used' => 'ì—†ìŒ', + 'Low Key' => 'Lo', + }, + }, + 'ZoneMatchingOn' => { + PrintConv => { + 'Off' => '꺼ì§', + 'On' => '켜ì§', + }, + }, +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::ko.pm - ExifTool Korean language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke and Jeong Beom Kim for providing this translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/nl.pm b/lib/Image/ExifTool/Lang/nl.pm new file mode 100644 index 0000000..195c182 --- /dev/null +++ b/lib/Image/ExifTool/Lang/nl.pm @@ -0,0 +1,3226 @@ +#------------------------------------------------------------------------------ +# File: nl.pm +# +# Description: ExifTool Dutch language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::nl; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.13'; + +%Image::ExifTool::Lang::nl::Translate = ( + 'AEBAutoCancel' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AELock' => { + Description => 'AE-vergrendeling', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AELockButton' => { + Description => 'AE-L/AF-L', + PrintConv => { + 'AE Lock (hold)' => 'AE-vergrendeling vast', + 'AE Lock Only' => 'AE-vergrendeling', + 'AE-L/AF Area' => 'AE-L/AF veld', + 'AE-L/AF-L/AF Area' => 'AE-L/AF-L/AF veld', + 'AE/AF Lock' => 'AE/AF-vergrendeling', + 'AF Lock Only' => 'AF-vergrendeling', + 'AF-L/AF Area' => 'AF-L/AF veld', + 'AF-ON/AF Area' => 'AF-ON/AF veld', + 'FV Lock' => 'FV-vergrendeling', + 'Focus Area Selection' => 'AF-veld', + }, + }, + 'AEMeteringMode' => { + PrintConv => { + 'Multi-segment' => 'Multi segment', + }, + }, + 'AEProgramMode' => { + PrintConv => { + 'Landscape' => 'Landschap', + 'Portrait' => 'Portret', + 'Standard' => 'Standaard', + }, + }, + 'AF-CPrioritySelection' => { + Description => 'Selectie AF-C-prioriteit', + PrintConv => { + 'Focus' => 'Scherpstelling', + 'Release' => 'Ontspannen', + 'Release + Focus' => 'Ontspannen + scherpstelling', + }, + }, + 'AF-OnForMB-D10' => { + Description => 'Functie AF-ON-knop MBD10', + PrintConv => { + 'AE Lock (hold)' => 'AE-vergrendeling (vast)', + 'AE Lock (reset on release)' => 'AE-vergr. (herstel na ontspan.)', + 'AE Lock Only' => 'AE-vergrendeling', + 'AE/AF Lock' => 'AE/AF-vergrendeling', + 'AF Lock Only' => 'AF-vergrendeling', + 'AF-On' => 'AF-ON', + 'Same as FUNC Button' => 'Zelfde als FUNC.-knop', + }, + }, + 'AF-SPrioritySelection' => { + Description => 'Selectie AF-S-prioriteit', + PrintConv => { + 'Focus' => 'Scherpstelling', + 'Release' => 'Ontspannen', + }, + }, + 'AFActivation' => { + Description => 'AF activering', + PrintConv => { + 'AF-On Only' => 'Alleen AF-ON', + 'Shutter/AF-On' => 'Ontspanknop/AF-ON', + }, + }, + 'AFAreaIllumination' => { + Description => 'AF-veld verlichting', + PrintConv => { + 'Auto' => 'Automatisch', + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AFAreaMode' => { + Description => 'AF-veldstand', + PrintConv => { + 'Auto-area' => 'Automatischveld AF', + 'Dynamic Area' => 'Dynamisch veld', + 'Single Area' => 'Enkelveld', + }, + }, + 'AFAreaModeSetting' => { + Description => 'AF-veldstand', + PrintConv => { + 'Closest Subject' => 'Dichtstbz. onderw.', + 'Dynamic Area' => 'Dynamisch veld', + 'Single Area' => 'Enkelveld', + }, + }, + 'AFAssist' => { + Description => 'AF-hulpverlichting', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AFPoint' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'AFPointActivationArea' => { + PrintConv => { + 'Standard' => 'Standaard', + }, + }, + 'AFPointBrightness' => { + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'AFPointDisplayDuringFocus' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AFPointIllumination' => { + Description => 'Verlichting scherpstelpunt', + PrintConv => { + 'Auto' => 'Automatisch', + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AFPointMode' => { + PrintConv => { + 'Auto' => 'Automatisch', + }, + }, + 'AFPointRegistration' => { + PrintConv => { + 'Automatic' => 'Automatisch', + }, + }, + 'AFPointSelected' => { + PrintConv => { + 'Auto' => 'Automatisch', + }, + }, + 'AFPointSelected2' => { + PrintConv => { + 'Auto' => 'Automatisch', + }, + }, + 'AFPointSelection' => { + Description => 'Selectie scherpstelpunt', + PrintConv => { + '11 Points' => '11 punten', + '51 Points' => '51 punten (3D-tracking)', + }, + }, + 'AFPointSelectionMethod' => { + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'AFPointsInFocus' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'AFPointsUnknown2' => { + PrintConv => { + 'Auto' => 'Automatisch', + }, + }, + 'AIServoTrackingSensitivity' => { + PrintConv => { + 'Standard' => 'Standaard', + }, + }, + 'APEVersion' => 'APE versie', + 'ARMIdentifier' => 'ARM herkenningscode', + 'ARMVersion' => 'ARM versie', + 'ActionAdvised' => { + Description => 'Actie advies', + PrintConv => { + 'Object Append' => 'Object toevoegen', + 'Object Kill' => 'Object verwijderen', + 'Object Reference' => 'Object referentie', + 'Object Replace' => 'Object vervangen', + 'Ojbect Append' => 'Object toevoegen', + }, + }, + 'ActiveD-Lighting' => { + PrintConv => { + 'High' => 'Hoog', + 'Low' => 'Laag', + 'Normal' => 'Normaal', + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ActiveD-LightingMode' => { + PrintConv => { + 'High' => 'Hoog', + 'Low' => 'Laag', + 'Normal' => 'Normaal', + 'Off' => 'Uit', + }, + }, + 'AddAspectRatioInfo' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'AddOriginalDecisionData' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AdultContentWarning' => { + PrintConv => { + 'Unknown' => 'Onbekend', + }, + }, + 'AdvancedRaw' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AlphaByteCount' => 'Aantal alphagegevens in bytes', + 'AlphaDataDiscard' => { + Description => 'Afgedankte alphagegevens', + PrintConv => { + 'Flexbits Discarded' => 'Afgedankte flexbits', + 'Full Resolution' => 'Volledige resolutie', + 'HighPass Frequency Data Discarded' => 'Afgedankte hoogdoorlaat frequentiegegevens', + 'Highpass and LowPass Frequency Data Discarded' => 'Afgedankte hoogdoorlaat en laagdoorlaat frequentiegegevens', + }, + }, + 'AlphaOffset' => 'Alphaverplaatsing', + 'Anti-Blur' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'Aperture' => 'Diafragma', + 'ApertureValue' => 'Diafragma', + 'ApplicationRecordVersion' => 'Gegevensversie', + 'Artist' => 'Maker van de afbeelding', + 'AssistButtonFunction' => { + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'Audio' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'AudioDuration' => 'Audio duur', + 'AudioOutcue' => 'Audio eindaftiteling', + 'AudioSamplingRate' => 'Audio bemonsteringssnelheid', + 'AudioSamplingResolution' => 'Audio bemonsteringsresolutie', + 'AudioType' => { + Description => 'Type audio', + PrintConv => { + 'Mono Actuality' => 'Actualiteit (mono (1 kanaal) audio)', + 'Mono Music' => 'Muziek, zelf verstuurd (mono (1 kanaal) audio)', + 'Mono Question and Answer Session' => 'Vraag en antwoord sessie (mono (1 kanaal) audio)', + 'Mono Raw Sound' => 'Ruwe geluid (mono (1 kanaal) audio)', + 'Mono Response to a Question' => 'Beantwoord een vraag (mono (1 kanaal) audio)', + 'Mono Scener' => 'Toneel (mono (1 kanaal) audio)', + 'Mono Voicer' => 'Stem (mono (1 kanaals) audio)', + 'Mono Wrap' => 'Wrap (mono (1 kanaals) audio)', + 'Stereo Actuality' => 'Actualiteit (stereo (2 kanalen) audio)', + 'Stereo Music' => 'Muziek, zelf verstuurd (stereo (2 kanalen) audio)', + 'Stereo Question and Answer Session' => 'Vraag en antwoord sessie (stereo (2 kanalen) audio)', + 'Stereo Raw Sound' => 'Ruwe geluid (stereo (2 kanalen) audio)', + 'Stereo Response to a Question' => 'Beantwoord een vraag (stereo (2 kanalen) audio)', + 'Stereo Scener' => 'Toneel (stereo (2 kanaals) audio)', + 'Stereo Voicer' => 'Stem (stereo (2 kanaals) audio)', + 'Stereo Wrap' => 'Wrap (stereo (2 kanaals) audio)', + 'Text Only' => 'Alleen tekst (geen objectgegevens)', + }, + }, + 'Author' => 'Auteur', + 'AuthorsPosition' => 'Positie van de auteur', + 'AutoAperture' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AutoBracketModeM' => { + Description => 'Auto bracketing (M-stand)', + PrintConv => { + 'Flash Only' => 'Alleen flits', + 'Flash/Aperture' => 'Flits/diafragma', + 'Flash/Speed' => 'Flits/sluitertijd', + 'Flash/Speed/Aperture' => 'Flits/sluitertijd/diafragma', + }, + }, + 'AutoBracketOrder' => 'Bracketingvolgorde', + 'AutoBracketSet' => { + Description => 'Inst. voor auto bracketing', + PrintConv => { + 'AE & Flash' => 'AE & flits', + 'AE Only' => 'Alleen AE', + 'Flash Only' => 'Alleen flits', + 'WB Bracketing' => 'Witbalans bracketing', + }, + }, + 'AutoBracketing' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'AutoBracketingSet' => 'Inst. voor auto bracketing', + 'AutoExposureBracketing' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AutoFP' => { + Description => 'Auto FP', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AutoFocus' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AutoISO' => { + Description => 'ISO auto', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AutoISOMax' => 'ISO auto Maximale', + 'AutoISOMinShutterSpeed' => 'ISO auto Langste sluitertijd', + 'AutoLightingOptimizer' => { + PrintConv => { + 'Low' => 'Laag', + 'Off' => 'Uit', + 'Standard' => 'Standaard', + }, + }, + 'AutoLightingOptimizerOn' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'AutoRedEye' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'AutoRotate' => { + PrintConv => { + 'None' => 'Geen', + 'Rotate 180' => '180° (onder/rechts)', + 'Rotate 270 CW' => 'Draai 270° met de klok mee', + 'Rotate 90 CW' => '90° tegen de klok in (rechts/boven)', + 'n/a' => 'Onbekend', + }, + }, + 'BWMode' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'BackgroundColorIndicator' => 'Achtergrond kleur indicator', + 'BackgroundColorValue' => 'Achtergrond kleur waarde', + 'BackgroundTiling' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'BannerImageType' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'BatteryLevel' => 'Batterij status', + 'BatteryOrder' => { + Description => 'Batterijvolgorde', + PrintConv => { + 'Camera Battery First' => 'Camerabatterij eerst', + 'MB-D10 First' => 'MB-D10 batterijen eerst', + }, + }, + 'Beep' => { + Description => 'Signaal', + PrintConv => { + 'High' => 'Hoog', + 'Low' => 'Laag', + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'BitsPerSample' => 'Aantal Bits per component', + 'BlueMatrixColumn' => 'Blauwe matrixkolom', + 'BlueTRC' => 'Blauwe toon reproductie curve', + 'BlurWarning' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'BracketMode' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'BracketStep' => { + PrintConv => { + '1 EV' => '1 stop', + '1/3 EV' => '1/3 stop', + '2/3 EV' => '2/3 stop', + }, + }, + 'Brightness' => 'Helderheid', + 'BrightnessValue' => 'Helderheid', + 'BurstMode' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'By-line' => 'Maker', + 'By-lineTitle' => 'Beroep van de maker', + 'CFAPattern' => 'Kleur filter matrix', + 'CFAPattern2' => 'Kleurfiltermatrix 2', + 'CFARepeatPatternDim' => 'Kleurfiltermatrix grootte', + 'CLModeShootingSpeed' => 'Opnamesnelheid', + 'CMMFlags' => 'CMM vlaggen', + 'CPUType' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'CalibrationIlluminant1' => { + PrintConv => { + 'Cloudy' => 'Bewolkt', + 'Cool White Fluorescent' => 'Koel wit TL-licht', + 'Day White Fluorescent' => 'Daglicht wit TL-licht', + 'Daylight' => 'Daglicht', + 'Daylight Fluorescent' => 'Daglicht TL-licht', + 'Fine Weather' => 'Onbewolkt', + 'Flash' => 'Flits', + 'Fluorescent' => 'Fluoresceren', + 'ISO Studio Tungsten' => 'ISO studio kunstlicht (gloeilamp)', + 'Other' => 'Andere lichtbron', + 'Shade' => 'Schaduw', + 'Standard Light A' => 'Standaard licht A', + 'Standard Light B' => 'Standaard licht B', + 'Standard Light C' => 'Standaard licht C', + 'Tungsten (Incandescent)' => 'Kunstlicht (gloeilamp)', + 'Unknown' => 'Onbekend', + 'Warm White Fluorescent' => 'Warm wit TL-licht', + 'White Fluorescent' => 'Wit TL-licht', + }, + }, + 'CalibrationIlluminant2' => { + PrintConv => { + 'Cloudy' => 'Bewolkt', + 'Cool White Fluorescent' => 'Koel wit TL-licht', + 'Day White Fluorescent' => 'Daglicht wit TL-licht', + 'Daylight' => 'Daglicht', + 'Daylight Fluorescent' => 'Daglicht TL-licht', + 'Fine Weather' => 'Onbewolkt', + 'Flash' => 'Flits', + 'Fluorescent' => 'Fluoresceren', + 'ISO Studio Tungsten' => 'ISO studio kunstlicht (gloeilamp)', + 'Other' => 'Andere lichtbron', + 'Shade' => 'Schaduw', + 'Standard Light A' => 'Standaard licht A', + 'Standard Light B' => 'Standaard licht B', + 'Standard Light C' => 'Standaard licht C', + 'Tungsten (Incandescent)' => 'Kunstlicht (gloeilamp)', + 'Unknown' => 'Onbekend', + 'Warm White Fluorescent' => 'Warm wit TL-licht', + 'White Fluorescent' => 'Wit TL-licht', + }, + }, + 'CameraOrientation' => { + Description => 'Oriëntatie van de afbeelding', + PrintConv => { + 'Horizontal (normal)' => '0° (boven/links)', + 'Rotate 270 CW' => 'Draai 270° met de klok mee', + 'Rotate 90 CW' => '90° tegen de klok in (rechts/boven)', + }, + }, + 'CanonExposureMode' => { + PrintConv => { + 'Aperture-priority AE' => 'Diafragmaprioriteit', + 'Manual' => 'Handmatig', + 'Shutter speed priority AE' => 'Sluiterprioriteit', + }, + }, + 'CanonFlashMode' => { + PrintConv => { + 'Auto' => 'Automatisch', + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'Caption-Abstract' => 'Titel/Beschrijving', + 'CaptionWriter' => 'Schrijver van het onderschrift', + 'CaptureXResolutionUnit' => { + PrintConv => { + 'um' => 'µm (micrometer)', + }, + }, + 'CaptureYResolutionUnit' => { + PrintConv => { + 'um' => 'µm (micrometer)', + }, + }, + 'Categories' => 'Categorieën', + 'Category' => 'Categorie', + 'CellLength' => 'Cel lengte', + 'CellWidth' => 'Cel breedte', + 'CenterAFArea' => { + Description => 'Centrale AF-veld', + PrintConv => { + 'Normal Zone' => 'Normaal', + 'Wide Zone' => 'Breed', + }, + }, + 'CenterWeightedAreaSize' => { + Description => 'Grootte meetgebied', + PrintConv => { + 'Average' => 'Gemiddeld', + }, + }, + 'CharacterSet' => 'Tekenset', + 'ChrominanceNR_TIFF_JPEG' => { + PrintConv => { + 'High' => 'Hoog', + 'Low' => 'Laag', + 'Off' => 'Uit', + }, + }, + 'ChrominanceNoiseReduction' => { + PrintConv => { + 'High' => 'Hoog', + 'Low' => 'Laag', + 'Off' => 'Uit', + }, + }, + 'City' => 'Plaats', + 'ClassifyState' => 'Rangschik status', + 'CodedCharacterSet' => 'Gecodeerde character set', + 'ColorAberrationControl' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ColorAdjustmentMode' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ColorBalanceAdj' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ColorBooster' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ColorEffect' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'ColorFilter' => { + Description => 'Kleurfilter', + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'ColorMode' => { + Description => 'Instellingen', + PrintConv => { + 'Autumn Leaves' => 'Herfstbladeren', + 'B&W' => 'Zwart-wit', + 'Clear' => 'Doorzichtig', + 'Deep' => 'Diep', + 'Evening' => 'Avond', + 'Landscape' => 'Landschap', + 'Light' => 'Licht', + 'Neutral' => 'Neutraal', + 'Night View' => 'Nacht', + 'Night View/Portrait' => 'Nachtportret', + 'Normal' => 'Normaal', + 'Off' => 'Uit', + 'Portrait' => 'Portret', + 'Standard' => 'Standaard', + 'Sunset' => 'Zonsondergang', + 'Vivid' => 'Levendige kleuren', + }, + }, + 'ColorMoireReduction' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ColorMoireReductionMode' => { + PrintConv => { + 'High' => 'Hoog', + 'Low' => 'Laag', + 'Off' => 'Uit', + }, + }, + 'ColorSpace' => { + Description => 'Kleur ruimte', + PrintConv => { + 'ICC Profile' => 'ICC-profiel', + 'Uncalibrated' => 'Niet vastgelegd', + }, + }, + 'ColorSpaceData' => 'Gegevenskleurenruimte', + 'ColorTable' => 'Kleur tabel', + 'ColorTemperature' => 'Kleurtemperatuur', + 'ColorTone' => { + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'CommandDials' => { + Description => 'Instelschijven', + PrintConv => { + 'Reversed (Main Aperture, Sub Shutter)' => 'Verwissel hoofd/sec.', + 'Standard (Main Shutter, Sub Aperture)' => 'Standaard', + }, + }, + 'CommandDialsApertureSetting' => { + Description => 'Functie instelschijven inst. Instellen diafragma', + PrintConv => { + 'Aperture Ring' => 'Diafragmaring', + 'Sub-command Dial' => 'Secundaire instelschijf', + }, + }, + 'CommandDialsChangeMainSub' => { + Description => 'Functie instelschijven inst. Verwissel hoofd/secundair', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'CommandDialsMenuAndPlayback' => { + Description => 'Functie instelschijven inst. Menu’s en weergave', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'CommandDialsReverseRotation' => { + Description => 'Functie instelschijven inst. Rotatie omkeren', + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'CommanderChannel' => 'Commanderstand Kanaal', + 'CommanderGroupAManualOutput' => 'Commanderstand Groep A M Corrct', + 'CommanderGroupAMode' => { + Description => 'Commanderstand Groep A Stand', + PrintConv => { + 'Manual' => 'Handmatig', + 'Off' => 'Uit', + 'TTL' => 'DDL', + }, + }, + 'CommanderGroupA_TTL-AAComp' => 'Commanderstand Groep A DDL/AA Corrct', + 'CommanderGroupBManualOutput' => 'Commanderstand Groep B M Corrct', + 'CommanderGroupBMode' => { + Description => 'Commanderstand Groep B Stand', + PrintConv => { + 'Manual' => 'Handmatig', + 'Off' => 'Uit', + 'TTL' => 'DDL', + }, + }, + 'CommanderGroupB_TTL-AAComp' => 'Commanderstand Groep B DDL/AA Corrct', + 'CommanderInternalFlash' => { + Description => 'Commanderstand Ingb. flitsr Stand', + PrintConv => { + 'Manual' => 'Handmatig', + 'Off' => 'Uit', + 'TTL' => 'DDL', + }, + }, + 'CommanderInternalManualOutput' => 'Commanderstand Ingb. flitsr M Corrct', + 'CommanderInternalTTLComp' => 'Commanderstand Ingb. flitsr DDL Corrct', + 'Comment' => 'Kommentaar', + 'Compilation' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'ComponentsConfiguration' => 'Betekenis van elke component', + 'CompressedBitsPerPixel' => 'Afbeelding compressie modus', + 'Compression' => { + Description => 'Compressie schema', + PrintConv => { + 'JPEG' => 'JPEG-compressie', + 'JPEG (old-style)' => 'JPEG (oude versie)', + 'Kodak DCR Compressed' => 'Kodak DCR gcomprimeerd', + 'Kodak KDC Compressed' => 'Kodak KDC gecomprimeerd', + 'Next' => 'NeXT 2-Bit codering', + 'Nikon NEF Compressed' => 'Nikon NEF gecomprimeerd', + 'None' => 'Geen', + 'Pentax PEF Compressed' => 'Pentax PEF gecomprimeerd', + 'SGILog' => 'SGI 32-Bit Log Luminance gecodeerd', + 'SGILog24' => 'SGI 24-Bit Log Luminance gecodeerd', + 'Sony ARW Compressed' => 'Sony ARW gecomprimeerd', + 'Thunderscan' => 'ThunderScan 4-Bit codering', + 'Uncompressed' => 'Niet gecomprimeerd', + }, + }, + 'CompressionType' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'ConnectionSpaceIlluminant' => 'Witpunt van connectiekleurruimte', + 'ContentLocationCode' => 'Locatiecode van inhoud', + 'ContentLocationName' => 'Locatienaam van inhoud', + 'ContinuousDrive' => { + PrintConv => { + 'Continuous' => 'Continu', + }, + }, + 'Contrast' => { + Description => 'Kontrast', + PrintConv => { + 'High' => 'Hoog', + 'Low' => 'Laag', + 'Normal' => 'Normaal', + }, + }, + 'ConversionLens' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'Copyright' => 'Copyright houder', + 'CopyrightNotice' => 'Copyright vermelding', + 'CopyrightStatus' => { + PrintConv => { + 'Unknown' => 'Onbekend', + }, + }, + 'Country' => 'Land', + 'Country-PrimaryLocationCode' => 'ISO landcode', + 'Country-PrimaryLocationName' => 'Land', + 'CreateDate' => 'Datum van de originele data generatie', + 'CreationDate' => 'Opname datum', + 'Creator' => 'Maker', + 'CreatorAddress' => 'Maker - Adres', + 'CreatorCity' => 'Maker - Plaats', + 'CreatorCountry' => 'Maker - Land', + 'CreatorPostalCode' => 'Maker - Postcode', + 'CreatorRegion' => 'Maker - Provincie', + 'CreatorWorkEmail' => 'Maker - E-mail', + 'CreatorWorkTelephone' => 'Maker - Telefoonnummer', + 'CreatorWorkURL' => 'Maker - Website(s)', + 'Credit' => 'Leverancier', + 'CropActive' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'Curves' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'CustomRendered' => { + Description => 'Gebruiker gedefineerde beeldverwerking', + PrintConv => { + 'Custom' => 'Gebruiker gedefineerd proces', + 'Normal' => 'Standaard proces', + }, + }, + 'D-LightingHQ' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'D-LightingHQSelected' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'D-LightingHS' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'DataImprint' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'DateCreated' => 'Opnamedatum', + 'DateSent' => 'Datum van zenden', + 'DateStampMode' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'DateTime' => 'Datum bestand wijziging', + 'DateTimeOriginal' => 'Datum van de originele data generatie', + 'DaylightSavings' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'Description' => 'Beschrijving', + 'Destination' => 'Bestemming', + 'DestinationDST' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'DeviceAttributes' => 'Apparaateigenschappen', + 'DeviceManufacturer' => 'Apparaatproducent', + 'DeviceMfgDesc' => 'Apparaatproducent kenmerk', + 'DeviceModel' => 'Apparaatmodel', + 'DeviceModelDesc' => 'Apparaatmodel kenmerk', + 'DeviceSettingDescription' => 'Toestelinstellingen', + 'DialDirectionTvAv' => { + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'DigitalCreationDate' => 'Digitale opnamedatum', + 'DigitalCreationTime' => 'Digitaal opnametijdstip', + 'DigitalZoom' => { + Description => 'Digitaal zoomen', + PrintConv => { + 'None' => 'Geen', + 'Off' => 'Uit', + }, + }, + 'DigitalZoomOn' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'DigitalZoomRatio' => 'Digitale zoom factor', + 'Directory' => 'Plaats van het bestand', + 'DisplaySize' => { + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'DisplayXResolutionUnit' => { + PrintConv => { + 'um' => 'µm (micrometer)', + }, + }, + 'DisplayYResolutionUnit' => { + PrintConv => { + 'um' => 'µm (micrometer)', + }, + }, + 'DistortionCorrection' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'DistortionCorrection2' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'DjVuVersion' => 'DjVu versie', + 'DocumentHistory' => 'Documentgeschiedenis', + 'DocumentName' => 'Document naam', + 'DocumentNotes' => 'Documentopmerkingen', + 'DriveMode' => { + Description => 'Ontspannermodus', + PrintConv => { + 'Continuous' => 'Continu', + 'Continuous Shooting' => 'Continu', + 'Off' => 'Uit', + 'Self-timer' => 'Zelfontspanner', + 'Self-timer Operation' => 'Zelfontspanner', + 'Single' => 'Enkel beeld', + 'Single Frame' => 'Enkel beeld', + 'Single Shot' => 'Enkel beeld', + 'Single-frame Shooting' => 'Enkel beeld', + }, + }, + 'DynamicAFArea' => { + Description => 'Dynamisch AF-veld', + PrintConv => { + '21 Points' => '21 punten', + '51 Points' => '51 punten', + '51 Points (3D-tracking)' => '51 punten (3D-tracking)', + '9 Points' => '9 punten', + }, + }, + 'DynamicRange' => { + PrintConv => { + 'Standard' => 'Standaard', + }, + }, + 'DynamicRangeExpansion' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'DynamicRangeOptimizer' => { + Description => 'Dyn.-bereikoptim', + PrintConv => { + 'Advanced Auto' => 'Geavancrd Auto', + 'Advanced Lv1' => 'Geavanceerd-1', + 'Advanced Lv2' => 'Geavanceerd-2', + 'Advanced Lv3' => 'Geavanceerd-3', + 'Advanced Lv4' => 'Geavanceerd-4', + 'Advanced Lv5' => 'Geavanceerd-5', + 'Auto' => 'Automatisch', + 'Off' => 'Uit', + 'Standard' => 'Standaard', + }, + }, + 'ETTLII' => { + PrintConv => { + 'Average' => 'Gemiddeld', + }, + }, + 'EVStepSize' => { + Description => 'LW stapgrootte', + PrintConv => { + '1/2 EV' => '1/2 stop', + '1/3 EV' => '1/3 stop', + }, + }, + 'EasyExposureCompensation' => { + Description => 'Eenv. belichtingscorrectie', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + 'On (auto reset)' => 'Aan (autoherstel)', + }, + }, + 'EasyMode' => { + PrintConv => { + 'Landscape' => 'Landschap', + 'Manual' => 'Handmatig', + 'Night' => 'Nachtscene', + 'Portrait' => 'Portret', + }, + }, + 'EdgeNoiseReduction' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'EditStatus' => 'Bewerkingsstatus', + 'EditorialUpdate' => { + Description => 'Redactionele bewerking', + PrintConv => { + 'Additional language' => 'Extra taal', + }, + }, + 'Emphasis' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'EnhanceDarkTones' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'Enhancement' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'EnvelopeNumber' => 'Basisdatanummer', + 'EnvelopePriority' => { + Description => 'Prioriteit', + PrintConv => { + '0 (reserved)' => '0 (Gereserveerd voor toekomstig gebruik)', + '1 (most urgent)' => '1 (Meest belangrijk)', + '5 (normal urgency)' => '5 (Normaal)', + '8 (least urgent)' => '8 (Minst belangrijk)', + '9 (user-defined priority)' => '9 (Door gebruiker aangegeven prioriteit)', + }, + }, + 'EnvelopeRecordVersion' => 'Recordversie', + 'ExifCameraInfo' => 'Exif Camera-informatie', + 'ExifImageHeight' => 'Afbeelding hoogte', + 'ExifImageWidth' => 'Afbeelding breedte', + 'ExifOffset' => 'Exif IFD-wijzer', + 'ExifToolVersion' => 'ExifTool versie', + 'ExifVersion' => 'Exif versie', + 'ExpandFilm' => 'Breid film uit', + 'ExpandFilterLens' => 'Breid filterlens uit', + 'ExpandFlashLamp' => 'Breid flitser uit', + 'ExpandLens' => 'Breid objectief', + 'ExpandScanner' => 'Breid scanner uit', + 'ExpandSoftware' => 'Breid software uit', + 'ExpirationDate' => 'Verloopdatum', + 'ExpirationTime' => 'Verlooptijdstip', + 'ExposureCompStepSize' => { + Description => 'Stapgrootte belichtingscorr.', + PrintConv => { + '1 EV' => '1 stop', + '1/2 EV' => '1/2 stop', + '1/3 EV' => '1/3 stop', + }, + }, + 'ExposureCompensation' => 'Belichtingscorrectie', + 'ExposureControlStepSize' => { + Description => 'Stapgrootte inst. belichting', + PrintConv => { + '1 EV' => '1 stop', + '1/2 EV' => '1/2 stop', + '1/3 EV' => '1/3 stop', + }, + }, + 'ExposureDelayMode' => { + Description => 'Spiegelvoorontspanning', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ExposureIndex' => 'Belichtingsindex', + 'ExposureLevelIncrements' => { + Description => 'Stapgrootte inst. belichting', + PrintConv => { + '1/2 Stop' => '1/2 stop', + '1/3 Stop' => '1/3 stop', + }, + }, + 'ExposureMode' => { + Description => 'Belichting modus', + PrintConv => { + 'Aperture Priority' => 'Diafragmaprioriteit', + 'Aperture-priority AE' => 'Diafragmaprioriteit', + 'Auto' => 'Automatische belichting', + 'Auto bracket' => 'Belichting serie', + 'Landscape' => 'Landschap', + 'Manual' => 'Handmatige belichting', + 'Portrait' => 'Portret', + 'Shutter Priority' => 'Sluiterprioriteit', + 'Shutter speed priority AE' => 'Sluiterprioriteit', + }, + }, + 'ExposureModeInManual' => { + PrintConv => { + 'Center-weighted average' => 'Centrum gemiddelde', + 'Partial metering' => 'Gedeelte', + }, + }, + 'ExposureProgram' => { + Description => 'Belichtingsprogramma', + PrintConv => { + 'Action (High speed)' => 'Actie programma (georiënteerd op snelle sluitertijden)', + 'Aperture Priority' => 'Diafragmaprioriteit', + 'Aperture-priority AE' => 'Diafragmaprioriteit', + 'Creative (Slow speed)' => 'Creatief programma (georiënteerd op scherptediepte)', + 'Landscape' => 'Landschap modus', + 'Manual' => 'Handmatig', + 'Not Defined' => 'Niet gedefinieerd', + 'Portrait' => 'Portret modus', + 'Program AE' => 'Normaal programma', + 'Shutter Priority' => 'Sluiterprioriteit', + 'Shutter speed priority AE' => 'Sluiterprioriteit', + }, + }, + 'ExposureTime' => 'Belichtingstijd', + 'ExposureTime2' => 'Belichtingstijd 2', + 'ExtendedWBDetect' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ExternalFlash' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ExternalFlashBounce' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'ExternalFlashMode' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'ExtraSamples' => 'Extra componenten', + 'FNumber' => 'F waarde', + 'FaceOrientation' => { + PrintConv => { + 'Horizontal (normal)' => '0° (boven/links)', + 'Rotate 180' => '180° (onder/rechts)', + 'Rotate 270 CW' => 'Draai 270° met de klok mee', + 'Rotate 90 CW' => '90° tegen de klok in (rechts/boven)', + }, + }, + 'FastSeek' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'FaxProfile' => { + PrintConv => { + 'Unknown' => 'Onbekend', + }, + }, + 'FaxRecvParams' => 'Fax ontvangst parameters', + 'FaxRecvTime' => 'Fax ontvangst tijd', + 'FaxSubAddress' => 'Fax sub adres', + 'FileFormat' => 'Fileformaat', + 'FileModifyDate' => 'Datum actualisering', + 'FileName' => 'Bestandnaam', + 'FileNumberMemory' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'FileNumberSequence' => { + Description => 'Opeenvolgende nummering', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'FileSize' => 'Bestandgrootte', + 'FileSource' => { + Description => 'Bestand bron', + PrintConv => { + 'Digital Camera' => 'Digitale camera', + 'Film Scanner' => 'Film scanner', + 'Reflection Print Scanner' => 'Scanner', + }, + }, + 'FileType' => 'Bestandtype', + 'FileVersion' => 'Fileformaat versie', + 'Filename' => 'Bestandnaam', + 'FillOrder' => { + Description => 'Vul volgorde', + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'Filter' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'FilterEffect' => { + PrintConv => { + 'None' => 'Geen', + 'Off' => 'Uit', + }, + }, + 'FilterEffectMonochrome' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'FinderDisplayDuringExposure' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'FineTuneOptCenterWeighted' => 'Fijnafst. voor opt. belichting Centrumgericht', + 'FineTuneOptMatrixMetering' => 'Fijnafst. voor opt. belichting Matrixmeting', + 'FineTuneOptSpotMetering' => 'Fijnafst. voor opt. belichting Spotmeting', + 'FixtureIdentifier' => 'Kenmerk', + 'Flash' => { + Description => 'Flits', + PrintConv => { + 'Auto, Did not fire' => 'Flits werd niet ontstoken, automodus', + 'Auto, Did not fire, Red-eye reduction' => 'Flits werd niet ontstoken, rode ogen reductie', + 'Auto, Fired' => 'Flits werd ontstoken, automodus', + 'Auto, Fired, Red-eye reduction' => 'Flits werd ontstoken, automodus, rode ogen reductie', + 'Auto, Fired, Red-eye reduction, Return detected' => 'Flits werd ontstoken, automodus, gereflecteerd flitslicht, rode ogen reductie', + 'Auto, Fired, Red-eye reduction, Return not detected' => 'Flits werd ontstoken, automodus, geen gereflecteerd flitslicht, rode ogen reductie', + 'Auto, Fired, Return detected' => 'Flits werd ontstoken, automodus, gereflecteerd flitslicht', + 'Auto, Fired, Return not detected' => 'Flits werd ontstoken, automodus, geen gereflecteerd flitslicht', + 'Did not fire' => 'Geen flits', + 'Fired' => 'Flits afgevuurd', + 'Fired, Red-eye reduction' => 'Flits werd ontstoken, Rode ogen reductie', + 'Fired, Red-eye reduction, Return detected' => 'Flits werd ontstoken, rode ogen reductie, gereflecteerd flitslicht', + 'Fired, Red-eye reduction, Return not detected' => 'Flits werd ontstoken, rode oen reductie, geen gereflecteerd flitslicht', + 'Fired, Return detected' => 'Gereflecteerd flitslicht gedetecteerd', + 'Fired, Return not detected' => 'Geen gereflecteerd flitslicht gedetecteerd', + 'No Flash' => 'Geen flits', + 'No flash function' => 'Geen flits functie', + 'Off' => 'Uit', + 'Off, Did not fire' => 'Flits werd niet ontstoken, flits onderdruk modus', + 'Off, Did not fire, Return not detected' => 'Gedeactiveerd, flits werd niet ontstoken, geen gereflecteerd flitslicht', + 'Off, No flash function' => 'Gedeactiveerd, geen flits functie', + 'Off, Red-eye reduction' => 'Gedeactiveerd, rode ogen reductie', + 'On' => 'Aan', + 'On, Did not fire' => 'Aan, flits werd niet ontstoken', + 'On, Fired' => 'Flits werd ontstoken, flits afdwing modus', + 'On, Red-eye reduction' => 'Flits werd ontstoken, flits afdwing modus, rode ogen reductie', + 'On, Red-eye reduction, Return detected' => 'Flits werd ontstoken, flits afdwing modus, rode ogen reductie, gereflecteerd flitslicht', + 'On, Red-eye reduction, Return not detected' => 'Flits werd ontstoken, flits afdwing modus, rode ogen reductie, geen gereflecteerd flitslicht', + 'On, Return detected' => 'Flits werd ontstoken, flits afdwing modus, gereflecteerd flitslicht gedetecteerd', + 'On, Return not detected' => 'Flits werd ontstoken, flits afdwing modus, geen gereflecteerd flitslicht gedetecteerd', + }, + }, + 'FlashCommanderMode' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'FlashCompensation' => 'Flitscorrectie', + 'FlashControlMode' => { + PrintConv => { + 'Manual' => 'Handmatig', + 'Off' => 'Uit', + 'Repeating Flash' => 'Stroboscopisch flitsen', + }, + }, + 'FlashDevice' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'FlashEnergy' => 'Flits energie', + 'FlashExposureComp' => 'Flitscompensatie', + 'FlashExposureLock' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'FlashFired' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'FlashGroupAControlMode' => { + PrintConv => { + 'Manual' => 'Handmatig', + 'Off' => 'Uit', + 'Repeating Flash' => 'Stroboscopisch flitsen', + }, + }, + 'FlashGroupBControlMode' => { + PrintConv => { + 'Manual' => 'Handmatig', + 'Off' => 'Uit', + 'Repeating Flash' => 'Stroboscopisch flitsen', + }, + }, + 'FlashGroupCControlMode' => { + PrintConv => { + 'Manual' => 'Handmatig', + 'Off' => 'Uit', + 'Repeating Flash' => 'Stroboscopisch flitsen', + }, + }, + 'FlashIntensity' => { + PrintConv => { + 'High' => 'Hoog', + 'Normal' => 'Normaal', + }, + }, + 'FlashLevel' => 'Flitscorrectie', + 'FlashMode' => { + PrintConv => { + 'Auto' => 'Automatisch', + 'Normal' => 'Normaal', + 'Off' => 'Uit', + 'On' => 'Aan', + 'Unknown' => 'Onbekend', + }, + }, + 'FlashModel' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'FlashOptions' => { + PrintConv => { + 'Auto' => 'Automatisch', + 'Normal' => 'Normaal', + }, + }, + 'FlashOptions2' => { + PrintConv => { + 'Auto' => 'Automatisch', + 'Normal' => 'Normaal', + }, + }, + 'FlashShutterSpeed' => 'Langste sluitertijd bij flits', + 'FlashStatus' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'FlashSyncSpeed' => 'Flitssynchronisatie snelheid', + 'FlashSyncSpeedAv' => { + PrintConv => { + 'Auto' => 'Automatisch', + }, + }, + 'FlashType' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'FlashWarning' => { + Description => 'Flitswaarschuwing', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'FlashpixVersion' => 'Ondersteunde Flashpix versie', + 'FlickerReduce' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'FlipHorizontal' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'FocalLength' => 'Brandpuntafstand', + 'FocalLength35efl' => 'Brandpuntafstand', + 'FocalLengthIn35mmFormat' => 'Brandpuntafstand in 35 mm kleinbeeld formaat', + 'FocalPlaneResolutionUnit' => { + Description => 'Sensor resolutie eenheid', + PrintConv => { + 'None' => 'Geen', + 'inches' => 'inch', + 'um' => 'µm (micrometer)', + }, + }, + 'FocalPlaneXResolution' => 'Horizontale sensor resolutie', + 'FocalPlaneYResolution' => 'Verticale sensor resolutie', + 'Focus' => { + Description => 'Scherpstelling', + PrintConv => { + 'Manual' => 'Handmatig', + }, + }, + 'FocusArea' => 'Scherpstelveld', + 'FocusAreaSelection' => { + Description => 'Doorloop scherpstelpunt', + PrintConv => { + 'No Wrap' => 'Geen doorloop', + 'Wrap' => 'Doorloop', + }, + }, + 'FocusContinuous' => { + PrintConv => { + 'Continuous' => 'Continu', + 'Manual' => 'Handmatig', + }, + }, + 'FocusMode' => { + Description => 'Focus modus', + PrintConv => { + 'Auto' => 'Automatisch', + 'Continuous' => 'Continu', + 'Manual' => 'Handmatig', + 'Normal' => 'Normaal', + }, + }, + 'FocusMode2' => { + PrintConv => { + 'Manual' => 'Handmatig', + }, + }, + 'FocusModeSetting' => { + Description => 'Scherpstelstand', + PrintConv => { + 'AF-A' => 'Automatische AF', + 'AF-C' => 'Continue AF', + 'AF-S' => 'Enkelvoudige AF', + 'Manual' => 'Handmatig', + }, + }, + 'FocusPointWrap' => { + Description => 'Doorloop scherpstelpunt', + PrintConv => { + 'No Wrap' => 'Geen doorloop', + 'Wrap' => 'Doorloop', + }, + }, + 'FocusRange' => { + PrintConv => { + 'Auto' => 'Automatisch', + 'Manual' => 'Handmatig', + 'Normal' => 'Normaal', + }, + }, + 'FocusTrackingLockOn' => { + Description => 'Focus Tracking met Lock-On', + PrintConv => { + 'Long' => 'Lang', + 'Normal' => 'Normaal', + 'Off' => 'Uit', + 'Short' => 'Kort', + }, + }, + 'FrameRate' => 'Beeldwisselsnelheid', + 'FrameSize' => 'Beeldformaat', + 'FreeByteCounts' => 'Aantal bytes van het lege databereik', + 'FreeOffsets' => 'Vrije data posities', + 'FujiFlashMode' => { + PrintConv => { + 'Auto' => 'Automatisch', + }, + }, + 'FunctionButton' => { + Description => 'FUNC. knop', + PrintConv => { + 'AF-area Mode' => 'AF-veldstand', + 'Center AF Area' => 'Centrale AF-veld', + 'Center-weighted' => 'Centrumgericht', + 'FV Lock' => 'FV-vergrendeling', + 'Flash Off' => 'Flitser uit', + 'Framing Grid' => 'Rasterweergave', + 'ISO Display' => 'ISO-weergave', + 'Matrix Metering' => 'Matrixmeting', + 'Spot Metering' => 'Spotmeting', + }, + }, + 'GIFVersion' => 'GIF versie', + 'GPSAltitude' => 'Hoogte', + 'GPSAltitudeRef' => { + Description => 'GPS hoogte - referentie', + PrintConv => { + 'Above Sea Level' => 'Boven zeeniveau', + 'Below Sea Level' => 'Onder zeeniveau', + }, + }, + 'GPSAreaInformation' => 'GPS naam van het gebied', + 'GPSDOP' => 'GPS meetnauwkeurigheid', + 'GPSDateStamp' => 'GPS UTC datum', + 'GPSDateTime' => 'GPS UTC datum en tijd', + 'GPSDestBearing' => 'GPS peiling van bestemming', + 'GPSDestBearingRef' => { + Description => 'GPS peiling van bestemming - referentie', + PrintConv => { + 'Magnetic North' => 'Magnetische noorden', + 'True North' => 'Geografische noorden', + }, + }, + 'GPSDestDistance' => 'GPS afstand tot bestemming', + 'GPSDestDistanceRef' => { + Description => 'GPS afstand tot bestemming - referentie', + PrintConv => { + 'Miles' => 'Engelse mijlen', + 'Nautical Miles' => 'Zeemijlen', + }, + }, + 'GPSDestLatitude' => 'GPS breedtegraad van bestemming', + 'GPSDestLatitudeRef' => { + Description => 'GPS breedtegraad van bestemming - referentie', + PrintConv => { + 'North' => 'Noorderbreedte', + 'South' => 'Zuiderbreedte', + }, + }, + 'GPSDestLongitude' => 'GPS lengtegraad van bestemming', + 'GPSDestLongitudeRef' => { + Description => 'GPS lengtegraad van bestemming - referentie', + PrintConv => { + 'East' => 'Oosterlengte', + 'West' => 'Westerlengte', + }, + }, + 'GPSDifferential' => { + Description => 'GPS differentiaal correctie', + PrintConv => { + 'Differential Corrected' => 'Met differentiaal correctie', + 'No Correction' => 'Zonder differentiaal correctie', + }, + }, + 'GPSImgDirection' => 'GPS peiling van de afbeelding', + 'GPSImgDirectionRef' => { + Description => 'GPS peiling van de afbeelding - referentie', + PrintConv => { + 'Magnetic North' => 'Magnetische noorden', + 'True North' => 'Geografische noorden', + }, + }, + 'GPSInfo' => 'GPS Info', + 'GPSLatitude' => 'GPS breedtegraad', + 'GPSLatitudeRef' => { + Description => 'GPS breedtegraad - referentie', + PrintConv => { + 'North' => 'Noorderbreedte', + 'South' => 'Zuiderbreedte', + }, + }, + 'GPSLongitude' => 'GPS lengtegraad', + 'GPSLongitudeRef' => { + Description => 'GPS lengtegraad - referentie', + PrintConv => { + 'East' => 'Oosterlengte', + 'West' => 'Westerlengte', + }, + }, + 'GPSMapDatum' => 'GPS geodetisch datum', + 'GPSMeasureMode' => { + Description => 'GPS meetmethode', + PrintConv => { + '2-D' => 'Tweedimensionale meting', + '2-Dimensional' => 'Tweedimensionale meting', + '2-Dimensional Measurement' => 'Tweedimensionale meting', + '3-D' => 'Driedimensionale meting', + '3-Dimensional' => 'Driedimensionale meting', + '3-Dimensional Measurement' => 'Driedimensionale meting', + }, + }, + 'GPSPosition' => 'GPS positie', + 'GPSProcessingMethod' => 'GPS verwerkingsmethode', + 'GPSSatellites' => 'GPS satellieten gebruikt voor de meting', + 'GPSSpeed' => 'GPS ontvanger bewegingssnelheid', + 'GPSSpeedRef' => { + Description => 'GPS ontvanger bewegingssnelheid - referentie', + PrintConv => { + 'km/h' => 'Kilometer per uur', + 'knots' => 'Knopen', + 'mph' => 'Mijl per uur', + }, + }, + 'GPSStatus' => { + Description => 'GPS ontvanger status', + PrintConv => { + 'Measurement Active' => 'Actuele meting beschikbaar', + 'Measurement Void' => 'Actuele meting niet beschikbaar', + }, + }, + 'GPSTimeStamp' => 'GPS UTC tijd', + 'GPSTrack' => 'GPS ontvanger bewegingsrichting', + 'GPSTrackRef' => { + Description => 'GPS ontvanger bewegingsrichting - referentie', + PrintConv => { + 'Magnetic North' => 'Magnetische noorden', + 'True North' => 'Geografische noorden', + }, + }, + 'GPSVersionID' => 'GPS versie ID', + 'GainControl' => { + Description => 'Belichtingsversterking', + PrintConv => { + 'High gain down' => 'Hoge helderheidsverminderring', + 'High gain up' => 'Hoge helderheidsvesterking', + 'Low gain down' => 'Kleine helderheidsverminderring', + 'Low gain up' => 'Kleine helderheidsvesterking', + 'None' => 'Geen', + }, + }, + 'Gapless' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'Gradation' => 'Levendig', + 'GrayResponseUnit' => { + PrintConv => { + '0.0001' => 'Nummer stelt een 1000ste van een eenheid voor', + '0.001' => 'Nummer stelt een 100ste van een eenheid voor', + '0.1' => 'Nummer stelt een 10de van een eenheid voor', + '1e-05' => 'Nummer stelt een 10000ste van een eenheid voor', + '1e-06' => 'Nummer stelt een 100000ste van een eenheid voor', + }, + }, + 'GrayTRC' => 'Grijze toon reproductie curve', + 'GreenMatrixColumn' => 'Groene matrixkolom', + 'GreenTRC' => 'Groene toon reproductie curve', + 'GridDisplay' => { + Description => 'Rasterweergave in zoeker', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'HDR' => { + Description => 'Auto HDR', + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'Headline' => 'Opschrift', + 'HeightResolution' => 'Beeldresolutie verticaal', + 'HighISONoiseReduction' => { + Description => 'NR bij hoge-ISO', + PrintConv => { + 'Auto' => 'Automatisch', + 'High' => 'Hi', + 'Low' => 'Laag', + 'Normal' => 'Normaal', + 'Off' => 'Uit', + 'On' => 'Aan', + 'Standard' => 'Standaard', + }, + }, + 'HighlightTonePriority' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'HometownDST' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'Hue' => 'Kleurtoon', + 'ICCProfile' => 'ICC Profiel', + 'IPTC-NAA' => 'IPTC-NAA metadata', + 'ISO' => 'ISO gevoeligheid', + 'ISOAuto' => 'ISO auto', + 'ISODisplay' => 'ISO-weergave', + 'ISOExpansion' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ISOExpansion2' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'ISOSetting' => { + PrintConv => { + 'Auto' => 'Automatisch', + 'Manual' => 'Handmatig', + }, + }, + 'ISOSpeedExpansion' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'ISOSpeedIncrements' => { + Description => 'ISO-stapgrootte', + PrintConv => { + '1 Stop' => '1 stop', + '1/3 Stop' => '1/3 stop', + }, + }, + 'ISOStepSize' => { + Description => 'ISO-stapgrootte', + PrintConv => { + '1 EV' => '1 stop', + '1/2 EV' => '1/2 stop', + '1/3 EV' => '1/3 stop', + }, + }, + 'Illumination' => { + Description => 'Verlichting', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ImageAuthentication' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'ImageByteCount' => 'Aantal beeldgegevens in bytes', + 'ImageColorIndicator' => 'Afbeelding kleur indicator', + 'ImageColorValue' => 'Afbeelding kleur waarde', + 'ImageDataDiscard' => { + Description => 'Afgedankte beeldgegevens', + PrintConv => { + 'Flexbits Discarded' => 'Afgedankte flexbits', + 'Full Resolution' => 'Volledige resolutie', + 'HighPass Frequency Data Discarded' => 'Afgedankte hoogdoorlaat frequentiegegevens', + 'Highpass and LowPass Frequency Data Discarded' => 'Afgedankte hoogdoorlaat en laagdoorlaat frequentiegegevens', + }, + }, + 'ImageDescription' => 'Afbeelding beschrijving', + 'ImageDustOff' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ImageHeight' => 'Afbeeldingshoogte', + 'ImageHistory' => 'Afbeelding geschiedenis', + 'ImageNumber' => 'Afbeelding nummer', + 'ImageOffset' => 'Beeldverplaatsing', + 'ImageOrientation' => { + Description => 'Foto oriëntatie', + PrintConv => { + 'Landscape' => 'Landschap', + 'Portrait' => 'Portret', + 'Square' => 'Vierkant', + }, + }, + 'ImageQuality' => { + Description => 'Bldkwaliteit', + PrintConv => { + 'High' => 'Hoog', + 'Normal' => 'Normaal', + }, + }, + 'ImageQuality2' => 'Bldkwaliteit 2', + 'ImageReview' => { + Description => 'Beeld terugspelen', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ImageReviewTime' => 'Timers uit Beeld terugspelen', + 'ImageRotated' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'ImageSize' => 'Beeldformaat', + 'ImageStabilization' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ImageTone' => { + PrintConv => { + 'Landscape' => 'Landschap', + 'Portrait' => 'Portret', + }, + }, + 'ImageType' => 'Beeldtype', + 'ImageUniqueID' => 'Uniek afbeeldings ID', + 'ImageWidth' => 'Afbeeldingsbreedte', + 'InitialZoomSetting' => { + Description => 'Aanvankelijke zoominstelling', + PrintConv => { + 'High Magnification' => 'Hoge zoom', + 'Low Magnification' => 'Lage zoom', + 'Medium Magnification' => 'Gemiddelde zoom', + }, + }, + 'Instructions' => 'Instructies', + 'IntellectualGenre' => 'Genre', + 'IntensityStereo' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'InternalFlash' => { + Description => 'Flitssturing ingeb. flitser', + PrintConv => { + 'Commander Mode' => 'Commanderstand', + 'Fired' => 'Flits afgevuurd', + 'Manual' => 'Handmatig', + 'No' => 'Geen flits', + 'Off' => 'Uit', + 'On' => 'Aan', + 'Repeating Flash' => 'Stroboscopisch flitsen', + 'TTL' => 'DDL', + }, + }, + 'InternalFlashMode' => { + PrintConv => { + 'On' => 'Aan', + }, + }, + 'InteropIndex' => { + Description => 'Interoperabiliteits Identificatie', + PrintConv => { + 'R03 - DCF option file (Adobe RGB)' => 'R03: DCF Optie formaat (Adobe RGB)', + 'R98 - DCF basic file (sRGB)' => 'R98: DCF Basis formaat (sRGB)', + 'THM - DCF thumbnail file' => 'THM: DCF Miniatuur formaat', + }, + }, + 'InteropOffset' => 'Interoperabiliteit-tag', + 'InteropVersion' => 'Interoperabiliteits versie', + 'JFIFVersion' => 'JFIF versie', + 'JPEGQuality' => { + Description => 'Beeldkwaliteit', + PrintConv => { + 'Extra Fine' => 'Extra fijn', + 'Fine' => 'Fijn', + 'Standard' => 'Normaal', + }, + }, + 'JobID' => 'ID van baan', + 'Keyword' => 'Trefwoorden', + 'Keywords' => 'Trefwoord', + 'LCDIllumination' => { + Description => 'LCD-verlichting', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'LCDIlluminationDuringBulb' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'LCHEditor' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'LanguageIdentifier' => 'Taalherkenning', + 'Lens' => 'Objectief', + 'LensInfo' => 'Lensgegevens', + 'LicenseType' => { + PrintConv => { + 'Unknown' => 'Onbekend', + }, + }, + 'LightSource' => { + Description => 'Lichtbron', + PrintConv => { + 'Cloudy' => 'Bewolkt', + 'Cool White Fluorescent' => 'Koel wit TL-licht', + 'Day White Fluorescent' => 'Daglicht wit TL-licht', + 'Daylight' => 'Daglicht', + 'Daylight Fluorescent' => 'Daglicht TL-licht', + 'Fine Weather' => 'Onbewolkt', + 'Flash' => 'Flits', + 'Fluorescent' => 'Fluoresceren', + 'ISO Studio Tungsten' => 'ISO studio kunstlicht (gloeilamp)', + 'Other' => 'Andere lichtbron', + 'Shade' => 'Schaduw', + 'Standard Light A' => 'Standaard licht A', + 'Standard Light B' => 'Standaard licht B', + 'Standard Light C' => 'Standaard licht C', + 'Tungsten (Incandescent)' => 'Kunstlicht (gloeilamp)', + 'Unknown' => 'Onbekend', + 'Warm White Fluorescent' => 'Warm wit TL-licht', + 'White Fluorescent' => 'Wit TL-licht', + }, + }, + 'LightSourceSpecial' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'Lightness' => 'Helderheid', + 'Lit' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'LiveViewShooting' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'Location' => 'Lokatie', + 'LongExposureNoiseReduction' => { + Description => 'NR lang-belicht', + PrintConv => { + 'Auto' => 'Automatisch', + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'LoopStyle' => { + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'LuminanceNoiseReduction' => { + PrintConv => { + 'High' => 'Hoog', + 'Low' => 'Laag', + 'Off' => 'Uit', + }, + }, + 'MB-D10Batteries' => 'MB-D10 batterijen', + 'MB-D10BatteryType' => 'MB-D10 batterijen', + 'MB-D80Batteries' => 'MB-D80 batterijen', + 'MIEVersion' => 'MIE versie', + 'MSStereo' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'Macro' => { + PrintConv => { + 'Manual' => 'Handmatig', + 'Normal' => 'Normaal', + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'MacroMode' => { + PrintConv => { + 'Normal' => 'Normaal', + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'MainDialExposureComp' => { + Description => 'Main Dial Belichtingscorrectie', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'Make' => 'Fabrikant', + 'MakeAndModel' => 'Producent en model', + 'MakerNote' => 'Fabrikant informatie', + 'MakerNotes' => 'Wenken van de fabrikant', + 'ManualFlashOutput' => { + Description => 'Ingebouwde flitser Handmatig Sterkte', + PrintConv => { + 'Low' => 'Laag', + }, + }, + 'MasterDocumentID' => 'ID van hoofddocument', + 'MatrixMetering' => 'Matrixmeting', + 'MaxAperture' => 'Maximale lensopening', + 'MaxApertureValue' => 'Grootste diafragma', + 'MaxContinuousRelease' => 'Max. aant. continuopnamen', + 'MaxSampleValue' => 'Max sample waarde', + 'MediaBlackPoint' => 'Media zwartpunt', + 'MediaType' => { + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'MediaWhitePoint' => 'Media Witpunt', + 'Metering' => { + Description => 'Lichtmeting', + PrintConv => { + 'Center-weighted' => 'Centrumgericht', + 'Matrix' => 'Matrixmeting', + }, + }, + 'MeteringMode' => { + Description => 'Belichting meet methode', + PrintConv => { + 'Average' => 'Gemiddeld', + 'Center-weighted average' => 'Centrum gemiddelde', + 'Multi-segment' => 'Multi segment', + 'Multi-spot' => 'MultiSpot', + 'Other' => 'Andere', + 'Partial' => 'Gedeelte', + 'Unknown' => 'Onbekend', + }, + }, + 'MeteringMode2' => { + PrintConv => { + 'Multi-segment' => 'Multi segment', + }, + }, + 'MeteringMode3' => { + PrintConv => { + 'Multi-segment' => 'Multi segment', + }, + }, + 'MeteringTime' => { + Description => 'Timers uit Belichtingsmeters', + PrintConv => { + 'No Limit' => 'Altijd aan', + }, + }, + 'MinSampleValue' => 'Min sample waarde', + 'MinoltaQuality' => { + PrintConv => { + 'Normal' => 'Normaal', + 'Standard' => 'Standaard', + }, + }, + 'Model' => 'Camera model', + 'Model2' => 'Camera model (2)', + 'ModelingFlash' => { + Description => 'Instellicht', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ModifiedPictureStyle' => { + PrintConv => { + 'Landscape' => 'Landschap', + 'None' => 'Geen', + 'Portrait' => 'Portret', + 'Standard' => 'Standaard', + }, + }, + 'ModifiedSaturation' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'ModifiedSharpnessFreq' => { + PrintConv => { + 'High' => 'Hoog', + 'Low' => 'Laag', + 'Standard' => 'Standaard', + }, + }, + 'ModifiedToneCurve' => { + PrintConv => { + 'Manual' => 'Handmatig', + 'Standard' => 'Standaard', + }, + }, + 'ModifiedWhiteBalance' => { + PrintConv => { + 'Auto' => 'Automatisch', + 'Cloudy' => 'Bewolkt', + 'Daylight' => 'Daglicht', + 'Daylight Fluorescent' => 'Daglicht TL-licht', + 'Flash' => 'Flits', + 'Fluorescent' => 'Fluoresceren', + 'Shade' => 'Schaduw', + 'Tungsten' => 'Kunstlicht (gloeilamp)', + }, + }, + 'ModifyDate' => 'Datum bestand wijziging', + 'MoireFilter' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'MonitorOffTime' => 'Monitor uit', + 'MonochromeFilterEffect' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'MonochromeLinear' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'MonochromeToningEffect' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'MultiExposureAutoGain' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'MultiExposureMode' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'MultiFrameNoiseReduction' => { + Description => 'Ruisond. Multi Frame', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'MultiSelector' => { + Description => 'Multi-selector', + PrintConv => { + 'Do Nothing' => 'Doe niets', + 'Reset Meter-off Delay' => 'Activeer lichtmeter', + }, + }, + 'MultiSelectorPlaybackMode' => { + Description => 'Centrale knop multiselector Weergavestand', + PrintConv => { + 'Choose Folder' => 'Map selecteren', + 'Thumbnail On/Off' => 'Miniatuur aan/uit', + 'View Histograms' => 'Histogrammen weergeven', + 'Zoom On/Off' => 'Zoom aan/uit', + }, + }, + 'MultiSelectorShootMode' => { + Description => 'Centrale knop multiselector Opnamestand', + PrintConv => { + 'Highlight Active Focus Point' => 'Actieve AF-punt markeren', + 'Not Used' => 'Geen functie', + 'Select Center Focus Point' => 'Middelste AF-punt selecteren', + }, + }, + 'MultipleExposureSet' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'Mute' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'MyColorMode' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'NDFilter' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'NEFCompression' => { + PrintConv => { + 'Uncompressed' => 'Niet gecomprimeerd', + }, + }, + 'NikonImageSize' => 'Beeldformaat', + 'NoMemoryCard' => { + Description => 'Geen geheugenkaart', + PrintConv => { + 'Enable Release' => 'Ontgrendel ontspanknop', + 'Release Locked' => 'Vergrendel ontspanknop', + }, + }, + 'Noise' => 'Ruis', + 'NoiseFilter' => { + PrintConv => { + 'High' => 'Hoog', + 'Low' => 'Laag', + 'Off' => 'Uit', + 'Standard' => 'Standaard', + }, + }, + 'NoiseReduction' => { + Description => 'Ruisreductie', + PrintConv => { + 'Auto' => 'Automatisch', + 'Normal' => 'Normaal', + 'Off' => 'Uit', + 'On' => 'Aan', + 'Standard' => 'Standaard', + }, + }, + 'ObjectAttributeReference' => 'Intellectuele genre', + 'ObjectCycle' => { + Description => 'Objectcyclus', + PrintConv => { + 'Both Morning and Evening' => 'Beide', + 'Evening' => 'Avond', + 'Morning' => 'Ochtend', + }, + }, + 'ObjectFileType' => { + PrintConv => { + 'None' => 'Geen', + 'Unknown' => 'Onbekend', + }, + }, + 'ObjectName' => 'Titel', + 'ObjectPreviewData' => 'Voorvertoning objectgegevens', + 'ObjectPreviewFileFormat' => 'Voorvertoning objectgegevens bestandsformaat', + 'ObjectPreviewFileVersion' => 'Voorvertoning objectgegevens bestandsformaatversie', + 'ObjectTypeReference' => 'Referentie van Object type', + 'OldSubfileType' => 'Subbestand type', + 'OneTouchWB' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'OpticalZoomMode' => { + PrintConv => { + 'Standard' => 'Standaard', + }, + }, + 'OpticalZoomOn' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'Opto-ElectricConvFactor' => 'Opto elektronische omreken factor', + 'Orientation' => { + Description => 'Oriëntatie van de afbeelding', + PrintConv => { + 'Horizontal (normal)' => '0° (boven/links)', + 'Mirror horizontal' => 'Horizontaal gespiegeld', + 'Mirror horizontal and rotate 270 CW' => 'Spiegel horizontaal en draai 270° met de klok mee', + 'Mirror horizontal and rotate 90 CW' => 'Spiegel horizontaal en draai 90° met de klok mee', + 'Mirror vertical' => 'Vertikaal gespiegeld', + 'Rotate 180' => '180° (onder/rechts)', + 'Rotate 270 CW' => 'Draai 270° met de klok mee', + 'Rotate 90 CW' => '90° tegen de klok in (rechts/boven)', + }, + }, + 'OriginalTransmissionReference' => 'Werknummer', + 'OriginatingProgram' => 'Oorspronkelijk programma', + 'OwnerID' => 'ID van eigenaar', + 'PEFVersion' => 'PEF versie', + 'Padding' => 'Plaatshouder', + 'PageName' => 'Pagina naam', + 'PageNumber' => 'Pagina nummer', + 'PhotoEffect' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'PhotoEffects' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'PhotoEffectsType' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'PhotoInfoPlayback' => { + Description => 'Functie van multi-selector', + PrintConv => { + 'Info Left-right, Playback Up-down' => 'Info <> / Foto’s', + 'Info Up-down, Playback Left-right' => 'Info / Foto’s <>', + }, + }, + 'PhotometricInterpretation' => { + Description => 'Pixel schema', + PrintConv => { + 'BlackIsZero' => 'Zwart is nul', + 'Color Filter Array' => 'CFA (Kleur Filter Matrix)', + 'Pixar LogL' => 'CIE Log2(L) (Log Luminantie)', + 'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (Log Luminantie en Chrominantie)', + 'RGB Palette' => 'RGB palet', + 'Transparency Mask' => 'Transparent masker', + 'WhiteIsZero' => 'Wit is nul', + }, + }, + 'PhotoshopFormat' => { + PrintConv => { + 'Standard' => 'Standaard', + }, + }, + 'PictureControl' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'PictureControlActive' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'PictureFinish' => { + PrintConv => { + 'Portrait' => 'Portret', + }, + }, + 'PictureMode' => { + PrintConv => { + 'Aperture-priority AE' => 'Diafragmaprioriteit', + 'Auto' => 'Automatisch', + 'Landscape' => 'Landschap', + 'Manual' => 'Handmatig', + 'Portrait' => 'Portret', + 'Shutter speed priority AE' => 'Sluiterprioriteit', + 'Standard' => 'Standaard', + }, + }, + 'PictureMode2' => { + PrintConv => { + 'Aperture Priority' => 'Diafragmaprioriteit', + 'Manual' => 'Handmatig', + 'Shutter Speed Priority' => 'Sluiterprioriteit', + }, + }, + 'PictureStyle' => { + PrintConv => { + 'Landscape' => 'Landschap', + 'None' => 'Geen', + 'Portrait' => 'Portret', + 'Standard' => 'Standaard', + }, + }, + 'PixelFormat' => 'Pixelformaat', + 'PixelUnits' => { + PrintConv => { + 'Unknown' => 'Onbekend', + }, + }, + 'PlanarConfiguration' => { + Description => 'Afbeelding data arrangement', + PrintConv => { + 'Chunky' => 'Chunky Formaat (Interleaved)', + 'Planar' => 'Planar Formaat', + }, + }, + 'Predictor' => { + PrintConv => { + 'Horizontal differencing' => 'Horizontale differencering', + 'None' => 'Geen prodictor schema in gebruik', + }, + }, + 'PreviewColorSpace' => { + PrintConv => { + 'Unknown' => 'Onbekend', + }, + }, + 'PreviewImage' => 'Voorbeeld', + 'PreviewImageValid' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'PreviewQuality' => { + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'PrimaryChromaticities' => 'Chromaticiteit van primaire kleuren', + 'PrimaryPlatform' => 'Primaire platform', + 'ProcessingSoftware' => 'Verwerkingssoftware', + 'ProductID' => 'Produkt ID', + 'ProfileCMMType' => 'Profiel CMM-type', + 'ProfileClass' => { + Description => 'Profielklasse', + PrintConv => { + 'Abstract Profile' => 'Abstractprofiel', + 'ColorSpace Conversion Profile' => 'Kleurenruimteprofiel', + 'DeviceLink Profile' => 'Apparaatverbindingsprofiel', + 'Display Device Profile' => 'Beeldschermapparaatprofiel', + 'Input Device Profile' => 'Invoerapparaatprofiel', + 'NamedColor Profile' => 'Genoemd kleurenprofiel', + 'Nikon Input Device Profile (NON-STANDARD!)' => 'Nikonprofiel ("nkpf")', + 'Output Device Profile' => 'Uitvoerapparaatprofiel', + }, + }, + 'ProfileConnectionSpace' => 'Profielconnectieruimte', + 'ProfileCopyright' => 'Profielcopyright', + 'ProfileCreator' => 'Profielproducent', + 'ProfileDateTime' => 'Datum 1e aanmaak profiel', + 'ProfileDescription' => 'Profielbeschrijving', + 'ProfileDescriptionML' => 'Profielbeschrijving ML', + 'ProfileFileSignature' => 'Profiel filekenmerk', + 'ProfileID' => 'Profiel-ID', + 'ProfileSequenceDesc' => 'Profielvolgorde beschrijving', + 'ProfileVersion' => 'Profielversie', + 'ProgramLine' => { + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'ProgramMode' => { + PrintConv => { + 'None' => 'Geen', + 'Portrait' => 'Portret', + }, + }, + 'ProgramVersion' => 'Programmaversie', + 'Province-State' => 'Provincie', + 'Quality' => { + Description => 'Beeldkwaliteit', + PrintConv => { + 'Compressed RAW' => 'cRAW', + 'Compressed RAW + JPEG' => 'cRAW+JPEG', + 'Extra Fine' => 'Extra fijn', + 'Fine' => 'Fijn', + 'High' => 'Hoog', + 'Low' => 'Laag', + 'Normal' => 'Normaal', + 'RAW + JPEG' => 'RAW+JPEG', + 'Standard' => 'Standaard', + }, + }, + 'QualityMode' => { + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'QuickShot' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'RAFVersion' => 'RAF versie', + 'RasterizedCaption' => 'Gerasterde titel', + 'Rating' => 'Waardering', + 'RatingPercent' => 'Waardering in procent', + 'RawDevAutoGradation' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'RawJpgQuality' => { + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'RecordMode' => { + Description => 'Opnamemodus', + PrintConv => { + 'Aperture Priority' => 'Diafragmaprioriteit', + 'Manual' => 'Handmatig', + 'Shutter Priority' => 'Sluiterprioriteit', + }, + }, + 'RecordingMode' => { + PrintConv => { + 'Auto' => 'Automatisch', + 'Landscape' => 'Landschap', + 'Manual' => 'Handmatig', + 'Portrait' => 'Portret', + }, + }, + 'RedEyeCorrection' => { + PrintConv => { + 'Automatic' => 'Automatisch', + 'Off' => 'Uit', + }, + }, + 'RedEyeReduction' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'RedMatrixColumn' => 'Rode matrixkolom', + 'RedTRC' => 'Rode toon reproductie curve', + 'ReferenceBlackWhite' => 'Zwart/wit referentie punten', + 'ReferenceDate' => 'Referentiedatum', + 'ReferenceNumber' => 'Referentienummer', + 'ReferenceService' => 'Referentieservice', + 'RelatedImageFileFormat' => 'Bestandsformaat van de afbeelding', + 'RelatedImageHeight' => 'Afbeeldingshoogte', + 'RelatedImageWidth' => 'Afbeeldingsbreedte', + 'RelatedSoundFile' => 'Bijbehorend audio bestand', + 'ReleaseButtonToUseDial' => { + Description => 'Knop loslaten voor instelsch.', + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'ReleaseDate' => 'Datum van vrijgave', + 'ReleaseTime' => 'Tijdstip van vrijgave', + 'RemoteOnDuration' => 'Afstandsbediening', + 'RenderingIntent' => { + Description => 'Rendermethode', + PrintConv => { + 'ICC-Absolute Colorimetric' => 'Absoluut colorimetrisch', + 'Media-Relative Colorimetric' => 'Relatieve colorimetrisch', + 'Perceptual' => 'Waarnemend', + 'Saturation' => 'Verzadiging', + }, + }, + 'RepeatingFlashCount' => 'Stroboscopisch flitsen Aantal', + 'RepeatingFlashOutput' => 'Stroboscopisch flitsen Sterkte', + 'RepeatingFlashRate' => 'Stroboscopisch flitsen Freq.', + 'ResampleParamsQuality' => { + PrintConv => { + 'High' => 'Hoog', + 'Low' => 'Laag', + }, + }, + 'Resaved' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'ResolutionUnit' => { + Description => 'Eenheid van de X und Y resolutie', + PrintConv => { + 'None' => 'Geen', + 'cm' => 'centimeter', + }, + }, + 'RetouchHistory' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'ReverseIndicators' => 'Aanduidingen omkeren', + 'Rotation' => { + PrintConv => { + 'Horizontal' => '0° (boven/links)', + 'Horizontal (Normal)' => '0° (boven/links)', + 'Horizontal (normal)' => '0° (boven/links)', + 'Rotate 180' => '180° (onder/rechts)', + 'Rotate 270 CW' => 'Draai 270° met de klok mee', + 'Rotate 90 CW' => '90° tegen de klok in (rechts/boven)', + 'Rotated 180' => '180° (onder/rechts)', + 'Rotated 270 CW' => 'Draai 270° met de klok mee', + 'Rotated 90 CW' => '90° tegen de klok in (rechts/boven)', + }, + }, + 'RowsPerStrip' => 'Aantal lijnen in de afbeelding', + 'SPIFFVersion' => 'SPIFF versie', + 'SRActive' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'SVGVersion' => 'SVG versie', + 'SampleFormat' => { + Description => 'Sample Formaat', + PrintConv => { + 'Complex int' => 'Complexe integer', + 'Float' => 'Drijvende komma waarde', + 'Signed' => 'Integer met voorteken', + 'Undefined' => 'Niet gedefinierd', + 'Unsigned' => 'Integer zonder voorteken', + }, + }, + 'SamplesPerPixel' => 'Aantal van de componenten', + 'Saturation' => { + Description => 'Kleurverzadiging', + PrintConv => { + 'High' => 'Hoge kleurvezadiging', + 'Low' => 'Lage kleurverzadiging', + 'Normal' => 'Normaal', + }, + }, + 'ScanImageEnhancer' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'SceneCaptureType' => { + Description => 'Scene opname type', + PrintConv => { + 'Landscape' => 'Landschap', + 'Night' => 'Nachtscene', + 'Portrait' => 'Portret', + 'Standard' => 'Standaard', + }, + }, + 'SceneMode' => { + Description => 'Scènekeuze', + PrintConv => { + '3D Sweep Panorama' => '3D', + 'Anti Motion Blur' => 'Anti-bewegingswaas', + 'Aperture Priority' => 'Diafragmaprioriteit', + 'Auto' => 'Automatisch', + 'Cont. Priority AE' => 'Continuvoork. AE', + 'Handheld Night Shot' => 'Nachtopname uit hand', + 'Landscape' => 'Landschap', + 'Manual' => 'Handmatig', + 'Night Portrait' => 'Nachtportret', + 'Night Scene' => 'Nacht', + 'Night View/Portrait' => 'Nacht/portret', + 'Normal' => 'Normaal', + 'Off' => 'Uit', + 'Portrait' => 'Portret', + 'Shutter Priority' => 'Sluiterprioriteit', + 'Sports' => 'Sportactie', + 'Standard' => 'Standaard', + 'Sunset' => 'Zonsondergang', + 'Sweep Panorama' => 'Panorama d. beweg.', + }, + }, + 'SceneModeUsed' => { + PrintConv => { + 'Aperture Priority' => 'Diafragmaprioriteit', + 'Landscape' => 'Landschap', + 'Manual' => 'Handmatig', + 'Portrait' => 'Portret', + 'Shutter Priority' => 'Sluiterprioriteit', + }, + }, + 'SceneSelect' => { + PrintConv => { + 'Night' => 'Nachtscene', + 'Off' => 'Uit', + }, + }, + 'SceneType' => { + Description => 'Scene type', + PrintConv => { + 'Directly photographed' => 'Direkt opgenomen afbeelding', + }, + }, + 'SecurityClassification' => { + Description => 'Veiligheid classificering', + PrintConv => { + 'Confidential' => 'Vertrouwelijk', + 'Restricted' => 'Begrensd', + 'Secret' => 'Geheim', + 'Top Secret' => 'Streng geheim', + 'Unclassified' => 'Niet geclassificeerd', + }, + }, + 'SelfTimer' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'SelfTimerMode' => 'Zelfontspanner mode', + 'SelfTimerTime' => 'Vertraging zelfontspanner', + 'SensingMethod' => { + Description => 'Meet methode', + PrintConv => { + 'Color sequential area' => 'Color sequential area sensor', + 'Color sequential linear' => 'Kleur sequentiële lineaire sensor', + 'Monochrome area' => 'Monochrome sensor', + 'Monochrome linear' => 'Monochrome lineaire sensor', + 'Not defined' => 'Niet gedefineerd', + 'One-chip color area' => 'Één chip kleur sensor', + 'Three-chip color area' => 'Drie chip kleur sensor', + 'Trilinear' => 'Trilineaire sensor', + 'Two-chip color area' => 'Twee chip kleur sensor', + }, + }, + 'SequentialShot' => { + PrintConv => { + 'None' => 'Geen', + 'Standard' => 'Standaard', + }, + }, + 'SerialNumber' => 'Camera-ID', + 'ServiceIdentifier' => 'Service ID', + 'SetButtonCrossKeysFunc' => { + PrintConv => { + 'Normal' => 'Normaal', + }, + }, + 'ShadingCompensation' => { + Description => 'Schaduwcompensatie', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ShadingCompensation2' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ShakeReduction' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'Sharpness' => { + Description => 'Scherpte', + PrintConv => { + 'Hard' => '+', + 'Normal' => 'Normaal', + 'Soft' => 'Zacht', + }, + }, + 'SharpnessFrequency' => { + PrintConv => { + 'High' => 'Hoog', + 'Low' => 'Laag', + 'Standard' => 'Standaard', + }, + }, + 'ShootingInfoDisplay' => { + Description => 'Weergave opname-info', + PrintConv => { + 'Auto' => 'Automatisch', + 'Manual (dark on light)' => 'Handmatig - Donker op licht', + 'Manual (light on dark)' => 'Handmatig - Licht op donker', + }, + }, + 'ShootingMode' => { + Description => 'Opnamestand', + PrintConv => { + 'Aperture Priority' => 'Diafragmaprioriteit', + 'Manual' => 'Handmatig', + 'Normal' => 'Normaal', + 'Portrait' => 'Portret', + 'Shutter Priority' => 'Sluiterprioriteit', + }, + }, + 'ShootingModeSetting' => { + Description => 'Opnamestand', + PrintConv => { + 'Continuous' => 'Continu', + 'Delayed Remote' => 'Vertraagd op afstand', + 'Quick-response Remote' => 'Direct op afstand', + 'Self-timer' => 'Zelfontspanner', + 'Single Frame' => 'Enkel beeld', + }, + }, + 'ShortDocumentID' => 'Korte foto ID', + 'ShutterMode' => { + PrintConv => { + 'Aperture Priority' => 'Diafragmaprioriteit', + 'Auto' => 'Automatisch', + }, + }, + 'ShutterReleaseButtonAE-L' => { + Description => 'AE-vergr. ontspanknop', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ShutterReleaseNoCFCard' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'ShutterSpeed' => 'Belichtingstijd', + 'ShutterSpeedValue' => 'Belichtingstijd', + 'SimilarityIndex' => 'Fotogelijkheidsindex', + 'SlideShow' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'SlowShutter' => { + PrintConv => { + 'None' => 'Geen', + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'SlowSync' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'Software' => 'Gebruikte software', + 'Source' => 'Bron', + 'SpatialFrequencyResponse' => 'Spatial frequency response', + 'SpecialEffectsOpticalFilter' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'SpecialInstructions' => 'Instructies', + 'SpectralSensitivity' => 'Spectrale gevoeligheid', + 'State' => 'Staat', + 'StripByteCounts' => 'Aantal bytes per gecomprimeerd afbeelding deel', + 'StripOffsets' => 'Positie van afbeelding data', + 'Sub-location' => 'Locatie', + 'SubSecCreateDate' => 'Datum van de originele data generatie', + 'SubSecDateTimeOriginal' => 'Datum van de originele data generatie', + 'SubSecModifyDate' => 'Datum bestand wijziging', + 'SubSecTime' => 'DateTime 1/100 seconden', + 'SubSecTimeDigitized' => 'DateTimeDigitized 1/100 seconden', + 'SubSecTimeOriginal' => 'DateTimeOriginal 1/100 seconden', + 'SubfileType' => 'Nieuw subbestand type', + 'Subject' => 'Onderwerp', + 'SubjectArea' => 'Positie hoofdobject', + 'SubjectDistance' => 'Object afstand', + 'SubjectDistanceRange' => { + Description => 'Objectief afstandsbereik', + PrintConv => { + 'Close' => 'Dichtbij', + 'Distant' => 'Verweg', + 'Unknown' => 'Onbekend', + }, + }, + 'SubjectLocation' => 'Positie hoofdobject', + 'SubjectProgram' => { + PrintConv => { + 'None' => 'Geen', + 'Portrait' => 'Portret', + }, + }, + 'SubjectReference' => 'Onderwerp code', + 'Subsystem' => { + PrintConv => { + 'Unknown' => 'Onbekend', + }, + }, + 'SuperMacro' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'SuperimposedDisplay' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'SupplementalCategories' => 'Aanvullende categorie', + 'T4Options' => 'Opvul bit toegevoegd', + 'T6Options' => 'T6 Opties', + 'Tagged' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'TargetPrinter' => 'Doel Printer', + 'Technology' => { + Description => 'Technologie', + PrintConv => { + 'Active Matrix Display' => 'Actieve matrixdisplay', + 'Cathode Ray Tube Display' => 'CRT-beeldscherm', + 'Digital Camera' => 'Digitale camera', + 'Dye Sublimation Printer' => 'Dye sublimation printer', + 'Electrophotographic Printer' => 'Laserprinter', + 'Electrostatic Printer' => 'Electrostatische printer', + 'Film Scanner' => 'Filmscanner', + 'Film Writer' => 'Filmprinter', + 'Flexography' => 'Flexografie', + 'Gravure' => 'Fotogravure - koperdiepdruk', + 'Ink Jet Printer' => 'Inkjet printer', + 'Offset Lithography' => 'Offset Lithografie', + 'Passive Matrix Display' => 'Passieve matrixdisplay', + 'Photo CD' => 'Photo-CD', + 'Photo Image Setter' => 'Fotofilmbelichter', + 'Photographic Paper Printer' => 'Fotopapier printer', + 'Projection Television' => 'Projectietelevisie', + 'Reflective Scanner' => 'Reflectieve Scanner', + 'Thermal Wax Printer' => 'Thermische was printer', + 'Video Camera' => 'Videocamera', + 'Video Monitor' => 'Videomonitor', + }, + }, + 'Teleconverter' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'TextStamp' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ThumbnailImage' => 'Miniatuur', + 'ThumbnailImageSize' => 'Thumbnail formaat', + 'TimeCreated' => 'Opnametijdstip', + 'TimeScaleParamsQuality' => { + PrintConv => { + 'High' => 'Hoog', + 'Low' => 'Laag', + }, + }, + 'TimeSent' => 'Tijdstip van zenden', + 'TimerFunctionButton' => { + Description => 'Fn-knop', + PrintConv => { + 'ISO' => 'ISO-gevoeligheid', + 'Image Quality/Size' => 'Bldkwaliteit/-formaat', + 'Self-timer' => 'Zelfontspanner', + 'Shooting Mode' => 'Opnamestand', + 'White Balance' => 'Witbalans', + }, + }, + 'Title' => 'Titel', + 'ToneCurve' => { + PrintConv => { + 'Manual' => 'Handmatig', + 'Standard' => 'Standaard', + }, + }, + 'ToneCurveActive' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'ToningEffect' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'ToningEffectMonochrome' => { + PrintConv => { + 'None' => 'Geen', + }, + }, + 'TransferFunction' => 'Transformatie functie', + 'Transformation' => { + PrintConv => { + 'Horizontal (normal)' => '0° (boven/links)', + 'Mirror horizontal' => 'Horizontaal gespiegeld', + 'Mirror horizontal and rotate 270 CW' => 'Spiegel horizontaal en draai 270° met de klok mee', + 'Mirror horizontal and rotate 90 CW' => 'Spiegel horizontaal en draai 90° met de klok mee', + 'Mirror vertical' => 'Vertikaal gespiegeld', + 'Rotate 180' => '180° (onder/rechts)', + 'Rotate 270 CW' => 'Draai 270° met de klok mee', + 'Rotate 90 CW' => '90° tegen de klok in (rechts/boven)', + }, + }, + 'TransmissionReference' => 'Transmissiereferentie', + 'Trapped' => { + PrintConv => { + 'Unknown' => 'Onbekend', + }, + }, + 'Uncompressed' => { + Description => 'Niet gecomprimeerd', + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'UniqueDocumentID' => 'Uniek foto ID', + 'UniqueObjectName' => 'Unieke Naam van het Object', + 'Unknown' => 'Onbekend', + 'UnsharpMask' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'Urgency' => { + Description => 'Urgentie', + PrintConv => { + '0 (reserved)' => '0 (Gereserveerd voor toekomstig gebruik)', + '1 (most urgent)' => '1 (zeer dringend)', + '5 (normal urgency)' => '5 (dringend)', + '8 (least urgent)' => '8 (minst dringend)', + '9 (user-defined priority)' => '9 (Gereserveerd voor toekomstig gebruik)', + }, + }, + 'UserComment' => 'Gebruiker kommentaar', + 'UserDef1PictureStyle' => { + PrintConv => { + 'Landscape' => 'Landschap', + 'Portrait' => 'Portret', + 'Standard' => 'Standaard', + }, + }, + 'UserDef2PictureStyle' => { + PrintConv => { + 'Landscape' => 'Landschap', + 'Portrait' => 'Portret', + 'Standard' => 'Standaard', + }, + }, + 'UserDef3PictureStyle' => { + PrintConv => { + 'Landscape' => 'Landschap', + 'Portrait' => 'Portret', + 'Standard' => 'Standaard', + }, + }, + 'VRDVersion' => 'VRD versie', + 'VR_0x66' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'Version' => 'Versie', + 'VibrationReduction' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'ViewfinderWarning' => { + Description => 'Zoekerwaarschuwing', + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'VignetteControl' => { + PrintConv => { + 'High' => 'Hoog', + 'Normal' => 'Normaal', + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'VoiceMemo' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'WBAdjLighting' => { + PrintConv => { + 'Daylight (cloudy)' => 'Daglicht (2)', + 'Daylight (direct sunlight)' => 'Daglicht (0)', + 'Daylight (shade)' => 'Daglicht (1)', + 'Flash' => 'Flits', + 'None' => 'Geen', + }, + }, + 'WBBracketMode' => { + PrintConv => { + 'Off' => 'Uit', + }, + }, + 'WBFineTuneActive' => { + PrintConv => { + 'No' => 'Nee', + 'Yes' => 'Ja', + }, + }, + 'WBMode' => { + PrintConv => { + 'Auto' => 'Automatisch', + }, + }, + 'WCSProfiles' => 'Windows kleursysteemprofiel', + 'WhiteBalance' => { + Description => 'Witbalans', + PrintConv => { + 'Auto' => 'Automatisch', + 'Black & White' => 'Monochroom', + 'Cloudy' => 'Bewolkt', + 'Color Temperature/Color Filter' => 'Kleurtemperatuur / Kleurfilter', + 'Cool White Fluorescent' => 'Koelwit TL-licht', + 'Custom' => 'Eigen instel.', + 'Custom 1' => 'VOORKEUR 1', + 'Custom 2' => 'VOORKEUR 2', + 'Custom 3' => 'VOORKEUR 3', + 'Custom 4' => 'VOORKEUR 4', + 'Day White Fluorescent' => 'Daglicht wit TL-licht', + 'Daylight' => 'Daglicht', + 'Daylight Fluorescent' => 'Daglicht TL-licht', + 'Flash' => 'Flits', + 'Fluorescent' => 'Fluoresceren', + 'Manual' => 'Handmatig', + 'Shade' => 'Schaduw', + 'Tungsten' => 'Kunstlicht (gloeilamp)', + 'Unknown' => 'Onbekend', + 'Warm White Fluorescent' => 'Warm wit TL-licht', + 'White Fluorescent' => 'Wit TL-licht', + }, + }, + 'WhiteBalance2' => { + PrintConv => { + 'Auto' => 'Automatisch', + }, + }, + 'WhiteBalanceAdj' => { + PrintConv => { + 'Auto' => 'Automatisch', + 'Cloudy' => 'Bewolkt', + 'Daylight' => 'Daglicht', + 'Flash' => 'Flits', + 'Fluorescent' => 'Fluoresceren', + 'Off' => 'Uit', + 'On' => 'Aan', + 'Shade' => 'Schaduw', + 'Tungsten' => 'Kunstlicht (gloeilamp)', + }, + }, + 'WhiteBalanceMode' => { + PrintConv => { + 'Unknown' => 'Onbekend', + }, + }, + 'WhiteBalanceSet' => { + PrintConv => { + 'Auto' => 'Automatisch', + 'Cloudy' => 'Bewolkt', + 'Daylight' => 'Daglicht', + 'Daylight Fluorescent' => 'Daglicht TL-licht', + 'Flash' => 'Flits', + 'Manual' => 'Handmatig', + 'Shade' => 'Schaduw', + 'Tungsten' => 'Kunstlicht (gloeilamp)', + 'White Fluorescent' => 'Warm wit TL-licht', + }, + }, + 'WhitePoint' => 'Wit punt chromaticiteit', + 'WideRange' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, + 'WidthResolution' => 'Beeldresolutie horizontaal', + 'Writer-Editor' => 'Titel/Beschrijving auteur', + 'XMP' => 'XMP metadata', + 'XPAuthor' => 'Auteur', + 'XPComment' => 'Kommentaar', + 'XPKeywords' => 'Trefwoorden', + 'XPSubject' => 'Onderwerp', + 'XPTitle' => 'Titel', + 'XPosition' => 'X positie', + 'XResolution' => 'Horizontale afbeelding resolutie', + 'YCbCrCoefficients' => 'YCbCr coëfficiënt', + 'YCbCrPositioning' => { + Description => 'Y en C positie', + PrintConv => { + 'Centered' => 'Gecentreerd', + 'Co-sited' => 'Naast liggend', + }, + }, + 'YCbCrSubSampling' => 'Subsampling ratio van Y tot C', + 'YPosition' => 'Y positie', + 'YResolution' => 'Vertikale afbeelding resolutie', + 'ZoneMatching' => { + Description => 'Zoneaanpassing', + PrintConv => { + 'High Key' => 'Hi', + 'ISO Setting Used' => 'Uit', + 'Low Key' => 'Lo', + }, + }, + 'ZoneMatchingOn' => { + PrintConv => { + 'Off' => 'Uit', + 'On' => 'Aan', + }, + }, +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::nl.pm - ExifTool Dutch language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke, Peter Moonen, Herman Beld and Peter van der Laan for +providing this translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/pl.pm b/lib/Image/ExifTool/Lang/pl.pm new file mode 100644 index 0000000..3ec0d6a --- /dev/null +++ b/lib/Image/ExifTool/Lang/pl.pm @@ -0,0 +1,1276 @@ +#------------------------------------------------------------------------------ +# File: pl.pm +# +# Description: ExifTool Polish language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::pl; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.12'; + +%Image::ExifTool::Lang::pl::Translate = ( + 'A100DataOffset' => 'PrzesuniÄ™cie danych A100', + 'AEAperture' => 'Priorytet AE', + 'AEExposureTime' => 'Czas ekspozycji AE', + 'AEInfo' => 'Informacja o automatycznej ekspozycji', + 'AELock' => { + Description => 'Blokada AE', + PrintConv => { + 'Off' => 'WyÅ‚Ä…czona', + 'On' => 'WÅ‚Ä…czona', + }, + }, + 'AEMeteringMode' => 'Tryb pomiaru AE', + 'AEMeteringSegments' => 'Segmenty pomiaru AE', + 'AEProgramMode' => 'Tryb programu AE', + 'AFAdjustment' => 'Korekta AF', + 'AFInfo' => 'Informacje autofocusa', + 'AFIntegrationTime' => 'Czas integracji AF', + 'AFPoint' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'AFPointMode' => 'Tryb Autofokusa', + 'AFPointSelected' => { + Description => 'Wybrany punkt AF', + PrintConv => { + 'Auto' => 'Automatyczny', + 'Automatic Tracking AF' => 'ÅšledzÄ…cy AF', + 'Bottom' => 'Dolny', + 'Center' => 'Centralny', + 'Face Detect AF' => 'Wykrywanie twarzy', + 'Fixed Center' => 'Centralny', + 'Left' => 'Lewy', + 'Lower-left' => 'Dolny-lewy', + 'Lower-right' => 'Dolny-prawy', + 'Mid-left' => 'Åšrodek-lewy', + 'Mid-right' => 'Åšrodek-prawy', + 'Right' => 'Prawy', + 'Top' => 'Górny', + 'Upper-left' => 'Górny-lewy', + 'Upper-right' => 'Górny-prawy', + }, + }, + 'AFPointSelected2' => 'Wybrany punkt autofokusa 2', + 'AFPointsInFocus' => { + Description => 'Punkty AF w ostroÅ›ci', + PrintConv => { + 'Bottom-center' => 'Dolny-centralny', + 'Bottom-left' => 'Dolny-lewy', + 'Bottom-right' => 'Dolny-prawy', + 'Center' => 'Centralny', + 'Fixed Center or Multiple' => 'Centralny lub wiele', + 'Left' => 'Lewy', + 'None' => 'Brak', + 'Right' => 'Prawy', + 'Top-center' => 'Górny-centralny', + 'Top-left' => 'Górny-lewy', + 'Top-right' => 'Górny-prawy', + }, + }, + 'AFPointsSelected' => 'Wybrane punkty AF', + 'AFPredictor' => 'PrzewidujÄ…cy AF', + 'Aperture' => 'PrzysÅ‚ona', + 'ApertureRingUse' => 'Użycie pierÅ›cienia przysÅ‚ony', + 'ApertureValue' => 'PrzysÅ‚ona', + 'Artist' => 'Artysta', + 'Author' => 'Autor', + 'AuthorsPosition' => 'Pozycja autora', + 'AutoAperture' => 'Automatyczna przysÅ‚ona', + 'AutoBracketing' => 'Bracketing automatyczny', + 'AutoRotate' => { + PrintConv => { + 'None' => 'Brak', + 'Rotate 180' => '180° (dół/prawo)', + 'Rotate 270 CW' => '90° CW (lewo/dół)', + 'Rotate 90 CW' => '90° CCW (prawo/góra)', + }, + }, + 'AvApertureSetting' => 'Ustawienia priorytetu przysÅ‚ony Av', + 'BadFaxLines' => 'Uszkodzone wiersze transmisji Fax', + 'BannerImageType' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'BaseExposureCompensation' => 'Podstawowa kompensacja ekspozycji', + 'BitsPerSample' => 'Liczba bitów na skÅ‚adnik', + 'BlackPoint' => 'Punkt czerni', + 'BlueBalance' => 'Balans niebieskiego', + 'BlurWarning' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'BracketShotNumber' => 'Ilość zdjęć w bracketingu', + 'Brightness' => 'Jasność', + 'By-line' => 'Autor', + 'CFAPattern' => 'Wzorzec CFA', + 'CMMFlags' => 'Flagi CMM', + 'CPUFirmwareVersion' => 'Wersja firmware CPU', + 'CPUType' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'CalibrationIlluminant1' => { + PrintConv => { + 'Cloudy' => 'Zachmurzone niebo', + 'Cool White Fluorescent' => 'Zimna biaÅ‚a jarzeniówka (W 3800 - 4500K)', + 'Day White Fluorescent' => 'Jarzeniówka z naturalnym biaÅ‚ym Å›wiatÅ‚em (N 4600 - 5500K)', + 'Daylight' => 'ÅšwiatÅ‚o dzienne', + 'Daylight Fluorescent' => 'Jarzeniówka dajÄ…ca Å›wiatÅ‚o dzienne (D 5700 - 7100K)', + 'Fine Weather' => 'Dobra pogoda', + 'Flash' => 'Lampa bÅ‚yskowa', + 'Fluorescent' => 'Jarzeniowy', + 'ISO Studio Tungsten' => 'ISO dla studyjnych lamp żarowych', + 'Other' => 'Inne źródÅ‚o Å›wiatÅ‚a', + 'Shade' => 'CieÅ„', + 'Standard Light A' => 'Standardowe Å›wiatÅ‚o A', + 'Standard Light B' => 'Standardowe Å›wiatÅ‚o B', + 'Standard Light C' => 'Standardowe Å›wiatÅ‚o C', + 'Tungsten (Incandescent)' => 'ÅšwiatÅ‚o żarowe', + 'Unknown' => 'Nieznane', + 'White Fluorescent' => 'BiaÅ‚a jarzeniówka (WW3250 - 3800K)', + }, + }, + 'CalibrationIlluminant2' => { + PrintConv => { + 'Cloudy' => 'Zachmurzone niebo', + 'Cool White Fluorescent' => 'Zimna biaÅ‚a jarzeniówka (W 3800 - 4500K)', + 'Day White Fluorescent' => 'Jarzeniówka z naturalnym biaÅ‚ym Å›wiatÅ‚em (N 4600 - 5500K)', + 'Daylight' => 'ÅšwiatÅ‚o dzienne', + 'Daylight Fluorescent' => 'Jarzeniówka dajÄ…ca Å›wiatÅ‚o dzienne (D 5700 - 7100K)', + 'Fine Weather' => 'Dobra pogoda', + 'Flash' => 'Lampa bÅ‚yskowa', + 'Fluorescent' => 'Jarzeniowy', + 'ISO Studio Tungsten' => 'ISO dla studyjnych lamp żarowych', + 'Other' => 'Inne źródÅ‚o Å›wiatÅ‚a', + 'Shade' => 'CieÅ„', + 'Standard Light A' => 'Standardowe Å›wiatÅ‚o A', + 'Standard Light B' => 'Standardowe Å›wiatÅ‚o B', + 'Standard Light C' => 'Standardowe Å›wiatÅ‚o C', + 'Tungsten (Incandescent)' => 'ÅšwiatÅ‚o żarowe', + 'Unknown' => 'Nieznane', + 'White Fluorescent' => 'BiaÅ‚a jarzeniówka (WW3250 - 3800K)', + }, + }, + 'CameraOrientation' => { + Description => 'Orientacja obrazu', + PrintConv => { + 'Horizontal (normal)' => '0° (góra/lewo)', + 'Rotate 270 CW' => '90° CW (lewo/dół)', + 'Rotate 90 CW' => '90° CCW (prawo/góra)', + }, + }, + 'CameraSettings' => 'Ustawienia aparatu', + 'CameraTemperature' => 'Temperatura aparatu', + 'Caption-Abstract' => 'Podpis', + 'CaptionWriter' => 'Autor podpisu', + 'Categories' => 'Kategorie', + 'Category' => 'Kategorie', + 'CellLength' => 'DÅ‚ugość komórki', + 'CellWidth' => 'Szerokość komórki', + 'City' => 'Miasto', + 'CleanFaxData' => { + Description => 'Poprawne wiersze transmisji Fax', + PrintConv => { + 'Clean' => 'Dobry', + 'Regenerated' => 'Ponowiony', + 'Unclean' => 'Niedobry', + }, + }, + 'ClipPath' => 'Åšcieżka obciÄ™cia', + 'CodingMethods' => { + Description => 'Metody kompresji', + PrintConv => { + 'Baseline JPEG' => 'JPEG podstawowa', + 'JBIG color' => 'JBIG kolor', + 'Modified Huffman' => 'Huffmana zmodyfikowana', + 'Modified MR' => 'Zmodyfikowany MR', + 'Modified Read' => 'Zmodyfikowany odczyt', + 'Unspecified compression' => 'Nie podane', + }, + }, + 'ColorFilter' => 'Filtr kolorowy', + 'ColorInfo' => 'Informacje o kolorze', + 'ColorMap' => 'Mapa kolorów', + 'ColorMatrix1' => 'Macierz kolorów 1', + 'ColorMatrix2' => 'Macierz kolorów 2', + 'ColorSpace' => { + Description => 'Informacja o przestrzeni barwowej', + PrintConv => { + 'Uncalibrated' => 'Nie skalibrowany', + }, + }, + 'ColorSpaceData' => 'Dane przestrzeni barw', + 'ColorTemperature' => 'Temperatura barwowa', + 'Comment' => 'Komentarz', + 'ComponentsConfiguration' => 'Znaczenie każdego komponentu', + 'CompressedBitsPerPixel' => 'Tryb kompresji obrazu', + 'Compression' => { + Description => 'Algorytm kompresji', + PrintConv => { + 'Epson ERF Compressed' => 'Skompresowany Epson ERF', + 'JBIG B&W' => 'JBIG Czarno BiaÅ‚y', + 'JBIG Color' => 'JBIG Kolorowy', + 'JPEG' => 'Kompresja JPEG', + 'JPEG (old-style)' => 'JPEG (w starym stylu)', + 'Kodak DCR Compressed' => 'Skompresowany Kodak DCR', + 'Kodak KDC Compressed' => 'Skompresowany Kodak KDC', + 'Next' => 'Kodowanie 2-bitowe NeXT', + 'Nikon NEF Compressed' => 'Skompresowany Nikon NEF', + 'None' => 'Brak', + 'Packed RAW' => 'Spakowany RAW', + 'Pentax PEF Compressed' => 'Skompresowany Pentax PEF', + 'SGILog' => 'Kodowanie 32-bitowe SGI Log Luminance', + 'SGILog24' => 'Kodowanie 24-bitowe SGI Log Luminance', + 'Samsung SRW Compressed' => 'Skompresowany Samsung SRW', + 'Sony ARW Compressed' => 'Skompresowany Sony ARW', + 'Thunderscan' => 'Kodowanie 4-bitowe ThunderScan', + 'Uncompressed' => 'Bez kompresji', + }, + }, + 'CompressionType' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'ConsecutiveBadFaxLines' => 'Sekwencja uszkodzonych wierszy transmisji Fax', + 'Contrast' => { + Description => 'Kontrast', + PrintConv => { + 'High' => 'Ostre', + 'Low' => 'MiÄ™kkie', + 'Normal' => 'Standard', + }, + }, + 'Copyright' => 'Posiadacz praw autorskich', + 'CopyrightNotice' => 'Informacja o prawach autorskich', + 'Country' => 'Kraj', + 'Country-PrimaryLocationName' => 'Kraj', + 'CreateDate' => 'Data utworzenia', + 'CreationDate' => 'Data utworzenia', + 'Credit' => 'PodziÄ™kowania', + 'CropUnit' => { + PrintConv => { + 'inches' => 'Cal', + }, + }, + 'CropUnits' => { + PrintConv => { + 'inches' => 'Cal', + }, + }, + 'CustomRendered' => { + Description => 'Przetwarzanie zdjęć wedÅ‚ug ustawieÅ„ wÅ‚asnych', + PrintConv => { + 'Custom' => 'Proces zdefiniowany przez użytkownika', + 'Normal' => 'Normalny proces', + }, + }, + 'DNGBackwardVersion' => 'Poprzednia wersja DNG', + 'DNGVersion' => 'Wersja DNG', + 'DSPFirmwareVersion' => 'Wersja firmware DSP', + 'DataDump' => 'Zrzut danych?', + 'DataImprint' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'DataType' => 'Typ daty', + 'Date' => 'Data', + 'DateCreated' => 'Data utworzenia', + 'DateSent' => 'WysÅ‚ano datÄ™', + 'DateTimeOriginal' => 'Pierwotna data i godzina', + 'Decode' => 'Zdekodowany', + 'DefaultImageColor' => 'DomyÅ›lny kolor w obrazie', + 'Description' => 'Opis', + 'DestinationCity' => 'Miasto przeznaczenia', + 'DestinationCityCode' => 'Kod miasta przeznaczenia', + 'DestinationDST' => { + Description => 'Czas letni miasta przeznaczenia', + PrintConv => { + 'No' => 'Nie', + 'Yes' => 'Tak', + }, + }, + 'DeviceAttributes' => 'Atrybuty urzÄ…dzenia', + 'DeviceManufacturer' => 'Producent urzÄ…dzenia', + 'DeviceModel' => 'Model urzÄ…dzenia', + 'DeviceSettingDescription' => 'Opis ustawieÅ„ urzÄ…dzenia', + 'DigitalZoom' => 'Cyfrowy zoom', + 'DigitalZoomRatio' => 'Współczynnik cyfrowego zoomu', + 'Directory' => 'Lokalizacja pliku', + 'DisplayUnits' => { + PrintConv => { + 'inches' => 'Cal', + }, + }, + 'DisplayedUnitsX' => { + PrintConv => { + 'inches' => 'Cal', + }, + }, + 'DisplayedUnitsY' => { + PrintConv => { + 'inches' => 'Cal', + }, + }, + 'DocumentName' => 'Nazwa dokumentu', + 'DriveMode' => 'Tryb przesuwu', + 'DriveMode2' => 'Tryb zdjęć 2', + 'Duration' => 'Czas', + 'DynamicRangeExpansion' => { + Description => 'Rozszerzenie zakresu dynamiki', + PrintConv => { + 'Off' => 'WyÅ‚Ä…czone', + 'On' => 'WÅ‚Ä…czone', + }, + }, + 'E-DialInProgram' => 'Program E-Dial', + 'EVStepInfo' => 'Informacja o krokach EV', + 'EVSteps' => 'Krok EV', + 'EffectiveLV' => 'Efektywne LV', + 'Emphasis' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'EnvelopePriority' => { + PrintConv => { + '0 (reserved)' => '0 (zarezerwowane na przyszÅ‚ość)', + '1 (most urgent)' => '1 (najpilniejszy)', + '5 (normal urgency)' => '5 (zwykÅ‚y)', + '8 (least urgent)' => '8 (niezbyt pilny)', + '9 (user-defined priority)' => '9 (priorytet okreÅ›lony przez użytkownika)', + }, + }, + 'ExifImageHeight' => 'Wysokość obrazu', + 'ExifImageWidth' => 'Szerokość obrazu', + 'ExifOffset' => 'Wskaźnik Exif IFD', + 'ExifVersion' => 'Wersja Exif', + 'ExposureBracketStepSize' => 'Krok bracketingu ekspozycji', + 'ExposureCompensation' => 'Różnica ekspozycji', + 'ExposureIndex' => 'Wskaźnik ekspozycji', + 'ExposureMode' => { + Description => 'Tryb ekspozycji', + PrintConv => { + 'Auto' => 'Automatyczna ekspozycja', + 'Auto bracket' => 'Funkcja Autobracketing', + 'Manual' => 'Manualna ekspozycja', + }, + }, + 'ExposureProgram' => { + Description => 'Program ekspozycji', + PrintConv => { + 'Action (High speed)' => 'Program akcji', + 'Aperture-priority AE' => 'Priorytet przysÅ‚ony', + 'Creative (Slow speed)' => 'Program kreatywny', + 'Landscape' => 'Krajobraz', + 'Manual' => 'Manualna ekspozycja', + 'Portrait' => 'Portret', + 'Program AE' => 'Normalny program', + 'Shutter speed priority AE' => 'Priorytet migawki', + }, + }, + 'ExposureTime' => 'Czas ekspozycji', + 'ExternalFlashExposureComp' => 'Kompensacja ekspozycji zewnetrznej lampy', + 'ExternalFlashGuideNumber' => 'Liczba przewodnia lampy zewnÄ™trznej', + 'ExternalFlashMode' => 'Tryb lampy zewnÄ™trznej', + 'FNumber' => 'PrzysÅ‚ona', + 'FaceOrientation' => { + PrintConv => { + 'Horizontal (normal)' => '0° (góra/lewo)', + 'Rotate 180' => '180° (dół/prawo)', + 'Rotate 270 CW' => '90° CW (lewo/dół)', + 'Rotate 90 CW' => '90° CCW (prawo/góra)', + }, + }, + 'FaxProfile' => { + Description => 'Profil faxu (rodzaj zawartoÅ›ci)', + PrintConv => { + 'Extended B&W lossless, F' => 'Rozszerzony cz.b. bezstratny, F', + 'Lossless JBIG B&W, J' => 'Bezstratny JBIG cz.b., J', + 'Lossless color and grayscale, L' => 'Bezstratne kolor i skala szaroÅ›ci, L', + 'Lossy color and grayscale, C' => 'Stratne kolor i skala szaroÅ›ci, C', + 'Minimal B&W lossless, S' => 'Minimalny cz.b. bezstratny, S', + 'Mixed raster content, M' => 'Raster — zawartość mieszana, M', + 'Multi Profiles' => 'Wiele profili', + 'Unknown' => 'Nieznany', + }, + }, + 'FileFormat' => 'Format', + 'FileModifyDate' => 'Data aktualizacji', + 'FileName' => 'Nazwa pliku', + 'FileSize' => 'Wielkość pliku', + 'FileSource' => { + Description => 'ŹródÅ‚o pliku', + PrintConv => { + 'Digital Camera' => 'DSC', + 'Film Scanner' => 'Skaner do materiałów transparentnych', + 'Reflection Print Scanner' => 'Skaner do zdjęć', + }, + }, + 'FileType' => 'Typ pliku', + 'Filename' => 'Nazwa pliku', + 'FillOrder' => { + Description => 'Kolejność wypeÅ‚niania', + PrintConv => { + 'Normal' => 'Normalna', + 'Reversed' => 'ZajÄ™te', + }, + }, + 'FilterEffectMonochrome' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'Flash' => { + Description => 'Lampa', + PrintConv => { + 'Auto, Fired' => 'WÅ‚Ä…czony (Automatyczny bÅ‚ysk lampy)', + 'Auto, Fired, Red-eye reduction' => '"WÅ‚Ä…czony (BÅ‚ysk automatyczny, Redukcja efektu czerwonych oczu)"', + 'Auto, Fired, Red-eye reduction, Return detected' => '"WÅ‚Ä…czony (BÅ‚ysk automatyczny, Redukcja efektu czerwonych oczu, rejestracja Å›wiatÅ‚a odbitego)"', + 'Auto, Fired, Return detected' => '"WÅ‚Ä…czony (Automatyczny bÅ‚ysk lampy, rejestracja Å›wiatÅ‚a odbitego)"', + 'Did not fire' => 'Nie nastÄ…piÅ‚ bÅ‚ysk lampy', + 'Fired' => 'NastÄ…piÅ‚ bÅ‚ysk lampy', + 'Fired, Red-eye reduction' => 'WÅ‚Ä…czony (Redukcja efektu czerwonych oczu)', + 'Fired, Red-eye reduction, Return detected' => '"WÅ‚Ä…czony (Redukcja efektu czerwonych oczu, rejestracja Å›wiatÅ‚a odbitego)"', + 'Fired, Return detected' => 'WÅ‚Ä…czony (Rejestracja Å›wiatÅ‚a odbitego)', + 'No Flash' => 'Brak funkcji lampy bÅ‚yskowej', + 'On, Fired' => 'WÅ‚Ä…czony (BÅ‚ysk dopeÅ‚niajÄ…cy)', + 'On, Red-eye reduction' => '"WÅ‚Ä…czony (BÅ‚ysk dopeÅ‚niajÄ…cy, Redukcja efektu czerwonych oczu)"', + 'On, Red-eye reduction, Return detected' => '"WÅ‚Ä…czony (BÅ‚ysk dopeÅ‚niajÄ…cy, Redukcja efektu czerwonych oczu, rejestracja Å›wiatÅ‚a odbitego)"', + 'On, Return detected' => '"WÅ‚Ä…czony (BÅ‚ysk dopeÅ‚niajÄ…cy, rejestracja Å›wiatÅ‚a odbitego)"', + }, + }, + 'FlashDevice' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'FlashEnergy' => 'SiÅ‚a lampy bÅ‚yskowej', + 'FlashExposureComp' => 'Kompensacja lampy', + 'FlashMeteringSegments' => 'Segmenty pomiaru bÅ‚ysku', + 'FlashMode' => 'Tryb lampy', + 'FlashModel' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'FlashOptions' => 'Opcje lampy', + 'FlashStatus' => 'Stan lampy', + 'FlashType' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'FlashpixVersion' => 'ObsÅ‚ugiwana wersja Flashpix', + 'FocalLength' => 'Ogniskowa', + 'FocalLength35efl' => 'DÅ‚ugość ogniskowej (w wartoÅ›ciach dla formatu maÅ‚oobrazkowego)', + 'FocalLengthIn35mmFormat' => 'DÅ‚ugość ogniskowej dla aparatów maÅ‚oobrazkowych', + 'FocalPlaneResolutionUnit' => { + Description => 'Jednostka rozdzielczoÅ›ci w pÅ‚aszczyźnie ogniskowej', + PrintConv => { + 'None' => 'Brak', + 'inches' => 'Cal', + 'um' => 'µm (mikrometr)', + }, + }, + 'FocalPlaneXResolution' => 'Rozdzielczość w pÅ‚aszczyźnie ogniskowej - oÅ› x', + 'FocalPlaneYResolution' => 'Rozdzielczość w pÅ‚aszczyźnie ogniskowej - oÅ› y', + 'FocusMode' => 'Tryb ostrzenia', + 'FocusMode2' => 'Tryb Autofokusa 2', + 'FrameNumber' => 'Numer zdjÄ™cia', + 'FrameRate' => 'CzÄ™stotliwość zmiany kadrów', + 'FrameSize' => 'Wielkość kadru', + 'FreeByteCounts' => 'Liczba wolnych bajtów', + 'FreeOffsets' => 'Wolne offsety', + 'GDALMetadata' => 'Metadane GDAL', + 'GDALNoData' => 'Brak danych GDAL', + 'GPSAltitude' => 'Wysokość', + 'GPSAltitudeRef' => { + Description => 'Wysokość odniesienia', + PrintConv => { + 'Above Sea Level' => 'Poziom morza', + 'Below Sea Level' => 'WzglÄ™dem poziomu morza (wartość ujemna)', + }, + }, + 'GPSAreaInformation' => 'Nazwa obszaru GPS', + 'GPSDOP' => 'Precyzja pomiaru', + 'GPSDateStamp' => 'Dane GPS', + 'GPSDestBearing' => 'Azymut punktu docelowego', + 'GPSDestBearingRef' => 'Wartość odniesienia dla azymutu punktu docelowego.', + 'GPSDestDistance' => 'OdlegÅ‚ość do punktu docelowego.', + 'GPSDestDistanceRef' => 'Wartość odniesienia dla odlegÅ‚oÅ›ci do punktu docelowego.', + 'GPSDestLatitude' => 'Szerokość geograficzna punktu docelowego', + 'GPSDestLatitudeRef' => 'Wartość odniesienia dla szerokoÅ›ci geograficznej punktu docelowego.', + 'GPSDestLongitude' => 'DÅ‚ugość geograficzna punktu docelowego', + 'GPSDestLongitudeRef' => 'Wartość odniesienia dla dÅ‚ugoÅ›ci geograficznej punktu docelowego.', + 'GPSDifferential' => { + Description => 'Różnicowa korekcja GPS', + PrintConv => { + 'Differential Corrected' => 'Zastosowanie korekcji różnicowej', + 'No Correction' => 'Pomiar bez korekcji różnicowej', + }, + }, + 'GPSHPositioningError' => 'BÅ‚Ä…d poziomy wyznaczenia pozycji', + 'GPSImgDirection' => 'Kierunek obrazu', + 'GPSImgDirectionRef' => 'Wartość odniesienia dla kierunku obrazu', + 'GPSInfo' => 'Wskaźnik GPS Info IFD', + 'GPSLatitude' => 'Szerokość geograficzna', + 'GPSLatitudeRef' => { + Description => 'Szerokość geograficzna północna lub poÅ‚udniowa', + PrintConv => { + 'North' => 'SzerokoÅ›ci północnej', + 'South' => 'SzerokoÅ›ci poÅ‚udniowej', + }, + }, + 'GPSLongitude' => 'DÅ‚ugość geograficzna', + 'GPSLongitudeRef' => { + Description => 'DÅ‚ugość geograficzna wschodnia lub zachodnia', + PrintConv => { + 'East' => 'DÅ‚ugoÅ›ci wschodniej', + 'West' => 'DÅ‚ugoÅ›ci zachodniej', + }, + }, + 'GPSMapDatum' => 'Wykorzystane dane z badaÅ„ geodezyjnych', + 'GPSMeasureMode' => { + Description => 'Tryb pomiaru GPS', + PrintConv => { + '3-Dimensional Measurement' => 'Pomiar 3-wymiarowy', + }, + }, + 'GPSProcessingMethod' => 'Nazwa metody przetwarzania GPS', + 'GPSSatellites' => 'Satelity GPS używane do pomiaru', + 'GPSSpeed' => 'PrÄ™dkość odbiornika GPS', + 'GPSSpeedRef' => { + Description => 'Jednostka prÄ™dkoÅ›ci', + PrintConv => { + 'km/h' => 'Kilometrów na godzinÄ™', + 'knots' => 'WÄ™zÅ‚y', + 'mph' => 'Mil na godzinÄ™', + }, + }, + 'GPSStatus' => { + Description => 'Stan odbiornika GPS', + PrintConv => { + 'Measurement Active' => 'Trwa pomiar', + 'Measurement Void' => 'Wzajemna niesprzeczność pomiarów', + }, + }, + 'GPSTimeStamp' => 'Czas GPS (zegar atomowy)', + 'GPSTrack' => 'Kierunek przesuniÄ™cia', + 'GPSTrackRef' => { + Description => 'Wartość odniesienia dla kierunku ruchu', + PrintConv => { + 'Magnetic North' => 'Kierunek strzaÅ‚ki magnetycznej', + 'True North' => 'Rzeczywisty kierunek', + }, + }, + 'GPSVersionID' => 'Wersja znacznika GPS', + 'GainControl' => { + Description => 'Sterowanie krokiem', + PrintConv => { + 'High gain down' => 'Z dużym krokiem do doÅ‚u', + 'High gain up' => 'Z dużym krokiem w górÄ™', + 'Low gain down' => 'Z maÅ‚ym krokiem do doÅ‚u', + 'Low gain up' => 'Z maÅ‚ym krokiem w górÄ™', + 'None' => 'Brak', + }, + }, + 'Genre' => 'Gatunek', + 'Gradation' => 'Gradacja', + 'GrayResponseCurve' => 'Krzywa odpowiedzi SzaroÅ›ci', + 'GrayResponseUnit' => 'Wielkość jednostki dla krzywej odpowiedzi szaroÅ›ci', + 'HalftoneHints' => 'Półtony', + 'Headline' => 'Nagłówek', + 'HighISONoiseReduction' => 'Redukcja szumu przy wysokim ISO', + 'HometownCity' => 'Miasto domowe', + 'HometownCityCode' => 'Kod miasta domowego', + 'HometownDST' => { + Description => 'Czas letni miasta domowego', + PrintConv => { + 'No' => 'Nie', + 'Yes' => 'Tak', + }, + }, + 'HostComputer' => 'Komputer użyty do wygenerowania obrazu', + 'Hue' => 'Barwa', + 'ICCProfile' => 'Profil ICC', + 'ISO' => 'CzuÅ‚ość ISO', + 'ISOFloor' => 'Minimalne ISO', + 'ISOSetting' => 'Ustawienia ISO', + 'ImageAreaOffset' => 'PrzesuniÄ™cie obszaru obrazu', + 'ImageDescription' => 'Opis obrazu', + 'ImageEditCount' => 'Licznik przetworzonych zdjęć', + 'ImageHeight' => 'Wysokość obrazu', + 'ImageID' => 'Identyfikator obrazu', + 'ImageProcessing' => 'Przetwarzanie obrazu', + 'ImageSize' => 'Rozmiar zdjÄ™cia', + 'ImageTone' => { + Description => 'OdcieÅ„ zdjÄ™cia', + PrintConv => { + 'Bright' => 'Jasny', + 'Landscape' => 'Krajobraz', + 'Monochrome' => 'Monochromatyczny', + 'Natural' => 'Naturalny', + 'Portrait' => 'Portret', + }, + }, + 'ImageType' => { + Description => 'Rodzaj obrazu', + PrintConv => { + 'Page' => 'Strona', + }, + }, + 'ImageUniqueID' => 'Unikalny kod ID zdjÄ™cia', + 'ImageWidth' => 'Szerokość obrazu', + 'Index' => 'Indeks', + 'Indexed' => { + Description => 'Indeksowane', + PrintConv => { + 'Indexed' => 'Indeksowane', + 'Not indexed' => 'Nie indeksowane', + }, + }, + 'InkNames' => 'Nazwy tuszy', + 'InkSet' => { + Description => 'Zestaw tuszy', + PrintConv => { + 'Not CMYK' => 'Nie CMYK', + }, + }, + 'Instructions' => 'Instrukcje', + 'InternalFlashMode' => 'Tryb wewnÄ™trznej lampy', + 'InternalFlashStrength' => 'Moc wewnÄ™trznej lampy', + 'InteropIndex' => { + Description => 'Identyfikacja wzajemnej zgodnoÅ›ci', + PrintConv => { + 'R03 - DCF option file (Adobe RGB)' => 'R03: Plik pomocniczy DCF (Adobe RGB)', + 'R98 - DCF basic file (sRGB)' => 'R98: Plik zasadniczy DCF (sRGB)', + 'THM - DCF thumbnail file' => 'THM: Plik miniatury DCF', + }, + }, + 'InteropOffset' => 'Znacznik wzajemnej zgodnoÅ›ci', + 'InteropVersion' => 'Wersja wzajemnej zgodnoÅ›ci', + 'JPEGProc' => { + PrintConv => { + 'Baseline' => 'JPEG Podstawowy', + 'Lossless' => 'Bezstratny', + }, + }, + 'JPEGQuality' => { + Description => 'Jakość', + PrintConv => { + 'Standard' => 'Standardowa jakość', + }, + }, + 'JPEGRestartInterval' => 'JPEG odstÄ™p restartów', + 'Keywords' => 'SÅ‚owa kluczowe', + 'Lens' => 'Obiektyw', + 'LensID' => 'ID obiektywu', + 'LensInfo' => 'Informacja o obiektywie', + 'LensMake' => 'Producent obiektywu', + 'LensModel' => 'Model obiektywu', + 'LensSerialNumber' => 'Numer seryjny obiektywu', + 'LightReading' => 'Pomiar Å›wiatÅ‚a', + 'LightSource' => { + Description => 'ŹródÅ‚o Å›wiatÅ‚a', + PrintConv => { + 'Cloudy' => 'Zachmurzone niebo', + 'Cool White Fluorescent' => 'Zimna biaÅ‚a jarzeniówka (W 3800 - 4500K)', + 'Day White Fluorescent' => 'Jarzeniówka z naturalnym biaÅ‚ym Å›wiatÅ‚em (N 4600 - 5500K)', + 'Daylight' => 'ÅšwiatÅ‚o dzienne', + 'Daylight Fluorescent' => 'Jarzeniówka dajÄ…ca Å›wiatÅ‚o dzienne (D 5700 - 7100K)', + 'Fine Weather' => 'Dobra pogoda', + 'Flash' => 'Lampa bÅ‚yskowa', + 'Fluorescent' => 'Jarzeniowy', + 'ISO Studio Tungsten' => 'ISO dla studyjnych lamp żarowych', + 'Other' => 'Inne źródÅ‚o Å›wiatÅ‚a', + 'Shade' => 'CieÅ„', + 'Standard Light A' => 'Standardowe Å›wiatÅ‚o A', + 'Standard Light B' => 'Standardowe Å›wiatÅ‚o B', + 'Standard Light C' => 'Standardowe Å›wiatÅ‚o C', + 'Tungsten (Incandescent)' => 'ÅšwiatÅ‚o żarowe', + 'Unknown' => 'Nieznane', + 'White Fluorescent' => 'BiaÅ‚a jarzeniówka (WW3250 - 3800K)', + }, + }, + 'Lightness' => 'Jasność', + 'LocalizedCameraModel' => 'Lokalizowany model aparatu', + 'Location' => 'Miejsce', + 'Luminance' => 'Luminancja', + 'Macro' => 'Makro', + 'Make' => 'Producent', + 'MakeAndModel' => 'Producent i model', + 'MakerNote' => 'Prywatne dane DNG', + 'MakerNotes' => 'Dane producenta', + 'MaxAperture' => 'Maks. przysÅ‚ona obiektywu', + 'MaxSampleValue' => 'Maksymalny rozmiar próbki', + 'MeasurementGeometry' => { + Description => 'Geometria pomiaru', + PrintConv => { + '0/45 or 45/0' => '0/45 lub 45/0', + '0/d or d/0' => '0/d lub d/0', + }, + }, + 'MediaBlackPoint' => 'Punkt czerni materiaÅ‚u', + 'MediaWhitePoint' => 'Punkt bieli materiaÅ‚u', + 'MeteringMode' => { + Description => 'Tryb pomiaru', + PrintConv => { + 'Average' => 'Åšredni', + 'Center-weighted average' => 'Centralnie ważony uÅ›redniony', + 'Multi-segment' => 'Wzór', + 'Multi-spot' => 'Wielopunktowy', + 'Other' => 'Inne', + 'Partial' => 'Częściowy', + 'Spot' => 'Punktowy', + 'Unknown' => 'Nieznane', + }, + }, + 'MinSampleValue' => 'Minimalny rozmiar próbki', + 'ModeNumber' => 'Numer trybu', + 'Model' => 'Aparat', + 'ModifiedPictureStyle' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'ModifyDate' => 'Data i godzina zmiany pliku', + 'MonochromeFilterEffect' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'MonochromeToningEffect' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'MultipleExposureSet' => 'Wielokrotna ekspozycja', + 'NEFCompression' => { + PrintConv => { + 'Uncompressed' => 'Bez kompresji', + }, + }, + 'NativeDisplayInfo' => 'Informacja o natywnym(?) wyÅ›wietlaczu', + 'Noise' => 'Szumy', + 'NoiseReduction' => { + Description => 'Redukcja szumów', + PrintConv => { + 'Off' => 'WyÅ‚Ä…czona', + 'On' => 'WÅ‚Ä…czona', + }, + }, + 'NumberofInks' => 'Liczba tuszy', + 'ObjectFileType' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'OldSubfileType' => { + Description => 'Stary typ podsekcji', + PrintConv => { + 'Full-resolution image' => 'Obraz w peÅ‚nej rozdzielczoÅ›ci', + 'Reduced-resolution image' => 'Obraz o zredukowanej rozdzielczoÅ›ci', + 'Single page of multi-page image' => 'Jedna strona obrazu wielostronicowego', + }, + }, + 'Opto-ElectricConvFactor' => 'Współczynnik przeksztaÅ‚cenia optyczno-elektrycznego', + 'Orientation' => { + Description => 'Orientacja obrazu', + PrintConv => { + 'Horizontal (normal)' => '0° (góra/lewo)', + 'Mirror horizontal' => '0° (góra/prawo)', + 'Mirror horizontal and rotate 270 CW' => '90° CW (lewo/góra)', + 'Mirror horizontal and rotate 90 CW' => '90° CCW (prawo/dół)', + 'Mirror vertical' => '180° (dół/lewo)', + 'Rotate 180' => '180° (dół/prawo)', + 'Rotate 270 CW' => '90° CW (lewo/dół)', + 'Rotate 90 CW' => '90° CCW (prawo/góra)', + }, + }, + 'OwnerName' => 'Nazwa wÅ‚aÅ›ciciela', + 'PageName' => 'Nazwa strony', + 'PageNumber' => 'Numer strony', + 'PentaxImageSize' => { + Description => 'Rozmiar obrazu Pentax\'a', + PrintConv => { + '2304x1728 or 2592x1944' => '2304 x 1728 lub 2592 x 1944', + '2560x1920 or 2304x1728' => '2560 x 1920 lub 2304 x 1728', + '2816x2212 or 2816x2112' => '2816 x 2212 lub 2816 x 2112', + '3008x2008 or 3040x2024' => '3008 x 2008 lub 3040 x 2024', + 'Full' => 'PeÅ‚ny', + }, + }, + 'PentaxVersion' => 'Wersja Pentax\'a', + 'PhotoEffectsType' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'PhotometricInterpretation' => { + Description => 'Schemat pikseli', + PrintConv => { + 'BlackIsZero' => 'Czarny jest zerem', + 'Color Filter Array' => 'CFA (Filtr kolorów matrycy)', + 'Pixar LogL' => 'CIE Log2(L) (Log luminancji)', + 'Pixar LogLuv' => 'CIE Log2(l)(u\',v\') (Log luminancji i chrominancji)', + 'RGB Palette' => 'Paleta kolorów', + 'Transparency Mask' => 'Maska przeźroczystoÅ›ci', + 'WhiteIsZero' => 'BiaÅ‚y jest zerem', + }, + }, + 'PictureMode' => 'Tryb obrazu', + 'PictureMode2' => 'Tryb obrazu 2', + 'PictureStyle' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'PixelFormat' => { + Description => 'Format zapisu koloru', + PrintConv => { + '128-bit PRGBA Float' => '128-bitów PRGBA (zapis zmienno przecinkowy)', + '128-bit RGB Float' => '128-bitów RGB (zapis zmienno przecinkowy)', + '128-bit RGBA Float' => '128-bitów RGBA (zapis zmienno przecinkowy)', + '16-bit Gray' => '16-bitów Szarość', + '32-bit Gray Float' => '32-bity Szarość (zapis zmienno przecinkowy)', + '48-bit RGB Fixed Point' => '48-bitów RGB (zapis staÅ‚opozycyjny)', + '8-bit Gray' => '8-bitów Szarość', + '96-bit RGB Fixed Point' => '96-bitów RGB (zapis staÅ‚opozycyjny)', + 'Black & White' => 'Czarno BiaÅ‚y', + }, + }, + 'PlanarConfiguration' => { + Description => 'UkÅ‚ad danych obrazu', + PrintConv => { + 'Chunky' => 'Format "chunky" (z przeplotem)', + 'Planar' => 'Format "planar"', + }, + }, + 'PowerSource' => 'Zasilanie', + 'Predictor' => { + Description => 'Przelicznik', + PrintConv => { + 'Horizontal differencing' => 'W oparciu o różnicÄ™ w poziomie', + 'None' => 'Bez przelicznika', + }, + }, + 'Preview0' => 'PodglÄ…d 0', + 'Preview1' => 'PodglÄ…d 1', + 'Preview2' => 'PodglÄ…d 2', + 'PreviewColorSpace' => { + PrintConv => { + 'Unknown' => 'Nieznany', + }, + }, + 'PreviewImage' => 'PodglÄ…d', + 'PreviewImageBorders' => 'Ramka podglÄ…du', + 'PreviewImageData' => 'Dane podglÄ…du obrazu', + 'PreviewImageLength' => 'DÅ‚ugość miniatury z podglÄ…dem', + 'PreviewImageSize' => 'Rozmiar podglÄ…du', + 'PreviewImageStart' => 'PoczÄ…tek miniatury z podglÄ…dem', + 'PrimaryChromaticities' => 'Tonalność kolorów podstawowych', + 'ProcessingSoftware' => 'Oprogramowanie wykorzystane do przetwarzania', + 'ProductID' => 'ID produktu', + 'ProfileCMMType' => 'Typ profilu CMM', + 'ProfileClass' => { + Description => 'Klasa profilu', + PrintConv => { + 'Abstract Profile' => 'Profil abstrakcyjny', + 'ColorSpace Conversion Profile' => 'Profil konwersji przestrzeni barw', + 'DeviceLink Profile' => 'Profil DeviceLink', + 'Display Device Profile' => 'Profil urzÄ…dzenia wyÅ›wietlajÄ…cego', + 'Input Device Profile' => 'Profil urzÄ…dzenia wejÅ›ciowego', + 'NamedColor Profile' => 'Nazwany profil kolorów', + 'Nikon Input Device Profile (NON-STANDARD!)' => 'Profil Nikon ("nkpf")', + 'Output Device Profile' => 'Profil urzÄ…dzenia wyjÅ›ciowego', + }, + }, + 'ProfileConnectionSpace' => 'Profil Connection Space', + 'ProfileDateTime' => 'Data i czas profilu', + 'ProfileDescription' => 'Opis profilu', + 'ProfileDescriptionML' => 'WielojÄ™zyczny opis profilu.', + 'ProfileSequenceDesc' => 'Opis sekwencji profilu', + 'ProfileType' => { + Description => 'Typ profilu', + PrintConv => { + 'Unspecified' => 'Nie podany', + }, + }, + 'ProfileVersion' => 'Wersja profilu', + 'ProgramLine' => 'Linia programu', + 'ProgramMode' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'Province-State' => 'Region', + 'Quality' => { + Description => 'Jakość', + PrintConv => { + 'Best' => 'Najlepsza', + 'Better' => 'Lepsza', + 'Good' => 'Dobra', + 'Low' => 'Niska jakość', + 'Normal' => 'Standardowa jakość', + }, + }, + 'Rating' => 'Ocena', + 'RatingPercent' => 'Ocena procentowo', + 'RawImageSize' => 'Rozmiar obrazu RAW', + 'RecordMode' => 'Tryb zapisu', + 'RedBalance' => 'Balans czerwonego', + 'RedMatrixColumn' => 'Kolumna matrycy czerwieni', + 'RedTRC' => 'Krzywa reprodukcji czerwieni', + 'ReferenceBlackWhite' => 'Para wartoÅ›ci odniesienia dla czarno-biaÅ‚ego obrazu', + 'RelatedImageFileFormat' => 'Format pliku powiÄ…zanego zdjÄ™cia', + 'RelatedImageHeight' => 'DÅ‚ugość powiÄ…zanego zdjÄ™cia', + 'RelatedImageWidth' => 'Szerokość powiÄ…zanego zdjÄ™cia', + 'RelatedSoundFile' => 'PowiÄ…zany plik audio', + 'ResolutionUnit' => { + Description => 'Jednostka rozdzielczoÅ›ci X i Y', + PrintConv => { + 'None' => 'Brak', + 'cm' => 'centymetry', + 'inches' => 'Cal', + }, + }, + 'RetouchHistory' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'Rotation' => { + Description => 'Obrót', + PrintConv => { + 'Horizontal' => '0° (góra/lewo)', + 'Horizontal (Normal)' => '0° (góra/lewo)', + 'Horizontal (normal)' => '0° (góra/lewo)', + 'Rotate 180' => '180° (dół/prawo)', + 'Rotate 270 CW' => '90° CW (lewo/dół)', + 'Rotate 90 CW' => '90° CCW (prawo/góra)', + 'Rotated 180' => '180° (dół/prawo)', + 'Rotated 270 CW' => '90° CW (lewo/dół)', + 'Rotated 90 CW' => '90° CCW (prawo/góra)', + }, + }, + 'RowsPerStrip' => 'Liczba rzÄ™dów w pasku', + 'SRFocalLength' => 'DÅ‚ugość fokalna SR', + 'SRResult' => 'Stabilizacja obrazu', + 'SampleFormat' => { + Description => 'Format próbki', + PrintConv => { + 'Float' => 'Zmienno przecinkowa', + 'Signed' => 'CaÅ‚kowita ze znakiem', + 'Undefined' => 'Nie podano', + 'Unsigned' => 'CaÅ‚kowita bez znaku', + }, + }, + 'SamplesPerPixel' => 'Liczba skÅ‚adników', + 'Saturation' => { + Description => 'Nasycenie', + PrintConv => { + 'High' => 'Wysokie nasycenie', + 'Low' => 'Niskie nasycenie', + 'Normal' => 'Standardowy', + }, + }, + 'SceneCaptureType' => { + Description => 'UjÄ™cie z programem tematycznym', + PrintConv => { + 'Landscape' => 'Krajobraz', + 'Night' => 'Sceny nocne', + 'Portrait' => 'Portret', + 'Standard' => 'Standardowy', + }, + }, + 'SceneMode' => { + Description => 'Tryby tematyczne', + PrintConv => { + 'Sunset' => 'Zachód sÅ‚oÅ„ca', + }, + }, + 'SceneType' => { + Description => 'Rodzaj sceny', + PrintConv => { + 'Directly photographed' => 'ZdjÄ™cie uzyskane bezpoÅ›rednio', + }, + }, + 'SensingMethod' => { + Description => 'Metoda pomiaru', + PrintConv => { + 'Color sequential area' => 'Sekwencyjny sensor obszaru koloru', + 'Color sequential linear' => 'Sekwencyjny liniowy sensor koloru', + 'One-chip color area' => 'Jednoprocesorowy sensor obszaru koloru', + 'Three-chip color area' => 'Trójprocesorowy sensor obszaru koloru', + 'Trilinear' => 'Trój liniowy sensor', + 'Two-chip color area' => 'Dwuprocesorowy sensor obszaru koloru', + }, + }, + 'SensitivityAdjust' => 'Regulacja czuÅ‚oÅ›ci', + 'SensitivitySteps' => 'Krok ustawienia czuÅ‚oÅ›ci', + 'SequentialShot' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'SerialNumber' => 'ID aparatu fotograficznego', + 'ServiceIdentifier' => 'Identyfikator usÅ‚ugi', + 'ShadingCompensation' => 'Kompensacja zacienienia', + 'Sharpness' => { + Description => 'Ostrość', + PrintConv => { + 'Hard' => 'Ostry', + 'Normal' => 'Standardowy', + 'Soft' => 'MiÄ™kki', + }, + }, + 'ShootingMode' => 'Tryb fotografowania', + 'ShutterCount' => 'Licznik migawki', + 'ShutterSpeed' => 'Czas ekspozycji', + 'ShutterSpeedValue' => 'PrÄ™dkość migawki', + 'SlaveFlashMeteringSegments' => 'Segmenty pomiarowe lampy podrzÄ™dnej', + 'SlowShutter' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'Software' => 'Oprogramowanie', + 'Source' => 'ŹródÅ‚o', + 'SpatialFrequencyResponse' => 'Przestrzenno - czÄ™stotliwoÅ›ciowa charakterystyka', + 'SpecialEffectsOpticalFilter' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'SpectralSensitivity' => 'CzuÅ‚ość spektralna', + 'State' => 'Region', + 'StripByteCounts' => 'Bajtów na skompresowany pasek', + 'StripOffsets' => 'Lokalizacja danych zdjÄ™cia', + 'SubSecTime' => '"Data i godzina, subsekundy"', + 'SubSecTimeDigitized' => '"Cyfrowa data i godzina, subsekundy"', + 'SubSecTimeOriginal' => '"Pierwotna data i godzina, sub-sekundy"', + 'SubfileType' => { + Description => 'Typ podsekcji', + PrintConv => { + 'Full-resolution image' => 'Obraz w peÅ‚nej rozdzielczoÅ›ci', + 'Reduced-resolution image' => 'Obraz o zredukowanej rozdzielczoÅ›ci', + 'Single page of multi-page image' => 'Jedna strona obrazu wielostronicowego', + 'Single page of multi-page reduced-resolution image' => 'Jedna strona obrazu wielostronicowego o zredukowanej rozdzielczoÅ›ci', + 'TIFF/IT final page' => 'Ostatnia strona TIFF/IT', + 'Transparency mask' => 'Maska przezroczystoÅ›ci', + 'Transparency mask of multi-page image' => 'Maska przezroczystoÅ›ci obrazu wielostronicowego', + 'Transparency mask of reduced-resolution image' => 'Maska przezroczystoÅ›ci obrazu o zredukowanej rozdzielczoÅ›ci', + 'Transparency mask of reduced-resolution multi-page image' => 'Maska przezroczystoÅ›ci obrazu wielostronicowego o zredukowanej rozdzielczoÅ›ci', + 'invalid' => 'BÅ‚Ä™dny', + }, + }, + 'SubjectArea' => 'Obszar obiektu', + 'SubjectDistance' => 'OdlegÅ‚ość od obiektu', + 'SubjectDistanceRange' => { + Description => 'Zakres odlegÅ‚oÅ›ci do obiektu', + PrintConv => { + 'Close' => 'Zbliżenie', + 'Distant' => 'OdlegÅ‚y plan', + 'Macro' => 'Makro', + }, + }, + 'SubjectLocation' => 'Lokalizacja obiektu', + 'SubjectProgram' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'SupplementalCategories' => 'Kategorie dodatkowe', + 'SvISOSetting' => 'Ustawienia ISO Sv', + 'T6Options' => { + PrintConv => { + 'Uncompressed' => 'Nieskompresowany', + }, + }, + 'TargetPrinter' => 'Docelowa drukarka', + 'Technology' => { + Description => 'Technologia', + PrintConv => { + 'Active Matrix Display' => 'WyÅ›wietlacz z matrycÄ… aktywnÄ…', + 'Cathode Ray Tube Display' => 'WyÅ›wietlacz kineskopowy', + 'Digital Camera' => 'Aparat cyfrowy', + 'Dye Sublimation Printer' => 'Drukarka termosublimacyjna', + 'Electrophotographic Printer' => 'Drukarka laserowa', + 'Film Scanner' => 'Skaner do filmów', + 'Film Writer' => 'Zapis na filmie', + 'Ink Jet Printer' => 'Drukarka atramentowa', + 'Passive Matrix Display' => 'WyÅ›wietlacz z matrycÄ… pasywnÄ…', + 'Photo CD' => 'Foto-CD', + 'Photographic Paper Printer' => 'Drukarka z papierem fotograficznym', + 'Projection Television' => 'Projektor telewizyjny', + 'Reflective Scanner' => 'Skaner', + 'Video Camera' => 'Kamera wideo', + 'Video Monitor' => 'Monitor wideo', + }, + }, + 'Teleconverter' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'Text' => 'Tekst', + 'Thresholding' => 'Progowanie', + 'ThumbnailImage' => 'Miniatura', + 'ThumbnailImageSize' => 'Rozmiar miniaturki', + 'TileByteCounts' => 'Liczba bajtów na kafelek', + 'TileLength' => 'Wysokość kafelka', + 'TileOffsets' => 'PrzesuniÄ™cie kafelków', + 'TileWidth' => 'Szerokość kafelka', + 'Time' => 'Czas', + 'Title' => 'TytuÅ‚', + 'ToneCurve' => 'Krzywa barwy', + 'ToneCurves' => 'Krzywe barwy', + 'ToningEffectMonochrome' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'Track' => 'Åšcieżka', + 'TransferFunction' => 'Funkcja transferu', + 'Transformation' => { + Description => 'PrzeksztaÅ‚cenie', + PrintConv => { + 'Horizontal (normal)' => '0° (góra/lewo)', + 'Mirror horizontal' => '0° (góra/prawo)', + 'Mirror horizontal and rotate 270 CW' => '90° CW (lewo/góra)', + 'Mirror horizontal and rotate 90 CW' => '90° CCW (prawo/dół)', + 'Mirror vertical' => '180° (dół/lewo)', + 'Rotate 180' => '180° (dół/prawo)', + 'Rotate 270 CW' => '90° CW (lewo/dół)', + 'Rotate 90 CW' => '90° CCW (prawo/góra)', + }, + }, + 'TransmissionReference' => 'OdnoÅ›nik transmisji', + 'TvExposureTimeSetting' => 'Ustawienia czasu ekspozycji TV', + 'Uncompressed' => 'Nieskompresowany', + 'UniqueCameraModel' => 'Unikatowy model aparatu', + 'Unknown' => 'Nieznany', + 'Urgency' => 'Priorytet', + 'UserComment' => 'Komentarz użytkownika', + 'VersionYear' => 'Rok wersji', + 'VideoCardGamma' => 'Gamma karty graficznej', + 'WBAdjLighting' => { + PrintConv => { + 'None' => 'Brak', + }, + }, + 'WB_RGGBLevelsCloudy' => 'Poziomy WB RGGB - zachmurzenie ', + 'WB_RGGBLevelsDaylight' => 'Poziomy WB RGGB - Å›wiatÅ‚o dzienne ', + 'WB_RGGBLevelsFlash' => 'Poziomy WB RGGB - lampa bÅ‚yskowa ', + 'WB_RGGBLevelsFluorescentD' => 'Poziomy WB RGGB - Å›wiatÅ‚o fluorescencyjne ', + 'WB_RGGBLevelsFluorescentN' => 'Poziomy WB RGGB - Å›wiatÅ‚o fluorescencyjne N ', + 'WB_RGGBLevelsFluorescentW' => 'Poziomy WB RGGB - Å›wiatÅ‚o fluorescencyjne W ', + 'WB_RGGBLevelsShade' => 'Poziomy WB RGGB - cieÅ„ ', + 'WB_RGGBLevelsTungsten' => 'Poziomy WB RGGB - Å›wiatÅ‚o żarowe ', + 'WhiteBalance' => { + Description => 'Balans bieli', + PrintConv => { + 'Auto' => 'Automatyczny balans bieli', + 'Black & White' => 'Monochromatyczny', + 'Cloudy' => 'Pochmurna pogoda', + 'Cool White Fluorescent' => 'Jarzeniówka z zimnym biaÅ‚ym Å›wiatÅ‚em', + 'Custom 1' => 'WÅASNE 1', + 'Custom 2' => 'WÅASNE 2', + 'Custom 3' => 'WÅASNE 3', + 'Custom 4' => 'WÅASNE 4', + 'Day White Fluorescent' => 'Jarzeniówka z naturalnym biaÅ‚ym Å›wiatÅ‚em', + 'Daylight' => 'ÅšwiatÅ‚o dzienne', + 'Daylight Fluorescent' => 'Jarzeniówka ze Å›wiatÅ‚em dziennym', + 'Fluorescent' => 'Jarzeniowy', + 'Manual' => 'Manualny balans bieli', + 'Shade' => 'CieÅ„', + 'Tungsten' => 'ÅšwiatÅ‚o żarówek', + }, + }, + 'WhiteBalanceMode' => { + Description => 'Tryb balansu bieli', + PrintConv => { + 'Auto (Cloudy)' => 'Automatyczny (zachmurzenie)', + 'Auto (Day White Fluorescent)' => 'Automatyczny (biaÅ‚e fluorescencyjne Å›wiatÅ‚o dzienne)', + 'Auto (Daylight Fluorescent)' => 'Automatyczny (fluorescencyjne Å›wiatÅ‚o dzienne)', + 'Auto (Daylight)' => 'Automatyczny (Å›wiatÅ‚o dzienne)', + 'Auto (Flash)' => 'Automatyczny (lampa bÅ‚yskowa)', + 'Auto (Shade)' => 'Automatyczny (cieÅ„)', + 'Auto (Tungsten)' => 'Automatyczny (Å›wiatÅ‚o żarowe)', + 'Auto (White Fluorescent)' => 'Automatyczny (biaÅ‚e Å›wiatÅ‚o fluorescencyjne)', + 'Unknown' => 'Automatyczny (nie wykryty)', + 'User-Selected' => 'Użytkownika', + }, + }, + 'WhiteBalanceSet' => 'Ustawienie balansu bieli', + 'WhitePoint' => 'Chromatyczność biaÅ‚ego punktu', + 'WorldTimeLocation' => { + Description => 'Miejsca czasu Å›wiatowego', + PrintConv => { + 'Destination' => 'Przeznaczenie', + 'Hometown' => 'Miasto domowe', + }, + }, + 'Writer-Editor' => 'Autor podpisu', + 'XClipPathUnits' => 'Jednostki wzdÅ‚uż osi X dla Å›cieżki obciÄ™cia', + 'XPosition' => 'WspółrzÄ™dna X', + 'XResolution' => 'Rozdzielczość obrazu w poziomie', + 'YCbCrCoefficients' => 'Współczynniki matrycy transformacji przestrzeni barwowej', + 'YCbCrPositioning' => { + Description => 'Pozycje Y i C', + PrintConv => { + 'Centered' => 'WyÅ›rodkowane', + 'Co-sited' => 'Obok siebie (?)', + }, + }, + 'YCbCrSubSampling' => 'Współczynnik podpróbkowania(?) Y do C', + 'YClipPathUnits' => 'Jednostki wzdÅ‚uż osi Y dla Å›cieżki obciÄ™cia', + 'YPosition' => 'WspółrzÄ™dna Y', + 'YResolution' => 'Rozdzielczość obrazu w pionie', + 'Year' => 'Rok', +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::pl.pm - ExifTool Polish language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke, Przemyslaw Sulek and Kacper Perschke for providing +this translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/ru.pm b/lib/Image/ExifTool/Lang/ru.pm new file mode 100644 index 0000000..bcf088f --- /dev/null +++ b/lib/Image/ExifTool/Lang/ru.pm @@ -0,0 +1,5736 @@ +#------------------------------------------------------------------------------ +# File: ru.pm +# +# Description: ExifTool Russian language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::ru; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.08'; + +%Image::ExifTool::Lang::ru::Translate = ( + 'A100DataOffset' => 'Смещение данных (Sony A100)', + 'ABDate' => 'AB – Дата', + 'ABLabel' => 'AB – Метка', + 'ABRelatedNames' => 'AB – Похожие имена', + 'AB_UID' => 'AB – Уникальный ID', + 'AFAdjustment' => 'Регулировка автофокуÑа', + 'AIBuildNumber' => 'AI – Ðомер Ñборки', + 'AIColorModel' => 'AI – Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ', + 'AIColorUsage' => 'AI – ИÑпользование цвета', + 'AICreatorVersion' => 'AI – ВерÑÐ¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ', + 'AIFileFormat' => 'AI – Формат файла', + 'AINumLayers' => 'AI – КоличеÑтво Ñлоёв', + 'AIRulerUnits' => { + Description => 'AI – Единицы линейки', + PrintConv => { + 'Centimeters' => 'Сантиметры', + 'Inches' => 'Дюймы', + 'Millimeters' => 'Милиметры', + 'Picas' => 'Пики', + 'Pixels' => 'ПикÑели', + 'Points' => 'Точки', + }, + }, + 'AITargetResolution' => 'AI – Целевое разрешение', + 'APEVersion' => 'ВерÑÐ¸Ñ APE', + 'ARMIdentifier' => 'Идентификатор ARM', + 'ARMVersion' => 'ВерÑÐ¸Ñ ARM', + 'ATSCContent' => { + Description => 'Контент ATSC', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'About' => 'Об', + 'AbsoluteAltitude' => 'ÐбÑÐ¾Ð»ÑŽÑ‚Ð½Ð°Ñ Ð²Ñ‹Ñота', + 'Abstract' => 'Краткое опиÑание', + 'AbstractFileName' => 'Файл Ñ Ð°Ð±Ñтрактной информацией', + 'Acceleration' => 'УÑкорение', + 'AccelerationVector' => 'Вектор уÑкорениÑ', + 'Accelerometer' => 'ÐкÑелерометр', + 'AccelerometerTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð°ÐºÑелерометра', + 'AccelerometerX' => 'ÐкÑелерометр – X', + 'AccelerometerY' => 'ÐкÑелерометр – Y', + 'AccelerometerZ' => 'ÐкÑелерометр – Z', + 'AccessDate' => 'Дата поÑледнего доÑтупа', + 'Acknowledged' => 'БлагодарноÑти', + 'Action' => 'ДейÑтвие', + 'ActionAdvised' => { + Description => 'Рекомендуемое дейÑтвие', + PrintConv => { + 'Object Append' => 'Добавить объект', + 'Object Kill' => 'Уничтожить объект', + 'Object Reference' => 'Сделать ÑÑылку на объект', + 'Object Replace' => 'Заменить объект', + }, + }, + 'ActiveArea' => 'ÐÐºÑ‚Ð¸Ð²Ð½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ', + 'Actor' => 'Ðктёр', + 'Address' => 'ÐдреÑÑ', + 'AdoptedNeutral' => 'ПринÑтый как нейтральный', + 'Adult' => 'Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых', + 'AdultContentWarning' => { + Description => 'Предупреждение о Ñодержании Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых', + PrintConv => { + 'Adult Content Warning Required' => 'ТребуетÑÑ', + 'Not Required' => 'Ðе требуетÑÑ', + 'Unknown' => 'Ðе задано', + }, + }, + 'AdvancedSceneMode' => { + Description => 'РаÑширенный режим Ñцены', + PrintConv => { + 'Architecture' => 'Ðрхитектура', + 'Bleach Bypass' => 'Удержание Ñеребра', + 'Cinema' => 'Кино', + 'Color Select' => 'Выбранный цвет', + 'Creative Macro' => 'ТворчеÑкий макро', + 'Creative Night Scenery' => 'ТворчеÑкий ночной пейзаж', + 'Creative Portrait' => 'ТворчеÑкий портрет', + 'Creative Scenery' => 'ТворчеÑкий пейзаж', + 'Creative Sports' => 'ТворчеÑкий Ñпорт', + 'Cross Process' => 'КроÑÑпроцеÑÑ', + 'Dynamic Art' => 'Динамика', + 'Dynamic Monochrome' => 'Динамичное монохромное', + 'Elegant' => 'Элегантный', + 'Expressive' => 'Выразительный', + 'Fantasy' => 'ФÑнтези', + 'Flower' => 'Цветок', + 'HDR Art' => 'HDR', + 'HDR B&W' => 'Чёрно-Белый HDR', + 'Handheld Night Shot' => 'ÐÐ¾Ñ‡Ð½Ð°Ñ Ñъёмка Ñ Ñ€ÑƒÐºÐ¸', + 'High Dynamic' => 'Ð’Ñ‹ÑÐ¾ÐºÐ°Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÐºÐ°', + 'High Key' => 'Ð’ выÑоком ключе', + 'Illuminations' => 'Свеча', + 'Impressive Art' => 'ВпечатлÑющий', + 'Indoor Portrait' => 'Внутренний портрет', + 'Indoor Sports' => 'Спорт в помещении', + 'Low Key' => 'Ð’ низком ключе', + 'Miniature' => 'Миниатюра', + 'Monochrome' => 'Монохромный', + 'Nature' => 'Природа', + 'Objects' => 'Объекты', + 'Old Days' => 'Старые времена', + 'Outdoor Portrait' => 'Ðаружный портрет', + 'Outdoor Sports' => 'Спорт на открытом воздухе', + 'Pure' => 'ЧиÑтый', + 'Retro' => 'Ретро', + 'Rough Monochrome' => 'Грубый монохромный', + 'Sepia' => 'СепиÑ', + 'Silhouette' => 'СилуÑÑ‚', + 'Silky Monochrome' => 'ШелковиÑтый монохромный', + 'Soft' => 'ÐœÑгкий', + 'Star' => 'Звёзды', + 'Sunshine' => 'Солнечный Ñвет', + 'Toy Effect' => 'Эффект ломографии', + 'Toy Pop' => 'Ð›Ð¾Ð¼Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ цвета', + }, + }, + 'AdventRevision' => 'Проверка поÑвлениÑ', + 'AdventScale' => 'МаÑштаб поÑвлениÑ', + 'AffineA' => 'Ðфинное преобразование A', + 'AffineB' => 'Ðфинное преобразование B', + 'AffineC' => 'Ðфинное преобразование C', + 'AffineD' => 'Ðфинное преобразование D', + 'AffineTransformMat' => 'Матрица Ðфинного преобразованиÑ', + 'AffineX' => 'Ðфинное преобразование X', + 'AffineY' => 'Ðфинное преобразование Y', + 'AlarmUID' => 'Уникальный ID Ñигнала', + 'Album' => 'Ðльбом', + 'AlbumArtist' => 'ИÑполнитель альбома', + 'AliasLayerMetadata' => 'ПÑевдоним метаданных ÑлоÑ', + 'Alignment' => 'Выравнивание', + 'AllColorFlatField1' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð¿Ð»Ð¾Ñкого Ð¿Ð¾Ð»Ñ â€“ Ð’Ñе цвета 1', + 'AllColorFlatField2' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð¿Ð»Ð¾Ñкого Ð¿Ð¾Ð»Ñ â€“ Ð’Ñе цвета 2', + 'AllColorFlatField3' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð¿Ð»Ð¾Ñкого Ð¿Ð¾Ð»Ñ â€“ Ð’Ñе цвета 3', + 'AllDayEvent' => 'Событие на веÑÑŒ день', + 'Alpha' => { + Description => 'Ðльфа-канал', + PrintConv => { + 'Alpha Exists (W color component)' => 'Ðльфа-канал приÑутÑтвует (цветной компонент W)', + 'Alpha Exists (color not premultiplied)' => 'Ðльфа-канал приÑутÑтвует (не предварительно умноженный цвет)', + 'Alpha Exists (color premultiplied)' => 'Ðльфа-канал приÑутÑтвует (предварительно умноженный цвет)', + 'No Alpha Plane' => 'Ðльфа-канал отÑутÑтвует', + }, + }, + 'AlphaByteCount' => 'Размер альфа-канала (байт)', + 'AlphaChannelsNames' => 'ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ð°Ð»ÑŒÑ„Ð°-каналов', + 'AlphaDataDiscard' => { + Description => 'Отброшенные данные альфа-канала', + PrintConv => { + 'Flexbits Discarded' => 'Гибкие биты отброшены', + 'Full Resolution' => 'Полное разрешение', + 'HighPass Frequency Data Discarded' => 'Данные выÑоких чаÑтот отброшены', + 'Highpass and LowPass Frequency Data Discarded' => 'Данные выÑоких и низких чаÑтот отброшены', + }, + }, + 'AlphaIdentifiers' => 'Идентификаторы альфа-канала', + 'AlphaMask' => 'МаÑка Ðльфа-канала', + 'AlphaOffset' => 'Смещение альфа-канала', + 'AlternateDuotoneColors' => 'Ðльтернативные цвета Duotone', + 'AlternateSpotColors' => 'Ðльтернативные плашечные цвета', + 'AmbientInfrared' => 'Внешний инфракраÑный Ñвет', + 'AmbientLight' => 'Внешнее оÑвещение', + 'AmbientTemperature' => 'Температура окружающей Ñреды', + 'AmbientTemperatureFahrenheit' => 'Температура окружающей Ñреды по Фаренгейту', + 'AnalogBalance' => 'Ðналоговый Ð±Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾', + 'AngleInfoRoll' => 'Угол Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ (крен)', + 'AngleInfoYaw' => 'Угол поворота (рыÑкание)', + 'AnimationControl' => 'Управление анимацией', + 'AnimationFrames' => 'Кадры анимации', + 'AnimationIterations' => 'Повторений анимации', + 'AnimationPlays' => 'Проигрывание анимации', + 'Anniversary' => 'Годовщина', + 'Annotation' => 'ÐннотациÑ', + 'AnnotationUsageRights' => 'Права на иÑпользование Ðннотации', + 'Annotations' => 'Ðннотации', + 'Announce' => 'Трекер', + 'AnnounceList1' => 'СпиÑок трекеров 1', + 'AntiAliasStrength' => 'Сила ÑглаживаниÑ', + 'Aperture' => 'Диафрагма', + 'ApertureValue' => 'Диафрагма', + 'AppleKeywords' => 'Apple – Ключевые Ñлова', + 'AppleMailDateReceived' => 'Apple Mail – Дата получениÑ', + 'AppleMailDateSent' => 'Apple Mail – Дата отправки', + 'AppleMailFlagged' => 'Apple Mail – Отмечено флажком', + 'AppleMailIsRemoteAttachment' => 'Apple Mail – Ðаличие удалённого вложениÑ', + 'AppleMailMessageID' => 'Apple Mail – ID ÑообщениÑ', + 'AppleMailPriority' => 'Apple Mail – Приоритет', + 'AppleMailRead' => 'Apple Mail – Прочитано', + 'AppleMailRepliedTo' => 'Apple Mail – Отвечено', + 'Application' => 'Приложение', + 'ApplicationData' => 'Данные об уÑтройÑтве', + 'ApplicationNotes' => 'ÐŸÑ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ', + 'ApplicationRecordVersion' => 'ВерÑÐ¸Ñ Application Record', + 'AppointmentSequence' => 'ПоÑледовательноÑÑ‚ÑŒ назначениÑ', + 'ApproximateFocusDistance' => 'Приблизительное раÑÑтоÑние фокуÑировки', + 'ArchivedFileName' => 'Ðазвание заархивированного файла', + 'Artist' => 'ИÑполнитель', + 'ArtistLen' => 'ИÑполнитель Len', + 'AsShotICCProfile' => 'ICC-профиль при Ñъёмке', + 'AsShotNeutral' => 'Ðейтральный цвет при Ñъёмке', + 'AsShotPreProfileMatrix' => 'Предварительный профиль матрицы при Ñъёмке', + 'AsShotProfileName' => 'Ðазвание Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ñ€Ð¸ Ñъёмке', + 'AsShotWhiteXY' => 'XY белого при Ñъёмке', + 'Ascender' => 'ÐадÑтрочный интервал', + 'Ascent' => 'ÐадÑтрочный интервал', + 'AspectRatio' => 'Соотношение Ñторон', + 'AssetID' => 'ID актива', + 'Association' => 'ÐÑÑоциациÑ', + 'AssumedDisplaySize' => 'Размер отображаемого ÑтереоизображениÑ', + 'AssumedDistanceView' => 'РаÑÑтоÑние от позиции проÑмотра до диÑплеÑ', + 'Attachment' => 'Вложение', + 'Attendee' => 'УчаÑтник', + 'Attitude' => 'Положение', + 'AttitudeTarget' => 'Целевое положение', + 'Audiences' => 'ÐудиториÑ', + 'AudioBitrate' => 'Битрейт аудио', + 'AudioBitsPerSample' => 'Ð‘Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð° аудио', + 'AudioBytes' => 'Ðудио байтов', + 'AudioChannels' => 'КоличеÑтво аудиоканалов', + 'AudioCodec' => 'Кодек аудио', + 'AudioCodecID' => 'ID аудиокодека', + 'AudioData' => 'Ðудиоданные', + 'AudioDuration' => 'ПродолжительноÑÑ‚ÑŒ аудио', + 'AudioEncoding' => { + Description => 'Кодирование звука', + PrintConv => { + 'Device-specific sound' => 'ЗавиÑÑщий от уÑтройÑтва звук', + 'G.711 A-law logarithmic PCM' => 'G.711 A-law логарифмичеÑкий PCM', + 'G.711 mu-law logarithmic PCM' => 'G.711 mu-law логарифмичеÑкий PCM', + 'Nellymoser 16kHz Mono' => 'Nellymoser 16 кГц, моно', + 'Nellymoser 8kHz Mono' => 'Nellymoser 8kHz, моно', + 'PCM-BE (uncompressed)' => 'PCM-BE (без ÑжатиÑ)', + 'PCM-LE (uncompressed)' => 'PCM-LE (без ÑжатиÑ)', + }, + }, + 'AudioFileSize' => 'Размер аудио файла', + 'AudioFormat' => 'Формат аудио', + 'AudioFrameSize' => 'Размер аудио фрейма', + 'AudioLayer' => 'Уровень аудио', + 'AudioMimeType' => 'MIME-тип аудио', + 'AudioMode' => 'Режим аудио', + 'AudioOutcue' => 'Заключительные Ñлова аудио', + 'AudioSampleRate' => 'ЧаÑтота диÑкретизации звука', + 'AudioSampleSize' => 'КоличеÑтво бит на канал', + 'AudioSamplingRate' => 'ЧаÑтота диÑкретизации', + 'AudioSamplingResolution' => 'РазрÑдноÑÑ‚ÑŒ аудио', + 'AudioSetting' => 'ÐаÑтройка звука', + 'AudioSize' => 'Размер аудиофайла', + 'AudioType' => { + Description => 'Тип аудио', + PrintConv => { + 'Mono Actuality' => 'Событие – Моно', + 'Mono Music' => 'Музыка – Моно', + 'Mono Question and Answer Session' => 'ВопроÑÑ‹ и ответы – Моно', + 'Mono Raw Sound' => 'ÐÐµÐ¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð½Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ – Моно', + 'Mono Response to a Question' => 'Ответ на Ð²Ð¾Ð¿Ñ€Ð¾Ñ â€“ Моно', + 'Mono Scener' => 'ОбÑтоÑтельÑтва ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ â€“ Моно', + 'Mono Voicer' => 'ГолоÑÐ¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ – Моно', + 'Mono Wrap' => 'Итог ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ â€“ Моно', + 'Stereo Actuality' => 'Событие – Стерео', + 'Stereo Music' => 'Музыка – Стерео', + 'Stereo Question and Answer Session' => 'ВопроÑÑ‹ и ответы – Стерео', + 'Stereo Raw Sound' => 'ÐÐµÐ¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð½Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ – Стерео', + 'Stereo Response to a Question' => 'Ответ на Ð²Ð¾Ð¿Ñ€Ð¾Ñ â€“ Стерео', + 'Stereo Scener' => 'ОбÑтоÑтельÑтва ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ â€“ Стерео', + 'Stereo Voicer' => 'ГолоÑÐ¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ – Стерео', + 'Stereo Wrap' => 'Итог ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ â€“ Стерео', + 'Text Only' => 'Только текÑÑ‚', + }, + }, + 'AuthenticationTime' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ – Ð’Ñ€ÐµÐ¼Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸', + 'AuthenticationType' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ – Тип аутентификации', + 'Author' => 'Ðвтор', + 'AuthorLen' => 'Ðвтор Len', + 'AuthorsPosition' => 'ДолжноÑÑ‚ÑŒ автора', + 'AutoFocus' => { + Description => 'ÐвтофокуÑ', + PrintConv => { + 'Off' => 'Ðе включён', + 'On' => 'Включен', + }, + }, + 'AutoISOMax' => 'МакÑимально значение автоматичеÑкого ISO', + 'AutoISOMin' => 'Минимальное значение автоматичеÑкого ISO', + 'AutoLowLightDuration' => 'ÐвтоÑъёмка при низком оÑвещении – ПродолжительноÑÑ‚ÑŒ', + 'AutoRotation' => { + Description => 'ÐвтоматичеÑкий поворот', + PrintConv => { + 'Auto' => 'ÐвтоматичеÑки', + 'Down' => 'Вниз', + 'Up' => 'Вверх', + }, + }, + 'AutoSaveFilePath' => 'Путь к файлу автоÑохранениÑ', + 'AutoSaveFormat' => 'Формат автоÑохранениÑ', + 'AvgBitrate' => 'Средний битрейт', + 'AvgPacketSize' => 'Средний размер пакета', + 'AvgWidth' => 'СреднÑÑ ÑˆÐ¸Ñ€Ð¸Ð½Ð° глифа', + 'AxisDistanceX' => 'ДиÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ð¿Ð¾ оÑи X', + 'AxisDistanceY' => 'ДиÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ð¿Ð¾ оÑи Y', + 'AxisDistanceZ' => 'ДиÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ð¿Ð¾ оÑи Z', + 'BMPVersion' => { + Description => 'ВерÑÐ¸Ñ BMP', + PrintConv => { + 'AVI BMP structure?' => 'Структура AVI BMP?', + }, + }, + 'BWFilter' => 'Чёрно-Белый фильтр', + 'BW_HalftoningInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ тонировании – Чёрно-Белое', + 'BW_TransferFunc' => 'Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñа – Чёрно-Белое', + 'Background' => 'Фон', + 'BackgroundColor' => 'Цвет фона', + 'BackgroundColorIndicator' => { + Description => 'Цвет фона', + PrintConv => { + 'Specified Background Color' => 'Указан', + 'Unspecified Background Color' => 'Ðе указан', + }, + }, + 'BackgroundColorValue' => 'Значение фонового цвета', + 'BackupTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ', + 'BadFaxLines' => 'КоличеÑтво битых Ñтрок', + 'BaseViewpointNum' => 'Ðомер базовой точки проÑмотра', + 'BaselineExposure' => 'Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ ÑкÑпозициÑ', + 'BaselineExposureOffset' => 'Сдвиг базовой ÑкÑпозиции', + 'BaselineLength' => 'Длина базовой линии', + 'BaselineNoise' => 'Базовый уровень шума', + 'BaselineSharpness' => 'Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ Ñ‡Ñ‘Ñ‚ÐºÐ¾ÑÑ‚ÑŒ', + 'BatteryCapacity' => 'ÐмкоÑÑ‚ÑŒ аккумулÑтора', + 'BatteryCurrent' => 'Ток аккумулÑтора', + 'BatteryLevel' => 'Уровень зарÑда аккумулÑтора', + 'BatteryTemperature' => 'Температура аккумулÑтора', + 'BatteryTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ от аккумулÑтора', + 'BatteryType' => 'Тип аккумулÑтора', + 'BatteryVoltage' => 'ÐапрÑжение аккумулÑтора', + 'BatteryVoltage1' => 'ÐапрÑжение аккумулÑтора 1', + 'BatteryVoltage2' => 'ÐапрÑжение аккумулÑтора 2', + 'BatteryVoltage3' => 'ÐапрÑжение аккумулÑтора 3', + 'BatteryVoltage4' => 'ÐапрÑжение аккумулÑтора 4', + 'BatteryVoltageAvg' => 'ÐапрÑжение аккумулÑтора (Ñреднее)', + 'BayerGreenSplit' => 'Разделение зелёных каналов в матрице Байера', + 'BayerPattern' => 'Фильтр Байера', + 'BestQualityScale' => 'Оптимальный маÑштаб', + 'BibligraphicFileName' => 'Файл Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ‡ÐµÑкой информацией', + 'BinaryFilter' => 'Бинарный фильтр', + 'Birthday' => 'День рождениÑ', + 'BitDepth' => { + Description => 'Ð‘Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð°', + PrintConv => { + 'Custom' => 'Ð—Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¼', + }, + }, + 'Bitrate' => 'Битрейт', + 'BitsPerComponent' => 'КоличеÑтво бит на компонент', + 'BitsPerExtendedRunLength' => 'КоличеÑтво бит на раÑширенную длину Ñерий', + 'BitsPerPixel' => 'КоличеÑтво бит на пикÑель', + 'BitsPerRunLength' => 'КоличеÑтво бит на длину Ñерий', + 'BitsPerSample' => 'КоличеÑтво бит на компонент', + 'BlackLevel' => 'Уровень чёрного', + 'BlackLevelBlue' => 'Уровень чёрного – Синий', + 'BlackLevelData' => 'Данные ÑƒÑ€Ð¾Ð²Ð½Ñ Ñ‡ÐµÑ€Ð½Ð¾Ð³Ð¾', + 'BlackLevelDeltaH' => 'Уровень чёрного – Дельта H', + 'BlackLevelDeltaV' => 'Уровень чёрного – Дельта V', + 'BlackLevelGreen' => 'Уровень чёрного – Зелёный', + 'BlackLevelRed' => 'Уровень чёрного – КраÑный', + 'BlackLevelRepeatDim' => 'Уровень чёрного – Размер шаблона повторений', + 'BlacksAdj' => 'Регулировка ÑƒÑ€Ð¾Ð²Ð½Ñ Ñ‡Ñ‘Ñ€Ð½Ð¾Ð³Ð¾', + 'BlockSizeMax' => 'МакÑимальный размер блока', + 'BlockSizeMin' => 'Минимальный размер блока', + 'BlocksPerFrame' => 'Блоков на кадр', + 'BlueBalance' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ñинего', + 'BlueEndpoint' => 'ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Синего', + 'BlueMask' => 'МаÑка Синего', + 'BluePrimary' => 'ОÑновной Ñиний', + 'BlueX' => 'Синий по X', + 'BlueY' => 'Синий по Y', + 'BookName' => 'Ðазвание книги', + 'BookTitle' => 'Ðазвание книги', + 'BookType' => 'Тип книги', + 'BookVersion' => 'ВерÑÐ¸Ñ ÐºÐ½Ð¸Ð³Ð¸', + 'BootIdentifier' => 'Идентификатор загрузки', + 'BootLoaderVersion' => 'ВерÑÐ¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ñ‡Ð¸ÐºÐ°', + 'BootSystem' => 'СиÑтема загрузки', + 'BorderColor' => 'Цвет границы', + 'BorderInformation' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ границе', + 'BoundingBox' => 'Габаритный прÑмоугольник', + 'Brain' => 'Модуль Brain', + 'BrandingImageID' => 'Бренд – ID изображениÑ', + 'BrandingName' => 'Бренд – Ðазвание', + 'BreakChar' => 'Символ определÑющий границы Ñлов', + 'Brightness' => 'ЯркоÑÑ‚ÑŒ', + 'BrightnessAdj' => 'Регулировка ÑркоÑти', + 'BrightnessValue' => 'Значение ÑркоÑти', + 'BurstID' => 'ID Ñерии Ñнимков', + 'BurstPrimary' => 'Первый кадр Ñерии', + 'BurstUUID' => 'Уникальный ID Ð´Ð»Ñ Ñерии Ñнимков', + 'BusyStatus' => 'СоÑтоÑние занÑтоÑти', + 'By-line' => 'Ðвтор', + 'By-lineTitle' => 'Титул автора', + 'ByteLength' => 'Длина в байтах', + 'ByteOrder' => { + Description => 'ПорÑдок байтов', + PrintConv => { + 'Big-endian' => 'ПорÑдок от Ñтаршего к младшему', + 'Little-endian' => 'ПорÑдок от младшего к Ñтаршему', + }, + }, + 'BytesPerLine' => 'КоличеÑтво байт на Ñтроку', + 'BytesPerMinute' => 'Байт в минуту', + 'CDDBDiscPlayTime' => 'CDDB – Ð’Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð¸Ñка', + 'CDDBDiscTracks' => 'CDDB – Треки на диÑке', + 'CDEType' => 'Тип CDE', + 'CFALayout' => { + Description => 'Макет CFA', + PrintConv => { + 'Even columns offset down 1/2 row' => 'Чётные Ñтолбцы Ñмещены вниз на 1/2 Ñтроки', + 'Even columns offset up 1/2 row' => 'Чётные Ñтолбцы Ñмещены вверх 1/2 Ñтроки', + 'Even rows offset down by 1/2 row, even columns offset left by 1/2 column' => 'Чётные Ñтроки Ñмещены вниз на 1/2 Ñтроки, чётные Ñтолбцы Ñмещены влево на 1/2 Ñтолбца', + 'Even rows offset down by 1/2 row, even columns offset right by 1/2 column' => 'Чётные Ñтроки Ñмещены вниз на 1/2 Ñтроки, чётные Ñтолбцы Ñмещены вправо на 1/2 Ñтолбца', + 'Even rows offset left 1/2 column' => 'Чётные Ñтроки Ñмещены влево на 1/2 Ñтолбца', + 'Even rows offset right 1/2 column' => 'Чётные Ñтроки Ñмещены вправо на 1/2 Ñтолбца', + 'Even rows offset up by 1/2 row, even columns offset left by 1/2 column' => 'Чётные Ñтроки Ñмещены вверх на 1/2 Ñтроки, чётные Ñтолбцы Ñмещены влево на 1/2 Ñтолбца', + 'Even rows offset up by 1/2 row, even columns offset right by 1/2 column' => 'Чётные Ñтроки Ñмещены вверх на 1/2 Ñтроки, чётные Ñтолбцы Ñмещены вправо на 1/2 Ñтолбца', + 'Rectangular' => 'ПрÑÐ¼Ð¾ÑƒÐ³Ð¾Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½Ð¾Ð²ÐºÐ°', + }, + }, + 'CFAPattern' => { + Description => 'Шаблон CFA', + PrintConv => { + '[Blue,Green][Green,Red]' => '[Синий, Зелёный][Зелёный, КраÑный]', + '[Green,Blue][Red,Green]' => '[Зелёный, Синий][КраÑный, Зелёный]', + '[Green,Red][Blue,Green]' => '[Зелёный, КраÑный][Синий, Зелёный]', + '[Red,Green][Green,Blue]' => '[КраÑный, Зелёный][Зелёный, Синий]', + 'n/a' => 'Ðет данных', + }, + }, + 'CFAPattern2' => 'Шаблон CFA 2', + 'CFAPlaneColor' => 'Цветовые плоÑкоÑти CFA', + 'CFARepeatPatternDim' => 'Шаблон Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð¸Ñ CFA', + 'CIP3DataFile' => 'CIP3 – Файл данных', + 'CIP3Sheet' => 'CIP3 – ЛиÑÑ‚', + 'CIP3Side' => 'CIP3 – Сторона', + 'CMYKEquivalent' => 'Эквивалент CMYK', + 'CPUVersions' => 'ВерÑии CPU', + 'CR2CFAPattern' => { + Description => 'CR2 – Шаблон CFA', + PrintConv => { + '[Blue,Green][Green,Red]' => '[Синий, Зеленый][Зеленый, КраÑный]', + '[Green,Blue][Red,Green]' => '[Зеленый, Синий][КраÑный, Зеленый]', + '[Green,Red][Blue,Green]' => '[Зеленый, КраÑный][Синий, Зеленый]', + '[Red,Green][Green,Blue]' => '[КраÑный, Зеленый][Зеленый, Синий]', + }, + }, + 'CacheControl' => 'Контроль кешированиÑ', + 'CacheVersion' => 'ВерÑÐ¸Ñ ÐºÑша', + 'CalendarColor' => 'Цвет календарÑ', + 'CalendarDescription' => 'ОпиÑание календарÑ', + 'CalendarID' => 'ID календарÑ', + 'CalendarName' => 'Ðазвание календарÑ', + 'CalendarScale' => 'ÐšÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ð½Ð°Ñ ÑиÑтема', + 'CalibratedFocalLength' => 'Откалирброванное фокуÑное раÑÑтоÑние', + 'CalibratedOpticalCenterX' => 'Откалирброванный оптичеÑкий центр по X', + 'CalibratedOpticalCenterY' => 'Откалирброванный оптичеÑкий центр по Y', + 'CalibrationIlluminant1' => { + Description => 'Калибровочное оÑвещение 1', + PrintConv => { + 'Cloudy' => 'Облачно (6500 К)', + 'Cool White Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° – Холодный Ñвет (4150 К)', + 'D50' => 'D50 (5000 К)', + 'D55' => 'D55 (5500 К)', + 'D65' => 'D65 (6500 К)', + 'D75' => 'D75 (7500 К)', + 'Day White Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° – Дневной белый (5050 К)', + 'Daylight' => 'Дневной Ñвет (5500 К)', + 'Daylight Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° дневного Ñвета (6400 К)', + 'Fine Weather' => 'ЯÑÐ½Ð°Ñ Ð¿Ð¾Ð³Ð¾Ð´Ð° (5500 К)', + 'Flash' => 'Ð’Ñпышка (5500 К)', + 'Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° (4150 К)', + 'ISO Studio Tungsten' => 'Ð¡Ñ‚ÑƒÐ´Ð¸Ð¹Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° Ð½Ð°ÐºÐ°Ð»Ð¸Ð²Ð°Ð½Ð¸Ñ (3200 К)', + 'Other' => 'Другой иÑточник Ñвета', + 'Shade' => 'Тень (7500 К)', + 'Standard Light A' => 'Стандартное оÑвещение A (2850 К)', + 'Standard Light B' => 'Стандартное оÑвещение B (5500 К)', + 'Standard Light C' => 'Стандартное оÑвещение C (6500 К)', + 'Tungsten (Incandescent)' => 'Лампа Ð½Ð°ÐºÐ°Ð»Ð¸Ð²Ð°Ð½Ð¸Ñ (2850 К)', + 'Unknown' => 'ÐеизвеÑтно', + 'Warm White Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° – Тёплый Ñвет (2925 К)', + 'White Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° – Белый Ñвет (3525 К)', + }, + }, + 'CalibrationIlluminant2' => { + Description => 'Калибровочное оÑвещение 2', + PrintConv => { + 'Cloudy' => 'Облачно (6500 К)', + 'Cool White Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° – Холодный Ñвет (4150 К)', + 'D50' => 'D50 (5000 К)', + 'D55' => 'D55 (5500 К)', + 'D65' => 'D65 (6500 К)', + 'D75' => 'D75 (7500 К)', + 'Day White Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° – Дневной белый (5050 К)', + 'Daylight' => 'Дневной Ñвет (5500 К)', + 'Daylight Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° дневного Ñвета (6400 К)', + 'Fine Weather' => 'ЯÑÐ½Ð°Ñ Ð¿Ð¾Ð³Ð¾Ð´Ð° (5500 К)', + 'Flash' => 'Ð’Ñпышка (5500 К)', + 'Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° (4150 К)', + 'ISO Studio Tungsten' => 'Ð¡Ñ‚ÑƒÐ´Ð¸Ð¹Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° Ð½Ð°ÐºÐ°Ð»Ð¸Ð²Ð°Ð½Ð¸Ñ (3200 К)', + 'Other' => 'Другой иÑточник Ñвета', + 'Shade' => 'Тень (7500 К)', + 'Standard Light A' => 'Стандартное оÑвещение A (2850 К)', + 'Standard Light B' => 'Стандартное оÑвещение B (5500 К)', + 'Standard Light C' => 'Стандартное оÑвещение C (6500 К)', + 'Tungsten (Incandescent)' => 'Лампа Ð½Ð°ÐºÐ°Ð»Ð¸Ð²Ð°Ð½Ð¸Ñ (2850 К)', + 'Unknown' => 'ÐеизвеÑтное', + 'Warm White Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° – Тёплый Ñвет (2925 К)', + 'White Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° – Белый Ñвет (3525 К)', + }, + }, + 'CallForImage' => 'Звонок по изображению', + 'CamReverse' => 'Камера заднего вида', + 'CameraArrangementInterval' => 'Интервал раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹', + 'CameraCalibration1' => 'ÐšÐ°Ð»Ð¸Ð±Ñ€Ð¾Ð²Ð¾Ñ‡Ð½Ð°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° фотокамеры 1', + 'CameraCalibration2' => 'ÐšÐ°Ð»Ð¸Ð±Ñ€Ð¾Ð²Ð¾Ñ‡Ð½Ð°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° фотокамеры 2', + 'CameraCalibrationSig' => 'Сигнатура калибровки камеры', + 'CameraDateTime' => 'Дата и Ð’Ñ€ÐµÐ¼Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹', + 'CameraElevationAngle' => 'Угол обзора камеры', + 'CameraFilename' => 'Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñозданное камерой', + 'CameraID' => 'ID камеры', + 'CameraLabel' => 'Ðазвание камеры', + 'CameraMakeModel' => 'Модель камеры', + 'CameraModel' => 'Модель камеры', + 'CameraModelID' => 'ID модели камеры', + 'CameraOperator' => 'Кинооператор', + 'CameraOrientation' => { + Description => 'ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹', + PrintConv => { + 'Horizontal (normal)' => 'ГоризонтальнаÑ', + 'Rotate 180' => 'Поверот на 180°', + 'Rotate 270 CW' => 'Поворот на 270° по чаÑовой Ñтрелке', + 'Rotate 90 CW' => 'Поворот на 90° по чаÑовой Ñтрелке', + }, + }, + 'CameraPitch' => 'Тангаж камеры (Ðаклон)', + 'CameraRoll' => 'Крен камеры (Вращение)', + 'CameraSerialNumber' => 'Серийный номер камеры', + 'CameraTemperature' => 'Температура камеры', + 'CameraType' => 'Тип камеры', + 'CameraYaw' => 'РыÑкание камеры (Поворот)', + 'CanSeekOnTime' => 'ВозможноÑÑ‚ÑŒ навигации по времени', + 'CanSeekToEnd' => 'ВозможноÑÑ‚ÑŒ перейти к концу', + 'CapHeight' => 'Ð’Ñ‹Ñота пропиÑных букв', + 'Caption' => 'Заголовок', + 'Caption-Abstract' => 'Подробное опиÑание', + 'CaptionWriter' => 'Ðвтор подпиÑи', + 'CaptureSoftware' => 'ЗапиÑÑŒ изображений выполнен в', + 'CaptureXResolution' => 'Разрешение захвата по X', + 'CaptureXResolutionUnit' => { + Description => 'Единицы Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ñ…Ð²Ð°Ñ‚Ð° по X', + PrintConv => { + '0.01 mm' => '0.01 мм', + '0.1 mm' => '0.1 мм', + '10 cm' => '10 Ñм', + '10 m' => '10 м', + '100 m' => '100 м', + 'cm' => 'Ñм', + 'km' => 'км', + 'm' => 'м', + 'mm' => 'мм', + 'um' => 'мкм', + }, + }, + 'CaptureYResolution' => 'Разрешение захвата по Y', + 'CaptureYResolutionUnit' => { + Description => 'Единицы Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ñ…Ð²Ð°Ñ‚Ð° по Y', + PrintConv => { + '0.01 mm' => '0.01 мм', + '0.1 mm' => '0.1 мм', + '10 cm' => '10 Ñм', + '10 m' => '10 м', + '100 m' => '100 м', + 'cm' => 'Ñм', + 'km' => 'км', + 'm' => 'м', + 'mm' => 'мм', + 'um' => 'мкм', + }, + }, + 'CatalogSets' => 'Ðаборы каталога', + 'Categories' => 'Категории', + 'Category' => 'Группа', + 'CellLength' => 'Строк в матрице дизеринга или полутонированиÑ', + 'CellWidth' => 'Колонок в матрице дизеринга или полутонированиÑ', + 'ChannelMode' => { + Description => 'Режим канала', + PrintConv => { + 'Dual Channel' => 'Двухканальное', + 'Joint Stereo' => 'Объединённое Ñтерео', + 'Single Channel' => 'Моно', + 'Stereo' => 'Стерео', + }, + }, + 'ChannelUsage' => 'ИÑпользование канала', + 'Channels' => 'Каналов', + 'Chapter' => 'ЧаÑÑ‚ÑŒ', + 'ChapterCount' => 'КоличеÑтво глав', + 'ChapterName' => 'Ðазвание главы', + 'ChapterNumber' => 'Ðомер главы', + 'CharacterSet' => 'Ðабор Ñимволов', + 'Characters' => 'КоличеÑтво Ñимволов', + 'CharactersWithSpaces' => 'КоличеÑтво Ñимволов, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ñ‹', + 'ChromaBlurRadius' => 'Ð Ð°Ð´Ð¸ÑƒÑ ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð½Ð¾Ñти', + 'ChromaticAberrationCorrParams' => 'Параметры коррекции хроматичеÑкой аберрации', + 'ChromaticAberrationCorrection' => { + Description => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ñ…Ñ€Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой аберрации', + PrintConv => { + 'Auto' => 'ÐвтоматичеÑкаÑ', + 'No correction params available' => 'ÐедоÑтупна', + 'Off' => 'Ðе включена', + 'On' => 'Включена', + }, + }, + 'Chromaticities' => 'ОÑновные цвета и Точка белого', + 'CircleOfConfusion' => 'Круг нерезкоÑти', + 'City' => 'Город проиÑÑ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…', + 'Class' => 'КлаÑÑ', + 'Classification' => 'КлаÑÑификации', + 'ClassifyState' => 'КлаÑÐ¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñтруктуры', + 'CleanFaxData' => { + Description => 'Ðаличие битых Ñтрок', + PrintConv => { + 'Clean' => 'Без битых Ñтрок', + 'Regenerated' => 'Битые Ñтроки воÑÑтановлены', + 'Unclean' => 'Битые Ñтроки не воÑÑтановлены', + }, + }, + 'ClipPath' => 'Обтравочный контур', + 'ClippingLimit' => 'ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° копирование', + 'ClippingPathName' => 'Ðазвание обтравочного контура', + 'CodePage' => { + Description => 'ÐšÐ¾Ð´Ð¾Ð²Ð°Ñ Ñтраница', + PrintConv => { + 'Windows Latin 1 (Western European)' => 'Windows Latin 1 (ЗападноевропейÑкаÑ)', + }, + }, + 'CodecFlavorID' => 'ID кодека Flavor', + 'CodedCharacterSet' => 'Кодовый набор Ñимволов', + 'CodedFrameSize' => 'Размер кодированного кадра', + 'CodestreamRegistration' => 'РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÐºÐ¾Ð´Ð¾Ð²Ð¾Ð³Ð¾ потока', + 'CodingMethods' => { + Description => 'Метод ÑжатиÑ', + PrintConv => { + 'Baseline JPEG' => 'Базовое JPEG', + 'JBIG color' => 'Цветное JBIG', + 'Modified Huffman' => 'Одномерное – ÐœÐ¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¥Ð°Ñ„Ñ„Ð¼Ð°Ð½Ð°', + 'Modified MR' => 'Двумерное – Modified Modified READ', + 'Modified Read' => 'Двумерное – Modified READ', + 'Unspecified compression' => 'ÐеизвеÑтное Ñжатие', + }, + }, + 'Collection' => 'КоллекциÑ', + 'CollectionName' => 'Ðазвание коллекции', + 'CollectionURI' => 'URI коллекции', + 'Collections' => 'Коллекции', + 'ColorAdjustmentMode' => { + Description => 'Режим регулировки цвета', + PrintConv => { + 'Off' => 'Ðе включён', + 'On' => 'Включен', + }, + }, + 'ColorCalibrationMatrix' => 'Матрица калибровки цвета', + 'ColorCharacterization' => 'Спецификации цвета', + 'ColorClass' => { + Description => 'Цветовой клаÑÑ', + PrintConv => { + '0 (None)' => '0 (Ðе указан)', + '1 (Winner)' => '1 (Лучшее)', + '2 (Winner alt)' => '2 (Лучшее Alt)', + '3 (Superior)' => '3 (Хорошее)', + '4 (Superior alt)' => '4 (Хорошее Alt)', + '5 (Typical)' => '5 (Обычноеl)', + '6 (Typical alt)' => '6 (Обычное Alt)', + '7 (Extras)' => '7 (ЭкÑтра)', + '8 (Trash)' => '8 (Хлам)', + }, + }, + 'ColorComponents' => 'Цветовых компонентов', + 'ColorCorrection' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð°', + 'ColorEffect' => { + PrintConv => { + 'Sepia' => 'СепиÑ', + }, + }, + 'ColorFilter' => 'Цветовой фильтр', + 'ColorGroup' => 'Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°', + 'ColorHalftoningInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ тонировании – Цветное', + 'ColorMap' => 'Карта цветов', + 'ColorMatrix1' => 'Матрица Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð¾Ð² 1', + 'ColorMatrix2' => 'Матрица Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð¾Ð² 2', + 'ColorMode' => { + Description => 'Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ', + PrintConv => { + 'Autumn Leaves' => 'ОÑенние лиÑÑ‚ÑŒÑ', + 'B&W' => 'Чёрно-белое', + 'Bitmap' => 'МонохромнаÑ', + 'Black & White' => 'Чёрно-белый', + 'Clear' => 'Прозрачный', + 'Color Palette' => 'Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ð¿Ð°Ð»Ð¸Ñ‚Ñ€Ð°', + 'Deep' => 'Глубокий', + 'Duotone' => 'ДвуцветнаÑ', + 'Embed Adobe RGB' => 'Ð’Ñтроенный Adobe RGB', + 'Evening' => 'Вечер', + 'Grayscale' => 'Ð’ градациÑÑ… Ñерого', + 'Indexed' => 'ИндекÑированные цвета', + 'Indexed Color' => 'ИндекÑированный цвет', + 'Landscape' => 'Пейзаж', + 'Light' => 'Бледный', + 'Multichannel' => 'МногоканальнаÑ', + 'Natural' => 'Ðатуральный', + 'Natural color' => 'Ðатуральный цвет', + 'Natural sRGB' => 'Ðатуральный sRGB', + 'Natural+ sRGB' => 'Ðатуральный+ sRGB', + 'Neutral' => 'Ðейтральный', + 'Night Portrait' => 'Ðочной портрет', + 'Night Scene' => 'ÐÐ¾Ñ‡Ð½Ð°Ñ Ñцена', + 'Night View' => 'Ðочной вид', + 'Night View/Portrait' => 'Ðочной вид/портрет', + 'Portrait' => 'Портрет', + 'RGB Color' => 'Цвет RGB', + 'Sepia' => 'СепиÑ', + 'Solarization' => 'СолÑризациÑ', + 'Standard' => 'Стандартный', + 'Sunset' => 'Закат', + 'Vivid' => 'Яркий цвет', + 'Vivid color' => 'Яркий цвет', + 'n/a' => 'Ðет данных', + }, + }, + 'ColorNoiseReduction' => 'Щумодав – Уменьшение цветных шумов', + 'ColorPalette' => 'Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ð¿Ð°Ð»Ð¸Ñ‚Ñ€Ð°', + 'ColorPlanes' => 'Цветовые плоÑкоÑти', + 'ColorPrimaries' => 'Праймериз цвета', + 'ColorRepresentation' => { + Description => 'Цветовое предÑтавление', + PrintConv => { + '3 Components, Frame Sequential in Multiple Objects' => '3 компонента. ПоÑледовательноÑÑ‚ÑŒ кадров в неÑкольких объектах', + '3 Components, Frame Sequential in One Object' => '3 компонента. ПоÑледовательноÑÑ‚ÑŒ кадров в одном объекте', + '3 Components, Line Sequential' => '3 компонента. ПоÑÐ»ÐµÐ´Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñтрока', + '3 Components, Pixel Sequential' => '3 компонента. ПоÑледовательноÑÑ‚ÑŒ пикÑелей', + '3 Components, Single Frame' => '3 компонента. Один кадр', + '3 Components, Special Interleaving' => '3 компонента. Специальное чередование', + '4 Components, Frame Sequential in Multiple Objects' => '4 компонента. ПоÑледовательноÑÑ‚ÑŒ кадров в неÑкольких объектах', + '4 Components, Frame Sequential in One Object' => '4 компонента. ПоÑледовательноÑÑ‚ÑŒ кадров в одном объекте', + '4 Components, Line Sequential' => '4 компонента. ПоÑÐ»ÐµÐ´Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñтрока', + '4 Components, Pixel Sequential' => '4 компонента. ПоÑледовательноÑÑ‚ÑŒ пикÑелей', + '4 Components, Single Frame' => '4 компонента. Один кадр', + '4 Components, Special Interleaving' => '4 компонента. Специальное чередование', + 'Monochrome, Single Frame' => 'Монохромное. Один кадр', + 'No Image, Single Frame' => 'Ðет изображениÑ. Один кадр', + }, + }, + 'ColorResolutionDepth' => 'Глубина цвета', + 'ColorResponseUnit' => 'Единицы цветовой чувÑтвительноÑти', + 'ColorSamplersResource' => 'РеÑÑƒÑ€Ñ Ð±Ñ€Ð°Ð·Ñ†Ð¾Ð² цвета', + 'ColorSamplersResource2' => 'РеÑÑƒÑ€Ñ Ð±Ñ€Ð°Ð·Ñ†Ð¾Ð² цвета 2', + 'ColorSequence' => 'ПоÑледовательноÑÑ‚ÑŒ цветов', + 'ColorSpace' => { + Description => 'Цветовое проÑтранÑтво', + PrintConv => { + 'BT 2020 Constant Luminance' => 'ПоÑтоÑÐ½Ð½Ð°Ñ ÑркоÑÑ‚ÑŒ BT 2020', + 'Calibrated RGB' => 'Калиброванный RGB', + 'Device CMYK' => 'УÑтройÑтво CMYK', + 'Device RGB' => 'УÑтройÑтво RGB', + 'Embedded Color Profile' => 'Ð’Ñтроенный цветовой профиль', + 'Grayscale' => 'Оттенки Ñерого', + 'ICC Profile' => 'ICC-профиль', + 'Linked Color Profile' => 'СвÑзанный цветовой профиль', + 'Uncalibrated' => 'Ðекалиброванное', + 'Undefined' => 'Ðе определено', + 'Windows Color Space' => 'Цветовое проÑтранÑтво Windows', + }, + }, + 'ColorSpecApproximation' => { + Description => 'Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð° – ÐппрокÑимациÑ', + PrintConv => { + 'Accurate' => 'ТочнаÑ', + 'Exceptional Quality' => 'Лучшее качеÑтво', + 'Not Specified' => 'Ðе указана', + 'Poor Quality' => 'Ðизкое качеÑтво', + 'Reasonable Quality' => 'Приемлемое качеÑтво', + }, + }, + 'ColorSpecData' => 'Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð° – Данные', + 'ColorSpecMethod' => { + Description => 'Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð° – Метод', + PrintConv => { + 'Any ICC' => 'Любой ICC', + 'Enumerated' => 'ПеречиÑлимый', + 'Restricted ICC' => 'Ограниченный ICC', + 'Vendor Color' => 'Цвет поÑтавщика', + }, + }, + 'ColorSpecPrecedence' => 'Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð° – Precedence', + 'ColorTable' => 'Таблица цвета', + 'ColorTemperature' => 'Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð°', + 'ColorTemperatureAdj' => 'Регулировка температуры цвета', + 'ColorTemperatures' => 'Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð°', + 'ColorTransferFuncs' => 'Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñа – Цветное', + 'ColorType' => { + Description => 'Тип цвета', + PrintConv => { + 'Grayscale' => 'Ð“Ñ€Ð°Ð´Ð°Ñ†Ð¸Ñ Ñерого', + 'Grayscale with Alpha' => 'Ð“Ñ€Ð°Ð´Ð°Ñ†Ð¸Ñ Ñерого Ñ Ðльфа-каналом', + 'Palette' => 'Палитра', + 'RGB with Alpha' => 'RGB Ñ Ðльфа-каналом', + }, + }, + 'ColorimetricReference' => 'КолориметричеÑкий Ñталон', + 'Colorimetry' => 'КолориметриÑ', + 'Colors' => 'Цвета', + 'Command' => 'Команда', + 'CommandLineArguments' => 'Ðргументы командной Ñтроки', + 'Comment' => 'Комментарий', + 'CommentLen' => 'Комментарий Len', + 'CommentTime' => 'Ð’Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ', + 'Comments' => 'Комментарии', + 'CommonNetworkRelLink' => 'ÐžÐ±Ñ‰Ð°Ñ Ñеть Rel Link', + 'CommonPathSuffix' => 'Ð¡ÑƒÑ„Ñ„Ð¸ÐºÑ Ð¾Ð±Ñ‰ÐµÐ³Ð¾ пути', + 'Company' => 'ОрганизациÑ', + 'CompatibleBrands' => 'СовмеÑтимые марки', + 'CompatibleFontName' => 'Ðазвание ÑовмеÑтимого шрифта', + 'ComponentDefinition' => 'Определение компонента', + 'ComponentMapping' => 'СопоÑтавление компонентов', + 'ComponentsConfiguration' => { + Description => 'ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð¾Ð²', + PrintConv => { + 'Alpha (matte)' => 'Ðльфа-канал (маÑка)', + 'Alpha, B, G, R' => 'Ðльфа-канал, B, G, R', + 'Blue (B)' => 'Синий (B)', + 'Chrominance (Cb, Cr, subsampled by two)' => 'ЦветноÑÑ‚ÑŒ (Cb, Cr, ÑубдиÑÐºÑ€ÐµÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° два)', + 'Composite video' => 'Композитное видео', + 'Depth (Z)' => 'Глубина (Z)', + 'Green (G)' => 'Зелёный (G)', + 'Luminance (Y)' => 'ЯркоÑÑ‚ÑŒ (Y)', + 'R, G, B, Alpha' => 'R, G, B, Ðльфа-канал', + 'Red (R)' => 'КраÑный (R)', + 'User-defined 2 component element' => '2-компонентный Ñлемент определÑемый пользователем', + 'User-defined 3 component element' => '3-компонентный Ñлемент определÑемый пользователем', + 'User-defined 4 component element' => '4-компонентный Ñлемент определÑемый пользователем', + 'User-defined 5 component element' => '5-компонентный Ñлемент определÑемый пользователем', + 'User-defined 6 component element' => '6-компонентный Ñлемент определÑемый пользователем', + 'User-defined 7 component element' => '7-компонентный Ñлемент определÑемый пользователем', + 'User-defined 8 component element' => '8-компонентный Ñлемент определÑемый пользователем', + 'User-defined single component' => 'Один компонент определÑемый пользователем', + }, + }, + 'Composer' => 'Композитор', + 'CompositeImage' => { + Description => 'СоÑтавное изображение', + PrintConv => { + 'Composite Image Captured While Shooting' => 'Полученное во Ð²Ñ€ÐµÐ¼Ñ Ñъёмки', + 'General Composite Image' => 'Созданное в редакторе', + 'Not a Composite Image' => 'Ðет', + 'Unknown' => 'ГеизвеÑтно', + }, + }, + 'CompositeImageCount' => 'СоÑтавное изображение – КоличеÑтво', + 'CompositeImageExposureTimes' => 'СоÑтавное изображение – Выдержка', + 'Composition' => 'КомпозициÑ', + 'CompositionOptions' => 'Варианты композиции', + 'Compressed' => { + Description => 'Сжатый', + PrintConv => { + 'False' => 'Ðет', + 'True' => 'Да', + }, + }, + 'CompressedBitsPerPixel' => 'Сжатых бит на пикÑель', + 'CompressedSize' => 'Сжатый размер', + 'Compression' => { + Description => 'Метод ÑжатиÑ', + PrintConv => { + '4-Bit RLE' => '4-битное RLE', + '8-Bit RLE' => '8-битное RLE', + 'Bitfields' => 'Битовые полÑ', + 'Fractal' => 'Фрактальное', + 'JPEG' => 'JPEG Ñжатие', + 'JPEG (old-style)' => 'JPEG (Ñтарый Ñтиль)', + 'Modified Huffman' => 'Модифицированное кодирование Хаффмана', + 'Modified Modified READ' => 'Modified Modified READ (MMR)', + 'Modified READ' => 'Modified READ (MR)', + 'None' => 'Без ÑжатиÑ', + 'RLE Encoding' => 'Кодирование RLE', + 'Uncompressed' => 'ÐеÑжатый', + 'ZIP with prediction' => 'ZIP Ñ Ð¿Ñ€ÐµÐ´Ñказанием', + 'ZIP without prediction' => 'ZIP без предÑказаниÑ', + }, + }, + 'CompressionFactor' => 'КоÑффициент ÑжатиÑ', + 'CompressionLevel' => 'Уровень ÑжатиÑ', + 'CompressionType' => 'Тип ÑжатиÑ', + 'CompressorName' => 'Ðазвание компреÑÑора', + 'ConditionalFEC' => 'КомпенÑÐ°Ñ†Ð¸Ñ ÑкÑпозиции при Ñъёмке Ñо вÑпышкой', + 'Confidence' => 'КонфидециальноÑÑ‚ÑŒ', + 'ConfidenceLevel' => 'Интервал раÑÐ¿Ð¾Ð·Ð½Ð°Ð²Ð°Ð½Ð¸Ñ Ð»Ð¸Ñ†Ð°', + 'ConfidenceMime' => 'MIME-тип конфидециального изображениÑ', + 'ConfirmedObjectSize' => 'Подтверждённый размер объекта', + 'ConsecutiveBadFaxLines' => 'КоличеÑтво поÑледовательных битых Ñтрок', + 'ConstrainedCropHeight' => 'ÐŸÑ€Ð¾Ð¿Ð¾Ñ€Ñ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð±Ñ€ÐµÐ·ÐºÐ° – Ð’Ñ‹Ñота', + 'ConstrainedCropWidth' => 'ÐŸÑ€Ð¾Ð¿Ð¾Ñ€Ñ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð±Ñ€ÐµÐ·ÐºÐ° – Ширина', + 'Contact' => 'Контакт', + 'ContainerVersion' => 'ВерÑÐ¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ð°', + 'ContentDisposition' => 'РаÑпорÑжение Ñодержимым', + 'ContentIdentifier' => 'Идентификатор контента', + 'ContentLanguage' => 'Язык контента', + 'ContentLocationCode' => 'Контент – Код Ñтраны', + 'ContentLocationName' => 'Контент – Страна', + 'ContentProtected' => { + Description => 'Контент защищен', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'ContentProtectedPercent' => 'Контент защищен – Процент', + 'ContentRating' => { + Description => 'ВозраÑтной рейтинг контента', + PrintConv => { + 'Adult Supervision Recommended' => 'Под наблюдением взроÑлых', + 'Adults Only' => 'Только Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых', + 'All Ages' => 'Ð”Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ возраÑта', + 'No Rating' => 'ВозраÑÑ‚Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° не указана', + 'Older Children' => 'Старшим детÑм', + 'Older Teens' => 'Старшим подроÑткам', + 'Younger Teens' => 'Младшим подроÑткам', + }, + }, + 'ContentScriptType' => 'Язык Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñценариев', + 'ContentStyleType' => 'Язык таблицы Ñтилей', + 'ContentType' => 'MIME-тип документа', + 'ContiguousCodestream' => 'Смежный кодовый поток', + 'Contrast' => { + Description => 'КонтраÑтноÑÑ‚ÑŒ', + PrintConv => { + 'High' => 'Ð’Ñ‹ÑокаÑ', + 'Low' => 'ÐизкаÑ', + 'Normal' => 'СтандартнаÑ', + }, + }, + 'ContrastAdj' => 'Регулировка контраÑта', + 'Contributor' => 'Соавтор', + 'Controller' => 'Контроллер', + 'ConvergenceAngle' => 'Угол ÑхождениÑ', + 'ConvergenceBaseImage' => { + Description => 'СходимоÑÑ‚ÑŒ базового изображениÑ', + PrintConv => { + 'Equivalent for Both Viewpoints' => 'Эквивалент Ð´Ð»Ñ Ð¾Ð±ÐµÐ¸Ñ… точек проÑмотра', + 'Left Viewpoint' => 'Ð›ÐµÐ²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° проÑмотра', + 'Right Viewpoint' => 'ÐŸÑ€Ð°Ð²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° проÑмотра', + }, + }, + 'ConvergenceDistance' => 'РаÑÑтоÑние ÑходимоÑти', + 'Converter' => 'Конвертер', + 'Copyright' => 'ÐвторÑкое право', + 'CopyrightFileName' => 'Ðазвание файла авторÑкого права', + 'CopyrightFlag' => { + Description => 'Флаг авторÑкого права', + PrintConv => { + 'False' => 'Ðет', + 'True' => 'ЕÑÑ‚ÑŒ', + }, + }, + 'CopyrightLen' => 'ÐвторÑкое право Len', + 'CopyrightNotice' => 'ÐвторÑкое право', + 'CopyrightOwner' => 'Правообладатель', + 'CopyrightOwnerID' => 'PLUS-ID правообладателÑ', + 'CopyrightOwnerImageID' => 'ID Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñвоенный правообладателем', + 'CopyrightOwnerName' => 'Ð˜Ð¼Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¾Ð±Ð»Ð°Ð´Ð°Ñ‚ÐµÐ»Ñ', + 'CopyrightRegistrationNumber' => 'РегиÑтрационный номер авторÑкого права', + 'CopyrightStatus' => { + Description => 'Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ', + PrintConv => { + 'Protected' => 'Защищено', + 'Public Domain' => 'Ð’Ñеобщее доÑтоÑние', + 'Unknown' => 'Ðе указано', + }, + }, + 'CountInfo' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ подщёте', + 'Country' => 'Страна', + 'Country-PrimaryLocationCode' => 'Код Ñтраны', + 'Country-PrimaryLocationName' => 'Страна', + 'CountryCode' => 'Код Ñтраны', + 'CoverArt' => 'Обложка', + 'CoverArtMIMEType' => 'MIME тип обложки', + 'CoverArtType' => 'Тип обложки', + 'Coverage' => 'Охват', + 'CreateDate' => 'Дата оцифровки', + 'CreatedBy' => 'Создан', + 'CreationDate' => 'Дата ÑозданиÑ', + 'CreationTime' => 'Ð’Ñ€ÐµÐ¼Ñ ÑозданиÑ', + 'CreativeStyleWasChanged' => { + Description => 'ТворчеÑкий Ñтиль был изменён', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'Creator' => 'Создатель', + 'CreatorAppID' => { + Description => 'ID Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñоздавшего файл', + PrintConv => { + 'Unknown' => 'ÐеизвеÑтное', + }, + }, + 'CreatorAppVersion' => 'ВерÑÐ¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ', + 'CreatorBuildNumber' => 'Приложение – Ðомер Ñборки', + 'CreatorBuildNumber2' => 'Приложение – Ðомер Ñборки 2', + 'CreatorMajorVersion' => 'Приложение – ÐœÐ°Ð¶Ð¾Ñ€Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ', + 'CreatorMinorVersion' => 'Приложение – ÐœÐ¸Ð½Ð¾Ñ€Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ', + 'CreatorOpenWithUIOptions' => 'Открыт Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸ пользовательÑкого интерфейÑа', + 'CreatorSoftware' => 'Создан в приложении', + 'CreatorTool' => 'Создано в', + 'CreatorVersion' => 'ВерÑÐ¸Ñ Ð¸Ñходного приложениÑ', + 'Credit' => 'ПоÑтавщик', + 'CreditLineRequired' => { + Description => 'Политика кредитованиÑ', + PrintConv => { + 'Credit Adjacent To Image' => 'Кредит Ñ€Ñдом Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼', + 'Credit in Credits Area' => 'Кредит в облаÑти кредитов', + 'Credit on Image' => 'Кредит на изображение', + 'Not Required' => 'Кредит не требуетÑÑ', + }, + }, + 'CropArea' => 'ОблаÑÑ‚ÑŒ кадрированиÑ', + 'CropBottom' => 'Обрезка Ñнизу', + 'CropH' => 'Ð’Ñ‹Ñота кадрированиÑ', + 'CropLeft' => 'Обрезка Ñлева', + 'CropRight' => 'Обрезка Ñправа', + 'CropRotation' => 'Поворот рамки кадрированиÑ', + 'CropTop' => 'Обрезка Ñверху', + 'CropW' => 'Ширина кадрированиÑ', + 'CropX' => 'Координаты ÐºÐ°Ð´Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ оÑи X', + 'CropXCommonOffset' => { + Description => 'Обрезка по X – Общее Ñмещение', + PrintConv => { + 'Common Offset Setting' => 'ÐžÐ±Ñ‰Ð°Ñ Ð½Ð°Ñтройка ÑмещениÑ', + 'Individual Offset Setting' => 'Ð˜Ð½Ð´Ð¸Ð²Ð¸Ð´ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð½Ð°Ñтройка ÑмещениÑ', + }, + }, + 'CropXOffset' => 'Обрезка по X – Смещение', + 'CropXOffset2' => 'Обрезка по X – Смещение 2', + 'CropXSize' => 'Размер обрезки по X', + 'CropXViewpointNumber' => 'Обрезка по X – Ðомер точки проÑмотра', + 'CropXViewpointNumber2' => 'Обрезка по X – Ðомер точки проÑмотра 2', + 'CropY' => 'Координаты ÐºÐ°Ð´Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ оÑи Y', + 'CropYCommonOffset' => { + Description => 'Обрезка по Y – Общее Ñмещение', + PrintConv => { + 'Common Offset Setting' => 'ÐžÐ±Ñ‰Ð°Ñ Ð½Ð°Ñтройка ÑмещениÑ', + 'Individual Offset Setting' => 'Ð˜Ð½Ð´Ð¸Ð²Ð¸Ð´ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð½Ð°Ñтройка ÑмещениÑ', + }, + }, + 'CropYOffset' => 'Обрезка по Y – Смещение', + 'CropYOffset2' => 'Обрезка по Y – Смещение 2', + 'CropYSize' => 'Размер обрезки по Y', + 'CropYViewpointNumber' => 'Обрезка по Y – Ðомер точки проÑмотра', + 'CropYViewpointNumber2' => 'Обрезка по Y – Ðомер точки проÑмотра 2', + 'CroppedAreaImageHeightPixels' => 'ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð²Ñ‹Ñота Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² пикÑелÑÑ…', + 'CroppedAreaImageWidthPixels' => 'ИÑÑ…Ð¾Ð´Ð½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² пикÑелÑÑ…', + 'CroppedAreaLeftPixels' => 'ÐžÐ±Ñ€ÐµÐ·Ð°Ð½Ð½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ Ñлева в пикÑелÑÑ…', + 'CroppedAreaTopPixels' => 'ÐžÐ±Ñ€ÐµÐ·Ð°Ð½Ð½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ Ñверху в пикÑелÑÑ…', + 'Cropping' => { + Description => 'Кадрирование', + PrintConv => { + 'Off' => 'Ðе включено', + 'On' => 'Включено', + }, + }, + 'Cross-Reference' => 'ПерекреÑÑ‚Ð½Ð°Ñ ÑÑылка', + 'CueSheet' => 'Файл разметки (Cue Sheet)', + 'CurrentICCProfile' => 'Текущий ICC-профиль', + 'CurrentIPTCDigest' => 'Хеш Ñумма текущего IPTC', + 'CurrentPreProfileMatrix' => 'Текущий предварительный профиль матрицы', + 'CurrentVersion' => 'Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ', + 'CursorSize' => 'Размер курÑора', + 'Curve0x' => 'ÐšÑ€Ð¸Ð²Ð°Ñ 0x', + 'Curve0y' => 'ÐšÑ€Ð¸Ð²Ð°Ñ 0y', + 'Curve1x' => 'ÐšÑ€Ð¸Ð²Ð°Ñ 1x', + 'Curve1y' => 'ÐšÑ€Ð¸Ð²Ð°Ñ 1y', + 'Curve2x' => 'ÐšÑ€Ð¸Ð²Ð°Ñ 2x', + 'Curve2y' => 'ÐšÑ€Ð¸Ð²Ð°Ñ 2y', + 'Curve3x' => 'ÐšÑ€Ð¸Ð²Ð°Ñ 3x', + 'Curve3y' => 'ÐšÑ€Ð¸Ð²Ð°Ñ 3y', + 'Curve4x' => 'ÐšÑ€Ð¸Ð²Ð°Ñ 4x', + 'Curve4y' => 'ÐšÑ€Ð¸Ð²Ð°Ñ 4y', + 'Custom1' => 'Дополнительное поле 1', + 'Custom10' => 'Дополнительное поле 10', + 'Custom2' => 'Дополнительное поле 2', + 'Custom3' => 'Дополнительное поле 3', + 'Custom4' => 'Дополнительное поле 4', + 'Custom5' => 'Дополнительное поле 5', + 'Custom6' => 'Дополнительное поле 6', + 'Custom7' => 'Дополнительное поле 7', + 'Custom8' => 'Дополнительное поле 8', + 'Custom9' => 'Дополнительное поле 9', + 'CustomRendered' => { + Description => 'ПользовательÑкий рендеринг', + PrintConv => { + 'Custom' => 'ПользовательÑкий', + 'Normal' => 'Обычный', + 'Panorama' => 'Панорама', + 'Portrait' => 'Портрет', + }, + }, + 'D-RangeOptimizerHighlight' => 'ÐžÐ¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ‡ÐµÑкого диапазона – Света', + 'D-RangeOptimizerMode' => { + Description => 'ÐžÐ¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ‡ÐµÑкого диапазона – Режим', + PrintConv => { + 'Auto' => 'ÐвтоматичеÑкий', + 'Manual' => 'Ручной', + 'Off' => 'Ðе включён', + }, + }, + 'D-RangeOptimizerShadow' => 'ÐžÐ¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ‡ÐµÑкого диапазона – Тени', + 'D-RangeOptimizerValue' => 'ÐžÐ¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ‡ÐµÑкого диапазона – Значение', + 'DCContinent' => 'DC – Континент', + 'DCCoordinatePrecision' => 'DC – ТочноÑÑ‚ÑŒ координат', + 'DCCoordinateUncertaintyInMeters' => 'DC – ПогрешноÑÑ‚ÑŒ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¾Ñ€Ð´Ð¸Ð½Ð°Ñ‚ (м)', + 'DCCountry' => 'DC – Страна', + 'DCCountryCode' => 'DC – Код Ñтраны', + 'DCCounty' => 'DC – Район', + 'DCDecimalLatitude' => 'DC – ГеографичеÑÐºÐ°Ñ ÑˆÐ¸Ñ€Ð¾Ñ‚Ð° меÑта находки', + 'DCDecimalLongitude' => 'DC – ГеографичеÑÐºÐ°Ñ Ð´Ð¾Ð»Ð³Ð¾Ñ‚Ð° меÑта находки', + 'DCEvent' => 'Событие/Явление', + 'DCFootprintSRS' => 'DC – Footprint SRS', + 'DCFootprintSpatialFit' => 'DC – Footprint Spatial Fit', + 'DCFootprintWKT' => 'DC – Footprint WKT', + 'DCGeodeticDatum' => 'DC – ГеографичеÑÐºÐ°Ñ ÑиÑтема координат', + 'DCGeoreferenceProtocol' => 'DC – ОпиÑание метода Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¾Ñ€Ð´Ð¸Ð½Ð°Ñ‚', + 'DCGeoreferenceRemarks' => 'DC – Комментарии к геопривÑзке', + 'DCGeoreferenceSources' => 'DC – ИÑточники геопривÑзки', + 'DCGeoreferenceVerificationStatus' => 'DC – Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ геопривÑзки', + 'DCGeoreferencedBy' => 'DC – Люди Ñоздавшие геопривÑзку', + 'DCGeoreferencedDate' => 'DC – Дата геопривÑзки', + 'DCHigherGeography' => 'DC – Крупные географичеÑкие объекты', + 'DCHigherGeographyID' => 'DC – ID географичеÑкого региона', + 'DCIsland' => 'DC – ОÑтров', + 'DCIslandGroup' => 'DC – Группа оÑтровов', + 'DCLocality' => 'DC – ОпиÑание меÑта находки', + 'DCLocationAccordingTo' => 'DC – ИÑточник данных о меÑтоположении', + 'DCLocationID' => 'DC – ID набора данных о меÑтоположении', + 'DCLocationRemarks' => 'DC – Комментарии к опиÑанию меÑтоположениÑ', + 'DCMaximumDepthInMeters' => 'DC – МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð° (м)', + 'DCMaximumDistanceAboveSurfaceInMeters' => 'DC – МакÑимальное диÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ð½Ð°Ð´ поверхноÑтью (м)', + 'DCMaximumElevationInMeters' => 'DC – МакÑимальное выÑота (м)', + 'DCMinimumDepthInMeters' => 'DC – ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð° (м)', + 'DCMinimumDistanceAboveSurfaceInMeters' => 'DC – Минимальное диÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ð½Ð°Ð´ поверхноÑтью (м)', + 'DCMinimumElevationInMeters' => 'DC – ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота (м)', + 'DCMunicipality' => 'DC – Район', + 'DCPointRadiusSpatialFit' => 'DC – Point Radius Spatial Fit', + 'DCStateProvince' => 'DC – ОблаÑÑ‚ÑŒ', + 'DCTermsLocation' => 'DC – МеÑтоположение', + 'DCVerbatimCoordinateSystem' => 'DC – СиÑтема координат по первоиÑточнику', + 'DCVerbatimCoordinates' => 'DC – Координаты меÑта находки по первоиÑточнику', + 'DCVerbatimDepth' => 'DC – ОпиÑание глубины по первоиÑточнику', + 'DCVerbatimElevation' => 'DC – ОпиÑание выÑоты по первоиÑточнику', + 'DCVerbatimLatitude' => 'DC – Широта меÑÑ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ первоиÑточнику', + 'DCVerbatimLocality' => 'DC – ОпиÑание меÑта по первоиÑточнику', + 'DCVerbatimLongitude' => 'DC – Долгота меÑÑ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ первоиÑточнику', + 'DCVerbatimSRS' => 'DC – SRS по первоиÑточнику', + 'DCWaterBody' => 'DC – Водоём', + 'DNGAdobeData' => 'DNG – Данные Adobe', + 'DNGBackwardVersion' => 'СовмеÑÑ‚Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ DNG', + 'DNGLensInfo' => 'DNG – Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± объективе', + 'DNGPrivateData' => 'DNG – Данные производителÑ', + 'DNGVersion' => 'ВерÑÐ¸Ñ DNG', + 'DOF' => 'Глубина резкоÑти', + 'DPP' => 'Digital Photo Professional (DPP)', + 'DPXFileSize' => 'Размер файла DPX', + 'DRMCommerceID' => 'DRM – КоммерчеÑкий ID', + 'DRMServerID' => 'DRM – ID Ñервера', + 'DRM_E-BookBaseID' => 'DRM – ID базы Ñлектронных книг', + 'DTVContent' => { + Description => 'Контент DTV', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'DataCompressionMethod' => 'Метод ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…', + 'DataDump' => 'Вывод данных', + 'DataLocation' => { + Description => 'РаÑположение данных', + PrintConv => { + 'Downloaded Separately' => 'СкачиваетÑÑ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾', + 'Local Music File' => 'Локальный музыкальный файл', + }, + }, + 'DataOffset' => 'Смещение данных', + 'DataOffsets' => 'Ð¡Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…', + 'DataPreparer' => 'Подготовка данных', + 'DataReference' => 'СÑылка на данные', + 'DataSign' => { + Description => 'ПодпиÑÑŒ данных', + PrintConv => { + 'Signed' => 'ПодпиÑан', + 'Unsigned' => 'ÐеподпиÑан', + }, + }, + 'DataSize' => 'Размер данных', + 'DataType' => { + Description => 'Тип данных', + PrintConv => { + 'Artwork' => 'Обложка', + }, + }, + 'DataWindow' => 'Окно данных', + 'DatabaseName' => 'Ðазвание базы данных', + 'Date' => 'Дата', + 'DateAcquired' => 'Дата приобретениÑ', + 'DateCreated' => 'Дата ÑозданиÑ', + 'DateIdentified' => 'Дата определениÑ', + 'DateSent' => 'Дата отправлениÑ', + 'DateTime' => 'Дата и времÑ', + 'DateTimeCompleted' => 'Дата завершениÑ', + 'DateTimeCreated' => 'Дата и Ð²Ñ€ÐµÐ¼Ñ ÑозданиÑ', + 'DateTimeDue' => 'Срок Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ‡Ð¸', + 'DateTimeEnd' => 'Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ ÑобытиÑ', + 'DateTimeOriginal' => 'Дата Ñъёмки', + 'DateTimeStamp' => 'Дата ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑобытиÑ', + 'DateTimeStart' => 'Дата начала ÑобытиÑ', + 'DayOfWeek' => { + Description => 'День недели', + PrintConv => { + 'Friday' => 'ПÑтница', + 'Monday' => 'Понедельник', + 'Saturday' => 'Суббота', + 'Sunday' => 'ВоÑкреÑенье', + 'Thursday' => 'Четверг', + 'Tuesday' => 'Вторник', + 'Wednesday' => 'Среда', + }, + }, + 'Decode' => 'Декодирование', + 'DefaultAlarm' => 'Сигнал по-умолчанию', + 'DefaultBlackRender' => { + Description => 'Обработка чёрного по-умолчанию', + PrintConv => { + 'Auto' => 'ÐвтоматичеÑкаÑ', + 'None' => 'Ðе обрабатывать', + }, + }, + 'DefaultChar' => 'Символ замены', + 'DefaultCropOrigin' => 'Положение обрезанного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾-умолчанию', + 'DefaultCropSize' => 'Размер обрезанного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾-умолчанию', + 'DefaultImageColor' => 'Цвет Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾-умолчанию', + 'DefaultScale' => 'МаÑÑштаб по-умолчанию', + 'DefaultStyle' => 'Стиль по-умолчанию', + 'DefaultUserCrop' => 'ОблаÑÑ‚ÑŒ обрезки по-умолчанию', + 'DefineQuantizationTable' => 'Определение таблиц квантованиÑ', + 'Delay' => 'Задержка', + 'DelayTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ¸', + 'DependentImage1EntryNumber' => 'ЗавиÑимое изображение 1 – Ðомер входа', + 'DependentImage2EntryNumber' => 'ЗавиÑимое изображение 2 – Ðомер входа', + 'Depth' => 'Глубина цвета', + 'DepthImage' => 'Глубина изображениÑ', + 'DepthMapTiff' => 'Карта глубины Tiff', + 'Descender' => 'ПодÑтрочный интервал', + 'Description' => 'ОпиÑание', + 'Designer' => 'Дизайнер', + 'DesignerURL' => 'URL дизайнера', + 'Destination' => 'Ðазначение', + 'DeviceID' => 'ID уÑтройÑтва', + 'DeviceName' => 'Ðазвание уÑтройÑтва', + 'DeviceSettingDescription' => 'ОпиÑание предуÑтановок камеры', + 'DewarpData' => 'КомпенÑÐ°Ñ†Ð¸Ñ Ð¾Ð¿Ñ‚Ð¸Ñ‡ÐµÑкого иÑÐºÐ°Ð¶ÐµÐ½Ð¸Ñ â€“ Данные', + 'DewarpFlag' => 'КомпенÑÐ°Ñ†Ð¸Ñ Ð¾Ð¿Ñ‚Ð¸Ñ‡ÐµÑкого иÑÐºÐ°Ð¶ÐµÐ½Ð¸Ñ â€“ Флаг', + 'DictionaryShortName' => 'Сокращенное название ÑловарÑ', + 'DigitalCreationDate' => 'Дата оцифровки файла', + 'DigitalCreationDateTime' => 'Дата и Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ†Ð¸Ñ„Ñ€Ð¾Ð²ÐºÐ¸ файла', + 'DigitalCreationTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ†Ð¸Ñ„Ñ€Ð¾Ð²ÐºÐ¸ файла', + 'DigitalSignature' => 'Ð¦Ð¸Ñ„Ñ€Ð¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ', + 'DigitalZoom' => { + Description => 'Цифровой зум', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'DigitalZoomOn' => { + Description => 'Цифровой зум', + PrintConv => { + 'Off' => 'Ðе включён', + 'On' => 'Включен', + }, + }, + 'DigitalZoomRatio' => 'КоÑффициент цифрового увеличениÑ', + 'Director' => 'Директор', + 'Directory' => 'Каталог', + 'DirectoryNumber' => 'Ðомер каталога', + 'DisallowCounterProposal' => 'Запретить вÑтречное предложение', + 'Disclaimer' => 'Отказ от ответÑтвенноÑти', + 'DisplayWindow' => 'Окно отображениÑ', + 'DisplayXResolution' => 'Разрешение Ñкрана по X', + 'DisplayXResolutionUnit' => { + Description => 'Единицы Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñкрана по X', + PrintConv => { + '0.01 mm' => '0.01 мм', + '0.1 mm' => '0.1 мм', + '10 cm' => '10 Ñм', + '10 m' => '10 м', + '100 m' => '100 м', + 'cm' => 'Ñм', + 'km' => 'км', + 'm' => 'м', + 'mm' => 'мм', + 'um' => 'мкм', + }, + }, + 'DisplayYResolution' => 'Разрешение Ñкрана по Y', + 'DisplayYResolutionUnit' => { + Description => 'Единицы Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñкрана по Y', + PrintConv => { + '0.01 mm' => '0.01 мм', + '0.1 mm' => '0.1 мм', + '10 cm' => '10 Ñм', + '10 m' => '10 м', + '100 m' => '100 м', + 'cm' => 'Ñм', + 'km' => 'км', + 'm' => 'м', + 'mm' => 'мм', + 'um' => 'мкм', + }, + }, + 'DisplayedUnitsX' => { + Description => 'Отображаемые единицы по X', + PrintConv => { + 'cm' => 'Сантиметры', + 'inches' => 'Дюймы', + }, + }, + 'DisplayedUnitsY' => { + Description => 'Отображаемые единицы по Y', + PrintConv => { + 'cm' => 'Сантиметры', + 'inches' => 'Дюймы', + }, + }, + 'Dispose' => 'Управление ÑлоÑми', + 'DistortionCompensation' => { + Description => 'КомпенÑÐ°Ñ†Ð¸Ñ Ð´Ð¸ÑторÑии', + PrintConv => { + 'Off' => 'Ðе включена', + 'On' => 'Включена', + 'n/a' => 'Ðет данных', + }, + }, + 'DistortionCorrParams' => 'Параметры коррекции диÑторÑии', + 'DistortionCorrection' => { + Description => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð´Ð¸ÑторÑии', + PrintConv => { + 'Auto' => 'ÐвтоматичеÑкаÑ', + 'Auto fixed by lens' => 'ÐвтоматичеÑÐºÐ°Ñ Ð¿Ð¾ объективу', + 'No correction params available' => 'Ðе доÑтупна', + 'Off' => 'Ðе включена', + }, + }, + 'DistortionCorrectionAlreadyApplied' => 'Применена ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð´Ð¸ÑторÑии', + 'Distribution' => 'ОпиÑание', + 'DittoKey' => { + Description => 'Ключь Ditto', + PrintConv => { + 'New' => 'Заново', + 'Same' => 'Так же', + }, + }, + 'DjVuVersion' => 'ВерÑÐ¸Ñ DjVu', + 'DoNotForwardMeeting' => 'Ðе передвигать вÑтречу', + 'DocClass' => 'СоÑтоÑние документа', + 'DocRights' => 'Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð°Ð²Ñ‚Ð¾Ñ€Ñкого права', + 'DocType' => 'Тип документа', + 'Document' => 'Документ', + 'DocumentAncestors' => 'Предки документа', + 'DocumentHistory' => 'ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°', + 'DocumentName' => 'Ðазвание документа', + 'DocumentNotes' => 'Комментарии к документу', + 'DocumentUsageRights' => 'Права на иÑпользование Документа', + 'DotRange' => 'Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð° ÑоответÑтвующих точке', + 'DriveMode' => { + Description => 'Режим ÑпуÑка', + PrintConv => { + 'Continuous Shooting' => 'Ð¡ÐµÑ€Ð¸Ð¹Ð½Ð°Ñ Ñъёмка', + 'Self-timer Operation' => 'Съёмка Ñ Ð°Ð²Ñ‚Ð¾ÑпуÑком', + 'Single-frame Shooting' => 'ÐŸÐ¾ÐºÐ°Ð´Ñ€Ð¾Ð²Ð°Ñ Ñъёмка', + }, + }, + 'DriveSerialNumber' => 'Серийный номер привода', + 'DriveType' => { + Description => 'Тип накопителÑ', + PrintConv => { + 'Fixed Disk' => 'УÑтановленный диÑк', + 'Invalid Root Path' => 'Ðеверный корневой путь', + 'Ram Disk' => 'Ram диÑк', + 'Remote Drive' => 'Удаленный диÑк', + 'Removable Media' => 'Съемный диÑк', + 'Unknown' => 'ÐеизвеÑтный', + }, + }, + 'DuotoneHalftoningInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ тонировании – Двуцветное', + 'DuotoneImageInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ двухцветном изображении', + 'DuotoneTransferFuncs' => 'Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñа – Двуцветное', + 'Duration' => 'ПродолжительноÑÑ‚ÑŒ', + 'DynamicRangeOptimizer' => { + Description => 'ÐžÐ¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ‡ÐµÑкого диапазона', + PrintConv => { + 'Advanced Auto' => 'РаÑширеннаÑ. ÐвтоматичеÑкаÑ', + 'Advanced Lv1' => 'РаÑширеннаÑ. Уровень 1', + 'Advanced Lv2' => 'РаÑширеннаÑ. Уровень 2', + 'Advanced Lv3' => 'РаÑширеннаÑ. Уровень 3', + 'Advanced Lv4' => 'РаÑширеннаÑ. Уровень 4', + 'Advanced Lv5' => 'РаÑширеннаÑ. Уровень 5', + 'Auto' => 'ÐвтоматичеÑкаÑ', + 'Off' => 'Ðе включена', + 'Standard' => 'СтандартнаÑ', + }, + }, + 'EPSOptions' => 'Параметры EPS', + 'EXRVersion' => 'ВерÑÐ¸Ñ EXR', + 'EarliestAgeOrLowestStage' => 'Самый ранний век/Ðизший ÑруÑ', + 'EarliestEonOrLowestEonothem' => 'Самый ранний Ñон/ÐÐ¸Ð·ÑˆÐ°Ñ Ñонотема', + 'EarliestEpochOrLowestSeries' => 'Ð¡Ð°Ð¼Ð°Ñ Ñ€Ð°Ð½Ð½ÑÑ Ñпоха/Ðизший отдел', + 'EarliestEraOrLowestErathem' => 'Ð¡Ð°Ð¼Ð°Ñ Ñ€Ð°Ð½Ð½ÑÑ Ñра/ÐÐ¸Ð·ÑˆÐ°Ñ Ñратема', + 'EarliestPeriodOrLowestSystem' => 'Самый ранний период/ÐÐ¸Ð·ÑˆÐ°Ñ ÑиÑтема', + 'EdgeNoiseReduction' => 'Щумоподавление – Уменьшение контурных шумов', + 'EditStatus' => 'Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ', + 'Edition' => 'Издание', + 'EditorialUpdate' => { + Description => 'Тип обновлениÑ', + PrintConv => { + 'Additional language' => 'Дополнительный Ñзык', + }, + }, + 'EffectiveBW' => 'Эффективный Чёрно-Белый', + 'EffectsVisible' => 'ВидимоÑÑ‚ÑŒ Ñффектов', + 'ElectronicImageStabilization' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ ÑÑ‚Ð°Ð±Ð¸Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ', + 'EmbeddedFileName' => 'Ðазвание вÑтроенного файла', + 'EmbeddedFileUsageRights' => 'Права на иÑпользование вÑтроенных файлов', + 'EmbeddedImage' => 'Ð’Ñтроенное изображение', + 'EmbeddedImageColorSpace' => 'Ð’Ñтроенное изображение – Цветовое проÑтранÑтво', + 'EmbeddedImageFilter' => 'Ð’Ñтроенное изображение – Фильтр', + 'EmbeddedImageHeight' => 'Ð’Ñтроенное изображение – Ð’Ñ‹Ñота', + 'EmbeddedImageWidth' => 'Ð’Ñтроенное изображение – Ширина', + 'EmbeddedJPG' => 'Ð’Ñтроенный JPG', + 'EmbeddedPNG' => 'Ð’Ñтроенный PNG', + 'EmbeddedVideo' => 'Ð’Ñтроенное видео', + 'EmbeddedXMPDigest' => 'Хеш-Ñумма вÑтроенного XMP', + 'Emphasis' => { + Description => 'Ðкцент', + PrintConv => { + 'None' => 'Ðет', + }, + }, + 'EncodeTime' => 'Ð’Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ', + 'EncodedBy' => 'Закодировал', + 'EncodedUsing' => 'Закодировано Ñ Ð¸Ñпользованием', + 'Encoder' => 'Кодер', + 'EncoderOptions' => 'ÐаÑтройки кодера', + 'EncoderVersion' => 'ВерÑÐ¸Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ°', + 'Encoding' => 'Кодирование', + 'EncodingProcess' => { + Description => 'ПроцеÑÑ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ', + PrintConv => { + 'Baseline DCT, Huffman coding' => 'Базовое DCT, кодирование Хаффмана', + 'Extended sequential DCT, Huffman coding' => 'РаÑширенное поÑледовательное DCT, кодирование Хаффмана', + 'Extended sequential DCT, arithmetic coding' => 'РаÑширенное поÑледовательное DCT, арифметичеÑкое кодирование', + 'Lossless, Differential Huffman coding' => 'Без потерь, дифференциальное кодирование Хаффмана', + 'Lossless, Huffman coding' => 'Без потерь, кодирование Хаффмана', + 'Lossless, arithmetic coding' => 'Без потерь, арифметичеÑкое кодирование', + 'Lossless, differential arithmetic coding' => 'Без потерь, дифференциальное арифметичеÑкое кодирование', + 'Progressive DCT, Huffman coding' => 'ПрогреÑÑивное DCT, кодирование Хаффмана', + 'Progressive DCT, arithmetic coding' => 'ПрогреÑÑивное DCT, арифметичеÑкое кодирование', + 'Progressive DCT, differential Huffman coding' => 'ПрогреÑÑивное DCT, дифференциальное кодирование Хаффмана', + 'Progressive DCT, differential arithmetic coding' => 'ПрогреÑÑивное DCT, дифференциальное арифметичеÑкое кодирование', + 'Sequential DCT, differential Huffman coding' => 'ПоÑледовательное DCT, Дифференциальное кодирование Хаффмана', + 'Sequential DCT, differential arithmetic coding' => 'ПоÑледовательное DCT, дифференциальное арифметичеÑкое кодирование', + }, + }, + 'EncodingScheme' => 'Схема кодированиÑ', + 'Encryption' => { + Description => 'Шифрование', + PrintConv => { + 'None' => 'Ðет', + 'Old Mobipocket' => 'Старый Mobipocket', + }, + }, + 'EncryptionKey' => 'Ключ шифрованиÑ', + 'EndPoints' => 'Конечные точки', + 'EndTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ', + 'EndUser' => 'Конечный пользователь', + 'EndUserID' => 'PLUS-ID пользователÑ', + 'EndUserName' => 'Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ', + 'EnvelopeNumber' => 'Ðомер конверта', + 'EnvelopePriority' => { + Description => 'Приоритет конверта', + PrintConv => { + '0 (reserved)' => '0 (Ð’ резерве)', + '1 (most urgent)' => '1 (Ðеотложное)', + '5 (normal urgency)' => '5 (Обычное)', + '8 (least urgent)' => '8 (Ðе Ñрочное)', + '9 (user-defined priority)' => '9 (ПользовательÑкий приоритет)', + }, + }, + 'EnvelopeRecordVersion' => 'ВерÑÐ¸Ñ Envelope Record', + 'EnvironmentMap' => { + Description => 'Карта окружениÑ', + PrintConv => { + 'Cube' => 'Куб', + 'Latitude/Longitude' => 'Широта/Долгота', + }, + }, + 'EquipmentInstitution' => 'Оборудование учреждениÑ', + 'EquipmentManufacturer' => 'Производитель оборудованиÑ', + 'Error' => 'Ошибка', + 'EscChar' => 'Escape-Ñимвол', + 'EscapeStatus' => 'Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ€Ð¾Ð±ÐµÐ³Ð°', + 'Event' => 'Событие', + 'EventDate' => 'Дата ÑобытиÑ', + 'EventDay' => 'День(и) ÑобытиÑ', + 'EventEarliestDate' => 'Дата начала ÑобытиÑ', + 'EventEndDayOfYear' => 'День года Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ ÑобытиÑ', + 'EventFieldNotes' => 'Полевые заметки о Ñобытии', + 'EventFieldNumber' => 'Ðомер полевых заметок о Ñобытии', + 'EventHabitat' => 'Ðреал ÑобытиÑ', + 'EventID' => 'ID ÑобытиÑ', + 'EventLatestDate' => 'Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ ÑобытиÑ', + 'EventMonth' => 'МеÑÑц ÑобытиÑ', + 'EventNumber' => 'Ðомер ÑобытиÑ', + 'EventParentEventID' => 'ID оÑновного ÑобытиÑ', + 'EventRemarks' => 'Комментарии к Ñобытию', + 'EventSampleSizeUnit' => 'Событие – Единицы размера', + 'EventSampleSizeValue' => 'Событие – Размер образца', + 'EventSamplingEffort' => 'Событие – Затраченные уÑилиÑ', + 'EventSamplingProtocol' => 'Событие – Метод иÑÑледованиÑ', + 'EventStartDayOfYear' => 'День года начала ÑобытиÑ', + 'EventTime' => 'Ð’Ñ€ÐµÐ¼Ñ ÑобытиÑ', + 'EventVerbatimEventDate' => 'Дата ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¿Ð¾ первоиÑточнику', + 'EventYear' => 'Год ÑобытиÑ', + 'ExceptionDateTimes' => 'Дата иÑключениÑ', + 'ExclusiveCoverage' => 'ЭкÑклюзивный репортаж', + 'ExcursionTolerance' => { + Description => 'Выход за пределы диапазона', + PrintConv => { + 'Allowed' => 'ДопуÑкаетÑÑ', + 'Not Allowed' => 'Ðе допуÑкаетÑÑ', + }, + }, + 'ExifByteOrder' => { + Description => 'Exif – ПорÑдок байтов', + PrintConv => { + 'Big-endian (Motorola, MM)' => 'ПорÑдок от Ñтаршего к младшему (Motorola, MM)', + 'Little-endian (Intel, II)' => 'ПорÑдок от младшего к Ñтаршему (Intel, II)', + }, + }, + 'ExifCameraInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ камере из Exif', + 'ExifImageHeight' => 'Exif – Ð’Ñ‹Ñота изображениÑ', + 'ExifImageWidth' => 'Exif – Ширина изображениÑ', + 'ExifInfo2' => 'Exif – Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ 2', + 'ExifOffset' => 'Смещение Exif Sub IFD', + 'ExifToolVersion' => 'ВерÑÐ¸Ñ ExifTool', + 'ExifUnicodeByteOrder' => { + Description => 'Exif – ПорÑдок байтов Unicode', + PrintConv => { + 'Big-endian (Motorola, MM)' => 'ПорÑдок от Ñтаршего к младшему (Motorola, MM)', + 'Little-endian (Intel, II)' => 'ПорÑдок от младшего к Ñтаршему (Intel, II)', + }, + }, + 'ExifVersion' => 'ВерÑÐ¸Ñ Exif', + 'ExpandFilm' => 'Expand – Плёнка', + 'ExpandFilterLens' => 'Expand – Фильтр объектива', + 'ExpandFlashLamp' => 'Expand – Ð’Ñпышка', + 'ExpandLens' => 'Expand – Объектив', + 'ExpandScanner' => 'Expand – Сканер', + 'ExpandSoftware' => 'Expand – Приложение', + 'ExpirationDate' => 'Дата иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ñрока', + 'ExpirationSpan' => 'Срок дейÑÑ‚Ð²Ð¸Ñ Ð¸ÑтечениÑ', + 'ExpirationTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð¸ÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ñрока', + 'Expires' => 'Дата уÑÑ‚Ð°Ñ€ÐµÐ²Ð°Ð½Ð¸Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°', + 'Exposure' => 'ЭкÑпозициÑ', + 'ExposureCompensation' => 'КомпенÑÐ°Ñ†Ð¸Ñ ÑкÑпозиции', + 'ExposureIndex' => 'Ð˜Ð½Ð´ÐµÐºÑ ÑкÑпозиции', + 'ExposureLockUsed' => 'ИÑпользование блокировки параметров ÑкÑпозиции', + 'ExposureMode' => { + Description => 'Режим ÑкÑпозиции', + PrintConv => { + 'Auto' => 'ÐвтоÑкÑпозициÑ', + 'Auto bracket' => 'Ðвтобрекетинг', + 'Manual' => 'Ð ÑƒÑ‡Ð½Ð°Ñ ÑкÑпозициÑ', + }, + }, + 'ExposureProgram' => { + Description => 'Программа ÑкÑпозиции', + PrintConv => { + 'Action (High speed)' => 'Спорт', + 'Aperture-priority AE' => 'ÐвтоÑкÑÐ¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ñ Ð¿Ñ€Ð¸Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚Ð¾Ð¼ Диафрагмы', + 'Bulb' => 'Выдержка от руки', + 'Creative (Slow speed)' => 'ТворчеÑкаÑ', + 'Landscape' => 'Пейзаж', + 'Manual' => 'РучнаÑ', + 'Not Defined' => 'Ðе определена', + 'Portrait' => 'Портрет', + 'Program AE' => 'ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð½Ð°Ñ Ð°Ð²Ñ‚Ð¾ÑкÑпозициÑ', + 'Shutter speed priority AE' => 'ÐвтоÑкÑÐ¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ñ Ð¿Ñ€Ð¸Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚Ð¾Ð¼ Выдержки', + }, + }, + 'ExposureTime' => 'Выдержка', + 'ExposureTimes' => 'Выдержка2', + 'ExtCache' => 'Ðазвание альтернативного кÑша', + 'ExtenderStatus' => { + Description => 'Ð¡Ñ‚Ð°Ñ‚ÑƒÑ ÑкÑтендера', + PrintConv => { + 'Attached' => 'Прикреплен', + 'Not attached' => 'Ðе прикреплен', + 'Removed' => 'Удалён', + }, + }, + 'ExternalLeading' => 'Внешний зазор', + 'ExtraFlags' => { + Description => 'Дополнительные флаги', + PrintConv => { + '(none)' => 'ОтÑутÑтвуют', + 'Fastest Algorithm' => 'БыÑтрый алгоритм', + 'Maximum Compression' => 'МакÑимальное Ñжатие', + }, + }, + 'ExtraSamples' => { + Description => 'ОпиÑание дополнительных компонентов', + PrintConv => { + 'Associated Alpha' => 'СвÑзаные альфа-данные', + 'Unassociated Alpha' => 'ÐеÑвÑзанные альфа-данные', + 'Unspecified' => 'Данные без указаниÑ', + }, + }, + 'FNumber' => 'Диафрагменное чиÑло', + 'FOV' => 'Поле зрениÑ', + 'FSType' => 'Тип Ð²Ð½ÐµÐ´Ñ€ÐµÐ½Ð¸Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ð° в документ', + 'FaceBalanceOrigI' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð»Ð¸Ñ†Ð° – ИÑходный I', + 'FaceBalanceOrigQ' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð»Ð¸Ñ†Ð° – ИÑходный Q', + 'FaceBalanceStrength' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð»Ð¸Ñ†Ð° – ИнтенÑивноÑÑ‚ÑŒ', + 'FaceBalanceWarmth' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð»Ð¸Ñ†Ð° – Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð°', + 'FaceDetected' => 'Обнаружение лица', + 'FaceID' => 'Идентификатор лица', + 'FaceNumbers' => 'КоличеÑтво лиц', + 'FaceOrientation' => { + PrintConv => { + 'Horizontal (normal)' => 'Положительное направление', + 'Rotate 180' => 'Поворот на 180°', + 'Rotate 270 CW' => 'Поворот на 270° по чаÑовой Ñтрелке', + 'Rotate 90 CW' => 'Поворот на 90° по чаÑовой Ñтрелке', + }, + }, + 'FacePosition' => 'Положение лица', + 'FacesDetected' => 'Обнаружены лица', + 'Far' => 'Дальнее значение карты глубины', + 'FastSeek' => { + Description => 'БыÑтрый поиÑк', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'FaxProfile' => { + Description => 'ФакÑ-профиль', + PrintConv => { + 'Extended B&W lossless, F' => 'РаÑширенный чёрно-белый без потерь, профиль F', + 'Lossless JBIG B&W, J' => 'JBIG чёрно-белый без потерь, профиль J', + 'Lossless color and grayscale, L' => 'Цветной и Ñ Ð¾Ñ‚Ñ‚ÐµÐ½ÐºÐ°Ð¼Ð¸ Ñерого без потерь, профиль L', + 'Lossy color and grayscale, C' => 'Цветной и Ñ Ð¾Ñ‚Ñ‚ÐµÐ½ÐºÐ°Ð¼Ð¸ Ñерого Ñ Ð¿Ð¾Ñ‚ÐµÑ€Ñми, профиль C', + 'Minimal B&W lossless, S' => 'Минимальный чёрно-белый без потерь, профиль S', + 'Mixed raster content, M' => 'Смешанное Ñодержимое раÑтра, профиль M', + 'Multi Profiles' => 'ÐеÑколько профилей', + 'Profile T' => 'Профиль T', + 'Unknown' => 'Ðе ÑоответÑтвует профилю факÑимильной ÑвÑзи', + }, + }, + 'FaxRecvParams' => 'Параметры Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ„Ð°ÐºÑов', + 'FaxRecvTime' => 'Требуемое Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ„Ð°ÐºÑа', + 'FaxSubAddress' => 'ÐŸÐ¾Ð´Ð°Ð´Ñ€ÐµÑ Ñ„Ð°ÐºÑа', + 'FieldOfView' => { + Description => 'Угол обзора', + PrintConv => { + 'Linear' => 'Линейный', + 'Wide' => 'Широкий', + }, + }, + 'FieldPermissions' => { + Description => 'Ð Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° изменение Полей', + PrintConv => { + 'Allow changes to specified form fields' => 'Разрешить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² указанных полÑÑ… формы', + 'Disallow changes to all form fields' => 'Запретить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð¾ вÑех полÑÑ… формы', + 'Disallow changes to specified form fields' => 'Запретить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² указанных полÑÑ… формы', + }, + }, + 'File1Duration' => 'Файл 1 – ПродолжительноÑÑ‚ÑŒ', + 'File1Length' => 'Файл 1 – Размер', + 'File1MD5Sum' => 'Файл 1 – Сумма MD5', + 'File1Media' => 'Файл 1 – Медиа', + 'File1Path' => 'Файл 1 – Путь', + 'File1PathUTF-8' => 'Файл 1 – Путь в кодировке UTF-8', + 'FileAccessDate' => 'Дата поÑледнего доÑтупа к файлу', + 'FileAttributes' => { + Description => 'Ðтрибуты файла', + PrintConv => { + 'Archive' => 'Ðрхивный', + 'BSD Whiteout' => 'BSD – Скрытый', + 'Block' => 'Блок', + 'Character' => 'Символ', + 'Compressed' => 'Сжатый', + 'Device' => 'УÑтройÑтво', + 'Directory' => 'Каталог', + 'Encrypted' => 'Зашифрованный', + 'Encrypted?' => 'Зашифрованные?', + 'FIFO' => 'FIFO (именованный канал)', + 'Hidden' => 'Скрытый', + 'Mux Block' => 'Блок Mux', + 'Mux Character' => 'Символ Mux', + 'Normal' => 'Без атрибутов', + 'Not Content Indexed' => 'Ðе проиндекÑированный', + 'Not indexed' => 'Ðе индекÑированный', + 'Offline' => 'Ðвтономный', + 'Read Only' => 'Только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ', + 'Read-only' => 'Только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ', + 'Regular' => 'Обычный', + 'Reparse Point' => 'Точки повторной обработки', + 'Reparse point' => 'Точки повторной обработки', + 'Set Group ID' => 'УÑтановка ID группы', + 'Set User ID' => 'УÑтановка ID пользователÑ', + 'Socket' => 'Сокет', + 'Solaris Door' => 'Дверь (в Solaris)', + 'Solaris Shadow Inode' => 'Теневой Ð¸Ð½Ð´ÐµÐºÑ Solaris', + 'Sparse' => 'Разрежённый', + 'Sparse File' => 'Разрежённый файл', + 'Symbolic Link' => 'СимволичеÑÐºÐ°Ñ ÑÑылка', + 'System' => 'СиÑтемный', + 'Temporary' => 'Временный', + 'Unknown' => 'ÐеизвеÑтный', + 'Volume' => 'Том', + 'Volume Label' => 'Метка тома', + 'VxFS Compressed' => 'Сжатый VxFS', + 'XENIX Named' => 'Именованный (в XENIX)', + }, + }, + 'FileBlockCount' => 'КоличеÑтво блоков в файле', + 'FileBlockSize' => 'Размер блока в файле', + 'FileCreateDate' => 'Дата ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°', + 'FileDeviceID' => 'ID уÑтройÑтва файла', + 'FileDeviceNumber' => 'Ðомер уÑтройÑтва файла', + 'FileFormat' => { + Description => 'Формат файла', + PrintConv => { + 'AppleSingle (Apple Computer Inc)' => 'AppleSingle (Apple)', + 'Audio Interchange File Format AIFF (Apple Computer Inc)' => 'Ðудиофайл формата AIFF (Apple)', + 'Bit Mapped Graphics File [.BMP] (Microsoft)' => 'Битовый графичеÑкий файл [.BMP] (Microsoft)', + 'Compressed Binary File [.ZIP] (PKWare Inc)' => 'Сжатый двоичный файл [.ZIP] (ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ PKWare)', + 'Digital Audio File [.WAV] (Microsoft & Creative Labs)' => 'Ðудиофайл формата [.WAV] (Microsoft и Creative Labs)', + 'Hypertext Markup Language [.HTML] (The Internet Society)' => 'Язык гипертекÑтовой разметки [.HTML] (The Internet Society)', + 'IPTC Unstructured Character Oriented File Format (UCOFF)' => 'ÐеÑтруктурированный Ñимвольно-ориентированный формат файла IPTC (UCOFF)', + 'IPTC7901 Recommended Message Format' => 'IPTC7901 Рекомендуемый формат ÑообщениÑ', + 'Illustrator (Adobe Graphics data)' => 'Illustrator (ГрафичеÑкие данные Adobe)', + 'JPEG File Interchange (JFIF)' => 'Формат обмена файлами Ñтандарта JPEG (JFIF)', + 'MPEG 2 Audio Layer 2 (Musicom), ISO/IEC' => 'Ðудио второго ÑƒÑ€Ð¾Ð²Ð½Ñ MPEG 2 (Musicom), ISO/IEC', + 'MPEG 2 Audio Layer 3, ISO/IEC' => 'Ðудио третьего ÑƒÑ€Ð¾Ð²Ð½Ñ MPEG 2 , ISO/IEC', + 'News Industry Text Format (NITF)' => 'ТекÑтовый формат новоÑтной индуÑтрии (NITF)', + 'No ObjectData' => 'Данные объекта отÑутÑтвуют', + 'PC DOS/Windows Executable Files [.COM][.EXE]' => 'ИÑполнÑемый файл PC DOS/Windows [.COM][.EXE]', + 'RIFF Wave (Microsoft Corporation)' => 'RIFF Wave (Microsoft)', + 'Ritzaus Bureau NITF version (RBNITF DTD)' => 'Ritzaus Bureau вариант NITF (RBNITF DTD)', + 'Tagged Image File Format (Adobe/Aldus Image data)' => 'Формат файла Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ñ‚ÐµÐ³Ð°Ð¼Ð¸ (Adobe/Aldus данные изображениÑ)', + 'Tape Archive [.TAR]' => 'Формат файла архива [.TAR]', + 'Tidningarnas Telegrambyra NITF version (TTNITF DTD)' => 'Tidningarnas Telegrambyra вариант NITF (TTNITF DTD)', + 'United Press International ANPA 1312 variant' => 'United Press International – Вариант ANPA 1312', + 'United Press International Down-Load Message' => 'United Press International – Down-Load Message', + }, + }, + 'FileGroupID' => 'ID группы файла', + 'FileHardLinks' => 'ЖёÑткие ÑÑылки файла', + 'FileID' => 'ID файла', + 'FileInfoLen' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ файле – Len', + 'FileInfoLen2' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ файле – Len 2', + 'FileInfoVersion' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ файле – ВерÑиÑ', + 'FileInodeChangeDate' => 'Дата Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¾Ð³Ð¾ индекÑа', + 'FileInodeNumber' => 'Ðомер индекÑа файла', + 'FileModifyDate' => 'Дата Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°', + 'FileName' => 'Ðазвание файла', + 'FileNameAsDelivered' => 'Ðазвание предоÑтавленного файла', + 'FileNameLength' => 'Длина Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°', + 'FileNumber' => 'Ðомер файла', + 'FilePath' => 'Путь к файлу', + 'FilePermissions' => 'Ð Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°', + 'FileSequence' => 'ПоÑледовательноÑÑ‚ÑŒ файлов', + 'FileSize' => 'Размер файла', + 'FileSizeBytes' => 'Размер файла в байтах', + 'FileSource' => { + Description => 'ИÑточник файла', + PrintConv => { + 'Digital Camera' => 'Ð¦Ð¸Ñ„Ñ€Ð¾Ð²Ð°Ñ Ñ„Ð¾Ñ‚Ð¾ÐºÐ°Ð¼ÐµÑ€Ð°', + 'Film Scanner' => 'Плёночный Ñканер', + 'Reflection Print Scanner' => 'Планшетный Ñканер', + 'Sigma Digital Camera' => 'Ð¦Ð¸Ñ„Ñ€Ð¾Ð²Ð°Ñ Ñ„Ð¾Ñ‚Ð¾ÐºÐ°Ð¼ÐµÑ€Ð° Sigma', + }, + }, + 'FileType' => 'Тип файла', + 'FileTypeExtension' => 'РаÑширение файла', + 'FileUserID' => 'ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ„Ð°Ð¹Ð»Ð°', + 'FileVersion' => 'ВерÑÐ¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð°', + 'Filename' => 'Ðазвание файла', + 'Files' => 'Файлы', + 'FillAttributes' => 'Ðттрибуты заполнениÑ', + 'FillOrder' => { + Description => 'ПорÑдок битов в байте', + PrintConv => { + 'Normal' => 'Обычный', + 'Reversed' => 'Обратный', + }, + }, + 'Filter' => { + Description => 'Фильтр', + PrintConv => { + 'Adaptive' => 'Ðдаптивный', + }, + }, + 'FinalFrameBlocks' => 'Блоков в поÑледнем кадре', + 'Firmware' => 'Прошивка', + 'FirmwareDate' => 'Дата прошивки', + 'FirmwareID' => 'ID прошивки', + 'FirmwareVersion' => 'ВерÑÐ¸Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸', + 'FirmwareVersions' => 'ВерÑÐ¸Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸', + 'FirstChar' => 'Первый Ñимвол шрифта', + 'FirstPhotoDate' => 'Дата ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ изображениÑ', + 'FirstPublicationDate' => 'Дата первой публикации изображениÑ', + 'FixtureIdentifier' => 'Узнаваемый идентификатор', + 'Flags' => { + Description => 'Флаги', + PrintConv => { + 'Allow Download' => 'Разрешить загрузку', + 'Allow Recording' => 'Разрешить запиÑÑŒ', + 'Animation' => 'ÐнимациÑ', + 'Comment' => 'Комментарий', + 'Description' => 'ОпиÑание', + 'Extension Present' => 'ÐаÑтоÑщее времÑ', + 'ExtraFields' => 'Дополнительное поле', + 'FileName' => 'Ðазвание файлов', + 'IDList' => 'СпиÑок ID', + 'IconFile' => 'Иконка файла', + 'Limited Range' => 'Ограниченный диапазон', + 'LinkInfo' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑÑылке', + 'LinkToLink' => 'СÑылка на ÑÑылку', + 'Live' => 'Ð’ прÑмом Ñфире', + 'NoLinkInfo' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑÑылке отÑутÑтвует', + 'NoLinkPathTracking' => 'ОтÑлеживание пути без ÑÑылки', + 'NoLinkTrack' => 'Без ÑÑылки на трек', + 'Perfect Play' => 'ВоÑпроизводить поÑле загрузки', + 'RelativePath' => 'ОтноÑительный путь', + 'RunAsUser' => 'ЗапуÑк от имени пользователÑ', + 'TargetMetadata' => 'Целевые метаданные', + 'Text' => 'ТекÑÑ‚', + 'Unicode' => 'Юникод', + 'WorkingDir' => 'Ð Ð°Ð±Ð¾Ñ‡Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°', + }, + }, + 'Flash' => { + Description => 'СоÑтоÑние вÑпышки при Ñъёмке', + PrintConv => { + 'Auto, Did not fire' => 'ÐвтоматичеÑкий режим. Ð’Ñпышка не Ñработала', + 'Auto, Did not fire, Red-eye reduction' => 'ÐвтоматичеÑкий режим. Ð’Ñпышка не Ñработала. Включён режим ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ñффекта «краÑных глаз»', + 'Auto, Fired' => 'ÐвтоматичеÑкий режим. Ð’Ñпышка Ñработала', + 'Auto, Fired, Red-eye reduction' => 'ÐвтоматичеÑкий режим. Ð’Ñпышка Ñработала', + 'Auto, Fired, Red-eye reduction, Return detected' => 'ÐвтоматичеÑкий режим. Ð’Ñпышка Ñработала. Включён режим ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ñффекта «краÑных глаз». Отражённый Ñвет обнаружен', + 'Auto, Fired, Red-eye reduction, Return not detected' => 'ÐвтоматичеÑкий режим. Ð’Ñпышка Ñработала. Включён режим ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ñффекта «краÑных глаз». Отражённый Ñвет не обнаружен', + 'Auto, Fired, Return detected' => 'ÐвтоматичеÑкий режим. Ð’Ñпышка Ñработала. Отражённый Ñвет обнаружен', + 'Auto, Fired, Return not detected' => 'ÐвтоматичеÑкий режим. Ð’Ñпышка Ñработала. Отражённый Ñвет не обнаружен', + 'Did not fire' => 'Ð’Ñпышка не Ñработала', + 'Fired' => 'Ð’Ñпышка Ñработала', + 'Fired, Red-eye reduction' => 'Ð’Ñпышка Ñработала. Включён режим ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ñффекта «краÑных глаз»', + 'Fired, Red-eye reduction, Return detected' => 'Ð’Ñпышка Ñработала. Включён режим ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ñффекта «краÑных глаз». Отражённый Ñвет обнаружен', + 'Fired, Red-eye reduction, Return not detected' => 'Ð’Ñпышка Ñработала. Включён режим ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ñффекта «краÑных глаз». Отражённый Ñвет не обнаружен', + 'Fired, Return detected' => 'Ð’Ñпышка Ñработала. Отражённый Ñвет обнаружен', + 'Fired, Return not detected' => 'Ð’Ñпышка Ñработала. Отражённый Ñвет не обнаружен', + 'No Flash' => 'Без вÑпышки', + 'No flash function' => 'Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ñпышки не поддерживаетÑÑ', + 'Off' => 'Ðе включена', + 'Off, Did not fire' => 'Ðе включена. Ð’Ñпышка не Ñработала', + 'Off, Did not fire, Return not detected' => 'Ðе включена. Ð’Ñпышка не Ñработала. Отражённый Ñвет не обнаружен', + 'Off, No flash function' => 'Ðе включена. Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ñпышки не поддерживаетÑÑ', + 'Off, Red-eye reduction' => 'Ðе включена. Включён режим ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ñффекта «краÑных глаз»', + 'On' => 'Включена', + 'On, Did not fire' => 'Принудительный режим. Ð’Ñпышка не Ñработала', + 'On, Fired' => 'Принудительный режим. Ð’Ñпышка Ñработала', + 'On, Red-eye reduction' => 'Принудительный режим. Включён режим ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ñффекта «краÑных глаз»', + 'On, Red-eye reduction, Return detected' => 'Принудительный режим. Включён режим ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ñффекта «краÑных глаз». Отражённый Ñвет обнаружен', + 'On, Red-eye reduction, Return not detected' => 'Принудительный режим. Включён режим ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ñффекта «краÑных глаз». Отражённый Ñвет не обнаружен', + 'On, Return detected' => 'Принудительный режим. Отражённый Ñвет обнаружен', + 'On, Return not detected' => 'Принудительный режим. Отражённый Ñвет не обнаружен', + }, + }, + 'FlashAttributes' => { + Description => 'Flash аттрибуты', + PrintConv => { + 'UseNetwork' => 'ИÑпользовать Ñеть', + }, + }, + 'FlashCompensation' => 'КомпенÑÐ°Ñ†Ð¸Ñ Ð²Ñпышки', + 'FlashEnergy' => 'МощноÑÑ‚ÑŒ вÑпышки', + 'FlashExposureComp' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð²Ñпышки', + 'FlashManufacturer' => 'Производитель вÑпышки', + 'FlashMode' => { + Description => 'Режим вÑпышки', + PrintConv => { + 'Auto' => 'ÐвтоматичеÑкий', + 'Disabled' => 'Ð’Ñпышка не включена', + 'Force' => 'Принудительный', + 'Red eye' => 'КраÑные глаза', + }, + }, + 'FlashModel' => 'Модель вÑпышки', + 'FlashType' => { + Description => 'Тип вÑпышки', + PrintConv => { + 'Built-In Flash' => 'Ð’ÑтроеннаÑ', + 'External' => 'ВнешнÑÑ', + }, + }, + 'FlashVersion' => 'ВерÑÐ¸Ñ Flash', + 'FlashpixVersion' => 'ВерÑÐ¸Ñ Flashpix', + 'FlickerReduce' => { + Description => 'Уменьшение мерцаниÑ', + PrintConv => { + 'Off' => 'Ðе включено', + 'On' => 'Включено', + }, + }, + 'FlightPitchDegree' => 'Тангаж полета (наклон)', + 'FlightRollDegree' => 'Крен полета (вращение)', + 'FlightXSpeed' => 'СкороÑÑ‚ÑŒ полёта по оÑи X', + 'FlightYSpeed' => 'СкороÑÑ‚ÑŒ полёта по оÑи Y', + 'FlightYawDegree' => 'РыÑкание полета (поворот)', + 'FlightZSpeed' => 'СкороÑÑ‚ÑŒ полёта по оÑи Z', + 'FocalDistance' => 'ФокуÑное раÑÑтоÑние', + 'FocalLength' => 'ФокуÑное раÑÑтоÑние', + 'FocalLength35efl' => 'ФокуÑное раÑÑтоÑние', + 'FocalLengthIn35mmFormat' => 'ФокуÑное раÑÑтоÑние Ð´Ð»Ñ 35-мм формата', + 'FocalPlaneResolutionUnit' => { + Description => 'Единицы Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð² фокальной плоÑкоÑти', + PrintConv => { + 'None' => 'Ðе указано', + 'cm' => 'Ñм', + 'inches' => 'дюймы', + 'mm' => 'мм', + 'um' => 'мкм', + }, + }, + 'FocalPlaneXResolution' => 'Разрешение в фокальной плоÑкоÑти по X', + 'FocalPlaneYResolution' => 'Разрешение в фокальной плоÑкоÑти по Y', + 'FocalPointX' => 'Точка фокуÑа по оÑи X', + 'FocalPointY' => 'Точка фокуÑа по оÑи Y', + 'FocusDistance' => 'ФокуÑное раÑÑтоÑние', + 'FocusDistance2' => 'ФокуÑное раÑÑтоÑние 2', + 'FocusMode' => 'Режим фокуÑировки', + 'FocusPos' => 'ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ñ„Ð¾ÐºÑƒÑа', + 'FontFamily' => { + Description => 'СемейÑтво шрифта', + PrintConv => { + 'Decorative' => 'Декоративный', + 'Don\'t Care' => 'Без разницы', + 'Modern' => 'Модерн', + 'Script' => 'Скрипт', + }, + }, + 'FontName' => 'Ðазвание шрифта', + 'FontSize' => 'Размер шрифта', + 'FontSubfamily' => 'Стиль шрифта', + 'FontSubfamilyID' => 'ID ÑÑ‚Ð¸Ð»Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ð°', + 'FontType' => 'Тип шрифта', + 'FontWeight' => 'Толщина шрифта', + 'Footnotes' => 'СноÑки', + 'For' => 'ДлÑ', + 'FormExtraUsageRights' => 'Права на иÑпользование Форм Extra', + 'FormFields' => 'ÐŸÐ¾Ð»Ñ Ñ„Ð¾Ñ€Ð¼', + 'FormUsageRights' => 'Права на иÑпользование Форм', + 'Format' => { + Description => 'Формат', + PrintConv => { + 'RangeInverse' => 'Диапазон инверÑии', + 'RangeLinear' => 'Диапазон линейноÑти', + }, + }, + 'FormatVersionTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð²ÐµÑ€Ñии формата', + 'FormattedName' => 'Отформатированное имÑ', + 'Formatter' => 'Форматировщик', + 'ForwardMatrix1' => 'ПрÑÐ¼Ð°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° 1', + 'ForwardMatrix2' => 'ПрÑÐ¼Ð°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° 2', + 'FossilSpecimen' => 'ИÑкопаемый образец', + 'FossilSpecimenMaterialSampleID' => 'ID материала иÑкопаемого образца', + 'FovCot' => 'Угол обзора и КотангенÑ', + 'FractalParameters' => 'Фрактальные параметры', + 'FragmentList' => 'СпиÑок фрагментов', + 'FragmentTable' => 'Таблица фрагментов', + 'FrameCount' => 'КоличеÑтво кадров', + 'FrameExposureTime' => 'Ð’Ñ€ÐµÐ¼Ñ ÑкÑпозиции кадра', + 'FrameID' => 'ID кадра', + 'FrameNum' => 'Ðомер кадра', + 'FrameRate' => 'ЧаÑтота кадров', + 'FrameSize' => 'Размер кадра', + 'FrameSizeMax' => 'МакÑимальный размер кадра', + 'FrameSizeMin' => 'Минимальный размер кадра', + 'FramesPerSecond' => 'Кадров в Ñекунду', + 'Free' => 'Свободный', + 'FreeBusyTime' => 'Свободное/ЗанÑтое времÑ', + 'FreeByteCounts' => 'КоличеÑтво байтов в Ñтроке неиÑпользуемых байтов', + 'FreeOffsets' => 'Смещение к Ñтроке неиÑпользуемых байтов', + 'FullName' => 'Полное название шрифта', + 'FullPanoHeightPixels' => 'ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð¿Ð¾Ð»Ð½Ð°Ñ Ð²Ñ‹Ñота до обрезки изображениÑ', + 'FullPanoWidthPixels' => 'ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð¿Ð¾Ð»Ð½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° до обрезки изображениÑ', + 'FullScreen' => 'ПолноÑкранный', + 'GDALMetadata' => 'GDAL – Метаданные', + 'GDALNoData' => 'GDAL – ПрозрачноÑÑ‚ÑŒ', + 'GEMake' => 'GE – Сделан', + 'GEModel' => 'GE – Модель', + 'GIFApplicationExtension' => 'РаÑширение GIF-приложениÑ', + 'GIFGraphicControlExtension' => 'РаÑширение ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ñ€Ð°Ñ„Ð¸ÐºÐ¾Ð¹ GIF', + 'GIFPlainTextExtension' => 'РаÑширение обычного текÑта GIF', + 'GIFTFtpPriority' => 'Приоритет GIFT Ftp', + 'GIFVersion' => 'ВерÑÐ¸Ñ GIF', + 'GLPI_Unknown4' => 'GLPI – ÐеизвеÑтный 4', + 'GPRI_Unknown4' => 'GPRI – ÐеизвеÑтный – 4', + 'GPRI_Unknown5' => 'GPRI – ÐеизвеÑтный – 5', + 'GPRI_Unknown8' => 'GPRI – ÐеизвеÑтный – 8', + 'GPRI_Unknown9' => 'GPRI – ÐеизвеÑтный – 9', + 'GPSAltitude' => 'GPS – Ð’Ñ‹Ñота', + 'GPSAltitudeRaw' => 'GPS – Ð’Ñ‹Ñота – Raw', + 'GPSAltitudeRef' => { + Description => 'GPS – Ð˜Ð½Ð´ÐµÐºÑ Ð²Ñ‹Ñоты', + PrintConv => { + 'Above Sea Level' => 'Ðад уровнем морÑ', + 'Below Sea Level' => 'Ðиже ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¼Ð¾Ñ€Ñ', + }, + }, + 'GPSAreaInformation' => 'GPS – Ðазвание облаÑти', + 'GPSDOP' => 'GPS – ТочноÑÑ‚ÑŒ измерениÑ', + 'GPSDateStamp' => 'GPS – Дата и времÑ', + 'GPSDateTime' => 'GPS – Дата/ВремÑ', + 'GPSDateTimeRaw' => 'GPS – Дата/Ð’Ñ€ÐµÐ¼Ñ â€“ Raw', + 'GPSDestBearing' => 'GPS – Пеленг объекта Ñъёмки', + 'GPSDestBearingRef' => { + Description => 'GPS – Ориентир пеленга объекта Ñъёмки', + PrintConv => { + 'Magnetic North' => 'Ðа магнитный Ñеверный полюÑ', + 'True North' => 'Ðа географичеÑкий Ñеверный полюÑ', + }, + }, + 'GPSDestDistance' => 'GPS – РаÑÑтоÑние до объекта Ñъёмки', + 'GPSDestDistanceRef' => { + Description => 'GPS – Единицы Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ñ€Ð°ÑÑтоÑниÑ', + PrintConv => { + 'Kilometers' => 'Километры', + 'Miles' => 'Мили', + 'Nautical Miles' => 'МорÑкие мили', + }, + }, + 'GPSDestLatitude' => 'GPS – Широта объекта Ñъёмки', + 'GPSDestLatitudeRef' => { + Description => 'GPS – Ð˜Ð½Ð´ÐµÐºÑ ÑˆÐ¸Ñ€Ð¾Ñ‚Ñ‹ объекта Ñъёмки', + PrintConv => { + 'North' => 'Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑˆÐ¸Ñ€Ð¾Ñ‚Ð°', + 'South' => 'Ð®Ð¶Ð½Ð°Ñ ÑˆÐ¸Ñ€Ð¾Ñ‚Ð°', + }, + }, + 'GPSDestLongitude' => 'GPS – Долгота объекта Ñъёмки', + 'GPSDestLongitudeRef' => { + Description => 'GPS – Ð˜Ð½Ð´ÐµÐºÑ Ð´Ð¾Ð»Ð³Ð¾Ñ‚Ñ‹ объекта Ñъёмки', + PrintConv => { + 'East' => 'ВоÑÑ‚Ð¾Ñ‡Ð½Ð°Ñ Ð´Ð¾Ð»Ð³Ð¾Ñ‚Ð°', + 'West' => 'Ð—Ð°Ð¿Ð°Ð´Ð½Ð°Ñ Ð´Ð¾Ð»Ð³Ð¾Ñ‚Ð°', + }, + }, + 'GPSDifferential' => { + Description => 'GPS – Ð”Ð¸Ñ„Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð¿Ñ€Ð°Ð²ÐºÐ°', + PrintConv => { + 'Differential Corrected' => 'Ð”Ð¸Ñ„Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð¿Ñ€Ð°Ð²ÐºÐ° применена', + 'No Correction' => 'Измерение без дифференциальной поправки', + }, + }, + 'GPSHPositioningError' => 'GPS – Ошибка горизонтального позиционированиÑ', + 'GPSImgDirection' => 'GPS – ÐÐ°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹ при Ñъёмке', + 'GPSImgDirectionRef' => { + Description => 'GPS – Ориентир Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹', + PrintConv => { + 'Magnetic North' => 'Ðа магнитный Ñеверный полюÑ', + 'True North' => 'Ðа географичеÑкий Ñеверный полюÑ', + }, + }, + 'GPSInfo' => 'IFD указатель информации GPS', + 'GPSLatitude' => 'GPS – Широта', + 'GPSLatitudeRaw' => 'GPS – Широта – Raw', + 'GPSLatitudeRef' => { + Description => 'GPS – Ð˜Ð½Ð´ÐµÐºÑ ÑˆÐ¸Ñ€Ð¾Ñ‚Ñ‹', + PrintConv => { + 'North' => 'Ð¡ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑˆÐ¸Ñ€Ð¾Ñ‚Ð°', + 'South' => 'Ð®Ð¶Ð½Ð°Ñ ÑˆÐ¸Ñ€Ð¾Ñ‚Ð°', + }, + }, + 'GPSLongitude' => 'GPS – Долгота', + 'GPSLongitudeRaw' => 'GPS – Долгота – Raw', + 'GPSLongitudeRef' => { + Description => 'GPS – Ð˜Ð½Ð´ÐµÐºÑ Ð´Ð¾Ð»Ð³Ð¾Ñ‚Ñ‹', + PrintConv => { + 'East' => 'ВоÑÑ‚Ð¾Ñ‡Ð½Ð°Ñ Ð´Ð¾Ð»Ð³Ð¾Ñ‚Ð°', + 'West' => 'Ð—Ð°Ð¿Ð°Ð´Ð½Ð°Ñ Ð´Ð¾Ð»Ð³Ð¾Ñ‚Ð°', + }, + }, + 'GPSLongtitude' => 'GPS – Долгота', + 'GPSMapDatum' => 'GPS – СиÑтема координат', + 'GPSMeasureMode' => { + Description => 'GPS – Режим Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ GPS', + PrintConv => { + '2-Dimensional Measurement' => '2-Ð¼ÐµÑ€Ð½Ð°Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ', + '3-Dimensional Measurement' => '3-Ð¼ÐµÑ€Ð½Ð°Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ', + }, + }, + 'GPSPosition' => 'GPS – МеÑтоположение', + 'GPSProcessingMethod' => 'GPS – Метод вычиÑÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ', + 'GPSSatellites' => 'GPS – ИÑпользуемые Ñпутники', + 'GPSSpeed' => 'GPS – СкороÑÑ‚ÑŒ передвижениÑ', + 'GPSSpeed3D' => 'GPS – СкороÑÑ‚ÑŒ 3D', + 'GPSSpeedRaw' => 'GPS – ÑкороÑÑ‚ÑŒ – Raw', + 'GPSSpeedRef' => { + Description => 'GPS – Единицы Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ ÑкороÑти', + PrintConv => { + 'km/h' => 'Км/ч', + 'knots' => 'Узлы', + 'mph' => 'Миль/ч', + }, + }, + 'GPSSpeedX' => 'GPS – СкороÑÑ‚ÑŒ по X', + 'GPSSpeedY' => 'GPS – СкороÑÑ‚ÑŒ по Y', + 'GPSSpeedZ' => 'GPS – СкороÑÑ‚ÑŒ по Z', + 'GPSStatus' => { + Description => 'GPS – СоÑтоÑние приёмника во Ð²Ñ€ÐµÐ¼Ñ Ñъёмки', + PrintConv => { + 'Measurement Active' => 'Координаты актуальные', + 'Measurement Void' => 'Ðктуальных координат нету', + }, + }, + 'GPSTimeStamp' => 'GPS – Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñанных координат', + 'GPSTrack' => 'GPS – Трек', + 'GPSTrackRaw' => 'GPS – Трек – Raw', + 'GPSTrackRef' => { + Description => 'GPS – Ориентир направлениÑ', + PrintConv => { + 'Magnetic North' => 'Ðа магнитный Ñеверный полюÑ', + 'True North' => 'Ðа географичеÑкий Ñеверный полюÑ', + }, + }, + 'GPSVersionID' => 'GPS – ВерÑÐ¸Ñ Ñ‚ÐµÐ³Ð¾Ð²', + 'GainControl' => { + Description => 'Управление уÑилением', + PrintConv => { + 'High gain down' => 'С большим шагом вниз', + 'High gain up' => 'С большим шагом вверх', + 'Low gain down' => 'С малым шагом вниз', + 'Low gain up' => 'С малым шагом вверх', + 'None' => 'ОтÑутÑтвует', + }, + }, + 'Gamma' => 'Гамма', + 'GammaBlue' => 'Гамма Синего', + 'GammaCompensatedValue' => 'Значение гамма-компенÑации', + 'GammaGreen' => 'Гамма Зелёного', + 'GammaRed' => 'Гамма КраÑного', + 'Gapless' => { + Description => 'Без зазора', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'Gender' => 'Пол', + 'Generator' => 'Сгенерирован в', + 'GeneratorVersion' => 'ВерÑÐ¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ', + 'Genr' => 'Жанр', + 'Genre' => 'Жанр', + 'GeoTiffAsciiParams' => 'Geo Tiff – Параметры Ascii', + 'GeoTiffDirectory' => 'Geo Tiff – Каталог', + 'GeoTiffDoubleParams' => 'Geo Tiff – Параметры дублированиÑ', + 'Geolocation' => 'ГеолокациÑ', + 'GeologicalContext' => 'ГеологичеÑкий контекÑÑ‚', + 'GeologicalContextBed' => 'Ðазвание литоÑтратиграфичеÑкого ÑлоÑ', + 'GeologicalContextFormation' => 'Ðазвание литоÑтратиграфичеÑкой Ñвиты', + 'GeologicalContextGroup' => 'Ðазвание литоÑтратиграфичеÑкой Ñерии', + 'GeologicalContextID' => 'ID геологичеÑкого контекÑта', + 'GeologicalContextMember' => 'Ðазвание литоÑтратиграфичеÑкой пачки', + 'Geosync' => 'Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ меÑтоположениÑ', + 'Geotag' => 'Журнал пройденного маршрута', + 'Geotime' => 'Дата/Ð’Ñ€ÐµÐ¼Ñ Ð¼ÐµÑтоположениÑ', + 'GimbalPitchDegree' => 'Тангаж шарнира (наклон)', + 'GimbalReverse' => 'Оборот шарнира', + 'GimbalRollDegree' => 'Крен шарнира (вращение)', + 'GimbalYawDegree' => 'РыÑкание шарнира (поворот)', + 'GlobalAltitude' => 'Ð“Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота', + 'GlobalAngle' => 'Глобальный угол', + 'GoogleBot' => 'ПоиÑковый робот Google', + 'GooglePlusUploadCode' => 'Код загрузки Google Plus', + 'Gradation' => 'ВпечатлÑющ.режим', + 'GrayPoint' => 'Точка Ñерого', + 'GrayResponseCurve' => 'ОптичеÑÐºÐ°Ñ Ð¿Ð»Ð¾Ñ‚Ð½Ð¾ÑÑ‚ÑŒ Ñерого', + 'GrayResponseUnit' => 'Единицы плотноÑти Ñерого', + 'GreenEndpoint' => 'ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Зелёного', + 'GreenMask' => 'МаÑка Зелёного', + 'GreenPrimary' => 'ОÑновной зелёный', + 'GreenX' => 'Зелёный по X', + 'GreenY' => 'Зелёный по Y', + 'GridGuidesInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Ñетке и направлÑющих', + 'Gyroscope' => 'ГироÑкоп', + 'HCUsage' => 'Тип информации HC-файла', + 'HDContent' => { + Description => 'Контент HD', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'HDR' => { + Description => 'ÐвтоматичеÑкий HDR', + PrintConv => { + 'Off' => 'Ðе включён', + }, + }, + 'HDRImageType' => { + Description => 'Тип HDR изображениÑ', + PrintConv => { + 'HDR Image' => 'HDR изображение', + 'Original Image' => 'Оригинальное изображение', + }, + }, + 'HDRSetting' => 'Праметры HDR', + 'HDRToningInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ HDR-тонировании', + 'HTTPHostHeader' => 'Заголовок HTTP-хоÑта', + 'HalftoneHints' => 'Ð£ÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‚Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ', + 'HardLink' => 'ЖёÑÑ‚ÐºÐ°Ñ ÑÑылка', + 'HasAudio' => 'Имеет аудио', + 'HasColorMap' => { + Description => 'Имеет цветовую карту', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'HasCuePoints' => 'Имеет ключевые точки', + 'HasKeyFrames' => 'Имеет ключевые кадры', + 'HasMetadata' => 'Имеет метаданные', + 'HasRealMergedData' => { + Description => 'Имеет Ñовмещённые данные', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'HasVideo' => 'Имеет видео', + 'HasXFA' => { + Description => 'XFA', + PrintConv => { + 'No' => 'ОтÑутÑтвует', + 'Yes' => 'ЕÑÑ‚ÑŒ', + }, + }, + 'HeaderSize' => 'Размер заголовка', + 'HeaderVersion' => 'ВерÑÐ¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð²', + 'Headline' => 'Заголовок', + 'HeightResolution' => 'Разрешение по выÑоте (PPI)', + 'HierarchicalKeywords' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов', + 'HierarchicalKeywords1' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 1', + 'HierarchicalKeywords1Applied' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 1 – Применена', + 'HierarchicalKeywords1Children' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 1 – ДочернÑÑ', + 'HierarchicalKeywords2' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 2', + 'HierarchicalKeywords2Applied' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 2 – Применена', + 'HierarchicalKeywords2Children' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 2 – ДочернÑÑ', + 'HierarchicalKeywords3' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 3', + 'HierarchicalKeywords3Applied' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 3 – Применена', + 'HierarchicalKeywords3Children' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 3 – ДочернÑÑ', + 'HierarchicalKeywords4' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 4', + 'HierarchicalKeywords4Applied' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 4 – Применена', + 'HierarchicalKeywords4Children' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 4 – ДочернÑÑ', + 'HierarchicalKeywords5' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 5', + 'HierarchicalKeywords5Applied' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 5 – Применена', + 'HierarchicalKeywords5Children' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 5 – ДочернÑÑ', + 'HierarchicalKeywords6' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 6', + 'HierarchicalKeywords6Applied' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов 6 – Применена', + 'HierarchicalSubject' => 'Ð˜ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ Ñ‚ÐµÐ¼', + 'HighISOMultiplierBlue' => 'Множитель ISO – Синий', + 'HighISOMultiplierGreen' => 'Множитель ISO – Зелёный', + 'HighISOMultiplierRed' => 'Множитель ISO – КраÑный', + 'HighISONoiseReduction' => { + Description => 'Шумоподавление при выÑоком ISO', + PrintConv => { + 'Auto' => 'ÐвтоматичеÑкое', + 'High' => 'Сильное', + 'Low' => 'Слабое', + 'Normal' => 'Стандартное', + 'Off' => 'Ðе включено', + 'Standard' => 'Стандартное', + 'Strong' => 'Сильное', + }, + }, + 'HighestBiostratigraphicZone' => 'Ð’Ñ‹ÑÑˆÐ°Ñ Ð±Ð¸Ð¾ÑтратиграфичеÑÐºÐ°Ñ Ð·Ð¾Ð½Ð°', + 'HighlightColorDistortReduct' => { + Description => 'Уменьшение иÑкажений Ñветлых цветов', + PrintConv => { + 'Advanced' => 'РаÑширенный', + 'Standard' => 'Стандартный', + }, + }, + 'Highlights' => 'Света', + 'HighlightsAdj' => 'Регулировка Ñветов', + 'History' => 'ИÑториÑ', + 'HistoryBufferSize' => 'Размер буфера иÑтории', + 'HostComputer' => 'Компьютер/СиÑтема', + 'HotKey' => { + Description => 'ГорÑÑ‡Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ°', + PrintConv => { + '(none)' => 'ОтÑутÑтвует', + }, + }, + 'HowPublished' => 'Метод публикации', + 'Hue' => 'Оттенок', + 'HueAdj' => 'Регулировка оттенка', + 'HumanObservation' => 'Визуальное наблюдение', + 'HumanObservationDay' => 'День меÑÑца визуального наблюдениÑ', + 'HumanObservationEarliestDate' => 'Дата начала визуального наблюдениÑ', + 'HumanObservationEndDayOfYear' => 'День года Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð²Ð¸Ð·ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ наблюдениÑ', + 'HumanObservationEventDate' => 'Дата визуального наблюдениÑ', + 'HumanObservationEventID' => 'ID визуального наблюдениÑ', + 'HumanObservationEventRemarks' => 'Комментарии к визуальному наблюдению', + 'HumanObservationEventTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð²Ð¸Ð·ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ наблюдениÑ', + 'HumanObservationFieldNotes' => 'Полевые заметки о визуальном наблюдении', + 'HumanObservationFieldNumber' => 'Ðомер полевых заметок о визуальном наблюдении', + 'HumanObservationHabitat' => 'Ðреал визуального наблюдениÑ', + 'HumanObservationLatestDate' => 'Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð²Ð¸Ð·ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ наблюдениÑ', + 'HumanObservationMonth' => 'МеÑÑц визуального наблюдениÑ', + 'HumanObservationParentEventID' => 'ID оÑновного визуального наблюдениÑ', + 'HumanObservationSampleSizeUnit' => 'Визуальное наблюдение – Единицы размера', + 'HumanObservationSampleSizeValue' => 'Визуальное наблюдение – Размер образца', + 'HumanObservationSamplingEffort' => 'Визуальное наблюдение – Затраченные уÑилиÑ', + 'HumanObservationSamplingProtocol' => 'Визуальное наблюдение – Метод иÑÑледованиÑ', + 'HumanObservationStartDayOfYear' => 'День года начала визуального наблюдениÑ', + 'HumanObservationVerbatimEventDate' => 'Дата визуального Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ Ð´Ð¾Ñловно', + 'HumanObservationYear' => 'Год визуального наблюдениÑ', + 'Humidity' => 'ВлажноÑÑ‚ÑŒ', + 'HyperfocalDistance' => 'Гиперфокальное раÑÑтоÑние', + 'HyperlinkBase' => 'База гиперÑÑылок', + 'ICCProfileName' => 'Ðазвание ICC-профилÑ', + 'ICC_Profile' => 'ICC-профиль', + 'ICC_Untagged' => 'ICC без метки', + 'ID3Size' => 'Размер блока данных ID3', + 'IDCCreativeStyle' => { + Description => 'IDC – ТворчеÑкий Ñтиль', + PrintConv => { + 'A100 Standard' => 'Стандарт A100', + 'Autumn Leaves' => 'ОÑенние лиÑÑ‚ÑŒÑ', + 'B&W' => 'Чёрно-Белое', + 'Camera Setting' => 'ÐаÑтройка камеры', + 'Clear' => 'ЧиÑтый', + 'Deep' => 'Глубокий', + 'Landscape' => 'Пейзаж', + 'Light' => 'Светлый', + 'Neutral' => 'Ðейтральный', + 'Night View' => 'Ðочной вид', + 'Portrait' => 'Портрет', + 'Real' => 'Реальный', + 'Sepia' => 'СепиÑ', + 'Standard' => 'Стандарт', + 'Sunset' => 'Закат', + 'Vivid' => 'Яркий', + }, + }, + 'IDCPreviewImage' => 'IDC – файл предпроÑмотра', + 'IDCPreviewLength' => 'IDC – Строк в файле предпроÑмотра', + 'IDCPreviewStart' => 'IDC – Ðачало файла предпроÑмотра', + 'IDsBaseValue' => 'ОÑновные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð¾Ð²', + 'INGRReserved' => 'Intergraph – Резерв', + 'IPTCBitsPerSample' => 'IPTC – КоличеÑтво бит на компонент', + 'IPTCDigest' => 'Хеш IPTC', + 'IPTCImageHeight' => 'IPTC – Ð’Ñ‹Ñота изображениÑ', + 'IPTCImageRotation' => { + Description => 'IPTC – Вращение изображениÑ', + PrintConv => { + '0' => 'Ðе вращать', + '180' => 'Повернуть вправо на 180°', + '270' => 'Повернуть вправо на 270°', + '90' => 'Повернуть вправо на 90°', + }, + }, + 'IPTCImageWidth' => 'IPTC – Ширина изображениÑ', + 'IPTCPictureNumber' => 'IPTC – Ðомер изображениÑ', + 'IPTCPixelHeight' => 'IPTC – Ð’Ñ‹Ñота (в пикÑелÑÑ…)', + 'IPTCPixelWidth' => 'IPTC – Ширина (в пикÑелÑÑ…)', + 'ISOSetting' => { + Description => 'ISO2', + PrintConv => { + '200 (Zone Matching High)' => '200 (СоглаÑование зон. Ð’ выÑоком ключе)', + '80 (Zone Matching Low)' => '80 (СоглаÑование зон. Ð’ низком ключе)', + 'Auto' => 'ÐвтоматичеÑки', + }, + }, + 'ISOSpeed' => 'ЧувÑтвительноÑÑ‚ÑŒ ISO', + 'ISOSpeedLatitudeyyy' => 'ISO – ФотографичеÑÐºÐ°Ñ ÑˆÐ¸Ñ€Ð¾Ñ‚Ð° yyy', + 'ISOSpeedLatitudezzz' => 'ISO – ФотографичеÑÐºÐ°Ñ ÑˆÐ¸Ñ€Ð¾Ñ‚Ð° zzz', + 'ISOSpeeds' => 'ISO4', + 'ISRCNumber' => 'Ðомер ISRC', + 'IT8Header' => 'IT8-заголовок', + 'IconFileName' => 'Ðазвание файла значка', + 'IconIndex' => 'Ð˜Ð½Ð´ÐµÐºÑ Ð¸ÐºÐ¾Ð½ÐºÐ¸', + 'Identification' => 'Определение', + 'IdentificationID' => 'ID определениÑ', + 'IdentificationQualifier' => 'Уточнение к определению', + 'IdentificationReferences' => 'ИÑточники иÑпользованные Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ', + 'IdentificationRemarks' => 'Комментарии к определению', + 'IdentificationVerificationStatus' => 'Код Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ', + 'IdentifiedBy' => 'Люди определившие образец', + 'Identifier' => 'Идентификатор', + 'Illumination' => { + Description => 'ПодÑветка', + PrintConv => { + 'Off' => 'Ðе включена', + 'On' => 'Включена', + }, + }, + 'Image2Description' => 'Изображение 2 – ОпиÑание', + 'Image3Description' => 'Изображение 3 – ОпиÑание', + 'Image4Description' => 'Изображение 4 – ОпиÑание', + 'Image5Description' => 'Изображение 5 – ОпиÑание', + 'Image6Description' => 'Изображение 6 – ОпиÑание', + 'Image7Description' => 'Изображение 7 – ОпиÑание', + 'Image8Description' => 'Изображение 8 – ОпиÑание', + 'Image::ExifTool::AIFF::Comment' => 'Комментарии AIFF', + 'Image::ExifTool::AIFF::Common' => 'Общее AIFF', + 'Image::ExifTool::AIFF::FormatVers' => 'ВерÑÐ¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° AIFF', + 'Image::ExifTool::APE::NewHeader' => 'Ðовый заголовок APE', + 'Image::ExifTool::APE::OldHeader' => 'Старый заголовок APE', + 'Image::ExifTool::APP12::PictureInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ APP12', + 'Image::ExifTool::Apple::RunTime' => 'Apple – Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ', + 'Image::ExifTool::Audible::cvrx' => 'Обложка Audible', + 'Image::ExifTool::Audible::meta' => 'Метаданные Audible', + 'Image::ExifTool::BPG::Extensions' => 'РаÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ BPG', + 'Image::ExifTool::DjVu::Form' => 'Форма DjVu', + 'Image::ExifTool::DjVu::Info' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ DjVu', + 'Image::ExifTool::DjVu::Meta' => 'DjVu метаданные', + 'Image::ExifTool::FLAC::Picture' => 'Изображение FLAC', + 'Image::ExifTool::FLAC::StreamInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ потоке FLAC', + 'Image::ExifTool::Flash::Audio' => 'Flash аудио', + 'Image::ExifTool::Flash::Meta' => 'Flash метаданные', + 'Image::ExifTool::Flash::Video' => 'Flash видео', + 'Image::ExifTool::Font::Main' => 'Шрифт', + 'Image::ExifTool::Font::Name' => 'Ðазвание шрифта', + 'Image::ExifTool::Font::PFM' => 'Шрифт PFM', + 'Image::ExifTool::Font::PSInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ PostScript шрифте', + 'Image::ExifTool::FotoStation::SoftEdit' => 'FotoStation – Редактор', + 'Image::ExifTool::GE::Main' => 'General Imaging (GE)', + 'Image::ExifTool::GIF::Animation' => 'GIF анимациÑ', + 'Image::ExifTool::GIF::Extensions' => 'GIF РаÑширениÑ', + 'Image::ExifTool::GIF::MIDIControl' => 'GIF MIDIControl', + 'Image::ExifTool::GIF::Main' => 'GIF', + 'Image::ExifTool::GIF::Screen' => 'GIF Screen', + 'Image::ExifTool::GIMP::Header' => 'Заголовок GIMP', + 'Image::ExifTool::GIMP::Parasite' => 'GIMP – Паразитный Ñлемент', + 'Image::ExifTool::GIMP::Resolution' => 'GIMP – Разешение', + 'Image::ExifTool::HP::Type2' => 'HP – Тип 2', + 'Image::ExifTool::HP::Type4' => 'HP – Тип 4', + 'Image::ExifTool::HP::Type6' => 'HP – Тип 6', + 'Image::ExifTool::IPTC::ObjectData' => 'IPTC – Данные объекта', + 'Image::ExifTool::IPTC::PostObjectData' => 'IPTC – Данные Post объекта', + 'Image::ExifTool::IPTC::PreObjectData' => 'IPTC – Данные Pre объекта', + 'Image::ExifTool::ITC::Header' => 'Заголовок ITC', + 'Image::ExifTool::ITC::Item' => 'Элемент ITC', + 'Image::ExifTool::JFIF::Extension' => 'JFIF Дополнение', + 'Image::ExifTool::JVC::Text' => 'JVC – ТекÑÑ‚', + 'Image::ExifTool::Jpeg2000::ColorSpec' => 'Jpeg2000 – Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð°', + 'Image::ExifTool::Jpeg2000::DisplayResolution' => 'Jpeg2000 – Разрешение Ñкрана', + 'Image::ExifTool::Jpeg2000::FileType' => 'Jpeg2000 – Тип файла', + 'Image::ExifTool::Jpeg2000::ImageHeader' => 'Jpeg2000 – Заголовок изображениÑ', + 'Image::ExifTool::MPEG::Audio' => 'MPEG аудио', + 'Image::ExifTool::MPEG::Video' => 'MPEG видео', + 'Image::ExifTool::Microsoft::MP' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Microsoft Photo', + 'Image::ExifTool::PDF::Encrypt' => 'PDF зашифрован', + 'Image::ExifTool::PDF::Info' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ PDF-файле', + 'Image::ExifTool::PDF::Pages' => 'Страниц в PDF', + 'Image::ExifTool::PDF::Root' => 'ОÑновные параметры PDF', + 'Image::ExifTool::PDF::Signature' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ PDF', + 'Image::ExifTool::PDF::TransformParams' => 'Параметры Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ PDF-файла', + 'Image::ExifTool::PNG::ImageHeader' => 'Заголовки PNG-изображениÑ', + 'Image::ExifTool::PNG::PrimaryChromaticities' => 'ОÑновные цвета PNG', + 'Image::ExifTool::PNG::StereoImage' => 'Стереоизображние PNG', + 'Image::ExifTool::PSP::Creator' => 'Создатель PSP', + 'Image::ExifTool::PSP::Image' => 'Изображение PSP', + 'Image::ExifTool::PhaseOne::SensorCalibration' => 'PhaseOne – ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ ÑенÑора', + 'Image::ExifTool::PhotoMechanic::SoftEdit' => 'PhotoMechanic', + 'Image::ExifTool::Photoshop::Header' => 'Заголовок Photoshop', + 'Image::ExifTool::Photoshop::JPEG_Quality' => 'КачеÑтво JPEG в Photoshop', + 'Image::ExifTool::Photoshop::Layers' => 'Слои Photoshop', + 'Image::ExifTool::Photoshop::PrintScaleInfo' => 'Photoshop – МаÑштабирование при печати', + 'Image::ExifTool::Photoshop::Resolution' => 'Photoshop – Разрешение', + 'Image::ExifTool::PrintIM::Main' => 'Print Image Matching (PrintIM)', + 'Image::ExifTool::RTF::Main' => 'RTF', + 'Image::ExifTool::Rawzor::Main' => 'Rawzor', + 'Image::ExifTool::Real::Metadata' => 'Метаданные Real', + 'Image::ExifTool::Real::Metafile' => 'Метафайл Real', + 'Image::ExifTool::Real::Properties' => 'СвойÑтва Real', + 'Image::ExifTool::Sanyo::Thumbnail' => 'Миниатюра Sanyo', + 'Image::ExifTool::Stim::CropX' => 'Stim – Обрезка по X', + 'Image::ExifTool::Stim::CropY' => 'Stim – Обрезка по Y', + 'Image::ExifTool::Theora::Identification' => 'Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Theora', + 'Image::ExifTool::Torrent::Files' => 'Торрент-файлы', + 'Image::ExifTool::Torrent::Info' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ торренте', + 'Image::ExifTool::Torrent::Main' => 'Торрент', + 'Image::ExifTool::Torrent::Profiles' => 'Торрент профили', + 'Image::ExifTool::Vorbis::Comments' => 'Комментарии Vorbis', + 'Image::ExifTool::Vorbis::Identification' => 'Идентификатор Vorbis', + 'Image::ExifTool::ZIP::GZIP' => 'ZIP GZIP', + 'Image::ExifTool::ZIP::Main' => 'ZIP', + 'Image::ExifTool::ZIP::RAR' => 'ZIP RAR', + 'ImageAlterationConstraints' => { + Description => 'Ограничение на редактирование', + PrintConv => { + 'No Colorization' => 'Ðе раÑкрашивать', + 'No Cropping' => 'Ðе кадрировать', + 'No De-Colorization' => 'Ðе обеÑцвечивать', + 'No Flipping' => 'Ðе отражать', + 'No Merging' => 'Ðе объединÑÑ‚ÑŒ', + 'No Retouching' => 'Ðе ретушировать', + }, + }, + 'ImageArrangement' => { + Description => 'РаÑположение Ñтереоизображений', + PrintConv => { + 'Cross View Alignment' => 'ПереÑечное раÑположение', + 'Parallel View Alignment' => 'Параллельное раÑположение', + }, + }, + 'ImageByteCount' => 'Размер Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (байт)', + 'ImageColorIndicator' => { + Description => 'Цвет переднего плана или прозрачноÑти', + PrintConv => { + 'Specified Image Color' => 'Указан', + 'Unspecified Image Color' => 'Ðе указан', + }, + }, + 'ImageColorValue' => 'Значение цвета переднего плана или прозрачноÑти', + 'ImageCreator' => 'Создатель изображеениÑ', + 'ImageCreatorID' => 'PLUS-ID ÑÐ¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ', + 'ImageCreatorImageID' => 'ID Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñвоенный Ñоздателем', + 'ImageCreatorName' => 'Ð˜Ð¼Ñ ÑÐ¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ', + 'ImageData' => 'Данные изображениÑ', + 'ImageDataDiscard' => { + Description => 'Отброшенные данные изображениÑ', + PrintConv => { + 'Flexbits Discarded' => 'Гибкие биты отброшены', + 'Full Resolution' => 'Полное разрешение', + 'HighPass Frequency Data Discarded' => 'Данные выÑоких чаÑтот отброшены', + 'Highpass and LowPass Frequency Data Discarded' => 'Данные выÑоких и низких чаÑтот отброшены', + }, + }, + 'ImageDepth' => 'Глубина изображениÑ', + 'ImageDescription' => 'ОпиÑание изображениÑ', + 'ImageDuplicationConstraints' => { + Description => 'Ограничение на дублирование', + PrintConv => { + 'Duplication Only as Necessary Under License' => 'Дублировать только при необходимоÑти в ÑоответÑтвии Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸ÐµÐ¹', + 'No Duplication' => 'Дублирование запрещено', + 'No Duplication Constraints' => 'ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° дублирование отÑутÑтвуют', + }, + }, + 'ImageElements' => 'Элементы изображениÑ', + 'ImageFileConstraints' => { + Description => 'ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° файл', + PrintConv => { + 'Maintain File Name' => 'ЗапрещаетÑÑ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ðµ файла', + 'Maintain File Type' => 'ЗапрещаетÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ тип файла', + 'Maintain ID in File Name' => 'ЗапрещаетÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ ID в имени файла', + 'Maintain Metadata' => 'ЗапрещаетÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ метаданных', + }, + }, + 'ImageFileFormatAsDelivered' => { + Description => 'ИÑходный формат файла', + PrintConv => { + 'Other' => 'Другой формат', + }, + }, + 'ImageFileName' => 'Ðазвание файла изображениÑ', + 'ImageFileSizeAsDelivered' => { + Description => 'ИÑходный размер файла', + PrintConv => { + 'Greater than 50 MB' => 'Более 50 МБ', + 'Up to 1 MB' => 'До 1 МБ', + 'Up to 10 MB' => 'До 10 МБ', + 'Up to 30 MB' => 'До 30 МБ', + 'Up to 50 MB' => 'До 50 МБ', + }, + }, + 'ImageFullHeight' => 'ÐŸÐ¾Ð»Ð½Ð°Ñ Ð²Ñ‹Ñота изображениÑ', + 'ImageFullWidth' => 'ÐŸÐ¾Ð»Ð½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° изображениÑ', + 'ImageHeight' => 'Ð’Ñ‹Ñота изображениÑ', + 'ImageHistory' => 'ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ', + 'ImageID' => 'ID изображениÑ', + 'ImageLayer' => 'Слой изображениÑ', + 'ImageLength' => 'Строк в изображении', + 'ImageLimitExposureBias' => 'Лимит поправки ÑкÑпозиции', + 'ImageMimeType' => 'MIME-тип изображениÑ', + 'ImageModulationExposureBias' => 'МодулÑÑ†Ð¸Ñ Ð¿Ð¾Ð¿Ñ€Ð°Ð²ÐºÐ¸ ÑкÑпозиции', + 'ImageNumber' => 'Ðомер изображениÑ', + 'ImageOffset' => 'Смещение изображениÑ', + 'ImageOrientation' => { + Description => 'ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ', + PrintConv => { + 'Landscape' => 'ÐльбомнаÑ', + 'Portrait' => 'ПортретнаÑ', + 'Square' => 'КвадратнаÑ', + }, + }, + 'ImageRank' => 'Рейтинг изображениÑ', + 'ImageReadyDataSets' => 'Ðаборы данных', + 'ImageReadyVariables' => 'Переменные', + 'ImageReferencePoints' => 'Опорные точки изображениÑ', + 'ImageResolution' => 'Разрешение изображениÑ', + 'ImageRotation' => { + Description => 'Поворот/Ð ÐµÐ²ÐµÑ€Ñ Ñ‚Ð¾Ñ‡ÐµÐº проÑмотра изображениÑ', + PrintConv => { + 'None' => 'Ðет', + }, + }, + 'ImageSensorGain' => 'КоÑффициент уÑÐ¸Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚Ñ‡Ð¸ÐºÐ° изображениÑ', + 'ImageSize' => 'Размер изображениÑ', + 'ImageSourceData' => 'ИÑходные данные изображениÑ', + 'ImageStabilization' => { + PrintConv => { + 'CCD Shift' => 'ОптичеÑкий Ñтабилизатор', + 'High Sensitivity' => 'Движение объекта Ñъёмки', + 'Off' => 'Выкл', + 'Off (1)' => 'Выкл (1)', + }, + }, + 'ImageSupplier' => 'ПоÑтавщик изображениÑ', + 'ImageSupplierID' => 'PLUS-ID поÑтавщика изображениÑ', + 'ImageSupplierImageID' => 'ID Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñвоенный поÑтавщиком', + 'ImageSupplierName' => 'Ð˜Ð¼Ñ Ð¿Ð¾Ñтавщика изображениÑ', + 'ImageToolbar' => 'Панель команд Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ', + 'ImageType' => { + Description => 'Тип изображениÑ', + PrintConv => { + 'Grayscale (interlaced)' => 'Ð“Ñ€Ð°Ð´Ð°Ñ†Ð¸Ñ Ñерого (череÑÑтрочнаÑ)', + 'Grayscale (non-interlaced)' => 'Ð“Ñ€Ð°Ð´Ð°Ñ†Ð¸Ñ Ñерого (без чередованиÑ)', + 'Grayscale Animation (interlaced)' => 'ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð² градациÑÑ… Ñерого (череÑÑтрочнаÑ)', + 'Grayscale Animation (non-interlaced)' => 'ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð² градациÑÑ… Ñерого (без чередованиÑ)', + 'Illustrated Image' => 'ГрафичеÑкое изображение', + 'Multimedia or Composited Image' => 'Мультимедийное или композитное изображение', + 'Other' => 'Другой тип', + 'Page' => 'Страница', + 'Photographic Image' => 'ФотографиÑ', + 'Preview' => 'ПредпроÑмотр', + 'RGB (interlaced)' => 'RGB (череÑÑтрочнаÑ)', + 'RGB (non-interlaced)' => 'RGB (без чередованиÑ)', + 'RGB Animation (interlaced)' => 'ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ RGB (череÑÑтрочнаÑ)', + 'RGB Animation (non-interlaced)' => 'ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ RGB (без чередованиÑ)', + 'RGBA (interlaced)' => 'RGBA (череÑÑтрочнаÑ)', + 'RGBA (non-interlaced)' => 'RGBA (без чередованиÑ)', + 'RGBA Animation (interlaced)' => 'ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ RGBA (череÑÑтрочнаÑ)', + 'RGBA Animation (non-interlaced)' => 'ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ RGBA (без чередованиÑ)', + 'Video' => 'Видео', + }, + }, + 'ImageUIDList' => 'СпиÑок уникальных ID изображений', + 'ImageUniqueID' => 'Уникальный ID изображениÑ', + 'ImageWidth' => 'Ширина изображениÑ', + 'Importance' => { + Description => 'ВажноÑÑ‚ÑŒ', + PrintConv => { + 'High' => 'Ð’Ñ‹ÑокаÑ', + 'Low' => 'ÐизкаÑ', + 'Normal' => 'ОбычнаÑ', + }, + }, + 'Imprint' => 'ИздательÑтво', + 'InclinationAngle' => 'Угол наклона', + 'InclinationCorrection' => { + Description => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð½Ð°ÐºÐ»Ð¾Ð½Ð°', + PrintConv => { + 'Off' => 'Ðе включена', + 'On' => 'Включена', + }, + }, + 'IncludedFileID' => 'ID вÑтроенного файла', + 'Index' => 'ИндекÑ', + 'IndexOffset' => 'Ð˜Ð½Ð´ÐµÐºÑ ÑмещениÑ', + 'Indexable' => { + Description => 'ИндекÑированный', + PrintConv => { + 'False' => 'Ðет', + 'True' => 'Да', + }, + }, + 'Indexed' => { + Description => 'ИндекÑированный', + PrintConv => { + 'Indexed' => 'Да', + 'Not indexed' => 'Ðет', + }, + }, + 'IndexedColorTableCount' => 'КоличеÑтво индекÑированных цветов', + 'InfraredIlluminator' => { + Description => 'ИнфракраÑÐ½Ð°Ñ Ð¿Ð¾Ð´Ñветка', + PrintConv => { + 'Off' => 'Ðе включена', + 'On' => 'Включена', + }, + }, + 'InitialCameraDolly' => 'ИÑходное положение вдоль линии взглÑда', + 'InitialDisplayEffect' => { + Description => 'Ðачальный Ñффект отображениÑ', + PrintConv => { + 'Off' => 'Ðе включён', + 'On' => 'Включен', + }, + }, + 'InitialHorizontalFOVDegrees' => 'ИÑходное горизонтальное поле Ð·Ñ€ÐµÐ½Ð¸Ñ (°)', + 'InitialViewHeadingDegrees' => 'КурÑовой угол Ð´Ð»Ñ Ð¸Ñходного предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (°)', + 'InitialViewPitchDegrees' => 'Угол продольного наклона Ð´Ð»Ñ Ð¸Ñходного предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (°)', + 'InitialViewRollDegrees' => 'Угол поперечного наклона Ð´Ð»Ñ Ð¸Ñходного предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (°)', + 'InkNames' => 'ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ‡ÐµÑ€Ð½Ð¸Ð»', + 'InkSet' => { + Description => 'Ðабор чернил', + PrintConv => { + 'Not CMYK' => 'Ðе CMYK', + }, + }, + 'InputDeviceName' => 'Ðазвание уÑтройÑтва ввода', + 'InputDeviceSerialNumber' => 'Серийный номер уÑтройÑтва ввода', + 'InsertMode' => 'Режим вÑтавки', + 'InstanceType' => { + Description => 'Тип ÑобытиÑ', + PrintConv => { + 'Exception to Recurring Appointment' => 'ИÑключение Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÑющегоÑÑ ÑобытиÑ', + 'Non-recurring Appointment' => 'ÐеповторÑющиеÑÑ Ñобытие', + 'Recurring Appointment' => 'ПовторÑющиеÑÑ Ñобытие', + 'Single Instance of Recurring Appointment' => 'Событие Ñ ÐµÐ´Ð¸Ð½Ð¾ÐºÑ€Ð°Ñ‚Ð½Ñ‹Ð¼ повторением', + }, + }, + 'Institution' => 'ИнÑтитут', + 'InstructionSet' => 'Ðабор инÑтрукций', + 'Instructions' => 'ИнÑтрукции', + 'Instrument' => 'ИнÑтрумент', + 'IntendedBusyStatus' => 'Предполагаемый ÑÑ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ð½ÑтоÑти', + 'IntensityStereo' => 'ИнтенÑивное Ñтерео', + 'InterchangeColorSpace' => { + Description => 'Смена цветового проÑтранÑтва', + PrintConv => { + 'CMY (K) Device Dependent' => 'Ðппаратно-завиÑимый CMY (K)', + 'RGB Device Dependent' => 'Ðппаратно-завиÑимый RGB', + }, + }, + 'IntergraphFlagRegisters' => 'Intergraph – Флаг региÑтров', + 'IntergraphMatrix' => 'Intergraph – Матрица', + 'IntergraphPacketData' => 'Intergraph – Данные пакета', + 'Interlace' => { + Description => 'ЧереÑÑÑ‚Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚ÐºÐ°', + PrintConv => { + 'Adam7 Interlace' => 'ЧереÑÑÑ‚Ñ€Ð¾Ñ‡Ð½Ð°Ñ Adam7', + 'Noninterlaced' => 'ПрогреÑÑивнаÑ', + }, + }, + 'InternalIDNumber' => 'Внутренний ID-номер', + 'InternalLeading' => 'Внутренний зазор', + 'InternalVersionNumber' => 'ВнутреннÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð°', + 'InteropIndex' => { + Description => 'Ð˜Ð½Ð´ÐµÐºÑ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¾Ð¹ ÑовмеÑтимоÑти', + PrintConv => { + 'R03 - DCF option file (Adobe RGB)' => 'R03 – Дополнительный файл DCF (Adobe RGB)', + 'R98 - DCF basic file (sRGB)' => 'R98 – ОÑновной файл DCF (sRGB)', + 'THM - DCF thumbnail file' => 'THM – Файл Ñ Ð¼Ð¸Ð½Ð¸Ð°Ñ‚ÑŽÑ€Ð°Ð¼Ð¸ DCF', + }, + }, + 'InteropOffset' => 'Тег взаимной ÑовмеÑтимоÑти', + 'InteropVersion' => 'ВерÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¾Ð¹ ÑовмеÑтимоÑти', + 'IsBaseFont' => 'Базовый шрифт', + 'IsFixedPitch' => 'Моноширинный шрифт', + 'IsMergedHDR' => 'Объединённый HDR', + 'IsMergedPanorama' => 'ÐžÐ±ÑŠÐµÐ´Ð¸Ð½Ñ‘Ð½Ð½Ð°Ñ Ð¿Ð°Ð½Ð¾Ñ€Ð°Ð¼Ð°', + 'Italic' => 'КурÑив', + 'ItalicAngle' => 'Угол наклона шрифта', + 'ItemSubType' => 'Подтип Ñлемента', + 'Iterations' => 'Повторов', + 'JBIGOptions' => 'Параметры JBIG', + 'JFIFVersion' => 'ВерÑÐ¸Ñ JFIF', + 'JP2Signature' => 'JP2 ПодпиÑÑŒ', + 'JPEGACTables' => 'Таблицы JPEGAC', + 'JPEGDCTables' => 'Таблицы JPEGDC', + 'JPEGDigest' => 'JPEG – Хеш-Ñумма', + 'JPEGImageLength' => 'JPEG – Строк в изображении', + 'JPEGLosslessPredictors' => 'Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¸ÐºÑ‚Ð¾Ñ€Ð° JPEG без потерь', + 'JPEGPointTransforms' => 'Преобразование точек JPEG', + 'JPEGProc' => { + Description => 'JPEG-Ñжатие в Ñтаром Ñтиле', + PrintConv => { + 'Baseline' => 'Базовое поÑледовательное', + 'Lossless' => 'Без потерь Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ Хаффмана', + }, + }, + 'JPEGQTables' => 'Таблицы JPEGQ', + 'JPEGQuality' => { + Description => 'КачеÑтво изображениÑ', + PrintConv => { + 'Extra Fine' => 'СверхвыÑокое', + 'Fine' => 'Ð’Ñ‹Ñокое', + 'Standard' => 'Стандартное качеÑтво', + }, + }, + 'JPEGQualityEstimate' => 'JPEG – Оценка качеÑтва', + 'JPEGRestartInterval' => 'Интервал перезапуÑка JPEG', + 'JPEGTables' => 'JPEG-таблицы', + 'JSONMetadata' => 'Метаданные JSON', + 'JobID' => 'ID заданиÑ', + 'JobTitle' => 'ДолжноÑÑ‚ÑŒ', + 'Journal' => 'Журнал', + 'JpgFromRaw' => 'Jpg-файл, вÑтроенный в Raw-файл', + 'JpgFromRawLength' => 'Строк в JPG-файле, вÑтроенного в RAW-файл', + 'JpgFromRawStart' => 'Смещение JPG-файла, вÑтроенного в RAW-файл', + 'JumpToXPEP' => 'Переход к XPEP', + 'KBAT_Unknown10' => 'KBAT – ÐеизвеÑтный 10', + 'KBAT_Unknown11' => 'KBAT – ÐеизвеÑтный 11', + 'KBAT_Unknown12' => 'KBAT – ÐеизвеÑтный 12', + 'KBAT_Unknown13' => 'KBAT – ÐеизвеÑтный 13', + 'KBAT_Unknown2' => 'KBAT – ÐеизвеÑтный 2', + 'KBAT_Unknown9' => 'KBAT – ÐеизвеÑтный 9', + 'KByteSize' => 'Общий размер в килобайтах', + 'KF8CoverURI' => 'KF8 – URI обложки', + 'Key' => 'Код', + 'KeyCode' => 'Код ключа', + 'KeyFramePositions' => 'Положение ключевых кадров', + 'KeyFramesTimes' => 'Ð’Ñ€ÐµÐ¼Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… кадров', + 'KeywordInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ ключевых Ñловах', + 'Keywords' => 'Ключевые Ñлова', + 'Label' => 'Метка', + 'LameBitrate' => 'Lame – Битрейт', + 'LameLowPassFilter' => 'Lame – Фильтр нижних чаÑтот', + 'LameMethod' => { + Description => 'Lame – Метод кодированиÑ', + PrintConv => { + 'ABR' => 'ABR – Средний битрейт', + 'ABR (2-pass)' => 'ABR – Средний битрейт (2 прохода)', + 'CBR' => 'CBR – ПоÑтоÑнный битрейт', + 'CBR (2-pass)' => 'CBR – ПоÑтоÑнный битрейт (2 прохода)', + 'VBR' => 'VBR – переменный битрейт', + 'VBR (new/mtrh)' => 'VBR – переменный битрейт (новый/mtrh)', + 'VBR (old/rh)' => 'VBR – переменный битрейт (Ñтарый/rh)', + }, + }, + 'LameQuality' => 'Lame – КачеÑтво', + 'LameStereoMode' => { + Description => 'Lame – Режим Ñтерео', + PrintConv => { + 'Auto' => 'ÐвтоматичеÑкий', + 'Dual Channels' => 'Двуканальный режим', + 'Forced Joint Stereo' => 'Принудительное объединённое Ñтерео', + 'Intensity Stereo' => 'ИнтенÑивное Ñтерео', + 'Joint Stereo' => 'Объединённое Ñтерео', + 'Mono' => 'Моно', + 'Stereo' => 'Стерео', + }, + }, + 'LameVBRQuality' => 'Lame – КачеÑтво переменного битрейта', + 'Language' => 'Язык', + 'LanguageIdentifier' => 'Идентификатор Ñзыка', + 'LargestValidInteriorRectHeight' => 'МакÑимально Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð²Ñ‹Ñота прÑмоугольника', + 'LargestValidInteriorRectLeft' => 'ОтÑтуп Ñлева Ð´Ð»Ñ Ð¼Ð°ÐºÑимально возможного прÑмоугольника', + 'LargestValidInteriorRectTop' => 'ОтÑтуп Ñверху Ð´Ð»Ñ Ð¼Ð°ÐºÑимально возможного прÑмоугольника', + 'LargestValidInteriorRectWidth' => 'МакÑимально Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° прÑмоугольника', + 'LastAuthor' => 'ПоÑледнее редактирование Ñделал', + 'LastBackupDate' => 'Дата поÑледнего резервного копированиÑ', + 'LastChar' => 'ПоÑледний Ñимвол шрифта', + 'LastKeyFrameTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего ключевого кадра', + 'LastKeywordIPTC' => 'ПоÑледнее ключевое Ñлово IPTC', + 'LastKeywordXMP' => 'ПоÑледнее ключевое Ñлово XMP', + 'LastModifiedBy' => 'ПоÑледнее изменение Ñделал', + 'LastPhotoDate' => 'Дата ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñледнего изображениÑ', + 'LastPrinted' => 'Дата поÑледней печати', + 'LastTimeStamp' => 'ПоÑледнÑÑ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°ÌÑ Ð¼ÐµÑ‚ÐºÐ°', + 'LastUpdateTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего обновлениÑ', + 'LateralChromaticAberrationCorrectionAlreadyApplied' => 'Применена ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ñ…Ñ€Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой аберрации', + 'LatestAgeOrHighestStage' => 'ПоÑледний век/Ð’Ñ‹Ñший ÑруÑ', + 'LatestEonOrHighestEonothem' => 'ПоÑледний Ñон/Ð’Ñ‹ÑÑˆÐ°Ñ Ñонотема', + 'LatestEpochOrHighestSeries' => 'ПоÑледнÑÑ Ñпоха/Ð’Ñ‹Ñший отдел', + 'LatestEraOrHighestErathem' => 'ПоÑледнÑÑ Ñра/Ð’Ñ‹ÑÑˆÐ°Ñ Ñратема', + 'LatestPeriodOrHighestSystem' => 'ПоÑледний период/Ð’Ñ‹ÑÑˆÐ°Ñ ÑиÑтема', + 'Latitude' => 'Широта', + 'LayerBlendModes' => { + Description => 'Режим Ð½Ð°Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñлоёв', + PrintConv => { + 'Color' => 'ЦветноÑÑ‚ÑŒ', + 'Color Burn' => 'Затемнение оÑновы', + 'Color Dodge' => 'ОÑветление оÑновы', + 'Darken' => 'Затемнение', + 'Darker Color' => 'Темнее', + 'Difference' => 'Разница', + 'Dissolve' => 'Затухание', + 'Divide' => 'Разделить', + 'Exclusion' => 'ИÑключение', + 'Hard Light' => 'ЖёÑткий Ñвет', + 'Hard Mix' => 'ЖёÑткое Ñмешение', + 'Hue' => 'Цветовой тон', + 'Lighten' => 'Замена Ñветлым', + 'Lighter Color' => 'Светлее', + 'Linear Burn' => 'Линейный затемнитель', + 'Linear Dodge' => 'Линейный оÑветлитель', + 'Linear Light' => 'Линейный Ñвет', + 'Luminosity' => 'ЯркоÑÑ‚ÑŒ', + 'Multiply' => 'Умножение', + 'Normal' => 'Обычный', + 'Overlay' => 'Перекрытие', + 'Pass Through' => 'ПропуÑтить', + 'Pin Light' => 'Точечный Ñвет', + 'Saturation' => 'ÐаÑыщенноÑÑ‚ÑŒ', + 'Screen' => 'Экран', + 'Soft Light' => 'ÐœÑгкий Ñвет', + 'Subtract' => 'Вычитание', + 'Vivid Light' => 'Яркий Ñвет', + }, + }, + 'LayerComps' => 'Композиции Ñлоёв', + 'LayerCount' => 'КоличеÑтво Ñлоёв', + 'LayerGroupsEnabledID' => 'ID включенных групп Ñлоёв', + 'LayerIDs' => 'ID Ñлоёв', + 'LayerModifyDates' => 'Дата Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑлоÑ', + 'LayerNames' => 'ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ñлоёв', + 'LayerOpacities' => 'ÐепрозрачноÑÑ‚ÑŒ ÑлоÑ', + 'LayerRectangles' => 'ПрÑмоугольники ÑлоÑ', + 'LayerSelectionIDs' => 'Идентификаторы выборанного ÑлоÑ', + 'LayerUnicodeNames' => 'Юникодные Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñлоёв', + 'LayersGroupInfo' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ группе Ñлоёв', + 'Layout' => { + Description => 'Макет', + PrintConv => { + 'Scan Lines' => 'Линии ÑканированиÑ', + 'Tiles' => 'Тайлы', + }, + }, + 'LeftMargin' => 'ОтÑтуп Ñлева', + 'LegacyIPTCDigest' => 'Хеш-Ñумма прежней верÑии IPTC', + 'Length' => 'Общий размер в байтах', + 'Lens' => 'Объектив', + 'Lens35efl' => 'Объектив', + 'LensDistortInfo' => 'ДиÑторÑÐ¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¸Ð²Ð°', + 'LensID' => 'ID объектива', + 'LensInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± объективе', + 'LensMake' => 'Производитель объектива', + 'LensManufacturer' => 'Производитель объектива', + 'LensModel' => 'Модель объектива', + 'LensNumber' => 'Серийный номер объектива', + 'LensSerialNumber' => 'Серийный номер объектива', + 'LensShading' => 'Виньетирование объектива', + 'LensSpec' => 'Параметры объектива', + 'LensTemperature' => 'Температура объектива', + 'LibraryID' => 'ID библиотеки', + 'License' => 'ЛицензиÑ', + 'LicenseEndDate' => 'Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¸', + 'LicenseID' => 'PLUS-ID лицензии', + 'LicenseInfoURL' => 'URL лицензии', + 'LicenseStartDate' => 'Дата вÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¸ в Ñилу', + 'LicenseTransactionDate' => 'Дата лицензионной Ñделки', + 'Licensee' => 'Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñтавлена длÑ', + 'LicenseeID' => 'PLUS-ID лицензиата', + 'LicenseeImageID' => 'ID Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñвоенный лицензиатом', + 'LicenseeImageNotes' => 'ÐŸÑ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð°Ñ‚Ð°', + 'LicenseeName' => 'Ð˜Ð¼Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð°Ñ‚Ð°', + 'LicenseeProjectReference' => 'Ðазвание проека приÑвоенное лицензиатом', + 'LicenseeTransactionID' => 'ID транзакции приÑвоенное лицензиатом', + 'Licensor' => 'Лицензор', + 'LicensorCity' => 'Город Ð¿Ñ€Ð¾Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¾Ñ€Ð°', + 'LicensorCountry' => 'Страна Ð¿Ñ€Ð¾Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¾Ñ€Ð°', + 'LicensorEmail' => 'ÐÐ´Ñ€ÐµÑ Ñлектронной почты лицензора', + 'LicensorExtendedAddress' => 'Дополнительные адреÑа Ñлектронной почты лицензора', + 'LicensorID' => 'PLUS-ID лицензора', + 'LicensorImageID' => 'ID Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ðµ лицензором', + 'LicensorName' => 'Ð˜Ð¼Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¾Ñ€Ð°', + 'LicensorNotes' => 'Коментарии лицензора', + 'LicensorPostalCode' => 'Почтовый Ð¸Ð½Ð´ÐµÐºÑ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð°Ñ€Ð°', + 'LicensorRegion' => 'ОблаÑÑ‚ÑŒ Ð¿Ñ€Ð¾Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¾Ñ€Ð°', + 'LicensorStreetAddress' => 'Улица Ð¿Ñ€Ð¾Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¾Ñ€Ð°', + 'LicensorTelephone1' => 'Телефон 1 лицензора', + 'LicensorTelephone2' => 'Телефон 2 лицензора', + 'LicensorTelephoneType1' => { + Description => 'Тип телефона 1', + PrintConv => { + 'Cell' => 'Мобильный', + 'FAX' => 'ФÐКС', + 'Home' => 'Домашний', + 'Pager' => 'Пейджер', + 'Work' => 'Рабочий', + }, + }, + 'LicensorTelephoneType2' => { + Description => 'Тип телефона 2', + PrintConv => { + 'Cell' => 'Мобильный', + 'FAX' => 'ФÐКС', + 'Home' => 'Домашний', + 'Pager' => 'Пейджер', + 'Work' => 'Рабочий', + }, + }, + 'LicensorTransactionID' => 'ID транзакции приÑвоенный лицензором', + 'LicensorURL' => 'URL лицензора', + 'LightSource' => { + Description => 'Тип оÑвещениÑ', + PrintConv => { + 'Cloudy' => 'Облачно (6500 К)', + 'Cool White Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° – Холодный Ñвет (4150 К)', + 'Day White Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° – Дневной белый (5050 К)', + 'Daylight' => 'Дневной Ñвет (5500 К)', + 'Daylight Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° дневного Ñвета (6400 К)', + 'Fine Weather' => 'ЯÑÐ½Ð°Ñ Ð¿Ð¾Ð³Ð¾Ð´Ð° (5500 К)', + 'Flash' => 'Ð’Ñпышка (5500 К)', + 'Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° (4150 К)', + 'ISO Studio Tungsten' => 'ISO Ð´Ð»Ñ Ñтудийных ламп накаливаниÑ', + 'Other' => 'Другой иÑточник Ñвета', + 'Shade' => 'Тень (7500 К)', + 'Standard Light A' => 'Стандартный Ñвет A', + 'Standard Light B' => 'Стандартный Ñвет B', + 'Standard Light C' => 'Стандартный Ñвет C', + 'Tungsten (Incandescent)' => 'Лампа Ð½Ð°ÐºÐ°Ð»Ð¸Ð²Ð°Ð½Ð¸Ñ (2850 К)', + 'Unknown' => 'ÐеизвеÑтный', + 'Warm White Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° – Тёплый Ñвет (2925 К)', + 'White Fluorescent' => 'ФлуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð° – Белый Ñвет (3525 К)', + }, + }, + 'LightSourceSpecial' => { + Description => 'Специальный иÑточник Ñвета', + PrintConv => { + 'Off' => 'Ðе иÑпользовалÑÑ', + 'On' => 'ИÑпользовалÑÑ', + }, + }, + 'LightValue' => 'Световое чиÑло', + 'Lightness' => 'ОÑвещенноÑÑ‚ÑŒ', + 'LightroomWorkflow' => 'Рабочий процеÑÑ Lightroom', + 'LineOrder' => { + Description => 'ПорÑдок Ñтрок', + PrintConv => { + 'Decreasing Y' => 'По убыванию Y', + 'Increasing Y' => 'По возраÑтанию Y', + 'Random Y' => 'Случайный Y', + }, + }, + 'LinearResponseLimit' => 'Предел линейного отклика', + 'LinearityLimitBlue' => 'Предел линейноÑти – Синий', + 'LinearityLimitGreen' => 'Предел линейноÑти – Зелёный', + 'LinearityLimitRed' => 'Предел линейноÑти – КраÑный', + 'LinearizationCoefficients1' => 'КоÑффициенты линеаризации 1', + 'LinearizationCoefficients2' => 'КоÑффициенты линеаризации 2', + 'LinearizationTable' => 'Таблица линеаризации', + 'Linearized' => { + Description => 'ЛинеаризациÑ', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'Lines' => 'Строк', + 'LinkedProfileName' => 'Ðазвание ÑвÑзанного профилÑ', + 'LithostratigraphicTerms' => 'ЛитоÑтратиграфичеÑкие Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñ€Ð¾Ð´', + 'LivingSpecimen' => 'Живой образец', + 'LivingSpecimenMaterialSampleID' => 'Живой образец – ID образца материала', + 'LocalBasePath' => 'Локальный базовый путь', + 'LocalCaption' => 'ОпиÑание меÑта', + 'LocalDefaultAlarm' => 'Локальный Ñигнал по-умолчанию', + 'LocalPositionNED' => 'Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ NED', + 'LocalizedCameraModel' => 'Локализованное название модели камеры', + 'Location' => 'МеÑтоположение', + 'Logo' => 'Логотип', + 'LongExposureNoiseReduction' => { + Description => 'Шумоподавление при длительной выдержке', + PrintConv => { + 'Auto' => 'ÐвтоматичеÑкое', + 'Off' => 'Ðе включено', + 'On' => 'Включено', + }, + }, + 'Longitude' => 'Долгота', + 'LookModTransform' => 'Преобразование вида ACES-ACES', + 'LookupTable' => 'Таблица подÑтановки', + 'LowestBiostratigraphicZone' => 'ÐÐ¸Ð·ÑˆÐ°Ñ Ð±Ð¸Ð¾ÑтратиграфичеÑÐºÐ°Ñ Ð·Ð¾Ð½Ð°', + 'MD5Signature' => 'MD5', + 'MD5Sum' => 'Сумма MD5', + 'MDColorTable' => 'MD – Таблица цветов', + 'MDFileTag' => 'MD – Формат иÑходных данных', + 'MDFileUnits' => 'MD – Единицы данных файла', + 'MDItemAccountHandles' => 'MD Item – ДеÑкрипторы аккаунта', + 'MDItemAccountIdentifier' => 'MD Item – Идентификатор аккаунта', + 'MDItemAcquisitionMake' => 'MD Item – Производитель уÑтройÑтва', + 'MDItemAcquisitionModel' => 'MD Item – Модель уÑтройÑтва', + 'MDItemAltitude' => 'MD Item – Ð’Ñ‹Ñота', + 'MDItemAperture' => 'MD Item – Диафрагма', + 'MDItemAudioBitRate' => 'MD Item – Битрейт аудио', + 'MDItemAudioChannelCount' => 'MD Item – КоличеÑтво аудиоканалов', + 'MDItemAuthorEmailAddresses' => 'MD Item – ÐÐ´Ñ€ÐµÑ Ñлектронной почты автора', + 'MDItemAuthors' => 'MD Item – Ðвторы', + 'MDItemBitsPerSample' => 'MD Item – КоличеÑтво бит на образец', + 'MDItemBundleIdentifier' => 'MD Item – Идентификатор комплекта', + 'MDItemCity' => 'MD Item – Город', + 'MDItemCodecs' => 'MD Item – Кодеки', + 'MDItemColorSpace' => 'MD Item – Цветовое проÑтранÑтво', + 'MDItemComment' => 'MD Item – Комментарий', + 'MDItemContentCreationDate' => 'MD Item – Дата ÑозданиÑ', + 'MDItemContentCreationDateRanking' => 'MD Item – Дата ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ â€“ Рейтинг', + 'MDItemContentCreationDate_Ranking' => 'MD Item – Дата ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ â€“ Рейтинг', + 'MDItemContentModificationDate' => 'MD Item – Дата редактированиÑ', + 'MDItemContentType' => 'MD Item – Тип контента', + 'MDItemContentTypeTree' => 'MD Item – Тип контента – Древо', + 'MDItemContributors' => 'MD Item – ВнеÑшие вклад', + 'MDItemCopyright' => 'MD Item – ÐвторÑкое право', + 'MDItemCountry' => 'MD Item – Страна', + 'MDItemCreator' => 'MD Item – Создано в', + 'MDItemDateAdded' => 'MD Item – Дата добавлениÑ', + 'MDItemDateAdded_Ranking' => 'MD Item – Дата Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ â€“ Рейтинг', + 'MDItemDescription' => 'MD Item – ОпиÑание', + 'MDItemDisplayName' => 'MD Item – Локализованное название файла', + 'MDItemDownloadedDate' => 'MD Item – Дата загрузки', + 'MDItemDurationSeconds' => 'MD Item – ПродолжительноÑÑ‚ÑŒ в Ñекундах', + 'MDItemEXIFGPSVersion' => 'MD Item – EXIF – ВерÑÐ¸Ñ GPS', + 'MDItemEXIFVersion' => 'MD Item – ВерÑÐ¸Ñ EXIF', + 'MDItemEmailConversationID' => 'MD Item – ID перепиÑки по Ñлектронной почте', + 'MDItemEncodingApplications' => 'MD Item – Кодировано в приложении', + 'MDItemExposureMode' => 'MD Item – Режим ÑкÑпозиции', + 'MDItemExposureProgram' => 'MD Item – Программа ÑкÑпозиции', + 'MDItemExposureTimeSeconds' => 'MD Item – Выдержка', + 'MDItemFNumber' => 'MD Item – Диафрагменное чиÑло', + 'MDItemFSContentChangeDate' => 'MD Item – FS – Дата редактированиÑ', + 'MDItemFSCreationDate' => 'MD Item – FS – Дата ÑозданиÑ', + 'MDItemFSCreatorCode' => 'MD Item – FS – Код программы, Ñоздавшей файл', + 'MDItemFSFinderFlags' => 'MD Item – FS – Ðтрибуты файла', + 'MDItemFSHasCustomIcon' => 'MD Item – FS – Ðаличие иконки файла', + 'MDItemFSInvisible' => 'MD Item – FS – Скрытый', + 'MDItemFSIsExtensionHidden' => 'MD Item – FS – РаÑширение файла Ñкрыто', + 'MDItemFSIsStationery' => 'MD Item – FS – Шаблон', + 'MDItemFSLabel' => { + Description => 'MD Item – FS – Ð¦Ð²ÐµÑ‚Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° файла', + PrintConv => { + '0 (none)' => '0 (Без метки)', + '1 (Gray)' => '1 (СераÑ)', + '2 (Green)' => '2 (ЗелёнаÑ)', + '3 (Purple)' => '3 (ПурпурнаÑ)', + '4 (Blue)' => '4 (СинÑÑ)', + '5 (Yellow)' => '5 (ЖёлтаÑ)', + '6 (Red)' => '6 (КраÑнаÑ)', + '7 (Orange)' => '7 (ОранжеваÑ)', + }, + }, + 'MDItemFSName' => 'MD Item – FS – Ðазвание файла', + 'MDItemFSNodeCount' => 'MD Item – FS – КоличеÑтво файлов в каталоге', + 'MDItemFSOwnerGroupID' => 'MD Item – FS – ID группы владельца файла', + 'MDItemFSOwnerUserID' => 'MD Item – FS – ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð° файла', + 'MDItemFSSize' => 'MD Item – FS – Размер файла', + 'MDItemFSTypeCode' => 'MD Item – FS – Код типа файла', + 'MDItemFinderComment' => 'MD Item – Комментарий к файлу', + 'MDItemFlashOnOff' => 'MD Item – Срабатывание вÑпышки', + 'MDItemFocalLength' => 'MD Item – ФокуÑное раÑÑтоÑние', + 'MDItemGPSDateStamp' => 'MD Item – GPS – Дата и Ð²Ñ€ÐµÐ¼Ñ Ð¼ÐµÑтоположениÑ', + 'MDItemGPSStatus' => 'MD Item – GPS – СоÑтоÑние приемника во Ð²Ñ€ÐµÐ¼Ñ Ñъёмки', + 'MDItemGPSTrack' => 'MD Item – GPS – Трек маршрута', + 'MDItemHasAlphaChannel' => 'MD Item – Ðаличие Ðльфа-канала', + 'MDItemISOSpeed' => 'MD Item – ISO', + 'MDItemIdentifier' => 'MD Item – Идентификатор', + 'MDItemImageDirection' => 'MD Item – ÐÐ°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹ при Ñъёмке', + 'MDItemInterestingDateRanking' => 'MD Item – Дата интереÑных меÑÑ‚ – Рейтинг', + 'MDItemInterestingDate_Ranking' => 'MD Item – Дата интереÑных меÑÑ‚ – Рейтинг', + 'MDItemIsApplicationManaged' => 'MD Item – УправлÑетÑÑ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼', + 'MDItemIsExistingThread' => 'MD Item – Цепочка Ñообщений', + 'MDItemIsLikelyJunk' => 'MD Item – Спам', + 'MDItemKeywords' => 'MD Item – Ключевые Ñлова', + 'MDItemKind' => 'MD Item – Тип файла', + 'MDItemLastUsedDate' => 'MD Item – Дата поÑледнего иÑпользованиÑ', + 'MDItemLastUsedDate_Ranking' => 'MD Item – Дата поÑледнего иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ â€“ Рейтинг', + 'MDItemLatitude' => 'MD Item – Широта', + 'MDItemLensModel' => 'MD Item – Модель объектива', + 'MDItemLogicalSize' => 'MD Item – ЛогичеÑкий размер', + 'MDItemLongitude' => 'MD Item – Долгота', + 'MDItemMailDateReceived_Ranking' => 'MD Item – Дата Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‡Ñ‚Ñ‹ – Рейтинг', + 'MDItemMailboxes' => 'MD Item – Почтовые Ñщики', + 'MDItemMediaTypes' => 'MD Item – Типы медиафайлов', + 'MDItemNumberOfPages' => 'MD Item – КоличеÑтво Ñтраниц', + 'MDItemOrientation' => 'MD Item – ОриентациÑ', + 'MDItemOriginApplicationIdentifier' => 'MD Item – Идентификатор приложениÑ', + 'MDItemOriginMessageID' => 'MD Item – ID ÑообщениÑ', + 'MDItemOriginSenderDisplayName' => 'MD Item – Ð˜Ð¼Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ', + 'MDItemOriginSenderHandle' => 'MD Item – ДеÑкриптор отправителÑ', + 'MDItemOriginSubject' => 'MD Item – Тема ÑообщениÑ', + 'MDItemPageHeight' => 'MD Item – Ð’Ñ‹Ñота Ñтраницы', + 'MDItemPageWidth' => 'MD Item – Ширина Ñтраницы', + 'MDItemPhysicalSize' => 'MD Item – ФизичеÑкий размер', + 'MDItemPixelCount' => 'MD Item – КоличеÑтво пикÑелей', + 'MDItemPixelHeight' => 'MD Item – Ð’Ñ‹Ñота в пикÑелÑÑ…', + 'MDItemPixelWidth' => 'MD Item – Ширина в пикÑелÑÑ…', + 'MDItemPrimaryRecipientEmailAddresses' => 'MD Item – ÐÐ´Ñ€ÐµÑ Ñлектронной почты оÑновного получателÑ', + 'MDItemProfileName' => 'MD Item – Ðазвание цветового профилÑ', + 'MDItemRecipients' => 'MD Item – Получатели', + 'MDItemRedEyeOnOff' => 'MD Item – Уменьшение Ñффекта "краÑных глаз"', + 'MDItemResolutionHeightDPI' => 'MD Item – Разрешение по выÑоте в DPI', + 'MDItemResolutionWidthDPI' => 'MD Item – Разрешение по ширине в DPI', + 'MDItemSecurityMethod' => 'MD Item – Метод шифрованиÑ', + 'MDItemSpeed' => 'MD Item – СкороÑÑ‚ÑŒ передвижениÑ', + 'MDItemStateOrProvince' => 'MD Item – ОблаÑÑ‚ÑŒ/Район', + 'MDItemStreamable' => 'MD Item – Потоковый', + 'MDItemSubject' => 'MD Item – Тема', + 'MDItemTimestamp' => 'MD Item – ВременнаÌÑ Ð¼ÐµÑ‚ÐºÐ°', + 'MDItemTitle' => 'MD Item – Ðазвание файла', + 'MDItemTotalBitRate' => 'MD Item – Общий битрейт', + 'MDItemUseCount' => 'MD Item – Счётчик иÑпользованиÑ', + 'MDItemUsedDates' => 'MD Item – ИÑпользуемые даты', + 'MDItemUserDownloadedDate' => 'MD Item – Пользователь – Дата загрузки', + 'MDItemUserDownloadedUserHandle' => 'MD Item – Пользователь – ДеÑкриптор загрузки пользователÑ', + 'MDItemUserSharedReceivedDate' => 'MD Item – User Shared Received Date', + 'MDItemUserSharedReceivedRecipient' => 'MD Item – User Shared Received Recipient', + 'MDItemUserSharedReceivedRecipientHandle' => 'MD Item – User Shared Received Recipient Handle', + 'MDItemUserSharedReceivedSender' => 'MD Item – User Shared Received Sender', + 'MDItemUserSharedReceivedSenderHandle' => 'MD Item – User Shared Received Sender Handle', + 'MDItemUserSharedReceivedTransport' => 'MD Item – ÐžÐ±Ñ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ â€“ Received Transport', + 'MDItemUserTags' => 'MD Item – ПользовательÑкие теги', + 'MDItemVersion' => 'MD Item – ВерÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð°', + 'MDItemVideoBitRate' => 'MD Item – Битрейт видео', + 'MDItemWhereFroms' => 'MD Item – ИÑточник файла', + 'MDItemWhiteBalance' => 'MD Item – Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾', + 'MDLabName' => 'MD – Создатель файла', + 'MDPrepDate' => 'MD – Дата ÑозданиÑ', + 'MDPrepTime' => 'MD – Ð’Ñ€ÐµÐ¼Ñ ÑозданиÑ', + 'MDSampleInfo' => 'MD – ОпиÑание файла', + 'MDScalePixel' => 'MD – Коефициент маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¸ÐºÑелÑ', + 'MIDIControlVersion' => 'ВерÑÐ¸Ñ MIDI Control', + 'MIDISong' => 'MIDI композициÑ', + 'MIMEType' => 'MIME тип', + 'MOIVersion' => 'ВерÑÐ¸Ñ MOI', + 'MPEG7Binary' => 'Бинарный MPEG7', + 'MPEGAudioVersion' => 'ВерÑÐ¸Ñ MPEG аудио', + 'MPFVersion' => 'ВерÑÐ¸Ñ MPF', + 'MPImage' => 'Изображение MP', + 'MPImageFlags' => { + Description => 'MP изображение – Флаги', + PrintConv => { + 'Dependent child image' => 'ЗавиÑимое вложенное изображение', + 'Dependent parent image' => 'ЗавиÑимое родительÑкое изображение', + 'Representative image' => 'Репрезентативное изображение', + }, + }, + 'MPImageFormat' => 'MP изображение – Формат', + 'MPImageLength' => 'MP изображение – КоличеÑтво Ñтрок', + 'MPImageStart' => 'MP изображение – Ðачало', + 'MPImageType' => { + Description => 'MP изображение – Тип', + PrintConv => { + 'Baseline MP Primary Image' => 'Базовое первичное изображение MP', + 'Large Thumbnail (VGA equivalent)' => 'Большой ÑÑкиз (Ñквивалент VGA)', + 'Large Thumbnail (full HD equivalent)' => 'Большой ÑÑкиз (Ñквивалент Full HD)', + 'Multi-angle' => 'МногоракурÑное', + 'Multi-frame Disparity' => 'Многокадровое Ñмещённое (Disparity)', + 'Multi-frame Panorama' => 'ÐœÐ½Ð¾Ð³Ð¾ÐºÐ°Ð´Ñ€Ð¾Ð²Ð°Ñ Ð¿Ð°Ð½Ð¾Ñ€Ð°Ð¼Ð°', + 'Undefined' => 'Ðеопределённый', + }, + }, + 'MPIndividualNum' => 'Индивидуальный номер MP', + 'MSDocumentText' => 'MS – ТекÑтовый документ', + 'MSDocumentTextPosition' => 'MS – ТекÑтовый документ – ПозициÑ', + 'MSPropertySetStorage' => 'MS – Хранилище ÑвойÑтв', + 'MSStereo' => { + Description => 'MS Ñтерео', + PrintConv => { + 'Off' => 'Ðе включено', + 'On' => 'Включено', + }, + }, + 'MachineID' => 'ID машины', + 'MachineObservation' => 'Машинное наблюдение', + 'MachineObservationDay' => 'День меÑÑца машинного наблюдениÑ', + 'MachineObservationEarliestDate' => 'Дата начала машинного наблюдениÑ', + 'MachineObservationEndDayOfYear' => 'День года Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð½Ð¾Ð³Ð¾ наблюдениÑ', + 'MachineObservationEventDate' => 'Дата машинного наблюдениÑ', + 'MachineObservationEventID' => 'ID машинного наблюдениÑ', + 'MachineObservationEventRemarks' => 'Комментарии к машинному наблюдению', + 'MachineObservationEventTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð½Ð¾Ð³Ð¾ наблюдениÑ', + 'MachineObservationFieldNotes' => 'Полевые заметки о машинном наблюдении', + 'MachineObservationFieldNumber' => 'Ðомер полевых заметок о машинном наблюдении', + 'MachineObservationHabitat' => 'Ðреал машинного наблюдениÑ', + 'MachineObservationLatestDate' => 'Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð½Ð¾Ð³Ð¾ наблюдениÑ', + 'MachineObservationMonth' => 'МеÑÑц машинного наблюдениÑ', + 'MachineObservationParentEventID' => 'ID оÑновного машинного наблюдениÑ', + 'MachineObservationSampleSizeUnit' => 'Машинное наблюдение – Единицы размера', + 'MachineObservationSampleSizeValue' => 'Машинное наблюдение – Размер образца', + 'MachineObservationSamplingEffort' => 'Машинное наблюдение – Затраченные уÑилиÑ', + 'MachineObservationSamplingProtocol' => 'Машинное наблюдение – Метод иÑÑледованиÑ', + 'MachineObservationStartDayOfYear' => 'День года начала машинного наблюдениÑ', + 'MachineObservationVerbatimEventDate' => 'Дата машинного Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ Ð´Ð¾Ñловно', + 'MachineObservationYear' => 'Год машинного наблюдениÑ', + 'MacintoshNSPrintInfo' => 'Macintosh NS – Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ печати', + 'MacintoshPrintInfo' => 'Macintosh – Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ печати', + 'Macro' => { + Description => 'Макро', + PrintConv => { + 'Macro' => 'Макро', + 'Manual' => 'Ручной', + 'Normal' => 'Обычный', + 'Off' => 'Выключен', + 'On' => 'Включен', + }, + }, + 'Magnetometer' => 'Магнитометр', + 'MajorBrand' => { + Description => 'ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ñ‚Ð¾Ñ€Ð³Ð¾Ð²Ð°Ñ Ð¼Ð°Ñ€ÐºÐ°', + PrintConv => { + 'JPEG 2000 Compound Image (.JPM)' => 'СоÑтавное изображение JPEG 2000 (.JPM)', + 'JPEG 2000 Image (.JP2)' => 'Изображение JPEG 2000 (.JP2)', + 'JPEG 2000 with extensions (.JPX)' => 'Улучшенный JPEG 2000 (.JPX)', + }, + }, + 'MajorVersion' => 'ÐœÐ°Ð¶Ð¾Ñ€Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ', + 'Make' => 'Производитель', + 'MakerNote' => 'Приватные данные DNG', + 'MakerNoteApple' => 'Комментарии Apple', + 'MakerNoteCanon' => 'Комментарии Canon', + 'MakerNoteCasio' => 'Комментарии Casio', + 'MakerNoteCasio2' => 'Комментарии Casio 2', + 'MakerNoteDJI' => 'Комментарии DJI', + 'MakerNoteFLIR' => 'Комментарии FLIR', + 'MakerNoteFujiFilm' => 'Комментарии Fuji Film', + 'MakerNoteGE' => 'Комментарии GE', + 'MakerNoteGE2' => 'Комментарии GE2', + 'MakerNoteHP' => 'Комментарии HP', + 'MakerNoteHP2' => 'Комментарии HP2', + 'MakerNoteHP4' => 'Комментарии HP4', + 'MakerNoteHP6' => 'Комментарии HP6', + 'MakerNoteHasselblad' => 'Комментарии Hasselblad', + 'MakerNoteISL' => 'Комментарии ISL', + 'MakerNoteJVC' => 'Комментарии JVC', + 'MakerNoteJVCText' => 'Комментарии JVC – ТекÑÑ‚', + 'MakerNoteKodak10' => 'Комментарии Kodak 10', + 'MakerNoteKodak11' => 'Комментарии Kodak 11', + 'MakerNoteKodak12' => 'Комментарии Kodak 12', + 'MakerNoteKodak1a' => 'Комментарии Kodak 1a', + 'MakerNoteKodak1b' => 'Комментарии Kodak 1b', + 'MakerNoteKodak2' => 'Комментарии Kodak 2', + 'MakerNoteKodak3' => 'Комментарии Kodak 3', + 'MakerNoteKodak4' => 'Комментарии Kodak 4', + 'MakerNoteKodak5' => 'Комментарии Kodak 5', + 'MakerNoteKodak6a' => 'Комментарии Kodak 6a', + 'MakerNoteKodak6b' => 'Комментарии Kodak 6b', + 'MakerNoteKodak7' => 'Комментарии Kodak 7', + 'MakerNoteKodak8a' => 'Комментарии Kodak 8a', + 'MakerNoteKodak8b' => 'Комментарии Kodak 8b', + 'MakerNoteKodak8c' => 'Комментарии Kodak 8c', + 'MakerNoteKodak9' => 'Комментарии Kodak 9', + 'MakerNoteKodakUnknown' => 'Комментарии Kodak – ÐеизвеÑтно', + 'MakerNoteKyocera' => 'Комментарии Kyocera', + 'MakerNoteLeica' => 'Комментарии Leica', + 'MakerNoteLeica10' => 'Комментарии Leica 10', + 'MakerNoteLeica2' => 'Комментарии Leica 2', + 'MakerNoteLeica3' => 'Комментарии Leica 3', + 'MakerNoteLeica4' => 'Комментарии Leica 4', + 'MakerNoteLeica5' => 'Комментарии Leica 5', + 'MakerNoteLeica6' => 'Комментарии Leica 6', + 'MakerNoteLeica7' => 'Комментарии Leica 7', + 'MakerNoteLeica8' => 'Комментарии Leica 8', + 'MakerNoteLeica9' => 'Комментарии Leica 9', + 'MakerNoteMinolta' => 'Комментарии Minolta', + 'MakerNoteMinolta2' => 'Комментарии Minolta 2', + 'MakerNoteMinolta3' => 'Комментарии Minolta 3', + 'MakerNoteMotorola' => 'Комментарии Motorola', + 'MakerNoteNikon' => 'Комментарии Nikon', + 'MakerNoteNikon2' => 'Комментарии Nikon 2', + 'MakerNoteNikon3' => 'Комментарии Nikon 3', + 'MakerNoteNintendo' => 'Комментарии Nintendo', + 'MakerNoteOffset' => 'Смещение заметки производителÑ', + 'MakerNoteOlympus' => 'Комментарии Olympus', + 'MakerNoteOlympus2' => 'Комментарии Olympus 2', + 'MakerNotePanasonic' => 'Комментарии Panasonic', + 'MakerNotePanasonic2' => 'Комментарии Panasonic 2', + 'MakerNotePanasonic3' => 'Комментарии Panasonic 3', + 'MakerNotePentax' => 'Комментарии Pentax', + 'MakerNotePentax2' => 'Комментарии Pentax 2', + 'MakerNotePentax3' => 'Комментарии Pentax 3', + 'MakerNotePentax4' => 'Комментарии Pentax 4', + 'MakerNotePentax5' => 'Комментарии Pentax 5', + 'MakerNotePentax6' => 'Комментарии Pentax 6', + 'MakerNotePhaseOne' => 'Комментарии Phase One', + 'MakerNoteReconyx' => 'Комментарии Reconyx', + 'MakerNoteReconyx2' => 'Комментарии Reconyx 2', + 'MakerNoteReconyx3' => 'Комментарии Reconyx 3', + 'MakerNoteRicoh' => 'Комментарии Ricoh', + 'MakerNoteRicoh2' => 'Комментарии Ricoh 2', + 'MakerNoteRicohPentax' => 'Комментарии Ricoh Pentax', + 'MakerNoteRicohText' => 'Комментарии Ricoh – ТекÑÑ‚', + 'MakerNoteSafety' => { + Description => 'ÐŸÑ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑти', + PrintConv => { + 'Safe' => 'БезопаÑно', + 'Unsafe' => 'ÐебезопаÑно', + }, + }, + 'MakerNoteSamsung1a' => 'Комментарии Samsung 1a', + 'MakerNoteSamsung1b' => 'Комментарии Samsung 1b', + 'MakerNoteSamsung2' => 'Комментарии Samsung 2', + 'MakerNoteSanyo' => 'Комментарии Sanyo', + 'MakerNoteSanyoC4' => 'Комментарии Sanyo C4', + 'MakerNoteSanyoPatch' => 'Комментарии Sanyo Patch', + 'MakerNoteSigma' => 'Комментарии Sigma', + 'MakerNoteSigma3' => 'Комментарии Sigma 3', + 'MakerNoteSony' => 'Комментарии Sony', + 'MakerNoteSony2' => 'Комментарии Sony 2', + 'MakerNoteSony3' => 'Комментарии Sony 3', + 'MakerNoteSony4' => 'Комментарии Sony 4', + 'MakerNoteSony5' => 'Комментарии Sony 5', + 'MakerNoteSonyEricsson' => 'Комментарии Sony Ericsson', + 'MakerNoteSonySRF' => 'Комментарии Sony SRF', + 'MakerNoteUnknown' => 'Комментарии неизвеÑтного производителÑ', + 'MakerNoteUnknownBinary' => 'Комментарии неизвеÑтного Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ â€“ Бинарный', + 'MakerNoteUnknownText' => 'Комментарии неизвеÑтного Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ â€“ ТекÑтовый', + 'MakerNoteVersion' => 'Заметка Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ â€“ ВерÑиÑ', + 'MakerNotes' => 'Данные производителей', + 'Manager' => 'Руководитель', + 'ManualFocusDistance' => 'РаÑÑтоÑние ручной фокуÑировки', + 'Manufacturer' => 'Разработчик', + 'MappingScheme' => 'Схема подÑтановки отÑутÑтвующего шрифта', + 'MarkerID' => 'ID маркера', + 'MaskedAreas' => 'МаÑкированные облаÑти', + 'MasterDocumentID' => 'ОÑновной ID документа', + 'MaterialSample' => 'Материал образца', + 'MaterialSampleID' => 'ID материала образца', + 'MatrixWorldToCamera' => 'Матрица мира на камеру', + 'MatrixWorldToScreen' => 'Матрица мира на Ñкран', + 'MattColor' => 'Matt цвет', + 'Matte' => 'Matte (МаÑка?)', + 'Matteing' => 'Матирование', + 'MaxAperture' => 'МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð¸Ð°Ñ„Ñ€Ð°Ð³Ð¼Ð° объектива', + 'MaxApertureValue' => 'МакÑимальное значение диафрагмы', + 'MaxBand' => 'МакÑимальный диапазон', + 'MaxBitrate' => 'МакÑимальный битрейт', + 'MaxPacketSize' => 'Размер макÑимального пакета', + 'MaxSampleValue' => 'МакÑимальное значение компонента', + 'MaxSubfileSize' => 'МакÑимальный размер подфайла', + 'MaxVal' => 'МакÑимальное значение пикÑелÑ', + 'MaxWidth' => 'МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° глифа', + 'MaximumBitrate' => 'МакÑимальный битрейт', + 'MaximumDensityRange' => 'МакÑимальный диапазон плотноÑти', + 'MaximumObjectSize' => 'МакÑимальный размер объекта', + 'MeasureType' => { + Description => 'Тип Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ñ‹', + PrintConv => { + 'OpticalAxis' => 'ОптичеÑÐºÐ°Ñ Ð¾ÑÑŒ', + 'OpticalRay' => 'ОптичеÑкий луч', + }, + }, + 'MeasurementAccuracy' => 'ÐŸÐ¾Ñ‚ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð³Ñ€ÐµÑˆÐ½Ð¾ÑÑ‚ÑŒ измерениÑ', + 'MeasurementDeterminedBy' => 'Люди определившие значение измерениÑ', + 'MeasurementDeterminedDate' => 'Дата Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ', + 'MeasurementID' => 'ID измерениÑ', + 'MeasurementMethod' => 'Метод измерениÑ', + 'MeasurementOrFact' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± измерении', + 'MeasurementRemarks' => 'Заметки измерениÑ', + 'MeasurementScale' => 'Шкала измерений', + 'MeasurementType' => 'Тип измерениÑ', + 'MeasurementUnit' => 'Единицы измерениÑ', + 'MeasurementValue' => 'Значение измерениÑ', + 'MediaConstraints' => 'ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° медиареÑурÑÑ‹', + 'MediaData' => 'Медиа-данные', + 'MediaEventIdDate' => 'Дата ÑобытиÑ', + 'MediaIsDelay' => { + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'MediaIsFinale' => { + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'MediaIsLive' => { + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'MediaIsMovie' => { + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'MediaIsPremiere' => { + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'MediaIsRepeat' => { + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'MediaIsSAP' => { + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'MediaIsSport' => { + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'MediaIsStereo' => { + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'MediaIsSubtitled' => { + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'MediaIsTape' => { + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'MediaSummaryCode' => 'Сводный код медиареÑурÑов', + 'MeetingLocations' => 'МеÑто вÑтречи', + 'Megapixels' => 'МегапикÑелей', + 'MelodicPolyphony' => 'ПолифоничеÑÐºÐ°Ñ Ð¼ÐµÐ»Ð¾Ð´Ð¸Ñ', + 'Message' => 'Сообщение', + 'MetadataCreator' => 'Метаданные – Создатель', + 'MetadataDate' => 'Метаданные – Дата', + 'MeteringMode' => { + Description => 'ЭкÑпозамер', + PrintConv => { + 'Average' => 'УÑреднённый', + 'Center-weighted average' => 'Центрально-взвешенный', + 'Multi-segment' => 'Оценочный/Многозонный', + 'Multi-spot' => 'Многоточечный', + 'Other' => 'Другой', + 'Partial' => 'ЧаÑтичный', + 'Spot' => 'Точечный', + 'Unknown' => 'ÐеизвеÑтный', + }, + }, + 'Method' => 'Метод', + 'Micro1Version' => 'Micro 1 – ВерÑиÑ', + 'Micro2Version' => 'Micro 2 – ВерÑиÑ', + 'Mime' => 'MIME-тип', + 'MinApertureValue' => 'Минимальное чиÑло диафрагмы объектива', + 'MinSampleValue' => 'Минимальное значение компонента', + 'MinimumBitrate' => 'Минимальный битрейт', + 'MinimumVersion' => 'ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑиÑ', + 'MinorModelAgeDisclosure' => { + Description => 'ВозраÑÑ‚ Ñамой молодой модели на Ñнимке', + PrintConv => { + 'Age 14 or Under' => '14 лет и меньше', + 'Age 15' => '15 лет', + 'Age 16' => '16 лет', + 'Age 17' => '17 лет', + 'Age 18' => '18 лет', + 'Age 19' => '19 лет', + 'Age 20' => '20 лет', + 'Age 21' => '21 год', + 'Age 22' => '22 года', + 'Age 23' => '23 года', + 'Age 24' => '24 года', + 'Age 25 or Over' => '25 лет и выше', + 'Age Unknown' => 'ВозраÑÑ‚ неизвеÑтен', + }, + }, + 'MinorVersion' => 'ÐœÐ¸Ð½Ð¾Ñ€Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ', + 'MobiType' => { + Description => 'Тип Mobi', + PrintConv => { + 'Audio' => 'Ðудио', + 'KF8: generated by kindlegen2' => 'KF8: Ñгенерированный kindlegen 2', + 'Mobipocket Book' => 'Книга Mobipocket', + 'News' => 'ÐовоÑти', + 'News_Feed' => 'ÐовоÑÑ‚Ð½Ð°Ñ Ð»ÐµÐ½Ñ‚Ð°', + 'News_Magazine' => 'Журнал новоÑтей', + 'PalmDoc Book' => 'Книга PalmDoc', + 'mobipocket? generated by kindlegen1.2' => 'Mobipocket? Сгенерированный kindlegen 1.2', + }, + }, + 'MobiVersion' => 'ВерÑÐ¸Ñ Mobi', + 'ModDate' => 'Дата редактированиÑ', + 'ModeExtension' => { + Description => 'РаÑширение режима канала', + PrintConv => { + 'Bands 12-31' => 'ПолоÑÑ‹ 12-32', + 'Bands 16-31' => 'ПолоÑÑ‹ 16-31', + 'Bands 4-31' => 'ПолоÑÑ‹ 4-31', + 'Bands 8-31' => 'ПолоÑÑ‹ 8-31', + }, + }, + 'ModeNumber' => 'Режим Ñтандарта факÑ-профилÑ', + 'Model' => 'Модель камеры', + 'Model2' => 'Модель 2', + 'ModelReleaseID' => 'ID релиза модели', + 'ModelReleaseStatus' => { + Description => 'Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ€ÐµÐ»Ð¸Ð·Ð° модели', + PrintConv => { + 'Limited or Incomplete Model Releases' => 'Ограниченные или неполные верÑии моделей', + 'None' => 'Ðе обозначено', + 'Not Applicable' => 'Ðе дейÑтвующий', + 'Unlimited Model Releases' => 'Ðеограниченное количеÑтво релизов модели', + }, + }, + 'ModelTiePoint' => 'ПроÑтранÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð¿Ñ€Ð¸Ð²Ñзка', + 'ModelTransform' => 'Модель преобразованиÑ', + 'ModificationNumber' => 'Ðомер модификации', + 'ModificationPermissions' => { + Description => 'Ð Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° Редактирование', + PrintConv => { + 'Do not restrict applications to reader permissions' => 'Ðе ограничивать вÑем приложениÑм права на чтение', + 'Fill forms, Create page templates, Sign' => 'РазрешаетÑÑ: Заполнение форм, Создание шаблонов Ñтраниц, Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ', + 'Fill forms, Create page templates, Sign, Create/Delete/Edit annotations' => 'РазрешаетÑÑ: Заполнение форм, Создание шаблонов Ñтраниц, Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ, Создание/Удаление/Редактирование аннотаций', + 'No changes permitted' => 'Редактирование запрещено', + 'Restrict all applications to reader permissions' => 'Ограничивать вÑем приложениÑм права на чтение', + }, + }, + 'ModifyDate' => 'Дата редактированиÑ', + 'MoireFilter' => 'Фильтр муара', + 'Montage' => 'Монтаж', + 'Month' => 'МеÑÑц', + 'MoonPhase' => { + Description => 'Фаза луны', + PrintConv => { + 'First Quarter' => 'ÐŸÐµÑ€Ð²Ð°Ñ Ñ‡ÐµÑ‚Ð²ÐµÑ€Ñ‚ÑŒ', + 'Full' => 'Полнолуние', + 'Last Quarter' => 'ПоÑледнÑÑ Ñ‡ÐµÑ‚Ð²ÐµÑ€Ñ‚ÑŒ', + 'New' => 'Ðоволуние', + 'New Crescent' => 'ÐœÐ¾Ð»Ð¾Ð´Ð°Ñ Ð»ÑƒÐ½Ð°', + 'Old Crescent' => 'Ð¡Ñ‚Ð°Ñ€Ð°Ñ Ð»ÑƒÐ½Ð°', + 'Waning Gibbous' => 'Ð£Ð±Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ Ð»ÑƒÐ½Ð°', + 'Waxing Gibbous' => 'РаÑÑ‚ÑƒÑ‰Ð°Ñ Ð»ÑƒÐ½Ð°', + }, + }, + 'MotionSensitivity' => 'Обнаружение движениÑ', + 'MultiFrameNoiseReduction' => { + Description => 'Многокадровое шумоподавление', + PrintConv => { + 'Off' => 'Ðе включено', + 'On' => 'Включено', + }, + }, + 'MultiProfiles' => { + Description => 'Мультипрофили', + PrintConv => { + 'JBIG2 Profile M' => 'JBIG2 профиль M', + 'N Layer Profile M' => 'N Ñлой Профиль M', + 'Profile C' => 'Профиль C', + 'Profile F' => 'Профиль F', + 'Profile J' => 'Профиль J', + 'Profile L' => 'Профиль L', + 'Profile M' => 'Профиль M', + 'Profile S' => 'Профиль S', + 'Profile T' => 'Профиль T', + 'Resolution/Image Width' => 'Разрешение/Ширина изображениÑ', + 'Shared Data' => 'Общие данные', + }, + }, + 'MultimediaType' => 'Тип мультимедиа', + 'Multishot' => { + Description => 'МультиÑъёмка', + PrintConv => { + 'Off' => 'Ðе включена', + 'Pixel Shift' => 'Сдвиг пикÑелей', + }, + }, + 'Name' => 'Ðазвание файла', + 'NameTableVersion' => 'Таблица имён – ВерÑиÑ', + 'NameUTF-8' => 'Ðазвание в кодировке UTF-8', + 'Narrator' => 'Ð˜Ð¼Ñ Ð´Ð¸ÐºÑ‚Ð¾Ñ€Ð°', + 'Near' => 'Ближайшее значение карты глубины', + 'NetName' => 'Сетевое имÑ', + 'NetProviderType' => 'Тип Ñетевого провайдера', + 'NewGUID' => 'Ðовый GUID', + 'NewRawImageDigest' => 'Хеш-Ñумма RAW-Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² новом формате', + 'NewsPhotoVersion' => 'ВерÑÐ¸Ñ News Photo', + 'Nickname' => 'Прозвище', + 'NoMSSmartTags' => 'Смарт-теги MS отÑутÑтвуют', + 'Noise' => 'Уровень шума', + 'NoiseProfile' => 'Профиль – Уровень шума', + 'NoiseReduction' => 'Шумоподавление', + 'NoiseReductionApplied' => 'Применённое шумоподавление', + 'NoiseReductionMode' => { + Description => 'Режим шумоподавлениÑ', + PrintConv => { + 'Off' => 'Ðе включён', + 'On' => 'Включён', + }, + }, + 'NoiseReductionParams' => 'Параметры шумоподавлениÑ', + 'NoiseReductionValue' => 'Значение шумоподавлениÑ', + 'NominalBitrate' => 'Ðоминальный битрейт', + 'NominalVideoBitrate' => { + Description => 'Ðоминальный битрейт видео', + PrintConv => { + 'Unspecified' => 'Ðеопределённый', + }, + }, + 'Note' => 'Заметка', + 'Notes' => 'Комментарии', + 'Notice' => 'Заметка', + 'Now' => 'Текущие Дата и ВремÑ', + 'NumChannels' => 'КоличеÑтво каналов', + 'NumColors' => 'КоличеÑтво цветов', + 'NumFonts' => 'КоличеÑтво шрифтов в коллекции', + 'NumImportantColors' => 'КоличеÑтво важных цветов', + 'NumIndexEntries' => 'КоличеÑтво индекÑов', + 'NumPackets' => 'КоличеÑтво пакетов', + 'NumProperties' => 'КоличеÑтво ÑвойÑтв', + 'NumRules' => 'КоличеÑтво правил', + 'NumSampleFrames' => 'КоличеÑтво кадров', + 'NumSlices' => 'КоличеÑтво фрагментов', + 'NumStreams' => 'КоличеÑтво потоков', + 'Number' => 'Ðомер', + 'NumberList' => 'Ðумерованный ÑпиÑок', + 'NumberOfComponents' => 'КоличеÑтво компонентов', + 'NumberOfImages' => 'КоличеÑтво изображений', + 'NumberofInks' => 'КоличеÑтво чернил', + 'OPIProxy' => { + Description => 'ПодÑтановка изображениÑ', + PrintConv => { + 'Higher resolution image does not exist' => 'Изображение большего Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¾Ñ‚ÑутÑтвует', + 'Higher resolution image exists' => 'ПриÑутÑтвует изображение Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ разрешением', + }, + }, + 'Object' => 'Объект', + 'ObjectAttributeReference' => 'СÑылка на атрибут объекта', + 'ObjectCycle' => { + Description => 'Суточный цикл', + PrintConv => { + 'Both Morning and Evening' => 'Утро и вечер', + 'Evening' => 'Вечер', + 'Morning' => 'Утро', + }, + }, + 'ObjectName' => 'Ðазвание объекта', + 'ObjectPreviewData' => 'ПредпроÑмотр объекта – Данные', + 'ObjectPreviewFileFormat' => { + Description => 'ПредпроÑмотр объекта – Формат файла', + PrintConv => { + 'AppleSingle (Apple Computer Inc)' => 'AppleSingle (Apple)', + 'Audio Interchange File Format AIFF (Apple Computer Inc)' => 'Ðудиофайл формата AIFF (Apple)', + 'Bit Mapped Graphics File [.BMP] (Microsoft)' => 'Битовый графичеÑкий файл [.BMP] (Microsoft)', + 'Compressed Binary File [.ZIP] (PKWare Inc)' => 'Сжатый двоичный файл [.ZIP] (ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ PKWare)', + 'Digital Audio File [.WAV] (Microsoft & Creative Labs)' => 'Ðудиофайл формата [.WAV] (Microsoft и Creative Labs)', + 'Hypertext Markup Language [.HTML] (The Internet Society)' => 'Язык гипертекÑтовой разметки [.HTML] (The Internet Society)', + 'IPTC Unstructured Character Oriented File Format (UCOFF)' => 'ÐеÑтруктурированный Ñимвольно-ориентированный формат файла IPTC (UCOFF)', + 'IPTC7901 Recommended Message Format' => 'IPTC7901 Рекомендуемый формат ÑообщениÑ', + 'Illustrator (Adobe Graphics data)' => 'Illustrator (ГрафичеÑкие данные Adobe)', + 'JPEG File Interchange (JFIF)' => 'Формат обмена файлами Ñтандарта JPEG (JFIF)', + 'MPEG 2 Audio Layer 2 (Musicom), ISO/IEC' => 'Ðудио второго ÑƒÑ€Ð¾Ð²Ð½Ñ MPEG 2 (Musicom), ISO/IEC', + 'MPEG 2 Audio Layer 3, ISO/IEC' => 'Ðудио третьего ÑƒÑ€Ð¾Ð²Ð½Ñ MPEG 2 , ISO/IEC', + 'News Industry Text Format (NITF)' => 'ТекÑтовый формат новоÑтной индуÑтрии (NITF)', + 'No ObjectData' => 'Данные объекта отÑутÑтвуют', + 'PC DOS/Windows Executable Files [.COM][.EXE]' => 'ИÑполнÑемый файл PC DOS/Windows [.COM][.EXE]', + 'RIFF Wave (Microsoft Corporation)' => 'RIFF Wave (Microsoft)', + 'Ritzaus Bureau NITF version (RBNITF DTD)' => 'Ritzaus Bureau вариант NITF (RBNITF DTD)', + 'Tagged Image File Format (Adobe/Aldus Image data)' => 'Формат файла Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ñ‚ÐµÐ³Ð°Ð¼Ð¸ (Adobe/Aldus данные изображениÑ)', + 'Tape Archive [.TAR]' => 'Формат файла архива [.TAR]', + 'Tidningarnas Telegrambyra NITF version (TTNITF DTD)' => 'Tidningarnas Telegrambyra вариант NITF (TTNITF DTD)', + 'United Press International ANPA 1312 variant' => 'United Press International – Вариант ANPA 1312', + 'United Press International Down-Load Message' => 'United Press International – Down-Load Message', + }, + }, + 'ObjectPreviewFileVersion' => 'ПредпроÑмотр объекта – ВерÑиÑ', + 'ObjectSizeAnnounced' => 'ЗаÑвленный размер объекта', + 'ObjectType' => 'Тип объекта', + 'ObjectTypeReference' => 'СÑылка на тип объекта', + 'ObservationDate' => 'Дата наблюдениÑ', + 'ObservationDateEnd' => 'Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ', + 'ObservationTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ', + 'ObservationTimeEnd' => 'Ð’Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ', + 'Observer' => 'Ðаблюдатель', + 'ObsoletePhotoshopTag1' => 'Photoshop – УÑтаревший тег 1', + 'ObsoletePhotoshopTag2' => 'Photoshop – УÑтаревший тег 2', + 'ObsoletePhotoshopTag3' => 'Photoshop – УÑтаревший тег 3', + 'Occurrence' => 'Ðаходка', + 'OccurrenceAssociatedMedia' => 'МедиареÑурÑÑ‹ ÑвÑзанные Ñ Ð½Ð°Ñ…Ð¾Ð´ÐºÐ¾Ð¹', + 'OccurrenceAssociatedOccurrences' => 'СвÑзанные находки', + 'OccurrenceAssociatedReferences' => 'СÑылки ÑвÑзанные Ñ Ð½Ð°Ñ…Ð¾Ð´ÐºÐ¾Ð¹', + 'OccurrenceAssociatedSequences' => 'ГенетичеÑкие поÑледовательноÑти ÑвÑзанные Ñ Ð½Ð°Ñ…Ð¾Ð´ÐºÐ¾Ð¹', + 'OccurrenceAssociatedTaxa' => 'ТакÑоны ÑвÑзанные Ñ Ð½Ð°Ñ…Ð¾Ð´ÐºÐ¾Ð¹', + 'OccurrenceBehavior' => 'ÐŸÐ¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ñоби во Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ…Ð¾Ð´ÐºÐ¸', + 'OccurrenceCatalogNumber' => 'Ðомер набора данных', + 'OccurrenceDetails' => 'ПодробноÑти о находке', + 'OccurrenceDisposition' => 'СоÑтоÑние образца по отношению к коллекции', + 'OccurrenceEstablishmentMeans' => 'СпоÑоб оÑÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° меÑтноÑти', + 'OccurrenceID' => 'ID находки', + 'OccurrenceIndividualCount' => 'КоличеÑтво найденных оÑобей', + 'OccurrenceIndividualID' => 'ID найденных оÑобей', + 'OccurrenceLifeStage' => 'Жизненные циклы найденных оÑобей', + 'OccurrenceOrganismQuantity' => 'ЧиÑло учётных единиц или обилие вида', + 'OccurrenceOrganismQuantityType' => 'Тип ÑиÑтемы количеÑтвенного определениÑ', + 'OccurrenceOtherCatalogNumbers' => 'Другие номера каталога Ð´Ð»Ñ Ð½Ð°Ñ…Ð¾Ð´ÐºÐ¸', + 'OccurrencePreparations' => 'Методы Ð¿Ñ€ÐµÐ¿Ð°Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ конÑÐµÑ€Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð·Ñ†Ð°', + 'OccurrencePreviousIdentifications' => 'Предыдущие Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ð°Ñ…Ð¾Ð´ÐºÐ¸', + 'OccurrenceRecordNumber' => 'Ðомер приÑвоенный объекту в момент находки', + 'OccurrenceRecordedBy' => 'Люди ответÑтвенные за запиÑÑŒ о находке', + 'OccurrenceRemarks' => 'Комментарии к находке', + 'OccurrenceReproductiveCondition' => 'Репродуктивное ÑоÑтоÑние оÑобей во Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ…Ð¾Ð´ÐºÐ¸', + 'OccurrenceSex' => 'Пол найденных оÑобей', + 'OccurrenceStatus' => 'ПриÑутÑтвие вида в данной меÑтноÑти', + 'OceApplicationSelector' => 'Задатчик Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Oce', + 'OceIDNumber' => 'ID-номер Oce', + 'OceImageLogic' => 'Логика Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Oce', + 'OceScanjobDesc' => 'ОпиÑание Ð·Ð°Ð´Ð°Ð½Ð¸Ñ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Oce', + 'OffsetSchema' => 'Схема ÑмещениÑ', + 'OffsetTime' => 'Смещение времени', + 'OffsetTimeDigitized' => 'Ð¡Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°', + 'OffsetTimeOriginal' => 'Смещение времени Ñъёмки', + 'OldSubfileType' => { + Description => 'Тип подфайла (Ñтарый)', + PrintConv => { + 'Full-resolution image' => 'Изображение Ñ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼ разрешением', + 'Reduced-resolution image' => 'Изображение Ñ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ñ‹Ð¼ разрешением', + 'Single page of multi-page image' => 'Одна Ñтраница из многоÑтраничного изображениÑ', + }, + }, + 'OnionSkins' => 'Обрамление Ñцены', + 'Opacity' => 'ÐепрозрачноÑÑ‚ÑŒ', + 'OpcodeList1' => 'СпиÑок кодов операций обработки изображений 1', + 'OpcodeList2' => 'СпиÑок кодов операций обработки изображений 2', + 'OpcodeList3' => 'СпиÑок кодов операций обработки изображений 3', + 'OperatingSystem' => { + Description => 'ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÑиÑтема', + PrintConv => { + 'FAT filesystem (MS-DOS, OS/2, NT/Win32)' => 'Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема FAT (MS-DOS, OS/2, NT/Win32)', + 'HPFS filesystem (OS/2, NT)' => 'Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема HPFS (OS/2, NT)', + 'NTFS filesystem (NT)' => 'Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема NTFS (NT)', + 'VMS (or OpenVMS)' => 'VMS (или OpenVMS)', + 'Z-System' => 'Z/OS', + 'unknown' => 'ÐеизвеÑтнаÑ', + }, + }, + 'OpticalZoomOn' => { + Description => 'ОптичеÑкий зум', + PrintConv => { + 'Off' => 'Ðе включён', + 'On' => 'Включен', + }, + }, + 'Opto-ElectricConvFactor' => 'Фактор оптико-ÑлектричеÑкого преобразованиÑ', + 'Organism' => 'Организм', + 'OrganismAssociatedOccurrences' => 'СвÑзанные находки Ñ Ñтим организмом', + 'OrganismAssociatedOrganisms' => 'Другие организмы ÑвÑзанные Ñ Ñтим организмом', + 'OrganismID' => 'ID организма', + 'OrganismName' => 'Ðазвание приÑвоенное организму', + 'OrganismPreviousIdentifications' => 'Предыдущие Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð¼Ð°', + 'OrganismRemarks' => 'Комментарии к ÑкземплÑру организма', + 'OrganismScope' => 'Вид ÑкземплÑра организма', + 'Organization' => 'ОрганизациÑ', + 'Organizer' => 'Организатор', + 'Orientation' => { + Description => 'ОриентациÑ', + PrintConv => { + 'Horizontal (normal)' => 'ГоризонтальнаÑ', + 'Mirror horizontal' => 'Отражение по горизонтали', + 'Mirror horizontal and rotate 270 CW' => 'Отражение по горизонтали и поворот на 270° по чаÑовой Ñтрелке', + 'Mirror horizontal and rotate 90 CW' => 'Отражение по горизонтали и поворот на 90° по чаÑовой Ñтрелке', + 'Mirror vertical' => 'Отражение по вертикали', + 'Rotate 180' => 'Поворот на 180°', + 'Rotate 270 CW' => 'Поворот на 270° по чаÑовой Ñтрелке', + 'Rotate 90 CW' => 'Поворот на 90° по чаÑовой Ñтрелке', + }, + }, + 'OriginPathInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± иÑходном обтравочном контуре', + 'OriginalBestQualitySize' => 'Размер более качеÑтвенного изображениÑ', + 'OriginalCreateDateTime' => 'ИÑходные дата и Ð²Ñ€ÐµÐ¼Ñ ÑозданиÑ', + 'OriginalDecisionData' => 'Ð¦Ð¸Ñ„Ñ€Ð¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ оригинальноÑти Ñнимка (ODD)', + 'OriginalDefaultCropSize' => 'ИÑходный размер кадрированного изображениÑ', + 'OriginalDefaultFinalSize' => 'Полный размер иÑходного изображениÑ', + 'OriginalFileName' => 'ИÑходное название файла', + 'OriginalFileSize' => 'Размер иÑходного файла', + 'OriginalFileType' => 'Тип иÑходного файла', + 'OriginalFrameRate' => 'ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ñ‡Ð°Ñтота кадров', + 'OriginalImageHeight' => 'ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð²Ñ‹Ñотаи зображениÑ', + 'OriginalImageWidth' => 'ИÑÑ…Ð¾Ð´Ð½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° изображениÑ', + 'OriginalMedia' => { + Description => 'Оригинальный ноÑитель', + PrintConv => { + 'False' => 'Ðет', + 'True' => 'Да', + }, + }, + 'OriginalRawFileData' => 'Данные иÑходного RAW-файла', + 'OriginalRawFileDigest' => 'Хеш-Ñумма иÑходного RAW-файла', + 'OriginalRawFileName' => 'Ðазвание иÑходного RAW-файла', + 'OriginalReleaseTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° оригинала', + 'OriginalTransmissionReference' => 'ИÑÑ…Ð¾Ð´Ð½Ð°Ñ ÑÑылка на передачу', + 'OriginatingProgram' => 'Создано в риложении', + 'Originator' => 'Контент Ñоздан в', + 'OtherConditions' => 'Другие уÑловиÑ', + 'OtherConstraints' => 'Другие ограничениÑ', + 'OtherDate1' => 'Другое – Дата 1', + 'OtherDate2' => 'Другое – Дата 2', + 'OtherDate3' => 'Другое – Дата 3', + 'OtherFirmware' => 'Ð”Ñ€ÑƒÐ³Ð°Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ°', + 'OtherImage' => 'Другое изображение', + 'OtherImageInfo' => 'Другие ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± изображении', + 'OtherImageLength' => 'Строк в файле предпроÑмотра', + 'OtherImageStart' => 'Смещение другого изображениÑ', + 'OtherLicenseDocuments' => 'Другие документы лицензии', + 'OtherLicenseInfo' => 'Дополнительные ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ лицензии', + 'OtherLicenseRequirements' => 'Другие лицензионные требованиÑ', + 'OtherSerialNumber' => 'Другой Серийный номер', + 'Owner' => 'Владелец', + 'OwnerAppointmentID' => 'ID владельца ÑобытиÑ', + 'OwnerID' => 'ID владельца', + 'OwnerName' => 'Ð˜Ð¼Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð° камеры', + 'PDFVersion' => 'ВерÑÐ¸Ñ PDF', + 'PFMVersion' => 'ВерÑÐ¸Ñ PFM', + 'PGFVersion' => 'ВерÑÐ¸Ñ PGF', + 'PLUSVersion' => 'ВерÑÐ¸Ñ PLUS', + 'PMVersion' => 'ВерÑÐ¸Ñ PhotoMechanic', + 'PNGWarning' => 'Предупреждение PNG', + 'PStringCaption' => 'P – Строка заголовка', + 'PXC Viewer Info' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ñ‚ PDF-XChange Viewer', + 'Packets' => 'Пакетов', + 'PackingMethod' => { + Description => 'Метод ÑжатиÑ', + PrintConv => { + 'Best Compression' => 'МакÑимальный', + 'Fast' => 'БыÑтрый', + 'Fastest' => 'СкороÑтной', + 'Good Compression' => 'Хороший', + 'Normal' => 'Обычный', + 'Stored' => 'Без ÑжатиÑ', + }, + }, + 'Padding' => 'Внутренние отÑтупы', + 'Page' => 'Размер и раÑположение холÑта', + 'PageCount' => 'КоличеÑтво Ñтраниц', + 'PageEnter' => 'Эффект при заходе на Ñтраницу', + 'PageExit' => 'Эффект при уходе Ñо Ñтраницы', + 'PageFront' => 'КоличеÑтво фронтальных Ñтраниц', + 'PageLayout' => 'Макет Ñтраницы', + 'PageMode' => 'Режим Ñтраницы', + 'PageName' => 'Ðазвание Ñтраницы', + 'PageNormal' => 'КоличеÑтво обычных Ñтраниц', + 'PageNumber' => 'Ðомер Ñтраницы', + 'PageSpecial' => 'КоличеÑтво Ñпециальных Ñтраниц', + 'Pages' => 'Страниц', + 'Palette' => 'Палитра', + 'PaletteHistogram' => 'ГиÑтограмма палитры', + 'PalmFileType' => 'Тип файла Palm', + 'PanOrientation' => { + Description => 'ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð°Ð½Ð¾Ñ€Ð°Ð¼Ñ‹', + PrintConv => { + 'Bottom to top' => 'Снизу вверх', + 'Clockwise' => 'По чаÑовой Ñтрелке', + 'Counter clockwise' => 'Против чаÑовой Ñтрелки', + 'Left to right' => 'Слева направо', + 'Right to left' => 'Справа налево', + 'Start at bottom left' => 'Ðачало внизу Ñлева', + 'Start at bottom right' => 'Ðачало внизу Ñправа', + 'Start at top left' => 'Ðачало Ñверху Ñлева', + 'Start at top right' => 'Ðачало Ñверху Ñправа', + 'Top to bottom' => 'Сверху вниз', + 'Zigzag (column start)' => 'Зигзаг (начало колонки)', + 'Zigzag (row start)' => 'Зигзаг (начало Ñтроки)', + '[unused]' => 'ÐеиÑпользуетÑÑ', + }, + }, + 'PanOverlapH' => 'Горизонтальное перекрытие панорамы', + 'PanOverlapV' => 'Вертикальное перекрытие панорамы', + 'PanasonicRawVersion' => 'Panasonic – ВерÑÐ¸Ñ RAW', + 'PanasonicTitle' => 'Panasonic – Ðазвание', + 'PanasonicTitle2' => 'Panasonic – Ðазвание 2', + 'PanoramicStitchCameraMotion' => { + Description => 'Метод ÑÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ð½Ð¾Ñ€Ð°Ð¼Ñ‹', + PrintConv => { + '3D Rotation' => '3D-вращение', + 'Affine' => 'Ðффинное преобразование', + 'Homography' => 'ГомографиÑ', + 'Rigid Scale' => 'ЖёÑÑ‚ÐºÐ°Ñ ÑˆÐºÐ°Ð»Ð°', + }, + }, + 'PanoramicStitchMapType' => { + Description => 'Тип карты', + PrintConv => { + 'Horizontal Cylindrical' => 'Ð“Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ†Ð¸Ð»Ð¸Ð½Ð´Ñ€Ð¸Ñ‡ÐµÑкаÑ', + 'Horizontal Spherical' => 'Ð“Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ ÑферичеÑкаÑ', + 'Perspective' => 'ПерÑпектива', + 'Vertical Cylindrical' => 'Ð’ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñ†Ð¸Ð»Ð¸Ð½Ð´Ñ€Ð¸Ñ‡ÐµÑкаÑ', + 'Vertical Spherical' => 'Ð’ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑферичеÑкаÑ', + }, + }, + 'PanoramicStitchPhi0' => 'Угол Phi 0', + 'PanoramicStitchPhi1' => 'Угол Phi 1', + 'PanoramicStitchTheta0' => 'Угол Theta 0', + 'PanoramicStitchTheta1' => 'Угол Theta 1', + 'Paragraphs' => 'Ðбзацев', + 'ParentMEID' => 'РодительÑкий MEID', + 'ParentMediaEventID' => 'ID ÑобытиÑ', + 'PathSelectionState' => 'СоÑтоÑние выбранного обтравочного контура', + 'PathTableLocation' => 'РаÑположение таблицы путей', + 'PathTableSize' => 'Размер таблицы путей', + 'PatientBirthDate' => 'Дата Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ†Ð¸ÐµÐ½Ñ‚Ð°', + 'PatientID' => 'ID пациента', + 'PatientName' => 'Ð˜Ð¼Ñ Ð¿Ð°Ñ†Ð¸ÐµÐ½Ñ‚Ð°', + 'PatientSex' => 'Пол пациента', + 'PeakSpectralSensitivity' => 'ÐŸÐ¸ÐºÐ¾Ð²Ð°Ñ ÑÐ¿ÐµÐºÑ‚Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‡ÑƒÐ²ÑтвительноÑÑ‚ÑŒ', + 'People' => 'Люди', + 'PercentComplete' => 'Процент завершениÑ', + 'PercussivePolyphony' => 'ПолифоничеÑÐºÐ°Ñ Ð¿ÐµÑ€ÐºÑƒÑÑиÑ', + 'Performer' => 'ИÑполнитель', + 'PeripheralIllumCentralRadius' => 'КомпенÑÐ°Ñ†Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð·Ð¸Ñ‚Ð½Ð¾Ð³Ð¾ Ñигнала – Центральный радиуÑ', + 'PeripheralIllumCentralValue' => 'КомпенÑÐ°Ñ†Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð·Ð¸Ñ‚Ð½Ð¾Ð³Ð¾ Ñигнала – Ð¦ÐµÐ½Ñ‚Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð½Ð°ÑыщенноÑÑ‚ÑŒ', + 'PeripheralIllumPeriphValue' => 'КомпенÑÐ°Ñ†Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð·Ð¸Ñ‚Ð½Ð¾Ð³Ð¾ Ñигнала – ÐŸÐµÑ€Ð¸Ñ„ÐµÑ€Ð¸Ð¹Ð½Ð°Ñ Ð½Ð°ÑыщенноÑÑ‚ÑŒ', + 'Personality' => 'ЛичноÑти', + 'Photo' => 'ФотографиÑ', + 'PhotoResolution' => 'Разрешение Ñнимка', + 'PhotometricInterpretation' => { + Description => 'Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ', + PrintConv => { + 'BlackIsZero' => 'Чёрный равен нулю', + 'Color Filter Array' => 'МаÑÑив цветных фильтров (CFA)', + 'RGB Palette' => 'Палитра RGB', + 'Transparency Mask' => 'МаÑка прозрачноÑти', + 'WhiteIsZero' => 'Белый равен нулю', + }, + }, + 'Photoshop2ColorTable' => 'Photoshop 2 – Таблица цветов', + 'Photoshop2Info' => 'Photoshop 2 – СведениÑ', + 'PhotoshopBGRThumbnail' => 'Photoshop – BGR миниатюра', + 'PhotoshopFormat' => { + Description => 'Photoshop – Формат', + PrintConv => { + 'Optimized' => 'Оптимизированный', + 'Progressive' => 'ПрогреÑÑивный', + 'Standard' => 'Стандартный', + }, + }, + 'PhotoshopQuality' => 'Photoshop – КачеÑтво', + 'PhotoshopThumbnail' => 'Photoshop – Миниатюра', + 'PhysicalStreamNumberMap' => 'ФизичеÑкий поток – Number Map', + 'PhysicalStreamNumbers' => 'Ðомера физичеÑких потоков', + 'PhysicalStreams' => 'ФизичеÑких потоков', + 'PicsLabel' => 'Метка взроÑлоÑти контента', + 'PictInfo' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± изображении', + 'Picture' => 'Картина', + 'PictureBitsPerPixel' => 'КоличеÑтво бит на пикÑель картинки', + 'PictureDescription' => 'ОпиÑание изображениÑ', + 'PictureHeight' => 'Ð’Ñ‹Ñота картинки', + 'PictureIndexedColors' => 'ИндекÑированные цвета изображениÑ', + 'PictureLength' => 'Строк в картинке', + 'PictureMIMEType' => 'MIME тип изображениÑ', + 'PictureType' => { + Description => 'Тип изображениÑ', + PrintConv => { + '32x32 PNG Icon' => '32x32 иконка PNG', + 'Artist' => 'ИÑполнитель', + 'Back Cover' => 'ЗаднÑÑ Ð¾Ð±Ð»Ð¾Ð¶ÐºÐ°', + 'Band' => 'Группа', + 'Band Logo' => 'Логотип группы/иÑполнителÑ', + 'Bright(ly) Colored Fish' => 'Ярко Ð¾ÐºÑ€Ð°ÑˆÐµÐ½Ð½Ð°Ñ Ñ€Ñ‹Ð±Ð°', + 'Capture from Movie or Video' => 'Захват из фильма или видео', + 'Composer' => 'Композитор', + 'Conductor' => 'Дирижер', + 'Front Cover' => 'ПереднÑÑ Ð¾Ð±Ð»Ð¾Ð¶ÐºÐ°', + 'Illustration' => 'ИллюÑтрациÑ', + 'Lead Artist' => 'Ведущий ÐртиÑÑ‚/ИÑполнитель/СолиÑÑ‚', + 'Leaflet' => 'ЛиÑтовка', + 'Lyricist' => 'Ðвтор текÑта', + 'Media' => 'ÐоÑитель', + 'Other' => 'Другое', + 'Other Icon' => 'Ð”Ñ€ÑƒÐ³Ð°Ñ Ð¸ÐºÐ¾Ð½ÐºÐ°', + 'Performance' => 'ПредÑтавление', + 'Publisher Logo' => 'Логотип издателÑ/Ñтудии', + 'Recording Session' => 'ЗапиÑÑŒ ÑеÑÑии', + 'Recording Studio or Location' => 'Ð¡Ñ‚ÑƒÐ´Ð¸Ñ Ð·Ð²ÑƒÐºÐ¾Ð·Ð°Ð¿Ð¸Ñи или меÑтоположение', + }, + }, + 'PictureWidth' => 'Ширина картинки', + 'PieceLength' => 'Размер блока в байтах', + 'Pieces' => 'Блоков', + 'PipelineVersion' => 'ВерÑÐ¸Ñ Pipeline', + 'Pitch' => 'Тангаж (Ðаклон)', + 'PitchAndFamily' => 'Шаг и ÑемейÑтво шрифта', + 'PitchAngle' => 'Угол наклона (Тангаж)', + 'PixHeight' => 'Ð’Ñ‹Ñота в пикÑелÑÑ…', + 'PixWidth' => 'Ширина в пикÑелÑÑ…', + 'PixelAspectRatio' => 'Соотношение Ñторон пикÑелей', + 'PixelCalibration' => 'Калибровка по пикÑелÑм', + 'PixelFormat' => { + Description => 'Формат пикÑелÑ', + PrintConv => { + '112-bit 6 Channels Alpha' => '112-битный, 6 каналов, альфа-канал', + '112-bit 7 Channels' => '112-битный, 7 каналов', + '128-bit 7 Channels Alpha' => '128-битный, 7 каналов, альфа-канал', + '128-bit 8 Channels' => '128-битный, 8 каналов', + '128-bit PRGBA Float' => '128-битный, PRGBA Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой', + '128-bit RGB Float' => '128-битный, RGB Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой', + '128-bit RGBA Fixed Point' => '128-битный, RGBA Ñ Ñ„Ð¸ÐºÑированной точкой', + '128-bit RGBA Float' => '128-битный, RGBA Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой', + '144-bit 8 Channels Alpha' => '144-битный, 8 каналов, альфа-канал', + '16-bit BGR555' => '16-битный, BGR555', + '16-bit BGR565' => '16-битный, BGR565', + '16-bit Gray' => '16-битный, Серый', + '16-bit Gray Half' => '16-битный, половина Ñерого', + '24-bit 3 Channels' => '24-битный, 3 канала', + '24-bit BGR' => '24-битный, BGR', + '24-bit RGB' => '24-битный, RGB', + '32-bit 3 Channels Alpha' => '32-битный, 3 канала, альфа-канал', + '32-bit 4 Channels' => '32-битный, 4 канала', + '32-bit BGR' => '32-битный, BGR', + '32-bit BGR101010' => '32-битный, BGR101010', + '32-bit BGRA' => '32-битный, BGRA', + '32-bit CMYK' => '32-битный, CMYK', + '32-bit Gray Fixed Point' => '32-битный, Ñерый Ñ Ñ„Ð¸ÐºÑированной точкой', + '32-bit Gray Float' => '32-битный, Серый Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой', + '32-bit PBGRA' => '32-битный, PBGRA', + '32-bit RGBE' => '32-битный, RGBE', + '40-bit 4 Channels Alpha' => '40-битный, 4 канала, альфа-канал', + '40-bit 5 Channels' => '40-битный, 5 каналов', + '40-bit CMYK Alpha' => '40-битный, CMYK, альфа-канал', + '48-bit 3 Channels' => '48-битный, 3 канала', + '48-bit 5 Channels Alpha' => '48-битный, 5 каналов, альфа-канал', + '48-bit 6 Channels' => '48-битный, 6 каналов', + '48-bit RGB' => '48-битный, RGB', + '48-bit RGB Fixed Point' => '48-битный, RGB Ñ Ñ„Ð¸ÐºÑированной точкой', + '48-bit RGB Half' => '48-битный, RGB Half', + '4:2:0 (chroma at 0, 0.5)' => '4:2:0 (цветноÑÑ‚ÑŒ в 0, 0.5)', + '4:2:0 (chroma at 0.5, 0.5)' => '4:2:0 (цветноÑÑ‚ÑŒ в 0.5, 0.5)', + '4:2:2 (chroma at 0, 0)' => '4:2:2 (цветноÑÑ‚ÑŒ в 0, 0)', + '4:2:2 (chroma at 0.5, 0)' => '4:2:2 (цветноÑÑ‚ÑŒ в 0.5, 0)', + '56-bit 6 Channels Alpha' => '56-битный, 6 каналов, альфа-канал', + '56-bit 7 Channels' => '56-битный, 7 каналов', + '64-bit 3 Channels Alpha' => '64-битный, 3 канала, альфа-канал', + '64-bit 4 Channels' => '64-битный, 4 канала', + '64-bit 7 Channels Alpha' => '64-битный, 7 каналов, альфа-канал', + '64-bit 8 Channels' => '64-битный, 8 каналов', + '64-bit CMYK' => '64-битный, CMYK', + '64-bit PRGBA' => '64-битный, PRGBA', + '64-bit RGBA' => '64-битный, RGBA', + '64-bit RGBA Fixed Point' => '64-битный, RGBA Ñ Ñ„Ð¸ÐºÑированной точкой', + '64-bit RGBA Half' => '64-битный, RGBA Half', + '72-bit 8 Channels Alpha' => '72-битный, 8 каналов, альфа-канал', + '8-bit Gray' => '8-битный, Серый', + '80-bit 4 Channels Alpha' => '80-битный, 4 канала, альфа-канал', + '80-bit 5 Channels' => '80-битный, 5 канаов', + '80-bit CMYK Alpha' => '80-битный, CMYK, альфа-канал', + '96-bit 5 Channels Alpha' => '96-битный, 5 каналов, альфа-канал', + '96-bit 6 Channels' => '96-битный, 6 канаов', + '96-bit RGB Fixed Point' => '96-битный, RGB Ñ Ñ„Ð¸ÐºÑированной точкой', + 'Black & White' => 'Чёрно-белый', + 'Grayscale' => 'Оттенки Ñерого', + }, + }, + 'PixelIntensityRange' => 'Диапазон интенÑивноÑти пикÑелей (%)', + 'PixelMagicJBIGOptions' => 'Pixel Magic – Параметры JBIG', + 'PixelScale' => 'МаÑштаб пикÑелÑ', + 'PixelUnits' => { + Description => 'ПикÑельные единицы', + PrintConv => { + 'Unknown' => 'ÐеизвеÑтно', + 'meters' => 'Метры', + }, + }, + 'PixelsPerMeterX' => 'ПикÑелей на метр по X', + 'PixelsPerMeterY' => 'ПикÑелей на метр по Y', + 'PixelsPerUnitX' => 'ПикÑелей на единицу по X', + 'PixelsPerUnitY' => 'ПикÑелей на единицу по Y', + 'PlanarConfiguration' => { + Description => 'Принцип организации данных', + PrintConv => { + 'Chunky' => 'Ðепрерывный (RGBRGB)', + 'Planar' => 'По каналам (RRGGBB)', + }, + }, + 'Planes' => 'ПлоÑкоÑти', + 'PointSize' => 'Размер точки', + 'PopupFillAttributes' => 'Ðттрибуты Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ñплывающего окна', + 'PortraitVersion' => 'ÐŸÐ¾Ñ€Ñ‚Ñ€ÐµÑ‚Ð½Ð°Ñ Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ', + 'PoseHeadingDegrees' => 'Ðаправление по компаÑу Ð´Ð»Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð° Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (°)', + 'PosePitchDegrees' => 'Продольный наклон Ð´Ð»Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð° Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (°)', + 'PoseRollDegrees' => 'Поперечный наклон Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (°)', + 'PostScriptFontName' => 'PostScript название шрифта', + 'Pragma' => 'Контроль кÑшированиÑ', + 'Predictor' => { + Description => 'Предиктор', + PrintConv => { + 'Horizontal differencing' => 'Горизонтальное дифференцирование', + 'None' => 'Ðе иÑпользовалÑÑ', + }, + }, + 'PreferredFamily' => 'Предпочитаемое ÑемейÑтво шрифта', + 'PreferredSubfamily' => 'Предпочитаемый Ñтиль шрифта', + 'Prefs' => 'ÐаÑтройки', + 'PreservedSpecimen' => 'Сохраненный образец', + 'PreservedSpecimenMaterialSampleID' => 'ID материала Ñохранённого образца', + 'PresetWhiteBalance' => { + Description => 'ПредуÑтановка баланÑа белого', + PrintConv => { + 'Auto' => 'ÐвтоматичеÑкий', + 'Camera Setting' => 'ÐаÑтройка камеры', + 'Cloudy' => 'Облачно', + 'Color Temperature' => 'Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð°', + 'Cool White Fluorescent' => 'Холодный белый (флуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð°)', + 'Day Light Fluorescent' => 'Дневной Ñвет (флуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð°)', + 'Day White Fluorescent' => 'Дневной белый (флуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð°)', + 'Daylight' => 'Дневной Ñвет', + 'Flash' => 'Ð’Ñпышка', + 'Shade' => 'Тень', + 'Specify Gray Point' => 'Ð£ÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Ñерого', + 'Tungsten' => 'Лампа накаливаниÑ', + 'Warm White Fluorescent' => 'Тёплый белый (флуореÑÑ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ð»Ð°Ð¼Ð¿Ð°)', + }, + }, + 'PresetWhiteBalanceAdj' => 'ПредуÑтановка баланÑа белого', + 'Pressure' => 'Давление', + 'Preview' => 'ПредпроÑмотр', + 'PreviewApplicationName' => 'Файл предпроÑмотра – Ðазвание приложениÑ', + 'PreviewApplicationVersion' => 'Файл предпроÑмотра – ВерÑÐ¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ', + 'PreviewColorSpace' => { + Description => 'Файл предпроÑмотра – Цветовое проÑтранÑтво', + PrintConv => { + 'Unknown' => 'ÐеизвеÑтно', + }, + }, + 'PreviewCropBottom' => 'ПредпроÑмотр – Обрезка Ñнизу', + 'PreviewCropLeft' => 'ПредпроÑмотр – Обрезка Ñлева', + 'PreviewCropRight' => 'ПредпроÑмотр – Обрезка Ñправа', + 'PreviewCropTop' => 'ПредпроÑмотр – Обрезка Ñверху', + 'PreviewDateTime' => 'Файл предпроÑмотра – Дата и ВремÑ', + 'PreviewImage' => 'Файл предпроÑмотра', + 'PreviewImageLength' => 'Строк в файле предпроÑмотра', + 'PreviewImageSize' => 'Размер файла предпроÑмотра', + 'PreviewImageStart' => 'Смещение файла предпроÑмотра', + 'PreviewPDF' => 'Файл предпроÑмотра PDF', + 'PreviewPNG' => 'Файл предпроÑмотра PNG', + 'PreviewSettingsDigest' => 'Файл предпроÑмотра – Идентификатор параметров преобразованиÑ', + 'PreviewSettingsName' => 'Файл предпроÑмотра – Ðазвание параметров преобразованиÑ', + 'PreviewTIFF' => 'Файл предпроÑмотра TIFF', + 'PreviewWMF' => 'Файл предпроÑмотра WMF', + 'PrimaryChromaticities' => 'ЦветноÑÑ‚ÑŒ оÑновных цветов', + 'PrimaryFTP' => 'ОÑновной FTP', + 'PrintFlags' => 'Флаги печати', + 'PrintFlagsInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ флагах печати', + 'PrintIMVersion' => 'ВерÑÐ¸Ñ PrintIM', + 'PrintInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ печати', + 'PrintInfo2' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ печати 2', + 'PrintPosition' => 'Положение при печати', + 'PrintScale' => 'МаÑштаб при печати', + 'PrintStyle' => { + Description => 'Стиль печати', + PrintConv => { + 'Centered' => 'По центру', + 'Size to Fit' => 'Подогнать под формат лиÑта', + 'User Defined' => 'Определённый пользователем', + }, + }, + 'Priority' => 'Приоритет', + 'Private' => 'ЧаÑтный', + 'PrivateRTKInfo' => 'ЧаÑÑ‚Ð½Ð°Ñ Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ RTK', + 'ProTune' => { + PrintConv => { + 'Off' => 'Ðе включён', + 'On' => 'Включен', + }, + }, + 'ProcessingSoftware' => 'Редактировано в приложении', + 'ProcessingTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸', + 'ProdNotes' => 'КоличеÑтво заметок производителÑ', + 'ProducedDate' => 'Дата производÑтва', + 'Producer' => 'Производитель', + 'ProductID' => 'ID продукта', + 'ProductOrServiceConstraints' => 'ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° продукты или уÑлуги', + 'Profile' => 'Профиль', + 'Profile1AudioCodec' => 'Профиль 1 – Кодек аудио', + 'Profile1Height' => 'Профиль 1 – Ð’Ñ‹Ñота', + 'Profile1VideoCodec' => 'Профиль 1 – Кодек видео', + 'Profile1Width' => 'Профиль 1 – Ширина', + 'ProfileCalibrationSig' => 'Сигнатура калибровки профилÑ', + 'ProfileCopyright' => 'ÐвторÑкое право профилÑ', + 'ProfileDataOffset' => 'Смещение данных профилÑ', + 'ProfileEmbedPolicy' => { + Description => 'Политика Ð²Ð½ÐµÐ´Ñ€ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ', + PrintConv => { + 'Allow Copying' => 'Разрешено копирование', + 'Embed if Used' => 'Внедрить еÑли иÑпользуетÑÑ', + 'Never Embed' => 'Ðикогда не внедрÑÑ‚ÑŒ', + 'No Restrictions' => 'Без ограничений', + }, + }, + 'ProfileHueSatMapData1' => 'Профиль – Карта оттенков/наÑыщенноÑти – Данные 1', + 'ProfileHueSatMapData2' => 'Профиль – Карта оттенков/наÑыщенноÑти – Данные 2', + 'ProfileHueSatMapDims' => 'Профиль – Карта оттенков/наÑыщенноÑти – Затемнение', + 'ProfileHueSatMapEncoding' => { + Description => 'Профиль – Карта оттенков/наÑыщенноÑти – Кодирование', + PrintConv => { + 'Linear' => 'Линейное', + }, + }, + 'ProfileLookTableData' => 'Профиль – Таблица подÑтановки – Данные', + 'ProfileLookTableDims' => 'Профиль – Таблица подÑтановки – Затемнение', + 'ProfileLookTableEncoding' => { + Description => 'Профиль – Таблица подÑтановки – Кодирование', + PrintConv => { + 'Linear' => 'Линейное', + }, + }, + 'ProfileName' => 'Ðазвание профилÑ', + 'ProfileSize' => 'Размер профилÑ', + 'ProfileToneCurve' => 'Профиль – Ð¢Ð¾Ð½Ð¾Ð²Ð°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ', + 'ProfileType' => { + Description => 'Тип профилÑ', + PrintConv => { + 'Unspecified' => 'Ðе указан', + }, + }, + 'ProgID' => 'ID приложениÑ', + 'ProgramID' => 'ID программы', + 'ProgramMode' => { + Description => 'Режим программы', + PrintConv => { + 'Night Portrait' => 'Ðочной портрет', + 'None' => 'ОтÑутÑтвует', + 'Portrait' => 'Портрет', + 'Sports' => 'Спорт', + 'Sunset' => 'Закат', + 'Text' => 'ТекÑÑ‚', + }, + }, + 'ProgramVersion' => 'ВерÑÐ¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ', + 'ProgressiveScans' => { + Description => 'ПрогреÑÑивное Ñканирование', + PrintConv => { + '3 Scans' => '3 прохода', + '4 Scans' => '4 прохода', + '5 Scans' => '5 проходов', + }, + }, + 'Project' => 'Проект', + 'ProjectionType' => 'Тип проекции', + 'PropertyReleaseID' => 'ID ÑвойÑтв релиза', + 'PropertyReleaseStatus' => { + Description => 'Ð¡Ñ‚Ð°Ñ‚ÑƒÑ ÑвойÑтв релиза', + PrintConv => { + 'Limited or Incomplete Property Releases' => 'Ограниченные или неполные релизы', + 'None' => 'Ðе обозначено', + 'Not Applicable' => 'Ðе иÑпользуетÑÑ', + 'Unlimited Property Releases' => 'Ðеограниченные релизы ÑвойÑтв', + }, + }, + 'Protect' => 'Защита', + 'Provider' => 'ПоÑтавщик', + 'ProviderCopyright' => 'ПоÑтавщик – ÐвторÑкое право', + 'ProviderRating' => 'Провайдер – Рейтинг', + 'Province-State' => 'ОблаÑÑ‚ÑŒ/район', + 'PublishDate' => 'Дата публикации', + 'PublishDateStart' => 'Дата начала публикации', + 'Publisher' => 'Издатель', + 'PublisherLimit' => 'ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ', + 'PxShiftPeriphEdgeNR' => { + PrintConv => { + 'Off' => 'Ðе включён', + 'On' => 'Включен', + }, + }, + 'PyramidLevels' => 'Уровни пирамиды', + 'Quality' => { + Description => 'КачеÑтво', + PrintConv => { + '2 (Telephone)' => '2 (Телефон)', + '3 (Thumb)' => '3 (ЭÑкиз)', + '4 (Radio)' => '4 (Радио)', + '5 (Standard)' => '5 (Стандартное)', + '6 (Xtreme)' => '6 (ЭкÑтремальное)', + '7 (Insane)' => '7 (СумаÑшедшее)', + '8 (BrainDead)' => '8 (Полный улёт)', + 'Compressed RAW' => 'cRAW', + 'Compressed RAW + JPEG' => 'cRAW+JPEG', + 'Extra Fine' => 'СверхвыÑокое', + 'Fine' => 'Ð’Ñ‹Ñокое', + 'Low' => 'Ðизкое качеÑтво', + 'Normal' => 'Стандартное качеÑтво', + 'RAW + JPEG' => 'RAW+JPEG', + 'Standard' => 'Стандартное', + 'Unstable/Experimental' => 'ÐеÑтабильное/ЭкÑпериментальное', + }, + }, + 'QuantizationMethod' => { + Description => 'Метод квантованиÑ', + PrintConv => { + 'Color Space Specific' => 'Специфичное цветовое проÑтранÑтво', + 'Compression Method Specific' => 'Специфичный метод ÑжатиÑ', + 'Gamma Compensated' => 'КомпенÑÐ°Ñ†Ð¸Ñ Ð³Ð°Ð¼Ð¼Ñ‹', + 'Linear Density' => 'Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¿Ð»Ð¾Ñ‚Ð½Ð¾ÑÑ‚ÑŒ', + 'Linear Reflectance/Transmittance' => 'Линейное Отражение/ПропуÑкание', + }, + }, + 'QuickEdit' => 'БыÑтрое редактирование', + 'QuickMaskInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ быÑтрой маÑке', + 'QuickShot' => { + Description => 'БыÑтрый Ñнимок', + PrintConv => { + 'Off' => 'Ðе включён', + 'On' => 'Включен', + }, + }, + 'RAFVersion' => 'ВерÑÐ¸Ñ RAF', + 'RGBCurves' => 'Кривые RGB', + 'ROIDescription' => 'ОпиÑание ROI', + 'RPP' => 'Raw Photo Processor (RPP)', + 'RasterPadding' => { + Description => 'РаÑтровое заполнение', + PrintConv => { + 'Byte' => 'Байт', + 'Long Sector' => 'Длинный Ñектор', + 'Long Word' => 'Длинное Ñлово', + 'Sector' => 'Сектор', + 'Word' => 'Слово', + }, + }, + 'RasterizedCaption' => 'РаÑтрированное опиÑание', + 'Rate' => 'Темп', + 'Rating' => 'Рейтинг', + 'RatingPercent' => 'Рейтинг (%)', + 'RawCropBottom' => 'Raw – Обрезка Ñнизу', + 'RawCropLeft' => 'Raw – Обрезка Ñлева', + 'RawCropRight' => 'Raw – Обрезка Ñправа', + 'RawCropTop' => 'Raw – Обрезка Ñверху', + 'RawData' => 'Raw-данные', + 'RawDataLength' => 'Строк в Raw-данных', + 'RawDataOffset' => 'Смещение RAW-данных', + 'RawDataUniqueID' => 'Уникальный ID RAW-данных', + 'RawDepth' => 'Глубина Raw-изображениÑ', + 'RawFile' => 'RAW-файл', + 'RawFormat' => 'RAW-формат', + 'RawImageDigest' => 'Хеш-Ñумма RAW-изображениÑ', + 'RawImageMode' => 'Режим Raw-изображениÑ', + 'RawImageSegmentation' => 'Ð¡ÐµÐ³Ð¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ RAW-изображениÑ', + 'RawToPreviewGain' => 'КоÑффициент ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Raw и файлом предпроÑмотра', + 'Rawrppused' => 'ИÑпользовалÑÑ RPP', + 'RawzorCreatorVersion' => 'ВерÑÐ¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ', + 'RawzorRequiredVersion' => 'Ð¢Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑиÑ', + 'ReaderName' => 'Ðазвание проÑмотрщика', + 'ReaderRequirements' => 'Ð¢Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº ридеру', + 'RecEngineer' => 'Инженер', + 'RecLocation' => 'ЛокациÑ', + 'RecommendedExposureIndex' => 'Рекомендуемый Ð¸Ð½Ð´ÐµÐºÑ ÑкÑпозиции', + 'Record' => 'ЗапиÑÑŒ', + 'RecordBasisOfRecord' => 'ОÑнование запиÑи', + 'RecordCollectionCode' => 'Код/Ðазвание коллекции запиÑи', + 'RecordCollectionID' => 'ID коллекции запиÑи', + 'RecordDataGeneralizations' => 'Обобщение данных запиÑи', + 'RecordDatasetID' => 'ID базы данных запиÑи', + 'RecordDatasetName' => 'Ðазвание базы данных запиÑи', + 'RecordDynamicProperties' => 'ДинамичеÑкие ÑвойÑтва запиÑи', + 'RecordInformationWithheld' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ÑутÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð² запиÑи', + 'RecordInstitutionCode' => 'ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð·Ñ†Ð° или информации', + 'RecordInstitutionID' => 'ID организации Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð·Ñ†Ð° или информации', + 'RecordMode' => 'Режим запиÑи', + 'RecordOwnerInstitutionCode' => 'ОрганизациÑ-владелец образца или информации', + 'RecordShutterRelease' => { + Description => 'СпуÑк затвора при запиÑи', + PrintConv => { + 'Press start, press stop' => 'Ðажать «Старт», нажать «Стоп»', + 'Record while down' => 'ЗапиÑÑŒ пока нажата кнопка', + }, + }, + 'RecurrenceDateTimes' => 'Дата/Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð¸Ñ ÑобытиÑ', + 'RecurrenceID' => 'ID повторÑющегоÑÑ ÑобытиÑ', + 'RecurrenceRule' => 'Правило повторениÑ', + 'RedBalance' => 'Ð‘Ð°Ð»Ð°Ð½Ñ ÐºÑ€Ð°Ñного', + 'RedBlueFlatField' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð¿Ð»Ð¾Ñкого Ð¿Ð¾Ð»Ñ â€“ КраÑный и Синий', + 'RedEndpoint' => 'ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° КраÑного', + 'RedEyeReduction' => { + Description => 'Уменьшение Ñффекта краÑных глаз', + PrintConv => { + 'Off' => 'Ðе включено', + 'On' => 'Включено', + }, + }, + 'RedMask' => 'МаÑка КраÑного', + 'RedPrimary' => 'ОÑновной краÑный', + 'RedX' => 'КраÑный по X', + 'RedY' => 'КраÑный по Y', + 'RedcodeVersion' => 'ВерÑÐ¸Ñ Redcode', + 'ReductionMatrix1' => 'Матрица редукции 1', + 'ReductionMatrix2' => 'Матрица редукции 2', + 'ReelName' => 'Ðазвание ноÑÐ¸Ñ‚ÐµÐ»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸', + 'ReelNumber' => 'Ðомер запиÑи', + 'ReelTimecode' => 'Таймкод запиÑи', + 'Reference' => 'СÑылка', + 'ReferenceBlackWhite' => 'ИÑходные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‡Ñ‘Ñ€Ð½Ð¾Ð³Ð¾ и белого', + 'ReferenceDate' => 'Дата предыдущего конверта', + 'ReferenceNumber' => 'Ðомер предыдущего конверта', + 'ReferenceService' => 'СÑылка на предыдущий конверт', + 'Refresh' => 'Задержка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñтраницы', + 'RegionAppliedToDimensions' => 'Размеры Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ которых применÑлÑÑ Ñ€ÐµÐ³Ð¸Ð¾Ð½', + 'RegionAppliedToDimensionsH' => 'Ð’Ñ‹Ñота Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ которой применÑÐ»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½', + 'RegionAppliedToDimensionsUnit' => 'Единицы размеров изображениÑ', + 'RegionAppliedToDimensionsW' => 'Ширина Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ которой применÑÐ»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½', + 'RegionArea' => 'ОблаÑÑ‚ÑŒ региона', + 'RegionAreaD' => 'Диаметр круглой облаÑти', + 'RegionAreaH' => 'Ð’Ñ‹Ñота прÑмоугольной облаÑи', + 'RegionAreaUnit' => 'Единицы Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð¾Ð±Ð»Ð°Ñти', + 'RegionAreaW' => 'Ширина прÑмоугольной облаÑти', + 'RegionAreaX' => 'Координаты центра облаÑти по X', + 'RegionAreaY' => 'Координаты центра облаÑти по Y', + 'RegionBarCodeValue' => 'Значение штрихкода региона', + 'RegionConstraints' => 'Региональные ограничениÑ', + 'RegionDescription' => 'ОпиÑание региона', + 'RegionExtensions' => 'Дополнительное ÑвойÑтво региона', + 'RegionFocusUsage' => { + Description => 'ИÑпользование фокуÑа', + PrintConv => { + 'Evaluated, Not Used' => 'УчитывалÑÑ, но не иÑпользовалÑÑ', + 'Evaluated, Used' => 'УчитывалÑÑ Ð¸ иÑпользовалÑÑ', + 'Not Evaluated, Not Used' => 'Ðе учитывалÑÑ Ð¸ не иÑпользовалÑÑ', + }, + }, + 'RegionInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± регионе', + 'RegionInfoDateRegionsValid' => 'Дата ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñледнего региона', + 'RegionInfoMP' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ регионе в Microsoft Photo', + 'RegionInfoRegions' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ регионах', + 'RegionList' => 'СпиÑок Ñтруктуры регионов', + 'RegionName' => 'Ðазвание региона', + 'RegionPersonDisplayName' => 'Ð˜Ð¼Ñ Ñ‡ÐµÐ»Ð¾Ð²ÐµÐºÐ° отмеченное регионом', + 'RegionPersonEmailDigest' => 'Хеш-Ñумма Ñлектронной почты Windows Live пользователÑ', + 'RegionPersonLiveIdCID' => 'ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Windows Live CID', + 'RegionPersonSourceID' => 'ИÑходный ID пользователÑ', + 'RegionRectangle' => 'ПрÑмоугольник региона', + 'RegionRotation' => 'Вращение региона', + 'RegionSeeAlso' => 'Смотрите также', + 'RegionType' => { + Description => 'Тип региона', + PrintConv => { + 'BarCode' => 'Штрихкод', + 'Face' => 'Лицо', + 'Focus' => 'ФокуÑ', + 'Pet' => 'Животное', + }, + }, + 'RegionXformTackPoint' => 'Точки-модификаторы облаÑти Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Xform', + 'RelatedImageFileFormat' => 'Формат файла ÑвÑзанного изображениÑ', + 'RelatedImageHeight' => 'Ð’Ñ‹Ñота ÑвÑзанного изображениÑ', + 'RelatedImageWidth' => 'Ширина ÑвÑзанного изображениÑ', + 'RelatedResourceID' => 'ID ÑвÑзанного реÑурÑа', + 'RelatedSoundFile' => 'СвÑзанный аудиофайл', + 'RelatedTo' => 'ОтноÑитÑÑ Ðº', + 'Relation' => 'СÑылка на ÑвÑзанный реÑурÑ', + 'RelationshipAccordingTo' => 'СвÑзь между реÑурÑами Ñоздал', + 'RelationshipEstablishedDate' => 'Дата ÑвÑзи между реÑурÑами', + 'RelationshipOfResource' => 'СвÑзь реÑурÑов', + 'RelationshipRemarks' => 'Комментарии к ÑвÑзи реÑурÑов', + 'RelativeAltitude' => 'ОтноÑÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота', + 'RelativePath' => 'ОтноÑительный путь', + 'ReleaseDate' => 'Дата публикации', + 'ReleaseTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸', + 'RemoveHistoryDuplicates' => 'Удалить иÑторию дубликатов', + 'RenderingIntent' => { + Description => 'Методы цветового преобразованиÑ', + PrintConv => { + 'Absolute Colorimetric (LCS_GM_ABS_COLORIMETRIC)' => 'ÐбÑолютный колориметричеÑкий (LCS_GM_ABS_COLORIMETRIC)', + 'Graphic (LCS_GM_BUSINESS)' => 'По наÑыщенноÑти (LCS_GM_BUSINESS)', + 'Picture (LCS_GM_IMAGES)' => 'Перцепционный (LCS_GM_IMAGES)', + 'Proof (LCS_GM_GRAPHICS)' => 'ОтноÑительный колориметричеÑкий (LCS_GM_GRAPHICS)', + }, + }, + 'RenderingTransform' => 'Преобразование цвета', + 'RentalExpirationDate' => 'Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð°Ñ€ÐµÐ½Ð´Ñ‹', + 'RentalFlag' => 'Флаг аренды', + 'Repeat' => 'КоличеÑтво повторов', + 'ReplayGainAlbumGain' => 'Replay Gain – ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾Ñти альбома', + 'ReplayGainAlbumPeak' => 'Replay Gain – Пиковый уровень альбома', + 'ReplayGainTrackGain' => 'Replay Gain – ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾Ñти трека', + 'ReplayGainTrackPeak' => 'Replay Gain – Пиковый уровень трека', + 'ReplyTo' => 'E-Mail вебмаÑтера', + 'RepresentativeDisparityFar' => 'Ð ÐµÐ¿Ñ€ÐµÐ·ÐµÐ½Ñ‚Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ð½ÐµÑоглаÑованноÑÑ‚ÑŒ – Вдали', + 'RepresentativeDisparityNear' => 'Ð ÐµÐ¿Ñ€ÐµÐ·ÐµÐ½Ñ‚Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ð½ÐµÑоглаÑованноÑÑ‚ÑŒ – РÑдом', + 'RepresentativeImage' => { + Description => 'Репрезентативное изображение', + PrintConv => { + 'Left Viewpoint' => 'Ð›ÐµÐ²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° проÑмотра', + 'Right Viewpoint' => 'ÐŸÑ€Ð°Ð²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° проÑмотра', + }, + }, + 'RequestID' => 'ID запрÑа', + 'RequestStatus' => 'Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ð¿Ñ€Ð¾Ñа', + 'Resaved' => { + Description => 'Повторное Ñохранение', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'Reserved5' => 'Зарезервировано 5', + 'Resolution' => 'Разрешение изображениÑ', + 'ResolutionUnit' => { + Description => 'Единицы Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾ X и Y', + PrintConv => { + 'None' => 'Ðе указаны', + 'cm' => 'Ñм', + 'inches' => 'дюймы', + }, + }, + 'ResourceCount' => 'КоличеÑтво реÑурÑов', + 'ResourceForkSize' => 'Размер Ñ€Ð°Ð·Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ñ€ÐµÑурÑа', + 'ResourceID' => 'ID реÑурÑа', + 'ResourceRelationship' => 'СвÑзи реÑурÑов', + 'ResourceRelationshipID' => 'ID ÑвÑзи между реÑурÑами', + 'ResourceType' => 'Тип реÑурÑа', + 'Resources' => 'РеÑурÑÑ‹', + 'RetailPrice' => 'Ð Ð¾Ð·Ð½Ð¸Ñ‡Ð½Ð°Ñ Ñ†ÐµÐ½Ð°', + 'RetailPriceCurrency' => 'Валюта розничной цены', + 'Reuse' => { + Description => 'Повторное иÑпользование', + PrintConv => { + 'Not Applicable' => 'Запрещено', + 'Repeat Use' => 'Разрешено', + }, + }, + 'Review' => 'Обзор', + 'Revision' => 'Дата Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ vCard', + 'RevisionDate' => 'Дата ревизии', + 'RevisionNumber' => 'КоличеÑтво редакций файла', + 'RevisitAfter' => 'Повторно поÑетить через', + 'RicohPitch' => 'Ricoh – Тангаж (Ðаклон)', + 'RicohRoll' => 'Ricoh – Крен (Вращение)', + 'RightAlbedo' => 'Правильное ÑтереоÑкопичеÑкое изображение', + 'Rights' => 'Права', + 'Robots' => 'Политика обработки Ñтраницы роботами', + 'Roll' => 'Крен (Вращение)', + 'RollAngle' => 'Угол Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ (Крен)', + 'RootDirectoryCreateDate' => 'Дата ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ñ€Ð½ÐµÐ²Ð¾Ð³Ð¾ каталога', + 'Rotation' => 'Вращение', + 'RoundTripVersion' => 'ВерÑÐ¸Ñ Round Trip', + 'Routing' => 'Роутинг', + 'RoutingDestinations' => 'Ðазначение маршрутизации', + 'RoutingExclusions' => 'ИÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ð¸', + 'RowInterleaveFactor' => 'КоÑффициент Ñ‡ÐµÑ€ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтрок', + 'RowsPerStrip' => 'КоличеÑтво Ñтрок на полоÑу', + 'RtkFlag' => 'Rtk – Флаг', + 'RtkStdHgt' => 'Rtk – Стандартное отклонение выÑоты', + 'RtkStdLat' => 'Rtk – Стандартное отклонение широты', + 'RtkStdLon' => 'Rtk – Стандартное отклонение долготы', + 'RunTimeEpoch' => 'Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ â€“ Ðомер Ñпохи', + 'RunTimeFlags' => { + Description => 'Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ â€“ Флаги', + PrintConv => { + 'Has been rounded' => 'Округленное времÑ', + 'Indefinite' => 'Ðеопределённое времÑ', + 'Negative infinity' => 'ÐœÐ¸Ð½ÑƒÑ Ð±ÐµÑконечноÑÑ‚ÑŒ', + 'Positive infinity' => 'ÐŸÐ»ÑŽÑ Ð±ÐµÑконечноÑÑ‚ÑŒ', + 'Valid' => 'ДейÑтвительное времÑ', + }, + }, + 'RunTimeScale' => 'Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ â€“ Шкала времени', + 'RunTimeSincePowerUp' => 'Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° включениÑ', + 'RunTimeValue' => 'Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ â€“ Значение', + 'RunWindow' => { + Description => 'ЗапуÑтить окно', + PrintConv => { + 'Hide' => 'Скрытый', + 'Minimized' => 'Минимизировать', + 'Normal' => 'Обычный', + 'Restore' => 'ВоÑÑтановить', + 'Show' => 'Показывать', + 'Show Default' => 'Отображать по-умолчанию', + 'Show Maximized' => 'Отображать развёрнутым', + 'Show Minimized' => 'Отображать Ñвернутым', + 'Show Minimized No Activate' => 'Отображать Ñвернутым и не активвным', + 'Show No Activate' => 'Отображать', + }, + }, + 'SEMInfo' => 'SEM – ОпиÑание', + 'SIUnits' => 'Единицы SI', + 'SMaxSampleValue' => 'МакÑимальное значение компонента', + 'SMinSampleValue' => 'Минимальное значение компонента', + 'SRGBRendering' => { + Description => 'SRGB-рендеринг', + PrintConv => { + 'Absolute Colorimetric' => 'ÐбÑолютно колориметричеÑкий', + 'Perceptual' => 'Перцепционный', + 'Relative Colorimetric' => 'ОтноÑительно колориметричеÑкий', + 'Saturation' => 'ÐаÑыщенный', + }, + }, + 'SRawType' => 'Тип SRaw', + 'SampleFlag' => 'Флаг образца', + 'SampleFormat' => { + Description => 'Формат компонента', + PrintConv => { + 'Complex float' => 'КомплекÑные данные Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой IEEE', + 'Complex int' => 'КомплекÑные целые данные', + 'Float' => 'Данные Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой IEEE', + 'Signed' => 'ЦелочиÑленные данные Ñо знаком', + 'Undefined' => 'Ðеопределенный формат данных', + 'Unsigned' => 'Беззнаковые целочиÑленные данные', + }, + }, + 'SampleRate' => 'ЧаÑтота диÑкретизации', + 'SampleRate2' => 'ЧаÑтота диÑкретизации 2', + 'SampleSize' => 'Размер', + 'SampleStructure' => { + Description => 'Структура компонента', + PrintConv => { + 'CompressionDependent' => 'ЗавиÑÐ¸Ð¼Ð°Ñ Ð¾Ñ‚ ÑжатиÑ', + 'Orthogonal4-2-2Sampling' => 'ÐžÑ€Ñ‚Ð¾Ð³Ð¾Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ñ Ñ‡Ð°Ñтотами диÑкретизации в Ñоотношении 4: 2: 2: (4)', + 'OrthogonalConstangSampling' => 'ÐžÑ€Ñ‚Ð¾Ð³Ð¾Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ñ Ñ‚ÐµÐ¼Ð¸ же отноÑительными чаÑтотами диÑкретизации в каждом компоненте', + }, + }, + 'SampleText' => 'Пример текÑта', + 'SamplesPerPixel' => 'КоличеÑтво компонентов на пикÑель', + 'SamsungRawByteOrder' => 'Samsung RAW – ПорÑдок байтов', + 'SamsungRawPointersLength' => 'Samsung RAW – Длина указателей', + 'SamsungRawPointersOffset' => 'Samsung RAW – Смещение указателей', + 'SamsungRawUnknown' => 'Samsung RAW – ÐеизвеÑтно', + 'SanyoQuality' => { + Description => 'Sanyo – КачеÑтво', + PrintConv => { + 'Fine/High' => 'Хорошее/Ð’Ñ‹Ñокое', + 'Fine/Low' => 'Хорошее/Ðизкое', + 'Fine/Medium' => 'Хорошее/Среднее', + 'Fine/Medium High' => 'Хорошее/Выше Ñреднего', + 'Fine/Medium Low' => 'Хорошее/Ðиже Ñреднего', + 'Fine/Super High' => 'Хорошее/Лучшее', + 'Fine/Very High' => 'Хорошее/Очень выÑокое', + 'Fine/Very Low' => 'Хорошее/Очень низкое', + 'Normal/High' => 'Ðормальное/Ð’Ñ‹Ñокое', + 'Normal/Low' => 'Ðормальное/Ðизкое', + 'Normal/Medium' => 'Ðормальное/Среднее', + 'Normal/Medium High' => 'Ðормальное/Выше Ñреднего', + 'Normal/Medium Low' => 'Ðормальное/Ðиже Ñреднего', + 'Normal/Super High' => 'Ðормальное/Лучшее', + 'Normal/Very High' => 'Ðормальное/Очень выÑокое', + 'Normal/Very Low' => 'Ðормальное/Очень низкое', + 'Super Fine/High' => 'Лучшее/Ð’Ñ‹Ñокое', + 'Super Fine/Low' => 'Лучшее/Ðизкое', + 'Super Fine/Medium' => 'Лучшее/Среднее', + 'Super Fine/Medium High' => 'Лучшее/Выше Ñреднего', + 'Super Fine/Medium Low' => 'Лучшее/Ðиже Ñреднего', + 'Super Fine/Super High' => 'Лучшее/Лучшее', + 'Super Fine/Very High' => 'Лучшее/Очень выÑокое', + 'Super Fine/Very Low' => 'Лучшее/Очень низкое', + }, + }, + 'SanyoThumbnail' => 'Sanyo – Миниатюра', + 'Saturation' => { + Description => 'ÐаÑыщенноÑÑ‚ÑŒ', + PrintConv => { + 'High' => 'Ð’Ñ‹ÑокаÑ', + 'Low' => 'ÐизкаÑ', + 'Normal' => 'СтандартнаÑ', + }, + }, + 'SaturationAdj' => 'Регулировка наÑыщенноÑти', + 'ScaleFactor' => 'КоÑффициент маÑштабированиÑ', + 'ScaleFactor35efl' => 'КоÑффициент маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº 35-мм формату', + 'ScaledIMU' => 'МаÑштабируемый IMU', + 'ScaledPressure' => 'ВычиÑленное давление', + 'ScalingFactor' => 'КоÑффициент маÑштабированиÑ', + 'ScanningDirection' => { + Description => 'Ðаправление ÑканированиÑ', + PrintConv => { + 'Bottom-Top, L-R' => 'Снизу вверх, Ñлева направо', + 'Bottom-Top, R-L' => 'Снизу вверх, Ñправа налево', + 'L-R, Bottom-Top' => 'Слева направо, Ñнизу вверх', + 'L-R, Top-Bottom' => 'Слева направо, Ñверху вниз', + 'R-L, Bottom-Top' => 'Справа налево, Ñнизу вверх', + 'R-L, Top-Bottom' => 'Справа налево, Ñверху вниз', + 'Top-Bottom, L-R' => 'Сверху вниз, Ñлева направо', + 'Top-Bottom, R-L' => 'Сверху вниз, Ñправа налево', + }, + }, + 'Scene' => 'Ðомер изображениÑ', + 'SceneCaptureType' => { + Description => 'Тип Ñнимаемой Ñцены', + PrintConv => { + 'Landscape' => 'Пейзаж', + 'Night' => 'ÐÐ¾Ñ‡Ð½Ð°Ñ Ñъёмка', + 'Other' => 'Другой', + 'Portrait' => 'Портрет', + 'Standard' => 'Стандартный режим', + }, + }, + 'SceneMode' => { + Description => 'Выбор Ñцены', + PrintConv => { + '3D Sweep Panorama' => '3D', + 'Anti Motion Blur' => 'УÑтранение ÑмазываниÑ', + 'Auto' => 'Ðвто', + 'Cont. Priority AE' => 'ÐвтоÑкÑÐ¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ñ Ð¿Ñ€Ð¸Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚Ð¾Ð¼ Ñерийной Ñъёмки', + 'Handheld Night Shot' => 'ÐÐ¾Ñ‡Ð½Ð°Ñ Ñъёмка Ñ Ñ€ÑƒÐº', + 'Landscape' => 'Пейзаж', + 'Macro' => 'МакроÑъёмка', + 'Night Portrait' => 'Ðочной портрет', + 'Night Scene' => 'Ðочной вид', + 'Night View/Portrait' => 'Ðочной вид/портрет', + 'Portrait' => 'Портрет', + 'Sports' => 'Спортивные Ñцены', + 'Sunset' => 'Закат', + 'Sweep Panorama' => 'Панорамный обзор', + }, + }, + 'SceneSelect' => { + Description => 'Выбор Ñцены', + PrintConv => { + 'Lamp' => 'Лампа', + 'Night' => 'Ðочь', + 'Off' => 'Ðе задейÑтвован', + 'Sport' => 'Спорт', + 'User 1' => 'ПользовательÑÐºÐ°Ñ 1', + 'User 2' => 'ПользовательÑÐºÐ°Ñ 2', + }, + }, + 'SceneType' => { + Description => 'Тип Ñцены', + PrintConv => { + 'Directly photographed' => 'Сфотографировано цифровой камерой', + }, + }, + 'School' => 'Школа', + 'ScreenBufferSize' => 'Размер буфера Ñкрана', + 'ScreenHeight' => 'Ð’Ñ‹Ñота Ñкрана', + 'ScreenWidth' => 'Ширина Ñкрана', + 'ScreenWindowCenter' => 'Окно по центру Ñкрана', + 'ScreenWindowWidth' => 'Окно по ширине Ñкрана', + 'SecondaryFTP' => 'Дополнительный FTP', + 'SecurityClassification' => { + Description => 'КлаÑÑÐ¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑти', + PrintConv => { + 'Confidential' => 'Личное', + 'Restricted' => 'Ð”Ð»Ñ ÑƒÐ·ÐºÐ¾Ð³Ð¾ круга', + 'Secret' => 'Секретно', + 'Top Secret' => 'Совершенно Ñекретно', + 'Unclassified' => 'Без клаÑÑификации', + }, + }, + 'SeekTable' => 'Таблица поиÑка', + 'SelfData' => 'СобÑтвенные данные', + 'SelfTimer' => { + Description => 'Режим автоÑпуÑка затвора', + PrintConv => { + 'Off' => 'Ðе задейÑтвован', + 'On' => 'Включен', + }, + }, + 'SelfTimerMode' => 'Режим таймера ÑпуÑка затвора', + 'SensingMethod' => { + Description => 'Тип датчика', + PrintConv => { + 'Color sequential area' => 'Цветной поÑледовательный ÑенÑор', + 'Color sequential linear' => 'Цветной поÑледовательный линейный ÑенÑор', + 'Monochrome area' => 'Монохромный ÑенÑор', + 'Monochrome linear' => 'Монохромный линейный ÑенÑор', + 'Not defined' => 'Ðе опредеен', + 'One-chip color area' => 'Одночиповый цветной ÑенÑор', + 'Three-chip color area' => 'Трехчиповый цветной ÑенÑор', + 'Trilinear' => 'Трехлинейный цветной ÑенÑор', + 'Two-chip color area' => 'Двухчиповый цветной ÑенÑор', + }, + }, + 'SensitivityType' => { + Description => 'Тип чувÑтвительноÑти', + PrintConv => { + 'ISO Speed' => 'ЧувÑтвительноÑÑ‚ÑŒ ISO', + 'Recommended Exposure Index' => 'Рекомендуемый Ð¸Ð½Ð´ÐµÐºÑ ÑкÑпозиции', + 'Recommended Exposure Index and ISO Speed' => 'Рекомендуемый Ð¸Ð½Ð´ÐµÐºÑ ÑкÑпозиции и ISO', + 'Standard Output Sensitivity' => 'Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð°Ñ Ñ‡ÑƒÐ²ÑтвительноÑÑ‚ÑŒ', + 'Standard Output Sensitivity and ISO Speed' => 'Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð°Ñ Ñ‡ÑƒÐ²ÑтвительноÑÑ‚ÑŒ и ISO', + 'Standard Output Sensitivity and Recommended Exposure Index' => 'Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð°Ñ Ñ‡ÑƒÐ²ÑтвительноÑÑ‚ÑŒ и рекомендуемый Ð¸Ð½Ð´ÐµÐºÑ ÑкÑпозиции', + 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed' => 'Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð°Ñ Ñ‡ÑƒÐ²ÑтвительноÑÑ‚ÑŒ и рекомендуемый Ð¸Ð½Ð´ÐµÐºÑ ÑкÑпозиции и ISO', + 'Unknown' => 'ÐеизвеÑтно', + }, + }, + 'Sensor' => 'СенÑор', + 'SensorBottomBorder' => 'ÐижнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° ÑенÑора', + 'SensorCalibration_0x0404' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ ÑенÑора 0x0404', + 'SensorCalibration_0x0405' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ ÑенÑора 0x0405', + 'SensorCalibration_0x0406' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ ÑенÑора 0x0406', + 'SensorCalibration_0x0408' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ ÑенÑора 0x0408', + 'SensorCalibration_0x040f' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ ÑенÑора 0x040f', + 'SensorCalibration_0x0413' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ ÑенÑора 0x0413', + 'SensorCalibration_0x0414' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ ÑенÑора 0x0414', + 'SensorCalibration_0x0418' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ ÑенÑора 0x0418', + 'SensorCalibration_0x041c' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ ÑенÑора 0x041c', + 'SensorCalibration_0x041e' => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ ÑенÑора 0x041e', + 'SensorDefects' => 'Дефекты ÑенÑора', + 'SensorHeight' => 'Ð’Ñ‹Ñота ÑенÑора', + 'SensorLeftBorder' => 'Ð›ÐµÐ²Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° ÑенÑора', + 'SensorLeftMargin' => 'Матрица – ОтÑтуп Ñлева', + 'SensorRightBorder' => 'ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° ÑенÑора', + 'SensorSerialNumber' => 'Серийный номер ÑенÑора', + 'SensorTemperature' => 'Датчик температуры', + 'SensorTemperature2' => 'Датчик температуры 2', + 'SensorTopBorder' => 'ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° ÑенÑора', + 'SensorTopMargin' => 'Матрица – ОтÑтуп Ñправа', + 'SensorWidth' => 'Ширина ÑенÑора', + 'Sequence' => 'ПоÑледовательноÑÑ‚ÑŒ', + 'SequenceNumber' => 'ПорÑдковый номер', + 'SequenceShotInterval' => { + Description => 'Интервал поÑледовательных Ñнимков', + PrintConv => { + '10 frames/s' => '10 кадров/Ñ', + '15 frames/s' => '15 кадров/Ñ', + '20 frames/s' => '20 кадров/Ñ', + '5 frames/s' => '5 кадров/Ñ', + }, + }, + 'SequentialShot' => { + Description => 'ПоÑледовательноÑÑ‚ÑŒ Ñнимков', + PrintConv => { + 'Adjust Exposure' => 'По Ñдвигу ÑкÑпозиции', + 'Best' => 'Лучший Ñнимок', + 'None' => 'Ðет', + 'Standard' => 'СтандартнаÑ', + }, + }, + 'SerialNumber' => 'Серийный номер камеры', + 'Series' => 'СериÑ', + 'SeriesDateTime' => 'Дата Ñерии', + 'SeriesDescription' => 'ОпиÑание Ñрии', + 'SeriesModality' => 'МодальноÑÑ‚ÑŒ Ñерии', + 'SeriesNumber' => 'Ðомер Ñерии', + 'ServiceID' => 'ID ÑервиÑа', + 'ServiceIdentifier' => 'Идентификатор поÑтавщика и продукта', + 'SetCookie' => 'ÐаÑтройки cookie', + 'ShadingCompensation' => 'УÑтранение теней', + 'ShadowScale' => 'Диапазон теней', + 'Shadows' => 'Тени', + 'ShadowsAdj' => 'Регулировка теней', + 'SharedData' => 'Общие данные', + 'Sharpness' => { + Description => 'РезкоÑÑ‚ÑŒ', + PrintConv => { + 'Hard' => 'СильнаÑ', + 'Normal' => 'СтандартнаÑ', + 'Soft' => 'СлабаÑ', + }, + }, + 'SharpnessAdj' => 'Регулировка резкоÑтти', + 'SharpnessOvershoot' => 'РезкоÑÑ‚ÑŒ – Положительное отклонение', + 'SharpnessThreshold' => 'РезкоÑÑ‚ÑŒ – Порог', + 'SharpnessUndershoot' => 'РезкоÑÑ‚ÑŒ – Отрицательное отклонение', + 'ShootingCount' => 'КоличеÑтво Ñнимков Ñ Ð¾Ð±ÐµÐ¸Ñ… точек проÑмотра', + 'ShootingMode' => 'Режим Ñъёмки', + 'ShortDocumentID' => 'Краткий ID документа', + 'ShutterCurtainHack' => { + Description => 'Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ ÑˆÑ‚Ð¾Ñ€ÐºÐ¸ затвора', + PrintConv => { + '1st-curtain sync' => 'Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ð¾ 1-й шторке', + '2nd-curtain sync' => 'Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ð¾ 2-й шторке', + }, + }, + 'ShutterSpeed' => 'СкороÑÑ‚ÑŒ ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ñ‚Ð²Ð¾Ñ€Ð°', + 'ShutterSpeedValue' => 'СкороÑÑ‚ÑŒ ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ñ‚Ð²Ð¾Ñ€Ð°', + 'Sidebars' => 'КоличеÑтво боковых панелей', + 'SidecarForExtension' => 'РаÑширение файла', + 'Signature' => 'ПодпиÑÑŒ', + 'SignatureUsageRights' => 'Права на иÑпользование ПодпиÑи', + 'SignerContactInfo' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ – ÐšÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ', + 'SignificantBits' => 'Старшие биты', + 'SigningAuthority' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ – Орган', + 'SigningDate' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ – Дата подпиÑи', + 'SigningLocation' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ – МеÑтоположение', + 'SigningReason' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ – Причина подпиÑаниÑ', + 'SimilarityIndex' => 'Ð˜Ð½Ð´ÐµÐºÑ ÑходÑтва', + 'Site' => 'Сайт', + 'SiteEnter' => 'Эффект при заходе на Ñайт', + 'SiteExit' => 'Эффект при уходе Ñ Ñайта', + 'SizeMode' => { + Description => 'Режим размера', + PrintConv => { + 'Size Known' => 'Размер извеÑтный', + 'Size Not Known' => 'Размер не извеÑтен', + }, + }, + 'SlateInformation' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Slate', + 'SlicesGroupName' => 'Ðазвание группы фрагментов', + 'Smoothness' => 'Сглаживание', + 'Snapshots' => 'Скриншоты', + 'SocTemperature' => 'Температура на чипе (Soc)', + 'SocialProfile' => 'Социальный профиль', + 'Software' => { + Description => 'Приложение', + PrintConv => { + 'PC Paintbrush 2.8 (with palette)' => 'PC Paintbrush 2.8 (Ñ Ð¿Ð°Ð»Ð¸Ñ‚Ñ€Ð¾Ð¹)', + 'PC Paintbrush 2.8 (without palette)' => 'PC Paintbrush 2.8 (без палитры)', + 'PC Paintbrush for Windows' => 'PC Paintbrush Ð´Ð»Ñ Windows', + }, + }, + 'SoftwareVersion' => 'ВерÑÐ¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ', + 'SonyCropSize' => 'Sony – Размер рамки кадрированиÑ', + 'SonyCropTopLeft' => 'Sony – Верхний левый угол рамки кадрированиÑ', + 'SonyRawFileType' => { + Description => 'Sony – Тип RAW-файла', + PrintConv => { + 'Sony Compressed RAW' => 'Sony – Ñжатый RAW', + 'Sony Lossless Compressed RAW' => 'Sony – Ñжатый без потерь RAW', + 'Sony Uncompressed 12-bit RAW' => 'Sony – 12-битный неÑжатый RAW', + 'Sony Uncompressed 14-bit RAW' => 'Sony – 14-битный неÑжатый RAW', + }, + }, + 'SonyToneCurve' => 'Sony – Ð¢Ð¾Ð½Ð¾Ð²Ð°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ', + 'Sound' => 'ЗвукозапиÑÑŒ', + 'Source' => 'ИÑточник', + 'SourceCount' => 'КоличеÑтво иÑпользованых камер', + 'SourceCreateDate' => 'ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° ÑозданиÑ', + 'SourceData' => 'ИÑходные данные', + 'SourceDate' => 'Дата публикации', + 'SourceEdition' => 'Печатное издание', + 'SourceFileName' => 'Ðазвание иÑходного файла', + 'SourcePhotosCount' => 'КоличеÑтво иÑходных изображений', + 'SourcePublisher' => 'ИздательÑтво', + 'SourceRights' => 'Права печатного изданиÑ', + 'SourceTitle' => 'Ðазвание издательÑтва', + 'SpatialFrequencyResponse' => 'Отклик проÑтранÑтвенной чаÑтоты', + 'SpatialResolution' => 'ПроÑтранÑтвенное разрешение', + 'SpecialInstructions' => 'Специальные указаниÑ', + 'SpecialMode' => 'Специальный режим', + 'SpecialTypeID' => 'ID Ñпециального типа', + 'SpectralSensitivity' => 'Ð¡Ð¿ÐµÐºÑ‚Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‡ÑƒÐ²ÑтвительноÑÑ‚ÑŒ', + 'SpeedX' => 'СкороÑÑ‚ÑŒ по оÑи X', + 'SpeedY' => 'СкороÑÑ‚ÑŒ по оÑи Y', + 'SpeedZ' => 'СкороÑÑ‚ÑŒ по оÑи Z', + 'Spherical' => 'СферичеÑкое видео', + 'SplitColumn' => 'Ð Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ°', + 'SpotHalftone' => 'Точка полутона', + 'StandardOutputSensitivity' => 'Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð°Ñ Ñ‡ÑƒÐ²ÑтвительноÑÑ‚ÑŒ', + 'StartEdgeCode' => 'Edge код Ñтарта', + 'StartReading' => 'Ðачало чтениÑ', + 'StartTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°', + 'StartTimecode' => 'Таймкод Ñтарта', + 'State' => 'ОблаÑÑ‚ÑŒ', + 'Status' => 'СтатуÑ', + 'Stereo' => 'Стерео', + 'StereoMode' => 'Режим Ñтерео', + 'StimVersion' => 'ВерÑÐ¸Ñ Stim', + 'Stitched' => 'Ð¡ÑˆÐ¸Ñ‚Ð°Ñ Ð²Ð¸Ð´ÐµÐ¾Ð¿Ð°Ð½Ð¾Ñ€Ð°Ð¼Ð°', + 'StitchingSoftware' => 'Сшито в программе', + 'StoNits' => 'ОÑвещенноÑÑ‚ÑŒ (коÑффициент переÑчета кд/м2)', + 'StorageFormatDate' => 'ПамÑÑ‚ÑŒ – Дата форматированиÑ', + 'StorageFormatTime' => 'ПамÑÑ‚ÑŒ – Ð’Ñ€ÐµÐ¼Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ', + 'StorageMethod' => 'СпоÑоб хранениÑ', + 'StorageModel' => 'ПамÑÑ‚ÑŒ – Модель', + 'StorageSerialNumber' => 'ПамÑÑ‚ÑŒ – Серийный номер', + 'StorageType' => 'ПамÑÑ‚ÑŒ – Тип', + 'StreamAvgBitrate' => 'Средний битрейт потока', + 'StreamAvgPacketSize' => 'Размер Ñреднего битрейта потока', + 'StreamDuration' => 'ПродолжительноÑÑ‚ÑŒ потока', + 'StreamMaxBitrate' => 'МакÑимальный битрейт потока', + 'StreamMaxPacketSize' => 'Размер макÑимального битрейта потока', + 'StreamMimeLen' => 'Mime потока Len', + 'StreamMimeType' => 'Mime-тип потока', + 'StreamName' => 'Ðазвание потока', + 'StreamNameLen' => 'Ðазвание потока Len', + 'StreamNumber' => 'Ðомер потока', + 'StreamPreroll' => 'Предварительный проÑмотр потока', + 'StreamStartTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° потока', + 'StreamType' => 'Тип потока', + 'Strikeout' => 'Перечёркнутый', + 'StripByteCounts' => 'КоличеÑтво байт на полоÑу', + 'StripOffsets' => 'Смещение Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ полоÑÑ‹ изображениÑ', + 'StripRowCounts' => 'КоличеÑтво полоÑ', + 'StrobeTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ñтроба', + 'StructureType' => 'Тип конÑтрукции', + 'StudyDateTime' => 'Дата обÑледованиÑ', + 'StudyDescription' => 'ОпиÑание обÑледованиÑ', + 'StudyID' => 'ID иÑÑледованиÑ', + 'StudyPhysician' => 'Врач проводивший обÑледование', + 'Sub-location' => 'МеÑтоположение в городе', + 'SubFile' => 'Подфайл', + 'SubPacketH' => 'Субпакет H', + 'SubPacketSize' => 'Размер Ñубпакета', + 'SubSecCreateDate' => 'Дата, Ð²Ñ€ÐµÐ¼Ñ Ð¸ милиÑекунды ÑозданиÑ', + 'SubSecDateTimeOriginal' => 'ИÑходные дата, Ð²Ñ€ÐµÐ¼Ñ Ð¸ милиÑекунды ÑозданиÑ', + 'SubSecModifyDate' => 'Дата, Ð²Ñ€ÐµÐ¼Ñ Ð¸ милиÑекунды редактированиÑ', + 'SubSecTime' => 'Ð’Ñ€ÐµÐ¼Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² милиÑекундах', + 'SubSecTimeDigitized' => 'Ð’Ñ€ÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° в милиÑекундах', + 'SubSecTimeOriginal' => 'Ð’Ñ€ÐµÐ¼Ñ Ñъёмки в милиÑекундах', + 'SubTileBlockSize' => 'Размер блока подзаголовка', + 'SubfileType' => { + Description => 'Тип подфайла', + PrintConv => { + 'Alternate reduced-resolution image' => 'Ðльтернативное изображение Ñ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ñ‹Ð¼ разрешением', + 'Color IW44' => 'Цветной IW44', + 'Full-resolution image' => 'Изображение Ñ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼ разрешением', + 'Grayscale IW44' => 'Ð“Ñ€Ð°Ð´Ð°Ñ†Ð¸Ñ Ñерого IW44', + 'Multi-page document' => 'МногоÑтраничный документ', + 'Reduced-resolution image' => 'Изображение Ñ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ñ‹Ð¼ разрешением', + 'Shared component' => 'Общий компонент', + 'Single page of multi-page image' => 'Одна Ñтраница из многоÑтраничного изображениÑ', + 'Single page of multi-page reduced-resolution image' => 'Одна Ñтраница из многоÑтраничного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ñ‹Ð¼ разрешением', + 'Single-page image' => 'ОдноÑтраничное изображение', + 'TIFF-FX mixed raster content' => 'Смешанное раÑтровое Ñодержимое TIFF-FX', + 'TIFF/IT final page' => 'ПоÑледнÑÑ Ñтраница TIFF/IT', + 'Thumbnail image' => 'Миниатюра', + 'Transparency mask' => 'МаÑка прозрачноÑти изображениÑ', + 'Transparency mask of multi-page image' => 'МаÑка прозрачноÑти многоÑтраничного изображениÑ', + 'Transparency mask of reduced-resolution image' => 'МаÑка прозрачноÑти Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ñ‹Ð¼ разрешением', + 'Transparency mask of reduced-resolution multi-page image' => 'МаÑка прозрачноÑти многоÑтраничного Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ñ‹Ð¼ разрешением', + 'invalid' => 'Ðекорректный', + }, + }, + 'Subject' => 'Тема', + 'SubjectArea' => 'ОблаÑÑ‚ÑŒ объекта', + 'SubjectCode' => 'Предметный код', + 'SubjectDistance' => 'ДиÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ðº фокуÑируемому объекту', + 'SubjectDistanceRange' => { + Description => 'РаÑÑтоÑние до Ñнимаемого объекта', + PrintConv => { + 'Close' => 'Съёмка Ñ Ð±Ð»Ð¸Ð·ÐºÐ¾Ð³Ð¾ раÑÑтоÑниÑ', + 'Distant' => 'Съёмка Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ³Ð¾ раÑÑтоÑниÑ', + 'Macro' => 'Макро Ñъёмка', + 'Unknown' => 'ÐеизвеÑтно', + }, + }, + 'SubjectLocation' => 'РаÑположение объекта', + 'SubjectPixelHeight' => 'Ð’Ñ‹Ñота объекта в пикÑелÑÑ…', + 'SubjectPixelWidth' => 'Ширина объекта в пикÑелÑÑ…', + 'SubjectReference' => 'СÑылка на предмет', + 'SubjectUnits' => { + Description => 'Единицы объекта', + PrintConv => { + 'meters' => 'Метры', + 'radians' => 'Радианы', + }, + }, + 'Subtitle' => 'Субтитры', + 'SubtitleDescription' => 'Субтитры – ОпиÑание', + 'SuggestedPalette' => 'Ð ÐµÐºÐ¾Ð¼ÐµÐ½Ð´Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ð°Ð»Ð¸Ñ‚Ñ€Ð°', + 'Summary' => 'Резюме', + 'SupplementalCategories' => 'Дополнительные категории', + 'SupplementalType' => { + Description => 'Тип дополнениÑ', + PrintConv => { + 'Logo' => 'Логотип', + 'Main Image' => 'ОÑновное изображение', + 'Rasterized Caption' => 'РаÑтрированный заголовок', + 'Reduced Resolution Image' => 'Изображение Ñ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ñ‹Ð¼ разрешением', + }, + }, + 'SymLink' => 'СимволичеÑÐºÐ°Ñ ÑÑылка', + 'System' => 'СиÑтема', + 'SystemTime' => 'СиÑтемное времÑ', + 'T4Options' => { + Description => 'Параметры ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ T4', + PrintConv => { + '2-Dimensional encoding' => 'Двумерное кодирование', + 'Fill bits added' => 'Добавление заполнÑющих битов', + 'Uncompressed' => 'Без ÑжатиÑ', + }, + }, + 'T6Options' => { + Description => 'Параметры ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ T6', + PrintConv => { + 'Uncompressed' => 'Без ÑжатиÑ', + }, + }, + 'T82Options' => 'Параметры T82', + 'T88Options' => 'Параметры T88', + 'TIFF-EPStandardID' => 'ID Ñтандарта TIFF-EP', + 'TIFFPreview' => 'ПредпроÑмотр TIFF', + 'TIFF_FXExtensions' => { + Description => 'Ð Ð°Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ TIFF_FX', + PrintConv => { + 'JBIG2 Profile M' => 'JBIG2 профиль M', + 'N Layer Profile M' => 'N Ñлой Профиль M', + 'Resolution/Image Width' => 'Разрешение/Ширина изображениÑ', + 'Shared Data' => 'Общие данные', + }, + }, + 'TOCItems' => 'КоличеÑтво точек навигации', + 'TStop' => 'Ð˜Ð½Ð´ÐµÐºÑ ÑветопропуÑÐºÐ°Ð½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¸Ð²Ð° (T-Stop)', + 'Tagged' => { + Description => 'Тегированный', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'TaggedPDF' => { + Description => 'Тегированный PDF', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'Take' => 'Дубль', + 'Tamper-proofKeys' => 'Ключи от взлома', + 'TargetAudiences' => 'Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð°ÑƒÐ´Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ', + 'TargetFileDOSName' => 'DOS название целевого файла', + 'TargetFileSize' => 'Размер целевого файла', + 'TargetLayerID' => 'ID целевого ÑлоÑ', + 'TargetPrinter' => 'Среда печати', + 'Tattoo' => 'Татуировка', + 'Taxon' => 'ТакÑон', + 'TaxonAcceptedNameUsage' => 'ОбщепринÑтое название такÑона', + 'TaxonAcceptedNameUsageID' => 'ID общепринÑтого Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÑона', + 'TaxonClass' => 'КлаÑÑ Ñ‚Ð°ÐºÑона', + 'TaxonConceptID' => 'ID такÑономичеÑкой концепции', + 'TaxonFamily' => 'СемейÑтво такÑона', + 'TaxonGenus' => 'Род такÑона', + 'TaxonHigherClassification' => 'ТакÑоны рангом выше', + 'TaxonID' => 'ID такÑона', + 'TaxonInfraspecificEpithet' => 'Ðизший внутривидовой Ñпитет', + 'TaxonKingdom' => 'ЦарÑтво такÑона', + 'TaxonNameAccordingTo' => 'ИÑточник опиÑÐ°Ð½Ð¸Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ† такÑона', + 'TaxonNameAccordingToID' => 'ID иÑточника опиÑÐ°Ð½Ð¸Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ† такÑона', + 'TaxonNamePublishedIn' => 'Ðазвание такÑона впервые опубликовано в', + 'TaxonNamePublishedInID' => 'ID первой публикации Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÑона', + 'TaxonNamePublishedInYear' => 'Год первой публикации Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÑона', + 'TaxonNomenclaturalCode' => 'Код номенклатуры такÑона', + 'TaxonNomenclaturalStatus' => 'Ðоменклатурный ÑÑ‚Ð°Ñ‚ÑƒÑ Ñ‚Ð°ÐºÑона', + 'TaxonOrder' => 'ПорÑдок такÑона', + 'TaxonOriginalNameUsage' => 'ПервоиÑточник Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÑона', + 'TaxonOriginalNameUsageID' => 'ID первоиÑточника Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÑона', + 'TaxonParentNameUsage' => 'РодительÑкий такÑон', + 'TaxonParentNameUsageID' => 'ID родительÑкого такÑона', + 'TaxonPhylum' => 'Тип такÑона', + 'TaxonRank' => 'Ранг такÑона', + 'TaxonRemarks' => 'Комментарии к такÑону', + 'TaxonScientificName' => 'Ðаучное название такÑона', + 'TaxonScientificNameAuthorship' => 'Ðвтор научного Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÑона', + 'TaxonScientificNameID' => 'ID научного Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°ÐºÑона', + 'TaxonSpecificEpithet' => 'Видовой Ñпитет такÑона', + 'TaxonSubgenus' => 'Подрод такÑона', + 'TaxonTaxonomicStatus' => 'Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ‚Ð°ÐºÑона', + 'TaxonVerbatimTaxonRank' => 'Ранг такÑона по первоиÑточнику', + 'TaxonVernacularName' => 'Ðародное название такÑона', + 'Telephone' => 'Ðомер телефона', + 'Telescope' => 'ТелеÑкоп', + 'Template' => 'Шаблон', + 'TermsAndConditionsText' => 'ТекÑÑ‚ лицензионного ÑоглашениÑ', + 'TermsAndConditionsURL' => 'СÑылка на лицензионное Ñоглашение', + 'TestName' => 'ТеÑтовое название файла', + 'Text' => 'ТекÑÑ‚', + 'TextLayerName' => 'ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑтовых Ñлоёв', + 'TextLayerText' => 'ТекÑÑ‚ текÑтового ÑлоÑ', + 'TextLayers' => 'ТекÑтовые Ñлои', + 'TextToSpeech' => { + Description => 'ТекÑÑ‚ в речь', + PrintConv => { + 'Disabled' => 'Ðе включеён', + 'Enabled' => 'Включен', + }, + }, + 'TextureFormat' => 'Формат текÑтуры', + 'TheoraVersion' => 'ВерÑÐ¸Ñ Theora', + 'Thresholding' => { + Description => 'ÐŸÐ¾Ñ€Ð¾Ð³Ð¾Ð²Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ°', + PrintConv => { + 'No dithering or halftoning' => 'Дизеринг или полутонирование не применÑлоÑÑŒ', + 'Ordered dither or halftone' => 'Заказной дизеринг или полутонирование', + 'Randomized dither' => 'Случайный дизеринг', + }, + }, + 'ThumbnailBPG' => 'Миниатюра BPG', + 'ThumbnailHeight' => 'Ð’Ñ‹Ñота миниатюры', + 'ThumbnailImage' => 'Миниатюра изображениÑ', + 'ThumbnailImageSize' => 'Размер миниатюри', + 'ThumbnailLength' => 'Строк в миниатюре', + 'ThumbnailOffset' => 'Смещение миниатюры', + 'ThumbnailTIFF' => 'TIFF миниатюра', + 'ThumbnailWidth' => 'Ширина миниатюры', + 'TileByteCounts' => 'КоличеÑтво байт в тайле', + 'TileDepth' => 'Глубина тайла', + 'TileLength' => 'Строк в тайле', + 'TileOffsets' => 'Смещение тайла', + 'TileWidth' => 'Колонок в тайле', + 'Tiles' => 'Тайлы', + 'Time' => 'ВремÑ', + 'TimeCode' => 'Код времени', + 'TimeCodes' => 'Таймкоды', + 'TimeCreated' => 'Ð’Ñ€ÐµÐ¼Ñ ÑозданиÑ', + 'TimeSent' => 'Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ', + 'TimeShot' => 'Ð’Ñ€ÐµÐ¼Ñ Ñъёмки', + 'TimeStamp' => 'ВременнаÌÑ Ð¼ÐµÑ‚ÐºÐ°', + 'TimeTransparency' => 'ПрозрачноÑÑ‚ÑŒ времени', + 'TimeZone' => 'ЧаÑовой поÑÑ', + 'TimeZone2' => 'ЧаÑовой поÑÑ 2', + 'TimeZoneOffset' => 'Смещение чаÑового поÑÑа', + 'TimeZoneURL' => 'URL ЧаÑового поÑÑа', + 'TimelineInfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ шкале времени', + 'TimezoneID' => 'ID чаÑового поÑÑа', + 'TimezoneName' => 'Ðазвание чаÑового поÑÑа', + 'TimezoneOffsetFrom' => 'Смещение чаÑового поÑÑа Ñ', + 'TimezoneOffsetTo' => 'Смещение чаÑового поÑÑа к', + 'Title' => 'Ðазвание', + 'TitleLen' => 'Ðазвание Len', + 'ToneCurveBlueX' => 'Ð¢Ð¾Ð½Ð¾Ð²Ð°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ â€“ Синий X', + 'ToneCurveBlueY' => 'Ð¢Ð¾Ð½Ð¾Ð²Ð°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ â€“ Синий Y', + 'ToneCurveBrightnessX' => 'Ð¢Ð¾Ð½Ð¾Ð²Ð°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ â€“ ЯркоÑÑ‚ÑŒ X', + 'ToneCurveBrightnessY' => 'Ð¢Ð¾Ð½Ð¾Ð²Ð°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ â€“ ЯркоÑÑ‚ÑŒ Y', + 'ToneCurveGreenX' => 'Ð¢Ð¾Ð½Ð¾Ð²Ð°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ â€“ Зелёный X', + 'ToneCurveGreenY' => 'Ð¢Ð¾Ð½Ð¾Ð²Ð°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ â€“ Зелёный Y', + 'ToneCurveRedX' => 'Ð¢Ð¾Ð½Ð¾Ð²Ð°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ â€“ КраÑный X', + 'ToneCurveRedY' => 'Ð¢Ð¾Ð½Ð¾Ð²Ð°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ â€“ КраÑный Y', + 'ToolName' => 'Приложение', + 'ToolVersion' => 'ВерÑÐ¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ', + 'TopMargin' => 'ОтÑтуп Ñверху', + 'TotalBitrate' => 'Общий битрейт', + 'TotalDataRate' => 'ÐžÐ±Ñ‰Ð°Ñ ÑкороÑÑ‚ÑŒ передачи данных', + 'TotalDuration' => 'ÐžÐ±Ñ‰Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ', + 'TotalEditTime' => 'Общее Ð²Ñ€ÐµÐ¼Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ', + 'TotalFrames' => 'Ð’Ñего кадров', + 'TotalSamples' => 'Ð’Ñего образцов', + 'Track' => 'Трек', + 'TrackCategory' => 'ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ñ‚Ñ€ÐµÐºÐ°', + 'TrackComments' => 'Комментарии к треку', + 'TrackID' => 'ID трека', + 'TrackLyrics' => 'ТекÑÑ‚ пеÑни', + 'TrackNumber' => 'Ðомер трека', + 'Trademark' => 'Ð¢Ð¾Ñ€Ð³Ð¾Ð²Ð°Ñ Ð¼Ð°Ñ€ÐºÐ°', + 'TransferFunction' => 'Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñа', + 'TransferRange' => 'Диапазон функции переноÑа', + 'Transformation' => { + Description => 'ТранÑформациÑ', + PrintConv => { + 'Horizontal (normal)' => 'Горизонтально', + 'Mirror horizontal' => 'Отразить по горизонтали', + 'Mirror horizontal and rotate 270 CW' => 'Отражение по горизонтали и поворот на 270° по чаÑовой Ñтрелке', + 'Mirror horizontal and rotate 90 CW' => 'Отражение по горизонтали и поворот на 90° по чаÑовой Ñтрелке', + 'Mirror vertical' => 'Отразить по вертикали', + 'Rotate 180' => 'Повернуть на 180°', + 'Rotate 270 CW' => 'Поворот на 270° по чаÑовой Ñтрелке', + 'Rotate 90 CW' => 'Поворот на 90° по чаÑовой Ñтрелке', + }, + }, + 'TransmissionReference' => 'СÑылка на иÑточник', + 'Transparency' => 'ПрозрачноÑÑ‚ÑŒ', + 'TransparencyIndicator' => 'Ðаличие прозрачноÑти', + 'TransparentIndex' => 'Ð˜Ð½Ð´ÐµÐºÑ Ð¿Ñ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ð¾Ñти', + 'TrapIndicator' => 'Применен ли треппинг к файлу', + 'Trapped' => 'Треппинг', + 'Trigger' => 'Ð’Ñ€ÐµÐ¼Ñ ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ñигнала', + 'TriggerMode' => { + Description => 'Режим триггера', + PrintConv => { + 'CodeLoc Not Entered' => 'Код блокировки не задан', + 'External Sensor' => 'Внешний датчик', + 'Motion Detection' => 'Обнаружение движениÑ', + 'Point and Shoot' => 'Ðаведи и Ñнимай', + 'Time Lapse' => 'ТаймлапÑ', + }, + }, + 'Type' => 'Тип', + 'TypeStatus' => 'СпиÑок номенклатурных типов', + 'UIC1Tag' => 'UIC – Тег 1', + 'UIC2Tag' => 'UIC – Тег 2', + 'UIC3Tag' => 'UIC – Тег 3', + 'UIC4Tag' => 'UIC – Тег 4', + 'UID' => 'Уникальный ID', + 'URLList1' => 'СпиÑок URL 1', + 'URL_List' => 'СпиÑок URL', + 'USPTOOriginalContentType' => { + Description => 'USPTO – ИÑходный тип контента', + PrintConv => { + 'Color' => 'Цвет', + 'Grayscale' => 'Оттенки Ñерого', + 'Text or Drawing' => 'ТекÑÑ‚ или риÑунок', + }, + }, + 'UUID-Unknown' => 'ÐеизвеÑтный UUID', + 'UUIDList' => 'СпиÑок UUID', + 'Uncompressed' => { + Description => 'Ðе Ñжато', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'UncompressedSize' => 'ÐеÑжатый размер', + 'UncompressedTextLength' => 'Длина неÑжатого текÑта', + 'Underline' => 'Подчёркнутый', + 'UnderlinePosition' => 'ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð¿Ð¾Ð´Ñ‡Ñ‘Ñ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ', + 'UnderlineThickness' => 'Толщина подчёркиваниÑ', + 'UnicodeAlphaNames' => 'Юникодное название альфа-канала', + 'UniqueCameraModel' => 'Уникальное название модели камеры', + 'UniqueDocumentID' => 'Уникальный ID документа', + 'UniqueObjectName' => 'Уникальное название объекта', + 'Units' => { + Description => 'Единицы измерениÑ', + PrintConv => { + 'Inches' => 'Дюймы', + 'Picas' => 'Пики', + 'Points' => 'Точки', + 'mm' => 'Милиметры', + }, + }, + 'Unknown' => 'ÐеизвеÑтный', + 'UnknownDate' => 'ÐеизвеÑÑ‚Ð½Ð°Ñ Ð´Ð°Ñ‚Ð°', + 'UpdatedTitle' => 'Обновленное название', + 'Urgency' => { + Description => 'Приоритет обработки', + PrintConv => { + '0 (reserved)' => '0 (Зарезервированно)', + '1 (most urgent)' => '1 (Срочно)', + '5 (normal urgency)' => '5 (Обычный)', + '8 (least urgent)' => '8 (Ðе Ñрочно)', + '9 (user-defined priority)' => '9 (ПользовательÑкий приоритет)', + }, + }, + 'UsageRightsMessage' => 'Сообщение о правах иÑпользованиÑ', + 'UsePanoramaViewer' => 'ИÑпользовать проÑмотрщик панорам', + 'UserAccess' => { + Description => 'РазрешаетÑÑ', + PrintConv => { + 'Annotate' => 'Ðннотирование', + 'Assemble' => 'Сборка', + 'Copy' => 'Копирование', + 'Extract' => 'Извлечение', + 'Fill forms' => 'Заполнение форм', + 'Modify' => 'Редактирование', + 'Print' => 'Печать', + 'Print high-res' => 'Печать в выÑоком разрешении', + }, + }, + 'UserComment' => 'Комментарии пользователÑ', + 'UserFields' => 'Дополнительное поле', + 'UserID' => 'ID пользователÑ', + 'UserLabel' => 'Ярлык пользователÑ', + 'VBRBytes' => 'Переменный битрейт – Бит', + 'VBRFrames' => 'Переменный битрейт – КоличеÑтво фреймов', + 'VBRScale' => 'Переменный битрейт – Шкала', + 'VCalendarVersion' => 'ВерÑÐ¸Ñ VCalendar', + 'VCardVersion' => 'ВерÑÐ¸Ñ VCard', + 'Vary' => 'Ðльтернативный HTTP-заголовок', + 'Vendor' => 'ПоÑтавщик', + 'VendorURL' => 'URL поÑтавщика', + 'Version' => 'ВерÑиÑ', + 'Version2' => 'ВерÑÐ¸Ñ 2', + 'VersionCreateDate' => 'ВерÑÐ¸Ñ â€“ Дата ÑозданиÑ', + 'VersionModifyDate' => 'ВерÑÐ¸Ñ â€“ Дата редактированиÑ', + 'VersionYear' => 'Год Ñтандарта факÑ-профилÑ', + 'VerticalDivergence' => 'Угол вертикального раÑхождениÑ', + 'Vibrance' => 'КраÑочноÑÑ‚ÑŒ', + 'VideoBitrate' => 'Битрейт видео', + 'VideoClosedCaptioning' => { + Description => 'Видео Ñ Ñубтитрами', + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'VideoCodecID' => 'ID видеокодека', + 'VideoEncoding' => 'Видеокодирование', + 'VideoFormat' => 'Формат видео', + 'VideoMode' => 'Режим видео', + 'VideoQuality' => 'КачеÑтво видео', + 'VideoScanType' => 'Тип ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾', + 'VideoSize' => 'Размер видео', + 'View' => 'ПроÑмотр', + 'ViewType' => { + Description => 'Тип проÑмотра', + PrintConv => { + 'No Pop-up Effect' => 'Без вÑплывающего Ñффекта', + 'Pop-up Effect' => 'С вÑплывающим Ñффектом', + }, + }, + 'Viewfinder' => 'ВидоиÑкатель', + 'VignetteCorrectionAlreadyApplied' => 'Применена ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð²Ð¸Ð½ÑŒÐµÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ', + 'VignettingCorrParams' => 'Параметры коррекции виньетированиÑ', + 'VignettingCorrection' => { + Description => 'ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð²Ð¸Ð½ÑŒÐµÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ', + PrintConv => { + 'Auto' => 'ÐвтоматичеÑкаÑ', + 'No correction params available' => 'ÐедоÑтупна', + 'Off' => 'Ðе включена', + }, + }, + 'VirtualImageHeight' => 'Ð’Ñ‹Ñота виртуального изображениÑ', + 'VirtualImageWidth' => 'Ширина виртуального изображениÑ', + 'VirtualPageUnits' => 'Единицы виртуальной Ñтраницы', + 'VisualFlightRulesHUD' => 'Визуальные правила полетов HUD', + 'VoiceMemo' => { + Description => 'ГолоÑовые заметки', + PrintConv => { + 'Off' => 'Ðе включено', + 'On' => 'Включено', + }, + }, + 'Volume' => 'Том', + 'VolumeBlockCount' => 'КоличеÑтво блоков в томе', + 'VolumeBlockSize' => 'Размер блока в томе', + 'VolumeCreateDate' => 'Дата ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ð¼Ð°', + 'VolumeEffectiveDate' => 'Дата начала иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ð¼Ð°', + 'VolumeExpirationDate' => 'Дата уÑÑ‚Ð°Ñ€ÐµÐ²Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ð¼Ð°', + 'VolumeID' => 'ID тома', + 'VolumeLabel' => 'Метка тома', + 'VolumeModifyDate' => 'Дата Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ð¼Ð°', + 'VolumeName' => 'Ðазвание тома', + 'VolumeSetDiskCount' => 'КоличеÑтво диÑков в наборе томов', + 'VolumeSetDiskNumber' => 'Ðомер диÑка в наборе томов', + 'VolumeSetName' => 'Ðазвание набора томов', + 'VolumeSize' => 'Размер тома', + 'VorbisVersion' => 'ВерÑÐ¸Ñ Vorbis', + 'WBBlueLevel' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð‘ÐµÐ»Ð¾Ð³Ð¾ – Уровень Ñинего', + 'WBGreenLevel' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð‘ÐµÐ»Ð¾Ð³Ð¾ – Уровень зелёного', + 'WBMode' => 'Режим баланÑа белого', + 'WBRedLevel' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð‘ÐµÐ»Ð¾Ð³Ð¾ – Уровень краÑного', + 'WBScale' => 'Чёрно-Белое – Шкала', + 'WB_GBRGLevels' => 'Чёрно-Белое – Уровни GBRG', + 'WB_GRGBLevels' => 'Уровни WB_GRGB', + 'WB_RBLevelsCloudy' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ – Уровни RB – Облачно', + 'WB_RBLevelsCoolWhiteF' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ – Уровни RB – Холодный белый F', + 'WB_RBLevelsDayWhiteF' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ – Уровни RB – Дневной белый F', + 'WB_RBLevelsDaylight' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ – Уровни RB – Дневной Ñвет', + 'WB_RBLevelsDaylightF' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ – Уровни RB – Дневной Ñвет F', + 'WB_RBLevelsFlash' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ – Уровни RB – Ð’Ñпышка', + 'WB_RBLevelsShade' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ – Уровни RB – Тень', + 'WB_RBLevelsTungsten' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ – Уровни RB – Лампа накаливаниÑ', + 'WB_RBLevelsUnknown' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ – Уровни RB – ÐеизвеÑтный иÑточник Ñвета', + 'WB_RBLevelsWhiteF' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ – Уровни RB – Белый', + 'WB_RGBLevels' => 'Уровни WB RGB', + 'WB_RGGBLevels' => 'Чёрно-Белое – Уровни RGGB', + 'WWSFamilyName' => 'Ðазвание ÑемейÑтва WWS', + 'WWSSubfamilyName' => 'Ðазвание ÑÑ‚Ð¸Ð»Ñ WWS', + 'WangAnnotation' => 'Wang Imaging – ÐннотациÑ', + 'WangTag1' => 'Wang Imaging – Тег 1', + 'WangTag3' => 'Wang Imaging – Тег 3', + 'WangTag4' => 'Wang Imaging – Тег 4', + 'Warning' => 'Уведомление', + 'WarpQuadrilateral' => 'Ð”ÐµÑ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ‡ÐµÑ‚Ñ‹Ñ€Ñ‘Ñ…ÑƒÐ³Ð¾Ð»ÑŒÐ½Ð¸ÐºÐ°', + 'Watched' => { + PrintConv => { + 'No' => 'Ðет', + 'Yes' => 'Да', + }, + }, + 'WaterDepth' => 'Глубина воды', + 'Watermark' => 'ВодÑной знак', + 'Weight' => 'Толщина шрифта', + 'WhiteBalance' => { + Description => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾', + PrintConv => { + 'Auto' => 'ÐвтоматичеÑкий', + 'Black & White' => 'Монохром', + 'Cloudy' => 'ОблачноÑÑ‚ÑŒ', + 'Color Temperature/Color Filter' => 'Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð°/Цветовой фильтр', + 'Cool White Fluorescent' => 'ФлуореÑцентный белый холодный', + 'Custom' => 'Пользователь', + 'Custom 1' => 'ПЕРСОÐÐЛЬÐЫЙ 1', + 'Custom 2' => 'ПЕРСОÐÐЛЬÐЫЙ 2', + 'Custom 3' => 'ПЕРСОÐÐЛЬÐЫЙ 3', + 'Custom 4' => 'ПЕРСОÐÐЛЬÐЫЙ 4', + 'Day White Fluorescent' => 'ФлуореÑцентный белый дневной', + 'Daylight' => 'Дневной Ñвет', + 'Daylight Fluorescent' => 'ФлуореÑцентный дневной', + 'Flash' => 'Ð’Ñпышка', + 'Fluorescent' => 'ФлуореÑцентный', + 'Manual' => 'Ручной', + 'Shade' => 'Тень', + 'Tungsten' => 'Лампа накаливаниÑ', + 'Unknown' => 'неизвеÑтно', + 'Warm White Fluorescent' => 'ФлуореÑцентный теплый белый', + 'White Fluorescent' => 'ФлуореÑцентный белый', + }, + }, + 'WhiteBalance0' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ 0', + 'WhiteBalance1' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ 1', + 'WhiteBalance2' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ 2', + 'WhiteBalanceRGB' => 'Ð‘Ð°Ð»Ð°Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾ RGB', + 'WhiteLevel' => 'Уровень белого', + 'WhiteLuminance' => 'ЯркоÑÑ‚ÑŒ белого', + 'WhitePoint' => 'ЦветноÑÑ‚ÑŒ белой точки', + 'WhitePointX' => 'Ð‘ÐµÐ»Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° по X', + 'WhitePointY' => 'Ð‘ÐµÐ»Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° по Y', + 'WhitesAdj' => 'Регулировка ÑƒÑ€Ð¾Ð²Ð½Ñ Ð±ÐµÐ»Ð¾Ð³Ð¾', + 'WideRange' => { + Description => 'Широкий диапазон', + PrintConv => { + 'Off' => 'Ðе включён', + 'On' => 'Включен', + }, + }, + 'WidthBytes' => 'Ширина в байтах', + 'WidthResolution' => 'Разрешение по ширине (PPI)', + 'WindowOrigin' => 'Ðачало координат окна', + 'WindowOriginAuto' => 'Ðачало координат окна – ÐвтоматичеÑки', + 'WindowSize' => 'Размер окна', + 'WindowTarget' => 'Целевое окно', + 'Words' => 'Слов', + 'WorkflowURL' => 'URL рабочего процеÑÑа', + 'WorkingDirectory' => 'Рабочий каталог', + 'WorkingPath' => 'Рабочий контур', + 'WorldToCamera' => 'Мир на камеру', + 'WorldToNDC' => 'Мир на NDC', + 'WrapModes' => 'Режим обёртываниÑ', + 'Writer-Editor' => 'ПиÑатель/Редактор', + 'WriterName' => 'Ðазвание редактора', + 'XAttrAppleMailDateReceived' => 'X Attr – Почта Apple – Дата получениÑ', + 'XAttrAppleMailDateSent' => 'X Attr – Почта Apple – Дата отправки', + 'XAttrAppleMailIsRemoteAttachment' => 'X Attr – Почта Apple – Ðаличие удалённого вложениÑ', + 'XAttrFinderInfo' => 'X Attr – СвойÑтва файла', + 'XAttrLastUsedDate' => 'X Attr – Дата поÑледнего иÑпользованиÑ', + 'XAttrMDItemDownloadedDate' => 'X Attr – MD Item – Дата загрузки', + 'XAttrMDItemFinderComment' => 'X Attr – MD Item – Комментарий к файлу', + 'XAttrMDItemWhereFroms' => 'X Attr – MD Item – ИÑточник файла', + 'XAttrMDLabel' => 'X Attr – MD – Ð¦Ð²ÐµÑ‚Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° файла', + 'XAttrQuarantine' => 'X Attr – Карантинный', + 'XAttrResourceFork' => 'X Attr – Вилка реÑурÑов', + 'XCFVersion' => 'ВерÑÐ¸Ñ XCF', + 'XClipPathUnits' => 'Единицы обтравочного контура по X', + 'XHeight' => 'Ð’Ñ‹Ñота Ñтрочных букв', + 'XMLData' => 'Данные XML', + 'XOffset' => 'Смещение по X', + 'XPAuthor' => 'XP – Ðвтор', + 'XPComment' => 'XP – Комментарии', + 'XPKeywords' => 'XP – Ключевые Ñлова', + 'XPSubject' => 'XP – Тема', + 'XPTitle' => 'XP – Ðазвание', + 'XPosition' => 'Положение Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ X', + 'XResolution' => 'Разрешение по X', + 'XYResolution' => 'Разрешение по X и Y', + 'YCbCrCoefficients' => 'КоÑффициенты Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð· RGB в Y Cb Cr', + 'YCbCrPositioning' => { + Description => 'Положение точки, определÑющей цвет в Y Cb Cr', + PrintConv => { + 'Centered' => 'Центрованный', + 'Co-sited' => 'СовмеÑтимый', + }, + }, + 'YCbCrSubSampling' => 'КоÑффициент ÑубдиÑкретизации Y Cb Cr', + 'YClipPathUnits' => 'Единицы обтравочного контура по Y', + 'YLevel' => 'Уровень – Y', + 'YOffset' => 'Смещение по Y', + 'YPosition' => 'Положение Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ Y', + 'YResolution' => 'Разрешение по Y', + 'YTarget' => 'Цель – Y', + 'Yaw' => 'РыÑкание (Поворот)', + 'YawAngle' => 'Угол поворота (РыÑкание)', + 'Year' => 'Год', + 'ZipBitFlag' => 'Zip – Битовый флаг', + 'ZipCRC' => 'Zip – CRC', + 'ZipCompressedSize' => 'Zip – Сжатый размер', + 'ZipCompression' => { + Description => 'Zip – Сжатие', + PrintConv => { + 'Enhanced Deflate using Deflate64(tm)' => 'Улучшенный Deflate Ñ Ð¸Ñпользованием Deflate64(tm)', + 'IBM LZ77 z Architecture (PFS)' => 'IBM LZ77 z/Architecture (PFS)', + 'IBM TERSE (new)' => 'IBM TERSE (новый)', + 'Imploded (old IBM TERSE)' => 'Imploded (Ñтарый IBM TERSE)', + 'None' => 'Без ÑжатиÑ', + 'PPMd version I, Rev 1' => 'PPMd верÑÐ¸Ñ I, Ð ÐµÐ²Ð¸Ð·Ð¸Ñ 1', + 'Reduced with compression factor 1' => 'Сжатый Ñ ÐºÐ¾Ñффициентом ÑÐ¶Ð°Ñ‚Ð¸Ñ 1', + 'Reduced with compression factor 2' => 'Сжатый Ñ ÐºÐ¾Ñффициентом ÑÐ¶Ð°Ñ‚Ð¸Ñ 2', + 'Reduced with compression factor 3' => 'Сжатый Ñ ÐºÐ¾Ñффициентом ÑÐ¶Ð°Ñ‚Ð¸Ñ 3', + 'Reduced with compression factor 4' => 'Сжатый Ñ ÐºÐ¾Ñффициентом ÑÐ¶Ð°Ñ‚Ð¸Ñ 4', + 'WavPack compressed' => 'WavPack', + }, + }, + 'ZipFileName' => 'Zip – Ðазвание файла', + 'ZipFileNameLength' => 'Zip – Длина Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°', + 'ZipModifyDate' => 'Zip – Дата редактированиÑ', + 'ZipRequiredVersion' => 'Zip – Ð¢Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑиÑ', + 'ZipUncompressedSize' => 'Zip – ÐеÑжатый размер', + 'ZoneMatching' => { + Description => 'СоглаÑование зон', + PrintConv => { + 'High Key' => 'Ð’ выÑоком ключе', + 'ISO Setting Used' => 'ИÑпользуютÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ ISO', + 'Low Key' => 'Ð’ низком ключе', + }, + }, + 'Zoom' => 'Зум', + 'ZoomPos' => 'ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð·ÑƒÐ¼Ð°', + 'ZoomedPreviewImage' => 'Увеличенный предпроÑмотр изображениÑ', + 'iTunesMediaType' => 'Тип iTunes медиа', +); + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::ru.pm - ExifTool Russian language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke, Sergey Shemetov, Dmitry Yerokhin, Anton Sukhinov and +Alexander for providing this translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/sv.pm b/lib/Image/ExifTool/Lang/sv.pm new file mode 100644 index 0000000..76f4a09 --- /dev/null +++ b/lib/Image/ExifTool/Lang/sv.pm @@ -0,0 +1,638 @@ +#------------------------------------------------------------------------------ +# File: sv.pm +# +# Description: ExifTool Swedish language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::sv; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.05'; + +%Image::ExifTool::Lang::sv::Translate = ( + 'Aperture' => 'Bländare', + 'ApertureValue' => 'Bländare', + 'Artist' => 'Upphovsman', + 'Author' => 'Upphovsman', + 'AuthorsPosition' => 'Författarens befattning', + 'BitsPerSample' => 'Antal bitar per komponent', + 'Brightness' => 'Ljusstyrka', + 'By-line' => 'Upphovsman', + 'CFAPattern' => 'CFA-mönster', + 'CalibrationIlluminant1' => { + PrintConv => { + 'Cloudy' => 'Mulet', + 'Cool White Fluorescent' => 'Kalljusrör (W 3800 - 4500 k)', + 'Day White Fluorescent' => 'Dagljusrör, högdager (N 4600 - 5500k)', + 'Daylight' => 'Dagsljus', + 'Daylight Fluorescent' => 'Dagljusrör (D 5700 - 7100 k)', + 'Fine Weather' => 'Fint väder', + 'Flash' => 'Blixt', + 'Fluorescent' => 'Lysrörsbelysning', + 'ISO Studio Tungsten' => 'ISO tungsten studiobelysning', + 'Other' => 'Annan ljuskälla', + 'Shade' => 'Skugga', + 'Standard Light A' => 'Standardljus A', + 'Standard Light B' => 'Standardljus B', + 'Standard Light C' => 'Standardljus C', + 'Tungsten (Incandescent)' => 'Tungsten', + 'Unknown' => 'Okänt', + 'Warm White Fluorescent' => 'Varmt vitt fluorescerande (L 2600 - 3250k)', + 'White Fluorescent' => 'Vit lysrörsbelysning (WW 3250 - 3800 k)', + }, + }, + 'CalibrationIlluminant2' => { + PrintConv => { + 'Cloudy' => 'Mulet', + 'Cool White Fluorescent' => 'Kalljusrör (W 3800 - 4500 k)', + 'Day White Fluorescent' => 'Dagljusrör, högdager (N 4600 - 5500k)', + 'Daylight' => 'Dagsljus', + 'Daylight Fluorescent' => 'Dagljusrör (D 5700 - 7100 k)', + 'Fine Weather' => 'Fint väder', + 'Flash' => 'Blixt', + 'Fluorescent' => 'Lysrörsbelysning', + 'ISO Studio Tungsten' => 'ISO tungsten studiobelysning', + 'Other' => 'Annan ljuskälla', + 'Shade' => 'Skugga', + 'Standard Light A' => 'Standardljus A', + 'Standard Light B' => 'Standardljus B', + 'Standard Light C' => 'Standardljus C', + 'Tungsten (Incandescent)' => 'Tungsten', + 'Unknown' => 'Okänt', + 'Warm White Fluorescent' => 'Varmt vitt fluorescerande (L 2600 - 3250k)', + 'White Fluorescent' => 'Vit lysrörsbelysning (WW 3250 - 3800 k)', + }, + }, + 'Caption-Abstract' => 'Bildtext', + 'CaptionWriter' => 'Bildtextredigerare', + 'Categories' => 'Kategorier', + 'Category' => 'Kategorier', + 'City' => 'Ort', + 'ColorFilter' => 'Färgfilter', + 'ColorMode' => { + Description => 'Kreativa inst.', + PrintConv => { + 'Autumn Leaves' => 'Höstlöv', + 'B&W' => 'Svartvitt', + 'Clear' => 'Klart', + 'Deep' => 'Djupt', + 'Landscape' => 'Landskap', + 'Light' => 'Ljust', + 'Neutral' => 'Neutralt', + 'Night View' => 'Nattvy', + 'Night View/Portrait' => 'Nattporträtt', + 'Portrait' => 'Porträtt', + 'Sunset' => 'SolnedgÃ¥ng', + 'Vivid' => 'Levande färg', + }, + }, + 'ColorSpace' => { + Description => 'FärgomrÃ¥desinformation', + PrintConv => { + 'ICC Profile' => 'ICC-profil', + 'Uncalibrated' => 'Ej kalibrerat', + }, + }, + 'ColorTemperature' => 'Färgtemperatur', + 'Comment' => 'Kommentar', + 'ComponentsConfiguration' => 'Enskilda komponenters betydelse', + 'CompressedBitsPerPixel' => 'Bildkomprimeringsläge', + 'Compression' => { + Description => 'Komprimeringsschema', + PrintConv => { + 'JPEG' => 'JPEG-komprimering', + 'Uncompressed' => 'Ingen komprimering', + }, + }, + 'Contrast' => { + Description => 'Kontrast', + PrintConv => { + 'High' => 'HÃ¥rd', + 'Low' => 'Mjuk', + 'Normal' => 'Standard', + }, + }, + 'Copyright' => 'Copyright-innehavare', + 'CopyrightNotice' => 'Copyrightmeddelande', + 'Country' => 'Land', + 'Country-PrimaryLocationName' => 'Land', + 'CreateDate' => 'Skapat datum', + 'CreationDate' => 'Skapad datum', + 'Credit' => 'Medverkande', + 'CustomRendered' => { + Description => 'Anpassad bildbearbetning', + PrintConv => { + 'Custom' => 'Anpassad process', + 'Normal' => 'Normal process', + }, + }, + 'DateCreated' => 'Skapat datum', + 'DateTimeOriginal' => 'Ursprungligt datum & tid', + 'DeviceSettingDescription' => 'Beskrivning av enhetsinställning', + 'DigitalZoomRatio' => 'Digitalt zoomomfÃ¥ng', + 'Directory' => 'Filplats', + 'DriveMode' => 'Enhetsläge', + 'DynamicRangeOptimizer' => { + Description => 'Opt.av dyn.omr.', + PrintConv => { + 'Advanced Auto' => 'Avancerad auto', + 'Advanced Lv1' => 'Avancerad niv1', + 'Advanced Lv2' => 'Avancerad niv2', + 'Advanced Lv3' => 'Avancerad niv3', + 'Advanced Lv4' => 'Avancerad niv4', + 'Advanced Lv5' => 'Avancerad niv5', + 'Auto' => 'Automatisk', + 'Off' => 'Av', + }, + }, + 'ExifImageHeight' => 'Giltig bildhöjd', + 'ExifImageWidth' => 'Giltig bildbredd', + 'ExifOffset' => 'IFD-pekare för Exif', + 'ExifVersion' => 'Exif-version', + 'ExposureCompensation' => 'Exponeringsförskjutning', + 'ExposureIndex' => 'Exponeringsindex', + 'ExposureMode' => { + Description => 'Exponeringsläge', + PrintConv => { + 'Auto' => 'Automatisk exponering', + 'Auto bracket' => 'Automatisk alternativexponering', + 'Manual' => 'Manuell exponering', + }, + }, + 'ExposureProgram' => { + Description => 'Exponeringsprogram', + PrintConv => { + 'Action (High speed)' => 'Sport', + 'Aperture-priority AE' => 'Bländarprioritet', + 'Bulb' => 'Glödlampa', + 'Creative (Slow speed)' => 'Kreativ', + 'Landscape' => 'Liggande', + 'Manual' => 'Manuell exponering', + 'Portrait' => 'StÃ¥ende', + 'Program AE' => 'Normalt program', + 'Shutter speed priority AE' => 'Slutarprioritet', + }, + }, + 'ExposureTime' => 'Exponeringstid', + 'FNumber' => 'Bländare', + 'FaceOrientation' => { + PrintConv => { + 'Horizontal (normal)' => 'Positiv riktning', + 'Rotate 90 CW' => 'Rotera 90° medurs', + }, + }, + 'FileFormat' => 'Format', + 'FileModifyDate' => 'Uppdateringsdatum', + 'FileName' => 'Filnamn', + 'FileSize' => 'Filstorlek', + 'FileSource' => { + Description => 'Filkälla', + PrintConv => { + 'Digital Camera' => 'DSC', + 'Film Scanner' => 'Skanner av transparent typ', + 'Reflection Print Scanner' => 'Skanner av reflextyp', + }, + }, + 'FileType' => 'Filtyp', + 'Filename' => 'Filnamn', + 'Flash' => { + Description => 'Blixt', + PrintConv => { + 'Auto, Fired' => 'PÃ… (automatisk blixt)', + 'Auto, Fired, Red-eye reduction' => '"PÃ… (automatisk blixt, reducering av röda ögon)"', + 'Auto, Fired, Red-eye reduction, Return detected' => '"PÃ… (automatisk blixt, reducering av röda ögon, reflekterat ljus)"', + 'Auto, Fired, Return detected' => '"PÃ… (automatisk blixt, reflekterat ljus)"', + 'Did not fire' => 'Blixten utlöstes inte', + 'Fired' => 'Blixten utlöstes', + 'Fired, Red-eye reduction' => 'PÃ… (reducering av röda ögon)', + 'Fired, Red-eye reduction, Return detected' => '"PÃ… (reducering av röda ögon, reflekterat ljus)"', + 'Fired, Return detected' => 'PÃ… (reflekterat ljus)', + 'No Flash' => 'Ingen blixtfunktion', + 'On, Fired' => 'PÃ… (upplättnad)', + 'On, Red-eye reduction' => '"PÃ… (upplättnad, reducering av röda ögon)"', + 'On, Red-eye reduction, Return detected' => '"PÃ… upplättnad reducering av röda ögon, reflekterat ljus)"', + 'On, Return detected' => '"PÃ… (upplättnad, reflekterat ljus)"', + }, + }, + 'FlashEnergy' => 'Blixtenergi', + 'FlashExposureComp' => 'Blixtkompensering', + 'FlashpixVersion' => 'Flashpix-version som stöds', + 'FocalLength' => 'Brännvidd', + 'FocalLength35efl' => 'Brännvidd (i 35 mm format)', + 'FocalLengthIn35mmFormat' => 'Brännvidd för 35 mm-film', + 'FocalPlaneResolutionUnit' => { + PrintConv => { + 'inches' => 'tum', + }, + }, + 'FocusMode' => 'Fokustyp', + 'FrameRate' => 'Bildfrekvens', + 'FrameSize' => 'Bildstorlek', + 'GPSAltitude' => 'Höjd', + 'GPSAltitudeRef' => { + Description => 'Höjdreferens', + PrintConv => { + 'Above Sea Level' => 'HavsnivÃ¥', + 'Below Sea Level' => 'HavsnivÃ¥ref. (negativt värde)', + }, + }, + 'GPSAreaInformation' => 'Namn pÃ¥ GPS-omrÃ¥de', + 'GPSDOP' => 'MÃ¥ttprecision', + 'GPSDateStamp' => 'GPS-datum', + 'GPSDestBearing' => 'Destination', + 'GPSDestBearingRef' => 'Referens för destination', + 'GPSDestDistance' => 'AvstÃ¥nd till destination', + 'GPSDestDistanceRef' => 'Referens för avstÃ¥nd till destination', + 'GPSDestLatitude' => 'Destinationsbredd', + 'GPSDestLatitudeRef' => 'Referens för destionationsbredd', + 'GPSDestLongitude' => 'Destionationslängd', + 'GPSDestLongitudeRef' => 'Referens för destinationslängd', + 'GPSDifferential' => { + Description => 'GPS-differentialkorrigering', + PrintConv => { + 'Differential Corrected' => 'Differentialkorrigering använd', + 'No Correction' => 'Mätning utan differentialkorrigering', + }, + }, + 'GPSImgDirection' => 'Bildriktning', + 'GPSImgDirectionRef' => 'Referens för bildriktning', + 'GPSInfo' => 'IFD-pekare för GPS-information', + 'GPSLatitude' => 'Bredd', + 'GPSLatitudeRef' => { + Description => 'Nordlig eller sydlig bredd', + PrintConv => { + 'North' => 'Nordlig bredd', + 'South' => 'Sydlig bredd', + }, + }, + 'GPSLongitude' => 'Längd', + 'GPSLongitudeRef' => { + Description => 'Östlig eller västlig längd', + PrintConv => { + 'East' => 'Östlig längd', + 'West' => 'Västlig längd', + }, + }, + 'GPSMapDatum' => 'Geodetiska mätningsdata använda', + 'GPSMeasureMode' => { + Description => 'GPS-mätningsläge', + PrintConv => { + '3-Dimensional Measurement' => '3D-mätning', + }, + }, + 'GPSProcessingMethod' => 'Namn pÃ¥ GPS-bearbetningsmetod', + 'GPSSatellites' => 'GPS-satelliter använda för mätning', + 'GPSSpeed' => 'Hastighet pÃ¥ GPS-mottagare', + 'GPSSpeedRef' => { + Description => 'Hastighetsenhet', + PrintConv => { + 'km/h' => 'Km/tim', + 'knots' => 'Knop', + 'mph' => 'Miles/tim', + }, + }, + 'GPSStatus' => { + Description => 'GPS-mottagarstatus', + PrintConv => { + 'Measurement Active' => 'Mätning pÃ¥gÃ¥r', + 'Measurement Void' => 'Mätningssamverkan', + }, + }, + 'GPSTimeStamp' => 'GPS-tid (atomur)', + 'GPSTrack' => 'Rörelseriktning', + 'GPSTrackRef' => { + Description => 'Referens för rörelseriktning', + PrintConv => { + 'Magnetic North' => 'Magnetisk riktning', + 'True North' => 'Verklig riktning', + }, + }, + 'GPSVersionID' => 'GPS tag version', + 'GainControl' => { + Description => 'Förstärkningskontroll', + PrintConv => { + 'High gain down' => 'Hög förstärkning ned', + 'High gain up' => 'Hög förstärkning upp', + 'Low gain down' => 'LÃ¥g förstärkning ned', + 'Low gain up' => 'LÃ¥g förstärkning upp', + 'None' => 'Ingen', + }, + }, + 'Gradation' => 'Effektfull', + 'HDR' => { + Description => 'Auto HDR', + PrintConv => { + 'Off' => 'Av', + }, + }, + 'Headline' => 'Rubrik', + 'HighISONoiseReduction' => { + Description => 'Hög-ISO brusred', + PrintConv => { + 'Auto' => 'Automatisk', + 'High' => 'Hög', + 'Low' => 'LÃ¥g', + 'Off' => 'Av', + }, + }, + 'Hue' => 'Nyans', + 'ICCProfile' => 'ICC profil', + 'ISO' => 'ISO värde', + 'ImageHeight' => 'Bildhöjd', + 'ImageSize' => 'Bildstorlek', + 'ImageUniqueID' => 'Unikt bild-ID', + 'ImageWidth' => 'Bildbredd', + 'Index' => 'SmÃ¥bilder', + 'Instructions' => 'Instruktioner', + 'InteropIndex' => 'Interoperability Identification', + 'InteropOffset' => 'Interoperability tag', + 'InteropVersion' => 'Interoperability Version', + 'JPEGQuality' => { + Description => 'Bildkvalitet', + PrintConv => { + 'Extra Fine' => 'Extra fin', + 'Fine' => 'Fin', + 'Standard' => 'Standardkvalitet', + }, + }, + 'Keywords' => 'Nyckelord', + 'Lens' => 'Objektiv', + 'LensInfo' => 'Objektivinformation', + 'LightSource' => { + Description => 'Ljuskälla', + PrintConv => { + 'Cloudy' => 'Mulet', + 'Cool White Fluorescent' => 'Kalljusrör (W 3800 - 4500 k)', + 'Day White Fluorescent' => 'Dagljusrör, högdager (N 4600 - 5500k)', + 'Daylight' => 'Dagsljus', + 'Daylight Fluorescent' => 'Dagljusrör (D 5700 - 7100 k)', + 'Fine Weather' => 'Fint väder', + 'Flash' => 'Blixt', + 'Fluorescent' => 'Lysrörsbelysning', + 'ISO Studio Tungsten' => 'ISO tungsten studiobelysning', + 'Other' => 'Annan ljuskälla', + 'Shade' => 'Skugga', + 'Standard Light A' => 'Standardljus A', + 'Standard Light B' => 'Standardljus B', + 'Standard Light C' => 'Standardljus C', + 'Tungsten (Incandescent)' => 'Tungsten', + 'Unknown' => 'Okänt', + 'Warm White Fluorescent' => 'Varmt vitt fluorescerande (L 2600 - 3250k)', + 'White Fluorescent' => 'Vit lysrörsbelysning (WW 3250 - 3800 k)', + }, + }, + 'Lightness' => 'Ljushet', + 'Location' => 'Plats', + 'LongExposureNoiseReduction' => { + Description => 'LÃ¥ngexp.brusred', + PrintConv => { + 'Off' => 'Av', + 'On' => 'PÃ¥', + }, + }, + 'Make' => 'Tillverkare', + 'MakerNotes' => 'Tillverkare', + 'MaxAperture' => 'Största bländare', + 'MeteringMode' => { + Description => 'Mätningstyp', + PrintConv => { + 'Average' => 'Genomsnitt', + 'Center-weighted average' => 'Centrumvägd genomsnittsmätning', + 'Multi-segment' => 'Mönster', + 'Multi-spot' => 'MultiSpot', + 'Other' => 'Annat', + 'Partial' => 'Delvis', + 'Unknown' => 'Okänt', + }, + }, + 'Model' => 'Kamera', + 'ModifyDate' => 'Filändringsdatum och -tid', + 'MultiFrameNoiseReduction' => { + Description => 'Multi Frame brusred.', + PrintConv => { + 'Off' => 'Av', + 'On' => 'PÃ¥', + }, + }, + 'NoiseReduction' => 'Brusreducering', + 'Opto-ElectricConvFactor' => 'Optoelektrisk konverteringsfaktor', + 'Orientation' => { + Description => 'Orientering', + PrintConv => { + 'Horizontal (normal)' => 'Positiv riktning', + 'Rotate 90 CW' => 'Rotera 90° medurs', + }, + }, + 'PhotometricInterpretation' => 'Pixelsammansättning', + 'PlanarConfiguration' => { + Description => 'Bilddataordning', + PrintConv => { + 'Chunky' => 'Kompakt format', + 'Planar' => 'Planar format', + }, + }, + 'PrimaryChromaticities' => 'Kromaticitet för primärfärger', + 'Province-State' => 'Län/provins', + 'Quality' => { + Description => 'Bildkvalitet', + PrintConv => { + 'Compressed RAW' => 'cRAW', + 'Compressed RAW + JPEG' => 'cRAW+JPEG', + 'Extra Fine' => 'Extra fin', + 'Fine' => 'Fin', + 'Low' => 'LÃ¥g kvalitet', + 'Normal' => 'Standardkvalitet', + 'RAW + JPEG' => 'RAW+JPEG', + }, + }, + 'RecordMode' => 'Inspelningsläge', + 'ReferenceBlackWhite' => 'Par av svartvita referensvärden', + 'RelatedImageFileFormat' => 'Tillhörande bildfilsformat', + 'RelatedImageHeight' => 'Tillhörande bildlängd', + 'RelatedImageWidth' => 'Tillhörande bildbredd', + 'RelatedSoundFile' => 'Tillhörande ljudfil', + 'ResolutionUnit' => { + Description => 'Enhet för X- och Y-upplösning', + PrintConv => { + 'cm' => 'centimeter', + 'inches' => 'tum', + }, + }, + 'RowsPerStrip' => 'Antal rader', + 'SamplesPerPixel' => 'Antal komponenter', + 'Saturation' => { + Description => 'Mättnad', + PrintConv => { + 'High' => 'Hög mättnad', + 'Low' => 'LÃ¥g mättnad', + 'Normal' => 'Standard', + }, + }, + 'SceneCaptureType' => { + Description => 'Motivtyp', + PrintConv => { + 'Landscape' => 'Landskap', + 'Night' => 'Nattmotiv', + 'Portrait' => 'Porträtt', + }, + }, + 'SceneMode' => { + Description => 'Scenval', + PrintConv => { + '3D Sweep Panorama' => '3D', + 'Anti Motion Blur' => 'Anti-rörelseoskärpa', + 'Auto' => 'Automatisk', + 'Cont. Priority AE' => 'Kont. prioritet AE', + 'Handheld Night Shot' => 'Manuell nattbild', + 'Landscape' => 'Landskap', + 'Macro' => 'Makro', + 'Night Portrait' => 'Nattporträtt', + 'Night Scene' => 'Nattvy', + 'Night View/Portrait' => 'Nattvy/porträtt', + 'Portrait' => 'Porträtt', + 'Sports' => 'Sporthändelse', + 'Sunset' => 'SolnedgÃ¥ng', + 'Sweep Panorama' => 'Panorering', + }, + }, + 'SceneType' => { + Description => 'Motivtyp', + PrintConv => { + 'Directly photographed' => 'En direktfotograferad bild', + }, + }, + 'SensingMethod' => { + Description => 'Avkänningsmetod', + PrintConv => { + 'Color sequential area' => 'Color sequential area sensor', + 'Color sequential linear' => 'Color sequential linear sensor', + 'One-chip color area' => 'One-chip color area sensor', + 'Three-chip color area' => 'Three-chip color area sensor', + 'Trilinear' => 'Trilinear sensor', + 'Two-chip color area' => 'Two-chip color area sensor', + }, + }, + 'SerialNumber' => 'Kamera-ID', + 'ShadingCompensation' => 'Skuggkompensering', + 'Sharpness' => { + Description => 'Skärpa', + PrintConv => { + 'Hard' => 'HÃ¥rd', + 'Normal' => 'Standard', + 'Soft' => 'Mjuk', + }, + }, + 'ShootingMode' => 'Fotograferingsläge', + 'ShutterSpeed' => 'Exponeringstid', + 'ShutterSpeedValue' => 'Slutartid', + 'Software' => 'Programvara', + 'Source' => 'Källa', + 'SpatialFrequencyResponse' => 'FrekvensomfÃ¥ng', + 'SpectralSensitivity' => 'Spektral känslighet', + 'State' => 'Län', + 'StripByteCounts' => 'Byte komprimerade', + 'StripOffsets' => 'Plats för bilddata', + 'SubSecTime' => 'DateTime subseconds', + 'SubSecTimeDigitized' => 'DateTimeDigitized subseconds', + 'SubSecTimeOriginal' => 'DateTimeOriginal subseconds', + 'SubjectArea' => 'Motivyta', + 'SubjectDistance' => 'MotivavstÃ¥nd', + 'SubjectDistanceRange' => { + Description => 'MotivavstÃ¥nd', + PrintConv => { + 'Close' => 'Nära hÃ¥ll', + 'Distant' => 'LÃ¥ngt hÃ¥ll', + 'Macro' => 'Makro', + }, + }, + 'SubjectLocation' => 'Motivets placering', + 'SupplementalCategories' => 'Tilläggskategorier', + 'ThumbnailImage' => 'Miniatyr', + 'ThumbnailImageSize' => 'Miniatyrstorlek', + 'Title' => 'Titel', + 'TransferFunction' => 'Överföringsfunktion', + 'TransmissionReference' => 'Sändningsreferens', + 'Urgency' => 'Prioritet', + 'UserComment' => 'Användarkommentarer', + 'WhiteBalance' => { + Description => 'Vitbalans', + PrintConv => { + 'Auto' => 'Automatisk vitbalans', + 'Black & White' => 'Monokrom', + 'Cloudy' => 'Mulet', + 'Color Temperature/Color Filter' => 'Färgtemperatur / Färgfilter', + 'Cool White Fluorescent' => 'Kalljusrör', + 'Custom' => 'Special', + 'Custom 1' => 'ANPASSNING1', + 'Custom 2' => 'ANPASSNING2', + 'Custom 3' => 'ANPASSNING3', + 'Custom 4' => 'ANPASSNING4', + 'Day White Fluorescent' => '"Dagljusrör, högdager"', + 'Daylight' => 'Dagsljus', + 'Daylight Fluorescent' => 'Dagljusrör', + 'Flash' => 'Blixt', + 'Fluorescent' => 'Lysrörsbelysning', + 'Manual' => 'Manuell vitbalans', + 'Shade' => 'Skugga', + 'Tungsten' => 'Glödlampa', + 'Unknown' => 'Okänt', + 'Warm White Fluorescent' => 'Varmt vitt fluorescerande', + 'White Fluorescent' => 'Vit lysrörsbelysning', + }, + }, + 'WhitePoint' => 'Vitpunktskromaticitet', + 'Writer-Editor' => 'Bildtextredigerare', + 'YCbCrCoefficients' => 'Koefficienter för färgomrÃ¥desomvandling', + 'YCbCrPositioning' => { + Description => 'Y- och C-placering', + PrintConv => { + 'Centered' => 'Centrerad', + }, + }, + 'YCbCrSubSampling' => 'Subsampling ratio of Y to C', + 'ZoneMatching' => { + Description => 'Zonmatchning', + PrintConv => { + 'High Key' => 'Hög', + 'ISO Setting Used' => 'Av', + 'Low Key' => 'LÃ¥g', + }, + }, +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::sv.pm - ExifTool Swedish language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke and BjE<ouml>rn SE<ouml>derstrE<ouml>m for providing +this translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/tr.pm b/lib/Image/ExifTool/Lang/tr.pm new file mode 100644 index 0000000..b997a68 --- /dev/null +++ b/lib/Image/ExifTool/Lang/tr.pm @@ -0,0 +1,546 @@ +#------------------------------------------------------------------------------ +# File: tr.pm +# +# Description: ExifTool Turkish language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::tr; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.05'; + +%Image::ExifTool::Lang::tr::Translate = ( + 'Album' => 'Albüm', + 'Aperture' => 'Açıklık', + 'ApertureValue' => 'Açıklık', + 'Artist' => 'Sanatçı', + 'Author' => 'Yazar', + 'AuthorsPosition' => 'Yazarın Pozisyonu', + 'BitsPerSample' => 'Komponent başına bit sayısı', + 'Brightness' => 'Parlaklık', + 'By-line' => 'Yazar', + 'CFAPattern' => 'CFA deseni', + 'CalibrationIlluminant1' => { + PrintConv => { + 'Cloudy' => 'Bulutlu Hava', + 'Cool White Fluorescent' => 'SoÄŸuk beyaz floresan (W 3800 - 4500K)', + 'Day White Fluorescent' => 'Gün beyaz floresan (N 4600 - 5500K)', + 'Daylight' => 'Günışığı', + 'Daylight Fluorescent' => 'Günışığı floresan (D 5700 - 7100K)', + 'Fine Weather' => 'Ä°yi hava', + 'Flash' => 'FlaÅŸ', + 'Fluorescent' => 'Floresan', + 'ISO Studio Tungsten' => 'ISO stüdyo tungsten', + 'Other' => 'DiÄŸer ışık kaynağı', + 'Shade' => 'Gölge', + 'Standard Light A' => 'Standard Işık A', + 'Standard Light B' => 'Standard Işık B', + 'Standard Light C' => 'Standard Işık C', + 'Tungsten (Incandescent)' => 'Tungsten', + 'Unknown' => 'Bilinmeyen', + 'White Fluorescent' => 'Beyaz floresan (WW 3250 - 3800K)', + }, + }, + 'CalibrationIlluminant2' => { + PrintConv => { + 'Cloudy' => 'Bulutlu Hava', + 'Cool White Fluorescent' => 'SoÄŸuk beyaz floresan (W 3800 - 4500K)', + 'Day White Fluorescent' => 'Gün beyaz floresan (N 4600 - 5500K)', + 'Daylight' => 'Günışığı', + 'Daylight Fluorescent' => 'Günışığı floresan (D 5700 - 7100K)', + 'Fine Weather' => 'Ä°yi hava', + 'Flash' => 'FlaÅŸ', + 'Fluorescent' => 'Floresan', + 'ISO Studio Tungsten' => 'ISO stüdyo tungsten', + 'Other' => 'DiÄŸer ışık kaynağı', + 'Shade' => 'Gölge', + 'Standard Light A' => 'Standard Işık A', + 'Standard Light B' => 'Standard Işık B', + 'Standard Light C' => 'Standard Işık C', + 'Tungsten (Incandescent)' => 'Tungsten', + 'Unknown' => 'Bilinmeyen', + 'White Fluorescent' => 'Beyaz floresan (WW 3250 - 3800K)', + }, + }, + 'Caption-Abstract' => 'Açıklama', + 'CaptionWriter' => 'Açıklama Yazarı', + 'Categories' => 'Kategoriler', + 'Category' => 'Kategoriler', + 'City' => 'Åžehir', + 'ColorFilter' => 'Renk Filtresi', + 'ColorSpace' => { + Description => 'Renk alanı bilgisi', + PrintConv => { + 'Uncalibrated' => 'Kalibre edilmemiÅŸ', + }, + }, + 'ColorTemperature' => 'Renk Sıcaklığı', + 'Comment' => 'Yorum', + 'ComponentsConfiguration' => 'Her komponentin anlamı', + 'CompressedBitsPerPixel' => 'Ä°maj sıkıştıma modu', + 'Compression' => { + Description => 'Sıkıştırma planı', + PrintConv => { + 'JPEG' => 'JPEG Sıkıştırma', + 'Uncompressed' => 'Sıkıştırılmamış', + }, + }, + 'Contrast' => { + Description => 'Kontrast', + PrintConv => { + 'High' => 'Sert', + 'Low' => 'YumuÅŸak', + 'Normal' => 'Standard', + }, + }, + 'Copyright' => 'Telif hakkı sahibi', + 'CopyrightNotice' => 'Telif Hakkı Uyarısı', + 'Country' => 'Ãœlke', + 'Country-PrimaryLocationName' => 'Ãœlke', + 'CreateDate' => 'OluÅŸturma Tarihi', + 'CreationDate' => 'Yaratılış tarihi', + 'Credit' => 'Jenerik', + 'CustomRendered' => { + Description => 'Özel imaj iÅŸleme', + PrintConv => { + 'Custom' => 'Özel iÅŸlem', + 'Normal' => 'Normal iÅŸlem', + }, + }, + 'DateCreated' => 'OluÅŸturma Tarihi', + 'DateTimeOriginal' => 'Orjinal Tarih & Zaman', + 'DeviceSettingDescription' => 'Cihaz ayar tanımları', + 'DigitalZoom' => 'Dijital Zoom', + 'DigitalZoomRatio' => 'Dijital zoom oranı', + 'Directory' => 'Dosya Konumu', + 'DriveMode' => 'Sürüş Modu', + 'ExifImageHeight' => 'Geçerli imaj yüksekliÄŸi', + 'ExifImageWidth' => 'Geçerli imaj eni', + 'ExifOffset' => 'Exif IFD Ä°mleci', + 'ExifVersion' => 'Exif sürüm', + 'ExposureCompensation' => 'Pozlama Sapması', + 'ExposureIndex' => 'Pozlama indeksi', + 'ExposureMode' => { + Description => 'Pozlama modu', + PrintConv => { + 'Auto' => 'Otomatik', + 'Auto bracket' => 'Otomatik çerçeve', + 'Manual' => 'Manuel pozlama', + }, + }, + 'ExposureProgram' => { + Description => 'Pozlama program', + PrintConv => { + 'Action (High speed)' => 'Hareket programı', + 'Aperture-priority AE' => 'Apertür önceliÄŸi', + 'Bulb' => 'Ampul', + 'Creative (Slow speed)' => 'Yaratıcı program', + 'Landscape' => 'Manzara', + 'Manual' => 'Manuel Pozlama', + 'Portrait' => 'Portre', + 'Program AE' => 'Normal program', + 'Shutter speed priority AE' => 'Deklanşör önceliÄŸi', + }, + }, + 'ExposureTime' => 'Poz süresi', + 'FNumber' => 'Açıklık', + 'FaceOrientation' => { + PrintConv => { + 'Horizontal (normal)' => 'Pozitif yön', + 'Rotate 90 CW' => 'Saat yönünde 90° döndür', + }, + }, + 'FileFormat' => 'Format', + 'FileModifyDate' => 'Güncellenen Tarih', + 'FileName' => 'Dosya adı', + 'FileSize' => 'Dosya boyutu', + 'FileSource' => { + Description => 'Dosya kaynağı', + PrintConv => { + 'Digital Camera' => 'DSC', + 'Film Scanner' => 'Transparan tip tarayıcı', + 'Reflection Print Scanner' => 'Refleks tipi tarayıcı', + }, + }, + 'FileType' => 'Dosya türü', + 'Filename' => 'Dosya adı', + 'Flash' => { + Description => 'FlaÅŸ', + PrintConv => { + 'Auto, Fired' => 'AÇIK (Otom-flaÅŸ)', + 'Auto, Fired, Red-eye reduction' => '"AÇIK (Otom-flaÅŸ, Kırmızı-Göz Azaltma)"', + 'Auto, Fired, Red-eye reduction, Return detected' => '"AÇIK (Otom-flaÅŸ, Kırmızı-Göz Azaltma, Geri dönen ışık bulundu)"', + 'Auto, Fired, Return detected' => '"AÇIK (Otom-flaÅŸ, Geri dönen ışık bulundu)"', + 'Did not fire' => 'FlaÅŸ patlamadı', + 'Fired' => 'FlaÅŸ patladı', + 'Fired, Red-eye reduction' => 'AÇIK (Kırmızı-Göz Azaltma)', + 'Fired, Red-eye reduction, Return detected' => '"AÇIK (Kırmızı-Göz Azaltma, Geri dönen ışık bulundu)"', + 'Fired, Return detected' => 'AÇIK (Geri dönen ışık bulundu)', + 'No Flash' => 'FlaÅŸ fonksiyonu yok', + 'On, Fired' => 'AÇIK (Doldurma)', + 'On, Red-eye reduction' => '"AÇIK (Doldurma, Kırmızı-Göz Önleme)"', + 'On, Red-eye reduction, Return detected' => '"AÇIK (Doldurma, Kırmızı-Göz Önleme, Geri dönen ışık bulundu)"', + 'On, Return detected' => '"AÇIK (Doldurma, Geri dönen ışık bulundu)"', + }, + }, + 'FlashEnergy' => 'FlaÅŸ enerjisi', + 'FlashExposureComp' => 'FlaÅŸ Telafisi', + 'FlashpixVersion' => 'Desteklenen Flashpix sürümü', + 'FocalLength' => 'Odak uzunluÄŸu', + 'FocalLength35efl' => 'Odak Uzaklığı (35 mm dengi)', + 'FocalLengthIn35mmFormat' => '35mm filmde odak uzaklığı', + 'FocalPlaneResolutionUnit' => { + Description => 'Odak düzlemi çözünürlük birimi', + PrintConv => { + 'inches' => 'inç', + }, + }, + 'FocalPlaneXResolution' => 'Odak düzlemi X çözünürlüğü', + 'FocalPlaneYResolution' => 'Odak düzlemi Y çözünürlüğü', + 'FocusMode' => 'Odak modu', + 'FrameRate' => 'Kare Hızı', + 'FrameSize' => 'Kare Boyutu', + 'GPSAltitude' => 'Yükseklik', + 'GPSAltitudeRef' => { + Description => 'Yükselti referansı', + PrintConv => { + 'Above Sea Level' => 'Deniz düzeyi', + 'Below Sea Level' => 'Deniz düzeyi referansı (negatif deÄŸer)', + }, + }, + 'GPSAreaInformation' => 'GPS Alanının ismi', + 'GPSDOP' => 'Ölçüm hassaslığı', + 'GPSDateStamp' => 'GPS alanı', + 'GPSDestBearing' => 'Varış yönü', + 'GPSDestBearingRef' => 'Varış yönü için referans', + 'GPSDestDistance' => 'Varışa uzaklık', + 'GPSDestDistanceRef' => 'Varışa uzaklık için referans', + 'GPSDestLatitude' => 'Varışın enlemi', + 'GPSDestLatitudeRef' => 'Varışın enlemi için referans', + 'GPSDestLongitude' => 'Varışın boylamı', + 'GPSDestLongitudeRef' => 'Varışın boylamı için referans', + 'GPSDifferential' => { + Description => 'GPS diferansiyel düzeltme', + PrintConv => { + 'Differential Corrected' => 'Difrensiyel düzeltme uygulandı', + 'No Correction' => 'Difrensiyel düzeltme olmadan ölçüm', + }, + }, + 'GPSImgDirection' => 'Ä°majın yönü', + 'GPSImgDirectionRef' => 'Ä°majın yönü için referans', + 'GPSInfo' => 'GPS Info IDF Ä°mleci', + 'GPSLatitude' => 'Enlem', + 'GPSLatitudeRef' => { + Description => 'Kuzey veya Güney Enlemi', + PrintConv => { + 'North' => 'Kuzey enlemi', + 'South' => 'Güney enlemi', + }, + }, + 'GPSLongitude' => 'Boylam', + 'GPSLongitudeRef' => { + Description => 'DoÄŸu veya Batı Boylamı', + PrintConv => { + 'East' => 'DoÄŸu boylamı', + 'West' => 'Batı boylamı', + }, + }, + 'GPSMapDatum' => 'Geodetik veri kullanıldı', + 'GPSMeasureMode' => { + Description => 'GPS ölçüm modu', + PrintConv => { + '3-Dimensional Measurement' => '3-boyutlu ölçüm', + }, + }, + 'GPSProcessingMethod' => 'GPS iÅŸlem metodunun ismi', + 'GPSSatellites' => 'Ölçüm için kullanılan GPS uyduları', + 'GPSSpeed' => 'GSP alıcının hızı', + 'GPSSpeedRef' => { + Description => 'Hız Ãœnitesi', + PrintConv => { + 'km/h' => 'km / saat', + 'knots' => 'Knot', + 'mph' => 'Mil / saat', + }, + }, + 'GPSStatus' => { + Description => 'GPS alıcı durumu', + PrintConv => { + 'Measurement Active' => 'Ä°lerlemeli ölçüm', + 'Measurement Void' => 'Ölçü Birlikte Ä°ÅŸlerliÄŸi', + }, + }, + 'GPSTimeStamp' => 'GPS saati (atomik saat)', + 'GPSTrack' => 'Hareket yönü', + 'GPSTrackRef' => { + Description => 'Hareket yönü için referans', + PrintConv => { + 'Magnetic North' => 'Manyetik yön', + 'True North' => 'Gerçek yön', + }, + }, + 'GPSVersionID' => 'GSP etiket sürümü', + 'GainControl' => { + Description => 'Kontrol Kazan', + PrintConv => { + 'High gain down' => 'Yüksek kazanç aÅŸağı', + 'High gain up' => 'Yüksek kazanç yukarı', + 'Low gain down' => 'Düşek kazanç aÅŸağı', + 'Low gain up' => 'Düşük kazanç yukarı', + 'None' => 'Hiçbiri', + }, + }, + 'Gradation' => 'Dereceleme', + 'Headline' => 'BaÅŸlık', + 'Hue' => 'Renk', + 'ICCProfile' => 'ICC Profili', + 'ISO' => 'ISO deÄŸeri', + 'ImageHeight' => 'Ä°maj yüksekliÄŸi', + 'ImageSize' => 'Ä°maj Boyutu', + 'ImageUniqueID' => 'Kendine has imaj ID', + 'ImageWidth' => 'Ä°maj geniÅŸliÄŸi', + 'Index' => 'Ä°ndeks', + 'Instructions' => 'Talimatlar', + 'InteropIndex' => 'Interoperabilite Tanımı', + 'InteropOffset' => 'Interoperabilite etiketi', + 'InteropVersion' => 'Interoperabilite Sürümü', + 'JPEGQuality' => { + PrintConv => { + 'Standard' => 'Standart Kalite', + }, + }, + 'Keywords' => 'Anahtar sözcükler', + 'Lens' => 'Objektif', + 'LensInfo' => 'Lens Bilgisi', + 'LightSource' => { + Description => 'Işık kaynağı', + PrintConv => { + 'Cloudy' => 'Bulutlu Hava', + 'Cool White Fluorescent' => 'SoÄŸuk beyaz floresan (W 3800 - 4500K)', + 'Day White Fluorescent' => 'Gün beyaz floresan (N 4600 - 5500K)', + 'Daylight' => 'Günışığı', + 'Daylight Fluorescent' => 'Günışığı floresan (D 5700 - 7100K)', + 'Fine Weather' => 'Ä°yi hava', + 'Flash' => 'FlaÅŸ', + 'Fluorescent' => 'Floresan', + 'ISO Studio Tungsten' => 'ISO stüdyo tungsten', + 'Other' => 'DiÄŸer ışık kaynağı', + 'Shade' => 'Gölge', + 'Standard Light A' => 'Standard Işık A', + 'Standard Light B' => 'Standard Işık B', + 'Standard Light C' => 'Standard Işık C', + 'Tungsten (Incandescent)' => 'Tungsten', + 'Unknown' => 'Bilinmeyen', + 'White Fluorescent' => 'Beyaz floresan (WW 3250 - 3800K)', + }, + }, + 'Lightness' => 'Işık', + 'Location' => 'Mevki', + 'Make' => 'Ãœretici', + 'MakerNotes' => 'Ãœretici notları', + 'MaxAperture' => 'Maksimum lens açıklığı', + 'MeteringMode' => { + Description => 'Ölçü modu', + PrintConv => { + 'Average' => 'Ortalama', + 'Center-weighted average' => 'CenterWeightedAverage', + 'Multi-segment' => 'Desen', + 'Multi-spot' => 'Multispot', + 'Other' => 'DiÄŸer', + 'Partial' => 'Kısmen', + 'Unknown' => 'Bilinmeyen', + }, + }, + 'Model' => 'Kamera', + 'ModifyDate' => 'Dosya deÄŸiÅŸim tarih ve zamanı', + 'NoiseReduction' => 'Parazit azaltımı', + 'Opto-ElectricConvFactor' => 'Optoelektrik çevrim faktörü', + 'Orientation' => { + Description => 'Yönelim', + PrintConv => { + 'Horizontal (normal)' => 'Pozitif yön', + 'Rotate 90 CW' => 'Saat yönünde 90° döndür', + }, + }, + 'PhotometricInterpretation' => 'Piksel kompozisyonu', + 'PlanarConfiguration' => { + Description => 'Ä°maj veri aranjmanı', + PrintConv => { + 'Chunky' => 'Chunky format', + 'Planar' => 'Planar format', + }, + }, + 'PrimaryChromaticities' => 'Ä°lklerin kromatikleri', + 'Province-State' => 'Eyalet/Bölge', + 'Quality' => { + PrintConv => { + 'Low' => 'Düşük Kalite', + 'Normal' => 'Standart Kalite', + }, + }, + 'RecordMode' => 'Kayıt modu', + 'ReferenceBlackWhite' => 'Bir çift siyah ve beyaz referans deÄŸerleri', + 'RelatedImageFileFormat' => 'Ä°lgili Görüntü Dosya Formatı', + 'RelatedImageHeight' => 'Ä°lgili Ä°maj YüksekliÄŸi', + 'RelatedImageWidth' => 'Ä°lgili Ä°maj GeniÅŸliÄŸi', + 'RelatedSoundFile' => 'Ä°lgili ses dosyası', + 'ResolutionUnit' => { + Description => 'X ve Y birim çözünürlüğü', + PrintConv => { + 'cm' => 'santimetre', + 'inches' => 'inç', + }, + }, + 'RowsPerStrip' => 'Åžerit başına satır sayısı', + 'SamplesPerPixel' => 'Komponent sayısı', + 'Saturation' => { + Description => 'Doyma', + PrintConv => { + 'High' => 'Yüksek Doyma', + 'Low' => 'Düşük Doyma', + 'Normal' => 'Standard', + }, + }, + 'SceneCaptureType' => { + Description => 'Senaryo yakalama tipi', + PrintConv => { + 'Landscape' => 'Manzara', + 'Night' => 'Gece çekimi', + 'Portrait' => 'Portre', + }, + }, + 'SceneMode' => { + PrintConv => { + 'Sunset' => 'Günbatımı', + }, + }, + 'SceneType' => { + Description => 'Senaryo tipi', + PrintConv => { + 'Directly photographed' => 'DoÄŸrudan fotograflanmış imaj', + }, + }, + 'SensingMethod' => { + Description => 'Alıcı metodu', + PrintConv => { + 'Color sequential area' => 'Renk ardaşık alan alıcısı', + 'Color sequential linear' => 'Renk ardışık çizgisel alıcı', + 'One-chip color area' => 'Tek-çip renk alanı alıcı', + 'Three-chip color area' => 'Üç-çip renk alanı alıcı', + 'Trilinear' => 'Triple çizgisel alıcı', + 'Two-chip color area' => 'Ä°ki-çip renk alanı alıcı', + }, + }, + 'SerialNumber' => 'Kamera ID', + 'ShadingCompensation' => 'Gölgelendirme Telafisi', + 'Sharpness' => { + Description => 'Keskinlik', + PrintConv => { + 'Hard' => 'Sert', + 'Normal' => 'Standard', + 'Soft' => 'YumuÅŸak', + }, + }, + 'ShootingMode' => 'Çekim Modu', + 'ShutterSpeed' => 'Poz süresi', + 'ShutterSpeedValue' => 'Deklanşör hızı', + 'Software' => 'Kullanılan yazılım', + 'Source' => 'Kaynak', + 'SpatialFrequencyResponse' => 'Uzaysal frekans cevabı', + 'SpectralSensitivity' => 'Uzaysal hassaslık', + 'State' => 'Eyalet', + 'StripByteCounts' => 'Sıkıştırılmış ÅŸerit başına bayt', + 'StripOffsets' => 'Ä°maj veri konumu', + 'SubSecTime' => 'TarihZaman altsaniyeler', + 'SubSecTimeDigitized' => 'TarihZamanDijitize altsaniyeler', + 'SubSecTimeOriginal' => 'TarihZamanOrjinal altsaniyeler', + 'SubjectArea' => 'Obje alanı', + 'SubjectDistance' => 'Obje uzaklığı', + 'SubjectDistanceRange' => { + Description => 'Obje uzaklık menzili', + PrintConv => { + 'Close' => 'Yakın görüntü', + 'Distant' => 'Uzak görüntü', + 'Macro' => 'Makro', + }, + }, + 'SubjectLocation' => 'Obje konumu', + 'SupplementalCategories' => 'Tamamlayıcı Kategoriler', + 'ThumbnailImage' => 'Küçük Resim', + 'ThumbnailImageSize' => 'Küçük resim boyutu', + 'Title' => 'BaÅŸlık', + 'TransferFunction' => 'Transfer fonksiyonu', + 'TransmissionReference' => 'Ä°letim BaÅŸvurusu', + 'Urgency' => 'Acil', + 'UserComment' => 'Kullanıcı yorumları', + 'WhiteBalance' => { + Description => 'Beyaz ayarı', + PrintConv => { + 'Auto' => 'Otomatik beyaz ayarı', + 'Black & White' => 'Monokrom', + 'Cloudy' => 'Bulutlu hava', + 'Cool White Fluorescent' => 'SoÄŸuk beyaz floresan', + 'Custom 1' => 'ÖZEL1', + 'Custom 2' => 'ÖZEL2', + 'Custom 3' => 'ÖZEL3', + 'Custom 4' => 'ÖZEL4', + 'Day White Fluorescent' => 'Gün beyaz floresan', + 'Daylight' => 'Günışığı', + 'Daylight Fluorescent' => 'Günışığı floresan', + 'Fluorescent' => 'Floresan', + 'Manual' => 'Elle beyaz ayarı', + 'Shade' => 'Gölge', + 'Tungsten' => 'Tungsten ışık', + }, + }, + 'WhitePoint' => 'Beya nokta kromatik', + 'Writer-Editor' => 'Açıklama Yazarı', + 'XResolution' => 'X çözünürlüğü', + 'YCbCrCoefficients' => 'Renk alanı transformasyon matriks katsayısı', + 'YCbCrPositioning' => { + Description => 'Y ve C konumlama', + PrintConv => { + 'Centered' => 'Ortalanmış', + 'Co-sited' => 'Birlikte-konumlanmış', + }, + }, + 'YCbCrSubSampling' => 'Y den C\'ye alt örnekleme oranı', + 'YResolution' => 'Y çözünürlüğü', +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::tr.pm - ExifTool Turkish language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke, Hasan Yildirim and Cihan Ulusoy for providing this +translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/zh_cn.pm b/lib/Image/ExifTool/Lang/zh_cn.pm new file mode 100644 index 0000000..e0f42fa --- /dev/null +++ b/lib/Image/ExifTool/Lang/zh_cn.pm @@ -0,0 +1,1330 @@ +#------------------------------------------------------------------------------ +# File: zh_cn.pm +# +# Description: ExifTool Simplified Chinese language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::zh_cn; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.08'; + +%Image::ExifTool::Lang::zh_cn::Translate = ( + 'AEProgramMode' => { + PrintConv => { + 'Landscape' => '风景', + 'Portrait' => '人物', + }, + }, + 'AFAreaIllumination' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'AFPointIllumination' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'AFPointMode' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'AFPointRegistration' => { + PrintConv => { + 'Automatic' => '自动', + }, + }, + 'AFPointSelected' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'AFPointSelected2' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'AFPointsUnknown2' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'APEVersion' => 'APE 版本', + 'AdultContentWarning' => { + PrintConv => { + 'Unknown' => '未知', + }, + }, + 'Album' => '相册', + 'Anti-Blur' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'Aperture' => '光圈数', + 'ApertureValue' => '光圈', + 'Artist' => '图åƒä½œè€…', + 'Author' => '作者', + 'AuthorsPosition' => 'èŒä½', + 'AutoLightingOptimizer' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'AutoRotate' => { + PrintConv => { + 'Rotate 180' => '180° (底/å³)', + 'Rotate 270 CW' => '90° CW (å·¦/底)', + 'Rotate 90 CW' => '90° CCW (å³/上)', + 'n/a' => '未知', + }, + }, + 'BatteryLevel' => '电池电é‡', + 'BitsPerSample' => 'æ¯ä¸ªç»„件的比特数', + 'BracketShotNumber' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'Brightness' => '亮度', + 'BrightnessValue' => '亮度', + 'By-line' => '作者', + 'CFAPattern' => 'CFA 模å¼', + 'CalibrationIlluminant1' => { + PrintConv => { + 'Cloudy' => '阴天', + 'Cool White Fluorescent' => '冷白色è§å…‰ç¯ï¼ˆW3800-4500K)', + 'Day White Fluorescent' => '日光白色è§å…‰ç¯ï¼ˆN4600-5500K)', + 'Daylight' => '太阳光', + 'Daylight Fluorescent' => '日光色è§å…‰ç¯ï¼ˆD5700-7100K)', + 'Fine Weather' => '晴天', + 'Flash' => '闪光', + 'Fluorescent' => 'è§å…‰', + 'ISO Studio Tungsten' => 'ISO相室白炽ç¯', + 'Other' => '其他光æº', + 'Shade' => '阴影', + 'Standard Light A' => '标准光A', + 'Standard Light B' => '标准光B', + 'Standard Light C' => '标准光C', + 'Tungsten (Incandescent)' => '白炽ç¯', + 'Unknown' => '未知', + 'Warm White Fluorescent' => '暖白è§å…‰ç¯ï¼ˆL2600-3250K)', + 'White Fluorescent' => '白色è§å…‰ç¯ï¼ˆWW3250-3800K)', + }, + }, + 'CalibrationIlluminant2' => { + PrintConv => { + 'Cloudy' => '阴天', + 'Cool White Fluorescent' => '冷白色è§å…‰ç¯ï¼ˆW3800-4500K)', + 'Day White Fluorescent' => '日光白色è§å…‰ç¯ï¼ˆN4600-5500K)', + 'Daylight' => '太阳光', + 'Daylight Fluorescent' => '日光色è§å…‰ç¯ï¼ˆD5700-7100K)', + 'Fine Weather' => '晴天', + 'Flash' => '闪光', + 'Fluorescent' => 'è§å…‰', + 'ISO Studio Tungsten' => 'ISO相室白炽ç¯', + 'Other' => '其他光æº', + 'Shade' => '阴影', + 'Standard Light A' => '标准光A', + 'Standard Light B' => '标准光B', + 'Standard Light C' => '标准光C', + 'Tungsten (Incandescent)' => '白炽ç¯', + 'Unknown' => '未知', + 'Warm White Fluorescent' => '暖白è§å…‰ç¯ï¼ˆL2600-3250K)', + 'White Fluorescent' => '白色è§å…‰ç¯ï¼ˆWW3250-3800K)', + }, + }, + 'CameraOrientation' => { + Description => '图åƒå–å‘', + PrintConv => { + 'Horizontal (normal)' => '0° (上/å·¦)', + 'Rotate 270 CW' => '90° CW (å·¦/底)', + 'Rotate 90 CW' => '90° CCW (å³/上)', + }, + }, + 'CanonExposureMode' => { + PrintConv => { + 'Aperture-priority AE' => '光圈优先', + 'Manual' => '手动', + 'Shutter speed priority AE' => '快门优先', + }, + }, + 'CanonFlashMode' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'Caption-Abstract' => '说明', + 'CaptionWriter' => '说明作者', + 'CaptureXResolutionUnit' => { + PrintConv => { + 'um' => 'µm (微米)', + }, + }, + 'CaptureYResolutionUnit' => { + PrintConv => { + 'um' => 'µm (微米)', + }, + }, + 'Categories' => '类别', + 'Category' => '类别', + 'City' => '城市', + 'ColorEffect' => { + PrintConv => { + 'Sepia' => '怀旧深咖啡色', + }, + }, + 'ColorFilter' => '颜色滤镜', + 'ColorMode' => { + Description => '创æ„风格', + PrintConv => { + 'Autumn Leaves' => '红å¶', + 'B&W' => '黑白', + 'Clear' => '清澈', + 'Deep' => '深色', + 'Landscape' => '风景', + 'Light' => '轻淡', + 'Neutral' => '中性', + 'Night View' => '夜景', + 'Night View/Portrait' => '夜晚肖åƒ', + 'Portrait' => '人物', + 'Standard' => '标准', + 'Sunset' => '黄æ˜', + 'Vivid' => '生动色彩', + }, + }, + 'ColorSpace' => { + Description => '色彩空间信æ¯', + PrintConv => { + 'ICC Profile' => '色彩特性文件', + 'Uncalibrated' => '自å‘', + }, + }, + 'ColorTemperature' => '色温', + 'CommanderGroupAMode' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'CommanderGroupBMode' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'CommanderInternalFlash' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'Comment' => '注释', + 'ComponentsConfiguration' => 'å„分组的å«ä¹‰', + 'CompressedBitsPerPixel' => '图åƒåŽ‹ç¼©æ¨¡å¼', + 'Compression' => { + Description => '压缩方案', + PrintConv => { + 'JPEG' => 'JEPG压缩率', + 'JPEG (old-style)' => 'JPEG (旧样å¼)', + 'Kodak DCR Compressed' => '柯达 DCR 压缩', + 'Kodak KDC Compressed' => '柯达 KDC 压缩', + 'Next' => 'NeXT 2比特编ç ', + 'Nikon NEF Compressed' => '尼康 NEF 压缩', + 'Pentax PEF Compressed' => '宾得 PEF 压缩', + 'SGILog' => 'SGI 32比特对数亮度编ç ', + 'SGILog24' => 'SGI 24比特对数亮度编ç ', + 'Sony ARW Compressed' => '索尼 ARW 压缩', + 'Thunderscan' => 'ThunderScan 4比特编ç ', + 'Uncompressed' => '未压缩', + }, + }, + 'Contrast' => { + Description => '对比度', + PrintConv => { + 'High' => '硬调', + 'Low' => '软调', + 'Normal' => '标准', + }, + }, + 'ControlMode' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'Copyright' => '专利拥有者', + 'CopyrightNotice' => '版æƒä¿¡æ¯', + 'CopyrightStatus' => { + PrintConv => { + 'Unknown' => '未知', + }, + }, + 'Country' => '国家', + 'Country-PrimaryLocationName' => '国家', + 'CreateDate' => 'æ•°å­—æ•°æ®äº§ç”Ÿçš„日期和时间', + 'Credit' => '作者', + 'CustomRendered' => { + Description => '用户自定义图åƒå¤„ç†', + PrintConv => { + 'Custom' => '自定义处ç†', + 'Normal' => '普通模å¼', + }, + }, + 'DateCreated' => '创建日期', + 'DateTime' => '文件改å˜çš„日期和时间', + 'DateTimeOriginal' => '原始数æ®äº§ç”Ÿçš„日期和时间', + 'DeviceSettingDescription' => '设备设定说明', + 'DigitalZoom' => 'æ•°ç å˜ç„¦', + 'DigitalZoomRatio' => 'æ•°ç å˜ç„¦æ¯”', + 'Directory' => '文件存储ä½ç½®', + 'DisplayXResolutionUnit' => { + PrintConv => { + 'um' => 'µm (微米)', + }, + }, + 'DisplayYResolutionUnit' => { + PrintConv => { + 'um' => 'µm (微米)', + }, + }, + 'DjVuVersion' => 'DjVu 版本', + 'DriveMode' => '驱动模å¼', + 'DynamicRangeOptimizer' => { + Description => '动æ€èŒƒå›´ä¼˜åŒ–', + PrintConv => { + 'Advanced Auto' => '高级自动', + 'Advanced Lv1' => '高级优化程度 1', + 'Advanced Lv2' => '高级优化程度 2', + 'Advanced Lv3' => '高级优化程度 3', + 'Advanced Lv4' => '高级优化程度 4', + 'Advanced Lv5' => '高级优化程度 5', + 'Auto' => '自动', + 'Off' => 'å…³', + 'Standard' => '标准', + }, + }, + 'EasyMode' => { + PrintConv => { + 'Landscape' => '风景', + 'Manual' => '手动', + 'Night' => '夜景', + 'Portrait' => '人物', + }, + }, + 'ExifImageHeight' => 'åƒé«˜', + 'ExifImageWidth' => 'åƒå®½', + 'ExifOffset' => 'Exif IFD 指针', + 'ExifToolVersion' => 'ExifTool 版本', + 'ExifVersion' => 'Exif 版本', + 'ExpandFilm' => '胶片扩展', + 'ExpandFilterLens' => '滤镜扩展', + 'ExpandFlashLamp' => '闪光ç¯æ‰©å±•', + 'ExpandLens' => '镜头扩展', + 'ExpandScanner' => '扫æ仪扩展', + 'ExpandSoftware' => '软件扩展', + 'ExposureCompensation' => 'æ›å…‰åå·®', + 'ExposureIndex' => 'æ›å…‰ç´¢å¼•', + 'ExposureMode' => { + Description => 'æ›å…‰æ¨¡å¼', + PrintConv => { + 'Aperture Priority' => '光圈优先', + 'Aperture-priority AE' => '光圈优先', + 'Auto' => '自动æ›å…‰', + 'Auto bracket' => '自动支架', + 'Landscape' => '风景', + 'Manual' => '手动æ›å…‰', + 'Portrait' => '人物', + 'Shutter Priority' => '快门优先', + 'Shutter speed priority AE' => '快门优先', + 'n/a' => '未设置', + }, + }, + 'ExposureProgram' => { + Description => 'æ›å…‰ç¨‹åº', + PrintConv => { + 'Action (High speed)' => 'è¿åŠ¨æ‘„å½±', + 'Aperture Priority' => '光圈优先', + 'Aperture-priority AE' => '光圈优先', + 'Creative (Slow speed)' => '创æ„æ‘„å½±', + 'Landscape' => '风景', + 'Manual' => '手动', + 'Portrait' => '人物', + 'Program AE' => '一般程åº', + 'Shutter Priority' => '快门优先', + 'Shutter speed priority AE' => '快门优先', + }, + }, + 'ExposureTime' => 'æ›å…‰æ—¶é—´', + 'ExposureTime2' => 'æ›å…‰æ—¶é—´ 2', + 'ExternalFlashBounce' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'ExternalFlashExposureComp' => { + PrintConv => { + 'n/a' => '未设置 (Off or Auto Modes)', + 'n/a (Manual Mode)' => '未设置 (Manual Mode)', + }, + }, + 'FNumber' => '光圈数', + 'FaceOrientation' => { + PrintConv => { + 'Horizontal (normal)' => '0° (上/å·¦)', + 'Rotate 180' => '180° (底/å³)', + 'Rotate 270 CW' => '90° CW (å·¦/底)', + 'Rotate 90 CW' => '90° CCW (å³/上)', + }, + }, + 'FaxProfile' => { + PrintConv => { + 'Unknown' => '未知', + }, + }, + 'FileFormat' => 'æ ¼å¼', + 'FileModifyDate' => '更新日期', + 'FileName' => '文件å', + 'FileSize' => '文件大å°', + 'FileSource' => { + Description => '文件æ¥æº', + PrintConv => { + 'Digital Camera' => 'æ•°ç ç›¸æœº', + 'Film Scanner' => '胶片扫æ仪', + 'Reflection Print Scanner' => 'å射型扫æ仪', + }, + }, + 'FileType' => '文件格å¼', + 'FilterEffect' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'Flash' => { + Description => '闪光', + PrintConv => { + 'Auto, Fired' => 'å¼€ (自动闪光)', + 'Auto, Fired, Red-eye reduction' => 'å¼€ (自动闪光,å‡è½»çº¢çœ¼)', + 'Auto, Fired, Red-eye reduction, Return detected' => 'å¼€ (强制闪光,å‡è½»çº¢çœ¼ï¼Œæ£€æµ‹è¿”回光)', + 'Auto, Fired, Return detected' => 'å¼€ (自动闪光,检测返回光)', + 'Did not fire' => '闪光ç¯æœªäº®', + 'Fired' => '闪光ç¯äº®', + 'Fired, Red-eye reduction' => 'å¼€ (å‡è½»çº¢çœ¼)', + 'Fired, Red-eye reduction, Return detected' => 'å¼€ (å‡è½»çº¢çœ¼ï¼Œæ£€æµ‹è¿”回光)', + 'Fired, Return detected' => 'å¼€ (检测返回光)', + 'No Flash' => '无闪光功能', + 'On, Fired' => 'å¼€ (强制闪光)', + 'On, Red-eye reduction' => 'å¼€ (强制闪光(å‡è½»çº¢çœ¼))', + 'On, Red-eye reduction, Return detected' => 'å¼€ (强制闪光,å‡è½»çº¢çœ¼ï¼Œæ£€æµ‹è¿”回光)', + 'On, Return detected' => 'å¼€ (强制闪光,检测返回光)', + }, + }, + 'FlashControlMode' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'FlashEnergy' => '闪光强度', + 'FlashExposureComp' => '闪光补å¿', + 'FlashGroupAControlMode' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'FlashGroupBControlMode' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'FlashGroupCControlMode' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'FlashMode' => { + PrintConv => { + 'Auto' => '自动', + 'Unknown' => '未知', + }, + }, + 'FlashOptions' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'FlashOptions2' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'FlashSyncSpeedAv' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'FlashpixVersion' => '支æŒçš„ Flashpix 版本', + 'FocalLength' => '焦è·', + 'FocalLength35efl' => '焦点è·ç¦»(35 mm æ¢ç®—)', + 'FocalLengthIn35mmFormat' => '35 mm æ¢ç®—镜头焦点è·ç¦»', + 'FocalPlaneResolutionUnit' => { + Description => '焦平é¢åˆ†è¾¨çŽ‡å•ä½', + PrintConv => { + 'inches' => '英寸', + 'um' => 'µm (微米)', + }, + }, + 'FocalPlaneXResolution' => 'ç„¦å¹³é¢ X 分辨率', + 'FocalPlaneYResolution' => 'ç„¦å¹³é¢ Y 分辨率', + 'Focus' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'FocusContinuous' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'FocusMode' => { + Description => '对焦模å¼', + PrintConv => { + 'Auto' => '自动', + 'Manual' => '手动', + }, + }, + 'FocusMode2' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'FocusModeSetting' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'FocusRange' => { + PrintConv => { + 'Auto' => '自动', + 'Manual' => '手动', + }, + }, + 'FrameRate' => '更新速率', + 'FrameSize' => 'ç”»é¢å°ºå¯¸', + 'FreeByteCounts' => '空白字节数', + 'FujiFlashMode' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'GIFVersion' => 'GIF 版本', + 'GPSAltitude' => '海拔高度', + 'GPSAltitudeRef' => { + Description => '高度基准', + PrintConv => { + 'Above Sea Level' => 'æµ·å¹³é¢', + 'Below Sea Level' => 'æµ·æ‹”(负值)', + }, + }, + 'GPSAreaInformation' => 'GPS区域å', + 'GPSDOP' => '测é‡ç²¾åº¦', + 'GPSDateStamp' => 'GPS日期', + 'GPSDestBearing' => '目的地方ä½', + 'GPSDestBearingRef' => '目的地方ä½å‚ç…§', + 'GPSDestDistance' => '离终点的è·ç¦»', + 'GPSDestDistanceRef' => { + Description => 'è·ç›®çš„地è·ç¦»å‚ç…§', + PrintConv => { + 'Kilometers' => '公里数', + 'Miles' => '英里数', + 'Nautical Miles' => '节数', + }, + }, + 'GPSDestLatitude' => '终点纬度', + 'GPSDestLatitudeRef' => { + Description => '目的地的北纬或å—纬', + PrintConv => { + 'North' => '北纬', + 'South' => 'å—纬', + }, + }, + 'GPSDestLongitude' => '终点ç»åº¦', + 'GPSDestLongitudeRef' => { + Description => '目的地的东ç»æˆ–西ç»', + PrintConv => { + 'East' => '东ç»', + 'West' => '西ç»', + }, + }, + 'GPSDifferential' => { + Description => 'GPS 差分校正', + PrintConv => { + 'Differential Corrected' => '差分校正定ä½', + 'No Correction' => 'éžå·®åˆ†æ ¡æ­£æµ‹é‡', + }, + }, + 'GPSImgDirection' => '图åƒæ–¹å‘', + 'GPSImgDirectionRef' => '图åƒæ–¹å‘å‚ç…§', + 'GPSInfo' => 'GPS Info IFD 指针', + 'GPSLatitude' => '纬度', + 'GPSLatitudeRef' => { + Description => '北纬或者å—纬', + PrintConv => { + 'North' => '北纬', + 'South' => 'å—纬', + }, + }, + 'GPSLongitude' => 'ç»åº¦', + 'GPSLongitudeRef' => { + Description => '东ç»æˆ–者西ç»', + PrintConv => { + 'East' => '东ç»', + 'West' => '西ç»', + }, + }, + 'GPSMapDatum' => '使用的大地测é‡æ•°æ®', + 'GPSMeasureMode' => { + Description => 'GPS测é‡æ¨¡å¼', + PrintConv => { + '2-D' => '2维测é‡', + '2-Dimensional' => '2维测é‡', + '2-Dimensional Measurement' => '2维测é‡', + '3-D' => '3维测é‡', + '3-Dimensional' => '3维测é‡', + '3-Dimensional Measurement' => '3维测é‡', + }, + }, + 'GPSProcessingMethod' => '定ä½æ–¹å¼å称', + 'GPSSatellites' => '用于定ä½çš„ GPS å«æ˜Ÿä¿¡å·', + 'GPSSpeed' => 'GPS接收器的速度', + 'GPSSpeedRef' => { + Description => '速度å•ä½', + PrintConv => { + 'km/h' => '公里/å°æ—¶', + 'knots' => '海里/å°æ—¶', + 'mph' => '英里/å°æ—¶', + }, + }, + 'GPSStatus' => { + Description => 'GPS 接收器状æ€', + PrintConv => { + 'Measurement Active' => '正在测é‡ä¸­', + 'Measurement Void' => '测é‡ä¸­æ–­', + }, + }, + 'GPSTimeStamp' => 'GPS 时间(原å­é’Ÿ)', + 'GPSTrack' => 'è¿åŠ¨æ–¹å‘', + 'GPSTrackRef' => { + Description => 'è¿åŠ¨æ–¹å‘å‚ç…§', + PrintConv => { + 'Magnetic North' => 'ç£åœºæ–¹å‘', + 'True North' => '真方å‘', + }, + }, + 'GPSVersionID' => 'GPS标签版本', + 'GainControl' => { + Description => '增益控制', + PrintConv => { + 'High gain down' => '强å‡å°‘', + 'High gain up' => '强增益', + 'Low gain down' => 'å¼±å‡å°‘', + 'Low gain up' => '弱增益', + 'None' => 'æ— ', + }, + }, + 'Gamma' => '对比系数', + 'Gradation' => 'ç°é˜¶', + 'HDR' => { + Description => '自动HDR', + PrintConv => { + 'Off' => 'å…³', + }, + }, + 'Headline' => '标题', + 'HighISONoiseReduction' => { + Description => '高ISOé™å™ª', + PrintConv => { + 'Auto' => '自动', + 'High' => '强', + 'Low' => 'å¼±', + 'Normal' => '标准', + 'Off' => 'å…³', + }, + }, + 'Hue' => '色相', + 'ICCProfile' => 'ICC 规范', + 'IPTC-NAA' => 'IPTC-NAA 元数æ®', + 'ISOSetting' => { + PrintConv => { + 'Auto' => '自动', + 'Manual' => '手动', + }, + }, + 'ImageDescription' => '图åƒæ ‡é¢˜', + 'ImageHeight' => 'åƒé«˜', + 'ImageOrientation' => { + PrintConv => { + 'Portrait' => '人物', + }, + }, + 'ImageSize' => '图åƒå°ºå¯¸', + 'ImageTone' => { + PrintConv => { + 'Landscape' => '风景', + 'Portrait' => '人物', + }, + }, + 'ImageUniqueID' => '图åƒå”¯ä¸€æ ‡è¯†', + 'ImageWidth' => 'åƒå®½', + 'Index' => '索引', + 'Instructions' => '指示', + 'InternalFlash' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'InteropIndex' => { + Description => '互用标识', + PrintConv => { + 'THM - DCF thumbnail file' => 'THM: DCF 缩略图文件', + }, + }, + 'InteropOffset' => '互用指针', + 'InteropVersion' => '互用版本', + 'JFIFVersion' => 'JFIF 版本', + 'JPEGQuality' => { + Description => '图åƒè´¨é‡', + PrintConv => { + 'Extra Fine' => '超精细', + 'Fine' => '精细', + 'Standard' => '标准画质', + 'n/a' => '未设置', + }, + }, + 'Keyword' => '关键è¯', + 'Keywords' => '关键字', + 'Lens' => '镜头', + 'LensInfo' => '镜头信æ¯', + 'LensType' => '未设置', + 'LicenseType' => { + PrintConv => { + 'Unknown' => '未知', + }, + }, + 'LightSource' => { + Description => 'å…‰æº', + PrintConv => { + 'Cloudy' => '阴天', + 'Cool White Fluorescent' => '冷白色è§å…‰ç¯ï¼ˆW3800-4500K)', + 'Day White Fluorescent' => '日光白色è§å…‰ç¯ï¼ˆN4600-5500K)', + 'Daylight' => '太阳光', + 'Daylight Fluorescent' => '日光色è§å…‰ç¯ï¼ˆD5700-7100K)', + 'Fine Weather' => '晴天', + 'Flash' => '闪光', + 'Fluorescent' => 'è§å…‰', + 'ISO Studio Tungsten' => 'ISO相室白炽ç¯', + 'Other' => '其他光æº', + 'Shade' => '阴影', + 'Standard Light A' => '标准光A', + 'Standard Light B' => '标准光B', + 'Standard Light C' => '标准光C', + 'Tungsten (Incandescent)' => '白炽ç¯', + 'Unknown' => '未知', + 'Warm White Fluorescent' => '暖白è§å…‰ç¯ï¼ˆL2600-3250K)', + 'White Fluorescent' => '白色è§å…‰ç¯ï¼ˆWW3250-3800K)', + }, + }, + 'Lightness' => '明暗度', + 'LongExposureNoiseReduction' => { + Description => '长时间æ›å…‰é™å™ª', + PrintConv => { + 'Auto' => '自动', + 'Off' => 'å…³', + 'On' => 'å¼€', + 'n/a' => '未设置', + }, + }, + 'MIEVersion' => 'MIE 版本', + 'Macro' => { + PrintConv => { + 'Manual' => '手动', + 'n/a' => '未设置', + }, + }, + 'Make' => '厂商', + 'MakerNote' => '厂商注释', + 'MakerNotes' => '制造商记录', + 'ManualFlashOutput' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'MaxAperture' => '镜头光圈最大值', + 'MaxApertureValue' => '最大镜头光圈', + 'MeteringMode' => { + Description => '测é‡æ–¹å¼', + PrintConv => { + 'Average' => 'å¹³å‡', + 'Center-weighted average' => '中央é‡ç‚¹', + 'Multi-segment' => '分割测光', + 'Multi-spot' => '多点', + 'Other' => '其它', + 'Partial' => '部分测光', + 'Spot' => '点测光', + 'Unknown' => '未知', + }, + }, + 'Model' => 'åž‹å·', + 'ModifiedPictureStyle' => { + PrintConv => { + 'Landscape' => '风景', + 'Portrait' => '人物', + }, + }, + 'ModifiedSharpnessFreq' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'ModifiedToneCurve' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'ModifiedWhiteBalance' => { + PrintConv => { + 'Auto' => '自动', + 'Cloudy' => '阴天', + 'Daylight' => '太阳光', + 'Flash' => '闪光', + 'Fluorescent' => 'è§å…‰', + 'Shade' => '阴影', + }, + }, + 'ModifyDate' => '文件改å˜çš„日期和时间', + 'MultiFrameNoiseReduction' => { + Description => '多帧é™å™ª', + PrintConv => { + 'Off' => 'å…³', + 'On' => 'å¼€', + }, + }, + 'NEFCompression' => { + PrintConv => { + 'Uncompressed' => '未压缩', + }, + }, + 'Noise' => '噪声', + 'NoiseReduction' => { + Description => 'å‡å°‘噪声', + PrintConv => { + 'Auto' => '自动', + }, + }, + 'ObjectFileType' => { + PrintConv => { + 'Unknown' => '未知', + }, + }, + 'Opto-ElectricConvFactor' => '光电转æ¢å› å­', + 'Orientation' => { + Description => '图åƒå–å‘', + PrintConv => { + 'Horizontal (normal)' => '0° (上/å·¦)', + 'Mirror horizontal' => '0° (上/å³)', + 'Mirror horizontal and rotate 270 CW' => '90° CW (å·¦/上)', + 'Mirror horizontal and rotate 90 CW' => '90° CCW (å³/底)', + 'Mirror vertical' => '180° (底/å·¦)', + 'Rotate 180' => '180° (底/å³)', + 'Rotate 270 CW' => '90° CW (å·¦/底)', + 'Rotate 90 CW' => '90° CCW (å³/上)', + }, + }, + 'PEFVersion' => 'PEF 版本', + 'PageNumber' => '页数', + 'PhotometricInterpretation' => { + Description => 'åƒç´ æ–¹æ¡ˆ', + PrintConv => { + 'BlackIsZero' => '零黑色', + 'Color Filter Array' => 'CFA (颜色滤镜矩阵)', + 'Pixar LogL' => 'CIE Log2(L) (对数亮度)', + 'Pixar LogLuv' => 'CIE Log2(L)(u\',v\') (对数亮度和色度)', + 'RGB Palette' => '调色æ¿é¢œè‰²', + 'Transparency Mask' => 'é€æ˜Žè’™æ¿', + 'WhiteIsZero' => '零白色', + }, + }, + 'PictureFinish' => { + PrintConv => { + 'Portrait' => '人物', + }, + }, + 'PictureMode' => { + PrintConv => { + 'Aperture-priority AE' => '光圈优先', + 'Auto' => '自动', + 'Landscape' => '风景', + 'Manual' => '手动', + 'Portrait' => '人物', + 'Shutter speed priority AE' => '快门优先', + }, + }, + 'PictureMode2' => { + PrintConv => { + 'Aperture Priority' => '光圈优先', + 'Manual' => '手动', + 'Shutter Speed Priority' => '快门优先', + }, + }, + 'PictureModeBWFilter' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'PictureModeTone' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'PictureStyle' => { + PrintConv => { + 'Landscape' => '风景', + 'Portrait' => '人物', + }, + }, + 'PixelUnits' => { + PrintConv => { + 'Unknown' => '未知', + }, + }, + 'PlanarConfiguration' => { + Description => '图åƒæ•°æ®æŽ’列', + PrintConv => { + 'Chunky' => '点顺åºæ ¼å¼', + 'Planar' => 'å¹³é¢æ ¼å¼', + }, + }, + 'PreviewColorSpace' => { + PrintConv => { + 'Unknown' => '未知', + }, + }, + 'PrimaryChromaticities' => '原色色度å标值', + 'ProgramMode' => { + PrintConv => { + 'Portrait' => '人物', + }, + }, + 'Province-State' => 'å·žï¼çœ', + 'Quality' => { + Description => '图åƒè´¨é‡', + PrintConv => { + 'Compressed RAW' => 'cRAW', + 'Compressed RAW + JPEG' => 'cRAW+JPEG', + 'Extra Fine' => '超精细', + 'Fine' => '精细', + 'Low' => '低画质', + 'Normal' => '标准画质', + 'RAW + JPEG' => 'RAW+JPEG', + 'Standard' => '标准', + 'n/a' => '未设置', + }, + }, + 'RAFVersion' => 'RAF 版本', + 'Rating' => '评分', + 'RatingPercent' => '百分比评级', + 'RecordMode' => { + Description => '记录模å¼', + PrintConv => { + 'Aperture Priority' => '光圈优先', + 'Manual' => '手动', + 'Shutter Priority' => '快门优先', + }, + }, + 'RecordingMode' => { + PrintConv => { + 'Auto' => '自动', + 'Landscape' => '风景', + 'Manual' => '手动', + 'Portrait' => '人物', + }, + }, + 'RedEyeCorrection' => { + PrintConv => { + 'Automatic' => '自动', + }, + }, + 'ReferenceBlackWhite' => '黑白å‚照值对', + 'RelatedImageFileFormat' => '相关图åƒæ–‡ä»¶æ ¼å¼', + 'RelatedImageHeight' => '相关图åƒé«˜åº¦', + 'RelatedImageWidth' => '相关图åƒå®½åº¦', + 'RelatedSoundFile' => '相关的音频文件', + 'ResolutionUnit' => { + Description => '图åƒé«˜å®½åˆ†è¾¨çŽ‡å•ä½', + PrintConv => { + 'cm' => 'åƒç´ /厘米', + 'inches' => '英寸', + }, + }, + 'Rotation' => { + PrintConv => { + 'Horizontal' => '0° (上/å·¦)', + 'Horizontal (Normal)' => '0° (上/å·¦)', + 'Horizontal (normal)' => '0° (上/å·¦)', + 'Rotate 180' => '180° (底/å³)', + 'Rotate 270 CW' => '90° CW (å·¦/底)', + 'Rotate 90 CW' => '90° CCW (å³/上)', + 'Rotated 180' => '180° (底/å³)', + 'Rotated 270 CW' => '90° CW (å·¦/底)', + 'Rotated 90 CW' => '90° CCW (å³/上)', + }, + }, + 'RowsPerStrip' => 'æ¯æ¡å¸¦çš„行数', + 'SPIFFVersion' => 'SPIFF 版本', + 'SRAWQuality' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'SVGVersion' => 'SVG 版本', + 'SamplesPerPixel' => '组件数', + 'Saturation' => { + Description => '饱和度', + PrintConv => { + 'High' => '高饱和度', + 'Low' => '低饱和度', + 'None' => '未设置', + 'Normal' => '标准', + }, + }, + 'SceneCaptureType' => { + Description => 'å–景类型', + PrintConv => { + 'Landscape' => '风景', + 'Night' => '夜景', + 'Portrait' => '人物', + 'Standard' => '标准', + }, + }, + 'SceneMode' => { + Description => '场景选择', + PrintConv => { + '3D Sweep Panorama' => '3D', + 'Anti Motion Blur' => '动作防抖', + 'Aperture Priority' => '光圈优先', + 'Auto' => '自动', + 'Cont. Priority AE' => 'è¿žç»­æ‹æ‘„优先AE', + 'Handheld Night Shot' => '手æŒå¤œæ™¯æ‹æ‘„', + 'Landscape' => '风景', + 'Macro' => 'å¾®è·', + 'Manual' => '手动', + 'Night Portrait' => '夜晚肖åƒ', + 'Night Scene' => '夜景', + 'Night View/Portrait' => '夜景/è‚–åƒ', + 'Portrait' => '人物', + 'Shutter Priority' => '快门优先', + 'Sports' => 'è¿åŠ¨æ¨¡å¼', + 'Sunset' => '夕阳', + 'Sweep Panorama' => '扫æ全景', + }, + }, + 'SceneModeUsed' => { + PrintConv => { + 'Aperture Priority' => '光圈优先', + 'Landscape' => '风景', + 'Manual' => '手动', + 'Portrait' => '人物', + 'Shutter Priority' => '快门优先', + }, + }, + 'SceneSelect' => { + PrintConv => { + 'Night' => '夜景', + }, + }, + 'SceneType' => { + Description => '场景类型', + PrintConv => { + 'Directly photographed' => '直接æ‹æ‘„的图åƒ', + }, + }, + 'SensingMethod' => { + Description => '感应方法', + PrintConv => { + 'Color sequential area' => '色彩连续区感应器', + 'Color sequential linear' => '色彩连续线性感应器', + 'One-chip color area' => 'å•ç‰‡è‰²å½©åŒºæ„Ÿåº”器', + 'Three-chip color area' => '3 片色彩区传感器', + 'Trilinear' => '3 线传感器', + 'Two-chip color area' => '2 片色彩区传感器', + }, + }, + 'SerialNumber' => '照相机标识', + 'ShadingCompensation' => '阴影补å¿', + 'Sharpness' => { + Description => 'é”度', + PrintConv => { + 'Hard' => '强', + 'Normal' => '标准', + 'Soft' => 'å¼±', + 'n/a' => '未设置', + }, + }, + 'SharpnessFrequency' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'ShootingInfoDisplay' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'ShootingMode' => { + Description => 'æ‹æ‘„模å¼', + PrintConv => { + 'Aperture Priority' => '光圈优先', + 'Manual' => '手动', + 'Portrait' => '人物', + 'Shutter Priority' => '快门优先', + }, + }, + 'ShutterMode' => { + PrintConv => { + 'Aperture Priority' => '光圈优先', + 'Auto' => '自动', + }, + }, + 'ShutterSpeed' => 'æ›å…‰æ—¶é—´', + 'ShutterSpeedValue' => '快门速度', + 'Software' => '使用软件', + 'Source' => 'æ¥æº', + 'SpatialFrequencyResponse' => '空间频率å“应', + 'SpectralSensitivity' => '光谱çµæ•åº¦', + 'State' => 'å·ž', + 'StripByteCounts' => 'æ¯åŽ‹ç¼©æ¡å¸¦çš„字节数', + 'StripOffsets' => '图åƒæ•°æ®ä½ç½®', + 'SubSecCreateDate' => 'æ•°å­—æ•°æ®äº§ç”Ÿçš„日期和时间', + 'SubSecDateTimeOriginal' => '原始数æ®äº§ç”Ÿçš„日期和时间', + 'SubSecModifyDate' => '文件改å˜çš„日期和时间', + 'SubSecTime' => '时间的次秒', + 'SubSecTimeDigitized' => '数字化时间的次秒', + 'SubSecTimeOriginal' => '原始时间的次秒', + 'Subject' => '主题', + 'SubjectArea' => '被摄对象区域', + 'SubjectDistance' => '目标è·ç¦»', + 'SubjectDistanceRange' => { + Description => '被摄对象è·ç¦»èŒƒå›´', + PrintConv => { + 'Close' => '近景', + 'Distant' => '远景', + 'Macro' => 'å¾®è·', + 'Unknown' => '未知', + }, + }, + 'SubjectLocation' => '被摄对象ä½ç½®', + 'SubjectProgram' => { + PrintConv => { + 'Portrait' => '人物', + }, + }, + 'Subsystem' => { + PrintConv => { + 'Unknown' => '未知', + }, + }, + 'SupplementalCategories' => '追加类别', + 'SupplementalType' => { + PrintConv => { + 'Main Image' => '未设置', + }, + }, + 'T4Options' => '未压缩', + 'T6Options' => 'T6 选项', + 'ThumbnailImage' => '缩略图', + 'ThumbnailImageSize' => '缩图尺寸', + 'Title' => '标题', + 'ToneCurve' => { + PrintConv => { + 'Manual' => '手动', + }, + }, + 'ToningEffect' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'TransferFunction' => 'ä¼ é€åŠŸèƒ½', + 'Transformation' => { + PrintConv => { + 'Horizontal (normal)' => '0° (上/å·¦)', + 'Mirror horizontal' => '0° (上/å³)', + 'Mirror horizontal and rotate 270 CW' => '90° CW (å·¦/上)', + 'Mirror horizontal and rotate 90 CW' => '90° CCW (å³/底)', + 'Mirror vertical' => '180° (底/å·¦)', + 'Rotate 180' => '180° (底/å³)', + 'Rotate 270 CW' => '90° CW (å·¦/底)', + 'Rotate 90 CW' => '90° CCW (å³/上)', + }, + }, + 'TransmissionReference' => '传输记录', + 'Trapped' => { + PrintConv => { + 'Unknown' => '未知', + }, + }, + 'Urgency' => '紧急度', + 'UserComment' => '用户注释', + 'UserDef1PictureStyle' => { + PrintConv => { + 'Landscape' => '风景', + 'Portrait' => '人物', + }, + }, + 'UserDef2PictureStyle' => { + PrintConv => { + 'Landscape' => '风景', + 'Portrait' => '人物', + }, + }, + 'UserDef3PictureStyle' => { + PrintConv => { + 'Landscape' => '风景', + 'Portrait' => '人物', + }, + }, + 'VRDVersion' => 'VRD 版本', + 'Version' => '版本', + 'VibrationReduction' => { + PrintConv => { + 'n/a' => '未设置', + }, + }, + 'WBAdjLighting' => { + PrintConv => { + 'Daylight (direct sunlight)' => '太阳光 (0)', + 'Daylight (shade)' => '太阳光 (1)', + 'Daylight (cloudy)' => '太阳光 (2)', + 'Flash' => '闪光', + }, + }, + 'WBMode' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'WhiteBalance' => { + Description => '白平衡', + PrintConv => { + 'Auto' => '自动', + 'Black & White' => '黑白', + 'Cloudy' => '阴天', + 'Color Temperature/Color Filter' => '色温 / 彩色滤光片', + 'Cool White Fluorescent' => '白色è§å…‰ç¯', + 'Custom' => '自定义', + 'Custom 1' => '自定义1', + 'Custom 2' => '自定义2', + 'Custom 3' => '自定义3', + 'Custom 4' => '自定义4', + 'Day White Fluorescent' => '日光白色è§å…‰ç¯', + 'Daylight' => '太阳光', + 'Daylight Fluorescent' => '日光色è§å…‰ç¯', + 'Flash' => '闪光', + 'Fluorescent' => 'è§å…‰', + 'Manual' => '手动', + 'Shade' => '阴影', + 'Tungsten' => '白炽ç¯', + 'Unknown' => '未知', + 'Warm White Fluorescent' => '暖白è§å…‰ç¯', + 'White Fluorescent' => '白色è§å…‰ç¯', + }, + }, + 'WhiteBalance2' => { + PrintConv => { + 'Auto' => '自动', + }, + }, + 'WhiteBalanceAdj' => { + PrintConv => { + 'Auto' => '自动', + 'Cloudy' => '阴天', + 'Daylight' => '太阳光', + 'Flash' => '闪光', + 'Fluorescent' => 'è§å…‰', + 'Shade' => '阴影', + }, + }, + 'WhiteBalanceMode' => { + PrintConv => { + 'Unknown' => '未知', + }, + }, + 'WhiteBalanceSet' => { + PrintConv => { + 'Auto' => '自动', + 'Cloudy' => '阴天', + 'Daylight' => '太阳光', + 'Flash' => '闪光', + 'Manual' => '手动', + 'Shade' => '阴影', + }, + }, + 'WhitePoint' => '白点色度', + 'Writer-Editor' => '说明作者', + 'XMP' => 'XMP 元数æ®', + 'XPAuthor' => '作者', + 'XPComment' => '注释', + 'XPKeywords' => '关键è¯', + 'XPSubject' => '主题', + 'XPTitle' => '标题', + 'YCbCrCoefficients' => '色彩空间å˜æ¢çŸ©é˜µç³»æ•°', + 'YCbCrPositioning' => { + Description => 'YCC åƒç´ ç»“æž„(Y å’Œ C çš„ä½ç½®)', + PrintConv => { + 'Centered' => '中心的', + 'Co-sited' => '一致', + }, + }, + 'YCbCrSubSampling' => 'YCC åƒç´ ç»“æž„(Y 至 C çš„å­é‡‡æ ·çŽ‡)', + 'ZoneMatching' => { + Description => '区域匹é…', + PrintConv => { + 'High Key' => '强', + 'ISO Setting Used' => 'å…³', + 'Low Key' => 'å¼±', + }, + }, +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::zh_cn.pm - ExifTool Simplified Chinese language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke and Haibing Zhong for providing this translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Lang/zh_tw.pm b/lib/Image/ExifTool/Lang/zh_tw.pm new file mode 100644 index 0000000..d214535 --- /dev/null +++ b/lib/Image/ExifTool/Lang/zh_tw.pm @@ -0,0 +1,801 @@ +#------------------------------------------------------------------------------ +# File: zh_tw.pm +# +# Description: ExifTool Traditional Chinese language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::zh_tw; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.06'; + +%Image::ExifTool::Lang::zh_tw::Translate = ( + 'Album' => '相簿', + 'Aperture' => '光圈', + 'ApertureValue' => '光圈', + 'Artist' => 'å½±åƒå»ºç«‹è€…', + 'Author' => '作者', + 'AuthorsPosition' => 'è·ä½', + 'BatteryLevel' => '電池容é‡', + 'BitsPerSample' => 'æ¯å€‹å…ƒä»¶ bits 組æˆçš„數é‡', + 'Brightness' => '亮度', + 'BrightnessValue' => '亮度', + 'By-line' => '作者', + 'CFAPattern' => '彩色濾é¡é™£åˆ—圖', + 'CFAPattern2' => 'CFA æ¨¡å¼ 2', + 'CFARepeatPatternDim' => 'CFA é‡è¤‡æ¨¡å¼å°ºå¯¸', + 'CalibrationIlluminant1' => { + PrintConv => { + 'Cloudy' => '多雲', + 'Cool White Fluorescent' => '冷白色熒光燈 (W 3800 - 4500K)', + 'Day White Fluorescent' => '日光白色熒光燈 (N 4600 - 5500K)', + 'Daylight' => '日光', + 'Daylight Fluorescent' => '日光熒光燈 (D 5700 - 7100K)', + 'Fine Weather' => '晴天', + 'Flash' => '閃光燈', + 'Fluorescent' => '日光燈', + 'ISO Studio Tungsten' => 'ISO æ”影棚鎢燈', + 'Other' => '其他光æº', + 'Shade' => '陰天', + 'Standard Light A' => '標準燈光 A', + 'Standard Light B' => '標準燈光 B', + 'Standard Light C' => '標準燈光 C', + 'Tungsten (Incandescent)' => '鎢絲燈', + 'Unknown' => '未知', + 'Warm White Fluorescent' => '暖白螢光燈 (L 2600 - 3250K)', + 'White Fluorescent' => '白色熒光燈 (WW 3250 - 3800K)', + }, + }, + 'CalibrationIlluminant2' => { + PrintConv => { + 'Cloudy' => '多雲', + 'Cool White Fluorescent' => '冷白色熒光燈 (W 3800 - 4500K)', + 'Day White Fluorescent' => '日光白色熒光燈 (N 4600 - 5500K)', + 'Daylight' => '日光', + 'Daylight Fluorescent' => '日光熒光燈 (D 5700 - 7100K)', + 'Fine Weather' => '晴天', + 'Flash' => '閃光燈', + 'Fluorescent' => '日光燈', + 'ISO Studio Tungsten' => 'ISO æ”影棚鎢燈', + 'Other' => '其他光æº', + 'Shade' => '陰天', + 'Standard Light A' => '標準燈光 A', + 'Standard Light B' => '標準燈光 B', + 'Standard Light C' => '標準燈光 C', + 'Tungsten (Incandescent)' => '鎢絲燈', + 'Unknown' => '未知', + 'Warm White Fluorescent' => '暖白螢光燈 (L 2600 - 3250K)', + 'White Fluorescent' => '白色熒光燈 (WW 3250 - 3800K)', + }, + }, + 'Caption-Abstract' => '說明', + 'CaptionWriter' => '說明作者', + 'Categories' => '類別', + 'Category' => '類別', + 'CellLength' => '元件長度', + 'CellWidth' => '元件寬度', + 'City' => '城市', + 'ColorEffect' => { + PrintConv => { + 'Sepia' => '懷舊深咖啡色', + }, + }, + 'ColorFilter' => 'é¡è‰²æ¿¾é¡', + 'ColorMap' => '色彩地圖', + 'ColorMode' => { + Description => '風格設定', + PrintConv => { + 'Autumn Leaves' => '秋葉', + 'B&W' => '黑白', + 'Clear' => 'é€æ˜Ž', + 'Deep' => '深色', + 'Landscape' => '風景', + 'Light' => '淡色', + 'Neutral' => '中性', + 'Night View' => '夜景', + 'Night View/Portrait' => '夜間肖åƒ', + 'Portrait' => 'è‚–åƒ', + 'Standard' => '標準', + 'Sunset' => 'æ—¥è½', + 'Vivid' => '鮮明色彩', + }, + }, + 'ColorResponseUnit' => 'é¡è‰²å應單ä½', + 'ColorSpace' => { + Description => '色彩空間', + PrintConv => { + 'ICC Profile' => '色彩æ述檔', + 'Uncalibrated' => '未校準', + }, + }, + 'ColorTemperature' => '色溫', + 'Comment' => '註解', + 'ComponentsConfiguration' => 'æ¯å€‹çµ„æˆéƒ¨åˆ†çš„æ„義', + 'CompressedBitsPerPixel' => 'å½±åƒå£“縮模å¼', + 'Compression' => { + Description => '壓縮方å¼', + PrintConv => { + 'JPEG' => 'JPEG壓縮率', + 'JPEG (old-style)' => 'JPEG (舊å¼)', + 'Kodak DCR Compressed' => 'Kodak DCR 壓縮', + 'Kodak KDC Compressed' => 'Kodak KDC 壓縮', + 'Next' => 'NeXT 2-bit 編碼', + 'Nikon NEF Compressed' => 'Nikon NEF 壓縮', + 'Pentax PEF Compressed' => 'Pentax PEF 壓縮', + 'SGILog' => 'SGI 32-bit Log Luminance 編碼', + 'SGILog24' => 'SGI 24-bit Log Luminance 編碼', + 'Sony ARW Compressed' => 'Sony ARW 壓縮', + 'Thunderscan' => 'ThunderScan 4-bit 編碼', + 'Uncompressed' => '未壓縮', + }, + }, + 'Contrast' => { + Description => 'å°æ¯”', + PrintConv => { + 'High' => '硬', + 'Low' => '軟', + 'Normal' => '標準', + }, + }, + 'Copyright' => '版權æ“有人', + 'CopyrightNotice' => '版權è²æ˜Ž', + 'Country' => '國家', + 'Country-PrimaryLocationName' => '國家', + 'CreateDate' => '數ä½åŒ–的日期時間', + 'CreationDate' => '建立日期', + 'Credit' => '作者', + 'CustomRendered' => { + Description => '自訂影åƒè™•ç†', + PrintConv => { + 'Custom' => '自訂程åº', + 'Normal' => '正常程åº', + }, + }, + 'DateCreated' => '建立日期', + 'DateTimeOriginal' => '原始影åƒæ—¥æœŸæ™‚é–“', + 'DeviceSettingDescription' => 'è£å‚™è¨­å®šèªªæ˜Ž', + 'DigitalZoom' => '數碼變焦', + 'DigitalZoomRatio' => '數ä½è®Šç„¦æ¯”率', + 'Directory' => '儲存擋案ä½ç½®', + 'DocumentName' => '文件å稱', + 'DriveMode' => '激勵模å¼', + 'DynamicRangeOptimizer' => { + Description => '動態範åœæœ€ä½³åŒ–', + PrintConv => { + 'Advanced Auto' => '進階自動', + 'Advanced Lv1' => '進階等級 1', + 'Advanced Lv2' => '進階等級 2', + 'Advanced Lv3' => '進階等級 3', + 'Advanced Lv4' => '進階等級 4', + 'Advanced Lv5' => '進階等級 5', + 'Auto' => '自動', + 'Off' => '關閉', + 'Standard' => '標準', + }, + }, + 'ExifImageHeight' => 'å½±åƒé«˜åº¦', + 'ExifImageWidth' => 'å½±åƒå¯¬åº¦', + 'ExifOffset' => 'Exif IFD指é‡', + 'ExifVersion' => 'Exif 版本', + 'ExpandFilm' => '展開相片', + 'ExpandFilterLens' => '展開濾é¡', + 'ExpandFlashLamp' => '展開閃光燈', + 'ExpandLens' => '展開é¡é ­', + 'ExpandScanner' => '展開掃æ器', + 'ExpandSoftware' => '展開軟體', + 'ExposureCompensation' => 'æ›å…‰è£œå„Ÿ', + 'ExposureIndex' => 'æ›å…‰æŒ‡æ•¸', + 'ExposureMode' => { + Description => 'æ›å…‰æ¨¡å¼', + PrintConv => { + 'Auto' => '自動æ›å…‰', + 'Auto bracket' => '自動包åœæ›å…‰', + 'Manual' => '手動æ›å…‰', + }, + }, + 'ExposureProgram' => { + Description => 'æ‹æ”模å¼', + PrintConv => { + 'Action (High speed)' => 'å‹•æ…‹æ¨¡å¼ (高速快門)', + 'Aperture-priority AE' => '光圈優先', + 'Creative (Slow speed)' => '景深優先', + 'Landscape' => '風景模å¼', + 'Manual' => '手動', + 'Not Defined' => '未定義', + 'Portrait' => 'è‚–åƒæ¨¡å¼ (背景在焦è·ä»¥å¤–的特寫照片)', + 'Program AE' => '正常', + 'Shutter speed priority AE' => '快門優先', + }, + }, + 'ExposureTime' => 'æ›å…‰æ™‚é–“', + 'ExtraSamples' => 'é¡å¤–的樣本', + 'FNumber' => '光圈', + 'FaceOrientation' => { + PrintConv => { + 'Horizontal (normal)' => '0° (頂端/左邊)', + 'Rotate 180' => '180° (底部/å³é‚Š)', + 'Rotate 270 CW' => '90° CW (左邊/底部)', + 'Rotate 90 CW' => '90° CCW (å³é‚Š/頂端)', + }, + }, + 'FaxRecvParams' => '傳真接收åƒæ•¸', + 'FaxRecvTime' => '傳真接收時間', + 'FaxSubAddress' => '傳真附屬地å€', + 'FileFormat' => 'æ ¼å¼', + 'FileModifyDate' => '更新日期', + 'FileName' => '檔案å稱', + 'FileSize' => '檔案大å°', + 'FileSource' => { + Description => '檔案來æº', + PrintConv => { + 'Digital Camera' => '數ä½ç›¸æ©Ÿ', + 'Film Scanner' => '底片掃æ器', + 'Reflection Print Scanner' => 'å射列å°æŽƒæ器', + }, + }, + 'FileType' => '檔案格å¼', + 'Filename' => '檔案å稱', + 'FillOrder' => '填寫訂單', + 'Flash' => { + Description => '閃光燈', + PrintConv => { + 'Auto, Did not fire' => '閃光燈未擊發, 自動模å¼', + 'Auto, Did not fire, Red-eye reduction' => '自動, 閃光燈未擊發, 防紅眼模å¼', + 'Auto, Fired' => '閃光燈擊發, 自動模å¼', + 'Auto, Fired, Red-eye reduction' => '閃光燈擊發, 自動模å¼, 防紅眼模å¼', + 'Auto, Fired, Red-eye reduction, Return detected' => '閃光燈擊發, 自動模å¼, åµæ¸¬åˆ°åå°„å…‰, 防紅眼模å¼', + 'Auto, Fired, Red-eye reduction, Return not detected' => '閃光燈擊發, 自動模å¼, 未åµæ¸¬åˆ°åå°„å…‰, 防紅眼模å¼', + 'Auto, Fired, Return detected' => '閃光燈擊發, 自動模å¼, åµæ¸¬åˆ°åå°„å…‰', + 'Auto, Fired, Return not detected' => '閃光燈擊發, 自動模å¼, 未åµæ¸¬åˆ°åå°„å…‰', + 'Did not fire' => '閃光燈未亮', + 'Fired' => '閃光燈擊發', + 'Fired, Red-eye reduction' => '閃光燈擊發, 防紅眼模å¼', + 'Fired, Red-eye reduction, Return detected' => '閃光燈擊發, 防紅眼模å¼, åµæ¸¬åˆ°åå°„å…‰', + 'Fired, Red-eye reduction, Return not detected' => '閃光燈擊發, 防紅眼模å¼, 未åµæ¸¬åˆ°åå°„å…‰', + 'Fired, Return detected' => 'åµæ¸¬åˆ° Strobe åå°„å…‰', + 'Fired, Return not detected' => '未åµæ¸¬åˆ° Strobe åå°„å…‰', + 'No Flash' => '閃光燈未擊發', + 'No flash function' => '沒有閃光功能', + 'Off, Did not fire' => '閃光燈未擊發, 強制閃光模å¼', + 'Off, Did not fire, Return not detected' => '關閉, 閃光燈未擊發, å射未åµæ¸¬', + 'Off, No flash function' => '關閉, 沒有閃光功能', + 'Off, Red-eye reduction' => '關閉, 防紅眼模å¼', + 'On, Did not fire' => 'é–‹å•Ÿ, 閃光燈未擊發', + 'On, Fired' => '閃光燈擊發, 強制閃光模å¼', + 'On, Red-eye reduction' => '閃光燈擊發, 強制閃光模å¼, 防紅眼模å¼', + 'On, Red-eye reduction, Return detected' => '閃光燈擊發, 強制閃光模å¼, 防紅眼模å¼, åµæ¸¬åˆ°åå°„å…‰', + 'On, Red-eye reduction, Return not detected' => '閃光燈擊發, 強制閃光模å¼, 防紅眼模å¼, 未åµæ¸¬åˆ°åå°„å…‰', + 'On, Return detected' => '閃光燈擊發, 強制閃光模å¼, åµæ¸¬åˆ°åå°„å…‰', + 'On, Return not detected' => '閃光燈擊發, 強制閃光模å¼, 未åµæ¸¬åˆ°åå°„å…‰', + }, + }, + 'FlashEnergy' => '閃光能é‡', + 'FlashExposureComp' => '閃光補償', + 'FlashpixVersion' => 'æ”¯æ´ Flashpix 版本', + 'FocalLength' => '焦è·', + 'FocalLength35efl' => '焦è·(35mmæ›ç®—)', + 'FocalLengthIn35mmFormat' => '35mm 相機等效焦è·', + 'FocalPlaneResolutionUnit' => { + Description => '焦平é¢åˆ†è¾¨çŽ‡å–®ä½', + PrintConv => { + 'None' => 'ç„¡', + 'inches' => '英å‹', + 'um' => 'µm (微米)', + }, + }, + 'FocalPlaneXResolution' => 'X軸焦平é¢åˆ†è¾¨çŽ‡', + 'FocalPlaneYResolution' => 'Y軸焦平é¢åˆ†è¾¨çŽ‡', + 'FocusMode' => 'å°ç„¦æ¨¡å¼', + 'FrameRate' => '書é¢é€ŸçŽ‡', + 'FrameSize' => 'ç•«é¢å°ºå¯¸', + 'GPSAltitude' => '海拔高度', + 'GPSAltitudeRef' => { + Description => '海拔高度åƒè€ƒ', + PrintConv => { + 'Above Sea Level' => 'æµ·å¹³é¢', + 'Below Sea Level' => 'æµ·å¹³é¢åƒè€ƒ(負值)', + }, + }, + 'GPSAreaInformation' => 'GPSå€åŸŸå稱', + 'GPSDOP' => '測é‡ç²¾åº¦', + 'GPSDateStamp' => 'GPS 日期', + 'GPSDestBearing' => '目的地方ä½', + 'GPSDestBearingRef' => { + Description => '目的地方ä½ä¾æ“š', + PrintConv => { + 'Magnetic North' => 'ç£æ€§çš„æ–¹ä½', + 'True North' => '真實的方ä½', + }, + }, + 'GPSDestDistance' => '目的地è·é›¢', + 'GPSDestDistanceRef' => { + Description => '目的地è·é›¢ä¾æ“š', + PrintConv => { + 'Kilometers' => '公里', + 'Miles' => '英里', + 'Nautical Miles' => '節', + }, + }, + 'GPSDestLatitude' => '目的地緯度', + 'GPSDestLatitudeRef' => { + Description => '目的地的緯度ä¾æ“š', + PrintConv => { + 'North' => '北緯', + 'South' => 'å—ç·¯', + }, + }, + 'GPSDestLongitude' => '目的地經度', + 'GPSDestLongitudeRef' => { + Description => '目的地的經度ä¾æ“š', + PrintConv => { + 'East' => 'æ±ç¶“', + 'West' => '西經', + }, + }, + 'GPSDifferential' => { + Description => 'GPS 定ä½å差修正', + PrintConv => { + 'Differential Corrected' => '定ä½å差修正', + 'No Correction' => '無定ä½å差修正', + }, + }, + 'GPSImgDirection' => 'å½±åƒæ–¹ä½', + 'GPSImgDirectionRef' => { + Description => 'å½±åƒæ–¹ä½ä¾æ“š', + PrintConv => { + 'Magnetic North' => 'ç£æ€§çš„æ–¹ä½ ', + 'True North' => '真實的方ä½', + }, + }, + 'GPSInfo' => 'GPS Info IFD指é‡', + 'GPSLatitude' => '緯度', + 'GPSLatitudeRef' => { + Description => '北/å—ç·¯', + PrintConv => { + 'North' => '北緯', + 'South' => 'å—ç·¯', + }, + }, + 'GPSLongitude' => '經度', + 'GPSLongitudeRef' => { + Description => 'æ±/西經', + PrintConv => { + 'East' => 'æ±ç¶“', + 'West' => '西經', + }, + }, + 'GPSMapDatum' => '使用大地測é‡æ•¸æ“š', + 'GPSMeasureMode' => { + Description => 'GPS 測é‡æ¨¡å¼', + PrintConv => { + '2-Dimensional Measurement' => '2-三維測é‡', + '3-Dimensional Measurement' => '3-三維測é‡', + }, + }, + 'GPSProcessingMethod' => 'GPS處ç†å稱', + 'GPSSatellites' => '用於測é‡çš„å…¨çƒè¡›æ˜Ÿå®šä½ç³»çµ±è¡›æ˜Ÿ', + 'GPSSpeed' => 'GPS 接收機的速度', + 'GPSSpeedRef' => { + Description => '速度單ä½', + PrintConv => { + 'km/h' => '時速', + 'knots' => '節', + 'mph' => '英里', + }, + }, + 'GPSStatus' => { + Description => 'GPS接收機的狀態', + PrintConv => { + 'Measurement Active' => '測é‡æœ‰æ•ˆ', + 'Measurement Void' => '測é‡ç„¡æ•ˆ', + }, + }, + 'GPSTimeStamp' => 'GPS 時間 (原å­é˜)', + 'GPSTrack' => '移動方ä½', + 'GPSTrackRef' => { + Description => '移動方ä½ä¾æ“š', + PrintConv => { + 'Magnetic North' => 'ç£æ€§çš„æ–¹ä½ ', + 'True North' => '真實的方ä½', + }, + }, + 'GPSVersionID' => 'GPS 標籤版本', + 'GainControl' => { + Description => '增益控制', + PrintConv => { + 'High gain down' => '高衰減', + 'High gain up' => '高增益', + 'Low gain down' => '低衰減', + 'Low gain up' => '低增益', + 'None' => 'ç„¡', + }, + }, + 'Gamma' => 'å°æ¯”系數', + 'Gradation' => 'ç°éšŽ', + 'GrayResponseCurve' => 'ç°è‰²å應曲線', + 'GrayResponseUnit' => 'ç°è‰²å應單ä½', + 'HDR' => { + Description => 'Auto HDR', + PrintConv => { + 'Off' => '關閉', + }, + }, + 'Headline' => '標題', + 'HighISONoiseReduction' => { + Description => '高 ISO 雜訊消除', + PrintConv => { + 'Auto' => '自動', + 'High' => '高', + 'Low' => '低', + 'Normal' => '一般', + 'Off' => '關閉', + }, + }, + 'HostComputer' => '主機', + 'Hue' => '色相', + 'ICCProfile' => 'ICC 色彩設定檔', + 'IPTC-NAA' => 'IPTC-NAA 元資料', + 'ImageDescription' => 'å½±åƒæ¨™é¡Œ', + 'ImageHeight' => 'å½±åƒé«˜åº¦', + 'ImageHistory' => 'å½±åƒæ­·å²', + 'ImageNumber' => 'å½±åƒç·¨è™Ÿ', + 'ImageSize' => 'å½±åƒå°ºå¯¸', + 'ImageSourceData' => 'å½±åƒä¾†æºè³‡æ–™', + 'ImageUniqueID' => 'ç¨ç‰¹çš„å½±åƒID', + 'ImageWidth' => 'å½±åƒå¯¬åº¦', + 'Index' => '索引', + 'Instructions' => '說明', + 'Interlace' => '交錯', + 'InteropIndex' => '互通性鑑定', + 'InteropOffset' => '互用標記', + 'InteropVersion' => '互通性版本', + 'JPEGQuality' => { + Description => 'å½±åƒå“質', + PrintConv => { + 'Extra Fine' => '超精細', + 'Fine' => '精細', + 'Standard' => '標準å“質', + }, + }, + 'Keyword' => 'é—œéµå­—', + 'Keywords' => 'é—œéµå­—', + 'Lens' => 'é¡é ­', + 'LensInfo' => 'é¡é ­è³‡è¨Š', + 'LightSource' => { + Description => 'å…‰æº', + PrintConv => { + 'Cloudy' => '多雲', + 'Cool White Fluorescent' => '冷白色熒光燈 (W 3800 - 4500K)', + 'Day White Fluorescent' => '日光白色熒光燈 (N 4600 - 5500K)', + 'Daylight' => '日光', + 'Daylight Fluorescent' => '日光熒光燈 (D 5700 - 7100K)', + 'Fine Weather' => '晴天', + 'Flash' => '閃光燈', + 'Fluorescent' => '日光燈', + 'ISO Studio Tungsten' => 'ISO æ”影棚鎢燈', + 'Other' => '其他光æº', + 'Shade' => '陰天', + 'Standard Light A' => '標準燈光 A', + 'Standard Light B' => '標準燈光 B', + 'Standard Light C' => '標準燈光 C', + 'Tungsten (Incandescent)' => '鎢絲燈', + 'Unknown' => '未知', + 'Warm White Fluorescent' => '暖白螢光燈 (L 2600 - 3250K)', + 'White Fluorescent' => '白色熒光燈 (WW 3250 - 3800K)', + }, + }, + 'Lightness' => '明暗度', + 'Location' => '地å€', + 'LongExposureNoiseReduction' => { + Description => '消除長æ›é›œè¨Š', + PrintConv => { + 'Off' => '關閉', + 'On' => 'é–‹å•Ÿ', + }, + }, + 'Make' => '製造商', + 'MakerNote' => '製造商註解', + 'MakerNotes' => '製造商記錄', + 'MaxAperture' => 'é¡é ­å…‰åœˆæœ€å¤§å€¼', + 'MaxApertureValue' => 'é¡é ­æœ€å¤§å…‰åœˆ', + 'MaxSampleValue' => '大樣å“值', + 'MeteringMode' => { + Description => '測光模å¼', + PrintConv => { + 'Average' => 'å¹³å‡æ¸¬å…‰', + 'Center-weighted average' => '中央é‡é»žå¹³å‡æ¸¬å…‰', + 'Multi-segment' => '評價測光', + 'Multi-spot' => '多點測光', + 'Other' => '其他', + 'Partial' => '局部測光', + 'Spot' => '點測光', + 'Unknown' => '未知', + }, + }, + 'MinSampleValue' => 'å°æ¨£å“值', + 'Model' => '相機型號', + 'Model2' => '第二影åƒè¼¸å…¥è¨­å‚™', + 'ModifyDate' => '檔案建立日期åŠæ™‚é–“', + 'MultiFrameNoiseReduction' => { + Description => '多框雜訊消除', + PrintConv => { + 'Off' => '關閉', + 'On' => 'é–‹å•Ÿ', + }, + }, + 'Noise' => '雜訊', + 'NoiseReduction' => '雜訊抑制', + 'Opto-ElectricConvFactor' => '光電轉æ›å› å­', + 'Orientation' => { + Description => 'å½±åƒçš„æ–¹å‘', + PrintConv => { + 'Horizontal (normal)' => '0° (頂端/左邊)', + 'Mirror horizontal' => '0° (頂端/å³é‚Š)', + 'Mirror horizontal and rotate 270 CW' => '90° CW (左邊/頂端)', + 'Mirror horizontal and rotate 90 CW' => '90° CCW (å³é‚Š/底部)', + 'Mirror vertical' => '180° (底部/左邊)', + 'Rotate 180' => '180° (底部/å³é‚Š)', + 'Rotate 270 CW' => '90° CW (左邊/底部)', + 'Rotate 90 CW' => '90° CCW (å³é‚Š/頂端)', + }, + }, + 'Padding' => 'å¡«å……', + 'PageName' => 'å稱', + 'PageNumber' => 'é æ¬¡', + 'PhotometricInterpretation' => { + Description => 'åƒç´ æ ¼å¼', + PrintConv => { + 'BlackIsZero' => '黑色為零', + 'Color Filter Array' => 'CFA (彩色濾光片矩陣)', + 'RGB Palette' => '調色æ¿çš„é¡è‰²', + 'Transparency Mask' => 'é€æ˜Žé®ç½©', + 'WhiteIsZero' => '白色為零', + }, + }, + 'PlanarConfiguration' => { + Description => 'å½±åƒè³‡æ–™ç·¨æŽ’æ–¹å¼', + PrintConv => { + 'Chunky' => 'Chunky æ ¼å¼ (交錯型)', + 'Planar' => 'Planar æ ¼å¼ (å¹³é¢åž‹)', + }, + }, + 'Predictor' => { + Description => 'é æ¸¬', + PrintConv => { + 'Horizontal differencing' => 'æ°´å¹³å€åˆ¥', + 'None' => '沒有使用éŽé æ¸¬ç·¨ç¢¼æ–¹æ¡ˆ', + }, + }, + 'PrimaryChromaticities' => 'é é¸çš„色度', + 'ProcessingSoftware' => '處ç†è»Ÿé«”', + 'Province-State' => 'å·ž/çœ', + 'Quality' => { + Description => 'å½±åƒå“質', + PrintConv => { + 'Compressed RAW' => 'cRAW', + 'Compressed RAW + JPEG' => 'cRAW+JPEG', + 'Extra Fine' => '超精細', + 'Fine' => '精細', + 'Low' => '低å“質', + 'Normal' => '標準å“質', + 'RAW + JPEG' => 'RAW+JPEG', + 'Standard' => '標準', + }, + }, + 'Rating' => '評分', + 'RatingPercent' => '評分的百分比', + 'RecordMode' => '記錄模å¼', + 'ReferenceBlackWhite' => 'å°é»‘色和白色的åƒè€ƒåƒ¹å€¼', + 'RelatedImageFileFormat' => '相關的影åƒæª”案格å¼', + 'RelatedImageHeight' => '相關的影åƒé«˜åº¦', + 'RelatedImageWidth' => '相關的影åƒå¯¬åº¦', + 'RelatedSoundFile' => '相關的音頻檔案', + 'ResolutionUnit' => { + Description => '寬與高的單ä½', + PrintConv => { + 'None' => 'ç„¡', + 'cm' => '公分', + 'inches' => '英å‹', + }, + }, + 'RowsPerStrip' => 'æ¯æ¢åˆ—數', + 'SamplesPerPixel' => '元件數é‡', + 'Saturation' => { + Description => '飽和度', + PrintConv => { + 'High' => '高飽和度', + 'Low' => '低飽和度', + 'Normal' => '標準', + }, + }, + 'SceneCaptureType' => { + Description => '場景擷å–é¡žåž‹', + PrintConv => { + 'Landscape' => '風景', + 'Night' => '夜景', + 'Portrait' => 'è‚–åƒ', + 'Standard' => '標準', + }, + }, + 'SceneMode' => { + Description => '場景é¸æ“‡', + PrintConv => { + '3D Sweep Panorama' => '3D', + 'Anti Motion Blur' => '防止移動模糊', + 'Auto' => '自動', + 'Cont. Priority AE' => '連æ‹å„ªå…ˆAE', + 'Handheld Night Shot' => '手æŒå¤œæ‹', + 'Landscape' => '風景', + 'Macro' => '超近æ‹æ”', + 'Night Portrait' => '夜間肖åƒ', + 'Night Scene' => '夜景', + 'Night View/Portrait' => '夜景/è‚–åƒ', + 'Portrait' => 'è‚–åƒ', + 'Sports' => 'é‹å‹•å ´é¢', + 'Sunset' => '夕陽', + 'Sweep Panorama' => '全景æ”å½±', + }, + }, + 'SceneType' => { + Description => '場景類型', + PrintConv => { + 'Directly photographed' => '直接æ‹æ”çš„å½±åƒ', + }, + }, + 'SecurityClassification' => { + Description => '安全分類', + PrintConv => { + 'Confidential' => '秘密', + 'Restricted' => 'é™åˆ¶', + 'Secret' => '機密', + 'Top Secret' => '最高機密', + 'Unclassified' => '未分類', + }, + }, + 'SelfTimerMode' => '倒數自æ‹æ¨¡å¼', + 'SensingMethod' => { + Description => '感測器類型', + PrintConv => { + 'Color sequential area' => '連續彩色感測器', + 'Color sequential linear' => '連續彩色線性感測器', + 'Monochrome area' => '單色感測器', + 'Monochrome linear' => '單色線性感測器', + 'Not defined' => '未定義', + 'One-chip color area' => '單晶片彩色感測器', + 'Three-chip color area' => '三晶片彩色感測器', + 'Trilinear' => '三線性感測器', + 'Two-chip color area' => '雙晶片彩色感測器', + }, + }, + 'SerialNumber' => '照相機ID', + 'ShadingCompensation' => '陰影補償', + 'Sharpness' => { + Description => '銳利度', + PrintConv => { + 'Hard' => '硬', + 'Normal' => '標準', + 'Soft' => '軟', + }, + }, + 'ShootingMode' => 'æ‹æ”模å¼', + 'ShutterSpeed' => 'æ›å…‰æ™‚é–“', + 'ShutterSpeedValue' => 'å¿«é–€', + 'Software' => '軟體', + 'Source' => '來æº', + 'SpatialFrequencyResponse' => '空間頻率響應', + 'SpectralSensitivity' => '光譜éˆæ•åº¦', + 'State' => 'å·ž', + 'StripByteCounts' => '此資料å€æ®µçš„容é‡', + 'StripOffsets' => 'å½±åƒè³‡æ–™ä½å€', + 'SubSecTime' => '日期時間秒', + 'SubSecTimeDigitized' => '數ä½åŒ–的日期時間秒', + 'SubSecTimeOriginal' => '原始影åƒæ—¥æœŸæ™‚間秒', + 'SubfileType' => 'æ–°çš„ subfile é¡žåž‹', + 'Subject' => '主旨', + 'SubjectArea' => '主題地å€', + 'SubjectDistance' => '主體è·é›¢ç¯„åœ', + 'SubjectDistanceRange' => { + Description => '主體è·é›¢ç¯„åœ', + PrintConv => { + 'Close' => 'è¿‘', + 'Distant' => 'é ', + 'Macro' => 'å¾®è·', + 'Unknown' => '未知', + }, + }, + 'SubjectLocation' => '主題ä½ç½®', + 'SupplementalCategories' => '補充類別', + 'T4Options' => '未壓縮', + 'ThumbnailImage' => '縮略圖', + 'ThumbnailImageSize' => '縮圖尺寸', + 'Title' => '標題', + 'TransferFunction' => '傳éžå‡½æ•¸', + 'TransmissionReference' => '傳輸附註', + 'Urgency' => '緊急度', + 'UserComment' => '使用者註解', + 'WhiteBalance' => { + Description => '白平衡', + PrintConv => { + 'Auto' => '自動', + 'Black & White' => '黑白', + 'Cloudy' => '多雲', + 'Color Temperature/Color Filter' => '色溫 / 彩色濾é¡', + 'Cool White Fluorescent' => '冷白色螢光燈', + 'Custom' => '自設', + 'Custom 1' => '用戶自定1', + 'Custom 2' => '用戶自定2', + 'Custom 3' => '用戶自定3', + 'Custom 4' => '用戶自定4', + 'Day White Fluorescent' => '日光白色螢光燈', + 'Daylight' => '日光', + 'Daylight Fluorescent' => '日光色螢光燈', + 'Flash' => '閃光燈', + 'Fluorescent' => '熒光燈', + 'Manual' => '手動', + 'Shade' => '陰天', + 'Tungsten' => '白熾燈', + 'Warm White Fluorescent' => '暖白螢光燈', + 'White Fluorescent' => '白色熒光燈', + }, + }, + 'WhitePoint' => '白點色度', + 'Writer-Editor' => '說明作者', + 'XMP' => 'XMP 元資料', + 'XPosition' => 'X ä½ç½®', + 'XResolution' => '水平解æžåº¦', + 'YCbCrCoefficients' => 'é¡è‰²ç©ºé–“變化矩陣系數', + 'YCbCrPositioning' => { + Description => 'Y åŠ C 的設定', + PrintConv => { + 'Centered' => '中心', + 'Co-sited' => '一致', + }, + }, + 'YCbCrSubSampling' => 'Y 到 C 的抽樣比率', + 'YPosition' => 'Y ä½ç½®', + 'YResolution' => '垂直解æžåº¦', + 'ZoneMatching' => { + Description => 'å€åŸŸåŒ¹é…', + PrintConv => { + 'High Key' => '高', + 'ISO Setting Used' => '關閉', + 'Low Key' => '低', + }, + }, +); + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Lang::zh_tw.pm - ExifTool Traditional Chinese language translations + +=head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke and MikeF for providing this translation. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +=cut diff --git a/lib/Image/ExifTool/Leaf.pm b/lib/Image/ExifTool/Leaf.pm new file mode 100644 index 0000000..8df1fba --- /dev/null +++ b/lib/Image/ExifTool/Leaf.pm @@ -0,0 +1,517 @@ +#------------------------------------------------------------------------------ +# File: Leaf.pm +# +# Description: Read Creo Leaf EXIF meta information +# +# Revisions: 09/28/2005 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::Leaf; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.07'; + +sub ProcessLeaf($$$); + +%Image::ExifTool::Leaf::Main = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Camera' }, + NOTES => q{ + These tags are found in .MOS images from Leaf digital camera backs as + written by Creo Leaf Capture. They exist within the Leaf-specific directory + structure of EXIF tag 0x8606. The tables below list observed Leaf tags, + however ExifTool will extract any tags found in the Leaf directories even if + they don't appear in these tables. + }, + icc_camera_profile => { + Name => 'ICC_Profile', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + }, + }, + icc_rgb_ws_profile => { + Name => 'RGB_Profile', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + }, + }, + camera_profile => { + Name => 'CameraProfile', + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::CameraProfile', + }, + }, + JPEG_preview_data => { + %Image::ExifTool::previewImageTagInfo, + Groups => { 2 => 'Preview' }, + }, + JPEG_preview_info => 'PreviewInfo', + icc_camera_to_tone_space_flow => { + Name => 'ToneSpaceFlow', + Description => 'ICC To Tone Space Flow', + Format => 'int16u', + }, + icc_camera_to_tone_matrix => { + Name => 'ToneMatrix', + Description => 'ICC To Tone Matrix', + Format => 'int8u', + Binary => 1, + }, + PDA_histogram_data => { + Name => 'PDAHistogram', + Binary => 1, + }, + pattern_ratation_angle => { + Name => 'PatternAngle', + Description => 'Pattern Rotation Angle', + Format => 'int16u', + Notes => '"ratation" is not a typo', + }, + back_serial_number => { + Name => 'BackSerial', + Description => 'Back Serial Number', + PrintConv => '$val =~ s/ .*//s; $val', + }, + image_offset => { Format => 'int16u' }, +); + +%Image::ExifTool::Leaf::CameraProfile = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Camera' }, + CamProf_version => 'CameraProfileVersion', + CamProf_name => 'CameraName', + CamProf_type => 'CameraType', + CamProf_back_type => 'CameraBackType', + CamProf_back_type => { + Name => 'CameraBackType', + }, + CamProf_capture_profile => { + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::CaptureProfile', + }, + }, + CamProf_image_profile => { + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::ImageProfile', + }, + }, +); + +%Image::ExifTool::Leaf::CaptureProfile = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Image' }, + CaptProf_version => {}, + CaptProf_name => {}, + CaptProf_type => {}, + CaptProf_back_type => {}, + CaptProf_serial_number => { + Name => 'CaptureSerial', + Description => 'Capture Serial Number', + PrintConv => '$val =~ s/ .*//s; $val', + }, + CaptProf_image_offset => {}, + CaptProf_luminance_consts => {}, + CaptProf_xy_offset_info => 'XYOffsetInfo', + CaptProf_color_matrix => {}, + CaptProf_reconstruction_type=> {}, + CaptProf_image_fields => {}, + CaptProf_image_bounds => {}, + CaptProf_number_of_planes => {}, + CaptProf_raw_data_rotation => {}, + CaptProf_color_averages => {}, + CaptProf_mosaic_pattern => {}, + CaptProf_dark_correction_type=>{}, + CaptProf_right_dark_rect => {}, + CaptProf_left_dark_rect => {}, + CaptProf_center_dark_rect => {}, + CaptProf_CCD_rect => {}, + CaptProf_CCD_valid_rect => {}, + CaptProf_CCD_video_rect => {}, +); + +%Image::ExifTool::Leaf::ImageProfile = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Image' }, + ImgProf_version => {}, + ImgProf_name => {}, + ImgProf_type => {}, + ImgProf_back_type => {}, + ImgProf_shoot_setup => { + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::ShootSetup', + }, + }, + ImgProf_image_status => {}, + ImgProf_rotation_angle => {}, +); + +%Image::ExifTool::Leaf::ShootSetup = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Image' }, + ShootObj_version => {}, + ShootObj_name => {}, + ShootObj_type => {}, + ShootObj_back_type => {}, + ShootObj_capture_setup => { + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::CaptureSetup', + }, + }, + ShootObj_color_setup => { + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::ColorSetup', + }, + }, + ShootObj_save_setup => { + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::SaveSetup', + }, + }, + ShootObj_camera_setup => { + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::CameraSetup', + }, + }, + ShootObj_look_header => { + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::LookHeader', + }, + }, +); + +%Image::ExifTool::Leaf::CaptureSetup = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Image' }, + CaptureObj_version => {}, + CaptureObj_name => {}, + CaptureObj_type => {}, + CaptureObj_back_type => {}, + CaptureObj_neutals => { + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::Neutrals', + }, + }, + CaptureObj_selection => { + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::Selection', + }, + }, + CaptureObj_tone_curve => { + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::ToneCurve', + }, + }, + CaptureObj_sharpness => { + SubDirectory => { + TagTable => 'Image::ExifTool::Leaf::Sharpness', + }, + }, + CaptureObj_single_quality => {}, + CaptureObj_Multi_quality => {}, +); + +%Image::ExifTool::Leaf::Neutrals = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Image' }, + NeutObj_version => {}, + NeutObj_name => {}, + NeutObj_type => {}, + NeutObj_back_type => {}, + NeutObj_neutrals => {}, + NeutObj_color_casts => {}, + NeutObj_shadow_end_points => {}, + NeutObj_highlight_end_points => {}, +); + +%Image::ExifTool::Leaf::Selection = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Image' }, + SelObj_version => {}, + SelObj_name => {}, + SelObj_type => {}, + SelObj_back_type => {}, + SelObj_rect => {}, + SelObj_resolution => {}, + SelObj_scale => {}, + SelObj_locks => {}, + SelObj_orientation => {}, +); + +%Image::ExifTool::Leaf::ToneCurve = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Image' }, + ToneObj_version => {}, + ToneObj_name => {}, + ToneObj_type => {}, + ToneObj_back_type => {}, + ToneObj_npts => {}, + ToneObj_tones => {}, + ToneObj_gamma => {}, +); + +%Image::ExifTool::Leaf::Sharpness = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Image' }, + SharpObj_version => {}, + SharpObj_name => {}, + SharpObj_type => {}, + SharpObj_back_type => {}, + SharpObj_sharp_method => {}, + SharpObj_data_len => {}, + SharpObj_sharp_info => {}, +); + +%Image::ExifTool::Leaf::ColorSetup = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Image' }, + ColorObj_version => {}, + ColorObj_name => {}, + ColorObj_type => {}, + ColorObj_back_type => {}, + ColorObj_has_ICC => {}, + ColorObj_input_profile => {}, + ColorObj_output_profile => {}, + ColorObj_color_mode => {}, + ColorObj_color_type => {}, +); + +%Image::ExifTool::Leaf::SaveSetup = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Other' }, + SaveObj_version => {}, + SaveObj_name => {}, + SaveObj_type => {}, + SaveObj_back_type => {}, + SaveObj_leaf_auto_active=> {}, + SaveObj_leaf_hot_folder => {}, + SaveObj_leaf_output_file_type => {}, + SaveObj_leaf_auto_base_name => {}, + SaveObj_leaf_save_selection => {}, + SaveObj_leaf_open_proc_HDR => {}, + SaveObj_std_auto_active => {}, + SaveObj_std_hot_folder => {}, + SaveObj_std_output_file_type => {}, + SaveObj_std_output_color_mode => {}, + SaveObj_std_output_bit_depth => {}, + SaveObj_std_base_name => {}, + SaveObj_std_save_selection => {}, + SaveObj_std_oxygen => {}, + SaveObj_std_open_in_photoshop => {}, + SaveObj_std_scaled_output => {}, + SaveObj_std_sharpen_output => {}, +); + +%Image::ExifTool::Leaf::CameraSetup = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Camera' }, + CameraObj_version => {}, + CameraObj_name => {}, + CameraObj_type => {}, + CameraObj_back_type => {}, + CameraObj_ISO_speed => {}, + CameraObj_strobe => {}, + CameraObj_camera_type => {}, + CameraObj_lens_type => {}, + CameraObj_lens_ID => {}, +); + +%Image::ExifTool::Leaf::LookHeader = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Other' }, + LookHead_version => {}, + LookHead_name => {}, + LookHead_type => {}, + LookHead_back_type => {}, +); + +# tag table for any unknown Leaf directories +%Image::ExifTool::Leaf::Unknown = ( + PROCESS_PROC => \&ProcessLeaf, + GROUPS => { 0 => 'Leaf', 2 => 'Unknown' }, +); + +# table for Leaf SubIFD entries +%Image::ExifTool::Leaf::SubIFD = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'LeafSubIFD', 2 => 'Image'}, + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + NOTES => q{ + Leaf writes a TIFF-format sub-IFD inside IFD0 of a MOS image. No tags in + this sub-IFD are currently known, except for tags 0x8602 and 0x8606 which + really shouldn't be here anyway (so they don't appear in the table below) + because they duplicate references to the same data from tags with the same + ID in IFD0. + }, +); + +# prepare Leaf tables by generating tag 'Name' and table 'NOTES' +{ + my @tableList = ( 'Image::ExifTool::Leaf::Main' ); + my ($tag, %doneTable); + # keep prefix in tag name of common tags + my %keepPrefix = ( Version=>1, Name=>1, Type=>1, BackType=>1 ); + while (@tableList) { + my $table = shift @tableList; + next if $doneTable{$table}; + my $prefix = ($table =~ /::Main$/) ? undef : ''; + $doneTable{$table} = 1; + no strict 'refs'; + $table = \%$table; + use strict 'refs'; + foreach $tag (keys %$table) { + my $tagInfo = $$table{$tag}; + next unless ref $tagInfo eq 'HASH'; + next if $tag eq 'GROUPS'; + if (defined $prefix and not $prefix) { + ($prefix = $tag) =~ s/_.*//; + } + unless ($$tagInfo{Name}) { + my $name; + ($name = $tag) =~ s/_(.)/\U$1/g; + if ($prefix) { + $name =~ s/^$prefix//; + $name = $prefix . $name if $keepPrefix{$name}; + } + $$tagInfo{Name} = ucfirst($name); + } + next unless $$tagInfo{SubDirectory}; + my $subTable = $tagInfo->{SubDirectory}->{TagTable}; + next unless $subTable =~ /::Leaf::/; + push @tableList, $subTable; + } + next unless $prefix; + $$table{NOTES} = "All B<Tag ID>'s in the following table have a " . + "leading '${prefix}_' which\nhas been removed.\n"; + } +} + +#------------------------------------------------------------------------------ +# Process Leaf information +# Inputs: 0) ExifTool object reference +# 1) Reference to directory information hash +# 2) Pointer to tag table for this directory +# Returns: 1 on success, otherwise returns 0 and sets a Warning +sub ProcessLeaf($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || $$dirInfo{DataLen} - $dirStart; + my $dirEnd = $dirStart + $dirLen; + my $verbose = $et->Options('Verbose'); + my $pos = $dirStart; + my $hdrLen = 52; # header length for PKTS information + my $success; + + $verbose and $et->VerboseDir('Leaf'); + for (;;) { + last if $pos + $hdrLen > $dirEnd; + my $header = substr($$dataPt, $pos, $hdrLen); + last unless substr($header, 0, 4) eq 'PKTS'; + $success = 1; + my $size = Get32u(\$header, 48); + $pos += $hdrLen; + if ($pos + $size > $dirEnd) { + $et->Warn('Truncated Leaf data'); + last; + } + my $tag = substr($header, 8, 40); + $tag =~ s/\0.*//s; + next unless $tag; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + # generate tag info for unknown tags + my $val; + if ($tagInfo and $$tagInfo{Format}) { + $val = ReadValue($dataPt, $pos, $$tagInfo{Format}, undef, $size); + } else { + $val = substr($$dataPt, $pos, $size); + } + unless ($tagInfo) { + my $name = ucfirst($tag); + $name =~ s/_(.)/\U$1/g; + if ($val =~ /^PKTS\0\0\0\x01/) { + # also unpack unknown directories + $tagInfo = { + Name => $name, + SubDirectory => { TagTable => 'Image::ExifTool::Leaf::Unknown' }, + }; + } elsif ($tagTablePtr ne \%Image::ExifTool::Leaf::Main or + $et->Options('Unknown')) + { + $tagInfo = { + Name => $name, + Writable => 0, + PrintConv => 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val', + }; + # make tags in main table unknown because they tend to be binary + $$tagInfo{Unknown} = 1 if $tagTablePtr eq \%Image::ExifTool::Leaf::Main; + } + $tagInfo and AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + if ($verbose) { + $et->VerboseInfo($tag, $tagInfo, + Table => $tagTablePtr, + Value => $val, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + Size => $size, + Start => $pos, + ); + } + if ($tagInfo) { + if ($$tagInfo{SubDirectory}) { + my %subdirInfo = ( + DataPt => $dataPt, + DirLen => $size, + DirStart => $pos, + DataPos => $$dirInfo{DataPos}, + DirName => 'Leaf PKTS', + ); + my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + $et->ProcessDirectory(\%subdirInfo, $subTable); + } else { + $val =~ tr/\n/ /; # translate newlines to spaces + $val =~ s/\0+$//; # remove null terminators + $et->FoundTag($tagInfo, $val); + } + } + $pos += $size; + } + $success or $et->Warn('Bad format Leaf data'); + return $success; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Leaf - Read Creo Leaf EXIF meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +meta information from Leaf digital camera backs written by Creo Leaf +Capture. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Leaf Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Lytro.pm b/lib/Image/ExifTool/Lytro.pm new file mode 100644 index 0000000..d4a1ae1 --- /dev/null +++ b/lib/Image/ExifTool/Lytro.pm @@ -0,0 +1,214 @@ +#------------------------------------------------------------------------------ +# File: Lytro.pm +# +# Description: Read Lytro LFP files +# +# Revisions: 2014-07-17 - P. Harvey Created +# +# References: 1) http://optics.miloush.net/lytro/TheFileFormat.aspx +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lytro; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Import; + +$VERSION = '1.03'; + +sub ExtractTags($$$); + +# Lytro LFP tags (ref PH) +%Image::ExifTool::Lytro::Main = ( + GROUPS => { 2 => 'Camera' }, + VARS => { NO_ID => 1 }, + NOTES => q{ + Tag definitions for Lytro Light Field Picture (LFP) files. ExifTool + extracts the full JSON metadata blocks, as well as breaking them down into + individual tags. All available tags are extracted from the JSON metadata, + even if they don't appear in the table below. + }, + JSONMetadata => { + Notes => 'the full JSON-format metadata blocks', + Binary => 1, + List => 1, + }, + EmbeddedImage => { + Notes => 'JPEG image embedded in LFP files written by Lytro Desktop', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + Type => { Name => 'CameraType' }, + CameraMake => { Name => 'Make' }, + CameraModel => { Name => 'Model', Description => 'Camera Model Name' }, + CameraSerialNumber => { Name => 'SerialNumber'}, + CameraFirmware => { Name => 'FirmwareVersion'}, + DevicesAccelerometerSampleArrayTime => { Name => 'AccelerometerTime'}, + DevicesAccelerometerSampleArrayX => { Name => 'AccelerometerX'}, + DevicesAccelerometerSampleArrayY => { Name => 'AccelerometerY'}, + DevicesAccelerometerSampleArrayZ => { Name => 'AccelerometerZ'}, + DevicesClockZuluTime => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + }, + DevicesLensFNumber => { + Name => 'FNumber', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + }, + DevicesLensFocalLength => { + Name => 'FocalLength', + ValueConv => '$val * 1000', # convert from metres to mm + PrintConv => 'sprintf("%.1f mm",$val)', + }, + DevicesLensTemperature => { + Name => 'LensTemperature', + PrintConv => 'sprintf("%.1f C",$val)', + }, + DevicesSocTemperature => { + Name => 'SocTemperature', + PrintConv => 'sprintf("%.1f C",$val)', + }, + DevicesShutterFrameExposureDuration => { + Name => 'FrameExposureTime', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + DevicesShutterPixelExposureDuration => { + Name => 'ExposureTime', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + DevicesSensorPixelPitch => { + Name => 'FocalPlaneXResolution', + Notes => 'Y resolution is the same as X resolution', + ValueConv => '25.4 / $val / 1000', # convert from metres to pixels/inch + }, + DevicesSensorSensorSerial => { Name => 'SensorSerialNumber'}, + DevicesSensorIso => { Name => 'ISO' }, + ImageLimitExposureBias => { Groups => { 2 => 'Image' }, PrintConv => 'sprintf("%+.1f", $val)' }, + ImageModulationExposureBias => { Groups => { 2 => 'Image' }, PrintConv => 'sprintf("%+.1f", $val)' }, + ImageOrientation => { + Name => 'Orientation', + Groups => { 2 => 'Image' }, + PrintConv => { + 1 => 'Horizontal (normal)', + }, + }, +); + +#------------------------------------------------------------------------------ +# Extract tags from a parsed JSON hash +# Inputs: 0) ExifTool ref, 1) tag hash ref, 2) base tag name +sub ExtractTags($$$) +{ + my ($et, $meta, $parent) = @_; + ref $meta eq 'HASH' or $et->Warn('Invalid LFP metadata'), return; + my ($key, $val, $name, $tagTablePtr); + foreach $key (sort keys %$meta) { + my $tag = $parent . ucfirst($key); + foreach $val (ref $$meta{$key} eq 'ARRAY' ? @{$$meta{$key}} : $$meta{$key}) { + ref $val eq 'HASH' and ExtractTags($et, $val, $tag), next; + $tagTablePtr or $tagTablePtr = GetTagTable('Image::ExifTool::Lytro::Main'); + unless ($$tagTablePtr{$tag}) { + ($name = $tag) =~ s/[^-_a-zA-Z0-9](.?)/\U$1/g; + $name =~ s/ParametersVendorContentComLytroTags//; + my %tagInfo; + $tagInfo{Groups} = { 2 => 'Image' } unless $name =~ s/^Devices//; + $tagInfo{List} = 1 if ref $$meta{$key} eq 'ARRAY'; + $tagInfo{Name} = $name; + my $str = $tag eq $name ? '' : " as $name"; + $et->VPrint(0, " [adding $tag$str]\n"); + AddTagToTable($tagTablePtr, $tag, \%tagInfo); + } + $et->HandleTag($tagTablePtr, $tag, $val); + } + } +} + +#------------------------------------------------------------------------------ +# Process segments from a Lytro LFP image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid Lytro image +sub ProcessLFP($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my ($buff, $id); + + # validate the Lytro file header + return 0 unless $raf->Read($buff, 16) == 16 and $buff =~ /^\x89LFP\x0d\x0a\x1a\x0a/; + $et->SetFileType(); # set the FileType tag + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::Lytro::Main'); + while ($raf->Read($buff, 16) == 16) { + $buff =~ /^\x89LF/ or $et->Warn('LFP format error'), last; + my $size = Get32u(\$buff, 12); + $size & 0x80000000 and $et->Warn('Invalid LFP segment size'), last; + $raf->Read($id, 80) == 80 or $et->Warn('Truncated LFP segment'), last; # ignore the sha1 + if ($verbose) { + $id =~ s/\0.*//s; + $et->VPrint(0, substr($buff,1,3), " segment ($size bytes, $id)\n"); + } + if ($size > 20000000) { + $raf->Seek($size, 1) or $et->Warn('Seek error in LFP file'), last; + } else { + $raf->Read($buff,$size) == $size or $et->Warn('Truncated LFP data'), last; + $et->VerboseDump(\$buff, Addr=>$raf->Tell()-$size); + if ($buff =~ /^\{\s+"/) { # JSON metadata? + pos($buff) = 0; + $et->HandleTag($tagTablePtr, 'JSONMetadata', $buff); + my $meta = Image::ExifTool::Import::ReadJSONObject(undef, \$buff); + ExtractTags($et, $meta, ''); + } elsif ($buff =~ /^\xff\xd8\xff/) { # embedded JPEG image? + $et->HandleTag($tagTablePtr, 'EmbeddedImage', $buff); + } + } + # skip padding if necessary + my $pad = 16 - ($size % 16); + $raf->Seek($pad, 1) if $pad != 16; + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Lytro - Read Lytro LFP files + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to read metadata +from Lytro Light Field Picture (LFP) files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://optics.miloush.net/lytro/TheFileFormat.aspx> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Lytro Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/M2TS.pm b/lib/Image/ExifTool/M2TS.pm new file mode 100644 index 0000000..86c7273 --- /dev/null +++ b/lib/Image/ExifTool/M2TS.pm @@ -0,0 +1,882 @@ +#------------------------------------------------------------------------------ +# File: M2TS.pm +# +# Description: Read M2TS (AVCHD) meta information +# +# Revisions: 2009/07/03 - P. Harvey Created +# +# References: 1) http://neuron2.net/library/mpeg2/iso13818-1.pdf +# 2) http://www.blu-raydisc.com/Assets/Downloadablefile/BD-RE_Part3_V2.1_WhitePaper_080406-15271.pdf +# 3) http://www.videohelp.com/forum/archive/reading-avchd-playlist-files-bdmv-playlist-mpl-t358888.html +# 4) http://en.wikipedia.org/wiki/MPEG_transport_stream +# 5) http://www.dunod.com/documents/9782100493463/49346_DVB.pdf +# 6) http://trac.handbrake.fr/browser/trunk/libhb/stream.c +# 7) http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=04560141 +# 8) http://www.w6rz.net/xport.zip +# +# Notes: Variable names containing underlines are the same as in ref 1. +# +# Glossary: PES = Packetized Elementary Stream +# PAT = Program Association Table +# PMT = Program Map Table +# PCR = Program Clock Reference +# PID = Packet Identifier +# +# To Do: - parse PCR to obtain average bitrates? +#------------------------------------------------------------------------------ + +package Image::ExifTool::M2TS; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.21'; + +# program map table "stream_type" lookup (ref 6/1) +my %streamType = ( + 0x00 => 'Reserved', + 0x01 => 'MPEG-1 Video', + 0x02 => 'MPEG-2 Video', + 0x03 => 'MPEG-1 Audio', + 0x04 => 'MPEG-2 Audio', + 0x05 => 'ISO 13818-1 private sections', + 0x06 => 'ISO 13818-1 PES private data', + 0x07 => 'ISO 13522 MHEG', + 0x08 => 'ISO 13818-1 DSM-CC', + 0x09 => 'ISO 13818-1 auxiliary', + 0x0A => 'ISO 13818-6 multi-protocol encap', + 0x0B => 'ISO 13818-6 DSM-CC U-N msgs', + 0x0C => 'ISO 13818-6 stream descriptors', + 0x0D => 'ISO 13818-6 sections', + 0x0E => 'ISO 13818-1 auxiliary', + 0x0F => 'MPEG-2 AAC Audio', + 0x10 => 'MPEG-4 Video', + 0x11 => 'MPEG-4 LATM AAC Audio', + 0x12 => 'MPEG-4 generic', + 0x13 => 'ISO 14496-1 SL-packetized', + 0x14 => 'ISO 13818-6 Synchronized Download Protocol', + # 0x15-0x7F => 'ISO 13818-1 Reserved', + 0x1b => 'H.264 (AVC) Video', + 0x24 => 'H.265 (HEVC) Video', #PH + 0x80 => 'DigiCipher II Video', + 0x81 => 'A52/AC-3 Audio', + 0x82 => 'HDMV DTS Audio', + 0x83 => 'LPCM Audio', + 0x84 => 'SDDS Audio', + 0x85 => 'ATSC Program ID', + 0x86 => 'DTS-HD Audio', + 0x87 => 'E-AC-3 Audio', + 0x8a => 'DTS Audio', + 0x90 => 'PGS Audio', #https://www.avsforum.com/threads/bass-eq-for-filtered-movies.2995212/page-399 + 0x91 => 'A52b/AC-3 Audio', + 0x92 => 'DVD_SPU vls Subtitle', + 0x94 => 'SDDS Audio', + 0xa0 => 'MSCODEC Video', + 0xea => 'Private ES (VC-1)', + # 0x80-0xFF => 'User Private', +); + +# "table_id" values (ref 5) +my %tableID = ( + 0x00 => 'Program Association', + 0x01 => 'Conditional Access', + 0x02 => 'Program Map', + 0x03 => 'Transport Stream Description', + 0x40 => 'Actual Network Information', + 0x41 => 'Other Network Information', + 0x42 => 'Actual Service Description', + 0x46 => 'Other Service Description', + 0x4a => 'Bouquet Association', + 0x4e => 'Actual Event Information - Present/Following', + 0x4f => 'Other Event Information - Present/Following', + 0x50 => 'Actual Event Information - Schedule', #(also 0x51-0x5f) + 0x60 => 'Other Event Information - Schedule', # (also 0x61-0x6f) + 0x70 => 'Time/Date', + 0x71 => 'Running Status', + 0x72 => 'Stuffing', + 0x73 => 'Time Offset', + 0x7e => 'Discontinuity Information', + 0x7f => 'Selection Information', + # 0x80-0xfe => 'User Defined', +); + +# PES stream ID's for which a syntax field does not exist +my %noSyntax = ( + 0xbc => 1, # program_stream_map + 0xbe => 1, # padding_stream + 0xbf => 1, # private_stream_2 + 0xf0 => 1, # ECM_stream + 0xf1 => 1, # EMM_stream + 0xf2 => 1, # DSMCC_stream + 0xf8 => 1, # ITU-T Rec. H.222.1 type E stream + 0xff => 1, # program_stream_directory +); + +my $knotsToKph = 1.852; # knots --> km/h + +# information extracted from the MPEG-2 transport stream +%Image::ExifTool::M2TS::Main = ( + GROUPS => { 2 => 'Video' }, + VARS => { NO_ID => 1 }, + NOTES => q{ + The MPEG-2 transport stream is used as a container for many different + audio/video formats (including AVCHD). This table lists information + extracted from M2TS files. + }, + VideoStreamType => { + PrintHex => 1, + PrintConv => \%streamType, + SeparateTable => 'StreamType', + }, + AudioStreamType => { + PrintHex => 1, + PrintConv => \%streamType, + SeparateTable => 'StreamType', + }, + Duration => { + Notes => q{ + the -fast option may be used to avoid scanning to the end of file to + calculate the Duration + }, + ValueConv => '$val / 27000000', # (clock is 27MHz) + PrintConv => 'ConvertDuration($val)', + }, + # the following tags are for documentation purposes only + _AC3 => { SubDirectory => { TagTable => 'Image::ExifTool::M2TS::AC3' } }, + _H264 => { SubDirectory => { TagTable => 'Image::ExifTool::H264::Main' } }, +); + +# information extracted from AC-3 audio streams +%Image::ExifTool::M2TS::AC3 = ( + GROUPS => { 1 => 'AC3', 2 => 'Audio' }, + VARS => { NO_ID => 1 }, + NOTES => 'Tags extracted from AC-3 audio streams.', + AudioSampleRate => { + PrintConv => { + 0 => '48000', + 1 => '44100', + 2 => '32000', + }, + }, + AudioBitrate => { + PrintConvColumns => 2, + ValueConv => { + 0 => 32000, + 1 => 40000, + 2 => 48000, + 3 => 56000, + 4 => 64000, + 5 => 80000, + 6 => 96000, + 7 => 112000, + 8 => 128000, + 9 => 160000, + 10 => 192000, + 11 => 224000, + 12 => 256000, + 13 => 320000, + 14 => 384000, + 15 => 448000, + 16 => 512000, + 17 => 576000, + 18 => 640000, + 32 => '32000 max', + 33 => '40000 max', + 34 => '48000 max', + 35 => '56000 max', + 36 => '64000 max', + 37 => '80000 max', + 38 => '96000 max', + 39 => '112000 max', + 40 => '128000 max', + 41 => '160000 max', + 42 => '192000 max', + 43 => '224000 max', + 44 => '256000 max', + 45 => '320000 max', + 46 => '384000 max', + 47 => '448000 max', + 48 => '512000 max', + 49 => '576000 max', + 50 => '640000 max', + }, + PrintConv => 'ConvertBitrate($val)', + }, + SurroundMode => { + PrintConv => { + 0 => 'Not indicated', + 1 => 'Not Dolby surround', + 2 => 'Dolby surround', + }, + }, + AudioChannels => { + PrintConvColumns => 2, + PrintConv => { + 0 => '1 + 1', + 1 => 1, + 2 => 2, + 3 => 3, + 4 => '2/1', + 5 => '3/1', + 6 => '2/2', + 7 => '3/2', + 8 => 1, + 9 => '2 max', + 10 => '3 max', + 11 => '4 max', + 12 => '5 max', + 13 => '6 max', + }, + }, +); + +#------------------------------------------------------------------------------ +# Extract information from AC-3 audio stream +# Inputs: 0) ExifTool ref, 1) data ref +# Reference: http://www.atsc.org/standards/a_52b.pdf +sub ParseAC3Audio($$) +{ + my ($et, $dataPt) = @_; + if ($$dataPt =~ /\x0b\x77..(.)/sg) { + my $sampleRate = ord($1) >> 6; + my $tagTablePtr = GetTagTable('Image::ExifTool::M2TS::AC3'); + $et->HandleTag($tagTablePtr, AudioSampleRate => $sampleRate); + } +} + +#------------------------------------------------------------------------------ +# Extract information from AC-3 stream descriptor +# Inputs: 0) ExifTool ref, 1) data ref +# Reference: http://www.atsc.org/standards/a_52b.pdf +# Note: This information is duplicated in the Audio stream, but it +# is somewhat easier to extract it from the descriptor instead +sub ParseAC3Descriptor($$) +{ + my ($et, $dataPt) = @_; + return if length $$dataPt < 3; + my @v = unpack('C3', $$dataPt); + my $tagTablePtr = GetTagTable('Image::ExifTool::M2TS::AC3'); + # $et->HandleTag($tagTablePtr, 'AudioSampleRate', $v[0] >> 5); + $et->HandleTag($tagTablePtr, 'AudioBitrate', $v[1] >> 2); + $et->HandleTag($tagTablePtr, 'SurroundMode', $v[1] & 0x03); + $et->HandleTag($tagTablePtr, 'AudioChannels', ($v[2] >> 1) & 0x0f); + # don't (yet) decode any more (language codes, etc) +} + +#------------------------------------------------------------------------------ +# Parse PID stream data +# Inputs: 0) ExifTool ref, 1) PID number, 2) PID type, 3) PID name, 4) data ref +# Returns: 0=stream parsed OK, +# 1=stream parsed but we want to parse more of these, +# -1=can't parse yet because we don't know the type +sub ParsePID($$$$$) +{ + my ($et, $pid, $type, $pidName, $dataPt) = @_; + # can't parse until we know the type (Program Map Table may be later in the stream) + return -1 unless defined $type; + my $verbose = $et->Options('Verbose'); + if ($verbose > 1) { + my $out = $et->Options('TextOut'); + printf $out "Parsing stream 0x%.4x (%s)\n", $pid, $pidName; + $et->VerboseDump($dataPt); + } + my $more = 0; + if ($type == 0x01 or $type == 0x02) { + # MPEG-1/MPEG-2 Video + require Image::ExifTool::MPEG; + Image::ExifTool::MPEG::ParseMPEGAudioVideo($et, $dataPt); + } elsif ($type == 0x03 or $type == 0x04) { + # MPEG-1/MPEG-2 Audio + require Image::ExifTool::MPEG; + Image::ExifTool::MPEG::ParseMPEGAudio($et, $dataPt); + } elsif ($type == 0x1b) { + # H.264 Video + require Image::ExifTool::H264; + $more = Image::ExifTool::H264::ParseH264Video($et, $dataPt); + # force parsing additional H264 frames with ExtractEmbedded option + if ($$et{OPTIONS}{ExtractEmbedded}) { + $more = 1; + } elsif (not $$et{OPTIONS}{Validate}) { + $et->WarnOnce('The ExtractEmbedded option may find more tags in the video data',3); + } + } elsif ($type == 0x81 or $type == 0x87 or $type == 0x91) { + # AC-3 audio + ParseAC3Audio($et, $dataPt); + } elsif ($type < 0) { + if ($$dataPt =~ /^(.{164})?(.{24})A[NS][EW]/s) { + # (Blueskysea B4K, Novatek NT96670) + # 0000: 01 00 ff 00 30 31 32 33 34 35 37 38 61 62 63 64 [....01234578abcd] + # 0010: 65 66 67 0a 00 00 00 00 00 00 00 00 00 00 00 00 [efg.............] + # 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0040: 00 00 00 00 30 31 32 33 34 35 37 38 71 77 65 72 [....01234578qwer] + # 0050: 74 79 75 69 6f 70 0a 00 00 00 00 00 00 00 00 00 [tyuiop..........] + # 0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0080: 00 00 00 00 63 38 61 61 32 35 63 66 34 35 65 65 [....c8aa25cf45ee] + # 0090: 61 39 65 32 34 34 32 66 61 65 62 35 65 30 39 39 [a9e2442faeb5e099] + # 00a0: 30 37 64 34 15 00 00 00 10 00 00 00 1b 00 00 00 [07d4............] + # 00b0: 15 00 00 00 01 00 00 00 09 00 00 00 41 4e 57 00 [............ANW.] + # 00c0: 82 9a 57 45 98 b2 00 46 66 66 e4 41 d7 e3 14 43 [..WE...Fff.A...C] + # 00d0: 01 00 02 00 03 00 04 00 05 00 06 00 [............] + # (Viofo A119V3) + # 0000: 08 00 00 00 07 00 00 00 18 00 00 00 15 00 00 00 [................] + # 0010: 03 00 00 00 0b 00 00 00 41 4e 45 00 01 f2 ac 45 [........ANE....E] + # 0020: 2d 7f 6e 45 b8 1e 97 41 d7 23 46 43 00 00 00 00 [-.nE...A.#FC....] + # pad with dummy header and parse with existing FreeGPS code (minimum 92 bytes) + my $dat = ("\0" x 16) . substr($$dataPt, length($1 || '')) . ("\0" x 20); + my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream'); + Image::ExifTool::QuickTime::ProcessFreeGPS($et, { DataPt => \$dat }, $tbl); + $more = 1; + } elsif ($$dataPt =~ /^A([NS])([EW])\0/s) { + # INNOVV TS video (same format is INNOVV MP4) + SetByteOrder('II'); + my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream'); + while ($$dataPt =~ /(A[NS][EW]\0.{28})/g) { + my $dat = $1; + my $lat = abs(GetFloat(\$dat, 4)); # (abs just to be safe) + my $lon = abs(GetFloat(\$dat, 8)); # (abs just to be safe) + my $spd = GetFloat(\$dat, 12) * $knotsToKph; + my $trk = GetFloat(\$dat, 16); + my @acc = unpack('x20V3', $dat); + map { $_ = $_ - 4294967296 if $_ >= 0x80000000 } @acc; + Image::ExifTool::QuickTime::ConvertLatLon($lat, $lon); + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + $et->HandleTag($tagTbl, GPSLatitude => abs($lat) * (substr($dat,1,1) eq 'S' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSLongitude => abs($lon) * (substr($dat,2,1) eq 'W' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSSpeed => $spd); + $et->HandleTag($tagTbl, GPSSpeedRef => 'K'); + $et->HandleTag($tagTbl, GPSTrack => $trk); + $et->HandleTag($tagTbl, GPSTrackRef => 'T'); + $et->HandleTag($tagTbl, Accelerometer => "@acc"); + } + SetByteOrder('MM'); + $more = 1; + } elsif ($$dataPt =~ /^\$(GPSINFO|GSNRINFO),/) { + # $GPSINFO,0x0004,2021.08.09 13:27:36,2341.54561,12031.70135,8.0,51,153,0,0,\x0d + # $GSNRINFO,0.01,0.04,0.25\0 + $$dataPt =~ tr/\x0d/\x0a/; + $$dataPt =~ tr/\0//d; + my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream'); + my @lines = split /\x0a/, $$dataPt; + my ($line, $lastTime); + foreach $line (@lines) { + if ($line =~ /^\$GPSINFO/) { + my @a = split /,/, $lines[0]; + next unless @a > 7; + # ignore duplicate fixes + next if $lastTime and $a[2] eq $lastTime; + $lastTime = $a[2]; + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + $a[2] =~ tr/./:/; + # (untested, and probably doesn't work for S/W hemispheres) + my ($lat, $lon) = @a[3,4]; + Image::ExifTool::QuickTime::ConvertLatLon($lat, $lon); + # $a[0] - flags? values: '0x0001','0x0004','0x0008','0x0010' + $et->HandleTag($tagTbl, GPSDateTime => $a[2]); + $et->HandleTag($tagTbl, GPSLatitude => $lat); + $et->HandleTag($tagTbl, GPSLongitude => $lon); + $et->HandleTag($tagTbl, GPSSpeed => $a[5]); + $et->HandleTag($tagTbl, GPSSpeedRef => 'K'); + # $a[6] - values: 48-60 + $et->HandleTag($tagTbl, GPSTrack => $a[7]); + $et->HandleTag($tagTbl, GPSTrackRef => 'T'); + # #a[8,9] - always 0 + } elsif ($line =~ /^\$GSNRINFO/) { + my @a = split /,/, $line; + shift @a; + $et->HandleTag($tagTbl, Accelerometer => "@a"); + } + } + $more = 1; + } elsif ($$dataPt =~ /^.{44}A\0{3}.{4}([NS])\0{3}.{4}([EW])\0{3}/s and length($$dataPt) >= 84) { + #forum11320 + SetByteOrder('II'); + my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream'); + my $lat = abs(GetFloat($dataPt, 48)); # (abs just to be safe) + my $lon = abs(GetFloat($dataPt, 56)); # (abs just to be safe) + my $spd = GetFloat($dataPt, 64); + my $trk = GetFloat($dataPt, 68); + $et->WarnOnce('GPSLatitude/Longitude encryption is not yet known, so these will be wrong'); + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + my @date = unpack('x32V3x28V3', $$dataPt); + $date[3] += 2000; + $et->HandleTag($tagTbl, GPSDateTime => sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @date[3..5,0..2])); + $et->HandleTag($tagTbl, GPSLatitude => abs($lat) * ($1 eq 'S' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSLongitude => abs($lon) * ($2 eq 'W' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSSpeed => $spd); + $et->HandleTag($tagTbl, GPSSpeedRef => 'K'); + $et->HandleTag($tagTbl, GPSTrack => $trk); + $et->HandleTag($tagTbl, GPSTrackRef => 'T'); + SetByteOrder('MM'); + $more = 1; + } + delete $$et{DOC_NUM}; + } + return $more; +} + +#------------------------------------------------------------------------------ +# Extract information from a M2TS file +# Inputs: 0) ExifTool object reference, 1) DirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid M2TS file +sub ProcessM2TS($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $pLen, $upkPrefix, $j, $fileType, $eof); + my (%pmt, %pidType, %data, %sectLen); + my ($startTime, $endTime, $fwdTime, $backScan, $maxBack); + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + + # read first packet + return 0 unless $raf->Read($buff, 8) == 8; + # test for magic number (sync byte is the only thing we can safely check) + return 0 unless $buff =~ /^(....)?\x47/s; + unless ($1) { + $pLen = 188; # no timecode + $fileType = 'M2T'; # (just as a way to tell there is no timecode) + $upkPrefix = 'N'; + } else { + $pLen = 192; # 188-byte transport packet + leading 4-byte timecode (ref 4) + $upkPrefix = 'x4N'; + } + my $prePos = $pLen - 188; # byte position of packet prefix + my $readSize = 64 * $pLen; # size of our read buffer + $raf->Seek(0,0); # rewind to start + $raf->Read($buff, $readSize) >= $pLen * 4 or return 0; # require at least 4 packets + # validate the sync byte in the next 3 packets + for ($j=1; $j<4; ++$j) { + return 0 unless substr($buff, $prePos + $pLen * $j, 1) eq 'G'; # (0x47) + } + $et->SetFileType($fileType); + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::M2TS::Main'); + + # PID lookup strings (will add to this with entries from program map table) + my %pidName = ( + 0 => 'Program Association Table', + 1 => 'Conditional Access Table', + 2 => 'Transport Stream Description Table', + 0x1fff => 'Null Packet', + ); + my %didPID = ( 1 => 0, 2 => 0, 0x1fff => 0 ); + my %needPID = ( 0 => 1 ); # lookup for stream PID's that we still need to parse + # PID's that may contain GPS info + my %gpsPID = ( + 0x0300 => 1, # Novatek INNOVV + 0x01e4 => 1, # vsys a6l dashcam + ); + my $pEnd = 0; + + # scan entire file for GPS programs if ExtractEmbedded option is 3 or higher + # (some dashcams write these programs but don't include it in the PMT) + if (($et->Options('ExtractEmbedded') || 0) > 2) { + foreach (keys %gpsPID) { + $needPID{$_} = 1; + $pidType{$_} = -1; + $pidName{$_} ='unregistered dashcam GPS'; + } + } + + # parse packets from MPEG-2 Transport Stream + for (;;) { + + unless (%needPID) { + last unless defined $startTime; + # reconfigure to seek backwards for last PCR + unless (defined $backScan) { + my $saveTime = $endTime; + undef $endTime; + last if $et->Options('FastScan'); + $verbose and print $out "[Starting backscan for last PCR]\n"; + # remember how far we got when reading forward through the file + my $fwdPos = $raf->Tell() - length($buff) + $pEnd; + # determine the position of the last packet relative to the EOF + $raf->Seek(0, 2) or last; + my $fsize = $raf->Tell(); + $backScan = int($fsize / $pLen) * $pLen - $fsize; + # set limit on how far back we will go + $maxBack = $fwdPos - $fsize; + # scan back a maximum of 512k (have seen last PCR at -276k) + my $nMax = int(512000 / $pLen); # max packets to backscan + if ($nMax < int(-$maxBack / $pLen)) { + $maxBack = $backScan - $nMax * $pLen; + } else { + # use this time if none found in all remaining packets + $fwdTime = $saveTime; + } + $pEnd = 0; + } + } + my $pos; + # read more if necessary + if (defined $backScan) { + last if defined $endTime; + $pos = $pEnd = $pEnd - 2 * $pLen; # step back to previous packet + if ($pos < 0) { + # read another buffer from end of file + last if $backScan <= $maxBack; + my $buffLen = $backScan - $maxBack; + $buffLen = $readSize if $buffLen > $readSize; + $backScan -= $buffLen; + $raf->Seek($backScan, 2) or last; + $raf->Read($buff, $buffLen) == $buffLen or last; + $pos = $pEnd = $buffLen - $pLen; + } + } else { + $pos = $pEnd; + if ($pos + $pLen > length $buff) { + $raf->Read($buff, $readSize) >= $pLen or $eof = 1, last; + $pos = $pEnd = 0; + } + } + $pEnd += $pLen; + # decode the packet prefix + $pos += $prePos; + my $prefix = unpack("x${pos}N", $buff); # (use unpack instead of Get32u for speed) + # validate sync byte + unless (($prefix & 0xff000000) == 0x47000000) { + $et->Warn('M2TS synchronization error') unless defined $backScan; + last; + } + # my $transport_error_indicator = $prefix & 0x00800000; + my $payload_unit_start_indicator = $prefix & 0x00400000; + # my $transport_priority = $prefix & 0x00200000; + my $pid =($prefix & 0x001fff00) >> 8; # packet ID + # my $transport_scrambling_control = $prefix & 0x000000c0; + my $adaptation_field_exists = $prefix & 0x00000020; + my $payload_data_exists = $prefix & 0x00000010; + # my $continuity_counter = $prefix & 0x0000000f; + if ($verbose > 1) { + my $i = ($raf->Tell() - length($buff) + $pEnd) / $pLen - 1; + print $out "Transport packet $i:\n"; + $et->VerboseDump(\$buff, Len => $pLen, Addr => $i * $pLen, Start => $pos - $prePos); + my $str = $pidName{$pid} ? " ($pidName{$pid})" : ' <not in Program Map Table!>'; + printf $out " Timecode: 0x%.4x\n", Get32u(\$buff, $pos - $prePos) if $pLen == 192; + printf $out " Packet ID: 0x%.4x$str\n", $pid; + printf $out " Start Flag: %s\n", $payload_unit_start_indicator ? 'Yes' : 'No'; + } + + $pos += 4; + # handle adaptation field + if ($adaptation_field_exists) { + my $len = Get8u(\$buff, $pos++); + $pos + $len > $pEnd and $et->Warn('Invalid adaptation field length'), last; + # read PCR value for calculation of Duration + if ($len > 6) { + my $flags = Get8u(\$buff, $pos); + if ($flags & 0x10) { # PCR_flag + # combine 33-bit program_clock_reference_base and 9-bit extension + my $pcrBase = Get32u(\$buff, $pos + 1); + my $pcrExt = Get16u(\$buff, $pos + 5); + # ignore separate programs (PID's) and store just the + # first and last timestamps found in the file (is this OK?) + $endTime = 300 * (2 * $pcrBase + ($pcrExt >> 15)) + ($pcrExt & 0x01ff); + $startTime = $endTime unless defined $startTime; + } + } + $pos += $len; + } + + # all done with this packet unless it carries a payload + # or if we are just looking for the last timestamp + next unless $payload_data_exists and not defined $backScan; + + # decode payload data + if ($pid == 0 or # program association table + defined $pmt{$pid}) # program map table(s) + { + # must interpret pointer field if payload_unit_start_indicator is set + my $buf2; + if ($payload_unit_start_indicator) { + # skip to start of section + my $pointer_field = Get8u(\$buff, $pos); + $pos += 1 + $pointer_field; + $pos >= $pEnd and $et->Warn('Bad pointer field'), last; + $buf2 = substr($buff, $pEnd-$pLen, $pLen); + $pos -= $pEnd - $pLen; + } else { + # not the start of a section + next unless $sectLen{$pid}; + my $more = $sectLen{$pid} - length($data{$pid}); + my $size = $pLen - $pos; + $size = $more if $size > $more; + $data{$pid} .= substr($buff, $pos, $size); + next unless $size == $more; + # we have the complete section now, so put into $buf2 for parsing + $buf2 = $data{$pid}; + $pos = 0; + delete $data{$pid}; + delete $sectLen{$pid}; + } + my $slen = length($buf2); # section length + $pos + 8 > $slen and $et->Warn('Truncated payload'), last; + # validate table ID + my $table_id = Get8u(\$buf2, $pos); + my $name = ($tableID{$table_id} || sprintf('Unknown (0x%x)',$table_id)) . ' Table'; + my $expectedID = $pid ? 0x02 : 0x00; + unless ($table_id == $expectedID) { + $verbose > 1 and print $out " (skipping $name)\n"; + delete $needPID{$pid}; + $didPID{$pid} = 1; + next; + } + # validate section syntax indicator for parsed tables (PAT, PMT) + my $section_syntax_indicator = Get8u(\$buf2, $pos + 1) & 0xc0; + $section_syntax_indicator == 0x80 or $et->Warn("Bad $name"), last; + my $section_length = Get16u(\$buf2, $pos + 1) & 0x0fff; + $section_length > 1021 and $et->Warn("Invalid $name length"), last; + if ($slen < $section_length + 3) { # (3 bytes for table_id + section_length) + # must wait until we have the full section + $data{$pid} = substr($buf2, $pos); + $sectLen{$pid} = $section_length + 3; + next; + } + my $program_number = Get16u(\$buf2, $pos + 3); + my $section_number = Get8u(\$buf2, $pos + 6); + my $last_section_number = Get8u(\$buf2, $pos + 7); + if ($verbose > 1) { + print $out " $name length: $section_length\n"; + print $out " Program No: $program_number\n" if $pid; + printf $out " Stream ID: 0x%x\n", $program_number if not $pid; + print $out " Section No: $section_number\n"; + print $out " Last Sect.: $last_section_number\n"; + } + my $end = $pos + $section_length + 3 - 4; # (don't read 4-byte CRC) + $pos += 8; + if ($pid == 0) { + # decode PAT (Program Association Table) + while ($pos <= $end - 4) { + my $program_number = Get16u(\$buf2, $pos); + my $program_map_PID = Get16u(\$buf2, $pos + 2) & 0x1fff; + $pmt{$program_map_PID} = $program_number; # save our PMT PID's + my $str = "Program $program_number Map"; + $pidName{$program_map_PID} = $str; + $needPID{$program_map_PID} = 1 unless $didPID{$program_map_PID}; + $verbose and printf $out " PID(0x%.4x) --> $str\n", $program_map_PID; + $pos += 4; + } + } else { + # decode PMT (Program Map Table) + $pos + 4 > $slen and $et->Warn('Truncated PMT'), last; + my $pcr_pid = Get16u(\$buf2, $pos) & 0x1fff; + my $program_info_length = Get16u(\$buf2, $pos + 2) & 0x0fff; + my $str = "Program $program_number Clock Reference"; + $pidName{$pcr_pid} = $str; + $verbose and printf $out " PID(0x%.4x) --> $str\n", $pcr_pid; + $pos += 4; + $pos + $program_info_length > $slen and $et->Warn('Truncated program info'), last; + # dump program information descriptors if verbose + if ($verbose > 1) { for ($j=0; $j<$program_info_length-2; ) { + my $descriptor_tag = Get8u(\$buf2, $pos + $j); + my $descriptor_length = Get8u(\$buf2, $pos + $j + 1); + $j += 2; + last if $j + $descriptor_length > $program_info_length; + my $desc = substr($buf2, $pos+$j, $descriptor_length); + $j += $descriptor_length; + $desc =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg; + printf $out " Program Descriptor: Type=0x%.2x \"$desc\"\n", $descriptor_tag; + }} + $pos += $program_info_length; # skip descriptors (for now) + while ($pos <= $end - 5) { + my $stream_type = Get8u(\$buf2, $pos); + my $elementary_pid = Get16u(\$buf2, $pos + 1) & 0x1fff; + my $es_info_length = Get16u(\$buf2, $pos + 3) & 0x0fff; + my $str = $streamType{$stream_type}; + $str or $str = ($stream_type < 0x7f ? 'Reserved' : 'Private'); + $str = sprintf('%s (0x%.2x)', $str, $stream_type); + $str = "Program $program_number $str"; + $verbose and printf $out " PID(0x%.4x) --> $str\n", $elementary_pid; + if ($str =~ /(Audio|Video)/) { + unless ($pidName{$elementary_pid}) { + $et->HandleTag($tagTablePtr, $1 . 'StreamType', $stream_type) + } + # we want to parse all Audio and Video streams + $needPID{$elementary_pid} = 1 unless $didPID{$elementary_pid}; + } + # save PID type and name string + $pidName{$elementary_pid} = $str; + $pidType{$elementary_pid} = $stream_type; + $pos += 5; + $pos + $es_info_length > $slen and $et->Warn('Truncated ES info'), $pos = $end, last; + # parse elementary stream descriptors + for ($j=0; $j<$es_info_length-2; ) { + my $descriptor_tag = Get8u(\$buf2, $pos + $j); + my $descriptor_length = Get8u(\$buf2, $pos + $j + 1); + $j += 2; + last if $j + $descriptor_length > $es_info_length; + my $desc = substr($buf2, $pos+$j, $descriptor_length); + $j += $descriptor_length; + if ($verbose > 1) { + my $dstr = $desc; + $dstr =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg; + printf $out " ES Descriptor: Type=0x%.2x \"$dstr\"\n", $descriptor_tag; + } + # parse type-specific descriptor information (once) + unless ($didPID{$pid}) { + if ($descriptor_tag == 0x81) { # AC-3 + ParseAC3Descriptor($et, \$desc); + } + } + } + $pos += $es_info_length; + } + } + # $pos = $end + 4; # skip CRC + + } elsif (not defined $didPID{$pid}) { + + # save data from the start of each elementary stream + if ($payload_unit_start_indicator) { + if (defined $data{$pid}) { + # we must have a whole section, so parse now + my $more = ParsePID($et, $pid, $pidType{$pid}, $pidName{$pid}, \$data{$pid}); + # start fresh even if we couldn't process this PID yet + delete $data{$pid}; + unless ($more) { + delete $needPID{$pid}; + $didPID{$pid} = 1; + next; + } + # set flag indicating we found this PID but we still want more + $needPID{$pid} = -1; + } + # check for a PES header + next if $pos + 6 > $pEnd; + my $start_code = Get32u(\$buff, $pos); + next unless ($start_code & 0xffffff00) == 0x00000100; + my $stream_id = $start_code & 0xff; + if ($verbose > 1) { + my $pes_packet_length = Get16u(\$buff, $pos + 4); + printf $out " Stream ID: 0x%.2x\n", $stream_id; + print $out " Packet Len: $pes_packet_length\n"; + } + $pos += 6; + unless ($noSyntax{$stream_id}) { + next if $pos + 3 > $pEnd; + # validate PES syntax + my $syntax = Get8u(\$buff, $pos) & 0xc0; + $syntax == 0x80 or $et->Warn('Bad PES syntax'), next; + # skip PES header + my $pes_header_data_length = Get8u(\$buff, $pos + 2); + $pos += 3 + $pes_header_data_length; + next if $pos >= $pEnd; + } + $data{$pid} = substr($buff, $pos, $pEnd-$pos); + } else { + unless (defined $data{$pid}) { + # (vsys a6l dashcam GPS record doesn't have a start indicator) + next unless $gpsPID{$pid}; + $data{$pid} = ''; + } + # accumulate data for each elementary stream + $data{$pid} .= substr($buff, $pos, $pEnd-$pos); + } + # save only the first 256 bytes of most streams, except for + # unknown or H.264 streams where we save 1 kB + my $saveLen = (not $pidType{$pid} or $pidType{$pid} == 0x1b) ? 1024 : 256; + if (length($data{$pid}) >= $saveLen) { + my $more = ParsePID($et, $pid, $pidType{$pid}, $pidName{$pid}, \$data{$pid}); + next if $more < 0; # wait for program map table (hopefully not too long) + delete $data{$pid}; + $more and $needPID{$pid} = -1, next; # parse more of these + delete $needPID{$pid}; + $didPID{$pid} = 1; + } + next; + } + if ($needPID{$pid}) { + # we found and parsed a section with this PID, so + # delete from the lookup of PID's we still need to parse + delete $needPID{$pid}; + $didPID{$pid} = 1; + } + } + + # calculate Duration if available + $endTime = $fwdTime unless defined $endTime; + if (defined $startTime and defined $endTime) { + $endTime += 0x80000000 * 1200 if $startTime > $endTime; # handle 33-bit wrap + $et->HandleTag($tagTablePtr, 'Duration', $endTime - $startTime); + } + + if ($verbose) { + my @need; + foreach (keys %needPID) { + push @need, sprintf('0x%.2x',$_) if $needPID{$_} > 0; + } + if (@need) { + @need = sort @need; + print $out "End of file. Missing PID(s): @need\n"; + } else { + my $what = $eof ? 'of file' : 'scan'; + print $out "End $what. All PID's parsed.\n"; + } + } + + # parse any remaining partial PID streams + my $pid; + foreach $pid (sort keys %data) { + ParsePID($et, $pid, $pidType{$pid}, $pidName{$pid}, \$data{$pid}); + delete $data{$pid}; + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::M2TS - Read M2TS (AVCHD) meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to extract +information from MPEG-2 transport streams, such as those used by AVCHD +video. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://neuron2.net/library/mpeg2/iso13818-1.pdf> + +=item L<http://www.blu-raydisc.com/Assets/Downloadablefile/BD-RE_Part3_V2.1_WhitePaper_080406-15271.pdf> + +=item L<http://www.videohelp.com/forum/archive/reading-avchd-playlist-files-bdmv-playlist-mpl-t358888.html> + +=item L<http://en.wikipedia.org/wiki/MPEG_transport_stream> + +=item L<http://www.dunod.com/documents/9782100493463/49346_DVB.pdf> + +=item L<http://trac.handbrake.fr/browser/trunk/libhb/stream.c> + +=item L<http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=04560141> + +=item L<http://www.w6rz.net/xport.zip> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/M2TS Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/MIE.pm b/lib/Image/ExifTool/MIE.pm new file mode 100644 index 0000000..00901cb --- /dev/null +++ b/lib/Image/ExifTool/MIE.pm @@ -0,0 +1,2568 @@ +#------------------------------------------------------------------------------ +# File: MIE.pm +# +# Description: Read/write MIE meta information +# +# Revisions: 11/18/2005 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::MIE; + +use strict; +use vars qw($VERSION %tableDefaults); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::GPS; + +$VERSION = '1.49'; + +sub ProcessMIE($$); +sub ProcessMIEGroup($$$); +sub WriteMIEGroup($$$); +sub CheckMIE($$$); +sub GetLangInfo($$); + +# local variables +my $hasZlib; # 1=Zlib available, 0=no Zlib +my %mieCode; # reverse lookup for MIE format names +my $doneMieMap; # flag indicating we added user-defined groups to %mieMap + +# MIE format codes +my %mieFormat = ( + 0x00 => 'undef', + 0x10 => 'MIE', + 0x18 => 'MIE', + 0x20 => 'string', # ASCII (ISO 8859-1) + 0x28 => 'utf8', + 0x29 => 'utf16', + 0x2a => 'utf32', + 0x30 => 'string_list', + 0x38 => 'utf8_list', + 0x39 => 'utf16_list', + 0x3a => 'utf32_list', + 0x40 => 'int8u', + 0x41 => 'int16u', + 0x42 => 'int32u', + 0x43 => 'int64u', + 0x48 => 'int8s', + 0x49 => 'int16s', + 0x4a => 'int32s', + 0x4b => 'int64s', + 0x52 => 'rational32u', + 0x53 => 'rational64u', + 0x5a => 'rational32s', + 0x5b => 'rational64s', + 0x61 => 'fixed16u', + 0x62 => 'fixed32u', + 0x69 => 'fixed16s', + 0x6a => 'fixed32s', + 0x72 => 'float', + 0x73 => 'double', + 0x80 => 'free', +); + +# map of MIE directory locations +my %mieMap = ( + 'MIE-Meta' => 'MIE', + 'MIE-Audio' => 'MIE-Meta', + 'MIE-Camera' => 'MIE-Meta', + 'MIE-Doc' => 'MIE-Meta', + 'MIE-Geo' => 'MIE-Meta', + 'MIE-Image' => 'MIE-Meta', + 'MIE-MakerNotes' => 'MIE-Meta', + 'MIE-Preview' => 'MIE-Meta', + 'MIE-Thumbnail' => 'MIE-Meta', + 'MIE-Video' => 'MIE-Meta', + 'MIE-Flash' => 'MIE-Camera', + 'MIE-Lens' => 'MIE-Camera', + 'MIE-Orient' => 'MIE-Camera', + 'MIE-Extender' => 'MIE-Lens', + 'MIE-GPS' => 'MIE-Geo', + 'MIE-UTM' => 'MIE-Geo', + 'MIE-Canon' => 'MIE-MakerNotes', + EXIF => 'MIE-Meta', + XMP => 'MIE-Meta', + IPTC => 'MIE-Meta', + ICC_Profile => 'MIE-Meta', + ID3 => 'MIE-Meta', + CanonVRD => 'MIE-Canon', + IFD0 => 'EXIF', + IFD1 => 'IFD0', + ExifIFD => 'IFD0', + GPS => 'IFD0', + SubIFD => 'IFD0', + GlobParamIFD => 'IFD0', + PrintIM => 'IFD0', + InteropIFD => 'ExifIFD', + MakerNotes => 'ExifIFD', +); + +# convenience variables for common tagInfo entries +my %binaryConv = ( + Writable => 'undef', + Binary => 1, +); +my %dateInfo = ( + Shift => 'Time', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', +); +my %noYes = ( 0 => 'No', 1 => 'Yes' ); +my %offOn = ( 0 => 'Off', 1 => 'On' ); + +# default entries for MIE tag tables +%tableDefaults = ( + PROCESS_PROC => \&ProcessMIE, + WRITE_PROC => \&ProcessMIE, + CHECK_PROC => \&CheckMIE, + LANG_INFO => \&GetLangInfo, + WRITABLE => 'string', + PREFERRED => 1, +); + +# MIE info +%Image::ExifTool::MIE::Main = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Main' }, + WRITE_GROUP => 'MIE-Main', + NOTES => q{ + MIE is a flexible format which may be used as a stand-alone meta information + format, for encapsulation of other files and information, or as a trailer + appended to other file formats. The tables below represent currently + defined MIE tags, however ExifTool will also extract any other information + present in a MIE file. + + When writing MIE information, some special features are supported: + + 1) String values may be written as ASCII (ISO 8859-1) or UTF-8. ExifTool + automatically detects the presence of wide characters and treats the string + appropriately. Internally, UTF-8 text may be converted to UTF-16 or UTF-32 + and stored in this format in the file if it is more compact. + + 2) All MIE string-value tags support localized text. Localized values are + written by adding a language/country code to the tag name in the form + C<TAG-xx_YY>, where C<TAG> is the tag name, C<xx> is a 2-character lower + case ISO 639-1 language code, and C<YY> is a 2-character upper case ISO + 3166-1 alpha 2 country code (eg. C<Title-en_US>). But as usual, the user + interface is case-insensitive, and ExifTool will write the correct case to + the file. + + 3) Some numerical MIE tags allow units of measurement to be specified. For + these tags, units may be added in brackets immediately following the value + (eg. C<55(mi/h)>). If no units are specified, the default units are + written. + + 4) ExifTool writes compressed metadata to MIE files if the L<Compress|../ExifTool.html#Compress> (-z) + option is used and Compress::Zlib is available. + + See L<https://exiftool.org/MIE1.1-20070121.pdf> for the official MIE + specification. + }, + '0Type' => { + Name => 'SubfileType', + Notes => q{ + the capitalized common extension for this type of file. If the extension + has a dot-3 abbreviation, then the longer version is used here. For + instance, JPEG and TIFF are used, not JPG and TIF + }, + }, + '0Vers' => { + Name => 'MIEVersion', + Notes => 'version 1.1 is assumed if not specified', + }, + '1Directory' => { + Name => 'SubfileDirectory', + Notes => 'original directory for the file', + }, + '1Name' => { + Name => 'SubfileName', + Notes => 'the file name, including extension if it exists', + }, + '2MIME' => { Name => 'SubfileMIMEType' }, + Meta => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Meta', + DirName => 'MIE-Meta', + }, + }, + data => { + Name => 'SubfileData', + Notes => 'the subfile data', + %binaryConv, + }, + rsrc => { + Name => 'SubfileResource', + Notes => 'subfile resource fork if it exists', + %binaryConv, + }, + zmd5 => { + Name => 'MD5Digest', + Notes => q{ + 16-byte MD5 digest written in binary form or as a 32-character hex-encoded + ASCII string. Value is an MD5 digest of the entire 0MIE group as it would be + with the digest value itself set to all null bytes + }, + }, + zmie => { + Name => 'TrailerSignature', + Writable => 'undef', + Notes => q{ + used as the last element in the main "0MIE" group to identify a MIE trailer + when appended to another type of file. ExifTool will create this tag if set + to any value, but always with an empty data block + }, + ValueConvInv => '""', # data block must be empty + }, +); + +# MIE meta information group +%Image::ExifTool::MIE::Meta = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Meta', 2 => 'Image' }, + WRITE_GROUP => 'MIE-Meta', + Audio => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Audio', + DirName => 'MIE-Audio', + }, + }, + Camera => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Camera', + DirName => 'MIE-Camera', + }, + }, + Document => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Doc', + DirName => 'MIE-Doc', + }, + }, + EXIF => { + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + WriteProc => \&Image::ExifTool::WriteTIFF, + }, + }, + Geo => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Geo', + DirName => 'MIE-Geo', + }, + }, + ICCProfile => { + Name => 'ICC_Profile', + SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' }, + }, + ID3 => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::Main' } }, + IPTC => { SubDirectory => { TagTable => 'Image::ExifTool::IPTC::Main' } }, + Image => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Image', + DirName => 'MIE-Image', + }, + }, + MakerNotes => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::MakerNotes', + DirName => 'MIE-MakerNotes', + }, + }, + Preview => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Preview', + DirName => 'MIE-Preview', + }, + }, + Thumbnail => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Thumbnail', + DirName => 'MIE-Thumbnail', + }, + }, + Video => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Video', + DirName => 'MIE-Video', + }, + }, + XMP => { SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' } }, +); + +# MIE document information +%Image::ExifTool::MIE::Doc = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Doc', 2 => 'Document' }, + WRITE_GROUP => 'MIE-Doc', + NOTES => 'Information describing the main document, image or file.', + Author => { Groups => { 2 => 'Author' } }, + Comment => { }, + Contributors=> { Groups => { 2 => 'Author' }, List => 1 }, + Copyright => { Groups => { 2 => 'Author' } }, + CreateDate => { Groups => { 2 => 'Time' }, %dateInfo }, + EMail => { Name => 'Email', Groups => { 2 => 'Author' } }, + Keywords => { List => 1 }, + ModifyDate => { Groups => { 2 => 'Time' }, %dateInfo }, + OriginalDate=> { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + %dateInfo, + }, + Phone => { Name => 'PhoneNumber', Groups => { 2 => 'Author' } }, + References => { List => 1 }, + Software => { }, + Title => { }, + URL => { }, +); + +# MIE geographic information +%Image::ExifTool::MIE::Geo = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Geo', 2 => 'Location' }, + WRITE_GROUP => 'MIE-Geo', + NOTES => 'Information related to geographic location.', + Address => { }, + City => { }, + Country => { }, + GPS => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::GPS', + DirName => 'MIE-GPS', + }, + }, + PostalCode => { }, + State => { Notes => 'state or province' }, + UTM => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::UTM', + DirName => 'MIE-UTM', + }, + }, +); + +# MIE GPS information +%Image::ExifTool::MIE::GPS = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-GPS', 2 => 'Location' }, + WRITE_GROUP => 'MIE-GPS', + Altitude => { + Name => 'GPSAltitude', + Writable => 'rational64s', + Units => [ qw(m ft) ], + Notes => q{'m' above sea level unless 'ft' specified}, + }, + Bearing => { + Name => 'GPSDestBearing', + Writable => 'rational64s', + Units => [ qw(deg deg{mag}) ], + Notes => q{'deg' CW from true north unless 'deg{mag}' specified}, + }, + Datum => { Name => 'GPSMapDatum', Notes => 'WGS-84 assumed if not specified' }, + Differential => { + Name => 'GPSDifferential', + Writable => 'int8u', + PrintConv => { + 0 => 'No Correction', + 1 => 'Differential Corrected', + }, + }, + Distance => { + Name => 'GPSDestDistance', + Writable => 'rational64s', + Units => [ qw(km mi nmi) ], + Notes => q{'km' unless 'mi' or 'nmi' specified}, + }, + Heading => { + Name => 'GPSTrack', + Writable => 'rational64s', + Units => [ qw(deg deg{mag}) ], + Notes => q{'deg' CW from true north unless 'deg{mag}' specified}, + }, + Latitude => { + Name => 'GPSLatitude', + Writable => 'rational64s', + Count => -1, + Notes => q{ + 1 to 3 numbers: degrees, minutes then seconds. South latitudes are stored + as all negative numbers, but may be entered as positive numbers with a + trailing 'S' for convenience. For example, these are all equivalent: "-40 + -30", "-40.5", "40 30 0.00 S" + }, + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)', + ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 0)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")', + }, + Longitude => { + Name => 'GPSLongitude', + Writable => 'rational64s', + Count => -1, + Notes => q{ + 1 to 3 numbers: degrees, minutes then seconds. West longitudes are + negative, but may be entered as positive numbers with a trailing 'W' + }, + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)', + ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 0)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")', + }, + MeasureMode => { + Name => 'GPSMeasureMode', + Writable => 'int8u', + PrintConv => { 2 => '2-D', 3 => '3-D' }, + }, + Satellites => 'GPSSatellites', + Speed => { + Name => 'GPSSpeed', + Writable => 'rational64s', + Units => [ qw(km/h mi/h m/s kn) ], + Notes => q{'km/h' unless 'mi/h', 'm/s' or 'kn' specified}, + }, + DateTime => { Name => 'GPSDateTime', Groups => { 2 => 'Time' }, %dateInfo }, +); + +# MIE UTM information +%Image::ExifTool::MIE::UTM = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-UTM', 2 => 'Location' }, + WRITE_GROUP => 'MIE-UTM', + Datum => { Name => 'UTMMapDatum', Notes => 'WGS-84 assumed if not specified' }, + Easting => { Name => 'UTMEasting' }, + Northing => { Name => 'UTMNorthing' }, + Zone => { Name => 'UTMZone', Writable => 'int8s' }, +); + +# MIE image information +%Image::ExifTool::MIE::Image = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Image', 2 => 'Image' }, + WRITE_GROUP => 'MIE-Image', + '0Type' => { Name => 'FullSizeImageType', Notes => 'JPEG if not specified' }, + '1Name' => { Name => 'FullSizeImageName' }, + BitDepth => { Name => 'BitDepth', Writable => 'int16u' }, + ColorSpace => { Notes => 'standard ColorSpace values are "sRGB" and "Adobe RGB"' }, + Components => { + Name => 'ComponentsConfiguration', + Notes => 'string composed of R, G, B, Y, Cb and Cr', + }, + Compression => { Name => 'CompressionRatio', Writable => 'rational32u' }, + ImageSize => { + Writable => 'int16u', + Count => -1, + Notes => '2 or 3 values, for number of XY or XYZ pixels', + PrintConv => '$val=~tr/ /x/;$val', + PrintConvInv => '$val=~tr/x/ /;$val', + }, + Resolution => { + Writable => 'rational64u', + Units => [ qw(/in /cm /deg /arcmin /arcsec), '' ], + Count => -1, + Notes => q{ + 1 to 3 values. A single value for equal resolution in all directions, or + separate X, Y and Z values if necessary. Units are '/in' unless '/cm', + '/deg', '/arcmin', '/arcsec' or '' specified + }, + PrintConv => '$val=~tr/ /x/;$val', + PrintConvInv => '$val=~tr/x/ /;$val', + }, + data => { + Name => 'FullSizeImage', + Groups => { 2 => 'Preview' }, + %binaryConv, + RawConv => '$self->ValidateImage(\$val,$tag)', + }, +); + +# MIE preview image +%Image::ExifTool::MIE::Preview = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Preview', 2 => 'Image' }, + WRITE_GROUP => 'MIE-Preview', + '0Type' => { Name => 'PreviewImageType', Notes => 'JPEG if not specified' }, + '1Name' => { Name => 'PreviewImageName' }, + ImageSize => { + Name => 'PreviewImageSize', + Writable => 'int16u', + Count => -1, + Notes => '2 or 3 values, for number of XY or XYZ pixels', + PrintConv => '$val=~tr/ /x/;$val', + PrintConvInv => '$val=~tr/x/ /;$val', + }, + data => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + %binaryConv, + RawConv => '$self->ValidateImage(\$val,$tag)', + }, +); + +# MIE thumbnail image +%Image::ExifTool::MIE::Thumbnail = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Thumbnail', 2 => 'Image' }, + WRITE_GROUP => 'MIE-Thumbnail', + '0Type' => { Name => 'ThumbnailImageType', Notes => 'JPEG if not specified' }, + '1Name' => { Name => 'ThumbnailImageName' }, + ImageSize => { + Name => 'ThumbnailImageSize', + Writable => 'int16u', + Count => -1, + Notes => '2 or 3 values, for number of XY or XYZ pixels', + PrintConv => '$val=~tr/ /x/;$val', + PrintConvInv => '$val=~tr/x/ /;$val', + }, + data => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + %binaryConv, + RawConv => '$self->ValidateImage(\$val,$tag)', + }, +); + +# MIE audio information +%Image::ExifTool::MIE::Audio = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Audio', 2 => 'Audio' }, + WRITE_GROUP => 'MIE-Audio', + NOTES => q{ + For the Audio group (and any other group containing a 'data' element), tags + refer to the contained data if present, otherwise they refer to the main + SubfileData. The C<0Type> and C<1Name> elements should exist only if C<data> + is present. + }, + '0Type' => { Name => 'RelatedAudioFileType', Notes => 'MP3 if not specified' }, + '1Name' => { Name => 'RelatedAudioFileName' }, + SampleBits => { Writable => 'int16u' }, + Channels => { Writable => 'int8u' }, + Compression => { Name => 'AudioCompression' }, + Duration => { Writable => 'rational64u', PrintConv => 'ConvertDuration($val)' }, + SampleRate => { Writable => 'int32u' }, + data => { Name => 'RelatedAudioFile', %binaryConv }, +); + +# MIE video information +%Image::ExifTool::MIE::Video = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Video', 2 => 'Video' }, + WRITE_GROUP => 'MIE-Video', + '0Type' => { Name => 'RelatedVideoFileType', Notes => 'MOV if not specified' }, + '1Name' => { Name => 'RelatedVideoFileName' }, + Codec => { }, + Duration => { Writable => 'rational64u', PrintConv => 'ConvertDuration($val)' }, + data => { Name => 'RelatedVideoFile', %binaryConv }, +); + +# MIE camera information +%Image::ExifTool::MIE::Camera = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Camera', 2 => 'Camera' }, + WRITE_GROUP => 'MIE-Camera', + Brightness => { Writable => 'int8s' }, + ColorTemperature=> { Writable => 'int32u' }, + ColorBalance => { + Writable => 'rational64u', + Count => 3, + Notes => 'RGB scaling factors', + }, + Contrast => { Writable => 'int8s' }, + DigitalZoom => { Writable => 'rational64u' }, + ExposureComp => { Name => 'ExposureCompensation', Writable => 'rational64s' }, + ExposureMode => { }, + ExposureTime => { + Writable => 'rational64u', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => '$val', + }, + Flash => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Flash', + DirName => 'MIE-Flash', + }, + }, + FirmwareVersion => { }, + FocusMode => { }, + ISO => { Writable => 'int16u' }, + ISOSetting => { + Writable => 'int16u', + Notes => '0 = Auto, otherwise manual ISO speed setting', + }, + ImageNumber => { Writable => 'int32u' }, + ImageQuality => { Notes => 'Economy, Normal, Fine, Super Fine or Raw' }, + ImageStabilization => { Writable => 'int8u', %offOn }, + Lens => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Lens', + DirName => 'MIE-Lens', + }, + }, + Make => { }, + MeasuredEV => { Writable => 'rational64s' }, + Model => { }, + OwnerName => { }, + Orientation => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Orient', + DirName => 'MIE-Orient', + }, + }, + Saturation => { Writable => 'int8s' }, + SensorSize => { + Writable => 'rational64u', + Count => 2, + Notes => 'width and height of active sensor area in mm', + }, + SerialNumber => { }, + Sharpness => { Writable => 'int8s' }, + ShootingMode => { }, +); + +# Camera orientation information +%Image::ExifTool::MIE::Orient = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Orient', 2 => 'Camera' }, + WRITE_GROUP => 'MIE-Orient', + NOTES => 'These tags describe the camera orientation.', + Azimuth => { + Writable => 'rational64s', + Units => [ qw(deg deg{mag}) ], + Notes => q{'deg' CW from true north unless 'deg{mag}' specified}, + }, + Declination => { Writable => 'rational64s' }, + Elevation => { Writable => 'rational64s' }, + RightAscension => { Writable => 'rational64s' }, + Rotation => { + Writable => 'rational64s', + Notes => 'CW rotation angle of camera about lens axis', + }, +); + +# MIE camera lens information +%Image::ExifTool::MIE::Lens = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Lens', 2 => 'Camera' }, + WRITE_GROUP => 'MIE-Lens', + NOTES => q{ + All recorded lens parameters (focal length, aperture, etc) include the + effects of the extender if present. + }, + Extender => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Extender', + DirName => 'MIE-Extender', + }, + }, + FNumber => { Writable => 'rational64u' }, + FocalLength => { Writable => 'rational64u', Notes => 'all focal lengths in mm' }, + FocusDistance => { + Writable => 'rational64u', + Units => [ qw(m ft) ], + Notes => q{'m' unless 'ft' specified}, + }, + Make => { Name => 'LensMake' }, + MaxAperture => { Writable => 'rational64u' }, + MaxApertureAtMaxFocal => { Writable => 'rational64u' }, + MaxFocalLength => { Writable => 'rational64u' }, + MinAperture => { Writable => 'rational64u' }, + MinFocalLength => { Writable => 'rational64u' }, + Model => { Name => 'LensModel' }, + OpticalZoom => { Writable => 'rational64u' }, + SerialNumber => { Name => 'LensSerialNumber' }, +); + +# MIE lens extender information +%Image::ExifTool::MIE::Extender = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Extender', 2 => 'Camera' }, + WRITE_GROUP => 'MIE-Extender', + Magnification => { Name => 'ExtenderMagnification', Writable => 'rational64s' }, + Make => { Name => 'ExtenderMake' }, + Model => { Name => 'ExtenderModel' }, + SerialNumber => { Name => 'ExtenderSerialNumber' }, +); + +# MIE camera flash information +%Image::ExifTool::MIE::Flash = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Flash', 2 => 'Camera' }, + WRITE_GROUP => 'MIE-Flash', + ExposureComp => { Name => 'FlashExposureComp', Writable => 'rational64s' }, + Fired => { Name => 'FlashFired', Writable => 'int8u', PrintConv => \%noYes }, + GuideNumber => { Name => 'FlashGuideNumber' }, + Make => { Name => 'FlashMake' }, + Mode => { Name => 'FlashMode' }, + Model => { Name => 'FlashModel' }, + SerialNumber => { Name => 'FlashSerialNumber' }, + Type => { Name => 'FlashType', Notes => '"Internal" or "External"' }, +); + +# MIE maker notes information +%Image::ExifTool::MIE::MakerNotes = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-MakerNotes' }, + WRITE_GROUP => 'MIE-MakerNotes', + NOTES => q{ + MIE maker notes are contained within separate groups for each manufacturer + to avoid name conflicts. + }, + Canon => { + SubDirectory => { + TagTable => 'Image::ExifTool::MIE::Canon', + DirName => 'MIE-Canon', + }, + }, + Casio => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } }, + FujiFilm => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } }, + Kodak => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } }, + KonicaMinolta=>{ SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } }, + Nikon => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } }, + Olympus => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } }, + Panasonic => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } }, + Pentax => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } }, + Ricoh => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } }, + Sigma => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } }, + Sony => { SubDirectory => { TagTable => 'Image::ExifTool::MIE::Unknown' } }, +); + +# MIE Canon-specific information +%Image::ExifTool::MIE::Canon = ( + %tableDefaults, + GROUPS => { 1 => 'MIE-Canon' }, + WRITE_GROUP => 'MIE-Canon', + VRD => { + Name => 'CanonVRD', + SubDirectory => { TagTable => 'Image::ExifTool::CanonVRD::Main' }, + }, +); + +%Image::ExifTool::MIE::Unknown = ( + PROCESS_PROC => \&ProcessMIE, + GROUPS => { 1 => 'MIE-Unknown' }, +); + +#------------------------------------------------------------------------------ +# Add user-defined MIE groups to %mieMap +# Inputs: none; Returns: nothing, but sets $doneMieMap flag +sub UpdateMieMap() +{ + $doneMieMap = 1; # set flag so we only do this once + return unless %Image::ExifTool::UserDefined; + my ($tableName, @tables, %doneTable, $tagID); + # get list of top-level MIE tables with user-defined tags + foreach $tableName (keys %Image::ExifTool::UserDefined) { + next unless $tableName =~ /^Image::ExifTool::MIE::/; + my $userTable = $Image::ExifTool::UserDefined{$tableName}; + my $tagTablePtr = GetTagTable($tableName) or next; + # copy the WRITE_GROUP from the actual table + $$userTable{WRITE_GROUP} = $$tagTablePtr{WRITE_GROUP}; + # add to list of tables to process + $doneTable{$tableName} = 1; + push @tables, [$tableName, $userTable]; + } + # recursively add all user-defined groups to MIE map + while (@tables) { + my ($tableName, $tagTablePtr) = @{shift @tables}; + my $parent = $$tagTablePtr{WRITE_GROUP}; + $parent or warn("No WRITE_GROUP for $tableName\n"), next; + $mieMap{$parent} or warn("$parent is not in MIE map\n"), next; + foreach $tagID (TagTableKeys($tagTablePtr)) { + my $tagInfo = $$tagTablePtr{$tagID}; + next unless ref $tagInfo eq 'HASH' and $$tagInfo{SubDirectory}; + my $subTableName = $tagInfo->{SubDirectory}->{TagTable}; + my $subTablePtr = GetTagTable($subTableName) or next; + # only care about MIE tables + next unless $$subTablePtr{PROCESS_PROC} and + $$subTablePtr{PROCESS_PROC} eq \&ProcessMIE; + my $group = $$subTablePtr{WRITE_GROUP}; + $group or warn("No WRITE_GROUP for $subTableName\n"), next; + if ($mieMap{$group} and $mieMap{$group} ne $parent) { + warn("$group already has different parent ($mieMap{$group})\n"), next; + } + $mieMap{$group} = $parent; # add to map + # process tables within this one too + $doneTable{$subTableName} and next; + $doneTable{$subTableName} = 1; + push @tables, [$subTableName, $subTablePtr]; + } + } +} + +#------------------------------------------------------------------------------ +# Get localized version of tagInfo hash +# Inputs: 0) tagInfo hash ref, 1) locale code (eg. "en_CA") +# Returns: new tagInfo hash ref, or undef if invalid +sub GetLangInfo($$) +{ + my ($tagInfo, $langCode) = @_; + # check for properly formatted language code + return undef unless $langCode =~ /^[a-z]{2}([-_])[A-Z]{2}$/; + # use '_' as a separator, but recognize '_' or '-' + $langCode =~ tr/-/_/ if $1 eq '-'; + # can only set locale on string types + return undef if $$tagInfo{Writable} and $$tagInfo{Writable} ne 'string'; + return Image::ExifTool::GetLangInfo($tagInfo, $langCode); +} + +#------------------------------------------------------------------------------ +# return true if we have Zlib::Compress +# Inputs: 0) ExifTool object ref, 1) verb for what you want to do with the info +# Returns: 1 if Zlib available, 0 otherwise +sub HasZlib($$) +{ + unless (defined $hasZlib) { + $hasZlib = eval { require Compress::Zlib }; + unless ($hasZlib) { + $hasZlib = 0; + $_[0]->Warn("Install Compress::Zlib to $_[1] compressed information"); + } + } + return $hasZlib; +} + +#------------------------------------------------------------------------------ +# Get format code for MIE group element with current byte order +# Inputs: 0) [optional] true to convert result to chr() +# Returns: format code +sub MIEGroupFormat(;$) +{ + my $chr = shift; + my $format = GetByteOrder() eq 'MM' ? 0x10 : 0x18; + return $chr ? chr($format) : $format; +} + +#------------------------------------------------------------------------------ +# ReadValue() with added support for UTF formats (utf8, utf16 and utf32) +# Inputs: 0) data reference, 1) value offset, 2) format string, +# 3) number of values (or undef to use all data) +# 4) valid data length relative to offset, 5) returned rational ref +# Returns: converted value, or undefined if data isn't there +# or list of values in list context +# Notes: all string formats are converted to UTF8 +sub ReadMIEValue($$$$$;$) +{ + my ($dataPt, $offset, $format, $count, $size, $ratPt) = @_; + my $val; + if ($format =~ /^(utf(8|16|32)|string)/) { + if ($1 eq 'utf8' or $1 eq 'string') { + # read the 8-bit string + $val = substr($$dataPt, $offset, $size); + # (as of ExifTool 7.62, leave string values unconverted) + } else { + # convert to UTF8 + my $fmt; + if (GetByteOrder() eq 'MM') { + $fmt = ($1 eq 'utf16') ? 'n' : 'N'; + } else { + $fmt = ($1 eq 'utf16') ? 'v' : 'V'; + } + my @unpk = unpack("x$offset$fmt$size",$$dataPt); + if ($] >= 5.006001) { + $val = pack('C0U*', @unpk); + } else { + $val = Image::ExifTool::PackUTF8(@unpk); + } + } + # truncate at null unless this is a list + # (strings shouldn't have a null, but just in case) + $val =~ s/\0.*//s unless $format =~ /_list$/; + } else { + $format = 'undef' if $format eq 'free'; # read 'free' as 'undef' + return ReadValue($dataPt, $offset, $format, $count, $size, $ratPt); + } + return $val; +} + +#------------------------------------------------------------------------------ +# validate raw values for writing +# Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref +# Returns: error string or undef (and possibly changes value) on success +sub CheckMIE($$$) +{ + my ($et, $tagInfo, $valPtr) = @_; + my $format = $$tagInfo{Writable} || $tagInfo->{Table}->{WRITABLE}; + my $err; + + return 'No writable format' if not $format or $format eq '1'; + # handle units if supported by this tag + my $ulist = $$tagInfo{Units}; + if ($ulist and $$valPtr =~ /(.*)\((.*)\)$/) { + my ($val, $units) = ($1, $2); + ($units) = grep /^$units$/i, @$ulist; + defined $units or return 'Allowed units: (' . join('|', @$ulist) . ')'; + $err = Image::ExifTool::CheckValue(\$val, $format, $$tagInfo{Count}); + # add units back onto value + $$valPtr = "$val($units)" unless $err; + } elsif ($format !~ /^(utf|string|undef)/ and $$valPtr =~ /\)$/) { + return 'Units not supported'; + } else { + if ($format eq 'string' and $$et{OPTIONS}{Charset} ne 'UTF8' and + $$valPtr =~ /[\x80-\xff]/) + { + # convert from Charset to UTF-8 + $$valPtr = $et->Encode($$valPtr,'UTF8'); + } + $err = Image::ExifTool::CheckValue($valPtr, $format, $$tagInfo{Count}); + } + return $err; +} + +#------------------------------------------------------------------------------ +# Rewrite a MIE directory +# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ptr +# Returns: undef on success, otherwise error message (empty message if nothing to write) +sub WriteMIEGroup($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $outfile = $$dirInfo{OutFile}; + my $dirName = $$dirInfo{DirName}; + my $toWrite = $$dirInfo{ToWrite} || ''; + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my $optCompress = $et->Options('Compress'); + my $out = $et->Options('TextOut'); + my ($msg, $err, $ok, $sync, $delGroup); + my $tag = ''; + my $deletedTag = ''; + + # count each MIE directory found and make name for this specific instance + my ($grp1, %isWriting); + my $cnt = $$et{MIE_COUNT}; + my $grp = $tagTablePtr->{GROUPS}->{1}; + my $n = $$cnt{'MIE-Main'} || 0; + if ($grp eq 'MIE-Main') { + $$cnt{$grp} = ++$n; + ($grp1 = $grp) =~ s/MIE-/MIE$n-/; + } else { + ($grp1 = $grp) =~ s/MIE-/MIE$n-/; + my $m = $$cnt{$grp1} = ($$cnt{$grp1} || 0) + 1; + $isWriting{"$grp$m"} = 1; # eg. 'MIE-Doc2' + $isWriting{$grp1} = 1; # eg. 'MIE1-Doc' + $grp1 .= $m; + } + # build lookup for all valid group names for this MIE group + $isWriting{$grp} = 1; # eg. 'MIE-Doc' + $isWriting{$grp1} = 1; # eg. 'MIE1-Doc2' + $isWriting{"MIE$n"} = 1; # eg. 'MIE1' + + # determine if we are deleting this group + if (%{$$et{DEL_GROUP}}) { + $delGroup = 1 if $$et{DEL_GROUP}{MIE} or + $$et{DEL_GROUP}{$grp} or + $$et{DEL_GROUP}{$grp1} or + $$et{DEL_GROUP}{"MIE$n"}; + } + + # prepare lookups and lists for writing + my $newTags = $et->GetNewTagInfoHash($tagTablePtr); + my ($addDirs, $editDirs) = $et->GetAddDirHash($tagTablePtr, $dirName); + my @editTags = sort keys %$newTags, keys %$editDirs; + $verbose and print $out $raf ? 'Writing' : 'Creating', " $grp1:\n"; + + # loop through elements in MIE group + MieElement: for (;;) { + my ($format, $tagLen, $valLen, $units, $oldHdr, $buff); + my $lastTag = $tag; + if ($raf) { + # read first 4 bytes of element header + my $n = $raf->Read($oldHdr, 4); + if ($n != 4) { + last if $n or defined $sync; + undef $raf; # all done reading + $ok = 1; + } + } + if ($raf) { + ($sync, $format, $tagLen, $valLen) = unpack('aC3', $oldHdr); + $sync eq '~' or $msg = 'Invalid sync byte', last; + + # read tag name + if ($tagLen) { + $raf->Read($tag, $tagLen) == $tagLen or last; + $oldHdr .= $tag; # add tag to element header + $et->Warn("MIE tag '${tag}' out of sequence") if $tag lt $lastTag; + # separate units from tag name if they exist + $units = $1 if $tag =~ s/\((.*)\)$//; + } else { + $tag = ''; + } + + # get multi-byte value length if necessary + if ($valLen > 252) { + # calculate number of bytes in extended DataLength + my $n = 1 << (256 - $valLen); + $raf->Read($buff, $n) == $n or last; + $oldHdr .= $buff; # add to old header + my $fmt = 'int' . ($n * 8) . 'u'; + $valLen = ReadValue(\$buff, 0, $fmt, 1, $n); + if ($valLen > 0x7fffffff) { + $msg = "Can't write $tag (DataLength > 2GB not yet supported)"; + last; + } + } + # don't rewrite free bytes or information in deleted groups + if ($format == 0x80 or ($delGroup and $tagLen and ($format & 0xf0) != 0x10)) { + $raf->Seek($valLen, 1) or $msg = 'Seek error', last; + if ($verbose > 1) { + my $free = ($format == 0x80) ? ' free' : ''; + print $out " - $grp1:$tag ($valLen$free bytes)\n"; + } + ++$$et{CHANGED} if $delGroup; + next; + } + } else { + # no more elements to read + $tagLen = $valLen = 0; + $tag = ''; + } +# +# write necessary new tags and process directories +# + while (@editTags) { + last if $tagLen and $editTags[0] gt $tag; + # we are writing the new tag now + my ($newVal, $writable, $oldVal, $newFormat, $compress); + my $newTag = shift @editTags; + length($newTag) > 255 and $et->Warn('Tag name too long'), next; # (just to be safe) + my $newInfo = $$editDirs{$newTag}; + if ($newInfo) { + # create the new subdirectory or rewrite existing non-MIE directory + my $subTablePtr = GetTagTable($newInfo->{SubDirectory}->{TagTable}); + unless ($subTablePtr) { + $et->Warn("No tag table for $newTag $$newInfo{Name}"); + next; + } + my %subdirInfo; + my $isMieGroup = ($$subTablePtr{WRITE_PROC} and + $$subTablePtr{WRITE_PROC} eq \&ProcessMIE); + + if ($newTag eq $tag) { + # make sure that either both or neither old and new tags are MIE groups + if ($isMieGroup xor ($format & 0xf3) == 0x10) { + $et->Warn("Tag '${tag}' not expected type"); + next; # don't write our new tag + } + # uncompress existing directory into $oldVal since we are editing it + if ($format & 0x04) { + last unless HasZlib($et, 'edit'); + $raf->Read($oldVal, $valLen) == $valLen or last MieElement; + my $stat; + my $inflate = Compress::Zlib::inflateInit(); + $inflate and ($oldVal, $stat) = $inflate->inflate($oldVal); + unless ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) { + $msg = "Error inflating $tag"; + last MieElement; + } + $compress = 1; + $valLen = length $oldVal; # uncompressed value length + } + } else { + # don't create this directory unless necessary + next unless $$addDirs{$newTag}; + } + + if ($isMieGroup) { + my $hdr; + if ($newTag eq $tag) { + # rewrite existing directory later unless it was compressed + last unless $compress; + # rewrite directory to '$newVal' + $newVal = ''; + %subdirInfo = ( + OutFile => \$newVal, + RAF => new File::RandomAccess(\$oldVal), + ); + } elsif ($optCompress and not $$dirInfo{IsCompressed}) { + # write to memory so we can compress the new MIE group + $compress = 1; + %subdirInfo = ( + OutFile => \$newVal, + ); + } else { + $hdr = '~' . MIEGroupFormat(1) . chr(length($newTag)) . + "\0" . $newTag; + %subdirInfo = ( + OutFile => $outfile, + ToWrite => $toWrite . $hdr, + ); + } + $subdirInfo{DirName} = $newInfo->{SubDirectory}->{DirName} || $newTag; + $subdirInfo{Parent} = $dirName; + # don't compress elements of an already compressed group + $subdirInfo{IsCompressed} = $$dirInfo{IsCompressed} || $compress; + $msg = WriteMIEGroup($et, \%subdirInfo, $subTablePtr); + last MieElement if $msg; + # message is defined but empty if nothing was written + if (defined $msg) { + undef $msg; # not a problem if nothing was written + next; + } elsif (not $compress) { + # group was written already + $toWrite = ''; + next; + } elsif (length($newVal) <= 4) { # terminator only? + $verbose and print $out "Deleted compressed $grp1 (empty)\n"; + next MieElement if $newTag eq $tag; # deleting the directory + next; # not creating the new directory + } + $writable = 'undef'; + $newFormat = MIEGroupFormat(); + } else { + if ($newTag eq $tag) { + unless ($compress) { + # read and edit existing directory + $raf->Read($oldVal, $valLen) == $valLen or last MieElement; + } + %subdirInfo = ( + DataPt => \$oldVal, + DataLen => $valLen, + DirName => $$newInfo{Name}, + DataPos => $$dirInfo{IsCompressed} ? undef : $raf->Tell() - $valLen, + DirStart=> 0, + DirLen => $valLen, + ); + # write Compact subdirectories if we will compress the data + if (($compress or $optCompress or $$dirInfo{IsCompressed}) and + eval { require Compress::Zlib }) + { + $subdirInfo{Compact} = 1; + $subdirInfo{ReadOnly} = 1; # because XMP is not writable in place + } + } + $subdirInfo{Parent} = $dirName; + my $writeProc = $newInfo->{SubDirectory}->{WriteProc}; + # reset processed lookup to avoid errors in case of multiple EXIF blocks + $$et{PROCESSED} = { }; + $newVal = $et->WriteDirectory(\%subdirInfo, $subTablePtr, $writeProc); + if (defined $newVal) { + if ($newVal eq '') { + next MieElement if $newTag eq $tag; # deleting the directory + next; # not creating the new directory + } + } else { + next unless defined $oldVal; + $newVal = $oldVal; # just copy over the old directory + } + $writable = 'undef'; + $newFormat = 0x00; # all other directories are 'undef' format + } + } else { + + # get the new tag information + $newInfo = $$newTags{$newTag}; + my $nvHash = $et->GetNewValueHash($newInfo); + my @newVals; + + # write information only to specified group + my $writeGroup = $$nvHash{WriteGroup}; + last unless $isWriting{$writeGroup}; + + # if tag existed, must decide if we want to overwrite the value + if ($newTag eq $tag) { + my $isOverwriting; + my $isList = $$newInfo{List}; + if ($isList) { + last if $$nvHash{CreateOnly}; + $isOverwriting = -1; # force processing list elements individually + } else { + $isOverwriting = $et->IsOverwriting($nvHash); + last unless $isOverwriting; + } + my ($val, $cmpVal); + if ($isOverwriting < 0 or $verbose > 1) { + # check to be sure we can uncompress the value if necessary + HasZlib($et, 'edit') or last if $format & 0x04; + # read the old value + $raf->Read($oldVal, $valLen) == $valLen or last MieElement; + # uncompress if necessary + if ($format & 0x04) { + my $stat; + my $inflate = Compress::Zlib::inflateInit(); + # must save original compressed value in case we decide + # not to overwrite it later + $cmpVal = $oldVal; + $inflate and ($oldVal, $stat) = $inflate->inflate($oldVal); + unless ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) { + $msg = "Error inflating $tag"; + last MieElement; + } + $valLen = length $oldVal; # update value length + } + # convert according to specified format + my $formatStr = $mieFormat{$format & 0xfb} || 'undef'; + $val = ReadMIEValue(\$oldVal, 0, $formatStr, undef, $valLen); + if ($isOverwriting < 0 and defined $val) { + # handle list values individually + if ($isList) { + my (@vals, $v); + if ($formatStr =~ /_list$/) { + @vals = split "\0", $val; + } else { + @vals = $val; + } + # keep any list items that we aren't overwriting + foreach $v (@vals) { + next if $et->IsOverwriting($nvHash, $v); + push @newVals, $v; + } + } else { + # test to see if we really want to overwrite the value + $isOverwriting = $et->IsOverwriting($nvHash, $val); + } + } + } + if ($isOverwriting) { + # skip the old value if we didn't read it already + unless (defined $oldVal) { + $raf->Seek($valLen, 1) or $msg = 'Seek error'; + } + if ($verbose > 1) { + $val .= "($units)" if defined $units; + $et->VerboseValue("- $grp1:$$newInfo{Name}", $val); + } + $deletedTag = $tag; # remember that we deleted this tag + ++$$et{CHANGED}; # we deleted the old value + } else { + if (defined $oldVal) { + # write original compressed value + $oldVal = $cmpVal if defined $cmpVal; + } else { + $raf->Read($oldVal, $valLen) == $valLen or last MieElement; + } + # write the old value now + Write($outfile, $toWrite, $oldHdr, $oldVal) or $err = 1; + $toWrite = ''; + next MieElement; + } + unless (@newVals) { + # unshift the new tag info to write it later + unshift @editTags, $newTag; + next MieElement; # get next element from file + } + } else { + # write new value if creating, or if List and list existed, or + # if tag was previously deleted + next unless $$nvHash{IsCreating} or + ($newTag eq $lastTag and ($$newInfo{List} or $deletedTag eq $lastTag)); + } + # get the new value to write (undef to delete) + push @newVals, $et->GetNewValue($nvHash); + next unless @newVals; + $writable = $$newInfo{Writable} || $$tagTablePtr{WRITABLE}; + if ($writable eq 'string') { + # join multiple values into a single string + $newVal = join "\0", @newVals; + # write string as UTF-8,16 or 32 if value contains valid UTF-8 codes + require Image::ExifTool::XMP; + my $isUTF8 = Image::ExifTool::XMP::IsUTF8(\$newVal); + if ($isUTF8 > 0) { + $writable = 'utf8'; + # write UTF-16 or UTF-32 if it is more compact + my $to = $isUTF8 > 1 ? 'UCS4' : 'UCS2'; + my $tmp = Image::ExifTool::Decode(undef,$newVal,'UTF8',undef,$to); + if (length $tmp < length $newVal) { + $newVal = $tmp; + $writable = ($isUTF8 > 1) ? 'utf32' : 'utf16'; + } + } + # write as a list if we have multiple values + $writable .= '_list' if @newVals > 1; + } else { + # should only be one element in the list + $newVal = shift @newVals; + } + $newFormat = $mieCode{$writable}; + unless (defined $newFormat) { + $msg = "Bad format '${writable}' for $$newInfo{Name}"; + next MieElement; + } + } + + # write the new or edited element + while (defined $newFormat) { + my $valPt = \$newVal; + # remove units from value and add to tag name if supported by this tag + if ($$newInfo{Units}) { + my $val2; + if ($$valPt =~ /(.*)\((.*)\)$/) { + $val2 = $1; + $newTag .= "($2)"; + } else { + $val2 = $$valPt; + # add default units + my $ustr = '(' . $newInfo->{Units}->[0] . ')'; + $newTag .= $ustr; + $$valPt .= $ustr; + } + $valPt = \$val2; + } + # convert value if necessary + if ($writable !~ /^(utf|string|undef)/) { + my $val3 = WriteValue($$valPt, $writable, $$newInfo{Count}); + defined $val3 or $et->Warn("Error writing $newTag"), last; + $valPt = \$val3; + } + my $len = length $$valPt; + # compress value before writing if required + if (($compress or $optCompress) and not $$dirInfo{IsCompressed} and + HasZlib($et, 'write')) + { + my $deflate = Compress::Zlib::deflateInit(); + my $val4; + if ($deflate) { + $val4 = $deflate->deflate($$valPt); + $val4 .= $deflate->flush() if defined $val4; + } + if (defined $val4) { + my $len4 = length $val4; + my $saved = $len - $len4; + # only use compressed data if it is smaller + if ($saved > 0) { + $verbose and print $out " [$newTag compression saved $saved bytes]\n"; + $newFormat |= 0x04; # set compressed bit + $len = $len4; # set length + $valPt = \$val4; # set value pointer + } elsif ($verbose) { + print $out " [$newTag compression saved $saved bytes -- written uncompressed]\n"; + } + } else { + $et->Warn("Error deflating $newTag (written uncompressed)"); + } + } + # calculate the DataLength code + my $extLen; + if ($len < 253) { + $extLen = ''; + } elsif ($len < 65536) { + $extLen = Set16u($len); + $len = 255; + } elsif ($len <= 0x7fffffff) { + $extLen = Set32u($len); + $len = 254; + } else { + $et->Warn("Can't write $newTag (DataLength > 2GB not yet supported)"); + last; # don't write this tag + } + # write this element (with leading MIE group element if not done already) + my $hdr = $toWrite . '~' . chr($newFormat) . chr(length $newTag); + Write($outfile, $hdr, chr($len), $newTag, $extLen, $$valPt) or $err = 1; + $toWrite = ''; + # we changed a tag unless just editing a subdirectory + unless ($$editDirs{$newTag}) { + $et->VerboseValue("+ $grp1:$$newInfo{Name}", $newVal); + ++$$et{CHANGED}; + } + last; # didn't want to loop anyway + } + next MieElement if defined $oldVal; + } +# +# rewrite existing element or descend into uncompressed MIE group +# + # all done this MIE group if we reached the terminator element + unless ($tagLen) { + # skip over existing terminator data (if any) + last if $valLen and not $raf->Seek($valLen, 1); + $ok = 1; + # write group terminator if necessary + unless ($toWrite) { + # write end-of-group terminator element + my $term = "~\0\0\0"; + unless ($$dirInfo{Parent}) { + # write extended terminator for file-level group + my $len = ref $outfile eq 'SCALAR' ? length($$outfile) : tell $outfile; + $len += 10; # include length of terminator itself + if ($len and $len <= 0x7fffffff) { + $term = "~\0\0\x06" . Set32u($len) . MIEGroupFormat(1) . "\x04"; + } + } + Write($outfile, $term) or $err = 1; + } + last; + } + + # descend into existing uncompressed MIE group + if ($format == 0x10 or $format == 0x18) { + my ($subTablePtr, $dirName); + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($tagInfo and $$tagInfo{SubDirectory}) { + $dirName = $tagInfo->{SubDirectory}->{DirName}; + my $subTable = $tagInfo->{SubDirectory}->{TagTable}; + $subTablePtr = $subTable ? GetTagTable($subTable) : $tagTablePtr; + } else { + $subTablePtr = GetTagTable('Image::ExifTool::MIE::Unknown'); + } + my $hdr = '~' . chr($format) . chr(length $tag) . "\0" . $tag; + my %subdirInfo = ( + DirName => $dirName || $tag, + RAF => $raf, + ToWrite => $toWrite . $hdr, + OutFile => $outfile, + Parent => $dirName, + IsCompressed => $$dirInfo{IsCompressed}, + ); + my $oldOrder = GetByteOrder(); + SetByteOrder($format & 0x08 ? 'II' : 'MM'); + $msg = WriteMIEGroup($et, \%subdirInfo, $subTablePtr); + SetByteOrder($oldOrder); + last if $msg; + if (defined $msg) { + undef $msg; # no problem if nothing written + } else { + $toWrite = ''; + } + next; + } + # just copy existing element + my $oldVal; + $raf->Read($oldVal, $valLen) == $valLen or last; + if ($toWrite) { + Write($outfile, $toWrite) or $err = 1; + $toWrite = ''; + } + Write($outfile, $oldHdr, $oldVal) or $err = 1; + } + # return error message + if ($err) { + $msg = 'Error writing file'; + } elsif (not $ok and not $msg) { + $msg = 'Unexpected end of file'; + } elsif (not $msg and $toWrite) { + $msg = ''; # flag for nothing written + $verbose and print $out "Deleted $grp1 (empty)\n"; + } + return $msg; +} + +#------------------------------------------------------------------------------ +# Process MIE directory +# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref +# Returns: undef on success, or error message if there was a problem +# Notes: file pointer is positioned at the MIE end on entry +sub ProcessMIEGroup($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my $notUTF8 = ($$et{OPTIONS}{Charset} ne 'UTF8'); + my ($msg, $buff, $ok, $oldIndent, $mime); + my $lastTag = ''; + + # get group 1 names: $grp doesn't have numbers (eg. 'MIE-Doc'), + # and $grp1 does (eg. 'MIE1-Doc1') + my $cnt = $$et{MIE_COUNT}; + my $grp1 = $tagTablePtr->{GROUPS}->{1}; + my $n = $$cnt{'MIE-Main'} || 0; + if ($grp1 eq 'MIE-Main') { + $$cnt{$grp1} = ++$n; + $grp1 =~ s/MIE-/MIE$n-/ if $n > 1; + } else { + $grp1 =~ s/MIE-/MIE$n-/ if $n > 1; + $$cnt{$grp1} = ($$cnt{$grp1} || 0) + 1; + $grp1 .= $$cnt{$grp1} if $$cnt{$grp1} > 1; + } + # set group1 name for all tags extracted from this group + $$et{SET_GROUP1} = $grp1; + + if ($verbose) { + $oldIndent = $$et{INDENT}; + $$et{INDENT} .= '| '; + $et->VerboseDir($grp1); + } + my $wasCompressed = $$dirInfo{WasCompressed}; + + # process all MIE elements + for (;;) { + $raf->Read($buff, 4) == 4 or last; + my ($sync, $format, $tagLen, $valLen) = unpack('aC3', $buff); + $sync eq '~' or $msg = 'Invalid sync byte', last; + + # read tag name + my ($tag, $units); + if ($tagLen) { + $raf->Read($tag, $tagLen) == $tagLen or last; + $et->Warn("MIE tag '${tag}' out of sequence") if $tag lt $lastTag; + $lastTag = $tag; + # separate units from tag name if they exist + $units = $1 if $tag =~ s/\((.*)\)$//; + } else { + $tag = ''; + } + + # get multi-byte value length if necessary + if ($valLen > 252) { + my $n = 1 << (256 - $valLen); + $raf->Read($buff, $n) == $n or last; + my $fmt = 'int' . ($n * 8) . 'u'; + $valLen = ReadValue(\$buff, 0, $fmt, 1, $n); + if ($valLen > 0x7fffffff) { + $msg = "Can't read $tag (DataLength > 2GB not yet supported)"; + last; + } + } + + # all done if we reached the group terminator + unless ($tagLen) { + # skip over terminator data block + $ok = 1 unless $valLen and not $raf->Seek($valLen, 1); + last; + } + + # get tag information hash unless this is free space + my ($tagInfo, $value); + while ($format != 0x80) { + $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + last if $tagInfo; + # extract tags with locale code + if ($tag =~ /\W/) { + if ($tag =~ /^(\w+)-([a-z]{2}_[A-Z]{2})$/) { + my ($baseTag, $langCode) = ($1, $2); + $tagInfo = $et->GetTagInfo($tagTablePtr, $baseTag); + $tagInfo = GetLangInfo($tagInfo, $langCode) if $tagInfo; + last if $tagInfo; + } else { + $et->Warn('Invalid MIE tag name'); + last; + } + } + # extract unknown tags if specified + $tagInfo = { + Name => $tag, + Writable => 0, + PrintConv => 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val', + }; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + last; + } + + # read value and uncompress if necessary + my $formatStr = $mieFormat{$format & 0xfb} || 'undef'; + if ($tagInfo or ($formatStr eq 'MIE' and $format & 0x04)) { + $raf->Read($value, $valLen) == $valLen or last; + if ($format & 0x04) { + if ($verbose) { + print $out "$$et{INDENT}\[Tag '${tag}' $valLen bytes compressed]\n"; + } + next unless HasZlib($et, 'decode'); + my $stat; + my $inflate = Compress::Zlib::inflateInit(); + $inflate and ($value, $stat) = $inflate->inflate($value); + unless ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) { + $et->Warn("Error inflating $tag"); + next; + } + $valLen = length $value; + $wasCompressed = 1; + } + } + + # process this tag + if ($formatStr eq 'MIE') { + # process MIE directory + my ($subTablePtr, $dirName); + if ($tagInfo and $$tagInfo{SubDirectory}) { + $dirName = $tagInfo->{SubDirectory}->{DirName}; + my $subTable = $tagInfo->{SubDirectory}->{TagTable}; + $subTablePtr = $subTable ? GetTagTable($subTable) : $tagTablePtr; + } else { + $subTablePtr = GetTagTable('Image::ExifTool::MIE::Unknown'); + } + if ($verbose) { + my $order = ', byte order ' . GetByteOrder(); + $et->VerboseInfo($tag, $tagInfo, Size => $valLen, Extra => $order); + } + my %subdirInfo = ( + DirName => $dirName || $tag, + RAF => $raf, + Parent => $$dirInfo{DirName}, + WasCompressed => $wasCompressed, + ); + # read from uncompressed data instead if necessary + $subdirInfo{RAF} = new File::RandomAccess(\$value) if $valLen; + + my $oldOrder = GetByteOrder(); + SetByteOrder($format & 0x08 ? 'II' : 'MM'); + $msg = ProcessMIEGroup($et, \%subdirInfo, $subTablePtr); + SetByteOrder($oldOrder); + $$et{SET_GROUP1} = $grp1; # restore this group1 name + last if $msg; + } else { + # process MIE data format types + if ($tagInfo) { + my $rational; + # extract tag value + my $val = ReadMIEValue(\$value, 0, $formatStr, undef, $valLen, \$rational); + unless (defined $val) { + $et->Warn("Error reading $tag value"); + $val = '<err>'; + } + # save type or mime type + $mime = $val if $tag eq '0Type' or $tag eq '2MIME'; + if ($verbose) { + my $count; + my $s = Image::ExifTool::FormatSize($formatStr); + if ($s and $formatStr !~ /^(utf|string|undef)/) { + $count = $valLen / $s; + } + $et->VerboseInfo($lastTag, $tagInfo, + DataPt => \$value, + DataPos => $wasCompressed ? undef : $raf->Tell() - $valLen, + Size => $valLen, + Format => $formatStr, + Value => $val, + Count => $count, + ); + } + if ($$tagInfo{SubDirectory}) { + my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + my %subdirInfo = ( + DirName => $$tagInfo{Name}, + DataPt => \$value, + DataLen => $valLen, + DirStart=> 0, + DirLen => $valLen, + Parent => $$dirInfo{DirName}, + WasCompressed => $wasCompressed, + ); + # set DataPos and Base for uncompressed information only + unless ($wasCompressed) { + $subdirInfo{DataPos} = 0; # (relative to Base) + $subdirInfo{Base} = $raf->Tell() - $valLen; + } + # reset PROCESSED lookup for each MIE directory + # (there is no possibility of double-processing a MIE directory) + $$et{PROCESSED} = { }; + my $processProc = $tagInfo->{SubDirectory}->{ProcessProc}; + delete $$et{SET_GROUP1}; + delete $$et{NO_LIST}; + $et->ProcessDirectory(\%subdirInfo, $subTablePtr, $processProc); + $$et{SET_GROUP1} = $grp1; + $$et{NO_LIST} = 1; + } else { + # convert to specified character set if necessary + if ($notUTF8 and $formatStr =~ /^(utf|string)/) { + $val = $et->Decode($val, 'UTF8'); + } + if ($formatStr =~ /_list$/) { + # split list value into separate strings + my @vals = split "\0", $val; + $val = \@vals; + } + if (defined $units) { + $val = "@$val" if ref $val; # convert string list to number list + # add units to value if specified + $val .= "($units)" if defined $units; + } + my $key = $et->FoundTag($tagInfo, $val); + $$et{RATIONAL}{$key} = $rational if defined $rational and defined $key; + } + } else { + # skip over unknown information or free bytes + $raf->Seek($valLen, 1) or $msg = 'Seek error', last; + $verbose and $et->VerboseInfo($tag, undef, Size => $valLen); + } + } + } + # modify MIME type if necessary + $mime and not $$dirInfo{Parent} and $et->ModifyMimeType($mime); + + $ok or $msg or $msg = 'Unexpected end of file'; + $verbose and $$et{INDENT} = $oldIndent; + return $msg; +} + +#------------------------------------------------------------------------------ +# Read/write a MIE file +# Inputs: 0) ExifTool object reference, 1) DirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid MIE file, or -1 on write error +# - process as a trailer if "Trailer" flag set in dirInfo +sub ProcessMIE($$) +{ + my ($et, $dirInfo) = @_; + return 1 unless defined $et; + my $raf = $$dirInfo{RAF}; + my $outfile = $$dirInfo{OutFile}; + my ($buff, $err, $msg, $pos, $end, $isCreating); + my $numDocs = 0; +# +# process as a trailer (from end of file) if specified +# + if ($$dirInfo{Trailer}) { + my $offset = $$dirInfo{Offset} || 0; # offset from end of file + $raf->Seek(-10 - $offset, 2) or return 0; + for (;;) { + # read and validate last 10 bytes + $raf->Read($buff, 10) == 10 or last; + last unless $buff =~ /~\0\0\x06.{4}(\x10|\x18)(\x04)$/s or + $buff =~ /(\x10|\x18)(\x08)$/s; + SetByteOrder($1 eq "\x10" ? 'MM' : 'II'); + my $len = ($2 eq "\x04") ? Get32u(\$buff, 4) : Get64u(\$buff, 0); + my $curPos = $raf->Tell() or last; + last if $len < 12 or $len > $curPos; + # validate element header if 8-byte offset was used + if ($2 eq "\x08") { + last if $len < 14; + $raf->Seek($curPos - 14, 0) and $raf->Read($buff, 4) or last; + last unless $buff eq "~\0\0\x0a"; + } + # looks like a good group, so remember start position + $pos = $curPos - $len; + $end = $curPos unless $end; + # seek to 10 bytes from end of previous group + $raf->Seek($pos - 10, 0) or last; + } + # seek to start of first MIE group + return 0 unless defined $pos and $raf->Seek($pos, 0); + # update DataPos and DirLen for ProcessTrailers() + $$dirInfo{DataPos} = $pos; + $$dirInfo{DirLen} = $end - $pos; + if ($outfile and $$et{DEL_GROUP}{MIE}) { + # delete the trailer + $et->VPrint(0," Deleting MIE trailer\n"); + ++$$et{CHANGED}; + return 1; + } elsif ($et->Options('Verbose') or $$et{HTML_DUMP}) { + $et->DumpTrailer($dirInfo); + } + } +# +# loop through all documents in MIE file +# + for (;;) { + # look for "0MIE" group element + my $num = $raf->Read($buff, 8); + if ($num == 8) { + # verify file identifier + if ($buff =~ /^~(\x10|\x18)\x04(.)0MIE/s) { + SetByteOrder($1 eq "\x10" ? 'MM' : 'II'); + my $len = ord($2); + # skip extended DataLength if it exists + if ($len > 252 and not $raf->Seek(1 << (256 - $len), 1)) { + $msg = 'Seek error'; + last; + } + } else { + return 0 unless $numDocs; # not a MIE file + if ($buff =~ /^~/) { + $msg = 'Non-standard file-level MIE element'; + } else { + $msg = 'Invalid MIE file-level data'; + } + } + } elsif ($numDocs) { + last unless $num; # OK, all done with file + $msg = 'Truncated MIE element header'; + } else { + return 0 if $num or not $outfile; + # we have the ability to create a MIE file from scratch + $buff = ''; # start from nothing + # set byte order according to preferences + $et->SetPreferredByteOrder(); + $isCreating = 1; + } + if ($msg) { + last if $$dirInfo{Trailer}; # allow other trailers after MIE + if ($outfile) { + $et->Error($msg); + } else { + $et->Warn($msg); + } + last; + } + # this is a new MIE document -- increment document count + unless ($numDocs) { + # this is a valid MIE file (unless a trailer on another file) + $et->SetFileType(); + $$et{NO_LIST} = 1; # handle lists ourself + $$et{MIE_COUNT} = { }; + undef $hasZlib; + } + ++$numDocs; + + # process the MIE groups recursively, beginning with the main MIE group + my $tagTablePtr = GetTagTable('Image::ExifTool::MIE::Main'); + + my %subdirInfo = ( + DirName => 'MIE', + RAF => $raf, + OutFile => $outfile, + # don't define Parent so WriteMIEGroup() writes extended terminator + ); + if ($outfile) { + # generate lookup for MIE format codes if not done already + unless (%mieCode) { + foreach (keys %mieFormat) { + $mieCode{$mieFormat{$_}} = $_; + } + } + # update %mieMap with user-defined MIE groups + UpdateMieMap() unless $doneMieMap; + # initialize write directories, with MIE tags taking priority + # (note that this may re-initialize directories when writing trailer + # to another type of image, but this is OK because we are done writing + # the other format by the time we start writing the trailer) + $et->InitWriteDirs(\%mieMap, 'MIE'); + $subdirInfo{ToWrite} = '~' . MIEGroupFormat(1) . "\x04\xfe0MIE\0\0\0\0"; + $msg = WriteMIEGroup($et, \%subdirInfo, $tagTablePtr); + if ($msg) { + $et->Error($msg); + $err = 1; + last; + } elsif (defined $msg and $isCreating) { + last; + } + } else { + $msg = ProcessMIEGroup($et, \%subdirInfo, $tagTablePtr); + if ($msg) { + $et->Warn($msg); + last; + } + } + } + delete $$et{NO_LIST}; + delete $$et{MIE_COUNT}; + delete $$et{SET_GROUP1}; + return $err ? -1 : 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::MIE - Read/write MIE meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to read and write +information in MIE files. + +=head1 WHAT IS MIE? + +MIE stands for "Meta Information Encapsulation". The MIE format is an +extensible, dedicated meta information format which supports storage of +binary as well as textual meta information. MIE can be used to encapsulate +meta information from many sources and bundle it together with any type of +file. + +=head2 Features + +Below is very subjective score card comparing the features of a number of +common file and meta information formats, and comparing them to MIE. The +following features are rated for each format with a score of 0 to 10: + + 1) Extensible (can incorporate user-defined information). + 2) Meaningful tag ID's (hint to meaning of unknown information). + 3) Sequential read/write ability (streamable). + 4) Hierarchical information structure. + 5) Easy to implement reader/writer/editor. + 6) Order of information well defined. + 7) Large data lengths supported: >64kB (+5) and >4GB (+5). + 8) Localized text strings. + 9) Multiple documents in a single file. + 10) Compact format doesn't squander disk space or bandwidth. + 11) Compressed meta information supported. + 12) Relocatable data elements (ie. no fixed offsets). + 13) Binary meta information (+7) with variable byte order (+3). + 14) Mandatory tags not required (an unnecessary complication). + 15) Append information to end of file without editing. + + Feature number Total + Format 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Score + ------ --------------------------------------------- ----- + MIE 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 150 + PDF 10 10 0 10 0 0 10 0 10 10 10 0 7 10 10 97 + PNG 10 10 10 0 8 0 5 10 0 10 10 10 0 10 0 93 + XMP 10 10 10 10 2 0 10 10 10 0 0 10 0 10 0 92 + AIFF 0 5 10 10 10 0 5 0 0 10 0 10 7 10 0 77 + RIFF 0 5 10 10 10 0 5 0 0 10 0 10 7 10 0 77 + JPEG 10 0 10 0 10 0 0 0 0 10 0 10 7 10 0 67 + EPS 10 10 10 0 0 0 10 0 10 0 0 5 0 10 0 65 + CIFF 0 0 0 10 10 0 5 0 0 10 0 10 10 10 0 65 + TIFF 0 0 0 10 5 10 5 0 10 10 0 0 10 0 0 60 + EXIF 0 0 0 10 5 10 0 0 0 10 0 0 10 0 0 45 + IPTC 0 0 10 0 8 0 0 0 0 10 0 10 7 0 0 45 + +By design, MIE ranks highest by a significant margin. Other formats with +reasonable scores are PDF, PNG and XMP, but each has significant weak +points. What may be surprising is that TIFF, EXIF and IPTC rank so low. + +As well as scoring high in all these features, the MIE format has the unique +ability to encapsulate any other type of file, and provides a non-invasive +method of adding meta information to a file. The meta information is +logically separated from the original file data, which is extremely +important because meta information is routinely lost when files are edited. + +Also, the MIE format supports multiple files by simple concatenation, +enabling all kinds of wonderful features such as linear databases, edit +histories or non-intrusive file updates. This ability can also be leveraged +to allow MIE-format trailers to be added to some other file types. + +=head1 MIE 1.1 FORMAT SPECIFICATION (2007-01-21) + +=head2 File Structure + +A MIE file consists of a series of MIE elements. A MIE element may contain +either data or a group of MIE elements, providing a hierarchical format for +storing data. Each MIE element is identified by a human-readable tag name, +and may store data from zero to 2^64-1 bytes in length. + +=head2 File Signature + +The first element in the MIE file must be an uncompressed MIE group element +with a tag name of "0MIE". This restriction allows the first 8 bytes of a +MIE file to be used to identify a MIE format file. The following table +lists the two possible initial byte sequences for a MIE-format file (the +first for big-endian, and the second for little-endian byte ordering): + + Byte Number: 0 1 2 3 4 5 6 7 + + C Characters: ~ \x10 \x04 ? 0 M I E + or ~ \x18 \x04 ? 0 M I E + + Hexadecimal: 7e 10 04 ? 30 4d 49 45 + or 7e 18 04 ? 30 4d 49 45 + + Decimal: 126 16 4 ? 48 77 73 69 + or 126 24 4 ? 48 77 73 69 + +Note that byte 1 may have one of the two possible values (0x10 or 0x18), and +byte 3 may have any value (0x00 to 0xff). + +=head2 Element Structure + + 1 byte SyncByte = 0x7e (decimal 126, character '~') + 1 byte FormatCode (see below) + 1 byte TagLength (T) + 1 byte DataLength (gives D if DataLength < 253) + T bytes TagName (T given by TagLength) + 2 bytes DataLength2 [exists only if DataLength == 255 (0xff)] + 4 bytes DataLength4 [exists only if DataLength == 254 (0xfe)] + 8 bytes DataLength8 [exists only if DataLength == 253 (0xfd)] + D bytes DataBlock (D given by DataLength) + +The minimum element length is 4 bytes (for a group terminator). The maximum +DataBlock size is 2^64-1 bytes. TagLength and DataLength are unsigned +integers, and the byte ordering for multi-byte DataLength fields is +specified by the containing MIE group element. The SyncByte is byte +aligned, so no padding is added to align on an N-byte boundary. + +=head3 FormatCode + +The format code is a bitmask that defines the format of the data: + + 7654 3210 + ++++ ---- FormatType + ---- +--- TypeModifier + ---- -+-- Compressed + ---- --++ FormatSize + +=over 4 + +=item FormatType (bitmask 0xf0): + + 0x00 - other (or unknown) data + 0x10 - MIE group + 0x20 - text string + 0x30 - list of null-separated text strings + 0x40 - integer + 0x50 - rational + 0x60 - fixed point + 0x70 - floating point + 0x80 - free space + +=item TypeModifier (bitmask 0x08): + +Modifies the meaning of certain FormatTypes (0x00-0x60): + + 0x08 - other data sensitive to MIE group byte order + 0x18 - MIE group with little-endian byte ordering + 0x28 - UTF encoded text string + 0x38 - UTF encoded text string list + 0x48 - signed integer + 0x58 - signed rational (denominator is always unsigned) + 0x68 - signed fixed-point + +=item Compressed (bitmask 0x04): + +If this bit is set, the data block is compressed using Zlib deflate. An +entire MIE group may be compressed, with the exception of file-level groups. + +=item FormatSize (bitmask 0x03): + +Gives the byte size of each data element: + + 0x00 - 8 bits (1 byte) + 0x01 - 16 bits (2 bytes) + 0x02 - 32 bits (4 bytes) + 0x03 - 64 bits (8 bytes) + +The number of bytes in a single value for this format is given by +2**FormatSize (or 1 << FormatSize). The number of values is the data length +divided by this number of bytes. It is an error if the data length is not +an even multiple of the format size in bytes. + +=back + +The following is a list of all currently defined MIE FormatCode values for +uncompressed data (add 0x04 to each value for compressed data): + + 0x00 - other data (insensitive to MIE group byte order) (1) + 0x01 - other 16-bit data (may be byte swapped) + 0x02 - other 32-bit data (may be byte swapped) + 0x03 - other 64-bit data (may be byte swapped) + 0x08 - other data (sensitive to MIE group byte order) (1) + 0x10 - MIE group with big-endian values (1) + 0x18 - MIE group with little-endian values (1) + 0x20 - ASCII (ISO 8859-1) string (2,3) + 0x28 - UTF-8 string (2,3,4) + 0x29 - UTF-16 string (2,3,4) + 0x2a - UTF-32 string (2,3,4) + 0x30 - ASCII (ISO 8859-1) string list (3,5) + 0x38 - UTF-8 string list (3,4,5) + 0x39 - UTF-16 string list (3,4,5) + 0x3a - UTF-32 string list (3,4,5) + 0x40 - unsigned 8-bit integer + 0x41 - unsigned 16-bit integer + 0x42 - unsigned 32-bit integer + 0x43 - unsigned 64-bit integer (6) + 0x48 - signed 8-bit integer + 0x49 - signed 16-bit integer + 0x4a - signed 32-bit integer + 0x4b - signed 64-bit integer (6) + 0x52 - unsigned 32-bit rational (16-bit numerator then denominator) (7) + 0x53 - unsigned 64-bit rational (32-bit numerator then denominator) (7) + 0x5a - signed 32-bit rational (denominator is unsigned) (7) + 0x5b - signed 64-bit rational (denominator is unsigned) (7) + 0x61 - unsigned 16-bit fixed-point (high 8 bits is integer part) (8) + 0x62 - unsigned 32-bit fixed-point (high 16 bits is integer part) (8) + 0x69 - signed 16-bit fixed-point (high 8 bits is signed integer) (8) + 0x6a - signed 32-bit fixed-point (high 16 bits is signed integer) (8) + 0x72 - 32-bit IEEE float (not recommended for portability reasons) + 0x73 - 64-bit IEEE double (not recommended for portability reasons) (6) + 0x80 - free space (value data does not contain useful information) + +Notes: + +=over 4 + +=item 1. + +The byte ordering specified by the MIE group TypeModifier applies to the MIE +group element as well as all elements within the group. Data for all +FormatCodes except 0x08 (other data, sensitive to byte order) may be +transferred between MIE groups with different byte order by byte swapping +the uncompressed data according to the specified data format. The following +list illustrates the byte-swapping pattern, based on FormatSize, for all +format types except rational (FormatType 0x50). + + FormatSize Change in Byte Sequence + -------------- ----------------------------------- + 0x00 (8 bits) 0 1 2 3 4 5 6 7 --> 0 1 2 3 4 5 6 7 (no change) + 0x01 (16 bits) 0 1 2 3 4 5 6 7 --> 1 0 3 2 5 4 7 6 + 0x02 (32 bits) 0 1 2 3 4 5 6 7 --> 3 2 1 0 7 6 5 4 + 0x03 (64 bits) 0 1 2 3 4 5 6 7 --> 7 6 5 4 3 2 1 0 + +Rational values consist of two integers, so they are swapped as the next +lower FormatSize. For example, a 32-bit rational (FormatSize 0x02, and +FormatCode 0x52 or 0x5a) is swapped as two 16-bit values (ie. as if it had +FormatSize 0x01). + +=item 2. + +The TagName of a string element may have an 6-character suffix to indicate a +specific locale. (eg. "Title-en_US", or "Keywords-de_DE"). + +=item 3. + +Text strings are not normally null terminated, however they may be padded +with one or more null characters to the end of the data block to allow +strings to be edited within fixed-length data blocks. Newlines in the text +are indicated by a single LF (0x0a) character. + +=item 4. + +UTF strings must not begin with a byte order mark (BOM) since the byte order +and byte size are specified by the MIE format. If a BOM is found, it should +be treated as a zero-width non-breaking space. + +=item 5. + +A list of text strings separated by null characters. These lists must not +be null padded or null terminated, since this would be interpreted as +additional zero-length strings. For ASCII and UTF-8 strings, the null +character is a single zero (0x00) byte. For UTF-16 or UTF-32 strings, the +null character is 2 or 4 zero bytes respectively. + +=item 6. + +64-bit integers and doubles are subject to the specified byte ordering for +both 32-bit words and bytes within these words. For instance, the high +order byte is always the first byte if big-endian, and the eighth byte if +little-endian. This means that some swapping is always necessary for these +values on systems where the byte order differs from the word order (eg. some +ARM systems), regardless of the endian-ness of the stored values. + +=item 7. + +Rational values are treated as two separate integers. The numerator always +comes first regardless of the byte ordering. In a signed rational value, +only the numerator is signed. The denominator of all rational values is +unsigned (eg. a signed 64-bit rational of 0x80000000/0x80000000 evaluates to +-1, not +1). + +=item 8. + +32-bit fixed point values are converted to floating point by treating them +as an integer and dividing by an appropriate value. eg) + + 16-bit fixed value = 16-bit integer value / 256.0 + 32-bit fixed value = 32-bit integer value / 65536.0 + +=back + +=head3 TagLength + +Gives the length of the TagName string. Any value between 0 and 255 is +valid, but the TagLength of 0 is valid only for the MIE group terminator. + +=head3 DataLength + +DataLength is an unsigned byte that gives the number of bytes in the data +block. A value between 0 and 252 gives the data length directly, and +numbers from 253 to 255 are reserved for extended DataLength codes. Codes +of 255, 254 and 253 indicate that the element contains an additional 2, 4 or +8 byte unsigned integer representing the data length. + + 0-252 - length of data block + 255 (0xff) - use DataLength2 + 254 (0xfe) - use DataLength4 + 253 (0xfd) - use DataLength8 + +A DataLength of zero is valid for any element except a compressed MIE group. +A zero DataLength for an uncompressed MIE group indicates that the group +length is unknown. For other elements, a zero length indicates there is no +associated data. A terminator element must have a DataLength of 0, 6 or 10, +and may not use an extended DataLength. + +=head3 TagName + +The TagName string is 0 to 255 bytes long, and is composed of the ASCII +characters A-Z, a-z, 0-9 and underline ('_'). Also, a dash ('-') is used to +separate the language/country code in the TagName of a localized text +string, and a units string (possibly containing other ASCII characters) may +be appear in brackets at the end of the TagName. The TagName string is NOT +null terminated. A MIE element with a tag string of zero length is reserved +for the group terminator. + +MIE elements are sorted alphabetically by TagName within each group. +Multiple elements with the same TagName are allowed, even within the same +group. + +TagNames should be meaningful. Case is significant. Words should be +lowercase with an uppercase first character, and acronyms should be all +upper case. The underline ("_") is provided to allow separation of two +acronyms or two numbers, but it shouldn't be used unless necessary. No +separation is necessary between an acronym and a word (eg. "ISOSetting"). + +All TagNames should start with an uppercase letter. An exception to this +rule allows tags to begin with a digit (0-9) if they must come before other +tags in the sort order, or a lowercase letter (a-z) if they must come after. +For instance, the '0Type' element begins with a digit so it comes before, +and the 'data' element begins with a lowercase letter so that it comes after +meta information tags in the main "0MIE" group. + +Tag names for localized text strings have an 6-character suffix with the +following format: The first character is a dash ('-'), followed by a +2-character lower case ISO 639-1 language code, then an underline ('_'), and +ending with a 2-character upper case ISO 3166-1 alpha 2 country code. (eg. +"-en_US", "-en_GB", "-de_DE" or "-fr_FR". Note that "GB", and not "UK" is +the code for Great Britain, although "UK" should be recognized for +compatibility reasons.) The suffix is included when sorting the tags +alphabetically, so the default locale (with no tag-name suffix) always comes +first. If the country is unknown or not applicable, a country code of "XX" +should be used. + +Tags with numerical values may allow units of measurement to be specified. +The units string is stored in brackets at the end of the tag name, and is +composed of zero or more ASCII characters in the range 0x21 to 0x7d, +excluding the bracket characters 0x28 and 0x29. (eg. "Resolution(/cm)" or +"SpecificHeat(J/kg.K)".) See L<Image::ExifTool::MIEUnits> for details. Unit +strings are not localized, and may not be used in combination with localized +text strings. + +Sets of tags which would require a common prefix should be added in a +separate MIE group instead of adding the prefix to all tag names. For +example, instead of these TagName's: + + ExternalFlashType + ExternalFlashSerialNumber + ExternalFlashFired + +one would instead designate a separate "ExternalFlash" MIE group to contain +the following elements: + + Type + SerialNumber + Fired + +=head3 DataLength2/4/8 + +These extended DataLength fields exist only if DataLength is 255, 254 or +253, and are respectively 2, 4 or 8 byte unsigned integers giving the data +block length. One of these values must be used if the data block is larger +than 252 bytes, but they may be used if desired for smaller blocks too +(although this may add a few unnecessary bytes to the MIE element). + +=head3 DataBlock + +The data value for the MIE element. The format of the data is given by the +FormatCode. For MIE group elements, the data includes all contained +elements and the group terminator. + +=head2 MIE groups + +All MIE data elements must be contained within a group. A group begins with +a MIE group element, and ends with a group terminator. Groups may be nested +in a hierarchy to arbitrary depth. + +A MIE group element is identified by a format code of 0x10 (big endian byte +ordering) or 0x18 (little endian). The group terminator is distinguished by +a zero TagLength (it is the only element allowed to have a zero TagLength), +and has a FormatCode of 0x00. + +The MIE group element is permitted to have a zero DataLength only if the +data is uncompressed. This special value indicates that the group length is +unknown (otherwise the minimum value for DataLength is 4, corresponding the +the minimum group size which includes a terminator of at least 4 bytes). If +DataLength is zero, all elements in the group must be parsed until the group +terminator is found. If non-zero, DataLength includes the length of all +elements contained within the group, including the group terminator. Use of +a non-zero DataLength is encouraged because it allows readers quickly skip +over entire MIE groups. For compressed groups DataLength must be non-zero, +and is the length of the compressed group data (which includes the +compressed group terminator). + +=head3 Group Terminator + +The group terminator has a FormatCode and TagLength of zero. The terminator +DataLength must be 0, 6 or 10 bytes, and extended DataLength codes may not +be used. With a zero DataLength, the byte sequence for a terminator is "7e +00 00 00" (hex). With a DataLength of 6 or 10 bytes, the terminator data +block contains information about the length and byte ordering of the +preceding group. This additional information is recommended for file-level +groups, and is used in multi-document MIE files and MIE trailers to allow +the file to be scanned backwards from the end. (This may also allow some +documents to be recovered if part of the file is corrupted.) The structure +of this optional terminator data block is as follows: + + 4 or 8 bytes GroupLength (unsigned integer) + 1 byte ByteOrder (0x10 or 0x18, same as MIE group) + 1 byte GroupLengthSize (0x04 or 0x08) + +The ByteOrder and GroupLengthSize values give the byte ordering and size of +the GroupLength integer. The GroupLength value is the total length of the +entire MIE group ending with this terminator, including the opening MIE +group element and the terminator itself. + +=head3 File-level MIE groups + +File-level MIE groups may NOT be compressed. + +All elements in a MIE file are contained within a special group with a +TagName of "0MIE". The purpose of the "OMIE" group is to provide a unique +signature at the start of the file, and to encapsulate information allowing +files to be easily combined. The "0MIE" group must be terminated like any +other group, but it is recommended that the terminator of a file-level group +include the optional data block (defined above) to provide information about +the group length and byte order. + +It is valid to have more than one "0MIE" group at the file level, allowing +multiple documents in a single MIE file. Furthermore, the MIE structure +enables multi-document files to be generated by simply concatenating two or +more MIE files. + +=head2 Scanning Backwards through a MIE File + +The steps below give an algorithm to quickly locate the last document in a +MIE file: + +=over 4 + +=item 1. + +Read the last 10 bytes of the file. (Note that a valid MIE file may be as +short as 12 bytes long, but a file this length contains only an an empty MIE +group.) + +=item 2. + +If the last byte of the file is zero, then it is not possible to scan +backward through the file, so the file must be scanned from the beginning. +Otherwise, proceed to the next step. + +=item 3. + +If the last byte is 4 or 8, the terminator contains information about the +byte ordering and length of the group. Otherwise, stop here because this +isn't a valid MIE file. + +=item 4. + +The next-to-last byte must be either 0x10 indicating big-endian byte +ordering or 0x18 for little-endian ordering, otherwise this isn't a valid +MIE file. + +=item 5. + +The value of the preceding 4 or 8 bytes gives the length of the complete +file-level MIE group (GroupLength). This length includes both the leading +MIE group element and the terminator element itself. The value is an +unsigned integer with a byte length given in step 3), and a byte order from +step 4). From the current file position (at the end of the data read in +step 1), seek backward by this number of bytes to find the start of the MIE +group element for this document. + +=back + +This algorithm may be repeated again beginning at this point in the file to +locate the next-to-last document, etc. + +The table below lists all 5 valid patterns for the last 14 bytes of a +file-level MIE group, with all numbers in hex. The comments indicate the +length and byte ordering of GroupLength (xx) if available: + + ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 7e 00 00 00 - (no GroupLength) + ?? ?? ?? ?? 7e 00 00 06 xx xx xx xx 10 04 - 4 bytes, big endian + ?? ?? ?? ?? 7e 00 00 06 xx xx xx xx 18 04 - 4 bytes, little endian + 7e 00 00 0a xx xx xx xx xx xx xx xx 10 08 - 8 bytes, big endian + 7e 00 00 0a xx xx xx xx xx xx xx xx 18 08 - 8 bytes, little endian + +=head2 Trailer Signature + +The MIE format may be used for trailer information appended to other types +of files. When this is done, a signature must appear at the end of the main +MIE group to uniquely identify the MIE format trailer. To achieve this, a +"zmie" trailer signature is written as the last element in the main "0MIE" +group. This element has a FormatCode of 0, a TagLength of 4, a DataLength +of 0, and a TagName of "zmie". With this signature, the hex byte sequence +"7e 00 04 00 7a 6d 69 65" appears immediately before the final group +terminator, and the last 22 bytes of the trailer correspond to one of the +following 4 patterns (where the trailer length is given by "xx", as above): + + ?? ?? ?? ?? 7e 00 04 00 7a 6d 69 65 7e 00 00 06 xx xx xx xx 10 04 + ?? ?? ?? ?? 7e 00 04 00 7a 6d 69 65 7e 00 00 06 xx xx xx xx 18 04 + 7e 00 04 00 7a 6d 69 65 7e 00 00 0a xx xx xx xx xx xx xx xx 10 08 + 7e 00 04 00 7a 6d 69 65 7e 00 00 0a xx xx xx xx xx xx xx xx 18 08 + +Note that the zero-DataLength terminator may not be used here because the +trailer length must be known for seeking backwards from the end of the file. + +Multiple trailers may be appended to the same file using this technique. + +=head2 MIE Data Values + +MIE data values for a given tag are usually not restricted to a specific +FormatCode. Any value may be represented in any appropriate format, +including numbers represented in string (ASCII or UTF) form. + +It is preferred that closely related values with the same format are written +to a single tag instead of using multiple tags. This improves localization +of like values and decreases MIE element overhead. For instance, instead of +separate ImageWidth and ImageHeight tags, a single ImageSize tag is defined. + +Tags which may take on a discrete set of values should have meaningful +values if possible. This improves the extensibility of the format and +allows a more reasonable interpretation of unrecognized values. + +=head3 Numerical Representation + +Integer and floating point numbers may be represented in binary or string +form. In string form, integers are a series of digits with an optional +leading sign (eg. "[+|-]DDDDDD"), and multiple values are separated by a +single space character (eg. "23 128 -32"). Floating point numbers are +similar but may also contain a decimal point and/or a signed exponent with a +leading 'e' character (eg. "[+|-]DD[.DDDDDD][e(+|-)EEE]"). The string "inf" +is used to represent infinity. One advantage of numerical strings is that +they can have an arbitrarily high precision because the possible number of +significant digits is virtually unlimited. + +Note that numerical values may have associated units of measurement which +are specified in the L</TagName> string. + +=head3 Date/Time Format + +All MIE dates are strings in the form "YYYY:mm:dd HH:MM:SS.ss+HH:MM". The +fractional seconds (".ss") are optional, and if included may contain any +number of significant digits (unlike all other fields which are a fixed +number of digits and must be padded with leading zeros if necessary). The +timezone ("+HH:MM" or "-HH:MM") is recommended but not required. If not +given, the local system timezone is assumed. + +=head2 MIME Type + +The basic MIME type for a MIE file is "application/x-mie", however the +specific MIME type depends on the type of subfile, and is obtained by adding +"x-mie-" to the MIME type of the subfile. For example, with a subfile of +type "image/jpeg", the MIE file MIME type is "image/x-mie-jpeg". But note +that the "x-" is not duplicated if the subfile MIME type already starts with +"x-". So a subfile with MIME type "image/x-raw" is contained within a MIE +file of type "image/x-mie-raw", not "image/x-mie-x-raw". In the case of +multiple documents in a MIE file, the MIME type is taken from the first +document. Regardless of the subfile type, all MIE-format files should have +a filename extension of ".MIE". + +=head2 Levels of Support + +Basic MIE reader/writer applications may choose not to provide support for +some advanced features of the MIE format. Features which may not be +supported by all software are: + +=over 4 + +=item Compression + +Software not supporting compression must ignore compressed elements and +groups, but should be able to process the remaining information. + +=item Large data lengths + +Some software may limit the maximum size of a MIE group or element. +Historically, a limit of 2GB may be imposed by some systems. However, +8-byte data lengths should be supported by all applications provided the +value doesn't exceed the system limit. (eg. For systems with a 2GB limit, +8-byte data lengths should be supported if the upper 17 bits are all zero.) +If a data length above the system limit is encountered, it may be necessary +for the application to stop processing if it can not seek to the next +element in the file. + +=back + +=head1 EXAMPLES + +This section gives examples for working with MIE information using ExifTool. + +=head2 Encapsulating Information with Data in a MIE File + +The following command encapsulates any file recognized by ExifTool inside a +MIE file, and initializes MIE tags from information within the file: + + exiftool -o new.mie -tagsfromfile FILE '-mie:all<all' \ + '-subfilename<filename' '-subfiletype<filetype' \ + '-subfilemimetype<mimetype' '-subfiledata<=FILE' + +where C<FILE> is the name of the file. + +For unrecognized files, this command may be used: + + exiftool -o new.mie -subfilename=FILE -subfiletype=TYPE \ + -subfilemimetype=MIME '-subfiledata<=FILE' + +where C<TYPE> and C<MIME> represent the source file type and MIME type +respectively. + +=head2 Adding a MIE Trailer to a File + +The MIE format may also be used to store information in a trailer appended +to another type of file. Beware that trailers may not be compatible with +all file formats, but JPEG and TIFF are two formats where additional trailer +information doesn't create any problems for normal parsing of the file. +Also note that this technique has the disadvantage that trailer information +is commonly lost if the file is subsequently edited by other software. + +Creating a MIE trailer with ExifTool is a two-step process since ExifTool +can't currently be used to add a MIE trailer directly. The example below +illustrates the steps for adding a MIE trailer with a small preview image +(C<small.jpg>) to a destination JPEG image (C<dst.jpg>). + +Step 1) Create a MIE file with a TrailerSignature containing the desired +information: + + exiftool -o new.mie -trailersignature=1 -tagsfromfile small.jpg \ + '-previewimagetype<filetype' '-previewimagesize<imagesize' \ + '-previewimagename<filename' '-previewimage<=small.jpg' + +Step 2) Append the MIE information to another file. In Unix, this can be +done with the 'cat' command: + + cat new.mie >> dst.jpg + +Once added, ExifTool may be used to edit or delete a MIE trailer in a JPEG +or TIFF image. + +=head2 Multiple MIE Documents in a Single File + +The MIE specification allows multiple MIE documents (or trailers) to exist +in a single file. A file like this may be created by simply concatenating +MIE documents. ExifTool may be used to access information in a specific +document by adding a copy number to the MIE group name. For example: + + # write the Author tag in the second MIE document + exiftool -mie2:author=phil test.mie + + # delete the first MIE document from a file + exiftool -mie1:all= test.mie + +=head2 Units of Measurement + +Some MIE tags allow values to be specified in different units of +measurement. In the MIE file format these units are combined with the tag +name, but when using ExifTool they are specified in brackets after the +value: + + exiftool -mie:gpsaltitude='7500(ft)' test.mie + +If no units are provided, the default units are written. + +=head2 Localized Text + +Localized text values are accessed by adding a language/country code to the +tag name. For example: + + exiftool -comment-en_us='this is a comment' test.mie + +=head1 REVISIONS + + 2010-04-05 - Fixed "Format Size" Note 7 to give the correct number of bits + in the example rational value + 2007-01-21 - Specified LF character (0x0a) for text newline sequence + 2007-01-19 - Specified ISO 8859-1 character set for extended ASCII codes + 2007-01-01 - Improved wording of Step 5 for scanning backwards in MIE file + 2006-12-30 - Added EXAMPLES section and note about UTF BOM + 2006-12-20 - MIE 1.1: Changed meaning of TypeModifier bit (0x08) for + unknown data (FormatType 0x00), and documented byte swapping + 2006-12-14 - MIE 1.0: Added Data Values and Numerical Representations + sections, and added ability to specify units in tag names + 2006-11-09 - Added Levels of Support section + 2006-11-03 - Added Trailer Signature + 2005-11-18 - Original specification created + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. The MIE format itself is also +copyright Phil Harvey, and is covered by the same free-use license. + +=head1 REFERENCES + +=over 4 + +=item L<https://exiftool.org/MIE1.1-20070121.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/MIE Tags>, L<Image::ExifTool::MIEUnits>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/MIEUnits.pod b/lib/Image/ExifTool/MIEUnits.pod new file mode 100644 index 0000000..3484f6c --- /dev/null +++ b/lib/Image/ExifTool/MIEUnits.pod @@ -0,0 +1,377 @@ + +=head1 NAME + +Image::ExifTool::MIEUnits - MIE units documentation + +=head1 DESCRIPTION + +The MIE format allows units of measurement to be specified in brackets at +the end of a MIE tag name (eg. "Volume(m3)"). This document describes the +standard MIE units abbreviations. + +=head1 SYNTAX + +The units string may contain any ASCII characters in the range 0x21 ('!') to +0x7d ('}'), excepting the bracket characters (0x28 and 0x29). An empty +string is allowed, and indicates a dimensionless value. L<Standard +units|/STANDARD UNITS> should be used where possible. In the standard +units, an underline ('_') is used to indicate a subscript, and multiple +words may be separated with a hyphen ('-'). + +Exponents should be positive, and require no separator (eg. "m2" for square +meters). L<Prefixes|/PREFIXES> may be added to the standard units (eg. +"cm") except when the resulting name conflicts with another standard unit. + +Multiplication is indicated by '.', and division by '/'. Reciprocal units +(ie. the multiplicative inverse) are obtained through division rather than +the use of negative exponents (eg. "/in", not "in-1"). In MIE units, +multiplication has precedence over division, so everything to the right of a +'/' is in the denominator. (See L</EXAMPLES> for a few examples.) + +Below is a table summarizing the special characters used in MIE units +strings. + + . multiplication + / division (used for negative exponents) + - word separator + _ subscript + {} annotation + [] used to avoid name conflicts if necessary + 0-9 exponentiation + +=head1 STANDARD UNITS + + dimensionless + [G] Newtonian constant of gravitation (unclassified) + [g] standard acceleration of free fall (acceleration) + [h] Planck constant (action) + [k] Boltzmann constant (unclassified) + {cfu} colony forming units (number) + {rbc} red blood cell count (number) + {tbl} tablets (number) + {tot} particles total count (number) + % percent (fraction) + 10^N the number ten for arbitrary powers (number) + A Ampere (electric current) + a year (time) + a_g mean Gregorian year (time) + a_j mean Julian year (time) + a_t tropical year (time) + acr acre, U.S. (area) + acr_br acre, British (area) + Ao Angstrom (length) + APL-U APL unit (biologic activity of anticardiolipin IgA) + ar are (area) + arb-U arbitrary unit (arbitrary) + arcmin minute of arc (plane angle) + arcsec second of arc (plane angle) + atm standard atmosphere (pressure) + att technical atmosphere (pressure) + AU astronomic unit (length) + b barn (action area) + B bel (level) + B-kW bel kilowatt (power level) + B-mV bel millivolt (electric potential level) + B-SPL bel sound pressure (pressure level) + B-uV bel microvolt (electric potential level) + B-V bel volt (electric potential level) + B-W bel watt (power level) + bar bar (pressure) + bbl barrel (fluid volume) + Bd baud (signal transmission rate) + bdsk-U Bodansky unit (biologic activity of phosphatase) + beth-U Bethesda unit (biologic activity of factor VIII inhibitor) + bf board foot (volume) + Bi Biot (electric current) + bit bit (amount of information) + Bq Becquerel (radioactivity) + Btu British thermal unit (energy) + Btu_39 British thermal unit at 39 degF (energy) + Btu_59 British thermal unit at 59 degF (energy) + Btu_60 British thermal unit at 60 degF (energy) + Btu_IT international table British thermal unit (energy) + Btu_m mean British thermal unit (energy) + Btu_th thermochemical British thermal unit (energy) + bu bushel, U.S. (dry volume) + bu_br bushel, British (volume) + By byte (amount of information) + C Coulomb (electric charge) + c velocity of light (velocity) + cal calorie (energy) + Cal nutrition label Calories (energy) + cal_15 calorie at 15 degC (energy) + cal_20 calorie at 20 degC (energy) + cal_IT international table calorie (energy) + cal_m mean calorie (energy) + cal_th thermochemical calorie (energy) + car_Au carat of gold alloys (mass fraction) + car_m metric carat (mass) + cd candela (luminous intensity) + Cel degree Celsius (temperature) + Ch Charriere (gauge of catheters) + ch Gunter's chain, U.S. (length) + ch_br Gunter's chain, British (length) + Ci Curie (radioactivity) + cicero cicero (length) + circ circle (plane angle) + cml circular mil, international (area) + cr cord, international (volume) + crd_us cord, U.S. (fluid volume) + cup_us cup (volume) + d day (time) + deg degree (plane angle) + deg{mag} degree from magnetic north (plane angle) + degF degree Fahrenheit (temperature) + didot didot (length) + diop diopter (refraction of a lens) + dpt dry pint, U.S. (dry volume) + dqt dry quart, U.S. (dry volume) + dr dram (mass) + dr_ap dram, apothecary (mass) + drp drop (volume) + dye-U Dye unit (biologic activity of amylase) + dyn dyne (force) + e elementary charge (electric charge) + eps_0 permittivity of vacuum (electric permittivity) + eq equivalents (amount of substance) + erg erg (energy) + eV electronvolt (energy) + F Farad (electric capacitance) + fdr fluid dram, U.S. (fluid volume) + fdr_br fluid dram, British (volume) + foz fluid ounce, U.S. (fluid volume) + foz_br fluid ounce, British (volume) + ft foot, international (length) + ft_br foot, British (length) + ft_us foot, U.S. (length) + fth fathom, international (length) + fth_br fathom, British (length) + fth_us fathom, U.S. (length) + fur furlong, U.S. (length) + G Gauss (magnetic flux density) + g gram (mass) + g.m/{H-B} gram meter per heartbeat (prop. to ventricular stroke work) + g% gram percent (mass fraction) + Gal Gal (acceleration) + gal gallon, U.S. (fluid volume) + gal_br gallon, British (volume) + gal_wi historical winchester gallon (dry volume) + Gb Gilbert (magnetic tension) + gf gram-force (force) + gil gill, U.S. (fluid volume) + gil_br gill, British (volume) + gon gon (plane angle) + GPL-U GPL unit (biologic activity of anticardiolipin IgG) + gr grain (mass) + Gy Gray (energy dose) + H Henry (inductance) + h hour (time) + hd hand, international (height of horses) + hnsf-U Hounsfield unit (x-ray attenuation) + HP horsepower (power) + hp_C homeopathic potency of centesimal series (homeopathic potency) + hp_X homeopathic potency of decimal series (homeopathic potency) + HPF high power field (view area in microscope) + Hz Herz (frequency) + in inch, international (length) + in_br inch, British (length) + in_us inch, U.S. (length) + in-H2O inch of water column (pressure) + in-Hg inch of mercury column (pressure) + iU international unit (arbitrary) + J Joule (energy) + K Kelvin (temperature) + ka-U King-Armstrong unit (biologic activity of phosphatase) + kat katal (catalytic activity) + kg{wet-tis} kilogram of wet tissue (mass) + kn knot, international (velocity) + kn_br knot, British (velocity) + knk-U Kunkel unit (arbitrary biologic activity) + Ky Kayser (lineic number) + l liter (volume) + L liter (volume) + lb pound (mass) + lb_ap pound, apothecary (mass) + lb_tr pound, troy (mass) + lbf pound force (force) + lcwt long hunderdweight (mass) + ligne ligne (length) + lk link for Gunter's chain, U.S. (length) + lk_br link for Gunter's chain, British (length) + lm lumen (luminous flux) + Lmb Lambert (brightness) + lne line (length) + LPF low power field (view area in microscope) + lton long ton (mass) + lx lux (illuminance) + ly light-year (length) + m meter (length) + m_e electron mass (mass) + m_p proton mass (mass) + m-H2O meter of water column (pressure) + m-Hg meter of mercury column (pressure) + mclg-U Mac Lagan unit (arbitrary biologic activity) + mesh mesh, international (lineic number) + MET metabolic equivalent (metabolic cost of physical activity) + mg{creat} milligram of creatinine (mass) + mho mho (electric conductance) + mi mile, international (statute mile) (length) + mi_br mile, British (length) + mi_us mile, U.S. (length) + mil mil, international (length) + mil_us mil, U.S. (length) + min minute (time) + min_br minim, British (volume) + min_us minim, U.S. (fluid volume) + mo month (time) + mo_g mean Gregorian month (time) + mo_j mean Julian month (time) + mo_s synodal month (time) + mol mole (amount of substance) + MPL-U MPL unit (biologic activity of anticardiolipin IgM) + mu_0 permeability of vacuum (magnetic permeability) + Mx Maxwell (flux of magnetic induction) + N Newton (force) + nmi nautical mile, international (length) + nmi_br nautical mile, British (length) + Np neper (level) + Oe Oersted (magnetic field intensity) + Ohm Ohm (electric resistance) + osm osmole of dissolved particles (amount of substance) + oz ounce (mass) + oz_ap ounce, apothecary (mass) + oz_tr ounce, troy (mass) + P Poise (dynamic viscosity) + Pa Pascal (pressure) + pc parsec (length) + pc_br pace (length) + pca pica (length) + pca_pr Printer's pica (length) + pH pH (acidity) + ph phot (illuminance) + pi the number pi (number) + pied pied (length) + pk peck, U.S. (dry volume) + pk_br peck, British (volume) + pnt point (length) + pnt_pr Printer's point (length) + pouce pouce (length) + ppb parts per billion (fraction) + ppm parts per million (fraction) + ppth parts per thousand (fraction) + pptr parts per trillion (fraction) + PRU peripheral vascular resistance unit (fluid resistance) + psi pound per square inch (pressure) + pt pint, U.S. (fluid volume) + pt_br pint, British (volume) + pwt_tr pennyweight (mass) + qt quart, U.S. (fluid volume) + qt_br quart, British (volume) + R Roentgen (ion dose) + rad radian (plane angle) + RAD radiation absorbed dose (energy dose) + rch Ramden's chain, U.S. (length) + rd rod, U.S. (length) + rd_br rod, British (length) + REM radiation equivalent man (dose equivalent) + rlk_us link for Ramden's chain (length) + s second (time) + S Siemens (electric conductance) + sb stilb (lum. intensity density) + sc_ap scruple, apothecary (mass) + sct section (area) + scwt short hundredweight (mass) + smgy-U Somogyi unit (biologic activity of amylase) + sph spere (solid angle) + sr streadian (solid angle) + st stere (volume) + St Stokes (kinematic viscosity) + ston short ton (mass) + stone stone (mass) + Sv Sievert (dose equivalent) + Sv-U Svedberg unit (sedimentation coefficient) + T Tesla (magnetic flux density) + t tonne (mass) + tb-U tuberculin unit (biologic activity of tuberculin) + tbs tablespoon, U.S. (volume) + todd-U Todd unit (biologic activity antistreptolysin O) + tsp teaspoon, U.S. (volume) + twp township (area) + u unified atomic mass unit (mass) + U Unit (catalytic activity) + USP-U U.S. Pharmacopeia unit (arbitrary) + V Volt (electric potential) + W Watt (power) + Wb Weber (magnetic flux) + wk week (time) + yd yard, international (length) + yd_br yard, British (length) + yd_us yard, U.S. (length) + +=head1 PREFIXES + +Standard SI prefixes: + + y yocto (10^-24) + z zepto (10^-21) + a atto (10^-18) + f femto (10^-15) + p pico (10^-12) + n nano (10^-9) + u micro (10^-6) + m milli (10^-3) + c centi (10^-2) + d deci (10^-1) + da deka (10) + h hecto (10^2) + k kilo (10^3) + G giga (10^9) + M mega (10^6) + T tera (10^12) + P peta (10^15) + E exa (10^18) + Z zetta (10^21) + Y yotta (10^24) + +Binary power prefixes: + + Ki kibi (2^10) + Mi mebi (2^20) + Gi gibi (2^30) + Ti tebi (2^40) + +=head1 EXAMPLES + +A few examples of combined units strings: + + /cm3 per cubic centimeter + in2 square inches + kg.m/s2 Newtons (N) + m3/kg.s2 units of [G] + 10^100 googols + +=head1 HISTORY + + 2006-12-14 - PH Created + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://aurora.regenstrief.org/UCUM/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::MIE(3pm)|Image::ExifTool::MIE>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/MIFF.pm b/lib/Image/ExifTool/MIFF.pm new file mode 100644 index 0000000..316c57b --- /dev/null +++ b/lib/Image/ExifTool/MIFF.pm @@ -0,0 +1,279 @@ +#------------------------------------------------------------------------------ +# File: MIFF.pm +# +# Description: Read Magick Image File Format meta information +# +# Revisions: 06/10/2005 - P. Harvey Created +# +# References: 1) http://www.imagemagick.org/script/miff.php +# 2) http://www.cs.uni.edu/Help/ImageMagick/www/miff.html +#------------------------------------------------------------------------------ + +package Image::ExifTool::MIFF; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.07'; + +# MIFF chunks +%Image::ExifTool::MIFF::Main = ( + GROUPS => { 2 => 'Image' }, + NOTES => q{ + The MIFF (Magick Image File Format) format allows aribrary tag names to be + used. Only the standard tag names are listed below, however ExifTool will + decode any tags found in the image. + }, + 'background-color' => 'BackgroundColor', + 'blue-primary' => 'BluePrimary', + 'border-color' => 'BorderColor', + 'matt-color' => 'MattColor', + class => 'Class', + colors => 'Colors', + colorspace => 'ColorSpace', + columns => 'ImageWidth', + compression => 'Compression', + delay => 'Delay', + depth => 'Depth', + dispose => 'Dispose', + gamma => 'Gamma', + 'green-primary' => 'GreenPrimary', + id => 'ID', + iterations => 'Iterations', + label => 'Label', + matte => 'Matte', + montage => 'Montage', + packets => 'Packets', + page => 'Page', + # profile tags. Note the SubDirectory is not used by ProcessMIFF(), + # but is inserted for documentation purposes only + 'profile-APP1' => [ + # [this list is just for the sake of the documentation] + { + Name => 'APP1_Profile', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + }, + }, + { + Name => 'APP1_Profile', + SubDirectory => { + TagTable => 'Image::ExifTool::XMP::Main', + }, + }, + ], + 'profile-exif' => { # haven't seen this, but it would make sense - PH + Name => 'EXIF_Profile', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + }, + }, + 'profile-icc' => { + Name => 'ICC_Profile', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + }, + }, + 'profile-iptc' => { + Name => 'IPTC_Profile', + SubDirectory => { + TagTable => 'Image::ExifTool::Photoshop::Main', + }, + }, + 'profile-xmp' => { # haven't seen this, but it would make sense - PH + Name => 'XMP_Profile', + SubDirectory => { + TagTable => 'Image::ExifTool::XMP::Main', + }, + }, + 'red-primary' => 'RedPrimary', + 'rendering-intent' => 'RenderingIntent', + resolution => 'Resolution', + rows => 'ImageHeight', + scene => 'Scene', + signature => 'Signature', + units => 'Units', + 'white-point' => 'WhitePoint', +); + +#------------------------------------------------------------------------------ +# Extract meta information from a MIFF image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid MIFF image +sub ProcessMIFF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $verbose = $$et{OPTIONS}{Verbose}; + my ($hdr, $buff); + + # validate the MIFF file (note: MIFF files _may_ begin with other + # characters, but this starting sequence is strongly suggested.) + return 0 unless $raf->Read($hdr, 14) == 14; + return 0 unless $hdr eq 'id=ImageMagick'; + $et->SetFileType(); # set the FileType tag + + # set end-of-line character sequence to read to end of the TEXT + # section for new-type MIFF files (text ends with Colon+Ctrl-Z) + # Old MIFF files end with Colon+Linefeed, so this will likely + # slurp those entire files, which will be slower, but will work + # OK except that the profile information won't be decoded + local $/ = ":\x1a"; + + my $mode = ''; + my @profiles; + if ($raf->ReadLine($buff)) { + chomp $buff; # remove end-of-line chars + my $tagTablePtr = GetTagTable('Image::ExifTool::MIFF::Main'); + my @entries = split ' ', $buff; + unshift @entries, $hdr; # put the ID back in + my ($tag, $val); + foreach (@entries) { + if ($mode eq 'com') { + $mode = '' if /\}$/; + next; + } elsif (/^\{/) { + $mode = 'com'; # read to the end of the comment + next; + } + if ($mode eq 'val') { + $val .= " $_"; # join back together with a space + next unless /\}$/; + $mode = ''; + $val =~ s/(^\{|\}$)//g; # remove braces + } elsif (/(.+)=(.+)/) { + ($tag, $val) = ($1, $2); + if ($val =~ /^\{/) { + $mode = 'val'; # read to the end of the value data + next; + } + } elsif (/^:/) { + # this could be the end of an old-style MIFF file + last; + } else { + # something we don't recognize -- stop parsing here + $et->Warn('Unrecognized MIFF data'); + last; + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + unless ($tagInfo) { + $tagInfo = { Name => $tag }; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + $verbose and $et->VerboseInfo($tag, $tagInfo, + Table => $tagTablePtr, + DataPt => \$val, + ); + # handle profile tags specially + if ($tag =~ /^profile-(.*)/) { + push @profiles, [$1, $val]; + } else { + $et->FoundTag($tagInfo, $val); + } + } + } + + # process profile information + foreach (@profiles) { + my ($type, $len) = @{$_}; + unless ($len =~ /^\d+$/) { + $et->Warn("Invalid length for $type profile"); + last; # don't try to read the rest + } + unless ($raf->Read($buff, $len) == $len) { + $et->Warn("Error reading $type profile ($len bytes)"); + next; + } + my $processed = 0; + my %dirInfo = ( + Parent => 'PNG', + DataPt => \$buff, + DataPos => $raf->Tell() - $len, + DataLen => $len, + DirStart => 0, + DirLen => $len, + ); + if ($type eq 'icc') { + # ICC Profile information + my $tagTablePtr = GetTagTable('Image::ExifTool::ICC_Profile::Main'); + $processed = $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($type eq 'iptc') { + if ($buff =~ /^8BIM/) { + # Photoshop information + my $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Main'); + $processed = $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + # I haven't seen 'exif' or 'xmp' profile types yet, but I have seen them + # in newer PNG files so presumably they are possible here as well - PH + } elsif ($type eq 'APP1' or $type eq 'exif' or $type eq 'xmp') { + if ($buff =~ /^$Image::ExifTool::exifAPP1hdr/) { + # APP1 EXIF + my $hdrLen = length($Image::ExifTool::exifAPP1hdr); + $dirInfo{DirStart} += $hdrLen; + $dirInfo{DirLen} -= $hdrLen; + # use the usual position for EXIF data: 12 bytes from start of file + # (this may be wrong, but I can't see where the PNG stores this information) + $dirInfo{Base} = 12; # this is the usual value + $processed = $et->ProcessTIFF(\%dirInfo); + } elsif ($buff =~ /^$Image::ExifTool::xmpAPP1hdr/) { + # APP1 XMP + my $hdrLen = length($Image::ExifTool::xmpAPP1hdr); + my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main'); + $dirInfo{DirStart} += $hdrLen; + $dirInfo{DirLen} -= $hdrLen; + $processed = $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + } + unless ($processed) { + $et->Warn("Unknown MIFF $type profile data"); + if ($verbose) { + $et->VerboseDir($type, 0, $len); + $et->VerboseDump(\$buff); + } + } + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::MIFF - Read Magick Image File Format meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to read MIFF +(Magick Image File Format) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.imagemagick.org/script/miff.php> + +=item L<http://www.cs.uni.edu/Help/ImageMagick/www/miff.html> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/MIFF Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/MNG.pm b/lib/Image/ExifTool/MNG.pm new file mode 100644 index 0000000..f7a2b37 --- /dev/null +++ b/lib/Image/ExifTool/MNG.pm @@ -0,0 +1,684 @@ +#------------------------------------------------------------------------------ +# File: MNG.pm +# +# Description: MNG and JNG meta information tags +# +# Revisions: 06/23/2005 - P. Harvey Created +# +# References: 1) http://www.libpng.org/pub/mng/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::MNG; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.00'; + +# MNG chunks +%Image::ExifTool::MNG::Main = ( + GROUPS => { 2 => 'Image' }, + NOTES => q{ + This table contains definitions for tags found in MNG and JNG images. MNG + is a superset of PNG and JNG, so a MNG image may contain any of these tags + as well as any PNG tags. Conversely, only some of these tags are valid for + JNG images. + }, + BACK => { + Name => 'Background', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::Background' }, + }, + BASI => { + Name => 'BasisObject', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::BasisObject' }, + }, + CLIP => { + Name => 'ClipObjects', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::ClipObjects' }, + }, + CLON => { + Name => 'CloneObject', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::CloneObject' }, + }, + DBYK => { + Name => 'DropByKeyword', + Binary => 1, + }, + DEFI => { + Name => 'DefineObject', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::DefineObject' }, + }, + DHDR => { + Name => 'DeltaPNGHeader', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::DeltaPNGHeader' }, + }, + DISC => { + Name => 'DiscardObjects', + ValueConv => 'join(" ",unpack("n*",$val))', + }, + DROP => { + Name => 'DropChunks', + ValueConv => 'join(" ",$val=~/..../g)', + }, +# ENDL + eXPi => { + Name => 'ExportImage', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::ExportImage' }, + }, + fPRI => { + Name => 'FramePriority', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::FramePriority' }, + }, + FRAM => { + Name => 'Frame', + Binary => 1, + }, +# IJNG +# IPNG +# JDAA (JNG) +# JDAT (JNG) + JHDR => { # (JNG) + Name => 'JNGHeader', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::JNGHeader' }, + }, +# JSEP (JNG) + LOOP => { + Name => 'Loop', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::Loop' }, + }, + MAGN => { + Name => 'MagnifyObject', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::MagnifyObject' }, + }, +# MEND + MHDR => { + Name => 'MNGHeader', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::MNGHeader' }, + }, + MOVE => { + Name => 'MoveObjects', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::MoveObjects' }, + }, + nEED => { + Name => 'ResourcesNeeded', + Binary => 1, + }, + ORDR => { + Name => 'OrderingRestrictions', + Binary => 1, + }, + PAST => { + Name => 'PasteImage', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::PasteImage' }, + }, + pHYg => { + Name => 'GlobalPixelSize', + SubDirectory => { TagTable => 'Image::ExifTool::PNG::PhysicalPixel' }, + }, + PPLT => { + Name => 'PartialPalette', + Binary => 1, + }, + PROM => { + Name => 'PromoteParent', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::PromoteParent' }, + }, + SAVE => { + Name => 'SaveObjects', + Binary => 1, + }, + SEEK => { + Name => 'SeekPoint', + ValueConv => '$val=~s/\0.*//s; $val', + }, + SHOW => { + Name => 'ShowObjects', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::ShowObjects' }, + }, + TERM => { + Name => 'TerminationAction', + SubDirectory => { TagTable => 'Image::ExifTool::MNG::TerminationAction' }, + }, +); + +# MNG MHDR chunk +%Image::ExifTool::MNG::MNGHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + FORMAT => 'int32u', + 0 => 'ImageWidth', + 1 => 'ImageHeight', + 2 => 'TicksPerSecond', + 3 => 'NominalLayerCount', + 4 => 'NominalFrameCount', + 5 => 'NominalPlayTime', + 6 => { + Name => 'SimplicityProfile', + PrintConv => 'sprintf("0x%.8x", $val)', + }, +); + +# MNG BASI chunk +%Image::ExifTool::MNG::BasisObject = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'ImageWidth', + Format => 'int32u', + }, + 4 => { + Name => 'ImageHeight', + Format => 'int32u', + }, + 8 => 'BitDepth', + 9 => { + Name => 'ColorType', + RawConv => '$Image::ExifTool::PNG::colorType = $val', + PrintConv => { + 0 => 'Grayscale', + 2 => 'RGB', + 3 => 'Palette', + 4 => 'Grayscale with Alpha', + 6 => 'RGB with Alpha', + }, + }, + 10 => { + Name => 'Compression', + PrintConv => { 0 => 'Deflate/Inflate' }, + }, + 11 => { + Name => 'Filter', + PrintConv => { 0 => 'Adaptive' }, + }, + 12 => { + Name => 'Interlace', + PrintConv => { 0 => 'Noninterlaced', 1 => 'Adam7 Interlace' }, + }, + 13 => { + Name => 'RedSample', + Format => 'int32u', + }, + 17 => { + Name => 'GreenSample', + Format => 'int32u', + }, + 21 => { + Name => 'BlueSample', + Format => 'int32u', + }, + 25 => { + Name => 'AlphaSample', + Format => 'int32u', + }, + 26 => 'Viewable', +); + +# MNG LOOP chunk +%Image::ExifTool::MNG::Loop = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => 'NestLevel', + 1 => { + Name => 'IterationCount', + Format => 'int32u', + }, + 5 => { + Name => 'TerminationCondition', + PrintConv => { + 0 => 'Deterministic, not cacheable', + 1 => 'Decoder discretion, not cacheable', + 2 => 'User discretion, not cacheable', + 3 => 'External signal, not cacheable', + 4 => 'Deterministic, cacheable', + 5 => 'Decoder discretion, cacheable', + 6 => 'User discretion, cacheable', + 7 => 'External signal, cacheable', + }, + }, + 6 => { + Name => 'IterationMinMax', + Format => 'int32u[2]', + }, + 14 => { + Name => 'SignalNumber', + Format => 'int32u', + }, +); + +# MNG DEFI chunk +%Image::ExifTool::MNG::DefineObject = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'ObjectID', + Format => 'int16u', + }, + 2 => 'DoNotShow', + 3 => 'ConcreteFlag', + 4 => { + Name => 'XYLocation', + Format => 'int32u[2]', + }, + 12 => { + Name => 'ClippingBoundary', + Format => 'int32u[4]', + }, +); + +# MNG CLON chunk +%Image::ExifTool::MNG::CloneObject = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'SourceID', + Format => 'int16u', + }, + 2 => { + Name => 'CloneID', + Format => 'int16u', + }, + 4 => { + Name => 'CloneType', + PrintConv => { 0 => 'Full', 1 => 'Parital', 2 => 'Renumber object' }, + }, + 5 => 'DoNotShow', + 6 => 'ConcreteFlag', + 7 => { + Name => 'LocalDeltaType', + PrintConv => { 0 => 'Absolute', 1 => 'Relative' }, + }, + 8 => { + Name => 'DeltaXY', + Format => 'int32u[2]', + }, +); + +# MNG PAST chunk +%Image::ExifTool::MNG::PasteImage = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'DestinationID', + Format => 'int16u', + }, + 2 => { + Name => 'TargetDeltaType', + PrintConv => { 0 => 'Absolute', 1 => 'Relative' }, + }, + 3 => { + Name => 'TargetXY', + Format => 'int32u[2]', + }, + 11 => { + Name => 'SourceID', + Format => 'int16u', + }, + 13 => { + Name => 'CompositionMode', + PrintConv => { 0 => 'Over', 1 => 'Replace', 2 => 'Under' }, + }, + 14 => { + Name => 'Orientation', + PrintConv => { + 0 => 'Same as source', + 2 => 'Flipped left-right, then up-down', + 4 => 'Flipped left-right', + 6 => 'Flipped up-down', + 8 => 'Tiled', + }, + }, + 15 => { + Name => 'OffsetOrigin', + PrintConv => { 0 => 'Desination Origin', 1 => 'Target Origin' }, + }, + 16 => { + Name => 'OffsetXY', + Format => 'int32u[2]', + }, + 24 => { + Name => 'BoundaryOrigin', + PrintConv => { 0 => 'Desination Origin', 1 => 'Target Origin' }, + }, + 25 => { + Name => 'PastClippingBoundary', + Format => 'int32u[4]', + }, +); + +my %magMethod = ( + 0 => 'No Magnification', + 1 => 'Pixel Replication', + 2 => 'Linear Interpolation', + 3 => 'Closest Pixel', + 4 => 'Color Linear Interpolation and Alpha Closest Pixel', + 5 => 'Color Closest Pixel and Alpha Linear Interpolation', +); + +# MNG MAGN chunk +%Image::ExifTool::MNG::MagnifyObject = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'FirstObjectID', + Format => 'int16u', + }, + 2 => { + Name => 'LastObjectID', + Format => 'int16u', + }, + 4 => { + Name => 'XMethod', + PrintConv => \%magMethod, + }, + 5 => { + Name => 'XMag', + Format => 'int16u', + }, + 7 => { + Name => 'YMag', + Format => 'int16u', + }, + 9 => { + Name => 'LeftMag', + Format => 'int16u', + }, + 11 => { + Name => 'RightMag', + Format => 'int16u', + }, + 13 => { + Name => 'TopMag', + Format => 'int16u', + }, + 15 => { + Name => 'BottomMag', + Format => 'int16u', + }, + 17 => { + Name => 'YMethod', + PrintConv => \%magMethod, + }, +); + +# MNG TERM chunk +%Image::ExifTool::MNG::TerminationAction = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'TerminationAction', + PrintConv => { + 0 => 'Show Last Frame', + 1 => 'Display Nothing', + 2 => 'Show First Frame', + 3 => 'Repeat Sequence', + }, + }, + 1 => { + Name => 'IterationEndAction', + PrintConv => { + 0 => 'Show Last Frame', + 1 => 'Display Nothing', + 2 => 'Show First Frame', + }, + }, + 2 => { + Name => 'Delay', + Format => 'int32u', + }, + 6 => { + Name => 'IterationMax', + Format => 'int32u', + }, +); + +# MNG BACK chunk +%Image::ExifTool::MNG::Background = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'BackgroundColor', + Format => 'int16u[3]', + }, + 6 => { + Name => 'MandatoryBackground', + PrintConv => { + 0 => 'Color and Image Advisory', + 1 => 'Color Mandatory, Image Advisory', + 2 => 'Color Advisory, Image Mandatory', + 3 => 'Color and Image Mandatory', + }, + }, + 7 => { + Name => 'BackgroundImageID', + Format => 'int16u', + }, + 9 => { + Name => 'BackgroundTiling', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, +); + +# MNG MOVE chunk +%Image::ExifTool::MNG::MoveObjects = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'FirstObject', + Format => 'int16u', + }, + 2 => { + Name => 'LastObject', + Format => 'int16u', + }, + 4 => { + Name => 'DeltaType', + PrintConv => { 0 => 'Absolute', 1 => 'Relative' }, + }, + 5 => { + Name => 'DeltaXY', + Format => 'int32u[2]', + }, +); + +# MNG CLIP chunk +%Image::ExifTool::MNG::ClipObjects = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'FirstObject', + Format => 'int16u', + }, + 2 => { + Name => 'LastObject', + Format => 'int16u', + }, + 4 => { + Name => 'DeltaType', + PrintConv => { 0 => 'Absolute', 1 => 'Relative' }, + }, + 5 => { + Name => 'ClipBoundary', + Format => 'int32u[4]', + }, +); + +# MNG SHOW chunk +%Image::ExifTool::MNG::ShowObjects = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'FirstObject', + Format => 'int16u', + }, + 2 => { + Name => 'LastObject', + Format => 'int16u', + }, + 4 => 'ShowMode', +); + +# MNG eXPI chunk +%Image::ExifTool::MNG::ExportImage = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'SnapshotID', + Format => 'int16u', + }, + 2 => { + Name => 'SnapshotName', + Format => 'string', + }, +); + +# MNG fPRI chunk +%Image::ExifTool::MNG::FramePriority = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'DeltaType', + PrintConv => { 0 => 'Absolute', 1 => 'Relative' }, + }, + 2 => 'Priority', +); + +# MNG DHDR chunk +%Image::ExifTool::MNG::DeltaPNGHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'ObjectID', + Format => 'int16u', + }, + 2 => { + Name => 'ImageType', + PrintConv => { + 0 => 'Unspecified', + 1 => 'PNG', + 2 => 'JNG', + }, + }, + 3 => { + Name => 'DeltaType', + PrintConv => { + 0 => 'Full Replacement', + 1 => 'Pixel Addition', + 2 => 'Alpha Addition', + 3 => 'Color Addition', + 4 => 'Pixel Replacement', + 5 => 'Alpha Replacement', + 6 => 'Color Replacement', + 7 => 'No Change', + }, + }, + 4 => { + Name => 'BlockSize', + Format => 'int32u[2]', + }, + 12 => { + Name => 'BlockLocation', + Format => 'int32u[2]', + }, +); + +# MNG PROM chunk +%Image::ExifTool::MNG::PromoteParent = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => 'NewColorType', + 1 => 'NewBitDepth', + 2 => { + Name => 'FillMethod', + PrintConv => { 0 => 'Bit Replication', 1 => 'Zero Fill' }, + }, +); + +# JNG JHDR chunk +%Image::ExifTool::MNG::JNGHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'ImageWidth', + Format => 'int32u', + }, + 4 => { + Name => 'ImageHeight', + Format => 'int32u', + }, + 8 => { + Name => 'ColorType', + PrintConv => { + 8 => 'Gray', + 10 => 'Color', + 12 => 'Gray Alpha', + 14 => 'Color Alpha', + }, + }, + 9 => 'BitDepth', + 10 => { + Name => 'Compression', + PrintConv => { 8 => 'Huffman-coded baseline JPEG' }, + }, + 11 => { + Name => 'Interlace', + PrintConv => { 0 => 'Sequential', 8 => 'Progressive' }, + }, + 12 => 'AlphaBitDepth', + 13 => { + Name => 'AlphaCompression', + PrintConv => { + 0 => 'MNG Grayscale IDAT', + 8 => 'JNG 8-bit Grayscale JDAA', + }, + }, + 14 => { + Name => 'AlphaFilter', + PrintConv => { 0 => 'Adaptive MNG (N/A for JPEG)' }, + }, + 15 => { + Name => 'AlphaInterlace', + PrintConv => { 0 => 'Noninterlaced' }, + }, +); + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::MNG - MNG and JNG meta information tags + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read MNG +(Multi-image Network Graphics) and JNG (JPEG Network Graphics) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.libpng.org/pub/mng/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/MNG Tags>, +L<Image::ExifTool::TagNames/PNG Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/MOI.pm b/lib/Image/ExifTool/MOI.pm new file mode 100644 index 0000000..260c453 --- /dev/null +++ b/lib/Image/ExifTool/MOI.pm @@ -0,0 +1,159 @@ +#------------------------------------------------------------------------------ +# File: MOI.pm +# +# Description: Read MOI meta information +# +# Revisions: 2014/12/15 - P. Harvey Created +# +# References: 1) https://en.wikipedia.org/wiki/MOI_(file_format) +#------------------------------------------------------------------------------ + +package Image::ExifTool::MOI; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.02'; + +# MOI tags (ref 1) +%Image::ExifTool::MOI::Main = ( + GROUPS => { 2 => 'Video' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + NOTES => q{ + MOI files store information about associated MOD or TOD files, and are + written by some JVC, Canon and Panasonic camcorders. + }, + 0x00 => { Name => 'MOIVersion', Format => 'string[2]' }, + # 0x02 => { Name => 'MOIFileSize', Format => 'int32u' }, + 0x06 => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Format => 'undef[8]', + Groups => { 2 => 'Time' }, + ValueConv => sub { + my $val = shift; + return undef unless length($val) >= 8; + my @v = unpack('nCCCCn', $val); + $v[5] /= 1000; + return sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%06.3f', @v); + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x0e => { + Name => 'Duration', + Format => 'int32u', + ValueConv => '$val / 1000', + PrintConv => 'ConvertDuration($val)', + }, + 0x80 => { + Name => 'AspectRatio', + Format => 'int8u', + PrintConv => q{ + my $lo = ($val & 0x0f); + my $hi = ($val >> 4); + my $aspect; + if ($lo < 2) { + $aspect = '4:3'; + } elsif ($lo == 4 or $lo == 5) { + $aspect = '16:9'; + } else { + $aspect = 'Unknown'; + } + if ($hi == 4) { + $aspect .= ' NTSC'; + } elsif ($hi == 5) { + $aspect .= ' PAL'; + } + return $aspect; + }, + }, + 0x84 => { + Name => 'AudioCodec', + Format => 'int16u', + Groups => { 2 => 'Audio' }, + PrintHex => 1, + PrintConv => { + 0x00c1 => 'AC3', + 0x4001 => 'MPEG', + }, + }, + 0x86 => { + Name => 'AudioBitrate', + Format => 'int8u', + Groups => { 2 => 'Audio' }, + ValueConv => '$val * 16000 + 48000', + PrintConv => 'ConvertBitrate($val)', + }, + 0xda => { + Name => 'VideoBitrate', + Format => 'int16u', + PrintHex => 1, + ValueConv => { + 0x5896 => '8500000', + 0x813d => '5500000', + }, + PrintConv => 'ConvertBitrate($val)', + }, +); + +#------------------------------------------------------------------------------ +# Validate and extract metadata from MOI file +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid MOI file +sub ProcessMOI($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + # read enough to allow skipping over run-in if it exists + $raf->Read($buff, 256) == 256 and $buff =~ /^V6/ or return 0; + if (defined $$et{VALUE}{FileSize}) { + my $size = unpack('x2N', $buff); + $size == $$et{VALUE}{FileSize} or return 0; + } + $et->SetFileType(); + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::MOI::Main'); + return $et->ProcessBinaryData({ DataPt => \$buff }, $tagTablePtr); +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::MOI - Read MOI meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read meta +information from MOI files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://en.wikipedia.org/wiki/MOI_(file_format)> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/MOI Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/MPC.pm b/lib/Image/ExifTool/MPC.pm new file mode 100644 index 0000000..daeaeca --- /dev/null +++ b/lib/Image/ExifTool/MPC.pm @@ -0,0 +1,156 @@ +#------------------------------------------------------------------------------ +# File: MPC.pm +# +# Description: Read Musepack audio meta information +# +# Revisions: 11/14/2006 - P. Harvey Created +# +# References: 1) http://www.musepack.net/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::MPC; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::FLAC; + +$VERSION = '1.01'; + +# MPC metadata blocks +%Image::ExifTool::MPC::Main = ( + PROCESS_PROC => \&Image::ExifTool::FLAC::ProcessBitStream, + GROUPS => { 2 => 'Audio' }, + NOTES => q{ + Tags used in Musepack (MPC) audio files. ExifTool also extracts ID3 and APE + information from these files. + }, + 'Bit032-063' => 'TotalFrames', + 'Bit080-081' => { + Name => 'SampleRate', + PrintConv => { + 0 => 44100, + 1 => 48000, + 2 => 37800, + 3 => 32000, + }, + }, + 'Bit084-087' => { + Name => 'Quality', + PrintConv => { + 1 => 'Unstable/Experimental', + 5 => '0', + 6 => '1', + 7 => '2 (Telephone)', + 8 => '3 (Thumb)', + 9 => '4 (Radio)', + 10 => '5 (Standard)', + 11 => '6 (Xtreme)', + 12 => '7 (Insane)', + 13 => '8 (BrainDead)', + 14 => '9', + 15 => '10', + }, + }, + 'Bit088-093' => 'MaxBand', + 'Bit096-111' => 'ReplayGainTrackPeak', + 'Bit112-127' => 'ReplayGainTrackGain', + 'Bit128-143' => 'ReplayGainAlbumPeak', + 'Bit144-159' => 'ReplayGainAlbumGain', + 'Bit179' => { + Name => 'FastSeek', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 'Bit191' => { + Name => 'Gapless', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 'Bit216-223' => { + Name => 'EncoderVersion', + PrintConv => '$val =~ s/(\d)(\d)(\d)$/$1.$2.$3/; $val', + }, +); + +#------------------------------------------------------------------------------ +# Extract information from an MPC file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# - Just looks for MPC trailer if FileType is already set +# Returns: 1 on success, 0 if this wasn't a valid MPC file +sub ProcessMPC($$) +{ + my ($et, $dirInfo) = @_; + + # must first check for leading ID3 information + unless ($$et{DoneID3}) { + require Image::ExifTool::ID3; + Image::ExifTool::ID3::ProcessID3($et, $dirInfo) and return 1; + } + my $raf = $$dirInfo{RAF}; + my $buff; + + # check MPC signature + $raf->Read($buff, 32) == 32 and $buff =~ /^MP\+(.)/s or return 0; + my $vers = ord($1) & 0x0f; + $et->SetFileType(); + + # extract audio information (currently only from version 7 MPC files) + if ($vers == 0x07) { + SetByteOrder('II'); + my $pos = $raf->Tell() - 32; + if ($et->Options('Verbose')) { + $et->VPrint(0, "MPC Header (32 bytes):\n"); + $et->VerboseDump(\$buff, DataPos => $pos); + } + my $tagTablePtr = GetTagTable('Image::ExifTool::MPC::Main'); + my %dirInfo = ( DataPt => \$buff, DataPos => $pos ); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } else { + $et->Warn('Audio info currently not extracted from this version MPC file'); + } + + # process APE trailer if it exists + require Image::ExifTool::APE; + Image::ExifTool::APE::ProcessAPE($et, $dirInfo); + + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::MPC - Read Musepack audio meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from Musepack (MPC) audio files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.musepack.net/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/MPC Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/MPEG.pm b/lib/Image/ExifTool/MPEG.pm new file mode 100644 index 0000000..3e209e1 --- /dev/null +++ b/lib/Image/ExifTool/MPEG.pm @@ -0,0 +1,735 @@ +#------------------------------------------------------------------------------ +# File: MPEG.pm +# +# Description: Read MPEG-1 and MPEG-2 meta information +# +# Revisions: 05/11/2006 - P. Harvey Created +# +# References: 1) http://www.mp3-tech.org/ +# 2) http://www.getid3.org/ +# 3) http://dvd.sourceforge.net/dvdinfo/dvdmpeg.html +# 4) http://ffmpeg.org/ +# 5) http://sourceforge.net/projects/mediainfo/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::MPEG; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.16'; + +%Image::ExifTool::MPEG::Audio = ( + GROUPS => { 2 => 'Audio' }, + 'Bit11-12' => { + Name => 'MPEGAudioVersion', + RawConv => '$self->{MPEG_Vers} = $val', + PrintConv => { + 0 => 2.5, + 2 => 2, + 3 => 1, + }, + }, + 'Bit13-14' => { + Name => 'AudioLayer', + RawConv => '$self->{MPEG_Layer} = $val', + PrintConv => { + 1 => 3, + 2 => 2, + 3 => 1, + }, + }, + # Bit 15 indicates CRC protection + 'Bit16-19' => [ + { + Name => 'AudioBitrate', + Condition => '$self->{MPEG_Vers} == 3 and $self->{MPEG_Layer} == 3', + Notes => 'version 1, layer 1', + PrintConvColumns => 3, + ValueConv => { + 0 => 'free', + 1 => 32000, + 2 => 64000, + 3 => 96000, + 4 => 128000, + 5 => 160000, + 6 => 192000, + 7 => 224000, + 8 => 256000, + 9 => 288000, + 10 => 320000, + 11 => 352000, + 12 => 384000, + 13 => 416000, + 14 => 448000, + }, + PrintConv => 'ConvertBitrate($val)', + }, + { + Name => 'AudioBitrate', + Condition => '$self->{MPEG_Vers} == 3 and $self->{MPEG_Layer} == 2', + Notes => 'version 1, layer 2', + PrintConvColumns => 3, + ValueConv => { + 0 => 'free', + 1 => 32000, + 2 => 48000, + 3 => 56000, + 4 => 64000, + 5 => 80000, + 6 => 96000, + 7 => 112000, + 8 => 128000, + 9 => 160000, + 10 => 192000, + 11 => 224000, + 12 => 256000, + 13 => 320000, + 14 => 384000, + }, + PrintConv => 'ConvertBitrate($val)', + }, + { + Name => 'AudioBitrate', + Condition => '$self->{MPEG_Vers} == 3 and $self->{MPEG_Layer} == 1', + Notes => 'version 1, layer 3', + PrintConvColumns => 3, + ValueConv => { + 0 => 'free', + 1 => 32000, + 2 => 40000, + 3 => 48000, + 4 => 56000, + 5 => 64000, + 6 => 80000, + 7 => 96000, + 8 => 112000, + 9 => 128000, + 10 => 160000, + 11 => 192000, + 12 => 224000, + 13 => 256000, + 14 => 320000, + }, + PrintConv => 'ConvertBitrate($val)', + }, + { + Name => 'AudioBitrate', + Condition => '$self->{MPEG_Vers} != 3 and $self->{MPEG_Layer} == 3', + Notes => 'version 2 or 2.5, layer 1', + PrintConvColumns => 3, + ValueConv => { + 0 => 'free', + 1 => 32000, + 2 => 48000, + 3 => 56000, + 4 => 64000, + 5 => 80000, + 6 => 96000, + 7 => 112000, + 8 => 128000, + 9 => 144000, + 10 => 160000, + 11 => 176000, + 12 => 192000, + 13 => 224000, + 14 => 256000, + }, + PrintConv => 'ConvertBitrate($val)', + }, + { + Name => 'AudioBitrate', + Condition => '$self->{MPEG_Vers} != 3 and $self->{MPEG_Layer}', + Notes => 'version 2 or 2.5, layer 2 or 3', + PrintConvColumns => 3, + ValueConv => { + 0 => 'free', + 1 => 8000, + 2 => 16000, + 3 => 24000, + 4 => 32000, + 5 => 40000, + 6 => 48000, + 7 => 56000, + 8 => 64000, + 9 => 80000, + 10 => 96000, + 11 => 112000, + 12 => 128000, + 13 => 144000, + 14 => 160000, + }, + PrintConv => 'ConvertBitrate($val)', + }, + ], + 'Bit20-21' => [ + { + Name => 'SampleRate', + Condition => '$self->{MPEG_Vers} == 3', + Notes => 'version 1', + PrintConv => { + 0 => 44100, + 1 => 48000, + 2 => 32000, + }, + }, + { + Name => 'SampleRate', + Condition => '$self->{MPEG_Vers} == 2', + Notes => 'version 2', + PrintConv => { + 0 => 22050, + 1 => 24000, + 2 => 16000, + }, + }, + { + Name => 'SampleRate', + Condition => '$self->{MPEG_Vers} == 0', + Notes => 'version 2.5', + PrintConv => { + 0 => 11025, + 1 => 12000, + 2 => 8000, + }, + }, + ], + # Bit 22 - padding flag + # Bit 23 - private bit + 'Bit24-25' => { + Name => 'ChannelMode', + RawConv => '$self->{MPEG_Mode} = $val', + PrintConv => { + 0 => 'Stereo', + 1 => 'Joint Stereo', + 2 => 'Dual Channel', + 3 => 'Single Channel', + }, + }, + 'Bit26' => { + Name => 'MSStereo', + Condition => '$self->{MPEG_Layer} == 1', + Notes => 'layer 3', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 'Bit27' => { + Name => 'IntensityStereo', + Condition => '$self->{MPEG_Layer} == 1', + Notes => 'layer 3', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 'Bit26-27' => { + Name => 'ModeExtension', + Condition => '$self->{MPEG_Layer} > 1', + Notes => 'layer 1 or 2', + PrintConv => { + 0 => 'Bands 4-31', + 1 => 'Bands 8-31', + 2 => 'Bands 12-31', + 3 => 'Bands 16-31', + }, + }, + 'Bit28' => { + Name => 'CopyrightFlag', + PrintConv => { + 0 => 'False', + 1 => 'True', + }, + }, + 'Bit29' => { + Name => 'OriginalMedia', + PrintConv => { + 0 => 'False', + 1 => 'True', + }, + }, + 'Bit30-31' => { + Name => 'Emphasis', + PrintConv => { + 0 => 'None', + 1 => '50/15 ms', + 2 => 'reserved', + 3 => 'CCIT J.17', + }, + }, +); + +%Image::ExifTool::MPEG::Video = ( + GROUPS => { 2 => 'Video' }, + 'Bit00-11' => 'ImageWidth', + 'Bit12-23' => 'ImageHeight', + 'Bit24-27' => { + Name => 'AspectRatio', + ValueConv => { + 1 => 1, + 2 => 0.6735, + 3 => 0.7031, + 4 => 0.7615, + 5 => 0.8055, + 6 => 0.8437, + 7 => 0.8935, + 8 => 0.9157, + 9 => 0.9815, + 10 => 1.0255, + 11 => 1.0695, + 12 => 1.0950, + 13 => 1.1575, + 14 => 1.2015, + }, + PrintConv => { + 1 => '1:1', + 0.6735 => '0.6735', + 0.7031 => '16:9, 625 line, PAL', + 0.7615 => '0.7615', + 0.8055 => '0.8055', + 0.8437 => '16:9, 525 line, NTSC', + 0.8935 => '0.8935', + 0.9157 => '4:3, 625 line, PAL, CCIR601', + 0.9815 => '0.9815', + 1.0255 => '1.0255', + 1.0695 => '1.0695', + 1.0950 => '4:3, 525 line, NTSC, CCIR601', + 1.1575 => '1.1575', + 1.2015 => '1.2015', + }, + }, + 'Bit28-31' => { + Name => 'FrameRate', + ValueConv => { + 1 => 23.976, + 2 => 24, + 3 => 25, + 4 => 29.97, + 5 => 30, + 6 => 50, + 7 => 59.94, + 8 => 60, + }, + PrintConv => '"$val fps"', + }, + 'Bit32-49' => { + Name => 'VideoBitrate', + ValueConv => '$val eq 0x3ffff ? "Variable" : $val * 400', + PrintConv => 'ConvertBitrate($val)', + }, + # these tags not very interesting + #'Bit50' => 'MarkerBit', + #'Bit51-60' => 'VBVBufferSize', + #'Bit61' => 'ConstrainedParamFlag', + #'Bit62' => 'IntraQuantMatrixFlag', +); + +%Image::ExifTool::MPEG::Xing = ( + GROUPS => { 2 => 'Audio' }, + VARS => { NO_ID => 1 }, + NOTES => 'These tags are extracted from the Xing/Info frame.', + 1 => { Name => 'VBRFrames' }, + 2 => { Name => 'VBRBytes' }, + 3 => { Name => 'VBRScale' }, + 4 => { Name => 'Encoder' }, + 5 => { Name => 'LameVBRQuality' }, + 6 => { Name => 'LameQuality' }, + 7 => { # (for documentation only) + Name => 'LameHeader', + SubDirectory => { TagTable => 'Image::ExifTool::MPEG::Lame' }, + }, +); + +# Lame header tags (ref 5) +%Image::ExifTool::MPEG::Lame = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + NOTES => 'Tags extracted from Lame 3.90 or later header.', + 9 => { + Name => 'LameMethod', + Mask => 0x0f, + PrintConv => { + 1 => 'CBR', + 2 => 'ABR', + 3 => 'VBR (old/rh)', + 4 => 'VBR (new/mtrh)', + 5 => 'VBR (old/rh)', + 6 => 'VBR', + 8 => 'CBR (2-pass)', + 9 => 'ABR (2-pass)', + }, + }, + 10 => { + Name => 'LameLowPassFilter', + ValueConv => '$val * 100', + PrintConv => '($val / 1000) . " kHz"', + }, + # 19 - EncodingFlags + 20 => { + Name => 'LameBitrate', + ValueConv => '$val * 1000', + PrintConv => 'ConvertBitrate($val)', + }, + 24 => { + Name => 'LameStereoMode', + Mask => 0x1c, + PrintConv => { + 0 => 'Mono', + 1 => 'Stereo', + 2 => 'Dual Channels', + 3 => 'Joint Stereo', + 4 => 'Forced Joint Stereo', + 6 => 'Auto', + 7 => 'Intensity Stereo', + }, + }, +); + +# composite tags +%Image::ExifTool::MPEG::Composite = ( + Duration => { + Groups => { 2 => 'Video' }, + Require => { + 0 => 'FileSize', + }, + Desire => { + 1 => 'ID3Size', + 2 => 'MPEG:AudioBitrate', + 3 => 'MPEG:VideoBitrate', + 4 => 'MPEG:VBRFrames', + 5 => 'MPEG:SampleRate', + 6 => 'MPEG:MPEGAudioVersion', + }, + Priority => -1, # (don't want to replace any other Duration tag) + ValueConv => q{ + if ($val[4] and defined $val[5] and defined $val[6]) { + # calculate from number of VBR audio frames + my $mfs = $prt[5] / ($val[6] == 3 ? 144 : 72); + # calculate using VBR length + return 8 * $val[4] / $mfs; + } + # calculate duration as file size divided by total bitrate + # (note: this is only approximate!) + return undef unless $val[2] or $val[3]; + return undef if $val[2] and not $val[2] =~ /^\d+$/; + return undef if $val[3] and not $val[3] =~ /^\d+$/; + return (8 * ($val[0] - ($val[1]||0))) / (($val[2]||0) + ($val[3]||0)); + }, + PrintConv => 'ConvertDuration($val) . " (approx)"', + }, + AudioBitrate => { + Groups => { 2 => 'Audio' }, + Notes => 'calculated for variable-bitrate MPEG audio', + Require => { + 0 => 'MPEG:MPEGAudioVersion', + 1 => 'MPEG:SampleRate', + 2 => 'MPEG:VBRBytes', + 3 => 'MPEG:VBRFrames', + }, + ValueConv => q{ + return undef unless $val[3]; + my $mfs = $prt[1] / ($val[0] == 3 ? 144 : 72); + return $mfs * $val[2] / $val[3]; + }, + PrintConv => 'ConvertBitrate($val)', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::MPEG'); + + +#------------------------------------------------------------------------------ +# Process information in an MPEG audio or video frame header +# Inputs: 0) ExifTool object ref, 1) tag table ref, 2-N) list of 32-bit data words +sub ProcessFrameHeader($$@) +{ + my ($et, $tagTablePtr, @data) = @_; + my $tag; + foreach $tag (sort keys %$tagTablePtr) { + next unless $tag =~ /^Bit(\d{2})-?(\d{2})?/; + my ($b1, $b2) = ($1, $2 || $1); + my $index = int($b1 / 32); + my $word = $data[$index]; + my $mask = 0; + foreach (0 .. ($b2 - $b1)) { + $mask += (1 << $_); + } + my $val = ($word >> (31 + 32*$index - $b2)) & $mask; + $et->HandleTag($tagTablePtr, $tag, $val); + } +} + +#------------------------------------------------------------------------------ +# Read MPEG audio frame header +# Inputs: 0) ExifTool object reference, 1) Reference to audio data +# 2) flag set if we are trying to recognized MP3 file only +# Returns: 1 on success, 0 if no audio header was found +sub ParseMPEGAudio($$;$) +{ + my ($et, $buffPt, $mp3) = @_; + my ($word, $pos); + my $ext = $$et{FILE_EXT} || ''; + + for (;;) { + # find frame sync + return 0 unless $$buffPt =~ m{(\xff.{3})}sg; + $word = unpack('N', $1); # get audio frame header word + unless (($word & 0xffe00000) == 0xffe00000) { + pos($$buffPt) = pos($$buffPt) - 2; # next possible location for frame sync + next; + } + # validate header as much as possible + if (($word & 0x180000) == 0x080000 or # 01 is a reserved version ID + ($word & 0x060000) == 0x000000 or # 00 is a reserved layer description + ($word & 0x00f000) == 0x000000 or # 0000 is the "free" bitrate index + ($word & 0x00f000) == 0x00f000 or # 1111 is a bad bitrate index + ($word & 0x000c00) == 0x000c00 or # 11 is a reserved sampling frequency + ($word & 0x000003) == 0x000002 or # 10 is a reserved emphasis + (($mp3 and ($word & 0x060000) != 0x020000))) # must be layer 3 for MP3 + { + # give up easily unless this really should be an MP3 file + return 0 unless $ext eq 'MP3'; + pos($$buffPt) = pos($$buffPt) - 1; + next; + } + $pos = pos($$buffPt); + last; + } + # set file type if not done already + $et->SetFileType(); + + my $tagTablePtr = GetTagTable('Image::ExifTool::MPEG::Audio'); + ProcessFrameHeader($et, $tagTablePtr, $word); + + # extract the VBR information (ref MP3::Info) + my ($v, $m) = ($$et{MPEG_Vers}, $$et{MPEG_Mode}); + while (defined $v and defined $m) { + my $len = length $$buffPt; + $pos += $v == 3 ? ($m == 3 ? 17 : 32) : ($m == 3 ? 9 : 17); + last if $pos + 8 > $len; + my $buff = substr($$buffPt, $pos, 8); + last unless $buff =~ /^(Xing|Info)/; + my $xingTable = GetTagTable('Image::ExifTool::MPEG::Xing'); + my $vbrScale; + my $flags = unpack('x4N', $buff); + my $isVBR = ($buff !~ /^Info/); # Info frame is not VBR (ref 5) + $pos += 8; + if ($flags & 0x01) { # VBRFrames + last if $pos + 4 > $len; + $et->HandleTag($xingTable, 1, unpack("x${pos}N", $$buffPt)) if $isVBR; + $pos += 4; + } + if ($flags & 0x02) { # VBRBytes + last if $pos + 4 > $len; + $et->HandleTag($xingTable, 2, unpack("x${pos}N", $$buffPt)) if $isVBR; + $pos += 4; + } + if ($flags & 0x04) { # VBR_TOC + last if $pos + 100 > $len; + # (ignore toc for now) + $pos += 100; + } + if ($flags & 0x08) { # VBRScale + last if $pos + 4 > $len; + $vbrScale = unpack("x${pos}N", $$buffPt); + $et->HandleTag($xingTable, 3, $vbrScale) if $isVBR; + $pos += 4; + } + # process Lame header (ref 5) + if ($flags & 0x10) { # Lame + last if $pos + 348 > $len; + } elsif ($pos + 4 <= $len) { + my $lib = substr($$buffPt, $pos, 4); + unless ($lib eq 'LAME' or $lib eq 'GOGO') { + # attempt to identify other encoders + my $n; + if (index($$buffPt, 'RCA mp3PRO Encoder') >= 0) { + $lib = 'RCA mp3PRO'; + } elsif (($n = index($$buffPt, 'THOMSON mp3PRO Encoder')) >= 0) { + $lib = 'Thomson mp3PRO'; + $n += 22; + $lib .= ' ' . substr($$buffPt, $n, 6) if length($$buffPt) - $n >= 6; + } elsif (index($$buffPt, 'MPGE') >= 0) { + $lib = 'Gogo (<3.0)'; + } else { + last; + } + $et->HandleTag($xingTable, 4, $lib); + last; + } + } + my $lameLen = $len - $pos; + last if $lameLen < 9; + my $enc = substr($$buffPt, $pos, 9); + if ($enc ge 'LAME3.90') { + $et->HandleTag($xingTable, 4, $enc); + if ($vbrScale <= 100) { + $et->HandleTag($xingTable, 5, int((100 - $vbrScale) / 10)); + $et->HandleTag($xingTable, 6, (100 - $vbrScale) % 10); + } + my %dirInfo = ( + DataPt => $buffPt, + DirStart => $pos, + DirLen => length($$buffPt) - $pos, + ); + my $subTablePtr = GetTagTable('Image::ExifTool::MPEG::Lame'); + $et->ProcessDirectory(\%dirInfo, $subTablePtr); + } else { + $et->HandleTag($xingTable, 4, substr($$buffPt, $pos, 20)); + } + last; # (didn't want to loop anyway) + } + + return 1; +} + +#------------------------------------------------------------------------------ +# Read MPEG video frame header +# Inputs: 0) ExifTool object reference, 1) Reference to video data +# Returns: 1 on success, 0 if no video header was found +sub ProcessMPEGVideo($$) +{ + my ($et, $buffPt) = @_; + + return 0 unless length $$buffPt >= 4; + my ($w1, $w2) = unpack('N2', $$buffPt); + # validate as much as possible + if (($w1 & 0x000000f0) == 0x00000000 or # 0000 is a forbidden aspect ratio + ($w1 & 0x000000f0) == 0x000000f0 or # 1111 is a reserved aspect ratio + ($w1 & 0x0000000f) == 0 or # frame rate must be 1-8 + ($w1 & 0x0000000f) > 8) + { + return 0; + } + # set file type if not done already + $et->SetFileType('MPEG') unless $$et{VALUE}{FileType}; + + my $tagTablePtr = GetTagTable('Image::ExifTool::MPEG::Video'); + ProcessFrameHeader($et, $tagTablePtr, $w1, $w2); + return 1; +} + +#------------------------------------------------------------------------------ +# Read MPEG audio and video frame headers +# Inputs: 0) ExifTool object reference, 1) Reference to audio/video data +# Returns: 1 on success, 0 if no video header was found +# To Do: Properly parse MPEG streams: +# 0xb7 - sequence end +# 0xb9 - end code +# 0xba - pack start code +# 0xbb - system header +# 0xbc - program map <-- should parse this +# 0xbd - private stream 1 --> for VOB, this contains sub-streams: +# 0x20-0x3f - pictures +# 0x80-0x87 - audio (AC3,DTS,SDDS) +# 0xa0-0xa7 - audio (LPCM) +# 0xbe - padding +# 0xbf - private stream 2 +# 0xc0-0xdf - audio stream +# 0xe0-0xef - video stream +sub ParseMPEGAudioVideo($$) +{ + my ($et, $buffPt) = @_; + my (%found, $didHdr); + my $rtnVal = 0; + my %proc = ( audio => \&ParseMPEGAudio, video => \&ProcessMPEGVideo ); + + delete $$et{AudioBitrate}; + delete $$et{VideoBitrate}; + + while ($$buffPt =~ /\0\0\x01(\xb3|\xc0)/g) { + my $type = $1 eq "\xb3" ? 'video' : 'audio'; + unless ($didHdr) { + # make sure we didn't miss an audio frame sync before this (eg. MP3 file) + # (the last byte of the 4-byte MP3 audio frame header word may be zero, + # but the 2nd last must be non-zero, so we need only check to pos-3) + my $buff = substr($$buffPt, 0, pos($$buffPt) - 3); + $found{audio} = 1 if ParseMPEGAudio($et, \$buff); + $didHdr = 1; + } + next if $found{$type}; + my $len = length($$buffPt) - pos($$buffPt); + last if $len < 4; + $len > 256 and $len = 256; + my $dat = substr($$buffPt, pos($$buffPt), $len); + # process MPEG audio or video + if (&{$proc{$type}}($et, \$dat)) { + $rtnVal = 1; + $found{$type} = 1; + # done if we found audio and video + last if scalar(keys %found) == 2; + } + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Read information from an MPEG file +# Inputs: 0) ExifTool object reference, 1) Directory information reference +# Returns: 1 on success, 0 if this wasn't a valid MPEG file +sub ProcessMPEG($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + + $raf->Read($buff, 4) == 4 or return 0; + return 0 unless $buff =~ /^\0\0\x01[\xb0-\xbf]/; + $et->SetFileType(); + + $raf->Seek(0,0); + $raf->Read($buff, 65536*4) or return 0; + + return ParseMPEGAudioVideo($et, \$buff); +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::MPEG - Read MPEG-1 and MPEG-2 meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read MPEG-1 +and MPEG-2 audio/video files. + +=head1 NOTES + +Since ISO charges money for the official MPEG specification, this module is +based on unofficial sources which may be incomplete, inaccurate or outdated. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.mp3-tech.org/> + +=item L<http://www.getid3.org/> + +=item L<http://dvd.sourceforge.net/dvdinfo/dvdmpeg.html> + +=item L<http://ffmpeg.org/> + +=item L<http://sourceforge.net/projects/mediainfo/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/MPEG Tags>, +L<MP3::Info(3pm)|MP3::Info>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/MPF.pm b/lib/Image/ExifTool/MPF.pm new file mode 100644 index 0000000..50d36ae --- /dev/null +++ b/lib/Image/ExifTool/MPF.pm @@ -0,0 +1,288 @@ +#------------------------------------------------------------------------------ +# File: MPF.pm +# +# Description: Read Multi-Picture Format information +# +# Revisions: 06/12/2009 - P. Harvey Created +# +# References: 1) http://www.cipa.jp/std/documents/e/DC-007_E.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::MPF; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.14'; + +sub ProcessMPImageList($$$); + +# Tags found in APP2 MPF segment in JPEG images +%Image::ExifTool::MPF::Main = ( + GROUPS => { 0 => 'MPF', 1 => 'MPF0', 2 => 'Image'}, + NOTES => q{ + These tags are part of the CIPA Multi-Picture Format specification, and are + found in the APP2 "MPF" segment of JPEG images. MPImage data referenced + from this segment is stored as a JPEG trailer. The MPF tags are not + writable, however the MPF segment may be deleted as a group (with "MPF:All") + but then the JPEG trailer should also be deleted (with "Trailer:All"). See + L<https://web.archive.org/web/20190713230858/http://www.cipa.jp/std/documents/e/DC-007_E.pdf> + for the official specification. + }, + 0xb000 => 'MPFVersion', + 0xb001 => 'NumberOfImages', + 0xb002 => { + Name => 'MPImageList', + SubDirectory => { + TagTable => 'Image::ExifTool::MPF::MPImage', + ProcessProc => \&ProcessMPImageList, + }, + }, + 0xb003 => { + Name => 'ImageUIDList', + Binary => 1, + }, + 0xb004 => 'TotalFrames', + 0xb101 => 'MPIndividualNum', + 0xb201 => { + Name => 'PanOrientation', + PrintHex => 1, + Notes => 'long integer is split into 4 bytes', + ValueConv => 'join(" ",unpack("C*",pack("N",$val)))', + PrintConv => [ + '"$val rows"', + '"$val columns"', + { + 0 => '[unused]', + 1 => 'Start at top right', + 2 => 'Start at top left', + 3 => 'Start at bottom left', + 4 => 'Start at bottom right', + }, + { + 0x01 => 'Left to right', + 0x02 => 'Right to left', + 0x03 => 'Top to bottom', + 0x04 => 'Bottom to top', + 0x10 => 'Clockwise', + 0x20 => 'Counter clockwise', + 0x30 => 'Zigzag (row start)', + 0x40 => 'Zigzag (column start)', + }, + ], + }, + 0xb202 => 'PanOverlapH', + 0xb203 => 'PanOverlapV', + 0xb204 => 'BaseViewpointNum', + 0xb205 => 'ConvergenceAngle', + 0xb206 => 'BaselineLength', + 0xb207 => 'VerticalDivergence', + 0xb208 => 'AxisDistanceX', + 0xb209 => 'AxisDistanceY', + 0xb20a => 'AxisDistanceZ', + 0xb20b => 'YawAngle', + 0xb20c => 'PitchAngle', + 0xb20d => 'RollAngle', +); + +# Tags found in MPImage structure +%Image::ExifTool::MPF::MPImage = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + #WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + #CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + #WRITABLE => 1, + GROUPS => { 0 => 'MPF', 1 => 'MPImage', 2 => 'Image'}, + NOTES => q{ + The first MPF "Large Thumbnail" image is extracted as PreviewImage, and the + rest of the embedded MPF images are extracted as MPImage#. The + L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> (-ee) option may be used to extract information from these + embedded images. + }, + 0.1 => { + Name => 'MPImageFlags', + Format => 'int32u', + Mask => 0xf8000000, + PrintConv => { BITMASK => { + 2 => 'Representative image', + 3 => 'Dependent child image', + 4 => 'Dependent parent image', + }}, + }, + 0.2 => { + Name => 'MPImageFormat', + Format => 'int32u', + Mask => 0x07000000, + PrintConv => { + 0 => 'JPEG', + }, + }, + 0.3 => { + Name => 'MPImageType', + Format => 'int32u', + Mask => 0x00ffffff, + PrintHex => 1, + PrintConv => { + 0x000000 => 'Undefined', + 0x010001 => 'Large Thumbnail (VGA equivalent)', + 0x010002 => 'Large Thumbnail (full HD equivalent)', + 0x020001 => 'Multi-frame Panorama', + 0x020002 => 'Multi-frame Disparity', + 0x020003 => 'Multi-angle', + 0x030000 => 'Baseline MP Primary Image', + }, + }, + 4 => { + Name => 'MPImageLength', + Format => 'int32u', + }, + 8 => { + Name => 'MPImageStart', + Format => 'int32u', + IsOffset => '$val', + }, + 12 => { + Name => 'DependentImage1EntryNumber', + Format => 'int16u', + }, + 14 => { + Name => 'DependentImage2EntryNumber', + Format => 'int16u', + }, +); + +# extract MP Images as composite tags +%Image::ExifTool::MPF::Composite = ( + GROUPS => { 2 => 'Preview' }, + MPImage => { + Require => { + 0 => 'MPImageStart', + 1 => 'MPImageLength', + 2 => 'MPImageType', + }, + Notes => q{ + the first MPF "Large Thumbnail" is extracted as PreviewImage, and the rest + of the embedded MPF images are extracted as MPImage#. The L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> + option may be used to extract information from these embedded images. + }, + # extract all MPF images (not just one) + RawConv => q{ + require Image::ExifTool::MPF; + @grps = $self->GetGroup($$val{0}); # set groups from input tag + Image::ExifTool::MPF::ExtractMPImages($self); + }, + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::MPF'); + +#------------------------------------------------------------------------------ +# Extract all MP images +# Inputs: 0) ExifTool object ref +# Returns: undef +sub ExtractMPImages($) +{ + my $et = shift; + my $ee = $et->Options('ExtractEmbedded'); + my $saveBinary = $et->Options('Binary'); + my ($i, $didPreview, $xtra); + + for ($i=1; $xtra or not defined $xtra; ++$i) { + # run through MP images in the same order they were extracted + $xtra = defined $$et{VALUE}{"MPImageStart ($i)"} ? " ($i)" : ''; + my $off = $et->GetValue("MPImageStart$xtra", 'ValueConv'); + my $len = $et->GetValue("MPImageLength$xtra", 'ValueConv'); + if ($off and $len) { + my $type = $et->GetValue("MPImageType$xtra", 'ValueConv'); + my $tag = "MPImage$i"; + # store first "Large Thumbnail" as a PreviewImage + if (not $didPreview and $type and ($type & 0x0f0000) == 0x010000) { + $tag = 'PreviewImage'; + $didPreview = 1; + } + $et->Options('Binary', 1) if $ee; + my $val = Image::ExifTool::Exif::ExtractImage($et, $off, $len, $tag); + $et->Options('Binary', $saveBinary) if $ee; + next unless defined $val; + unless ($Image::ExifTool::Extra{$tag}) { + AddTagToTable(\%Image::ExifTool::Extra, $tag, { + Name => $tag, + Groups => { 0 => 'Composite', 1 => 'Composite', 2 => 'Preview'}, + }); + } + my $key = $et->FoundTag($tag, $val, $et->GetGroup("MPImageStart$xtra")); + # extract information from MP images if ExtractEmbedded option used + if ($ee) { + my $oldBase = $$et{BASE}; + $$et{BASE} = $off; + $$et{DOC_NUM} = $i; + $et->ExtractInfo($val, { ReEntry => 1 }); + delete $$et{DOC_NUM}; + $$et{BASE} = $oldBase; + } + } + } + return undef; +} + +#------------------------------------------------------------------------------ +# Process MP Entry list +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessMPImageList($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $num = int($$dirInfo{DirLen} / 16); # (16 bytes per MP Entry) + $$dirInfo{DirLen} = 16; + my ($i, $success); + my $oldG1 = $$et{SET_GROUP1}; + for ($i=0; $i<$num; ++$i) { + $$et{SET_GROUP1} = '+' . ($i + 1); + $success = $et->ProcessBinaryData($dirInfo, $tagTablePtr); + $$dirInfo{DirStart} += 16; + } + $$et{SET_GROUP1} = $oldG1; + return $success; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::MPF - Read Multi-Picture Format information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains tag definitions and routines to read Multi-Picture +Format (MPF) information from JPEG images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.cipa.jp/std/documents/e/DC-007_E.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/MPF Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/MRC.pm b/lib/Image/ExifTool/MRC.pm new file mode 100644 index 0000000..8fde743 --- /dev/null +++ b/lib/Image/ExifTool/MRC.pm @@ -0,0 +1,341 @@ +#------------------------------------------------------------------------------ +# File: MRC.pm +# +# Description: Read MRC (Medical Research Council) image files +# +# Revisions: 2021-04-21 - P. Harvey Created +# +# References: 1) https://www.ccpem.ac.uk/mrc_format/mrc2014.php +# 2) http://legacy.ccp4.ac.uk/html/library.html +# 3) https://github.com/ccpem/mrcfile/blob/master/mrcfile/dtypes.py +# +# Notes: The header is basically identical to the older CCP4 file format +#------------------------------------------------------------------------------ + +package Image::ExifTool::MRC; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.00'; + +my %bool = ( + Format => 'int8u', + PrintConv => { 0 => 'No', 1 => 'Yes' } +); + +%Image::ExifTool::MRC::Main = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + VARS => { NO_LOOKUP => 1 }, # omit tags from lookup + FORMAT => 'int32u', + NOTES => q{ + Tags extracted from Medical Research Council (MRC) format imaging files. + See L<https://www.ccpem.ac.uk/mrc_format/mrc2014.php> for the specification. + }, + 0 => 'ImageWidth', + 1 => 'ImageHeight', + 2 => { + Name => 'ImageDepth', + Notes => q{ + number of sections. Use ExtractEmbedded option to extract metadata for all + sections + }, + RawConv => '$$self{ImageDepth} = $val', + }, + 3 => { + Name => 'ImageMode', + PrintConv => { + 0 => '8-bit signed integer', + 1 => '16-bit signed integer', + 2 => '32-bit signed real', + 3 => 'complex 16-bit integer', + 4 => 'complex 32-bit real', + 6 => '16-bit unsigned integer', + }, + }, + 4 => { Name => 'StartPoint', Format => 'int32u[3]' }, + 7 => { Name => 'GridSize', Format => 'int32u[3]' }, + 10 => { Name => 'CellWidth', Format => 'float', Notes => 'cell size in angstroms' }, + 11 => { Name => 'CellHeight',Format => 'float' }, + 12 => { Name => 'CellDepth', Format => 'float' }, + 13 => { Name => 'CellAlpha', Format => 'float' }, + 14 => { Name => 'CellBeta', Format => 'float' }, + 15 => { Name => 'CellGamma', Format => 'float' }, + 16 => { Name => 'ImageWidthAxis', PrintConv => { 1 => 'X', 2 => 'Y', 3 => 'Z' } }, + 17 => { Name => 'ImageHeightAxis', PrintConv => { 1 => 'X', 2 => 'Y', 3 => 'Z' } }, + 18 => { Name => 'ImageDepthAxis', PrintConv => { 1 => 'X', 2 => 'Y', 3 => 'Z' } }, + 19 => { Name => 'DensityMin', Format => 'float' }, + 20 => { Name => 'DensityMax', Format => 'float' }, + 21 => { Name => 'DensityMean',Format => 'float' }, + 22 => 'SpaceGroupNumber', + 23 => { Name => 'ExtendedHeaderSize', RawConv => '$$self{ExtendedHeaderSize} = $val' }, + 26 => { Name => 'ExtendedHeaderType', Format => 'string[4]', RawConv => '$$self{ExtendedHeaderType} = $val' }, + 27 => 'MRCVersion', + 49 => { Name => 'Origin', Format => 'float[3]' }, + 53 => { Name => 'MachineStamp', Format => 'int8u[4]', PrintConv => 'sprintf("0x%.2x 0x%.2x 0x%.2x 0x%.2x",split " ", $val)' }, + 54 => { Name => 'RMSDeviation', Format => 'float' }, + 55 => { Name => 'NumberOfLabels', RawConv => '$$self{NLab} = $val' }, + 56 => { Name => 'Label0', Format => 'string[80]', Condition => '$$self{NLab} > 0' }, + 76 => { Name => 'Label1', Format => 'string[80]', Condition => '$$self{NLab} > 1' }, + 96 => { Name => 'Label2', Format => 'string[80]', Condition => '$$self{NLab} > 2' }, + 116 => { Name => 'Label3', Format => 'string[80]', Condition => '$$self{NLab} > 3' }, + 136 => { Name => 'Label4', Format => 'string[80]', Condition => '$$self{NLab} > 4' }, + 156 => { Name => 'Label5', Format => 'string[80]', Condition => '$$self{NLab} > 5' }, + 176 => { Name => 'Label6', Format => 'string[80]', Condition => '$$self{NLab} > 6' }, + 196 => { Name => 'Label7', Format => 'string[80]', Condition => '$$self{NLab} > 7' }, + 216 => { Name => 'Label8', Format => 'string[80]', Condition => '$$self{NLab} > 8' }, + 236 => { Name => 'Label9', Format => 'string[80]', Condition => '$$self{NLab} > 9' }, +); + +%Image::ExifTool::MRC::FEI12 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + VARS => { NO_LOOKUP => 1 }, # omit tags from lookup (way too many!) + NOTES => 'Tags extracted from FEI1 and FEI2 extended headers.', + 0 => { Name => 'MetadataSize', Format => 'int32u', RawConv => '$$self{MetadataSize} = $val' }, + 4 => { Name => 'MetadataVersion', Format => 'int32u' }, + 8 => { + Name => 'Bitmask1', + Format => 'int32u', + RawConv => '$$self{BitM} = $val', + PrintConv => 'sprintf("0x%.8x", $val)', + }, + 12 => { + Name => 'TimeStamp', + Format => 'double', + Condition => '$$self{BitM} & 0x01', + Groups => { 2 => 'Time'}, + # shift from days since Dec 30, 1899 to Unix epoch of Jan 1, 1970 + # (my sample looks like local time, although it should be UTC) + ValueConv => 'ConvertUnixTime(($val-25569)*24*3600)', + PrintConv => '$self->ConvertDateTime($val)', + }, + 20 => { Name => 'MicroscopeType', Format => 'string[16]', Condition => '$$self{BitM} & 0x02' }, + 36 => { Name => 'MicroscopeID', Format => 'string[16]', Condition => '$$self{BitM} & 0x04' }, + 52 => { Name => 'Application', Format => 'string[16]', Condition => '$$self{BitM} & 0x08' }, + 68 => { Name => 'AppVersion', Format => 'string[16]', Condition => '$$self{BitM} & 0x10' }, + 84 => { Name => 'HighTension', Format => 'double', Condition => '$$self{BitM} & 0x20', Notes => 'volts' }, + 92 => { Name => 'Dose', Format => 'double', Condition => '$$self{BitM} & 0x40', Notes => 'electrons/m2' }, + 100 => { Name => 'AlphaTilt', Format => 'double', Condition => '$$self{BitM} & 0x80' }, + 108 => { Name => 'BetaTilt', Format => 'double', Condition => '$$self{BitM} & 0x100' }, + 116 => { Name => 'XStage', Format => 'double', Condition => '$$self{BitM} & 0x200' }, + 124 => { Name => 'YStage', Format => 'double', Condition => '$$self{BitM} & 0x400' }, + 132 => { Name => 'ZStage', Format => 'double', Condition => '$$self{BitM} & 0x800' }, + 140 => { Name => 'TiltAxisAngle', Format => 'double', Condition => '$$self{BitM} & 0x1000' }, + 148 => { Name => 'DualAxisRot', Format => 'double', Condition => '$$self{BitM} & 0x2000' }, + 156 => { Name => 'PixelSizeX', Format => 'double', Condition => '$$self{BitM} & 0x4000' }, + 164 => { Name => 'PixelSizeY', Format => 'double', Condition => '$$self{BitM} & 0x8000' }, + 220 => { Name => 'Defocus', Format => 'double', Condition => '$$self{BitM} & 0x400000' }, + 228 => { Name => 'STEMDefocus', Format => 'double', Condition => '$$self{BitM} & 0x800000' }, + 236 => { Name => 'AppliedDefocus', Format => 'double', Condition => '$$self{BitM} & 0x1000000' }, + 244 => { Name => 'InstrumentMode', Format => 'int32u', Condition => '$$self{BitM} & 0x2000000', PrintConv => { 1 => 'TEM', 2 => 'STEM' } }, + 248 => { Name => 'ProjectionMode', Format => 'int32u', Condition => '$$self{BitM} & 0x4000000', PrintConv => { 1 => 'Diffraction', 2 => 'Imaging' } }, + 252 => { Name => 'ObjectiveLens', Format => 'string[16]', Condition => '$$self{BitM} & 0x8000000' }, + 268 => { Name => 'HighMagnificationMode', Format => 'string[16]', Condition => '$$self{BitM} & 0x10000000' }, + 284 => { Name => 'ProbeMode', Format => 'int32u', Condition => '$$self{BitM} & 0x20000000', PrintConv => { 1 => 'Nano', 2 => 'Micro' } }, + 288 => { Name => 'EFTEMOn', %bool, Condition => '$$self{BitM} & 0x40000000' }, + 289 => { Name => 'Magnification', Format => 'double', Condition => '$$self{BitM} & 0x80000000' }, + 297 => { + Name => 'Bitmask2', + Format => 'int32u', + RawConv => '$$self{BitM} = $val', + PrintConv => 'sprintf("0x%.8x", $val)', + }, + 301 => { Name => 'CameraLength', Format => 'double', Condition => '$$self{BitM} & 0x01' }, + 309 => { Name => 'SpotIndex', Format => 'int32u', Condition => '$$self{BitM} & 0x02' }, + 313 => { Name => 'IlluminationArea',Format => 'double', Condition => '$$self{BitM} & 0x04' }, + 321 => { Name => 'Intensity', Format => 'double', Condition => '$$self{BitM} & 0x08' }, + 329 => { Name => 'ConvergenceAngle',Format => 'double', Condition => '$$self{BitM} & 0x10' }, + 337 => { Name => 'IlluminationMode',Format => 'string[16]', Condition => '$$self{BitM} & 0x20' }, + 353 => { Name => 'WideConvergenceAngleRange', %bool, Condition => '$$self{BitM} & 0x40' }, + 354 => { Name => 'SlitInserted', %bool, Condition => '$$self{BitM} & 0x80' }, + 355 => { Name => 'SlitWidth', Format => 'double', Condition => '$$self{BitM} & 0x100' }, + 363 => { Name => 'AccelVoltOffset', Format => 'double', Condition => '$$self{BitM} & 0x200' }, + 371 => { Name => 'DriftTubeVolt', Format => 'double', Condition => '$$self{BitM} & 0x400' }, + 379 => { Name => 'EnergyShift', Format => 'double', Condition => '$$self{BitM} & 0x800' }, + 387 => { Name => 'ShiftOffsetX', Format => 'double', Condition => '$$self{BitM} & 0x1000' }, + 395 => { Name => 'ShiftOffsetY', Format => 'double', Condition => '$$self{BitM} & 0x2000' }, + 403 => { Name => 'ShiftX', Format => 'double', Condition => '$$self{BitM} & 0x4000' }, + 411 => { Name => 'ShiftY', Format => 'double', Condition => '$$self{BitM} & 0x8000' }, + 419 => { Name => 'IntegrationTime', Format => 'double', Condition => '$$self{BitM} & 0x10000' }, + 427 => { Name => 'BinningWidth', Format => 'int32u', Condition => '$$self{BitM} & 0x20000' }, + 431 => { Name => 'BinningHeight', Format => 'int32u', Condition => '$$self{BitM} & 0x40000' }, + 435 => { Name => 'CameraName', Format => 'string[16]', Condition => '$$self{BitM} & 0x80000' }, + 451 => { Name => 'ReadoutAreaLeft', Format => 'int32u', Condition => '$$self{BitM} & 0x100000' }, + 455 => { Name => 'ReadoutAreaTop', Format => 'int32u', Condition => '$$self{BitM} & 0x200000' }, + 459 => { Name => 'ReadoutAreaRight',Format => 'int32u', Condition => '$$self{BitM} & 0x400000' }, + 463 => { Name => 'ReadoutAreaBottom',Format=> 'int32u', Condition => '$$self{BitM} & 0x800000' }, + 467 => { Name => 'CetaNoiseReduct', %bool, Condition => '$$self{BitM} & 0x1000000' }, + 468 => { Name => 'CetaFramesSummed',Format => 'int32u', Condition => '$$self{BitM} & 0x2000000' }, + 472 => { Name => 'DirectDetElectronCounting', %bool, Condition => '$$self{BitM} & 0x4000000' }, + 473 => { Name => 'DirectDetAlignFrames', %bool, Condition => '$$self{BitM} & 0x8000000' }, + 490 => { + Name => 'Bitmask3', + Format => 'int32u', + RawConv => '$$self{BitM} = $val', + PrintConv => 'sprintf("0x%.8x", $val)', + }, + 518 => { Name => 'PhasePlate', %bool, Condition => '$$self{BitM} & 0x40' }, + 519 => { Name => 'STEMDetectorName',Format => 'string[16]', Condition => '$$self{BitM} & 0x80' }, + 535 => { Name => 'Gain', Format => 'double', Condition => '$$self{BitM} & 0x100' }, + 543 => { Name => 'Offset', Format => 'double', Condition => '$$self{BitM} & 0x200' }, + 571 => { Name => 'DwellTime', Format => 'double', Condition => '$$self{BitM} & 0x8000' }, + 579 => { Name => 'FrameTime', Format => 'double', Condition => '$$self{BitM} & 0x10000' }, + 587 => { Name => 'ScanSizeLeft', Format => 'int32u', Condition => '$$self{BitM} & 0x20000' }, + 591 => { Name => 'ScanSizeTop', Format => 'int32u', Condition => '$$self{BitM} & 0x40000' }, + 595 => { Name => 'ScanSizeRight', Format => 'int32u', Condition => '$$self{BitM} & 0x80000' }, + 599 => { Name => 'ScanSizeBottom', Format => 'int32u', Condition => '$$self{BitM} & 0x100000' }, + 603 => { Name => 'FullScanFOV_X', Format => 'double', Condition => '$$self{BitM} & 0x200000' }, + 611 => { Name => 'FullScanFOV_Y', Format => 'double', Condition => '$$self{BitM} & 0x400000' }, + 619 => { Name => 'Element', Format => 'string[16]', Condition => '$$self{BitM} & 0x800000' }, + 635 => { Name => 'EnergyIntervalLower', Format => 'double', Condition => '$$self{BitM} & 0x1000000' }, + 643 => { Name => 'EnergyIntervalHigher',Format => 'double', Condition => '$$self{BitM} & 0x2000000' }, + 651 => { Name => 'Method', Format=> 'int32u', Condition => '$$self{BitM} & 0x4000000' }, + 655 => { Name => 'IsDoseFraction', %bool, Condition => '$$self{BitM} & 0x8000000' }, + 656 => { Name => 'FractionNumber', Format => 'int32u', Condition => '$$self{BitM} & 0x10000000' }, + 660 => { Name => 'StartFrame', Format => 'int32u', Condition => '$$self{BitM} & 0x20000000' }, + 664 => { Name => 'EndFrame', Format => 'int32u', Condition => '$$self{BitM} & 0x40000000' }, + 668 => { Name =>'InputStackFilename',Format=> 'string[80]', Condition => '$$self{BitM} & 0x80000000' }, + 748 => { + Name => 'Bitmask4', + Format => 'int32u', + RawConv => '$$self{BitM} = $val', + PrintConv => 'sprintf("0x%.8x", $val)', + }, + 752 => { Name => 'AlphaTiltMin', Format => 'double', Condition => '$$self{BitM} & 0x01' }, + 760 => { Name => 'AlphaTiltMax', Format => 'double', Condition => '$$self{BitM} & 0x02' }, +# +# FEI2 header starts here +# + 768 => { Name => 'ScanRotation', Format => 'double', Condition => '$$self{BitM} & 0x04' }, + 776 => { Name => 'DiffractionPatternRotation',Format=>'double', Condition => '$$self{BitM} & 0x08' }, + 784 => { Name => 'ImageRotation', Format => 'double', Condition => '$$self{BitM} & 0x10' }, + 792 => { Name => 'ScanModeEnumeration',Format => 'int32u', Condition => '$$self{BitM} & 0x20', PrintConv => { 0 => 'Other', 1 => 'Raster', 2 => 'Serpentine' } }, + 796 => { + Name => 'AcquisitionTimeStamp', + Format => 'int64u', + Condition => '$$self{BitM} & 0x40', + Groups => { 2 => 'Time' }, + # microseconds since 1970 UTC + ValueConv => 'ConvertUnixTime($val / 1e6, 1, 6)', + PrintConv => '$self->ConvertDateTime($val)', + }, + 804 => { Name => 'DetectorCommercialName', Format => 'string[16]', Condition => '$$self{BitM} & 0x80' }, + 820 => { Name => 'StartTiltAngle', Format => 'double', Condition => '$$self{BitM} & 0x100' }, + 828 => { Name => 'EndTiltAngle', Format => 'double', Condition => '$$self{BitM} & 0x200' }, + 836 => { Name => 'TiltPerImage', Format => 'double', Condition => '$$self{BitM} & 0x400' }, + 844 => { Name => 'TitlSpeed', Format => 'double', Condition => '$$self{BitM} & 0x800' }, + 852 => { Name => 'BeamCenterX', Format => 'int32u', Condition => '$$self{BitM} & 0x1000' }, + 856 => { Name => 'BeamCenterY', Format => 'int32u', Condition => '$$self{BitM} & 0x2000' }, + 860 => { + Name => 'CFEGFlashTimeStamp', + Format => 'int64u', + Condition => '$$self{BitM} & 0x4000', + Groups => { 2 => 'Time' }, + ValueConv => 'ConvertUnixTime($val / 1e6, 1, 6)', + PrintConv => '$self->ConvertDateTime($val)', + }, + 868 => { Name => 'PhasePlatePosition',Format => 'int32u', Condition => '$$self{BitM} & 0x8000' }, + 872 => { Name => 'ObjectiveAperture', Format=>'string[16]',Condition => '$$self{BitM} & 0x10000' }, +); + +#------------------------------------------------------------------------------ +# Extract metadata from a MRC image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid MRC file +sub ProcessMRC($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $tagTablePtr, $i); + + # verify this is a valid MRC file + return 0 unless $raf->Read($buff, 1024) == 1024; + # validate axes, "MAP" file type and machine stamp + return 0 unless $buff =~ /^.{64}[\x01\x02\x03]\0\0\0[\x01\x02\x03]\0\0\0[\x01\x02\x03]\0\0\0.{132}MAP[\0 ](\x44\x44|\x44\x41|\x11\x11)\0\0/s; + + $et->SetFileType(); + SetByteOrder('II'); + my %dirInfo = ( + DataPt => \$buff, + DirStart => 0, + DirLen => length($buff), + ); + $tagTablePtr = GetTagTable('Image::ExifTool::MRC::Main'); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + + # (I don't have any samples with extended headers for testing, so these are not yet decoded) + if ($$et{ExtendedHeaderSize} and $$et{ExtendedHeaderType} =~ /^FEI[12]/) { + unless ($raf->Read($buff,4)==4 and $raf->Seek(-4,1)) { # read metadata size + $et->Warn('Error reading extended header'); + return 1; + } + my $size = Get32u(\$buff, 0); + if ($size * $$et{ImageDepth} > $$et{ExtendedHeaderSize}) { + $et->Warn('Corrupted extended header'); + return 1; + } + $dirInfo{DirLen} = $size; + $tagTablePtr = GetTagTable('Image::ExifTool::MRC::FEI12'); + for ($i=0; ;) { + $dirInfo{DataPos} = $raf->Tell(); + $raf->Read($buff, $size) == $size or $et->Warn("Error reading extended header $i"), last; + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + last if ++$i >= $$et{ImageDepth}; + unless ($$et{OPTIONS}{ExtractEmbedded}) { + $et->Warn('Use the ExtractEmbedded option to read metadata for all frames',3); + last; + } + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + } + delete $$et{DOC_NUM}; + } + + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::MRC - Read MRC meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read +metadata from Medical Research Council (MRC) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://www.ccpem.ac.uk/mrc_format/mrc2014.php> + +=item L<http://legacy.ccp4.ac.uk/html/library.html> + +=item L<https://github.com/ccpem/mrcfile/blob/master/mrcfile/dtypes.py> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/MRC Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/MWG.pm b/lib/Image/ExifTool/MWG.pm new file mode 100644 index 0000000..3d7be22 --- /dev/null +++ b/lib/Image/ExifTool/MWG.pm @@ -0,0 +1,777 @@ +#------------------------------------------------------------------------------ +# File: MWG.pm +# +# Description: Metadata Working Group support +# +# Revisions: 2009/10/21 - P. Harvey Created +# +# References: 1) http://www.metadataworkinggroup.org/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::MWG; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::XMP; + +$VERSION = '1.24'; + +sub RecoverTruncatedIPTC($$$); +sub ListToString($); +sub StringToList($$); +sub OverwriteStringList($$$$); + +my $mwgLoaded; # flag set if we alreaded Load()ed the MWG tags + +# MWG Composite tags +%Image::ExifTool::MWG::Composite = ( + GROUPS => { 0 => 'Composite', 1 => 'MWG', 2 => 'Image' }, + VARS => { NO_ID => 1 }, + WRITE_PROC => \&Image::ExifTool::DummyWriteProc, + NOTES => q{ + The table below lists special Composite tags which are used to access other + tags based on the MWG 2.0 recommendations. These tags are only accessible + when explicitly loaded, but this is done automatically by the exiftool + application if MWG is specified as a group for any tag on the command line, + or manually with the C<-use MWG> option. Via the API, the MWG Composite + tags are loaded by calling "C<Image::ExifTool::MWG::Load()>". + + When reading, the value of each MWG tag is B<Derived From> the specified + tags based on the MWG guidelines. When writing, the appropriate associated + tags are written. The value of the IPTCDigest tag is updated automatically + when the IPTC is changed if either the IPTCDigest tag didn't exist + beforehand or its value agreed with the original IPTC digest (indicating + that the XMP is synchronized with the IPTC). IPTC information is written + only if the original file contained IPTC. + + Loading the MWG module activates "strict MWG conformance mode", which has + the effect of causing EXIF, IPTC and XMP in non-standard locations to be + ignored when reading, as per the MWG recommendations. Instead, a "Warning" + tag is generated when non-standard metadata is encountered. This feature + may be disabled by setting C<$Image::ExifTool::MWG::strict = 0> in the + L<ExifTool config file|../config.html> (or from your Perl script when using the API). Note + that the behaviour when writing is not changed: ExifTool always creates new + records only in the standard location, but writes new tags to any + EXIF/IPTC/XMP records that exist. + + Contrary to the EXIF specification, the MWG recommends that EXIF "ASCII" + string values be stored as UTF-8. To honour this, the exiftool application + sets the default internal EXIF string encoding to "UTF8" when the MWG module + is loaded, but via the API this must be done manually by setting the + L<CharsetEXIF|../ExifTool.html#CharsetEXIF> option. + + A complication of the MWG specification is that although the MWG:Creator + property may consist of multiple values, the associated EXIF tag + (EXIF:Artist) is only a simple string. To resolve this discrepancy the MWG + recommends a technique which allows a list of values to be stored in a + string by using a semicolon-space separator (with quotes around values if + necessary). When the MWG module is loaded, ExifTool automatically + implements this policy and changes EXIF:Artist to a list-type tag. + }, + Keywords => { + Flags => ['Writable','List'], + Desire => { + 0 => 'IPTC:Keywords', # (64-character limit) + 1 => 'XMP-dc:Subject', + 2 => 'CurrentIPTCDigest', + 3 => 'IPTCDigest', + }, + RawConv => q{ + return $val[1] if not defined $val[2] or (defined $val[1] and + (not defined $val[3] or $val[2] eq $val[3])); + return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $val[1], 64); + }, + DelCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteAlso => { + # only write Keywords if IPTC exists (eg. set EditGroup option) + 'IPTC:Keywords' => '$opts{EditGroup} = 1; $val', + 'XMP-dc:Subject' => '$val', + }, + }, + Description => { + Writable => 1, + Desire => { + 0 => 'EXIF:ImageDescription', + 1 => 'IPTC:Caption-Abstract', # (2000-character limit) + 2 => 'XMP-dc:Description', + 3 => 'CurrentIPTCDigest', + 4 => 'IPTCDigest', + }, + RawConv => q{ + return $val[0] if defined $val[0] and $val[0] !~ /^ *$/; + return $val[2] if not defined $val[3] or (defined $val[2] and + (not defined $val[4] or $val[3] eq $val[4])); + return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[1], $val[2], 2000); + }, + DelCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteAlso => { + 'EXIF:ImageDescription' => '$val', + 'IPTC:Caption-Abstract' => '$opts{EditGroup} = 1; $val', + 'XMP-dc:Description' => '$val', + }, + }, + DateTimeOriginal => { + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Notes => '"specifies when a photo was taken" - MWG', + Writable => 1, + Shift => 0, # don't shift this tag + Desire => { + 0 => 'Composite:SubSecDateTimeOriginal', + 1 => 'EXIF:DateTimeOriginal', + 2 => 'IPTC:DateCreated', + 3 => 'IPTC:TimeCreated', + 4 => 'XMP-photoshop:DateCreated', + 5 => 'CurrentIPTCDigest', + 6 => 'IPTCDigest', + }, + # must check for validity in RawConv to avoid hiding a same-named tag, + # but IPTC dates use a ValueConv so we need to derive the value there + RawConv => q{ + (defined $val[0] or defined $val[1] or $val[2] or + (defined $val[4] and (not defined $val[5] or not defined $val[6] + or $val[5] eq $val[6]))) ? $val : undef + }, + ValueConv => q{ + return $val[0] if defined $val[0] and $val[0] !~ /^[: ]*$/; + return $val[1] if defined $val[1] and $val[1] !~ /^[: ]*$/; + return $val[4] if not defined $val[5] or (defined $val[4] and + (not defined $val[6] or $val[5] eq $val[6])); + return $val[3] ? "$val[2] $val[3]" : $val[2] if $val[2]; + return undef; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', + DelCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteAlso => { + # set EXIF date/time values according to PrintConv option instead + # of defaulting to Type=ValueConv to allow reformatting to be applied + 'Composite:SubSecDateTimeOriginal' => 'delete $opts{Type}; $val', + 'IPTC:DateCreated' => '$opts{EditGroup} = 1; $val', + 'IPTC:TimeCreated' => '$opts{EditGroup} = 1; $val', + 'XMP-photoshop:DateCreated' => '$val', + }, + }, + CreateDate => { + Groups => { 2 => 'Time' }, + Notes => '"specifies when an image was digitized" - MWG', + Writable => 1, + Shift => 0, # don't shift this tag + Desire => { + 0 => 'Composite:SubSecCreateDate', + 1 => 'EXIF:CreateDate', + 2 => 'IPTC:DigitalCreationDate', + 3 => 'IPTC:DigitalCreationTime', + 4 => 'XMP-xmp:CreateDate', + 5 => 'CurrentIPTCDigest', + 6 => 'IPTCDigest', + }, + RawConv => q{ + (defined $val[0] or defined $val[1] or $val[2] or + (defined $val[4] and (not defined $val[5] or not defined $val[6] + or $val[5] eq $val[6]))) ? $val : undef + }, + ValueConv => q{ + return $val[0] if defined $val[0] and $val[0] !~ /^[: ]*$/; + return $val[1] if defined $val[1] and $val[1] !~ /^[: ]*$/; + return $val[4] if not defined $val[5] or (defined $val[4] and + (not defined $val[6] or $val[5] eq $val[6])); + return $val[3] ? "$val[2] $val[3]" : $val[2] if $val[2]; + return undef; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', + DelCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteAlso => { + 'Composite:SubSecCreateDate' => 'delete $opts{Type}; $val', + 'IPTC:DigitalCreationDate' => '$opts{EditGroup} = 1; $val', + 'IPTC:DigitalCreationTime' => '$opts{EditGroup} = 1; $val', + 'XMP-xmp:CreateDate' => '$val', + }, + }, + ModifyDate => { + Groups => { 2 => 'Time' }, + Notes => '"specifies when a file was modified by the user" - MWG', + Writable => 1, + Shift => 0, # don't shift this tag + Desire => { + 0 => 'Composite:SubSecModifyDate', + 1 => 'EXIF:ModifyDate', + 2 => 'XMP-xmp:ModifyDate', + 3 => 'CurrentIPTCDigest', + 4 => 'IPTCDigest', + }, + RawConv => q{ + return $val[0] if defined $val[0] and $val[0] !~ /^[: ]*$/; + return $val[1] if defined $val[1] and $val[1] !~ /^[: ]*$/; + return $val[2] if not defined $val[3] or not defined $val[4] or $val[3] eq $val[4]; + return undef; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', + # return empty string from check routines so this tag will never be set + # (only WriteAlso tags are written), the only difference is a -v2 message + DelCheck => '""', + WriteCheck => '""', + WriteAlso => { + 'Composite:SubSecModifyDate' => 'delete $opts{Type}; $val', + 'XMP-xmp:ModifyDate' => '$val', + }, + }, + Orientation => { + Writable => 1, + Require => 'EXIF:Orientation', + ValueConv => '$val', + PrintConv => \%Image::ExifTool::Exif::orientation, + DelCheck => '""', + WriteCheck => '""', + WriteAlso => { + 'EXIF:Orientation' => '$val', + }, + }, + Rating => { + Writable => 1, + Require => 'XMP-xmp:Rating', + ValueConv => '$val', + DelCheck => '""', + WriteCheck => '""', + WriteAlso => { + 'XMP-xmp:Rating' => '$val', + }, + }, + Copyright => { + Groups => { 2 => 'Author' }, + Writable => 1, + Desire => { + 0 => 'EXIF:Copyright', + 1 => 'IPTC:CopyrightNotice', # (128-character limit) + 2 => 'XMP-dc:Rights', + 3 => 'CurrentIPTCDigest', + 4 => 'IPTCDigest', + }, + RawConv => q{ + return $val[0] if defined $val[0] and $val[0] !~ /^ *$/; + return $val[2] if not defined $val[3] or (defined $val[2] and + (not defined $val[4] or $val[3] eq $val[4])); + return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[1], $val[2], 128); + }, + DelCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteAlso => { + 'EXIF:Copyright' => q{ + # encode if necessary (not automatic because Format is 'undef') + my $enc = $self->Options('CharsetEXIF'); + if ($enc) { + my $v = $val; + $self->Encode($v,$enc); + return $v; + } + return $val; + }, + 'IPTC:CopyrightNotice' => '$opts{EditGroup} = 1; $val', + 'XMP-dc:Rights' => '$val', + }, + }, + Creator => { + Groups => { 2 => 'Author' }, + Flags => ['Writable','List'], + Desire => { + 0 => 'EXIF:Artist', + 1 => 'IPTC:By-line', # (32-character limit) + 2 => 'XMP-dc:Creator', + 3 => 'CurrentIPTCDigest', + 4 => 'IPTCDigest', + }, + RawConv => q{ + return $val[0] if defined $val[0] and $val[0] !~ /^ *$/; + return $val[2] if not defined $val[3] or (defined $val[2] and + (not defined $val[4] or $val[3] eq $val[4])); + return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[1], $val[2], 32); + }, + DelCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteAlso => { + 'EXIF:Artist' => '$val', + 'IPTC:By-line' => '$opts{EditGroup} = 1; $val', + 'XMP-dc:Creator' => '$val', + }, + }, + Country => { + Groups => { 2 => 'Location' }, + Writable => 1, + Desire => { + 0 => 'IPTC:Country-PrimaryLocationName', # (64-character limit) + 1 => 'XMP-photoshop:Country', + 2 => 'XMP-iptcExt:LocationShownCountryName', + 3 => 'CurrentIPTCDigest', + 4 => 'IPTCDigest', + }, + RawConv => q{ + my $xmpVal = $val[2] || $val[1]; + return $xmpVal if not defined $val[3] or (defined $xmpVal and + (not defined $val[4] or $val[3] eq $val[4])); + return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $xmpVal, 64); + }, + DelCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteAlso => { + 'IPTC:Country-PrimaryLocationName' => '$opts{EditGroup} = 1; $val', + 'XMP-photoshop:Country' => '$val', # (legacy) + 'XMP-iptcExt:LocationShownCountryName' => '$val', + }, + }, + State => { + Groups => { 2 => 'Location' }, + Writable => 1, + Desire => { + 0 => 'IPTC:Province-State', # (32-character limit) + 1 => 'XMP-photoshop:State', + 2 => 'XMP-iptcExt:LocationShownProvinceState', + 3 => 'CurrentIPTCDigest', + 4 => 'IPTCDigest', + }, + RawConv => q{ + my $xmpVal = $val[2] || $val[1]; + return $xmpVal if not defined $val[3] or (defined $xmpVal and + (not defined $val[4] or $val[3] eq $val[4])); + return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $xmpVal, 32); + }, + DelCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteAlso => { + 'IPTC:Province-State' => '$opts{EditGroup} = 1; $val', + 'XMP-photoshop:State' => '$val', # (legacy) + 'XMP-iptcExt:LocationShownProvinceState' => '$val', + }, + }, + City => { + Groups => { 2 => 'Location' }, + Writable => 1, + Desire => { + 0 => 'IPTC:City', # (32-character limit) + 1 => 'XMP-photoshop:City', + 2 => 'XMP-iptcExt:LocationShownCity', + 3 => 'CurrentIPTCDigest', + 4 => 'IPTCDigest', + }, + RawConv => q{ + my $xmpVal = $val[2] || $val[1]; + return $xmpVal if not defined $val[3] or (defined $xmpVal and + (not defined $val[4] or $val[3] eq $val[4])); + return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $xmpVal, 32); + }, + DelCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteAlso => { + 'IPTC:City' => '$opts{EditGroup} = 1; $val', + 'XMP-photoshop:City' => '$val', # (legacy) + 'XMP-iptcExt:LocationShownCity' => '$val', + }, + }, + Location => { + Groups => { 2 => 'Location' }, + Writable => 1, + Desire => { + 0 => 'IPTC:Sub-location', # (32-character limit) + 1 => 'XMP-iptcCore:Location', + 2 => 'XMP-iptcExt:LocationShownSublocation', + 3 => 'CurrentIPTCDigest', + 4 => 'IPTCDigest', + }, + RawConv => q{ + my $xmpVal = $val[2] || $val[1]; + return $xmpVal if not defined $val[3] or (defined $xmpVal and + (not defined $val[4] or $val[3] eq $val[4])); + return Image::ExifTool::MWG::RecoverTruncatedIPTC($val[0], $xmpVal, 32); + }, + DelCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteCheck => 'Image::ExifTool::MWG::ReconcileIPTCDigest($self)', + WriteAlso => { + 'IPTC:Sub-location' => '$opts{EditGroup} = 1; $val', + 'XMP-iptcCore:Location' => '$val', # (legacy) + 'XMP-iptcExt:LocationShownSublocation' => '$val', + }, + }, +); + +# MWG XMP structures +my %sExtensions = ( + STRUCT_NAME => 'MWG Extensions', + NAMESPACE => undef, # variable namespace + NOTES => q{ + This structure may contain any top-level XMP tags, but none have been + pre-defined in ExifTool. Since no flattened tags have been pre-defined, + RegionExtensions is writable only as a structure (eg. + C<{xmp-dc:creator=me,rating=5}>). Fields for this structure are identified + using the standard ExifTool tag name (with optional leading group name, + and/or trailing language code, and/or trailing C<#> symbol to disable print + conversion). + }, +); +my %sRegionStruct = ( + STRUCT_NAME => 'MWG RegionStruct', + NAMESPACE => 'mwg-rs', + Area => { Struct => \%Image::ExifTool::XMP::sArea }, + Type => { + PrintConv => { + Face => 'Face', + Pet => 'Pet', + Focus => 'Focus', + BarCode => 'BarCode', + }, + }, + Name => { }, + Description => { }, + FocusUsage => { + PrintConv => { + EvaluatedUsed => 'Evaluated, Used', + EvaluatedNotUsed => 'Evaluated, Not Used', + NotEvaluatedNotUsed => 'Not Evaluated, Not Used', + }, + }, + BarCodeValue=> { }, + Extensions => { Struct => \%sExtensions }, + Rotation => { # (observed in LR6 XMP) + Writable => 'real', + Notes => 'not part of MWG 2.0 spec', + }, + seeAlso => { Namespace => 'rdfs', Resource => 1 }, +); +my %sKeywordStruct; +%sKeywordStruct = ( + STRUCT_NAME => 'MWG KeywordStruct', + NAMESPACE => 'mwg-kw', + Keyword => { }, + Applied => { Writable => 'boolean' }, + Children => { Struct => \%sKeywordStruct, List => 'Bag' }, +); + +# MWG 2.0 XMP region namespace tags +%Image::ExifTool::MWG::Regions = ( + %Image::ExifTool::XMP::xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-mwg-rs', 2 => 'Image' }, + NAMESPACE => 'mwg-rs', + NOTES => q{ + Image region metadata defined by the MWG 2.0 specification. These tags + may be accessed without the need to load the MWG Composite tags above. See + L<https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf> + for the official specification. + }, + Regions => { + Name => 'RegionInfo', + FlatName => 'Region', + Struct => { + STRUCT_NAME => 'MWG RegionInfo', + NAMESPACE => 'mwg-rs', + RegionList => { + FlatName => 'Region', + Struct => \%sRegionStruct, + List => 'Bag', + }, + AppliedToDimensions => { Struct => \%Image::ExifTool::XMP::sDimensions }, + }, + }, + RegionsRegionList => { Flat => 1, Name => 'RegionList' }, +); + +# MWG 2.0 XMP hierarchical keyword namespace tags +%Image::ExifTool::MWG::Keywords = ( + %Image::ExifTool::XMP::xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-mwg-kw', 2 => 'Image' }, + NAMESPACE => 'mwg-kw', + NOTES => q{ + Hierarchical keywords metadata defined by the MWG 2.0 specification. + ExifTool unrolls keyword structures to an arbitrary depth of 6 to allow + individual levels to be accessed with different tag names, and to avoid + infinite recursion. See + L<https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf> + for the official specification. + }, + # arbitrarily define only the first 6 levels of the keyword hierarchy + Keywords => { + Name => 'KeywordInfo', + Struct => { + STRUCT_NAME => 'MWG KeywordInfo', + NAMESPACE => 'mwg-kw', + Hierarchy => { Struct => \%sKeywordStruct, List => 'Bag' }, + }, + }, + KeywordsHierarchy => { Name => 'HierarchicalKeywords', Flat => 1 }, + KeywordsHierarchyKeyword => { Name => 'HierarchicalKeywords1', Flat => 1 }, + KeywordsHierarchyApplied => { Name => 'HierarchicalKeywords1Applied', Flat => 1 }, + KeywordsHierarchyChildren => { Name => 'HierarchicalKeywords1Children', Flat => 1 }, + KeywordsHierarchyChildrenKeyword => { Name => 'HierarchicalKeywords2', Flat => 1 }, + KeywordsHierarchyChildrenApplied => { Name => 'HierarchicalKeywords2Applied', Flat => 1 }, + KeywordsHierarchyChildrenChildren => { Name => 'HierarchicalKeywords2Children', Flat => 1 }, + KeywordsHierarchyChildrenChildrenKeyword => { Name => 'HierarchicalKeywords3', Flat => 1 }, + KeywordsHierarchyChildrenChildrenApplied => { Name => 'HierarchicalKeywords3Applied', Flat => 1 }, + KeywordsHierarchyChildrenChildrenChildren => { Name => 'HierarchicalKeywords3Children', Flat => 1 }, + KeywordsHierarchyChildrenChildrenChildrenKeyword => { Name => 'HierarchicalKeywords4', Flat => 1 }, + KeywordsHierarchyChildrenChildrenChildrenApplied => { Name => 'HierarchicalKeywords4Applied', Flat => 1 }, + KeywordsHierarchyChildrenChildrenChildrenChildren => { Name => 'HierarchicalKeywords4Children', Flat => 1 }, + KeywordsHierarchyChildrenChildrenChildrenChildrenKeyword => { Name => 'HierarchicalKeywords5', Flat => 1 }, + KeywordsHierarchyChildrenChildrenChildrenChildrenApplied => { Name => 'HierarchicalKeywords5Applied', Flat => 1 }, + KeywordsHierarchyChildrenChildrenChildrenChildrenChildren => { Name => 'HierarchicalKeywords5Children', Flat => 1, NoSubStruct => 1 }, # break infinite recursion + KeywordsHierarchyChildrenChildrenChildrenChildrenChildrenKeyword => { Name => 'HierarchicalKeywords6', Flat => 1 }, + KeywordsHierarchyChildrenChildrenChildrenChildrenChildrenApplied => { Name => 'HierarchicalKeywords6Applied', Flat => 1 }, +); + +# MWG 2.0 XMP collections namespace tags +%Image::ExifTool::MWG::Collections = ( + %Image::ExifTool::XMP::xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-mwg-coll', 2 => 'Image' }, + NAMESPACE => 'mwg-coll', + NOTES => q{ + Collections metadata defined by the MWG 2.0 specification. See + L<https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf> + for the official specification. + }, + Collections => { + FlatName => '', + List => 'Bag', + Struct => { + STRUCT_NAME => 'MWG CollectionInfo', + NAMESPACE => 'mwg-coll', + CollectionName => { }, + CollectionURI => { }, + }, + }, +); + + +#------------------------------------------------------------------------------ +# Load the MWG Composite tags +sub Load() +{ + return if $mwgLoaded; + + # add our composite tags + Image::ExifTool::AddCompositeTags('Image::ExifTool::MWG'); + # must also add to lookup so we can write them + # (since MWG tags aren't in the tag lookup by default) + Image::ExifTool::AddTagsToLookup(\%Image::ExifTool::MWG::Composite, + 'Image::ExifTool::Composite'); + + # modify EXIF:Artist to behave as a list-type tag + my $artist = $Image::ExifTool::Exif::Main{0x13b}; + $$artist{List} = 1; + $$artist{IsOverwriting} = \&OverwriteStringList; + $$artist{RawConv} = \&StringToList; + + # enable MWG strict mode if not set already + # (causes non-standard EXIF, IPTC and XMP to be ignored) + $Image::ExifTool::MWG::strict = 1 unless defined $Image::ExifTool::MWG::strict; + + $mwgLoaded = 1; +} + +#------------------------------------------------------------------------------ +# Change a list of values to a string using MWG rules +# Inputs: 0)reference to list of values +# Returns: string of values (and may reformat list entries) +sub ListToString($) +{ + my $vals = shift; + foreach (@$vals) { + # double all quotes in value and quote the value if it begins + # with a quote or contains a semicolon-space separator + if (/^"/ or /; /) { + s/"/""/g; # double all quotes + $_ = qq{"$_"}; # quote the value + } + } + return join('; ', @$vals); +} + +#------------------------------------------------------------------------------ +# Change a string value to a list of values using MWG rules +# Inputs: 0) string of values, 1) ExifTool ref +# Returns: value or list reference if more than one value +# Notes: Sets Warning tag on error +sub StringToList($$) +{ + my ($str, $et) = @_; + my (@vals, $inQuotes); + my @t = split '; ', $str, -1; + foreach (@t) { + my $wasQuotes = $inQuotes; + $inQuotes = 1 if not $inQuotes and s/^"//; + if ($inQuotes) { + # remove the last quote and reset the inQuotes flag if + # the value ended in an odd number of quotes + $inQuotes = 0 if s/((^|[^"])("")*)"$/$1/; + s/""/"/g; # un-double the contained quotes + } + if ($wasQuotes) { + # previous separator was quoted, so concatinate with previous value + $vals[-1] .= '; ' . $_; + } else { + push @vals, $_; + } + } + $et->Warn('Incorrectly quoted MWG string-list value') if $inQuotes; + return @vals > 1 ? \@vals : $vals[0]; +} + +#------------------------------------------------------------------------------ +# Handle logic for overwriting EXIF string-type list tag +# Inputs: 0) ExifTool ref, 1) new value hash ref, +# 2) old string value (or undef if it didn't exist), 3) new value ref +# Returns: 1 and sets the new value for the tag +sub OverwriteStringList($$$$) +{ + local $_; + my ($et, $nvHash, $val, $newValuePt) = @_; + my (@new, $delIndex); + my $writeMode = $et->Options('WriteMode'); + if ($writeMode ne 'wcg') { + if (defined $val) { + $writeMode =~ /w/i or return 0; + } else { + $writeMode =~ /c/i or return 0; + } + } + if ($$nvHash{DelValue} and defined $val) { + # preserve specified old values + my $old = StringToList($val, $et); + my @old = ref $old eq 'ARRAY' ? @$old : $old; + if (@{$$nvHash{DelValue}}) { + my %del; + $del{$_} = 1 foreach @{$$nvHash{DelValue}}; + foreach (@old) { + $del{$_} or push(@new, $_), next; + $delIndex or $delIndex = scalar @new; + } + } else { + push @new, @old; + } + } + # add new values (at location of deleted values, if any) + if ($$nvHash{Value}) { + if (defined $delIndex) { + splice @new, $delIndex, 0, @{$$nvHash{Value}}; + } else { + push @new, @{$$nvHash{Value}}; + } + } + if (@new) { + # convert back to string format + $$newValuePt = ListToString(\@new); + } else { + $$newValuePt = undef; # delete the tag + } + return 1; +} + +#------------------------------------------------------------------------------ +# Reconcile IPTC digest after writing an MWG tag +# Inputs: 0) ExifTool object ref +# Returns: empty string +sub ReconcileIPTCDigest($) +{ + my $et = shift; + + # set new value for IPTCDigest if not done already + unless ($Image::ExifTool::Photoshop::iptcDigestInfo and + $$et{NEW_VALUE}{$Image::ExifTool::Photoshop::iptcDigestInfo}) + { + # write new IPTCDigest only if it doesn't exist or + # is the same as the digest of the original IPTC + my @a; # (capture warning messages) + @a = $et->SetNewValue('Photoshop:IPTCDigest', 'old', Protected => 1, DelValue => 1); + @a = $et->SetNewValue('Photoshop:IPTCDigest', 'new', Protected => 1); + } + return ''; +} + +#------------------------------------------------------------------------------ +# Recover strings which were truncated by IPTC dataset length limit +# Inputs: 0) IPTC value, 1) XMP value, 2) length limit +# Notes: handles the case where IPTC and/or XMP values are lists +sub RecoverTruncatedIPTC($$$) +{ + my ($iptc, $xmp, $limit) = @_; + + return $iptc unless defined $xmp; + if (ref $iptc) { + $xmp = [ $xmp ] unless ref $xmp; + my ($i, @vals); + for ($i=0; $i<@$iptc; ++$i) { + push @vals, RecoverTruncatedIPTC($$iptc[$i], $$xmp[$i], $limit); + } + return \@vals; + } elsif (defined $iptc and length $iptc == $limit) { + $xmp = $$xmp[0] if ref $xmp; # take first element of list + return $xmp if length $xmp > $limit and $iptc eq substr($xmp, 0, $limit); + } + return $iptc; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::MWG - Metadata Working Group support + +=head1 SYNOPSIS + + # enable MWG Composite tags + use Image::ExifTool::MWG; + Image::ExifTool::MWG::Load(); + + # enable MWG strict mode + $Image::ExifTool::MWG::strict = 1; + + # disable MWG strict mode + $Image::ExifTool::MWG::strict = 0; + +=head1 DESCRIPTION + +The MWG module contains Composite tag definitions which are designed to +simplify implementation of the Metadata Working Group guidelines. These +special MWG Composite tags are enabled by calling the Load() method: + + use Image::ExifTool::MWG; + Image::ExifTool::MWG::Load(); + +By default, loading the MWG Composite tags enables "strict MWG conformance" +unless previously enabled or disabled by the user. In this mode, ExifTool +will generate a Warning instead of extracting EXIF, IPTC and XMP from +non-standard locations. The strict mode may be disabled or enabled at any +time by setting the MWG "strict" flag to 0 or 1. eg) + + $Image::ExifTool::MWG::strict = 0; + +This module also contains the MWG XMP tags which are loaded automatically by +ExifTool as required, and are independent of the MWG Composite tags which +must be loaded explicitly as described above. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.metadataworkinggroup.org/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/MWG Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/MXF.pm b/lib/Image/ExifTool/MXF.pm new file mode 100644 index 0000000..84d67a0 --- /dev/null +++ b/lib/Image/ExifTool/MXF.pm @@ -0,0 +1,3031 @@ +#------------------------------------------------------------------------------ +# File: MXF.pm +# +# Description: Read MXF meta information +# +# Revisions: 2010/12/15 - P. Harvey Created +# +# References: 1) http://sourceforge.net/projects/mxflib/ +# 2) http://www.aafassociation.org/downloads/whitepapers/MXFPhysicalview.pdf +# 3) http://archive.nlm.nih.gov/pubs/pearson/MJ2_Metadata2005.pdf +# 4) http://www.aafassociation.org/downloads/specifications/AMWA-AS-03-Delivery-Spec-1_0.pdf +# 5) http://paul-sampson.ca/private/s385m.pdf +# 6) http://avwiki.nl/documents/eg41.pdf +# 7) http://avwiki.nl/documents/eg42.pdf +# 8) http://rhea.tele.ucl.ac.be:8081/Plone/Members/egoray/thesaurus-dictionnaire-metadata/ +# a) S335M Dictionary structure.pdf +# b) S330M UMID.PDF +# 9) http://www.smpte-ra.org/mdd/RP210v12-publication-20100623.xls +# 10) http://www.amwa.tv/downloads/specifications/aafobjectspec-v1.1.pdf +# 11) http://www.mog-solutions.com/img_upload/PDF/XML%20Schema%20for%20MXF%20Metadata.pdf +# 12) http://www.freemxf.org/freemxf_board/viewtopic.php?p=545&sid=00a5c17e07d828c1e93ecdbaed3076f7 +# +# Notes: 1) The alternate language support is dependent on the serialization +# sequence. Specifically the InstanceUID's must come before any +# text in an alternate language set, and these sets must come +# after the language definitions. +# +# 2) UTF-16 surrogate pairs are not handled properly. +# +# 3) This code is not tested for files larger than 2 GB, +# but in theory this should be OK with 64-bit Perl. +#------------------------------------------------------------------------------ + +package Image::ExifTool::MXF; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::GPS; + +$VERSION = '1.08'; + +sub ProcessPrimer($$$); +sub ProcessLocalSet($$$); +sub ConvLatLon($); +sub ReadMXFValue($$$); +sub SetGroups($$;$$); +sub ConvertDurations($$); + +# list of currently decoded MXF value types +my %knownType = ( + Alt => 1, Lon => 1, UL => 1, + AUID => 1, PackageID => 1, UMID => 1, + BatchOfUL => 1, Position => 1, 'UTF-16' => 1, + Boolean => 1, ProductVersion => 1, UUID => 1, + GUID => 1, StrongReference => 1, VersionType => 1, + Hex => 1, StrongReferenceArray => 1, WeakReference => 1, + Label => 1, StrongReferenceBatch => 1, + Lat => 1, Timestamp => 1, + Length => 1, UID => 1, +); + +# common tag info parameters +my %header = ( + IsHeader => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::MXF::Header', + ProcessProc => \&Image::ExifTool::ProcessBinaryData, + }, +); +my %localSet = ( + SubDirectory => { TagTable => 'Image::ExifTool::MXF::Main' }, +); +my %timestamp = ( + Type => 'Timestamp', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', +); +my %geoLat = ( + Groups => { 2 => 'Location' }, + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', +); +my %geoLon = ( + Groups => { 2 => 'Location' }, + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', +); +my %geoLatLon = ( + Groups => { 2 => 'Location' }, + PrintConv => q{ + my ($lat, $lon) = split ' ', $val; + $lat = Image::ExifTool::GPS::ToDMS($self, $lat, 1, 'N'); + $lon = Image::ExifTool::GPS::ToDMS($self, $lon, 1, 'E'); + return "$lat, $lon"; + }, +); +my %duration = ( + IsDuration => 1, # flag used to correct durations by the appropriate EditRate + RawConv => '$val > 1e18 ? undef : $val', # (all 0xff's) + PrintConv => 'ConvertDuration($val)', +); + +# ComponentDataDefinition values +my %componentDataDef = ( + PrintConv => { + '060e2b34.0401.0101.01030201.01000000' => 'SMPTE 12M Timecode Track', + '060e2b34.0401.0101.01030201.02000000' => 'SMPTE 12M Timecode Track with active user bits', + '060e2b34.0401.0101.01030201.03000000' => 'SMPTE 309M Timecode Track', + '060e2b34.0401.0101.01030201.10000000' => 'Descriptive Metadata Track', + '060e2b34.0401.0101.01030202.01000000' => 'Picture Essence Track', + '060e2b34.0401.0101.01030202.02000000' => 'Sound Essence Track', + '060e2b34.0401.0101.01030202.03000000' => 'Data Essence Track', + }, +); + +# MXF tags (ref 1) +# Note: The Binary flag is automatically set for all Unknown tags with unknown Type +%Image::ExifTool::MXF::Main = ( + GROUPS => { 2 => 'Video' }, + VARS => { NO_LOOKUP => 1, NO_ID => 1 }, # tag ID's are too bulky + NOTES => q{ + Tags extracted from Material Exchange Format files. Tag ID's are not listed + because they are bulky 16-byte binary values. + }, + # '060a2b34.0101.0101.01010100.00000000' => { Name => 'UMIDVideo', Type => 'Node' }, + # '060a2b34.0101.0101.01010110.00000000' => { Name => 'UMIDVideo', Unknown => 1 }, + # '060a2b34.0101.0101.01010111.00000000' => { Name => 'UMIDVideo', Unknown => 1 }, + # '060a2b34.0101.0101.01010112.00000000' => { Name => 'UMIDVideo', Unknown => 1 }, + # '060a2b34.0101.0101.01010120.00000000' => { Name => 'UMIDVideo', Unknown => 1 }, + # '060a2b34.0101.0101.01010121.00000000' => { Name => 'UMIDVideo', Unknown => 1 }, + # '060a2b34.0101.0101.01010122.00000000' => { Name => 'UMIDVideo', Unknown => 1 }, + # '060a2b34.0101.0101.01010200.00000000' => { Name => 'UMIDAudio', Type => 'Node' }, + # '060a2b34.0101.0101.01010210.00000000' => { Name => 'UMIDAudio', Unknown => 1 }, + # '060a2b34.0101.0101.01010211.00000000' => { Name => 'UMIDAudio', Unknown => 1 }, + # '060a2b34.0101.0101.01010212.00000000' => { Name => 'UMIDAudio', Unknown => 1 }, + # '060a2b34.0101.0101.01010220.00000000' => { Name => 'UMIDAudio', Unknown => 1 }, + # '060a2b34.0101.0101.01010221.00000000' => { Name => 'UMIDAudio', Unknown => 1 }, + # '060a2b34.0101.0101.01010222.00000000' => { Name => 'UMIDAudio', Unknown => 1 }, + # '060a2b34.0101.0101.01010300.00000000' => { Name => 'UMIDData', Type => 'Node' }, + # '060a2b34.0101.0101.01010310.00000000' => { Name => 'UMIDData', Unknown => 1 }, + # '060a2b34.0101.0101.01010311.00000000' => { Name => 'UMIDData', Unknown => 1 }, + # '060a2b34.0101.0101.01010312.00000000' => { Name => 'UMIDData', Unknown => 1 }, + # '060a2b34.0101.0101.01010320.00000000' => { Name => 'UMIDData', Unknown => 1 }, + # '060a2b34.0101.0101.01010321.00000000' => { Name => 'UMIDData', Unknown => 1 }, + # '060a2b34.0101.0101.01010322.00000000' => { Name => 'UMIDData', Unknown => 1 }, + # '060a2b34.0101.0101.01010400.00000000' => { Name => 'UMIDSystem', Type => 'Node' }, + # '060a2b34.0101.0101.01010410.00000000' => { Name => 'UMIDSystem', Unknown => 1 }, + # '060a2b34.0101.0101.01010411.00000000' => { Name => 'UMIDSystem', Unknown => 1 }, + # '060a2b34.0101.0101.01010412.00000000' => { Name => 'UMIDSystem', Unknown => 1 }, + # '060a2b34.0101.0101.01010420.00000000' => { Name => 'UMIDSystem', Unknown => 1 }, + # '060a2b34.0101.0101.01010421.00000000' => { Name => 'UMIDSystem', Unknown => 1 }, + # '060a2b34.0101.0101.01010422.00000000' => { Name => 'UMIDSystem', Unknown => 1 }, + + # '060e2b34.0101.0101.00000000.00000000' => { Name => 'Elements', Type => 'Node' }, + # '060e2b34.0101.0101.01000000.00000000' => { Name => 'Identifiers', Type => 'Node' }, + # '060e2b34.0101.0101.01010000.00000000' => { Name => 'GloballyUniqueIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0101.01011000.00000000' => { Name => 'InternationalBroadcastingOrganizationIdentifiers', Type => 'Node' }, + '060e2b34.0101.0101.01011001.00000000' => { Name => 'OrganizationID', Format => 'string' }, + # '060e2b34.0101.0101.01011003.00000000' => { Name => 'ProgramIdentifiers', Type => 'Node' }, + '060e2b34.0101.0101.01011003.01000000' => { Name => 'UPID', Unknown => 1 }, + '060e2b34.0101.0101.01011003.02000000' => { Name => 'UPN', Unknown => 1 }, + # '060e2b34.0101.0101.01011004.00000000' => { Name => 'PhysicalMediaIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0101.01011004.01000000' => { Name => 'TapeIdentifiers', Type => 'Node' }, + '060e2b34.0101.0101.01011004.01010000' => { Name => 'IBTN', Unknown => 1 }, + # '060e2b34.0101.0101.01011100.00000000' => { Name => 'InternationalStandardIdentifiers', Type => 'Node' }, + '060e2b34.0101.0101.01011101.00000000' => { Name => 'ISAN', Unknown => 1 }, + '060e2b34.0101.0101.01011102.00000000' => { Name => 'ISBN', Unknown => 1 }, + '060e2b34.0101.0101.01011103.00000000' => { Name => 'ISSN', Unknown => 1 }, + '060e2b34.0101.0101.01011104.00000000' => { Name => 'ISWC', Unknown => 1 }, + '060e2b34.0101.0101.01011105.00000000' => { Name => 'ISMN', Unknown => 1 }, + '060e2b34.0101.0101.01011106.00000000' => { Name => 'ISCI', Unknown => 1 }, + '060e2b34.0101.0101.01011107.00000000' => { Name => 'ISRC', Unknown => 1 }, + '060e2b34.0101.0101.01011108.00000000' => { Name => 'ISRN', Unknown => 1 }, + '060e2b34.0101.0101.01011109.00000000' => { Name => 'ISBD', Unknown => 1 }, + '060e2b34.0101.0101.0101110a.00000000' => { Name => 'ISTC', Unknown => 1 }, + # '060e2b34.0101.0101.01011300.00000000' => { Name => 'InternationalStandardCompoundIdentifiers', Type => 'Node' }, + '060e2b34.0101.0101.01011301.00000000' => { Name => 'SICI', Unknown => 1 }, + '060e2b34.0101.0101.01011302.00000000' => { Name => 'BICI', Unknown => 1 }, + '060e2b34.0101.0101.01011303.00000000' => { Name => 'AICI', Unknown => 1 }, + '060e2b34.0101.0101.01011304.00000000' => { Name => 'PII', Unknown => 1 }, + # '060e2b34.0101.0101.01011500.00000000' => { Name => 'ObjectIdentifiers', Type => 'Node' }, + '060e2b34.0101.0101.01011501.00000000' => { Name => 'DOI', Unknown => 1 }, + '060e2b34.0101.0101.01011502.00000000' => { Name => 'InstanceUID', Type => 'GUID', Unknown => 1 }, + '060e2b34.0101.0101.01011510.00000000' => { Name => 'PackageID', Type => 'PackageID', Unknown => 1 }, + # '060e2b34.0101.0101.01012000.00000000' => { Name => 'DeviceIdentifiers', Type => 'Node' }, + '060e2b34.0101.0101.01012001.00000000' => { Name => 'DeviceDesignation', Format => 'string' }, + '060e2b34.0101.0101.01012003.00000000' => { Name => 'DeviceModel', Format => 'string' }, + '060e2b34.0101.0101.01012004.00000000' => { Name => 'DeviceSerialNumber', Format => 'string' }, + # '060e2b34.0101.0101.01020000.00000000' => { Name => 'GloballyUniqueLocators', Type => 'Node' }, + # '060e2b34.0101.0101.01020100.00000000' => { Name => 'UniformResourceLocators', Type => 'Node' }, + '060e2b34.0101.0101.01020101.00000000' => { Name => 'URL', Format => 'string' }, + '060e2b34.0101.0101.01020101.01000000' => { Name => 'URL', Type => 'UTF-16' }, + '060e2b34.0101.0101.01020102.00000000' => { Name => 'PURL', Format => 'string' }, + '060e2b34.0101.0101.01020103.00000000' => { Name => 'URN', Format => 'string' }, + # '060e2b34.0101.0101.01030000.00000000' => { Name => 'LocallyUniqueIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0101.01030100.00000000' => { Name => 'AdministrativeIdentifiers', Type => 'Node' }, + '060e2b34.0101.0101.01030101.00000000' => { Name => 'TransmissionID', Format => 'string' }, + '060e2b34.0101.0101.01030102.00000000' => { Name => 'ArchiveID', Format => 'string' }, + '060e2b34.0101.0101.01030103.00000000' => { Name => 'ItemID', Format => 'string' }, + '060e2b34.0101.0101.01030104.00000000' => { Name => 'AccountingReferenceNumber', Format => 'string' }, + '060e2b34.0101.0101.01030105.00000000' => { Name => 'TrafficID', Format => 'string' }, + # '060e2b34.0101.0101.01030200.00000000' => { Name => 'LocalPhysicalMediaIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0101.01030201.00000000' => { Name => 'LocalFilmID', Type => 'Node' }, + '060e2b34.0101.0101.01030201.01000000' => { Name => 'ReelOrRollNumber', Format => 'string' }, + # '060e2b34.0101.0101.01030202.00000000' => { Name => 'LocalTapeIdentifiers', Type => 'Node' }, + '060e2b34.0101.0101.01030202.01000000' => { Name => 'LocalTapeNumber', Format => 'string' }, + # '060e2b34.0101.0101.01030300.00000000' => { Name => 'LocalObjectIdentifiers', Type => 'Node' }, + '060e2b34.0101.0101.01030301.00000000' => { Name => 'LUID', Format => 'int32u' }, + '060e2b34.0101.0101.01030302.01000000' => { Name => 'PackageName', Type => 'UTF-16' }, + # '060e2b34.0101.0101.01040000.00000000' => { Name => 'LocallyUniqueLocators', Type => 'Node' }, + # '060e2b34.0101.0101.01040100.00000000' => { Name => 'MediaLocators', Type => 'Node' }, + '060e2b34.0101.0101.01040101.00000000' => { Name => 'LocalFilePath', Format => 'string' }, + # '060e2b34.0101.0101.01040700.00000000' => { Name => 'FilmLocators', Type => 'Node' }, + '060e2b34.0101.0101.01040701.00000000' => { Name => 'EdgeCode', Format => 'string' }, + '060e2b34.0101.0101.01040702.00000000' => { Name => 'FrameCode', Format => 'string' }, + '060e2b34.0101.0101.01040703.00000000' => { Name => 'KeyCode', Type => 'KeyCode', Unknown => 1 }, + '060e2b34.0101.0101.01040704.00000000' => { Name => 'InkNumber', Format => 'string' }, + # '060e2b34.0101.0101.01041000.00000000' => { Name => 'ProxyLocators', Type => 'Node' }, + '060e2b34.0101.0101.01041001.00000000' => { Name => 'KeyText', Format => 'string' }, + '060e2b34.0101.0101.01041002.00000000' => { Name => 'KeyFrame', Format => 'string' }, + '060e2b34.0101.0101.01041003.00000000' => { Name => 'KeySound', Format => 'string' }, + '060e2b34.0101.0101.01041004.00000000' => { Name => 'KeyDataOrProgram', Format => 'string' }, + # '060e2b34.0101.0101.01050000.00000000' => { Name => 'Titles', Type => 'Node' }, + '060e2b34.0101.0101.01050100.00000000' => { Name => 'TitleKind', Format => 'string' }, + '060e2b34.0101.0101.01050200.00000000' => { Name => 'MainTitle', Format => 'string' }, + '060e2b34.0101.0101.01050300.00000000' => { Name => 'SecondaryTitle', Format => 'string' }, + '060e2b34.0101.0101.01050400.00000000' => { Name => 'SeriesNumber', Format => 'string' }, + '060e2b34.0101.0101.01050500.00000000' => { Name => 'EpisodeNumber', Format => 'string' }, + '060e2b34.0101.0101.01050600.00000000' => { Name => 'SceneNumber', Format => 'string' }, + '060e2b34.0101.0101.01050700.00000000' => { Name => 'TakeNumber', Format => 'int16u' }, + # '060e2b34.0101.0101.01100000.00000000' => { Name => 'IntellectualPropertyRightsIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0101.01100100.00000000' => { Name => 'SUISACISACIPI', Type => 'Node' }, + '060e2b34.0101.0101.01100101.00000000' => { Name => 'CISACLegalEntityID', Unknown => 1 }, + # '060e2b34.0101.0101.01100200.00000000' => { Name => 'AGICOAIdentifers', Type => 'Node' }, + '060e2b34.0101.0101.01100201.00000000' => { Name => 'AGICOAID', Unknown => 1 }, + # '060e2b34.0101.0101.02000000.00000000' => { Name => 'ADMINISTRATION', Type => 'Node' }, + # '060e2b34.0101.0101.02010000.00000000' => { Name => 'Supplier', Type => 'Node' }, + '060e2b34.0101.0101.02010100.00000000' => { Name => 'SourceOrganization', Format => 'string' }, + '060e2b34.0101.0101.02010200.00000000' => { Name => 'SupplyContractNumber', Format => 'string' }, + '060e2b34.0101.0101.02010300.00000000' => { Name => 'OriginalProducerName', Format => 'string' }, + # '060e2b34.0101.0101.02020000.00000000' => { Name => 'Product', Type => 'Node' }, + '060e2b34.0101.0101.02020100.00000000' => { Name => 'TotalEpisodeCount', Format => 'int16u' }, + # '060e2b34.0101.0101.02050000.00000000' => { Name => 'Rights', Type => 'Node' }, + # '060e2b34.0101.0101.02050100.00000000' => { Name => 'Copyright', Type => 'Node' }, + '060e2b34.0101.0101.02050101.00000000' => { Name => 'CopyrightStatus', Format => 'string' }, + '060e2b34.0101.0101.02050102.00000000' => { Name => 'CopyrightOwnerName', Format => 'string' }, + # '060e2b34.0101.0101.02050200.00000000' => { Name => 'IntellectualRights', Type => 'Node' }, + '060e2b34.0101.0101.02050201.00000000' => { Name => 'IntellectualPropertyDescription', Format => 'string' }, + '060e2b34.0101.0101.02050202.00000000' => { Name => 'IntellectualPropertyRights', Format => 'string' }, + # '060e2b34.0101.0101.02050300.00000000' => { Name => 'LegalPersonalities', Type => 'Node' }, + '060e2b34.0101.0101.02050301.00000000' => { Name => 'Rightsholder', Format => 'string' }, + '060e2b34.0101.0101.02050302.00000000' => { Name => 'RightsManagementAuthority', Format => 'string' }, + '060e2b34.0101.0101.02050303.00000000' => { Name => 'InterestedPartyName', Format => 'string' }, + # '060e2b34.0101.0101.02050400.00000000' => { Name => 'IntellectualPropertyRightsOptions', Type => 'Node' }, + '060e2b34.0101.0101.02050401.00000000' => { Name => 'MaximumUseCount', Format => 'int16u' }, + '060e2b34.0101.0101.02050402.00000000' => { Name => 'LicenseOptionsDescription', Format => 'string' }, + # '060e2b34.0101.0101.02060000.00000000' => { Name => 'FinancialInformation', Type => 'Node' }, + # '060e2b34.0101.0101.02060100.00000000' => { Name => 'Currencies', Type => 'Node' }, + '060e2b34.0101.0101.02060101.00000000' => { Name => 'CurrencyCode', Format => 'string' }, + # '060e2b34.0101.0101.02060200.00000000' => { Name => 'PaymentsAndCosts', Type => 'Node' }, + '060e2b34.0101.0101.02060201.00000000' => { Name => 'RoyaltyPaymentInformation', Format => 'string' }, + # '060e2b34.0101.0101.02060300.00000000' => { Name => 'Income', Type => 'Node' }, + '060e2b34.0101.0101.02060301.00000000' => { Name => 'RoyaltyIncomeInformation', Format => 'string' }, + # '060e2b34.0101.0101.02070000.00000000' => { Name => 'AccessControl', Type => 'Node' }, + '060e2b34.0101.0101.02070100.00000000' => { Name => 'RestrictionsonUse', Format => 'string' }, + '060e2b34.0101.0101.02070200.00000000' => { Name => 'ExCCIData', Type => 'DataBlock', Unknown => 1 }, + # '060e2b34.0101.0101.02080000.00000000' => { Name => 'Security', Type => 'Node' }, + # '060e2b34.0101.0101.02080100.00000000' => { Name => 'SystemAccess', Type => 'Node' }, + '060e2b34.0101.0101.02080101.00000000' => { Name => 'UserName', Format => 'string' }, + '060e2b34.0101.0101.02080101.01000000' => { Name => 'UserName', Type => 'UTF-16' }, + '060e2b34.0101.0101.02080102.00000000' => { Name => 'Password', Format => 'string' }, + '060e2b34.0101.0101.02080102.01000000' => { Name => 'Password', Type => 'UTF-16' }, + # '060e2b34.0101.0101.02090000.00000000' => { Name => 'Encryption', Type => 'Node' }, + # '060e2b34.0101.0101.02090100.00000000' => { Name => 'FilmEncryption', Type => 'Node' }, + # '060e2b34.0101.0101.02090101.00000000' => { Name => 'ScramblingKeys', Type => 'Node' }, + '060e2b34.0101.0101.02090101.01000000' => { Name => 'ScramblingKeyKind', Format => 'string' }, + '060e2b34.0101.0101.02090101.02000000' => { Name => 'ScramblingKeyValue', Format => 'int8u' }, + # '060e2b34.0101.0101.02100000.00000000' => { Name => 'PublicationOutlet', Type => 'Node' }, + # '060e2b34.0101.0101.02100100.00000000' => { Name => 'Broadcast', Type => 'Node' }, + # '060e2b34.0101.0101.02100101.00000000' => { Name => 'Broadcaster', Type => 'Node' }, + '060e2b34.0101.0101.02100101.01000000' => { Name => 'BroadcastOrganizationName', Format => 'string' }, + '060e2b34.0101.0101.02100101.02000000' => { Name => 'BroadcastChannel', Format => 'string' }, + '060e2b34.0101.0101.02100101.03000000' => { Name => 'BroadcastMediumKind', Format => 'string' }, + '060e2b34.0101.0101.02100101.05000000' => { Name => 'BroadcastRegion', Format => 'string' }, + # '060e2b34.0101.0101.02200000.00000000' => { Name => 'BroadcastAndRepeatInformation', Type => 'Node' }, + # '060e2b34.0101.0101.02200100.00000000' => { Name => 'BroadcastFlags', Type => 'Node' }, + '060e2b34.0101.0101.02200101.00000000' => { Name => 'FirstBroadcastFlag', Type => 'Boolean' }, + # '060e2b34.0101.0101.02200200.00000000' => { Name => 'RepeatNumbers', Type => 'Node' }, + '060e2b34.0101.0101.02200201.00000000' => { Name => 'CurrentRepeatNumber', Format => 'int16u' }, + '060e2b34.0101.0101.02200202.00000000' => { Name => 'PreviousRepeatNumber', Format => 'int16u' }, + # '060e2b34.0101.0101.02200300.00000000' => { Name => 'Ratings', Type => 'Node' }, + '060e2b34.0101.0101.02200301.00000000' => { Name => 'AudienceRating', Format => 'int32u' }, + '060e2b34.0101.0101.02200302.00000000' => { Name => 'AudienceReach', Format => 'int32u' }, + # '060e2b34.0101.0101.02300000.00000000' => { Name => 'ParticipatingParties', Type => 'Node' }, + # '060e2b34.0101.0101.02300100.00000000' => { Name => 'IndividualsAndGroups', Type => 'Node' }, + '060e2b34.0101.0101.02300101.00000000' => { Name => 'NatureOfPersonality', Format => 'string' }, + # '060e2b34.0101.0101.02300102.00000000' => { Name => 'Production', Type => 'Node' }, + '060e2b34.0101.0101.02300102.01000000' => { Name => 'ContributionStatus', Format => 'string' }, + # '060e2b34.0101.0101.02300103.00000000' => { Name => 'SupportAndAdministrationDetails', Type => 'Node' }, + '060e2b34.0101.0101.02300103.01000000' => { Name => 'SupportOrAdministrationStatus', Format => 'string' }, + # '060e2b34.0101.0101.02300200.00000000' => { Name => 'OrganizationsAndPublicBodies', Type => 'Node' }, + '060e2b34.0101.0101.02300201.00000000' => { Name => 'OrganizationKind', Format => 'string' }, + # '060e2b34.0101.0101.02300202.00000000' => { Name => 'ProductionOrganizationOrPublicBody', Type => 'Node' }, + '060e2b34.0101.0101.02300202.01000000' => { Name => 'ProductionOrganizationRole', Format => 'string' }, + # '060e2b34.0101.0101.02300203.00000000' => { Name => 'SupportAndAdministrationOrganizationOrPublicBody', Type => 'Node' }, + '060e2b34.0101.0101.02300203.01000000' => { Name => 'SupportOrganizationRole', Format => 'string' }, + # '060e2b34.0101.0101.02300500.00000000' => { Name => 'JobFunctionInformation', Type => 'Node' }, + '060e2b34.0101.0101.02300501.00000000' => { Name => 'JobFunctionName', Format => 'string' }, + '060e2b34.0101.0101.02300502.00000000' => { Name => 'RoleName', Format => 'string' }, + # '060e2b34.0101.0101.02300600.00000000' => { Name => 'ContactInformation', Type => 'Node' }, + '060e2b34.0101.0101.02300601.00000000' => { Name => 'ContactKind', Format => 'string' }, + '060e2b34.0101.0101.02300602.00000000' => { Name => 'ContactDepartmentName', Format => 'string' }, + # '060e2b34.0101.0101.02300603.00000000' => { Name => 'PersonOrOrganizationDetails', Type => 'Node' }, + # '060e2b34.0101.0101.02300603.01000000' => { Name => 'PersonNames', Type => 'Node' }, + '060e2b34.0101.0101.02300603.01010000' => { Name => 'FamilyName', Format => 'string' }, + '060e2b34.0101.0101.02300603.01020000' => { Name => 'FirstGivenName', Format => 'string' }, + '060e2b34.0101.0101.02300603.01030000' => { Name => 'SecondGivenName', Format => 'string' }, + '060e2b34.0101.0101.02300603.01040000' => { Name => 'ThirdGivenName', Format => 'string' }, + # '060e2b34.0101.0101.02300603.02000000' => { Name => 'GroupNames', Type => 'Node' }, + '060e2b34.0101.0101.02300603.02010000' => { Name => 'MainName', Format => 'string' }, + '060e2b34.0101.0101.02300603.02020000' => { Name => 'SupplementaryName', Format => 'string' }, + # '060e2b34.0101.0101.02300603.03000000' => { Name => 'OrganizationNames', Type => 'Node' }, + '060e2b34.0101.0101.02300603.03010000' => { Name => 'OrganizationMainName', Format => 'string' }, + '060e2b34.0101.0101.02300603.03020000' => { Name => 'SupplementaryOrganizationName', Format => 'string' }, + # '060e2b34.0101.0101.03000000.00000000' => { Name => 'Interpretive', Type => 'Node' }, + # '060e2b34.0101.0101.03010000.00000000' => { Name => 'Fundamental', Type => 'Node' }, + # '060e2b34.0101.0101.03010100.00000000' => { Name => 'CountriesAndLanguages', Type => 'Node' }, + # '060e2b34.0101.0101.03010101.00000000' => { Name => 'CountryAndRegionCodes', Type => 'Node' }, + '060e2b34.0101.0101.03010101.01000000' => { Name => 'ISO3166CountryCode', Format => 'string' }, + # '060e2b34.0101.0101.03010102.00000000' => { Name => 'LanguageCodes', Type => 'Node' }, + '060e2b34.0101.0101.03010102.01000000' => { Name => 'ISO639-1LanguageCode', Format => 'string' }, + # '060e2b34.0101.0101.03010201.00000000' => { Name => 'SystemInterpretations', Type => 'Node' }, + '060e2b34.0101.0101.03010201.01000000' => { Name => 'OperatingSystemInterpretations', Format => 'int8u' }, + '060e2b34.0101.0101.03010201.02000000' => { + Name => 'ByteOrder', #PH (was int16s, but I have seen "II") + Format => 'string', + PrintConv => { + II => 'Little-endian (Intel, II)', + MM => 'Big-endian (Motorola, MM)', + }, + }, + '060e2b34.0101.0101.03010201.03000000' => { Name => 'EssenceIsIdentified', Type => 'Boolean' }, + # '060e2b34.0101.0101.03010300.00000000' => { Name => 'FundamentalDimensions', Type => 'Node' }, + # '060e2b34.0101.0101.03010301.00000000' => { Name => 'Length', Type => 'Node' }, + '060e2b34.0101.0101.03010301.01000000' => { Name => 'LengthSystemName', Format => 'string' }, + '060e2b34.0101.0101.03010301.02000000' => { Name => 'LengthUnitKind', Format => 'string' }, + # '060e2b34.0101.0101.03010302.00000000' => { Name => 'Angles', Type => 'Node' }, + '060e2b34.0101.0101.03010302.01000000' => { Name => 'AngularUnitKind', Format => 'string' }, + # '060e2b34.0101.0101.03010303.00000000' => { Name => 'Time', Type => 'Node' }, + '060e2b34.0101.0101.03010303.01000000' => { Name => 'TimeSystemOffset', Format => 'string' }, + '060e2b34.0101.0101.03010303.02000000' => { Name => 'TimeUnitKind', Format => 'string' }, + # '060e2b34.0101.0101.03010304.00000000' => { Name => 'Mass', Type => 'Node' }, + # '060e2b34.0101.0101.03010305.00000000' => { Name => 'Energy', Type => 'Node' }, + # '060e2b34.0101.0101.03020000.00000000' => { Name => 'HumanAssignedDescriptors', Type => 'Node' }, + # '060e2b34.0101.0101.03020100.00000000' => { Name => 'Categorization', Type => 'Node' }, + # '060e2b34.0101.0101.03020101.00000000' => { Name => 'ContentClassification', Type => 'Node' }, + '060e2b34.0101.0101.03020101.01000000' => { Name => 'ContentCodingSystem', Format => 'string' }, + '060e2b34.0101.0101.03020101.02000000' => { Name => 'ProgramKind', Format => 'string' }, + '060e2b34.0101.0101.03020101.03000000' => { Name => 'Genre', Format => 'string' }, + '060e2b34.0101.0101.03020101.04000000' => { Name => 'TargetAudience', Format => 'string' }, + # '060e2b34.0101.0101.03020102.00000000' => { Name => 'CatalogingAndIndexing', Type => 'Node' }, + '060e2b34.0101.0101.03020102.01000000' => { Name => 'CatalogDataStatus', Format => 'string' }, + '060e2b34.0101.0101.03020102.02000000' => { Name => 'ThesaurusName', Format => 'string' }, + '060e2b34.0101.0101.03020102.03000000' => { Name => 'Theme', Format => 'string' }, + '060e2b34.0101.0101.03020102.04000000' => { Name => 'ContentClassification', Format => 'string' }, + '060e2b34.0101.0101.03020102.05000000' => { Name => 'Keywords', Format => 'string' }, + '060e2b34.0101.0101.03020102.06000000' => { Name => 'KeyFrames', Format => 'string' }, + '060e2b34.0101.0101.03020102.07000000' => { Name => 'KeySounds', Format => 'string' }, + '060e2b34.0101.0101.03020102.08000000' => { Name => 'KeyData', Format => 'string' }, + # '060e2b34.0101.0101.03020106.00000000' => { Name => 'TextualDescription', Type => 'Node' }, + '060e2b34.0101.0101.03020106.01000000' => { Name => 'Abstract', Format => 'string' }, + '060e2b34.0101.0101.03020106.02000000' => { Name => 'Purpose', Format => 'string' }, + '060e2b34.0101.0101.03020106.03000000' => { Name => 'Description', Format => 'string' }, + '060e2b34.0101.0101.03020106.04000000' => { Name => 'ColorDescriptor', Format => 'string' }, + '060e2b34.0101.0101.03020106.05000000' => { Name => 'FormatDescriptor', Format => 'string' }, + # '060e2b34.0101.0101.03020107.00000000' => { Name => 'Stratum', Type => 'Node' }, + '060e2b34.0101.0101.03020107.01000000' => { Name => 'StratumKind', Format => 'string' }, + # '060e2b34.0101.0101.03020200.00000000' => { Name => 'Assessments', Type => 'Node' }, + # '060e2b34.0101.0101.03020201.00000000' => { Name => 'Awards', Type => 'Node' }, + '060e2b34.0101.0101.03020201.01000000' => { Name => 'IndividualAwardName', Format => 'string' }, + '060e2b34.0101.0101.03020201.02000000' => { Name => 'ProgramAwardName', Format => 'string' }, + # '060e2b34.0101.0101.03020202.00000000' => { Name => 'QualitativeValues', Type => 'Node' }, + '060e2b34.0101.0101.03020202.01000000' => { Name => 'AssetValue', Format => 'string' }, + '060e2b34.0101.0101.03020202.02000000' => { Name => 'ContentValue', Format => 'string' }, + '060e2b34.0101.0101.03020202.03000000' => { Name => 'CulturalValue', Format => 'string' }, + '060e2b34.0101.0101.03020202.04000000' => { Name => 'AestheticValue', Format => 'string' }, + '060e2b34.0101.0101.03020202.05000000' => { Name => 'HistoricalValue', Format => 'string' }, + '060e2b34.0101.0101.03020202.06000000' => { Name => 'TechnicalValue', Format => 'string' }, + '060e2b34.0101.0101.03020202.07000000' => { Name => 'OtherValues', Format => 'string' }, + # '060e2b34.0101.0101.03020300.00000000' => { Name => 'TechnicalCommentsAndDescriptions', Type => 'Node' }, + # '060e2b34.0101.0101.03020301.00000000' => { Name => 'ObjectCommentsAndDescriptions', Type => 'Node' }, + # '060e2b34.0101.0101.03030000.00000000' => { Name => 'Machine-AssignedOrComputedDescriptions', Type => 'Node' }, + # '060e2b34.0101.0101.03030100.00000000' => { Name => 'AutomatedCategorization', Type => 'Node' }, + # '060e2b34.0101.0101.03030101.00000000' => { Name => 'AutomatedContentClassification', Type => 'Node' }, + # '060e2b34.0101.0101.03030102.00000000' => { Name => 'AutomatedCatalogingAndIndexing', Type => 'Node' }, + '060e2b34.0101.0101.03030102.01000000' => { Name => 'CatalogDataStatus', Format => 'string' }, + '060e2b34.0101.0101.03030102.02000000' => { Name => 'CatalogingSystemName', Format => 'string' }, + '060e2b34.0101.0101.03030102.06000000' => { Name => 'ComputedKeywords', Format => 'string' }, + '060e2b34.0101.0101.03030102.07000000' => { Name => 'ComputedKeyFrames', Format => 'string' }, + '060e2b34.0101.0101.03030102.08000000' => { Name => 'ComputedKeySounds', Format => 'string' }, + '060e2b34.0101.0101.03030102.09000000' => { Name => 'ComputedKeyData', Format => 'string' }, + # '060e2b34.0101.0101.03030106.00000000' => { Name => 'ComputedTextualDescription', Type => 'Node' }, + # '060e2b34.0101.0101.03030107.00000000' => { Name => 'AutomatedStratum', Type => 'Node' }, + '060e2b34.0101.0101.03030107.01000000' => { Name => 'ComputedStratumKind', Format => 'string' }, + # '060e2b34.0101.0101.03030300.00000000' => { Name => 'ComputedTechnicalCommentsAndDescriptions', Type => 'Node' }, + # '060e2b34.0101.0101.03030301.00000000' => { Name => 'ComputedObjectCommentsAndDescriptions', Type => 'Node' }, + # '060e2b34.0101.0101.04000000.00000000' => { Name => 'PARAMETRIC', Type => 'Node' }, + # '060e2b34.0101.0101.04010000.00000000' => { Name => 'VideoAndImageEssenceCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04010100.00000000' => { Name => 'FundamentalImageCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04010101.00000000' => { Name => 'AspectRatios', Type => 'Node' }, + '060e2b34.0101.0101.04010101.01000000' => { Name => 'PresentationAspectRatio', Format => 'rational64s' }, + '060e2b34.0101.0101.04010101.02000000' => { Name => 'CaptureAspectRatio', Format => 'string' }, + # '060e2b34.0101.0101.04010200.00000000' => { Name => 'ImageSourceCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04010201.00000000' => { Name => 'Opto-ElectronicFormulation', Type => 'Node' }, + # '060e2b34.0101.0101.04010201.01000000' => { Name => 'TransferCharacteristics', Type => 'Node' }, + '060e2b34.0101.0101.04010201.01010000' => { Name => 'CaptureGammaEquation', Format => 'string' }, + '060e2b34.0101.0101.04010201.01010100' => { Name => 'CaptureGammaEquation', Format => 'rational64s' }, + '060e2b34.0101.0101.04010201.01020000' => { Name => 'LumaEquation', Format => 'string' }, + '060e2b34.0101.0101.04010201.01030000' => { Name => 'ColorimetryCode', Format => 'string' }, + '060e2b34.0101.0101.04010201.01040000' => { Name => 'SignalFormCode', Format => 'string' }, + # '060e2b34.0101.0101.04010300.00000000' => { Name => 'VideoAndImageScanningParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04010301.00000000' => { Name => 'TemporalParameters', Type => 'Node' }, + '060e2b34.0101.0101.04010301.01000000' => { Name => 'ColorFieldCode', Format => 'int8u' }, + '060e2b34.0101.0101.04010301.02000000' => { Name => 'FieldRate', Format => 'int16u' }, + '060e2b34.0101.0101.04010301.03000000' => { Name => 'FrameRate', Format => 'int16u' }, + '060e2b34.0101.0101.04010301.04000000' => { Name => 'FrameLayout', Format => 'int8u' }, + '060e2b34.0101.0101.04010301.05000000' => { Name => 'SamplingStructureCode', Format => 'string' }, + # '060e2b34.0101.0101.04010302.00000000' => { Name => 'VerticalParameters', Type => 'Node' }, + '060e2b34.0101.0101.04010302.01000000' => { Name => 'TotalLinesperFrame', Format => 'int16u' }, + '060e2b34.0101.0101.04010302.02000000' => { Name => 'ActiveLinesperFrame', Format => 'int16u' }, + '060e2b34.0101.0101.04010302.03000000' => { Name => 'LeadingLines', Format => 'int32s' }, + '060e2b34.0101.0101.04010302.04000000' => { Name => 'TrailingLines', Format => 'int32s' }, + # '060e2b34.0101.0101.04010303.00000000' => { Name => 'HorizontalParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04010400.00000000' => { Name => 'AnalogVideoCodingCharacteristics', Type => 'Node' }, + '060e2b34.0101.0101.04010401.00000000' => { Name => 'AnalogVideoSystemName', Format => 'string' }, + # '060e2b34.0101.0101.04010500.00000000' => { Name => 'DigitalVideoAndImageCodingParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04010501.00000000' => { Name => 'DigitalVideoAndImageSamplingParameters', Type => 'Node' }, + '060e2b34.0101.0101.04010501.01000000' => { Name => 'LuminanceSampleRate', Format => 'int8u' }, + '060e2b34.0101.0101.04010501.02000000' => { Name => 'ActiveSamplesperLine', Format => 'int16u' }, + '060e2b34.0101.0101.04010501.03000000' => { Name => 'TotalSamplesperLine', Format => 'int16u' }, + '060e2b34.0101.0101.04010501.04000000' => { Name => 'SamplingHierarchyCode', Format => 'string' }, + '060e2b34.0101.0101.04010501.05000000' => { Name => 'HorizontalSubsampling', Format => 'int32u' }, + '060e2b34.0101.0101.04010501.06000000' => { Name => 'ColorSiting', Format => 'int8u' }, + '060e2b34.0101.0101.04010501.07000000' => { Name => 'SampledHeight', Format => 'int32u' }, + '060e2b34.0101.0101.04010501.08000000' => { Name => 'SampledWidth', Format => 'int32u' }, + '060e2b34.0101.0101.04010501.09000000' => { Name => 'SampledXOffset', Format => 'int32s' }, + '060e2b34.0101.0101.04010501.0a000000' => { Name => 'SampledYOffset', Format => 'int32s' }, + '060e2b34.0101.0101.04010501.0b000000' => { Name => 'DisplayHeight', Format => 'int32u' }, + '060e2b34.0101.0101.04010501.0c000000' => { Name => 'DisplayWidth', Format => 'int32u' }, + '060e2b34.0101.0101.04010501.0d000000' => { Name => 'DisplayXOffset', Format => 'int32s' }, + '060e2b34.0101.0101.04010501.0e000000' => { Name => 'DisplayYOffset', Format => 'int32s' }, + '060e2b34.0101.0101.04010501.0f000000' => { Name => 'FilteringCode', Format => 'string' }, + # '060e2b34.0101.0101.04010502.00000000' => { Name => 'DigitalVideoAndImageStorageParameters', Type => 'Node' }, + '060e2b34.0101.0101.04010502.01000000' => { Name => 'ImageHeight', Format => 'int32u' }, # (renamed from StoredHeight) + '060e2b34.0101.0101.04010502.02000000' => { Name => 'ImageWidth', Format => 'int32u' }, # (renamed from StoredWidth) + # '060e2b34.0101.0101.04010503.00000000' => { Name => 'DigitalQuantizationAndLevelParameters', Type => 'Node' }, + '060e2b34.0101.0101.04010503.01000000' => { Name => 'BitsPerPixel', Format => 'int8u' }, + '060e2b34.0101.0101.04010503.02000000' => { Name => 'RoundingMethodCode', Format => 'string' }, + '060e2b34.0101.0101.04010503.03000000' => { Name => 'BlackReferenceLevel', Format => 'int32u' }, + '060e2b34.0101.0101.04010503.04000000' => { Name => 'WhiteReferenceLevel', Format => 'int32u' }, + # '060e2b34.0101.0101.04010600.00000000' => { Name => 'DigitalVideoAndImageCompressionParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04010602.00000000' => { Name => 'MPEGCodingParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04010602.01000000' => { Name => 'MPEG-2CodingParameters', Type => 'Node' }, + '060e2b34.0101.0101.04010602.01010000' => { Name => 'FieldFrameTypeCode', Format => 'string' }, + # '060e2b34.0101.0101.04010800.00000000' => { Name => 'Film-to-VideoCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04010801.00000000' => { Name => 'FilmPulldownCharacteristics', Type => 'Node' }, + '060e2b34.0101.0101.04010801.01000000' => { Name => 'PulldownSequence', Type => 'PulldownKind', Unknown => 1 }, + '060e2b34.0101.0101.04010801.02000000' => { Name => 'PulldownFieldDominance', Type => 'Boolean' }, + '060e2b34.0101.0101.04010801.03000000' => { Name => 'VideoAndFilmFrameRelationship', Format => 'int8u' }, + # '060e2b34.0101.0101.04010802.00000000' => { Name => 'FilmFrameRates', Type => 'Node' }, + '060e2b34.0101.0101.04010802.01000000' => { Name => 'CaptureFilmFrameRate', Format => 'string' }, + '060e2b34.0101.0101.04010802.02000000' => { Name => 'TransferFilmFrameRate', Format => 'string' }, + # '060e2b34.0101.0101.04011000.00000000' => { Name => 'ImageTestParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04011001.00000000' => { Name => 'VideoTestParameters', Type => 'Node' }, + '060e2b34.0101.0101.04011001.01000000' => { Name => 'VideoTestParameter', Format => 'string' }, + '060e2b34.0101.0101.04011001.02000000' => { Name => 'VideoTestResult', Format => 'float' }, + '060e2b34.0101.0101.04011001.03000000' => { Name => 'VideoTestResult', Format => 'int32u' }, + # '060e2b34.0101.0101.04011002.00000000' => { Name => 'FilmTestParameters', Type => 'Node' }, + '060e2b34.0101.0101.04011002.01000000' => { Name => 'FilmTestParameter', Format => 'string' }, + '060e2b34.0101.0101.04011002.02000000' => { Name => 'FilmTestResult', Format => 'float' }, + '060e2b34.0101.0101.04011002.03000000' => { Name => 'FilmTestResult', Type => 'SIMSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.04020000.00000000' => { Name => 'AudioEssenceCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04020100.00000000' => { Name => 'FundamentalAudioCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04020101.00000000' => { Name => 'AudioFormulation', Type => 'Node' }, + '060e2b34.0101.0101.04020101.01000000' => { Name => 'ElectrospatialFormulation', Format => 'int8u', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0101.04020101.02000000' => { Name => 'FilteringApplied', Format => 'string', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0101.04020101.03000000' => { Name => 'AudioReferenceLevel', Format => 'int8s', Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0101.04020101.10000000' => { Name => 'AudioMix', Type => 'Node' }, + '060e2b34.0101.0101.04020101.10010000' => { Name => 'AudioMonoChannelCount', Format => 'int8u', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0101.04020101.10020000' => { Name => 'AudioStereoChannelCount', Format => 'int8u', Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0101.04020200.00000000' => { Name => 'AnalogAudioCodingParameters', Type => 'Node' }, + '060e2b34.0101.0101.04020201.00000000' => { Name => 'AnalogSystem', Format => 'string', Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0101.04020300.00000000' => { Name => 'DigitalAudioCodingParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04020301.00000000' => { Name => 'DigitalSamplingParameters', Type => 'Node' }, + '060e2b34.0101.0101.04020301.01000000' => { Name => 'AudioSampleRate', Format => 'int8u', Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0101.04020302.00000000' => { Name => 'DigitalAudioStorageParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04020303.00000000' => { Name => 'DigitalAudioQuantizationAndLevelParameters', Type => 'Node' }, + '060e2b34.0101.0101.04020303.01000000' => { Name => 'BitsPerSample', Format => 'int8u', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0101.04020303.02000000' => { Name => 'RoundingLaw', Format => 'string', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0101.04020303.03000000' => { Name => 'Dither', Format => 'string', Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0101.04020400.00000000' => { Name => 'DigitalAudioCompressionParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04020403.00000000' => { Name => 'MPEGAudioCodingParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04020403.01000000' => { Name => 'MPEG-1AudioCodingParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04020800.00000000' => { Name => 'FilmSoundSource', Type => 'Node' }, + '060e2b34.0101.0101.04020801.00000000' => { Name => 'OpticalTrack', Format => 'string' }, + '060e2b34.0101.0101.04020802.00000000' => { Name => 'MagneticTrack', Format => 'string' }, + # '060e2b34.0101.0101.04021000.00000000' => { Name => 'AudioTestParameters', Type => 'Node' }, + '060e2b34.0101.0101.04021001.00000000' => { Name => 'Signal-to-NoiseRatio', Format => 'float', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0101.04021002.00000000' => { Name => 'Weighting', Format => 'string', Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0101.04030000.00000000' => { Name => 'DataEssenceCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04030100.00000000' => { Name => 'FundamentalDataEssenceParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04030200.00000000' => { Name => 'AnalogDataEssenceCodingParameters', Type => 'Node' }, + '060e2b34.0101.0101.04030201.00000000' => { Name => 'AnalogDataCodingKind', Format => 'string' }, + # '060e2b34.0101.0101.04030300.00000000' => { Name => 'DigitalDataEssenceCodingParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04031000.00000000' => { Name => 'DataEssenceTestParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04040000.00000000' => { Name => 'MetadataCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04040100.00000000' => { Name => 'FundamentalMetadataCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04040101.00000000' => { Name => 'TimecodeCharacteristics', Type => 'Node' }, + '060e2b34.0101.0101.04040101.01000000' => { Name => 'TimecodeKind', Format => 'string' }, + '060e2b34.0101.0101.04040101.02000000' => { Name => 'TimecodeTimebase', Format => 'int8u' }, + '060e2b34.0101.0101.04040101.03000000' => { Name => 'TimecodeUserBitsFlag', Type => 'Boolean' }, + '060e2b34.0101.0101.04040101.04000000' => { Name => 'IncludeSync', Type => 'Boolean' }, + '060e2b34.0101.0101.04040101.05000000' => { Name => 'DropFrame', Type => 'Boolean' }, + # '060e2b34.0101.0101.04040200.00000000' => { Name => 'AnalogMetadataCodingCharacteristics', Type => 'Node' }, + '060e2b34.0101.0101.04040201.00000000' => { Name => 'TimecodeSourceKind', Format => 'int8u' }, + '060e2b34.0101.0101.04040202.00000000' => { Name => 'AnalogMetadataCarrier', Format => 'string' }, + # '060e2b34.0101.0101.04040300.00000000' => { Name => 'DigitalMetadataCodingCharacteristics', Type => 'Node' }, + '060e2b34.0101.0101.04040301.00000000' => { Name => 'DigitalMetadataCarrier', Format => 'string' }, + # '060e2b34.0101.0101.04041000.00000000' => { Name => 'MetadataTestParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04050000.00000000' => { Name => 'MonitoringAndControlCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04050100.00000000' => { Name => 'FundamentalMonitoringAndControlCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04050200.00000000' => { Name => 'AnalogMonitoringAndControlCodingCharacteristics', Type => 'Node' }, + '060e2b34.0101.0101.04050201.00000000' => { Name => 'AnalogMonitoringAndControlCodingKind', Format => 'string' }, + # '060e2b34.0101.0101.04050300.00000000' => { Name => 'DigitalMonitoringAndControlCodingParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04050301.00000000' => { Name => 'DigitalMonitoringAndControlSamplingParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04051000.00000000' => { Name => 'MonitoringAndControlTestParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04060000.00000000' => { Name => 'GeneralCodingCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04060100.00000000' => { Name => 'GeneralEssenceCodingCharacteristics', Type => 'Node' }, + '060e2b34.0101.0101.04060101.00000000' => { Name => 'SampleRate', Format => 'rational64s' }, + '060e2b34.0101.0101.04060102.00000000' => { Name => 'EssenceLength', Type => 'Length', %duration }, + # '060e2b34.0101.0101.04080000.00000000' => { Name => 'ObjectCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04100000.00000000' => { Name => 'MediumCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04100100.00000000' => { Name => 'StorageMediumParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04100101.00000000' => { Name => 'TapeMediumParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04100102.00000000' => { Name => 'DiscMediumParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04100103.00000000' => { Name => 'FilmMediumParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04100103.01000000' => { Name => 'GenericFilmMediumParameters', Type => 'Node' }, + '060e2b34.0101.0101.04100103.01010000' => { Name => 'FilmColorProcess', Format => 'string' }, + '060e2b34.0101.0101.04100103.01020000' => { Name => 'EdgeCodeFormat', Type => 'EdgeType', Unknown => 1 }, + '060e2b34.0101.0101.04100103.01040000' => { Name => 'FilmFormatName', Format => 'string' }, + '060e2b34.0101.0101.04100103.01050000' => { Name => 'FilmStockKind', Format => 'string' }, + '060e2b34.0101.0101.04100103.01060000' => { Name => 'FilmStockManufacturerName', Format => 'string' }, + # '060e2b34.0101.0101.04100103.02000000' => { Name => 'SpecificFilmMediumParameters', Type => 'Node' }, + '060e2b34.0101.0101.04100103.02010000' => { Name => 'PhysicalMediaLength', Type => 'UIMSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + '060e2b34.0101.0101.04100103.02020000' => { Name => 'FilmCaptureAperture', Format => 'string' }, + # '060e2b34.0101.0101.04200000.00000000' => { Name => 'DeviceCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04200100.00000000' => { Name => 'CameraCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04200101.00000000' => { Name => 'ImageCharacteristics', Type => 'Node' }, + '060e2b34.0101.0101.04200101.01000000' => { Name => 'ImageCategory', Format => 'string' }, + # '060e2b34.0101.0101.04200102.01000000' => { Name => 'ImageDevices', Type => 'Node' }, + '060e2b34.0101.0101.04200102.01010000' => { Name => 'ImageSourceDeviceKind', Format => 'string' }, + # '060e2b34.0101.0101.04200200.00000000' => { Name => 'OpticalCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.04200201.00000000' => { Name => 'OpticalTestParameters', Type => 'Node' }, + # '060e2b34.0101.0101.04200201.01000000' => { Name => 'OpticalDeviceParameters', Type => 'Node' }, + '060e2b34.0101.0101.04200201.01010000' => { Name => 'OpticalTestParameterName', Format => 'string' }, + '060e2b34.0101.0101.04200201.01020000' => { Name => 'OpticalTestResult', Format => 'float' }, + '060e2b34.0101.0101.04200201.01030000' => { Name => 'OpticalTestResult', Format => 'int32s' }, + # '060e2b34.0101.0101.04200300.00000000' => { Name => 'MicrophoneCharacteristics', Type => 'Node' }, + '060e2b34.0101.0101.04200301.00000000' => { Name => 'SensorType', Format => 'string' }, + '060e2b34.0101.0101.04200302.00000000' => { Name => 'PolarCharacteristic', Format => 'string' }, + # '060e2b34.0101.0101.05000000.00000000' => { Name => 'PROCESS', Type => 'Node' }, + # '060e2b34.0101.0101.05010000.00000000' => { Name => 'GeneralProcessIndicators', Type => 'Node' }, + # '060e2b34.0101.0101.05010100.00000000' => { Name => 'ProcessFundamentals', Type => 'Node' }, + '060e2b34.0101.0101.05010101.00000000' => { Name => 'IntegrationIndication', Format => 'string' }, + '060e2b34.0101.0101.05010102.00000000' => { Name => 'EventIndication', Format => 'string' }, + '060e2b34.0101.0101.05010103.00000000' => { Name => 'QualityFlag', Type => 'Boolean' }, + '060e2b34.0101.0101.05010105.00000000' => { Name => 'PhysicalInstanceKind', Format => 'string' }, + # '060e2b34.0101.0101.05010200.00000000' => { Name => 'ContentCapture', Type => 'Node' }, + '060e2b34.0101.0101.05010201.00000000' => { Name => 'DigitalOrAnalogOrigination', Format => 'string' }, + # '060e2b34.0101.0101.05010202.00000000' => { Name => 'VideoOrImageCaptureProcess', Type => 'Node' }, + # '060e2b34.0101.0101.05010203.00000000' => { Name => 'FilmCaptureProcess', Type => 'Node' }, + # '060e2b34.0101.0101.05010204.00000000' => { Name => 'AudioCaptureProcess', Type => 'Node' }, + '060e2b34.0101.0101.05010204.01000000' => { Name => 'MicrophonePlacementTechniques', Format => 'string', Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0101.05010205.00000000' => { Name => 'DataCaptureProcess', Type => 'Node' }, + # '060e2b34.0101.0101.05010300.00000000' => { Name => 'Manipulation', Type => 'Node' }, + '060e2b34.0101.0101.05010301.00000000' => { Name => 'SimpleFlaggingCount', Format => 'int16u' }, + '060e2b34.0101.0101.05010302.00000000' => { Name => 'CopyCount', Format => 'int8u' }, + '060e2b34.0101.0101.05010303.00000000' => { Name => 'CloneCount', Format => 'int8u' }, + '060e2b34.0101.0101.05010304.00000000' => { Name => 'Work-in-ProgressFlag', Type => 'Boolean' }, + # '060e2b34.0101.0101.05020000.00000000' => { Name => 'CompressionProcessing', Type => 'Node' }, + # '060e2b34.0101.0101.05020100.00000000' => { Name => 'VideoOrImageCompression', Type => 'Node' }, + '060e2b34.0101.0101.05020101.00000000' => { Name => 'VideoOrImageCompressionAlgorithm', Format => 'string' }, + # '060e2b34.0101.0101.05020102.00000000' => { Name => 'MPEGProcessing', Type => 'Node' }, + # '060e2b34.0101.0101.05020102.01000000' => { Name => 'MPEG-2Processing', Type => 'Node' }, + '060e2b34.0101.0101.05020102.01010000' => { Name => 'SplicingMetadata', Unknown => 1 }, + # '060e2b34.0101.0101.05020200.00000000' => { Name => 'AudioCompression', Type => 'Node' }, + '060e2b34.0101.0101.05020201.00000000' => { Name => 'AudioCompressionAlgorithm', Format => 'string', Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0101.05020300.00000000' => { Name => 'DataEssenceCompression', Type => 'Node' }, + # '060e2b34.0101.0101.05020400.00000000' => { Name => 'MetadataCompression', Type => 'Node' }, + # '060e2b34.0101.0101.05030000.00000000' => { Name => 'NoiseReductionProcessing', Type => 'Node' }, + # '060e2b34.0101.0101.05030100.00000000' => { Name => 'VideoNoiseReduction', Type => 'Node' }, + '060e2b34.0101.0101.05030101.00000000' => { Name => 'VideoNoiseReductionAlgorithm', Format => 'string' }, + # '060e2b34.0101.0101.05030200.00000000' => { Name => 'AudioNoiseReduction', Type => 'Node' }, + '060e2b34.0101.0101.05030201.00000000' => { Name => 'AudioNoiseReductionAlgorithm', Format => 'string', Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0101.05200000.00000000' => { Name => 'EnhancementOrModification', Type => 'Node' }, + # '060e2b34.0101.0101.05200100.00000000' => { Name => 'ImageEssenceProcessing', Type => 'Node' }, + '060e2b34.0101.0101.05200101.00000000' => { Name => 'EnhancementOrModificationDescription', Format => 'string' }, + # '060e2b34.0101.0101.05200200.00000000' => { Name => 'VideoProcessOrSettings', Type => 'Node' }, + '060e2b34.0101.0101.05200201.00000000' => { Name => 'VideoDeviceKind', Format => 'string' }, + '060e2b34.0101.0101.05200202.00000000' => { Name => 'VideoDeviceParameterName', Format => 'string' }, + '060e2b34.0101.0101.05200203.00000000' => { Name => 'VideoDeviceParameterSetting', Format => 'string' }, + # '060e2b34.0101.0101.05200300.00000000' => { Name => 'AudioEssenceProcessing', Type => 'Node' }, + '060e2b34.0101.0101.05200301.00000000' => { Name => 'AudioEnhancementOrModificationDescription', Format => 'string', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0101.05200302.00000000' => { Name => 'AudioFirstMix-DownProcess', Format => 'string', Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0101.05200400.00000000' => { Name => 'AudioProcessorSettings', Type => 'Node' }, + '060e2b34.0101.0101.05200401.00000000' => { Name => 'AudioDeviceKind', Format => 'string', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0101.05200402.00000000' => { Name => 'AudioDeviceParameter', Format => 'string', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0101.05200403.00000000' => { Name => 'AudioDeviceParameterSetting', Format => 'string', Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0101.05200500.00000000' => { Name => 'DataEssenceProcessing', Type => 'Node' }, + '060e2b34.0101.0101.05200501.00000000' => { Name => 'DataEnhancementOrModificationDescription', Format => 'string' }, + # '060e2b34.0101.0101.05200600.00000000' => { Name => 'DataProcessorSettings', Type => 'Node' }, + '060e2b34.0101.0101.05200601.00000000' => { Name => 'DataDeviceKind', Format => 'string' }, + '060e2b34.0101.0101.05200602.00000000' => { Name => 'DataDeviceParameterName', Format => 'string' }, + '060e2b34.0101.0101.05200603.00000000' => { Name => 'DataDeviceParameterSetting', Format => 'string' }, + # '060e2b34.0101.0101.05200700.00000000' => { Name => 'MetadataProcessing', Type => 'Node' }, + # '060e2b34.0101.0101.05200800.00000000' => { Name => 'MetadataProcessorSettings', Type => 'Node' }, + # '060e2b34.0101.0101.05300000.00000000' => { Name => 'EditingInformation', Type => 'Node' }, + # '060e2b34.0101.0101.05300100.00000000' => { Name => 'EditingVersionInformation', Type => 'Node' }, + # '060e2b34.0101.0101.05300200.00000000' => { Name => 'EditingDecisionInformation', Type => 'Node' }, + '060e2b34.0101.0101.05300201.00000000' => { Name => 'DefaultFadeType', Type => 'FadeType', Unknown => 1 }, + # '060e2b34.0101.0101.05300300.00000000' => { Name => 'EditingMatteInformation', Type => 'Node' }, + # '060e2b34.0101.0101.05300400.00000000' => { Name => 'EditingEventInformation', Type => 'Node' }, + '060e2b34.0101.0101.05300401.00000000' => { Name => 'ActiveState', Type => 'Boolean' }, + # '060e2b34.0101.0101.05300500.00000000' => { Name => 'EditingEffectInformation', Type => 'Node' }, + '060e2b34.0101.0101.05300501.00000000' => { Name => 'Fade-InType', Type => 'FadeType', Unknown => 1 }, + '060e2b34.0101.0101.05300502.00000000' => { Name => 'Fade-OutType', Type => 'FadeType', Unknown => 1 }, + '060e2b34.0101.0101.05300503.00000000' => { Name => 'SpeedChangeEffectFlag', Type => 'Boolean' }, + '060e2b34.0101.0101.05300504.00000000' => { Name => 'InputSegmentCount', Format => 'int32s' }, + '060e2b34.0101.0101.05300505.00000000' => { Name => 'Bypass', Format => 'int32u' }, + # '060e2b34.0101.0101.05300600.00000000' => { Name => 'EditingWebInformation', Type => 'Node' }, + # '060e2b34.0101.0101.05300700.00000000' => { Name => 'EditingUserNotes', Type => 'Node' }, + # '060e2b34.0101.0101.05400000.00000000' => { Name => 'ProcessingHistory', Type => 'Node' }, + # '060e2b34.0101.0101.05400100.00000000' => { Name => 'VideoCompressionHistory', Type => 'Node' }, + '060e2b34.0101.0101.05400101.00000000' => { Name => 'VideoCompressionAlgorithm', Format => 'string' }, + '060e2b34.0101.0101.05400102.00000000' => { Name => 'MPEGVideoRecodingDataset', Unknown => 1 }, + # '060e2b34.0101.0101.05400200.00000000' => { Name => 'AudioCompressionHistory', Type => 'Node' }, + '060e2b34.0101.0101.05400201.00000000' => { Name => 'UpstreamAudioCompressionAlgorithm', Format => 'string', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0101.05400202.00000000' => { Name => 'MPEGAudioRecodingDataset', Unknown => 1, Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0101.05400300.00000000' => { Name => 'DataCompressionHistory', Type => 'Node' }, + # '060e2b34.0101.0101.05400400.00000000' => { Name => 'MetadataCompressionHistory', Type => 'Node' }, + # '060e2b34.0101.0101.06000000.00000000' => { Name => 'RELATIONAL', Type => 'Node' }, + # '060e2b34.0101.0101.06010000.00000000' => { Name => 'GenericRelationships', Type => 'Node' }, + # '060e2b34.0101.0101.06010100.00000000' => { Name => 'EssenceAndMetadataRelationships', Type => 'Node' }, + # '060e2b34.0101.0101.06010101.00000000' => { Name => 'EssenceToEssenceRelationships', Type => 'Node' }, + # '060e2b34.0101.0101.06010102.00000000' => { Name => 'MetadataToEssenceRelationships', Type => 'Node' }, + # '060e2b34.0101.0101.06010103.00000000' => { Name => 'MetadataToMetadataRelationships', Type => 'Node' }, + # '060e2b34.0101.0101.06010104.00000000' => { Name => 'ObjectToObjectRelationships', Type => 'Node' }, + # '060e2b34.0101.0101.06010105.00000000' => { Name => 'MetadataToObjectRelationships', Type => 'Node' }, + # '060e2b34.0101.0101.06020000.00000000' => { Name => 'RelatedProductionMaterial', Type => 'Node' }, + '060e2b34.0101.0101.06020100.00000000' => { Name => 'ProgramSupportMaterialReference', Format => 'string' }, + '060e2b34.0101.0101.06020200.00000000' => { Name => 'AdvertisingMaterialReference', Format => 'string' }, + '060e2b34.0101.0101.06020300.00000000' => { Name => 'ProgramCommercialMaterialReference', Format => 'string' }, + # '060e2b34.0101.0101.06080000.00000000' => { Name => 'StreamAndStorageRelationships', Type => 'Node' }, + # '060e2b34.0101.0101.06080100.00000000' => { Name => 'StreamRelationships', Type => 'Node' }, + # '060e2b34.0101.0101.06080200.00000000' => { Name => 'StorageRelationships', Type => 'Node' }, + '060e2b34.0101.0101.06080201.00000000' => { Name => 'ContiguousDataFlag', Type => 'Boolean' }, + # '060e2b34.0101.0101.06100000.00000000' => { Name => 'NumericalSequence', Type => 'Node' }, + '060e2b34.0101.0101.06100100.00000000' => { Name => 'PositionInSequence', Format => 'int32u' }, + '060e2b34.0101.0101.06100200.00000000' => { Name => 'RelativePositionInSequenceOffset', Format => 'int32s' }, + '060e2b34.0101.0101.06100300.00000000' => { Name => 'RelativePositionInSequenceName', Format => 'string' }, + # '060e2b34.0101.0101.07000000.00000000' => { Name => 'SPATIO-TEMPORAL', Type => 'Node' }, + # '060e2b34.0101.0101.07010000.00000000' => { Name => 'PositionAndSpaceVectors', Type => 'Node' }, + # '060e2b34.0101.0101.07010100.00000000' => { Name => 'PositionalSystemInformation', Type => 'Node' }, + '060e2b34.0101.0101.07010101.00000000' => { Name => 'ImageCoordinateSystem', Format => 'string' }, + '060e2b34.0101.0101.07010102.00000000' => { Name => 'MapDatumUsed', Format => 'string' }, + # '060e2b34.0101.0101.07010200.00000000' => { Name => 'PositionalInformation', Type => 'Node' }, + # '060e2b34.0101.0101.07010201.00000000' => { Name => 'AbsolutePosition', Type => 'Node' }, + # '060e2b34.0101.0101.07010201.01000000' => { Name => 'LocalDatumAbsolutePosition', Type => 'Node' }, + '060e2b34.0101.0101.07010201.01010000' => { Name => 'LocalDatumAbsolutePositionAccuracy', Format => 'float' }, + # '060e2b34.0101.0101.07010201.02000000' => { Name => 'DeviceAbsolutePosition', Type => 'Node' }, + '060e2b34.0101.0101.07010201.02010000' => { Name => 'DeviceAbsolutePositionalAccuracy', Format => 'float' }, + '060e2b34.0101.0101.07010201.02020000' => { Name => 'DeviceAltitude', Format => 'float', Groups => { 2 => 'Location' }, PrintConv => '$val m' }, + '060e2b34.0101.0101.07010201.02020100' => { Name => 'DeviceAltitude', Type => 'Alt', Groups => { 2 => 'Location' }, PrintConv => '$val m' }, + '060e2b34.0101.0101.07010201.02040000' => { Name => 'DeviceLatitude', Format => 'float', %geoLat }, + '060e2b34.0101.0101.07010201.02040100' => { Name => 'DeviceLatitude', Type => 'Lat', %geoLat }, + '060e2b34.0101.0101.07010201.02060000' => { Name => 'DeviceLongitude', Format => 'float', %geoLon }, + '060e2b34.0101.0101.07010201.02060100' => { Name => 'DeviceLongitude', Type => 'Lon', %geoLon }, + '060e2b34.0101.0101.07010201.02100000' => { Name => 'DeviceXDimension', Format => 'float' }, + '060e2b34.0101.0101.07010201.02110000' => { Name => 'DeviceYDimension', Format => 'float' }, + # '060e2b34.0101.0101.07010201.03000000' => { Name => 'SubjectAbsolutePosition', Type => 'Node' }, + '060e2b34.0101.0101.07010201.03010000' => { Name => 'FramePositionalAccuracy', Format => 'float' }, + '060e2b34.0101.0101.07010201.03020000' => { Name => 'FrameCenterLatitude', Format => 'double', %geoLat }, + '060e2b34.0101.0101.07010201.03030000' => { Name => 'FrameCenterLatitude', Format => 'string', %geoLat, ValueConv => \&ConvLatLon }, + '060e2b34.0101.0101.07010201.03040000' => { Name => 'FrameCenterLongitude', Format => 'double', %geoLon }, + '060e2b34.0101.0101.07010201.03050000' => { Name => 'FrameCenterLongitude', Format => 'string', %geoLon, ValueConv => \&ConvLatLon }, + '060e2b34.0101.0101.07010201.03060000' => { Name => 'FrameCenterLatitudeLongitude', Format => 'string', %geoLatLon, ValueConv => \&ConvLatLon }, + # '060e2b34.0101.0101.07010202.00000000' => { Name => 'RelativePosition', Type => 'Node' }, + # '060e2b34.0101.0101.07010202.01000000' => { Name => 'LocalDatumRelativePosition', Type => 'Node' }, + '060e2b34.0101.0101.07010202.01010000' => { Name => 'LocalDatumRelativePositionAccuracy', Format => 'float' }, + # '060e2b34.0101.0101.07010202.02000000' => { Name => 'DeviceRelativePosition', Type => 'Node' }, + '060e2b34.0101.0101.07010202.02010000' => { Name => 'DeviceRelativePositionalAccuracy', Format => 'float' }, + '060e2b34.0101.0101.07010202.02020000' => { Name => 'DeviceRelativePositionX', Format => 'float' }, + '060e2b34.0101.0101.07010202.02030000' => { Name => 'DeviceRelativePositionY', Format => 'float' }, + '060e2b34.0101.0101.07010202.02040000' => { Name => 'DeviceRelativePositionZ', Format => 'float' }, + # '060e2b34.0101.0101.07010202.03000000' => { Name => 'SubjectRelativePosition', Type => 'Node' }, + '060e2b34.0101.0101.07010202.03010000' => { Name => 'SubjectRelativePositionalAccuracy', Format => 'float' }, + # '060e2b34.0101.0101.07010203.00000000' => { Name => 'ImagePositionalInformation', Type => 'Node' }, + '060e2b34.0101.0101.07010203.01000000' => { Name => 'PositionWithinViewportImageXCoordinate', Format => 'int16s' }, + '060e2b34.0101.0101.07010203.02000000' => { Name => 'PositionWithinViewportImageYCoordinate', Format => 'int16s' }, + '060e2b34.0101.0101.07010203.03000000' => { Name => 'SourceImageCenterXCoordinate', Format => 'int16s' }, + '060e2b34.0101.0101.07010203.04000000' => { Name => 'SourceImageCenterYCoordinate', Format => 'int16s' }, + '060e2b34.0101.0101.07010203.05000000' => { Name => 'ViewportImageCenterCCoordinate', Format => 'int16s' }, + '060e2b34.0101.0101.07010203.06000000' => { Name => 'ViewportImageCenterYCoordinate', Format => 'int16s' }, + # '060e2b34.0101.0101.07010300.00000000' => { Name => 'RateAndDirectionOfPositionalChange', Type => 'Node' }, + # '060e2b34.0101.0101.07010301.00000000' => { Name => 'AbsoluteRateAndDirectionOfPositionalChange', Type => 'Node' }, + # '060e2b34.0101.0101.07010301.01000000' => { Name => 'DeviceRateAndDirectionOfPositionalChange', Type => 'Node' }, + '060e2b34.0101.0101.07010301.01010000' => { Name => 'DeviceAbsoluteSpeed', Format => 'float' }, + '060e2b34.0101.0101.07010301.01020000' => { Name => 'DeviceAbsoluteHeading', Format => 'float' }, + # '060e2b34.0101.0101.07010301.02000000' => { Name => 'SubjectRateAndDirectionOfPositionalChange', Type => 'Node' }, + '060e2b34.0101.0101.07010301.02010000' => { Name => 'SubjectAbsoluteSpeed', Format => 'float' }, + '060e2b34.0101.0101.07010301.02020000' => { Name => 'SubjectAbsoluteHeading', Format => 'float' }, + # '060e2b34.0101.0101.07010302.00000000' => { Name => 'RelativeRateAndDirectionOfPositionalChange', Type => 'Node' }, + # '060e2b34.0101.0101.07010302.01000000' => { Name => 'DeviceRelativeRateAndDirectionOfPositionalChange', Type => 'Node' }, + '060e2b34.0101.0101.07010302.01010000' => { Name => 'DeviceRelativeSpeed', Format => 'float' }, + '060e2b34.0101.0101.07010302.01020000' => { Name => 'DeviceRelativeHeading', Format => 'float' }, + # '060e2b34.0101.0101.07010302.02000000' => { Name => 'SubjectRelativeRateAndDirectionOfPositionalChange', Type => 'Node' }, + '060e2b34.0101.0101.07010302.02010000' => { Name => 'SubjectRelativeSpeed', Format => 'float' }, + '060e2b34.0101.0101.07010302.02020000' => { Name => 'SubjectRelativeHeading', Format => 'float' }, + # '060e2b34.0101.0101.07010800.00000000' => { Name => 'DistanceMeasurements', Type => 'Node' }, + # '060e2b34.0101.0101.07010801.00000000' => { Name => 'DeviceToSubjectDistance', Type => 'Node' }, + '060e2b34.0101.0101.07010801.01000000' => { Name => 'SlantRange', Format => 'float' }, + # '060e2b34.0101.0101.07010900.00000000' => { Name => 'Dimensions', Type => 'Node' }, + # '060e2b34.0101.0101.07010901.00000000' => { Name => 'DeviceDimensions', Type => 'Node' }, + # '060e2b34.0101.0101.07010902.00000000' => { Name => 'SubjectDimensions', Type => 'Node' }, + '060e2b34.0101.0101.07010902.01000000' => { Name => 'TargetWidth', Format => 'float' }, + # '060e2b34.0101.0101.07010903.00000000' => { Name => 'LocationDimensions', Type => 'Node' }, + # '060e2b34.0101.0101.07010904.00000000' => { Name => 'MediaDimensions', Type => 'Node' }, + # '060e2b34.0101.0101.07010904.01000000' => { Name => 'ImageDimensions', Type => 'Node' }, + # '060e2b34.0101.0101.07010904.01010000' => { Name => 'Pan-and-ScanImageDimensions', Type => 'Node' }, + '060e2b34.0101.0101.07010904.01010100' => { Name => 'ViewportHeight', Format => 'int16u' }, + '060e2b34.0101.0101.07010904.01010200' => { Name => 'ViewportWidth', Format => 'int16u' }, + # '060e2b34.0101.0101.07011000.00000000' => { Name => 'AngularSpecifications', Type => 'Node' }, + # '060e2b34.0101.0101.07011001.00000000' => { Name => 'DeviceAngles', Type => 'Node' }, + '060e2b34.0101.0101.07011001.01000000' => { Name => 'SensorRollAngle', Format => 'float' }, + '060e2b34.0101.0101.07011001.02000000' => { Name => 'AngleToNorth', Format => 'float' }, + '060e2b34.0101.0101.07011001.03000000' => { Name => 'ObliquityAngle', Format => 'float' }, + # '060e2b34.0101.0101.07011002.00000000' => { Name => 'SubjectAngles', Type => 'Node' }, + # '060e2b34.0101.0101.07012000.00000000' => { Name => 'AbstractLocations', Type => 'Node' }, + # '060e2b34.0101.0101.07012001.00000000' => { Name => 'PlaceNames', Type => 'Node' }, + # '060e2b34.0101.0101.07012001.01000000' => { Name => 'AbstractNames', Type => 'Node' }, + '060e2b34.0101.0101.07012001.01010000' => { Name => 'PlaceKeyword', Format => 'string' }, + # '060e2b34.0101.0101.07012001.02000000' => { Name => 'CountryCodes', Type => 'Node' }, + '060e2b34.0101.0101.07012001.02010000' => { Name => 'ObjectCountryCode', Format => 'string' }, + '060e2b34.0101.0101.07012001.02020000' => { Name => 'ShootingCountryCode', Format => 'string' }, + '060e2b34.0101.0101.07012001.02030000' => { Name => 'SettingCountryCode', Format => 'string' }, + '060e2b34.0101.0101.07012001.02040000' => { Name => 'CopyrightLicenseCountryCode', Format => 'string' }, + '060e2b34.0101.0101.07012001.02050000' => { Name => 'IntellectualPropertyLicenseCountryCode', Format => 'string' }, + # '060e2b34.0101.0101.07012001.03000000' => { Name => 'Regions', Type => 'Node' }, + '060e2b34.0101.0101.07012001.03010000' => { Name => 'ObjectRegionCode', Format => 'string' }, + '060e2b34.0101.0101.07012001.03020000' => { Name => 'ShootingRegionCode', Format => 'string' }, + '060e2b34.0101.0101.07012001.03030000' => { Name => 'SettingRegionCode', Format => 'string' }, + '060e2b34.0101.0101.07012001.03040000' => { Name => 'CopyrightLicenseRegionCode', Format => 'string' }, + '060e2b34.0101.0101.07012001.03050000' => { Name => 'IntellectualPropertyLicenseRegionCode', Format => 'string' }, + # '060e2b34.0101.0101.07012001.04000000' => { Name => 'Addresses', Type => 'Node' }, + # '060e2b34.0101.0101.07012001.04010000' => { Name => 'PostalAddresses', Type => 'Node' }, + '060e2b34.0101.0101.07012001.04010100' => { Name => 'RoomNumber', Format => 'string' }, + '060e2b34.0101.0101.07012001.04010200' => { Name => 'StreetNumber', Format => 'string' }, + '060e2b34.0101.0101.07012001.04010300' => { Name => 'StreetName', Format => 'string' }, + '060e2b34.0101.0101.07012001.04010400' => { Name => 'PostalTown', Format => 'string' }, + '060e2b34.0101.0101.07012001.04010500' => { Name => 'CityName', Format => 'string' }, + '060e2b34.0101.0101.07012001.04010600' => { Name => 'StateOrProvinceOrCountyName', Format => 'string' }, + '060e2b34.0101.0101.07012001.04010700' => { Name => 'PostalCode', Format => 'string' }, + '060e2b34.0101.0101.07012001.04010800' => { Name => 'CountryName', Format => 'string' }, + # '060e2b34.0101.0101.07012001.04020000' => { Name => 'SettingAddresses', Type => 'Node' }, + '060e2b34.0101.0101.07012001.04020100' => { Name => 'SettingRoomNumber', Format => 'string' }, + '060e2b34.0101.0101.07012001.04020200' => { Name => 'SettingStreetNumberOrBuildingName', Format => 'string' }, + '060e2b34.0101.0101.07012001.04020300' => { Name => 'SettingStreetName', Format => 'string' }, + '060e2b34.0101.0101.07012001.04020400' => { Name => 'SettingTownName', Format => 'string' }, + '060e2b34.0101.0101.07012001.04020500' => { Name => 'SettingCityName', Format => 'string' }, + '060e2b34.0101.0101.07012001.04020600' => { Name => 'SettingStateOrProvinceOrCountyName', Format => 'string' }, + '060e2b34.0101.0101.07012001.04020700' => { Name => 'SettingPostalCode', Format => 'string' }, + '060e2b34.0101.0101.07012001.04020800' => { Name => 'SettingCountryName', Format => 'string' }, + # '060e2b34.0101.0101.07012001.10030000' => { Name => 'ElectronicAddressInformation', Type => 'Node' }, + '060e2b34.0101.0101.07012001.10030100' => { Name => 'TelephoneNumber', Format => 'string' }, + '060e2b34.0101.0101.07012001.10030200' => { Name => 'FaxNumber', Format => 'string' }, + '060e2b34.0101.0101.07012001.10030300' => { Name => 'E-mailAddress', Format => 'string' }, + # '060e2b34.0101.0101.07012002.00000000' => { Name => 'PlaceDescriptions', Type => 'Node' }, + '060e2b34.0101.0101.07012002.01000000' => { Name => 'SettingDescription', Format => 'string' }, + # '060e2b34.0101.0101.07020000.00000000' => { Name => 'Temporal', Type => 'Node' }, + # '060e2b34.0101.0101.07020100.00000000' => { Name => 'DatesAndTimes', Type => 'Node' }, + # '060e2b34.0101.0101.07020101.00000000' => { Name => 'GeneralDatesAndTimes', Type => 'Node' }, + # '060e2b34.0101.0101.07020101.01000000' => { Name => 'UserDateTime', Type => 'Node' }, + '060e2b34.0101.0101.07020101.01010000' => { Name => 'UTCUserDateTime', Format => 'string', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0101.07020101.01020000' => { Name => 'LocalUserDateTime', Format => 'string', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0101.07020101.01030000' => { Name => 'SMPTE309MUserDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + '060e2b34.0101.0101.07020101.01040000' => { Name => 'SMPTE12MUserDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020102.00000000' => { Name => 'AbsoluteDatesAndTimes', Type => 'Node' }, + # '060e2b34.0101.0101.07020102.01000000' => { Name => 'MaterialStartTrueDateTime', Type => 'Node' }, + '060e2b34.0101.0101.07020102.01010000' => { Name => 'UTCStartDateTime', Format => 'string', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0101.07020102.01020000' => { Name => 'LocalStartDateTime', Format => 'string', Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020102.02000000' => { Name => 'MaterialStartTimeAddress', Type => 'Node' }, + '060e2b34.0101.0101.07020102.02010000' => { Name => 'TimecodeStartDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020102.03000000' => { Name => 'MaterialEndTrueDateTime', Type => 'Node' }, + '060e2b34.0101.0101.07020102.03010000' => { Name => 'UTCEndDateTime', Format => 'string', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0101.07020102.03020000' => { Name => 'LocalEndDateTime', Format => 'string', Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020102.04000000' => { Name => 'MaterialEndTimeAddress', Type => 'Node' }, + '060e2b34.0101.0101.07020102.04010000' => { Name => 'TimecodeEndDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020102.05000000' => { Name => 'MaterialOccurrenceTrueDateTime', Type => 'Node' }, + '060e2b34.0101.0101.07020102.05010000' => { Name => 'UTCLastModifyDate', Format => 'string', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0101.07020102.05020000' => { Name => 'LocalLastModifyDate', Format => 'string', Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020102.06000000' => { Name => 'MaterialOccurrenceTimeAddress', Type => 'Node' }, + '060e2b34.0101.0101.07020102.06010000' => { Name => 'TimecodeLastModifyDate', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020102.07000000' => { Name => 'EventStartTrueDateTime', Type => 'Node' }, + '060e2b34.0101.0101.07020102.07010000' => { Name => 'UTCEventStartDateTime', Format => 'string', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0101.07020102.07020000' => { Name => 'LocalEventStartDateTime', Format => 'string', Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020102.08000000' => { Name => 'EventStartTimeAddress', Type => 'Node' }, + '060e2b34.0101.0101.07020102.08010000' => { Name => 'TimecodeEventStartDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020102.09000000' => { Name => 'EventEndTrueDateTime', Type => 'Node' }, + '060e2b34.0101.0101.07020102.09010000' => { Name => 'UTCEventEndDateTime', Format => 'string', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0101.07020102.09020000' => { Name => 'LocalEventEndDateTime', Format => 'string', Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020102.0a000000' => { Name => 'EventEndTimeAddress', Type => 'Node' }, + '060e2b34.0101.0101.07020102.0a010000' => { Name => 'TimecodeEventEndDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020103.00000000' => { Name => 'RelativeTimes', Type => 'Node' }, + # '060e2b34.0101.0101.07020103.01000000' => { Name => 'MaterialStartRelativeTimes', Type => 'Node' }, + '060e2b34.0101.0101.07020103.01010000' => { Name => 'StartTimeRelativeToReference', Format => 'string' }, + '060e2b34.0101.0101.07020103.01020000' => { Name => 'StartTimecodeRelativeToReference', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020103.02000000' => { Name => 'MaterialEndRelativeTimes', Type => 'Node' }, + '060e2b34.0101.0101.07020103.02010000' => { Name => 'MaterialEndTimeOffset', Format => 'string' }, + '060e2b34.0101.0101.07020103.02020000' => { Name => 'MaterialEndTimecodeOffset', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020103.03000000' => { Name => 'EventStartRelativeTimes', Type => 'Node' }, + '060e2b34.0101.0101.07020103.03010000' => { Name => 'EventStartTimeOffset', Format => 'string' }, + '060e2b34.0101.0101.07020103.03020000' => { Name => 'EventStartTimecodeOffset', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020103.04000000' => { Name => 'EventEndRelativeTimes', Type => 'Node' }, + '060e2b34.0101.0101.07020103.04010000' => { Name => 'EventEndTimeOffset', Format => 'string' }, + '060e2b34.0101.0101.07020103.04020000' => { Name => 'EventEndTimecodeOffset', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020103.10000000' => { Name => 'Offsets', Type => 'Node' }, + # '060e2b34.0101.0101.07020103.10010000' => { Name => 'MaterialOffsets', Type => 'Node' }, + '060e2b34.0101.0101.07020103.10010100' => { Name => 'FrameCountOffset', Format => 'int32u' }, + # '060e2b34.0101.0101.07020108.00000000' => { Name => 'SettingDateAndTime', Type => 'Node' }, + '060e2b34.0101.0101.07020108.01000000' => { Name => 'TimePeriodName', Format => 'string' }, + # '060e2b34.0101.0101.07020110.00000000' => { Name => 'ProcessDateTime', Type => 'Node' }, + # '060e2b34.0101.0101.07020110.01000000' => { Name => 'CreateDate', Type => 'Node' }, + '060e2b34.0101.0101.07020110.01010000' => { Name => 'LocalCreationDateTime', Format => 'string', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0101.07020110.01020000' => { Name => 'TimecodeCreationDateTime', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020110.02000000' => { Name => 'ModifyDate', Type => 'Node' }, + '060e2b34.0101.0101.07020110.02010000' => { Name => 'LocalModifyDate', Format => 'string', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0101.07020110.02020000' => { Name => 'TimecodeModifyDate', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020200.00000000' => { Name => 'Durations', Type => 'Node' }, + # '060e2b34.0101.0101.07020201.00000000' => { Name => 'AbsoluteDurations', Type => 'Node' }, + # '060e2b34.0101.0101.07020201.01000000' => { Name => 'EditTimelineDurations', Type => 'Node' }, + '060e2b34.0101.0101.07020201.01010000' => { Name => 'FrameCount', Format => 'int32u' }, + # '060e2b34.0101.0101.07020201.01040000' => { Name => 'VideoDurations', Type => 'Node' }, + # '060e2b34.0101.0101.07020201.01050000' => { Name => 'AudioDurations', Type => 'Node' }, + # '060e2b34.0101.0101.07020201.02000000' => { Name => 'MaterialAbsoluteDurations', Type => 'Node' }, + '060e2b34.0101.0101.07020201.02010000' => { Name => 'MaterialAbsoluteDuration', Format => 'string' }, + '060e2b34.0101.0101.07020201.02020000' => { Name => 'MaterialAbsoluteDuration', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + '060e2b34.0101.0101.07020201.02030000' => { Name => 'TextlessBlackDuration', Format => 'int32u' }, + # '060e2b34.0101.0101.07020201.03000000' => { Name => 'EventAbsoluteDurations', Type => 'Node' }, + '060e2b34.0101.0101.07020201.03010000' => { Name => 'EventAbsoluteDurationFrameCount', Format => 'int32u' }, + '060e2b34.0101.0101.07020201.03020000' => { Name => 'EventAbsoluteDuration', Format => 'string' }, + '060e2b34.0101.0101.07020201.03030000' => { Name => 'EventAbsoluteDuration', Type => 'UILSBF', Unknown => 1, Groups => { 2 => 'Time' } }, + # '060e2b34.0101.0101.07020202.00000000' => { Name => 'RelativeScalingDurations', Type => 'Node' }, + # '060e2b34.0101.0101.07020300.00000000' => { Name => 'Delay', Type => 'Node' }, + # '060e2b34.0101.0101.07020301.00000000' => { Name => 'EncodingAndDecoding', Type => 'Node' }, + # '060e2b34.0101.0101.07020301.01000000' => { Name => 'CodecDelay', Type => 'Node' }, + # '060e2b34.0101.0101.07020301.02000000' => { Name => 'EncodingDelay', Type => 'Node' }, + # '060e2b34.0101.0101.07020301.03000000' => { Name => 'DecodingDelay', Type => 'Node' }, + '060e2b34.0101.0101.07020301.03010000' => { Name => 'BufferDelay', Unknown => 1 }, + # '060e2b34.0101.0101.07020500.00000000' => { Name => 'Latency', Type => 'Node' }, + # '060e2b34.0101.0101.07020600.00000000' => { Name => 'ShutterCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.07020601.00000000' => { Name => 'ShutterCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0101.07020601.01000000' => { Name => 'ShutterSpeed', Type => 'Node' }, + # '060e2b34.0101.0101.07020601.02000000' => { Name => 'ShutterGating', Type => 'Node' }, + # '060e2b34.0101.0101.0d000000.00000000' => { Name => 'UserOrganizationRegisteredForPublicUse', Type => 'Node' }, + # '060e2b34.0101.0101.0d010000.00000000' => { Name => 'AAFAssociation', Type => 'Node' }, + # '060e2b34.0101.0101.0d010100.00000000' => { Name => 'AAFAttributes', Type => 'Node' }, + # '060e2b34.0101.0101.0d010101.00000000' => { Name => 'AAFInformationAttributes', Type => 'Node' }, + # '060e2b34.0101.0101.0d010101.01000000' => { Name => 'AAFInformationAttributesVersion1', Type => 'Node' }, + # '060e2b34.0101.0101.0d010101.01010000' => { Name => 'EnumeratedAttributes', Type => 'Node' }, + + # tags from ref 4 (untested) + '060e2b34.0101.0101.0d010401.03010100' => { Name => 'ProgramIdentifier', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d010401.03010200' => { Name => 'ProgramIdentifierString', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d010401.03010300' => { Name => 'ShimName', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d010401.03010400' => { Name => 'SignalStandard', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d010401.03010500' => { Name => 'IntendedAFD', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d010401.03010600' => { Name => 'SlateTitle', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d010401.03010700' => { Name => 'NOLACode', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d010401.03010800' => { Name => 'Rating', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d010401.03010900' => { Name => 'NielsenStreamIdentifier', Type => 'UTF-16' }, + + # '060e2b34.0101.0101.0d0b0100.00000000' => { Name => 'ProductionFramework', Type => 'Node' }, + '060e2b34.0101.0101.0d0b0101.00000000' => { Name => 'IsRecording', Type => 'Boolean' }, + '060e2b34.0101.0101.0d0b0102.00000000' => { Name => 'IsLiveProduction', Type => 'Boolean' }, + '060e2b34.0101.0101.0d0b0103.00000000' => { Name => 'IsLiveTransmission', Type => 'Boolean' }, + '060e2b34.0101.0101.0d0b0104.00000000' => { Name => 'IsDubbed', Type => 'Boolean' }, + '060e2b34.0101.0101.0d0b0105.00000000' => { Name => 'IsVoiceover', Type => 'Boolean' }, + '060e2b34.0101.0101.0d0b0106.00000000' => { Name => 'HasAudioWatermark', Type => 'Boolean', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0101.0d0b0107.00000000' => { Name => 'AudioWatermarkKind', Type => 'UTF-16', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0101.0d0b0108.00000000' => { Name => 'HasVideoWatermark', Type => 'Boolean' }, + '060e2b34.0101.0101.0d0b0109.00000000' => { Name => 'VideoWatermarkKind', Type => 'UTF-16' }, + # '060e2b34.0101.0101.0d0b0200.00000000' => { Name => 'Subtitling', Type => 'Node' }, + '060e2b34.0101.0101.0d0b0201.00000000' => { Name => 'SubtitlesPresent', Type => 'Boolean' }, + # '060e2b34.0101.0101.0d0b0300.00000000' => { Name => 'CaptionTitles', Type => 'Node' }, + '060e2b34.0101.0101.0d0b0301.00000000' => { Name => 'CaptionTitles', Type => 'Boolean' }, + '060e2b34.0101.0101.0d0b0302.00000000' => { Name => 'CaptionsViaTeletext', Type => 'Boolean' }, + '060e2b34.0101.0101.0d0b0303.00000000' => { Name => 'TextlessMaterial', Type => 'Boolean' }, + # '060e2b34.0101.0101.0d0b0400.00000000' => { Name => 'AudioParameters', Type => 'Node' }, + '060e2b34.0101.0101.0d0b0401.00000000' => { Name => 'AudioReferenceLevel', Format => 'string', Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0101.0d0b0500.00000000' => { Name => 'StorageMedia', Type => 'Node' }, + '060e2b34.0101.0101.0d0b0501.00000000' => { Name => 'StorageDeviceKind', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0502.00000000' => { Name => 'StorageMediaKind', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0503.00000000' => { Name => 'StorageMediaID', Type => 'UTF-16' }, + # '060e2b34.0101.0101.0d0b0600.00000000' => { Name => 'BroadcastScheduleInformation', Type => 'Node' }, + '060e2b34.0101.0101.0d0b0601.00000000' => { Name => 'BroadcastDate', %timestamp }, + '060e2b34.0101.0101.0d0b0602.00000000' => { Name => 'BroadcastTime', %timestamp }, + '060e2b34.0101.0101.0d0b0603.00000000' => { Name => 'IsRepeat', Type => 'Boolean' }, + '060e2b34.0101.0101.0d0b0604.00000000' => { Name => 'FirstTransmissionInfo', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0605.00000000' => { Name => 'TeletextSubtitlesAvailable', Type => 'Boolean' }, + '060e2b34.0101.0101.0d0b0606.00000000' => { Name => 'SeasonEpisodeNumber', Format => 'string' }, + '060e2b34.0101.0101.0d0b0607.00000000' => { Name => 'SeasonEpisodeTitle', Format => 'string' }, + '060e2b34.0101.0101.0d0b0608.00000000' => { Name => 'EPGProgramSynopsis', Type => 'UTF-16' }, + # '060e2b34.0101.0101.0d0b0700.00000000' => { Name => 'Classification', Type => 'Node' }, + '060e2b34.0101.0101.0d0b0701.00000000' => { Name => 'ContentClassification', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0702.00000000' => { Name => 'DVBParentalRating', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0703.00000000' => { Name => 'ContentMaturityRating', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0704.00000000' => { Name => 'ContentMaturityDescription', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0705.00000000' => { Name => 'ContentMaturityGraphic', Type => 'UTF-16' }, + # '060e2b34.0101.0101.0d0b0800.00000000' => { Name => 'Contract', Type => 'Node' }, + '060e2b34.0101.0101.0d0b0801.00000000' => { Name => 'ContractEntity', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0802.00000000' => { Name => 'ContractTypeLink', Type => 'UTF-16' }, + # '060e2b34.0101.0101.0d0b0900.00000000' => { Name => 'Rights', Type => 'Node' }, + '060e2b34.0101.0101.0d0b0901.00000000' => { Name => 'ConsumerRightsToCopy', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0902.00000000' => { Name => 'BroadcasterRightsToCopy', Type => 'UTF-16' }, + # '060e2b34.0101.0101.0d0b0a00.00000000' => { Name => 'ProductionKeyPeople', Type => 'Node' }, + '060e2b34.0101.0101.0d0b0a01.00000000' => { Name => 'DirectorName', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0a02.00000000' => { Name => 'ProducerName', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0a03.00000000' => { Name => 'FemaleLeadActressName', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0a04.00000000' => { Name => 'MaleLeadActorName', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0a05.00000000' => { Name => 'PresenterName', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0a06.00000000' => { Name => 'MainSponsorName', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0a07.00000000' => { Name => 'VoiceTalentName', Type => 'UTF-16' }, + # '060e2b34.0101.0101.0d0b0b00.00000000' => { Name => 'Address', Type => 'Node' }, + '060e2b34.0101.0101.0d0b0b01.00000000' => { Name => 'PostboxNumber', Type => 'UTF-16' }, + '060e2b34.0101.0101.0d0b0b02.00000000' => { Name => 'PostCodeForPostbox', Type => 'UTF-16' }, + # '060e2b34.0101.0101.0e000000.00000000' => { Name => 'PrivateUse', Type => 'Node' }, + # '060e2b34.0101.0101.0e010000.00000000' => { Name => 'MISBSystems', Type => 'Node' }, + # '060e2b34.0101.0101.0e010100.00000000' => { Name => 'MISBSystemsStreams', Type => 'Node' }, + # '060e2b34.0101.0101.0e010200.00000000' => { Name => 'MISBSystemsAttributes', Type => 'Node' }, + # '060e2b34.0101.0101.0e010300.00000000' => { Name => 'MISBSystemsComposites', Type => 'Node' }, + # '060e2b34.0101.0101.0e010400.00000000' => { Name => 'MISBSystemsIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0101.0e020000.00000000' => { Name => 'ASPA', Type => 'Node' }, + # '060e2b34.0101.0101.0e020100.00000000' => { Name => 'ASPAStreams', Type => 'Node' }, + # '060e2b34.0101.0101.0e020200.00000000' => { Name => 'ASPAAttributes', Type => 'Node' }, + # '060e2b34.0101.0101.0e020201.00000000' => { Name => 'ASPARelationalAttributes', Type => 'Node' }, + # '060e2b34.0101.0101.0e020202.00000000' => { Name => 'ASPAInformationAttributes', Type => 'Node' }, + # '060e2b34.0101.0101.0e020300.00000000' => { Name => 'ASPAComposites', Type => 'Node' }, + # '060e2b34.0101.0101.0e020400.00000000' => { Name => 'ASPAIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0101.0e030000.00000000' => { Name => 'MISBClassified', Type => 'Node' }, + # '060e2b34.0101.0101.0e030100.00000000' => { Name => 'MISBClassifiedStreams', Type => 'Node' }, + # '060e2b34.0101.0101.0e030200.00000000' => { Name => 'MISBClassifiedAttributes', Type => 'Node' }, + # '060e2b34.0101.0101.0e030300.00000000' => { Name => 'MISBClassifiedComposites', Type => 'Node' }, + # '060e2b34.0101.0101.0e030400.00000000' => { Name => 'MISBClassifiedIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0101.0f000000.00000000' => { Name => 'EXPERIMENTALMETADATA', Type => 'Node' }, + # '060e2b34.0101.0101.43000000.00000000' => { Name => 'Legacy315M', Type => 'Node' }, + '060e2b34.0101.0102.01011003.03000000' => { Name => 'ProgramNumber', Format => 'string' }, + '060e2b34.0101.0102.01011503.00000000' => { Name => 'DefinitionObjectID', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0102.01012005.00000000' => { Name => 'IEEEDeviceID', Format => 'int8u' }, + '060e2b34.0101.0102.01030106.00000000' => { Name => 'ProjectNumber', Format => 'string' }, + '060e2b34.0101.0102.01030201.02000000' => { Name => 'EdgeCodeHeader', Type => 'DataValue', Unknown => 1 }, + # '060e2b34.0101.0102.01030400.00000000' => { Name => 'NetworkAndStreamIdentifiers', Type => 'Node' }, + '060e2b34.0101.0102.01030401.00000000' => { Name => 'ChannelHandle', Format => 'int16s' }, + '060e2b34.0101.0102.01040102.00000000' => { Name => 'PhysicalMediaLocation', Format => 'string' }, + '060e2b34.0101.0102.01040102.01000000' => { Name => 'MediaLocation', Type => 'UTF-16' }, + '060e2b34.0101.0102.01040103.00000000' => { Name => 'TrackNumber', Format => 'int32u' }, + # '060e2b34.0101.0102.01040900.00000000' => { Name => 'SynchronizationLocators', Type => 'Node' }, + '060e2b34.0101.0102.01040901.00000000' => { Name => 'EdgeCodeStart', Type => 'Position', %duration }, + '060e2b34.0101.0102.01050800.00000000' => { Name => 'VersionTitle', Format => 'string' }, + # '060e2b34.0101.0102.01070000.00000000' => { Name => 'LocalIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0102.01070100.00000000' => { Name => 'PackageIdentifiers', Type => 'Node' }, + '060e2b34.0101.0102.01070101.00000000' => { Name => 'TrackID', Format => 'int32u' }, + '060e2b34.0101.0102.01070102.00000000' => { Name => 'TrackName', Format => 'string' }, + '060e2b34.0101.0102.01070102.01000000' => { Name => 'TrackName', Type => 'UTF-16' }, + '060e2b34.0101.0102.01070102.03000000' => { Name => 'DefinitionObjectName', Format => 'string' }, + '060e2b34.0101.0102.01070102.03010000' => { Name => 'DefinitionObjectName', Type => 'UTF-16' }, + '060e2b34.0101.0102.01070103.00000000' => { Name => 'ContentPackageMetadataLink', Format => 'int8u' }, + '060e2b34.0101.0102.01070104.00000000' => { Name => 'DefinedName', Format => 'string' }, + '060e2b34.0101.0102.01070104.01000000' => { Name => 'DefinedName', Type => 'UTF-16' }, + # '060e2b34.0101.0102.010a0000.00000000' => { Name => 'OrganizationIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0102.010a0100.00000000' => { Name => 'ManufacturerIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0102.010a0101.00000000' => { Name => 'ManufacturerIdentifiers', Type => 'Node' }, + '060e2b34.0101.0102.010a0101.01000000' => { Name => 'DeviceManufacturerName', Format => 'string' }, + '060e2b34.0101.0102.010a0101.01010000' => { Name => 'DeviceManufacturerName', Type => 'UTF-16' }, + '060e2b34.0101.0102.010a0101.03000000' => { Name => 'ManufacturerID', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0102.010a0102.00000000' => { Name => 'IEEEManufacturerID', Type => 'Hex' }, + '060e2b34.0101.0102.010a0103.00000000' => { Name => 'AAFManufacturerID', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0102.02010400.00000000' => { Name => 'SupplyingDepartmentName', Format => 'string' }, + '060e2b34.0101.0102.02200303.00000000' => { Name => 'AudienceShare', Format => 'float' }, + '060e2b34.0101.0102.02200304.00000000' => { Name => 'AudienceAppreciation', Format => 'float' }, + '060e2b34.0101.0102.02300603.01050000' => { Name => 'Salutation', Format => 'string' }, + '060e2b34.0101.0102.02300603.01060000' => { Name => 'HonorsAndQualifications', Format => 'string' }, + # '060e2b34.0101.0102.03010200.00000000' => { Name => 'DataInterpretationsAndDefinitions', Type => 'Node' }, + '060e2b34.0101.0102.03010201.04000000' => { Name => 'ObjectModelVersion', Format => 'int32u' }, + '060e2b34.0101.0102.03010201.05000000' => { Name => 'SDKVersion', Type => 'VersionType' }, + # '060e2b34.0101.0102.03010202.00000000' => { Name => 'PropertyDefinitions', Type => 'Node' }, + '060e2b34.0101.0102.03010202.01000000' => { Name => 'IsOptional', Type => 'Boolean' }, + '060e2b34.0101.0102.03010202.02000000' => { Name => 'IsSearchable', Type => 'Boolean' }, + # '060e2b34.0101.0102.03010202.03000000' => { Name => 'PropertyDefaults', Type => 'Node' }, + '060e2b34.0101.0102.03010202.03010000' => { Name => 'UseDefaultValue', Type => 'Boolean' }, + '060e2b34.0101.0102.03010202.03020000' => { Name => 'DefaultDataValue', Type => 'Indirect', Unknown => 1 }, + # '060e2b34.0101.0102.03010203.00000000' => { Name => 'TypeDefinition', Type => 'Node' }, + '060e2b34.0101.0102.03010203.01000000' => { Name => 'Size', Format => 'int8u' }, + '060e2b34.0101.0102.03010203.02000000' => { Name => 'IsSigned', Type => 'Boolean' }, + '060e2b34.0101.0102.03010203.03000000' => { Name => 'ElementCount', Format => 'int32u' }, + '060e2b34.0101.0102.03010203.04000000' => { Name => 'ElementNameList', Type => 'UTF-16' }, + '060e2b34.0101.0102.03010203.05000000' => { Name => 'TypeDefinitionElementValueList', Format => 'int64s' }, + '060e2b34.0101.0102.03010203.06000000' => { Name => 'MemberNameList', Type => 'UTF-16' }, + '060e2b34.0101.0102.03010203.07000000' => { Name => 'ExtendibleElementNameList', Type => 'UTF-16' }, + '060e2b34.0101.0102.03010203.08000000' => { Name => 'TypeDefinitionExtendibleElementValues', Type => 'AUIDArray', Unknown => 1 }, + '060e2b34.0101.0102.03010203.0b000000' => { Name => 'TargetSet', Type => 'AUIDArray', Unknown => 1 }, + # '060e2b34.0101.0102.03010210.00000000' => { Name => 'KLVInterpretations', Type => 'Node' }, + '060e2b34.0101.0102.03010210.01000000' => { Name => 'FillerData', Format => 'undef', Unknown => 1 }, + '060e2b34.0101.0102.03010210.02000000' => { Name => 'KLVDataValue', Type => 'Opaque', Unknown => 1 }, + '060e2b34.0101.0102.03010210.03000000' => { Name => 'PackageKLVData', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.03010210.04000000' => { Name => 'ComponentKLVData', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.03020102.09000000' => { Name => 'AssignedCategoryName', Format => 'string' }, + '060e2b34.0101.0102.03020102.09010000' => { Name => 'AssignedCategoryName', Type => 'UTF-16' }, + '060e2b34.0101.0102.03020102.0a000000' => { Name => 'AssignedCategoryValue', Format => 'string' }, + '060e2b34.0101.0102.03020102.0a010000' => { Name => 'AssignedCategoryValue', Type => 'UTF-16' }, + '060e2b34.0101.0102.03020102.0b000000' => { Name => 'ShotList', Format => 'string' }, + '060e2b34.0101.0102.03020102.0c000000' => { Name => 'PackageUserComments', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.03020102.0d000000' => { Name => 'Cue-InWords', Format => 'string' }, + '060e2b34.0101.0102.03020102.0e000000' => { Name => 'Cue-OutWords', Format => 'string' }, + '060e2b34.0101.0102.03020301.01000000' => { Name => 'ObjectKind', Format => 'string' }, + '060e2b34.0101.0102.03020301.01010000' => { Name => 'ObjectKind', Type => 'UTF-16' }, + '060e2b34.0101.0102.03020301.02000000' => { Name => 'ObjectDescription', Format => 'string' }, + '060e2b34.0101.0102.03020301.02010000' => { Name => 'ObjectDescription', Type => 'UTF-16' }, + # '060e2b34.0101.0102.03020400.00000000' => { Name => 'DescriptiveNames', Type => 'Node' }, + # '060e2b34.0101.0102.03020401.01000000' => { Name => 'GenericObjectNames', Type => 'Node' }, + '060e2b34.0101.0102.03020401.01010000' => { Name => 'ObjectName', Format => 'string' }, + '060e2b34.0101.0102.03020401.02010000' => { Name => 'MetadataItemName', Type => 'UTF-16' }, + # '060e2b34.0101.0102.03020500.00000000' => { Name => 'EditorialCommentsAndDescriptions', Type => 'Node' }, + '060e2b34.0101.0102.03020501.00000000' => { Name => 'ShotCommentKind', Format => 'string' }, + '060e2b34.0101.0102.03020502.00000000' => { Name => 'ShotComment', Format => 'string' }, + '060e2b34.0101.0102.03030301.01000000' => { Name => 'ComputedObjectKind', Format => 'string' }, + '060e2b34.0101.0102.03030301.01010000' => { Name => 'ComputedObjectKind', Type => 'UTF-16' }, + '060e2b34.0101.0102.03030301.02000000' => { Name => 'VersionNumberString', Format => 'string' }, + '060e2b34.0101.0102.03030301.02010000' => { Name => 'VersionNumberString', Type => 'UTF-16' }, + '060e2b34.0101.0102.03030301.03000000' => { Name => 'VersionNumber', Type => 'VersionType' }, + # '060e2b34.0101.0102.03030302.00000000' => { Name => 'DerivedSummaryInformation', Type => 'Node' }, + '060e2b34.0101.0102.03030302.01000000' => { Name => 'WAVESummary', Type => 'DataValue', Unknown => 1 }, + '060e2b34.0101.0102.03030302.02000000' => { Name => 'AIFCSummary', Type => 'DataValue', Unknown => 1 }, + '060e2b34.0101.0102.03030302.03000000' => { Name => 'TIFFSummary', Type => 'DataValue', Unknown => 1 }, + '060e2b34.0101.0102.04010101.03000000' => { Name => 'ViewportAspectRatio', Format => 'rational64s' }, + '060e2b34.0101.0102.04010201.01010200' => { Name => 'CaptureGammaEquation', Type => 'UL', Unknown => 1 }, + '060e2b34.0101.0102.04010201.01030100' => { Name => 'ColorimetryCode', Type => 'ColorimetryCode', Unknown => 1 }, + '060e2b34.0101.0102.04010201.01100000' => { Name => 'PresentationGammaEquation', Format => 'string' }, + '060e2b34.0101.0102.04010201.01100100' => { Name => 'PresentationGammaEquation', Type => 'PresentationGamma', Unknown => 1 }, + '060e2b34.0101.0102.04010301.06000000' => { Name => 'FieldDominance', Format => 'int8u' }, + '060e2b34.0101.0102.04010302.05000000' => { Name => 'VideoLineMap', Format => 'int32s' }, + '060e2b34.0101.0102.04010401.01000000' => { Name => 'AnalogVideoSystemName', Type => 'VideoSignalType', Unknown => 1 }, + '060e2b34.0101.0102.04010501.10000000' => { Name => 'VerticalSub-sampling', Format => 'int32u' }, + '060e2b34.0101.0102.04010503.01010000' => { Name => 'BitsPerPixel', Format => 'int32u' }, + '060e2b34.0101.0102.04010503.05000000' => { Name => 'ColorRangeLevels', Format => 'int32u' }, + '060e2b34.0101.0102.04010503.06000000' => { Name => 'PixelLayout', Type => 'RGBALayout', Unknown => 1 }, + '060e2b34.0101.0102.04010503.07000000' => { Name => 'AlphaSampleDepth', Format => 'int32u' }, + '060e2b34.0101.0102.04010503.08000000' => { Name => 'Palette', Type => 'DataValue', Unknown => 1 }, + '060e2b34.0101.0102.04010503.09000000' => { Name => 'PaletteLayout', Type => 'RGBALayout', Unknown => 1 }, + '060e2b34.0101.0102.04010503.0a000000' => { Name => 'ComponentDepth', Format => 'int32u' }, + '060e2b34.0101.0102.04010601.00000000' => { Name => 'VideoCodingSchemeID', Type => 'AUID' }, + '060e2b34.0101.0102.04010802.03000000' => { Name => 'RoundedCaptureFilmFrameRate', Format => 'int32u' }, + '060e2b34.0101.0102.04020301.02000000' => { Name => 'AudioAverageBitrate', Format => 'float', PrintConv => 'ConvertBitrate($val)', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0102.04020301.03000000' => { Name => 'AudioFixedBitrateFlag', Type => 'Boolean', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0102.04020401.00000000' => { Name => 'CodingLawKind', Format => 'string' }, + '060e2b34.0101.0102.04020402.00000000' => { Name => 'AudioCodingSchemeID', Type => 'AUID', Unknown => 1, Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0102.04020403.01010000' => { Name => 'LayerNumber', Format => 'int8u' }, + '060e2b34.0101.0102.04040101.02010000' => { Name => 'TimecodeTimebase', Format => 'rational64s' }, + '060e2b34.0101.0102.04040101.02060000' => { Name => 'RoundedTimecodeTimebase', Format => 'int16u' }, + # '060e2b34.0101.0102.04070000.00000000' => { Name => 'GeneralEssenceAndDataParameters', Type => 'Node' }, + '060e2b34.0101.0102.04070100.00000000' => { Name => 'ComponentDataDefinition', Type => 'WeakReference', %componentDataDef }, + '060e2b34.0101.0102.04070200.00000000' => { Name => 'StreamData', Type => 'DataStream', Unknown => 1 }, + '060e2b34.0101.0102.04070300.00000000' => { Name => 'TimecodeStreamData', Type => 'DataStream', Unknown => 1 }, + '060e2b34.0101.0102.04090101.00000000' => { Name => 'RecordedFormat', Type => 'UTF-16' }, + '060e2b34.0101.0102.04100101.01000000' => { Name => 'TapeShellKind', Format => 'string' }, + '060e2b34.0101.0102.04100101.01010000' => { Name => 'TapeShellKind', Type => 'UTF-16' }, + '060e2b34.0101.0102.04100101.02000000' => { Name => 'TapeFormulation', Format => 'string' }, + '060e2b34.0101.0102.04100101.02010000' => { Name => 'TapeFormulation', Type => 'UTF-16' }, + '060e2b34.0101.0102.04100101.03000000' => { Name => 'TapeCapacity', Format => 'int32u' }, + '060e2b34.0101.0102.04100101.04000000' => { Name => 'TapeManufacturer', Format => 'string' }, + '060e2b34.0101.0102.04100101.04010000' => { Name => 'TapeManufacturer', Type => 'UTF-16' }, + '060e2b34.0101.0102.04100101.05000000' => { Name => 'TapeStock', Format => 'string' }, + '060e2b34.0101.0102.04100101.05010000' => { Name => 'TapeStock', Type => 'UTF-16' }, + '060e2b34.0101.0102.04100101.06000000' => { Name => 'TapeBatchNumber', Format => 'string' }, + '060e2b34.0101.0102.04100101.06010000' => { Name => 'TapeBatchNumber', Type => 'UTF-16' }, + '060e2b34.0101.0102.04100103.01030000' => { Name => 'PerforationsPerFrame', Format => 'int8u' }, + '060e2b34.0101.0102.04100103.01030100' => { Name => 'PerforationsPerFrame', Format => 'rational64s' }, + '060e2b34.0101.0102.04100103.01040100' => { Name => 'FilmFormatName', Type => 'UTF-16' }, + '060e2b34.0101.0102.04100103.01040200' => { Name => 'FilmFormatName', Type => 'FilmFormat', Unknown => 1 }, + '060e2b34.0101.0102.04100103.01050100' => { Name => 'FilmStockKind', Type => 'UTF-16' }, + '060e2b34.0101.0102.04100103.01060100' => { Name => 'FilmStockManufacturerName', Type => 'UTF-16' }, + '060e2b34.0101.0102.04100103.01070000' => { Name => 'FilmBatchNumber', Format => 'string' }, + '060e2b34.0101.0102.04100103.01070100' => { Name => 'FilmBatchNumber', Type => 'UTF-16' }, + '060e2b34.0101.0102.04100103.01080000' => { Name => 'FilmGauge', Type => 'FilmType', Unknown => 1 }, + '060e2b34.0101.0102.04100103.01090000' => { Name => 'EdgeCodeFilmGauge', Type => 'FilmType', Unknown => 1 }, + '060e2b34.0101.0102.04100103.02030000' => { Name => 'ExposedAspectRatio', Format => 'rational64s' }, + # '060e2b34.0101.0102.04180000.00000000' => { Name => 'MemoryStorageCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0102.04180100.00000000' => { Name => 'MemoryStorageAlignmentCharacteristics', Type => 'Node' }, + '060e2b34.0101.0102.04180101.00000000' => { Name => 'ImageAlignmentOffset', Format => 'int32u' }, + '060e2b34.0101.0102.04180102.00000000' => { Name => 'ImageStartOffset', Format => 'int32u' }, + '060e2b34.0101.0102.04180103.00000000' => { Name => 'ImageEndOffset', Format => 'int32u' }, + '060e2b34.0101.0102.04180104.00000000' => { Name => 'PaddingBits', Format => 'int16s' }, + '060e2b34.0101.0102.04200201.01040000' => { Name => 'FocalLength', Format => 'float', PrintConv => 'sprintf("%.1f mm",$val)' }, + '060e2b34.0101.0102.04200201.01050000' => { Name => 'SensorSize', Format => 'string' }, + '060e2b34.0101.0102.04200201.01060000' => { Name => 'FNumber', Format => 'float' }, + '060e2b34.0101.0102.04200201.01070000' => { Name => 'SensorTypeCode', Format => 'string' }, + '060e2b34.0101.0102.04200201.01080000' => { Name => 'FieldOfViewHorizontal', Format => 'float' }, + '060e2b34.0101.0102.04200201.01090000' => { Name => 'AnamorphicLensCharacteristic', Format => 'string' }, + # '060e2b34.0101.0102.05020103.00000000' => { Name => 'JPEGProcessing', Type => 'Node' }, + # '060e2b34.0101.0102.05020103.01000000' => { Name => 'TIFFJPEGProcessing', Type => 'Node' }, + '060e2b34.0101.0102.05020103.01010000' => { Name => 'UniformDataFlag', Type => 'Boolean' }, + '060e2b34.0101.0102.05020103.01020000' => { Name => 'JPEGTableID', Type => 'JPEGTableIDType', Unknown => 1 }, + # '060e2b34.0101.0102.05020103.02000000' => { Name => 'JFIF_JPEGProcessing', Type => 'Node' }, + '060e2b34.0101.0102.05200102.00000000' => { Name => 'AlphaTransparency', Format => 'int8u', + PrintConv => { 0 => 'Not Inverted', 1 => 'Inverted' }, + }, + # '060e2b34.0101.0102.05200701.00000000' => { Name => 'ModificationInformation', Type => 'Node' }, + '060e2b34.0101.0102.05200701.01000000' => { Name => 'GenerationID', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0102.05200701.02000000' => { Name => 'ApplicationSupplierName', Format => 'string' }, + '060e2b34.0101.0102.05200701.02010000' => { Name => 'ApplicationSupplierName', Type => 'UTF-16' }, + '060e2b34.0101.0102.05200701.03000000' => { Name => 'ApplicationName', Format => 'string' }, + '060e2b34.0101.0102.05200701.03010000' => { Name => 'ApplicationName', Type => 'UTF-16' }, + '060e2b34.0101.0102.05200701.04000000' => { Name => 'ApplicationVersionNumber', Type => 'ProductVersion' }, + '060e2b34.0101.0102.05200701.05000000' => { Name => 'ApplicationVersionString', Format => 'string' }, + '060e2b34.0101.0102.05200701.05010000' => { Name => 'ApplicationVersionString', Type => 'UTF-16' }, + '060e2b34.0101.0102.05200701.06000000' => { Name => 'ApplicationPlatform', Format => 'string' }, + '060e2b34.0101.0102.05200701.06010000' => { Name => 'ApplicationPlatform', Type => 'UTF-16' }, + '060e2b34.0101.0102.05200701.07000000' => { Name => 'ApplicationProductID', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0102.05200701.08000000' => { Name => 'LinkedGenerationID', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0102.05200701.09000000' => { Name => 'ContainerVersion', Type => 'ProductVersion' }, + '060e2b34.0101.0102.05200701.0a000000' => { Name => 'ToolkitVersion', Type => 'ProductVersion' }, + # '060e2b34.0101.0102.05200900.00000000' => { Name => 'CodeProcessorSettings', Type => 'Node' }, + '060e2b34.0101.0102.05200901.00000000' => { Name => 'Plug-InCategoryID', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0102.05200902.00000000' => { Name => 'Plug-InPlatformID', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0102.05200903.00000000' => { Name => 'MinimumSupportedPlatformVersion', Type => 'VersionType' }, + '060e2b34.0101.0102.05200904.00000000' => { Name => 'MaximumSupportedPlatformVersion', Type => 'VersionType' }, + '060e2b34.0101.0102.05200905.00000000' => { Name => 'Plug-InEngineID', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0102.05200906.00000000' => { Name => 'MinimumSupportedEngineVersion', Type => 'VersionType' }, + '060e2b34.0101.0102.05200907.00000000' => { Name => 'MaximumSupportedEngineVersion', Type => 'VersionType' }, + '060e2b34.0101.0102.05200908.00000000' => { Name => 'Plug-InAPIID', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0102.05200909.00000000' => { Name => 'MinimumAPIVersion', Type => 'VersionType' }, + '060e2b34.0101.0102.0520090a.00000000' => { Name => 'MaximumAPIVersion', Type => 'VersionType' }, + '060e2b34.0101.0102.0520090b.00000000' => { Name => 'Software-OnlySupportFlag', Type => 'Boolean' }, + '060e2b34.0101.0102.0520090c.00000000' => { Name => 'HardwareAcceleratorFlag', Type => 'Boolean' }, + '060e2b34.0101.0102.0520090d.00000000' => { Name => 'Plug-InLocatorSet', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.0520090e.00000000' => { Name => 'AuthenticationFlag', Type => 'Boolean' }, + '060e2b34.0101.0102.0520090f.00000000' => { Name => 'AssociatedMetadataDefinition', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0102.05300402.00000000' => { Name => 'EventTrackEditRate', Format => 'rational64s' }, + '060e2b34.0101.0102.05300403.00000000' => { Name => 'DefaultFadeEditRate', Format => 'rational64s' }, + '060e2b34.0101.0102.05300404.00000000' => { Name => 'EditingEventComment', Format => 'string' }, + '060e2b34.0101.0102.05300404.01000000' => { Name => 'EditingEventComment', Type => 'UTF-16' }, + '060e2b34.0101.0102.05300405.00000000' => { Name => 'EditRate', Format => 'rational64s' }, + '060e2b34.0101.0102.05300506.00000000' => { Name => 'OperationDefinitionID', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.05300507.00000000' => { Name => 'Value', Type => 'Indirect', Unknown => 1 }, + '060e2b34.0101.0102.05300508.00000000' => { Name => 'EditHint', Type => 'EditHintType', Unknown => 1 }, + '060e2b34.0101.0102.05300509.00000000' => { Name => 'OperationDataDefinition', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.0530050a.00000000' => { Name => 'OperationCategory', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0102.0530050b.00000000' => { Name => 'DisplayUnits', Format => 'string' }, + '060e2b34.0101.0102.0530050b.01000000' => { Name => 'DisplayUnits', Type => 'UTF-16' }, + '060e2b34.0101.0102.0530050c.00000000' => { Name => 'BypassOverride', Format => 'int32u' }, + '060e2b34.0101.0102.0530050d.00000000' => { Name => 'TimepointValue', Type => 'Indirect', Unknown => 1 }, + '060e2b34.0101.0102.05300601.00000000' => { Name => 'BeginAnchor', Format => 'string' }, + '060e2b34.0101.0102.05300601.01000000' => { Name => 'BeginAnchor', Type => 'UTF-16' }, + '060e2b34.0101.0102.05300602.00000000' => { Name => 'EndAnchor', Format => 'string' }, + '060e2b34.0101.0102.05300602.01000000' => { Name => 'EndAnchor', Type => 'UTF-16' }, + # '060e2b34.0101.0102.05401000.00000000' => { Name => 'TransferHistory', Type => 'Node' }, + # '060e2b34.0101.0102.05401001.00000000' => { Name => 'ImageTransferHistory', Type => 'Node' }, + '060e2b34.0101.0102.05401001.01000000' => { Name => 'FilmToVideoTransferDirection', Type => 'PulldownDirection', Unknown => 1 }, + '060e2b34.0101.0102.05401001.02000000' => { Name => 'FilmToVideoTransferKind', Type => 'PulldownKind', Unknown => 1 }, + '060e2b34.0101.0102.05401001.03000000' => { Name => 'FilmToVideoTransferPhase', Type => 'PhaseFrameType', Unknown => 1 }, + '060e2b34.0101.0102.06010101.01000000' => { Name => 'TeletextSubtitlesFlag', Type => 'Boolean' }, + '060e2b34.0101.0102.06010101.02000000' => { Name => 'SubtitleDatafileFlag', Type => 'Boolean' }, + '060e2b34.0101.0102.06010101.03000000' => { Name => 'ClosedCaptionSubtitlesFlag', Type => 'Boolean' }, + '060e2b34.0101.0102.06010102.01000000' => { Name => 'SampleIndex', Type => 'DataStream', Unknown => 1 }, + '060e2b34.0101.0102.06010103.01000000' => { Name => 'SourcePackageID', Type => 'PackageID', Unknown => 1 }, + '060e2b34.0101.0102.06010103.02000000' => { Name => 'SourceTrackID', Format => 'int32u' }, + '060e2b34.0101.0102.06010103.03000000' => { Name => 'RelativeScope', Format => 'int32u' }, + '060e2b34.0101.0102.06010103.04000000' => { Name => 'RelativeTrack', Format => 'int32u' }, + # '060e2b34.0101.0102.06010104.01000000' => { Name => 'WeakReferences', Type => 'Node' }, + '060e2b34.0101.0102.06010104.01010000' => { Name => 'ObjectClass', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.01020000' => { Name => 'EssenceContainerFormat', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.01030000' => { Name => 'CodecDefinition', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.01040000' => { Name => 'ParameterDefinition', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.01050000' => { Name => 'Interpolation', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.01060000' => { Name => 'ParameterDataType', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.01070000' => { Name => 'CodecEssenceDescriptor', Type => 'WeakReference', Unknown => 1 }, + # '060e2b34.0101.0102.06010104.02000000' => { Name => 'StrongReferences', Type => 'Node' }, + '060e2b34.0101.0102.06010104.02010000' => { Name => 'ContentStorage', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.02020000' => { Name => 'Dictionary', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.02030000' => { Name => 'EssenceDescription', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.02040000' => { Name => 'Sequence', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.02050000' => { Name => 'TransitionEffect', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.02060000' => { Name => 'EffectRendering', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.02070000' => { Name => 'InputSegment', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.02080000' => { Name => 'StillFrame', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.02090000' => { Name => 'Selected', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.020a0000' => { Name => 'Annotation', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0102.06010104.020b0000' => { Name => 'ManufacturerInformationObject', Type => 'StrongReference', Unknown => 1 }, + # '060e2b34.0101.0102.06010104.03000000' => { Name => 'WeakReferencesBatches', Type => 'Node' }, + '060e2b34.0101.0102.06010104.03010000' => { Name => 'CodecEssenceKinds', Type => 'WeakReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0102.06010104.03020000' => { Name => 'OperationParameters', Type => 'WeakReferenceBatch', Unknown => 1 }, + # '060e2b34.0101.0102.06010104.04000000' => { Name => 'WeakReferencesArrays', Type => 'Node' }, + '060e2b34.0101.0102.06010104.04010000' => { Name => 'DegradedEffects', Type => 'WeakReferenceArray', Unknown => 1 }, + # '060e2b34.0101.0102.06010104.05000000' => { Name => 'StrongReferencesBatches', Type => 'Node' }, + '060e2b34.0101.0102.06010104.05010000' => { Name => 'Packages', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0102.06010104.05020000' => { Name => 'EssenceData', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0102.06010104.05030000' => { Name => 'OperationDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0102.06010104.05040000' => { Name => 'ParameterDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0102.06010104.05050000' => { Name => 'DataDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0102.06010104.05060000' => { Name => 'Plug-InDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0102.06010104.05070000' => { Name => 'CodecDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0102.06010104.05080000' => { Name => 'ContainerDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0102.06010104.05090000' => { Name => 'InterpolationDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 }, + # '060e2b34.0101.0102.06010104.06000000' => { Name => 'StrongReferencesArrays', Type => 'Node' }, + '060e2b34.0101.0102.06010104.06010000' => { Name => 'AvailableRepresentations', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.06010104.06020000' => { Name => 'InputSegments', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.06010104.06030000' => { Name => 'EssenceLocators', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.06010104.06040000' => { Name => 'IdentificationList', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.06010104.06050000' => { Name => 'Tracks', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.06010104.06060000' => { Name => 'ControlPointList', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.06010104.06070000' => { Name => 'PackageTracks', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.06010104.06080000' => { Name => 'Alternates', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.06010104.06090000' => { Name => 'ComponentsInSequence', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.06010104.060a0000' => { Name => 'Parameters', Type => 'StrongReferenceBatch', Unknown => 1 }, + # '060e2b34.0101.0102.06010106.00000000' => { Name => 'EssenceToObjectRelationships', Type => 'Node' }, + '060e2b34.0101.0102.06010106.01000000' => { Name => 'LinkedPackageID', Type => 'PackageID', Unknown => 1 }, + # '060e2b34.0101.0102.06010107.00000000' => { Name => 'ObjectDictionaryToMetadataRelationships', Type => 'Node' }, + '060e2b34.0101.0102.06010107.01000000' => { Name => 'ParentClass', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010107.02000000' => { Name => 'Properties', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0102.06010107.03000000' => { Name => 'IsConcrete', Type => 'Boolean' }, + '060e2b34.0101.0102.06010107.04000000' => { Name => 'PropertyType', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010107.05000000' => { Name => 'LocalID', Format => 'int16u' }, + '060e2b34.0101.0102.06010107.06000000' => { Name => 'IsUniqueIdentifier', Type => 'Boolean' }, + '060e2b34.0101.0102.06010107.07000000' => { Name => 'ClassDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0102.06010107.08000000' => { Name => 'TypeDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0102.06010107.09000000' => { Name => 'TargetClassOfStrongReference', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010107.0a000000' => { Name => 'TargetClassOfWeakReference', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010107.0b000000' => { Name => 'EnumerationUnderlyingIntegerType', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010107.0c000000' => { Name => 'FixedArrayElementType', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010107.0d000000' => { Name => 'VariableArrayElementType', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010107.0e000000' => { Name => 'SetElementType', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010107.0f000000' => { Name => 'StringElementType', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010107.10000000' => { Name => 'StreamElementType', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010107.11000000' => { Name => 'MemberTypes', Type => 'WeakReferenceArray', Unknown => 1 }, + '060e2b34.0101.0102.06010107.12000000' => { Name => 'RenamedType', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0102.06010107.13000000' => { Name => 'DictionaryIdentifier', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0102.06010107.14000000' => { Name => 'DictionaryDescription', Format => 'string' }, + '060e2b34.0101.0102.06010107.14010000' => { Name => 'DictionaryDescription', Type => 'UTF-16' }, + # '060e2b34.0101.0102.06080101.00000000' => { Name => 'ContinuityCounts', Type => 'Node' }, + '060e2b34.0101.0102.06080101.01000000' => { Name => 'BlockContinuityCount', Format => 'int16u' }, + # '060e2b34.0101.0102.06080102.00000000' => { Name => 'StreamPositionalRelationships', Type => 'Node' }, + '060e2b34.0101.0102.06080102.01000000' => { Name => 'StreamPositionIndicator', Format => 'int8u' }, + # '060e2b34.0101.0102.06080202.00000000' => { Name => 'StorageOffsets', Type => 'Node' }, + '060e2b34.0101.0102.07020103.01030000' => { Name => 'Origin', Format => 'int64s', %duration }, + '060e2b34.0101.0102.07020103.01040000' => { Name => 'StartTimeRelativeToReference', Format => 'int64s', %duration }, + '060e2b34.0101.0102.07020103.01050000' => { Name => 'StartTimecode', Format => 'int64s', %duration }, + '060e2b34.0101.0102.07020103.01060000' => { Name => 'CutPoint', Format => 'int64s', %duration }, + '060e2b34.0101.0102.07020103.03030000' => { Name => 'EventStart', Type => 'Position', %duration }, + # '060e2b34.0101.0102.07020103.10020000' => { Name => 'EditOffsets', Type => 'Node' }, + '060e2b34.0101.0102.07020103.10020100' => { Name => 'ControlPointTime', Format => 'rational64s' }, + '060e2b34.0101.0102.07020110.01030000' => { Name => 'CreateDate', %timestamp }, + '060e2b34.0101.0102.07020110.02030000' => { Name => 'ModifyDate', %timestamp }, + '060e2b34.0101.0102.07020110.02040000' => { Name => 'ContainerLastModifyDate', %timestamp }, + '060e2b34.0101.0102.07020110.02050000' => { Name => 'PackageLastModifyDate', %timestamp }, + '060e2b34.0101.0102.07020201.01030000' => { Name => 'Duration', Type => 'Length', %duration }, + '060e2b34.0101.0102.07020201.01050100' => { Name => 'DefaultFadeDuration', Type => 'Length', %duration }, + '060e2b34.0101.0102.07020201.01050200' => { Name => 'Fade-InDuration', Type => 'Length', %duration }, + '060e2b34.0101.0102.07020201.01050300' => { Name => 'Fade-OutDuration', Type => 'Length', %duration }, + '060e2b34.0101.0102.0d010101.01010100' => { Name => 'TapeFormat', Type => 'TapeFormatType', Unknown => 1 }, + '060e2b34.0101.0103.01011001.01000000' => { Name => 'OrganizationID', Type => 'UTF-16' }, + '060e2b34.0101.0103.01011504.00000000' => { Name => 'GlobalNumber', Format => 'string' }, + '060e2b34.0101.0103.01012007.00000000' => { Name => 'DeviceIDKind', Format => 'string' }, + '060e2b34.0101.0103.01012008.00000000' => { Name => 'DeviceKind', Format => 'string' }, + '060e2b34.0101.0103.01012008.02000000' => { Name => 'DeviceKindCode', Format => 'string' }, + # '060e2b34.0101.0103.01012100.00000000' => { Name => 'PlatformIdentifiers', Type => 'Node' }, + '060e2b34.0101.0103.01012101.00000000' => { Name => 'PlatformDesignation', Format => 'string' }, + '060e2b34.0101.0103.01012102.00000000' => { Name => 'PlatformModel', Format => 'string' }, + '060e2b34.0101.0103.01012103.00000000' => { Name => 'PlatformSerialNumber', Format => 'string' }, + '060e2b34.0101.0103.01030107.00000000' => { Name => 'LocalTargetID', Format => 'string' }, + # '060e2b34.0101.0103.01030203.00000000' => { Name => 'DiskIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0103.01030203.01000000' => { Name => 'MagneticDisks', Type => 'Node' }, + '060e2b34.0101.0103.01030203.01010000' => { Name => 'MagneticDiskNumber', Format => 'string' }, + # '060e2b34.0101.0103.01030203.02000000' => { Name => 'OpticalDiscs', Type => 'Node' }, + '060e2b34.0101.0103.01030203.02010000' => { Name => 'OpticalDiscNumber', Format => 'string' }, + '060e2b34.0101.0103.01030402.00000000' => { Name => 'StreamID', Format => 'int8u' }, + '060e2b34.0101.0103.01030403.00000000' => { Name => 'TransportStreamID', Format => 'int16u' }, + # '060e2b34.0101.0103.01030500.00000000' => { Name => 'OrganizationalProgramIdentifiers', Type => 'Node' }, + '060e2b34.0101.0103.01030501.00000000' => { Name => 'OrganizationalProgramNumber', Format => 'string' }, + '060e2b34.0101.0103.01030501.01000000' => { Name => 'OrganizationalProgramNumber', Type => 'UTF-16' }, + # '060e2b34.0101.0103.01030600.00000000' => { Name => 'MetadataIdentifiers', Type => 'Node' }, + '060e2b34.0101.0103.01030601.00000000' => { Name => 'ItemDesignatorID', Type => 'SMPTE336M', Unknown => 1 }, + '060e2b34.0101.0103.01040101.01000000' => { Name => 'LocalFilePath', Type => 'UTF-16' }, + '060e2b34.0101.0103.01050101.00000000' => { Name => 'TitleKind', Type => 'UTF-16' }, + '060e2b34.0101.0103.01050201.00000000' => { Name => 'MainTitle', Type => 'UTF-16' }, + '060e2b34.0101.0103.01050301.00000000' => { Name => 'SecondaryTitle', Type => 'UTF-16' }, + '060e2b34.0101.0103.01050401.00000000' => { Name => 'SeriesNumber', Type => 'UTF-16' }, + '060e2b34.0101.0103.01050501.00000000' => { Name => 'EpisodeNumber', Type => 'UTF-16' }, + '060e2b34.0101.0103.01050601.00000000' => { Name => 'SceneNumber', Type => 'UTF-16' }, + '060e2b34.0101.0103.01050801.00000000' => { Name => 'VersionTitle', Type => 'UTF-16' }, + '060e2b34.0101.0103.01050900.00000000' => { Name => 'MissionID', Format => 'string' }, + '060e2b34.0101.0103.01050901.00000000' => { Name => 'MissionID', Type => 'UTF-16' }, + # '060e2b34.0101.0103.01100300.00000000' => { Name => 'MusicIndustryIdentifiers', Type => 'Node' }, + '060e2b34.0101.0103.01100301.00000000' => { Name => 'RecordingLabelName', Format => 'string' }, + '060e2b34.0101.0103.01100301.01000000' => { Name => 'RecordingLabelName', Type => 'UTF-16' }, + '060e2b34.0101.0103.01100302.00000000' => { Name => 'CollectionName', Format => 'string' }, + '060e2b34.0101.0103.01100302.01000000' => { Name => 'CollectionName', Type => 'UTF-16' }, + '060e2b34.0101.0103.01100303.00000000' => { Name => 'OriginCode', Format => 'string' }, + '060e2b34.0101.0103.01100304.00000000' => { Name => 'MainCatalogNumber', Format => 'string' }, + '060e2b34.0101.0103.01100305.00000000' => { Name => 'CatalogPrefixNumber', Format => 'string' }, + '060e2b34.0101.0103.01100306.00000000' => { Name => 'SideNumber', Format => 'string' }, + '060e2b34.0101.0103.01100307.00000000' => { Name => 'RecordedTrackNumber', Format => 'string' }, + '060e2b34.0101.0103.02020200.00000000' => { Name => 'SeriesinaSeriesGroupCount', Format => 'int16u' }, + '060e2b34.0101.0103.02020300.00000000' => { Name => 'ProgrammingGroupKind', Format => 'string' }, + # '060e2b34.0101.0103.02030000.00000000' => { Name => 'Purchaser', Type => 'Node' }, + '060e2b34.0101.0103.02030100.00000000' => { Name => 'PurchasingOrganizationName', Format => 'string' }, + '060e2b34.0101.0103.02030200.00000000' => { Name => 'SalesContractNumber', Format => 'string' }, + '060e2b34.0101.0103.02030400.00000000' => { Name => 'PurchasingDepartment', Format => 'string' }, + # '060e2b34.0101.0103.02040000.00000000' => { Name => 'ContractDescriptions', Type => 'Node' }, + '060e2b34.0101.0103.02040100.00000000' => { Name => 'ContractType', Format => 'string' }, + '060e2b34.0101.0103.02040101.00000000' => { Name => 'ContractTypeCode', Format => 'string' }, + '060e2b34.0101.0103.02040200.00000000' => { Name => 'ContractClauseDescription', Format => 'string' }, + '060e2b34.0101.0103.02040300.00000000' => { Name => 'ContractLineCode', Format => 'string' }, + '060e2b34.0101.0103.02040301.00000000' => { Name => 'ContractLineName', Format => 'string' }, + '060e2b34.0101.0103.02040400.00000000' => { Name => 'ContractTermsOfBusiness', Format => 'string' }, + '060e2b34.0101.0103.02040500.00000000' => { Name => 'ContractInstallmentPercentage', Format => 'float' }, + '060e2b34.0101.0103.02040600.00000000' => { Name => 'Jurisdiction', Format => 'string' }, + '060e2b34.0101.0103.02050101.01000000' => { Name => 'CopyrightStatus', Type => 'UTF-16' }, + '060e2b34.0101.0103.02050102.01000000' => { Name => 'CopyrightOwnerName', Type => 'UTF-16' }, + '060e2b34.0101.0103.02050201.01000000' => { Name => 'IntellectualPropertyDescription', Type => 'UTF-16' }, + '060e2b34.0101.0103.02050202.01000000' => { Name => 'IntellectualPropertyRights', Type => 'UTF-16' }, + '060e2b34.0101.0103.02050301.01000000' => { Name => 'Rightsholder', Type => 'UTF-16' }, + '060e2b34.0101.0103.02050302.01000000' => { Name => 'RightsManagementAuthority', Type => 'UTF-16' }, + '060e2b34.0101.0103.02050403.00000000' => { Name => 'RightsConditionDescription', Format => 'string' }, + '060e2b34.0101.0103.02050403.01000000' => { Name => 'RightsConditionDescription', Type => 'UTF-16' }, + '060e2b34.0101.0103.02060101.01000000' => { Name => 'CurrencyName', Format => 'string' }, + '060e2b34.0101.0103.02060202.00000000' => { Name => 'TotalPayment', Format => 'string' }, + '060e2b34.0101.0103.02060203.00000000' => { Name => 'PayeeAccountName', Format => 'string' }, + '060e2b34.0101.0103.02060204.00000000' => { Name => 'PayeeAccountNumber', Format => 'string' }, + '060e2b34.0101.0103.02060205.00000000' => { Name => 'PayeeAccountSortCode', Format => 'string' }, + '060e2b34.0101.0103.02060302.00000000' => { Name => 'TotalIncome', Format => 'string' }, + '060e2b34.0101.0103.02060303.00000000' => { Name => 'PayerAccountName', Format => 'string' }, + '060e2b34.0101.0103.02060304.00000000' => { Name => 'PayerAccountNumber', Format => 'string' }, + '060e2b34.0101.0103.02060305.00000000' => { Name => 'PayerAccountSortCode', Format => 'string' }, + # '060e2b34.0101.0103.02080200.00000000' => { Name => 'Classification', Type => 'Node' }, + '060e2b34.0101.0103.02080201.00000000' => { Name => 'SecurityClassification', Format => 'string' }, + '060e2b34.0101.0103.02080202.00000000' => { Name => 'SecurityClassificationCaveats', Format => 'string' }, + '060e2b34.0101.0103.02080203.00000000' => { Name => 'ClassifiedBy', Format => 'string' }, + '060e2b34.0101.0103.02080204.00000000' => { Name => 'ClassificationReason', Format => 'string' }, + '060e2b34.0101.0103.02080205.00000000' => { Name => 'DeclassificationDate', Format => 'string', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0103.02080206.00000000' => { Name => 'DerivedFrom', Format => 'string' }, + '060e2b34.0101.0103.02080207.00000000' => { Name => 'ClassificationComment', Format => 'string' }, + '060e2b34.0101.0103.02080208.00000000' => { Name => 'ClassificationAndMarkingSystem', Format => 'string' }, + '060e2b34.0101.0103.02100101.01010000' => { Name => 'BroadcastOrganizationName', Type => 'UTF-16' }, + '060e2b34.0101.0103.02100101.02010000' => { Name => 'BroadcastServiceName', Type => 'UTF-16' }, + '060e2b34.0101.0103.02100101.03020000' => { Name => 'BroadcastMediumCode', Format => 'string' }, + '060e2b34.0101.0103.02100101.04010000' => { Name => 'BroadcastRegion', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300101.01000000' => { Name => 'NatureOfPersonality', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300102.01010000' => { Name => 'ContributionStatus', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300103.01010000' => { Name => 'SupportOrAdministrationStatus', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300201.01000000' => { Name => 'OrganizationKind', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300202.01010000' => { Name => 'ProductionOrganizationRole', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300203.01010000' => { Name => 'SupportOrganizationRole', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300501.01000000' => { Name => 'JobFunctionName', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300501.02000000' => { Name => 'JobFunctionCode', Format => 'string' }, + '060e2b34.0101.0103.02300502.01000000' => { Name => 'RoleName', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300503.00000000' => { Name => 'JobTitle', Format => 'string' }, + '060e2b34.0101.0103.02300503.01000000' => { Name => 'JobTitle', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300601.01000000' => { Name => 'ContactKind', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300602.01000000' => { Name => 'ContactDepartmentName', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300603.01010100' => { Name => 'FamilyName', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300603.01020100' => { Name => 'FirstGivenName', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300603.01030100' => { Name => 'SecondGivenName', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300603.01040100' => { Name => 'ThirdGivenName', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300603.01070000' => { Name => 'PersonDescription', Format => 'string' }, + '060e2b34.0101.0103.02300603.01070100' => { Name => 'PersonDescription', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300603.02010100' => { Name => 'MainName', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300603.02020100' => { Name => 'SupplementaryName', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300603.03010100' => { Name => 'OrganizationMainName', Type => 'UTF-16' }, + '060e2b34.0101.0103.02300603.03020100' => { Name => 'SupplementaryOrganizationName', Type => 'UTF-16' }, + '060e2b34.0101.0103.03010101.02000000' => { Name => 'RegionCode', Format => 'string' }, + # '060e2b34.0101.0103.03010101.10000000' => { Name => 'CountryAndRegionNames', Type => 'Node' }, + '060e2b34.0101.0103.03010101.10010000' => { Name => 'CountryName', Format => 'string' }, + '060e2b34.0101.0103.03010101.10010100' => { Name => 'CountryName', Type => 'UTF-16' }, + '060e2b34.0101.0103.03010101.10020000' => { Name => 'RegionName', Format => 'string' }, + '060e2b34.0101.0103.03010101.10020100' => { Name => 'RegionName', Type => 'UTF-16' }, + # '060e2b34.0101.0103.03010102.10000000' => { Name => 'LanguageNames', Type => 'Node' }, + '060e2b34.0101.0103.03010102.10010000' => { Name => 'LanguageName', Format => 'string' }, + '060e2b34.0101.0103.03010102.10010100' => { Name => 'LanguageName', Type => 'UTF-16' }, + '060e2b34.0101.0103.03010210.05000000' => { Name => 'TerminatingFillerData', Format => 'int8u' }, + '060e2b34.0101.0103.03010303.03000000' => { Name => 'TimingBiasCorrection', Format => 'float' }, + '060e2b34.0101.0103.03010303.04000000' => { Name => 'TimingBiasCorrectionDescription', Format => 'string' }, + '060e2b34.0101.0103.03020101.03010000' => { Name => 'Genre', Type => 'UTF-16' }, + '060e2b34.0101.0103.03020101.04010000' => { Name => 'TargetAudience', Type => 'UTF-16' }, + '060e2b34.0101.0103.03020101.10000000' => { Name => 'ProgramMaterialClassificationCode', Format => 'string' }, + '060e2b34.0101.0103.03020102.03010000' => { Name => 'Theme', Type => 'UTF-16' }, + '060e2b34.0101.0103.03020102.04010000' => { Name => 'SubjectName', Format => 'string' }, + '060e2b34.0101.0103.03020102.04020000' => { Name => 'SubjectName', Type => 'UTF-16' }, + '060e2b34.0101.0103.03020102.05010000' => { Name => 'Keywords', Type => 'UTF-16' }, + '060e2b34.0101.0103.03020102.0f000000' => { Name => 'KeyFrameSampleCount', Format => 'int32u' }, + '060e2b34.0101.0103.03020106.01010000' => { Name => 'Abstract', Type => 'UTF-16' }, + '060e2b34.0101.0103.03020106.02010000' => { Name => 'Purpose', Type => 'UTF-16' }, + '060e2b34.0101.0103.03020106.03010000' => { Name => 'Description', Type => 'UTF-16' }, + '060e2b34.0101.0103.03020106.04010000' => { Name => 'ColorDescriptor', Type => 'UTF-16' }, + '060e2b34.0101.0103.03020106.05010000' => { Name => 'FormatDescriptor', Type => 'UTF-16' }, + '060e2b34.0101.0103.03020106.06000000' => { Name => 'IntentDescriptor', Format => 'string' }, + '060e2b34.0101.0103.03020106.06010000' => { Name => 'IntentDescriptor', Type => 'UTF-16' }, + '060e2b34.0101.0103.03020106.07000000' => { Name => 'TextualDescriptionKind', Format => 'string' }, + '060e2b34.0101.0103.03020106.07010000' => { Name => 'TextualDescriptionKind', Type => 'UTF-16' }, + '060e2b34.0101.0103.03020201.03000000' => { Name => 'FestivalName', Format => 'string' }, + '060e2b34.0101.0103.03020301.02020000' => { Name => 'ObjectDescriptionCode', Format => 'string' }, + # '060e2b34.0101.0103.03020302.00000000' => { Name => 'GeneralComments', Type => 'Node' }, + '060e2b34.0101.0103.03020302.01000000' => { Name => 'DescriptionKind', Format => 'string' }, + '060e2b34.0101.0103.03020302.01010000' => { Name => 'DescriptionKind', Type => 'UTF-16' }, + '060e2b34.0101.0103.03020302.02000000' => { Name => 'DescriptiveComment', Format => 'string' }, + '060e2b34.0101.0103.03020302.02010000' => { Name => 'DescriptiveComment', Type => 'UTF-16' }, + # '060e2b34.0101.0103.03020401.00000000' => { Name => 'ObjectNames', Type => 'Node' }, + # '060e2b34.0101.0103.03020600.00000000' => { Name => 'Human-AssignedContextDescriptions', Type => 'Node' }, + '060e2b34.0101.0103.03020601.00000000' => { Name => 'ContextDescription', Format => 'string' }, + '060e2b34.0101.0103.03030102.06010000' => { Name => 'ComputedKeywords', Type => 'UTF-16' }, + '060e2b34.0101.0103.03030301.04000000' => { Name => 'ObjectIdentificationConfidence', Format => 'int16u' }, + '060e2b34.0101.0103.03030301.05000000' => { Name => 'ObjectHorizontalAverageDimension', Format => 'int32u' }, + '060e2b34.0101.0103.03030301.06000000' => { Name => 'ObjectVerticalAverageDimension', Format => 'int32u' }, + '060e2b34.0101.0103.03030301.07000000' => { Name => 'ObjectAreaDimension', Format => 'int32u' }, + '060e2b34.0101.0103.04010101.04000000' => { Name => 'HorizontalActionSafePercentage', Format => 'float' }, + '060e2b34.0101.0103.04010101.05000000' => { Name => 'VerticalActionSafePercentage', Format => 'float' }, + '060e2b34.0101.0103.04010101.06000000' => { Name => 'HorizontalGraphicsSafePercentage', Format => 'float' }, + '060e2b34.0101.0103.04010101.07000000' => { Name => 'VerticalGraphicsSafePercentage', Format => 'float' }, + '060e2b34.0101.0103.04010101.08000000' => { Name => 'PerceivedDisplayFormatName', Format => 'string' }, + '060e2b34.0101.0103.04010101.08010000' => { Name => 'PerceivedDisplayFormatCode', Format => 'string' }, + '060e2b34.0101.0103.04010201.01050000' => { Name => 'VideoColorKind', Format => 'string' }, + '060e2b34.0101.0103.04010301.07000000' => { Name => 'PictureDisplayRate', Format => 'int16u' }, + '060e2b34.0101.0103.04010501.11000000' => { Name => 'VideoAverageBitrate', Format => 'float', PrintConv => 'ConvertBitrate($val)' }, + '060e2b34.0101.0103.04010501.12000000' => { Name => 'VideoFixedBitrate', Type => 'Boolean' }, + # '060e2b34.0101.0103.04010b00.00000000' => { Name => 'VideoFileFormats', Type => 'Node' }, + '060e2b34.0101.0103.04010b01.00000000' => { Name => 'DigitalVideoFileFormat', Format => 'string' }, + '060e2b34.0101.0103.04020401.01000000' => { Name => 'CodingLawName', Format => 'string' }, + '060e2b34.0101.0103.04020402.01000000' => { Name => 'AudioCodingSchemeCode', Format => 'string', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0103.04020402.02000000' => { Name => 'AudioCodingSchemeName', Format => 'string', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0103.04030301.00000000' => { Name => 'DigitalEncodingBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' }, + '060e2b34.0101.0103.04030302.00000000' => { Name => 'DataEssenceCodingID', Type => 'AUID', Unknown => 1 }, + # '060e2b34.0101.0103.040f0000.00000000' => { Name => 'StorageCharacteristics', Type => 'Node' }, + '060e2b34.0101.0103.040f0100.00000000' => { Name => 'StorageKind', Format => 'string' }, + '060e2b34.0101.0103.040f0101.00000000' => { Name => 'StorageKind', Type => 'UTF-16' }, + '060e2b34.0101.0103.040f0102.00000000' => { Name => 'StorageKindCode', Format => 'string' }, + # '060e2b34.0101.0103.04100101.10000000' => { Name => 'TapeMediumFundamentalParameters', Type => 'Node' }, + '060e2b34.0101.0103.04100101.10010000' => { Name => 'TapePartitionCapacity', Format => 'int64u' }, + # '060e2b34.0101.0103.04100102.01000000' => { Name => 'DiscMediumFundamentalParameters', Type => 'Node' }, + '060e2b34.0101.0103.04100102.02000000' => { Name => 'DiscPartitionCapacity', Format => 'int64u' }, + '060e2b34.0101.0103.04200201.01040100' => { Name => 'FocalLength', Format => 'int32u', ValueConv => '$val/10' }, + '060e2b34.0101.0103.04200201.01080100' => { Name => 'FieldOfViewHorizontal', Format => 'int16u', ValueConv => '$val/10' }, + '060e2b34.0101.0103.04200201.010a0000' => { Name => 'FieldOfViewVertical', Format => 'int16u', ValueConv => '$val/10' }, + # '060e2b34.0101.0103.04300000.00000000' => { Name => 'SystemCharacteristics', Type => 'Node' }, + '060e2b34.0101.0103.04300100.00000000' => { Name => 'SystemNameOrNumber', Format => 'string' }, + '060e2b34.0101.0103.05010104.00000000' => { Name => 'LogoFlag', Type => 'Boolean' }, + '060e2b34.0101.0103.05010106.00000000' => { Name => 'GraphicKind', Format => 'string' }, + '060e2b34.0101.0103.05010107.00000000' => { Name => 'GraphicUsageKind', Format => 'string' }, + '060e2b34.0101.0103.05010401.00000000' => { Name => 'SignatureTuneFlag', Type => 'Boolean' }, + '060e2b34.0101.0103.05010402.00000000' => { Name => 'BackgroundMusicFlag', Type => 'Boolean' }, + # '060e2b34.0101.0103.06030000.00000000' => { Name => 'RelatedProductionContent', Type => 'Node' }, + # '060e2b34.0101.0103.06030500.00000000' => { Name => 'RelatedTextualContent', Type => 'Node' }, + '060e2b34.0101.0103.06030501.00000000' => { Name => 'ProductionScriptReference', Format => 'string' }, + '060e2b34.0101.0103.06030501.01000000' => { Name => 'ProductionScriptReference', Type => 'UTF-16' }, + '060e2b34.0101.0103.06030502.00000000' => { Name => 'TranscriptReference', Format => 'string' }, + '060e2b34.0101.0103.06030502.01000000' => { Name => 'TranscriptReference', Type => 'UTF-16' }, + '060e2b34.0101.0103.07010103.00000000' => { Name => 'HorizontalDatum', Format => 'string' }, + '060e2b34.0101.0103.07010104.00000000' => { Name => 'VerticalDatum', Format => 'string' }, + '060e2b34.0101.0103.07010201.02040200' => { Name => 'DeviceLatitude', Format => 'double', %geoLat }, + '060e2b34.0101.0103.07010201.02060200' => { Name => 'DeviceLongitude', Format => 'double', %geoLon }, + '060e2b34.0101.0103.07010201.03020200' => { Name => 'FrameCenterLatitude', Format => 'double', %geoLat }, + '060e2b34.0101.0103.07010201.03040200' => { Name => 'FrameCenterLongitude', Format => 'double', %geoLon }, + '060e2b34.0101.0103.07010201.03070000' => { Name => 'CornerLatitudePoint1', Format => 'string', %geoLat, ValueConv => \&ConvLatLon }, + '060e2b34.0101.0103.07010201.03070100' => { Name => 'CornerLatitudePoint1', Format => 'double', %geoLat }, + '060e2b34.0101.0103.07010201.03080000' => { Name => 'CornerLatitudePoint2', Format => 'string', %geoLat }, + '060e2b34.0101.0103.07010201.03080100' => { Name => 'CornerLatitudePoint2', Format => 'double', %geoLat }, + '060e2b34.0101.0103.07010201.03090000' => { Name => 'CornerLatitudePoint3', Format => 'string', %geoLat }, + '060e2b34.0101.0103.07010201.03090100' => { Name => 'CornerLatitudePoint3', Format => 'double', %geoLat }, + '060e2b34.0101.0103.07010201.030a0000' => { Name => 'CornerLatitudePoint4', Format => 'string' }, + '060e2b34.0101.0103.07010201.030a0100' => { Name => 'CornerLatitudePoint4', Format => 'double', %geoLat }, + '060e2b34.0101.0103.07010201.030b0000' => { Name => 'CornerLongitudePoint1', Format => 'string' }, + '060e2b34.0101.0103.07010201.030b0100' => { Name => 'CornerLongitudePoint1', Format => 'double', %geoLon }, + '060e2b34.0101.0103.07010201.030c0000' => { Name => 'CornerLongitudePoint2', Format => 'string' }, + '060e2b34.0101.0103.07010201.030c0100' => { Name => 'CornerLongitudePoint2', Format => 'double', %geoLon }, + '060e2b34.0101.0103.07010201.030d0000' => { Name => 'CornerLongitudePoint3', Format => 'string' }, + '060e2b34.0101.0103.07010201.030d0100' => { Name => 'CornerLongitudePoint3', Format => 'double', %geoLon }, + '060e2b34.0101.0103.07010201.030e0000' => { Name => 'CornerLongitudePoint4', Format => 'string' }, + '060e2b34.0101.0103.07010201.030e0100' => { Name => 'CornerLongitudePoint4', Format => 'double', %geoLon }, + '060e2b34.0101.0103.07010801.02000000' => { Name => 'SubjectDistance', Format => 'float' }, + '060e2b34.0101.0103.07012001.01010100' => { Name => 'PlaceKeyword', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.02010100' => { Name => 'ObjectCountryCode', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.02060000' => { Name => 'ObjectCountryCodeMethod', Format => 'string' }, + '060e2b34.0101.0103.07012001.02070000' => { Name => 'CountryCodeMethod', Format => 'string' }, + '060e2b34.0101.0103.07012001.02080000' => { Name => 'Non-USClassifyingCountryCode', Format => 'string' }, + '060e2b34.0101.0103.07012001.02090000' => { Name => 'ReleasableCountryCode', Format => 'string' }, + '060e2b34.0101.0103.07012001.03010100' => { Name => 'ObjectRegionName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.03020100' => { Name => 'ShootingRegionName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.03030100' => { Name => 'SettingRegionName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.03040100' => { Name => 'CopyrightLicenseRegionName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.03050100' => { Name => 'IntellectualPropertyLicenseRegionName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04010101' => { Name => 'RoomNumber', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04010201' => { Name => 'StreetNumber', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04010301' => { Name => 'StreetName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04010401' => { Name => 'PostalTown', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04010501' => { Name => 'CityName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04010601' => { Name => 'StateOrProvinceOrCountyName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04010701' => { Name => 'PostalCode', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04010801' => { Name => 'CountryName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04020101' => { Name => 'SettingRoomNumber', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04020201' => { Name => 'SettingStreetNumberOrBuildingName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04020301' => { Name => 'SettingStreetName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04020401' => { Name => 'SettingTownName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04020501' => { Name => 'SettingCityName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04020601' => { Name => 'SettingStateOrProvinceOrCountyName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04020701' => { Name => 'SettingPostalCode', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.04020801' => { Name => 'SettingCountryName', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.10030101' => { Name => 'TelephoneNumber', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.10030201' => { Name => 'FaxNumber', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012001.10030301' => { Name => 'E-mailAddress', Type => 'UTF-16' }, + '060e2b34.0101.0103.07012002.01010000' => { Name => 'SettingDescription', Type => 'UTF-16' }, + '060e2b34.0101.0103.07020101.01050000' => { Name => 'POSIXMicroseconds', Format => 'int64u' }, + # '060e2b34.0101.0103.07020103.10030000' => { Name => 'EventOffsets', Type => 'Node' }, + '060e2b34.0101.0103.07020103.10030100' => { Name => 'EventElapsedTimeToStart', Format => 'string' }, + '060e2b34.0101.0103.07020103.10030200' => { Name => 'EventElapsedTimeToEnd', Format => 'string' }, + '060e2b34.0101.0104.01011002.00000000' => { Name => 'OrganizationIDKind', Format => 'string' }, + '060e2b34.0101.0104.01011002.01000000' => { Name => 'OrganizationIDKind', Type => 'UTF-16' }, + # '060e2b34.0101.0104.01020200.00000000' => { Name => 'RegistryLocators', Type => 'Node' }, + '060e2b34.0101.0104.01020201.00000000' => { Name => 'SMPTEUL', Type => 'UL', Unknown => 1 }, + # '060e2b34.0101.0104.01020210.00000000' => { Name => 'RegistryLocatorGroups', Type => 'Node' }, + # '060e2b34.0101.0104.01020210.01000000' => { Name => 'RegistryLocatorOrderedGroup', Type => 'Node' }, + '060e2b34.0101.0104.01020210.01010000' => { Name => 'EssenceContainerArray', Type => 'Array of UL', Unknown => 1 }, + '060e2b34.0101.0104.01030404.00000000' => { Name => 'EssenceStreamID', Format => 'int32u' }, + '060e2b34.0101.0104.01030405.00000000' => { Name => 'IndexStreamID', Format => 'int32u' }, + '060e2b34.0101.0104.01050a00.00000000' => { Name => 'WorkingTitle', Format => 'string' }, + '060e2b34.0101.0104.01050a01.00000000' => { Name => 'WorkingTitle', Type => 'UTF-16' }, + '060e2b34.0101.0104.01050b00.00000000' => { Name => 'OriginalTitle', Format => 'string' }, + '060e2b34.0101.0104.01050b01.00000000' => { Name => 'OriginalTitle', Type => 'UTF-16' }, + '060e2b34.0101.0104.01050c00.00000000' => { Name => 'ClipNumber', Format => 'string' }, + '060e2b34.0101.0104.01050c01.00000000' => { Name => 'ClipNumber', Type => 'UTF-16' }, + '060e2b34.0101.0104.01070105.00000000' => { Name => 'DescriptiveMetadataTrackIDs', Format => 'int32u' }, + # '060e2b34.0101.0104.01080000.00000000' => { Name => 'GenericIdentifiers', Type => 'Node' }, + '060e2b34.0101.0104.01080100.00000000' => { Name => 'IdentifierKind', Format => 'string' }, + '060e2b34.0101.0104.01080200.00000000' => { Name => 'IdentifierValue', Format => 'int8u' }, + # '060e2b34.0101.0104.010a0200.00000000' => { Name => 'GeneralOrganizationIdentifiers', Type => 'Node' }, + '060e2b34.0101.0104.010a0201.00000000' => { Name => 'OrganizationCode', Format => 'string' }, + '060e2b34.0101.0104.010a0201.01000000' => { Name => 'OrganizationCode', Type => 'UTF-16' }, + '060e2b34.0101.0104.02010500.00000000' => { Name => 'SupplierIdentificationKind', Format => 'string' }, + '060e2b34.0101.0104.02010600.00000000' => { Name => 'SupplierIdentificationValue', Format => 'string' }, + '060e2b34.0101.0104.02010700.00000000' => { Name => 'SupplierAccountNumber', Format => 'string' }, + '060e2b34.0101.0104.02010800.00000000' => { Name => 'SupplierAccountName', Format => 'string' }, + '060e2b34.0101.0104.02010801.00000000' => { Name => 'SupplierAccountName', Type => 'UTF-16' }, + '060e2b34.0101.0104.02020400.00000000' => { Name => 'EpisodeStartNumber', Format => 'int16u' }, + '060e2b34.0101.0104.02020500.00000000' => { Name => 'EpisodeEndNumber', Format => 'int16u' }, + '060e2b34.0101.0104.02030500.00000000' => { Name => 'PurchaserIdentificationKind', Format => 'string' }, + '060e2b34.0101.0104.02030600.00000000' => { Name => 'PurchaserIdentificationValue', Format => 'string' }, + '060e2b34.0101.0104.02030700.00000000' => { Name => 'PurchaserAccountNumber', Format => 'string' }, + '060e2b34.0101.0104.02030800.00000000' => { Name => 'PurchaserAccountName', Format => 'string' }, + '060e2b34.0101.0104.02030801.00000000' => { Name => 'PurchaserAccountName', Type => 'UTF-16' }, + '060e2b34.0101.0104.02040102.00000000' => { Name => 'ContractType', Type => 'UTF-16' }, + '060e2b34.0101.0104.02040201.00000000' => { Name => 'ContractClauseDescription', Type => 'UTF-16' }, + '060e2b34.0101.0104.02040302.00000000' => { Name => 'ContractLineName', Type => 'UTF-16' }, + '060e2b34.0101.0104.02040401.00000000' => { Name => 'ContractTermsOfBusiness', Type => 'UTF-16' }, + '060e2b34.0101.0104.02040601.00000000' => { Name => 'Jurisdiction', Type => 'UTF-16' }, + '060e2b34.0101.0104.02060102.00000000' => { Name => 'TotalCurrencyAmount', Format => 'double' }, + '060e2b34.0101.0104.02060103.00000000' => { Name => 'InstallmentNumber', Format => 'int16u' }, + # '060e2b34.0101.0104.020a0000.00000000' => { Name => 'IdentifiersAndLocatorsAdministrationAuthorities', Type => 'Node' }, + '060e2b34.0101.0104.020a0100.00000000' => { Name => 'IdentifierIssuingAuthority', Format => 'string' }, + # '060e2b34.0101.0104.02100200.00000000' => { Name => 'Publication', Type => 'Node' }, + # '060e2b34.0101.0104.02100201.00000000' => { Name => 'GeneralPublication', Type => 'Node' }, + '060e2b34.0101.0104.02100201.01000000' => { Name => 'PublishingOrganizationName', Format => 'string' }, + '060e2b34.0101.0104.02100201.01010000' => { Name => 'PublishingOrganizationName', Type => 'UTF-16' }, + '060e2b34.0101.0104.02100201.02000000' => { Name => 'PublishingServiceName', Format => 'string' }, + '060e2b34.0101.0104.02100201.02010000' => { Name => 'PublishingServiceName', Type => 'UTF-16' }, + '060e2b34.0101.0104.02100201.03000000' => { Name => 'PublishingMediumName', Format => 'string' }, + '060e2b34.0101.0104.02100201.03010000' => { Name => 'PublishingMediumName', Type => 'UTF-16' }, + '060e2b34.0101.0104.02100201.04000000' => { Name => 'PublishingRegionName', Format => 'string' }, + '060e2b34.0101.0104.02100201.04010000' => { Name => 'PublishingRegionName', Type => 'UTF-16' }, + '060e2b34.0101.0104.02300603.01050100' => { Name => 'Salutation', Type => 'UTF-16' }, + '060e2b34.0101.0104.02300603.01060100' => { Name => 'HonorsAndQualifications', Type => 'UTF-16' }, + '060e2b34.0101.0104.02300603.01080000' => { Name => 'OtherGivenNames', Format => 'string' }, + '060e2b34.0101.0104.02300603.01080100' => { Name => 'OtherGivenNames', Type => 'UTF-16' }, + '060e2b34.0101.0104.02300603.01090000' => { Name => 'AlternateName', Format => 'string' }, + '060e2b34.0101.0104.02300603.01090100' => { Name => 'AlternateName', Type => 'UTF-16' }, + # '060e2b34.0101.0104.03010102.02000000' => { Name => 'TextLanguageCodes', Type => 'Node' }, + '060e2b34.0101.0104.03010102.02010000' => { Name => 'ISO639TextLanguageCode', Format => 'string', LanguageCode => 1 }, + '060e2b34.0101.0104.03010102.02020000' => { Name => 'ISO639CaptionsLanguageCode', Format => 'string' }, + # '060e2b34.0101.0104.03010102.03000000' => { Name => 'SpokenLanguageCodes', Type => 'Node' }, + '060e2b34.0101.0104.03010102.03010000' => { Name => 'PrimarySpokenLanguageCode', Format => 'string' }, + '060e2b34.0101.0104.03010102.03020000' => { Name => 'SecondarySpokenLanguageCode', Format => 'string' }, + '060e2b34.0101.0104.03010102.03030000' => { Name => 'PrimaryOriginalLanguageCode', Format => 'string' }, + '060e2b34.0101.0104.03010102.03040000' => { Name => 'SecondaryOriginalLanguageCode', Format => 'string' }, + '060e2b34.0101.0104.03010201.06000000' => { Name => 'MajorVersion', Format => 'int16u' }, + '060e2b34.0101.0104.03010201.07000000' => { Name => 'MinorVersion', Format => 'int16u' }, + '060e2b34.0101.0104.03010201.08000000' => { Name => 'SectorSize', Format => 'int32u' }, + '060e2b34.0101.0104.03010203.09000000' => { Name => 'ElementLength', Format => 'int32u' }, + '060e2b34.0101.0104.03020102.02010000' => { Name => 'ThesaurusName', Type => 'UTF-16' }, + '060e2b34.0101.0104.03020102.0d010000' => { Name => 'Cue-InWords', Type => 'UTF-16' }, + '060e2b34.0101.0104.03020102.0e010000' => { Name => 'Cue-OutWords', Type => 'UTF-16' }, + '060e2b34.0101.0104.03020102.10000000' => { Name => 'KeypointKind', Format => 'string' }, + '060e2b34.0101.0104.03020102.10010000' => { Name => 'KeypointKind', Type => 'UTF-16' }, + '060e2b34.0101.0104.03020102.11000000' => { Name => 'KeypointValue', Format => 'string' }, + '060e2b34.0101.0104.03020102.11010000' => { Name => 'KeypointValue', Type => 'UTF-16' }, + '060e2b34.0101.0104.03020201.03010000' => { Name => 'FestivalName', Type => 'UTF-16' }, + '060e2b34.0101.0104.03020201.04000000' => { Name => 'AwardName', Format => 'string' }, + '060e2b34.0101.0104.03020201.04010000' => { Name => 'AwardName', Type => 'UTF-16' }, + '060e2b34.0101.0104.03020201.05000000' => { Name => 'AwardCategory', Format => 'string' }, + '060e2b34.0101.0104.03020201.05010000' => { Name => 'AwardCategory', Type => 'UTF-16' }, + '060e2b34.0101.0104.03020503.00000000' => { Name => 'SlateInformation', Type => 'UTF-16' }, + '060e2b34.0101.0104.04020301.04000000' => { Name => 'LockedIndicator', Type => 'Boolean' }, + '060e2b34.0101.0104.04020303.04000000' => { Name => 'BitsPerAudioSample', Format => 'int32u', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0104.04030101.00000000' => { Name => 'CaptionKind', Format => 'string' }, + '060e2b34.0101.0104.04030101.01000000' => { Name => 'CaptionKind', Type => 'UTF-16' }, + # '060e2b34.0101.0104.04040400.00000000' => { Name => 'IndexingMetadataCodingCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0104.04040401.00000000' => { Name => 'IntraEditUnitIndexing', Type => 'Node' }, + '060e2b34.0101.0104.04040401.01000000' => { Name => 'SliceCount', Format => 'int8u' }, + '060e2b34.0101.0104.04040401.02000000' => { Name => 'SliceNumber', Format => 'int8u' }, + '060e2b34.0101.0104.04040401.03000000' => { Name => 'ElementDelta', Format => 'int32u' }, + '060e2b34.0101.0104.04040401.04000000' => { Name => 'PositionTableIndexing', Format => 'int8s' }, + '060e2b34.0101.0104.04040401.05000000' => { Name => 'SliceOffsetList', Type => 'UInt32Array', Unknown => 1 }, + '060e2b34.0101.0104.04040401.08000000' => { Name => 'PosTableArray', Unknown => 1 }, + # '060e2b34.0101.0104.04040402.00000000' => { Name => 'InterEditUnitIndexing', Type => 'Node' }, + '060e2b34.0101.0104.04040402.01000000' => { Name => 'StreamOffset', Format => 'int64u' }, + '060e2b34.0101.0104.04040402.02000000' => { Name => 'EditUnitFlags', Format => 'int8u' }, + '060e2b34.0101.0104.04040402.03000000' => { Name => 'TemporalOffset', Format => 'int8s' }, + '060e2b34.0101.0104.04040402.04000000' => { Name => 'AnchorOffset', Format => 'int8s' }, + # '060e2b34.0101.0104.04060200.00000000' => { Name => 'GeneralEssenceContainerCharacteristics', Type => 'Node' }, + '060e2b34.0101.0104.04060201.00000000' => { Name => 'EditUnitLength', Format => 'int32u' }, + # '060e2b34.0101.0104.04060800.00000000' => { Name => 'GeneralMetadataCodingCharacteristics', Type => 'Node' }, + # '060e2b34.0101.0104.04060900.00000000' => { Name => 'GeneralMetadataContainerCharacteristics', Type => 'Node' }, + '060e2b34.0101.0104.04060901.00000000' => { Name => 'HeaderByteCount', Format => 'int64u' }, + '060e2b34.0101.0104.04060902.00000000' => { Name => 'IndexByteCount', Format => 'int64u' }, + # '060e2b34.0101.0104.04061000.00000000' => { Name => 'GeneralDataCodingCharacteristics', Type => 'Node' }, + '060e2b34.0101.0104.04061001.00000000' => { Name => 'PackLength', Format => 'int32u' }, + # '060e2b34.0101.0104.04200102.00000000' => { Name => 'ImagerCharacteristics', Type => 'Node' }, + '060e2b34.0101.0104.05010101.01000000' => { Name => 'IntegrationIndication', Type => 'UTF-16' }, + '060e2b34.0101.0104.05010102.01000000' => { Name => 'EventIndication', Type => 'UTF-16' }, + '060e2b34.0101.0104.05010107.01000000' => { Name => 'GraphicUsageKind', Type => 'UTF-16' }, + '060e2b34.0101.0104.06010104.01080000' => { Name => 'PrimaryPackage', Type => 'WeakReference', Unknown => 1 }, + # '060e2b34.0101.0104.06010104.02400000' => { Name => 'StrongReferencingToDescriptiveMetadataSets', Type => 'Node' }, + '060e2b34.0101.0104.06010104.03030000' => { Name => 'DescriptiveMetadataSets', Type => 'WeakReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0104.06010104.04020000' => { Name => 'DescriptiveMetadataSetReferences', Type => 'WeakReferenceArray', Unknown => 1 }, + # '060e2b34.0101.0104.06010104.05400000' => { Name => 'StrongReferencesToDescriptiveMetadataBatches', Type => 'Node' }, + '060e2b34.0101.0104.06010104.060b0000' => { Name => 'FileDescriptors', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0104.06080102.01010000' => { Name => 'StreamPositionIndicator', Format => 'int16u' }, + '060e2b34.0101.0104.06080102.01020000' => { Name => 'StreamPositionIndicator', Format => 'int32u' }, + '060e2b34.0101.0104.06080102.01030000' => { Name => 'StreamPositionIndicator', Format => 'int64u' }, + '060e2b34.0101.0104.06080202.01000000' => { Name => 'OffsetToMetadata', Format => 'int32s' }, + '060e2b34.0101.0104.06080202.01010000' => { Name => 'OffsetToMetadata', Format => 'int64s' }, + '060e2b34.0101.0104.06080202.02000000' => { Name => 'OffsetToIndexTable', Format => 'int32s' }, + '060e2b34.0101.0104.06080202.02010000' => { Name => 'OffsetToIndexTable', Format => 'int64s' }, + # '060e2b34.0101.0104.06090000.00000000' => { Name => 'DataRelationships', Type => 'Node' }, + # '060e2b34.0101.0104.06090200.00000000' => { Name => 'LocalDataRelationships', Type => 'Node' }, + # '060e2b34.0101.0104.06090201.00000000' => { Name => 'DataOffsets', Type => 'Node' }, + '060e2b34.0101.0104.06090201.01000000' => { Name => 'ByteOffset', Format => 'int64u' }, + '060e2b34.0101.0104.06090201.02000000' => { Name => 'ReversePlay', Format => 'int64u' }, + # '060e2b34.0101.0104.06101000.00000000' => { Name => 'RelativeNumericalSequences', Type => 'Node' }, + '060e2b34.0101.0104.06101001.00000000' => { Name => 'FirstNumberInSequence', Format => 'int32u' }, + '060e2b34.0101.0104.06101001.01000000' => { Name => 'FirstNumberInSequence', Format => 'int64u' }, + '060e2b34.0101.0104.06101002.00000000' => { Name => 'PreviousNumberInSequence', Format => 'int32u' }, + '060e2b34.0101.0104.06101002.01000000' => { Name => 'PreviousNumberInSequence', Format => 'int64u' }, + '060e2b34.0101.0104.06101003.00000000' => { Name => 'CurrentNumberInSequence', Format => 'int32u' }, + '060e2b34.0101.0104.06101003.01000000' => { Name => 'CurrentNumberInSequence', Format => 'int64u' }, + '060e2b34.0101.0104.06101004.00000000' => { Name => 'NextNumberInSequence', Format => 'int32u' }, + '060e2b34.0101.0104.06101004.01000000' => { Name => 'NextNumberInSequence', Format => 'int64u' }, + '060e2b34.0101.0104.06101005.00000000' => { Name => 'LastNumberInSequence', Format => 'int32u' }, + '060e2b34.0101.0104.06101005.01000000' => { Name => 'LastNumberInSequence', Format => 'int64u' }, + # '060e2b34.0101.0104.07012001.10000000' => { Name => 'ElectronicAddressVarieties', Type => 'Node' }, + '060e2b34.0101.0104.07012001.10030400' => { Name => 'CentralTelephoneNumber', Format => 'string' }, + '060e2b34.0101.0104.07012001.10030500' => { Name => 'MobileTelephoneNumber', Format => 'string' }, + '060e2b34.0101.0104.07012001.10030600' => { Name => 'URL', Format => 'string' }, + '060e2b34.0101.0104.07012002.02000000' => { Name => 'LocationDescription', Format => 'string' }, + '060e2b34.0101.0104.07012002.02010000' => { Name => 'LocationDescription', Type => 'UTF-16' }, + '060e2b34.0101.0104.07012002.03000000' => { Name => 'LocationKind', Format => 'string' }, + '060e2b34.0101.0104.07012002.03010000' => { Name => 'LocationKind', Type => 'UTF-16' }, + '060e2b34.0101.0104.07020102.07010100' => { Name => 'UTCEventStartDateTime', %timestamp }, + '060e2b34.0101.0104.07020102.07020100' => { Name => 'LocalEventStartDateTime', %timestamp }, + '060e2b34.0101.0104.07020102.09010100' => { Name => 'UTCEventEndDateTime', %timestamp }, + '060e2b34.0101.0104.07020102.09020100' => { Name => 'LocalEventEndDateTime', %timestamp }, + '060e2b34.0101.0104.07020103.01070000' => { Name => 'KeyTimePoint', Format => 'int64u' }, + '060e2b34.0101.0104.07020108.01010000' => { Name => 'TimePeriodName', Type => 'UTF-16' }, + '060e2b34.0101.0104.07020108.02000000' => { Name => 'SettingDateTime', %timestamp }, + # '060e2b34.0101.0104.07020120.00000000' => { Name => 'AdministrativeDateTime', Type => 'Node' }, + '060e2b34.0101.0104.07020120.01000000' => { Name => 'ContractDateTime', %timestamp }, + '060e2b34.0101.0104.07020120.02000000' => { Name => 'RightsStartDateTime', %timestamp }, + '060e2b34.0101.0104.07020120.03000000' => { Name => 'RightsStopDateTime', %timestamp }, + '060e2b34.0101.0104.07020120.04000000' => { Name => 'PaymentDueDateTime', %timestamp }, + # '060e2b34.0101.0105.01010500.00000000' => { Name => 'UMIDPicture', Type => 'Node' }, + # '060e2b34.0101.0105.01010600.00000000' => { Name => 'UMIDMultiPicture', Type => 'Node' }, + # '060e2b34.0101.0105.01010800.00000000' => { Name => 'UMIDSound', Type => 'Node' }, + # '060e2b34.0101.0105.01010900.00000000' => { Name => 'UMIDMultiSound', Type => 'Node' }, + # '060e2b34.0101.0105.01010b00.00000000' => { Name => 'UMIDSingleData', Type => 'Node' }, + # '060e2b34.0101.0105.01010c00.00000000' => { Name => 'UMIDMultiData', Type => 'Node' }, + # '060e2b34.0101.0105.01010d00.00000000' => { Name => 'UMIDMixed', Type => 'Node' }, + # '060e2b34.0101.0105.01010f00.00000000' => { Name => 'UMIDGeneral', Type => 'Node' }, + '060e2b34.0101.0105.01011508.00000000' => { Name => 'ClipID', Type => 'UMID' }, + '060e2b34.0101.0105.01012008.01000000' => { Name => 'DeviceKind', Type => 'UTF-16' }, + '060e2b34.0101.0105.0101200c.00000000' => { Name => 'DeviceAssetNumber', Format => 'string' }, + '060e2b34.0101.0105.01020202.00000000' => { Name => 'IdentificationUL', Type => 'UL', Unknown => 1 }, + '060e2b34.0101.0105.01020203.00000000' => { Name => 'OperationalPatternUL', Type => 'UL', Unknown => 1 }, + # '060e2b34.0101.0105.01020210.02000000' => { Name => 'RegistryLocatorUnorderedGroups', Type => 'Node' }, + '060e2b34.0101.0105.01020210.02010000' => { Name => 'EssenceContainers', Type => 'BatchOfUL', Unknown => 1 }, + '060e2b34.0101.0105.01020210.02020000' => { Name => 'DescriptiveMetadataSchemes', Type => 'BatchOfUL', Unknown => 1 }, + '060e2b34.0101.0105.01030108.00000000' => { Name => 'ProjectName', Format => 'string' }, + '060e2b34.0101.0105.01030108.01000000' => { Name => 'ProjectName', Type => 'UTF-16' }, + '060e2b34.0101.0105.01030602.00000000' => { Name => 'LocalTagValue', Format => 'int16u' }, + '060e2b34.0101.0105.01030603.00000000' => { Name => 'LocalTagUniqueID', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0105.01050d00.00000000' => { Name => 'BrandMainTitle', Format => 'string' }, + '060e2b34.0101.0105.01050d01.00000000' => { Name => 'BrandMainTitle', Type => 'UTF-16' }, + '060e2b34.0101.0105.01050e00.00000000' => { Name => 'BrandOriginalTitle', Format => 'string' }, + '060e2b34.0101.0105.01050e01.00000000' => { Name => 'BrandOriginalTitle', Type => 'UTF-16' }, + '060e2b34.0101.0105.01050f00.00000000' => { Name => 'FrameworkTitle', Format => 'string' }, + '060e2b34.0101.0105.01050f01.00000000' => { Name => 'FrameworkTitle', Type => 'UTF-16' }, + '060e2b34.0101.0105.01070106.00000000' => { Name => 'SourceTrackIDs', Format => 'int32u' }, + '060e2b34.0101.0105.01070107.00000000' => { Name => 'ShotTrackIDs', Format => 'int32u' }, + '060e2b34.0101.0105.02020301.00000000' => { Name => 'ProgrammingGroupKind', Type => 'UTF-16' }, + '060e2b34.0101.0105.02020600.00000000' => { Name => 'ProgrammingGroupTitle', Format => 'string' }, + '060e2b34.0101.0105.02020601.00000000' => { Name => 'ProgrammingGroupTitle', Type => 'UTF-16' }, + '060e2b34.0101.0105.020a0101.00000000' => { Name => 'IdentifierIssuingAuthority', Type => 'UTF-16' }, + '060e2b34.0101.0105.02300603.010a0000' => { Name => 'LinkingName', Format => 'string' }, + '060e2b34.0101.0105.02300603.010a0100' => { Name => 'LinkingName', Type => 'UTF-16' }, + '060e2b34.0101.0105.02300603.010b0000' => { Name => 'NameSuffix', Format => 'string' }, + '060e2b34.0101.0105.02300603.010b0100' => { Name => 'NameSuffix', Type => 'UTF-16' }, + '060e2b34.0101.0105.02300603.010c0000' => { Name => 'FormerFamilyName', Format => 'string' }, + '060e2b34.0101.0105.02300603.010c0100' => { Name => 'FormerFamilyName', Type => 'UTF-16' }, + '060e2b34.0101.0105.02300603.010d0000' => { Name => 'Nationality', Format => 'string' }, + '060e2b34.0101.0105.02300603.010d0100' => { Name => 'Nationality', Type => 'UTF-16' }, + '060e2b34.0101.0105.02300603.010e0000' => { Name => 'Citizenship', Format => 'string' }, + '060e2b34.0101.0105.02300603.010e0100' => { Name => 'Citizenship', Type => 'UTF-16' }, + '060e2b34.0101.0105.03010102.02030000' => { Name => 'FrameworkTextLanguageCode', Format => 'string', LanguageCode => 1 }, + '060e2b34.0101.0105.03010201.09000000' => { Name => 'KAGSize', Format => 'int32u' }, + '060e2b34.0101.0105.03010201.0a000000' => { Name => 'ReversedByteOrder', Type => 'Boolean' }, + # '060e2b34.0101.0105.0301020a.00000000' => { Name => 'NameValueConstructInterpretations', Type => 'Node' }, + '060e2b34.0101.0105.0301020a.01000000' => { Name => 'ItemName', Format => 'string' }, + '060e2b34.0101.0105.0301020a.01010000' => { Name => 'ItemName', Type => 'UTF-16' }, + '060e2b34.0101.0105.0301020a.02000000' => { Name => 'ItemValue', Format => 'string' }, + '060e2b34.0101.0105.0301020a.02010000' => { Name => 'ItemValue', Type => 'UTF-16' }, + # '060e2b34.0101.0105.03010220.00000000' => { Name => 'XMLConstructsAndInterpretations', Type => 'Node' }, + '060e2b34.0101.0105.03010220.01000000' => { Name => 'XMLDocumentText', Type => 'Indirect', Unknown => 1 }, + '060e2b34.0101.0105.03010220.01010000' => { Name => 'XMLDocumentText', Format => 'string' }, + '060e2b34.0101.0105.03010220.01020000' => { Name => 'XMLDocumentText', Type => 'UTF-16' }, + '060e2b34.0101.0105.03010220.01030000' => { Name => 'XMLDocumentText', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0105.03020102.15000000' => { Name => 'FrameworkThesaurusName', Format => 'string' }, + '060e2b34.0101.0105.03020102.15010000' => { Name => 'FrameworkThesaurusName', Type => 'UTF-16' }, + '060e2b34.0101.0105.03020106.08000000' => { Name => 'GroupSynopsis', Format => 'string' }, + '060e2b34.0101.0105.03020106.08010000' => { Name => 'GroupSynopsis', Type => 'UTF-16' }, + '060e2b34.0101.0105.03020106.09000000' => { Name => 'AnnotationSynopsis', Format => 'string' }, + '060e2b34.0101.0105.03020106.09010000' => { Name => 'AnnotationSynopsis', Type => 'UTF-16' }, + '060e2b34.0101.0105.03020106.0a000000' => { Name => 'AnnotationDescription', Format => 'string' }, + '060e2b34.0101.0105.03020106.0a010000' => { Name => 'AnnotationDescription', Type => 'UTF-16' }, + '060e2b34.0101.0105.03020106.0b000000' => { Name => 'ScriptingKind', Format => 'string' }, + '060e2b34.0101.0105.03020106.0b010000' => { Name => 'ScriptingKind', Type => 'UTF-16' }, + '060e2b34.0101.0105.03020106.0c000000' => { Name => 'ScriptingText', Format => 'string' }, + '060e2b34.0101.0105.03020106.0c010000' => { Name => 'ScriptingText', Type => 'UTF-16' }, + '060e2b34.0101.0105.03020106.0d000000' => { Name => 'ShotDescription', Format => 'string' }, + '060e2b34.0101.0105.03020106.0d010000' => { Name => 'ShotDescription', Type => 'UTF-16' }, + '060e2b34.0101.0105.03020106.0e000000' => { Name => 'AnnotationKind', Format => 'string' }, + '060e2b34.0101.0105.03020106.0e010000' => { Name => 'AnnotationKind', Type => 'UTF-16' }, + '060e2b34.0101.0105.03020106.0f000000' => { Name => 'RelatedMaterialDescription', Format => 'string' }, + '060e2b34.0101.0105.03020106.0f010000' => { Name => 'RelatedMaterialDescription', Type => 'UTF-16' }, + '060e2b34.0101.0105.03020504.00000000' => { Name => 'ClipKind', Type => 'UTF-16' }, + # '060e2b34.0101.0105.03030310.00000000' => { Name => 'DeviceCommentsAndDescriptions', Type => 'Node' }, + '060e2b34.0101.0105.03030310.01000000' => { Name => 'DeviceUsageDescription', Format => 'string' }, + '060e2b34.0101.0105.03030310.01010000' => { Name => 'DeviceUsageDescription', Type => 'UTF-16' }, + '060e2b34.0101.0105.04010302.07000000' => { Name => 'DisplayF2Offset', Format => 'int32s' }, + '060e2b34.0101.0105.04010302.08000000' => { Name => 'StoredF2Offset', Format => 'int32s' }, + '060e2b34.0101.0105.04010302.09000000' => { Name => 'ActiveFormatDescriptor', Format => 'int8u' }, + '060e2b34.0101.0105.04010302.0a000000' => { Name => 'LineNumber', Format => 'int32u' }, + # '060e2b34.0101.0105.04010404.00000000' => { Name => 'VideoScanningCharacteristics', Type => 'Node' }, + '060e2b34.0101.0105.04010404.01000000' => { Name => 'ScanningDirection', Format => 'int8u' }, + '060e2b34.0101.0105.04010503.0b000000' => { Name => 'ComponentMaximumRef', Format => 'int32u' }, + '060e2b34.0101.0105.04010503.0c000000' => { Name => 'ComponentMinimumRef', Format => 'int32u' }, + '060e2b34.0101.0105.04010503.0d000000' => { Name => 'AlphaMaximumRef', Format => 'int32u' }, + '060e2b34.0101.0105.04010503.0e000000' => { Name => 'AlphaMinimumRef', Format => 'int32u' }, + # '060e2b34.0101.0105.04010504.00000000' => { Name => 'DigitalVideoAndImageSignalTypeIdentifiers', Type => 'Node' }, + '060e2b34.0101.0105.04010504.01000000' => { Name => 'VideoPayloadIdentifier', Format => 'int8u' }, + '060e2b34.0101.0105.04010504.02000000' => { Name => 'VideoPayloadIdentifier2002', Format => 'int8u' }, + '060e2b34.0101.0105.04010602.01020000' => { Name => 'SingleSequenceFlag', Type => 'Boolean' }, + '060e2b34.0101.0105.04010602.01030000' => { Name => 'ConstantBPictureFlag', Type => 'Boolean' }, + '060e2b34.0101.0105.04010602.01040000' => { Name => 'CodedContentScanningKind', Type => 'int8u', + PrintConv => { 0 => 'Unknown', 1 => 'Progressive', 2 => 'Interlaced', 3 => 'Mixed' }, + }, + '060e2b34.0101.0105.04010602.01050000' => { Name => 'LowDelayIndicator', Type => 'Boolean' }, + '060e2b34.0101.0105.04010602.01060000' => { Name => 'ClosedGOPIndicator', Type => 'Boolean' }, + '060e2b34.0101.0105.04010602.01070000' => { Name => 'IdenticalGOPIndicator', Type => 'Boolean' }, + '060e2b34.0101.0105.04010602.01080000' => { Name => 'MaximumGOPSize', Format => 'int16u' }, + '060e2b34.0101.0105.04010602.01090000' => { Name => 'MaximumBPictureCount', Format => 'int16u' }, + '060e2b34.0101.0105.04010602.010a0000' => { Name => 'ProfileAndLevel', Format => 'int8u' }, + '060e2b34.0101.0105.04010602.010b0000' => { Name => 'Bitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' }, + '060e2b34.0101.0105.04020101.04000000' => { Name => 'ChannelCount', Format => 'int32u', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0105.04020301.01010000' => { Name => 'AudioSampleRate', Format => 'rational64s', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0105.04020301.05000000' => { Name => 'PeakEnvelope', Format => 'int8u', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0105.04020301.0e000000' => { Name => 'PeakEnvelopeData', Type => 'Stream', Unknown => 1, Groups => { 2 => 'Audio' } }, + '060e2b34.0101.0105.04020302.01000000' => { Name => 'BlockAlign', Format => 'int16u' }, + '060e2b34.0101.0105.04020302.02000000' => { Name => 'SequenceOffset', Format => 'int8u' }, + '060e2b34.0101.0105.04020302.03000000' => { Name => 'BlockStartOffset', Format => 'int16u' }, + '060e2b34.0101.0105.04020302.05000000' => { Name => 'FileSecurityReport', Format => 'int32u' }, + '060e2b34.0101.0105.04020302.06000000' => { Name => 'FileSecurityWave', Format => 'int32u' }, + '060e2b34.0101.0105.04020303.05000000' => { Name => 'AverageBytesPerSecond', Format => 'int32u', Groups => { 2 => 'Audio' } }, + # '060e2b34.0101.0105.04020500.00000000' => { Name => 'DigitalAudioProcessingParameters', Type => 'Node' }, + # '060e2b34.0101.0105.04020501.00000000' => { Name => 'AES-3ProcessingParameters', Type => 'Node' }, + '060e2b34.0101.0105.04020501.01000000' => { Name => 'AuxiliaryBitsMode', Format => 'int8u' }, + '060e2b34.0101.0105.04020501.02000000' => { Name => 'ChannelStatusMode', Format => 'undef', + RawConv => 'length($val) > 8 ? join(" ",unpack("x8C*",$val)) : undef', + # convert just the first value for now + PrintConv => [{ + 0 => 'No Channel Status Data', + 1 => 'AES3 Minimum', + 2 => 'AES3 Standard', + 3 => 'Fixed 24 Bytes in FixedChannelStatusData', + 4 => 'Stream of Data in MXF Header Metadata', + 5 => 'Stream of Data Multiplexed within MXF Body', + }], + }, + '060e2b34.0101.0105.04020501.03000000' => { Name => 'FixedChannelStatusData', Type => 'Array of bytes', Unknown => 1 }, + '060e2b34.0101.0105.04020501.04000000' => { Name => 'UserDataMode', Type => 'EnumeratedArray', Unknown => 1 }, + '060e2b34.0101.0105.04020501.05000000' => { Name => 'FixedUserData', Type => 'Array of bytes', Unknown => 1 }, + '060e2b34.0101.0105.04020501.06000000' => { Name => 'Emphasis', Format => 'int8u' }, + # '060e2b34.0101.0105.04020502.00000000' => { Name => 'BWFProcessingParameters', Type => 'Node' }, + '060e2b34.0101.0105.04020502.01000000' => { Name => 'BextCodingHistory', Format => 'string' }, + '060e2b34.0101.0105.04020502.01010000' => { Name => 'BextCodingHistory', Type => 'UTF-16' }, + '060e2b34.0101.0105.04020502.02000000' => { Name => 'QltyBasicData', Format => 'string' }, + '060e2b34.0101.0105.04020502.02010000' => { Name => 'QltyBasicData', Type => 'UTF-16' }, + '060e2b34.0101.0105.04020502.03000000' => { Name => 'QltyStartOfModulation', Format => 'string' }, + '060e2b34.0101.0105.04020502.03010000' => { Name => 'QltyStartOfModulation', Type => 'UTF-16' }, + '060e2b34.0101.0105.04020502.04000000' => { Name => 'QltyQualityEvent', Format => 'string' }, + '060e2b34.0101.0105.04020502.04010000' => { Name => 'QltyQualityEvent', Type => 'UTF-16' }, + '060e2b34.0101.0105.04020502.05000000' => { Name => 'QltyEndOfModulation', Format => 'string' }, + '060e2b34.0101.0105.04020502.05010000' => { Name => 'QltyEndOfModulation', Type => 'UTF-16' }, + '060e2b34.0101.0105.04020502.06000000' => { Name => 'QltyQualityParameter', Format => 'string' }, + '060e2b34.0101.0105.04020502.06010000' => { Name => 'QltyQualityParameter', Type => 'UTF-16' }, + '060e2b34.0101.0105.04020502.07000000' => { Name => 'QltyOperatorComment', Format => 'string' }, + '060e2b34.0101.0105.04020502.07010000' => { Name => 'QltyOperatorComment', Type => 'UTF-16' }, + '060e2b34.0101.0105.04020502.08000000' => { Name => 'QltyCueSheet', Format => 'string' }, + '060e2b34.0101.0105.04020502.08010000' => { Name => 'QltyCueSheet', Type => 'UTF-16' }, + # '060e2b34.0101.0105.04020700.00000000' => { Name => 'GeneralProcessingParameters', Type => 'Node' }, + '060e2b34.0101.0105.04020701.00000000' => { Name => 'DialNorm', Format => 'int8s' }, + '060e2b34.0101.0105.04030302.00000000' => { Name => 'DataEssenceCoding', Type => 'Label' }, + # '060e2b34.0101.0105.04040102.00000000' => { Name => 'GeneralDateTimeCodingCharacteristics', Type => 'Node' }, + '060e2b34.0101.0105.04040102.01000000' => { Name => 'DateTimeRate', Format => 'rational64s', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0105.04040102.02000000' => { Name => 'DateTimeDropFrameFlag', Type => 'Boolean', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0105.04040102.03000000' => { Name => 'DateTimeEmbeddedFlag', Type => 'Boolean', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0105.04040102.04000000' => { Name => 'DateTimeKind', Type => 'UL', Unknown => 1, Groups => { 2 => 'Time' } }, + '060e2b34.0101.0105.04040401.06000000' => { Name => 'DeltaEntryArray', Type => 'ArrayOfDeltaEntry', Unknown => 1 }, + '060e2b34.0101.0105.04040401.07000000' => { Name => 'PositionTableCount', Format => 'int8u' }, + '060e2b34.0101.0105.04040401.08000000' => { Name => 'PositionTable', Type => 'ArrayOfRational', Unknown => 1 }, + '060e2b34.0101.0105.04040402.05000000' => { Name => 'IndexEntryArray', Type => 'ArrayOfIndexEntry', Unknown => 1 }, + '060e2b34.0101.0105.04050113.00000000' => { Name => 'SignalStandard', Format => 'int8u' }, + '060e2b34.0101.0105.04070101.00000000' => { Name => 'DataDefinition', Type => 'UL', Unknown => 1 }, + # '060e2b34.0101.0105.04090000.00000000' => { Name => 'FormatCharacteristics', Type => 'Node' }, + '060e2b34.0101.0105.04090100.00000000' => { Name => 'RecordedFormat', Format => 'string' }, + '060e2b34.0101.0105.05010302.01000000' => { Name => 'GenerationCopyNumber', Format => 'int16u' }, + '060e2b34.0101.0105.05010303.01000000' => { Name => 'GenerationCloneNumber', Format => 'int16u' }, + # '060e2b34.0101.0105.05010400.00000000' => { Name => 'MusicFlags', Type => 'Node' }, + '060e2b34.0101.0105.05010403.00000000' => { Name => 'ThemeMusicFlag', Type => 'Boolean' }, + '060e2b34.0101.0105.05010404.00000000' => { Name => 'InsertMusicFlag', Type => 'Boolean' }, + '060e2b34.0101.0105.05300406.00000000' => { Name => 'IndexEditRate', Format => 'rational64s' }, + '060e2b34.0101.0105.06010103.05000000' => { Name => 'LinkedTrackID', Format => 'int32u' }, + '060e2b34.0101.0105.06010104.01020100' => { Name => 'EssenceContainerFormat', Type => 'UL', Unknown => 1 }, + '060e2b34.0101.0105.06010104.01030100' => { Name => 'CodecDefinition', Type => 'UL', Unknown => 1 }, + '060e2b34.0101.0105.06010104.020c0000' => { Name => 'DescriptiveMetadataFramework', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0105.06010104.02400500' => { Name => 'GroupSet', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0105.06010104.02401c00' => { Name => 'BankDetailsSet', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0105.06010104.02401d00' => { Name => 'ImageFormatSet', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0105.06010104.02402000' => { Name => 'ProcessingSet', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0105.06010104.02402100' => { Name => 'ProjectSet', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0105.06010104.02402200' => { Name => 'ContactsListSet', Type => 'StrongReference', Unknown => 1 }, + # '060e2b34.0101.0105.06010104.02402300' => { Name => 'CueWordsSets', Type => 'Node' }, + '060e2b34.0101.0105.06010104.02402301' => { Name => 'AnnotationCueWordsSet', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0105.06010104.02402302' => { Name => 'ShotCueWordsSet', Type => 'StrongReference', Unknown => 1 }, + # '060e2b34.0101.0105.06010104.03400000' => { Name => 'WeakReferencingToDescriptiveMetadataSets', Type => 'Node' }, + # '060e2b34.0101.0105.06010104.03401300' => { Name => 'ParticipantRoleSets', Type => 'Node' }, + '060e2b34.0101.0105.06010104.03401301' => { Name => 'AwardParticipantSets', Type => 'GlobalReferenceBatch (Participant)', Unknown => 1 }, + '060e2b34.0101.0105.06010104.03401302' => { Name => 'ContractParticipantSets', Type => 'GlobalReferenceBatch (Participant)', Unknown => 1 }, + '060e2b34.0101.0105.06010104.03401400' => { Name => 'PersonSets', Type => 'GlobalReferenceBatch (Participant)', Unknown => 1 }, + # '060e2b34.0101.0105.06010104.03401500' => { Name => 'OrganizationSets', Type => 'Node' }, + '060e2b34.0101.0105.06010104.03401501' => { Name => 'ParticipantOrganizationSets', Type => 'GlobalReferenceBatch (Organisation)', Unknown => 1 }, + '060e2b34.0101.0105.06010104.03401502' => { Name => 'PersonOrganizationSets', Type => 'GlobalReferenceBatch (Organisation)', Unknown => 1 }, + '060e2b34.0101.0105.06010104.03401600' => { Name => 'LocationSets', Type => 'GlobalReferenceBatch (Location)', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05400400' => { Name => 'TitlesSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05400500' => { Name => 'GroupSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05400600' => { Name => 'IdentificationSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05400700' => { Name => 'EpisodicItemSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05400800' => { Name => 'BrandingSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05400900' => { Name => 'EventSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05400a00' => { Name => 'PublicationSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05400b00' => { Name => 'AwardSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05400c00' => { Name => 'CaptionDescriptionSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05400d00' => { Name => 'AnnotationSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + # '060e2b34.0101.0105.06010104.05400e00' => { Name => 'SettingPeriodSets', Type => 'Node' }, + '060e2b34.0101.0105.06010104.05400e01' => { Name => 'ProductionSettingPeriodSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05400e02' => { Name => 'SceneSettingPeriodSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05400f00' => { Name => 'ScriptingSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401000' => { Name => 'ClassificationSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + # '060e2b34.0101.0105.06010104.05401100' => { Name => 'ShotSets', Type => 'Node' }, + '060e2b34.0101.0105.06010104.05401101' => { Name => 'SceneShotSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401102' => { Name => 'ClipShotSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401200' => { Name => 'KeyPointSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401300' => { Name => 'ShotParticipantRoleSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401400' => { Name => 'ShotPersonSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401500' => { Name => 'OrganizationSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401600' => { Name => 'ShotLocationSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401700' => { Name => 'AddressSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401800' => { Name => 'CommunicationSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401900' => { Name => 'ContractSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401a00' => { Name => 'RightsSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401b00' => { Name => 'PaymentsSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401e00' => { Name => 'DeviceParametersSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + # '060e2b34.0101.0105.06010104.05401f00' => { Name => 'NameValueSets', Type => 'Node' }, + '060e2b34.0101.0105.06010104.05401f01' => { Name => 'ClassificationNameValueSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401f02' => { Name => 'ContactNameValueSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.05401f03' => { Name => 'DeviceParameterNameValueSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0105.06010104.060c0000' => { Name => 'MetadataServerLocators', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0105.06010104.060d0000' => { Name => 'RelatedMaterialLocators', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0105.06010107.15000000' => { Name => 'LocalTagEntries', Type => 'LocalTagEntryBatch', Unknown => 1 }, + '060e2b34.0101.0105.06100400.00000000' => { Name => 'TotalNumberInSequence', Format => 'int32u' }, + '060e2b34.0101.0105.07012001.04011100' => { Name => 'RoomOrSuiteName', Format => 'string' }, + '060e2b34.0101.0105.07012001.04011101' => { Name => 'RoomOrSuiteName', Type => 'UTF-16' }, + '060e2b34.0101.0105.07012001.04011200' => { Name => 'BuildingName', Format => 'string' }, + '060e2b34.0101.0105.07012001.04011201' => { Name => 'BuildingName', Type => 'UTF-16' }, + '060e2b34.0101.0105.07012001.10030601' => { Name => 'URL', Type => 'UTF-16' }, + # '060e2b34.0101.0105.07020102.07100000' => { Name => 'DefinedEventStartTrueDateTime', Type => 'Node' }, + '060e2b34.0101.0105.07020102.07100100' => { Name => 'LocalFestivalDateTime', Format => 'string', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0105.07020103.01090000' => { Name => 'ShotStartPosition', Type => 'Position', %duration }, + '060e2b34.0101.0105.07020103.010a0000' => { Name => 'IndexingStartPosition', Type => 'Position', %duration }, + '060e2b34.0101.0105.07020103.010b0000' => { Name => 'EventOrigin', Type => 'Position', %duration }, + '060e2b34.0101.0105.07020108.03000000' => { Name => 'SettingPeriodDescription', Format => 'string' }, + '060e2b34.0101.0105.07020108.03010000' => { Name => 'SettingPeriodDescription', Type => 'UTF-16' }, + '060e2b34.0101.0105.07020201.01020000' => { Name => 'IndexDuration', Type => 'Length', %duration }, + '060e2b34.0101.0105.07020201.02040000' => { Name => 'ShotDuration', Type => 'Length', %duration }, + # '060e2b34.0101.0105.0d020000.00000000' => { Name => 'EBU_UER', Type => 'Node' }, + # '060e2b34.0101.0105.0d030000.00000000' => { Name => 'Pro-MPEGForum', Type => 'Node' }, + # '060e2b34.0101.0106.0e040000.00000000' => { Name => 'Avid', Type => 'Node' }, + # '060e2b34.0101.0106.0e050000.00000000' => { Name => 'CNN', Type => 'Node' }, + # '060e2b34.0101.0106.0e050100.00000000' => { Name => 'CNNMediaIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0106.0e050101.00000000' => { Name => 'CNNLegacyMediaIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0106.0e050200.00000000' => { Name => 'CNNAttributes', Type => 'Node' }, + # '060e2b34.0101.0106.0e050201.00000000' => { Name => 'CNNRelationalAttributes', Type => 'Node' }, + # '060e2b34.0101.0106.0e050202.00000000' => { Name => 'CNNInformationAttributes', Type => 'Node' }, + # '060e2b34.0101.0106.0e050300.00000000' => { Name => 'CNNMetadataSets', Type => 'Node' }, + # '060e2b34.0101.0106.0e060000.00000000' => { Name => 'Sony', Type => 'Node' }, + '060e2b34.0101.0107.01011509.00000000' => { Name => 'ExtendedClipID', Type => 'UMID' }, + '060e2b34.0101.0107.0101150a.00000000' => { Name => 'ClipIDArray', Type => 'UMID Array', Unknown => 1 }, + '060e2b34.0101.0107.0101150b.00000000' => { Name => 'ExtendedClipIDArray', Type => 'UMID Array', Unknown => 1 }, + '060e2b34.0101.0107.01040104.00000000' => { Name => 'TrackNumberBatch', Format => 'int32u' }, + '060e2b34.0101.0107.03010102.02110000' => { Name => 'ExtendedTextLanguageCode', Format => 'string', LanguageCode => 1 }, + '060e2b34.0101.0107.03010102.02120000' => { Name => 'ExtendedCaptionsLanguageCode', Format => 'string' }, + '060e2b34.0101.0107.03010102.02130000' => { Name => 'FrameworkExtendedTextLanguageCode', Format => 'string', LanguageCode => 1 }, + '060e2b34.0101.0107.03010102.03110000' => { Name => 'PrimaryExtendedSpokenLanguageCode', Format => 'string' }, + '060e2b34.0101.0107.03010102.03120000' => { Name => 'SecondaryExtendedSpokenLanguageCode', Format => 'string' }, + '060e2b34.0101.0107.03010102.03130000' => { Name => 'OriginalExtendedSpokenPrimaryLanguageCode', Format => 'string' }, + '060e2b34.0101.0107.03010102.03140000' => { Name => 'SecondaryOriginalExtendedSpokenLanguageCode', Format => 'string' }, + '060e2b34.0101.0107.03010210.06000000' => { Name => 'KLVMetadataSequence', Type => 'Sequence of KLV packets', Unknown => 1 }, + '060e2b34.0101.0107.03010210.07000000' => { Name => 'PackageAttributes', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0107.03010210.08000000' => { Name => 'ComponentAttributes', Type => 'StrongReferenceArray', Unknown => 1 }, + # '060e2b34.0101.0107.03010220.02000000' => { Name => 'XMLBiMConstructsInMultipleStreams', Type => 'Node' }, + # '060e2b34.0101.0107.03010220.02010000' => { Name => 'MPEG7BiMDecoderInitFrames', Type => 'Node' }, + '060e2b34.0101.0107.03010220.02010100' => { Name => 'MPEG7BiMDecoderInitFrame1', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02010200' => { Name => 'MPEG7BiMDecoderInitFrame2', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02010300' => { Name => 'MPEG7BiMDecoderInitFrame3', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02010400' => { Name => 'MPEG7BiMDecoderInitFrame4', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02010500' => { Name => 'MPEG7BiMDecoderInitFrame5', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02010600' => { Name => 'MPEG7BiMDecoderInitFrame6', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02010700' => { Name => 'MPEG7BiMDecoderInitFrame7', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02010800' => { Name => 'MPEG7BiMDecoderInitFrame8', Type => 'ByteStream', Unknown => 1 }, + # '060e2b34.0101.0107.03010220.02020000' => { Name => 'MPEG7BiMAccessUnitFrames', Type => 'Node' }, + '060e2b34.0101.0107.03010220.02020100' => { Name => 'MPEG7BiMAccessUnitFrame1', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02020200' => { Name => 'MPEG7BiMAccessUnitFrame2', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02020300' => { Name => 'MPEG7BiMAccessUnitFrame3', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02020400' => { Name => 'MPEG7BiMAccessUnitFrame4', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02020500' => { Name => 'MPEG7BiMAccessUnitFrame5', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02020600' => { Name => 'MPEG7BiMAccessUnitFrame6', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02020700' => { Name => 'MPEG7BiMAccessUnitFrame7', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03010220.02020800' => { Name => 'MPEG7BiMAccessUnitFrame8', Type => 'ByteStream', Unknown => 1 }, + '060e2b34.0101.0107.03020102.16000000' => { Name => 'ComponentUserComments', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0107.03020501.01000000' => { Name => 'ShotCommentKind', Type => 'UTF-16' }, + '060e2b34.0101.0107.03020502.01000000' => { Name => 'ShotComment', Type => 'UTF-16' }, + # '060e2b34.0101.0107.04010202.00000000' => { Name => 'SensorParameters', Type => 'Node' }, + '060e2b34.0101.0107.04010202.01000000' => { Name => 'SensorMode', Format => 'string' }, + '060e2b34.0101.0107.04020101.05000000' => { Name => 'ChannelAssignment', Type => 'UL', Unknown => 1 }, + '060e2b34.0101.0107.04040402.06000000' => { Name => 'ContentPackageIndexArray', Type => 'ArrayOfIndexEntry', Unknown => 1 }, + # '060e2b34.0101.0107.04040403.00000000' => { Name => 'VideoIndexParameters', Type => 'Node' }, + '060e2b34.0101.0107.04040403.01000000' => { Name => 'VideoIndexArray', Type => 'Array of bytes', Unknown => 1 }, + '060e2b34.0101.0107.04060202.00000000' => { Name => 'ApproximateImageContainerSize', Format => 'int32u' }, + '060e2b34.0101.0107.04060801.00000000' => { Name => 'MetadataEncodingSchemeCode', Format => 'string' }, + '060e2b34.0101.0107.04090200.00000000' => { Name => 'MIMEMediaType', Format => 'string' }, + '060e2b34.0101.0107.04090201.00000000' => { Name => 'MIMEMediaType', Type => 'UTF-16' }, + '060e2b34.0101.0107.04200201.010a0100' => { Name => 'FieldOfViewVerticalFP', Format => 'float' }, + '060e2b34.0101.0107.05010108.00000000' => { Name => 'PackageUsageKind', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.0107.06010103.06000000' => { Name => 'ChannelID', Format => 'int32u' }, + '060e2b34.0101.0107.06010103.07000000' => { Name => 'ChannelIDs', Format => 'int32u' }, + '060e2b34.0101.0107.06010104.01090000' => { Name => 'KLVDataType', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.0107.06010104.03040000' => { Name => 'KLVDataParentProperties', Type => 'WeakReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0107.06010104.03050000' => { Name => 'TaggedValueParentProperties', Type => 'WeakReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0107.06010104.03401303' => { Name => 'AnnotationParticipantSets', Type => 'GlobalReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0107.06010104.050a0000' => { Name => 'KLVDataDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0107.06010104.050b0000' => { Name => 'TaggedValueDefinitions', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0107.06010104.05401f04' => { Name => 'AddressNameValueSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0107.07010201.02300000' => { Name => 'NMEADocumentText', Format => 'string' }, + '060e2b34.0101.0107.07011001.04000000' => { Name => 'PlatformRollAngle', Format => 'float' }, + '060e2b34.0101.0107.07011001.05000000' => { Name => 'PlatformPitchAngle', Format => 'float' }, + '060e2b34.0101.0107.07011001.06000000' => { Name => 'PlatformHeadingAngle', Format => 'float' }, + '060e2b34.0101.0107.07012001.04011300' => { Name => 'AddressLine', Format => 'string' }, + '060e2b34.0101.0107.07012001.04011301' => { Name => 'AddressLine', Type => 'UTF-16' }, + '060e2b34.0101.0107.07012001.04011400' => { Name => 'PlaceName', Format => 'string' }, + '060e2b34.0101.0107.07012001.04011401' => { Name => 'PlaceName', Type => 'UTF-16' }, + '060e2b34.0101.0107.07012001.04011500' => { Name => 'GeographicalCoordinates', Type => '12-byte Spatial Coordinate', Unknown => 1 }, + '060e2b34.0101.0107.07012001.04011600' => { Name => 'AstronomicalBodyName', Format => 'string' }, + '060e2b34.0101.0107.07012001.04011601' => { Name => 'AstronomicalBodyName', Type => 'UTF-16' }, + '060e2b34.0101.0107.07020102.08020000' => { Name => 'TimecodeArray', Type => 'Array of timecodes', Unknown => 1 }, + '060e2b34.0101.0107.07020103.010c0000' => { Name => 'MarkIn', Type => 'Position', %duration }, + '060e2b34.0101.0107.07020103.010d0000' => { Name => 'UserPosition', Type => 'Position', %duration }, + '060e2b34.0101.0107.07020103.02030000' => { Name => 'MarkOut', Type => 'Position', %duration }, + '060e2b34.0101.0107.07020110.01040000' => { Name => 'ClipCreationDateTime', %timestamp }, + '060e2b34.0101.0107.07020201.02050000' => { Name => 'VideoClipDuration', Format => 'int32u' }, + # '060e2b34.0101.0107.0d040000.00000000' => { Name => 'BBC', Type => 'Node' }, + # '060e2b34.0101.0107.0d050000.00000000' => { Name => 'IRT', Type => 'Node' }, + # '060e2b34.0101.0107.0e070000.00000000' => { Name => 'IdeasUnlimitedTV', Type => 'Node' }, + # '060e2b34.0101.0107.0e080000.00000000' => { Name => 'IPV', Type => 'Node' }, + # '060e2b34.0101.0107.0e090000.00000000' => { Name => 'Dolby', Type => 'Node' }, + # '060e2b34.0101.0108.01011540.00000000' => { Name => 'GloballyUniqueObjectIdentifiers', Type => 'Node' }, + # '060e2b34.0101.0108.01011540.01000000' => { Name => 'GloballyUniqueHumanIdentifiers', Type => 'Node' }, + '060e2b34.0101.0108.01011540.01010000' => { Name => 'ParticipantID', Type => 'UID', Unknown => 1 }, + '060e2b34.0101.0108.01011540.01020000' => { Name => 'ContactID', Type => 'UID', Unknown => 1 }, + '060e2b34.0101.0108.01020104.00000000' => { Name => 'DefaultNamespaceURI', Format => 'string' }, + '060e2b34.0101.0108.01020104.01000000' => { Name => 'DefaultNamespaceURI', Type => 'UTF-16' }, + '060e2b34.0101.0108.01020105.00000000' => { Name => 'NamespaceURI', Format => 'string' }, + '060e2b34.0101.0108.01020105.01000000' => { Name => 'NamespaceURI', Type => 'UTF-16' }, + '060e2b34.0101.0108.01020106.00000000' => { Name => 'NamespaceURIs', Format => 'string' }, + '060e2b34.0101.0108.01020106.01000000' => { Name => 'NamespaceURIs', Type => 'UTF-16' }, + '060e2b34.0101.0108.01030604.00000000' => { Name => 'HTMLDOCTYPE', Format => 'string' }, + '060e2b34.0101.0108.01030604.01000000' => { Name => 'HTMLDOCTYPE', Type => 'UTF-16' }, + '060e2b34.0101.0108.01030605.00000000' => { Name => 'NamespacePrefix', Format => 'string' }, + '060e2b34.0101.0108.01030605.01000000' => { Name => 'NamespacePrefix', Type => 'UTF-16' }, + '060e2b34.0101.0108.01030606.00000000' => { Name => 'NamespacePrefixes', Format => 'string' }, + '060e2b34.0101.0108.01030606.01000000' => { Name => 'NamespacePrefixes', Type => 'UTF-16' }, + '060e2b34.0101.0108.02050404.00000000' => { Name => 'RightsComment', Format => 'string' }, + '060e2b34.0101.0108.02050404.01000000' => { Name => 'RightsComment', Type => 'UTF-16' }, + '060e2b34.0101.0108.03020201.06000000' => { Name => 'NominationCategory', Format => 'string' }, + '060e2b34.0101.0108.03020201.06010000' => { Name => 'NominationCategory', Type => 'UTF-16' }, + '060e2b34.0101.0108.04020301.06000000' => { Name => 'PeakEnvelopeVersion', Format => 'int32u' }, + '060e2b34.0101.0108.04020301.07000000' => { Name => 'PeakEnvelopeFormat', Format => 'int32u' }, + '060e2b34.0101.0108.04020301.08000000' => { Name => 'PointsPerPeakValue', Format => 'int32u' }, + '060e2b34.0101.0108.04020301.09000000' => { Name => 'PeakEnvelopeBlockSize', Format => 'int32u' }, + '060e2b34.0101.0108.04020301.0a000000' => { Name => 'PeakChannelCount', Format => 'int32u' }, + '060e2b34.0101.0108.04020301.0b000000' => { Name => 'PeakFrameCount', Format => 'int32u' }, + '060e2b34.0101.0108.04020301.0c000000' => { Name => 'PeakOfPeaksPosition', Type => 'Position', %duration }, + '060e2b34.0101.0108.04020301.0d000000' => { Name => 'PeakEnvelopeTimestamp', Format => 'int32u' }, + '060e2b34.0101.0108.04020301.0e000000' => { Name => 'PeakEnvelopeData', Type => 'Stream', Unknown => 1 }, + '060e2b34.0101.0108.04060802.00000000' => { Name => 'RIFFChunkID', Format => 'int32u' }, + '060e2b34.0101.0108.04060903.00000000' => { Name => 'RIFFChunkLength', Format => 'int32u' }, + '060e2b34.0101.0108.04070400.00000000' => { Name => 'RIFFChunkData', Type => 'DataStream', Unknown => 1 }, + '060e2b34.0101.0108.04090300.00000000' => { Name => 'MIMECharSet', Format => 'string' }, + '060e2b34.0101.0108.04090301.00000000' => { Name => 'MIMECharSet', Type => 'UTF-16' }, + '060e2b34.0101.0108.04090400.00000000' => { Name => 'MIMEEncoding', Format => 'string' }, + '060e2b34.0101.0108.04090401.00000000' => { Name => 'MIMEEncoding', Type => 'UTF-16' }, + '060e2b34.0101.0108.06010103.08000000' => { Name => 'MonoSourceTrackIDs', Format => 'int32u' }, + '060e2b34.0101.0108.06010104.010a0000' => { Name => 'CompositionRendering', Type => 'PackageID', Unknown => 1 }, + '060e2b34.0101.0108.06010104.03401304' => { Name => 'CaptionsDescriptionParticipantSets', Type => 'GlobalReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0108.06010104.05400d01' => { Name => 'EventAnnotationSets', Type => 'StrongReferenceBatch', Unknown => 1 }, + '060e2b34.0101.0108.06010104.060e0000' => { Name => 'ScriptingLocators', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0108.06010104.060f0000' => { Name => 'UnknownBWFChunks', Type => 'StrongReferenceArray', Unknown => 1 }, + # '060e2b34.0101.0108.0e0a0000.00000000' => { Name => 'SnellAndWilcox', Type => 'Node' }, + '060e2b34.0101.0109.01011511.00000000' => { Name => 'CryptographicContextID', Type => 'UUID', Unknown => 1 }, + '060e2b34.0101.0109.01012101.01000000' => { Name => 'PlatformDesignation', Type => 'UTF-16' }, + '060e2b34.0101.0109.01030107.01000000' => { Name => 'LocalTargetID', Type => 'UTF-16' }, + '060e2b34.0101.0109.01030109.00000000' => { Name => 'NITFLayerTargetID', Format => 'string' }, + '060e2b34.0101.0109.01030109.01000000' => { Name => 'NITFLayerTargetID', Type => 'UTF-16' }, + '060e2b34.0101.0109.01030302.00000000' => { Name => 'PackageName', Format => 'string' }, + '060e2b34.0101.0109.01030406.00000000' => { Name => 'RP217DataStreamPID', Format => 'int16u' }, + '060e2b34.0101.0109.01030407.00000000' => { Name => 'RP217VideoStreamPID', Format => 'int16u' }, + '060e2b34.0101.0109.02010101.00000000' => { Name => 'SourceOrganization', Type => 'UTF-16' }, + '060e2b34.0101.0109.02010301.00000000' => { Name => 'OriginalProducerName', Type => 'UTF-16' }, + '060e2b34.0101.0109.02080201.01000000' => { Name => 'SecurityClassification', Type => 'UTF-16' }, + '060e2b34.0101.0109.02080202.01000000' => { Name => 'SecurityClassificationCaveats', Type => 'UTF-16' }, + '060e2b34.0101.0109.02080207.01000000' => { Name => 'ClassificationComment', Type => 'UTF-16' }, + # '060e2b34.0101.0109.02090200.00000000' => { Name => 'DataEncryption', Type => 'Node' }, + # '060e2b34.0101.0109.02090201.00000000' => { Name => 'DataEncryptionAlgorithms', Type => 'Node' }, + # '060e2b34.0101.0109.02090202.00000000' => { Name => 'DataHashingAlgorithms', Type => 'Node' }, + # '060e2b34.0101.0109.02090300.00000000' => { Name => 'DigitalCinemaEncryption', Type => 'Node' }, + # '060e2b34.0101.0109.02090301.00000000' => { Name => 'DigitalCinemaEncryptionAlgorithms', Type => 'Node' }, + '060e2b34.0101.0109.02090301.01000000' => { Name => 'CipherAlgorithm', Type => 'UL', Unknown => 1 }, + '060e2b34.0101.0109.02090301.02000000' => { Name => 'CryptographicKeyID', Type => 'UUID', Unknown => 1 }, + '060e2b34.0101.0109.02090301.03000000' => { Name => 'EncryptedSourceValue', Type => 'DataValue', Unknown => 1 }, + # '060e2b34.0101.0109.02090302.00000000' => { Name => 'DigitalCinemaHashingAlgorithms', Type => 'Node' }, + '060e2b34.0101.0109.02090302.01000000' => { Name => 'MICAlgorithm', Type => 'UL', Unknown => 1 }, + '060e2b34.0101.0109.02090302.02000000' => { Name => 'MIC', Type => 'DataValue', Unknown => 1 }, + '060e2b34.0101.0109.03010102.01010000' => { Name => 'ISO639-1LanguageCode', Type => 'UTF-16' }, + '060e2b34.0101.0109.03020106.10000000' => { Name => 'JFIFMarkerDescription', Format => 'string' }, + '060e2b34.0101.0109.03020106.10010000' => { Name => 'JFIFMarkerDescription', Type => 'UTF-16' }, + '060e2b34.0101.0109.03020106.11000000' => { Name => 'HTMLMetaDescription', Format => 'string' }, + '060e2b34.0101.0109.03020106.11010000' => { Name => 'HTMLMetaDescription', Type => 'UTF-16' }, + '060e2b34.0101.0109.03020401.02000000' => { Name => 'MetadataItemName', Format => 'string' }, + '060e2b34.0101.0109.04010201.01060000' => { Name => 'ColorPrimaries', Format => 'string' }, + '060e2b34.0101.0109.04010201.01060100' => { Name => 'ColorPrimaries', Type => 'ColorPrimariesType', Unknown => 1 }, + '060e2b34.0101.0109.04060203.00000000' => { Name => 'ProductFormat', Format => 'string' }, + '060e2b34.0101.0109.04060203.01000000' => { Name => 'ProductFormat', Type => 'UTF-16' }, + '060e2b34.0101.0109.04061002.00000000' => { Name => 'SourceLength', Format => 'int64u' }, + '060e2b34.0101.0109.04200102.01010100' => { Name => 'ImageSourceDeviceKind', Type => 'UTF-16' }, + '060e2b34.0101.0109.06010102.02000000' => { Name => 'SourceContainerFormat', Type => 'UL', Unknown => 1 }, + '060e2b34.0101.0109.06010102.03000000' => { Name => 'SourceKey', Type => 'UL', Unknown => 1 }, + '060e2b34.0101.0109.06010103.09000000' => { Name => 'DynamicSourcePackageID', Type => 'PackageID', Unknown => 1 }, + '060e2b34.0101.0109.06010103.0a000000' => { Name => 'DynamicSourceTrackIDs', Format => 'int32u' }, + '060e2b34.0101.0109.06010103.0b000000' => { Name => 'SourceIndex', Type => 'Indirect', Unknown => 1 }, + '060e2b34.0101.0109.06010103.0c000000' => { Name => 'SourceSpecies', Type => 'Indirect', Unknown => 1 }, + '060e2b34.0101.0109.06010103.0d000000' => { Name => 'SourceValue', Type => 'Indirect', Unknown => 1 }, + '060e2b34.0101.0109.06010104.020d0000' => { Name => 'CryptographicContextObject', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.0109.06010104.06100000' => { Name => 'Sub-descriptors', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.0109.06010106.02000000' => { Name => 'EncryptedTrackFileID', Type => 'UUID', Unknown => 1 }, + '060e2b34.0101.0109.06010106.03000000' => { Name => 'CryptographicContextLink', Type => 'UUID', Unknown => 1 }, + '060e2b34.0101.0109.06090201.03000000' => { Name => 'PlaintextOffset', Format => 'int64u' }, + '060e2b34.0101.0109.06100500.00000000' => { Name => 'TripletSequenceNumber', Format => 'int64u' }, + '060e2b34.0101.0109.07010201.030f0000' => { Name => 'BoundingRectangle', Type => 'Geographic Rectangle', Unknown => 1 }, + '060e2b34.0101.0109.07010201.03100000' => { Name => 'GeographicLocation', Type => 'Geographic Polygon', Unknown => 1 }, + '060e2b34.0101.0109.07010201.03110000' => { Name => 'GeographicPolygonCoordinates', Type => 'Array of GeographicCoordinate', Unknown => 1 }, + '060e2b34.0101.0109.07010201.03120000' => { Name => 'GeographicAreaNorthwest', Type => 'GeographicCoordinate', Unknown => 1 }, + '060e2b34.0101.0109.07010201.03130000' => { Name => 'GeographicAreaSoutheast', Type => 'GeographicCoordinate', Unknown => 1 }, + '060e2b34.0101.0109.07010201.03140000' => { Name => 'GeographicAreaSourceDatum', Format => 'string' }, + '060e2b34.0101.0109.07010201.03150000' => { Name => 'GeographicPolygonSourceDatum', Format => 'string' }, + '060e2b34.0101.0109.07012001.02070100' => { Name => 'CountryCodeMethod', Type => 'UTF-16' }, + '060e2b34.0101.0109.07012001.02080100' => { Name => 'ClassifyingCountryCode', Type => 'UTF-16' }, + '060e2b34.0101.0109.07012001.02090100' => { Name => 'ReleasableCountryCode', Type => 'UTF-16' }, + '060e2b34.0101.0109.07020102.01010100' => { Name => 'UTCStartDateTime', Type => 'UTF-16', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0109.07020102.01030000' => { Name => 'UTCInstantDateTime', Format => 'string', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0109.07020102.01030100' => { Name => 'UTCInstantDateTime', Type => 'UTF-16', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0109.07020102.05010100' => { Name => 'UTCLastModifyDate', Type => 'UTF-16', Groups => { 2 => 'Time' } }, + '060e2b34.0101.0109.07020501.00000000' => { Name => 'ToleranceMode', Type => 'ToleranceModeType', Unknown => 1 }, + '060e2b34.0101.0109.07020502.00000000' => { Name => 'ToleranceWindow', Type => 'Indirect', Unknown => 1 }, + '060e2b34.0101.0109.07020503.00000000' => { Name => 'ToleranceInterpolationMethod', Type => 'WeakReferenceInterpolationDefinition', Unknown => 1 }, + # '060e2b34.0101.0109.0d060000.00000000' => { Name => 'ARIB', Type => 'Node' }, + # '060e2b34.0101.0109.0d070000.00000000' => { Name => 'AMIA', Type => 'Node' }, + # '060e2b34.0101.0109.0e0b0000.00000000' => { Name => 'OmneonVideoNetworks', Type => 'Node' }, + # '060e2b34.0101.0109.0e0c0000.00000000' => { Name => 'AscentMediaGroup', Type => 'Node' }, + # '060e2b34.0101.0109.0e0c0100.00000000' => { Name => 'Published', Type => 'Node' }, + # '060e2b34.0101.0109.0e0d0000.00000000' => { Name => 'Quantel', Type => 'Node' }, + # '060e2b34.0101.0109.0e0e0000.00000000' => { Name => 'Panasonic', Type => 'Node' }, + '060e2b34.0101.010a.04010502.03000000' => { Name => 'VBILineCount', Format => 'int16u' }, + '060e2b34.0101.010a.04010502.04000000' => { Name => 'StoredVBILineNumber', Format => 'int16u' }, + '060e2b34.0101.010a.04010502.05000000' => { Name => 'VBIWrappingType', Format => 'int8u' }, + '060e2b34.0101.010a.04010502.06000000' => { Name => 'VBIPayloadSampleCount', Format => 'int16u' }, + '060e2b34.0101.010a.04010502.07000000' => { Name => 'VBIPayloadByteArray', Format => 'int8u' }, + '060e2b34.0101.010a.04010502.08000000' => { Name => 'ANCPacketCount', Format => 'int16u' }, + '060e2b34.0101.010a.04010502.09000000' => { Name => 'StoredANCLineNumber', Format => 'int16u' }, + '060e2b34.0101.010a.04010502.0a000000' => { Name => 'ANCWrappingType', Format => 'int8u' }, + '060e2b34.0101.010a.04010502.0b000000' => { Name => 'ANCPayloadSampleCount', Format => 'int16u' }, + '060e2b34.0101.010a.04010502.0c000000' => { Name => 'ANCPayloadByteArray', Format => 'int8u' }, + '060e2b34.0101.010a.04010503.0f000000' => { Name => 'VBIPayloadSampleCoding', Format => 'int8u' }, + '060e2b34.0101.010a.04010503.10000000' => { Name => 'ANCPayloadSampleCoding', Format => 'int8u' }, + # '060e2b34.0101.010a.04010603.00000000' => { Name => 'JPEG2000CodingParameters', Type => 'Node' }, + '060e2b34.0101.010a.04010603.01000000' => { Name => 'Rsiz', Format => 'int16u' }, + '060e2b34.0101.010a.04010603.02000000' => { Name => 'Xsiz', Format => 'int32u' }, + '060e2b34.0101.010a.04010603.03000000' => { Name => 'Ysiz', Format => 'int32u' }, + '060e2b34.0101.010a.04010603.04000000' => { Name => 'XOsiz', Format => 'int32u' }, + '060e2b34.0101.010a.04010603.05000000' => { Name => 'YOsiz', Format => 'int32u' }, + '060e2b34.0101.010a.04010603.06000000' => { Name => 'XTsiz', Format => 'int32u' }, + '060e2b34.0101.010a.04010603.07000000' => { Name => 'YTsiz', Format => 'int32u' }, + '060e2b34.0101.010a.04010603.08000000' => { Name => 'XTOsiz', Format => 'int32u' }, + '060e2b34.0101.010a.04010603.09000000' => { Name => 'YTOsiz', Format => 'int32u' }, + '060e2b34.0101.010a.04010603.0a000000' => { Name => 'Csiz', Format => 'int16u' }, + '060e2b34.0101.010a.04010603.0b000000' => { Name => 'PictureComponentSizing', Type => 'J2K ComponentSizingArray', Unknown => 1 }, + '060e2b34.0101.010a.04010603.0c000000' => { Name => 'CodingStyleDefault', Type => 'J2K CodingStyleDefault', Unknown => 1 }, + '060e2b34.0101.010a.04010603.0d000000' => { Name => 'QuantizationDefault', Type => 'J2K QuantizationDefault', Unknown => 1 }, + '060e2b34.0101.010a.04020403.01020000' => { Name => 'MPEGAudioBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)', Groups => { 2 => 'Audio' } }, + '060e2b34.0101.010a.04060204.00000000' => { Name => 'CBEStartOffset', Format => 'int64u' }, + '060e2b34.0101.010a.04060205.00000000' => { Name => 'VBEEndOffset', Format => 'int64u' }, + '060e2b34.0101.010a.06010104.02100000' => { Name => 'SubDescriptor', Unknown => 1 }, + '060e2b34.0101.010a.06010104.06100000' => { Name => 'SubDescriptors', Unknown => 1 }, + '060e2b34.0101.010a.06010107.16000000' => { Name => 'RootMetaDictionary', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.010a.06010107.17000000' => { Name => 'RootPreface', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.010a.06010107.18000000' => { Name => 'RootObjectDirectory', Type => 'Array of bytes', Unknown => 1 }, + '060e2b34.0101.010a.06010107.19000000' => { Name => 'RootFormatVersion', Format => 'int32u' }, + '060e2b34.0101.010a.07010201.03160000' => { Name => 'FrameCenterElevation', Format => 'float' }, + '060e2b34.0101.010a.07020103.010e0000' => { Name => 'PackageMarkInPosition', Type => 'Position', %duration }, + '060e2b34.0101.010a.07020103.02040000' => { Name => 'PackageMarkOutPosition', Type => 'Position', %duration }, + # '060e2b34.0101.010a.0d080000.00000000' => { Name => 'PBS', Type => 'Node' }, + # '060e2b34.0101.010a.0e0f0000.00000000' => { Name => 'GrassValley', Type => 'Node' }, + # '060e2b34.0101.010a.0e100000.00000000' => { Name => 'DoremiLabs', Type => 'Node' }, + # '060e2b34.0101.010a.0e110000.00000000' => { Name => 'EVSBroadcastEquipment', Type => 'Node' }, + # '060e2b34.0101.010a.0e120000.00000000' => { Name => 'TurnerBroadcastingSystem', Type => 'Node' }, + '060e2b34.0101.010c.0101110b.00000000' => { Name => 'Ad-ID', Unknown => 1 }, + '060e2b34.0101.010c.01011512.00000000' => { Name => 'ResourceID', Type => 'UUID', Unknown => 1 }, + '060e2b34.0101.010c.01011513.00000000' => { Name => 'AncillaryResourceID', Type => 'UUID', Unknown => 1 }, + '060e2b34.0101.010c.01020210.02030000' => { Name => 'ApplicationSchemeBatch', Type => 'BatchOfUL', Unknown => 1 }, + # '060e2b34.0101.010c.02100202.00000000' => { Name => 'RegisterPublicationInformation', Type => 'Node' }, + '060e2b34.0101.010c.02100202.01000000' => { Name => 'RegisterKind', Type => 'RegisterType', Unknown => 1 }, + '060e2b34.0101.010c.02100202.02000000' => { Name => 'RegisterVersion', Type => 'Hex' }, + '060e2b34.0101.010c.02100202.03000000' => { Name => 'RegisterEditorName', Type => 'UTF-16' }, + '060e2b34.0101.010c.02100202.04000000' => { Name => 'RegisterStatusKind', Type => 'RegisterStatusType', Unknown => 1 }, + # '060e2b34.0101.010c.02100203.00000000' => { Name => 'RegisterItem', Type => 'Node' }, + '060e2b34.0101.010c.02100203.01000000' => { Name => 'RegisterItemName', Type => 'UTF-16' }, + '060e2b34.0101.010c.02100203.02000000' => { Name => 'RegisterItemDefinition', Type => 'UTF-16' }, + '060e2b34.0101.010c.02100203.03000000' => { Name => 'RegisterItemSymbol', Type => 'SymbolType', Unknown => 1 }, + '060e2b34.0101.010c.02100203.04000000' => { Name => 'RegisterItemDefiningDocumentName', Type => 'UTF-16' }, + '060e2b34.0101.010c.02100203.05000000' => { Name => 'RegisterItemUL', Type => 'UniversalLabelType', Unknown => 1 }, + '060e2b34.0101.010c.02100203.06000000' => { Name => 'RegisterItemNotes', Type => 'UTF-16' }, + '060e2b34.0101.010c.02100203.07000000' => { Name => 'RegisterItemIntroductionVersion', Format => 'int8u' }, + '060e2b34.0101.010c.02100203.08000000' => { Name => 'RegisterItemHierarchyLevel', Format => 'int16u' }, + # '060e2b34.0101.010c.02100203.09000000' => { Name => 'RegisterWildcardFlag', Type => 'Node' }, + '060e2b34.0101.010c.02100203.0a000000' => { Name => 'RegisterEntryStatus', Type => 'EntryStatusType', Unknown => 1 }, + # '060e2b34.0101.010c.02100204.00000000' => { Name => 'RegisterAdministration', Type => 'Node' }, + '060e2b34.0101.010c.02100204.01000000' => { Name => 'RegisterAction', Type => 'UTF-16' }, + '060e2b34.0101.010c.02100204.02000000' => { Name => 'RegisterApproverName', Type => 'UTF-16' }, + '060e2b34.0101.010c.02100204.03000000' => { Name => 'RegisterCreationTime', %timestamp }, + '060e2b34.0101.010c.02100204.04000000' => { Name => 'RegistrantName', Type => 'UTF-16' }, + '060e2b34.0101.010c.02100204.05000000' => { Name => 'RegisterItemOriginatorName', Type => 'UTF-16' }, + '060e2b34.0101.010c.02100204.06000000' => { Name => 'RegisterUserName', Type => 'UTF-16' }, + '060e2b34.0101.010c.02100204.07000000' => { Name => 'RegisterUserTime', %timestamp }, + '060e2b34.0101.010c.02100204.08000000' => { Name => 'RegisterAdministrationNotes', Type => 'UTF-16' }, + '060e2b34.0101.010c.04010101.09000000' => { Name => 'AFDAndBarData', Unknown => 1 }, + '060e2b34.0101.010c.04010101.0a000000' => { Name => 'PanScanInformation', Unknown => 1 }, + # '060e2b34.0101.010c.04010604.00000000' => { Name => 'VC-1PictureEssenceDescriptors', Type => 'Node' }, + '060e2b34.0101.010c.04010604.01000000' => { Name => 'VC-1InitializationMetadata', Type => 'DataStream', Unknown => 1 }, + '060e2b34.0101.010c.04010604.02000000' => { Name => 'VC-1SingleSequence', Type => 'Boolean' }, + '060e2b34.0101.010c.04010604.03000000' => { Name => 'VC-1CodedContentType', Format => 'int8u' }, + '060e2b34.0101.010c.04010604.04000000' => { Name => 'VC-1IdenticalGOP', Type => 'Boolean' }, + '060e2b34.0101.010c.04010604.05000000' => { Name => 'VC-1MaximumGOP', Format => 'int16u' }, + '060e2b34.0101.010c.04010604.06000000' => { Name => 'VC-1BPictureCount', Format => 'int16u' }, + '060e2b34.0101.010c.04010604.07000000' => { Name => 'VC-1AverageBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' }, + '060e2b34.0101.010c.04010604.08000000' => { Name => 'VC-1MaximumBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' }, + '060e2b34.0101.010c.04010604.09000000' => { Name => 'VC-1Profile', Format => 'int8u' }, + '060e2b34.0101.010c.04010604.0a000000' => { Name => 'VC-1Level', Format => 'int8u' }, + '060e2b34.0101.010c.04020501.07000000' => { Name => 'LinkedTimecodeTrackID', Type => 'UInt32Array', Unknown => 1 }, + '060e2b34.0101.010c.04020501.08000000' => { Name => 'SMPTE337MDataStreamNumber', Format => 'int8u' }, + '060e2b34.0101.010c.04060803.00000000' => { Name => 'ApplicationScheme', Type => 'UL', Unknown => 1 }, + '060e2b34.0101.010c.04060804.00000000' => { Name => 'DescriptiveMetadataScheme', Type => 'UL', Unknown => 1 }, + '060e2b34.0101.010c.04090500.00000000' => { Name => 'UCSEncoding', Type => 'UTF-16' }, + '060e2b34.0101.010c.05200701.0b000000' => { Name => 'LinkedApplicationPlug-InInstanceID', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.010c.05200701.0c000000' => { Name => 'LinkedDescriptiveFrameworkPlug-InID', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.010c.05200701.0d000000' => { Name => 'ApplicationPlug-InInstanceID', Type => 'UUID', Unknown => 1 }, + '060e2b34.0101.010c.05200701.0e000000' => { Name => 'DescriptiveMetadataPlug-InID', Type => 'UUID', Unknown => 1 }, + '060e2b34.0101.010c.05200701.0f000000' => { Name => 'ApplicationEnvironmentID', Type => 'UTF-16' }, + '060e2b34.0101.010c.05200701.10000000' => { Name => 'DescriptiveMetadataApplicationEnvironmentID', Type => 'UTF-16' }, + '060e2b34.0101.010c.05200701.11000000' => { Name => 'LinkedDescriptiveObjectPlug-InID', Type => 'WeakReference', Unknown => 1 }, + '060e2b34.0101.010c.06010103.0e000000' => { Name => 'TimebaseReferenceTrackID', Format => 'int32u' }, + '060e2b34.0101.010c.06010104.010b0000' => { Name => 'ObjectClassDefinition', Type => 'AUID', Unknown => 1 }, + '060e2b34.0101.010c.06010104.020e0000' => { Name => 'ApplicationPlug-InBatch', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.010c.06010104.020f0000' => { Name => 'PackageMarker', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.010c.06010104.02100000' => { Name => 'PackageTimelineMarkerRef', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.010c.06010104.02110000' => { Name => 'RegisterAdministrationObject', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.010c.06010104.02120000' => { Name => 'RegisterEntryAdministrationObject', Type => 'StrongReference', Unknown => 1 }, + '060e2b34.0101.010c.06010104.03060000' => { Name => 'GenericPayloads', Type => 'WeakReferenceBatch', Unknown => 1 }, + '060e2b34.0101.010c.06010104.06110000' => { Name => 'RegisterEntryArray', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.010c.06010104.06120000' => { Name => 'RegisterAdministrationArray', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.010c.06010104.06130000' => { Name => 'ApplicationInformationArray', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.010c.06010104.06140000' => { Name => 'RegisterChildEntryArray', Type => 'StrongReferenceArray', Unknown => 1 }, + '060e2b34.0101.010c.07020101.01060000' => { Name => 'RegisterReleaseDateTime', %timestamp }, + '060e2b34.0101.010c.07020101.01070000' => { Name => 'RegisterItemStatusChangeDateTime', %timestamp }, + # '060e2b34.0101.010c.0d090000.00000000' => { Name => 'ASC', Type => 'Node' }, + # '060e2b34.0101.010c.0d0a0000.00000000' => { Name => 'AES', Type => 'Node' }, + # '060e2b34.0101.010c.0d0b0000.00000000' => { Name => 'DutchGuild', Type => 'Node' }, + # '060e2b34.0101.010c.0e130000.00000000' => { Name => 'NLTechnologyLLC', Type => 'Node' }, + # '060e2b34.0101.010c.0e140000.00000000' => { Name => 'HarrisCorporation', Type => 'Node' }, + + # data types (not used as tag ID's, right?) + # '060e2b34.0104.0101.01010100.00000000' => { Name => 'UInt8' }, + # '060e2b34.0104.0101.01010200.00000000' => { Name => 'UInt16' }, + # '060e2b34.0104.0101.01010300.00000000' => { Name => 'UInt32' }, + # '060e2b34.0104.0101.01010400.00000000' => { Name => 'UInt64' }, + # '060e2b34.0104.0101.01010500.00000000' => { Name => 'Int8' }, + # '060e2b34.0104.0101.01010600.00000000' => { Name => 'Int16' }, + # '060e2b34.0104.0101.01010700.00000000' => { Name => 'Int32' }, + # '060e2b34.0104.0101.01010800.00000000' => { Name => 'Int64' }, + # '060e2b34.0104.0101.01012001.00000000' => { Name => 'Position' }, + # '060e2b34.0104.0101.01012002.00000000' => { Name => 'LengthType' }, + # '060e2b34.0104.0101.01030100.00000000' => { Name => 'AUID' }, + # '060e2b34.0104.0101.01030200.00000000' => { Name => 'PackageID' }, + # '060e2b34.0104.0101.01040100.00000000' => { Name => 'Boolean' }, + # '060e2b34.0104.0101.01100100.00000000' => { Name => 'UTF16' }, + # '060e2b34.0104.0101.01100200.00000000' => { Name => 'UTF16String' }, + # '060e2b34.0104.0101.01100300.00000000' => { Name => 'ISO7' }, + # '060e2b34.0104.0101.01100400.00000000' => { Name => 'ISO7String' }, + # '060e2b34.0104.0101.01200500.00000000' => { Name => 'UTF7String' }, + # '060e2b34.0104.0101.01300100.00000000' => { Name => 'UMID' }, + # '060e2b34.0104.0101.0201010e.00000000' => { Name => 'RGBACode' }, + # '060e2b34.0104.0101.02010125.00000000' => { Name => 'ChannelStatusModeType' }, + # '060e2b34.0104.0101.03010100.00000000' => { Name => 'Rational' }, + # '060e2b34.0104.0101.03010101.00000000' => { Name => 'Numerator' }, + # '060e2b34.0104.0101.03010102.00000000' => { Name => 'Denominator' }, + # '060e2b34.0104.0101.03010200.00000000' => { Name => 'ProductVersionType' }, + # '060e2b34.0104.0101.03010201.00000000' => { Name => 'Major' }, + # '060e2b34.0104.0101.03010202.00000000' => { Name => 'Minor' }, + # '060e2b34.0104.0101.03010203.00000000' => { Name => 'Patch' }, + # '060e2b34.0104.0101.03010204.00000000' => { Name => 'Build' }, + # '060e2b34.0104.0101.03010205.00000000' => { Name => 'Release' }, + # '060e2b34.0104.0101.03010300.00000000' => { Name => 'VersionType' }, + # '060e2b34.0104.0101.03010400.00000000' => { Name => 'RGBALayoutItem' }, + # '060e2b34.0104.0101.03010501.00000000' => { Name => 'Year' }, + # '060e2b34.0104.0101.03010502.00000000' => { Name => 'Month' }, + # '060e2b34.0104.0101.03010503.00000000' => { Name => 'Day' }, + # '060e2b34.0104.0101.03010601.00000000' => { Name => 'Hours' }, + # '060e2b34.0104.0101.03010602.00000000' => { Name => 'Minutes' }, + # '060e2b34.0104.0101.03010603.00000000' => { Name => 'Seconds' }, + # '060e2b34.0104.0101.03010604.00000000' => { Name => 'msBy4' }, + # '060e2b34.0104.0101.03010700.00000000' => { Name => 'Timestamp' }, + # '060e2b34.0104.0101.04010100.00000000' => { Name => 'UInt8Array' }, + # '060e2b34.0104.0101.04010300.00000000' => { Name => 'Int32Array' }, + # '060e2b34.0104.0101.04010400.00000000' => { Name => 'Int64Array' }, + # '060e2b34.0104.0101.04010600.00000000' => { Name => 'AUIDArray' }, + # '060e2b34.0104.0101.04020100.00000000' => { Name => 'RGBALayout' }, + # '060e2b34.0104.0101.04020200.00000000' => { Name => 'RationalArray' }, + # '060e2b34.0104.0101.04030200.00000000' => { Name => 'UInt32Batch' }, + # '060e2b34.0104.0101.04100100.00000000' => { Name => 'DataValue' }, + # '060e2b34.0104.0101.04100200.00000000' => { Name => 'Stream' }, + # '060e2b34.0104.0101.04100300.00000000' => { Name => 'Indirect' }, + # '060e2b34.0104.0101.04100400.00000000' => { Name => 'Opaque' }, + # '060e2b34.0104.0101.05010000.00000000' => { Name => 'WeakRef' }, + # '060e2b34.0104.0101.05020000.00000000' => { Name => 'StrongRef' }, + # '060e2b34.0104.0101.05021400.00000000' => { Name => 'StrongReferenceTrack' }, + # '060e2b34.0104.0101.05060500.00000000' => { Name => 'StrongReferenceVectorTrack' }, + # '060e2b34.0204.0107.0d010301.027e0100' => { Name => 'EncryptedTriplet' }, + + '060e2b34.0205.0101.0d010201.01020100' => { Name => 'OpenHeader', %header }, + '060e2b34.0205.0101.0d010201.01020200' => { Name => 'ClosedHeader', %header }, + '060e2b34.0205.0101.0d010201.01020300' => { Name => 'OpenCompleteHeader', %header }, + '060e2b34.0205.0101.0d010201.01020400' => { Name => 'ClosedCompleteHeader', %header }, + '060e2b34.0205.0101.0d010201.01030100' => { Name => 'OpenBodyPartition', Unknown => 1 }, + '060e2b34.0205.0101.0d010201.01030200' => { Name => 'ClosedBodyPartition', Unknown => 1 }, + '060e2b34.0205.0101.0d010201.01030300' => { Name => 'OpenCompleteBodyPartition', Unknown => 1 }, + '060e2b34.0205.0101.0d010201.01030400' => { Name => 'ClosedCompleteBodyPartition', Unknown => 1 }, + '060e2b34.0205.0101.0d010201.01040200' => { Name => 'Footer', Unknown => 1 }, + '060e2b34.0205.0101.0d010201.01040400' => { Name => 'CompleteFooter', Unknown => 1 }, + + '060e2b34.0205.0101.0d010201.01050100' => { Name => 'Primer', SubDirectory => { TagTable => 'Image::ExifTool::MXF::Main', ProcessProc => \&ProcessPrimer } }, + + '060e2b34.0205.0101.0d010201.01110000' => { Name => 'RandomIndexMetadataV10', Type => 'FixedPack', Unknown => 1 }, + '060e2b34.0205.0101.0d010201.01110100' => { Name => 'RandomIndexMetadata', Type => 'FixedPack', Unknown => 1 }, + '060e2b34.0206.0101.0d010200.00000000' => { Name => 'PartitionMetadata', Type => 'FixedPack', Unknown => 1 }, + + '060e2b34.0253.0101.0d010101.01010200' => { Name => 'StructuralComponent', %localSet }, + '060e2b34.0253.0101.0d010101.01010f00' => { Name => 'SequenceSet', %localSet }, + # Note: SourceClip is actually a local set, but it isn't decoded because it has a Duration + # tag which gets confused with the other Duration tags (also, my technique of determining + # the corresponding EditRate doesn't seem to work for this Duration) + '060e2b34.0253.0101.0d010101.01011100' => { Name => 'SourceClip', Unknown => 1 }, + '060e2b34.0253.0101.0d010101.01011400' => { Name => 'TimecodeComponent', %localSet }, + '060e2b34.0253.0101.0d010101.01011800' => { Name => 'ContentStorageSet', %localSet }, + '060e2b34.0253.0101.0d010101.01012300' => { Name => 'EssenceContainerDataSet', %localSet }, + '060e2b34.0253.0101.0d010101.01012500' => { Name => 'FileDescriptor', %localSet }, + '060e2b34.0253.0101.0d010101.01012700' => { Name => 'GenericPictureEssenceDescriptor', %localSet }, + '060e2b34.0253.0101.0d010101.01012800' => { Name => 'CDCIEssenceDescriptor', %localSet }, + '060e2b34.0253.0101.0d010101.01012900' => { Name => 'RGBAEssenceDescriptor', %localSet }, + '060e2b34.0253.0101.0d010101.01012f00' => { Name => 'Preface', %localSet }, + '060e2b34.0253.0101.0d010101.01013000' => { Name => 'Identification', %localSet }, + '060e2b34.0253.0101.0d010101.01013200' => { Name => 'NetworkLocator', %localSet }, + '060e2b34.0253.0101.0d010101.01013300' => { Name => 'TextLocator', %localSet }, + '060e2b34.0253.0101.0d010101.01013400' => { Name => 'GenericPackage', %localSet }, + '060e2b34.0253.0101.0d010101.01013600' => { Name => 'MaterialPackage', %localSet }, + '060e2b34.0253.0101.0d010101.01013700' => { Name => 'SourcePackage', %localSet }, + '060e2b34.0253.0101.0d010101.01013800' => { Name => 'GenericTrack', %localSet }, + '060e2b34.0253.0101.0d010101.01013900' => { Name => 'EventTrack', %localSet }, + '060e2b34.0253.0101.0d010101.01013a00' => { Name => 'StaticTrack', %localSet }, + '060e2b34.0253.0101.0d010101.01013b00' => { Name => 'Track', %localSet }, + '060e2b34.0253.0101.0d010101.01014100' => { Name => 'DMSegment', %localSet }, + '060e2b34.0253.0101.0d010101.01014200' => { Name => 'GenericSoundEssenceDescriptor', %localSet }, + '060e2b34.0253.0101.0d010101.01014300' => { Name => 'GenericDataEssenceDescriptor', %localSet }, + '060e2b34.0253.0101.0d010101.01014400' => { Name => 'MultipleDescriptor', %localSet }, + '060e2b34.0253.0101.0d010101.01014500' => { Name => 'DMSourceClip', %localSet }, + '060e2b34.0253.0101.0d010101.01014700' => { Name => 'AES3PCMDescriptor', %localSet }, + '060e2b34.0253.0101.0d010101.01014800' => { Name => 'WaveAudioDescriptor', %localSet }, + '060e2b34.0253.0101.0d010101.01015100' => { Name => 'MPEG2VideoDescriptor', %localSet }, + '060e2b34.0253.0101.0d010101.01015a00' => { Name => 'JPEG2000PictureSubDescriptor', %localSet }, + '060e2b34.0253.0101.0d010101.01015b00' => { Name => 'VBIDataDescriptor', %localSet }, + # ignore the index table sets because they contain no useful metadata + '060e2b34.0253.0101.0d010201.01100000' => { Name => 'V10IndexTableSegment', Unknown => 1 }, + '060e2b34.0253.0101.0d010201.01100100' => { Name => 'IndexTableSegment', Unknown => 1 }, + '060e2b34.0253.0101.0d010400.00000000' => { Name => 'DMSet', %localSet }, + '060e2b34.0253.0101.0d010401.00000000' => { Name => 'DMFramework', %localSet }, + + # DMS1 local sets (ref 12) + '060e2b34.0253.0101.0d010401.01010100' => { Name => 'ProductionFramework', %localSet }, + '060e2b34.0253.0101.0d010401.01010200' => { Name => 'ClipFramework', %localSet }, + '060e2b34.0253.0101.0d010401.01010300' => { Name => 'SceneFramework', %localSet }, + '060e2b34.0253.0101.0d010401.01100100' => { Name => 'Titles', %localSet }, + '060e2b34.0253.0101.0d010401.01110100' => { Name => 'Identification', %localSet }, + '060e2b34.0253.0101.0d010401.01120100' => { Name => 'GroupRelationship', %localSet }, + '060e2b34.0253.0101.0d010401.01130100' => { Name => 'Branding', %localSet }, + '060e2b34.0253.0101.0d010401.01140100' => { Name => 'Event', %localSet }, + '060e2b34.0253.0101.0d010401.01140200' => { Name => 'Publication', %localSet }, + '060e2b34.0253.0101.0d010401.01150100' => { Name => 'Award', %localSet }, + '060e2b34.0253.0101.0d010401.01160100' => { Name => 'CaptionDescription', %localSet }, + '060e2b34.0253.0101.0d010401.01170100' => { Name => 'Annotation', %localSet }, + '060e2b34.0253.0101.0d010401.01170200' => { Name => 'SettingPeriod', %localSet }, + '060e2b34.0253.0101.0d010401.01170300' => { Name => 'Scripting', %localSet }, + '060e2b34.0253.0101.0d010401.01170400' => { Name => 'Classification', %localSet }, + '060e2b34.0253.0101.0d010401.01170500' => { Name => 'Shot', %localSet }, + '060e2b34.0253.0101.0d010401.01170600' => { Name => 'KeyPoint', %localSet }, + '060e2b34.0253.0101.0d010401.01170800' => { Name => 'CueWords', %localSet }, + '060e2b34.0253.0101.0d010401.01180100' => { Name => 'Participant', %localSet }, + '060e2b34.0253.0101.0d010401.01190100' => { Name => 'ContactsList', %localSet }, + '060e2b34.0253.0101.0d010401.011a0200' => { Name => 'Person', %localSet }, + '060e2b34.0253.0101.0d010401.011a0300' => { Name => 'Organisation', %localSet }, + '060e2b34.0253.0101.0d010401.011a0400' => { Name => 'Location', %localSet }, + '060e2b34.0253.0101.0d010401.011b0100' => { Name => 'Address', %localSet }, + '060e2b34.0253.0101.0d010401.011b0200' => { Name => 'Communications', %localSet }, + '060e2b34.0253.0101.0d010401.011c0100' => { Name => 'Contract', %localSet }, + '060e2b34.0253.0101.0d010401.011c0200' => { Name => 'Rights', %localSet }, + '060e2b34.0253.0101.0d010401.011d0100' => { Name => 'PictureFormat', %localSet }, + '060e2b34.0253.0101.0d010401.011e0100' => { Name => 'DeviceParameters', %localSet }, + '060e2b34.0253.0101.0d010401.011f0100' => { Name => 'NameValue', %localSet }, + '060e2b34.0253.0101.0d010401.01200100' => { Name => 'Processing', %localSet }, + '060e2b34.0253.0101.0d010401.01200200' => { Name => 'Projects', %localSet }, + + '060e2b34.0253.0101.0d010401.02010000' => { Name => 'CryptographicFramework', %localSet }, + '060e2b34.0253.0101.0d010401.02020000' => { Name => 'CryptographicContext', %localSet }, + + '060e2b34.0253.0101.7f000000.00000000' => { Name => 'DefaultObject', Unknown => 1 }, + '060e2b34.0401.0107.02090201.01000000' => { Name => 'CipherAlgorithmAES128CBC', Type => 'Label', Unknown => 1 }, + '060e2b34.0401.0107.02090202.01000000' => { Name => 'HMACAlgorithmSHA1128', Type => 'Label', Unknown => 1 }, + '060e2b34.0401.0107.0d010301.020b0100' => { Name => 'EncryptedContainerLabel', Type => 'Label', Unknown => 1 }, + '060e2b34.0401.0107.0d010401.02010100' => { Name => 'CryptographicFrameworkLabel', Type => 'Label', Unknown => 1 }, +); + +# header information +%Image::ExifTool::MXF::Header = ( + GROUPS => { 2 => 'Video' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + 0 => { + Name => 'MXFVersion', + Format => 'int16u[2]', + ValueConv => '$val =~ tr/ /./; $val', + }, + # 4 - int32u: KAGSize + # 8 - int64u: bytes from first header + # 16 - int64u: bytes from previous partition + 24 => { # bytes to footer from start of header + Name => 'FooterPosition', + Format => 'int64u', + RawConv => '$$self{MXFInfo}{FooterPos} = $val; undef', + }, + 32 => { # number of bytes in header, beginning at the start of the Primer + Name => 'HeaderSize', + Format => 'int64u', + # use this opportinity to also save our header type + RawConv => q{ + $$self{MXFInfo}{HeaderType} = $$self{DIR_NAME}; + $$self{MXFInfo}{HeaderSize} = $val; + return undef; # I don't think anyone would care about this + }, + }, + # ...plus more stuff we don't care about +); + +#------------------------------------------------------------------------------ +# Convert 16 bytes to UL format +# Inputs: 0) 16-byte value +# Returns: UL string +sub UL($) +{ + return join('.', unpack('H8H4H4H8H8', shift));; +} + +#------------------------------------------------------------------------------ +# Convert latitude and/or longitude in [d]ddmmss(N|S|E|W) format +# Inputs: 0) string value to convert +# Returns: numerical lat and/or long +sub ConvLatLon($) +{ + my $val = shift; + my (@convVal, $ne); + foreach $ne ('NS','EW') { + next unless $val =~ /(\d{2,3})(\d{2})(\d{2})([$ne])/; + push @convVal, $1 + ($2 + $3 / 60) / 60 * (($4 eq 'N' or $4 eq 'E') ? 1 : -1); + } + return join ' ', @convVal; +} + +#------------------------------------------------------------------------------ +# Read MXF-specific Format types +# Inputs: 0) ExifTool ref, 1) value, 2) MXF value type +# Returns: formatted value +# Note: All types recognized here should be defined in the %knownType lookup +sub ReadMXFValue($$$) +{ + my ($et, $val, $type) = @_; + my $len = length($val); + local $_; + + if ($type eq 'UTF-16') { + $val = $et->Decode($val, 'UCS2'); # (until we handle UTF-16 properly) + } elsif ($type eq 'ProductVersion') { + my @a = unpack('n*', $val); + push @a, 0 while @a < 5; + $a[4] = { 0 => 'unknown', 1 => 'released', 2 => 'debug', 3 => 'patched', + 4 => 'beta', 5 => 'private build' }->{$a[4]} || "unknown $a[4]"; + $val = join('.', @a[0..3]) . ' ' . $a[4]; + } elsif ($type eq 'VersionType') { + $val = join('.',unpack('C*',$val)); + } elsif ($type eq 'Timestamp') { + my @a = unpack('nC*',$val); + my @max = (3000,12,31,24,59,59,249); + foreach (@a) { + last unless @max and $_ <= $max[0]; + shift @max; + } + if (@max) { + $val = 'Invalid (0x' . unpack('H*',$val) . ')'; + } else { + $a[6] *= 4; + $val = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d.%.3d', @a); + } + } elsif ($type eq 'Position' or $type eq 'Length') { + $val = Get64u(\$val, 0); + } elsif ($type eq 'Boolean') { + $val = $val eq "\0" ? 'False' : 'True'; + } elsif ($type =~ /^(Alt|Lat|Lon)$/ and $len == 4) { + # split into nibbles after swapping byte order (see reference 8b) + $val = unpack('H*', pack('N', unpack('V', $val))); + if ($type eq 'Alt') { + # drop satellite information and only support altitudes up to +/-99999 m + $val = "$val (from earth centre)" unless $val =~ s/^[abc]..// or $val =~ s/^[def]../-/; + } else { + $val =~ s/(...)/$1./; # insert decimal point after 3rd character + if ($type eq 'Lat') { + $val =~ s/^f/-/; # south with first digit = 0 + } else { + $val =~ s/^e/-/; # east with first digit = 0 + $val =~ s/^f/-1/; # east with first digit = 1 + } + } + } elsif ($type =~ /(Array|Batch)/ and $len > 16) { + my ($count, $size) = unpack('NN', $val); + # validate data length + $len == 8 + $count * $size or $et->WarnOnce("Bad array or batch size"); + my ($i, @a); + for ($i=0; $i<$count; ++$i) { + my $pos = 8 + $i * $size; + last if $pos + $size > $len; + push @a, substr($val, $pos, $size); + } + if ($type =~ /^StrongReference/) { + $_ = join('-', unpack('H8H4H4H4H12', $_)) foreach @a; + } elsif ($type eq 'BatchOfUL' or $type =~ /^WeakReference/) { + $_ = ReadMXFValue($et, $_, 'UL') foreach @a; + } + $val = \@a; + } elsif ($len == 32) { + # 32-byte types include UMID, PackageID + $val = join('.', unpack('H8H4H4H8', $val)) . ' ' . + join(' ', unpack('x12H2H6', $val)) . ' ' . + join('-', unpack('x16H8H4H4H4H12', $val)); + } elsif ($len == 16) { + # convert remaining 16-byte known types as GUID or UL + # - this covers all UID's, UL, Label, WeakReference, StrongReference + if ($type eq 'UL' or $type eq 'WeakReference') { + # reverse high/low word if a reversed GUID is stored in a UL type + # (see ref 8b, section 5.5.8) + # - a GUID will have high bit of byte 8 set (reversed, this is in byte 0) + return UL($val) unless unpack('C', $val) & 0x80; + $val = substr($val, 8) . substr($val, 0, 8); + } + $val = join('-', unpack('H8H4H4H4H12', $val)); # compact GUID format + } else { + # Note: a 64-byte extended UMID contains date/time, GPS coordinates, etc, + # which would could be decoded here (ref 8b, section 5)... + $val = unpack('H*', $val); + } + return $val; +} + +#------------------------------------------------------------------------------ +# Process MXF Primer (to build lookup for translating local tag ID's) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessPrimer($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $end = $$dirInfo{DirLen}; + return 0 unless $end > 8; + my $count = Get32u($dataPt, 0); + my $size = Get32u($dataPt, 4); + return 0 unless $size >= 18; + $et->VerboseDir('MXF Primer', $count); + my $verbose = $et->Options('Verbose'); + my $primer = $$et{MXFInfo}{Primer}; + my $pos = 8; + my $i; + for ($i=0; $i<$count; ++$i) { + last if $pos + $size > $end; + my $local = Get16u($dataPt, $pos); + my $global = UL(substr($$dataPt, $pos + 2, 16)); + $pos += $size; + # save this entry in the primer lookup table + $$primer{$local} = $global; + # print lookup details in verbose mode + next unless $verbose; + my $indx = $i . ')'; + $indx .= ' ' if length($indx) < 3; + $et->VPrint(0, sprintf(" | $indx 0x%.4x => '${global}'\n", $local)); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Read tags from an MXF local set +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessLocalSet($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + local $_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $end = $$dirInfo{DirLen}; + my $mxfInfo = $$et{MXFInfo}; + my $primer = $$mxfInfo{Primer}; + my (@strongRef, @groups, $instance, $editRate, $trackID, $langCode, $textLang); + + $et->VerboseDir('MXF LocalSet', undef, $end); + + # loop through all tags in this local set + my $pos = 0; + while ($pos + 4 < $end) { + my $loc = Get16u($dataPt, $pos); # get key (local tag ID) + my $len = Get16u($dataPt, $pos + 2); # get length + $pos += 4; + last if $pos + $len > $end; + my $tag = $$primer{$loc}; + my ($extra, $val, $type, $langInfo); + if ($tag and $$tagTablePtr{$tag}) { + $extra = sprintf(', Local 0x%.4x', $loc); + } else { + $tag = $loc; + # $et->WarnOnce('Missing local key for at least one tag'); + $extra = ', NOT IN PRIMER!'; + } + my $tagInfo = $$tagTablePtr{$tag}; + # handle our MXF-specific format types + if ($tagInfo) { + $type = $$tagInfo{Type}; + if ($type and $knownType{$type}) { + $val = ReadMXFValue($et, substr($$dataPt, $pos, $len), $type); + push @strongRef, (ref $val ? @$val : $val) if $type =~ /^StrongReference/; + # remember instance UID of this local set + if ($$tagInfo{Name} eq 'InstanceUID') { + $instance = $val; + # set language code for text + # (only works if InstanceUID comes before text) + $textLang = $$mxfInfo{$instance}{LangCode} if $$mxfInfo{$instance}; + } elsif ($type eq 'UTF-16' and $textLang) { + $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $textLang); + } + } + } + # get tagInfo ref the standard way to handle Unknown tags + $tagInfo = $langInfo || $et->GetTagInfo($tagTablePtr, $tag); + # set Binary flag to extract all unknown-format tags as Binary data + if ($tagInfo and $$tagInfo{Unknown} and not defined $$tagInfo{Binary}) { + $$tagInfo{Binary} = not ($$tagInfo{Format} or ($type and $knownType{$type})); + } + my $key = $et->HandleTag($tagTablePtr, $tag, $val, + Extra => $extra, + TagInfo => $tagInfo, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $pos, + Size => $len, + ProcessProc => \&ProcessLocalSet, + ); + $pos += $len; + next unless $key; + # save information to allow later fixup of durations and group1 names + # (necessary because we don't have all the information we need + # to do this on the fly when the file is parsed linearly) + push @groups, $$et{TAG_EXTRA}{$key}; + next unless $tagInfo; + my $name = $$tagInfo{Name}; + if ($$tagInfo{IsDuration}) { + $$mxfInfo{FixDuration}{$key} = 1; + } elsif ($$tagInfo{LanguageCode}) { + $langCode = $$et{VALUE}{$key}; + } elsif ($name eq 'EditRate') { + $editRate = $$et{VALUE}{$key}; + } elsif ($name =~ /TrackID$/) { + $trackID = $$et{VALUE}{$key}; + unless ($$mxfInfo{Group1}{$trackID}) { + # save lookup to convert TrackID to our group 1 name + $$mxfInfo{Group1}{$trackID} = 'Track' . ++$$mxfInfo{NumTracks}; + } + } + } + + # save object information now that we know the instance UID + if ($instance) { + my $objInfo = $$mxfInfo{$instance}; + if ($objInfo) { + push @{$$objInfo{StrongRef}}, @strongRef; + push @{$$objInfo{Groups}}, @groups; + } else { + $objInfo = $$mxfInfo{$instance} = { + StrongRef => \@strongRef, + Groups => \@groups, + }; + } + # save instance UID's in groups hash (used to remove duplicates later) + $$_{UID} = $instance foreach @groups; + $$objInfo{Name} = $$et{DIR_NAME}; + $$objInfo{TrackID} = $trackID if defined $trackID; + $$objInfo{EditRate} = $editRate if $editRate; + if ($langCode) { + $$objInfo{LangCode} = $langCode; + } else { + $langCode = $$objInfo{LangCode}; + } + if ($langCode) { + # pre-set language code in all children + my $ul; + foreach $ul (@{$$objInfo{StrongRef}}) { + my $obj = $$mxfInfo{$ul}; + $obj or $obj = $$mxfInfo{$ul} = { StrongRef => [], Groups => [], Name => 'XXX' }; + $$obj{LangCode} = $langCode; + } + } + # save instance UID's of Preface's + push @{$$mxfInfo{Preface}}, $instance if $$et{DIR_NAME} eq 'Preface'; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Walk MXF tree to set group names +# Inputs: 0) MXF information hash ref, 1) object instance UID, +# 2) path information hash ref (only for group 5 names), 3) track ID number +# Notes: also generates lookup table for EditRate based on group 1 name +# and the instance UID of the SequenceSet with the preferred Duration value +sub SetGroups($$;$$) +{ + my ($mxfInfo, $instance, $pathInfo, $trackID) = @_; + my $objInfo = $$mxfInfo{$instance}; + return unless $objInfo and not $$objInfo{DidGroups}; + $$objInfo{DidGroups} = 1; # avoid reprocessing this object + $trackID = $$objInfo{TrackID} if defined $$objInfo{TrackID}; + my ($ul, $g1, $g5, $groups, $path, $nameCount, $setSource); + # generate group 1 name for different tracks + if (defined $trackID) { + $$objInfo{TrackID} = $trackID; + $g1 = $$mxfInfo{Group1}{$trackID}; + # build a lookup to determine edit rates based on group 1 name + my $editRate = $$objInfo{EditRate}; + $$mxfInfo{EditRate}{$g1} = $editRate if defined $editRate; + # save the TimeCodeComponent instance UID (for determining Duration later) + if ($$objInfo{Name} eq 'TimecodeComponent') { + my $inWhat = $$mxfInfo{InSource} ? 'Source' : 'Other'; + $$mxfInfo{BestDuration}{$inWhat} = $instance; + } + } + # set flag if we are in the SourcePackage (contains our preferred TimecodeComponent) + my $name = $$objInfo{Name}; + $setSource = $$mxfInfo{InSource} = 1 if $name eq 'SourcePackage'; + + # generate group 5 path names if requested + if ($pathInfo) { + $nameCount = $$pathInfo{NameCount} || { }; + $path = $$pathInfo{Path}; + $$nameCount{$name} = ($$nameCount{$name} || 0) + 1; + push @$path, $name . $$nameCount{$name}; + $g5 = join '-', @$path; + $$pathInfo{NameCount} = { }; # use new name count for child objects + } + foreach $groups (@{$$objInfo{Groups}}) { + $$groups{G1} = $g1 if $g1; + $$groups{G5} = $g5 if $g5; + } + # walk through remaining objects in tree + foreach $ul (@{$$objInfo{StrongRef}}) { + SetGroups($mxfInfo, $ul, $pathInfo, $trackID); + } + if ($pathInfo) { + pop @$path; + $$pathInfo{NameCount} = $nameCount; + } + delete $$mxfInfo{InSource} if $setSource; +} + +#------------------------------------------------------------------------------ +# Convert all duration values to seconds +# Inputs: 0) ExifTool object ref, 1) MXF information hash ref +sub ConvertDurations($$) +{ + my ($et, $mxfInfo) = @_; + my $valueHash = $$et{VALUE}; + my $infoHash = $$et{TAG_INFO}; + my $tagExtra = $$et{TAG_EXTRA}; + my $editHash = $$mxfInfo{EditRate}; + my ($tag, $key, $i); + foreach $tag (keys %{$$mxfInfo{FixDuration}}) { + # loop through all instances of this tag name + for ($i=0, $key=$tag; ; ++$i, $key="$tag ($i)") { + my $tagInfo = $$infoHash{$key} or last; + next unless $$tagInfo{IsDuration}; # test IsDuration flag to be sure + my $g1 = $$tagExtra{$key}{G1} or next; + my $editRate = $$editHash{$g1}; + $$valueHash{$key} /= $editRate if $editRate; + } + } +} + +#------------------------------------------------------------------------------ +# Read information in a MXF file +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid MXF file +sub ProcessMXF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my $unknown = $et->Options('Unknown'); + my ($buff, $preface, $n, $headerEnd, $footerPos); + + # read enough to allow skipping over run-in if it exists + $raf->Read($buff, 65547) or return 0; + $buff =~ /\x06\x0e\x2b\x34\x02\x05\x01\x01\x0d\x01\x02/g or return 0; + my $start = pos($buff) - 11; + + $et->SetFileType(); + SetByteOrder('MM'); + $raf->Seek($start, 0) or $et->Warn('Seek error'), return 1; + my $tagTablePtr = GetTagTable('Image::ExifTool::MXF::Main'); + + # determine header length and type + + # initialize MXF information lookups + my %mxfInfo = ( + Primer => { }, # convert local keys to global UL + Group1 => { }, # group 1 names base on TrackID + NumTracks => 0, # counts number of tracks in file + FixDuration => { }, # names of all Duration tags that need fixing + Preface => [ ], # instance UID's for all Preface objects + ); + $$et{MXFInfo} = \%mxfInfo; + + # set group 1 name for all tags (so we can overwrite with track number later) + $$et{SET_GROUP1} = 'MXF'; + + for (;;) { + my $pos = $raf->Tell(); + # did we just finish parsing the header partition? + if ($headerEnd and $pos >= $headerEnd) { + # all done if it was a closed and complete header + last if $mxfInfo{HeaderType} eq 'ClosedCompleteHeader' and not $verbose; + undef $headerEnd; # (only test this once) + # skip directly to footer if possible + if ($footerPos and $footerPos > $pos and (not $verbose or not $unknown)) { + $et->VPrint(0, "[Skipping to footer. Use Unknown option to parse body partitions]\n"); + $raf->Seek($footerPos, 0) or last; + $pos = $footerPos; + } + } + # read the next KLV Key and first byte of Value + $raf->Read($buff, 17) == 17 or last; + my $tag = substr($buff, 0, 16); # get KLV Key (global tag ID) + my $len = Get8u(\$buff, 16); # get KLV Length + my $n; + if ($len >= 0x80) { + $n = $len & 0x7f; + $raf->Read($buff, $n) == $n or last; + $len = 0; + foreach $b (unpack 'C*', $buff) { + $len = $len * 256 + $b; + } + } else { + $n = 0; + } + # convert tag ID to ASCII UL notation + my $ul = UL($tag); + my $tagInfo = $$tagTablePtr{$ul}; + if (not $tagInfo and $ul =~ /^060e2b34\.0253\.0101\.(0d|0f)/ and + ($1 eq '0d' or $verbose or $unknown)) + { + # generate some unknown set tags automatically + my $name = $1 eq '0d' ? 'UserOrganizationPublicUse' : 'Experimental'; + $tagInfo = { Name => $name, %localSet }; + AddTagToTable($tagTablePtr, $ul, $tagInfo); + } + my ($val, $dataPt); + if ($tagInfo and not $$tagInfo{Unknown} and $len < 10000000) { + # save information about header/footer positions for skipping over body partitions + if ($$tagInfo{Name} eq 'Primer' and $mxfInfo{HeaderSize}) { + # footer position relative to header start and only valid if non-zero + $footerPos = $start + $mxfInfo{FooterPos} if $mxfInfo{FooterPos}; + # header length is relative to start of Primer + $headerEnd = $pos + $mxfInfo{HeaderSize}; + } elsif ($$tagInfo{IsHeader}) { + # save position of header start to allow calculation of footer position + $start = $pos; + } + $raf->Read($buff, $len) == $len or last; # get KLV Value + $dataPt = \$buff; + my $type = $$tagInfo{Type}; + $val = ReadMXFValue($et, $buff, $type) if $type and $knownType{$type}; + } elsif (($tagInfo and (not $$tagInfo{Unknown} or $unknown)) or $verbose) { + if ($tagInfo) { + # set Binary flag to extract all unknown-format tags as Binary data + if ($$tagInfo{Unknown} and not defined $$tagInfo{Binary}) { + my $type = $$tagInfo{Type}; + $$tagInfo{Binary} = not ($$tagInfo{Format} or ($type and $knownType{$type})); + } + } else { + my $id = unpack 'H*', $tag; + $tagInfo = { + Name => "MXF_$id", + Description => "MXF $id", + }; + # note: don't add unknown tags to table because we don't + # want them to be extracted with the Unknown option + } + # read the first 64kB max + my $n = $len < 65536 ? $len : 65536; + $raf->Read($val, $n) == $n or last; + $dataPt = \$val; + my $more = $len - $n; + $raf->Seek($more, 1) or last if $more; + } else { + $raf->Seek($len, 1) or last; # skip this value + next; + } + $et->HandleTag($tagTablePtr, $ul, $val, + TagInfo => $tagInfo, + DataPt => $dataPt, + DataPos => $pos + 17 + $n, + Size => $len, + ProcessProc => \&ProcessLocalSet, + ); + } + # walk entire MXF object tree to fix family 1 group names + my ($pathInfo, $tag, %did, %bestDur); + $pathInfo = { Path => [ 'MXF' ] } if $et->Options('SavePath'); + foreach $preface (@{$mxfInfo{Preface}}) { + SetGroups(\%mxfInfo, $preface, $pathInfo); + } + # convert Duration values to seconds based on the appropriate EditRate + ConvertDurations($et, \%mxfInfo); + + # remove tags to keep only the one from the most recent instance of the object + my $tagExtra = $$et{TAG_EXTRA}; + my $fileOrder = $$et{FILE_ORDER}; + # also determine our best Duration value + if ($mxfInfo{BestDuration}) { + my $instance = $mxfInfo{BestDuration}{Source} || $mxfInfo{BestDuration}{Other}; + $instance and $bestDur{"Duration $instance"} = 1; + } + # process tags in reverse order to preserve the last found of each identical tag + foreach $tag (sort { $$fileOrder{$b} <=> $$fileOrder{$a} } keys %$tagExtra) { + my $instance = $$tagExtra{$tag}{UID} or next; + delete $$tagExtra{$tag}{UID}; # (no longer needed) + $tag =~ /^(\S+)/; # get tag name without index number + my $utag = "$1 $instance"; # instance-specific tag name + if ($did{$utag}) { + Image::ExifTool::DeleteTag($et, $tag); # delete the duplicate + } else { + $did{$utag} = 1; + if ($bestDur{$utag}) { + # save best duration value + my $val = $$et{VALUE}{$tag}; + $et->HandleTag($tagTablePtr, '060e2b34.0101.0102.07020201.01030000', $val); + } + } + } + + # clean up and return + delete $$et{SET_GROUP1}; + delete $$et{MXFInfo}; + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::MXF - Read MXF meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read meta +information from MXF (Material Exchange Format) files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://sourceforge.net/projects/mxflib/> + +=item L<http://www.aafassociation.org/downloads/whitepapers/MXFPhysicalview.pdf> + +=item L<http://archive.nlm.nih.gov/pubs/pearson/MJ2_Metadata2005.pdf> + +=item L<http://www.aafassociation.org/downloads/specifications/AMWA-AS-03-Delivery-Spec-1_0.pdf> + +=item L<http://paul-sampson.ca/private/s385m.pdf> + +=item L<http://avwiki.nl/documents/eg41.pdf> + +=item L<http://avwiki.nl/documents/eg42.pdf> + +=item L<http://www.amwa.tv/downloads/specifications/aafobjectspec-v1.1.pdf> + +=item L<http://www.smpte-ra.org/mdd/RP210v12-publication-20100623.xls> + +=item L<http://rhea.tele.ucl.ac.be:8081/Plone/Members/egoray/thesaurus-dictionnaire-metadata/> + +=item L<http://www.mog-solutions.com/img_upload/PDF/XML%20Schema%20for%20MXF%20Metadata.pdf> + +=item L<http://www.freemxf.org/freemxf_board/viewtopic.php?p=545&sid=00a5c17e07d828c1e93ecdbaed3076f7> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/MXF Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/MacOS.pm b/lib/Image/ExifTool/MacOS.pm new file mode 100644 index 0000000..7803f33 --- /dev/null +++ b/lib/Image/ExifTool/MacOS.pm @@ -0,0 +1,735 @@ +#------------------------------------------------------------------------------ +# File: MacOS.pm +# +# Description: Read/write MacOS system tags +# +# Revisions: 2017/03/01 - P. Harvey Created +# 2020/10/13 - PH Added ability to read MacOS "._" files +#------------------------------------------------------------------------------ + +package Image::ExifTool::MacOS; +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.12'; + +sub MDItemLocalTime($); +sub ProcessATTR($$$); + +my %mdDateInfo = ( + ValueConv => \&MDItemLocalTime, + PrintConv => '$self->ConvertDateTime($val)', +); + +# Information decoded from Mac OS sidecar files +%Image::ExifTool::MacOS::Main = ( + GROUPS => { 0 => 'File', 1 => 'MacOS' }, + NOTES => q{ + Note that on some filesystems, MacOS creates sidecar files with names that + begin with "._". ExifTool will read these files if specified, and extract + the information listed in the following table without the need for extra + options, but these files are not writable directly. + }, + 2 => { + Name => 'RSRC', + SubDirectory => { TagTable => 'Image::ExifTool::RSRC::Main' }, + }, + 9 => { + Name => 'ATTR', + SubDirectory => { + TagTable => 'Image::ExifTool::MacOS::XAttr', + ProcessProc => \&ProcessATTR, + }, + }, +); + +# "mdls" tags (ref PH) +%Image::ExifTool::MacOS::MDItem = ( + WRITE_PROC => \&Image::ExifTool::DummyWriteProc, + VARS => { NO_ID => 1 }, + GROUPS => { 0 => 'File', 1 => 'MacOS', 2 => 'Other' }, + NOTES => q{ + MDItem tags are extracted using the "mdls" utility. They are extracted if + any "MDItem*" tag or the MacOS group is specifically requested, or by + setting the API L<MDItemTags|../ExifTool.html#MDItemTags> option to 1 or the API L<RequestAll|../ExifTool.html#RequestAll> option to 2 or + higher. Note that these tags do not necessarily reflect the current + metadata of a file -- it may take some time for the MacOS mdworker daemon to + index the file after a metadata change. + }, + MDItemFinderComment => { + Writable => 1, + WritePseudo => 1, + Protected => 1, # (all writable pseudo tags must be protected) + }, + MDItemFSLabel => { + Writable => 1, + WritePseudo => 1, + Protected => 1, # (all writable pseudo tags must be protected) + WriteCheck => '$val =~ /^[0-7]$/ ? undef : "Not an integer in the range 0-7"', + PrintConv => { + 0 => '0 (none)', + 1 => '1 (Gray)', + 2 => '2 (Green)', + 3 => '3 (Purple)', + 4 => '4 (Blue)', + 5 => '5 (Yellow)', + 6 => '6 (Red)', + 7 => '7 (Orange)', + }, + }, + MDItemFSCreationDate => { + Writable => 1, + WritePseudo => 1, + DelCheck => q{"Can't delete"}, + Protected => 1, # (all writable pseudo tags must be protected) + Shift => 'Time', # (but not supported yet) + Notes => q{ + file creation date. Requires "setfile" for writing. Note that when + reading, it may take a few seconds after writing a file before this value + reflects the change. However, L<FileCreateDate|Extra.html> is updated immediately + }, + Groups => { 2 => 'Time' }, + ValueConv => \&MDItemLocalTime, + ValueConvInv => '$val', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + MDItemAcquisitionMake => { Groups => { 2 => 'Camera' } }, + MDItemAcquisitionModel => { Groups => { 2 => 'Camera' } }, + MDItemAltitude => { Groups => { 2 => 'Location' } }, + MDItemAperture => { Groups => { 2 => 'Camera' } }, + MDItemAudioBitRate => { Groups => { 2 => 'Audio' } }, + MDItemAudioChannelCount => { Groups => { 2 => 'Audio' } }, + MDItemAuthors => { Groups => { 2 => 'Author' } }, + MDItemBitsPerSample => { Groups => { 2 => 'Image' } }, + MDItemCity => { Groups => { 2 => 'Location' } }, + MDItemCodecs => { }, + MDItemColorSpace => { Groups => { 2 => 'Image' } }, + MDItemComment => { }, + MDItemContentCreationDate => { Groups => { 2 => 'Time' }, %mdDateInfo }, + MDItemContentCreationDateRanking => { Groups => { 2 => 'Time' }, %mdDateInfo }, + MDItemContentModificationDate => { Groups => { 2 => 'Time' }, %mdDateInfo }, + MDItemContentType => { }, + MDItemContentTypeTree => { }, + MDItemContributors => { }, + MDItemCopyright => { Groups => { 2 => 'Author' } }, + MDItemCountry => { Groups => { 2 => 'Location' } }, + MDItemCreator => { Groups => { 2 => 'Document' } }, + MDItemDateAdded => { Groups => { 2 => 'Time' }, %mdDateInfo }, + MDItemDescription => { }, + MDItemDisplayName => { }, + MDItemDownloadedDate => { Groups => { 2 => 'Time' }, %mdDateInfo }, + MDItemDurationSeconds => { PrintConv => 'ConvertDuration($val)' }, + MDItemEncodingApplications => { }, + MDItemEXIFGPSVersion => { Groups => { 2 => 'Location' }, Description => 'MD Item EXIF GPS Version' }, + MDItemEXIFVersion => { }, + MDItemExposureMode => { Groups => { 2 => 'Camera' } }, + MDItemExposureProgram => { Groups => { 2 => 'Camera' } }, + MDItemExposureTimeSeconds => { Groups => { 2 => 'Camera' } }, + MDItemFlashOnOff => { Groups => { 2 => 'Camera' } }, + MDItemFNumber => { Groups => { 2 => 'Camera' } }, + MDItemFocalLength => { Groups => { 2 => 'Camera' } }, + MDItemFSContentChangeDate => { Groups => { 2 => 'Time' }, %mdDateInfo }, + MDItemFSCreatorCode => { Groups => { 2 => 'Author' } }, + MDItemFSFinderFlags => { }, + MDItemFSHasCustomIcon => { }, + MDItemFSInvisible => { }, + MDItemFSIsExtensionHidden => { }, + MDItemFSIsStationery => { }, + MDItemFSName => { }, + MDItemFSNodeCount => { }, + MDItemFSOwnerGroupID => { }, + MDItemFSOwnerUserID => { }, + MDItemFSSize => { }, + MDItemFSTypeCode => { }, + MDItemGPSDateStamp => { Groups => { 2 => 'Time' } }, + MDItemGPSStatus => { Groups => { 2 => 'Location' } }, + MDItemGPSTrack => { Groups => { 2 => 'Location' } }, + MDItemHasAlphaChannel => { Groups => { 2 => 'Image' } }, + MDItemImageDirection => { Groups => { 2 => 'Location' } }, + MDItemInterestingDateRanking => { Groups => { 2 => 'Time' }, %mdDateInfo }, + MDItemISOSpeed => { Groups => { 2 => 'Camera' } }, + MDItemKeywords => { }, + MDItemKind => { }, + MDItemLastUsedDate => { Groups => { 2 => 'Time' }, %mdDateInfo }, + MDItemLastUsedDate_Ranking => { }, + MDItemLatitude => { Groups => { 2 => 'Location' } }, + MDItemLensModel => { }, + MDItemLogicalSize => { }, + MDItemLongitude => { Groups => { 2 => 'Location' } }, + MDItemMediaTypes => { }, + MDItemNumberOfPages => { }, + MDItemOrientation => { Groups => { 2 => 'Image' } }, + MDItemOriginApplicationIdentifier => { }, + MDItemOriginMessageID => { }, + MDItemOriginSenderDisplayName => { }, + MDItemOriginSenderHandle => { }, + MDItemOriginSubject => { }, + MDItemPageHeight => { Groups => { 2 => 'Image' } }, + MDItemPageWidth => { Groups => { 2 => 'Image' } }, + MDItemPhysicalSize => { Groups => { 2 => 'Image' } }, + MDItemPixelCount => { Groups => { 2 => 'Image' } }, + MDItemPixelHeight => { Groups => { 2 => 'Image' } }, + MDItemPixelWidth => { Groups => { 2 => 'Image' } }, + MDItemProfileName => { Groups => { 2 => 'Image' } }, + MDItemRedEyeOnOff => { Groups => { 2 => 'Camera' } }, + MDItemResolutionHeightDPI => { Groups => { 2 => 'Image' } }, + MDItemResolutionWidthDPI => { Groups => { 2 => 'Image' } }, + MDItemSecurityMethod => { }, + MDItemSpeed => { Groups => { 2 => 'Location' } }, + MDItemStateOrProvince => { Groups => { 2 => 'Location' } }, + MDItemStreamable => { }, + MDItemTimestamp => { Groups => { 2 => 'Time' } }, # (time only) + MDItemTitle => { }, + MDItemTotalBitRate => { }, + MDItemUseCount => { }, + MDItemUsedDates => { Groups => { 2 => 'Time' }, %mdDateInfo }, + MDItemUserDownloadedDate => { Groups => { 2 => 'Time' }, %mdDateInfo }, + MDItemUserDownloadedUserHandle=> { }, + MDItemUserSharedReceivedDate => { }, + MDItemUserSharedReceivedRecipient => { }, + MDItemUserSharedReceivedRecipientHandle => { }, + MDItemUserSharedReceivedSender=> { }, + MDItemUserSharedReceivedSenderHandle => { }, + MDItemUserSharedReceivedTransport => { }, + MDItemUserTags => { + List => 1, + Writable => 1, + WritePseudo => 1, + Protected => 1, # (all writable pseudo tags must be protected) + Notes => q{ + requires "tag" utility for writing -- install with "brew install tag". Note + that user tags may not contain a comma, and that duplicate user tags will + not be written + }, + }, + MDItemVersion => { }, + MDItemVideoBitRate => { Groups => { 2 => 'Video' } }, + MDItemWhereFroms => { }, + MDItemWhiteBalance => { Groups => { 2 => 'Image' } }, + # tags used by Apple Mail on .emlx files + com_apple_mail_dateReceived => { Name => 'AppleMailDateReceived', Groups => { 2 => 'Time' }, %mdDateInfo }, + com_apple_mail_dateSent => { Name => 'AppleMailDateSent', Groups => { 2 => 'Time' }, %mdDateInfo }, + com_apple_mail_flagged => { Name => 'AppleMailFlagged' }, + com_apple_mail_messageID => { Name => 'AppleMailMessageID' }, + com_apple_mail_priority => { Name => 'AppleMailPriority' }, + com_apple_mail_read => { Name => 'AppleMailRead' }, + com_apple_mail_repliedTo => { Name => 'AppleMailRepliedTo' }, + com_apple_mail_isRemoteAttachment => { Name => 'AppleMailIsRemoteAttachment' }, + MDItemAccountHandles => { }, + MDItemAccountIdentifier => { }, + MDItemAuthorEmailAddresses => { }, + MDItemBundleIdentifier => { }, + MDItemContentCreationDate_Ranking=>{Groups=> { 2 => 'Time' }, %mdDateInfo }, + MDItemDateAdded_Ranking => { Groups => { 2 => 'Time' }, %mdDateInfo }, + MDItemEmailConversationID => { }, + MDItemIdentifier => { }, + MDItemInterestingDate_Ranking => { Groups => { 2 => 'Time' }, %mdDateInfo }, + MDItemIsApplicationManaged => { }, + MDItemIsExistingThread => { }, + MDItemIsLikelyJunk => { }, + MDItemMailboxes => { }, + MDItemMailDateReceived_Ranking=> { Groups => { 2 => 'Time' }, %mdDateInfo }, + MDItemPrimaryRecipientEmailAddresses => { }, + MDItemRecipients => { }, + MDItemSubject => { }, +); + +# "xattr" tags +%Image::ExifTool::MacOS::XAttr = ( + WRITE_PROC => \&Image::ExifTool::DummyWriteProc, + GROUPS => { 0 => 'File', 1 => 'MacOS', 2 => 'Other' }, + VARS => { NO_ID => 1 }, # (id's are too long) + NOTES => q{ + XAttr tags are extracted using the "xattr" utility. They are extracted if + any "XAttr*" tag or the MacOS group is specifically requested, or by setting + the API L<XAttrTags|../ExifTool.html#XAttrTags> option to 1 or the API L<RequestAll|../ExifTool.html#RequestAll> option to 2 or higher. + And they are extracted by default from MacOS "._" files when reading + these files directly. + }, + 'com.apple.FinderInfo' => { + Name => 'XAttrFinderInfo', + ConvertBinary => 1, + # ref https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-9A581/Finder.h + ValueConv => q{ + my @a = unpack('a4a4n3x10nx2N', $$val); + tr/\0//d, $_="'${_}'" foreach @a[0,1]; + return "@a"; + }, + PrintConv => q{ + $val =~ s/^('.*?') ('.*?') //s or return $val; + my ($type, $creator) = ($1, $2); + my ($flags, $y, $x, $exFlags, $putAway) = split ' ', $val; + my $label = ($flags >> 1) & 0x07; + my $flags = DecodeBits((($exFlags<<16) | $flags) & 0xfff1, { + 0 => 'OnDesk', + 6 => 'Shared', + 7 => 'HasNoInits', + 8 => 'Inited', + 10 => 'CustomIcon', + 11 => 'Stationery', + 12 => 'NameLocked', + 13 => 'HasBundle', + 14 => 'Invisible', + 15 => 'Alias', + # extended flags + 22 => 'HasRoutingInfo', + 23 => 'ObjectBusy', + 24 => 'CustomBadge', + 31 => 'ExtendedFlagsValid', + }); + my $str = "Type=$type Creator=$creator Flags=$flags Label=$label Pos=($x,$y)"; + $str .= " Putaway=$putAway" if $putAway; + return $str; + }, + }, + 'com.apple.quarantine' => { + Name => 'XAttrQuarantine', + Writable => 1, + WritePseudo => 1, + WriteCheck => '"May only delete this tag"', + Protected => 1, + Notes => q{ + quarantine information for files downloaded from the internet. May only be + deleted when writing + }, + # ($a[1] is the time when the quarantine tag was set) + PrintConv => q{ + my @a = split /;/, $val; + $a[0] = 'Flags=' . $a[0]; + $a[1] = 'set at ' . ConvertUnixTime(hex $a[1]); + $a[2] = 'by ' . $a[2]; + return join ' ', @a; + }, + PrintConvInv => '$val', + }, + 'com.apple.metadata:com_apple_mail_dateReceived' => { + Name => 'XAttrAppleMailDateReceived', + Groups => { 2 => 'Time' }, + }, + 'com.apple.metadata:com_apple_mail_dateSent' => { + Name => 'XAttrAppleMailDateSent', + Groups => { 2 => 'Time' }, + }, + 'com.apple.metadata:com_apple_mail_isRemoteAttachment' => { + Name => 'XAttrAppleMailIsRemoteAttachment', + }, + 'com.apple.metadata:kMDItemDownloadedDate' => { + Name => 'XAttrMDItemDownloadedDate', + Groups => { 2 => 'Time' }, + }, + 'com.apple.metadata:kMDItemFinderComment' => { Name => 'XAttrMDItemFinderComment' }, + 'com.apple.metadata:kMDItemWhereFroms' => { Name => 'XAttrMDItemWhereFroms' }, + 'com.apple.metadata:kMDLabel' => { Name => 'XAttrMDLabel', Binary => 1 }, + 'com.apple.ResourceFork' => { Name => 'XAttrResourceFork', Binary => 1 }, + 'com.apple.lastuseddate#PS' => { + Name => 'XAttrLastUsedDate', + Groups => { 2 => 'Time' }, + # (first 4 bytes are date/time. Not sure what remaining 12 bytes are for) + RawConv => 'ConvertUnixTime(unpack("V",$$val))', + PrintConv => '$self->ConvertDateTime($val)', + }, +); + +#------------------------------------------------------------------------------ +# Convert OS MDItem time string to standard EXIF-formatted local time +# Inputs: 0) time string (eg. "2017-02-21 17:21:43 +0000") +# Returns: EXIF-formatted local time string with timezone +sub MDItemLocalTime($) +{ + my $val = shift; + $val =~ tr/-/:/; + $val =~ s/ ?([-+]\d{2}):?(\d{2})/$1:$2/; + # convert from UTC to local time + if ($val =~ /\+00:00$/) { + my $time = Image::ExifTool::GetUnixTime($val); + $val = Image::ExifTool::ConvertUnixTime($time, 1) if $time; + } + return $val; +} + +#------------------------------------------------------------------------------ +# Set MacOS MDItem and XAttr tags from new tag values +# Inputs: 0) ExifTool ref, 1) file name, 2) list of tags to set +# Returns: 1=something was set OK, 0=didn't try, -1=error (and warning set) +# Notes: There may be errors even if 1 is returned +sub SetMacOSTags($$$) +{ + my ($et, $file, $setTags) = @_; + my $result = 0; + my $tag; + + foreach $tag (@$setTags) { + my ($nvHash, $f, $v, $attr, $cmd, $err, $silentErr); + my $val = $et->GetNewValue($tag, \$nvHash); + next unless $nvHash; + my $overwrite = $et->IsOverwriting($nvHash); + unless ($$nvHash{TagInfo}{List}) { + next unless $overwrite; + if ($overwrite < 0) { + my $operation = $$nvHash{Shift} ? 'Shifting' : 'Conditional replacement'; + $et->Warn("$operation of MacOS $tag not yet supported"); + next; + } + } + if ($tag eq 'MDItemFSCreationDate' or $tag eq 'FileCreateDate') { + ($f = $file) =~ s/'/'\\''/g; + # convert to local time if value has a time zone + if ($val =~ /[-+Z]/) { + my $time = Image::ExifTool::GetUnixTime($val, 1); + $val = Image::ExifTool::ConvertUnixTime($time, 1) if $time; + } + $val =~ s{(\d{4}):(\d{2}):(\d{2})}{$2/$3/$1}; # reformat for setfile + $cmd = "/usr/bin/setfile -d '${val}' '${f}'"; + } elsif ($tag eq 'MDItemUserTags') { + # (tested with "tag" version 0.9.0) + ($f = $file) =~ s/'/'\\''/g; + my @vals = $et->GetNewValue($nvHash); + if ($overwrite < 0 and @{$$nvHash{DelValue}}) { + # delete specified tags + my @dels = @{$$nvHash{DelValue}}; + s/'/'\\''/g foreach @dels; + my $del = join ',', @dels; + $err = system "/usr/local/bin/tag -r '${del}' '${f}'>/dev/null 2>&1"; + unless ($err) { + $et->VerboseValue("- $tag", $del); + $result = 1; + undef $err if @vals; # more to do if there are tags to add + } + } + unless (defined $err) { + # add new tags, or overwrite or delete existing tags + s/'/'\\''/g foreach @vals; + my $opt = $overwrite > 0 ? '-s' : '-a'; + $val = @vals ? join(',', @vals) : ''; + $cmd = "/usr/local/bin/tag $opt '${val}' '${f}'"; + $et->VPrint(1," - $tag = (all)\n") if $overwrite > 0; + undef $val if $val eq ''; + } + } elsif ($tag eq 'XAttrQuarantine') { + ($f = $file) =~ s/'/'\\''/g; + $cmd = "/usr/bin/xattr -d com.apple.quarantine '${f}'"; + $silentErr = 256; # (will get this error if attribute doesn't exist) + } else { + ($f = $file) =~ s/(["\\])/\\$1/g; # escape necessary characters for script + $f =~ s/'/'"'"'/g; + if ($tag eq 'MDItemFinderComment') { + # (write finder comment using osascript instead of xattr + # because it is more work to construct the necessary bplist) + $val = '' unless defined $val; # set to empty string instead of deleting + $v = $et->Encode($val, 'UTF8'); + $v =~ s/(["\\])/\\$1/g; + $v =~ s/'/'"'"'/g; + $attr = 'comment'; + } else { # $tag eq 'MDItemFSLabel' + $v = $val ? 8 - $val : 0; # convert from label to label index (0 for no label) + $attr = 'label index'; + } + $cmd = qq(/usr/bin/osascript -e 'set fp to POSIX file "$f" as alias' -e \\ + 'tell application "Finder" to set $attr of file fp to "$v"'); + } + if (defined $cmd) { + $err = system $cmd . '>/dev/null 2>&1'; # (pipe all output to /dev/null) + } + if (not $err) { + $et->VerboseValue("+ $tag", $val) if defined $val; + $result = 1; + } elsif (not $silentErr or $err != $silentErr) { + $cmd =~ s/ .*//s; + $et->Warn(qq{Error $err running "$cmd" to set $tag}); + $result = -1 unless $result; + } + } + return $result; +} + +#------------------------------------------------------------------------------ +# Extract MacOS metadata item tags +# Inputs: 0) ExifTool object ref, 1) file name +sub ExtractMDItemTags($$) +{ + local $_; + my ($et, $file) = @_; + my ($fn, $tag, $val, $tmp); + + ($fn = $file) =~ s/([`"\$\\])/\\$1/g; # escape necessary characters + $et->VPrint(0, '(running mdls)'); + my @mdls = `/usr/bin/mdls "$fn" 2> /dev/null`; # get MacOS metadata + if ($? or not @mdls) { + $et->Warn('Error running "mdls" to extract MDItem tags'); + return; + } + my $tagTablePtr = GetTagTable('Image::ExifTool::MacOS::MDItem'); + $$et{INDENT} .= '| '; + $et->VerboseDir('MDItem'); + foreach (@mdls) { + chomp; + if (ref $val ne 'ARRAY') { + s/^k?(\w+)\s*= // or next; + $tag = $1; + $_ eq '(' and $val = [ ], next; # (start of a list) + $_ = '' if $_ eq '(null)'; + s/^"// and s/"$//; # remove quotes if they exist + $val = $_; + } elsif ($_ eq ')') { # (end of a list) + $_ = $$val[0]; + next unless defined $_; + } else { + # add item to list + s/^ //; # remove leading spaces + s/,$//; # remove trailing comma + $_ = '' if $_ eq '(null)'; + s/^"// and s/"$//; # remove quotes if they exist + s/\\"/"/g; # un-escape quotes + $_ = $et->Decode($_, 'UTF8'); + push @$val, $_; + next; + } + # add to Extra tags if not done already + unless ($$tagTablePtr{$tag}) { + # check for a date/time format + my %tagInfo; + %tagInfo = ( + Groups => { 2 => 'Time' }, + ValueConv => \&MDItemLocalTime, + PrintConv => '$self->ConvertDateTime($val)', + ) if /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/; + # change tags like "com_apple_mail_xxx" to "AppleMailXxx" + ($tmp = $tag) =~ s/^com_//; # remove leading "com_" + $tmp =~ s/_([a-z])/\u$1/g; # use CamelCase + $tagInfo{Name} = Image::ExifTool::MakeTagName($tmp); + $tagInfo{List} = 1 if ref $val eq 'ARRAY'; + $tagInfo{Groups}{2} = 'Audio' if $tag =~ /Audio/; + $tagInfo{Groups}{2} = 'Author' if $tag =~ /(Copyright|Author)/; + $et->VPrint(0, " [adding $tag]\n"); + AddTagToTable($tagTablePtr, $tag, \%tagInfo); + } + $val = $et->Decode($val, 'UTF8') unless ref $val; + $et->HandleTag($tagTablePtr, $tag, $val); + undef $val; + } + $$et{INDENT} =~ s/\| $//; +} + + +#------------------------------------------------------------------------------ +# Read MacOS XAttr value +# Inputs: 0) ExifTool object ref, 1) file name +sub ReadXAttrValue($$$$) +{ + my ($et, $tagTablePtr, $tag, $val) = @_; + # add to our table if necessary + unless ($$tagTablePtr{$tag}) { + my $name; + # generate tag name from attribute name + if ($tag =~ /^com\.apple\.(.*)$/) { + ($name = $1) =~ s/^metadata:_?k//; + $name =~ s/^metadata:(com_)?//; + } else { + $name = $tag; + } + $name =~ s/[.:_]([a-z])/\U$1/g; + $name = 'XAttr' . ucfirst $name; + my %tagInfo = ( Name => $name ); + $tagInfo{Groups} = { 2 => 'Time' } if $tag=~/Date$/; + $et->VPrint(0, " [adding $tag]\n"); + AddTagToTable($tagTablePtr, $tag, \%tagInfo); + } + if ($val =~ /^bplist0/) { + my %dirInfo = ( DataPt => \$val ); + require Image::ExifTool::PLIST; + if (Image::ExifTool::PLIST::ProcessBinaryPLIST($et, \%dirInfo, $tagTablePtr)) { + return undef if ref $dirInfo{Value} eq 'HASH'; + $val = $dirInfo{Value} + } else { + $et->Warn("Error decoding $$tagTablePtr{$tag}{Name}"); + return undef; + } + } + if (not ref $val and ($val =~ /\0/ or length($val) > 200) or $tag eq 'XAttrMDLabel') { + my $buff = $val; + $val = \$buff; + } + return $val; +} + +#------------------------------------------------------------------------------ +# Read MacOS extended attribute tags using 'xattr' utility +# Inputs: 0) ExifTool object ref, 1) file name +sub ExtractXAttrTags($$) +{ + local $_; + my ($et, $file) = @_; + my ($fn, $tag, $val, $warn); + + ($fn = $file) =~ s/([`"\$\\])/\\$1/g; # escape necessary characters + $et->VPrint(0, '(running xattr)'); + my @xattr = `/usr/bin/xattr -lx "$fn" 2> /dev/null`; # get MacOS extended attributes + if ($? or not @xattr) { + $? and $et->Warn('Error running "xattr" to extract XAttr tags'); + return; + } + my $tagTablePtr = GetTagTable('Image::ExifTool::MacOS::XAttr'); + $$et{INDENT} .= '| '; + $et->VerboseDir('XAttr'); + push @xattr, ''; # (for a list terminator) + foreach (@xattr) { + chomp; + if (s/^[\dA-Fa-f]{8}//) { + $tag or $warn = 1, next; + s/\|.*//; + tr/ //d; + (/[^\dA-Fa-f]/ or length($_) & 1) and $warn = 2, next; + $val = '' unless defined $val; + $val .= pack('H*', $_); + next; + } elsif ($tag and defined $val) { + $val = ReadXAttrValue($et, $tagTablePtr, $tag, $val); + $et->HandleTag($tagTablePtr, $tag, $val) if defined $val; + undef $tag; + undef $val; + } + next unless length; + s/:$// or $warn = 3, next; # attribute name must have trailing ":" + defined $val and $warn = 4, undef $val; + # remove random ID after kMDLabel in tag ID + ($tag = $_) =~ s/^com.apple.metadata:kMDLabel_.*/com.apple.metadata:kMDLabel/s; + } + $warn and $et->Warn(qq{Error $warn parsing "xattr" output}); + $$et{INDENT} =~ s/\| $//; +} + +#------------------------------------------------------------------------------ +# Extract MacOS file creation date/time +# Inputs: 0) ExifTool object ref, 1) file name +sub GetFileCreateDate($$) +{ + local $_; + my ($et, $file) = @_; + my ($fn, $tag, $val, $tmp); + + ($fn = $file) =~ s/([`"\$\\])/\\$1/g; # escape necessary characters + $et->VPrint(0, '(running stat)'); + my $time = `/usr/bin/stat -f '%SB' -t '%Y:%m:%d %H:%M:%S%z' "$fn" 2> /dev/null`; + if ($? or not $time or $time !~ s/([-+]\d{2})(\d{2})\s*$/$1:$2/) { + $et->Warn('Error running "stat" to extract FileCreateDate'); + return; + } + $$et{SET_GROUP1} = 'MacOS'; + $et->FoundTag(FileCreateDate => $time); + delete $$et{SET_GROUP1}; +} + +#------------------------------------------------------------------------------ +# Read ATTR metadata from "._" file +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Return: 1 on success +# (ref https://www.swiftforensics.com/2018/11/the-dot-underscore-file-format.html) +sub ProcessATTR($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $dataLen = length $$dataPt; + + $dataLen >= 58 and $$dataPt =~ /^.{34}ATTR/s or $et->Warn('Invalid ATTR header'), return 0; + my $entries = Get32u($dataPt, 66); + $et->VerboseDir('ATTR', $entries); + # (Note: The RAF is not in $dirInfo because it would break RSRC reading -- + # the RSCR block uses relative offsets, while the ATTR block uses absolute! grrr!) + my $raf = $$et{RAF}; + my $pos = 70; # first entry is after ATTR header + my $i; + for ($i=0; $i<$entries; ++$i) { + $pos + 12 > $dataLen and $et->Warn('Truncated ATTR entry'), last; + my $off = Get32u($dataPt, $pos); + my $len = Get32u($dataPt, $pos + 4); + my $n = Get8u($dataPt, $pos + 10); # number of characters in tag name + $pos + 11 + $n > $dataLen and $et->Warn('Truncated ATTR name'), last; + $off -= $dataPos; # convert to relative offset (grrr!) + $off < 0 or $off > $dataLen and $et->Warn('Invalid ATTR offset'), last; + my $tag = substr($$dataPt, $pos + 11, $n); + $tag =~ s/\0+$//; # remove null terminator + # remove random ID after kMDLabel in tag ID + $tag =~ s/^com.apple.metadata:kMDLabel_.*/com.apple.metadata:kMDLabel/s; + $off + $len > $dataLen and $et->Warn('Truncated ATTR value'), last; + my $val = ReadXAttrValue($et, $tagTablePtr, $tag, substr($$dataPt, $off, $len)); + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $off, + Size => $len, + ) if defined $val; + $pos += (11 + $n + 3) & -4; # step to next entry (on even 4-byte boundary) + } + return 1; +} + +#------------------------------------------------------------------------------ +# Read information from a MacOS "._" sidecar file +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid "._" file +# (ref https://www.swiftforensics.com/2018/11/the-dot-underscore-file-format.html) +sub ProcessMacOS($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($hdr, $buff, $i); + + return 0 unless $raf->Read($hdr, 26) == 26 and $hdr =~ /^\0\x05\x16\x07\0(.)\0\0Mac OS X /s; + my $ver = ord $1; + # (extension may be anything, so just echo back the incoming file extension if it exists) + $et->SetFileType(undef, undef, $$et{FILE_EXT}); + $ver == 2 or $et->Warn("Unsupported file version $ver"), return 1; + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::MacOS::Main'); + my $entries = Get16u(\$hdr, 0x18); + $et->VerboseDir('MacOS', $entries); + $raf->Read($hdr, $entries * 12) == $entries * 12 or $et->Warn('Truncated header'), return 1; + for ($i=0; $i<$entries; ++$i) { + my $pos = $i * 12; + my $tag = Get32u(\$hdr, $pos); + my $off = Get32u(\$hdr, $pos + 4); + my $len = Get32u(\$hdr, $pos + 8); + $len > 100000000 and $et->Warn('Record size too large'), last; + $raf->Seek($off,0) and $raf->Read($buff,$len) == $len or $et->Warn('Truncated record'), last; + $et->HandleTag($tagTablePtr, $tag, undef, DataPt => \$buff, DataPos => $off, Index => $i); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::MacOS - Read/write MacOS system tags + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract +MDItem* and XAttr* tags on MacOS systems using the "mdls" and "xattr" +utilities respectively. It also reads metadata directly from the MacOS "_." +sidecar files that are used on some filesystems to store file attributes. +Writable tags use "xattr", "setfile" or "osascript" for writing. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/MacOS Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/MakerNotes.pm b/lib/Image/ExifTool/MakerNotes.pm new file mode 100644 index 0000000..b00081b --- /dev/null +++ b/lib/Image/ExifTool/MakerNotes.pm @@ -0,0 +1,1841 @@ +#------------------------------------------------------------------------------ +# File: MakerNotes.pm +# +# Description: Read and write EXIF maker notes +# +# Revisions: 11/11/2004 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::MakerNotes; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess); +use Image::ExifTool::Exif; + +sub ProcessUnknown($$$); +sub ProcessUnknownOrPreview($$$); +sub ProcessCanon($$$); +sub ProcessGE2($$$); +sub ProcessKodakPatch($$$); +sub WriteUnknownOrPreview($$$); +sub FixLeicaBase($$;$); + +$VERSION = '2.11'; + +my $debug; # set to 1 to enable debugging code + +# conditional list of maker notes +# Notes: +# - This is NOT a normal tag table! +# - All byte orders are now specified because we can now +# write maker notes into a file with different byte ordering! +# - Put these in alphabetical order to make TagNames documentation nicer. +@Image::ExifTool::MakerNotes::Main = ( + # decide which MakerNotes to use (based on makernote header and camera make/model) + { + Name => 'MakerNoteApple', + Condition => '$$valPt =~ /^Apple iOS\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Apple::Main', + Start => '$valuePtr + 14', + Base => '$start - 14', + ByteOrder => 'Unknown', + }, + }, + { + # this maker notes starts with a standard TIFF header at offset 0x0a + # (must check Nikon signature first because Nikon Capture NX can generate + # NEF images containing Nikon maker notes from JPEG images of any camera model) + Name => 'MakerNoteNikon', + Condition => '$$valPt=~/^Nikon\x00\x02/', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::Main', + Start => '$valuePtr + 18', + Base => '$start - 8', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteCanon', + # (starts with an IFD) + Condition => '$$self{Make} =~ /^Canon/', + SubDirectory => { + TagTable => 'Image::ExifTool::Canon::Main', + ProcessProc => \&ProcessCanon, + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteCasio', + # do negative lookahead assertion just to get tags + # in a nice order for documentation + # (starts with an IFD) + Condition => '$$self{Make}=~/^CASIO/ and $$valPt!~/^(QVC|DCI)\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Casio::Main', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteCasio2', + # (starts with "QVC\0" [Casio] or "DCI\0" [Concord]) + # (also found in AVI and MOV videos) + Condition => '$$valPt =~ /^(QVC|DCI)\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Casio::Type2', + Start => '$valuePtr + 6', + ByteOrder => 'Unknown', + FixBase => 1, # necessary for AVI and MOV videos + }, + }, + { + Name => 'MakerNoteDJIInfo', + Condition => '$$valPt =~ /^\[ae_dbg_info:/', + SubDirectory => { TagTable => 'Image::ExifTool::DJI::Info' }, + }, + { + Name => 'MakerNoteDJI', + Condition => '$$self{Make} eq "DJI" and $$valPt !~ /^...\@AMBA/s', + SubDirectory => { + TagTable => 'Image::ExifTool::DJI::Main', + Start => '$valuePtr', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteFLIR', + # (starts with IFD, Make is 'FLIR Systems AB' or 'FLIR Systems') + Condition => '$$self{Make} =~ /^FLIR Systems/', + SubDirectory => { + TagTable => 'Image::ExifTool::FLIR::Main', + Start => '$valuePtr', + ByteOrder => 'Unknown', + }, + }, + { + # The Fuji maker notes use a structure similar to a self-contained + # TIFF file, but with "FUJIFILM" instead of the standard TIFF header + Name => 'MakerNoteFujiFilm', + # (starts with "FUJIFILM" -- also used by some Leica, Minolta and Sharp models) + # (GE FujiFilm models start with "GENERALE") + Condition => '$$valPt =~ /^(FUJIFILM|GENERALE)/', + SubDirectory => { + TagTable => 'Image::ExifTool::FujiFilm::Main', + # there is an 8-byte maker tag (FUJIFILM) we must skip over + OffsetPt => '$valuePtr+8', + # the pointers are relative to the subdirectory start + # (before adding the offsetPt) - PH + Base => '$start', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'MakerNoteGE', + Condition => '$$valPt =~ /^GE(\0\0|NIC\0)/', + SubDirectory => { + TagTable => 'Image::ExifTool::GE::Main', + Start => '$valuePtr + 18', + FixBase => 1, + AutoFix => 1, + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteGE2', + Condition => '$$valPt =~ /^GE\x0c\0\0\0\x16\0\0\0/', + # Note: we will get a "Maker notes could not be parsed" warning when writing + # these maker notes because they aren't currently supported for writing + SubDirectory => { + TagTable => 'Image::ExifTool::FujiFilm::Main', + ProcessProc => \&ProcessGE2, + Start => '$valuePtr + 12', + Base => '$start - 6', + ByteOrder => 'LittleEndian', + # hard patch for crazy offsets + FixOffsets => '$valuePtr -= 210 if $tagID >= 0x1303', + }, + }, + { + Name => 'MakerNoteHasselblad', + Condition => '$$self{Make} eq "Hasselblad"', + SubDirectory => { + TagTable => 'Image::ExifTool::Unknown::Main', + ByteOrder => 'Unknown', + Start => '$valuePtr', + Base => 0, # (avoids warnings since maker notes are not self-contained) + }, + # 0x0011 - sensor code (ref IB) + # 0x0012 - camera model id? + # 0x0015 - camera model name + # 0x0016 - coating code (ref IB) + }, + # (the GE X5 has really messed up EXIF-like maker notes starting with + # "GENIC\x0c\0" --> currently not decoded) + { + Name => 'MakerNoteHP', # PhotoSmart 720 (also Vivitar 3705, 3705B and 3715) + Condition => '$$valPt =~ /^(Hewlett-Packard|Vivitar)/', + SubDirectory => { + TagTable => 'Image::ExifTool::HP::Main', + ProcessProc => \&ProcessUnknown, + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteHP2', # PhotoSmart E427 + # (this type of maker note also used by BenQ, Mustek, Sanyo, Traveler and Vivitar) + Condition => '$$valPt =~ /^610[\0-\4]/', + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::HP::Type2', + Start => '$valuePtr', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'MakerNoteHP4', # PhotoSmart M627 + Condition => '$$valPt =~ /^IIII\x04\0/', + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::HP::Type4', + Start => '$valuePtr', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'MakerNoteHP6', # PhotoSmart M425, M525 and M527 + Condition => '$$valPt =~ /^IIII\x06\0/', + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::HP::Type6', + Start => '$valuePtr', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'MakerNoteISL', # (used in Samsung GX20 samples) + Condition => '$$valPt =~ /^ISLMAKERNOTE000\0/', + # this maker notes starts with a TIFF-like header at offset 0x10 + SubDirectory => { + TagTable => 'Image::ExifTool::Unknown::Main', + Start => '$valuePtr + 24', + Base => '$start - 8', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteJVC', + Condition => '$$valPt=~/^JVC /', + SubDirectory => { + TagTable => 'Image::ExifTool::JVC::Main', + Start => '$valuePtr + 4', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteJVCText', + Condition => '$$self{Make}=~/^(JVC|Victor)/ and $$valPt=~/^VER:/', + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::JVC::Text', + }, + }, + { + Name => 'MakerNoteKodak1a', + Condition => '$$self{Make}=~/^EASTMAN KODAK/ and $$valPt=~/^KDK INFO/', + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Main', + Start => '$valuePtr + 8', + ByteOrder => 'BigEndian', + }, + }, + { + Name => 'MakerNoteKodak1b', + Condition => '$$self{Make}=~/^EASTMAN KODAK/ and $$valPt=~/^KDK/', + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Main', + Start => '$valuePtr + 8', + ByteOrder => 'LittleEndian', + }, + }, + { + # used by various Kodak, HP, Pentax and Minolta models + Name => 'MakerNoteKodak2', + Condition => q{ + $$valPt =~ /^.{8}Eastman Kodak/s or + $$valPt =~ /^\x01\0[\0\x01]\0\0\0\x04\0[a-zA-Z]{4}/ + }, + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type2', + ByteOrder => 'BigEndian', + }, + }, + { + # not much to key on here, but we know the + # upper byte of the year should be 0x07: + Name => 'MakerNoteKodak3', + Condition => q{ + $$self{Make} =~ /^EASTMAN KODAK/ and + $$valPt =~ /^(?!MM|II).{12}\x07/s and + $$valPt !~ /^(MM|II|AOC)/ + }, + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type3', + ByteOrder => 'BigEndian', + }, + }, + { + Name => 'MakerNoteKodak4', + Condition => q{ + $$self{Make} =~ /^Eastman Kodak/ and + $$valPt =~ /^.{41}JPG/s and + $$valPt !~ /^(MM|II|AOC)/ + }, + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type4', + ByteOrder => 'BigEndian', + }, + }, + { + Name => 'MakerNoteKodak5', + Condition => q{ + $$self{Make}=~/^EASTMAN KODAK/ and + ($$self{Model}=~/CX(4200|4230|4300|4310|6200|6230)/ or + # try to pick up similar models we haven't tested yet + $$valPt=~/^\0(\x1a\x18|\x3a\x08|\x59\xf8|\x14\x80)\0/) + }, + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type5', + ByteOrder => 'BigEndian', + }, + }, + { + Name => 'MakerNoteKodak6a', + Condition => q{ + $$self{Make}=~/^EASTMAN KODAK/ and + $$self{Model}=~/DX3215/ + }, + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type6', + ByteOrder => 'BigEndian', + }, + }, + { + Name => 'MakerNoteKodak6b', + Condition => q{ + $$self{Make}=~/^EASTMAN KODAK/ and + $$self{Model}=~/DX3700/ + }, + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type6', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'MakerNoteKodak7', + # look for something that looks like a serial number + # (confirmed serial numbers have the format KXXXX########, but we also + # accept other strings from sample images that may be serial numbers) + Condition => q{ + $$self{Make}=~/Kodak/i and + $$valPt =~ /^[CK][A-Z\d]{3} ?[A-Z\d]{1,2}\d{2}[A-Z\d]\d{4}[ \0]/ + }, + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type7', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'MakerNoteKodak8a', + # IFD-format maker notes: look for reasonable number of + # entries and check format and count of first IFD entry + Condition => q{ + $$self{Make}=~/Kodak/i and + ($$valPt =~ /^\0[\x02-\x7f]..\0[\x01-\x0c]\0\0/s or + $$valPt =~ /^[\x02-\x7f]\0..[\x01-\x0c]\0..\0\0/s) + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type8', + ProcessProc => \&ProcessUnknown, + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteKodak8b', + # these maker notes have an extra 2 bytes after the entry count + # (this is handled by the patch). Also, the IFD uses a Format 13, + # which is some 2-byte format (not Float, as decoded by ExifTool) + # - written by the PixPro AZ251, AZ361, AZ262, AZ521 + Condition => q{ + $$self{Make}=~/Kodak/i and + $$valPt =~ /^MM\0\x2a\0\0\0\x08\0.\0\0/ + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type8', + ProcessProc => \&ProcessKodakPatch, + ByteOrder => 'BigEndian', + Start => '$valuePtr + 8', + Base => '$start - 8', + }, + }, + { + Name => 'MakerNoteKodak8c', + # TIFF-format maker notes + Condition => q{ + $$self{Make}=~/Kodak/i and + $$valPt =~ /^(MM\0\x2a\0\0\0\x08|II\x2a\0\x08\0\0\0)/ + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type8', + ProcessProc => \&ProcessUnknown, + ByteOrder => 'Unknown', + Start => '$valuePtr + 8', + Base => '$start - 8', + }, + }, + { + Name => 'MakerNoteKodak9', + # test header and Kodak:DateTimeOriginal + Condition => '$$valPt =~ m{^IIII[\x02\x03]\0.{14}\d{4}/\d{2}/\d{2} }s', + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type9', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'MakerNoteKodak10', + # yet another type of Kodak IFD-format maker notes: + # this type begins with a byte order indicator, + # followed immediately by the IFD + Condition => q{ + $$self{Make}=~/Kodak/i and + $$valPt =~ /^(MM\0[\x02-\x7f]|II[\x02-\x7f]\0)/ + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type10', + ProcessProc => \&ProcessUnknown, + ByteOrder => 'Unknown', + Start => '$valuePtr + 2', + }, + }, + { + Name => 'MakerNoteKodak11', + # these maker notes have a 4-byte entry count + # - written by the PixPro S-1 (Note: Make is "JK Imaging, Ltd.", so check Model for "Kodak") + Condition => q{ + $$self{Model}=~/(Kodak|PixPro)/i and + $$valPt =~ /^II\x2a\0\x08\0\0\0.\0\0\0/s + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type11', + ProcessProc => \&ProcessKodakPatch, + ByteOrder => 'LittleEndian', + Start => '$valuePtr + 8', + Base => '$start - 8', + }, + }, + { + Name => 'MakerNoteKodak12', + # these maker notes have a 4-byte entry count + # - written by the PixPro AZ901 (Note: Make is "JK Imaging, Ltd.", so check Model for "Kodak") + Condition => q{ + $$self{Model}=~/(Kodak|PixPro)/i and + $$valPt =~ /^MM\0\x2a\0\0\0\x08\0\0\0./s + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Type11', + ProcessProc => \&ProcessKodakPatch, + ByteOrder => 'BigEndian', + Start => '$valuePtr + 8', + Base => '$start - 8', + }, + }, + { + Name => 'MakerNoteKodakUnknown', + Condition => '$$self{Make}=~/Kodak/i and $$valPt!~/^AOC\0/', + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::Unknown', + ByteOrder => 'BigEndian', + }, + }, + { + Name => 'MakerNoteKyocera', + # (starts with "KYOCERA") + Condition => '$$valPt =~ /^KYOCERA/', + SubDirectory => { + TagTable => 'Image::ExifTool::Unknown::Main', + Start => '$valuePtr + 22', + Base => '$start + 2', + EntryBased => 1, + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteMinolta', + Condition => q{ + $$self{Make}=~/^(Konica Minolta|Minolta)/i and + $$valPt !~ /^(MINOL|CAMER|MLY0|KC|\+M\+M|\xd7)/ + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::Main', + ByteOrder => 'Unknown', + }, + }, + { + # the DiMAGE E323 (MINOL) and E500 (CAMER), and some models + # of Mustek, Pentax, Ricoh and Vivitar (CAMER). + Name => 'MakerNoteMinolta2', + Condition => '$$valPt =~ /^(MINOL|CAMER)\0/ and $$self{OlympusCAMER} = 1', + SubDirectory => { + # these models use Olympus tags in the range 0x200-0x221 plus 0xf00 + TagTable => 'Image::ExifTool::Olympus::Main', + Start => '$valuePtr + 8', + ByteOrder => 'Unknown', + }, + }, + { + # /^MLY0/ - DiMAGE G400, G500, G530, G600 + # /^KC/ - Revio KD-420Z, DiMAGE E203 + # /^+M+M/ - DiMAGE E201 + # /^\xd7/ - DiMAGE RD3000 + Name => 'MakerNoteMinolta3', + Condition => '$$self{Make} =~ /^(Konica Minolta|Minolta)/i', + Binary => 1, + Notes => 'not EXIF-based', + }, + { + Name => 'MakerNoteMotorola', + Condition => '$$valPt=~/^MOT\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Motorola::Main', + Start => '$valuePtr + 8', + Base => '$start - 8', + ByteOrder => 'Unknown', + }, + }, + { + # older Nikon maker notes + Name => 'MakerNoteNikon2', + Condition => '$$valPt=~/^Nikon\x00\x01/', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::Type2', + Start => '$valuePtr + 8', + ByteOrder => 'LittleEndian', + }, + }, + { + # headerless Nikon maker notes + Name => 'MakerNoteNikon3', + Condition => '$$self{Make}=~/^NIKON/i', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::Main', + ByteOrder => 'Unknown', # most are little-endian, but D1 is big + }, + }, + { + Name => 'MakerNoteNintendo', + # (starts with an IFD) + Condition => '$$self{Make} eq "Nintendo"', + SubDirectory => { + TagTable => 'Image::ExifTool::Nintendo::Main', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteOlympus', + # (if Make is 'SEIKO EPSON CORP.', starts with "EPSON\0") + # (if Make is 'OLYMPUS OPTICAL CO.,LTD' or 'OLYMPUS CORPORATION', + # starts with "OLYMP\0") + Condition => '$$valPt =~ /^(OLYMP|EPSON)\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::Main', + Start => '$valuePtr + 8', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteOlympus2', + # new Olympus maker notes start with "OLYMPUS\0" + Condition => '$$valPt =~ /^OLYMPUS\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::Main', + Start => '$valuePtr + 12', + Base => '$start - 12', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteOlympus3', + # new Olympus maker notes start with "OLYMPUS\0" + Condition => '$$valPt =~ /^OM SYSTEM\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::Main', + Start => '$valuePtr + 16', + Base => '$start - 16', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteLeica', + # (starts with "LEICA\0\0\0") + Condition => '$$self{Make} eq "LEICA"', + SubDirectory => { + # many Leica models use the same format as Panasonic + TagTable => 'Image::ExifTool::Panasonic::Main', + Start => '$valuePtr + 8', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteLeica2', # used by the M8 + # (starts with "LEICA\0\0\0") + Condition => '$$self{Make} =~ /^Leica Camera AG/ and $$valPt =~ /^LEICA\0\0\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Leica2', + # (the offset base is different in JPEG and DNG images, but we + # can copy makernotes from one to the other, so we need special + # logic to decide which base to apply) + ProcessProc => \&FixLeicaBase, + Start => '$valuePtr + 8', + Base => '$start', # (- 8 for DNG images!) + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteLeica3', # used by the R8 and R9 + # (starts with IFD) + Condition => q{ + $$self{Make} =~ /^Leica Camera AG/ and $$valPt !~ /^LEICA/ and + $$self{Model} ne "S2" and $$self{Model} ne "LEICA M (Typ 240)" + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Leica3', + Start => '$valuePtr', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteLeica4', # used by the M9/M-Monochrom + # (M9 and M Monochrom start with "LEICA0\x03\0") + Condition => '$$self{Make} =~ /^Leica Camera AG/ and $$valPt =~ /^LEICA0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Leica4', + Start => '$valuePtr + 8', + Base => '$start - 8', # (yay! Leica fixed the M8 problem) + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteLeica5', # used by the X1/X2/X VARIO/T/X-U + # (X1 starts with "LEICA\0\x01\0", Make is "LEICA CAMERA AG") + # (X2 starts with "LEICA\0\x05\0", Make is "LEICA CAMERA AG") + # (X VARIO starts with "LEICA\0\x04\0", Make is "LEICA CAMERA AG") + # (T (Typ 701) starts with "LEICA\0\0x6", Make is "LEICA CAMERA AG") + # (X (Typ 113) starts with "LEICA\0\0x7", Make is "LEICA CAMERA AG") + # (X-U (Typ 113) starts with "LEICA\0\x10\0", Make is "LEICA CAMERA AG") + Condition => '$$valPt =~ /^LEICA\0[\x01\x04\x05\x06\x07\x10\x1a]\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Leica5', + Start => '$valuePtr + 8', + Base => '$start - 8', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteLeica6', # used by the S2, M (Typ 240) and S (Typ 006) + # (starts with "LEICA\0\x02\xff", Make is "Leica Camera AG", but test the + # model names separately because the maker notes data may not be loaded + # at the time this is tested if they are in a JPEG trailer. Also, this + # header is used by the M Monochrom (Type 246), with different offsets.) + Condition => q{ + ($$self{Make} eq 'Leica Camera AG' and ($$self{Model} eq 'S2' or + $$self{Model} eq 'LEICA M (Typ 240)' or $$self{Model} eq 'LEICA S (Typ 006)')) + }, + DataTag => 'LeicaTrailer', # (generates fixup name for this tag) + LeicaTrailer => 1, # flag to special-case this tag in the Exif code + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Leica6', + Start => '$valuePtr + 8', + ByteOrder => 'Unknown', + # NOTE: Leica uses absolute file offsets when this maker note is stored + # as a JPEG trailer -- this case is handled by ProcessLeicaTrailer in + # Panasonic.pm, and any "Base" defined here is ignored for this case. + # ExifTool may also create S2/M maker notes inside the APP1 segment when + # copying from other files, and for this the normal EXIF offsets are used, + # Base should not be defined! + }, + }, + { + Name => 'MakerNoteLeica7', # used by the M Monochrom (Typ 246) + # (starts with "LEICA\0\x02\xff", Make is "Leica Camera AG") + Condition => '$$valPt =~ /^LEICA\0\x02\xff/', + DataTag => 'LeicaTrailer', # (generates fixup name for this tag) + LeicaTrailer => 1, # flag to special-case this tag in the Exif code + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Leica6', + Start => '$valuePtr + 8', + ByteOrder => 'Unknown', + Base => '-$base', # uses absolute file offsets (not based on TIFF header offset) + }, + }, + { + Name => 'MakerNoteLeica8', # used by the Q (Type 116) + # (Q (Typ 116) starts with "LEICA\0\x08\0", Make is "LEICA CAMERA AG") + # (SL (Typ 601) and CL start with "LEICA\0\x09\0", Make is "LEICA CAMERA AG") + Condition => '$$valPt =~ /^LEICA\0[\x08\x09]\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Leica5', + Start => '$valuePtr + 8', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteLeica9', # used by the M10/S + # (M10 and S start with "LEICA0\x02\0") + Condition => '$$self{Make} =~ /^Leica Camera AG/ and $$valPt =~ /^LEICA\0\x02\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Leica9', + Start => '$valuePtr + 8', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteLeica10', # used by the D-Lux7 + Condition => '$$valPt =~ /^LEICA CAMERA AG\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Main', + Start => '$valuePtr + 18', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNotePanasonic', + # (starts with "Panasonic\0") + Condition => '$$valPt=~/^Panasonic/ and $$self{Model} ne "DC-FT7"', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Main', + Start => '$valuePtr + 12', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNotePanasonic2', + # (starts with "Panasonic\0") + Condition => '$$self{Make}=~/^Panasonic/ and $$valPt=~/^MKE/', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Type2', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'MakerNotePanasonic3', # (DC-FT7) + # (starts with "Panasonic\0") + Condition => '$$valPt=~/^Panasonic/', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Main', + Start => '$valuePtr + 12', + Base => 12, # crazy! + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNotePentax', + # (starts with "AOC\0", but so does MakerNotePentax3) + # (also used by some Samsung models) + Condition => q{ + $$valPt=~/^AOC\0/ and + $$self{Model} !~ /^PENTAX Optio ?[34]30RS\s*$/ + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::Main', + # process as Unknown maker notes because the start offset and + # byte ordering are so variable + ProcessProc => \&ProcessUnknown, + # offsets can be totally whacky for Pentax maker notes, + # so attempt to fix the offset base if possible + FixBase => 1, + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNotePentax2', + # (starts with an IFD) + # Casio-like maker notes used only by the Optio 330 and 430 + Condition => '$$self{Make}=~/^Asahi/ and $$valPt!~/^AOC\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::Type2', + ProcessProc => \&ProcessUnknown, + FixBase => 1, + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNotePentax3', + # (starts with "AOC\0", like the more common Pentax maker notes) + # Casio maker notes used only by the Optio 330RS and 430RS + Condition => '$$self{Make}=~/^Asahi/', + SubDirectory => { + TagTable => 'Image::ExifTool::Casio::Type2', + ProcessProc => \&ProcessUnknown, + FixBase => 1, + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNotePentax4', + # (starts with 3 or 4 digits) + # HP2-like text-based maker notes used by Optio E20 + Condition => '$$self{Make}=~/^PENTAX/ and $$valPt=~/^\d{3}/', + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::Type4', + Start => '$valuePtr', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'MakerNotePentax5', + # (starts with "PENTAX \0") + # used by cameras such as the Q, Optio S1, RS1500 and WG-1 + Condition => '$$valPt=~/^PENTAX \0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::Main', + Start => '$valuePtr + 10', + Base => '$start - 10', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNotePentax6', + # (starts with "S1\0\0\0\0\0\0\x0c\0\0\0") + Condition => '$$valPt=~/^S1\0{6}\x0c\0{3}/', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::S1', + Start => '$valuePtr + 12', + Base => '$start - 12', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNotePhaseOne', + # Starts with: 'IIIITwaR' or 'IIIICwaR' (have seen both written by P25) + # (have also seen code which expects 'MMMMRawT') + Condition => q{ + return undef unless $$valPt =~ /^(IIII.waR|MMMMRaw.)/s; + $self->OverrideFileType($$self{TIFF_TYPE} = 'IIQ') if $count > 1000000; + return 1; + }, + NotIFD => 1, + IsPhaseOne => 1, # flag to rebuild these differently + SubDirectory => { TagTable => 'Image::ExifTool::PhaseOne::Main' }, + PutFirst => 1, # place immediately after TIFF header + }, + { + Name => 'MakerNoteReconyx', + Condition => q{ + $$valPt =~ /^\x01\xf1([\x02\x03]\x00)?/ and + ($1 or $$self{Make} eq "RECONYX") + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Reconyx::Main', + ByteOrder => 'Little-endian', + }, + }, + { + Name => 'MakerNoteReconyx2', + Condition => '$$valPt =~ /^RECONYXUF\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Reconyx::Type2', + ByteOrder => 'Little-endian', + }, + }, + { + Name => 'MakerNoteReconyx3', + Condition => '$$valPt =~ /^RECONYXH2\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Reconyx::Type3', + ByteOrder => 'Little-endian', + }, + }, + { + Name => 'MakerNoteRicohPentax', + # used by cameras such as the Ricoh GR III + Condition => '$$valPt=~/^RICOH\0(II|MM)/', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::Main', + Start => '$valuePtr + 8', + Base => '$start - 8', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteRicoh', + # (my test R50 image starts with " \x02\x01" - PH) + Condition => q{ + $$self{Make} =~ /^(PENTAX )?RICOH/ and + $$valPt =~ /^(Ricoh| |MM\0\x2a|II\x2a\0)/i and + $$valPt !~ /^(MM\0\x2a\0\0\0\x08\0.\0\0|II\x2a\0\x08\0\0\0.\0\0\0)/s and + $$self{Model} ne 'RICOH WG-M1' + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Ricoh::Main', + Start => '$valuePtr + 8', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteRicoh2', + # (the Ricoh HZ15 starts with "MM\0\x2a" and the Pentax XG-1 starts with "II\x2a\0", + # but an extra 2 bytes of padding after the IFD entry count prevents these from + # being processed as a standard IFD. Note that the offsets for the HZ15 are all + # zeros, but they seem to be mostly OK for the XG-1) + Condition => q{ + $$self{Make} =~ /^(PENTAX )?RICOH/ and ($$self{Model} eq 'RICOH WG-M1' or + $$valPt =~ /^(MM\0\x2a\0\0\0\x08\0.\0\0|II\x2a\0\x08\0\0\0.\0\0\0)/s) + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Ricoh::Type2', + Start => '$valuePtr + 8', + Base => '$start - 8', + ByteOrder => 'Unknown', + ProcessProc => \&ProcessKodakPatch, + }, + }, + { + Name => 'MakerNoteRicohText', + Condition => '$$self{Make}=~/^RICOH/', + NotIFD => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Ricoh::Text', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteSamsung1a', + # Samsung STMN maker notes WITHOUT PreviewImage + Condition => '$$valPt =~ /^STMN\d{3}.\0{4}/s', + Binary => 1, + Notes => 'Samsung "STMN" maker notes without PreviewImage', + }, + { + Name => 'MakerNoteSamsung1b', + # Samsung STMN maker notes WITH PreviewImage + Condition => '$$valPt =~ /^STMN\d{3}/', + SubDirectory => { + TagTable => 'Image::ExifTool::Samsung::Main', + }, + }, + { + Name => 'MakerNoteSamsung2', + # Samsung EXIF-format maker notes ( + Condition => q{ + uc $$self{Make} eq 'SAMSUNG' and ($$self{TIFF_TYPE} eq 'SRW' or + $$valPt=~/^(\0.\0\x01\0\x07\0{3}\x04|.\0\x01\0\x07\0\x04\0{3})0100/s) + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Samsung::Type2', + # Samsung is very inconsistent here, and uses absolute offsets for some + # models and relative offsets for others, so process as Unknown + ProcessProc => \&ProcessUnknown, + FixBase => 1, + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteSanyo', + # (starts with "SANYO\0") + Condition => '$$self{Make}=~/^SANYO/ and $$self{Model}!~/^(C4|J\d|S\d)\b/', + SubDirectory => { + TagTable => 'Image::ExifTool::Sanyo::Main', + Validate => '$val =~ /^SANYO/', + Start => '$valuePtr + 8', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteSanyoC4', + # The C4 offsets are wrong by 12, so they must be fixed + Condition => '$$self{Make}=~/^SANYO/ and $$self{Model}=~/^C4\b/', + SubDirectory => { + TagTable => 'Image::ExifTool::Sanyo::Main', + Validate => '$val =~ /^SANYO/', + Start => '$valuePtr + 8', + FixBase => 1, + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteSanyoPatch', + # The J1, J2, J4, S1, S3 and S4 offsets are completely screwy + Condition => '$$self{Make}=~/^SANYO/', + SubDirectory => { + TagTable => 'Image::ExifTool::Sanyo::Main', + Validate => '$val =~ /^SANYO/', + Start => '$valuePtr + 8', + ByteOrder => 'Unknown', + FixOffsets => 'Image::ExifTool::Sanyo::FixOffsets($valuePtr, $valEnd, $size, $tagID, $wFlag)', + }, + }, + { + Name => 'MakerNoteSigma', + Condition => q{ + return undef unless $$self{Make}=~/^(SIGMA|FOVEON)/; + # save version number in "MakerNoteSigmaVer" member variable + $$self{MakerNoteSigmaVer} = $$valPt=~/^SIGMA\0\0\0\0(.)/ ? ord($1) : -1; + return 1; + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Sigma::Main', + Validate => '$val =~ /^(SIGMA|FOVEON)/', + Start => '$valuePtr + 10', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteSony', + # (starts with "SONY DSC \0" or "SONY CAM \0") + # (TF1 starts with "\0\0SONY PIC\0") + # (Hasselblad models start with "VHAB \0") + Condition => '$$valPt=~/^(SONY (DSC|CAM|MOBILE)|\0\0SONY PIC\0|VHAB \0)/', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::Main', + Start => '$valuePtr + 12', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteSony2', + # (starts with "SONY PI\0" -- DSC-S650/S700/S750) + Condition => '$$valPt=~/^SONY PI\0/ and $$self{OlympusCAMER}=1', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::Main', + Start => '$valuePtr + 12', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteSony3', + # (starts with "PREMI\0" -- DSC-S45/S500) + Condition => '$$valPt=~/^(PREMI)\0/ and $$self{OlympusCAMER}=1', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::Main', + Start => '$valuePtr + 8', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteSony4', + # (starts with "SONY PIC\0" -- DSC-H200/J20/W370/W510, MHS-TS20) + Condition => '$$valPt=~/^SONY PIC\0/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::PIC' }, + }, + { + Name => 'MakerNoteSony5', # used in SR2 and ARW images + Condition => '$$self{Make}=~/^SONY/ and $$valPt!~/^\x01\x00/', + Condition => q{ + ($$self{Make}=~/^SONY/ or ($$self{Make}=~/^HASSELBLAD/ and + $$self{Model}=~/^(HV|Stellar|Lusso|Lunar)/)) and $$valPt!~/^\x01\x00/ + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::Main', + Start => '$valuePtr', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteSonyEricsson', + Condition => '$$valPt =~ /^SEMC MS\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::Ericsson', + Start => '$valuePtr + 20', + Base => '$start - 8', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteSonySRF', + Condition => '$$self{Make}=~/^SONY/', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::SRF', + Start => '$valuePtr', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MakerNoteUnknownText', + Condition => '$$valPt =~ /^[\x09\x0d\x0a\x20-\x7e]+\0*$/', + Notes => 'unknown text-based maker notes', + # show as binary if it is too long + ValueConv => 'length($val) > 64 ? \$val : $val', + ValueConvInv => '$val', + }, + { + Name => 'MakerNoteUnknownBinary', + # "LSI1\0" - SilverFast + Condition => '$$valPt =~ /^LSI1\0/', + Notes => 'unknown binary maker notes', + Binary => 1, + }, + { + Name => 'MakerNoteUnknown', + PossiblePreview => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::Unknown::Main', + ProcessProc => \&ProcessUnknownOrPreview, + WriteProc => \&WriteUnknownOrPreview, + ByteOrder => 'Unknown', + FixBase => 2, + }, + }, +); + +# insert writable properties so we can write our maker notes +my $tagInfo; +foreach $tagInfo (@Image::ExifTool::MakerNotes::Main) { + $$tagInfo{Writable} = 'undef'; + $$tagInfo{Format} = 'undef', # (make sure we don't convert this when reading) + $$tagInfo{WriteGroup} = 'ExifIFD'; + $$tagInfo{Groups} = { 1 => 'MakerNotes' }; + next unless $$tagInfo{SubDirectory}; + # make all SubDirectory tags block-writable + $$tagInfo{Binary} = 1, + $$tagInfo{MakerNotes} = 1; +} + +#------------------------------------------------------------------------------ +# Get normal offset of value data from end of maker note IFD +# Inputs: 0) ExifTool object reference +# Returns: Array: 0) relative flag (undef for no change) +# 1) normal offset from end of IFD to first value (empty if unknown) +# 2-N) other possible offsets used by some models +# Notes: Directory size should be validated before calling this routine +sub GetMakerNoteOffset($) +{ + my $et = shift; + # figure out where we expect the value data based on camera type + my $make = $$et{Make}; + my $model = $$et{Model}; + my ($relative, @offsets); + + # normally value data starts 4 bytes after end of directory, so this is the default. + # offsets of 0 and 4 are always allowed even if not specified, + # but the first offset specified is the one used when writing + if ($make =~ /^Canon/) { + push @offsets, ($model =~ /\b(20D|350D|REBEL XT|Kiss Digital N)\b/) ? 6 : 4; + # some Canon models (FV-M30, Optura50, Optura60) leave 24 unused bytes + # at the end of the IFD (2 spare IFD entries?) + push @offsets, 28 if $model =~ /\b(FV\b|OPTURA)/; + # some Canon PowerShot models leave 12 unused bytes + push @offsets, 16 if $model =~ /(PowerShot|IXUS|IXY)/; + } elsif ($make =~ /^CASIO/) { + # Casio AVI and MOV images use no padding, and their JPEG's use 4, + # except some models like the EX-S770,Z65,Z70,Z75 and Z700 which use 16, + # and the EX-Z35 which uses 2 (grrrr...) + push @offsets, $$et{FILE_TYPE} =~ /^(RIFF|MOV)$/ ? 0 : (4, 16, 2); + } elsif ($make =~ /^(General Imaging Co.|GEDSC IMAGING CORP.)/i) { + push @offsets, 0; + } elsif ($make =~ /^KYOCERA/) { + push @offsets, 12; + } elsif ($make =~ /^Leica Camera AG/) { + if ($model eq 'S2') { + # lots of empty space before first value in S2 images + push @offsets, 4, ($$et{FILE_TYPE} eq 'JPEG' ? 286 : 274); + } elsif ($model eq 'LEICA M MONOCHROM (Typ 246)') { + push @offsets, 4, 130; + } elsif ($model eq 'LEICA M (Typ 240)') { + push @offsets, 4, 118; + } elsif ($model =~ /^(R8|R9|M8)\b/) { + push @offsets, 6; + } else { + push @offsets, 4; + } + } elsif ($make =~ /^OLYMPUS/ and $model =~ /^E-(1|300|330)\b/) { + push @offsets, 16; + } elsif ($make =~ /^OLYMPUS/ and + # these Olympus models are just weird + $model =~ /^(C2500L|C-1Z?|C-5000Z|X-2|C720UZ|C725UZ|C150|C2Z|E-10|E-20|FerrariMODEL2003|u20D|u10D)\b/) + { + # no expected offset --> determine offset empirically via FixBase() + } elsif ($make =~ /^(Panasonic|JVC)\b/) { + push @offsets, 0; + } elsif ($make =~ /^SONY/) { + # earlier DSLR and "PREMI" models use an offset of 4 + if ($model =~ /^(DSLR-.*|SLT-A(33|35|55V)|NEX-(3|5|C3|VG10E))$/ or + $$et{OlympusCAMER}) + { + push @offsets, 4; + } else { + push @offsets, 0; + } + } elsif ($$et{TIFF_TYPE} eq 'SRW' and $make eq 'SAMSUNG' and $model eq 'EK-GN120') { + push @offsets, 40; # patch to read most of the maker notes, but breaks PreviewIFD + } elsif ($make eq 'FUJIFILM') { + # some models have offset of 6, so allow that too (A345,A350,A360,A370) + push @offsets, 4, 6; + } elsif ($make =~ /^TOSHIBA/) { + # similar to Canon, can also have 24 bytes of padding + push @offsets, 0, 24; + } elsif ($make =~ /^PENTAX/) { + push @offsets, 4; + # the Pentax addressing mode is determined automatically, but + # sometimes the algorithm gets it wrong, but Pentax always uses + # absolute addressing, so force it to be absolute + $relative = 0; + } elsif ($make =~ /^Konica Minolta/i) { + # patch for DiMAGE X50, Xg, Z2 and Z10 + push @offsets, 4, -16; + } elsif ($make =~ /^Minolta/) { + # patch for DiMAGE 7, X20 and Z1 + push @offsets, 4, -8, -12; + } else { + push @offsets, 4; # the normal offset + } + return ($relative, @offsets); +} + +#------------------------------------------------------------------------------ +# Get hash of value offsets / block sizes +# Inputs: 0) Data pointer, 1) offset to start of directory, +# 2) hash ref to return value pointers based on tag ID +# Returns: 0) hash reference: keys are offsets, values are block sizes +# 1) same thing, but with keys adjusted for value-based offsets +# Notes: Directory size should be validated before calling this routine +# - calculates MIN and MAX offsets in entry-based hash +sub GetValueBlocks($$;$) +{ + my ($dataPt, $dirStart, $tagPtr) = @_; + my $numEntries = Get16u($dataPt, $dirStart); + my ($index, $valPtr, %valBlock, %valBlkAdj, $end); + for ($index=0; $index<$numEntries; ++$index) { + my $entry = $dirStart + 2 + 12 * $index; + my $format = Get16u($dataPt, $entry+2); + last if $format < 1 or $format > 13; + my $count = Get32u($dataPt, $entry+4); + my $size = $count * $Image::ExifTool::Exif::formatSize[$format]; + next if $size <= 4; + $valPtr = Get32u($dataPt, $entry+8); + $tagPtr and $$tagPtr{Get16u($dataPt, $entry)} = $valPtr; + # save location and size of longest block at this offset + unless (defined $valBlock{$valPtr} and $valBlock{$valPtr} > $size) { + $valBlock{$valPtr} = $size; + } + # adjust for case of value-based offsets + $valPtr += 12 * $index; + unless (defined $valBlkAdj{$valPtr} and $valBlkAdj{$valPtr} > $size) { + $valBlkAdj{$valPtr} = $size; + my $end = $valPtr + $size; + if (defined $valBlkAdj{MIN}) { + # save minimum only if it has a value of 12 or greater + $valBlkAdj{MIN} = $valPtr if $valBlkAdj{MIN} < 12 or $valBlkAdj{MIN} > $valPtr; + $valBlkAdj{MAX} = $end if $valBlkAdj{MAX} > $end; + } else { + $valBlkAdj{MIN} = $valPtr; + $valBlkAdj{MAX} = $end; + } + } + } + return(\%valBlock, \%valBlkAdj); +} + +#------------------------------------------------------------------------------ +# Fix base for value offsets in maker notes IFD (if necessary) +# Inputs: 0) ExifTool object ref, 1) DirInfo hash ref +# Return: amount of base shift (and $dirInfo Base and DataPos are updated, +# FixedBy is set if offsets fixed, and Relative or EntryBased may be set) +sub FixBase($$) +{ + local $_; + my ($et, $dirInfo) = @_; + # don't fix base if fixing offsets individually or if we don't want to fix them + return 0 if $$dirInfo{FixOffsets} or $$dirInfo{NoFixBase}; + + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $entryBased = $$dirInfo{EntryBased}; + my $dirName = $$dirInfo{DirName}; + my $fixBase = $et->Options('FixBase'); + my $setBase = (defined $fixBase and $fixBase ne '') ? 1 : 0; + my ($fix, $fixedBy, %tagPtr); + + # get hash of value block positions + my ($valBlock, $valBlkAdj) = GetValueBlocks($dataPt, $dirStart, \%tagPtr); + return 0 unless %$valBlock; + # get sorted list of value offsets + my @valPtrs = sort { $a <=> $b } keys %$valBlock; +# +# handle special case of Canon maker notes with TIFF footer containing original offset +# + if ($$et{Make} =~ /^Canon/ and $$dirInfo{DirLen} > 8) { + my $footerPos = $dirStart + $$dirInfo{DirLen} - 8; + my $footer = substr($$dataPt, $footerPos, 8); + if ($footer =~ /^(II\x2a\0|MM\0\x2a)/ and # check for TIFF footer + substr($footer,0,2) eq GetByteOrder()) # validate byte ordering + { + my $oldOffset = Get32u(\$footer, 4); + my $newOffset = $dirStart + $dataPos; + if ($setBase) { + $fix = $fixBase; + } else { + $fix = $newOffset - $oldOffset; + return 0 unless $fix; + # Picasa and ACDSee have a bug where they update other offsets without + # updating the TIFF footer (PH - 2009/02/25), so test for this case: + # validate Canon maker note footer fix by checking offset of last value + my $maxPt = $valPtrs[-1] + $$valBlock{$valPtrs[-1]}; + # compare to end of maker notes, taking 8-byte footer into account + my $endDiff = $dirStart + $$dirInfo{DirLen} - ($maxPt - $dataPos) - 8; + # ignore footer offset only if end difference is exactly correct + # (allow for possible padding byte, although I have never seen this) + if (not $endDiff or $endDiff == 1) { + $et->Warn('Canon maker note footer may be invalid (ignored)',1); + return 0; + } + } + $et->Warn("Adjusted $dirName base by $fix",1); + $$dirInfo{FixedBy} = $fix; + $$dirInfo{Base} += $fix; + $$dirInfo{DataPos} -= $fix; + return $fix; + } + } +# +# analyze value offsets to see if they need fixing. The first task is to determine +# the minimum valid offset used (this is tricky, because we have to weed out bad +# offsets written by some cameras) +# + my $minPt = $$dirInfo{MinOffset} = $valPtrs[0]; # if life were simple, this would be it + my $ifdLen = 2 + 12 * Get16u($$dirInfo{DataPt}, $dirStart); + my $ifdEnd = $dirStart + $ifdLen; + my ($relative, @offsets) = GetMakerNoteOffset($et); + my $makeDiff = $offsets[0]; + my $verbose = $et->Options('Verbose'); + my ($diff, $shift); + + # calculate expected minimum value offset + my $expected = $dataPos + $ifdEnd + (defined $makeDiff ? $makeDiff : 4); + $debug and print "$expected expected\n"; + + # zero our counters + my ($countNeg12, $countZero, $countOverlap) = (0, 0, 0); + my ($valPtr, $last); + foreach $valPtr (@valPtrs) { + printf("%d - %d (%d)\n", $valPtr, $valPtr + $$valBlock{$valPtr}, + $valPtr - ($last || 0)) if $debug; + if (defined $last) { + my $gap = $valPtr - $last; + if ($gap == 0 or $gap == 1) { + ++$countZero; + } elsif ($gap == -12 and not $entryBased) { + # you get this when value offsets are relative to the IFD entry + ++$countNeg12; + } elsif ($gap < 0) { + # any other negative difference indicates overlapping values + ++$countOverlap if $valPtr; # (but ignore zero value pointers) + } elsif ($gap >= $ifdLen) { + # ignore previous minimum if we took a jump to near the expected value + # (some values can be stored before the IFD) + $minPt = $valPtr if abs($valPtr - $expected) <= 4; + } + # an offset less than 12 is surely garbage, so ignore it + $minPt = $valPtr if $minPt < 12; + } + $last = $valPtr + $$valBlock{$valPtr}; + } + # could this IFD be using entry-based offsets? + if ((($countNeg12 > $countZero and $$valBlkAdj{MIN} >= $ifdLen - 2) or + ($$valBlkAdj{MIN} == $ifdLen - 2 or $$valBlkAdj{MIN} == $ifdLen + 2) + ) and $$valBlkAdj{MAX} <= $$dirInfo{DirLen}-2) + { + # looks like these offsets are entry-based, so use the offsets + # which have been correcting for individual entry position + $entryBased = 1; + $verbose and $et->Warn("$dirName offsets are entry-based",1); + } else { + # calculate offset difference from end of IFD to first value + $diff = ($minPt - $dataPos) - $ifdEnd; + $shift = 0; + $countOverlap and $et->Warn("Overlapping $dirName values",1); + if ($entryBased) { + $et->Warn("$dirName offsets do NOT look entry-based",1); + undef $entryBased; + undef $relative; + } + # use PrintIM tag to do special check for correct absolute offsets + if ($tagPtr{0xe00}) { + my $ptr = $tagPtr{0xe00} - $dataPos; + return 0 if $ptr > 0 and $ptr <= length($$dataPt) - 8 and + substr($$dataPt, $ptr, 8) eq "PrintIM\0"; + } + # allow a range of reasonable differences for Unknown maker notes + if ($$dirInfo{FixBase} and $$dirInfo{FixBase} == 2) { + return 0 if $diff >=0 and $diff <= 24; + } + # ******** (used for testing to extract differences) ******** + # $et->FoundTag('Diff', $diff); + # $et->FoundTag('MakeDiff',$makeDiff); + } +# +# handle entry-based offsets +# + if ($entryBased) { + $debug and print "--> entry-based!\n"; + # most of my entry-based samples have first value immediately + # after last IFD entry (ie. no padding or next IFD pointer) + $makeDiff = 0; + push @offsets, 4; # but some do have a next IFD pointer + # corrected entry-based offsets are relative to start of first entry + my $expected = 12 * Get16u($$dirInfo{DataPt}, $dirStart); + $diff = $$valBlkAdj{MIN} - $expected; + # set up directory to read values with entry-based offsets + # (ignore everything and set base to start of first entry) + $shift = $dataPos + $dirStart + 2; + $$dirInfo{Base} += $shift; + $$dirInfo{DataPos} -= $shift; + $$dirInfo{EntryBased} = 1; + $$dirInfo{Relative} = 1; # entry-based offsets are relative + delete $$dirInfo{FixBase}; # no automatic base fix + undef $fixBase unless $setBase; + } +# +# return without doing shift if offsets look OK +# + unless ($setBase) { + # don't try to fix offsets for whacky cameras + return $shift unless defined $makeDiff; + # normal value data starts 4 bytes after IFD, but allow 0 or 4... + return $shift if $diff == 0 or $diff == 4; + # also check for allowed make-specific differences + foreach (@offsets) { + return $shift if $diff == $_; + } + } +# +# apply the fix, or issue a warning +# + # use default padding of 4 bytes unless already specified + $makeDiff = 4 unless defined $makeDiff; + $fix = $makeDiff - $diff; # assume standard diff for this make + + if ($$dirInfo{FixBase}) { + # set flag if offsets are relative (base is at or above directory start) + if ($dataPos - $fix + $dirStart <= 0) { + $$dirInfo{Relative} = (defined $relative) ? $relative : 1; + } + if ($setBase) { + $fixedBy = $fixBase; + $fix += $fixBase; + } + } elsif (defined $fixBase) { + $fix = $fixBase if $fixBase ne ''; + $fixedBy = $fix; + } else { + # print warning unless difference looks reasonable + if ($diff < 0 or $diff > 16 or ($diff & 0x01)) { + $et->Warn("Possibly incorrect maker notes offsets (fix by $fix?)",1); + } + # don't do the fix (but we already adjusted base if entry-based) + return $shift; + } + if (defined $fixedBy) { + $et->Warn("Adjusted $dirName base by $fixedBy",1); + $$dirInfo{FixedBy} = $fixedBy; + } + $$dirInfo{Base} += $fix; + $$dirInfo{DataPos} -= $fix; + return $fix + $shift; +} + +#------------------------------------------------------------------------------ +# Find start of IFD in unknown maker notes +# Inputs: 0) reference to directory information +# Returns: offset to IFD on success, undefined otherwise +# - dirInfo may contain TagInfo reference for tag associated with directory +# - on success, updates DirStart, DirLen, Base and DataPos in dirInfo +# - also sets Relative flag in dirInfo if offsets are relative to IFD +# Note: Changes byte ordering! +sub LocateIFD($$) +{ + my ($et, $dirInfo) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + # (ignore MakerNotes DirLen since sometimes this is incorrect) + my $size = $$dirInfo{DataLen} - $dirStart; + my $dirLen = defined $$dirInfo{DirLen} ? $$dirInfo{DirLen} : $size; + my $tagInfo = $$dirInfo{TagInfo}; + my $ifdOffsetPos; + # the IFD should be within the first 32 bytes + # (Kyocera sets the current record at 22 bytes) + my ($firstTry, $lastTry) = (0, 32); + + # make sure Base and DataPos are defined + $$dirInfo{Base} or $$dirInfo{Base} = 0; + $$dirInfo{DataPos} or $$dirInfo{DataPos} = 0; +# +# use tag information (if provided) to determine directory location +# + if ($tagInfo and $$tagInfo{SubDirectory}) { + my $subdir = $$tagInfo{SubDirectory}; + unless ($$subdir{ProcessProc} and + ($$subdir{ProcessProc} eq \&ProcessUnknown or + $$subdir{ProcessProc} eq \&ProcessUnknownOrPreview)) + { + # look for the IFD at the "Start" specified in our SubDirectory information + my $valuePtr = $dirStart; + my $newStart = $dirStart; + if (defined $$subdir{Start}) { + #### eval Start ($valuePtr) + $newStart = eval($$subdir{Start}); + } + if ($$subdir{Base}) { + # calculate subdirectory start relative to $base for eval + my $start = $newStart + $$dirInfo{DataPos}; + my $base = $$dirInfo{Base} || 0; + #### eval Base ($start,$base) + my $baseShift = eval($$subdir{Base}); + # shift directory base (note: we may do this again below + # if an OffsetPt is defined, but that doesn't matter since + # the base shift is relative to DataPos, which we set too) + $$dirInfo{Base} += $baseShift; + $$dirInfo{DataPos} -= $baseShift; + # this is a relative directory if Base depends on $start + if ($$subdir{Base} =~ /\$start\b/) { + $$dirInfo{Relative} = 1; + # hack to fix Leica quirk + if ($$subdir{ProcessProc} and $$subdir{ProcessProc} eq \&FixLeicaBase) { + my $oldStart = $$dirInfo{DirStart}; + $$dirInfo{DirStart} = $newStart; + FixLeicaBase($et, $dirInfo); + $$dirInfo{DirStart} = $oldStart; + } + } + } + # add offset to the start of the directory if necessary + if ($$subdir{OffsetPt}) { + if ($$subdir{ByteOrder} =~ /^Little/i) { + SetByteOrder('II'); + } elsif ($$subdir{ByteOrder} =~ /^Big/i) { + SetByteOrder('MM'); + } else { + warn "Can't have variable byte ordering for SubDirectories using OffsetPt\n"; + return undef; + } + #### eval OffsetPt ($valuePtr) + $ifdOffsetPos = eval($$subdir{OffsetPt}) - $dirStart; + } + # pinpoint position to look for this IFD + $firstTry = $lastTry = $newStart - $dirStart; + } + } +# +# scan for something that looks like an IFD +# + if ($dirLen >= 14 + $firstTry) { # minimum size for an IFD + my $offset; +IFD_TRY: for ($offset=$firstTry; $offset<=$lastTry; $offset+=2) { + last if $offset + 14 > $dirLen; # 14 bytes is minimum size for an IFD + my $pos = $dirStart + $offset; +# +# look for a standard TIFF header (Nikon uses it, others may as well), +# + if (SetByteOrder(substr($$dataPt, $pos, 2)) and + Get16u($dataPt, $pos + 2) == 0x2a) + { + $ifdOffsetPos = 4; + } + if (defined $ifdOffsetPos) { + # get pointer to IFD + my $ptr = Get32u($dataPt, $pos + $ifdOffsetPos); + if ($ptr >= $ifdOffsetPos + 4 and $ptr + $offset + 14 <= $dirLen) { + # shift directory start and shorten dirLen accordingly + $$dirInfo{DirStart} += $ptr + $offset; + $$dirInfo{DirLen} -= $ptr + $offset; + # shift pointer base to the start of the TIFF header + my $shift = $$dirInfo{DataPos} + $dirStart + $offset; + $$dirInfo{Base} += $shift; + $$dirInfo{DataPos} -= $shift; + $$dirInfo{Relative} = 1; # set "relative offsets" flag + return $ptr + $offset; + } + undef $ifdOffsetPos; + } +# +# look for a standard IFD (starts with 2-byte entry count) +# + my $num = Get16u($dataPt, $pos); + next unless $num; + # number of entries in an IFD should be between 1 and 255 + if (!($num & 0xff)) { + # lower byte is zero -- byte order could be wrong + ToggleByteOrder(); + $num >>= 8; + } elsif ($num & 0xff00) { + # upper byte isn't zero -- not an IFD + next; + } + my $bytesFromEnd = $size - ($offset + 2 + 12 * $num); + if ($bytesFromEnd < 4) { + next unless $bytesFromEnd == 2 or $bytesFromEnd == 0; + } + # do a quick validation of all format types + my $index; + for ($index=0; $index<$num; ++$index) { + my $entry = $pos + 2 + 12 * $index; + my $format = Get16u($dataPt, $entry+2); + my $count = Get32u($dataPt, $entry+4); + unless ($format) { + # patch for buggy Samsung NX200 JPEG MakerNotes entry count + if ($num == 23 and $index == 21 and $$et{Make} eq 'SAMSUNG') { + Set16u(21, $dataPt, $pos); # really 21 IFD entries! + $et->Warn('Fixed incorrect Makernote entry count', 1); + last; + } + # allow everything to be zero if not first entry + # because some manufacturers pad with null entries + next unless $count or $index == 0; + # patch for Canon EOS 40D firmware 1.0.4 bug: allow zero format for last entry + next if $index==$num-1 and $$et{Model}=~/EOS 40D/; + } + # patch for Sony cameras like the DSC-P10 that have invalid MakerNote entries + next if $num == 12 and $$et{Make} eq 'SONY' and $index >= 8; + # (would like to verify tag ID, but some manufactures don't + # sort entries in order of tag ID so we don't have much of + # a handle to verify this field) + # verify format + next IFD_TRY if $format < 1 or $format > 13; + # count must be reasonable (can't test for zero count because + # cameras like the 1DmkIII use this value) + next IFD_TRY if $count & 0xff000000; + # extra tests to avoid mis-identifying Samsung makernotes (GT-I9000, etc) + next unless $num == 1; + my $valueSize = $count * $Image::ExifTool::Exif::formatSize[$format]; + if ($valueSize > 4) { + next IFD_TRY if $valueSize > $size; + my $valuePtr = Get32u($dataPt, $entry+8); + next IFD_TRY if $valuePtr > 0x10000; + } + } + $$dirInfo{DirStart} += $offset; # update directory start + $$dirInfo{DirLen} -= $offset; + return $offset; # success!! + } + } + return undef; +} + +#------------------------------------------------------------------------------ +# Fix base offset for Leica maker notes +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, and updates $dirInfo if necessary for new directory +sub FixLeicaBase($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + # get hash of value block positions + my ($valBlock, $valBlkAdj) = GetValueBlocks($dataPt, $dirStart); + if (%$valBlock) { + # get sorted list of value offsets + my @valPtrs = sort { $a <=> $b } keys %$valBlock; + my $numEntries = Get16u($dataPt, $dirStart); + my $diff = $valPtrs[0] - ($numEntries * 12 + 4); + if ($diff > 8) { + $$dirInfo{Base} -= 8; + $$dirInfo{DataPos} += 8; + } + } + my $success = 1; + if ($tagTablePtr) { + $success = Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr); + } + return $success; +} + +#------------------------------------------------------------------------------ +# Process Canon maker notes +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessCanon($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + # identify Canon MakerNote footer in HtmlDump + # (this code moved from FixBase so it also works for Adobe MakN in DNG images) + if ($$et{HTML_DUMP} and $$dirInfo{DirLen} > 8) { + my $dataPos = $$dirInfo{DataPos}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $footerPos = $dirStart + $$dirInfo{DirLen} - 8; + my $footer = substr(${$$dirInfo{DataPt}}, $footerPos, 8); + if ($footer =~ /^(II\x2a\0|MM\0\x2a)/ and substr($footer,0,2) eq GetByteOrder()) { + my $oldOffset = Get32u(\$footer, 4); + my $newOffset = $dirStart + $dataPos; + my $str = sprintf('Original maker note offset: 0x%.4x', $oldOffset); + if ($oldOffset != $newOffset) { + $str .= sprintf("\nCurrent maker note offset: 0x%.4x", $newOffset); + } + my $filePos = ($$dirInfo{Base} || 0) + $dataPos + $footerPos; + $et->HDump($filePos, 8, '[Canon MakerNotes footer]', $str); + } + } + # process as normal + return Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Process GE type 2 maker notes +# Inputs: 0) ExifTool object ref, 1) DirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessGE2($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt} or return 0; + my $dirStart = $$dirInfo{DirStart} || 0; + + # these maker notes are missing the IFD entry count, but they + # always have 25 entries, so write the entry count manually + Set16u(25, $dataPt, $dirStart); + return Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Process broken Kodak type 8b maker notes +# Inputs: 0) ExifTool object ref, 1) DirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessKodakPatch($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt} or return 0; + my $dirStart = $$dirInfo{DirStart} || 0; + + # these maker notes have an 2 extra null bytes either before or after the entry count, + # so fix this by making a 2-byte entry count just before the first IFD entry + return 0 unless $$dirInfo{DirLen} >= 4; + my $t1 = Get16u($dataPt,$dirStart); + my $t2 = Get16u($dataPt,$dirStart+2); + Set16u($t1 || $t2, $dataPt, $dirStart+2); + $$dirInfo{DirStart} += 2; + return Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Process unknown maker notes or PreviewImage +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, and updates $dirInfo if necessary for new directory +sub ProcessUnknownOrPreview($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart}; + my $dirLen = $$dirInfo{DirLen}; + # check to see if this is a preview image + if ($dirLen > 6 and substr($$dataPt, $dirStart, 3) eq "\xff\xd8\xff") { + $et->VerboseDir('PreviewImage'); + if ($$et{HTML_DUMP}) { + my $pos = $$dirInfo{DataPos} + $$dirInfo{Base} + $dirStart; + $et->HDump($pos, $dirLen, '(MakerNotes:PreviewImage data)', "Size: $dirLen bytes") + } + $et->FoundTag('PreviewImage', substr($$dataPt, $dirStart, $dirLen)); + return 1; + } + return ProcessUnknown($et, $dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Write unknown maker notes or PreviewImage +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: directory data, '' to delete, or undef on error +sub WriteUnknownOrPreview($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart}; + my $dirLen = $$dirInfo{DirLen}; + my $newVal; + # check to see if this is a preview image + if ($dirLen > 6 and substr($$dataPt, $dirStart, 3) eq "\xff\xd8\xff") { + if ($$et{NEW_VALUE}{$Image::ExifTool::Extra{PreviewImage}}) { + # write or delete new preview (if deleted, it can't currently be added back again) + $newVal = $et->GetNewValue('PreviewImage') || ''; + if ($et->Options('Verbose') > 1) { + $et->VerboseValue("- MakerNotes:PreviewImage", substr($$dataPt, $dirStart, $dirLen)); + $et->VerboseValue("+ MakerNotes:PreviewImage", $newVal) if $newVal; + } + ++$$et{CHANGED}; + } else { + $newVal = substr($$dataPt, $dirStart, $dirLen); + } + } else { + # rewrite MakerNote IFD + $newVal = Image::ExifTool::Exif::WriteExif($et, $dirInfo, $tagTablePtr); + } + return $newVal; +} + +#------------------------------------------------------------------------------ +# Process unknown maker notes assuming it is in EXIF IFD format +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, and updates $dirInfo if necessary for new directory +sub ProcessUnknown($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $success = 0; + + my $loc = LocateIFD($et, $dirInfo); + if (defined $loc) { + $$et{UnknownByteOrder} = GetByteOrder(); + if ($et->Options('Verbose') > 1) { + my $out = $et->Options('TextOut'); + my $indent = $$et{INDENT}; + $indent =~ s/\| $/ /; + printf $out "${indent}Found IFD at offset 0x%.4x in maker notes:\n", + $$dirInfo{DirStart} + $$dirInfo{DataPos} + $$dirInfo{Base}; + } + $success = Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr); + } else { + $$et{UnknownByteOrder} = ''; # indicates we tried but didn't set byte order + $et->Warn("Unrecognized $$dirInfo{DirName}", 1); + } + return $success; +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::MakerNotes - Read and write EXIF maker notes + +=head1 SYNOPSIS + +This module is required by Image::ExifTool. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +maker notes in EXIF information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames(3pm)|Image::ExifTool::TagNames>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Matroska.pm b/lib/Image/ExifTool/Matroska.pm new file mode 100644 index 0000000..de85f9a --- /dev/null +++ b/lib/Image/ExifTool/Matroska.pm @@ -0,0 +1,939 @@ +#------------------------------------------------------------------------------ +# File: Matroska.pm +# +# Description: Read meta information from Matroska multimedia files +# +# Revisions: 05/26/2010 - P. Harvey Created +# +# References: 1) http://www.matroska.org/technical/specs/index.html +#------------------------------------------------------------------------------ + +package Image::ExifTool::Matroska; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.11'; + +my %noYes = ( 0 => 'No', 1 => 'Yes' ); + +# Matroska tags +# Note: The tag ID's in the Matroska documentation include the length designation +# (the upper bits), which is not included in the tag ID's below +%Image::ExifTool::Matroska::Main = ( + GROUPS => { 2 => 'Video' }, + VARS => { NO_LOOKUP => 1 }, # omit tags from lookup + NOTES => q{ + The following tags are extracted from Matroska multimedia container files. + This container format is used by file types such as MKA, MKV, MKS and WEBM. + For speed, ExifTool extracts tags only up to the first Cluster unless the + L<Verbose|../ExifTool.html#Verbose> (-v) or L<Unknown|../ExifTool.html#Unknown> = 2 (-U) option is used. See + L<http://www.matroska.org/technical/specs/index.html> for the official + Matroska specification. + }, + # supported Format's: signed, unsigned, float, date, string, utf8 + # (or undef by default) +# +# EBML Header +# + 0xa45dfa3 => { + Name => 'EBMLHeader', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x286 => { Name => 'EBMLVersion', Format => 'unsigned' }, + 0x2f7 => { Name => 'EBMLReadVersion', Format => 'unsigned' }, + 0x2f2 => { Name => 'EBMLMaxIDLength', Format => 'unsigned', Unknown => 1 }, + 0x2f3 => { Name => 'EBMLMaxSizeLength', Format => 'unsigned', Unknown => 1 }, + 0x282 => { + Name => 'DocType', + Format => 'string', + # override FileType for "webm" files + RawConv => '$self->OverrideFileType("WEBM") if $val eq "webm"; $val', + }, + 0x287 => { Name => 'DocTypeVersion', Format => 'unsigned' }, + 0x285 => { Name => 'DocTypeReadVersion',Format => 'unsigned' }, +# +# General +# + 0x3f => { Name => 'CRC-32', Binary => 1, Unknown => 1 }, + 0x6c => { Name => 'Void', NoSave => 1, Unknown => 1 }, +# +# Signature +# + 0xb538667 => { + Name => 'SignatureSlot', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x3e8a => { Name => 'SignatureAlgo', Format => 'unsigned' }, + 0x3e9a => { Name => 'SignatureHash', Format => 'unsigned' }, + 0x3ea5 => { Name =>'SignaturePublicKey',Binary => 1, Unknown => 1 }, + 0x3eb5 => { Name => 'Signature', Binary => 1, Unknown => 1 }, + 0x3e5b => { + Name => 'SignatureElements', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x3e7b => { + Name => 'SignatureElementList', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x2532 => { Name => 'SignedElement', Binary => 1, Unknown => 1 }, +# +# Segment +# + 0x8538067 => { + Name => 'SegmentHeader', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x14d9b74 => { + Name => 'SeekHead', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0xdbb => { + Name => 'Seek', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x13ab => { Name => 'SeekID', Binary => 1, Unknown => 1 }, + 0x13ac => { Name => 'SeekPosition', Format => 'unsigned', Unknown => 1 }, +# +# Segment Info +# + 0x549a966 => { + Name => 'Info', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x33a4 => { Name => 'SegmentUID', Binary => 1, Unknown => 1 }, + 0x3384 => { Name => 'SegmentFileName', Format => 'utf8' }, + 0x1cb923 => { Name => 'PrevUID', Binary => 1, Unknown => 1 }, + 0x1c83ab => { Name => 'PrevFileName', Format => 'utf8' }, + 0x1eb923 => { Name => 'NextUID', Binary => 1, Unknown => 1 }, + 0x1e83bb => { Name => 'NextFileName', Format => 'utf8' }, + 0x0444 => { Name => 'SegmentFamily', Binary => 1, Unknown => 1 }, + 0x2924 => { + Name => 'ChapterTranslate', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x29fc => { Name => 'ChapterTranslateEditionUID',Format => 'unsigned', Unknown => 1 }, + 0x29bf => { + Name => 'ChapterTranslateCodec', + Format => 'unsigned', + PrintConv => { 0 => 'Matroska Script', 1 => 'DVD Menu' }, + }, + 0x29a5 => { Name => 'ChapterTranslateID',Binary => 1, Unknown => 1 }, + 0xad7b1 => { + Name => 'TimecodeScale', + Format => 'unsigned', + RawConv => '$$self{TimecodeScale} = $val', + ValueConv => '$val / 1e9', + PrintConv => '($val * 1000) . " ms"', + }, + 0x489 => { + Name => 'Duration', + Format => 'float', + ValueConv => '$$self{TimecodeScale} ? $val * $$self{TimecodeScale} / 1e9 : $val', + PrintConv => '$$self{TimecodeScale} ? ConvertDuration($val) : $val', + }, + 0x461 => { + Name => 'DateTimeOriginal', # called "DateUTC" by the spec + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Format => 'date', + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x3ba9 => { Name => 'Title', Format => 'utf8' }, + 0xd80 => { Name => 'MuxingApp', Format => 'utf8' }, + 0x1741 => { Name => 'WritingApp', Format => 'utf8' }, +# +# Cluster +# + 0xf43b675 => { + Name => 'Cluster', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x67 => { + Name => 'TimeCode', + Format => 'unsigned', + Unknown => 1, + ValueConv => '$$self{TimecodeScale} ? $val * $$self{TimecodeScale} / 1e9 : $val', + PrintConv => '$$self{TimecodeScale} ? ConvertDuration($val) : $val', + }, + 0x1854 => { + Name => 'SilentTracks', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x18d7 => { Name => 'SilentTrackNumber',Format => 'unsigned' }, + 0x27 => { Name => 'Position', Format => 'unsigned' }, + 0x2b => { Name => 'PrevSize', Format => 'unsigned' }, + 0x23 => { Name => 'SimpleBlock', NoSave => 1, Unknown => 1 }, + 0x20 => { + Name => 'BlockGroup', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x21 => { Name => 'Block', NoSave => 1, Unknown => 1 }, + 0x22 => { Name => 'BlockVirtual', NoSave => 1, Unknown => 1 }, + 0x35a1 => { + Name => 'BlockAdditions', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x26 => { + Name => 'BlockMore', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x6e => { Name => 'BlockAddID', Format => 'unsigned', Unknown => 1 }, + 0x25 => { Name => 'BlockAdditional', NoSave => 1, Unknown => 1 }, + 0x1b => { + Name => 'BlockDuration', + Format => 'unsigned', + Unknown => 1, + ValueConv => '$$self{TimecodeScale} ? $val * $$self{TimecodeScale} / 1e9 : $val', + PrintConv => '$$self{TimecodeScale} ? "$val s" : $val', + }, + 0x7a => { Name => 'ReferencePriority',Format => 'unsigned', Unknown => 1 }, + 0x7b => { + Name => 'ReferenceBlock', + Format => 'signed', + Unknown => 1, + ValueConv => '$$self{TimecodeScale} ? $val * $$self{TimecodeScale} / 1e9 : $val', + PrintConv => '$$self{TimecodeScale} ? "$val s" : $val', + }, + 0x7d => { Name => 'ReferenceVirtual', Format => 'signed', Unknown => 1 }, + 0x24 => { Name => 'CodecState', Binary => 1, Unknown => 1 }, + 0x0e => { + Name => 'Slices', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x68 => { + Name => 'TimeSlice', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x4c => { Name => 'LaceNumber', Format => 'unsigned', Unknown => 1 }, + 0x4d => { Name => 'FrameNumber', Format => 'unsigned', Unknown => 1 }, + 0x4b => { Name => 'BlockAdditionalID',Format => 'unsigned', Unknown => 1 }, + 0x4e => { Name => 'Delay', Format => 'unsigned', Unknown => 1 }, + 0x4f => { Name => 'ClusterDuration', Format => 'unsigned', Unknown => 1 }, + 0x2f => { Name => 'EncryptedBlock', NoSave => 1, Unknown => 1 }, +# +# Tracks +# + 0x654ae6b => { + Name => 'Tracks', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x2e => { + Name => 'TrackEntry', + # reset TrackType member at the start of each track + Condition => 'delete $$self{TrackType}; 1', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x57 => { Name => 'TrackNumber', Format => 'unsigned' }, + 0x33c5 => { Name => 'TrackUID', Format => 'unsigned', Unknown => 1 }, + 0x03 => { + Name => 'TrackType', + Format => 'unsigned', + PrintHex => 1, + # remember types of all tracks encountered, as well as the current track type + RawConv => '$$self{TrackTypes}{$val} = 1; $$self{TrackType} = $val', + PrintConv => { + 0x01 => 'Video', + 0x02 => 'Audio', + 0x03 => 'Complex', # (audio+video) + 0x10 => 'Logo', + 0x11 => 'Subtitle', + 0x12 => 'Buttons', + 0x20 => 'Control', + }, + }, + 0x39 => { Name => 'TrackUsed', Format => 'unsigned', PrintConv => \%noYes }, + 0x08 => { Name => 'TrackDefault', Format => 'unsigned', PrintConv => \%noYes }, + 0x15aa => { Name => 'TrackForced', Format => 'unsigned', PrintConv => \%noYes }, + 0x1c => { + Name => 'TrackLacing', + Format => 'unsigned', + Unknown => 1, + PrintConv => \%noYes, + }, + 0x2de7 => { Name => 'MinCache', Format => 'unsigned', Unknown => 1 }, + 0x2df8 => { Name => 'MaxCache', Format => 'unsigned', Unknown => 1 }, + 0x3e383 => [ + { + Name => 'VideoFrameRate', + Condition => '$$self{TrackType} and $$self{TrackType} == 0x01', + Format => 'unsigned', + ValueConv => '$val ? 1e9 / $val : 0', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + },{ + Name => 'DefaultDuration', + Format => 'unsigned', + ValueConv => '$val / 1e9', + PrintConv => '($val * 1000) . " ms"', + } + ], + 0x3314f => { Name => 'TrackTimecodeScale',Format => 'float' }, + 0x137f => { Name => 'TrackOffset', Format => 'signed', Unknown => 1 }, + 0x15ee => { Name => 'MaxBlockAdditionID',Format => 'unsigned', Unknown => 1 }, + 0x136e => { Name => 'TrackName', Format => 'utf8' }, + 0x2b59c => { Name => 'TrackLanguage', Format => 'string' }, + 0x06 => [ + { + Name => 'VideoCodecID', + Condition => '$$self{TrackType} and $$self{TrackType} == 0x01', + Format => 'string', + },{ + Name => 'AudioCodecID', + Condition => '$$self{TrackType} and $$self{TrackType} == 0x02', + Format => 'string', + },{ + Name => 'CodecID', + Format => 'string', + } + ], + 0x23a2 => { Name => 'CodecPrivate', Binary => 1, Unknown => 1 }, + 0x58688 => [ + { + Name => 'VideoCodecName', + Condition => '$$self{TrackType} and $$self{TrackType} == 0x01', + Format => 'utf8', + },{ + Name => 'AudioCodecName', + Condition => '$$self{TrackType} and $$self{TrackType} == 0x02', + Format => 'utf8', + },{ + Name => 'CodecName', + Format => 'utf8', + } + ], + 0x3446 => { Name => 'TrackAttachmentUID',Format => 'unsigned' }, + 0x1a9697=>{ Name => 'CodecSettings', Format => 'utf8' }, + 0x1b4040=>{ Name => 'CodecInfoURL', Format => 'string' }, + 0x6b240 =>{ Name => 'CodecDownloadURL', Format => 'string' }, + 0x2a => { Name => 'CodecDecodeAll', Format => 'unsigned', PrintConv => \%noYes }, + 0x2fab => { Name => 'TrackOverlay', Format => 'unsigned', Unknown => 1 }, + 0x2624 => { + Name => 'TrackTranslate', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x26fc => { Name => 'TrackTranslateEditionUID',Format => 'unsigned', Unknown => 1 }, + 0x26bf => { + Name => 'TrackTranslateCodec', + Format => 'unsigned', + PrintConv => { 0 => 'Matroska Script', 1 => 'DVD Menu' }, + }, + 0x26a5 => { Name => 'TrackTranslateTrackID', Binary => 1, Unknown => 1 }, +# +# Video +# + 0x60 => { + Name => 'Video', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x1a => { + Name => 'VideoScanType', + Format => 'unsigned', + PrintConv => { + 0 => 'Progressive', + 1 => 'Interlaced', + }, + }, + 0x13b8 => { + Name => 'Stereo3DMode', + Format => 'unsigned', + Printconv => { + 0 => 'Mono', + 1 => 'Right Eye', + 2 => 'Left Eye', + 3 => 'Both Eyes', + }, + }, + 0x30 => { Name => 'ImageWidth', Format => 'unsigned' }, + 0x3a => { Name => 'ImageHeight', Format => 'unsigned' }, + 0x14aa => { Name => 'CropBottom', Format => 'unsigned' }, + 0x14bb => { Name => 'CropTop', Format => 'unsigned' }, + 0x14cc => { Name => 'CropLeft', Format => 'unsigned' }, + 0x14dd => { Name => 'CropRight', Format => 'unsigned' }, + 0x14b0 => { Name => 'DisplayWidth', Format => 'unsigned' }, + 0x14ba => { Name => 'DisplayHeight', Format => 'unsigned' }, + 0x14b2 => { + Name => 'DisplayUnit', + Format => 'unsigned', + PrintConv => { + 0 => 'Pixels', + 1 => 'cm', + 2 => 'inches', + }, + }, + 0x14b3 => { + Name => 'AspectRatioType', + Format => 'unsigned', + PrintConv => { + 0 => 'Free Resizing', + 1 => 'Keep Aspect Ratio', + 2 => 'Fixed', + }, + }, + 0xeb524 => { Name => 'ColorSpace', Binary => 1, Unknown => 1 }, + 0xfb523 => { Name => 'Gamma', Format => 'float' }, + 0x383e3 => { Name => 'FrameRate', Format => 'float' }, +# +# Audio +# + 0x61 => { + Name => 'Audio', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x35 => { Name => 'AudioSampleRate', Format => 'float', Groups => { 2 => 'Audio' } }, + 0x38b5 => { Name => 'OutputAudioSampleRate',Format => 'float', Groups => { 2 => 'Audio' } }, + 0x1f => { Name => 'AudioChannels', Format => 'unsigned', Groups => { 2 => 'Audio' } }, + 0x3d7b => { + Name => 'ChannelPositions', + Binary => 1, + Unknown => 1, + Groups => { 2 => 'Audio' }, + }, + 0x2264 => { Name => 'AudioBitsPerSample', Format => 'unsigned', Groups => { 2 => 'Audio' } }, +# +# Content Encoding +# + 0x2d80 => { + Name => 'ContentEncodings', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x2240 => { + Name => 'ContentEncoding', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x1031 => { Name => 'ContentEncodingOrder', Format => 'unsigned', Unknown => 1 }, + 0x1032 => { Name => 'ContentEncodingScope', Format => 'unsigned', Unknown => 1 }, + 0x1033 => { + Name => 'ContentEncodingType', + Format => 'unsigned', + PrintConv => { 0 => 'Compression', 1 => 'Encryption' }, + }, + 0x1034 => { + Name => 'ContentCompression', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x254 => { + Name => 'ContentCompressionAlgorithm', + Format => 'unsigned', + PrintConv => { + 0 => 'zlib', + 1 => 'bzlib', + 2 => 'lzo1x', + 3 => 'Header Stripping', + }, + }, + 0x255 => { Name => 'ContentCompressionSettings',Binary => 1, Unknown => 1 }, + 0x1035 => { + Name => 'ContentEncryption', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x7e1 => { + Name => 'ContentEncryptionAlgorithm', + Format => 'unsigned', + PrintConv => { + 0 => 'Not Encrypted', + 1 => 'DES', + 2 => '3DES', + 3 => 'Twofish', + 4 => 'Blowfish', + 5 => 'AES', + }, + }, + 0x7e2 => { Name => 'ContentEncryptionKeyID',Binary => 1, Unknown => 1 }, + 0x7e3 => { Name => 'ContentSignature', Binary => 1, Unknown => 1 }, + 0x7e4 => { Name => 'ContentSignatureKeyID', Binary => 1, Unknown => 1 }, + 0x7e5 => { + Name => 'ContentSignatureAlgorithm', + Format => 'unsigned', + PrintConv => { + 0 => 'Not Signed', + 1 => 'RSA', + }, + }, + 0x7e6 => { + Name => 'ContentSignatureHashAlgorithm', + Format => 'unsigned', + PrintConv => { + 0 => 'Not Signed', + 1 => 'SHA1-160', + 2 => 'MD5', + }, + }, +# +# Cues +# + 0xc53bb6b => { + Name => 'Cues', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x3b => { + Name => 'CuePoint', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x33 => { + Name => 'CueTime', + Format => 'unsigned', + Unknown => 1, + ValueConv => '$$self{TimecodeScale} ? $val * $$self{TimecodeScale} / 1e9 : $val', + PrintConv => '$$self{TimecodeScale} ? ConvertDuration($val) : $val', + }, + 0x37 => { + Name => 'CueTrackPositions', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x77 => { Name => 'CueTrack', Format => 'unsigned', Unknown => 1 }, + 0x71 => { Name => 'CueClusterPosition',Format => 'unsigned', Unknown => 1 }, + 0x1378 => { Name => 'CueBlockNumber', Format => 'unsigned', Unknown => 1 }, + 0x6a => { Name => 'CueCodecState', Format => 'unsigned', Unknown => 1 }, + 0x5b => { + Name => 'CueReference', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x16 => { + Name => 'CueRefTime', + Format => 'unsigned', + Unknown => 1, + ValueConv => '$$self{TimecodeScale} ? $val * $$self{TimecodeScale} / 1e9 : $val', + PrintConv => '$$self{TimecodeScale} ? ConvertDuration($val) : $val', + }, + 0x17 => { Name => 'CueRefCluster', Format => 'unsigned', Unknown => 1 }, + 0x135f=> { Name => 'CueRefNumber', Format => 'unsigned', Unknown => 1 }, + 0x6b => { Name => 'CueRefCodecState', Format => 'unsigned', Unknown => 1 }, +# +# Attachments +# + 0x941a469 => { + Name => 'Attachments', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x21a7 => { + Name => 'AttachedFile', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x67e => { Name => 'AttachedFileDescription',Format => 'utf8' }, + 0x66e => { Name => 'AttachedFileName', Format => 'utf8' }, + 0x660 => { Name => 'AttachedFileMIMEType', Format => 'string' }, + 0x65c => { Name => 'AttachedFileData', Binary => 1 }, + 0x6ae => { Name => 'AttachedFileUID', Format => 'unsigned' }, + 0x675 => { Name => 'AttachedFileReferral', Binary => 1, Unknown => 1 }, +# +# Chapters +# + 0x43a770 => { + Name => 'Chapters', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x5b9 => { + Name => 'EditionEntry', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x5bc => { Name => 'EditionUID', Format => 'unsigned', Unknown => 1 }, + 0x5bd => { Name => 'EditionFlagHidden', Format => 'unsigned', Unknown => 1 }, + 0x5db => { Name => 'EditionFlagDefault',Format => 'unsigned', Unknown => 1 }, + 0x5dd => { Name => 'EditionFlagOrdered',Format => 'unsigned', Unknown => 1 }, + 0x36 => { + Name => 'ChapterAtom', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x33c4 => { Name => 'ChapterUID', Format => 'unsigned', Unknown => 1 }, + 0x11 => { + Name => 'ChapterTimeStart', + Groups => { 1 => 'Chapter#' }, + Format => 'unsigned', + ValueConv => '$val / 1e9', + PrintConv => 'ConvertDuration($val)', + }, + 0x12 => { + Name => 'ChapterTimeEnd', + Format => 'unsigned', + ValueConv => '$val / 1e9', + PrintConv => 'ConvertDuration($val)', + }, + 0x18 => { Name => 'ChapterFlagHidden', Format => 'unsigned', Unknown => 1 }, + 0x598 => { Name => 'ChapterFlagEnabled',Format => 'unsigned', Unknown => 1 }, + 0x2e67=> { Name => 'ChapterSegmentUID', Binary => 1, Unknown => 1 }, + 0x2ebc=> { Name => 'ChapterSegmentEditionUID', Binary => 1, Unknown => 1 }, + 0x23c3 => { + Name => 'ChapterPhysicalEquivalent', + Format => 'unsigned', + PrintConv => { + 10 => 'Index', + 20 => 'Track', + 30 => 'Session', + 40 => 'Layer', + 50 => 'Side', + 60 => 'CD / DVD', + 70 => 'Set / Package', + }, + }, + 0x0f => { + Name => 'ChapterTrack', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x09 => { Name => 'ChapterTrackNumber', Format => 'unsigned', Unknown => 1 }, + 0x00 => { + Name => 'ChapterDisplay', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x05 => { Name => 'ChapterString', Format => 'utf8' }, + 0x37c => { Name => 'ChapterLanguage', Format => 'string' }, + 0x37e => { Name => 'ChapterCountry', Format => 'string' }, + 0x2944 => { + Name => 'ChapterProcess', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x2955 => { + Name => 'ChapterProcessCodecID', + Format => 'unsigned', + Unknown => 1, + PrintConv => { 0 => 'Matroska', 1 => 'DVD' }, + }, + 0x50d => { Name => 'ChapterProcessPrivate', Binary => 1, Unknown => 1 }, + 0x2911 => { + Name => 'ChapterProcessCommand', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x2922 => { + Name => 'ChapterProcessTime', + Format => 'unsigned', + Unknown => 1, + PrintConv => { + 0 => 'For Duration of Chapter', + 1 => 'Before Chapter', + 2 => 'After Chapter', + }, + }, + 0x2933 => { Name => 'ChapterProcessData', Binary => 1, Unknown => 1 }, +# +# Tags +# + 0x254c367 => { + Name => 'Tags', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x3373 => { + Name => 'Tag', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x23c0 => { + Name => 'Targets', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x28ca => { Name => 'TargetTypeValue', Format => 'unsigned' }, + 0x23ca => { Name => 'TargetType', Format => 'string' }, + 0x23c5 => { Name => 'TagTrackUID', Format => 'unsigned', Unknown => 1 }, + 0x23c9 => { Name => 'TagEditionUID', Format => 'unsigned', Unknown => 1 }, + 0x23c4 => { Name => 'TagChapterUID', Format => 'unsigned', Unknown => 1 }, + 0x23c6 => { Name => 'TagAttachmentUID', Format => 'unsigned', Unknown => 1 }, + 0x27c8 => { + Name => 'SimpleTag', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' }, + }, + 0x5a3 => { Name => 'TagName', Format => 'utf8' }, + 0x47a => { Name => 'TagLanguage', Format => 'string' }, + 0x484 => { Name => 'TagDefault', Format => 'unsigned', PrintConv => \%noYes }, + 0x487 => { Name => 'TagString', Format => 'utf8' }, + 0x485 => { Name => 'TagBinary', Binary => 1 }, +# +# Spherical Video V2 (untested) +# + 0x7670 => { + Name => 'Projection', + SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Projection' }, + }, +); + +# Spherical video v2 projection tags (ref https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md) +%Image::ExifTool::Matroska::Projection = ( + GROUPS => { 2 => 'Video' }, + VARS => { NO_LOOKUP => 1 }, # omit tags from lookup + NOTES => q{ + Projection tags defined by the Spherical Video V2 specification. See + L<https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md> + for the specification. + }, + 0x7671 => { + Name => 'ProjectionType', + Format => 'unsigned', + DataMember => 'ProjectionType', + RawConv => '$$self{ProjectionType} = $val', + PrintConv => { + 0 => 'Rectangular', + 1 => 'Equirectangular', + 2 => 'Cubemap', + 3 => 'Mesh', + }, + }, + # ProjectionPrivate in the spec + 0x7672 => [{ + Name => 'EquirectangularProj', + Condition => '$$self{ProjectionType} == 1', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::equi' }, + },{ + Name => 'CubemapProj', + Condition => '$$self{ProjectionType} == 2', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::cbmp' }, + },{ # (don't decode 3 because it is a PITA) + Name => 'ProjectionPrivate', + Binary => 1, + }], + 0x7673 => { Name => 'ProjectionPoseYaw', Format => 'float' }, + 0x7674 => { Name => 'ProjectionPosePitch', Format => 'float' }, + 0x7675 => { Name => 'ProjectionPoseRoll', Format => 'float' }, +); + +#------------------------------------------------------------------------------ +# Get variable-length Matroska integer +# Inputs: 0) data buffer, 1) position in data +# Returns: integer value and updates position, -1 for unknown/reserved value, +# or undef if no data left +sub GetVInt($$) +{ + return undef if $_[1] >= length $_[0]; + my $val = ord(substr($_[0], $_[1]++)); + my $num = 0; + unless ($val) { + return undef if $_[1] >= length $_[0]; + $val = ord(substr($_[0], $_[1]++)); + return undef unless $val; # can't be this large! + $num += 7; # 7 more bytes to read (we just read one) + } + my $mask = 0x7f; + while ($val == ($val & $mask)) { + $mask >>= 1; + ++$num; + } + $val = ($val & $mask); + my $unknown = ($val == $mask); + return undef if $_[1] + $num > length $_[0]; + while ($num) { + my $b = ord(substr($_[0], $_[1]++)); + $unknown = 0 if $b != 0xff; + $val = $val * 256 + $b; + --$num; + } + return $unknown ? -1 : $val; +} + +#------------------------------------------------------------------------------ +# Read information from a Matroska multimedia file (MKV, MKA, MKS) +# Inputs: 0) ExifTool object reference, 1) Directory information reference +# Returns: 1 on success, 0 if this wasn't a valid Matroska file +sub ProcessMKV($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $buf2, @dirEnd, $trackIndent, %trackTypes); + + $raf->Read($buff, 4) == 4 or return 0; + return 0 unless $buff =~ /^\x1a\x45\xdf\xa3/; + + # read in 64kB blocks (already read 4 bytes) + $raf->Read($buff, 65532) or return 0; + my $dataLen = length $buff; + my ($pos, $dataPos) = (0, 4); + + # verify header length + my $hlen = GetVInt($buff, $pos); + return 0 unless $hlen and $hlen > 0; + $pos + $hlen > $dataLen and $et->Warn('Truncated Matroska header'), return 1; + $et->SetFileType(); + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::Matroska::Main'); + + # set flag to process entire file (otherwise we stop at the first Cluster) + my $verbose = $et->Options('Verbose'); + my $processAll = ($verbose or $et->Options('Unknown') > 1); + $$et{TrackTypes} = \%trackTypes; # store Track types reference + my $oldIndent = $$et{INDENT}; + my $chapterNum = 0; + + # loop over all Matroska elements + for (;;) { + while (@dirEnd and $pos + $dataPos >= $dirEnd[-1][0]) { + pop @dirEnd; + # use INDENT to decide whether or not we are done this Track element + delete $$et{SET_GROUP1} if $trackIndent and $trackIndent eq $$et{INDENT}; + $$et{INDENT} = substr($$et{INDENT}, 0, -2); + } + # read more if we are getting close to the end of our buffer + # (24 more bytes should be enough to read this element header) + if ($pos + 24 > $dataLen and $raf->Read($buf2, 65536)) { + $buff = substr($buff, $pos) . $buf2; + undef $buf2; + $dataPos += $pos; + $dataLen = length $buff; + $pos = 0; + } + my $tag = GetVInt($buff, $pos); + last unless defined $tag and $tag >= 0; + my $size = GetVInt($buff, $pos); + last unless defined $size; + my $unknownSize; + $size < 0 and $unknownSize = 1, $size = 1e20; + if (@dirEnd and $pos + $dataPos + $size > $dirEnd[-1][0]) { + $et->Warn("Invalid or corrupted $dirEnd[-1][1] master element"); + $pos = $dirEnd[-1][0] - $dataPos; + if ($pos < 0 or $pos > $dataLen) { + $buff = ''; + $dataPos += $pos; + $dataLen = 0; + $pos = 0; + $raf->Seek($dataPos, 0) or last; + } + next; + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + # just fall through into the contained EBML elements + if ($tagInfo and $$tagInfo{SubDirectory}) { + # stop processing at first cluster unless we are in verbose mode + last if $$tagInfo{Name} eq 'Cluster' and not $processAll; + $$et{INDENT} .= '| '; + $et->VerboseDir($$tagTablePtr{$tag}{Name}, undef, $size); + push @dirEnd, [ $pos + $dataPos + $size, $$tagInfo{Name} ]; + if ($$tagInfo{Name} eq 'ChapterAtom') { + $$et{SET_GROUP1} = 'Chapter' . (++$chapterNum); + $trackIndent = $$et{INDENT}; + } + next; + } + last if $unknownSize; + if ($pos + $size > $dataLen) { + # how much more do we need to read? + my $more = $pos + $size - $dataLen; + # just skip unknown and large data blocks + if (not $tagInfo or $more > 10000000) { + # don't try to skip very large blocks unless LargeFileSupport is enabled + last if $more >= 0x80000000 and not $et->Options('LargeFileSupport'); + $raf->Seek($more, 1) or last; + $buff = ''; + $dataPos += $dataLen + $more; + $dataLen = 0; + $pos = 0; + next; + } else { + # read data in multiples of 64kB + $more = (int($more / 65536) + 1) * 65536; + if ($raf->Read($buf2, $more)) { + $buff = substr($buff, $pos) . $buf2; + undef $buf2; + $dataPos += $pos; + $dataLen = length $buff; + $pos = 0; + } + last if $pos + $size > $dataLen; + } + } + unless ($tagInfo) { + # ignore the element + $pos += $size; + next; + } + my $val; + if ($$tagInfo{Format}) { + my $fmt = $$tagInfo{Format}; + if ($fmt eq 'string' or $fmt eq 'utf8') { + ($val = substr($buff, $pos, $size)) =~ s/\0.*//s; + $val = $et->Decode($val, 'UTF8') if $fmt eq 'utf8'; + } elsif ($fmt eq 'float') { + if ($size == 4) { + $val = GetFloat(\$buff, $pos); + } elsif ($size == 8) { + $val = GetDouble(\$buff, $pos); + } else { + $et->Warn("Illegal float size ($size)"); + } + } else { + my @vals = unpack("x${pos}C$size", $buff); + $val = 0; + if ($fmt eq 'signed' or $fmt eq 'date') { + my $over = 1; + foreach (@vals) { + $val = $val * 256 + $_; + $over *= 256; + } + # interpret negative numbers + $val -= $over if $vals[0] & 0x80; + # convert dates (nanoseconds since 2001:01:01) + if ($fmt eq 'date') { + my $t = $val / 1e9; + my $f = $t - int($t); # fractional seconds + $f =~ s/^\d+//; # remove leading zero + # (8 leap days between 1970 and 2001) + $t += (((2001-1970)*365+8)*24*3600); + $val = Image::ExifTool::ConvertUnixTime($t) . $f . 'Z'; + } + } else { # must be unsigned + $val = $val * 256 + $_ foreach @vals; + } + } + # set group1 to Track/Chapter number + if ($$tagInfo{Name} eq 'TrackNumber') { + $$et{SET_GROUP1} = 'Track' . $val; + $trackIndent = $$et{INDENT}; + } + } + my %parms = ( + DataPt => \$buff, + DataPos => $dataPos, + Start => $pos, + Size => $size, + ); + if ($$tagInfo{NoSave}) { + $et->VerboseInfo($tag, $tagInfo, Value => $val, %parms) if $verbose; + } else { + $et->HandleTag($tagTablePtr, $tag, $val, %parms); + } + $pos += $size; # step to next element + } + $$et{INDENT} = $oldIndent; + delete $$et{SET_GROUP1}; + # override file type if necessary based on existing track types + unless ($trackTypes{0x01} or $trackTypes{0x03}) { # video or complex? + if ($trackTypes{0x02}) { # audio? + $et->OverrideFileType('MKA'); + } elsif ($trackTypes{0x11}) { # subtitle? + $et->OverrideFileType('MKS'); + } + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Matroska - Read meta information from Matroska files + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read meta +information from Matroska multimedia files (MKA, MKV, MKS and WEBM). + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.matroska.org/technical/specs/index.html> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Matroska Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Microsoft.pm b/lib/Image/ExifTool/Microsoft.pm new file mode 100644 index 0000000..e0ecdb5 --- /dev/null +++ b/lib/Image/ExifTool/Microsoft.pm @@ -0,0 +1,1122 @@ +#------------------------------------------------------------------------------ +# File: Microsoft.pm +# +# Description: Definitions for custom Microsoft tags +# +# Revisions: 2010/10/01 - P. Harvey Created +# 2011/10/05 - PH Added ProcessXtra() +# 2021/02/23 - PH Added abiltity to write Xtra tags +# +# References: 1) http://research.microsoft.com/en-us/um/redmond/groups/ivm/hdview/hdmetadataspec.htm +#------------------------------------------------------------------------------ + +package Image::ExifTool::Microsoft; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::XMP; + +$VERSION = '1.23'; + +sub ProcessXtra($$$); +sub WriteXtra($$$); +sub CheckXtra($$$); + +# tags written by Microsoft HDView (ref 1) +%Image::ExifTool::Microsoft::Stitch = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'float', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + NOTES => q{ + Information found in the Microsoft custom EXIF tag 0x4748, as written by + Windows Live Photo Gallery. + }, + 0 => { + Name => 'PanoramicStitchVersion', + Format => 'int32u', + }, + 1 => { + Name => 'PanoramicStitchCameraMotion', + Format => 'int32u', + PrintConv => { + 2 => 'Rigid Scale', + 3 => 'Affine', + 4 => '3D Rotation', + 5 => 'Homography', + }, + }, + 2 => { + Name => 'PanoramicStitchMapType', + Format => 'int32u', + PrintConv => { + 0 => 'Perspective', + 1 => 'Horizontal Cylindrical', + 2 => 'Horizontal Spherical', + 257 => 'Vertical Cylindrical', + 258 => 'Vertical Spherical', + }, + }, + 3 => 'PanoramicStitchTheta0', + 4 => 'PanoramicStitchTheta1', + 5 => 'PanoramicStitchPhi0', + 6 => 'PanoramicStitchPhi1', +); + +# Microsoft Photo schema properties (MicrosoftPhoto) (ref PH) +%Image::ExifTool::Microsoft::XMP = ( + %Image::ExifTool::XMP::xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-microsoft', 2 => 'Image' }, + NAMESPACE => 'MicrosoftPhoto', + TABLE_DESC => 'XMP Microsoft', + VARS => { NO_ID => 1 }, + NOTES => q{ + Microsoft Photo 1.0 schema XMP tags. This is likely not a complete list, + but represents tags which have been observed in sample images. The actual + namespace prefix is "MicrosoftPhoto", but ExifTool shortens this in the + family 1 group name. + }, + CameraSerialNumber => { }, + DateAcquired => { Groups => { 2 => 'Time' }, %Image::ExifTool::XMP::dateTimeInfo }, + FlashManufacturer => { }, + FlashModel => { }, + LastKeywordIPTC => { List => 'Bag' }, + LastKeywordXMP => { List => 'Bag' }, + LensManufacturer => { }, + LensModel => { Avoid => 1 }, + Rating => { + Name => 'RatingPercent', + Notes => q{ + XMP-xmp:Rating values of 1,2,3,4 and 5 stars correspond to RatingPercent + values of 1,25,50,75 and 99 respectively + }, + }, + CreatorAppId => { Name => 'CreatorAppID' }, + CreatorOpenWithUIOptions => { }, + ItemSubType => { }, +); + +# Microsoft Photo 1.1 schema properties (MP1 - written as 'prefix0' by MSPhoto) (ref PH) +%Image::ExifTool::Microsoft::MP1 = ( + %Image::ExifTool::XMP::xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-MP1', 2 => 'Image' }, + NAMESPACE => 'MP1', + TABLE_DESC => 'XMP Microsoft Photo', + VARS => { NO_ID => 1 }, + NOTES => q{ + Microsoft Photo 1.1 schema XMP tags which have been observed. + }, + PanoramicStitchCameraMotion => { + PrintConv => { + 'RigidScale' => 'Rigid Scale', + 'Affine' => 'Affine', + '3DRotation' => '3D Rotation', + 'Homography' => 'Homography', + }, + }, + PanoramicStitchMapType => { + PrintConv => { + 'Perspective' => 'Perspective', + 'Horizontal-Cylindrical' => 'Horizontal Cylindrical', + 'Horizontal-Spherical' => 'Horizontal Spherical', + 'Vertical-Cylindrical' => 'Vertical Cylindrical', + 'Vertical-Spherical' => 'Vertical Spherical', + }, + }, + PanoramicStitchPhi0 => { Writable => 'real' }, + PanoramicStitchPhi1 => { Writable => 'real' }, + PanoramicStitchTheta0 => { Writable => 'real' }, + PanoramicStitchTheta1 => { Writable => 'real' }, + WhiteBalance0 => { Writable => 'real' }, + WhiteBalance1 => { Writable => 'real' }, + WhiteBalance2 => { Writable => 'real' }, + Brightness => { Avoid => 1 }, + Contrast => { Avoid => 1 }, + CameraModelID => { Avoid => 1 }, + ExposureCompensation => { Avoid => 1 }, + PipelineVersion => { }, + StreamType => { }, +); + +# Microsoft Photo 1.2 schema properties (MP) (ref PH) +# (also ref http://msdn.microsoft.com/en-us/library/windows/desktop/ee719905(v=vs.85).aspx) +my %sRegions = ( + STRUCT_NAME => 'Microsoft Regions', + NAMESPACE => 'MPReg', + NOTES => q{ + Note that PersonLiveIdCID element is called PersonLiveCID according to the + Microsoft specification, but in practice their software actually writes + PersonLiveIdCID, so ExifTool uses this too. + }, + Rectangle => { }, + PersonDisplayName => { }, + PersonEmailDigest => { }, + PersonLiveIdCID => { }, # (see https://exiftool.org/forum/index.php?topic=4274.msg20368#msg20368) + PersonSourceID => { }, +); +%Image::ExifTool::Microsoft::MP = ( + %Image::ExifTool::XMP::xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-MP', 2 => 'Image' }, + NAMESPACE => 'MP', + TABLE_DESC => 'XMP Microsoft Photo', + VARS => { NO_ID => 1 }, + NOTES => q{ + Microsoft Photo 1.2 schema XMP tags which have been observed. + }, + RegionInfo => { + Name => 'RegionInfoMP', + Struct => { + STRUCT_NAME => 'Microsoft RegionInfo', + NAMESPACE => 'MPRI', + Regions => { Struct => \%sRegions, List => 'Bag' }, + DateRegionsValid => { + Writable => 'date', + Shift => 'Time', + Groups => { 2 => 'Time'}, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', + }, + }, + }, + # remove "MP" from tag name (was added only to avoid conflict with XMP-mwg-rs:RegionInfo) + RegionInfoRegions => { Flat => 1, Name => 'RegionInfoRegions' }, + RegionInfoDateRegionsValid => { Flat => 1, Name => 'RegionInfoDateRegionsValid' }, + # shorten flattened Regions tag names to make them easier to use + RegionInfoRegionsRectangle => { Flat => 1, Name => 'RegionRectangle' }, + RegionInfoRegionsPersonDisplayName => { Flat => 1, Name => 'RegionPersonDisplayName' }, + RegionInfoRegionsPersonEmailDigest => { Flat => 1, Name => 'RegionPersonEmailDigest' }, + RegionInfoRegionsPersonLiveIdCID => { Flat => 1, Name => 'RegionPersonLiveIdCID' }, + RegionInfoRegionsPersonSourceID => { Flat => 1, Name => 'RegionPersonSourceID' }, +); + +# Xtra tags written in MP4 files written by Microsoft Windows Media Player +# (ref http://msdn.microsoft.com/en-us/library/windows/desktop/dd562330(v=VS.85).aspx) +# Note: These tags are closely related to tags in Image::ExifTool::ASF::ExtendedDescr +# and Image::ExifTool::WTV::Metadata +%Image::ExifTool::Microsoft::Xtra = ( + PROCESS_PROC => \&ProcessXtra, + WRITE_PROC => \&WriteXtra, + CHECK_PROC => \&CheckXtra, + WRITE_GROUP => 'Microsoft', + AVOID => 1, + GROUPS => { 0 => 'QuickTime', 2 => 'Video' }, + VARS => { NO_ID => 1 }, + NOTES => q{ + Tags found in the Microsoft "Xtra" atom of QuickTime videos. Tag ID's are + not shown because some are unruly GUID's. Currently most of these tags are + not writable because the Microsoft documentation is poor and samples were + not available, but more tags may be made writable in the future if samples + are provided. Note that writable tags in this table are are flagged to + "Avoid", which means that other more common tags will be written instead if + possible unless the Microsoft group is specified explicitly. + }, + Abstract => { }, + AcquisitionTime => { Groups => { 2 => 'Time' } }, + AcquisitionTimeDay => { Groups => { 2 => 'Time' } }, + AcquisitionTimeMonth => { Groups => { 2 => 'Time' } }, + AcquisitionTimeYear => { Groups => { 2 => 'Time' } }, + AcquisitionTimeYearMonth => { Groups => { 2 => 'Time' } }, + AcquisitionTimeYearMonthDay => { Groups => { 2 => 'Time' } }, + AlbumArtistSortOrder => { }, + AlbumID => { }, + AlbumIDAlbumArtist => { }, + AlbumTitleSortOrder => { }, + AlternateSourceURL => { }, + AudioBitrate => { }, + AudioFormat => { }, + Author => { Groups => { 2 => 'Author' } }, + AuthorSortOrder => { }, + AverageLevel => { }, + Bitrate => { }, + BuyNow => { }, + BuyTickets => { }, + CallLetters => { }, + CameraManufacturer => { }, + CameraModel => { }, + CDTrackEnabled => { }, + Channels => { }, + chapterNum => { }, + Comment => { }, + ContentDistributorDuration => { }, + Copyright => { Groups => { 2 => 'Author' } }, + Count => { }, + CurrentBitrate => { }, + Description => { }, + DisplayArtist => { }, + DLNAServerUDN => { }, + DLNASourceURI => { }, + DRMKeyID => { }, + DRMIndividualizedVersion => { }, + DTCPIPHost => { }, + DTCPIPPort => { }, + Duration => { }, + DVDID => { }, + Event => { }, + FileSize => { }, + FileType => { }, + FourCC => { }, + FormatTag => { }, + FrameRate => { }, + Frequency => { }, + IsNetworkFeed => { }, + Is_Protected => 'IsProtected', + IsVBR => { }, + LeadPerformer => { }, + LibraryID => { }, + LibraryName => { }, + Location => { }, + MediaContentTypes => { }, + MediaType => { }, + ModifiedBy => { }, + MoreInfo => { }, + PartOfSet => { }, + PeakValue => { }, + PixelAspectRatioX => { }, + PixelAspectRatioY => { }, + PlaylistIndex => { }, + Provider => { }, + ProviderLogoURL => { }, + ProviderURL => { }, + RadioBand => { }, + RadioFormat => { }, + RatingOrg => { }, + RecordingTime => { Groups => { 2 => 'Time' } }, + RecordingTimeDay => { Groups => { 2 => 'Time' } }, + RecordingTimeMonth => { Groups => { 2 => 'Time' } }, + RecordingTimeYear => { Groups => { 2 => 'Time' } }, + RecordingTimeYearMonth => { Groups => { 2 => 'Time' } }, + RecordingTimeYearMonthDay => { Groups => { 2 => 'Time' } }, + ReleaseDate => { Groups => { 2 => 'Time' } }, + ReleaseDateDay => { Groups => { 2 => 'Time' } }, + ReleaseDateMonth => { Groups => { 2 => 'Time' } }, + ReleaseDateYear => { Groups => { 2 => 'Time' } }, + ReleaseDateYearMonth => { Groups => { 2 => 'Time' } }, + ReleaseDateYearMonthDay => { Groups => { 2 => 'Time' } }, + RequestState => { }, + ShadowFilePath => { }, + SourceURL => { }, + Subject => { }, + SyncState => { }, + Sync01 => { }, + Sync02 => { }, + Sync03 => { }, + Sync04 => { }, + Sync05 => { }, + Sync06 => { }, + Sync07 => { }, + Sync08 => { }, + Sync09 => { }, + Sync10 => { }, + Sync11 => { }, + Sync12 => { }, + Sync13 => { }, + Sync14 => { }, + Sync15 => { }, + Sync16 => { }, + SyncOnly => { }, + Temporary => { }, + Title => { }, + titleNum => { }, + TitleSortOrder => { }, + TotalDuration => { }, + TrackingID => { }, + UserCustom1 => { }, + UserCustom2 => { }, + UserEffectiveRating => { }, + UserLastPlayedTime => { }, + UserPlayCount => { }, + UserPlaycountAfternoon => { }, + UserPlaycountEvening => { }, + UserPlaycountMorning => { }, + UserPlaycountNight => { }, + UserPlaycountWeekday => { }, + UserPlaycountWeekend => { }, + UserRating => { }, + UserServiceRating => { }, + VideoBitrate => { }, + VideoFormat => { }, + 'WM/AlbumArtist' => { Name => 'AlbumArtist', Writable => 'Unicode' }, # (NC) + 'WM/AlbumCoverURL' => { Name => 'AlbumCoverURL', Writable => 'Unicode' }, # (NC) + 'WM/AlbumTitle' => { Name => 'AlbumTitle', Writable => 'Unicode' }, # (NC) + 'WM/BeatsPerMinute' => 'BeatsPerMinute', + 'WM/Category' => { Name => 'Category', Writable => 'Unicode', List => 1 }, + 'WM/Composer' => { Name => 'Composer', Writable => 'Unicode' }, # (NC) + 'WM/Conductor' => { Name => 'Conductor', Writable => 'Unicode', List => 1 }, + 'WM/ContentDistributor' => { Name => 'ContentDistributor', Writable => 'Unicode' }, + 'WM/ContentDistributorType' => 'ContentDistributorType', + 'WM/ContentGroupDescription'=> 'ContentGroupDescription', + 'WM/Director' => { Name => 'Director', Writable => 'Unicode', List => 1 }, + 'WM/EncodingTime' => { + Name => 'EncodingTime', + Groups => { 2 => 'Time' }, + Shift => 'Time', + Writable => 'date', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + 'WM/Genre' => 'Genre', + 'WM/GenreID' => 'GenreID', + 'WM/InitialKey' => { Name => 'InitialKey', Writable => 'Unicode' }, + 'WM/Language' => 'Language', + 'WM/Lyrics' => 'Lyrics', + 'WM/MCDI' => 'MCDI', + 'WM/MediaClassPrimaryID' => { + Name => 'MediaClassPrimaryID', + Writable => 'GUID', + PrintConv => { #http://msdn.microsoft.com/en-us/library/windows/desktop/dd757960(v=vs.85).aspx + 'D1607DBC-E323-4BE2-86A1-48A42A28441E' => 'Music', + 'DB9830BD-3AB3-4FAB-8A37-1A995F7FF74B' => 'Video', + '01CD0F29-DA4E-4157-897B-6275D50C4F11' => 'Audio (not music)', + 'FCF24A76-9A57-4036-990D-E35DD8B244E1' => 'Other (not audio or video)', + }, + }, + 'WM/MediaClassSecondaryID' => { + Name => 'MediaClassSecondaryID', + Writable => 'GUID', + PrintConv => { #http://msdn.microsoft.com/en-us/library/windows/desktop/dd757960(v=vs.85).aspx + 'E0236BEB-C281-4EDE-A36D-7AF76A3D45B5' => 'Audio Book', + '3A172A13-2BD9-4831-835B-114F6A95943F' => 'Spoken Word', + '6677DB9B-E5A0-4063-A1AD-ACEB52840CF1' => 'Audio News', + '1B824A67-3F80-4E3E-9CDE-F7361B0F5F1B' => 'Talk Show', + '1FE2E091-4E1E-40CE-B22D-348C732E0B10' => 'Video News', + 'D6DE1D88-C77C-4593-BFBC-9C61E8C373E3' => 'Web-based Video', + '00033368-5009-4AC3-A820-5D2D09A4E7C1' => 'Sound Clip from Game', + 'F24FF731-96FC-4D0F-A2F5-5A3483682B1A' => 'Song from Game', + 'E3E689E2-BA8C-4330-96DF-A0EEEFFA6876' => 'Music Video', + 'B76628F4-300D-443D-9CB5-01C285109DAF' => 'Home Movie', + 'A9B87FC9-BD47-4BF0-AC4F-655B89F7D868' => 'Feature Film', + 'BA7F258A-62F7-47A9-B21F-4651C42A000E' => 'TV Show', + '44051B5B-B103-4B5C-92AB-93060A9463F0' => 'Corporate Video', + '0B710218-8C0C-475E-AF73-4C41C0C8F8CE' => 'Home Video from Pictures', + '00000000-0000-0000-0000-000000000000' => 'Unknown Content', #PH + }, + }, + 'WM/MediaOriginalBroadcastDateTime' => { + Name => 'MediaOriginalBroadcastDateTime', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 'WM/MediaOriginalChannel' => 'MediaOriginalChannel', + 'WM/MediaStationName' => 'MediaStationName', + 'WM/Mood' => { Name => 'Mood', Writable => 'Unicode' }, + 'WM/OriginalAlbumTitle' => { Name => 'OriginalAlbumTitle', Writable => 'Unicode' }, # (NC) + 'WM/OriginalArtist' => { Name => 'OriginalArtist', Writable => 'Unicode' }, # (NC) + 'WM/OriginalLyricist' => { Name => 'OriginalLyricist', Writable => 'Unicode' }, # (NC) + 'WM/ParentalRating' => { Name => 'ParentalRating', Writable => 'Unicode' }, + 'WM/PartOfSet' => 'PartOfSet', + 'WM/Period' => { Name => 'Period', Writable => 'Unicode' }, + 'WM/Producer' => { Name => 'Producer', Writable => 'Unicode', List => 1 }, + 'WM/ProtectionType' => 'ProtectionType', + 'WM/Provider' => { Name => 'Provider', Writable => 'Unicode' }, # (NC) + 'WM/ProviderRating' => 'ProviderRating', + 'WM/ProviderStyle' => 'ProviderStyle', + 'WM/Publisher' => { Name => 'Publisher', Writable => 'Unicode' }, # (multiple entries separated by semicolon) + 'WM/SharedUserRating' => { Name => 'SharedUserRating', Writable => 'int64u' }, + 'WM/SubscriptionContentID' => 'SubscriptionContentID', + 'WM/SubTitle' => { Name => 'Subtitle', Writable => 'Unicode' }, + 'WM/SubTitleDescription' => 'SubtitleDescription', + 'WM/TrackNumber' => 'TrackNumber', + 'WM/UniqueFileIdentifier' => 'UniqueFileIdentifier', + 'WM/VideoFrameRate' => 'VideoFrameRate', + 'WM/VideoHeight' => 'VideoHeight', + 'WM/VideoWidth' => 'VideoWidth', + 'WM/WMCollectionGroupID' => 'WMCollectionGroupID', + 'WM/WMCollectionID' => 'WMCollectionID', + 'WM/WMContentID' => 'WMContentID', + 'WM/WMShadowFileSourceDRMType' => 'WMShadowFileSourceDRMType', + 'WM/WMShadowFileSourceFileType' => 'WMShadowFileSourceFileType', + 'WM/Writer' => { Name => 'Writer', Groups => { 2 => 'Author' }, Writable => 'Unicode' }, # (NC) + 'WM/Year' => { Name => 'Year', Groups => { 2 => 'Time' } }, + 'WM/PromotionURL' => { Name => 'PromotionURL',Writable => 'Unicode' }, + 'WM/AuthorURL' => { Name => 'AuthorURL', Groups => { 2 => 'Author' }, Writable => 'Unicode' }, + 'WM/EncodedBy', => { Name => 'EncodedBy', Writable => 'Unicode' }, + + # I can't find documentation for the following tags in videos, + # but the tag ID's correspond to Microsoft property GUID+ID's + # References: + # http://msdn.microsoft.com/en-us/library/cc251929%28v=prot.10%29.aspx + # http://multi-rename-script.googlecode.com/svn-history/r4/trunk/plugins/ShellDetails/ShellDetails.ini + # I have observed only 1 so far: + '{2CBAA8F5-D81F-47CA-B17A-F8D822300131} 100' => { + Name => 'DateAcquired', # (seems to be when videos are downloaded from the camera) + Groups => { 2 => 'Time' }, + Shift => 'Time', + Writable => 'vt_filetime', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef)', + }, + # the following have not yet been observed... + '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 10' => 'Name', + '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 12' => 'Size', + '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 4' => 'Type', + '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 14' => { + Name => 'DateModified', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 15' => { + Name => 'DateCreated', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 16' => { + Name => 'DateAccessed', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 13' => 'Attributes', + '{D8C3986F-813B-449C-845D-87B95D674ADE} 2' => 'Status', + '{9B174B34-40FF-11D2-A27E-00C04FC30871} 4' => 'Owner', + '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 4' => { + Name => 'Author', + Groups => { 2 => 'Author' }, + }, + '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 2' => 'Title', + '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 3' => 'Subject', + '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 2' => 'Category', + '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 14' => 'Pages', + '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 6' => 'Comments', + '{64440492-4C8B-11D1-8B70-080036B11A03} 11' => { + Name => 'Copyright', + Groups => { 2 => 'Author' }, + }, + '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 2' => 'Artist', + '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 4' => 'AlbumTitle', + '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 5' => { + Name => 'Year', + Groups => { 2 => 'Time' }, + }, + '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 7' => 'TrackNumber', + '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 11' => 'Genre', + '{64440490-4C8B-11D1-8B70-080036B11A03} 3' => 'Duration', + '{64440490-4C8B-11D1-8B70-080036B11A03} 4' => 'Bitrate', + '{AEAC19E4-89AE-4508-B9B7-BB867ABEE2ED} 2' => 'Protected', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 272' => 'CameraModel', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 36867' => { + Name => 'DatePictureTaken', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + '{6444048F-4C8B-11D1-8B70-080036B11A03} 13' => 'Dimensions', + '{6444048F-4C8B-11D1-8B70-080036B11A03} 3' => 'Untitled0', + '{6444048F-4C8B-11D1-8B70-080036B11A03} 4' => 'Untitled1', + '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 2' => 'EpisodeName', + '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 3' => 'ProgramDescription', + '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 12' => 'Untitled2', + '{64440490-4C8B-11D1-8B70-080036B11A03} 6' => 'AudioSampleSize', + '{64440490-4C8B-11D1-8B70-080036B11A03} 5' => 'AudioSampleRate', + '{64440490-4C8B-11D1-8B70-080036B11A03} 7' => 'Channels', + '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 15' => 'Company', + '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 3' => 'Description', + '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 4' => 'FileVersion', + '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 7' => 'ProductName', + '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 8' => 'ProductVersion', + '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 5' => 'Keywords', + '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 11' => 'Type', + '{6D24888F-4718-4BDA-AFED-EA0FB4386CD8} 100' => 'OfflineStatus', + '{A94688B6-7D9F-4570-A648-E3DFC0AB2B3F} 100' => 'OfflineAvailability', + '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 9' => 'PerceivedType', + '{1E3EE840-BC2B-476C-8237-2ACD1A839B22} 3' => 'Kinds', + '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 36' => 'Conductors', + '{64440492-4C8B-11D1-8B70-080036B11A03} 9' => 'Rating', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 271' => 'CameraMaker', + '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 18' => 'ProgramName', + '{293CA35A-09AA-4DD2-B180-1FE245728A52} 100' => 'Duration', + '{BFEE9149-E3E2-49A7-A862-C05988145CEC} 100' => 'IsOnline', + '{315B9C8D-80A9-4EF9-AE16-8E746DA51D70} 100' => 'IsRecurring', + '{F6272D18-CECC-40B1-B26A-3911717AA7BD} 100' => 'Location', + '{D55BAE5A-3892-417A-A649-C6AC5AAAEAB3} 100' => 'OptionalAttendeeAddresses', + '{09429607-582D-437F-84C3-DE93A2B24C3C} 100' => 'OptionalAttendees', + '{744C8242-4DF5-456C-AB9E-014EFB9021E3} 100' => 'OrganizerAddress', + '{AAA660F9-9865-458E-B484-01BC7FE3973E} 100' => 'OrganizerName', + '{72FC5BA4-24F9-4011-9F3F-ADD27AFAD818} 100' => 'ReminderTime', + '{0BA7D6C3-568D-4159-AB91-781A91FB71E5} 100' => 'RequiredAttendeeAddresses', + '{B33AF30B-F552-4584-936C-CB93E5CDA29F} 100' => 'RequiredAttendees', + '{00F58A38-C54B-4C40-8696-97235980EAE1} 100' => 'Resources', + '{5BF396D4-5EB2-466F-BDE9-2FB3F2361D6E} 100' => 'Free-busyStatus', + '{9B174B35-40FF-11D2-A27E-00C04FC30871} 3' => 'TotalSize', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 9' => 'AccountName', + '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 5' => 'Computer', + '{9AD5BADB-CEA7-4470-A03D-B84E51B9949E} 100' => 'Anniversary', + '{CD102C9C-5540-4A88-A6F6-64E4981C8CD1} 100' => 'AssistantsName', + '{9A93244D-A7AD-4FF8-9B99-45EE4CC09AF6} 100' => 'AssistantsPhone', + '{176DC63C-2688-4E89-8143-A347800F25E9} 47' => 'Birthday', + '{730FB6DD-CF7C-426B-A03F-BD166CC9EE24} 100' => 'BusinessAddress', + '{402B5934-EC5A-48C3-93E6-85E86A2D934E} 100' => 'BusinessCity', + '{B0B87314-FCF6-4FEB-8DFF-A50DA6AF561C} 100' => 'BusinessCountry-Region', + '{BC4E71CE-17F9-48D5-BEE9-021DF0EA5409} 100' => 'BusinessPOBox', + '{E1D4A09E-D758-4CD1-B6EC-34A8B5A73F80} 100' => 'BusinessPostalCode', + '{446F787F-10C4-41CB-A6C4-4D0343551597} 100' => 'BusinessStateOrProvince', + '{DDD1460F-C0BF-4553-8CE4-10433C908FB0} 100' => 'BusinessStreet', + '{91EFF6F3-2E27-42CA-933E-7C999FBE310B} 100' => 'BusinessFax', + '{56310920-2491-4919-99CE-EADB06FAFDB2} 100' => 'BusinessHomePage', + '{6A15E5A0-0A1E-4CD7-BB8C-D2F1B0C929BC} 100' => 'BusinessPhone', + '{BF53D1C3-49E0-4F7F-8567-5A821D8AC542} 100' => 'CallbackNumber', + '{8FDC6DEA-B929-412B-BA90-397A257465FE} 100' => 'CarPhone', + '{D4729704-8EF1-43EF-9024-2BD381187FD5} 100' => 'Children', + '{8589E481-6040-473D-B171-7FA89C2708ED} 100' => 'CompanyMainPhone', + '{FC9F7306-FF8F-4D49-9FB6-3FFE5C0951EC} 100' => 'Department', + '{F8FA7FA3-D12B-4785-8A4E-691A94F7A3E7} 100' => 'E-mailAddress', + '{38965063-EDC8-4268-8491-B7723172CF29} 100' => 'E-mail2', + '{644D37B4-E1B3-4BAD-B099-7E7C04966ACA} 100' => 'E-mail3', + '{84D8F337-981D-44B3-9615-C7596DBA17E3} 100' => 'E-mailList', + '{CC6F4F24-6083-4BD4-8754-674D0DE87AB8} 100' => 'E-mailDisplayName', + '{F1A24AA7-9CA7-40F6-89EC-97DEF9FFE8DB} 100' => 'FileAs', + '{14977844-6B49-4AAD-A714-A4513BF60460} 100' => 'FirstName', + '{635E9051-50A5-4BA2-B9DB-4ED056C77296} 100' => 'FullName', + '{3C8CEE58-D4F0-4CF9-B756-4E5D24447BCD} 100' => 'Gender', + '{176DC63C-2688-4E89-8143-A347800F25E9} 70' => 'GivenName', + '{5DC2253F-5E11-4ADF-9CFE-910DD01E3E70} 100' => 'Hobbies', + '{98F98354-617A-46B8-8560-5B1B64BF1F89} 100' => 'HomeAddress', + '{176DC63C-2688-4E89-8143-A347800F25E9} 65' => 'HomeCity', + '{08A65AA1-F4C9-43DD-9DDF-A33D8E7EAD85} 100' => 'HomeCountry-Region', + '{7B9F6399-0A3F-4B12-89BD-4ADC51C918AF} 100' => 'HomePOBox', + '{8AFCC170-8A46-4B53-9EEE-90BAE7151E62} 100' => 'HomePostalCode', + '{C89A23D0-7D6D-4EB8-87D4-776A82D493E5} 100' => 'HomeStateOrProvince', + '{0ADEF160-DB3F-4308-9A21-06237B16FA2A} 100' => 'HomeStreet', + '{660E04D6-81AB-4977-A09F-82313113AB26} 100' => 'HomeFax', + '{176DC63C-2688-4E89-8143-A347800F25E9} 20' => 'HomePhone', + '{D68DBD8A-3374-4B81-9972-3EC30682DB3D} 100' => 'IMAddresses', + '{F3D8F40D-50CB-44A2-9718-40CB9119495D} 100' => 'Initials', + '{176DC63C-2688-4E89-8143-A347800F25E9} 6' => 'JobTitle', + '{97B0AD89-DF49-49CC-834E-660974FD755B} 100' => 'Label', + '{8F367200-C270-457C-B1D4-E07C5BCD90C7} 100' => 'LastName', + '{C0AC206A-827E-4650-95AE-77E2BB74FCC9} 100' => 'MailingAddress', + '{176DC63C-2688-4E89-8143-A347800F25E9} 71' => 'MiddleName', + '{176DC63C-2688-4E89-8143-A347800F25E9} 35' => 'CellPhone', + '{176DC63C-2688-4E89-8143-A347800F25E9} 74' => 'Nickname', + '{176DC63C-2688-4E89-8143-A347800F25E9} 7' => 'OfficeLocation', + '{508161FA-313B-43D5-83A1-C1ACCF68622C} 100' => 'OtherAddress', + '{6E682923-7F7B-4F0C-A337-CFCA296687BF} 100' => 'OtherCity', + '{8F167568-0AAE-4322-8ED9-6055B7B0E398} 100' => 'OtherCountry-Region', + '{8B26EA41-058F-43F6-AECC-4035681CE977} 100' => 'OtherPOBox', + '{95C656C1-2ABF-4148-9ED3-9EC602E3B7CD} 100' => 'OtherPostalCode', + '{71B377D6-E570-425F-A170-809FAE73E54E} 100' => 'OtherStateOrProvince', + '{FF962609-B7D6-4999-862D-95180D529AEA} 100' => 'OtherStreet', + '{D6304E01-F8F5-4F45-8B15-D024A6296789} 100' => 'Pager', + '{176DC63C-2688-4E89-8143-A347800F25E9} 69' => 'PersonalTitle', + '{C8EA94F0-A9E3-4969-A94B-9C62A95324E0} 100' => 'City', + '{E53D799D-0F3F-466E-B2FF-74634A3CB7A4} 100' => 'Country-Region', + '{DE5EF3C7-46E1-484E-9999-62C5308394C1} 100' => 'POBox', + '{18BBD425-ECFD-46EF-B612-7B4A6034EDA0} 100' => 'PostalCode', + '{F1176DFE-7138-4640-8B4C-AE375DC70A6D} 100' => 'StateOrProvince', + '{63C25B20-96BE-488F-8788-C09C407AD812} 100' => 'Street', + '{176DC63C-2688-4E89-8143-A347800F25E9} 48' => 'PrimaryE-mail', + '{176DC63C-2688-4E89-8143-A347800F25E9} 25' => 'PrimaryPhone', + '{7268AF55-1CE4-4F6E-A41F-B6E4EF10E4A9} 100' => 'Profession', + '{9D2408B6-3167-422B-82B0-F583B7A7CFE3} 100' => 'Spouse', + '{176DC63C-2688-4E89-8143-A347800F25E9} 73' => 'Suffix', + '{AAF16BAC-2B55-45E6-9F6D-415EB94910DF} 100' => 'TTY-TTDPhone', + '{C554493C-C1F7-40C1-A76C-EF8C0614003E} 100' => 'Telex', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 18' => 'Webpage', + '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 27' => 'Status', + '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 26' => 'ContentType', + '{43F8D7B7-A444-4F87-9383-52271C9B915C} 100' => { + Name => 'DateArchived', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + '{72FAB781-ACDA-43E5-B155-B2434F85E678} 100' => { + Name => 'DateCompleted', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 18258' => { + Name => 'DateImported', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + '{276D7BB0-5B34-4FB0-AA4B-158ED12A1809} 100' => 'ClientID', + '{F334115E-DA1B-4509-9B3D-119504DC7ABB} 100' => 'Contributors', + '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 11' => 'LastPrinted', + '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 13' => { + Name => 'DateLastSaved', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + '{1E005EE6-BF27-428B-B01C-79676ACD2870} 100' => 'Division', + '{E08805C8-E395-40DF-80D2-54F0D6C43154} 100' => 'DocumentID', + '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 7' => 'Slides', + '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 10' => 'TotalEditingTime', + '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 15' => 'WordCount', + '{3F8472B5-E0AF-4DB2-8071-C53FE76AE7CE} 100' => 'DueDate', + '{C75FAA05-96FD-49E7-9CB4-9F601082D553} 100' => 'EndDate', + '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 12' => 'FileCount', + '{41CF5AE0-F75A-4806-BD87-59C7D9248EB9} 100' => 'WindowsFileName', + '{67DF94DE-0CA7-4D6F-B792-053A3E4F03CF} 100' => 'FlagColor', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 12' => 'FlagStatus', + '{9B174B35-40FF-11D2-A27E-00C04FC30871} 2' => 'SpaceFree', + '{6444048F-4C8B-11D1-8B70-080036B11A03} 7' => 'BitDepth', + '{6444048F-4C8B-11D1-8B70-080036B11A03} 5' => 'HorizontalResolution', + '{6444048F-4C8B-11D1-8B70-080036B11A03} 6' => 'VerticalResolution', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 11' => 'Importance', + '{F23F425C-71A1-4FA8-922F-678EA4A60408} 100' => 'IsAttachment', + '{5CDA5FC8-33EE-4FF3-9094-AE7BD8868C4D} 100' => 'IsDeleted', + '{5DA84765-E3FF-4278-86B0-A27967FBDD03} 100' => 'HasFlag', + '{A6F360D2-55F9-48DE-B909-620E090A647C} 100' => 'IsCompleted', + '{346C8BD1-2E6A-4C45-89A4-61B78E8E700F} 100' => 'Incomplete', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 10' => 'ReadStatus', + '{EF884C5B-2BFE-41BB-AAE5-76EEDF4F9902} 100' => 'Shared', + '{D0A04F0A-462A-48A4-BB2F-3706E88DBD7D} 100' => { + Name => 'Creator', + Groups => { 2 => 'Author' }, + }, + '{F7DB74B4-4287-4103-AFBA-F1B13DCD75CF} 100' => { + Name => 'Date', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 2' => 'FolderName', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 6' => 'FolderPath', + '{DABD30ED-0043-4789-A7F8-D013A4736622} 100' => 'Folder', + '{D4D0AA16-9948-41A4-AA85-D97FF9646993} 100' => 'Participants', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 7' => 'Path', + '{DEA7C82C-1D89-4A66-9427-A4E3DEBABCB1} 100' => 'ContactNames', + '{95BEB1FC-326D-4644-B396-CD3ED90E6DDF} 100' => 'EntryType', + '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 28' => 'Language', + '{5CBF2787-48CF-4208-B90E-EE5E5D420294} 23' => { + Name => 'DateVisited', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + '{5CBF2787-48CF-4208-B90E-EE5E5D420294} 21' => 'Description', + '{B9B4B3FC-2B51-4A42-B5D8-324146AFCF25} 3' => 'LinkStatus', + '{B9B4B3FC-2B51-4A42-B5D8-324146AFCF25} 2' => 'LinkTarget', + '{5CBF2787-48CF-4208-B90E-EE5E5D420294} 2' => 'URL', + '{2E4B640D-5019-46D8-8881-55414CC5CAA0} 100' => 'MediaCreated', + '{DE41CC29-6971-4290-B472-F59F2E2F31E2} 100' => { + Name => 'DateReleased', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + '{64440492-4C8B-11D1-8B70-080036B11A03} 36' => 'EncodedBy', + '{64440492-4C8B-11D1-8B70-080036B11A03} 22' => 'Producers', + '{64440492-4C8B-11D1-8B70-080036B11A03} 30' => 'Publisher', + '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 38' => 'Subtitle', + '{64440492-4C8B-11D1-8B70-080036B11A03} 34' => 'UserWebURL', + '{64440492-4C8B-11D1-8B70-080036B11A03} 23' => 'Writers', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 21' => 'Attachments', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 2' => 'BccAddresses', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 3' => 'BccNames', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 4' => 'CcAddresses', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 5' => 'CcNames', + '{DC8F80BD-AF1E-4289-85B6-3DFC1B493992} 100' => 'ConversationID', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 20' => { + Name => 'DateReceived', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 19' => { + Name => 'DateSent', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 13' => 'FromAddresses', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 14' => 'FromNames', + '{9C1FCF74-2D97-41BA-B4AE-CB2E3661A6E4} 8' => 'HasAttachments', + '{0BE1C8E7-1981-4676-AE14-FDD78F05A6E7} 100' => 'SenderAddress', + '{0DA41CFA-D224-4A18-AE2F-596158DB4B3A} 100' => 'SenderName', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 15' => 'Store', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 16' => 'ToAddresses', + '{BCCC8A3C-8CEF-42E5-9B1C-C69079398BC7} 100' => 'ToDoTitle', + '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 17' => 'ToNames', + '{FDF84370-031A-4ADD-9E91-0D775F1C6605} 100' => 'Mileage', + '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 13' => 'AlbumArtist', + '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 35' => 'Beats-per-minute', + '{64440492-4C8B-11D1-8B70-080036B11A03} 19' => 'Composers', + '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 34' => 'InitialKey', + '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 39' => 'Mood', + '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 37' => 'PartOfSet', + '{64440492-4C8B-11D1-8B70-080036B11A03} 31' => 'Period', + '{4776CAFA-BCE4-4CB1-A23E-265E76D8EB11} 100' => 'Color', + '{64440492-4C8B-11D1-8B70-080036B11A03} 21' => 'ParentalRating', + '{10984E0A-F9F2-4321-B7EF-BAF195AF4319} 100' => 'ParentalRatingReason', + '{9B174B35-40FF-11D2-A27E-00C04FC30871} 5' => 'SpaceUsed', + '{D35F743A-EB2E-47F2-A286-844132CB1427} 100' => 'ExifVersion', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 18248' => 'Event', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37380' => 'ExposureBias', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 34850' => 'ExposureProgram', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 33434' => 'ExposureTime', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 33437' => 'F-stop', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37385' => 'FlashMode', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37386' => 'FocalLength', + '{A0E74609-B84D-4F49-B860-462BD9971F98} 100' => 'FocalLength35mm', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 34855' => 'ISOSpeed', + '{E6DDCAF7-29C5-4F0A-9A68-D19412EC7090} 100' => 'LensMaker', + '{E1277516-2B5F-4869-89B1-2E585BD38B7A} 100' => 'LensModel', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37384' => 'LightSource', + '{08F6D7C2-E3F2-44FC-AF1E-5AA5C81A2D3E} 100' => 'MaxAperture', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37383' => 'MeteringMode', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 274' => 'Orientation', + '{6D217F6D-3F6A-4825-B470-5F03CA2FBE9B} 100' => 'ProgramMode', + '{49237325-A95A-4F67-B211-816B2D45D2E0} 100' => 'Saturation', + '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37382' => 'SubjectDistance', + '{EE3D3D8A-5381-4CFA-B13B-AAF66B5F4EC9} 100' => 'WhiteBalance', + '{9C1FCF74-2D97-41BA-B4AE-CB2E3661A6E4} 5' => 'Priority', + '{39A7F922-477C-48DE-8BC8-B28441E342E3} 100' => 'Project', + '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 7' => 'ChannelNumber', + '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 12' => 'ClosedCaptioning', + '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 13' => 'Rerun', + '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 14' => 'SAP', + '{4684FE97-8765-4842-9C13-F006447B178C} 100' => 'BroadcastDate', + '{A5477F61-7A82-4ECA-9DDE-98B69B2479B3} 100' => 'RecordingTime', + '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 5' => 'StationCallSign', + '{1B5439E7-EBA1-4AF8-BDD7-7AF1D4549493} 100' => 'StationName', + '{560C36C0-503A-11CF-BAA1-00004C752A9A} 2' => 'AutoSummary', + '{560C36C0-503A-11CF-BAA1-00004C752A9A} 3' => 'Summary', + '{49691C90-7E17-101A-A91C-08002B2ECDA9} 3' => 'SearchRanking', + '{F8D3F6AC-4874-42CB-BE59-AB454B30716A} 100' => 'Sensitivity', + '{EF884C5B-2BFE-41BB-AAE5-76EEDF4F9902} 200' => 'SharedWith', + '{668CDFA5-7A1B-4323-AE4B-E527393A1D81} 100' => 'Source', + '{48FD6EC8-8A12-4CDF-A03E-4EC5A511EDDE} 100' => 'StartDate', + '{D37D52C6-261C-4303-82B3-08B926AC6F12} 100' => 'BillingInformation', + '{084D8A0A-E6D5-40DE-BF1F-C8820E7C877C} 100' => 'Complete', + '{08C7CC5F-60F2-4494-AD75-55E3E0B5ADD0} 100' => 'TaskOwner', + '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 14' => 'TotalFileSize', + '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 9' => 'LegalTrademarks', + '{64440491-4C8B-11D1-8B70-080036B11A03} 10' => 'VideoCompression', + '{64440492-4C8B-11D1-8B70-080036B11A03} 20' => 'Directors', + '{64440491-4C8B-11D1-8B70-080036B11A03} 8' => 'DataRate', + '{64440491-4C8B-11D1-8B70-080036B11A03} 4' => 'FrameHeight', + '{64440491-4C8B-11D1-8B70-080036B11A03} 6' => 'FrameRate', + '{64440491-4C8B-11D1-8B70-080036B11A03} 3' => 'FrameWidth', + '{64440491-4C8B-11D1-8B70-080036B11A03} 43' => 'TotalBitrate', +); + +#------------------------------------------------------------------------------ +# check new value for Xtra tag +# Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref +# Returns: error string, or undef on success +sub CheckXtra($$$) +{ + my ($et, $tagInfo, $valPt) = @_; + my $format = $$tagInfo{Writable}; + return 'Unknown format' unless $format; + if ($format =~ /^int/) { + return 'Not an integer' unless Image::ExifTool::IsInt($$valPt); + } elsif ($format ne 'Unicode') { + my @vals = ($$valPt); + return 'Invalid format' unless WriteXtraValue($et, $tagInfo, \@vals); + } + return undef; +} + +#------------------------------------------------------------------------------ +# Decode value(s) in Microsoft Xtra tag +# Inputs: 0) ExifTool object ref, 1) value data +# Returns: Scalar context: decoded value, List context: 0) decoded value, 1) format string +sub ReadXtraValue($$) +{ + my ($et, $data) = @_; + my ($format, $i, @vals); + + return undef if length($data) < 10; + + # (version flags according to the reference, but looks more like a count - PH) + my $count = Get32u(\$data, 0); + # point to start of first value (after 4-byte count, 4-byte length and 2-byte type) + my $valPos = 10; + for ($i=0; ;) { + # (stored value includes size of $valLen and $valType, so subtract 6) + my $valLen = Get32u(\$data, $valPos - 6) - 6; + last if $valPos + $valLen > length($data); + my $valType = Get16u(\$data, $valPos - 2); + my $val = substr($data, $valPos, $valLen); + # Note: all dumb Microsoft values are little-endian inside a big-endian-format file + SetByteOrder('II'); + if ($valType == 8) { + $format = 'Unicode'; + $val = $et->Decode($val, 'UCS2'); + } elsif ($valType == 19 and $valLen == 8) { + $format = 'int64u'; + $val = Get64u(\$val, 0); + } elsif ($valType == 21 and $valLen == 8) { + $format = 'date'; + $val = Get64u(\$val, 0); + # convert time from 100 ns intervals since Jan 1, 1601 + $val = $val * 1e-7 - 11644473600 if $val; + # (the Nikon S100 uses UTC timezone, same as ASF - PH) + $val = Image::ExifTool::ConvertUnixTime($val, 1); + } elsif ($valType == 72 and $valLen == 16) { + $format = 'GUID'; + $val = uc unpack('H*',pack('NnnNN',unpack('VvvNN',$val))); + $val =~ s/(.{8})(.{4})(.{4})(.{4})/$1-$2-$3-$4-/; + } elsif ($valType == 65 and $valLen > 4) { #PH (empirical) + $format = 'variant'; + require Image::ExifTool::FlashPix; + my $vPos = 0; # (necessary because ReadFPXValue updates this) + # read entry as a VT_VARIANT (use FlashPix module for this) + $val = Image::ExifTool::FlashPix::ReadFPXValue($et, \$val, $vPos, + Image::ExifTool::FlashPix::VT_VARIANT(), $valLen, 1); + } else { + $format = "Unknown($valType)"; + } + SetByteOrder('MM'); # back to native QuickTime byte ordering + push @vals, $val; + last if ++$i >= $count; + $valPos += $valLen + 6; # step to next value + last if $valPos > length($data); + } + return wantarray ? (\@vals, $format) : \@vals; +} + +#------------------------------------------------------------------------------ +# Write a Microsoft Xtra value +# Inputs: 0) ExifTool object ref, 1) tagInfo ref, 2) reference to list of values +# Returns: new value binary data (or empty string) +sub WriteXtraValue($$$) +{ + my ($et, $tagInfo, $vals) = @_; + my $format = $$tagInfo{Writable}; + my $buff = ''; + my $count = 0; + my $val; + foreach $val (@$vals) { + SetByteOrder('II'); + my ($type, $dat); + if ($format eq 'Unicode') { + $dat = $et->Encode($val,'UCS2','II') . "\0\0"; # (must be null terminated) + $type = 8; + } elsif ($format eq 'int64u') { + if (Image::ExifTool::IsInt($val)) { + $dat = Set64u($val); + $type = 19; + } + } elsif ($format eq 'date') { + $dat = Image::ExifTool::GetUnixTime($val, 1); # (convert to UTC, NC) + if ($dat) { + # 100ns intervals since Jan 1, 1601 + $dat = Set64u(($dat + 11644473600) * 1e7); + $type = 21; + } + } elsif ($format eq 'vt_filetime') { # 'date' value inside a VT_VARIANT + $dat = Image::ExifTool::GetUnixTime($val); # (leave as local time, NC) + if ($dat) { + # 100ns intervals since Jan 1, 1601 + $dat = Set32u(64) . Set64u(($dat + 11644473600) * 1e7); + $type = 65; + } + } elsif ($format eq 'GUID') { + ($dat = $val) =~ tr/-//d; + if (length($dat) == 32) { + $dat = pack('VvvNN',unpack('NnnNN',pack('H*', $dat))); + $type = 72; + } + } else { + $et->WarnOnce("Error converting value for Microsoft:$$tagInfo{Name}"); + } + SetByteOrder('MM'); + if (defined $type) { + ++$count; + $buff .= Set32u(length($dat)+6) . Set16u($type) . $dat; + } + } + return $count ? Set32u($count) . $buff : ''; +} + +#------------------------------------------------------------------------------ +# Add new values to list +# Inputs: 0) ExifTool ref, 1) new value list ref, 2) nvHash ref +# Returns: true if something was added +sub AddNewValues($$$) +{ + my ($et, $vals, $nvHash) = @_; + my @newVals = $et->GetNewValue($nvHash) or return undef; + if ($$et{OPTIONS}{Verbose} > 1) { + $et->VPrint(1, " + Microsoft:$$nvHash{TagInfo}{Name} = $_\n") foreach @newVals; + } + push @$vals, @newVals; + return 1; +} + +#------------------------------------------------------------------------------ +# Write tags to a Microsoft Xtra MP4 atom +# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref +# Returns: Microsoft Xtra data block (may be empty if no Xtra data) or undef on error +sub WriteXtra($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access + + my $delGroup = ($$et{DEL_GROUP} and $$et{DEL_GROUP}{Microsoft}); + my $newTags = $et->GetNewTagInfoHash($tagTablePtr); + + return undef unless $delGroup or %$newTags; # don't rewrite if nothing to do + + my $dataPt = $$dirInfo{DataPt}; + my $dataLen = length $$dataPt; + my $newData = ''; + my $pos = 0; + my ($err, %done, $changed, $tag); + + if ($delGroup) { + $changed = 1 if $dataLen; + my $empty = ''; + $dataPt = $empty; + $dataLen = 0; + } + for (;;) { + last if $pos + 4 > $dataLen; + my $size = Get32u($dataPt, $pos); # (includes $size word) + ($size < 8 or $pos + $size > $dataLen) and $err=1, last; + my $tagLen = Get32u($dataPt, $pos + 4); + $tagLen + 18 > $size and $err=1, last; + $tag = substr($$dataPt, $pos + 8, $tagLen); + my @newVals; + while ($$newTags{$tag}) { + my $nvHash = $et->GetNewValueHash($$newTags{$tag}); + $$nvHash{CreateOnly} and delete($$newTags{$tag}), last; # don't edit this tag + my $valPos = $pos + 8 + $tagLen; + my $valLen = $size - 8 - $tagLen; + my $val = ReadXtraValue($et, substr($$dataPt, $valPos, $valLen)); + foreach $val (@$val) { + my $overwrite = $et->IsOverwriting($nvHash, $val); + $overwrite or push(@newVals, $val), next; + $et->VPrint(1, " - Microsoft:$$newTags{$tag}{Name} = $val\n"); + next if $done{$tag}; + $done{$tag} = 1; + AddNewValues($et, \@newVals, $nvHash); + } + # add to the end of the list if this was a List-type tag and we didn't delete anything + if (not $done{$tag} and $$newTags{$tag}{List}) { + AddNewValues($et, \@newVals, $nvHash) or last; + $done{$tag} = 1; + } + last; # (it was a cheap goto) + } + if ($done{$tag}) { + $changed = 1; + # write changed values + my $buff = WriteXtraValue($et, $$newTags{$tag}, \@newVals); + if (length $buff) { + $newData .= Set32u(8+length($tag)+length($buff)) . Set32u(length($tag)) . $tag . $buff; + } + } else { + # nothing changed; just copy over + $newData .= substr($$dataPt, $pos, $size); + } + $pos += $size; # step to next entry + } + if ($err) { + $et->Warn('Microsoft Xtra format error'); + return undef; + } + # add any new tags + foreach $tag (sort keys %$newTags) { + next if $done{$tag}; + my $nvHash = $et->GetNewValueHash($$newTags{$tag}); + next unless $$nvHash{IsCreating} and not $$nvHash{EditOnly}; + my @newVals; + AddNewValues($et, \@newVals, $nvHash) or next; + my $buff = WriteXtraValue($et, $$newTags{$tag}, \@newVals); + if (length $buff) { + $newData .= Set32u(8+length($tag)+length($buff)) . Set32u(length($tag)) . $tag . $buff; + $changed = 1; + } + } + if ($changed) { + ++$$et{CHANGED}; + } else { + undef $newData; + } + return $newData; +} + +#------------------------------------------------------------------------------ +# Extract information from Xtra MP4 atom +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +# Reference: http://code.google.com/p/mp4v2/ [since removed from trunk] +sub ProcessXtra($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{Base} || 0; + my $dataLen = $$dirInfo{DataLen}; + my $pos = 0; + $et->VerboseDir('Xtra', 0, $dataLen); + for (;;) { + last if $pos + 4 > $dataLen; + my $size = Get32u($dataPt, $pos); # (includes $size word) + last if $size < 8 or $pos + $size > $dataLen; + my $tagLen = Get32u($dataPt, $pos + 4); + last if $tagLen + 18 > $size; + my $valLen = $size - 8 - $tagLen; + if ($tagLen > 0 and $valLen > 0) { + my $tag = substr($$dataPt, $pos + 8, $tagLen); + my $valPos = $pos + 8 + $tagLen; + my ($val, $format) = ReadXtraValue($et, substr($$dataPt, $valPos, $valLen)); + last unless defined $val; + $val = $$val[0] if @$val == 1; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + unless ($tagInfo) { + # generate tag information for unrecognized tags + my $name = $tag; + $name =~ s{^WM/}{}; + # $name =~ tr/-_A-Za-z0-9//dc; + if ($name =~ /^[-\w]+$/) { + $tagInfo = { Name => ucfirst($name) }; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + $et->VPrint(0, $$et{INDENT}, "[adding Microsoft:$tag]\n"); + } + } + my $count = ref $val ? scalar @$val : 1; + $et->HandleTag($tagTablePtr, $tag, $val, + TagInfo => $tagInfo, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $valPos, + Size => $valLen, + Format => $format, + Extra => " count=$count", + ); + } + $pos += $size; # step to next entry + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Microsoft - Definitions for custom Microsoft tags + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Microsoft-specific EXIF and XMP tags, and routines to read/write Microsoft +Xtra tags in videos. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://research.microsoft.com/en-us/um/redmond/groups/ivm/hdview/hdmetadataspec.htm> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Microsoft Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Minolta.pm b/lib/Image/ExifTool/Minolta.pm new file mode 100644 index 0000000..c992520 --- /dev/null +++ b/lib/Image/ExifTool/Minolta.pm @@ -0,0 +1,2959 @@ +#------------------------------------------------------------------------------ +# File: Minolta.pm +# +# Description: Minolta EXIF maker notes tags +# +# Revisions: 04/06/2004 - P. Harvey Created +# 09/09/2005 - P. Harvey Added ability to write MRW files +# +# References: 1) http://www.dalibor.cz/minolta/makernote.htm +# 2) Jay Al-Saadi private communication (testing with A2) +# 3) Shingo Noguchi, PhotoXP (http://www.daifukuya.com/photoxp/) +# 5) http://www.cybercom.net/~dcoffin/dcraw/ +# 6) Pedro Corte-Real private communication +# 7) ExifTool forum post by bronek (http://www.cpanforum.com/posts/1118) +# 8) http://www.chauveau-central.net/mrw-format/ +# 9) CPAN Forum post by 'geve' (http://www.cpanforum.com/threads/2168) +# 10) http://homepage3.nifty.com/kamisaka/makernote/makernote_km.htm +# 11) http://www.dyxum.com/dforum/forum_posts.asp?TID=6371&PN=1 and +# http://www.dyxum.com/dAdmin/lenses/MakerNoteList_Public.asp?stro=makr +# http://dyxum.com/dforum/forum_posts.asp?TID=23435&PN=2 +# 12) http://www.minolta-forum.de/forum/index.php?showtopic=14914 +# 13) http://www.mhohner.de/minolta/lenses.php +# 14) Jeffery Small private communication (tests with 7D) +# 15) http://homepage3.nifty.com/kamisaka/makernote/makernote_sony.htm +# 16) Thomas Kassner private communication +# 17) Mladen Sever private communication +# 18) Olaf Ulrich private communication +# 19) Lukasz Stelmach private communication +# 20) Igal Milchtaich private communication (A100 firmware 1.04) +# 21) Jean-Michel Dubois private communication +# 22) http://www.mi-fo.de/forum/index.php?act=attach&type=post&id=6024 +# 23) Marcin Krol private communication +# 24) http://cpanforum.com/threads/12291 +# 26) https://exiftool.org/forum/index.php/topic,3521.0.html +# 27) https://exiftool.org/forum/index.php/topic,3833.0.html +# 28) Michael Reitinger private communication (RX100) +# 29) https://exiftool.org/forum/index.php/topic,4086.0.html +# IB) Iliah Borg private communication (LibRaw) +# JD) Jens Duttke private communication +# JR) Jos Roost private communication +# NJ) Niels Kristian Bech Jensen private communication +#------------------------------------------------------------------------------ + +package Image::ExifTool::Minolta; + +use strict; +use vars qw($VERSION %minoltaLensTypes %minoltaTeleconverters %minoltaColorMode + %sonyColorMode %minoltaSceneMode %afStatusInfo %metabonesID); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '2.87'; + +# Full list of product codes for Sony-compatible Minolta lenses +# (ref http://www.kb.sony.com/selfservice/documentLink.do?externalId=C1000570) +# NOTE: Unfortunately, these product codes sometimes do not match the first 4 +# digits of the lens ID +# 2578 AF 16mm F2.8 FISH-EYE +# 2579 AF 20mm F2.8 +# 2641 AF 20mm F2.8 NEW +# 2566 AF 24mm F2.8 +# 2642 AF 24mm F2.8 NEW +# 2596 AF 28mm F2 +# 2668 AF 28mm F2 NEW +# 2557 AF 28mm F2.8 +# 2591 AF 35mm F1.4 G +# 2666 AF 35mm F1.4 G NEW +# 2597 AF 35mm F2 +# 2667 AF 35mm F2 NEW +# 2562 AF 50mm F1.4 +# 2662 AF 50mm F1.4 NEW +# 2550 AF 50mm F1.7 +# 2613 AF 50mm F1.7 NEW +# 2592 AF 85mm F1.4 +# 2629 AF 85mm F1.4 G +# 2677 AF 85mm F1.4 G (D) +# 2689 AF 85mm F1.4 G (D) Limited +# 2598 AF 100mm F2 +# 2648 AF 100mm F2.8 SOFT +# 2556 AF 135mm F2.8 +# 2656 STF 135mm F2.8 [T4.5] +# 2593 AF APO 20 0mm F2.8 +# 2612 High Speed AF APO 200mm F2.8 G +# 2563 AF APO 300mm F2.8 +# 2608 High Speed AF APO 300mm F2.8 G +# 2674 AF APO 300mm F2.8 G(D) SSM +# 2640 AF APO 300mm F4 G +# 2651 AF APO 400mm F4.5 G +# 2572 AF REFLEX 500mm F8 +# 2565 AF APO 600mm F4 +# 2609 High Speed AF APO 600mm F4 G +# 2564 AF MACRO 50mm F2.8 +# 2638 AF MACRO 50mm F2.8 NEW +# 2675 AF MACRO 50mm F2.8 (D) +# 2646 AF MACRO 50mm F3.5 +# 2581 AF MACRO 100mm F2.8 +# 2639 AF MACRO 100mm F2.8 NEW +# 2676 AF MACRO 100mm F2.8 (D) +# 2658 AF APO TE LE MACRO 200mm F4 G +# 2594 AF MACRO ZOOM 1x-3x F1.7-2.8 +# 2695 AF 17-35mm F2.8-4 (D) +# 2654 AF 17-35mm F3.5 G +# 2657 AF 20-35mm F3.5-4.5 +# 2558 AF 24-50mm F4 +# 2632 AF 24-50mm F4 NEW +# 2636 AF 24-85mm F3.5-4.5 +# 2660 AF 24-85mm F3.5-4.5 NEW +# 2672 AF 24-105mm F3.5-4.5 (D) +# 2620 AF 28-70mm F2.8 G +# 2696 AF 28-75mm F2.8 (D) +# 2659 AF 28-80mm F3.5-5.6 +# 2670 AF 28-80mm F3.5-5.6 II +# 2683 AF 28-80mm F3.5-5.6 (D) +# 2633 AF 28-80mm F4-5.6 +# 2552 AF 28-85mm F3.5-4.5 +# 2586 AF 28-85mm F3.5-4.5 NEW +# 2692 AF 28-100mm F3.5-5.6 (D) +# 2635 AF 28-105mm F3.5-4.5 +# 2661 AF 28-105mm F3.5-4.5 NEW +# 2553 AF 28-135mm F4-4.5 +# 2551 AF 35-70mm F4 +# 2643 AF 35-70mm F3.5-4.5 +# 2652 AF 35-70mm F3.5-4.5 NEW +# 2605 AF 35-80mm F4-5.6 +# 2671 AF 35-80mm F4.5-5.6 II +# 2554 AF 35-105mm F3.5-4.5 +# 2585 AF 35-105mm F3.5-4.5 +# 2682 AF APO 70-200mm F2.8 G (D) SSM +# 2588 AF 70-210mm F4.5-5.6 +# 2555 AF 70-210mm F4 +# 2634 AF 70-210mm F4.5-5.6 NEW +# 2669 AF 70-210mm F4.5-5.6 II +# 2561 AF 75-300mm F4.5-5.6 +# 2649 AF 75-300mm F4.5-5.6 NEW +# 2665 AF 75-300mm F4.5-5.6 II +# 2684 AF 75-300mm F4.5-5.6 (D) +# 2589 AF APO 80-200mm F2.8 +# 2628 High-Speed AF APO 80-200mm F2.8 G +# 2604 AF 80-200mm F4.5-5.6 +# 2560 AF 100-200mm F4.5 +# 2606 AF 100-300mm F4.5-5.6 +# 2631 AF APO 100-300mm F4.5-5.6 +# 2681 AF APO 100-300mm F4.5-5.6 (D) +# 2644 AF APO 100-400mm F4.5-6.7 +# 2618 AF Xi 28-80mm F4-5.6 +# 2615 AF Xi 28-105mm F3.5-4.5 +# 2624 AF PZ 35-80mm F4-5.6 +# 2616 AF Xi 35-200mm F4.5-5.6 +# 2619 AF Xi 80-200mm F4.5-5.6 +# 2621 AF Xi 100-300mm F4.5-5.6 +# 2698 AF DT 11-18mm F4.5-5.6 (D) +# 2697 AF DT 18-70mm F3.5-5.6 (D) +# 2699 AF DT 18-200mm F3.5-6.3 (D) +# 2590 1.4x TELE CONVERTER APO +# 2601 2x TELE CONVERTER APO +# 2610 1.4x TELE CONVERTER APO II +# 2611 2x TELE CONVERTER APO II +# 2687 1.4x TELE CONVERTER APO (D) +# 2688 2x TELE CONVERTER APO (D) + +# high bytes in Sony LensID's identifying Metabones adapters and high bytes of Canon LensID's +%metabonesID = ( + # 0xef00 is used by Metabones, Fotodiox, Sigma and Viltrox adapters (JR) + 0xef00 => \ 'Canon EF Adapter', # with Canon LensID 0x00xx + 0xf000 => 0xef00, # with Canon LensID 0x01xx + 0xf100 => 0xef00, # with Canon LensID 0x02xx + 0xff00 => 0xef00, # with Canon LensID 0x10xx + 0x7700 => \ 'Metabones Speed Booster', # with Canon LensID 0x00xx + 0x7800 => 0x7700, # with Canon LensID 0x01xx + 0x7900 => 0x7700, # with Canon LensID 0x02xx + 0x8700 => 0x7700, # with Canon LensID 0x10xx + 0xbc00 => \ 'Metabones Speed Booster Ultra', # with Canon LensID 0x00xx + 0xbd00 => 0xbc00, # with Canon LensID 0x01xx + 0xbe00 => 0xbc00, # with Canon LensID 0x02xx + 0xcc00 => 0xbc00, # with Canon LensID 0x10xx +); + +# lens ID numbers (ref 3) +# ("New" and "II" appear in brackets if original version also has this LensType) +%minoltaLensTypes = ( + Notes => q{ + Decimal values have been added to differentiate lenses which would otherwise + have the same LensType, and are used by the Composite LensID tag when + attempting to identify the specific lens model. "New" or "II" appear in + brackets if the original version of the lens has the same LensType. Special + logic is employed to identify the attached lens when a Metabones Canon EF + adapter is used. + }, + OTHER => sub { + my ($val, $inv) = @_; + return undef if $inv; + my $id = $val & 0xff00; + # Note: Metabones Smart Adapter firmware versions before 31 kill + # the high byte for 2-byte Canon LensType values, so the reported lens + # will be incorrect for these + my $mb = $metabonesID{$id}; + if ($mb) { + ref $mb or $id = $mb, $mb = $metabonesID{$id}; + require Image::ExifTool::Canon; + my $lens = $Image::ExifTool::Canon::canonLensTypes{$val - $id}; + return "$lens + $$mb" if $lens; + } elsif ($val >= 0x4900) { # test for Sigma MC-11 SA-E adapter with Sigma SA-mount lens + require Image::ExifTool::Sigma; + my $lens = $Image::ExifTool::Sigma::sigmaLensTypes{$val - 0x4900}; + return "$lens + MC-11 SA-E" if $lens; + } + return undef; + }, + 0 => 'Minolta AF 28-85mm F3.5-4.5 New', # New added (ref 13/18) + 1 => 'Minolta AF 80-200mm F2.8 HS-APO G', # white + 2 => 'Minolta AF 28-70mm F2.8 G', + 3 => 'Minolta AF 28-80mm F4-5.6', + 4 => 'Minolta AF 85mm F1.4G', #exiv2 0.23 + 5 => 'Minolta AF 35-70mm F3.5-4.5 [II]', # (original and II, ref 13) + 6 => 'Minolta AF 24-85mm F3.5-4.5 [New]', # (original and New, ref 13) + # 7 => 'AF 100-400mm F4.5-6.7 (D)', ?? + 7 => 'Minolta AF 100-300mm F4.5-5.6 APO [New] or 100-400mm or Sigma Lens', + 7.1 => 'Minolta AF 100-400mm F4.5-6.7 APO', #JD + 7.2 => 'Sigma AF 100-300mm F4 EX DG IF', #JD + 8 => 'Minolta AF 70-210mm F4.5-5.6 [II]', # (original and II, ref 13) + 9 => 'Minolta AF 50mm F3.5 Macro', + 10 => 'Minolta AF 28-105mm F3.5-4.5 [New]', # (original and New, ref 13) + 11 => 'Minolta AF 300mm F4 HS-APO G', + 12 => 'Minolta AF 100mm F2.8 Soft Focus', + 13 => 'Minolta AF 75-300mm F4.5-5.6 (New or II)', # (II and New, ref 13) + 14 => 'Minolta AF 100-400mm F4.5-6.7 APO', + 15 => 'Minolta AF 400mm F4.5 HS-APO G', + 16 => 'Minolta AF 17-35mm F3.5 G', + 17 => 'Minolta AF 20-35mm F3.5-4.5', + 18 => 'Minolta AF 28-80mm F3.5-5.6 II', + 19 => 'Minolta AF 35mm F1.4 G', # G added (ref 18), but not New as per ref 13 + 20 => 'Minolta/Sony 135mm F2.8 [T4.5] STF', + # 20 => 'Sony 135mm F2.8 [T4.5] STF (SAL135F28)', (ref JR) + 22 => 'Minolta AF 35-80mm F4-5.6 II', # II added (ref 13) + 23 => 'Minolta AF 200mm F4 Macro APO G', + 24 => 'Minolta/Sony AF 24-105mm F3.5-4.5 (D) or Sigma or Tamron Lens', + # 24 => 'Sony 24-105mm F3.5-4.5 (SAL24105)', (ref JR) + 24.1 => 'Sigma 18-50mm F2.8', + 24.2 => 'Sigma 17-70mm F2.8-4.5 DC Macro', # (changed "(D)" to "DC Macro", ref JR) + 24.3 => 'Sigma 20-40mm F2.8 EX DG Aspherical IF', #JD/22 + 24.4 => 'Sigma 18-200mm F3.5-6.3 DC', #22 + 24.5 => 'Sigma DC 18-125mm F4-5,6 D', #exiv2 0.23 + # 24.6 => 'Tamron SP AF 28-75mm F2.8 XR Di (IF) Macro', #JD + 24.6 => 'Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical [IF] Macro', #NJ (Model A09) + 24.7 => 'Sigma 15-30mm F3.5-4.5 EX DG Aspherical', #JR + 25 => 'Minolta AF 100-300mm F4.5-5.6 APO (D) or Sigma Lens', + 25.1 => 'Sigma 100-300mm F4 EX (APO (D) or D IF)', #JD + 25.2 => 'Sigma 70mm F2.8 EX DG Macro', #JD + 25.3 => 'Sigma 20mm F1.8 EX DG Aspherical RF', #19 + 25.4 => 'Sigma 30mm F1.4 EX DC', #21/27 + 25.5 => 'Sigma 24mm F1.8 EX DG ASP Macro', #Florian Knorn + # 25 - also seen for an "old Sigma 50mm Macro" (forum2833) + 27 => 'Minolta AF 85mm F1.4 G (D)', # added (D) (ref 13) + # 27 => 'Venus Optics Laowa 105mm F2 STF', #IB (NC) + 28 => 'Minolta/Sony AF 100mm F2.8 Macro (D) or Tamron Lens', + # 28 => 'Sony 100mm F2.8 Macro (SAL100M28)', (ref 18/JR) + 28.1 => 'Tamron SP AF 90mm F2.8 Di Macro', #JD (Model 272E) + 28.2 => 'Tamron SP AF 180mm F3.5 Di LD [IF] Macro', #27 (Model B01) ("SP" moved - ref JR) + 29 => 'Minolta/Sony AF 75-300mm F4.5-5.6 (D)', # Sony added (ref 13) + # 29 => 'Sony 75-300mm F4.5-5.6 (SAL75300)', (ref JR) + 30 => 'Minolta AF 28-80mm F3.5-5.6 (D) or Sigma Lens', + 30.1 => 'Sigma AF 10-20mm F4-5.6 EX DC', #JD + 30.2 => 'Sigma AF 12-24mm F4.5-5.6 EX DG', + 30.3 => 'Sigma 28-70mm EX DG F2.8', #16 + 30.4 => 'Sigma 55-200mm F4-5.6 DC', #JD + 31 => 'Minolta/Sony AF 50mm F2.8 Macro (D) or F3.5', + # 31 => 'Sony 50mm F2.8 Macro (SAL50M28)', (ref JR) + 31.1 => 'Minolta/Sony AF 50mm F3.5 Macro', + 32 => 'Minolta/Sony AF 300mm F2.8 G or 1.5x Teleconverter', #13/18 + # 32 => 'Minolta AF 300mm F2.8 APO G (D) SSM', (ref 13) ("APO" added - ref JR) + # 32 => 'Sony 300mm F2.8 G (SAL300F28G)', (ref 18/JR) + 33 => 'Minolta/Sony AF 70-200mm F2.8 G', + # 33 => 'Sony 70-200mm F2.8 G (SAL70200G)', (ref JR) + # 33 => 'Minolta AF 70-200mm F2.8 APO G (D) SSM' (ref 13) ("APO" added - ref JR) + 35 => 'Minolta AF 85mm F1.4 G (D) Limited', + 36 => 'Minolta AF 28-100mm F3.5-5.6 (D)', + 38 => 'Minolta AF 17-35mm F2.8-4 (D)', # (Konica Minolta, ref 13) + 39 => 'Minolta AF 28-75mm F2.8 (D)', # (Konica Minolta, ref 13) + 40 => 'Minolta/Sony AF DT 18-70mm F3.5-5.6 (D)', # (Konica Minolta, ref 13) + # 40 => 'Sony DT 18-70mm F3.5-5.6 (SAL1870)', (ref JR) + #40.1 => 'Sony AF DT 18-200mm F3.5-6.3', #11 (anomaly? - PH) + 41 => 'Minolta/Sony AF DT 11-18mm F4.5-5.6 (D) or Tamron Lens', # (Konica Minolta, ref 13) + # 41 => 'Sony DT 11-18mm F4.5-5.6 (SAL1118)', (ref JR) + 41.1 => 'Tamron SP AF 11-18mm F4.5-5.6 Di II LD Aspherical IF', #JD (Model A13) + 42 => 'Minolta/Sony AF DT 18-200mm F3.5-6.3 (D)', # Sony added (ref 13) (Konica Minolta, ref 13) + # 42 => 'Sony DT 18-200mm F3.5-6.3 (SAL18200)', (ref JR) + 43 => 'Sony 35mm F1.4 G (SAL35F14G)', # changed from Minolta to Sony (ref 13/18/JR) (but ref 11 shows both!) + 44 => 'Sony 50mm F1.4 (SAL50F14)', # changed from Minolta to Sony (ref 13/18/JR) + 45 => 'Carl Zeiss Planar T* 85mm F1.4 ZA (SAL85F14Z)', #JR + 46 => 'Carl Zeiss Vario-Sonnar T* DT 16-80mm F3.5-4.5 ZA (SAL1680Z)', #JR + 47 => 'Carl Zeiss Sonnar T* 135mm F1.8 ZA (SAL135F18Z)', #JR + 48 => 'Carl Zeiss Vario-Sonnar T* 24-70mm F2.8 ZA SSM (SAL2470Z) or Other Lens', #11/JR + 48.1 => 'Carl Zeiss Vario-Sonnar T* 24-70mm F2.8 ZA SSM II (SAL2470Z2)', #JR + 48.2 => 'Tamron SP 24-70mm F2.8 Di USD', #IB (A007) (also with id 204) + 49 => 'Sony DT 55-200mm F4-5.6 (SAL55200)', #JD/JR + 50 => 'Sony DT 18-250mm F3.5-6.3 (SAL18250)', #11/JR + 51 => 'Sony DT 16-105mm F3.5-5.6 (SAL16105)', #11/JR + #51.1 => 'Sony AF DT 55-200mm F4-5.5', #11 (anomaly? - PH) + # LensType 52 also seen for Fringer Contax_N to E-mount adapter Ver.31 and Ver.21 (ref JR) + 52 => 'Sony 70-300mm F4.5-5.6 G SSM (SAL70300G) or G SSM II or Tamron Lens', #JD + 52.1 => 'Sony 70-300mm F4.5-5.6 G SSM II (SAL70300G2)', #JR + 52.2 => 'Tamron SP 70-300mm F4-5.6 Di USD', #JR,NJ (Model A005) + 53 => 'Sony 70-400mm F4-5.6 G SSM (SAL70400G)', #17(/w correction by Stephen Bishop)/JR + 54 => 'Carl Zeiss Vario-Sonnar T* 16-35mm F2.8 ZA SSM (SAL1635Z) or ZA SSM II', #17/JR + 54.1 => 'Carl Zeiss Vario-Sonnar T* 16-35mm F2.8 ZA SSM II (SAL1635Z2)', #JR + 55 => 'Sony DT 18-55mm F3.5-5.6 SAM (SAL1855) or SAM II', #PH + 55.1 => 'Sony DT 18-55mm F3.5-5.6 SAM II (SAL18552)', #JR + 56 => 'Sony DT 55-200mm F4-5.6 SAM (SAL55200-2)', #22/JR + 57 => 'Sony DT 50mm F1.8 SAM (SAL50F18) or Tamron Lens or Commlite CM-EF-NEX adapter', #22/JR + 57.1 => 'Tamron SP AF 60mm F2 Di II LD [IF] Macro 1:1', # (Model G005) (ref https://exiftool.org/forum/index.php/topic,3858.0.html) + 57.2 => 'Tamron 18-270mm F3.5-6.3 Di II PZD', #27 (Model B008) + # (note: the Commlite CM-EF-NEX adapter also appears to give LensType 57, ref JR) + 58 => 'Sony DT 30mm F2.8 Macro SAM (SAL30M28)', #22/JR + 59 => 'Sony 28-75mm F2.8 SAM (SAL2875)', #21/JR + 60 => 'Carl Zeiss Distagon T* 24mm F2 ZA SSM (SAL24F20Z)', #17/JR + 61 => 'Sony 85mm F2.8 SAM (SAL85F28)', #17/JR + 62 => 'Sony DT 35mm F1.8 SAM (SAL35F18)', #PH/JR + 63 => 'Sony DT 16-50mm F2.8 SSM (SAL1650)', #17/JR + 64 => 'Sony 500mm F4 G SSM (SAL500F40G)', #29 + 65 => 'Sony DT 18-135mm F3.5-5.6 SAM (SAL18135)', #JR + 66 => 'Sony 300mm F2.8 G SSM II (SAL300F28G2)', #29 + 67 => 'Sony 70-200mm F2.8 G SSM II (SAL70200G2)', #JR + 68 => 'Sony DT 55-300mm F4.5-5.6 SAM (SAL55300)', #29 + 69 => 'Sony 70-400mm F4-5.6 G SSM II (SAL70400G2)', #JR + 70 => 'Carl Zeiss Planar T* 50mm F1.4 ZA SSM (SAL50F14Z)', #JR + 128 => 'Tamron or Sigma Lens (128)', + 128.1 => 'Tamron AF 18-200mm F3.5-6.3 XR Di II LD Aspherical [IF] Macro', #JR (Model A14) + # was 128.1 => 'Tamron 18-200mm F3.5-6.3', + 128.2 => 'Tamron AF 28-300mm F3.5-6.3 XR Di LD Aspherical [IF] Macro', #JR (Model A061) + # was 128.2 => 'Tamron 28-300mm F3.5-6.3', + # (removed -- probably never existed, ref IB) 'Tamron 80-300mm F3.5-6.3', + 128.3 => 'Tamron AF 28-200mm F3.8-5.6 XR Di Aspherical [IF] Macro', #JD (Model A031) + # also Tamron AF 28-200mm F3.8-5.6 Aspherical', #IB (Model 71D) + # and 'Tamron AF 28-200mm F3.8-5.6 LD Aspherical [IF] Super', #IB (Model 171D) + 128.4 => 'Tamron SP AF 17-35mm F2.8-4 Di LD Aspherical IF', #JD (Model A05) + 128.5 => 'Sigma AF 50-150mm F2.8 EX DC APO HSM II', #JD + 128.6 => 'Sigma 10-20mm F3.5 EX DC HSM', #11 (Model 202-205) + 128.7 => 'Sigma 70-200mm F2.8 II EX DG APO MACRO HSM', #24 + 128.8 => 'Sigma 10mm F2.8 EX DC HSM Fisheye', #Florian Knorn + # (yes, '128.10'. My condolences to typed languages that use this database - PH) + 128.9 => 'Sigma 50mm F1.4 EX DG HSM', #Florian Knorn (Model A014, ref IB) + '128.10' => 'Sigma 85mm F1.4 EX DG HSM', #27 + '128.11' => 'Sigma 24-70mm F2.8 IF EX DG HSM', #27 + '128.12' => 'Sigma 18-250mm F3.5-6.3 DC OS HSM', #27 + '128.13' => 'Sigma 17-50mm F2.8 EX DC HSM', #Exiv2 + '128.14' => 'Sigma 17-70mm F2.8-4 DC Macro HSM', # (no OS for Sony mount, ref JR) (also C013 Model, ref IB) + '128.15' => 'Sigma 150mm F2.8 EX DG OS HSM APO Macro', #Marcus Holland-Moritz + '128.16' => 'Sigma 150-500mm F5-6.3 APO DG OS HSM', #IB + '128.17' => 'Tamron AF 28-105mm F4-5.6 [IF]', #IB (Model 179D) + '128.18' => 'Sigma 35mm F1.4 DG HSM', #JR + '128.19' => 'Sigma 18-35mm F1.8 DC HSM', #JR (Model A013, ref IB) + '128.20' => 'Sigma 50-500mm F4.5-6.3 APO DG OS HSM', #JR + '128.21' => 'Sigma 24-105mm F4 DG HSM | A', #JR (013) + '128.22' => 'Sigma 30mm F1.4', #IB + '128.23' => 'Sigma 35mm F1.4 DG HSM | A', #IB/JR (012) + '128.24' => 'Sigma 105mm F2.8 EX DG OS HSM Macro', #IB + '128.25' => 'Sigma 180mm F2.8 EX DG OS HSM APO Macro', #IB + '128.26' => 'Sigma 18-300mm F3.5-6.3 DC Macro HSM | C', #IB/JR (014) + '128.27' => 'Sigma 18-50mm F2.8-4.5 DC HSM', #IB + 129 => 'Tamron Lens (129)', + 129.1 => 'Tamron 200-400mm F5.6 LD', #12 (LD ref 23) + 129.2 => 'Tamron 70-300mm F4-5.6 LD', #12 + 131 => 'Tamron 20-40mm F2.7-3.5 SP Aspherical IF', #23 (Model 266D) + 135 => 'Vivitar 28-210mm F3.5-5.6', #16 + 136 => 'Tokina EMZ M100 AF 100mm F3.5', #JD + 137 => 'Cosina 70-210mm F2.8-4 AF', #11 + 138 => 'Soligor 19-35mm F3.5-4.5', #11 + 139 => 'Tokina AF 28-300mm F4-6.3', #IB + # (the following Cosina 70-300mm lens was also marketed as a Phoenix, Vivitar Series 1, and + # some sort of 3rd-party marketing as a Voightlander 70-300mm F4.5-5.6 SKOPAR AF, ref IB) + 142 => 'Cosina AF 70-300mm F4.5-5.6 MC', #IB (was 'Voigtlander 70-300mm F4.5-5.6', #JD) + 146 => 'Voigtlander Macro APO-Lanthar 125mm F2.5 SL', #JD + 194 => 'Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical [IF]', #23 (Model A16) + 202 => 'Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro', #JR (Model A001) (see also 255.7) + 203 => 'Tamron SP 70-200mm F2.8 Di USD', #JR (Model A009) + 204 => 'Tamron SP 24-70mm F2.8 Di USD', #JR (Model A007) (also with id 48) + 212 => 'Tamron 28-300mm F3.5-6.3 Di PZD', #JR (Model A010) + 213 => 'Tamron 16-300mm F3.5-6.3 Di II PZD Macro', #JR (Model B016) + 214 => 'Tamron SP 150-600mm F5-6.3 Di USD', #JR (Model A011) + 215 => 'Tamron SP 15-30mm F2.8 Di USD', #JR (Model A012) + 216 => 'Tamron SP 45mm F1.8 Di USD', #forum8320 (F013) + 217 => 'Tamron SP 35mm F1.8 Di USD', #forum8320 (F012) + 218 => 'Tamron SP 90mm F2.8 Di Macro 1:1 USD (F017)', #JR (Model F017) + 220 => 'Tamron SP 150-600mm F5-6.3 Di USD G2', #forum8846 (Model A022) + 224 => 'Tamron SP 90mm F2.8 Di Macro 1:1 USD (F004)', #JR (Model F004) + 255 => 'Tamron Lens (255)', + 255.1 => 'Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical', # (Model A16) + 255.2 => 'Tamron AF 18-250mm F3.5-6.3 XR Di II LD', #JD (Model A18?) + #? 225.2 => 'Tamron AF 18-250mm F3.5-6.3 Di II LD Aspherical [IF] Macro', #JR (Model A18) + 255.3 => 'Tamron AF 55-200mm F4-5.6 Di II LD Macro', # (Model A15) (added "LD Macro", ref 23) + 255.4 => 'Tamron AF 70-300mm F4-5.6 Di LD Macro 1:2', # (Model A17) + 255.5 => 'Tamron SP AF 200-500mm F5.0-6.3 Di LD IF', # (Model A08) + 255.6 => 'Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical IF', #22 (Model B001) + 255.7 => 'Tamron SP AF 70-200mm F2.8 Di LD IF Macro', #22 (Model A001) + 255.8 => 'Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical IF', #24 (Model A09) + 255.9 => 'Tamron AF 90-300mm F4.5-5.6 Telemacro', #Fredrik Agert + 18688 => 'Sigma MC-11 SA-E Mount Converter with not-supported Sigma lens', + # The MC-11 SA-E Mount Converter uses this 18688 offset for not-supported SIGMA mount lenses. + # The MC-11 EF-E Mount Converter uses the 61184 offset for not-supported CANON mount lenses, as also used by Metabones. + # Both MC-11 SA-E and EF-E Mount Converters use the 504xx LensType2 values for supported SA-mount or EF-mount Sigma lenses. + 25501 => 'Minolta AF 50mm F1.7', #7 + 25511 => 'Minolta AF 35-70mm F4 or Other Lens', + 25511.1 => 'Sigma UC AF 28-70mm F3.5-4.5', #12/16(HighSpeed-AF) + 25511.2 => 'Sigma AF 28-70mm F2.8', #JD + 25511.3 => 'Sigma M-AF 70-200mm F2.8 EX Aspherical', #12 + 25511.4 => 'Quantaray M-AF 35-80mm F4-5.6', #JD + 25511.5 => 'Tokina 28-70mm F2.8-4.5 AF', #IB + 25521 => 'Minolta AF 28-85mm F3.5-4.5 or Other Lens', # not New (ref 18) + 25521.1 => 'Tokina 19-35mm F3.5-4.5', #3 + 25521.2 => 'Tokina 28-70mm F2.8 AT-X', #7 + 25521.3 => 'Tokina 80-400mm F4.5-5.6 AT-X AF II 840', #JD + 25521.4 => 'Tokina AF PRO 28-80mm F2.8 AT-X 280', #JD + 25521.5 => 'Tokina AT-X PRO [II] AF 28-70mm F2.6-2.8 270', #24 (original + II versions) + 25521.6 => 'Tamron AF 19-35mm F3.5-4.5', #JD (Model A10) + 25521.7 => 'Angenieux AF 28-70mm F2.6', #JD + 25521.8 => 'Tokina AT-X 17 AF 17mm F3.5', #27 + 25521.9 => 'Tokina 20-35mm F3.5-4.5 II AF', #IB + 25531 => 'Minolta AF 28-135mm F4-4.5 or Other Lens', + 25531.1 => 'Sigma ZOOM-alpha 35-135mm F3.5-4.5', #16 + 25531.2 => 'Sigma 28-105mm F2.8-4 Aspherical', #JD + 25531.3 => 'Sigma 28-105mm F4-5.6 UC', #JR + 25531.4 => 'Tokina AT-X 242 AF 24-200mm F3.5-5.6', #IB + 25541 => 'Minolta AF 35-105mm F3.5-4.5', #13 + 25551 => 'Minolta AF 70-210mm F4 Macro or Sigma Lens', + 25551.1 => 'Sigma 70-210mm F4-5.6 APO', #7 + 25551.2 => 'Sigma M-AF 70-200mm F2.8 EX APO', #6 + 25551.3 => 'Sigma 75-200mm F2.8-3.5', #22 + 25561 => 'Minolta AF 135mm F2.8', + 25571 => 'Minolta/Sony AF 28mm F2.8', # Sony added (ref 18) + # 25571 => 'Sony 28mm F2.8 (SAL28F28)', (ref 18/JR) + 25581 => 'Minolta AF 24-50mm F4', + 25601 => 'Minolta AF 100-200mm F4.5', + 25611 => 'Minolta AF 75-300mm F4.5-5.6 or Sigma Lens', #13 + 25611.1 => 'Sigma 70-300mm F4-5.6 DL Macro', #12 (also DG version ref 27, and APO version ref JR) + 25611.2 => 'Sigma 300mm F4 APO Macro', #3/7 + 25611.3 => 'Sigma AF 500mm F4.5 APO', #JD + 25611.4 => 'Sigma AF 170-500mm F5-6.3 APO Aspherical', #JD + 25611.5 => 'Tokina AT-X AF 300mm F4', #JD + 25611.6 => 'Tokina AT-X AF 400mm F5.6 SD', #22 + 25611.7 => 'Tokina AF 730 II 75-300mm F4.5-5.6', #JD + 25611.8 => 'Sigma 800mm F5.6 APO', #https://exiftool.org/forum/index.php/topic,3472.0.html + 25611.9 => 'Sigma AF 400mm F5.6 APO Macro', #27 + '25611.10' => 'Sigma 1000mm F8 APO', #JR + 25621 => 'Minolta AF 50mm F1.4 [New]', # original and New, not Sony (ref 13/18) + 25631 => 'Minolta AF 300mm F2.8 APO or Sigma Lens', # changed G to APO (ref 13) + 25631.1 => 'Sigma AF 50-500mm F4-6.3 EX DG APO', #JD + 25631.2 => 'Sigma AF 170-500mm F5-6.3 APO Aspherical', #JD (also DG version, ref 27) + 25631.3 => 'Sigma AF 500mm F4.5 EX DG APO', #JD + 25631.4 => 'Sigma 400mm F5.6 APO', #22 + 25641 => 'Minolta AF 50mm F2.8 Macro or Sigma Lens', + 25641.1 => 'Sigma 50mm F2.8 EX Macro', #11 + 25651 => 'Minolta AF 600mm F4 APO', # ("APO" added - ref JR) + 25661 => 'Minolta AF 24mm F2.8 or Sigma Lens', + 25661.1 => 'Sigma 17-35mm F2.8-4 EX Aspherical', #https://exiftool.org/forum/index.php/topic,3789.msg17679.html#msg17679 + 25721 => 'Minolta/Sony AF 500mm F8 Reflex', + # 25721 => 'Sony 500mm F8 Reflex (SAL500F80)', (ref JR) + 25781 => 'Minolta/Sony AF 16mm F2.8 Fisheye or Sigma Lens', # Sony added (ref 13/18) + # 25781 => 'Sony 16mm F2.8 Fisheye (SAL16F28)', (ref 18/JR) + 25781.1 => 'Sigma 8mm F4 EX [DG] Fisheye', + 25781.2 => 'Sigma 14mm F3.5', + 25781.3 => 'Sigma 15mm F2.8 Fisheye', #JD (writes 16mm to EXIF) + 25791 => 'Minolta/Sony AF 20mm F2.8 or Tokina Lens', # Sony added (ref 11) + # 25791 => 'Sony 20mm F2.8 (SAL20F28)', (ref JR) + 25791.1 => 'Tokina AT-X Pro DX 11-16mm F2.8', #https://exiftool.org/forum/index.php/topic,3593.0.html + 25811 => 'Minolta AF 100mm F2.8 Macro [New] or Sigma or Tamron Lens', # not Sony (ref 13/18) + 25811.1 => 'Sigma AF 90mm F2.8 Macro', #JD + 25811.2 => 'Sigma AF 105mm F2.8 EX [DG] Macro', #JD + 25811.3 => 'Sigma 180mm F5.6 Macro', + 25811.4 => 'Sigma 180mm F3.5 EX DG Macro', #https://exiftool.org/forum/index.php/topic,3789.msg17679.html#msg17679 + 25811.5 => 'Tamron 90mm F2.8 Macro', + 25851 => 'Beroflex 35-135mm F3.5-4.5', #16 + 25858 => 'Minolta AF 35-105mm F3.5-4.5 New or Tamron Lens', + 25858.1 => 'Tamron 24-135mm F3.5-5.6', # (Model 190D) + 25881 => 'Minolta AF 70-210mm F3.5-4.5', + 25891 => 'Minolta AF 80-200mm F2.8 APO or Tokina Lens', # black + 25891.1 => 'Tokina 80-200mm F2.8', + # 25901 - Note: only get this with older 1.4x and lenses with 5-digit LensTypes (ref 27) + # 25901 - also "Minolta AF 200mm F2.8 HS-APO G + Minolta AF 1.4x APO" + 25901 => 'Minolta AF 200mm F2.8 G APO + Minolta AF 1.4x APO or Other Lens + 1.4x', #26 + 25901.1 => 'Minolta AF 600mm F4 HS-APO G + Minolta AF 1.4x APO', #27 + 25911 => 'Minolta AF 35mm F1.4', #(from Sony list) (not G as per ref 13) + 25921 => 'Minolta AF 85mm F1.4 G (D)', + 25931 => 'Minolta AF 200mm F2.8 APO', # (not "G", see 26121 - ref JR) + 25941 => 'Minolta AF 3x-1x F1.7-2.8 Macro', + 25961 => 'Minolta AF 28mm F2', + 25971 => 'Minolta AF 35mm F2 [New]', #13 + 25981 => 'Minolta AF 100mm F2', + # 26011 - Note: only get this with older 2x and lenses with 5-digit LensTypes (ref 27) + # 26011 - also "Minolta AF 200mm F2.8 HS-APO G + Minolta AF 2x APO" + 26011 => 'Minolta AF 200mm F2.8 G APO + Minolta AF 2x APO or Other Lens + 2x', #26 + 26011.1 => 'Minolta AF 600mm F4 HS-APO G + Minolta AF 2x APO', #27 + 26041 => 'Minolta AF 80-200mm F4.5-5.6', + 26051 => 'Minolta AF 35-80mm F4-5.6', #(from Sony list) + 26061 => 'Minolta AF 100-300mm F4.5-5.6', # not (D) (ref 13/18) + 26071 => 'Minolta AF 35-80mm F4-5.6', #13 + 26081 => 'Minolta AF 300mm F2.8 HS-APO G', # HS-APO added (ref 13/18) + 26091 => 'Minolta AF 600mm F4 HS-APO G', + 26121 => 'Minolta AF 200mm F2.8 HS-APO G', + 26131 => 'Minolta AF 50mm F1.7 New', + 26151 => 'Minolta AF 28-105mm F3.5-4.5 xi', # xi, not Power Zoom (ref 13/18) + 26161 => 'Minolta AF 35-200mm F4.5-5.6 xi', # xi, not Power Zoom (ref 13/18) + 26181 => 'Minolta AF 28-80mm F4-5.6 xi', # xi, not Power Zoom (ref 13/18) + 26191 => 'Minolta AF 80-200mm F4.5-5.6 xi', # xi, not Power Zoom (ref 13/18) + 26201 => 'Minolta AF 28-70mm F2.8 G', #11 + 26211 => 'Minolta AF 100-300mm F4.5-5.6 xi', # xi, not Power Zoom (ref 13/18) + 26241 => 'Minolta AF 35-80mm F4-5.6 Power Zoom', + 26281 => 'Minolta AF 80-200mm F2.8 HS-APO G', #11 ("HS-APO" added, white, probably same as 1, non-HS is 25891 - ref JR) + 26291 => 'Minolta AF 85mm F1.4 New', + 26311 => 'Minolta AF 100-300mm F4.5-5.6 APO', #11 (does not exist? https://www.dyxum.com/dforum/lens-data-requested_topic23435_page2.html) + 26321 => 'Minolta AF 24-50mm F4 New', + 26381 => 'Minolta AF 50mm F2.8 Macro New', + 26391 => 'Minolta AF 100mm F2.8 Macro', + 26411 => 'Minolta/Sony AF 20mm F2.8 New', # Sony added (ref 13) + 26421 => 'Minolta AF 24mm F2.8 New', + 26441 => 'Minolta AF 100-400mm F4.5-6.7 APO', #11 + 26621 => 'Minolta AF 50mm F1.4 New', + 26671 => 'Minolta AF 35mm F2 New', + 26681 => 'Minolta AF 28mm F2 New', + 26721 => 'Minolta AF 24-105mm F3.5-4.5 (D)', #11 + # 30464: newer firmware versions of the Speed Booster report type 30464 (=0x7700) + # - this is the base to which the Canon LensType is added + 30464 => 'Metabones Canon EF Speed Booster', #Metabones (to this, add Canon LensType) + 45671 => 'Tokina 70-210mm F4-5.6', #22 + 45681 => 'Tokina AF 35-200mm F4-5.6 Zoom SD', #IB (model 352) + 45701 => 'Tamron AF 35-135mm F3.5-4.5', #IB (model 40d) + 45711 => 'Vivitar 70-210mm F4.5-5.6', #IB + 45741 => '2x Teleconverter or Tamron or Tokina Lens', #18 + 45741.1 => 'Tamron SP AF 90mm F2.5', #JD + 45741.2 => 'Tokina RF 500mm F8.0 x2', #JD + 45741.3 => 'Tokina 300mm F2.8 x2', + 45751 => '1.4x Teleconverter', #18 + 45851 => 'Tamron SP AF 300mm F2.8 LD IF', #11 + 45861 => 'Tamron SP AF 35-105mm F2.8 LD Aspherical IF', #Fredrik Agert + 45871 => 'Tamron AF 70-210mm F2.8 SP LD', #Fabio Suprani + # 48128: the Speed Booster Ultra appears to report type 48128 (=0xbc00) + # - this is the base to which the Canon LensType is added + 48128 => 'Metabones Canon EF Speed Booster Ultra', #JR (to this, add Canon LensType) + # 61184: older firmware versions of both the Speed Booster and the Smart Adapter + # report type 61184 (=0xef00), and add only the lower byte of the Canon LensType (ref JR). + # For newer firmware versions this is only used by the Smart Adapter, and + # the full Canon LensType code is added - PH + # the metabones adapter translates Canon L -> G, II -> II, USM -> SSM, IS -> OSS (ref JR) + # This offset is used by Metabones, Fotodiox, Sigma MC-11 EF-E and Viltrox Canon EF adapters. + 61184 => 'Canon EF Adapter', #JR (to this, add Canon LensType) + # 65280 = 0xff00 + 65280 => 'Sigma 16mm F2.8 Filtermatic Fisheye', #IB + # all M42-type lenses give a value of 65535 (and FocalLength=0, FNumber=1) + 65535 => 'E-Mount, T-Mount, Other Lens or no lens', #JD/JR + '65535.1' => 'Arax MC 35mm F2.8 Tilt+Shift', #JD + '65535.2' => 'Arax MC 80mm F2.8 Tilt+Shift', #JD + '65535.3' => 'Zenitar MF 16mm F2.8 Fisheye M42', #JD + '65535.4' => 'Samyang 500mm Mirror F8.0', #19 + '65535.5' => 'Pentacon Auto 135mm F2.8', #19 + '65535.6' => 'Pentacon Auto 29mm F2.8', #19 + '65535.7' => 'Helios 44-2 58mm F2.0', #19 +); + +%minoltaTeleconverters = ( + 0x00 => 'None', + 0x04 => 'Minolta/Sony AF 1.4x APO (D) (0x04)', # (Andy Johnson, A77 APO and APO D) + 0x05 => 'Minolta/Sony AF 2x APO (D) (0x05)', # (Andy Johnson, A77 APO D) + 0x48 => 'Minolta/Sony AF 2x APO (D)', + # 0x48 => 'Sony 2x Teleconverter (SAL20TC)', (ref JR) + 0x50 => 'Minolta AF 2x APO II', + 0x60 => 'Minolta AF 2x APO',#26 + 0x88 => 'Minolta/Sony AF 1.4x APO (D)', + # 0x88 => 'Sony 1.4x Teleconverter (SAL14TC)', (ref JR) + 0x90 => 'Minolta AF 1.4x APO II', + 0xa0 => 'Minolta AF 1.4x APO',#26 +); + +%minoltaColorMode = ( + 0 => 'Natural color', + 1 => 'Black & White', + 2 => 'Vivid color', + 3 => 'Solarization', + 4 => 'Adobe RGB', + 5 => 'Sepia', #10 + 9 => 'Natural', #10 + 12 => 'Portrait', #10 + 13 => 'Natural sRGB', + 14 => 'Natural+ sRGB', + 15 => 'Landscape', #10 + 16 => 'Evening', #10 + 17 => 'Night Scene', #10 + 18 => 'Night Portrait', #10 + 0x84 => 'Embed Adobe RGB', +); + +%sonyColorMode = ( #15 + 0 => 'Standard', + 1 => 'Vivid', #PH + 2 => 'Portrait', + 3 => 'Landscape', + 4 => 'Sunset', + 5 => 'Night View/Portrait', #(portrait if flash is on) + 6 => 'B&W', + 7 => 'Adobe RGB', + 12 => 'Neutral', # Sony + 13 => 'Clear', #JR (NC) + 14 => 'Deep', #JR + 15 => 'Light', #JR (NC) + 16 => 'Autumn Leaves', #JR (NC) + 17 => 'Sepia', #JR + 18 => 'FL', #JR (7SM3) + 19 => 'Vivid 2', #JR (7SM3) + 20 => 'IN', #JR (7SM3) + 21 => 'SH', #JR (7SM3) + 100 => 'Neutral', #JD + 101 => 'Clear', #JD + 102 => 'Deep', #JD + 103 => 'Light', #JD + 104 => 'Night View', #JD + 105 => 'Autumn Leaves', #JD + 255 => 'Off', #JR (new for ILCE-7SM3, July 2020) + 0xffffffff => 'n/a', #PH +); + +%minoltaSceneMode = ( + 0 => 'Standard', + 1 => 'Portrait', + 2 => 'Text', + 3 => 'Night Scene', + 4 => 'Sunset', + 5 => 'Sports', + 6 => 'Landscape', + 7 => 'Night Portrait', #JD + 8 => 'Macro', + 9 => 'Super Macro', + 16 => 'Auto', # (RX100 'Intelligent Auto' - PH) + 17 => 'Night View/Portrait', + 18 => 'Sweep Panorama', #PH (SLT-A55V) + 19 => 'Handheld Night Shot', #PH + 20 => 'Anti Motion Blur', #PH + 21 => 'Cont. Priority AE', #PH + 22 => 'Auto+', + 23 => '3D Sweep Panorama', #PH (SLT-A55V) + 24 => 'Superior Auto', #28 + 25 => 'High Sensitivity', #28 + 26 => 'Fireworks', #28 + 27 => 'Food', #28 + 28 => 'Pet', #28 + 33 => 'HDR', #JR + 0xffff => 'n/a', #PH +); + +# tag information for AFStatus tags (ref 20) +%afStatusInfo = ( + Format => 'int16s', + # 0=in focus, -32768=out of focus, -ve=front focus, +ve=back focus + PrintConvColumns => 2, + PrintConv => { + 0 => 'In Focus', + -32768 => 'Out of Focus', + OTHER => sub { + my ($val, $inv) = @_; + $inv and $val =~ /([-+]?\d+)/, return $1; + return $val < 0 ? "Front Focus ($val)" : "Back Focus (+$val)"; + }, + }, +); + +my %exposureIndicator = ( + 0 => 'Not Indicated', + 1 => 'Under Scale', + 119 => 'Bottom of Scale', + 120 => '-2.0', + 121 => '-1.7', + 122 => '-1.5', + 123 => '-1.3', + 124 => '-1.0', + 125 => '-0.7', + 126 => '-0.5', + 127 => '-0.3', + 128 => '0', + 129 => '+0.3', + 130 => '+0.5', + 131 => '+0.7', + 132 => '+1.0', + 133 => '+1.3', + 134 => '+1.5', + 135 => '+1.7', + 136 => '+2.0', + 253 => 'Top of Scale', + 254 => 'Over Scale', +); + +my %onOff = ( 0 => 'On', 1 => 'Off' ); +my %offOn = ( 0 => 'Off', 1 => 'On' ); + +# Minolta tag table +%Image::ExifTool::Minolta::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x0000 => { + Name => 'MakerNoteVersion', + Writable => 'undef', + Count => 4, + }, + 0x0001 => { + Name => 'MinoltaCameraSettingsOld', + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::CameraSettings', + ByteOrder => 'BigEndian', + }, + }, + 0x0003 => { + Name => 'MinoltaCameraSettings', + # These camera settings are different for the DiMAGE X31 + Condition => '$self->{Model} ne "DiMAGE X31"', + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::CameraSettings', + ByteOrder => 'BigEndian', + }, + }, + 0x0004 => { #8 + Name => 'MinoltaCameraSettings7D', + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::CameraSettings7D', + ByteOrder => 'BigEndian', + }, + }, + 0x0010 => { #20 (count: 256) + Name => 'CameraInfoA100', + Condition => '$$self{Model} eq "DSLR-A100"', + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::CameraInfoA100', + ByteOrder => 'LittleEndian', + }, + }, + # it appears that image stabilization is on if this tag exists (ref 2), + # but it is an 8kB binary data block! + 0x0018 => [ + { + Name => 'ISInfoA100', + Condition => '$self->{Model} eq "DSLR-A100"', + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::ISInfoA100', + ByteOrder => 'BigEndian', + }, + },{ + Name => 'ImageStabilization', + Condition => '$self->{Model} =~ /^DiMAGE (A1|A2|X1)$/', + Notes => q{ + a block of binary data which exists in DiMAGE A2 (and A1/X1?) images only if + image stabilization is enabled + }, + ValueConv => '"On"', + }, + ], + 0x0020 => { + Name => 'WBInfoA100', + Condition => '$$self{Model} eq "DSLR-A100"', + Notes => 'currently decoded only for the Sony A100', + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::WBInfoA100', + ByteOrder => 'BigEndian', + }, + }, + 0x0040 => { + Name => 'CompressedImageSize', + Writable => 'int32u', + }, + 0x0081 => { + # JPEG preview found in DiMAGE 7 images + %Image::ExifTool::previewImageTagInfo, + Groups => { 2 => 'Preview' }, + Permanent => 1, # don't add this to a file + }, + 0x0088 => { + Name => 'PreviewImageStart', + Flags => 'IsOffset', + OffsetPair => 0x0089, # point to associated byte count + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + # Note: Sony also uses this tag in A100 ARW images, but it points + # to the same data as JpgFromRaw + }, + 0x0089 => { + Name => 'PreviewImageLength', + OffsetPair => 0x0088, # point to associated offset + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + 0x0100 => { #10 + Name => 'SceneMode', + Writable => 'int32u', + PrintConv => \%minoltaSceneMode, + }, + 0x0101 => [ + { + Name => 'ColorMode', + Condition => '$self->{Make} !~ /^SONY/', + Priority => 0, # Other ColorMode is more reliable for A2 + Writable => 'int32u', + PrintConv => \%minoltaColorMode, + }, + { #15 + Name => 'ColorMode', + Writable => 'int32u', + Notes => 'Sony models', + PrintConv => \%sonyColorMode, + }, + ], + 0x0102 => { + Name => 'MinoltaQuality', + Writable => 'int32u', + # PrintConv strings conform with Minolta reference manual (ref NJ) + # (note that Minolta calls an uncompressed TIFF image "Super fine") + PrintConv => { + 0 => 'Raw', + 1 => 'Super Fine', + 2 => 'Fine', + 3 => 'Standard', + 4 => 'Economy', + 5 => 'Extra fine', + }, + }, + # (0x0103 is the same as 0x0102 above) -- this is true for some + # cameras (A2/7Hi), but not others - PH + 0x0103 => [ + { + Name => 'MinoltaQuality', + Writable => 'int32u', + Condition => '$self->{Model} =~ /^DiMAGE (A2|7Hi)$/', + Notes => 'quality for DiMAGE A2/7Hi', + Priority => 0, # lower priority because this doesn't work for A200 + PrintConv => { #NJ + 0 => 'Raw', + 1 => 'Super Fine', + 2 => 'Fine', + 3 => 'Standard', + 4 => 'Economy', + 5 => 'Extra fine', + }, + }, + { #PH + Name => 'MinoltaImageSize', + Writable => 'int32u', + Condition => '$self->{Model} !~ /^DiMAGE A200$/', + Notes => 'image size for other models except A200', + PrintConv => { + 1 => '1600x1200', + 2 => '1280x960', + 3 => '640x480', + 5 => '2560x1920', + 6 => '2272x1704', + 7 => '2048x1536', + }, + }, + ], + 0x0104 => { #14 + Name => 'FlashExposureComp', + Description => 'Flash Exposure Compensation', + Writable => 'rational64s', + }, + 0x0105 => { #10 + Name => 'Teleconverter', + Writable => 'int32u', + PrintHex => 1, + PrintConv => \%minoltaTeleconverters, + }, + 0x0107 => { #8 + Name => 'ImageStabilization', + Writable => 'int32u', + PrintConv => { + 1 => 'Off', + 5 => 'On', + }, + }, + 0x0109 => { #20 + Name => 'RawAndJpgRecording', + Writable => 'int32u', + PrintConv => \%offOn, + }, + 0x010a => { + Name => 'ZoneMatching', + Writable => 'int32u', + PrintConv => { + 0 => 'ISO Setting Used', + 1 => 'High Key', + 2 => 'Low Key', + }, + }, + 0x010b => { + Name => 'ColorTemperature', + Writable => 'int32u', + }, + 0x010c => { #3 (Alpha 7) + Name => 'LensType', + Writable => 'int32u', + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%minoltaLensTypes, + }, + # 0x010e - WhiteBalance according to ref #10 + 0x0111 => { #20 + Name => 'ColorCompensationFilter', + Writable => 'int32s', + Notes => 'ranges from -2 for green to +2 for magenta', + }, + 0x0112 => { #PH (from Sony tags, NC) + Name => 'WhiteBalanceFineTune', + Format => 'int32s', + Writable => 'int32u', + }, + 0x0113 => { #PH + Name => 'ImageStabilization', + Condition => '$self->{Model} eq "DSLR-A100"', + Notes => 'valid for Sony A100 only', + Writable => 'int32u', + PrintConv => \%offOn, + }, + 0x0114 => [ + { #8 + Name => 'MinoltaCameraSettings5D', + Condition => '$self->{Model} =~ /^(DYNAX 5D|MAXXUM 5D|ALPHA SWEET)/', + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::CameraSettings5D', + ByteOrder => 'BigEndian', + }, + }, + { #PH + Name => 'CameraSettingsA100', + Condition => '$self->{Model} eq "DSLR-A100"', + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::CameraSettingsA100', + ByteOrder => 'BigEndian', # required because order differs for ARW and JPG images + }, + }, + ], + 0x0115 => { #20 + Name => 'WhiteBalance', + Writable => 'int32u', + PrintHex => 1, + PrintConv => { + 0x00 => 'Auto', + 0x01 => 'Color Temperature/Color Filter', + 0x10 => 'Daylight', + 0x20 => 'Cloudy', + 0x30 => 'Shade', + 0x40 => 'Tungsten', + 0x50 => 'Flash', + 0x60 => 'Fluorescent', + 0x70 => 'Custom', + }, + }, + 0x0e00 => { + Name => 'PrintIM', + Description => 'Print Image Matching', + Writable => 0, + SubDirectory => { + TagTable => 'Image::ExifTool::PrintIM::Main', + }, + }, + 0x0f00 => { + Name => 'MinoltaCameraSettings2', + Writable => 0, + Binary => 1, + }, +); + +%Image::ExifTool::Minolta::CameraSettings = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + PRIORITY => 0, # not as reliable as other tags + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + NOTES => q{ + There is some variability in CameraSettings information between different + models (and sometimes even between different firmware versions), so this + information may not be as reliable as it should be. Because of this, tags + in the following tables are set to lower priority to prevent them from + superseding the values of same-named tags in other locations when duplicate + tags are disabled. + }, + 1 => { + Name => 'ExposureMode', + PrintConv => { + 0 => 'Program', + 1 => 'Aperture Priority', + 2 => 'Shutter Priority', + 3 => 'Manual', + }, + }, + 2 => { + Name => 'FlashMode', + PrintConv => { + 0 => 'Fill flash', + 1 => 'Red-eye reduction', + 2 => 'Rear flash sync', + 3 => 'Wireless', + 4 => 'Off?', #PH + }, + }, + 3 => { + Name => 'WhiteBalance', + PrintConv => 'Image::ExifTool::Minolta::ConvertWhiteBalance($val)', + }, + 4 => { + Name => 'MinoltaImageSize', + PrintConv => { + 0 => 'Full', + 1 => '1600x1200', + 2 => '1280x960', + 3 => '640x480', + 6 => '2080x1560', #PH (A2) + 7 => '2560x1920', #PH (A2) + 8 => '3264x2176', #PH (A2) + }, + }, + 5 => { + Name => 'MinoltaQuality', + PrintConv => { #NJ + 0 => 'Raw', + 1 => 'Super Fine', + 2 => 'Fine', + 3 => 'Standard', + 4 => 'Economy', + 5 => 'Extra Fine', + }, + }, + 6 => { + Name => 'DriveMode', + PrintConv => { + 0 => 'Single', + 1 => 'Continuous', + 2 => 'Self-timer', + 4 => 'Bracketing', + 5 => 'Interval', + 6 => 'UHS continuous', + 7 => 'HS continuous', + }, + }, + 7 => { + Name => 'MeteringMode', + PrintConv => { + 0 => 'Multi-segment', + 1 => 'Center-weighted average', + 2 => 'Spot', + }, + }, + 8 => { + Name => 'ISO', + ValueConv => '2 ** (($val-48)/8) * 100', + ValueConvInv => '48 + 8*log($val/100)/log(2)', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 9 => { + Name => 'ExposureTime', + ValueConv => '2 ** ((48-$val)/8)', + ValueConvInv => '48 - 8*log($val)/log(2)', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 10 => { + Name => 'FNumber', + ValueConv => '2 ** (($val-8)/16)', + ValueConvInv => '8 + 16*log($val)/log(2)', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 11 => { + Name => 'MacroMode', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 12 => { + Name => 'DigitalZoom', + PrintConv => { + 0 => 'Off', + 1 => 'Electronic magnification', + 2 => '2x', + }, + }, + 13 => { + Name => 'ExposureCompensation', + ValueConv => '$val/3 - 2', + ValueConvInv => '($val + 2) * 3', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 14 => { + Name => 'BracketStep', + PrintConv => { + 0 => '1/3 EV', + 1 => '2/3 EV', + 2 => '1 EV', + }, + }, + 16 => 'IntervalLength', + 17 => 'IntervalNumber', + 18 => { + Name => 'FocalLength', + ValueConv => '$val / 256', + ValueConvInv => '$val * 256', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + 19 => { + Name => 'FocusDistance', + ValueConv => '$val / 1000', + ValueConvInv => '$val * 1000', + PrintConv => '$val ? "$val m" : "inf"', + PrintConvInv => '$val eq "inf" ? 0 : $val =~ s/\s*m$//, $val', + }, + 20 => { + Name => 'FlashFired', + PrintConv => { + 0 => 'No', + 1 => 'Yes', + }, + }, + 21 => { + Name => 'MinoltaDate', + Groups => { 2 => 'Time' }, + Shift => 'Time', + ValueConv => 'sprintf("%4d:%.2d:%.2d",$val>>16,($val&0xff00)>>8,$val&0xff)', + ValueConvInv => 'my @a=($val=~/(\d+):(\d+):(\d+)/); @a ? ($a[0]<<16)+($a[1]<<8)+$a[2] : undef', + }, + 22 => { + Name => 'MinoltaTime', + Groups => { 2 => 'Time' }, + Shift => 'Time', + ValueConv => 'sprintf("%.2d:%.2d:%.2d",$val>>16,($val&0xff00)>>8,$val&0xff)', + ValueConvInv => 'my @a=($val=~/(\d+):(\d+):(\d+)/); @a ? ($a[0]<<16)+($a[1]<<8)+$a[2] : undef', + }, + 23 => { + Name => 'MaxAperture', + ValueConv => '2 ** (($val-8)/16)', + ValueConvInv => '8 + 16*log($val)/log(2)', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 26 => { + Name => 'FileNumberMemory', + PrintConv => \%offOn, + }, + 27 => 'LastFileNumber', + 28 => { + Name => 'ColorBalanceRed', + ValueConv => '$val / 256', + ValueConvInv => '$val * 256', + }, + 29 => { + Name => 'ColorBalanceGreen', + ValueConv => '$val / 256', + ValueConvInv => '$val * 256', + }, + 30 => { + Name => 'ColorBalanceBlue', + ValueConv => '$val / 256', + ValueConvInv => '$val * 256', + }, + 31 => { + Name => 'Saturation', + ValueConv => '$val - ($self->{Model}=~/DiMAGE A2/ ? 5 : 3)', + ValueConvInv => '$val + ($self->{Model}=~/DiMAGE A2/ ? 5 : 3)', + %Image::ExifTool::Exif::printParameter, + }, + 32 => { + Name => 'Contrast', + ValueConv => '$val - ($self->{Model}=~/DiMAGE A2/ ? 5 : 3)', + ValueConvInv => '$val + ($self->{Model}=~/DiMAGE A2/ ? 5 : 3)', + %Image::ExifTool::Exif::printParameter, + }, + 33 => { + Name => 'Sharpness', + PrintConv => { + 0 => 'Hard', + 1 => 'Normal', + 2 => 'Soft', + }, + }, + 34 => { + Name => 'SubjectProgram', + PrintConv => { + 0 => 'None', + 1 => 'Portrait', + 2 => 'Text', + 3 => 'Night portrait', + 4 => 'Sunset', + 5 => 'Sports action', + }, + }, + 35 => { + Name => 'FlashExposureComp', + Description => 'Flash Exposure Compensation', + ValueConv => '($val - 6) / 3', + ValueConvInv => '$val * 3 + 6', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 36 => { + Name => 'ISOSetting', + PrintConv => { + 0 => 100, + 1 => 200, + 2 => 400, + 3 => 800, + 4 => 'Auto', + 5 => 64, + }, + }, + 37 => { + Name => 'MinoltaModelID', + PrintConv => { + 0 => 'DiMAGE 7, X1, X21 or X31', + 1 => 'DiMAGE 5', + 2 => 'DiMAGE S304', + 3 => 'DiMAGE S404', + 4 => 'DiMAGE 7i', + 5 => 'DiMAGE 7Hi', + 6 => 'DiMAGE A1', + 7 => 'DiMAGE A2 or S414', + }, + }, + 38 => { + Name => 'IntervalMode', + PrintConv => { + 0 => 'Still Image', + 1 => 'Time-lapse Movie', + }, + }, + 39 => { + Name => 'FolderName', + PrintConv => { + 0 => 'Standard Form', + 1 => 'Data Form', + }, + }, + 40 => { + Name => 'ColorMode', + PrintConv => { + 0 => 'Natural color', + 1 => 'Black & White', + 2 => 'Vivid color', + 3 => 'Solarization', + 4 => 'Adobe RGB', + }, + }, + 41 => { + Name => 'ColorFilter', + ValueConv => '$val - ($self->{Model}=~/DiMAGE A2/ ? 5 : 3)', + ValueConvInv => '$val + ($self->{Model}=~/DiMAGE A2/ ? 5 : 3)', + }, + 42 => 'BWFilter', + 43 => { + Name => 'InternalFlash', + PrintConv => { + 0 => 'No', + 1 => 'Fired', + }, + }, + 44 => { + Name => 'Brightness', + ValueConv => '$val/8 - 6', + ValueConvInv => '($val + 6) * 8', + }, + 45 => 'SpotFocusPointX', + 46 => 'SpotFocusPointY', + 47 => { + Name => 'WideFocusZone', + PrintConv => { + 0 => 'No zone', + 1 => 'Center zone (horizontal orientation)', + 2 => 'Center zone (vertical orientation)', + 3 => 'Left zone', + 4 => 'Right zone', + }, + }, + 48 => { + Name => 'FocusMode', + PrintConv => { + 0 => 'AF', + 1 => 'MF', + }, + }, + 49 => { + Name => 'FocusArea', + PrintConv => { + 0 => 'Wide Focus (normal)', + 1 => 'Spot Focus', + }, + }, + 50 => { + Name => 'DECPosition', + PrintConv => { + 0 => 'Exposure', + 1 => 'Contrast', + 2 => 'Saturation', + 3 => 'Filter', + }, + }, + # 7Hi only: + 51 => { + Name => 'ColorProfile', + Condition => '$self->{Model} eq "DiMAGE 7Hi"', + Notes => 'DiMAGE 7Hi only', + PrintConv => { + 0 => 'Not Embedded', + 1 => 'Embedded', + }, + }, + # (the following may be entry 51 for other models?) + 52 => { + Name => 'DataImprint', + Condition => '$self->{Model} eq "DiMAGE 7Hi"', + Notes => 'DiMAGE 7Hi only', + PrintConv => { + 0 => 'None', + 1 => 'YYYY/MM/DD', + 2 => 'MM/DD/HH:MM', + 3 => 'Text', + 4 => 'Text + ID#', + }, + }, + 63 => { #9 + Name => 'FlashMetering', + PrintConv => { + 0 => 'ADI (Advanced Distance Integration)', + 1 => 'Pre-flash TTL', + 2 => 'Manual flash control', + }, + }, +); + +# Camera settings used by the 7D (ref 8) +%Image::ExifTool::Minolta::CameraSettings7D = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + 0x00 => { + Name => 'ExposureMode', + PrintConv => { + 0 => 'Program', + 1 => 'Aperture Priority', + 2 => 'Shutter Priority', + 3 => 'Manual', + 4 => 'Auto', + 5 => 'Program-shift A', + 6 => 'Program-shift S', + }, + }, + 0x02 => { #PH + Name => 'MinoltaImageSize', + PrintConv => { + 0 => 'Large', + 1 => 'Medium', + 2 => 'Small', + }, + }, + 0x03 => { + Name => 'MinoltaQuality', + PrintConv => { + 0 => 'RAW', + 16 => 'Fine', #PH + 32 => 'Normal', #PH + 34 => 'RAW+JPEG', + 48 => 'Economy', #PH + }, + }, + 0x04 => { + Name => 'WhiteBalance', + PrintConv => { + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Shade', + 3 => 'Cloudy', + 4 => 'Tungsten', + 5 => 'Fluorescent', + 0x100 => 'Kelvin', + 0x200 => 'Manual', + }, + }, + 0x0e => { + Name => 'FocusMode', + PrintConv => { + 0 => 'AF-S', + 1 => 'AF-C', + # Note: these two are reversed in ref 8 + 3 => 'Manual', #JD + 4 => 'AF-A', #JD + }, + }, + 0x10 => { + Name => 'AFPoints', + PrintConv => { + 0 => '(none)', + BITMASK => { + 0 => 'Center', + 1 => 'Top', + 2 => 'Top-right', + 3 => 'Right', + 4 => 'Bottom-right', + 5 => 'Bottom', + 6 => 'Bottom-left', + 7 => 'Left', + 8 => 'Top-left', + }, + }, + }, + 0x15 => { + Name => 'Flash', + PrintConv => \%offOn, + }, + 0x16 => { #10 + Name => 'FlashMode', + PrintConv => { + 0 => 'Normal', + 1 => 'Red-eye reduction', + 2 => 'Rear flash sync', + }, + }, + 0x1c => { + Name => 'ISOSetting', + PrintConv => { + 0 => 'Auto', #10 + 1 => 100, + 3 => 200, + 4 => 400, + 5 => 800, + 6 => 1600, + 7 => 3200, + }, + }, + 0x1e => { + Name => 'ExposureCompensation', + Format => 'int16s', + ValueConv => '$val / 24', + ValueConvInv => '$val * 24', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x25 => { + Name => 'ColorSpace', + PrintConv => { + 0 => 'Natural sRGB', + 1 => 'Natural+ sRGB', + 4 => 'Adobe RGB', + }, + }, + 0x26 => { + Name => 'Sharpness', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + }, + 0x27 => { + Name => 'Contrast', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + }, + 0x28 => { + Name => 'Saturation', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + }, + 0x2d => 'FreeMemoryCardImages', + 0x3f => { + Format => 'int16s', + Name => 'ColorTemperature', + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + }, + 0x40 => { #10 + Name => 'HueAdjustment', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + }, + 0x46 => { + Name => 'Rotation', + PrintConv => { + 72 => 'Horizontal (normal)', + 76 => 'Rotate 90 CW', + 82 => 'Rotate 270 CW', + }, + }, + 0x47 => { + Name => 'FNumber', + ValueConv => '2 ** (($val-8)/16)', + ValueConvInv => '8 + 16*log($val)/log(2)', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x48 => { + Name => 'ExposureTime', + ValueConv => '2 ** ((48-$val)/8)', + ValueConvInv => '48 - 8*log($val)/log(2)', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x4a => 'FreeMemoryCardImages', + 0x5e => { + Name => 'ImageNumber', + Notes => q{ + this information may appear at index 98 (0x62), depending on firmware + version + }, + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x60 => { + Name => 'NoiseReduction', + PrintConv => \%offOn, + }, + 0x62 => { + Name => 'ImageNumber2', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0x71 => { + Name => 'ImageStabilization', + PrintConv => \%offOn, + }, + 0x75 => { + Name => 'ZoneMatchingOn', + PrintConv => \%offOn, + }, +); + +# Camera settings used by the 5D (ref 8) +%Image::ExifTool::Minolta::CameraSettings5D = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + 0x0a => { + Name => 'ExposureMode', + PrintConv => { + 0 => 'Program', + 1 => 'Aperture Priority', + 2 => 'Shutter Priority', + 3 => 'Manual', + 4 => 'Auto?', + 4131 => 'Connected Copying?', + }, + }, + 0x0c => { #PH + Name => 'MinoltaImageSize', + PrintConv => { + 0 => 'Large', + 1 => 'Medium', + 2 => 'Small', + }, + }, + 0x0d => { + Name => 'MinoltaQuality', + PrintConv => { + 0 => 'RAW', + 16 => 'Fine', #PH + 32 => 'Normal', #PH + 34 => 'RAW+JPEG', + 48 => 'Economy', #PH + }, + }, + 0x0e => { + Name => 'WhiteBalance', + PrintConv => { + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Cloudy', + 3 => 'Shade', + 4 => 'Tungsten', + 5 => 'Fluorescent', + 6 => 'Flash', + 0x100 => 'Kelvin', + 0x200 => 'Manual', + }, + }, + # 0x0f-0x11 something to do with WB RGB levels as shot? (PH) + # 0x12-0x17 RGB levels for other WB modes (with G missing)? (PH) + 0x1f => { #PH + Name => 'Flash', + PrintConv => { + 0 => 'Did not fire', + 1 => 'Fired', + }, + }, + 0x20 => { #10 + Name => 'FlashMode', + PrintConv => { + 0 => 'Normal', + 1 => 'Red-eye reduction', + 2 => 'Rear flash sync', + }, + }, + 0x25 => { + Name => 'MeteringMode', + PrintConv => { + 0 => 'Multi-segment', + 1 => 'Center-weighted average', + 2 => 'Spot', + }, + }, + 0x26 => { + Name => 'ISOSetting', + PrintConv => { + 0 => 'Auto', + 1 => 100, + 3 => 200, + 4 => 400, + 5 => 800, + 6 => 1600, + 7 => 3200, + 8 => '200 (Zone Matching High)', + 10 => '80 (Zone Matching Low)', + }, + }, +# looks wrong: +# 0x28 => { #10 +# Name => 'ExposureCompensation', +# ValueConv => '$val / 24', +# ValueConvInv => '$val * 24', +# }, + 0x2f => { #10 + Name => 'ColorSpace', + PrintConv => { + 0 => 'Natural sRGB', + 1 => 'Natural+ sRGB', + 2 => 'Monochrome', + 4 => 'Adobe RGB (ICC)', + 5 => 'Adobe RGB', + }, + }, + 0x30 => { + Name => 'Sharpness', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + }, + 0x31 => { + Name => 'Contrast', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + }, + 0x32 => { + Name => 'Saturation', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + }, + 0x35 => { #PH + Name => 'ExposureTime', + ValueConv => '2 ** ((48-$val)/8)', + ValueConvInv => '48 - 8*log($val)/log(2)', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x36 => { #PH + Name => 'FNumber', + ValueConv => '2 ** (($val-8)/16)', + ValueConvInv => '8 + 16*log($val)/log(2)', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x37 => 'FreeMemoryCardImages', + # 0x38 definitely not related to exposure comp as in ref 8 (PH) + 0x49 => { #PH + Name => 'ColorTemperature', + Format => 'int16s', + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + }, + 0x4a => { #10 + Name => 'HueAdjustment', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + }, + 0x50 => { + Name => 'Rotation', + PrintConv => { + 72 => 'Horizontal (normal)', + 76 => 'Rotate 90 CW', + 82 => 'Rotate 270 CW', + }, + }, + 0x53 => { + Name => 'ExposureCompensation', + ValueConv => '$val / 100 - 3', + ValueConvInv => '($val + 3) * 100', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x54 => 'FreeMemoryCardImages', + 0x65 => { #10 + Name => 'Rotation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + }, + }, + # 0x66 maybe program mode or some setting like this? (PH) + 0x6e => { #10 + Name => 'ColorTemperature', + Format => 'int16s', + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + }, + 0x71 => { #10 + Name => 'PictureFinish', + PrintConv => { + 0 => 'Natural', + 1 => 'Natural+', + 2 => 'Portrait', + 3 => 'Wind Scene', + 4 => 'Evening Scene', + 5 => 'Night Scene', + 6 => 'Night Portrait', + 7 => 'Monochrome', + 8 => 'Adobe RGB', + 9 => 'Adobe RGB (ICC)', + }, + }, + # 0x95 FlashStrength? (PH) + # 0xa4 similar information to 0x27, except with different values + 0xae => { + Name => 'ImageNumber', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 0xb0 => { + Name => 'NoiseReduction', + PrintConv => \%offOn, + }, + 0xbd => { + Name => 'ImageStabilization', + PrintConv => \%offOn, + }, +); + +# Camera settings used by the Sony DSLR-A100 (ref 20) +%Image::ExifTool::Minolta::CameraInfoA100 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + NOTES => 'Camera information for the Sony DSLR-A100.', + WRITABLE => 1, + PRIORITY => 0, # may not be as reliable as other information + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + 0x01 => { #PH + Name => 'AFSensorActive', + PrintConv => { + 0 => 'Top-right', + 1 => 'Bottom-right', + 2 => 'Bottom', + 3 => 'Middle Horizontal', + 4 => 'Center Vertical', + 5 => 'Top', + 6 => 'Top-left', + 7 => 'Bottom-left', + }, + }, + 0x02 => { + Name => 'AFStatusActiveSensor', + %afStatusInfo, + Notes => q{ + the focus status at shutter release. May not reflect the status after + focusing if the image is focused then recomposed + }, + }, + 0x04 => { Name => 'AFStatusTop-right', %afStatusInfo }, + 0x06 => { Name => 'AFStatusBottom-right', %afStatusInfo }, + 0x08 => { Name => 'AFStatusBottom', %afStatusInfo }, + 0x0a => { + Name => 'AFStatusMiddleHorizontal', + %afStatusInfo, + Notes => q{ + any of the three horizontal sensors at the middle of the focus frame: Left, + Center or Right + }, + }, + 0x0c => { Name => 'AFStatusCenterVertical', %afStatusInfo }, + 0x0e => { Name => 'AFStatusTop', %afStatusInfo }, + 0x10 => { Name => 'AFStatusTop-left', %afStatusInfo }, + 0x12 => { Name => 'AFStatusBottom-left', %afStatusInfo }, + 0x14 => { + Name => 'FocusLocked', + # (Focus can be locked in all modes other than Manual and Continuous, + # and the latter can be overridden by pushing the Spot AF button) + PrintConv => { + 0 => 'Manual Focus', + 4 => 'No', + 16 => 'Continuous Focus', + 64 => 'Yes', + }, + }, + 0x15 => { + Name => 'AFPoint', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Auto', + 1 => 'Center', + 2 => 'Top', + 3 => 'Top-right', + 4 => 'Right', + 5 => 'Bottom-right', + 6 => 'Bottom', + 7 => 'Bottom-left', + 8 => 'Left', + 9 => 'Top-left', + }, + }, + 0x16 => { + Name => 'AFMode', + PrintConv => { + 0 => 'DMF', + 1 => 'AF-S', + 2 => 'AF-C', + 3 => 'AF-A', + }, + }, + 0x2d => { Name => 'AFStatusLeft', %afStatusInfo }, + 0x2f => { Name => 'AFStatusCenterHorizontal',%afStatusInfo }, + 0x31 => { Name => 'AFStatusRight', %afStatusInfo }, + 0x33 => { + Name => 'AFAreaMode', + PrintConv => { + 0 => 'Wide', + 1 => 'Local', + 2 => 'Spot', + }, + }, +); + +# Image stabilization information used by the Sony DSLR-A100 (ref 20) +%Image::ExifTool::Minolta::ISInfoA100 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + NOTES => 'Image stabilization information for the Sony DSLR-A100.', + WRITABLE => 1, + PRIORITY => 0, # may not be as reliable as other information + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + 0 => { + Name => 'ImageStabilization', + Format => 'int16u', + PrintHex => 1, + PrintConv => { + 0x0000 => 'Off', + 0x2784 => 'On', + }, + }, +); + +# Camera settings used by the Sony DSLR-A100 (ref PH) +%Image::ExifTool::Minolta::CameraSettingsA100 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + NOTES => 'Camera settings information for the Sony DSLR-A100.', + WRITABLE => 1, + PRIORITY => 0, # may not be as reliable as other information + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + 0x00 => { #15 + Name => 'ExposureMode', + PrintHex => 1, + PrintConv => { + 0 => 'Program', + 1 => 'Aperture Priority', + 2 => 'Shutter Priority', + 3 => 'Manual', + 4 => 'Auto', + 5 => 'Program Shift A', #20 + 6 => 'Program Shift S', #20 + 0x1013 => 'Portrait', + 0x1023 => 'Sports', #20 + 0x1033 => 'Sunset', #20 + 0x1043 => 'Night View/Portrait', #20 + 0x1053 => 'Landscape', + 0x1083 => 'Macro', #20 + }, + }, + 0x01 => { #15 + Name => 'ExposureCompensationSetting', + # (differs from ExposureCompensation for exposure bracketing shots, ref 20) + ValueConv => '$val / 100 - 3', + ValueConvInv => 'int(($val + 3) * 100 + 0.5)', + }, + 0x05 => { #20 (requires external flash) + Name => 'HighSpeedSync', + PrintConv => \%offOn, + }, + 0x06 => { #20 + Name => 'ShutterSpeedSetting', + Notes => 'used only in M and S exposure modes', + ValueConv => '$val ? 2 ** (6 - $val/8) : 0', + ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x07 => { #20 + Name => 'ApertureSetting', + Notes => 'used only in M and A exposure modes', + ValueConv => '2 ** (($val/8 - 1) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', + }, + 0x08 => { #20 + Name => 'ExposureTime', + ValueConv => '$val ? 2 ** (6 - $val/8) : 0', + ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x09 => { #15/20 + Name => 'FNumber', + ValueConv => '2 ** (($val/8 - 1) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', + }, + 0x0a => { #20 + Name => 'DriveMode2', # (one of these is probably DriveModeSetting like Sony - PH) + PrintHex => 1, + PrintConv => { + 0x000 => 'Self-timer 10 sec', + 0x001 => 'Continuous', + 0x302 => 'Single-frame Bracketing Low', + 0x702 => 'Single-frame Bracketing High', + 0x303 => 'Continous Bracketing Low', + 0x703 => 'Continuous Bracketing High', + 0x004 => 'Self-timer 2 sec', + 0x005 => 'Single Frame', + 0x008 => 'White Balance Bracketing Low', + 0x009 => 'White Balance Bracketing High', + }, + }, + 0x0b => { #15 + Name => 'WhiteBalance', + PrintHex => 1, + PrintConv => { + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Cloudy', + 3 => 'Shade', + 4 => 'Tungsten', + 5 => 'Fluorescent', + 6 => 'Flash', + 0x100 => 'Kelvin', + 0x200 => 'Manual', + }, + }, + 0x0c => { #20 + Name => 'FocusMode', + PrintConv => { + 0 => 'AF-S', + 1 => 'AF-C', + 4 => 'AF-A', + 5 => 'Manual', + 6 => 'DMF', + }, + }, + 0x0d => { #20 + Name => 'AFPointSelected', # (v8.88: renamed from LocalAFAreaPoint) + # (9-point centre-cross AF system, ref JR) + PrintConv => { + 1 => 'Center', + 2 => 'Top', + 3 => 'Top-right', + 4 => 'Right', + 5 => 'Bottom-right', + 6 => 'Bottom', + 7 => 'Bottom-left', + 8 => 'Left', + 9 => 'Top-left', + }, + }, + 0x0e => { #20 + Name => 'AFAreaMode', + PrintConv => { + 0 => 'Wide', + 1 => 'Local', + 2 => 'Spot', + }, + }, + 0x0f => { #20 + Name => 'FlashMode', + PrintConv => { + 0 => 'Auto', + 2 => 'Rear Sync', + 3 => 'Wireless', + 4 => 'Fill Flash', + }, + }, + 0x10 => { #20 + Name => 'FlashExposureCompSet', + Description => 'Flash Exposure Comp. Setting', + # (may differ from FlashExposureComp for flash bracketing shots) + ValueConv => '$val / 100 - 3', + ValueConvInv => 'int(($val + 3) * 100 + 0.5)', + }, + 0x12 => { #15/20 + Name => 'MeteringMode', + PrintConv => { + 0 => 'Multi-segment', + 1 => 'Center-weighted average', + 2 => 'Spot', + }, + }, + 0x13 => { #15/20 + Name => 'ISOSetting', + PrintConv => { + 0 => 'Auto', + 48 => 100, + 56 => 200, + 64 => 400, + 72 => 800, + 80 => 1600, + 174 => '80 (Zone Matching Low)', + 184 => '200 (Zone Matching High)', + }, + }, + 0x14 => { #15/20 + Name => 'ZoneMatchingMode', + PrintConv => { + 0 => 'Off', + 1 => 'Standard', + 2 => 'Advanced', + }, + }, + 0x15 => { #15/20 + Name => 'DynamicRangeOptimizer', + # this and the Sony tag 0xb025 DynamicRangeOptimizer give the actual mode + # applied to the image. The Minolta CameraSettingsA100 0x0027 tag gives + # the setting. There is a longish list of scenarios in which, regardless + # of the latter, DRO is not applied (ref 20) + Notes => 'as applied to image', + PrintConv => { + 0 => 'Off', + 1 => 'Standard', + 2 => 'Advanced', + }, + }, + 0x16 => { #15 + Name => 'ColorMode', + PrintConv => { + 0 => 'Standard', + 1 => 'Vivid', + 2 => 'Portrait', + 3 => 'Landscape', + 4 => 'Sunset', + 5 => 'Night Scene', + 7 => 'B&W', + 8 => 'Adobe RGB', + }, + }, + 0x17 => { # 15/20 + Name => 'ColorSpace', + PrintConv => { + 0 => 'sRGB', + 2 => 'B&W', #PH (A100) + 5 => 'Adobe RGB', + }, + }, + 0x18 => { #15 + Name => 'Sharpness', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + %Image::ExifTool::Exif::printParameter, + }, + 0x19 => { #15 + Name => 'Contrast', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + %Image::ExifTool::Exif::printParameter, + }, + 0x1a => { #15 + Name => 'Saturation', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + %Image::ExifTool::Exif::printParameter, + }, + 0x1c => { #20 + Name => 'FlashMetering', + PrintConv => { + 0 => 'ADI (Advanced Distance Integration)', + 1 => 'Pre-flash TTL', + }, + }, + 0x1d => { #20 + Name => 'PrioritySetupShutterRelease', + PrintConv => { + 0 => 'AF', + 1 => 'Release', + }, + }, + 0x1e => { #PH + Name => 'DriveMode', + PrintConv => { + 0 => 'Single Frame', + 1 => 'Continuous', + 2 => 'Self-timer', + 3 => 'Continuous Bracketing', + 4 => 'Single-Frame Bracketing', + 5 => 'White Balance Bracketing', + }, + }, + 0x1f => { #20 + Name => 'SelfTimerTime', + PrintConv => { + 0 => '10 s', + 4 => '2 s', + }, + }, + 0x20 => { #20 + Name => 'ContinuousBracketing', + PrintHex => 1, + PrintConv => { + 0x303 => 'Low', + 0x703 => 'High', + }, + }, + 0x21 => { #20 + Name => 'SingleFrameBracketing', + PrintHex => 1, + PrintConv => { + 0x302 => 'Low', + 0x702 => 'High', + }, + }, + 0x22 => { #20 + Name => 'WhiteBalanceBracketing', + PrintHex => 1, + PrintConv => { + 0x08 => 'Low', + 0x09 => 'High', + }, + }, + 0x023 => { #20 + Name => 'WhiteBalanceSetting', + PrintHex => 1, + # (not sure what bit 0x8000 indicates) + PrintConv => { + 0 => 'Auto', + 1 => 'Preset', + 2 => 'Custom', + 3 => 'Color Temperature/Color Filter', + 0x8001 => 'Preset', + 0x8002 => 'Custom', + 0x8003 => 'Color Temperature/Color Filter', + }, + }, + 0x24 => { #20 + Name => 'PresetWhiteBalance', + PrintConv => { + 1 => 'Daylight', + 2 => 'Cloudy', + 3 => 'Shade', + 4 => 'Tungsten', + 5 => 'Fluorescent', + 6 => 'Flash', + }, + }, + 0x25 => { #20 + Name => 'ColorTemperatureSetting', + PrintConv => { + 0 => 'Temperature', + 2 => 'Color Filter', + }, + }, + 0x26 => { #20 + Name => 'CustomWBSetting', + PrintConv => { + 0 => 'Setup', + 1 => 'Recall', + }, + }, + 0x27 => { #20 + Name => 'DynamicRangeOptimizerSetting', + Notes => 'as set in camera', + PrintConv => { + 0 => 'Off', + 1 => 'Standard', + 2 => 'Advanced', + }, + }, + 0x32 => 'FreeMemoryCardImages', #20 + 0x34 => 'CustomWBRedLevel', #20 + 0x35 => 'CustomWBGreenLevel', #20 + 0x36 => 'CustomWBBlueLevel', #20 + 0x37 => { #20 + Name => 'CustomWBError', + PrintConv => { + 0 => 'OK', + 1 => 'Error', + }, + }, + 0x38 => { #20 + Name => 'WhiteBalanceFineTune', + Format => 'int16s', + }, + 0x39 => { #20 + Name => 'ColorTemperature', + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + }, + 0x3a => { #20 + Name => 'ColorCompensationFilter', + Format => 'int16s', + Notes => 'ranges from -2 for green to +2 for magenta', + }, + 0x3b => { #20 + Name => 'SonyImageSize', + PrintConv => { + 0 => 'Standard', + 1 => 'Medium', + 2 => 'Small', + }, + }, + 0x3c => { #20 + Name => 'SonyQuality', + PrintConv => { + 0 => 'RAW', + 32 => 'Fine', + 34 => 'RAW + JPEG', + 48 => 'Standard', + }, + }, + 0x3d => { #20 + Name => 'InstantPlaybackTime', + PrintConv => '"$val s"', + PrintConvInv => '$val=~s/\s*s//; $val', + }, + 0x3e => { #20 + Name => 'InstantPlaybackSetup', + PrintConv => { + 0 => 'Image and Information', + 1 => 'Image Only', + # 2 appears to be unused + 3 => 'Image and Histogram', + }, + }, + 0x3f => { #PH + Name => 'NoiseReduction', + PrintConv => \%offOn, + }, + 0x40 => { #20 + Name => 'EyeStartAF', + PrintConv => \%onOff, + }, + 0x41 => { #20 + Name => 'RedEyeReduction', + PrintConv => \%offOn, + }, + 0x42 => { #20 + Name => 'FlashDefault', + PrintConv => { + 0 => 'Auto', + 1 => 'Fill Flash', + }, + }, + 0x43 => { #20 + Name => 'AutoBracketOrder', + PrintConv => { + 0 => '0 - +', + 1 => '- 0 +', + }, + }, + 0x44 => { #20 + Name => 'FocusHoldButton', + PrintConv => { + 0 => 'Focus Hold', + 1 => 'DOF Preview', + }, + }, + 0x45 => { #20 + Name => 'AELButton', + PrintConv => { + 0 => 'Hold', + 1 => 'Toggle', + 2 => 'Spot Hold', + 3 => 'Spot Toggle', + }, + }, + 0x46 => { #20 + Name => 'ControlDialSet', + PrintConv => { + 0 => 'Shutter Speed', + 1 => 'Aperture', + }, + }, + 0x47 => { #20 + Name => 'ExposureCompensationMode', + PrintConv => { + 0 => 'Ambient and Flash', + 1 => 'Ambient Only', + }, + }, + 0x48 => { #20 + Name => 'AFAssist', + PrintConv => \%onOff, + }, + 0x49 => { #20 + Name => 'CardShutterLock', + PrintConv => \%onOff, + }, + 0x4a => { #20 + Name => 'LensShutterLock', + PrintConv => \%onOff, + }, + 0x4b => { #20 + Name => 'AFAreaIllumination', + PrintConv => { + 0 => '0.3 s', + 1 => '0.6 s', + 2 => 'Off', + }, + }, + 0x4c => { #20 + Name => 'MonitorDisplayOff', + PrintConv => { + 0 => 'Automatic', + 1 => 'Manual', + }, + }, + 0x4d => { #20 + Name => 'RecordDisplay', + PrintConv => { + 0 => 'Auto Rotate', + 1 => 'Horizontal', + }, + }, + 0x4e => { #20 + Name => 'PlayDisplay', + PrintConv => { + 0 => 'Auto Rotate', + 1 => 'Manual Rotate', + }, + }, + 0x50 => { #20 + Name => 'ExposureIndicator', + SeparateTable => 'ExposureIndicator', + PrintConv => \%exposureIndicator, + }, + 0x51 => { #20 + Name => 'AELExposureIndicator', + Notes => 'also indicates exposure for next shot when bracketing', + SeparateTable => 'ExposureIndicator', + PrintConv => \%exposureIndicator, + }, + 0x52 => { #20 + Name => 'ExposureBracketingIndicatorLast', + Notes => 'indicator for last shot when bracketing', + SeparateTable => 'ExposureIndicator', + PrintConv => \%exposureIndicator, + }, + 0x53 => { #20 + Name => 'MeteringOffScaleIndicator', + Notes => 'two flashing triangles when under or over metering scale', + PrintConv => { + 0 => 'Within Range', + 1 => 'Under/Over Range', + 255 => 'Out of Range', + }, + }, + 0x54 => { #20 + Name => 'FlashExposureIndicator', + SeparateTable => 'ExposureIndicator', + PrintConv => \%exposureIndicator, + }, + 0x55 => { #20 + Name => 'FlashExposureIndicatorNext', + Notes => 'indicator for next shot when bracketing', + SeparateTable => 'ExposureIndicator', + PrintConv => \%exposureIndicator, + }, + 0x56 => { #20 + Name => 'FlashExposureIndicatorLast', + Notes => 'indicator for last shot when bracketing', + SeparateTable => 'ExposureIndicator', + PrintConv => \%exposureIndicator, + }, + 0x58 => { #20 + Name => 'FocusModeSwitch', + PrintConv => { + 0 => 'AF', + 1 => 'MF', + }, + }, + 0x59 => { #20 + Name => 'FlashType', + PrintConv => { + 0 => 'Off', + 1 => 'Built-in', # (also when built-in flash is a trigger in wireless mode) + 2 => 'External', + }, + }, + 0x5a => { #15 + Name => 'Rotation', + PrintConv => { + 0 => 'Horizontal (Normal)', + 1 => 'Rotate 270 CW', + 2 => 'Rotate 90 CW', + }, + }, + 0x5b => { #20 + Name => 'AELock', + PrintConv => \%offOn, + }, + 0x57 => { #15 + Name => 'ImageStabilization', + PrintConv => \%offOn, + }, + 0x5e => { #15 + Name => 'ColorTemperature', + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + }, + 0x5f => { #20 + Name => 'ColorCompensationFilter', + Format => 'int16s', + Notes => 'ranges from -2 for green to +2 for magenta', + }, + 0x60 => { #20 + Name => 'BatteryState', + PrintConv => { + 3 => 'Very Low', + 4 => 'Low', + 5 => 'Half Full', + 6 => 'Sufficient Power Remaining', + }, + }, +); + +# white balance information stored by the Sony DSLR-A100 (ref 20) +%Image::ExifTool::Minolta::WBInfoA100 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + NOTES => 'White balance information for the Sony DSLR-A100.', + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + PRIORITY => 0, + 0x0e => { + Name => 'DriveMode', + PrintConv => { + 0 => 'Self-timer 10 sec', + 1 => 'Continuous', + 2 => 'Single-frame Exposure Bracketing', + 3 => 'Continuous Exposure Bracketing', + 4 => 'Self-Timer 2 sec', + 5 => 'Single Frame', + 8 => 'White Balance Bracketing Low', + 9 => 'White Balance Bracketing High', + }, + }, + 0x10 => { + Name => 'Rotation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 270 CW', + 2 => 'Rotate 90 CW', + }, + }, + 0x14 => { + Name => 'ImageStabilizationSetting', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x15 => { + Name => 'DynamicRangeOptimizerMode', + PrintConv => { + 0 => 'Off', + 1 => 'Standard', + 2 => 'Advanced', + }, + }, + 0x2a => { + Name => 'ExposureCompensationMode', + PrintConv => { + 0 => 'Ambient and Flash', + 1 => 'Ambient Only', + }, + }, + 0x2b => 'WBBracketShotNumber', + 0x2c => { + Name => 'WhiteBalanceBracketing', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'High', + }, + }, + 0x2d => 'ExposureBracketShotNumber', + 0x31 => { + Name => 'FlashFunction', + Format => 'int16u', + PrintHex => 1, + PrintConv => { + 0x0000 => 'No flash', + 0x0300 => 'Built-in flash', + # (the following refers to an external flash) + 0x1205 => 'Manual', + 0x120e => 'Strobe', + #0x122e => ? + 0x128e => 'Fill flash, Pre-flash TTL', + 0x12ae => 'Bounce flash', + 0x140e => 'Rear sync, ADI', + 0x148e => 'Fill flash, ADI', + 0x1580 => 'Wireless', + # 0x17ae => ? + 0x178e => 'HSS', + }, + }, + 0x34 => { + Name => 'ExposureMode', + Format => 'int16u', + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => { + 0x0000 => 'Program', + 0x0001 => 'Aperture Priority', + 0x0002 => 'Shutter Priority', + 0x0003 => 'Manual', + 0x0004 => 'Auto', + 0x0005 => 'Program Shift A', + 0x0006 => 'Program Shift S', + 0x1013 => 'Portrait', + 0x1023 => 'Sports', + 0x1033 => 'Sunset', + 0x1043 => 'Night View/Portrait', + 0x1053 => 'Landscape', + 0x1083 => 'Macro', + }, + }, + 0x36 => { + Name => 'ColorMode', + Format => 'int16u', + PrintConv => { + 0x00 => 'Standard', + 0x01 => 'Vivid', + 0x02 => 'Portrait', + 0x03 => 'Landscape', + 0x04 => 'Sunset', + 0x05 => 'Night View', + 0x07 => 'B&W', + 0x08 => 'Adobe RGB', + }, + }, + 0x38 => { + Name => 'AverageLV', + Format => 'int16u', + Notes => 'arithmetic mean of the readings from the 40 honeycomb segments', + ValueConv => '($val-106)/8', + ValueConvInv => '$val * 8 + 106', + }, + # 0x3a - int16u: Approx FocusDistance in metres (0x0f50=inf) + 0x3c => { + Name => 'FrameNumber', + # Numbers > 1 appear in continuous and continuous bracketing drive modes, + # as well as WB bracketing. + }, + 0x96 => { Name => 'WB_RGBLevels', Format => 'int16u[3]' }, + 0xae => { Name => 'WB_GBRGLevels', Format => 'int16u[4]' }, + 0xc0 => { + Name => 'WB_RedLevelsTungsten', + Notes => '7 values for adjustments of -3 through +3', + Format => 'int16u[7]', + }, + 0xce => { Name => 'WB_BlueLevelsTungsten', Format => 'int16u[7]' }, + 0xdc => { Name => 'WB_RedLevelsDaylight', Format => 'int16u[7]' }, + 0xea => { Name => 'WB_BlueLevelsDaylight', Format => 'int16u[7]' }, + 0xf8 => { Name => 'WB_RedLevelsCloudy', Format => 'int16u[7]' }, + 0x106 => { Name => 'WB_BlueLevelsCloudy', Format => 'int16u[7]' }, + 0x114 => { Name => 'WB_RedLevelsFlash', Format => 'int16u[7]' }, + 0x122 => { Name => 'WB_BlueLevelsFlash', Format => 'int16u[7]' }, + 0x14c => { + Name => 'WB_RedLevelsFluorescent', + Format => 'int16u[7]', + Notes => q{ + white balance red presets for fluorescent -2 through +4: -2=Fluorescent, + -1=WhiteFluorescent, 0=CoolWhiteFluorescent, +1=DayWhiteFluorescent and + +3=DaylightFluorescent + }, + }, + 0x15a => { Name => 'WB_BlueLevelsFluorescent', Format => 'int16u[7]' }, + 0x168 => { Name => 'WB_RedLevelsShade', Format => 'int16u[7]' }, + 0x176 => { Name => 'WB_BlueLevelsShade', Format => 'int16u[7]' }, + 0x188 => { Name => 'WB_RedLevel6500K', Format => 'int16u' }, + 0x18a => { Name => 'WB_BlueLevel6500K', Format => 'int16u' }, + 0x18c => { Name => 'WB_RedLevelCustom', Format => 'int16u' }, + 0x18e => { Name => 'WB_BlueLevelCustom', Format => 'int16u' }, + 0x198 => { Name => 'WB_RedLevel3500K', Format => 'int16u' }, + 0x19a => { Name => 'WB_BlueLevel3500K', Format => 'int16u' }, + 0x1be => { + Name => 'WB_RedLevelsKelvin', + Format => 'int16u[75]', + Notes => 'values for 2500-9900 K, in increments of 100 K', + }, + 0x254 => { Name => 'WB_BlueLevelsKelvin', Format => 'int16u[75]' }, + 0x304 => { Name => 'WB_RBLevelsFlash', Format => 'int16u[2]' }, + 0x308 => { Name => 'WB_RBLevelsCoolWhiteF', Format => 'int16u[2]' }, + 0x3e8 => { Name => 'WB_RBLevelsTungsten', Format => 'int16u[2]' }, + 0x3ec => { Name => 'WB_RBLevelsDaylight', Format => 'int16u[2]' }, + 0x3f0 => { Name => 'WB_RBLevelsCloudy', Format => 'int16u[2]' }, + 0x3f4 => { Name => 'WB_RBLevelsFlash', Format => 'int16u[2]' }, + 0x3fc => { Name => 'WB_RedLevelsFluorescent', Format => 'int16u[7]' }, + 0x40a => { Name => 'WB_BlueLevelsFluorescent', Format => 'int16u[7]' }, + 0x418 => { Name => 'WB_RBLevelsShade', Format => 'int16u[2]' }, + 0x420 => { Name => 'WB_RBLevels6500K', Format => 'int16u[2]' }, + 0x424 => { Name => 'WB_RBLevelsCustom', Format => 'int16u[2]' }, + 0x430 => { Name => 'WB_RBLevels3500K', Format => 'int16u[2]' }, + 0x528 => { Name => 'WB_RBLevelsDaylight', Format => 'int16u[2]' }, + 0x546 => { Name => 'WB_RGBLevels', Format => 'int16u[3]' }, + 0x628 => { + Name => 'AEMeteringSegments', + Format => 'int8u[40]', + Notes => q{ + metering values from the 40 honeycomb segments, converted to LV. The first + value is for the outer cell, then the values are given row by row, from top + to bottom, with each row scanned left-to-right. The 21st value is the + middle cell, which gives the spot metering + }, + ValueConv => sub { join ' ', map( { ($_ - 106) / 8 } split(' ',$_[0]) ) }, + ValueConvInv => sub { join ' ', map( { int($_ * 8 + 106.5) } split(' ',$_[0]) ) }, + }, + 0x690 => { + Name => 'MeasuredLV', + Notes => 'measured light value based on MeteringMode', + ValueConv => '($val-106)/8', + ValueConvInv => '$val * 8 + 106', + }, + 0x691 => { + Name => 'BrightnessValue', + ValueConv => '($val-106)/8', + ValueConvInv => '$val * 8 + 106', + }, + # 0x87f - int8u: 33mm Equivalent magnification (FocusDistance = (1.5 * $val + 1) * FocalLength) (255=inf) + 0x104c => { # (9600 bytes: 4 sets of 40x30 int16u values in the range 0-8191) + Name => 'TiffMeteringImage', + Format => 'undef[9600]', + Notes => q{ + 13-bit RBGG (?) 40x30 pixels, presumably metering info, converted to a 16-bit + TIFF image; + }, + ValueConv => sub { + my ($val, $et) = @_; + return undef unless length $val >= 9600; + return \ "Binary data 7404 bytes" unless $et->Options('Binary'); + my @dat = unpack('n*', $val); # for Big-endian + # TIFF header for a 16-bit RGB 10dpi 40x30 image + $val = Image::ExifTool::MakeTiffHeader(40,30,3,16,10); + # re-order data to RGB pixels + my ($i, @val); + for ($i=0; $i<40*30; ++$i) { + # data is 13-bit (max 8191), shift left to fill 16 bits + # (typically, this gives a very dark image since the data should + # really be anti-logged to convert from EV to perceived brightness) +# push @val, $dat[$i]<<3, $dat[$i+2400]<<3, $dat[$i+1200]<<3; + push @val, int(5041.1*log($dat[$i]+1)/log(2)), int(5041.1*log($dat[$i+2400]+1)/log(2)), int(5041.1*log($dat[$i+1200]+1)/log(2)); + } + $val .= pack('v*', @val); # add TIFF strip data + return \$val; + }, + }, + 0x49b8 => { + Name => 'ExposureTime', + ValueConv => '$val ? 2 ** (6 - $val/8) : 0', + ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x49ba => { + Name => 'ISO', + ValueConv => '2 ** (($val-48)/8) * 100', + ValueConvInv => '48 + 8*log($val/100)/log(2)', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 0x49bb => { # (https://exiftool.org/forum/index.php/topic,3688.0.html) + # if this value is the 35mm equivalent magnification, then the formula could + # be (1.5 * 2**($val/16-5)+1) * FocalLength, but this tends to underestimate + # distance by about 18% (ref 20) (255=inf) + Name => 'FocusDistance', + ValueConv => '2**(($val-126)/16)', + ValueConvInv => 'log($val)/log(2)*16+126', + PrintConv => '$val > 266 ? "inf" : sprintf("%.2f m", $val)', + PrintConvInv => '$val=~s/ ?m//; $val=~/inf/i ? 267 : $val', + }, + 0x49bd => { + Name => 'LensType', + Format => 'int16uRev', + SeparateTable => 1, + ValueConvInv => 'int($val)', # (must truncate decimal part) + PrintConv => \%minoltaLensTypes, + }, + 0x49c0 => { + Name => 'ExposureCompensation', # (in exposure bracketing, this is the actual value used) + Format => 'int8s', + ValueConv => '$val / 8', + ValueConvInv => '$val * 8', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x49c1 => { + Name => 'FlashExposureComp', + Description => 'Flash Exposure Compensation', + Format => 'int8s', + ValueConv => '$val / 8', + ValueConvInv => '$val * 8', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x49c2 => { + Name => 'ImageStabilization', + PrintConv => \%offOn, + }, + 0x49c3 => { + Name => 'BrightnessValue', + ValueConv => '($val-106)/8', + ValueConvInv => '$val * 8 + 106', + }, + 0x49c5 => { + Name => 'MaxAperture', + ValueConv => '2 ** (($val-8)/16)', + ValueConvInv => '8 + 16*log($val)/log(2)', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + # 0x49c6 - gives focal length using same formula as 0x49bb + 0x49c7 => { + Name => 'FNumber', + ValueConv => '2 ** (($val-8)/16)', + ValueConvInv => '8 + 16*log($val)/log(2)', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x49dc => { + Name => 'InternalSerialNumber', + Format => 'string[12]', + }, +); + +# tags in Konica Minolta MOV videos (ref PH) +# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos) +%Image::ExifTool::Minolta::MOV1 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => q{ + This information is found in MOV videos from some Konica Minolta models such + as the DiMage Z10 and X50. + }, + 0 => { + Name => 'Make', + Format => 'string[32]', + }, + 0x20 => { + Name => 'ModelType', + Format => 'string[8]', + }, + # (01 00 at offset 0x28) + 0x2e => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val ? 10 / $val : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x32 => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x3a => { + Name => 'ExposureCompensation', + Format => 'rational64s', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + # 0x4c => 'WhiteBalance', ? + 0x50 => { + Name => 'FocalLength', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f mm",$val)', + }, +); + +# tags in Minolta MOV videos (ref PH) +# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos) +%Image::ExifTool::Minolta::MOV2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => q{ + This information is found in MOV videos from some Minolta models such as the + DiMAGE X and Xt. + }, + 0 => { + Name => 'Make', + Format => 'string[32]', + }, + 0x18 => { + Name => 'ModelType', + Format => 'string[8]', + }, + # (01 00 at offset 0x20) + 0x26 => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val ? 10 / $val : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x2a => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x32 => { + Name => 'ExposureCompensation', + Format => 'rational64s', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + # 0x44 => 'WhiteBalance', ? + 0x48 => { + Name => 'FocalLength', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f mm",$val)', + }, +); + +# more tags in Minolta MOV videos (ref PH) +%Image::ExifTool::Minolta::MMA = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + This information is found in MOV videos from Minolta models such as the + DiMAGE A2, S414 and 7Hi. + }, + 0 => { + Name => 'Make', + Format => 'string[20]', + }, + 20 => { + Name => 'SoftwareVersion', + Format => 'string[16]', + }, +); + +# basic Minolta white balance lookup +my %minoltaWhiteBalance = ( + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Cloudy', + 3 => 'Tungsten', + 5 => 'Custom', + 7 => 'Fluorescent', + 8 => 'Fluorescent 2', + 11 => 'Custom 2', + 12 => 'Custom 3', + # the following come from tests with the A2 (ref 2) + 0x0800000 => 'Auto', + 0x1800000 => 'Daylight', + 0x2800000 => 'Cloudy', + 0x3800000 => 'Tungsten', + 0x4800000 => 'Flash', + 0x5800000 => 'Fluorescent', + 0x6800000 => 'Shade', + 0x7800000 => 'Custom1', + 0x8800000 => 'Custom2', + 0x9800000 => 'Custom3', +); + +#------------------------------------------------------------------------------ +# PrintConv for Minolta white balance +sub ConvertWhiteBalance($) +{ + my $val = shift; + my $printConv = $minoltaWhiteBalance{$val}; + unless (defined $printConv) { + if ($val & 0xffff0000) { + # the A2 values can be shifted by +- 3 settings, where + # each setting adds or subtracts 0x0010000 (ref 2) + my $type = ($val & 0xff000000) + 0x800000; + if ($minoltaWhiteBalance{$type}) { + $printConv = $minoltaWhiteBalance{$type} . + sprintf("%+.8g", ($val - $type) / 0x10000); + } else { + $printConv = sprintf("Unknown (0x%x)", $val); + } + } else { + $printConv = sprintf("Unknown ($val)"); + } + } + return $printConv; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Minolta - Minolta EXIF maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Minolta and Konica-Minolta maker notes in EXIF information, and to read +and write Minolta RAW (MRW) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.dalibor.cz/minolta/makernote.htm> + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jay Al-Saadi, Niels Kristian Bech Jensen, Shingo Noguchi, Pedro +Corte-Real, Jeffery Small, Jens Duttke, Thomas Kassner, Mladen Sever, Olaf +Ulrich, Lukasz Stelmach, Igal Milchtaich, Jos Roost and Michael Reitinger +for the information they provided, and for everyone who helped with the +LensType list. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Minolta Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/MinoltaRaw.pm b/lib/Image/ExifTool/MinoltaRaw.pm new file mode 100644 index 0000000..0610448 --- /dev/null +++ b/lib/Image/ExifTool/MinoltaRaw.pm @@ -0,0 +1,536 @@ +#------------------------------------------------------------------------------ +# File: MinoltaRaw.pm +# +# Description: Read/write Konica-Minolta RAW (MRW) meta information +# +# Revisions: 03/11/2006 - P. Harvey Split out from Minolta.pm +# +# References: 1) http://www.cybercom.net/~dcoffin/dcraw/ +# 2) http://www.chauveau-central.net/mrw-format/ +# 3) Igal Milchtaich private communication (A100) +#------------------------------------------------------------------------------ + +package Image::ExifTool::MinoltaRaw; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Minolta; + +$VERSION = '1.16'; + +sub ProcessMRW($$;$); +sub WriteMRW($$;$); + +# Minolta MRW tags +%Image::ExifTool::MinoltaRaw::Main = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::MinoltaRaw::ProcessMRW, + WRITE_PROC => \&Image::ExifTool::MinoltaRaw::WriteMRW, + NOTES => 'These tags are used in Minolta RAW format (MRW) images.', + "\0TTW" => { # TIFF Tags + Name => 'MinoltaTTW', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + # this EXIF information starts with a TIFF header + ProcessProc => \&Image::ExifTool::ProcessTIFF, + WriteProc => \&Image::ExifTool::WriteTIFF, + }, + }, + "\0PRD" => { # Raw Picture Dimensions + Name => 'MinoltaPRD', + SubDirectory => { TagTable => 'Image::ExifTool::MinoltaRaw::PRD' }, + }, + "\0WBG" => { # White Balance Gains + Name => 'MinoltaWBG', + SubDirectory => { TagTable => 'Image::ExifTool::MinoltaRaw::WBG' }, + }, + "\0RIF" => { # Requested Image Format + Name => 'MinoltaRIF', + SubDirectory => { TagTable => 'Image::ExifTool::MinoltaRaw::RIF' }, + }, + # "\0CSA" is padding +); + +# Minolta MRW PRD information (ref 2) +%Image::ExifTool::MinoltaRaw::PRD = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0 ], + FIRST_ENTRY => 0, + 0 => { + Name => 'FirmwareID', + Format => 'string[8]', + RawConv => '$$self{MinoltaPRD} = 1 if $$self{FILE_TYPE} eq "MRW"; $val', # used in decoding RIF info + }, + 8 => { + Name => 'SensorHeight', + Format => 'int16u', + }, + 10 => { + Name => 'SensorWidth', + Format => 'int16u', + }, + 12 => { + Name => 'ImageHeight', + Format => 'int16u', + }, + 14 => { + Name => 'ImageWidth', + Format => 'int16u', + }, + 16 => { + Name => 'RawDepth', + Format => 'int8u', + }, + 17 => { + Name => 'BitDepth', + Format => 'int8u', + }, + 18 => { + Name => 'StorageMethod', + Format => 'int8u', + PrintConv => { + 82 => 'Padded', + 89 => 'Linear', + }, + }, + 23 => { + Name => 'BayerPattern', + Format => 'int8u', + PrintConv => { + # 0 - seen in some Sony A850 ARW images + 1 => 'RGGB', + 4 => 'GBRG', + }, + }, +); + +# Minolta MRW WBG information (ref 2) +%Image::ExifTool::MinoltaRaw::WBG = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + 0 => { + Name => 'WBScale', + Format => 'int8u[4]', + }, + 4 => [ + { + Condition => '$$self{Model} =~ /DiMAGE A200\b/', + Name => 'WB_GBRGLevels', + Format => 'int16u[4]', + Notes => 'DiMAGE A200', + }, + { + Name => 'WB_RGGBLevels', + Format => 'int16u[4]', + Notes => 'other models', + }, + ], +); + +# Minolta MRW RIF information (ref 2) +%Image::ExifTool::MinoltaRaw::RIF = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + FIRST_ENTRY => 0, + 1 => { + Name => 'Saturation', + Format => 'int8s', + }, + 2 => { + Name => 'Contrast', + Format => 'int8s', + }, + 3 => { + Name => 'Sharpness', + Format => 'int8s', + }, + 4 => { + Name => 'WBMode', + PrintConv => 'Image::ExifTool::MinoltaRaw::ConvertWBMode($val)', + }, + 5 => { + Name => 'ProgramMode', + PrintConv => { + 0 => 'None', + 1 => 'Portrait', + 2 => 'Text', + 3 => 'Night Portrait', + 4 => 'Sunset', + 5 => 'Sports', + # have seen these values in Sony ARW images: - PH + # 7, 128, 129, 160 + }, + }, + 6 => { + Name => 'ISOSetting', + RawConv => '$val == 255 ? undef : $val', + PrintConv => { #3 + 0 => 'Auto', + 48 => 100, + 56 => 200, + 64 => 400, + 72 => 800, + 80 => 1600, + 174 => '80 (Zone Matching Low)', + 184 => '200 (Zone Matching High)', + OTHER => sub { + my ($val, $inv) = @_; + return int(2 ** (($val-48)/8) * 100 + 0.5) unless $inv; + # (must check for zero below in inverse conversion) + return 48 + 8*log($val/100)/log(2) if Image::ExifTool::IsFloat($val) and $val != 0; + return undef; + }, + }, + #ValueConv => '2 ** (($val-48)/8) * 100', + #ValueConvInv => '48 + 8*log($val/100)/log(2)', + #PrintConv => 'int($val + 0.5)', + #PrintConvInv => '$val', + }, + 7 => [ + { + Name => 'ColorMode', + Condition => '$$self{Make} !~ /^SONY/', + Priority => 0, + Writable => 'int32u', + PrintConv => \%Image::ExifTool::Minolta::minoltaColorMode, + }, + { #3 + Name => 'ColorMode', + Condition => '$$self{Model} eq "DSLR-A100"', + Writable => 'int32u', + Notes => 'Sony A100', + Priority => 0, + PrintHex => 1, + PrintConv => \%Image::ExifTool::Minolta::sonyColorMode, + }, + ], + # NOTE: WB_RBLevels up to Custom also apply to Minolta models which write PRD info (ref IB) + 8 => { #3 + Name => 'WB_RBLevelsTungsten', + Condition => '$$self{Model} eq "DSLR-A100" or $$self{MinoltaPRD}', + Format => 'int16u[2]', + Notes => 'these WB_RBLevels currently decoded only for the Sony A100', + }, + 12 => { #3 + Name => 'WB_RBLevelsDaylight', + Condition => '$$self{Model} eq "DSLR-A100" or $$self{MinoltaPRD}', + Format => 'int16u[2]', + }, + 16 => { #3 + Name => 'WB_RBLevelsCloudy', + Condition => '$$self{Model} eq "DSLR-A100" or $$self{MinoltaPRD}', + Format => 'int16u[2]', + }, + 20 => { #3 + Name => 'WB_RBLevelsCoolWhiteF', + Condition => '$$self{Model} eq "DSLR-A100" or $$self{MinoltaPRD}', + Format => 'int16u[2]', + }, + 24 => { #3 + Name => 'WB_RBLevelsFlash', + Condition => '$$self{Model} eq "DSLR-A100" or $$self{MinoltaPRD}', + Format => 'int16u[2]', + }, + 28 => { #3 + Name => 'WB_RBLevelsCustom', #IB + Condition => '$$self{Model} eq "DSLR-A100" or $$self{MinoltaPRD}', + Format => 'int16u[2]', + }, + 32 => { #3 + Name => 'WB_RBLevelsShade', + Condition => '$$self{Model} eq "DSLR-A100"', + Format => 'int16u[2]', + }, + 36 => { #3 + Name => 'WB_RBLevelsDaylightF', + Condition => '$$self{Model} eq "DSLR-A100"', + Format => 'int16u[2]', + }, + 40 => { #3 + Name => 'WB_RBLevelsDayWhiteF', + Condition => '$$self{Model} eq "DSLR-A100"', + Format => 'int16u[2]', + }, + 44 => { #3 + Name => 'WB_RBLevelsWhiteF', + Condition => '$$self{Model} eq "DSLR-A100"', + Format => 'int16u[2]', + }, + 56 => { + Name => 'ColorFilter', + Condition => '$$self{Make} !~ /^SONY/', + Format => 'int8s', + Notes => 'Minolta models', + }, + 57 => 'BWFilter', + 58 => { + Name => 'ZoneMatching', + Condition => '$$self{Make} !~ /^SONY/', + Priority => 0, + Notes => 'Minolta models', + PrintConv => { + 0 => 'ISO Setting Used', + 1 => 'High Key', + 2 => 'Low Key', + }, + }, + 59 => { + Name => 'Hue', + Format => 'int8s', + }, + 60 => { + Name => 'ColorTemperature', + Condition => '$$self{Make} !~ /^SONY/', + Notes => 'Minolta models', + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + }, + 74 => { #3 + Name => 'ZoneMatching', + Condition => '$$self{Make} =~ /^SONY/', + Priority => 0, + Notes => 'Sony models', + PrintConv => { + 0 => 'ISO Setting Used', + 1 => 'High Key', + 2 => 'Low Key', + }, + }, + 76 => { #3 + Name => 'ColorTemperature', + Condition => '$$self{Model} eq "DSLR-A100"', + Notes => 'A100', + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + PrintConv => '$val ? $val : "Auto"', + PrintConvInv => '$val=~/Auto/i ? 0 : $val', + }, + 77 => { #3 + Name => 'ColorFilter', + Condition => '$$self{Model} eq "DSLR-A100"', + Notes => 'A100', + }, + 78 => { #3 + Name => 'ColorTemperature', + Condition => '$$self{Model} =~ /^DSLR-A(200|700)$/', + Notes => 'A200 and A700', + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + PrintConv => '$val ? $val : "Auto"', + PrintConvInv => '$val=~/Auto/i ? 0 : $val', + }, + 79 => { #3 + Name => 'ColorFilter', + Condition => '$$self{Model} =~ /^DSLR-A(200|700)$/', + Notes => 'A200 and A700', + }, + 80 => { #3 + Name => 'RawDataLength', + Condition => '$$self{Model} eq "DSLR-A100"', + Format => 'int32u', + Notes => 'A100', + Writable => 0, + }, +); + +#------------------------------------------------------------------------------ +# PrintConv for WBMode +sub ConvertWBMode($) +{ + my $val = shift; + my %mrwWB = ( + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Cloudy', + 3 => 'Tungsten', + 4 => 'Flash/Fluorescent', + 5 => 'Fluorescent', + 6 => 'Shade', + 7 => 'User 1', + 8 => 'User 2', + 9 => 'User 3', + 10 => 'Temperature', + ); + my $lo = $val & 0x0f; + my $wbstr = $mrwWB{$lo} || "Unknown ($lo)"; + my $hi = $val >> 4; + $wbstr .= ' (' . ($hi - 8) . ')' if $hi >= 6 and $hi <=12; + return $wbstr; +} + +#------------------------------------------------------------------------------ +# Write MRW directory (eg. in ARW images) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref +# Returns: new MRW data or undef on error +sub WriteMRW($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access + my $buff = ''; + $$dirInfo{OutFile} = \$buff; + ProcessMRW($et, $dirInfo, $tagTablePtr) > 0 or undef $buff; + return $buff; +} + +#------------------------------------------------------------------------------ +# Read or write Minolta MRW file +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref +# Returns: 1 on success, 0 if this wasn't a valid MRW file, or -1 on write error +# Notes: File pointer must be set to start of MRW in RAF upon entry +sub ProcessMRW($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $raf = $$dirInfo{RAF}; + my $outfile = $$dirInfo{OutFile}; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my ($data, $err, $outBuff); + + if ($$dirInfo{DataPt}) { + # make a RAF object for MRW information extracted from other file types + $raf = new File::RandomAccess($$dirInfo{DataPt}); + # MRW information in DNG images may not start at beginning of data block + $raf->Seek($$dirInfo{DirStart}, 0) if $$dirInfo{DirStart}; + } + $raf->Read($data,8) == 8 or return 0; + # "\0MRM" for big-endian (MRW images), and + # "\0MRI" for little-endian (MRWInfo in ARW images) + $data =~ /^\0MR([MI])/ or return 0; + my $hdr = "\0MR$1"; + SetByteOrder($1 . $1); + $et->SetFileType(); + $tagTablePtr = GetTagTable('Image::ExifTool::MinoltaRaw::Main'); + if ($outfile) { + $et->InitWriteDirs('TIFF'); # use same write dirs as TIFF + $outBuff = ''; + } + my $pos = $raf->Tell(); + my $offset = Get32u(\$data, 4) + $pos; + my $rtnVal = 1; + $verbose and printf $out " [MRW Data Offset: 0x%x]\n", $offset; + # loop through MRW segments (ref 1) + while ($pos < $offset) { + $raf->Read($data,8) == 8 or $err = 1, last; + $pos += 8; + my $tag = substr($data, 0, 4); + my $len = Get32u(\$data, 4); + if ($verbose) { + print $out "MRW ",$et->Printable($tag)," segment ($len bytes):\n"; + if ($verbose > 2) { + $raf->Read($data,$len) == $len and $raf->Seek($pos,0) or $err = 1, last; + $et->VerboseDump(\$data); + } + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($tagInfo and $$tagInfo{SubDirectory}) { + my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + my $buff; + # save shift for values stored with wrong base offset + $$et{MRW_WrongBase} = -($raf->Tell()); + $raf->Read($buff, $len) == $len or $err = 1, last; + my %subdirInfo = ( + DataPt => \$buff, + DataLen => $len, + DataPos => $pos, + DirStart => 0, + DirLen => $len, + DirName => $$tagInfo{Name}, + Parent => 'MRW', + NoTiffEnd => 1, # no end-of-TIFF check + ); + if ($outfile) { + my $writeProc = $tagInfo->{SubDirectory}->{WriteProc}; + my $val = $et->WriteDirectory(\%subdirInfo, $subTable, $writeProc); + if (defined $val and length $val) { + # pad to an even 4 bytes (can't hurt, and it seems to be the standard) + $val .= "\0" x (4 - (length($val) & 0x03)) if length($val) & 0x03; + $outBuff .= $tag . Set32u(length $val) . $val; + } elsif (not defined $val) { + $outBuff .= $data . $buff; # copy over original information + } + } else { + my $processProc = $tagInfo->{SubDirectory}->{ProcessProc}; + $et->ProcessDirectory(\%subdirInfo, $subTable, $processProc); + } + } elsif ($outfile) { + # add this segment to the output buffer + my $buff; + $raf->Read($buff, $len) == $len or $err = 1, last; + $outBuff .= $data . $buff; + } else { + # skip this segment + $raf->Seek($pos+$len, 0) or $err = 1, last; + } + $pos += $len; + } + $pos == $offset or $err = 1; # meta information length check + + if ($outfile) { + # write the file header then the buffered meta information + Write($outfile, $hdr, Set32u(length $outBuff), $outBuff) or $rtnVal = -1; + # copy over image data + while ($raf->Read($outBuff, 65536)) { + Write($outfile, $outBuff) or $rtnVal = -1; + } + # Sony IDC utility corrupts MRWInfo when writing ARW images, + # so make this a minor error for these images + $err and $et->Error("MRW format error", $$et{TIFF_TYPE} eq 'ARW'); + } else { + $err and $et->Warn("MRW format error"); + } + return $rtnVal; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::MinoltaRaw - Read/write Konica-Minolta RAW (MRW) information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read and +write Konica-Minolta RAW (MRW) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=item L<http://www.chauveau-central.net/mrw-format/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/MinoltaRaw Tags>, +L<Image::ExifTool::Minolta(3pm)|Image::ExifTool::Minolta>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Motorola.pm b/lib/Image/ExifTool/Motorola.pm new file mode 100644 index 0000000..5b6786a --- /dev/null +++ b/lib/Image/ExifTool/Motorola.pm @@ -0,0 +1,178 @@ +#------------------------------------------------------------------------------ +# File: Motorola.pm +# +# Description: Read Motorola meta information +# +# Revisions: 2015/10/29 - P. Harvey Created +# +# References: 1) Neal Krawetz private communication +#------------------------------------------------------------------------------ + +package Image::ExifTool::Motorola; + +use strict; +use vars qw($VERSION); +use Image::ExifTool::Exif; + +$VERSION = '1.02'; + +# Motorola makernotes tags (ref PH) +%Image::ExifTool::Motorola::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + WRITABLE => 1, + # 0x54e0 - int8u: 1 + # 0x54f0 - float + 0x5500 => { Name => 'BuildNumber', Writable => 'string' }, #1 (eg. 'MPJ24.139-23.4') + 0x5501 => { Name => 'SerialNumber', Writable => 'string' }, #1 (eg. 'ZY2238TJ4V') + # 0x5502 - int8u + # 0x5503 - int8u + # 0x5510 - int8u: 0,1 + # 0x5511 - int32u (3 of these tags for some cameras) + # 0x5512 - int32u + # 0x5520 - int16s + # 0x5530 - string: 'continuous-picture','auto','continuous-video' + # 0x5540 - int8u: 95 + # 0x5550 - int8u: 85,90 + # 0x5560 - string: 'auto' + # 0x5570 - string: 'auto','auto-hdr' + # 0x5580 - int32s: 9000,14949,15000,24000 + # 0x5590 - int32s: 30000 + # 0x55a0 - int32s: 960,1280,1440 + # 0x55b0 - int32s: 720,960,1080 + # 0x55c0 - int32s: 30 + # 0x55d0 - string: 'yuv420sp' + # 0x55e0-0x55e9 - int16u + # 0x55f0 - int8u: 10 + # 0x55f1 - int8u: 13 + # 0x55f2-0x55f5 - int16u[130] + # 0x5600 - int8u: 0,16 + # 0x5601 - int16u[16] + # 0x5602 - int32u[3,50] + # 0x5603 - int32u: 0 + # 0x6400 - string: 'AUTO','ON','OFF' + # 0x6401 - string: 'HDR' + # 0x6410 - string: 'NO','YES' + # 0x6420 - int32s for some models: 0 (only exists in HDR images?) + 0x6420 => { #forum13731 + Condition => '$format eq "string"', + Name => 'CustomRendered', + Writable => 'string', + }, + # 0x6430 - float + # 0x6431 - int8u: 0,1 + # 0x6432 - int8u: 0,79,100 + # 0x6433 - int8u: 0,1 + # 0x6434 - int8u: 0,65,100 + # 0x6435 - int8u: 1,6,24 + # 0x6436 - int8u: 55,60 + # 0x6437 - int8u: 30,35,40 + # 0x6438 - int8u: 24,40 + # 0x6439 - int8u: 15,50 + # 0x643a - int8u: 0,20 + # 0x643b - string: '2,8,-4','2,10,-4','' + # 0x643c - int32s + # 0x643d - float + # 0x6440 - int8u[N]: 0's and 1's + # 0x6441 - int8u[N] + # 0x6442,0x6443 - int8u[N]: 0's and 1's + # 0x644d - string: 'YES' + # 0x644f - float + # 0x6450 - float + # 0x6451 - float: 0.699999988079071 + # 0x6452 - int8u: 1 + # 0x6470 - string: 'AUTO' + # 0x6471 - int8u: 1 + # 0x6473 - int8u: 24 + # 0x6474 - int8u: 10 + # 0x6475 - int32u[24] + # 0x6476 - int32u: 2 + # 0x6490 - int8u: 0 + # 0x64c0 - int32s: 0,2 + # 0x64c1 - int32u: 1,4,64 + # 0x64c2,0x64c3 - int32s + # 0x64c4 - int32s + # 0x64c5 - int32u + 0x64d0 => { Name => 'DriveMode', Writable => 'string' }, #forum13731 + # 0x6500 - int8u: 1 + # 0x6501 - string: 'Luma-Chroma Plane','Chroma only' or int8u: 0 + # 0x6502 - string: 'Luma-Chroma Plane','Chroma only','' or int8u: 1,255 + # 0x6504 - int32s + # 0x6530-0x6535 - int32s + # 0x6600-0x6605 - int8u + # 0x6606 - string: 'D50','TL84','5000' - illuminant? color temperature? + # 0x6607 - string: 'D50g','D65','3000' - illuminant? color temperature? + # 0x6608 - string: 'A' + # 0x6609-0x660e - float + # 0x660f - int12u + # 0x6612-0x661b - int16u + # 0x661d - int16u + # 0x661e-0x6635 - float + # 0x6637 - int8u[212] + # 0x6640,0x6641 - int8u + # 0x6642-0x6649 - int16u + # 0x664e - in8u + # 0x664f-0x6652 - int16u + # 0x6653 - string: 'QC','AL' + # 0x6654-0x6656 - int16u + # 0x665d - int8u: 0 + 0x665e => { Name => 'Sensor', Writable => 'string' }, # (eg. 'BACK,IMX230') + # 0x6700 - string: eg. 'eac040d0','333e1721','001b7b3a','000000000005040f' + # 0x6701 - string: eg. '14048001',940140230','940140190' + # 0x6702 - string: '0L','1L','0S','3S','32','33,'42' + # 0x6703 - string: 'PR','SEG','LIG','LI','SHV','SH','SO' + # 0x6704 - string: 'DO','GX1','GZ0','GZ1','GX2','VI','VI1','VI2','GU','' + 0x6705 => { Name => 'ManufactureDate', Writable => 'string' }, # (NC, eg. '03Jun2015') + # 0x6706 - string: eg. '30454e4e','42%','01%','01','1','904c2ca2' + # 0x6707 - string: eg. '1','25a2ca16','002371e1','69' + # 0x6708-0x670c - string or int16u (string may be firmware revision) + # 0x6800 - int32u: 1,2 + # 0x6801,0x6802 - float + # 0x6803 - int16u + # 0x6804,0x6805 - float + # 0x6806 - int16u,int32s + # 0x6807 - int32s,int32u[3] + # 0x6808 - int32u,int32u[3] + # 0x6809,0x680a - float[3] + # 0x680d - int8u: 0 + # 0x680e - float: 0 + # 0x7000 - int8u: 0,2 + # 0x7001,0x7002 - int16s + # 0x7003-0x7005 - int16u + # 0x7100 - string: '0-7' + # 0x7101 - string: '4-7','0-7' + # 0x7102 - string: '0-3','' + # 0x7103,0x7104 - string: comma-separated lists of numbers +); + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Motorola - Read Motorola meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains the definitions to read meta information from Motorola +cell phone images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Motorola Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Nikon.pm b/lib/Image/ExifTool/Nikon.pm new file mode 100644 index 0000000..4ad5f46 --- /dev/null +++ b/lib/Image/ExifTool/Nikon.pm @@ -0,0 +1,12029 @@ +#------------------------------------------------------------------------------ +# File: Nikon.pm +# +# Description: Nikon EXIF maker notes tags +# +# Revisions: 12/09/2003 - P. Harvey Created +# 05/17/2004 - P. Harvey Added information from Joseph Heled +# 09/21/2004 - P. Harvey Changed tag 2 to ISOUsed & added PrintConv +# 12/01/2004 - P. Harvey Added default PRINT_CONV +# 01/01/2005 - P. Harvey Decode preview image and preview IFD +# 03/35/2005 - T. Christiansen additions +# 05/10/2005 - P. Harvey Decode encrypted lens data +# [ongoing] - P. Harvey Constantly decoding new information +# +# References: 1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html +# 2) Joseph Heled private communication (tests with D70) +# 3) Thomas Walter private communication (tests with Coolpix 5400) +# 4) http://www.cybercom.net/~dcoffin/dcraw/ +# 5) Brian Ristuccia private communication (tests with D70) +# 6) Danek Duvall private communication (tests with D70) +# 7) Tom Christiansen private communication (tests with D70) +# 8) Robert Rottmerhusen private communication +# 9) http://members.aol.com/khancock/pilot/nbuddy/ +# 10) Werner Kober private communication (D2H, D2X, D100, D70, D200, D90) +# 11) http://www.rottmerhusen.com/objektives/lensid/thirdparty.html +# 12) http://libexif.sourceforge.net/internals/mnote-olympus-tag_8h-source.html +# 13) Roger Larsson private communication (tests with D200) +# 14) http://homepage3.nifty.com/kamisaka/makernote/makernote_nikon.htm (2007/09/15) +# 15) http://tomtia.plala.jp/DigitalCamera/MakerNote/index.asp +# 16) Jeffrey Friedl private communication (D200 with firmware update) +# 17) http://www.wohlberg.net/public/software/photo/nstiffexif/ +# and Brendt Wohlberg private communication +# 18) Anonymous user private communication (D70, D200, D2x) +# 19) Bruce Stevens private communication +# 20) Vladimir Sauta private communication (D80) +# 21) Gregor Dorlars private communication (D300) +# 22) Tanel Kuusk private communication +# 23) Alexandre Naaman private communication (D3) +# 24) Geert De Soete private communication +# 26) Bozi (http://www.cpanforum.com/posts/8983) +# 27) Jens Kriese private communication +# 28) Warren Hatch private communication (D3v2.00 with SB-800 and SB-900) +# 29) Anonymous contribution 2011/05/25 (D700, D7000) +# 30) https://exiftool.org/forum/index.php/topic,3833.30.html +# 31) Michael Relt private communication +# 32) Stefan https://exiftool.org/forum/index.php/topic,4494.0.html +# 34) Stewart Bennett private communication (D4S, D810) +# 35) David Puschel private communication +# 36) Hayo Baann (forum10207) +# 37) Tom Lachecki, private communication +# 38) https://github.com/exiftool/exiftool/pull/40 (and forum10893) +# IB) Iliah Borg private communication (LibRaw) +# JD) Jens Duttke private communication +# NJ) Niels Kristian Bech Jensen private communication +#------------------------------------------------------------------------------ + +package Image::ExifTool::Nikon; + +use strict; +use vars qw($VERSION %nikonLensIDs %nikonTextEncoding); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::GPS; +use Image::ExifTool::XMP; + +$VERSION = '4.08'; + +sub LensIDConv($$$); +sub ProcessNikonAVI($$$); +sub ProcessNikonMOV($$$); +sub FormatString($); +sub ProcessNikonCaptureEditVersions($$$); +sub PrintAFPoints($$); +sub PrintAFPointsInv($$); +sub PrintAFPointsGrid($$); +sub PrintAFPointsGridInv($$$); +sub GetAFPointGrid($$;$); + +# nikon lens ID numbers (ref 8/11) +%nikonLensIDs = ( + Notes => q{ + The Nikon LensID is constructed as a Composite tag from the raw hex values + of 8 other tags: LensIDNumber, LensFStops, MinFocalLength, MaxFocalLength, + MaxApertureAtMinFocal, MaxApertureAtMaxFocal, MCUVersion and LensType, in + that order. Multiple lenses with the same LensID are differentiated by + decimal values in the list below. The user-defined "Lenses" list may be + used to specify the lens for ExifTool to choose in these cases (see the + L<sample config file|../config.html> for details). + }, + OTHER => \&LensIDConv, + # Note: Sync this list with Robert's Perl version at + # http://www.rottmerhusen.com/objektives/lensid/files/exif/fmountlens.p.txt + # (hex digits must be uppercase in keys below) + '01 58 50 50 14 14 02 00' => 'AF Nikkor 50mm f/1.8', + '01 58 50 50 14 14 05 00' => 'AF Nikkor 50mm f/1.8', + '02 42 44 5C 2A 34 02 00' => 'AF Zoom-Nikkor 35-70mm f/3.3-4.5', + '02 42 44 5C 2A 34 08 00' => 'AF Zoom-Nikkor 35-70mm f/3.3-4.5', + '03 48 5C 81 30 30 02 00' => 'AF Zoom-Nikkor 70-210mm f/4', + '04 48 3C 3C 24 24 03 00' => 'AF Nikkor 28mm f/2.8', + '05 54 50 50 0C 0C 04 00' => 'AF Nikkor 50mm f/1.4', + '06 54 53 53 24 24 06 00' => 'AF Micro-Nikkor 55mm f/2.8', + '07 40 3C 62 2C 34 03 00' => 'AF Zoom-Nikkor 28-85mm f/3.5-4.5', + '08 40 44 6A 2C 34 04 00' => 'AF Zoom-Nikkor 35-105mm f/3.5-4.5', + '09 48 37 37 24 24 04 00' => 'AF Nikkor 24mm f/2.8', + '0A 48 8E 8E 24 24 03 00' => 'AF Nikkor 300mm f/2.8 IF-ED', + '0A 48 8E 8E 24 24 05 00' => 'AF Nikkor 300mm f/2.8 IF-ED N', + '0B 48 7C 7C 24 24 05 00' => 'AF Nikkor 180mm f/2.8 IF-ED', + '0D 40 44 72 2C 34 07 00' => 'AF Zoom-Nikkor 35-135mm f/3.5-4.5', + '0E 48 5C 81 30 30 05 00' => 'AF Zoom-Nikkor 70-210mm f/4', + '0F 58 50 50 14 14 05 00' => 'AF Nikkor 50mm f/1.8 N', + '10 48 8E 8E 30 30 08 00' => 'AF Nikkor 300mm f/4 IF-ED', + '11 48 44 5C 24 24 08 00' => 'AF Zoom-Nikkor 35-70mm f/2.8', + '11 48 44 5C 24 24 15 00' => 'AF Zoom-Nikkor 35-70mm f/2.8', #Jakob Dettner + '12 48 5C 81 30 3C 09 00' => 'AF Nikkor 70-210mm f/4-5.6', + '13 42 37 50 2A 34 0B 00' => 'AF Zoom-Nikkor 24-50mm f/3.3-4.5', + '14 48 60 80 24 24 0B 00' => 'AF Zoom-Nikkor 80-200mm f/2.8 ED', + '15 4C 62 62 14 14 0C 00' => 'AF Nikkor 85mm f/1.8', + '17 3C A0 A0 30 30 0F 00' => 'Nikkor 500mm f/4 P ED IF', + '17 3C A0 A0 30 30 11 00' => 'Nikkor 500mm f/4 P ED IF', + '18 40 44 72 2C 34 0E 00' => 'AF Zoom-Nikkor 35-135mm f/3.5-4.5 N', + '1A 54 44 44 18 18 11 00' => 'AF Nikkor 35mm f/2', + '1B 44 5E 8E 34 3C 10 00' => 'AF Zoom-Nikkor 75-300mm f/4.5-5.6', + '1C 48 30 30 24 24 12 00' => 'AF Nikkor 20mm f/2.8', + '1D 42 44 5C 2A 34 12 00' => 'AF Zoom-Nikkor 35-70mm f/3.3-4.5 N', + '1E 54 56 56 24 24 13 00' => 'AF Micro-Nikkor 60mm f/2.8', + '1F 54 6A 6A 24 24 14 00' => 'AF Micro-Nikkor 105mm f/2.8', + '20 48 60 80 24 24 15 00' => 'AF Zoom-Nikkor 80-200mm f/2.8 ED', + '21 40 3C 5C 2C 34 16 00' => 'AF Zoom-Nikkor 28-70mm f/3.5-4.5', + '22 48 72 72 18 18 16 00' => 'AF DC-Nikkor 135mm f/2', + '23 30 BE CA 3C 48 17 00' => 'Zoom-Nikkor 1200-1700mm f/5.6-8 P ED IF', + '24 48 60 80 24 24 1A 02' => 'AF Zoom-Nikkor 80-200mm f/2.8D ED', + '25 48 44 5C 24 24 1B 02' => 'AF Zoom-Nikkor 35-70mm f/2.8D', + '25 48 44 5C 24 24 3A 02' => 'AF Zoom-Nikkor 35-70mm f/2.8D', + '25 48 44 5C 24 24 52 02' => 'AF Zoom-Nikkor 35-70mm f/2.8D', + '26 40 3C 5C 2C 34 1C 02' => 'AF Zoom-Nikkor 28-70mm f/3.5-4.5D', + '27 48 8E 8E 24 24 1D 02' => 'AF-I Nikkor 300mm f/2.8D IF-ED', + '27 48 8E 8E 24 24 F1 02' => 'AF-I Nikkor 300mm f/2.8D IF-ED + TC-14E', + '27 48 8E 8E 24 24 E1 02' => 'AF-I Nikkor 300mm f/2.8D IF-ED + TC-17E', + '27 48 8E 8E 24 24 F2 02' => 'AF-I Nikkor 300mm f/2.8D IF-ED + TC-20E', + '28 3C A6 A6 30 30 1D 02' => 'AF-I Nikkor 600mm f/4D IF-ED', + '28 3C A6 A6 30 30 F1 02' => 'AF-I Nikkor 600mm f/4D IF-ED + TC-14E', + '28 3C A6 A6 30 30 E1 02' => 'AF-I Nikkor 600mm f/4D IF-ED + TC-17E', + '28 3C A6 A6 30 30 F2 02' => 'AF-I Nikkor 600mm f/4D IF-ED + TC-20E', + '2A 54 3C 3C 0C 0C 26 02' => 'AF Nikkor 28mm f/1.4D', + '2B 3C 44 60 30 3C 1F 02' => 'AF Zoom-Nikkor 35-80mm f/4-5.6D', + '2C 48 6A 6A 18 18 27 02' => 'AF DC-Nikkor 105mm f/2D', + '2D 48 80 80 30 30 21 02' => 'AF Micro-Nikkor 200mm f/4D IF-ED', + '2E 48 5C 82 30 3C 22 02' => 'AF Nikkor 70-210mm f/4-5.6D', + '2E 48 5C 82 30 3C 28 02' => 'AF Nikkor 70-210mm f/4-5.6D', + '2F 48 30 44 24 24 29 02.1' => 'AF Zoom-Nikkor 20-35mm f/2.8D IF', + '30 48 98 98 24 24 24 02' => 'AF-I Nikkor 400mm f/2.8D IF-ED', + '30 48 98 98 24 24 F1 02' => 'AF-I Nikkor 400mm f/2.8D IF-ED + TC-14E', + '30 48 98 98 24 24 E1 02' => 'AF-I Nikkor 400mm f/2.8D IF-ED + TC-17E', + '30 48 98 98 24 24 F2 02' => 'AF-I Nikkor 400mm f/2.8D IF-ED + TC-20E', + '31 54 56 56 24 24 25 02' => 'AF Micro-Nikkor 60mm f/2.8D', + '32 54 6A 6A 24 24 35 02.1' => 'AF Micro-Nikkor 105mm f/2.8D', + '33 48 2D 2D 24 24 31 02' => 'AF Nikkor 18mm f/2.8D', + '34 48 29 29 24 24 32 02' => 'AF Fisheye Nikkor 16mm f/2.8D', + '35 3C A0 A0 30 30 33 02' => 'AF-I Nikkor 500mm f/4D IF-ED', + '35 3C A0 A0 30 30 F1 02' => 'AF-I Nikkor 500mm f/4D IF-ED + TC-14E', + '35 3C A0 A0 30 30 E1 02' => 'AF-I Nikkor 500mm f/4D IF-ED + TC-17E', + '35 3C A0 A0 30 30 F2 02' => 'AF-I Nikkor 500mm f/4D IF-ED + TC-20E', + '36 48 37 37 24 24 34 02' => 'AF Nikkor 24mm f/2.8D', + '37 48 30 30 24 24 36 02' => 'AF Nikkor 20mm f/2.8D', + '38 4C 62 62 14 14 37 02' => 'AF Nikkor 85mm f/1.8D', + '3A 40 3C 5C 2C 34 39 02' => 'AF Zoom-Nikkor 28-70mm f/3.5-4.5D', + '3B 48 44 5C 24 24 3A 02' => 'AF Zoom-Nikkor 35-70mm f/2.8D N', + '3C 48 60 80 24 24 3B 02' => 'AF Zoom-Nikkor 80-200mm f/2.8D ED', #NJ + '3D 3C 44 60 30 3C 3E 02' => 'AF Zoom-Nikkor 35-80mm f/4-5.6D', + '3E 48 3C 3C 24 24 3D 02' => 'AF Nikkor 28mm f/2.8D', + '3F 40 44 6A 2C 34 45 02' => 'AF Zoom-Nikkor 35-105mm f/3.5-4.5D', + '41 48 7C 7C 24 24 43 02' => 'AF Nikkor 180mm f/2.8D IF-ED', + '42 54 44 44 18 18 44 02' => 'AF Nikkor 35mm f/2D', + '43 54 50 50 0C 0C 46 02' => 'AF Nikkor 50mm f/1.4D', + '44 44 60 80 34 3C 47 02' => 'AF Zoom-Nikkor 80-200mm f/4.5-5.6D', + '45 40 3C 60 2C 3C 48 02' => 'AF Zoom-Nikkor 28-80mm f/3.5-5.6D', + '46 3C 44 60 30 3C 49 02' => 'AF Zoom-Nikkor 35-80mm f/4-5.6D N', + '47 42 37 50 2A 34 4A 02' => 'AF Zoom-Nikkor 24-50mm f/3.3-4.5D', + '48 48 8E 8E 24 24 4B 02' => 'AF-S Nikkor 300mm f/2.8D IF-ED', + '48 48 8E 8E 24 24 F1 02' => 'AF-S Nikkor 300mm f/2.8D IF-ED + TC-14E', + '48 48 8E 8E 24 24 E1 02' => 'AF-S Nikkor 300mm f/2.8D IF-ED + TC-17E', + '48 48 8E 8E 24 24 F2 02' => 'AF-S Nikkor 300mm f/2.8D IF-ED + TC-20E', + '49 3C A6 A6 30 30 4C 02' => 'AF-S Nikkor 600mm f/4D IF-ED', + '49 3C A6 A6 30 30 F1 02' => 'AF-S Nikkor 600mm f/4D IF-ED + TC-14E', + '49 3C A6 A6 30 30 E1 02' => 'AF-S Nikkor 600mm f/4D IF-ED + TC-17E', + '49 3C A6 A6 30 30 F2 02' => 'AF-S Nikkor 600mm f/4D IF-ED + TC-20E', + '4A 54 62 62 0C 0C 4D 02' => 'AF Nikkor 85mm f/1.4D IF', + '4B 3C A0 A0 30 30 4E 02' => 'AF-S Nikkor 500mm f/4D IF-ED', + '4B 3C A0 A0 30 30 F1 02' => 'AF-S Nikkor 500mm f/4D IF-ED + TC-14E', + '4B 3C A0 A0 30 30 E1 02' => 'AF-S Nikkor 500mm f/4D IF-ED + TC-17E', + '4B 3C A0 A0 30 30 F2 02' => 'AF-S Nikkor 500mm f/4D IF-ED + TC-20E', + '4C 40 37 6E 2C 3C 4F 02' => 'AF Zoom-Nikkor 24-120mm f/3.5-5.6D IF', + '4D 40 3C 80 2C 3C 62 02' => 'AF Zoom-Nikkor 28-200mm f/3.5-5.6D IF', + '4E 48 72 72 18 18 51 02' => 'AF DC-Nikkor 135mm f/2D', + '4F 40 37 5C 2C 3C 53 06' => 'IX-Nikkor 24-70mm f/3.5-5.6', + '50 48 56 7C 30 3C 54 06' => 'IX-Nikkor 60-180mm f/4-5.6', + '53 48 60 80 24 24 57 02' => 'AF Zoom-Nikkor 80-200mm f/2.8D ED', + '53 48 60 80 24 24 60 02' => 'AF Zoom-Nikkor 80-200mm f/2.8D ED', + '54 44 5C 7C 34 3C 58 02' => 'AF Zoom-Micro Nikkor 70-180mm f/4.5-5.6D ED', + '54 44 5C 7C 34 3C 61 02' => 'AF Zoom-Micro Nikkor 70-180mm f/4.5-5.6D ED', + '56 48 5C 8E 30 3C 5A 02' => 'AF Zoom-Nikkor 70-300mm f/4-5.6D ED', + '59 48 98 98 24 24 5D 02' => 'AF-S Nikkor 400mm f/2.8D IF-ED', + '59 48 98 98 24 24 F1 02' => 'AF-S Nikkor 400mm f/2.8D IF-ED + TC-14E', + '59 48 98 98 24 24 E1 02' => 'AF-S Nikkor 400mm f/2.8D IF-ED + TC-17E', + '59 48 98 98 24 24 F2 02' => 'AF-S Nikkor 400mm f/2.8D IF-ED + TC-20E', + '5A 3C 3E 56 30 3C 5E 06' => 'IX-Nikkor 30-60mm f/4-5.6', + '5B 44 56 7C 34 3C 5F 06' => 'IX-Nikkor 60-180mm f/4.5-5.6', + '5D 48 3C 5C 24 24 63 02' => 'AF-S Zoom-Nikkor 28-70mm f/2.8D IF-ED', + '5E 48 60 80 24 24 64 02' => 'AF-S Zoom-Nikkor 80-200mm f/2.8D IF-ED', + '5F 40 3C 6A 2C 34 65 02' => 'AF Zoom-Nikkor 28-105mm f/3.5-4.5D IF', + '60 40 3C 60 2C 3C 66 02' => 'AF Zoom-Nikkor 28-80mm f/3.5-5.6D', #(http://www.exif.org/forum/topic.asp?TOPIC_ID=16) + '61 44 5E 86 34 3C 67 02' => 'AF Zoom-Nikkor 75-240mm f/4.5-5.6D', + '63 48 2B 44 24 24 68 02' => 'AF-S Nikkor 17-35mm f/2.8D IF-ED', + '64 00 62 62 24 24 6A 02' => 'PC Micro-Nikkor 85mm f/2.8D', + '65 44 60 98 34 3C 6B 0A' => 'AF VR Zoom-Nikkor 80-400mm f/4.5-5.6D ED', + '66 40 2D 44 2C 34 6C 02' => 'AF Zoom-Nikkor 18-35mm f/3.5-4.5D IF-ED', + '67 48 37 62 24 30 6D 02' => 'AF Zoom-Nikkor 24-85mm f/2.8-4D IF', + '68 42 3C 60 2A 3C 6E 06' => 'AF Zoom-Nikkor 28-80mm f/3.3-5.6G', + '69 48 5C 8E 30 3C 6F 06' => 'AF Zoom-Nikkor 70-300mm f/4-5.6G', + '6A 48 8E 8E 30 30 70 02' => 'AF-S Nikkor 300mm f/4D IF-ED', + '6B 48 24 24 24 24 71 02' => 'AF Nikkor ED 14mm f/2.8D', + '6D 48 8E 8E 24 24 73 02' => 'AF-S Nikkor 300mm f/2.8D IF-ED II', + '6E 48 98 98 24 24 74 02' => 'AF-S Nikkor 400mm f/2.8D IF-ED II', + '6F 3C A0 A0 30 30 75 02' => 'AF-S Nikkor 500mm f/4D IF-ED II', + '70 3C A6 A6 30 30 76 02' => 'AF-S Nikkor 600mm f/4D IF-ED II', + '72 48 4C 4C 24 24 77 00' => 'Nikkor 45mm f/2.8 P', + '74 40 37 62 2C 34 78 06' => 'AF-S Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED', + '75 40 3C 68 2C 3C 79 06' => 'AF Zoom-Nikkor 28-100mm f/3.5-5.6G', + '76 58 50 50 14 14 7A 02' => 'AF Nikkor 50mm f/1.8D', + '77 48 5C 80 24 24 7B 0E' => 'AF-S VR Zoom-Nikkor 70-200mm f/2.8G IF-ED', + '78 40 37 6E 2C 3C 7C 0E' => 'AF-S VR Zoom-Nikkor 24-120mm f/3.5-5.6G IF-ED', + '79 40 3C 80 2C 3C 7F 06' => 'AF Zoom-Nikkor 28-200mm f/3.5-5.6G IF-ED', + '7A 3C 1F 37 30 30 7E 06.1' => 'AF-S DX Zoom-Nikkor 12-24mm f/4G IF-ED', + '7B 48 80 98 30 30 80 0E' => 'AF-S VR Zoom-Nikkor 200-400mm f/4G IF-ED', + '7D 48 2B 53 24 24 82 06' => 'AF-S DX Zoom-Nikkor 17-55mm f/2.8G IF-ED', + '7F 40 2D 5C 2C 34 84 06' => 'AF-S DX Zoom-Nikkor 18-70mm f/3.5-4.5G IF-ED', + '80 48 1A 1A 24 24 85 06' => 'AF DX Fisheye-Nikkor 10.5mm f/2.8G ED', + '81 54 80 80 18 18 86 0E' => 'AF-S VR Nikkor 200mm f/2G IF-ED', + '82 48 8E 8E 24 24 87 0E' => 'AF-S VR Nikkor 300mm f/2.8G IF-ED', + '83 00 B0 B0 5A 5A 88 04' => 'FSA-L2, EDG 65, 800mm F13 G', + '89 3C 53 80 30 3C 8B 06' => 'AF-S DX Zoom-Nikkor 55-200mm f/4-5.6G ED', + '8A 54 6A 6A 24 24 8C 0E' => 'AF-S VR Micro-Nikkor 105mm f/2.8G IF-ED', #10 + # when the TC-20 III 2x teleconverter is used with the above lens, the following have been observed: + # 8A 4D 6A 6A 24 24 8C 0E + # 8A 4E 6A 6A 24 24 8C 0E + # 8A 50 6A 6A 24 24 8C 0E + # 8A 51 6A 6A 24 24 8C 0E + # 8A 52 6A 6A 24 24 8C 0E + # 8A 53 6A 6A 24 24 8C 0E + # 8A 54 6A 6A 24 24 8C 0E (same as without the TC) + '8B 40 2D 80 2C 3C 8D 0E' => 'AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED', + '8B 40 2D 80 2C 3C FD 0E' => 'AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED [II]', #20 + '8C 40 2D 53 2C 3C 8E 06' => 'AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED', + '8D 44 5C 8E 34 3C 8F 0E' => 'AF-S VR Zoom-Nikkor 70-300mm f/4.5-5.6G IF-ED', #10 + '8F 40 2D 72 2C 3C 91 06' => 'AF-S DX Zoom-Nikkor 18-135mm f/3.5-5.6G IF-ED', + '90 3B 53 80 30 3C 92 0E' => 'AF-S DX VR Zoom-Nikkor 55-200mm f/4-5.6G IF-ED', + '92 48 24 37 24 24 94 06' => 'AF-S Zoom-Nikkor 14-24mm f/2.8G ED', + '93 48 37 5C 24 24 95 06' => 'AF-S Zoom-Nikkor 24-70mm f/2.8G ED', + '94 40 2D 53 2C 3C 96 06' => 'AF-S DX Zoom-Nikkor 18-55mm f/3.5-5.6G ED II', #10 (D40) + '95 4C 37 37 2C 2C 97 02' => 'PC-E Nikkor 24mm f/3.5D ED', + '95 00 37 37 2C 2C 97 06' => 'PC-E Nikkor 24mm f/3.5D ED', #JD + '96 48 98 98 24 24 98 0E' => 'AF-S VR Nikkor 400mm f/2.8G ED', + '97 3C A0 A0 30 30 99 0E' => 'AF-S VR Nikkor 500mm f/4G ED', + '98 3C A6 A6 30 30 9A 0E' => 'AF-S VR Nikkor 600mm f/4G ED', + '99 40 29 62 2C 3C 9B 0E' => 'AF-S DX VR Zoom-Nikkor 16-85mm f/3.5-5.6G ED', + '9A 40 2D 53 2C 3C 9C 0E' => 'AF-S DX VR Zoom-Nikkor 18-55mm f/3.5-5.6G', + '9B 54 4C 4C 24 24 9D 02' => 'PC-E Micro Nikkor 45mm f/2.8D ED', + '9B 00 4C 4C 24 24 9D 06' => 'PC-E Micro Nikkor 45mm f/2.8D ED', + '9C 54 56 56 24 24 9E 06' => 'AF-S Micro Nikkor 60mm f/2.8G ED', + '9D 54 62 62 24 24 9F 02' => 'PC-E Micro Nikkor 85mm f/2.8D', + '9D 00 62 62 24 24 9F 06' => 'PC-E Micro Nikkor 85mm f/2.8D', + '9E 40 2D 6A 2C 3C A0 0E' => 'AF-S DX VR Zoom-Nikkor 18-105mm f/3.5-5.6G ED', #PH/10 + '9F 58 44 44 14 14 A1 06' => 'AF-S DX Nikkor 35mm f/1.8G', #27 + 'A0 54 50 50 0C 0C A2 06' => 'AF-S Nikkor 50mm f/1.4G', + 'A1 40 18 37 2C 34 A3 06' => 'AF-S DX Nikkor 10-24mm f/3.5-4.5G ED', + 'A1 40 2D 53 2C 3C CB 86' => 'AF-P DX Nikkor 18-55mm f/3.5-5.6G', #30 + 'A2 48 5C 80 24 24 A4 0E' => 'AF-S Nikkor 70-200mm f/2.8G ED VR II', + 'A3 3C 29 44 30 30 A5 0E' => 'AF-S Nikkor 16-35mm f/4G ED VR', + 'A4 54 37 37 0C 0C A6 06' => 'AF-S Nikkor 24mm f/1.4G ED', + 'A5 40 3C 8E 2C 3C A7 0E' => 'AF-S Nikkor 28-300mm f/3.5-5.6G ED VR', + 'A6 48 8E 8E 24 24 A8 0E' => 'AF-S Nikkor 300mm f/2.8G IF-ED VR II', + 'A7 4B 62 62 2C 2C A9 0E' => 'AF-S DX Micro Nikkor 85mm f/3.5G ED VR', + 'A8 48 80 98 30 30 AA 0E' => 'AF-S Zoom-Nikkor 200-400mm f/4G IF-ED VR II', #https://exiftool.org/forum/index.php/topic,3218.msg15495.html#msg15495 + 'A9 54 80 80 18 18 AB 0E' => 'AF-S Nikkor 200mm f/2G ED VR II', + 'AA 3C 37 6E 30 30 AC 0E' => 'AF-S Nikkor 24-120mm f/4G ED VR', + 'AC 38 53 8E 34 3C AE 0E' => 'AF-S DX Nikkor 55-300mm f/4.5-5.6G ED VR', + 'AD 3C 2D 8E 2C 3C AF 0E' => 'AF-S DX Nikkor 18-300mm f/3.5-5.6G ED VR', + 'AE 54 62 62 0C 0C B0 06' => 'AF-S Nikkor 85mm f/1.4G', + 'AF 54 44 44 0C 0C B1 06' => 'AF-S Nikkor 35mm f/1.4G', + 'B0 4C 50 50 14 14 B2 06' => 'AF-S Nikkor 50mm f/1.8G', + 'B1 48 48 48 24 24 B3 06' => 'AF-S DX Micro Nikkor 40mm f/2.8G', #27 + 'B2 48 5C 80 30 30 B4 0E' => 'AF-S Nikkor 70-200mm f/4G ED VR', #35 + 'B3 4C 62 62 14 14 B5 06' => 'AF-S Nikkor 85mm f/1.8G', + 'B4 40 37 62 2C 34 B6 0E' => 'AF-S Zoom-Nikkor 24-85mm f/3.5-4.5G IF-ED VR', #30 + 'B5 4C 3C 3C 14 14 B7 06' => 'AF-S Nikkor 28mm f/1.8G', #30 + 'B6 3C B0 B0 3C 3C B8 0E' => 'AF-S VR Nikkor 800mm f/5.6E FL ED', + 'B6 3C B0 B0 3C 3C B8 4E' => 'AF-S VR Nikkor 800mm f/5.6E FL ED', #PH + 'B7 44 60 98 34 3C B9 0E' => 'AF-S Nikkor 80-400mm f/4.5-5.6G ED VR', + 'B8 40 2D 44 2C 34 BA 06' => 'AF-S Nikkor 18-35mm f/3.5-4.5G ED', + 'A0 40 2D 74 2C 3C BB 0E' => 'AF-S DX Nikkor 18-140mm f/3.5-5.6G ED VR', #PH + 'A1 54 55 55 0C 0C BC 06' => 'AF-S Nikkor 58mm f/1.4G', #IB + 'A1 48 6E 8E 24 24 DB 4E' => 'AF-S Nikkor 120-300mm f/2.8E FL ED SR VR', #28 + 'A2 40 2D 53 2C 3C BD 0E' => 'AF-S DX Nikkor 18-55mm f/3.5-5.6G VR II', + 'A4 40 2D 8E 2C 40 BF 0E' => 'AF-S DX Nikkor 18-300mm f/3.5-6.3G ED VR', + 'A5 4C 44 44 14 14 C0 06' => 'AF-S Nikkor 35mm f/1.8G ED', #35 ("ED" ref 11) + 'A6 48 98 98 24 24 C1 0E' => 'AF-S Nikkor 400mm f/2.8E FL ED VR', + 'A7 3C 53 80 30 3C C2 0E' => 'AF-S DX Nikkor 55-200mm f/4-5.6G ED VR II', #IB + 'A8 48 8E 8E 30 30 C3 4E' => 'AF-S Nikkor 300mm f/4E PF ED VR', #35 + 'A8 48 8E 8E 30 30 C3 0E' => 'AF-S Nikkor 300mm f/4E PF ED VR', #30 + 'A9 4C 31 31 14 14 C4 06' => 'AF-S Nikkor 20mm f/1.8G ED', #30 + 'AA 48 37 5C 24 24 C5 4E' => 'AF-S Nikkor 24-70mm f/2.8E ED VR', + 'AA 48 37 5C 24 24 C5 0E' => 'AF-S Nikkor 24-70mm f/2.8E ED VR', + 'AB 3C A0 A0 30 30 C6 4E' => 'AF-S Nikkor 500mm f/4E FL ED VR', + 'AC 3C A6 A6 30 30 C7 4E' => 'AF-S Nikkor 600mm f/4E FL ED VR', #PH + 'AD 48 28 60 24 30 C8 4E' => 'AF-S DX Nikkor 16-80mm f/2.8-4E ED VR', + 'AD 48 28 60 24 30 C8 0E' => 'AF-S DX Nikkor 16-80mm f/2.8-4E ED VR', #PH + 'AE 3C 80 A0 3C 3C C9 4E' => 'AF-S Nikkor 200-500mm f/5.6E ED VR', #PH + 'AE 3C 80 A0 3C 3C C9 0E' => 'AF-S Nikkor 200-500mm f/5.6E ED VR', + 'A0 40 2D 53 2C 3C CA 8E' => 'AF-P DX Nikkor 18-55mm f/3.5-5.6G', #Yang You pvt communication + 'A0 40 2D 53 2C 3C CA 0E' => 'AF-P DX Nikkor 18-55mm f/3.5-5.6G VR', #PH + 'AF 4C 37 37 14 14 CC 06' => 'AF-S Nikkor 24mm f/1.8G ED', #IB + 'A2 38 5C 8E 34 40 CD 86' => 'AF-P DX Nikkor 70-300mm f/4.5-6.3G VR', #PH + 'A3 38 5C 8E 34 40 CE 8E' => 'AF-P DX Nikkor 70-300mm f/4.5-6.3G ED VR', + 'A3 38 5C 8E 34 40 CE 0E' => 'AF-P DX Nikkor 70-300mm f/4.5-6.3G ED', + 'A4 48 5C 80 24 24 CF 4E' => 'AF-S Nikkor 70-200mm f/2.8E FL ED VR', + 'A4 48 5C 80 24 24 CF 0E' => 'AF-S Nikkor 70-200mm f/2.8E FL ED VR', + 'A5 54 6A 6A 0C 0C D0 46' => 'AF-S Nikkor 105mm f/1.4E ED', #IB + 'A5 54 6A 6A 0C 0C D0 06' => 'AF-S Nikkor 105mm f/1.4E ED', #IB + 'A6 48 2F 2F 30 30 D1 46' => 'PC Nikkor 19mm f/4E ED', + 'A6 48 2F 2F 30 30 D1 06' => 'PC Nikkor 19mm f/4E ED', + 'A7 40 11 26 2C 34 D2 46' => 'AF-S Fisheye Nikkor 8-15mm f/3.5-4.5E ED', + 'A7 40 11 26 2C 34 D2 06' => 'AF-S Fisheye Nikkor 8-15mm f/3.5-4.5E ED', + 'A8 38 18 30 34 3C D3 8E' => 'AF-P DX Nikkor 10-20mm f/4.5-5.6G VR', #Yang You pvt communication + 'A8 38 18 30 34 3C D3 0E' => 'AF-P DX Nikkor 10-20mm f/4.5-5.6G VR', + 'A9 48 7C 98 30 30 D4 4E' => 'AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR', #IB + 'A9 48 7C 98 30 30 D4 0E' => 'AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR', + 'AA 48 88 A4 3C 3C D5 4E' => 'AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR + 1.4x TC', #IB + 'AA 48 88 A4 3C 3C D5 0E' => 'AF-S Nikkor 180-400mm f/4E TC1.4 FL ED VR + 1.4x TC', + 'AB 44 5C 8E 34 3C D6 CE' => 'AF-P Nikkor 70-300mm f/4.5-5.6E ED VR', + 'AB 44 5C 8E 34 3C D6 0E' => 'AF-P Nikkor 70-300mm f/4.5-5.6E ED VR', + 'AB 44 5C 8E 34 3C D6 4E' => 'AF-P Nikkor 70-300mm f/4.5-5.6E ED VR', #IB + 'AC 54 3C 3C 0C 0C D7 46' => 'AF-S Nikkor 28mm f/1.4E ED', + 'AC 54 3C 3C 0C 0C D7 06' => 'AF-S Nikkor 28mm f/1.4E ED', + 'AD 3C A0 A0 3C 3C D8 0E' => 'AF-S Nikkor 500mm f/5.6E PF ED VR', + 'AD 3C A0 A0 3C 3C D8 4E' => 'AF-S Nikkor 500mm f/5.6E PF ED VR', + '01 00 00 00 00 00 02 00' => 'TC-16A', + '01 00 00 00 00 00 08 00' => 'TC-16A', + '00 00 00 00 00 00 F1 0C' => 'TC-14E [II] or Sigma APO Tele Converter 1.4x EX DG or Kenko Teleplus PRO 300 DG 1.4x', + '00 00 00 00 00 00 F2 18' => 'TC-20E [II] or Sigma APO Tele Converter 2x EX DG or Kenko Teleplus PRO 300 DG 2.0x', + '00 00 00 00 00 00 E1 12' => 'TC-17E II', + 'FE 47 00 00 24 24 4B 06' => 'Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye', #JD + '26 48 11 11 30 30 1C 02' => 'Sigma 8mm F4 EX Circular Fisheye', + '79 40 11 11 2C 2C 1C 06' => 'Sigma 8mm F3.5 EX Circular Fisheye', #JD + 'DB 40 11 11 2C 2C 1C 06' => 'Sigma 8mm F3.5 EX DG Circular Fisheye', #30 + 'DC 48 19 19 24 24 4B 06' => 'Sigma 10mm F2.8 EX DC HSM Fisheye', + 'C2 4C 24 24 14 14 4B 06' => 'Sigma 14mm F1.8 DG HSM | A', #IB + '48 48 24 24 24 24 4B 02' => 'Sigma 14mm F2.8 EX Aspherical HSM', + '02 3F 24 24 2C 2C 02 00' => 'Sigma 14mm F3.5', + '26 48 27 27 24 24 1C 02' => 'Sigma 15mm F2.8 EX Diagonal Fisheye', + 'EA 48 27 27 24 24 1C 02' => 'Sigma 15mm F2.8 EX Diagonal Fisheye', #30 + '26 58 31 31 14 14 1C 02' => 'Sigma 20mm F1.8 EX DG Aspherical RF', + '79 54 31 31 0C 0C 4B 06' => 'Sigma 20mm F1.4 DG HSM | A', #Rolf Probst + '26 58 37 37 14 14 1C 02' => 'Sigma 24mm F1.8 EX DG Aspherical Macro', + 'E1 58 37 37 14 14 1C 02' => 'Sigma 24mm F1.8 EX DG Aspherical Macro', + '02 46 37 37 25 25 02 00' => 'Sigma 24mm F2.8 Super Wide II Macro', + '26 58 3C 3C 14 14 1C 02' => 'Sigma 28mm F1.8 EX DG Aspherical Macro', + '48 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM', + 'F8 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM', #JD + '91 54 44 44 0C 0C 4B 06' => 'Sigma 35mm F1.4 DG HSM', #30 + 'DE 54 50 50 0C 0C 4B 06' => 'Sigma 50mm F1.4 EX DG HSM', + '88 54 50 50 0C 0C 4B 06' => 'Sigma 50mm F1.4 DG HSM | A', + '02 48 50 50 24 24 02 00' => 'Sigma Macro 50mm F2.8', #https://exiftool.org/forum/index.php/topic,4027.0.html + '32 54 50 50 24 24 35 02' => 'Sigma Macro 50mm F2.8 EX DG', + 'E3 54 50 50 24 24 35 02' => 'Sigma Macro 50mm F2.8 EX DG', #https://exiftool.org/forum/index.php/topic,3215.0.html + '79 48 5C 5C 24 24 1C 06' => 'Sigma Macro 70mm F2.8 EX DG', #JD + '9B 54 62 62 0C 0C 4B 06' => 'Sigma 85mm F1.4 EX DG HSM', + 'C8 54 62 62 0C 0C 4B 46' => 'Sigma 85mm F1.4 DG HSM | A', #JamiBradley + 'C8 54 62 62 0C 0C 4B 06' => 'Sigma 85mm F1.4 DG HSM | A', #KennethCochran + '02 48 65 65 24 24 02 00' => 'Sigma Macro 90mm F2.8', + '32 54 6A 6A 24 24 35 02.2' => 'Sigma Macro 105mm F2.8 EX DG', #JD + 'E5 54 6A 6A 24 24 35 02' => 'Sigma Macro 105mm F2.8 EX DG', + '97 48 6A 6A 24 24 4B 0E' => 'Sigma Macro 105mm F2.8 EX DG OS HSM', + '48 48 76 76 24 24 4B 06' => 'Sigma APO Macro 150mm F2.8 EX DG HSM', + 'F5 48 76 76 24 24 4B 06' => 'Sigma APO Macro 150mm F2.8 EX DG HSM', #24 + '99 48 76 76 24 24 4B 0E' => 'Sigma APO Macro 150mm F2.8 EX DG OS HSM', #(Christian Hesse) + '48 4C 7C 7C 2C 2C 4B 02' => 'Sigma APO Macro 180mm F3.5 EX DG HSM', + '48 4C 7D 7D 2C 2C 4B 02' => 'Sigma APO Macro 180mm F3.5 EX DG HSM', + 'F4 4C 7C 7C 2C 2C 4B 02' => 'Sigma APO Macro 180mm F3.5 EX DG HSM', #Bruno + '94 48 7C 7C 24 24 4B 0E' => 'Sigma APO Macro 180mm F2.8 EX DG OS HSM', #MichaelTapes (HSM from ref 8) + '48 54 8E 8E 24 24 4B 02' => 'Sigma APO 300mm F2.8 EX DG HSM', + 'FB 54 8E 8E 24 24 4B 02' => 'Sigma APO 300mm F2.8 EX DG HSM', #26 + '26 48 8E 8E 30 30 1C 02' => 'Sigma APO Tele Macro 300mm F4', + '02 2F 98 98 3D 3D 02 00' => 'Sigma APO 400mm F5.6', + '26 3C 98 98 3C 3C 1C 02' => 'Sigma APO Tele Macro 400mm F5.6', + '02 37 A0 A0 34 34 02 00' => 'Sigma APO 500mm F4.5', #19 + '48 44 A0 A0 34 34 4B 02' => 'Sigma APO 500mm F4.5 EX HSM', + 'F1 44 A0 A0 34 34 4B 02' => 'Sigma APO 500mm F4.5 EX DG HSM', + '02 34 A0 A0 44 44 02 00' => 'Sigma APO 500mm F7.2', + '02 3C B0 B0 3C 3C 02 00' => 'Sigma APO 800mm F5.6', + '48 3C B0 B0 3C 3C 4B 02' => 'Sigma APO 800mm F5.6 EX HSM', + '9E 38 11 29 34 3C 4B 06' => 'Sigma 8-16mm F4.5-5.6 DC HSM', + 'A1 41 19 31 2C 2C 4B 06' => 'Sigma 10-20mm F3.5 EX DC HSM', + '48 3C 19 31 30 3C 4B 06' => 'Sigma 10-20mm F4-5.6 EX DC HSM', + 'F9 3C 19 31 30 3C 4B 06' => 'Sigma 10-20mm F4-5.6 EX DC HSM', #JD + '48 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM', + 'F0 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM', + '96 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 II DG HSM', #Jurgen Sahlberg + 'CA 3C 1F 37 30 30 4B 46' => 'Sigma 12-24mm F4 DG HSM | A', #github issue#101 + 'C1 48 24 37 24 24 4B 46' => 'Sigma 14-24mm F2.8 DG HSM | A', #30 + '26 40 27 3F 2C 34 1C 02' => 'Sigma 15-30mm F3.5-4.5 EX DG Aspherical DF', + '48 48 2B 44 24 30 4B 06' => 'Sigma 17-35mm F2.8-4 EX DG Aspherical HSM', + '26 54 2B 44 24 30 1C 02' => 'Sigma 17-35mm F2.8-4 EX Aspherical', + '9D 48 2B 50 24 24 4B 0E' => 'Sigma 17-50mm F2.8 EX DC OS HSM', + '8F 48 2B 50 24 24 4B 0E' => 'Sigma 17-50mm F2.8 EX DC OS HSM', #http://dev.exiv2.org/boards/3/topics/1747 + '7A 47 2B 5C 24 34 4B 06' => 'Sigma 17-70mm F2.8-4.5 DC Macro Asp. IF HSM', + '7A 48 2B 5C 24 34 4B 06' => 'Sigma 17-70mm F2.8-4.5 DC Macro Asp. IF HSM', + '7F 48 2B 5C 24 34 1C 06' => 'Sigma 17-70mm F2.8-4.5 DC Macro Asp. IF', + '8E 3C 2B 5C 24 30 4B 0E' => 'Sigma 17-70mm F2.8-4 DC Macro OS HSM | C', + 'A0 48 2A 5C 24 30 4B 0E' => 'Sigma 17-70mm F2.8-4 DC Macro OS HSM', #https://exiftool.org/forum/index.php/topic,5170.0.html + '8B 4C 2D 44 14 14 4B 06' => 'Sigma 18-35mm F1.8 DC HSM', #30/NJ + '26 40 2D 44 2B 34 1C 02' => 'Sigma 18-35mm F3.5-4.5 Aspherical', + '26 48 2D 50 24 24 1C 06' => 'Sigma 18-50mm F2.8 EX DC', + '7F 48 2D 50 24 24 1C 06' => 'Sigma 18-50mm F2.8 EX DC Macro', #NJ + '7A 48 2D 50 24 24 4B 06' => 'Sigma 18-50mm F2.8 EX DC Macro', + 'F6 48 2D 50 24 24 4B 06' => 'Sigma 18-50mm F2.8 EX DC Macro', + 'A4 47 2D 50 24 34 4B 0E' => 'Sigma 18-50mm F2.8-4.5 DC OS HSM', + '26 40 2D 50 2C 3C 1C 06' => 'Sigma 18-50mm F3.5-5.6 DC', + '7A 40 2D 50 2C 3C 4B 06' => 'Sigma 18-50mm F3.5-5.6 DC HSM', + '26 40 2D 70 2B 3C 1C 06' => 'Sigma 18-125mm F3.5-5.6 DC', + 'CD 3D 2D 70 2E 3C 4B 0E' => 'Sigma 18-125mm F3.8-5.6 DC OS HSM', + '26 40 2D 80 2C 40 1C 06' => 'Sigma 18-200mm F3.5-6.3 DC', + 'FF 40 2D 80 2C 40 4B 06' => 'Sigma 18-200mm F3.5-6.3 DC', #30 + '7A 40 2D 80 2C 40 4B 0E' => 'Sigma 18-200mm F3.5-6.3 DC OS HSM', + 'ED 40 2D 80 2C 40 4B 0E' => 'Sigma 18-200mm F3.5-6.3 DC OS HSM', #JD + '90 40 2D 80 2C 40 4B 0E' => 'Sigma 18-200mm F3.5-6.3 II DC OS HSM', #JohnHelour + '89 30 2D 80 2C 40 4B 0E' => 'Sigma 18-200mm F3.5-6.3 DC Macro OS HS | C', #JoeSchonberg + 'A5 40 2D 88 2C 40 4B 0E' => 'Sigma 18-250mm F3.5-6.3 DC OS HSM', + # LensFStops varies with FocalLength for this lens (ref 2): + '92 2C 2D 88 2C 40 4B 0E' => 'Sigma 18-250mm F3.5-6.3 DC Macro OS HSM', #2 + '87 2C 2D 8E 2C 40 4B 0E' => 'Sigma 18-300mm F3.5-6.3 DC Macro HSM', #30 + # '92 2C 2D 88 2C 40 4B 0E' (250mm) + # '92 2B 2D 88 2C 40 4B 0E' (210mm) + # '92 2C 2D 88 2C 40 4B 0E' (185mm) + # '92 2D 2D 88 2C 40 4B 0E' (155mm) + # '92 2E 2D 88 2C 40 4B 0E' (130mm) + # '92 2F 2D 88 2C 40 4B 0E' (105mm) + # '92 30 2D 88 2C 40 4B 0E' (90mm) + # '92 32 2D 88 2C 40 4B 0E' (75mm) + # '92 33 2D 88 2C 40 4B 0E' (62mm) + # '92 35 2D 88 2C 40 4B 0E' (52mm) + # '92 37 2D 88 2C 40 4B 0E' (44mm) + # '92 39 2D 88 2C 40 4B 0E' (38mm) + # '92 3A 2D 88 2C 40 4B 0E' (32mm) + # '92 3E 2D 88 2C 40 4B 0E' (22mm) + # '92 40 2D 88 2C 40 4B 0E' (18mm) + '26 48 31 49 24 24 1C 02' => 'Sigma 20-40mm F2.8', + '7B 48 37 44 18 18 4B 06' => 'Sigma 24-35mm F2.0 DG HSM | A', #30 + '02 3A 37 50 31 3D 02 00' => 'Sigma 24-50mm F4-5.6 UC', + '26 48 37 56 24 24 1C 02' => 'Sigma 24-60mm F2.8 EX DG', + 'B6 48 37 56 24 24 1C 02' => 'Sigma 24-60mm F2.8 EX DG', + 'A6 48 37 5C 24 24 4B 06' => 'Sigma 24-70mm F2.8 IF EX DG HSM', #JD + 'C9 48 37 5C 24 24 4B 4E' => 'Sigma 24-70mm F2.8 DG OS HSM | A', #30 + '26 54 37 5C 24 24 1C 02' => 'Sigma 24-70mm F2.8 EX DG Macro', + '67 54 37 5C 24 24 1C 02' => 'Sigma 24-70mm F2.8 EX DG Macro', + 'E9 54 37 5C 24 24 1C 02' => 'Sigma 24-70mm F2.8 EX DG Macro', + '26 40 37 5C 2C 3C 1C 02' => 'Sigma 24-70mm F3.5-5.6 Aspherical HF', + '8A 3C 37 6A 30 30 4B 0E' => 'Sigma 24-105mm F4 DG OS HSM', #IB + '26 54 37 73 24 34 1C 02' => 'Sigma 24-135mm F2.8-4.5', + '02 46 3C 5C 25 25 02 00' => 'Sigma 28-70mm F2.8', + '26 54 3C 5C 24 24 1C 02' => 'Sigma 28-70mm F2.8 EX', + '26 48 3C 5C 24 24 1C 06' => 'Sigma 28-70mm F2.8 EX DG', + '79 48 3C 5C 24 24 1C 06' => 'Sigma 28-70mm F2.8 EX DG', #30 ("D" removed) + '26 48 3C 5C 24 30 1C 02' => 'Sigma 28-70mm F2.8-4 DG', + '02 3F 3C 5C 2D 35 02 00' => 'Sigma 28-70mm F3.5-4.5 UC', + '26 40 3C 60 2C 3C 1C 02' => 'Sigma 28-80mm F3.5-5.6 Mini Zoom Macro II Aspherical', + '26 40 3C 65 2C 3C 1C 02' => 'Sigma 28-90mm F3.5-5.6 Macro', + '26 48 3C 6A 24 30 1C 02' => 'Sigma 28-105mm F2.8-4 Aspherical', + '26 3E 3C 6A 2E 3C 1C 02' => 'Sigma 28-105mm F3.8-5.6 UC-III Aspherical IF', + '26 40 3C 80 2C 3C 1C 02' => 'Sigma 28-200mm F3.5-5.6 Compact Aspherical Hyperzoom Macro', + '26 40 3C 80 2B 3C 1C 02' => 'Sigma 28-200mm F3.5-5.6 Compact Aspherical Hyperzoom Macro', + '26 3D 3C 80 2F 3D 1C 02' => 'Sigma 28-300mm F3.8-5.6 Aspherical', + '26 41 3C 8E 2C 40 1C 02' => 'Sigma 28-300mm F3.5-6.3 DG Macro', + 'E6 41 3C 8E 2C 40 1C 02' => 'Sigma 28-300mm F3.5-6.3 DG Macro', #https://exiftool.org/forum/index.php/topic,3301.0.html + '26 40 3C 8E 2C 40 1C 02' => 'Sigma 28-300mm F3.5-6.3 Macro', + '02 3B 44 61 30 3D 02 00' => 'Sigma 35-80mm F4-5.6', + '02 40 44 73 2B 36 02 00' => 'Sigma 35-135mm F3.5-4.5 a', + 'CC 4C 50 68 14 14 4B 06' => 'Sigma 50-100mm F1.8 DC HSM | A', #30 + '7A 47 50 76 24 24 4B 06' => 'Sigma 50-150mm F2.8 EX APO DC HSM', + 'FD 47 50 76 24 24 4B 06' => 'Sigma 50-150mm F2.8 EX APO DC HSM II', + '98 48 50 76 24 24 4B 0E' => 'Sigma 50-150mm F2.8 EX APO DC OS HSM', #30 + '48 3C 50 A0 30 40 4B 02' => 'Sigma 50-500mm F4-6.3 EX APO RF HSM', + '9F 37 50 A0 34 40 4B 0E' => 'Sigma 50-500mm F4.5-6.3 DG OS HSM', #16 + '26 3C 54 80 30 3C 1C 06' => 'Sigma 55-200mm F4-5.6 DC', + '7A 3B 53 80 30 3C 4B 06' => 'Sigma 55-200mm F4-5.6 DC HSM', + '48 54 5C 80 24 24 4B 02' => 'Sigma 70-200mm F2.8 EX APO IF HSM', + '7A 48 5C 80 24 24 4B 06' => 'Sigma 70-200mm F2.8 EX APO DG Macro HSM II', + 'EE 48 5C 80 24 24 4B 06' => 'Sigma 70-200mm F2.8 EX APO DG Macro HSM II', #JD + '9C 48 5C 80 24 24 4B 0E' => 'Sigma 70-200mm F2.8 EX DG OS HSM', #Rolando Ruzic + 'BB 48 5C 80 24 24 4B 4E' => 'Sigma 70-200mm F2.8 DG OS HSM | S', #forum13207 + '02 46 5C 82 25 25 02 00' => 'Sigma 70-210mm F2.8 APO', #JD + '02 40 5C 82 2C 35 02 00' => 'Sigma APO 70-210mm F3.5-4.5', + '26 3C 5C 82 30 3C 1C 02' => 'Sigma 70-210mm F4-5.6 UC-II', + '02 3B 5C 82 30 3C 02 00' => 'Sigma Zoom-K 70-210mm F4-5.6', #30 + '26 3C 5C 8E 30 3C 1C 02' => 'Sigma 70-300mm F4-5.6 DG Macro', + '56 3C 5C 8E 30 3C 1C 02' => 'Sigma 70-300mm F4-5.6 APO Macro Super II', + 'E0 3C 5C 8E 30 3C 4B 06' => 'Sigma 70-300mm F4-5.6 APO DG Macro HSM', #22 + 'A3 3C 5C 8E 30 3C 4B 0E' => 'Sigma 70-300mm F4-5.6 DG OS', + '02 37 5E 8E 35 3D 02 00' => 'Sigma 75-300mm F4.5-5.6 APO', + '02 3A 5E 8E 32 3D 02 00' => 'Sigma 75-300mm F4.0-5.6', + '77 44 61 98 34 3C 7B 0E' => 'Sigma 80-400mm F4.5-5.6 EX OS', + '77 44 60 98 34 3C 7B 0E' => 'Sigma 80-400mm F4.5-5.6 APO DG D OS', + '48 48 68 8E 30 30 4B 02' => 'Sigma APO 100-300mm F4 EX IF HSM', + 'F3 48 68 8E 30 30 4B 02' => 'Sigma APO 100-300mm F4 EX IF HSM', + '26 45 68 8E 34 42 1C 02' => 'Sigma 100-300mm F4.5-6.7 DL', #30 + '48 54 6F 8E 24 24 4B 02' => 'Sigma APO 120-300mm F2.8 EX DG HSM', + '7A 54 6E 8E 24 24 4B 02' => 'Sigma APO 120-300mm F2.8 EX DG HSM', + 'FA 54 6E 8E 24 24 4B 02' => 'Sigma APO 120-300mm F2.8 EX DG HSM', #https://exiftool.org/forum/index.php/topic,2787.0.html + 'CF 38 6E 98 34 3C 4B 0E' => 'Sigma APO 120-400mm F4.5-5.6 DG OS HSM', + 'C3 34 68 98 38 40 4B 4E' => 'Sigma 100-400mm F5-6.3 DG OS HSM | C', #JR (017) + '8D 48 6E 8E 24 24 4B 0E' => 'Sigma 120-300mm F2.8 DG OS HSM Sports', + '26 44 73 98 34 3C 1C 02' => 'Sigma 135-400mm F4.5-5.6 APO Aspherical', + 'CE 34 76 A0 38 40 4B 0E' => 'Sigma 150-500mm F5-6.3 DG OS APO HSM', #JD + '81 34 76 A6 38 40 4B 0E' => 'Sigma 150-600mm F5-6.3 DG OS HSM | S', #Jaap Voets + '82 34 76 A6 38 40 4B 0E' => 'Sigma 150-600mm F5-6.3 DG OS HSM | C', + 'C4 4C 73 73 14 14 4B 46' => 'Sigma 135mm F1.8 DG HSM | A', #forum3833 + '26 40 7B A0 34 40 1C 02' => 'Sigma APO 170-500mm F5-6.3 Aspherical RF', + 'A7 49 80 A0 24 24 4B 06' => 'Sigma APO 200-500mm F2.8 EX DG', + '48 3C 8E B0 3C 3C 4B 02' => 'Sigma APO 300-800mm F5.6 EX DG HSM', + 'D2 3C 8E B0 3C 3C 4B 02' => 'Sigma APO 300-800mm F5.6 EX DG HSM', #forum10942 +# + '00 47 25 25 24 24 00 02' => 'Tamron SP AF 14mm f/2.8 Aspherical (IF) (69E)', + 'C8 54 44 44 0D 0D DF 46' => 'Tamron SP 35mm f/1.4 Di USD (F045)', #IB + 'E8 4C 44 44 14 14 DF 0E' => 'Tamron SP 35mm f/1.8 Di VC USD (F012)', #35 + 'E7 4C 4C 4C 14 14 DF 0E' => 'Tamron SP 45mm f/1.8 Di VC USD (F013)', + 'F4 54 56 56 18 18 84 06' => 'Tamron SP AF 60mm f/2.0 Di II Macro 1:1 (G005)', #24 + 'E5 4C 62 62 14 14 C9 4E' => 'Tamron SP 85mm f/1.8 Di VC USD (F016)', #30 + '1E 5D 64 64 20 20 13 00' => 'Tamron SP AF 90mm f/2.5 (52E)', + '20 5A 64 64 20 20 14 00' => 'Tamron SP AF 90mm f/2.5 Macro (152E)', + '22 53 64 64 24 24 E0 02' => 'Tamron SP AF 90mm f/2.8 Macro 1:1 (72E)', + '32 53 64 64 24 24 35 02' => 'Tamron SP AF 90mm f/2.8 [Di] Macro 1:1 (172E/272E)', + 'F8 55 64 64 24 24 84 06' => 'Tamron SP AF 90mm f/2.8 Di Macro 1:1 (272NII)', + 'F8 54 64 64 24 24 DF 06' => 'Tamron SP AF 90mm f/2.8 Di Macro 1:1 (272NII)', + 'FE 54 64 64 24 24 DF 0E' => 'Tamron SP 90mm f/2.8 Di VC USD Macro 1:1 (F004)', #Jurgen Sahlberg + 'E4 54 64 64 24 24 DF 0E' => 'Tamron SP 90mm f/2.8 Di VC USD Macro 1:1 (F017)', #Rolf Probst + '00 4C 7C 7C 2C 2C 00 02' => 'Tamron SP AF 180mm f/3.5 Di Model (B01)', + '21 56 8E 8E 24 24 14 00' => 'Tamron SP AF 300mm f/2.8 LD-IF (60E)', + '27 54 8E 8E 24 24 1D 02' => 'Tamron SP AF 300mm f/2.8 LD-IF (360E)', + 'E1 40 19 36 2C 35 DF 4E' => 'Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)', + 'F6 3F 18 37 2C 34 84 06' => 'Tamron SP AF 10-24mm f/3.5-4.5 Di II LD Aspherical (IF) (B001)', + 'F6 3F 18 37 2C 34 DF 06' => 'Tamron SP AF 10-24mm f/3.5-4.5 Di II LD Aspherical (IF) (B001)', #30 + '00 36 1C 2D 34 3C 00 06' => 'Tamron SP AF 11-18mm f/4.5-5.6 Di II LD Aspherical (IF) (A13)', + 'E9 48 27 3E 24 24 DF 0E' => 'Tamron SP 15-30mm f/2.8 Di VC USD (A012)', #IB + 'CA 48 27 3E 24 24 DF 4E' => 'Tamron SP 15-30mm f/2.8 Di VC USD G2 (A041)', #IB + 'EA 40 29 8E 2C 40 DF 0E' => 'Tamron 16-300mm f/3.5-6.3 Di II VC PZD (B016)', # (removed AF designation, ref 37) + '07 46 2B 44 24 30 03 02' => 'Tamron SP AF 17-35mm f/2.8-4 Di LD Aspherical (IF) (A05)', + 'CB 3C 2B 44 24 31 DF 46' => 'Tamron 17-35mm f/2.8-4 Di OSD (A037)', #IB + '00 53 2B 50 24 24 00 06' => 'Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16)', #PH + '7C 54 2B 50 24 24 00 06' => 'Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16)', #PH (https://github.com/Exiv2/exiv2/issues/1155) + '00 54 2B 50 24 24 00 06' => 'Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16NII)', + 'FB 54 2B 50 24 24 84 06' => 'Tamron SP AF 17-50mm f/2.8 XR Di II LD Aspherical (IF) (A16NII)', #https://exiftool.org/forum/index.php/topic,3787.0.html + 'F3 54 2B 50 24 24 84 0E' => 'Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical (IF) (B005)', + '00 3F 2D 80 2B 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) (A14)', + '00 3F 2D 80 2C 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14)', + 'EC 3E 3C 8E 2C 40 DF 0E' => 'Tamron 28-300mm f/3.5-6.3 Di VC PZD A010', #30 + '00 40 2D 80 2C 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)', #NJ + 'FC 40 2D 80 2C 40 DF 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)', #PH (NC) + 'E6 40 2D 80 2C 40 DF 0E' => 'Tamron 18-200mm f/3.5-6.3 Di II VC (B018)', #Tanel (removed AF designation, ref 37) + '00 40 2D 88 2C 40 62 06' => 'Tamron AF 18-250mm f/3.5-6.3 Di II LD Aspherical (IF) Macro (A18)', + '00 40 2D 88 2C 40 00 06' => 'Tamron AF 18-250mm f/3.5-6.3 Di II LD Aspherical (IF) Macro (A18NII)', #JD + 'F5 40 2C 8A 2C 40 40 0E' => 'Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical (IF) Macro (B003)', + 'F0 3F 2D 8A 2C 40 DF 0E' => 'Tamron AF 18-270mm f/3.5-6.3 Di II VC PZD (B008)', + 'E0 40 2D 98 2C 41 DF 4E' => 'Tamron 18-400mm f/3.5-6.3 Di II VC HLD (B028)', # (removed AF designation, ref 37) + '07 40 2F 44 2C 34 03 02' => 'Tamron AF 19-35mm f/3.5-4.5 (A10)', + '07 40 30 45 2D 35 03 02.1' => 'Tamron AF 19-35mm f/3.5-4.5 (A10)', + '00 49 30 48 22 2B 00 02' => 'Tamron SP AF 20-40mm f/2.7-3.5 (166D)', + '0E 4A 31 48 23 2D 0E 02' => 'Tamron SP AF 20-40mm f/2.7-3.5 (166D)', + 'FE 48 37 5C 24 24 DF 0E' => 'Tamron SP 24-70mm f/2.8 Di VC USD (A007)', #24 + 'CE 47 37 5C 25 25 DF 4E' => 'Tamron SP 24-70mm f/2.8 Di VC USD G2 (A032)', #forum9110 + '45 41 37 72 2C 3C 48 02' => 'Tamron SP AF 24-135mm f/3.5-5.6 AD Aspherical (IF) Macro (190D)', + '33 54 3C 5E 24 24 62 02' => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09)', + 'FA 54 3C 5E 24 24 84 06' => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09NII)', #JD + 'FA 54 3C 5E 24 24 DF 06' => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09NII)', + '10 3D 3C 60 2C 3C D2 02' => 'Tamron AF 28-80mm f/3.5-5.6 Aspherical (177D)', + '45 3D 3C 60 2C 3C 48 02' => 'Tamron AF 28-80mm f/3.5-5.6 Aspherical (177D)', + '00 48 3C 6A 24 24 00 02' => 'Tamron SP AF 28-105mm f/2.8 LD Aspherical IF (176D)', + '4D 3E 3C 80 2E 3C 62 02' => 'Tamron AF 28-200mm f/3.8-5.6 XR Aspherical (IF) Macro (A03N)', + '0B 3E 3D 7F 2F 3D 0E 00' => 'Tamron AF 28-200mm f/3.8-5.6 (71D)', + '0B 3E 3D 7F 2F 3D 0E 02' => 'Tamron AF 28-200mm f/3.8-5.6D (171D)', + '12 3D 3C 80 2E 3C DF 02' => 'Tamron AF 28-200mm f/3.8-5.6 AF Aspherical LD (IF) (271D)', + '4D 41 3C 8E 2B 40 62 02' => 'Tamron AF 28-300mm f/3.5-6.3 XR Di LD Aspherical (IF) (A061)', + '4D 41 3C 8E 2C 40 62 02' => 'Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical (IF) (185D)', + 'F9 40 3C 8E 2C 40 40 0E' => 'Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical (IF) Macro (A20)', + 'C9 3C 44 76 25 31 DF 4E' => 'Tamron 35-150mm f/2.8-4 Di VC OSD (A043)', #30 + '00 47 53 80 30 3C 00 06' => 'Tamron AF 55-200mm f/4-5.6 Di II LD (A15)', + 'F7 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)', + 'FE 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)', + 'F7 53 5C 80 24 24 40 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)', + # 'FE 54 5C 80 24 24 DF 0E' => 'Tamron SP AF 70-200mm f/2.8 Di VC USD (A009)', + 'FE 54 5C 80 24 24 DF 0E' => 'Tamron SP 70-200mm f/2.8 Di VC USD (A009)', #NJ + 'E2 47 5C 80 24 24 DF 4E' => 'Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025)', #forum9549 + '69 48 5C 8E 30 3C 6F 02' => 'Tamron AF 70-300mm f/4-5.6 LD Macro 1:2 (572D/772D)', + '69 47 5C 8E 30 3C 00 02' => 'Tamron AF 70-300mm f/4-5.6 Di LD Macro 1:2 (A17N)', + '00 48 5C 8E 30 3C 00 06' => 'Tamron AF 70-300mm f/4-5.6 Di LD Macro 1:2 (A17NII)', #JD + 'F1 47 5C 8E 30 3C DF 0E' => 'Tamron SP 70-300mm f/4-5.6 Di VC USD (A005)', + 'CF 47 5C 8E 31 3D DF 0E' => 'Tamron SP 70-300mm f/4-5.6 Di VC USD (A030)', #forum9773 + 'CC 44 68 98 34 41 DF 0E' => 'Tamron 100-400mm f/4.5-6.3 Di VC USD', #30 + 'EB 40 76 A6 38 40 DF 0E' => 'Tamron SP AF 150-600mm f/5-6.3 VC USD (A011)', + 'E3 40 76 A6 38 40 DF 4E' => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2', #30 + 'E3 40 76 A6 38 40 DF 0E' => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2 (A022)', #forum3833 + '20 3C 80 98 3D 3D 1E 02' => 'Tamron AF 200-400mm f/5.6 LD IF (75D)', + '00 3E 80 A0 38 3F 00 02' => 'Tamron SP AF 200-500mm f/5-6.3 Di LD (IF) (A08)', + '00 3F 80 A0 38 3F 00 02' => 'Tamron SP AF 200-500mm f/5-6.3 Di (A08)', +# + '00 40 2B 2B 2C 2C 00 02' => 'Tokina AT-X 17 AF PRO (AF 17mm f/3.5)', + '00 47 44 44 24 24 00 06' => 'Tokina AT-X M35 PRO DX (AF 35mm f/2.8 Macro)', + '00 54 68 68 24 24 00 02' => 'Tokina AT-X M100 AF PRO D (AF 100mm f/2.8 Macro)', + '27 48 8E 8E 30 30 1D 02' => 'Tokina AT-X 304 AF (AF 300mm f/4.0)', + '00 54 8E 8E 24 24 00 02' => 'Tokina AT-X 300 AF PRO (AF 300mm f/2.8)', + '12 3B 98 98 3D 3D 09 00' => 'Tokina AT-X 400 AF SD (AF 400mm f/5.6)', + '00 40 18 2B 2C 34 00 06' => 'Tokina AT-X 107 AF DX Fisheye (AF 10-17mm f/3.5-4.5)', + '00 48 1C 29 24 24 00 06' => 'Tokina AT-X 116 PRO DX (AF 11-16mm f/2.8)', + '7A 48 1C 29 24 24 7E 06' => 'Tokina AT-X 116 PRO DX II (AF 11-16mm f/2.8)', + '80 48 1C 29 24 24 7A 06' => 'Tokina atx-i 11-16mm F2.8 CF', #exiv2 issue 1078 + '7A 48 1C 30 24 24 7E 06' => 'Tokina AT-X 11-20 F2.8 PRO DX (AF 11-20mm f/2.8)', + '8B 48 1C 30 24 24 85 06' => 'Tokina AT-X 11-20 F2.8 PRO DX (AF 11-20mm f/2.8)', #forum12687 + '00 3C 1F 37 30 30 00 06' => 'Tokina AT-X 124 AF PRO DX (AF 12-24mm f/4)', + '7A 3C 1F 37 30 30 7E 06.2' => 'Tokina AT-X 124 AF PRO DX II (AF 12-24mm f/4)', + '7A 3C 1F 3C 30 30 7E 06' => 'Tokina AT-X 12-28 PRO DX (AF 12-28mm f/4)', + '00 48 29 3C 24 24 00 06' => 'Tokina AT-X 16-28 AF PRO FX (AF 16-28mm f/2.8)', + '00 48 29 50 24 24 00 06' => 'Tokina AT-X 165 PRO DX (AF 16-50mm f/2.8)', + '00 40 2A 72 2C 3C 00 06' => 'Tokina AT-X 16.5-135 DX (AF 16.5-135mm F3.5-5.6)', + '00 3C 2B 44 30 30 00 06' => 'Tokina AT-X 17-35 F4 PRO FX (AF 17-35mm f/4)', + '2F 40 30 44 2C 34 29 02.2' => 'Tokina AF 193 (AF 19-35mm f/3.5-4.5)', + '2F 48 30 44 24 24 29 02.2' => 'Tokina AT-X 235 AF PRO (AF 20-35mm f/2.8)', + '2F 40 30 44 2C 34 29 02.1' => 'Tokina AF 235 II (AF 20-35mm f/3.5-4.5)', + '00 48 37 5C 24 24 00 06' => 'Tokina AT-X 24-70 F2.8 PRO FX (AF 24-70mm f/2.8)', + '00 40 37 80 2C 3C 00 02' => 'Tokina AT-X 242 AF (AF 24-200mm f/3.5-5.6)', + '25 48 3C 5C 24 24 1B 02.1' => 'Tokina AT-X 270 AF PRO II (AF 28-70mm f/2.6-2.8)', + '25 48 3C 5C 24 24 1B 02.2' => 'Tokina AT-X 287 AF PRO SV (AF 28-70mm f/2.8)', + '07 48 3C 5C 24 24 03 00' => 'Tokina AT-X 287 AF (AF 28-70mm f/2.8)', + '07 47 3C 5C 25 35 03 00' => 'Tokina AF 287 SD (AF 28-70mm f/2.8-4.5)', + '07 40 3C 5C 2C 35 03 00' => 'Tokina AF 270 II (AF 28-70mm f/3.5-4.5)', + '00 48 3C 60 24 24 00 02' => 'Tokina AT-X 280 AF PRO (AF 28-80mm f/2.8)', + '25 44 44 8E 34 42 1B 02' => 'Tokina AF 353 (AF 35-300mm f/4.5-6.7)', + '00 48 50 72 24 24 00 06' => 'Tokina AT-X 535 PRO DX (AF 50-135mm f/2.8)', + '00 3C 5C 80 30 30 00 0E' => 'Tokina AT-X 70-200 F4 FX VCM-S (AF 70-200mm f/4)', + '00 48 5C 80 30 30 00 0E' => 'Tokina AT-X 70-200 F4 FX VCM-S (AF 70-200mm f/4)', + '12 44 5E 8E 34 3C 09 00' => 'Tokina AF 730 (AF 75-300mm F4.5-5.6)', + '14 54 60 80 24 24 0B 00' => 'Tokina AT-X 828 AF (AF 80-200mm f/2.8)', + '24 54 60 80 24 24 1A 02' => 'Tokina AT-X 828 AF PRO (AF 80-200mm f/2.8)', + '24 44 60 98 34 3C 1A 02' => 'Tokina AT-X 840 AF-II (AF 80-400mm f/4.5-5.6)', + '00 44 60 98 34 3C 00 02' => 'Tokina AT-X 840 D (AF 80-400mm f/4.5-5.6)', + '14 48 68 8E 30 30 0B 00' => 'Tokina AT-X 340 AF (AF 100-300mm f/4)', + '8C 48 29 3C 24 24 86 06' => 'Tokina opera 16-28mm F2.8 FF', #30 +# + '06 3F 68 68 2C 2C 06 00' => 'Cosina AF 100mm F3.5 Macro', + '07 36 3D 5F 2C 3C 03 00' => 'Cosina AF Zoom 28-80mm F3.5-5.6 MC Macro', + '07 46 3D 6A 25 2F 03 00' => 'Cosina AF Zoom 28-105mm F2.8-3.8 MC', + '12 36 5C 81 35 3D 09 00' => 'Cosina AF Zoom 70-210mm F4.5-5.6 MC Macro', + '12 39 5C 8E 34 3D 08 02' => 'Cosina AF Zoom 70-300mm F4.5-5.6 MC Macro', + '12 3B 68 8D 3D 43 09 02' => 'Cosina AF Zoom 100-300mm F5.6-6.7 MC Macro', +# + '12 38 69 97 35 42 09 02' => 'Promaster Spectrum 7 100-400mm F4.5-6.7', +# + '00 40 31 31 2C 2C 00 00' => 'Voigtlander Color Skopar 20mm F3.5 SLII Aspherical', + '00 48 3C 3C 24 24 00 00' => 'Voigtlander Color Skopar 28mm F2.8 SL II', + '00 54 48 48 18 18 00 00' => 'Voigtlander Ultron 40mm F2 SLII Aspherical', + '00 54 55 55 0C 0C 00 00' => 'Voigtlander Nokton 58mm F1.4 SLII', + '00 40 64 64 2C 2C 00 00' => 'Voigtlander APO-Lanthar 90mm F3.5 SLII Close Focus', + '07 40 30 45 2D 35 03 02.2' => 'Voigtlander Ultragon 19-35mm F3.5-4.5 VMV', #NJ + '71 48 64 64 24 24 00 00' => 'Voigtlander APO-Skopar 90mm F2.8 SL IIs', #30 +# + '00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2', + '00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov + '00 48 32 32 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/21 ZF.2', + '00 54 38 38 18 18 00 00' => 'Carl Zeiss Distagon T* 2/25 ZF.2', + '00 54 3C 3C 18 18 00 00' => 'Carl Zeiss Distagon T* 2/28 ZF.2', + '00 54 44 44 0C 0C 00 00' => 'Carl Zeiss Distagon T* 1.4/35 ZF.2', + '00 54 44 44 18 18 00 00' => 'Carl Zeiss Distagon T* 2/35 ZF.2', + '00 54 50 50 0C 0C 00 00' => 'Carl Zeiss Planar T* 1.4/50 ZF.2', + '00 54 50 50 18 18 00 00' => 'Carl Zeiss Makro-Planar T* 2/50 ZF.2', + '00 54 62 62 0C 0C 00 00' => 'Carl Zeiss Planar T* 1.4/85 ZF.2', + '00 54 68 68 18 18 00 00' => 'Carl Zeiss Makro-Planar T* 2/100 ZF.2', + '00 54 72 72 18 18 00 00' => 'Carl Zeiss Apo Sonnar T* 2/135 ZF.2', + '00 54 53 53 0C 0C 00 00' => 'Zeiss Otus 1.4/55', #IB + '01 54 62 62 0C 0C 00 00' => 'Zeiss Otus 1.4/85', + '03 54 68 68 0C 0C 00 00' => 'Zeiss Otus 1.4/100', #IB + '52 54 44 44 18 18 00 00' => 'Zeiss Milvus 35mm f/2', + '53 54 50 50 0C 0C 00 00' => 'Zeiss Milvus 50mm f/1.4', #IB + '54 54 50 50 18 18 00 00' => 'Zeiss Milvus 50mm f/2 Macro', + '55 54 62 62 0C 0C 00 00' => 'Zeiss Milvus 85mm f/1.4', #IB + '56 54 68 68 18 18 00 00' => 'Zeiss Milvus 100mm f/2 Macro', +# + '00 54 56 56 30 30 00 00' => 'Coastal Optical Systems 60mm 1:4 UV-VIS-IR Macro Apo', +# + 'BF 4E 26 26 1E 1E 01 04' => 'Irix 15mm f/2.4 Firefly', #30 + 'BF 3C 1B 1B 30 30 01 04' => 'Irix 11mm f/4 Firefly', #30 +# + '4A 40 11 11 2C 0C 4D 02' => 'Samyang 8mm f/3.5 Fish-Eye CS', + '4A 48 24 24 24 0C 4D 02.1' => 'Samyang 10mm f/2.8 ED AS NCS CS', + '4A 48 1E 1E 24 0C 4D 02' => 'Samyang 12mm f/2.8 ED AS NCS Fish-Eye', #Jurgen Sahlberg + '4A 48 24 24 24 0C 4D 02.2' => 'Samyang AE 14mm f/2.8 ED AS IF UMC', #https://exiftool.org/forum/index.php/topic,3150.0.html + '4A 4C 24 24 1E 6C 4D 06' => 'Samyang 14mm f/2.4 Premium', + '4A 54 29 29 18 0C 4D 02' => 'Samyang 16mm f/2.0 ED AS UMC CS', #Jon Bloom (by email) + '4A 60 36 36 0C 0C 4D 02' => 'Samyang 24mm f/1.4 ED AS UMC', + '4A 60 44 44 0C 0C 4D 02' => 'Samyang 35mm f/1.4 AS UMC', + '4A 60 62 62 0C 0C 4D 02' => 'Samyang AE 85mm f/1.4 AS IF UMC', #https://exiftool.org/forum/index.php/topic,2888.0.html +# + '9A 4C 50 50 14 14 9C 06' => 'Yongnuo YN50mm F1.8N', + '9F 48 48 48 24 24 A1 06' => 'Yongnuo YN40mm F2.8N', #30 + '9F 54 68 68 18 18 A2 06' => 'Yongnuo YN100mm F2N', #30 +# + '02 40 44 5C 2C 34 02 00' => 'Exakta AF 35-70mm 1:3.5-4.5 MC', +# + '07 3E 30 43 2D 35 03 00' => 'Soligor AF Zoom 19-35mm 1:3.5-4.5 MC', + '03 43 5C 81 35 35 02 00' => 'Soligor AF C/D Zoom UMCS 70-210mm 1:4.5', + '12 4A 5C 81 31 3D 09 00' => 'Soligor AF C/D Auto Zoom+Macro 70-210mm 1:4-5.6 UMCS', + '12 36 69 97 35 42 09 00' => 'Soligor AF Zoom 100-400mm 1:4.5-6.7 MC', +# + '00 00 00 00 00 00 00 01' => 'Manual Lens No CPU', +# + '00 00 48 48 53 53 00 01' => 'Loreo 40mm F11-22 3D Lens in a Cap 9005', #PH + '00 47 10 10 24 24 00 00' => 'Fisheye Nikkor 8mm f/2.8 AiS', + '00 47 3C 3C 24 24 00 00' => 'Nikkor 28mm f/2.8 AiS', #35 + # '00 54 44 44 0C 0C 00 00' => 'Nikkor 35mm f/1.4 AiS', comment out in favour of Zeiss with same ID because this lens is rare (requires CPU upgrade) + '00 57 50 50 14 14 00 00' => 'Nikkor 50mm f/1.8 AI', #35 + '00 48 50 50 18 18 00 00' => 'Nikkor H 50mm f/2', + '00 48 68 68 24 24 00 00' => 'Series E 100mm f/2.8', + '00 4C 6A 6A 20 20 00 00' => 'Nikkor 105mm f/2.5 AiS', + '00 48 80 80 30 30 00 00' => 'Nikkor 200mm f/4 AiS', + '00 40 11 11 2C 2C 00 00' => 'Samyang 8mm f/3.5 Fish-Eye', + '00 58 64 64 20 20 00 00' => 'Soligor C/D Macro MC 90mm f/2.5', + '4A 58 30 30 14 0C 4D 02' => 'Rokinon 20mm f/1.8 ED AS UMC', #30 +# + 'A0 56 44 44 14 14 A2 06' => 'Sony FE 35mm F1.8', #IB (Techart adapter) + 'A0 37 5C 8E 34 3C A2 06' => 'Sony FE 70-300mm F4.5-5.6 G OSS', #IB (Techart adapter) +); + +# text encoding used in LocationInfo (ref PH) +%nikonTextEncoding = ( + 0 => 'n/a', + 1 => 'UTF8', + # UTF16 is a guess here: it could also be Unicode or JIS, + # but I chose UTF16 due to the similarity with the QuickTime stringEncoding + 2 => 'UTF16', +); + +# flash firmware decoding (ref JD) +my %flashFirmware = ( + '0 0' => 'n/a', + '1 1' => '1.01 (SB-800 or Metz 58 AF-1)', + '1 3' => '1.03 (SB-800)', + '2 1' => '2.01 (SB-800)', + '2 4' => '2.04 (SB-600)', + '2 5' => '2.05 (SB-600)', + '3 1' => '3.01 (SU-800 Remote Commander)', + '4 1' => '4.01 (SB-400)', + '4 2' => '4.02 (SB-400)', + '4 4' => '4.04 (SB-400)', + '5 1' => '5.01 (SB-900)', + '5 2' => '5.02 (SB-900)', + '6 1' => '6.01 (SB-700)', #https://exiftool.org/forum/index.php/topic,5034.0.html + '7 1' => '7.01 (SB-910)', #PH + '14 3' => '14.03 (SB-5000)', #28 + OTHER => sub { + my ($val, $inv) = @_; + return sprintf('%d.%.2d (Unknown model)', split(' ', $val)) unless $inv; + return "$1 $2" if $val =~ /(\d+)\.(\d+)/; + return '0 0'; + }, +); + +# flash Guide Number (GN) distance settings (ref 28) +my %flashGNDistance = ( + 0 => 0, 19 => '2.8 m', + 1 => '0.1 m', 20 => '3.2 m', + 2 => '0.2 m', 21 => '3.6 m', + 3 => '0.3 m', 22 => '4.0 m', + 4 => '0.4 m', 23 => '4.5 m', + 5 => '0.5 m', 24 => '5.0 m', + 6 => '0.6 m', 25 => '5.6 m', + 7 => '0.7 m', 26 => '6.3 m', + 8 => '0.8 m', 27 => '7.1 m', + 9 => '0.9 m', 28 => '8.0 m', + 10 => '1.0 m', 29 => '9.0 m', + 11 => '1.1 m', 30 => '10.0 m', + 12 => '1.3 m', 31 => '11.0 m', + 13 => '1.4 m', 32 => '13.0 m', + 14 => '1.6 m', 33 => '14.0 m', + 15 => '1.8 m', 34 => '16.0 m', + 16 => '2.0 m', 35 => '18.0 m', + 17 => '2.2 m', 36 => '20.0 m', + 18 => '2.5 m', 255 => 'n/a', +); + +# flash color filter values (ref 28) +my %flashColorFilter = ( + 0x00 => 'None', + 1 => 'FL-GL1 or SZ-2FL Fluorescent', # (green) (SZ model ref PH) + 2 => 'FL-GL2', + 9 => 'TN-A1 or SZ-2TN Incandescent', # (orange) (SZ model ref PH) + 10 => 'TN-A2', + 65 => 'Red', + 66 => 'Blue', + 67 => 'Yellow', + 68 => 'Amber', +); + +# flash control mode values (ref JD) +my %flashControlMode = ( + 0x00 => 'Off', + 0x01 => 'iTTL-BL', + 0x02 => 'iTTL', + 0x03 => 'Auto Aperture', + 0x04 => 'Automatic', #28 + 0x05 => 'GN (distance priority)', #28 (Guide Number, but called "GN" in manual) + 0x06 => 'Manual', + 0x07 => 'Repeating Flash', +); + +my %activeDLightingZ7 = ( + 0 => 'Off', + 2 => 'Low', + 3 => 'Normal', + 4 => 'High', + 5 => 'Extra High', +); + +my %flashControlModeZ7 = ( + 0 => 'TTL', + 1 => 'Auto External Flash', + 2 => 'GN (distance priority)', + 3 => 'Manual', + 4 => 'Repeating Flash', +); + +my %flashRemoteControlZ7 = ( + 0 => 'Group', + 1 => 'Quick Wireless', + 2 => 'Remote Repeating', +); + +my %flashWirelessOptionZ7 = ( + 0 => 'Off', + 1 => 'Optical AWL', + 2 => 'Optical/Radio AWL', + 3 => 'Radio AWL', +); + +my %focusModeZ7 = ( + 0 => 'Manual', + 1 => 'AF-S', + 2 => 'AF-C', + 4 => 'AF-F', # full frame +); + +my %infoZSeries = ( + Condition => '$$self{Model} =~ /^NIKON Z (5|50|6|6_2|7|7_2|fc|9)\b/i', + Notes => 'Z Series cameras thru Decemeber 2021', +); +my %iSOAutoHiLimitZ7 = ( + 0 => 'ISO 64', + 1 => 'ISO 80', + 2 => 'ISO 100', + 3 => 'ISO 125', + 4 => 'ISO 160', + 5 => 'ISO 200', + 6 => 'ISO 250', + 7 => 'ISO 320', + 8 => 'ISO 400', + 9 => 'ISO 500', + 10 => 'ISO 640', + 11 => 'ISO 800', + 12 => 'ISO 1000', + 13 => 'ISO 1250', + 14 => 'ISO 1600', + 15 => 'ISO 2000', + 16 => 'ISO 2500', + 17 => 'ISO 3200', + 18 => 'ISO 4000', + 19 => 'ISO 5000', + 20 => 'ISO 6400', + 21 => 'ISO 8000', + 22 => 'ISO 10000', + 23 => 'ISO 12800', + 24 => 'ISO 16000', + 25 => 'ISO 20000', + 26 => 'ISO 25600', + 27 => 'ISO Hi 0.3', + 28 => 'ISO Hi 0.7', + 29 => 'ISO Hi 1.0', + 32 => 'ISO Hi 2.0', +); + +my %meteringModeZ7 = ( + 0 => 'Matrix', + 1 => 'Center', + 2 => 'Spot', + 3 => 'Highlight' +); + +my %movieFrameRateZ7 = ( + 0 => '120p', + 1 => '100p', + 2 => '60p', + 3 => '50p', + 4 => '30p', + 5 => '25p', + 6 => '24p', +); + +my %offLowNormalHighZ7 = ( + 0 => 'Off', + 1 => 'Low', + 2 => 'Normal', + 3 => 'High', +); + +my %movieFrameSizeZ9 = ( + 1 => '1920x1080', + 2 => '3840x2160', + 3 => '7680x4320', +); + +my %subjectDetectionZ9 = ( + 0 => 'Off', + 1 => 'Auto', + 2 => 'People', + 3 => 'Animals', + 4 => 'Vehicles', +); + +my %vRModeZ9 = ( + 0 => 'Off', + 1 => 'Normal', + 2 => 'Sport', +); + +my %retouchValues = ( #PH + 0 => 'None', + 3 => 'B & W', + 4 => 'Sepia', + 5 => 'Trim', + 6 => 'Small Picture', + 7 => 'D-Lighting', + 8 => 'Red Eye', + 9 => 'Cyanotype', + 10 => 'Sky Light', + 11 => 'Warm Tone', + 12 => 'Color Custom', + 13 => 'Image Overlay', + 14 => 'Red Intensifier', + 15 => 'Green Intensifier', + 16 => 'Blue Intensifier', + 17 => 'Cross Screen', + 18 => 'Quick Retouch', + 19 => 'NEF Processing', + 23 => 'Distortion Control', + 25 => 'Fisheye', + 26 => 'Straighten', + 29 => 'Perspective Control', + 30 => 'Color Outline', + 31 => 'Soft Filter', + 32 => 'Resize', #31 + 33 => 'Miniature Effect', + 34 => 'Skin Softening', # (S9200) + 35 => 'Selected Frame', #31 (frame exported from MOV) + 37 => 'Color Sketch', #31 + 38 => 'Selective Color', # (S9200) + 39 => 'Glamour', # (S3500) + 40 => 'Drawing', # (S9200) + 44 => 'Pop', # (S3500) + 45 => 'Toy Camera Effect 1', # (S3500) + 46 => 'Toy Camera Effect 2', # (S3500) + 47 => 'Cross Process (red)', # (S3500) + 48 => 'Cross Process (blue)', # (S3500) + 49 => 'Cross Process (green)', # (S3500) + 50 => 'Cross Process (yellow)', # (S3500) + 51 => 'Super Vivid', # (S3500) + 52 => 'High-contrast Monochrome', # (S3500) + 53 => 'High Key', # (S3500) + 54 => 'Low Key', # (S3500) +); + +# AF point indices for models with 51 focus points, eg. D3 (ref JD/PH) +# A1 A2 A3 A4 A5 A6 A7 A8 A9 +# B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 +# C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 +# D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 +# E1 E2 E3 E4 E5 E6 E7 E8 E9 +my %afPoints51 = ( + 1 => 'C6', 11 => 'C5', 21 => 'C9', 31 => 'C11',41 => 'A2', 51 => 'D1', + 2 => 'B6', 12 => 'B5', 22 => 'B9', 32 => 'B11',42 => 'D3', + 3 => 'A5', 13 => 'A4', 23 => 'A8', 33 => 'D11',43 => 'E2', + 4 => 'D6', 14 => 'D5', 24 => 'D9', 34 => 'C4', 44 => 'C2', + 5 => 'E5', 15 => 'E4', 25 => 'E8', 35 => 'B4', 45 => 'B2', + 6 => 'C7', 16 => 'C8', 26 => 'C10',36 => 'A3', 46 => 'A1', + 7 => 'B7', 17 => 'B8', 27 => 'B10',37 => 'D4', 47 => 'D2', + 8 => 'A6', 18 => 'A7', 28 => 'A9', 38 => 'E3', 48 => 'E1', + 9 => 'D7', 19 => 'D8', 29 => 'D10',39 => 'C3', 49 => 'C1', + 10 => 'E6', 20 => 'E7', 30 => 'E9', 40 => 'B3', 50 => 'B1', +); + +# AF point indices for models with 39 focus points, eg. D7000 (ref 29) +# A1 A2 A3 +# B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 +# C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 +# D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 +# E1 E2 E3 +my %afPoints39 = ( + 1 => 'C6', 11 => 'C5', 21 => 'D9', 31 => 'C3', + 2 => 'B6', 12 => 'B5', 22 => 'C10',32 => 'B3', + 3 => 'A2', 13 => 'A1', 23 => 'B10',33 => 'D3', + 4 => 'D6', 14 => 'D5', 24 => 'D10',34 => 'C2', + 5 => 'E2', 15 => 'E1', 25 => 'C11',35 => 'B2', + 6 => 'C7', 16 => 'C8', 26 => 'B11',36 => 'D2', + 7 => 'B7', 17 => 'B8', 27 => 'D11',37 => 'C1', + 8 => 'A3', 18 => 'D8', 28 => 'C4', 38 => 'B1', + 9 => 'D7', 19 => 'C9', 29 => 'B4', 39 => 'D1', + 10 => 'E3', 20 => 'B9', 30 => 'D4', +); + +# AF point indices for models with 105 focus points, eg. D6 (ref 28) +# - 7 rows (A-G) with 15 columns (1-15), center is D8 +my %afPoints105 = ( + 1 => 'D8', 28 => 'G7', 55 => 'F13', 82 => 'E4', + 2 => 'C8', 29 => 'D6', 56 => 'G13', 83 => 'F4', + 3 => 'B8', 30 => 'C6', 57 => 'D14', 84 => 'G4', + 4 => 'A8', 31 => 'B6', 58 => 'C14', 85 => 'D3', + 5 => 'E8', 32 => 'A6', 59 => 'B14', 86 => 'C3', + 6 => 'F8', 33 => 'E6', 60 => 'A14', 87 => 'B3', + 7 => 'G8', 34 => 'F6', 61 => 'E14', 88 => 'A3', + 8 => 'D9', 35 => 'G6', 62 => 'F14', 89 => 'E3', + 9 => 'C9', 36 => 'D11', 63 => 'G14', 90 => 'F3', + 10 => 'B9', 37 => 'C11', 64 => 'D15', 91 => 'G3', + 11 => 'A9', 38 => 'B11', 65 => 'C15', 92 => 'D2', + 12 => 'E9', 39 => 'A11', 66 => 'B15', 93 => 'C2', + 13 => 'F9', 40 => 'E11', 67 => 'A15', 94 => 'B2', + 14 => 'G9', 41 => 'F11', 68 => 'E15', 95 => 'A2', + 15 => 'D10', 42 => 'G11', 69 => 'F15', 96 => 'E2', + 16 => 'C10', 43 => 'D12', 70 => 'G15', 97 => 'F2', + 17 => 'B10', 44 => 'C12', 71 => 'D5', 98 => 'G2', + 18 => 'A10', 45 => 'B12', 72 => 'C5', 99 => 'D1', + 19 => 'E10', 46 => 'A12', 73 => 'B5', 100 => 'C1', + 20 => 'F10', 47 => 'E12', 74 => 'A5', 101 => 'B1', + 21 => 'G10', 48 => 'F12', 75 => 'E5', 102 => 'A1', + 22 => 'D7', 49 => 'G12', 76 => 'F5', 103 => 'E1', + 23 => 'C7', 50 => 'D13', 77 => 'G5', 104 => 'F1', + 24 => 'B7', 51 => 'C13', 78 => 'D4', 105 => 'G1', + 25 => 'A7', 52 => 'B13', 79 => 'C4', + 26 => 'E7', 53 => 'A13', 80 => 'B4', + 27 => 'F7', 54 => 'E13', 81 => 'A4', +); + +# AF point indices for models with 135 focus points, eg. 1J1 (ref PH) +# - 9 rows (A-I) with 15 columns (1-15), center is E8 +# - odd columns, columns 2 and 14, and the remaining corner points are +# not used in 41-point mode +my %afPoints135 = ( + 1 => 'E8', 28 => 'E10', 55 => 'E13', 82 => 'E6', 109 => 'E3', + 2 => 'D8', 29 => 'D10', 56 => 'D13', 83 => 'D6', 110 => 'D3', + 3 => 'C8', 30 => 'C10', 57 => 'C13', 84 => 'C6', 111 => 'C3', + 4 => 'B8', 31 => 'B10', 58 => 'B13', 85 => 'B6', 112 => 'B3', + 5 => 'A8', 32 => 'A10', 59 => 'A13', 86 => 'A6', 113 => 'A3', + 6 => 'F8', 33 => 'F10', 60 => 'F13', 87 => 'F6', 114 => 'F3', + 7 => 'G8', 34 => 'G10', 61 => 'G13', 88 => 'G6', 115 => 'G3', + 8 => 'H8', 35 => 'H10', 62 => 'H13', 89 => 'H6', 116 => 'H3', + 9 => 'I8', 36 => 'I10', 63 => 'I13', 90 => 'I6', 117 => 'I3', + 10 => 'E9', 37 => 'E11', 64 => 'E14', 91 => 'E5', 118 => 'E2', + 11 => 'D9', 38 => 'D11', 65 => 'D14', 92 => 'D5', 119 => 'D2', + 12 => 'C9', 39 => 'C11', 66 => 'C14', 93 => 'C5', 120 => 'C2', + 13 => 'B9', 40 => 'B11', 67 => 'B14', 94 => 'B5', 121 => 'B2', + 14 => 'A9', 41 => 'A11', 68 => 'A14', 95 => 'A5', 122 => 'A2', + 15 => 'F9', 42 => 'F11', 69 => 'F14', 96 => 'F5', 123 => 'F2', + 16 => 'G9', 43 => 'G11', 70 => 'G14', 97 => 'G5', 124 => 'G2', + 17 => 'H9', 44 => 'H11', 71 => 'H14', 98 => 'H5', 125 => 'H2', + 18 => 'I9', 45 => 'I11', 72 => 'I14', 99 => 'I5', 126 => 'I2', + 19 => 'E7', 46 => 'E12', 73 => 'E15', 100 => 'E4', 127 => 'E1', + 20 => 'D7', 47 => 'D12', 74 => 'D15', 101 => 'D4', 128 => 'D1', + 21 => 'C7', 48 => 'C12', 75 => 'C15', 102 => 'C4', 129 => 'C1', + 22 => 'B7', 49 => 'B12', 76 => 'B15', 103 => 'B4', 130 => 'B1', + 23 => 'A7', 50 => 'A12', 77 => 'A15', 104 => 'A4', 131 => 'A1', + 24 => 'F7', 51 => 'F12', 78 => 'F15', 105 => 'F4', 132 => 'F1', + 25 => 'G7', 52 => 'G12', 79 => 'G15', 106 => 'G4', 133 => 'G1', + 26 => 'H7', 53 => 'H12', 80 => 'H15', 107 => 'H4', 134 => 'H1', + 27 => 'I7', 54 => 'I12', 81 => 'I15', 108 => 'I4', 135 => 'I1', +); + +# AF point indices for models with 153 focus points, eg. D5,D500 (ref PH) +# - 9 rows (A-I) with 17 columns (1-17), center is E9 +# - 55 of these are selectable cross points (odd rows and columns 1,3,4,6,7,9,11,12,14,15,17) +my %afPoints153 = ( + 1 => 'E9', 32 => 'A8', 63 => 'I13', 94 => 'B17', 125 => 'H4', + 2 => 'D9', 33 => 'F8', 64 => 'E14', 95 => 'A17', 126 => 'I4', + 3 => 'C9', 34 => 'G8', 65 => 'D14', 96 => 'F17', 127 => 'E3', + 4 => 'B9', 35 => 'H8', 66 => 'C14', 97 => 'G17', 128 => 'D3', + 5 => 'A9', 36 => 'I8', 67 => 'B14', 98 => 'H17', 129 => 'C3', + 6 => 'F9', 37 => 'E7', 68 => 'A14', 99 => 'I17', 130 => 'B3', + 7 => 'G9', 38 => 'D7', 69 => 'F14', 100 => 'E6', 131 => 'A3', + 8 => 'H9', 39 => 'C7', 70 => 'G14', 101 => 'D6', 132 => 'F3', + 9 => 'I9', 40 => 'B7', 71 => 'H14', 102 => 'C6', 133 => 'G3', + 10 => 'E10', 41 => 'A7', 72 => 'I14', 103 => 'B6', 134 => 'H3', + 11 => 'D10', 42 => 'F7', 73 => 'E15', 104 => 'A6', 135 => 'I3', + 12 => 'C10', 43 => 'G7', 74 => 'D15', 105 => 'F6', 136 => 'E2', + 13 => 'B10', 44 => 'H7', 75 => 'C15', 106 => 'G6', 137 => 'D2', + 14 => 'A10', 45 => 'I7', 76 => 'B15', 107 => 'H6', 138 => 'C2', + 15 => 'F10', 46 => 'E12', 77 => 'A15', 108 => 'I6', 139 => 'B2', + 16 => 'G10', 47 => 'D12', 78 => 'F15', 109 => 'E5', 140 => 'A2', + 17 => 'H10', 48 => 'C12', 79 => 'G15', 110 => 'D5', 141 => 'F2', + 18 => 'I10', 49 => 'B12', 80 => 'H15', 111 => 'C5', 142 => 'G2', + 19 => 'E11', 50 => 'A12', 81 => 'I15', 112 => 'B5', 143 => 'H2', + 20 => 'D11', 51 => 'F12', 82 => 'E16', 113 => 'A5', 144 => 'I2', + 21 => 'C11', 52 => 'G12', 83 => 'D16', 114 => 'F5', 145 => 'E1', + 22 => 'B11', 53 => 'H12', 84 => 'C16', 115 => 'G5', 146 => 'D1', + 23 => 'A11', 54 => 'I12', 85 => 'B16', 116 => 'H5', 147 => 'C1', + 24 => 'F11', 55 => 'E13', 86 => 'A16', 117 => 'I5', 148 => 'B1', + 25 => 'G11', 56 => 'D13', 87 => 'F16', 118 => 'E4', 149 => 'A1', + 26 => 'H11', 57 => 'C13', 88 => 'G16', 119 => 'D4', 150 => 'F1', + 27 => 'I11', 58 => 'B13', 89 => 'H16', 120 => 'C4', 151 => 'G1', + 28 => 'E8', 59 => 'A13', 90 => 'I16', 121 => 'B4', 152 => 'H1', + 29 => 'D8', 60 => 'F13', 91 => 'E17', 122 => 'A4', 153 => 'I1', + 30 => 'C8', 61 => 'G13', 92 => 'D17', 123 => 'F4', + 31 => 'B8', 62 => 'H13', 93 => 'C17', 124 => 'G4', +); + +# AF point indices for models with 81 focus points, eg. Z6/Z7/Z50 (ref 38) +# - 9 rows (A-I) with 9 columns (1-9), center is E5 +# NOTE: the AF points start 2 bytes into the data, so the map starts +# at 17 instead of 1 +# +# 7 6 5 4 3 2 1 0 +# 00 : [H5][G5][F5][A5][B5][C5][D5][E5] +# 01 : [G6][F6][A6][B6][C6][D6][E6][I5] +# 02 : [F4][A4][B4][C4][D4][E4][I6][H6] +# 03 : [A7][B7][C7][D7][E7][I4][H4][G4] +# 04 : [B3][C3][D3][E3][I7][H7][G7][F7] +# 05 : [C8][D8][E8][I3][H3][G3][F3][A3] +# 06 : [D2][E2][I8][H8][G8][F8][A8][B8] +# 07 : [E9][I2][H2][G2][F2][A2][B2][C2] +# 08 : [I9][H9][G9][F9][A9][B9][C9][D9] +# 09 : [H1][G1][F1][A1][B1][C1][D1][E1] +# 0a : [ ][ ][ ][ ][ ][ ][ ][I1] +my %afPoints81 = ( + 17 => 'E5', 34 => 'I6', 51 => 'H7', 68 => 'G8', 85 => 'F9', + 18 => 'D5', 35 => 'E4', 52 => 'I7', 69 => 'H8', 86 => 'G9', + 19 => 'C5', 36 => 'D4', 53 => 'E3', 70 => 'I8', 87 => 'H9', + 20 => 'B5', 37 => 'C4', 54 => 'D3', 71 => 'E2', 88 => 'I9', + 21 => 'A5', 38 => 'B4', 55 => 'C3', 72 => 'D2', 89 => 'E1', + 22 => 'F5', 39 => 'A4', 56 => 'B3', 73 => 'C2', 90 => 'D1', + 23 => 'G5', 40 => 'F4', 57 => 'A3', 74 => 'B2', 91 => 'C1', + 24 => 'H5', 41 => 'G4', 58 => 'F3', 75 => 'A2', 92 => 'B1', + 25 => 'I5', 42 => 'H4', 59 => 'G3', 76 => 'F2', 93 => 'A1', + 26 => 'E6', 43 => 'I4', 60 => 'H3', 77 => 'G2', 94 => 'F1', + 27 => 'D6', 44 => 'E7', 61 => 'I3', 78 => 'H2', 95 => 'G1', + 28 => 'C6', 45 => 'D7', 62 => 'E8', 79 => 'I2', 96 => 'H1', + 29 => 'B6', 46 => 'C7', 63 => 'D8', 80 => 'E9', 97 => 'I1', + 30 => 'A6', 47 => 'B7', 64 => 'C8', 81 => 'D9', + 31 => 'F6', 48 => 'A7', 65 => 'B8', 82 => 'C9', + 32 => 'G6', 49 => 'F7', 66 => 'A8', 83 => 'B9', + 33 => 'H6', 50 => 'G7', 67 => 'F8', 84 => 'A9', +); + +my %cropHiSpeed = ( #IB + 0 => 'Off', + 1 => '1.3x Crop', # (1.3x Crop, Large) + 2 => 'DX Crop', # (1.5x) + 3 => '5:4 Crop', + 4 => '3:2 Crop', # (1.2x, ref 36) + 6 => '16:9 Crop', + 8 => '2.7x Crop', #36 (D4/D500) + 9 => 'DX Movie Crop', # (DX during movie recording, Large) + 10 => '1.3x Movie Crop', #36 (D4/D500) + 11 => 'FX Uncropped', + 12 => 'DX Uncropped', + 13 => '2.8x Movie Crop', #28 (D5/D6) 5584/1936 + 14 => '1.4x Movie Crop', #28 (D5/D6) 5584/3856 + 15 => '1.5x Movie Crop', #36 (D4/D500) 5600/3872 + 17 => '1:1 Crop', + OTHER => sub { + my ($val, $inv, $conv) = @_; + return undef if $inv; + my @a = split ' ', $val; + return "Unknown ($val)" unless @a == 7; + $a[0] = $$conv{$a[0]} || "Unknown ($a[0])"; + return "$a[0] ($a[1]x$a[2] cropped to $a[3]x$a[4] at pixel $a[5],$a[6])"; + }, +); + +my %flashGroupOptionsMode = ( + 0 => 'TTL', + 1 => 'Manual', + 2 => 'Auto', + 3 => 'Off', +); + +my %nefCompression = ( #28 relocated to MakerNotes_0x51 at offset x'0a (Z9) + 1 => 'Lossy (type 1)', # (older models) + 2 => 'Uncompressed', #JD - D100 (even though TIFF compression is set!) + 3 => 'Lossless', + 4 => 'Lossy (type 2)', + 5 => 'Striped packed 12 bits', #IB + 6 => 'Uncompressed (reduced to 12 bit)', #IB + 7 => 'Unpacked 12 bits', #IB (padded to 16) + 8 => 'Small', #IB + 9 => 'Packed 12 bits', #IB (2 pixels in 3 bytes) + 10 => 'Packed 14 bits', #28 (4 pixels in 7 bytes, eg. D6 uncompressed 14 bit) + 13 => 'High Efficiency', #28 + 14 => 'High Efficiency*', #28 +); + +my %noYes = ( 0 => 'No' , 1 => 'Yes', ); +my %offOn = ( 0 => 'Off', 1 => 'On' ); +my %onOff = ( 0 => 'On', 1 => 'Off' ); + +# common attributes for writable BinaryData directories +my %binaryDataAttrs = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, +); + +my %base64bin = ( ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)' ); +my %base64int32u = ( ValueConv => 'my $val=Image::ExifTool::XMP::DecodeBase64($val); unpack("V",$$val)' ); +my %base64bytes = ( ValueConv => 'my $val=Image::ExifTool::XMP::DecodeBase64($val); join(".",unpack("C*",$$val))' ); +my %base64double = ( + ValueConv => q{ + my $val=Image::ExifTool::XMP::DecodeBase64($val); + my $saveOrder = GetByteOrder(); + SetByteOrder('II'); + $val = GetDouble($val,0); + SetByteOrder($saveOrder); + return $val; + }, +); +my %base64coord = ( + ValueConv => q{ + my $val=Image::ExifTool::XMP::DecodeBase64($val); + my $saveOrder = GetByteOrder(); + SetByteOrder('II'); + $val = GetDouble($val,0) + GetDouble($val,8)/60 + GetDouble($val,16)/3600; + SetByteOrder($saveOrder); + return $val; + }, + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)', +); +# Nikon maker note tags +%Image::ExifTool::Nikon::Main = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikon, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikon, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PRINT_CONV => \&FormatString, + 0x0001 => { #2 + # the format differs for different models. for D70, this is a string '0210', + # but for the E775 it is binary: "\x00\x01\x00\x00" + Name => 'MakerNoteVersion', + Writable => 'undef', + Count => 4, + # convert to string if binary + ValueConv => '$_=$val; /^[\x00-\x09]/ and $_=join("",unpack("CCCC",$_)); $_', + ValueConvInv => '$val', + PrintConv => '$_=$val;s/^(\d{2})/$1\./;s/^0//;$_', + PrintConvInv => '$_=$val;s/\.//;"0$_"', + }, + 0x0002 => { + # this is the ISO actually used by the camera + # (may be different than ISO setting if auto) + Name => 'ISO', + Writable => 'int16u', + Count => 2, + Priority => 0, # the EXIF ISO is more reliable + Groups => { 2 => 'Image' }, + # D300 sets this to undef with 4 zero bytes when LO ISO is used - PH + RawConv => '$val eq "\0\0\0\0" ? undef : $val', + # first number is 1 for "Hi ISO" modes (H0.3, H0.7 and H1.0 on D80) - PH + PrintConv => '$_=$val;s/^0 //;s/^1 (\d+)/Hi $1/;$_', + PrintConvInv => '$_=$val;/^\d+/ ? "0 $_" : (s/Hi ?//i ? "1 $_" : $_)', + }, + # Note: we attempt to fix the case of these string values (typically written in all caps) + 0x0003 => { Name => 'ColorMode', Writable => 'string' }, + 0x0004 => { Name => 'Quality', Writable => 'string' }, + 0x0005 => { Name => 'WhiteBalance', Writable => 'string' }, + 0x0006 => { Name => 'Sharpness', Writable => 'string' }, + 0x0007 => { + Name => 'FocusMode', + DataMember => 'FocusMode', + Writable => 'string', + RawConv => '$$self{FocusMode} = $val', + }, + # FlashSetting (better named FlashSyncMode, ref 28) values: + # "Normal", "Slow", "Rear Slow", "RED-EYE", "RED-EYE SLOW" + 0x0008 => { Name => 'FlashSetting', Writable => 'string' }, + # FlashType observed values: + # internal: "Built-in,TTL", "Built-in,RPT", "Comdr.", "NEW_TTL" + # external: "Optional,TTL", "Optional,RPT", "Optional,M", "Comdr." + # both: "Built-in,TTL&Comdr." + # no flash: "" + 0x0009 => { Name => 'FlashType', Writable => 'string' }, #2 (count varies by model - PH) + # 0x000a - rational values: 5.6 to 9.33 - found in Coolpix models - PH + # (seems constant for a given camera model, but not correlated with scale factor) + 0x000b => { #2 + Name => 'WhiteBalanceFineTune', + Writable => 'int16s', + Count => -1, # older models write 1 value, newer DSLR's write 2 - PH + }, + 0x000c => { # (D1X) + Name => 'WB_RBLevels', + Writable => 'rational64u', + Count => 4, # (not sure what the last 2 values are for) + }, + 0x000d => { #15 + Name => 'ProgramShift', + Writable => 'undef', + Count => 4, + ValueConv => 'my ($a,$b,$c)=unpack("c3",$val); $c ? $a*($b/$c) : 0', + ValueConvInv => q{ + my $a = int($val*6 + ($val>0 ? 0.5 : -0.5)); + $a<-128 or $a>127 ? undef : pack("c4",$a,1,6,0); + }, + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x000e => { + Name => 'ExposureDifference', + Writable => 'undef', + Count => 4, + ValueConv => 'my ($a,$b,$c)=unpack("c3",$val); $c ? $a*($b/$c) : 0', + ValueConvInv => q{ + my $a = int($val*12 + ($val>0 ? 0.5 : -0.5)); + $a<-128 or $a>127 ? undef : pack("c4",$a,1,12,0); + }, + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 0x000f => { Name => 'ISOSelection', Writable => 'string' }, #2 + 0x0010 => { + Name => 'DataDump', + Writable => 0, + Binary => 1, + }, + 0x0011 => { + Name => 'PreviewIFD', + Groups => { 1 => 'PreviewIFD', 2 => 'Image' }, + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::PreviewIFD', + Start => '$val', + }, + }, + 0x0012 => { #2 (camera setting: combination of command dial and menus - PH) + Name => 'FlashExposureComp', + Description => 'Flash Exposure Compensation', + Writable => 'undef', + Count => 4, + # (includes the built-in compensation for FlashType "Built-in,TTL&Comdr.") + Notes => q{ + may be set even if flash does not fire. Does not include the effect of + flash bracketing. + }, + ValueConv => 'my ($a,$b,$c)=unpack("c3",$val); $c ? $a*($b/$c) : 0', + ValueConvInv => q{ + my $a = int($val*6 + ($val>0 ? 0.5 : -0.5)); + $a<-128 or $a>127 ? undef : pack("c4",$a,1,6,0); + }, + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + # D70 - another ISO tag + 0x0013 => { #2 + Name => 'ISOSetting', + Writable => 'int16u', + Count => 2, + PrintConv => '$_=$val;s/^0 //;$_', + PrintConvInv => '"0 $val"', + }, + 0x0014 => [ + { #4 + Name => 'ColorBalanceA', + Condition => '$format eq "undef" and $count == 2560', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ColorBalanceA', + ByteOrder => 'BigEndian', + }, + }, + { #IB + Name => 'NRWData', + Condition => '$$valPt =~ /^NRW 0100/', + Drop => 1, # 'Drop' because it is large and not found in JPEG images + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ColorBalanceB', + }, + }, + { #IB + Name => 'NRWData', + Condition => '$$valPt =~ /^NRW /', + Drop => 1, # 'Drop' because it is large and not found in JPEG images + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ColorBalanceC', + }, + }, + ], + # 0x0015 - string[8]: "AUTO " + # D70 Image boundary?? top x,y bot-right x,y + 0x0016 => { #2 + Name => 'ImageBoundary', + Writable => 'int16u', + Count => 4, + }, + 0x0017 => { #28 + Name => 'ExternalFlashExposureComp', #PH (setting from external flash unit) + Writable => 'undef', + Count => 4, + ValueConv => 'my ($a,$b,$c)=unpack("c3",$val); $c ? $a*($b/$c) : 0', + ValueConvInv => q{ + my $a = int($val*6 + ($val>0 ? 0.5 : -0.5)); + $a<-128 or $a>127 ? undef : pack("c4",$a,1,6,0); + }, + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x0018 => { #5 + Name => 'FlashExposureBracketValue', + Writable => 'undef', + Count => 4, + ValueConv => 'my ($a,$b,$c)=unpack("c3",$val); $c ? $a*($b/$c) : 0', + ValueConvInv => q{ + my $a = int($val*6 + ($val>0 ? 0.5 : -0.5)); + $a<-128 or $a>127 ? undef : pack("c4",$a,1,6,0); + }, + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x0019 => { #5 + Name => 'ExposureBracketValue', + Writable => 'rational64s', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x001a => { #PH + Name => 'ImageProcessing', + Writable => 'string', + }, + 0x001b => { #15 + Name => 'CropHiSpeed', + Writable => 'int16u', + Count => 7, + PrintConv => \%cropHiSpeed, + }, + 0x001c => { #28 (D3 "the application of CSb6 to the selected metering mode") + Name => 'ExposureTuning', + Writable => 'undef', + Count => 3, + ValueConv => 'my ($a,$b,$c)=unpack("c3",$val); $c ? $a*($b/$c) : 0', + ValueConvInv => q{ + my $a = int($val*6 + ($val>0 ? 0.5 : -0.5)); + $a<-128 or $a>127 ? undef : pack("c3",$a,1,6); + }, + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x001d => { #4 + Name => 'SerialNumber', + # Note: this has been known to change even if the serial number on the body + # stays the same if some parts of the camera were replaced by Nikon service + Writable => 'string', + Protected => 1, + Notes => q{ + this value is used as a key to decrypt other information -- writing this tag + causes the other information to be re-encrypted with the new key + }, + PrintConv => undef, # disable default PRINT_CONV + }, + 0x001e => { #14 + Name => 'ColorSpace', + Writable => 'int16u', + PrintConv => { + 1 => 'sRGB', + 2 => 'Adobe RGB', + }, + }, + 0x001f => { #PH + Name => 'VRInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::VRInfo' }, + }, + 0x0020 => { #16 + Name => 'ImageAuthentication', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0x0021 => { #PH + Name => 'FaceDetect', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FaceDetect' }, + }, + 0x0022 => { #21 + Name => 'ActiveD-Lighting', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 3 => 'Normal', + 5 => 'High', + 7 => 'Extra High', #10 + 8 => 'Extra High 1', #PH + 9 => 'Extra High 2', #PH + 10 => 'Extra High 3', #PH + 11 => 'Extra High 4', #PH + 0xffff => 'Auto', #10 + }, + }, + 0x0023 => [ + { #PH (D300, but also found in D3,D3S,D3X,D90,D300S,D700,D3000,D5000) + Name => 'PictureControlData', + Condition => '$$valPt =~ /^01/', + Writable => 'undef', + Permanent => 0, + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControl' }, + },{ #28 + Name => 'PictureControlData', + Condition => '$$valPt =~ /^02/', + Writable => 'undef', + Permanent => 0, + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControl2' }, + },{ + Name => 'PictureControlData', + Condition => '$$valPt =~ /^03/', + Writable => 'undef', + Permanent => 0, + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControl3' }, + },{ + Name => 'PictureControlData', + Writable => 'undef', + Permanent => 0, + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControlUnknown' }, + }, + ], + 0x0024 => { #JD + Name => 'WorldTime', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::WorldTime', + # (CaptureNX does flip the byte order of this record) + }, + }, + 0x0025 => { #PH + Name => 'ISOInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ISOInfo', + ByteOrder => 'BigEndian', + }, + }, + 0x002a => { #23 (this tag added with D3 firmware 1.10 -- also written by Nikon utilities) + Name => 'VignetteControl', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 3 => 'Normal', + 5 => 'High', + }, + }, + 0x002b => { #PH + Name => 'DistortInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::DistortInfo', + }, + }, + 0x002c => { #29 (D7000) + Name => 'UnknownInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::UnknownInfo', + ByteOrder => 'BigEndian', #(NC) + }, + }, + # 0x2d - "512 0 0","512 3 10","512 1 14",... + 0x0032 => { #PH + Name => 'UnknownInfo2', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::UnknownInfo2', + ByteOrder => 'BigEndian', #(NC) + }, + }, + 0x0034 => { #forum9646 + Name => 'ShutterMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Mechanical', + 16 => 'Electronic', + # 33 => ? seen for 1J2 + 48 => 'Electronic Front Curtain', + 64 => 'Electronic (Movie)', #JanSkoda (Z6II) + 80 => 'Auto (Mechanical)', #JanSkoda (Z6II) + 81 => 'Auto (Electronic Front Curtain)', #JanSkoda (Z6II) + }, + }, + 0x0035 => { #32 + Name => 'HDRInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::HDRInfo' }, + }, + 0x0037 => { #XavierJubier + Name => 'MechanicalShutterCount', + Writable => 'int32u', + }, + 0x0039 => { + Name => 'LocationInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LocationInfo' }, + }, + 0x003d => { #IB + Name => 'BlackLevel', + Writable => 'int16u', + Count => 4, + # (may need to divide by 4 for some images, eg. D3300/D5300, 12 bit - ref IB) + }, + 0x003e => { #28 + Name => 'ImageSizeRAW', + PrintConv => { + 1 => 'Large', + 2 => 'Medium', + 3 => 'Small', + }, + }, + 0x0045 => { #IB + Name => 'CropArea', + Notes => 'left, top, width, height', + Writable => 'int16u', + Count => 4, + }, + 0x004e => { #28 + Name => 'NikonSettings', + Writable => 'undef', + Permanent => 0, + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { TagTable => 'Image::ExifTool::NikonSettings::Main' }, + }, + 0x004f => { #IB (D850) + Name => 'ColorTemperatureAuto', + Writable => 'int16u', + }, + 0x0051 => { #28 (Z9) + Name => 'MakerNotes0x51', + Writable => 'undef', + Hidden => 1, + Permanent => 0, + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::MakerNotes0x51' }, + }, + #0x0053 #28 possibly a secondary DistortionControl block (in addition to DistortInfo)? Certainly offset 0x04 within block contains tag AutoDistortionControl for Z72 and D6 (1=>On; 2=> Off) + #0x005e #28 possibly DiffractionCompensation block? Certainly offset 0x04 within block contains tag DiffractionCompensation + 0x0080 => { Name => 'ImageAdjustment', Writable => 'string' }, + 0x0081 => { Name => 'ToneComp', Writable => 'string' }, #2 + 0x0082 => { Name => 'AuxiliaryLens', Writable => 'string' }, + 0x0083 => { + Name => 'LensType', + Writable => 'int8u', + # credit to Tom Christiansen (ref 7) for figuring this out... + # (note that older models don't seem to set bits 4-7 (0xf0), so the + # LensType may be different with different models, ref Kenneth Cochran) + PrintConv => q[$_ = $val ? Image::ExifTool::DecodeBits($val, + { + 0 => 'MF', + 1 => 'D', + 2 => 'G', + 3 => 'VR', + 4 => '1', #PH + 5 => 'FT-1', #PH/IB + 6 => 'E', #PH (electromagnetic aperture mechanism) + 7 => 'AF-P', #PH/IB + }) : 'AF'; + # remove commas and change "D G" to just "G" + s/,//g; s/\bD G\b/G/; + s/ E\b// and s/^(G )?/E /; # put "E" at the start instead of "G" + s/ 1// and $_ = "1 $_"; # put "1" at start + s/FT-1 // and $_ .= ' FT-1'; # put "FT-1" at end + return $_; + ], + PrintConvInv => q[ + my $bits = 0; + $bits |= 0x01 if $val =~ /\bMF\b/i; # bit 0 + $bits |= 0x02 if $val =~ /\bD\b/i; # bit 1 + $bits |= 0x06 if $val =~ /\bG\b/i; # bits 1 and 2 + $bits |= 0x08 if $val =~ /\bVR\b/i; # bit 3 + $bits |= 0x10 if $val =~ /\b1\b/; # bit 4 + $bits |= 0x20 if $val =~ /\bFT-1/i; # bit 5 + $bits |= 0x80 if $val =~ /\bAF-P/i; # bit 7 (not used by all models) + $bits |= 0x46 if $val =~ /\bE\b/i; # bits 1, 2 and 6 + return $bits; + ], + }, + 0x0084 => { #2 + Name => "Lens", + Writable => 'rational64u', + Count => 4, + # short focal, long focal, aperture at short focal, aperture at long focal + PrintConv => \&Image::ExifTool::Exif::PrintLensInfo, + PrintConvInv => \&Image::ExifTool::Exif::ConvertLensInfo, + }, + 0x0085 => { + Name => 'ManualFocusDistance', + Writable => 'rational64u', + }, + 0x0086 => { + Name => 'DigitalZoom', + Writable => 'rational64u', + }, + 0x0087 => { #5 + Name => 'FlashMode', + Writable => 'int8u', + PrintConv => { + 0 => 'Did Not Fire', + 1 => 'Fired, Manual', #14 + 3 => 'Not Ready', #28 + 7 => 'Fired, External', #14 + 8 => 'Fired, Commander Mode', + 9 => 'Fired, TTL Mode', + 18 => 'LED Light', #G.F. (movie LED light) + }, + }, + 0x0088 => [ + { + Name => 'AFInfo', + Condition => '$$self{Model} =~ /^NIKON D/i', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::AFInfo', + ByteOrder => 'BigEndian', + }, + }, + { + Name => 'AFInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::AFInfo', + ByteOrder => 'LittleEndian', + }, + }, + ], + 0x0089 => { #5 + Name => 'ShootingMode', + Writable => 'int16u', + # the meaning of bit 5 seems to change: For the D200 it indicates "Auto ISO" - PH + Notes => 'for the D70, Bit 5 = Unused LE-NR Slowdown', + # credit to Tom Christiansen (ref 7) for figuring this out... + # The (new?) bit 5 seriously complicates our life here: after firmwareB's + # 1.03, bit 5 turns on when you ask for BUT DO NOT USE the long-range + # noise reduction feature, probably because even not using it, it still + # slows down your drive operation to 50% (1.5fps max not 3fps). But no + # longer does !$val alone indicate single-frame operation. - TC, D70 + # The following comments are from Warren Hatch: + # Bits 4,6,8 indicate bracketing mode. + # - all 0's => Bracketing Off + # - bit 4 on with bits 6,8 off => Exposure Bracketing On + # - bits 4,6 on => WB bracketing On + # - 4,8 on => ADL Bracketing On + # Bit 2 gives tethered status: Off=>Not Tethered; On=Tethered. + # - that this simply indicates a camera is connected via a cord to a PC + # (doesn't necessarily mean that the shutter was tripped by the computer) + # Bits 0,1,3,7,9 relate to how the shutter is tripped in concert with the + # Release Mode dial [although I cannot cause bit 7 to flip with any of my gear and + # I suspect it is no longer used for the D500]. Regardless, the ReleaseMode tag + # offers a superior decoding of this information for the D4s, D810 and D500. + # Bit 5 indicates whether or not AutoISO is enabled. + PrintConv => q[ + $_ = ''; + unless ($val & 0x87) { + return 'Single-Frame' unless $val; + $_ = 'Single-Frame, '; + } + return $_ . Image::ExifTool::DecodeBits($val, + { + 0 => 'Continuous', + 1 => 'Delay', + 2 => 'PC Control', + 3 => 'Self-timer', #forum6281 (NC) + 4 => 'Exposure Bracketing', + 5 => $$self{Model}=~/D70\b/ ? 'Unused LE-NR Slowdown' : 'Auto ISO', + 6 => 'White-Balance Bracketing', + 7 => 'IR Control', + 8 => 'D-Lighting Bracketing', #forum6281 (NC) + }); + ], + }, + # 0x008a - called "AutoBracketRelease" by ref 15 [but this seems wrong] + # values: 0,255 (when writing NEF only), or 1,2 (when writing JPEG or JPEG+NEF) + # --> makes odd, repeating pattern in sequential NEF images (ref 28) + 0x008b => { #8 + Name => 'LensFStops', + ValueConv => 'my ($a,$b,$c)=unpack("C3",$val); $c ? $a*($b/$c) : 0', + ValueConvInv => 'my $a=int($val*12+0.5);$a<256 ? pack("C4",$a,1,12,0) : undef', + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + Writable => 'undef', + Count => 4, + }, + 0x008c => { + Name => 'ContrastCurve', #JD + Writable => 'undef', + Flags => [ 'Binary', 'Protected', 'Drop' ], # (drop because not found in Nikon JPEG's) + }, + # ColorHue: MODE1/MODE1a=sRGB, MODE2=Adobe RGB, MODE3a=more saturated sRGB + # --> should really be called ColorSpace or ColorMode, but that would conflict with other tags + 0x008d => { Name => 'ColorHue' , Writable => 'string' }, #2 + # SceneMode takes on the following values: PORTRAIT, PARTY/INDOOR, NIGHT PORTRAIT, + # BEACH/SNOW, LANDSCAPE, SUNSET, NIGHT SCENE, MUSEUM, FIREWORKS, CLOSE UP, COPY, + # BACK LIGHT, PANORAMA ASSIST, SPORT, DAWN/DUSK + 0x008f => { Name => 'SceneMode', Writable => 'string' }, #2 + # LightSource shows 3 values COLORED SPEEDLIGHT NATURAL. + # (SPEEDLIGHT when flash goes. Have no idea about difference between other two.) + 0x0090 => { Name => 'LightSource', Writable => 'string' }, #2 + 0x0091 => [ #18 + { #PH + Condition => '$$valPt =~ /^0209/', + Name => 'ShotInfoD40', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD40', + DecryptStart => 4, + DecryptLen => 748, + ByteOrder => 'BigEndian', + }, + }, + { + Condition => '$$valPt =~ /^0208/', + Name => 'ShotInfoD80', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD80', + DecryptStart => 4, + DecryptLen => 765, + # (Capture NX can change the makernote byte order, but this stays big-endian) + ByteOrder => 'BigEndian', + }, + }, + { #PH (D90, firmware 1.00) + Condition => '$$valPt =~ /^0213/', + Name => 'ShotInfoD90', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD90', + DecryptStart => 4, + DecryptLen => 0x398, + ByteOrder => 'BigEndian', + }, + }, + { #PH (D3, firmware 0.37 and 1.00) + Condition => '$$valPt =~ /^0210/ and $count == 5399', + Name => 'ShotInfoD3a', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD3a', + DecryptStart => 4, + DecryptLen => 0x318, + ByteOrder => 'BigEndian', + }, + }, + { #PH (D3, firmware 1.10, 2.00 and 2.01 [count 5408], and 2.02 [count 5412]) + Condition => '$$valPt =~ /^0210/ and ($count == 5408 or $count == 5412)', + Name => 'ShotInfoD3b', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD3b', + DecryptStart => 4, + DecryptLen => 0x321, + ByteOrder => 'BigEndian', + }, + }, + { #PH (D3X, firmware 1.00) + Condition => '$$valPt =~ /^0214/ and $count == 5409', + Name => 'ShotInfoD3X', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD3X', + DecryptStart => 4, + DecryptLen => 0x323, + ByteOrder => 'BigEndian', + }, + }, + { #PH (D3S, firmware 0.16 and 1.00) + Condition => '$$valPt =~ /^0218/ and ($count == 5356 or $count == 5388)', + Name => 'ShotInfoD3S', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD3S', + DecryptStart => 4, + DecryptLen => 0x2e9, + ByteOrder => 'BigEndian', + }, + }, + { #JD (D300, firmware 0.25 and 1.00) + # D3 and D300 use the same version number, but the length is different + Condition => '$$valPt =~ /^0210/ and $count == 5291', + Name => 'ShotInfoD300a', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD300a', + DecryptStart => 4, + DecryptLen => 813, + ByteOrder => 'BigEndian', + }, + }, + { #PH (D300, firmware version 1.10) + # yet again the same ShotInfoVersion for different data + Condition => '$$valPt =~ /^0210/ and $count == 5303', + Name => 'ShotInfoD300b', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD300b', + DecryptStart => 4, + DecryptLen => 825, + ByteOrder => 'BigEndian', + }, + }, + { #PH (D300S, firmware version 1.00) + # yet again the same ShotInfoVersion for different data + Condition => '$$valPt =~ /^0216/ and $count == 5311', + Name => 'ShotInfoD300S', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD300S', + DecryptStart => 4, + DecryptLen => 827, + ByteOrder => 'BigEndian', + }, + }, + # 0225 - D600 + { #29 (D700 firmware version 1.02f) + Condition => '$$valPt =~ /^0212/ and $count == 5312', + Name => 'ShotInfoD700', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD700', + DecryptStart => 4, + DecryptLen => 0x358, + ByteOrder => 'BigEndian', + }, + }, + { #PH (D800 firmware 1.01a) + Condition => '$$valPt =~ /^0222/', + Name => 'ShotInfoD800', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD800', + DecryptStart => 4, + DecryptLen => 0x720, + ByteOrder => 'BigEndian', + }, + }, + { #28 (D810 firmware 1.01) + Condition => '$$valPt =~ /^0233/', + Name => 'ShotInfoD810', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD810', + DecryptStart => 4, + DecryptLen => 0x36f4 + 12, + DecryptMore => 'Get32u(\$data, 0x84) + 12', + ByteOrder => 'LittleEndian', + }, + }, + { #28 (D850 firmware 1.00b) + Condition => '$$valPt =~ /^0243/', + Name => 'ShotInfoD850', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD850', + DecryptStart => 4, + DecryptLen => 0x2efb + 12, + DecryptMore => 'Get32u(\$data, 0xa0) + 12', + ByteOrder => 'LittleEndian', + }, + }, + # 0217 - D3000 + # 0219 - D3100 + # 0224 - D3200 + { #PH + Condition => '$$valPt =~ /^0215/ and $count == 6745', + Name => 'ShotInfoD5000', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD5000', + DecryptStart => 4, + DecryptLen => 0x39a, + ByteOrder => 'BigEndian', + }, + }, + { #PH + Condition => '$$valPt =~ /^0221/ and $count == 8902', + Name => 'ShotInfoD5100', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD5100', + DecryptStart => 4, + DecryptLen => 0x430, + ByteOrder => 'BigEndian', + }, + }, + { #PH + Condition => '$$valPt =~ /^0226/ and $count == 11587', + Name => 'ShotInfoD5200', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD5200', + DecryptStart => 4, + DecryptLen => 0xd00, + ByteOrder => 'BigEndian', + }, + }, + { #29 (D7000 firmware version 1.01b) + Condition => '$$valPt =~ /^0220/', + Name => 'ShotInfoD7000', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD7000', + DecryptStart => 4, + DecryptLen => 0x448, + ByteOrder => 'BigEndian', + }, + }, + { # (D4 firmware version 1.00g) + Condition => '$$valPt =~ /^0223/', + Name => 'ShotInfoD4', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD4', + DecryptStart => 4, + DecryptLen => 0x789, + ByteOrder => 'BigEndian', + }, + }, + { # (D4S firmware version 1.00d and 1.01a) + Condition => '$$valPt =~ /^0231/', + Name => 'ShotInfoD4S', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD4S', + DecryptStart => 4, + DecryptLen => 0x3697, + ByteOrder => 'LittleEndian', + }, + }, + { #28 (D5 firmware version 1.10a) + Condition => '$$valPt =~ /^0238/', + Name => 'ShotInfoD5', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD500', + DecryptStart => 4, + DecryptLen => 0x2c24 + 12, + DecryptMore => 'Get32u(\$data, 0xa8) + 0x2ea5 - 0x2c90', + ByteOrder => 'LittleEndian', + }, + }, + { # (D500 firmware version 1.00) + Condition => '$$valPt =~ /^0239/', + Name => 'ShotInfoD500', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD500', + DecryptStart => 4, + DecryptLen => 0x2cb2 + 4, + DecryptMore => 'Get32u(\$data, 0xa8) + 0x2ea5 - 0x2c90', + ByteOrder => 'LittleEndian', + }, + }, + { # (D6 firmware version 1.00, ref 28) + Condition => '$$valPt =~ /^0246/', + Name => 'ShotInfoD6', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD6', + DecryptStart => 4, + DecryptLen => 0xc292 + 720, # thru decoded parts of Offset 32 + ByteOrder => 'LittleEndian', + }, + }, + { # (D610 firmware version 1.00) + Condition => '$$valPt =~ /^0232/', + Name => 'ShotInfoD610', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoD610', + DecryptStart => 4, + DecryptLen => 0x7ff, + ByteOrder => 'BigEndian', + }, + }, + { # (Z6_2 firmware version 1.00 and Z7II firmware versions 1.00 & 1.01, ref 28) + # 0800=Z6/Z7 0801=Z50 0802=Z5 0803=Z6II/Z7II 0804=Zfc + Condition => '$$valPt =~ /^080[01234]/', + Name => 'ShotInfoZ7II', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoZ7II', + DecryptStart => 4, + # TODO: eventually set the length dynamically according to actual offsets! + DecryptLen => 0xd04e + 860, # thru decoded MenuSettingsZ7II + ByteOrder => 'LittleEndian', + }, + }, + { # (Z9 firmware version 1.00 ref 28) + Condition => '$$valPt =~ /^0805/', + Name => 'ShotInfoZ9', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9', + DecryptStart => 4, + # TODO: eventually set the length dynamically according to actual offsets! + DecryptLen => 0xec4b + 1907, # decoded thru end of Offset26 + ByteOrder => 'LittleEndian', + }, + }, + { # D7100=0227 + Condition => '$$valPt =~ /^0[28]/', + Name => 'ShotInfo02xx', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfo', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + DecryptLen => 0x251, + ByteOrder => 'BigEndian', + }, + }, + { + Name => 'ShotInfoUnknown', + Writable => 0, + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ShotInfo', + ByteOrder => 'BigEndian', + }, + }, + ], + 0x0092 => { #2 + Name => 'HueAdjustment', + Writable => 'int16s', + }, + # 0x0093 - ref 15 calls this Saturation, but this is wrong - PH + 0x0093 => { #21 + Name => 'NEFCompression', + Writable => 'int16u', + SeparateTable => 'NEFCompression', + PrintConv => \%nefCompression, + }, + 0x0094 => { Name => 'SaturationAdj', Writable => 'int16s' }, + 0x0095 => { Name => 'NoiseReduction', Writable => 'string' }, # ("Off" or "FPNR"=long exposure NR) + 0x0096 => { + Name => 'NEFLinearizationTable', # same table as DNG LinearizationTable (ref JD) + Writable => 'undef', + Flags => [ 'Binary', 'Protected' ], + }, + 0x0097 => [ #4 + # (NOTE: these are byte-swapped by NX when byte order changes) + { + Condition => '$$valPt =~ /^0100/', # (D100 and Coolpix models) + Name => 'ColorBalance0100', + SubDirectory => { + Start => '$valuePtr + 72', + TagTable => 'Image::ExifTool::Nikon::ColorBalance1', + }, + }, + { + Condition => '$$valPt =~ /^0102/', # (D2H) + Name => 'ColorBalance0102', + SubDirectory => { + Start => '$valuePtr + 10', + TagTable => 'Image::ExifTool::Nikon::ColorBalance2', + }, + }, + { + Condition => '$$valPt =~ /^0103/', # (D70/D70s) + Name => 'ColorBalance0103', + # D70: at file offset 'tag-value + base + 20', 4 16 bits numbers, + # v[0]/v[1] , v[2]/v[3] are the red/blue multipliers. + SubDirectory => { + Start => '$valuePtr + 20', + TagTable => 'Image::ExifTool::Nikon::ColorBalance3', + }, + }, + { + Condition => '$$valPt =~ /^0205/', # (D50) + Name => 'ColorBalance0205', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ColorBalance2', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + DecryptLen => 22, # 284 bytes encrypted, but don't need to decrypt it all + DirOffset => 14, + }, + }, + { # (D3/D3X/D300/D700=0209,D300S=0212,D3S=0214) + Condition => '$$valPt =~ /^02(09|12|14)/', + Name => 'ColorBalance0209', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ColorBalance4', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 284, + DecryptLen => 18, # 324 bytes encrypted, but don't need to decrypt it all + DirOffset => 10, + }, + }, + { # (D2X/D2Xs=0204,D2Hs=0206,D200=0207,D40/D40X/D80=0208,D60=0210) + Condition => '$$valPt =~ /^02(\d{2})/ and $1 < 11', + Name => 'ColorBalance02', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ColorBalance2', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 284, + DecryptLen => 14, # don't need to decrypt it all + DirOffset => 6, + }, + }, + { + Condition => '$$valPt =~ /^0211/', # (D90/D5000) + Name => 'ColorBalance0211', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ColorBalance4', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 284, + DecryptLen => 24, # don't need to decrypt it all + DirOffset => 16, + }, + }, + { + Condition => '$$valPt =~ /^0213/', # (D3000) + Name => 'ColorBalance0213', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ColorBalance2', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 284, + DecryptLen => 18, # don't need to decrypt it all + DirOffset => 10, + }, + }, + { # (D3100=0215,D7000/D5100=0216,D4/D600/D800/D800E/D3200=0217) + Condition => '$$valPt =~ /^021[567]/', + Name => 'ColorBalance0215', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ColorBalance4', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 284, + DecryptLen => 12, # don't need to decrypt it all + DirOffset => 4, + }, + }, + { # (D5200/D7100=0218, D5300=0219, D610/Df=0220, D3300=0221, CoolpixA=0601) + Name => 'ColorBalanceUnknown02', + Condition => '$$valPt =~ /^0[26]/', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ColorBalanceUnknown', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 284, + DecryptLen => 10, # (arbitrary) + }, + }, + { # (1J1/1J2/1V1=0400, 1V2=0401, 1J3/1S1=0402, 1AW1=0403, Z6/Z7=0800) + Name => 'ColorBalanceUnknown04', + Condition => '$$valPt =~ /^0[48]/', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ColorBalanceUnknown', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + DecryptLen => 10, # (arbitrary) + }, + }, + { + # (CoolpixP7700/P7800=0500, CoolpixP330/P520=0502) + Name => 'ColorBalanceUnknown', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::ColorBalanceUnknown' }, + }, + ], + 0x0098 => [ + { #8 + Condition => '$$valPt =~ /^0100/', # D100, D1X - PH + Name => 'LensData0100', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LensData00' }, + }, + { #8 + Condition => '$$valPt =~ /^0101/', # D70, D70s - PH + Name => 'LensData0101', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LensData01' }, + }, + # note: this information is encrypted if the version is 02xx + { #8 + # 0201 - D200, D2Hs, D2X and D2Xs + # 0202 - D40, D40X and D80 + # 0203 - D300 + Condition => '$$valPt =~ /^020[1-3]/', + Name => 'LensData0201', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensData01', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + }, + }, + { #PH + Condition => '$$valPt =~ /^0204/', # D90, D7000 + Name => 'LensData0204', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensData0204', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + }, + }, + { + Condition => '$$valPt =~ /^040[01]/', # 0=1J1/1V1, 1=1J2 + Name => 'LensData0400', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensData0400', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + }, + }, + { + Condition => '$$valPt =~ /^0402/', # 1J3/1S1/1V2 + Name => 'LensData0402', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensData0402', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + }, + }, + { + Condition => '$$valPt =~ /^0403/', # 1J4,1J5 + Name => 'LensData0403', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensData0403', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + }, + }, + { + Condition => '$$valPt =~ /^080[012]/', # Z6/Z7/Z9 + Name => 'LensData0800', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensData0800', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'LensDataUnknown', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensDataUnknown', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + }, + }, + ], + 0x0099 => { #2/15 + Name => 'RawImageCenter', + Writable => 'int16u', + Count => 2, + }, + 0x009a => { #10 + Name => 'SensorPixelSize', + Writable => 'rational64u', + Count => 2, + PrintConv => '$val=~s/ / x /;"$val um"', + PrintConvInv => '$val=~tr/a-zA-Z/ /;$val', + }, + 0x009c => { #14 + # L2/L3 has these modes (from owner's manual): - PH + # Portrait Assist: FACE-PRIORITY AF,PORTRAIT,PORTRAIT LEFT,PORTRAIT RIGHT, + # PORTRAIT CLOSE-UP,PORTRAIT COUPLE,PORTRAIT-FIGURE + # Landscape Assist:LANDSCAPE,SCENIC VIEW,ARCHITECTURE,GROUP RIGHT,GROUP LEFT + # Sports Assist: SPORTS,SPORT SPECTATOR,SPORT COMPOSITE + # P7100 has test modes: - PH + # CREATIVE MONOCHROME,PAINTING,CROSS PROCESS,SOFT,NOSTALGIC SEPIA, + # HIGH KEY,LOW KEY,SELECTIVE COLOR,ZOOM EXPOSURE EXP.,DEFOCUS DURING + Name => 'SceneAssist', + Writable => 'string', + }, + 0x009d => { #NealKrawetz + Name => 'DateStampMode', + Writable => 'int16u', + Notes => 'feature to imprint date/time on image', + PrintConv => { #PH + 0 => 'Off', + 1 => 'Date & Time', + 2 => 'Date', + 3 => 'Date Counter', # (NC) (D3500) + }, + }, + 0x009e => { #JD + Name => 'RetouchHistory', + Writable => 'int16u', + Count => 10, + # trim off extra "None" values + ValueConv => '$val=~s/( 0)+$//; $val', + ValueConvInv => 'my $n=($val=~/ \d+/g);$n < 9 ? $val . " 0" x (9-$n) : $val', + PrintConvColumns => 2, + PrintConv => [ + \%retouchValues, + \%retouchValues, + \%retouchValues, + \%retouchValues, + \%retouchValues, + \%retouchValues, + \%retouchValues, + \%retouchValues, + \%retouchValues, + \%retouchValues, + ], + }, + 0x00a0 => { Name => 'SerialNumber', Writable => 'string' }, #2 + 0x00a2 => { # size of compressed image data plus EOI segment (ref 10) + Name => 'ImageDataSize', + Writable => 'int32u', + }, + # 0x00a3 - int8u: 0 (All DSLR's but D1,D1H,D1X,D100) + # 0x00a4 - version number found only in NEF images from DSLR models except the + # D1,D1X,D2H and D100. Value is "0200" for all available samples except images + # edited by Nikon Capture Editor 4.3.1 W and 4.4.2 which have "0100" - PH + 0x00a5 => { #15 + Name => 'ImageCount', + Writable => 'int32u', + }, + 0x00a6 => { #15 + Name => 'DeletedImageCount', + Writable => 'int32u', + }, + # the sum of 0xa5 and 0xa6 is equal to 0xa7 ShutterCount (D2X,D2Hs,D2H,D200, ref 10) + 0x00a7 => { # Number of shots taken by camera so far (ref 2) + Name => 'ShutterCount', + Writable => 'int32u', + Protected => 1, + PrintConv => '$val == 4294965247 ? "n/a" : $val', + PrintConvInv => '$val eq "n/a" ? 4294965247 : $val', + Notes => q{ + includes both mechanical and electronic shutter activations for models with + this feature. This value is used as a key to decrypt other information, and + writing this tag causes the other information to be re-encrypted with the + new key + }, + }, + 0x00a8 => [#JD + { + Name => 'FlashInfo0100', + Condition => '$$valPt =~ /^010[01]/', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0100' }, + }, + { + Name => 'FlashInfo0102', + Condition => '$$valPt =~ /^0102/', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0102' }, + }, + { + Name => 'FlashInfo0103', + # (0104 for D7000, 0105 for D800) + Condition => '$$valPt =~ /^010[345]/', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0103' }, + }, + { + Name => 'FlashInfo0106', # (Df, D610, D3300, D5300, D7100, Coolpix A) + Condition => '$$valPt =~ /^0106/', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0106' }, + }, + { + Name => 'FlashInfo0107', # (0107 for D4S/D750/D810/D5500/D7200, 0108 for D5/D500/D3400) + Condition => '$$valPt =~ /^010[78]/', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0107' }, + }, + { + Name => 'FlashInfo0300', # (Z7II) + Condition => '$$valPt =~ /^030[01]/', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0300' }, + }, + { + Name => 'FlashInfoUnknown', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfoUnknown' }, + }, + ], + 0x00a9 => { Name => 'ImageOptimization',Writable => 'string' },#2 + 0x00aa => { Name => 'Saturation', Writable => 'string' }, #2 + 0x00ab => { Name => 'VariProgram', Writable => 'string' }, #2 (scene mode for DSLR's - PH) + 0x00ac => { Name => 'ImageStabilization',Writable=> 'string' }, #14 + 0x00ad => { Name => 'AFResponse', Writable => 'string' }, #14 + 0x00b0 => [{ #PH + Name => 'MultiExposure', + Condition => '$$valPt =~ /^0100/', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::MultiExposure', + # Note: this endianness varies with model, but Nikon software may change + # metadata endianness (although it is unknown how it affects this record), + # so for now don't specify ByteOrder although it may be wrong if the + # file is rewritten by Nikon software --> see comments for FileInfo + }, + },{ + Name => 'MultiExposure', + Condition => '$$valPt =~ /^0101/', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::MultiExposure', + ByteOrder => 'LittleEndian', + }, + }], + 0x00b1 => { #14/PH/JD (D80) + Name => 'HighISONoiseReduction', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Minimal', # for high ISO (>800) when setting is "Off" + 2 => 'Low', # Low,Normal,High take effect for ISO > 400 + 3 => 'Medium Low', + 4 => 'Normal', + 5 => 'Medium High', + 6 => 'High', + }, + }, + # 0x00b2 (string: "NORMAL ", 0xc3's, 0xff's or 0x20's) + 0x00b3 => { #14 + Name => 'ToningEffect', + Writable => 'string', + }, + 0x00b6 => { #PH + Name => 'PowerUpTime', + Groups => { 2 => 'Time' }, + Shift => 'Time', + # not clear whether "powered up" means "turned on" or "power applied" - PH + Notes => 'date/time when camera was last powered up', + Writable => 'undef', + # must use RawConv so byte order is correct + RawConv => sub { + my $val = shift; + return $val if length $val < 7; + my $shrt = GetByteOrder() eq 'II' ? 'v' : 'n'; + my @date = unpack("${shrt}C5", $val); + return sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @date); + }, + RawConvInv => sub { + my $val = shift; + my $shrt = GetByteOrder() eq 'II' ? 'v' : 'n'; + my @date = ($val =~ /\d+/g); + return pack("${shrt}C6", @date, 0); + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,0)', + }, + 0x00b7 => [{ + Name => 'AFInfo2', + Condition => '$$self{Model} =~ /^NIKON Z 9\b/i', #AFInfo2Version 0400 + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AFInfo2V0400' }, + },{ #JD + Name => 'AFInfo2', + # (this structure may be byte swapped when rewritten by CaptureNX) + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AFInfo2' }, + }], + 0x00b8 => [{ #PH + Name => 'FileInfo', + # unfortunately, some newer models write this as little-endian + # (and CaptureNX can change the byte order of the maker notes, + # but leaves this structure unchanged) + # - it will be an ongoing pain to keep this list of models up-to-date, + # so if only one ordering yields valid DirectoryNumber and FileNumber values, + # use it, otherwise default to a-priori knowledge of the camera model + # (assume that a valid DirectoryNumber is 100-999, and a valid FileNumber + # is 0000-9999, although I have some samples with a DirectoryNumber of 99) + Condition => q{ + if (length($$valPt) >= 0) { + my ($dir, $file) = unpack('x6vv', $$valPt); + my $littleEndian = ($dir >= 100 and $dir <= 999 and $file <= 9999); + ($dir, $file) = unpack('x6nn', $$valPt); + my $bigEndian = ($dir >= 100 and $dir <= 999 and $file <= 9999); + return $littleEndian if $littleEndian xor $bigEndian; + } + return $$self{Model} =~ /^NIKON (D4S|D750|D810|D3300|D5200|D5300|D5500|D7100)$/; + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::FileInfo', + ByteOrder => 'LittleEndian', + }, + },{ + Name => 'FileInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::FileInfo', + ByteOrder => 'BigEndian', + }, + }], + 0x00b9 => { #28 + Name => 'AFTune', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AFTune' }, + }, + # 0x00ba - custom curve data? (ref 28?) (only in NEF images) + 0x00bb => { #forum6281 + Name => 'RetouchInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::RetouchInfo' }, + }, + # 0x00bc - NEFThumbnail? (forum6281) + 0x00bd => { #PH (P6000) + Name => 'PictureControlData', + Writable => 'undef', + Permanent => 0, + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControl' }, + }, + 0x00bf => { + Name => 'SilentPhotography', + PrintConv => \%offOn, + }, + 0x00c3 => { + Name => 'BarometerInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::BarometerInfo', + # (little-endian in II EXIF, big-endian in MOV) + }, + }, + 0x0e00 => { + Name => 'PrintIM', + Description => 'Print Image Matching', + Writable => 0, + SubDirectory => { + TagTable => 'Image::ExifTool::PrintIM::Main', + }, + }, + # 0x0e01 - In D70 NEF files produced by Nikon Capture, the data for this tag extends 4 bytes + # past the end of the maker notes. Very odd. I hope these 4 bytes aren't useful because + # they will get lost by any utility that blindly copies the maker notes (not ExifTool) - PH + 0x0e01 => { + Name => 'NikonCaptureData', + Writable => 'undef', + Permanent => 0, + # (Drop because may be too large for JPEG images) + Flags => [ 'Binary', 'Protected', 'Drop' ], + Notes => q{ + this data is dropped when copying Nikon MakerNotes since it may be too large + to fit in the EXIF segment of a JPEG image, but it may be copied as a block + into existing Nikon MakerNotes later if desired + }, + SubDirectory => { + DirName => 'NikonCapture', + TagTable => 'Image::ExifTool::NikonCapture::Main', + }, + }, + # 0x0e05 written by Nikon Capture to NEF files, values of 1 and 2 - PH + 0x0e09 => { #12 + Name => 'NikonCaptureVersion', + Writable => 'string', + Permanent => 0, + PrintConv => undef, # (avoid applying default print conversion to string) + }, + # 0x0e0e is in D70 Nikon Capture files (not out-of-the-camera D70 files) - PH + 0x0e0e => { #PH + Name => 'NikonCaptureOffsets', + Writable => 'undef', + Permanent => 0, + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::CaptureOffsets', + Validate => '$val =~ /^0100/', + Start => '$valuePtr + 4', + }, + }, + 0x0e10 => { #17 + Name => 'NikonScanIFD', + Groups => { 1 => 'NikonScan', 2 => 'Image' }, + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::Scan', + Start => '$val', + }, + }, + 0x0e13 => [{ # PH/https://exiftool.org/forum/index.php/topic,2737.0.html + Name => 'NikonCaptureEditVersions', + Condition => '$self->Options("ExtractEmbedded")', + Notes => q{ + the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> option may be used to decode settings from the stored + edit versions, otherwise this is extracted as a binary data block + }, + Writable => 'undef', + Permanent => 0, + Drop => 1, # (may be too large for JPEG images) + SubDirectory => { + DirName => 'NikonCaptureEditVersions', + TagTable => 'Image::ExifTool::NikonCapture::Main', + ProcessProc => \&ProcessNikonCaptureEditVersions, + WriteProc => sub { return undef }, # (writing not yet supported) + }, + },{ + Name => 'NikonCaptureEditVersions', + Writable => 'undef', + Permanent => 0, + Flags => [ 'Binary', 'Protected', 'Drop' ], + }], + 0x0e1d => { #JD + Name => 'NikonICCProfile', + Flags => [ 'Binary', 'Protected' ], + Writable => 'undef', # must be defined here so tag will be extracted if specified + WriteCheck => q{ + require Image::ExifTool::ICC_Profile; + return Image::ExifTool::ICC_Profile::ValidateICC(\$val); + }, + SubDirectory => { + DirName => 'NikonICCProfile', + TagTable => 'Image::ExifTool::ICC_Profile::Main', + }, + }, + 0x0e1e => { #PH + Name => 'NikonCaptureOutput', + Writable => 'undef', + Permanent => 0, + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::CaptureOutput', + Validate => '$val =~ /^0100/', + }, + }, + 0x0e22 => { #28 + Name => 'NEFBitDepth', + Writable => 'int16u', + Count => 4, + Protected => 1, + PrintConv => { + '0 0 0 0' => 'n/a (JPEG)', + '8 8 8 0' => '8 x 3', # TIFF RGB + '16 16 16 0' => '16 x 3', # TIFF 16-bit RGB + '12 0 0 0' => 12, + '14 0 0 0' => 14, + }, + }, +); + +# NikonScan IFD entries (ref 17) +%Image::ExifTool::Nikon::Scan = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITE_GROUP => 'NikonScan', + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 1 => 'NikonScan', 2 => 'Image' }, + VARS => { MINOR_ERRORS => 1 }, # this IFD is non-essential and often corrupted + NOTES => 'This information is written by the Nikon Scan software.', + 0x02 => { Name => 'FilmType', Writable => 'string', }, + 0x40 => { Name => 'MultiSample', Writable => 'string' }, + 0x41 => { Name => 'BitDepth', Writable => 'int16u' }, + 0x50 => { + Name => 'MasterGain', + Writable => 'rational64s', + PrintConv => 'sprintf("%.2f",$val)', + PrintConvInv => '$val', + }, + 0x51 => { + Name => 'ColorGain', + Writable => 'rational64s', + Count => 3, + PrintConv => 'sprintf("%.2f %.2f %.2f",split(" ",$val))', + PrintConvInv => '$val', + }, + 0x60 => { + Name => 'ScanImageEnhancer', + Writable => 'int32u', + PrintConv => \%offOn, + }, + 0x100 => { Name => 'DigitalICE', Writable => 'string' }, + 0x110 => { + Name => 'ROCInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::ROC' }, + }, + 0x120 => { + Name => 'GEMInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::GEM' }, + }, + 0x200 => { Name => 'DigitalDEEShadowAdj', Writable => 'int32u' }, + 0x201 => { Name => 'DigitalDEEThreshold', Writable => 'int32u' }, + 0x202 => { Name => 'DigitalDEEHighlightAdj',Writable => 'int32u' }, +); + +# ref 17 +%Image::ExifTool::Nikon::ROC = ( + %binaryDataAttrs, + FORMAT => 'int32u', + GROUPS => { 0 => 'MakerNotes', 1 => 'NikonScan', 2 => 'Image' }, + 0 => { + Name => 'DigitalROC', + ValueConv => '$val / 10', + ValueConvInv => 'int($val * 10)', + }, +); + +# ref 17 +%Image::ExifTool::Nikon::GEM = ( + %binaryDataAttrs, + FORMAT => 'int32u', + GROUPS => { 0 => 'MakerNotes', 1 => 'NikonScan', 2 => 'Image' }, + 0 => { + Name => 'DigitalGEM', + ValueConv => '$val<95 ? $val/20-1 : 4', + ValueConvInv => '$val == 4 ? 95 : int(($val + 1) * 20)', + }, +); + +# Vibration Reduction information - PH (D300) +%Image::ExifTool::Nikon::VRInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'VRInfoVersion', + Format => 'undef[4]', + Writable => 0, + }, + 4 => { + Name => 'VibrationReduction', + PrintConv => { + 0 => 'n/a', # (1V1 with a non-VR lens) + 1 => 'On', + 2 => 'Off', + }, + }, + # 5 - values: 0, 1 (VR On), 2 (VR Off) + 6 => [{ + Name => 'VRMode', + PrintConv => { + 0 => 'Off', + 1 => 'Sport', + 3 => 'Normal', + }, + %infoZSeries + },{ + Name => 'VRMode', + PrintConv => { + 0 => 'Normal', + 1 => 'On (1)', #PH (NC) + 2 => 'Active', # (1J1) + 3 => 'Sport', #PH (Z7) + }, + }], + # 7 - values: 0, 1 +); + +# Face detection information - PH (S8100) +%Image::ExifTool::Nikon::FaceDetect = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + FORMAT => 'int16u', + DATAMEMBER => [ 0x03 ], + 0x01 => { + Name => 'FaceDetectFrameSize', + Format => 'int16u[2]', + }, + 0x03 => { + Name => 'FacesDetected', + DataMember => 'FacesDetected', + RawConv => '$$self{FacesDetected} = $val', + }, + 0x04 => { + Name => 'Face1Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 1 ? undef : $val', + Notes => q{ + top, left, width and height of face detect area in coordinates of + FaceDetectFrameSize + }, + }, + 0x08 => { + Name => 'Face2Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 2 ? undef : $val', + }, + 0x0c => { + Name => 'Face3Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 3 ? undef : $val', + }, + 0x10 => { + Name => 'Face4Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 4 ? undef : $val', + }, + 0x14 => { + Name => 'Face5Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 5 ? undef : $val', + }, + 0x18 => { + Name => 'Face6Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 6 ? undef : $val', + }, + 0x1c => { + Name => 'Face7Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 7 ? undef : $val', + }, + 0x20 => { + Name => 'Face8Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 8 ? undef : $val', + }, + 0x24 => { + Name => 'Face9Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 9 ? undef : $val', + }, + 0x28 => { + Name => 'Face10Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 10 ? undef : $val', + }, + 0x2c => { + Name => 'Face11Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 11 ? undef : $val', + }, + 0x30 => { + Name => 'Face12Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 12 ? undef : $val', + }, +); + +# Picture Control information - PH (D300,P6000) +%Image::ExifTool::Nikon::PictureControl = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'PictureControlVersion', + Format => 'undef[4]', + Writable => 0, + }, + 4 => { + Name => 'PictureControlName', + Format => 'string[20]', + # make lower case with a leading capital for each word + PrintConv => \&FormatString, + PrintConvInv => 'uc($val)', + }, + 24 => { + Name => 'PictureControlBase', + Format => 'string[20]', + PrintConv => \&FormatString, + PrintConvInv => 'uc($val)', + }, + # beginning at byte 44, there is some interesting information. + # here are the observed bytes for each PictureControlMode: + # 44 45 46 47 48 49 50 51 52 53 54 55 56 57 + # STANDARD 00 01 00 00 00 80 83 80 80 80 80 ff ff ff + # NEUTRAL 03 c2 00 00 00 ff 82 80 80 80 80 ff ff ff + # VIVID 00 c3 00 00 00 80 84 80 80 80 80 ff ff ff + # MONOCHROME 06 4d 00 01 02 ff 82 80 80 ff ff 80 80 ff + # Neutral2 03 c2 01 00 02 ff 80 7f 81 00 7f ff ff ff (custom) + # (note that up to 9 different custom picture controls can be stored) + # --> bytes 44 and 45 are swapped if CaptureNX changes the byte order + # + 48 => { #21 + Name => 'PictureControlAdjust', + PrintConv => { + 0 => 'Default Settings', + 1 => 'Quick Adjust', + 2 => 'Full Control', + }, + }, + 49 => { + Name => 'PictureControlQuickAdjust', + # settings: -2 to +2 (n/a for Neutral and Monochrome modes) + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)', + }, + 50 => { + Name => 'Sharpness', + # settings: 0 to 9, Auto + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"No Sharpening","%d")', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)', + }, + 51 => { + Name => 'Contrast', + # settings: -3 to +3, Auto + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)', + }, + 52 => { + Name => 'Brightness', + # settings: -1 to +1 + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)', + }, + 53 => { + Name => 'Saturation', + # settings: -3 to +3, Auto (n/a for Monochrome mode) + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)', + }, + 54 => { + Name => 'HueAdjustment', + # settings: -3 to +3 (n/a for Monochrome mode) + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None")', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)', + }, + 55 => { + Name => 'FilterEffect', + # settings: Off,Yellow,Orange,Red,Green (n/a for color modes) + DelValue => 0xff, + PrintHex => 1, + PrintConv => { + 0x80 => 'Off', + 0x81 => 'Yellow', + 0x82 => 'Orange', + 0x83 => 'Red', + 0x84 => 'Green', + 0xff => 'n/a', + }, + }, + 56 => { + Name => 'ToningEffect', + # settings: B&W,Sepia,Cyanotype,Red,Yellow,Green,Blue-Green,Blue, + # Purple-Blue,Red-Purple (n/a for color modes) + DelValue => 0xff, + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => { + 0x80 => 'B&W', + 0x81 => 'Sepia', + 0x82 => 'Cyanotype', + 0x83 => 'Red', + 0x84 => 'Yellow', + 0x85 => 'Green', + 0x86 => 'Blue-green', + 0x87 => 'Blue', + 0x88 => 'Purple-blue', + 0x89 => 'Red-purple', + 0xff => 'n/a', + # 0x04 - seen for D810 (PH) + }, + }, + 57 => { #21 + Name => 'ToningSaturation', + # settings: B&W,Sepia,Cyanotype,Red,Yellow,Green,Blue-Green,Blue, + # Purple-Blue,Red-Purple (n/a unless ToningEffect is used) + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => '$val==0x7f ? "n/a" : $val', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)', + }, +); + +# Picture Control information V2 (ref 28) +%Image::ExifTool::Nikon::PictureControl2 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'PictureControlVersion', + Format => 'undef[4]', + Writable => 0, + }, + 4 => { + Name => 'PictureControlName', + Format => 'string[20]', + # make lower case with a leading capital for each word + PrintConv => \&FormatString, + PrintConvInv => 'uc($val)', + }, + 24 => { + Name => 'PictureControlBase', + Format => 'string[20]', + PrintConv => \&FormatString, + PrintConvInv => 'uc($val)', + }, + # beginning at byte 44, there is some interesting information. + # here are the observed bytes for each PictureControlMode: + # 44 45 46 47 48 49 50 51 52 53 54 55 56 57 + # STANDARD 00 01 00 00 00 80 83 80 80 80 80 ff ff ff + # NEUTRAL 03 c2 00 00 00 ff 82 80 80 80 80 ff ff ff + # VIVID 00 c3 00 00 00 80 84 80 80 80 80 ff ff ff + # MONOCHROME 06 4d 00 01 02 ff 82 80 80 ff ff 80 80 ff + # Neutral2 03 c2 01 00 02 ff 80 7f 81 00 7f ff ff ff (custom) + # (note that up to 9 different custom picture controls can be stored) + # --> bytes 44 and 45 are swapped if CaptureNX changes the byte order + # + 48 => { #21 + Name => 'PictureControlAdjust', + PrintConv => { + 0 => 'Default Settings', + 1 => 'Quick Adjust', + 2 => 'Full Control', + }, + }, + 49 => { + Name => 'PictureControlQuickAdjust', + # settings: -2 to +2 (n/a for Neutral and Monochrome modes) + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)', + }, + 51 => { + Name => 'Sharpness', + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None","%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val,4)', + }, + 53 => { + Name => 'Clarity', + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None","%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv2($val,4)', + }, + 55 => { + Name => 'Contrast', + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None","%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val,4)', + }, + 57 => { #21 + Name => 'Brightness', + # settings: -1 to +1 + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,undef,"%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val,4)', + }, + 59 => { + Name => 'Saturation', + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None","%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val,4)', + }, + 61 => { + Name => 'Hue', + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None","%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)', + }, + 63 => { + Name => 'FilterEffect', + # settings: Off,Yellow,Orange,Red,Green (n/a for color modes) + DelValue => 0xff, + PrintHex => 1, + PrintConv => { + 0x80 => 'Off', + 0x81 => 'Yellow', + 0x82 => 'Orange', + 0x83 => 'Red', + 0x84 => 'Green', + 0xff => 'n/a', + }, + }, + 64 => { + Name => 'ToningEffect', + # settings: B&W,Sepia,Cyanotype,Red,Yellow,Green,Blue-Green,Blue, + # Purple-Blue,Red-Purple (n/a for color modes) + DelValue => 0xff, + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => { + 0x80 => 'B&W', + 0x81 => 'Sepia', + 0x82 => 'Cyanotype', + 0x83 => 'Red', + 0x84 => 'Yellow', + 0x85 => 'Green', + 0x86 => 'Blue-green', + 0x87 => 'Blue', + 0x88 => 'Purple-blue', + 0x89 => 'Red-purple', + 0xff => 'n/a', + }, + }, + 65 => { + Name => 'ToningSaturation', + DelValue => 0xff, + ValueConv => '$val - 0x80', #$val == 0x7f (n/a) for "B&W" + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None","%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val,4)', + + }, +); + +# Picture Control information V3 (ref PH, Z7) +%Image::ExifTool::Nikon::PictureControl3 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'PictureControlVersion', + Format => 'undef[4]', + Writable => 0, + }, + 8 => { + Name => 'PictureControlName', + Format => 'string[20]', + # make lower case with a leading capital for each word + PrintConv => \&FormatString, + PrintConvInv => 'uc($val)', + }, + # 48 - looks like PictureControl2 byte 45 + 28 => { + Name => 'PictureControlBase', + Format => 'string[20]', + PrintConv => \&FormatString, + PrintConvInv => 'uc($val)', + }, + 54 => { # (NC) + Name => 'PictureControlAdjust', + PrintConv => { + 0 => 'Default Settings', + 1 => 'Quick Adjust', + 2 => 'Full Control', + }, + }, + 55 => { # (NC) + Name => 'PictureControlQuickAdjust', + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)', + }, + 57 => { + Name => 'Sharpness', + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None","%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val,4)', + }, + 59 => { + Name => 'MidRangeSharpness', + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None","%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val,4)', + }, + 61 => { + Name => 'Clarity', + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None","%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv2($val,4)', + }, + 63 => { + Name => 'Contrast', + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None","%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val,4)', + }, + 65 => { #21 + Name => 'Brightness', + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,undef,"%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val,4)', + }, + 67 => { + Name => 'Saturation', + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None","%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val,4)', + }, + 69 => { + Name => 'Hue', + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None","%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val)', + }, + 71 => { # (NC) + Name => 'FilterEffect', + DelValue => 0xff, + PrintHex => 1, + PrintConv => { + 0x80 => 'Off', + 0x81 => 'Yellow', + 0x82 => 'Orange', + 0x83 => 'Red', + 0x84 => 'Green', + 0xff => 'n/a', + }, + }, + 72 => { # (NC) + Name => 'ToningEffect', + DelValue => 0xff, + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => { + 0x80 => 'B&W', + 0x81 => 'Sepia', + 0x82 => 'Cyanotype', + 0x83 => 'Red', + 0x84 => 'Yellow', + 0x85 => 'Green', + 0x86 => 'Blue-green', + 0x87 => 'Blue', + 0x88 => 'Purple-blue', + 0x89 => 'Red-purple', + 0xff => 'n/a', + }, + }, + 73 => { # (NC) + Name => 'ToningSaturation', + DelValue => 0xff, + ValueConv => '$val - 0x80', + ValueConvInv => '$val + 0x80', + PrintConv => 'Image::ExifTool::Nikon::PrintPC($val,"None","%.2f",4)', + PrintConvInv => 'Image::ExifTool::Nikon::PrintPCInv($val,4)', + + }, +); + +# Unknown Picture Control information +%Image::ExifTool::Nikon::PictureControlUnknown = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'PictureControlVersion', + Format => 'undef[4]', + Writable => 0, + }, +); + +# World Time information - JD (D300) +%Image::ExifTool::Nikon::WorldTime = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Time' }, + 0 => { + Name => 'TimeZone', + Format => 'int16s', + PrintConv => q{ + my $sign = $val < 0 ? '-' : '+'; + my $h = int(abs($val) / 60); + sprintf("%s%.2d:%.2d", $sign, $h, abs($val)-60*$h); + }, + PrintConvInv => q{ + $val =~ /([-+]?)(\d+):(\d+)/ or return undef; + return $1 . ($2 * 60 + $3); + }, + }, + 2 => { + Name => 'DaylightSavings', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 3 => { + Name => 'DateDisplayFormat', + PrintConv => { + 0 => 'Y/M/D', + 1 => 'M/D/Y', + 2 => 'D/M/Y', + }, + }, +); + +# ISO information - PH (D300) +%Image::ExifTool::Nikon::ISOInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'ISO', + Notes => 'val = 100 * 2**(raw/12-5)', + Priority => 0, # because people like to see rounded-off values if they exist + ValueConv => '100*exp(($val/12-5)*log(2))', + ValueConvInv => '(log($val/100)/log(2)+5)*12', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + # 1 - 0x01 + # 2 - 0x0c (probably the ISO divisor above) + # 3 - 0x00 + 4 => { + Name => 'ISOExpansion', + Format => 'int16u', + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => { + 0x000 => 'Off', + 0x101 => 'Hi 0.3', + 0x102 => 'Hi 0.5', + 0x103 => 'Hi 0.7', + 0x104 => 'Hi 1.0', + 0x105 => 'Hi 1.3', # (Hi 1.3-1.7 may be possible with future models) + 0x106 => 'Hi 1.5', + 0x107 => 'Hi 1.7', + 0x108 => 'Hi 2.0', #(NC) - D3 should have this mode + 0x109 => 'Hi 2.3', #IB + 0x10a => 'Hi 2.5', #IB + 0x10b => 'Hi 2.7', #IB + 0x10c => 'Hi 3.0', #IB + 0x10d => 'Hi 3.3', #IB + 0x10e => 'Hi 3.5', #IB + 0x10f => 'Hi 3.7', #IB + 0x110 => 'Hi 4.0', #IB + 0x111 => 'Hi 4.3', #IB + 0x112 => 'Hi 4.5', #IB + 0x113 => 'Hi 4.7', #IB + 0x114 => 'Hi 5.0', #IB + 0x201 => 'Lo 0.3', + 0x202 => 'Lo 0.5', + 0x203 => 'Lo 0.7', + 0x204 => 'Lo 1.0', + }, + }, + # bytes 6-11 same as 0-4 in my samples (why is this duplicated?) + 6 => { + Name => 'ISO2', + Notes => 'val = 100 * 2**(raw/12-5)', + ValueConv => '100*exp(($val/12-5)*log(2))', + ValueConvInv => '(log($val/100)/log(2)+5)*12', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + # 7 - 0x01 + # 8 - 0x0c (probably the ISO divisor above) + # 9 - 0x00 + 10 => { + Name => 'ISOExpansion2', + Format => 'int16u', + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => { + 0x000 => 'Off', + 0x101 => 'Hi 0.3', + 0x102 => 'Hi 0.5', + 0x103 => 'Hi 0.7', + 0x104 => 'Hi 1.0', + 0x105 => 'Hi 1.3', # (Hi 1.3-1.7 may be possible with future models) + 0x106 => 'Hi 1.5', + 0x107 => 'Hi 1.7', + 0x108 => 'Hi 2.0', #(NC) - D3 should have this mode + 0x201 => 'Lo 0.3', + 0x202 => 'Lo 0.5', + 0x203 => 'Lo 0.7', + 0x204 => 'Lo 1.0', + }, + }, + # bytes 12-13: 00 00 +); + +# distortion information - PH (D5000) +%Image::ExifTool::Nikon::DistortInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'DistortionVersion', + Format => 'undef[4]', + Writable => 0, + Unknown => 1, + }, + 4 => { + Name => 'AutoDistortionControl', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On (underwater)', # (1AW1) + }, + }, +); + +# unknown information - PH (D7000) +%Image::ExifTool::Nikon::UnknownInfo = ( + %binaryDataAttrs, + FORMAT => 'int32u', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'UnknownInfoVersion', + Condition => '$$valPt =~ /^\d{4}/', + Format => 'undef[4]', + Writable => 0, + Unknown => 1, + }, + # (bytes 6/7 and 8/9 are swapped if CaptureNX changes the byte order) +); + +# more unknown information - PH (D7000) +%Image::ExifTool::Nikon::UnknownInfo2 = ( + %binaryDataAttrs, + FORMAT => 'int32u', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'UnknownInfo2Version', + Condition => '$$valPt =~ /^\d{4}/', + Format => 'undef[4]', + Writable => 0, + Unknown => 1, + }, + # (byte 4 may be changed from 1 to 0 when rewritten by CaptureNX) +); + +# Nikon AF information (ref 13) +%Image::ExifTool::Nikon::AFInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'AFAreaMode', + PrintConv => { + 0 => 'Single Area', + 1 => 'Dynamic Area', + 2 => 'Dynamic Area (closest subject)', + 3 => 'Group Dynamic', + 4 => 'Single Area (wide)', + 5 => 'Dynamic Area (wide)', + }, + }, + 1 => { + Name => 'AFPoint', + Notes => 'in some focus modes this value is not meaningful', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Center', + 1 => 'Top', + 2 => 'Bottom', + 3 => 'Mid-left', + 4 => 'Mid-right', + 5 => 'Upper-left', + 6 => 'Upper-right', + 7 => 'Lower-left', + 8 => 'Lower-right', + 9 => 'Far Left', + 10 => 'Far Right', + # (have also seen values of 11 and 12 when AFPointsInFocus is "(none)" - PH S3500) + }, + }, + 2 => { + Name => 'AFPointsInFocus', + Format => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 0 => '(none)', + 0x7ff => 'All 11 Points', + BITMASK => { + 0 => 'Center', + 1 => 'Top', + 2 => 'Bottom', + 3 => 'Mid-left', + 4 => 'Mid-right', + 5 => 'Upper-left', + 6 => 'Upper-right', + 7 => 'Lower-left', + 8 => 'Lower-right', + 9 => 'Far Left', + 10 => 'Far Right', + }, + }, + }, +); + +# Nikon AF information for D3 and D300 (ref JD) +%Image::ExifTool::Nikon::AFInfo2 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0, 4, 6 ], + NOTES => "These tags are written by Nikon DSLR's which have the live view feature.", + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'AFInfo2Version', + Format => 'undef[4]', + Writable => 0, + RawConv => '$$self{AFInfo2Version} = $val', + }, + 4 => { #PH + Name => 'ContrastDetectAF', + RawConv => '$$self{ContrastDetectAF} = $val', + PrintConv => { + %offOn, + 2 => 'On (2)', #PH (Z7) + }, + Notes => 'this is Off for the hybrid AF used in Nikon 1 models', + }, + 5 => [ + { + Name => 'AFAreaMode', + Condition => 'not $$self{ContrastDetectAF}', + Notes => 'ContrastDetectAF Off', + PrintConv => { + 0 => 'Single Area', # (called "Single Point" in manual - PH) + 1 => 'Dynamic Area', #PH + 2 => 'Dynamic Area (closest subject)', #PH + 3 => 'Group Dynamic', #PH + 4 => 'Dynamic Area (9 points)', #JD/28 + 5 => 'Dynamic Area (21 points)', #28 + 6 => 'Dynamic Area (51 points)', #28 + 7 => 'Dynamic Area (51 points, 3D-tracking)', #PH/28 + 8 => 'Auto-area', + 9 => 'Dynamic Area (3D-tracking)', #PH (D5000 "3D-tracking (11 points)") + 10 => 'Single Area (wide)', #PH + 11 => 'Dynamic Area (wide)', #PH + 12 => 'Dynamic Area (wide, 3D-tracking)', #PH + 13 => 'Group Area', #PH + 14 => 'Dynamic Area (25 points)', #PH + 15 => 'Dynamic Area (72 points)', #PH + 16 => 'Group Area (HL)', #28 + 17 => 'Group Area (VL)', #28 + 18 => 'Dynamic Area (49 points)', #28 + 128 => 'Single', #PH (1J1,1J2,1J3,1J4,1S1,1S2,1V2,1V3) + 129 => 'Auto (41 points)', #PH (1J1,1J2,1J3,1J4,1S1,1S2,1V1,1V2,1V3,AW1) + 130 => 'Subject Tracking (41 points)', #PH (1J1,1J4,1J3) + 131 => 'Face Priority (41 points)', #PH (1J1,1J3,1S1,1V2,AW1) + # 134 - seen for 1V1[PhaseDetectAF=0] (PH) + # 135 - seen for 1J2[PhaseDetectAF=4] (PH) + 192 => 'Pinpoint', #PH (NC) + 193 => 'Single', #PH (NC) + 195 => 'Wide (S)', #PH (NC) + 196 => 'Wide (L)', #PH (NC) + 197 => 'Auto', #PH (NC) + }, + }, + { #PH (D3/D90/D5000) + Name => 'AFAreaMode', + Notes => 'ContrastDetectAF On', + PrintConv => { + 0 => 'Contrast-detect', # (D3) + 1 => 'Contrast-detect (normal area)', # (D90/D5000) + # (D90 and D5000 give value of 2 when set to 'Face Priority' and + # 'Subject Tracking', but I didn't have a face to shoot at or a + # moving subject to track so perhaps this value changes dynamically) + 2 => 'Contrast-detect (wide area)', # (D90/D5000) + 3 => 'Contrast-detect (face priority)', # (ViewNX) + 4 => 'Contrast-detect (subject tracking)', # (ViewNX) + 128 => 'Single', #PH (1V3) + 129 => 'Auto (41 points)', #PH (NC) + 130 => 'Subject Tracking (41 points)', #PH (NC) + 131 => 'Face Priority (41 points)', #PH (NC) + 192 => 'Pinpoint', #PH (Z7) + 193 => 'Single', #PH (Z7) + 194 => 'Dynamic', #PH (Z7) + 195 => 'Wide (S)', #PH (Z7) + 196 => 'Wide (L)', #PH (Z7) + 197 => 'Auto', #PH (Z7) + 198 => 'Auto (People)', #28 (Z7) #if no faces are detected, will record as 'Auto'. Camera setting recorded in AFAreaMode field in the MakerNotes area + 199 => 'Auto (Animal)', #28 (Z7) #if no animals are detected, will record as 'Auto'. Camera setting recorded in AFAreaMode field in the MakerNotes area + 200 => 'Normal-area AF', #28 (D6) + 201 => 'Wide-area AF', #28 (D6) + 202 => 'Face-priority AF', #28 (D6) + 203 => 'Subject-tracking AF', #28 (D6) + 204 => 'Dynamic Area (S)', #28 (Z9) + 205 => 'Dynamic Area (M)', #28 (Z9) + 206 => 'Dynamic Area (L)', #28 (Z9) + 207 => '3D-tracking', #28 (Z9) + }, + }, + ], + 6 => { + Name => 'PhaseDetectAF', #JD(AutoFocus), PH(PhaseDetectAF) + Notes => 'PrimaryAFPoint and AFPointsUsed below are only valid when this is On', + RawConv => '$$self{PhaseDetectAF} = $val', + PrintConv => { + # [observed AFAreaMode values in square brackets for each PhaseDetectAF value] + 0 => 'Off', + 1 => 'On (51-point)', #PH + 2 => 'On (11-point)', #PH + 3 => 'On (39-point)', #29 (D7000) + 4 => 'On (73-point)', #PH (1J1[128/129],1J2[128/129/135],1J3/1S1/1V2[128/129/131],1V1[129],AW1[129/131]) + 5 => 'On (5)', #PH (1S2[128/129], 1J4/1V3[129]) + 6 => 'On (105-point)', #PH (1J4/1V3[128/130]) + 7 => 'On (153-point)', #PH (D5/D500/D850) + 8 => 'On (81-point)', #38 + 9 => 'On (105-point)', #28 (D6) + }, + }, + 7 => [ + { #PH/JD + Name => 'PrimaryAFPoint', + # PrimaryAFPoint may only be valid for PhaseDetect - certainly true on the D6, possibly other bodies? (ref 28) + Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} ne "0301"', + Notes => q{ + models with 51-point AF -- 5 rows (A-E) and 11 columns (1-11): D3, D3S, D3X, + D4, D4S, D300, D300S, D700, D800, D800e and D810 + }, + PrintConvColumns => 5, + PrintConv => { + 0 => '(none)', + %afPoints51, + 1 => 'C6 (Center)', # (add " (Center)" to central point) + }, + }, + { #10 + Name => 'PrimaryAFPoint', + Notes => 'models with 11-point AF: D90, D3000, D3100, D5000 and D5100', + Condition => '$$self{PhaseDetectAF} == 2', + PrintConvColumns => 2, + PrintConv => { + 0 => '(none)', + 1 => 'Center', + 2 => 'Top', + 3 => 'Bottom', + 4 => 'Mid-left', + 5 => 'Upper-left', + 6 => 'Lower-left', + 7 => 'Far Left', + 8 => 'Mid-right', + 9 => 'Upper-right', + 10 => 'Lower-right', + 11 => 'Far Right', + }, + }, + { #29 + Name => 'PrimaryAFPoint', + Condition => '$$self{PhaseDetectAF} == 3', + Notes => 'models with 39-point AF: D600 and D7000', + PrintConvColumns => 5, + PrintConv => { + 0 => '(none)', + %afPoints39, + 1 => 'C6 (Center)', # (add " (Center)" to central point) + }, + }, + { #PH + Name => 'PrimaryAFPoint', + Condition => '$$self{PhaseDetectAF} == 4', + Notes => 'Nikon 1 models with older 135-point AF and 73-point phase-detect AF', + PrintConvColumns => 5, + PrintConv => { + 0 => '(none)', + %afPoints135, + 1 => 'E8 (Center)', # (add " (Center)" to central point) + }, + }, + { #PH (NC) + Name => 'PrimaryAFPoint', + Condition => '$$self{PhaseDetectAF} == 5', + Notes => q{ + Nikon 1 models with newer 135-point AF and 73-point phase-detect AF -- 9 + rows (B-J) and 15 columns (1-15), inside a grid of 11 rows by 15 columns. + The points are numbered sequentially, with F8 at the center + }, + PrintConv => { + 0 => '(none)', + 82 => 'F8 (Center)', + OTHER => sub { + my ($val, $inv) = @_; + return GetAFPointGrid($val, 15, $inv); + }, + }, + }, + { #PH + Name => 'PrimaryAFPoint', + Condition => '$$self{PhaseDetectAF} == 6', + Notes => q{ + Nikon 1 models with 171-point AF and 105-point phase-detect AF -- 9 rows + (B-J) and 19 columns (2-20), inside a grid of 11 rows by 21 columns. The + points are numbered sequentially, with F11 at the center + }, + PrintConv => { + 0 => '(none)', + #22 => 'B2 (Top-left)', + #40 => 'B20 (Top-right)', + 115 => 'F11 (Center)', + #190 => 'J2 (Bottom-left)', + #208 => 'J20 (Bottom-right)', + OTHER => sub { + my ($val, $inv) = @_; + return GetAFPointGrid($val, 21, $inv); + }, + }, + }, + { #PH + Name => 'PrimaryAFPoint', + Condition => '$$self{PhaseDetectAF} == 7 and $$self{AFInfo2Version} eq "0100"', + Notes => q{ + Nikon models with 153-point AF -- 9 rows (A-I) and 17 columns (1-17): D5, + D500 and D850 + }, + PrintConvColumns => 5, + PrintConv => { + 0 => '(none)', + %afPoints153, + 1 => 'E9 (Center)', + }, + }, + { #PH (Z7) (NC) + Name => 'PrimaryAFPoint', + Condition => '$$self{PhaseDetectAF} == 8 and $$self{AFInfo2Version} =~ /^03/', + Notes => q{ + Nikon models with 493-point AF -- 17 rows (A-Q) and 29 columns (1-29), I15 + at the center + }, + PrintConv => { + 0 => '(none)', + 246 => 'I15 (Center)', + OTHER => sub { + my ($val, $inv) = @_; + return GetAFPointGrid($val, 29, $inv); + }, + }, + }, + { + Name => 'PrimaryAFPoint', + Condition => '$$self{AFInfo2Version} eq "0100"', + Notes => 'future models?...', + PrintConv => { + 0 => '(none)', + 1 => 'Center', + }, + }, + ], + 8 => [ + { #JD/PH + Name => 'AFPointsUsed', + Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} ne "0301"', + Notes => q{ + models with 51-point AF -- 5 rows: A1-9, B1-11, C1-11, D1-11, E1-9. Center + point is C6 + }, + Format => 'undef[7]', + ValueConv => 'join(" ", unpack("H2"x7, $val))', + ValueConvInv => '$val=~tr/ //d; pack("H*",$val)', + PrintConv => sub { PrintAFPoints(shift, \%afPoints51); }, + PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints51); }, + }, + { #10 + Name => 'AFPointsUsed', + Condition => '$$self{PhaseDetectAF} == 2', + Notes => 'models with 11-point AF', + # read as int16u in little-endian byte order + Format => 'undef[2]', + ValueConv => 'unpack("v",$val)', + ValueConvInv => 'pack("v",$val)', + PrintConvColumns => 2, + PrintConv => { + 0 => '(none)', + 0x7ff => 'All 11 Points', + BITMASK => { + 0 => 'Center', + 1 => 'Top', + 2 => 'Bottom', + 3 => 'Mid-left', + 4 => 'Upper-left', + 5 => 'Lower-left', + 6 => 'Far Left', + 7 => 'Mid-right', + 8 => 'Upper-right', + 9 => 'Lower-right', + 10 => 'Far Right', + }, + }, + }, + { #29/PH + Name => 'AFPointsUsed', + Condition => '$$self{PhaseDetectAF} == 3', + Notes => q{ + models with 39-point AF -- 5 rows: A1-3, B1-11, C1-11, D1-11, E1-3. Center + point is C6 + }, + Format => 'undef[5]', + ValueConv => 'join(" ", unpack("H2"x5, $val))', + ValueConvInv => '$val=~tr/ //d; pack("H*",$val)', + PrintConv => sub { PrintAFPoints(shift, \%afPoints39); }, + PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints39); }, + }, + { #PH (1AW1,1J1,1J2,1J3,1S1,1V1,1V2) + Name => 'AFPointsUsed', + Condition => '$$self{PhaseDetectAF} == 4', + Notes => q{ + older models with 135-point AF -- 9 rows (A-I) and 15 columns (1-15). + Center point is E8. The odd-numbered columns, columns 2 and 14, and the + remaining corner points are not used for 41-point AF mode + }, + Format => 'undef[17]', + ValueConv => 'join(" ", unpack("H2"x17, $val))', + ValueConvInv => '$val=~tr/ //d; pack("H*",$val)', + PrintConv => sub { PrintAFPoints(shift, \%afPoints135); }, + PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints135); }, + }, + { #PH (1S2) + Name => 'AFPointsUsed', + Condition => '$$self{PhaseDetectAF} == 5', + Notes => q{ + newer models with 135-point AF -- 9 rows (B-J) and 15 columns (1-15). Center + point is F8 + }, + Format => 'undef[21]', + ValueConv => 'join(" ", unpack("H2"x21, $val))', + ValueConvInv => '$val=~tr/ //d; pack("H*",$val)', + PrintConv => sub { PrintAFPointsGrid(shift, 15); }, + PrintConvInv => sub { PrintAFPointsGridInv(shift, 15, 21); }, + }, + { #PH (1J4,1V3) + Name => 'AFPointsUsed', + Condition => '$$self{PhaseDetectAF} == 6', + Notes => q{ + models with 171-point AF -- 9 rows (B-J) and 19 columns (2-20). Center + point is F10 + }, + Format => 'undef[29]', + ValueConv => 'join(" ", unpack("H2"x29, $val))', + ValueConvInv => '$val=~tr/ //d; pack("H*",$val)', + PrintConv => sub { PrintAFPointsGrid(shift, 21); }, + PrintConvInv => sub { PrintAFPointsGridInv(shift, 21, 29); }, + }, + { #PH (D5,D500) + Name => 'AFPointsUsed', + Condition => '$$self{PhaseDetectAF} == 7', + Notes => q{ + models with 153-point AF -- 9 rows (A-I) and 17 columns (1-17). Center + point is E9 + }, + Format => 'undef[20]', + ValueConv => 'join(" ", unpack("H2"x20, $val))', + ValueConvInv => '$val=~tr/ //d; pack("H*",$val)', + PrintConv => sub { PrintAFPoints(shift, \%afPoints153); }, + PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints153); }, + }, + { #38 (Z6/Z7/Z50) + Name => 'AFPointsUsed', + Condition => '$$self{PhaseDetectAF} == 8 and $$self{Model} =~ /^NIKON Z/', + Notes => q{ + models with 81-selectable point AF -- 9 rows (A-I) and 9 columns (1-9) for + phase detect AF points. Center point is E5 + }, + Format => 'undef[13]', + ValueConv => 'join(" ", unpack("H2"x13, $val))', + ValueConvInv => '$val=~tr/ //d; pack("H*",$val)', + PrintConv => sub { PrintAFPoints(shift, \%afPoints81); }, + PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints81); }, + }, + { #PH + Name => 'AFPointsUsed', + # version 301 uses a separate field at offset 0x0a for this tag (ref 28) + Condition => '$$self{AFInfo2Version} ne "0301"', + Format => 'undef[7]', + ValueConv => 'join(" ", unpack("H2"x7, $val))', + ValueConvInv => '$val=~tr/ //d; pack("H*",$val)', + PrintConv => '"Unknown ($val)"', + PrintConvInv => '$val=~s/Unknown \\((.*)\\)/$1/; $val', + }, + ], + 0x0a => { #28 (D6) in any of the 3 Group modes on the D6, the points specify the outer boundaries of the focus point area; otherwise the tag value is consistent with other Nikon bodies + Name => 'AFPointsUsed', + Condition => '$$self{AFInfo2Version} eq "0301" and $$self{PhaseDetectAF} == 9', + Notes => q{ + models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15). Center + point is D8 + }, + Format => 'undef[14]', + ValueConv => 'join(" ", unpack("H2"x14, $val))', + ValueConvInv => '$val=~tr/ //d; pack("H*",$val)', + PrintConv => sub { PrintAFPoints(shift, \%afPoints105); }, + PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints105); }, + }, + 0x10 => { #PH (D90 and D5000) + Name => 'AFImageWidth', + Condition => '$$self{AFInfo2Version} eq "0100"', + Format => 'int16u', + RawConv => '$val ? $val : undef', + Notes => 'this and the following tags are valid only for contrast-detect AF', + }, + 0x12 => { #PH + Name => 'AFImageHeight', + Condition => '$$self{AFInfo2Version} eq "0100"', + Format => 'int16u', + RawConv => '$val ? $val : undef', + }, + 0x14 => { #PH + Name => 'AFAreaXPosition', + Condition => '$$self{AFInfo2Version} eq "0100"', + Notes => 'center of AF area in AFImage coordinates', + Format => 'int16u', + RawConv => '$val ? $val : undef', + }, + 0x16 => { #PH + Name => 'AFAreaYPosition', + Condition => '$$self{AFInfo2Version} eq "0100"', + Format => 'int16u', + RawConv => '$val ? $val : undef', + }, + # AFAreaWidth/Height for the D90 and D5000: + # 352x288 (AF normal area), + # 704x576 (AF face priority, wide area, subject tracking) + 0x18 => { #PH + Name => 'AFAreaWidth', + Condition => '$$self{AFInfo2Version} eq "0100"', + Format => 'int16u', + Notes => 'size of AF area in AFImage coordinates', + RawConv => '$val ? $val : undef', + }, + 0x1a => { #PH + Name => 'AFAreaHeight', + Condition => '$$self{AFInfo2Version} eq "0100"', + Format => 'int16u', + RawConv => '$val ? $val : undef', + }, + 0x1c => [ + { #PH + Name => 'ContrastDetectAFInFocus', + Condition => '$$self{AFInfo2Version} eq "0100"', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + },{ #PH (D500, see forum11190) + Name => 'AFPointsSelected', + Condition => '$$self{AFInfo2Version} eq "0101" and $$self{PhaseDetectAF} == 7', + Format => 'undef[20]', + ValueConv => 'join(" ", unpack("H2"x20, $val))', + ValueConvInv => '$val=~tr/ //d; pack("H*",$val)', + PrintConv => sub { PrintAFPoints(shift, \%afPoints153); }, + PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints153); }, + }, + ], + # 0x1d - always zero (with or without live view) + 0x2a => { #PH (Z7) + Name => 'AFImageWidth', + Condition => '$$self{AFInfo2Version} =~ /^03/', + Format => 'int16u', + RawConv => '$val ? $val : undef', + }, + 0x2c => { #PH (Z7) + Name => 'AFImageHeight', + Condition => '$$self{AFInfo2Version} =~ /^03/', + Format => 'int16u', + RawConv => '$val ? $val : undef', + }, + 0x2e => { #PH (Z7) + Name => 'AFAreaXPosition', + Condition => q{ + $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or + $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/ + }, + Format => 'int16u', + }, + 0x2f => { #28 (Z7) Still photography range 1-17 for the 493 point Z7 (arranged in a 29x17 grid. Center at x=16, y=10). + Name => 'AFFocusPointXPosition', + Condition => q{ + $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or + $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/ + }, + PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29 ); }, + }, + 0x30 => [ + { #PH (Z7) + Name => 'AFAreaYPosition', + Condition => q{ + $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or + $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/ + }, + Format => 'int16u', + },{ #PH (D500, see forum11190) + Name => 'AFPointsInFocus', + Condition => '$$self{AFInfo2Version} eq "0101" and $$self{PhaseDetectAF} == 7', + Notes => 'AF points in focus at the time time image was captured', + Format => 'undef[20]', + ValueConv => 'join(" ", unpack("H2"x20, $val))', + ValueConvInv => '$val=~tr/ //d; pack("H*",$val)', + PrintConv => sub { PrintAFPoints(shift, \%afPoints153); }, + PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints153); }, + }, + ], + 0x31 => { #28 (Z7) + Name => 'AFFocusPointYPosition', + Condition => q{ + $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or + $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/ + }, + PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17 ); }, + }, + 0x32 => { #PH (Z7) + Name => 'AFAreaWidth', + Condition => '$$self{AFInfo2Version} =~ /^03/', + Format => 'int16u', + RawConv => '$val ? $val : undef', + }, + 0x34 => { #PH (Z7) + Name => 'AFAreaHeight', + Condition => '$$self{AFInfo2Version} =~ /^03/', + Format => 'int16u', + RawConv => '$val ? $val : undef', + }, + 0x38 => { #28 + Name => 'PrimaryAFPoint', + Condition => '$$self{PhaseDetectAF} == 9 and $$self{AFInfo2Version} =~ /^03/', + Notes => q{ + Nikon models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15): D6 + }, + PrintConvColumns => 5, + PrintConv => { + 0 => '(none)', + %afPoints105, + 1 => 'D8 (Center)', + }, + }, + 0x44 => [ + { + Name => 'PrimaryAFPoint', + Condition => '$$self{PhaseDetectAF} == 7 and $$self{AFInfo2Version} eq "0101"', + PrintConvColumns => 5, + PrintConv => { + 0 => '(none)', + %afPoints153, + 1 => 'E9 (Center)', + }, + }, + { #PH + Name => 'PrimaryAFPoint', + Notes => 'D3500', + Condition => '$$self{PhaseDetectAF} == 2 and $$self{AFInfo2Version} eq "0101"', + PrintConvColumns => 2, + PrintConv => { + 0 => '(none)', + 1 => 'Center', + 2 => 'Top', + 3 => 'Bottom', + 4 => 'Mid-left', + 5 => 'Upper-left', + 6 => 'Lower-left', + 7 => 'Far Left', + 8 => 'Mid-right', + 9 => 'Upper-right', + 10 => 'Lower-right', + 11 => 'Far Right', + }, + }, + { + Name => 'PrimaryAFPoint', + Condition => '$$self{AFInfo2Version} eq "0101"', + Notes => 'future models?...', + Priority => 0, + PrintConv => { + 0 => '(none)', + 1 => 'Center', + }, + }, + ], + 0x46 => { + Name => 'AFImageWidth', + Condition => '$$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} eq "0101"', + Format => 'int16u', + RawConv => '$val ? $val : undef', + Notes => 'this and the following tags are valid only for contrast-detect AF', + }, + 0x48 => { + Name => 'AFImageHeight', + Condition => '$$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} eq "0101"', + Format => 'int16u', + RawConv => '$val ? $val : undef', + }, + 0x4a => { + Name => 'AFAreaXPosition', + Condition => '$$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} eq "0101"', + Notes => 'center of AF area in AFImage coordinates', + Format => 'int16u', + RawConv => '$val ? $val : undef', + }, + 0x4c => { + Name => 'AFAreaYPosition', + Condition => '$$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} eq "0101"', + Format => 'int16u', + RawConv => '$val ? $val : undef', + }, + 0x4e => { + Name => 'AFAreaWidth', + Condition => '$$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} eq "0101"', + Format => 'int16u', + Notes => 'size of AF area in AFImage coordinates', + RawConv => '$val ? $val : undef', + }, + 0x50 => { + Name => 'AFAreaHeight', + Condition => '$$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} eq "0101"', + Format => 'int16u', + RawConv => '$val ? $val : undef', + }, + 0x52 => { + Name => 'ContrastDetectAFInFocus', + Condition => '$$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} eq "0101"', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, +); + +%Image::ExifTool::Nikon::AFInfo2V0400 = ( #V0400 related fields begin at x'3c' ( Z9) + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0 ], + 0 => { + Name => 'AFInfo2Version', + Format => 'undef[4]', + Writable => 0, + RawConv => '$$self{AFInfo2Version} = $val', + }, + 0x3e => { + Name => 'AFImageWidth', + Format => 'int16u', + }, + 0x40 => { + Name => 'AFImageHeight', + Format => 'int16u', + }, + 0x43 => { + Name => 'FocusPositionHorizontal', + Notes => q{ + the focus points form a 29x17 grid, but the X,Y coordinate values run from 1,1 + to 30,19. The horizontal coordinate 11R (5) and the vertical coordinates 6U + (4) and 2D (12) are not used for some reason + }, + # 493 focus points for Z9 fall in a 30x19 grid + # (the 11R (5) position is not used, for a total of 29 columns, ref AlbertShan email) + PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29); }, + }, + 0x45 => { + Name => 'FocusPositionVertical', + # (the 6U (4) and 2D (12) are not used, for a total of 17 rows, ref AlbertShan email) + PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17); }, + }, + 0x46 => { + Name => 'AFAreaWidth', + Format => 'int16u', + Notes => 'size of AF area in AFImage pixels', + RawConv => '$val ? $val : undef', + }, + 0x48 => { + Name => 'AFAreaHeight', + Format => 'int16u', + RawConv => '$val ? $val : undef', + } + # AFFocusResult is the result of the last AF operation and not necessarily an indication of the state of the of the capture (e.g., the subject may have moved or the image re-framed) + #0x4a => { Name => 'AFFocusResult',PrintConv => {0=> "No Focus", 1=>"Focus"} }, #new tag created because Z9 uses a hybrid contrast/phase AF (closest former tag was ContrastDetectAFInFocus). +); + +# Nikon AF fine-tune information (ref 28) +%Image::ExifTool::Nikon::AFTune = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'AFFineTune', + PrintConv => { + 0 => 'Off', + # (don't know what the difference between 1 and 2 is) + 1 => 'On (1)', + 2 => 'On (2)', + 3 => 'On (Zoom)', #28 + }, + }, + 1 => { + Name => 'AFFineTuneIndex', + Notes => 'index of saved lens', + PrintConv => '$val == 255 ? "n/a" : $val', + PrintConvInv => '$val eq "n/a" ? 255 : $val', + }, + 2 => { + # when AFFineTune = 3 (indicating a zoom lens), this Tag stores the tuning adjustment for the wide end of the zoom range (ref 28) + Name => 'AFFineTuneAdj', + Priority => 0, # so other value takes priority if it exists + Notes => 'may only be valid for saved lenses', + Format => 'int8s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 3 => { + Name => 'AFFineTuneAdjTele', + # should probably insert a Condition that restricts this to AFFineTune = 3 (ref 28) + Notes => 'only valid for zoom lenses (ie, AFTune=3)', + Format => 'int8s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, +); + +# Nikon NEF processing information (ref forum6281) +%Image::ExifTool::Nikon::RetouchInfo = ( + %binaryDataAttrs, + FORMAT => 'int8s', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0 ], + 0 => { + Name => 'RetouchInfoVersion', + Format => 'undef[4]', + Writable => 0, + RawConv => '$$self{RetouchInfoVersion} = $val', + }, + # 4 - RetouchExposureComp (+$val/6 or -$val/6?) + 5 => { + Name => 'RetouchNEFProcessing', + Condition => '$$self{RetouchInfoVersion} ge "0200"', + PrintConv => { + -1 => 'Off', + 1 => 'On', + }, + }, +); + +# Nikon File information - D60, D3 and D300 (ref PH) +%Image::ExifTool::Nikon::FileInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + FORMAT => 'int16u', + 0 => { + Name => 'FileInfoVersion', + Format => 'undef[4]', + Writable => 0, + }, + 2 => 'MemoryCardNumber', + 3 => { + Name => 'DirectoryNumber', + PrintConv => 'sprintf("%.3d", $val)', + PrintConvInv => '$val', + }, + 4 => { + Name => 'FileNumber', + PrintConv => 'sprintf("%.4d", $val)', + PrintConvInv => '$val', + }, +); + +# ref PH +%Image::ExifTool::Nikon::BarometerInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Location' }, + 0 => { + Name => 'BarometerInfoVersion', + Format => 'undef[4]', + Writable => 0, + }, + 6 => { + Name => 'Altitude', + Format => 'int32s', + PrintConv => '"$val m"', # (always stored as metres) + PrintConvInv => '$val=~s/\s*m$//; $val', + }, + # 10: int16u - values: 0 (display in metres?), 18 (display in feet?) +); + +# ref PH +%Image::ExifTool::Nikon::CaptureOffsets = ( + PROCESS_PROC => \&ProcessNikonCaptureOffsets, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # (note that these are duplicates of offsets in the normal TIFF structure, + # and that these offsets are not updated when ExifTool rewrites the file) + 1 => 'IFD0_Offset', + 2 => 'PreviewIFD_Offset', + 3 => 'SubIFD_Offset', +); + +# ref PH (Written by capture NX) +%Image::ExifTool::Nikon::CaptureOutput = ( + %binaryDataAttrs, + FORMAT => 'int32u', + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + # 1 = 1 + 2 => 'OutputImageWidth', + 3 => 'OutputImageHeight', + 4 => 'OutputResolution', + # 5 = 1 +); + +# ref IB +%Image::ExifTool::Nikon::ColorBalanceA = ( + %binaryDataAttrs, + FORMAT => 'int16u', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 624 => { #4 + Name => 'WB_RBLevels', + Notes => 'as shot', #IB + Format => 'int16u[2]', + Protected => 1, + }, + 626 => { + Name => 'WB_RBLevelsAuto', + Format => 'int16u[2]', + Protected => 1, + }, + 628 => { + Name => 'WB_RBLevelsDaylight', + Notes => 'red/blue levels for 0,+3,+2,+1,-1,-2,-3', + Format => 'int16u[14]', + Protected => 1, + }, + 642 => { + Name => 'WB_RBLevelsIncandescent', + Format => 'int16u[14]', + Protected => 1, + }, + 656 => { + Name => 'WB_RBLevelsFluorescent', + Format => 'int16u[6]', + Notes => 'red/blue levels for fluorescent W,N,D', + Protected => 1, + }, + 662 => { + Name => 'WB_RBLevelsCloudy', + Format => 'int16u[14]', + Protected => 1, + }, + 676 => { + Name => 'WB_RBLevelsFlash', + Format => 'int16u[14]', + Protected => 1, + }, + 690 => { + Name => 'WB_RBLevelsShade', + Condition => '$$self{Model} ne "E8700"', + Notes => 'not valid for E8700', + Format => 'int16u[14]', + Protected => 1, + }, +); + +my %nrwLevels = ( + Format => 'int32u[4]', + Protected => 1, + ValueConv => 'my @a=split " ",$val;$a[0]*=2;$a[3]*=2;"@a"', + ValueConvInv => 'my @a=split " ",$val;$a[0]/=2;$a[3]/=2;"@a"', +); + +# (ref IB) +%Image::ExifTool::Nikon::ColorBalanceB = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Color balance tags used by the P6000.', + 0x0004 => { + Name => 'ColorBalanceVersion', + Format => 'undef[4]', + }, + 0x13e8 => { Name => 'WB_RGGBLevels', %nrwLevels }, + 0x13f8 => { Name => 'WB_RGGBLevelsDaylight', %nrwLevels }, + 0x1408 => { Name => 'WB_RGGBLevelsCloudy', %nrwLevels }, + 0x1428 => { Name => 'WB_RGGBLevelsTungsten', %nrwLevels }, + 0x1438 => { Name => 'WB_RGGBLevelsFluorescentW',%nrwLevels }, + 0x1448 => { Name => 'WB_RGGBLevelsFlash', %nrwLevels }, + 0x1468 => { Name => 'WB_RGGBLevelsCustom', %nrwLevels, Notes => 'all zero if preset WB not used' }, + 0x1478 => { Name => 'WB_RGGBLevelsAuto', %nrwLevels }, +); + +# (ref IB) +%Image::ExifTool::Nikon::ColorBalanceC = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 4 ], + NOTES => 'Color balance tags used by the P1000, P7000, P7100 and B700.', + 0x0004 => { + Name => 'ColorBalanceVersion', + Format => 'undef[4]', + RawConv => '$$self{ColorBalanceVersion} = $val', + }, + 0x0020 => { Name => 'BlackLevel', Format => 'int16u' }, + 0x0038 => { Name => 'WB_RGGBLevels', %nrwLevels }, + 0x004c => { Name => 'WB_RGGBLevelsDaylight', %nrwLevels }, + 0x0060 => { Name => 'WB_RGGBLevelsCloudy', %nrwLevels }, + 0x0074 => { + Name => 'WB_RGGBLevelsShade', + Condition => '$$self{ColorBalanceVersion} ge "0104"', + Notes => 'valid only for some models', + %nrwLevels, + }, + 0x0088 => { Name => 'WB_RGGBLevelsTungsten', %nrwLevels }, + 0x009c => { Name => 'WB_RGGBLevelsFluorescentW',%nrwLevels }, + 0x00b0 => { Name => 'WB_RGGBLevelsFluorescentN',%nrwLevels }, + 0x00c4 => { Name => 'WB_RGGBLevelsFluorescentD',%nrwLevels }, + 0x00d8 => { Name => 'WB_RGGBLevelsHTMercury', %nrwLevels }, + 0x0100 => { Name => 'WB_RGGBLevelsCustom', %nrwLevels, Notes => 'all zero if preset WB not used' }, + 0x0114 => { Name => 'WB_RGGBLevelsAuto', %nrwLevels }, +); + +# ref 4 +%Image::ExifTool::Nikon::ColorBalance1 = ( + %binaryDataAttrs, + FORMAT => 'int16u', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'WB_RBGGLevels', + Format => 'int16u[4]', + Protected => 1, + }, +); + +# ref 4 +%Image::ExifTool::Nikon::ColorBalance2 = ( + %binaryDataAttrs, + FORMAT => 'int16u', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'This information is encrypted for most camera models.', + 0 => { + Name => 'WB_RGGBLevels', + Format => 'int16u[4]', + Protected => 1, + }, +); + +# ref 4 +%Image::ExifTool::Nikon::ColorBalance3 = ( + %binaryDataAttrs, + FORMAT => 'int16u', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'WB_RGBGLevels', + Format => 'int16u[4]', + Protected => 1, + }, +); + +# ref 4 +%Image::ExifTool::Nikon::ColorBalance4 = ( + %binaryDataAttrs, + FORMAT => 'int16u', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'WB_GRBGLevels', + Format => 'int16u[4]', + Protected => 1, + }, +); + +%Image::ExifTool::Nikon::ColorBalanceUnknown = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'ColorBalanceVersion', + Format => 'undef[4]', + }, +); + +%Image::ExifTool::Nikon::Type2 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x0003 => 'Quality', + 0x0004 => 'ColorMode', + 0x0005 => 'ImageAdjustment', + 0x0006 => 'CCDSensitivity', + 0x0007 => 'WhiteBalance', + 0x0008 => 'Focus', + 0x000A => 'DigitalZoom', + 0x000B => 'Converter', +); + +# these are standard EXIF tags, but they are duplicated here so we can +# set the family 0 group to 'MakerNotes' and set the MINOR_ERRORS flag +%Image::ExifTool::Nikon::PreviewIFD = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 1 => 'PreviewIFD', 2 => 'Image'}, + VARS => { MINOR_ERRORS => 1 }, # this IFD is non-essential and often corrupted + # (these tags are priority 0 by default because PreviewIFD is flagged in LOW_PRIORITY_DIR) + 0xfe => { # (not used by Nikon, but SRW images also use this table) + Name => 'SubfileType', + DataMember => 'SubfileType', + RawConv => '$$self{SubfileType} = $val', + PrintConv => \%Image::ExifTool::Exif::subfileType, + }, + 0x103 => { + Name => 'Compression', + SeparateTable => 'EXIF Compression', + PrintConv => \%Image::ExifTool::Exif::compression, + }, + 0x11a => 'XResolution', + 0x11b => 'YResolution', + 0x128 => { + Name => 'ResolutionUnit', + PrintConv => { + 1 => 'None', + 2 => 'inches', + 3 => 'cm', + }, + }, + 0x201 => { + Name => 'PreviewImageStart', + Flags => [ 'IsOffset', 'Permanent' ], + OffsetPair => 0x202, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + 0x202 => { + Name => 'PreviewImageLength', + Flags => 'Permanent' , + OffsetPair => 0x201, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + 0x213 => { + Name => 'YCbCrPositioning', + PrintConv => { + 1 => 'Centered', + 2 => 'Co-sited', + }, + }, +); + +# these are duplicated enough times to make it worthwhile to define them centrally +my %nikonApertureConversions = ( + ValueConv => '2**($val/24)', + ValueConvInv => '$val>0 ? 24*log($val)/log(2) : 0', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', +); + +my %nikonFocalConversions = ( + ValueConv => '5 * 2**($val/24)', + ValueConvInv => '$val>0 ? 24*log($val/5)/log(2) : 0', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//;$val', +); + +# Version 100 Nikon lens data +%Image::ExifTool::Nikon::LensData00 = ( + %binaryDataAttrs, + NOTES => 'This structure is used by the D100, and D1X with firmware version 1.1.', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0x00 => { + Name => 'LensDataVersion', + Format => 'undef[4]', + Writable => 0, + }, + 0x06 => { #8 + Name => 'LensIDNumber', + Notes => 'see LensID values below', + }, + 0x07 => { #8 + Name => 'LensFStops', + ValueConv => '$val / 12', + ValueConvInv => '$val * 12', + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + }, + 0x08 => { #8/9 + Name => 'MinFocalLength', + %nikonFocalConversions, + }, + 0x09 => { #8/9 + Name => 'MaxFocalLength', + %nikonFocalConversions, + }, + 0x0a => { #8 + Name => 'MaxApertureAtMinFocal', + %nikonApertureConversions, + }, + 0x0b => { #8 + Name => 'MaxApertureAtMaxFocal', + %nikonApertureConversions, + }, + 0x0c => 'MCUVersion', #8 (MCU = Micro Controller Unit) +); + +# Nikon lens data (note: needs decrypting if LensDataVersion is 020x) +%Image::ExifTool::Nikon::LensData01 = ( + %binaryDataAttrs, + NOTES => q{ + Nikon encrypts the LensData information below if LensDataVersion is 0201 or + higher, but the decryption algorithm is known so the information can be + extracted. + }, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0x00 => { + Name => 'LensDataVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { #8 + Name => 'ExitPupilPosition', + ValueConv => '$val ? 2048 / $val : $val', + ValueConvInv => '$val ? 2048 / $val : $val', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//; $val', + }, + 0x05 => { #8 + Name => 'AFAperture', + %nikonApertureConversions, + }, + 0x08 => { #8 + # this seems to be 2 values: the upper nibble gives the far focus + # range and the lower nibble gives the near focus range. The values + # are in the range 1-N, where N is lens-dependent. A value of 0 for + # the far focus range indicates infinity. (ref JD) + Name => 'FocusPosition', + PrintConv => 'sprintf("0x%02x", $val)', + PrintConvInv => '$val', + }, + 0x09 => { #8/9 + # With older AF lenses this does not work... (ref 13) + # eg) AF Nikkor 50mm f/1.4 => 48 (0x30) + # AF Zoom-Nikkor 35-105mm f/3.5-4.5 => @35mm => 15 (0x0f), @105mm => 141 (0x8d) + Notes => 'this focus distance is approximate, and not very accurate for some lenses', + Name => 'FocusDistance', + ValueConv => '0.01 * 10**($val/40)', # in m + ValueConvInv => '$val>0 ? 40*log($val*100)/log(10) : 0', + PrintConv => '$val ? sprintf("%.2f m",$val) : "inf"', + PrintConvInv => '$val eq "inf" ? 0 : $val =~ s/\s*m$//, $val', + }, + 0x0a => { #8/9 + Name => 'FocalLength', + Priority => 0, + %nikonFocalConversions, + }, + 0x0b => { #8 + Name => 'LensIDNumber', + Notes => 'see LensID values below', + }, + 0x0c => { #8 + Name => 'LensFStops', + ValueConv => '$val / 12', + ValueConvInv => '$val * 12', + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + }, + 0x0d => { #8/9 + Name => 'MinFocalLength', + %nikonFocalConversions, + }, + 0x0e => { #8/9 + Name => 'MaxFocalLength', + %nikonFocalConversions, + }, + 0x0f => { #8 + Name => 'MaxApertureAtMinFocal', + %nikonApertureConversions, + }, + 0x10 => { #8 + Name => 'MaxApertureAtMaxFocal', + %nikonApertureConversions, + }, + 0x11 => 'MCUVersion', #8 (MCU = Micro Controller Unit) + 0x12 => { #8 + Name => 'EffectiveMaxAperture', + %nikonApertureConversions, + }, +); + +# Nikon lens data (note: needs decrypting) +%Image::ExifTool::Nikon::LensData0204 = ( + %binaryDataAttrs, + NOTES => q{ + Nikon encrypts the LensData information below if LensDataVersion is 0201 or + higher, but the decryption algorithm is known so the information can be + extracted. + }, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0x00 => { + Name => 'LensDataVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { #8 + Name => 'ExitPupilPosition', + ValueConv => '$val ? 2048 / $val : $val', + ValueConvInv => '$val ? 2048 / $val : $val', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//; $val', + }, + 0x05 => { #8 + Name => 'AFAperture', + %nikonApertureConversions, + }, + 0x08 => { #8 + # this seems to be 2 values: the upper nibble gives the far focus + # range and the lower nibble gives the near focus range. The values + # are in the range 1-N, where N is lens-dependent. A value of 0 for + # the far focus range indicates infinity. (ref JD) + Name => 'FocusPosition', + PrintConv => 'sprintf("0x%02x", $val)', + PrintConvInv => '$val', + }, + # --> extra byte at position 0x09 in this version of LensData (PH) + 0x0a => { #8/9 + # With older AF lenses this does not work... (ref 13) + # eg) AF Nikkor 50mm f/1.4 => 48 (0x30) + # AF Zoom-Nikkor 35-105mm f/3.5-4.5 => @35mm => 15 (0x0f), @105mm => 141 (0x8d) + Notes => 'this focus distance is approximate, and not very accurate for some lenses', + Name => 'FocusDistance', + ValueConv => '0.01 * 10**($val/40)', # in m + ValueConvInv => '$val>0 ? 40*log($val*100)/log(10) : 0', + PrintConv => '$val ? sprintf("%.2f m",$val) : "inf"', + PrintConvInv => '$val eq "inf" ? 0 : $val =~ s/\s*m$//, $val', + }, + 0x0b => { #8/9 + Name => 'FocalLength', + Priority => 0, + %nikonFocalConversions, + }, + 0x0c => { #8 + Name => 'LensIDNumber', + Notes => 'see LensID values below', + }, + 0x0d => { #8 + Name => 'LensFStops', + ValueConv => '$val / 12', + ValueConvInv => '$val * 12', + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + }, + 0x0e => { #8/9 + Name => 'MinFocalLength', + %nikonFocalConversions, + }, + 0x0f => { #8/9 + Name => 'MaxFocalLength', + %nikonFocalConversions, + }, + 0x10 => { #8 + Name => 'MaxApertureAtMinFocal', + %nikonApertureConversions, + }, + 0x11 => { #8 + Name => 'MaxApertureAtMaxFocal', + %nikonApertureConversions, + }, + 0x12 => 'MCUVersion', #8 (MCU = Micro Controller Unit) + 0x13 => { #8 + Name => 'EffectiveMaxAperture', + %nikonApertureConversions, + }, +); + +# Nikon lens data version 0400 (note: needs decrypting) (ref PH) +%Image::ExifTool::Nikon::LensData0400 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Tags extracted from the encrypted lens data of the Nikon 1J1/1V1/1J2.', + 0x00 => { + Name => 'LensDataVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x18a => { #PH + Name => 'LensModel', + Format => 'string[64]', + }, +); + +# Nikon lens data version 0402 (note: needs decrypting) (ref PH) +%Image::ExifTool::Nikon::LensData0402 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Tags extracted from the encrypted lens data of the Nikon 1J3/1S1/1V2.', + 0x00 => { + Name => 'LensDataVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x18b => { #PH + Name => 'LensModel', + Format => 'string[64]', + }, +); + +# Nikon lens data version 0403 (note: needs decrypting) (ref PH) +%Image::ExifTool::Nikon::LensData0403 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Tags extracted from the encrypted lens data of the Nikon 1J4/1J5.', + 0x00 => { + Name => 'LensDataVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x2ac => { #PH + Name => 'LensModel', + Format => 'string[64]', + }, +); + +# Nikon Z lens data (note: needs decrypting) (ref PH, based on LensData0204) +%Image::ExifTool::Nikon::LensData0800 = ( + %binaryDataAttrs, + NOTES => 'Tags found in the encrypted LensData from cameras such as the Z6 and Z7.', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0x03, 0x2f, 0x35, 0x4c, 0x56 ], + 0x00 => { + Name => 'LensDataVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x03 => { # look forward to see if new old data exists... + Name => 'OldLensData', + Format => 'undef[17]', + RawConv => '$$self{OldLensData} = 1 unless $val =~ /^.\0+$/s; undef', + Hidden => 1, + }, + 0x04 => { + Name => 'ExitPupilPosition', + Condition => '$$self{OldLensData}', + ValueConv => '$val ? 2048 / $val : $val', + ValueConvInv => '$val ? 2048 / $val : $val', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//; $val', + }, + 0x05 => { + Name => 'AFAperture', + Condition => '$$self{OldLensData}', + %nikonApertureConversions, + }, + # --> another extra byte at position 0x08 in this version of LensData (PH) + #0x09 => { + # Name => 'FocusPosition', #28 - this appears to be copied from an older version of LensData and is no longer valid. Text with Z9 and Z7_2 with a variety of lenses + # Condition => '$$self{OldLensData}', + # PrintConv => 'sprintf("0x%02x", $val)', + # PrintConvInv => '$val', + #}, + 0x0b => { + Notes => 'this focus distance is approximate, and not very accurate for some lenses', + Name => 'FocusDistance', + Condition => '$$self{OldLensData}', + ValueConv => '0.01 * 10**($val/40)', # in m + ValueConvInv => '$val>0 ? 40*log($val*100)/log(10) : 0', + PrintConv => '$val ? sprintf("%.2f m",$val) : "inf"', + PrintConvInv => '$val eq "inf" ? 0 : $val =~ s/\s*m$//, $val', + }, + 0x0c => { + Name => 'FocalLength', + Condition => '$$self{OldLensData}', + Priority => 0, + %nikonFocalConversions, + }, + 0x0d => { + Name => 'LensIDNumber', + Condition => '$$self{OldLensData}', + Notes => 'see LensID values below', + }, + 0x0e => { + Name => 'LensFStops', + Condition => '$$self{OldLensData}', + ValueConv => '$val / 12', + ValueConvInv => '$val * 12', + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + }, + 0x0f => { + Name => 'MinFocalLength', + Condition => '$$self{OldLensData}', + %nikonFocalConversions, + }, + 0x10 => { + Name => 'MaxFocalLength', + Condition => '$$self{OldLensData}', + %nikonFocalConversions, + }, + 0x11 => { + Name => 'MaxApertureAtMinFocal', + Condition => '$$self{OldLensData}', + %nikonApertureConversions, + }, + 0x12 => { + Name => 'MaxApertureAtMaxFocal', + Condition => '$$self{OldLensData}', + %nikonApertureConversions, + }, + 0x13 => { + Name => 'MCUVersion', + Condition => '$$self{OldLensData}', + }, + 0x14 => { + Name => 'EffectiveMaxAperture', + Condition => '$$self{OldLensData}', + %nikonApertureConversions, + }, +# +# ---- new LensData tags used by Nikkor Z cameras (ref PH/28). ---- +# (some fields are strictly for Z-series lenses, others apply to legacy F-mount as well, ref 28) +# + 0x2f => { # look forward to see if new lens data exists... + Name => 'NewLensData', + Format => 'undef[17]', + RawConv => '$$self{NewLensData} = 1 unless $val =~ /^.\0+$/s; undef', + Hidden => 1, + }, + 0x30 => { #PH + Name => 'LensID', + Condition => '$$self{NewLensData}', + Notes => 'tags from here onward used for Nikkor Z lenses only', + Format => 'int16u', + PrintConv => { + 1 => 'Nikkor Z 24-70mm f/4 S', + 2 => 'Nikkor Z 14-30mm f/4 S', + 4 => 'Nikkor Z 35mm f/1.8 S', + 8 => 'Nikkor Z 58mm f/0.95 S Noct', #IB + 9 => 'Nikkor Z 50mm f/1.8 S', + 11 => 'Nikkor Z DX 16-50mm f/3.5-6.3 VR', + 12 => 'Nikkor Z DX 50-250mm f/4.5-6.3 VR', + 13 => 'Nikkor Z 24-70mm f/2.8 S', + 14 => 'Nikkor Z 85mm f/1.8 S', + 15 => 'Nikkor Z 24mm f/1.8 S', #IB + 16 => 'Nikkor Z 70-200mm f/2.8 VR S', #IB + 17 => 'Nikkor Z 20mm f/1.8 S', #IB + 18 => 'Nikkor Z 24-200mm f/4-6.3 VR', #IB + 21 => 'Nikkor Z 50mm f/1.2 S', #IB + 22 => 'Nikkor Z 24-50mm f/4-6.3', #IB + 23 => 'Nikkor Z 14-24mm f/2.8 S', #IB + 24 => 'Nikkor Z MC 105mm f/2.8 VR S', #IB + 27 => 'Nikkor Z MC 50mm f/2.8', #IB + 28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28 + 29 => 'Nikkor Z 28mm f/2.8', #IB + 30 => 'Nikkor Z 400mm f/2.8 TC VR S', #28 + 31 => 'Nikkor Z 24-120 f/4', #28 + 32 => 'Nikkor Z 800mm f/6.3 VR S', #28 + }, + }, + 0x35 => { #28 + Name => 'LensMountType', + RawConv => '$$self{LensMountType} = $val', # 0=> DSLR lens via FTZ style adapter; 1=> Native Z lens; + Format => 'int8u', + Unknown => 1, + PrintConv => { + 0 => 'F-mount Lens', + 1 => 'Z-mount Lens', + }, + }, + 0x36 => { #PH + Name => 'MaxAperture', + Condition => '$$self{NewLensData}', + Format => 'int16u', + Priority => 0, + ValueConv => '2**($val/384-1)', + ValueConvInv => '384*(log($val)/log(2)+1)', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x38 => { #PH + Name => 'FNumber', + Condition => '$$self{NewLensData}', + Format => 'int16u', + Priority => 0, + ValueConv => '2**($val/384-1)', + ValueConvInv => '384*(log($val)/log(2)+1)', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x3c => { #PH + Name => 'FocalLength', + Condition => '$$self{NewLensData}', + Format => 'int16u', + Priority => 0, + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + 0x4c => { #28 + Name => 'FocusDistanceRangeWidth', #reflects the number of discrete absolute lens positions that are mapped to the reported FocusDistance. Will be 1 near CFD reflecting very narrow focus distance bands (i.e., quite accurate). Near Infinity will be something like 32. Note: 0 at infinity. + Format => 'int8u', + Condition => '$$self{NewLensData} and $$self{LensMountType} == 1', + RawConv => '$$self{FocusDistanceRangeWidth} = $val', + Unknown => 1, + }, + 0x4e => { #28 + Name => 'FocusDistance', + Format => 'int16u', + Condition => '$$self{NewLensData} and $$self{LensMountType} == 1', + RawConv => '$val = $val/256', # 1st byte is the fractional component. This byte was not previously considered in the legacy calculation (which only used the 2nd byte). When 2nd byte < 80; distance is < 1 meter + ValueConv => '0.01 * 10**($val/40)', # in m + ValueConvInv => '$val>0 ? 40*log($val*100)/log(10) : 0', + PrintConv => q{ + $$self{FocusDistanceRangeWidth} == 0 ? "Inf" : $val < 1 ? $val < 0.35 ? sprintf("%.4f m", $val): sprintf("%.3f m", $val): sprintf("%.2f m", $val), #distances less than 35mm are quite accurate with increasingly less precision past 1m + }, + }, + 0x56 => { #28 + Name => 'LensDriveEnd', # byte contains: 1 at CFD/MOD; 2 at Infinity; 0 otherwise + Condition => '$$self{NewLensData} and $$self{LensMountType} == 1', + Format => 'int8u', + RawConv => 'unless ($$self{FocusDistanceRangeWidth} == 0 ) { if ($val == 0 ) {$$self{LensDriveEnd} = "No"} else { $$self{LensDriveEnd} = "CFD"}; } else{ $$self{LensDriveEnd} = "Inf"}', + Unknown => 1, + }, + 0x5a => { #28 + Name => 'LensPositionAbsolute', # <=0 at infinity. Typical value at CFD might be 58000. Only valid for Z-mount lenses. + Condition => '$$self{NewLensData} and $$self{LensMountType} == 1', + Format => 'int32s', + Unknown => 1, + }, +); + +# Unknown Nikon lens data (note: data may need decrypting after byte 4) +%Image::ExifTool::Nikon::LensDataUnknown = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x00 => { + Name => 'LensDataVersion', + Format => 'string[4]', + }, +); + +# shot information (encrypted in some cameras) - ref 18 +%Image::ExifTool::Nikon::ShotInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0 ], + NOTES => q{ + This information is encrypted for ShotInfoVersion 02xx, and some tags are + only valid for specific models. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + RawConv => '$$self{ShotInfoVersion} = $val; $val =~ /^\d+$/ ? $val : undef', + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + RawConv => '$val =~ /^\d\.\d+.$/ ? $val : undef', + }, + 0x10 => { + Name => 'DistortionControl', + Condition => '$$self{Model} =~ /P6000\b/', + Notes => 'P6000', + PrintConv => \%offOn, + }, + 0x66 => { + Name => 'VR_0x66', + Condition => '$$self{ShotInfoVersion} eq "0204"', + Format => 'int8u', + Unknown => 1, + Notes => 'D2X, D2Xs (unverified)', + PrintConv => { + 0 => 'Off', + 1 => 'On (normal)', + 2 => 'On (active)', + }, + }, + # 6a, 6e not correct for 0103 (D70), 0207 (D200) + 0x6a => { + Name => 'ShutterCount', + Condition => '$$self{ShotInfoVersion} eq "0204"', + Format => 'int32u', + Priority => 0, + Notes => 'D2X, D2Xs', + }, + 0x6e => { + Name => 'DeletedImageCount', + Condition => '$$self{ShotInfoVersion} eq "0204"', + Format => 'int32u', + Priority => 0, + Notes => 'D2X, D2Xs', + }, + 0x75 => { #JD + Name => 'VibrationReduction', + Condition => '$$self{ShotInfoVersion} eq "0207"', + Format => 'int8u', + Notes => 'D200', + PrintConv => { + 0 => 'Off', + # (not sure what the different values represent, but values + # of 1 and 2 have even been observed for non-VR lenses!) + 1 => 'On (1)', #PH + 2 => 'On (2)', #PH + 3 => 'On (3)', #PH (rare -- only seen once) + }, + }, + 0x82 => { # educated guess, needs verification + Name => 'VibrationReduction', + Condition => '$$self{ShotInfoVersion} eq "0204"', + Format => 'int8u', + Notes => 'D2X, D2Xs', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + # 0xac - int16u[600] TiffMeteringImage1: 30x20 image (ShotInfoVersion 0800, ref JR) + 0x157 => { #JD + Name => 'ShutterCount', + Condition => '$$self{ShotInfoVersion} eq "0205"', + Format => 'undef[2]', + Priority => 0, + Notes => 'D50', + # treat as a 2-byte big-endian integer + ValueConv => 'unpack("n", $val)', + ValueConvInv => 'pack("n",$val)', + }, + 0x1ae => { #JD + Name => 'VibrationReduction', + Condition => '$$self{ShotInfoVersion} eq "0205"', + Format => 'int8u', + Notes => 'D50', + PrintHex => 1, + PrintConv => { + 0x00 => 'n/a', + 0x0c => 'Off', + 0x0f => 'On', + }, + }, + 0x24d => { #PH + Name => 'ShutterCount', + Condition => '$$self{ShotInfoVersion} eq "0211"', + Notes => 'D60', + Format => 'int32u', + Priority => 0, + }, + # note: DecryptLen currently set to 0x251 + + # 0x55c - int16u[2400] TiffMeteringImage2: 60x40 image (ShotInfoVersion 0800, ref JR) + # 0x181c - int16u[1200] TiffMeteringImage?: 60x20 image for some NEF's (ShotInfoVersion 0800, ref JR) + # 0x217c - int16u[2400] TiffMeteringImage3: 60x40 image (ShotInfoVersion 0800, ref JR) + # 0x3d9c - int16u[2400] TiffMeteringImage4: 60x40 image (ShotInfoVersion 0800, ref JR) + # 0x59c0 - TiffMeteringImageWidth (ShotInfoVersion 0800, ref JR) + # 0x59c2 - TiffMeteringImageHeight (ShotInfoVersion 0800, ref JR) + # 0x59c4 - int16u[1800] TiffMeteringImage5: 30x20 RGB image (ShotInfoVersion 0800, ref JR) +); + +# shot information for D40 and D40X (encrypted) - ref PH +%Image::ExifTool::Nikon::ShotInfoD40 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 729 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are extracted from encrypted data in D40 and D40X images.', + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 582 => { + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + 586.1 => { #JD + Name => 'VibrationReduction', + Mask => 0x08, + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 729 => { #JD + Name => 'CustomSettingsD40', + Format => 'undef[12]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD40', + }, + }, + # note: DecryptLen currently set to 748 +); + +# shot information for D80 (encrypted) - ref JD +%Image::ExifTool::Nikon::ShotInfoD80 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 748 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are extracted from encrypted data in D80 images.', + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 586 => { + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + # split 590 into a few different tags + 590.1 => { + Name => 'Rotation', + Mask => 0x07, + PrintConv => { + 0 => 'Horizontal', + 1 => 'Rotate 270 CW', + 2 => 'Rotate 90 CW', + 3 => 'Rotate 180', + }, + }, + 590.2 => { + Name => 'VibrationReduction', + Mask => 0x18, + PrintConv => { + 0 => 'Off', + 3 => 'On', + }, + }, + 590.3 => { + Name => 'FlashFired', + Mask => 0xe0, + PrintConv => { BITMASK => { + 1 => 'Internal', + 2 => 'External', + }}, + }, + 708 => { + Name => 'NikonImageSize', + Mask => 0xf0, + PrintConv => { + 0 => 'Large (10.0 M)', + 1 => 'Medium (5.6 M)', + 2 => 'Small (2.5 M)', + }, + }, + 708.1 => { + Name => 'ImageQuality', + Mask => 0x0f, + PrintConv => { + 0 => 'NEF (RAW)', + 1 => 'JPEG Fine', + 2 => 'JPEG Normal', + 3 => 'JPEG Basic', + 4 => 'NEF (RAW) + JPEG Fine', + 5 => 'NEF (RAW) + JPEG Normal', + 6 => 'NEF (RAW) + JPEG Basic', + }, + }, + 748 => { #JD + Name => 'CustomSettingsD80', + Format => 'undef[17]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD80', + }, + }, + # note: DecryptLen currently set to 765 +); + +# shot information for D90 (encrypted) - ref PH +%Image::ExifTool::Nikon::ShotInfoD90 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 0x374 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are extracted from encrypted data in images from the D90 with + firmware 1.00. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + }, + 0x2b5 => { #JD (same value found at offset 0x39, 0x2bf, 0x346) + Name => 'ISO2', + ValueConv => '100*exp(($val/12-5)*log(2))', + ValueConvInv => '(log($val/100)/log(2)+5)*12', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 0x2d5 => { + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + 0x374 => { + Name => 'CustomSettingsD90', + Format => 'undef[36]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD90', + }, + }, + # note: DecryptLen currently set to 0x398 +); + +# shot information for the D3 firmware 0.37 and 1.00 (encrypted) - ref PH +%Image::ExifTool::Nikon::ShotInfoD3a = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 0x301 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are extracted from encrypted data in images from the D3 with + firmware 1.00 and earlier. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x256 => { #JD (same value found at offset 0x26b) + Name => 'ISO2', + ValueConv => '100*exp(($val/12-5)*log(2))', + ValueConvInv => '(log($val/100)/log(2)+5)*12', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 0x276 => { #JD + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + 723.1 => { + Name => 'NikonImageSize', + Mask => 0x18, + PrintConv => { + 0 => 'Large', + 1 => 'Medium', + 2 => 'Small', + }, + }, + 723.2 => { + Name => 'ImageQuality', + Mask => 0x07, + PrintConv => { + 0 => 'NEF (RAW) + JPEG Fine', + 1 => 'NEF (RAW) + JPEG Norm', + 2 => 'NEF (RAW) + JPEG Basic', + 3 => 'NEF (RAW)', + 4 => 'TIF (RGB)', + 5 => 'JPEG Fine', + 6 => 'JPEG Normal', + 7 => 'JPEG Basic', + }, + }, + 0x301 => { #(NC) + Name => 'CustomSettingsD3', + Format => 'undef[24]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD3', + }, + }, + # note: DecryptLen currently set to 0x318 +); + +# shot information for the D3 firmware 1.10, 2.00 and 2.01 (encrypted) - ref PH +%Image::ExifTool::Nikon::ShotInfoD3b = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 0x30a ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 4 ], + NOTES => q{ + These tags are extracted from encrypted data in images from the D3 with + firmware 1.10, 2.00, 2.01 and 2.02. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + RawConv => '$$self{FirmwareVersion} = $val', + }, + 0x10 => { #28 + Name => 'ImageArea', + PrintConv => { + 0 => 'FX (36.0 x 23.9 mm)', + 1 => 'DX (23.5 x 15.6 mm)', + 2 => '5:4 (30.0 x 23.9 mm)', + }, + }, + 0x25d => { + Name => 'ISO2', + ValueConv => '100*exp(($val/12-5)*log(2))', + ValueConvInv => '(log($val/100)/log(2)+5)*12', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 0x27d => { + Name => 'ShutterCount', + Condition => '$$self{FirmwareVersion} =~ /^1.01/', + Notes => 'firmware 1.10', + Format => 'int32u', + Priority => 0, + }, + 0x27f => { + Name => 'ShutterCount', + Condition => '$$self{FirmwareVersion} =~ /^2.0/', + Notes => 'firmware 2.00, 2.01 and 2.02', + Format => 'int32u', + Priority => 0, + }, + 732.1 => { #28 + Name => 'NikonImageSize', + Mask => 0x18, + PrintConv => { + 0 => 'Large', + 1 => 'Medium', + 2 => 'Small', + }, + }, + 732.2 => { #28 + Name => 'ImageQuality', + Mask => 0x07, + PrintConv => { + 0 => 'NEF (RAW) + JPEG Fine', + 1 => 'NEF (RAW) + JPEG Norm', + 2 => 'NEF (RAW) + JPEG Basic', + 3 => 'NEF (RAW)', + 4 => 'TIF (RGB)', + 5 => 'JPEG Fine', + 6 => 'JPEG Normal', + 7 => 'JPEG Basic', + }, + }, + 0x28a => { #28 + Name => 'PreFlashReturnStrength', + Notes => 'valid in TTL and TTL-BL flash control modes', + # this is used to set the flash power using this relationship + # for the SB-800 and SB-900: + # $val < 140 ? 2**(0.08372*$val-12.352) : $val + }, + 0x30a => { # tested with firmware 2.00 + Name => 'CustomSettingsD3', + Format => 'undef[24]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD3', + }, + }, + # note: DecryptLen currently set to 0x321 +); + +# shot information for the D3X firmware 1.00 (encrypted) - ref PH +%Image::ExifTool::Nikon::ShotInfoD3X = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 0x30b ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are extracted from encrypted data in images from the D3X with + firmware 1.00. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + }, + 0x25d => { + Name => 'ISO2', + ValueConv => '100*exp(($val/12-5)*log(2))', + ValueConvInv => '(log($val/100)/log(2)+5)*12', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 0x280 => { + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + 0x30b => { #(NC) + Name => 'CustomSettingsD3X', + Format => 'undef[24]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD3', + }, + }, + # note: DecryptLen currently set to 0x323 +); + +# shot information for the D3S firmware 0.16 and 1.00 (encrypted) - ref PH +%Image::ExifTool::Nikon::ShotInfoD3S = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 0x2ce ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are extracted from encrypted data in images from the D3S with + firmware 1.00 and earlier. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + }, + 0x10 => { #28 + Name => 'ImageArea', + PrintConv => { + 0 => 'FX (36x24)', + 1 => 'DX (24x16)', + 2 => '5:4 (30x24)', + 3 => '1.2x (30x20)', + }, + }, + 0x221 => { + Name => 'ISO2', + ValueConv => '100*exp(($val/12-5)*log(2))', + ValueConvInv => '(log($val/100)/log(2)+5)*12', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 0x242 => { + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + 0x2ce => { #(NC) + Name => 'CustomSettingsD3S', + Format => 'undef[27]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD3', + }, + }, + # note: DecryptLen currently set to 0x2e9 +); + +# shot information for the D300 firmware 1.00 (encrypted) - ref JD +%Image::ExifTool::Nikon::ShotInfoD300a = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 790 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are extracted from encrypted data in images from the D300 with + firmware 1.00 and earlier. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 604 => { + Name => 'ISO2', + ValueConv => '100*exp(($val/12-5)*log(2))', + ValueConvInv => '(log($val/100)/log(2)+5)*12', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 633 => { + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + 721 => { #PH + Name => 'AFFineTuneAdj', + Format => 'int16u', + PrintHex => 1, + PrintConvColumns => 3, + # thanks to Neil Nappe for the samples to decode this!... + # (have seen various unknown values here when flash is enabled, but + # these are yet to be decoded: 0x2e,0x619,0xd0d,0x103a,0x2029 - PH) + PrintConv => { + 0x403e => '+20', + 0x303e => '+19', + 0x203e => '+18', + 0x103e => '+17', + 0x003e => '+16', + 0xe03d => '+15', + 0xc03d => '+14', + 0xa03d => '+13', + 0x803d => '+12', + 0x603d => '+11', + 0x403d => '+10', + 0x203d => '+9', + 0x003d => '+8', + 0xc03c => '+7', + 0x803c => '+6', + 0x403c => '+5', + 0x003c => '+4', + 0x803b => '+3', + 0x003b => '+2', + 0x003a => '+1', + 0x0000 => '0', + 0x00c6 => '-1', + 0x00c5 => '-2', + 0x80c5 => '-3', + 0x00c4 => '-4', + 0x40c4 => '-5', + 0x80c4 => '-6', + 0xc0c4 => '-7', + 0x00c3 => '-8', + 0x20c3 => '-9', + 0x40c3 => '-10', + 0x60c3 => '-11', + 0x80c3 => '-12', + 0xa0c3 => '-13', + 0xc0c3 => '-14', + 0xe0c3 => '-15', + 0x00c2 => '-16', + 0x10c2 => '-17', + 0x20c2 => '-18', + 0x30c2 => '-19', + 0x40c2 => '-20', + }, + }, + 790 => { + Name => 'CustomSettingsD300', + Format => 'undef[24]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD3', + }, + }, + # note: DecryptLen currently set to 813 +); + +# shot information for the D300 firmware 1.10 (encrypted) - ref PH +%Image::ExifTool::Nikon::ShotInfoD300b = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + DATAMEMBER => [ 4 ], + IS_SUBDIR => [ 802 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are extracted from encrypted data in images from the D300 with + firmware 1.10. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { #PH + Name => 'FirmwareVersion', + DataMember => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + RawConv => '$$self{FirmwareVersion} = $val', + }, + 613 => { + Name => 'ISO2', + ValueConv => '100*exp(($val/12-5)*log(2))', + ValueConvInv => '(log($val/100)/log(2)+5)*12', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 644 => { + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + 732 => [{ + Name => 'AFFineTuneAdj', + Condition => '$$self{FirmwareVersion} eq "1.10B"', + Notes => 'firmware version 1.10B', + Format => 'int16u', + PrintHex => 1, + PrintConvColumns => 3, + # thanks to Michael Tapes for the samples to decode this!... + PrintConv => { + 0xe03e => '+20', + 0xc83e => '+19', + 0xb03e => '+18', + 0x983e => '+17', + 0x803e => '+16', + 0x683e => '+15', + 0x503e => '+14', + 0x383e => '+13', + 0x203e => '+12', + 0x083e => '+11', + 0xe03d => '+10', + 0xb03d => '+9', + 0x803d => '+8', + 0x503d => '+7', + 0x203d => '+6', + 0xe03c => '+5', + 0x803c => '+4', + 0x203c => '+3', + 0x803b => '+2', + 0x803a => '+1', + 0x0000 => '0', + 0x80c6 => '-1', + 0x80c5 => '-2', + 0x20c4 => '-3', + 0x80c4 => '-4', + 0xe0c4 => '-5', + 0x20c3 => '-6', + 0x50c3 => '-7', + 0x80c3 => '-8', + 0xb0c3 => '-9', + 0xe0c3 => '-10', + 0x08c2 => '-11', + 0x20c2 => '-12', + 0x38c2 => '-13', + 0x50c2 => '-14', + 0x68c2 => '-15', + 0x80c2 => '-16', + 0x98c2 => '-17', + 0xb0c2 => '-18', + 0xc8c2 => '-19', + 0xe0c2 => '-20', + }, + },{ + Name => 'AFFineTuneAdj', + Notes => 'other versions', + Format => 'int16u', + PrintHex => 1, + PrintConvColumns => 3, + # thanks to Stuart Solomon for the samples to decode this!... + PrintConv => { + 0x903e => '+20', + 0x7c3e => '+19', + 0x683e => '+18', + 0x543e => '+17', + 0x403e => '+16', + 0x2c3e => '+15', + 0x183e => '+14', + 0x043e => '+13', + 0xe03d => '+12', + 0xb83d => '+11', + 0x903d => '+10', + 0x683d => '+9', + 0x403d => '+8', + 0x183d => '+7', + 0xe03c => '+6', + 0x903c => '+5', + 0x403c => '+4', + 0xe03b => '+3', + 0x403b => '+2', + 0x403a => '+1', + 0x0000 => '0', + 0x40c6 => '-1', + 0x40c5 => '-2', + 0xe0c5 => '-3', + 0x40c4 => '-4', + 0x90c4 => '-5', + 0xe0c4 => '-6', + 0x18c3 => '-7', + 0x40c3 => '-8', + 0x68c3 => '-9', + 0x90c3 => '-10', + 0xb8c3 => '-11', + 0xe0c3 => '-12', + 0x04c2 => '-13', + 0x18c2 => '-14', + 0x2cc2 => '-15', + 0x40c2 => '-16', + 0x54c2 => '-17', + 0x68c2 => '-18', + 0x7cc2 => '-19', + 0x90c2 => '-20', + }, + }], + 802 => { + Name => 'CustomSettingsD300', + Format => 'undef[24]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD3', + }, + }, + # note: DecryptLen currently set to 825 +); + +# shot information for the D300S firmware 1.00 (encrypted) - ref PH +%Image::ExifTool::Nikon::ShotInfoD300S = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 804 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are extracted from encrypted data in images from the D300S with + firmware 1.00. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + }, + 613 => { + Name => 'ISO2', + ValueConv => '100*exp(($val/12-5)*log(2))', + ValueConvInv => '(log($val/100)/log(2)+5)*12', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 646 => { + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + 804 => { #(NC) + Name => 'CustomSettingsD300S', + Format => 'undef[24]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD3', + }, + }, + # note: DecryptLen currently set to 827 +); + +# shot information for the D700 firmware 1.02f (encrypted) - ref 29 +%Image::ExifTool::Nikon::ShotInfoD700 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 804 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are extracted from encrypted data in images from the D700 with + firmware 1.02f. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + }, + 613 => { # 0x265 + Name => 'ISO2', + ValueConv => '100*exp(($val/12-5)*log(2))', + ValueConvInv => '(log($val/100)/log(2)+5)*12', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 0x287 => { + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + 804 => { # 0x324 (NC) + Name => 'CustomSettingsD700', + Format => 'undef[48]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD700', + }, + }, + # note: DecryptLen currently set to 852 +); + +# shot information for the D5000 firmware 1.00 (encrypted) - ref PH +%Image::ExifTool::Nikon::ShotInfoD5000 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 0x378 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are extracted from encrypted data in images from the D5000 with + firmware 1.00. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + }, + 0x2b5 => { # (also found at 0x2c0) + Name => 'ISO2', + ValueConv => '100*exp(($val/12-5)*log(2))', + ValueConvInv => '(log($val/100)/log(2)+5)*12', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 0x2d6 => { + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + 0x378 => { + Name => 'CustomSettingsD5000', + Format => 'undef[34]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD5000', + }, + }, + # note: DecryptLen currently set to 0x39a +); + +# shot information for the D5100 firmware 1.00f (encrypted) - ref PH +%Image::ExifTool::Nikon::ShotInfoD5100 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 0x407 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + }, + 0x321 => { + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + 0x407 => { + Name => 'CustomSettingsD5100', + Format => 'undef[34]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD5100', + }, + }, + # note: DecryptLen currently set to 0x430 +); + +# shot information for the D5200 firmware 1.00 (encrypted) - ref PH +%Image::ExifTool::Nikon::ShotInfoD5200 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 0xcd5 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + }, + # 0x101 - 2=VR Off, 3=VR On + # 0x13d - 0=VR On, 1=VR Off + 0xbd8 => { + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + # 0xcd2 - 12=VR Off, 15=VR On + 0xcd5 => { + Name => 'CustomSettingsD5200', + Format => 'undef[34]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD5200', + }, + }, + # note: DecryptLen currently set to 0xd00 +); + +# shot information for the D7000 firmware 1.01d (encrypted) - ref 29 +%Image::ExifTool::Nikon::ShotInfoD7000 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 1028 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are extracted from encrypted data in images from the D7000 with + firmware 1.01b. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + }, + #613 => { + # Name => 'ISO2', + # ValueConv => '100*exp(($val/12-5)*log(2))', + # ValueConvInv => '(log($val/100)/log(2)+5)*12', + # PrintConv => 'int($val + 0.5)', + # PrintConvInv => '$val', + #}, + 0x320 => { # 800 + Name => 'ShutterCount', + Format => 'int32u', + Priority => 0, + }, + 0x404 => { # 1028 (NC) + Name => 'CustomSettingsD7000', + Format => 'undef[48]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD7000', + }, + }, +); + +# shot information for the D800 firmware 1.01a (encrypted) - ref PH +%Image::ExifTool::Nikon::ShotInfoD800 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 0x6ec ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are extracted from encrypted data in images from the D800.', + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + }, + 0x4c0 => { + Name => 'RepeatingFlashOutputExternal', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val > 0 ? -6*log($val)/log(2) : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x4c2 => { + Name => 'RepeatingFlashRateExternal', + DelValue => 0, + RawConv => '$val || undef', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 0x4c3 => { + Name => 'RepeatingFlashCountExternal', + DelValue => 0, + RawConv => '$val || undef', + }, + 0x4d2 => { + Name => 'FlashExposureComp2', + Notes => 'includes the effect of flash bracketing', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + # 0x4d4 - FEC again, doesn't include bracketing this time (internal?) +# (not fully decoded, and duplicated in custom settings) +# 0x4d9 => { +# Name => 'FlashControlBuilt-in', +# PrintConv => { +# 1 => 'TTL', +# 6 => 'Manual', +# 7 => 'Repeating Flash', +# }, +# }, + 0x4da => { + Name => 'RepeatingFlashRateBuilt-in', + DelValue => 0, + RawConv => '$val || undef', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 0x4db => { + Name => 'RepeatingFlashCountBuilt-in', + DelValue => 0, + RawConv => '$val || undef', + }, +# 1294.1 => { # (0x4dc) +# Name => 'FlashModeBuilt-in', +# Mask => 0x0f, +# PrintConv => { +# 0 => 'Front-curtain Sync', +# 1 => 'Red-eye Reduction', +# 2 => 'Redy-eye Reduction with Slow Sync', +# 3 => 'Slow Sync', +# 4 => 'Rear-curtain Sync', +# 5 => 'Rear-curtain Sync 2', # got this in P exposure mode +# }, +# }, +# 1294.2 => { # (0x4dc) +# Name => 'ExposureMode2', +# Mask => 0xf0, +# PrintConv => { +# 0 => 'Program', +# 1 => 'Aperture Priority', +# 3 => 'Manual', +# }, +# }, + # 0x511 - related to FlashSyncSpeed + 0x51c => 'SequenceNumber', + # 0x4ba+0x63 - interesting + # 0x4ba+0x68 - general downward trend + # 0x4ba+0x7b - FlashControlBuilt-in: 8=TTL, 72=Manual +# (not reliable) +# 1346.1 => { # (0x542) +# Name => 'RepeatingFlashOutputBuilt-in', +# DelValue => 112, +# Mask => 0xfc, +# RawConv => '$val == 0x1c ? undef : 2 ** ($val/3-7)', +# ValueConvInv => '$val > 0 ? (log($val)/log(2)+7)*3 : 0', +# PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', +# PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', +# }, + 0x5fb => { + Name => 'ShutterCount', + Format => 'int32u', + }, + 0x6ec => { + Name => 'CustomSettingsD800', + Format => 'undef[48]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD800', + }, + }, + # note: DecryptLen currently set to 0x720 +); + +# shot information for the D5 firmware 1.10a and D500 firmware 1.01 (encrypted) - ref 28 +%Image::ExifTool::Nikon::ShotInfoD500 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + DATAMEMBER => [ 0x04, 0x10, 0x14, 0x2c, 0x50, 0x58, 0xa0, 0xa8, 0xb0, + 0x07b0, 0x086c, 0x0e7c, 0x0eea, 0x2c23, 0x2c8f ], + IS_SUBDIR => [ 0x0eeb ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are extracted from encrypted data in images from the D5 and D500.', + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + DataMember => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + RawConv => '$$self{FirmwareVersion} = $val', + }, + 0x10 => { + Name => 'RotationInfoOffset', + DataMember => 'RotationInfoOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{RotationInfoOffset} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0x14 => { + Name => 'JPGInfoOffset', + DataMember => 'JPGInfoOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{JPGInfoOffset} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0x2c => { + Name => 'BracketingInfoOffset', + DataMember => 'BracketingInfoOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{BracketingInfoOffset} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0x50 => { + Name => 'ShootingMenuOffset', + DataMember => 'ShootingMenuOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{ShootingMenuOffset} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0x58 => { + Name => 'CustomSettingsOffset', + DataMember => 'CustomSettingsOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{CustomSettingsOffset} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0xa0 => { + Name => 'OrientationOffset', + DataMember => 'OrientationOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0xa8 => { + Name => 'OtherOffset', + DataMember => 'OtherOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{OtherOffset} = $val || 0x10000000; undef', # (ignore if 0) + }, +# +# Tag ID's below are the offsets for a D500 JPEG image, but these offsets change +# for various image types according to the offset table above +# +### 0xb0 - RotationInfo start + 0xb0 => { + Name => 'Hook1', + Hidden => 1, + RawConv => 'undef', + # account for variable location of Rotation data + Hook => '$varSize = $$self{RotationInfoOffset} - 0xb0', + }, + 0xca => { + Name => 'Rotation', + Mask => 0x03, + PrintConv => { + 0 => 'Horizontal', + 1 => 'Rotate 270 CW', + 2 => 'Rotate 90 CW', + 3 => 'Rotate 180', + }, + }, + 0x0d0 => { + Name => 'Interval', + # prior version of the d% firmware do not support this tag, nor does the D500 (at least thru firmware 1.3) + Condition => '$$self{Model} eq "NIKON D5" and $$self{FirmwareVersion} ge "1.40"', + PrintConv => '$val > 0 ? sprintf("%.0f", $val) : ""', + }, + 0x0d4 => { + Name => 'IntervalFrame', + # prior version of the d% firmware do not support this tag, nor does the D500 (at least thru firmware 1.3) + Condition => '$$self{Model} eq "NIKON D5" and $$self{FirmwareVersion} ge "1.40"', + PrintConv => '$val > 0 ? sprintf("%.0f", $val) : ""', + }, + 0x05e2 => { + Name => 'FlickerReductionIndicator', + Mask => 0x01, + PrintConv => { 0 => 'On', 1 => 'Off' }, + }, +### 0x07b0 - JPEGInfo start + 0x07b0 => { + Name => 'Hook2', + Hidden => 1, + RawConv => 'undef', + # account for variable location of Shooting Menu data + Hook => '$varSize = $$self{JPGInfoOffset} - 0x07b0', + }, + 0x07d4 => { + Name => 'JPGCompression', + Mask => 0x01, + PrintConv => { + 0 => 'Size Priority', + 1 => 'Optimal Quality', + }, + }, +### 0x0830 - ? start +### 0x086c - BracketingInfo start + 0x086c => { + Name => 'Hook3', + Hidden => 1, + RawConv => 'undef', + # account for variable location of Shooting Menu data + Hook => '$varSize = $$self{BracketingInfoOffset} - 0x086c', + }, + 0x087b => { + Name => 'AEBracketingSteps', + Condition => '$$self{FILE_TYPE} ne "TIFF"', # (covers NEF and TIFF) + Mask => 0xff, + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => { + 0x00 => 'AE Bracketing Disabled', + 0x20 => 'AE Bracketing Disabled', + 0x30 => 'AE Bracketing Disabled', + 0x40 => 'AE Bracketing Disabled', + 0x50 => 'AE Bracketing Disabled', + 0x81 => '+3F0.3', + 0x82 => '-3F0.3', + 0x83 => '+2F0.3', + 0x84 => '-2F0.3', + 0x85 => '3F0.3', + 0x86 => '5F0.3', + 0x87 => '7F0.3', + 0x88 => '9F0.3', + 0x91 => '+3F0.5', + 0x92 => '-3F0.5', + 0x93 => '+2F0.5', + 0x94 => '-2F0.5', + 0x95 => '3F0.5', + 0x96 => '5F0.5', + 0x97 => '7F0.5', + 0x98 => '9F0.5', + 0xa1 => '+3F0.7', + 0xa2 => '-3F0.7', + 0xa3 => '+2F0.7', + 0xa4 => '-2F0.7', + 0xa5 => '3F0.7', + 0xa6 => '5F0.7', + 0xa7 => '7F0.7', + 0xa8 => '9F0.7', + 0xb1 => '+3F1', + 0xb2 => '-3F1', + 0xb3 => '+2F1', + 0xb4 => '-2F1', + 0xb5 => '3F1', + 0xb6 => '5F1', + 0xb7 => '7F1', + 0xb8 => '9F1', + 0xc1 => '+3F2', + 0xc2 => '-3F2', + 0xc3 => '+2F2', + 0xc4 => '-2F2', + 0xc5 => '3F2', + 0xc6 => '5F2', + 0xd1 => '+3F3', + 0xd2 => '-3F3', + 0xd3 => '+2F3', + 0xd4 => '-2F3', + 0xd5 => '3F3', + 0xd6 => '5F3', + }, + }, + 0x087c => { + Name => 'WBBracketingSteps', + Condition => '$$self{FILE_TYPE} ne "TIFF"', # (covers NEF and TIFF) + Mask => 0xff, + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => { + 0x00 => 'WB Bracketing Disabled', + 0x01 => 'b3F 1', + 0x02 => 'A3F 1', + 0x03 => 'b2F 1', + 0x04 => 'A2F 1', + 0x05 => '3F 1', + 0x06 => '5F 1', + 0x07 => '7F 1', + 0x08 => '9F 1', + 0x10 => '0F 2', + 0x11 => 'b3F 2', + 0x12 => 'A3F 2', + 0x13 => 'b2F 2', + 0x14 => 'A2F 2', + 0x15 => '3F 2', + 0x16 => '5F 2', + 0x17 => '7F 2', + 0x18 => '9F 2', + 0x20 => '0F 3', + 0x21 => 'b3F 3', + 0x22 => 'A3F 3', + 0x23 => 'b2F 3', + 0x24 => 'A2F 3', + 0x25 => '3F 3', + 0x26 => '5F 3', + 0x27 => '7F 3', + 0x28 => '9F 3', + 0x22 => 'A3F 3', + 0x23 => 'b2F 3', + 0x24 => 'A2F 3', + 0x25 => '3F 3', + 0x26 => '5F 3', + 0x27 => '7F 3', + 0x28 => '9F 3', + }, + }, + 0x0883 => { + Name => 'ADLBracketingStep', + Mask => 0xf0, + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Normal', + 3 => 'High', + 4 => 'Extra High', + 8 => 'Auto', + }, + }, + 0x0884 => { + Name => 'ADLBracketingType', + Mask => 0x0f, + PrintConv => { + 0 => 'Off', + 1 => '2 Shots', + 2 => '3 Shots', + 3 => '4 Shots', + 4 => '5 Shots', + }, + }, +### 0x0887 - ? start +### 0x089f - ? start +### 0x0929 - ? start +### 0x09c9 - ? start +### 0x0ac5 - ? start +### 0x0bc1 - ? start +### 0x0cbd - ? start +### 0x0d98 - ? start +### 0x0e7d - ShootingMenuOffset start + 0x0e7c => { + Name => 'Hook4', + Hidden => 1, + RawConv => 'undef', + # account for variable location of Shooting Menu data + Hook => '$varSize = $$self{ShootingMenuOffset} - 0x0e7d', + }, + 0x0e7d => { + Name => 'PhotoShootingMenuBank', + Mask => 0x03, + PrintConv => { + 0 => 'A', + 1 => 'B', + 2 => 'C', + 3 => 'D', + }, + }, + 0x0e7f => { + Name => 'PrimarySlot', + Condition => '$$self{Model} =~ /\bD500\b/', + Notes => 'D500 only', + Mask => 0x80, + PrintConv => { + 0 => 'XQD Card', + 1 => 'SD Card', + }, + }, + 0x0e81 => { + Name => 'ISOAutoShutterTime', + Mask => 0x3f, + PrintConv => { + 0 => '1/4000 s', + 1 => '1/3200 s', + 2 => '1/2500 s', + 3 => '1/2000 s', + 4 => '1/1600 s', + 5 => '1/1250 s', + 6 => '1/1000 s', + 7 => '1/800 s', + 8 => '1/640 s', + 9 => '1/500 s', + 10 => '1/400 s', + 11 => '1/320 s', + 12 => '1/250 s', + 13 => '1/200 s', + 14 => '1/160 s', + 15 => '1/125 s', + 16 => '1/100 s', + 17 => '1/80 s', + 18 => '1/60 s', + 19 => '1/50 s', + 20 => '1/40 s', + 21 => '1/30 s', + 22 => '1/15 s', + 23 => '1/8 s', + 24 => '1/4 s', + 25 => '1/2 s', + 26 => '1 s', + 27 => '2 s', + 28 => '4 s', + 29 => '8 s', + 30 => '15 s', + 31 => '30 s', + 32 => 'Auto (Slowest)', + 33 => 'Auto (Slower)', + 34 => 'Auto', + 35 => 'Auto (Faster)', + 36 => 'Auto (Fastest)', + }, + }, + 0x0e82 => { + Name => 'ISOAutoHiLimit', + Mask => 0xff, + PrintHex => 1, + PrintConv => { + 0x24 => 'ISO 200', + 0x26 => 'ISO 250', + 0x27 => 'ISO 280', + 0x28 => 'ISO 320', + 0x2a => 'ISO 400', + 0x2c => 'ISO 500', + 0x2d => 'ISO 560', + 0x2e => 'ISO 640', + 0x30 => 'ISO 800', + 0x32 => 'ISO 1000', + 0x33 => 'ISO 1100', + 0x34 => 'ISO 1250', + 0x36 => 'ISO 1600', + 0x38 => 'ISO 2000', + 0x39 => 'ISO 2200', + 0x3a => 'ISO 2500', + 0x3c => 'ISO 3200', + 0x3e => 'ISO 4000', + 0x3f => 'ISO 4500', + 0x40 => 'ISO 5000', + 0x42 => 'ISO 6400', + 0x44 => 'ISO 8000', + 0x45 => 'ISO 9000', + 0x46 => 'ISO 10000', + 0x48 => 'ISO 12800', + 0x4a => 'ISO 16000', + 0x4b => 'ISO 18000', + 0x4c => 'ISO 20000', + 0x4e => 'ISO 25600', + 0x50 => 'ISO 32000', + 0x51 => 'ISO 36000', + 0x52 => 'ISO 40000', + 0x54 => 'ISO 51200', + 0x56 => 'ISO Hi 0.3', + 0x57 => 'ISO Hi 0.5', + 0x58 => 'ISO Hi 0.7', + 0x5a => 'ISO Hi 1.0', + 0x60 => 'ISO Hi 2.0', + 0x66 => 'ISO Hi 3.0', + 0x6c => 'ISO Hi 4.0', + 0x72 => 'ISO Hi 5.0', + }, + }, + 0x0e84 => { + Name => 'FlickerReduction', + Mask => 0x20, + PrintConv => { + 0 => 'Enable', + 1 => 'Disable', + }, + }, + 3716.1 => { # (0x0e84) + Name => 'PhotoShootingMenuBankImageArea', + Mask => 0x07, + PrintConv => { + 0 => 'FX (36x24)', + 1 => 'DX (24x16)', + 2 => '5:4 (30x24)', + 3 => '1.2x (30x20)', + 4 => '1.3x (18x12)', + }, + }, +### 0x0ec4 - ? start +### 0x0eeb - CustomSettings start + 0x0eea => { + Name => 'Hook5', + Hidden => 1, + RawConv => 'undef', + # account for variable location of CustomSettings data + Hook => '$varSize = $$self{CustomSettingsOffset} - 0x0eeb', + }, + 0x0eeb => [{ + Name => 'CustomSettingsD5', + Condition => '$$self{Model} =~ /\bD5\b/', + Format => 'undef[90]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD5', + }, + },{ + Name => 'CustomSettingsD500', + Format => 'undef[90]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD500', + }, + }], +# 0x0f68 => { #this decode works, but involves more bits than should be necessary +# Name => 'ShutterTrigger', +# Mask => 0xff, +# PrintConv => { +# 0 => 'Timer', +# 15 => 'Cable Release/Remote', +# 195 => 'Shutter Button', +# }, +# }, +### 0x2c24 - OrientationInfo start (D5 firmware 1.10b) + 0x2c23 => { + Name => 'Hook6', + Hidden => 1, + RawConv => 'undef', + # account for variable location of OrientationInfo data + Hook => '$varSize = $$self{OrientationOffset} - 0x2c24', + }, + 0x2c24 => { + Name => 'RollAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of clockwise camera roll', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0x2c28 => { + Name => 'PitchAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of upward camera tilt', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0x2c2c => { + Name => 'YawAngle', + Format => 'fixed32u', + Notes => 'the camera yaw angle when shooting in portrait orientation', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, +### 0x2c90 - OtherInfo start (D500 firmware 1.20d) + 0x2c8f => { + Name => 'Hook7', + Hidden => 1, + RawConv => 'undef', + # account for variable location of OtherInfo data + Hook => '$varSize = $$self{OtherOffset} - 0x2c90', + }, + # (needs testing) + #0x2cb2 => { + # Name => 'ExtendedPhotoShootingBanks', + # Mask => 0x01, + # PrintConv => { + # 0 => 'On', + # 1 => 'Off', + # }, + #}, + # (may not be reliable and is found elsewhere) + #0x2ea2 => { + # Name => 'Rotation', + # Condition => '$$self{Model} =~ /\bD500\b/', + # Notes => 'D500 firmware 1.1x', + # Mask => 0x30, + # PrintConv => { + # 0 => 'Horizontal', + # 1 => 'Rotate 270 CW', + # 2 => 'Rotate 90 CW', + # 3 => 'Rotate 180', + # }, + #}, + 0x2ea4 => { #PH + Name => 'NikonMeteringMode', + Condition => '$$self{Model} =~ /\bD500\b/', # (didn't seem to work for D5, but I need more samples) + Notes => 'D500 only', + Mask => 0x03, + PrintConv => { + 0 => 'Matrix', + 1 => 'Center', + 2 => 'Spot', + 3 => 'Highlight' + }, + }, + # note: DecryptLen currently set to OtherOffset + 0x2ea5 - 0x2c90 +); + +# shot information for the D6 firmware 1.00 (encrypted) - ref 28 +%Image::ExifTool::Nikon::ShotInfoD6 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + DATAMEMBER => [ 0x30, 0x60, 0x9c, 0xa4, 0x75e7, 0x760c, 0x7610, 0xc219, 0xc292, 0xc40e, 0xc412, 0xc4a6, 0xc4be ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are extracted from encrypted data in images from the D6.', + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[8]', + Writable => 0, + }, + 0x24 => { + Name => 'NumberOffsets', # (number of entries in offset table. offsets are from start of ShotInfo data) + DataMember => 'NumberOffsets', + Format => 'int32u', + Writable => 0, + Hidden => 1, + }, + 0x30 => { + Name => 'Offset3', + DataMember => 'Offset3', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{Offset3} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0x60 => { + Name => 'Offset15', + DataMember => 'Offset15', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{Offset15} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0x9c => { + Name => 'OrientationOffset', + DataMember => 'OrientationOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0xa4 => { + Name => 'Offset32', + DataMember => 'Offset32', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{Offset32} = $val || 0x10000000; undef', # (ignore if 0) + }, + ### 0x75e8 - Offset3 info start (D6 firmware 1.33) + 0x75e7 => { + Name => 'Hook1', + Hidden => 1, + RawConv => 'undef', + # account for variable location of Offset5 data + Hook => '$varSize = $$self{Offset3} - 0x75e8', + }, + 0x760c => { + Name => 'IntervalShooting', + RawConv => '$$self{IntervalShooting} = $val', + Format => 'int16u', + PrintConv => q{ + return 'Off' if $val == 0 ; + my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}); #something like "Interval 1 of 3" + my $f = $$self{IntervalShootingShotsPerInterval} > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}): '' ; #something like "Frame 1 of 3" or blank + return "On: $i$f" + #$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}), + }, + }, + 0x7610 => { + Name => 'IntervalFrame', + RawConv => '$$self{IntervalFrame} = $val', + Condition => '$$self{IntervalShooting} > 0', + Format => 'int16u', + Hidden => 1, + }, +### 0xc21a - OrientationInfo start (D6 firmware 1.00) (0xc952 for firmware 1.33) + 0xc219 => { + Name => 'Hook2', + Hidden => 1, + RawConv => 'undef', + # account for variable location of OrientationInfo data + Hook => '$varSize = $$self{OrientationOffset} - 0xc21a', + }, + 0xc21a => { + Name => 'RollAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of clockwise camera roll', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0xc21e => { + Name => 'PitchAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of upward camera tilt', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0xc222 => { + Name => 'YawAngle', + Format => 'fixed32u', + Notes => 'the camera yaw angle when shooting in portrait orientation', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + ### 0xc9c6 - Offset32 start (D6 firmware 1.33) + 0xc292 => { + Name => 'Hook3', + Hidden => 1, + RawConv => 'undef', + # account for variable location of data + Hook => '$varSize = $$self{Offset32} - 0xc292', + }, + 0xc40e => { + Name => 'Intervals', + Format => 'int32u', + RawConv => '$$self{IntervalShootingIntervals} = $val', + Condition => '$$self{IntervalShooting} > 0', + }, + 0xc412 => { + Name => 'ShotsPerInterval', + Format => 'int32u', + RawConv => '$$self{IntervalShootingShotsPerInterval} = $val', + Condition => '$$self{IntervalShooting} > 0', + }, + 0xc416 => { + Name => 'IntervalExposureSmoothing', + Condition => '$$self{IntervalShooting} > 0', + Format => 'int8u', + PrintConv => \%offOn, + }, + 0xc418 => { + Name => 'IntervalPriority', + Condition => '$$self{IntervalShooting} > 0', + Format => 'int8u', + PrintConv => \%offOn, + }, + 0xc43a => { + Name => 'FocusShiftNumberShots', + }, + 0xc43e => { + Name => 'FocusShiftStepWidth', + }, + 0xc442 => { + Name => 'FocusShiftInterval', + PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)', + }, + 0xc446 => { + Name => 'FocusShiftExposureLock', + PrintConv => \%offOn, + }, + #0xc49c => HighISONoiseReduction + 0xc4a0 => { + Name => 'DiffractionCompensation', + Format => 'int8u', + PrintConv => \%offOn, + }, + #0xc4a1 => {Name => 'FlickerReductionShooting',}, #redundant with tag in NikonSettings + 0xc4a6 => { + Name => 'FlashControlMode', #this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu + RawConv => '$$self{FlashControlMode} = $val', + PrintConv => { + 0 => 'TTL', + 1 => 'Auto External Flash', + 2 => 'GN (distance priority)', + 3 => 'Manual', + 4 => 'Repeating Flash', + }, + }, + 0xc4ac => { + Name => 'FlashGNDistance', + Condition => '$$self{FlashControlMode} == 2', + Unknown => 1, + ValueConv => '$val + 3', + PrintConv => \%flashGNDistance, + }, + 0xc4b0 => { + Name => 'FlashOutput', #range[0,24] with 0=>Full; 1=>50%; then decreasing flash power in 1/3 stops to 0.39% (1/256 full power). #also found in FlashInfoUnknown at offset 0x0a (with different mappings) + Condition => '$$self{FlashControlMode} >= 3', + Unknown => 1, + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + 0xc4ba => { + Name => 'FlashRemoteControl', + Unknown => 1, + PrintConv => { + 0 => 'Group', + 1 => 'Quick Wireless', + 2 => 'Remote Repeating', + }, + }, + 0xc4be => { + Name => 'FlashMasterControlMode', #tag name chosen for compatibility with those found in FlashInfo0102 & FlashInfo0103 + RawConv => '$$self{FlashGroupOptionsMasterMode} = $val', + PrintConv => \%flashGroupOptionsMode, + }, + 0xc4c0 => { + Name => 'FlashMasterCompensation', + Unknown => 1, + Format => 'int8s', + Condition => '$$self{FlashGroupOptionsMasterMode} != 3', #other than 'Off' + ValueConv => '$val/6', + ValueConvInv => '6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 0xc4c4 => { + Name => 'FlashMasterOutput', + Unknown => 1, + Condition => '$$self{FlashGroupOptionsMasterMode} == 1', #only for Mode=M + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + 0xc4c6 => { + Name => 'FlashWirelessOption', + Unknown => 1, + PrintConv => { + 0 => 'Optical AWL', + 1 => 'Off', + }, + }, + 0xc55c => { + Name => 'MovieType', + Unknown => 1, + PrintConv => { + 0 => 'MOV', + 1 => 'MP4', + }, + }, + # note: DecryptLen currently set to 0xc9c6 + 720 +); + +# shot information for the D610 firmware 1.00 (encrypted) - ref PH +%Image::ExifTool::Nikon::ShotInfoD610 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 0x07cf ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are extracted from encrypted data in images from the D610.', + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + }, + 0x07cf => { + Name => 'CustomSettingsD610', + Format => 'undef[48]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD610', + }, + }, + # note: DecryptLen currently set to 0x7ff +); + +# shot information for the D810 firmware 1.00(PH)/1.01 (encrypted) - ref 28 +%Image::ExifTool::Nikon::ShotInfoD810 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + DATAMEMBER => [ 0x04, 0x24, 0x38, 0x40, 0x84, 0x01d0, 0x175e, 0x185d, 0x18ab ], + IS_SUBDIR => [ 0x18ab ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are extracted from encrypted data in images from the D810. Note + that the indices listed below are for firmware version 1.0, but they may be + different for other firmware versions. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + DataMember => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + RawConv => '$$self{FirmwareVersion} = $val', + }, + # 0x0c - number of entries in offset table (= 0x21) + # 0x10 - int32u[val 0x0c]: offset table + 0x24 => { + Name => 'BracketingOffset', + DataMember => 'BracketingOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{BracketingOffset} = $val || 0x10000000; undef', + }, + 0x38 => { + Name => 'ISOAutoOffset', + DataMember => 'ISOAutoOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{ISOAutoOffset} = $val || 0x10000000; undef', + }, + 0x40 => { + Name => 'CustomSettingsOffset', # (relative offset from start of ShotInfo data) + DataMember => 'CustomSettingsOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{CustomSettingsOffset} = $val || 0x10000000; undef', + }, + 0x84 => { + Name => 'OrientationOffset', + DataMember => 'OrientationOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', + }, + 0x01d0 => { + Name => 'SecondarySlotFunction', + Mask => 0x03, + PrintConv => { + 0 => 'Overflow', + 2 => 'Backup', + 3 => 'NEF Primary + JPG Secondary', + }, + Hook => '$varSize = $$self{BracketingOffset} - 0x1747', + }, + 0x1756 => { + Name => 'AEBracketingSteps', + Mask => 0xff, + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => { + 0x00 => 'AE Bracketing Disabled', + 0x20 => 'AE Bracketing Disabled', + 0x30 => 'AE Bracketing Disabled', + 0x40 => 'AE Bracketing Disabled', + 0x50 => 'AE Bracketing Disabled', + 0x81 => '+3F0.3', + 0x82 => '-3F0.3', + 0x83 => '+2F0.3', + 0x84 => '-2F0.3', + 0x85 => '3F0.3', + 0x86 => '5F0.3', + 0x87 => '7F0.3', + 0x88 => '9F0.3', + 0x91 => '+3F0.5', + 0x92 => '-3F0.5', + 0x93 => '+2F0.5', + 0x94 => '-2F0.5', + 0x95 => '3F0.5', + 0x96 => '5F0.5', + 0x97 => '7F0.5', + 0x98 => '9F0.5', + 0xa1 => '+3F0.7', + 0xa2 => '-3F0.7', + 0xa3 => '+2F0.7', + 0xa4 => '-2F0.7', + 0xa5 => '3F0.7', + 0xa6 => '5F0.7', + 0xa7 => '7F0.7', + 0xa8 => '9F0.7', + 0xb1 => '+3F1', + 0xb2 => '-3F1', + 0xb3 => '+2F1', + 0xb4 => '-2F1', + 0xb5 => '3F1', + 0xb6 => '5F1', + 0xb7 => '7F1', + 0xb8 => '9F1', + 0xc1 => '+3F2', + 0xc2 => '-3F2', + 0xc3 => '+2F2', + 0xc4 => '-2F2', + 0xc5 => '3F2', + 0xc6 => '5F2', + 0xd1 => '+3F3', + 0xd2 => '-3F3', + 0xd3 => '+2F3', + 0xd4 => '-2F3', + 0xd5 => '3F3', + 0xd6 => '5F3', + }, + }, + 0x1757 => { + Name => 'WBBracketingSteps', + Condition => '$$self{FILE_TYPE} ne "TIFF"', # (covers NEF and TIFF) + Mask => 0xff, + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => { + 0x00 => 'WB Bracketing Disabled', + 0x01 => 'b3F 1', + 0x02 => 'A3F 1', + 0x03 => 'b2F 1', + 0x04 => 'A2F 1', + 0x05 => '3F 1', + 0x06 => '5F 1', + 0x07 => '7F 1', + 0x08 => '9F 1', + 0x10 => '0F 2', + 0x11 => 'b3F 2', + 0x12 => 'A3F 2', + 0x13 => 'b2F 2', + 0x14 => 'A2F 2', + 0x15 => '3F 2', + 0x16 => '5F 2', + 0x17 => '7F 2', + 0x18 => '9F 2', + 0x20 => '0F 3', + 0x21 => 'b3F 3', + 0x22 => 'A3F 3', + 0x23 => 'b2F 3', + 0x24 => 'A2F 3', + 0x25 => '3F 3', + 0x26 => '5F 3', + 0x27 => '7F 3', + 0x28 => '9F 3', + 0x22 => 'A3F 3', + 0x23 => 'b2F 3', + 0x24 => 'A2F 3', + 0x25 => '3F 3', + 0x26 => '5F 3', + 0x27 => '7F 3', + 0x28 => '9F 3', + }, + }, + 0x175e => { + Name => 'NikonMeteringMode', + Mask => 0x03, + PrintConv => { + 0 => 'Matrix', + 1 => 'Center', + 2 => 'Spot', + 3 => 'Highlight' + }, + Hook => '$varSize = $$self{ISOAutoOffset} - 0x1858', + }, + 0x185c => { + Name => 'ISOAutoShutterTime', + Mask => 0x3f, + PrintConv => { + 0 => '1/4000 s', + 1 => '1/3200 s', + 2 => '1/2500 s', + 3 => '1/2000 s', + 4 => '1/1600 s', + 5 => '1/1250 s', + 6 => '1/1000 s', + 7 => '1/800 s', + 8 => '1/640 s', + 9 => '1/500 s', + 10 => '1/400 s', + 11 => '1/320 s', + 12 => '1/250 s', + 13 => '1/200 s', + 14 => '1/160 s', + 15 => '1/125 s', + 16 => '1/100 s', + 17 => '1/80 s', + 18 => '1/60 s', + 19 => '1/50 s', + 20 => '1/40 s', + 21 => '1/30 s', + 22 => '1/15 s', + 23 => '1/8 s', + 24 => '1/4 s', + 25 => '1/2 s', + 26 => '1 s', + 27 => '2 s', + 28 => '4 s', + 29 => '8 s', + 30 => '15 s', + 31 => '30 s', + 32 => 'Auto (Slowest)', + 33 => 'Auto (Slower)', + 34 => 'Auto', + 35 => 'Auto (Faster)', + 36 => 'Auto (Fastest)', + }, + }, + 0x185d => { + Name => 'ISOAutoHiLimit', + Mask => 0xff, + PrintHex => 1, + PrintConv => { + 0x24 => 'ISO 200', + 0x26 => 'ISO 250', + 0x27 => 'ISO 280', + 0x28 => 'ISO 320', + 0x2a => 'ISO 400', + 0x2c => 'ISO 500', + 0x2d => 'ISO 560', + 0x2e => 'ISO 640', + 0x30 => 'ISO 800', + 0x32 => 'ISO 1000', + 0x33 => 'ISO 1100', + 0x34 => 'ISO 1250', + 0x36 => 'ISO 1600', + 0x38 => 'ISO 2000', + 0x39 => 'ISO 2200', + 0x3a => 'ISO 2500', + 0x3c => 'ISO 3200', + 0x3e => 'ISO 4000', + 0x3f => 'ISO 4500', + 0x40 => 'ISO 5000', + 0x42 => 'ISO 6400', + 0x44 => 'ISO 8000', + 0x45 => 'ISO 9000', + 0x46 => 'ISO 10000', + 0x48 => 'ISO 12800', + 0x4a => 'ISO 16000', + 0x4b => 'ISO 18000', + 0x4c => 'ISO 20000', + 0x4e => 'ISO 25600', + 0x50 => 'ISO 32000', + 0x51 => 'ISO 36000', + 0x52 => 'ISO 40000', + 0x54 => 'ISO 51200', + 0x56 => 'ISO Hi 0.3', + 0x57 => 'ISO Hi 0.5', + 0x58 => 'ISO Hi 0.7', + 0x5a => 'ISO Hi 1.0', + 0x60 => 'ISO Hi 2.0', + 0x66 => 'ISO Hi 3.0', + 0x6c => 'ISO Hi 4.0', + 0x72 => 'ISO Hi 5.0', + }, + Hook => '$varSize = $$self{CustomSettingsOffset} - 0x18ab', + }, + 0x18ab => { # (actual offset adjusted by Hook above) + Name => 'CustomSettingsD810', + Format => 'undef[53]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD810', + }, + Hook => '$varSize = $$self{OrientationOffset} - 0x36f4', + }, + 0x36f4 => { + Name => 'RollAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of clockwise camera roll', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0x36f8 => { + Name => 'PitchAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of upward camera tilt', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0x36fc => { + Name => 'YawAngle', + Format => 'fixed32u', + Notes => 'the camera yaw angle when shooting in portrait orientation', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + # note: DecryptLen currently set to OrientationOffset + 12 + + # (moves around too much and doesn't fit cleanly in the offset table) + #0x38be => { + # Name => 'Rotation', + # Condition => '$$self{FirmwareVersion} =~ /^1.0/', + # Mask => 0x30, + # PrintConv => { + # 0 => 'Horizontal', + # 1 => 'Rotate 270 CW', + # 2 => 'Rotate 90 CW', + # 3 => 'Rotate 180', + # }, + #}, +); + +# shot information for the D850 firmware 1.00b (encrypted) - ref 28 +%Image::ExifTool::Nikon::ShotInfoD850 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + DATAMEMBER => [ 0x04, 0x58, 0xa0, 0x0fbf, 0x2efa ], + IS_SUBDIR => [ 0x1038 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are extracted from encrypted data in images from the D850.', + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + DataMember => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + RawConv => '$$self{FirmwareVersion} = $val', + }, + 0x58 => { + Name => 'CustomSettingsOffset', # (relative offset from start of ShotInfo data) + DataMember => 'CustomSettingsOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{CustomSettingsOffset} = $val || 0x10000000; undef', + }, + 0xa0 => { + Name => 'OrientationOffset', + DataMember => 'OrientationOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', + }, + 0x0791 => { + Name => 'PhotoShootingMenuBankImageArea', + Mask => 0x07, + PrintConv => { + 0 => 'FX (36x24)', + 1 => 'DX (24x16)', + 2 => '5:4 (30x24)', + 3 => '1.2x (30x20)', + 4 => '1:1 (24x24)', + }, + }, + 0x0fbd => { + Name => 'PhotoShootingMenuBank', + Condition => '$$self{FILE_TYPE} eq "JPEG"', + Notes => 'valid for JPEG images only', + Mask => 0x03, + PrintConv => { + 0 => 'A', + 1 => 'B', + 2 => 'C', + 3 => 'D', + }, + }, + 0x0fbf => { + Name => 'PrimarySlot', + Mask => 0x80, + PrintConv => { + 0 => 'XQD Card', + 1 => 'SD Card', + }, + Hook => '$varSize = $$self{CustomSettingsOffset} - 0x1038', + }, + 0x1038 => { + Name => 'CustomSettingsD850', + Format => 'undef[90]', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCustom::SettingsD850', + }, + }, +### 0x2efb - OrientationInfo start (D850 firmware 1.01a) + 0x2efa => { + Name => 'Hook1', + Hidden => 1, + RawConv => 'undef', + # account for variable location of OrientationInfo data + Hook => '$varSize = $$self{OrientationOffset} - 0x2efb', + }, + 0x2efb => { #28 + Name => 'RollAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of clockwise camera roll', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0x2eff => { #28 + Name => 'PitchAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of upward camera tilt', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0x2f03 => { #28 + Name => 'YawAngle', + Format => 'fixed32u', + Notes => 'the camera yaw angle when shooting in portrait orientation', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + # note: DecryptLen currently set to 0x2f07 +); +# shot information for the D4 firmware 1.00g (ref PH) +%Image::ExifTool::Nikon::ShotInfoD4 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + IS_SUBDIR => [ 0x0751 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are extracted from encrypted data in images from the D4. + }, + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + }, + 0x0751 => { #PH (NC) + Name => 'CustomSettingsD4', + # (seems to work for 1.00g and 1.02b) + Format => 'undef[56]', + SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsD4' }, + }, + # note: DecryptLen currently set to 0x789 +); + +# shot information for the D4S firmware 1.01a (ref 28, encrypted) +%Image::ExifTool::Nikon::ShotInfoD4S = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + DATAMEMBER => [ 4 ], + IS_SUBDIR => [ 0x189d, 0x193d ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are extracted from encrypted data in images from the D4S.', + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + DataMember => 'FirmwareVersion', + Format => 'string[5]', + Writable => 0, + RawConv => '$$self{FirmwareVersion} = $val', + }, + 0x01d0 => { + Name => 'SecondarySlotFunction', + Mask => 0x03, + PrintConv => { + 0 => 'Overflow', + 2 => 'Backup', + 3 => 'NEF Primary + JPG Secondary', + }, + }, + 0x174c => { + Name => 'AEBracketingSteps', + Mask => 0xff, + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => { + 0x00 => 'AE Bracketing Disabled', + 0x20 => 'AE Bracketing Disabled', + 0x30 => 'AE Bracketing Disabled', + 0x40 => 'AE Bracketing Disabled', + 0x50 => 'AE Bracketing Disabled', + 0x81 => '+3F0.3', + 0x82 => '-3F0.3', + 0x83 => '+2F0.3', + 0x84 => '-2F0.3', + 0x85 => '3F0.3', + 0x86 => '5F0.3', + 0x87 => '7F0.3', + 0x88 => '9F0.3', + 0x91 => '+3F0.5', + 0x92 => '-3F0.5', + 0x93 => '+2F0.5', + 0x94 => '-2F0.5', + 0x95 => '3F0.5', + 0x96 => '5F0.5', + 0x97 => '7F0.5', + 0x98 => '9F0.5', + 0xa1 => '+3F0.7', + 0xa2 => '-3F0.7', + 0xa3 => '+2F0.7', + 0xa4 => '-2F0.7', + 0xa5 => '3F0.7', + 0xa6 => '5F0.7', + 0xa7 => '7F0.7', + 0xa8 => '9F0.7', + 0xb1 => '+3F1', + 0xb2 => '-3F1', + 0xb3 => '+2F1', + 0xb4 => '-2F1', + 0xb5 => '3F1', + 0xb6 => '5F1', + 0xb7 => '7F1', + 0xb8 => '9F1', + 0xc1 => '+3F2', + 0xc2 => '-3F2', + 0xc3 => '+2F2', + 0xc4 => '-2F2', + 0xc5 => '3F2', + 0xc6 => '5F2', + 0xd1 => '+3F3', + 0xd2 => '-3F3', + 0xd3 => '+2F3', + 0xd4 => '-2F3', + 0xd5 => '3F3', + 0xd6 => '5F3', + }, + }, + 0x174d => { + Name => 'WBBracketingSteps', + Condition => '$$self{FILE_TYPE} ne "TIFF"', # (covers NEF and TIFF) + Mask => 0xff, + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => { + 0x00 => 'WB Bracketing Disabled', + 0x01 => 'b3F 1', + 0x02 => 'A3F 1', + 0x03 => 'b2F 1', + 0x04 => 'A2F 1', + 0x05 => '3F 1', + 0x06 => '5F 1', + 0x07 => '7F 1', + 0x08 => '9F 1', + 0x10 => '0F 2', + 0x11 => 'b3F 2', + 0x12 => 'A3F 2', + 0x13 => 'b2F 2', + 0x14 => 'A2F 2', + 0x15 => '3F 2', + 0x16 => '5F 2', + 0x17 => '7F 2', + 0x18 => '9F 2', + 0x20 => '0F 3', + 0x21 => 'b3F 3', + 0x22 => 'A3F 3', + 0x23 => 'b2F 3', + 0x24 => 'A2F 3', + 0x25 => '3F 3', + 0x26 => '5F 3', + 0x27 => '7F 3', + 0x28 => '9F 3', + 0x22 => 'A3F 3', + 0x23 => 'b2F 3', + 0x24 => 'A2F 3', + 0x25 => '3F 3', + 0x26 => '5F 3', + 0x27 => '7F 3', + 0x28 => '9F 3', + }, + }, + 0x184d => { + Name => 'ReleaseMode', + Mask => 0xff, + PrintConv => { + 0 => 'Single Frame', + 1 => 'Continuous High Speed', + 3 => 'Continuous Low Speed', + 4 => 'Timer', + 32 => 'Mirror-Up', + 64 => 'Quiet', + }, + }, + 0x189d => { #PH (NC) + Name => 'CustomSettingsD4S', + Condition => '$$self{FirmwareVersion} =~ /^1.00/', + Notes => 'firmware version 1.00', + Format => 'undef[56]', + SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsD4' }, + }, + 0x18c2 => { # CSf1-c (no idea why it is so far away from the rest of the settings) + Name => 'MultiSelectorLiveViewMode', + Groups => { 1 => 'NikonCustom' }, + Condition => '$$self{FirmwareVersion} !~ /^1.00/', + Mask => 0xc0, + PrintConv => { + 0 => 'Reset', + 1 => 'Zoom', + 3 => 'None', + }, + }, + 0x18ea => { + Name => 'ISOAutoShutterTime', + Mask => 0x3f, + PrintConv => { + 0 => '1/4000 s', + 1 => '1/3200 s', + 2 => '1/2500 s', + 3 => '1/2000 s', + 4 => '1/1600 s', + 5 => '1/1250 s', + 6 => '1/1000 s', + 7 => '1/800 s', + 8 => '1/640 s', + 9 => '1/500 s', + 10 => '1/400 s', + 11 => '1/320 s', + 12 => '1/250 s', + 13 => '1/200 s', + 14 => '1/160 s', + 15 => '1/125 s', + 16 => '1/100 s', + 17 => '1/80 s', + 18 => '1/60 s', + 19 => '1/50 s', + 20 => '1/40 s', + 21 => '1/30 s', + 22 => '1/15 s', + 23 => '1/8 s', + 24 => '1/4 s', + 25 => '1/2 s', + 26 => '1 s', + 27 => '2 s', + 28 => '4 s', + 29 => '8 s', + 30 => '15 s', + 31 => '30 s', + 32 => 'Auto (Slowest)', + 33 => 'Auto (Slower)', + 34 => 'Auto', + 35 => 'Auto (Faster)', + 36 => 'Auto (Fastest)', + }, + }, + 0x18eb => { + Name => 'ISOAutoHiLimit', + Mask => 0xff, + PrintHex => 1, + PrintConv => { + 0x24 => 'ISO 200', + 0x26 => 'ISO 250', + 0x27 => 'ISO 280', + 0x28 => 'ISO 320', + 0x2a => 'ISO 400', + 0x2c => 'ISO 500', + 0x2d => 'ISO 560', + 0x2e => 'ISO 640', + 0x30 => 'ISO 800', + 0x32 => 'ISO 1000', + 0x33 => 'ISO 1100', + 0x34 => 'ISO 1250', + 0x36 => 'ISO 1600', + 0x38 => 'ISO 2000', + 0x39 => 'ISO 2200', + 0x3a => 'ISO 2500', + 0x3c => 'ISO 3200', + 0x3e => 'ISO 4000', + 0x3f => 'ISO 4500', + 0x40 => 'ISO 5000', + 0x42 => 'ISO 6400', + 0x44 => 'ISO 8000', + 0x45 => 'ISO 9000', + 0x46 => 'ISO 10000', + 0x48 => 'ISO 12800', + 0x4a => 'ISO 16000', + 0x4b => 'ISO 18000', + 0x4c => 'ISO 20000', + 0x4e => 'ISO 25600', + 0x50 => 'ISO 32000', + 0x51 => 'ISO 36000', + 0x52 => 'ISO 40000', + 0x54 => 'ISO 51200', + 0x56 => 'ISO Hi 0.3', + 0x57 => 'ISO Hi 0.5', + 0x58 => 'ISO Hi 0.7', + 0x5a => 'ISO Hi 1.0', + 0x60 => 'ISO Hi 2.0', + 0x66 => 'ISO Hi 3.0', + 0x6c => 'ISO Hi 4.0', + 0x72 => 'ISO Hi 5.0', + }, + }, + 0x193d => { + Name => 'CustomSettingsD4S', + Condition => '$$self{FirmwareVersion} !~ /^1.00/', + Notes => 'firmware version 1.01', + Format => 'undef[56]', + SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsD4' }, + }, +# 0x1978 => { # this decode works, but involves more bits than should be necessary +# Name => 'ShutterTrigger', +# Mask => 0xff, +# PrintConv => { +# 0 => 'Timer', +# 15 => 'Cable Release/Remote', +# 195 => 'Shutter Button', +# }, +# }, + 0x350b => { + Name => 'RollAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of clockwise camera roll', + ValueConv => '$val < 180 ? -$val : 360 - $val', + ValueConvInv => '$val <= 0 ? -$val : 360 - $val', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0x350f => { + Name => 'PitchAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of upward camera tilt', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0x3513 => { + Name => 'YawAngle', + Format => 'fixed32u', + Notes => 'the camera yaw angle when shooting in portrait orientation', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0x3693 => { + Name => 'Rotation', + Mask => 0x30, + PrintConv => { + 0 => 'Horizontal', + 1 => 'Rotate 270 CW', + 2 => 'Rotate 90 CW', + 3 => 'Rotate 180', + }, + }, + # note: DecryptLen currently set to 0x3697 +); + +# shot information for the Z7II firmware 1.00 (encrypted) - ref 28 +%Image::ExifTool::Nikon::ShotInfoZ7II = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + DATAMEMBER => [ 0x04, 0x30, 0x38, 0x98, 0xa0, 0x75e7, 0x760c, + 0x7610, 0x7eff, 0xce31, 0xcea5, 0xceb6, 0xceb7 ], + IS_SUBDIR => [ 0xceb8 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are extracted from encrypted data in images from the Z7II.', + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + DataMember => 'FirmwareVersion', + Format => 'string[8]', + Writable => 0, + RawConv => '$$self{FirmwareVersion} = $val', + }, + 0x0e => { + Name => 'FirmwareVersion2', + Format => 'string[8]', + Writable => 0, + Hidden => 1, + }, + 0x18 => { + Name => 'FirmwareVersion3', + Format => 'string[8]', + Writable => 0, + Hidden => 1, + }, + 0x24 => { + Name => 'NumberOffsets', # number of entries in offset table. offsets are from start of ShotInfo data. + DataMember => 'NumberOffsets', + Format => 'int32u', + Writable => 0, + Hidden => 1, + }, + 0x30 => { + Name => 'Offset3', + DataMember => 'Offset3', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{Offset3} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0x38 => { + Name => 'Offset5', + DataMember => 'Offset5', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{Offset5} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0x98 => { + Name => 'OrientationOffset', + DataMember => 'OrientationOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0xa0 => { + Name => 'Offset31', + DataMember => 'Offset31', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{Offset31} = $val || 0x10000000; undef', # (ignore if 0) + }, + ### 0x75e8 - Offset3 info start (Z7II firmware 1.30) + 0x75e7 => { + Name => 'Hook1', + Hidden => 1, + RawConv => 'undef', + # account for variable location of Offset3 data + Hook => '$varSize = $$self{Offset3} - 0x75e8', + }, + 0x760c => { + Name => 'IntervalShooting', + RawConv => '$$self{IntervalShooting} = $val', + Format => 'int16u', + PrintConv => q{ + return 'Off' if $val == 0 ; + my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}); # something like "Interval 1 of 3" + my $f = $$self{IntervalShootingShotsPerInterval} > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}): '' ; # something like "Frame 1 of 3" or blank + return "On: $i$f" + #$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}), + }, + }, + 0x7610 => { + Name => 'IntervalFrame', + RawConv => '$$self{IntervalFrame} = $val', + Condition => '$$self{IntervalShooting} > 0', + Format => 'int16u', + Hidden => 1, + }, + ### 0x7f00 - Offset5 info start (Z7II firmware 1.30) + 0x7eff => { + Name => 'Hook2', + Hidden => 1, + RawConv => 'undef', + # account for variable location of Offset5 data + Hook => '$varSize = $$self{Offset5} - 0x7f00', + }, + 0x7fa0 => { #28 + Name => 'PortraitImpressionBalance', # will be 0 for firmware 1.21 and earlier; firmware 1.30 onward: will be set by Photo Shooting Menu entry Portrait Impression Balance + # offset5+160; 128 is neutral; >128 increases Yellow; <128 increases Magenta; increments of 4 result from 1 full unit adjustment on the camera + # offset5+161 128 is neutral; >128 increases Brightness; <128 decreases Brightness + # with firmware 1.30 when 'Off' is selected in the Shooting menu, offsets 160 & 161 will contain 255. Selecting Mode 1,2, or 3 will populate offsets 160 & 161 with values in the range [116,141] + Format => 'int8u[2]', + Condition => '$$self{FirmwareVersion} ge "01.30"', + PrintConv => q{ + return 'Off' if $val eq '0 0' or $val eq '255 255'; + my @v = split ' ', $val; + my $brightness = $v[1]==128 ? 'Brightness: Neutral' : sprintf('Brightness: %+.1f',($v[1]-128)/4); + my $color = $v[0]==128 ? 'Color: Neutral' : sprintf('%s: %.1f', $v[0]>128 ? 'Yellow' : 'Magenta', abs($v[0]-128)/4); + # will return something like: 'Magenta: 1.0 Brightness: Neutral' + return "$color $brightness" + }, + }, + ### 0xce32 - OrientationInfo start (Z7II firmware 1.00) + 0xce31 => { + Name => 'Hook3', + Hidden => 1, + RawConv => 'undef', + # account for variable location of OrientationInfo data + Hook => '$varSize = $$self{OrientationOffset} - 0xce32', + }, + + 0xce32 => { + Name => 'RollAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of clockwise camera roll', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0xce36 => { + Name => 'PitchAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of upward camera tilt', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0xce3a => { + Name => 'YawAngle', + Format => 'fixed32u', + Notes => 'the camera yaw angle when shooting in portrait orientation', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0xcea5 => { + Name => 'Hook4', + Hidden => 1, + RawConv => 'undef', + # account for variable location of Offset31 data + Hook => '$varSize = $$self{Offset31} - 0xcea6', + }, + ### 0xcea6 - Offset31 info start (Z7II firmware 1.30) + 0xceb6 => { + Name => 'MenuSettingsZ7IIOffset', + # offset to MenuSettingsZ7II is relative to start of Offset31 block + RawConv => '$$self{MenuSettingsZ7IIOffset} = ($val || 0x10000000) + $$self{Offset31}; undef', # (ignore if 0) + }, + 0xceb7 => { + Name => 'Hook5', + Hidden => 1, + RawConv => 'undef', + # account for variable location of Offset5 data + Hook => '$varSize = $$self{MenuSettingsZ7IIOffset} - 0xceb8', + }, + 0xceb8 => { # (this is 0xd04e for the Z50) + Name => 'MenuSettingsZ7II', + Format => 'undef[860]', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ7II', + }, + } + # note: DecryptLen currently set to 0xd04e + 860 (offset for Z50 is 0xd04e) +); + +# shot information for the Z9 firmware 1.00 (encrypted) - ref 28 +%Image::ExifTool::Nikon::ShotInfoZ9 = ( + PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + VARS => { ID_LABEL => 'Index' }, + DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c98, + 0x6c9a, 0x7717, 0x7844, 0xeaea, 0xeb6f, 0xeb70 ], + IS_SUBDIR => [ 0xec4b ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are extracted from encrypted data in images from the Z9.', + 0x00 => { + Name => 'ShotInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 0x04 => { + Name => 'FirmwareVersion', + DataMember => 'FirmwareVersion', + Format => 'string[8]', + Writable => 0, + RawConv => '$$self{FirmwareVersion} = $val', + }, + 0x0e => { + Name => 'FirmwareVersion2', + Format => 'string[8]', + Writable => 0, + Hidden => 1, + }, + 0x18 => { + Name => 'FirmwareVersion3', + Format => 'string[8]', + Writable => 0, + Hidden => 1, + }, + 0x24 => { + Name => 'NumberOffsets', # number of entries in offset table. offsets are from start of ShotInfo data. + DataMember => 'NumberOffsets', + Format => 'int32u', + Writable => 0, + Hidden => 1, + }, + 0x30 => { + Name => 'Offset3', #offset3 - length 2528 (Z9 firmware 1.0) + DataMember => 'Offset3', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{Offset3} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0x38 => { + Name => 'Offset5', #offset5 - length 2488 (Z9 firmware 1.0) + DataMember => 'Offset5', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{Offset5} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0x84 => { + Name => 'OrientationOffset', #offset24 - length 108 (Z9 firmware 1.0) + DataMember => 'OrientationOffset', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0) + }, + 0x8c => { + Name => 'Offset26', #offset26 - length 1895 (Z9 firmware 1.0) + DataMember => 'Offset26', + Format => 'int32u', + Writable => 0, + Hidden => 1, + RawConv => '$$self{Offset26} = $val || 0x10000000; undef', # (ignore if 0) + }, + ### 0x6c70 - Offset3 info start (Z9 firmware 1.00) + 0x6c6f => { + Name => 'Offset3Hook', + Hidden => 1, + RawConv => 'undef', + # account for variable location of Offset3 data + Hook => '$varSize = $$self{Offset3} - 0x6c70', + }, + 0x6c98 => { + Name => 'IntervalShooting', + RawConv => '$$self{IntervalShooting} = $val', + Format => 'int16u', + PrintConv => q{ + return 'Off' if $val == 0 ; + my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}); # something like "Interval 1 of 3" + my $f = $$self{IntervalShootingShotsPerInterval} > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}): '' ; # something like "Frame 1 of 3" or blank + return "On: $i$f" + #$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}), + }, + }, + 0x6c9a => { + Name => 'IntervalFrame', + RawConv => '$$self{IntervalFrame} = $val', + Condition => '$$self{IntervalShooting} > 0', + Format => 'int16u', + Hidden => 1, + }, + ### 0x7718 - Offset5 info start (Z9 firmware 1.00) + 0x7717 => { + Name => 'Offsset5Hook', + Hidden => 1, + RawConv => 'undef', + # account for variable location of Offset5 data + Hook => '$varSize = $$self{Offset5} - 0x7718', + }, + 0x7844 => { + Name => 'FocusShiftShooting', + RawConv => '$$self{FocusShiftShooting} = $val', + PrintConv => q{ + return 'Off' if $val == 0 ; + my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100" + return "On: $i" + }, + }, + ### 0xeaeb - OrientationInfo start (Z9 firmware 1.00) + 0xeaea => { + Name => 'OrientationHook', + Hidden => 1, + RawConv => 'undef', + # account for variable location of OrientationInfo data + Hook => '$varSize = $$self{OrientationOffset} - 0xeaeb', + }, + 0xeaeb => { + Name => 'RollAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of clockwise camera roll', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0xeaef => { + Name => 'PitchAngle', + Format => 'fixed32u', + Notes => 'converted to degrees of upward camera tilt', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0xeaf3 => { + Name => 'YawAngle', + Format => 'fixed32u', + Notes => 'the camera yaw angle when shooting in portrait orientation', + ValueConv => '$val <= 180 ? $val : $val - 360', + ValueConvInv => '$val >= 0 ? $val : $val + 360', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + ### 0xeb5f - Offset26 info start (Z9 firmware 1.00) + 0xeb6f => { + Name => 'MenuSettingsZ9Offset', + Writable => 0, + Hidden => 1, + # offset to MenuSettingsZ9 is relative to start of Offset26 block + RawConv => '$$self{MenuSettingsZ9Offset} = ($val || 0x10000000) + $$self{Offset26}; undef', # (ignore if 0) + }, + 0xeb70 => { + Name => 'Hook5', + Hidden => 1, + RawConv => 'undef', + # account for variable location of menu settings data + Hook => '$varSize = $$self{MenuSettingsZ9Offset} - 0xec4b', + }, + 0xec4b => { + Name => 'MenuSettingsZ9', + Format => 'undef[1646]', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9', + }, + }, + # note: DecryptLen currently set to 0xec4b + 1646 +); + +%Image::ExifTool::Nikon::MenuSettingsZ7II = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 176, 180, 328, 352, 858 ], + NOTES => 'These tags are used by the Z5, Z6, Z7, Z6II, Z7II, Z50 and Zfc.', + 160 => { + Name => 'IntervalDurationHours', + Format => 'int32u', + #Condition => '$$self{IntervalShooting} > 0', + }, + 164 => { + Name => 'IntervalDurationMinutes', + Format => 'int32u', + #Condition => '$$self{IntervalShooting} > 0', + }, + 168 => { + Name => 'IntervalDurationSeconds', + Format => 'int32u', + #Condition => '$$self{IntervalShooting} > 0', + }, + 176 => { + Name => 'Intervals', + Format => 'int32u', + RawConv => '$$self{IntervalShootingIntervals} = $val', + #Condition => '$$self{IntervalShooting} > 0', + }, + 180 => { + Name => 'ShotsPerInterval', + Format => 'int32u', + RawConv => '$$self{IntervalShootingShotsPerInterval} = $val', + #Condition => '$$self{IntervalShooting} > 0', + }, + 184 => { + Name => 'IntervalExposureSmoothing', + #Condition => '$$self{IntervalShooting} > 0', + Format => 'int8u', + PrintConv => \%offOn, + }, + 186 => { + Name => 'IntervalPriority', + #Condition => '$$self{IntervalShooting} > 0', + Format => 'int8u', + PrintConv => \%offOn, + }, + 220 => { + Name => 'FocusShiftNumberShots', + }, + 224 => { + Name => 'FocusShiftStepWidth', + }, + 228 => { + Name => 'FocusShiftInterval', + PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)', + }, + 232 => { + Name => 'FocusShiftExposureLock', + PrintConv => \%offOn, + }, + #304 => White Balance - Kelvin Temp + #312 => ColorSpace + #314 => ActiveD-Lighting + #318 => HighISONoiseReduction + 322 => { + Name => 'DiffractionCompensation', + Format => 'int8u', + PrintConv => \%offOn, + }, + 323 => { + Name => 'AutoDistortionControl', + Format => 'int8u', + PrintConv => \%offOn, + }, + #324 => {Name => 'FlickerReductionShooting',}, # redundant with tag in NikonSettings + 326 => { + Name => 'NikonMeteringMode', + Unknown => 1, + PrintConv => { + 0 => 'Matrix', + 1 => 'Center', + 2 => 'Spot', + 3 => 'Highlight' + }, + }, + 326 => { Name => 'NikonMeteringMode', PrintConv => \%meteringModeZ7}, + 328 => { + Name => 'FlashControlMode', # this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu + RawConv => '$$self{FlashControlMode} = $val', + PrintConv => \%flashControlModeZ7, + }, + 334 => { + Name => 'FlashGNDistance', + Condition => '$$self{FlashControlMode} == 2', + Unknown => 1, + ValueConv => '$val + 3', + PrintConv => \%flashGNDistance, + }, + 338 => { + Name => 'FlashOutput', # range[0,24] with 0=>Full; 1=>50%; then decreasing flash power in 1/3 stops to 0.39% (1/256 full power). also found in FlashInfoUnknown at offset 0x0a (with different mappings) + Condition => '$$self{FlashControlMode} >= 3', + Unknown => 1, + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + 346 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1}, + 348 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1}, + 352 => { + Name => 'FlashMasterControlMode', # tag name chosen for compatibility with those found in FlashInfo0102 & FlashInfo0103 + RawConv => '$$self{FlashGroupOptionsMasterMode} = $val', + PrintConv => \%flashGroupOptionsMode, + }, + 354 => { + Name => 'FlashMasterCompensation', + Format => 'int8s', + Condition => '$$self{FlashGroupOptionsMasterMode} != 3', # other than 'Off' + Unknown => 1, + ValueConv => '$val/6', + ValueConvInv => '6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 358 => { + Name => 'FlashMasterOutput', + Unknown => 1, + Condition => '$$self{FlashGroupOptionsMasterMode} == 1', # only for Mode=M + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + #360 => {Name => 'FlashGroupAControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupACompensation at 362 and FlashGroupAOutput at 368 + #368 => {Name => 'FlashGroupBControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupBCompensation at 370 and FlashGroupBOutput at 374 + #376 => {Name => 'FlashGroupCControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupCCompensation at 378 and FlashGroupCOutput at 382 + #384 => {Name => 'FlashGroupDControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupDCompensation at 386 and FlashGroupDOutput at 390 + #392 => {Name => 'FlashGroupEControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupECompensation at 394 and FlashGroupEOutput at 398 + #400 => {Name => 'FlashGroupFControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupFCompensation at 402 and FlashGroupFOutput at 406 + #434 => FocusMode + #436 => AFAreaMode + #438 => VibrationReduction + #442 => BracketSet + #444 => BracketProgram + #446 => BracketIncrement + #463 => SilentPhotography + 502 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1}, + 504 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1}, + 506 => { + Name => 'MovieSlowMotion', + Unknown => 1, + PrintConv => { + 0 => 'Off', + 1 => 'On (4x)', # 120p recording with playback @ 30p [1920 x 1080; 30p x 4] or 100p recording with playback @ 25p [1920 x 1080; 25p x 4] + 2 => 'On (5x)', # 120p recording with playback @ 24p [1920 x 1080; 20p x 5] + }, + }, + 510 => { + Name => 'MovieType', + Unknown => 1, + PrintConv => { + 0 => 'MOV', + 1 => 'MP4', + }, + }, + #512 => MovieISOAutoHiLimit + 516 => { + Name => 'MovieISOAutoManualMode', + Condition => '$$self{Model} =~ /^NIKON 7/', #ISO ranges vary by model. These mappings are for the Z7 and Z7II + Format => 'int16u', + Unknown => 1, + ValueConv => '($val-104)/8', + ValueConvInv => '8 * ($val + 104)', + PrintConv => \%iSOAutoHiLimitZ7, + }, + #520 => MovieWhiteBalanceSameAsPhoto + 568 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1}, + 572 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1}, + 574 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1}, + 576 => { + Name => 'MovieVignetteControlSameAsPhoto', + Unknown => 1, + PrintConv => \%noYes + }, + 577 => { + Name => 'MovieDiffractionCompensation', + Unknown => 1, + PrintConv => \%offOn + }, + 578 => { + Name => 'MovieAutoDistortionControl', + Unknown => 1, + PrintConv => \%offOn + }, + 584 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1}, + #586 => MovieAFAreaMode + 590 => { + Name => 'MovieVibrationReduction', + Unknown => 1, + PrintConv => { + 0 => 'Off', + 1 => 'On (Normal)', + 2 => 'On (Sport)', + }, + }, + 591 => { + Name => 'MovieVibrationReductionSameAsPhoto', + Unknown => 1, + PrintConv => \%noYes + }, + #848 => HDMIOutputResolution + #850 => HDMIOutputRange + #854 => HDMIExternalRecorder + #856 => HDMIBitDepth + 858 => { + Name => 'HDMIOutputN-Log', # one of the choices under SettingsMenu/HDMI/Advanced. Curiously,the HDR/HLC output option which is controlled by the same sub-menu is decoded thru NikonSettings + Condition => '$$self{HDMIBitDepth} and $$self{HDMIBitDepth} == 2', # only for 10 bit + RawConv => '$$self{HDMIOutputNLog} = $val', + Unknown => 1, + PrintConv => \%offOn, + }, + #859 => HDMIViewAssist +); + +%Image::ExifTool::Nikon::MenuSettingsZ9 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 140, 188, 192, 232, 424, 534 ], + IS_SUBDIR => [ 799 ], + NOTES => 'These tags are used by the Z9.', + #90 ISO + 140 => { + Name => 'MultipleExposureMode', + RawConv => '$$self{MultipleExposureMode} = $val', + PrintConv => { + 0 => 'Off', + 1 => 'On (Series)', + 2 => 'On', + }, + }, + 142 => {Name => 'MultiExposureShots', Condition => '$$self{MultipleExposureMode} != 0' }, #range 2-9 + 188 => { + Name => 'Intervals', + Format => 'int32u', + RawConv => '$$self{IntervalShootingIntervals} = $val', + Condition => '$$self{IntervalShooting} > 0', + }, + 192 => { + Name => 'ShotsPerInterval', + Format => 'int32u', + RawConv => '$$self{IntervalShootingShotsPerInterval} = $val', + Condition => '$$self{IntervalShooting} > 0', + }, + #220 NEFCompression 0=> 'Lossless' 1=> 'High Efficiency*' 4=> 'High Efficientcy' + 232 => { + Name => 'FocusShiftNumberShots', #1-300 + RawConv => '$$self{FocusShiftNumberShots} = $val', + Condition => '$$self{FocusShiftShooting} > 0', + }, + 236 => { + Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide) + Condition => '$$self{FocusShiftShooting} > 0', + }, + 240 => { + Name => 'FocusShiftInterval', + Condition => '$$self{FocusShiftShooting} > 0', + PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)', + }, + 244 => { + Name => 'FocusShiftExposureLock', + Unknown => 1, + PrintConv => \%offOn, + Condition => '$$self{FocusShiftShooting} > 0', + }, + 274 => { + Name => 'PhotoShootingMenuBank', + PrintConv => { + 0 => 'A', + 1 => 'B', + 2 => 'C', + 3 => 'D', + }, + }, + 276 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn, }, #single tag from both Photo & Video menus + 308 => { + Name => 'PhotoShootingMenuBankImageArea', + PrintConv => { + 0 => 'FX', + 1 => 'DX', + 4 => '16:9', + 8 => '1:1', + }, + }, + #310 ImageQuality + 322 => { Name => 'AutoISO', PrintConv => \%offOn, }, + 324 => { + Name => 'ISOAutoHiLimit', + Format => 'int16u', + Unknown => 1, + ValueConv => '($val-104)/8', + ValueConvInv => '8 * ($val + 104)', + PrintConv => \%iSOAutoHiLimitZ7, + }, + 326 => { + Name => 'ISOAutoFlashLimit', + Format => 'int16u', + Unknown => 1, + ValueConv => '($val-104)/8', + ValueConvInv => '8 * ($val + 104)', + PrintConv => \%iSOAutoHiLimitZ7, + }, + #332 ISOAutoShutterTime - Auto setting 0=> 'Auto (Slowest)', 1 => 'Auto (Slower)', 2=> 'Auto', 3=> 'Auto (Faster)', 4=> 'Auto (Fastest)' + 334 => { + Name => 'ISOAutoShutterTime', #shutter speed is 2 ** (-$val/24) + ValueConv => '$val / 8', + Format => 'int16s', + PrintConv => { + -15 => 'Auto', #z9 firmware 1.00 maps both 'Auto' and '30 s' to -15 + -12 => '15 s', + -9 => '8 s', + -6 => '4 s', + -3 => '2 s', + 0 => '1 s', + 1 => '1/1.3 s', + 2 => '1/1.6 s', + 3 => '1/2 s', + 4 => '1/2.5 s', + 5 => '1/3 s', + 6 => '1/4 s', + 7 => '1/5 s', + 8 => '1/6 s', + 9 => '1/8 s', + 10 => '1/10 s', + 11 => '1/13 s', + 12 => '1/15 s', + 13 => '1/20 s', + 14 => '1/25 s', + 15 => '1/30 s', + 16 => '1/40 s', + 17 => '1/50 s', + 18 => '1/60 s', + 19 => '1/80 s', + 20 => '1/100 s', + 21 => '1/120 s', + 22 => '1/160 s', + 23 => '1/200 s', + 24 => '1/250 s', + 25 => '1/320 s', + 26 => '1/400 s', + 27 => '1/500 s', + 28 => '1/640 s', + 29 => '1/800 s', + 30 => '1/1000 s', + 31 => '1/1250 s', + 32 => '1/1600 s', + 33 => '1/2000 s', + 34 => '1/2500 s', + 35 => '1/3200 s', + 36 => '1/4000 s', + 37 => '1/5000 s', + 37.5 => '1/6000 s', + 38 => '1/6400 s', + 39 => '1/8000 s', + 40 => '1/10000 s', + 40.5 => '1/12000 s', + 41 => '1/13000 s', + 42 => '1/16000 s', + }, + }, + #336 WhiteBalance + #406 PictureControl + #408 ColorSpace + #410 ActiveD-Lighting + #412 => { Name => 'NoiseReduction', PrintConv => \%offOn }, #Long Exposure Noise Reduction + #414 HighISONoiseReduction + #414 VignetteControl + 416 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1}, + 418 => { Name => 'DiffractionCompensation', PrintConv => \%offOn }, #value can be set from both the Photo Shoot Menu and the Video Shooting Menu + #419 AutoDistortionControl #value can be set from both the Photo Shoot Menu and the Video Shooting Menu + 420 => { Name => 'FlickerReductionShooting', PrintConv => \%offOn }, + #422 MeteringMode + 424 => { + Name => 'FlashControlMode', # this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu + RawConv => '$$self{FlashControlMode} = $val', + PrintConv => \%flashControlModeZ7, + }, + 426 => { + Name => 'FlashMasterCompensation', + Format => 'int8s', + Unknown => 1, + ValueConv => '$val/6', + ValueConvInv => '6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 430 => { + Name => 'FlashGNDistance', + Condition => '$$self{FlashControlMode} == 2', + Unknown => 1, + ValueConv => '$val + 3', + PrintConv => \%flashGNDistance, + }, + 434 => { + Name => 'FlashOutput', # range[0,24] with 0=>Full; 1=>50%; then decreasing flash power in 1/3 stops to 0.39% (1/256 full power). also found in FlashInfoUnknown at offset 0x0a (with different mappings) + Condition => '$$self{FlashControlMode} >= 3', + Unknown => 1, + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + #442 flash wirelss control 0=> 'Off' 1=> 'CMD' + 444 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1}, + 456 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1}, + #526 FocusMode + 528 => { + Name => 'AFAreaMode', + PrintConv => { + 1 => 'Single', + 2 => 'Dynamic', + 3 => 'Wide (S)', + 4 => 'Wide (L)', + 5 => '3D', + 6 => 'Auto', + 12 => 'Wide (C1)', + 13 => 'Wide (C2)', + }, + }, + 530 => { Name => 'VRMode', PrintConv => \%vRModeZ9}, + 534 => { + Name => 'BracketSet', + RawConv => '$$self{BracketSet} = $val', + PrintConv => { + 0 => 'AE/Flash', + 1 => 'AE', + 2 => 'Flash', + 3 => 'White Balance', + 4 => 'Active-D Lighting', + }, + }, + 536 => { + Name => 'BracketProgram', + Condition => '$$self{BracketSet} < 3', + Notes => 'AE and/or Flash Bracketing', + PrintConv => { + 0 => 'Disabled', + 2 => '2F', + 3 => '3F', + 4 => '4F', + 5 => '5F', + 7 => '7F', + 9 => '9F', + }, + }, + 538 => { + Name => 'BracketIncrement', + Condition => '$$self{BracketSet} < 3', + Notes => 'AE and/or Flash Bracketing', + PrintConv => { + 0 => '0.3', + #1 => '0.5', + 2 => '0.7', + 3 => '1.0', + 4 => '2.0', + 5 => '3.0', + }, + }, + #544 BracketProgram for ADL + 556 => { + Name => 'SecondarySlotFunction', + PrintConv => { + 0 => 'Overflow', + 1 => 'Backup', + 2 => 'NEF Primary + JPG Secondary', + 3 => 'JPG Primary + JPG Secondary', + }, + }, + 572 => { Name => 'DXCropAlert', PrintConv => \%offOn, }, + 574 => { Name => 'SubjectDetection', PrintConv => \%subjectDetectionZ9}, + 604 => { + Name => 'MovieImageArea', + Unknown => 1, + Mask => 0x01, #without the mask 4 => 'FX' 5 => DX only the 2nd Z-series field encountered with a mask. + PrintConv => { + 0 => 'FX', + 1 => 'DX', + }, + }, + 614 => { + Name => 'MovieType', + Unknown => 1, + PrintConv => { + 1 => 'H.265 8-bit (MP4)', + 2 => 'H.265 8-bit (MOV)', + 3 => 'H.265 10-bit (MOV)', + 4 => 'ProRes 422 HQ 10-bit (MOV)', + 5 => 'ProRes RAW HQ 12-bit (MOV)', + 6 => 'NRAW 12-bit (NEV)' + }, + }, + 616 => { + Name => 'MovieISOAutoHiLimit', + Format => 'int16u', + Unknown => 1, + ValueConv => '($val-104)/8', + ValueConvInv => '8 * ($val + 104)', + PrintConv => \%iSOAutoHiLimitZ7, + }, + 618 => { Name => 'MovieISOAutoControlManualMode', PrintConv => \%offOn, Unknown => 1}, + 620 => { + Name => 'MovieISOAutoManualMode', + Format => 'int16u', + Unknown => 1, + ValueConv => '($val-104)/8', + ValueConvInv => '8 * ($val + 104)', + PrintConv => \%iSOAutoHiLimitZ7, + }, + 696 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1}, + 698 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1}, + 704 => { + Name => 'MovieFlickerReduction', + PrintConv => { + 0 => 'Auto', + 1 => '50Hz', + 2 => '60Hz', + }, + }, + 706 => { Name => 'MovieMeteringMode', PrintConv => \%meteringModeZ7, , Unknown => 1}, + 708 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1}, + 710 => { + Name => 'MovieAFAreaMode', + PrintConv => { + 1 => 'Single', + 3 => 'Wide (S)', + 4 => 'Wide (L)', + 6 => 'Auto', + 11 => 'Subject Tracking', + }, + }, + 712 => { Name => 'MovieVRMode', PrintConv => \%vRModeZ9, Unknown => 1}, + 716 => { Name => 'MovieElectronicVR', PrintConv => \%offOn, Unknown => 1 }, #distinct from MoveieVRMode + 718 => { Name => 'MovieSoundRecording', PrintConv => { 0 => 'Off', 1 => 'On', 2 => 'On' }, Unknown => 1 }, #not sure why the unusal mapping with 2 => 'On' + 720 => { Name => 'MicrophoneSensitivity', Unknown => 1}, #1-20 + 722 => { Name => 'MicrophoneAttenuator', PrintConv => \%offOn, Unknown => 1 }, #distinct from MoveieVRMode + 724 => { Name => 'MicrophoneFrequencyResponse', PrintConv => { 0 => 'Wide Range', 1 => 'Vocal Range' }, Unknown => 1 }, + 726 => { Name => 'WindNoiseReduction', PrintConv => \%offOn, Unknown => 1 }, + 748 => { + Name => 'MovieToneMap', + Unknown => 1, + PrintConv => { + 0 => 'SDR', + 1 => 'HLG', + 2 => 'N-Log', + }, + }, + 754 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1}, + 756 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1}, + 762 => { Name => 'MicrophoneJackPower', PrintConv => \%offOn, Unknown => 1 }, + 763 => { Name => 'MovieDXCropAlert', PrintConv => \%offOn, Unknown => 1 }, + 764 => { Name => 'MovieSubjectDetection', PrintConv => \%subjectDetectionZ9, Unknown => 1}, + 799 => { + Name => 'CustomSettingsZ9', + Format => 'undef[608]', + SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsZ9' }, + }, + 1426 => { + Name => 'Language', + Unknown => 1, + PrintConv => { + 4 => 'English', + 5 => 'Spanish', + 7 => 'French', + }, + }, + 1428 => { + Name => 'TimeZone', + PrintConv => { + 5 => '+09:00 (Tokyo)', + 6 => '+08:00 (Beijing, Honk Kong, Sinapore)', + 10 => '+05:45 (Kathmandu)', + 11 => '+05:30 (New Dehli)', + 12 => '+05:00 (Islamabad)', + 13 => '+04:30 (Kabul)', + 14 => '+04:00 (Abu Dhabi)', + 15 => '+03:30 (Tehran)', + 16 => '+03:00 (Moscow, Nairobi)', + 17 => '+02:00 (Athens, Helsinki)', + 18 => '+01:00 (Madrid, Paris, Berlin)', + 19 => '+00:00 (London)', + 20 => '-01:00 (Azores)', + 21 => '-02:00 (Fernando de Noronha)', + 22 => '-03:00 (Buenos Aires, Sao Paulo)', + 23 => '-03:30 (Newfoundland)', + 24 => '-04:00 (Manaus, Caracas)', + 25 => '-05:00 (New York, Toronto, Lima)', + 26 => '-06:00 (Chicago, Mexico City)', + 27 => '-07:00 (Denver)', + 28 => '-08:00 (Los Angeles, Vancouver)', + 29 => '-09:00 (Anchorage)', + 30 => '-10:00 (Hawaii)', + }, + }, + 1434 => {Name => 'MonitorBrightness', ValueConv => '$val - 5', Unknown => 1}, # settings: -5 to +5 + 1456 => { Name => 'AFFineTune', PrintConv => \%offOn, Unknown => 1 }, + 1552 => { + Name => 'HDMIOutputResolution', + PrintConv => { + 0 => 'Auto', + 1 => '4320p', + 2 => '2160p', + 3 => '1080p', + #4 => '1080i', + 5 => '720p', + #6 => '576p', + #7 => '480p', + }, + }, + 1565 => { Name => 'SetClockFromLocationData', PrintConv => \%offOn, Unknown => 1 }, + 1572 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 }, + 1573 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 }, + 1608 => { Name => 'EnergySavingMode', PrintConv =>\%offOn, Unknown => 1 }, + 1632 => { Name => 'RecordLocationData', PrintConv => \%offOn, Unknown => 1 }, + 1636 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 }, + 1645 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 }, +); + +# Flash information (ref JD) +%Image::ExifTool::Nikon::FlashInfo0100 = ( + %binaryDataAttrs, + DATAMEMBER => [ 9.2, 15, 16 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and + D200. + }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'FlashInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 4 => { #PH + Name => 'FlashSource', + PrintConv => { + 0 => 'None', + 1 => 'External', + 2 => 'Internal', + }, + }, + # 5 - values: 46,48,50,54,78 + 6 => { + Format => 'int8u[2]', + Name => 'ExternalFlashFirmware', + SeparateTable => 'FlashFirmware', + PrintConv => \%flashFirmware, + }, + 8 => { + Name => 'ExternalFlashFlags', + PrintConv => { 0 => '(none)', + BITMASK => { + 0 => 'Fired', #28 + 2 => 'Bounce Flash', #PH + 4 => 'Wide Flash Adapter', + 5 => 'Dome Diffuser', #28 + }, + }, + }, + 9.1 => { + Name => 'FlashCommanderMode', + Mask => 0x80, + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 9.2 => { + Name => 'FlashControlMode', + Mask => 0x7f, + DataMember => 'FlashControlMode', + RawConv => '$$self{FlashControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 10 => [ + { + Name => 'FlashOutput', + Condition => '$$self{FlashControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashCompensation', + Format => 'int8s', + Priority => 0, + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + ], + 11 => { + Name => 'FlashFocalLength', + RawConv => '$val ? $val : undef', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 12 => { + Name => 'RepeatingFlashRate', + RawConv => '$val ? $val : undef', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 13 => { + Name => 'RepeatingFlashCount', + RawConv => '$val ? $val : undef', + }, + 14 => { #PH + Name => 'FlashGNDistance', + SeparateTable => 1, + PrintConv => \%flashGNDistance, + }, + 15 => { + Name => 'FlashGroupAControlMode', + Mask => 0x0f, + DataMember => 'FlashGroupAControlMode', + RawConv => '$$self{FlashGroupAControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 16 => { + Name => 'FlashGroupBControlMode', + Mask => 0x0f, + DataMember => 'FlashGroupBControlMode', + RawConv => '$$self{FlashGroupBControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 17 => [ + { + Name => 'FlashGroupAOutput', + Condition => '$$self{FlashGroupAControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupACompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], + 18 => [ + { + Name => 'FlashGroupBOutput', + Condition => '$$self{FlashGroupBControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupBCompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], +); + +# Flash information for D40, D40x, D3 and D300 (ref JD) +%Image::ExifTool::Nikon::FlashInfo0102 = ( + %binaryDataAttrs, + DATAMEMBER => [ 9.2, 16.1, 17.1, 17.2 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are used by the D3 (firmware 1.x), D40, D40X, D60 and D300 + (firmware 1.00). + }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'FlashInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 4 => { #PH + Name => 'FlashSource', + PrintConv => { + 0 => 'None', + 1 => 'External', + 2 => 'Internal', + }, + }, + # 5 - values: 46,48,50,54,78 + 6 => { + Format => 'int8u[2]', + Name => 'ExternalFlashFirmware', + SeparateTable => 'FlashFirmware', + PrintConv => \%flashFirmware, + }, + 8 => { + Name => 'ExternalFlashFlags', + PrintConv => { BITMASK => { + 0 => 'Fired', #28 + 2 => 'Bounce Flash', #PH + 4 => 'Wide Flash Adapter', + 5 => 'Dome Diffuser', #28 + }}, + }, + 9.1 => { + Name => 'FlashCommanderMode', + Mask => 0x80, + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 9.2 => { + Name => 'FlashControlMode', + Mask => 0x7f, + DataMember => 'FlashControlMode', + RawConv => '$$self{FlashControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 10 => [ + { + Name => 'FlashOutput', + Condition => '$$self{FlashControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashCompensation', + # this is the compensation from the camera (0x0012) for "Built-in" FlashType, or + # the compensation from the external unit (0x0017) for "Optional" FlashType - PH + Format => 'int8s', + Priority => 0, + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + ], + 12 => { + Name => 'FlashFocalLength', + RawConv => '$val ? $val : undef', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 13 => { + Name => 'RepeatingFlashRate', + RawConv => '$val ? $val : undef', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 14 => { + Name => 'RepeatingFlashCount', + RawConv => '$val ? $val : undef', + }, + 15 => { #PH + Name => 'FlashGNDistance', + SeparateTable => 1, + PrintConv => \%flashGNDistance, + }, + 16.1 => { + Name => 'FlashGroupAControlMode', + Mask => 0x0f, + Notes => 'note: group A tags may apply to the built-in flash settings for some models', + DataMember => 'FlashGroupAControlMode', + RawConv => '$$self{FlashGroupAControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 17.1 => { + Name => 'FlashGroupBControlMode', + Mask => 0xf0, + Notes => 'note: group B tags may apply to group A settings for some models', + DataMember => 'FlashGroupBControlMode', + RawConv => '$$self{FlashGroupBControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 17.2 => { #PH + Name => 'FlashGroupCControlMode', + Mask => 0x0f, + Notes => 'note: group C tags may apply to group B settings for some models', + DataMember => 'FlashGroupCControlMode', + RawConv => '$$self{FlashGroupCControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 18 => [ + { + Name => 'FlashGroupAOutput', + Condition => '$$self{FlashGroupAControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupACompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], + 19 => [ + { + Name => 'FlashGroupBOutput', + Condition => '$$self{FlashGroupBControlMode} >= 0x60', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupBCompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], + 20 => [ #PH + { + Name => 'FlashGroupCOutput', + Condition => '$$self{FlashGroupCControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupCCompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], +); + +# Flash information (ref JD) +%Image::ExifTool::Nikon::FlashInfo0100 = ( + %binaryDataAttrs, + DATAMEMBER => [ 9.2, 15, 16 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and + D200. + }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'FlashInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 4 => { #PH + Name => 'FlashSource', + PrintConv => { + 0 => 'None', + 1 => 'External', + 2 => 'Internal', + }, + }, + # 5 - values: 46,48,50,54,78 + 6 => { + Format => 'int8u[2]', + Name => 'ExternalFlashFirmware', + SeparateTable => 'FlashFirmware', + PrintConv => \%flashFirmware, + }, + 8 => { + Name => 'ExternalFlashFlags', + PrintConv => { 0 => '(none)', + BITMASK => { + 0 => 'Fired', #28 + 2 => 'Bounce Flash', #PH + 4 => 'Wide Flash Adapter', + 5 => 'Dome Diffuser', #28 + }, + }, + }, + 9.1 => { + Name => 'FlashCommanderMode', + Mask => 0x80, + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 9.2 => { + Name => 'FlashControlMode', + Mask => 0x7f, + DataMember => 'FlashControlMode', + RawConv => '$$self{FlashControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 10 => [ + { + Name => 'FlashOutput', + Condition => '$$self{FlashControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashCompensation', + Format => 'int8s', + Priority => 0, + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + ], + 11 => { + Name => 'FlashFocalLength', + RawConv => '$val ? $val : undef', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 12 => { + Name => 'RepeatingFlashRate', + RawConv => '$val ? $val : undef', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 13 => { + Name => 'RepeatingFlashCount', + RawConv => '$val ? $val : undef', + }, + 14 => { #PH + Name => 'FlashGNDistance', + SeparateTable => 1, + PrintConv => \%flashGNDistance, + }, + 15 => { + Name => 'FlashGroupAControlMode', + Mask => 0x0f, + DataMember => 'FlashGroupAControlMode', + RawConv => '$$self{FlashGroupAControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 16 => { + Name => 'FlashGroupBControlMode', + Mask => 0x0f, + DataMember => 'FlashGroupBControlMode', + RawConv => '$$self{FlashGroupBControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 17 => [ + { + Name => 'FlashGroupAOutput', + Condition => '$$self{FlashGroupAControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupACompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], + 18 => [ + { + Name => 'FlashGroupBOutput', + Condition => '$$self{FlashGroupBControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupBCompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], +); + +# Flash information for D40, D40x, D3 and D300 (ref JD) +%Image::ExifTool::Nikon::FlashInfo0102 = ( + %binaryDataAttrs, + DATAMEMBER => [ 9.2, 16.1, 17.1, 17.2 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are used by the D3 (firmware 1.x), D40, D40X, D60 and D300 + (firmware 1.00). + }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'FlashInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 4 => { #PH + Name => 'FlashSource', + PrintConv => { + 0 => 'None', + 1 => 'External', + 2 => 'Internal', + }, + }, + # 5 - values: 46,48,50,54,78 + 6 => { + Format => 'int8u[2]', + Name => 'ExternalFlashFirmware', + SeparateTable => 'FlashFirmware', + PrintConv => \%flashFirmware, + }, + 8 => { + Name => 'ExternalFlashFlags', + PrintConv => { BITMASK => { + 0 => 'Fired', #28 + 2 => 'Bounce Flash', #PH + 4 => 'Wide Flash Adapter', + 5 => 'Dome Diffuser', #28 + }}, + }, + 9.1 => { + Name => 'FlashCommanderMode', + Mask => 0x80, + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 9.2 => { + Name => 'FlashControlMode', + Mask => 0x7f, + DataMember => 'FlashControlMode', + RawConv => '$$self{FlashControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 10 => [ + { + Name => 'FlashOutput', + Condition => '$$self{FlashControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashCompensation', + # this is the compensation from the camera (0x0012) for "Built-in" FlashType, or + # the compensation from the external unit (0x0017) for "Optional" FlashType - PH + Format => 'int8s', + Priority => 0, + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + ], + 12 => { + Name => 'FlashFocalLength', + RawConv => '$val ? $val : undef', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 13 => { + Name => 'RepeatingFlashRate', + RawConv => '$val ? $val : undef', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 14 => { + Name => 'RepeatingFlashCount', + RawConv => '$val ? $val : undef', + }, + 15 => { #PH + Name => 'FlashGNDistance', + SeparateTable => 1, + PrintConv => \%flashGNDistance, + }, + 16.1 => { + Name => 'FlashGroupAControlMode', + Mask => 0x0f, + Notes => 'note: group A tags may apply to the built-in flash settings for some models', + DataMember => 'FlashGroupAControlMode', + RawConv => '$$self{FlashGroupAControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 17.1 => { + Name => 'FlashGroupBControlMode', + Mask => 0xf0, + Notes => 'note: group B tags may apply to group A settings for some models', + DataMember => 'FlashGroupBControlMode', + RawConv => '$$self{FlashGroupBControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 17.2 => { #PH + Name => 'FlashGroupCControlMode', + Mask => 0x0f, + Notes => 'note: group C tags may apply to group B settings for some models', + DataMember => 'FlashGroupCControlMode', + RawConv => '$$self{FlashGroupCControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 18 => [ + { + Name => 'FlashGroupAOutput', + Condition => '$$self{FlashGroupAControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupACompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], + 19 => [ + { + Name => 'FlashGroupBOutput', + Condition => '$$self{FlashGroupBControlMode} >= 0x60', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupBCompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], + 20 => [ #PH + { + Name => 'FlashGroupCOutput', + Condition => '$$self{FlashGroupCControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupCCompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], +); + +# Flash information for D90 and D700 (ref PH) +# - confirmed in detail for D800 (0105) - PH +%Image::ExifTool::Nikon::FlashInfo0103 = ( + %binaryDataAttrs, + DATAMEMBER => [ 9.2, 17.1, 18.1, 18.2 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are used by the D3 (firmware 2.x), D3X, D3S, D4, D90, D300 + (firmware 1.10), D300S, D600, D700, D800, D3000, D3100, D3200, D5000, D5100, + D5200, D7000. + }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'FlashInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 4 => { #PH + Name => 'FlashSource', + PrintConv => { + 0 => 'None', + 1 => 'External', + 2 => 'Internal', + }, + }, + # 5 - values: 46,48,50,54,78 + 6 => { + Format => 'int8u[2]', + Name => 'ExternalFlashFirmware', + SeparateTable => 'FlashFirmware', + PrintConv => \%flashFirmware, + }, + 8 => { + Name => 'ExternalFlashFlags', + PrintConv => { BITMASK => { + 0 => 'Fired', #28 + 2 => 'Bounce Flash', #PH + 4 => 'Wide Flash Adapter', + 5 => 'Dome Diffuser', #28 + }}, + }, + 9.1 => { + Name => 'FlashCommanderMode', + Mask => 0x80, + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 9.2 => { + Name => 'FlashControlMode', + Mask => 0x7f, + DataMember => 'FlashControlMode', + RawConv => '$$self{FlashControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 10 => [ + { + Name => 'FlashOutput', + Condition => '$$self{FlashControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashCompensation', + # this is the compensation from the camera (0x0012) for "Built-in" FlashType, or + # the compensation from the external unit (0x0017) for "Optional" FlashType - PH + Format => 'int8s', + Priority => 0, + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + ], + 12 => { #JD + Name => 'FlashFocalLength', + RawConv => '($val and $val != 255) ? $val : undef', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 13 => { #JD + Name => 'RepeatingFlashRate', + RawConv => '($val and $val != 255) ? $val : undef', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 14 => { #JD + Name => 'RepeatingFlashCount', + RawConv => '($val and $val != 255) ? $val : undef', + }, + 15 => { #28 + Name => 'FlashGNDistance', + SeparateTable => 1, + PrintConv => \%flashGNDistance, + }, + 16 => { #28 + Name => 'FlashColorFilter', + SeparateTable => 1, + PrintConv => \%flashColorFilter, + }, + 17.1 => { + Name => 'FlashGroupAControlMode', + Mask => 0x0f, + Notes => 'note: group A tags may apply to the built-in flash settings for some models', + DataMember => 'FlashGroupAControlMode', + RawConv => '$$self{FlashGroupAControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 18.1 => { + Name => 'FlashGroupBControlMode', + Mask => 0xf0, + Notes => 'note: group B tags may apply to group A settings for some models', + DataMember => 'FlashGroupBControlMode', + RawConv => '$$self{FlashGroupBControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 18.2 => { #PH + Name => 'FlashGroupCControlMode', + Mask => 0x0f, + Notes => 'note: group C tags may apply to group B settings for some models', + DataMember => 'FlashGroupCControlMode', + RawConv => '$$self{FlashGroupCControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 0x13 => [ + { + Name => 'FlashGroupAOutput', + Condition => '$$self{FlashGroupAControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupACompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], + 0x14 => [ + { + Name => 'FlashGroupBOutput', + Condition => '$$self{FlashGroupBControlMode} >= 0x60', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupBCompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], + 0x15 => [ #PH + { + Name => 'FlashGroupCOutput', + Condition => '$$self{FlashGroupCControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupCCompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], + 0x1b => { #PH + Name => 'ExternalFlashCompensation', + Format => 'int8s', + Priority => 0, + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x1d => { #PH + Name => 'FlashExposureComp3', + Format => 'int8s', + # (does not include the built-in compensation for FlashType "Built-in,TTL&Comdr.") + Notes => 'does not include the effect of flash bracketing', + Priority => 0, + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x27 => { #PH (same as ShotInfoD800 0x4d2 but also valid for repeating flash) + Name => 'FlashExposureComp4', + Format => 'int8s', + Notes => 'includes the effect of flash bracketing. Valid for repeating flash', + Priority => 0, + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + # 0x2b - related to flash power (PH, D800, 96=full,62=1/4,2=1/128) +); + +# Flash information for the D7100 (ref PH) +# (this is VERY similar to FlashInfo0107, but there are a few differences that +# would need to be resolved if these two definitions were to be combined) +%Image::ExifTool::Nikon::FlashInfo0106 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 9.2, 17.1, 18.1, 18.2 ], + NOTES => 'These tags are used by the Df, D610, D3300, D5300, D7100 and Coolpix A.', + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'FlashInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 4 => { + Name => 'FlashSource', + PrintConv => { + 0 => 'None', + 1 => 'External', + 2 => 'Internal', + }, + }, + 6 => { + Format => 'int8u[2]', + Name => 'ExternalFlashFirmware', + SeparateTable => 'FlashFirmware', + PrintConv => \%flashFirmware, + }, + 8 => { + Name => 'ExternalFlashFlags', + PrintConv => { BITMASK => { + 0 => 'Fired', + 2 => 'Bounce Flash', + 4 => 'Wide Flash Adapter', + 5 => 'Dome Diffuser', # (NC, not true for the SB-910 anyway) + # 7 - ? (set for SB-910 when an advanced option is used, eg. diff pattern) + }}, + }, + 9.1 => { # (NC) + Name => 'FlashCommanderMode', + Mask => 0x80, + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 9.2 => { + Name => 'FlashControlMode', + Mask => 0x7f, + DataMember => 'FlashControlMode', + RawConv => '$$self{FlashControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + # 10 - similar to 0x27 but zero sometimes when I don't think it should be + 12 => { + Name => 'FlashFocalLength', + Notes => 'only valid if flash pattern is "Standard Illumination"', + RawConv => '($val and $val != 255) ? $val : undef', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 13 => { + Name => 'RepeatingFlashRate', + RawConv => '($val and $val != 255) ? $val : undef', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 14 => { + Name => 'RepeatingFlashCount', + RawConv => '($val and $val != 255) ? $val : undef', + }, + 15 => { # (NC) + Name => 'FlashGNDistance', + SeparateTable => 1, + PrintConv => \%flashGNDistance, + }, + 16 => { + Name => 'FlashColorFilter', + SeparateTable => 1, + PrintConv => \%flashColorFilter, + }, + 17.1 => { + Name => 'FlashGroupAControlMode', + Mask => 0x0f, + DataMember => 'FlashGroupAControlMode', + RawConv => '$$self{FlashGroupAControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 18.1 => { + Name => 'FlashGroupBControlMode', + Mask => 0xf0, + DataMember => 'FlashGroupBControlMode', + RawConv => '$$self{FlashGroupBControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 18.2 => { + Name => 'FlashGroupCControlMode', + Mask => 0x0f, + DataMember => 'FlashGroupCControlMode', + RawConv => '$$self{FlashGroupCControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + # 0x13 - same as 0x28 but not zero when flash group A is Off + # 0x14 - same as 0x29 but not zero when flash group B is Off + # 0x15 - same as 0x2a but not zero when flash group B is Off + # 0x1a - changes with illumination pattern (0=normal,1=narrow,2=wide), but other values seen + # 0x26 - changes when diffuser is used + 0x27 => [ + { + Name => 'FlashOutput', + Condition => '$$self{FlashControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashCompensation', + Format => 'int8s', + Priority => 0, + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + ], + 0x28 => [ + { + Name => 'FlashGroupAOutput', + Condition => '$$self{FlashGroupAControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupACompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], + 0x29 => [ + { + Name => 'FlashGroupBOutput', + Condition => '$$self{FlashGroupBControlMode} >= 0x60', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupBCompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], + 0x2a => [ + { + Name => 'FlashGroupCOutput', + Condition => '$$self{FlashGroupCControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupCCompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], +); + +# Flash information for the D4S/D750/D810/D5500/D7200 (0107) +# and D5/D500/D850/D3400 (0108) (ref 28) +%Image::ExifTool::Nikon::FlashInfo0107 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 17.1, 18.1, 18.2 ], + NOTES => q{ + These tags are used by the D4S, D750, D810, D5500, D7200 (FlashInfoVersion + 0107) and the D5, D500, D850 and D3400 (FlashInfoVersion 0108). + }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'FlashInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 4 => { + Name => 'FlashSource', + PrintConv => { + 0 => 'None', + 1 => 'External', + 2 => 'Internal', + }, + }, + 6 => { + Format => 'int8u[2]', + Name => 'ExternalFlashFirmware', + SeparateTable => 'FlashFirmware', + PrintConv => \%flashFirmware, + }, + 8.1 => { + Name => 'ExternalFlashZoomOverride', + Mask => 0x80, + Notes => 'indicates that the user has overridden the flash zoom distance', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 8.2 => { + Name => 'ExternalFlashStatus', + Mask => 0x01, + PrintConv => { + 0 => 'Flash Not Attached', + 1 => 'Flash Attached', + }, + }, + 9.1 => { + Name => 'ExternalFlashReadyState', + Mask => 0x07, + PrintConv => { + 0 => 'n/a', + 1 => 'Ready', + 6 => 'Not Ready', + }, + }, + 10 => { + Name => 'FlashCompensation', + # this is the compensation from the camera (0x0012) for "Built-in" FlashType, or + # the compensation from the external unit (0x0017) for "Optional" FlashType - PH + Format => 'int8s', + Priority => 0, + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 12 => { + Name => 'FlashFocalLength', + Notes => 'only valid if flash pattern is "Standard Illumination"', + RawConv => '($val and $val != 255) ? $val : undef', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 13 => { + Name => 'RepeatingFlashRate', + RawConv => '($val and $val != 255) ? $val : undef', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 14 => { + Name => 'RepeatingFlashCount', + RawConv => '($val and $val != 255) ? $val : undef', + }, + 15 => { + Name => 'FlashGNDistance', + SeparateTable => 1, + PrintConv => \%flashGNDistance, + }, + 17.1 => { #PH + Name => 'FlashGroupAControlMode', + Mask => 0x0f, + Notes => 'note: group A tags may apply to the built-in flash settings for some models', + DataMember => 'FlashGroupAControlMode', + RawConv => '$$self{FlashGroupAControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 18.1 => { #PH + Name => 'FlashGroupBControlMode', + Mask => 0xf0, + Notes => 'note: group B tags may apply to group A settings for some models', + DataMember => 'FlashGroupBControlMode', + RawConv => '$$self{FlashGroupBControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + 18.2 => { #PH + Name => 'FlashGroupCControlMode', + Mask => 0x0f, + Notes => 'note: group C tags may apply to group B settings for some models', + DataMember => 'FlashGroupCControlMode', + RawConv => '$$self{FlashGroupCControlMode} = $val', + PrintConv => \%flashControlMode, + SeparateTable => 'FlashControlMode', + }, + # 0x13 - very similar to 0x28 + # 0x18 or 0x19 may indicate flash illumination pattern (Standard, Center-weighted, Even) + 0x28 => [ #PH + { + Name => 'FlashGroupAOutput', + Condition => '$$self{FlashGroupAControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupACompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], + 0x29 => [ #PH + { + Name => 'FlashGroupBOutput', + Condition => '$$self{FlashGroupBControlMode} >= 0x60', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupBCompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], + 0x2a => [ #PH + { + Name => 'FlashGroupCOutput', + Condition => '$$self{FlashGroupCControlMode} >= 0x06', + ValueConv => '2 ** (-$val/6)', + ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0', + PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)', + PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1', + }, + { + Name => 'FlashGroupCCompensation', + Format => 'int8s', + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + ], +); + +# Flash information for the Z7II (ref 28) +# (likey similar to FlashInfo010 and FlashInfo0108 with addition of support for radio controlled units such as the SB-5000? +%Image::ExifTool::Nikon::FlashInfo0300 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'FlashInfoVersion', + Format => 'string[4]', + Writable => 0, + }, + 4 => { + Name => 'FlashSource', + PrintConv => { + 0 => 'None', + 1 => 'External', + 2 => 'Internal', + }, + }, + 6 => { + Format => 'int8u[2]', + Name => 'ExternalFlashFirmware', + SeparateTable => 'FlashFirmware', + PrintConv => \%flashFirmware, + }, + 10 => { + Name => 'FlashCompensation', + # this is the compensation from the camera (0x0012) for "Built-in" FlashType, or + # the compensation from the external unit (0x0017) for "Optional" FlashType - PH + Format => 'int8s', + Priority => 0, + ValueConv => '-$val/6', + ValueConvInv => '-6 * $val', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, +); +# Unknown Flash information +%Image::ExifTool::Nikon::FlashInfoUnknown = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'FlashInfoVersion', + Format => 'string[4]', + Writable => 0, + }, +); + +# Multi exposure / image overlay information (ref PH) +%Image::ExifTool::Nikon::MultiExposure = ( + %binaryDataAttrs, + FORMAT => 'int32u', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'MultiExposureVersion', + Format => 'string[4]', + Writable => 0, + }, + 1 => { + Name => 'MultiExposureMode', + PrintConv => { + 0 => 'Off', + 1 => 'Multiple Exposure', + 2 => 'Image Overlay', + 3 => 'HDR', #31 + }, + }, + 2 => 'MultiExposureShots', + 3 => { + Name => 'MultiExposureAutoGain', + PrintConv => \%offOn, + }, +); + +# HDR information (ref 32) +%Image::ExifTool::Nikon::HDRInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added + 0 => { + Name => 'HDRInfoVersion', + Format => 'string[4]', + }, + 4 => { + Name => 'HDR', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 48 => 'Auto', #PH (NC) + }, + }, + 5 => { + Name => 'HDRLevel', + PrintConv => { + 0 => 'Auto', + 1 => '1 EV', + 2 => '2 EV', + 3 => '3 EV', + # 5 - seen for 1J4 + 255 => 'n/a', #PH + }, + }, + 6 => { + Name => 'HDRSmoothing', + PrintConv => { + 0 => 'Off', + 1 => 'Normal', + 2 => 'Low', + 3 => 'High', + 48 => 'Auto', #PH (NC) + 255 => 'n/a', #PH + }, + }, + 7 => { #PH (P330, HDRInfoVersion=0101) + Name => 'HDRLevel2', + PrintConv => { + 0 => 'Auto', + 1 => '1 EV', + 2 => '2 EV', + 3 => '3 EV', + 255 => 'n/a', + }, + }, +); + +# location information (ref PH) +%Image::ExifTool::Nikon::LocationInfo = ( + %binaryDataAttrs, + DATAMEMBER => [ 4 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Location' }, + NOTES => 'Tags written by some Nikon GPS-equipped cameras like the AW100.', + 0 => { + Name => 'LocationInfoVersion', + Format => 'undef[4]', + }, + 4 => { + Name => 'TextEncoding', + DataMember => 'TextEncoding', + RawConv => q{ + $$self{TextEncoding} = $Image::ExifTool::Nikon::nikonTextEncoding{$val} if $val; + return $val; + }, + PrintConv => \%Image::ExifTool::Nikon::nikonTextEncoding, + }, + # (the CountryCode and Location tag names chosen to correspond with XMP::iptcCore) + 5 => { + Name => 'CountryCode', + Format => 'undef[3]', + ValueConv => '$val=~s/\0.*//s; $val', # truncate at null + ValueConvInv => '$val', + }, + 8 => 'POILevel', #forum5782 + 9 => { + Name => 'Location', + Format => 'undef[70]', + RawConv => '$$self{TextEncoding} ? $self->Decode($val,$$self{TextEncoding},"MM") : $val', + RawConvInv => '$$self{TextEncoding} ? $self->Encode($val,$$self{TextEncoding},"MM") : $val', + }, +); + +# MakerNotes0x51 - compression info for Z9 +%Image::ExifTool::Nikon::MakerNotes0x51 = ( + %binaryDataAttrs, + DATAMEMBER => [ 0 ], + GROUPS => { 0 => 'MakerNotes' }, + 0 => { + Name => 'FirmwareVersion', + Format => 'string[8]', + Writable => 0, + RawConv => '$$self{FirmwareVersion} = $val', + }, + 10 => { + Name => 'NEFCompression', + Writable => 'int16u', + SeparateTable => 'NEFCompression', + PrintConv => \%nefCompression, + }, +); + +# extra info found in IFD0 of NEF files (ref PH, Z6/Z7) +%Image::ExifTool::Nikon::NEFInfo = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + As-yet unknown information found in SubIFD1 tag 0xc7d5 of NEF images from + cameras such as the Z6 and Z7, and NRW images from some Coolpix cameras. + }, + # 0x01 - undef[12] + # 0x02 - undef[148] + # 0x03 - undef[284] + # 0x04 - undef[148,212] + # 0x05 - undef[84] (barrel distortion params at offsets 0x14,0x1c,0x24, ref 28) + # 0x06 - undef[116] (vignette correction params at offsets 0x24,0x34,0x44, ref 28) + # 0x07 - undef[104] + # 0x08 - undef[24] + # 0x09 - undef[36] +); + +# tags in Nikon QuickTime videos (PH - observations with Coolpix S3) +# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos) +%Image::ExifTool::Nikon::MOV = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => q{ + This information is found in MOV and QT videos from some Nikon cameras. + }, + 0x00 => { + Name => 'Make', + Format => 'string[24]', + }, + 0x18 => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[8]', + }, + # (01 00 at offset 0x20) + 0x26 => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val ? 10 / $val : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x2a => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x32 => { + Name => 'ExposureCompensation', + Format => 'rational64s', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + 0x44 => { + Name => 'WhiteBalance', + Format => 'int16u', + PrintConv => { + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Shade', + 3 => 'Fluorescent', #2 + 4 => 'Tungsten', + 5 => 'Manual', + }, + }, + 0x48 => { + Name => 'FocalLength', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f mm",$val)', + }, + 0xaf => { + Name => 'Software', + Format => 'string[16]', + }, + 0xdf => { # (this is a guess ... could also be offset 0xdb) + Name => 'ISO', + Format => 'int16u', + RawConv => '$val < 50 ? undef : $val', # (not valid for Coolpix L10) + }, +); + +# Nikon metadata in AVI videos (PH) +%Image::ExifTool::Nikon::AVI = ( + NOTES => 'Nikon-specific RIFF tags found in AVI videos.', + GROUPS => { 0 => 'MakerNotes', 2 => 'Video' }, + nctg => { + Name => 'NikonTags', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AVITags' }, + }, + ncth => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + ncvr => { + Name => 'NikonVers', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AVIVers' }, + }, + ncvw => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + RawConv => 'length($val) ? $val : undef', + Binary => 1, + }, +); + +# version information in AVI videos (PH) +%Image::ExifTool::Nikon::AVIVers = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Video' }, + PROCESS_PROC => \&ProcessNikonAVI, + FORMAT => 'string', + 0x01 => 'MakerNoteType', + 0x02 => { + Name => 'MakerNoteVersion', + Format => 'int8u', + ValueConv => 'my @a = reverse split " ", $val; join ".", @a;', + }, +); + +# tags in AVI videos (PH) +%Image::ExifTool::Nikon::AVITags = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessNikonAVI, + FORMAT => 'string', + NOTES => q{ + These tags and the AVIVer tags below are found in proprietary-format records + of Nikon AVI videos. + }, + 0x03 => 'Make', + 0x04 => 'Model', + 0x05 => { + Name => 'Software', + Format => 'undef', + ValueConv => '$val =~ tr/\0//d; $val', + }, + 0x06 => 'Equipment', # "NIKON DIGITAL CAMERA" + 0x07 => { # (guess) + Name => 'Orientation', + Format => 'int16u', + Groups => { 2 => 'Image' }, + PrintConv => \%Image::ExifTool::Exif::orientation, + }, + 0x08 => { + Name => 'ExposureTime', + Format => 'rational64u', + Groups => { 2 => 'Image' }, + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x09 => { + Name => 'FNumber', + Format => 'rational64u', + Groups => { 2 => 'Image' }, + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x0a => { + Name => 'ExposureCompensation', + Format => 'rational64s', + Groups => { 2 => 'Image' }, + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + 0x0b => { + Name => 'MaxApertureValue', + Format => 'rational64u', + ValueConv => '2 ** ($val / 2)', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x0c => { + Name => 'MeteringMode', # (guess) + Format => 'int16u', + PrintConv => { + 0 => 'Unknown', + 1 => 'Average', + 2 => 'Center-weighted average', + 3 => 'Spot', + 4 => 'Multi-spot', + 5 => 'Multi-segment', + 6 => 'Partial', + 255 => 'Other', + }, + }, + 0x0d => { # val: 0 + Name => 'Nikon_AVITags_0x000d', + Format => 'int16u', + Flags => [ 'Hidden', 'Unknown' ], + }, + 0x0e => { # val: 0 + Name => 'Nikon_AVITags_0x000e', + Format => 'int16u', + Flags => [ 'Hidden', 'Unknown' ], + }, + 0x0f => { + Name => 'FocalLength', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f mm",$val)', + }, + 0x10 => { + Name => 'XResolution', + Format => 'rational64u', + Groups => { 2 => 'Image' }, + }, + 0x11 => { + Name => 'YResolution', + Format => 'rational64u', + Groups => { 2 => 'Image' }, + }, + 0x12 => { + Name => 'ResolutionUnit', + Format => 'int16u', + Groups => { 2 => 'Image' }, + PrintConv => { + 1 => 'None', + 2 => 'inches', + 3 => 'cm', + }, + }, + 0x13 => { + Name => 'DateTimeOriginal', # (guess) + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x14 => { + Name => 'CreateDate', # (guess) + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x15 => { + Name => 'Nikon_AVITags_0x0015', + Format => 'int16u', + Flags => [ 'Hidden', 'Unknown' ], + }, + 0x16 => { + Name => 'Duration', + Format => 'rational64u', + PrintConv => '"$val s"', + }, + 0x17 => { # val: 1 + Name => 'Nikon_AVITags_0x0017', + Format => 'int16u', + Flags => [ 'Hidden', 'Unknown' ], + }, + 0x18 => 'FocusMode', + 0x19 => { # vals: -5, -2, 3, 5, 6, 8, 11, 12, 14, 20, 22 + Name => 'Nikon_AVITags_0x0019', + Format => 'int32s', + Flags => [ 'Hidden', 'Unknown' ], + }, + 0x1b => { # vals: 1 (640x480), 1.25 (320x240) + Name => 'DigitalZoom', + Format => 'rational64u', + }, + 0x1c => { # (same as Nikon_0x000a) + Name => 'Nikon_AVITags_0x001c', + Format => 'rational64u', + Flags => [ 'Hidden', 'Unknown' ], + }, + 0x1d => 'ColorMode', + 0x1e => { # string[8] - val: "AUTO" + Name => 'Sharpness', # (guess, could also be ISOSelection) + }, + 0x1f => { # string[16] - val: "AUTO" + Name => 'WhiteBalance', # (guess, could also be ImageAdjustment) + }, + 0x20 => { # string[4] - val: "OFF" + Name => 'NoiseReduction', # (guess) + }, + 0x801a => { # val: 0 (why is the 0x8000 bit set in the ID?) + Name => 'Nikon_AVITags_0x801a', + Format => 'int32s', + Flags => [ 'Hidden', 'Unknown' ], + } +); + +# Nikon NCDT atoms (ref PH) +%Image::ExifTool::Nikon::NCDT = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'Nikon', 2 => 'Video' }, + NOTES => q{ + Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from + various Nikon models. + }, + NCHD => { + Name => 'MakerNoteVersion', + Format => 'undef', + ValueConv => q{ + $val =~ s/\0$//; # remove trailing null + $val =~ s/([\0-\x1f])/'.'.ord($1)/ge; + $val =~ s/\./ /; return $val; + }, + }, + NCTG => { + Name => 'NikonTags', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::NCTG' }, + }, + NCTH => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Format => 'undef', + Binary => 1, + }, + NCVW => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Format => 'undef', + Binary => 1, + }, + NCDB => { # (often 0 bytes long, or 4 null bytes) + Name => 'NikonNCDB', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::NCDB' }, + }, + NCM1 => { + Name => 'PreviewImage1', + Groups => { 2 => 'Preview' }, + Format => 'undef', + Binary => 1, + RawConv => 'length $val ? $val : undef', + }, + NCM2 => { #PH (guess - have only seen 0 bytes) + Name => 'PreviewImage2', + Groups => { 2 => 'Preview' }, + Format => 'undef', + Binary => 1, + RawConv => 'length $val ? $val : undef', + }, +); + +# Nikon NCDB tags from MOV videos (ref PH) +%Image::ExifTool::Nikon::NCDB = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'Nikon', 2 => 'Video' }, + # the following probably contain encrypted data -- look into decryping these! + # OP01 - 320 bytes, starts with "0200" (D600,D610,D810,D3200,D5200) + # - 638 bytes, starts with "0200" (D7100) + # OP02 - 2048 bytes, starts with "0200" (D810) +); + +# Nikon NCTG tags from MOV videos (ref PH) +%Image::ExifTool::Nikon::NCTG = ( + PROCESS_PROC => \&ProcessNikonMOV, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are found in proprietary-format records of the NCTG atom in MOV + videos from some Nikon cameras. + }, + 0x01 => 'Make', + 0x02 => 'Model', + 0x03 => 'Software', + 0x11 => { + Name => 'CreateDate', #(guess, but matches QuickTime CreateDate) + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x12 => { + Name => 'DateTimeOriginal', #(guess, but time is 1 sec before tag 0x11) + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x13 => { + Name => 'FrameCount', + # int32u[2]: "467 0", "1038 0", "1127 0" + ValueConv => '$val =~ s/ 0$//; $val', # (not sure what the extra "0" is for) + }, + # 0x14 - int32u[2]: "0 0" + # 0x15 - int32u[2]: "0 0" + 0x16 => { + Name => 'FrameRate', + Groups => { 2 => 'Video' }, + PrintConv => 'int($val * 1000 + 0.5) / 1000', + }, + # 0x17 - rational62u: same value as FrameRate + # 0x18 - int16u: 1, 2 + 0x19 => { + Name => 'TimeZone', + Groups => { 2 => 'Time' }, + }, + # 0x21 - int16u: 1, 2 + 0x22 => { + Name => 'FrameWidth', + Groups => { 2 => 'Video' }, + }, + 0x23 => { + Name => 'FrameHeight', + Groups => { 2 => 'Video' }, + }, + # 0x24 - int16u: 1, 2 + # 0x31 - int16u: 0, 1, 2 + 0x32 => { #(guess) + Name => 'AudioChannels', + Groups => { 2 => 'Audio' }, + }, + 0x33 => { + Name => 'AudioBitsPerSample', + Groups => { 2 => 'Audio' }, + }, + 0x34 => { + Name => 'AudioSampleRate', + Groups => { 2 => 'Audio' }, + }, + # 0x101 - int16u[4]: "160 120 1280 720", "160 120 3840 2160" + # 0x102 - int16u[8]: "640 360 0 0 0 0 0 0", "640 360 1920 1080 0 0 0 0" + # 0x1001 - int16s: 0 + 0x1002 => { + Name => 'NikonDateTime', #? + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + # 0x1011 - int32u: 0 + # 0x1012 - int32u: 0 + 0x1013 => { #HayoBaan + Name => 'ElectronicVR', + PrintConv => \%offOn, + }, + # 0x1014 - int16u: 1 + # 0x1021 - int32u[32]: all zeros +# +# 0x110**** tags correspond to 0x**** tags in Exif::Main +# + 0x110829a => { #34 + Name => 'ExposureTime', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x110829d => { #34 + Name => 'FNumber', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + }, + 0x1108822 => { + Name => 'ExposureProgram', + PrintConv => { + 0 => 'Not Defined', + 1 => 'Manual', + 2 => 'Program AE', + 3 => 'Aperture-priority AE', + 4 => 'Shutter speed priority AE', + 5 => 'Creative (Slow speed)', + 6 => 'Action (High speed)', + 7 => 'Portrait', + 8 => 'Landscape', + # 9 => 'Bulb', # (non-standard Canon value) + }, + }, + 0x1109204 => { + Name => 'ExposureCompensation', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + 0x1109207 => { + Name => 'MeteringMode', + PrintConv => { + 0 => 'Unknown', + 1 => 'Average', + 2 => 'Center-weighted average', + 3 => 'Spot', + 4 => 'Multi-spot', + 5 => 'Multi-segment', + 6 => 'Partial', + 255 => 'Other', + }, + }, + 0x110920a => { #34 + Name => 'FocalLength', + PrintConv => 'sprintf("%.1f mm",$val)', + }, + 0x110a431 => 'SerialNumber', + 0x110a432 => { + Name => 'LensInfo', + PrintConv => \&Image::ExifTool::Exif::PrintLensInfo, + }, + 0x110a433 => 'LensMake', + 0x110a434 => 'LensModel', + 0x110a435 => 'LensSerialNumber', +# +# 0x120**** tags correspond to 0x**** tags in GPS::Main +# + 0x1200000 => { + Name => 'GPSVersionID', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => '$val =~ tr/ /./; $val', + }, + 0x1200001 => { + Name => 'GPSLatitudeRef', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + N => 'North', + S => 'South', + }, + }, + 0x1200002 => { + Name => 'GPSLatitude', + Groups => { 1 => 'GPS', 2 => 'Location' }, + ValueConv => q{ + require Image::ExifTool::GPS; + Image::ExifTool::GPS::ToDegrees($val); + }, + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)', + }, + 0x1200003 => { + Name => 'GPSLongitudeRef', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + E => 'East', + W => 'West', + }, + }, + 0x1200004 => { + Name => 'GPSLongitude', + Groups => { 1 => 'GPS', 2 => 'Location' }, + ValueConv => q{ + require Image::ExifTool::GPS; + Image::ExifTool::GPS::ToDegrees($val); + }, + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)', + }, + 0x1200005 => { + Name => 'GPSAltitudeRef', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + 0 => 'Above Sea Level', + 1 => 'Below Sea Level', + }, + }, + 0x1200006 => { + Name => 'GPSAltitude', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "$val m"', + }, + 0x1200007 => { + Name => 'GPSTimeStamp', + Groups => { 1 => 'GPS', 2 => 'Time' }, + ValueConv => q{ + require Image::ExifTool::GPS; + Image::ExifTool::GPS::ConvertTimeStamp($val); + }, + PrintConv => 'Image::ExifTool::GPS::PrintTimeStamp($val)', + }, + 0x1200008 => { + Name => 'GPSSatellites', + Groups => { 1 => 'GPS', 2 => 'Location' }, + }, + 0x1200010 => { + Name => 'GPSImgDirectionRef', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + M => 'Magnetic North', + T => 'True North', + }, + }, + 0x1200011 => { + Name => 'GPSImgDirection', + Groups => { 1 => 'GPS', 2 => 'Location' }, + }, + 0x1200012 => { + Name => 'GPSMapDatum', + Groups => { 1 => 'GPS', 2 => 'Location' }, + }, + 0x120001d => { + Name => 'GPSDateStamp', + Groups => { 1 => 'GPS', 2 => 'Time' }, + ValueConv => 'Image::ExifTool::Exif::ExifDate($val)', + }, +# +# 0x200**** tags correspond to 0x**** tags in Nikon::Main +# (must be duplicated here so tagInfo "Table" entry will point to correct table. +# Also there would be a problem with the PRINT_CONV from the Main table) +# + 0x2000001 => { + Name => 'MakerNoteVersion', + PrintConv => '$_=$val;s/^(\d{2})/$1\./;s/^0//;$_', + }, + 0x2000005 => 'WhiteBalance', + 0x2000007 => { Name => 'FocusMode', Writable => 'string' }, #34 + 0x200000b => 'WhiteBalanceFineTune', + 0x200001b => { + Name => 'CropHiSpeed', + Writable => 'int16u', + Count => 7, + PrintConv => \%cropHiSpeed, + }, + 0x200001e => { + Name => 'ColorSpace', + PrintConv => { + 1 => 'sRGB', + 2 => 'Adobe RGB', + }, + }, + 0x200001f => { + Name => 'VRInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::VRInfo' }, + }, + 0x2000022 => { + Name => 'ActiveD-Lighting', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 3 => 'Normal', + 5 => 'High', + 7 => 'Extra High', + 8 => 'Extra High 1', + 9 => 'Extra High 2', + 10 => 'Extra High 3', + 11 => 'Extra High 4', + 0xffff => 'Auto', + }, + }, + 0x2000023 => [ + { #PH (D300, but also found in D3,D3S,D3X,D90,D300S,D700,D3000,D5000) + Name => 'PictureControlData', + Condition => '$$valPt =~ /^01/', + Writable => 'undef', + Permanent => 0, + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControl' }, + },{ #28 + Name => 'PictureControlData', + Condition => '$$valPt =~ /^02/', + Writable => 'undef', + Permanent => 0, + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControl2' }, + },{ + Name => 'PictureControlData', + Condition => '$$valPt =~ /^03/', + Writable => 'undef', + Permanent => 0, + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControl3' }, + },{ + Name => 'PictureControlData', + Writable => 'undef', + Permanent => 0, + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControlUnknown' }, + }, + ], + 0x2000024 => { + Name => 'WorldTime', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::WorldTime' }, + }, + 0x2000025 => { #34 + Name => 'ISOInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::ISOInfo', + ByteOrder => 'BigEndian', # (BigEndian even for D810, which is a little-endian camera) + }, + }, + 0x200002a => { #23 (this tag added with D3 firmware 1.10 -- also written by Nikon utilities) + Name => 'VignetteControl', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 3 => 'Normal', + 5 => 'High', + }, + }, + 0x200002c => { + Name => 'UnknownInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::UnknownInfo' }, + }, + # 0x200002d - int16u[3]: "512 0 0" + 0x2000032 => { + Name => 'UnknownInfo2', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::UnknownInfo2' }, + }, + 0x2000039 => { + Name => 'LocationInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LocationInfo' }, + }, + # 0x200003f - rational64s[2]: "0 0" + # 0x2000042 - undef[6]: "0100\x03\0" + # 0x2000043 - undef[12]: all zeros + 0x2000083 => { + Name => 'LensType', + # credit to Tom Christiansen (ref 7) for figuring this out... + PrintConv => q[$_ = $val ? Image::ExifTool::DecodeBits($val, + { + 0 => 'MF', + 1 => 'D', + 2 => 'G', + 3 => 'VR', + 4 => '1', #PH + # bit 5 set for FT-1 adapter? - PH + 6 => 'E', #PH (electromagnetic aperture mechanism) + # bit 7 set for AF-P lenses? - PH + }) : 'AF'; + # remove commas and change "D G" to just "G" + s/,//g; s/\bD G\b/G/; + s/ E\b// and s/^(G )?/E /; # put "E" at the start instead of "G" + s/ 1// and $_ = "1 $_"; # put "1" at start + return $_; + ], + }, + 0x2000084 => { + Name => "Lens", + # short focal, long focal, aperture at short focal, aperture at long focal + PrintConv => \&Image::ExifTool::Exif::PrintLensInfo, + }, + 0x2000087 => { + Name => 'FlashMode', + Writable => 'int8u', + PrintConv => { + 0 => 'Did Not Fire', + 1 => 'Fired, Manual', #14 + 3 => 'Not Ready', #28 + 7 => 'Fired, External', #14 + 8 => 'Fired, Commander Mode', + 9 => 'Fired, TTL Mode', + 18 => 'LED Light', #G.F. (movie LED light) + }, + }, + 0x2000098 => [ + { #8 + Condition => '$$valPt =~ /^0100/', # D100, D1X - PH + Name => 'LensData0100', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LensData00' }, + }, + { #8 + Condition => '$$valPt =~ /^0101/', # D70, D70s - PH + Name => 'LensData0101', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LensData01' }, + }, + # note: this information is encrypted if the version is 02xx + { #8 + # 0201 - D200, D2Hs, D2X and D2Xs + # 0202 - D40, D40X and D80 + # 0203 - D300 + Condition => '$$valPt =~ /^020[1-3]/', + Name => 'LensData0201', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensData01', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + }, + }, + { #PH + Condition => '$$valPt =~ /^0204/', # D90, D7000 + Name => 'LensData0204', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensData0204', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + }, + }, + { + Condition => '$$valPt =~ /^040[01]/', # 0=1J1/1V1, 1=1J2 + Name => 'LensData0400', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensData0400', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + }, + }, + { + Condition => '$$valPt =~ /^0402/', # 1J3/1S1/1V2 + Name => 'LensData0402', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensData0402', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + }, + }, + { + Condition => '$$valPt =~ /^0403/', # 1J4,1J5 + Name => 'LensData0403', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensData0403', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + }, + }, + { + Condition => '$$valPt =~ /^080[012]/', # Z6/Z7/Z9 + Name => 'LensData0800', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensData0800', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + ByteOrder => 'LittleEndian', + # 0x5a0c - NikonMeteringMode for some Z6 ver1.00 samples (ref PH) + }, + }, + { + Name => 'LensDataUnknown', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::LensDataUnknown', + ProcessProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + WriteProc => \&Image::ExifTool::Nikon::ProcessNikonEncrypted, + DecryptStart => 4, + }, + }, + ], + 0x20000a7 => { # Number of shots taken by camera so far (ref 2) + Name => 'ShutterCount', + PrintConv => '$val == 4294965247 ? "n/a" : $val', + }, + 0x20000a8 => [ + { + Name => 'FlashInfo0100', + Condition => '$$valPt =~ /^010[01]/', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0100' }, + }, + { + Name => 'FlashInfo0102', + Condition => '$$valPt =~ /^0102/', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0102' }, + }, + { + Name => 'FlashInfo0103', + # (0104 for D7000, 0105 for D800) + Condition => '$$valPt =~ /^010[345]/', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0103' }, + }, + { + Name => 'FlashInfo0106', # (0106 for D7100) + Condition => '$$valPt =~ /^0106/', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0106' }, + }, + { + Name => 'FlashInfo0107', # (0107 for D4S/D750/D810/D5500/D7200, 0108 for D5/D500/D3400) + Condition => '$$valPt =~ /^010[78]/', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0107' }, + }, + { + Name => 'FlashInfoUnknown', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfoUnknown' }, + }, + ], + 0x20000ab => { Name => 'VariProgram', Writable => 'string' }, #2 (scene mode for DSLR's - PH) + 0x20000b1 => { #34 + Name => 'HighISONoiseReduction', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Minimal', # for high ISO (>800) when setting is "Off" + 2 => 'Low', # Low,Normal,High take effect for ISO > 400 + 3 => 'Medium Low', + 4 => 'Normal', + 5 => 'Medium High', + 6 => 'High', + }, + }, + 0x20000b7 => { + Name => 'AFInfo2', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AFInfo2' }, + }, + # 0x20000c0 - undef[8] + 0x20000c3 => { + Name => 'BarometerInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::BarometerInfo', + # (little-endian in II EXIF, big-endian in MOV) + }, + }, +); + +# Nikon XMP tags written in NKSC metadata +%Image::ExifTool::Nikon::ast = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-ast', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP, + NAMESPACE => 'ast', + VARS => { NO_ID => 1 }, + NOTES => 'Tags used by Nikon NX Studio in Nikon NKSC sidecar files and trailers.', + about => { }, + version => { }, + XMLPackets => { + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + Encoding => 'Base64', + Binary => 1, + }, + IPTC => { + SubDirectory => { TagTable => 'Image::ExifTool::IPTC::Main' }, + Encoding => 'Base64', + Binary => 1, + }, + GPSVersionID => { Groups => { 2 => 'Location' }, %base64bytes }, + GPSLatitudeRef => { + Groups => { 2 => 'Location' }, + %base64int32u, + PrintConv => { 0 => 'North', 1 => 'South' }, #PH (NC) + }, + GPSLatitude => { Groups => { 2 => 'Location' }, %base64coord }, + GPSLongitudeRef => { + Groups => { 2 => 'Location' }, + %base64int32u, + PrintConv => { 2 => 'East', 3 => 'West' }, #PH (NC) + }, + GPSLongitude => { Groups => { 2 => 'Location' }, %base64coord }, + GPSAltitudeRef => { + Groups => { 2 => 'Location' }, + %base64bytes, + PrintConv => { + 0 => 'Above Sea Level', + 1 => 'Below Sea Level', + }, + }, + GPSAltitude => { + Groups => { 2 => 'Location' }, + %base64double, + PrintConv => '"$val m"', + }, + GPSMapDatum => { Groups => { 2 => 'Location' } }, + GPSImgDirection => { + Groups => { 2 => 'Location' }, + %base64double, + PrintConv => 'sprintf("%.2f", $val)', + }, + GPSImgDirectionRef => { + Groups => { 2 => 'Location' }, + PrintConv => { + M => 'Magnetic North', + T => 'True North', + }, + }, +); +%Image::ExifTool::Nikon::sdc = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-sdc', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP, + NAMESPACE => 'sdc', + VARS => { NO_ID => 1 }, + about => { }, + version => { }, + appversion => { Name => 'AppVersion' }, + appname => { Name => 'AppName' }, +); +%Image::ExifTool::Nikon::nine = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-nine', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP, + NAMESPACE => 'nine', + VARS => { NO_ID => 1 }, + about => { }, + version => { }, + Label => { }, + Rating => { }, + Trim => { %base64bin }, + NineEdits => { + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::NineEdits', + IgnoreProp => { userData => 1 }, # remove "UserData" from already overly long tag names + }, + Binary => 1, + }, +); +%Image::ExifTool::Nikon::NineEdits = ( + GROUPS => { 0 => 'XML', 1 => 'NineEdits', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP, + VARS => { NO_ID => 1 }, + NOTES => 'XML-based tags used to store editing information.', + filterParametersBinary => { %base64bin }, + filterParametersExportExportData => { %base64bin }, + filterParametersCustomCustomData => { %base64bin }, +); + +# Nikon composite tags +%Image::ExifTool::Nikon::Composite = ( + GROUPS => { 2 => 'Camera' }, + LensSpec => { + Require => { + 0 => 'Nikon:Lens', + 1 => 'Nikon:LensType', + }, + ValueConv => '"$val[0] $val[1]"', + PrintConv => '"$prt[0] $prt[1]"', + }, + LensID => { + SeparateTable => 'Nikon LensID', # print values in a separate table + Require => { + 0 => 'Nikon:LensIDNumber', + 1 => 'LensFStops', + 2 => 'MinFocalLength', + 3 => 'MaxFocalLength', + 4 => 'MaxApertureAtMinFocal', + 5 => 'MaxApertureAtMaxFocal', + 6 => 'MCUVersion', + 7 => 'Nikon:LensType', + }, + # construct lens ID string as per ref 11 + ValueConv => 'sprintf("%.2X"." %.2X"x7, @raw)', + PrintConv => \%nikonLensIDs, + }, + AutoFocus => { + Require => { + 0 => 'Nikon:PhaseDetectAF', + 1 => 'Nikon:ContrastDetectAF', + }, + ValueConv => '($val[0] or $val[1]) ? 1 : 0', + PrintConv => \%offOn, + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::Nikon'); + +#------------------------------------------------------------------------------ +# Process Nikon AVI tags (D5000 videos) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessNikonAVI($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart} || 0; + my $dirEnd = $pos + $$dirInfo{DirLen}; + $et->VerboseDir($dirInfo, undef, $$dirInfo{DirLen}); + SetByteOrder('II'); + while ($pos + 4 <= $dirEnd) { + my $tag = Get16u($dataPt, $pos); + my $size = Get16u($dataPt, $pos + 2); + $pos += 4; + last if $pos + $size > $dirEnd; + $et->HandleTag($tagTablePtr, $tag, undef, + DataPt => $dataPt, + Start => $pos, + Size => $size, + ); + $pos += $size; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Print conversion for Nikon AF points +# Inputs: 0) value to convert (as a string of hex bytes), +# 1) lookup for AF point bit number (starting at 1) +sub PrintAFPoints($$) +{ + my ($val, $afPoints) = @_; + my ($i, $j, @points); + $val =~ tr/ //d; # remove spaces from hex string + my @dat = unpack 'C*', pack 'H*', $val; # convert to array of bytes + # loop through all bytes to find active AF points + for ($i=0; $i<=@dat; ++$i) { + next unless $dat[$i]; + for ($j=0; $j<8; ++$j) { + next unless $dat[$i] & (1 << $j); + my $point = $$afPoints{$i*8 + $j + 1}; + push @points, $point if defined $point; + } + } + return '(none)' unless @points; + # sort the points and return as comma-separated string + return join ',', sort { + return $a cmp $b if length($a) == length($b); + return substr($a,0,1).'0'.substr($a,1,1) cmp $b if length($a) == 2; + return $a cmp substr($b,0,1).'0'.substr($b,1,1); + } @points; +} + +#------------------------------------------------------------------------------ +# Inverse print conversion for AF points +# Inputs: 0) AF point string, 1) AF point lookup +# Returns: AF point data as a string of hex bytes +sub PrintAFPointsInv($$) +{ + my ($val, $afPoints) = @_; + my @points = ($val =~ /[A-Za-z]\d+/g); + my $size = int((scalar(keys %$afPoints) + 7) / 8); + my @dat = (0) x $size; + if (@points) { + my (%bitNum, $point); + $bitNum{$$afPoints{$_}} = $_ foreach keys %$afPoints; # build reverse lookup + foreach $point (@points) { + my $bitNum = $bitNum{uc $point} or next; + my $byte = int(($bitNum - 1) / 8); + $dat[$byte] |= (1 << (($bitNum - 1) % 8)); + } + } + return join(" ", unpack("H2"x$size, pack('C*', @dat))); +} + +#------------------------------------------------------------------------------ +# Get AF point name for grid-type AF +# Inputs: 0) AF point number, 1) number of columns, 2) true for inverse conversion +# Returns: AF point name, or undef +sub GetAFPointGrid($$;$) +{ + my ($val, $ncol, $inv) = @_; + if ($inv) { + return undef unless $val =~ /^([A-J])(\d+)$/i; + return (ord(uc($1))-65) * $ncol + $2 - 1; + } else { + my $row = int(($val + 0.5) / $ncol) & 0xff; + my $col = $val - $ncol * $row + 1; + return chr(65+$row) . $col; + } +} + +#------------------------------------------------------------------------------ +# Print conversion for grid-type AF points +# Inputs: 0) value to convert (as a string of hex bytes), +# 1) number of columns in grid +sub PrintAFPointsGrid($$) +{ + my ($val, $ncol) = @_; + my ($i, $j, @points); + $val =~ tr/ //d; # remove spaces from hex string + my @dat = unpack 'C*', pack 'H*', $val; # convert to array of bytes + # loop through all bytes to find active AF points + for ($i=0; $i<@dat; ++$i) { + next unless $dat[$i]; + for ($j=0; $j<8; ++$j) { + next unless $dat[$i] & (1 << $j); + my $point = GetAFPointGrid($i*8 + $j, $ncol); + push @points, $point if defined $point; + } + } + return '(none)' unless @points; + return join ',', @points; # return as comma-separated string +} + +#------------------------------------------------------------------------------ +# Inverse print conversion for AF points +# Inputs: 0) AF point string, 1) number of columns, 2) size of data +# Returns: AF point data as a string of hex bytes +sub PrintAFPointsGridInv($$$) +{ + my ($val, $ncol, $size) = @_; + my @points = ($val =~ /[A-Za-z]\d+/g); + my @dat = (0) x $size; + foreach (@points) { + my $n = GetAFPointGrid($_, $ncol, 1); + next unless defined $n; + my $byte = int($n / 8); + next if $byte > $size; + $dat[$byte] |= (1 << ($n - $byte * 8)); + } + return join(" ", unpack("H2"x$size, pack('C*', @dat))); +} + +#------------------------------------------------------------------------------ +# Print conversion for relative Left/Right AF points (ref 28) +# Inputs: 0) column, 1) number of columns +# Returns: AF point data as a string (e.g. '2L of Center' or 'C' or '3R of Center') +sub PrintAFPointsLeftRight($$) +{ + my ($col, $ncol) = @_; + my $center = 1 + ($ncol + 1)/2; + return 'C' if $col == $center; + return sprintf('%d', $center - $col) . 'L of Center' if $col < $center; + return sprintf('%d', $col - $center) . 'R of Center' if $col > $center; +} + +#------------------------------------------------------------------------------ +# Print conversion for relative Up/Down AF points (ref 28) +# Inputs: 0) row, 1) number of rows +# Returns: AF point data as a string (e.g. '2U from Center' or 'C' or '3D from Center') +sub PrintAFPointsUpDown($$) +{ + my ($row, $nrow) = @_; + my $center = 1 + ($nrow + 1)/2; + return 'C' if $row == $center; + return sprintf('%d', $center - $row) . 'U from Center' if $row < $center; + return sprintf('%d', $row - $center) . 'D from Center' if $row > $center; +} + +#------------------------------------------------------------------------------ +# Print PictureControl value +# Inputs: 0) value (with 0x80 subtracted), +# 1) 'Normal' (0 value) string (default 'Normal') +# 2) format string for numbers (default '%+d'), 3) v2 divisor +# Returns: PrintConv value +sub PrintPC($;$$$) +{ + my ($val, $norm, $fmt, $div) = @_; + return $norm || 'Normal' if $val == 0; + return 'n/a' if $val == 0x7f; + return 'Auto' if $val == -128; + # -127 = custom curve created in Camera Control Pro (show as "User" by D3) - ref 28 + return 'User' if $val == -127; #28 + return sprintf($fmt || '%+d', $val / ($div || 1)); +} + +#------------------------------------------------------------------------------ +# Inverse of PrintPC +# Inputs: 0) PrintConv value (after subracting 0x80 from raw value), 1) v2 divisor +# Returns: unconverted value +# Notes: raw values: 0=Auto, 1=User, 0xff=n/a, ... 0x7f=-1, 0x80=0, 0x81=1, ... +sub PrintPCInv($;$) +{ + my ($val, $div) = @_; + return $val * ($div || 1) if $val =~ /^[-+]?\d+(\.\d+)?$/; + return 0x7f if $val =~ /n\/a/i; + return -128 if $val =~ /auto/i; + return -127 if $val =~ /user/i; #28 + return 0; +} + +#------------------------------------------------------------------------------ +# Convert unknown LensID values +# Inputs: 0) value, 1) flag for inverse conversion, 2) PrintConv hash ref +sub LensIDConv($$$) +{ + my ($val, $inv, $conv) = @_; + return undef if $inv; + # multiple lenses with the same LensID are distinguished by decimal values + if ($$conv{"$val.1"}) { + my ($i, @vals, @user); + for ($i=1; ; ++$i) { + my $lens = $$conv{"$val.$i"} or last; + if ($Image::ExifTool::userLens{$lens}) { + push @user, $lens; + } else { + push @vals, $lens; + } + } + return join(' or ', @user) if @user; + return join(' or ', @vals); + } + # Sigma has been changing the LensIDNumber on some new lenses + # and with some Sigma lenses the LensFStops changes! (argh!) + # Also, older cameras my not set bits 4-7 of LensType + my $pat = $val; + $pat =~ s/^\w+ \w+/.. ../; # ignore LensIDNumber and LensFStops + $pat =~ s/\w(\w)$/.$1/; # ignore bits 4-7 of LensType + my @ids = sort grep /^$pat$/, keys %$conv; + if (@ids) { + # first try different LensFStops (2nd value) + ($pat = $val) =~ s/ \w+/ ../; + my @good = grep /^$pat$/, @ids; + return $$conv{$good[0]} if @good; + # then try different LensIDNumber (1st value) + ($pat = $val) =~ s/^\w+/../; + @good = grep /^$pat$/, @ids; + return "Unknown ($val) $$conv{$good[0]} ?" if @good; + # older cameras may not set bits 4-7 of LensType + ($pat = $val) =~ s/\w(\w)$/.$1/; + @good = grep /^$pat$/, @ids; + return "Unknown ($val) $$conv{$good[0]} ?" if @good; + } + return undef; +} + +#------------------------------------------------------------------------------ +# Clean up formatting of string values +# Inputs: 0) string value +# Returns: formatted string value +# - removes trailing spaces and changes case to something more sensible +sub FormatString($) +{ + my $str = shift; + # limit string length (can be very long for some unknown tags) + if (length($str) > 60) { + $str = substr($str,0,55) . "[...]"; + } else { + $str =~ s/\s+$//; # remove trailing white space + # Don't change case of non-words (no vowels) + if ($str =~ /[AEIOUY]/) { + # change all letters but the first to lower case, + # but only in words containing a vowel + if ($str =~ s/\b([AEIOUY])([A-Z]+)/$1\L$2/g) { + $str =~ s/\bAf\b/AF/; # patch for "AF" + # patch for a number of models that write improper string + # terminator for ImageStabilization (VR-OFF, VR-ON) + $str =~ s/ +.$//s; + } + if ($str =~ s/\b([A-Z])([A-Z]*[AEIOUY][A-Z]*)/$1\L$2/g) { + $str =~ s/\bRaw\b/RAW/; # patch for "RAW" + } + } + } + return $str; +} + +#------------------------------------------------------------------------------ +# decoding tables from ref 4 +my @xlat = ( + [ 0xc1,0xbf,0x6d,0x0d,0x59,0xc5,0x13,0x9d,0x83,0x61,0x6b,0x4f,0xc7,0x7f,0x3d,0x3d, + 0x53,0x59,0xe3,0xc7,0xe9,0x2f,0x95,0xa7,0x95,0x1f,0xdf,0x7f,0x2b,0x29,0xc7,0x0d, + 0xdf,0x07,0xef,0x71,0x89,0x3d,0x13,0x3d,0x3b,0x13,0xfb,0x0d,0x89,0xc1,0x65,0x1f, + 0xb3,0x0d,0x6b,0x29,0xe3,0xfb,0xef,0xa3,0x6b,0x47,0x7f,0x95,0x35,0xa7,0x47,0x4f, + 0xc7,0xf1,0x59,0x95,0x35,0x11,0x29,0x61,0xf1,0x3d,0xb3,0x2b,0x0d,0x43,0x89,0xc1, + 0x9d,0x9d,0x89,0x65,0xf1,0xe9,0xdf,0xbf,0x3d,0x7f,0x53,0x97,0xe5,0xe9,0x95,0x17, + 0x1d,0x3d,0x8b,0xfb,0xc7,0xe3,0x67,0xa7,0x07,0xf1,0x71,0xa7,0x53,0xb5,0x29,0x89, + 0xe5,0x2b,0xa7,0x17,0x29,0xe9,0x4f,0xc5,0x65,0x6d,0x6b,0xef,0x0d,0x89,0x49,0x2f, + 0xb3,0x43,0x53,0x65,0x1d,0x49,0xa3,0x13,0x89,0x59,0xef,0x6b,0xef,0x65,0x1d,0x0b, + 0x59,0x13,0xe3,0x4f,0x9d,0xb3,0x29,0x43,0x2b,0x07,0x1d,0x95,0x59,0x59,0x47,0xfb, + 0xe5,0xe9,0x61,0x47,0x2f,0x35,0x7f,0x17,0x7f,0xef,0x7f,0x95,0x95,0x71,0xd3,0xa3, + 0x0b,0x71,0xa3,0xad,0x0b,0x3b,0xb5,0xfb,0xa3,0xbf,0x4f,0x83,0x1d,0xad,0xe9,0x2f, + 0x71,0x65,0xa3,0xe5,0x07,0x35,0x3d,0x0d,0xb5,0xe9,0xe5,0x47,0x3b,0x9d,0xef,0x35, + 0xa3,0xbf,0xb3,0xdf,0x53,0xd3,0x97,0x53,0x49,0x71,0x07,0x35,0x61,0x71,0x2f,0x43, + 0x2f,0x11,0xdf,0x17,0x97,0xfb,0x95,0x3b,0x7f,0x6b,0xd3,0x25,0xbf,0xad,0xc7,0xc5, + 0xc5,0xb5,0x8b,0xef,0x2f,0xd3,0x07,0x6b,0x25,0x49,0x95,0x25,0x49,0x6d,0x71,0xc7 ], + [ 0xa7,0xbc,0xc9,0xad,0x91,0xdf,0x85,0xe5,0xd4,0x78,0xd5,0x17,0x46,0x7c,0x29,0x4c, + 0x4d,0x03,0xe9,0x25,0x68,0x11,0x86,0xb3,0xbd,0xf7,0x6f,0x61,0x22,0xa2,0x26,0x34, + 0x2a,0xbe,0x1e,0x46,0x14,0x68,0x9d,0x44,0x18,0xc2,0x40,0xf4,0x7e,0x5f,0x1b,0xad, + 0x0b,0x94,0xb6,0x67,0xb4,0x0b,0xe1,0xea,0x95,0x9c,0x66,0xdc,0xe7,0x5d,0x6c,0x05, + 0xda,0xd5,0xdf,0x7a,0xef,0xf6,0xdb,0x1f,0x82,0x4c,0xc0,0x68,0x47,0xa1,0xbd,0xee, + 0x39,0x50,0x56,0x4a,0xdd,0xdf,0xa5,0xf8,0xc6,0xda,0xca,0x90,0xca,0x01,0x42,0x9d, + 0x8b,0x0c,0x73,0x43,0x75,0x05,0x94,0xde,0x24,0xb3,0x80,0x34,0xe5,0x2c,0xdc,0x9b, + 0x3f,0xca,0x33,0x45,0xd0,0xdb,0x5f,0xf5,0x52,0xc3,0x21,0xda,0xe2,0x22,0x72,0x6b, + 0x3e,0xd0,0x5b,0xa8,0x87,0x8c,0x06,0x5d,0x0f,0xdd,0x09,0x19,0x93,0xd0,0xb9,0xfc, + 0x8b,0x0f,0x84,0x60,0x33,0x1c,0x9b,0x45,0xf1,0xf0,0xa3,0x94,0x3a,0x12,0x77,0x33, + 0x4d,0x44,0x78,0x28,0x3c,0x9e,0xfd,0x65,0x57,0x16,0x94,0x6b,0xfb,0x59,0xd0,0xc8, + 0x22,0x36,0xdb,0xd2,0x63,0x98,0x43,0xa1,0x04,0x87,0x86,0xf7,0xa6,0x26,0xbb,0xd6, + 0x59,0x4d,0xbf,0x6a,0x2e,0xaa,0x2b,0xef,0xe6,0x78,0xb6,0x4e,0xe0,0x2f,0xdc,0x7c, + 0xbe,0x57,0x19,0x32,0x7e,0x2a,0xd0,0xb8,0xba,0x29,0x00,0x3c,0x52,0x7d,0xa8,0x49, + 0x3b,0x2d,0xeb,0x25,0x49,0xfa,0xa3,0xaa,0x39,0xa7,0xc5,0xa7,0x50,0x11,0x36,0xfb, + 0xc6,0x67,0x4a,0xf5,0xa5,0x12,0x65,0x7e,0xb0,0xdf,0xaf,0x4e,0xb3,0x61,0x7f,0x2f ] +); + +# Decrypt Nikon data block (ref 4) +# Inputs: 0) reference to data block, 1) serial number key, 2) shutter count key +# 4) optional start offset (default 0) +# 5) optional number of bytes to decode (default to the end of the data) +# Returns: data block with specified data decrypted +sub Decrypt($$$;$$) +{ + my ($dataPt, $serial, $count, $start, $len) = @_; + my ($i, $dat); + + $start or $start = 0; + my $maxLen = length($$dataPt) - $start; + $len = $maxLen if not defined $len or $len > $maxLen; + return $$dataPt if $len <= 0; + my $key = 0; + for ($i=0; $i<4; ++$i) { + $key ^= ($count >> ($i*8)) & 0xff; + } + my $ci = $xlat[0][$serial & 0xff]; + my $cj = $xlat[1][$key]; + my $ck = 0x60; + my @data = unpack("x${start}C$len", $$dataPt); + foreach $dat (@data) { + $cj = ($cj + $ci * $ck) & 0xff; + $ck = ($ck + 1) & 0xff; + $dat ^= $cj; + } + my $end = $start + $len; + my $pre = $start ? substr($$dataPt, 0, $start) : ''; + my $post = $end < length($$dataPt) ? substr($$dataPt, $end) : ''; + return $pre . pack('C*',@data) . $post; +} + +#------------------------------------------------------------------------------ +# Get serial number for use as a decryption key +# Inputs: 0) ExifTool object ref, 1) serial number string +# Returns: serial key integer or undef if no serial number provided +sub SerialKey($$) +{ + my ($et, $serial) = @_; + # use serial number as key if integral + return $serial if not defined $serial or $serial =~ /^\d+$/; + return 0x22 if $$et{Model} =~ /\bD50$/; # D50 (ref 8) + return 0x60; # D200 (ref 10), D40X (ref PH), etc +} + +#------------------------------------------------------------------------------ +# Extract information from "NIKON APP" trailer (ref PH) +# Inputs: 0) ExifTool ref, 1) Optional dirInfo ref for returning trailer info +# Returns: true on success +sub ProcessNikonApp($;$) +{ + local $_; + my ($et, $dirInfo) = @_; + my $raf = $$et{RAF}; + my $offset = $dirInfo ? $$dirInfo{Offset} || 0 : 0; + my $buff; + + return 0 unless $raf->Seek(-20-$offset, 2) and $raf->Read($buff, 20) == 20 and + substr($buff,-16) eq "\0\0\0\0\0\0/NIKON APP"; # check magic number + + my $verbose = $et->Options('Verbose'); + my $fileEnd = $raf->Tell(); + my $trailerLen = unpack('N', $buff); + $trailerLen > $fileEnd and $et->Warn('Bad NikonApp trailer size'), return 0; + if ($dirInfo) { + $$dirInfo{DirLen} = $trailerLen if $dirInfo; + $$dirInfo{DataPos} = $fileEnd - $trailerLen; + if ($$dirInfo{OutFile}) { + if ($$et{DEL_GROUP}{NikonApp}) { + ++$$et{CHANGED}; + # just copy the trailer when writing + } elsif ($trailerLen > $fileEnd or not $raf->Seek($$dirInfo{DataPos}, 0) or + $raf->Read(${$$dirInfo{OutFile}}, $trailerLen) != $trailerLen) + { + return 0; + } else { + return 1; + } + } + $et->DumpTrailer($dirInfo) if $verbose or $$et{HTML_DUMP}; + } + unless ($trailerLen >= 0x40 and $raf->Seek($fileEnd - $trailerLen, 0) and + $raf->Read($buff, 0x40) == 0x40 and $buff =~ m(NIKON APP\0)) + { + $et->Warn('Error reading NikonApp trailer'); + return 0; + } + $$et{SET_GROUP0} = 'NikonApp'; + while ($raf->Read($buff, 8) == 8) { + my ($id, $len) = unpack('N2', $buff); + if ($len & 0x80000000) { + $et->Warn('Invalid NikonApp record length'); + last; + } + last if $id == 0 and $len == 0; + unless ($raf->Read($buff, $len) == $len) { + $et->Warn('Truncated NikonApp record'); + last; + } + if ($id == 1) { + require Image::ExifTool::XMP; + Image::ExifTool::XMP::ProcessXMP($et, { DataPt => \$buff }); + } else { # (haven't seen any other types of records) + $et->Warn("Unknown NikonApp record $id"); + last; + } + } + delete $$et{SET_GROUP0}; + return 1; +} + +#------------------------------------------------------------------------------ +# Read Nikon NCTG tags in MOV videos +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessNikonMOV($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my %needTags = ( 0x110a431 => 0, 0x20000a7 => undef ); # needed for decryption + $et->VerboseDir($$dirInfo{DirName}, 0, $$dirInfo{DirLen}); + my $pass; + # do two passes so we can pre-scan for necessary decryption keys + for ($pass=0; $pass<2; ++$pass) { + my $pos = $$dirInfo{DirStart}; + my $end = $pos + $$dirInfo{DirLen}; + while ($pos + 8 < $end) { + my $tag = Get32u($dataPt, $pos); + my $fmt = Get16u($dataPt, $pos + 4); # (same format code as EXIF) + my $count = Get16u($dataPt, $pos + 6); + $pos += 8; + my $fmtStr = $Image::ExifTool::Exif::formatName[$fmt]; + unless ($fmtStr) { + $et->Warn(sprintf("Unknown format ($fmt) for $$dirInfo{DirName} tag 0x%x",$tag)) if $pass; + last; + } + my $size = $count * $Image::ExifTool::Exif::formatSize[$fmt]; + if ($pos + $size > $end) { + $et->Warn(sprintf("Truncated data for $$dirInfo{DirName} tag 0x%x",$tag)) if $pass; + last; + } + if ($pass) { + my $rational; + my $val = ReadValue($dataPt, $pos, $fmtStr, $count, $size, \$rational); + my $key = $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + DataPos => $dataPos, + Format => $fmtStr, + Start => $pos, + Size => $size, + Base => $$dirInfo{Base}, + ); + $$et{RATIONAL}{$key} = $rational if $rational and $key; + } elsif (exists $needTags{$tag}) { + $needTags{$tag} = ReadValue($dataPt, $pos, $fmtStr, $count, $size); + $$et{NikonSerialKey} = SerialKey($et, $needTags{0x110a431}); + $$et{NikonCountKey} = $needTags{0x20000a7}; + } + $pos += $size; # is this padded to an even offset???? + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Read/Write Nikon Encrypted data block +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success when reading, or new directory when writing (IsWriting set) +sub ProcessNikonEncrypted($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access + my $serial = $$et{NikonSerialKey}; + my $count = $$et{NikonCountKey}; + unless (defined $serial and defined $count and $serial =~ /^\d+$/ and $count =~ /^\d+$/) { + if (defined $serial or defined $count) { + my $msg; + if (defined $serial and defined $count) { + $msg = $serial =~ /^\d+$/ ? 'invalid ShutterCount' : 'invalid SerialNumber'; + } else { + $msg = defined $serial ? 'no ShutterCount' : 'no SerialNumber'; + } + $et->Warn("Can't decrypt Nikon information ($msg key)"); + } + delete $$et{NikonSerialKey}; + delete $$et{NikonCountKey}; + return 0; + } + my $verbose = $$dirInfo{IsWriting} ? 0 : $et->Options('Verbose'); + my $tagInfo = $$dirInfo{TagInfo}; + my $dirStart = $$dirInfo{DirStart}; + my $data = substr(${$$dirInfo{DataPt}}, $dirStart, $$dirInfo{DirLen}); + + my ($start, $len, $more, $offset, $byteOrder, $recrypt, $newSerial, $newCount); + + # must re-encrypt when writing if serial number or shutter count changes + if ($$dirInfo{IsWriting}) { + if ($$et{NewNikonSerialKey}) { + $newSerial = $$et{NewNikonSerialKey}; + $recrypt = 1; + } + if ($$et{NewNikonCountKey}) { + $newCount = $$et{NewNikonCountKey}; + $recrypt = 1; + } + } + if ($tagInfo and $$tagInfo{SubDirectory}) { + $start = $$tagInfo{SubDirectory}{DecryptStart}; + # may decrypt only part of the information to save time + if ($verbose < 3 and $et->Options('Unknown') < 2 and not $recrypt) { + $len = $$tagInfo{SubDirectory}{DecryptLen}; + $more = $$tagInfo{SubDirectory}{DecryptMore}; + } + $offset = $$tagInfo{SubDirectory}{DirOffset}; + $byteOrder = $$tagInfo{SubDirectory}{ByteOrder}; + } + $start or $start = 0; + if (defined $offset) { + # offset, if specified, is relative to start of encrypted data + $offset += $start; + } else { + $offset = 0; + } + my $maxLen = length($data) - $start; + # decrypt all the data unless DecryptLen is given + unless ($len and $len < $maxLen) { + $len = $maxLen; + undef $more; # (can't decrypt more than this) + } + + $data = Decrypt(\$data, $serial, $count, $start, $len); + + # set appropriate byte ordering before evaluating DecryptMore + my $oldOrder = GetByteOrder(); + SetByteOrder($byteOrder) if $byteOrder; + + if ($more) { + #### eval DecryptMore ($data) + my $moreLen = eval $more; + $moreLen = $maxLen if $moreLen > $maxLen; + # re-decrypt with new length + if ($len < $moreLen) { + $len = $moreLen; + $data = substr(${$$dirInfo{DataPt}}, $dirStart, $$dirInfo{DirLen}); + $data = Decrypt(\$data, $serial, $count, $start, $len); + } + } + if ($verbose > 2) { + $et->VerboseDir("Decrypted $$tagInfo{Name}"); + $et->VerboseDump(\$data, + Prefix => $$et{INDENT} . ' ', + # (remove this because it is useful to have decrypted offsets start at 0) + #DataPos => $dirStart + $$dirInfo{DataPos} + ($$dirInfo{Base} || 0), + ); + } + # process the decrypted information + my %subdirInfo = ( + DataPt => \$data, + DirStart => $offset, + DirLen => length($data) - $offset, + DirName => $$dirInfo{DirName}, + DataPos => $$dirInfo{DataPos} + $dirStart, + Base => $$dirInfo{Base}, + ); + my $rtnVal; + if ($$dirInfo{IsWriting}) { + my $changed = $$et{CHANGED}; + $rtnVal = $et->WriteBinaryData(\%subdirInfo, $tagTablePtr); + # must re-encrypt if serial number or shutter count changes + if ($recrypt) { + $serial = $newSerial if defined $newSerial; + $count = $newCount if defined $newCount; + ++$$et{CHANGED}; + } + if ($changed == $$et{CHANGED}) { + undef $rtnVal; # nothing changed so use original data + } else { + # add back any un-encrypted data at start + $rtnVal = substr($data, 0, $offset) . $rtnVal if $offset; + # re-encrypt data (symmetrical algorithm) + $rtnVal = Decrypt(\$rtnVal, $serial, $count, $start, $len); + } + } else { + $rtnVal = $et->ProcessBinaryData(\%subdirInfo, $tagTablePtr); + } + SetByteOrder($oldOrder); + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Pre-scan EXIF directory to extract specific tags +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) required tagID hash ref +# Returns: 1 if directory was scanned successfully +sub PrescanExif($$$) +{ + my ($et, $dirInfo, $tagHash) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos} || 0; + my $dataLen = $$dirInfo{DataLen}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $base = $$dirInfo{Base} || 0; + my $raf = $$dirInfo{RAF}; + my ($index, $numEntries, $data, $buff); + + # get number of entries in IFD + if ($dirStart >= 0 and $dirStart <= $dataLen-2) { + $numEntries = Get16u($dataPt, $dirStart); + # reset $numEntries to read from file if necessary + undef $numEntries if $dirStart + 2 + 12 * $numEntries > $dataLen; + } + # read IFD from file if necessary + unless ($numEntries) { + $raf or return 0; + $dataPos += $dirStart; # read data from the start of the directory + $raf->Seek($dataPos + $base, 0) and $raf->Read($data, 2) == 2 or return 0; + $numEntries = Get16u(\$data, 0); + my $len = 12 * $numEntries; + $raf->Read($buff, $len) == $len or return 0; + $data .= $buff; + # update variables for the newly loaded IFD (already updated dataPos) + $dataPt = \$data; + $dataLen = length $data; + $dirStart = 0; + } + # loop through Nikon MakerNote IFD entries + for ($index=0; $index<$numEntries; ++$index) { + my $entry = $dirStart + 2 + 12 * $index; + my $tagID = Get16u($dataPt, $entry); + next unless exists $$tagHash{$tagID}; # only extract required tags + my $format = Get16u($dataPt, $entry+2); + next if $format < 1 or $format > 13; + my $count = Get32u($dataPt, $entry+4); + my $size = $count * $Image::ExifTool::Exif::formatSize[$format]; + my $formatStr = $Image::ExifTool::Exif::formatName[$format]; + my $valuePtr = $entry + 8; # pointer to value within $$dataPt + if ($size > 4) { + next if $size > 0x1000000; # set a reasonable limit on data size (16MB) + $valuePtr = Get32u($dataPt, $valuePtr); + # convert offset to pointer in $$dataPt + # (don't yet handle EntryBased or FixOffsets) + $valuePtr -= $dataPos; + if ($valuePtr < 0 or $valuePtr+$size > $dataLen) { + next unless $raf and $raf->Seek($base + $valuePtr + $dataPos,0) and + $raf->Read($buff,$size) == $size; + $$tagHash{$tagID} = ReadValue(\$buff,0,$formatStr,$count,$size); + next; + } + } + $$tagHash{$tagID} = ReadValue($dataPt,$valuePtr,$formatStr,$count,$size); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process Nikon Capture history data +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessNikonCaptureEditVersions($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + require Image::ExifTool::NikonCapture; + return Image::ExifTool::NikonCapture::ProcessNikonCaptureEditVersions($et, $dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Process Nikon Capture Offsets IFD (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +# Notes: This isn't a normal IFD, but is close... +sub ProcessNikonCaptureOffsets($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart}; + my $dirLen = $$dirInfo{DirLen}; + my $success = 0; + return 0 unless $dirLen > 2; + my $count = Get16u($dataPt, $dirStart); + return 0 unless $count and $count * 12 + 2 <= $dirLen; + if ($et->Options('Verbose')) { + $et->VerboseDir('NikonCaptureOffsets', $count); + } + my $index; + for ($index=0; $index<$count; ++$index) { + my $pos = $dirStart + 12 * $index + 2; + my $tagID = Get32u($dataPt, $pos); + my $value = Get32u($dataPt, $pos + 4); + $et->HandleTag($tagTablePtr, $tagID, $value, + Index => $index, + DataPt => $dataPt, + Start => $pos, + Size => 12, + ) and $success = 1; + } + return $success; +} + +#------------------------------------------------------------------------------ +# Read/write Nikon MakerNotes directory +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, otherwise returns 0 and sets a Warning when reading +# or new directory when writing (IsWriting set in dirInfo) +sub ProcessNikon($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access + + # pre-scan IFD to get SerialNumber (0x001d) and ShutterCount (0x00a7) for use in decryption + my %needTags = ( 0x001d => 0, 0x00a7 => undef ); + PrescanExif($et, $dirInfo, \%needTags); + $$et{NikonSerialKey} = SerialKey($et, $needTags{0x001d}); + $$et{NikonCountKey} = $needTags{0x00a7}; + + # process Nikon makernotes + my $rtnVal; + if ($$dirInfo{IsWriting}) { + # get new decryptino keys if they are being changed + my $serial = $et->GetNewValue($Image::ExifTool::Nikon::Main{0x001d}); + my $count = $et->GetNewValue($Image::ExifTool::Nikon::Main{0x00a7}); + $$et{NewNikonSerialKey} = SerialKey($et, $serial); + $$et{NewNikonCountKey} = $count; + $rtnVal = Image::ExifTool::Exif::WriteExif($et, $dirInfo, $tagTablePtr); + delete $$et{NewNikonSerialKey}; + delete $$et{NewNikonCountKey}; + } else { + $rtnVal = Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr); + } + delete $$et{NikonSerialKey}; + delete $$et{NikonCountKey}; + return $rtnVal; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Nikon - Nikon EXIF maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Nikon maker notes in EXIF information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html> + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=item L<http://members.aol.com/khancock/pilot/nbuddy/> + +=item L<http://www.rottmerhusen.com/objektives/lensid/thirdparty.html> + +=item L<http://homepage3.nifty.com/kamisaka/makernote/makernote_nikon.htm> + +=item L<http://www.wohlberg.net/public/software/photo/nstiffexif/> + +=item (...plus lots of testing with Best Buy store demos!) + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Joseph Heled, Thomas Walter, Brian Ristuccia, Danek Duvall, Tom +Christiansen, Robert Rottmerhusen, Werner Kober, Roger Larsson, Jens Duttke, +Gregor Dorlars, Neil Nappe, Alexandre Naaman, Brendt Wohlberg and Warren +Hatch for their help figuring out some Nikon tags, and to everyone who +helped contribute to the LensID list. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Nikon Tags>, +L<Image::ExifTool::TagNames/NikonCapture Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/NikonCapture.pm b/lib/Image/ExifTool/NikonCapture.pm new file mode 100644 index 0000000..e02b7a8 --- /dev/null +++ b/lib/Image/ExifTool/NikonCapture.pm @@ -0,0 +1,940 @@ +#------------------------------------------------------------------------------ +# File: NikonCapture.pm +# +# Description: Read/write Nikon Capture information +# +# Revisions: 11/08/2005 - P. Harvey Created +# 10/10/2008 - P. Harvey Updated for Capture NX 2 +# 16/04/2011 - P. Harvey Decode NikonCaptureEditVersions +# +# References: 1) http://www.cybercom.net/~dcoffin/dcraw/ +# IB) Iliah Borg private communication (LibRaw) +#------------------------------------------------------------------------------ + +package Image::ExifTool::NikonCapture; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.14'; + +sub ProcessNikonCapture($$$); + +# common print conversions +my %offOn = ( 0 => 'Off', 1 => 'On' ); +my %noYes = ( 0 => 'No', 1 => 'Yes' ); +my %unsharpColor = ( + 0 => 'RGB', + 1 => 'Red', + 2 => 'Green', + 3 => 'Blue', + 4 => 'Yellow', + 5 => 'Magenta', + 6 => 'Cyan', +); + +# Nikon Capture data (ref PH) +%Image::ExifTool::NikonCapture::Main = ( + PROCESS_PROC => \&ProcessNikonCapture, + WRITE_PROC => \&WriteNikonCapture, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + NOTES => q{ + This information is written by the Nikon Capture software in tag 0x0e01 of + the maker notes of NEF images. + }, + # 0x007ddc9d contains contrast information + 0x008ae85e => { + Name => 'LCHEditor', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0x0c89224b => { + Name => 'ColorAberrationControl', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0x116fea21 => { + Name => 'HighlightData', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCapture::HighlightData', + }, + }, + 0x2175eb78 => { + Name => 'D-LightingHQ', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0x2fc08431 => { + Name => 'StraightenAngle', + Writable => 'double', + }, + 0x374233e0 => { + Name => 'CropData', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCapture::CropData', + }, + }, + 0x39c456ac => { + Name => 'PictureCtrl', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCapture::PictureCtrl', + }, + }, + 0x3cfc73c6 => { + Name => 'RedEyeData', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCapture::RedEyeData', + }, + }, + 0x3d136244 => { + Name => 'EditVersionName', + Writable => 'string', # (null terminated) + }, + # 0x3e726567 added when I rotated by 90 degrees + 0x416391c6 => { + Name => 'QuickFix', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0x56a54260 => { + Name => 'Exposure', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCapture::Exposure', + }, + }, + 0x5f0e7d23 => { + Name => 'ColorBooster', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0x6a6e36b6 => { + Name => 'D-LightingHQSelected', + Writable => 'int8u', + PrintConv => \%noYes, + }, + 0x753dcbc0 => { + Name => 'NoiseReduction', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0x76a43200 => { + Name => 'UnsharpMask', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0x76a43201 => { + Name => 'Curves', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0x76a43202 => { + Name => 'ColorBalanceAdj', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0x76a43203 => { + Name => 'AdvancedRaw', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0x76a43204 => { + Name => 'WhiteBalanceAdj', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0x76a43205 => { + Name => 'VignetteControl', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0x76a43206 => { + Name => 'FlipHorizontal', + Writable => 'int8u', + PrintConv => \%noYes, + }, + 0x76a43207 => { # rotation angle in degrees + Name => 'Rotation', + Writable => 'int16u', + }, + 0x083a1a25 => { + Name => 'HistogramXML', + Writable => 'undef', + Binary => 1, + AdjustSize => 4, # patch Nikon bug + }, + 0x84589434 => { + Name => 'BrightnessData', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCapture::Brightness', + }, + }, + # 0x88f55e48 - related to QuickFix + 0x890ff591 => { + Name => 'D-LightingHQData', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCapture::DLightingHQ', + }, + }, + 0x926f13e0 => { + Name => 'NoiseReductionData', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCapture::NoiseReduction', + }, + }, + 0x9ef5f6e0 => { + Name => 'IPTCData', + SubDirectory => { + TagTable => 'Image::ExifTool::IPTC::Main', + }, + }, + # 0xa7264a72 - related to QuickFix + 0xab5eca5e => { + Name => 'PhotoEffects', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0xac6bd5c0 => { + Name => 'VignetteControlIntensity', + Writable => 'int16s', + }, + 0xb0384e1e => { + Name => 'PhotoEffectsData', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCapture::PhotoEffects', + }, + }, + 0xb999a36f => { + Name => 'ColorBoostData', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCapture::ColorBoost', + }, + }, + 0xbf3c6c20 => { + Name => 'WBAdjData', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCapture::WBAdjData', + }, + }, + 0xce5554aa => { + Name => 'D-LightingHS', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0xe2173c47 => { + Name => 'PictureControl', + Writable => 'int8u', + PrintConv => \%offOn, + }, + 0xe37b4337 => { + Name => 'D-LightingHSData', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCapture::DLightingHS', + }, + }, + 0xe42b5161 => { + Name => 'UnsharpData', + SubDirectory => { + TagTable => 'Image::ExifTool::NikonCapture::UnsharpData', + }, + }, + 0xe9651831 => { + Name => 'PhotoEffectHistoryXML', + Binary => 1, + Writable => 'undef', + }, + 0xfe28a44f => { + Name => 'AutoRedEye', + Writable => 'int8u', + PrintConv => \%offOn, # (have seen a value of 28 here for older software?) + }, + 0xfe443a45 => { + Name => 'ImageDustOff', + Writable => 'int8u', + PrintConv => \%offOn, + }, +); + +%Image::ExifTool::NikonCapture::UnsharpData = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => 'UnsharpCount', + 19 => { Name => 'Unsharp1Color', Format => 'int16u', PrintConv => \%unsharpColor }, + 23 => { Name => 'Unsharp1Intensity', Format => 'int16u' }, + 25 => { Name => 'Unsharp1HaloWidth', Format => 'int16u' }, + 27 => 'Unsharp1Threshold', + 46 => { Name => 'Unsharp2Color', Format => 'int16u', PrintConv => \%unsharpColor }, + 50 => { Name => 'Unsharp2Intensity', Format => 'int16u' }, + 52 => { Name => 'Unsharp2HaloWidth', Format => 'int16u' }, + 54 => 'Unsharp2Threshold', + 73 => { Name => 'Unsharp3Color', Format => 'int16u', PrintConv => \%unsharpColor }, + 77 => { Name => 'Unsharp3Intensity', Format => 'int16u' }, + 79 => { Name => 'Unsharp3HaloWidth', Format => 'int16u' }, + 81 => 'Unsharp3Threshold', + 100 => { Name => 'Unsharp4Color', Format => 'int16u', PrintConv => \%unsharpColor }, + 104 => { Name => 'Unsharp4Intensity', Format => 'int16u' }, + 106 => { Name => 'Unsharp4HaloWidth', Format => 'int16u' }, + 108 => 'Unsharp4Threshold', + # there could be more, but I grow bored of this... :P +); + +%Image::ExifTool::NikonCapture::DLightingHS = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => 'D-LightingHSAdjustment', + 1 => 'D-LightingHSColorBoost', +); + +%Image::ExifTool::NikonCapture::DLightingHQ = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => 'D-LightingHQShadow', + 1 => 'D-LightingHQHighlight', + 2 => 'D-LightingHQColorBoost', +); + +%Image::ExifTool::NikonCapture::ColorBoost = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => { + Name => 'ColorBoostType', + PrintConv => { + 0 => 'Nature', + 1 => 'People', + }, + }, + 1 => { + Name => 'ColorBoostLevel', + Format => 'int32u', + }, +); + +%Image::ExifTool::NikonCapture::WBAdjData = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x00 => { + Name => 'WBAdjRedBalance', + Format => 'double', + }, + 0x08 => { + Name => 'WBAdjBlueBalance', + Format => 'double', + }, + 0x10 => { + Name => 'WBAdjMode', + PrintConv => { + 1 => 'Use Gray Point', + 2 => 'Recorded Value', + 3 => 'Use Temperature', + 4 => 'Calculate Automatically', + 5 => 'Auto2', #IB + 6 => 'Underwater', #IB + 7 => 'Auto1', + }, + }, + 0x14 => { #IB + Name => 'WBAdjLighting', + Format => 'int16u', + PrintHex => 1, + PrintConv => { + 0x000 => 'None', + 0x100 => 'Incandescent', + 0x200 => 'Daylight (direct sunlight)', + 0x201 => 'Daylight (shade)', + 0x202 => 'Daylight (cloudy)', + 0x300 => 'Standard Fluorescent (warm white)', + 0x301 => 'Standard Fluorescent (3700K)', + 0x302 => 'Standard Fluorescent (cool white)', + 0x303 => 'Standard Fluorescent (5000K)', + 0x304 => 'Standard Fluorescent (daylight)', + 0x305 => 'Standard Fluorescent (high temperature mercury vapor)', + 0x400 => 'High Color Rendering Fluorescent (warm white)', + 0x401 => 'High Color Rendering Fluorescent (3700K)', + 0x402 => 'High Color Rendering Fluorescent (cool white)', + 0x403 => 'High Color Rendering Fluorescent (5000K)', + 0x404 => 'High Color Rendering Fluorescent (daylight)', + 0x500 => 'Flash', + 0x501 => 'Flash (FL-G1 filter)', + 0x502 => 'Flash (FL-G2 filter)', + 0x503 => 'Flash (TN-A1 filter)', + 0x504 => 'Flash (TN-A2 filter)', + 0x600 => 'Sodium Vapor Lamps', + # 0x1002 => seen for WBAdjMode modes of Underwater and Calculate Automatically + }, + }, + 0x18 => { + Name => 'WBAdjTemperature', + Format => 'int16u', + }, + 0x25 => { + Name => 'WBAdjTint', + Format => 'int32s', + }, +); + +%Image::ExifTool::NikonCapture::PhotoEffects = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => { + Name => 'PhotoEffectsType', + PrintConv => { + 0 => 'None', + 1 => 'B&W', + 2 => 'Sepia', + 3 => 'Tinted', + }, + }, + 4 => { + Name => 'PhotoEffectsRed', + Format => 'int16s', + }, + 6 => { + Name => 'PhotoEffectsGreen', + Format => 'int16s', + }, + 8 => { + Name => 'PhotoEffectsBlue', + Format => 'int16s', + }, +); + +%Image::ExifTool::NikonCapture::Brightness = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => { + Name => 'BrightnessAdj', + Format => 'double', + ValueConv => '$val * 50', + ValueConvInv => '$val / 50', + }, + 8 => { + Name => 'EnhanceDarkTones', + PrintConv => \%offOn, + }, +); + +%Image::ExifTool::NikonCapture::NoiseReduction = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x04 => { + Name => 'EdgeNoiseReduction', + PrintConv => \%offOn, + }, + 0x05 => { + Name => 'ColorMoireReductionMode', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Medium', + 3 => 'High', + }, + }, + 0x09 => { + Name => 'NoiseReductionIntensity', + Format => 'int32u', + }, + 0x0d => { + Name => 'NoiseReductionSharpness', + Format => 'int32u', + }, + 0x11 => { + Name => 'NoiseReductionMethod', + Format => 'int16u', + PrintConv => { + 0 => 'Faster', + 1 => 'Better Quality', + 2 => 'Better Quality 2013', + }, + }, + 0x15 => { + Name => 'ColorMoireReduction', + PrintConv => \%offOn, + }, + 0x17 => { + Name => 'NoiseReduction', + PrintConv => \%offOn, + }, + 0x18 => { + Name => 'ColorNoiseReductionIntensity', + Format => 'int32u', + }, + 0x1c => { + Name => 'ColorNoiseReductionSharpness', + Format => 'int32u', + }, +); + +%Image::ExifTool::NikonCapture::CropData = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x1e => { + Name => 'CropLeft', + Format => 'double', + ValueConv => '$val / 2', + ValueConvInv => '$val * 2', + }, + 0x26 => { + Name => 'CropTop', + Format => 'double', + ValueConv => '$val / 2', + ValueConvInv => '$val * 2', + }, + 0x2e => { + Name => 'CropRight', + Format => 'double', + ValueConv => '$val / 2', + ValueConvInv => '$val * 2', + }, + 0x36 => { + Name => 'CropBottom', + Format => 'double', + ValueConv => '$val / 2', + ValueConvInv => '$val * 2', + }, + 0x8e => { + Name => 'CropOutputWidthInches', + Format => 'double', + }, + 0x96 => { + Name => 'CropOutputHeightInches', + Format => 'double', + }, + 0x9e => { + Name => 'CropScaledResolution', + Format => 'double', + }, + 0xae => { + Name => 'CropSourceResolution', + Format => 'double', + ValueConv => '$val / 2', + ValueConvInv => '$val * 2', + }, + 0xb6 => { + Name => 'CropOutputResolution', + Format => 'double', + }, + 0xbe => { + Name => 'CropOutputScale', + Format => 'double', + }, + 0xc6 => { + Name => 'CropOutputWidth', + Format => 'double', + }, + 0xce => { + Name => 'CropOutputHeight', + Format => 'double', + }, + 0xd6 => { + Name => 'CropOutputPixels', + Format => 'double', + }, +); + +%Image::ExifTool::NikonCapture::PictureCtrl = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x00 => { + Name => 'PictureControlActive', + PrintConv => \%offOn, + }, + 0x13 => { + Name => 'PictureControlMode', + Format => 'string[16]', + }, + # 0x29 changes with Hue and Sharpening + 0x2a => { + Name => 'QuickAdjust', + ValueConv => '$val - 128', + ValueConvInv => '$val + 128', + }, + 0x2b => { + Name => 'SharpeningAdj', + ValueConv => '$val ? $val - 128 : "Auto"', + ValueConvInv => '$val=~/\d/ ? $val + 128 : 0', + }, + 0x2c => { + Name => 'ContrastAdj', + ValueConv => '$val ? $val - 128 : "Auto"', + ValueConvInv => '$val=~/\d/ ? $val + 128 : 0', + }, + 0x2d => { + Name => 'BrightnessAdj', + ValueConv => '$val ? $val - 128 : "Auto"', # no "Auto" mode (yet) for this setting + ValueConvInv => '$val=~/\d/ ? $val + 128 : 0', + }, + 0x2e => { + Name => 'SaturationAdj', + ValueConv => '$val ? $val - 128 : "Auto"', + ValueConvInv => '$val=~/\d/ ? $val + 128 : 0', + }, + 0x2f => { + Name => 'HueAdj', + ValueConv => '$val - 128', + ValueConvInv => '$val + 128', + }, + # 0x37 changed from 0 to 2 when Picture Control is enabled (and no active DLighting) +); + +%Image::ExifTool::NikonCapture::RedEyeData = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => { + Name => 'RedEyeCorrection', + PrintConv => { + 0 => 'Off', + 1 => 'Automatic', + 2 => 'Click on Eyes', + }, + }, +); + +%Image::ExifTool::NikonCapture::Exposure = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x00 => { + Name => 'ExposureAdj', + Format => 'int16s', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + }, + 0x12 => { + Name => 'ExposureAdj2', + Format => 'double', + PrintConv => 'sprintf("%.4f", $val)', + PrintConvInv => '$val', + }, + 0x24 => { + Name => 'ActiveD-Lighting', + PrintConv => \%offOn, + }, + 0x25 => { + Name => 'ActiveD-LightingMode', + PrintConv => { + 0 => 'Unchanged', + 1 => 'Off', + 2 => 'Low', + 3 => 'Normal', + 4 => 'High', + 6 => 'Extra High', + 7 => 'Extra High 1', + 8 => 'Extra High 2', + }, + }, +); + +%Image::ExifTool::NikonCapture::HighlightData = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int8s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => 'ShadowProtection', + 1 => 'SaturationAdj', + 6 => 'HighlightProtection', +); + +#------------------------------------------------------------------------------ +# write Nikon Capture data (ref 1) +# Inputs: 0) ExifTool object reference, 1) reference to directory information +# 2) pointer to tag table +# Returns: 1 on success +sub WriteNikonCapture($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to autoload this package + + # no need to edit this information unless necessary + unless ($$et{EDIT_DIRS}{MakerNotes} or $$et{EDIT_DIRS}{IPTC}) { + return undef; + } + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart}; + my $dirLen = $$dirInfo{DirLen}; + if ($dirLen < 22) { + $et->Warn('Short Nikon Capture Data',1); + return undef; + } + # make sure the capture data is properly contained + SetByteOrder('II'); + my $tagID = Get32u($dataPt, $dirStart); + # sometimes size includes 18 header bytes, and other times it doesn't (eg. ViewNX 2.1.1) + my $size = Get32u($dataPt, $dirStart + 18); + my $pad = $dirLen - $size - 18; + unless ($tagID == 0x7a86a940 and ($pad >= 0 or $pad == -18)) { + $et->Warn('Unrecognized Nikon Capture Data header'); + return undef; + } + # determine if there is any data after this block + if ($pad > 0) { + $pad = substr($$dataPt, $dirStart + 18 + $size, $pad); + $dirLen = $size + 18; + } else { + $pad = ''; + } + my $outBuff = ''; + my $pos; + my $newTags = $et->GetNewTagInfoHash($tagTablePtr); + my $dirEnd = $dirStart + $dirLen; + + # loop through all entries in the Nikon Capture data + for ($pos=$dirStart+22; $pos+22<$dirEnd; $pos+=22+$size) { + $tagID = Get32u($dataPt, $pos); + $size = Get32u($dataPt, $pos + 18) - 4; + last if $size < 0 or $pos + 22 + $size > $dirEnd; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID); + if ($tagInfo) { + my $newVal; + if ($$tagInfo{SubDirectory}) { + # rewrite the subdirectory + my %subdirInfo = ( + DataPt => $dataPt, + DirStart => $pos + 22, + DirLen => $size, + ); + my $subTable = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + # ignore minor errors in IPTC since there is typically trailing garbage + my $oldSetting = $et->Options('IgnoreMinorErrors'); + $$tagInfo{Name} =~ /IPTC/ and $et->Options(IgnoreMinorErrors => 1); + # rewrite the directory + $newVal = $et->WriteDirectory(\%subdirInfo, $subTable); + # restore our original options + $et->Options(IgnoreMinorErrors => $oldSetting); + } elsif ($$newTags{$tagID}) { + # get new value for this tag if we are writing it + my $format = $$tagInfo{Format} || $$tagInfo{Writable}; + my $oldVal = ReadValue($dataPt,$pos+22,$format,1,$size); + my $nvHash = $et->GetNewValueHash($tagInfo); + if ($et->IsOverwriting($nvHash, $oldVal)) { + my $val = $et->GetNewValue($tagInfo); + $newVal = WriteValue($val, $$tagInfo{Writable}) if defined $val; + if (defined $newVal and length $newVal) { + ++$$et{CHANGED}; + } else { + undef $newVal; + $et->Warn("Can't delete $$tagInfo{Name}"); + } + } + } + if (defined $newVal) { + next unless length $newVal; # don't write zero length information + # write the new value + $outBuff .= substr($$dataPt, $pos, 18); + $outBuff .= Set32u(length($newVal) + 4); + $outBuff .= $newVal; + next; + } + } + # rewrite the existing information + $outBuff .= substr($$dataPt, $pos, 22 + $size); + } + unless ($pos == $dirEnd) { + if ($pos == $dirEnd - 4) { + # it seems that sometimes (NX2) the main block size is wrong by 4 bytes + # (did they forget to include the size word?) + $outBuff .= substr($$dataPt, $pos, 4); + } else { + $et->Warn('Nikon Capture Data improperly terminated',1); + return undef; + } + } + # add the header and return the new directory + return substr($$dataPt, $dirStart, 18) . + Set32u(length($outBuff) + 4) . + $outBuff . $pad; +} + +#------------------------------------------------------------------------------ +# process Nikon Capture data (ref 1) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessNikonCaptureEditVersions($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart}; + my $dirLen = $$dirInfo{DirLen}; + my $dirEnd = $dirStart + $dirLen; + my $verbose = $et->Options('Verbose'); + SetByteOrder('II'); + return 0 unless $dirLen > 4; + my $num = Get32u($dataPt, $dirStart); + my $pos = $dirStart + 4; + $verbose and $et->VerboseDir('NikonCaptureEditVersions', $num); + while ($num) { + last if $pos + 4 > $dirEnd; + my $len = Get32u($dataPt, $pos); + last if $pos + $len + 4 > $dirEnd; + my %dirInfo = ( + DirName => 'NikonCapture', + Parent => 'NikonCaptureEditVersions', + DataPt => $dataPt, + DirStart => $pos + 4, + DirLen => $len, + ); + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + --$num; + $pos += $len + 4; + } + delete $$et{DOC_NUM}; + return 1; +} + +#------------------------------------------------------------------------------ +# process Nikon Capture data (ref 1) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessNikonCapture($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart}; + my $dirLen = $$dirInfo{DirLen}; + my $dirEnd = $dirStart + $dirLen; + my $verbose = $et->Options('Verbose'); + my $success = 0; + SetByteOrder('II'); + $verbose and $et->VerboseDir('NikonCapture', 0, $dirLen); + my $pos; + for ($pos=$dirStart+22; $pos+22<$dirEnd; ) { + my $tagID = Get32u($dataPt, $pos); + my $size = Get32u($dataPt, $pos + 18) - 4; + $pos += 22; + last if $size < 0 or $pos + $size > $dirEnd; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID); + if ($tagInfo or $verbose) { + my ($format, $value); + # (note that Writable will be 0 for Unknown tags) + $tagInfo and $format = ($$tagInfo{Format} || $$tagInfo{Writable}); + # generate a reasonable default format type for short values + if (not $format and ($size == 1 or $size == 2 or $size == 4)) { + $format = 'int' . ($size * 8) . 'u'; + } + if ($format) { + my $count = 1; + if ($format eq 'string' or $format eq 'undef') { + # patch Nikon bug in size of some values (HistogramXML) + $size += $$tagInfo{AdjustSize} if $tagInfo and $$tagInfo{AdjustSize}; + $count = $size; + } + $value = ReadValue($dataPt,$pos,$format,$count,$size); + } elsif ($size == 1) { + $value = substr($$dataPt, $pos, $size); + } + $et->HandleTag($tagTablePtr, $tagID, $value, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + Base => $$dirInfo{Base}, + Start => $pos, + Size => $size, + ) and $success = 1; + } + $pos += $size; + } + return $success; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::NikonCapture - Read/write Nikon Capture information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains routines to read and write Nikon Capture information in +the maker notes of NEF images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/NikonCapture Tags>, +L<Image::ExifTool::TagNames/Nikon Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/NikonCustom.pm b/lib/Image/ExifTool/NikonCustom.pm new file mode 100644 index 0000000..6f96b44 --- /dev/null +++ b/lib/Image/ExifTool/NikonCustom.pm @@ -0,0 +1,10074 @@ +#------------------------------------------------------------------------------ +# File: NikonCustom.pm +# +# Description: Read and write Nikon Custom settings +# +# Revisions: 2009/11/25 - P. Harvey Created +# +# References: 1) Warren Hatch private communication (D3 and Z9 with SB-800 and SB-900) +# 2) Anonymous contribution 2011/05/25 (D700, D7000) +# JD) Jens Duttke private communication +#------------------------------------------------------------------------------ + +package Image::ExifTool::NikonCustom; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.20'; + +my %buttonsZ9= ( + 0 => 'None', + 1 => 'Preview', + 3 => 'FV Lock', + 4 => 'AE/AF Lock', + 5 => 'AE Lock Only', + 6 => 'AE Lock (reset on release)', + 7 => 'AE Lock (hold)', + 8 => 'AF Lock Only', + 9 => 'AF-On', + 10 => 'Flash Disable/Enable', + 11 => 'Bracketing Burst', + 12 => '+NEF(RAW)', + 18 => 'Virtual Horizon', + 19 => 'Synchronized Release', + 20 => 'My Menu', + 21 => 'My Menu Top Item', + 22 => 'Playback', + 23 => 'Rating', + 24 => 'Protect', + 25 => 'Zoom', + 26 => 'Focus Peaking', + 28 => 'Image Area', + 30 => 'Non-CPU Lens', + 31 => 'Active-D Lighting', + 33 => '1 Stop Speed/Aperture', + 35 => 'Metering', + 36 => 'Auto Bracketing', + 37 => 'Multiple Exposure', + 38 => 'HDR Overlay', + 39 => 'Picture Control', + 40 => 'Quality', + 41 => 'Focus Mode/AF AreaMode', + 42 => 'Select Center Focus Point', + 44 => 'Record Movie', + 47 => 'Choose Folder', + 48 => 'Power Aperture (Open)', + 49 => 'Power Aperture (Close)', + 52 => 'Microphone Sensitivity', + 57 => 'Preset Focus Point', + 58 => 'AE/AWB Lock (hold)', + 59 => 'AF-AreaMode', + 60 => 'AF-AreaMode + AF-On', + 61 => 'Recall Shooting Functions', + 64 => 'Filtered Playback', + 65 => 'Same as AF-On', + 66 => 'Voice Memo', + 70 => 'Photo Shooting Bank', + 73 => 'Exposure Compensation', + 76 => 'Silent Mode', + 78 => 'LiveView Information', + 79 => 'AWB Lock (hold)', + 80 => 'Grid Display', + 81 => 'Starlight View', + 82 => 'Select To Send (PC)', + 83 => 'Select To Send (FTP)', + 85 => 'Control Lock', + 86 => 'Save Focus Position', + 87 => 'Recall Focus Position', + 88 => 'Recall Shooting Functions (Hold)', +); +my %dialsZ9 = ( + 0 => '1 Frame', + 1 => '10 Frames', + 2 => '50 Frames', + 3 => 'Folder', + 4 => 'Protect', + 5 => 'Photos Only', + 6 => 'Videos Only', + 7 => 'Rating', + 8 => 'Page', +); +my %evfGridsZ9 = ( + 0 => '3x3', + 1 => '4x4', + 2 => '2.35:1', + 3 => '1.85:1', + 4 => '5:4', + 5 => '4:3', + 6 => '1:1', + 7 => '16:9', + 8 => '90%', +); +my %flicksZ9 = ( + 0 => 'Rating', + 1 => 'Select To Send (PC)', + 2 => 'Select To Send (FTP)', + 3 => 'Protect', + 4 => 'Voice Memo', + 5 => 'None', +); +my %focusModeRestrictionsZ9 = ( + 0 => 'AF-S', + 1 => 'AF-C', + 2 => 'Full-time AF', + 3 => 'Manual', + 4 => 'No Restrictions', +); +my %powerOffDelayTimesZ9 = ( + 0 => '2 s', + 1 => '4 s', + 3 => '10 s', + 4 => '20 s', + 5 => '30 s', + 6 => '1 min', + 7 => '5 min', + 8 => '10 min', + 11 => '30 min', + 12 => 'No Limit', +); +my %thirdHalfFull = ( + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', +); + +my %limitNolimit = ( 0 => 'Limit', 1 => 'No Limit' ); +my %offOn = ( 0 => 'Off', 1 => 'On' ); +my %onOff = ( 0 => 'On', 1 => 'Off' ); +my %noYes = ( 0 => 'No', 1 => 'Yes' ); + +# custom settings for the D80 (encrypted) - ref JD +%Image::ExifTool::NikonCustom::SettingsD80 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the Nikon D80.', + 0.1 => { # CS1 + Name => 'Beep', + Mask => 0x80, + PrintConv => \%onOff, + }, + 0.2 => { # CS4 + Name => 'AFAssist', + Mask => 0x40, + PrintConv => \%onOff, + }, + 0.3 => { # CS5 + Name => 'NoMemoryCard', + Mask => 0x20, + PrintConv => { + 0 => 'Release Locked', + 1 => 'Enable Release', + }, + }, + 0.4 => { # CS6 + Name => 'ImageReview', + Mask => 0x10, + PrintConv => \%onOff, + }, + 0.5 => { # CS17 + Name => 'Illumination', + Mask => 0x08, + PrintConv => \%offOn, + }, + 0.6 => { # CS11 + Name => 'MainDialExposureComp', + Mask => 0x04, + PrintConv => \%offOn, + }, + 0.7 => { # CS10 + Name => 'EVStepSize', + Mask => 0x01, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + }, + }, + 1.1 => { # CS7 + Name => 'AutoISO', + Mask => 0x40, + PrintConv => \%offOn, + }, + 1.2 => { # CS7-a + Name => 'AutoISOMax', + Mask => 0x30, + PrintConv => { + 0 => 200, + 1 => 400, + 2 => 800, + 3 => 1600, + }, + }, + 1.3 => { # CS7-b + Name => 'AutoISOMinShutterSpeed', + Mask => 0x0f, + PrintConvColumns => 2, + PrintConv => { + 0 => '1/125 s', + 1 => '1/100 s', + 2 => '1/80 s', + 3 => '1/60 s', + 4 => '1/40 s', + 5 => '1/30 s', + 6 => '1/15 s', + 7 => '1/8 s', + 8 => '1/4 s', + 9 => '1/2 s', + 10 => '1 s', + }, + }, + 2.1 => { # CS13 + Name => 'AutoBracketSet', + Mask => 0xc0, + PrintConv => { + 0 => 'AE & Flash', + 1 => 'AE Only', + 2 => 'Flash Only', + 3 => 'WB Bracketing', + }, + }, + 2.2 => { # CS14 + Name => 'AutoBracketOrder', + Mask => 0x20, + PrintConv => { + 0 => '0,-,+', + 1 => '-,0,+', + }, + }, + 3.1 => { # CS27 + Name => 'MonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '5 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 3.2 => { # CS28 + Name => 'MeteringTime', + Mask => 0x1c, + PrintConv => { + 0 => '4 s', + 1 => '6 s', + 2 => '8 s', + 3 => '16 s', + 4 => '30 s', + 5 => '30 min', + }, + }, + 3.3 => { # CS29 + Name => 'SelfTimerTime', + Mask => 0x03, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 4.1 => { # CS18 + Name => 'AELockButton', + Mask => 0x1e, + PrintConv => { + 0 => 'AE/AF Lock', + 1 => 'AE Lock Only', + 2 => 'AF Lock Only', + 3 => 'AE Lock (hold)', + 4 => 'AF-ON', + 5 => 'FV Lock', + 6 => 'Focus Area Selection', + 7 => 'AE-L/AF-L/AF Area', + 8 => 'AE-L/AF Area', + 9 => 'AF-L/AF Area', + 10 => 'AF-ON/AF Area', + }, + }, + 4.2 => { # CS19 + Name => 'AELock', + Mask => 0x01, + PrintConv => \%offOn, + }, + 4.3 => { # CS30 + Name => 'RemoteOnDuration', + Mask => 0xc0, + PrintConv => { + 0 => '1 min', + 1 => '5 min', + 2 => '10 min', + 3 => '15 min', + }, + }, + 5.1 => { # CS15 + Name => 'CommandDials', + Mask => 0x80, + PrintConv => { + 0 => 'Standard (Main Shutter, Sub Aperture)', + 1 => 'Reversed (Main Aperture, Sub Shutter)', + }, + }, + 5.2 => { # CS16 + Name => 'FunctionButton', + Mask => 0x78, + PrintConv => { + 0 => 'ISO Display', + 1 => 'Framing Grid', + 2 => 'AF-area Mode', + 3 => 'Center AF Area', + 4 => 'FV Lock', + 5 => 'Flash Off', + 6 => 'Matrix Metering', + 7 => 'Center-weighted', + 8 => 'Spot Metering', + }, + }, + 6.1 => { # CS8 + Name => 'GridDisplay', + Mask => 0x80, + PrintConv => \%offOn, + }, + 6.2 => { # CS9 + Name => 'ViewfinderWarning', + Mask => 0x40, + PrintConv => \%onOff, + }, + 6.3 => { # CS12 + Name => 'CenterWeightedAreaSize', + Mask => 0x0c, + PrintConv => { + 0 => '6 mm', + 1 => '8 mm', + 2 => '10 mm', + }, + }, + 6.4 => { # CS31 + Name => 'ExposureDelayMode', + Mask => 0x20, + PrintConv => \%offOn, + }, + 6.5 => { # CS32 + Name => 'MB-D80Batteries', + Mask => 0x03, + PrintConv => { + 0 => 'LR6 (AA Alkaline)', + 1 => 'HR6 (AA Ni-MH)', + 2 => 'FR6 (AA Lithium)', + 3 => 'ZR6 (AA Ni-Mg)', + }, + }, + 7.1 => { # CS23 + Name => 'FlashWarning', + Mask => 0x80, + PrintConv => \%onOff, + }, + 7.2 => { # CS24 + Name => 'FlashShutterSpeed', + Mask => 0x78, + ValueConv => '2 ** ($val - 6)', + ValueConvInv => '$val>0 ? int(log($val)/log(2)+6+0.5) : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 7.3 => { # CS25 + Name => 'AutoFP', + Mask => 0x04, + PrintConv => \%offOn, + }, + 7.4 => { # CS26 + Name => 'ModelingFlash', + Mask => 0x02, + PrintConv => \%offOn, + }, + 8.1 => { # CS22 + Name => 'InternalFlash', + Mask => 0xc0, + PrintConv => { + 0 => 'TTL', + 1 => 'Manual', + 2 => 'Repeating Flash', + 3 => 'Commander Mode', + }, + }, + 8.2 => { # CS22-a + Name => 'ManualFlashOutput', + Mask => 0x07, + ValueConv => '2 ** (-$val)', + ValueConvInv => '$val > 0 ? -log($val)/log(2) : 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.1 => { # CS22-b + Name => 'RepeatingFlashOutput', + Mask => 0x70, + ValueConv => '2 ** (-$val-2)', + ValueConvInv => '$val > 0 ? int(-log($val)/log(2)-2+0.5) : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.2 => { # CS22-c + Name => 'RepeatingFlashCount', + Mask => 0x0f, + ValueConv => '$val < 10 ? $val + 1 : 5 * ($val - 7)', + ValueConvInv => '$val <= 10 ? $val - 1 : $val / 5 + 7', + }, + 10.1 => { # CS22-d + Name => 'RepeatingFlashRate', + Mask => 0xf0, + ValueConv => '$val < 10 ? $val + 1 : 10 * ($val - 8)', + ValueConvInv => 'int(($val <= 10 ? $val - 1 : $val / 10 + 8) + 0.5)', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 10.2 => { # CS22-n + Name => 'CommanderChannel', + Mask => 0x03, + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 11.1 => { # CS22-e + Name => 'CommanderInternalFlash', + Mask => 0xc0, + PrintConv => { + 0 => 'TTL', + 1 => 'Manual', + 2 => 'Off', + }, + }, + 11.2 => { # CS22-h + Name => 'CommanderGroupAMode', + Mask => 0x30, + PrintConv => { + 0 => 'TTL', + 1 => 'Auto Aperture', + 2 => 'Manual', + 3 => 'Off', + }, + }, + 11.3 => { # CS22-k + Name => 'CommanderGroupBMode', + Mask => 0x0c, + PrintConv => { + 0 => 'TTL', + 1 => 'Auto Aperture', + 2 => 'Manual', + 3 => 'Off', + }, + }, + 12.1 => { # CS22-f + Name => 'CommanderInternalTTLComp', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 12.2 => { # CS22-g + Name => 'CommanderInternalManualOutput', + Mask => 0xe0, + ValueConv => '2 ** (-$val)', + ValueConvInv => '$val > 0 ? int(-log($val)/log(2)+0.5) : 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 13.1 => { # CS22-i + Name => 'CommanderGroupA_TTL-AAComp', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 13.2 => { # CS22-j + Name => 'CommanderGroupAManualOutput', + Mask => 0xe0, + ValueConv => '2 ** (-$val)', + ValueConvInv => '$val > 0 ? int(-log($val)/log(2)+0.5) : 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 14.1 => { # CS22-l + Name => 'CommanderGroupB_TTL-AAComp', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 14.2 => { # CS22-m + Name => 'CommanderGroupBManualOutput', + Mask => 0xe0, + ValueConv => '2 ** (-$val)', + ValueConvInv => '$val > 0 ? int(-log($val)/log(2)+0.5) : 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 15.1 => { # CS3 + Name => 'CenterAFArea', + Mask => 0x80, + PrintConv => { + 0 => 'Normal Zone', + 1 => 'Wide Zone', + }, + }, + 15.2 => { # CS20 + Name => 'FocusAreaSelection', + Mask => 0x04, + PrintConv => { + 0 => 'No Wrap', + 1 => 'Wrap', + }, + }, + 15.3 => { # CS21 + Name => 'AFAreaIllumination', + Mask => 0x03, + PrintConv => { + 0 => 'Auto', + 1 => 'Off', + 2 => 'On', + }, + }, + 16.1 => { # CS2 + Name => 'AFAreaModeSetting', + Mask => 0xc0, + PrintConv => { + 0 => 'Single Area', + 1 => 'Dynamic Area', + 2 => 'Auto-area', + }, + }, +); + +# custom settings for the D40 (encrypted) - ref JD +%Image::ExifTool::NikonCustom::SettingsD40 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the Nikon D40.', + 0.1 => { # CS1 + Name => 'Beep', + Mask => 0x80, + PrintConv => \%onOff, + }, + 0.2 => { # CS9 + Name => 'AFAssist', + Mask => 0x40, + PrintConv => \%onOff, + }, + 0.3 => { # CS6 + Name => 'NoMemoryCard', + Mask => 0x20, + PrintConv => { + 0 => 'Release Locked', + 1 => 'Enable Release', + }, + }, + 0.4 => { # CS7 + Name => 'ImageReview', + Mask => 0x10, + PrintConv => \%onOff, + }, + 1.1 => { # CS10-a + Name => 'AutoISO', + Mask => 0x80, + PrintConv => \%offOn, + }, + 1.2 => { # CS10-b + Name => 'AutoISOMax', + Mask => 0x30, + PrintConv => { + 1 => 400, + 2 => 800, + 3 => 1600, + }, + }, + 1.3 => { # CS10-c + Name => 'AutoISOMinShutterSpeed', + Mask => 0x07, + PrintConvColumns => 2, + PrintConv => { + 0 => '1/125 s', + 1 => '1/60 s', + 2 => '1/30 s', + 3 => '1/15 s', + 4 => '1/8 s', + 5 => '1/4 s', + 6 => '1/2 s', + 7 => '1 s', + }, + }, + 2.1 => { # CS15-b + Name => 'ImageReviewTime', + Mask => 0x07, + PrintConv => { + 0 => '4 s', + 1 => '8 s', + 2 => '20 s', + 3 => '1 min', + 4 => '10 min', + }, + }, + 3.1 => { # CS15-a + Name => 'MonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '8 s', + 2 => '20 s', + 3 => '1 min', + 4 => '10 min', + }, + }, + 3.2 => { # CS15-c + Name => 'MeteringTime', + Mask => 0x1c, + PrintConv => { + 0 => '4 s', + 1 => '8 s', + 2 => '20 s', + 3 => '1 min', + 4 => '30 min', + }, + }, + 3.3 => { # CS16 + Name => 'SelfTimerTime', + Mask => 0x03, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 3.4 => { # CS17 + Name => 'RemoteOnDuration', + Mask => 0xc0, + PrintConv => { + 0 => '1 min', + 1 => '5 min', + 2 => '10 min', + 3 => '15 min', + }, + }, + 4.1 => { # CS12 + Name => 'AELockButton', + Mask => 0x0e, + PrintConv => { + 0 => 'AE/AF Lock', + 1 => 'AE Lock Only', + 2 => 'AF Lock Only', + 3 => 'AE Lock (hold)', + 4 => 'AF-ON', + }, + }, + 4.2 => { # CS13 + Name => 'AELock', + Mask => 0x01, + PrintConv => \%offOn, + }, + 5.1 => { # CS4 + Name => 'ShootingModeSetting', + Mask => 0x70, + PrintConv => { + 0 => 'Single Frame', + 1 => 'Continuous', + 2 => 'Self-timer', + 3 => 'Delayed Remote', + 4 => 'Quick-response Remote', + }, + }, + 5.2 => { # CS11 + Name => 'TimerFunctionButton', + Mask => 0x07, + PrintConv => { + 0 => 'Shooting Mode', + 1 => 'Image Quality/Size', + 2 => 'ISO', + 3 => 'White Balance', + 4 => 'Self-timer', + }, + }, + 6.1 => { # CS5 + Name => 'Metering', + Mask => 0x03, + PrintConv => { + 0 => 'Matrix', + 1 => 'Center-weighted', + 2 => 'Spot', + }, + }, + 8.1 => { # CS14-a + Name => 'InternalFlash', + Mask => 0x10, + PrintConv => { + 0 => 'TTL', + 1 => 'Manual', + }, + }, + 8.2 => { # CS14-b + Name => 'ManualFlashOutput', + Mask => 0x07, + ValueConv => '2 ** (-$val)', + ValueConvInv => '$val > 0 ? -log($val)/log(2) : 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9 => { # CS8 + Name => 'FlashLevel', + Format => 'int8s', + ValueConv => '$val / 6', + ValueConvInv => '$val * 6', + PrintConv => 'sprintf("%+.1f",$val)', + PrintConvInv => '$val', + }, + 10.1 => { # CS2 + Name => 'FocusModeSetting', + # (may differ from FocusMode if lens switch is set to Manual) + Mask => 0xc0, + PrintConv => { + 0 => 'Manual', + 1 => 'AF-S', + 2 => 'AF-C', + 3 => 'AF-A', + }, + }, + 11.1 => { # CS3 + Name => 'AFAreaModeSetting', + # (may differ from AFAreaMode for Manual focus) + Mask => 0x30, + PrintConv => { + 0 => 'Single Area', + 1 => 'Dynamic Area', + 2 => 'Closest Subject', + }, + } +); + +# D90 custom settings (ref PH) +%Image::ExifTool::NikonCustom::SettingsD90 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D90.', + # Missing: + # CSe2 RepeatingFlashRate (needs verification) + # CommanderInternalFlash, CommanderGroupAMode, CommanderGroupBMode, + # CommanderChannel, CommanderInternalManualOutput, + # CommanderGroupAManualOutput, CommanderGroupBManualOutput + # CommanderGroupA_TTL-AAComp, CommanderGroupB_TTL-AAComp, + # CSe4 AutoBracketSet (some values need verification) + # CSf2 OKButton ("Not Used" value needs verification) + # CSf5-b CommandDialsChangeMainSub + # CSf5-c CommandDialsMenuAndPlayback + 0.1 => { # CSf1 + Name => 'LightSwitch', + Mask => 0x08, + PrintConv => { + 0 => 'LCD Backlight', + 1 => 'LCD Backlight and Shooting Information', + }, + }, + 2.1 => { # CSa1 + Name => 'AFAreaModeSetting', + Mask => 0x60, + PrintConv => { + 0 => 'Single Area', + 1 => 'Dynamic Area', + 2 => 'Auto-area', + 3 => '3D-tracking (11 points)', + }, + }, + 2.2 => { # CSa2 + Name => 'CenterFocusPoint', + Mask => 0x10, + PrintConv => { + 0 => 'Normal Zone', + 1 => 'Wide Zone', + }, + }, + 2.3 => { # CSa3 + Name => 'AFAssist', + Mask => 0x01, + PrintConv => \%onOff, + }, + 2.4 => { # CSa4 + Name => 'AFPointIllumination', + Mask => 0x06, + PrintConv => { + 0 => 'Auto', + 1 => 'On', + 2 => 'Off', + }, + }, + 2.5 => { # CSa5 + Name => 'FocusPointWrap', + Mask => 0x08, + PrintConv => { + 0 => 'No Wrap', + 1 => 'Wrap', + }, + }, + 3.1 => { # CSa6 + Name => 'AELockForMB-D80', + Mask => 0x1c, + PrintConv => { + 0 => 'AE Lock Only', + 1 => 'AF Lock Only', + 2 => 'AE Lock (hold)', + 3 => 'AF-On', + 4 => 'FV Lock', + 5 => 'Focus Point Selection', + 7 => 'AE/AF Lock', + }, + }, + 3.2 => { # CSd12 + Name => 'MB-D80BatteryType', + Mask => 0x03, + PrintConv => { + 0 => 'LR6 (AA alkaline)', + 1 => 'HR6 (AA Ni-MH)', + 2 => 'FR6 (AA lithium)', + 3 => 'ZR6 (AA Ni-Mn)', + }, + }, + 4.1 => { # CSd1 + Name => 'Beep', + Mask => 0x40, + PrintConv => \%offOn, + }, + 4.2 => { # CSd2 + Name => 'GridDisplay', + Mask => 0x02, + PrintConv => \%offOn, + }, + 4.3 => { # CSd3 + Name => 'ISODisplay', + Mask => 0x0c, + PrintConv => { + 0 => 'Show ISO/Easy ISO', + 1 => 'Show ISO Sensitivity', + 3 => 'Show Frame Count', + }, + }, + 4.4 => { # CSd4 + Name => 'ViewfinderWarning', + Mask => 0x01, + PrintConv => \%onOff, + }, + 4.5 => { # CSf6 + Name => 'NoMemoryCard', + Mask => 0x20, + PrintConv => { + 0 => 'Release Locked', + 1 => 'Enable Release', + }, + }, + 5.1 => { # CSd5 + Name => 'ScreenTips', + Mask => 0x04, + PrintConv => \%offOn, + }, + 5.2 => { # CSd7 + Name => 'FileNumberSequence', + Mask => 0x08, + PrintConv => \%onOff, + }, + 5.3 => { # CSd8 + Name => 'ShootingInfoDisplay', + Mask => 0xc0, + PrintConv => { + 0 => 'Auto', + 2 => 'Manual (dark on light)', + 3 => 'Manual (light on dark)', + }, + }, + 5.4 => { # CSd9 + Name => 'LCDIllumination', + Mask => 0x20, + PrintConv => \%offOn, + }, + 6.1 => { # CSb2 + Name => 'EasyExposureComp', + Mask => 0x01, + PrintConv => \%offOn, + }, + 6.2 => { # CSf7 + Name => 'ReverseIndicators', + Mask => 0x80, + PrintConv => { + 0 => '+ 0 -', + 1 => '- 0 +', + }, + }, + 7.1 => { # CSb1 + Name => 'ExposureControlStepSize', + Mask => 0x40, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + }, + }, + 8.1 => { # CSb3 + Name => 'CenterWeightedAreaSize', + Mask => 0x60, + PrintConv => { + 0 => '6 mm', + 1 => '8 mm', + 2 => '10 mm', + }, + }, + 8.2 => { # CSb4-a + Name => 'FineTuneOptMatrixMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.1 => { # CSb4-b + Name => 'FineTuneOptCenterWeighted', + Mask => 0xf0, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.2 => { # CSb4-c + Name => 'FineTuneOptSpotMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 11.1 => { # CSd6 + Name => 'CLModeShootingSpeed', + Mask => 0x07, + PrintConv => '"$val fps"', + PrintConvInv => '$val=~s/\s*fps//i; $val', + }, + 11.2 => { # CSd10 + Name => 'ExposureDelayMode', + Mask => 0x40, + PrintConv => \%offOn, + }, + 13.1 => { # CSe4 + Name => 'AutoBracketSet', + Mask => 0xe0, #(NC) + PrintConv => { + 0 => 'AE & Flash', # default + 1 => 'AE Only', + 2 => 'Flash Only', #(NC) + 3 => 'WB Bracketing', #(NC) + 4 => 'Active D-Lighting', #(NC) + }, + }, + 13.2 => { # CSe6 + Name => 'AutoBracketOrder', + Mask => 0x10, + PrintConv => { + 0 => '0,-,+', + 1 => '-,0,+', + }, + }, + 14.1 => { # CSf3 + Name => 'FuncButton', + Mask => 0x78, + PrintConv => { + 1 => 'Framing Grid', + 2 => 'AF-area Mode', + 3 => 'Center Focus Point', + 4 => 'FV Lock', # default + 5 => 'Flash Off', + 6 => 'Matrix Metering', + 7 => 'Center-weighted Metering', + 8 => 'Spot Metering', + 9 => 'My Menu Top', + 10 => '+ NEF (RAW)', + }, + }, + 16.1 => { # CSf2 + Name => 'OKButton', + Mask => 0x18, + PrintConv => { + 1 => 'Select Center Focus Point', + 2 => 'Highlight Active Focus Point', + 3 => 'Not Used', #(NC) + 0 => 'Not Used', #(NC) + }, + }, + 17.1 => { # CSf4 + Name => 'AELockButton', + Mask => 0x38, + PrintConv => { + 0 => 'AE/AF Lock', + 1 => 'AE Lock Only', + 2 => 'AF Lock Only', #(NC) + 3 => 'AE Lock (hold)', #(NC) + 4 => 'AF-ON', #(NC) + 5 => 'FV Lock', #(NC) + }, + }, + 18.1 => { # CSf5-a + Name => 'CommandDialsReverseRotation', + Mask => 0x80, + PrintConv => \%noYes, + }, + 18.2 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + Mask => 0x02, + PrintConv => \%offOn, + }, + 19.1 => { # CSc2 + Name => 'MeteringTime', + Mask => 0xf0, + PrintConvColumns => 2, + PrintConv => { + 0 => '4 s', + 1 => '6 s', # default + 2 => '8 s', + 3 => '16 s', + 4 => '30 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + 8 => '30 min', + }, + }, + 19.2 => { # CSc5 + Name => 'RemoteOnDuration', + Mask => 0x03, + PrintConv => { + 0 => '1 min', + 1 => '5 min', + 2 => '10 min', + 3 => '15 min', + }, + }, + 20.1 => { # CSc3-a + Name => 'SelfTimerTime', + Mask => 0xc0, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', # default + 3 => '20 s', + }, + }, + 20.2 => { # CSc3-b + Name => 'SelfTimerShotCount', + Mask => 0x1e, + }, + 21.1 => { # CSc4-a + Name => 'PlaybackMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 0 => '4 s', + 1 => '10 s', # default + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 21.2 => { # CSc4-d + Name => 'ImageReviewTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', # default + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 22.1 => { # CSc4-b + Name => 'MenuMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', # default + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 22.2 => { # CSc4-c + Name => 'ShootingInfoMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 0 => '4 s', + 1 => '10 s', # default + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 23.1 => { # CSe1 + Name => 'FlashShutterSpeed', + Mask => 0x0f, + PrintConvColumns => 2, + PrintConv => { + 0 => '1/60 s', # default + 1 => '1/30 s', + 2 => '1/15 s', + 3 => '1/8 s', + 4 => '1/4 s', + 5 => '1/2 s', + 6 => '1 s', + 7 => '2 s', + 8 => '4 s', + 9 => '8 s', + 10 => '15 s', + 11 => '30 s', + }, + }, + 24.1 => { # CSe2-a + Name => 'InternalFlash', + Mask => 0xc0, + PrintConv => { + 0 => 'TTL', + 1 => 'Manual', + 2 => 'Repeating Flash', + 3 => 'Commander Mode', + }, + }, + 24.2 => { # CSe2-b + Name => 'ManualFlashOutput', + Mask => 0x1f, + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val > 0 ? -3*log($val)/log(2) : 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 25.1 => { # CSe2-ca + Name => 'RepeatingFlashOutput', + Mask => 0x70, + ValueConv => '2 ** (-$val-2)', + ValueConvInv => '$val > 0 ? int(-log($val)/log(2)-2+0.5) : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 25.2 => { # CSe2-cb + Name => 'RepeatingFlashCount', + Mask => 0x0f, + ValueConv => '$val < 10 ? $val + 1 : 5 * ($val - 7)', + ValueConvInv => '$val <= 10 ? $val - 1 : $val / 5 + 7', + }, + 26.1 => { # CSe2-cc (NC) + Name => 'RepeatingFlashRate', + Mask => 0xf0, + ValueConv => '$val < 10 ? $val + 1 : 10 * ($val - 8)', + ValueConvInv => 'int(($val <= 10 ? $val - 1 : $val / 10 + 8) + 0.5)', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 31.1 => { # CSd11 + Name => 'FlashWarning', + Mask => 0x80, + PrintConv => \%onOff, + }, + 31.2 => { # CSe2-ea + Name => 'CommanderInternalTTLComp', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 31.3 => { # CSe3 + Name => 'ModelingFlash', + Mask => 0x20, + PrintConv => \%onOff, + }, + 31.4 => { # CSe5 + Name => 'AutoFP', + Mask => 0x40, + PrintConv => \%offOn, + }, + 32.1 => { # CSe2-eb + Name => 'CommanderGroupA_TTLComp', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 33.1 => { # CSe2-ec + Name => 'CommanderGroupB_TTLComp', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 34.1 => { # CSa7 + Name => 'LiveViewAF', + Mask => 0xc0, + PrintConv => { + 0 => 'Face Priority', #(NC) + 1 => 'Wide Area', + 2 => 'Normal Area', + }, + }, +); + +# D300 (ref JD) and D3 (ref 1/PH) custom settings +%Image::ExifTool::NikonCustom::SettingsD3 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D3, D3S, D3X, D300 and D300S.', + # these settings have been decoded using the D3 and D300, and + # extrapolated to the other models, but these haven't yet been + # verified, and the following custom settings are missing: + # CSf1-d (D3X,D3S) MultiSelectorLiveView + # CSf1 (D300S) LightSwitch + 0.1 => { #1 + Name => 'CustomSettingsBank', + Mask => 0x03, + PrintConv => { + 0 => 'A', + 1 => 'B', + 2 => 'C', + 3 => 'D', + }, + }, + 0.2 => { #1 + Name => 'CustomSettingsAllDefault', + Notes => '"No" if any custom setting for this bank was changed from the default', + Mask => 0x80, + PrintConv => { 0 => 'Yes', 1 => 'No' }, + }, + 1.1 => { # CSa1 + Name => 'AF-CPrioritySelection', + Mask => 0xc0, + PrintConv => { + 0 => 'Release', + 1 => 'Release + Focus', + 2 => 'Focus', + }, + }, + 1.2 => { # CSa2 + Name => 'AF-SPrioritySelection', + Mask => 0x20, + PrintConv => { + 0 => 'Focus', + 1 => 'Release', + }, + }, + 1.3 => { # CSa8 + Name => 'AFPointSelection', + Mask => 0x10, + PrintConv => { + 0 => '51 Points', + 1 => '11 Points', + }, + }, + 1.4 => { # CSa3 + Name => 'DynamicAFArea', + Mask => 0x0c, + PrintConv => { + 0 => '9 Points', + 1 => '21 Points', + 2 => '51 Points', + 3 => '51 Points (3D-tracking)', + }, + }, + 1.5 => { # CSa4 + Name => 'FocusTrackingLockOn', + Condition => '$$self{Model} !~ /D3S\b/', + Notes => 'not D3S', + Mask => 0x03, + PrintConv => { + 0 => 'Long', + 1 => 'Normal', + 2 => 'Short', + 3 => 'Off', + }, + }, + 2.1 => { # CSa5 + Name => 'AFActivation', + Mask => 0x80, + PrintConv => { + 0 => 'Shutter/AF-On', + 1 => 'AF-On Only', + }, + }, + 2.2 => { # CSa7 + Name => 'FocusPointWrap', + Mask => 0x08, + PrintConv => { + 0 => 'No Wrap', + 1 => 'Wrap', + }, + }, + 2.3 => [ # CSa6 + { + Name => 'AFPointIllumination', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3', + Mask => 0x60, + PrintConv => { + 0 => 'On in Continuous Shooting and Manual Focusing', + 1 => 'On During Manual Focusing', + 2 => 'On in Continuous Shooting Modes', + 3 => 'Off', + }, + }, + { + Name => 'AFPointIllumination', + Notes => 'D300', + Mask => 0x06, + PrintConv => { + 0 => 'Auto', + 1 => 'Off', + 2 => 'On', + }, + }, + ], + 2.4 => { # CSa6-b (D3, added by firmware update) + Name => 'AFPointBrightness', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3 only', + Mask => 0x06, + PrintConv => { + 0 => 'Low', + 1 => 'Normal', + 2 => 'High', + 3 => 'Extra High', + }, + }, + 2.5 => { # CSa9 (D300) + Name => 'AFAssist', + Condition => '$$self{Model} =~ /D300S?\b/', + Notes => 'D300 only', + Mask => 0x01, + PrintConv => \%onOff, + }, + 3.1 => { # CSa9 (D3) + Name => 'AFOnButton', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3 only', + Mask => 0x07, + PrintConv => { + 0 => 'AF On', + 1 => 'AE/AF Lock', + 2 => 'AE Lock Only', + 3 => 'AE Lock (reset on release)', + 4 => 'AE Lock (hold)', + 5 => 'AF Lock Only', + }, + }, + 3.2 => { # CSa10 (D3) + Name => 'VerticalAFOnButton', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3 only', + Mask => 0x70, + PrintConv => { + 0 => 'AF On', + 1 => 'AE/AF Lock', + 2 => 'AE Lock Only', + 3 => 'AE Lock (reset on release)', + 4 => 'AE Lock (hold)', + 5 => 'AF Lock Only', + 7 => 'Same as AF On', + }, + }, + 3.3 => { # CSa10 (D300) + Name => 'AF-OnForMB-D10', + Condition => '$$self{Model} =~ /D300S?\b/', + Notes => 'D300 only', + Mask => 0x70, + PrintConv => { + 0 => 'AF-On', + 1 => 'AE/AF Lock', + 2 => 'AE Lock Only', + 3 => 'AE Lock (reset on release)', + 4 => 'AE Lock (hold)', + 5 => 'AF Lock Only', + 6 => 'Same as FUNC Button', + }, + }, + 4.1 => { # CSa4 (D3S) + Name => 'FocusTrackingLockOn', + Condition => '$$self{Model} =~ /D3S\b/', + Notes => 'D3S only', + Mask => 0x07, + PrintConv => { + 0 => '5 (Long)', + 1 => '4', + 2 => '3 (Normal)', + 3 => '2', + 4 => '1 (Short)', + 5 => 'Off', + }, + }, + 4.2 => { # CSf7 (D3S) + Name => 'AssignBktButton', + Condition => '$$self{Model} =~ /D3S\b/', + Notes => 'D3S only', + Mask => 0x08, + PrintConv => { + 0 => 'Auto Bracketing', + 1 => 'Multiple Exposure', + }, + }, + 4.3 => { # CSf1-c (D3S) (ref 1) + Name => 'MultiSelectorLiveView', + Condition => '$$self{Model} =~ /D3S\b/', + Notes => 'D3S only', + Mask => 0xc0, + PrintConv => { + 0 => 'Reset', + 1 => 'Zoom On/Off', + 2 => 'Start Movie Recording', + 3 => 'Not Used', + }, + }, + 4.4 => { # CSf1-c2 (D3S) (ref 1) + Name => 'InitialZoomLiveView', + Condition => '$$self{Model} =~ /D3S\b/', + Notes => 'D3S only', + Mask => 0x30, + PrintConv => { + 0 => 'Low Magnification', + 1 => 'Medium Magnification', + 2 => 'High Magnification', + }, + }, + 6.1 => { # CSb1 + Name => 'ISOStepSize', + Mask => 0xc0, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 6.2 => { # CSb2 + Name => 'ExposureControlStepSize', + Mask => 0x30, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 6.3 => { # CSb3 + Name => 'ExposureCompStepSize', + Mask => 0x0c, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 6.4 => { # CSb4 + Name => 'EasyExposureCompensation', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On (auto reset)', + }, + }, + 7.1 => [ # CSb5 + { + Name => 'CenterWeightedAreaSize', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3', + Mask => 0xe0, + PrintConv => { + 0 => '8 mm', + 1 => '12 mm', + 2 => '15 mm', + 3 => '20 mm', + 4 => 'Average', + }, + }, + { + Name => 'CenterWeightedAreaSize', + Notes => 'D300', + Mask => 0xe0, + PrintConv => { + 0 => '6 mm', + 1 => '8 mm', + 2 => '10 mm', + 3 => '13 mm', + 4 => 'Average', + }, + }, + ], + 7.2 => { # CSb6-b + Name => 'FineTuneOptCenterWeighted', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 8.1 => { # CSb6-a + Name => 'FineTuneOptMatrixMetering', + Mask => 0xf0, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 8.2 => { # CSb6-c + Name => 'FineTuneOptSpotMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.1 => { # CSf1-a, CSf2-a (D300S) + Name => 'MultiSelectorShootMode', + Mask => 0xc0, + PrintConv => { + 0 => 'Select Center Focus Point', + 1 => 'Highlight Active Focus Point', + 2 => 'Not Used', + }, + }, + 9.2 => { # CSf1-b, CSf2-b (D300S) + Name => 'MultiSelectorPlaybackMode', + Condition => '$$self{Model} !~ /D3S\b/', + Notes => 'all models except D3S', # (not confirmed for D3X) + Mask => 0x30, + PrintConv => { + 0 => 'Thumbnail On/Off', + 1 => 'View Histograms', + 2 => 'Zoom On/Off', + 3 => 'Choose Folder', + }, + }, + 9.3 => [ # CSf1-b2, CSf2-b2 (D300S) + { + Name => 'InitialZoomSetting', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3', + Mask => 0x0c, + PrintConv => { #1 + 0 => 'High Magnification', + 1 => 'Medium Magnification', + 2 => 'Low Magnification', + }, + }, + { + Name => 'InitialZoomSetting', + Notes => 'D300', + Mask => 0x0c, + PrintConv => { #JD + 0 => 'Low Magnification', + 1 => 'Medium Magnification', + 2 => 'High Magnification', + }, + }, + ], + 9.4 => { # CSf2 (D300,D3), CSf3 (D300S) + Name => 'MultiSelector', + Mask => 0x01, + PrintConv => { + 0 => 'Do Nothing', + 1 => 'Reset Meter-off Delay', + }, + }, + 10.1 => { # CSd9 (D300,D3S), CSd10 (D300S), CSd8 (D3) + Name => 'ExposureDelayMode', + Mask => 0x40, + PrintConv => \%offOn, + }, + 10.2 => { # CSd4 (D300), CDs5 (D300S), CSd2-a (D3) + Name => 'CLModeShootingSpeed', + Mask => 0x07, + PrintConv => '"$val fps"', + PrintConvInv => '$val=~s/\s*fps//i; $val', + }, + 10.3 => { # (D3 CSd2-b) + Name => 'CHModeShootingSpeed', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3 only', + Mask => 0x30, + PrintConv => { + 0 => '9 fps', + 1 => '10 fps', + 2 => '11 fps', + }, + }, + 11 => { # CSd5 (D300), CSd6 (D300S), CSd3 (D3) + Name => 'MaxContinuousRelease', + # values: 1-100 (D300), 1-130 (D3) + }, + 12.1 => { # CSf10, CSf11 (D3S,D300S) + Name => 'ReverseIndicators', + Mask => 0x20, + PrintConv => { + 0 => '+ 0 -', + 1 => '- 0 +', + }, + }, + 12.2 => [ # CSd6 (D300), CSd7 (D300S), CSd4 (D3) + { + Name => 'FileNumberSequence', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3', + Mask => 0x02, + PrintConv => \%onOff, + }, + { + Name => 'FileNumberSequence', + Notes => 'D300', + Mask => 0x08, + PrintConv => \%onOff, + }, + ], + 12.3 => { # CSd5-a (D3) + Name => 'RearDisplay', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3 only', + Mask => 0x80, + PrintConv => { + 0 => 'ISO', + 1 => 'Exposures Remaining', + }, + }, + 12.4 => { # CSd5-b (D3) + Name => 'ViewfinderDisplay', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3 only', + Mask => 0x40, + PrintConv => { + 0 => 'Frame Count', + 1 => 'Exposures Remaining', + }, + }, + 12.5 => { # CSd11 (D300), CSd12 (D300S) + Name => 'BatteryOrder', + Condition => '$$self{Model} =~ /D300S?\b/', + Notes => 'D300 only', + Mask => 0x04, + PrintConv => { + 0 => 'MB-D10 First', + 1 => 'Camera Battery First', + }, + }, + 12.6 => { # CSd10 (D300), CSd11 (D300S) + Name => 'MB-D10Batteries', + Condition => '$$self{Model} =~ /D300S?\b/', + Notes => 'D300 only', + Mask => 0x03, + PrintConv => { + 0 => 'LR6 (AA alkaline)', + 1 => 'HR6 (AA Ni-MH)', + 2 => 'FR6 (AA lithium)', + 3 => 'ZR6 (AA Ni-Mn)', + }, + }, + 12.7 => { # CSd7 (D3S), CSd4, (D300S) + Name => 'ScreenTips', + Condition => '$$self{Model} =~ /(D3S|D300S)\b/', + Mask => 0x10, + PrintConv => \%onOff, + }, + 13.1 => { # CSd1 + Name => 'Beep', + Mask => 0xc0, + PrintConv => { + 0 => 'High', + 1 => 'Low', + 2 => 'Off', + }, + }, + 13.2 => { # CSd7 (D300), CSd8 (D300S), CSd6 (D3) + Name => 'ShootingInfoDisplay', + Mask => 0x30, + PrintConv => { + 0 => 'Auto', #JD (D300) + 1 => 'Auto', #1 (D3) + 2 => 'Manual (dark on light)', + 3 => 'Manual (light on dark)', + }, + }, + 13.3 => { # CSd2 (D300) + Name => 'GridDisplay', + Condition => '$$self{Model} =~ /D300S?\b/', + Notes => 'D300 only', + Mask => 0x02, + PrintConv => \%offOn, + }, + 13.4 => { # CSd3 (D300) + Name => 'ViewfinderWarning', + Condition => '$$self{Model} =~ /D300S?\b/', + Notes => 'D300 only', + Mask => 0x01, + PrintConv => \%onOff, + }, + 13.5 => { # CSf1-b (D3S) (ref 1) + Name => 'MultiSelectorPlaybackMode', + Condition => '$$self{Model} =~ /D3S\b/', + Notes => 'D3S only', + Mask => 0x03, + PrintConv => { + 0 => 'Thumbnail On/Off', + 1 => 'View Histograms', + 2 => 'Zoom On/Off', + }, + }, + 14.1 => [ # CSf5-a (ref 1), CSf6-a (D300S) + { + Name => 'PreviewButton', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3', + Mask => 0xf8, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'Flash Off', + 9 => 'Bracketing Burst', + 10 => 'Matrix Metering', + 11 => 'Center-weighted Metering', + 12 => 'Spot Metering', + 13 => 'Virtual Horizon', + # 14 not used + 15 => 'Playback', + 16 => 'My Menu Top', + }, + }, + { #PH + Name => 'FuncButton', + Notes => 'D300', + Mask => 0xf8, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + # 8 not used + 9 => 'Flash Off', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', #PH (guess) + 15 => 'My Menu Top', #PH (guess) + 16 => '+ NEF (RAW)', #PH (guess) + }, + }, + ], + 14.2 => [ # CSf5-b (PH,NC), CSf6-b (D300S) + { + Name => 'PreviewButtonPlusDials', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3', + Mask => 0x07, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (FX/DX/5:4)', + 2 => 'One Step Speed/Aperture', + 3 => 'Choose Non-CPU Lens Number', + # n/a 4 => 'Focus Point Selection', + 5 => 'Choose Image Area (FX/DX)', + 6 => 'Shooting Bank Menu', + 7 => 'Dynamic AF Area', #PH (D3S,D3X,NC) + }, + }, + { #PH + Name => 'FuncButtonPlusDials', + Notes => 'D300', + Mask => 0x07, + PrintConv => { + 0 => 'None', + 2 => 'One Step Speed/Aperture', + 3 => 'Choose Non-CPU Lens Number', + 5 => 'Auto Bracketing', + 6 => 'Dynamic AF Area', + }, + }, + ], + 15.1 => [ # CSf4-a (ref 1), CSf5-a (D300S) + { + Name => 'FuncButton', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3', + Mask => 0xf8, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'Flash Off', + 9 => 'Bracketing Burst', + 10 => 'Matrix Metering', + 11 => 'Center-weighted Metering', + 12 => 'Spot Metering', + 13 => 'Virtual Horizon', + # 14 not used + 15 => 'Playback', + 16 => 'My Menu Top', + }, + }, + { #PH + Name => 'PreviewButton', + Notes => 'D300', + Mask => 0xf8, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + # 8 not used + 9 => 'Flash Off', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', #PH (guess) + 15 => 'My Menu Top', #PH (guess) + 16 => '+ NEF (RAW)', #PH (guess) + }, + }, + ], + 15.2 => [ # CSf4-b (ref 1), CSf5-b (D300S) + { + Name => 'FuncButtonPlusDials', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3', + Mask => 0x07, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (FX/DX/5:4)', + 2 => 'One Step Speed/Aperture', + 3 => 'Choose Non-CPU Lens Number', + 4 => 'Focus Point Selection', #(NC) + 5 => 'Choose Image Area (FX/DX)', + 6 => 'Shooting Bank Menu', + 7 => 'Dynamic AF Area', #PH (D3S,D3X,NC) + }, + }, + { #PH + Name => 'PreviewButtonPlusDials', + Notes => 'D300', + Mask => 0x07, + PrintConv => { + 0 => 'None', + 2 => 'One Step Speed/Aperture', + 3 => 'Choose Non-CPU Lens Number', + 5 => 'Auto Bracketing', + 6 => 'Dynamic AF Area', + }, + }, + ], + 16.1 => [ # CSf6-a (ref 1), CSf7-a (D300S) + { + Name => 'AELockButton', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3', + Mask => 0xf8, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'Flash Off', + 9 => 'Bracketing Burst', + 10 => 'Matrix Metering', + 11 => 'Center-weighted Metering', + 12 => 'Spot Metering', + 13 => 'Virtual Horizon', + 14 => 'AF On', # (AE-L/AF-L button only) + 15 => 'Playback', + 16 => 'My Menu Top', + }, + }, + { #PH + Name => 'AELockButton', + Notes => 'D300', + Mask => 0xf8, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF On', # (AE-L/AF-L button only) + 9 => 'Flash Off', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', #PH (guess) + 15 => 'My Menu Top', #PH (guess) + 16 => '+ NEF (RAW)', #PH (guess) + }, + }, + ], + 16.2 => [ # CSf6-b (ref 1), CSf7-b (D300S) + { + Name => 'AELockButtonPlusDials', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3', + Mask => 0x07, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (FX/DX/5:4)', + 2 => 'One Step Speed/Aperture', + 3 => 'Choose Non-CPU Lens Number', + # n/c 4 => 'Focus Point Selection', #(NC) + 5 => 'Choose Image Area (FX/DX)', + 6 => 'Shooting Bank Menu', + 7 => 'Dynamic AF Area', #PH (D3S,D3X,NC) + }, + }, + { #PH + Name => 'AELockButtonPlusDials', + Notes => 'D300', + Mask => 0x07, + PrintConv => { + 0 => 'None', + # n/a 2 => 'One Step Speed/Aperture', + 3 => 'Choose Non-CPU Lens Number', + 5 => 'Auto Bracketing', #(NC) + 6 => 'Dynamic AF Area', + }, + }, + ], + 17.1 => { # CSf7-a, CSf8-a (D3S,D300S) + Name => 'CommandDialsReverseRotation', + Mask => 0x80, + PrintConv => \%noYes, + }, + 17.2 => { # CSf7-b, CSf8-b (D3S,D300S) + Name => 'CommandDialsChangeMainSub', + Mask => 0x40, + PrintConv => \%offOn, + }, + 17.3 => { # CSf7-c, CSf8-c (D3S,D300S) + Name => 'CommandDialsApertureSetting', + Mask => 0x20, + PrintConv => { + 0 => 'Sub-command Dial', + 1 => 'Aperture Ring', + }, + }, + 17.4 => { # CSf7-d, CSf8-d (D3S,D300S) + Name => 'CommandDialsMenuAndPlayback', + Mask => 0x10, + PrintConv => \%offOn, + }, + 17.5 => { # CSd8 (D300,D3S), CSd9 (D300S), CSd7 (D3) + Name => 'LCDIllumination', + Mask => 0x08, + PrintConv => \%offOn, + }, + 17.6 => { # CSf3, CSf4 (D300S) + Name => 'PhotoInfoPlayback', + Mask => 0x04, + PrintConv => { + 0 => 'Info Up-down, Playback Left-right', + 1 => 'Info Left-right, Playback Up-down', + }, + }, + 17.7 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + Mask => 0x02, + PrintConv => \%offOn, + }, + 17.8 => { # CSf8, CSf9 (D3S,D300S) + Name => 'ReleaseButtonToUseDial', + Mask => 0x01, + PrintConv => \%noYes, + }, + 18.1 => { # CSc3 + Name => 'SelfTimerTime', + Mask => 0x18, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 18.2 => { # CSc4 + Name => 'MonitorOffTime', + # NOTE: The D3S and D300S have separate settings for Playback, + # Image Review, Menus, and Information Display times + Mask => 0x07, + PrintConv => { + 0 => '10 s', + 1 => '20 s', + 2 => '1 min', + 3 => '5 min', + 4 => '10 min', + }, + }, + 20.1 => [ # CSe1 + { + Name => 'FlashSyncSpeed', + Condition => '$$self{Model} =~ /D3[SX]?\b/', + Notes => 'D3', + Mask => 0xe0, + PrintConv => { + 0 => '1/250 s (auto FP)', + 1 => '1/250 s', + 2 => '1/200 s', + 3 => '1/160 s', + 4 => '1/125 s', + 5 => '1/100 s', + 6 => '1/80 s', + 7 => '1/60 s', + }, + }, + { + Name => 'FlashSyncSpeed', + Notes => 'D300', + Mask => 0xf0, + PrintConv => { + 0 => '1/320 s (auto FP)', + 1 => '1/250 s (auto FP)', + 2 => '1/250 s', + 3 => '1/200 s', + 4 => '1/160 s', + 5 => '1/125 s', + 6 => '1/100 s', + 7 => '1/80 s', + 8 => '1/60 s', + }, + }, + ], + 20.2 => { # CSe2 + Name => 'FlashShutterSpeed', + Mask => 0x0f, + PrintConvColumns => 2, + PrintConv => { + 0 => '1/60 s', + 1 => '1/30 s', + 2 => '1/15 s', + 3 => '1/8 s', + 4 => '1/4 s', + 5 => '1/2 s', + 6 => '1 s', + 7 => '2 s', + 8 => '4 s', + 9 => '8 s', + 10 => '15 s', + 11 => '30 s', + }, + }, + 21.1 => [{ # CSe5 (D300), CSe4 (D3) + Name => 'AutoBracketSet', + Condition => '$$self{Model} !~ /(D3S|D300S)\b/', + Notes => 'D3 and D300', + Mask => 0xc0, + PrintConv => { + 0 => 'AE & Flash', + 1 => 'AE Only', + 2 => 'Flash Only', + 3 => 'WB Bracketing', + }, + },{ # CSe4 (D3S) (NC for D300S) + Name => 'AutoBracketSet', + Notes => 'D3S and D300S', + Mask => 0xe0, + PrintConv => { + 0 => 'AE & Flash', + 1 => 'AE Only', + 2 => 'Flash Only', + 3 => 'WB Bracketing', + # D3S/D300S have an "ADL Bracketing" setting - PH + 4 => 'ADL Bracketing', + }, + }], + 21.2 => [{ # CSe6 (D300), CSe5 (D3) + Name => 'AutoBracketModeM', + Condition => '$$self{Model} !~ /(D3S|D300S)\b/', + Notes => 'D3 and D300', + Mask => 0x30, + PrintConv => { + 0 => 'Flash/Speed', + 1 => 'Flash/Speed/Aperture', + 2 => 'Flash/Aperture', + 3 => 'Flash Only', + }, + },{ # CSe5 (D3S) + Name => 'AutoBracketModeM', + Notes => 'D3S and D300S', + Mask => 0x18, + PrintConv => { + 0 => 'Flash/Speed', + 1 => 'Flash/Speed/Aperture', + 2 => 'Flash/Aperture', + 3 => 'Flash Only', + }, + }], + 21.3 => [{ # CSe7 (D300), CSe6 (D3) + Name => 'AutoBracketOrder', + Condition => '$$self{Model} !~ /(D3S|D300S)\b/', + Notes => 'D3 and D300', + Mask => 0x08, + PrintConv => { + 0 => '0,-,+', + 1 => '-,0,+', + }, + },{ # CSe6 (D3S) + Name => 'AutoBracketOrder', + Notes => 'D3S and D300S', + Mask => 0x04, + PrintConv => { + 0 => '0,-,+', + 1 => '-,0,+', + }, + }], + 21.4 => { # CSe4 (D300), CSe3 (D3) + Name => 'ModelingFlash', + Mask => 0x01, + PrintConv => \%onOff, + }, + 22.1 => { # CSf9, CSf10 (D3S,D300S) + Name => 'NoMemoryCard', + Mask => 0x80, + PrintConv => { + 0 => 'Release Locked', + 1 => 'Enable Release', + }, + }, + 22.2 => { # CSc2 + Name => 'MeteringTime', + Mask => 0x0f, + PrintConvColumns => 2, + PrintConv => { + 0 => '4 s', + 1 => '6 s', + 2 => '8 s', + 3 => '16 s', + 4 => '30 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + 8 => '30 min', + 9 => 'No Limit', + }, + }, + 23.1 => { # CSe3 + Name => 'InternalFlash', + Mask => 0xc0, + PrintConv => { + 0 => 'TTL', + 1 => 'Manual', + 2 => 'Repeating Flash', + 3 => 'Commander Mode', + }, + }, + 25.1 => { #1 CSc4-d (D3S) + Name => 'ImageReviewTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 25.2 => { #1 CSc4-a (D3S) + Name => 'PlaybackMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 26.1 => { #1 CSc4-b (D3S) + Name => 'MenuMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 26.2 => { #1 CSc4-c (D3S) + Name => 'ShootingInfoMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, +); + +# D700 custom settings (ref 2) +%Image::ExifTool::NikonCustom::SettingsD700 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + DATAMEMBER => [ 16.1 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D700.', + 0.1 => { #1 + Name => 'CustomSettingsBank', + Mask => 0x03, + PrintConv => { + 0 => 'A', + 1 => 'B', + 2 => 'C', + 3 => 'D', + }, + }, + 0.2 => { #1 + Name => 'CustomSettingsAllDefault', + Notes => '"No" if any custom setting for this bank was changed from the default', + Mask => 0x80, + PrintConv => { 0 => 'Yes', 1 => 'No' }, + }, + 1.1 => { # CSa1 + Name => 'AF-CPrioritySelection', + Mask => 0xc0, + PrintConv => { + 0 => 'Release', + 1 => 'Release + Focus', + 2 => 'Focus', + }, + }, + 1.2 => { # CSa2 + Name => 'AF-SPrioritySelection', + Mask => 0x20, + PrintConv => { + 0 => 'Focus', + 1 => 'Release', + }, + }, + 1.3 => { # CSa8 + Name => 'AFPointSelection', + Mask => 0x10, + PrintConv => { + 0 => '51 Points', + 1 => '11 Points', + }, + }, + 1.4 => { # CSa3 + Name => 'DynamicAFArea', + Mask => 0x0c, + PrintConv => { + 0 => '9 Points', + 1 => '21 Points', + 2 => '51 Points', + 3 => '51 Points (3D-tracking)', + }, + }, + 2.1 => { # CSa5 + Name => 'AFActivation', + Mask => 0x80, + PrintConv => { + 0 => 'Shutter/AF-On', + 1 => 'AF-On Only', + }, + }, + 2.2 => { # CSa7 + Name => 'FocusPointWrap', + Mask => 0x08, + PrintConv => { + 0 => 'No Wrap', + 1 => 'Wrap', + }, + }, + 2.3 => { # CSa6 + Name => 'AFPointIllumination', + Mask => 0x06, + PrintConv => { + 0 => 'Auto', + 1 => 'Off', + 2 => 'On', + }, + }, + 2.4 => { # CSa9 + Name => 'AFAssist', + Mask => 0x01, + PrintConv => \%onOff, + }, + 3.1 => { # CSa4 + Name => 'FocusTrackingLockOn', + Mask => 0x07, + PrintConv => { + 0 => '3 Normal', + 1 => '4', + 2 => '5 Long', + 3 => '2', + 4 => '1 Short', + 5 => 'Off', + }, + }, + 3.2 => { # CSa10 + Name => 'AF-OnForMB-D10', + Mask => 0x70, + PrintConv => { + 0 => 'AF-On', + 1 => 'AE/AF Lock', + 2 => 'AE Lock Only', + 3 => 'AE Lock (reset on release)', + 4 => 'AE Lock (hold)', + 5 => 'AF Lock Only', + 6 => 'Same as FUNC Button', + }, + }, + 4.1 => { # CSb1 + Name => 'ISOStepSize', + Mask => 0xc0, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 4.2 => { # CSb2 + Name => 'ExposureControlStepSize', + Mask => 0x30, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 4.3 => { # CSb3 + Name => 'ExposureCompStepSize', + Mask => 0x0c, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 4.4 => { # CSb4 + Name => 'EasyExposureCompensation', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On (auto reset)', + }, + }, + 5.1 => { # CSb5 + Name => 'CenterWeightedAreaSize', + Mask => 0x70, + PrintConv => { + 0 => '8 mm', + 1 => '12 mm', + 2 => '15 mm', + 3 => '20 mm', + 4 => 'Average', + }, + }, + 6.1 => { # CSb6-a + Name => 'FineTuneOptMatrixMetering', + Mask => 0xf0, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 6.2 => { # CSb6-c + Name => 'FineTuneOptSpotMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 7.1 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + Mask => 0x80, + PrintConv => \%offOn, + }, + 7.2 => { # CSc3 + Name => 'SelfTimerTime', + Mask => 0x30, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 7.3 => { # CSc2 + Name => 'MeteringTime', + Mask => 0x0f, + PrintConvColumns => 2, + PrintConv => { + 0 => '4 s', + 1 => '6 s', + 2 => '8 s', + 3 => '16 s', + 4 => '30 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + 8 => '30 min', + 9 => 'No Limit', + }, + }, + 8.1 => { # CSc4-a + Name => 'PlaybackMonitorOffTime', + Mask => 0x38, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 8.2 => { # CSc4-b + Name => 'MenuMonitorOffTime', + Mask => 0x07, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 9.1 => { # CSc4-c + Name => 'ShootingInfoMonitorOffTime', + Mask => 0x38, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 9.2 => { # CSc4-d + Name => 'ImageReviewTime', + Mask => 0x07, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 10.1 => { # CSd1 + Name => 'Beep', + Mask => 0xc0, + PrintConv => { + 0 => 'High', + 1 => 'Low', + 2 => 'Off', + }, + }, + 10.2 => { # CSd7 + Name => 'ShootingInfoDisplay', + Mask => 0x30, + PrintConv => { + 0 => 'Auto', #JD (D300) + 1 => 'Auto', #1 (D3) + 2 => 'Manual (dark on light)', + 3 => 'Manual (light on dark)', + }, + }, + 10.3 => { # CSd8 + Name => 'LCDIllumination', + Mask => 0x08, + PrintConv => \%offOn, + }, + 10.4 => { # CSd9 + Name => 'ExposureDelayMode', + Mask => 0x04, + PrintConv => \%offOn, + }, + 10.5 => { # CSd2 + Name => 'GridDisplay', + Mask => 0x02, + PrintConv => \%offOn, + }, + 11.1 => { # CSd6 + Name => 'FileNumberSequence', + Mask => 0x40, + PrintConv => \%onOff, + }, + 11.2 => { # CSd4 + Name => 'CLModeShootingSpeed', + Mask => 0x07, + PrintConv => '"$val fps"', + PrintConvInv => '$val=~s/\s*fps//i; $val', + }, + 12 => { # CSd5 + Name => 'MaxContinuousRelease', + # values: 1-100 + }, + 13.1 => { # CSd3 + Name => 'ScreenTips', + Mask => 0x08, + PrintConv => \%onOff, + }, + 13.2 => { # CSd11 + Name => 'BatteryOrder', + Mask => 0x04, + PrintConv => { + 0 => 'MB-D10 First', + 1 => 'Camera Battery First', + }, + }, + 13.3 => { # CSd10 + Name => 'MB-D10BatteryType', + Mask => 0x03, + PrintConv => { + 0 => 'LR6 (AA alkaline)', + 1 => 'HR6 (AA Ni-MH)', + 2 => 'FR6 (AA lithium)', + 3 => 'ZR6 (AA Ni-Mn)', + }, + }, + 15.1 => { # CSe1 + Name => 'FlashSyncSpeed', + Mask => 0xf0, + PrintConv => { + 0 => '1/320 s (auto FP)', + 1 => '1/250 s (auto FP)', + 2 => '1/250 s', + 3 => '1/200 s', + 4 => '1/160 s', + 5 => '1/125 s', + 6 => '1/100 s', + 7 => '1/80 s', + 8 => '1/60 s', + }, + }, + 15.2 => { # CSe2 + Name => 'FlashShutterSpeed', + Mask => 0x0f, + PrintConvColumns => 2, + PrintConv => { + 0 => '1/60 s', + 1 => '1/30 s', + 2 => '1/15 s', + 3 => '1/8 s', + 4 => '1/4 s', + 5 => '1/2 s', + 6 => '1 s', + 7 => '2 s', + 8 => '4 s', + 9 => '8 s', + 10 => '15 s', + 11 => '30 s', + }, + }, + 16.1 => { # CSe3 + Name => 'FlashControlBuilt-in', + # Note If set the Manual, Repeating Flash, Commander Mode + # does not decode the detail settings. + Mask => 0xc0, + RawConv => '$$self{FlashControlBuiltin} = $val', + PrintConv => { + 0 => 'TTL', + 1 => 'Manual', + 2 => 'Repeating Flash', + 3 => 'Commander Mode', + }, + }, + 16.2 => { # CSe3-b + Name => 'ManualFlashOutput', + Condition => '$$self{FlashControlBuiltin} == 1', + Mask => 0x1f, + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val > 0 ? -3*log($val)/log(2) : 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 17.1 => { # CSe3-ca + Name => 'RepeatingFlashOutput', + Condition => '$$self{FlashControlBuiltin} == 2', + Mask => 0x70, + ValueConv => '2 ** (-$val-2)', + ValueConvInv => '$val > 0 ? int(-log($val)/log(2)-2+0.5) : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 17.2 => { # CSe3-cb + Name => 'RepeatingFlashCount', + Condition => '$$self{FlashControlBuiltin} == 2', + Mask => 0x0f, + ValueConv => '$val < 10 ? $val + 1 : 5 * ($val - 7)', + ValueConvInv => '$val <= 10 ? $val - 1 : $val / 5 + 7', + }, + 18.1 => { # CSe3-cc (NC) + Name => 'RepeatingFlashRate', + Condition => '$$self{FlashControlBuiltin} == 2', + Mask => 0xf0, + ValueConv => '$val < 10 ? $val + 1 : 10 * ($val - 8)', + ValueConvInv => 'int(($val <= 10 ? $val - 1 : $val / 10 + 8) + 0.5)', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 18.2 => { # CSe3-dd + Name => 'CommanderInternalTTLChannel', + Condition => '$$self{FlashControlBuiltin} == 3', + Mask => 0x03, + PrintConv => { + 0 => '1 ch', + 1 => '2 ch', + 2 => '3 ch', + 3 => '4 ch', + }, + }, + 20.1 => { # CSe3-da + Name => 'CommanderInternalTTLCompBuiltin', + Condition => '$$self{FlashControlBuiltin} == 3', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 21.1 => { # CSe3-db + Name => 'CommanderInternalTTLCompGroupA', + Condition => '$$self{FlashControlBuiltin} == 3', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 22.1 => { # CSe3-dc + Name => 'CommanderInternalTTLCompGroupB', + Condition => '$$self{FlashControlBuiltin} == 3', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 26.1 => { # CSe5 + Name => 'AutoBracketSet', + Mask => 0xc0, + PrintConv => { + 0 => 'AE & Flash', + 1 => 'AE Only', + 2 => 'Flash Only', + 3 => 'WB Bracketing', + }, + }, + 26.2 => { # CSe6 + Name => 'AutoBracketModeM', + Mask => 0x30, + PrintConv => { + 0 => 'Flash/Speed', + 1 => 'Flash/Speed/Aperture', + 2 => 'Flash/Aperture', + 3 => 'Flash Only', + }, + }, + 26.3 => { # CSe7 + Name => 'AutoBracketOrder', + Mask => 0x08, + PrintConv => { + 0 => '0,-,+', + 1 => '-,0,+', + }, + }, + 26.4 => { # CSe4 + Name => 'ModelingFlash', + Mask => 0x01, + PrintConv => \%onOff, + }, + 27.1 => { # CSf2-a + Name => 'MultiSelectorShootMode', + Mask => 0xc0, + PrintConv => { + 0 => 'Select Center Focus Point', + 1 => 'Highlight Active Focus Point', + 2 => 'Not Used', + }, + }, + 27.2 => { # CSf2-b + Name => 'MultiSelectorPlaybackMode', + Mask => 0x30, + PrintConv => { + 0 => 'Thumbnail On/Off', + 1 => 'View Histograms', + 2 => 'Zoom On/Off', + 3 => 'Choose Folder', + }, + }, + 27.3 => { # CSf2-b2 + Name => 'InitialZoomSetting', + Mask => 0x0c, + PrintConv => { #1 + 0 => 'Low Magnification', + 1 => 'Medium Magnification', + 2 => 'High Magnification', + }, + }, + 27.4 => { # CSf3 + Name => 'MultiSelector', + Mask => 0x01, + PrintConv => { + 0 => 'Do Nothing', + 1 => 'Reset Meter-off Delay', + }, + }, + 28.1 => { # CSf5-a + Name => 'FuncButton', + Mask => 0xf8, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + # 8 not used + 9 => 'Flash Off', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'My Menu Top', + 15 => 'Live View', + 16 => '+ NEF (RAW)', + 17 => 'Virtual Horizon', + }, + }, + 29.1 => { # CSf6-a + Name => 'PreviewButton', + Mask => 0xf8, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-ON', + 9 => 'Flash Off', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'My Menu Top', + 15 => 'Live View', + 16 => '+ NEF (RAW)', + 17 => 'Virtual Horizon', + }, + }, + 30.1 => { # CSf7-a + Name => 'AELockButton', + Notes => 'D300', + Mask => 0xf8, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-ON', + 9 => 'Flash Off', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'My Menu Top', + 15 => 'Live View', + 16 => '+ NEF (RAW)', + 17 => 'Virtual Horizon', + }, + }, + 31.1 => { # CSf5-b + Name => 'FuncButtonPlusDials', + Mask => 0x70, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'One Step Speed/Aperture', + 3 => 'Choose Non-CPU Lens Number', + # n/a 4 => 'Focus Point Selection', + 5 => 'Auto bracketing', + 6 => 'Dynamic AF Area', + 7 => 'Shutter speed & Aperture lock', + }, + }, + 31.2 => { # CSf6-b + Name => 'PreviewButtonPlusDials', + Mask => 0x07, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'One Step Speed/Aperture', + 3 => 'Choose Non-CPU Lens Number', + # n/a 4 => 'Focus Point Selection', + 5 => 'Auto bracketing', + 6 => 'Dynamic AF Area', + 7 => 'Shutter speed & Aperture lock', + }, + }, + 32.1 => { # CSf7-b + Name => 'AELockButtonPlusDials', + Mask => 0x70, + Prinonv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'One Step Speed/Aperture', + 3 => 'Choose Non-CPU Lens Number', + # n/a 4 => 'Focus Point Selection', + 5 => 'Auto bracketing', + 6 => 'Dynamic AF Area', + 7 => 'Shutter speed & Aperture lock', + }, + }, + 33.1 => { # CSf9-a + Name => 'CommandDialsReverseRotation', + Mask => 0x80, + PrintConv => \%noYes, + }, + 33.2 => { # CSf9-b + Name => 'CommandDialsChangeMainSub', + Mask => 0x40, + PrintConv => \%offOn, + }, + 33.3 => { # CSf9-c + Name => 'CommandDialsApertureSetting', + Mask => 0x20, + PrintConv => { + 0 => 'Sub-command Dial', + 1 => 'Aperture Ring', + }, + }, + 33.4 => { # CSf9-d + Name => 'CommandDialsMenuAndPlayback', + Mask => 0x10, + PrintConv => \%offOn, + }, + 33.5 => { # CSf12 + Name => 'ReverseIndicators', + Mask => 0x08, + PrintConv => { + 0 => '+ 0 -', + 1 => '- 0 +', + }, + }, + 33.6 => { # CSf4 + Name => 'PhotoInfoPlayback', + Mask => 0x04, + PrintConv => \%offOn, + }, + 33.7 => { # CSf11 + Name => 'NoMemoryCard', + Mask => 0x02, + PrintConv => { + 0 => 'Release Locked', + 1 => 'Enable Release', + }, + }, + 33.8 => { # CSf10 + Name => 'ReleaseButtonToUseDial', + Mask => 0x01, + PrintConv => \%noYes, + }, +); + +# D800 custom settings (ref PH) +%Image::ExifTool::NikonCustom::SettingsD800 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + DATAMEMBER => [ 23.1 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D800 and D800E.', + 12.1 => { # CSe5 + Name => 'AutoBracketingSet', + Mask => 0xe0, #(NC) + PrintConv => { + 0 => 'AE & Flash', # default + 1 => 'AE Only', #(NC) + 2 => 'Flash Only', + 3 => 'WB Bracketing', #(NC) + 4 => 'Active D-Lighting', #(NC) + }, + }, + 12.2 => { # CSe7 + Name => 'AutoBracketOrder', + Mask => 0x10, + PrintConv => { + 0 => '0,-,+', + 1 => '-,0,+', + }, + }, + 12.3 => { # CSe6 + Name => 'AutoBracketingMode', + Mask => 0x0c, + PrintConv => { + 0 => 'Flash/Speed', + 1 => 'Flash/Speed/Aperture', + 2 => 'Flash/Aperture', + 3 => 'Flash Only', + }, + }, + # 21 - 100 (MaxContinuousRelease?) + 22.1 => { # CSe1 + Name => 'FlashSyncSpeed', + Mask => 0xf0, + PrintConv => { + 0 => '1/320 s (auto FP)', + 1 => '1/250 s (auto FP)', + 2 => '1/250 s', + 3 => '1/200 s', + 4 => '1/160 s', + 5 => '1/125 s', + 6 => '1/100 s', + 7 => '1/80 s', + 8 => '1/60 s', + }, + }, + 22.2 => { # CSe2 + Name => 'FlashShutterSpeed', + Mask => 0x0f, + PrintConvColumns => 2, + PrintConv => { + 0 => '1/60 s', + 1 => '1/30 s', + 2 => '1/15 s', + 3 => '1/8 s', + 4 => '1/4 s', + 5 => '1/2 s', + 6 => '1 s', + 7 => '2 s', + 8 => '4 s', + 9 => '8 s', + 10 => '15 s', + 11 => '30 s', + }, + }, + 23.1 => { # CSe3 + Name => 'FlashControlBuilt-in', + Mask => 0xc0, + RawConv => '$$self{FlashControlBuiltin} = $val', + PrintConv => { + 0 => 'TTL', + 1 => 'Manual', + 2 => 'Repeating Flash', + 3 => 'Commander Mode', + }, + }, + 23.2 => { # CSe3-b + Name => 'ManualFlashOutput', + Condition => '$$self{FlashControlBuiltin} == 1', + Mask => 0x1f, + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val > 0 ? -3*log($val)/log(2) : 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 24.1 => { # CSe3-ca + Name => 'RepeatingFlashOutput', + Condition => '$$self{FlashControlBuiltin} == 2', + Mask => 0x70, + ValueConv => '2 ** (-$val-2)', + ValueConvInv => '$val > 0 ? int(-log($val)/log(2)-2+0.5) : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 24.2 => { # CSe3-cb + Name => 'RepeatingFlashCount', + Condition => '$$self{FlashControlBuiltin} == 2', + Mask => 0x0f, + ValueConv => '$val < 10 ? $val + 1 : 5 * ($val - 7)', + ValueConvInv => '$val <= 10 ? $val - 1 : $val / 5 + 7', + }, + 25.1 => { # CSe3-cc + Name => 'RepeatingFlashRate', + Condition => '$$self{FlashControlBuiltin} == 2', + Mask => 0xf0, + ValueConv => '$val < 10 ? $val + 1 : 10 * ($val - 8)', + ValueConvInv => 'int(($val <= 10 ? $val - 1 : $val / 10 + 8) + 0.5)', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 25.2 => { # CSe3 + Name => 'CommanderChannel', + Mask => 0x03, + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', + }, + 27.1 => { # CSe3 + Name => 'CommanderInternalFlash', + Mask => 0xc0, + PrintConv => { + 0 => 'TTL', + 1 => 'Manual', + 2 => 'Off', + }, + }, + 27.2 => { # CSe3 + Name => 'CommanderInternalManualOutput', + Mask => 0x1f, + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val > 0 ? int(-log($val)/log(2) * 3 + 0.5): 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 28.1 => { # CSe3 + Name => 'CommanderGroupAMode', + Mask => 0xc0, + PrintConv => { + 0 => 'TTL', + 1 => 'Auto Aperture', + 2 => 'Manual', + 3 => 'Off', + }, + }, + 28.2 => { # CSe3 + Name => 'CommanderGroupAManualOutput', + Mask => 0x1f, + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val > 0 ? int(-log($val)/log(2) * 3 + 0.5): 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 29.1 => { # CSe3 + Name => 'CommanderGroupBMode', + Mask => 0xc0, + PrintConv => { + 0 => 'TTL', + 1 => 'Auto Aperture', + 2 => 'Manual', + 3 => 'Off', + }, + }, + 29.2 => { # CSe3 + Name => 'CommanderGroupBManualOutput', + Mask => 0x1f, + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val > 0 ? int(-log($val)/log(2) * 3 + 0.5): 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 30.1 => { # CSe4 + Name => 'ModelingFlash', + Mask => 0x20, + PrintConv => \%onOff, + }, + 30.2 => { # CSe3 + Name => 'CommanderInternalTTLComp', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 31.1 => { # CSe3 + Name => 'CommanderGroupA_TTL-AAComp', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 32.1 => { # CSe3 + Name => 'CommanderGroupB_TTL-AAComp', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + # 47 - related to flash +); + +# D5 custom settings (ref 1) +%Image::ExifTool::NikonCustom::SettingsD5 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D5.', + 0.1 => { + Name => 'CustomSettingsBank', + Mask => 0x03, + PrintConv => { + 0 => 'A', + 1 => 'B', + 2 => 'C', + 3 => 'D', + }, + }, + 1.1 => { # CSa1 + Name => 'AF-CPrioritySelection', + Mask => 0xc0, + PrintConv => { + 0 => 'Release', + 1 => 'Release + Focus', + 2 => 'Focus', + 3 => 'Focus + Release', + }, + }, + 1.2 => { # CSa2 + Name => 'AF-SPrioritySelection', + Mask => 0x20, + PrintConv => { + 0 => 'Focus', + 1 => 'Release', + }, + }, + 1.3 => { # CSa6 + Name => 'NumberOfFocusPoints', + Mask => 0x10, + PrintConv => { + 0 => '55 Points', + 1 => '15 Points', + }, + }, + 1.4 => { # CSa4 + Name => 'Three-DTrackingFaceDetection', + Mask => 0x08, + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 1.5 => { # CSa3-a + Name => 'BlockShotAFResponse', + Mask => 0x07, + #values 1-5 + }, + 2.1 => { # CSa11 + Name => 'FocusPointWrap', + Mask => 0x08, + PrintConv => { + 0 => 'No Wrap', + 1 => 'Wrap', + }, + }, + 2.2 => { # CSa12-d + Name => 'AFPointBrightness', + Mask => 0x06, + PrintConv => { + 0 => 'Auto', + 1 => 'On', + 2 => 'Off', + }, + }, + 4.1 => { # CSd3 + Name => 'ISODisplay', + Mask => 0x08, + PrintConv => { + 0 => 'Show ISO Sensitivity', + 1 => 'Show Frame Count', + }, + }, + 4.2 => { # CSd8 + Name => 'GridDisplay', + Mask => 0x02, + PrintConv => \%onOff, + }, + 5.1 => { # CSd9 + Name => 'LCDIllumination', + Mask => 0x20, + PrintConv => \%offOn, + }, + 5.2 => { # CSd6 + Name => 'ElectronicFront-CurtainShutter', + Mask => 0x08, + PrintConv => \%offOn, + }, + 6.1 => { # CSf7 + Name => 'ReverseIndicators', + Mask => 0x80, + PrintConv => { + 0 => '+ 0 -', + 1 => '- 0 +', + }, + }, + 6.2 => { # CSf4-a + Name => 'CommandDialsReverseRotation', + Mask => 0x18, + PrintConv => { + 0 => 'No', + 1 => 'Shutter Speed & Aperture', + 2 => 'Exposure Compensation', + 3 => 'Exposure Compensation, Shutter Speed & Aperture', + }, + }, + 6.3 => { # CSb4 + Name => 'EasyExposureCompensation', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On (auto reset)', + }, + }, + 7.1 => { # CSb2 + Name => 'ExposureControlStepSize', + Mask => 0xc0, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 7.2 => { # CSb1 + Name => 'ISOStepSize', + Mask => 0x30, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 7.3 => { # CSb3 + Name => 'ExposureCompStepSize', + Mask => 0x0c, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 8.1 => { # CSb6 + Name => 'CenterWeightedAreaSize', + Mask => 0xe0, + PrintConv => { + 0 => '8 mm', + 1 => '12 mm', + 2 => '15 mm', + 3 => '20 mm', + 4 => 'Average', + }, + }, + 8.2 => { # CSb7-a + Name => 'FineTuneOptMatrixMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.1 => { # CSb7-b + Name => 'FineTuneOptCenterWeighted', + Mask => 0xf0, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.2 => { # CSb7-c + Name => 'FineTuneOptSpotMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 10.1 => { # CSf2-a + Name => 'MultiSelectorShootMode', + Mask => 0xe0, + PrintConv => { + 0 => 'Select Center Focus Point (Reset)', + 1 => 'Zoom On/Off', # this is the documented (and actual) default value, but the choice does not appear on the camera menu + 2 => 'Preset Focus Point (Pre)', + 4 => 'Not Used (None)', + }, + }, +# 10.2 => { # CSf2-b # moved from the D500 position to Nikon_ShotInfoD5_0x0ab1 with the Mask and PrintConv as specified below. Further research required. +# Name => 'MultiSelectorPlaybackMode', +# Mask => 0x70, +# PrintConv => { +# 0 => 'Zoom On/Off', +# 1 => 'Choose Folder', +# 6 => 'Thumbnail On/Off', +# 7 => 'View Histograms', +# }, +# }, + 10.3 => { # CSf5 + Name => 'MultiSelector', + Mask => 0x01, + PrintConv => { + 0 => 'Do Nothing', + 1 => 'Reset Meter-off Delay', + }, + }, + 11.1 => { # CSd5 + Name => 'ExposureDelayMode', + Mask => 0xc0, + PrintConv => { + 0 => 'Off', + 1 => '1 s', + 2 => '2 s', + 3 => '3 s', + }, + }, + 11.2 => { # CSd1 + Name => 'CLModeShootingSpeed', + Mask => 0x0f, + PrintConv => '"$val fps"', + PrintConvInv => '$val=~s/\s*fps//i; $val', + }, + 12.1 => { # CSd2 + Name => 'MaxContinuousRelease', + # values: 1-100 + }, + 13.1 => { # CSe7 + Name => 'AutoBracketOrder', + Mask => 0x10, + PrintConv => { + 0 => '0,-,+', + 1 => '-,0,+', + }, + }, + 13.2 => { # CSe6 + Name => 'AutoBracketModeM', + Mask => 0x0c, + PrintConv => { + 0 => 'Flash/Speed', + 1 => 'Flash/Speed/Aperture', + 2 => 'Flash/Aperture', + 3 => 'Flash Only', + }, + }, + 14.1 => { # CSf1-c + Name => 'Func1Button', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 19 => 'Grid Display', + 20 => 'My Menu', + 21 => 'Disable Synchronized Release', + 22 => 'Remote Release Only', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + 58 => 'AF-Area Mode + AF-On (Group Area AF - HL)', + 59 => 'AF-Area Mode + AF-On (Group Area AF - VL)', + }, + }, + 15.1 => { # CSf1-a + Name => 'PreviewButton', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 19 => 'Grid Display', + 20 => 'My Menu', + 21 => 'Disable Synchronized Release', + 22 => 'Remote Release Only', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + 58 => 'AF-Area Mode + AF-On (Group Area AF - HL)', + 59 => 'AF-Area Mode + AF-On (Group Area AF - VL)', + }, + }, + 16.1 => { # CSf1-p + Name => 'AssignBktButton', + Mask => 0x07, + PrintConv => { + 0 => 'Auto Bracketing', + 1 => 'Multiple Exposure', + 2 => 'HDR (high dynamic range)', + 3 => 'None', + }, + }, + 18.1 => { # CSf4-b + Name => 'CommandDialsChangeMainSub', + Mask => 0xe0, + PrintConv => { + 0 => 'Autofocus Off, Exposure Off', + 1 => 'Autofocus Off, Exposure On', + 2 => 'Autofocus Off, Exposure On (Mode A)', + 4 => 'Autofocus On, Exposure Off', + 5 => 'Autofocus On, Exposure On', + 6 => 'Autofocus On, Exposure On (Mode A)', + }, + }, + 18.2 => { # CSf4-d + Name => 'CommandDialsMenuAndPlayback', + Mask => 0x18, + PrintConv => { + 0 => 'On', + 1 => 'Off', + 2 => 'On (Image Review Excluded)', + }, + }, + 18.3 => { # CSf4-c + Name => 'CommandDialsApertureSetting', + Mask => 0x04, + PrintConv => { + 0 => 'Sub-command Dial', + 1 => 'Aperture Ring', + }, + }, + 18.4 => { # CSf6 + Name => 'ReleaseButtonToUseDial', + Mask => 0x01, + PrintConv => \%noYes, + }, + 19.1 => { # CSc2 + Name => 'StandbyTimer', + Mask => 0xf0, + PrintConv => { + 0 => '4 s', + 1 => '6 s', + 3 => '10 s', + 5 => '30 s', + 6 => '1 min', + 7 => '5 min', + 8 => '10 min', + 9 => '30 min', + 10 => 'No Limit', + }, + }, + 20.1 => { # CSc3-a + Name => 'SelfTimerTime', + Mask => 0xc0, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 20.2 => { # CSc3-c + Name => 'SelfTimerShotInterval', + Mask => 0x30, + PrintConv => { + 0 => '0.5 s', + 1 => '1 s', + 2 => '2 s', + 3 => '3 s', + }, + }, + 20.3 => { # CSc3-b + Name => 'SelfTimerShotCount', + Mask => 0x0f, + }, + 21.1 => { # CSc4-d + Name => 'ImageReviewMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '2 s', + 1 => '4 s', + 3 => '10 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 21.2 => { # CSc4-e + Name => 'LiveViewMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 1 => '5 min', + 2 => '10 min', + 3 => '15 min', + 4 => '20 min', + 5 => '30 min', + 6 => 'No Limit', + }, + }, + 22.1 => { # CSc4-b + Name => 'MenuMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 2 => '10 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 22.2 => { # CSc4-c + Name => 'ShootingInfoMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 0 => '4 s', + 2 => '10 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 23.1 => { # CSe1 + Name => 'FlashSyncSpeed', + Mask => 0xf0, + PrintConv => { + 2 => '1/250 s (auto FP)', + 3 => '1/250 s', + 5 => '1/200 s', + 6 => '1/160 s', + 7 => '1/125 s', + 8 => '1/100 s', + 9 => '1/80 s', + 10 => '1/60 s', + }, + }, + 23.2 => { # CSe2 + Name => 'FlashShutterSpeed', + Mask => 0x0f, + PrintConvColumns => 2, + PrintConv => { + 0 => '1/60 s', + 1 => '1/30 s', + 2 => '1/15 s', + 3 => '1/8 s', + 4 => '1/4 s', + 5 => '1/2 s', + 6 => '1 s', + 7 => '2 s', + 8 => '4 s', + 9 => '8 s', + 10 => '15 s', + 11 => '30 s', + }, + }, + 31.1 => { # CSe5 + Name => 'ModelingFlash', + Mask => 0x20, + PrintConv => \%onOff, + }, + 36.1 => { # CSc4-a + Name => 'PlaybackMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 37.1 => { # CSf2-c + Name => 'MultiSelectorLiveView', + Mask => 0xc0, + PrintConv => { + 0 => 'Reset', + 1 => 'Zoom', + 3 => 'Not Used', + }, + }, + 38.1 => { # CSf3-a + Name => 'ShutterSpeedLock', + Mask => 0x80, + PrintConv => \%offOn, + }, + 38.2 => { # CSf3-b + Name => 'ApertureLock', + Mask => 0x40, + PrintConv => \%offOn, + }, + 38.3 => { # CSg1-h + Name => 'MovieShutterButton', + Mask => 0x10, + PrintConv => { + 0 => 'Take Photo', + 1 => 'Record Movies', + }, + }, + 38.4 => { # CSe3 + Name => 'FlashExposureCompArea', + Mask => 0x04, + PrintConv => { + 0 => 'Entire Frame', + 1 => 'Background Only', + }, + }, + 38.5 => { # CSe4 + Name => 'AutoFlashISOSensitivity', + Mask => 0x02, + PrintConv => { + 0 => 'Subject and Background', + 1 => 'Subject Only', + }, + }, + 41.1 => { # CSg1-c + Name => 'MovieFunc1Button', + Mask => 0xf0, + PrintConv => { + 0 => 'None', + 2 => 'Power Aperture (close)', + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + 11 => 'Exposure Compensation -', + }, + }, + 41.2 => { # CSg1-a + Name => 'MoviePreviewButton', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Power Aperture (open)', + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + 10 => 'Exposure Compensation +', + }, + }, + 42.1 => { # CSf1-d + Name => 'Func1ButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 7 => 'Photo Shooting Menu Bank', + 8 => 'Exposure Delay Mode', + }, + }, + 43.1 => { # CSf1-b + Name => 'PreviewButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 7 => 'Photo Shooting Menu Bank', # new with D500 + 8 => 'Exposure Delay Mode', + }, + }, + 45.1 => { # CSf1-q + Name => 'AssignMovieRecordButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'Shutter Speed & Aperture Lock', + 7 => 'Photo Shooting Menu Bank', + 11 => 'Exposure Mode', + }, + }, + 46.1 => { # CSb7-d + Name => 'FineTuneOptHighlightWeighted', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 47.1 => { # CSa12-b + Name => 'DynamicAreaAFDisplay', + Mask => 0x80, + PrintConv => \%offOn, + }, + 47.2 => { # CSa12-a + Name => 'AFPointIllumination', + Mask => 0x40, + PrintConv => { + 0 => 'Off', + 1 => 'On During Manual Focusing', + }, + }, + 47.3 => { # CSa7 + Name => 'StoreByOrientation', + Mask => 0x18, + PrintConv => { + 0 => 'Off', + 1 => 'Focus Point', + 2 => 'Focus Point and AF-area Mode', + }, + }, + 48.1 => { # CSb5 + Name => 'MatrixMetering', + Mask => 0x80, + PrintConv => { + 0 => 'Face Detection On', + 1 => 'Face Detection Off', + }, + }, + 48.2 => { # CSf8 + Name => 'LiveViewButtonOptions', + Mask => 0x30, + PrintConv => { + 0 => 'Enable', + 1 => 'Enable (Standby Timer Active)', # new with D500 + 2 => 'Disable', + }, + }, + 48.3 => { # CSa10 + Name => 'AFModeRestrictions', + Mask => 0x03, + PrintConv => { + 0 => 'No Restrictions', + 1 => 'AF-C', + 2 => 'AF-S', + }, + }, + 49.1 => { # CSa9 + Name => 'LimitAFAreaModeSelection', + Mask => 0x7e, + PrintConv => { + 0 => 'No Restrictions', + BITMASK => { + 0 => 'Auto-area', + 1 => 'Group-area', + 2 => '3D-tracking', + 3 => 'Dynamic area (153 points)', + 4 => 'Dynamic area (72 points)', + 5 => 'Dynamic area (25 points)', + }, + }, + }, + 52.1 => { # CSf1-r + Name => 'LensFocusFunctionButtons', + Mask => 0x3f, + PrintConv => { + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 24 => 'Preset Focus Point', + 26 => 'Flash Disable/Enable', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + }, + }, + 66.1 => { # CSf1-o + Name => 'VerticalMultiSelector', + Mask => 0xff, + PrintHex => 1, + PrintConv => { + 0x00 => 'Same as Multi-Selector with Info(U/D) & Playback(R/L)', + 0x08 => 'Same as Multi-Selector with Info(R/L) & Playback(U/D)', + 0x80 => 'Focus Point Selection', + }, + }, + 67.1 => { # CSf1-g + Name => 'VerticalFuncButton', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 18 => 'Reset Focus Point', + 19 => 'Grid Display', + 20 => 'My Menu', + 22 => 'Remote Release Only', + 23 => 'Preset Focus Point', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + 54 => 'Highlight Active Focus Point', + }, + }, + 68.1 => { # CSf1-h + Name => 'VerticalFuncPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 7 => 'Photo Shooting Menu Bank', + 8 => 'Exposure Delay Mode', + 10 => 'ISO Sensitivity', + 11 => 'Exposure Mode', + 12 => 'Exposure Compensation', + 13 => 'Metering', + }, + }, + 70.1 => { # CSf1-j + Name => 'AF-OnButton', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + }, + }, + 71.1 => { # CSf1-k + Name => 'SubSelector', + Mask => 0x80, + PrintConv => { + 0 => 'Focus Point Selection', + 1 => 'Same as MultiSelector', + }, + }, + 72.1 => { # CSf1-l + Name => 'SubSelectorCenter', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 18 => 'Reset Focus Point', + 19 => 'Grid Display', + 20 => 'My Menu', + 22 => 'Remote Release Only', + 23 => 'Preset Focus Point', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + 54 => 'Highlight Active Focus Point', + }, + }, + 73.1 => { # CSf1-m + Name => 'SubSelectorPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'Shutter Speed & Aperture Lock', + 4 => 'Choose Non-CPU Lens Number', + 7 => 'Photo Shooting Menu Bank', + }, + }, + 74.1 => { # CSg1-f + Name => 'AssignMovieSubselector', + Mask => 0xf0, + PrintConv => { + 0 => 'None', + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + 5 => 'AE/AF Lock', + 6 => 'AE Lock (Only)', + 7 => 'AE Lock (Hold)', + 8 => 'AF Lock (Only)', + }, + }, + 75.1 => { # CSg1-d + Name => 'AssignMovieFunc1ButtonPlusDials', + Mask => 0x10, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + }, + }, + 75.2 => { # CSg1-b + Name => 'AssignMoviePreviewButtonPlusDials', + Mask => 0x01, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (DX/1.3x)', + }, + }, + 76.1 => { # CSg1-g + Name => 'AssignMovieSubselectorPlusDials', + Mask => 0x10, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + }, + }, + 77.1 => { # CSd4 + Name => 'SyncReleaseMode', # new with D500 + Mask => 0x80, + PrintConv => { + 0 => 'No Sync', + 1 => 'Sync', + }, + }, + 78.1 => { # CSa5 + Name => 'Three-DTrackingWatchArea', # new with D500 + Mask => 0x80, + PrintConv => { + 0 => 'Wide', + 1 => 'Normal', + }, + }, + 78.2 => { # CSa3-b + Name => 'SubjectMotion', + Mask => 0x60, + PrintConv => { + 0 => 'Steady', + 1 => 'Middle', + 2 => 'Erratic', + }, + }, + 78.3 => { # CSa8 + Name => 'AFActivation', + Mask => 0x08, + PrintConv => { + 0 => 'Shutter/AF-On', + 1 => 'AF-On Only', + }, + }, + 78.4 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'On (Half Press)', + 2 => 'On (Burst Mode)' + }, + }, + 79.1 => { # CSf1-n + Name => 'VerticalAFOnButton', + Mask => 0x7f, + PrintConv => { + 0 => 'None', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 100 => 'Same as AF-On', + }, + }, + 80.1 => { # CSf1-e + Name => 'Func2Button', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 19 => 'Grid Display', + 20 => 'My Menu', + 21 => 'Disable Synchronized Release', + 22 => 'Remote Release Only', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + }, + }, + 81.1 => { # CSf1-f + Name => 'Func2ButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 7 => 'Photo Shooting Menu Bank', + 8 => 'Exposure Delay Mode', + }, + }, + 82.1 => { # CSg1-e + Name => 'AssignMovieFunc2Button', + Mask => 0x70, + PrintConv => { + 0 => 'None', + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + }, + }, + 83.1 => { # CSf1-i + Name => 'Func3Button', + Mask => 0x03, + PrintConv => { + 0 => 'None', + 1 => 'Voice Memo', + 2 => 'Rating', + 3 => 'Connect To Network', + }, + }, +); + +# D500 custom settings (ref 1) +%Image::ExifTool::NikonCustom::SettingsD500 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D500.', + 0.1 => { + Name => 'CustomSettingsBank', + Mask => 0x03, + PrintConv => { + 0 => 'A', + 1 => 'B', + 2 => 'C', + 3 => 'D', + }, + }, + 1.1 => { # CSa1 + Name => 'AF-CPrioritySelection', + Mask => 0xc0, + PrintConv => { + 0 => 'Release', + 1 => 'Release + Focus', + 2 => 'Focus', + 3 => 'Focus + Release', + }, + }, + 1.2 => { # CSa2 + Name => 'AF-SPrioritySelection', + Mask => 0x20, + PrintConv => { + 0 => 'Focus', + 1 => 'Release', + }, + }, + 1.3 => { # CSa6 + Name => 'NumberOfFocusPoints', + Mask => 0x10, + PrintConv => { + 0 => '55 Points', + 1 => '15 Points', + }, + }, + 1.4 => { # CSa4 + Name => 'Three-DTrackingFaceDetection', + Mask => 0x08, + PrintConv => \%offOn, + }, + 1.5 => { # CSa3-a + Name => 'BlockShotAFResponse', + Mask => 0x07, + #values 1-5 + }, + 2.1 => { # CSa11 + Name => 'FocusPointWrap', + Mask => 0x08, + PrintConv => { + 0 => 'No Wrap', + 1 => 'Wrap', + }, + }, + 2.2 => { # CSa12-c + Name => 'AFPointBrightness', + Mask => 0x06, + PrintConv => { + 0 => 'Auto', + 1 => 'On', + 2 => 'Off', + }, + }, + 4.1 => { # CSd3 + Name => 'ISODisplay', + Mask => 0x08, + PrintConv => { + 0 => 'Show ISO Sensitivity', + 1 => 'Show Frame Count', + }, + }, + 4.2 => { # CSd8 + Name => 'GridDisplay', + Mask => 0x02, + PrintConv => \%onOff, + }, + 5.1 => { # CSd9 + Name => 'LCDIllumination', + Mask => 0x20, + PrintConv => \%offOn, + }, + 5.2 => { # CSd6 + Name => 'ElectronicFront-CurtainShutter', + Mask => 0x08, + PrintConv => \%offOn, + }, + 6.1 => { # CSf7 + Name => 'ReverseIndicators', + Mask => 0x80, + PrintConv => { + 0 => '+ 0 -', + 1 => '- 0 +', + }, + }, + 6.2 => { # CSf4-a + Name => 'CommandDialsReverseRotation', + Mask => 0x18, + PrintConv => { + 0 => 'No', + 1 => 'Shutter Speed & Aperture', + 2 => 'Exposure Compensation', + 3 => 'Exposure Compensation, Shutter Speed & Aperture', + }, + }, + 6.3 => { # CSb4 + Name => 'EasyExposureCompensation', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On (auto reset)', + }, + }, + 7.1 => { # CSb2 + Name => 'ExposureControlStepSize', + Mask => 0xc0, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 7.2 => { # CSb1 + Name => 'ISOStepSize', + Mask => 0x30, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 7.3 => { # CSb3 + Name => 'ExposureCompStepSize', + Mask => 0x0c, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 8.1 => { # CSb6 + Name => 'CenterWeightedAreaSize', + Mask => 0xe0, + PrintConv => { + 0 => '6 mm', + 1 => '8 mm', + 2 => '10 mm', + 3 => '13 mm', + 4 => 'Average', + }, + }, + 8.2 => { # CSb7-a + Name => 'FineTuneOptMatrixMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.1 => { # CSb7-b + Name => 'FineTuneOptCenterWeighted', + Mask => 0xf0, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.2 => { # CSb7-c + Name => 'FineTuneOptSpotMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 10.1 => { # CSf2-a + Name => 'MultiSelectorShootMode', + Mask => 0xe0, #same offset and settings as D810 but with a different decoding + PrintConv => { + 0 => 'Select Center Focus Point (Reset)', + 2 => 'Preset Focus Point (Pre)', + 3 => 'Highlight Active Focus Point', + 4 => 'Not Used (None)', + }, + }, + 10.2 => { # CSf2-b #same offset and settings as D810 but with a different decoding + Name => 'MultiSelectorPlaybackMode', + Mask => 0x0c, + PrintConv => { + 0 => 'Thumbnail On/Off', + 1 => 'View Histograms', + 2 => 'Zoom On/Off', + 3 => 'Choose Folder', + }, + }, + 10.3 => { # CSf5 + Name => 'MultiSelector', + Mask => 0x01, + PrintConv => { + 0 => 'Do Nothing', + 1 => 'Reset Meter-off Delay', + }, + }, + 11.1 => { # CSd5 + Name => 'ExposureDelayMode', + Mask => 0xc0, + PrintConv => { + 0 => 'Off', + 1 => '1 s', + 2 => '2 s', + 3 => '3 s', + }, + }, + 11.2 => { # CSd1 + Name => 'CLModeShootingSpeed', + Mask => 0x0f, + PrintConv => '"$val fps"', + PrintConvInv => '$val=~s/\s*fps//i; $val', + }, + 12.1 => { # CSd2 + Name => 'MaxContinuousRelease', + # values: 1-100 + }, + 13.1 => { # CSe7 + Name => 'AutoBracketOrder', + Mask => 0x10, + PrintConv => { + 0 => '0,-,+', + 1 => '-,0,+', + }, + }, + 13.2 => { # CSe6 + Name => 'AutoBracketModeM', + Mask => 0x0c, + PrintConv => { + 0 => 'Flash/Speed', + 1 => 'Flash/Speed/Aperture', + 2 => 'Flash/Aperture', + 3 => 'Flash Only', + }, + }, + 14.1 => { # CSf1-c + Name => 'Func1Button', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 19 => 'Grid Display', + 20 => 'My Menu', + 22 => 'Remote Release Only', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + }, + }, + 15.1 => { # CSf1-a + Name => 'PreviewButton', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 19 => 'Grid Display', + 20 => 'My Menu', +# 21 => 'Disable Synchronized Release', # removed with D500 + 22 => 'Remote Release Only', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', + 36 => 'AF-Area Mode (Single)', # new with D500 + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', # new with D500 + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', # new with D500 + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', # new with D500 + 40 => 'AF-Area Mode (Group Area AF)', # new with D500 + 41 => 'AF-Area Mode (Auto Area AF)', # new with D500 + 42 => 'AF-Area Mode + AF-On (Single)', # new with D500 + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', # new with D500 + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', # new with D500 + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)',# new with D500 + 46 => 'AF-Area Mode + AF-On (Group Area AF)', # new with D500 + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', # new with D500 + 49 => 'Sync Release (Master Only)', # new with D500 + 50 => 'Sync Release (Remote Only)', # new with D500 + }, + }, + 16.1 => { # CSf1-j + Name => 'AssignBktButton', + Mask => 0x07, + PrintConv => { + 0 => 'Auto Bracketing', + 1 => 'Multiple Exposure', + 2 => 'HDR (high dynamic range)', + 3 => 'None', + }, + }, + 18.1 => { # CSf4-b + Name => 'CommandDialsChangeMainSub', + Mask => 0xe0, + PrintConv => { + 0 => 'Autofocus Off, Exposure Off', + 1 => 'Autofocus Off, Exposure On', + 2 => 'Autofocus Off, Exposure On (Mode A)', + 4 => 'Autofocus On, Exposure Off', + 5 => 'Autofocus On, Exposure On', + 6 => 'Autofocus On, Exposure On (Mode A)', + }, + }, + 18.2 => { # CSf4-d + Name => 'CommandDialsMenuAndPlayback', + Mask => 0x18, + PrintConv => { + 0 => 'On', + 1 => 'Off', + 2 => 'On (Image Review Excluded)', + }, + }, + 18.3 => { # CSf4-c + Name => 'CommandDialsApertureSetting', + Mask => 0x04, + PrintConv => { + 0 => 'Sub-command Dial', + 1 => 'Aperture Ring', + }, + }, + 18.4 => { # CSf6 + Name => 'ReleaseButtonToUseDial', + Mask => 0x01, + PrintConv => \%noYes, + }, + 19.1 => { # CSc2 + Name => 'StandbyTimer', + Mask => 0xf0, + PrintConv => { + 0 => '4 s', + 1 => '6 s', + 3 => '10 s', + 5 => '30 s', + 6 => '1 min', + 7 => '5 min', + 8 => '10 min', + 9 => '30 min', + 10 => 'No Limit', + }, + }, + 20.1 => { # CSc3-a + Name => 'SelfTimerTime', + Mask => 0xc0, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 20.2 => { # CSc3-c + Name => 'SelfTimerShotInterval', + Mask => 0x30, + PrintConv => { + 0 => '0.5 s', + 1 => '1 s', + 2 => '2 s', + 3 => '3 s', + }, + }, + 20.3 => { # CSc3-b + Name => 'SelfTimerShotCount', + Mask => 0x0f, + }, + 21.1 => { # CSc4-d + Name => 'ImageReviewMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '2 s', + 1 => '4 s', + 3 => '10 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 21.2 => { # CSc4-e + Name => 'LiveViewMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 1 => '5 min', + 2 => '10 min', + 3 => '15 min', + 4 => '20 min', + 5 => '30 min', + 6 => 'No Limit', + }, + }, + 22.1 => { # CSc4-b + Name => 'MenuMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 2 => '10 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 22.2 => { # CSc4-c + Name => 'ShootingInfoMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 0 => '4 s', + 2 => '10 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 23.1 => { # CSe1 + Name => 'FlashSyncSpeed', + Mask => 0xf0, + PrintConv => { + 2 => '1/250 s (auto FP)', + 3 => '1/250 s', + 5 => '1/200 s', + 6 => '1/160 s', + 7 => '1/125 s', + 8 => '1/100 s', + 9 => '1/80 s', + 10 => '1/60 s', + }, + }, + 23.2 => { # CSe2 + Name => 'FlashShutterSpeed', + Mask => 0x0f, + PrintConvColumns => 2, + PrintConv => { + 0 => '1/60 s', + 1 => '1/30 s', + 2 => '1/15 s', + 3 => '1/8 s', + 4 => '1/4 s', + 5 => '1/2 s', + 6 => '1 s', + 7 => '2 s', + 8 => '4 s', + 9 => '8 s', + 10 => '15 s', + 11 => '30 s', + }, + }, + 31.1 => { # CSe5 + Name => 'ModelingFlash', + Mask => 0x20, + PrintConv => \%onOff, + }, + 36.1 => { # CSc4-a + Name => 'PlaybackMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 37.1 => { # CSf2-c + Name => 'MultiSelectorLiveView', + Mask => 0xc0, + PrintConv => { + 0 => 'Reset', + 1 => 'Zoom', + 3 => 'Not Used', + }, + }, + 38.1 => { # CSf3-a + Name => 'ShutterSpeedLock', + Mask => 0x80, + PrintConv => \%offOn, + }, + 38.2 => { # CSf3-b + Name => 'ApertureLock', + Mask => 0x40, + PrintConv => \%offOn, + }, + 38.3 => { # CSg1-h + Name => 'MovieShutterButton', + Mask => 0x10, + PrintConv => { + 0 => 'Take Photo', + 1 => 'Record Movies', + }, + }, + 38.4 => { # CSe3 + Name => 'FlashExposureCompArea', + Mask => 0x04, + PrintConv => { + 0 => 'Entire Frame', + 1 => 'Background Only', + }, + }, + 38.5 => { # CSe4 + Name => 'AutoFlashISOSensitivity', + Mask => 0x02, + PrintConv => { + 0 => 'Subject and Background', + 1 => 'Subject Only', + }, + }, + 41.1 => { # CSg1-c + Name => 'MovieFunc1Button', + Mask => 0xf0, + PrintConv => { + 0 => 'None', + 2 => 'Power Aperture (close)', + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + 11 => 'Exposure Compensation -', + }, + }, + 41.2 => { # CSg1-a + Name => 'MoviePreviewButton', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Power Aperture (open)', + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + 10 => 'Exposure Compensation +', + }, + }, + 42.1 => { # CSf1-d + Name => 'Func1ButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (DX/1.3x)', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 7 => 'Photo Shooting Menu Bank', + 8 => 'Exposure Delay Mode', + }, + }, + 43.1 => { # CSf1-b + Name => 'PreviewButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (DX/1.3x)', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 7 => 'Photo Shooting Menu Bank', # new with D500 + 8 => 'Exposure Delay Mode', + }, + }, + 45.1 => { # CSf1-k + Name => 'AssignMovieRecordButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (DX/1.3x)', + 2 => 'Shutter Speed & Aperture Lock', + 7 => 'Photo Shooting Menu Bank', + 11 => 'Exposure Mode', + }, + }, + 46.1 => { # CSb7-d + Name => 'FineTuneOptHighlightWeighted', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 47.1 => { # CSa12-b + Name => 'DynamicAreaAFDisplay', + Mask => 0x80, + PrintConv => \%offOn, + }, + 47.2 => { # CSa12-a + Name => 'AFPointIllumination', + Mask => 0x40, + PrintConv => { + 0 => 'Off', + 1 => 'On During Manual Focusing', + }, + }, + 47.3 => { # CSa7 + Name => 'StoreByOrientation', + Mask => 0x18, + PrintConv => { + 0 => 'Off', + 1 => 'Focus Point', + 2 => 'Focus Point and AF-area Mode', + }, + }, + 47.4 => { # CSa12-c + Name => 'GroupAreaAFIllumination', + Mask => 0x04, + PrintConv => { + 0 => 'Squares', + 1 => 'Dots', + }, + }, + 48.1 => { # CSb5 + Name => 'MatrixMetering', + Mask => 0x80, + PrintConv => { + 0 => 'Face Detection On', + 1 => 'Face Detection Off', + }, + }, + 48.2 => { # CSf8 + Name => 'LiveViewButtonOptions', + Mask => 0x30, + PrintConv => { + 0 => 'Enable', + 1 => 'Enable (Standby Timer Active)', # new with D500 + 2 => 'Disable', + }, + }, + 48.3 => { # CSa10 + Name => 'AFModeRestrictions', + Mask => 0x03, + PrintConv => { + 0 => 'No Restrictions', + 1 => 'AF-C', + 2 => 'AF-S', + }, + }, + 49.1 => { # CSa9 + Name => 'LimitAFAreaModeSelection', + Mask => 0x7e, + PrintConv => { + 0 => 'No Restrictions', + BITMASK => { + 0 => 'Auto-area', + 1 => 'Group-area', + 2 => '3D-tracking', + 3 => 'Dynamic area (153 points)', + 4 => 'Dynamic area (72 points)', + 5 => 'Dynamic area (25 points)', + }, + }, + }, + 52.1 => { # CSf1-l + Name => 'LensFocusFunctionButtons', + Mask => 0x3f, + PrintConv => { + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 24 => 'Preset Focus Point', + 26 => 'Flash Disable/Enable', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + }, + }, + 66.1 => { # CSf10-d + Name => 'VerticalMultiSelector', + Mask => 0xff, + PrintHex => 1, + PrintConv => { + 0x00 => 'Same as Multi-Selector with Info(U/D) & Playback(R/L)', + 0x08 => 'Same as Multi-Selector with Info(R/L) & Playback(U/D)', + 0x80 => 'Focus Point Selection', + }, + }, + 67.1 => { # CSf10-a + Name => 'AssignMB-D17FuncButton', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 18 => 'Reset Focus Point', + 19 => 'Grid Display', + 20 => 'My Menu', + 22 => 'Remote Release Only', + 23 => 'Preset Focus Point', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + 54 => 'Highlight Active Focus Point', + }, + }, + 68.1 => { # CSf10-b + Name => 'AssignMB-D17FuncButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (DX/1.3x)', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 7 => 'Photo Shooting Menu Bank', + 8 => 'Exposure Delay Mode', + 10 => 'ISO Sensitivity', + 11 => 'Exposure Mode', + 12 => 'Exposure Compensation', + 13 => 'Metering Mode', + }, + }, + 70.1 => { # CSf1-f + Name => 'AF-OnButton', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + }, + }, + 71.1 => { # CSf1-g + Name => 'SubSelector', + Mask => 0x80, + PrintConv => { + 0 => 'Focus Point Selection', + 1 => 'Same as MultiSelector', + }, + }, + 72.1 => { # CSf1-h + Name => 'SubSelectorCenter', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 18 => 'Reset Focus Point', + 19 => 'Grid Display', + 20 => 'My Menu', + 22 => 'Remote Release Only', + 23 => 'Preset Focus Point', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + 54 => 'Highlight Active Focus Point', + }, + }, + 73.1 => { # CSf1-i + Name => 'SubSelectorPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (DX/1.3x)', + 2 => 'Shutter Speed & Aperture Lock', + 4 => 'Choose Non-CPU Lens Number', + 7 => 'Photo Shooting Menu Bank', + }, + }, + 74.1 => { # CSg1-f + Name => 'AssignMovieSubselector', + Mask => 0xf0, + PrintConv => { + 0 => 'None', + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + 5 => 'AE/AF Lock', + 6 => 'AE Lock (Only)', + 7 => 'AE Lock (Hold)', + 8 => 'AF Lock (Only)', + }, + }, + 75.1 => { # CSg1-d + Name => 'AssignMovieFunc1ButtonPlusDials', + Mask => 0x10, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (DX/1.3x)', + }, + }, + 75.2 => { # CSg1-b + Name => 'AssignMoviePreviewButtonPlusDials', + Mask => 0x01, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (DX/1.3x)', + }, + }, + 76.1 => { # CSg1-g + Name => 'AssignMovieSubselectorPlusDials', + Mask => 0x10, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (DX/1.3x)', + }, + }, + 77.1 => { # CSd4 + Name => 'SyncReleaseMode', # new with D500 + Mask => 0x80, + PrintConv => { + 0 => 'No Sync', + 1 => 'Sync', + }, + }, + 78.1 => { # CSa5 + Name => 'Three-DTrackingWatchArea', # new with D500 + Mask => 0x80, + PrintConv => { + 0 => 'Wide', + 1 => 'Normal', + }, + }, + 78.2 => { # CSa3-b + Name => 'SubjectMotion', + Mask => 0x60, + PrintConv => { + 0 => 'Steady', + 1 => 'Middle', + 2 => 'Erratic', + }, + }, + 78.3 => { # CSa8 + Name => 'AFActivation', + Mask => 0x08, + PrintConv => { + 0 => 'Shutter/AF-On', + 1 => 'AF-On Only', + }, + }, + 78.4 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'On (Half Press)', + 2 => 'On (Burst Mode)' + }, + }, + 79.1 => { # CSf10-c + Name => 'AssignMB-D17AF-OnButton', + Mask => 0x7f, + PrintConv => { + 0 => 'None', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 152 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 152 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 100 => 'Same as Camera AF-On Button', + }, + }, + 80.1 => { # CSf1-e + Name => 'Func2Button', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 15 => 'My Menu Top Item', + 20 => 'My Menu', + 55 => 'Rating', + }, + }, + 82.1 => { # CSg1-e + Name => 'AssignMovieFunc2Button', + Mask => 0x70, + PrintConv => { + 0 => 'None', + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + }, + }, +); + +# D610 custom settings (ref forum6942) +%Image::ExifTool::NikonCustom::SettingsD610 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D610.', + 0.1 => { #CSa1 + Name => 'AF-CPrioritySelection', + Mask => 0x80, + PrintConv => { + 0 => 'Release', + 1 => 'Focus', + }, + }, + 0.2 => { #CSa2 + Name => 'AF-SPrioritySelection', + Mask => 0x20, + PrintConv => { + 0 => 'Release', + 1 => 'Focus', + }, + }, + 0.3 => { # CSa6 + Name => 'NumberOfFocusPoints', + Mask => 0x10, + PrintConv => { + 0 => '39 Points', + 1 => '11 Points', + }, + }, + 0.4 => { # CSa3 + Name => 'FocusTrackingLockOn', + Mask => 0x07, + PrintConv => { + 0 => 'Off', + 1 => '1 Short', + 2 => '2', + 3 => '3 Normal', + 4 => '4', + 5 => '5 Long', + }, + }, + 1.1 => { # CSa5 + Name => 'FocusPointWrap', + Mask => 0x08, + PrintConv => { + 0 => 'No Wrap', + 1 => 'Wrap', + }, + }, + 1.2 => { # CSa4 + Name => 'AFPointIllumination', + Mask => 0x06, + PrintConv => { + 0 => 'Auto', + 1 => 'On', + 2 => 'Off', + }, + }, + 1.3 => { # CSa7 + Name => 'AFAssist', + Mask => 0x01, + PrintConv => \%onOff, + }, + 5.1 => { # CSb3 + Name => 'EasyExposureCompensation', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On Auto Reset', + }, + }, + 6.1 => { # CSb2 + Name => 'ExposureControlStep', + Mask => 0x40, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + }, + }, + 6.2 => { # CSb1 + Name => 'ISOSensitivityStep', + Mask => 0x10, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + }, + }, + 7.1 => { # CSb4 + Name => 'CenterWeightedAreaSize', + Mask => 0xe0, + PrintConv => { + 0 => '8 mm', + 1 => '12 mm', + 2 => '15 mm', + 3 => '20 mm', + 4 => 'Average', + }, + }, + 7.2 => { # CSb5-a + Name => 'FineTuneOptMatrixMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 8.1 => { # CSb5-b + Name => 'FineTuneOptCenterWeighted', + Mask => 0xf0, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 8.2 => { # CSb5-c + Name => 'FineTuneOptSpotMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 17.1 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + Mask => 0x02, + PrintConv => \%offOn, + }, + 18.1 => { # CSc2 + Name => 'StandbyTimer', + Mask => 0xf0, + PrintConv => { + 0 => '4 s', + 1 => '6 s', + 2 => '10 s', + 3 => '30 s', + 4 => '1 min', + 5 => '5 min', + 6 => '10 min', + 7 => '30 min', + 8 => 'No Limit', + }, + }, + 18.2 => { # CSc5 + Name => 'RemoteOnDuration', + Mask => 0x03, + PrintConv => { + 0 => '1 min', + 1 => '5 min', + 2 => '10 min', + 3 => '20 min', + }, + }, + 19.1 => { # CSc3-a + Name => 'SelfTimerTime', + Mask => 0xc0, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 19.2 => { # CSc3-c + Name => 'SelfTimerShotInterval', + Mask => 0x30, + PrintConv => { + 0 => '0.5 s', + 1 => '1 s', + 2 => '2 s', + 3 => '3 s', + }, + }, + 19.3 => { # CSc3-b + Name => 'SelfTimerShotCount', + Mask => 0x0f, + }, + 20.1 => { # CSc4-d + Name => 'ImageReviewMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '2 s', + 1 => '4 s', + 2 => '10 s', + 3 => '20 s', + 4 => '1 min', + 5 => '5 min', + 6 => '10 min', + }, + }, + 20.2 => { # CSc4-e + Name => 'LiveViewMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 0 => '5 min', + 1 => '10 min', + 2 => '15 min', + 3 => '20 min', + 4 => '30 min', + 5 => 'No Limit', + }, + }, + 21.1 => { # CSc4-b + Name => 'MenuMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', # default + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 21.2 => { # CSc4-c + Name => 'ShootingInfoMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 0 => '4 s', + 1 => '10 s', # default + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 35.1 => { # CSc4-a + Name => 'PlaybackMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, +); + +# D810 custom settings (ref 1) +%Image::ExifTool::NikonCustom::SettingsD810 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + DATAMEMBER => [ 24.1 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D810.', + 0.1 => { # CSf1 + Name => 'LightSwitch', + Mask => 0x08, + PrintConv => { + 0 => 'LCD Backlight', + 1 => 'LCD Backlight and Shooting Information', + }, + }, + 0.2 => { + Name => 'CustomSettingsBank', + Mask => 0x03, + PrintConv => { + 0 => 'A', + 1 => 'B', + 2 => 'C', + 3 => 'D', + }, + }, + 1.1 => { #CSa1 + Name => 'AF-CPrioritySelection', + Mask => 0xc0, + PrintConv => { + 0 => 'Release', + 1 => 'Release + Focus', + 2 => 'Focus', + }, + }, + 1.2 => { # CSa2 + Name => 'AF-SPrioritySelection', + Mask => 0x20, + PrintConv => { + 0 => 'Focus', + 1 => 'Release', + }, + }, + 1.3 => { # CSa7 + Name => 'AFPointSelection', + Mask => 0x10, + PrintConv => { + 0 => '51 Points', + 1 => '11 Points', + }, + }, + 1.4 => { # CSa3 + Name => 'FocusTrackingLockOn', + Mask => 0x07, + PrintConv => { + 0 => 'Off', + 1 => '1 (Short)', + 2 => '2', + 3 => '3 (Normal)', + 4 => '4', + 5 => '5 (Long)', + }, + }, + 2.1 => { # CSa4 + Name => 'AFActivation', + Mask => 0x80, + PrintConv => { + 0 => 'Shutter/AF-On', + 1 => 'AF-On Only', + }, + }, + 2.2 => { # CSa7 + Name => 'FocusPointWrap', + Mask => 0x08, + PrintConv => { + 0 => 'No Wrap', + 1 => 'Wrap', + }, + }, + 2.3 => { # CSa6 + Name => 'AFPointBrightness', + Mask => 0x06, + PrintConv => { + 0 => 'Auto', + 1 => 'On', + 2 => 'Off', + }, + }, + 2.4 => { # CSa10 + Name => 'AFAssist', + Mask => 0x01, + PrintConv => \%onOff, + }, + 3.1 => { # CSd13 + Name => 'BatteryOrder', + Mask => 0x40, + PrintConv => { + 0 => 'MB-D12 First', + 1 => 'Camera Battery First', + }, + }, + 3.2 => { # CSd12 + Name => 'MB-D12BatteryType', + Mask => 0x03, + PrintConv => { + 0 => 'LR6 (AA alkaline)', + 1 => 'HR6 (AA Ni-MH)', + 2 => 'FR6 (AA lithium)', + }, + }, + 4.1 => { # CSd1-b + Name => 'Pitch', + Mask => 0x40, + PrintConv => { 0 => 'High', 1 => 'Low' }, + }, + 4.2 => { # CSf11 + Name => 'NoMemoryCard', + Mask => 0x20, + PrintConv => { + 0 => 'Release Locked', + 1 => 'Enable Release', + }, + }, + 4.3 => { # CSd8 + Name => 'ISODisplay', + Mask => 0x0c, + PrintConv => { + 0 => 'Show ISO/Easy ISO', + 1 => 'Show ISO Sensitivity', + 3 => 'Show Frame Count', + }, + }, + 4.4 => { # CSd7 + Name => 'GridDisplay', + Mask => 0x02, + PrintConv => \%onOff, + }, + 5.1 => { # CSd10 + Name => 'ShootingInfoDisplay', + Mask => 0xc0, + PrintConv => { + 0 => 'Not Set', # observed on a new camera prior to applying a setting for the first time + 1 => 'Auto', + 2 => 'Manual (dark on light)', + 3 => 'Manual (light on dark)', + }, + }, + 5.2 => { # CSd11 + Name => 'LCDIllumination', + Mask => 0x20, + PrintConv => \%offOn, + }, + 5.3 => { # CSd5 + Name => 'ElectronicFront-CurtainShutter', + Mask => 0x08, + PrintConv => \%offOn, + }, + 5.4 => { # CSd9 + Name => 'ScreenTips', + Mask => 0x04, + PrintConv => \%offOn, + }, + 5.5 => { # CSd1-a + Name => 'Beep', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Medium', + 3 => 'High', + }, + }, + 6.1 => { # CSf12 + Name => 'ReverseIndicators', + Mask => 0x80, + PrintConv => { + 0 => '+ 0 -', + 1 => '- 0 +', + }, + }, + 6.2 => { # CSf9-a + Name => 'CommandDialsReverseRotation', + Mask => 0x18, + PrintConv => { + 0 => 'No', + 1 => 'Shutter Speed & Aperture', + 2 => 'Exposure Compensation', + 3 => 'Exposure Compensation, Shutter Speed & Aperture', + }, + }, + 6.3 => { # CSb4 + Name => 'EasyExposureCompensation', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On (auto reset)', + }, + }, + 7.1 => { # CSb2 + Name => 'ExposureControlStepSize', + Mask => 0xc0, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 7.2 => { # CSb1 + Name => 'ISOStepSize', + Mask => 0x30, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 7.3 => { # CSb3 + Name => 'ExposureCompStepSize', + Mask => 0x0c, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 8.1 => { # CSb6 + Name => 'CenterWeightedAreaSize', + Mask => 0xe0, + PrintConv => { + 0 => '8 mm', + 1 => '12 mm', + 2 => '15 mm', + 3 => '20 mm', + 4 => 'Average', + }, + }, + 8.2 => { # CSb7-a + Name => 'FineTuneOptMatrixMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.1 => { # CSb7-b + Name => 'FineTuneOptCenterWeighted', + Mask => 0xf0, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.2 => { # CSb7-c + Name => 'FineTuneOptSpotMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 10.1 => { # CSf2-a + Name => 'MultiSelectorShootMode', + Mask => 0xc0, + PrintConv => { + 0 => 'Select Center Focus Point (Reset)', + 1 => 'Highlight Active Focus Point', + 2 => 'Preset Focus Point (Pre)', + 3 => 'Not Used (None)', + }, + }, + 10.2 => { # CSf2-b + Name => 'MultiSelectorPlaybackMode', + Mask => 0x30, + PrintConv => { + 0 => 'Thumbnail On/Off', + 1 => 'View Histograms', + 2 => 'Zoom On/Off', + 3 => 'Choose Folder', + }, + }, + 10.3 => { # CSf3 + Name => 'MultiSelector', + Mask => 0x01, + PrintConv => { + 0 => 'Do Nothing', + 1 => 'Reset Meter-off Delay', + }, + }, + 11.1 => { # CSd4 + Name => 'ExposureDelayMode', + Mask => 0xc0, + PrintConv => { + 0 => 'Off', + 1 => '1 s', + 2 => '2 s', + 3 => '3 s', + }, + }, + 11.2 => { # CSd2 + Name => 'CLModeShootingSpeed', + Mask => 0x0f, + PrintConv => '"$val fps"', + PrintConvInv => '$val=~s/\s*fps//i; $val', + }, + 12.1 => { # CSd3 + Name => 'MaxContinuousRelease', + # values: 1-100 + }, + 13.1 => { # CSe6 + Name => 'AutoBracketSet', + Mask => 0xe0, + PrintConv => { + 0 => 'AE & Flash', + 1 => 'AE Only', + 2 => 'Flash Only', + 3 => 'WB Bracketing', + 4 => 'Active D-Lighting', + }, + }, + 13.2 => { # CSe8 + Name => 'AutoBracketOrder', + Mask => 0x10, + PrintConv => { + 0 => '0,-,+', + 1 => '-,0,+', + }, + }, + 13.3 => { # CSe7 + Name => 'AutoBracketModeM', + Mask => 0x0c, + PrintConv => { + 0 => 'Flash/Speed', + 1 => 'Flash/Speed/Aperture', + 2 => 'Flash/Aperture', + 3 => 'Flash Only', + }, + }, + 14.1 => { # CSf4-a + Name => 'FuncButton', + Mask => 0x1f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 19 => 'Grid Display', # values 19 and 20 are swapped from the D4s encodings + 20 => 'My Menu', + 21 => 'Disable Synchronized Release', + 22 => 'Remote Release Only', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', # new value with D810 + }, + }, + 15.1 => { # CSf5-a + Name => 'PreviewButton', + Mask => 0x1f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 19 => 'Grid Display', # values 19 and 20 are swapped from the D4s encodings + 20 => 'My Menu', + 21 => 'Disable Synchronized Release', + 22 => 'Remote Release Only', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', # new value with D810 + }, + }, + 16.1 => { # CSf8 + Name => 'AssignBktButton', + Mask => 0x07, + PrintConv => { + 0 => 'Auto Bracketing', + 1 => 'Multiple Exposure', + 2 => 'HDR (high dynamic range)', + 3 => 'None', + }, + }, + 17.1 => { # CSf6-a + Name => 'AELockButton', + Mask => 0x1f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 19 => 'Grid Display', # values 19 and 20 are swapped from the D4s encodings + 20 => 'My Menu', + 21 => 'Disable Synchronized Release', + 22 => 'Remote Release Only', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', # new value with D810 + }, + }, + 18.1 => { # CSf9-b + Name => 'CommandDialsChangeMainSub', + Mask => 0xe0, + PrintConv => { + 0 => 'Autofocus Off, Exposure Off', + 1 => 'Autofocus Off, Exposure On', + 2 => 'Autofocus Off, Exposure On (Mode A)', + 4 => 'Autofocus On, Exposure Off', + 5 => 'Autofocus On, Exposure On', + 6 => 'Autofocus On, Exposure On (Mode A)', + }, + }, + 18.2 => { # CSf9-d + Name => 'CommandDialsMenuAndPlayback', + Mask => 0x18, + PrintConv => { + 0 => 'On', + 1 => 'Off', + 2 => 'On (Image Review Excluded)', + }, + }, + 18.3 => { # CSf9-c + Name => 'CommandDialsApertureSetting', + Mask => 0x04, + PrintConv => { + 0 => 'Sub-command Dial', + 1 => 'Aperture Ring', + }, + }, + 18.4 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + Mask => 0x02, + PrintConv => \%offOn, + }, + 18.5 => { # CSf10 + Name => 'ReleaseButtonToUseDial', + Mask => 0x01, + PrintConv => \%noYes, + }, + 19.1 => { # CSc2 + Name => 'StandbyTimer', + Mask => 0xf0, + PrintConv => { + 0 => '4 s', + 1 => '6 s', + 3 => '10 s', + 5 => '30 s', + 6 => '1 min', + 7 => '5 min', + 8 => '10 min', + 9 => '30 min', + 10 => 'No Limit', #1 + }, + }, + 20.1 => { # CSc3-a + Name => 'SelfTimerTime', + Mask => 0xc0, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 20.2 => { # CSc3-c + Name => 'SelfTimerShotInterval', + Mask => 0x30, + PrintConv => { + 0 => '0.5 s', + 1 => '1 s', + 2 => '2 s', + 3 => '3 s', + }, + }, + 20.3 => { # CSc3-b + Name => 'SelfTimerShotCount', + Mask => 0x0f, + }, + 21.1 => { # CSc4-d + Name => 'ImageReviewMonitorOffTime', # note: decode changed from D4s + Mask => 0xe0, + PrintConv => { + 0 => '2 s', + 1 => '4 s', + 3 => '10 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 21.2 => { # CSc4-e # note: decode changed from D4s + Name => 'LiveViewMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 1 => '5 min', + 2 => '10 min', + 3 => '15 min', + 4 => '20 min', + 5 => '30 min', + 6 => 'No Limit', + }, + }, + 22.1 => { # CSc4-b # note: decode changed from D4s + Name => 'MenuMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 2 => '10 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 22.2 => { # CSc4-c # note: decode changed from D4s + Name => 'ShootingInfoMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 0 => '4 s', + 2 => '10 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 23.1 => { # CSe1 + Name => 'FlashSyncSpeed', + Mask => 0xf0, + PrintConv => { + 0 => '1/320 s (auto FP)', + 2 => '1/250 s (auto FP)', + 3 => '1/250 s', + 5 => '1/200 s', + 6 => '1/160 s', + 7 => '1/125 s', + 8 => '1/100 s', + 9 => '1/80 s', + 10 => '1/60 s', + }, + }, + 23.2 => { # CSe2 + Name => 'FlashShutterSpeed', + Mask => 0x0f, + PrintConvColumns => 2, + PrintConv => { + 0 => '1/60 s', + 1 => '1/30 s', + 2 => '1/15 s', + 3 => '1/8 s', + 4 => '1/4 s', + 5 => '1/2 s', + 6 => '1 s', + 7 => '2 s', + 8 => '4 s', + 9 => '8 s', + 10 => '15 s', + 11 => '30 s', + }, + }, + 24.1 => { # CSe3 + Name => 'FlashControlBuilt-in', + Mask => 0xc0, + RawConv => '$$self{FlashControlBuiltin} = $val', + PrintConv => { + 0 => 'TTL', + 1 => 'Manual', + 2 => 'Repeating Flash', + 3 => 'Commander Mode', + }, + }, + 31.1 => { # CSe5 + Name => 'ModelingFlash', + Mask => 0x20, + PrintConv => \%onOff, + }, + 36.1 => { # CSc4-a + Name => 'PlaybackMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 37.1 => { # CSf2-c + Name => 'MultiSelectorLiveView', + Mask => 0xc0, + PrintConv => { + 0 => 'Reset', + 1 => 'Zoom', + 3 => 'Not Used', + }, + }, + 38.1 => { # CSf7-a + Name => 'ShutterSpeedLock', + Mask => 0x80, + PrintConv => \%offOn, + }, + 38.2 => { # CSf7-b + Name => 'ApertureLock', + Mask => 0x40, + PrintConv => \%offOn, + }, + 38.3 => { # CSg4 + Name => 'MovieShutterButton', + Mask => 0x20, + PrintConv => { + 0 => 'Take Photo', + 1 => 'Record Movies', + }, + }, + 38.4 => { # CSe4 + Name => 'FlashExposureCompArea', + Mask => 0x04, + PrintConv => { + 0 => 'Entire frame', + 1 => 'Background only', + }, + }, + 40.1 => { # CSg3 + Name => 'MovieAELockButtonAssignment', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + 5 => 'AE/AF Lock', + 6 => 'AE Lock Only', + 7 => 'AE Lock (hold)', + 8 => 'AF Lock Only', + }, + }, + 41.1 => { # CSg1 + Name => 'MovieFunctionButton', + Mask => 0x70, + PrintConv => { + 0 => 'None', + 1 => 'Power Aperture (open)', # bit '02' is also toggled on for this setting + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + }, + }, + 41.2 => { # CSg2 + Name => 'MoviePreviewButton', + Mask => 0x07, + PrintConv => { + 0 => 'None', + 2 => 'Power Aperture (open)', # bit '10' is also toggled on for this setting + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + }, + }, + 42.1 => { # CSf4-b + Name => 'FuncButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (FX/DX/5:4)', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 8 => 'Exposure Delay Mode', + }, + }, + 43.1 => { # CSf5-b + Name => 'PreviewButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (FX/DX/5:4)', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 8 => 'Exposure Delay Mode', + }, + }, + 44.1 => { # CSf6-b + Name => 'AELockButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (FX/DX/5:4)', + 2 => 'Shutter Speed & Aperture Lock', + 4 => 'Choose Non-CPU Lens Number', + 8 => 'Exposure Delay Mode', + }, + }, + 45.1 => { # CSf13 + Name => 'AssignMovieRecordButton', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (FX/DX/5:4)', + 2 => 'Shutter Speed & Aperture Lock', + 9 => 'White Balance', + 10 => 'ISO Sensitivity', + }, + }, + 46.1 => { # CSb7-d + Name => 'FineTuneOptHighlightWeighted', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 47.1 => { # CSa5-b + Name => 'DynamicAreaAFDisplay', + Mask => 0x80, + PrintConv => \%offOn, + }, + 47.2 => { # CSa5-a # moved with D810 + Name => 'AFPointIllumination', + Mask => 0x40, + PrintConv => { + 0 => 'Off', + 1 => 'On During Manual Focusing', + }, + }, + 47.3 => { # CSa9 + Name => 'StoreByOrientation', + Mask => 0x18, + PrintConv => { + 0 => 'Off', + 1 => 'Focus Point', + 2 => 'Focus Point and AF-area mode', + }, + }, + 47.4 => { # CSa5-c + Name => 'GroupAreaAFIllumination', + Mask => 0x04, + PrintConv => { + 0 => 'Squares', # moved with D810 + 1 => 'Dots', + }, + }, + 48.1 => { # CSb5 + Name => 'MatrixMetering', + Mask => 0x80, + PrintConv => { + 0 => 'Face Detection On', + 1 => 'Face Detection Off', + }, + }, + 48.2 => { # CSf14 + Name => 'LiveViewButtonOptions', + Mask => 0x30, + PrintConv => { + 0 => 'Enable', + 2 => 'Disable', + }, + }, + 48.3 => { # CSa12 + Name => 'AFModeRestrictions', + Mask => 0x03, + PrintConv => { + 0 => 'No Restrictions', + 1 => 'AF-C', + 2 => 'AF-S', + }, + }, + 49.1 => { # CSa11 + Name => 'LimitAFAreaModeSelection', + Mask => 0x7e, + PrintConv => { + 0 => 'No Restrictions', + BITMASK => { + 0 => 'Auto-area', + 1 => 'Group-area', + 2 => '3D-tracking', + 3 => 'Dynamic area (51 points)', + 4 => 'Dynamic area (21 points)', + 5 => 'Dynamic area (9 points)', + }, + }, + }, + 50.1 => { # CSf15 + Name => 'AF-OnForMB-D12', + Mask => 0x07, + PrintConv => { + 0 => 'AE/AF Lock', + 1 => 'AE Lock Only', + 2 => 'AF Lock Only', + 3 => 'AE Lock (hold)', + 4 => 'AE Lock (reset)', + 5 => 'AF-On', + 6 => 'FV Lock', + 7 => 'Same As Fn Button', + }, + }, + 51.1 => { # CSf16 + Name => 'AssignRemoteFnButton', + Mask => 0x1f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 16 => '+NEF(RAW)', + 25 => 'Live View', + 26 => 'Flash Disable/Enable', + }, + }, + 52.1 => { # CSf17 + Name => 'LensFocusFunctionButtons', + Mask => 0x3f, + PrintConv => { + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 7 => 'AF Lock Only', + 21 => 'Disable Synchronized Release', + 22 => 'Remote Release Only', + 24 => 'Preset focus Point', + 26 => 'Flash Disable/Enable', + 32 => 'AF-Area Mode: Single-point AF', + 33 => 'AF-Area Mode: Dynamic-area AF (9 points)', + 34 => 'AF-Area Mode: Dynamic-area AF (21 points)', + 35 => 'AF-Area Mode: Dynamic-area AF (51 points)', + 36 => 'AF-Area Mode: Group-area AF', + 37 => 'AF-Area Mode: Auto area AF', + }, + }, +); + +# D850 custom settings (ref 1) +%Image::ExifTool::NikonCustom::SettingsD850 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D850.', + 0.2 => { + Name => 'CustomSettingsBank', + Mask => 0x03, + PrintConv => { + 0 => 'A', + 1 => 'B', + 2 => 'C', + 3 => 'D', + }, + }, + 1.1 => { #CSa1 + Name => 'AF-CPrioritySelection', + Mask => 0xc0, + PrintConv => { + 0 => 'Release', + 1 => 'Release + Focus', + 2 => 'Focus', + 3 => 'Focus + Release', + }, + }, + 1.2 => { # CSa2 + Name => 'AF-SPrioritySelection', + Mask => 0x20, + PrintConv => { + 0 => 'Focus', + 1 => 'Release', + }, + }, + 1.3 => { # CSa6 + Name => 'AFPointSelection', + Mask => 0x10, + PrintConv => { + 0 => '55 Points', + 1 => '15 Points', + }, + }, + 1.4 => { # CSa4 + Name => 'Three-DTrackingFaceDetection', + Mask => 0x08, + PrintConv => \%offOn, + }, + 1.5 => { # CSa3-a + Name => 'BlockShotAFResponse', + Mask => 0x07, + PrintConv => { + 1 => '1 (Quick)', + 2 => '2', + 3 => '3 (Normal)', + 4 => '4', + 5 => '5 (Delay)', + }, + }, + 2.1 => { # CSa11 + Name => 'FocusPointWrap', + Mask => 0x08, + PrintConv => { + 0 => 'No Wrap', + 1 => 'Wrap', + }, + }, + 2.2 => { # CSa12-a + Name => 'AFPointBrightness', + Mask => 0x06, + PrintConv => { + 0 => 'Auto', + 1 => 'On', + 2 => 'Off', + }, + }, + 4.1 => { # CSd3 + Name => 'ISODisplay', + Mask => 0x08, + PrintConv => { + 0 => 'Show ISO Sensitivity', + 1 => 'Show Frame Count', + }, + }, + 4.2 => { # CSd9 + Name => 'GridDisplay', + Mask => 0x02, + PrintConv => \%onOff, + }, + 5.1 => { # CSd10 + Name => 'LCDIllumination', + Mask => 0x20, + PrintConv => \%offOn, + }, + 5.2 => { # CSd6 + Name => 'ElectronicFront-CurtainShutter', + Mask => 0x08, + PrintConv => \%offOn, + }, + 6.1 => { # CSf7 + Name => 'ReverseIndicators', + Mask => 0x80, + PrintConv => { + 0 => '+ 0 -', + 1 => '- 0 +', + }, + }, + 6.2 => { # CSf4-a + Name => 'CommandDialsReverseRotation', + Mask => 0x18, + PrintConv => { + 0 => 'No', + 1 => 'Shutter Speed & Aperture', + 2 => 'Exposure Compensation', + 3 => 'Exposure Compensation, Shutter Speed & Aperture', + }, + }, + 6.3 => { # CSb4 + Name => 'EasyExposureCompensation', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On (Auto Reset)', + }, + }, + 7.1 => { # CSb2 + Name => 'ExposureControlStepSize', + Mask => 0xc0, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 7.2 => { # CSb1 + Name => 'ISOStepSize', + Mask => 0x30, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 7.3 => { # CSb3 + Name => 'ExposureCompStepSize', + Mask => 0x0c, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 8.1 => { # CSb6 + Name => 'CenterWeightedAreaSize', + Mask => 0xe0, + PrintConv => { + 0 => '8 mm', + 1 => '12 mm', + 2 => '15 mm', + 3 => '20 mm', + 4 => 'Average', + }, + }, + 8.2 => { # CSb7-a + Name => 'FineTuneOptMatrixMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.1 => { # CSb7-b + Name => 'FineTuneOptCenterWeighted', + Mask => 0xf0, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.2 => { # CSb7-c + Name => 'FineTuneOptSpotMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 10.1 => { # CSf2-a + Name => 'MultiSelectorShootMode', + Mask => 0xe0, + PrintConv => { + 0 => 'Select Center Focus Point (Reset)', + 2 => 'Preset Focus Point (Pre)', + 3 => 'Highlight Active Focus Point', + 4 => 'Not Used (None)', + }, + }, + 10.2 => { # CSf2-b + Name => 'MultiSelectorPlaybackMode', + Mask => 0x0c, + PrintConv => { + 0 => 'Thumbnail On/Off', + 1 => 'View Histograms', + 2 => 'Zoom On/Off', + 3 => 'Choose Folder', + }, + }, + 10.3 => { # CSf5 + Name => 'MultiSelector', + Mask => 0x01, + PrintConv => { + 0 => 'Do Nothing', + 1 => 'Reset Meter-off Delay', + }, + }, + 11.1 => { # CSd5 + Name => 'ExposureDelayMode', + Mask => 0xe0, + PrintConv => { + 0 => 'Off', + 1 => '0.2 s', #new with the D850 + 2 => '0.5 s', #new with the D850 + 3 => '1 s', + 4 => '2 s', + 5 => '3 s', + }, + }, + 11.2 => { # CSd1 + Name => 'CLModeShootingSpeed', + Mask => 0x0f, + PrintConv => '"$val fps"', + PrintConvInv => '$val=~s/\s*fps//i; $val', + }, + 12.1 => { # CSd2 + Name => 'MaxContinuousRelease', + # values: 1-100 + }, + 13.1 => { # CSe7 + Name => 'AutoBracketOrder', + Mask => 0x10, + PrintConv => { + 0 => '0,-,+', + 1 => '-,0,+', + }, + }, + 13.2 => { # CSe6 + Name => 'AutoBracketModeM', + Mask => 0x0c, + PrintConv => { + 0 => 'Flash/Speed', + 1 => 'Flash/Speed/Aperture', + 2 => 'Flash/Aperture', + 3 => 'Flash Only', + }, + }, + 14.1 => { # CSf1-c + Name => 'Func1Button', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 19 => 'Grid Display', + 20 => 'My Menu', + 22 => 'Remote Release Only', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 153 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 153 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + 56 => 'AF-Area Mode (Dynamic Area 9 Points)', + 57 => 'AF-Area Mode + AF-On (Dynamic Area 9 Points)', + }, + }, + 15.1 => { # CSf1-a + Name => 'PreviewButton', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 19 => 'Grid Display', + 20 => 'My Menu', + 22 => 'Remote Release Only', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 153 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 153 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + 56 => 'AF-Area Mode (Dynamic Area 9 Points)', + 57 => 'AF-Area Mode + AF-On (Dynamic Area 9 Points)', + }, + }, + 16.1 => { # CSf1-j + Name => 'AssignBktButton', + Mask => 0x07, + PrintConv => { + 0 => 'Auto Bracketing', + 1 => 'Multiple Exposure', + 2 => 'HDR (high dynamic range)', + 3 => 'None', + }, + }, + 18.1 => { # CSf4-b + Name => 'CommandDialsChangeMainSub', + Mask => 0xe0, + PrintConv => { + 0 => 'Autofocus Off, Exposure Off', + 1 => 'Autofocus Off, Exposure On', + 2 => 'Autofocus Off, Exposure On (Mode A)', + 4 => 'Autofocus On, Exposure Off', + 5 => 'Autofocus On, Exposure On', + 6 => 'Autofocus On, Exposure On (Mode A)', + }, + }, + 18.2 => { # CSf4-d + Name => 'CommandDialsMenuAndPlayback', + Mask => 0x18, + PrintConv => { + 0 => 'On', + 1 => 'Off', + 2 => 'On (Image Review Excluded)', + }, + }, + 18.3 => { # CSf4-c + Name => 'CommandDialsApertureSetting', + Mask => 0x04, + PrintConv => { + 0 => 'Sub-command Dial', + 1 => 'Aperture Ring', + }, + }, + 18.4 => { # CSf6 + Name => 'ReleaseButtonToUseDial', + Mask => 0x01, + PrintConv => \%noYes, + }, + 19.1 => { # CSc2 + Name => 'StandbyTimer', + Mask => 0xf0, + PrintConv => { + 0 => '4 s', + 1 => '6 s', + 3 => '10 s', + 5 => '30 s', + 6 => '1 min', + 7 => '5 min', + 8 => '10 min', + 9 => '30 min', + 10 => 'No Limit', + }, + }, + 20.1 => { # CSc3-a + Name => 'SelfTimerTime', + Mask => 0xc0, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 20.2 => { # CSc3-c + Name => 'SelfTimerShotInterval', + Mask => 0x30, + PrintConv => { + 0 => '0.5 s', + 1 => '1 s', + 2 => '2 s', + 3 => '3 s', + }, + }, + 20.3 => { # CSc3-b + Name => 'SelfTimerShotCount', + Mask => 0x0f, + }, + 21.1 => { # CSc4-d + Name => 'ImageReviewMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '2 s', + 1 => '4 s', + 3 => '10 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 21.2 => { # CSc4-e + Name => 'LiveViewMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 1 => '5 min', + 2 => '10 min', + 3 => '15 min', + 4 => '20 min', + 5 => '30 min', + 6 => 'No Limit', + }, + }, + 22.1 => { # CSc4-b + Name => 'MenuMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 2 => '10 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 22.2 => { # CSc4-c + Name => 'ShootingInfoMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 0 => '4 s', + 2 => '10 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 23.1 => { # CSe1 + Name => 'FlashSyncSpeed', + Mask => 0xf0, + PrintConv => { + 2 => '1/250 s (auto FP)', + 3 => '1/250 s', + 5 => '1/200 s', + 6 => '1/160 s', + 7 => '1/125 s', + 8 => '1/100 s', + 9 => '1/80 s', + 10 => '1/60 s', + }, + }, + 23.2 => { # CSe2 + Name => 'FlashShutterSpeed', + Mask => 0x0f, + PrintConvColumns => 2, + PrintConv => { + 0 => '1/60 s', + 1 => '1/30 s', + 2 => '1/15 s', + 3 => '1/8 s', + 4 => '1/4 s', + 5 => '1/2 s', + 6 => '1 s', + 7 => '2 s', + 8 => '4 s', + 9 => '8 s', + 10 => '15 s', + 11 => '30 s', + }, + }, + 31.1 => { # CSe5 + Name => 'ModelingFlash', + Mask => 0x20, + PrintConv => \%onOff, + }, + 36.1 => { # CSc4-a + Name => 'PlaybackMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 37.1 => { # CSf2-c + Name => 'MultiSelectorLiveView', + Mask => 0xc0, + PrintConv => { + 0 => 'Reset', + 1 => 'Zoom', + 3 => 'Not Used', + }, + }, + 38.1 => { # CSf3-a + Name => 'ShutterSpeedLock', + Mask => 0x80, + PrintConv => \%offOn, + }, + 38.2 => { # CSf3-b + Name => 'ApertureLock', + Mask => 0x40, + PrintConv => \%offOn, + }, + 38.3 => { # CSg1-h + Name => 'MovieShutterButton', + Mask => 0x10, + PrintConv => { + 0 => 'Take Photo', + 1 => 'Record Movies', + }, + }, + 38.4 => { # CSe3 + Name => 'FlashExposureCompArea', + Mask => 0x04, + PrintConv => { + 0 => 'Entire Frame', + 1 => 'Background Only', + }, + }, + 38.5 => { # CSe4 + Name => 'AutoFlashISOSensitivity', + Mask => 0x02, + PrintConv => { + 0 => 'Subject and Background', + 1 => 'Subject Only', + }, + }, + 41.1 => { # CSg1-c + Name => 'MovieFunc1Button', + Mask => 0xf0, + PrintConv => { + 0 => 'None', + 2 => 'Power Aperture (close)', + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + 11 => 'Exposure Compensation -', + }, + }, + 41.2 => { # CSg1-a + Name => 'MoviePreviewButton', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Power Aperture (open)', + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + 10 => 'Exposure Compensation +', + }, + }, + 42.1 => { # CSf1-d + Name => 'Func1ButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 7 => 'Photo Shooting Menu Bank', + 8 => 'Exposure Delay Mode', + }, + }, + 43.1 => { # CSf1-b + Name => 'PreviewButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 7 => 'Photo Shooting Menu Bank', + 8 => 'Exposure Delay Mode', + }, + }, + 45.1 => { # CSf1-k + Name => 'AssignMovieRecordButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'Shutter Speed & Aperture Lock', + 7 => 'Photo Shooting Menu Bank', + 11 => 'Exposure Mode', + }, + }, + 46.1 => { # CSb7-d + Name => 'FineTuneOptHighlightWeighted', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 47.1 => { # CSa12-c + Name => 'DynamicAreaAFDisplay', + Mask => 0x80, + PrintConv => \%offOn, + }, + 47.2 => { # CSa12-b + Name => 'AFPointIllumination', + Mask => 0x40, + PrintConv => { + 0 => 'Off', + 1 => 'On During Manual Focusing', + }, + }, + 47.3 => { # CSa7 + Name => 'StoreByOrientation', + Mask => 0x18, + PrintConv => { + 0 => 'Off', + 1 => 'Focus Point', + 2 => 'Focus Point and AF-area Mode', + }, + }, + 48.1 => { # CSb5 + Name => 'MatrixMetering', + Mask => 0x80, + PrintConv => { + 0 => 'Face Detection On', + 1 => 'Face Detection Off', + }, + }, + 48.2 => { # CSf8 + Name => 'LiveViewButtonOptions', + Mask => 0x30, + PrintConv => { + 0 => 'Enable', + 1 => 'Enable (Standby Timer Active)', + 2 => 'Disable', + }, + }, + 48.3 => { # CSa10 + Name => 'AFModeRestrictions', + Mask => 0x03, + PrintConv => { + 0 => 'No Restrictions', + 1 => 'AF-C', + 2 => 'AF-S', + }, + }, + 49.1 => { # CSa9 + Name => 'LimitAFAreaModeSelection', #note that 'Dynamic area (9 points)' can be selected from the camera menu but the setting is not written to the EXIF data. + Mask => 0x7e, #...This AF Mode was added to the D5 firmware several months after the camera's initial release which may help explain the inconsistency. + PrintConv => { + 0 => 'No Restrictions', + BITMASK => { + 0 => 'Auto-area', + 1 => 'Group-area', + 2 => '3D-tracking', + 3 => 'Dynamic area (153 points)', + 4 => 'Dynamic area (72 points)', + 5 => 'Dynamic area (25 points)', + }, + }, + }, + 52.1 => { # CSf1-l + Name => 'LensFocusFunctionButtons', + Mask => 0x3f, + PrintConv => { + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 24 => 'Preset Focus Point', + 26 => 'Flash Disable/Enable', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 153 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 153 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + 56 => 'AF-Area Mode (Dynamic Area 9 Points)', + 57 => 'AF-Area Mode + AF-On (Dynamic Area 9 Points)', + }, + }, + 66.1 => { # CSf10-d + Name => 'VerticalMultiSelector', + Mask => 0xff, + PrintHex => 1, + PrintConv => { + 0x00 => 'Same as Multi-Selector with Info(U/D) & Playback(R/L)', + 0x08 => 'Same as Multi-Selector with Info(R/L) & Playback(U/D)', + 0x80 => 'Focus Point Selection', + }, + }, + 67.1 => { # CSf10-a + Name => 'AssignMB-D18FuncButton', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 18 => 'Reset Focus Point', + 19 => 'Grid Display', + 20 => 'My Menu', + 22 => 'Remote Release Only', + 23 => 'Preset Focus Point', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 153 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 153 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + 54 => 'Highlight Active Focus Point', + 56 => 'AF-Area Mode (Dynamic Area 9 Points)', + 57 => 'AF-Area Mode + AF-On (Dynamic Area 9 Points)', + }, + }, + 68.1 => { # CSf10-b + Name => 'AssignMB-D18FuncButtonPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 7 => 'Photo Shooting Menu Bank', + 8 => 'Exposure Delay Mode', + 10 => 'ISO Sensitivity', + 11 => 'Exposure Mode', + 12 => 'Exposure Compensation', + 13 => 'Metering Mode', + }, + }, + 70.1 => { # CSf1-f + Name => 'AF-OnButton', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 153 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 153 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 56 => 'AF-Area Mode (Dynamic Area 9 Points)', + 57 => 'AF-Area Mode + AF-On (Dynamic Area 9 Points)', + }, + }, + 71.1 => { # CSf1-g + Name => 'SubSelector', + Mask => 0x80, + PrintConv => { + 0 => 'Focus Point Selection', + 1 => 'Same as MultiSelector', + }, + }, + 72.1 => { # CSf1-h + Name => 'SubSelectorCenter', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 18 => 'Reset Focus Point', + 19 => 'Grid Display', + 20 => 'My Menu', + 22 => 'Remote Release Only', + 23 => 'Preset Focus Point', + 26 => 'Flash Disable/Enable', + 27 => 'Highlight-weighted Metering', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 153 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 153 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 49 => 'Sync Release (Master Only)', + 50 => 'Sync Release (Remote Only)', + 54 => 'Highlight Active Focus Point', + 56 => 'AF-Area Mode (Dynamic Area 9 Points)', + 57 => 'AF-Area Mode + AF-On (Dynamic Area 9 Points)', + }, + }, + 73.1 => { # CSf1-i + Name => 'SubSelectorPlusDials', + Mask => 0x0f, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + 2 => 'Shutter Speed & Aperture Lock', + 4 => 'Choose Non-CPU Lens Number', + 7 => 'Photo Shooting Menu Bank', + }, + }, + 74.1 => { # CSg1-f + Name => 'AssignMovieSubselector', + Mask => 0xf0, + PrintConv => { + 0 => 'None', + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + 5 => 'AE/AF Lock', + 6 => 'AE Lock (Only)', + 7 => 'AE Lock (Hold)', + 8 => 'AF Lock (Only)', + }, + }, + 75.1 => { # CSg1-d + Name => 'AssignMovieFunc1ButtonPlusDials', + Mask => 0x10, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + }, + }, + 75.2 => { # CSg1-b + Name => 'AssignMoviePreviewButtonPlusDials', + Mask => 0x01, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + }, + }, + 76.1 => { # CSg1-g + Name => 'AssignMovieSubselectorPlusDials', + Mask => 0x10, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + }, + }, + 77.1 => { # CSd4 + Name => 'SyncReleaseMode', + Mask => 0x80, + PrintConv => { + 0 => 'No Sync', + 1 => 'Sync', + }, + }, + 77.2 => { # CSd11 (new with D850) + Name => 'ContinuousModeLiveView', + Mask => 0x40, + PrintConv => \%offOn, + }, + 78.1 => { # CSa5 + Name => 'Three-DTrackingWatchArea', + Mask => 0x80, + PrintConv => { + 0 => 'Wide', + 1 => 'Normal', + }, + }, + 78.2 => { # CSa3-b + Name => 'SubjectMotion', + Mask => 0x60, + PrintConv => { + 0 => 'Steady', + 1 => 'Middle', + 2 => 'Erratic', + }, + }, + 78.3 => { # CSa8 + Name => 'AFActivation', + Mask => 0x08, + PrintConv => { + 0 => 'Shutter/AF-On', + 1 => 'AF-On Only', + }, + }, + 78.4 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'On (Half Press)', + 2 => 'On (Burst Mode)' + }, + }, + 79.1 => { # CSf10-c + Name => 'AssignMB-D18AF-OnButton', + Mask => 0x7f, + PrintConv => { + 0 => 'None', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 36 => 'AF-Area Mode (Single)', + 37 => 'AF-Area Mode (Dynamic Area 25 Points)', + 38 => 'AF-Area Mode (Dynamic Area 72 Points)', + 39 => 'AF-Area Mode (Dynamic Area 153 Points)', + 40 => 'AF-Area Mode (Group Area AF)', + 41 => 'AF-Area Mode (Auto Area AF)', + 42 => 'AF-Area Mode + AF-On (Single)', + 43 => 'AF-Area Mode + AF-On (Dynamic Area 25 Points)', + 44 => 'AF-Area Mode + AF-On (Dynamic Area 72 Points)', + 45 => 'AF-Area Mode + AF-On (Dynamic Area 153 Points)', + 46 => 'AF-Area Mode + AF-On (Group Area AF)', + 47 => 'AF-Area Mode + AF-On (Auto Area AF)', + 56 => 'AF-Area Mode (Dynamic Area 9 Points)', + 57 => 'AF-Area Mode + AF-On (Dynamic Area 9 Points)', + 100 => 'Same as Camera AF-On Button', + }, + }, + 80.1 => { # CSf1-e + Name => 'Func2Button', + Mask => 0x3f, + PrintConv => { + 0 => 'None', + 15 => 'My Menu Top Item', + 20 => 'My Menu', + 55 => 'Rating', + }, + }, + 82.1 => { # CSg1-e + Name => 'AssignMovieFunc2Button', + Mask => 0x70, + PrintConv => { + 0 => 'None', + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + }, + }, +); + +# D5000 custom settings (ref PH) +%Image::ExifTool::NikonCustom::SettingsD5000 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D5000.', + # Missing/Incomplete settings: + # CSd7 - LiveViewDisplayOptions [couldn't find in data - try again with live view shots] + 0.1 => { # CSa1 + Name => 'AFAreaModeSetting', + Mask => 0x60, + PrintConv => { + 0 => 'Single Area', + 1 => 'Dynamic Area', + 2 => 'Auto-area', + 3 => '3D-tracking (11 points)', + }, + }, + 0.2 => { # CSa2 + Name => 'AFAssist', + Mask => 0x01, + PrintConv => \%onOff, + }, + 2.1 => { # CSd1 + Name => 'Beep', + Mask => 0xc0, + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'High', + }, + }, + 2.2 => { # CSd2 + Name => 'GridDisplay', + Mask => 0x02, + PrintConv => \%onOff, + }, + 2.3 => { # CSd3 + Name => 'ISODisplay', + Mask => 0x08, + PrintConv => \%onOff, + }, + 2.4 => { # CSf4 + Name => 'NoMemoryCard', + Mask => 0x20, + PrintConv => { + 0 => 'Release Locked', + 1 => 'Enable Release', + }, + }, + 3.1 => { # CSd4 + Name => 'FileNumberSequence', + Mask => 0x08, + PrintConv => \%onOff, + }, + 4.1 => { # CSa4 + Name => 'RangeFinder', + Mask => 0x10, + PrintConv => \%offOn, + }, + 4.2 => { # CSd6 + Name => 'DateImprint', + Mask => 0x08, + PrintConv => \%offOn, + }, + 4.3 => { # CSf5 + Name => 'ReverseIndicators', + Mask => 0x80, + PrintConv => { + 0 => '+ 0 -', + 1 => '- 0 +', + }, + }, + 5.1 => { # CSb1 + Name => 'EVStepSize', + Mask => 0x40, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + }, + }, + 9.1 => { # CSd5 + Name => 'ExposureDelayMode', + Mask => 0x40, + PrintConv => \%offOn, + }, + 11.1 => { # CSe2 + Name => 'AutoBracketSet', + Mask => 0xc0, + PrintConv => { + 0 => 'Exposure', + # (NOTE: the following are reversed in the D5100 -- is this correct?) + 1 => 'Active D-Lighting', #(NC) + 2 => 'WB Bracketing', + }, + }, + 12.1 => { # CSf1 + Name => 'TimerFunctionButton', + Mask => 0x38, + PrintConv => { + 0 => 'Self-timer', + 1 => 'Release Mode', + 2 => 'Image Quality/Size', #(NC) + 3 => 'ISO', #(NC) + 4 => 'White Balance', #(NC) + 5 => 'Active D-Lighting', #(NC) + 6 => '+ NEF (RAW)', + 7 => 'Auto Bracketing', + }, + }, + 15.1 => { # CSf2 + Name => 'AELockButton', + Mask => 0x38, + PrintConv => { + 0 => 'AE/AF Lock', + 1 => 'AE Lock Only', #(NC) + 2 => 'AF Lock Only', #(NC) + 3 => 'AE Lock (hold)', + 4 => 'AF-ON', + }, + }, + 16.1 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + Mask => 0x02, + PrintConv => \%offOn, + }, + 16.2 => { # CSf3 + Name => 'CommandDialsReverseRotation', + Mask => 0x80, + PrintConv => \%noYes, + }, + 17.1 => { # CSc2-c + Name => 'MeteringTime', + Mask => 0x70, + PrintConv => { + 0 => '4 s', + 1 => '8 s', + 2 => '20 s', + 3 => '1 min', + 4 => '30 min', + }, + }, + 17.2 => { # CSc4 + Name => 'RemoteOnDuration', + Mask => 0x03, + PrintConv => { + 0 => '1 min', + 1 => '5 min', + 2 => '10 min', + 3 => '15 min', + }, + }, + 18.1 => { # CSc3-a + Name => 'SelfTimerTime', + Mask => 0xc0, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 18.2 => { # CSc3-b + Name => 'SelfTimerShotCount', + Mask => 0x1e, + }, + 19.1 => { # CSc2-b + Name => 'ImageReviewTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '8 s', + 2 => '20 s', + 3 => '1 min', + 4 => '10 min', + }, + }, + 20.1 => { # CSc2-a + Name => 'PlaybackMenusTime', + Mask => 0xe0, + PrintConv => { + 0 => '8 s', + 1 => '12 s', + 2 => '20 s', + 3 => '1 min', + 4 => '10 min', + }, + }, + 22.1 => { # CSe1-a + Name => 'InternalFlash', + Mask => 0xc0, + PrintConv => { + 0 => 'TTL', + 1 => 'Manual', + }, + }, + 22.2 => { # CSe1-b + Name => 'ManualFlashOutput', + Mask => 0x1f, + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val > 0 ? -3*log($val)/log(2) : 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 32.1 => { # CSa3 + Name => 'LiveViewAF', + Mask => 0x60, + PrintConv => { + 0 => 'Face Priority', + 1 => 'Wide Area', + 2 => 'Normal Area', + 3 => 'Subject Tracking', + }, + }, +); + +# D5100 custom settings (ref PH) +%Image::ExifTool::NikonCustom::SettingsD5100 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D5100.', + 0.1 => { # CSa1 + Name => 'AF-CPrioritySelection', + Mask => 0x80, + PrintConv => { + 0 => 'Release', + 1 => 'Focus', + }, + }, + 1.1 => { # CSa2 + Name => 'AFAssist', + Mask => 0x01, + PrintConv => \%onOff, + }, + 3.1 => { # CSd1 + Name => 'Beep', + Mask => 0xc0, + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'High', + }, + }, + 3.2 => { # CSf4 + Name => 'NoMemoryCard', + Mask => 0x20, + PrintConv => { + 0 => 'Release Locked', + 1 => 'Enable Release', + }, + }, + 3.3 => { # CSd2 + Name => 'ISODisplay', + Mask => 0x08, + PrintConv => \%onOff, + }, + 4.1 => { # CSd3 + Name => 'FileNumberSequence', + Mask => 0x08, + PrintConv => \%onOff, + }, + 5.1 => { # CSa3 + Name => 'RangeFinder', + Mask => 0x10, + PrintConv => \%offOn, + }, + # (it looks like CSd5 DateImprint is not stored) + 5.2 => { # CSf5 + Name => 'ReverseIndicators', + Mask => 0x80, + PrintConv => { + 0 => '+ 0 -', + 1 => '- 0 +', + }, + }, + 6.1 => { # CSb1 + Name => 'EVStepSize', + Mask => 0x40, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + }, + }, + 10.1 => { # CSd4 + Name => 'ExposureDelayMode', + Mask => 0x40, + PrintConv => \%offOn, + }, + 12.1 => { # CSe2 + Name => 'AutoBracketSet', + Mask => 0xc0, + PrintConv => { + 0 => 'Exposure', + # (NOTE: the following are reversed from the D5000 -- is D5000 correct?) + 1 => 'WB Bracketing', + 2 => 'Active D-Lighting', + }, + }, + 13.1 => { # CSf1 + Name => 'TimerFunctionButton', + Mask => 0x38, + PrintConv => { + 0 => 'Self-timer', + 1 => 'Release Mode', + 2 => 'Image Quality/Size', + 3 => 'ISO', + 4 => 'White Balance', + 5 => 'Active D-Lighting', + 6 => '+ NEF (RAW)', + 7 => 'Auto Bracketing', + }, + }, + 16.1 => { # CSf2 + Name => 'AELockButton', + Mask => 0x38, + PrintConv => { + 0 => 'AE/AF Lock', + 1 => 'AE Lock Only', + 2 => 'AF Lock Only', + 3 => 'AE Lock (hold)', + 4 => 'AF-ON', + }, + }, + 17.1 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + Mask => 0x02, + PrintConv => \%offOn, + }, + 17.2 => { # CSf3 + Name => 'CommandDialsReverseRotation', + Mask => 0x80, + PrintConv => \%noYes, + }, + 18.1 => { # CSc2-d + Name => 'MeteringTime', + Mask => 0x70, + PrintConv => { + 0 => '4 s', + 1 => '8 s', + 2 => '20 s', #(NC) + 3 => '1 min', + 4 => '30 min', #(NC) + }, + }, + 18.2 => { # CSc4 + Name => 'RemoteOnDuration', + Mask => 0x03, + PrintConv => { + 0 => '1 min', + 1 => '5 min', + 2 => '10 min', #(NC) + 3 => '20 min', # (but picture in manual shows 15 min) + }, + }, + 19.1 => { # CSc3-a + Name => 'SelfTimerTime', + Mask => 0xc0, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 19.2 => { # CSc3-b + Name => 'SelfTimerShotCount', + Mask => 0x0f, + }, + 20.1 => { # CSc2-b + Name => 'ImageReviewTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '8 s', #(NC) + 2 => '20 s', + 3 => '1 min', #(NC) + 4 => '10 min', #(NC) + }, + }, + 20.2 => { # CSc2-c + Name => 'LiveViewMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 0 => '3 min', + 1 => '5 min', #(NC) + 2 => '10 min', + 3 => '15 min', #(NC) + 4 => '20 min', #(NC) + 5 => '30 min', #(NC) + }, + }, + 21.1 => { # CSc2-a + Name => 'PlaybackMenusTime', + Mask => 0xe0, + PrintConv => { + 0 => '8 s', #(NC) + 1 => '12 s', + 2 => '20 s', + 3 => '1 min', + 4 => '10 min', #(NC) + }, + }, + 23.1 => { # CSe1-a + Name => 'InternalFlash', + Mask => 0xc0, + PrintConv => { + 0 => 'TTL', + 1 => 'Manual', + }, + }, + 23.1 => { # CSe1-b + Name => 'ManualFlashOutput', + Mask => 0x1f, + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val > 0 ? -3*log($val)/log(2) : 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, +); + +# D5200 custom settings (ref PH) +%Image::ExifTool::NikonCustom::SettingsD5200 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D5200.', + 0.1 => { # CSa1 + Name => 'AF-CPrioritySelection', + Mask => 0x80, + PrintConv => { + 0 => 'Release', + 1 => 'Focus', + }, + }, + 0.2 => { # CSa2 + Name => 'NumberOfFocusPoints', + Mask => 0x10, + PrintConv => { + 0 => '39 Points', + 1 => '11 Points', + }, + }, + 1.1 => { # CSa3 + Name => 'AFAssist', + Mask => 0x01, + PrintConv => \%onOff, + }, + 3.1 => { # CSd1 + Name => 'Beep', + Mask => 0xc0, + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'High', + }, + }, + 3.2 => { # CSf4 + Name => 'NoMemoryCard', + Mask => 0x20, + PrintConv => { + 0 => 'Release Locked', + 1 => 'Enable Release', + }, + }, + 3.3 => { # CSd3 + Name => 'ISODisplay', + Mask => 0x08, + PrintConv => \%onOff, + }, + 4.1 => { # CSd3 + Name => 'FileNumberSequence', + Mask => 0x08, + PrintConv => \%onOff, + }, + 5.1 => { # CSa4 + Name => 'RangeFinder', + Mask => 0x04, + PrintConv => \%offOn, + }, + 5.2 => { # CSf3-a + Name => 'ReverseExposureCompDial', + Mask => 0x10, + PrintConv => \%noYes, + }, + 5.3 => { # CSf3-b + Name => 'ReverseShutterSpeedAperture', + Mask => 0x08, + PrintConv => \%noYes, + }, + 5.4 => { # CSf5 + Name => 'ReverseIndicators', + Mask => 0x80, + PrintConv => { + 0 => '+ 0 -', + 1 => '- 0 +', + }, + }, + 6.1 => { # CSb1 + Name => 'EVStepSize', + Mask => 0x40, # (bit 0x04 also changes) + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + }, + }, + 10.1 => { # CSd5 + Name => 'ExposureDelayMode', + Mask => 0x40, + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 12.1 => { # CSe2 + Name => 'AutoBracketSet', + Mask => 0xc0, + PrintConv => { + 0 => 'Exposure', + # (NOTE: the following are reversed from the D5000 -- is D5000 correct?) + 1 => 'WB Bracketing', + 2 => 'Active D-Lighting', + }, + }, + 13.1 => { # CSf1 + Name => 'FunctionButton', + Mask => 0x1f, + PrintConv => { + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-ON', + 16 => '+ NEF (RAW)', + 18 => 'Active D-Lighting', + 25 => 'Live View', + 26 => 'Image Quality', + 27 => 'ISO', + 28 => 'White Balance', + 29 => 'HDR', + 30 => 'Auto Bracketing', + 31 => 'AF-area Mode', + }, + }, + 16.1 => { # CSf2 + Name => 'AELockButton', + Mask => 0x0f, + PrintConv => { + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-ON', + }, + }, + 17.1 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + Mask => 0x02, + PrintConv => \%offOn, + }, + 18.1 => { # CSc2-d + Name => 'StandbyTimer', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '8 s', + 2 => '20 s', + 3 => '1 min', + 4 => '30 min', + }, + }, + 18.2 => { # CSc4 + Name => 'RemoteOnDuration', + Mask => 0x03, + PrintConv => { + 0 => '1 min', + 1 => '5 min', + 2 => '10 min', + 3 => '15 min', + }, + }, + 19.1 => { # CSc3-a + Name => 'SelfTimerTime', + Mask => 0xc0, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 19.2 => { # CSc3-b + Name => 'SelfTimerShotCount', + Mask => 0x0f, + }, + 20.1 => { # CSc2-b + Name => 'ImageReviewTime', + Mask => 0xe0, + PrintConv => { + 1 => '4 s', + 2 => '8 s', + 4 => '20 s', + 5 => '1 min', + 7 => '10 min', + }, + }, + 20.2 => { # CSc2-c + Name => 'LiveViewMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 1 => '5 min', + 2 => '10 min', + 3 => '15 min', + 4 => '20 min', + 5 => '30 min', + }, + }, + 21.1 => { # CSc2-a + Name => 'PlaybackMenusTime', + Mask => 0xe0, + PrintConv => { + 1 => '8 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 23.1 => { # CSe1-a + Name => 'InternalFlash', + Mask => 0xc0, + PrintConv => { + 0 => 'TTL', + 1 => 'Manual', + }, + }, + 23.2 => { # CSe1-b + Name => 'ManualFlashOutput', + Mask => 0x1f, + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val > 0 ? -3*log($val)/log(2) : 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, +); + +# D7000 custom settings (ref 2) +%Image::ExifTool::NikonCustom::SettingsD7000 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + DATAMEMBER => [ 23.1 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D7000.', + 0.1 => { # CSa1 + Name => 'AF-CPrioritySelection', + Mask => 0x80, + PrintConv => { + 0 => 'Release', + 1 => 'Focus', + }, + }, + 0.2 => { # CSa2 + Name => 'AF-SPrioritySelection', + Mask => 0x20, + PrintConv => { + 0 => 'Focus', + 1 => 'Release', + }, + }, + 0.3 => { # CSa6 + Name => 'NumberOfFocusPoints', + Mask => 0x10, + PrintConv => { + 0 => '39 Points', + 1 => '11 Points', + }, + }, + 0.4 => { # CSa3 + Name => 'FocusTrackingLockOn', + Mask => 0x07, + PrintConv => { + 0 => 'Off', + 1 => '1 Short', + 2 => '2', + 3 => '3 Normal', + 4 => '4', + 5 => '5 Long', + }, + }, + 1.1 => { # CSa5 + Name => 'FocusPointWrap', + Mask => 0x08, + PrintConv => { + 0 => 'No Wrap', + 1 => 'Wrap', + }, + }, + 1.2 => { # CSa4 + Name => 'AFPointIllumination', + Mask => 0x06, + PrintConv => { + 0 => 'Auto', + 1 => 'On', + 2 => 'Off', + }, + }, + 1.3 => { # CSa7 + Name => 'AFAssist', + Mask => 0x01, + PrintConv => \%onOff, + }, + 2.1 => { # CSd14 + Name => 'BatteryOrder', + Mask => 0x40, + PrintConv => { + 0 => 'MB-D11 First', + 1 => 'Camera Battery First', + }, + }, + 2.2 => { # CSa10 + Name => 'AF-OnForMB-D11', + Mask => 0x1c, + PrintConv => { + 0 => 'AE/AF Lock', + 1 => 'AE Lock Only', + 2 => 'AF Lock Only', + 3 => 'AE Lock (hold)', + 4 => 'AF-ON', + 5 => 'FV Lock', + 6 => 'Same as FUNC Button', + }, + }, + 2.3 => { # CSd13 + Name => 'MB-D11BatteryType', + Mask => 0x03, + PrintConv => { + 0 => 'LR6 (AA alkaline)', + 1 => 'Ni-MH (AA Ni-MH)', + 2 => 'FR6 (AA lithium)', + }, + }, + 3.1 => { # CSd1-b + Name => 'BeepPitch', + Mask => 0xc0, + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'High', + }, + }, + 3.2 => { # CSf8 + Name => 'NoMemoryCard', + Mask => 0x20, + PrintConv => { + 0 => 'Release Locked', + 1 => 'Enable Release', + }, + }, + 3.3 => { # CSd3 + Name => 'ISODisplay', + Mask => 0x0c, + PrintConv => { + 0 => 'Show ISO/Easy ISO', + 1 => 'Show ISO Sensitivity', + 3 => 'Show Frame Count', + }, + }, + 3.4 => { # CSd2 + Name => 'GridDisplay', + Mask => 0x02, + PrintConv => \%onOff, + }, + 3.5 => { # CSd4 + Name => 'ViewfinderWarning', + Mask => 0x01, + PrintConv => \%onOff, + }, + 4.1 => { # CSd9 + Name => 'ShootingInfoDisplay', + Mask => 0xc0, + PrintConv => { + 0 => 'Auto', + 2 => 'Manual (dark on light)', + 3 => 'Manual (light on dark)', + }, + }, + 4.2 => { # CSd10 + Name => 'LCDIllumination', + Mask => 0x20, + PrintConv => \%offOn, + }, + 4.3 => { # CSd8 + Name => 'FileNumberSequence', + Mask => 0x08, + PrintConv => \%onOff, + }, + 4.4 => { # CSd5 + Name => 'ScreenTips', + Mask => 0x04, + PrintConv => \%offOn, + }, + 4.5 => { # CSd1-a + Name => 'BeepVolume', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => '1', + 2 => '2', + 3 => '3', + }, + }, + 5.1 => { # CSf9 + Name => 'ReverseIndicators', + Mask => 0x80, + PrintConv => { + 0 => '+ 0 -', + 1 => '- 0 +', + }, + }, + 5.2 => { # CSb3 + Name => 'EasyExposureCompensation', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On Auto Reset', + }, + }, + 6.1 => { # CSb2 + Name => 'ExposureControlStep', + Mask => 0x40, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + }, + }, + 6.2 => { # CSb1 + Name => 'ISOSensitivityStep', + Mask => 0x10, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + }, + }, + 7.1 => { # CSb4 + Name => 'CenterWeightedAreaSize', + Mask => 0xe0, + PrintConv => { + 0 => '6 mm', + 1 => '8 mm', + 2 => '10 mm', + 3 => '13 mm', + 4 => 'Average', + }, + }, + 10.1 => { # CSd11 + Name => 'ExposureDelayMode', + Mask => 0x40, + PrintConv => \%offOn, + }, + 10.2 => { # CSd6 + Name => 'CLModeShootingSpeed', + Mask => 0x07, + PrintConv => '"$val fps"', + PrintConvInv => '$val=~s/\s*fps//i; $val', + }, + 11 => { # CSd7 + Name => 'MaxContinuousRelease', + # values: 1-100 + }, + 12.1 => { # CSe5 + Name => 'AutoBracketSet', + Mask => 0xe0, #(NC) + PrintConv => { + 0 => 'AE & Flash', # default + 1 => 'AE Only', + 2 => 'Flash Only', #(NC) + 3 => 'WB Bracketing', #(NC) + 4 => 'Active D-Lighting', #(NC) + }, + }, + 12.2 => { # CSe6 + Name => 'AutoBracketOrder', + Mask => 0x10, + PrintConv => { + 0 => '0,-,+', + 1 => '-,0,+', + }, + }, + 13.1 => { # CSf3 + Name => 'FuncButton', + Mask => 0xf8, + PrintConv => { + 0 => 'Grid Display', + 1 => 'FV Lock', + 2 => 'Flash Off', + 3 => 'Matrix Metering', + 4 => 'Center-weighted Metering', + 5 => 'Spot Metering', + 6 => 'My Menu Top', + 7 => '+ NEF (RAW)', + 8 => 'Active D-Lighting', + 9 => 'Preview', + 10 => 'AE/AF Lock', + 11 => 'AE Lock Only', + 12 => 'AF Lock Only', + 13 => 'AE Lock (hold)', + 14 => 'Bracketing Burst', + 15 => 'Playback', + 16 => '1EV Step Speed/Aperture', + 17 => 'Choose Non-CPU Lens', + 18 => 'Virtual Horizon', + 19 => 'Start Movie Recording', + }, + }, + 14.1 => { # CSf4 + Name => 'PreviewButton', + Mask => 0xf8, + PrintConv => { + 0 => 'Grid Display', + 1 => 'FV Lock', + 2 => 'Flash Off', + 3 => 'Matrix Metering', + 4 => 'Center-weighted Metering', + 5 => 'Spot Metering', + 6 => 'My Menu Top', + 7 => '+ NEF (RAW)', + 8 => 'Active D-Lighting', + 9 => 'Preview', + 10 => 'AE/AF Lock', + 11 => 'AE Lock Only', + 12 => 'AF Lock Only', + 13 => 'AE Lock (hold)', + 14 => 'Bracketing Burst', + 15 => 'Playback', + 16 => '1EV Step Speed/Aperture', + 17 => 'Choose Non-CPU Lens', + 18 => 'Virtual Horizon', + 19 => 'Start Movie Recording', + }, + }, + 16.1 => { # CSf5 + Name => 'AELockButton', + Mask => 0x38, + PrintConv => { + 0 => 'AE/AF Lock', + 1 => 'AE Lock Only', + 2 => 'AF Lock Only', + 3 => 'AE Lock (hold)', + 4 => 'AF-ON', + 5 => 'FV Lock', + }, + }, + 15.1 => { # CSf2 + Name => 'OKButton', + Mask => 0x18, + PrintConv => { + 1 => 'Select Center Focus Point', + 2 => 'Highlight Active Focus Point', + 3 => 'Not Used', #(NC) + 0 => 'Off', #(NC) + }, + }, + 17.1 => { # CSf6-a + Name => 'CommandDialsReverseRotation', + Mask => 0x80, + PrintConv => \%noYes, + }, + 17.2 => { # CSf6-b + Name => 'CommandDialsChangeMainSub', + Mask => 0x60, + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On (A mode only)', + }, + }, + 17.3 => { # CSf6-c + Name => 'CommandDialsApertureSetting', + Mask => 0x04, + PrintConv => { + 0 => 'Sub-command Dial', + 1 => 'Aperture Ring', + }, + }, + 17.4 => { # CSf6-d + Name => 'CommandDialsMenuAndPlayback', + Mask => 0x18, + PrintConv => { + 0 => 'On', + 2 => 'On (Image Review Exclude)', + 1 => 'Off', + }, + }, + 17.5 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + Mask => 0x02, + PrintConv => \%offOn, + }, + 17.6 => { # CSf7 + Name => 'ReleaseButtonToUseDial', + Mask => 0x01, + PrintConv => \%noYes, + }, + 18.1 => { # CSc2 + Name => 'MeteringTime', + Mask => 0xf0, + PrintConvColumns => 2, + PrintConv => { + 0 => '4 s', + 1 => '6 s', # default + 2 => '8 s', + 3 => '16 s', + 4 => '30 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + 8 => '30 min', + 9 => 'No Limit', + }, + }, + 18.2 => { # CSc5 + Name => 'RemoteOnDuration', + Mask => 0x03, + PrintConv => { + 0 => '1 min', + 1 => '5 min', + 2 => '10 min', + 3 => '15 min', + }, + }, + 19.1 => { # CSc3-a + Name => 'SelfTimerTime', + Mask => 0xc0, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', # default + 3 => '20 s', + }, + }, + 19.2 => { # CSc3-c + Name => 'SelfTimerInterval', + Mask => 0x30, + PrintConv => { + 0 => '0.5 s', + 1 => '1 s', + 2 => '2 s', # default + 3 => '3 s', + }, + }, + 19.3 => { # CSc3-b + Name => 'SelfTimerShotCount', + Mask => 0x0f, + }, + 20.1 => { # CSc4-d + Name => 'ImageReviewTime', + Mask => 0xe0, + PrintConv => { #(NC) + 0 => '4 s', + 1 => '10 s', # default + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 20.2 => { # CSc4-e + Name => 'LiveViewMonitorOffTime', + Mask => 0x1c, + PrintConv => { #(NC) + 0 => '4 s', + 1 => '10 s', # default + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 21.1 => { # CSc4-b + Name => 'MenuMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '10 s', # default + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 21.2 => { # CSc4-c + Name => 'ShootingInfoMonitorOffTime', + Mask => 0x1c, + PrintConv => { #(NC) + 0 => '4 s', + 1 => '10 s', # default + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 22.1 => { # CSe1 + Name => 'FlashSyncSpeed', + Mask => 0xf0, + PrintConv => { + 0 => '1/320 s (auto FP)', + 1 => '1/250 s (auto FP)', + 2 => '1/250 s', + 3 => '1/200 s', + 4 => '1/160 s', + 5 => '1/125 s', + 6 => '1/100 s', + 7 => '1/80 s', + 8 => '1/60 s', + }, + }, + 22.2 => { # CSe2 + Name => 'FlashShutterSpeed', + Mask => 0x0f, + PrintConvColumns => 2, + PrintConv => { + 0 => '1/60 s', + 1 => '1/30 s', + 2 => '1/15 s', + 3 => '1/8 s', + 4 => '1/4 s', + 5 => '1/2 s', + 6 => '1 s', + 7 => '2 s', + 8 => '4 s', + 9 => '8 s', + 10 => '15 s', + 11 => '30 s', + }, + }, + 23.1 => { # CSe3 + Name => 'FlashControlBuilt-in', + Mask => 0xc0, + RawConv => '$$self{FlashControlBuiltin} = $val', + PrintConv => { + 0 => 'TTL', + 1 => 'Manual', + 2 => 'Repeating Flash', + 3 => 'Commander Mode', + }, + }, + 23.2 => { # CSe3-b + Name => 'ManualFlashOutput', + Condition => '$$self{FlashControlBuiltin} == 1', + Mask => 0x1f, + ValueConv => '2 ** (-$val/3)', + ValueConvInv => '$val > 0 ? -3*log($val)/log(2) : 0', + PrintConv => q{ + return 'Full' if $val > 0.99; + Image::ExifTool::Exif::PrintExposureTime($val); + }, + PrintConvInv => '$val=~/F/i ? 1 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 24.1 => { # CSe3-ca + Name => 'RepeatingFlashOutput', + Condition => '$$self{FlashControlBuiltin} == 2', + Mask => 0x70, + ValueConv => '2 ** (-$val-2)', + ValueConvInv => '$val > 0 ? int(-log($val)/log(2)-2+0.5) : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 24.2 => { # CSe3-cb + Name => 'RepeatingFlashCount', + Condition => '$$self{FlashControlBuiltin} == 2', + Mask => 0x0f, + ValueConv => '$val < 10 ? $val + 1 : 5 * ($val - 7)', + ValueConvInv => '$val <= 10 ? $val - 1 : $val / 5 + 7', + }, + 25.1 => { # CSe3-cc (NC) + Name => 'RepeatingFlashRate', + Condition => '$$self{FlashControlBuiltin} == 2', + Mask => 0xf0, + ValueConv => '$val < 10 ? $val + 1 : 10 * ($val - 8)', + ValueConvInv => 'int(($val <= 10 ? $val - 1 : $val / 10 + 8) + 0.5)', + PrintConv => '"$val Hz"', + PrintConvInv => '$val=~/(\d+)/; $1 || 0', + }, + 26.1 => { # CSe3-da + Name => 'CommanderInternalTTLCompBuiltin', + Condition => '$$self{FlashControlBuiltin} == 3', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 27.1 => { # CSe3-db + Name => 'CommanderInternalTTLCompGroupA', + Condition => '$$self{FlashControlBuiltin} == 3', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 28.1 => { # CSe3-dc + Name => 'CommanderInternalTTLCompGroupB', + Condition => '$$self{FlashControlBuiltin} == 3', + Mask => 0x1f, + ValueConv => '($val - 9) / 3', + ValueConvInv => '$val * 3 + 9', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 30.1 => { # CSd11 + Name => 'FlashWarning', + Mask => 0x80, + PrintConv => \%onOff, + }, + 30.2 => { # CSe4 + Name => 'ModelingFlash', + Mask => 0x20, + PrintConv => \%onOff, + }, + 34.1 => { # CSa8-b + Name => 'LiveViewAFAreaMode', + Mask => 0x60, + PrintConv => { + 0 => 'Face-Priority', + 1 => 'NormalArea', + 2 => 'WideArea', + 3 => 'SubjectTracking', + }, + }, + 34.2 => { # CSa8-a + Name => 'LiveViewAFMode', + Mask => 0x02, + PrintConv => { + 0 => 'AF-C', + 1 => 'AF-F', + }, + }, + 35.1 => { # CSc4-a + Name => 'PlaybackMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '10 s', # default + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, +); + +# D4/D4S custom settings (ref 1, decoded from D4S) +%Image::ExifTool::NikonCustom::SettingsD4 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the D4 and D4S.', + 0.1 => { + Name => 'CustomSettingsBank', + Mask => 0x03, + PrintConv => { + 0 => 'A', + 1 => 'B', + 2 => 'C', + 3 => 'D', + }, + }, + 1.1 => { #CSa1 + Name => 'AF-CPrioritySelection', + Mask => 0xc0, + PrintConv => { + 0 => 'Release', + 1 => 'Release + Focus', + 2 => 'Focus', + 3 => 'Focus + Release', + }, + }, + 1.2 => { # CSa2 + Name => 'AF-SPrioritySelection', + Mask => 0x20, + PrintConv => { + 0 => 'Focus', + 1 => 'Release', + }, + }, + 1.3 => { # CSa7 + Name => 'AFPointSelection', + Mask => 0x10, + PrintConv => { + 0 => '51 Points', + 1 => '11 Points', + }, + }, + 1.4 => { # CSa3 + Name => 'FocusTrackingLockOn', + Mask => 0x07, + PrintConv => { + 0 => 'Off', + 1 => '1 (Short)', + 2 => '2', + 3 => '3 (Normal)', + 4 => '4', + 5 => '5 (Long)', + }, + }, + 2.1 => { # CSa4 + Name => 'AFActivation', + Mask => 0x80, + PrintConv => { + 0 => 'Shutter/AF-On', + 1 => 'AF-On Only', + }, + }, + 2.2 => { # CSa6 + Name => 'FocusPointWrap', + Mask => 0x08, + PrintConv => { + 0 => 'No Wrap', + 1 => 'Wrap', + }, + }, + 4.1 => { # CSd1-b + Name => 'Pitch', + Mask => 0x40, + PrintConv => { 0 => 'High', 1 => 'Low' }, + }, + 4.2 => { # CSf12 + Name => 'NoMemoryCard', + Mask => 0x20, + PrintConv => { + 0 => 'Release Locked', + 1 => 'Enable Release', + }, + }, + 4.3 => { # CSd6 + Name => 'GridDisplay', + Mask => 0x02, + PrintConv => \%onOff, + }, + 5.1 => { # CSd9 + Name => 'ShootingInfoDisplay', + Mask => 0xc0, + PrintConv => { + # 0 - seen for D4 (PH) + 1 => 'Auto', + 2 => 'Manual (dark on light)', + 3 => 'Manual (light on dark)', + }, + }, + 5.2 => { # CSd10 + Name => 'LCDIllumination', + Mask => 0x20, + PrintConv => \%offOn, + }, + 5.3 => { # CSd8 + Name => 'ScreenTips', + Mask => 0x04, + PrintConv => \%offOn, + }, + 5.4 => { # CSd1-a + Name => 'Beep', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Medium', + 3 => 'High', + }, + }, + 6.1 => { # CSf13 + Name => 'ReverseIndicators', + Mask => 0x80, + PrintConv => { + 0 => '+ 0 -', + 1 => '- 0 +', + }, + }, + 6.2 => { # CSd7-a + Name => 'RearDisplay', + Mask => 0x40, + PrintConv => { + 0 => 'ISO', + 1 => 'Exposures Remaining', + }, + }, + 6.3 => { # CSd7-b + Name => 'ViewfinderDisplay', + Mask => 0x20, + PrintConv => { + 0 => 'Frame Count', + 1 => 'Exposures Remaining', + }, + }, + 6.4 => { # CSd10-a + Name => 'CommandDialsReverseRotation', + Mask => 0x18, + PrintConv => { + 0 => 'No', + 1 => 'Shutter Speed & Aperture', + 2 => 'Exposure Compensation', + 3 => 'Exposure Compensation, Shutter Speed & Aperture', + }, + }, + 6.5 => { # CSb4 + Name => 'EasyExposureCompensation', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On (auto reset)', + }, + }, + 7.1 => { # CSb2 + Name => 'ExposureControlStepSize', + Mask => 0xc0, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 7.2 => { # CSb1 + Name => 'ISOStepSize', + Mask => 0x30, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 7.3 => { # CSb3 + Name => 'ExposureCompStepSize', + Mask => 0x0c, + PrintConv => { + 0 => '1/3 EV', + 1 => '1/2 EV', + 2 => '1 EV', + }, + }, + 8.1 => { # CSb6 (CSb5 for D4) + Name => 'CenterWeightedAreaSize', + Mask => 0xe0, + PrintConv => { + 0 => '8 mm', + 1 => '12 mm', + 2 => '15 mm', + 3 => '20 mm', + 4 => 'Average', + }, + }, + 8.2 => { # CSb7-a + Name => 'FineTuneOptMatrixMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.1 => { # CSb7-b + Name => 'FineTuneOptCenterWeighted', + Mask => 0xf0, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 9.2 => { # CSb7-c + Name => 'FineTuneOptSpotMetering', + Mask => 0x0f, + ValueConv => '($val > 0x7 ? $val - 0x10 : $val) / 6', + ValueConvInv => 'int($val*6+($val>0?0.5:-0.5))', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 10.1 => { # CSf1-a + Name => 'MultiSelectorShootMode', + Mask => 0xc0, + PrintConv => { + 0 => 'Select Center Focus Point (Reset)', + 2 => 'Preset Focus Point (Pre)', + 3 => 'Not Used (None)', + }, + }, + 10.2 => { # CSf1-b + Name => 'MultiSelectorPlaybackMode', + Mask => 0x30, + PrintConv => { + 0 => 'Thumbnail On/Off', + 1 => 'View Histograms', + 2 => 'Zoom On/Off', + 3 => 'Choose Folder', + }, + }, + 10.3 => { # CSf2 + Name => 'MultiSelector', + Mask => 0x01, + PrintConv => { + 0 => 'Do Nothing', + 1 => 'Reset Meter-off Delay', + }, + }, + 11.1 => { # CSd4 + Name => 'ExposureDelayMode', + Mask => 0xc0, + PrintConv => { + 0 => 'Off', + 1 => '1 s', + 2 => '2 s', + 3 => '3 s', + }, + }, + 11.2 => { # CSd2-a + Name => 'CHModeShootingSpeed', + Mask => 0x10, + PrintConv => { + 0 => '10 fps', + 1 => '11 fps', + }, + }, + 11.3 => { # CSd2-b + Name => 'CLModeShootingSpeed', + Mask => 0x0f, + PrintConv => '"$val fps"', + PrintConvInv => '$val=~s/\s*fps//i; $val', + }, + 12 => { # CSd3 + Name => 'MaxContinuousRelease', + # values: 1-200 + }, + 13.1 => { # CSe6 + Name => 'AutoBracketSet', + Mask => 0xe0, + PrintConv => { + 0 => 'AE & Flash', + 1 => 'AE Only', + 2 => 'Flash Only', + 3 => 'WB Bracketing', + 4 => 'Active D-Lighting', + }, + }, + 13.2 => { # CSe8 + Name => 'AutoBracketOrder', + Mask => 0x10, + PrintConv => { + 0 => '0,-,+', + 1 => '-,0,+', + }, + }, + 13.3 => { # CSe7 + Name => 'AutoBracketModeM', + Mask => 0x0c, + PrintConv => { + 0 => 'Flash/Speed', + 1 => 'Flash/Speed/Aperture', + 2 => 'Flash/Aperture', + 3 => 'Flash Only', + }, + }, + 14.1 => { # CSf3-a + Name => 'FuncButton', + Mask => 0xf8, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 18 => 'My Menu', + 20 => 'Grid Display', + 21 => 'Disable Synchronized Release', + 22 => 'Remote Release Only', + 26 => 'Flash Disable/Enable', + }, + }, + 14.2 => { # CSf3-b + Name => 'FuncButtonPlusDials', + Mask => 0x07, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (FX/DX/5:4)', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 6 => 'Shooting Bank Menu', + }, + }, + 15.1 => { # CSf4-a + Name => 'PreviewButton', + Mask => 0xf8, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 18 => 'My Menu', + 20 => 'Grid Display', + 21 => 'Disable Synchronized Release', + 22 => 'Remote Release Only', + 26 => 'Flash Disable/Enable', + }, + }, + 15.2 => { # CSf4-b + Name => 'PreviewButtonPlusDials', + Mask => 0x07, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (FX/DX/5:4)', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 6 => 'Shooting Bank Menu', + }, + }, + 16.1 => { # CSf9 + Name => 'AssignBktButton', + Mask => 0x07, + PrintConv => { + 0 => 'Auto Bracketing', + 1 => 'Multiple Exposure', + 2 => 'HDR (high dynamic range)', + 3 => 'None', + }, + }, + 18.1 => { # CSf10-b + Name => 'CommandDialsChangeMainSub', + Mask => 0xe0, + PrintConv => { + 0 => 'Autofocus Off, Exposure Off', + 1 => 'Autofocus Off, Exposure On', + 2 => 'Autofocus Off, Exposure On (Mode A)', + 4 => 'Autofocus On, Exposure Off', + 5 => 'Autofocus On, Exposure On', + 6 => 'Autofocus On, Exposure On (Mode A)', + }, + }, + 18.2 => { # CSf10-d + Name => 'CommandDialsMenuAndPlayback', + Mask => 0x18, + PrintConv => { + 0 => 'On', + 1 => 'Off', + 2 => 'On (Image Review Excluded)', + }, + }, + 18.3 => { # CSf10-c + Name => 'CommandDialsApertureSetting', + Mask => 0x04, + PrintConv => { + 0 => 'Sub-command Dial', + 1 => 'Aperture Ring', + }, + }, + 18.4 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + Mask => 0x02, + PrintConv => \%offOn, + }, + 18.5 => { # CSf11 + Name => 'ReleaseButtonToUseDial', + Mask => 0x01, + PrintConv => \%noYes, + }, + 19.1 => { # CSc2 + Name => 'StandbyTimer', + Mask => 0xf0, + PrintConv => { + 0 => '4 s', + 1 => '6 s', + 3 => '10 s', + 5 => '30 s', + 6 => '1 min', + 7 => '5 min', + 8 => '10 min', + 9 => '30 min', + }, + }, + 20.1 => { # CSc3-a + Name => 'SelfTimerTime', + Mask => 0xc0, + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 20.2 => { # CSc3-b + Name => 'SelfTimerShotCount', + Mask => 0x0f, + }, + 20.3 => { # CSc3-c + Name => 'SelfTimerShotInterval', + Mask => 0x30, + PrintConv => { + 0 => '0.5 s', + 1 => '1 s', + 2 => '2 s', + 3 => '3 s', + }, + }, + 21.1 => { # CSc4-d + Name => 'ImageReviewMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '2 s', + 1 => '4 s', + 2 => '10 s', + 3 => '20 s', + 4 => '1 min', + 5 => '5 min', + 6 => '10 min', + + }, + }, + 21.2 => { # CSc4-e + Name => 'LiveViewMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 0 => '5 min', + 1 => '10 min', + 2 => '15 min', + 3 => '20 min', + 4 => '30 min', + 5 => 'No Limit', + }, + }, + 22.1 => { # CSc4-b + Name => 'MenuMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 22.2 => { # CSc4-c + Name => 'ShootingInfoMonitorOffTime', + Mask => 0x1c, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 23.1 => { # CSe1 + Name => 'FlashSyncSpeed', + Mask => 0xf0, + PrintConv => { + # 0x00 - seen for D4 (PH) + 1 => '1/250 s (auto FP)', + 2 => '1/250 s', + 3 => '1/200 s', + 4 => '1/160 s', + 5 => '1/125 s', + 6 => '1/100 s', + 7 => '1/80 s', + 8 => '1/60 s', + }, + }, + 23.2 => { # CSe2 + Name => 'FlashShutterSpeed', + Mask => 0x0f, + PrintConvColumns => 2, + PrintConv => { + 0 => '1/60 s', + 1 => '1/30 s', + 2 => '1/15 s', + 3 => '1/8 s', + 4 => '1/4 s', + 5 => '1/2 s', + 6 => '1 s', + 7 => '2 s', + 8 => '4 s', + 9 => '8 s', + 10 => '15 s', + 11 => '30 s', + }, + }, + 31.1 => { # CSe5 + Name => 'ModelingFlash', + Mask => 0x20, + PrintConv => \%onOff, + }, + 36.1 => { # CSc4-a + Name => 'PlaybackMonitorOffTime', + Mask => 0xe0, + PrintConv => { + 0 => '4 s', + 1 => '10 s', + 2 => '20 s', + 3 => '1 min', + 4 => '5 min', + 5 => '10 min', + }, + }, + 37.1 => { # CSf15 + Name => 'PlaybackZoom', + Mask => 0x01, + PrintConv => { + 0 => 'Use Separate Zoom Buttons', + 1 => 'Use Either Zoom Button with Command Dial', + }, + }, + 38.1 => { # CSf8-a + Name => 'ShutterSpeedLock', + Mask => 0x80, + PrintConv => \%offOn, + }, + 38.2 => { # CSf8-b + Name => 'ApertureLock', + Mask => 0x40, + PrintConv => \%offOn, + }, + 38.3 => { # CSg4 + Name => 'MovieShutterButton', + Mask => 0x30, + PrintConv => { + 0 => 'Take Photo', + 1 => 'Record Movies', + 2 => 'Live Frame Grab', + }, + }, + 38.4 => { # CSe4 + Name => 'FlashExposureCompArea', + Mask => 0x04, + PrintConv => { + 0 => 'Entire frame', + 1 => 'Background only', + }, + }, + 41.1 => { # CSg1-a + Name => 'MovieFunctionButton', + Mask => 0x70, + PrintConv => { + 0 => 'None', + 1 => 'Power Aperture (open)', # bit '02' is also toggled on for this setting + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + }, + }, + 41.2 => { # CSg2-a + Name => 'MoviePreviewButton', + Mask => 0x07, + PrintConv => { + 0 => 'None', + 2 => 'Power Aperture (open)', # bit '10' is also toggled on for this setting + 3 => 'Index Marking', + 4 => 'View Photo Shooting Info', + }, + }, + 42.1 => { # CSf14 + Name => 'VerticalMultiSelector', + Mask => 0x60, + PrintConv => { + 0 => 'Same as Multi-Selector with Info(U/D) & Playback(R/L)', + 1 => 'Same as Multi-Selector with Info(R/L) & Playback(U/D)', + 2 => 'Focus Point Selection', + }, + }, + 42.2 => { # CSf7-a + Name => 'VerticalFuncButton', + Mask => 0x1f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 18 => 'My Menu', + 20 => 'Grid Display', + 26 => 'Flash Disable/Enable', + }, + }, + 43.1 => { # CSf7-b + Name => 'VerticalFuncButtonPlusDials', + Mask => 0xf0, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (FX/DX/5:4)', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'One Step Speed / Aperture', + 4 => 'Choose Non-CPU Lens Number', + 5 => 'Active D-Lighting', + 6 => 'Shooting Bank Menu', + 7 => 'ISO Sensitivity', + 8 => 'Exposure Mode', + 9 => 'Exposure Compensation', + 10 => 'Metering', + }, + }, + 43.2 => { # CSf16 + Name => 'AssignMovieRecordButton', + Mask => 0x07, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area (FX/DX/5:4)', + 2 => 'Shutter Speed & Aperture Lock', + 3 => 'ISO Sensitivity', + 4 => 'Shooting Bank Menu', + }, + }, + 46.1 => { # CSa5-c + Name => 'DynamicAreaAFDisplay', + Mask => 0x80, + PrintConv => \%offOn, + }, + 46.2 => { # CSa5-a + Name => 'AFPointIllumination', + Mask => 0x60, + PrintConv => { + 0 => 'Off', + 1 => 'On in Continuous Shooting Modes', + 2 => 'On During Manual Focusing', + 3 => 'On in Continuous Shooting and Manual Focusing', + }, + }, + 46.3 => { # CSa10 (D4 is slightly different -- needs checking) + Name => 'StoreByOrientation', + Mask => 0x18, + PrintConv => { + 0 => 'Off', + 1 => 'Focus Point', + 2 => 'Focus Point and AF-area mode', + }, + }, + 46.4 => { # CSa5-d + Name => 'GroupAreaAFIllumination', + Mask => 0x04, + PrintConv => { + 0 => 'Squares', + 1 => 'Dots', + }, + }, + 46.5 => { # CSa5-b + Name => 'AFPointBrightness', + Mask => 0x03, + PrintConv => { + 0 => 'Low', + 1 => 'Normal', + 2 => 'High', + 3 => 'Extra High', + }, + }, + 47.1 => { # CSa8 + Name => 'AFOnButton', + Mask => 0x70, + PrintConv => { + 0 => 'AF On', + 1 => 'AE/AF Lock', + 2 => 'AE Lock Only', + 3 => 'AE Lock (reset on release)', + 4 => 'AE Lock (hold)', + 5 => 'AF Lock Only', + 6 => 'None', + }, + }, + 47.2 => { # CSa9 + Name => 'VerticalAFOnButton', + Mask => 0x07, + PrintConv => { + 0 => 'Same as AF On', + 1 => 'AF On', + 2 => 'AE/AF Lock', + 3 => 'AE Lock Only', + 4 => 'AE Lock (reset on release)', + 5 => 'AE Lock (hold)', + 6 => 'AF Lock Only', + 7 => 'None', + }, + }, + 48.1 => { # CSf5 + Name => 'SubSelectorAssignment', + Mask => 0x80, + PrintConv => { + 0 => 'Focus Point Selection', + 1 => 'Same As Multi-selector', + }, + }, + 48.2 => { # CSg3-a + Name => 'MovieSubSelectorAssignment', + Mask => 0x07, + PrintConv => { + 0 => 'None', + 1 => 'Index Marking', + 2 => 'AE/AF Lock', + 3 => 'AE Lock Only', + 4 => 'AE Lock (hold)', + 5 => 'AF Lock Only', + 6 => 'View Photo Shooting Info', + }, + }, + 49.1 => { # CSf6-a + Name => 'SubSelector', + Mask => 0xf8, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock (hold)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + # 9 - seen for D4 (PH) + 10 => 'Bracketing Burst', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Playback', + 15 => 'My Menu Top Item', + 16 => '+NEF(RAW)', + 17 => 'Virtual Horizon', + 18 => 'My Menu', + 19 => 'Reset', # value appears to be specific to this control at this time + 20 => 'Grid Display', + 21 => 'Disable Synchronized Release', + 22 => 'Remote Release Only', + 23 => 'Preview', # value appears to be specific to this control at this time + 26 => 'Flash Disable/Enable', + }, + }, + 49.2 => { # CSf6-b + Name => 'SubSelectorPlusDials', + Mask => 0x07, + PrintConv => { + # (not all values from CSf3-b/CSf4-b are available for CSf6-b) + 0 => 'None', + 1 => 'Choose Image Area (FX/DX/5:4)', + 2 => 'Shutter Speed & Aperture Lock', + # 3 => 'One Step Speed / Aperture', # (not available) + 4 => 'Choose Non-CPU Lens Number', + # 5 => 'Active D-Lighting', # (not available) + 6 => 'Shooting Bank Menu', + }, + }, + 50.1 => { # CSb5 + Name => 'MatrixMetering', + Condition => '$$self{Model} =~ /\bD4S/', + Notes => 'D4S only', + Mask => 0x80, + PrintConv => { + 0 => 'Face Detection On', + 1 => 'Face Detection Off', + }, + }, + 50.2 => { # CSf17 + Name => 'LiveViewButtonOptions', + Condition => '$$self{Model} =~ /\bD4S/', + Notes => 'D4S only', + Mask => 0x30, + PrintConv => { + 0 => 'Enable', + 1 => 'Enable (standby time active)', + 2 => 'Disable', + }, + }, + 50.3 => { # CSa12 + Name => 'AFModeRestrictions', + Condition => '$$self{Model} =~ /\bD4S/', + Notes => 'D4S only', + Mask => 0x03, + PrintConv => { + 0 => 'Off', + 1 => 'AF-C', + 2 => 'AF-S', + }, + }, + 51.1 => { # CSa11 + Name => 'LimitAFAreaModeSelection', + Condition => '$$self{Model} =~ /\bD4S/', + Notes => 'D4S only', + Mask => 0x7e, + PrintConv => { + 0 => 'No Restrictions', + BITMASK => { + 0 => 'Auto-area', + 1 => 'Group-area', + 2 => '3D-tracking', + 3 => 'Dynamic area (51 points)', + 4 => 'Dynamic area (21 points)', + 5 => 'Dynamic area (9 points)', + }, + }, + }, + 52.1 => { # CSg1-b + Name => 'MovieFunctionButtonPlusDials', + Mask => 0x10, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + }, + }, + 52.2 => { # CSg2-b + Name => 'MoviePreviewButtonPlusDials', + Mask => 0x01, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + }, + }, + 53.1 => { # CSg3-b + Name => 'MovieSubSelectorAssignmentPlusDials', + Mask => 0x10, + PrintConv => { + 0 => 'None', + 1 => 'Choose Image Area', + }, + }, + 54.1 => { # CSf18 + Name => 'AssignRemoteFnButton', + Condition => '$$self{Model} =~ /\bD4S/', + Notes => 'D4S only', + Mask => 0x1f, + PrintConv => { + 0 => 'None', + 1 => 'Preview', + 2 => 'FV Lock', + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 5 => 'AE Lock (reset on release)', + 7 => 'AF Lock Only', + 8 => 'AF-On', + 16 => '+NEF(RAW)', + 25 => 'Live View', + 26 => 'Flash Disable/Enable', + }, + }, + 55.1 => { # CSf19 + Name => 'LensFocusFunctionButtons', + Condition => '$$self{Model} =~ /\bD4S/', + Notes => 'D4S only', + Mask => 0x3f, + PrintConv => { + 3 => 'AE/AF Lock', + 4 => 'AE Lock Only', + 7 => 'AF Lock Only', + 21 => 'Disable Synchronized Release', + 22 => 'Remote Release Only', + 24 => 'Preset focus Point', + 26 => 'Flash Disable/Enable', + 32 => 'AF-Area Mode: Single-point AF', + 33 => 'AF-Area Mode: Dynamic-area AF (9 points)', + 34 => 'AF-Area Mode: Dynamic-area AF (21 points)', + 35 => 'AF-Area Mode: Dynamic-area AF (51 points)', + 36 => 'AF-Area Mode: Group-area AF', + 37 => 'AF-Area Mode: Auto area AF', + }, + }, +); + +# Z9 custom settings (ref 1) #base at offset26 + 1035 (firmware 1.0.0) +%Image::ExifTool::NikonCustom::SettingsZ9 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + DATAMEMBER => [ 185, 529 ], + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Custom settings for the Z9.', + 1 => { + Name => 'CustomSettingsBank', + PrintConv => { + 0 => 'A', + 1 => 'B', + 2 => 'C', + 3 => 'D', + }, + }, + 3 => { # CSa1 + Name => 'AF-CPrioritySelection', + PrintConv => { + 0 => 'Release', + 1 => 'Release + Focus', + 3 => 'Focus', + }, + }, + 5 => { Name => 'AF-SPrioritySelection', PrintConv => {0 => 'Release',1 => 'Focus'}}, #CSa2 + 7 => { # CSa3-a #when AFAreaMode is 3D-tracking, blocked shot response will be 3, regardless of this setting + Name => 'BlockShotAFResponse', + PrintConv => { + 1 => '1 (Quick)', + 2 => '2', + 3 => '3 (Normal)', + 4 => '4', + 5 => '5 (Delayed)', + }, + }, + 11 => {Name => 'AFPointSel',PrintConv => { 0 => 'Use All',1 => 'Use Half' }}, # CSa4 + 13 => { # CSa5 + Name => 'StoreByOrientation', + PrintConv => { + 0 => 'Off', + 1 => 'Focus Point', + 2 => 'Focus Point and AF-area mode', + }, + }, + 15 => { Name => 'AFActivation', PrintConv => {0 => 'AF-On Only', 1 => 'Shutter/AF-On'}}, # CSa6-a + 16 => { Name => 'AF-OnOutOfFocusRelease', PrintConv => {0 => 'Disable', 1 => 'Enable'}, Unknown => 1}, # CSa6-b + 17 => { Name => 'LimitAF-AreaModeSelPinpoint', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8 + 19 => { Name => 'LimitAF-AreaModeSelWideAF_S', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8 + 20 => { Name => 'LimitAF-AreaModeSelWideAF_L', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8 + 21 => { Name => 'LimitAFAreaModeSelAuto', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8 #left out hypen to retain compatibility with tag name in NikonSettings + 22 => { Name => 'FocusPointWrap', PrintConv => { 0 => 'No Wrap', 1 => 'Wrap' }, Unknown => 1 }, # CSa10 + 23 => { Name => 'ManualFocusPointIllumination', PrintConv => {0 => 'On During Focus Point Selection Only', 1 => 'On', }, Unknown => 1 }, # CSa11a + 24 => { Name => 'DynamicAreaAFAssist', PrintConv => { 0 => 'Focus Point Only',1 => 'Focus and Surrounding Points',}, Unknown => 1 }, # CSa11b + 25 => { Name => 'AF-AssistIlluminator', PrintConv => \%offOn }, # CSa12 + 26 => { Name => 'ManualFocusRingInAFMode', PrintConv => \%offOn }, # CSa14 + 27 => { Name => 'ExposureControlStepSize', PrintConv => \%thirdHalfFull }, # CSb2 + 29 => { # CSb3 + Name => 'EasyExposureCompensation', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On (auto reset)', + }, + }, + 31 => { # CSb5 + Name => 'CenterWeightedAreaSize', + PrintConv => { + 0 => '8 mm', + 1 => '12 mm', + 4 => 'Average', + }, + }, + 33 => { # CSb6-a + Name => 'FineTuneOptMatrixMetering', + Format => 'int8s', + ValueConv => '$val / 6', + ValueConvInv => 'int($val*6)', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 35 => { # CSb6-b + Name => 'FineTuneOptCenterWeighted', + Format => 'int8s', + ValueConv => '$val / 6', + ValueConvInv => 'int($val*6)', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 37 => { # CSb6-c + Name => 'FineTuneOptSpotMetering', + Format => 'int8s', + ValueConv => '$val / 6', + ValueConvInv => 'int($val*6)', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 39 => { # CSb6-d + Name => 'FineTuneOptHighlightWeighted', + Format => 'int8s', + ValueConv => '$val / 6', + ValueConvInv => 'int($val*6)', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 41 => { # CSc1 + Name => 'ShutterReleaseButtonAE-L', + PrintConv => { + 0 => 'Off', + 1 => 'On (Half Press)', + 2 => 'On (Burst Mode)', + }, + }, + 43 => { # CSc3-a + Name => 'SelfTimerTime', + PrintConv => { + 0 => '2 s', + 1 => '5 s', + 2 => '10 s', + 3 => '20 s', + }, + }, + 45 => { Name => 'SelfTimerShotCount', }, # CSc3-b 1-9 + 49 => { # CSc3-c + Name => 'SelfTimerShotInterval', + PrintConv => { + 0 => '0.5 s', + 1 => '1 s', + 2 => '2 s', + 3 => '3 s', + }, + }, + 51 => { Name => 'PlaybackMonitorOffTime', PrintConv => \%powerOffDelayTimesZ9 }, # CSc4-a + 53 => { Name => 'MenuMonitorOffTime', PrintConv => \%powerOffDelayTimesZ9 }, # CSc4-b + 55 => { Name => 'ShootingInfoMonitorOffTime',PrintConv => \%powerOffDelayTimesZ9 }, # CSc4-c + 57 => { Name => 'ImageReviewMonitorOffTime', PrintConv => \%powerOffDelayTimesZ9 }, # CSc4-d + 59 => { Name => 'CLModeShootingSpeed', ValueConv => '$val + 1', ValueConvInv => '$val - 1', PrintConv => '"$val fps"', PrintConvInv => '$val=~s/\s*fps//i; $val' }, # CSd1b + 61 => { # CSd2 # values: 1-200 & 'No Limit' + Name => 'MaxContinuousRelease', + Format => 'int16s', + ValueConv => '($val = -1 ? \'No Limit\' : $val ) ', + }, + 65 => { Name => 'SyncReleaseMode', PrintConv => { 0 => 'No Sync', 1 => 'Sync' }, Unknown => 1 }, # CSd4 + 69 => { Name => 'LimitSelectableImageAreaDX', PrintConv => \%limitNolimit, Unknown => 1 }, # CSd6-1 + 70 => { Name => 'LimitSelectableImageArea1To1', PrintConv => \%limitNolimit, Unknown => 1 }, # CSd6-2 + 71 => { Name => 'LimitSelectableImageArea16To9', PrintConv => \%limitNolimit, Unknown => 1 }, # CSd6-3 + 72 => { Name => 'FileNumberSequence', PrintConv => \%offOn }, # CSd7 + 73 => { #CSa13b + Name => 'FocusPeakingLevel', + Unknown => 1, + PrintConv => { + 0 => 'High Sensitivity', + 1 => 'Standard Sensitivity', + 2 => 'Low Sensitivity', + }, + }, + 75 => { #CSa13c + Name => 'FocusPeakingHighlightColor', + Unknown => 1, + PrintConv => { + 0 => 'Red', + 1 => 'Yellow', + 2 => 'Blue', + 3 => 'White', + }, + }, + 81 => { Name => 'ContinuousModeDisplay', PrintConv => \%offOn }, # CSd12 + 83 => { # CSe1-a Previous cameras reported this with HighSpeedSync indicator appended as '(Auto FP)'. Z9 separated the 2 fields. + Name => 'FlashSyncSpeed', + ValueConv => '($val-144)/8', + PrintConv => { + 0 => '1/60 s', + 1 => '1/80 s', + 2 => '1/100 s', + 3 => '1/125 s', + 4 => '1/160 s', + 5 => '1/200 s', + 6 => '1/250 s', + }, + }, + 85 => { Name => 'HighSpeedSync', PrintConv => \%offOn }, # CSe1-b + 87 => { # CSe2 + Name => 'FlashShutterSpeed', + ValueConv => 'my $t = ($val - 16) % 24; $t ? $val / 24 : 2 + ($val - 16) / 24', #unusual decode perhaps due to need to accomodate 4 new values? + PrintConv => { + 0 => '1 s', + 1 => '1/2 s', + 2 => '1/4 s', + 3 => '1/8 s', + 4 => '1/15 s', + 5 => '1/30 s', + 6 => '1/60 s', + 7 => '30 s', + 8 => '15 s', + 9 => '8 s', + 10 => '4 s', + 11 => '2 s', + }, + }, + 89 => { Name => 'FlashExposureCompArea', PrintConv => { 0 => 'Entire Frame', 1 => 'Background Only' } }, # CSe3 + 91 => { Name => 'AutoFlashISOSensitivity', PrintConv => { 0 => 'Subject and Background',1 => 'Subject Only'} }, # CSe4 + 93 => { Name => 'ModelingFlash', PrintConv => \%offOn }, # CSe5 + 95 => { # CSe6 + Name => 'AutoBracketModeM', + PrintConv => { + 0 => 'Flash/Speed', + 1 => 'Flash/Speed/Aperture', + 2 => 'Flash/Aperture', + 3 => 'Flash Only', + 4 => 'Flash/ISO', + }, + }, + 97 => { Name => 'AutoBracketOrder', PrintConv => { 0 => '0,-,+',1 => '-,0,+' } }, # CSe7 + 99 => { Name => 'Func1Button', PrintConv => \%buttonsZ9}, # CSf2-a + #101 Func1Button submenu: Preview 0 => 'Press To Recall', 1=> 'Hold To Recall' # CSf2-a + #103 Func1Button submenu: AreaMode 0-7 => S, Dyn-S, Dyn-M, Dyn-L, Wide-S, Wide-L, 3D, Auto; 11=>n/a # CSf2-a + #105 Func1Button submenu: AreaMode+AF-On 0-7 => S, Dyn-S, Dyn-M, Dyn-L, Wide-S, Wide-L, 3D, Auto; 11=>n/a # CSf2-a + #109 Func1Button submenu: SynchronizedRelease 1=>'Master', 2=>'Remote' # CSf2-a + #111 Func1Button submenu: Zoom 0=>'Zoom (Low)', 2=>'Zoom (1:1)', 2=>'Zoom (High)' # CSf2-a + #113 Func1Button & Func1ButtonPlayback submenu: Rating # CSf2-a & CSf3a 0=>'Candidate For Deletion' 6=>''None' + 115 => { Name => 'Func2Button', PrintConv => \%buttonsZ9}, # CSf2-b + #117 Func2Button submenu: Preview 0 => 'Press To Recall', 1=> 'Hold To Recall' # CSf2-b + #119 Func2Button submenu: AreaMode 0-7 => S, Dyn-S, Dyn-M, Dyn-L, Wide-S, Wide-L, 3D, Auto; 11=>n/a # CSf2-b + #121 Func2Button submenu: AreaMode+AF-On 0-7 => S, Dyn-S, Dyn-M, Dyn-L, Wide-S, Wide-L, 3D, Auto; 11=>n/a # CSf2-b + #125 Func2Button submenu: SynchronizedRelease 1=>'Master', 2=>'Remote' # CSf2-b + #127 Func2Button submenu: Zoom 0=>'Zoom (Low)', 2=>'Zoom (1:1)', 2=>'Zoom (High)' # CSf2-b + #129 Func2Button & Func2ButtonPlayback submenu: Rating # CSf2-b & CSf3b 0=>'Candidate For Deletion' 6=>''None' + 131 => { Name => 'AFOnButton', PrintConv => \%buttonsZ9}, # CSf2-c + 143 => { Name => 'SubSelector', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf2-g + 155 => { Name => 'AssignMovieRecordButton', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf2-m + 159 => { Name => 'LensFunc1Button', PrintConv => \%buttonsZ9}, # CSf2-o + 167 => { Name => 'LensFunc2Button', PrintConv => \%buttonsZ9}, # CSf2-p + 173 => { # CSf2-q + Name => 'LensControlRing', + PrintConv => { + 0 => 'None (Disabled)', + 1 => 'Focus (M/A)', + 2 => 'ISO Sensitivity', + 3 => 'Exposure Compensation', + 4 => 'Aperture', + }, + }, + 175 => { Name => 'MultiSelectorShootMode', PrintConv => \%buttonsZ9}, # CSf2-h called the OK button in camera, tag name retained for compatibility + 179 => { Name => 'MultiSelectorPlaybackMode', PrintConv => \%buttonsZ9}, # CSf3f + 183 => { Name => 'ShutterSpeedLock', PrintConv => \%offOn }, # CSf4-a + 184 => { Name => 'ApertureLock', PrintConv => \%offOn }, # CSf4-b + 185 => { # CSf5-a Previous cameras reported this tag as part of CmdDialsReverseRotation. Blend with CSf5-b separate settings together to match extant tag name and values + Name => 'CmdDialsReverseRotExposureComp', + RawConv => '$$self{CmdDialsReverseRotExposureComp} = $val', + Hidden => 1, + }, + 186 => [{ # CSf5-a (continued from above) + Name => 'CmdDialsReverseRotation', + Condition => '$$self{CmdDialsReverseRotExposureComp} == 0', + PrintConv => { + 0 => 'No', + 1 => 'Shutter Speed & Aperture', + }, + },{ + Name => 'CmdDialsReverseRotation', + PrintConv => { + 0 => 'Exposure Compensation', + 1 => 'Exposure Compensation, Shutter Speed & Aperture', + }, + }], + 191 => { Name => 'UseDialWithoutHold', PrintConv => \%offOn, Unknown => 1 }, # CSf6 + 193 => { Name => 'ReverseIndicators', PrintConv => { 0 => '+ 0 -', 1 => '- 0 +' }, Unknown => 1 }, # CSf7 + 195 => { Name => 'MovieFunc1Button', PrintConv => \%buttonsZ9}, # CSg2-a + 203 => { Name => 'MovieAF-OnButton', PrintConv => \%buttonsZ9}, # CSg2-f + 217 => { Name => 'MovieMultiSelector', PrintConv => \%buttonsZ9, Unknown => 1}, # CSg2-h + 221 => { Name => 'MovieAFSpeed', ValueConv => '$val - 5', ValueConvInv => '$val + 6' }, # CSg6-a + 223 => { Name => 'MovieAFSpeedApply', rintConv => {0 => 'Always', 1 => 'Only During Recording'},}, # CSg6-b + 225 => { # CSg7 + Name => 'MovieAFTrackingSensitivity', + PrintConv => { + 0 => '1 (High)', + 1 => '2', + 2 => '3', + 3 => '4 (Normal)', + 4 => '5', + 5 => '6', + 6 => '7 (Low)', + }, + }, + 257 => { Name => 'LCDIllumination', PrintConv => \%offOn, Unknown => 1 }, # CSd11 + 258 => { Name => 'ExtendedShutterSpeeds', PrintConv => \%offOn }, # CSd5 + 259 => { Name => 'SubjectMotion', PrintConv => {0 => 'Erratic', 1 => 'Steady'} }, # CSa3-b + 261 => { Name => 'FocusPointPersistence', PrintConv => {0 => 'Auto', 1 => 'Off'} }, # CSa7 + 263 => { Name => 'AutoFocusModeRestrictions', PrintConv => \%focusModeRestrictionsZ9, Unknown => 1}, # CSa9 + 267 => { Name => 'CHModeShootingSpeed', ValueConv => '$val + 1', ValueConvInv => '$val - 1', PrintConv => '"$val fps"', PrintConvInv => '$val=~s/\s*fps//i; $val' }, # CSd1a + 269.1 => { Name => 'LimitReleaseModeSelCL', Mask => 0x02, PrintConv => \%limitNolimit, Unknown => 1 }, # CSd3-a + 269.2 => { Name => 'LimitReleaseModeSelCH', Mask => 0x04, PrintConv => \%limitNolimit, Unknown => 1 }, # CSd3-b + 269.3 => { Name => 'LimitReleaseModeSelC30', Mask => 0x10, PrintConv => \%limitNolimit, Unknown => 1 }, # CSd3-e + 269.4 => { Name => 'LimitReleaseModeSelC120', Mask => 0x40, PrintConv => \%limitNolimit, Unknown => 1 }, # CSd3-c + 269.5 => { Name => 'LimitReleaseModeSelSelf', Mask => 0x80, PrintConv => \%limitNolimit, Unknown => 1 }, # CSd3-d + 273 => { Name => 'FlashBurstPriority', PrintConv => { 0 => 'Frame Rate',1 => 'Exposure'}, Unknown => 1 }, # CSe8 + 277 => { Name => 'VerticalFuncButton', PrintConv => \%buttonsZ9}, # CSf2-c + 281 => { Name => 'Func3Button', PrintConv => \%buttonsZ9}, # CSf2-c + 285 => { Name => 'VerticalAFOnButton', PrintConv => \%buttonsZ9}, # CSf2-l + 293 => { Name => 'VerticalMultiSelectorPlaybackMode', PrintConv => { 0 => 'Image Scroll L/R', 1 => 'Image Scroll Up/Down' }, Unknown => 1}, # CSf3-j + 295 => { Name => 'MovieFunc3Button', PrintConv => \%buttonsZ9}, # CSg2-c + 335 => { Name => 'LimitAF-AreaModeSelDynamic_S', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8 + 336 => { Name => 'LimitAF-AreaModeSelDynamic_M', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8 + 337 => { Name => 'LimitAF-AreaModeSelDynamic_L', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8 + 339 => { Name => 'LimitAF-AreaModeSel3DTracking', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8 + 341 => { Name => 'PlaybackFlickUp', PrintConv => \%flicksZ9, Unknown => 1}, # CSf11-a + 345 => { Name => 'PlaybackFlickDown', PrintConv => \%flicksZ9, Unknown => 1}, # CSf11-b + 349 => { Name => 'ISOStepSize', PrintConv => \%thirdHalfFull }, # CSb1 + 355 => { Name => 'ReverseFocusRing', PrintConv => { 0 => 'Not Reversed', 1 => 'Reversed' } }, # CSf8 + 356 => { Name => 'EVFImageFrame', PrintConv => \%offOn, Unknown => 1 }, # CSd14 + 357 => { Name => 'EVFGrid', PrintConv => \%evfGridsZ9, Unknown => 1 }, # CSd15 + 359 => { Name => 'VirtualHorizonStyle', PrintConv => {0 => 'Type A (Cockpit)', 1 => 'Type B (Sides)' }, Unknown => 1}, #CSd16 + 373 => { Name => 'Func4Button', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf2-e + 379 => { Name => 'AudioButton', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf2-i + 381 => { Name => 'QualityButton', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf2-j + 399 => { Name => 'VerticalMultiSelector', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf2-k + 421 => { Name => 'Func1ButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-a + 423 => { Name => 'Func2ButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-b + 425 => { Name => 'Func3ButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-c + 431 => { Name => 'Func4ButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-e + 437 => { Name => 'MovieRecordButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-m + 439 => { Name => 'VerticalFuncButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-d + 441 => { Name => 'AudioButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-g + 447 => { Name => 'QualityButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-h + 467 => { Name => 'FocusPointLock', PrintConv => \%offOn, Unknown => 1}, # CSf4-c + 453 => { Name => 'WhiteBalanceButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-i + 459 => { Name => 'CommandDialPlaybackMode', PrintConv => \%dialsZ9, Unknown => 1}, # CSf3-k + 463 => { Name => 'SubCommandDialPlaybackMode', PrintConv => \%dialsZ9, Unknown => 1}, # CSf3-l + 469 => { Name => 'ControlRingResponse', PrintConv => { 0 => 'High', 1 => 'Low' } }, # CSf10 + 481 => { Name => 'VerticalMovieFuncButton', PrintConv => \%buttonsZ9, Unknown => 1}, # CSg2-d + 505 => { Name => 'VerticalMovieAFOnButton', PrintConv => \%buttonsZ9, Unknown => 1}, # CSg2-l + 515 => { Name => 'MovieAFAreaMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSg2-e + #521 => { Name => 'MovieLimitAF-AreaModeSelWideAF_S', PrintConv => \%limitNolimit, Unknown => 1 }, # CSg4-a + #522 => { Name => 'MovieLimitAF-AreaModeSelWideAF_W', PrintConv => \%limitNolimit, Unknown => 1 }, # CSg4-b + #523 => { Name => 'MovieLimitAF-AreaModeSelSubjectTrack', PrintConv => \%limitNolimit, Unknown => 1 }, # CSg4-c + #524 => { Name => 'MovieLimitAFAreaModeSelAuto', PrintConv => \%limitNolimit, Unknown => 1 }, # CSg4-d + #525 => { Name => 'MovieAutoFocusModeRestrictions', PrintConv => \%focusModeRestrictionsZ9, Unknown => 1}, # CSa9 + 527 => { Name => 'HDMIViewAssist', PrintConv => \%offOn, Unknown => 1 }, # CSg8 + 529 => { # CSg9-a + Name => 'ZebraPatternToneRange', + Unknown => 1, + RawConv => '$$self{ZebraPatternToneRange} = $val', + PrintConv => { + 0 => 'Off', + 1 => 'Highlights', + 2 => 'Midtones', + }, + }, + 531 => { Name => 'MovieZebraPattern', Condition => '$$self{ZebraPatternToneRange} and $$self{ZebraPatternToneRange} != 0', PrintConv => {0 => 'Pattern 1', 1 => 'Pattern 2'}, Unknown => 1}, # CSg9-b + 533 => { Name => 'MovieHighlightDisplayThreshold', Condition => '$$self{ZebraPatternToneRange} and $$self{ZebraPatternToneRange} == 1', Unknown => 1 }, # CSg9-c 120-25 when highlights are the selected tone range + 535 => { Name => 'MovieMidtoneDisplayValue', Condition => '$$self{ZebraPatternToneRange} and $$self{ZebraPatternToneRange} == 2', Unknown => 1 }, # CSg9-d1 when midtones are the selected tone range + 537 => { Name => 'MovieMidtoneDisplayRange', Condition => '$$self{ZebraPatternToneRange} and $$self{ZebraPatternToneRange} == 2', PrintConv => '"+/-$val"', Unknown => 1 }, # CSg9-d1 when midtones are the selected tone range + #539 CS g-10 LimitZebraPatternToneRange 0=>'No Restrictions', 1=> 'Highlights', 2=> 'Midtones' + 541 => { Name => 'MovieEVFGrid', PrintConv => \%evfGridsZ9, Unknown => 1 }, # CSg11 + 549 => { Name => 'MovieShutterSpeedLock', PrintConv => \%offOn, Unknown => 1}, # CSg4-a + 550 => { Name => 'MovieFocusPointLock', PrintConv => \%offOn, Unknown => 1}, # CSf4-c + 563 => { Name => 'MatrixMetering', PrintConv => { 0 => 'Face Detection Off', 1 => 'Face Detection On' }, Unknown => 1 }, # CSb4 + 564 => { Name => 'AF-CFocusDisplay', PrintConv => \%offOn }, # CSa11c + 565 => { Name => 'FocusPeakingDisplay', PrintConv => \%offOn, Unknown => 1}, # CSa13a + 567 => { # CSb7 + Name => 'KeepExposure', + PrintConv => { + 0 => 'Off', + 1 => 'Shutter Speed', + 2 => 'ISO', + }, + }, + #569 CDd8 (adjust viewfinder/monitor hue, brightness and/or white balance settings) 0=>'No adjustment', 1=>'Adjust'. Related ontrols & adjustments stored in following dozen bytes or so. + 585 => { Name => 'StarlightView', PrintConv => \%offOn, Unknown => 1 }, # CSd9 + 587 => { # CSd10-a + Name => 'EVFWarmDisplayMode', + Unknown => 1, + PrintConv => { + 0 => 'Off', + 1 => 'Mode 1', + 2 => 'Mode 2', + }, + }, + 589 => { # CSd10-b values in range -3 to +3 + Name => 'EVFWarmDisplayBrightness', + Format => 'int8s', + Unknown => 1, + }, + 591 => { #CSd13 + Name => 'EVFReleaseIndicator', + Unknown => 1, + PrintConv => { + 0 => 'Off', + 1 => 'Type A (Dark)', + 2 => 'Type B (Border)', + 3 => 'Type C (Sides)', + }, + }, + 601 => { Name => 'MovieApertureLock', PrintConv => \%offOn, Unknown => 1 }, # CSg4-b + 607 => { Name => 'FlickAdvanceDirection', PrintConv => { 0 => 'Left to Right', 1 => 'Right to Left' }, Unknown => 1 }, # CSf11-c +); + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::NikonCustom - Read and Write Nikon custom settings + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +The Nikon custom functions are very specific to the camera model (and +sometimes even change with firmware version). The information is stored as +unformatted binary data in the ShotInfo record of the Nikon MakerNotes. +This module contains the definitions necessary for Image::ExifTool to decode +this information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Jens Duttke and Warren Hatch for their help decoding the D300, D3 +and Z9 custom settings. And thanks to the customer service personnel at +Best Buy for not bugging me while I spent lots of time playing with their +cameras. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Nikon Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/NikonSettings.pm b/lib/Image/ExifTool/NikonSettings.pm new file mode 100644 index 0000000..8621a9c --- /dev/null +++ b/lib/Image/ExifTool/NikonSettings.pm @@ -0,0 +1,2093 @@ +#------------------------------------------------------------------------------ +# File: NikonSettings.pm +# +# Description: Read Nikon user settings +# +# Revisions: 2021/01/08 - Warren Hatch Created +# 2021/01/12 - PH Created ProcessNikonSettings() to extract tags +# by ID instead of using fixed offsets +# +# References: 1) Warren Hatch private communication (D6 and Z7_2) +# +#------------------------------------------------------------------------------ + +package Image::ExifTool::NikonSettings; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.07'; + +sub ProcessNikonSettings($$$); + +my %enableDisable = ( 1 => 'Enable', 2 => 'Disable' ); + +my %funcButtonZ7m2 = ( + 1 => 'AF-On', + 2 => 'AF Lock Only', + 3 => 'AE Lock (hold)', + 4 => 'AE Lock (reset on release)', + 5 => 'AE Lock Only', + 6 => 'AE/AF Lock', + 7 => 'FV Lock', + 8 => 'Flash Disable/Enable', + 9 => 'Preview', + 10 => 'Matrix Metering', + 11 => 'Center-weighted Metering', + 12 => 'Spot Metering', + 13 => 'Highlight-weighted Metering', + 14 => 'Bracketing Burst', + 15 => 'Synchronized Release (Master)', + 16 => 'Synchronized Release (Remote)', # no settings map to 17 or 18 + 19 => '+NEF(RAW)', + 20 => 'Subject Tracking', + 21 => 'Silent Photography', + 22 => 'LiveView Info Display On/Off', + 23 => 'Grid Display', + 24 => 'Zoom (Low)', + 25 => 'Zoom (1:1)', + 26 => 'Zoom (High)', + 27 => 'My Menu', + 28 => 'My Menu Top Item', + 29 => 'Playback', + 30 => 'Protect', + 31 => 'Image Area', + 32 => 'Image Quality', + 33 => 'White Balance', + 34 => 'Picture Control', + 35 => 'Active-D Lighting', + 36 => 'Metering', + 37 => 'Flash Mode', + 38 => 'Focus Mode', + 39 => 'Auto Bracketing', + 40 => 'Multiple Exposure', + 41 => 'HDR', + 42 => 'Exposure Delay Mode', + 43 => 'Shutter/Aperture Lock', + 44 => 'Focus Peaking', + 45 => 'Rating 0', + 46 => 'Rating 5', + 47 => 'Rating 4', + 48 => 'Rating 3', + 49 => 'Rating 2', + 50 => 'Rating 1', # no settings map to x'51 (possibly intended for 'Candidate for Delection' + 52 => 'Non-CPU Lens', + 52 => 'None', +); + +my %flickUpDownD6 = ( + 1 => 'Rating', + 2 => 'Select To Send', + 3 => 'Protect', + 4 => 'Voice Memo', + 5 => 'None', +); + +my %flickUpDownRatingD6 = ( + 1 => 'Rating 5', + 2 => 'Rating 4', + 3 => 'Rating 3', + 4 => 'Rating 2', + 5 => 'Rating 1', + 6 => 'Candidate for Deletion', +); + +my %groupAreaCustom = ( + 1 => '1x7', + 2 => '1x5', + 3 => '3x7', + 4 => '3x5', + 5 => '3x3', + 6 => '5x7', + 7 => '5x5', + 8 => '5x3', + 9 => '5x1', + 10 => '7x7', + 11 => '7x5', + 12 => '7x3', + 13 => '7x1', + 14 => '11x3', + 15 => '11x1', + 16 => '15x3', + 17 => '15x1', +); + +my %iSOAutoHiLimitD6 = ( + 1 => 'ISO 200', + 2 => 'ISO 250', + 3 => 'ISO 280', + 4 => 'ISO 320', + 5 => 'ISO 400', + 6 => 'ISO 500', + 7 => 'ISO 560', + 8 => 'ISO 640', + 9 => 'ISO 800', + 10 => 'ISO 1000', + 11 => 'ISO 1100', + 12 => 'ISO 1250', + 13 => 'ISO 1600', + 14 => 'ISO 2000', + 15 => 'ISO 2200', + 16 => 'ISO 2500', + 17 => 'ISO 3200', + 18 => 'ISO 4000', + 19 => 'ISO 4500', + 20 => 'ISO 5000', + 21 => 'ISO 6400', + 22 => 'ISO 8000', + 23 => 'ISO 9000', + 24 => 'ISO 10000', + 25 => 'ISO 12800', + 26 => 'ISO 16000', + 27 => 'ISO 18000', + 28 => 'ISO 20000', + 29 => 'ISO 25600', + 30 => 'ISO 32000', + 31 => 'ISO 36000', + 32 => 'ISO 40000', + 33 => 'ISO 51200', + 34 => 'ISO 64000', + 35 => 'ISO 72000', + 36 => 'ISO 81200', + 37 => 'ISO 102400', + 38 => 'ISO Hi 0.3', + 39 => 'ISO Hi 0.5', + 40 => 'ISO Hi 0.7', + 41 => 'ISO Hi 1.0', + 42 => 'ISO Hi 2.0', + 43 => 'ISO Hi 3.0', + 44 => 'ISO Hi 4.0', + 45 => 'ISO Hi 5.0', +); + +my %iSOAutoHiLimitZ7 = ( + 1 => 'ISO 100', + 2 => 'ISO 125', + 4 => 'ISO 160', + 5 => 'ISO 200', + 6 => 'ISO 250', + 8 => 'ISO 320', + 9 => 'ISO 400', + 10 => 'ISO 500', + 12 => 'ISO 640', + 13 => 'ISO 800', + 14 => 'ISO 1000', + 16 => 'ISO 1250', + 17 => 'ISO 1600', + 18 => 'ISO 2000', + 20 => 'ISO 2500', + 21 => 'ISO 3200', + 22 => 'ISO 4000', + 24 => 'ISO 5000', + 25 => 'ISO 6400', + 26 => 'ISO 8000', + 28 => 'ISO 10000', + 29 => 'ISO 12800', + 30 => 'ISO 16000', + 32 => 'ISO 20000', + 33 => 'ISO 25600', + 38 => 'ISO Hi 0.3', + 39 => 'ISO Hi 0.5', + 40 => 'ISO Hi 0.7', + 41 => 'ISO Hi 1.0', + 42 => 'ISO Hi 2.0', +); + +my %lensFuncButtonZ7m2 = ( + 1 => 'AF-On', + 2 => 'AF Lock Only', + 3 => 'AE Lock (hold)', + 4 => 'AE Lock (reset on release)', + 5 => 'AE Lock Only', + 6 => 'AE/AF Lock', + 7 => 'FV Lock', + 8 => 'Flash Disable/Enable', + 9 => 'Preview', + 10 => 'Matrix Metering', + 11 => 'Center-weighted Metering', + 12 => 'Spot Metering', + 13 => 'Highlight-weighted Metering', + 14 => 'Bracketing Burst', + 15 => 'Synchronized Release (Master)', + 16 => 'Synchronized Release (Remote)', # no settings map to 17 or 18 (Z7II fw 1.01) + 19 => '+NEF(RAW)', + 20 => 'Subject Tracking', + 21 => 'Grid Display', + 22 => 'Zoom (Low)', + 23 => 'Zoom (1:1)', + 24 => 'Zoom (High)', + 25 => 'My Menu', + 26 => 'My Menu Top Item', + 27 => 'Playback', + 28 => 'None', +); + +my %limitNolimit = ( 1 => 'Limit', 2 => 'No Limit' ); + +my %limtReleaseModeSel = ( + 0 => 'No Limit', # not sure why 0 and 2 both map to 'No Limit', but they do + 1 => 'Limit', + 2 => 'No Limit', +); + +my %menuBank = ( + 1 => 'A', + 2 => 'B', + 3 => 'C', + 4 => 'D', +); + +my %noYes = ( 1 => 'No', 2 => 'Yes' ); +my %offOn = ( 1 => 'Off', 2 => 'On' ); +my %onOff = ( 1 => 'On', 2 => 'Off' ); + +my %previewButtonD6 = ( + 1 => 'Preset Focus Point - Press To Recall', + 2 => 'Preset Focus Point - Hold To Recall', + 3 => 'AF-AreaMode S', + 4 => 'AF-AreaMode D9', + 5 => 'AF-AreaMode D25', + 6 => 'AF-AreaMode D49', + 7 => 'AF-AreaMode D105', + 8 => 'AF-AreaMode 3D', + 9 => 'AF-AreaMode Group', + 10 => 'AF-AreaMode Group C1', + 11 => 'AF-AreaMode Group C2', + 12 => 'AF-AreaMode Auto Area', + 13 => 'AF-AreaMode + AF-On S', + 14 => 'AF-AreaMode + AF-On D9', + 15 => 'AF-AreaMode + AF-On D25', + 16 => 'AF-AreaMode + AF-On D49', + 17 => 'AF-AreaMode + AF-On D105', + 18 => 'AF-AreaMode + AF-On 3D', + 19 => 'AF-AreaMode + AF-On Group', + 20 => 'AF-AreaMode + AF-On Group C1', + 21 => 'AF-AreaMode + AF-On Group C2', + 22 => 'AF-AreaMode + AF-On Auto Area', + 23 => 'AF-On', + 24 => 'AF Lock Only', + 25 => 'AE Lock (hold)', + 26 => 'AE/WB Lock (hold)', + 27 => 'AE Lock (reset on release)', + 28 => 'AE Lock Only', + 29 => 'AE/AF Lock', + 30 => 'FV Lock', + 31 => 'Flash Disable/Enable', + 32 => 'Preview', + 33 => 'Recall Shooting Functions', + 34 => 'Bracketing Burst', + 35 => 'Synchronized Release (Master)', + 36 => 'Synchronized Release (Remote)', # no settings map to 37 or 38 + 39 => '+NEF(RAW)', + 40 => 'Grid Display', + 41 => 'Virtual Horizon', + 42 => 'Voice Memo', + 43 => 'Wired LAN', + 44 => 'My Menu', + 45 => 'My Menu Top Item', + 46 => 'Playback', + 47 => 'Filtered Playback', + 48 => 'Photo Shooting Bank', + 49 => 'AF Mode/AF Area Mode', + 50 => 'Image Area', + 51 => 'Active-D Lighting', + 52 => 'Exposure Delay Mode', + 53 => 'Shutter/Aperture Lock', + 54 => '1 Stop Speed/Aperture', + 55 => 'Non-CPU Lens', + 56 => 'None', +); + +my %releaseFocus = ( + 1 => 'Release', + 2 => 'Focus', +); + +my %tagMultiSelector = ( + 1 => 'Restart Standby Timer', + 2 => 'Do Nothing', +); + +my %tagSecondarySlotFunction = ( + 1 => 'Overflow', + 2 => 'Backup', + 3 => 'NEF Primary + JPG Secondary', + 4 => 'JPG Primary + JPG Secondary', +); + +my %tagSubSelector = ( + 1 => 'Same as MultiSelector', + 2 => 'Focus Point Selection', +); + +my %thirdHalfFull = ( + 1 => '1/3 EV', + 2 => '1/2 EV', + 3 => '1 EV', +); + +my %times4s10s20s1m5m20m = ( + 1 => '4 s', + 2 => '10 s', + 3 => '20 s', + 4 => '1 min', + 5 => '5 min', + 6 => '10 min', +); + +my %yesNo = ( 1 => 'Yes', 2 => 'No' ); + +my %infoD6 = ( + Condition => '$$self{Model} =~ /^NIKON D6\b/i', + Notes => 'D6', +); + +my %infoZ7 = ( + Condition => '$$self{Model} =~ /^NIKON Z (7|7_2)\b/i', + Notes => 'Z7 and Z7_2', +); + +my %infoZSeries = ( + Condition => '$$self{Model} =~ /^NIKON Z (5|50|6|6_2|7|7_2|fc)\b/i', + Notes => 'Z Series cameras thru November 2021', +); + +# Nikon Settings tags (ref 1, tag ID's ref PH) +%Image::ExifTool::NikonSettings::Main = ( + PROCESS_PROC => \&ProcessNikonSettings, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + User settings for newer Nikon models. A number of the tags are marked as + Unknown only to reduce the volume of the normal output. + }, + 0x001 => [{ + Name => 'ISOAutoHiLimit', + PrintConv => \%iSOAutoHiLimitD6, + %infoD6, + },{ + Name => 'ISOAutoHiLimit', + PrintConv => \%iSOAutoHiLimitZ7, + %infoZ7, + }], + 0x002 => [{ + Name => 'ISOAutoFlashLimit', + PrintConv => { + 1 => 'Same As Without Flash', + 2 => 'ISO 200', + 3 => 'ISO 250', + 5 => 'ISO 320', + 6 => 'ISO 400', + 7 => 'ISO 500', + 9 => 'ISO 640', + 10 => 'ISO 800', + 11 => 'ISO 1000', + 13 => 'ISO 1250', + 14 => 'ISO 1600', + 15 => 'ISO 2000', + 17 => 'ISO 2500', + 18 => 'ISO 3200', + 19 => 'ISO 4000', + 21 => 'ISO 5000', + 22 => 'ISO 6400', + 23 => 'ISO 8000', + 25 => 'ISO 10000', + 26 => 'ISO 12800', + 27 => 'ISO 16000', + 29 => 'ISO 20000', + 30 => 'ISO 25600', + 31 => 'ISO 32000', + 33 => 'ISO 40000', + 34 => 'ISO 51200', + 35 => 'ISO 64000', + 36 => 'ISO 72000', + 37 => 'ISO 81200', + 38 => 'ISO 102400', + 39 => 'ISO Hi 0.3', + 40 => 'ISO Hi 0.5', + 41 => 'ISO Hi 0.7', + 42 => 'ISO Hi 1.0', + 43 => 'ISO Hi 2.0', + 44 => 'ISO Hi 3.0', + 45 => 'ISO Hi 4.0', + 46 => 'ISO Hi 5.0', + }, + %infoD6, + },{ + Name => 'ISOAutoFlashLimit', + PrintConv => { + 1 => 'Same As Without Flash', + 2 => 'ISO 100', + 3 => 'ISO 125', + 5 => 'ISO 160', + 6 => 'ISO 200', + 7 => 'ISO 250', + 9 => 'ISO 320', + 10 => 'ISO 400', + 11 => 'ISO 500', + 13 => 'ISO 640', + 14 => 'ISO 800', + 15 => 'ISO 1000', + 17 => 'ISO 1250', + 18 => 'ISO 1600', + 19 => 'ISO 2000', + 21 => 'ISO 2500', + 22 => 'ISO 3200', + 23 => 'ISO 4000', + 25 => 'ISO 5000', + 26 => 'ISO 6400', + 27 => 'ISO 8000', + 29 => 'ISO 10000', + 30 => 'ISO 12800', + 31 => 'ISO 16000', + 33 => 'ISO 20000', + 34 => 'ISO 25600', + 39 => 'ISO Hi 0.3', + 40 => 'ISO Hi 0.5', + 41 => 'ISO Hi 0.7', + 42 => 'ISO Hi 1.0', + 43 => 'ISO Hi 2.0', + }, + %infoZ7, + }], + 0x003 => { # (D6/Z7_2) + Name => 'ISOAutoShutterTime', + PrintConv => { + 1 => 'Auto (Slowest)', + 2 => 'Auto (Slower)', + 3 => 'Auto', + 4 => 'Auto (Faster)', + 5 => 'Auto (Fastest)', + 6 => '1/4000 s', + 7 => '1/3200 s', + 8 => '1/2500 s', + 9 => '1/2000 s', + 10 => '1/1600 s', + 11 => '1/1250 s', + 12 => '1/1000 s', + 13 => '1/800 s', + 14 => '1/640 s', + 15 => '1/500 s', + 16 => '1/400 s', + 17 => '1/320 s', + 18 => '1/250 s', + 19 => '1/200 s', + 20 => '1/160 s', + 21 => '1/125 s', + 22 => '1/100 s', + 23 => '1/80 s', + 24 => '1/60 s', + 25 => '1/50 s', + 26 => '1/40 s', + 27 => '1/30 s', + 28 => '1/25 s', + 29 => '1/20 s', + 30 => '1/15 s', + 31 => '1/13 s', + 32 => '1/10 s', + 33 => '1/8 s', + 34 => '1/6 s', + 35 => '1/5 s', + 36 => '1/4 s', + 37 => '1/3 s', + 38 => '1/2.5 s', + 39 => '1/2 s', + 40 => '1/1.6 s', + 41 => '1/1.3 s', + 42 => '1 s', + 43 => '1.3 s', + 44 => '1.6 s', + 45 => '2 s', + 46 => '2.5 s', + 47 => '3 s', + 48 => '4 s', + 49 => '5 s', + 50 => '6 s', + 51 => '8 s', + 52 => '10 s', + 53 => '13 s', + 54 => '15 s', + 55 => '20 s', + 56 => '25 s', + 57 => '30 s', + }, + }, + 0x00b => { Name => 'FlickerReductionShooting', PrintConv => \%enableDisable }, # (D6/Z7_2) + 0x00c => { Name => 'FlickerReductionIndicator',PrintConv => \%enableDisable }, # (D6) + 0x00d => [{ + Name => 'MovieISOAutoHiLimit', + PrintConv => \%iSOAutoHiLimitD6, + %infoD6, + },{ + Name => 'MovieISOAutoHiLimit', + PrintConv => { + 1 => 'ISO 200', + 2 => 'ISO 250', + 4 => 'ISO 320', + 5 => 'ISO 400', + 6 => 'ISO 500', + 8 => 'ISO 640', + 9 => 'ISO 800', + 10 => 'ISO 1000', + 12 => 'ISO 1250', + 13 => 'ISO 1600', + 14 => 'ISO 2000', + 16 => 'ISO 2500', + 17 => 'ISO 3200', + 18 => 'ISO 4000', + 20 => 'ISO 5000', + 21 => 'ISO 6400', + 22 => 'ISO 8000', + 24 => 'ISO 10000', + 25 => 'ISO 12800', + 26 => 'ISO 16000', + 28 => 'ISO 20000', + 29 => 'ISO 25600', + 34 => 'ISO Hi 0.3', + 35 => 'ISO Hi 0.5', + 36 => 'ISO Hi 0.7', + 37 => 'ISO Hi 1.0', + 38 => 'ISO Hi 2.0', + }, + %infoZ7, + }], + 0x00e => { Name => 'MovieISOAutoControlManualMode',PrintConv => \%onOff }, # (D6/Z7_2) + 0x00f => { Name => 'MovieWhiteBalanceSameAsPhoto', PrintConv => \%yesNo }, # (D6/Z7_2) + 0x01d => [{ # CSa1 (D6) + Name => 'AF-CPrioritySel', + PrintConv => { # valid for cameras with 4 options for CS1, otherwise 1=Release, 2=Focus + 1 => 'Release', + 2 => 'Release + Focus', + 3 => 'Focus + Release', + 4 => 'Focus', + }, + %infoD6, + },{ # CSa1 (Z7_2) + Name => 'AF-CPrioritySel', + PrintConv => \%releaseFocus, + %infoZSeries, + }], + 0x01e => { Name => 'AF-SPrioritySel', PrintConv => \%releaseFocus }, # CSa2 (D6), CSa2 (Z7_2) + 0x020 => [{ # CSa4 (D6) + Name => 'AFPointSel', + PrintConv => { + 1 => '105 Points', + 2 => '27 Points', + 3 => '15 Points', + }, + %infoD6, + },{ # CSa4 (Z7_2) + Name => 'AFPointSel', + PrintConv => { 1 => 'Use All', 2 => 'Use Half' }, + %infoZSeries, + }], + 0x022 => { Name => 'AFActivation', PrintConv => { 1 => 'Shutter/AF-On', 2 => 'AF-On Only' } }, # CSa6-a (D6/Z7_2) (missing enable/disable out of focus release) # (D6) + 0x023 => { Name => 'FocusPointWrap', PrintConv => { 1 => 'Wrap', 2 => 'No Wrap' } }, # CSa16 (D6), CSa8 (Z7_2) + 0x025 => { # CSa17-a (D6), CSa9-a (Z7_2) + Name => 'ManualFocusPointIllumination', + PrintConv => { + 1 => 'On', + 2 => 'On During Focus Point Selection Only', + }, + }, + 0x026 => { Name => 'AF-AssistIlluminator', PrintConv => \%onOff }, # CSa11 (Z7_2) + 0x027 => { Name => 'ManualFocusRingInAFMode', PrintConv => \%onOff }, # CSa12 (D6,Z7_2) capability documented in manual, but visibility (& ability to test) requires a compatible lens + 0x029 => { Name => 'ISOStepSize', PrintConv => \%thirdHalfFull }, # CSb1 (D6) + 0x02a => { Name => 'ExposureControlStepSize', PrintConv => \%thirdHalfFull }, # CSb2 (D6), CSb1 (Z7_2) + 0x02b => { # CSb4 (D6), CSb2 (Z7_2) + Name => 'EasyExposureCompensation', + PrintConv => { + 1 => 'On (auto reset)', + 2 => 'On', + 3 => 'Off', + }, + }, + 0x02c => { Name => 'MatrixMetering', PrintConv => { 1 => 'Face Detection On', 2 => 'Face Detection Off' } }, # CSb5 (D6) + 0x02d => [{ # CSb6 (D6) + Name => 'CenterWeightedAreaSize', + PrintConv => { + 1 => '8 mm', + 2 => '12 mm', + 3 => '15 mm', + 4 => '20 mm', + 5 => 'Average', + }, + %infoD6 + },{ # CSb3 (Z7_2) + Name => 'CenterWeightedAreaSize', + PrintConv => { 1 => '12 mm', 2 => 'Average' }, + %infoZSeries, + }], + 0x02f => { # CSb7-a (D6), CSb4-a (Z7_2) + Name => 'FineTuneOptMatrixMetering', + ValueConv => '($val - 7) / 6', + ValueConvInv => 'int($val*6+7)', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x030 => { # CSb7-b (D6), CSb4-b (Z7_2) + Name => 'FineTuneOptCenterWeighted', + ValueConv => '($val - 7) / 6', + ValueConvInv => 'int($val*6+7)', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x031 => { # CSb7-c (D6), CSb4-c (Z7_2) + Name => 'FineTuneOptSpotMetering', + ValueConv => '($val - 7) / 6', + ValueConvInv => 'int($val*6+7)', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x032 => { # CSb7-d (D6), CSb4-d (Z7_2) + Name => 'FineTuneOptHighlightWeighted', + ValueConv => '($val - 7) / 6', + ValueConvInv => 'int($val*6+7)', + PrintConv => '$val ? sprintf("%+.2f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x033 => { # CSc1 (D6), CSc1 (Z7_2) + Name => 'ShutterReleaseButtonAE-L', + PrintConv => { + 1 => 'On (Half Press)', + 2 => 'On (Burst Mode)', + 3 => 'Off', + }, + }, + 0x034 => [{ # CSc2 (D6) + Name => 'StandbyMonitorOffTime', + PrintConv => { + 1 => '4 s', + 2 => '6 s', + 3 => '10 s', + 4 => '30 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + 8 => '30 min', + 9 => 'No Limit', + }, + %infoD6, + },{ # CSc4-d (Z7_2) + Name => 'StandbyMonitorOffTime', + PrintConv => { + 1 => '10 s', + 2 => '20 s', + 3 => '30 s', + 4 => '1 min', + 5 => '5 min', + 6 => '10 min', + 7 => '30 min', + 8 => 'No Limit', + }, + %infoZSeries, + }], + 0x035 => { # CSc3-a (D6), CSc2-a (Z7_2) + Name => 'SelfTimerTime', + PrintConv => { + 1 => '2 s', + 2 => '5 s', + 3 => '10 s', + 4 => '20 s', + }, + }, + 0x036 => { Name => 'SelfTimerShotCount', ValueConv => '10 - $val', ValueConvInv => '10 + $val' }, # CSc3-b (D6), CSc2-b (Z7_2) + 0x037 => { # CSc3-c (D6), CSc2-c (Z7_2) + Name => 'SelfTimerShotInterval', + PrintConv => { + 1 => '0.5 s', + 2 => '1 s', + 3 => '2 s', + 4 => '3 s', + }, + }, + 0x038 => { Name => 'PlaybackMonitorOffTime', PrintConv => \%times4s10s20s1m5m20m }, # CSc4-a (D6), CSc3-a (Z7_2) + 0x039 => { Name => 'MenuMonitorOffTime', PrintConv => \%times4s10s20s1m5m20m }, # CSc4-b (D6), CSc3-b (Z7_2) + 0x03a => { Name => 'ShootingInfoMonitorOffTime',PrintConv => \%times4s10s20s1m5m20m }, # CSc4-c (D6) + 0x03b => { # CSc4-d (D6), CSc3-c (Z7_2) + Name => 'ImageReviewMonitorOffTime', + PrintConv => { + 1 => '2 s', + 2 => '4 s', + 3 => '10 s', + 4 => '20 s', + 5 => '1 min', + 6 => '5 min', + 7 => '10 min', + }, + }, + 0x03c => { # CSc4-e (D6) + Name => 'LiveViewMonitorOffTime', + PrintConv => { + 1 => '5 min', + 2 => '10 min', + 3 => '15 min', + 4 => '20 min', + 5 => '30 min', + 6 => 'No Limit', + }, + }, + 0x03e => { Name => 'CLModeShootingSpeed', ValueConv => '6 - $val', ValueConvInv => '6 + $val', PrintConv => '"$val fps"', PrintConvInv => '$val=~s/\s*fps//i; $val' }, # CSd1 (Z7_2) + 0x03f => { Name => 'MaxContinuousRelease' }, # CSd2 # values: 1-200 # (D6/Z7_2) + 0x040 => { # CSd5 (D6), CSd4 (Z7_2) + Name => 'ExposureDelayMode', + PrintConv => { + 1 => '3 s', + 2 => '2 s', + 3 => '1 s', + 4 => '0.5 s', + 5 => '0.2 s', + 6 => 'Off', + }, + }, + 0x041 => { Name => 'ElectronicFront-CurtainShutter',PrintConv => \%onOff }, # CSd6 (D6) + 0x042 => { Name => 'FileNumberSequence', PrintConv => \%onOff }, # CSd9 (D6), CSd8 (Z7_2) + 0x043 => { Name => 'FramingGridDisplay', PrintConv => \%onOff }, # CSd11 (D6), CSd10 (Z7_2), new tag with implementation of NikonSettings # (Z7_2) + 0x045 => { Name => 'LCDIllumination', PrintConv => \%onOff }, # CSd13 (D6) + 0x046 => { Name => 'OpticalVR', PrintConv => \%onOff }, # CSd15 (D6) + 0x047 => [{ # CSe1 (D6) + Name => 'FlashSyncSpeed', + PrintConv => { + 1 => '1/250 s (auto FP)', + 2 => '1/250 s', + 3 => '1/200 s', + 4 => '1/160 s', + 5 => '1/125 s', + 6 => '1/100 s', + 7 => '1/80 s', + 8 => '1/60 s', + }, + %infoD6, + },{ # CSe1 (Z7_2) + Name => 'FlashSyncSpeed', + PrintConv => { + 1 => '1/200 s (auto FP)', + 2 => '1/200 s', + 3 => '1/160 s', + 4 => '1/125 s', + 5 => '1/100 s', + 6 => '1/80 s', + 7 => '1/60 s', + }, + %infoZSeries, + }], + 0x048 => { # CSe2 (D6/Z7_2) + Name => 'FlashShutterSpeed', + PrintConv => { + 1 => '1/60 s', + 2 => '1/30 s', + 3 => '1/15 s', + 4 => '1/8 s', + 5 => '1/4 s', + 6 => '1/2 s', + 7 => '1 s', + 8 => '2 s', + }, + }, + 0x049 => { Name => 'FlashExposureCompArea', PrintConv => { 1 => 'Entire Frame', 2 => 'Background Only' } }, # CSe3 (D6/Z7_2) + 0x04a => { # CSe4 (D6/Z7_2) + Name => 'AutoFlashISOSensitivity', + PrintConv => { + 1 => 'Subject and Background', + 2 => 'Subject Only', + }, + }, + 0x051 => { # CSf3-l (D6) + Name => 'AssignBktButton', + PrintConv => { + 1 => 'Auto Bracketing', + 2 => 'Multiple Exposure', + 3 => 'HDR (high dynamic range)', + 4 => 'None', + }, + }, + 0x052 => [{ # CSf3-m (D6) + Name => 'AssignMovieRecordButton', + PrintConv => { + 1 => 'Voice Memo', + 2 => 'Photo Shooting Bank', + 3 => 'Exposure Mode', + 4 => 'AF Mode/AF Area Mode', + 5 => 'Image Area', + 6 => 'Shutter/Aperture Lock', + 7 => 'None', + }, + %infoD6, + },{ # CSf2-f (Z7_2) + Name => 'AssignMovieRecordButton', + PrintConv => { + 1 => 'AE Lock (hold)', + 2 => 'AE Lock (reset on release)', + 3 => 'Preview', + 4 => '+NEF(RAW)', + 5 => 'LiveView Info Display On/Off', + 6 => 'Grid Display', + 7 => 'Zoom (Low)', + 8 => 'Zoom (1:1)', + 9 => 'Zoom (High)', + 10 => 'My Menu', + 11 => 'My Menu Top Item', + 12 => 'Image Area', + 13 => 'Image Quality', + 14 => 'White Balance', + 15 => 'Picture Control', + 16 => 'Active-D Lighting', + 17 => 'Metering', + 18 => 'Flash Mode', + 19 => 'Focus Mode', + 20 => 'Auto Bracketing', + 21 => 'Multiple Exposure', + 22 => 'HDR', + 23 => 'Exposure Delay Mode', + 24 => 'Shutter/Aperture Lock', + 25 => 'Non-CPU Lens', + 26 => 'None', + }, + %infoZSeries, + }], + 0x053 => [{ # CSf4-a (D6) + Name => 'MultiSelectorShootMode', + PrintConv => { + 1 => 'Select Center Focus Point', + 2 => 'Preset Focus Point - Press To Recall', + 3 => 'Preset Focus Point - Hold To Recall', + 4 => 'None', + }, + %infoD6, + },{ # CSf3-a (Z7_2) also called the OK button on this camera + Name => 'MultiSelectorShootMode', + PrintConv => { + 1 => 'Select Center Focus Point', + 2 => 'Zoom (Low)', + 3 => 'Zoom (1:1)', + 4 => 'Zoom (High)', + 5 => 'None', + }, + %infoZSeries, + }], + 0x054 => [{ # CSf4-c (D6) + Name => 'MultiSelectorPlaybackMode', + PrintConv => { + 1 => 'Filtered Playback', + 2 => 'View Histograms', + 3 => 'Zoom (Low)', + 4 => 'Zoom (1:1)', + 5 => 'Zoom (High)', + 6 => 'Choose Folder', + }, + %infoD6, + },{ # CSf3-b (Z7_2) # these decodes are correct. However, a new camera (or one following a 'reset all settings') will report Zoom (Low), despite the camera exhibiting the expected behavior (Zoom 1:1). Any change to CSf3-b corrects the reporting. + Name => 'MultiSelectorPlaybackMode', + PrintConv => { + 1 => 'Thumbnail On/Off', + 2 => 'View Histograms', + 3 => 'Zoom (Low)', + 4 => 'Zoom (1:1)', + 5 => 'Zoom (High)', + 6 => 'Choose Folder', + }, + %infoZSeries, + }], + 0x056 => { # CSf4-b (D6) + Name => 'MultiSelectorLiveView', + PrintConv => { + 1 => 'Select Center Focus Point', + 2 => 'Zoom (Low)', + 3 => 'Zoom (1:1)', + 4 => 'Zoom (High)', + 5 => 'None', + }, + }, + 0x058 => { # CSf6-a-1 and CSf6-a-2 (D6), CSf5-a-1 and CSf5-a-2 (Z7_2), Previous cameras reported these 2 in a single tag (CmdDialsReverseRotation). Blend the separate settings together to match extant tag name and values + Name => 'CmdDialsReverseRotExposureComp', + RawConv => '$$self{CmdDialsReverseRotExposureComp} = $val', + Unknown => 1, + }, + 0x059 => { # CSf6-b-1 and CSf6-b-2 (D6), CSf5-b-1 and CSf5-b-2 (Z7_2), Previous cameras reported these 2 in a single tag (CmdDialsChangeMainSub). Blend the separate settings together to match extant tag name and values + Name => 'CmdDialsChangeMainSubExposure', + RawConv => '$$self{CmdDialsChangeMainSubExposure} = $val', + Unknown => 1, + }, + 0x05a => [{ # CSf6-b-1 and CSf6-b-2 (D6), CSf5-b-1 and CSf5-b-2 (Z7_2), (continued from above) + Name => 'CmdDialsChangeMainSub', + Condition => '$$self{CmdDialsChangeMainSubExposure} and $$self{CmdDialsChangeMainSubExposure} == 1', + PrintConv => { + 1 => 'Autofocus On, Exposure On', + 2 => 'Autofocus Off, Exposure On', + }, + },{ + Name => 'CmdDialsChangeMainSub', + Condition => '$$self{CmdDialsChangeMainSubExposure} and $$self{CmdDialsChangeMainSubExposure} == 2', + PrintConv => { + 1 => 'Autofocus On, Exposure On (Mode A)', + 2 => 'Autofocus Off, Exposure On (Mode A)', + }, + },{ + Name => 'CmdDialsChangeMainSub', + PrintConv => { + 1 => 'Autofocus On, Exposure Off', + 2 => 'Autofocus Off, Exposure Off', + }, + }], + 0x05b => { Name => 'CmdDialsMenuAndPlayback', PrintConv => { 1 => 'On', 2 => 'On (Image Review Excluded)', 3 => 'Off' } }, # CSf5-c (D6), CSf5-c (Z7_2) + 0x05c => { # CSf6-d (D6), CSf5-d (Z7_2) + Name => 'SubDialFrameAdvance', + PrintConv => { + 1 => '10 Frames', + 2 => '50 Frames', + 3 => 'Rating', + 4 => 'Protect', + 5 => 'Stills Only', + 6 => 'Movies Only', + 7 => 'Folder', + }, + }, + 0x05d => { Name => 'ReleaseButtonToUseDial', PrintConv => \%yesNo }, # CSf8 (D6), CSf6 (Z7_2) + 0x05e => { Name => 'ReverseIndicators', PrintConv => { 1 => '+ 0 -', 2 => '- 0 +' } }, # CSf9 (D6), CSf7 (Z7_2) + 0x062 => { # CSg2-f (D6), CSg2-e (Z7_2) + Name => 'MovieShutterButton', + PrintConv => { + 1 => 'Take Photo', + 2 => 'Record Movie', + }, + }, + 0x063 => { # Settings menu # (D6,Z7_2) + Name => 'Language', + PrintConv => { + 5 => 'English', + 6 => 'Spanish', + 8 => 'French', + 15 => 'Portuguese (Br)', + }, + }, + 0x06c => [{ + Name => 'ShootingInfoDisplay', + PrintConv => { + 1 => 'Auto', + 2 => 'Manual (dark on light)', + 3 => 'Manual (light on dark)', + }, + %infoD6, + },{ + Name => 'ShootingInfoDisplay', + PrintConv => { + 1 => 'Manual (dark on light)', + 2 => 'Manual (light on dark)', + }, + %infoZSeries, + }], + 0x074 => { Name => 'FlickAdvanceDirection', PrintConv => { 1 => 'Right to Left', 2 => 'Left to Right' } }, # CSf12-3 (D6) + 0x075 => { # Settings menu # (D6,Z7_2) + Name => 'HDMIOutputResolution', + PrintConv => { + 1 => 'Auto', + 2 => '2160p', + 3 => '1080p', + 4 => '1080i', + 5 => '720p', + 6 => '576p', + 7 => '480p', + }, + }, + 0x077 => { # Settings menu # (D6,Z7_2) + Name => 'HDMIOutputRange', + PrintConv => { + 1 => 'Auto', + 2 => 'Limit', + 3 => 'Full', + }, + }, + 0x080 => [{ + Name => 'RemoteFuncButton', + PrintConv => { + 1 => 'AF-On', + 2 => 'AF Lock Only', + 3 => 'AE Lock (reset on release)', + 4 => 'AE Lock Only', + 5 => 'AE/AF Lock', + 6 => 'FV Lock', + 7 => 'Flash Disable/Enable', + 8 => 'Preview', + 9 => '+NEF(RAW)', + 10 => 'LiveView Info Display On/Off', + 11 => 'Recall Shooting Functions', + 12 => 'None', + }, + %infoD6, + },{ + Name => 'RemoteFuncButton', + PrintConv => { + 1 => 'AF-On', + 2 => 'AF Lock Only', + 3 => 'AE Lock (reset on release)', + 4 => 'AE Lock Only', + 5 => 'AE/AF Lock', + 6 => 'FV Lock', + 7 => 'Flash Disable/Enable', + 8 => 'Preview', + 9 => '+NEF(RAW)', + 10 => 'None', + 11 => 'LiveView Info Display On/Off', + }, + %infoZSeries, + }], + 0x08b => [{ # CSf6-a-1 and CSf6-a-2 (D6), CSf5-a-1 and CSf5-a-2 (Z7_2), (continued from above) + Name => 'CmdDialsReverseRotation', + Condition => '$$self{CmdDialsReverseRotExposureComp} and $$self{CmdDialsReverseRotExposureComp} == 1', + PrintConv => { + 1 => 'No', + 2 => 'Shutter Speed & Aperture', + }, + },{ + Name => 'CmdDialsReverseRotation', + PrintConv => { + 1 => 'Exposure Compensation', + 2 => 'Exposure Compensation, Shutter Speed & Aperture', + }, + }], + 0x08d => { # CSd10-b (D6), CSd11-b (Z7_2) + Name => 'FocusPeakingHighlightColor', + PrintConv => { + 1 => 'Red', + 2 => 'Yellow', + 3 => 'Blue', + 4 => 'White', + }, + }, + 0x08e => { Name => 'ContinuousModeDisplay', PrintConv => \%onOff }, # CSd14 (D6), CSd12 (Z7_2) + 0x08f => { Name => 'ShutterSpeedLock', PrintConv => \%onOff }, # CSf54-a (D6), CSf4-a (Z7_2) + 0x090 => { Name => 'ApertureLock', PrintConv => \%onOff }, # CSf5-b (D6), CSf4-b (Z7_2 could not select) + 0x091 => { # CSg4-b (D6), CSg6-b (Z7_2) + Name => 'MovieHighlightDisplayThreshold', + PrintConv => { + 1 => '255', + 2 => '248', + 3 => '235', + 4 => '224', + 5 => '213', + 6 => '202', + 7 => '191', + 8 => '180', + }, + }, + 0x092 => { Name => 'HDMIExternalRecorder', PrintConv => \%onOff }, # Settings Menu/HDMI/Advanced entry (D6 & Z7_2) + 0x093 => { # CSa3-a (D6), CSa3 (Z7_2) + Name => 'BlockShotAFResponse', + PrintConv => { + 1 => '1 (Quick)', + 2 => '2', + 3 => '3 (Normal)', + 4 => '4', + 5 => '5 (Delay)', + }, + }, + 0x094 => { Name => 'SubjectMotion', PrintConv => { 1 => 'Erratic', 2 => 'Steady' } }, # CSa3-b (D6) + 0x095 => { Name => 'Three-DTrackingFaceDetection', PrintConv => \%onOff }, # CSa8 (D6) + 0x097 => [{ # CSa5 (D6) + Name => 'StoreByOrientation', + PrintConv => { + 1 => 'Focus Point', + 2 => 'Focus Point and AF-area mode', + 3 => 'Off', + }, + %infoD6, + },{ # CSa5 (Z7_2) + Name => 'StoreByOrientation', + PrintConv => { + 1 => 'Focus Point', + 2 => 'Off', + }, + %infoZSeries, + }], + 0x099 => { Name => 'DynamicAreaAFAssist',PrintConv => \%onOff }, # CSa17-c (D6), CSa9-b (Z7_2) + 0x09a => { Name => 'ExposureCompStepSize', PrintConv => \%thirdHalfFull }, # CSb3 (D6) + 0x09b => { Name => 'SyncReleaseMode', PrintConv => { 1 => 'Sync', 2 => 'No Sync' } }, # CSd4 (D6), CSd3 (Z7_2) + 0x09c => { Name => 'ModelingFlash', PrintConv => \%onOff }, # CSe6 (D6), CSe5 (Z7_2) + 0x09d => { # CSe7 (D6), CSe6 (Z7_2) + Name => 'AutoBracketModeM', + PrintConv => { + 1 => 'Flash/Speed', + 2 => 'Flash/Speed/Aperture', + 3 => 'Flash/Aperture', + 4 => 'Flash Only', + }, + }, + 0x09e => { Name => 'PreviewButton', PrintConv => \%previewButtonD6 }, # CSf3-a (D6) + 0x0a0 => [{ # CSf3-b (D6) + Name => 'Func1Button', + PrintConv => \%previewButtonD6, + %infoD6, + },{ # CSf2-a (Z7_2) + Name => 'Func1Button', + PrintConv => \%funcButtonZ7m2, + %infoZSeries, + }], + 0x0a2 => [{ # CSf3-c (D6) + Name => 'Func2Button', + PrintConv => \%previewButtonD6, + %infoD6, + },{ # CSf2-b (Z7_2) + Name => 'Func2Button', + PrintConv => \%funcButtonZ7m2, + %infoZSeries, + }], + 0x0a3 => [{ # CSf3-f (D6) + Name => 'AF-OnButton', + PrintConv => { + 1 => 'AF-AreaMode S', + 2 => 'AF-AreaMode D9', + 3 => 'AF-AreaMode D25', + 4 => 'AF-AreaMode D49', + 5 => 'AF-AreaMode D105', + 6 => 'AF-AreaMode 3D', + 7 => 'AF-AreaMode Group', + 8 => 'AF-AreaMode Group C1', + 9 => 'AF-AreaMode Group C2', + 10 => 'AF-AreaMode Auto Area', + 11 => 'AF-AreaMode + AF-On S', + 12 => 'AF-AreaMode + AF-On D9', + 13 => 'AF-AreaMode + AF-On D25', + 14 => 'AF-AreaMode + AF-On D49', + 15 => 'AF-AreaMode + AF-On D105', + 16 => 'AF-AreaMode + AF-On 3D', + 17 => 'AF-AreaMode + AF-On Group', + 18 => 'AF-AreaMode + AF-On Group C1', + 19 => 'AF-AreaMode + AF-On Group C2', + 20 => 'AF-AreaMode + AF-On Auto Area', + 21 => 'AF-On', + 22 => 'AF Lock Only', + 23 => 'AE Lock (hold)', + 24 => 'AE/WB Lock (hold)', + 25 => 'AE Lock (reset on release)', + 26 => 'AE Lock Only', + 27 => 'AE/AF Lock', + 28 => 'Recall Shooting Functions', + 29 => 'None', + }, + %infoD6, + },{ # CSf2-c (Z7_2) + Name => 'AF-OnButton', + PrintConv => { + 1 => 'Center Focus Point', + 2 => 'AF-On', + 3 => 'AF Lock Only', + 4 => 'AE Lock (hold)', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock Only', + 7 => 'AE/AF Lock', + 8 => 'LiveView Info Display On/Off', + 9 => 'Zoom (Low)', + 10 => 'Zoom (1:1)', + 11 => 'Zoom (High)', + 12 => 'None' + }, + %infoZSeries, + }], + 0x0a4 => { Name => 'SubSelector', PrintConv => \%tagSubSelector }, # CSf3-g-1 # (D6), CSf2-d-1 # (Z7_2) + 0x0a5 => [{ # CSf3-h (D6) + Name => 'SubSelectorCenter', + PrintConv => { + 1 => 'Preset Focus Point - Press To Recall', + 2 => 'Preset Focus Point - Hold To Recall', + 3 => 'Center Focus Point', + 4 => 'AF-AreaMode S', + 5 => 'AF-AreaMode D9', + 6 => 'AF-AreaMode D25', + 7 => 'AF-AreaMode D49', + 8 => 'AF-AreaMode D105', + 9 => 'AF-AreaMode 3D', + 10 => 'AF-AreaMode Group', + 11 => 'AF-AreaMode Group C1', + 12 => 'AF-AreaMode Group C2', + 13 => 'AF-AreaMode Auto Area', + 14 => 'AF-AreaMode + AF-On S', + 15 => 'AF-AreaMode + AF-On D9', + 16 => 'AF-AreaMode + AF-On D25', + 17 => 'AF-AreaMode + AF-On D49', + 18 => 'AF-AreaMode + AF-On D105', + 19 => 'AF-AreaMode + AF-On 3D', + 20 => 'AF-AreaMode + AF-On Group', + 21 => 'AF-AreaMode + AF-On Group C1', + 22 => 'AF-AreaMode + AF-On Group C2', + 23 => 'AF-AreaMode + AF-On Auto Area', + 24 => 'AF-On', + 25 => 'AF Lock Only', + 26 => 'AE Lock (hold)', + 27 => 'AE/WB Lock (hold)', + 28 => 'AE Lock (reset on release)', + 29 => 'AE Lock Only', + 30 => 'AE/AF Lock', + 31 => 'FV Lock', + 32 => 'Flash Disable/Enable', + 33 => 'Preview', + 34 => 'Recall Shooting Functions', + 35 => 'Bracketing Burst', + 36 => 'Synchronized Release (Master)', + 37 => 'Synchronized Release (Remote)', + 38 => 'None', + }, + %infoD6, + },{ # CSf2-e (Z7_2) + Name => 'SubSelectorCenter', + PrintConv => { + 1 => 'Center Focus Point', + 2 => 'AF-On', + 3 => 'AF Lock Only', + 4 => 'AE Lock (hold)', + 5 => 'AE Lock (reset on release)', + 6 => 'AE Lock Only', + 7 => 'AE/AF Lock', + 8 => 'FV Lock', + 9 => 'Flash Disable/Enable', + 10 => 'Preview', + 11 => 'Matrix Metering', + 12 => 'Center-weighted Metering', + 13 => 'Spot Metering', + 14 => 'Highlight-weighted Metering', + 15 => 'Bracketing Burst', + 16 => 'Synchronized Release (Master)', + 17 => 'Synchronized Release (Remote)', + 20 => '+NEF(RAW)', + 21 => 'LiveView Info Display On/Off', + 22 => 'Grid Display', + 23 => 'Image Area', + 24 => 'Non-CPU Lens', + 25 => 'None', + }, + %infoZSeries, + }], + 0x0a7 => [{ # CSf3-n (D6) + Name => 'LensFunc1Button', + PrintConv => { + 1 => 'Preset Focus Point - Press To Recall', + 2 => 'Preset Focus Point - Hold To Recall', + 3 => 'AF-AreaMode S', + 4 => 'AF-AreaMode D9', + 5 => 'AF-AreaMode D25', + 6 => 'AF-AreaMode D49', + 7 => 'AF-AreaMode D105', + 8 => 'AF-AreaMode 3D', + 9 => 'AF-AreaMode Group', + 10 => 'AF-AreaMode Group C1', + 11 => 'AF-AreaMode Group C2', + 12 => 'AF-AreaMode Auto Area', + 13 => 'AF-AreaMode + AF-On S', + 14 => 'AF-AreaMode + AF-On D9', + 15 => 'AF-AreaMode + AF-On D25', + 16 => 'AF-AreaMode + AF-On D49', + 17 => 'AF-AreaMode + AF-On D105', + 18 => 'AF-AreaMode + AF-On 3D', + 19 => 'AF-AreaMode + AF-On Group', + 20 => 'AF-AreaMode + AF-On Group C1', + 21 => 'AF-AreaMode + AF-On Group C2', + 22 => 'AF-AreaMode + AF-On Auto Area', + 23 => 'AF-On', + 24 => 'AF Lock Only', + 25 => 'AE Lock Only', + 26 => 'AE/AF Lock', + 27 => 'Flash Disable/Enable', + 28 => 'Recall Shooting Functions', + 29 => 'Synchronized Release (Master)', + 30 => 'Synchronized Release (Remote)', + }, + %infoD6, + },{ # CSf2-g (Z7_2) + Name => 'LensFunc1Button', + PrintConv => \%lensFuncButtonZ7m2, + %infoZSeries, + }], + 0x0a8 => { Name => 'CmdDialsApertureSetting', PrintConv => { 1 => 'Sub-command Dial', 2 => 'Aperture Ring' } }, # CSf6-c (D6) + 0x0a9 => { Name => 'MultiSelector', PrintConv => \%tagMultiSelector }, # CSf7 (D6) + 0x0aa => { # CSf10 (D6) + Name => 'LiveViewButtonOptions', + PrintConv => { + 1 => 'Enable', + 2 => 'Enable (Standby Timer Active)', + 3 => 'Disable', + }, + }, + 0x0ab => { # CSf11 (D6) + Name => 'LightSwitch', + PrintConv => { + 1 => 'LCD Backlight', + 2 => 'LCD Backlight and Shooting Information', + }, + }, + 0x0b1 => [{ # CSg2-a (D6) + Name => 'MoviePreviewButton', + PrintConv => { + 1 => 'Power Aperture (Open)', + 2 => 'Exposure Compensation', + 3 => 'Grid Display', + 4 => 'Zoom (Low)', + 5 => 'Zoom (1:1)', + 6 => 'Zoom (High)', + 7 => 'Image Area', + 8 => 'Microphone Sensitivity', + 9 => 'None', + }, + %infoD6, + },{ # CSg2-a (Z7_2) + Name => 'MovieFunc1Button', + PrintConv => { + 1 => 'Power Aperture (Open)', + 2 => 'Exposure Compensation', + 3 => 'Subject Tracking', + 4 => 'LiveView Info Display On/Off', + 5 => 'Grid Display', + 6 => 'Zoom (Low)', + 7 => 'Zoom (1:1)', + 8 => 'Zoom (High)', + 9 => 'Protect', + 10 => 'Image Area', + 11 => 'White Balance', + 12 => 'Picture Control', + 13 => 'Active-D Lighting', + 14 => 'Metering', + 15 => 'Focus Mode', + 16 => 'Microphone Sensitivity', + 17 => 'Focus Peaking', + 18 => 'Rating (None)', + 19 => 'Rating (5)', + 20 => 'Rating (4)', + 21 => 'Rating (3)', + 22 => 'Rating (2)', + 23 => 'Rating (1)', # no mapping for 24 on the Z7_2. Possibly intended for Rating = 'Candidate for Deletion'? + 25 => 'None', + }, + %infoZSeries, + }], + 0x0b3 => [{ # CSg2-b (D6) + Name => 'MovieFunc1Button', + PrintConv => { + 1 => 'Power Aperture (Close)', + 2 => 'Exposure Compensation', + 3 => 'Grid Display', + 4 => 'Zoom (Low)', + 5 => 'Zoom (1:1)', + 6 => 'Zoom (High)', + 7 => 'Image Area', + 8 => 'Microphone Sensitivity', + 9 => 'None', + }, + %infoD6, + },{ # CSg2-b (Z7_2) + Name => 'MovieFunc2Button', + PrintConv => { # TODO: simplify Func1 and Func2 movies buttons - identical except for the 1st entry + 1 => 'Power Aperture (Close)', + 2 => 'Exposure Compensation', + 3 => 'Subject Tracking', + 4 => 'LiveView Info Display On/Off', + 5 => 'Grid Display', + 6 => 'Zoom (Low)', + 7 => 'Zoom (1:1)', + 8 => 'Zoom (High)', + 9 => 'Protect', + 10 => 'Image Area', + 11 => 'White Balance', + 12 => 'Picture Control', + 13 => 'Active-D Lighting', + 14 => 'Metering', + 15 => 'Focus Mode', + 16 => 'Microphone Sensitivity', + 17 => 'Focus Peaking', + 18 => 'Rating (None)', + 19 => 'Rating (5)', + 20 => 'Rating (4)', + 21 => 'Rating (3)', + 22 => 'Rating (2)', + 23 => 'Rating (1)', # no mapping for 24 on the Z7_2. Possibly intended for Rating = 'Candidate for Deletion'? + 25 => 'None', + }, + %infoZSeries, + }], + 0x0b5 => { # CSg2-c (D6) + Name => 'MovieFunc2Button', + PrintConv => { + 1 => 'Grid Display', + 2 => 'Zoom (Low)', + 3 => 'Zoom (1:1)', + 4 => 'Zoom (High)', + 5 => 'Image Area', + 6 => 'Microphone Sensitivity', + 7 => 'None', + }, + }, + 0x0b6 => [{ # CSg2-e (D6) + Name => 'AssignMovieSubselector', + PrintConv => { + 1 => 'Center Focus Point', + 2 => 'AF Lock Only', + 3 => 'AE Lock (hold)', + 4 => 'AE/WB Lock (hold)', + 5 => 'AE Lock Only', + 6 => 'AE/AF Lock', + 7 => 'Zoom (Low)', + 8 => 'Zoom (1:1)', + 9 => 'Zoom (High)', + 10 => 'Record Movie', + 11 => 'None', + }, + %infoD6, + },{ # CSg2-d (Z7_2) + Name => 'AssignMovieSubselector', + PrintConv => { + 1 => 'Center Focus Point', + 2 => 'AF Lock Only', + 3 => 'AE Lock (hold)', + 4 => 'AE Lock Only', + 5 => 'AE/AF Lock', + 6 => 'LiveView Info Display On/Off', + 7 => 'Grid Display', + 8 => 'Zoom (Low)', + 9 => 'Zoom (1:1)', + 10 => 'Zoom (High)', + 11 => 'Record Movie', + 12 => 'Image Area', + 13 => 'None', + }, + %infoZSeries, + }], + 0x0b8 => { Name => 'LimitAFAreaModeSelD9', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa14-a (D6) + 0x0b9 => { Name => 'LimitAFAreaModeSelD25', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa14-b (D6) + 0x0bc => { Name => 'LimitAFAreaModeSel3D', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa14-e (D6) + 0x0bd => { Name => 'LimitAFAreaModeSelGroup', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa14-f (D6) + 0x0be => { Name => 'LimitAFAreaModeSelAuto', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa14-i (D6), CSa7-g (Z7_2) + # 0x0bf => { Name => 'LimitSelectableImageArea30x20', PrintConv => \%limitNolimit }, # CSd8-1 (D6) further investigation & testing of CSd8-1 and CSd8-2 required. The other CSd8 tags are fine. + # 0x0c0 => { Name => 'LimitSelectableImageAreaDX', PrintConv => \%limitNolimit }, # CSd8-2 (D6) further investigation & testing of CSd8-1 and CSd8-2 required. The other CSd8 tags are fine. + 0x0c1 => { Name => 'LimitSelectableImageArea5To4', PrintConv => \%limitNolimit, Unknown => 1 }, # CSd8-3 (D6) + 0x0c2 => { Name => 'LimitSelectableImageArea1To1', PrintConv => \%limitNolimit, Unknown => 1 }, # CSd8-4 (D6) + # 0x0d3 => CSf3-g-2 (D6), CSf2-d-2 (Z7_2) SelectorPlaybackRole 'Scroll' and 'Display Next/Previous' (skipped to reduce volume of output) + 0x0d4 => { Name => 'PhotoShootingMenuBank', PrintConv => \%menuBank }, # (D6) + 0x0d5 => { Name => 'CustomSettingsBank', PrintConv => \%menuBank }, # (D6) + 0x0d6 => { Name => 'LimitAF-AreaModeSelPinpoint', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa7-a (Z7_2) + 0x0d7 => { Name => 'LimitAF-AreaModeSelDynamic', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa7-b (Z7_2) + 0x0d8 => { Name => 'LimitAF-AreaModeSelWideAF_S', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa7-c (Z7_2) + 0x0d9 => { Name => 'LimitAF-AreaModeSelWideAF_L', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa7-d (Z7_2) + 0x0da => { Name => 'LowLightAF', PrintConv => \%onOff }, # CSa10 (Z7_2) + 0x0db => { Name => 'LimitSelectableImageAreaDX', PrintConv => \%limitNolimit, Unknown => 1 }, # CSd7-a (Z7_2) + 0x0dc => { Name => 'LimitSelectableImageArea5To4', PrintConv => \%limitNolimit, Unknown => 1 }, # CSd7-b (Z7_2) + 0x0dd => { Name => 'LimitSelectableImageArea1To1', PrintConv => \%limitNolimit, Unknown => 1 }, # CSd7-c (Z7_2) + 0x0de => { Name => 'LimitSelectableImageArea16To9', PrintConv => \%limitNolimit, Unknown => 1 }, # CSd7-d (Z7_2) + 0x0df => { Name => 'ApplySettingsToLiveView', PrintConv => \%onOff }, # CSd9 # new tag with Z7_2 # (Z7_2) + 0x0e0 => { # CSd10-a (D6), CSd11-a (Z7_2) + Name => 'FocusPeakingLevel', + PrintConv => { + 1 => 'High Sensitivity', + 2 => 'Standard Sensitivity', + 3 => 'Low Sensitivity', + 4 => 'Off', + }, + }, + 0x0ea => { # CSf2-i #option for 'Focus (M/A)' is documented, but not available from camera menu + Name => 'LensControlRing', + PrintConv => { + 1 => 'Aperture', + 2 => 'Exposure Compensation', + 3 => 'ISO Sensitivity', + 4 => 'None (Disabled)', + }, + }, + # 0x0eb MovieLensControlRing ? # (Z7_2) + # 0x0ec # (Z7_2) + 0x0ed => [{ # CSg3 (D6) + Name => 'MovieMultiSelector', + PrintConv => { + 1 => 'Center Focus Point', + 2 => 'Zoom (Low)', + 3 => 'Zoom (1:1)', + 4 => 'Zoom (High)', + 5 => 'Record Movie', + 6 => 'None', + }, + %infoD6, + },{ # labels Ok button on camera # (Z7_2) + Name => 'MovieMultiSelector', + PrintConv => { # Z7 has codes for both OK and MultiSelector - although only the OK value can be changed. [The multiselector served as the OK button on these cameras]. + 1 => 'Center Focus Point', + 2 => 'Zoom (Low)', + 3 => 'Zoom (1:1)', + 4 => 'Zoom (High)', + 5 => 'Record Movie', + 6 => 'None', + }, + }], + 0x0ee => { Name => 'MovieAFSpeed', ValueConv => '$val - 6', ValueConvInv => '$val + 6' }, # CSg4-a (Z7_2) + 0x0ef => { # CSg4-b (Z7_2) + Name => 'MovieAFSpeedApply', + PrintConv => { + 1 => 'Always', + 2 => 'Only During Recording', + }, + }, + 0x0f0 => { # CSg5 (Z7_2) + Name => 'MovieAFTrackingSensitivity', + PrintConv => { + 1 => '1 (High)', + 2 => '2', + 3 => '3', + 4 => '4 (Normal)', + 5 => '5', + 6 => '6', + 7 => '7 (Low)', + }, + }, + 0x0f1 => { # CSg4-a (D6), CSg6-a (Z7_2) + Name => 'MovieHighlightDisplayPattern', + PrintConv => { + 1 => 'Pattern 1', + 2 => 'Pattern 2', + 3 => 'Off', + }, + }, + 0x0f2 => { Name => 'SubDialFrameAdvanceRating5', PrintConv => \%noYes, Unknown => 1 }, # (D6,Z7_2) + 0x0f3 => { Name => 'SubDialFrameAdvanceRating4', PrintConv => \%noYes, Unknown => 1 }, # (D6,Z7_2) + 0x0f4 => { Name => 'SubDialFrameAdvanceRating3', PrintConv => \%noYes, Unknown => 1 }, # (D6,Z7_2) + 0x0f5 => { Name => 'SubDialFrameAdvanceRating2', PrintConv => \%noYes, Unknown => 1 }, # (D6,Z7_2) + 0x0f6 => { Name => 'SubDialFrameAdvanceRating1', PrintConv => \%noYes, Unknown => 1 }, # (D6,Z7_2) + 0x0f7 => { Name => 'SubDialFrameAdvanceRating0', PrintConv => \%noYes, Unknown => 1 }, # (D6,Z7_2) + # 0x0f8 ?? looks like it should be part of the above, but nothing seems to cause the value to change. Possibly intended for Rating='Candidate for Deletion' # (D6) + 0x0f9 => { # CSg2-c (Z7_2) + Name => 'MovieAF-OnButton', + PrintConv => { + 1 => 'Center Focus Point', + 2 => 'AF-On', + 3 => 'AF Lock Only', + 4 => 'AE Lock (hold)', + 5 => 'AE Lock Only', + 6 => 'AE/AF Lock', + 7 => 'LiveView Info Display On/Off', + 8 => 'Zoom (Low)', + 9 => 'Zoom (1:1)', + 10 => 'Zoom (High)', + 11 => 'Record Movie', + 12 => 'None', + }, + }, + 0x0fb => { Name => 'SecondarySlotFunction', PrintConv => \%tagSecondarySlotFunction }, # tag name selected to maintain compatibility with older cameras # (Z7_2) + 0x0fb => { Name => 'SecondarySlotFunction', PrintConv => \%tagSecondarySlotFunction }, # (D6) + 0x0fc => { Name => 'SilentPhotography', PrintConv => \%onOff }, # (D6,Z7_2) # tag is associated with Silent LiveView Photography (as distinguisehed from Silent Interval or Silent Focus Shift) + 0x0fd => { Name => 'ExtendedShutterSpeeds', PrintConv => \%onOff }, # CSd7 (D6), CSd6 (Z7_2) + 0x102 => { # (Z7_2) + Name => 'HDMIBitDepth', + RawConv => '$$self{HDMIBitDepth} = $val', + PrintConv => { + 1 => '8 Bit', + 2 => '10 Bit', + #5 => 'Auto', #observed on the Z50 - needs confirmation + }, + }, + 0x103 => { # (Z7_2) + Name => 'HDMIOutputHDR', + Condition => '$$self{HDMIBitDepth} == 2', # HDR(HLC) output option only available only for 10 bit + RawConv => '$$self{HDMIOutputHDR} = $val', + PrintConv => { + 2 => 'On', # unusual decode perhaps due to sharing sub-menu with tag HDMIOutputN-Log? + 3 => 'Off', + }, + }, + 0x104 => { # valid for 10 bit with either N-Log or HDR/HLG selected CSg5 (Z7_2) + Name => 'HDMIViewAssist', + Condition => '$$self{HDMIBitDepth} == 2', + PrintConv => \%onOff + }, + 0x109 => { # (D6,Z7_2) + Name => 'BracketSet', + RawConv => '$$self{BracketSet} = $val', + PrintConv => { + 1 => 'AE/Flash', + 2 => 'AE', + 3 => 'Flash', + 4 => 'White Balance', + 5 => 'Active-D Lighting', + }, + }, + 0x10a => [{ # (D6/Z7_2) + Name => 'BracketProgram', + Condition => '$$self{BracketSet} < 4', + Notes => 'AE and/or Flash Bracketing', + RawConv => '$$self{BracketProgram} = $val', + PrintConv => { + 15 => '+3F', + 16 => '-3F', + 17 => '+2F', + 18 => '-2F', + 19 => 'Disabled', + 20 => '3F', + 21 => '5F', + 22 => '7F', + 23 => '9F', + }, + },{ + Name => 'BracketProgram', + Condition => '$$self{BracketSet} and $$self{BracketSet} == 4', + Notes => 'White Balance Bracketing', + RawConv => '$$self{BracketProgram} = $val', + PrintConv => { + 1 => 'B3F', + 2 => 'A3F', + 3 => 'B2F', + 4 => 'A2F', + 5 => 'Disabled', + 6 => '3F', + 7 => '5F', + 8 => '7F', + 9 => '9F', + 19 => 'N/A' # observed when shooting other than JPG + }, + },{ + Name => 'BracketProgram', + Condition => '$$self{BracketSet} and $$self{BracketSet} == 5', + Notes => 'Active-D Bracketing', + RawConv => '$$self{BracketProgram} = $val', + Mask => 0x0f, + PrintConv => { + 10 => 'Disabled', + 11 => '2 Exposures', + 12 => '3 Exposures', + 13 => '4 Exposures', + 14 => '5 Exposures', + }, + }], + 0x10b => [{ # (D6/Z7_2) + Name => 'BracketIncrement', + Condition => '$$self{BracketSet} < 4 and $$self{BracketProgram} ne 19', + Notes => 'AE and/or Flash Bracketing enabled', + PrintConv => { + 0x01 => '0.3', + 0x03 => '0.5', + 0x04 => '1.0', + 0x05 => '2.0', + 0x06 => '3.0', + }, + },{ + Name => 'BracketIncrement', + Condition => '$$self{BracketSet} == 4 and $$self{BracketProgram} ne 5', + Notes => 'White Balance Bracketing enabled', + PrintConv => '$val-6', # TODO: qualify amber/blue direction of increment (eg, '1A' vs.'1B' vs '1A,1B') + }], + 0x10c => { # (D6/Z7_2) + Name => 'BracketIncrement', + Condition => '$$self{BracketSet} == 5 and $$self{BracketProgram} ne 10', + Notes => 'Active-D Bracketing enabled', + PrintConv => { + 0 => 'Off', + 1 => 'Off, Low', + 2 => 'Off, Normal', + 3 => 'Off, High', + 4 => 'Off, Extra High', + 5 => 'Off, Auto', + 6 => 'Off, Low, Normal', + 7 => 'Off, Low, Normal, High', + 8 => 'Off, Low, Normal, High, Extra High', + }, + }, + 0x10e => { # (D6/Z7_2) + Name => 'MonitorBrightness', + # settings: -5 to +5 + ValueConv => '$val - 6', + }, + 0x116 => { Name => 'GroupAreaC1', PrintConv =>\%groupAreaCustom }, # CSa10-a (new with D6) # (D6) + 0x117 => { Name => 'AutoAreaAFStartingPoint', PrintConv => \%enableDisable }, # CSa12 (D6) + 0x118 => { Name => 'FocusPointPersistence', PrintConv => { 1 => 'Auto', 2 => 'Off' } }, # CSa13 (new with D6) # (D6) + 0x119 => { Name => 'LimitAFAreaModeSelD49', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa14-c (D6) + 0x11a => { Name => 'LimitAFAreaModeSelD105', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa14-d (D6) + 0x11b => { Name => 'LimitAFAreaModeSelGroupC1', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa14-g (D6) + 0x11c => { Name => 'LimitAFAreaModeSelGroupC2', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa14-h (D6) + 0x11d => { # CSa15 (D6) + Name => 'AutoFocusModeRestrictions', + PrintConv => { + 1 => 'AF-S', + 2 => 'AF-C', + 3 => 'No Limit', + }, + }, + 0x11e => { # CSa17-b (D6) + Name => 'FocusPointBrightness', + PrintConv => { + 1 => 'Extra High', + 2 => 'High', + 3 => 'Normal', + 4 => 'Low', + }, + }, + 0x11f => { Name => 'CHModeShootingSpeed', ValueConv => '15 - $val', ValueConvInv => '15 + $val', PrintConv => '"$val fps"', PrintConvInv => '$val=~s/\s*fps//i; $val' }, # CSd1-a (D6) + 0x120 => { Name => 'CLModeShootingSpeed', ValueConv => '11 - $val', ValueConvInv => '11 + $val', PrintConv => '"$val fps"', PrintConvInv => '$val=~s/\s*fps//i; $val' }, # CSd1-b (D6) + 0x121 => { # CSd1-c (new with D6) + Name => 'QuietShutterShootingSpeed', + PrintConv => { + 1 => 'Single', + 2 => '5 fps', + 3 => '4 fps', + 4 => '3 fps', + 5 => '2 fps', + 6 => '1 fps', + }, + }, + 0x122 => { Name => 'LimitReleaseModeSelCL', PrintConv => \%limtReleaseModeSel, Unknown => 1 }, # CSd3-a (D6) + 0x123 => { Name => 'LimitReleaseModeSelCH', PrintConv => \%limtReleaseModeSel, Unknown => 1 }, # CSd3-b (D6) + 0x124 => { Name => 'LimitReleaseModeSelQ', PrintConv => \%limtReleaseModeSel, Unknown => 1 }, # CSd3-c (D6) + 0x125 => { Name => 'LimitReleaseModeSelTimer', PrintConv => \%limtReleaseModeSel, Unknown => 1 }, # CSd3-d (D6) + 0x126 => { Name => 'LimitReleaseModeSelMirror-Up', PrintConv => \%limtReleaseModeSel, Unknown => 1 }, # CSd3-e (D6) + 0x127 => { Name => 'LimitSelectableImageArea16To9', PrintConv => \%limitNolimit, Unknown => 1 }, # CSd8-5 (D6) + 0x128 => { Name => 'RearControPanelDisplay', PrintConv => { 1 => 'Release Mode', 2 => 'Frame Count' } }, # CSd12 # new tag with D6 # (D6) + 0x129 => { Name => 'FlashBurstPriority', PrintConv => { 1 => 'Frame Rate', 2 => 'Exposure' } }, # CSE5 # new tag with D6 # (D6) + 0x12a => { Name => 'RecallShootFuncExposureMode', PrintConv => \%offOn }, # (D6) + 0x12b => { Name => 'RecallShootFuncShutterSpeed', PrintConv => \%offOn }, # (D6) + 0x12c => { Name => 'RecallShootFuncAperture', PrintConv => \%offOn }, # (D6) + 0x12d => { Name => 'RecallShootFuncExposureComp', PrintConv => \%offOn }, # (D6) + 0x12e => { Name => 'RecallShootFuncISO', PrintConv => \%offOn }, # (D6) + 0x12f => { Name => 'RecallShootFuncMeteringMode', PrintConv => \%offOn }, # (D6) + 0x130 => { Name => 'RecallShootFuncWhiteBalance', PrintConv => \%offOn }, # (D6) + 0x131 => { Name => 'RecallShootFuncAFAreaMode', PrintConv => \%offOn }, # (D6) + 0x132 => { Name => 'RecallShootFuncFocusTracking', PrintConv => \%offOn }, # (D6) + 0x133 => { Name => 'RecallShootFuncAF-On', PrintConv => \%offOn }, # (D6) + 0x134 => { # CSf3-d (D6) + Name => 'VerticalFuncButton', + PrintConv => { + 1 => 'Preset Focus Point', + 2 => 'AE Lock (hold)', + 3 => 'AE/WB Lock (hold)', + 4 => 'AE Lock (reset on release)', + 5 => 'FV Lock', + 6 => 'Preview', + 7 => '+NEF(RAW)', + 8 => 'Grid Display', + 9 => 'Virtual Horizon', + 10 => 'Voice Memo', + 11 => 'Playback', + 12 => 'Filtered Playback', + 13 => 'Photo Shooting Bank', + 14 => 'Exposure Mode', + 15 => 'Exposure Comp', + 16 => 'AF Mode/AF Area Mode', + 17 => 'Image Area', + 18 => 'ISO', + 19 => 'Active-D Lighting', + 20 => 'Metering', + 21 => 'Exposure Delay Mode', + 22 => 'Shutter/Aperture Lock', + 23 => '1 Stop Speed/Aperture', + 24 => 'Rating 0', + 25 => 'Rating 5', + 26 => 'Rating 4', + 27 => 'Rating 3', + 28 => 'Rating 2', + 29 => 'Rating 1', + 30 => 'Candidate For Deletion', + 31 => 'Non-CPU Lens', + 32 => 'None', + }, + }, + 0x135 => { # CSf3-e (D6) + Name => 'Func3Button', + PrintConv => { + 1 => 'Voice Memo', + 2 => 'Select To Send', + 3 => 'Wired LAN', + 4 => 'My Menu', + 5 => 'My Menu Top Item', + 6 => 'Filtered Playback', + 7 => 'Rating 0', + 8 => 'Rating 5', + 9 => 'Rating 4', + 10 => 'Rating 3', + 11 => 'Rating 2', + 12 => 'Rating 1', + 13 => 'Candidate For Deletion', + 14 => 'None', + }, + }, + 0x136 => { # CSf3-i (D6) + Name => 'VerticalAF-OnButton', + PrintConv => { + 1 => 'AF-AreaMode S', + 2 => 'AF-AreaMode D9', + 3 => 'AF-AreaMode D25', + 4 => 'AF-AreaMode D49', + 5 => 'AF-AreaMode D105', + 6 => 'AF-AreaMode 3D', + 7 => 'AF-AreaMode Group', + 8 => 'AF-AreaMode Group C1', + 9 => 'AF-AreaMode Group C2', + 10 => 'AF-AreaMode Auto Area', + 11 => 'AF-AreaMode + AF-On S', + 12 => 'AF-AreaMode + AF-On D9', + 13 => 'AF-AreaMode + AF-On D25', + 14 => 'AF-AreaMode + AF-On D49', + 15 => 'AF-AreaMode + AF-On D105', + 16 => 'AF-AreaMode + AF-On 3D', + 17 => 'AF-AreaMode + AF-On Group', + 18 => 'AF-AreaMode + AF-On Group C1', + 19 => 'AF-AreaMode + AF-On Group C2', + 20 => 'AF-AreaMode + AF-On Auto Area', + 21 => 'Same as AF-On', + 22 => 'AF-On', + 23 => 'AF Lock Only', + 24 => 'AE Lock (hold)', + 25 => 'AE/WB Lock (hold)', + 26 => 'AE Lock (reset on release)', + 27 => 'AE Lock Only', + 28 => 'AE/AF Lock', + 29 => 'Recall Shooting Functions', + 30 => 'None', + }, + }, + 0x137 => { Name => 'VerticalMultiSelector', PrintConv => \%tagSubSelector }, # CSf3-j-1 # (D6) + 0x138 => { # CSf3-k (D6) + Name => 'MeteringButton', + PrintConv => { + 1 => 'Photo Shooting Bank', + 2 => 'Image Area', + 3 => 'Active-D Lighting', + 4 => 'Metering', + 5 => 'Exposure Delay Mode', + 6 => 'Shutter/Aperture Lock', + 7 => '1 Stop Speed/Aperture', + 8 => 'Non-CPU Lens', + 9 => 'None', + }, + }, + 0x139 => { Name => 'PlaybackFlickUp', RawConv => '$$self{PlaybackFlickUp} = $val', PrintConv => \%flickUpDownD6 }, # CSf12-1-a # (D6) + 0x13a => { Name => 'PlaybackFlickUpRating', Condition => '$$self{PlaybackFlickUp} and $$self{PlaybackFlickUp} == 1', Notes => 'Meaningful only when PlaybackFlickUp is Rating', PrintConv => \%flickUpDownRatingD6 }, # CSf12-1-b # (D6) + 0x13b => { Name => 'PlaybackFlickDown', RawConv => '$$self{PlaybackFlickDown} = $val', PrintConv => \%flickUpDownD6 }, # CSf12-2-a # (D6) + 0x13c => { Name => 'PlaybackFlickDownRating', Condition => '$$self{PlaybackFlickDown} and $$self{PlaybackFlickDown} == 1', Notes => 'Meaningful only when PlaybackFlickDown is Rating', PrintConv => \%flickUpDownRatingD6 }, # CSf12-2-b # (D6) + 0x13d => { # CSg2-d (D6) + Name => 'MovieFunc3Button', + PrintConv => { + 1 => 'Record Movie', + 2 => 'My Menu', + 3 => 'My Menu Top Item', + 4 => 'None', + }, + }, + 0x150 => { # CSd5 (Z7_2) new with Z series + Name => 'ShutterType', + PrintConv => { + 1 => 'Auto', + 2 => 'Mechanical', + 3 => 'Electronic', + }, + }, + 0x151 => { Name => 'LensFunc2Button', PrintConv => \%lensFuncButtonZ7m2 }, # CSf2-h (Z7_2) + #0x153 => { Name => 'ViewfinderBrightness', } #(Z7_2) # commented out to reduce output volume. Range [-5,+5]. PrintConv matches MonitorBrightness. + 0x158 => { Name => 'USBPowerDelivery', PrintConv => \%enableDisable }, # (Z7_2) + 0x159 => { Name => 'EnergySavingMode', PrintConv =>\%onOff }, # (Z7_2) + 0x15c => { Name => 'BracketingBurstOptions',PrintConv => \%enableDisable }, # CSe9 (D6) + # 0x15d => CSf3-j-2 (D6) 'Same as Multi-Selector with Info(U/D) & Playback(R/L)' and 'Same as Multi-Selector with Info(R/L) & Playback(U/D)' (skipped to reduce volume of output) + 0x15e => { Name => 'PrimarySlot', PrintConv => { 1 => 'CFexpress/XQD Card', 2 => 'SD Card' } }, # (Z7_2) + 0x15f => { Name => 'ReverseFocusRing', PrintConv => { 1 => 'Not Reversed', 2 => 'Reversed' } }, # CSf8 (Z7_2) + 0x160 => { # CSf9-a (Z7_2) + Name => 'VerticalFuncButton', + PrintConv => { + 1 => 'AE Lock (hold)', + 2 => 'AE Lock (reset on release)', + 3 => 'FV Lock', + 4 => 'Preview', + 5 => '+NEF(RAW)', + 6 => 'Subject Tracking', + 7 => 'Silent Photography', + 8 => 'LiveView Info Display On/Off', + 9 => 'Playback', + 10 => 'Image Area', + 11 => 'Metering', + 12 => 'Flash Mode', + 13 => 'Focus Mode', + 14 => 'Exposure Delay Mode', + 15 => 'Shutter/Aperture Lock', + 16 => 'Exposure Compensation', + 17 => 'ISO Sensitivity', + 18 => 'None', + }, + }, + 0x161 => { # CSf9-b (Z7_2) + Name => 'VerticalAFOnButton', + PrintConv => { + 1 => 'Same as AF-On Button', + 2 => 'Select Center Focus Point', + 3 => 'AF-On', + 4 => 'AF Lock Only', + 5 => 'AE Lock (hold)', + 6 => 'AE Lock (reset on release)', + 7 => 'AE Lock Only', + 8 => 'AE/AF Lock', + 9 => 'LiveView Info Display On/Off', + 10 => 'Zoom (Low)', + 11 => 'Zoom (1:1)', + 12 => 'Zoom (High)', + 13 => 'None', + }, + }, + 0x162 => { Name => 'VerticalMultiSelector', PrintConv => \%tagSubSelector }, # CSf9-c (Z7_2) + # 0x163 => CSf9-c-2 (Z7_2) 'Same as Multi-Selector with Info(U/D) & Playback(R/L)' and 'Same as Multi-Selector with Info(R/L) & Playback(U/D)' (skipped to reduce volume of output) + 0x164 => { # CSg7-a (Z7_2) + Name => 'VerticalMovieFuncButton', + PrintConv => { + 1 => 'LiveView Info Display On/Off', + 2 => 'Record Movie', + 3 => 'Exposure Compensation', + 4 => 'ISO', + 5 => 'None', + }, + }, + 0x165 => { # CSg7-b (Z7_2) + Name => 'VerticalMovieAFOnButton', + PrintConv => { + 1 => 'Same as AF-On', + 2 => 'Center Focus Point', + 3 => 'AF-On', + 4 => 'AF Lock Only', + 5 => 'AE Lock (hold)', + 6 => 'AE Lock Only', + 7 => 'AE/AF Lock', + 8 => 'LiveView Info Display On/Off', + 9 => 'Zoom (Low)', + 10 => 'Zoom (1:1)', + 11 => 'Zoom (High)', + 12 => 'Record Movie', + 13 => 'None', + }, + }, + #0x168 => { Name => 'ControlPanelBrightness', # (Z7_2) #commented to reduce output volume + 0x169 => { Name => 'LimitAF-AreaModeSelAutoPeople', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa7-h (Z7_2) + 0x16a => { Name => 'LimitAF-AreaModeSelAutoAnimals', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa7-h (Z7_2) + 0x16b => { Name => 'LimitAF-AreaModeSelWideLPeople', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa7-e (Z7_2) + 0x16c => { Name => 'LimitAF-AreaModeSelWideLAnimals', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa7-f (Z7_2) + 0x16d => { Name => 'SaveFocus', PrintConv => \%onOff }, # (Z7_2) + 0x16e => { # (Z7_2) + Name => 'AFAreaMode', + RawConv => '$$self{AFAreaMode} = $val', + PrintConv => { + 2 => 'Single-point', + 3 => 'Dynamic-area', + 4 => 'Wide (S)', + 5 => 'Wide (L)', + 6 => 'Wide (L-people)', + 7 => 'Wide (L-animals)', + 8 => 'Auto', + 9 => 'Auto (People)', + 10 => 'Auto (Animals)', + }, + }, + 0x16f => { # (Z7_2) + Name => 'MovieAFAreaMode', + PrintConv => { + 1 => 'Single-point', + 2 => 'Wide (S)', + 3 => 'Wide (L)', + 4 => 'Wide (L-people)', + 5 => 'Wide (L-animals)', + 6 => 'Auto', + 7 => 'Auto (People)', + 8 => 'Auto (Animals)', + }, + }, + 0x170 => { Name => 'PreferSubSelectorCenter', PrintConv => \%offOn }, # CSf13 (D6 firmware v1.2.0) + 0x171 => { # CSb8 (D6 firmware v1.3.0) + Name => 'KeepExposureWithTeleconverter', + PrintConv => { + 1 => 'Off', + 2 => 'Shutter Speed', + 3 => 'ISO', + }, + }, + 0x174 => { # CSa17-d (D6 firmware v1.2.0) + Name => 'FocusPointSelectionSpeed', + PrintConv => { + 1 => 'Normal', + 2 => 'High', + 3 => 'Very High', + }, + }, +); + +#------------------------------------------------------------------------------ +# Process NikonSettings directory (ref PH) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessNikonSettings($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + + # NikonSettings directory has a 24-byte header: + # 0x00 - undef[4]: '0100' + # 0x04 - int32u: 1 (D-models), 2 (Z-models) + # 0x08 - undef[4]: '0100' + # 0x0c - int32u: 1 (Z7), 2 (D850), 3 (D780,Z50), 4 (D6,Z5), 5(Z7m2) + # 0x10 - undef[4]: firmware version (eg. '0110' for firmware 1.10) + # 0x14 - int32u: number of entries in directory + + return 0 if $$dirInfo{DirLen} < 24; # sanity check + + my $dataPt = $$dirInfo{DataPt}; + my $start = $$dirInfo{DirStart}; + my $num = Get32u($dataPt, $start + 0x14); + + $et->VerboseDir('NikonSettings', $num); + + my $n = int(($$dirInfo{DirLen} - 0x18) / 8); + if ($n < $num) { + $et->Warn('Missing '.($num-$n).' NikonSettings entries', 1); + $num = $n; + } elsif ($n > $num) { + $et->Warn('Unused space in NikonSettings directory', 1); + } + my $i; + for ($i=0; $i<$num; ++$i) { + my $entry = $start + 0x18 + $i * 8; + my $tag = Get16u($dataPt, $entry); + my $fmt = Get16u($dataPt, $entry + 2); + my $val = Get32u($dataPt, $entry + 4); + # abort if the tag has a format that we haven't yet seen + # (assuming this is a size/format code. So far we have only seen 0x400) + $fmt == 0x400 or $et->Warn(sprintf('Unknown format 0x%x for NikonSettings tag 0x%.4x',$fmt,$tag)), last; + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + Base => $$dirInfo{Base}, + Start => $entry + 4, + Size => 4, + Format => 'int32u', + Index => $i, + ); + } + return 1; +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::NikonSettings - Read Nikon user settings + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains the definitions necessary to read the user settings for +Nikon cameras such as the D6 and Z7mk2. + + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Thanks to Warren Hatch for his work decoding settings for the D6 and Z7mkII, +and for providing the original source code for this module. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Nikon Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Nintendo.pm b/lib/Image/ExifTool/Nintendo.pm new file mode 100644 index 0000000..5665859 --- /dev/null +++ b/lib/Image/ExifTool/Nintendo.pm @@ -0,0 +1,128 @@ +#------------------------------------------------------------------------------ +# File: Nintendo.pm +# +# Description: Nintendo EXIF maker notes tags +# +# Revisions: 2014/03/25 - P. Harvey Created +# +# References: 1) http://3dbrew.org/wiki/MPO +#------------------------------------------------------------------------------ + +package Image::ExifTool::Nintendo; + +use strict; +use vars qw($VERSION); +use Image::ExifTool::Exif; + +$VERSION = '1.00'; + +%Image::ExifTool::Nintendo::Main = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + # 0x1000 - undef[28] + # 0x1001 - undef[8] + # 0x1100 - undef[80] (found in MPO files) + 0x1101 => { + Name => 'CameraInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Nintendo::CameraInfo', + ByteOrder => 'Little-endian', + }, + }, +); + +# Nintendo MPO info (ref 1) +%Image::ExifTool::Nintendo::CameraInfo = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + PRIORITY => 0, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + 0x00 => { # "3DS1" + Name => 'ModelID', + Format => 'undef[4]', + }, + # 0x04 - int32u: 1,2,4,5 + 0x08 => { + Name => 'TimeStamp', + Format => 'int32u', + Groups => { 2 => 'Time' }, + Shift => 'Time', + # zero time is 2000/01/01 (10957 days after Unix time zero) + ValueConv => 'ConvertUnixTime($val + 10957 * 24 * 3600)', + ValueConvInv => 'GetUnixTime($val) - 10957 * 24 * 3600', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + # 0x10 - int32u: title ID low + # 0x14 - int32u: flags + 0x18 => { + Name => 'InternalSerialNumber', + Groups => { 2 => 'Camera' }, + Format => 'undef[4]', + ValueConv => '"0x" . unpack("H*",$val)', + ValueConvInv => '$val=~s/^0x//; pack("H*",$val)', + }, + 0x28 => { + Name => 'Parallax', + Format => 'float', + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + }, + 0x30 => { + Name => 'Category', + Format => 'int16u', + PrintHex => 1, + PrintConv => { + 0x0000 => '(none)', + 0x1000 => 'Mii', + 0x2000 => 'Man', + 0x4000 => 'Woman', + }, + }, + # 0x32 - int16u: filter +); + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Nintendo - Nintendo EXIF maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to +interpret Nintendo maker notes EXIF meta information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://3dbrew.org/wiki/MPO> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Nintendo Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/OOXML.pm b/lib/Image/ExifTool/OOXML.pm new file mode 100644 index 0000000..e135dc5 --- /dev/null +++ b/lib/Image/ExifTool/OOXML.pm @@ -0,0 +1,410 @@ +#------------------------------------------------------------------------------ +# File: OOXML.pm +# +# Description: Read Office Open XML+ZIP files +# +# Revisions: 2009/10/31 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::OOXML; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::XMP; +use Image::ExifTool::ZIP; + +$VERSION = '1.08'; + +# test for recognized OOXML document extensions +my %isOOXML = ( + DOCX => 1, DOCM => 1, + DOTX => 1, DOTM => 1, + POTX => 1, POTM => 1, + PPAX => 1, PPAM => 1, + PPSX => 1, PPSM => 1, + PPTX => 1, PPTM => 1, THMX => 1, + XLAM => 1, + XLSX => 1, XLSM => 1, XLSB => 1, + XLTX => 1, XLTM => 1, +); + +# generate reverse lookup for file type based on MIME +my %fileType; +{ + my $type; + foreach $type (keys %isOOXML) { + $fileType{$Image::ExifTool::mimeType{$type}} = $type; + } +} + +# XML attributes to queue +my %queuedAttrs; +my %queueAttrs = ( + fmtid => 1, + pid => 1, + name => 1, +); + +# keep track of items in a vector (to accumulate as a list) +my $vectorCount; +my @vectorVals; + +# Office Open XML tags +%Image::ExifTool::OOXML::Main = ( + GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Document' }, + PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP, + VARS => { NO_ID => 1 }, + NOTES => q{ + The Office Open XML (OOXML) format was introduced with Microsoft Office 2007 + and is used by file types such as DOCX, PPTX and XLSX. These are + essentially ZIP archives containing XML files. The table below lists some + tags which have been observed in OOXML documents, but ExifTool will extract + any tags found from XML files of the OOXML document properties ("docProps") + directory. + + B<Tips:> + + 1) Structural ZIP tags may be ignored (if desired) with C<--ZIP:all> on the + command line. + + 2) Tags may be grouped by their document number in the ZIP archive with the + C<-g3> or C<-G3> option. + }, + # These tags all have 1:1 correspondence with FlashPix tags except for: + # OOXML FlashPix + # --------------- ------------- + # DocSecurity Security + # Application Software + # dc:Description Comments + # dc:Creator Author + Application => { }, + AppVersion => { }, + category => { }, + Characters => { }, + CharactersWithSpaces => { }, + CheckedBy => { }, + Client => { }, + Company => { }, + created => { + Name => 'CreateDate', + Groups => { 2 => 'Time' }, + Format => 'date', + PrintConv => '$self->ConvertDateTime($val)', + }, + createdType => { Hidden => 1, RawConv => 'undef' }, # ignore this XML type name + DateCompleted => { + Groups => { 2 => 'Time' }, + Format => 'date', + PrintConv => '$self->ConvertDateTime($val)', + }, + Department => { }, + Destination => { }, + Disposition => { }, + Division => { }, + DocSecurity => { + # (http://msdn.microsoft.com/en-us/library/documentformat.openxml.extendedproperties.documentsecurity.aspx) + PrintConv => { + 0 => 'None', + 1 => 'Password protected', + 2 => 'Read-only recommended', + 4 => 'Read-only enforced', + 8 => 'Locked for annotations', + }, + }, + DocumentNumber=> { }, + Editor => { Groups => { 2 => 'Author'} }, + ForwardTo => { }, + Group => { }, + HeadingPairs=> { }, + HiddenSlides=> { }, + HyperlinkBase=>{ }, + HyperlinksChanged => { PrintConv => { 'false' => 'No', 'true' => 'Yes' } }, + keywords => { }, + Language => { }, + lastModifiedBy => { Groups => { 2 => 'Author'} }, + lastPrinted => { + Groups => { 2 => 'Time' }, + Format => 'date', + PrintConv => '$self->ConvertDateTime($val)', + }, + Lines => { }, + LinksUpToDate=>{ PrintConv => { 'false' => 'No', 'true' => 'Yes' } }, + Mailstop => { }, + Manager => { }, + Matter => { }, + MMClips => { }, + modified => { + Name => 'ModifyDate', + Groups => { 2 => 'Time' }, + Format => 'date', + PrintConv => '$self->ConvertDateTime($val)', + }, + modifiedType=> { Hidden => 1, RawConv => 'undef' }, # ignore this XML type name + Notes => { }, + Office => { }, + Owner => { Groups => { 2 => 'Author'} }, + Pages => { }, + Paragraphs => { }, + PresentationFormat => { }, + Project => { }, + Publisher => { }, + Purpose => { }, + ReceivedFrom=> { }, + RecordedBy => { }, + RecordedDate=> { + Groups => { 2 => 'Time' }, + Format => 'date', + PrintConv => '$self->ConvertDateTime($val)', + }, + Reference => { }, + revision => { Name => 'RevisionNumber' }, + ScaleCrop => { PrintConv => { 'false' => 'No', 'true' => 'Yes' } }, + SharedDoc => { PrintConv => { 'false' => 'No', 'true' => 'Yes' } }, + Slides => { }, + Source => { }, + Status => { }, + TelephoneNumber => { }, + Template => { }, + TitlesOfParts=>{ }, + TotalTime => { + Name => 'TotalEditTime', + PrintConv => 'ConvertTimeSpan($val, 60)', + }, + Typist => { }, + Words => { }, +); + +#------------------------------------------------------------------------------ +# Generate a tag ID for this XML tag +# Inputs: 0) tag property name list ref +# Returns: tagID and outtermost interesting namespace (or '' if no namespace) +sub GetTagID($) +{ + my $props = shift; + my ($tag, $prop, $namespace); + foreach $prop (@$props) { + # split name into namespace and property name + # (Note: namespace can be '' for property qualifiers) + my ($ns, $nm) = ($prop =~ /(.*?):(.*)/) ? ($1, $2) : ('', $prop); + next if $ns eq 'vt'; # ignore 'vt' properties + if (defined $tag) { + $tag .= ucfirst($nm); # add to tag name + } elsif ($prop ne 'Properties' and $prop ne 'cp:coreProperties' and + $prop ne 'property') + { + $tag = $nm; + # save namespace of first property to contribute to tag name + $namespace = $ns unless $namespace; + } + } + return ($tag, $namespace || ''); +} + +#------------------------------------------------------------------------------ +# We found an XMP property name/value +# Inputs: 0) ExifTool object ref, 1) tag table ref +# 2) reference to array of XMP property names (last is current property) +# 3) property value, 4) attribute hash ref (not used here) +# Returns: 1 if valid tag was found +sub FoundTag($$$$;$) +{ + my ($et, $tagTablePtr, $props, $val, $attrs) = @_; + return 0 unless @$props; + my $verbose = $et->Options('Verbose'); + + my $tag = $$props[-1]; + $et->VPrint(0, " | - Tag '", join('/',@$props), "'\n") if $verbose > 1; + + # un-escape XML character entities + $val = Image::ExifTool::XMP::UnescapeXML($val); + # convert OOXML-escaped characters (eg. "_x0000d_" is a newline) + $val =~ s/_x([0-9a-f]{4})_/Image::ExifTool::PackUTF8(hex($1))/gie; + # convert from UTF8 to ExifTool Charset + $val = $et->Decode($val, 'UTF8'); + # queue this attribute for later if necessary + if ($queueAttrs{$tag}) { + $queuedAttrs{$tag} = $val; + return 0; + } + my $ns; + ($tag, $ns) = GetTagID($props); + if (not $tag) { + # all properties are in ignored namespaces + # so 'name' from our queued attributes for the tag + my $name = $queuedAttrs{name} or return 0; + $name =~ s/(^| )([a-z])/$1\U$2/g; # start words with uppercase + ($tag = $name) =~ tr/-_a-zA-Z0-9//dc; + return 0 unless length $tag; + unless ($$tagTablePtr{$tag}) { + my %tagInfo = ( + Name => $tag, + Description => $name, + ); + # format as a date/time value if type is 'vt:filetime' + if ($$props[-1] eq 'vt:filetime') { + $tagInfo{Groups} = { 2 => 'Time' }, + $tagInfo{Format} = 'date', + $tagInfo{PrintConv} = '$self->ConvertDateTime($val)'; + } + $et->VPrint(0, " | [adding $tag]\n") if $verbose; + AddTagToTable($tagTablePtr, $tag, \%tagInfo); + } + } elsif ($tag eq 'xmlns') { + # ignore namespaces (for now) + return 0; + } elsif (ref $Image::ExifTool::XMP::Main{$ns} eq 'HASH' and + $Image::ExifTool::XMP::Main{$ns}{SubDirectory}) + { + # use standard XMP table if it exists + my $table = $Image::ExifTool::XMP::Main{$ns}{SubDirectory}{TagTable}; + no strict 'refs'; + if ($table and %$table) { + $tagTablePtr = Image::ExifTool::GetTagTable($table); + } + } elsif (@$props > 2 and grep /^vt:vector$/, @$props) { + # handle vector properties (accumulate as lists) + if ($$props[-1] eq 'vt:size') { + $vectorCount = $val; + undef @vectorVals; + return 0; + } elsif ($$props[-1] eq 'vt:baseType') { + return 0; # ignore baseType + } elsif ($vectorCount) { + --$vectorCount; + if ($vectorCount) { + push @vectorVals, $val; + return 0; + } + $val = [ @vectorVals, $val ] if @vectorVals; + # Note: we will lose any improper-sized vector elements here + } + } + # add any unknown tags to table + if ($$tagTablePtr{$tag}) { + my $tagInfo = $$tagTablePtr{$tag}; + if (ref $tagInfo eq 'HASH') { + # reformat date/time values + my $fmt = $$tagInfo{Format} || $$tagInfo{Writable} || ''; + $val = Image::ExifTool::XMP::ConvertXMPDate($val) if $fmt eq 'date'; + } + } else { + $et->VPrint(0, " [adding $tag]\n") if $verbose; + AddTagToTable($tagTablePtr, $tag, { Name => ucfirst $tag }); + } + # save the tag + $et->HandleTag($tagTablePtr, $tag, $val); + + # start fresh for next tag + undef $vectorCount; + undef %queuedAttrs; + + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from an OOXML file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 +# Notes: Upon entry to this routine, the file type has already been verified +# and the dirInfo hash contains 2 elements unique to this process proc: +# MIME - mime type of main document from "[Content_Types].xml" +# ZIP - reference to Archive::Zip object for this file +sub ProcessDOCX($$) +{ + my ($et, $dirInfo) = @_; + my $zip = $$dirInfo{ZIP}; + my $tagTablePtr = GetTagTable('Image::ExifTool::OOXML::Main'); + my $mime = $$dirInfo{MIME} || $Image::ExifTool::mimeType{DOCX}; + + # set the file type ('DOCX' by default) + my $fileType = $fileType{$mime}; + if ($fileType) { + # THMX is a special case because its contents.main MIME types is PPTX + if ($fileType eq 'PPTX' and $$et{FILE_EXT} and $$et{FILE_EXT} eq 'THMX') { + $fileType = 'THMX'; + } + } else { + $et->VPrint(0, "Unrecognized MIME type: $mime\n"); + # get MIME type according to file extension + $fileType = $$et{FILE_EXT}; + # default to 'DOCX' if this isn't a known OOXML extension + $fileType = 'DOCX' unless $fileType and $isOOXML{$fileType}; + } + $et->SetFileType($fileType); + + # must catch all Archive::Zip warnings + local $SIG{'__WARN__'} = \&Image::ExifTool::ZIP::WarnProc; + # extract meta information from all files in ZIP "docProps" directory + my $docNum = 0; + my @members = $zip->members(); + my $member; + foreach $member (@members) { + # get filename of this ZIP member + my $file = $member->fileName(); + next unless defined $file; + $et->VPrint(0, "File: $file\n"); + # set the document number and extract ZIP tags + $$et{DOC_NUM} = ++$docNum; + Image::ExifTool::ZIP::HandleMember($et, $member); + # process only XML and JPEG/WMF thumbnail images in "docProps" directory + next unless $file =~ m{^docProps/(.*\.xml|(thumbnail\.(jpe?g|wmf)))$}i; + # get the file contents (CAREFUL! $buff MUST be local since we hand off a value ref) + my ($buff, $status) = $zip->contents($member); + $status and $et->Warn("Error extracting $file"), next; + # extract docProps/thumbnail.(jpg|mwf) as PreviewImage|PreviewMWF + if ($file =~ /\.(jpe?g|wmf)$/i) { + my $tag = $file =~ /\.wmf$/i ? 'PreviewWMF' : 'PreviewImage'; + $et->FoundTag($tag, \$buff); + next; + } + # process XML files (docProps/app.xml, docProps/core.xml, docProps/custom.xml) + my %dirInfo = ( + DataPt => \$buff, + DirLen => length $buff, + DataLen => length $buff, + XMPParseOpts => { + FoundProc => \&FoundTag, + }, + ); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + undef $buff; # (free memory now) + } + delete $$et{DOC_NUM}; + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::OOXML - Read Office Open XML+ZIP files + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from Office Open XML files. This is the format of Word, Excel +and PowerPoint files written by Microsoft Office 2007 -- essentially ZIP +archives of XML files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/OOXML Tags>, +L<Image::ExifTool::TagNames/FlashPix Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Ogg.pm b/lib/Image/ExifTool/Ogg.pm new file mode 100644 index 0000000..7b92185 --- /dev/null +++ b/lib/Image/ExifTool/Ogg.pm @@ -0,0 +1,240 @@ +#------------------------------------------------------------------------------ +# File: Ogg.pm +# +# Description: Read Ogg meta information +# +# Revisions: 2011/07/13 - P. Harvey Created (split from Vorbis.pm) +# 2016/07/14 - PH Added Ogg Opus support +# +# References: 1) http://www.xiph.org/vorbis/doc/ +# 2) http://flac.sourceforge.net/ogg_mapping.html +# 3) http://www.theora.org/doc/Theora.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::Ogg; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.02'; + +my $MAX_PACKETS = 2; # maximum packets to scan from each stream at start of file + +# Information types recognizedi in Ogg files +%Image::ExifTool::Ogg::Main = ( + NOTES => q{ + ExifTool extracts the following types of information from Ogg files. See + L<http://www.xiph.org/vorbis/doc/> for the Ogg specification. + }, + # (these are for documentation purposes only, and aren't used by the code below) + vorbis => { SubDirectory => { TagTable => 'Image::ExifTool::Vorbis::Main' } }, + theora => { SubDirectory => { TagTable => 'Image::ExifTool::Theora::Main' } }, + Opus => { SubDirectory => { TagTable => 'Image::ExifTool::Opus::Main' } }, + FLAC => { SubDirectory => { TagTable => 'Image::ExifTool::FLAC::Main' } }, + ID3 => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::Main' } }, +); + +#------------------------------------------------------------------------------ +# Process Ogg packet +# Inputs: 0) ExifTool object ref, 1) data ref +# Returns: 1 on success +sub ProcessPacket($$) +{ + my ($et, $dataPt) = @_; + my $rtnVal = 0; + if ($$dataPt =~ /^(.)(vorbis|theora)/s or $$dataPt =~ /^(OpusHead|OpusTags)/) { + my ($tag, $type, $pos) = $2 ? (ord($1), ucfirst($2), 7) : ($1, 'Opus', 8); + # this is an OGV file if it contains Theora video + $et->OverrideFileType('OGV') if $type eq 'Theora' and $$et{FILE_TYPE} eq 'OGG'; + $et->OverrideFileType('OPUS') if $type eq 'Opus' and $$et{FILE_TYPE} eq 'OGG'; + my $tagTablePtr = GetTagTable("Image::ExifTool::${type}::Main"); + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + return 0 unless $tagInfo and $$tagInfo{SubDirectory}; + my $subdir = $$tagInfo{SubDirectory}; + my %dirInfo = ( + DataPt => $dataPt, + DirName => $$tagInfo{Name}, + DirStart => $pos, + ); + my $table = GetTagTable($$subdir{TagTable}); + # set group1 so Theoris comments can be distinguised from Vorbis comments + $$et{SET_GROUP1} = $type if $type eq 'Theora'; + SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder}; + $rtnVal = $et->ProcessDirectory(\%dirInfo, $table); + SetByteOrder('II'); + delete $$et{SET_GROUP1}; + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Extract information from an Ogg file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid Ogg file +sub ProcessOGG($$) +{ + my ($et, $dirInfo) = @_; + + # must first check for leading/trailing ID3 information + unless ($$et{DoneID3}) { + require Image::ExifTool::ID3; + Image::ExifTool::ID3::ProcessID3($et, $dirInfo) and return 1; + } + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my ($success, $page, $packets, $streams, $stream) = (0,0,0,0,''); + my ($buff, $flag, %val, $numFlac, %streamPage); + + for (;;) { + # must read ahead to next page to see if it is a continuation + # (this code would be a lot simpler if the continuation flag + # was on the leading instead of the trailing page!) + if ($raf and $raf->Read($buff, 28) == 28) { + # validate magic number + unless ($buff =~ /^OggS/) { + $success and $et->Warn('Lost synchronization'); + last; + } + unless ($success) { + # set file type and initialize on first page + $success = 1; + $et->SetFileType(); + SetByteOrder('II'); + } + $flag = Get8u(\$buff, 5); # page flag + $stream = Get32u(\$buff, 14); # stream serial number + if ($flag & 0x02) { + ++$streams; # count start-of-stream pages + $streamPage{$stream} = $page = 0; + } else { + $page = $streamPage{$stream}; + } + ++$packets unless $flag & 0x01; # keep track of packet count + } else { + # all done unless we have to process our last packet + last unless %val; + ($stream) = sort keys %val; # take a stream + $flag = 0; # no continuation + undef $raf; # flag for done reading + } + + if (defined $numFlac) { + # stop to process FLAC headers if we hit the end of file + last unless $raf; + --$numFlac; # one less header packet to read + } else { + # can finally process previous packet from this stream + # unless this is a continuation page + if (defined $val{$stream} and not $flag & 0x01) { + ProcessPacket($et, \$val{$stream}); + delete $val{$stream}; + # only read the first $MAX_PACKETS packets from each stream + if ($packets > $MAX_PACKETS * $streams or not defined $raf) { + last unless %val; # all done (success!) + } + } + # stop processing Ogg if we have scanned enough packets + last if $packets > $MAX_PACKETS * $streams and not %val; + } + + # continue processing the current page + my $pageNum = Get32u(\$buff, 18); # page sequence number + my $nseg = Get8u(\$buff, 26); # number of segments + # calculate total data length + my $dataLen = Get8u(\$buff, 27); + if ($nseg) { + $raf->Read($buff, $nseg-1) == $nseg-1 or last; + my @segs = unpack('C*', $buff); + # could check that all these (but the last) are 255... + foreach (@segs) { $dataLen += $_ } + } + if (defined $page) { + if ($page == $pageNum) { + $streamPage{$stream} = ++$page; + } else { + $et->Warn('Missing page(s) in Ogg file'); + undef $page; + delete $streamPage{$stream}; + } + } + # read page data + $raf->Read($buff, $dataLen) == $dataLen or last; + if ($verbose > 1) { + printf $out "Page %d, stream 0x%x, flag 0x%x (%d bytes)\n", + $pageNum, $stream, $flag, $dataLen; + $et->VerboseDump(\$buff, DataPos => $raf->Tell() - $dataLen); + } + if (defined $val{$stream}) { + $val{$stream} .= $buff; # add this continuation page + } elsif (not $flag & 0x01) { # ignore remaining pages of a continued packet + # ignore the first page of any packet we aren't parsing + if ($buff =~ /^(.(vorbis|theora)|Opus(Head|Tags))/s) { + $val{$stream} = $buff; # save this page + } elsif ($buff =~ /^\x7fFLAC..(..)/s) { + $numFlac = unpack('n',$1); + $val{$stream} = substr($buff, 9); + } + } + if (defined $numFlac) { + # stop to process FLAC headers if we have them all + last if $numFlac <= 0; + } elsif (defined $val{$stream} and $flag & 0x04) { + # process Ogg packet now if end-of-stream bit is set + ProcessPacket($et, \$val{$stream}); + delete $val{$stream}; + } + } + if (defined $numFlac and defined $val{$stream}) { + # process FLAC headers as if it was a complete FLAC file + require Image::ExifTool::FLAC; + my %dirInfo = ( RAF => new File::RandomAccess(\$val{$stream}) ); + Image::ExifTool::FLAC::ProcessFLAC($et, \%dirInfo); + } + return $success; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Ogg - Read Ogg meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from Ogg bitstream container files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.xiph.org/vorbis/doc/> + +=item L<http://flac.sourceforge.net/ogg_mapping.html> + +=item L<http://www.theora.org/doc/Theora.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Ogg Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Olympus.pm b/lib/Image/ExifTool/Olympus.pm new file mode 100644 index 0000000..3bcf370 --- /dev/null +++ b/lib/Image/ExifTool/Olympus.pm @@ -0,0 +1,4125 @@ +#------------------------------------------------------------------------------ +# File: Olympus.pm +# +# Description: Olympus/Epson EXIF maker notes tags +# +# Revisions: 12/09/2003 - P. Harvey Created +# 11/11/2004 - P. Harvey Added Epson support +# +# References: 1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html +# 2) http://www.cybercom.net/~dcoffin/dcraw/ +# 3) http://www.ozhiker.com/electronics/pjmt/jpeg_info/olympus_mn.html +# 4) Markku Hanninen private communication (tests with E-1) +# 5) Remi Guyomarch from http://forums.dpreview.com/forums/read.asp?forum=1022&message=12790396 +# 6) Frank Ledwon private communication (tests with E/C-series cameras) +# 7) Michael Meissner private communication +# 8) Shingo Noguchi, PhotoXP (http://www.daifukuya.com/photoxp/) +# 9) Mark Dapoz private communication +# 10) Lilo Huang private communication (E-330) +# 11) http://olypedia.de/Olympus_Makernotes (May 30, 2013) +# 12) Ioannis Panagiotopoulos private communication (E-510) +# 13) Chris Shaw private communication (E-3) +# 14) Viktor Lushnikov private communication (E-400) +# 15) Yrjo Rauste private communication (E-30) +# 16) Godfrey DiGiorgi private communication (E-P1) + http://forums.dpreview.com/forums/read.asp?message=33187567 +# 17) Martin Hibers private communication +# 18) Tomasz Kawecki private communication +# 19) Brad Grier private communication +# 22) Herbert Kauer private communication +# 23) Daniel Pollock private communication (PEN-F) +# 24) Sebastian private communication (E-M1 Mark III) +# IB) Iliah Borg private communication (LibRaw) +# NJ) Niels Kristian Bech Jensen private communication +#------------------------------------------------------------------------------ + +package Image::ExifTool::Olympus; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::APP12; + +$VERSION = '2.78'; + +sub PrintLensInfo($$$); + +my %offOn = ( 0 => 'Off', 1 => 'On' ); + +# lookup for Olympus LensType values +# (as of ExifTool 9.15, this was the complete list of chipped lenses at www.four-thirds.org) +my %olympusLensTypes = ( + Notes => q{ + The numerical values below are given in hexadecimal. (Prior to ExifTool + 9.15 these were in decimal.) + }, + '0 00 00' => 'None', + # Olympus lenses (also Kenko Tokina) + '0 01 00' => 'Olympus Zuiko Digital ED 50mm F2.0 Macro', + '0 01 01' => 'Olympus Zuiko Digital 40-150mm F3.5-4.5', #8 + '0 01 10' => 'Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6', #PH (E-P1 pre-production) + '0 02 00' => 'Olympus Zuiko Digital ED 150mm F2.0', + '0 02 10' => 'Olympus M.Zuiko Digital 17mm F2.8 Pancake', #PH (E-P1 pre-production) + '0 03 00' => 'Olympus Zuiko Digital ED 300mm F2.8', + '0 03 10' => 'Olympus M.Zuiko Digital ED 14-150mm F4.0-5.6 [II]', #11 (The second version of this lens seems to have the same lens ID number as the first version #NJ) + '0 04 10' => 'Olympus M.Zuiko Digital ED 9-18mm F4.0-5.6', #11 + '0 05 00' => 'Olympus Zuiko Digital 14-54mm F2.8-3.5', + '0 05 01' => 'Olympus Zuiko Digital Pro ED 90-250mm F2.8', #9 + '0 05 10' => 'Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6 L', #11 (E-PL1) + '0 06 00' => 'Olympus Zuiko Digital ED 50-200mm F2.8-3.5', + '0 06 01' => 'Olympus Zuiko Digital ED 8mm F3.5 Fisheye', #9 + '0 06 10' => 'Olympus M.Zuiko Digital ED 40-150mm F4.0-5.6', #PH + '0 07 00' => 'Olympus Zuiko Digital 11-22mm F2.8-3.5', + '0 07 01' => 'Olympus Zuiko Digital 18-180mm F3.5-6.3', #6 + '0 07 10' => 'Olympus M.Zuiko Digital ED 12mm F2.0', #PH + '0 08 01' => 'Olympus Zuiko Digital 70-300mm F4.0-5.6', #7 (seen as release 1 - PH) + '0 08 10' => 'Olympus M.Zuiko Digital ED 75-300mm F4.8-6.7', #PH + '0 09 10' => 'Olympus M.Zuiko Digital 14-42mm F3.5-5.6 II', #PH (E-PL2) + '0 10 01' => 'Kenko Tokina Reflex 300mm F6.3 MF Macro', #NJ + '0 10 10' => 'Olympus M.Zuiko Digital ED 12-50mm F3.5-6.3 EZ', #PH + '0 11 10' => 'Olympus M.Zuiko Digital 45mm F1.8', #17 + '0 12 10' => 'Olympus M.Zuiko Digital ED 60mm F2.8 Macro', #NJ + '0 13 10' => 'Olympus M.Zuiko Digital 14-42mm F3.5-5.6 II R', #PH/NJ + '0 14 10' => 'Olympus M.Zuiko Digital ED 40-150mm F4.0-5.6 R', #19 + # '0 14 10.1' => 'Olympus M.Zuiko Digital ED 14-150mm F4.0-5.6 II', #11 (questionable & unconfirmed -- all samples I can find are '0 3 10' - PH) + '0 15 00' => 'Olympus Zuiko Digital ED 7-14mm F4.0', + '0 15 10' => 'Olympus M.Zuiko Digital ED 75mm F1.8', #PH + '0 16 10' => 'Olympus M.Zuiko Digital 17mm F1.8', #NJ + '0 17 00' => 'Olympus Zuiko Digital Pro ED 35-100mm F2.0', #7 + '0 18 00' => 'Olympus Zuiko Digital 14-45mm F3.5-5.6', + '0 18 10' => 'Olympus M.Zuiko Digital ED 75-300mm F4.8-6.7 II', #NJ + '0 19 10' => 'Olympus M.Zuiko Digital ED 12-40mm F2.8 Pro', #PH + '0 20 00' => 'Olympus Zuiko Digital 35mm F3.5 Macro', #9 + '0 20 10' => 'Olympus M.Zuiko Digital ED 40-150mm F2.8 Pro', #NJ + '0 21 10' => 'Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6 EZ', #NJ + '0 22 00' => 'Olympus Zuiko Digital 17.5-45mm F3.5-5.6', #9 + '0 22 10' => 'Olympus M.Zuiko Digital 25mm F1.8', #NJ + '0 23 00' => 'Olympus Zuiko Digital ED 14-42mm F3.5-5.6', #PH + '0 23 10' => 'Olympus M.Zuiko Digital ED 7-14mm F2.8 Pro', #NJ + '0 24 00' => 'Olympus Zuiko Digital ED 40-150mm F4.0-5.6', #PH + '0 24 10' => 'Olympus M.Zuiko Digital ED 300mm F4.0 IS Pro', #NJ + '0 25 10' => 'Olympus M.Zuiko Digital ED 8mm F1.8 Fisheye Pro', #NJ + '0 26 10' => 'Olympus M.Zuiko Digital ED 12-100mm F4.0 IS Pro', #IB/NJ + '0 27 10' => 'Olympus M.Zuiko Digital ED 30mm F3.5 Macro', #IB/NJ + '0 28 10' => 'Olympus M.Zuiko Digital ED 25mm F1.2 Pro', #IB/NJ + '0 29 10' => 'Olympus M.Zuiko Digital ED 17mm F1.2 Pro', #IB + '0 30 00' => 'Olympus Zuiko Digital ED 50-200mm F2.8-3.5 SWD', #7 + '0 30 10' => 'Olympus M.Zuiko Digital ED 45mm F1.2 Pro', #IB + '0 31 00' => 'Olympus Zuiko Digital ED 12-60mm F2.8-4.0 SWD', #7 + '0 32 00' => 'Olympus Zuiko Digital ED 14-35mm F2.0 SWD', #PH + '0 32 10' => 'Olympus M.Zuiko Digital ED 12-200mm F3.5-6.3', #IB + '0 33 00' => 'Olympus Zuiko Digital 25mm F2.8', #PH + '0 33 10' => 'Olympus M.Zuiko Digital 150-400mm F4.5 TC1.25x IS Pro', #IB + '0 34 00' => 'Olympus Zuiko Digital ED 9-18mm F4.0-5.6', #7 + '0 34 10' => 'Olympus M.Zuiko Digital ED 12-45mm F4.0 Pro', #IB + '0 35 00' => 'Olympus Zuiko Digital 14-54mm F2.8-3.5 II', #PH + '0 35 10' => 'Olympus M.Zuiko 100-400mm F5.0-6.3', #IB + '0 36 10' => 'Olympus M.Zuiko Digital ED 8-25mm F4 Pro', #IB + # Sigma lenses + '1 01 00' => 'Sigma 18-50mm F3.5-5.6 DC', #8 + '1 01 10' => 'Sigma 30mm F2.8 EX DN', #NJ + '1 02 00' => 'Sigma 55-200mm F4.0-5.6 DC', + '1 02 10' => 'Sigma 19mm F2.8 EX DN', #NJ + '1 03 00' => 'Sigma 18-125mm F3.5-5.6 DC', + '1 03 10' => 'Sigma 30mm F2.8 DN | A', #NJ + '1 04 00' => 'Sigma 18-125mm F3.5-5.6 DC', #7 + '1 04 10' => 'Sigma 19mm F2.8 DN | A', #NJ + '1 05 00' => 'Sigma 30mm F1.4 EX DC HSM', #10 + '1 05 10' => 'Sigma 60mm F2.8 DN | A', #NJ + '1 06 00' => 'Sigma APO 50-500mm F4.0-6.3 EX DG HSM', #6 + '1 06 10' => 'Sigma 30mm F1.4 DC DN | C', #NJ + '1 07 00' => 'Sigma Macro 105mm F2.8 EX DG', #PH + '1 07 10' => 'Sigma 16mm F1.4 DC DN | C (017)', #IB + '1 08 00' => 'Sigma APO Macro 150mm F2.8 EX DG HSM', #PH + '1 09 00' => 'Sigma 18-50mm F2.8 EX DC Macro', #NJ + '1 10 00' => 'Sigma 24mm F1.8 EX DG Aspherical Macro', #PH + '1 11 00' => 'Sigma APO 135-400mm F4.5-5.6 DG', #11 + '1 12 00' => 'Sigma APO 300-800mm F5.6 EX DG HSM', #11 + '1 13 00' => 'Sigma 30mm F1.4 EX DC HSM', #11 + '1 14 00' => 'Sigma APO 50-500mm F4.0-6.3 EX DG HSM', #11 + '1 15 00' => 'Sigma 10-20mm F4.0-5.6 EX DC HSM', #11 + '1 16 00' => 'Sigma APO 70-200mm F2.8 II EX DG Macro HSM', #11 + '1 17 00' => 'Sigma 50mm F1.4 EX DG HSM', #11 + # Panasonic/Leica lenses + '2 01 00' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.', #11 + '2 01 10' => 'Lumix G Vario 14-45mm F3.5-5.6 Asph. Mega OIS', #16 + '2 02 00' => 'Leica D Summilux 25mm F1.4 Asph.', #11 + '2 02 10' => 'Lumix G Vario 45-200mm F4.0-5.6 Mega OIS', #16 + '2 03 00' => 'Leica D Vario Elmar 14-50mm F3.8-5.6 Asph. Mega OIS', #11 + '2 03 01' => 'Leica D Vario Elmar 14-50mm F3.8-5.6 Asph.', #14 (L10 kit) + '2 03 10' => 'Lumix G Vario HD 14-140mm F4.0-5.8 Asph. Mega OIS', #16 + '2 04 00' => 'Leica D Vario Elmar 14-150mm F3.5-5.6', #13 + '2 04 10' => 'Lumix G Vario 7-14mm F4.0 Asph.', #PH (E-P1 pre-production) + '2 05 10' => 'Lumix G 20mm F1.7 Asph.', #16 + '2 06 10' => 'Leica DG Macro-Elmarit 45mm F2.8 Asph. Mega OIS', #PH + '2 07 10' => 'Lumix G Vario 14-42mm F3.5-5.6 Asph. Mega OIS', #NJ + '2 08 10' => 'Lumix G Fisheye 8mm F3.5', #PH + '2 09 10' => 'Lumix G Vario 100-300mm F4.0-5.6 Mega OIS', #11 + '2 10 10' => 'Lumix G 14mm F2.5 Asph.', #17 + '2 11 10' => 'Lumix G 12.5mm F12 3D', #NJ (H-FT012) + '2 12 10' => 'Leica DG Summilux 25mm F1.4 Asph.', #NJ + '2 13 10' => 'Lumix G X Vario PZ 45-175mm F4.0-5.6 Asph. Power OIS', #NJ + '2 14 10' => 'Lumix G X Vario PZ 14-42mm F3.5-5.6 Asph. Power OIS', #NJ + '2 15 10' => 'Lumix G X Vario 12-35mm F2.8 Asph. Power OIS', #PH + '2 16 10' => 'Lumix G Vario 45-150mm F4.0-5.6 Asph. Mega OIS', #NJ + '2 17 10' => 'Lumix G X Vario 35-100mm F2.8 Power OIS', #PH + '2 18 10' => 'Lumix G Vario 14-42mm F3.5-5.6 II Asph. Mega OIS', #NJ + '2 19 10' => 'Lumix G Vario 14-140mm F3.5-5.6 Asph. Power OIS', #NJ + '2 20 10' => 'Lumix G Vario 12-32mm F3.5-5.6 Asph. Mega OIS', #NJ + '2 21 10' => 'Leica DG Nocticron 42.5mm F1.2 Asph. Power OIS', #NJ + '2 22 10' => 'Leica DG Summilux 15mm F1.7 Asph.', #NJ + '2 23 10' => 'Lumix G Vario 35-100mm F4.0-5.6 Asph. Mega OIS', #NJ + '2 24 10' => 'Lumix G Macro 30mm F2.8 Asph. Mega OIS', #NJ + '2 25 10' => 'Lumix G 42.5mm F1.7 Asph. Power OIS', #NJ + '2 26 10' => 'Lumix G 25mm F1.7 Asph.', #NJ + '2 27 10' => 'Leica DG Vario-Elmar 100-400mm F4.0-6.3 Asph. Power OIS', #NJ + '2 28 10' => 'Lumix G Vario 12-60mm F3.5-5.6 Asph. Power OIS', #NJ + '2 29 10' => 'Leica DG Summilux 12mm F1.4 Asph.', #IB + '2 30 10' => 'Leica DG Vario-Elmarit 12-60mm F2.8-4 Asph. Power OIS', #IB + '2 31 10' => 'Lumix G Vario 45-200mm F4.0-5.6 II', #forum3833 + '2 32 10' => 'Lumix G Vario 100-300mm F4.0-5.6 II', #PH + '2 33 10' => 'Lumix G X Vario 12-35mm F2.8 II Asph. Power OIS', #IB + '2 34 10' => 'Lumix G Vario 35-100mm F2.8 II', #forum3833 + '2 35 10' => 'Leica DG Vario-Elmarit 8-18mm F2.8-4 Asph.', #IB + '2 36 10' => 'Leica DG Elmarit 200mm F2.8 Power OIS', #IB + '2 37 10' => 'Leica DG Vario-Elmarit 50-200mm F2.8-4 Asph. Power OIS', #IB + '2 38 10' => 'Leica DG Vario-Summilux 10-25mm F1.7 Asph.', #IB + '2 40 10' => 'Leica DG Vario-Summilux 25-50mm F1.7 Asph.', #IB (H-X2550) + '3 01 00' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.', #11 + '3 02 00' => 'Leica D Summilux 25mm F1.4 Asph.', #11 + # Tamron lenses + '5 01 10' => 'Tamron 14-150mm F3.5-5.8 Di III', #NJ (model C001) + # '65535 07 40' - Seen for LUMIX S 16-35/F4 on Panasonic DC-S1H (ref PH) + # Other makes + '24 01 10' => 'Venus Optics Laowa 50mm F2.8 2x Macro', #DonKomarechka +); + +# lookup for Olympus camera types (ref PH) +my %olympusCameraTypes = ( + Notes => q{ + These values are currently decoded only for Olympus models. Models with + Olympus-style maker notes from other brands such as Acer, BenQ, Hitachi, HP, + Premier, Konica-Minolta, Maginon, Ricoh, Rollei, SeaLife, Sony, Supra, + Vivitar are not listed. + }, + D4028 => 'X-2,C-50Z', + D4029 => 'E-20,E-20N,E-20P', + D4034 => 'C720UZ', + D4040 => 'E-1', + D4041 => 'E-300', + D4083 => 'C2Z,D520Z,C220Z', + D4106 => 'u20D,S400D,u400D', + D4120 => 'X-1', + D4122 => 'u10D,S300D,u300D', + D4125 => 'AZ-1', + D4141 => 'C150,D390', + D4193 => 'C-5000Z', + D4194 => 'X-3,C-60Z', + D4199 => 'u30D,S410D,u410D', + D4205 => 'X450,D535Z,C370Z', + D4210 => 'C160,D395', + D4211 => 'C725UZ', + D4213 => 'FerrariMODEL2003', + D4216 => 'u15D', + D4217 => 'u25D', + D4220 => 'u-miniD,Stylus V', + D4221 => 'u40D,S500,uD500', + D4231 => 'FerrariMODEL2004', + D4240 => 'X500,D590Z,C470Z', + D4244 => 'uD800,S800', + D4256 => 'u720SW,S720SW', + D4261 => 'X600,D630,FE5500', + D4262 => 'uD600,S600', + D4301 => 'u810/S810', # (yes, "/". Olympus is not consistent in the notation) + D4302 => 'u710,S710', + D4303 => 'u700,S700', + D4304 => 'FE100,X710', + D4305 => 'FE110,X705', + D4310 => 'FE-130,X-720', + D4311 => 'FE-140,X-725', + D4312 => 'FE150,X730', + D4313 => 'FE160,X735', + D4314 => 'u740,S740', + D4315 => 'u750,S750', + D4316 => 'u730/S730', + D4317 => 'FE115,X715', + D4321 => 'SP550UZ', + D4322 => 'SP510UZ', + D4324 => 'FE170,X760', + D4326 => 'FE200', + D4327 => 'FE190/X750', # (also SX876) + D4328 => 'u760,S760', + D4330 => 'FE180/X745', # (also SX875) + D4331 => 'u1000/S1000', + D4332 => 'u770SW,S770SW', + D4333 => 'FE240/X795', + D4334 => 'FE210,X775', + D4336 => 'FE230/X790', + D4337 => 'FE220,X785', + D4338 => 'u725SW,S725SW', + D4339 => 'FE250/X800', + D4341 => 'u780,S780', + D4343 => 'u790SW,S790SW', + D4344 => 'u1020,S1020', + D4346 => 'FE15,X10', + D4348 => 'FE280,X820,C520', + D4349 => 'FE300,X830', + D4350 => 'u820,S820', + D4351 => 'u1200,S1200', + D4352 => 'FE270,X815,C510', + D4353 => 'u795SW,S795SW', + D4354 => 'u1030SW,S1030SW', + D4355 => 'SP560UZ', + D4356 => 'u1010,S1010', + D4357 => 'u830,S830', + D4359 => 'u840,S840', + D4360 => 'FE350WIDE,X865', + D4361 => 'u850SW,S850SW', + D4362 => 'FE340,X855,C560', + D4363 => 'FE320,X835,C540', + D4364 => 'SP570UZ', + D4366 => 'FE330,X845,C550', + D4368 => 'FE310,X840,C530', + D4370 => 'u1050SW,S1050SW', + D4371 => 'u1060,S1060', + D4372 => 'FE370,X880,C575', + D4374 => 'SP565UZ', + D4377 => 'u1040,S1040', + D4378 => 'FE360,X875,C570', + D4379 => 'FE20,X15,C25', + D4380 => 'uT6000,ST6000', + D4381 => 'uT8000,ST8000', + D4382 => 'u9000,S9000', + D4384 => 'SP590UZ', + D4385 => 'FE3010,X895', + D4386 => 'FE3000,X890', + D4387 => 'FE35,X30', + D4388 => 'u550WP,S550WP', + D4390 => 'FE5000,X905', + D4391 => 'u5000', + D4392 => 'u7000,S7000', + D4396 => 'FE5010,X915', + D4397 => 'FE25,X20', + D4398 => 'FE45,X40', + D4401 => 'XZ-1', + D4402 => 'uT6010,ST6010', + D4406 => 'u7010,S7010 / u7020,S7020', + D4407 => 'FE4010,X930', + D4408 => 'X560WP', + D4409 => 'FE26,X21', + D4410 => 'FE4000,X920,X925', + D4411 => 'FE46,X41,X42', + D4412 => 'FE5020,X935', + D4413 => 'uTough-3000', + D4414 => 'StylusTough-6020', + D4415 => 'StylusTough-8010', + D4417 => 'u5010,S5010', + D4418 => 'u7040,S7040', + D4419 => 'u9010,S9010', + D4423 => 'FE4040', + D4424 => 'FE47,X43', + D4426 => 'FE4030,X950', + D4428 => 'FE5030,X965,X960', + D4430 => 'u7030,S7030', + D4432 => 'SP600UZ', + D4434 => 'SP800UZ', + D4439 => 'FE4020,X940', + D4442 => 'FE5035', + D4448 => 'FE4050,X970', + D4450 => 'FE5050,X985', + D4454 => 'u-7050', + D4464 => 'T10,X27', + D4470 => 'FE5040,X980', + D4472 => 'TG-310', + D4474 => 'TG-610', + D4476 => 'TG-810', + D4478 => 'VG145,VG140,D715', + D4479 => 'VG130,D710', + D4480 => 'VG120,D705', + D4482 => 'VR310,D720', + D4484 => 'VR320,D725', + D4486 => 'VR330,D730', + D4488 => 'VG110,D700', + D4490 => 'SP-610UZ', + D4492 => 'SZ-10', + D4494 => 'SZ-20', + D4496 => 'SZ-30MR', + D4498 => 'SP-810UZ', + D4500 => 'SZ-11', + D4504 => 'TG-615', + D4508 => 'TG-620', + D4510 => 'TG-820', + D4512 => 'TG-1', + D4516 => 'SH-21', + D4519 => 'SZ-14', + D4520 => 'SZ-31MR', + D4521 => 'SH-25MR', + D4523 => 'SP-720UZ', + D4529 => 'VG170', + D4531 => 'XZ-2', + D4535 => 'SP-620UZ', + D4536 => 'TG-320', + D4537 => 'VR340,D750', + D4538 => 'VG160,X990,D745', + D4541 => 'SZ-12', + D4545 => 'VH410', + D4546 => 'XZ-10', #IB + D4547 => 'TG-2', + D4548 => 'TG-830', + D4549 => 'TG-630', + D4550 => 'SH-50', + D4553 => 'SZ-16,DZ-105', + D4562 => 'SP-820UZ', + D4566 => 'SZ-15', + D4572 => 'STYLUS1', + D4574 => 'TG-3', + D4575 => 'TG-850', + D4579 => 'SP-100EE', + D4580 => 'SH-60', + D4581 => 'SH-1', + D4582 => 'TG-835', + D4585 => 'SH-2 / SH-3', + D4586 => 'TG-4', + D4587 => 'TG-860', + D4591 => 'TG-870', + D4593 => 'TG-5', #IB + D4603 => 'TG-6', #IB + D4809 => 'C2500L', + D4842 => 'E-10', + D4856 => 'C-1', + D4857 => 'C-1Z,D-150Z', + DCHC => 'D500L', + DCHT => 'D600L / D620L', + K0055 => 'AIR-A01', + S0003 => 'E-330', + S0004 => 'E-500', + S0009 => 'E-400', + S0010 => 'E-510', + S0011 => 'E-3', + S0013 => 'E-410', + S0016 => 'E-420', + S0017 => 'E-30', + S0018 => 'E-520', + S0019 => 'E-P1', + S0023 => 'E-620', + S0026 => 'E-P2', + S0027 => 'E-PL1', + S0029 => 'E-450', + S0030 => 'E-600', + S0032 => 'E-P3', + S0033 => 'E-5', + S0034 => 'E-PL2', + S0036 => 'E-M5', + S0038 => 'E-PL3', + S0039 => 'E-PM1', + S0040 => 'E-PL1s', + S0042 => 'E-PL5', + S0043 => 'E-PM2', + S0044 => 'E-P5', + S0045 => 'E-PL6', + S0046 => 'E-PL7', #IB + S0047 => 'E-M1', + S0051 => 'E-M10', + S0052 => 'E-M5MarkII', #IB + S0059 => 'E-M10MarkII', + S0061 => 'PEN-F', #forum7005 + S0065 => 'E-PL8', + S0067 => 'E-M1MarkII', + S0068 => 'E-M10MarkIII', + S0076 => 'E-PL9', #IB + S0080 => 'E-M1X', #IB + S0085 => 'E-PL10', #IB + S0089 => 'E-M5MarkIII', + S0092 => 'E-M1MarkIII', #IB + S0093 => 'E-P7', #IB + S0095 => 'OM-1', #IB + SR45 => 'D220', + SR55 => 'D320L', + SR83 => 'D340L', + SR85 => 'C830L,D340R', + SR852 => 'C860L,D360L', + SR872 => 'C900Z,D400Z', + SR874 => 'C960Z,D460Z', + SR951 => 'C2000Z', + SR952 => 'C21', + SR953 => 'C21T.commu', + SR954 => 'C2020Z', + SR955 => 'C990Z,D490Z', + SR956 => 'C211Z', + SR959 => 'C990ZS,D490Z', + SR95A => 'C2100UZ', + SR971 => 'C100,D370', + SR973 => 'C2,D230', + SX151 => 'E100RS', + SX351 => 'C3000Z / C3030Z', + SX354 => 'C3040Z', + SX355 => 'C2040Z', + SX357 => 'C700UZ', + SX358 => 'C200Z,D510Z', + SX374 => 'C3100Z,C3020Z', + SX552 => 'C4040Z', + SX553 => 'C40Z,D40Z', + SX556 => 'C730UZ', + SX558 => 'C5050Z', + SX571 => 'C120,D380', + SX574 => 'C300Z,D550Z', + SX575 => 'C4100Z,C4000Z', + SX751 => 'X200,D560Z,C350Z', + SX752 => 'X300,D565Z,C450Z', + SX753 => 'C750UZ', + SX754 => 'C740UZ', + SX755 => 'C755UZ', + SX756 => 'C5060WZ', + SX757 => 'C8080WZ', + SX758 => 'X350,D575Z,C360Z', + SX759 => 'X400,D580Z,C460Z', + SX75A => 'AZ-2ZOOM', + SX75B => 'D595Z,C500Z', + SX75C => 'X550,D545Z,C480Z', + SX75D => 'IR-300', + SX75F => 'C55Z,C5500Z', + SX75G => 'C170,D425', + SX75J => 'C180,D435', + SX771 => 'C760UZ', + SX772 => 'C770UZ', + SX773 => 'C745UZ', + SX774 => 'X250,D560Z,C350Z', + SX775 => 'X100,D540Z,C310Z', + SX776 => 'C460ZdelSol', + SX777 => 'C765UZ', + SX77A => 'D555Z,C315Z', + SX851 => 'C7070WZ', + SX852 => 'C70Z,C7000Z', + SX853 => 'SP500UZ', + SX854 => 'SP310', + SX855 => 'SP350', + SX873 => 'SP320', + SX875 => 'FE180/X745', # (also D4330) + SX876 => 'FE190/X750', # (also D4327) +# other brands +# 4MP9Q3 => 'Camera 4MP-9Q3' +# 4MP9T2 => 'BenQ DC C420 / Camera 4MP-9T2' +# 5MP9Q3 => 'Camera 5MP-9Q3', +# 5MP9X9 => 'Camera 5MP-9X9', +# '5MP-9T'=> 'Camera 5MP-9T3', +# '5MP-9Y'=> 'Camera 5MP-9Y2', +# '6MP-9U'=> 'Camera 6MP-9U9', +# 7MP9Q3 => 'Camera 7MP-9Q3', +# '8MP-9U'=> 'Camera 8MP-9U4', +# CE5330 => 'Acer CE-5330', +# 'CP-853'=> 'Acer CP-8531', +# CS5531 => 'Acer CS5531', +# DC500 => 'SeaLife DC500', +# DC7370 => 'Camera 7MP-9GA', +# DC7371 => 'Camera 7MP-9GM', +# DC7371 => 'Hitachi HDC-751E', +# DC7375 => 'Hitachi HDC-763E / Rollei RCP-7330X / Ricoh Caplio RR770 / Vivitar ViviCam 7330', +# 'DC E63'=> 'BenQ DC E63+', +# 'DC P86'=> 'BenQ DC P860', +# DS5340 => 'Maginon Performic S5 / Premier 5MP-9M7', +# DS5341 => 'BenQ E53+ / Supra TCM X50 / Maginon X50 / Premier 5MP-9P8', +# DS5346 => 'Premier 5MP-9Q2', +# E500 => 'Konica Minolta DiMAGE E500', +# MAGINO => 'Maginon X60', +# Mz60 => 'HP Photosmart Mz60', +# Q3DIGI => 'Camera 5MP-9Q3', +# SLIMLI => 'Supra Slimline X6', +# V8300s => 'Vivitar V8300s', +); + +# ArtFilter, ArtFilterEffect and MagicFilter values (ref PH) +my %filters = ( + 0 => 'Off', + 1 => 'Soft Focus', # (XZ-1) + 2 => 'Pop Art', # (SZ-10 magic filter 1,SZ-31MR,E-M5,E-PL3) + 3 => 'Pale & Light Color', + 4 => 'Light Tone', + 5 => 'Pin Hole', # (SZ-10 magic filter 2,SZ-31MR,E-PL3) + 6 => 'Grainy Film', + 9 => 'Diorama', + 10 => 'Cross Process', + 12 => 'Fish Eye', # (SZ-10 magic filter 3) + 13 => 'Drawing', # (SZ-10 magic filter 4) + 14 => 'Gentle Sepia', # (E-5) + 15 => 'Pale & Light Color II', #forum6269 ('Tender Light' ref 11) + 16 => 'Pop Art II', #11 (E-PL3 "(dark)" - PH) + 17 => 'Pin Hole II', #11 (E-PL3 "(color 2)" - PH) + 18 => 'Pin Hole III', #11 (E-M5, E-PL3 "(color 3)" - PH) + 19 => 'Grainy Film II', #11 + 20 => 'Dramatic Tone', # (XZ-1,SZ-31MR) + 21 => 'Punk', # (SZ-10 magic filter 6) + 22 => 'Soft Focus 2', # (SZ-10 magic filter 5) + 23 => 'Sparkle', # (SZ-10 magic filter 7) + 24 => 'Watercolor', # (SZ-10 magic filter 8) + 25 => 'Key Line', # (E-M5) + 26 => 'Key Line II', #forum6269 + 27 => 'Miniature', # (SZ-31MR) + 28 => 'Reflection', # (TG-820,SZ-31MR) + 29 => 'Fragmented', # (TG-820,SZ-31MR) + 31 => 'Cross Process II', #forum6269 + 32 => 'Dramatic Tone II', #forum6269 (Dramatic Tone B&W for E-M5) + 33 => 'Watercolor I', # ('Watercolor I' for EM-1 ref forum6269, 'Watercolor II' for E-PM2 ref PH) + 34 => 'Watercolor II', #forum6269 + 35 => 'Diorama II', #forum6269 + 36 => 'Vintage', #forum6269 + 37 => 'Vintage II', #forum6269 + 38 => 'Vintage III', #forum6269 + 39 => 'Partial Color', #forum6269 + 40 => 'Partial Color II', #forum6269 + 41 => 'Partial Color III', #forum6269 +); + +my %toneLevelType = ( + 0 => '0', + -31999 => 'Highlights', + -31998 => 'Shadows', + -31997 => 'Midtones', +); + +# tag information for WAV "Index" tags +my %indexInfo = ( + Format => 'int32u', + RawConv => '$val == 0xffffffff ? undef : $val', + ValueConv => '$val / 1000', + PrintConv => 'ConvertDuration($val)', +); + +# Olympus tags +%Image::ExifTool::Olympus::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, +# +# Tags 0x0000 through 0x0103 are the same as Konica/Minolta cameras (ref 3) +# (removed 0x0101-0x0103 because they weren't supported by my samples - PH) +# + 0x0000 => { + Name => 'MakerNoteVersion', + Writable => 'undef', + }, + 0x0001 => { + Name => 'MinoltaCameraSettingsOld', + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::CameraSettings', + ByteOrder => 'BigEndian', + }, + }, + 0x0003 => { + Name => 'MinoltaCameraSettings', + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::CameraSettings', + ByteOrder => 'BigEndian', + }, + }, + 0x0040 => { + Name => 'CompressedImageSize', + Writable => 'int32u', + }, + 0x0081 => { + Name => 'PreviewImageData', + Binary => 1, + Writable => 0, + }, + 0x0088 => { + Name => 'PreviewImageStart', + Flags => 'IsOffset', + OffsetPair => 0x0089, # point to associated byte count + DataTag => 'PreviewImage', + Writable => 0, + Protected => 2, + }, + 0x0089 => { + Name => 'PreviewImageLength', + OffsetPair => 0x0088, # point to associated offset + DataTag => 'PreviewImage', + Writable => 0, + Protected => 2, + }, + 0x0100 => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Writable => 'undef', + WriteCheck => '$self->CheckImage(\$val)', + Binary => 1, + }, + 0x0104 => { Name => 'BodyFirmwareVersion', Writable => 'string' }, #11 +# +# end Konica/Minolta tags +# + 0x0200 => { + Name => 'SpecialMode', + Notes => q{ + 3 numbers: 1. Shooting mode: 0=Normal, 2=Fast, 3=Panorama; + 2. Sequence Number; 3. Panorama Direction: 1=Left-right, + 2=Right-left, 3=Bottom-Top, 4=Top-Bottom + }, + Writable => 'int32u', + Count => 3, + PrintConv => sub { #3 + my $val = shift; + my @v = split ' ', $val; + return $val unless @v >= 3; + my @v0 = ('Normal','Unknown (1)','Fast','Panorama'); + my @v2 = ('(none)','Left to Right','Right to Left','Bottom to Top','Top to Bottom'); + $val = $v0[$v[0]] || "Unknown ($v[0])"; + $val .= ", Sequence: $v[1]"; + $val .= ', Panorama: ' . ($v2[$v[2]] || "Unknown ($v[2])"); + return $val; + }, + }, + 0x0201 => { + Name => 'Quality', + Writable => 'int16u', + Notes => q{ + Quality values are decoded based on the CameraType tag. All types + represent SQ, HQ and SHQ as sequential integers, but in general + SX-type cameras start with a value of 0 for SQ while others start + with 1 + }, + # These values are different for different camera types + # (can't have Condition based on CameraType because it isn't known + # when this tag is extracted) + PrintConv => sub { + my ($val, $self) = @_; + my %t1 = ( # all SX camera types except SX151 + 0 => 'SQ (Low)', + 1 => 'HQ (Normal)', + 2 => 'SHQ (Fine)', + 6 => 'RAW', #PH - C5050WZ + ); + my %t2 = ( # all other types (except D4322, ref 22) + 1 => 'SQ (Low)', + 2 => 'HQ (Normal)', + 3 => 'SHQ (Fine)', + 4 => 'RAW', + 5 => 'Medium-Fine', #PH + 6 => 'Small-Fine', #PH + 33 => 'Uncompressed', #PH - C2100Z + ); + my $conv = $self->{CameraType} =~ /^(SX(?!151\b)|D4322)/ ? \%t1 : \%t2; + return $$conv{$val} ? $$conv{$val} : "Unknown ($val)"; + }, + # (no PrintConvInv because we don't know CameraType at write time) + }, + 0x0202 => { + Name => 'Macro', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'Super Macro', #6 + }, + }, + 0x0203 => { #6 + Name => 'BWMode', + Description => 'Black And White Mode', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 6 => '(none)', #22 + }, + }, + 0x0204 => { + Name => 'DigitalZoom', + Writable => 'rational64u', + PrintConv => '$val=~/\./ or $val.=".0"; $val', + PrintConvInv => '$val', + }, + 0x0205 => { #6 + Name => 'FocalPlaneDiagonal', + Writable => 'rational64u', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + 0x0206 => { Name => 'LensDistortionParams', Writable => 'int16s', Count => 6 }, #6 + 0x0207 => { #PH (was incorrectly FirmwareVersion, ref 1/3) + Name => 'CameraType', + Condition => '$$valPt ne "NORMAL"', # FE240, SP510, u730 and u1000 write this + Writable => 'string', + DataMember => 'CameraType', + RawConv => '$self->{CameraType} = $val', + SeparateTable => 'CameraType', + ValueConv => '$val =~ s/\s+$//; $val', # ("SX151 " has trailing space) + ValueConvInv => '$val', + PrintConv => \%olympusCameraTypes, + Priority => 0, + # 'NORMAL' for some models: u730,SP510UZ,u1000,FE240 + }, + 0x0208 => { + Name => 'TextInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::TextInfo', + }, + }, + 0x0209 => { + Name => 'CameraID', + Format => 'string', # this really should have been a string + }, + 0x020b => { Name => 'EpsonImageWidth', Writable => 'int32u' }, #PH + 0x020c => { Name => 'EpsonImageHeight', Writable => 'int32u' }, #PH + 0x020d => { Name => 'EpsonSoftware', Writable => 'string' }, #PH + 0x0280 => { #PH + %Image::ExifTool::previewImageTagInfo, + Groups => { 2 => 'Preview' }, + Notes => 'found in ERF and JPG images from some Epson models', + Format => 'undef', + Writable => 'int8u', + }, + 0x0300 => { Name => 'PreCaptureFrames', Writable => 'int16u' }, #6 + 0x0301 => { Name => 'WhiteBoard', Writable => 'int16u' }, #11 + 0x0302 => { #6 + Name => 'OneTouchWB', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'On (Preset)', + }, + }, + 0x0303 => { Name => 'WhiteBalanceBracket', Writable => 'int16u' }, #11 + 0x0304 => { Name => 'WhiteBalanceBias', Writable => 'int16u' }, #11 + # 0x0305 => 'PrintMatching', ? #11 + 0x0400 => { #IB + Name => 'SensorArea', + Condition => '$$self{TIFF_TYPE} eq "ERF"', + Writable => 'undef', + Format => 'int16u', + Count => 4, + Notes => 'found in Epson ERF images', + }, + 0x0401 => { #IB + Name => 'BlackLevel', + Condition => '$$self{TIFF_TYPE} eq "ERF"', + Writable => 'int32u', + Count => 4, + Notes => 'found in Epson ERF images', + }, + # 0x0402 - BitCodedAutoFocus (ref 11) + 0x0403 => { #11 + Name => 'SceneMode', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Normal', + 1 => 'Standard', + 2 => 'Auto', + 3 => 'Intelligent Auto', #PH (guess, u7040) + 4 => 'Portrait', + 5 => 'Landscape+Portrait', + 6 => 'Landscape', + 7 => 'Night Scene', + 8 => 'Night+Portrait', + 9 => 'Sport', + 10 => 'Self Portrait', + 11 => 'Indoor', + 12 => 'Beach & Snow', + 13 => 'Beach', + 14 => 'Snow', + 15 => 'Self Portrait+Self Timer', + 16 => 'Sunset', + 17 => 'Cuisine', + 18 => 'Documents', + 19 => 'Candle', + 20 => 'Fireworks', + 21 => 'Available Light', + 22 => 'Vivid', + 23 => 'Underwater Wide1', + 24 => 'Underwater Macro', + 25 => 'Museum', + 26 => 'Behind Glass', + 27 => 'Auction', + 28 => 'Shoot & Select1', + 29 => 'Shoot & Select2', + 30 => 'Underwater Wide2', + 31 => 'Digital Image Stabilization', + 32 => 'Face Portrait', + 33 => 'Pet', + 34 => 'Smile Shot', + 35 => 'Quick Shutter', + 43 => 'Hand-held Starlight', #PH (SH-21) + 100 => 'Panorama', #PH (SH-21) + 101 => 'Magic Filter', #PH + 103 => 'HDR', #PH (XZ-2) + }, + }, + 0x0404 => { Name => 'SerialNumber', Writable => 'string' }, #PH (D595Z, C7070WZ) + 0x0405 => { Name => 'Firmware', Writable => 'string' }, #11 + 0x0e00 => { # (AFFieldCoord for models XZ-2 and XZ-10, ref 11) + Name => 'PrintIM', + Description => 'Print Image Matching', + Writable => 0, + SubDirectory => { + TagTable => 'Image::ExifTool::PrintIM::Main', + }, + }, + # 0x0e80 - undef[256] - offset 0x30: uint16[2] WB_RGBLevels = val[0]*561,65536,val[1]*431 (ref IB) + 0x0f00 => { + Name => 'DataDump', + Writable => 0, + Binary => 1, + }, + 0x0f01 => { #6 + Name => 'DataDump2', + Writable => 0, + Binary => 1, + }, + 0x0f04 => { + Name => 'ZoomedPreviewStart', + # NOTE: this tag is currently not updated properly when the image is rewritten! + OffsetPair => 0xf05, + DataTag => 'ZoomedPreviewImage', + Writable => 'int32u', + Protected => 2, + }, + 0x0f05 => { + Name => 'ZoomedPreviewLength', + OffsetPair => 0xf04, + DataTag => 'ZoomedPreviewImage', + Writable => 'int32u', + Protected => 2, + }, + 0x0f06 => { + Name => 'ZoomedPreviewSize', + Writable => 'int16u', + Count => 2, + }, + 0x1000 => { #6 + Name => 'ShutterSpeedValue', + Writable => 'rational64s', + Priority => 0, + ValueConv => 'abs($val)<100 ? 2**(-$val) : 0', + ValueConvInv => '$val>0 ? -log($val)/log(2) : -100', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x1001 => { #6 + Name => 'ISOValue', + Writable => 'rational64s', + Priority => 0, + ValueConv => '100 * 2 ** ($val - 5)', + ValueConvInv => '$val>0 ? log($val/100)/log(2)+5 : 0', + PrintConv => 'int($val * 100 + 0.5) / 100', + PrintConvInv => '$val', + }, + 0x1002 => { #6 + Name => 'ApertureValue', + Writable => 'rational64s', + Priority => 0, + ValueConv => '2 ** ($val / 2)', + ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x1003 => { #6 + Name => 'BrightnessValue', + Writable => 'rational64s', + Priority => 0, + }, + 0x1004 => { #3 + Name => 'FlashMode', + Writable => 'int16u', + PrintConv => { + 2 => 'On', #PH + 3 => 'Off', #PH + }, + }, + 0x1005 => { #6 + Name => 'FlashDevice', + Writable => 'int16u', + PrintConv => { + 0 => 'None', + 1 => 'Internal', + 4 => 'External', + 5 => 'Internal + External', + }, + }, + 0x1006 => { #6 + Name =>'ExposureCompensation', + Writable => 'rational64s', + }, + 0x1007 => { Name => 'SensorTemperature',Writable => 'int16s' }, #6 (E-10, E-20 and C2500L - numbers usually around 30-40) + 0x1008 => { Name => 'LensTemperature', Writable => 'int16s' }, #6 + 0x1009 => { Name => 'LightCondition', Writable => 'int16u' }, #11 + 0x100a => { #11 + Name => 'FocusRange', + Writable => 'int16u', + PrintConv => { + 0 => 'Normal', + 1 => 'Macro', + }, + }, + 0x100b => { #6 + Name => 'FocusMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Auto', + 1 => 'Manual', + }, + }, + 0x100c => { #6 + Name => 'ManualFocusDistance', + Writable => 'rational64u', + PrintConv => '"$val mm"', #11 + PrintConvInv => '$val=~s/\s*mm$//; $val', + }, + 0x100d => { Name => 'ZoomStepCount', Writable => 'int16u' }, #6 + 0x100e => { Name => 'FocusStepCount', Writable => 'int16u' }, #6 + 0x100f => { #6 + Name => 'Sharpness', + Writable => 'int16u', + Priority => 0, + PrintConv => { + 0 => 'Normal', + 1 => 'Hard', + 2 => 'Soft', + }, + }, + 0x1010 => { Name => 'FlashChargeLevel', Writable => 'int16u' }, #6 + 0x1011 => { #3 + Name => 'ColorMatrix', + Writable => 'int16u', + Format => 'int16s', + Count => 9, + }, + 0x1012 => { Name => 'BlackLevel', Writable => 'int16u', Count => 4 }, #3 + 0x1013 => { #11 + Name => 'ColorTemperatureBG', + Writable => 'int16u', + Unknown => 1, # (doesn't look like a temperature) + }, + 0x1014 => { #11 + Name => 'ColorTemperatureRG', + Writable => 'int16u', + Unknown => 1, # (doesn't look like a temperature) + }, + 0x1015 => { #6 + Name => 'WBMode', + Writable => 'int16u', + Count => 2, + PrintConvColumns => 2, + PrintConv => { + '1' => 'Auto', + '1 0' => 'Auto', + '1 2' => 'Auto (2)', + '1 4' => 'Auto (4)', + '2 2' => '3000 Kelvin', + '2 3' => '3700 Kelvin', + '2 4' => '4000 Kelvin', + '2 5' => '4500 Kelvin', + '2 6' => '5500 Kelvin', + '2 7' => '6500 Kelvin', + '2 8' => '7500 Kelvin', + '3 0' => 'One-touch', + }, + }, + 0x1017 => { #2 + Name => 'RedBalance', + Writable => 'int16u', + Count => 2, + ValueConv => '$val=~s/ .*//; $val / 256', + ValueConvInv => '$val*=256;"$val 64"', + }, + 0x1018 => { #2 + Name => 'BlueBalance', + Writable => 'int16u', + Count => 2, + ValueConv => '$val=~s/ .*//; $val / 256', + ValueConvInv => '$val*=256;"$val 64"', + }, + 0x1019 => { Name => 'ColorMatrixNumber', Writable => 'int16u' }, #11 + # 0x101a is same as CameraID ("OLYMPUS DIGITAL CAMERA") for C2500L - PH + 0x101a => { Name => 'SerialNumber', Writable => 'string' }, #3 + 0x101b => { #11 + Name => 'ExternalFlashAE1_0', + Writable => 'int32u', + Unknown => 1, # (what are these?) + }, + 0x101c => { Name => 'ExternalFlashAE2_0', Writable => 'int32u', Unknown => 1 }, #11 + 0x101d => { Name => 'InternalFlashAE1_0', Writable => 'int32u', Unknown => 1 }, #11 + 0x101e => { Name => 'InternalFlashAE2_0', Writable => 'int32u', Unknown => 1 }, #11 + 0x101f => { Name => 'ExternalFlashAE1', Writable => 'int32u', Unknown => 1 }, #11 + 0x1020 => { Name => 'ExternalFlashAE2', Writable => 'int32u', Unknown => 1 }, #11 + 0x1021 => { Name => 'InternalFlashAE1', Writable => 'int32u', Unknown => 1 }, #11 + 0x1022 => { Name => 'InternalFlashAE2', Writable => 'int32u', Unknown => 1 }, #11 + 0x1023 => { Name => 'FlashExposureComp', Writable => 'rational64s' }, #6 + 0x1024 => { Name => 'InternalFlashTable', Writable => 'int16u' }, #11 + 0x1025 => { Name => 'ExternalFlashGValue', Writable => 'rational64s' }, #11 + 0x1026 => { #6 + Name => 'ExternalFlashBounce', + Writable => 'int16u', + PrintConv => { + 0 => 'No', + 1 => 'Yes', + }, + }, + 0x1027 => { Name => 'ExternalFlashZoom', Writable => 'int16u' }, #6 + 0x1028 => { Name => 'ExternalFlashMode', Writable => 'int16u' }, #6 + 0x1029 => { #3 + Name => 'Contrast', + Writable => 'int16u', + PrintConv => { #PH (works with E1) + 0 => 'High', + 1 => 'Normal', + 2 => 'Low', + }, + }, + 0x102a => { Name => 'SharpnessFactor', Writable => 'int16u' }, #3 + 0x102b => { Name => 'ColorControl', Writable => 'int16u', Count => 6 }, #3 + 0x102c => { Name => 'ValidBits', Writable => 'int16u', Count => 2 }, #3 + 0x102d => { Name => 'CoringFilter', Writable => 'int16u' }, #3 + 0x102e => { Name => 'OlympusImageWidth', Writable => 'int32u' }, #PH + 0x102f => { Name => 'OlympusImageHeight', Writable => 'int32u' }, #PH + 0x1030 => { Name => 'SceneDetect', Writable => 'int16u' }, #11 + 0x1031 => { #11 + Name => 'SceneArea', + Writable => 'int32u', + Count => 8, + Unknown => 1, # (numbers don't make much sense?) + }, + # 0x1032 HAFFINAL? #11 + 0x1033 => { #11 + Name => 'SceneDetectData', + Writable => 'int32u', + Count => 720, + Binary => 1, + Unknown => 1, # (but what does it mean?) + }, + 0x1034 => { Name => 'CompressionRatio', Writable => 'rational64u' }, #3 + 0x1035 => { #6 + Name => 'PreviewImageValid', + Writable => 'int32u', + DelValue => 0, + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0x1036 => { #6 + Name => 'PreviewImageStart', + Flags => 'IsOffset', + OffsetPair => 0x1037, # point to associated byte count + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + 0x1037 => { #6 + # (may contain data from multiple previews - PH, FE320) + Name => 'PreviewImageLength', + OffsetPair => 0x1036, # point to associated offset + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + 0x1038 => { Name => 'AFResult', Writable => 'int16u' }, #11 + 0x1039 => { #6 + Name => 'CCDScanMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Interlaced', + 1 => 'Progressive', + }, + }, + 0x103a => { #6 + Name => 'NoiseReduction', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x103b => { Name => 'FocusStepInfinity', Writable => 'int16u' }, #6 + 0x103c => { Name => 'FocusStepNear', Writable => 'int16u' }, #6 + 0x103d => { Name => 'LightValueCenter', Writable => 'rational64s' }, #11 + 0x103e => { Name => 'LightValuePeriphery', Writable => 'rational64s' }, #11 + 0x103f => { #11 + Name => 'FieldCount', + Writable => 'int16u', + Unknown => 1, # (but what does it mean?) + }, +# +# Olympus really screwed up the format of the following subdirectories (for the +# E-1 and E-300 anyway). Not only is the subdirectory value data not included in +# the size, but also the count is 2 bytes short for the subdirectory itself +# (presumably the Olympus programmers forgot about the 2-byte entry count at the +# start of the subdirectory). This mess is straightened out and these subdirs +# are written properly when ExifTool rewrites the file. Note that this problem +# has been fixed by Olympus in the new-style IFD maker notes since a standard +# SubIFD offset value is used. As written by the camera, the old style +# directories have format 'undef' or 'string', and the new style has format +# 'ifd'. However, some older versions of exiftool may have rewritten the new +# style as 'int32u', so handle both cases. - PH +# + 0x2010 => [ #PH + { + Name => 'Equipment', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, # (so HtmlDump doesn't show these as double-referenced) + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::Equipment', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'EquipmentIFD', + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::Equipment', + Start => '$val', + }, + }, + ], + 0x2020 => [ #PH + { + Name => 'CameraSettings', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::CameraSettings', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'CameraSettingsIFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::CameraSettings', + Start => '$val', + }, + }, + ], + 0x2030 => [ #PH + { + Name => 'RawDevelopment', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::RawDevelopment', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'RawDevelopmentIFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::RawDevelopment', + Start => '$val', + }, + }, + ], + 0x2031 => [ #11 + { + Name => 'RawDev2', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::RawDevelopment2', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'RawDev2IFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::RawDevelopment2', + Start => '$val', + }, + }, + ], + 0x2040 => [ #PH + { + Name => 'ImageProcessing', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::ImageProcessing', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'ImageProcessingIFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::ImageProcessing', + Start => '$val', + }, + }, + ], + 0x2050 => [ #PH + { + Name => 'FocusInfo', + Condition => '$format ne "ifd" and $format ne "int32u" and not $$self{OlympusCAMER}', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FocusInfo', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'FocusInfoIFD', + Condition => 'not $$self{OlympusCAMER}', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FocusInfo', + Start => '$val', + }, + }, + { + # ASCII-based camera parameters if makernotes starts with "CAMER\0" + # (or for Sony models starting with "SONY PI\0" or "PREMI\0") + Name => 'CameraParameters', + Writable => 'undef', + Binary => 1, + }, + ], + 0x2100 => [ + { #11 + Name => 'Olympus2100', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + }, + }, + { #PH + Name => 'Olympus2100IFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + Start => '$val', + }, + }, + ], + 0x2200 => [ + { #11 + Name => 'Olympus2200', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + }, + }, + { #PH + Name => 'Olympus2200IFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + Start => '$val', + }, + }, + ], + 0x2300 => [ + { #11 + Name => 'Olympus2300', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + }, + }, + { #PH + Name => 'Olympus2300IFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + Start => '$val', + }, + }, + ], + 0x2400 => [ + { #11 + Name => 'Olympus2400', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + }, + }, + { #PH + Name => 'Olympus2400IFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + Start => '$val', + }, + }, + ], + 0x2500 => [ + { #11 + Name => 'Olympus2500', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + }, + }, + { #PH + Name => 'Olympus2500IFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + Start => '$val', + }, + }, + ], + 0x2600 => [ + { #11 + Name => 'Olympus2600', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + }, + }, + { #PH + Name => 'Olympus2600IFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + Start => '$val', + }, + }, + ], + 0x2700 => [ + { #11 + Name => 'Olympus2700', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + }, + }, + { #PH + Name => 'Olympus2700IFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + Start => '$val', + }, + }, + ], + 0x2800 => [ + { #11 + Name => 'Olympus2800', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + }, + }, + { #PH + Name => 'Olympus2800IFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + Start => '$val', + }, + }, + ], + 0x2900 => [ + { #11 + Name => 'Olympus2900', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + }, + }, + { #PH + Name => 'Olympus2900IFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::FETags', + ByteOrder => 'Unknown', + Start => '$val', + }, + }, + ], + 0x3000 => [ + { #6 + Name => 'RawInfo', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::RawInfo', + ByteOrder => 'Unknown', + }, + }, + { #PH + Name => 'RawInfoIFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::RawInfo', + Start => '$val', + }, + }, + ], + 0x4000 => [ #PH + { + Name => 'MainInfo', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::Main', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'MainInfoIFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::Main', + Start => '$val', + }, + }, + ], + 0x5000 => [ #PH + { + Name => 'UnknownInfo', + Condition => '$format ne "ifd" and $format ne "int32u"', + NestedHtmlDump => 2, + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::UnknownInfo', + ByteOrder => 'Unknown', + }, + }, + { + Name => 'UnknownInfoIFD', + Groups => { 1 => 'MakerNotes' }, + Flags => 'SubIFD', + FixFormat => 'ifd', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::UnknownInfo', + Start => '$val', + }, + }, + ], +); + +# TextInfo tags +%Image::ExifTool::Olympus::TextInfo = ( + PROCESS_PROC => \&Image::ExifTool::APP12::ProcessAPP12, + NOTES => q{ + This information is in text format (similar to APP12 information, but with + spaces instead of linefeeds). Below are tags which have been observed, but + any information found here will be extracted, even if the tag is not listed. + }, + GROUPS => { 0 => 'MakerNotes', 1 => 'Olympus', 2 => 'Image' }, + Resolution => { }, + Type => { + Name => 'CameraType', + Groups => { 2 => 'Camera' }, + DataMember => 'CameraType', + RawConv => '$self->{CameraType} = $val', + SeparateTable => 'CameraType', + PrintConv => \%olympusCameraTypes, + }, +); + +# Olympus Equipment IFD +%Image::ExifTool::Olympus::Equipment = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x000 => { #PH + Name => 'EquipmentVersion', + Writable => 'undef', + RawConv => '$val=~s/\0+$//; $val', # (may be null terminated) + Count => 4, + }, + 0x100 => { #6 + Name => 'CameraType2', + Writable => 'string', + Count => 6, + SeparateTable => 'CameraType', + PrintConv => \%olympusCameraTypes, + }, + 0x101 => { #PH + Name => 'SerialNumber', + Writable => 'string', + Count => 32, + PrintConv => '$val=~s/\s+$//;$val', + PrintConvInv => 'pack("A31",$val)', # pad with spaces to 31 chars + }, + 0x102 => { #6 + Name => 'InternalSerialNumber', + Notes => '16 digits: 0-3=model, 4=year, 5-6=month, 8-12=unit number', + Writable => 'string', + Count => 32, + }, + 0x103 => { #6 + Name => 'FocalPlaneDiagonal', + Writable => 'rational64u', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + 0x104 => { #6 + Name => 'BodyFirmwareVersion', + Writable => 'int32u', + PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val', + PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)', + }, + 0x201 => { #6 + Name => 'LensType', + Writable => 'int8u', + Count => 6, + Notes => q{ + 6 numbers: 1. Make, 2. Unknown, 3. Model, 4. Sub-model, 5-6. Unknown. Only + the Make, Model and Sub-model are used to identify the lens type + }, + SeparateTable => 'LensType', + # Have seen these values for the unknown numbers: + # 2: 0 + # 5: 0, 2(Olympus lenses for which I have also seen 0 for this number) + # 6: 0, 16(new Lumix lenses) + ValueConv => 'my @a=split(" ",$val); sprintf("%x %.2x %.2x",@a[0,2,3])', + # set unknown values to zero when writing + ValueConvInv => 'my @a=split(" ",$val); hex($a[0])." 0 ".hex($a[1])." ".hex($a[2])." 0 0"', + PrintConv => \%olympusLensTypes, + }, + # apparently the first 3 digits of the lens s/n give the type (ref 4): + # 010 = 50macro + # 040 = EC-14 + # 050 = 14-54 + # 060 = 50-200 + # 080 = EX-25 + # 101 = FL-50 + # 272 = EC-20 #7 + 0x202 => { #PH + Name => 'LensSerialNumber', + Writable => 'string', + Count => 32, + PrintConv => '$val=~s/\s+$//;$val', + PrintConvInv => 'pack("A31",$val)', # pad with spaces to 31 chars + }, + 0x203 => { Name => 'LensModel', Writable => 'string' }, #17 + 0x204 => { #6 + Name => 'LensFirmwareVersion', + Writable => 'int32u', + PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val', + PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)', + }, + 0x205 => { #11 + Name => 'MaxApertureAtMinFocal', + Writable => 'int16u', + ValueConv => '$val ? sqrt(2)**($val/256) : 0', + ValueConvInv => '$val>0 ? int(512*log($val)/log(2)+0.5) : 0', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x206 => { #5 + Name => 'MaxApertureAtMaxFocal', + Writable => 'int16u', + ValueConv => '$val ? sqrt(2)**($val/256) : 0', + ValueConvInv => '$val>0 ? int(512*log($val)/log(2)+0.5) : 0', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x207 => { Name => 'MinFocalLength', Writable => 'int16u' }, #PH + 0x208 => { Name => 'MaxFocalLength', Writable => 'int16u' }, #PH + 0x20a => { #9 + Name => 'MaxAperture', # (at current focal length) + Writable => 'int16u', + ValueConv => '$val ? sqrt(2)**($val/256) : 0', + ValueConvInv => '$val>0 ? int(512*log($val)/log(2)+0.5) : 0', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x20b => { #11 + Name => 'LensProperties', + Writable => 'int16u', + PrintConv => 'sprintf("0x%x",$val)', + PrintConvInv => '$val', + }, + 0x301 => { #6 + Name => 'Extender', + Writable => 'int8u', + Count => 6, + Notes => q{ + 6 numbers: 1. Make, 2. Unknown, 3. Model, 4. Sub-model, 5-6. Unknown. Only + the Make and Model are used to identify the extender + }, + ValueConv => 'my @a=split(" ",$val); sprintf("%x %.2x",@a[0,2])', + ValueConvInv => 'my @a=split(" ",$val); hex($a[0])." 0 ".hex($a[1])." 0 0 0"', + PrintConv => { + '0 00' => 'None', + '0 04' => 'Olympus Zuiko Digital EC-14 1.4x Teleconverter', + '0 08' => 'Olympus EX-25 Extension Tube', + '0 10' => 'Olympus Zuiko Digital EC-20 2.0x Teleconverter', #7 + }, + }, + 0x302 => { Name => 'ExtenderSerialNumber', Writable => 'string', Count => 32 }, #4 + 0x303 => { Name => 'ExtenderModel', Writable => 'string' }, #9 + 0x304 => { #6 + Name => 'ExtenderFirmwareVersion', + Writable => 'int32u', + PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val', + PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)', + }, + 0x403 => { #http://dev.exiv2.org/issues/870 + Name => 'ConversionLens', + Writable => 'string', + # (observed values: '','TCON','FCON','WCON') + }, + 0x1000 => { #6 + Name => 'FlashType', + Writable => 'int16u', + PrintConv => { + 0 => 'None', + 2 => 'Simple E-System', + 3 => 'E-System', + 4 => 'E-System (body powered)', #forum9740 + }, + }, + 0x1001 => { #6 + Name => 'FlashModel', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 0 => 'None', + 1 => 'FL-20', # (or subtronic digital or Inon UW flash, ref 11) + 2 => 'FL-50', # (or Metzblitz+SCA or Cullmann 34, ref 11) + 3 => 'RF-11', + 4 => 'TF-22', + 5 => 'FL-36', + 6 => 'FL-50R', #11 (or Metz mecablitz digital) + 7 => 'FL-36R', #11 + 9 => 'FL-14', #11 + 11 => 'FL-600R', #11 + 13 => 'FL-LM3', #forum9740 + 15 => 'FL-900R', #7 + }, + }, + 0x1002 => { #6 + Name => 'FlashFirmwareVersion', + Writable => 'int32u', + PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val', + PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)', + }, + 0x1003 => { Name => 'FlashSerialNumber', Writable => 'string', Count => 32 }, #4 +); + +# Olympus camera settings IFD +%Image::ExifTool::Olympus::CameraSettings = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x000 => { #PH + Name => 'CameraSettingsVersion', + Writable => 'undef', + RawConv => '$val=~s/\0+$//; $val', # (may be null terminated) + Count => 4, + }, + 0x100 => { #6 + Name => 'PreviewImageValid', + Writable => 'int32u', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0x101 => { #PH + Name => 'PreviewImageStart', + Flags => 'IsOffset', + OffsetPair => 0x102, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + 0x102 => { #PH + Name => 'PreviewImageLength', + OffsetPair => 0x101, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + 0x200 => { #4 + Name => 'ExposureMode', + Writable => 'int16u', + PrintConv => { + 1 => 'Manual', + 2 => 'Program', #6 + 3 => 'Aperture-priority AE', + 4 => 'Shutter speed priority AE', + 5 => 'Program-shift', #6 + } + }, + 0x201 => { #6 + Name => 'AELock', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x202 => { #PH/4 + Name => 'MeteringMode', + Writable => 'int16u', + PrintConv => { + 2 => 'Center-weighted average', + 3 => 'Spot', + 5 => 'ESP', + 261 => 'Pattern+AF', #6 + 515 => 'Spot+Highlight control', #6 + 1027 => 'Spot+Shadow control', #6 + }, + }, + 0x203 => { Name => 'ExposureShift', Writable => 'rational64s' }, #11 (some models only) + 0x204 => { #11 (XZ-1) + Name => 'NDFilter', + PrintConv => \%offOn, + }, + 0x300 => { #6 + Name => 'MacroMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'Super Macro', #11 + }, + }, + 0x301 => { #6 + Name => 'FocusMode', + Writable => 'int16u', + Count => -1, + Notes => '1 or 2 values', + PrintConv => [{ + 0 => 'Single AF', + 1 => 'Sequential shooting AF', + 2 => 'Continuous AF', + 3 => 'Multi AF', + 4 => 'Face detect', #11 + 10 => 'MF', + }, { + 0 => '(none)', + BITMASK => { #11 + 0 => 'S-AF', + 2 => 'C-AF', + 4 => 'MF', + 5 => 'Face detect', + 6 => 'Imager AF', + 7 => 'Live View Magnification Frame', + 8 => 'AF sensor', + 9 => 'Starry Sky AF', #24 + }, + }], + }, + 0x302 => { #6 + Name => 'FocusProcess', + Writable => 'int16u', + Count => -1, + Notes => '1 or 2 values', + PrintConv => [{ + 0 => 'AF Not Used', + 1 => 'AF Used', + }], + # 2nd value written only by some models (u1050SW, u9000, uT6000, uT6010, + # uT8000, E-30, E-420, E-450, E-520, E-620, E-P1 and E-P2): - PH + # observed values when "AF Not Used": 0, 16 + # observed values when "AF Used": 64, 96(face detect on), 256 + }, + 0x303 => { #6 + Name => 'AFSearch', + Writable => 'int16u', + PrintConv => { + 0 => 'Not Ready', + 1 => 'Ready', + }, + }, + 0x304 => { #PH/4 + Name => 'AFAreas', + Notes => 'coordinates range from 0 to 255', + Writable => 'int32u', + Count => 64, + PrintConv => 'Image::ExifTool::Olympus::PrintAFAreas($val)', + }, + 0x0305 => { #PH + Name => 'AFPointSelected', + Notes => 'coordinates expressed as a percent', + Writable => 'rational64s', + Count => 5, + ValueConv => '$val =~ s/\S* //; $val', # ignore first undefined value + ValueConvInv => '"undef $val"', + PrintConv => q{ + return 'n/a' if $val =~ /undef/; + sprintf("(%d%%,%d%%) (%d%%,%d%%)", map {$_ * 100} split(" ",$val)); + }, + PrintConvInv => q{ + return 'undef undef undef undef' if $val eq 'n/a'; + my @nums = $val =~ /\d+(?:\.\d+)?/g; + return undef unless @nums == 4; + join ' ', map {$_ / 100} @nums; + }, + }, + 0x306 => { #11 + Name => 'AFFineTune', + Writable => 'int8u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x307 => { #15 + Name => 'AFFineTuneAdj', + Writable => 'int16s', + Count => 3, # not sure what the 3 values mean + }, + 0x308 => { #forum11578 + Name => 'FocusBracketStepSize', + Writable => 'int8u', + }, + 0x309 => { #forum13341 + Name => 'AISubjectTrackingMode', + Writable => 'int16u', + ValueConv => '($val >> 8) . " " . ($val & 0xff)', + ValueConvInv => 'my @a = split " ", $val; $val = $a[0]*256 + $a[1]', + PrintConv => [{ + 0 => 'Off', + 1 => 'Motorsports', + 2 => 'Airplanes', + 3 => 'Trains', + 4 => 'Birds', + 5 => 'Dogs & Cats', + },{ + 0 => 'Object Not Found', + 1 => 'Object Found', + }], + }, + 0x400 => { #6 + Name => 'FlashMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + BITMASK => { + 0 => 'On', + 1 => 'Fill-in', + 2 => 'Red-eye', + 3 => 'Slow-sync', + 4 => 'Forced On', + 5 => '2nd Curtain', + }, + }, + }, + 0x401 => { Name => 'FlashExposureComp', Writable => 'rational64s' }, #6 + # 0x402 - FlashMode? bit0=TTL, bit1=auto, bit2=SuperFP (ref 11) + 0x403 => { #11 + Name => 'FlashRemoteControl', + Writable => 'int16u', + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => { + 0 => 'Off', + 0x01 => 'Channel 1, Low', + 0x02 => 'Channel 2, Low', + 0x03 => 'Channel 3, Low', + 0x04 => 'Channel 4, Low', + 0x09 => 'Channel 1, Mid', + 0x0a => 'Channel 2, Mid', + 0x0b => 'Channel 3, Mid', + 0x0c => 'Channel 4, Mid', + 0x11 => 'Channel 1, High', + 0x12 => 'Channel 2, High', + 0x13 => 'Channel 3, High', + 0x14 => 'Channel 4, High', + }, + }, + 0x404 => { #11 + Name => 'FlashControlMode', + Writable => 'int16u', + Count => -1, + Notes => '3 or 4 values', + PrintConv => [{ + 0 => 'Off', + 3 => 'TTL', + 4 => 'Auto', + 5 => 'Manual', + }], + }, + 0x405 => { #11 + Name => 'FlashIntensity', + Writable => 'rational64s', + Count => -1, + Notes => '3 or 4 values', + PrintConv => { + OTHER => sub { shift }, + 'undef undef undef' => 'n/a', + 'undef undef undef undef' => 'n/a (x4)', + }, + }, + 0x406 => { #11 + Name => 'ManualFlashStrength', + Writable => 'rational64s', + Count => -1, + Notes => '3 or 4 values', + PrintConv => { + OTHER => sub { shift }, + 'undef undef undef' => 'n/a', + 'undef undef undef undef' => 'n/a (x4)', + }, + }, + 0x500 => { #6 + Name => 'WhiteBalance2', + Writable => 'int16u', + PrintConv => { + 0 => 'Auto', + 1 => 'Auto (Keep Warm Color Off)', #IB + 16 => '7500K (Fine Weather with Shade)', + 17 => '6000K (Cloudy)', + 18 => '5300K (Fine Weather)', + 20 => '3000K (Tungsten light)', + 21 => '3600K (Tungsten light-like)', + 22 => 'Auto Setup', #IB + 23 => '5500K (Flash)', #IB + 33 => '6600K (Daylight fluorescent)', + 34 => '4500K (Neutral white fluorescent)', + 35 => '4000K (Cool white fluorescent)', + 36 => 'White Fluorescent', #IB + 48 => '3600K (Tungsten light-like)', + 67 => 'Underwater', #IB + 256 => 'One Touch WB 1', #IB + 257 => 'One Touch WB 2', #IB + 258 => 'One Touch WB 3', #IB + 259 => 'One Touch WB 4', #IB + 512 => 'Custom WB 1', #IB + 513 => 'Custom WB 2', #IB + 514 => 'Custom WB 3', #IB + 515 => 'Custom WB 4', #IB + }, + }, + 0x501 => { #PH/4 + Name => 'WhiteBalanceTemperature', + Writable => 'int16u', + PrintConv => '$val ? $val : "Auto"', + PrintConvInv => '$val=~/^\d+$/ ? $val : 0', + }, + 0x502 => { #PH/4 + Name => 'WhiteBalanceBracket', + Writable => 'int16s', + }, + 0x503 => { #PH/4/6 + Name => 'CustomSaturation', + Writable => 'int16s', + Count => 3, + Notes => '3 numbers: 1. CS Value, 2. Min, 3. Max', + PrintConv => q{ + my ($a,$b,$c)=split ' ',$val; + if ($self->{Model} =~ /^E-1\b/) { + $a-=$b; $c-=$b; + return "CS$a (min CS0, max CS$c)"; + } else { + return "$a (min $b, max $c)"; + } + }, + }, + 0x504 => { #PH/4 + Name => 'ModifiedSaturation', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'CM1 (Red Enhance)', + 2 => 'CM2 (Green Enhance)', + 3 => 'CM3 (Blue Enhance)', + 4 => 'CM4 (Skin Tones)', + }, + }, + 0x505 => { #PH/4 + Name => 'ContrastSetting', + Writable => 'int16s', + Count => 3, + Notes => 'value, min, max', + PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"', + PrintConvInv => '$val=~tr/-0-9 //dc;$val', + }, + 0x506 => { #PH/4 + Name => 'SharpnessSetting', + Writable => 'int16s', + Count => 3, + Notes => 'value, min, max', + PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"', + PrintConvInv => '$val=~tr/-0-9 //dc;$val', + }, + 0x507 => { #PH/4 + Name => 'ColorSpace', + Writable => 'int16u', + PrintConv => { #6 + 0 => 'sRGB', + 1 => 'Adobe RGB', + 2 => 'Pro Photo RGB', + }, + }, + 0x509 => { #6 + Name => 'SceneMode', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Standard', + 6 => 'Auto', #6 + 7 => 'Sport', + 8 => 'Portrait', + 9 => 'Landscape+Portrait', + 10 => 'Landscape', + 11 => 'Night Scene', + 12 => 'Self Portrait', #11 + 13 => 'Panorama', #6 + 14 => '2 in 1', #11 + 15 => 'Movie', #11 + 16 => 'Landscape+Portrait', #6 + 17 => 'Night+Portrait', + 18 => 'Indoor', #11 (Party - PH) + 19 => 'Fireworks', + 20 => 'Sunset', + 21 => 'Beauty Skin', #PH + 22 => 'Macro', + 23 => 'Super Macro', #11 + 24 => 'Food', #11 + 25 => 'Documents', + 26 => 'Museum', + 27 => 'Shoot & Select', #11 + 28 => 'Beach & Snow', + 29 => 'Self Protrait+Timer', #11 + 30 => 'Candle', + 31 => 'Available Light', #11 + 32 => 'Behind Glass', #11 + 33 => 'My Mode', #11 + 34 => 'Pet', #11 + 35 => 'Underwater Wide1', #6 + 36 => 'Underwater Macro', #6 + 37 => 'Shoot & Select1', #11 + 38 => 'Shoot & Select2', #11 + 39 => 'High Key', + 40 => 'Digital Image Stabilization', #6 + 41 => 'Auction', #11 + 42 => 'Beach', #11 + 43 => 'Snow', #11 + 44 => 'Underwater Wide2', #6 + 45 => 'Low Key', #6 + 46 => 'Children', #6 + 47 => 'Vivid', #11 + 48 => 'Nature Macro', #6 + 49 => 'Underwater Snapshot', #11 + 50 => 'Shooting Guide', #11 + 54 => 'Face Portrait', #11 + 57 => 'Bulb', #11 + 59 => 'Smile Shot', #11 + 60 => 'Quick Shutter', #11 + 63 => 'Slow Shutter', #11 + 64 => 'Bird Watching', #11 + 65 => 'Multiple Exposure', #11 + 66 => 'e-Portrait', #11 + 67 => 'Soft Background Shot', #11 + 142 => 'Hand-held Starlight', #PH (SH-21) + 154 => 'HDR', #PH (XZ-2) + 197 => 'Panning', #forum11631 (EM5iii) + 203 => 'Light Trails', #forum11631 (EM5iii) + 204 => 'Backlight HDR', #forum11631 (EM5iii) + 205 => 'Silent', #forum11631 (EM5iii) + 206 => 'Multi Focus Shot', #forum11631 (EM5iii) + }, + }, + 0x50a => { #PH/4/6 + Name => 'NoiseReduction', + Writable => 'int16u', + PrintConv => { + 0 => '(none)', + BITMASK => { + 0 => 'Noise Reduction', + 1 => 'Noise Filter', + 2 => 'Noise Filter (ISO Boost)', + 3 => 'Auto', #11 + }, + }, + }, + 0x50b => { #6 + Name => 'DistortionCorrection', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x50c => { #PH/4 + Name => 'ShadingCompensation', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x50d => { Name => 'CompressionFactor', Writable => 'rational64u' }, #PH/4 + 0x50f => { #6 + Name => 'Gradation', + Writable => 'int16s', + Notes => '3 or 4 values', + Count => -1, + Relist => [ [0..2], 3 ], # join values 0-2 for PrintConv + PrintConv => [{ + '0 0 0' => 'n/a', #PH (?) + '-1 -1 1' => 'Low Key', + '0 -1 1' => 'Normal', + '1 -1 1' => 'High Key', + },{ + 0 => 'User-Selected', + 1 => 'Auto-Override', + }], + }, + 0x520 => { #6 + Name => 'PictureMode', + Writable => 'int16u', + Notes => '1 or 2 values', + Count => -1, + PrintConv => [{ + 1 => 'Vivid', + 2 => 'Natural', + 3 => 'Muted', + 4 => 'Portrait', + 5 => 'i-Enhance', #11 + 6 => 'e-Portrait', #23 + 7 => 'Color Creator', #23 + 9 => 'Color Profile 1', #23 + 10 => 'Color Profile 2', #23 + 11 => 'Color Profile 3', #23 + 12 => 'Monochrome Profile 1', #23 + 13 => 'Monochrome Profile 2', #23 + 14 => 'Monochrome Profile 3', #23 + 256 => 'Monotone', + 512 => 'Sepia', + }], + }, + 0x521 => { #6 + Name => 'PictureModeSaturation', + Writable => 'int16s', + Count => 3, + Notes => 'value, min, max', + PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"', + PrintConvInv => '$val=~tr/-0-9 //dc;$val', + }, + 0x522 => { #6 + Name => 'PictureModeHue', + Writable => 'int16s', + Unknown => 1, # (needs verification) + }, + 0x523 => { #6 + Name => 'PictureModeContrast', + Writable => 'int16s', + Count => 3, + Notes => 'value, min, max', + PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"', + PrintConvInv => '$val=~tr/-0-9 //dc;$val', + }, + 0x524 => { #6 + Name => 'PictureModeSharpness', + # verified as the Sharpness setting in the Picture Mode menu for the E-410 + Writable => 'int16s', + Count => 3, + Notes => 'value, min, max', + PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"', + PrintConvInv => '$val=~tr/-0-9 //dc;$val', + }, + 0x525 => { #6 + Name => 'PictureModeBWFilter', + Writable => 'int16s', + PrintConvColumns => 2, + PrintConv => { + 0 => 'n/a', + 1 => 'Neutral', + 2 => 'Yellow', + 3 => 'Orange', + 4 => 'Red', + 5 => 'Green', + }, + }, + 0x526 => { #6 + Name => 'PictureModeTone', + Writable => 'int16s', + PrintConvColumns => 2, + PrintConv => { + 0 => 'n/a', + 1 => 'Neutral', + 2 => 'Sepia', + 3 => 'Blue', + 4 => 'Purple', + 5 => 'Green', + }, + }, + 0x527 => { #12 + Name => 'NoiseFilter', + Writable => 'int16s', + Count => 3, + PrintConv => { + '0 0 0' => 'n/a', #PH (?) + '-2 -2 1' => 'Off', + '-1 -2 1' => 'Low', + '0 -2 1' => 'Standard', + '1 -2 1' => 'High', + }, + }, + 0x529 => { #PH + Name => 'ArtFilter', + Writable => 'int16u', + Count => 4, + PrintConvColumns => 2, + PrintConv => [ \%filters ], + }, + 0x52c => { #PH + Name => 'MagicFilter', + Writable => 'int16u', + Count => 4, # (2nd number is 0, 1280 or 1792, 3rd/4th are 0) + # (1792 observed for E-5 Gentle Sepia and XZ-1 Dramatic Tone) + PrintConvColumns => 2, + PrintConv => [ \%filters ], + }, + 0x52d => { #11 + Name => 'PictureModeEffect', + Writable => 'int16s', + Count => 3, + PrintConv => { + '0 0 0' => 'n/a', #PH (?) + '-1 -1 1' => 'Low', + '0 -1 1' => 'Standard', + '1 -1 1' => 'High', + }, + }, + 0x52e => { #11/PH + Name => 'ToneLevel', + PrintConv => [ + \%toneLevelType, + undef, # (highlights value) + undef, # (highlights min) + undef, # (highlights max) + \%toneLevelType, + undef, # (shadows value) + undef, # (shadows min) + undef, # (shadows max) + \%toneLevelType, + undef, # (midtones value) + undef, # (midtones min) + undef, # (midtones max) + \%toneLevelType, + undef, + undef, + undef, + \%toneLevelType, + undef, + undef, + undef, + \%toneLevelType, + undef, + undef, + undef, + \%toneLevelType, + undef, + undef, + undef, + ] + }, + 0x52f => { #PH + Name => 'ArtFilterEffect', + Writable => 'int16u', + Count => 20, + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => [ + \%filters, + undef, + undef, + '"Partial Color $val"', #23 + { # there are 5 available art filter effects for the E-PL3... + 0x0000 => 'No Effect', + 0x8010 => 'Star Light', + 0x8020 => 'Pin Hole', + 0x8030 => 'Frame', + 0x8040 => 'Soft Focus', + 0x8050 => 'White Edge', + 0x8060 => 'B&W', # (NC - E-PL2 with "Grainy Film" filter) + 0x8080 => 'Blur Top and Bottom', #23 + 0x8081 => 'Blur Left and Right', #23 + # (E-PL2 also has "Pict. Tone" effect) + }, + undef, + { #23 + 0 => 'No Color Filter', + 1 => 'Yellow Color Filter', + 2 => 'Orange Color Filter', + 3 => 'Red Color Filter', + 4 => 'Green Color Filter', + }, + ], + }, + 0x532 => { #23 + Name => 'ColorCreatorEffect', + Writable => 'int16s', + Count => 6, + PrintConv => [ + '"Color $val"', + undef, # (Color min) + undef, # (Color max) + '"Strength $val"', + undef, # (Strength min) + undef, # (Strength max) + ], + }, + 0x537 => { #23 + Name => 'MonochromeProfileSettings', + Writable => 'int16s', + Count => 6, + PrintConv => [ + { + 0 => 'No Filter', + 1 => 'Yellow Filter', + 2 => 'Orange Filter', + 3 => 'Red Filter', + 4 => 'Magenta Filter', + 5 => 'Blue Filter', + 6 => 'Cyan Filter', + 7 => 'Green Filter', + 8 => 'Yellow-green Filter', + }, + undef, # (Filter number min) + undef, # (Filter number max) + '"Strength $val"', + undef, # (Strength min) + undef, # (Strength max) + ], + }, + 0x538 => { #23 + Name => 'FilmGrainEffect', + Writable => 'int16s', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Medium', + 3 => 'High', + }, + }, + 0x539 => { #23 + Name => 'ColorProfileSettings', + Writable => 'int16s', + Count => 14, + PrintConv => [ + '"Min $val"', + '"Max $val"', + '"Yellow $val"', + '"Orange $val"', + '"Orange-red $val"', + '"Red $val"', + '"Magenta $val"', + '"Violet $val"', + '"Blue $val"', + '"Blue-cyan $val"', + '"Cyan $val"', + '"Green-cyan $val"', + '"Green $val"', + '"Yellow-green $val"', + ], + }, + 0x53a => { #23 + Name => 'MonochromeVignetting', + Writable => 'int16s', + Notes => '-5 to +5: positive is white vignetting, negative is black vignetting', + }, + 0x53b => { #23 + Name => 'MonochromeColor', + Writable => 'int16s', + PrintConv => { + 0 => '(none)', + 1 => 'Normal', + 2 => 'Sepia', + 3 => 'Blue', + 4 => 'Purple', + 5 => 'Green', + }, + }, + 0x600 => { #PH/4/22 + Name => 'DriveMode', + Writable => 'int16u', + Count => -1, + Notes => '2, 3 or 5 numbers: 1. Mode, 2. Shot number, 3. Mode bits, 5. Shutter mode', + PrintConv => q{ + my ($a,$b,$c,$d,$e) = split ' ',$val; + if ($e) { + $e = '; ' . ({ 2 => 'Anti-shock 0', 4 => 'Electronic shutter' }->{$e} || "Unknown ($e)"); + } else { + $e = ''; + } + return "Single Shot$e" unless $a; + if ($a == 5 and defined $c) { + $a = DecodeBits($c, { #6 + 0 => 'AE', + 1 => 'WB', + 2 => 'FL', + 3 => 'MF', + 4 => 'ISO', #forum8906 + 5 => 'AE Auto', #forum8906 + 6 => 'Focus', #PH + }) . ' Bracketing'; + $a =~ s/, /+/g; + } else { + my %a = ( + 1 => 'Continuous Shooting', + 2 => 'Exposure Bracketing', + 3 => 'White Balance Bracketing', + 4 => 'Exposure+WB Bracketing', #6 + ); + $a = $a{$a} || "Unknown ($a)"; + } + return "$a, Shot $b$e"; + }, + }, + 0x601 => { #6 + Name => 'PanoramaMode', + Writable => 'int16u', + Notes => '2 numbers: 1. Mode, 2. Shot number', + PrintConv => q{ + my ($a,$b) = split ' ',$val; + return 'Off' unless $a; + my %a = ( + 1 => 'Left to Right', + 2 => 'Right to Left', + 3 => 'Bottom to Top', + 4 => 'Top to Bottom', + ); + return(($a{$a} || "Unknown ($a)") . ', Shot ' . $b); + }, + }, + 0x603 => { #PH/4 + Name => 'ImageQuality2', + Writable => 'int16u', + PrintConv => { + 1 => 'SQ', + 2 => 'HQ', + 3 => 'SHQ', + 4 => 'RAW', + 5 => 'SQ (5)', # (E-500) + }, + }, + 0x604 => { #PH + Name => 'ImageStabilization', + Writable => 'int32u', + DataMember => 'ImageStabilization', + RawConv => '$$self{ImageStabilization} = $val', + PrintConv => { + 0 => 'Off', + 1 => 'On, Mode 1', + 2 => 'On, Mode 2', + 3 => 'On, Mode 3', + 4 => 'On, Mode 4', # (NC, E-P5) + }, + }, + 0x804 => { #PH (E-M1 with firmware update) + Name => 'StackedImage', + Writable => 'int32u', + Count => 2, + PrintConv => { + '0 0' => 'No', + '1 *' => 'Live Composite (* images)', #24 + '4 *' => 'Live Time/Bulb (* images)', #24 + '3 2' => 'ND2 (1EV)', #IB + '3 4' => 'ND4 (2EV)', #IB + '3 8' => 'ND8 (3EV)', #IB + '3 16' => 'ND16 (4EV)', #IB + '3 32' => 'ND32 (5EV)', #IB + '3 64' => 'ND64 (6EV)', #forum13341 + '5 4' => 'HDR1', #forum8906 + '6 4' => 'HDR2', #forum8906 + '8 8' => 'Tripod high resolution', #IB + '9 *' => 'Focus-stacked (* images)', #IB (* = 2-15) + '11 12' => 'Hand-held high resolution (11 12)', #forum13341 (OM-1) + '11 16' => 'Hand-held high resolution (11 16)', #IB (perhaps '11 15' would be possible, ref 24) + OTHER => sub { + my ($val, $inv, $conv) = @_; + if ($inv) { + $val = lc $val; + return undef unless $val =~ s/(\d+) images/\* images/; + my $num = $1; + foreach (keys %$conv) { + next unless $val eq lc $$conv{$_}; + ($val = $_) =~ s/\*/$num/ or return undef; + return $val; + } + } else { + return "Unknown ($_[0])" unless $val =~ s/ (\d+)/ \*/ and $$conv{$val}; + my $num = $1; + ($val = $$conv{$val}) =~ s/\*/$num/; + return $val; + } + }, + }, + }, + 0x900 => { #11 + Name => 'ManometerPressure', + Writable => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => '"$val kPa"', + PrintConvInv => '$val=~s/ ?kPa//i; $val', + }, + 0x901 => { #PH (u770SW) + # 2 numbers: 1st looks like meters above sea level, 2nd is usually 3x the 1st (feet?) + Name => 'ManometerReading', + Writable => 'int32s', + Count => 2, + ValueConv => 'my @a=split(" ",$val); $_ /= 10 foreach @a; "@a"', + ValueConvInv => 'my @a=split(" ",$val); $_ *= 10 foreach @a; "@a"', + PrintConv => '$val=~s/(\S+) (\S+)/$1 m, $2 ft/; $val', + PrintConvInv => '$val=~s/ ?(m|ft)//gi; $val', + }, + 0x902 => { #11 + Name => 'ExtendedWBDetect', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x903 => { #11 + Name => 'RollAngle', + Notes => 'converted to degrees of clockwise camera rotation', + Writable => 'int16s', + Count => 2, # (second value is 0 if level gauge is off) + # negate to express as clockwise rotation + ValueConv => '$val=~s/ 1$// ? -$val/10 : "n/a"', + ValueConvInv => 'IsFloat($val) ? sprintf("%.0f 1",-$val*10) : "0 0"', + }, + 0x904 => { #11 + Name => 'PitchAngle', + Notes => 'converted to degrees of upward camera tilt', + Writable => 'int16s', + Count => 2, # (second value is 0 if level gauge is off) + ValueConv => '$val =~ s/ 1$// ? $val / 10 : "n/a"', + ValueConvInv => 'IsFloat($val) ? sprintf("%.0f 1",$val*10) : "0 0"', + }, + 0x908 => { #PH (NC, E-M1) + Name => 'DateTimeUTC', + Writable => 'string', + Groups => { 2 => 'Time' }, + Shift => 'Time', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', + }, +); + +# Olympus RAW processing IFD (ref 6) +%Image::ExifTool::Olympus::RawDevelopment = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x000 => { #PH + Name => 'RawDevVersion', + Writable => 'undef', + RawConv => '$val=~s/\0+$//; $val', # (may be null terminated) + Count => 4, + }, + 0x100 => { Name => 'RawDevExposureBiasValue', Writable => 'rational64s' }, + 0x101 => { Name => 'RawDevWhiteBalanceValue', Writable => 'int16u' }, + 0x102 => { Name => 'RawDevWBFineAdjustment', Writable => 'int16s' }, + 0x103 => { Name => 'RawDevGrayPoint', Writable => 'int16u', Count => 3 }, + 0x104 => { Name => 'RawDevSaturationEmphasis', Writable => 'int16s', Count => 3 }, + 0x105 => { Name => 'RawDevMemoryColorEmphasis', Writable => 'int16u' }, + 0x106 => { Name => 'RawDevContrastValue', Writable => 'int16s', Count => 3 }, + 0x107 => { Name => 'RawDevSharpnessValue', Writable => 'int16s', Count => 3 }, + 0x108 => { + Name => 'RawDevColorSpace', + Writable => 'int16u', + PrintConv => { #11 + 0 => 'sRGB', + 1 => 'Adobe RGB', + 2 => 'Pro Photo RGB', + }, + }, + 0x109 => { + Name => 'RawDevEngine', + Writable => 'int16u', + PrintConv => { #11 + 0 => 'High Speed', + 1 => 'High Function', + 2 => 'Advanced High Speed', + 3 => 'Advanced High Function', + }, + }, + 0x10a => { + Name => 'RawDevNoiseReduction', + Writable => 'int16u', + PrintConv => { #11 + 0 => '(none)', + BITMASK => { + 0 => 'Noise Reduction', + 1 => 'Noise Filter', + 2 => 'Noise Filter (ISO Boost)', + }, + }, + }, + 0x10b => { + Name => 'RawDevEditStatus', + Writable => 'int16u', + PrintConv => { #11 + 0 => 'Original', + 1 => 'Edited (Landscape)', + 6 => 'Edited (Portrait)', + 8 => 'Edited (Portrait)', + }, + }, + 0x10c => { + Name => 'RawDevSettings', + Writable => 'int16u', + PrintConv => { #11 + 0 => '(none)', + BITMASK => { + 0 => 'WB Color Temp', + 1 => 'WB Gray Point', + 2 => 'Saturation', + 3 => 'Contrast', + 4 => 'Sharpness', + 5 => 'Color Space', + 6 => 'High Function', + 7 => 'Noise Reduction', + }, + }, + }, +); + +# Olympus RAW processing B IFD (ref 11) +%Image::ExifTool::Olympus::RawDevelopment2 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x000 => { + Name => 'RawDevVersion', + Writable => 'undef', + RawConv => '$val=~s/\0+$//; $val', # (may be null terminated) + Count => 4, + }, + 0x100 => { Name => 'RawDevExposureBiasValue', Writable => 'rational64s' }, + 0x101 => { + Name => 'RawDevWhiteBalance', + Writable => 'int16u', + PrintConv => { + 1 => 'Color Temperature', + 2 => 'Gray Point', + }, + }, + 0x102 => { Name => 'RawDevWhiteBalanceValue', Writable => 'int16u' }, + 0x103 => { Name => 'RawDevWBFineAdjustment', Writable => 'int16s' }, + 0x104 => { Name => 'RawDevGrayPoint', Writable => 'int16u', Count => 3 }, + 0x105 => { Name => 'RawDevContrastValue', Writable => 'int16s', Count => 3 }, + 0x106 => { Name => 'RawDevSharpnessValue', Writable => 'int16s', Count => 3 }, + 0x107 => { Name => 'RawDevSaturationEmphasis', Writable => 'int16s', Count => 3 }, + 0x108 => { Name => 'RawDevMemoryColorEmphasis', Writable => 'int16u' }, + 0x109 => { + Name => 'RawDevColorSpace', + Writable => 'int16u', + PrintConv => { + 0 => 'sRGB', + 1 => 'Adobe RGB', + 2 => 'Pro Photo RGB', + }, + }, + 0x10a => { + Name => 'RawDevNoiseReduction', + Writable => 'int16u', + PrintConv => { + 0 => '(none)', + BITMASK => { + 0 => 'Noise Reduction', + 1 => 'Noise Filter', + 2 => 'Noise Filter (ISO Boost)', + }, + }, + }, + 0x10b => { + Name => 'RawDevEngine', + Writable => 'int16u', + PrintConv => { + 0 => 'High Speed', + 1 => 'High Function', + }, + }, + 0x10c => { + Name => 'RawDevPictureMode', + Writable => 'int16u', + PrintConv => { + 1 => 'Vivid', + 2 => 'Natural', + 3 => 'Muted', + 256 => 'Monotone', + 512 => 'Sepia', + }, + }, + 0x10d => { Name => 'RawDevPMSaturation', Writable => 'int16s', Count => 3 }, + 0x10e => { Name => 'RawDevPMContrast', Writable => 'int16s', Count => 3 }, + 0x10f => { Name => 'RawDevPMSharpness', Writable => 'int16s', Count => 3 }, + 0x110 => { + Name => 'RawDevPM_BWFilter', + Writable => 'int16u', + PrintConv => { + 1 => 'Neutral', + 2 => 'Yellow', + 3 => 'Orange', + 4 => 'Red', + 5 => 'Green', + }, + }, + 0x111 => { + Name => 'RawDevPMPictureTone', + Writable => 'int16u', + PrintConv => { + 1 => 'Neutral', + 2 => 'Sepia', + 3 => 'Blue', + 4 => 'Purple', + 5 => 'Green', + }, + }, + 0x112 => { Name => 'RawDevGradation', Writable => 'int16s', Count => 3 }, + 0x113 => { Name => 'RawDevSaturation3', Writable => 'int16s', Count => 3 }, #(NC Count) + 0x119 => { Name => 'RawDevAutoGradation', Writable => 'int16u', PrintConv => \%offOn }, + 0x120 => { Name => 'RawDevPMNoiseFilter', Writable => 'int16u' }, #(NC format) + 0x121 => { #PH (E-P5) + Name => 'RawDevArtFilter', + Writable => 'int16u', + Count => 4, + PrintConvColumns => 2, + PrintConv => [ \%filters ], + }, +); + +# Olympus Image processing IFD +%Image::ExifTool::Olympus::ImageProcessing = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x000 => { #PH + Name => 'ImageProcessingVersion', + Writable => 'undef', + RawConv => '$val=~s/\0+$//; $val', # (may be null terminated) + Count => 4, + }, + 0x100 => { Name => 'WB_RBLevels', Writable => 'int16u', Count => 2 }, #6 + # 0x101 - in-camera AutoWB unless it is all 0's or all 256's (ref IB) + 0x102 => { Name => 'WB_RBLevels3000K', Writable => 'int16u', Count => 2 }, #11 + 0x103 => { Name => 'WB_RBLevels3300K', Writable => 'int16u', Count => 2 }, #11 + 0x104 => { Name => 'WB_RBLevels3600K', Writable => 'int16u', Count => 2 }, #11 + 0x105 => { Name => 'WB_RBLevels3900K', Writable => 'int16u', Count => 2 }, #11 + 0x106 => { Name => 'WB_RBLevels4000K', Writable => 'int16u', Count => 2 }, #11 + 0x107 => { Name => 'WB_RBLevels4300K', Writable => 'int16u', Count => 2 }, #11 + 0x108 => { Name => 'WB_RBLevels4500K', Writable => 'int16u', Count => 2 }, #11 + 0x109 => { Name => 'WB_RBLevels4800K', Writable => 'int16u', Count => 2 }, #11 + 0x10a => { Name => 'WB_RBLevels5300K', Writable => 'int16u', Count => 2 }, #11 + 0x10b => { Name => 'WB_RBLevels6000K', Writable => 'int16u', Count => 2 }, #11 + 0x10c => { Name => 'WB_RBLevels6600K', Writable => 'int16u', Count => 2 }, #11 + 0x10d => { Name => 'WB_RBLevels7500K', Writable => 'int16u', Count => 2 }, #11 + 0x10e => { Name => 'WB_RBLevelsCWB1', Writable => 'int16u', Count => 2 }, #11 + 0x10f => { Name => 'WB_RBLevelsCWB2', Writable => 'int16u', Count => 2 }, #11 + 0x110 => { Name => 'WB_RBLevelsCWB3', Writable => 'int16u', Count => 2 }, #11 + 0x111 => { Name => 'WB_RBLevelsCWB4', Writable => 'int16u', Count => 2 }, #11 + 0x113 => { Name => 'WB_GLevel3000K', Writable => 'int16u' }, #11 + 0x114 => { Name => 'WB_GLevel3300K', Writable => 'int16u' }, #11 + 0x115 => { Name => 'WB_GLevel3600K', Writable => 'int16u' }, #11 + 0x116 => { Name => 'WB_GLevel3900K', Writable => 'int16u' }, #11 + 0x117 => { Name => 'WB_GLevel4000K', Writable => 'int16u' }, #11 + 0x118 => { Name => 'WB_GLevel4300K', Writable => 'int16u' }, #11 + 0x119 => { Name => 'WB_GLevel4500K', Writable => 'int16u' }, #11 + 0x11a => { Name => 'WB_GLevel4800K', Writable => 'int16u' }, #11 + 0x11b => { Name => 'WB_GLevel5300K', Writable => 'int16u' }, #11 + 0x11c => { Name => 'WB_GLevel6000K', Writable => 'int16u' }, #11 + 0x11d => { Name => 'WB_GLevel6600K', Writable => 'int16u' }, #11 + 0x11e => { Name => 'WB_GLevel7500K', Writable => 'int16u' }, #11 + 0x11f => { Name => 'WB_GLevel', Writable => 'int16u' }, #11 + # 0x121 = WB preset for flash (about 6000K) (ref IB) + # 0x125 = WB preset for underwater (ref IB) + 0x200 => { #6 + Name => 'ColorMatrix', + Writable => 'int16u', + Format => 'int16s', + Count => 9, + }, + # color matrices (ref 11): + # 0x0201-0x020d are sRGB color matrices + # 0x020e-0x021a are Adobe RGB color matrices + # 0x021b-0x0227 are ProPhoto RGB color matrices + # 0x0228 and 0x0229 are ColorMatrix for E-330 + # 0x0250-0x0252 are sRGB color matrices + # 0x0253-0x0255 are Adobe RGB color matrices + # 0x0256-0x0258 are ProPhoto RGB color matrices + 0x300 => { Name => 'Enhancer', Writable => 'int16u' }, #11 + 0x301 => { Name => 'EnhancerValues', Writable => 'int16u', Count => 7 }, #11 + 0x310 => { Name => 'CoringFilter', Writable => 'int16u' }, #11 + 0x311 => { Name => 'CoringValues', Writable => 'int16u', Count => 7 }, #11 + 0x600 => { Name => 'BlackLevel2', Writable => 'int16u', Count => 4 }, #11 + 0x610 => { Name => 'GainBase', Writable => 'int16u' }, #11 + 0x611 => { Name => 'ValidBits', Writable => 'int16u', Count => 2 }, #4/6 + 0x612 => { Name => 'CropLeft', Writable => 'int16u', Count => 2 }, #11 + 0x613 => { Name => 'CropTop', Writable => 'int16u', Count => 2 }, #11 + 0x614 => { Name => 'CropWidth', Writable => 'int32u' }, #PH/11 + 0x615 => { Name => 'CropHeight', Writable => 'int32u' }, #PH/11 + 0x635 => { #PH (data starts with "CMIO\x01\0") + Name => 'UnknownBlock1', + Writable => 'undef', + Notes => 'large unknown data block in ORF images but not JPG images', + # 'Drop' because too large for APP1 in JPEG images + Flags => [ 'Unknown', 'Binary', 'Drop' ], + }, + 0x636 => { #PH (data starts with "CMIO\x01\0") + Name => 'UnknownBlock2', + Writable => 'undef', + Notes => 'large unknown data block in ORF images but not JPG images', + # 'Drop' because too large for APP1 in JPEG images + Flags => [ 'Unknown', 'Binary', 'Drop' ], + }, + # 0x800 LensDistortionParams, float[9] (ref 11) + # 0x801 LensShadingParams, int16u[16] (ref 11) + 0x0805 => { #IB + Name => 'SensorCalibration', + Notes => '2 numbers: 1. Recommended maximum, 2. Calibration midpoint', + Writable => 'int16s', + Count => 2, + }, + # 0x1010-0x1012 are the processing options used in camera or in + # Olympus software, which 0x050a-0x050c are in-camera only (ref 6) + 0x1010 => { #PH/4 + Name => 'NoiseReduction2', + Writable => 'int16u', + PrintConv => { + 0 => '(none)', + BITMASK => { + 0 => 'Noise Reduction', + 1 => 'Noise Filter', + 2 => 'Noise Filter (ISO Boost)', + }, + }, + }, + 0x1011 => { #6 + Name => 'DistortionCorrection2', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x1012 => { #PH/4 + Name => 'ShadingCompensation2', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x101c => { #11 + Name => 'MultipleExposureMode', + Writable => 'int16u', + Count => 2, + PrintConv => [{ + 0 => 'Off', + 1 => 'Live Composite', #github issue#61 + 2 => 'On (2 frames)', + 3 => 'On (3 frames)', + }], + }, + 0x1103 => { #PH + Name => 'UnknownBlock3', + Writable => 'undef', + Notes => 'large unknown data block in ORF images but not JPG images', + # 'Drop' because too large for APP1 in JPEG images + Flags => [ 'Unknown', 'Binary', 'Drop' ], + }, + 0x1104 => { #PH (overlaps data for 0x1103 in E-M5 ORF images) + Name => 'UnknownBlock4', + Writable => 'undef', + Notes => 'large unknown data block in ORF images but not JPG images', + # 'Drop' because too large for APP1 in JPEG images + Flags => [ 'Unknown', 'Binary', 'Drop' ], + }, + 0x1112 => { #11 + Name => 'AspectRatio', + Writable => 'int8u', + Count => 2, + PrintConv => { + # '0 0' - have seen this with a 16:9 XZ-1 image - PH + '1 1' => '4:3', + '1 4' => '1:1', #PH (E-P5 Storyboard effect, does this indicate 4:3 converted to 6:6?) + '2 1' => '3:2 (RAW)', #forum6285 + '2 2' => '3:2', + '3 1' => '16:9 (RAW)', #forum6285 + '3 3' => '16:9', + '4 1' => '1:1 (RAW)', #forum6285 + '4 4' => '6:6', + '5 5' => '5:4', + '6 6' => '7:6', + '7 7' => '6:5', + '8 8' => '7:5', + '9 1' => '3:4 (RAW)', #forum6285 + '9 9' => '3:4', + }, + }, + 0x1113 => { Name => 'AspectFrame', Writable => 'int16u', Count => 4 }, #11 + 0x1200 => { #11/PH + Name => 'FacesDetected', + Writable => 'int32u', + Count => -1, + Notes => '2 or 3 values', + }, + 0x1201 => { #11/PH + Name => 'FaceDetectArea', + Writable => 'int16s', + Count => -1, # (varies with model) + Binary => 1, # (too long) + Notes => q{ + for models with 2 values in FacesDetected this gives X/Y coordinates in the + FaceDetectFrame for all 4 corners of the face rectangle. For models with 3 + values in FacesDetected this gives X/Y coordinates, size and rotation angle + of the face detect square + }, + }, + 0x1202 => { Name => 'MaxFaces', Writable => 'int32u', Count => 3 }, #PH + 0x1203 => { #PH + Name => 'FaceDetectFrameSize', + Writable => 'int16u', + Count => 6, + Notes => 'width/height of the full face detect frame', + }, + 0x1207 => { #PH + Name => 'FaceDetectFrameCrop', + Writable => 'int16s', + Count => 12, + Notes => 'X/Y offset and width/height of the cropped face detect frame', + }, + 0x1306 => { #PH (NC, E-M1) + Name => 'CameraTemperature', + Writable => 'int16u', + Format => 'int16s', #(NC) + ValueConv => '$val ? $val : undef', # zero for some models (how to differentiate from 0 C?) + Notes => 'this seems to be in degrees C only for some models', + }, + 0x1900 => { #23 + Name => 'KeystoneCompensation', + Writable => 'int8u', + Count => 2, + PrintConv => { + '0 0' => 'Off', + '0 1' => 'On', + }, + }, + 0x1901 => { #23 + Name => 'KeystoneDirection', + Writable => 'int8u', + Count => 2, + PrintConv => { + 0 => 'Vertical', + 1 => 'Horizontal', + }, + }, + # 0x1905 - focal length (PH, E-M1) + 0x1906 => { #23 + Name => 'KeystoneValue', + Writable => 'int16s', + Count => 3, + # (use in conjunction with KeystoneDirection, -ve is Top or Right, +ve is Bottom or Left) + Notes => '3 numbers: 1. Keystone Value, 2. Min, 3. Max', + }, +); + +# Olympus Focus Info IFD +%Image::ExifTool::Olympus::FocusInfo = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x000 => { #PH + Name => 'FocusInfoVersion', + Writable => 'undef', + RawConv => '$val=~s/\0+$//; $val', # (may be null terminated) + Count => 4, + }, + 0x209 => { #PH/4 + Name => 'AutoFocus', + Writable => 'int16u', + PrintConv => \%offOn, + Unknown => 1, #6 + }, + 0x210 => { Name => 'SceneDetect', Writable => 'int16u' }, #11 + 0x211 => { #11 + Name => 'SceneArea', + Writable => 'int32u', + Count => 8, + Unknown => 1, # (numbers don't make much sense?) + }, + 0x212 => { #11 + Name => 'SceneDetectData', + Writable => 'int32u', + Count => 720, + Binary => 1, + Unknown => 1, # (but what does it mean?) + }, + # 0x214 - int16u: normally 0, but 1 for E-M1 focus-bracketing, and have seen 1 and 256 at other times + 0x300 => { Name => 'ZoomStepCount', Writable => 'int16u' }, #6 + 0x301 => { Name => 'FocusStepCount', Writable => 'int16u' }, #11 + 0x303 => { Name => 'FocusStepInfinity', Writable => 'int16u' }, #11 + 0x304 => { Name => 'FocusStepNear', Writable => 'int16u' }, #11 + 0x305 => { #4 + Name => 'FocusDistance', + Writable => 'rational64u', + # this rational value looks like it is in mm when the denominator is + # 1 (E-1), and cm when denominator is 10 (E-300), so if we ignore the + # denominator we are consistently in mm - PH + Format => 'int32u', + Count => 2, + ValueConv => q{ + my ($a,$b) = split ' ',$val; + return 0 if $a == 0xffffffff; + return $a / 1000; + }, + ValueConvInv => q{ + return '4294967295 1' unless $val; + $val = int($val * 1000 + 0.5); + return "$val 1"; + }, + PrintConv => '$val ? "$val m" : "inf"', + PrintConvInv => '$val eq "inf" ? 0 : $val=~s/\s*m$//, $val', + }, + 0x308 => [ # NEED A BETTER WAY TO DETERMINE WHICH MODELS USE WHICH ENCODING! + { + Name => 'AFPoint', + Condition => '$$self{Model} =~ /E-(3|5|30)\b/', + Writable => 'int16u', + PrintHex => 1, + # decoded by ref 6 + Notes => q{ + for the E-3, E-5 and E-30 the value is separated into 2 parts: low 5 bits + give AF point, upper bits give AF target selection mode + }, + ValueConv => '($val & 0x1f) . " " . ($val & 0xffe0)', + ValueConvInv => 'my @v=split(" ",$val); @v == 2 ? $v[0] + $v[1] : $val', + PrintConvColumns => 2, + PrintConv => [ + { + 0x00 => '(none)', + 0x01 => 'Top-left (horizontal)', + 0x02 => 'Top-center (horizontal)', + 0x03 => 'Top-right (horizontal)', + 0x04 => 'Left (horizontal)', + 0x05 => 'Mid-left (horizontal)', + 0x06 => 'Center (horizontal)', + 0x07 => 'Mid-right (horizontal)', + 0x08 => 'Right (horizontal)', + 0x09 => 'Bottom-left (horizontal)', + 0x0a => 'Bottom-center (horizontal)', + 0x0b => 'Bottom-right (horizontal)', + 0x0c => 'Top-left (vertical)', + 0x0d => 'Top-center (vertical)', + 0x0e => 'Top-right (vertical)', + 0x0f => 'Left (vertical)', + 0x10 => 'Mid-left (vertical)', + 0x11 => 'Center (vertical)', + 0x12 => 'Mid-right (vertical)', + 0x13 => 'Right (vertical)', + 0x14 => 'Bottom-left (vertical)', + 0x15 => 'Bottom-center (vertical)', + 0x16 => 'Bottom-right (vertical)', + 0x1f => 'n/a', #PH (NC, E-3) + }, + { + 0x00 => 'Single Target', + 0x40 => 'All Target', + 0x80 => 'Dynamic Single Target', + 0xe0 => 'n/a', #PH (NC, E-3) + } + ], + },{ #PH (models with 7-point AF) + Name => 'AFPoint', + Condition => '$$self{Model} =~ /E-(520|600|620)\b/', + Notes => 'models with 7-point AF', + Writable => 'int16u', + PrintHex => 1, + ValueConv => '($val & 0x1f) . " " . ($val & 0xffe0)', + ValueConvInv => 'my @v=split(" ",$val); @v == 2 ? $v[0] + $v[1] : $val', + PrintConv => [ + { + 0x00 => '(none)', + 0x01 => 'Center', + # need to fill this in... + }, + { + 0x00 => 'Single Target', + 0x40 => 'All Target', # (guess) + }, + ] + },{ #11 + Name => 'AFPoint', + Writable => 'int16u', + Notes => 'other models', + RawConv => '($val or $$self{Model} ne "E-P1") ? $val : undef', + PrintConv => { + # (E-P1 always writes 0, maybe other models do too - PH) + 0 => 'Left (or n/a)', + 1 => 'Center (horizontal)', #6 (E-510) + 2 => 'Right', + 3 => 'Center (vertical)', #6 (E-510) + 255 => 'None', + }, + } + ], + # 0x31a Continuous AF parameters? + 0x328 => { #PH + Name => 'AFInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::AFInfo' }, + }, + # 0x1200-0x1209 Flash information: + 0x1201 => { #6 + Name => 'ExternalFlash', + Writable => 'int16u', + Count => 2, + PrintConv => { + '0 0' => 'Off', + '1 0' => 'On', + }, + }, + 0x1203 => { #11 + Name => 'ExternalFlashGuideNumber', + Writable => 'rational64s', + Unknown => 1, # (needs verification) + }, + 0x1204 => { #11(reversed)/7 + Name => 'ExternalFlashBounce', + Writable => 'int16u', + PrintConv => { + 0 => 'Bounce or Off', + 1 => 'Direct', + }, + }, + 0x1205 => { Name => 'ExternalFlashZoom', Writable => 'rational64u' }, #11 (ref converts to mm using table) + 0x1208 => { #6 + Name => 'InternalFlash', + Writable => 'int16u', + Count => -1, + PrintConv => { + '0' => 'Off', + '1' => 'On', + '0 0' => 'Off', + '1 0' => 'On', + }, + }, + 0x1209 => { #6 + Name => 'ManualFlash', + Writable => 'int16u', + Count => 2, + Notes => '2 numbers: 1. 0=Off, 1=On, 2. Flash strength', + PrintConv => q{ + my ($a,$b) = split ' ',$val; + return 'Off' unless $a; + $b = ($b == 1) ? 'Full' : "1/$b"; + return "On ($b strength)"; + }, + }, + 0x120a => { #PH + Name => 'MacroLED', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x1500 => [{ #6 + Name => 'SensorTemperature', + # (Stylus 1 stores values like "34 0 0") + Condition => '$$self{Model} =~ /E-(1|M5)\b/ || $count != 1', + Writable => 'int16s', + PrintConv => '$val=~s/ 0 0$//; "$val C"', + PrintConvInv => '$val=~s/ ?C$//; $val', + },{ + Name => 'SensorTemperature', + Writable => 'int16s', + RawConv => '($val and $val ne "-32768") ? $val : undef', # ignore 0 and -32768 + # ValueConv => '-2*(($val/135)**2)+55', #11 + ValueConv => '84 - 3 * $val / 26', #https://exiftool.org/forum/index.php/topic,5423.0.html + ValueConvInv => 'int((84 - $val) * 26 / 3 + 0.5)', + PrintConv => 'sprintf("%.1f C",$val)', + PrintConvInv => '$val=~s/ ?C$//; $val', + # data from test shots by Eric Sibert: + # E-510 E-620 + # Raw Ambient Raw Ambient + # --- ------- --- ------- + # 534 22.7 518 22.7 + # 550 20.6 531 19.3 + # 552 20.8 533 17.9 + # 558 19.3 582 17.2 + # 564 19.1 621 12.3 + # 567 17.8 634 9.7 + # 576 18.6 650 8.0 + # 582 17.2 660 7.7 + # 599 13.8 703 3.3 + # 631 10.7 880 -20.6 + # 642 12.4 880 -20.6 + # 652 9.6 892 -24.4 + # 692 5.2 892 -22.7 + # 714 3.3 + # 895 -19.8 + # 895 -19.2 + # 900 -21.7 + }], + 0x1600 => { # ref http://fourthirdsphoto.com/vbb/showpost.php?p=107607&postcount=15 + Name => 'ImageStabilization', + # (the other value is more reliable, so ignore this totally if the other exists) + Condition => 'not defined $$self{ImageStabilization}', + Writable => 'undef', + # if the first 4 bytes are non-zero, then bit 0x01 of byte 44 + # gives the stabilization mode + PrintConv => q{ + $val =~ /^\0{4}/ ? 'Off' : 'On, ' . + (unpack('x44C',$val) & 0x01 ? 'Mode 1' : 'Mode 2') + }, + }, + # 0x102a same as Subdir4-0x300 +); + +# AF information (ref PH) +%Image::ExifTool::Olympus::AFInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + # 0x2a - int8u: ImagerAFMode? 0=Manual, 1=Auto + # 0x30 - int16u: AFAreaXPosition? + # 0x32 - int16u: AFAreaWidth? (202) + # 0x34 - int16u: AFAreaYPosition? + # 0x36 - int16u: AFAreaHeight? (50) + # (AF area positions above give the top-left coordinates of the AF area in the + # AF frame. Increasing Y is downwards, and the AF frame size is about 1280x256) +); + +# Olympus raw information tags (ref 6) +%Image::ExifTool::Olympus::RawInfo = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + NOTES => 'These tags are found only in ORF images of some models (eg. C8080WZ).', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x000 => { + Name => 'RawInfoVersion', + Writable => 'undef', + RawConv => '$val=~s/\0+$//; $val', # (may be null terminated) + Count => 4, + }, + 0x100 => { Name => 'WB_RBLevelsUsed', Writable => 'int16u', Count => 2 }, + 0x110 => { Name => 'WB_RBLevelsAuto', Writable => 'int16u', Count => 2 }, + 0x120 => { Name => 'WB_RBLevelsShade', Writable => 'int16u', Count => 2 }, + 0x121 => { Name => 'WB_RBLevelsCloudy', Writable => 'int16u', Count => 2 }, + 0x122 => { Name => 'WB_RBLevelsFineWeather', Writable => 'int16u', Count => 2 }, + 0x123 => { Name => 'WB_RBLevelsTungsten', Writable => 'int16u', Count => 2 }, + 0x124 => { Name => 'WB_RBLevelsEveningSunlight',Writable => 'int16u', Count => 2 }, + 0x130 => { Name => 'WB_RBLevelsDaylightFluor', Writable => 'int16u', Count => 2 }, + 0x131 => { Name => 'WB_RBLevelsDayWhiteFluor', Writable => 'int16u', Count => 2 }, + 0x132 => { Name => 'WB_RBLevelsCoolWhiteFluor', Writable => 'int16u', Count => 2 }, + 0x133 => { Name => 'WB_RBLevelsWhiteFluorescent',Writable => 'int16u', Count => 2 }, + 0x200 => { + Name => 'ColorMatrix2', + Format => 'int16s', + Writable => 'int16u', + Count => 9, + }, + # 0x240 => 'ColorMatrixDefault', ? + # 0x250 => 'ColorMatrixSaturation', ? + # 0x251 => 'ColorMatrixHue', ? + # 0x252 => 'ColorMatrixContrast', ? + # 0x300 => sharpness-related + # 0x301 => list of sharpness-related values + 0x310 => { Name => 'CoringFilter', Writable => 'int16u' }, + 0x311 => { Name => 'CoringValues', Writable => 'int16u', Count => 11 }, + 0x600 => { Name => 'BlackLevel2', Writable => 'int16u', Count => 4 }, + 0x601 => { + Name => 'YCbCrCoefficients', + Notes => 'stored as int16u[6], but extracted as rational32u[3]', + Format => 'rational32u', + }, + 0x611 => { Name => 'ValidPixelDepth', Writable => 'int16u', Count => 2 }, + 0x612 => { Name => 'CropLeft', Writable => 'int16u' }, #11 + 0x613 => { Name => 'CropTop', Writable => 'int16u' }, #11 + 0x614 => { Name => 'CropWidth', Writable => 'int32u' }, + 0x615 => { Name => 'CropHeight', Writable => 'int32u' }, + 0x1000 => { + Name => 'LightSource', + Writable => 'int16u', + PrintConv => { + 0 => 'Unknown', + 16 => 'Shade', + 17 => 'Cloudy', + 18 => 'Fine Weather', + 20 => 'Tungsten (Incandescent)', + 22 => 'Evening Sunlight', + 33 => 'Daylight Fluorescent', + 34 => 'Day White Fluorescent', + 35 => 'Cool White Fluorescent', + 36 => 'White Fluorescent', + 256 => 'One Touch White Balance', + 512 => 'Custom 1-4', + }, + }, + # the following 5 tags all have 3 values: val, min, max + 0x1001 => { Name => 'WhiteBalanceComp', Writable => 'int16s', Count => 3 }, + 0x1010 => { Name => 'SaturationSetting', Writable => 'int16s', Count => 3 }, + 0x1011 => { Name => 'HueSetting', Writable => 'int16s', Count => 3 }, + 0x1012 => { Name => 'ContrastSetting', Writable => 'int16s', Count => 3 }, + 0x1013 => { Name => 'SharpnessSetting', Writable => 'int16s', Count => 3 }, + # settings written by Camedia Master 4.x + 0x2000 => { Name => 'CMExposureCompensation', Writable => 'rational64s' }, + 0x2001 => { Name => 'CMWhiteBalance', Writable => 'int16u' }, + 0x2002 => { Name => 'CMWhiteBalanceComp', Writable => 'int16s' }, + 0x2010 => { Name => 'CMWhiteBalanceGrayPoint', Writable => 'int16u', Count => 3 }, + 0x2020 => { Name => 'CMSaturation', Writable => 'int16s', Count => 3 }, + 0x2021 => { Name => 'CMHue', Writable => 'int16s', Count => 3 }, + 0x2022 => { Name => 'CMContrast', Writable => 'int16s', Count => 3 }, + 0x2023 => { Name => 'CMSharpness', Writable => 'int16s', Count => 3 }, +); + +# Olympus unknown information tags +%Image::ExifTool::Olympus::UnknownInfo = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, +); + +# Tags found only in some FE models +%Image::ExifTool::Olympus::FETags = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + Some FE models write a large number of tags here, but most of this + information remains unknown. + }, + 0x0100 => { + Name => 'BodyFirmwareVersion', + Writable => 'string', + }, +); + +# tags in Olympus QuickTime videos (ref PH) +# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos) +%Image::ExifTool::Olympus::MOV1 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => q{ + This information is found in MOV videos from Olympus models such as the + D540Z, D595Z, FE100, FE110, FE115, FE170 and FE200. + }, + 0x00 => { + Name => 'Make', + Format => 'string[24]', + }, + 0x18 => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[8]', + SeparateTable => 'CameraType', + PrintConv => \%olympusCameraTypes, + }, + # (01 00 at offset 0x20) + 0x26 => { + Name => 'ExposureUnknown', + Unknown => 1, + Format => 'int32u', + # this conversion doesn't work for all models (eg. gives "1/100000") + ValueConv => '$val ? 10 / $val : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x2a => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + }, + 0x32 => { #(NC) + Name => 'ExposureCompensation', + Format => 'rational64s', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + # 0x44 => WhiteBalance ? + 0x48 => { + Name => 'FocalLength', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f mm",$val)', + }, + # 0xb1 => 'ISO', #(I don't think this works - PH) +); + +# tags in Olympus QuickTime videos (ref PH) +# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos) +%Image::ExifTool::Olympus::MOV2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => q{ + This information is found in MOV videos from Olympus models such as the + FE120, FE140 and FE190. + }, + 0x00 => { + Name => 'Make', + Format => 'string[24]', + }, + 0x18 => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[24]', + Notes => 'the actual model name, no decoding necessary', + }, + # (01 00 at offset 0x30) + 0x36 => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val ? 10 / $val : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x3a => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + }, + 0x42 => { #(NC) + Name => 'ExposureCompensation', + Format => 'rational64s', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + 0x58 => { + Name => 'FocalLength', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f mm",$val)', + }, + 0xc1 => { + Name => 'ISO', + Format => 'int16u', + }, +); + +# tags in Olympus MP4 videos (ref PH) +%Image::ExifTool::Olympus::MP4 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => q{ + This information is found in MP4 videos from Olympus models such as the + u7040 and u9010. + }, + 0x00 => { + Name => 'Make', + Format => 'string[24]', + }, + 0x18 => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[24]', + Notes => 'oddly different than CameraType values in JPEG images by the same camera', + PrintConv => { + SG472 => 'u7040,S7040', + SG473 => 'u9010,S9010', + SG475 => 'SP800UZ', + SG551 => 'SZ-30MR', + SG553 => 'SP-610UZ', + SG554 => 'SZ-10', + SG555 => 'SZ-20', + SG573 => 'SZ-14', + SG575 => 'SP-620UZ', + }, + }, + 0x28 => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + }, + 0x30 => { #(NC) + Name => 'ExposureCompensation', + Format => 'rational64s', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + # 0x38 - int32u: 3 + # 0x3c - int32u: 1 + # 0x40 - int16u: 5 + # 0x42 - int16u: 0,4,9 + # 0x64 - int32u: 0,6000,12000 + # 0x48 - int32u: 100 (ISO?) + 0x68 => { + Name => 'MovableInfo', + Condition => '$$valPt =~ /^DIGI/', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::MovableInfo' }, + }, + 0x72 => { + Name => 'MovableInfo', + Condition => '$$valPt =~ /^DIGI/', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::MovableInfo' }, + }, +); + +# yet a different QuickTime TAGS format (PH, E-M5) +%Image::ExifTool::Olympus::MOV3 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'QuickTime information found in the TAGS atom of MOV videos from the E-M5.', + OLYM => { + Name => 'OlympusAtom', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::OLYM2' }, + }, +); + +# yet a different QuickTime OLYM atom format (PH, E-M5) +%Image::ExifTool::Olympus::OLYM2 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + prms => { + Name => 'MakerNotes', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::prms' }, + }, + thmb =>{ + Name => 'ThumbInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::thmb2' }, + }, + scrn =>{ + Name => 'PreviewInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::scrn2' }, + }, +); + +# the "prms" atom in E-M5 MOV videos (PH, E-M5) +%Image::ExifTool::Olympus::prms = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => q{ + Information extracted from the "prms" atom in MOV videos from Olympus models + such as the OM E-M5. + }, + 0x12 => { + Name => 'Make', + Format => 'string[24]', + }, + 0x2c => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[24]', + SeparateTable => 'CameraType', + PrintConv => \%olympusCameraTypes, + }, + 0x83 => { + Name => 'DateTime1', + Format => 'string[24]', + Groups => { 2 => 'Time' }, + }, + 0x9d => { + Name => 'DateTime2', + Format => 'string[24]', + Groups => { 2 => 'Time' }, + }, + 0x17f => { + Name => 'LensModel', + Format => 'string[32]' + }, +); + +# yet a different "thmb" atom format (PH, E-M5) +%Image::ExifTool::Olympus::thmb2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'ThumbnailWidth', + Format => 'int16u', + }, + 2 => { + Name => 'ThumbnailHeight', + Format => 'int16u', + }, + 4 => { + Name => 'ThumbnailLength', + Format => 'int32u', + }, + 8 => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Format => 'undef[$val{4}]', + Notes => '160x120 JPEG thumbnail image', + RawConv => '$self->ValidateImage(\$val,$tag)', + }, +); + +# yet a different "scrn" atom format (PH, E-M5) +%Image::ExifTool::Olympus::scrn2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # 0 => int16u: 1 - number of preview images? + 2 => { + Name => 'OlympusPreview', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::scrn' }, + }, +); + +# movable information found in MP4 videos +%Image::ExifTool::Olympus::MovableInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + 0x04 => { #(NC) + Name => 'ISO', + Format => 'int32u', + }, + 0x2c => { + Name => 'EncoderVersion', + Format => 'string[16]', + }, + 0x3c => { + Name => 'DecoderVersion', + Format => 'string[16]', + }, + 0x83 => { + Name => 'Thumbnail', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::Thumbnail', + Base => '$start', # (use a separate table because of this) + }, + }, +); + +# thumbnail image information found in MP4 videos (similar in Olympus,Samsung,Sanyo) (ref PH) +%Image::ExifTool::Olympus::Thumbnail = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + FORMAT => 'int32u', + 1 => 'ThumbnailWidth', + 2 => 'ThumbnailHeight', + 3 => 'ThumbnailLength', + 4 => { Name => 'ThumbnailOffset', IsOffset => 1 }, +); + +# thumbnail information found in 'thmb' atom of MP4 videos from the TG-810 (ref PH) +%Image::ExifTool::Olympus::thmb = ( + NOTES => 'Information extracted from the "thmb" atom of Olympus MP4 videos.', + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'ThumbnailLength', + Format => 'int32u', + }, + 4 => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Format => 'undef[$val{0}]', + Notes => '160x120 JPEG thumbnail image', + RawConv => '$self->ValidateImage(\$val,$tag)', + }, +); + +# thumbnail information found in 'scrn' atom of MP4 videos from the TG-810 (ref PH) +%Image::ExifTool::Olympus::scrn = ( + NOTES => 'Information extracted from the "scrn" atom of Olympus MP4 videos.', + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'PreviewImageLength', + Format => 'int32u', + }, + 4 => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Format => 'undef[$val{0}]', + Notes => '640x480 JPEG preview image', + RawConv => '$self->ValidateImage(\$val,$tag)', + }, +); + +# information in OLYM atom of MP4 videos from the TG-810 (ref PH) +%Image::ExifTool::Olympus::OLYM = ( + NOTES => 'Tags found in the OLYM atom of MP4 videos from the TG-810.', + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x0e => { + Name => 'Make', + Format => 'string[26]', + }, + 0x28 => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[24]', + SeparateTable => 'CameraType', + PrintConv => \%olympusCameraTypes, + }, + 0x5a => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + }, + 0x7f => { + Name => 'DateTimeOriginal', #(NC) + Description => 'Date/Time Original', + Format => 'string[24]', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x99 => { + Name => 'DateTime2', + Format => 'string[24]', + Groups => { 2 => 'Time' }, + }, + 0x109 => { + Name => 'ThumbnailWidth', + Format => 'int16u', + }, + 0x10b => { + Name => 'ThumbnailHeight', + Format => 'int16u', + }, +); + +# tags in Olympus AVI videos (ref PH) +# (very similar to Pentax::Junk2 tags) +%Image::ExifTool::Olympus::AVI = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => 'This information is found in Olympus AVI videos.', + 0x12 => { + Name => 'Make', + Format => 'string[24]', + }, + 0x2c => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[24]', + SeparateTable => 'CameraType', + PrintConv => \%olympusCameraTypes, + }, + 0x5e => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + }, + 0x83 => { + Name => 'DateTime1', + Format => 'string[24]', + Groups => { 2 => 'Time' }, + }, + 0x9d => { + Name => 'DateTime2', + Format => 'string[24]', + Groups => { 2 => 'Time' }, + }, + 0x129 => { + Name => 'ThumbInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::thmb2' }, + }, +); + +# tags in WAV files from Olympus PCM linear recorders (ref 18) +%Image::ExifTool::Olympus::WAV = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Audio' }, + FIRST_ENTRY => 0, + NOTES => q{ + This information is found in WAV files from Olympus PCM linear recorders + like the LS-5, LS-10, LS-11. + }, + 0x0c => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[16]', + }, + 0x1c => { + Name => 'FileNumber', + Format => 'int32u', + PrintConv => 'sprintf("%.4d", $val)', + }, + 0x26 => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Format => 'undef[12]', + Notes => 'time at start of recording', + ValueConv => q{ + return undef unless $val =~ /^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/; + my $y = $1 < 70 ? "20$1" : "19$1"; + return "$y:$2:$3 $4:$5:$6"; + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x32 => { + Name => 'DateTimeEnd', + Groups => { 2 => 'Time' }, + Format => 'undef[12]', + Notes => 'time at end of recording', + ValueConv => q{ + return undef unless $val =~ /^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/; + my $y = $1 < 70 ? "20$1" : "19$1"; + return "$y:$2:$3 $4:$5:$6"; + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x3e => { + Name => 'RecordingTime', + Format => 'undef[6]', + ValueConv => '$val =~ s/^(\d{2})(\d{2})/$1:$2:/; $val', + }, + 0x200 => { + Name => 'Duration', + Format => 'int32u', + ValueConv => '$val / 1000', + PrintConv => 'ConvertDuration($val)', + }, + 0x20a => { Name => 'Index01', %indexInfo }, + 0x214 => { Name => 'Index02', %indexInfo }, + 0x21e => { Name => 'Index03', %indexInfo }, + 0x228 => { Name => 'Index04', %indexInfo }, + 0x232 => { Name => 'Index05', %indexInfo }, + 0x23c => { Name => 'Index06', %indexInfo }, + 0x246 => { Name => 'Index07', %indexInfo }, + 0x250 => { Name => 'Index08', %indexInfo }, + 0x25a => { Name => 'Index09', %indexInfo }, + 0x264 => { Name => 'Index10', %indexInfo }, + 0x26e => { Name => 'Index11', %indexInfo }, + 0x278 => { Name => 'Index12', %indexInfo }, + 0x282 => { Name => 'Index13', %indexInfo }, + 0x28c => { Name => 'Index14', %indexInfo }, + 0x296 => { Name => 'Index15', %indexInfo }, + 0x2a0 => { Name => 'Index16', %indexInfo }, +); + +# DSS information written by Olympus voice recorders (ref PH) +%Image::ExifTool::Olympus::DSS = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Audio' }, + FIRST_ENTRY => 0, + NOTES => q{ + Information extracted from DSS/DS2 files and the ID3 XOLY frame of MP3 files + written by some Olympus voice recorders. + }, + # 0 - file format: + # "\x02dss"(DSS file and XOLY frame in MP3 file) + # "\x03ds2"(DS2 file) + # "\x03mp3"(ID3 XOLY frame in MP3 file) + 12 => { Name => 'Model', Format => 'string[16]' }, # (name truncated by some models) + 38 => { + Name => 'StartTime', + Format => 'string[12]', + Groups => { 2 => 'Time' }, + ValueConv => '$val =~ s/(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/20$1:$2:$3 $4:$5:$6/; $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + 50 => { + Name => 'EndTime', + Format => 'string[12]', + Groups => { 2 => 'Time' }, + ValueConv => '$val =~ s/(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/20$1:$2:$3 $4:$5:$6/; $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + 62 => { + Name => 'Duration', + Format => 'string[6]', + ValueConv => '$val =~ /(\d{2})(\d{2})(\d{2})/ ? ($1 * 60 + $2) * 60 + $3 : undef', + PrintConv => 'ConvertDuration($val)', + }, + 798 => { # (ref http://search.cpan.org/~rgibson/Audio-DSS-0.02/) + Name => 'Comment', + Format => 'string[100]', + }, +); + +# Olympus composite tags +%Image::ExifTool::Olympus::Composite = ( + GROUPS => { 2 => 'Camera' }, + ExtenderStatus => { + Notes => q{ + Olympus cameras have the quirk that they may retain the extender settings + after the extender is removed until the camera is powered off. This tag is + an attempt to represent the actual status of the extender. + }, + Require => { + 0 => 'Olympus:Extender', + 1 => 'Olympus:LensType', + 2 => 'MaxApertureValue', + }, + ValueConv => 'Image::ExifTool::Olympus::ExtenderStatus($val[0],$prt[1],$val[2])', + PrintConv => { + 0 => 'Not attached', + 1 => 'Attached', + 2 => 'Removed', + }, + }, + ZoomedPreviewImage => { + Groups => { 2 => 'Preview' }, + Require => { + 0 => 'ZoomedPreviewStart', + 1 => 'ZoomedPreviewLength', + }, + RawConv => q{ + @grps = $self->GetGroup($$val{0}); # set groups from input tag + Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"ZoomedPreviewImage"); + }, + }, + # this is actually for PanasonicRaw tags, but it uses the lens lookup here + LensType => { + Require => { + 0 => 'LensTypeMake', + 1 => 'LensTypeModel', + }, + Notes => 'based on tags found in some Panasonic RW2 images', + SeparateTable => 'Olympus LensType', + ValueConv => '"$val[0] $val[1]"', + PrintConv => \%olympusLensTypes, + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::Olympus'); + + +#------------------------------------------------------------------------------ +# Determine if the extender (EX-25/EC-14) was really attached (ref 9) +# Inputs: 0) Extender, 1) LensType string, 2) MaxApertureAtMaxFocal +# Returns: 0=not attached, 1=attached, 2=could have been removed +# Notes: Olympus has a bug in the in-camera firmware which results in the +# extender information being cached and written into the EXIF data even after +# the extender has been removed. You must power cycle the camera to prevent it +# from writing the cached extender information into the EXIF data. +sub ExtenderStatus($$$) +{ + my ($extender, $lensType, $maxAperture) = @_; + my @info = split ' ', $extender; + # validate that extender identifier is reasonable + return 0 unless @info >= 2 and hex($info[1]); + # if it's not an EC-14 (id '0 04') then assume it was really attached + # (other extenders don't seem to affect the reported max aperture) + return 1 if "$info[0] $info[1]" ne '0 04'; + # get the maximum aperture for this lens (in $1) + $lensType =~ / F(\d+(\.\d+)?)/ or return 1; + # If the maximum aperture at the maximum focal length is greater than the + # known max/max aperture of the lens, then the extender must be attached + return(($maxAperture - $1 > 0.2) ? 1 : 2); +} + +#------------------------------------------------------------------------------ +# Print AF points +# Inputs: 0) AF point data (string of integers) +# Notes: I'm just guessing that the 2nd and 4th bytes are the Y coordinates, +# and that more AF points will show up in the future (derived from E-1 images, +# and the E-1 uses just one of 3 possible AF points, all centered in Y) - PH +sub PrintAFAreas($) +{ + my $val = shift; + my @points = split ' ', $val; + my %afPointNames = ( + 0x36794285 => 'Left', + 0x79798585 => 'Center', + 0xBD79C985 => 'Right', + ); + $val = ''; + my $pt; + foreach $pt (@points) { + next unless $pt; + $val and $val .= ', '; + $afPointNames{$pt} and $val .= $afPointNames{$pt} . ' '; + my @coords = unpack('C4',pack('N',$pt)); + $val .= "($coords[0],$coords[1])-($coords[2],$coords[3])"; + } + $val or $val = 'none'; + return $val; +} + +#------------------------------------------------------------------------------ +# Extract information from a DSS/DS2 voice recorder audio file or ID3 XOLY frame +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success +sub ProcessDSS($$;$) +{ + my ($et, $dirInfo) = @_; + + # allow this to be called with either RAF or DataPt + my $raf = $$dirInfo{RAF}; + if ($raf) { + my $buff; + $raf->Read($buff, 898) > 68 or return 0; + $buff =~ /^(\x02dss|\x03ds2)/ or return 0; + $dirInfo = { DataPt => \$buff }; + $et->SetFileType(uc substr $buff, 1, 3); + } + my $tagTablePtr = GetTagTable('Image::ExifTool::Olympus::DSS'); + return $et->ProcessBinaryData($dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Process ORF file +# Inputs: 0) ExifTool object reference, 1) directory information reference +# Returns: 1 if this looked like a valid ORF file, 0 otherwise +sub ProcessORF($$) +{ + my ($et, $dirInfo) = @_; + return $et->ProcessTIFF($dirInfo); +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Olympus - Olympus/Epson maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Olympus or Epson maker notes in EXIF information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html> + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/olympus_mn.html> + +=item L<http://olypedia.de/Olympus_Makernotes> + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Markku Hanninen, Remi Guyomarch, Frank Ledwon, Michael Meissner, +Mark Dapoz, Ioannis Panagiotopoulos and Tomasz Kawecki for their help +figuring out some Olympus tags, and Lilo Huang, Chris Shaw and Viktor +Lushnikov for adding to the LensType list. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Olympus Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/OpenEXR.pm b/lib/Image/ExifTool/OpenEXR.pm new file mode 100644 index 0000000..3971a13 --- /dev/null +++ b/lib/Image/ExifTool/OpenEXR.pm @@ -0,0 +1,326 @@ +#------------------------------------------------------------------------------ +# File: OpenEXR.pm +# +# Description: Read OpenEXR meta information +# +# Revisions: 2011/12/10 - P. Harvey Created +# +# References: 1) http://www.openexr.com/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::OpenEXR; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::GPS; + +$VERSION = '1.03'; + +# supported EXR value format types (other types are extracted as undef binary data) +my %formatType = ( + box2f => 'float[4]', + box2i => 'int32s[4]', + chlist => 1, + chromaticities => 'float[8]', + compression => 'int8u', + double => 'double', + envmap => 'int8u', + float => 'float', + 'int' => 'int32s', + keycode => 'int32s[7]', + lineOrder => 'int8u', + m33f => 'float[9]', + m44f => 'float[16]', + rational => 'rational64s', + string => 'string', # incorrect in specification! (no leading int) + stringvector => 1, + tiledesc => 1, + timecode => 'int32u[2]', + v2f => 'float[2]', + v2i => 'int32s[2]', + v3f => 'float[3]', + v3i => 'int32s[3]', +); + +# OpenEXR tags +%Image::ExifTool::OpenEXR::Main = ( + GROUPS => { 2 => 'Image' }, + NOTES => q{ + Information extracted from EXR images. See L<http://www.openexr.com/> for + the official specification. + }, + _ver => { Name => 'EXRVersion' }, + _lay => { + Name => 'Layout', + PrintHex => 1, + PrintConv => { 0 => 'Scan Lines', 0x200 => 'Tiles' }, + }, + adoptedNeutral => { }, + altitude => { + Name => 'GPSAltitude', + Groups => { 2 => 'Location' }, + PrintConv => q{ + $val = int($val * 10) / 10; + return(($val =~ s/^-// ? "$val m Below" : "$val m Above") . " Sea Level"); + }, + }, + aperture => { PrintConv => 'sprintf("%.1f",$val)' }, + channels => { }, + chromaticities => { }, + capDate => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + comments => { }, + compression => { + PrintConvColumns => 2, + PrintConv => { + 0 => 'None', + 1 => 'RLE', + 2 => 'ZIPS', + 3 => 'ZIP', + 4 => 'PIZ', + 5 => 'PXR24', + 6 => 'B44', + 7 => 'B44A', + }, + }, + dataWindow => { }, + displayWindow => { }, + envmap => { + Name => 'EnvironmentMap', + PrintConv => { + 0 => 'Latitude/Longitude', + 1 => 'Cube', + }, + }, + expTime => { + Name => 'ExposureTime', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + focus => { + Name => 'FocusDistance', + PrintConv => '"$val m"', + }, + framesPerSecond => { }, + keyCode => { }, + isoSpeed => { Name => 'ISO' }, + latitude => { + Name => 'GPSLatitude', + Groups => { 2 => 'Location' }, + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + lineOrder => { + PrintConv => { + 0 => 'Increasing Y', + 1 => 'Decreasing Y', + 2 => 'Random Y', + }, + }, + longitude => { + Name => 'GPSLongitude', + Groups => { 2 => 'Location' }, + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + lookModTransform => { }, + multiView => { }, + owner => { Groups => { 2 => 'Author' } }, + pixelAspectRatio => { }, + preview => { }, + renderingTransform => { }, + screenWindowCenter => { }, + screenWindowWidth => { }, + tiles => { }, + timeCode => { }, + utcOffset => { + Name => 'TimeZone', + Groups => { 2 => 'Time' }, + PrintConv => 'TimeZoneString($val / 60)', + }, + whiteLuminance => { }, + worldToCamera => { }, + worldToNDC => { }, + wrapmodes => { Name => 'WrapModes' }, + xDensity => { Name => 'XResolution' }, + # also observed: + # ilut +); + +#------------------------------------------------------------------------------ +# Extract information from an OpenEXR file +# Inputs: 0) ExifTool object reference, 1) DirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid OpenEXR file +sub ProcessEXR($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my $binary = $et->Options('Binary') || $verbose; + my ($buff, $dim); + + # verify this is a valid RIFF file + return 0 unless $raf->Read($buff, 8) == 8; + return 0 unless $buff =~ /^\x76\x2f\x31\x01/s; + $et->SetFileType(); + SetByteOrder('II'); + my $tagTablePtr = GetTagTable('Image::ExifTool::OpenEXR::Main'); + + # extract information from header + my $ver = unpack('x4V', $buff); + $et->HandleTag($tagTablePtr, '_ver', $ver & 0xff); + $et->HandleTag($tagTablePtr, '_lay', $ver & 0x200); + my $maxLen = ($ver & 0x400) ? 255 : 31; + + # extract attributes + for (;;) { + $raf->Read($buff, 68) or last; + last if $buff =~ /^\0/; + unless ($buff =~ /^([^\0]{1,$maxLen})\0([^\0]{1,$maxLen})\0(.{4})/sg) { + $et->Warn('EXR format error'); + last; + } + my ($tag, $type, $size) = ($1, $2, unpack('V', $3)); + unless ($raf->Seek(pos($buff) - length($buff), 1)) { + $et->Warn('Seek error'); + last; + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + unless ($tagInfo) { + my $name = ucfirst $tag; + $name =~ s/([^a-zA-Z])([a-z])/$1\U$2/g; # capitalize first letter of each word + $name =~ tr/-_a-zA-Z0-9//dc; + if (length $name <= 1) { + if (length $name) { + $name = "Tag$name"; + } else { + $name = 'Invalid'; + } + } + $tagInfo = { Name => $name }; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n"); + } + my ($val, $success); + my $format = $formatType{$type}; + if ($format or $binary) { + $raf->Read($buff, $size) == $size and $success = 1; + if (not $format) { + $val = \$buff; # treat as undef binary data + } elsif ($format ne '1') { + # handle formats which map nicely into ExifTool format codes + if ($format =~ /^(\w+)\[?(\d*)/) { + my ($fmt, $cnt) = ($1, $2); + $cnt = $fmt eq 'string' ? $size : 1 unless $cnt; + $val = ReadValue(\$buff, 0, $fmt, $cnt, $size); + } + # handle other format types + } elsif ($type eq 'tiledesc') { + if ($size >= 9) { + my $x = Get32u(\$buff, 0); + my $y = Get32u(\$buff, 4); + my $mode = Get8u(\$buff, 8); + my $lvl = { 0 => 'One Level', 1 => 'MIMAP Levels', 2 => 'RIPMAP Levels' }->{$mode & 0x0f}; + $lvl or $lvl = 'Unknown Levels (' . ($mode & 0xf) . ')'; + my $rnd = { 0 => 'Round Down', 1 => 'Round Up' }->{$mode >> 4}; + $rnd or $rnd = 'Unknown Rounding (' . ($mode >> 4) . ')'; + $val = "${x}x$y; $lvl; $rnd"; + } + } elsif ($type eq 'chlist') { + $val = [ ]; + while ($buff =~ /\G([^\0]{1,31})\0(.{16})/sg) { + my ($str, $dat) = ($1, $2); + my ($pix,$lin,$x,$y) = unpack('VCx3VV', $dat); + $pix = { 0 => 'int8u', 1 => 'half', 2 => 'float' }->{$pix} || "unknown($pix)"; + push @$val, "$str $pix" . ($lin ? ' linear' : '') . " $x $y"; + } + } elsif ($type eq 'stringvector') { + $val = [ ]; + my $pos = 0; + while ($pos + 4 <= length($buff)) { + my $len = Get32u(\$buff, $pos); + last if $pos + 4 + $len > length($buff); + push @$val, substr($buff, $pos + 4, $len); + $pos += 4 + $len; + } + } else { + $val = \$buff; # (shouldn't happen) + } + } else { + # avoid loading binary data + $val = \ "Binary data $size bytes"; + $success = $raf->Seek($size, 1); + } + unless ($success) { + $et->Warn('Truncated or corrupted EXR file'); + last; + } + $val = '<bad>' unless defined $val; + + # take image dimensions from dataWindow (with displayWindow as backup) + if (($tag eq 'dataWindow' or (not $dim and $tag eq 'displayWindow')) and + $val =~ /^(-?\d+) (-?\d+) (-?\d+) (-?\d+)$/) + { + $dim = [$3 - $1 + 1, $4 - $2 + 1]; + } + if ($verbose) { + my $dataPt = ref $val ? $val : \$val, + $et->VerboseInfo($tag, $tagInfo, + Table => $tagTablePtr, + Value => $val, + Size => $size, + Format => $type, + DataPt => \$buff, + Addr => $raf->Tell() - $size, + ); + } + $et->FoundTag($tagInfo, $val); + } + if ($dim) { + $et->FoundTag('ImageWidth', $$dim[0]); + $et->FoundTag('ImageHeight', $$dim[1]); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::OpenEXR - Read OpenEXR meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from OpenEXR images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.openexr.com/documentation.html> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/OpenEXR Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Opus.pm b/lib/Image/ExifTool/Opus.pm new file mode 100644 index 0000000..2c157e9 --- /dev/null +++ b/lib/Image/ExifTool/Opus.pm @@ -0,0 +1,98 @@ +#------------------------------------------------------------------------------ +# File: Opus.pm +# +# Description: Read Ogg Opus audio meta information +# +# Revisions: 2016/07/14 - P. Harvey Created +# +# References: 1) https://www.opus-codec.org/docs/ +# 2) https://wiki.xiph.org/OggOpus +# 3) https://tools.ietf.org/pdf/rfc7845.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::Opus; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.00'; + +# Opus metadata types +%Image::ExifTool::Opus::Main = ( + NOTES => q{ + Information extracted from Ogg Opus files. See + L<https://www.opus-codec.org/docs/> for the specification. + }, + 'OpusHead' => { + Name => 'Header', + SubDirectory => { TagTable => 'Image::ExifTool::Opus::Header' }, + }, + 'OpusTags' => { + Name => 'Comments', + SubDirectory => { TagTable => 'Image::ExifTool::Vorbis::Comments' }, + }, +); + +%Image::ExifTool::Opus::Header = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + 0 => 'OpusVersion', + 1 => 'AudioChannels', + # 2 => 'PreSkip' (int16u) + 4 => { + Name => 'SampleRate', + Format => 'int32u', + }, + 8 => { + Name => 'OutputGain', + Format => 'int16u', + ValueConv => '10 ** ($val/5120)', + }, +); + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Opus - Read Ogg Opus audio meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from Ogg Opus audio files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://www.opus-codec.org/docs/> + +=item L<https://wiki.xiph.org/OggOpus> + +=item L<https://tools.ietf.org/pdf/rfc7845.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Opus Tags>, +L<Image::ExifTool::TagNames/Ogg Tags>, +L<Image::ExifTool::TagNames/Vorbis Tags>, +L<Image::ExifTool::TagNames/FLAC Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Other.pm b/lib/Image/ExifTool/Other.pm new file mode 100644 index 0000000..133aac0 --- /dev/null +++ b/lib/Image/ExifTool/Other.pm @@ -0,0 +1,93 @@ +#------------------------------------------------------------------------------ +# File: Other.pm +# +# Description: Read meta information from other uncommon formats +# +# Revisions: 2021/07/16 - P. Harvey Created +# +# References: 1) PFM - http://www.pauldebevec.com/Research/HDR/PFM/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::Other; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.00'; + +# Other info +%Image::ExifTool::Other::PFM = ( + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + VARS => { NO_ID => 1 }, + NOTES => q{ + Tags extracted from Portable FloatMap images. See + L<http://www.pauldebevec.com/Research/HDR/PFM/> for the specification. + }, + ColorSpace => { PrintConv => { PF => 'RGB', 'Pf' => 'Monochrome'} }, + ImageWidth => { }, + ImageHeight => { }, + ByteOrder => { PrintConv => '$val > 0 ? "Big-endian" : "Little-endian"' }, +); + +#------------------------------------------------------------------------------ +# Extract information from a Portable FloatMap image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid PFM file +sub ProcessPFM2($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + return 0 unless $raf->Read($buff, 256) and $buff =~ /^(P[Ff])\x0a(\d+) (\d+)\x0a([-+0-9.]+)\x0a/; + $et->SetFileType('PFM', 'image/x-pfm'); + my $tagTablePtr = GetTagTable('Image::ExifTool::Other::PFM'); + $et->HandleTag($tagTablePtr, ColorSpace => $1); + $et->HandleTag($tagTablePtr, ImageWidth => $2); + $et->HandleTag($tagTablePtr, ImageHeight => $3); + $et->HandleTag($tagTablePtr, ByteOrder => $4); + # hack to set proper file description (extension is the same for Printer Font Metrics files) + $Image::ExifTool::static_vars{OverrideFileDescription}{PFM} = 'Portable FloatMap', + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Other - Read meta information from other uncommon formats + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to extract +information from Portable FloatMap (PFM) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item PFM L<http://www.pauldebevec.com/Research/HDR/PFM/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Other Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/PCX.pm b/lib/Image/ExifTool/PCX.pm new file mode 100644 index 0000000..d54d871 --- /dev/null +++ b/lib/Image/ExifTool/PCX.pm @@ -0,0 +1,138 @@ +#------------------------------------------------------------------------------ +# File: PCX.pm +# +# Description: Read metadata from PC Paintbrush files +# +# Revisions: 2018/12/12 - P. Harvey Created +# +# References: 1) http://qzx.com/pc-gpe/pcx.txt +# 2) https://www.fileformat.info/format/pcx/corion.htm +#------------------------------------------------------------------------------ + +package Image::ExifTool::PCX; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.00'; + +# PCX info +%Image::ExifTool::PCX::Main = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + NOTES => 'Tags extracted from PC Paintbrush images.', + DATAMEMBER => [ 0x04, 0x05 ], + 0x00 => { + Name => 'Manufacturer', + PrintConv => { 10 => 'ZSoft' }, + }, + 0x01 => { + Name => 'Software', + PrintConv => { + 0 => 'PC Paintbrush 2.5', + 2 => 'PC Paintbrush 2.8 (with palette)', + 3 => 'PC Paintbrush 2.8 (without palette)', + 4 => 'PC Paintbrush for Windows', + 5 => 'PC Paintbrush 3.0+', + }, + }, + 0x02 => { Name => 'Encoding', PrintConv => { 1 => 'RLE' } }, + 0x03 => 'BitsPerPixel', + 0x04 => { + Name => 'LeftMargin', + Format => 'int16u', + RawConv => '$$self{LeftMargin} = $val', + }, + 0x06 => { + Name => 'TopMargin', + Format => 'int16u', + RawConv => '$$self{TopMargin} = $val', + }, + 0x08 => { + Name => 'ImageWidth', + Format => 'int16u', + Notes => 'adjusted for LeftMargin', + ValueConv => '$val - $$self{LeftMargin} + 1', + }, + 0x0a => { + Name => 'ImageHeight', + Format => 'int16u', + Notes => 'adjusted for TopMargin', + ValueConv => '$val - $$self{TopMargin} + 1', + }, + 0x0c => 'XResolution', + 0x0e => 'YResolution', + 0x41 => 'ColorPlanes', + 0x42 => { Name => 'BytesPerLine', Format => 'int16u' }, + 0x44 => { + Name => 'ColorMode', + PrintConv => { + 0 => 'n/a', + 1 => 'Color Palette', + 2 => 'Grayscale', + }, + }, + 0x46 => { Name => 'ScreenWidth', Format => 'int16u', RawConv => '$val or undef' }, + 0x48 => { Name => 'ScreenHeight', Format => 'int16u', RawConv => '$val or undef' }, +); + +#------------------------------------------------------------------------------ +# Extract information from a PCX image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid PCX file +sub ProcessPCX($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + return 0 unless $raf->Read($buff, 0x50) == 0x50 and + $buff =~ /^\x0a[\0-\x05]\x01[\x01\x02\x04\x08].{64}[\0-\x02]/s; + SetByteOrder('II'); + $et->SetFileType(); + my %dirInfo = ( DirName => 'PCX', DataPt => \$buff ); + my $tagTablePtr = GetTagTable('Image::ExifTool::PCX::Main'); + return $et->ProcessBinaryData(\%dirInfo, $tagTablePtr); +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::PCX - Read metadata from PC Paintbrush files + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to extract +information from PC Paintbrush (PCX) files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://qzx.com/pc-gpe/pcx.txt> + +=item L<https://www.fileformat.info/format/pcx/corion.htm> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PCX Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/PDF.pm b/lib/Image/ExifTool/PDF.pm new file mode 100644 index 0000000..1e580c1 --- /dev/null +++ b/lib/Image/ExifTool/PDF.pm @@ -0,0 +1,2420 @@ +#------------------------------------------------------------------------------ +# File: PDF.pm +# +# Description: Read PDF meta information +# +# Revisions: 07/11/2005 - P. Harvey Created +# 07/25/2005 - P. Harvey Add support for encrypted documents +# +# References: 1) http://www.adobe.com/devnet/pdf/pdf_reference.html +# 2) http://search.cpan.org/dist/Crypt-RC4/ +# 3) http://www.adobe.com/devnet/acrobat/pdfs/PDF32000_2008.pdf +# 4) http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/adobe_supplement_iso32000.pdf +# 5) http://tools.ietf.org/search/rfc3454 +# 6) http://www.armware.dk/RFC/rfc/rfc4013.html +#------------------------------------------------------------------------------ + +package Image::ExifTool::PDF; + +use strict; +use vars qw($VERSION $AUTOLOAD $lastFetched); +use Image::ExifTool qw(:DataAccess :Utils); +require Exporter; + +$VERSION = '1.55'; + +sub FetchObject($$$$); +sub ExtractObject($$;$$); +sub ReadToNested($;$); +sub ProcessDict($$$$;$$); +sub ProcessAcroForm($$$$;$$); +sub ExpandArray($); +sub ReadPDFValue($); +sub CheckPDF($$$); + +# $lastFetched - last fetched object reference (used for decryption) +# (undefined if fetched object was already decrypted, eg. object from stream) + +my $cryptInfo; # encryption object reference (plus additional information) +my $cryptString; # flag that strings are encrypted +my $cryptStream; # flag that streams are encrypted +my $lastOffset; # last fetched object offset +my %streamObjs; # hash of stream objects +my %fetched; # dicts fetched in verbose mode (to avoid cyclical recursion) +my $pdfVer; # version of PDF file being processed + +# filters supported in DecodeStream() +my %supportedFilter = ( + '/FlateDecode' => 1, + '/Crypt' => 1, + '/Identity' => 1, # (not filtered) + '/DCTDecode' => 1, # (JPEG image - not filtered) + '/JPXDecode' => 1, # (Jpeg2000 image - not filtered) + '/LZWDecode' => 1, # (usually a bitmapped image) + '/ASCIIHexDecode' => 1, + '/ASCII85Decode' => 1, + # other standard filters that we currently don't support + #'/JBIG2Decode' => 0, # (JBIG2 image format not supported) + #'/CCITTFaxDecode' => 0, + #'/RunLengthDecode' => 0, +); + +# tags in main PDF directories +%Image::ExifTool::PDF::Main = ( + GROUPS => { 2 => 'Document' }, + VARS => { CAPTURE => ['Main','Prev'] }, + Info => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Info' }, + # Adobe Acrobat 10.1.5 will create a duplicate Info dictionary with + # a different object number when metadata is edited. This flag + # is part of a patch to ignore this duplicate information (unless + # the IgnoreMinorErrors option is used) + IgnoreDuplicates => 1, + }, + Root => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Root' }, + }, + Encrypt => { + NoProcess => 1, # don't process normally (processed in advance) + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Encrypt' }, + }, + _linearized => { + Name => 'Linearized', + Notes => 'flag set if document is linearized for fast web display; not a real Tag ID', + PrintConv => { 'true' => 'Yes', 'false' => 'No' }, + }, +); + +# tags in PDF Info dictionary +%Image::ExifTool::PDF::Info = ( + GROUPS => { 2 => 'Document' }, + VARS => { CAPTURE => ['Info'] }, + EXTRACT_UNKNOWN => 1, # extract all unknown tags in this directory + WRITE_PROC => \&Image::ExifTool::DummyWriteProc, + CHECK_PROC => \&CheckPDF, + WRITABLE => 'string', + # set PRIORITY to 0 so most recent Info dictionary takes precedence + # (Acrobat Pro bug? doesn't use same object/generation number for + # new Info dictionary when doing incremental update) + PRIORITY => 0, + NOTES => q{ + As well as the tags listed below, the PDF specification allows for + user-defined tags to exist in the Info dictionary. These tags, which should + have corresponding XMP-pdfx entries in the XMP of the PDF XML Metadata + object, are also extracted by ExifTool. + + B<Writable> specifies the value format, and may be C<string>, C<date>, + C<integer>, C<real>, C<boolean> or C<name> for PDF tags. + }, + Title => { }, + Author => { Groups => { 2 => 'Author' } }, + Subject => { }, + Keywords => { List => 'string' }, # this is a string list + Creator => { }, + Producer => { }, + CreationDate => { + Name => 'CreateDate', + Writable => 'date', + Groups => { 2 => 'Time' }, + Shift => 'Time', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + ModDate => { + Name => 'ModifyDate', + Writable => 'date', + Groups => { 2 => 'Time' }, + Shift => 'Time', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + Trapped => { + Protected => 1, + # remove leading '/' from '/True' or '/False' + ValueConv => '$val=~s{^/}{}; $val', + ValueConvInv => '"/$val"', + }, + 'AAPL:Keywords' => { #PH + Name => 'AppleKeywords', + List => 'array', # this is an array of values + Notes => q{ + keywords written by Apple utilities, although they seem to use PDF:Keywords + when reading + }, + }, +); + +# tags in the PDF Root document catalog +%Image::ExifTool::PDF::Root = ( + GROUPS => { 2 => 'Document' }, + # note: can't capture previous versions of Root since they are not parsed + VARS => { CAPTURE => ['Root'] }, + NOTES => 'This is the PDF document catalog.', + MarkInfo => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::MarkInfo' }, + }, + Metadata => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Metadata' }, + }, + Pages => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Pages' }, + }, + Perms => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Perms' }, + }, + AcroForm => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::AcroForm' }, + }, + Lang => 'Language', + PageLayout => { }, + PageMode => { }, + Version => 'PDFVersion', +); + +# tags extracted from the PDF Encrypt dictionary +%Image::ExifTool::PDF::Encrypt = ( + GROUPS => { 2 => 'Document' }, + NOTES => 'Tags extracted from the document Encrypt dictionary.', + Filter => { + Name => 'Encryption', + Notes => q{ + extracted value is actually a combination of the Filter, SubFilter, V, R and + Length information from the Encrypt dictionary + }, + }, + P => { + Name => 'UserAccess', + ValueConv => '$val & 0x0f3c', # ignore reserved bits + PrintConvColumns => 2, + PrintConv => { BITMASK => { + 2 => 'Print', + 3 => 'Modify', + 4 => 'Copy', + 5 => 'Annotate', + 8 => 'Fill forms', + 9 => 'Extract', + 10 => 'Assemble', + 11 => 'Print high-res', + }}, + }, +); + +# tags in PDF Pages dictionary +%Image::ExifTool::PDF::Pages = ( + GROUPS => { 2 => 'Document' }, + Count => 'PageCount', + Kids => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Kids' }, + }, +); + +# tags in PDF Perms dictionary +%Image::ExifTool::PDF::Perms = ( + NOTES => 'Additional document permissions imposed by digital signatures.', + DocMDP => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Signature' }, + }, + FieldMDP => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Signature' }, + }, + UR3 => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Signature' }, + }, +); + +# tags in PDF Perms dictionary +%Image::ExifTool::PDF::AcroForm = ( + PROCESS_PROC => \&ProcessAcroForm, + _has_xfa => { + Name => 'HasXFA', + Notes => q{ + this tag is defined if a document contains form fields, and is true if it + uses XML Forms Architecture; not a real Tag ID + }, + PrintConv => { 'true' => 'Yes', 'false' => 'No' }, + }, +); + +# tags in PDF Kids dictionary +%Image::ExifTool::PDF::Kids = ( + Metadata => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Metadata' }, + }, + PieceInfo => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::PieceInfo' }, + }, + Resources => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Resources' }, + }, + Kids => { + Condition => '$self->Options("ExtractEmbedded")', + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Kids' }, + }, +); + +# tags in PDF Resources dictionary +%Image::ExifTool::PDF::Resources = ( + ColorSpace => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::ColorSpace' }, + }, + XObject => { + Condition => '$self->Options("ExtractEmbedded")', + SubDirectory => { TagTable => 'Image::ExifTool::PDF::XObject' }, + }, + Properties => { + Condition => '$self->Options("ExtractEmbedded")', + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Properties' }, + }, +); + +# tags in PDF ColorSpace dictionary +%Image::ExifTool::PDF::ColorSpace = ( + DefaultRGB => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::DefaultRGB' }, + ConvertToDict => 1, # (not seen yet, but just in case) + }, + DefaultCMYK => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::DefaultRGB' }, + # hack: this is stored as an array instead of a dictionary in my + # sample, so convert to a dictionary to extract the ICCBased element + ConvertToDict => 1, + }, + Cs1 => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::DefaultRGB' }, + ConvertToDict => 1, # (just in case) + }, + CS0 => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::DefaultRGB' }, + ConvertToDict => 1, # (just in case) + }, +); + +# tags in PDF DefaultRGB dictionary +%Image::ExifTool::PDF::DefaultRGB = ( + ICCBased => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::ICCBased' }, + }, +); + +# tags in PDF ICCBased, Cs1 and CS0 dictionaries +%Image::ExifTool::PDF::ICCBased = ( + _stream => { + SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' }, + }, +); + +# tags in PDF XObject dictionary (parsed only if ExtractEmbedded is enabled) +%Image::ExifTool::PDF::XObject = ( + EXTRACT_UNKNOWN => 0, # extract known but numbered tags (Im1, Im2, etc) + Im => { + Notes => q{ + the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> option enables information to be extracted from these + embedded images + }, + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Im' }, + }, +); + +# tags in PDF Im# dictionary +%Image::ExifTool::PDF::Im = ( + NOTES => q{ + Information extracted from embedded images with the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> option. + The EmbeddedImage and its metadata are extracted only for JPEG and Jpeg2000 + image formats. + }, + Width => 'EmbeddedImageWidth', + Height => 'EmbeddedImageHeight', + Filter => { Name => 'EmbeddedImageFilter', List => 1 }, + ColorSpace => { + Name => 'EmbeddedImageColorSpace', + List => 1, + RawConv => 'ref $val ? undef : $val', # (ignore color space data) + }, + Image_stream => { + Name => 'EmbeddedImage', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, +); + +# tags in PDF Properties dictionary +%Image::ExifTool::PDF::Properties = ( + EXTRACT_UNKNOWN => 0, # extract known but numbered tags (MC0, MC1, etc) + MC => { + Notes => q{ + the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> option enables information to be extracted from these + embedded metadata dictionaries + }, + SubDirectory => { TagTable => 'Image::ExifTool::PDF::MC' }, + } +); + +# tags in PDF MC# dictionary +%Image::ExifTool::PDF::MC = ( + Metadata => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Metadata' }, + } +); + +# tags in PDF PieceInfo dictionary +%Image::ExifTool::PDF::PieceInfo = ( + AdobePhotoshop => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::AdobePhotoshop' }, + }, + Illustrator => { + # assume this is an illustrator file if it contains this directory + # and doesn't have a ".PDF" extension + Condition => q{ + $self->OverrideFileType("AI") unless $$self{FILE_EXT} and $$self{FILE_EXT} eq 'PDF'; + return 1; + }, + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Illustrator' }, + }, +); + +# tags in PDF AdobePhotoshop dictionary +%Image::ExifTool::PDF::AdobePhotoshop = ( + Private => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Private' }, + }, +); + +# tags in PDF Illustrator dictionary +%Image::ExifTool::PDF::Illustrator = ( + Private => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::AIPrivate' }, + }, +); + +# tags in PDF Private dictionary +%Image::ExifTool::PDF::Private = ( + ImageResources => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::ImageResources' }, + }, +); + +# tags in PDF AI Private dictionary +%Image::ExifTool::PDF::AIPrivate = ( + GROUPS => { 2 => 'Document' }, + EXTRACT_UNKNOWN => 0, # extract known but numbered tags + AIMetaData => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::AIMetaData' }, + }, + AIPrivateData => { + Notes => q{ + the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> option enables information to be extracted from embedded + PostScript documents in the AIPrivateData# and AIPDFPrivateData# streams + }, + JoinStreams => 1, # join streams from numbered tags and process as one + SubDirectory => { TagTable => 'Image::ExifTool::PostScript::Main' }, + }, + AIPDFPrivateData => { + JoinStreams => 1, # join streams from numbered tags and process as one + SubDirectory => { TagTable => 'Image::ExifTool::PostScript::Main' }, + }, + RoundTripVersion => { }, + ContainerVersion => { }, + CreatorVersion => { }, +); + +# tags in PDF AIMetaData dictionary +%Image::ExifTool::PDF::AIMetaData = ( + _stream => { + SubDirectory => { TagTable => 'Image::ExifTool::PostScript::Main' }, + }, +); + +# tags in PDF ImageResources dictionary +%Image::ExifTool::PDF::ImageResources = ( + _stream => { + SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Main' }, + }, +); + +# tags in PDF MarkInfo dictionary +%Image::ExifTool::PDF::MarkInfo = ( + GROUPS => { 2 => 'Document' }, + Marked => { + Name => 'TaggedPDF', + Notes => "not a Tagged PDF if this tag is missing", + PrintConv => { 'true' => 'Yes', 'false' => 'No' }, + }, +); + +# tags in PDF Metadata dictionary +%Image::ExifTool::PDF::Metadata = ( + GROUPS => { 2 => 'Document' }, + XML_stream => { # this is the stream for a Subtype /XML dictionary (not a real tag) + Name => 'XMP', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, +); + +# tags in PDF signature directories (DocMDP, FieldMDP or UR3) +%Image::ExifTool::PDF::Signature = ( + GROUPS => { 2 => 'Document' }, + ContactInfo => 'SignerContactInfo', + Location => 'SigningLocation', + M => { + Name => 'SigningDate', + Format => 'date', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + Name => 'SigningAuthority', + Reason => 'SigningReason', + Reference => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Reference' }, + }, + Prop_AuthTime => { + Name => 'AuthenticationTime', + PrintConv => 'ConvertTimeSpan($val) . " ago"', + }, + Prop_AuthType => 'AuthenticationType', +); + +# tags in PDF Reference dictionary +%Image::ExifTool::PDF::Reference = ( + TransformParams => { + SubDirectory => { TagTable => 'Image::ExifTool::PDF::TransformParams' }, + }, +); + +# tags in PDF TransformParams dictionary +%Image::ExifTool::PDF::TransformParams = ( + GROUPS => { 2 => 'Document' }, + Annots => { + Name => 'AnnotationUsageRights', + Notes => q{ + possible values are Create, Delete, Modify, Copy, Import and Export; + additional values for UR3 signatures are Online and SummaryView + }, + List => 1, + }, + Document => { + Name => 'DocumentUsageRights', + Notes => 'only possible value is FullSave', + List => 1, + }, + Form => { + Name => 'FormUsageRights', + Notes => q{ + possible values are FillIn, Import, Export, SubmitStandalone and + SpawnTemplate; additional values for UR3 signatures are BarcodePlaintext and + Online + }, + List => 1, + }, + FormEX => { + Name => 'FormExtraUsageRights', + Notes => 'UR signatures only; only possible value is BarcodePlaintext', + List => 1, + }, + Signature => { + Name => 'SignatureUsageRights', + Notes => 'only possible value is Modify', + List => 1, + }, + EF => { + Name => 'EmbeddedFileUsageRights', + Notes => 'possible values are Create, Delete, Modify and Import', + List => 1, + }, + Msg => 'UsageRightsMessage', + P => { + Name => 'ModificationPermissions', + Notes => q{ + 1-3 for DocMDP signatures, default 2; true/false for UR3 signatures, default + false + }, + PrintConv => { + 1 => 'No changes permitted', + 2 => 'Fill forms, Create page templates, Sign', + 3 => 'Fill forms, Create page templates, Sign, Create/Delete/Edit annotations', + 'true' => 'Restrict all applications to reader permissions', + 'false' => 'Do not restrict applications to reader permissions', + }, + }, + Action => { + Name => 'FieldPermissions', + Notes => 'FieldMDP signatures only', + PrintConv => { + 'All' => 'Disallow changes to all form fields', + 'Include' => 'Disallow changes to specified form fields', + 'Exclude' => 'Allow changes to specified form fields', + }, + }, + Fields => { + Notes => 'FieldMDP signatures only', + Name => 'FormFields', + List => 1, + }, +); + +# unknown tags for use in verbose option +%Image::ExifTool::PDF::Unknown = ( + GROUPS => { 2 => 'Unknown' }, +); + +#------------------------------------------------------------------------------ +# AutoLoad our writer routines when necessary +# +sub AUTOLOAD +{ + return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_); +} + +#------------------------------------------------------------------------------ +# Convert from PDF to EXIF-style date/time +# Inputs: 0) PDF date/time string (D:YYYYmmddHHMMSS+HH'MM') +# Returns: EXIF date string (YYYY:mm:dd HH:MM:SS+HH:MM) +sub ConvertPDFDate($) +{ + my $date = shift; + # remove optional 'D:' prefix + $date =~ s/^D://; + # fill in default values if necessary + # YYYYmmddHHMMSS + my $default = '00000101000000'; + if (length $date < length $default) { + $date .= substr($default, length $date); + } + $date =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(.*)/ or return $date; + $date = "$1:$2:$3 $4:$5:$6"; + if ($7) { + my $tz = $7; + if ($tz =~ /^\s*Z/i) { + # ignore any "HH'mm'" after the Z (OS X 10.6 does this) + $date .= 'Z'; + # tolerate some improper formatting in timezone specification + } elsif ($tz =~ /^\s*([-+])\s*(\d+)[': ]+(\d*)/) { + $date .= $1 . $2 . ':' . ($3 || '00'); + } + } + return $date; +} + +#------------------------------------------------------------------------------ +# Locate any object in the XRef tables (including compressed objects) +# Inputs: 0) XRef reference, 1) object reference string (or free object number) +# Returns: offset to object in file or compressed object reference string, +# 0 if object is free, or undefined on error +sub LocateAnyObject($$) +{ + my ($xref, $ref) = @_; + return undef unless $xref; + return $$xref{$ref} if exists $$xref{$ref}; + # get the object number + return undef unless $ref =~ /^(\d+)/; + my $objNum = $1; + # return 0 if the object number has been reused (old object is free) + return 0 if defined $$xref{$objNum}; +# +# scan our XRef stream dictionaries for this object +# + return undef unless $$xref{dicts}; + my $dict; + foreach $dict (@{$$xref{dicts}}) { + # quick check to see if the object is in the range for this xref stream + next if $objNum >= $$dict{Size}; + my $index = $$dict{Index}; + next if $objNum < $$index[0]; + # scan the tables for the specified object + my $size = $$dict{_entry_size}; + my $num = scalar(@$index) / 2; + my $tot = 0; + my $i; + for ($i=0; $i<$num; ++$i) { + my $start = $$index[$i*2]; + my $count = $$index[$i*2+1]; + # table is in ascending order, so quit if we have passed the object + last if $objNum < $start; + if ($objNum < $start + $count) { + my $offset = $size * ($objNum - $start + $tot); + last if $offset + $size > length $$dict{_stream}; + my @c = unpack("x$offset C$size", $$dict{_stream}); + # extract values from this table entry + # (can be 1, 2, 3, 4, etc.. bytes per value) + my (@t, $j, $k); + my $w = $$dict{W}; + for ($j=0; $j<3; ++$j) { + # use default value if W entry is 0 (as per spec) + # - 0th element defaults to 1, others default to 0 + $$w[$j] or $t[$j] = ($j ? 0 : 1), next; + $t[$j] = shift(@c); + for ($k=1; $k < $$w[$j]; ++$k) { + $t[$j] = 256 * $t[$j] + shift(@c); + } + } + # by default, use "o g R" as the xref key + # (o = object number, g = generation number) + my $ref2 = "$objNum $t[2] R"; + if ($t[0] == 1) { + # normal object reference: + # $t[1]=offset of object from start, $t[2]=generation number + $$xref{$ref2} = $t[1]; + } elsif ($t[0] == 2) { + # compressed object reference: + # $t[1]=stream object number, $t[2]=index of object in stream + $ref2 = "$objNum 0 R"; + $$xref{$ref2} = "I$t[2] $t[1] 0 R"; + } elsif ($t[0] == 0) { + # free object: + # $t[1]=next free object in linked list, $t[2]=generation number + $$xref{$ref2} = 0; + } else { + # treat as a null object + $$xref{$ref2} = undef; + } + $$xref{$objNum} = $t[1]; # remember offsets by object number too + return $$xref{$ref} if $ref eq $ref2; + return 0; # object is free or was reused + } + $tot += $count; + } + } + return undef; +} + +#------------------------------------------------------------------------------ +# Locate a regular object in the XRef tables (does not include compressed objects) +# Inputs: 0) XRef reference, 1) object reference string (or free object number) +# Returns: offset to object in file, 0 if object is free, +# or undef on error or if object was compressed +sub LocateObject($$) +{ + my ($xref, $ref) = @_; + my $offset = LocateAnyObject($xref, $ref); + return undef if $offset and $offset =~ /^I/; + return $offset; +} + +#------------------------------------------------------------------------------ +# Check that the correct object is located at the specified file offset +# Inputs: 0) ExifTool ref, 1) object name, 2) object reference string, 3) file offset +# Returns: first non-blank line at start of object, or undef on error +sub CheckObject($$$$) +{ + my ($et, $tag, $ref, $offset) = @_; + my ($data, $obj, $dat, $pat); + + my $raf = $$et{RAF}; + $raf->Seek($offset+$$et{PDFBase}, 0) or $et->Warn("Bad $tag offset"), return undef; + # verify that we are reading the expected object + ($obj = $ref) =~ s/R/obj/; + for (;;) { + $raf->ReadLine($data) or $et->Warn("Error reading $tag data"), return undef; + last if $data =~ s/^$obj//; + next if $data =~ /^\s+$/; # keep reading if this was a blank line + # handle cases where other whitespace characters are used in the object ID string + while ($data =~ /^\d+(\s+\d+)?\s*$/) { + $raf->ReadLine($dat); + $data .= $dat; + } + ($pat = $obj) =~ s/ /\\s+/g; + unless ($data =~ s/$pat//) { + $tag = ucfirst $tag; + $et->Warn("$tag object ($obj) not found at offset $offset"); + return undef; + } + last; + } + # read the first line of data from the object (ignoring blank lines and comments) + for (;;) { + last if $data =~ /\S/ and $data !~ /^\s*%/; + $raf->ReadLine($data) or $et->Warn("Error reading $tag data"), return undef; + } + return $data; +} + +#------------------------------------------------------------------------------ +# Fetch indirect object from file (from inside a stream if required) +# Inputs: 0) ExifTool object reference, 1) object reference string, +# 2) xref lookup, 3) object name (for warning messages) +# Returns: object data or undefined on error +# Notes: sets $lastFetched to the object reference, or undef if the object +# was extracted from an encrypted stream +sub FetchObject($$$$) +{ + my ($et, $ref, $xref, $tag) = @_; + $lastFetched = $ref; # save this for decoding if necessary + my $offset = LocateAnyObject($xref, $ref); + $lastOffset = $offset; + unless ($offset) { + $et->Warn("Bad $tag reference") unless defined $offset; + return undef; + } + my ($data, $obj); + if ($offset =~ s/^I(\d+) //) { + my $index = $1; # object index in stream + my ($objNum) = split ' ', $ref; # save original object number + $ref = $offset; # now a reference to the containing stream object + $obj = $streamObjs{$ref}; + unless ($obj) { + # don't try to load the same object stream twice + return undef if defined $obj; + $streamObjs{$ref} = ''; + # load the parent object stream + $obj = FetchObject($et, $ref, $xref, $tag); + # make sure it contains everything we need + return undef unless defined $obj and ref($obj) eq 'HASH'; + return undef unless $$obj{First} and $$obj{N}; + return undef unless DecodeStream($et, $obj); + # add a special '_table' entry to this dictionary which contains + # the list of object number/offset pairs from the stream header + my $num = $$obj{N} * 2; + my @table = split ' ', $$obj{_stream}, $num; + return undef unless @table == $num; + # remove everything before first object in stream + $$obj{_stream} = substr($$obj{_stream}, $$obj{First}); + $table[$num-1] =~ s/^(\d+).*/$1/s; # trim excess from last number + $$obj{_table} = \@table; + # save the object stream so we don't have to re-load it later + $streamObjs{$ref} = $obj; + } + # verify that we have the specified object + my $i = 2 * $index; + my $table = $$obj{_table}; + unless ($index < $$obj{N} and $$table[$i] == $objNum) { + $et->Warn("Bad index for stream object $tag"); + return undef; + } + # extract the object at the specified index in the stream + # (offsets in table are in sequential order, so we can subtract from + # the next offset to get the object length) + $offset = $$table[$i + 1]; + my $len = ($$table[$i + 3] || length($$obj{_stream})) - $offset; + $data = substr($$obj{_stream}, $offset, $len); + # avoid re-decrypting data in already decrypted streams + undef $lastFetched if $cryptStream; + return ExtractObject($et, \$data); + } + # load the start of the object + $data = CheckObject($et, $tag, $ref, $offset); + return undef unless defined $data; + + return ExtractObject($et, \$data, $$et{RAF}, $xref); +} + +#------------------------------------------------------------------------------ +# Convert PDF value to something readable +# Inputs: 0) PDF object data +# Returns: converted object +sub ReadPDFValue($) +{ + my $str = shift; + # decode all strings in an array + if (ref $str eq 'ARRAY') { + # create new list to not alter the original data when rewriting + my ($val, @vals); + foreach $val (@$str) { + push @vals, ReadPDFValue($val); + } + return \@vals; + } + length $str or return $str; + my $delim = substr($str, 0, 1); + if ($delim eq '(') { # literal string + $str = $1 if $str =~ /^.*?\((.*)\)/s; # remove brackets + # decode escape sequences in literal strings + while ($str =~ /\\(.)/sg) { + my $n = pos($str) - 2; + my $c = $1; + my $r; + if ($c =~ /[0-7]/) { + # get up to 2 more octal digits + $c .= $1 if $str =~ /\G([0-7]{1,2})/g; + # convert octal escape code + $r = chr(oct($c) & 0xff); + } elsif ($c eq "\x0d") { + # the string is continued if the line ends with '\' + # (also remove "\x0d\x0a") + $c .= $1 if $str =~ /\G(\x0a)/g; + $r = ''; + } elsif ($c eq "\x0a") { + $r = ''; + } else { + # convert escaped characters + ($r = $c) =~ tr/nrtbf/\n\r\t\b\f/; + } + substr($str, $n, length($c)+1) = $r; + # continue search after this character + pos($str) = $n + length($r); + } + Crypt(\$str, $lastFetched) if $cryptString; + } elsif ($delim eq '<') { # hex string + # decode hex data + $str =~ tr/0-9A-Fa-f//dc; + $str .= '0' if length($str) & 0x01; # (by the spec) + $str = pack('H*', $str); + Crypt(\$str, $lastFetched) if $cryptString; + } elsif ($delim eq '/') { # name + $str = substr($str, 1); + # convert escape codes (PDF 1.2 or later) + $str =~ s/#([0-9a-f]{2})/chr(hex($1))/sgei if $pdfVer >= 1.2; + } + return $str; +} + +#------------------------------------------------------------------------------ +# Extract PDF object from combination of buffered data and file +# Inputs: 0) ExifTool object reference, 1) data reference, +# 2) optional raf reference, 3) optional xref table +# Returns: converted PDF object or undef on error +# a) dictionary object --> hash reference +# b) array object --> array reference +# c) indirect reference --> scalar reference +# d) string, name, integer, boolean, null --> scalar value +# - updates $$dataPt on return to contain unused data +# - creates two bogus entries ('_stream' and '_tags') in dictionaries to represent +# the stream data and a list of the tags (not including '_stream' and '_tags') +# in their original order +sub ExtractObject($$;$$) +{ + my ($et, $dataPt, $raf, $xref) = @_; + my (@tags, $data, $objData); + my $dict = { }; + my $delim; + + for (;;) { + if ($$dataPt =~ /^\s*(<{1,2}|\[|\()/s) { + $delim = $1; + $$dataPt =~ s/^\s+//; # remove leading white space + $objData = ReadToNested($dataPt, $raf); + return undef unless defined $objData; + last; + } elsif ($$dataPt =~ s{^\s*(\S[^[(/<>\s]*)\s*}{}s) { +# +# extract boolean, numerical, string, name, null object or indirect reference +# + $objData = $1; + # look for an indirect reference + if ($objData =~ /^\d+$/ and $$dataPt =~ s/^(\d+)\s+R//s) { + $objData .= "$1 R"; + $objData = \$objData; # return scalar reference + } + return $objData; # return simple scalar or scalar reference + } + $raf and $raf->ReadLine($data) or return undef; + $$dataPt .= $data; + } +# +# return literal string or hex string without parsing +# + if ($delim eq '(' or $delim eq '<') { + return $objData; +# +# extract array +# + } elsif ($delim eq '[') { + $objData =~ /^.*?\[(.*)\]/s or return undef; + my $data = $1; # brackets removed + my @list; + for (;;) { + last unless $data =~ m{\s*(\S[^[(/<>\s]*)}sg; + my $val = $1; + if ($val =~ /^(<{1,2}|\[|\()/) { + my $pos = pos($data) - length($val); + # nested dict, array, literal string or hex string + my $buff = substr($data, $pos); + $val = ReadToNested(\$buff); + last unless defined $val; + pos($data) = $pos + length($val); + $val = ExtractObject($et, \$val); + } elsif ($val =~ /^\d/) { + my $pos = pos($data); + if ($data =~ /\G\s+(\d+)\s+R/g) { + $val = \ "$val $1 R"; # make a reference + } else { + pos($data) = $pos; + } + } + push @list, $val; + } + return \@list; + } +# +# extract dictionary +# + # Note: entries are not necessarily separated by whitespace (doh!) + # eg) "/Tag/Name", "/Tag(string)", "/Tag[array]", etc are legal! + # Also, they may be separated by a comment (eg. "/Tag%comment\nValue"), + # but comments have already been removed + while ($objData =~ m{(\s*)/([^/[\]()<>{}\s]+)\s*(\S[^[(/<>\s]*)}sg) { + my $tag = $2; + my $val = $3; + if ($val =~ /^(<{1,2}|\[|\()/) { + # nested dict, array, literal string or hex string + $objData = substr($objData, pos($objData)-length($val)); + $val = ReadToNested(\$objData, $raf); + last unless defined $val; + $val = ExtractObject($et, \$val); + pos($objData) = 0; + } elsif ($val =~ /^\d/) { + my $pos = pos($objData); + if ($objData =~ /\G\s+(\d+)\s+R/sg) { + $val = \ "$val $1 R"; # make a reference + } else { + pos($objData) = $pos; + } + } + if ($$dict{$tag}) { + # duplicate dictionary entries are not allowed + $et->Warn("Duplicate '${tag}' entry in dictionary (ignored)"); + } else { + # save the entry + push @tags, $tag; + $$dict{$tag} = $val; + } + } + return undef unless @tags; + $$dict{_tags} = \@tags; + return $dict unless $raf; # direct objects can not have streams +# +# extract the stream object +# + # dictionary must specify stream Length + my $length = $$dict{Length} or return $dict; + if (ref $length) { + $length = $$length; + my $oldpos = $raf->Tell(); + # get the location of the object specifying the length + # (compressed objects are not allowed) + my $offset = LocateObject($xref, $length) or return $dict; + $offset or $et->Warn('Bad stream Length object'), return $dict; + $data = CheckObject($et, 'stream Length', $length, $offset); + defined $data or return $dict; + $data =~ /^\s*(\d+)/ or $et->Warn('Stream Length not found'), return $dict; + $length = $1; + $raf->Seek($oldpos, 0); # restore position to start of stream + } + # extract the trailing stream data + for (;;) { + # find the stream token + if ($$dataPt =~ /(\S+)/) { + last unless $1 eq 'stream'; + # read an extra line because it may contain our \x0a + $$dataPt .= $data if $raf->ReadLine($data); + # remove our stream header + $$dataPt =~ s/^\s*stream(\x0a|\x0d\x0a)//s; + my $more = $length - length($$dataPt); + if ($more > 0) { + unless ($raf->Read($data, $more) == $more) { + $et->Warn('Error reading stream data'); + $$dataPt = ''; + return $dict; + } + $$dict{_stream} = $$dataPt . $data; + $$dataPt = ''; + } elsif ($more < 0) { + $$dict{_stream} = substr($$dataPt, 0, $length); + $$dataPt = substr($$dataPt, $length); + } else { + $$dict{_stream} = $$dataPt; + $$dataPt = ''; + } + last; + } + $raf->ReadLine($data) or last; + $$dataPt .= $data; + } + return $dict; +} + +#------------------------------------------------------------------------------ +# Read to nested delimiter +# Inputs: 0) data reference, 1) optional raf reference +# Returns: data up to and including matching delimiter (or undef on error) +# - updates data reference with trailing data +# - unescapes characters in literal strings +my %closingDelim = ( # lookup for matching delimiter + '(' => ')', + '[' => ']', + '<' => '>', + '<<' => '>>', +); +sub ReadToNested($;$) +{ + my ($dataPt, $raf) = @_; + my @delim = (''); # closing delimiter list, most deeply nested first + pos($$dataPt) = 0; # begin at start of data + for (;;) { + unless ($$dataPt =~ /(\\*)(\(|\)|<{1,2}|>{1,2}|\[|\]|%)/g) { + # must read some more data + my $buff; + last unless $raf and $raf->ReadLine($buff); + $$dataPt .= $buff; + pos($$dataPt) = length($$dataPt) - length($buff); + next; + } + # are we in a literal string? + if ($delim[0] eq ')') { + # ignore escaped delimiters (preceded by odd number of \'s) + next if length($1) & 0x01; + # ignore all delimiters but unescaped braces + next unless $2 eq '(' or $2 eq ')'; + } elsif ($2 eq '%') { + # ignore the comment + my $pos = pos($$dataPt) - 1; + # remove everything from '%' up to but not including newline + $$dataPt =~ /.*/g; + my $end = pos($$dataPt); + $$dataPt = substr($$dataPt, 0, $pos) . substr($$dataPt, $end); + pos($$dataPt) = $pos; + next; + } + if ($closingDelim{$2}) { + # push the corresponding closing delimiter + unshift @delim, $closingDelim{$2}; + next; + } + unless ($2 eq $delim[0]) { + # handle the case where we find a ">>>" and interpret it + # as ">> >" instead of "> >>" + next unless $2 eq '>>' and $delim[0] eq '>'; + pos($$dataPt) = pos($$dataPt) - 1; + } + shift @delim; # remove from nesting list + next if $delim[0]; # keep going if we have more nested delimiters + my $pos = pos($$dataPt); + my $buff = substr($$dataPt, 0, $pos); + $$dataPt = substr($$dataPt, $pos); + return $buff; # success! + } + return undef; # didn't find matching delimiter +} + +#------------------------------------------------------------------------------ +# Decode LZW-encoded data (ref 1) +# Inputs: 0) data reference +# Returns: true on success and data is decoded, or false and data is untouched +sub DecodeLZW($) +{ + my $dataPt = shift; + return 0 if length $$dataPt < 4; + my @lzw = (map(chr, 0..255), undef, undef); # LZW code table + my $mask = 0x01ff; # mask for least-significant 9 bits + my @dat = unpack 'n*', $$dataPt . "\0"; + my $word = ($dat[0] << 16) | $dat[1]; + my ($bit, $pos, $bits, $out) = (0, 2, 9, ''); + my $lastVal; + for (;;) { + # bits are packed MSB first in PDF LZW (the PDF spec doesn't mention this) + my $shift = 32 - ($bit + $bits); + if ($shift < 0) { + return 0 if $pos >= @dat; # missing EOD marker + $word = (($word & 0xffff) << 16) | $dat[$pos++]; # read next word + $bit -= 16; + $shift += 16; + }; + my $code = ($word >> $shift) & $mask; + $bit += $bits; + my $val = $lzw[$code]; + if (defined $val) { + # store new code as previous sequence plus 1st char of new sequence + push @lzw, $lastVal . substr($val, 0, 1) if defined $lastVal; + } elsif ($code == @lzw) { # new code + return 0 unless defined $lastVal; + # we are using the code that we are about to generate, so the last + # character in the new sequence must be the same as the first + # character in the previous sequence (makes sense if you think about it) + $val = $lastVal . substr($lastVal, 0, 1); + push @lzw, $val; + } elsif ($code == 256) { # clear table + splice @lzw, 258; + $bits = 9; + $mask = 0x1ff; + undef $lastVal; + next; + } elsif ($code == 257) { # EOD marker + last; # all done! + } else { + return 0; + } + $out .= $val; # add this byte sequence to the output + # we added a new entry to the LZW table, so we must increase + # the bit width if necessary, up to a maximum of 12 + @lzw >= $mask and $bits < 12 and ++$bits, $mask |= $mask << 1; + $lastVal = $val; + } + $$dataPt = $out; # return decompressed data + return 1; +} + +#------------------------------------------------------------------------------ +# Decode filtered stream +# Inputs: 0) ExifTool object reference, 1) dictionary reference +# Returns: true if stream has been decoded OK +sub DecodeStream($$) +{ + local $_; + my ($et, $dict) = @_; + + return 0 unless $$dict{_stream}; # no stream to decode + + # get list of filters + my (@filters, @decodeParms, $filter); + if (ref $$dict{Filter} eq 'ARRAY') { + @filters = @{$$dict{Filter}}; + } elsif (defined $$dict{Filter}) { + @filters = ($$dict{Filter}); + } + # be sure we can process all the filters before we take the time to do the decryption + foreach $filter (@filters) { + next if $supportedFilter{$filter}; + $et->WarnOnce("Unsupported Filter $filter"); + return 0; + } + # apply decryption first if required (and if the default encryption + # has not been overridden by a Crypt filter. Note: the Crypt filter + # must be first in the Filter array: ref 3, page 38) + unless (defined $$dict{_decrypted} or ($filters[0] and $filters[0] eq '/Crypt')) { + CryptStream($dict, $lastFetched); + } + return 1 unless $$dict{Filter}; # Filter entry is mandatory + return 0 if defined $$dict{_filtered}; # avoid double-filtering + $$dict{_filtered} = 1; # set flag to prevent double-filtering + + # get array of DecodeParms dictionaries + if (ref $$dict{DecodeParms} eq 'ARRAY') { + @decodeParms = @{$$dict{DecodeParms}}; + } else { + @decodeParms = ($$dict{DecodeParms}); + } + + foreach $filter (@filters) { + my $decodeParms = shift @decodeParms; + + if ($filter eq '/FlateDecode') { + # make sure we support the predictor (if used) before decoding + my $pre; + if (ref $decodeParms eq 'HASH') { + $pre = $$decodeParms{Predictor}; + if ($pre and $pre ne '1' and $pre ne '12') { + $et->WarnOnce("FlateDecode Predictor $pre currently not supported"); + return 0; + } + } + if (eval { require Compress::Zlib }) { + my $inflate = Compress::Zlib::inflateInit(); + my ($buff, $stat); + $inflate and ($buff, $stat) = $inflate->inflate($$dict{_stream}); + if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) { + $$dict{_stream} = $buff; + } else { + $et->Warn('Error inflating stream'); + return 0; + } + } else { + $et->WarnOnce('Install Compress::Zlib to process filtered streams'); + return 0; + } + next unless $pre and $pre eq '12'; # 12 = 'up' prediction + + # apply anti-predictor + my $cols = $$decodeParms{Columns}; + unless ($cols) { + # currently only support 'up' prediction + $et->WarnOnce('No Columns for decoding stream'); + return 0; + } + my @bytes = unpack('C*', $$dict{_stream}); + my @pre = (0) x $cols; # initialize predictor array + my $buff = ''; + while (@bytes > $cols) { + unless (($_ = shift @bytes) == 2) { + $et->WarnOnce("Unsupported PNG filter $_"); # (yes, PNG) + return 0; + } + foreach (@pre) { + $_ = ($_ + shift(@bytes)) & 0xff; + } + $buff .= pack('C*', @pre); + } + $$dict{_stream} = $buff; + + } elsif ($filter eq '/Crypt') { + + # (we shouldn't have to check the _decrypted flag since we + # already checked the _filtered flag, but what the heck...) + next if defined $$dict{_decrypted}; + # assume Identity filter (the default) if DecodeParms are missing + next unless ref $decodeParms eq 'HASH'; + my $name = $$decodeParms{Name}; + next unless defined $name or $name eq 'Identity'; + if ($name ne 'StdCF') { + $et->WarnOnce("Unsupported Crypt Filter $name"); + return 0; + } + unless ($cryptInfo) { + $et->WarnOnce('Missing Encrypt StdCF entry'); + return 0; + } + # decrypt the stream manually because we want to: + # 1) ignore $cryptStream (StmF) setting + # 2) ignore EncryptMetadata setting (I can't find mention of how to + # reconcile this in the spec., but this would make sense) + # 3) avoid adding the crypt key extension (ref 3, page 58, Algorithm 1b) + # 4) set _decrypted flag so we will recrypt according to StmF when + # writing (since we don't yet write Filter'd streams) + Crypt(\$$dict{_stream}, 'none'); + $$dict{_decrypted} = ($cryptStream ? 1 : 0); + + } elsif ($filter eq '/LZWDecode') { + + # make sure we don't have any unsupported decoding parameters + if (ref $decodeParms eq 'HASH') { + if ($$decodeParms{Predictor}) { + $et->WarnOnce("LZWDecode Predictor $$decodeParms{Predictor} currently not supported"); + return 0; + } elsif ($$decodeParms{EarlyChange}) { + $et->WarnOnce("LZWDecode EarlyChange currently not supported"); + return 0; + } + } + unless (DecodeLZW(\$$dict{_stream})) { + $et->WarnOnce('LZW decompress error'); + return 0; + } + + } elsif ($filter eq '/ASCIIHexDecode') { + + $$dict{_stream} =~ s/>.*//; # truncate at '>' (end of data mark) + $$dict{_stream} =~ tr/0-9a-zA-Z//d; # remove illegal characters + $$dict{_stream} = pack 'H*', $$dict{_stream}; + + } elsif ($filter eq '/ASCII85Decode') { + + my ($err, @out, $i); + my ($n, $val) = (0, 0); + foreach (split //, $$dict{_stream}) { + if ($_ ge '!' and $_ le 'u') {; + $val = 85 * $val + ord($_) - 33; + next unless ++$n == 5; + } elsif ($_ eq '~') { + $n == 1 and $err = 1; # error to have a single char in the last group of 5 + for ($i=$n; $i<5; ++$i) { $val *= 85; } + } elsif ($_ eq 'z') { + $n and $err = 2, last; # error if 'z' isn't the first char + $n = 5; + } else { + next if /^\s$/; # ignore white space + $err = 3, last; # any other character is an error + } + $val = unpack('V', pack('N', $val)); # reverse byte order + while (--$n > 0) { + push @out, $val & 0xff; + $val >>= 8; + } + last if $_ eq '~'; + # (both $n and $val are zero again now) + } + $err and $et->WarnOnce("ASCII85Decode error $err"); + $$dict{_stream} = pack('C*', @out); + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Initialize state for RC4 en/decryption (ref 2) +# Inputs: 0) RC4 key string +# Returns: RC4 key hash reference +sub RC4Init($) +{ + my @key = unpack('C*', shift); + my @state = (0 .. 255); + my ($i, $j) = (0, 0); + while ($i < 256) { + my $st = $state[$i]; + $j = ($j + $st + $key[$i % scalar(@key)]) & 0xff; + $state[$i++] = $state[$j]; + $state[$j] = $st; + } + return { State => \@state, XY => [ 0, 0 ] }; +} + +#------------------------------------------------------------------------------ +# Apply RC4 en/decryption (ref 2) +# Inputs: 0) data reference, 1) RC4 key hash reference or RC4 key string +# - can call this method directly with a key string, or with with the key +# reference returned by RC4Init +# - RC4 is a symmetric algorithm, so encryption is the same as decryption +sub RC4Crypt($$) +{ + my ($dataPt, $key) = @_; + $key = RC4Init($key) unless ref $key eq 'HASH'; + my $state = $$key{State}; + my ($x, $y) = @{$$key{XY}}; + + my @data = unpack('C*', $$dataPt); + foreach (@data) { + $x = ($x + 1) & 0xff; + my $stx = $$state[$x]; + $y = ($stx + $y) & 0xff; + my $sty = $$state[$x] = $$state[$y]; + $$state[$y] = $stx; + $_ ^= $$state[($stx + $sty) & 0xff]; + } + $$key{XY} = [ $x, $y ]; + $$dataPt = pack('C*', @data); +} + +#------------------------------------------------------------------------------ +# Update AES cipher with a bit of data +# Inputs: 0) data +# Returns: encrypted data +my $cipherMore; +sub CipherUpdate($) +{ + my $dat = shift; + my $pos = 0; + $dat = $cipherMore . $dat if length $dat; + while ($pos + 16 <= length($dat)) { + substr($dat,$pos,16) = Image::ExifTool::AES::Cipher(substr($dat,$pos,16)); + $pos += 16; + } + if ($pos < length $dat) { + $cipherMore = substr($dat,$pos); + $dat = substr($dat,0,$pos); + } else { + $cipherMore = ''; + } + return $dat; +} + +#------------------------------------------------------------------------------ +# Get encrypted hash +# Inputs: 0) Password, 1) salt, 2) vector, 3) encryption revision +# Returns: hash +sub GetHash($$$$) +{ + my ($password, $salt, $vector, $rev) = @_; + + # return Rev 5 hash + return Digest::SHA::sha256($password, $salt, $vector) if $rev == 5; + + # compute Rev 6 hardened hash + # (ref http://code.google.com/p/origami-pdf/source/browse/lib/origami/encryption.rb) + my $blockSize = 32; + my $input = Digest::SHA::sha256($password, $salt, $vector) . ("\0" x 32); + my $key = substr($input, 0, 16); + my $iv = substr($input, 16, 16); + my $h; + my $x = ''; + my $i = 0; + while ($i < 64 or $i < ord(substr($x,-1,1))+32) { + + my $block = substr($input, 0, $blockSize); + $x = ''; + Image::ExifTool::AES::Crypt(\$x, $key, $iv, 1); + $cipherMore = ''; + + my ($j, $digest); + for ($j=0; $j<64; ++$j) { + $x = ''; + $x .= CipherUpdate($password) if length $password; + $x .= CipherUpdate($block); + $x .= CipherUpdate($vector) if length $vector; + if ($j == 0) { + my @a = unpack('C16', $x); + my $sum = 0; + $sum += $_ foreach @a; + # set SHA block size (32, 48 or 64 bytes = SHA-256, 384 or 512) + $blockSize = 32 + ($sum % 3) * 16; + $digest = Digest::SHA->new($blockSize * 8); + } + $digest->add($x); + } + + $h = $digest->digest(); + $key = substr($h, 0, 16); + substr($input,0,16) = $h; + $iv = substr($h, 16, 16); + ++$i; + } + return substr($h, 0, 32); +} + +#------------------------------------------------------------------------------ +# Initialize decryption +# Inputs: 0) ExifTool object reference, 1) Encrypt dictionary reference, +# 2) ID from file trailer dictionary +# Returns: error string or undef on success (and sets $cryptInfo) +sub DecryptInit($$$) +{ + local $_; + my ($et, $encrypt, $id) = @_; + + undef $cryptInfo; + unless ($encrypt and ref $encrypt eq 'HASH') { + return 'Error loading Encrypt object'; + } + my $filt = $$encrypt{Filter}; + unless ($filt and $filt =~ s/^\///) { + return 'Encrypt dictionary has no Filter!'; + } + # extract some interesting tags + my $ver = $$encrypt{V} || 0; + my $rev = $$encrypt{R} || 0; + my $enc = "$filt V$ver"; + $enc .= ".$rev" if $filt eq 'Standard'; + $enc .= " ($1)" if $$encrypt{SubFilter} and $$encrypt{SubFilter} =~ /^\/(.*)/; + $enc .= ' (' . ($$encrypt{Length} || 40) . '-bit)' if $filt eq 'Standard'; + my $tagTablePtr = GetTagTable('Image::ExifTool::PDF::Encrypt'); + $et->HandleTag($tagTablePtr, 'Filter', $enc); + if ($filt ne 'Standard') { + return "Encryption filter $filt currently not supported"; + } elsif (not defined $$encrypt{R}) { + return 'Standard security handler missing revision'; + } + unless ($$encrypt{O} and $$encrypt{P} and $$encrypt{U}) { + return 'Incomplete Encrypt specification'; + } + if ("$ver.$rev" >= 5.6) { + # apologize for poor performance (AES is a pure Perl implementation) + $et->Warn('Decryption is very slow for encryption V5.6 or higher', 3); + } + $et->HandleTag($tagTablePtr, 'P', $$encrypt{P}); + + my %parm; # optional parameters extracted from Encrypt dictionary + + if ($ver == 1 or $ver == 2) { + $cryptString = $cryptStream = 1; + } elsif ($ver == 4 or $ver == 5) { + # initialize our $cryptString and $cryptStream flags + foreach ('StrF', 'StmF') { + my $flagPt = $_ eq 'StrF' ? \$cryptString : \$cryptStream; + $$flagPt = $$encrypt{$_}; + undef $$flagPt if $$flagPt and $$flagPt eq '/Identity'; + return "Unsupported $_ encryption $$flagPt" if $$flagPt and $$flagPt ne '/StdCF'; + } + if ($cryptString or $cryptStream) { + return 'Missing or invalid Encrypt StdCF entry' unless ref $$encrypt{CF} eq 'HASH' and + ref $$encrypt{CF}{StdCF} eq 'HASH' and $$encrypt{CF}{StdCF}{CFM}; + my $cryptMeth = $$encrypt{CF}{StdCF}{CFM}; + unless ($cryptMeth =~ /^\/(V2|AESV2|AESV3)$/) { + return "Unsupported encryption method $cryptMeth"; + } + # set "_aesv2" or "_aesv3" flag in %$encrypt hash if AES encryption was used + $$encrypt{'_' . lc($1)} = 1 if $cryptMeth =~ /^\/(AESV2|AESV3)$/; + } + if ($ver == 5) { + # validate OE and UE entries + foreach ('OE', 'UE') { + return "Missing Encrypt $_ entry" unless $$encrypt{$_}; + $parm{$_} = ReadPDFValue($$encrypt{$_}); + return "Invalid Encrypt $_ entry" unless length $parm{$_} == 32; + } + require Image::ExifTool::AES; # will need this later + } + } else { + return "Encryption version $ver currently not supported"; + } + $id or return "Can't decrypt (no document ID)"; + + # make sure we have the necessary libraries available + if ($ver < 5) { + unless (eval { require Digest::MD5 }) { + return "Install Digest::MD5 to process encrypted PDF"; + } + } else { + unless (eval { require Digest::SHA }) { + return "Install Digest::SHA to process AES-256 encrypted PDF"; + } + } + + # calculate file-level en/decryption key + my $pad = "\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08". + "\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A"; + my $o = ReadPDFValue($$encrypt{O}); + my $u = ReadPDFValue($$encrypt{U}); + + # set flag indicating whether metadata is encrypted + # (in version 4 and higher, metadata streams may not be encrypted) + if ($ver < 4 or not $$encrypt{EncryptMetadata} or $$encrypt{EncryptMetadata} !~ /false/i) { + $$encrypt{_meta} = 1; + } + # try no password first, then try provided password if available + my ($try, $key); + for ($try=0; ; ++$try) { + my $password; + if ($try == 0) { + $password = ''; + } elsif ($try == 1) { + $password = $et->Options('Password'); + return 'Document is password protected (use Password option)' unless defined $password; + # make sure there is no UTF-8 flag on the password + if ($] >= 5.006 and (eval { require Encode; Encode::is_utf8($password) } or $@)) { + # repack by hand if Encode isn't available + $password = $@ ? pack('C*',unpack($] < 5.010000 ? 'U0C*' : 'C0C*',$password)) : Encode::encode('utf8',$password); + } + } else { + return 'Incorrect password'; + } + if ($ver < 5) { + if (length $password) { + # password must be encoding in PDFDocEncoding (ref iso32000) + $password = $et->Encode($password, 'PDFDoc'); + # truncate or pad the password to exactly 32 bytes + if (length($password) > 32) { + $password = substr($password, 0, 32); + } elsif (length($password) < 32) { + $password .= substr($pad, 0, 32-length($password)); + } + } else { + $password = $pad; + } + $key = $password . $o . pack('V', $$encrypt{P}) . $id; + my $rep = 1; + if ($rev == 3 or $rev == 4) { + # must add this if metadata not encrypted + $key .= "\xff\xff\xff\xff" unless $$encrypt{_meta}; + $rep += 50; # repeat MD5 50 more times if revision is 3 or greater + } + my ($len, $i, $dat); + if ($ver == 1) { + $len = 5; + } else { + $len = $$encrypt{Length} || 40; + $len >= 40 or return 'Bad Encrypt Length'; + $len = int($len / 8); + } + for ($i=0; $i<$rep; ++$i) { + $key = substr(Digest::MD5::md5($key), 0, $len); + } + # decrypt U to see if a user password is required + if ($rev >= 3) { + $dat = Digest::MD5::md5($pad . $id); + RC4Crypt(\$dat, $key); + for ($i=1; $i<=19; ++$i) { + my @key = unpack('C*', $key); + foreach (@key) { $_ ^= $i; } + RC4Crypt(\$dat, pack('C*', @key)); + } + $dat .= substr($u, 16); + } else { + $dat = $pad; + RC4Crypt(\$dat, $key); + } + last if $dat eq $u; # all done if this was the correct key + } else { + return 'Invalid O or U Encrypt entries' if length($o) < 48 or length($u) < 48; + if (length $password) { + # Note: this should be good for passwords containing reasonable characters, + # but to be bullet-proof we need to apply the SASLprep (IETF RFC 4013) profile + # of stringprep (IETF RFC 3454) to the password before encoding in UTF-8 + $password = $et->Encode($password, 'UTF8'); + $password = substr($password, 0, 127) if length($password) > 127; + } + # test for the owner password + my $sha = GetHash($password, substr($o,32,8), substr($u,0,48), $rev); + if ($sha eq substr($o, 0, 32)) { + $key = GetHash($password, substr($o,40,8), substr($u,0,48), $rev); + my $dat = ("\0" x 16) . $parm{OE}; + # decrypt with no padding + my $err = Image::ExifTool::AES::Crypt(\$dat, $key, 0, 1); + return $err if $err; + $key = $dat; # use this as the file decryption key + last; + } + # test for the user password + $sha = GetHash($password, substr($u,32,8), '', $rev); + if ($sha eq substr($u, 0, 32)) { + $key = GetHash($password, substr($u,40,8), '', $rev); + my $dat = ("\0" x 16) . $parm{UE}; + my $err = Image::ExifTool::AES::Crypt(\$dat, $key, 0, 1); + return $err if $err; + $key = $dat; # use this as the file decryption key + last; + } + } + } + $$encrypt{_key} = $key; # save the file-level encryption key + $cryptInfo = $encrypt; # save reference to the file-level Encrypt object + return undef; # success! +} + +#------------------------------------------------------------------------------ +# Decrypt/Encrypt data +# Inputs: 0) data ref +# 1) PDF object reference to use as crypt key extension (may be 'none' to +# avoid extending the encryption key, as for streams with Crypt Filter) +# 2) encrypt flag (false for decryption) +sub Crypt($$;$) +{ + return unless $cryptInfo; + my ($dataPt, $keyExt, $encrypt) = @_; + # do not decrypt if the key extension object is undefined + # (this doubles as a flag to disable decryption/encryption) + return unless defined $keyExt; + my $key = $$cryptInfo{_key}; + # apply the necessary crypt key extension + unless ($$cryptInfo{_aesv3}) { + unless ($keyExt eq 'none') { + # extend crypt key using object and generation number + unless ($keyExt =~ /^(I\d+ )?(\d+) (\d+)/) { + $$cryptInfo{_error} = 'Invalid object reference for encryption'; + return; + } + $key .= substr(pack('V', $2), 0, 3) . substr(pack('V', $3), 0, 2); + } + # add AES-128 salt if necessary (this little gem is conveniently + # omitted from the Adobe PDF 1.6 documentation, causing me to + # waste 12 hours trying to figure out why this wasn't working -- + # it appears in ISO32000 though, so I should have been using that) + $key .= 'sAlT' if $$cryptInfo{_aesv2}; + my $len = length($key); + $key = Digest::MD5::md5($key); # get 16-byte MD5 digest + $key = substr($key, 0, $len) if $len < 16; # trim if necessary + } + # perform the decryption/encryption + if ($$cryptInfo{_aesv2} or $$cryptInfo{_aesv3}) { + require Image::ExifTool::AES; + my $err = Image::ExifTool::AES::Crypt($dataPt, $key, $encrypt); + $err and $$cryptInfo{_error} = $err; + } else { + RC4Crypt($dataPt, $key); + } +} + +#------------------------------------------------------------------------------ +# Decrypt/Encrypt stream data +# Inputs: 0) dictionary ref, 1) PDF object reference to use as crypt key extension +sub CryptStream($$) +{ + return unless $cryptStream; + my ($dict, $keyExt) = @_; + my $type = $$dict{Type} || ''; + # XRef streams are not encrypted (ref 3, page 50), + # and Metadata may or may not be encrypted + if ($cryptInfo and $type ne '/XRef' and + ($$cryptInfo{_meta} or $type ne '/Metadata')) + { + Crypt(\$$dict{_stream}, $keyExt, $$dict{_decrypted}); + # toggle _decrypted flag + $$dict{_decrypted} = ($$dict{_decrypted} ? undef : 1); + } else { + $$dict{_decrypted} = 0; # stream should never be encrypted + } +} + +#------------------------------------------------------------------------------ +# Generate a new PDF tag (based on its ID) and add it to a tag table +# Inputs: 0) tag table ref, 1) tag ID +# Returns: tag info ref +sub NewPDFTag($$) +{ + my ($tagTablePtr, $tag) = @_; + my $name = $tag; + # translate URL-like escape sequences + $name =~ s/#([0-9a-f]{2})/chr(hex($1))/ige; + $name =~ s/[^-\w]+/_/g; # translate invalid characters to an underline + $name =~ s/(^|_)([a-z])/\U$2/g; # start words with upper case + my $tagInfo = { Name => $name }; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + return $tagInfo; +} + +#------------------------------------------------------------------------------ +# Process AcroForm dictionary to set HasXMLFormsArchitecture flag +# Inputs: Same as ProcessDict +sub ProcessAcroForm($$$$;$$) +{ + my ($et, $tagTablePtr, $dict, $xref, $nesting, $type) = @_; + $et->HandleTag($tagTablePtr, '_has_xfa', $$dict{XFA} ? 'true' : 'false'); + return ProcessDict($et, $tagTablePtr, $dict, $xref, $nesting, $type); +} + +#------------------------------------------------------------------------------ +# Expand array into a string +# Inputs: 0) array ref +# Return: string +sub ExpandArray($) +{ + my $val = shift; + my @list = @$val; + foreach (@list) { + ref $_ eq 'SCALAR' and $_ = "ref($$_)", next; + ref $_ eq 'ARRAY' and $_ = ExpandArray($_), next; + defined $_ or $_ = '<undef>', next; + } + return '[' . join(',',@list) . ']'; +} + +#------------------------------------------------------------------------------ +# Process PDF dictionary extract tag values +# Inputs: 0) ExifTool object reference, 1) tag table reference +# 2) dictionary reference, 3) cross-reference table reference, +# 4) nesting depth, 5) dictionary capture type +sub ProcessDict($$$$;$$) +{ + my ($et, $tagTablePtr, $dict, $xref, $nesting, $type) = @_; + my $verbose = $et->Options('Verbose'); + my $unknown = $$tagTablePtr{EXTRACT_UNKNOWN}; + my $embedded = (defined $unknown and not $unknown and $et->Options('ExtractEmbedded')); + my @tags = @{$$dict{_tags}}; + my ($next, %join); + my $index = 0; + + $nesting = ($nesting || 0) + 1; + if ($nesting > 50) { + $et->WarnOnce('Nesting too deep (directory ignored)'); + return; + } + # save entire dictionary for rewriting if specified + if ($$et{PDF_CAPTURE} and $$tagTablePtr{VARS} and + $tagTablePtr->{VARS}->{CAPTURE}) + { + my $name; + foreach $name (@{$tagTablePtr->{VARS}->{CAPTURE}}) { + next if $$et{PDF_CAPTURE}{$name}; + # make sure we load the right type if indicated + next if $type and $type ne $name; + $$et{PDF_CAPTURE}{$name} = $dict; + last; + } + } +# +# extract information from all tags in the dictionary +# + for (;;) { + my ($tag, $isSubDoc); + if (@tags) { + $tag = shift @tags; + } elsif (defined $next and not $next) { + $tag = 'Next'; + $next = 1; + } else { + last; + } + my $val = $$dict{$tag}; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($tagInfo) { + undef $tagInfo if $$tagInfo{NoProcess}; + } elsif ($embedded and $tag =~ /^(.*?)(\d+)$/ and + $$tagTablePtr{$1} and (ref $val ne 'SCALAR' or not $fetched{$$val})) + { + my ($name, $num) = ($1, $2); + $tagInfo = $et->GetTagInfo($tagTablePtr, $name); + if (ref $tagInfo eq 'HASH' and $$tagInfo{JoinStreams}) { + $fetched{$$val} = 1; + my $obj = FetchObject($et, $$val, $xref, $tag); + $join{$name} = [] unless $join{$name}; + next unless ref $obj eq 'HASH' and $$obj{_stream}; + # save all the stream data to join later + DecodeStream($et, $obj); + $join{$name}->[$num] = $$obj{_stream}; + undef $tagInfo; # don't process + } else { + $isSubDoc = 1; # treat as a sub-document + } + } + if ($verbose) { + my ($val2, $extra); + if (ref $val eq 'SCALAR') { + $extra = ", indirect object ($$val)"; + if ($fetched{$$val}) { + $val2 = "ref($$val)"; + } elsif ($tag eq 'Next' and not $next) { + # handle 'Next' links after all others + $next = 0; + next; + } else { + $fetched{$$val} = 1; + $val = FetchObject($et, $$val, $xref, $tag); + unless (defined $val) { + my $str; + if (defined $lastOffset) { + $val2 = '<free>'; + $str = 'Object was freed'; + } else { + $val2 = '<err>'; + $str = 'Error reading object'; + } + $et->VPrint(0, "$$et{INDENT}${str}:\n"); + } + } + } elsif (ref $val eq 'HASH') { + $extra = ', direct dictionary'; + } elsif (ref $val eq 'ARRAY') { + $extra = ', direct array of ' . scalar(@$val) . ' objects'; + } else { + $extra = ', direct object'; + } + my $isSubdir; + if (ref $val eq 'HASH') { + $isSubdir = 1; + } elsif (ref $val eq 'ARRAY') { + # recurse into objects in arrays only if they are lists of + # dictionaries or indirect objects which could be dictionaries + $isSubdir = 1 if @$val; + foreach (@$val) { + next if ref $_ eq 'HASH' or ref $_ eq 'SCALAR'; + undef $isSubdir; + last; + } + } + if ($isSubdir) { + # create bogus subdirectory to recurse into this dict + $tagInfo or $tagInfo = { + Name => $tag, + SubDirectory => { TagTable => 'Image::ExifTool::PDF::Unknown' }, + }; + } else { + $val2 = ExpandArray($val) if ref $val eq 'ARRAY'; + # generate tag info if we will use it later + if (not $tagInfo and defined $val and $unknown) { + $tagInfo = NewPDFTag($tagTablePtr, $tag); + } + } + $et->VerboseInfo($tag, $tagInfo, + Value => $val2 || $val, + Extra => $extra, + Index => $index++, + ); + next unless defined $val; + } + unless ($tagInfo) { + # add any tag found in Info dictionary to table + next unless $unknown; + $tagInfo = NewPDFTag($tagTablePtr, $tag); + } + # increment document number if necessary + my ($oldDocNum, $oldNumTags); + if ($isSubDoc) { + $oldDocNum = $$et{DOC_NUM}; + $oldNumTags = $$et{NUM_FOUND}; + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + } + if ($$tagInfo{SubDirectory}) { + # process the subdirectory + my @subDicts; + if (ref $val eq 'ARRAY') { + # hack to convert array to dictionary if necessary + if ($$tagInfo{ConvertToDict} and @$val == 2 and not ref $$val[0]) { + my $tg = $$val[0]; + $tg =~ s(^/)(); # remove name + my %dict = ( _tags => [ $tg ], $tg => $$val[1] ); + @subDicts = ( \%dict ); + } else { + @subDicts = @{$val}; + } + } else { + @subDicts = ( $val ); + } + # loop through all values of this tag + for (;;) { + my $subDict = shift @subDicts or last; + # save last fetched object in case we fetch another one here + my $prevFetched = $lastFetched; + if (ref $subDict eq 'SCALAR') { + # only fetch once (other copies are obsolete) + next if $fetched{$$subDict}; + if ($$tagInfo{IgnoreDuplicates}) { + my $flag = "ProcessedPDF_$tag"; + if ($$et{$flag}) { + next if $et->WarnOnce("Ignored duplicate $tag dictionary", 2); + } else { + $$et{$flag} = 1; + } + } + # load dictionary via an indirect reference + $fetched{$$subDict} = 1; + my $obj = FetchObject($et, $$subDict, $xref, $tag); + unless (defined $obj) { + unless (defined $lastOffset) { + $et->Warn("Error reading $tag object ($$subDict)"); + } + next; + } + $subDict = $obj; + } + if (ref $subDict eq 'ARRAY') { + # convert array of key/value pairs to a hash + next if @$subDict < 2; + my %hash = ( _tags => [] ); + while (@$subDict >= 2) { + my $key = shift @$subDict; + $key =~ s/^\///; + push @{$hash{_tags}}, $key; + $hash{$key} = shift @$subDict; + } + $subDict = \%hash; + } else { + next unless ref $subDict eq 'HASH'; + } + # set flag to re-crypt all strings when rewriting if the dictionary + # came from an encrypted stream + $$subDict{_needCrypt}{'*'} = 1 unless $lastFetched; + my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + if (not $verbose) { + my $proc = $$subTablePtr{PROCESS_PROC} || \&ProcessDict; + &$proc($et, $subTablePtr, $subDict, $xref, $nesting); + } elsif ($next) { + # handle 'Next' links at this level to avoid deep recursion + undef $next; + $index = 0; + $tagTablePtr = $subTablePtr; + $dict = $subDict; + @tags = @{$$subDict{_tags}}; + $et->VerboseDir($tag, scalar(@tags)); + } else { + my $oldIndent = $$et{INDENT}; + my $oldDir = $$et{DIR_NAME}; + $$et{INDENT} .= '| '; + $$et{DIR_NAME} = $tag; + $et->VerboseDir($tag, scalar(@{$$subDict{_tags}})); + ProcessDict($et, $subTablePtr, $subDict, $xref, $nesting); + $$et{INDENT} = $oldIndent; + $$et{DIR_NAME} = $oldDir; + } + $lastFetched = $prevFetched; + } + } else { + # fetch object if necessary + # (OS X 10.6 writes indirect objects in the Info dictionary!) + if (ref $val eq 'SCALAR') { + my $prevFetched = $lastFetched; + # (note: fetching the same object multiple times is OK here) + $val = FetchObject($et, $$val, $xref, $tag); + if (defined $val) { + $val = ReadPDFValue($val); + # set flag to re-encrypt if necessary if rewritten + $$dict{_needCrypt}{$tag} = ($lastFetched ? 0 : 1) if $cryptString; + $lastFetched = $prevFetched; # restore last fetched object reference + } + } else { + $val = ReadPDFValue($val); + } + if (ref $val) { + if (ref $val eq 'ARRAY') { + delete $$et{LIST_TAGS}{$tagInfo} if $$tagInfo{List}; + my $v; + foreach $v (@$val) { + $et->FoundTag($tagInfo, $v); + } + } + } elsif (defined $val) { + # convert from UTF-16 (big endian) to UTF-8 or Latin if necessary + # unless this is binary data (hex-encoded strings would not have been converted) + my $format = $$tagInfo{Format} || $$tagInfo{Writable} || 'string'; + $val = ConvertPDFDate($val) if $format eq 'date'; + if (not $$tagInfo{Binary} and $val =~ /[\x18-\x1f\x80-\xff]/) { + # text string is already in Unicode if it starts with "\xfe\xff", + # otherwise we must first convert from PDFDocEncoding + $val = $et->Decode($val, ($val=~s/^\xfe\xff// ? 'UCS2' : 'PDFDoc'), 'MM'); + } + if ($$tagInfo{List} and not $$et{OPTIONS}{NoPDFList}) { + # separate tokens in comma or whitespace delimited lists + my @values = ($val =~ /,/) ? split /,+\s*/, $val : split ' ', $val; + foreach $val (@values) { + $et->FoundTag($tagInfo, $val); + } + } else { + # a simple tag value + $et->FoundTag($tagInfo, $val); + } + } + } + if ($isSubDoc) { + # restore original document number + $$et{DOC_NUM} = $oldDocNum; + --$$et{DOC_COUNT} if $oldNumTags == $$et{NUM_FOUND}; + } + } +# +# extract information from joined streams if necessary +# + + if (%join) { + my ($tag, $i); + foreach $tag (sort keys %join) { + my $list = $join{$tag}; + last unless defined $$list[1] and $$list[1] =~ /^%.*?([\x0d\x0a]*)/; + my $buff = "%!PS-Adobe-3.0$1"; # add PS header with same line break + for ($i=1; defined $$list[$i]; ++$i) { + $buff .= $$list[$i]; + undef $$list[$i]; # free memory + } + # increment document number for tags extracted from embedded EPS + my $oldDocNum = $$et{DOC_NUM}; + my $oldNumTags = $$et{NUM_FOUND}; + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + # extract PostScript information + $et->HandleTag($tagTablePtr, $tag, $buff); + $$et{DOC_NUM} = $oldDocNum; + # revert document counter if we didn't add any new tags + --$$et{DOC_COUNT} if $oldNumTags == $$et{NUM_FOUND}; + delete $$et{DOC_NUM}; + } + } +# +# extract information from stream object if it exists (eg. Metadata stream) +# + for (;;) { # (cheap goto) + last unless $$dict{_stream}; + my $tag = '_stream'; + # add Subtype (if it exists) to stream name and remove leading '/' + ($tag = $$dict{Subtype} . $tag) =~ s/^\/// if $$dict{Subtype}; + last unless $$tagTablePtr{$tag}; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag) or last; + unless ($$tagInfo{SubDirectory}) { + # don't build filter lists across different images + delete $$et{LIST_TAGS}{$$tagTablePtr{Filter}}; + # we arrive here only when extracting embedded images + # - only extract known image types and ignore others + my $filter = $$dict{Filter} || ''; + $filter = @$filter[-1] if ref $filter eq 'ARRAY'; # (get last Filter type) + my $result; + if ($filter eq '/DCTDecode' or $filter eq '/JPXDecode') { + DecodeStream($et, $dict) or last; + # save the image itself + $et->FoundTag($tagInfo, \$$dict{_stream}); + # extract information from embedded image + $result = $et->ExtractInfo(\$$dict{_stream}, { ReEntry => 1 }); + } + unless ($result) { + $et->FoundTag('FileType', defined $result ? '(unknown)' : '(unsupported)'); + } + last; + } + # decode stream if necessary + DecodeStream($et, $dict) or last; + if ($verbose > 2) { + $et->VPrint(2,"$$et{INDENT}$$et{DIR_NAME} stream data\n"); + $et->VerboseDump(\$$dict{_stream}); + } + # extract information from stream + my %dirInfo = ( + DataPt => \$$dict{_stream}, + DataLen => length $$dict{_stream}, + DirStart => 0, + DirLen => length $$dict{_stream}, + Parent => 'PDF', + ); + my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + unless ($et->ProcessDirectory(\%dirInfo, $subTablePtr)) { + $et->Warn("Error processing $$tagInfo{Name} information"); + } + last; + } +} + +#------------------------------------------------------------------------------ +# Extract information from PDF file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 0 if not a PDF file, 1 on success, otherwise a negative error number +sub ReadPDF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my ($buff, $encrypt, $id); +# +# validate PDF file +# + # (linearization dictionary must be in the first 1024 bytes of the file) + $raf->Read($buff, 1024) >= 8 or return 0; + $buff =~ /^(\s*)%PDF-(\d+\.\d+)/ or return 0; + $$et{PDFBase} = length $1 and $et->Warn('PDF header is not at start of file',1); + $pdfVer = $2; + $et->SetFileType(); # set the FileType tag + $et->Warn("The PDF $pdfVer specification is held hostage by the ISO") if $pdfVer >= 2.0; + # store PDFVersion tag + my $tagTablePtr = GetTagTable('Image::ExifTool::PDF::Root'); + $et->HandleTag($tagTablePtr, 'Version', $pdfVer); + $tagTablePtr = GetTagTable('Image::ExifTool::PDF::Main'); +# +# check for a linearized PDF (only if reading) +# + my $capture = $$et{PDF_CAPTURE}; + unless ($capture) { + my $lin = 'false'; + if ($buff =~ /<</g) { + $buff = substr($buff, pos($buff) - 2); + my $dict = ExtractObject($et, \$buff); + if (ref $dict eq 'HASH' and $$dict{Linearized} and $$dict{L}) { + if (not $$et{VALUE}{FileSize}) { + undef $lin; # can't determine if it is linearized + } elsif ($$dict{L} == $$et{VALUE}{FileSize} - $$et{PDFBase}) { + $lin = 'true'; + } + } + } + $et->HandleTag($tagTablePtr, '_linearized', $lin) if $lin; + } +# +# read the xref tables referenced from startxref at the end of the file +# + my @xrefOffsets; + $raf->Seek(0, 2) or return -2; + # the %%EOF must occur within the last 1024 bytes of the file (PDF spec, appendix H) + my $len = $raf->Tell(); + $len = 1024 if $len > 1024; + $raf->Seek(-$len, 2) or return -2; + $raf->Read($buff, $len) == $len or return -3; + # find the LAST xref table in the file (may be multiple %%EOF marks, + # and comments between "startxref" and "%%EOF") + $buff =~ /^.*startxref(\s+)(\d+)(\s+)(%[^\x0d\x0a]*\s+)*%%EOF/s or return -4; + my $ws = $1 . $3; + my $xr = $2; + push @xrefOffsets, $xr, 'Main'; + # set input record separator + local $/ = $ws =~ /(\x0d\x0a|\x0d|\x0a)/ ? $1 : "\x0a"; + my (%xref, @mainDicts, %loaded, $mainFree); + my ($xrefSize, $mainDictSize) = (0, 0); + # initialize variables to capture when rewriting + if ($capture) { + $capture->{startxref} = $xr; + $capture->{xref} = \%xref; + $capture->{newline} = $/; + $capture->{mainFree} = $mainFree = { }; + } +XRef: + while (@xrefOffsets) { + my $offset = shift @xrefOffsets; + my $type = shift @xrefOffsets; + next if $loaded{$offset}; # avoid infinite recursion + unless ($raf->Seek($offset+$$et{PDFBase}, 0)) { + %loaded or return -5; + $et->Warn('Bad offset for secondary xref table'); + next; + } + # Note: care must be taken because ReadLine may read more than we want if + # the newline sequence for this table is different than the rest of the file + for (;;) { + unless ($raf->ReadLine($buff)) { + %loaded or return -6; + $et->Warn('Bad offset for secondary xref table'); + next XRef; + } + last if $buff =~/\S/; # skip blank lines + } + my $loadXRefStream; + if ($buff =~ s/^\s*xref\s+//s) { + # load xref table + for (;;) { + # read another line if necessary (skipping blank lines) + $raf->ReadLine($buff) or return -6 until $buff =~ /\S/; + last if $buff =~ s/^\s*trailer([\s<[(])/$1/s; + $buff =~ s/^\s*(\d+)\s+(\d+)\s+//s or return -4; + my ($start, $num) = ($1, $2); + $raf->Seek(-length($buff), 1) or return -4; + my $i; + for ($i=0; $i<$num; ++$i) { + $raf->Read($buff, 20) == 20 or return -6; + $buff =~ /^\s*(\d{10}) (\d{5}) (f|n)/s or return -4; + my $num = $start + $i; + $xrefSize = $num if $num > $xrefSize; + # locate object to generate entry from stream if necessary + # (must do this before we test $xref{$num}) + LocateAnyObject(\%xref, $num) if $xref{dicts}; + # save offset for newest copy of all objects + # (or next object number for free objects) + unless (defined $xref{$num}) { + my ($offset, $gen) = (int($1), int($2)); + $xref{$num} = $offset; + if ($3 eq 'f') { + # save free objects in last xref table for rewriting + $$mainFree{$num} = [ $offset, $gen, 'f' ] if $mainFree; + next; + } + # also save offset keyed by object reference string + $xref{"$num $gen R"} = $offset; + } + } + # (I have a sample from Adobe which has an empty xref table) + # %xref or return -4; # xref table may not be empty + $buff = ''; + } + undef $mainFree; # only do this for the last xref table + } elsif ($buff =~ s/^\s*(\d+)\s+(\d+)\s+obj//s) { + # this is a PDF-1.5 cross-reference stream dictionary + $loadXRefStream = 1; + } else { + %loaded or return -4; + $et->Warn('Invalid secondary xref table'); + next; + } + my $mainDict = ExtractObject($et, \$buff, $raf, \%xref); + unless (ref $mainDict eq 'HASH') { + %loaded or return -8; + $et->Warn('Error loading secondary dictionary'); + next; + } + # keep track of total trailer dictionary Size + $mainDictSize = $$mainDict{Size} if $$mainDict{Size} and $$mainDict{Size} > $mainDictSize; + if ($loadXRefStream) { + # decode and save our XRef stream from PDF-1.5 file + # (but parse it later as required to save time) + # Note: this technique can potentially result in an old object + # being used if the file was incrementally updated and an older + # object from an xref table was replaced by a newer object in an + # xref stream. But doing so isn't a good idea (if allowed at all) + # because a PDF 1.4 consumer would also make this same mistake. + if ($$mainDict{Type} eq '/XRef' and $$mainDict{W} and + @{$$mainDict{W}} > 2 and $$mainDict{Size} and + DecodeStream($et, $mainDict)) + { + # create Index entry if it doesn't exist + $$mainDict{Index} or $$mainDict{Index} = [ 0, $$mainDict{Size} ]; + # create '_entry_size' entry for internal use + my $w = $$mainDict{W}; + my $size = 0; + foreach (@$w) { $size += $_; } + $$mainDict{_entry_size} = $size; + # save this stream dictionary to use later if required + $xref{dicts} = [] unless $xref{dicts}; + push @{$xref{dicts}}, $mainDict; + } else { + %loaded or return -9; + $et->Warn('Invalid xref stream in secondary dictionary'); + } + } + $loaded{$offset} = 1; + # load XRef stream in hybrid file if it exists + push @xrefOffsets, $$mainDict{XRefStm}, 'XRefStm' if $$mainDict{XRefStm}; + $encrypt = $$mainDict{Encrypt} if $$mainDict{Encrypt}; + undef $encrypt if $encrypt and $encrypt eq 'null'; # (have seen "null") + if ($$mainDict{ID} and ref $$mainDict{ID} eq 'ARRAY') { + $id = ReadPDFValue($mainDict->{ID}->[0]); + } + push @mainDicts, $mainDict, $type; + # load previous xref table if it exists + push @xrefOffsets, $$mainDict{Prev}, 'Prev' if $$mainDict{Prev}; + } + if ($xrefSize > $mainDictSize) { + my $str = "Objects in xref table ($xrefSize) exceed trailer dictionary Size ($mainDictSize)"; + $capture ? $et->Error($str) : $et->Warn($str); + } +# +# extract encryption information if necessary +# + if ($encrypt) { + if (ref $encrypt eq 'SCALAR') { + $encrypt = FetchObject($et, $$encrypt, \%xref, 'Encrypt'); + } + # generate Encryption tag information + my $err = DecryptInit($et, $encrypt, $id); + if ($err) { + $et->Warn($err); + $$capture{Error} = $err if $capture; + return -1; + } + } +# +# extract the information beginning with each of the main dictionaries +# + my $i = 0; + my $num = (scalar @mainDicts) / 2; + while (@mainDicts) { + my $dict = shift @mainDicts; + my $type = shift @mainDicts; + if ($verbose) { + ++$i; + my $n = scalar(@{$$dict{_tags}}); + $et->VPrint(0, "PDF dictionary ($i of $num) with $n entries:\n"); + } + ProcessDict($et, $tagTablePtr, $dict, \%xref, 0, $type); + } + # handle any decryption errors + if ($encrypt) { + my $err = $$encrypt{_error}; + if ($err) { + $et->Warn($err); + $$capture{Error} = $err if $capture; + return -1; + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# ReadPDF() warning strings for each error return value +my %pdfWarning = ( + # -1 is reserved as error return value with no associated warning + -2 => 'Error seeking in file', + -3 => 'Error reading file', + -4 => 'Invalid xref table', + -5 => 'Invalid xref offset', + -6 => 'Error reading xref table', + -7 => 'Error reading trailer', + -8 => 'Error reading main dictionary', + -9 => 'Invalid xref stream in main dictionary', +); + +#------------------------------------------------------------------------------ +# Extract information from PDF file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 if this was a valid PDF file +sub ProcessPDF($$) +{ + my ($et, $dirInfo) = @_; + + undef $cryptInfo; # (must not delete after returning so writer can use it) + undef $cryptStream; + undef $cryptString; + my $result = ReadPDF($et, $dirInfo); + if ($result < 0) { + $et->Warn($pdfWarning{$result}) if $pdfWarning{$result}; + $result = 1; + } + # clean up and return + undef %streamObjs; + undef %fetched; + return $result; +} + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::PDF - Read PDF meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This code reads meta information from PDF (Adobe Portable Document Format) +files. It supports object streams introduced in PDF-1.5 but only with a +limited set of Filter and Predictor algorithms, however all standard +encryption methods through PDF-1.7 extension level 3 are supported, +including AESV2 (AES-128) and AESV3 (AES-256). + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://partners.adobe.com/public/developer/pdf/index_reference.html> + +=item L<Crypt::RC4|Crypt::RC4> + +=item L<http://www.adobe.com/devnet/acrobat/pdfs/PDF32000_2008.pdf> + +=item L<http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/adobe_supplement_iso32000.pdf> + +=item L<http://tools.ietf.org/search/rfc3454> + +=item L<http://www.armware.dk/RFC/rfc/rfc4013.html> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PDF Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/PGF.pm b/lib/Image/ExifTool/PGF.pm new file mode 100644 index 0000000..15fbf89 --- /dev/null +++ b/lib/Image/ExifTool/PGF.pm @@ -0,0 +1,143 @@ +#------------------------------------------------------------------------------ +# File: PGF.pm +# +# Description: Read Progressive Graphics File meta information +# +# Revisions: 2011/01/25 - P. Harvey Created +# +# References: 1) http://www.libpgf.org/ +# 2) http://www.exiv2.org/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::PGF; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.02'; + +# PGF header information +%Image::ExifTool::PGF::Main = ( + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + PRIORITY => 2, # (to take precedence over PNG tags from embedded image) + NOTES => q{ + The following table lists information extracted from the header of + Progressive Graphics File (PGF) images. As well, information is extracted + from the embedded PNG metadata image if it exists. See + L<http://www.libpgf.org/> for the PGF specification. + }, + 3 => { + Name => 'PGFVersion', + PrintConv => 'sprintf("0x%.2x", $val)', + # this is actually a bitmask (ref digikam PGFtypes.h): + # 0x02 - data structure PGFHeader of major version 2 + # 0x04 - 32-bit values + # 0x08 - supports regions of interest + # 0x10 - new coding scheme since major version 5 + # 0x20 - new HeaderSize: 32 bits instead of 16 bits + }, + 8 => { Name => 'ImageWidth', Format => 'int32u' }, + 12 => { Name => 'ImageHeight', Format => 'int32u' }, + 16 => 'PyramidLevels', + 17 => 'Quality', + 18 => 'BitsPerPixel', + 19 => 'ColorComponents', + 20 => { + Name => 'ColorMode', + RawConv => '$$self{PGFColorMode} = $val', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Bitmap', + 1 => 'Grayscale', + 2 => 'Indexed', + 3 => 'RGB', + 4 => 'CMYK', + 7 => 'Multichannel', + 8 => 'Duotone', + 9 => 'Lab', + }, + }, + 21 => { Name => 'BackgroundColor', Format => 'int8u[3]' }, +); + +#------------------------------------------------------------------------------ +# Extract information from a PGF image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid PGF file +sub ProcessPGF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + + # read header and check magic number + return 0 unless $raf->Read($buff, 24) == 24 and $buff =~ /^PGF(.)/s; + my $ver = ord $1; + $et->SetFileType(); + SetByteOrder('II'); + + # currently support only version 0x36 + unless ($ver == 0x36) { + $et->Error(sprintf('Unsupported PGF version 0x%.2x', $ver)); + return 1; + } + # extract information from the PGF header + my $tagTablePtr = GetTagTable('Image::ExifTool::PGF::Main'); + $et->ProcessDirectory({ DataPt => \$buff, DataPos => 0 }, $tagTablePtr); + + my $len = Get32u(\$buff, 4) - 16; # length of post-header data + + # skip colour table if necessary + $len -= $raf->Seek(1024, 1) ? 1024 : $len if $$et{PGFColorMode} == 2; + + # extract information from the embedded metadata image (PNG format) + if ($len > 0 and $len < 0x1000000 and $raf->Read($buff, $len) == $len) { + $et->ExtractInfo(\$buff, { ReEntry => 1 }); + } + return 1; +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::PGF - Read Progressive Graphics File meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from Progressive Graphics File (PGF) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.libpgf.org/> + +=item L<http://www.exiv2.org/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PGF Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/PICT.pm b/lib/Image/ExifTool/PICT.pm new file mode 100644 index 0000000..5dcde5d --- /dev/null +++ b/lib/Image/ExifTool/PICT.pm @@ -0,0 +1,1260 @@ +#------------------------------------------------------------------------------ +# File: PICT.pm +# +# Description: Read PICT meta information +# +# Revisions: 10/10/2005 - P. Harvey Created +# +# Notes: Extraction of PICT opcodes is still experimental +# +# - size difference in PixPat color table?? (imagemagick reads only 1 long per entry) +# - other differences in the way imagemagick reads 16-bit images +# +# References: 1) http://developer.apple.com/documentation/mac/QuickDraw/QuickDraw-2.html +# 2) http://developer.apple.com/documentation/QuickTime/INMAC/QT/iqImageCompMgr.a.htm +#------------------------------------------------------------------------------ + +package Image::ExifTool::PICT; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.05'; + +sub ReadPictValue($$$;$); + +my ($vers, $extended); # PICT version number, and extended flag +my ($verbose, $out, $indent); # used in verbose mode + +# ranges of reserved opcodes. +# opcodes at the start of each range must be defined in the tag table +my @reserved = ( + 0x0017 => 0x0019, 0x0024 => 0x0027, 0x0035 => 0x0037, 0x003d => 0x003f, + 0x0045 => 0x0047, 0x004d => 0x004f, 0x0055 => 0x0057, 0x005d => 0x005f, + 0x0065 => 0x0067, 0x006d => 0x006f, 0x0075 => 0x0077, 0x007d => 0x007f, + 0x0085 => 0x0087, 0x008d => 0x008f, 0x0092 => 0x0097, 0x00a2 => 0x00af, + 0x00b0 => 0x00cf, 0x00d0 => 0x00fe, 0x0100 => 0x01ff, 0x0300 => 0x0bfe, + 0x0c01 => 0x7eff, 0x7f00 => 0x7fff, 0x8000 => 0x80ff, 0x8100 => 0x81ff, + 0x8201 => 0xffff, +); + +# Apple data structures in PICT images +my %structs = ( + Arc => [ + rect => 'Rect', + startAng => 'int16s', + arcAng => 'int16s', + ], + BitMap => [ + # (no baseAddr) + rowBytes => 'int16u', + bounds => 'Rect', + ], + # BitsRect data for PICT version 1 + BitsRect1 => [ + bitMap => 'BitMap', + srcRect => 'Rect', + dstRect => 'Rect', + mode => 'int16u', + dataSize => 'int16u', + bitData => 'binary[$val{dataSize}]', + ], + # BitsRect data for PICT version 2 + BitsRect2 => [ + pixMap => 'PixMap', + colorTable => 'ColorTable', + srcRect => 'Rect', + dstRect => 'Rect', + mode => 'int16u', + pixData => \ 'GetPixData($val{pixMap}, $raf)', + ], + # BitsRgn data for PICT version 1 + BitsRgn1 => [ + bitMap => 'BitMap', + srcRect => 'Rect', + dstRect => 'Rect', + mode => 'int16u', + maskRgn => 'Rgn', + dataSize => 'int16u', + bitData => 'binary[$val{dataSize}]', + ], + # BitsRgn data for PICT version 2 + BitsRgn2 => [ + pixMap => 'PixMap', + colorTable => 'ColorTable', + srcRect => 'Rect', + dstRect => 'Rect', + mode => 'int16u', + maskRgn => 'Rgn', + pixData => \ 'GetPixData($val{pixMap}, $raf)', + ], + ColorSpec => [ + value => 'int16u', + rgb => 'RGBColor', + ], + ColorTable => [ + ctSeed => 'int32u', + ctFlags => 'int16u', + ctSize => 'int16u', + ctTable => 'ColorSpec[$val{ctSize}+1]', + ], + # http://developer.apple.com/documentation/QuickTime/INMAC/QT/iqImageCompMgr.a.htm + CompressedQuickTime => [ + size => 'int32u', # size NOT including size word + version => 'int16u', + matrix => 'int32u[9]', + matteSize => 'int32u', + matteRect => 'Rect', + mode => 'int16u', + srcRect => 'Rect', + accuracy => 'int32u', + maskSize => 'int32u', + matteDescr => 'Int32uData[$val{matteSize} ? 1 : 0]', + matteData => 'int8u[$val{matteSize}]', + maskRgn => 'int8u[$val{maskSize}]', + imageDescr => 'ImageDescription', + # size should be $val{imageDescr}->{dataSize}, but this is unreliable + imageData => q{binary[$val{size} - 68 - $val{maskSize} - $val{imageDescr}->{size} - + ($val{matteSize} ? $val{mattSize} + $val{matteDescr}->{size} : 0)] + }, + ], + DirectBitsRect => [ + baseAddr => 'int32u', + pixMap => 'PixMap', + srcRect => 'Rect', + dstRect => 'Rect', + mode => 'int16u', + pixData => \ 'GetPixData($val{pixMap}, $raf)', + ], + DirectBitsRgn => [ + baseAddr => 'int32u', + pixMap => 'PixMap', + srcRect => 'Rect', + dstRect => 'Rect', + mode => 'int16u', + maskRgn => 'Rgn', + pixData => \ 'GetPixData($val{pixMap}, $raf)', + ], + # http://developer.apple.com/technotes/qd/qd_01.html + FontName => [ + size => 'int16u', # size NOT including size word + oldFontID => 'int16u', + nameLen => 'int8u', + fontName => 'string[$val{nameLen}]', + padding => 'binary[$val{size} - $val{nameLen} - 3]', + ], + # http://developer.apple.com/documentation/QuickTime/APIREF/imagedescription.htm + ImageDescription => [ + size => 'int32u', # size INCLUDING size word + cType => 'string[4]', + res1 => 'int32u', + res2 => 'int16u', + dataRefIndex => 'int16u', + version => 'int16u', + revision => 'int16u', + vendor => 'string[4]', + temporalQuality => 'int32u', + quality => 'int32u', + width => 'int16u', + height => 'int16u', + hRes => 'fixed32u', + vRes => 'fixed32u', + dataSize => 'int32u', + frameCount => 'int16u', + nameLen => 'int8u', + compressor => 'string[31]', + depth => 'int16u', + clutID => 'int16u', + clutData => 'binary[$val{size}-86]', + ], + Int8uText => [ + val => 'int8u', + count => 'int8u', + text => 'string[$val{count}]', + ], + Int8u2Text => [ + val => 'int8u[2]', + count => 'int8u', + text => 'string[$val{count}]', + ], + Int16Data => [ + size => 'int16u', # size NOT including size word + data => 'int8u[$val{size}]', + ], + Int32uData => [ + size => 'int32u', # size NOT including size word + data => 'int8u[$val{size}]', + ], + LongComment => [ + kind => 'int16u', + size => 'int16u', # size of data only + data => 'binary[$val{size}]', + ], + PixMap => [ + # Note: does not contain baseAddr + # (except for DirectBits opcodes in which it is loaded separately) + rowBytes => 'int16u', + bounds => 'Rect', + pmVersion => 'int16u', + packType => 'int16u', + packSize => 'int32u', + hRes => 'fixed32s', + vRes => 'fixed32s', + pixelType => 'int16u', + pixelSize => 'int16u', + cmpCount => 'int16u', + cmpSize => 'int16u', + planeBytes => 'int32u', + pmTable => 'int32u', + pmReserved => 'int32u', + ], + PixPat => [ + patType => 'int16u', # 1 = non-dithered, 2 = dithered + pat1Data => 'int8u[8]', + # dithered PixPat has RGB entry + RGB => 'RGBColor[$val{patType} == 2 ? 1 : 0]', + # non-dithered PixPat has other stuff instead + nonDithered=> 'PixPatNonDithered[$val{patType} == 2 ? 0 : 1]', + ], + PixPatNonDithered => [ + pixMap => 'PixMap', + colorTable => 'ColorTable', + pixData => \ 'GetPixData($val{pixMap}, $raf)', + ], + Point => [ + v => 'int16s', + h => 'int16s', + ], + PointText => [ + txLoc => 'Point', + count => 'int8u', + text => 'string[$val{count}]', + ], + Polygon => [ + polySize => 'int16u', + polyBBox => 'Rect', + polyPoints => 'int16u[($val{polySize}-10)/2]', + ], + Rect => [ + topLeft => 'Point', + botRight => 'Point', + ], + RGBColor => [ + red => 'int16u', + green => 'int16u', + blue => 'int16u', + ], + Rgn => [ + rgnSize => 'int16u', + rgnBBox => 'Rect', + data => 'int8u[$val{rgnSize}-10]', + ], + ShortLine => [ + pnLoc => 'Point', + dh => 'int8s', + dv => 'int8s', + ], + # http://developer.apple.com/documentation/QuickTime/INMAC/QT/iqImageCompMgr.a.htm + UncompressedQuickTime => [ + size => 'int32u', # size NOT including size word + version => 'int16u', + matrix => 'int32u[9]', + matteSize => 'int32u', + matteRect => 'Rect', + matteDescr => 'Int32uData[$val{matteSize} ? 1 : 0]', + matteData => 'binary[$val{matteSize}]', + subOpcodeData => q{ + binary[ $val{size} - 50 - + ($val{matteSize} ? $val{mattSize} + $val{matteDescr}->{size} : 0)] + }, + ], +); + +# PICT image opcodes +%Image::ExifTool::PICT::Main = ( + VARS => { NO_LOOKUP => 1 }, # omit tags from lookup + NOTES => q{ +The PICT format contains no true meta information, except for the possible +exception of the LongComment opcode. By default, only ImageWidth, +ImageHeight and X/YResolution are extracted from a PICT image. Tags in the +following table represent image opcodes. Extraction of these tags is +experimental, and is only enabled with the Verbose or Unknown options. + }, + 0x0000 => { + Name => 'Nop', + Description => 'No Operation', + Format => 'null', + }, + 0x0001 => { + Name => 'ClipRgn', + Description => 'Clipping Region', + Format => 'Rgn', + }, + 0x0002 => { + Name => 'BkPat', + Description => 'Background Pattern', + Format => 'int8u[8]', + }, + 0x0003 => { + Name => 'TxFont', + Description => 'Font Number', + Format => 'int16u', + }, + 0x0004 => { + Name => 'TxFace', + Description => 'Text Font Style', + Format => 'int8u', + }, + 0x0005 => { + Name => 'TxMode', + Description => 'Text Source Mode', + Format => 'int16u', + }, + 0x0006 => { + Name => 'SpExtra', + Description => 'Extra Space', + Format => 'fixed32s', + }, + 0x0007 => { + Name => 'PnSize', + Description => 'Pen Size', + Format => 'Point', + }, + 0x0008 => { + Name => 'PnMode', + Description => 'Pen Mode', + Format => 'int16u', + }, + 0x0009 => { + Name => 'PnPat', + Description => 'Pen Pattern', + Format => 'int8u[8]', + }, + 0x000a => { + Name => 'FillPat', + Description => 'Fill Pattern', + Format => 'int8u[8]', + }, + 0x000b => { + Name => 'OvSize', + Description => 'Oval Size', + Format => 'Point', + }, + 0x000c => { + Name => 'Origin', + Format => 'Point', + }, + 0x000d => { + Name => 'TxSize', + Description => 'Text Size', + Format => 'int16u', + }, + 0x000e => { + Name => 'FgColor', + Description => 'Foreground Color', + Format => 'int32u', + }, + 0x000f => { + Name => 'BkColor', + Description => 'Background Color', + Format => 'int32u', + }, + 0x0010 => { + Name => 'TxRatio', + Description => 'Text Ratio', + Format => 'Rect', + }, + 0x0011 => { + Name => 'VersionOp', + Description => 'Version', + Format => 'int8u', + }, + 0x0012 => { + Name => 'BkPixPat', + Description => 'Background Pixel Pattern', + Format => 'PixPat', + }, + 0x0013 => { + Name => 'PnPixPat', + Description => 'Pen Pixel Pattern', + Format => 'PixPat', + }, + 0x0014 => { + Name => 'FillPixPat', + Description => 'Fill Pixel Pattern', + Format => 'PixPat', + }, + 0x0015 => { + Name => 'PnLocHFrac', + Description => 'Fractional Pen Position', + Format => 'int16u', + }, + 0x0016 => { + Name => 'ChExtra', + Description => 'Added Width for NonSpace Characters', + Format => 'int16u', + }, + 0x0017 => { + Name => 'Reserved', + Format => 'Unknown', + }, + 0x001a => { + Name => 'RGBFgCol', + Description => 'Foreground Color', + Format => 'RGBColor', + }, + 0x001b => { + Name => 'RGBBkCol', + Description => 'Background Color', + Format => 'RGBColor', + }, + 0x001c => { + Name => 'HiliteMode', + Description => 'Highlight Mode Flag', + Format => 'null', + }, + 0x001d => { + Name => 'HiliteColor', + Description => 'Highlight Color', + Format => 'RGBColor', + }, + 0x001e => { + Name => 'DefHilite', + Description => 'Use Default Highlight Color', + Format => 'null', + }, + 0x001f => { + Name => 'OpColor', + Format => 'RGBColor', + }, + 0x0020 => { + Name => 'Line', + Format => 'Rect', + }, + 0x0021 => { + Name => 'LineFrom', + Format => 'Point', + }, + 0x0022 => { + Name => 'ShortLine', + Format => 'ShortLine', + }, + 0x0023 => { + Name => 'ShortLineFrom', + Format => 'int8u[2]', + }, + 0x0024 => { + Name => 'Reserved', + Format => 'Int16Data', + }, + 0x0028 => { + Name => 'LongText', + Format => 'PointText', + }, + 0x0029 => { + Name => 'DHText', + Format => 'Int8uText', + }, + 0x002a => { + Name => 'DVText', + Format => 'Int8uText', + }, + 0x002b => { + Name => 'DHDVText', + Format => 'Int8u2Text', + }, + 0x002c => { + Name => 'FontName', + Format => 'FontName', + }, + 0x002d => { + Name => 'LineJustify', + Format => 'int8u[10]', + }, + 0x002e => { + Name => 'GlyphState', + Format => 'int8u[8]', + }, + 0x002f => { + Name => 'Reserved', + Format => 'Int16Data', + }, + 0x0030 => { + Name => 'FrameRect', + Format => 'Rect', + }, + 0x0031 => { + Name => 'PaintRect', + Format => 'Rect', + }, + 0x0032 => { + Name => 'EraseRect', + Format => 'Rect', + }, + 0x0033 => { + Name => 'InvertRect', + Format => 'Rect', + }, + 0x0034 => { + Name => 'FillRect', + Format => 'Rect', + }, + 0x0035 => { + Name => 'Reserved', + Format => 'Rect', + }, + 0x0038 => { + Name => 'FrameSameRect', + Format => 'null', + }, + 0x0039 => { + Name => 'PaintSameRect', + Format => 'null', + }, + 0x003a => { + Name => 'EraseSameRect', + Format => 'null', + }, + 0x003b => { + Name => 'InvertSameRect', + Format => 'null', + }, + 0x003c => { + Name => 'FillSameRect', + Format => 'null', + }, + 0x003d => { + Name => 'Reserved', + Format => 'null', + }, + 0x0040 => { + Name => 'FrameRRect', + Format => 'Rect', + }, + 0x0041 => { + Name => 'PaintRRect', + Format => 'Rect', + }, + 0x0042 => { + Name => 'EraseRRect', + Format => 'Rect', + }, + 0x0043 => { + Name => 'InvertRRect', + Format => 'Rect', + }, + 0x0044 => { + Name => 'FillRRect', + Format => 'Rect', + }, + 0x0045 => { + Name => 'Reserved', + Format => 'Rect', + }, + 0x0048 => { + Name => 'FrameSameRRect', + Format => 'null', + }, + 0x0049 => { + Name => 'PaintSameRRect', + Format => 'null', + }, + 0x004a => { + Name => 'EraseSameRRect', + Format => 'null', + }, + 0x004b => { + Name => 'InvertSameRRect', + Format => 'null', + }, + 0x004c => { + Name => 'FillSameRRect', + Format => 'null', + }, + 0x004d => { + Name => 'Reserved', + Format => 'null', + }, + 0x0050 => { + Name => 'FrameOval', + Format => 'Rect', + }, + 0x0051 => { + Name => 'PaintOval', + Format => 'Rect', + }, + 0x0052 => { + Name => 'EraseOval', + Format => 'Rect', + }, + 0x0053 => { + Name => 'InvertOval', + Format => 'Rect', + }, + 0x0054 => { + Name => 'FillOval', + Format => 'Rect', + }, + 0x0055 => { + Name => 'Reserved', + Format => 'Rect', + }, + 0x0058 => { + Name => 'FrameSameOval', + Format => 'null', + }, + 0x0059 => { + Name => 'PaintSameOval', + Format => 'null', + }, + 0x005a => { + Name => 'EraseSameOval', + Format => 'null', + }, + 0x005b => { + Name => 'InvertSameOval', + Format => 'null', + }, + 0x005c => { + Name => 'FillSameOval', + Format => 'null', + }, + 0x005d => { + Name => 'Reserved', + Format => 'null', + }, + 0x0060 => { + Name => 'FrameArc', + Format => 'Arc', + }, + 0x0061 => { + Name => 'PaintArc', + Format => 'Arc', + }, + 0x0062 => { + Name => 'EraseArc', + Format => 'Arc', + }, + 0x0063 => { + Name => 'InvertArc', + Format => 'Arc', + }, + 0x0064 => { + Name => 'FillArc', + Format => 'Arc', + }, + 0x0065 => { + Name => 'Reserved', + Format => 'Arc', + }, + 0x0068 => { + Name => 'FrameSameArc', + Format => 'Point', + }, + 0x0069 => { + Name => 'PaintSameArc', + Format => 'Point', + }, + 0x006a => { + Name => 'EraseSameArc', + Format => 'Point', + }, + 0x006b => { + Name => 'InvertSameArc', + Format => 'Point', + }, + 0x006c => { + Name => 'FillSameArc', + Format => 'Point', + }, + 0x006d => { + Name => 'Reserved', + Format => 'int32u', + }, + 0x0070 => { + Name => 'FramePoly', + Format => 'Polygon', + }, + 0x0071 => { + Name => 'PaintPoly', + Format => 'Polygon', + }, + 0x0072 => { + Name => 'ErasePoly', + Format => 'Polygon', + }, + 0x0073 => { + Name => 'InvertPoly', + Format => 'Polygon', + }, + 0x0074 => { + Name => 'FillPoly', + Format => 'Polygon', + }, + 0x0075 => { + Name => 'Reserved', + Format => 'Polygon', + }, + 0x0078 => { + Name => 'FrameSamePoly', + Format => 'null', + }, + 0x0079 => { + Name => 'PaintSamePoly', + Format => 'null', + }, + 0x007a => { + Name => 'EraseSamePoly', + Format => 'null', + }, + 0x007b => { + Name => 'InvertSamePoly', + Format => 'null', + }, + 0x007c => { + Name => 'FillSamePoly', + Format => 'null', + }, + 0x007d => { + Name => 'Reserved', + Format => 'null', + }, + 0x0080 => { + Name => 'FrameRgn', + Format => 'Rgn', + }, + 0x0081 => { + Name => 'PaintRgn', + Format => 'Rgn', + }, + 0x0082 => { + Name => 'EraseRgn', + Format => 'Rgn', + }, + 0x0083 => { + Name => 'InvertRgn', + Format => 'Rgn', + }, + 0x0084 => { + Name => 'FillRgn', + Format => 'Rgn', + }, + 0x0085 => { + Name => 'Reserved', + Format => 'Rgn', + }, + 0x0088 => { + Name => 'FrameSameRgn', + Format => 'null', + }, + 0x0089 => { + Name => 'PaintSameRgn', + Format => 'null', + }, + 0x008a => { + Name => 'EraseSameRgn', + Format => 'null', + }, + 0x008b => { + Name => 'InvertSameRgn', + Format => 'null', + }, + 0x008c => { + Name => 'FillSameRgn', + Format => 'null', + }, + 0x008d => { + Name => 'Reserved', + Format => 'null', + }, + 0x0090 => { + Name => 'BitsRect', + Description => 'CopyBits with Clipped Rectangle', + Format => 'BitsRect#', # (version-dependent format) + }, + 0x0091 => { + Name => 'BitsRgn', + Description => 'CopyBits with Clipped Region', + Format => 'BitsRgn#', # (version-dependent format) + }, + 0x0092 => { + Name => 'Reserved', + Format => 'Int16Data', + }, + 0x0098 => { + Name => 'PackBitsRect', + Description => 'Packed CopyBits with Clipped Rectangle', + Format => 'BitsRect#', # (version-dependent format) + }, + 0x0099 => { + Name => 'PackBitsRgn', + Description => 'Packed CopyBits with Clipped Region', + Format => 'BitsRgn#', # (version-dependent format) + }, + 0x009a => { + Name => 'DirectBitsRect', + Format => 'DirectBitsRect', + }, + 0x009b => { + Name => 'DirectBitsRgn', + Format => 'DirectBitsRgn', + }, + 0x009c => { + Name => 'Reserved', + Format => 'Int16Data', + }, + 0x009d => { + Name => 'Reserved', + Format => 'Int16Data', + }, + 0x009e => { + Name => 'Reserved', + Format => 'Int16Data', + }, + 0x009f => { + Name => 'Reserved', + Format => 'Int16Data', + }, + 0x00a0 => { + Name => 'ShortComment', + Format => 'int16u', + }, + 0x00a1 => [ + # this list for documentation only [currently not extracted] + { + # (not actually a full Photohop IRB record it appears, but it does start + # with '8BIM', and does contain resolution information at offset 0x0a) + Name => 'LongComment', # kind = 498 + Format => 'LongComment', + SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Main' }, + }, + { + Name => 'LongComment', # kind = 224 + Format => 'LongComment', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + Start => '$valuePtr + 4', + }, + }, + ], + 0x00a2 => { + Name => 'Reserved', + Format => 'Int16Data', + }, + 0x00b0 => { + Name => 'Reserved', + Format => 'null', + }, + 0x00d0 => { + Name => 'Reserved', + Format => 'Int32uData', + }, + 0x00ff => { + Name => 'OpEndPic', + Description => 'End of picture', + Format => 'null', # 2 for version 2!? + }, + 0x0100 => { + Name => 'Reserved', + Format => 'int16u', + }, + 0x0200 => { + Name => 'Reserved', + Format => 'int32u', + }, + 0x02ff => { + Name => 'Version', + Description => 'Version number of picture', + Format => 'int16u', + }, + 0x0300 => { + Name => 'Reserved', + Format => 'int16u', + }, + 0x0bff => { + Name => 'Reserved', + Format => 'int8u[22]', + }, + 0x0c00 => { + Name => 'HeaderOp', + Format => 'int16u[12]', + }, + 0x0c01 => { + Name => 'Reserved', + Format => 'int8u[24]', + }, + 0x7f00 => { + Name => 'Reserved', + Format => 'int8u[254]', + }, + 0x8000 => { + Name => 'Reserved', + Format => 'null', + }, + 0x8100 => { + Name => 'Reserved', + Format => 'Int32uData', + }, + 0x8200 => { + Name => 'CompressedQuickTime', + Format => 'CompressedQuickTime', + }, + 0x8201 => { + Name => 'UncompressedQuickTime', + Format => 'Int32uData', + }, + 0xffff => { + Name => 'Reserved', + Format => 'Int32uData', + }, +); + +# picture comment 'kind' codes +# http://developer.apple.com/technotes/qd/qd_10.html +my %commentKind = ( + 150 => 'TextBegin', + 151 => 'TextEnd', + 152 => 'StringBegin', + 153 => 'StringEnd', + 154 => 'TextCenter', + 155 => 'LineLayoutOff', + 156 => 'LineLayoutOn', + 157 => 'ClientLineLayout', + 160 => 'PolyBegin', + 161 => 'PolyEnd', + 163 => 'PolyIgnore', + 164 => 'PolySmooth', + 165 => 'PolyClose', + 180 => 'DashedLine', + 181 => 'DashedStop', + 182 => 'SetLineWidth', + 190 => 'PostScriptBegin', + 191 => 'PostScriptEnd', + 192 => 'PostScriptHandle', + 193 => 'PostScriptFile', + 194 => 'TextIsPostScript', + 195 => 'ResourcePS', + 196 => 'PSBeginNoSave', + 197 => 'SetGrayLevel', + 200 => 'RotateBegin', + 201 => 'RotateEnd', + 202 => 'RotateCenter', + 210 => 'FormsPrinting', + 211 => 'EndFormsPrinting', + 224 => '<ICC Profile>', + 498 => '<Photoshop Data>', + 1000 => 'BitMapThinningOff', + 1001 => 'BitMapThinningOn', +); + +#------------------------------------------------------------------------------ +# Get PixData data +# Inputs: 0) reference to PixMap, 1) RAF reference +# Returns: reference to PixData or undef on error +sub GetPixData($$) +{ + my ($pixMap, $raf) = @_; + my $packType = $pixMap->{packType}; + my $rowBytes = $pixMap->{rowBytes} & 0x3fff; # remove flags bits + my $height = $pixMap->{bounds}->{botRight}->{v} - + $pixMap->{bounds}->{topLeft}->{v}; + my ($data, $size, $buff, $i); + + if ($packType == 1 or $rowBytes < 8) { # unpacked data + $size = $rowBytes * $height; + return undef unless $raf->Read($data, $size) == $size; + } elsif ($packType == 2) { # pad byte dropped + $size = int($rowBytes * $height * 3 / 4 + 0.5); + return undef unless $raf->Read($data, $size) == $size; + } else { + $data = ''; + for ($i=0; $i<$height; ++$i) { + if ($rowBytes > 250) { + $raf->Read($buff,2) == 2 or return undef; + $size = unpack('n',$buff); + } else { + $raf->Read($buff,1) == 1 or return undef; + $size = unpack('C',$buff); + } + $data .= $buff; + $raf->Read($buff,$size) == $size or return undef; + $data .= $buff; + } + } + return \$data; +} + +#------------------------------------------------------------------------------ +# Read value from PICT file +# Inputs: 0) RAF reference, 1) tag, 2) format, 3) optional count +# Returns: value, reference to structure hash, or undef on error +sub ReadPictValue($$$;$) +{ + my ($raf, $tag, $format, $count) = @_; + return undef unless $format; + unless (defined $count) { + if ($format =~ /(.+)\[(.+)\]/s) { + $format = $1; + $count = $2; + } else { + $count = 1; # count undefined: assume 1 + } + } + my $cntStr = ($count == 1) ? '' : "[$count]"; + # no size if count is 0 + my $size = $count ? Image::ExifTool::FormatSize($format) : 0; + if (defined $size or $format eq 'null') { + my $val; + if ($size) { + my $buff; + $size *= $count; + $raf->Read($buff, $size) == $size or return undef; + $val = ReadValue(\$buff, 0, $format, $count, $size); + } else { + $val = ''; + } + if ($verbose) { + print $out "${indent}$tag ($format$cntStr)"; + if ($size) { + if (not defined $val) { + print $out " = <undef>\n"; + } elsif ($format eq 'binary') { + print $out " = <binary data>\n"; + if ($verbose > 2) { + my %parms = ( Out => $out ); + $parms{MaxLen} = 96 if $verbose < 4; + HexDump(\$val, undef, %parms); + } + } else { + print $out " = $val\n"; + } + } else { + print $out "\n"; + } + } + return \$val if $format eq 'binary' and defined $val; + return $val; + } + $verbose and print $out "${indent}$tag ($format$cntStr):\n"; + my $struct = $structs{$format} or return undef; + my ($c, @vals); + for ($c=0; $c<$count; ++$c) { + my (%val, $i); + for ($i=0; ; $i+=2) { + my $tag = $$struct[$i] or last; + my $fmt = $$struct[$i+1]; + my ($cnt, $val); + $indent .= ' '; + if (ref $fmt) { + $val = eval $$fmt; + $@ and warn $@; + if ($verbose and defined $val) { + printf $out "${indent}$tag (binary[%d]) = <binary data>\n",length($$val); + if ($verbose > 2) { + my %parms = ( Out => $out ); + $parms{MaxLen} = 96 if $verbose < 4; + HexDump($val, undef, %parms); + } + } + } elsif ($fmt =~ /(.+)\[(.+)\]/s) { + $fmt = $1; + $cnt = eval $2; + $@ and warn $@; + $val = ReadPictValue($raf, $tag, $fmt, $cnt); + } else { + $val = ReadPictValue($raf, $tag, $fmt); + } + $indent = substr($indent, 2); + return undef unless defined $val; + $val{$tag} = $val; + } + return \%val if $count == 1; + push @vals, \%val; + } + return \@vals; +} + +#------------------------------------------------------------------------------ +# Extract meta information from a PICT image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid PICT image +sub ProcessPICT($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + $verbose = $et->Options('Verbose'); + $out = $et->Options('TextOut'); + $indent = ''; + my ($buff, $tried, @hdr, $op, $hRes, $vRes); + + # recognize both PICT files and PICT resources (PICT files have a + # 512-byte header that we ignore, but PICT resources do not) + for (;;) { + $raf->Read($buff, 12) == 12 or return 0; + @hdr = unpack('x2n5', $buff); + $op = pop @hdr; + # check for PICT version 1 format + if ($op == 0x1101) { + $vers = 1; + undef $extended; + last; + } + # check for PICT version 2 format + if ($op == 0x0011) { + $raf->Read($buff, 28) == 28 or return 0; + if ($buff =~ /^\x02\xff\x0c\x00\xff\xff/) { + $vers = 2; + undef $extended; + last; + } + if ($buff =~ /^\x02\xff\x0c\x00\xff\xfe/) { + $vers = 2; + $extended = 1; + ($hRes, $vRes) = unpack('x8N2', $buff); + last; + } + } + return 0 if $tried; + $tried = 1; + $raf->Seek(512, 0) or return 0; + } + # make the bounding rect signed + foreach (@hdr) { + $_ >= 0x8000 and $_ -= 0x10000; + } + my $w = $hdr[3] - $hdr[1]; + my $h = $hdr[2] - $hdr[0]; + return 0 unless $w > 0 and $h > 0; + + SetByteOrder('MM'); + + if ($extended) { + # extended version 2 pictures contain resolution information + # and image bounds are in 72-dpi equivalent units + $hRes = GetFixed32s(\$buff, 8); + $vRes = GetFixed32s(\$buff, 12); + return 0 unless $hRes and $vRes; + $w = int($w * $hRes / 72 + 0.5); + $h = int($h * $vRes / 72 + 0.5); + } + $et->SetFileType(); + $et->FoundTag('ImageWidth', $w); + $et->FoundTag('ImageHeight', $h); + $et->FoundTag('XResolution', $hRes) if $hRes; + $et->FoundTag('YResolution', $vRes) if $vRes; + + # don't extract image opcodes unless verbose + return 1 unless $verbose or $et->Options('Unknown'); + + $verbose and printf $out "PICT version $vers%s\n", $extended ? ' extended' : ''; + + my $tagTablePtr = GetTagTable('Image::ExifTool::PICT::Main'); + + my $success; + for (;;) { + if ($vers == 1) { + $raf->Read($buff, 1) == 1 or last; + $op = ord($buff); + } else { + # must start version 2 opcode on an even byte + $raf->Read($buff, 1) if $raf->Tell() & 0x01; + $raf->Read($buff, 2) == 2 or last; + $op = unpack('n', $buff); + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $op); + unless ($tagInfo) { + my $i; + # search for reserved tag info + for ($i=0; $i<scalar(@reserved); $i+=2) { + next unless $op >= $reserved[$i]; + last if $op > $reserved[$i+1]; + $tagInfo = $et->GetTagInfo($tagTablePtr, $reserved[$i]); + last; + } + last unless $tagInfo; + } + if ($op == 0xff) { + $verbose and print $out "End of picture\n"; + $success = 1; + last; + } + my $format = $$tagInfo{Format}; + unless ($format) { + $et->Warn("Missing format for $$tagInfo{Name}"); + last; + } + # replace version number for version-dependent formats + $format =~ s/#$/$vers/; + my $wid = $vers * 2; + $verbose and printf $out "Tag 0x%.${wid}x, ", $op; + my $val = ReadPictValue($raf, $$tagInfo{Name}, $format); + unless (defined $val) { + $et->Warn("Error reading $$tagInfo{Name} information"); + last; + } + if (ref $val eq 'HASH') { + # extract JPEG image from CompressedQuickTime imageData + if ($$tagInfo{Name} eq 'CompressedQuickTime' and + ref $val->{imageDescr} eq 'HASH' and + $val->{imageDescr}->{compressor} and + $val->{imageDescr}->{compressor} eq 'Photo - JPEG' and + ref $val->{imageData} eq 'SCALAR' and + $et->ValidateImage($val->{imageData}, 'PreviewImage')) + { + $et->FoundTag('PreviewImage', $val->{imageData}); + } + } else { + # $et->FoundTag($tagInfo, $val); + } + } + $success or $et->Warn('End of picture not found'); + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::PICT - Read PICT meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to read PICT +(Apple Picture) images. + +=head1 NOTES + +Extraction of PICT opcodes is experimental, and is only enabled with the +Verbose or the Unknown option. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://developer.apple.com/documentation/mac/QuickDraw/QuickDraw-2.html> + +=item L<http://developer.apple.com/documentation/QuickTime/INMAC/QT/iqImageCompMgr.a.htm> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PICT Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/PLIST.pm b/lib/Image/ExifTool/PLIST.pm new file mode 100644 index 0000000..32d8801 --- /dev/null +++ b/lib/Image/ExifTool/PLIST.pm @@ -0,0 +1,462 @@ +#------------------------------------------------------------------------------ +# File: PLIST.pm +# +# Description: Read Apple PLIST information +# +# Revisions: 2013-02-01 - P. Harvey Created +# +# References: 1) http://www.apple.com/DTDs/PropertyList-1.0.dtd +# 2) http://opensource.apple.com/source/CF/CF-550/CFBinaryPList.c +# +# Notes: - Sony MODD files also use XML PLIST format, but with a few quirks +# +# - Decodes both the binary and XML-based PLIST formats +#------------------------------------------------------------------------------ + +package Image::ExifTool::PLIST; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::XMP; +use Image::ExifTool::GPS; + +$VERSION = '1.09'; + +sub ExtractObject($$;$); +sub Get24u($$); + +# access routines to read various-sized integer/real values (add 0x100 to size for reals) +my %readProc = ( + 1 => \&Get8u, + 2 => \&Get16u, + 3 => \&Get24u, + 4 => \&Get32u, + 8 => \&Get64u, + 0x104 => \&GetFloat, + 0x108 => \&GetDouble, +); + +# recognize different types of PLIST files based on certain tags +my %plistType = ( + adjustmentBaseVersion => 'AAE', +); + +# PLIST tags (generated on-the-fly for most tags) +%Image::ExifTool::PLIST::Main = ( + PROCESS_PROC => \&ProcessPLIST, + GROUPS => { 0 => 'PLIST', 1 => 'XML', 2 => 'Document' }, + VARS => { LONG_TAGS => 4 }, + NOTES => q{ + Apple Property List tags. ExifTool reads both XML and binary-format PLIST + files, and will extract any existing tags even if they aren't listed below. + These tags belong to the family 0 "PLIST" group, but family 1 group may be + either "XML" or "PLIST" depending on whether the format is XML or binary. + }, +# +# tags found in PLIST information of QuickTime iTunesInfo iTunMOVI atom (ref PH) +# + 'cast//name' => { Name => 'Cast', List => 1 }, + 'directors//name' => { Name => 'Directors', List => 1 }, + 'producers//name' => { Name => 'Producers', List => 1 }, + 'screenwriters//name' => { Name => 'Screenwriters', List => 1 }, + 'codirectors//name' => { Name => 'Codirectors', List => 1 }, # (NC) + 'studio//name' => { Name => 'Studio', List => 1 }, # (NC) +# +# tags found in MODD files (ref PH) +# + 'MetaDataList//DateTimeOriginal' => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + # Sony uses a "real" here -- number of days since Dec 31, 1899 + ValueConv => 'IsFloat($val) ? ConvertUnixTime(($val - 25569) * 24 * 3600) : $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + 'MetaDataList//Duration' => { + Name => 'Duration', + Groups => { 2 => 'Video' }, + PrintConv => 'ConvertDuration($val)', + }, + 'MetaDataList//Geolocation/Latitude' => { + Name => 'GPSLatitude', + Groups => { 2 => 'Location' }, + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + 'MetaDataList//Geolocation/Longitude' => { + Name => 'GPSLongitude', + Groups => { 2 => 'Location' }, + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + 'MetaDataList//Geolocation/MapDatum' => { + Name => 'GPSMapDatum', + Groups => { 2 => 'Location' }, + }, + XMLFileType => { + # recognize MODD files by their content + RawConv => q{ + if ($val eq 'ModdXML' and $$self{FILE_TYPE} eq 'XMP') { + $self->OverrideFileType('MODD'); + } + return $val; + }, + }, +); + +#------------------------------------------------------------------------------ +# We found a PLIST XML property name/value +# Inputs: 0) ExifTool object ref, 1) tag table ref +# 2) reference to array of XML property names (last is current property) +# 3) property value, 4) attribute hash ref (not used here) +# Returns: 1 if valid tag was found +sub FoundTag($$$$;$) +{ + my ($et, $tagTablePtr, $props, $val, $attrs) = @_; + return 0 unless @$props; + my $verbose = $et->Options('Verbose'); + my $keys = $$et{PListKeys} || ( $$et{PListKeys} = [] ); + + my $prop = $$props[-1]; + if ($verbose > 1) { + $et->VPrint(0, $$et{INDENT}, '[', join('/',@$props), ' = ', + $et->Printable($val), "]\n"); + } + # un-escape XML character entities + $val = Image::ExifTool::XMP::UnescapeXML($val); + + # handle the various PLIST properties + if ($prop eq 'data') { + if ($val =~ /^[0-9a-f]+$/ and not length($val) & 0x01) { + # MODD files use ASCII-hex encoded "data"... + my $buff = pack('H*', $val); + $val = \$buff; + } else { + # ...but the PLIST DTD specifies Base64 encoding + $val = Image::ExifTool::XMP::DecodeBase64($val); + } + } elsif ($prop eq 'date') { + $val = Image::ExifTool::XMP::ConvertXMPDate($val); + } elsif ($prop eq 'true' or $prop eq 'false') { + $val = ucfirst $prop; + } else { + # convert from UTF8 to ExifTool Charset + $val = $et->Decode($val, 'UTF8'); + if ($prop eq 'key') { + if (@$props <= 3) { # top-level key should be plist/dict/key + @$keys = ( $val ); + } else { + # save key names to be used in tag name + push @$keys, '' while @$keys < @$props - 3; + pop @$keys while @$keys > @$props - 2; + $$keys[@$props - 3] = $val; + } + return 0; + } + } + + return 0 unless @$keys; # can't store value if no associated key + + my $tag = join '/', @$keys; # generate tag ID from 'key' values + my $tagInfo = $$tagTablePtr{$tag}; + unless ($tagInfo) { + $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n") if $verbose; + # generate tag name from ID + my $name = $tag; + $name =~ s{^MetaDataList//}{}; # shorten long MODD metadata tag names + $name =~ s{//name$}{}; # remove unnecessary MODD "name" property + $name =~ s/([^A-Za-z])([a-z])/$1\u$2/g; # capitalize words + $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters + $tagInfo = { Name => ucfirst($name), List => 1 }; + if ($prop eq 'date') { + $$tagInfo{Groups}{2} = 'Time'; + $$tagInfo{PrintConv} = '$self->ConvertDateTime($val)'; + } + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + # allow list-behaviour only for consecutive tags with the same ID + if ($$et{LastPListTag} and $$et{LastPListTag} ne $tagInfo) { + delete $$et{LIST_TAGS}{$$et{LastPListTag}}; + } + $$et{LastPListTag} = $tagInfo; + # override file type if applicable + $et->OverrideFileType($plistType{$tag}) if $plistType{$tag} and $$et{FILE_TYPE} eq 'XMP'; + # save the tag + $et->HandleTag($tagTablePtr, $tag, $val); + + return 1; +} + +#------------------------------------------------------------------------------ +# Get big-endian 24-bit integer +# Inputs: 0) data ref, 1) offset +# Returns: integer value +sub Get24u($$) +{ + my ($dataPt, $off) = @_; + return unpack 'N', "\0" . substr($$dataPt, $off, 3); +} + +#------------------------------------------------------------------------------ +# Extract object from binary PLIST file at the current file position (ref 2) +# Inputs: 0) ExifTool ref, 1) PLIST info ref, 2) parent tag ID (undef for top) +# Returns: the object, or undef on error +sub ExtractObject($$;$) +{ + my ($et, $plistInfo, $parent) = @_; + my $raf = $$plistInfo{RAF}; + my ($buff, $val); + + $raf->Read($buff, 1) == 1 or return undef; + my $type = ord($buff) >> 4; + my $size = ord($buff) & 0x0f; + if ($type == 0) { # null/bool/fill + $val = { 0x00=>'<null>', 0x08=>'True', 0x09=>'False', 0x0f=>'<fill>' }->{$size}; + } elsif ($type == 1 or $type == 2 or $type == 3) { # int, float or date + $size = 1 << $size; + my $proc = ($type == 1 ? $readProc{$size} : $readProc{$size + 0x100}) or return undef; + $val = &$proc(\$buff, 0) if $raf->Read($buff, $size) == $size; + if ($type == 3 and defined $val) { # date + # dates are referenced to Jan 1, 2001 (11323 days from Unix time zero) + $val = Image::ExifTool::ConvertUnixTime($val + 11323 * 24 * 3600, 1); + $$plistInfo{DateFormat} = 1; + } + } elsif ($type == 8) { # UID + ++$size; + $raf->Read($buff, $size) == $size or return undef; + my $proc = $readProc{$size}; + if ($proc) { + $val = &$proc(\$buff, 0); + } elsif ($size == 16) { + require Image::ExifTool::ASF; + $val = Image::ExifTool::ASF::GetGUID($buff); + } else { + $val = "0x" . unpack 'H*', $buff; + } + } else { + # $size is the size of the remaining types + if ($size == 0x0f) { + # size is stored in extra integer object + $size = ExtractObject($et, $plistInfo); + return undef unless defined $size and $size =~ /^\d+$/; + } + if ($type == 4) { # data + if ($size < 1000000 or $et->Options('Binary')) { + $raf->Read($buff, $size) == $size or return undef; + } else { + $buff = "Binary data $size bytes"; + } + $val = \$buff; # (return reference for binary data) + } elsif ($type == 5) { # ASCII string + $raf->Read($val, $size) == $size or return undef; + } elsif ($type == 6) { # UCS-2BE string + $size *= 2; + $raf->Read($buff, $size) == $size or return undef; + $val = $et->Decode($buff, 'UCS2'); + } elsif ($type == 10 or $type == 12 or $type == 13) { # array, set or dict + # the remaining types store a list of references + my $refSize = $$plistInfo{RefSize}; + my $refProc = $$plistInfo{RefProc}; + my $num = $type == 13 ? $size * 2 : $size; + my $len = $num * $refSize; + $raf->Read($buff, $len) == $len or return undef; + my $table = $$plistInfo{Table}; + my ($i, $ref, @refs, @array); + for ($i=0; $i<$num; ++$i) { + my $ref = &$refProc(\$buff, $i * $refSize); + return 0 if $ref >= @$table; + push @refs, $ref; + } + if ($type == 13) { # dict + # prevent infinite recursion + if (defined $parent and length $parent > 1000) { + $et->WarnOnce('Possible deep recursion while parsing PLIST'); + return undef; + } + my $tagTablePtr = $$plistInfo{TagTablePtr}; + my $verbose = $et->Options('Verbose'); + for ($i=0; $i<$size; ++$i) { + # get the entry key + $raf->Seek($$table[$refs[$i]], 0) or return undef; + my $key = ExtractObject($et, $plistInfo); + next unless defined $key and length $key; # silently ignore bad dict entries + # get the entry value + $raf->Seek($$table[$refs[$i+$size]], 0) or return undef; + # generate an ID for this tag + my $tag = defined $parent ? "$parent/$key" : $key; + undef $$plistInfo{DateFormat}; + my $val = ExtractObject($et, $plistInfo, $tag); + next if not defined $val or ref($val) eq 'HASH'; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + unless ($tagInfo) { + $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n") if $verbose; + my $name = $tag; + $name =~ s/([^A-Za-z])([a-z])/$1\u$2/g; # capitalize words + $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters + $tagInfo = { Name => ucfirst($name), List => 1 }; + if ($$plistInfo{DateFormat}) { + $$tagInfo{Groups}{2} = 'Time'; + $$tagInfo{PrintConv} = '$self->ConvertDateTime($val)'; + } + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + # allow list-behaviour only for consecutive tags with the same ID + if ($$et{LastPListTag} and $$et{LastPListTag} ne $tagInfo) { + delete $$et{LIST_TAGS}{$$et{LastPListTag}}; + } + $$et{LastPListTag} = $tagInfo; + $et->HandleTag($tagTablePtr, $tag, $val); + } + $val = { }; # flag the value as a dictionary (ie. tags already saved) + } else { + # extract the referenced objects + foreach $ref (@refs) { + $raf->Seek($$table[$ref], 0) or return undef; # seek to this object + $val = ExtractObject($et, $plistInfo, $parent); + next unless defined $val and ref $val ne 'HASH'; + push @array, $val; + } + $val = \@array; + } + } + } + return $val; +} + +#------------------------------------------------------------------------------ +# Process binary PLIST data (ref 2) +# Inputs: 0) ExifTool object ref, 1) DirInfo ref, 2) tag table ref +# Returns: 1 on success (and returns plist value as $$dirInfo{Value}) +sub ProcessBinaryPLIST($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my ($i, $buff, @table); + my $dataPt = $$dirInfo{DataPt}; + + $et->VerboseDir('Binary PLIST'); + SetByteOrder('MM'); + + if ($dataPt) { + my $start = $$dirInfo{DirStart}; + if ($start or ($$dirInfo{DirLen} and $$dirInfo{DirLen} != length $$dataPt)) { + my $buf2 = substr($$dataPt, $start || 0, $$dirInfo{DirLen}); + $$dirInfo{RAF} = new File::RandomAccess(\$buf2); + } else { + $$dirInfo{RAF} = new File::RandomAccess($dataPt); + } + my $strt = $$dirInfo{DirStart} || 0; + } + # read and parse the trailer + my $raf = $$dirInfo{RAF} or return 0; + $raf->Seek(-32,2) and $raf->Read($buff,32)==32 or return 0; + my $intSize = Get8u(\$buff, 6); + my $refSize = Get8u(\$buff, 7); + my $numObj = Get64u(\$buff, 8); + my $topObj = Get64u(\$buff, 16); + my $tableOff = Get64u(\$buff, 24); + + return 0 if $topObj >= $numObj; + my $intProc = $readProc{$intSize} or return 0; + my $refProc = $readProc{$refSize} or return 0; + + # read and parse the offset table + my $tableSize = $intSize * $numObj; + $raf->Seek($tableOff, 0) and $raf->Read($buff, $tableSize) == $tableSize or return 0; + for ($i=0; $i<$numObj; ++$i) { + push @table, &$intProc(\$buff, $i * $intSize); + } + my %plistInfo = ( + RAF => $raf, + RefSize => $refSize, + RefProc => $refProc, + Table => \@table, + TagTablePtr => $tagTablePtr, + ); + # position file pointer at the top object, and extract it + $raf->Seek($table[$topObj], 0) or return 0; + $$dirInfo{Value} = ExtractObject($et, \%plistInfo); + return defined $$dirInfo{Value} ? 1 : 0; +} + +#------------------------------------------------------------------------------ +# Extract information from a PLIST file +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, 0 if this wasn't valid PLIST +sub ProcessPLIST($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + + # process XML PLIST data using the XMP module + $$dirInfo{XMPParseOpts}{FoundProc} = \&FoundTag; + my $result = Image::ExifTool::XMP::ProcessXMP($et, $dirInfo, $tagTablePtr); + delete $$dirInfo{XMPParseOpts}; + + unless ($result) { + my $buff; + my $raf = $$dirInfo{RAF} or return 0; + $raf->Seek(0,0) and $raf->Read($buff, 64) or return 0; + if ($buff =~ /^bplist0/) { + # binary PLIST file + my $tagTablePtr = GetTagTable('Image::ExifTool::PLIST::Main'); + $et->SetFileType('PLIST', 'application/x-plist'); + $$et{SET_GROUP1} = 'PLIST'; + unless (ProcessBinaryPLIST($et, $dirInfo, $tagTablePtr)) { + $et->Error('Error reading binary PLIST file'); + } + delete $$et{SET_GROUP1}; + $result = 1; + } elsif ($$et{FILE_EXT} and $$et{FILE_EXT} eq 'PLIST' and + $buff =~ /^\xfe\xff\x00/) + { + # (have seen very old PLIST files encoded as UCS-2BE with leading BOM) + $et->Error('Old PLIST format currently not supported'); + $result = 1; + } + } + return $result; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::PLIST - Read Apple PLIST information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains the routines used by Image::ExifTool to extract +information from Apple Property List files. + +=head1 NOTES + +This module decodes both the binary and XML-based PLIST format. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.apple.com/DTDs/PropertyList-1.0.dtd> + +=item L<http://opensource.apple.com/source/CF/CF-550/CFBinaryPList.c> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PLIST Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/PLUS.pm b/lib/Image/ExifTool/PLUS.pm new file mode 100644 index 0000000..c9844fa --- /dev/null +++ b/lib/Image/ExifTool/PLUS.pm @@ -0,0 +1,2607 @@ +#------------------------------------------------------------------------------ +# File: PLUS.pm +# +# Description: PLUS (Picture Licensing Universal System) tags +# +# Revisions: 2016/05/18 - P. Harvey Created +# +# References: 1) http://www.useplus.com/useplus/standards.asp +#------------------------------------------------------------------------------ + +package Image::ExifTool::PLUS; + +use strict; +use vars qw($VERSION); +use Image::ExifTool::XMP; + +$VERSION = '1.00'; + +sub ValidateMediaSummary($); + +#------------------------------------------------------------------------------ +# PLUS (Picture Licensing Universal System) + +# PLUS vocabulary conversions +my %plusVocab = ( + ValueConv => '$val =~ s{http://ns.useplus.org/ldf/vocab/}{}; $val', + ValueConvInv => '"http://ns.useplus.org/ldf/vocab/$val"', +); + +# PLUS License Data Format 1.2.1 structures +# (this seems crazy to me -- why did they define different ID/Name structures +# for each field rather than just re-using the same structure?) +my %plusLicensee = ( + STRUCT_NAME => 'Licensee', + NAMESPACE => 'plus', + # all "rdf:type" properties removed in version 1.2.1 + # (idiots. Why did they put them there in the first place? -- it required + # a special patch for ExifTool to support these, and now they are gone!) + # TYPE => 'plus:LicenseeDetail', (removed in 1.2.1) + LicenseeID => { }, + LicenseeName=> { }, +); +my %plusEndUser = ( + STRUCT_NAME => 'EndUser', + NAMESPACE => 'plus', + # TYPE => 'plus:EndUserDetail', (removed in 1.2.1) + EndUserID => { }, + EndUserName => { }, +); +my %plusLicensor = ( + STRUCT_NAME => 'Licensor', + NAMESPACE => 'plus', + # TYPE => 'plus:LicensorDetail', (removed in 1.2.1) + LicensorID => { }, + LicensorName => { }, + LicensorStreetAddress => { }, + LicensorExtendedAddress => { }, + LicensorCity => { }, + LicensorRegion => { }, + LicensorPostalCode => { }, + LicensorCountry => { }, + LicensorTelephoneType1 => { + %plusVocab, + PrintConv => { + 'work' => 'Work', + 'cell' => 'Cell', + 'fax' => 'FAX', + 'home' => 'Home', + 'pager' => 'Pager', + }, + }, + LicensorTelephone1 => { }, + LicensorTelephoneType2 => { + %plusVocab, + PrintConv => { + 'work' => 'Work', + 'cell' => 'Cell', + 'fax' => 'FAX', + 'home' => 'Home', + 'pager' => 'Pager', + }, + }, + LicensorTelephone2 => { }, + LicensorEmail => { }, + LicensorURL => { }, +); +my %plusCopyrightOwner = ( + STRUCT_NAME => 'CopyrightOwner', + NAMESPACE => 'plus', + # TYPE => 'plus:CopyrightOwnerDetail', (removed in 1.2.1) + CopyrightOwnerID => { }, + CopyrightOwnerName => { }, +); +my %plusImageCreator = ( + STRUCT_NAME => 'ImageCreator', + NAMESPACE => 'plus', + # TYPE => 'plus:ImageCreatorDetail', (removed in 1.2.1) + ImageCreatorID => { }, + ImageCreatorName => { }, +); +my %plusImageSupplier = ( + STRUCT_NAME => 'ImageSupplier', + NAMESPACE => 'plus', + # TYPE => 'plus:ImageSupplierDetail', (removed in 1.2.1) + ImageSupplierID => { }, + ImageSupplierName => { }, +); + +# Media Matrix 1.1.1 decoding +my %mediaMatrix = ( + Notes => q{ + The lookup below is used to add human-readable descriptions to Media Matrix + ID's in PLUS Media Summary Codes. + }, + OTHER => sub { + my ($val, $inv, $conv) = @_; + $val = uc $val; # convert to upper case + if ($inv) { + # prepare MediaSummaryCode for writing + $val =~ s/\(.*?\)//sg; # remove descriptions + $val =~ s/^\s*?PLUS\s+(V[0-9]+)\s+(U[0-9]+)\s*;/|PLUS|$1|$2|/s; # reformat header + $val =~ tr/;/|/; # use "|" as separator instead of ";" + $val =~ tr/0-9A-Z|//dc; # remove extraneous characters + $val .= '|' unless $val =~ /\|$/; # add terminating "|" + ValidateMediaSummary($val) or return undef; + } elsif ($val =~ /^\|PLUS\|(.*?)\|(.*?)\|(.*)/s) { + # add human-readable descriptions + my ($ver,$num,$code) = ($1,$2,$3); + $ver .= " (LDF Version $1.$2)" if $ver =~ /V0*(\d+)(\d{2})$/; + $num .= " ($1 Media Usages:)" if $num =~ /U0*(\d+)/; + $code =~ tr/0-9A-Z|//dc; # remove extraneous characters + $val = "PLUS $ver $num"; + while ($code =~ /(\d[A-Z]{3})/g) { + my $mmid = $1; + if (defined $$conv{$mmid}) { + $val .= " $mmid ($$conv{$mmid})"; + } elsif ($mmid =~ /^1I([A-Z])([A-Z])/) { # decode Usage Item count + my $n = (ord($1)-65) * 26 + ord($2)-65 + 1; + # (add a separator before each new Media Usage Code) + $val .= "; $mmid ($n Usage Items:)"; + } elsif ($mmid =~ /^1UN([A-Z])/) { # decode Usage Number + $val .= " (Usage Number $1)"; + } else { + $val .= " $mmid"; + } + } + } + return $val; + }, + # 1 - Usage + '1IAA' => '1 Usage Item:', + '1IAB' => '2 Usage Items:', + '1IAC' => '3 Usage Items:', + '1IAD' => '4 Usage Items:', + '1IAE' => '5 Usage Items:', + # ... + '1UNA' => 'Usage Number A', + '1UNB' => 'Usage Number B', + '1UNC' => 'Usage Number C', + '1UND' => 'Usage Number D', + '1UNE' => 'Usage Number E', + # ... + # 2 - Media + '2BOB' => 'Advertising|Periodicals|Magazine, Consumer|Printed', + '2ACE' => 'Advertising|Periodicals|Magazine, Consumer|Internet Website', + '2GEN' => 'Advertising|Periodicals|Magazine, Consumer|Internet Downloadable File', + '2ADS' => 'Advertising|Periodicals|Magazine, Consumer|Internet Email', + '2GIB' => 'Advertising|Periodicals|Magazine, Consumer|All Internet Distribution Formats', + '2GHI' => 'Advertising|Periodicals|Magazine, Consumer|Recordable Media', + '2GEY' => 'Advertising|Periodicals|Magazine, Consumer|All Electronic Distribution Formats', + '2HAT' => 'Advertising|Periodicals|Magazine, Trade|Printed', + '2HAG' => 'Advertising|Periodicals|Magazine, Trade|Internet Website', + '2HAE' => 'Advertising|Periodicals|Magazine, Trade|Internet Downloadable File', + '2AFT' => 'Advertising|Periodicals|Magazine, Trade|Internet Email', + '2HAJ' => 'Advertising|Periodicals|Magazine, Trade|All Internet Distribution Formats', + '2AGE' => 'Advertising|Periodicals|Magazine, Trade|Recordable Media', + '2HAH' => 'Advertising|Periodicals|Magazine, Trade|All Electronic Distribution Formats', + '2JAR' => 'Advertising|Periodicals|Magazine, Corporate|Printed', + '2GIN' => 'Advertising|Periodicals|Magazine, Corporate|Internet Website', + '2GIE' => 'Advertising|Periodicals|Magazine, Corporate|Internet Downloadable File', + '2AGO' => 'Advertising|Periodicals|Magazine, Corporate|Internet Email', + '2GNU' => 'Advertising|Periodicals|Magazine, Corporate|All Internet Distribution Formats', + '2GIP' => 'Advertising|Periodicals|Magazine, Corporate|Recordable Media', + '2GIT' => 'Advertising|Periodicals|Magazine, Corporate|All Electronic Distribution Formats', + '2DEB' => 'Advertising|Periodicals|Magazine, Education|Printed', + '2GUM' => 'Advertising|Periodicals|Magazine, Education|Internet Website', + '2GUL' => 'Advertising|Periodicals|Magazine, Education|Internet Downloadable File', + '2AHA' => 'Advertising|Periodicals|Magazine, Education|Internet Email', + '2GYP' => 'Advertising|Periodicals|Magazine, Education|All Internet Distribution Formats', + '2GUV' => 'Advertising|Periodicals|Magazine, Education|Recordable Media', + '2GUY' => 'Advertising|Periodicals|Magazine, Education|All Electronic Distribution Formats', + '2CUS' => 'Advertising|Periodicals|Magazine, Custom Published|Printed', + '2GOR' => 'Advertising|Periodicals|Magazine, Custom Published|Internet Website', + '2GOS' => 'Advertising|Periodicals|Magazine, Custom Published|Internet Downloadable File', + '2AIL' => 'Advertising|Periodicals|Magazine, Custom Published|Internet Email', + '2GOX' => 'Advertising|Periodicals|Magazine, Custom Published|All Internet Distribution Formats', + '2ALP' => 'Advertising|Periodicals|Magazine, Custom Published|Recordable Media', + '2AMI' => 'Advertising|Periodicals|Magazine, Custom Published|All Electronic Distribution Formats', + '2BEN' => 'Advertising|Periodicals|Magazine, Advertorial|Printed', + '2BAP' => 'Advertising|Periodicals|Magazine, Advertorial|Internet Website', + '2BAM' => 'Advertising|Periodicals|Magazine, Advertorial|Internet Downloadable File', + '2BOP' => 'Advertising|Periodicals|Magazine, Advertorial|Internet Email', + '2GOB' => 'Advertising|Periodicals|Magazine, Advertorial|All Internet Distribution Formats', + '2DUH' => 'Advertising|Periodicals|Magazine, Advertorial|All Electronic Distribution Formats', + '2DUP' => 'Advertising|Periodicals|Magazine Reprints, All Types|Printed', + '2HAS' => 'Advertising|Periodicals|Magazine Reprints, All Types|Internet Website', + '2HAP' => 'Advertising|Periodicals|Magazine Reprints, All Types|Internet Downloadable File', + '2AMP' => 'Advertising|Periodicals|Magazine Reprints, All Types|Internet Email', + '2HEH' => 'Advertising|Periodicals|Magazine Reprints, All Types|All Internet Distribution Formats', + '2HAW' => 'Advertising|Periodicals|Magazine Reprints, All Types|Recordable Media', + '2HAY' => 'Advertising|Periodicals|Magazine Reprints, All Types|All Electronic Distribution Formats', + '2MOO' => 'Advertising|Periodicals|Magazine, All Types|Printed', + '2ANA' => 'Advertising|Periodicals|Magazine, All Types|Internet Website', + '2GOO' => 'Advertising|Periodicals|Magazine, All Types|Recordable Media', + '2ANY' => 'Advertising|Periodicals|Magazine, All Types|Internet Downloadable File', + '2APE' => 'Advertising|Periodicals|Magazine, All Types|Internet Email', + '2APT' => 'Advertising|Periodicals|Magazine, All Types|All Internet Distribution Formats', + '2ARK' => 'Advertising|Periodicals|Magazine, All Types|All Electronic Distribution Formats', + '2KEG' => 'Advertising|Periodicals|Newspaper, Weekly Supplement|Printed', + '2HOB' => 'Advertising|Periodicals|Newspaper, Weekly Supplement|Internet Website', + '2HOD' => 'Advertising|Periodicals|Newspaper, Weekly Supplement|Internet Downloadable File', + '2ARM' => 'Advertising|Periodicals|Newspaper, Weekly Supplement|Internet Email', + '2HMM' => 'Advertising|Periodicals|Newspaper, Weekly Supplement|All Internet Distribution Formats', + '2HOE' => 'Advertising|Periodicals|Newspaper, Weekly Supplement|Recordable Media', + '2HIS' => 'Advertising|Periodicals|Newspaper, Weekly Supplement|All Electronic Distribution Formats', + '2KEN' => 'Advertising|Periodicals|Newspaper, Tabloid|Printed', + '2HOY' => 'Advertising|Periodicals|Newspaper, Tabloid|Internet Website', + '2HUH' => 'Advertising|Periodicals|Newspaper, Tabloid|All Internet Distribution Formats', + '2ASH' => 'Advertising|Periodicals|Newspaper, Tabloid|Internet Downloadable File', + '2BAY' => 'Advertising|Periodicals|Newspaper, Tabloid|Internet Email', + '2HUE' => 'Advertising|Periodicals|Newspaper, Tabloid|Recordable Media', + '2HOW' => 'Advertising|Periodicals|Newspaper, Tabloid|All Electronic Distribution Formats', + '2NEW' => 'Advertising|Periodicals|Newspaper, All Types|Printed', + '2HID' => 'Advertising|Periodicals|Newspaper, All Types|Internet Website', + '2HIE' => 'Advertising|Periodicals|Newspaper, All Types|Internet Downloadable File', + '2BED' => 'Advertising|Periodicals|Newspaper, All Types|Internet Email', + '2HIC' => 'Advertising|Periodicals|Newspaper, All Types|All Internet Distribution Formats', + '2HIM' => 'Advertising|Periodicals|Newspaper, All Types|Recordable Media', + '2HEY' => 'Advertising|Periodicals|Newspaper, All Types|All Electronic Distribution Formats', + '2JAY' => 'Advertising|Periodicals|Newsletter, All Types|Printed', + '2HES' => 'Advertising|Periodicals|Newsletter, All Types|Internet Website', + '2HEP' => 'Advertising|Periodicals|Newsletter, All Types|Internet Downloadable File', + '2HEW' => 'Advertising|Periodicals|Newsletter, All Types|All Internet Distribution Formats', + '2BID' => 'Advertising|Periodicals|Newsletter, All Types|Internet Email', + '2HET' => 'Advertising|Periodicals|Newsletter, All Types|Recordable Media', + '2HEN' => 'Advertising|Periodicals|Newsletter, All Types|All Electronic Distribution Formats', + '2BAH' => 'Advertising|Periodicals|Quarterly Report|Printed', + '2HUT' => 'Advertising|Periodicals|Quarterly Report|Internet Website', + '2HUP' => 'Advertising|Periodicals|Quarterly Report|Internet Downloadable File', + '2BAL' => 'Advertising|Periodicals|Quarterly Report|Internet Email', + '2JEE' => 'Advertising|Periodicals|Quarterly Report|All Internet Distribution Formats', + '2HYP' => 'Advertising|Periodicals|Quarterly Report|Recordable Media', + '2JAG' => 'Advertising|Periodicals|Quarterly Report|All Electronic Distribution Formats', + '2ANN' => 'Advertising|Periodicals|Annual Report|Printed', + '2FON' => 'Advertising|Periodicals|Annual Report|Internet Website', + '2FOH' => 'Advertising|Periodicals|Annual Report|Internet Downloadable File', + '2FOP' => 'Advertising|Periodicals|Annual Report|Internet Email', + '2FOY' => 'Advertising|Periodicals|Annual Report|All Internet Distribution Formats', + '2BAS' => 'Advertising|Periodicals|Annual Report|Recordable Media', + '2FOU' => 'Advertising|Periodicals|Annual Report|All Electronic Distribution Formats', + '2KIP' => 'Advertising|Periodicals|Program Advertising|Printed', + '2DEE' => 'Advertising|Periodicals|Wrapper|Printed', + '2FUD' => 'Advertising|Periodicals|Cover Wrap|Printed', + '2FUB' => 'Advertising|Periodicals|Belly Band|Printed', + '2BAT' => 'Advertising|Periodicals|Free Standing Insert, All Insert Types|Printed', + '2HIP' => 'Advertising|Periodicals|Free Standing Insert, Advertorial Insert|Printed', + '2BAG' => 'Advertising|Periodicals|All Periodical Types|Printed', + '2FIZ' => 'Advertising|Periodicals|All Periodical Types|Internet Website', + '2BOD' => 'Advertising|Periodicals|All Periodical Types|Internet Downloadable File', + '2BOW' => 'Advertising|Periodicals|All Periodical Types|Internet Email', + '2FOB' => 'Advertising|Periodicals|All Periodical Types|All Internet Distribution Formats', + '2FIR' => 'Advertising|Periodicals|All Periodical Types|Recordable Media', + '2FLU' => 'Advertising|Periodicals|All Periodical Types|All Electronic Distribution Formats', + '2EDH' => 'Advertising|Marketing Materials|Artist\'s Reference, All Types|Printed', + '2ECU' => 'Advertising|Marketing Materials|Artist\'s Reference, All Types|All Internet Distribution Formats', + '2DOT' => 'Advertising|Marketing Materials|Artist\'s Reference, All Types|All Electronic Distribution Formats', + '2MMA' => 'Advertising|Marketing Materials|Bill Insert|Printed', + '2MMB' => 'Advertising|Marketing Materials|Blow In Card|Printed', + '2MMC' => 'Advertising|Marketing Materials|Bound-in Insert|Printed', + '2MMD' => 'Advertising|Marketing Materials|Broadside|Printed', + '2EGG' => 'Advertising|Marketing Materials|Brochure|Printed', + '2EFF' => 'Advertising|Marketing Materials|Brochure|Internet Downloadable File', + '2EFS' => 'Advertising|Marketing Materials|Brochure|Internet Email', + '2EFT' => 'Advertising|Marketing Materials|Brochure|Recordable Media', + '2MME' => 'Advertising|Marketing Materials|Buckslip|Printed', + '2MMF' => 'Advertising|Marketing Materials|Business Card|Printed', + '2MMG' => 'Advertising|Marketing Materials|Business Envelope|Printed', + '2BIZ' => 'Advertising|Marketing Materials|Card, Business Greeting Card|Printed', + '2MMI' => 'Advertising|Marketing Materials|Business Invitation|Printed', + '2MMJ' => 'Advertising|Marketing Materials|Business Reply Card|Printed', + '2MMK' => 'Advertising|Marketing Materials|Business Reply Envelope|Printed', + '2MML' => 'Advertising|Marketing Materials|Business Stationery|Printed', + '2FIG' => 'Advertising|Marketing Materials|Catalog|Printed', + '2ELL' => 'Advertising|Marketing Materials|Catalog|Internet Downloadable File', + '2ELS' => 'Advertising|Marketing Materials|Catalog|Internet Email', + '2ELF' => 'Advertising|Marketing Materials|Catalog|Recordable Media', + '2EDU' => 'Advertising|Marketing Materials|CD ROM|Recordable Media', + '2MMM' => 'Advertising|Marketing Materials|Compliment Slip|Printed', + '2MMN' => 'Advertising|Marketing Materials|Coupon|Printed', + '2EGO' => 'Advertising|Marketing Materials|Coupon|Internet Downloadable File', + '2ENG' => 'Advertising|Marketing Materials|Coupon|Internet Email', + '2ENS' => 'Advertising|Marketing Materials|Coupon|Recordable Media', + '2MMP' => 'Advertising|Marketing Materials|Coupon Packs|Printed', + '2DVA' => 'Advertising|Marketing Materials|DVD|Recordable Media', + '2MMQ' => 'Advertising|Marketing Materials|Flyaway Card|Printed', + '2FLY' => 'Advertising|Marketing Materials|Flyer|Printed', + '2MMR' => 'Advertising|Marketing Materials|Leaflet|Printed', + '2MMS' => 'Advertising|Marketing Materials|Magalog|Printed', + '2END' => 'Advertising|Marketing Materials|Magalog|Internet Downloadable File', + '2EON' => 'Advertising|Marketing Materials|Magalog|Internet Email', + '2FAX' => 'Advertising|Marketing Materials|Magalog|Recordable Media', + '2MMT' => 'Advertising|Marketing Materials|One Sheet|Printed', + '2MMU' => 'Advertising|Marketing Materials|Onsert|Printed', + '2MMV' => 'Advertising|Marketing Materials|Polybag|Printed', + '2BUN' => 'Advertising|Marketing Materials|Promo Card|Printed', + '2MMW' => 'Advertising|Marketing Materials|Promotional Calendar, One Page|Printed', + '2FAS' => 'Advertising|Marketing Materials|Promotional Calendar, One Page|Internet Downloadable File', + '2FAY' => 'Advertising|Marketing Materials|Promotional Calendar, One Page|Internet Email', + '2GUT' => 'Advertising|Marketing Materials|Promotional Calendar, One Page|Recordable Media', + '2EWE' => 'Advertising|Marketing Materials|Promotional Calendar, One Page|All Electronic Distribution Formats', + '2YAM' => 'Advertising|Marketing Materials|Promotional Calendar, Multi-Page|Printed', + '2ESS' => 'Advertising|Marketing Materials|Promotional Calendar, Multi-Page|Internet Downloadable File', + '2ETA' => 'Advertising|Marketing Materials|Promotional Calendar, Multi-Page|Internet Email', + '2HAD' => 'Advertising|Marketing Materials|Promotional Calendar, Multi-Page|Recordable Media', + '2FET' => 'Advertising|Marketing Materials|Promotional E-card|Internet Email', + '2FEU' => 'Advertising|Marketing Materials|Promotional E-card|All Internet Distribution Formats', + '2FEH' => 'Advertising|Marketing Materials|Promotional E-card|Recordable Media', + '2FEN' => 'Advertising|Marketing Materials|Promotional E-card|Internet Downloadable File', + '2MMX' => 'Advertising|Marketing Materials|Promotional Envelope|Printed', + '2NUT' => 'Advertising|Marketing Materials|Promotional Postcard|Printed', + '2KAF' => 'Advertising|Marketing Materials|Public Relations, Press Kit|Printed', + '2JUT' => 'Advertising|Marketing Materials|Public Relations, Press Kit|Internet Website', + '2JUN' => 'Advertising|Marketing Materials|Public Relations, Press Kit|Internet Downloadable File', + '2JUS' => 'Advertising|Marketing Materials|Public Relations, Press Kit|Internet Email', + '2JOW' => 'Advertising|Marketing Materials|Public Relations, Press Kit|All Internet Distribution Formats', + '2JOB' => 'Advertising|Marketing Materials|Public Relations, Press Kit|Recordable Media', + '2JOE' => 'Advertising|Marketing Materials|Public Relations, Press Kit|All Electronic Distribution Formats', + '2KAB' => 'Advertising|Marketing Materials|Public Relations, Press Kit|Television Broadcast', + '2KEX' => 'Advertising|Marketing Materials|Public Relations, Press Release|Printed', + '2KEA' => 'Advertising|Marketing Materials|Public Relations, Press Release|Internet Website', + '2KAT' => 'Advertising|Marketing Materials|Public Relations, Press Release|Internet Downloadable File', + '2KAY' => 'Advertising|Marketing Materials|Public Relations, Press Release|Internet Email', + '2KAS' => 'Advertising|Marketing Materials|Public Relations, Press Release|Recordable Media', + '2KID' => 'Advertising|Marketing Materials|Public Relations, Press Release|All Electronic Distribution Formats', + '2KEF' => 'Advertising|Marketing Materials|Public Relations, Press Release|Television Broadcast', + '2JIB' => 'Advertising|Marketing Materials|Public Relations, All Types|Printed', + '2MMY' => 'Advertising|Marketing Materials|Sales Kit|Printed', + '2MMZ' => 'Advertising|Marketing Materials|Self Mailer|Printed', + '2JAM' => 'Advertising|Marketing Materials|All Marketing Material Types|Printed', + '2HAM' => 'Advertising|Marketing Materials|All Marketing Material Types|Internet Downloadable File', + '2DYE' => 'Advertising|Marketing Materials|All Marketing Material Types|Internet Email', + '2DUO' => 'Advertising|Marketing Materials|All Marketing Material Types|Recordable Media', + '2BEG' => 'Advertising|Book|Retail Book, Directory|Printed', + '2EAC' => 'Advertising|Book|Retail Book, Directory|E-Book in Internet Website', + '2EAD' => 'Advertising|Book|Retail Book, Directory|E-Book in Internet Downloadable File', + '2EAE' => 'Advertising|Book|Retail Book, Directory|All E-Book Internet Distribution Formats', + '2EAF' => 'Advertising|Book|Retail Book, Directory|E-Book on Recordable Media', + '2EAG' => 'Advertising|Book|Retail Book, Directory|All E-Book Distribution Formats', + '2ELM' => 'Advertising|Book|Textbook, All Types|Printed', + '2EAH' => 'Advertising|Book|Textbook, All Types|E-Book in Internet Website', + '2EAJ' => 'Advertising|Book|Textbook, All Types|E-Book in Internet Downloadable File', + '2EAK' => 'Advertising|Book|Textbook, All Types|All E-Book Internet Distribution Formats', + '2EAL' => 'Advertising|Book|Textbook, All Types|E-Book on Recordable Media', + '2EAM' => 'Advertising|Book|Textbook, All Types|All E-Book Distribution Formats', + '2HOG' => 'Advertising|Book|All Book Types|Printed', + '2EAN' => 'Advertising|Book|All Book Types|All E-Book Internet Distribution Formats', + '2EAP' => 'Advertising|Book|All Book Types|All E-Book Distribution Formats', + '2HEM' => 'Advertising|Display|Billboard, Bulletin|Printed', + '2BUR' => 'Advertising|Display|Billboard, Bulletin|Electronic Display', + '2DAG' => 'Advertising|Display|Billboard, Spectacular|Printed', + '2DAD' => 'Advertising|Display|Billboard, Spectacular|Electronic Display', + '2DAK' => 'Advertising|Display|Billboard, Wallscape|Printed', + '2DAH' => 'Advertising|Display|Billboard, Wallscape|Electronic Display', + '2DAB' => 'Advertising|Display|Billboard, Rotating Billboard|Printed', + '2BLD' => 'Advertising|Display|Billboard, Building Wrap|Printed', + '2BYS' => 'Advertising|Display|Billboard, Mobile Billboard|Printed', + '2BYE' => 'Advertising|Display|Billboard, Mobile Billboard|Electronic Display', + '2BIL' => 'Advertising|Display|Billboard, All Types|Printed', + '2BUD' => 'Advertising|Display|Billboard, All Types|Electronic Display', + '2BRR' => 'Advertising|Display|Banner, Backdrop|Printed', + '2BUB' => 'Advertising|Display|Banner, Background|Printed', + '2BRA' => 'Advertising|Display|Banner, Airborne Display|Printed', + '2BRO' => 'Advertising|Display|Banner, All Types|Printed', + '2BAN' => 'Advertising|Display|Banner, All Types|Electronic Display', + '2CAR' => 'Advertising|Display|Shopping Cart|Printed', + '2CRT' => 'Advertising|Display|Shopping Cart|Electronic Display', + '2FAD' => 'Advertising|Display|Poster, Movie Poster|Printed', + '2HON' => 'Advertising|Display|Poster, Movie Poster|Electronic Display', + '2DIB' => 'Advertising|Display|Poster, Door Side Poster|Printed', + '2DEY' => 'Advertising|Display|Poster, Door Side Poster|Electronic Display', + '2DEV' => 'Advertising|Display|Poster, Corporate Poster|Printed', + '2DEN' => 'Advertising|Display|Poster, Corporate Poster|Electronic Display', + '2ELE' => 'Advertising|Display|Poster, Elevator Advertising|Printed', + '2DID' => 'Advertising|Display|Poster, Elevator Advertising|Electronic Display', + '2DRY' => 'Advertising|Display|Poster, Restroom Poster|Printed', + '2WET' => 'Advertising|Display|Poster, Restroom Poster|Electronic Display', + '2DEL' => 'Advertising|Display|Poster, Backlit Print|Printed', + '2DEX' => 'Advertising|Display|Poster, Display Chrome|Printed', + '2FAT' => 'Advertising|Display|Poster, All Types|Printed', + '2DAW' => 'Advertising|Display|Poster, All Types|Electronic Display', + '2MOB' => 'Advertising|Display|Store Display, In-Store Poster|Printed', + '2DIT' => 'Advertising|Display|Store Display, In-Store Poster|Electronic Display', + '2FOG' => 'Advertising|Display|Store Display, All Display Types|Printed', + '2DIN' => 'Advertising|Display|Store Display, All Display Types|Electronic Display', + '2HOT' => 'Advertising|Display|Terminal Advertising, Airport Display|Printed', + '2JOU' => 'Advertising|Display|Terminal Advertising, Airport Display|Electronic Display', + '2DOM' => 'Advertising|Display|Terminal Advertising, Bus Stop Advertising|Printed', + '2DOL' => 'Advertising|Display|Terminal Advertising, Bus Stop Advertising|Electronic Display', + '2DOR' => 'Advertising|Display|Terminal Advertising, Ferry Terminal Advertising|Printed', + '2DON' => 'Advertising|Display|Terminal Advertising, Ferry Terminal Advertising|Electronic Display', + '2TAN' => 'Advertising|Display|Terminal Advertising, Shelter Advertising|Printed', + '2DOS' => 'Advertising|Display|Terminal Advertising, Shelter Advertising|Electronic Display', + '2DUB' => 'Advertising|Display|Terminal Advertising, Station Poster|Printed', + '2DOW' => 'Advertising|Display|Terminal Advertising, Station Poster|Electronic Display', + '2DUG' => 'Advertising|Display|Terminal Advertising, Subway Terminal Advertising|Printed', + '2DUE' => 'Advertising|Display|Terminal Advertising, Subway Terminal Advertising|Electronic Display', + '2DUN' => 'Advertising|Display|Terminal Advertising, Train Terminal Advertising|Printed', + '2DUI' => 'Advertising|Display|Terminal Advertising, Train Terminal Advertising|Electronic Display', + '2JOY' => 'Advertising|Display|Terminal Advertising, All Types|Printed', + '2DOE' => 'Advertising|Display|Terminal Advertising, All Types|Electronic Display', + '2TAX' => 'Advertising|Display|Transit Advertising, Taxi Advertising|Printed', + '2BUS' => 'Advertising|Display|Transit Advertising, Bus Panel|Printed', + '2TRC' => 'Advertising|Display|Transit Advertising, Bus Panel|Electronic Display', + '2TRE' => 'Advertising|Display|Transit Advertising, Bus Poster|Printed', + '2BPE' => 'Advertising|Display|Transit Advertising, Bus Poster|Electronic Display', + '2TRG' => 'Advertising|Display|Transit Advertising, Bus Rear Display|Printed', + '2TRF' => 'Advertising|Display|Transit Advertising, Bus Rear Display|Electronic Display', + '2TRN' => 'Advertising|Display|Transit Advertising, Bus Wrap|Printed', + '2TRM' => 'Advertising|Display|Transit Advertising, Bus Wrap|Electronic Display', + '2TRJ' => 'Advertising|Display|Transit Advertising, Subway Advertising|Printed', + '2TRI' => 'Advertising|Display|Transit Advertising, Subway Advertising|Electronic Display', + '2TRL' => 'Advertising|Display|Transit Advertising, Train Advertising|Printed', + '2TRK' => 'Advertising|Display|Transit Advertising, Train Advertising|Electronic Display', + '2TRQ' => 'Advertising|Display|Transit Advertising, Commercial Vehicles|Printed', + '2TRR' => 'Advertising|Display|Transit Advertising, Commercial Vehicles|Electronic Display', + '2FER' => 'Advertising|Display|Transit Advertising, Ferry Advertising|Printed', + '2TRH' => 'Advertising|Display|Transit Advertising, Ferry Advertising|Electronic Display', + '2TRA' => 'Advertising|Display|Transit Advertising, All Types|Printed', + '2TRB' => 'Advertising|Display|Transit Advertising, All Types|Electronic Display', + '2DAM' => 'Advertising|Display|Event, Stadium Advertising|Printed', + '2DAL' => 'Advertising|Display|Event, Stadium Advertising|Electronic Display', + '2DIS' => 'Advertising|Display|Event, Trade Show Display|Printed', + '2DAP' => 'Advertising|Display|Event, Trade Show Display|Electronic Display', + '2BIG' => 'Advertising|Display|All Display Types|Printed', + '2BOG' => 'Advertising|Display|All Display Types|Electronic Display', + '2BOY' => 'Advertising|Art|Art Display, Display Print|Printed', + '2ART' => 'Advertising|Art|Art Display, All Art Types|Printed', + '2BEL' => 'Advertising|Art|Art Display, All Art Types|Internet Website', + '2BEY' => 'Advertising|Art|Art Display, All Art Types|All Internet Distribution Formats', + '2BOS' => 'Advertising|Art|Art Display, All Art Types|Electronic Display', + '2BIS' => 'Advertising|Art|Art Display, All Art Types|All Electronic Distribution Formats', + '2ADH' => 'Advertising|Point of Purchase|Adhesive Tag|Printed', + '2BOT' => 'Advertising|Point of Purchase|Bottlenecker|Printed', + '2CAS' => 'Advertising|Point of Purchase|Case Card|Printed', + '2COU' => 'Advertising|Point of Purchase|Counter Card|Printed', + '2BUY' => 'Advertising|Point of Purchase|Floor Graphic|Printed', + '2TAG' => 'Advertising|Point of Purchase|Hang Tag|Printed', + '2GYM' => 'Advertising|Point of Purchase|Kiosk, Interactive Kiosk|Printed', + '2GUN' => 'Advertising|Point of Purchase|Kiosk, Interactive Kiosk|Electronic Display', + '2JUG' => 'Advertising|Point of Purchase|Kiosk, Telephone Kiosk|Printed', + '2FIN' => 'Advertising|Point of Purchase|Kiosk, All Types|Printed', + '2KIO' => 'Advertising|Point of Purchase|Kiosk, All Types|Electronic Display', + '2MEN' => 'Advertising|Point of Purchase|Menu|Printed', + '2TAL' => 'Advertising|Point of Purchase|Shelf Talker|Printed', + '2TIN' => 'Advertising|Point of Purchase|Slip Case|Printed', + '2WAX' => 'Advertising|Point of Purchase|Table Tent|Printed', + '2BIN' => 'Advertising|Point of Purchase|All Point of Purchase Types|Printed', + '2BIB' => 'Advertising|Point of Purchase|All Point of Purchase Types|Electronic Display', + '2BAR' => 'Advertising|Point of Purchase|All Point of Purchase Types|All Electronic Distribution Formats', + '2MAR' => 'Advertising|Website|Web Page, Design Element|Internet Website', + '2MAX' => 'Advertising|Website|Web Page, Design Element|All Internet Distribution Formats', + '2MAS' => 'Advertising|Website|Web Page, Design Element|Recordable Media', + '2MAW' => 'Advertising|Website|Web Page, Design Element|All Electronic Distribution Formats', + '2MED' => 'Advertising|Website|Web Page, Web Banner Ad|Internet Website', + '2MEW' => 'Advertising|Website|Web Page, Web Banner Ad|All Internet Distribution Formats', + '2MEG' => 'Advertising|Website|Web Page, Web Banner Ad|Recordable Media', + '2MEM' => 'Advertising|Website|Web Page, Web Banner Ad|All Electronic Distribution Formats', + '2JWL' => 'Advertising|Website|Web Page, Web Interstitial Ad|Internet Website', + '2MIG' => 'Advertising|Website|Web Page, Web Interstitial Ad|All Internet Distribution Formats', + '2MIB' => 'Advertising|Website|Web Page, Web Interstitial Ad|Recordable Media', + '2MID' => 'Advertising|Website|Web Page, Web Interstitial Ad|All Electronic Distribution Formats', + '2WEB' => 'Advertising|Website|Web Page, All Types|Internet Website', + '2KUE' => 'Advertising|Website|Web Page, All Types|All Internet Distribution Formats', + '2MAC' => 'Advertising|Website|Web Page, All Types|Recordable Media', + '2MAE' => 'Advertising|Website|Web Page, All Types|All Electronic Distribution Formats', + '2MIL' => 'Advertising|Website|Webcast, All Types|Internet Website', + '2EMA' => 'Advertising|Email|All Email Types|Internet Email', + '2ZUS' => 'Advertising|Mobile|All Mobile Types|Mobile', + '2FUR' => 'Advertising|Live Presentation|Sales Presentation|Projected Display', + '2EYE' => 'Advertising|Live Presentation|Panel Presentation|Projected Display', + '2TOE' => 'Advertising|Live Presentation|Trade Show Presentation|Projected Display', + '2JAW' => 'Advertising|Live Presentation|Stage Performance|Projected Display', + '2EAR' => 'Advertising|Live Presentation|All Live Presentation Types|All Electronic Distribution Formats', + '2FID' => 'Advertising|Merchandise|Apparel, T-Shirts|Printed or Woven', + '2FEZ' => 'Advertising|Merchandise|Apparel, General Apparel|Printed or Woven', + '2FIE' => 'Advertising|Merchandise|Folder|Printed', + '2AAY' => 'Advertising|All Media Types|Promotional Reproduction of Licensed Usage in Context|All Distribution Formats', + '2AAA' => 'Advertising|All Media Types|All Formats|All Distribution Formats', + '2GEM' => 'Editorial|Periodicals|Magazine, Consumer|Printed', + '2GDW' => 'Editorial|Periodicals|Magazine, Consumer|Internet Website', + '2GDY' => 'Editorial|Periodicals|Magazine, Consumer|Internet Downloadable File', + '2KIN' => 'Editorial|Periodicals|Magazine, Consumer|Internet Email', + '2GEA' => 'Editorial|Periodicals|Magazine, Consumer|All Internet Distribution Formats', + '2GDV' => 'Editorial|Periodicals|Magazine, Consumer|Recordable Media', + '2GDZ' => 'Editorial|Periodicals|Magazine, Consumer|All Electronic Distribution Formats', + '2MOM' => 'Editorial|Periodicals|Magazine, Trade|Printed', + '2MOW' => 'Editorial|Periodicals|Magazine, Trade|Internet Website', + '2MUT' => 'Editorial|Periodicals|Magazine, Trade|Internet Downloadable File', + '2NAB' => 'Editorial|Periodicals|Magazine, Trade|Internet Email', + '2NAG' => 'Editorial|Periodicals|Magazine, Trade|All Internet Distribution Formats', + '2GFD' => 'Editorial|Periodicals|Magazine, Trade|Recordable Media', + '2NOB' => 'Editorial|Periodicals|Magazine, Trade|All Electronic Distribution Formats', + '2MAY' => 'Editorial|Periodicals|Magazine, Education|Printed', + '2GEP' => 'Editorial|Periodicals|Magazine, Education|Internet Website', + '2GEQ' => 'Editorial|Periodicals|Magazine, Education|Internet Downloadable File', + '2NOW' => 'Editorial|Periodicals|Magazine, Education|Internet Email', + '2GES' => 'Editorial|Periodicals|Magazine, Education|All Internet Distribution Formats', + '2GEK' => 'Editorial|Periodicals|Magazine, Education|Recordable Media', + '2GER' => 'Editorial|Periodicals|Magazine, Education|All Electronic Distribution Formats', + '2MOP' => 'Editorial|Periodicals|Magazine, Custom Published|Printed', + '2GEF' => 'Editorial|Periodicals|Magazine, Custom Published|Internet Website', + '2GEG' => 'Editorial|Periodicals|Magazine, Custom Published|Internet Downloadable File', + '2NUN' => 'Editorial|Periodicals|Magazine, Custom Published|Internet Email', + '2GEI' => 'Editorial|Periodicals|Magazine, Custom Published|All Internet Distribution Formats', + '2GEC' => 'Editorial|Periodicals|Magazine, Custom Published|Recordable Media', + '2GEH' => 'Editorial|Periodicals|Magazine, Custom Published|All Electronic Distribution Formats', + '2MEL' => 'Editorial|Periodicals|Magazine, Partworks|Printed', + '2GEV' => 'Editorial|Periodicals|Magazine, Partworks|Internet Website', + '2GEW' => 'Editorial|Periodicals|Magazine, Partworks|Internet Downloadable File', + '2TAB' => 'Editorial|Periodicals|Magazine, Partworks|Internet Email', + '2GFB' => 'Editorial|Periodicals|Magazine, Partworks|All Internet Distribution Formats', + '2GEZ' => 'Editorial|Periodicals|Magazine, Partworks|Recordable Media', + '2GFA' => 'Editorial|Periodicals|Magazine, Partworks|All Electronic Distribution Formats', + '2WIG' => 'Editorial|Periodicals|Scholarly Journal|Printed', + '2GGF' => 'Editorial|Periodicals|Scholarly Journal|Internet Website', + '2GGG' => 'Editorial|Periodicals|Scholarly Journal|Internet Downloadable File', + '2TAD' => 'Editorial|Periodicals|Scholarly Journal|Internet Email', + '2GGI' => 'Editorial|Periodicals|Scholarly Journal|All Internet Distribution Formats', + '2GGD' => 'Editorial|Periodicals|Scholarly Journal|Recordable Media', + '2GGH' => 'Editorial|Periodicals|Scholarly Journal|All Electronic Distribution Formats', + '2MAG' => 'Editorial|Periodicals|Magazine, All Types|Printed', + '2GDP' => 'Editorial|Periodicals|Magazine, All Types|Internet Website', + '2GDM' => 'Editorial|Periodicals|Magazine, All Types|Internet Downloadable File', + '2GDQ' => 'Editorial|Periodicals|Magazine, All Types|Internet Email', + '2GDT' => 'Editorial|Periodicals|Magazine, All Types|All Internet Distribution Formats', + '2GDR' => 'Editorial|Periodicals|Magazine, All Types|Recordable Media', + '2GDS' => 'Editorial|Periodicals|Magazine, All Types|All Electronic Distribution Formats', + '2JET' => 'Editorial|Periodicals|Newspaper, All Types|Printed', + '2GFN' => 'Editorial|Periodicals|Newspaper, All Types|Internet Website', + '2GFP' => 'Editorial|Periodicals|Newspaper, All Types|Internet Downloadable File', + '2TAJ' => 'Editorial|Periodicals|Newspaper, All Types|Internet Email', + '2GFR' => 'Editorial|Periodicals|Newspaper, All Types|All Internet Distribution Formats', + '2GFM' => 'Editorial|Periodicals|Newspaper, All Types|Recordable Media', + '2GFQ' => 'Editorial|Periodicals|Newspaper, All Types|All Electronic Distribution Formats', + '2TUB' => 'Editorial|Periodicals|Newspaper, Weekly Supplement|Printed', + '2GFW' => 'Editorial|Periodicals|Newspaper, Weekly Supplement|Internet Website', + '2GFY' => 'Editorial|Periodicals|Newspaper, Weekly Supplement|Internet Downloadable File', + '2TAO' => 'Editorial|Periodicals|Newspaper, Weekly Supplement|Internet Email', + '2GFV' => 'Editorial|Periodicals|Newspaper, Weekly Supplement|All Internet Distribution Formats', + '2GFS' => 'Editorial|Periodicals|Newspaper, Weekly Supplement|Recordable Media', + '2GFU' => 'Editorial|Periodicals|Newspaper, Weekly Supplement|All Electronic Distribution Formats', + '2FAN' => 'Editorial|Periodicals|Newspaper, Tabloid|Printed', + '2TEX' => 'Editorial|Periodicals|Newspaper, Tabloid|Internet Website', + '2GGA' => 'Editorial|Periodicals|Newspaper, Tabloid|Internet Downloadable File', + '2TIP' => 'Editorial|Periodicals|Newspaper, Tabloid|Internet Email', + '2TON' => 'Editorial|Periodicals|Newspaper, Tabloid|All Internet Distribution Formats', + '2TIE' => 'Editorial|Periodicals|Newspaper, Tabloid|Recordable Media', + '2TOT' => 'Editorial|Periodicals|Newspaper, Tabloid|All Electronic Distribution Formats', + '2TOM' => 'Editorial|Periodicals|Newsletter|Printed', + '2GFH' => 'Editorial|Periodicals|Newsletter|Internet Website', + '2GFI' => 'Editorial|Periodicals|Newsletter|Internet Downloadable File', + '2NEL' => 'Editorial|Periodicals|Newsletter|Internet Email', + '2GFK' => 'Editorial|Periodicals|Newsletter|All Internet Distribution Formats', + '2GFG' => 'Editorial|Periodicals|Newsletter|Recordable Media', + '2GFJ' => 'Editorial|Periodicals|Newsletter|All Electronic Distribution Formats', + '2BUG' => 'Editorial|Book|Retail Book, Children\'s Book|Printed', + '2EPC' => 'Editorial|Book|Retail Book, Children\'s Book|E-Book in Internet Website', + '2EBE' => 'Editorial|Book|Retail Book, Children\'s Book|E-Book in Internet Downloadable File', + '2EGB' => 'Editorial|Book|Retail Book, Children\'s Book|E-Book in Internet Email', + '2EKB' => 'Editorial|Book|Retail Book, Children\'s Book|All E-Book Internet Distribution Formats', + '2ERB' => 'Editorial|Book|Retail Book, Children\'s Book|E-Book on Recordable Media', + '2EGC' => 'Editorial|Book|Retail Book, Children\'s Book|All E-Book Distribution Formats', + '2TAE' => 'Editorial|Book|Retail Book, Coffee Table Book|Printed', + '2TAV' => 'Editorial|Book|Retail Book, Concept Book|Printed', + '2EPD' => 'Editorial|Book|Retail Book, Concept Book|E-Book in Internet Website', + '2EBF' => 'Editorial|Book|Retail Book, Concept Book|E-Book in Internet Downloadable File', + '2EGD' => 'Editorial|Book|Retail Book, Concept Book|E-Book in Internet Email', + '2EKC' => 'Editorial|Book|Retail Book, Concept Book|All E-Book Internet Distribution Formats', + '2ERC' => 'Editorial|Book|Retail Book, Concept Book|E-Book on Recordable Media', + '2EGE' => 'Editorial|Book|Retail Book, Concept Book|All E-Book Distribution Formats', + '2DIR' => 'Editorial|Book|Retail Book, Directory|Printed', + '2EPE' => 'Editorial|Book|Retail Book, Directory|E-Book in Internet Website', + '2EBG' => 'Editorial|Book|Retail Book, Directory|E-Book in Internet Downloadable File', + '2ERD' => 'Editorial|Book|Retail Book, Directory|E-Book on Recordable Media', + '2YEA' => 'Editorial|Book|Retail Book, Directory|All Electronic Distribution Formats', + '2EAB' => 'Editorial|Book|Retail Book, Directory|All E-Book Distribution Formats', + '2HAN' => 'Editorial|Book|Retail Book, Handbook|Printed', + '2EPF' => 'Editorial|Book|Retail Book, Handbook|E-Book in Internet Website', + '2EBH' => 'Editorial|Book|Retail Book, Handbook|E-Book in Internet Downloadable File', + '2EGH' => 'Editorial|Book|Retail Book, Handbook|E-Book in Internet Email', + '2EKD' => 'Editorial|Book|Retail Book, Handbook|All E-Book Internet Distribution Formats', + '2ERF' => 'Editorial|Book|Retail Book, Handbook|E-Book on Recordable Media', + '2EGJ' => 'Editorial|Book|Retail Book, Handbook|All E-Book Distribution Formats', + '2HIL' => 'Editorial|Book|Retail Book, Hi-lo Book|Printed', + '2EPG' => 'Editorial|Book|Retail Book, Hi-lo Book|E-Book in Internet Website', + '2EBI' => 'Editorial|Book|Retail Book, Hi-lo Book|E-Book in Internet Downloadable File', + '2EGK' => 'Editorial|Book|Retail Book, Hi-lo Book|E-Book in Internet Email', + '2EKE' => 'Editorial|Book|Retail Book, Hi-lo Book|All E-Book Internet Distribution Formats', + '2ERG' => 'Editorial|Book|Retail Book, Hi-lo Book|E-Book on Recordable Media', + '2EGL' => 'Editorial|Book|Retail Book, Hi-lo Book|All E-Book Distribution Formats', + '2WAB' => 'Editorial|Book|Retail Book, Illustrated Book|Printed', + '2EPH' => 'Editorial|Book|Retail Book, Illustrated Book|E-Book in Internet Website', + '2EBJ' => 'Editorial|Book|Retail Book, Illustrated Book|E-Book in Internet Downloadable File', + '2EGM' => 'Editorial|Book|Retail Book, Illustrated Book|E-Book in Internet Email', + '2EKF' => 'Editorial|Book|Retail Book, Illustrated Book|All E-Book Internet Distribution Formats', + '2ERH' => 'Editorial|Book|Retail Book, Illustrated Book|E-Book on Recordable Media', + '2EGN' => 'Editorial|Book|Retail Book, Illustrated Book|All E-Book Distribution Formats', + '2WHA' => 'Editorial|Book|Retail Book, Illustrated Guide|Printed', + '2EPJ' => 'Editorial|Book|Retail Book, Illustrated Guide|E-Book in Internet Website', + '2EBL' => 'Editorial|Book|Retail Book, Illustrated Guide|E-Book in Internet Downloadable File', + '2EGP' => 'Editorial|Book|Retail Book, Illustrated Guide|E-Book in Internet Email', + '2EKG' => 'Editorial|Book|Retail Book, Illustrated Guide|All E-Book Internet Distribution Formats', + '2ERI' => 'Editorial|Book|Retail Book, Illustrated Guide|E-Book on Recordable Media', + '2EGQ' => 'Editorial|Book|Retail Book, Illustrated Guide|All E-Book Distribution Formats', + '2EGR' => 'Editorial|Book|Retail Book, Illustrated Guide|All E-Book Distribution Formats', + '2MAN' => 'Editorial|Book|Retail Book, Manual|Printed', + '2EPK' => 'Editorial|Book|Retail Book, Manual|E-Book in Internet Website', + '2EBM' => 'Editorial|Book|Retail Book, Manual|E-Book in Internet Downloadable File', + '2EGS' => 'Editorial|Book|Retail Book, Manual|E-Book in Internet Email', + '2EKH' => 'Editorial|Book|Retail Book, Manual|All E-Book Internet Distribution Formats', + '2ERJ' => 'Editorial|Book|Retail Book, Manual|E-Book on Recordable Media', + '2EGT' => 'Editorial|Book|Retail Book, Manual|All E-Book Distribution Formats', + '2YAP' => 'Editorial|Book|Retail Book, Novelty Book|Printed', + '2EPL' => 'Editorial|Book|Retail Book, Novelty Book|E-Book in Internet Website', + '2EBN' => 'Editorial|Book|Retail Book, Novelty Book|E-Book in Internet Downloadable File', + '2EGV' => 'Editorial|Book|Retail Book, Novelty Book|E-Book in Internet Email', + '2EKJ' => 'Editorial|Book|Retail Book, Novelty Book|All E-Book Internet Distribution Formats', + '2ERK' => 'Editorial|Book|Retail Book, Novelty Book|E-Book on Recordable Media', + '2EGW' => 'Editorial|Book|Retail Book, Novelty Book|All E-Book Distribution Formats', + '2YEN' => 'Editorial|Book|Retail Book, Postcard Book|Printed', + '2EPM' => 'Editorial|Book|Retail Book, Postcard Book|E-Book in Internet Website', + '2EBP' => 'Editorial|Book|Retail Book, Postcard Book|E-Book in Internet Downloadable File', + '2EGY' => 'Editorial|Book|Retail Book, Postcard Book|E-Book in Internet Email', + '2EKK' => 'Editorial|Book|Retail Book, Postcard Book|All E-Book Internet Distribution Formats', + '2ERL' => 'Editorial|Book|Retail Book, Postcard Book|E-Book on Recordable Media', + '2EGZ' => 'Editorial|Book|Retail Book, Postcard Book|All E-Book Distribution Formats', + '2YOK' => 'Editorial|Book|Retail Book, Young Adult Book|Printed', + '2EPN' => 'Editorial|Book|Retail Book, Young Adult Book|E-Book in Internet Website', + '2EBQ' => 'Editorial|Book|Retail Book, Young Adult Book|E-Book in Internet Downloadable File', + '2EJB' => 'Editorial|Book|Retail Book, Young Adult Book|E-Book in Internet Email', + '2EKL' => 'Editorial|Book|Retail Book, Young Adult Book|All E-Book Internet Distribution Formats', + '2ERM' => 'Editorial|Book|Retail Book, Young Adult Book|E-Book on Recordable Media', + '2EJC' => 'Editorial|Book|Retail Book, Young Adult Book|All E-Book Distribution Formats', + '2BOO' => 'Editorial|Book|Retail Book, All Types|Printed', + '2EPB' => 'Editorial|Book|Retail Book, All Types|E-Book in Internet Website', + '2EBC' => 'Editorial|Book|Retail Book, All Types|E-Book in Internet Downloadable File', + '2EJD' => 'Editorial|Book|Retail Book, All Types|E-Book in Internet Email', + '2EKM' => 'Editorial|Book|Retail Book, All Types|All E-Book Internet Distribution Formats', + '2ERN' => 'Editorial|Book|Retail Book, All Types|E-Book on Recordable Media', + '2EJE' => 'Editorial|Book|Retail Book, All Types|All E-Book Distribution Formats', + '2EEL' => 'Editorial|Book|Textbook, Compendium|Printed', + '2EPQ' => 'Editorial|Book|Textbook, Compendium|E-Book in Internet Website', + '2EBS' => 'Editorial|Book|Textbook, Compendium|E-Book in Internet Downloadable File', + '2EJF' => 'Editorial|Book|Textbook, Compendium|E-Book in Internet Email', + '2EKN' => 'Editorial|Book|Textbook, Compendium|All E-Book Internet Distribution Formats', + '2ERP' => 'Editorial|Book|Textbook, Compendium|E-Book on Recordable Media', + '2EJJ' => 'Editorial|Book|Textbook, Compendium|All E-Book Distribution Formats', + '2EMU' => 'Editorial|Book|Textbook, Course Pack|Printed', + '2GBN' => 'Editorial|Book|Textbook, Course Pack|Internet Website', + '2GBM' => 'Editorial|Book|Textbook, Course Pack|Internet Downloadable File', + '2ZOO' => 'Editorial|Book|Textbook, Course Pack|Internet Email', + '2GBQ' => 'Editorial|Book|Textbook, Course Pack|All Internet Distribution Formats', + '2ZOA' => 'Editorial|Book|Textbook, Course Pack|Recordable Media', + '2GBP' => 'Editorial|Book|Textbook, Course Pack|All Distribution Formats', + '2BEE' => 'Editorial|Book|Textbook, Middle Reader|Printed', + '2EPR' => 'Editorial|Book|Textbook, Middle Reader|E-Book in Internet Website', + '2EBT' => 'Editorial|Book|Textbook, Middle Reader|E-Book in Internet Downloadable File', + '2EJK' => 'Editorial|Book|Textbook, Middle Reader|E-Book in Internet Email', + '2EKP' => 'Editorial|Book|Textbook, Middle Reader|All E-Book Internet Distribution Formats', + '2ERQ' => 'Editorial|Book|Textbook, Middle Reader|E-Book on Recordable Media', + '2EJL' => 'Editorial|Book|Textbook, Middle Reader|All E-Book Distribution Formats', + '2BOA' => 'Editorial|Book|Textbook, Student Edition|Printed', + '2EPS' => 'Editorial|Book|Textbook, Student Edition|E-Book in Internet Website', + '2EBV' => 'Editorial|Book|Textbook, Student Edition|E-Book in Internet Downloadable File', + '2EJM' => 'Editorial|Book|Textbook, Student Edition|E-Book in Internet Email', + '2EKQ' => 'Editorial|Book|Textbook, Student Edition|All E-Book Internet Distribution Formats', + '2ERS' => 'Editorial|Book|Textbook, Student Edition|E-Book on Recordable Media', + '2EJN' => 'Editorial|Book|Textbook, Student Edition|All E-Book Distribution Formats', + '2FOX' => 'Editorial|Book|Textbook, All Types|Printed', + '2EPP' => 'Editorial|Book|Textbook, All Types|E-Book in Internet Website', + '2EBR' => 'Editorial|Book|Textbook, All Types|E-Book in Internet Downloadable File', + '2EGA' => 'Editorial|Book|Textbook, All Types|E-Book in Internet Email', + '2EKR' => 'Editorial|Book|Textbook, All Types|All E-Book Internet Distribution Formats', + '2ERT' => 'Editorial|Book|Textbook, All Types|E-Book on Recordable Media', + '2EJP' => 'Editorial|Book|Textbook, All Types|All E-Book Distribution Formats', + '2GBZ' => 'Editorial|Book|Textbook Ancillary Materials, Educational Film Set|Projected Display', + '2YET' => 'Editorial|Book|Textbook Ancillary Materials, Packaging For Recordable Media|Printed', + '2YUM' => 'Editorial|Book|Textbook Ancillary Materials, Lab Manual|Printed', + '2EPZ' => 'Editorial|Book|Textbook Ancillary Materials, Lab Manual|E-Book in Internet Website', + '2EBA' => 'Editorial|Book|Textbook Ancillary Materials, Lab Manual|E-Book in Internet Downloadable File', + '2EJQ' => 'Editorial|Book|Textbook Ancillary Materials, Lab Manual|E-Book in Internet Email', + '2EKS' => 'Editorial|Book|Textbook Ancillary Materials, Lab Manual|All E-Book Internet Distribution Formats', + '2ERU' => 'Editorial|Book|Textbook Ancillary Materials, Lab Manual|E-Book on Recordable Media', + '2EJR' => 'Editorial|Book|Textbook Ancillary Materials, Lab Manual|All E-Book Distribution Formats', + '2YAK' => 'Editorial|Book|Textbook Ancillary Materials, Teachers\' Edition|Printed', + '2EPT' => 'Editorial|Book|Textbook Ancillary Materials, Teachers\' Edition|E-Book in Internet Website', + '2EBW' => 'Editorial|Book|Textbook Ancillary Materials, Teachers\' Edition|E-Book in Internet Downloadable File', + '2EJS' => 'Editorial|Book|Textbook Ancillary Materials, Teachers\' Edition|E-Book in Internet Email', + '2EKT' => 'Editorial|Book|Textbook Ancillary Materials, Teachers\' Edition|All E-Book Internet Distribution Formats', + '2ERV' => 'Editorial|Book|Textbook Ancillary Materials, Teachers\' Edition|E-Book on Recordable Media', + '2EJT' => 'Editorial|Book|Textbook Ancillary Materials, Teachers\' Edition|All E-Book Distribution Formats', + '2ZOT' => 'Editorial|Book|Textbook Ancillary Materials, Teacher\'s Manual|Printed', + '2EPW' => 'Editorial|Book|Textbook Ancillary Materials, Teacher\'s Manual|E-Book in Internet Website', + '2EBD' => 'Editorial|Book|Textbook Ancillary Materials, Teacher\'s Manual|E-Book in Internet Downloadable File', + '2EJV' => 'Editorial|Book|Textbook Ancillary Materials, Teacher\'s Manual|E-Book in Internet Email', + '2EKU' => 'Editorial|Book|Textbook Ancillary Materials, Teacher\'s Manual|All E-Book Internet Distribution Formats', + '2ERW' => 'Editorial|Book|Textbook Ancillary Materials, Teacher\'s Manual|E-Book on Recordable Media', + '2EJW' => 'Editorial|Book|Textbook Ancillary Materials, Teacher\'s Manual|All E-Book Distribution Formats', + '2GEE' => 'Editorial|Book|Textbook Ancillary Materials, Workbook|Printed', + '2EPY' => 'Editorial|Book|Textbook Ancillary Materials, Workbook|E-Book in Internet Website', + '2EBB' => 'Editorial|Book|Textbook Ancillary Materials, Workbook|E-Book in Internet Downloadable File', + '2EJY' => 'Editorial|Book|Textbook Ancillary Materials, Workbook|E-Book in Internet Email', + '2EKV' => 'Editorial|Book|Textbook Ancillary Materials, Workbook|All E-Book Internet Distribution Formats', + '2ERY' => 'Editorial|Book|Textbook Ancillary Materials, Workbook|E-Book on Recordable Media', + '2EJZ' => 'Editorial|Book|Textbook Ancillary Materials, Workbook|All E-Book Distribution Formats', + '2ELK' => 'Editorial|Book|Textbook Ancillary Materials, All Ancillary Types|Printed', + '2GBY' => 'Editorial|Book|Textbook Ancillary Materials, All Ancillary Types|All Internet Distribution Formats', + '2GBW' => 'Editorial|Book|Textbook Ancillary Materials, All Ancillary Types|All Distribution Formats', + '2NAY' => 'Editorial|Book|Reference Book, Encyclopedia|Printed', + '2EAQ' => 'Editorial|Book|Reference Book, Encyclopedia|E-Book in Internet Website', + '2EMB' => 'Editorial|Book|Reference Book, Encyclopedia|E-Book in Internet Downloadable File', + '2EMC' => 'Editorial|Book|Reference Book, Encyclopedia|All E-Book Internet Distribution Formats', + '2EMD' => 'Editorial|Book|Reference Book, Encyclopedia|E-Book on Recordable Media', + '2NAH' => 'Editorial|Book|Reference Book, Encyclopedia|All Electronic Distribution Formats', + '2NIP' => 'Editorial|Book|Reference Book, Telephone Book|Printed', + '2EMF' => 'Editorial|Book|Reference Book, Telephone Book|E-Book in Internet Website', + '2EMG' => 'Editorial|Book|Reference Book, Telephone Book|E-Book in Internet Downloadable File', + '2EMH' => 'Editorial|Book|Reference Book, Telephone Book|All E-Book Internet Distribution Formats', + '2EMI' => 'Editorial|Book|Reference Book, Telephone Book|E-Book on Recordable Media', + '2EMJ' => 'Editorial|Book|Reference Book, Telephone Book|All E-Book Distribution Formats', + '2DOG' => 'Editorial|Book|Reference Book, All Types|Printed', + '2EMK' => 'Editorial|Book|Reference Book, All Types|E-Book in Internet Website', + '2EML' => 'Editorial|Book|Reference Book, All Types|E-Book in Internet Downloadable File', + '2EMM' => 'Editorial|Book|Reference Book, All Types|All E-Book Internet Distribution Formats', + '2EMN' => 'Editorial|Book|Reference Book, All Types|E-Book on Recordable Media', + '2EMP' => 'Editorial|Book|Reference Book, All Types|All E-Book Distribution Formats', + '2DEW' => 'Editorial|Book|Trade Book, All Types|Printed', + '2EPV' => 'Editorial|Book|Trade Book, All Types|E-Book in Internet Website', + '2EMQ' => 'Editorial|Book|Trade Book, All Types|E-Book in Internet Downloadable File', + '2EMR' => 'Editorial|Book|Trade Book, All Types|E-Book in Internet Email', + '2EMS' => 'Editorial|Book|Trade Book, All Types|All E-Book Internet Distribution Formats', + '2ERA' => 'Editorial|Book|Trade Book, All Types|E-Book on Recordable Media', + '2EMT' => 'Editorial|Book|Trade Book, All Types|All E-Book Distribution Formats', + '2MOG' => 'Editorial|Book|All Book Types|Printed', + '2EPA' => 'Editorial|Book|All Book Types|E-Book in Internet Website', + '2EBK' => 'Editorial|Book|All Book Types|E-Book in Internet Downloadable File', + '2EJU' => 'Editorial|Book|All Book Types|E-Book in Internet Email', + '2EKA' => 'Editorial|Book|All Book Types|All E-Book Internet Distribution Formats', + '2ERZ' => 'Editorial|Book|All Book Types|E-Book on Recordable Media', + '2EJA' => 'Editorial|Book|All Book Types|All E-Book Distribution Formats', + '2MOR' => 'Editorial|Book|Artist\'s Reference, All Types|Printed', + '2EKW' => 'Editorial|Book|Artist\'s Reference, All Types|All E-Book Internet Distribution Formats', + '2EMV' => 'Editorial|Book|Artist\'s Reference, All Types|All E-Book Distribution Formats', + '2GAL' => 'Editorial|Display|Gallery Exhibition|Printed', + '2GDJ' => 'Editorial|Display|Gallery Exhibition|Electronic Display', + '2MUS' => 'Editorial|Display|Museum Display|Printed', + '2GDK' => 'Editorial|Display|Museum Display|Electronic Display', + '2EAU' => 'Editorial|Display|Poster, Educational Poster|Printed', + '2GHG' => 'Editorial|Website|Web Page, Body Content|Internet Website', + '2GHK' => 'Editorial|Website|Web Page, Body Content|All Internet Distribution Formats', + '2GHH' => 'Editorial|Website|Web Page, Body Content|Recordable Media', + '2GHJ' => 'Editorial|Website|Web Page, Body Content|All Electronic Distribution Formats', + '2GHB' => 'Editorial|Website|Web Page, All Types|Internet Website', + '2GHF' => 'Editorial|Website|Web Page, All Types|All Internet Distribution Formats', + '2GHC' => 'Editorial|Website|Web Page, All Types|Recordable Media', + '2GHD' => 'Editorial|Website|Web Page, All Types|All Electronic Distribution Formats', + '2GHA' => 'Editorial|Website|Webcast, All Types|Internet Website', + '2ZAG' => 'Editorial|Mobile|All Mobile Types|Mobile', + '2GGM' => 'Editorial|Merchandise|CD ROM|Recordable Media', + '2DVE' => 'Editorial|Merchandise|DVD|Recordable Media', + '2AAE' => 'Editorial|All Media Types|All Formats|All Distribution Formats', + '2ZIG' => 'Products|Mobile|Wallpaper|Mobile', + '2ZIP' => 'Products|Mobile|Game, All Types|Mobile', + '2ZAP' => 'Products|Mobile|Entertainment Programming|Mobile', + '2ZEN' => 'Products|Mobile|Computer Software|Mobile', + '2ZAM' => 'Products|Mobile|All Mobile Types|Mobile', + '2ADD' => 'Products|Merchandise|Address Book|Printed', + '2ANT' => 'Products|Merchandise|Anthology|Printed', + '2APP' => 'Products|Merchandise|Apparel, General Apparel|Printed or Woven', + '2TST' => 'Products|Merchandise|Apparel, T-Shirts|Printed or Woven', + '2BIO' => 'Products|Merchandise|Birthday Book|Printed', + '2BLA' => 'Products|Merchandise|Blank Note Book|Printed', + '2ATM' => 'Products|Merchandise|Card, ATM Card|Printed', + '2BNK' => 'Products|Merchandise|Card, Bank Card|Printed', + '2CRE' => 'Products|Merchandise|Card, Credit Card|Printed', + '2BIT' => 'Products|Merchandise|Card, Debit Card|Printed', + '2GFT' => 'Products|Merchandise|Card, Gift Card|Printed', + '2GRE' => 'Products|Merchandise|Card, Greeting Card|Printed', + '2HER' => 'Products|Merchandise|Card, Hero Card|Printed', + '2CRD' => 'Products|Merchandise|Card, Other Card|Printed', + '2ATT' => 'Products|Merchandise|Card, Phone Card|Printed', + '2CDR' => 'Products|Merchandise|CD ROM|Recordable Media', + '2CHK' => 'Products|Merchandise|Check|Printed', + '2BAK' => 'Products|Merchandise|Computer Software|Internet Downloadable File', + '2BAU' => 'Products|Merchandise|Computer Software|Internet Email', + '2BAV' => 'Products|Merchandise|Computer Software|All Internet Distribution Formats', + '2BAJ' => 'Products|Merchandise|Computer Software|Recordable Media', + '2WAR' => 'Products|Merchandise|Computer Software|All Electronic Distribution Formats', + '2GIG' => 'Products|Merchandise|Datebook|Printed', + '2DIA' => 'Products|Merchandise|Diary|Printed', + '2BAZ' => 'Products|Merchandise|Diary|Internet Downloadable File', + '2BBA' => 'Products|Merchandise|Diary|Internet Email', + '2BAW' => 'Products|Merchandise|Diary|Recordable Media', + '2HUB' => 'Products|Merchandise|Double Postcard|Printed', + '2DVD' => 'Products|Merchandise|DVD|Recordable Media', + '2EAT' => 'Products|Merchandise|Edible Media|Printed', + '2FOL' => 'Products|Merchandise|Folder|Printed', + '2GAB' => 'Products|Merchandise|Game, Computer Game|Internet Downloadable File', + '2GAH' => 'Products|Merchandise|Game, Computer Game|Internet Email', + '2GAE' => 'Products|Merchandise|Game, Computer Game|All Internet Distribution Formats', + '2GAG' => 'Products|Merchandise|Game, Computer Game|Recordable Media', + '2GAN' => 'Products|Merchandise|Game, Computer Game|All Electronic Distribution Formats', + '2GAP' => 'Products|Merchandise|Game, All Types|Printed', + '2GAT' => 'Products|Merchandise|Game, All Types|Internet Downloadable File', + '2GAS' => 'Products|Merchandise|Game, All Types|Internet Email', + '2GAD' => 'Products|Merchandise|Game, All Types|All Internet Distribution Formats', + '2GAR' => 'Products|Merchandise|Game, All Types|Recordable Media', + '2GAM' => 'Products|Merchandise|Game, All Types|All Electronic Distribution Formats', + '2BOX' => 'Products|Merchandise|Gift Box|Printed', + '2GIF' => 'Products|Merchandise|Gift Certificate|Printed', + '2WRP' => 'Products|Merchandise|Gift Wrap|Printed', + '2JIG' => 'Products|Merchandise|Jigsaw Puzzle|Printed', + '2JIN' => 'Products|Merchandise|Jigsaw Puzzle|Internet Downloadable File', + '2JIL' => 'Products|Merchandise|Jigsaw Puzzle|Recordable Media', + '2JRN' => 'Products|Merchandise|Journal|Printed', + '2MAP' => 'Products|Merchandise|Map|Printed', + '2MAD' => 'Products|Merchandise|Map|Internet Downloadable File', + '2MET' => 'Products|Merchandise|Map|Internet Email', + '2MIM' => 'Products|Merchandise|Map|All Internet Distribution Formats', + '2MIR' => 'Products|Merchandise|Map|Recordable Media', + '2MAB' => 'Products|Merchandise|Map|All Electronic Distribution Formats', + '2MOU' => 'Products|Merchandise|Mouse Pad|Printed', + '2MUG' => 'Products|Merchandise|Mugs|Printed', + '2NOV' => 'Products|Merchandise|Novelty Products|Printed', + '2MCH' => 'Products|Merchandise|Other Merchandise|Printed', + '2ALB' => 'Products|Merchandise|Photo Album|Printed', + '2MAT' => 'Products|Merchandise|Placemat|Printed', + '2MRP' => 'Products|Merchandise|Plates|Printed', + '2TOP' => 'Products|Merchandise|Poster, Retail Poster|Printed', + '2FUN' => 'Products|Merchandise|Playing Cards|Printed', + '2CLO' => 'Products|Merchandise|Retail Calendar, One Page|Printed', + '2CAL' => 'Products|Merchandise|Retail Calendar, Multi-Page|Printed', + '2BCJ' => 'Products|Merchandise|Retail Calendar, Multi-Page|Internet Downloadable File', + '2BCI' => 'Products|Merchandise|Retail Calendar, Multi-Page|Internet Email', + '2BCH' => 'Products|Merchandise|Retail Calendar, Multi-Page|All Internet Distribution Formats', + '2BCF' => 'Products|Merchandise|Retail Calendar, Multi-Page|Recordable Media', + '2BCG' => 'Products|Merchandise|Retail Calendar, Multi-Page|All Electronic Distribution Formats', + '2FAR' => 'Products|Merchandise|Retail Postcard|Printed', + '2FIB' => 'Products|Merchandise|Screen Saver|Internet Downloadable File', + '2GEL' => 'Products|Merchandise|Screen Saver|Internet Email', + '2TOD' => 'Products|Merchandise|Screen Saver|All Internet Distribution Formats', + '2WRY' => 'Products|Merchandise|Screen Saver|Recordable Media', + '2HEX' => 'Products|Merchandise|Screen Saver|All Electronic Distribution Formats', + '2KEP' => 'Products|Merchandise|Souvenir|Printed', + '2WEE' => 'Products|Merchandise|Stamp|Printed', + '2WIT' => 'Products|Merchandise|Stationery|Printed', + '2TIC' => 'Products|Merchandise|Sticker|Printed', + '2FEM' => 'Products|Merchandise|Textiles|Printed or Woven', + '2TKT' => 'Products|Merchandise|Ticket|Printed', + '2TOY' => 'Products|Merchandise|Toy|Printed', + '2TRD' => 'Products|Merchandise|Trading Cards|Printed', + '2TUA' => 'Products|Merchandise|Virtual Reality|Recordable Media', + '2WAL' => 'Products|Merchandise|Wallpaper|Printed', + '2MER' => 'Products|Merchandise|All Merchandise Types|Printed', + '2BAB' => 'Products|Art|Artist\'s Reference, Tattoo|Printed', + '2DVL' => 'Products|Product Packaging|Packaging For Recordable Media, Liner Notes|Printed', + '2DVP' => 'Products|Product Packaging|Packaging For Recordable Media, All Packaging Types|Printed', + '2FRA' => 'Products|Product Packaging|Picture Frame Insert|Printed', + '2EVE' => 'Products|Product Packaging|Retail Packaging, All Packaging Types|Printed', + '2WHO' => 'Products|Product Packaging|Wholesale Packaging, All Packaging Types|Printed', + '2DAY' => 'Products|Product Packaging|All Product Packaging Types|Printed', + '2AAP' => 'Products|All Media Types|All Formats|All Distribution Formats', + '2TUX' => 'Internal Company Use|Periodicals|Magazine, Custom Published|Printed', + '2BIC' => 'Internal Company Use|Periodicals|Magazine, Custom Published|Intranet and Extranet Website', + '2BIF' => 'Internal Company Use|Periodicals|Magazine, Custom Published|Intranet and Extranet Downloadable File', + '2FOE' => 'Internal Company Use|Periodicals|Magazine, Custom Published|Internet Email', + '2BII' => 'Internal Company Use|Periodicals|Magazine, Custom Published|All Intranet and Extranet Distribution Formats', + '2BIA' => 'Internal Company Use|Periodicals|Magazine, Custom Published|Recordable Media', + '2BIH' => 'Internal Company Use|Periodicals|Magazine, Custom Published|All Electronic Distribution Formats', + '2FRO' => 'Internal Company Use|Comp Use|All Comp Types|Printed', + '2FPO' => 'Internal Company Use|Comp Use|All Comp Types|All Electronic Distribution Formats', + '2GED' => 'Internal Company Use|Internal Review|All Review Types|Printed', + '2GID' => 'Internal Company Use|Internal Review|All Review Types|All Electronic Distribution Formats', + '2GOA' => 'Internal Company Use|Promotional Materials|Corporate Brochure|Printed', + '2BHH' => 'Internal Company Use|Promotional Materials|Corporate Brochure|Intranet and Extranet Downloadable File', + '2BHI' => 'Internal Company Use|Promotional Materials|Corporate Brochure|Intranet and Extranet Email', + '2BHG' => 'Internal Company Use|Promotional Materials|Corporate Brochure|Recordable Media', + '2BHN' => 'Internal Company Use|Promotional Materials|Corporate Calendar|Printed', + '2BHL' => 'Internal Company Use|Promotional Materials|Corporate Calendar|Intranet and Extranet Downloadable File', + '2BHM' => 'Internal Company Use|Promotional Materials|Corporate Calendar|Intranet and Extranet Email', + '2BHK' => 'Internal Company Use|Promotional Materials|Corporate Calendar|Recordable Media', + '2BHY' => 'Internal Company Use|Promotional Materials|Corporate Folder|Printed', + '2BHQ' => 'Internal Company Use|Promotional Materials|Card, Corporate Card|Printed', + '2BHT' => 'Internal Company Use|Promotional Materials|Card, Corporate Card|Intranet and Extranet Downloadable File', + '2BHU' => 'Internal Company Use|Promotional Materials|Card, Corporate Card|Intranet and Extranet Email', + '2BHS' => 'Internal Company Use|Promotional Materials|Card, Corporate Card|Recordable Media', + '2BHZ' => 'Internal Company Use|Promotional Materials|CD ROM|Recordable Media', + '2DVI' => 'Internal Company Use|Promotional Materials|DVD|Recordable Media', + '2BHV' => 'Internal Company Use|Promotional Materials|Sales Kit|All Electronic Distribution Formats', + '2BHW' => 'Internal Company Use|Promotional Materials|Training Materials|Printed', + '2BJN' => 'Internal Company Use|Website|Web Page, Content Body|Intranet and Extranet Website', + '2FAB' => 'Internal Company Use|Website|Web Page, Content Body|Recordable Media', + '2FAC' => 'Internal Company Use|Website|Web Page, Content Body|All Electronic Distribution Formats', + '2FAH' => 'Internal Company Use|Website|Web Page, Design Element|Intranet and Extranet Website', + '2FAI' => 'Internal Company Use|Website|Web Page, Design Element|Recordable Media', + '2FAJ' => 'Internal Company Use|Website|Web Page, Design Element|All Electronic Distribution Formats', + '2NET' => 'Internal Company Use|Website|Web Page, All Types|Intranet and Extranet Website', + '2BJL' => 'Internal Company Use|Website|Web Page, All Types|Recordable Media', + '2BJK' => 'Internal Company Use|Website|Web Page, All Types|All Electronic Distribution Formats', + '2BJH' => 'Internal Company Use|Website|Webcast, All Types|Intranet and Extranet Website', + '2WAN' => 'Internal Company Use|Website|All Website Types|Intranet and Extranet Website', + '2BHD' => 'Internal Company Use|Email|All Email Types|Intranet and Extranet Email', + '2ZUM' => 'Internal Company Use|Mobile|All Mobile Types|Mobile', + '2BHF' => 'Internal Company Use|Live Presentation|Internal Presentation|Projected Display', + '2BHB' => 'Internal Company Use|Art|Art Display, Display Print|Printed', + '2GOY' => 'Internal Company Use|Art|Art Display, All Art Types|Printed', + '2HAO' => 'Internal Company Use|Art|Art Display, All Art Types|Electronic Display', + '2AAI' => 'Internal Company Use|All Media Types|All Formats|All Distribution Formats', + '2TVC' => 'Motion Picture & TV|Television Programming|Commercial|Television Broadcast', + '2TEB' => 'Motion Picture & TV|Television Programming|Commercial|Internet Downloadable File', + '2TEC' => 'Motion Picture & TV|Television Programming|Commercial|All Internet Distribution Formats', + '2TEG' => 'Motion Picture & TV|Television Programming|Commercial|Recordable Media', + '2TVD' => 'Motion Picture & TV|Television Programming|Commercial|All Electronic Distribution Formats', + '2TVE' => 'Motion Picture & TV|Television Programming|Infomercial|Television Broadcast', + '2TEH' => 'Motion Picture & TV|Television Programming|Infomercial|Internet Downloadable File', + '2TEJ' => 'Motion Picture & TV|Television Programming|Infomercial|All Internet Distribution Formats', + '2TEK' => 'Motion Picture & TV|Television Programming|Infomercial|Recordable Media', + '2TVF' => 'Motion Picture & TV|Television Programming|Infomercial|All Electronic Distribution Formats', + '2TVG' => 'Motion Picture & TV|Television Programming|On-Air Promotion|Television Broadcast', + '2TEL' => 'Motion Picture & TV|Television Programming|On-Air Promotion|Internet Downloadable File', + '2TEM' => 'Motion Picture & TV|Television Programming|On-Air Promotion|All Internet Distribution Formats', + '2TEP' => 'Motion Picture & TV|Television Programming|On-Air Promotion|Recordable Media', + '2TVH' => 'Motion Picture & TV|Television Programming|On-Air Promotion|All Electronic Distribution Formats', + '2TVI' => 'Motion Picture & TV|Television Programming|Documentary Program|Television Broadcast', + '2TER' => 'Motion Picture & TV|Television Programming|Documentary Program|Internet Downloadable File', + '2TES' => 'Motion Picture & TV|Television Programming|Documentary Program|All Internet Distribution Formats', + '2TET' => 'Motion Picture & TV|Television Programming|Documentary Program|Recordable Media', + '2TVJ' => 'Motion Picture & TV|Television Programming|Documentary Program|All Electronic Distribution Formats', + '2TVA' => 'Motion Picture & TV|Television Programming|All Television Advertising Types|Television Broadcast', + '2TEA' => 'Motion Picture & TV|Television Programming|All Television Advertising Types|Internet Downloadable File', + '2TEQ' => 'Motion Picture & TV|Television Programming|All Television Advertising Types|All Internet Distribution Formats', + '2TED' => 'Motion Picture & TV|Television Programming|All Television Advertising Types|Recordable Media', + '2TVB' => 'Motion Picture & TV|Television Programming|All Television Advertising Types|All Electronic Distribution Formats', + '2TVK' => 'Motion Picture & TV|Television Programming|Educational Program|Television Broadcast', + '2TEU' => 'Motion Picture & TV|Television Programming|Educational Program|Internet Downloadable File', + '2TEV' => 'Motion Picture & TV|Television Programming|Educational Program|All Internet Distribution Formats', + '2TEW' => 'Motion Picture & TV|Television Programming|Educational Program|Recordable Media', + '2TVL' => 'Motion Picture & TV|Television Programming|Educational Program|All Electronic Distribution Formats', + '2TVM' => 'Motion Picture & TV|Television Programming|Entertainment Program|Television Broadcast', + '2TEY' => 'Motion Picture & TV|Television Programming|Entertainment Program|Internet Downloadable File', + '2TEZ' => 'Motion Picture & TV|Television Programming|Entertainment Program|All Internet Distribution Formats', + '2TLA' => 'Motion Picture & TV|Television Programming|Entertainment Program|Recordable Media', + '2TVN' => 'Motion Picture & TV|Television Programming|Entertainment Program|All Electronic Distribution Formats', + '2TVY' => 'Motion Picture & TV|Television Programming|Made For TV Movie|Television Broadcast', + '2TLC' => 'Motion Picture & TV|Television Programming|Made For TV Movie|Internet Downloadable File', + '2TLB' => 'Motion Picture & TV|Television Programming|Made For TV Movie|All Internet Distribution Formats', + '2TLD' => 'Motion Picture & TV|Television Programming|Made For TV Movie|Recordable Media', + '2TVP' => 'Motion Picture & TV|Television Programming|Made For TV Movie|All Electronic Distribution Formats', + '2TEF' => 'Motion Picture & TV|Television Programming|News Program, Flash|Television Broadcast', + '2TVS' => 'Motion Picture & TV|Television Programming|News Program|Television Broadcast', + '2TLE' => 'Motion Picture & TV|Television Programming|News Program|Internet Downloadable File', + '2TLF' => 'Motion Picture & TV|Television Programming|News Program|All Internet Distribution Formats', + '2TLG' => 'Motion Picture & TV|Television Programming|News Program|Recordable Media', + '2TVT' => 'Motion Picture & TV|Television Programming|News Program|All Electronic Distribution Formats', + '2TLH' => 'Motion Picture & TV|Television Programming|Non Broadcast Pilot|Recordable Media', + '2TLJ' => 'Motion Picture & TV|Television Programming|Non Broadcast Pilot|Projected Display', + '2TVU' => 'Motion Picture & TV|Television Programming|Non-Profit Program|Television Broadcast', + '2TLK' => 'Motion Picture & TV|Television Programming|Non-Profit Program|Internet Downloadable File', + '2TLL' => 'Motion Picture & TV|Television Programming|Non-Profit Program|All Internet Distribution Formats', + '2TLM' => 'Motion Picture & TV|Television Programming|Non-Profit Program|Recordable Media', + '2TVV' => 'Motion Picture & TV|Television Programming|Non-Profit Program|All Electronic Distribution Formats', + '2TLR' => 'Motion Picture & TV|Television Programming|Prop|Television Broadcast', + '2TLN' => 'Motion Picture & TV|Television Programming|Prop|Internet Downloadable File', + '2TLP' => 'Motion Picture & TV|Television Programming|Prop|All Internet Distribution Formats', + '2TLQ' => 'Motion Picture & TV|Television Programming|Prop|Recordable Media', + '2TVW' => 'Motion Picture & TV|Television Programming|Prop|All Electronic Distribution Formats', + '2TLV' => 'Motion Picture & TV|Television Programming|Set Decor|Television Broadcast', + '2TLS' => 'Motion Picture & TV|Television Programming|Set Decor|Internet Downloadable File', + '2TLT' => 'Motion Picture & TV|Television Programming|Set Decor|All Internet Distribution Formats', + '2TLU' => 'Motion Picture & TV|Television Programming|Set Decor|Recordable Media', + '2TVQ' => 'Motion Picture & TV|Television Programming|Set Decor|All Electronic Distribution Formats', + '2KOA' => 'Motion Picture & TV|Television Programming|Artist\'s Reference, All Types|Projected Display', + '2KOB' => 'Motion Picture & TV|Television Programming|Artist\'s Reference, All Types|Internet Downloadable File', + '2KOI' => 'Motion Picture & TV|Television Programming|Artist\'s Reference, All Types|All Internet Distribution Formats', + '2KOP' => 'Motion Picture & TV|Television Programming|Artist\'s Reference, All Types|Recordable Media', + '2KOR' => 'Motion Picture & TV|Television Programming|Artist\'s Reference, All Types|All Electronic Distribution Formats', + '2KOS' => 'Motion Picture & TV|Television Programming|Artist\'s Reference, All Types|Television Broadcast', + '2TEE' => 'Motion Picture & TV|Television Programming|All Editorial Television Types|Television Broadcast', + '2TLW' => 'Motion Picture & TV|Television Programming|All Editorial Television Types|Internet Downloadable File', + '2TLY' => 'Motion Picture & TV|Television Programming|All Editorial Television Types|All Internet Distribution Formats', + '2TLZ' => 'Motion Picture & TV|Television Programming|All Editorial Television Types|Recordable Media', + '2TVZ' => 'Motion Picture & TV|Television Programming|All Editorial Television Types|All Electronic Distribution Formats', + '2JOT' => 'Motion Picture & TV|Motion Picture|In Theater Commercial|Projected Display', + '2ATE' => 'Motion Picture & TV|Motion Picture|Movie Trailer|Projected Display', + '2MPP' => 'Motion Picture & TV|Motion Picture|Movie Trailer|Internet Downloadable File', + '2BET' => 'Motion Picture & TV|Motion Picture|Movie Trailer|All Internet Distribution Formats', + '2DIG' => 'Motion Picture & TV|Motion Picture|Movie Trailer|Recordable Media', + '2AID' => 'Motion Picture & TV|Motion Picture|Movie Trailer|All Electronic Distribution Formats', + '2MPF' => 'Motion Picture & TV|Motion Picture|Movie Trailer|Television Broadcast', + '2JOG' => 'Motion Picture & TV|Motion Picture|Documentary Film|Projected Display', + '2MPM' => 'Motion Picture & TV|Motion Picture|Documentary Film|Internet Downloadable File', + '2TUG' => 'Motion Picture & TV|Motion Picture|Documentary Film|All Internet Distribution Formats', + '2TRY' => 'Motion Picture & TV|Motion Picture|Documentary Film|Recordable Media', + '2DOC' => 'Motion Picture & TV|Motion Picture|Documentary Film|All Electronic Distribution Formats', + '2MPD' => 'Motion Picture & TV|Motion Picture|Documentary Film|Television Broadcast', + '2FEA' => 'Motion Picture & TV|Motion Picture|Feature Film|Projected Display', + '2MPN' => 'Motion Picture & TV|Motion Picture|Feature Film|Internet Downloadable File', + '2WAG' => 'Motion Picture & TV|Motion Picture|Feature Film|All Internet Distribution Formats', + '2WIN' => 'Motion Picture & TV|Motion Picture|Feature Film|Recordable Media', + '2FIL' => 'Motion Picture & TV|Motion Picture|Feature Film|All Electronic Distribution Formats', + '2MPE' => 'Motion Picture & TV|Motion Picture|Feature Film|Television Broadcast', + '2WIZ' => 'Motion Picture & TV|Motion Picture|Short Film|Projected Display', + '2MPS' => 'Motion Picture & TV|Motion Picture|Short Film|Internet Downloadable File', + '2ASK' => 'Motion Picture & TV|Motion Picture|Short Film|All Internet Distribution Formats', + '2AIM' => 'Motion Picture & TV|Motion Picture|Short Film|Recordable Media', + '2FIT' => 'Motion Picture & TV|Motion Picture|Short Film|All Electronic Distribution Formats', + '2MPI' => 'Motion Picture & TV|Motion Picture|Short Film|Television Broadcast', + '2MPG' => 'Motion Picture & TV|Motion Picture|Prop|Television Broadcast', + '2HOP' => 'Motion Picture & TV|Motion Picture|Prop|Projected Display', + '2MPQ' => 'Motion Picture & TV|Motion Picture|Prop|Internet Downloadable File', + '2HIT' => 'Motion Picture & TV|Motion Picture|Prop|All Internet Distribution Formats', + '2FRY' => 'Motion Picture & TV|Motion Picture|Prop|Recordable Media', + '2EFX' => 'Motion Picture & TV|Motion Picture|Prop|All Electronic Distribution Formats', + '2MPH' => 'Motion Picture & TV|Motion Picture|Set Decor|Television Broadcast', + '2MPR' => 'Motion Picture & TV|Motion Picture|Set Decor|Internet Downloadable File', + '2JAB' => 'Motion Picture & TV|Motion Picture|Set Decor|All Internet Distribution Formats', + '2HUG' => 'Motion Picture & TV|Motion Picture|Set Decor|Recordable Media', + '2HUM' => 'Motion Picture & TV|Motion Picture|Set Decor|All Electronic Distribution Formats', + '2ARC' => 'Motion Picture & TV|Motion Picture|Set Decor|Projected Display', + '2TAP' => 'Motion Picture & TV|Motion Picture|Artist\'s Reference, All Types|Projected Display', + '2MPL' => 'Motion Picture & TV|Motion Picture|Artist\'s Reference, All Types|Internet Downloadable File', + '2NOD' => 'Motion Picture & TV|Motion Picture|Artist\'s Reference, All Types|All Internet Distribution Formats', + '2MIX' => 'Motion Picture & TV|Motion Picture|Artist\'s Reference, All Types|Recordable Media', + '2NAP' => 'Motion Picture & TV|Motion Picture|Artist\'s Reference, All Types|All Electronic Distribution Formats', + '2MPC' => 'Motion Picture & TV|Motion Picture|Artist\'s Reference, All Types|Television Broadcast', + '2FIX' => 'Motion Picture & TV|Motion Picture|All Motion Picture Types|Projected Display', + '2MPJ' => 'Motion Picture & TV|Motion Picture|All Motion Picture Types|Internet Downloadable File', + '2DIP' => 'Motion Picture & TV|Motion Picture|All Motion Picture Types|All Internet Distribution Formats', + '2MOV' => 'Motion Picture & TV|Motion Picture|All Motion Picture Types|Recordable Media', + '2MPA' => 'Motion Picture & TV|Motion Picture|All Motion Picture Types|Television Broadcast', + '2ACT' => 'Motion Picture & TV|Motion Picture|All Motion Picture Types|All Electronic Distribution Formats', + '2MPB' => 'Motion Picture & TV|Music Video|All Music Video Types|Television Broadcast', + '2MPK' => 'Motion Picture & TV|Music Video|All Music Video Types|Internet Downloadable File', + '2BER' => 'Motion Picture & TV|Music Video|All Music Video Types|Recordable Media', + '2BES' => 'Motion Picture & TV|Music Video|All Music Video Types|All Internet Distribution Formats', + '2TVR' => 'Motion Picture & TV|Music Video|All Music Video Types|All Electronic Distribution Formats', + '2AAM' => 'Motion Picture & TV|All Media Types|All Formats|All Distribution Formats', + '2WED' => 'Personal Use|Personal Review|All Review Types|Printed', + '2DIM' => 'Personal Use|Personal Review|All Review Types|All Electronic Distribution Formats', + '2BFR' => 'Personal Use|Website|Web Page, All Types|Internet Website', + '2BFU' => 'Personal Use|Website|Web Page, All Types|All Internet Distribution Formats', + '2BFS' => 'Personal Use|Website|Web Page, All Types|Recordable Media', + '2BFT' => 'Personal Use|Website|Web Page, All Types|All Electronic Distribution Formats', + '2ZIT' => 'Personal Use|Mobile|Wallpaper|Mobile', + '2ZOB' => 'Personal Use|Mobile|All Mobile Types|Mobile', + '2BFN' => 'Personal Use|Art|Art Display, Display Print|Printed', + '2KIT' => 'Personal Use|Art|Art Display, All Art Types|Printed', + '2BFJ' => 'Personal Use|Art|Art Display, All Art Types|Internet Website', + '2BFI' => 'Personal Use|Art|Art Display, All Art Types|All Internet Distribution Formats', + '2BFK' => 'Personal Use|Art|Art Display, All Art Types|Electronic Display', + '2BFH' => 'Personal Use|Art|Art Display, All Art Types|All Electronic Distribution Formats', + '2TAT' => 'Personal Use|Art|Artist\'s Reference, Tattoo|Printed', + '2BFP' => 'Personal Use|Art|Study Print, Educational|Printed', + '2AAU' => 'Personal Use|All Media Types|All Formats|All Distribution Formats', + '2AAB' => 'All Categories|Book|All Book Types|All Distribution Formats', + '2AAD' => 'All Categories|Display|All Display Types|All Distribution Formats', + '2AAT' => 'All Categories|Marketing Materials|All Marketing Material Types|All Distribution Formats', + '2AAH' => 'All Categories|Merchandise|All Merchandise Types|All Distribution Formats', + '2AAL' => 'All Categories|Mobile|All Mobile Types|All Distribution Formats', + '2AAX' => 'All Categories|Motion Picture|All Motion Picture Types|All Distribution Formats', + '2AAV' => 'All Categories|Music Video|All Music Video Types|All Distribution Formats', + '2AAC' => 'All Categories|Periodicals|All Periodical Types|All Distribution Formats', + '2AAR' => 'All Categories|Point of Purchase|All Point Of Purchase Types|All Distribution Formats', + '2AAG' => 'All Categories|Product Packaging|All Product Packaging Types|All Distribution Formats', + '2AAN' => 'All Categories|Television Programming|All Television Programming Types|All Distribution Formats', + '2BAA' => 'All Categories|Website|All Web Page Types|All Distribution Formats', + '2ALL' => 'All Categories|All Media Types|All Formats|All Distribution Formats', + '2UNL' => 'Unlicensed|Not Applicable|Not Applicable|Not Applicable', + # 3P - Placement + '3PAA' => 'Any Placements on All Pages', + '3PXX' => 'Not Applicable or None', + '3PUL' => 'Any Placements', + '3PNQ' => 'Single Placement in Content Body', + '3PPU' => 'Single Placement on Title Page', + '3PQT' => 'Single Placement on Table Of Contents', + '3PQA' => 'Single Placement as Frontispiece', + '3PQI' => 'Single Placement on Preface', + '3PPW' => 'Single Placement as Forward', + '3PSA' => 'Single Placement as Front Matter', + '3PNI' => 'Single Placement as Chapter Opener', + '3PQN' => 'Single Placement as Vignette', + '3PRT' => 'Single Placement on Pop Up', + '3PNZ' => 'Single Placement in Bibliography', + '3PQZ' => 'Single Placement on Index', + '3PQG' => 'Single Placement on Any Interior Page', + '3PSR' => 'Single Placement on Inside Cover', + '3PQE' => 'Single Placement on Spine', + '3PSL' => 'Single Placement on Flap', + '3PSP' => 'Single Placement on Back Cover', + '3PNN' => 'Single Placement on Front Cover', + '3PTL' => 'Single Placement on Front Cover And Back Cover', + '3PPA' => 'Single Placement on Dust Jacket', + '3PTD' => 'Single Placements on Interior, Covers and Jacket', + '3PRY' => 'Multiple Placements in Content Body', + '3PRL' => 'Multiple Placements on Any Interior Pages', + '3PSU' => 'Multiple Placements on Inside Cover', + '3PQS' => 'Multiple Placements on Back Cover', + '3PRZ' => 'Multiple Placements on Front Cover', + '3PTM' => 'Multiple Placements on Front Cover And Back Cover', + '3PTC' => 'Multiple Placements on Dust Jacket', + '3PTE' => 'Multiple Placements on Interior, Covers and Jacket', + '3PST' => 'Single Placement on Any Interior Page', + '3PPK' => 'Single Placement on Inside Cover', + '3PNR' => 'Single Placement on Back Cover', + '3PRB' => 'Single Placement on Front Cover', + '3PUD' => 'Single Placement on Back Cover Or Interior Page', + '3PTB' => 'Single Placement on Front Cover And Interior Page', + '3PUF' => 'Single Placement on Front Cover Or Back Cover', + '3PNF' => 'Single Placement on Front Cover And Back Cover', + '3PTP' => 'Single Placement on Any Cover And Interior Page', + '3PQW' => 'Multiple Placements on Any Interior Pages', + '3PNY' => 'Multiple Placements on Inside Cover', + '3PNC' => 'Multiple Placements on Back Cover', + '3PPV' => 'Multiple Placements on Front Cover', + '3PRG' => 'Multiple Placements on Front Cover And Back Cover', + '3PTN' => 'Multiple Placements on Any Covers And Interior Pages', + '3PQX' => 'Single Placement on Any Interior Page', + '3PTF' => 'Single Placement on Section Opener Page', + '3PNT' => 'Single Placement on Front Page', + '3PTH' => 'Single Placement on Section Opener and Front Page', + '3PSY' => 'Multiple Placements on Any Interior Pages', + '3PTG' => 'Multiple Placements on Section Opener Page', + '3PTI' => 'Multiple Placements on Section Opener and Front Page', + '3PPM' => 'Multiple Placements on Any Pages', + '3PQJ' => 'Single Placement on Wrap Around Cover', + '3PQB' => 'Multiple Placements on Wrap Around Cover', + '3PRS' => 'Single Placement in Content Body', + '3PRI' => 'Single Placement as Colophon', + '3PRC' => 'Single Placement on Table Of Contents', + '3PQQ' => 'Single Placement as Unit Opener', + '3PND' => 'Single Placement as Chapter Opener', + '3PQF' => 'Single Placements in Bibliography', + '3PRN' => 'Single Placement on Any Interior Page', + '3PQH' => 'Single Placement on Back Cover', + '3PSJ' => 'Single Placement on Front Cover', + '3PTJ' => 'Single Placement on Any Covers And Interior Pages', + '3PRD' => 'Multiple Placements in Content Body', + '3PSM' => 'Multiple Placements on Any Interior Pages', + '3PSN' => 'Multiple Placements on Back Cover', + '3PPF' => 'Multiple Placements on Front Cover', + '3PTK' => 'Multiple Placements on Any Covers And Interior Pages', + '3PNE' => 'Single Placement on Front Side', + '3PQC' => 'Single Placement on Back Side', + '3PPL' => 'Single Placement on Both Sides', + '3PNV' => 'Multiple Placements on Front Side', + '3PSB' => 'Multiple Placements on Back Side', + '3PQK' => 'Multiple Placements on Both Sides', + '3PTA' => 'Single Placement on One Side', + '3PNB' => 'Multiple Placements on One Side', + '3PRQ' => 'Single Placement on Screen', + '3PSD' => 'Multiple Placements on Screen', + '3PPH' => 'Single Placement on Inside', + '3PSQ' => 'Single Placement on Back Side', + '3PRU' => 'Single Placement on Front Side', + '3PNP' => 'Single Placement on Both Sides', + '3PRK' => 'Multiple Placements on Inside', + '3PQM' => 'Multiple Placements on Back Side', + '3PNK' => 'Multiple Placements on Front Side', + '3PRV' => 'Multiple Placements on Both Sides', + '3PRH' => 'Single Placement on Any Interior Page', + '3PSH' => 'Single Placement on Back Cover', + '3PQY' => 'Single Placement on Front Cover', + '3PRM' => 'Single Placement on Front Cover And Back Cover', + '3PTQ' => 'Single Placement on Any Covers And Interior Pages', + '3PRF' => 'Multiple Placements on Any Interior Pages', + '3PSF' => 'Multiple Placements on Back Cover', + '3PRJ' => 'Multiple Placements on Front Cover', + '3PPP' => 'Multiple Placements on Front Cover And Interior Pages', + '3PSS' => 'Multiple Placements on Front Cover And Back Cover', + '3PTR' => 'Multiple Placements on Any Covers And Interior Pages', + '3PSW' => 'Single Placement on Item', + '3PNL' => 'Multiple Placements on Item', + '3PPX' => 'Single Placement on Packaging Exterior|Front', + '3PUJ' => 'Single Placement on Packaging Exterior|Back or Side', + '3PPD' => 'Single Placement in Packaging Interior', + '3PSI' => 'Multiple Placements on Packaging Exterior|Front', + '3PUH' => 'Multiple Placements on Packaging Exterior|Back or Side', + '3PPC' => 'Multiple Placements in Packaging Interior', + '3PTS' => 'Single Placement Anywhere On Packaging', + '3PTT' => 'Multiple Placements Anywhere On Packaging', + '3PNW' => 'Single Placement in Body Of Program', + '3PQU' => 'Single Placement in Closing Sequence', + '3PRR' => 'Single Placement in Title Sequence', + '3PTV' => 'Single Placement in Any Part', + '3PPZ' => 'Multiple Placements in Body Of Program', + '3PPN' => 'Multiple Placements in Closing Sequence', + '3PSV' => 'Multiple Placements in Title Sequence', + '3PTU' => 'Multiple Placements in Any Part', + '3PRP' => 'Single Placement in Body Of Advertisement', + '3PPJ' => 'Multiple Placements in Body Of Advertisement', + '3PPR' => 'Single Placement in Any Part', + '3PRW' => 'Multiple Placements in Any Part', + '3PQD' => 'Single Placement on Secondary Page', + '3PQP' => 'Single Placement on Pop Up', + '3PPS' => 'Single Placement on Landing Page', + '3PPG' => 'Single Placement on Splash Page', + '3PPY' => 'Single Placement on Home Page', + '3PTY' => 'Single Placement on Home Page And Secondary Pages', + '3PTW' => 'Single Placement on Any Pages', + '3PSZ' => 'Multiple Placements on Secondary Pages', + '3PNJ' => 'Multiple Placements on Pop Ups', + '3PPI' => 'Multiple Placements on Landing Pages', + '3PNS' => 'Multiple Placements on Splash Pages', + '3PNU' => 'Multiple Placements on Home Page', + '3PPQ' => 'Multiple Placements on Home Page And Secondary Pages', + '3PTZ' => 'Multiple Placements on Any Pages', + '3PPE' => 'Single Placement as Flash', + '3PNM' => 'Single Placement in Body Of Program', + '3PPB' => 'Single Placement in Closing Sequence', + '3PSC' => 'Single Placement in Title Sequence', + '3PUC' => 'Single Placement in Any Part', + '3PNX' => 'Multiple Placements as Flash', + '3PNH' => 'Multiple Placements in Body Of Program', + '3PQL' => 'Multiple Placements in Closing Sequence', + '3PSK' => 'Multiple Placements in Title Sequence', + '3PUB' => 'Multiple Placements in Any Part', + # 4S - Size + '4SAA' => 'Any Size Image|Any Size Media', + '4SXX' => 'Not Applicable or None', + '4SUL' => 'Any Sizes', + '4SJA' => 'Up To 1/16 Page|Any Size Page', + '4SBN' => 'Up To 1/8 Page Image|Any Size Page', + '4SJB' => 'Up To 1/4 Page Image|Any Size Page', + '4SEU' => 'Up To 1/3 Page Image|Any Size Page', + '4SEJ' => 'Up To 1/2 Page Image|Any Size Page', + '4SMG' => 'Up To 3/4 Page Image|Any Size Page', + '4SAG' => 'Up To Full Page Image|Any Size Page', + '4SFI' => 'Up To 2 Page Image|Any Size Pages', + '4SJZ' => 'Up To 3 Page Image|Any Size Pages', + '4SFG' => 'Up To 4 Page Image|Any Size Pages', + '4SBP' => 'Any Size Image|Any Size Page', + '4SGF' => 'Up To 1/4 Page Image|Up To 1/4 Page Ad', + '4SCH' => 'Up To 1/4 Page Image|Up To 1/2 Page Ad', + '4SIY' => 'Up To 1/4 Page Image|Up To Full Page Ad', + '4SCV' => 'Up To 1/2 Page Image|Up To 1/2 Page Ad', + '4SLY' => 'Up To 1/2 Page Image|Up To Full Page Ad', + '4SBU' => 'Up To 1/2 Page Image|Up To 2 Page Ad', + '4SCP' => 'Up To Full Page Image|Up To Full Page Ad', + '4SGL' => 'Up To Full Page Image|Up To 2 Page Ad', + '4SGM' => 'Up To Full Page Image|Any Size Ad', + '4SMB' => 'Up To 2 Page Image|Up To 2 Page Ad', + '4SFR' => 'Up To 2 Page Image|Any Size Ad', + '4SKP' => 'Any Size Image|Any Size Ad', + '4SBK' => 'Up To 1/16 Page Image|Any Size Page', + '4SJS' => 'Up To 1/8 Page Image|Any Size Page', + '4SLV' => 'Up To 1/4 Page Image|Any Size Page', + '4SGW' => 'Up To 1/2 Page Image|Any Size Page', + '4SKD' => 'Up To Full Page Image|Any Size Page', + '4SFJ' => 'Up To 2 Page Image|Any Size Pages', + '4SLA' => 'Any Size Image|Any Size Pages', + '4SKE' => 'Up To 1/8 Page Image|Any Size Page', + '4SAK' => 'Up To 1/4 Page Image|Any Size Page', + '4SLD' => 'Up To 1/2 Page Image|Any Size Page', + '4SJV' => 'Up To Full Page Image|Any Size Page', + '4SJU' => 'Up To 2 Page Image|Any Size Pages', + '4SIW' => 'Any Size Image|Any Size Pages', + '4SAL' => 'Up To 1/4 Area Image|Up To Full Area Media', + '4SJM' => 'Up To 1/2 Area Image|Up To Full Area Media', + '4SKZ' => 'Up To Full Area Image|Up To Full Area Media', + '4SCN' => 'Up To 1/8 Page Image|Up To Full Page Media', + '4SLW' => 'Up To 1/4 Page Image|Up To Full Page Media', + '4SIZ' => 'Up To 1/2 Page Image|Up To Full Page Media', + '4SAC' => 'Up To Full Page Image|Up To Full Page Media', + '4SFX' => 'Up To 8 x 10 Inch Image|Any Size Media', + '4SFP' => 'Up To 11 x 14 Inch Image|Any Size Media', + '4SMV' => 'Any Size Image|Any Size Media', + '4SJD' => 'Up To 21 x 30 cm Image|Any Size Media', + '4SFQ' => 'Up To 30 x 42 cm Image|Any Size Media', + '4SJK' => 'Any Size Image|Up To Full Card', + '4SEQ' => 'Up To 5 x 5 Inch Image|Up To 40 x 40 Inch Media', + '4SIV' => 'Up To 10 x 10 Inch Image|Up To 40 x 40 Inch Media', + '4SCE' => 'Up To 20 x 20 Inch Image|Up To 40 x 40 Inch Media', + '4SDP' => 'Up To 30x 30 Inch Image|Up To 40 x 40 Inch Media', + '4SCT' => 'Up To 40 x 40 Inch Image|Up To 40 x 40 Inch Media', + '4SBJ' => 'Up To 20 x 20 cm Image|Up To 100 x 100 cm Media', + '4SKI' => 'Up To 30 x 30 cm Image|Up To 100 x 100 cm Media', + '4SJW' => 'Up To 40 x 40 cm Image|Up To 100 x 100 cm Media', + '4SCB' => 'Up To 50 x 50 cm Image|Up To 100 x 100 cm Media', + '4SAT' => 'Up To 75 x 75 cm Image|Up To 100 x 100 cm Media', + '4SCI' => 'Up To 100 x 100 cm Image|Up To 100 x 100 cm Media', + '4SGP' => 'Any Size Image|Any Size Media', + '4SIX' => 'Up To 1/4 Area Image|Up To 11 x 36 Foot Display', + '4SHA' => 'Up To 1/4 Area Image|Up To 10 x 40 Foot Display', + '4SGU' => 'Up To 1/4 Area Image|Up To 14 x 48 Foot Display', + '4SAJ' => 'Up To 1/2 Area Image|Up To 11 x 36 Foot Display', + '4SDX' => 'Up To 1/2 Area Image|Up To 10 x 40 Foot Display', + '4SCR' => 'Up To 1/2 Area Image|Up To 14 x 48 Foot Display', + '4SFM' => 'Up To Full Area Image|Up To 11 x 36 Foot Display', + '4SKV' => 'Up To Full Area Image|Up To 10 x 40 Foot Display', + '4SGE' => 'Up To Full Area Image|Up To 14 x 48 Foot Display', + '4SMW' => 'Up To Full Area Image|Any Size Display', + '4SJI' => 'Up To 1/4 Area Image|Up To 4 x 8 Foot Media', + '4SBI' => 'Up To 1/4 Area Image|Up To 10 x 8 Foot Media', + '4SIM' => 'Up To 1/4 Area Image|Up To 12 x 24 Foot Media', + '4SFF' => 'Up To 1/4 Area Image|Any Size Media', + '4SAX' => 'Up To 1/2 Area Image|Up To 4 x 8 Foot Media', + '4SLI' => 'Up To 1/2 Area Image|Up To 10 x 8 Foot Media', + '4SLS' => 'Up To 1/2 Area Image|Up To 12 x 24 Foot Media', + '4SMK' => 'Up To 1/2 Area Image|Any Size Media', + '4SLG' => 'Up To Full Area Image|Up To 4 x 8 Foot Media', + '4SAN' => 'Up To Full Area Image|Up To 10 x 8 Foot Media', + '4SDI' => 'Up To Full Area Image|Up To 12 x 24 Foot Media', + '4SML' => 'Up To Full Area Image|Any Size Media', + '4SKF' => 'Up To 1/4 Area Image|Up To 672 Square Foot Display', + '4SKR' => 'Up To 1/4 Area Image|Up To 1,200 Square Foot Display', + '4SLK' => 'Up To 1/4 Area Image|Up To 2,400 Square Foot Display', + '4SJQ' => 'Up To 1/4 Area Image|Up To 4,800 Square Foot Display', + '4SEY' => 'Up To 1/4 Area Image|Up To 10,000 Square Foot Display', + '4SFE' => 'Up To 1/4 Area Image|Any Size Display', + '4SKS' => 'Up To 1/2 Area Image|Up To 672 Square Foot Display', + '4SGS' => 'Up To 1/2 Area Image|Up To 1,200 Square Foot Display', + '4SMA' => 'Up To 1/2 Area Image|Up To 2,400 Square Foot Display', + '4SAF' => 'Up To 1/2 Area Image|Up To 4,800 Square Foot Display', + '4SAW' => 'Up To 1/2 Area Image|Up To 10,000 Square Foot Display', + '4SAQ' => 'Up To 1/2 Area Image|Any Size Display', + '4SLN' => 'Up To Full Area Image|Up To 672 Square Foot Display', + '4SDS' => 'Up To Full Area Image|Up To 1,200 Square Foot Display', + '4SIT' => 'Up To Full Area Image|Up To 2,400 Square Foot Display', + '4SGX' => 'Up To Full Area Image|Up To 4,800 Square Foot Display', + '4SBD' => 'Up To Full Area Image|Up To 10,000 Square Foot Display', + '4SBF' => 'Up To Full Area Image|Any Size Display', + '4SDD' => 'Up To 1/4 Area Image|Up To 4 Sheet Display', + '4SBC' => 'Up To 1/4 Area Image|Up To 8 Sheet Display', + '4SLJ' => 'Up To 1/4 Area Image|Up To 12 Sheet Display', + '4SAD' => 'Up To 1/4 Area Image|Up To 16 Sheet Display', + '4SEA' => 'Up To 1/4 Area Image|Up To 30 Sheet Display', + '4SCD' => 'Up To 1/4 Area Image|Up To 48 Sheet Display', + '4SKX' => 'Up To 1/4 Area Image|Up To 96 Sheet Display', + '4SMN' => 'Up To 1/4 Area Image|Any Size Display', + '4SDU' => 'Up To 1/2 Area Image|Up To 4 Sheet Display', + '4SBL' => 'Up To 1/2 Area Image|Up To 8 Sheet Display', + '4SER' => 'Up To 1/2 Area Image|Up To 12 Sheet Display', + '4SEN' => 'Up To 1/2 Area Image|Up To 16 Sheet Display', + '4SLP' => 'Up To 1/2 Area Image|Up To 30 Sheet Display', + '4SGQ' => 'Up To 1/2 Area Image|Up To 48 Sheet Display', + '4SDF' => 'Up To 1/2 Area Image|Up To 96 Sheet Display', + '4SMP' => 'Up To 1/2 Area Image|Any Size Display', + '4SFL' => 'Up To Full Area Image|Up To 4 Sheet Display', + '4SFS' => 'Up To Full Area Image|Up To 8 Sheet Display', + '4SIF' => 'Up To Full Area Image|Up To 12 Sheet Display', + '4SIS' => 'Up To Full Area Image|Up To 16 Sheet Display', + '4SFD' => 'Up To Full Area Image|Up To 30 Sheet Display', + '4SFU' => 'Up To Full Area Image|Up To 48 Sheet Display', + '4SDK' => 'Up To Full Area Image|Up To 96 Sheet Display', + '4SMQ' => 'Up To Full Area Image|Any Size Display', + '4SKA' => 'Up To 1/4 Area Image|Up To 20 x 30 Inch Media', + '4SIK' => 'Up To 1/4 Area Image|Up To 24 x 36 Inch Media', + '4SFK' => 'Up To 1/4 Area Image|Up To 30 x 40 Inch Media', + '4SDV' => 'Up To 1/4 Area Image|Up To 40 x 60 Inch Media', + '4SMX' => 'Up To 1/4 Area Image|Any Size Media', + '4SEF' => 'Up To 1/4 Area Image|Up To A1 Media', + '4SCJ' => 'Up To 1/4 Area Image|Up To B1 Media', + '4SJG' => 'Up To 1/4 Area Image|Up To A0 Media', + '4SIP' => 'Up To 1/4 Area Image|Up To B0 Media', + '4SKU' => 'Up To 1/2 Area Image|Up To 20 x 30 Inch Media', + '4SAS' => 'Up To 1/2 Area Image|Up To 24 x 36 Inch Media', + '4SGB' => 'Up To 1/2 Area Image|Up To 30 x 40 Inch Media', + '4SBQ' => 'Up To 1/2 Area Image|Up To 40 x 60 Inch Media', + '4SMY' => 'Up To 1/2 Area Image|Any Size Media', + '4SKJ' => 'Up To 1/2 Area Image|Up To A1 Media', + '4SAM' => 'Up To 1/2 Area Image|Up To B1 Media', + '4SDZ' => 'Up To 1/2 Area Image|Up To A0 Media', + '4SGT' => 'Up To 1/2 Area Image|Up To B0 Media', + '4SKN' => 'Up To Full Area Image|Up To 20 x 30 Inch Media', + '4SIQ' => 'Up To Full Area Image|Up To 24 x 36 Inch Media', + '4SLT' => 'Up To Full Area Image|Up To 30 x 40 Inch Media', + '4SDN' => 'Up To Full Area Image|Up To 40 x 60 Inch Media', + '4SMZ' => 'Up To Full Area Image|Any Size Media', + '4SBH' => 'Up To Full Area Image|Up To A1 Media', + '4SLU' => 'Up To Full Area Image|Up To B1 Media', + '4SEL' => 'Up To Full Area Image|Up To A0 Media', + '4SBM' => 'Up To Full Area Image|Up To B0 Media', + '4SIH' => 'Up To 1/4 Area Image|Up To 24 x 30 Inch Display', + '4SKW' => 'Up To 1/4 Area Image|Up To 30 x 40 Inch Display', + '4SDM' => 'Up To 1/4 Area Image|Up To 27 x 85 Inch Display', + '4SJP' => 'Up To 1/4 Area Image|Up To 60 x 40 Inch Display', + '4SIB' => 'Up To 1/4 Area Image|Up To 69 x 48 Inch Display', + '4SDH' => 'Up To 1/4 Area Image|Up To 27 x 141 Inch Display', + '4SJL' => 'Up To 1/4 Area Image|Up To 30 x 240 Inch Display', + '4SLQ' => 'Up To 1/4 Area Image|Up To B1 Display', + '4SLL' => 'Up To 1/4 Area Image|Up To A0 Display', + '4SEI' => 'Up To 1/4 Area Image|Up To B0 Display', + '4SBA' => 'Up To 1/2 Area Image|Up To 24 x 30 Inch Display', + '4SCL' => 'Up To 1/2 Area Image|Up To 30 x 40 Inch Display', + '4SIC' => 'Up To 1/2 Area Image|Up To 27 x 85 Inch Display', + '4SBY' => 'Up To 1/2 Area Image|Up To 60 x 40 Inch Display', + '4SFZ' => 'Up To 1/2 Area Image|Up To 27 x 141 Inch Display', + '4SAU' => 'Up To 1/2 Area Image|Up To 26 x 241 Inch Display', + '4SBR' => 'Up To 1/2 Area Image|Up To 30 x 240 Inch Display', + '4SCC' => 'Up To 1/2 Area Image|Up To B1 Display', + '4SAB' => 'Up To 1/2 Area Image|Up To A0 Display', + '4SLX' => 'Up To 1/2 Area Image|Up To B0 Display', + '4SGI' => 'Up To Full Area Image|Up To 24 x 30 Inch Display', + '4SBT' => 'Up To Full Area Image|Up To 30 x 40 Inch Display', + '4SGK' => 'Up To Full Area Image|Up To 27 x 85 Inch Display', + '4SIL' => 'Up To Full Area Image|Up To 60 x 40 Inch Display', + '4SAH' => 'Up To Full Area Image|Up To 69 x 48 Inch Display', + '4SGA' => 'Up To Full Area Image|Up To 27 x 141 Inch Display', + '4SDR' => 'Up To Full Area Image|Up To 26 x 241 Inch Display', + '4SID' => 'Up To Full Area Image|Up To 30 x 240 Inch Display', + '4SCX' => 'Up To Full Area Image|Any Size Display', + '4SGR' => 'Up To Full Area Image|Up To B1 Display', + '4SEC' => 'Up To Full Area Image|Up To A0 Display', + '4SET' => 'Up To Full Area Image|Up To B0 Display', + '4SKT' => 'Up To 1/4 Area Image|Up To 43 x 62 Inch Display', + '4SEW' => 'Up To 1/4 Area Image|Up To 48 x 71 Inch Display', + '4SEH' => 'Up To 1/4 Area Image|Up To 43 x 126 Inch Display', + '4SBS' => 'Up To 1/4 Area Image|Up To 83 x 135 Inch Display', + '4SMR' => 'Up To 1/4 Area Image|Any Size Display', + '4SJX' => 'Up To 1/4 Area Image|Up To B0 Display', + '4SAY' => 'Up To 1/2 Area Image|Up To 43 x 62 Inch Display', + '4SKY' => 'Up To 1/2 Area Image|Up To 48 x 71 Inch Display', + '4SBV' => 'Up To 1/2 Area Image|Up To 43 x 126 Inch Display', + '4SEP' => 'Up To 1/2 Area Image|Up To 83 x 135 Inch Display', + '4SNG' => 'Up To 1/2 Area Image|Any Size Display', + '4SAZ' => 'Up To 1/2 Area Image|Up To B0 Display', + '4SDW' => 'Up To Full Area Image|Up To 43 x 62 Inch Display', + '4SFW' => 'Up To Full Area Image|Up To 48 x 71 Inch Display', + '4SGN' => 'Up To Full Area Image|Up To 43 x 126 Inch Display', + '4SBX' => 'Up To Full Area Image|Up To 83 x 135 Inch Display', + '4SNO' => 'Up To Full Area Image|Any Size Display', + '4SKK' => 'Up To Full Area Image|Up To B0 Display', + '4SAP' => 'Up To 1/4 Screen Image|Up To 32 Inch Screen', + '4SEK' => 'Up To 1/4 Screen Image|Up To 63 Inch Screen', + '4SLZ' => 'Up To 1/4 Screen Image|Up To 10 Diagonal Foot Screen', + '4SIE' => 'Up To 1/4 Screen Image|Up To 30 Diagonal Foot Screen', + '4SEM' => 'Up To 1/4 Screen Image|Up To 100 Diagonal Foot Screen', + '4SGJ' => 'Up To 1/2 Screen Image|Up To 32 Inch Screen', + '4SBE' => 'Up To 1/2 Screen Image|Up To 63 Inch Screen', + '4SIJ' => 'Up To 1/2 Screen Image|Up To 10 Diagonal Foot Screen', + '4SGY' => 'Up To 1/2 Screen Image|Up To 30 Diagonal Foot Screen', + '4SDQ' => 'Up To 1/2 Screen Image|Up To 100 Diagonal Foot Screen', + '4SBZ' => 'Up To Full Screen Image|Up To 32 Inch Screen', + '4SJF' => 'Up To Full Screen Image|Up To 63 Inch Screen', + '4SLE' => 'Up To Full Screen Image|Up To 10 Diagonal Foot Screen', + '4SJY' => 'Up To Full Screen Image|Up To 30 Diagonal Foot Screen', + '4SKC' => 'Up To Full Screen Image|Up To 100 Diagonal Foot Screen', + '4SDL' => 'Up To Full Screen Image|Any Size Screen', + '4SFA' => 'Up To 1/4 Area Image|Any Size Item', + '4SCG' => 'Up To 1/2 Area Image|Any Size Item', + '4SLR' => 'Up To Full Area Image|Any Size Item', + '4SGZ' => 'Up To 3 x 4.5 Inch Image|Any Size Media', + '4SFH' => 'Up To 5 x 7 Inch Image|Any Size Media', + '4SCU' => 'Up To 6 x 9 Inch Image|Any Size Media', + '4SLF' => 'Up To 8 x 10 Inch Image|Any Size Media', + '4SAV' => 'Up To 8 x 12 Inch Image|Any Size Media', + '4SKB' => 'Up To 11 x 14 Inch Image|Any Size Media', + '4SAE' => 'Up To 14 x 20 Inch Image|Any Size Media', + '4SEZ' => 'Up To 16 x 20 Inch Image|Any Size Media', + '4SDB' => 'Up To 20 x 24 Inch Image|Any Size Media', + '4SDG' => 'Up To 24 x 30 Inch Image|Any Size Media', + '4SDE' => 'Up To 30 x 40 Inch Image|Any Size Media', + '4SJE' => 'Up To 38 x 50 Inch Image|Any Size Media', + '4SCM' => 'Up To 40 x 60 Inch Image|Any Size Media', + '4SIN' => 'Any Size Image|Any Size Media', + '4SDA' => 'Up To 11 x 15 cm Image|Any Size Media', + '4SME' => 'Up To 13 x 18 cm Image|Any Size Media', + '4SFC' => 'Up To 15 x 21 cm Image|Any Size Media', + '4SIG' => 'Up To 18 x 25 cm Image|Any Size Media', + '4SEV' => 'Up To 21 x 30 cm Image|Any Size Media', + '4SJJ' => 'Up To 25 x 36 cm Image|Any Size Media', + '4SMD' => 'Up To 25 x 36 cm Image|Any Size Media', + '4SLH' => 'Up To 30 x 42 cm Image|Any Size Media', + '4SEE' => 'Up To 42 x 60 cm Image|Any Size Media', + '4SDC' => 'Up To 50 x 71 cm Image|Any Size Media', + '4SDY' => 'Up To 60 x 85 cm Image|Any Size Media', + '4SCQ' => 'Up To 70 x 100 cm Image|Any Size Media', + '4SMF' => 'Up To 85 x 119 cm Image|Any Size Media', + '4SJC' => 'Up To 100 x 142 cm Image|Any Size Media', + '4SFN' => 'Up To 1/4 Area Image|Up To 25 x 13 Inch Media', + '4SLC' => 'Up To 1/4 Area Image|Up To 50 x 24 Inch Media', + '4SIR' => 'Up To 1/4 Area Image|Up To 26 x 53 Inch Media', + '4SDT' => 'Up To 1/4 Area Image|Up To 46 x 60 Inch Media', + '4SFB' => 'Up To 1/4 Area Image|Up To 138 x 53 Inch Media', + '4SGV' => 'Up To 1/2 Area Image|Up To 25 x 13 Inch Media', + '4SJR' => 'Up To 1/2 Area Image|Up To 50 x 24 Inch Media', + '4SKL' => 'Up To 1/2 Area Image|Up To 26 x 53 Inch Media', + '4SEX' => 'Up To 1/2 Area Image|Up To 46 x 60 Inch Media', + '4SBW' => 'Up To 1/2 Area Image|Up To 138 x 53 Inch Media', + '4SJN' => 'Up To Full Area Image|Up To 25 x 13 Inch Media', + '4SKH' => 'Up To Full Area Image|Up To 50 x 24 Inch Media', + '4SKM' => 'Up To Full Area Image|Up To 26 x 53 Inch Media', + '4SGG' => 'Up To Full Area Image|Up To 46 x 60 Inch Media', + '4SDJ' => 'Up To Full Area Image|Up To 138 x 53 Inch Media', + '4SCZ' => 'Up To 1/4 Screen Image|Up To 15 Inch Screen', + '4SCS' => 'Up To 1/4 Screen Image|Up To 21 Inch Screen', + '4SMS' => 'Up To 1/4 Screen Image|Any Size Screen', + '4SED' => 'Up To 1/2 Screen Image|Up To 15 Inch Screen', + '4SFV' => 'Up To 1/2 Screen Image|Up To 21 Inch Screen', + '4SMT' => 'Up To 1/2 Screen Image|Any Size Screen', + '4SCY' => 'Up To Full Screen Image|Up To 15 Inch Screen', + '4SEB' => 'Up To Full Screen Image|Up To 21 Inch Screen', + '4SMU' => 'Up To Full Screen Image|Any Size Screen', + '4SGH' => 'Up To 1/4 Screen Image|Any Size Screen', + '4SGC' => 'Up To 1/2 Screen Image|Any Size Screen', + '4SES' => 'Up To Full Screen Image|Any Size Screen', + '4SKQ' => 'Up To 1/4 Area Image|Up To 180 x 150 Pixels Ad', + '4SCA' => 'Up To 1/4 Area Image|Up To 468 x 60 Pixels Ad', + '4SCK' => 'Up To 1/4 Area Image|Up To 728 x 90 Pixels Ad', + '4SCF' => 'Up To 1/4 Area Image|Up To 300 x 600 Pixels Ad', + '4SIU' => 'Up To 1/4 Area Image|Up To Full Screen Ad', + '4SAI' => 'Up To 1/2 Area Image|Up To 180 x 150 Pixels Ad', + '4SII' => 'Up To 1/2 Area Image|Up To 468 x 60 Pixels Ad', + '4SCW' => 'Up To 1/2 Area Image|Up To 728 x 90 Pixels Ad', + '4SLM' => 'Up To 1/2 Area Image|Up To 300 x 600 Pixels Ad', + '4SFT' => 'Up To 1/2 Area Image|Up To Full Screen Ad', + '4SJT' => 'Up To Full Area Image|Up To 180 x 150 Pixels Ad', + '4SGD' => 'Up To Full Area Image|Up To 468 x 60 Pixels Ad', + '4SAR' => 'Up To Full Area Image|Up To 728 x 90 Pixels Ad', + '4SEG' => 'Up To Full Area Image|Up To 300 x 600 Pixels Ad', + '4SBG' => 'Any Size Image|Up To Full Screen Ad', + '4SMH' => 'Up To 150 x 150 Pixels Image|Any Size Screen', + '4SMJ' => 'Up To 300 x 600 Pixels Image|Any Size Screen', + '4SKG' => 'Any Size Image|Any Size Screen', + # 5V - Version + '5VAA' => 'All Versions', + '5VXX' => 'Not Applicable or None', + '5VUL' => 'Any Versions', + '5VVM' => 'Single Print Version', + '5VVB' => 'Multiple Print Versions', + '5VUP' => 'Single Version', + '5VUY' => 'Multiple Versions', + '5VVC' => 'Single Paperback Edition', + '5VUK' => 'Single Hardcover Edition', + '5VVH' => 'Single Edition in All Binding Formats', + '5VVK' => 'Multiple Paperback Editions', + '5VUU' => 'Multiple Hardcover Editions', + '5VVL' => 'Multiple Editions in All Binding Formats', + '5VUZ' => 'Single Issue', + '5VVJ' => 'Multiple Issues', + '5VUG' => 'Single Edition', + '5VVG' => 'Multiple Editions', + # 6Q - Quantity + '6QAA' => 'Any Quantity', + '6QXX' => 'Not Applicable or None', + '6QUL' => 'Any Quantity', + '6QAU' => 'One|Print Run', + '6QDA' => 'Up To 10|Print Run', + '6QEY' => 'Up To 100|Print Run', + '6QBA' => 'Up To 1,000|Print Run', + '6QCW' => 'Up To 5,000|Print Run', + '6QEC' => 'Up To 10,000|Print Run', + '6QFD' => 'Up To 25,000|Print Run', + '6QBH' => 'Up To 40,000|Print Run', + '6QFR' => 'Up To 50,000|Print Run', + '6QDQ' => 'Up To 100,000|Print Run', + '6QBG' => 'Up To 250,000|Print Run', + '6QEN' => 'Up To 500,000|Print Run', + '6QDL' => 'Any Quantity Of|Print Run', + '6QBU' => 'One|Copy', + '6QDR' => 'Up To 10|Total Circulation', + '6QFU' => 'Up To 25|Total Circulation', + '6QFV' => 'Up To 50|Total Circulation', + '6QEJ' => 'Up To 100|Total Circulation', + '6QFW' => 'Up To 250|Total Circulation', + '6QFY' => 'Up To 500|Total Circulation', + '6QCD' => 'Up To 1,000|Total Circulation', + '6QFZ' => 'Up To 2,500|Total Circulation', + '6QAT' => 'Up To 5,000|Total Circulation', + '6QBB' => 'Up To 10,000|Total Circulation', + '6QFS' => 'Up To 25,000|Total Circulation', + '6QAN' => 'Up To 50,000|Total Circulation', + '6QCS' => 'Up To 100,000|Total Circulation', + '6QDT' => 'Up To 250,000|Total Circulation', + '6QCI' => 'Up To 500,000|Total Circulation', + '6QCN' => 'Up To 1 Million|Total Circulation', + '6QCK' => 'Up To 2 Million|Total Circulation', + '6QCL' => 'Up To 3 Million|Total Circulation', + '6QAV' => 'Up To 5 Million|Total Circulation', + '6QDK' => 'Up To 10 Million|Total Circulation', + '6QGB' => 'Up To 25 Million|Total Circulation', + '6QGC' => 'Up To 50 Million|Total Circulation', + '6QEV' => 'Any Quantity Of|Circulation', + '6QFI' => 'One|Reprint', + '6QDG' => 'Up To 10|Reprints', + '6QCB' => 'Up To 100|Reprints', + '6QAY' => 'Up To 1,000|Reprints', + '6QBF' => 'Up To 10,000|Reprints', + '6QCU' => 'Any Quantity Of|Reprints', + '6QEH' => 'One|Print Run', + '6QDH' => 'Up To 10|Print Run', + '6QAZ' => 'Up To 100|Print Run', + '6QFB' => 'Up To 1,000|Print Run', + '6QAQ' => 'Up To 5,000|Print Run', + '6QEG' => 'Up To 10,000|Print Run', + '6QBV' => 'Up To 25,000|Print Run', + '6QCG' => 'Up To 50,000|Print Run', + '6QAH' => 'Up To 100,000|Print Run', + '6QDE' => 'Up To 250,000|Print Run', + '6QDJ' => 'Up To 500,000|Print Run', + '6QCZ' => 'Up To 1 Million|Print Run', + '6QCT' => 'Up To 2 Million|Print Run', + '6QAR' => 'Up To 3 Million|Print Run', + '6QDC' => 'Up To 5 Million|Print Run', + '6QDU' => 'Up To 10 Million|Print Run', + '6QEU' => 'Any Quantity Of|Print Run', + '6QFT' => 'One|Copy', + '6QDI' => 'One|Display', + '6QDY' => 'Up To 5|Displays', + '6QFJ' => 'Up To 10|Displays', + '6QEL' => 'Up To 25|Displays', + '6QBD' => 'Up To 50|Displays', + '6QAE' => 'Up To 100|Displays', + '6QCE' => 'Up To 250|Displays', + '6QAP' => 'Up To 500|Displays', + '6QBY' => 'Up To 1,000|Displays', + '6QBC' => 'Up To 2,500|Displays', + '6QET' => 'Up To 5,000|Displays', + '6QFF' => 'Up To 10,000|Displays', + '6QDS' => 'Up To 25,000|Displays', + '6QES' => 'Up To 50,000|Displays', + '6QDZ' => 'Up To 100,000|Displays', + '6QBW' => 'Up To 250,000|Displays', + '6QAX' => 'Up To 500,000|Displays', + '6QDB' => 'Up To 1 Million|Displays', + '6QEK' => 'Up To 2 Million|Displays', + '6QFA' => 'Up To 3 Million|Displays', + '6QCJ' => 'Up To 5 Million|Displays', + '6QFQ' => 'Any Quantity Of|Displays', + '6QCX' => 'One|Display', + '6QBP' => 'Up To 5|Displays', + '6QAL' => 'Up To 10|Displays', + '6QDX' => 'Up To 25|Displays', + '6QEM' => 'Up To 50|Displays', + '6QEA' => 'Up To 100|Displays', + '6QFG' => 'Up To 250|Displays', + '6QAG' => 'Up To 500|Displays', + '6QEI' => 'Any Quantity Of|Displays', + '6QEP' => 'One|Copy', + '6QEX' => 'Two|Copies', + '6QCF' => 'Three|Copies', + '6QBK' => 'Four|Copies', + '6QBL' => 'Five|Copies', + '6QCP' => 'Up To 10|Copies', + '6QDV' => 'Up To 50|Copies', + '6QCM' => 'Up To 100|Copies', + '6QAI' => 'Up To 500|Copies', + '6QAS' => 'Up To 1,000|Copies', + '6QDW' => 'Up To 5,000|Copies', + '6QCQ' => 'Up To 10,000|Copies', + '6QAM' => 'Any Quantity Of|Copies', + '6QBE' => 'One|Copy', + '6QFC' => 'Up To 5|Copies', + '6QEB' => 'Up To 10|Copies', + '6QGD' => 'Up To 25|Copies', + '6QGE' => 'Up To 50|Copies', + '6QCR' => 'Up To 100|Copies', + '6QCA' => 'Up To 250|Copies', + '6QBS' => 'Up To 500|Copies', + '6QDF' => 'Up To 1,000|Copies', + '6QEW' => 'Up To 2,500|Copies', + '6QFE' => 'Up To 5,000|Copies', + '6QEE' => 'Up To 10,000|Copies', + '6QBT' => 'Up To 25,000|Copies', + '6QDP' => 'Up To 50,000|Copies', + '6QDN' => 'Up To 100,000|Copies', + '6QFN' => 'Any Quantity Of|Copies', + '6QFH' => 'Up To 10,000|Viewers', + '6QCV' => 'Up To 100,000|Viewers', + '6QBN' => 'Up To 1 Million|Viewers', + '6QFP' => 'Up To 10 Million|Viewers', + '6QBI' => 'Up To 100 Million|Viewers', + '6QBQ' => 'Any Quantity Of|Viewers', + '6QAB' => 'Up To 10,000|Impressions', + '6QBR' => 'Up To 100,000|Impressions', + '6QCY' => 'Up To 1 Million|Impressions', + '6QBM' => 'Up To 10 Million|Impressions', + '6QFM' => 'Any Quantity Of|Impressions', + '6QDD' => 'Up To 100|Viewers', + '6QEQ' => 'Up To 1,000|Viewers', + '6QEZ' => 'Up To 10,000|Viewers', + '6QBZ' => 'Up To 100,000|Viewers', + '6QCC' => 'Any Quantity Of|Viewers', + '6QCH' => 'One|Copy', + '6QAW' => 'Up To 5|Copies', + '6QAK' => 'Up To 10|Copies', + '6QFL' => 'Up To 100|Copies', + '6QAC' => 'Up To 1,000|Copies', + '6QAD' => 'Up To 10,000|Copies', + '6QEF' => 'Up To 25,000|Copies', + '6QAF' => 'Up To 50,000|Copies', + '6QED' => 'Up To 100,000|Copies', + '6QFK' => 'Up To 250,000|Copies', + '6QDM' => 'Up To 500,000|Copies', + '6QBX' => 'Up To 1 Million|Copies', + '6QER' => 'Any Quantity Of|Copies', + # 7D - Duration + '7DAA' => 'In Perpetuity', + '7DXX' => 'Not Applicable or None', + '7DUL' => 'Any Durations', + '7DUT' => 'Up To 10 Years', + '7DUS' => 'Up To 6 Months', + '7DUV' => 'Up To 6 Months', + '7DUW' => 'Up To 1 Year', + '7DUY' => 'Up To 3 Years', + '7DUZ' => 'Up To 5 Years', + '7DUQ' => 'Up To 10 Years', + '7DXC' => 'Up To 1 Day', + '7DXL' => 'Up To 1 Week', + '7DXH' => 'Life Of Publication', + '7DYF' => 'Up To 1 Day', + '7DWL' => 'Up To 1 Week', + '7DYJ' => 'Up To 2 Weeks', + '7DXF' => 'Up To 1 Month', + '7DZF' => 'Up To 2 Months', + '7DWC' => 'Up To 3 Months', + '7DWW' => 'Up To 6 Months', + '7DZA' => 'Up To 1 Year', + '7DZP' => 'Up To 2 Years', + '7DZJ' => 'Up To 3 Years', + '7DZK' => 'Up To 5 Years', + '7DZL' => 'Up To 10 Years', + '7DWS' => 'Life Of Publication', + '7DXZ' => 'Up To 3 Months', + '7DXW' => 'Up To 6 Months', + '7DXD' => 'Up To 1 Year', + '7DYS' => 'Life Of Publication', + '7DYM' => 'Up To 1 Year', + '7DWE' => 'Up To 2 Years', + '7DYL' => 'Up To 3 Years', + '7DWV' => 'Up To 5 Years', + '7DWB' => 'Up To 7 Years', + '7DYY' => 'Up To 10 Years', + '7DWG' => 'Up To 15 Years', + '7DXA' => 'Full Term Of Copyright', + '7DXT' => 'Up To 1 Day', + '7DXB' => 'Up To 1 Week', + '7DYI' => 'Up To 1 Month', + '7DWI' => 'Up To 1 Year', + '7DZM' => 'Up To 2 Years', + '7DZN' => 'Up To 3 Years', + '7DYV' => 'Life Of Event', + '7DXQ' => 'Up To 1 Year', + '7DZH' => 'Up To 2 Years', + '7DXP' => 'Up To 3 Years', + '7DYD' => 'Up To 5 Years', + '7DWU' => 'Up To 7 Years', + '7DXG' => 'Up To 10 Years', + '7DXV' => 'Up To 15 Years', + '7DWR' => 'In Perpetuity', + '7DXM' => 'Up To 1 Year', + '7DWK' => 'Up To 2 Years', + '7DXS' => 'In Perpetuity', + '7DYG' => 'Up To 1 Day', + '7DZD' => 'Up To 1 Week', + '7DWP' => 'Up To 13 Weeks', + '7DYT' => 'Up To 26 Weeks', + '7DWT' => 'Up To 52 Weeks', + '7DYA' => 'Up To 5 Years', + '7DXR' => 'Up To 10 Years', + '7DXI' => 'In Perpetuity', + '7DYW' => 'Up To 1 Day', + '7DYP' => 'Up To 1 Week', + '7DWJ' => 'Up To 1 Month', + '7DYE' => 'Up To 3 Months', + '7DYX' => 'Up To 6 Months', + '7DXE' => 'Up To 1 Year', + '7DWZ' => 'Up To 2 Years', + '7DZB' => 'Up To 3 Years', + '7DYN' => 'Up To 5 Years', + '7DYC' => 'Up To 10 Years', + '7DXY' => 'Up To 15 Years', + '7DWM' => 'In Perpetuity', + '7DYZ' => 'Up To 1 Day', + '7DXK' => 'Up To 1 Month', + '7DWY' => 'Up To 3 Months', + '7DYB' => 'Up To 6 Months', + '7DZG' => 'Up To 1 Year', + '7DYK' => 'Up To 2 Years', + '7DYQ' => 'In Perpetuity', + # 8R - Region + '8RAA' => 'Worldwide', + '8RXX' => 'Not Applicable or None', + '8RUL' => 'Any Regions', + '8RWA' => 'Broad International Region|Worldwide Excluding Northern America', + '8RWB' => 'Broad International Region|Worldwide Excluding USA', + '8RWC' => 'Broad International Region|Worldwide Excluding USA and Europe', + '8RWD' => 'Broad International Region|Worldwide Excluding Europe', + '8RWE' => 'Broad International Region|Worldwide Excluding USA and UK', + '8RWF' => 'Broad International Region|Worldwide Excluding UK', + '8RWG' => 'Broad International Region|All English Speaking Countries', + '8RWH' => 'Broad International Region|All English Speaking Countries Excluding USA', + '8RAH' => 'Broad International Region|All Spanish Speaking Countries', + '8RWI' => 'Broad International Region|All Spanish Speaking Countries Excluding USA', + '8RFY' => 'Broad International Region|All Americas', + '8REK' => 'Broad International Region|Europe, Middle East and Africa', + '8RWJ' => 'Broad International Region|USA, Canada and Mexico', + '8RQV' => 'Northern America|One Minor City, Up To 250,000 Population', + '8RQT' => 'Northern America|One Major City, Over 250,000 Population', + '8RQU' => 'Northern America|One Metropolitan Area, Adjoining Cities', + '8RRJ' => 'Northern America|One State Or Province', + '8RYK' => 'Northern America|Up To 3 States Or Provinces', + '8RCD' => 'Northern America|Up To 5 States Or Provinces', + '8RGJ' => 'Northern America|All Northern American Countries', + '8RCE' => 'Northern America|USA and Canada', + '8RHQ' => 'Northern America|USA', + '8RCA' => 'Northern America|Canada', + '8RHJ' => 'Northern America|USA-Central', + '8RHP' => 'Northern America|USA-Midwest', + '8RHR' => 'Northern America|USA-Northeast', + '8RHS' => 'Northern America|USA-Pacific Northwest', + '8RHW' => 'Northern America|USA-Southeast', + '8RHX' => 'Northern America|USA-Southwest', + '8RIA' => 'Northern America|USA-West', + '8RHY' => 'Northern America|USA-Minor Outlying Islands', + '8RUK' => 'Northern America|USA-All Territories, Protectorates, Dependencies, Outposts', + '8RBK' => 'Northern America|Canada-British Columbia', + '8RUM' => 'Northern America|Canada-Prairies', + '8RUN' => 'Northern America|Canada-Atlantic Provinces', + '8RCJ' => 'Northern America|Canada-Ontario', + '8RUP' => 'Northern America|Canada-Quebec', + '8RUQ' => 'Northern America|Canada-Northern Territories', + '8RBM' => 'Northern America|Bermuda', + '8RGL' => 'Northern America|Greenland', + '8RPM' => 'Northern America|Saint Pierre and Miquelon', + '8RQL' => 'Europe|One Minor City, Up To 250,000 Population', + '8RQJ' => 'Europe|One Major City, Over 250,000 Population', + '8RQK' => 'Europe|One Metropolitan Area, Adjoining Cities', + '8RRF' => 'Europe|One State Or Province', + '8RYF' => 'Europe|Up To 3 States Or Provinces', + '8RYG' => 'Europe|Up To 5 States Or Provinces', + '8RDU' => 'Europe|All Europe', + '8REL' => 'Europe|All European Union Countries', + '8REI' => 'Europe|All United Kingdom', + '8REJ' => 'Europe|All Western Europe', + '8RED' => 'Europe|All Northern Europe', + '8REB' => 'Europe|All European Mediterranean Countries', + '8REA' => 'Europe|All Eastern Europe', + '8RDW' => 'Europe|All Baltic States', + '8RDX' => 'Europe|All Benelux', + '8RDY' => 'Europe|All Caucasian States', + '8REF' => 'Europe|All Scandinavia', + '8RAX' => 'Europe|Aland Islands', + '8RAL' => 'Europe|Albania', + '8RAD' => 'Europe|Andorra', + '8RAM' => 'Europe|Armenia', + '8RAT' => 'Europe|Austria', + '8RAZ' => 'Europe|Azerbaijan', + '8RBY' => 'Europe|Belarus', + '8RBE' => 'Europe|Belgium', + '8RBA' => 'Europe|Bosnia and Herzegovina', + '8RBG' => 'Europe|Bulgaria', + '8RDR' => 'Europe|Croatia', + '8RCY' => 'Europe|Cyprus', + '8RCZ' => 'Europe|Czech Republic', + '8RDK' => 'Europe|Denmark', + '8REM' => 'Europe|England', + '8REE' => 'Europe|Estonia', + '8RDS' => 'Europe|Faeroe Islands', + '8RFI' => 'Europe|Finland', + '8RFR' => 'Europe|France', + '8RGE' => 'Europe|Georgia', + '8RDE' => 'Europe|Germany', + '8RGI' => 'Europe|Gibraltar', + '8RGR' => 'Europe|Greece', + '8RGG' => 'Europe|Guernsey', + '8RHU' => 'Europe|Hungary', + '8RIS' => 'Europe|Iceland', + '8RIE' => 'Europe|Ireland', + '8RIM' => 'Europe|Isle Of Man', + '8RIT' => 'Europe|Italy', + '8RJE' => 'Europe|Jersey', + '8RLV' => 'Europe|Latvia', + '8RLI' => 'Europe|Liechtenstein', + '8RLT' => 'Europe|Lithuania', + '8RLU' => 'Europe|Luxembourg', + '8RMK' => 'Europe|Macedonia', + '8RMT' => 'Europe|Malta', + '8RMD' => 'Europe|Moldova', + '8RMC' => 'Europe|Monaco', + '8RNL' => 'Europe|Netherlands', + '8RUH' => 'Europe|Northern Ireland', + '8RNO' => 'Europe|Norway', + '8RPL' => 'Europe|Poland', + '8RPT' => 'Europe|Portugal', + '8RRO' => 'Europe|Romania', + '8RRU' => 'Europe|Russian Federation', + '8RSM' => 'Europe|San Marino', + '8REN' => 'Europe|Scotland', + '8RCS' => 'Europe|Serbia and Montenegro', + '8RSK' => 'Europe|Slovakia', + '8RSI' => 'Europe|Slovenia', + '8RES' => 'Europe|Spain', + '8RSE' => 'Europe|Sweden', + '8RCH' => 'Europe|Switzerland', + '8RUA' => 'Europe|Ukraine', + '8RUI' => 'Europe|Wales', + '8RDT' => 'Europe|Vatican City State', + '8RQF' => 'Asia|One Minor City, Up To 250,000 Population', + '8RQD' => 'Asia|One Major City, Over 250,000 Population', + '8RQE' => 'Asia|One Metropolitan Area, Adjoining Cities', + '8RRC' => 'Asia|One State Or Province', + '8RAV' => 'Asia|Up To 3 States Or Provinces', + '8RYD' => 'Asia|Up To 5 States Or Provinces', + '8RDB' => 'Asia|All Asia', + '8RDC' => 'Asia|All Central Asia', + '8RCP' => 'Asia|All Eastern Asia', + '8RDG' => 'Asia|All Southern Asia', + '8RDH' => 'Asia|All Southeastern Asia', + '8RBD' => 'Asia|Bangladesh', + '8RBT' => 'Asia|Bhutan', + '8RBN' => 'Asia|Brunei Darussalam', + '8RKH' => 'Asia|Cambodia', + '8RCN' => 'Asia|All China', + '8RUB' => 'Asia|China-East', + '8RAY' => 'Asia|China-Northeast', + '8RUC' => 'Asia|China-North', + '8RUD' => 'Asia|China-South Central', + '8RUF' => 'Asia|China-Southwest', + '8RHK' => 'Asia|Hong Kong', + '8RIN' => 'Asia|India', + '8RID' => 'Asia|Indonesia', + '8RJP' => 'Asia|Japan', + '8RKZ' => 'Asia|Kazakhstan', + '8RKP' => 'Asia|North Korea', + '8RKR' => 'Asia|South Korea', + '8RKG' => 'Asia|Kyrgyzstan', + '8RLA' => 'Asia|Laos', + '8RMO' => 'Asia|Macao', + '8RMY' => 'Asia|Malaysia', + '8RMV' => 'Asia|Maldives', + '8RMN' => 'Asia|Mongolia', + '8RMM' => 'Asia|Myanmar', + '8RNP' => 'Asia|Nepal', + '8RPK' => 'Asia|Pakistan', + '8RPH' => 'Asia|Philippines', + '8RSG' => 'Asia|Singapore', + '8RTW' => 'Asia|Taiwan', + '8RTJ' => 'Asia|Tajikistan', + '8RTH' => 'Asia|Thailand', + '8RDA' => 'Asia|Tibet', + '8RTL' => 'Asia|Timor-Leste', + '8RTM' => 'Asia|Turkmenistan', + '8RUZ' => 'Asia|Uzbekistan', + '8RVN' => 'Asia|Viet Nam', + '8RQO' => 'Latin America and Caribbean|One Minor City, Up To 250,000 Population', + '8RQM' => 'Latin America and Caribbean|One Major City, Over 250,000 Population', + '8RQN' => 'Latin America and Caribbean|One Metropolitan Area, Adjoining Cities', + '8RRG' => 'Latin America and Caribbean|One State Or Province', + '8RYH' => 'Latin America and Caribbean|Up To 3 States Or Provinces', + '8RYI' => 'Latin America and Caribbean|Up To 5 States Or Provinces', + '8RAC' => 'Latin America and Caribbean|All Latin America and Caribbean', + '8RUJ' => 'Latin America and Caribbean|All Latin America', + '8RFZ' => 'Latin America and Caribbean|All Caribbean', + '8RFS' => 'Latin America and Caribbean|All South America', + '8RGC' => 'Latin America and Caribbean|All Central America', + '8RFT' => 'Latin America and Caribbean|All Andean Countries', + '8RFU' => 'Latin America and Caribbean|All Southern Cone', + '8RFV' => 'Latin America and Caribbean|All Amazonia', + '8RAI' => 'Latin America and Caribbean|Anguilla', + '8RAG' => 'Latin America and Caribbean|Antigua and Barbuda', + '8RAR' => 'Latin America and Caribbean|Argentina', + '8RAW' => 'Latin America and Caribbean|Aruba', + '8RBS' => 'Latin America and Caribbean|Bahamas', + '8RBB' => 'Latin America and Caribbean|Barbados', + '8RBZ' => 'Latin America and Caribbean|Belize', + '8RGZ' => 'Latin America and Caribbean|Bequia', + '8RBO' => 'Latin America and Caribbean|Bolivia', + '8RHA' => 'Latin America and Caribbean|Bonaire', + '8RBR' => 'Latin America and Caribbean|Brazil', + '8RHB' => 'Latin America and Caribbean|British Virgin Islands', + '8RKY' => 'Latin America and Caribbean|Cayman Islands', + '8RCL' => 'Latin America and Caribbean|Chile', + '8RCO' => 'Latin America and Caribbean|Colombia', + '8RCR' => 'Latin America and Caribbean|Costa Rica', + '8RCU' => 'Latin America and Caribbean|Cuba', + '8RHC' => 'Latin America and Caribbean|Curacao', + '8RDM' => 'Latin America and Caribbean|Dominica', + '8RDO' => 'Latin America and Caribbean|Dominican Republic', + '8REC' => 'Latin America and Caribbean|Ecuador', + '8RSV' => 'Latin America and Caribbean|El Salvador', + '8RFK' => 'Latin America and Caribbean|Falkland Islands, Malvinas', + '8RGF' => 'Latin America and Caribbean|French Guiana', + '8RGD' => 'Latin America and Caribbean|Grenada', + '8RGP' => 'Latin America and Caribbean|Guadeloupe', + '8RGT' => 'Latin America and Caribbean|Guatemala', + '8RGY' => 'Latin America and Caribbean|Guyana', + '8RHT' => 'Latin America and Caribbean|Haiti', + '8RHN' => 'Latin America and Caribbean|Honduras', + '8RJM' => 'Latin America and Caribbean|Jamaica', + '8RMQ' => 'Latin America and Caribbean|Martinique', + '8RMX' => 'Latin America and Caribbean|Mexico', + '8RMS' => 'Latin America and Caribbean|Montserrat', + '8RAN' => 'Latin America and Caribbean|Netherlands Antilles', + '8RNI' => 'Latin America and Caribbean|Nicaragua', + '8RPA' => 'Latin America and Caribbean|Panama', + '8RPY' => 'Latin America and Caribbean|Paraguay', + '8RFQ' => 'Latin America and Caribbean|Patagonia', + '8RPE' => 'Latin America and Caribbean|Peru', + '8RPR' => 'Latin America and Caribbean|Puerto Rico', + '8RHD' => 'Latin America and Caribbean|Saba', + '8RHE' => 'Latin America and Caribbean|Saint Barthelemy', + '8RHF' => 'Latin America and Caribbean|Saint Eustatius', + '8RKN' => 'Latin America and Caribbean|Saint Kitts and Nevis', + '8RLC' => 'Latin America and Caribbean|Saint Lucia', + '8RHG' => 'Latin America and Caribbean|Saint Martin', + '8RVC' => 'Latin America and Caribbean|Saint Vincent and The Grenadines', + '8RSR' => 'Latin America and Caribbean|Suriname', + '8RTT' => 'Latin America and Caribbean|Trinidad and Tobago', + '8RTC' => 'Latin America and Caribbean|Turks and Caicos Islands', + '8RHH' => 'Latin America and Caribbean|U.S. Virgin Islands', + '8RUY' => 'Latin America and Caribbean|Uruguay', + '8RVE' => 'Latin America and Caribbean|Venezuela', + '8RQZ' => 'Oceania|One Minor City, Up To 250,000 Population', + '8RQW' => 'Oceania|One Major City, Over 250,000 Population', + '8RQY' => 'Oceania|One Metropolitan Area, Adjoining Cities', + '8RRK' => 'Oceania|One State Or Province', + '8RYL' => 'Oceania|Up To 3 States Or Provinces', + '8RYM' => 'Oceania|Up To 5 States Or Provinces', + '8RCT' => 'Oceania|All Oceania', + '8RUR' => 'Oceania|All Australia and New Zealand', + '8RUS' => 'Oceania|All Oceania excluding Australia and New Zealand', + '8RAU' => 'Oceania|Australia', + '8RAS' => 'Oceania|American Samoa', + '8RCX' => 'Oceania|Christmas Island', + '8RCC' => 'Oceania|Cocos, Keeling Islands', + '8RKM' => 'Oceania|Comoros', + '8RCK' => 'Oceania|Cook Islands', + '8RFJ' => 'Oceania|Fiji', + '8RPF' => 'Oceania|French Polynesia', + '8RGU' => 'Oceania|Guam', + '8RKI' => 'Oceania|Kiribati', + '8RMG' => 'Oceania|Madagascar', + '8RMH' => 'Oceania|Marshall Islands', + '8RMU' => 'Oceania|Mauritius', + '8RFM' => 'Oceania|Micronesia', + '8RFF' => 'Oceania|Midway Islands', + '8RNR' => 'Oceania|Nauru', + '8RNC' => 'Oceania|New Caledonia', + '8RNZ' => 'Oceania|New Zealand', + '8RNU' => 'Oceania|Niue', + '8RNF' => 'Oceania|Norfolk Island', + '8RMP' => 'Oceania|Northern Mariana Islands', + '8RPW' => 'Oceania|Palau', + '8RPG' => 'Oceania|Papua New Guinea', + '8RPN' => 'Oceania|Pitcairn Islands', + '8RFH' => 'Oceania|Rapa Nui, Easter Island', + '8RWS' => 'Oceania|Samoa', + '8RSC' => 'Oceania|Seychelles', + '8RSB' => 'Oceania|Solomon Islands', + '8RLK' => 'Oceania|Sri Lanka', + '8RFL' => 'Oceania|Tahiti', + '8RTK' => 'Oceania|Tokelau', + '8RTO' => 'Oceania|Tonga', + '8RTV' => 'Oceania|Tuvalu', + '8RVU' => 'Oceania|Vanuatu', + '8RFP' => 'Oceania|Wallis and Futuna', + '8RQS' => 'Middle East|One Minor City, Up To 250,000 Population', + '8RQP' => 'Middle East|One Major City, Over 250,000 Population', + '8RQR' => 'Middle East|One Metropolitan Area, Adjoining Cities', + '8RRH' => 'Middle East|One State Or Province', + '8RYJ' => 'Middle East|Up To 3 States Or Provinces', + '8RBX' => 'Middle East|Up To 5 States Or Provinces', + '8REX' => 'Middle East|All Middle East', + '8REY' => 'Middle East|All Middle Eastern Gulf States', + '8RIB' => 'Middle East|All Middle Eastern Mediterranean Countries', + '8RAF' => 'Middle East|Afghanistan', + '8RBH' => 'Middle East|Bahrain', + '8RIR' => 'Middle East|Iran', + '8RIQ' => 'Middle East|Iraq', + '8RIL' => 'Middle East|Israel', + '8RJO' => 'Middle East|Jordan', + '8RKW' => 'Middle East|Kuwait', + '8RLB' => 'Middle East|Lebanon', + '8ROM' => 'Middle East|Oman', + '8REV' => 'Middle East|Palestinian Authority', + '8RQA' => 'Middle East|Qatar', + '8RSA' => 'Middle East|Saudi Arabia', + '8RSY' => 'Middle East|Syria', + '8RTR' => 'Middle East|Turkey', + '8RAE' => 'Middle East|United Arab Emirates', + '8RYE' => 'Middle East|Yemen', + '8RQC' => 'Africa|One Minor City, Up To 250,000 Population', + '8RQX' => 'Africa|One Major City, Over 250,000 Population', + '8RQB' => 'Africa|One Metropolitan Area, Adjoining Cities', + '8RRB' => 'Africa|One State Or Province', + '8RYB' => 'Africa|Up To 3 States Or Provinces', + '8RYC' => 'Africa|Up To 5 States Or Provinces', + '8RAJ' => 'Africa|All Africa', + '8RAK' => 'Africa|All African Mediterranean Countries', + '8RAP' => 'Africa|All Central Africa', + '8RAQ' => 'Africa|All Eastern Africa', + '8RBC' => 'Africa|All Southern Africa', + '8RBL' => 'Africa|All Western Africa', + '8RDZ' => 'Africa|Algeria', + '8RAO' => 'Africa|Angola', + '8RBP' => 'Africa|Ascension Island', + '8RBJ' => 'Africa|Benin', + '8RBW' => 'Africa|Botswana', + '8RBF' => 'Africa|Burkina Faso', + '8RBI' => 'Africa|Burundi', + '8RCM' => 'Africa|Cameroon', + '8RCV' => 'Africa|Cape Verde', + '8RCF' => 'Africa|Central African Republic', + '8RTD' => 'Africa|Chad', + '8RCG' => 'Africa|Congo', + '8RCI' => 'Africa|Cote D\'Ivoire', + '8RDJ' => 'Africa|Djibouti', + '8REG' => 'Africa|Egypt', + '8RGQ' => 'Africa|Equatorial Guinea', + '8RER' => 'Africa|Eritrea', + '8RET' => 'Africa|Ethiopia', + '8RGA' => 'Africa|Gabon', + '8RGM' => 'Africa|Gambia', + '8RGH' => 'Africa|Ghana', + '8RGN' => 'Africa|Guinea', + '8RGW' => 'Africa|Guinea-Bissau', + '8RKE' => 'Africa|Kenya', + '8RLS' => 'Africa|Lesotho', + '8RLR' => 'Africa|Liberia', + '8RLY' => 'Africa|Libyan Arab Jamahiriya', + '8RMW' => 'Africa|Malawi', + '8RML' => 'Africa|Mali', + '8RMR' => 'Africa|Mauritania', + '8RYT' => 'Africa|Mayotte', + '8RMA' => 'Africa|Morocco', + '8RMZ' => 'Africa|Mozambique', + '8RNA' => 'Africa|Namibia', + '8RNE' => 'Africa|Niger', + '8RNG' => 'Africa|Nigeria', + '8RRE' => 'Africa|Reunion', + '8RRW' => 'Africa|Rwanda', + '8RSH' => 'Africa|Saint Helena', + '8RST' => 'Africa|Sao Tome and Principe', + '8RSN' => 'Africa|Senegal', + '8RSL' => 'Africa|Sierra Leone', + '8RSO' => 'Africa|Somalia', + '8RZA' => 'Africa|South Africa', + '8RSD' => 'Africa|Sudan', + '8RSZ' => 'Africa|Swaziland', + '8RTZ' => 'Africa|Tanzania, United Republic Of', + '8RTG' => 'Africa|Togo', + '8RTN' => 'Africa|Tunisia', + '8RUG' => 'Africa|Uganda', + '8REH' => 'Africa|Western Sahara', + '8RZM' => 'Africa|Zambia', + '8RZW' => 'Africa|Zimbabwe', + '8RBQ' => 'Other Regions|Antarctica', + '8RCB' => 'Other Regions|All Arctic and Arctic Ocean Islands', + '8RFB' => 'Other Regions|All Northern Atlantic Ocean Islands', + '8RFW' => 'Other Regions|All Southern Atlantic Ocean Islands', + '8RFX' => 'Other Regions|All Southern Indian Ocean Islands', + '8REU' => 'Other Regions|All French Southern Territories', + '8RDQ' => 'Other Regions|All British Indian Ocean Territories', + # 8L - Language + '8LAA' => 'All Languages', + '8LXX' => 'Not Applicable or None', + '8LUL' => 'Any Languages', + '8LOL' => 'Any One Language', + '8LEN' => 'English', + '8LAF' => 'Afrikaans', + '8LAR' => 'Arabic', + '8LBO' => 'Bosnian', + '8LBU' => 'Bulgarian', + '8LCA' => 'Chinese-Cantonese', + '8LCH' => 'Chinese-Mandarin', + '8LCP' => 'Chinese-Other', + '8LCR' => 'Croatian', + '8LCZ' => 'Czech', + '8LDA' => 'Danish', + '8LDU' => 'Dutch', + '8LES' => 'Estonian', + '8LFI' => 'Finnish', + '8LFR' => 'French', + '8LGE' => 'German', + '8LGR' => 'Greek', + '8LHE' => 'Hebrew', + '8LHI' => 'Hindi', + '8LHU' => 'Hungarian', + '8LIC' => 'Icelandic', + '8LIN' => 'Indonesian', + '8LIG' => 'Irish Gaelic', + '8LIT' => 'Italian', + '8LJA' => 'Japanese', + '8LKO' => 'Korean', + '8LLA' => 'Latvian', + '8LMG' => 'Mongolian', + '8LNO' => 'Norwegian', + '8LPO' => 'Polish', + '8LPR' => 'Portuguese', + '8LRO' => 'Romanian', + '8LRU' => 'Russian', + '8LSG' => 'Scottish Gaelic', + '8LSE' => 'Serbian', + '8LSI' => 'Sindhi', + '8LSV' => 'Slovakian', + '8LSL' => 'Slovenian', + '8LSP' => 'Spanish', + '8LSH' => 'Swahili', + '8LSZ' => 'Swazi', + '8LSW' => 'Swedish', + '8LTA' => 'Tagalog', + '8LTH' => 'Thai', + '8LTU' => 'Turkish', + '8LUR' => 'Ukrainian', + '8LYI' => 'Yiddish', + '8LOT' => 'Other Language', + # 8I - Industry + '8IAA' => 'All Industries', + '8IXX' => 'Not Applicable or None', + '8IUL' => 'Any Industries', + '8IAD' => 'Advertising and Marketing', + '8IAG' => 'Agriculture, Farming and Horticulture', + '8IAT' => 'Airline Transportation', + '8IAL' => 'Alcohol', + '8IAR' => 'Architecture and Engineering', + '8IAE' => 'Arts and Entertainment', + '8IAU' => 'Automotive', + '8IAV' => 'Aviation', + '8IBA' => 'Baby and Childcare', + '8IBE' => 'Beauty and Personal Care', + '8IBI' => 'Biotechnology', + '8IBR' => 'Broadcast Media', + '8ICO' => 'Business Consulting and Services', + '8ICH' => 'Chemicals', + '8ICE' => 'Communications Equipment and Services', + '8IHS' => 'Computer Hardware, Software and Peripherals', + '8ICC' => 'Construction and Contracting', + '8IAP' => 'Consumer Appliances and Electronics', + '8ICG' => 'Counseling', + '8IEC' => 'Ecology, Environmental and Conservation', + '8IED' => 'Education', + '8IEM' => 'Employment Training and Recruitment', + '8IEN' => 'Energy, Utilities and Fuel', + '8IEV' => 'Events and Conventions', + '8IFA' => 'Fashion', + '8IFI' => 'Financial Services and Banking', + '8IFB' => 'Food and Beverage Processing', + '8IFL' => 'Food and Beverage Retail', + '8IFS' => 'Food Services', + '8IFO' => 'Forestry and Wood Products', + '8IFR' => 'Freight and Warehousing', + '8IFU' => 'Furniture', + '8IGA' => 'Games, Toys and Hobbies', + '8IGI' => 'Gaming Industry', + '8IGL' => 'Gardening and Landscaping', + '8IGO' => 'Government and Politics', + '8IGR' => 'Graphic Design', + '8IGC' => 'Greeting Card', + '8IHI' => 'Heavy Industry', + '8IHO' => 'Home Improvement', + '8IHH' => 'Hotels and Hospitality', + '8IHA' => 'Household Appliances', + '8IHC' => 'Household Cleaning Products', + '8IIM' => 'Industry and Manufacturing', + '8IIT' => 'Information Technologies', + '8IIN' => 'Insurance', + '8IIS' => 'Internet Services', + '8ILS' => 'Legal Services', + '8IME' => 'Medical and Healthcare', + '8IMS' => 'Microelectronics and Semiconductors', + '8IMW' => 'Military and Weapons', + '8IMM' => 'Mining and Metals', + '8IMU' => 'Music', + '8INP' => 'Not For Profit, Social, Charitable', + '8IOP' => 'Office Products', + '8IOG' => 'Oil and Gas', + '8IOI' => 'Other Industry', + '8IPO' => 'Personal Use Only', + '8IPP' => 'Pet Products and Services', + '8IPS' => 'Pharmaceuticals and Supplements', + '8IPT' => 'Printing and Reprographics', + '8IPR' => 'Public Relations', + '8IPM' => 'Publishing Media', + '8IRE' => 'Real Estate', + '8IRR' => 'Religion and Religious Services', + '8ISM' => 'Retail Sales and Marketing', + '8IRM' => 'Retail Merchandise', + '8ISS' => 'Safety and Security', + '8ISC' => 'Sciences', + '8ISH' => 'Shipping', + '8ISO' => 'Software', + '8ISF' => 'Sports, Fitness and Recreation', + '8ITE' => 'Telecommunications', + '8ITX' => 'Textiles and Apparel', + '8ITB' => 'Tobacco', + '8ITR' => 'Travel and Tourism', + # 9E - Exclusivity + '9EXX' => 'Not Applicable or None', + '9ENE' => 'Non-Exclusive', + '9EXC' => 'All Exclusive', + '9EIN' => 'Exclusivity For Industry', + '9EME' => 'Exclusivity For Media', + '9ELA' => 'Exclusivity For Language', + '9ERE' => 'Exclusivity For Region' +); + +# PLUS License Data Format 1.2.0 (plus) (ref 1) +%Image::ExifTool::PLUS::XMP = ( + %Image::ExifTool::XMP::xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-plus', 2 => 'Author' }, + NAMESPACE => 'plus', + NOTES => q{ + PLUS (Picture Licensing Universal System) License Data Format 1.2.1 XMP + tags. Note that all controlled-vocabulary tags in this table (ie. tags with + a fixed set of values) have raw values which begin with + "http://ns.useplus.org/ldf/vocab/", but to reduce clutter this prefix has + been removed from the values shown below. See L<http://ns.useplus.org/> for + the complete specification. + }, + Version => { Name => 'PLUSVersion' }, + Licensee => { + FlatName => '', + Struct => \%plusLicensee, + List => 'Seq', + }, + EndUser => { + FlatName => '', + Struct => \%plusEndUser, + List => 'Seq', + }, + Licensor => { + FlatName => '', + Struct => \%plusLicensor, + List => 'Seq', + }, + LicensorNotes => { Writable => 'lang-alt' }, + MediaSummaryCode => { + SeparateTable => 'MediaMatrix', + PrintConv => \%mediaMatrix, + }, + LicenseStartDate => { %Image::ExifTool::XMP::dateTimeInfo, Groups => { 2 => 'Time'} }, + LicenseEndDate => { %Image::ExifTool::XMP::dateTimeInfo, Groups => { 2 => 'Time'} }, + MediaConstraints => { Writable => 'lang-alt' }, + RegionConstraints => { Writable => 'lang-alt' }, + ProductOrServiceConstraints => { Writable => 'lang-alt' }, + ImageFileConstraints => { + List => 'Bag', + %plusVocab, + PrintConv => { + 'IF-MFN' => 'Maintain File Name', + 'IF-MID' => 'Maintain ID in File Name', + 'IF-MMD' => 'Maintain Metadata', + 'IF-MFT' => 'Maintain File Type', + }, + }, + ImageAlterationConstraints => { + List => 'Bag', + %plusVocab, + PrintConv => { + 'AL-CRP' => 'No Cropping', + 'AL-FLP' => 'No Flipping', + 'AL-RET' => 'No Retouching', + 'AL-CLR' => 'No Colorization', + 'AL-DCL' => 'No De-Colorization', + 'AL-MRG' => 'No Merging', + }, + }, + ImageDuplicationConstraints => { + %plusVocab, + PrintConv => { + 'DP-NDC' => 'No Duplication Constraints', + 'DP-LIC' => 'Duplication Only as Necessary Under License', + 'DP-NOD' => 'No Duplication', + }, + }, + ModelReleaseStatus => { + %plusVocab, + PrintConv => { + 'MR-NON' => 'None', + 'MR-NAP' => 'Not Applicable', + 'MR-UMR' => 'Unlimited Model Releases', + 'MR-LMR' => 'Limited or Incomplete Model Releases', + }, + }, + ModelReleaseID => { List => 'Bag' }, + MinorModelAgeDisclosure => { + %plusVocab, + PrintConv => { + 'AG-UNK' => 'Age Unknown', + 'AG-A25' => 'Age 25 or Over', + 'AG-A24' => 'Age 24', + 'AG-A23' => 'Age 23', + 'AG-A22' => 'Age 22', + 'AG-A21' => 'Age 21', + 'AG-A20' => 'Age 20', + 'AG-A19' => 'Age 19', + 'AG-A18' => 'Age 18', + 'AG-A17' => 'Age 17', + 'AG-A16' => 'Age 16', + 'AG-A15' => 'Age 15', + 'AG-U14' => 'Age 14 or Under', + }, + }, + PropertyReleaseStatus => { + %plusVocab, + PrintConv => { + 'PR-NON' => 'None', + 'PR-NAP' => 'Not Applicable', + 'PR-UPR' => 'Unlimited Property Releases', + 'PR-LPR' => 'Limited or Incomplete Property Releases', + }, + }, + PropertyReleaseID => { List => 'Bag' }, + OtherConstraints => { Writable => 'lang-alt' }, + CreditLineRequired => { + %plusVocab, + PrintConv => { + 'CR-NRQ' => 'Not Required', + 'CR-COI' => 'Credit on Image', + 'CR-CAI' => 'Credit Adjacent To Image', + 'CR-CCA' => 'Credit in Credits Area', + }, + }, + AdultContentWarning => { + %plusVocab, + PrintConv => { + 'CW-NRQ' => 'Not Required', + 'CW-AWR' => 'Adult Content Warning Required', + 'CW-UNK' => 'Unknown', + }, + }, + OtherLicenseRequirements => { Writable => 'lang-alt' }, + TermsAndConditionsText => { Writable => 'lang-alt' }, + TermsAndConditionsURL => { }, + OtherConditions => { Writable => 'lang-alt' }, + ImageType => { + %plusVocab, + PrintConv => { + 'TY-PHO' => 'Photographic Image', + 'TY-ILL' => 'Illustrated Image', + 'TY-MCI' => 'Multimedia or Composited Image', + 'TY-VID' => 'Video', + 'TY-OTR' => 'Other', + }, + }, + LicensorImageID => { }, + FileNameAsDelivered => { }, + ImageFileFormatAsDelivered => { + %plusVocab, + PrintConv => { + 'FF-JPG' => 'JPEG Interchange Formats (JPG, JIF, JFIF)', + 'FF-TIF' => 'Tagged Image File Format (TIFF)', + 'FF-GIF' => 'Graphics Interchange Format (GIF)', + 'FF-RAW' => 'Proprietary RAW Image Format', + 'FF-DNG' => 'Digital Negative (DNG)', + 'FF-EPS' => 'Encapsulated PostScript (EPS)', + 'FF-BMP' => 'Windows Bitmap (BMP)', + 'FF-PSD' => 'Photoshop Document (PSD)', + 'FF-PIC' => 'Macintosh Picture (PICT)', + 'FF-PNG' => 'Portable Network Graphics (PNG)', + 'FF-WMP' => 'Windows Media Photo (HD Photo)', + 'FF-OTR' => 'Other', + }, + }, + ImageFileSizeAsDelivered => { + %plusVocab, + PrintConv => { + 'SZ-U01' => 'Up to 1 MB', + 'SZ-U10' => 'Up to 10 MB', + 'SZ-U30' => 'Up to 30 MB', + 'SZ-U50' => 'Up to 50 MB', + 'SZ-G50' => 'Greater than 50 MB', + }, + }, + CopyrightStatus => { + %plusVocab, + PrintConv => { + 'CS-PRO' => 'Protected', + 'CS-PUB' => 'Public Domain', + 'CS-UNK' => 'Unknown', + }, + }, + CopyrightRegistrationNumber => { }, + FirstPublicationDate => { %Image::ExifTool::XMP::dateTimeInfo, Groups => { 2 => 'Time'} }, + CopyrightOwner => { + FlatName => '', + Struct => \%plusCopyrightOwner, + List => 'Seq', + }, + CopyrightOwnerImageID => { }, + ImageCreator => { + FlatName => '', + Struct => \%plusImageCreator, + List => 'Seq', + }, + ImageCreatorImageID => { }, + ImageSupplier => { + FlatName => '', + Struct => \%plusImageSupplier, + List => 'Seq', + }, + ImageSupplierImageID => { }, + LicenseeImageID => { }, + LicenseeImageNotes => { Writable => 'lang-alt' }, + OtherImageInfo => { Writable => 'lang-alt' }, + LicenseID => { }, + LicensorTransactionID => { List => 'Bag' }, + LicenseeTransactionID => { List => 'Bag' }, + LicenseeProjectReference=> { List => 'Bag' }, + LicenseTransactionDate => { %Image::ExifTool::XMP::dateTimeInfo, Groups => { 2 => 'Time'} }, + Reuse => { + %plusVocab, + PrintConv => { + 'RE-REU' => 'Repeat Use', + 'RE-NAP' => 'Not Applicable', + }, + }, + OtherLicenseDocuments => { List => 'Bag' }, + OtherLicenseInfo => { Writable => 'lang-alt' }, + # Note: these are Bag's of lang-alt lists -- a nested list tag! + Custom1 => { List => 'Bag', Writable => 'lang-alt' }, + Custom2 => { List => 'Bag', Writable => 'lang-alt' }, + Custom3 => { List => 'Bag', Writable => 'lang-alt' }, + Custom4 => { List => 'Bag', Writable => 'lang-alt' }, + Custom5 => { List => 'Bag', Writable => 'lang-alt' }, + Custom6 => { List => 'Bag', Writable => 'lang-alt' }, + Custom7 => { List => 'Bag', Writable => 'lang-alt' }, + Custom8 => { List => 'Bag', Writable => 'lang-alt' }, + Custom9 => { List => 'Bag', Writable => 'lang-alt' }, + Custom10 => { List => 'Bag', Writable => 'lang-alt' }, +); + +#------------------------------------------------------------------------------ +# Validate Media Summary Code +# Inputs: 0) Media Usage Code +# Returns: true if OK, false on severe error +# - issues warning for detected format problems +# - repairs some repairable problems +sub ValidateMediaSummary($) +{ + my $val = shift; + + my @a = split /\|/, $val; + @a >= 4 and $a[0] eq '' or warn("Not a valid Media Summary Code\n"), return 0; + $a[1] eq 'PLUS' or warn("Unrecognized Media Usage standard\n"), return 0; + $a[2] =~ /^V(\d+)/ or warn("Unrecognized Media Usage version\n"); + $a[3] =~ /^U(\d+)/ or warn("Invalid Media Usage count\n"), return 0; + my $numUsages = $1; + my ($i, $j); + unless ($numUsages == @a - 4) { + warn("Fixed incorrect number of Media Usages\n"); + $numUsages = @a - 4; + $a[3] = sprintf('U%.3d', $numUsages); + } + for ($i=1; $i<=$numUsages; ++$i) { + my $usage = $a[$i + 3]; + $usage =~ /^1I([A-Z])([A-Z])/ or warn("Missing Media Usage $i item count\n"), return 0; + length($usage) % 4 and warn("Incorrect Media Usage $i length\n"), return 0; + my $numItems = (ord($1)-65) * 26 + ord($2)-65 + 1; + unless (length($usage) == 4 * ($numItems + 1)) { + $numItems = length($usage) / 4 - 1; + warn("Fixed incorrect Media Usage $i item count\n"); + $a[$i+3] = '1I' . chr(65 + int($numItems / 26)) . chr($numItems % 26) . substr($usage, 4); + } + for ($j=1; $j<=$numItems; ++$j) { + my $item = substr($usage, $j*4, 4); + $item =~ /^\d[A-Z]{3}$/ or warn(qq(Invalid item "$item" for Media Usage $i\n)), return 0; + } + } + $_[0] = join('|', @a) . '|' if $Image::ExifTool::evalWarning; + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::PLUS - PLUS (Picture Licensing Universal System) tags + +=head1 DESCRIPTION + +Definitions for PLUS (Picture Licensing Universal System) tags. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.useplus.com/useplus/standards.asp> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PLUS Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/PNG.pm b/lib/Image/ExifTool/PNG.pm new file mode 100644 index 0000000..6bcaeee --- /dev/null +++ b/lib/Image/ExifTool/PNG.pm @@ -0,0 +1,1590 @@ +#------------------------------------------------------------------------------ +# File: PNG.pm +# +# Description: Read and write PNG meta information +# +# Revisions: 06/10/2005 - P. Harvey Created +# 06/23/2005 - P. Harvey Added MNG and JNG support +# 09/16/2005 - P. Harvey Added write support +# +# References: 1) http://www.libpng.org/pub/png/spec/1.2/ +# 2) http://www.faqs.org/docs/png/ +# 3) http://www.libpng.org/pub/mng/ +# 4) http://www.libpng.org/pub/png/spec/register/ +# 5) ftp://ftp.simplesystems.org/pub/png/documents/pngext-1.4.0-pdg.html +# 6) ftp://ftp.simplesystems.org/pub/png/documents/pngext-1.5.0.html +# +# Notes: Writing meta information in PNG images is a pain in the butt +# for a number of reasons: One biggie is that you have to +# decompress then decode the ASCII/hex profile information before +# you can edit it, then you have to ASCII/hex-encode, recompress +# and calculate a CRC before you can write it out again. gaaaak. +# +# Although XMP is allowed after the IDAT chunk according to the +# PNG specifiction, some apps (Apple Spotlight and Preview for +# OS X 10.8.5 and Adobe Photoshop CC 14.0) ignore it unless it +# comes before IDAT. As of version 11.58, ExifTool uses a 2-pass +# writing algorithm to allow it to be compatible with XMP after +# IDAT while writing it before IDAT. (PNG and EXIF are still +# written after IDAT.) As of version 11.63, this strategy is +# applied to all text chunks (tEXt, zTXt and iTXt). +#------------------------------------------------------------------------------ + +package Image::ExifTool::PNG; + +use strict; +use vars qw($VERSION $AUTOLOAD %stdCase); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.60'; + +sub ProcessPNG_tEXt($$$); +sub ProcessPNG_iTXt($$$); +sub ProcessPNG_eXIf($$$); +sub ProcessPNG_Compressed($$$); +sub CalculateCRC($;$$$); +sub HexEncode($); +sub AddChunks($$;@); +sub Add_iCCP($$); +sub DoneDir($$$;$); +sub GetLangInfo($$); +sub BuildTextChunk($$$$$); +sub ConvertPNGDate($$); +sub InversePNGDate($$); + +# translate lower-case to actual case used for eXIf/zXIf chunks +%stdCase = ( 'zxif' => 'zxIf', exif => 'eXIf' ); + +my $noCompressLib; + +# look up for file type, header chunk and end chunk, based on file signature +my %pngLookup = ( + "\x89PNG\r\n\x1a\n" => ['PNG', 'IHDR', 'IEND' ], + "\x8aMNG\r\n\x1a\n" => ['MNG', 'MHDR', 'MEND' ], + "\x8bJNG\r\n\x1a\n" => ['JNG', 'JHDR', 'IEND' ], +); + +# map for directories in PNG images +my %pngMap = ( + IFD1 => 'IFD0', + EXIF => 'IFD0', # to write EXIF as a block + ExifIFD => 'IFD0', + GPS => 'IFD0', + SubIFD => 'IFD0', + GlobParamIFD => 'IFD0', + PrintIM => 'IFD0', + InteropIFD => 'ExifIFD', + MakerNotes => 'ExifIFD', + IFD0 => 'PNG', + XMP => 'PNG', + ICC_Profile => 'PNG', + Photoshop => 'PNG', + 'PNG-pHYs' => 'PNG', + IPTC => 'Photoshop', + MakerNotes => 'ExifIFD', +); + +# color type of current image +$Image::ExifTool::PNG::colorType = -1; + +# data and text chunk types +my %isDatChunk = ( IDAT => 1, JDAT => 1, JDAA => 1 ); +my %isTxtChunk = ( tEXt => 1, zTXt => 1, iTXt => 1, eXIf => 1 ); + +# chunks that we shouldn't move other chunks across (ref 3) +my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND => 1, + DHDR => 1, BASI => 1, CLON => 1, PAST => 1, SHOW => 1, MAGN => 1 ); + +# PNG chunks +%Image::ExifTool::PNG::Main = ( + WRITE_PROC => \&Image::ExifTool::DummyWriteProc, + GROUPS => { 2 => 'Image' }, + PREFERRED => 1, # always add these tags when writing + NOTES => q{ + Tags extracted from PNG images. See + L<http://www.libpng.org/pub/png/spec/1.2/> for the official PNG 1.2 + specification. + + According to the specification, a PNG file should end at the IEND chunk, + however ExifTool will preserve any data found after this when writing unless + it is specifically deleted with C<-Trailer:All=>. When reading, a minor + warning is issued if this trailer exists, and ExifTool will attempt to parse + this data as additional PNG chunks. + + Also according to the PNG specification, there is no restriction on the + location of text-type chunks (tEXt, zTXt and iTXt). However, certain + utilities (including some Apple and Adobe utilities) won't read the XMP iTXt + chunk if it comes after the IDAT chunk, and at least one utility won't read + other text chunks here. For this reason, when writing, ExifTool 11.63 and + later create new text chunks (including XMP) before IDAT, and move existing + text chunks to before IDAT. + + The PNG format contains CRC checksums that are validated when reading with + either the L<Verbose|../ExifTool.html#Verbose> or L<Validate|../ExifTool.html#Validate> option. When writing, these checksums are + validated by default, but the L<FastScan|../ExifTool.html#FastScan> option may be used to bypass this + check if speed is more of a concern. + }, + bKGD => { + Name => 'BackgroundColor', + ValueConv => 'join(" ",unpack(length($val) < 2 ? "C" : "n*", $val))', + }, + cHRM => { + Name => 'PrimaryChromaticities', + SubDirectory => { TagTable => 'Image::ExifTool::PNG::PrimaryChromaticities' }, + }, + dSIG => { + Name => 'DigitalSignature', + Binary => 1, + }, + fRAc => { + Name => 'FractalParameters', + Binary => 1, + }, + gAMA => { + Name => 'Gamma', + Writable => 1, + Protected => 1, + Notes => q{ + ExifTool reports the gamma for decoding the image, which is consistent with + the EXIF convention, but is the inverse of the stored encoding gamma + }, + ValueConv => 'my $a=unpack("N",$val);$a ? int(1e9/$a+0.5)/1e4 : $val', + ValueConvInv => 'pack("N", int(1e5/$val+0.5))', + }, + gIFg => { + Name => 'GIFGraphicControlExtension', + Binary => 1, + }, + gIFt => { + Name => 'GIFPlainTextExtension', + Binary => 1, + }, + gIFx => { + Name => 'GIFApplicationExtension', + Binary => 1, + }, + hIST => { + Name => 'PaletteHistogram', + Binary => 1, + }, + iCCP => { + Name => 'ICC_Profile', + Notes => q{ + this is where ExifTool will write a new ICC_Profile. When creating a new + ICC_Profile, the SRGBRendering tag should be deleted if it exists + }, + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + ProcessProc => \&ProcessPNG_Compressed, + }, + }, + 'iCCP-name' => { + Name => 'ProfileName', + Writable => 1, + FakeTag => 1, # (not a real PNG tag, so don't try to write it) + Notes => q{ + not a real tag ID, this tag represents the iCCP profile name, and may only + be written when the ICC_Profile is written + }, + }, +# IDAT +# IEND + IHDR => { + Name => 'ImageHeader', + SubDirectory => { TagTable => 'Image::ExifTool::PNG::ImageHeader' }, + }, + iTXt => { + Name => 'InternationalText', + SubDirectory => { + TagTable => 'Image::ExifTool::PNG::TextualData', + ProcessProc => \&ProcessPNG_iTXt, + }, + }, + oFFs => { + Name => 'ImageOffset', + ValueConv => q{ + my @a = unpack("NNC",$val); + $a[2] = ($a[2] ? "microns" : "pixels"); + return "$a[0], $a[1] ($a[2])"; + }, + }, + pCAL => { + Name => 'PixelCalibration', + Binary => 1, + }, + pHYs => { + Name => 'PhysicalPixel', + SubDirectory => { + TagTable => 'Image::ExifTool::PNG::PhysicalPixel', + DirName => 'PNG-pHYs', # (needed for writing) + }, + }, + PLTE => { + Name => 'Palette', + ValueConv => 'length($val) <= 3 ? join(" ",unpack("C*",$val)) : \$val', + }, + sBIT => { + Name => 'SignificantBits', + ValueConv => 'join(" ",unpack("C*",$val))', + }, + sCAL => { # png 1.4.0 + Name => 'SubjectScale', + SubDirectory => { TagTable => 'Image::ExifTool::PNG::SubjectScale' }, + }, + sPLT => { + Name => 'SuggestedPalette', + Binary => 1, + PrintConv => 'split("\0",$$val,1)', # extract palette name + }, + sRGB => { + Name => 'SRGBRendering', + Writable => 1, + Protected => 1, + Notes => 'this chunk should not be present if an iCCP chunk exists', + ValueConv => 'unpack("C",$val)', + ValueConvInv => 'pack("C",$val)', + PrintConv => { + 0 => 'Perceptual', + 1 => 'Relative Colorimetric', + 2 => 'Saturation', + 3 => 'Absolute Colorimetric', + }, + }, + sTER => { # png 1.4.0 + Name => 'StereoImage', + SubDirectory => { TagTable => 'Image::ExifTool::PNG::StereoImage' }, + }, + tEXt => { + Name => 'TextualData', + SubDirectory => { TagTable => 'Image::ExifTool::PNG::TextualData' }, + }, + tIME => { + Name => 'ModifyDate', + Groups => { 2 => 'Time' }, + Writable => 1, + Shift => 'Time', + ValueConv => 'sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d", unpack("nC5", $val))', + ValueConvInv => q{ + my @a = ($val=~/^(\d+):(\d+):(\d+)\s+(\d+):(\d+):(\d+)/); + @a == 6 or warn('Invalid date'), return undef; + return pack('nC5', @a); + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + tRNS => { + Name => 'Transparency', + # may have as many entries as the PLTE table, but who wants to see all that? + ValueConv => q{ + return \$val if length($val) > 6; + join(" ",unpack($Image::ExifTool::PNG::colorType == 3 ? "C*" : "n*", $val)); + }, + }, + tXMP => { + Name => 'XMP', + Notes => 'obsolete location specified by a September 2001 XMP draft', + NonStandard => 'XMP', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, + vpAg => { # private imagemagick chunk + Name => 'VirtualPage', + SubDirectory => { TagTable => 'Image::ExifTool::PNG::VirtualPage' }, + }, + zTXt => { + Name => 'CompressedText', + SubDirectory => { + TagTable => 'Image::ExifTool::PNG::TextualData', + ProcessProc => \&ProcessPNG_Compressed, + }, + }, + # animated PNG (ref https://wiki.mozilla.org/APNG_Specification) + acTL => { + Name => 'AnimationControl', + SubDirectory => { + TagTable => 'Image::ExifTool::PNG::AnimationControl', + }, + }, + # eXIf (ref 6) + $stdCase{exif} => { + Name => $stdCase{exif}, + Notes => 'this is where ExifTool will create new EXIF', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + DirName => 'EXIF', # (to write as a block) + ProcessProc => \&ProcessPNG_eXIf, + }, + }, + # zXIf + $stdCase{zxif} => { + Name => $stdCase{zxif}, + Notes => 'a once-proposed chunk for compressed EXIF', + NonStandard => 'EXIF', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + DirName => 'EXIF', # (to write as a block) + ProcessProc => \&ProcessPNG_eXIf, + }, + }, + # fcTL - animation frame control for each frame + # fdAT - animation data for each frame + iDOT => { # (ref NealKrawetz) + Name => 'AppleDataOffsets', + Binary => 1, + # Apple offsets into data relative to start of iDOT chunk: + # int32u Divisor [only ever seen 2] + # int32u Unknown [always 0] + # int32u TotalDividedHeight [image height from IDHR/Divisor] + # int32u Size [always 40 / 0x28; size of this chunk] + # int32u DividedHeight1 + # int32u DividedHeight2 + # int32u IDAT_Offset2 [location of IDAT with start of DividedHeight2 segment] + }, +); + +# PNG IHDR chunk +%Image::ExifTool::PNG::ImageHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'ImageWidth', + Format => 'int32u', + }, + 4 => { + Name => 'ImageHeight', + Format => 'int32u', + }, + 8 => 'BitDepth', + 9 => { + Name => 'ColorType', + RawConv => '$Image::ExifTool::PNG::colorType = $val', + PrintConv => { + 0 => 'Grayscale', + 2 => 'RGB', + 3 => 'Palette', + 4 => 'Grayscale with Alpha', + 6 => 'RGB with Alpha', + }, + }, + 10 => { + Name => 'Compression', + PrintConv => { 0 => 'Deflate/Inflate' }, + }, + 11 => { + Name => 'Filter', + PrintConv => { 0 => 'Adaptive' }, + }, + 12 => { + Name => 'Interlace', + PrintConv => { 0 => 'Noninterlaced', 1 => 'Adam7 Interlace' }, + }, +); + +# PNG cHRM chunk +%Image::ExifTool::PNG::PrimaryChromaticities = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + FORMAT => 'int32u', + 0 => { Name => 'WhitePointX', ValueConv => '$val / 100000' }, + 1 => { Name => 'WhitePointY', ValueConv => '$val / 100000' }, + 2 => { Name => 'RedX', ValueConv => '$val / 100000' }, + 3 => { Name => 'RedY', ValueConv => '$val / 100000' }, + 4 => { Name => 'GreenX', ValueConv => '$val / 100000' }, + 5 => { Name => 'GreenY', ValueConv => '$val / 100000' }, + 6 => { Name => 'BlueX', ValueConv => '$val / 100000' }, + 7 => { Name => 'BlueY', ValueConv => '$val / 100000' }, +); + +# PNG pHYs chunk +%Image::ExifTool::PNG::PhysicalPixel = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + WRITABLE => 1, + GROUPS => { 1 => 'PNG-pHYs', 2 => 'Image' }, + WRITE_GROUP => 'PNG-pHYs', + NOTES => q{ + These tags are found in the PNG pHYs chunk and belong to the PNG-pHYs family + 1 group. They are all created together with default values if necessary + when any of these tags is written, and may only be deleted as a group. + }, + 0 => { + Name => 'PixelsPerUnitX', + Format => 'int32u', + Notes => 'default 2834', + }, + 4 => { + Name => 'PixelsPerUnitY', + Format => 'int32u', + Notes => 'default 2834', + }, + 8 => { + Name => 'PixelUnits', + PrintConv => { 0 => 'Unknown', 1 => 'meters' }, + Notes => 'default meters', + }, +); + +# PNG sCAL chunk +%Image::ExifTool::PNG::SubjectScale = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'SubjectUnits', + PrintConv => { 1 => 'meters', 2 => 'radians' }, + }, + 1 => { + Name => 'SubjectPixelWidth', + Format => 'var_string', + }, + 2 => { + Name => 'SubjectPixelHeight', + Format => 'var_string', + }, +); + +# PNG vpAg chunk +%Image::ExifTool::PNG::VirtualPage = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + FORMAT => 'int32u', + 0 => 'VirtualImageWidth', + 1 => 'VirtualImageHeight', + 2 => { + Name => 'VirtualPageUnits', + Format => 'int8u', + # what is the conversion for this? + }, +); + +# PNG sTER chunk +%Image::ExifTool::PNG::StereoImage = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'StereoMode', + PrintConv => { + 0 => 'Cross-fuse Layout', + 1 => 'Diverging-fuse Layout', + }, + }, +); + +my %unreg = ( Notes => 'unregistered' ); + +# Tags for PNG tEXt zTXt and iTXt chunks +# (NOTE: ValueConv is set dynamically, so don't set it here!) +%Image::ExifTool::PNG::TextualData = ( + PROCESS_PROC => \&ProcessPNG_tEXt, + WRITE_PROC => \&Image::ExifTool::DummyWriteProc, + WRITABLE => 'string', + PREFERRED => 1, # always add these tags when writing + GROUPS => { 2 => 'Image' }, + LANG_INFO => \&GetLangInfo, + NOTES => q{ + The PNG TextualData format allows arbitrary tag names to be used. The tags + listed below are the only ones that can be written (unless new user-defined + tags are added via the configuration file), however ExifTool will extract + any other TextualData tags that are found. All TextualData tags (including + tags not listed below) are removed when deleting all PNG tags. + + These tags may be stored as tEXt, zTXt or iTXt chunks in the PNG image. By + default ExifTool writes new string-value tags as as uncompressed tEXt, or + compressed zTXt if the L<Compress|../ExifTool.html#Compress> (-z) option is used and Compress::Zlib is + available. Alternate language tags and values containing special characters + (unless the Latin character set is used) are written as iTXt, and compressed + if the L<Compress|../ExifTool.html#Compress> option is used and Compress::Zlib is available. Raw profile + information is always created as compressed zTXt if Compress::Zlib is + available, or tEXt otherwise. Standard XMP is written as uncompressed iTXt. + User-defined tags may set an 'iTXt' flag in the tag definition to be written + only as iTXt. + + Alternate languages are accessed by suffixing the tag name with a '-', + followed by an RFC 3066 language code (eg. "PNG:Comment-fr", or + "Title-en-US"). See L<http://www.ietf.org/rfc/rfc3066.txt> for the RFC 3066 + specification. + + Some of the tags below are not registered as part of the PNG specification, + but are included here because they are generated by other software such as + ImageMagick. + }, + Title => { }, + Author => { Groups => { 2 => 'Author' } }, + Description => { }, + Copyright => { Groups => { 2 => 'Author' } }, + 'Creation Time' => { + Name => 'CreationTime', + Groups => { 2 => 'Time' }, + Shift => 'Time', + Notes => 'stored in RFC-1123 format and converted to/from EXIF format by ExifTool', + RawConv => \&ConvertPNGDate, + ValueConvInv => \&InversePNGDate, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', + }, + Software => { }, + Disclaimer => { }, + # change name to differentiate from ExifTool Warning + Warning => { Name => 'PNGWarning', }, + Source => { }, + Comment => { }, + Collection => { }, # (PNG extensions, 2004) +# +# The following tags are not part of the original PNG specification, +# but are written by ImageMagick and other software +# + Artist => { %unreg, Groups => { 2 => 'Author' } }, + Document => { %unreg }, + Label => { %unreg }, + Make => { %unreg, Groups => { 2 => 'Camera' } }, + Model => { %unreg, Groups => { 2 => 'Camera' } }, + 'create-date'=> { + Name => 'CreateDate', + Groups => { 2 => 'Time' }, + Shift => 'Time', + %unreg, + ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)', + ValueConvInv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::FormatXMPDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', + }, + 'modify-date'=> { + Name => 'ModDate', # (to distinguish from tIME chunk "ModifyDate") + Groups => { 2 => 'Time' }, + Shift => 'Time', + %unreg, + ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)', + ValueConvInv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::FormatXMPDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', + }, + TimeStamp => { %unreg, Groups => { 2 => 'Time' }, Shift => 'Time' }, + URL => { %unreg }, + 'XML:com.adobe.xmp' => { + Name => 'XMP', + Notes => q{ + unregistered, but this is the location according to the June 2002 or later + XMP specification, and is where ExifTool will add a new XMP chunk if the + image didn't already contain XMP + }, + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, + 'Raw profile type APP1' => [ + { + # EXIF table must come first because we key on this in ProcessProfile() + # (No condition because this is just for BuildTagLookup) + Name => 'APP1_Profile', + %unreg, + NonStandard => 'EXIF', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&ProcessProfile, + }, + }, + { + Name => 'APP1_Profile', + NonStandard => 'XMP', + SubDirectory => { + TagTable => 'Image::ExifTool::XMP::Main', + ProcessProc => \&ProcessProfile, + }, + }, + ], + 'Raw profile type exif' => { + Name => 'EXIF_Profile', + %unreg, + NonStandard => 'EXIF', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&ProcessProfile, + }, + }, + 'Raw profile type icc' => { + Name => 'ICC_Profile', + %unreg, + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + ProcessProc => \&ProcessProfile, + }, + }, + 'Raw profile type icm' => { + Name => 'ICC_Profile', + %unreg, + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + ProcessProc => \&ProcessProfile, + }, + }, + 'Raw profile type iptc' => { + Name => 'IPTC_Profile', + Notes => q{ + unregistered. May be either IPTC IIM or Photoshop IRB format. This is + where ExifTool will add new IPTC, inside a Photoshop IRB container + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Photoshop::Main', + ProcessProc => \&ProcessProfile, + }, + }, + 'Raw profile type xmp' => { + Name => 'XMP_Profile', + %unreg, + NonStandard => 'XMP', + SubDirectory => { + TagTable => 'Image::ExifTool::XMP::Main', + ProcessProc => \&ProcessProfile, + }, + }, + 'Raw profile type 8bim' => { + Name => 'Photoshop_Profile', + %unreg, + SubDirectory => { + TagTable => 'Image::ExifTool::Photoshop::Main', + ProcessProc => \&ProcessProfile, + }, + }, +); + +# Animation control +%Image::ExifTool::PNG::AnimationControl = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + FORMAT => 'int32u', + NOTES => q{ + Tags found in the Animation Control chunk. See + L<https://wiki.mozilla.org/APNG_Specification> for details. + }, + 0 => { + Name => 'AnimationFrames', + RawConv => '$self->OverrideFileType("APNG", undef, "PNG"); $val', + }, + 1 => { + Name => 'AnimationPlays', + PrintConv => '$val || "inf"', + }, +); + +#------------------------------------------------------------------------------ +# AutoLoad our writer routines when necessary +# +sub AUTOLOAD +{ + return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_); +} + +#------------------------------------------------------------------------------ +# Get standard case for language code (this routine copied from XMP.pm) +# Inputs: 0) Language code +# Returns: Language code in standard case +sub StandardLangCase($) +{ + my $lang = shift; + # make 2nd subtag uppercase only if it is 2 letters + return lc($1) . uc($2) . lc($3) if $lang =~ /^([a-z]{2,3}|[xi])(-[a-z]{2})\b(.*)/i; + return lc($lang); +} + +#------------------------------------------------------------------------------ +# Convert date from PNG to EXIF format +# Inputs: 0) Date/time in PNG format, 1) ExifTool ref +# Returns: EXIF formatted date/time string +my %monthNum = ( + Jan=>1, Feb=>2, Mar=>3, Apr=>4, May=>5, Jun=>6, + Jul=>7, Aug=>8, Sep=>9, Oct=>10,Nov=>11,Dec=>12 +); +my %tzConv = ( + UT => '+00:00', GMT => '+00:00', UTC => '+00:00', # (UTC not in spec -- PH addition) + EST => '-05:00', EDT => '-04:00', + CST => '-06:00', CDT => '-05:00', + MST => '-07:00', MDT => '-06:00', + PST => '-08:00', PDT => '-07:00', + A => '-01:00', N => '+01:00', + B => '-02:00', O => '+02:00', + C => '-03:00', P => '+03:00', + D => '-04:00', Q => '+04:00', + E => '-05:00', R => '+05:00', + F => '-06:00', S => '+06:00', + G => '-07:00', T => '+07:00', + H => '-08:00', U => '+08:00', + I => '-09:00', V => '+09:00', + K => '-10:00', W => '+10:00', + L => '-11:00', X => '+11:00', + M => '-12:00', Y => '+12:00', + Z => '+00:00', +); +sub ConvertPNGDate($$) +{ + my ($val, $et) = @_; + # standard format is like "Mon, 1 Jan 2018 12:10:22 EST" (RFC-1123 section 5.2.14) + while ($val =~ /(\d+)\s*(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s*(\d+)\s+(\d+):(\d{2})(:\d{2})?\s*(\S*)/i) { + my ($day,$mon,$yr,$hr,$min,$sec,$tz) = ($1,$2,$3,$4,$5,$6,$7); + $yr += $yr > 70 ? 1900 : 2000 if $yr < 100; # boost year to 4 digits if necessary + $mon = $monthNum{ucfirst lc $mon} or return $val; + if (not $tz) { + $tz = ''; + } elsif ($tzConv{uc $tz}) { + $tz = $tzConv{uc $tz}; + } elsif ($tz =~ /^([-+]\d+):?(\d{2})/) { + $tz = $1 . ':' . $2; + } else { + last; # (non-standard date) + } + return sprintf("%.4d:%.2d:%.2d %.2d:%.2d%s%s",$yr,$mon,$day,$hr,$min,$sec||':00',$tz); + } + if (($et->Options('StrictDate') and not $$et{TAGS_FROM_FILE}) or $et->Options('Validate')) { + $et->Warn('Non standard PNG date/time format', 1); + } + return $val; +} + +#------------------------------------------------------------------------------ +# Convert EXIF date/time to PNG format +# Inputs: 0) Date/time in EXIF format, 1) ExifTool ref +# Returns: PNG formatted date/time string +sub InversePNGDate($$) +{ + my ($val, $et) = @_; + if ($et->Options('StrictDate')) { + my $err; + if ($val =~ /^(\d{4}):(\d{2}):(\d{2}) (\d{2})(:\d{2})(:\d{2})?(?:\.\d*)?\s*(\S*)/) { + my ($yr,$mon,$day,$hr,$min,$sec,$tz) = ($1,$2,$3,$4,$5,$6,$7); + $sec or $sec = ''; + my %monName = map { $monthNum{$_} => $_ } keys %monthNum; + $mon = $monName{$mon + 0} or $err = 1; + if (length $tz) { + $tz =~ /^(Z|[-+]\d{2}:?\d{2})/ or $err = 1; + $tz =~ tr/://d; + $tz = ' ' . $tz; + } + $val = "$day $mon $yr $hr$min$sec$tz" unless $err; + } + if ($err) { + warn "Invalid date/time (use YYYY:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z])\n"; + undef $val; + } + } + return $val; +} + +#------------------------------------------------------------------------------ +# Get localized version of tagInfo hash +# Inputs: 0) tagInfo hash ref, 1) language code (eg. "x-default") +# Returns: new tagInfo hash ref, or undef if invalid +sub GetLangInfo($$) +{ + my ($tagInfo, $lang) = @_; + $lang =~ tr/_/-/; # RFC 3066 specifies '-' as a separator + # no alternate languages for XMP or raw profile directories + return undef if $$tagInfo{SubDirectory}; + # language code must normalized for use in tag ID + return Image::ExifTool::GetLangInfo($tagInfo, StandardLangCase($lang)); +} + +#------------------------------------------------------------------------------ +# Found a PNG tag -- extract info from subdirectory or decompress data if necessary +# Inputs: 0) ExifTool object reference, 1) Pointer to tag table, +# 2) Tag ID, 3) Tag value, 4) [optional] compressed data flag: +# 0=not compressed, 1=unknown compression, 2-N=compression with type N-2 +# 5) optional output buffer ref, 6) character encoding (tEXt/zTXt/iTXt only) +# 6) optional language code +# Returns: 1 on success +sub FoundPNG($$$$;$$$$) +{ + my ($et, $tagTablePtr, $tag, $val, $compressed, $outBuff, $enc, $lang) = @_; + return 0 unless defined $val; + my $verbose = $et->Options('Verbose'); + my $id = $tag; # generate tag ID which includes language code + if ($lang) { + # case of language code must be normalized since they are case insensitive + $lang = StandardLangCase($lang); + $id .= '-' . $lang; + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $id) || + # (some software forgets to capitalize first letter) + $et->GetTagInfo($tagTablePtr, ucfirst($id)); + # create alternate language tag if necessary + if (not $tagInfo and $lang) { + $tagInfo = $et->GetTagInfo($tagTablePtr, $tag) || + $et->GetTagInfo($tagTablePtr, ucfirst($tag)); + $tagInfo = GetLangInfo($tagInfo, $lang) if $tagInfo; + } +# +# uncompress data if necessary +# + my ($wasCompressed, $deflateErr); + if ($compressed and $compressed > 1) { + if ($compressed == 2) { # Inflate/Deflate compression + if (eval { require Compress::Zlib }) { + my ($v2, $stat); + my $inflate = Compress::Zlib::inflateInit(); + $inflate and ($v2, $stat) = $inflate->inflate($val); + if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) { + $val = $v2; + $compressed = 0; + $wasCompressed = 1; + } else { + $deflateErr = "Error inflating $tag"; + } + } elsif (not $noCompressLib) { + $deflateErr = "Install Compress::Zlib to read compressed information"; + } else { + $deflateErr = ''; # flag deflate error but no warning + } + } else { + $compressed -= 2; + $deflateErr = "Unknown compression method $compressed for $tag"; + } + if ($compressed and $verbose and $tagInfo and $$tagInfo{SubDirectory}) { + $et->VerboseDir("Unable to decompress $$tagInfo{Name}", 0, length($val)); + } + # issue warning if relevant + if ($deflateErr and not $outBuff) { + $et->Warn($deflateErr); + $noCompressLib = 1 if $deflateErr =~ /^Install/; + } + } + # translate character encoding if necessary (tEXt/zTXt/iTXt string values only) + if ($enc and not $compressed and not ($tagInfo and $$tagInfo{SubDirectory})) { + $val = $et->Decode($val, $enc); + } +# +# extract information from subdirectory if available +# + if ($tagInfo) { + my $tagName = $$tagInfo{Name}; + my $processed; + if ($$tagInfo{SubDirectory}) { + if ($$et{OPTIONS}{Validate} and $$tagInfo{NonStandard}) { + $et->WarnOnce("Non-standard $$tagInfo{NonStandard} in PNG $tag chunk", 1); + } + my $subdir = $$tagInfo{SubDirectory}; + my $dirName = $$subdir{DirName} || $tagName; + if (not $compressed) { + my $len = length $val; + if ($verbose and $$et{INDENT} ne ' ') { + if ($wasCompressed and $verbose > 2) { + my $name = $tagName; + $wasCompressed and $name = "Decompressed $name"; + $et->VerboseDir($name, 0, $len); + $et->VerboseDump(\$val); + } + # don't indent next directory (since it is really the same data) + $$et{INDENT} =~ s/..$//; + } + my $processProc = $$subdir{ProcessProc}; + # nothing more to do if writing and subdirectory is not writable + my $subTable = GetTagTable($$subdir{TagTable}); + return 1 if $outBuff and not $$subTable{WRITE_PROC}; + my $dirName = $$subdir{DirName} || $tagName; + my %subdirInfo = ( + DataPt => \$val, + DirStart => 0, + DataLen => $len, + DirLen => $len, + DirName => $dirName, + TagInfo => $tagInfo, + ReadOnly => 1, # (used only by WriteXMP) + OutBuff => $outBuff, + ); + # no need to re-decompress if already done + undef $processProc if $wasCompressed and $processProc and $processProc eq \&ProcessPNG_Compressed; + # rewrite this directory if necessary (but always process TextualData normally) + if ($outBuff and not $processProc and $subTable ne \%Image::ExifTool::PNG::TextualData) { + return 1 unless $$et{EDIT_DIRS}{$dirName}; + $$outBuff = $et->WriteDirectory(\%subdirInfo, $subTable); + if ($tagName eq 'XMP' and $$outBuff) { + # make sure the XMP is marked as read-only + Image::ExifTool::XMP::ValidateXMP($outBuff,'r'); + } + DoneDir($et, $dirName, $outBuff, $$tagInfo{NonStandard}); + } else { + $processed = $et->ProcessDirectory(\%subdirInfo, $subTable, $processProc); + } + $compressed = 1; # pretend this is compressed since it is binary data + } elsif ($outBuff) { + if ($$et{DEL_GROUP}{$dirName} or ($dirName eq 'EXIF' and $$et{DEL_GROUP}{IFD0})) { + $$outBuff = ''; + ++$$et{CHANGED}; + $et->VPrint(0, " Deleting $tag chunk"); + } else { + if ($$et{EDIT_DIRS}{$dirName} or ($dirName eq 'EXIF' and $$et{EDIT_DIRS}{IFD0})) { + $et->Warn("Can't write $dirName. Requires Compress::Zlib"); + } + # pretend we did this directory so we don't try to recreate it + DoneDir($et, $dirName, $outBuff, $$tagInfo{NonStandard}); + } + } + } + if ($outBuff) { + my $writable = $$tagInfo{Writable}; + my $isOverwriting; + if ($writable or ($$tagTablePtr{WRITABLE} and + not defined $writable and not $$tagInfo{SubDirectory})) + { + # write new value for this tag if necessary + my $newVal; + if ($$et{DEL_GROUP}{PNG}){ + # remove this tag now, but keep in ADD_PNG list to add back later + $isOverwriting = 1; + } else { + # remove this from the list of PNG tags to add + delete $$et{ADD_PNG}{$id}; + # (also handle case of tEXt tags written with lowercase first letter) + delete $$et{ADD_PNG}{ucfirst($id)}; + my $nvHash = $et->GetNewValueHash($tagInfo); + $isOverwriting = $et->IsOverwriting($nvHash); + if (defined $deflateErr) { + $newVal = $et->GetNewValue($nvHash); + # can only write tag now if always overwriting + if ($isOverwriting > 0) { + $val = '<deflate error>'; + } elsif ($isOverwriting) { + $isOverwriting = 0; # can't overwrite + $et->Warn($deflateErr) if $deflateErr; + } + } else { + if ($isOverwriting < 0) { + $isOverwriting = $et->IsOverwriting($nvHash, $val); + } + # (must get new value after IsOverwriting() in case it was shifted) + $newVal = $et->GetNewValue($nvHash); + } + } + if ($isOverwriting) { + $$outBuff = (defined $newVal) ? $newVal : ''; + ++$$et{CHANGED}; + $et->VerboseValue("- PNG:$tagName", $val); + $et->VerboseValue("+ PNG:$tagName", $newVal) if defined $newVal; + } + } + if (defined $$outBuff and length $$outBuff) { + if ($enc) { # must be tEXt/zTXt/iTXt if $enc is set + $$outBuff = BuildTextChunk($et, $tag, $tagInfo, $$outBuff, $lang); + } elsif ($wasCompressed) { + # re-compress the output data + my $len = length $$outBuff; + my $deflate = Compress::Zlib::deflateInit(); + if ($deflate) { + $$outBuff = $deflate->deflate($$outBuff); + $$outBuff .= $deflate->flush() if defined $$outBuff; + } else { + undef $$outBuff; + } + if (not $$outBuff) { + $et->Warn("PNG:$tagName not written (compress error)"); + } elsif (lc $tag eq 'zxif') { + $$outBuff = "\0" . pack('N',$len) . $$outBuff; # add zXIf header + } + } + } + return 1; + } + return 1 if $processed; + } elsif ($outBuff) { + if ($$et{DEL_GROUP}{PNG} and $tagTablePtr eq \%Image::ExifTool::PNG::TextualData) { + # delete all TextualData tags if deleting the PNG group + $$outBuff = ''; + ++$$et{CHANGED}; + $et->VerboseValue("- PNG:$tag", $val); + } + return 1; + } else { + my $name; + ($name = $tag) =~ s/\s+(.)/\u$1/g; # remove white space from tag name + $tagInfo = { Name => $name }; + $$tagInfo{LangCode} = $lang if $lang; + # make unknown profiles binary data type + $$tagInfo{Binary} = 1 if $tag =~ /^Raw profile type /; + $verbose and $et->VPrint(0, " [adding $tag]\n"); + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } +# +# store this tag information +# + if ($verbose) { + # temporarily remove subdirectory so it isn't printed in verbose information + # since we aren't decoding it anyway; + my $subdir = $$tagInfo{SubDirectory}; + delete $$tagInfo{SubDirectory}; + $et->VerboseInfo($tag, $tagInfo, + Table => $tagTablePtr, + DataPt => \$val, + ); + $$tagInfo{SubDirectory} = $subdir if $subdir; + } + # set the RawConv dynamically depending on whether this is binary or not + my $delRawConv; + if ($compressed and not defined $$tagInfo{ValueConv}) { + $$tagInfo{RawConv} = '\$val'; + $delRawConv = 1; + } + $et->FoundTag($tagInfo, $val); + delete $$tagInfo{RawConv} if $delRawConv; + return 1; +} + +#------------------------------------------------------------------------------ +# Process encoded PNG profile information +# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table +# Returns: 1 on success +sub ProcessProfile($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $tagInfo = $$dirInfo{TagInfo}; + my $outBuff = $$dirInfo{OutBuff}; + my $tagName = $$tagInfo{Name}; + + # ImageMagick 5.3.6 writes profiles with the following headers: + # "\nICC Profile\n", "\nIPTC profile\n", "\n\xaa\x01{generic prof\n" + # and "\ngeneric profile\n" + return 0 unless $$dataPt =~ /^\n(.*?)\n\s*(\d+)\n(.*)/s; + my ($profileType, $len) = ($1, $2); + # data is encoded in hex, so change back to binary + my $buff = pack('H*', join('',split(' ',$3))); + my $actualLen = length $buff; + if ($len ne $actualLen) { + $et->Warn("$tagName is wrong size (should be $len bytes but is $actualLen)"); + $len = $actualLen; + } + my $verbose = $et->Options('Verbose'); + if ($verbose) { + if ($verbose > 2) { + $et->VerboseDir("Decoded $tagName", 0, $len); + $et->VerboseDump(\$buff); + } + # don't indent next directory (since it is really the same data) + $$et{INDENT} =~ s/..$//; + } + my %dirInfo = ( + Parent => 'PNG', + DataPt => \$buff, + DataLen => $len, + DirStart => 0, + DirLen => $len, + Base => 0, + OutFile => $outBuff, + ); + $$et{PROCESSED} = { }; # reset processed directory offsets + my $processed = 0; + my $oldChanged = $$et{CHANGED}; + my $exifTable = GetTagTable('Image::ExifTool::Exif::Main'); + my $editDirs = $$et{EDIT_DIRS}; + + if ($tagTablePtr ne $exifTable) { + # this is unfortunate, but the "IPTC" profile may be stored as either + # IPTC IIM or a Photoshop IRB resource, so we must test for this + if ($tagName eq 'IPTC_Profile' and $buff =~ /^\x1c/) { + $tagTablePtr = GetTagTable('Image::ExifTool::IPTC::Main'); + } + # process non-EXIF and non-APP1 profile as-is + if ($outBuff) { + # no need to rewrite this if not editing tags in this directory + my $dir = $tagName; + $dir =~ s/_Profile// unless $dir =~ /^ICC/; + return 1 unless $$editDirs{$dir}; + $$outBuff = $et->WriteDirectory(\%dirInfo, $tagTablePtr); + DoneDir($et, $dir, $outBuff, $$tagInfo{NonStandard}); + } else { + $processed = $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + } elsif ($buff =~ /^$Image::ExifTool::exifAPP1hdr/) { + # APP1 EXIF information + return 1 if $outBuff and not $$editDirs{IFD0}; + my $hdrLen = length($Image::ExifTool::exifAPP1hdr); + $dirInfo{DirStart} += $hdrLen; + $dirInfo{DirLen} -= $hdrLen; + if ($outBuff) { + # delete non-standard EXIF if recreating from scratch + if ($$et{DEL_GROUP}{EXIF} or $$et{DEL_GROUP}{IFD0}) { + $$outBuff = ''; + $et->VPrint(0, ' Deleting non-standard APP1 EXIF information'); + return 1; + } + $$outBuff = $et->WriteDirectory(\%dirInfo, $tagTablePtr, + \&Image::ExifTool::WriteTIFF); + $$outBuff = $Image::ExifTool::exifAPP1hdr . $$outBuff if $$outBuff; + DoneDir($et, 'IFD0', $outBuff, $$tagInfo{NonStandard}); + } else { + $processed = $et->ProcessTIFF(\%dirInfo); + } + } elsif ($buff =~ /^$Image::ExifTool::xmpAPP1hdr/) { + # APP1 XMP information + my $hdrLen = length($Image::ExifTool::xmpAPP1hdr); + my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main'); + $dirInfo{DirStart} += $hdrLen; + $dirInfo{DirLen} -= $hdrLen; + if ($outBuff) { + return 1 unless $$editDirs{XMP}; + $$outBuff = $et->WriteDirectory(\%dirInfo, $tagTablePtr); + $$outBuff and $$outBuff = $Image::ExifTool::xmpAPP1hdr . $$outBuff; + DoneDir($et, 'XMP', $outBuff, $$tagInfo{NonStandard}); + } else { + $processed = $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + } elsif ($buff =~ /^(MM\0\x2a|II\x2a\0)/) { + # TIFF information + return 1 if $outBuff and not $$editDirs{IFD0}; + if ($outBuff) { + # delete non-standard EXIF if recreating from scratch + if ($$et{DEL_GROUP}{EXIF} or $$et{DEL_GROUP}{IFD0}) { + $$outBuff = ''; + $et->VPrint(0, ' Deleting non-standard EXIF/TIFF information'); + return 1; + } + $$outBuff = $et->WriteDirectory(\%dirInfo, $tagTablePtr, + \&Image::ExifTool::WriteTIFF); + DoneDir($et, 'IFD0', $outBuff, $$tagInfo{NonStandard}); + } else { + $processed = $et->ProcessTIFF(\%dirInfo); + } + } else { + my $profName = $profileType; + $profName =~ tr/\x00-\x1f\x7f-\xff/./; + $et->Warn("Unknown raw profile '${profName}'"); + } + if ($outBuff and defined $$outBuff and length $$outBuff) { + if ($$et{CHANGED} != $oldChanged) { + my $hdr = sprintf("\n%s\n%8d\n", $profileType, length($$outBuff)); + # hex encode the data + $$outBuff = $hdr . HexEncode($outBuff); + } else { + undef $$outBuff; + } + } + return $processed; +} + +#------------------------------------------------------------------------------ +# Process PNG compressed zTXt or iCCP chunk +# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table +# Returns: 1 on success +# Notes: writes new chunk data to ${$$dirInfo{OutBuff}} if writing tag +sub ProcessPNG_Compressed($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my ($tag, $val) = split /\0/, ${$$dirInfo{DataPt}}, 2; + return 0 unless defined $val; + # set compressed to 2 + compression method to decompress the data + my $compressed = 2 + unpack('C', $val); + my $hdr = $tag . "\0" . substr($val, 0, 1); + $val = substr($val, 1); # remove compression method byte + my $success; + my $outBuff = $$dirInfo{OutBuff}; + my $tagInfo = $$dirInfo{TagInfo}; + # use the PNG chunk tag instead of the embedded tag name for iCCP chunks + if ($tagInfo and $$tagInfo{Name} eq 'ICC_Profile') { + $et->VerboseDir('iCCP'); + $tagTablePtr = \%Image::ExifTool::PNG::Main; + FoundPNG($et, $tagTablePtr, 'iCCP-name', $tag) if length($tag) and not $outBuff; + $success = FoundPNG($et, $tagTablePtr, 'iCCP', $val, $compressed, $outBuff); + if ($outBuff and $$outBuff) { + my $profileName = $et->GetNewValue($Image::ExifTool::PNG::Main{'iCCP-name'}); + if (defined $profileName) { + $hdr = $profileName . substr($hdr, length $tag); + $et->VerboseValue("+ PNG:ProfileName", $profileName); + } + $$outBuff = $hdr . $$outBuff; + } + } else { + $success = FoundPNG($et, $tagTablePtr, $tag, $val, $compressed, $outBuff, 'Latin'); + } + return $success; +} + +#------------------------------------------------------------------------------ +# Process PNG tEXt chunk +# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table +# Returns: 1 on success +# Notes: writes new chunk data to ${$$dirInfo{OutBuff}} if writing tag +sub ProcessPNG_tEXt($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my ($tag, $val) = split /\0/, ${$$dirInfo{DataPt}}, 2; + my $outBuff = $$dirInfo{OutBuff}; + $$et{INDENT} = substr($$et{INDENT}, 0, -2) if $$et{OPTIONS}{Verbose}; + return FoundPNG($et, $tagTablePtr, $tag, $val, undef, $outBuff, 'Latin'); +} + +#------------------------------------------------------------------------------ +# Process PNG iTXt chunk +# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table +# Returns: 1 on success +# Notes: writes new chunk data to ${$$dirInfo{OutBuff}} if writing tag +sub ProcessPNG_iTXt($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my ($tag, $dat) = split /\0/, ${$$dirInfo{DataPt}}, 2; + return 0 unless defined $dat and length($dat) >= 4; + my ($compressed, $meth) = unpack('CC', $dat); + my ($lang, $trans, $val) = split /\0/, substr($dat, 2), 3; + # set compressed flag so we will decompress it in FoundPNG() + $compressed and $compressed = 2 + $meth; + my $outBuff = $$dirInfo{OutBuff}; + $$et{INDENT} = substr($$et{INDENT}, 0, -2) if $$et{OPTIONS}{Verbose}; + return FoundPNG($et, $tagTablePtr, $tag, $val, $compressed, $outBuff, 'UTF8', $lang); +} + +#------------------------------------------------------------------------------ +# Process PNG eXIf/zXIf chunk +# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table +# Returns: 1 on success +# Notes: writes new chunk data to ${$$dirInfo{OutBuff}} if writing tag +sub ProcessPNG_eXIf($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $outBuff = $$dirInfo{OutBuff}; + my $dataPt = $$dirInfo{DataPt}; + my $tagInfo = $$dirInfo{TagInfo}; + my $tag = $$tagInfo{TagID}; + my $del = $outBuff && ($$et{DEL_GROUP}{EXIF} or $$et{DEL_GROUP}{IFD0}); + my $type; + + if ($$dataPt =~ /^Exif\0\0/) { + $et->Warn('Improper "Exif00" header in EXIF chunk'); + $$dataPt = substr($$dataPt, 6); + $$dirInfo{DataLen} = length $$dataPt; + $$dirInfo{DirLen} -= 6 if $$dirInfo{DirLen}; + } + if ($$dataPt =~ /^(\0|II|MM)/) { + $type = $1; + } elsif ($del) { + $et->VPrint(0, " Deleting invalid $tag chunk"); + $$outBuff = ''; + ++$$et{CHANGED}; + return 1; + } else { + $et->Warn("Invalid $tag chunk"); + return 0; + } + if ($type eq "\0") { # is this compressed EXIF? + my $buf = substr($$dataPt, 5); + # go around again to uncompress the data + $tagTablePtr = GetTagTable('Image::ExifTool::PNG::Main'); + return FoundPNG($et, $tagTablePtr, $$tagInfo{TagID}, \$buf, 2, $outBuff); + } elsif (not $outBuff) { + return $et->ProcessTIFF($dirInfo); + # (zxIf was not adopted) + #} elsif ($del and ($et->Options('Compress') xor lc($tag) eq 'zxif')) { + } elsif ($del and lc($tag) eq 'zxif') { + $et->VPrint(0, " Deleting $tag chunk"); + $$outBuff = ''; + ++$$et{CHANGED}; + } elsif ($$et{EDIT_DIRS}{IFD0}) { + $$outBuff = $et->WriteDirectory($dirInfo, $tagTablePtr, + \&Image::ExifTool::WriteTIFF); + DoneDir($et, 'IFD0', $outBuff, $$tagInfo{NonStandard}); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Extract meta information from a PNG image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid PNG image, or -1 on write error +sub ProcessPNG($$) +{ + my ($et, $dirInfo) = @_; + my $outfile = $$dirInfo{OutFile}; + my $raf = $$dirInfo{RAF}; + my $datChunk = ''; + my $datCount = 0; + my $datBytes = 0; + my $fastScan = $et->Options('FastScan'); + my ($n, $sig, $err, $hbuf, $dbuf, $cbuf); + my ($wasHdr, $wasEnd, $wasDat, $doTxt, @txtOffset); + + # check to be sure this is a valid PNG/MNG/JNG image + return 0 unless $raf->Read($sig,8) == 8 and $pngLookup{$sig}; + + if ($outfile) { + delete $$et{TextChunkType}; + Write($outfile, $sig) or $err = 1 if $outfile; + # can only add tags in Main and TextualData tables + $$et{ADD_PNG} = $et->GetNewTagInfoHash( + \%Image::ExifTool::PNG::Main, + \%Image::ExifTool::PNG::TextualData); + # initialize with same directories, with PNG tags taking priority + $et->InitWriteDirs(\%pngMap,'PNG'); + } else { + # disable buffering in FastScan mode + $$raf{NoBuffer} = 1 if $fastScan; + } + my ($fileType, $hdrChunk, $endChunk) = @{$pngLookup{$sig}}; + $et->SetFileType($fileType); # set the FileType tag + SetByteOrder('MM'); # PNG files are big-endian + my $tagTablePtr = GetTagTable('Image::ExifTool::PNG::Main'); + my $mngTablePtr; + if ($fileType ne 'PNG') { + $mngTablePtr = GetTagTable('Image::ExifTool::MNG::Main'); + } + my $verbose = $et->Options('Verbose'); + my $validate = $et->Options('Validate'); + my $out = $et->Options('TextOut'); + + # scan ahead to find offsets of all text chunks after IDAT + if ($outfile) { + while ($raf->Read($hbuf,8) == 8) { + my ($len, $chunk) = unpack('Na4',$hbuf); + last if $len > 0x7fffffff; + if ($wasDat) { + last if $noLeapFrog{$chunk}; # (don't move text across these chunks) + push @txtOffset, $raf->Tell() - 8 if $isTxtChunk{$chunk}; + } elsif ($isDatChunk{$chunk}) { + $wasDat = $chunk; + } + $raf->Seek($len + 4, 1) or last; # skip chunk data + } + $raf->Seek(8,0) or $et->Error('Error seeking in file'), return -1; + undef $wasDat; + } + + # process the PNG/MNG/JNG chunks + undef $noCompressLib; + for (;;) { + if ($doTxt) { + # read text chunks that were found after IDAT so we can write them before + $raf->Seek(shift(@txtOffset), 0) or $et->Error('Seek error'), last; + # (this is the IDAT offset if @txtOffset is now empty) + undef $doTxt unless @txtOffset; + } + $n = $raf->Read($hbuf,8); # read chunk header + + if ($wasEnd) { + last unless $n; # stop now if normal end of PNG + $et->WarnOnce("Trailer data after $fileType $endChunk chunk", 1); + last if $n < 8; + $$et{SET_GROUP1} = 'Trailer'; + } elsif ($n != 8) { + $et->Warn("Truncated $fileType image") unless $wasEnd; + last; + } + my ($len, $chunk) = unpack('Na4',$hbuf); + if ($len > 0x7fffffff) { + $et->Warn("Invalid $fileType chunk size") unless $wasEnd; + last; + } + if ($verbose) { + print $out " Moving $chunk from after IDAT ($len bytes)\n" if $doTxt; + # don't dump image data chunks in verbose mode (only give count instead) + if ($datCount and $chunk ne $datChunk) { + my $s = $datCount > 1 ? 's' : ''; + print $out "$fileType $datChunk ($datCount chunk$s, total $datBytes bytes)\n"; + $datCount = $datBytes = 0; + } + } + unless ($wasHdr) { + if ($chunk eq $hdrChunk) { + $wasHdr = 1; + } elsif ($hdrChunk eq 'IHDR' and $chunk eq 'CgBI') { + $et->Warn('Non-standard PNG image (Apple iPhone format)'); + } else { + $et->WarnOnce("$fileType image did not start with $hdrChunk"); + } + } + if ($outfile and ($isDatChunk{$chunk} or $chunk eq $endChunk) and @txtOffset) { + # continue processing here after we move the text chunks from after IDAT + push @txtOffset, $raf->Tell() - 8; + $doTxt = 1; # process text chunks now + next; + } + if ($isDatChunk{$chunk}) { + if ($fastScan and $fastScan >= 2) { + $et->VPrint(0,"End processing at $chunk chunk due to FastScan=$fastScan setting"); + last; + } + $datChunk = $chunk; + $datCount++; + $datBytes += $len; + $wasDat = $chunk; + } else { + $datChunk = ''; + } + if ($outfile) { + # add text chunks (including XMP) before any data chunk end chunk + if ($datChunk or $chunk eq $endChunk) { + # write iCCP chunk now if requested because AddChunks will try + # to add it as a text profile chunk if this isn't successful + # (ie. if Compress::Zlib wasn't available) + Add_iCCP($et, $outfile); + AddChunks($et, $outfile) or $err = 1; # add all text chunks + AddChunks($et, $outfile, 'IFD0') or $err = 1; # and eXIf chunk + } elsif ($chunk eq 'PLTE') { + # iCCP chunk must come before PLTE (and IDAT, handled above) + # (ignore errors -- will add later as text profile if this fails) + Add_iCCP($et, $outfile); + } + } + if ($chunk eq $endChunk) { + # read CRC + unless ($raf->Read($cbuf,4) == 4) { + $et->Warn("Truncated $fileType $endChunk chunk") unless $wasEnd; + last; + } + $verbose and print $out "$fileType $chunk (end of image)\n"; + $wasEnd = 1; + if ($outfile) { + # write the IEND/MEND chunk with CRC + Write($outfile, $hbuf, $cbuf) or $err = 1; + if ($$et{DEL_GROUP}{Trailer}) { + if ($raf->Read($hbuf, 1)) { + $verbose and printf $out " Deleting PNG trailer\n"; + ++$$et{CHANGED}; + } + } else { + # copy over any existing trailer data + my $tot = 0; + for (;;) { + $n = $raf->Read($hbuf, 65536) or last; + $tot += $n; + Write($outfile, $hbuf) or $err = 1; + } + $tot and $verbose and printf $out " Copying PNG trailer ($tot bytes)\n"; + } + last; + } + next; + } + if ($datChunk) { + my $chunkSizeLimit = 10000000; # largest chunk to read into memory + if ($outfile) { + # avoid loading very large data chunks into memory + if ($len > $chunkSizeLimit) { + Write($outfile, $hbuf) or $err = 1; + Image::ExifTool::CopyBlock($raf, $outfile, $len+4) or $et->Error("Error copying $datChunk"); + next; + } + # skip over data chunks if possible/necessary + } elsif (not $validate or $len > $chunkSizeLimit) { + $raf->Seek($len + 4, 1) or $et->Warn('Seek error'), last; + next; + } + } elsif ($wasDat and $isTxtChunk{$chunk}) { + my $msg; + if (not $outfile) { + $msg = 'may be ignored by some readers'; + } elsif (defined $doTxt) { # $doTxt == 0 if we crossed a noLeapFrog chunk + $msg = "can't be moved"; # (but could be deleted then added back again) + } else { + $msg = 'fixed'; + } + $et->WarnOnce("Text/EXIF chunk(s) found after $$et{FileType} $wasDat ($msg)", 1); + } + # read chunk data and CRC + unless ($raf->Read($dbuf,$len)==$len and $raf->Read($cbuf, 4)==4) { + $et->Warn("Corrupted $fileType image") unless $wasEnd; + last; + } + if ($verbose or $validate or ($outfile and not $fastScan)) { + # check CRC when in verbose mode (since we don't care about speed) + my $crc = CalculateCRC(\$hbuf, undef, 4); + $crc = CalculateCRC(\$dbuf, $crc); + unless ($crc == unpack('N',$cbuf)) { + my $msg = "Bad CRC for $chunk chunk"; + $outfile ? $et->Error($msg, 1) : $et->Warn($msg); + } + if ($datChunk) { + Write($outfile, $hbuf, $dbuf, $cbuf) or $err = 1 if $outfile; + next; + } + # just skip over any text chunk found after IDAT + if ($outfile and $wasDat) { + if ($isTxtChunk{$chunk} and not defined $doTxt) { + ++$$et{CHANGED} if $$et{FORCE_WRITE}{PNG}; + print $out " Deleting $chunk that was moved ($len bytes)\n" if $verbose; + next; + } + # done moving text if we hit one of these chunks + $doTxt = 0 if $noLeapFrog{$chunk}; + } + if ($verbose) { + print $out "$fileType $chunk ($len bytes):\n"; + $et->VerboseDump(\$dbuf, Addr => $raf->Tell() - $len - 4) if $verbose > 2; + } + } + # translate case of chunk names that have changed since the first implementation + if (not $$tagTablePtr{$chunk} and $stdCase{lc $chunk}) { + my $stdChunk = $stdCase{lc $chunk}; + if ($outfile and ($$et{EDIT_DIRS}{IFD0} or $stdChunk !~ /^[ez]xif$/i)) { + $et->Warn("Changed $chunk chunk to $stdChunk", 1); + ++$$et{CHANGED}; + } else { + $et->Warn("$chunk chunk should be $stdChunk", 1); + } + $chunk = $stdCase{lc $chunk}; + } + # only extract information from chunks in our tables + my ($theBuff, $outBuff); + $outBuff = \$theBuff if $outfile; + if ($$tagTablePtr{$chunk}) { + FoundPNG($et, $tagTablePtr, $chunk, $dbuf, undef, $outBuff); + } elsif ($mngTablePtr and $$mngTablePtr{$chunk}) { + FoundPNG($et, $mngTablePtr, $chunk, $dbuf, undef, $outBuff); + } + if ($outfile) { + if (defined $theBuff) { + next unless length $theBuff; # empty if we deleted the information + # change chunk type if necessary + if ($$et{TextChunkType}) { + $chunk = $$et{TextChunkType}; + delete $$et{TextChunkType}; + } + $hbuf = pack('Na4', length($theBuff), $chunk); + $dbuf = $theBuff; + my $crc = CalculateCRC(\$hbuf, undef, 4); + $crc = CalculateCRC(\$dbuf, $crc); + $cbuf = pack('N', $crc); + } + Write($outfile, $hbuf, $dbuf, $cbuf) or $err = 1; + } + } + delete $$et{SET_GROUP1}; + return -1 if $outfile and ($err or not $wasEnd); + return 1; # this was a valid PNG/MNG/JNG image +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::PNG - Read and write PNG meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to read and +write PNG (Portable Network Graphics), MNG (Multi-image Network Graphics) +and JNG (JPEG Network Graphics) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.libpng.org/pub/png/spec/1.2/> + +=item L<http://www.faqs.org/docs/png/> + +=item L<http://www.libpng.org/pub/mng/> + +=item L<http://www.libpng.org/pub/png/spec/register/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PNG Tags>, +L<Image::ExifTool::TagNames/MNG Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/PPM.pm b/lib/Image/ExifTool/PPM.pm new file mode 100644 index 0000000..ae7d290 --- /dev/null +++ b/lib/Image/ExifTool/PPM.pm @@ -0,0 +1,169 @@ +#------------------------------------------------------------------------------ +# File: PPM.pm +# +# Description: Read and write PPM meta information +# +# Revisions: 09/03/2005 - P. Harvey Created +# +# References: 1) http://netpbm.sourceforge.net/doc/ppm.html +# 2) http://netpbm.sourceforge.net/doc/pgm.html +# 3) http://netpbm.sourceforge.net/doc/pbm.html +#------------------------------------------------------------------------------ + +package Image::ExifTool::PPM; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.10'; + +#------------------------------------------------------------------------------ +# Read or write information in a PPM/PGM/PBM image +# Inputs: 0) ExifTool object reference, 1) Directory information reference +# Returns: 1 on success, 0 if this wasn't a valid PPM file, -1 on write error +sub ProcessPPM($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $outfile = $$dirInfo{OutFile}; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my ($buff, $num, $type, %info); +# +# read as much of the image as necessary to extract the header and comments +# + for (;;) { + if (defined $buff) { + # need to read some more data + my $tmp; + return 0 unless $raf->Read($tmp, 1024); + $buff .= $tmp; + } else { + return 0 unless $raf->Read($buff, 1024); + } + # verify this is a valid PPM file + return 0 unless $buff =~ /^P([1-6])\s+/g; + $num = $1; + # note: may contain comments starting with '#' + if ($buff =~ /\G#/gc) { + # must read more if we are in the middle of a comment + next unless $buff =~ /\G ?(.*[\n\r]+(#.*[\n\r]+)*)\s*/g; + $info{Comment} = $1; + next if $buff =~ /\G#/gc; + } else { + delete $info{Comment}; + } + next unless $buff =~ /\G(\S+)\s+(\S+)\s+/g; + $info{ImageWidth} = $1; + $info{ImageHeight} = $2; + $type = [qw{PPM PBM PGM}]->[$num % 3]; + last if $type eq 'PBM'; # (no MaxVal for PBM images) + if ($buff =~ /\G\s*#/gc) { + next unless $buff =~ /\G ?(.*[\n\r]+(#.*[\n\r]+)*)\s*/g; + $info{Comment} = '' unless exists $info{Comment}; + $info{Comment} .= $1; + next if $buff =~ /\G#/gc; + } + next unless $buff =~ /\G(\S+)\s/g; + $info{MaxVal} = $1; + last; + } + # validate numerical values + foreach (keys %info) { + next if $_ eq 'Comment'; + return 0 unless $info{$_} =~ /^\d+$/; + } + if (defined $info{Comment}) { + $info{Comment} =~ s/^# ?//mg; # remove "# " at the start of each line + $info{Comment} =~ s/[\n\r]+$//; # remove trailing newline + } + $et->SetFileType($type); + my $len = pos($buff); +# +# rewrite the file if requested +# + if ($outfile) { + my $nvHash; + my $newComment = $et->GetNewValue('Comment', \$nvHash); + my $oldComment = $info{Comment}; + if ($et->IsOverwriting($nvHash, $oldComment)) { + ++$$et{CHANGED}; + $et->VerboseValue('- Comment', $oldComment) if defined $oldComment; + $et->VerboseValue('+ Comment', $newComment) if defined $newComment; + } else { + $newComment = $oldComment; # use existing comment + } + my $hdr = "P$num\n"; + if (defined $newComment) { + $newComment =~ s/\n/\n# /g; + $hdr .= "# $newComment\n"; + } + $hdr .= "$info{ImageWidth} $info{ImageHeight}\n"; + $hdr .= "$info{MaxVal}\n" if $type ne 'PBM'; + # write header and start of image + Write($outfile, $hdr, substr($buff, $len)) or return -1; + # copy over the rest of the image + while ($raf->Read($buff, 0x10000)) { + Write($outfile, $buff) or return -1; + } + return 1; + } +# +# save extracted information +# + if ($verbose > 2) { + print $out "$type header ($len bytes):\n"; + $et->VerboseDump(\$buff, Len => $len); + } + my $tag; + foreach $tag (qw{Comment ImageWidth ImageHeight MaxVal}) { + $et->FoundTag($tag, $info{$tag}) if defined $info{$tag}; + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::PPM - Read and write PPM meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read and +write PPM (Portable Pixel Map), PGM (Portable Gray Map) and PBM (Portable +BitMap) images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://netpbm.sourceforge.net/doc/ppm.html> + +=item L<http://netpbm.sourceforge.net/doc/pgm.html> + +=item L<http://netpbm.sourceforge.net/doc/pbm.html> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PPM Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/PSP.pm b/lib/Image/ExifTool/PSP.pm new file mode 100644 index 0000000..2083fde --- /dev/null +++ b/lib/Image/ExifTool/PSP.pm @@ -0,0 +1,306 @@ +#------------------------------------------------------------------------------ +# File: PSP.pm +# +# Description: Read Paint Shop Pro meta information +# +# Revisions: 2010/01/23 - P. Harvey Created +# +# References: 1) http://www.jasc.com/support/kb/articles/pspspec.asp +#------------------------------------------------------------------------------ + +package Image::ExifTool::PSP; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.05'; + +sub ProcessExtData($$$); + +# PSP info +%Image::ExifTool::PSP::Main = ( + GROUPS => { 2 => 'Image' }, + VARS => { ALPHA_FIRST => 1 }, + NOTES => q{ + Tags extracted from Paint Shop Pro images (PSP, PSPIMAGE, PSPFRAME, + PSPSHAPE, PSPTUBE and TUB extensions). + }, + # FileVersions: + # 3.0 => PSP 5 + # 4.0 => PSP 6 + # 5.0 => PSP 7 + # 6.0 => PSP 8 + # 7.0 => PSP 9 + # ? => PSP X + # ? => PSP X1 (is this the same as X?) + # ? => PSP X2 + # 10.0 => PSP X3 (= PSP 13) + FileVersion => { PrintConv => '$val=~tr/ /./; $val' }, + 0 => [ + { + Condition => '$$self{PSPFileVersion} > 3', + Name => 'ImageInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::PSP::Image', + Start => 4, + }, + }, + { + Name => 'ImageInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::PSP::Image', + }, + }, + ], + 1 => { + Name => 'CreatorInfo', + SubDirectory => { TagTable => 'Image::ExifTool::PSP::Creator' }, + }, + 10 => { + Name => 'ExtendedInfo', + SubDirectory => { TagTable => 'Image::ExifTool::PSP::Ext' }, + }, + # this is inside the composite image bank block (16), which I don't want to parse... + #18 => { + # Name => 'PreviewImage', + # Groups => { 2 => 'Preview' }, + # RawConv => '$self->ValidateImage(\$val,$tag)', + #}, +); + +# the PSP image block +%Image::ExifTool::PSP::Image = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { Name => 'ImageWidth', Format => 'int32u' }, + 4 => { Name => 'ImageHeight', Format => 'int32u' }, + 8 => { Name => 'ImageResolution', Format => 'double' }, + 16 => { + Name => 'ResolutionUnit', + Format => 'int8u', + PrintConv => { + 0 => 'None', + 1 => 'inches', + 2 => 'cm', + }, + }, + 17 => { + Name => 'Compression', + Format => 'int16u', + PrintConv => { + 0 => 'None', + 1 => 'RLE', + 2 => 'LZ77', + 3 => 'JPEG', + }, + }, + 19 => { Name => 'BitsPerSample',Format => 'int16u' }, + 21 => { Name => 'Planes', Format => 'int16u' }, + 23 => { Name => 'NumColors', Format => 'int32u' }, +); + +# the PSP creator data block +%Image::ExifTool::PSP::Creator = ( + PROCESS_PROC => \&ProcessExtData, + GROUPS => { 2 => 'Image' }, + PRIORITY => 0, # prefer EXIF if it exists + 0 => 'Title', + 1 => { + Name => 'CreateDate', + Format => 'int32u', + Groups => { 2 => 'Time' }, + ValueConv => 'Image::ExifTool::ConvertUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + 2 => { + Name => 'ModifyDate', + Format => 'int32u', + Groups => { 2 => 'Time' }, + ValueConv => 'Image::ExifTool::ConvertUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + 3 => { + Name => 'Artist', + Groups => { 2 => 'Author' }, + }, + 4 => { + Name => 'Copyright', + Groups => { 2 => 'Author' }, + }, + 5 => 'Description', + 6 => { + Name => 'CreatorAppID', + Format => 'int32u', + PrintConv => { + 0 => 'Unknown', + 1 => 'Paint Shop Pro', + }, + }, + 7 => { + Name => 'CreatorAppVersion', + Format => 'int8u', + Count => 4, + ValueConv => 'join(" ",reverse split " ", $val)', # low byte first + PrintConv => '$val=~tr/ /./; $val', + }, +); + +# the PSP extended data block +%Image::ExifTool::PSP::Ext = ( + PROCESS_PROC => \&ProcessExtData, + GROUPS => { 2 => 'Image' }, + 3 => { + Name => 'EXIFInfo', #(don't change this name, it is used in the code) + SubDirectory => { TagTable => 'Image::ExifTool::Exif::Main' }, + }, +); + +#------------------------------------------------------------------------------ +# Extract information from the extended data block +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessExtData($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + my $pos = 0; + # loop through sub-blocks + while ($pos + 10 < $dirLen) { + unless (substr($$dataPt, $pos, 4) eq "~FL\0") { + $et->Warn('Lost synchronization while reading sub blocks'); + last; + } + my $tag = Get16u($dataPt, $pos + 4); + my $len = Get32u($dataPt, $pos + 6); + $pos += 10 + $len; + if ($pos > $dirLen) { + $et->Warn("Truncated sub block ID=$tag len=$len"); + last; + } + next unless $$tagTablePtr{$tag}; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag) or next; + my $start = $pos - $len; + unless ($$tagInfo{Name} eq 'EXIFInfo') { + $et->HandleTag($tagTablePtr, $tag, undef, + TagInfo => $tagInfo, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + DataLen => length $$dataPt, + Start => $start, + Size => $len, + ); + next; + } + # validate EXIF block header and set byte order + next unless $len > 14 and substr($$dataPt, $pos - $len, 6) eq "Exif\0\0"; + next unless SetByteOrder(substr($$dataPt, $start + 6, 2)); + # This is REALLY annoying... They use a standard TIFF offset to point to + # the first IFD, but after that the offsets are relative to the start of + # the IFD instead of the TIFF base, which means that I must handle it as a + # special case. Dumb, dumb... + $start += 14; + my %dirInfo = ( + DirName => 'EXIF', + Parent => 'PSP', + DataPt => $dataPt, + DataPos => -$start, # data position relative to Base + DataLen => length $$dataPt, + DirStart => $start, + Base => $start + $$dirInfo{DataPos}, # absolute base offset + Multi => 0, + ); + my $exifTable = GetTagTable($$tagInfo{SubDirectory}{TagTable}); + Image::ExifTool::Exif::ProcessExif($et, \%dirInfo, $exifTable); + SetByteOrder('II'); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from a PSP file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid PSP file +sub ProcessPSP($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $tag, $len, $err); + return 0 unless $raf->Read($buff, 32) == 32 and + $buff eq "Paint Shop Pro Image File\x0a\x1a\0\0\0\0\0" and + $raf->Read($buff, 4) == 4; + $et->SetFileType(); + SetByteOrder('II'); + my $tagTablePtr = GetTagTable('Image::ExifTool::PSP::Main'); + my @a = unpack('v*', $buff); + # figure out block header length for this format PSP file + my $hlen = $a[0] > 3 ? 10 : 14; + $$et{PSPFileVersion} = $a[0]; # save for use in Condition + $et->HandleTag($tagTablePtr, FileVersion => "@a"); + # loop through blocks in file + my $pos = 36; + for (;;) { + last unless $raf->Read($buff, $hlen) == $hlen; + unless ($buff =~ /^~BK\0/) { + $et->Warn('Lost synchronization while reading main PSP blocks'); + last; + } + $tag = Get16u(\$buff, 4); + $len = Get32u(\$buff, $hlen - 4); + $pos += $hlen + $len; + unless ($$tagTablePtr{$tag}) { + $raf->Seek($len, 1) or $err=1, last; + next; + } + $raf->Read($buff, $len) == $len or $err=1, last; + $et->HandleTag($tagTablePtr, $tag, $buff, + DataPt => \$buff, + DataPos => $pos - $len, + Size => $len, + ); + } + $err and $et->Warn("Truncated main block ID=$tag len=$len"); + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::PSP - Read Paint Shop Pro meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to extract +information from Paint Shop Pro images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.jasc.com/support/kb/articles/pspspec.asp> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PSP Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Palm.pm b/lib/Image/ExifTool/Palm.pm new file mode 100644 index 0000000..9f8b1dd --- /dev/null +++ b/lib/Image/ExifTool/Palm.pm @@ -0,0 +1,403 @@ +#------------------------------------------------------------------------------ +# File: Palm.pm +# +# Description: Read Palm Database files +# +# Revisions: 2014/05/28 - P. Harvey Created +# +# References: 1) http://wiki.mobileread.com/wiki/PDB +# 2) http://wiki.mobileread.com/wiki/MOBI +#------------------------------------------------------------------------------ + +package Image::ExifTool::Palm; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.00'; + +sub ProcessEXTH($$$); + +# type/creator ID's for Palm database files +my %palmTypes = ( + '.pdfADBE' => 'Adobe Reader', + 'TEXtREAd' => 'PalmDOC', + 'BVokBDIC' => 'BDicty', + 'DB99DBOS' => 'DB (Database program)', + 'PNRdPPrs' => 'eReader', + 'DataPPrs' => 'eReader', + 'vIMGView' => 'FireViewer (ImageViewer)', + 'PmDBPmDB' => 'HanDBase', + 'InfoINDB' => 'InfoView', + 'ToGoToGo' => 'iSilo', + 'SDocSilX' => 'iSilo 3', + 'JbDbJBas' => 'JFile', + 'JfDbJFil' => 'JFile Pro', + 'DATALSdb' => 'LIST', + 'Mdb1Mdb1' => 'MobileDB', + 'BOOKMOBI' => 'Mobipocket', + 'DataPlkr' => 'Plucker', + 'DataSprd' => 'QuickSheet', + 'SM01SMem' => 'SuperMemo', + 'TEXtTlDc' => 'TealDoc', + 'InfoTlIf' => 'TealInfo', + 'DataTlMl' => 'TealMeal', + 'DataTlPt' => 'TealPaint', + 'dataTDBP' => 'ThinkDB', + 'TdatTide' => 'Tides', + 'ToRaTRPW' => 'TomeRaider', + 'zTXTGPlm' => 'Weasel', + 'BDOCWrdS' => 'WordSmith', +); + +my %dateTimeInfo = ( + # like QuickTime, the time zero should be Jan 1, 1904, but not all software writes this, + # so assume a time zero of Jan 1, 1970 if the date is before this + RawConv => q{ + my $offset = (66 * 365 + 17) * 24 * 3600; + return $val - $offset if $val >= $offset; + return $val; + }, + ValueConv => 'ConvertUnixTime($val, 1)', # (UTC written by "EPUB Converter", ref PH) + PrintConv => '$self->ConvertDateTime($val)', +); + +# Palm Database header information +%Image::ExifTool::Palm::Main = ( + GROUPS => { 0 => 'Palm', 1 => 'Palm', 2 => 'Document' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int32u', + NOTES => q{ + Information extracted from Palm database files (PDB and PRC extensions), + Mobipocket electronic books (MOBI), and Amazon Kindle KF7 and KF8 books (AZW + and AZW3). + }, + 0 => { Name => 'DatabaseName', Format => 'string[32]' }, + # 8 - int16u: file attributes (not very useful) + # 8.5 - int16u: version + 9 => { + Name => 'CreateDate', + Groups => { 2 => 'Time' }, + %dateTimeInfo, + }, + 10 => { + Name => 'ModifyDate', + Groups => { 2 => 'Time' }, + %dateTimeInfo, + }, + 11 => { + Name => 'LastBackupDate', + Groups => { 2 => 'Time' }, + %dateTimeInfo, + }, + 12 => 'ModificationNumber', + 15 => { + Name => 'PalmFileType', + Format => 'undef[8]', + PrintConv => \%palmTypes, + }, +); + + +# MOBI header tags +%Image::ExifTool::Palm::MOBI = ( + GROUPS => { 0 => 'Palm', 1 => 'MOBI', 2 => 'Document' }, + NOTES => q{ + Information extracted from the MOBI header of Mobipocket and Amazon Kindle + KF7 and KF8 files. + }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int32u', + 0 => { + Name => 'Compression', + Format => 'int16u', + PrintConv => { + 1 => 'None', + 2 => 'PalmDOC', + 17480 => 'HUFF/CDIC', + }, + }, + 1 => { + Name => 'UncompressedTextLength', + PrintConv => \&Image::ExifTool::ConvertFileSize, + }, + 3 => { + Name => 'Encryption', + PrintConv => { + 0 => 'None', + 1 => 'Old Mobipocket', + 2 => 'Mobipocket', + }, + }, + 6 => { + Name => 'MobiType', + PrintConv => { + 2 => 'Mobipocket Book', + 3 => 'PalmDoc Book', + 4 => 'Audio', + 232 => 'mobipocket? generated by kindlegen1.2', + 248 => 'KF8: generated by kindlegen2', + 257 => 'News', + 258 => 'News_Feed', + 259 => 'News_Magazine', + 513 => 'PICS', + 514 => 'WORD', + 515 => 'XLS', + 516 => 'PPT', + 517 => 'TEXT', + 518 => 'HTML', + }, + }, + 7 => { + Name => 'CodePage', + RawConv => '$$self{CodePage} = $val', + PrintConv => { + # just define commonly used code pages + # (a much more complete list may be found in FlashPix.pm) + 1252 => 'Windows Latin 1 (Western European)', + 65001 => 'Unicode (UTF-8)', + }, + }, + 9 => 'MobiVersion', + 21 => 'BookName', # this is actually an offset, but replace it with the string later + 26 => 'MinimumVersion', +); + +# MOBI extended header tags +%Image::ExifTool::Palm::EXTH = ( + GROUPS => { 0 => 'Palm', 1 => 'MOBI', 2 => 'Document' }, + FORMAT => 'string', + NOTES => 'Information extracted from the MOBI extended header.', + PROCESS_PROC => \&ProcessEXTH, + 1 => 'DRMServerID', + 2 => 'DRMCommerceID', + 3 => 'DRM_E-BookBaseID', + 100 => { Name => 'Author', Groups => { 2 => 'Author' } }, + 101 => 'Publisher', + 102 => 'Imprint', + 103 => 'Description', + 104 => 'ISBN', + 105 => { Name => 'Subject', List => 1 }, + 106 => { + Name => 'PublishDate', + Groups => { 2 => 'Time' }, + ValueConv => q{ + require Image::ExifTool::XMP; + Image::ExifTool::XMP::ConvertXMPDate($val, 1); + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 107 => 'Review', + 108 => 'Contributor', + 109 => { Name => 'Rights', Groups => { 2 => 'Author' } }, + 110 => 'SubjectCode', + 111 => 'BookType', + 112 => 'Source', + 113 => 'ASIN', + 114 => 'BookVersion', + 115 => { Name => 'SampleFlag', Format => 'int32u' }, + 116 => { Name => 'StartReading', Format => 'int32u' }, + 117 => 'Adult', + 118 => 'RetailPrice', + 119 => 'RetailPriceCurrency', + # 121 => 'KF8BoundaryOffset', + 125 => { Name => 'ResourceCount', Format => 'int32u' }, + 129 => 'KF8CoverURI', + 200 => 'DictionaryShortName', + # 201 => { Name => 'CoverOffset', Format => 'int32u' }, + # 202 => { Name => 'ThumbOffset', Format => 'int32u' }, + # 203 => 'HasFakeCover', + 204 => { + Name => 'CreatorSoftware', + Format => 'int32u', + PrintConv => { + 1 => 'Mobigen', + 2 => 'Mobipocket', + 200 => 'Kindlegen (Windows)', + 201 => 'Kindlegen (Linux)', + 202 => 'Kindlegen (Mac)', + }, + }, + 205 => { Name => 'CreatorMajorVersion', Format => 'int32u' }, + 206 => { Name => 'CreatorMinorVersion', Format => 'int32u' }, + 207 => { Name => 'CreatorBuildNumber', Format => 'int32u' }, + 208 => 'Watermark', + 209 => 'Tamper-proofKeys', + # 300 => 'FontSignature', + 401 => { Name => 'ClippingLimit', Format => 'int8u' }, + 402 => 'PublisherLimit', + 404 => { + Name => 'TextToSpeech', + Format => 'int8u', + PrintConv => { 0 => 'Enabled', 1 => 'Disabled' }, + }, + 405 => { Name => 'RentalFlag', Format => 'int8u' }, #? + 406 => 'RentalExpirationDate', + 501 => { Name => 'CDEType', Format => 'int32u' }, + 502 => 'LastUpdateTime', + 503 => 'UpdatedTitle', + 504 => 'ASIN2', + 524 => 'Language', + 525 => 'Alignment', + 535 => 'CreatorBuildNumber2', +); + +#------------------------------------------------------------------------------ +# Process the MOBI extended header +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 (EXTH should have already been validated) +sub ProcessEXTH($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $enc = $$dirInfo{Encoding} || 'UTF8'; + my $dirLen = length $$dataPt; + my ($index, $pos); + + $et->VerboseDir('EXTH', $$dirInfo{NumEntries}, $dirLen); + + # process the EXTH entries + for ($index=0, $pos=0; ; ++$index) { + last if $pos + 8 > $dirLen; + my $tag = Get32u($dataPt, $pos); + my $len = Get32u($dataPt, $pos + 4); + last if $len < 8 or $pos + $len > $dirLen; + my $key = $et->HandleTag($tagTablePtr, $tag, undef, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $pos + 8, + Size => $len - 8, + Index => $index, + ); + # recode text if necessary + $$et{VALUE}{$key} = $et->Decode($$et{VALUE}{$key}, $enc) if $key; + $pos += $len; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from a Palm DB file +# Inputs: 0) ExifTool ref, 1) dirInfo reference +# Returns: 1 if this was a recognized PDB file, 0 otherwise +sub ProcessPDB($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $buf2, $size, $enc); + my $verbose = $et->Options('Verbose'); + + # verify this is a valid Palm DB file + return 0 unless $raf->Read($buff, 86) == 86; + my $type = $palmTypes{substr($buff, 60, 8)}; + return 0 unless $type; +# +# Read and process the Palm DB file header +# + $et->SetFileType($type eq 'Mobipocket' ? 'MOBI' : 'PDB'); + SetByteOrder('MM'); + + my $tagTablePtr = GetTagTable('Image::ExifTool::Palm::Main'); + $et->ProcessDirectory({ DataPt => \$buff }, $tagTablePtr); + + return 1 unless $type eq 'Mobipocket' and Get16u(\$buff, 76); +# +# Read and process MOBI header (should be the first record) +# + my $offset = Get32u(\$buff, 78); # get offset to first record + unless ($raf->Seek($offset, 0) and $raf->Read($buff, 274) == 274) { + $et->Warn('Truncated MOBI header'); + return 1; + } + unless (substr($buff, 16, 4) eq 'MOBI') { + $et->Warn('Invalid MOBI header'); + return 1; + } + $tagTablePtr = GetTagTable('Image::ExifTool::Palm::MOBI'); + $et->ProcessDirectory({ DataPt => \$buff }, $tagTablePtr); + + # get text encoding + $enc = $Image::ExifTool::charsetName{"cp$$et{CodePage}"} if $$et{CodePage}; + $enc = 'UTF8' unless $enc; + + # extract the BookName string + my $off = Get32u(\$buff, 84); + my $len = Get32u(\$buff, 88); + + $raf->Seek($offset+$off, 0) and $raf->Read($buf2, $len) == $len or $buf2 = '<err>'; + $$et{VALUE}{BookName} = $et->Decode($buf2, $enc); +# +# Process the MOBI extended header if it exists +# + # first, check the flag bit to see if the EXTH record should exist + my $flag = Get32u(\$buff, 128); + return 1 unless $flag & 0x40; # check extended header flag + + $len = Get32u(\$buff, 20) + 16; # MOBI header length (including PalmDOC header) + + unless ($raf->Seek($offset+$len, 0) and $raf->Read($buf2, 12) == 12 and + substr($buf2,0,4) eq 'EXTH' and ($size = Get32u(\$buf2, 4)) > 12) + { + $et->Warn('Invalid MOBI extended header'); + return 1; + } + + # read and process the MOBI extended header + $size -= 12; + $raf->Read($buff, $size) == $size or $et->Warn('Truncated MOBI extended header'), return 1; + my %dirInfo = ( + DataPt => \$buff, + DataPos => $offset + $len + 12, + NumEntries => Get32u(\$buf2, 8), + Encoding => $enc, + ); + $tagTablePtr = GetTagTable('Image::ExifTool::Palm::EXTH'); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Palm - Read Palm Database files + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains code to extract metadata from Palm database files (PDB +and PRC extensions), Mobipocket electronic books (MOBI), and Amazon Kindle +KF7 and KF8 books (AZW and AZW3). + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://wiki.mobileread.com/wiki/PDB> + +=item L<http://wiki.mobileread.com/wiki/MOBI> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Palm Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Panasonic.pm b/lib/Image/ExifTool/Panasonic.pm new file mode 100644 index 0000000..b992f37 --- /dev/null +++ b/lib/Image/ExifTool/Panasonic.pm @@ -0,0 +1,2882 @@ +#------------------------------------------------------------------------------ +# File: Panasonic.pm +# +# Description: Panasonic/Leica maker notes tags +# +# Revisions: 11/10/2004 - P. Harvey Created +# +# References: 1) http://www.compton.nu/panasonic.html (based on FZ10) +# 2) Derived from DMC-FZ3 samples from dpreview.com +# 3) http://johnst.org/sw/exiftags/ +# 4) Tels (http://bloodgate.com/) private communication (tests with FZ5) +# 7) http://homepage3.nifty.com/kamisaka/makernote/makernote_pana.htm (2007/10/02) +# 8) Marcel Coenen private communication (DMC-FZ50) +# 9) http://forums.dpreview.com/forums/read.asp?forum=1033&message=22756430 +# 10) http://bretteville.com/pdfs/M8Metadata_v2.pdf +# 11) http://www.digital-leica.com/lens_codes/index.html +# (now https://www.l-camera-forum.com/leica-news/leica-lens-codes/) +# 12) Joerg - http://www.cpanforum.com/threads/11602 (LX3 firmware 2.0) +# 13) Michael Byczkowski private communication (Leica M9) +# 14) Carl Bretteville private communication (M9) +# 15) Zdenek Mihula private communication (TZ8) +# 16) Olaf Ulrich private communication +# 17) https://exiftool.org/forum/index.php/topic,4922.0.html +# 18) Thomas Modes private communication (G6) +# 19) https://exiftool.org/forum/index.php/topic,5533.0.html +# 20) Bernd-Michael Kemper private communication (DMC-GX80/85) +# 21) Klaus Homeister forum post +# 22) Daniel Beichl private communication (G9) +# 23) Tim Gray private communication (M10 Monochrom) +# JD) Jens Duttke private communication (TZ3,FZ30,FZ50) +#------------------------------------------------------------------------------ + +package Image::ExifTool::Panasonic; + +use strict; +use vars qw($VERSION %leicaLensTypes); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '2.17'; + +sub ProcessLeicaLEIC($$$); +sub WhiteBalanceConv($;$$); + +# Leica lens types (ref 10) +%leicaLensTypes = ( + OTHER => sub { + my ($val, $inv, $conv) = @_; + return undef if $inv or not $val =~ s/ .*//; + return $$conv{$val}; + }, + Notes => q{ + the LensType value is obtained by splitting the stored value into 2 + integers: The stored value divided by 4, and its lower 2 bits. The second + number is used only if necessary to identify certain manually coded lenses + on the M9, or the focal length of some multi-focal lenses. + }, + # All M9 codes (two numbers: first the LensID then the lower 2 bits) + # are ref PH with samples from ref 13. From ref 10, the lower 2 bits of + # the LensType value give the frame selector position for most lenses, + # although for the 28-35-50mm (at least) it gives the focal length selection. + # The M9 also gives the focal length selection but for other lenses the + # lower 3 bits don't change with frame selector position except for the lens + # shows as uncoded for certain lenses and some incorrect positions of the + # frame selector. The bits are zero for uncoded lenses when manually coding + # from the menu on the M9. - PH + # Frame selector bits (from ref 10, M8): + # 1 => '28/90mm frame lines engaged', + # 2 => '24/35mm frame lines engaged', + # 3 => '50/75mm frame lines engaged', + '0 0' => 'Uncoded lens', +# +# NOTE: MUST ADD ENTRY TO %frameSelectorBits below when a new lens is added!!!! +# + # model number(s): + 1 => 'Elmarit-M 21mm f/2.8', # 11134 + 3 => 'Elmarit-M 28mm f/2.8 (III)', # 11804 + 4 => 'Tele-Elmarit-M 90mm f/2.8 (II)', # 11800 + 5 => 'Summilux-M 50mm f/1.4 (II)', # 11868/11856/11114 + 6 => 'Summicron-M 35mm f/2 (IV)', # 11310/11311 + '6 0' => 'Summilux-M 35mm f/1.4', # 11869/11870/11860 + 7 => 'Summicron-M 90mm f/2 (II)', # 11136/11137 + 9 => 'Elmarit-M 135mm f/2.8 (I/II)', # 11829 + '9 0' => 'Apo-Telyt-M 135mm f/3.4', # 11889 + 11 => 'Summaron-M 28mm f/5.6', # ? (ref IB) + 12 => 'Thambar-M 90mm f/2.2', # ? (ref IB) + 16 => 'Tri-Elmar-M 16-18-21mm f/4 ASPH.',# 11626 + '16 1' => 'Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 16mm)', + '16 2' => 'Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 18mm)', + '16 3' => 'Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 21mm)', + 23 => 'Summicron-M 50mm f/2 (III)', # 11817, version (I) in camera menu + 24 => 'Elmarit-M 21mm f/2.8 ASPH.', # 11135/11897 + 25 => 'Elmarit-M 24mm f/2.8 ASPH.', # 11878/11898 + 26 => 'Summicron-M 28mm f/2 ASPH.', # 11604 + 27 => 'Elmarit-M 28mm f/2.8 (IV)', # 11809 + 28 => 'Elmarit-M 28mm f/2.8 ASPH.', # 11606 + 29 => 'Summilux-M 35mm f/1.4 ASPH.', # 11874/11883 + '29 0' => 'Summilux-M 35mm f/1.4 ASPHERICAL', # 11873 (different from "ASPH." model!) + 30 => 'Summicron-M 35mm f/2 ASPH.', # 11879/11882 + 31 => 'Noctilux-M 50mm f/1', # 11821/11822 + '31 0' => 'Noctilux-M 50mm f/1.2', # 11820 + 32 => 'Summilux-M 50mm f/1.4 ASPH.', # 11891/11892 + 33 => 'Summicron-M 50mm f/2 (IV, V)', # 11819/11825/11826/11816, version (II,III) in camera menu + 34 => 'Elmar-M 50mm f/2.8', # 11831/11823/11825 + 35 => 'Summilux-M 75mm f/1.4', # 11814/11815/11810 + 36 => 'Apo-Summicron-M 75mm f/2 ASPH.', # 11637 + 37 => 'Apo-Summicron-M 90mm f/2 ASPH.', # 11884/11885 + 38 => 'Elmarit-M 90mm f/2.8', # 11807/11808, version (II) in camera menu + 39 => 'Macro-Elmar-M 90mm f/4', # 11633/11634 + '39 0' => 'Tele-Elmar-M 135mm f/4 (II)',# 11861 + 40 => 'Macro-Adapter M', # 14409 + 41 => 'Apo-Summicron-M 50mm f/2 ASPH.', #IB + '41 3' => 'Apo-Summicron-M 50mm f/2 ASPH.', #16 + 42 => 'Tri-Elmar-M 28-35-50mm f/4 ASPH.',# 11625 + '42 1' => 'Tri-Elmar-M 28-35-50mm f/4 ASPH. (at 28mm)', + '42 2' => 'Tri-Elmar-M 28-35-50mm f/4 ASPH. (at 35mm)', + '42 3' => 'Tri-Elmar-M 28-35-50mm f/4 ASPH. (at 50mm)', + 43 => 'Summarit-M 35mm f/2.5', # ? (ref PH) + 44 => 'Summarit-M 50mm f/2.5', # ? (ref PH) + 45 => 'Summarit-M 75mm f/2.5', # ? (ref PH) + 46 => 'Summarit-M 90mm f/2.5', # ? + 47 => 'Summilux-M 21mm f/1.4 ASPH.', # ? (ref 11) + 48 => 'Summilux-M 24mm f/1.4 ASPH.', # ? (ref 11) + 49 => 'Noctilux-M 50mm f/0.95 ASPH.', # ? (ref 11) + 50 => 'Elmar-M 24mm f/3.8 ASPH.', # ? (ref 11) + 51 => 'Super-Elmar-M 21mm f/3.4 Asph', # ? (ref 16, frameSelectorBits=1) + '51 2' => 'Super-Elmar-M 14mm f/3.8 Asph', # ? (ref 16) + 52 => 'Apo-Telyt-M 18mm f/3.8 ASPH.', # ? (ref PH/11) + 53 => 'Apo-Telyt-M 135mm f/3.4', #IB + '53 2' => 'Apo-Telyt-M 135mm f/3.4', #16 + '53 3' => 'Apo-Summicron-M 50mm f/2 (VI)', #LR + 58 => 'Noctilux-M 75mm f/1.25 ASPH.', # ? (ref IB) +); + +# M9 frame selector bits for each lens +# 1 = towards lens = 28/90mm or 21mm or Adapter (or Elmarit-M 135mm f/2.8) +# 2 = away from lens = 24/35mm (or 35/135mm on the M9) +# 3 = middle position = 50/75mm or 18mm +my %frameSelectorBits = ( + 1 => 1, + 3 => 1, + 4 => 1, + 5 => 3, + 6 => 2, + 7 => 1, + 9 => 1, # (because lens has special magnifier for the rangefinder) + 16 => 1, # or 2 or 3 + 23 => 3, + 24 => 1, + 25 => 2, + 26 => 1, + 27 => 1, + 28 => 1, + 29 => 2, + 30 => 2, + 31 => 3, + 32 => 3, + 33 => 3, + 34 => 3, + 35 => 3, + 36 => 3, + 37 => 1, + 38 => 1, + 39 => 1, + 40 => 1, + 42 => 1, # or 2 or 3 + 43 => 2, # (NC) + 44 => 3, # (NC) + 45 => 3, + 46 => 1, # (NC) + 47 => 1, # (NC) + 48 => 2, # (NC) + 49 => 3, # (NC) + 50 => 2, # (NC) + 51 => 1, # or 2 (ref 16) + 52 => 3, + 53 => 2, #16 +); + +# conversions for ShootingMode and SceneMode +my %shootingMode = ( + 1 => 'Normal', + 2 => 'Portrait', + 3 => 'Scenery', + 4 => 'Sports', + 5 => 'Night Portrait', + 6 => 'Program', + 7 => 'Aperture Priority', + 8 => 'Shutter Priority', + 9 => 'Macro', + 10 => 'Spot', #7 + 11 => 'Manual', + 12 => 'Movie Preview', #PH (LZ6) + 13 => 'Panning', + 14 => 'Simple', #PH (LZ6) + 15 => 'Color Effects', #7 + 16 => 'Self Portrait', #PH (TZ5) + 17 => 'Economy', #7 + 18 => 'Fireworks', + 19 => 'Party', + 20 => 'Snow', + 21 => 'Night Scenery', + 22 => 'Food', #7 + 23 => 'Baby', #JD + 24 => 'Soft Skin', #PH (LZ6) + 25 => 'Candlelight', #PH (LZ6) + 26 => 'Starry Night', #PH (LZ6) + 27 => 'High Sensitivity', #7 (LZ6) + 28 => 'Panorama Assist', #7 + 29 => 'Underwater', #7 + 30 => 'Beach', #PH (LZ6) + 31 => 'Aerial Photo', #PH (LZ6) + 32 => 'Sunset', #PH (LZ6) + 33 => 'Pet', #JD + 34 => 'Intelligent ISO', #PH (LZ6) + 35 => 'Clipboard', #7 + 36 => 'High Speed Continuous Shooting', #7 + 37 => 'Intelligent Auto', #7 + 39 => 'Multi-aspect', #PH (TZ5) + 41 => 'Transform', #PH (FS7) + 42 => 'Flash Burst', #PH (FZ28) + 43 => 'Pin Hole', #PH (FZ28) + 44 => 'Film Grain', #PH (FZ28) + 45 => 'My Color', #PH (GF1) + 46 => 'Photo Frame', #PH (FS7) + 48 => 'Movie', #PH (GM1) + # 49 - seen for FS4 (snow?) + 51 => 'HDR', #12 + 52 => 'Peripheral Defocus', #Horst Wandres + 55 => 'Handheld Night Shot', #PH (FZ47) + 57 => '3D', #PH (3D1) + 59 => 'Creative Control', #PH (FZ47) + 60 => 'Intelligent Auto Plus', #20 + 62 => 'Panorama', #17 + 63 => 'Glass Through', #17 + 64 => 'HDR', #17 + 66 => 'Digital Filter', #PH (GF5 "Impressive Art", "Cross Process", "Color Select", "Star") + 67 => 'Clear Portrait', #18 + 68 => 'Silky Skin', #18 + 69 => 'Backlit Softness', #18 + 70 => 'Clear in Backlight', #18 + 71 => 'Relaxing Tone', #18 + 72 => "Sweet Child's Face", #18 + 73 => 'Distinct Scenery', #18 + 74 => 'Bright Blue Sky', #18 + 75 => 'Romantic Sunset Glow', #18 + 76 => 'Vivid Sunset Glow', #18 + 77 => 'Glistening Water', #18 + 78 => 'Clear Nightscape', #18 + 79 => 'Cool Night Sky', #18 + 80 => 'Warm Glowing Nightscape', #18 + 81 => 'Artistic Nightscape', #18 + 82 => 'Glittering Illuminations', #18 + 83 => 'Clear Night Portrait', #18 + 84 => 'Soft Image of a Flower', #18 + 85 => 'Appetizing Food', #18 + 86 => 'Cute Dessert', #18 + 87 => 'Freeze Animal Motion', #18 + 88 => 'Clear Sports Shot', #18 + 89 => 'Monochrome', #18 + 90 => 'Creative Control', #18 + 92 => 'Handheld Night Shot', #forum11523 +); + +%Image::ExifTool::Panasonic::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + WRITABLE => 1, + 0x01 => { + Name => 'ImageQuality', + Writable => 'int16u', + Notes => 'quality of the main image, which may be in a different file', + PrintConv => { + 1 => 'TIFF', #PH (FZ20) + 2 => 'High', + 3 => 'Normal', + # 5 - seen this for 1920x1080, 30fps SZ7 video - PH + 6 => 'Very High', #3 (Leica) + 7 => 'RAW', #3 (Leica) + 9 => 'Motion Picture', #PH (LZ6) + 11 => 'Full HD Movie', #PH (V-LUX) + 12 => '4k Movie', #PH (V-LUX) + }, + }, + 0x02 => { + Name => 'FirmwareVersion', + Writable => 'undef', + Notes => q{ + for some camera models such as the FZ30 this may be an internal production + reference number and not the actual firmware version + }, # (ref http://www.stevesforums.com/forums/view_topic.php?id=87764&forum_id=23&) + # (can be either binary or ascii -- add decimal points if binary) + ValueConv => '$val=~/[\0-\x2f]/ ? join(" ",unpack("C*",$val)) : $val', + ValueConvInv => q{ + $val =~ /(\d+ ){3}\d+/ and $val = pack('C*',split(' ', $val)); + length($val) == 4 or warn "Version must be 4 numbers\n"; + return $val; + }, + PrintConv => '$val=~tr/ /./; $val', + PrintConvInv => '$val=~tr/./ /; $val', + }, + 0x03 => { + Name => 'WhiteBalance', + Writable => 'int16u', + PrintConv => { + 1 => 'Auto', + 2 => 'Daylight', + 3 => 'Cloudy', + 4 => 'Incandescent', #PH + 5 => 'Manual', + 8 => 'Flash', + 10 => 'Black & White', #3 (Leica) + 11 => 'Manual 2', #PH (FZ8) + 12 => 'Shade', #PH (FS7) + 13 => 'Kelvin', #PeterK (NC) + 14 => 'Manual 3', #forum9296 + 15 => 'Manual 4', #forum9296 + # also seen 18,26 (forum9296) + 19 => 'Auto (cool)', #PH (Leica C-Lux) + }, + }, + 0x07 => { + Name => 'FocusMode', + Writable => 'int16u', + PrintConv => { + 1 => 'Auto', + 2 => 'Manual', + 4 => 'Auto, Focus button', #4 + 5 => 'Auto, Continuous', #4 + 6 => 'AF-S', #18 (also seen for GF1 - PH) + 7 => 'AF-C', #18 + 8 => 'AF-F', #18 (auto-focus flexible) + }, + }, + 0x0f => [ + { + Name => 'AFAreaMode', + Condition => '$$self{Model} =~ /DMC-FZ10\b/', #JD + Writable => 'int8u', + Count => 2, + Notes => 'DMC-FZ10', + PrintConv => { + '0 1' => 'Spot Mode On', + '0 16' => 'Spot Mode Off', + }, + },{ + Name => 'AFAreaMode', + Writable => 'int8u', + Count => 2, + Notes => 'other models', + PrintConv => { #PH + '0 1' => '9-area', # (FS7) + '0 16' => '3-area (high speed)', # (FZ8) + '0 23' => '23-area', #PH (FZ47,NC) + '0 49' => '49-area', #20 + '0 225' => '225-area', #22 + '1 0' => 'Spot Focusing', # (FZ8) + '1 1' => '5-area', # (FZ8) + '16' => 'Normal?', # (only mode for DMC-LC20) + '16 0' => '1-area', # (FZ8) + '16 16' => '1-area (high speed)', # (FZ8) + # '32 0' is Face Detect for FS7, and Face Detect or Focus Tracking + # for the DMC-FZ200 (ref 17), and Auto is DMC-L1 guess, + '32 0' => 'Tracking', + '32 1' => '3-area (left)?', # (DMC-L1 guess) + '32 2' => '3-area (center)?', # (DMC-L1 guess) + '32 3' => '3-area (right)?', # (DMC-L1 guess) + '64 0' => 'Face Detect', + '64 1' => 'Face Detect (animal detect on)', #forum11194 + '64 2' => 'Face Detect (animal detect off)', #forum11194 + '128 0' => 'Pinpoint focus', #18/forum11194 + '240 0' => 'Tracking', #22 + }, + }, + ], + 0x1a => { + Name => 'ImageStabilization', + Writable => 'int16u', + PrintConv => { + 2 => 'On, Optical', + 3 => 'Off', + 4 => 'On, Mode 2', + 5 => 'On, Optical Panning', #18 + # GF1 also has a "Mode 3" - PH + 6 => 'On, Body-only', #PH (GX7, sensor shift?) + 7 => 'On, Body-only Panning', #forum11194 + 9 => 'Dual IS', #20 + 10 => 'Dual IS Panning', #forum11194 + 11 => 'Dual2 IS', #forum9298 + 12 => 'Dual2 IS Panning', #forum11194 + }, + }, + 0x1c => { + Name => 'MacroMode', + Writable => 'int16u', + PrintConv => { + 1 => 'On', + 2 => 'Off', + 0x101 => 'Tele-Macro', #7 + 0x201 => 'Macro Zoom', #PH (FS7) + }, + }, + 0x1f => { + Name => 'ShootingMode', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => \%shootingMode, + }, + 0x20 => { + Name => 'Audio', + Writable => 'int16u', + PrintConv => { + 1 => 'Yes', + 2 => 'No', + 3 => 'Stereo', #PH (NC) + }, + }, + 0x21 => { #2 + Name => 'DataDump', + Writable => 0, + Binary => 1, + }, + # 0x22 - normally 0, but 2 for 'Simple' ShootingMode in LZ6 sample - PH + 0x23 => { + Name => 'WhiteBalanceBias', + Format => 'int16s', + Writable => 'int16s', + ValueConv => '$val / 3', + ValueConvInv => '$val * 3', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x24 => { + Name => 'FlashBias', + Format => 'int16s', + Writable => 'int16s', + ValueConv => '$val / 3', #17 (older models may not have factor of 3? - PH) + ValueConvInv => '$val * 3', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x25 => { #PH + Name => 'InternalSerialNumber', + Writable => 'undef', + Count => 16, + Notes => q{ + this number is unique, and contains the date of manufacture, but is not the + same as the number printed on the camera body + }, + PrintConv => q{ + return $val unless $val=~/^([A-Z][0-9A-Z]{2})(\d{2})(\d{2})(\d{2})(\d{4})/; + my $yr = $2 + ($2 < 70 ? 2000 : 1900); + return "($1) $yr:$3:$4 no. $5"; + }, + PrintConvInv => '$_=$val; tr/A-Z0-9//dc; s/(.{3})(19|20)/$1/; $_', + }, + 0x26 => { #PH + Name => 'PanasonicExifVersion', + Writable => 'undef', + }, + 0x27 => { + Name => 'VideoFrameRate', + Writable => 'int16u', + Notes => 'only valid for older models', + PrintConv => { + OTHER => sub { shift }, + 0 => 'n/a', + }, + }, + 0x28 => { + Name => 'ColorEffect', + Writable => 'int16u', + # FX30 manual: (ColorMode) natural, vivid, cool, warm, b/w, sepia + PrintConv => { + 1 => 'Off', + 2 => 'Warm', + 3 => 'Cool', + 4 => 'Black & White', + 5 => 'Sepia', + 6 => 'Happy', #PH (FX70) (yes, really. you wouldn't want sad colors now would you?) + 8 => 'Vivid', #PH (SZ3) + }, + }, + 0x29 => { #JD + Name => 'TimeSincePowerOn', + Writable => 'int32u', + Notes => q{ + time in 1/100 s from when the camera was powered on to when the image is + written to memory card + }, + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => sub { # convert to format "[DD days ]HH:MM:SS.ss" + my $val = shift; + my $str = ''; + if ($val >= 24 * 3600) { + my $d = int($val / (24 * 3600)); + $str .= "$d days "; + $val -= $d * 24 * 3600; + } + my $h = int($val / 3600); + $val -= $h * 3600; + my $m = int($val / 60); + $val -= $m * 60; + my $ss = sprintf('%05.2f', $val); + if ($ss >= 60) { + $ss = '00.00'; + ++$m >= 60 and $m -= 60, ++$h; + } + return sprintf("%s%.2d:%.2d:%s",$str,$h,$m,$ss); + }, + PrintConvInv => sub { + my $val = shift; + my @vals = ($val =~ /\d+(?:\.\d*)?/g); + my $sec = 0; + $sec += 24 * 3600 * shift(@vals) if @vals > 3; + $sec += 3600 * shift(@vals) if @vals > 2; + $sec += 60 * shift(@vals) if @vals > 1; + $sec += shift(@vals) if @vals; + return $sec; + }, + }, + 0x2a => { #4 + Name => 'BurstMode', + Writable => 'int16u', + Notes => 'decoding may be different for some models', + PrintConv => { + 0 => 'Off', + 1 => 'On', #PH (TZ5) [was "Low/High Quality" from ref 4] + 2 => 'Auto Exposure Bracketing (AEB)', #17 + 3 => 'Focus Bracketing', #forum11194 + 4 => 'Unlimited', #PH (TZ5) + 8 => 'White Balance Bracketing', #18 + 17 => 'On (with flash)', #forum5597 + 18 => 'Aperture Bracketing', #forum11194 + }, + }, + 0x2b => { #4 + Name => 'SequenceNumber', + Writable => 'int32u', + }, + 0x2c => [ + { + Name => 'ContrastMode', + Condition => '$$self{Model} !~ /^DMC-(FX10|G1|L1|L10|LC80|GF\d+|G2|TZ10|ZS7)$/', + Flags => 'PrintHex', + Writable => 'int16u', + Notes => q{ + this decoding seems to work for some models such as the LC1, LX2, FZ7, FZ8, + FZ18 and FZ50, but may not be correct for other models such as the FX10, G1, L1, + L10 and LC80 + }, + PrintConv => { + 0x00 => 'Normal', + 0x01 => 'Low', + 0x02 => 'High', + # 0x03 - observed with LZ6 and TZ5 in Fireworks mode + # and GX7 in Fantasy/Retro/OldDays/HighKey - PH + # 0x04 - observed in MP4 movie with GM1 (EXIF and 0x39 Contrast "Normal") - PH + 0x05 => 'Normal 2', #forum1194 + 0x06 => 'Medium Low', #PH (FZ18) + 0x07 => 'Medium High', #PH (FZ18) + # 0x08 - GX7 in DynamicMonochrome mode + 0x0d => 'High Dynamic', #PH (FZ47 in ?) + # 0x13 - seen for LX100 (PH) + 0x18 => 'Dynamic Range (film-like)', #forum11194 + 0x2e => 'Match Filter Effects Toy', #forum11194 + 0x37 => 'Match Photo Style L. Monochrome', #forum11194 + # DMC-LC1 values: + 0x100 => 'Low', + 0x110 => 'Normal', + 0x120 => 'High', + } + },{ + Name => 'ContrastMode', + Condition => '$$self{Model} =~ /^DMC-(GF\d+|G2)$/', + Notes => 'these values are used by the G2, GF1, GF2, GF3, GF5 and GF6', + Writable => 'int16u', + PrintConv => { # (decoded for GF1 unless otherwise noted) + 0 => '-2', + 1 => '-1', + 2 => 'Normal', + 3 => '+1', + 4 => '+2', + # Note: Other Contrast tags will be "Normal" in any of these modes: + 5 => 'Normal 2', # 5 - seen for Portrait (FX80) and Normal (GF6) + 7 => 'Nature (Color Film)', # (GF1,G2; GF3 "Miniature") + 9 => 'Expressive', #(GF3) + 12 => 'Smooth (Color Film) or Pure (My Color)', #(GF1,G2 "Smooth Color") + 17 => 'Dynamic (B&W Film)', #(GF1,G2) + 22 => 'Smooth (B&W Film)', #(GF1,G2) + 25 => 'High Dynamic', #(GF5) + 26 => 'Retro', #(GF5) + 27 => 'Dynamic (Color Film)', #(GF1,G2) (GF3 "High Key") + 28 => 'Low Key', #(GF5) + 29 => 'Toy Effect', #(GF5) + 32 => 'Vibrant (Color Film) or Expressive (My Color)', # (GF1; G2 "Vibrant"; GF2,GF5 "Expressive") + 33 => 'Elegant (My Color)', + 37 => 'Nostalgic (Color Film)', # (GF1,G2; GF5 "Sepia") + 41 => 'Dynamic Art (My Color)', # (GF5 "High Key") + 42 => 'Retro (My Color)', + 45 => 'Cinema', #(GF2) + 47 => 'Dynamic Mono', #(GF5) + 50 => 'Impressive Art', #(GF5) + 51 => 'Cross Process', #(GF5) + 100 => 'High Dynamic 2', #Exiv2 (G6) + 101 => 'Retro 2', #Exiv2 (G6) + 102 => 'High Key 2', #Exiv2 (G6) + 103 => 'Low Key 2', #Exiv2 (G6) + 104 => 'Toy Effect 2', #Exiv2 (G6) + 107 => 'Expressive 2', #(GF6) + 112 => 'Sepia', #Exiv2 (G6) + 117 => 'Miniature', #Exiv2 (G6) + 122 => 'Dynamic Monochrome', #(GF6) + 127 => 'Old Days', #Exiv2 (G6) + 132 => 'Dynamic Monochrome 2', #Exiv2 (G6) + 135 => 'Impressive Art 2', #Exiv2 (G6) + 136 => 'Cross Process 2', #Exiv2 (G6) + 137 => 'Toy Pop', #Exiv2 (G6) + 138 => 'Fantasy', #Exiv2 (G6) + 256 => 'Normal 3', #Exiv2 (G6) + 272 => 'Standard', #Exiv2 (G6) + 288 => 'High', #Exiv2 (G6) + # more new modes for GF6: + # ? => 'Old Days', + # ? => 'Toy Pop', + # ? => 'Bleach Bypass', + # ? => 'Fantasy', + # ? => 'Star Filter', + # ? => 'One Point Color', + # ? => 'Sunshine', + }, + },{ + Name => 'ContrastMode', + Condition => '$$self{Model} =~ /^DMC-(TZ10|ZS7)$/', + Notes => 'these values are used by the TZ10 and ZS7', + Writable => 'int16u', + PrintConv => { + 0 => 'Normal', + 1 => '-2', + 2 => '+2', + 5 => '-1', + 6 => '+1', + }, + },{ + Name => 'ContrastMode', + Writable => 'int16u', + }, + ], + 0x2d => { + Name => 'NoiseReduction', + Writable => 'int16u', + Notes => 'the encoding for this value is not consistent between models', + PrintConv => { + 0 => 'Standard', + 1 => 'Low (-1)', + 2 => 'High (+1)', + 3 => 'Lowest (-2)', #JD + 4 => 'Highest (+2)', #JD + 5 => '+5', #PH (NC) + 6 => '+6', # (NC) seen for DC-S1/S1R (IB) + 65531 => '-5', # LX100/FZ2500 "NR1" test shots at imaging-resource (PH) + 65532 => '-4', + 65533 => '-3', + 65534 => '-2', + 65535 => '-1', + }, + }, + 0x2e => { #4 + Name => 'SelfTimer', + Writable => 'int16u', + PrintConv => { + 0 => 'Off (0)', #forum11529 + 1 => 'Off', + 2 => '10 s', + 3 => '2 s', + 4 => '10 s / 3 pictures', #17 + 258 => '2 s after shutter pressed', #forum11194 + 266 => '10 s after shutter pressed', #forum11194 + 778 => '3 photos after 10 s', #forum11194 + }, + }, + # 0x2f - values: 1 (LZ6,FX10K) + 0x30 => { #7 + Name => 'Rotation', + Writable => 'int16u', + PrintConv => { + 1 => 'Horizontal (normal)', + 3 => 'Rotate 180', #PH + 6 => 'Rotate 90 CW', #PH (ref 7 gives 270 CW) + 8 => 'Rotate 270 CW', #PH (ref 7 gives 90 CW) + }, + }, + 0x31 => { #PH (FS7) + Name => 'AFAssistLamp', + Writable => 'int16u', + PrintConv => { + 1 => 'Fired', + 2 => 'Enabled but Not Used', + 3 => 'Disabled but Required', + 4 => 'Disabled and Not Required', + # have seen a value of 5 - PH + # values possibly related to FOC-L? - JD + }, + }, + 0x32 => { #7 + Name => 'ColorMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Normal', + 1 => 'Natural', + 2 => 'Vivid', + # have seen 3 for GF2 - PH + }, + }, + 0x33 => { #JD + Name => 'BabyAge', + Writable => 'string', + Notes => 'or pet age', #PH + PrintConv => '$val eq "9999:99:99 00:00:00" ? "(not set)" : $val', + PrintConvInv => '$val =~ /^\d/ ? $val : "9999:99:99 00:00:00"', + }, + 0x34 => { #7/PH + Name => 'OpticalZoomMode', + Writable => 'int16u', + PrintConv => { + 1 => 'Standard', + 2 => 'Extended', + }, + }, + 0x35 => { #9 + Name => 'ConversionLens', + Writable => 'int16u', + PrintConv => { #PH (unconfirmed) + 1 => 'Off', + 2 => 'Wide', + 3 => 'Telephoto', + 4 => 'Macro', + }, + }, + 0x36 => { #8 + Name => 'TravelDay', + Writable => 'int16u', + PrintConv => '$val == 65535 ? "n/a" : $val', + PrintConvInv => '$val =~ /(\d+)/ ? $1 : $val', + }, + # 0x37 - values: 0,1,2 (LZ6, 0 for movie preview); 257 (FX10K); 0,256 (TZ5, 0 for movie preview) + # --> may indicate battery power (forum11388) + 0x38 => { #forum11388 + Name => 'BatteryLevel', + Writable => 'int16u', + PrintConv => { + 1 => 'Full', + 2 => 'Medium', + 3 => 'Low', + 4 => 'Near Empty', + 7 => 'Near Full', + 8 => 'Medium Low', + 256 => 'n/a', + }, + }, + 0x39 => { #7 (L1/L10) + Name => 'Contrast', + Format => 'int16s', + Writable => 'int16u', + %Image::ExifTool::Exif::printParameter, + }, + 0x3a => { + Name => 'WorldTimeLocation', + Writable => 'int16u', + PrintConv => { + 1 => 'Home', + 2 => 'Destination', + }, + }, + 0x3b => { #PH (TZ5/FS7) + # (tags 0x3b, 0x3e, 0x8008 and 0x8009 have the same values in all my samples - PH) + Name => 'TextStamp', + Writable => 'int16u', + PrintConv => { 1 => 'Off', 2 => 'On' }, + }, + 0x3c => { #PH + Name => 'ProgramISO', # (maybe should rename this ISOSetting?) + Writable => 'int16u', # (new models store a long here) + PrintConv => { + OTHER => sub { shift }, + 65534 => 'Intelligent ISO', #PH (FS7) + 65535 => 'n/a', + -1 => 'n/a', + }, + }, + 0x3d => { #PH + Name => 'AdvancedSceneType', + Writable => 'int16u', + Notes => 'used together with SceneMode to derive Composite AdvancedSceneMode', + # see forum11194 for more info + }, + 0x3e => { #PH (TZ5/FS7) + # (tags 0x3b, 0x3e, 0x8008 and 0x8009 have the same values in all my samples - PH) + Name => 'TextStamp', + Writable => 'int16u', + PrintConv => { 1 => 'Off', 2 => 'On' }, + }, + 0x3f => { #PH (TZ7) + Name => 'FacesDetected', + Writable => 'int16u', + }, + 0x40 => { #7 (L1/L10) + Name => 'Saturation', + Format => 'int16s', + Writable => 'int16u', + %Image::ExifTool::Exif::printParameter, + }, + 0x41 => { #7 (L1/L10) + Name => 'Sharpness', + Format => 'int16s', + Writable => 'int16u', + %Image::ExifTool::Exif::printParameter, + }, + 0x42 => { #7 (DMC-L1) + Name => 'FilmMode', + Writable => 'int16u', + PrintConv => { + 0 => 'n/a', #PH (eg. FZ100 "Photo Frame" ShootingMode) + 1 => 'Standard (color)', + 2 => 'Dynamic (color)', + 3 => 'Nature (color)', + 4 => 'Smooth (color)', + 5 => 'Standard (B&W)', + 6 => 'Dynamic (B&W)', + 7 => 'Smooth (B&W)', + # 8 => 'My Film 1'? (from owner manual) + # 9 => 'My Film 2'? + 10 => 'Nostalgic', #(GH1) + 11 => 'Vibrant', #(GH1) + # 12 => 'Multi Film'? (in the GH1 specs) + }, + }, + 0x43 => { #forum9369 + Name => 'JPEGQuality', + Writable => 'int16u', + PrintConv => { + 0 => 'n/a (Movie)', + 2 => 'High', + 3 => 'Standard', + 6 => 'Very High', + 255 => 'n/a (RAW only)', + }, + }, + 0x44 => { + Name => 'ColorTempKelvin', + Format => 'int16u', + }, + 0x45 => { #19 + Name => 'BracketSettings', + Writable => 'int16u', + PrintConv => { + 0 => 'No Bracket', + 1 => '3 Images, Sequence 0/-/+', + 2 => '3 Images, Sequence -/0/+', + 3 => '5 Images, Sequence 0/-/+', + 4 => '5 Images, Sequence -/0/+', + 5 => '7 Images, Sequence 0/-/+', + 6 => '7 Images, Sequence -/0/+', + }, + }, + 0x46 => { #PH/JD + Name => 'WBShiftAB', + Format => 'int16s', + Writable => 'int16u', + Notes => 'positive is a shift toward blue', + }, + 0x47 => { #PH/JD + Name => 'WBShiftGM', + Format => 'int16s', + Writable => 'int16u', + Notes => 'positive is a shift toward green', + }, + 0x48 => { #17 + Name => 'FlashCurtain', + Writable => 'int16u', + PrintConv => { + 0 => 'n/a', + 1 => '1st', + 2 => '2nd', + }, + }, + 0x49 => { #19 + Name => 'LongExposureNoiseReduction', # (indicates availability, forum11194) + Writable => 'int16u', + PrintConv => { + 1 => 'Off', + 2 => 'On' + } + }, + # 0x4a - int16u: 0 + 0x4b => { #PH + Name => 'PanasonicImageWidth', + Writable => 'int32u', + }, + 0x4c => { #PH + Name => 'PanasonicImageHeight', + Writable => 'int32u', + }, + 0x4d => { #PH (FS7) + Name => 'AFPointPosition', + Writable => 'rational64u', + Count => 2, + Notes => 'X Y coordinates of primary AF area center, in the range 0.0 to 1.0', + PrintConv => q{ + return 'none' if $val eq '16777216 16777216'; + my @a = split ' ', $val; + sprintf("%.2g %.2g",@a); + }, + PrintConvInv => '$val eq "none" ? "16777216 16777216" : $val', + }, + 0x4e => { #PH + Name => 'FaceDetInfo', + PrintConv => 'length $val', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::FaceDetInfo', + }, + }, + # 0x4f,0x50 - int16u: 0 + 0x51 => { + Name => 'LensType', + Writable => 'string', + ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces + ValueConvInv => '$val', + }, + 0x52 => { #7 (DMC-L1) + Name => 'LensSerialNumber', + Writable => 'string', + ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces + ValueConvInv => '$val', + }, + 0x53 => { #7 (DMC-L1) + Name => 'AccessoryType', + Writable => 'string', + ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces + ValueConvInv => '$val', + }, + 0x54 => { #19 + Name => 'AccessorySerialNumber', + Writable => 'string', + ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces + ValueConvInv => '$val', + }, + # 0x55 - int16u: 1 (see forum9372) + # 0x57 - int16u: 0 + 0x59 => { #PH (FS7) + Name => 'Transform', + Writable => 'undef', + Notes => 'decoded as two 16-bit signed integers', + Format => 'int16s', + Count => 2, + PrintConv => { + '-3 2' => 'Slim High', + '-1 1' => 'Slim Low', + '0 0' => 'Off', + '1 1' => 'Stretch Low', + '3 2' => 'Stretch High', + }, + }, + # 0x5a - int16u: 0,2 + # 0x5b - int16u: 0 + # 0x5c - int16u: 0,2 + 0x5d => { #PH (GF1, FZ35) + Name => 'IntelligentExposure', + Notes => 'not valid for some models', # (doesn't change in ZS7 and GH1 images) + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Standard', + 3 => 'High', + }, + }, + # 0x5e,0x5f - undef[4] + 0x60 => { #18 + Name => 'LensFirmwareVersion', + Writable => 'undef', + Format => 'int8u', + Count => 4, + PrintConv => '$val=~tr/ /./; $val', + PrintConvInv => '$val=~tr/./ /; $val', + }, + 0x61 => { #PH + Name => 'FaceRecInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::FaceRecInfo', + }, + }, + 0x62 => { #PH (FS7) + Name => 'FlashWarning', + Writable => 'int16u', + PrintConv => { 0 => 'No', 1 => 'Yes (flash required but disabled)' }, + }, + 0x63 => { #PH + # not sure exactly what this means, but in my samples this is + # FacesRecognized bytes of 0x01, padded with 0x00 to a length of 4 - PH + Name => 'RecognizedFaceFlags', + Format => 'int8u', + Count => 4, + Writable => 'undef', + Unknown => 1, + }, + 0x65 => { #15 + Name => 'Title', + Format => 'string', + Writable => 'undef', # (Count 64) + }, + 0x66 => { #15 + Name => 'BabyName', + Notes => 'or pet name', + Format => 'string', + Writable => 'undef', # (Count 64) + }, + 0x67 => { #15 + Name => 'Location', + Groups => { 2 => 'Location' }, + Format => 'string', + Writable => 'undef', # (Count 64) + }, + # 0x68 - int8u: 1 + 0x69 => { #PH (ZS7) + Name => 'Country', # (Country/Region) + Groups => { 2 => 'Location' }, + Format => 'string', + Writable => 'undef', # (Count 72) + }, + # 0x6a - int8u: 1 + 0x6b => { #PH (ZS7) + Name => 'State', # (State/Province/Count -- what is Count?) + Groups => { 2 => 'Location' }, + Format => 'string', + Writable => 'undef', # (Count 72) + }, + # 0x6c - int8u: 1 + 0x6d => { #PH (ZS7) (also see forum5997) + Name => 'City', # (City/Town) + Groups => { 2 => 'Location' }, + Format => 'string', + Writable => 'undef', # (Count 72) + Notes => 'City/Town as stored by some models, or County/Township for others', + }, + # 0x6e - int8u: 1 + 0x6f => { #PH (ZS7) + Name => 'Landmark', # (Landmark) + Groups => { 2 => 'Location' }, + Format => 'string', + Writable => 'undef', # (Count 128) + }, + 0x70 => { #PH (ZS7) + Name => 'IntelligentResolution', + Writable => 'int8u', + PrintConv => { + 0 => 'Off', + # Note: I think these values make sense for the GH2, but meanings + # may be different for other models + 1 => 'Low', + 2 => 'Standard', + 3 => 'High', + 4 => 'Extended', + }, + }, + # 0x71 - undef[128] (maybe text stamp text?) + 0x77 => { #18 + Name => 'BurstSpeed', + Writable => 'int16u', + Notes => 'images per second', + }, + # 0x72,0x73,0x74,0x75,0x77,0x78: 0 + # 0x76: 0, (3 for G6 with HDR on, ref 18) + 0x76 => { #18/21 + Name => 'HDRShot', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 3 => 'On' }, + }, + 0x79 => { #PH (GH2) + Name => 'IntelligentD-Range', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Standard', + 3 => 'High', + }, + }, + # 0x7a,0x7b: 0 + 0x7c => { #18 + Name => 'ClearRetouch', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x80 => { #forum5997 (seen garbage here for SZ5 - PH) + Name => 'City2', # (City/Town/Village) + Groups => { 2 => 'Location' }, + Format => 'string', + Writable => 'undef', # (Count 72) + Notes => 'City/Town/Village as stored by some models', + }, + # 0x81 - undef[72]: "---" + # 0x82 - undef[72]: "---" + # 0x83 - undef[72]: "---" + # 0x84 - undef[72]: "---" + # 0x85 - undef[128]: "---" + 0x86 => { #http://dev.exiv2.org/issues/825 + Name => 'ManometerPressure', + Writable => 'int16u', + RawConv => '$val==65535 ? undef : $val', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f kPa",$val)', + PrintConvInv => '$val=~s/ ?kPa//i; $val', + }, + 0x89 => { + Name => 'PhotoStyle', + Writable => 'int16u', + PrintConv => { + 0 => 'Auto', + 1 => 'Standard or Custom', + 2 => 'Vivid', + 3 => 'Natural', + 4 => 'Monochrome', + 5 => 'Scenery', + 6 => 'Portrait', + 8 => 'Cinelike D', #forum11194 + 9 => 'Cinelike V', #forum11194 + 11 => 'L. Monochrome', #forum11194 + 15 => 'L. Monochrome D', #forum11194 + }, + }, + 0x8a => { #18 + Name => 'ShadingCompensation', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On' + } + }, + 0x8b => { #21 + Name => 'WBShiftIntelligentAuto', + Writable => 'int16u', + Format => 'int16s', + Notes => 'value is -9 for blue to +9 for amber. Valid for Intelligent-Auto modes', + }, + 0x8c => { + Name => 'AccelerometerZ', + Writable => 'int16u', + Format => 'int16s', + Notes => 'positive is acceleration upwards', + }, + 0x8d => { + Name => 'AccelerometerX', + Writable => 'int16u', + Format => 'int16s', + Notes => 'positive is acceleration to the left', + }, + 0x8e => { + Name => 'AccelerometerY', + Writable => 'int16u', + Format => 'int16s', + Notes => 'positive is acceleration backwards', + }, + 0x8f => { #18 + Name => 'CameraOrientation', + Writable => 'int8u', + PrintConv => { + 0 => 'Normal', + 1 => 'Rotate CW', + 2 => 'Rotate 180', + 3 => 'Rotate CCW', + 4 => 'Tilt Upwards', + 5 => 'Tilt Downwards' + } + }, + 0x90 => { + Name => 'RollAngle', + Writable => 'int16u', + Format => 'int16s', + Notes => 'converted to degrees of clockwise camera rotation', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + }, + 0x91 => { + Name => 'PitchAngle', + Writable => 'int16u', + Format => 'int16s', + Notes => 'converted to degrees of upward camera tilt', + ValueConv => '-$val / 10', + ValueConvInv => '-$val * 10', + }, + 0x92 => { #21 (forum9453) (more to decode in forum11194) + Name => 'WBShiftCreativeControl', + Writable => 'int8u', + Format => 'int8s', + Notes => 'WB shift or style strength. Valid for Creative-Control modes', + }, + 0x93 => { #18 + Name => 'SweepPanoramaDirection', + Writable => 'int8u', + PrintConv => { + 0 => 'Off', + 1 => 'Left to Right', + 2 => 'Right to Left', + 3 => 'Top to Bottom', + 4 => 'Bottom to Top' + } + }, + 0x94 => { #18 + Name => 'SweepPanoramaFieldOfView', + Writable => 'int16u' + }, + 0x96 => { #18 + Name => 'TimerRecording', + Writable => 'int8u', + PrintConv => { + 0 => 'Off', + 1 => 'Time Lapse', + 2 => 'Stop-motion Animation', + 3 => 'Focus Bracketing', #forum11194 + }, + }, + 0x9d => { #18 + Name => 'InternalNDFilter', + Writable => 'rational64u' + }, + 0x9e => { #18 + Name => 'HDR', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 100 => '1 EV', + 200 => '2 EV', + 300 => '3 EV', + 32868 => '1 EV (Auto)', + 32968 => '2 EV (Auto)', + 33068 => '3 EV (Auto)', + }, + }, + 0x9f => { #18 + Name => 'ShutterType', + Writable => 'int16u', + PrintConv => { + 0 => 'Mechanical', + 1 => 'Electronic', + 2 => 'Hybrid', #PH (GM1, 1st curtain electronic, 2nd curtain mechanical) + }, + }, + # 0xa0 - undef[32]: AWB gains and black levels (ref forum9303) + 0xa1 => { #forum11194 + Name => 'FilterEffect', + Writable => 'rational64u', + Format => 'int32u', + PrintConv => { + '0 0' => 'Expressive', + # '0 1' => have seen this for XS1 (PH) + '0 2' => 'Retro', + '0 4' => 'High Key', + '0 8' => 'Sepia', + '0 16' => 'High Dynamic', + '0 32' => 'Miniature Effect', + '0 256' => 'Low Key', + '0 512' => 'Toy Effect', + '0 1024' => 'Dynamic Monochrome', + '0 2048' => 'Soft Focus', + '0 4096' => 'Impressive Art', + '0 8192' => 'Cross Process', + '0 16384' => 'One Point Color', + '0 32768' => 'Star Filter', + '0 524288' => 'Old Days', + '0 1048576' => 'Sunshine', + '0 2097152' => 'Bleach Bypass', + '0 4194304' => 'Toy Pop', + '0 8388608' => 'Fantasy', + '0 33554432' => 'Monochrome', + '0 67108864' => 'Rough Monochrome', + '0 134217728' => 'Silky Monochrome', + }, + }, + 0xa3 => { #18 + Name => 'ClearRetouchValue', + Writable => 'rational64u', + # undef if ClearRetouch is off, 0 if it is on + }, + 0xa7 => { #forum9374 (conversion table for 14- to 16-bit mapping) + Name => 'OutputLUT', + Binary => 1, + Notes => q{ + 2-column by 432-row binary lookup table of unsigned short values for + converting to 16-bit output (1st column) from 14 bits (2nd column) with + camera contrast + }, + }, + 0xab => { #18 + Name => 'TouchAE', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0xac => { #forum11194 + Name => 'MonochromeFilterEffect', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'Yellow', 2 => 'Orange', 3 => 'Red', 4 => 'Green' }, + }, + 0xad => { #forum9360 + Name => 'HighlightShadow', + Writable => 'int16u', + Format => 'int16s', #forum11194 + Count => 2, + }, + 0xaf => { #PH (is this in UTC maybe? -- sometimes different time zone other times) + Name => 'TimeStamp', + Writable => 'string', + Groups => { 2 => 'Time' }, + Shift => 'Time', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + 0xb3 => { #forum11194 + Name => 'VideoBurstResolution', + Writable => 'int16u', + PrintConv => { 1 => 'Off or 4K', 4 => '6K' }, + }, + 0xb4 => { #forum9429 + Name => 'MultiExposure', + Writable => 'int16u', + PrintConv => { 0 => 'n/a', 1 => 'Off', 2 => 'On' }, + }, + 0xb9 => { #forum9425 + Name => 'RedEyeRemoval', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0xbb => { #forum9282 + Name => 'VideoBurstMode', + Writable => 'int32u', + PrintHex => 1, + PrintConv => { + 0x01 => 'Off', + 0x04 => 'Post Focus', + 0x18 => '4K Burst', + 0x28 => '4K Burst (Start/Stop)', + 0x48 => '4K Pre-burst', + 0x108 => 'Loop Recording', + 0x810 => '6K Burst', + 0x820 => '6K Burst (Start/Stop)', + 0x408 => 'Focus Stacking', #forum11563 + 0x1001 => 'High Resolution Mode', + }, + }, + 0xbc => { #forum9282 + Name => 'DiffractionCorrection', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'Auto' }, + }, + 0xbd => { #forum11194 + Name => 'FocusBracket', + Notes => 'positive is further, negative is closer', + Writable => 'int16u', + Format => 'int16s', + }, + 0xbe => { #forum11194 + Name => 'LongExposureNRUsed', + Writable => 'int16u', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0xbf => { #forum11194 + Name => 'PostFocusMerging', + Format => 'int32u', + Count => 2, + PrintConv => { '0 0' => 'Post Focus Auto Merging or None' }, + }, + 0xc1 => { #forum11194 + Name => 'VideoPreburst', + Writable => 'int16u', + PrintConv => { 0 => 'No', 1 => '4K or 6K' }, + }, + 0xca => { #forum11459 + Name => 'SensorType', + Writable => 'int16u', + PrintConv => { + 0 => 'Multi-aspect', + 1 => 'Standard', + }, + }, + # Note: LensTypeMake and LensTypeModel are combined into a Composite LensType tag + # defined in Olympus.pm which has the same values as Olympus:LensType + 0xc4 => { #PH + Name => 'LensTypeMake', + Condition => '$format eq "int16u" and $$valPt ne "\xff\xff"', # (ignore make 65535 for now) + Writable => 'int16u', + }, + 0xc5 => { #PH + Name => 'LensTypeModel', + Condition => '$format eq "int16u"', + Writable => 'int16u', + RawConv => q{ + return undef unless $val; + require Image::ExifTool::Olympus; # (to load Composite LensID) + return $val; + }, + ValueConv => '$_=sprintf("%.4x",$val); s/(..)(..)/$2 $1/; $_', + ValueConvInv => '$val =~ s/(..) (..)/$2$1/; hex($val)', + }, + 0xd1 => { #PH + Name => 'ISO', + RawConv => '$val > 0xfffffff0 ? undef : $val', + Writable => 'int32u', + }, + 0xd2 => { #forum11194 + Name => 'MonochromeGrainEffect', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Standard', + 3 => 'High', + }, + }, + 0xd6 => { #PH (DC-S1) + Name => 'NoiseReductionStrength', + Writable => 'rational64s', + }, + 0xe4 => { #IB + Name => 'LensTypeModel', + Condition => '$format eq "int16u"', + Writable => 'int16u', + RawConv => q{ + return undef unless $val; + require Image::ExifTool::Olympus; # (to load Composite LensID) + return $val; + }, + ValueConv => '$_=sprintf("%.4x",$val); s/(..)(..)/$2 $1/; $_', + ValueConvInv => '$val =~ s/(..) (..)/$2$1/; hex($val)', + }, + 0x0e00 => { + Name => 'PrintIM', + Description => 'Print Image Matching', + Writable => 0, + SubDirectory => { TagTable => 'Image::ExifTool::PrintIM::Main' }, + }, + 0x2003 => { #21 + Name => 'TimeInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::TimeInfo' }, + }, + 0x8000 => { #PH + Name => 'MakerNoteVersion', + Format => 'undef', + }, + 0x8001 => { #7/PH/JD + Name => 'SceneMode', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Off', + %shootingMode, + }, + }, + 0x8002 => { #21 + Name => 'HighlightWarning', + Writable => 'int16u', + PrintConv => { 0 => 'Disabled', 1 => 'No', 2 => 'Yes' }, + }, + 0x8003 => { #21 + Name => 'DarkFocusEnvironment', + Writable => 'int16u', + PrintConv => { 1 => 'No', 2 => 'Yes' }, + }, + 0x8004 => { #PH/JD + Name => 'WBRedLevel', + Writable => 'int16u', + }, + 0x8005 => { #PH/JD + Name => 'WBGreenLevel', + Writable => 'int16u', + }, + 0x8006 => { #PH/JD + Name => 'WBBlueLevel', + Writable => 'int16u', + }, + #0x8007 => { #PH - questionable [disabled because it conflicts with EXIF in too many samples] + # Name => 'FlashFired', + # Writable => 'int16u', + # PrintConv => { 0 => 'Yes', 1 => 'No' }, + #}, + 0x8008 => { #PH (TZ5/FS7) + # (tags 0x3b, 0x3e, 0x8008 and 0x8009 have the same values in all my samples - PH) + Name => 'TextStamp', + Writable => 'int16u', + PrintConv => { 1 => 'Off', 2 => 'On' }, + }, + 0x8009 => { #PH (TZ5/FS7) + # (tags 0x3b, 0x3e, 0x8008 and 0x8009 have the same values in all my samples - PH) + Name => 'TextStamp', + Writable => 'int16u', + PrintConv => { 1 => 'Off', 2 => 'On' }, + }, + 0x8010 => { #PH + Name => 'BabyAge', + Writable => 'string', + Notes => 'or pet age', + PrintConv => '$val eq "9999:99:99 00:00:00" ? "(not set)" : $val', + PrintConvInv => '$val =~ /^\d/ ? $val : "9999:99:99 00:00:00"', + }, + 0x8012 => { #PH (FS7) + Name => 'Transform', + Writable => 'undef', + Notes => 'decoded as two 16-bit signed integers', + Format => 'int16s', + Count => 2, + PrintConv => { + '-3 2' => 'Slim High', + '-1 1' => 'Slim Low', + '0 0' => 'Off', + '1 1' => 'Stretch Low', + '3 2' => 'Stretch High', + }, + }, +); + +# Leica type2 maker notes (ref 10) +%Image::ExifTool::Panasonic::Leica2 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, + WRITABLE => 1, + NOTES => 'These tags are used by the Leica M8.', + 0x300 => { + Name => 'Quality', + Writable => 'int16u', + PrintConv => { + 1 => 'Fine', + 2 => 'Basic', + }, + }, + 0x302 => { + Name => 'UserProfile', + Writable => 'int32u', + PrintConv => { + 1 => 'User Profile 1', + 2 => 'User Profile 2', + 3 => 'User Profile 3', + 4 => 'User Profile 0 (Dynamic)', + }, + }, + 0x303 => { + Name => 'SerialNumber', + Writable => 'int32u', + PrintConv => 'sprintf("%.7d", $val)', + PrintConvInv => '$val', + }, + 0x304 => { + Name => 'WhiteBalance', + Writable => 'int16u', + Notes => 'values above 0x8000 are converted to Kelvin color temperatures', + PrintConv => { + 0 => 'Auto or Manual', + 1 => 'Daylight', + 2 => 'Fluorescent', + 3 => 'Tungsten', + 4 => 'Flash', + 10 => 'Cloudy', + 11 => 'Shade', + OTHER => \&WhiteBalanceConv, + }, + }, + 0x310 => { + Name => 'LensType', + Writable => 'int32u', + SeparateTable => 1, + ValueConv => '($val >> 2) . " " . ($val & 0x3)', + ValueConvInv => \&LensTypeConvInv, + PrintConv => \%leicaLensTypes, + }, + 0x311 => { + Name => 'ExternalSensorBrightnessValue', + Format => 'rational64s', # (incorrectly unsigned in JPEG images) + Writable => 'rational64s', + Notes => '"blue dot" measurement', + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + }, + 0x312 => { + Name => 'MeasuredLV', + Format => 'rational64s', # (incorrectly unsigned in JPEG images) + Writable => 'rational64s', + Notes => 'imaging sensor or TTL exposure meter measurement', + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + }, + 0x313 => { + Name => 'ApproximateFNumber', + Writable => 'rational64u', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0x320 => { + Name => 'CameraTemperature', + Writable => 'int32s', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 0x321 => { Name => 'ColorTemperature', Writable => 'int32u' }, + 0x322 => { Name => 'WBRedLevel', Writable => 'rational64u' }, + 0x323 => { Name => 'WBGreenLevel', Writable => 'rational64u' }, + 0x324 => { Name => 'WBBlueLevel', Writable => 'rational64u' }, + 0x325 => { + Name => 'UV-IRFilterCorrection', + Description => 'UV/IR Filter Correction', + Writable => 'int32u', + PrintConv => { + 0 => 'Not Active', + 1 => 'Active', + }, + }, + 0x330 => { Name => 'CCDVersion', Writable => 'int32u' }, + 0x331 => { Name => 'CCDBoardVersion', Writable => 'int32u' }, + 0x332 => { Name => 'ControllerBoardVersion', Writable => 'int32u' }, + 0x333 => { Name => 'M16CVersion', Writable => 'int32u' }, + 0x340 => { Name => 'ImageIDNumber', Writable => 'int32u' }, +); + +# Leica type3 maker notes (ref PH) +%Image::ExifTool::Panasonic::Leica3 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, + WRITABLE => 1, + NOTES => 'These tags are used by the Leica R8 and R9 digital backs.', + 0x0b => { #IB + Name => 'SerialInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::SerialInfo' }, + }, + 0x0d => { + Name => 'WB_RGBLevels', + Writable => 'int16u', + Count => 3, + }, +); + +# Leica serial number info (ref IB) +%Image::ExifTool::Panasonic::SerialInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, + TAG_PREFIX => 'Leica_SerialInfo', + FIRST_ENTRY => 0, + 4 => { + Name => 'SerialNumber', + Format => 'string[8]', + } +); + +# Leica type4 maker notes (ref PH) (M9) +%Image::ExifTool::Panasonic::Leica4 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, + WRITABLE => 1, + NOTES => 'This information is written by the M9.', + 0x3000 => { + Name => 'Subdir3000', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Subdir', + ByteOrder => 'Unknown', + }, + }, + 0x3100 => { + Name => 'Subdir3100', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Subdir', + ByteOrder => 'Unknown', + }, + }, + 0x3400 => { + Name => 'Subdir3400', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Subdir', + ByteOrder => 'Unknown', + }, + }, + 0x3900 => { + Name => 'Subdir3900', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Subdir', + ByteOrder => 'Unknown', + }, + }, +); + +# Leica M9 SubDirectory tags (ref PH) +%Image::ExifTool::Panasonic::Subdir = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, + TAG_PREFIX => 'Leica_Subdir', + WRITABLE => 1, + # 0x3001 - normally 0 but value of 2 when manual coding is used + # with a coded lens (but only tested with Elmar-M 50mm f/2.8) - PH + 0x300a => { + Name => 'Contrast', + Writable => 'int32u', + PrintConv => { + 0 => 'Low', + 1 => 'Medium Low', + 2 => 'Normal', + 3 => 'Medium High', + 4 => 'High', + }, + }, + 0x300b => { + Name => 'Sharpening', + Writable => 'int32u', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Normal', + 3 => 'Medium High', + 4 => 'High', + }, + }, + 0x300d => { + Name => 'Saturation', + Writable => 'int32u', + PrintConv => { + 0 => 'Low', + 1 => 'Medium Low', + 2 => 'Normal', + 3 => 'Medium High', + 4 => 'High', + 5 => 'Black & White', + 6 => 'Vintage B&W', + }, + }, + # 0x3032 - some sort of RGB coefficients? (zeros unless Kelvin WB, but same for all Color Temps) + 0x3033 => { + Name => 'WhiteBalance', + Writable => 'int32u', + PrintConv => { #13 + 0 => 'Auto', + 1 => 'Tungsten', + 2 => 'Fluorescent', + 3 => 'Daylight Fluorescent', + 4 => 'Daylight', + 5 => 'Flash', + 6 => 'Cloudy', + 7 => 'Shade', + 8 => 'Manual', + 9 => 'Kelvin', + }, + }, + 0x3034 => { + Name => 'JPEGQuality', + Writable => 'int32u', + PrintConv => { + 94 => 'Basic', + 97 => 'Fine', + }, + }, + # 0x3035 (int32u): -1 unless Manual WB (2 in my Manual sample) + 0x3036 => { + Name => 'WB_RGBLevels', + Writable => 'rational64u', + Count => 3, + }, + 0x3038 => { + Name => 'UserProfile', # (CameraProfile according to ref 14) + Writable => 'string', + }, + 0x303a => { + Name => 'JPEGSize', + Writable => 'int32u', + PrintConv => { + 0 => '5216x3472', + 1 => '3840x2592', + 2 => '2592x1728', + 3 => '1728x1152', + 4 => '1280x864', + }, + }, + 0x3103 => { #13 (valid for FW 1.116 and later) + Name => 'SerialNumber', + Writable => 'string', + }, + # 0x3104 body-dependent string ("00012905000000") (not serial number) + # 0x3105 body-dependent string ("00012905000000") + # 0x3107 - body-dependent string ("4H205800116800") (not serial number) + 0x3109 => { + Name => 'FirmwareVersion', + Writable => 'string', + }, + 0x312a => { #14 (NC) + Name => 'BaseISO', + Writable => 'int32u', + }, + 0x312b => { + Name => 'SensorWidth', + Writable => 'int32u', + }, + 0x312c => { + Name => 'SensorHeight', + Writable => 'int32u', + }, + 0x312d => { #14 (NC) + Name => 'SensorBitDepth', + Writable => 'int32u', + }, + 0x3402 => { #PH/13 + Name => 'CameraTemperature', + Writable => 'int32s', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 0x3405 => { + Name => 'LensType', + Writable => 'int32u', + SeparateTable => 1, + ValueConv => '($val >> 2) . " " . ($val & 0x3)', + ValueConvInv => \&LensTypeConvInv, + PrintConv => \%leicaLensTypes, + }, + 0x3406 => { #PH/13 + Name => 'ApproximateFNumber', + Writable => 'rational64u', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0x3407 => { #14 + Name => 'MeasuredLV', + Writable => 'int32s', + Notes => 'imaging sensor or TTL exposure meter measurement', + ValueConv => '$val / 1e5', #PH (NC) + ValueConvInv => '$val * 1e5', #PH (NC) + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + }, + 0x3408 => { #14 + Name => 'ExternalSensorBrightnessValue', + Writable => 'int32s', + Notes => '"blue dot" measurement', + ValueConv => '$val / 1e5', #PH (NC) + ValueConvInv => '$val * 1e5', #PH (NC) + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + }, + 0x3901 => { + Name => 'Data1', + SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::Data1' }, + }, + 0x3902 => { + Name => 'Data2', + SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::Data2' }, + }, + # 0x3903 - larger binary data block +); + +# time stamp information (ref 21) +%Image::ExifTool::Panasonic::TimeInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 1 => 'Panasonic', 2 => 'Image' }, + FIRST_ENTRY => 0, + WRITABLE => 1, + 0 => { + Name => 'PanasonicDateTime', + Groups => { 2 => 'Time' }, + Shift => 'Time', + Format => 'undef[8]', + RawConv => '$val =~ /^\0/ ? undef : $val', + ValueConv => 'sprintf("%s:%s:%s %s:%s:%s.%s", unpack "H4H2H2H2H2H2H2", $val)', + ValueConvInv => q{ + $val =~ s/[-+].*//; # remove time zone + $val =~ tr/0-9//dc; # remove non-digits + $val = pack("H*",$val); + $val .= "\0" while length $val < 8; + return $val; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + # 8 - 8 bytes usually 8 x 0xff (spot for another date/time?) + 16 => { + Name => 'TimeLapseShotNumber', + Format => 'int32u', + }, +); + +%Image::ExifTool::Panasonic::Data1 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, + WRITABLE => 1, + TAG_PREFIX => 'Leica_Data1', + FIRST_ENTRY => 0, + 0x0016 => { + Name => 'LensType', + Format => 'int32u', + Priority => 0, + SeparateTable => 1, + ValueConv => '(($val >> 2) & 0xffff) . " " . ($val & 0x3)', + ValueConvInv => \&LensTypeConvInv, + PrintConv => \%leicaLensTypes, + }, +); + +%Image::ExifTool::Panasonic::Data2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, + TAG_PREFIX => 'Leica_Data2', + FIRST_ENTRY => 0, +); + +# Leica type5 maker notes (ref PH) (X1) +%Image::ExifTool::Panasonic::Leica5 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, + WRITABLE => 1, + PRIORITY => 0, + NOTES => 'This information is written by the X1, X2, X VARIO and T.', + 0x0303 => { + Name => 'LensType', + Condition => '$format eq "string"', + Notes => 'Leica T only', + Writable => 'string', + }, + # 0x0304 - int8u[1]: may be M-lens ID for Leica SL, mounted through "M-adapter L" (ref IB) + # --> int8u[4] for some models (maybe not lens ID for these?) - PH + # (see http://us.leica-camera.com/Photography/Leica-APS-C/Lenses-for-Leica-TL/L-Adapters/M-Adapter-L) + # 58 = 'Leica Noctilux-M 75mm F1.25 ASPH (Typ 601) on Leica SL + 0x0305 => { #IB + Name => 'SerialNumber', + Writable => 'int32u', + }, + # 0x0406 - saturation or sharpness + 0x0407 => { Name => 'OriginalFileName', Writable => 'string' }, + 0x0408 => { Name => 'OriginalDirectory',Writable => 'string' }, + 0x040a => { #IB + Name => 'FocusInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::FocusInfo' }, + }, + # 0x040b - related to white balance + 0x040d => { + Name => 'ExposureMode', + Format => 'int8u', + Count => 4, + PrintConv => { + '0 0 0 0' => 'Program AE', + # '0 1 0 0' - seen for X (Typ 113) - PH + '1 0 0 0' => 'Aperture-priority AE', + '1 1 0 0' => 'Aperture-priority AE (1)', # (see for Leica T) + '2 0 0 0' => 'Shutter speed priority AE', #(guess) + '3 0 0 0' => 'Manual', + }, + }, + 0x0410 => { + Name => 'ShotInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::ShotInfo' }, + }, + # 0x0410 - int8u[16]: first byte is FileNumber + # 0x0411 - int8u[4]: first number is FilmMode (1=Standard,2=Vivid,3=Natural,4=BW Natural,5=BW High Contrast) + 0x0412 => { Name => 'FilmMode', Writable => 'string' }, + 0x0413 => { Name => 'WB_RGBLevels', Writable => 'rational64u', Count => 3 }, + 0x0500 => { + Name => 'InternalSerialNumber', + Writable => 'undef', + PrintConv => q{ + return $val unless $val=~/^(.{3})(\d{2})(\d{2})(\d{2})(\d{4})/; + my $yr = $2 + ($2 < 70 ? 2000 : 1900); + return "($1) $yr:$3:$4 no. $5"; + }, + PrintConvInv => '$_=$val; tr/A-Z0-9//dc; s/(.{3})(19|20)/$1/; $_', + }, +); + +# Leica type5 ShotInfo (ref PH) (X2) +%Image::ExifTool::Panasonic::ShotInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, + TAG_PREFIX => 'Leica_ShotInfo', + FIRST_ENTRY => 0, + WRITABLE => 1, + 0 => { + Name => 'FileIndex', + Format => 'int16u', + }, +); + +# Leica type5 FocusInfo (ref IB) +%Image::ExifTool::Panasonic::FocusInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, + TAG_PREFIX => 'Leica_FocusInfo', + FIRST_ENTRY => 0, + WRITABLE => 1, + FORMAT => 'int16u', + 0 => { + Name => 'FocusDistance', + ValueConv => '$val / 1000', + ValueConvInv => '$val * 1000', + PrintConv => '$val < 65535 ? "$val m" : "inf"', + PrintConvInv => '$val =~ s/ ?m$//; IsFloat($val) ? $val : 65535', + }, + 1 => { + Name => 'FocalLength', + Priority => 0, + RawConv => '$val ? $val : undef', + ValueConv => '$val / 1000', + ValueConvInv => '$val * 1000', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, +); + +# Leica type6 maker notes (ref PH) (S2) +%Image::ExifTool::Panasonic::Leica6 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, + NOTES => q{ + This information is written by the S2 and M (Typ 240), as a trailer in JPEG + images. + }, + 0x300 => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Writable => 'undef', + Notes => 'S2 and M (Typ 240)', + DataTag => 'PreviewImage', + RawConv => q{ + return \$val if $val =~ /^Binary/; + return \$val if $val =~ /^\xff\xd8\xff/; + $$self{PreviewError} = 1 unless $val eq 'none'; + return undef; + }, + ValueConvInv => '$val || "none"', + WriteCheck => 'return $val=~/^(none|\xff\xd8\xff)/s ? undef : "Not a valid image"', + ChangeBase => '$dirStart + $dataPos - 8', + }, + 0x301 => { + Name => 'UnknownBlock', + Notes => 'unknown 320kB block, not copied to JPEG images', + Flags => [ 'Unknown', 'Binary', 'Drop' ], + }, + # 0x302 - same value as 4 unknown bytes at the end of JPEG or after the DNG TIFF header (ImageID, ref IB) + 0x303 => { + Name => 'LensType', + Writable => 'string', + ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces + ValueConvInv => '$val', + }, + 0x304 => { #IB + Name => 'FocusDistance', + Notes => 'focus distance in mm for most models, but cm for others', + Writable => 'int32u', + }, + 0x311 => { + Name => 'ExternalSensorBrightnessValue', + Condition => '$$self{Model} =~ /Typ 006/', + Notes => 'Leica S only', + Format => 'rational64s', # (may be incorrectly unsigned in JPEG images) + Writable => 'rational64s', + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + }, + 0x312 => { + Name => 'MeasuredLV', + Condition => '$$self{Model} =~ /Typ 006/', + Notes => 'Leica S only', + Format => 'rational64s', # (may be incorrectly unsigned in JPEG images) + Writable => 'rational64s', + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + }, + 0x320 => { + Name => 'FirmwareVersion', + Condition => '$$self{Model} =~ /Typ 006/', + Notes => 'Leica S only', + Writable => 'int8u', + Count => 4, + PrintConv => '$val=~tr/ /./; $val', + PrintConvInv => '$val=~tr/./ /; $val', + }, + 0x321 => { #IB + Name => 'LensSerialNumber', + Condition => '$$self{Model} =~ /Typ 006/', + Notes => 'Leica S only', + Writable => 'int32u', + PrintConv => 'sprintf("%.10d",$val)', + PrintConvInv => '$val', + }, + # 0x321 - SerialNumber for Leica S? (ref IB) + # 0x340 - same as 0x302 (ImageID, ref IB) +); + +# Leica type9 maker notes (ref IB) (S) +%Image::ExifTool::Panasonic::Leica9 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, + NOTES => 'This information is written by the Leica S (Typ 007) and M10 models.', + 0x304 => { + Name => 'FocusDistance', + Notes => 'focus distance in mm for most models, but cm for others', + Writable => 'int32u', + }, + 0x311 => { + Name => 'ExternalSensorBrightnessValue', + Format => 'rational64s', # (may be incorrectly unsigned in JPEG images) + Writable => 'rational64s', + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + }, + 0x312 => { + Name => 'MeasuredLV', + Format => 'rational64s', # (may be incorrectly unsigned in JPEG images) + Writable => 'rational64s', + PrintConv => 'sprintf("%.2f", $val)', + PrintConvInv => '$val', + }, + # 0x340 - ImageUniqueID + 0x34c => { #23 + Name => 'UserProfile', + Writable => 'string', + }, + # 0x357 int32u - 0=DNG, 3162=JPG (ref 23) + 0x359 => { #23 + Name => 'ISOSelected', + Writable => 'int32s', + PrintConv => { + 0 => 'Auto', + OTHER => sub { return shift; }, + }, + }, + 0x35a => { #23 + Name => 'FNumber', + Writable => 'int32s', + ValueConv => '$val / 1000', + ValueConvInv => '$val * 1000', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 0x035b => { #IB + Name => 'CorrelatedColorTemp', # (in Kelvin) + Writable => 'int16u', + }, + 0x035c => { #IB + Name => 'ColorTint', # (same units as Adobe is using) + Writable => 'int16s', + }, + 0x035d => { #IB + Name => 'WhitePoint', # (x/y) + Writable => 'rational64u', + Count => 2, + }, +); + +# Type 2 tags (ref PH) +%Image::ExifTool::Panasonic::Type2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + FIRST_ENTRY => 0, + FORMAT => 'int16u', + NOTES => q{ + This type of maker notes is used by models such as the NV-DS65, PV-D2002, + PV-DC3000, PV-DV203, PV-DV401, PV-DV702, PV-L2001, PV-SD4090, PV-SD5000 and + iPalm. + }, + 0 => { + Name => 'MakerNoteType', + Format => 'string[4]', + }, + # seems to vary inversely with amount of light, so I'll call it 'Gain' - PH + # (minimum is 16, maximum is 136. Value is 0 for pictures captured from video) + 3 => 'Gain', +); + +# Face detection position information (ref PH) +%Image::ExifTool::Panasonic::FaceDetInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + WRITABLE => 1, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + DATAMEMBER => [ 0 ], + NOTES => 'Face detection position information.', + 0 => { + Name => 'NumFacePositions', + Format => 'int16u', + DataMember => 'NumFacePositions', + RawConv => '$$self{NumFacePositions} = $val', + Notes => q{ + number of detected face positions stored in this record. May be less than + FacesDetected + }, + }, + 1 => { + Name => 'Face1Position', + Format => 'int16u[4]', + RawConv => '$$self{NumFacePositions} < 1 ? undef : $val', + Notes => q{ + 4 numbers: X/Y coordinates of the face center and width/height of face. + Coordinates are relative to an image twice the size of the thumbnail, or 320 + pixels wide + }, + }, + 5 => { + Name => 'Face2Position', + Format => 'int16u[4]', + RawConv => '$$self{NumFacePositions} < 2 ? undef : $val', + }, + 9 => { + Name => 'Face3Position', + Format => 'int16u[4]', + RawConv => '$$self{NumFacePositions} < 3 ? undef : $val', + }, + 13 => { + Name => 'Face4Position', + Format => 'int16u[4]', + RawConv => '$$self{NumFacePositions} < 4 ? undef : $val', + }, + 17 => { + Name => 'Face5Position', + Format => 'int16u[4]', + RawConv => '$$self{NumFacePositions} < 5 ? undef : $val', + }, +); + +# Face recognition information from DMC-TZ7 (ref PH) +%Image::ExifTool::Panasonic::FaceRecInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + WRITABLE => 1, + FIRST_ENTRY => 0, + DATAMEMBER => [ 0 ], + NOTES => q{ + Tags written by cameras with facial recognition. These cameras not only + detect faces in an image, but also recognize specific people based a + user-supplied set of known faces. + }, + 0 => { + Name => 'FacesRecognized', + Format => 'int16u', + DataMember => 'FacesRecognized', + RawConv => '$$self{FacesRecognized} = $val', + }, + 4 => { + Name => 'RecognizedFace1Name', + Format => 'string[20]', + RawConv => '$$self{FacesRecognized} < 1 ? undef : $val', + }, + 24 => { + Name => 'RecognizedFace1Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesRecognized} < 1 ? undef : $val', + Notes => 'coordinates in same format as face detection tags above', + }, + 32 => { + Name => 'RecognizedFace1Age', + Format => 'string[20]', + RawConv => '$$self{FacesRecognized} < 1 ? undef : $val', + }, + 52 => { + Name => 'RecognizedFace2Name', + Format => 'string[20]', + RawConv => '$$self{FacesRecognized} < 2 ? undef : $val', + }, + 72 => { + Name => 'RecognizedFace2Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesRecognized} < 2 ? undef : $val', + }, + 80 => { + Name => 'RecognizedFace2Age', + Format => 'string[20]', + RawConv => '$$self{FacesRecognized} < 2 ? undef : $val', + }, + 100 => { + Name => 'RecognizedFace3Name', + Format => 'string[20]', + RawConv => '$$self{FacesRecognized} < 3 ? undef : $val', + }, + 120 => { + Name => 'RecognizedFace3Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesRecognized} < 3 ? undef : $val', + }, + 128 => { + Name => 'RecognizedFace3Age', + Format => 'string[20]', + RawConv => '$$self{FacesRecognized} < 3 ? undef : $val', + }, +); + +# PANA atom found in user data of MP4 videos (ref PH) +%Image::ExifTool::Panasonic::PANA = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + NOTES => q{ + Tags extracted from the PANA and LEIC user data found in MP4 videos from + various Panasonic and Leica models. + }, + 0x00 => { + Name => 'Make', + Condition => '$$valPt =~ /^(LEICA|Panasonic)/', # (only seen "LEICA") + Groups => { 2 => 'Camera' }, + Format => 'string[22]', + RawConv => '$$self{LeicaLEIC} = 1;$$self{Make} = $val', + }, + 0x04 => { + Name => 'Model', + Condition => '$$valPt =~ /^[^\0]{6}/ and not $$self{LeicaLEIC}', + Description => 'Camera Model Name', + Groups => { 2 => 'Camera' }, + Format => 'string[16]', + RawConv => '$$self{Model} = $val', + }, + 0x0c => { # (FZ1000) + Name => 'Model', + Condition => '$$valPt =~ /^[^\0]{6}/ and not $$self{LeicaLEIC} and not $$self{Model}', + Description => 'Camera Model Name', + Groups => { 2 => 'Camera' }, + Format => 'string[16]', + RawConv => '$$self{Model} = $val', + }, + 0x10 => { # (DC-FT7) + Name => 'JPEG-likeData', + # looks like a JPEG preview, but not a well-formed JPEG file + Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s', + Format => 'undef[$size-0x10]', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + Start => 12, + }, + }, + 0x16 => { + Name => 'Model', + Condition => '$$self{LeicaLEIC}', + Description => 'Camera Model Name', + Groups => { 2 => 'Camera' }, + Format => 'string[30]', + RawConv => '$$self{Model} = $val', + }, + 0x40 => { + Name => 'ThumbnailTest', + Format => 'undef[0x600]', + Hidden => 1, + RawConv => q{ + if (substr($val,0x1c,3) eq "\xff\xd8\xff") { # offset 0x5c + $$self{ThumbType} = 1; + } elsif (substr($val,0x506,3) eq "\xff\xd8\xff") { # offset 0x546 + $$self{ThumbType} = 2; + } elsif (substr($val,0x51e,3) eq "\xff\xd8\xff") { # offset 0x55e (Leica T) + $$self{ThumbType} = 3; + } else { + $$self{ThumbType} = 0; + } + return undef; + }, + }, + 0x34 => { + Name => 'Version1', + Condition => '$$self{LeicaLEIC}', + Format => 'string[14]', + }, + 0x3e => { + Name => 'Version2', + Condition => '$$self{LeicaLEIC}', + Format => 'string[14]', + }, + 0x50 => { + Name => 'MakerNoteLeica5', + Condition => '$$self{LeicaLEIC}', + SubDirectory => { + TagTable => 'Image::ExifTool::Panasonic::Leica5', + ProcessProc => \&ProcessLeicaLEIC, + }, + }, + 0x58 => { + Name => 'ThumbnailWidth', + Condition => '$$self{ThumbType} == 1', + Notes => 'Panasonic models', + Format => 'int16u', + }, + 0x5a => { + Name => 'ThumbnailHeight', + Condition => '$$self{ThumbType} == 1', + Format => 'int16u', + }, + 0x5c => { + Name => 'ThumbnailImage', + Condition => '$$self{ThumbType} == 1', + Groups => { 2 => 'Preview' }, + Format => 'undef[16384]', + ValueConv => '$val=~s/\0*$//; \$val', # remove trailing zeros + }, + # 0x5c - there is some messed-up EXIF-IFD-looking data starting here in + # Leica X VARIO MP4 videos, but it doesn't quite make sense + 0x536 => { # (Leica X VARIO) + Name => 'ThumbnailWidth', + Condition => '$$self{ThumbType} == 2', + Notes => 'Leica X Vario', + Format => 'int32uRev', # (little-endian) + }, + 0x53a => { # (Leica X VARIO) + Name => 'ThumbnailHeight', + Condition => '$$self{ThumbType} == 2', + Format => 'int32uRev', # (little-endian) + }, + 0x53e => { # (Leica X VARIO) + Name => 'ThumbnailLength', + Condition => '$$self{ThumbType} == 2', + Format => 'int32uRev', # (little-endian) + }, + 0x546 => { # (Leica X VARIO) + Name => 'ThumbnailImage', + Condition => '$$self{ThumbType} == 2', + Groups => { 2 => 'Preview' }, + Format => 'undef[$val{0x53e}]', + Binary => 1, + }, + 0x54e => { # (Leica T) + Name => 'ThumbnailWidth', + Condition => '$$self{ThumbType} == 3', + Notes => 'Leica X Vario', + Format => 'int32uRev', # (little-endian) + }, + 0x552 => { # (Leica T) + Name => 'ThumbnailHeight', + Condition => '$$self{ThumbType} == 3', + Format => 'int32uRev', # (little-endian) + }, + 0x556 => { # (Leica T) + Name => 'ThumbnailLength', + Condition => '$$self{ThumbType} == 3', + Format => 'int32uRev', # (little-endian) + }, + 0x55e => { # (Leica T) + Name => 'ThumbnailImage', + Condition => '$$self{ThumbType} == 3', + Groups => { 2 => 'Preview' }, + Format => 'undef[$val{0x556}]', + Binary => 1, + }, + 0x4068 => { + Name => 'ExifData', + Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + Start => 12, + }, + }, + 0x4080 => { # (FZ1000) + Name => 'ExifData', + Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + Start => 12, + }, + }, + 0x200080 => { # (GH6) + Name => 'ExifData', + Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + Start => 12, + }, + }, +); + +# Panasonic Composite tags +%Image::ExifTool::Panasonic::Composite = ( + GROUPS => { 2 => 'Camera' }, + AdvancedSceneMode => { + SeparateTable => 'Panasonic AdvancedSceneMode', # print values in a separate table + Require => { + 0 => 'Model', + 1 => 'SceneMode', + 2 => 'AdvancedSceneType', + }, + ValueConv => '"$val[0] $val[1] $val[2]"', + PrintConv => { #PH + OTHER => sub { + my ($val,$flag,$conv) = @_; + $val =~ s/.* (\d+ \d+)/$1/; # drop model name + return $$conv{$val} if $$conv{$val}; + my @v = split ' ', $val; + my $prt = $shootingMode{$v[0]}; + # AdvancedSceneType=1 for non-automatic modes P,A,S,SCN (ref 19) + # AdvancedSceneType=5 for automatic mode iA (ref 19) + if ($prt) { + return $prt if $v[1] == 1; + return "$prt (intelligent auto)" if $v[1] == 5; #forum11523 + return "$prt (intelligent auto plus)" if $v[1] == 7; #forum11523 + return "$prt ($v[1])"; + } + return "Unknown ($val)"; + }, + Notes => 'A Composite tag derived from Model, SceneMode and AdvancedSceneType.', + '0 1' => 'Off', + # '0 7' - seen this for V-LUX movies (PH) + # '0 8' - seen for D-LUX(Typ104) movies (PH) + '2 2' => 'Outdoor Portrait', #(FZ28) + '2 3' => 'Indoor Portrait', #(FZ28) + '2 4' => 'Creative Portrait', #(FZ28) + '3 2' => 'Nature', #(FZ28) + '3 3' => 'Architecture', #(FZ28) + '3 4' => 'Creative Scenery', #(FZ28) + #'3 5' - ? (FT1) + '4 2' => 'Outdoor Sports', #(FZ28) + '4 3' => 'Indoor Sports', #(FZ28) + '4 4' => 'Creative Sports', #(FZ28) + '9 2' => 'Flower', #(FZ28) + '9 3' => 'Objects', #(FZ28) + '9 4' => 'Creative Macro', #(FZ28) + #'9 5' - ? (GF3) + '18 1' => 'High Sensitivity', #forum11523 (TZ5) + '20 1' => 'Fireworks', #forum11523 (TZ5) + '21 2' => 'Illuminations', #(FZ28) + '21 4' => 'Creative Night Scenery', #(FZ28) + #'21 5' - ? (LX3) + '26 1' => 'High-speed Burst (shot 1)', #forum11523 (TZ5) + '27 1' => 'High-speed Burst (shot 2)', #forum11523 (TZ5) + '29 1' => 'Snow', #forum11523 (TZ5) + '30 1' => 'Starry Sky', #forum11523 (TZ5) + '31 1' => 'Beach', #forum11523 (TZ5) + '36 1' => 'High-speed Burst (shot 3)', #forum11523 (TZ5) + #'37 5' - ? (various) + '39 1' => 'Aerial Photo / Underwater / Multi-aspect', #forum11523 (TZ5) + '45 2' => 'Cinema', #(GF2) + '45 7' => 'Expressive', #(GF1,GF2) + '45 8' => 'Retro', #(GF1,GF2) + '45 9' => 'Pure', #(GF1,GF2) + '45 10' => 'Elegant', #(GF1,GF2) + '45 12' => 'Monochrome', #(GF1,GF2) + '45 13' => 'Dynamic Art', #(GF1,GF2) + '45 14' => 'Silhouette', #(GF1,GF2) + '51 2' => 'HDR Art', #12 + '51 3' => 'HDR B&W', #12 + '59 1' => 'Expressive', #(GF5) + '59 2' => 'Retro', #(GF5) + '59 3' => 'High Key', #(GF5) + '59 4' => 'Sepia', #(GF3,GF5) + '59 5' => 'High Dynamic', #(GF3,GF5) + '59 6' => 'Miniature', #(GF3) + '59 9' => 'Low Key', #(GF5) + '59 10' => 'Toy Effect', #(GF5) + '59 11' => 'Dynamic Monochrome', #(GF5) + '59 12' => 'Soft', #(GF5) + '66 1' => 'Impressive Art', #19 + '66 2' => 'Cross Process', #(GF5) + '66 3' => 'Color Select', #(GF5) (called "One Point Color" by some other models - PH) + '66 4' => 'Star', #(GF5) + '90 3' => 'Old Days', #18 + '90 4' => 'Sunshine', #18 + '90 5' => 'Bleach Bypass', #18 + '90 6' => 'Toy Pop', #18 + '90 7' => 'Fantasy', #18 + '90 8' => 'Monochrome', #PH (GX7) + '90 9' => 'Rough Monochrome', #PH (GX7) + '90 10' => 'Silky Monochrome', #PH (GX7) + '92 1' => 'Handheld Night Shot', #Horst Wandres (FZ1000) + # TZ40 Creative Control modes (ref 19) + 'DMC-TZ40 90 1' => 'Expressive', + 'DMC-TZ40 90 2' => 'Retro', + 'DMC-TZ40 90 3' => 'High Key', + 'DMC-TZ40 90 4' => 'Sepia', + 'DMC-TZ40 90 5' => 'High Dynamic', + 'DMC-TZ40 90 6' => 'Miniature', + 'DMC-TZ40 90 9' => 'Low Key', + 'DMC-TZ40 90 10' => 'Toy Effect', + 'DMC-TZ40 90 11' => 'Dynamic Monochrome', + 'DMC-TZ40 90 12' => 'Soft', + }, + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::Panasonic'); + +#------------------------------------------------------------------------------ +# Inverse conversion for Leica M9 lens codes +# Inputs: 0) value +# Returns: Converted value, or undef on error +sub LensTypeConvInv($) +{ + my $val = shift; + if ($val =~ /^(\d+) (\d+)$/) { + return ($1 << 2) + ($2 & 0x03); + } elsif ($val =~ /^\d+$/) { + my $bits = $frameSelectorBits{$val}; + return undef unless defined $bits; + return ($val << 2) | $bits; + } else { + return undef; + } +} + +#------------------------------------------------------------------------------ +# Convert Leica Kelvin white balance +# Inputs: 0) value, 1) flag to perform inverse conversion +# Returns: Converted value, or undef on error +sub WhiteBalanceConv($;$$) +{ + my ($val, $inv) = @_; + if ($inv) { + return $1 + 0x8000 if $val =~ /(\d+)/; + } else { + return ($val - 0x8000) . ' Kelvin' if $val > 0x8000; + } + return undef; +} + +#------------------------------------------------------------------------------ +# Process Leica makernotes in LEIC atom of MP4 videos (Leica T and X Vario) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessLeicaLEIC($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart); + return 0 if $dirLen < 6; + SetByteOrder('II'); + my $numEntries = Get16u($dataPt, $dirStart); + return 0 if $numEntries < 1 or $numEntries > 255; + my $size = Get32u($dataPt, $dirStart + 2); + return 0 if $size < $numEntries * 12 or $size + 6 > $dirLen; + # the Leica programmers want to make things difficult, so they store + # the entry count before the directory size, making it impossible to + # process as a standard TIFF IFD without a bit of reorganization... + Set16u($numEntries, $dataPt, $dirStart + 4); + my %dirInfo = %$dirInfo; + $dirInfo{DirStart} = $dirStart + 4; + $dirInfo{DirLen} = $size - 4; + $dirInfo{DataPos} -= $dirStart; + $dirInfo{Base} += $dirStart; + return Image::ExifTool::Exif::ProcessExif($et, \%dirInfo, $tagTablePtr); + return 1; +} + +#------------------------------------------------------------------------------ +# Process MakerNote trailer written by Leica S2 +# Inputs: 0) ExifTool object ref, 1) new absolute position of Leica trailer when writing +# Returns: On success: 1 when reading, directory data when writing; otherwise undef +# Notes: +# - may be called twice for a file if the first call doesn't succeed +# - must leave RAF position unchanged +# - uses information from LeicaTrailer member: +# TagInfo = tag info ref for MakerNote SubDirectory +# Offset/Size = value offset/size from MakerNote IFD +# TrailStart/TrailLen = actual JPEG trailer position/size (2nd call only) +# - deletes LeicaTrailer member and sets LeicaTrailerPos when successful +sub ProcessLeicaTrailer($;$) +{ + my ($et, $newPos) = @_; + my $trail = $$et{LeicaTrailer}; + my $raf = $$et{RAF}; + my $trailPos = $$trail{TrailPos}; + my $pos = $trailPos || $$trail{Offset}; + my $len = $$trail{TrailLen} || $$trail{Size}; + my ($buff, $result, %tagPtr); + + delete $$et{LeicaTrailer} if $trailPos; # done after this + unless ($len > 0) { + $et->Warn('Missing Leica MakerNote trailer', 1) if $trailPos; + delete $$et{LeicaTrailer}; + return undef; + } + my $oldPos = $raf->Tell(); + my $ok = ($raf->Seek($pos, 0) and $raf->Read($buff, $len) == $len); + $raf->Seek($oldPos, 0); + unless ($ok) { + $et->Warn('Error reading Leica MakerNote trailer', 1) if $trailPos; + return undef; + } + # look for Leica MakerNote header (should be at start of + # trailer, but allow up to 256 bytes of garbage just in case) + if ($buff !~ /^(.{0,256})LEICA\0..../sg) { + my $what = $trailPos ? 'trailer' : 'offset'; + $et->Warn("Invalid Leica MakerNote $what", 1); + return undef; + } + my $junk = $1; + my $start = pos($buff) - 10; + if ($start and not $trailPos) { + $et->Warn('Invalid Leica MakerNote offset', 1); + return undef; + } +# +# all checks passed -- go ahead and process the trailer now +# + my $hdrLen = 8; + my $dirStart = $start + $hdrLen; + my $tagInfo = $$trail{TagInfo}; + if ($$et{HTML_DUMP}) { + my $name = $$tagInfo{Name}; + $et->HDump($pos+$start, $len-$start, "$name value", 'Leica MakerNote trailer', 4); + $et->HDump($pos+$start, $hdrLen, "MakerNotes header", $name); + } elsif ($et->Options('Verbose')) { + my $where = sprintf('at offset 0x%x', $pos); + $et->VPrint(0, "Leica MakerNote trailer ($len bytes $where):\n"); + } + # delete LeicaTrailer member so we don't try to process it again + delete $$et{LeicaTrailer}; + $$et{LeicaTrailerPos} = $pos + $start; # return actual start position of Leica trailer + + my $oldOrder = GetByteOrder(); + my $num = Get16u(\$buff, $dirStart); # get entry count + ToggleByteOrder() if ($num>>8) > ($num&0xff); # set byte order + + # use specialized algorithm to automatically fix offsets + my $valStart = $dirStart + 2 + 12 * $num + 4; + my $fix = 0; + if ($valStart < $len) { + my $valBlock = Image::ExifTool::MakerNotes::GetValueBlocks(\$buff, $dirStart, \%tagPtr); + # find the minimum offset (excluding the PreviewImage tag 0x300 and 0x301) + my $minPtr; + foreach (keys %tagPtr) { + my $ptr = $tagPtr{$_}; + next if $_ == 0x300 or $_ == 0x301 or not $ptr or $ptr == 0xffffffff; + $minPtr = $ptr if not defined $minPtr or $minPtr > $ptr; + } + if ($minPtr) { + my $diff = $minPtr - ($valStart + $pos); + pos($buff) = $valStart; + my $expect; + if ($$et{Model} eq 'S2') { + # scan value data for the first non-zero byte + if ($buff =~ /[^\0]/g) { + my $n = pos($buff) - 1 - $valStart; # number of zero bytes + # S2 writes 282 bytes of zeros, exiftool writes none + $expect = $n >= 282 ? 282 : 0; + } + } else { # M (Type 240) + # scan for the lens type (M writes 114 bytes of garbage first) + if ($buff =~ /\G.{114}([\x20-\x7f]*\0*)/sg and length($1) >= 50) { + $expect = 114; + } + } + my $fixBase = $et->Options('FixBase'); + if (not defined $expect) { + $et->Warn('Unrecognized Leica trailer structure'); + } elsif ($diff != $expect or defined $fixBase) { + $fix = $expect - $diff; + if (defined $fixBase) { + $fix = $fixBase if $fixBase ne ''; + $et->Warn("Adjusted MakerNotes base by $fix",1); + } else { + $et->Warn("Possibly incorrect maker notes offsets (fixed by $fix)",1); + } + } + } + } + # generate dirInfo for Leica MakerNote directory + my %dirInfo = ( + Name => $$tagInfo{Name}, + Base => $fix, + DataPt => \$buff, + DataPos => $pos - $fix, + DataLen => $len, + DirStart => $dirStart, + DirLen => $len - $dirStart, + DirName => 'MakerNotes', + Parent => 'ExifIFD', + TagInfo => $tagInfo, + ); + my $tagTablePtr = GetTagTable($$tagInfo{SubDirectory}{TagTable}); + if ($newPos) { # are we writing? + if ($$et{Model} ne 'S2') { + $et->Warn('Leica MakerNote trailer too messed up to edit. Copying as a block', 1); + return $buff; + } + # set position of new MakerNote IFD (+ 8 for Leica MakerNote header) + $dirInfo{NewDataPos} = $newPos + $start + 8; + $result = $et->WriteDirectory(\%dirInfo, $tagTablePtr); + # write preview image last if necessary and fix up the preview offsets + my $previewInfo = $$et{PREVIEW_INFO}; + delete $$et{PREVIEW_INFO}; + if ($result) { + if ($previewInfo) { + my $fixup = $previewInfo->{Fixup}; + # set preview offset (relative to start of makernotes, + 8 for makernote header) + $fixup->SetMarkerPointers(\$result, 'PreviewImage', length($result) + 8); + $result .= $$previewInfo{Data}; + } + return $junk . substr($buff, $start, $hdrLen) . $result; + } + } else { + # extract information + $result = $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + # also extract as a block if necessary + if ($et->Options('MakerNotes') or + $$et{REQ_TAG_LOOKUP}{lc($$tagInfo{Name})}) + { + # makernote header must be included in RebuildMakerNotes call + $dirInfo{DirStart} -= 8; + $dirInfo{DirLen} += 8; + $$et{MAKER_NOTE_BYTE_ORDER} = GetByteOrder(); + # rebuild maker notes (creates $$et{MAKER_NOTE_FIXUP}) + my $val = Image::ExifTool::Exif::RebuildMakerNotes($et, \%dirInfo, $tagTablePtr); + unless (defined $val) { + $et->Warn('Error rebuilding maker notes (may be corrupt)') if $len > 4; + $val = $buff, + } + my $key = $et->FoundTag($tagInfo, $val); + $et->SetGroup($key, 'ExifIFD'); + } + } + SetByteOrder($oldOrder); + return $result; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Panasonic - Panasonic/Leica maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Panasonic and Leica maker notes in EXIF information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.compton.nu/panasonic.html> + +=item L<http://johnst.org/sw/exiftags/> + +=item L<http://homepage3.nifty.com/kamisaka/makernote/makernote_pana.htm> + +=item L<http://bretteville.com/pdfs/M8Metadata_v2.pdf> + +=item L<http://www.digital-leica.com/lens_codes/index.html> + +=item (...plus lots of testing with store demos and my wife's DMC-FS7!) + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Tels, Marcel Coenen, Jens Duttke, Joerg, Michael Byczkowski, Carl +Bretteville, Zdenek Mihula and Olaf Ulrich for their contributions. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Panasonic Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/PanasonicRaw.pm b/lib/Image/ExifTool/PanasonicRaw.pm new file mode 100644 index 0000000..0578e36 --- /dev/null +++ b/lib/Image/ExifTool/PanasonicRaw.pm @@ -0,0 +1,909 @@ +#------------------------------------------------------------------------------ +# File: PanasonicRaw.pm +# +# Description: Read/write Panasonic/Leica RAW/RW2/RWL meta information +# +# Revisions: 2009/03/24 - P. Harvey Created +# 2009/05/12 - PH Added RWL file type (same format as RW2) +# +# References: 1) https://exiftool.org/forum/index.php/topic,1542.0.html +# 2) http://www.cybercom.net/~dcoffin/dcraw/ +# 3) http://syscall.eu/#pana +# 4) Klaus Homeister private communication +# IB) Iliah Borg private communication (LibRaw) +# JD) Jens Duttke private communication (TZ3,FZ30,FZ50) +#------------------------------------------------------------------------------ + +package Image::ExifTool::PanasonicRaw; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.25'; + +sub ProcessJpgFromRaw($$$); +sub WriteJpgFromRaw($$$); +sub WriteDistortionInfo($$$); +sub ProcessDistortionInfo($$$); + +my %jpgFromRawMap = ( + IFD1 => 'IFD0', + EXIF => 'IFD0', # to write EXIF as a block + ExifIFD => 'IFD0', + GPS => 'IFD0', + SubIFD => 'IFD0', + GlobParamIFD => 'IFD0', + PrintIM => 'IFD0', + InteropIFD => 'ExifIFD', + MakerNotes => 'ExifIFD', + IFD0 => 'APP1', + MakerNotes => 'ExifIFD', + Comment => 'COM', +); + +my %wbTypeInfo = ( + PrintConv => \%Image::ExifTool::Exif::lightSource, + SeparateTable => 'EXIF LightSource', +); + +my %panasonicWhiteBalance = ( #forum9396 + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Cloudy', + 3 => 'Tungsten', + 4 => 'n/a', + 5 => 'Flash', + 6 => 'n/a', + 7 => 'n/a', + 8 => 'Custom#1', + 9 => 'Custom#2', + 10 => 'Custom#3', + 11 => 'Custom#4', + 12 => 'Shade', + 13 => 'Kelvin', + 16 => 'AWBc', # GH5 and G9 (Makernotes WB==19) +); + +# Tags found in Panasonic RAW/RW2/RWL images (ref PH) +%Image::ExifTool::PanasonicRaw::Main = ( + GROUPS => { 0 => 'EXIF', 1 => 'IFD0', 2 => 'Image'}, + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITE_GROUP => 'IFD0', # default write group + NOTES => 'These tags are found in IFD0 of Panasonic/Leica RAW, RW2 and RWL images.', + 0x01 => { + Name => 'PanasonicRawVersion', + Writable => 'undef', + }, + 0x02 => 'SensorWidth', #1/PH + 0x03 => 'SensorHeight', #1/PH + 0x04 => 'SensorTopBorder', #JD + 0x05 => 'SensorLeftBorder', #JD + 0x06 => 'SensorBottomBorder', #PH + 0x07 => 'SensorRightBorder', #PH + # observed values for unknown tags - PH + # 0x08: 1 + # 0x09: 1,3,4 + # 0x0a: 12 + # (IB gave 0x08-0x0a as BlackLevel tags, but Klaus' decoding makes more sense) + 0x08 => { Name => 'SamplesPerPixel', Writable => 'int16u', Protected => 1 }, #4 + 0x09 => { #4 + Name => 'CFAPattern', + Writable => 'int16u', + Protected => 1, + PrintConv => { + 0 => 'n/a', + 1 => '[Red,Green][Green,Blue]', # (CM-1, FZ70) + 2 => '[Green,Red][Blue,Green]', # (LX-7) + 3 => '[Green,Blue][Red,Green]', # (ZS100, FZ2500, FZ1000, ...) + 4 => '[Blue,Green][Green,Red]', # (LC-100, G-7, V-LUX1, ...) + }, + }, + 0x0a => { Name => 'BitsPerSample', Writable => 'int16u', Protected => 1 }, #4 + 0x0b => { #4 + Name => 'Compression', + Writable => 'int16u', + Protected => 1, + PrintConv => { + 34316 => 'Panasonic RAW 1', # (most models - RAW/RW2/RWL) + 34826 => 'Panasonic RAW 2', # (DIGILUX 2 - RAW) + 34828 => 'Panasonic RAW 3', # (D-LUX2,D-LUX3,FZ30,LX1 - RAW) + 34830 => 'Panasonic RAW 4', #IB (Leica DIGILUX 3, Panasonic DMC-L1) + }, + }, + # 0x0c: 2 (only Leica Digilux 2) + # 0x0d: 0,1 + # 0x0e,0x0f,0x10: 4095 + 0x0e => { Name => 'LinearityLimitRed', Writable => 'int16u' }, #IB + 0x0f => { Name => 'LinearityLimitGreen', Writable => 'int16u' }, #IB + 0x10 => { Name => 'LinearityLimitBlue', Writable => 'int16u' }, #IB + 0x11 => { #JD + Name => 'RedBalance', + Writable => 'int16u', + ValueConv => '$val / 256', + ValueConvInv => 'int($val * 256 + 0.5)', + Notes => 'found in Digilux 2 RAW images', + }, + 0x12 => { #JD + Name => 'BlueBalance', + Writable => 'int16u', + ValueConv => '$val / 256', + ValueConvInv => 'int($val * 256 + 0.5)', + }, + 0x13 => { #IB + Name => 'WBInfo', + SubDirectory => { TagTable => 'Image::ExifTool::PanasonicRaw::WBInfo' }, + }, + 0x17 => { #1 + Name => 'ISO', + Writable => 'int16u', + }, + # 0x18,0x19,0x1a: 0 + 0x18 => { #IB + Name => 'HighISOMultiplierRed', + Writable => 'int16u', + ValueConv => '$val / 256', + ValueConvInv => 'int($val * 256 + 0.5)', + }, + 0x19 => { #IB + Name => 'HighISOMultiplierGreen', + Writable => 'int16u', + ValueConv => '$val / 256', + ValueConvInv => 'int($val * 256 + 0.5)', + }, + 0x1a => { #IB + Name => 'HighISOMultiplierBlue', + Writable => 'int16u', + ValueConv => '$val / 256', + ValueConvInv => 'int($val * 256 + 0.5)', + }, + # 0x1b: [binary data] (something to do with the camera ISO cababilities: int16u count N, + # followed by table of N entries: int16u ISO, int16u[3] RGB gains - ref IB) + 0x1c => { Name => 'BlackLevelRed', Writable => 'int16u' }, #IB + 0x1d => { Name => 'BlackLevelGreen', Writable => 'int16u' }, #IB + 0x1e => { Name => 'BlackLevelBlue', Writable => 'int16u' }, #IB + 0x24 => { #2 + Name => 'WBRedLevel', + Writable => 'int16u', + }, + 0x25 => { #2 + Name => 'WBGreenLevel', + Writable => 'int16u', + }, + 0x26 => { #2 + Name => 'WBBlueLevel', + Writable => 'int16u', + }, + 0x27 => { #IB + Name => 'WBInfo2', + SubDirectory => { TagTable => 'Image::ExifTool::PanasonicRaw::WBInfo2' }, + }, + # 0x27,0x29,0x2a,0x2b,0x2c: [binary data] + 0x2d => { #IB + Name => 'RawFormat', + Writable => 'int16u', + Protected => 1, + # 2 - RAW DMC-FZ8/FZ18 + # 3 - RAW DMC-L10 + # 4 - RW2 for most other models, including G9 in "pixel shift off" mode and YUNEEC CGO4 + # (must add 15 to black levels for RawFormat == 4) + # 5 - RW2 DC-GH5s; G9 in "pixel shift on" mode + # 6 - RW2 DC-S1, DC-S1r in "pixel shift off" mode + # 7 - RW2 DC-S1r (and probably DC-S1, have no raw samples) in "pixel shift on" mode + # not used - DMC-LX1/FZ30/FZ50/L1/LX1/LX2 + # (modes 5 and 7 are lossless) + }, + 0x2e => { #JD + Name => 'JpgFromRaw', # (writable directory!) + Groups => { 2 => 'Preview' }, + Writable => 'undef', + # protect this tag because it contains all the metadata + Flags => [ 'Binary', 'Protected', 'NestedHtmlDump', 'BlockExtract' ], + Notes => 'processed as an embedded document because it contains full EXIF', + WriteCheck => '$val eq "none" ? undef : $self->CheckImage(\$val)', + DataTag => 'JpgFromRaw', + RawConv => '$self->ValidateImage(\$val,$tag)', + SubDirectory => { + # extract information from embedded image since it is metadata-rich, + # unless HtmlDump option set (note that the offsets will be relative, + # not absolute like they should be in verbose mode) + TagTable => 'Image::ExifTool::JPEG::Main', + WriteProc => \&WriteJpgFromRaw, + ProcessProc => \&ProcessJpgFromRaw, + }, + }, + 0x2f => { Name => 'CropTop', Writable => 'int16u' }, + 0x30 => { Name => 'CropLeft', Writable => 'int16u' }, + 0x31 => { Name => 'CropBottom', Writable => 'int16u' }, + 0x32 => { Name => 'CropRight', Writable => 'int16u' }, + 0x10f => { + Name => 'Make', + Groups => { 2 => 'Camera' }, + Writable => 'string', + DataMember => 'Make', + # save this value as an ExifTool member variable + RawConv => '$self->{Make} = $val', + }, + 0x110 => { + Name => 'Model', + Description => 'Camera Model Name', + Groups => { 2 => 'Camera' }, + Writable => 'string', + DataMember => 'Model', + # save this value as an ExifTool member variable + RawConv => '$self->{Model} = $val', + }, + 0x111 => { + Name => 'StripOffsets', + # (this value is 0xffffffff for some models, and RawDataOffset must be used) + Flags => [ 'IsOffset', 'PanasonicHack' ], + OffsetPair => 0x117, # point to associated byte counts + ValueConv => 'length($val) > 32 ? \$val : $val', + }, + 0x112 => { + Name => 'Orientation', + Writable => 'int16u', + PrintConv => \%Image::ExifTool::Exif::orientation, + Priority => 0, # so IFD1 doesn't take precedence + }, + 0x116 => { + Name => 'RowsPerStrip', + Priority => 0, + }, + 0x117 => { + Name => 'StripByteCounts', + # (note that this value may represent something like uncompressed byte count + # for RAW/RW2/RWL images from some models, and is zero for some other models) + OffsetPair => 0x111, # point to associated offset + ValueConv => 'length($val) > 32 ? \$val : $val', + }, + 0x118 => { + Name => 'RawDataOffset', #PH (RW2/RWL) + IsOffset => '$$et{TIFF_TYPE} =~ /^(RW2|RWL)$/', # (invalid in DNG-converted files) + PanasonicHack => 1, + OffsetPair => 0x117, # (use StripByteCounts as the offset pair) + NotRealPair => 1, # (to avoid Validate warning) + }, + 0x119 => { + Name => 'DistortionInfo', + SubDirectory => { TagTable => 'Image::ExifTool::PanasonicRaw::DistortionInfo' }, + }, + # 0x11b - chromatic aberration correction (ref 3) (also see forum9366) + 0x11c => { #forum9373 + Name => 'Gamma', + Writable => 'int16u', + # unfortunately it seems that the scaling factor varies with model... + ValueConv => '$val / ($val >= 1024 ? 1024 : ($val >= 256 ? 256 : 100))', + ValueConvInv => 'int($val * 256 + 0.5)', + }, + 0x120 => { + Name => 'CameraIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::PanasonicRaw::CameraIFD', + Base => '$start', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + }, + }, + 0x121 => { #forum9295 + Name => 'Multishot', + Writable => 'int32u', + PrintConv => { + 0 => 'Off', + 65536 => 'Pixel Shift', + }, + }, + # 0x122 - int32u: RAWDataOffset for the GH5s/GX9, or pointer to end of raw data for G9 (forum9295) + 0x2bc => { # PH Extension!! + Name => 'ApplicationNotes', # (writable directory!) + Writable => 'int8u', + Format => 'undef', + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { + DirName => 'XMP', + TagTable => 'Image::ExifTool::XMP::Main', + }, + }, + 0x001b => { #forum9250 + Name => 'NoiseReductionParams', + Writable => 'undef', + Format => 'int16u', + Count => -1, + Flags => 'Protected', + Notes => q{ + the camera's default noise reduction setup. The first number is the number + of entries, then for each entry there are 4 numbers: an ISO speed, and + noise-reduction strengths the R, G and B channels + }, + }, + 0x83bb => { # PH Extension!! + Name => 'IPTC-NAA', # (writable directory!) + Format => 'undef', # convert binary values as undef + Writable => 'int32u', # but write int32u format code in IFD + WriteGroup => 'IFD0', + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { + DirName => 'IPTC', + TagTable => 'Image::ExifTool::IPTC::Main', + }, + }, + 0x8769 => { + Name => 'ExifOffset', + Groups => { 1 => 'ExifIFD' }, + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + DirName => 'ExifIFD', + Start => '$val', + }, + }, + 0x8825 => { + Name => 'GPSInfo', + Groups => { 1 => 'GPS' }, + Flags => 'SubIFD', + SubDirectory => { + DirName => 'GPS', + TagTable => 'Image::ExifTool::GPS::Main', + Start => '$val', + }, + }, + # 0xffff => 'DCSHueShiftValues', #exifprobe (NC) +); + +# white balance information (ref IB) +# (PanasonicRawVersion<200: Digilux 2) +%Image::ExifTool::PanasonicRaw::WBInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + 0 => 'NumWBEntries', + 1 => { Name => 'WBType1', %wbTypeInfo }, + 2 => { Name => 'WB_RBLevels1', Format => 'int16u[2]' }, + 4 => { Name => 'WBType2', %wbTypeInfo }, + 5 => { Name => 'WB_RBLevels2', Format => 'int16u[2]' }, + 7 => { Name => 'WBType3', %wbTypeInfo }, + 8 => { Name => 'WB_RBLevels3', Format => 'int16u[2]' }, + 10 => { Name => 'WBType4', %wbTypeInfo }, + 11 => { Name => 'WB_RBLevels4', Format => 'int16u[2]' }, + 13 => { Name => 'WBType5', %wbTypeInfo }, + 14 => { Name => 'WB_RBLevels5', Format => 'int16u[2]' }, + 16 => { Name => 'WBType6', %wbTypeInfo }, + 17 => { Name => 'WB_RBLevels6', Format => 'int16u[2]' }, + 19 => { Name => 'WBType7', %wbTypeInfo }, + 20 => { Name => 'WB_RBLevels7', Format => 'int16u[2]' }, +); + +# white balance information (ref IB) +# (PanasonicRawVersion>=200: D-Lux2, D-Lux3, DMC-FZ18/FZ30/LX1/L10) +%Image::ExifTool::PanasonicRaw::WBInfo2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + 0 => 'NumWBEntries', + 1 => { Name => 'WBType1', %wbTypeInfo }, + 2 => { Name => 'WB_RGBLevels1', Format => 'int16u[3]' }, + 5 => { Name => 'WBType2', %wbTypeInfo }, + 6 => { Name => 'WB_RGBLevels2', Format => 'int16u[3]' }, + 9 => { Name => 'WBType3', %wbTypeInfo }, + 10 => { Name => 'WB_RGBLevels3', Format => 'int16u[3]' }, + 13 => { Name => 'WBType4', %wbTypeInfo }, + 14 => { Name => 'WB_RGBLevels4', Format => 'int16u[3]' }, + 17 => { Name => 'WBType5', %wbTypeInfo }, + 18 => { Name => 'WB_RGBLevels5', Format => 'int16u[3]' }, + 21 => { Name => 'WBType6', %wbTypeInfo }, + 22 => { Name => 'WB_RGBLevels6', Format => 'int16u[3]' }, + 25 => { Name => 'WBType7', %wbTypeInfo }, + 26 => { Name => 'WB_RGBLevels7', Format => 'int16u[3]' }, +); + +# lens distortion information (ref 3) +# (distortion correction equation: Ru = scale*(Rd + a*Rd^3 + b*Rd^5 + c*Rd^7), ref 3) +%Image::ExifTool::PanasonicRaw::DistortionInfo = ( + PROCESS_PROC => \&ProcessDistortionInfo, + WRITE_PROC => \&WriteDistortionInfo, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + # (don't make this family 0 MakerNotes because we don't want it to be a deletable group) + GROUPS => { 0 => 'PanasonicRaw', 1 => 'PanasonicRaw', 2 => 'Image'}, + WRITABLE => 1, + FORMAT => 'int16s', + FIRST_ENTRY => 0, + NOTES => 'Lens distortion correction information.', + # 0,1 - checksums + 2 => { + Name => 'DistortionParam02', + ValueConv => '$val / 32768', + ValueConvInv => '$val * 32768', + }, + # 3 - usually 0, but seen 0x026b when value 5 is non-zero + 4 => { + Name => 'DistortionParam04', + ValueConv => '$val / 32768', + ValueConvInv => '$val * 32768', + }, + 5 => { + Name => 'DistortionScale', + ValueConv => '1 / (1 + $val/32768)', + ValueConvInv => '(1/$val - 1) * 32768', + }, + # 6 - seen 0x0000-0x027f + 7.1 => { + Name => 'DistortionCorrection', + Mask => 0x0f, + # (have seen the upper 4 bits set for GF5 and GX1, giving a value of -4095 - PH) + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 8 => { + Name => 'DistortionParam08', + ValueConv => '$val / 32768', + ValueConvInv => '$val * 32768', + }, + 9 => { + Name => 'DistortionParam09', + ValueConv => '$val / 32768', + ValueConvInv => '$val * 32768', + }, + # 10 - seen 0xfc,0x0101,0x01f4,0x021d,0x0256 + 11 => { + Name => 'DistortionParam11', + ValueConv => '$val / 32768', + ValueConvInv => '$val * 32768', + }, + 12 => { + Name => 'DistortionN', + Unknown => 1, + }, + # 13 - seen 0x0000,0x01f9-0x02b2 + # 14,15 - checksums +); + +# Panasonic RW2 camera IFD written by GH5 (ref PH) +# (doesn't seem to be valid for the GF7 or GM5 -- encrypted?) +%Image::ExifTool::PanasonicRaw::CameraIFD = ( + GROUPS => { 0 => 'PanasonicRaw', 1 => 'CameraIFD', 2 => 'Camera'}, + # (don't know what format codes 0x101 and 0x102 are for, so just + # map them into 4 = int32u for now) + VARS => { MAP_FORMAT => { 0x101 => 4, 0x102 => 4 } }, + 0x1001 => { #forum9388 + Name => 'MultishotOn', + Writable => 'int32u', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0x1100 => { #forum9274 + Name => 'FocusStepNear', + Writable => 'int16s', + }, + 0x1101 => { #forum9274 (was forum8484) + Name => 'FocusStepCount', + Writable => 'int16s', + }, + 0x1102 => { #forum9417 + Name => 'FlashFired', + Writable => 'int32u', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + # 0x1104 - set when camera shoots on lowest possible Extended-ISO (forum9290) + 0x1105 => { #forum9392 + Name => 'ZoomPosition', + Notes => 'in the range 0-255 for most cameras', + Writable => 'int32u', + }, + 0x1200 => { #forum9278 + Name => 'LensAttached', + Notes => 'many CameraIFD tags are invalid if there is no lens attached', + Writable => 'int32u', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + # Note: LensTypeMake and LensTypeModel are combined into a Composite LensType tag + # defined in Olympus.pm which has the same values as Olympus:LensType + 0x1201 => { #IB + Name => 'LensTypeMake', + Condition => '$format eq "int16u"', + Writable => 'int16u', + # when format is int16u, these values have been observed: + # 0 - Olympus or unknown lens + # 2 - Leica or Lumix lens + # when format is int32u (S models), these values have been observed (ref IB): + # 256 - Leica lens + # 257 - Lumix lens + # 258 - ? (seen once) + }, + 0x1202 => { #IB + Name => 'LensTypeModel', + Condition => '$format eq "int16u"', + Writable => 'int16u', + RawConv => q{ + return undef unless $val; + require Image::ExifTool::Olympus; # (to load Composite LensID) + return $val; + }, + ValueConv => '$_=sprintf("%.4x",$val); s/(..)(..)/$2 $1/; $_', + ValueConvInv => '$val =~ s/(..) (..)/$2$1/; hex($val)', + }, + 0x1203 => { #4 + Name => 'FocalLengthIn35mmFormat', + Writable => 'int16u', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + # 0x1300 - incident light value? (ref forum11395) + 0x1301 => { #forum11395 + Name => 'ApertureValue', + Writable => 'int16s', + Priority => 0, + ValueConv => '2 ** ($val / 512)', + ValueConvInv => '$val>0 ? 512*log($val)/log(2) : 0', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x1302 => { #forum11395 + Name => 'ShutterSpeedValue', + Writable => 'int16s', + Priority => 0, + ValueConv => 'abs($val/256)<100 ? 2**(-$val/256) : 0', + ValueConvInv => '$val>0 ? -256*log($val)/log(2) : -25600', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x1303 => { #forum11395 + Name => 'SensitivityValue', + Writable => 'int16s', + ValueConv => '$val / 256', + ValueConvInv => 'int($val * 256)', + }, + 0x1305 => { #forum9384 + Name => 'HighISOMode', + Writable => 'int16u', + RawConv => '$val || undef', + PrintConv => { 1 => 'On', 2 => 'Off' }, + }, + # 0x1306 EV for some models like the GX8 (forum11395) + # 0x140b - scaled overall black level? (ref forum9281) + # 0x1411 - scaled black level per channel difference (ref forum9281) + 0x1412 => { #forum11397 + Name => 'FacesDetected', + Writable => 'int8u', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + # 0x2000 - WB tungsten=3, daylight=4 (ref forum9467) + # 0x2009 - scaled black level per channel (ref forum9281) + # 0x3000-0x310b - red/blue balances * 1024 (ref forum9467) + # 0x3000 modifiedTungsten-Red (-2?) + # 0x3001 modifiedTungsten-Blue (-2?) + # 0x3002 modifiedDaylight-Red (-2?) + # 0x3003 modifiedDaylight-Blue (-2?) + # 0x3004 modifiedTungsten-Red (-1?) + # 0x3005 modifiedTungsten-Blue (-1?) + # 0x3006 modifiedDaylight-Red (-1?) + # 0x3007 modifiedDaylight-Blue (-1?) + # 0x3100 DefaultTungsten-Red + # 0x3101 DefaultTungsten-Blue + # 0x3102 DefaultDaylight-Red + # 0x3103 DefaultDaylight-Blue + # 0x3104 modifiedTungsten-Red (+1?) + # 0x3105 modifiedTungsten-Blue (+1?) + # 0x3106 modifiedDaylight-Red (+1?) + # 0x3107 modifiedDaylight-Blue (+1?) + # 0x3108 modifiedTungsten-Red (+2?) + # 0x3109 modifiedTungsten-Blue (+2?) + # 0x310a modifiedDaylight-Red (+2?) + # 0x310b modifiedDaylight-Blue (+2?) + 0x3200 => { #forum9275 + Name => 'WB_CFA0_LevelDaylight', + Writable => 'int16u', + }, + 0x3201 => { #forum9275 + Name => 'WB_CFA1_LevelDaylight', + Writable => 'int16u', + }, + 0x3202 => { #forum9275 + Name => 'WB_CFA2_LevelDaylight', + Writable => 'int16u', + }, + 0x3203 => { #forum9275 + Name => 'WB_CFA3_LevelDaylight', + Writable => 'int16u', + }, + # 0x3204-0x3207 - user multipliers * 1024 ? (ref forum9275) + # 0x320a - scaled maximum value of raw data (scaling = 4x) (ref forum9281) + # 0x3209 - gamma (x256) (ref forum9281) + 0x3300 => { #forum9296/9396 + Name => 'WhiteBalanceSet', + Writable => 'int8u', + PrintConv => \%panasonicWhiteBalance, + SeparateTable => 'WhiteBalance', + }, + 0x3420 => { #forum9276 + Name => 'WB_RedLevelAuto', + Writable => 'int16u', + }, + 0x3421 => { #forum9276 + Name => 'WB_BlueLevelAuto', + Writable => 'int16u', + }, + 0x3501 => { #4 + Name => 'Orientation', + Writable => 'int8u', + PrintConv => \%Image::ExifTool::Exif::orientation, + }, + # 0x3504 = Tag 0x1301+0x1302-0x1303 (Bv = Av+Tv-Sv) (forum11395) + # 0x3505 - same as 0x1300 (forum11395) + 0x3600 => { #forum9396 + Name => 'WhiteBalanceDetected', + Writable => 'int8u', + PrintConv => \%panasonicWhiteBalance, + SeparateTable => 'WhiteBalance', + }, +); + +# PanasonicRaw composite tags +%Image::ExifTool::PanasonicRaw::Composite = ( + ImageWidth => { + Require => { + 0 => 'IFD0:SensorLeftBorder', + 1 => 'IFD0:SensorRightBorder', + }, + ValueConv => '$val[1] - $val[0]', + }, + ImageHeight => { + Require => { + 0 => 'IFD0:SensorTopBorder', + 1 => 'IFD0:SensorBottomBorder', + }, + ValueConv => '$val[1] - $val[0]', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::PanasonicRaw'); + + +#------------------------------------------------------------------------------ +# checksum algorithm for lens distortion correction information (ref 3) +# Inputs: 0) data ref, 1) start position, 2) number of bytes, 3) incement +# Returns: checksum value +sub Checksum($$$$) +{ + my ($dataPt, $start, $num, $inc) = @_; + my $csum = 0; + my $i; + for ($i=0; $i<$num; ++$i) { + $csum = (73 * $csum + Get8u($dataPt, $start + $i * $inc)) % 0xffef; + } + return $csum; +} + +#------------------------------------------------------------------------------ +# Read lens distortion information +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessDistortionInfo($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $start = $$dirInfo{DirStart} || 0; + my $size = $$dirInfo{DirLen} || (length($$dataPt) - $start); + if ($size == 32) { + # verify the checksums (ref 3) + my $csum1 = Checksum($dataPt, $start + 4, 12, 1); + my $csum2 = Checksum($dataPt, $start + 16, 12, 1); + my $csum3 = Checksum($dataPt, $start + 2, 14, 2); + my $csum4 = Checksum($dataPt, $start + 3, 14, 2); + my $res = $csum1 ^ Get16u($dataPt, $start + 2) ^ + $csum2 ^ Get16u($dataPt, $start + 28) ^ + $csum3 ^ Get16u($dataPt, $start + 0) ^ + $csum4 ^ Get16u($dataPt, $start + 30); + $et->Warn('Invalid DistortionInfo checksum',1) if $res; + } else { + $et->Warn('Invalid DistortionInfo',1); + } + return $et->ProcessBinaryData($dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Write lens distortion information +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: updated distortion information or undef on error +sub WriteDistortionInfo($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # (allow dummy access) + my $dat = $et->WriteBinaryData($dirInfo, $tagTablePtr); + if (defined $dat and length($dat) == 32) { + # fix checksums (ref 3) + Set16u(Checksum(\$dat, 4, 12, 1), \$dat, 2); + Set16u(Checksum(\$dat, 16, 12, 1), \$dat, 28); + Set16u(Checksum(\$dat, 2, 14, 2), \$dat, 0); + Set16u(Checksum(\$dat, 3, 14, 2), \$dat, 30); + } else { + $et->Warn('Error wriing DistortionInfo',1); + } + return $dat; +} + +#------------------------------------------------------------------------------ +# Patch for writing non-standard Panasonic RAW/RW2/RWL raw data +# Inputs: 0) offset info ref, 1) raf ref, 2) IFD number +# Returns: error string, or undef on success +# OffsetInfo is a hash by tag ID of lists with the following elements: +# 0 - tag info ref +# 1 - pointer to int32u offset in IFD or value data +# 2 - value count +# 3 - reference to list of original offset values +# 4 - IFD format number +sub PatchRawDataOffset($$$) +{ + my ($offsetInfo, $raf, $ifd) = @_; + my $stripOffsets = $$offsetInfo{0x111}; + my $stripByteCounts = $$offsetInfo{0x117}; + my $rawDataOffset = $$offsetInfo{0x118}; + my $err; + $err = 1 unless $ifd == 0; + $err = 1 unless $stripOffsets and $stripByteCounts and $$stripOffsets[2] == 1; + if ($rawDataOffset) { + $err = 1 unless $$rawDataOffset[2] == 1; + $err = 1 unless $$stripOffsets[3][0] == 0xffffffff or $$stripByteCounts[3][0] == 0; + } + $err and return 'Unsupported Panasonic/Leica RAW variant'; + if ($rawDataOffset) { + # update StripOffsets along with this tag if it contains a reasonable value + unless ($$stripOffsets[3][0] == 0xffffffff) { + # save pointer to StripOffsets value for updating later + push @$rawDataOffset, $$stripOffsets[1]; + } + # handle via RawDataOffset instead of StripOffsets + $stripOffsets = $$offsetInfo{0x111} = $rawDataOffset; + delete $$offsetInfo{0x118}; + } + # determine the length of the raw data + my $pos = $raf->Tell(); + $raf->Seek(0, 2) or $err = 1; # seek to end of file + my $len = $raf->Tell() - $$stripOffsets[3][0]; + $raf->Seek($pos, 0); + # quick check to be sure the raw data length isn't unreasonable + # (the 22-byte length is for '<Dummy raw image data>' in our tests) + $err = 1 if ($len < 1000 and $len != 22) or $len & 0x80000000; + $err and return 'Error reading Panasonic raw data'; + # update StripByteCounts info with raw data length + # (note that the original value is maintained in the file) + $$stripByteCounts[3][0] = $len; + + return undef; +} + +#------------------------------------------------------------------------------ +# Write meta information to Panasonic JpgFromRaw in RAW/RW2/RWL image +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: updated image data, or undef if nothing changed +sub WriteJpgFromRaw($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $byteOrder = GetByteOrder(); + my $fileType = $$et{TIFF_TYPE}; # RAW, RW2 or RWL + my $dirStart = $$dirInfo{DirStart}; + if ($dirStart) { # DirStart is non-zero in DNG-converted RW2/RWL + my $dirLen = $$dirInfo{DirLen} | length($$dataPt) - $dirStart; + my $buff = substr($$dataPt, $dirStart, $dirLen); + $dataPt = \$buff; + } + my $raf = new File::RandomAccess($dataPt); + my $outbuff; + my %dirInfo = ( + RAF => $raf, + OutFile => \$outbuff, + ); + $$et{BASE} = $$dirInfo{DataPos}; + $$et{FILE_TYPE} = $$et{TIFF_TYPE} = 'JPEG'; + # use a specialized map so we don't write XMP or IPTC (or other junk) into the JPEG + my $editDirs = $$et{EDIT_DIRS}; + my $addDirs = $$et{ADD_DIRS}; + $et->InitWriteDirs(\%jpgFromRawMap); + # don't add XMP segment (IPTC won't get added because it is in Photoshop record) + delete $$et{ADD_DIRS}{XMP}; + my $result = $et->WriteJPEG(\%dirInfo); + # restore variables we changed + $$et{BASE} = 0; + $$et{FILE_TYPE} = 'TIFF'; + $$et{TIFF_TYPE} = $fileType; + $$et{EDIT_DIRS} = $editDirs; + $$et{ADD_DIRS} = $addDirs; + SetByteOrder($byteOrder); + return $result > 0 ? $outbuff : $$dataPt; +} + +#------------------------------------------------------------------------------ +# Extract meta information from an Panasonic JpgFromRaw +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid JpgFromRaw image +sub ProcessJpgFromRaw($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $byteOrder = GetByteOrder(); + my $fileType = $$et{TIFF_TYPE}; # RAW, RW2 or RWL + my $tagInfo = $$dirInfo{TagInfo}; + my $verbose = $et->Options('Verbose'); + my ($indent, $out); + $tagInfo or $et->Warn('No tag info for Panasonic JpgFromRaw'), return 0; + my $dirStart = $$dirInfo{DirStart}; + if ($dirStart) { # DirStart is non-zero in DNG-converted RW2/RWL + my $dirLen = $$dirInfo{DirLen} | length($$dataPt) - $dirStart; + my $buff = substr($$dataPt, $dirStart, $dirLen); + $dataPt = \$buff; + } + $$et{BASE} = $$dirInfo{DataPos} + ($dirStart || 0); + $$et{FILE_TYPE} = $$et{TIFF_TYPE} = 'JPEG'; + $$et{DOC_NUM} = 1; + # extract information from embedded JPEG + my %dirInfo = ( + Parent => 'RAF', + RAF => new File::RandomAccess($dataPt), + ); + if ($verbose) { + my $indent = $$et{INDENT}; + $$et{INDENT} = ' '; + $out = $et->Options('TextOut'); + print $out '--- DOC1:JpgFromRaw ',('-'x56),"\n"; + } + # fudge HtmlDump base offsets to show as a stand-alone JPEG + $$et{BASE_FUDGE} = $$et{BASE}; + my $rtnVal = $et->ProcessJPEG(\%dirInfo); + $$et{BASE_FUDGE} = 0; + # restore necessary variables for continued RW2/RWL processing + $$et{BASE} = 0; + $$et{FILE_TYPE} = 'TIFF'; + $$et{TIFF_TYPE} = $fileType; + delete $$et{DOC_NUM}; + SetByteOrder($byteOrder); + if ($verbose) { + $$et{INDENT} = $indent; + print $out ('-'x76),"\n"; + } + return $rtnVal; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::PanasonicRaw - Read/write Panasonic/Leica RAW/RW2/RWL meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read and +write meta information in Panasonic/Leica RAW, RW2 and RWL images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PanasonicRaw Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Parrot.pm b/lib/Image/ExifTool/Parrot.pm new file mode 100644 index 0000000..555eab4 --- /dev/null +++ b/lib/Image/ExifTool/Parrot.pm @@ -0,0 +1,846 @@ +#------------------------------------------------------------------------------ +# File: Parrot.pm +# +# Description: Read timed metadata from Parrot drone videos +# +# Revisions: 2019-10-23 - P. Harvey Created +# +# References: 1) https://developer.parrot.com/docs/pdraw/metadata.html +# --> changed to https://developer.parrot.com/docs/pdraw/video-metadata.html +#------------------------------------------------------------------------------ + +package Image::ExifTool::Parrot; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.02'; + +sub Process_mett($$$); + +# tags found in Parrot 'mett' timed metadata (ref 1) +%Image::ExifTool::Parrot::mett = ( + PROCESS_PROC => \&Process_mett, + # put the 'P' records first in the documentation + VARS => { + SORT_PROC => sub { my ($a,$b)=@_; $a=~s/P/A/; $b=~s/P/A/; $a cmp $b }, + LONG_TAGS => 1 + }, + NOTES => q{ + Streaming metadata found in Parrot drone videos. See + L<https://developer.parrot.com/docs/pdraw/metadata.html> for the + specification. + }, + P1 => { + Name => 'ParrotV1', + SubDirectory => { TagTable => 'Image::ExifTool::Parrot::V1' }, + }, + P2 => { + Name => 'ParrotV2', + SubDirectory => { TagTable => 'Image::ExifTool::Parrot::V2' }, + }, + P3 => { + Name => 'ParrotV3', + SubDirectory => { TagTable => 'Image::ExifTool::Parrot::V3' }, + }, + E1 => { + Name => 'ParrotTimeStamp', + SubDirectory => { TagTable => 'Image::ExifTool::Parrot::TimeStamp' }, + }, + E2 => { + Name => 'ParrotFollowMe', + SubDirectory => { TagTable => 'Image::ExifTool::Parrot::FollowMe' }, + }, + E3 => { + Name => 'ParrotAutomation', + SubDirectory => { TagTable => 'Image::ExifTool::Parrot::Automation' }, + }, + # timed metadata written by ARCore (see forum13653) + 'application/arcore-accel' => { + Name => 'ARCoreAccel', + SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreAccel', ByteOrder => 'II' }, + }, + 'application/arcore-gyro' => { + Name => 'ARCoreGyro', + SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreGyro', ByteOrder => 'II' }, + }, + 'application/arcore-video-0' => { + Name => 'ARCoreVideo', + SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreVideo', ByteOrder => 'II' }, + }, + 'application/arcore-custom-event' => { + Name => 'ARCoreCustom', + SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreCustom', ByteOrder => 'II' }, + }, +); + +# tags found in the Parrot 'mett' V1 timed metadata (ref 1) [untested] +%Image::ExifTool::Parrot::V1 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + NOTES => 'Parrot version 1 streaming metadata.', + GROUPS => { 2 => 'Location' }, + 4 => { + Name => 'DroneYaw', + Format => 'int16s', + ValueConv => '$val / 0x1000 * 180 / 3.14159', # convert from rad to deg + }, + 6 => { + Name => 'DronePitch', + Format => 'int16s', + ValueConv => '$val / 0x1000 * 180 / 3.14159', + }, + 8 => { + Name => 'DroneRoll', + Format => 'int16s', + ValueConv => '$val / 0x1000 * 180 / 3.14159', + }, + 10 => { + Name => 'CameraPan', + Format => 'int16s', + ValueConv => '$val / 0x1000 * 180 / 3.14159', + }, + 12 => { + Name => 'CameraTilt', + Format => 'int16s', + ValueConv => '$val / 0x1000 * 180 / 3.14159', + }, + 14 => { + Name => 'FrameView', # (W,X,Y,Z) + Format => 'int16s[4]', + ValueConv => 'my @a = split " ",$val; $_ /= 0x1000 foreach @a; "@a"', + }, + 22 => { + Name => 'ExposureTime', + Groups => { 2 => 'Camera' }, + Format => 'int16s', + ValueConv => '$val / 0x100 / 1000', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 24 => { + Name => 'ISO', + Groups => { 2 => 'Camera' }, + Format => 'int16s', + }, + 26 => { + Name => 'WifiRSSI', + Groups => { 2 => 'Device' }, + Format => 'int8s', + PrintConv => '"$val dBm"', + }, + 27 => { + Name => 'Battery', + Groups => { 2 => 'Device' }, + PrintConv => '"$val %"', + }, + 28 => { + Name => 'GPSLatitude', + Format => 'int32s', + ValueConv => '$val / 0x100000', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + 32 => { + Name => 'GPSLongitude', + Format => 'int32s', + ValueConv => '$val / 0x100000', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + 36 => { + Name => 'GPSAltitude', + Format => 'int32s', + Mask => 0xffffff00, + ValueConv => '$val / 0x100', + PrintConv => 'sprintf("%.3f m", $val)', + }, + 36.1 => { + Name => 'GPSSatellites', # (SV count) + Format => 'int32s', + Mask => 0xff, + }, + 40 => { + Name => 'AltitudeFromTakeOff', + Format => 'int32s', + ValueConv => '$val / 0x10000', + PrintConv => 'sprintf("%.3f m", $val)', + }, + 44 => { + Name => 'DistanceFromHome', + Format => 'int32u', + ValueConv => '$val / 0x10000', + }, + 48 => { + Name => 'SpeedX', + Format => 'int16s', + ValueConv => '$val / 0x100', + }, + 50 => { + Name => 'SpeedY', + Format => 'int16s', + ValueConv => '$val / 0x100', + }, + 52 => { + Name => 'SpeedZ', + Format => 'int16s', + ValueConv => '$val / 0x100', + }, + 54 => { + Name => 'Binning', + Groups => { 2 => 'Device' }, + Mask => 0x80, + }, + 54.1 => { + Name => 'FlyingState', + Groups => { 2 => 'Device' }, + Mask => 0x7f, + PrintConv => { + 0 => 'Landed', + 1 => 'Taking Off', + 2 => 'Hovering', + 3 => 'Flying', + 4 => 'Landing', + 5 => 'Emergency', + }, + }, + 55 => { + Name => 'Animation', + Groups => { 2 => 'Device' }, + Mask => 0x80, + }, + 55.1 => { + Name => 'PilotingMode', + Groups => { 2 => 'Device' }, + Mask => 0x7f, + PrintConv => { + 0 => 'Manual', + 1 => 'Return Home', + 2 => 'Flight Plan', + 3 => 'Follow Me', + }, + }, +); + +# tags found in the Parrot 'mett' V2 timed metadata (ref 1) [untested] +%Image::ExifTool::Parrot::V2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + Groups => { 2 => 'Location' }, + NOTES => 'Parrot version 2 basic streaming metadata.', + 4 => { + Name => 'Elevation', + Notes => 'estimated distance from ground', + Format => 'int32s', + ValueConv => '$val / 0x10000', + PrintConv => 'sprintf("%.3f m", $val)', + }, + 8 => { + Name => 'GPSLatitude', + Format => 'int32s', + ValueConv => '$val / 0x400000', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + 12 => { + Name => 'GPSLongitude', + Format => 'int32s', + ValueConv => '$val / 0x400000', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + 16 => { + Name => 'GPSAltitude', + Format => 'int32s', + Mask => 0xffffff00, + ValueConv => '$val / 0x100', + PrintConv => 'sprintf("%.3f m", $val)', + }, + 16.1 => { + Name => 'GPSSatellites', # (SV count) + Format => 'int32s', + Mask => 0xff, + }, + 20 => { + Name => 'GPSVelocityNorth', # (m/s) + Format => 'int16s', + ValueConv => '$val / 0x100', + }, + 22 => { + Name => 'GPSVelocityEast', # (m/s) + Format => 'int16s', + ValueConv => '$val / 0x100', + }, + 24 => { + Name => 'GPSVelocityDown', # (m/s) + Format => 'int16s', + ValueConv => '$val / 0x100', + }, + 26 => { + Name => 'AirSpeed', # (m/s) + Format => 'int16s', + RawConv => '$val < 0 ? undef : $val', + ValueConv => '$val / 0x100', + }, + 28 => { + Name => 'DroneQuaternion', # (W,X,Y,Z) + Format => 'int16s[4]', + ValueConv => 'my @a = split " ",$val; $_ /= 0x4000 foreach @a; "@a"', + }, + 36 => { + Name => 'FrameView', # (W,X,Y,Z) + Format => 'int16s[4]', + ValueConv => 'my @a = split " ",$val; $_ /= 0x4000 foreach @a; "@a"', + }, + 44 => { + Name => 'CameraPan', + Format => 'int16s', + ValueConv => '$val / 0x1000 * 180 / 3.14159', # convert from rad to deg + }, + 46 => { + Name => 'CameraTilt', + Format => 'int16s', + ValueConv => '$val / 0x1000 * 180 / 3.14159', + }, + 48 => { + Name => 'ExposureTime', + Groups => { 2 => 'Camera' }, + Format => 'int16u', + ValueConv => '$val / 0x100 / 1000', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 50 => { + Name => 'ISO', + Groups => { 2 => 'Camera' }, + Format => 'int16u', + }, + 52 => { + Name => 'Binning', + Groups => { 2 => 'Device' }, + Mask => 0x80, + }, + 52.1 => { + Name => 'FlyingState', + Groups => { 2 => 'Device' }, + Mask => 0x7f, + PrintConv => { + 0 => 'Landed', + 1 => 'Taking Off', + 2 => 'Hovering', + 3 => 'Flying', + 4 => 'Landing', + 5 => 'Emergency', + 6 => 'User Takeoff', + 7 => 'Motor Ramping', + 8 => 'Emergency Landing', + }, + }, + 53 => { + Name => 'Animation', + Groups => { 2 => 'Device' }, + Mask => 0x80, + }, + 53.1 => { + Name => 'PilotingMode', + Groups => { 2 => 'Device' }, + Mask => 0x7f, + PrintConv => { + 0 => 'Manual', + 1 => 'Return Home', + 2 => 'Flight Plan', + 3 => 'Follow Me / Tracking', # (same as 'Tracking') + 4 => 'Magic Carpet', + 5 => 'Move To', + }, + }, + 54 => { + Name => 'WifiRSSI', + Groups => { 2 => 'Device' }, + Format => 'int8s', + PrintConv => '"$val dBm"', + }, + 55 => { + Name => 'Battery', + Groups => { 2 => 'Device' }, + PrintConv => '"$val %"', + }, +); + +# tags found in the Parrot 'mett' V3 timed metadata (ref 1) +%Image::ExifTool::Parrot::V3 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + NOTES => 'Parrot version 3 basic streaming metadata.', + 4 => { + Name => 'Elevation', + Notes => 'estimated distance from ground', + Format => 'int32s', + ValueConv => '$val / 0x10000', + PrintConv => 'sprintf("%.3f m", $val)', + }, + 8 => { + Name => 'GPSLatitude', + Format => 'int32s', + ValueConv => '$val / 0x400000', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + 12 => { + Name => 'GPSLongitude', + Format => 'int32s', + ValueConv => '$val / 0x400000', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + 16 => { + Name => 'GPSAltitude', + Format => 'int32s', + Mask => 0xffffff00, + ValueConv => '$val / 0x100', + PrintConv => 'sprintf("%.3f m", $val)', + }, + 16.1 => { + Name => 'GPSSatellites', # (SV count) + Format => 'int32s', + Mask => 0xff, + }, + 20 => { + Name => 'GPSVelocityNorth', # (m/s) + Format => 'int16s', + ValueConv => '$val / 0x100', + }, + 22 => { + Name => 'GPSVelocityEast', # (m/s) + Format => 'int16s', + ValueConv => '$val / 0x100', + }, + 24 => { + Name => 'GPSVelocityDown', # (m/s) + Format => 'int16s', + ValueConv => '$val / 0x100', + }, + 26 => { + Name => 'AirSpeed', # (m/s) + Format => 'int16s', + RawConv => '$val < 0 ? undef : $val', + ValueConv => '$val / 0x100', + }, + 28 => { + Name => 'DroneQuaternion', # (W,X,Y,Z) + Format => 'int16s[4]', + ValueConv => 'my @a = split " ",$val; $_ /= 0x4000 foreach @a; "@a"', + }, + 36 => { + Name => 'FrameBaseView', # (W,X,Y,Z without pan/tilt) + Format => 'int16s[4]', + ValueConv => 'my @a = split " ",$val; $_ /= 0x4000 foreach @a; "@a"', + }, + 44 => { + Name => 'FrameView', # (W,X,Y,Z) + Format => 'int16s[4]', + ValueConv => 'my @a = split " ",$val; $_ /= 0x4000 foreach @a; "@a"', + }, + 52 => { + Name => 'ExposureTime', + Groups => { 2 => 'Camera' }, + Format => 'int16u', + ValueConv => '$val / 0x100 / 1000', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 54 => { + Name => 'ISO', + Groups => { 2 => 'Camera' }, + Format => 'int16u', + }, + 56 => { + Name => 'RedBalance', + Groups => { 2 => 'Camera' }, + Format => 'int16u', + ValueConv => '$val / 0x4000', + }, + 58 => { + Name => 'BlueBalance', + Groups => { 2 => 'Camera' }, + Format => 'int16u', + ValueConv => '$val / 0x4000', + }, + 60 => { + Name => 'FOV', # (degrees) + Description => 'Field Of View', + Notes => 'horizontal and vertical field of view in degrees', + Groups => { 2 => 'Image' }, + Format => 'int16u[2]', + ValueConv => 'my @a = split " ",$val; $_ /= 0x100 foreach @a; "@a"', + }, + 64 => { + Name => 'LinkGoodput', + Groups => { 2 => 'Device' }, + Format => 'int32u', + Mask => 0xffffff00, + PrintConv => '"$val kbit/s"', + }, + 64.1 => { + Name => 'LinkQuality', + Groups => { 2 => 'Device' }, + Format => 'int32u', + Notes => '0-5', + Mask => 0xff, + }, + 68 => { + Name => 'WifiRSSI', + Groups => { 2 => 'Device' }, + Format => 'int8s', + PrintConv => '"$val dBm"', + }, + 69 => { + Name => 'Battery', + Groups => { 2 => 'Device' }, + PrintConv => '"$val %"', + }, + 70 => { + Name => 'Binning', + Groups => { 2 => 'Device' }, + Mask => 0x80, + }, + 70.1 => { + Name => 'FlyingState', + Groups => { 2 => 'Device' }, + Mask => 0x7f, + PrintConv => { + 0 => 'Landed', + 1 => 'Taking Off', + 2 => 'Hovering', + 3 => 'Flying', + 4 => 'Landing', + 5 => 'Emergency', + 6 => 'User Takeoff', + 7 => 'Motor Ramping', + 8 => 'Emergency Landing', + }, + }, + 71 => { + Name => 'Animation', + Groups => { 2 => 'Device' }, + Mask => 0x80, + }, + 71.1 => { + Name => 'PilotingMode', + Groups => { 2 => 'Device' }, + Mask => 0x7f, + PrintConv => { + 0 => 'Manual', + 1 => 'Return Home', + 2 => 'Flight Plan', + 3 => 'Follow Me / Tracking', # (same as 'Tracking') + 4 => 'Magic Carpet', + 5 => 'Move To', + }, + }, +); + +# tags found in the Parrot 'mett' E1 timestamp timed metadata (ref 1) +%Image::ExifTool::Parrot::TimeStamp = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + NOTES => 'Parrot streaming metadata timestamp extension.', + GROUPS => { 2 => 'Time' }, + 4 => { + Name => 'TimeStamp', + Format => 'int64u', + ValueConv => '$val / 1e6', + }, +); + +# tags found in the Parrot 'mett' E2 follow-me timed metadata (ref 1) [untested] +%Image::ExifTool::Parrot::FollowMe = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + NOTES => 'Parrot streaming metadata follow-me extension.', + 4 => { + Name => 'GPSTargetLatitude', + Format => 'int32s', + ValueConv => '$val / 0x400000', + }, + 8 => { + Name => 'GPSTargetLongitude', + Format => 'int32s', + ValueConv => '$val / 0x400000', + }, + 12 => { + Name => 'GPSTargetAltitude', + Format => 'int32s', + ValueConv => '$val / 0x10000', + }, + 16 => { + Name => 'Follow-meMode', + Groups => { 2 => 'Device' }, + PrintConv => { BITMASK => { + 0 => 'Follow-me enabled', + 1 => 'Follow-me', # (0=Look-at-me! auggh. see AutomationFlags below) + 2 => 'Angle locked', + }}, + }, + 17 => { + Name => 'Follow-meAnimation', + Groups => { 2 => 'Device' }, + PrintConv => { + 0 => 'None', + 1 => 'Orbit', + 2 => 'Boomerang', + 3 => 'Parabola', + 4 => 'Zenith', + }, + }, +); + +# tags found in the Parrot 'mett' E3 automation timed metadata (ref 1) +%Image::ExifTool::Parrot::Automation = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + NOTES => 'Parrot streaming metadata automation extension.', + 4 => { + Name => 'GPSFramingLatitude', + Format => 'int32s', + ValueConv => '$val / 0x400000', + }, + 8 => { + Name => 'GPSFramingLongitude', + Format => 'int32s', + ValueConv => '$val / 0x400000', + }, + 12 => { + Name => 'GPSFramingAltitude', + Format => 'int32s', + ValueConv => '$val / 0x10000', + }, + 16 => { + Name => 'GPSDestLatitude', + Format => 'int32s', + ValueConv => '$val / 0x400000', + }, + 20 => { + Name => 'GPSDestLongitude', + Format => 'int32s', + ValueConv => '$val / 0x400000', + }, + 24 => { + Name => 'GPSDestAltitude', + Format => 'int32s', + ValueConv => '$val / 0x10000', + }, + 28 => { + Name => 'AutomationAnimation', + Groups => { 2 => 'Device' }, + PrintConv => { + 0 => 'None', + 1 => 'Orbit', + 2 => 'Boomerang', + 3 => 'Parabola', + 4 => 'Dolly Slide', + 5 => 'Dolly Zoom', + 6 => 'Reveal Vertical', + 7 => 'Reveal Horizontal', + 8 => 'Candle', + 9 => 'Flip Front', + 10 => 'Flip Back', + 11 => 'Flip Left', + 12 => 'Flip Right', + 13 => 'Twist Up', + 14 => 'Position Twist Up', + }, + }, + 29 => { + Name => 'AutomationFlags', + Groups => { 2 => 'Device' }, + PrintConv => { BITMASK => { + 0 => 'Follow-me enabled', + 1 => 'Look-at-me enabled', # (really? opposite sense to Follow-meMode above!) + 2 => 'Angle locked', + }}, + }, +); + +# ARCore Accel data (ref PH) +%Image::ExifTool::Parrot::ARCoreAccel = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + NOTES => 'ARCore accelerometer data.', + FIRST_ENTRY => 0, + # 00-04: always 10 34 16 1 29 + 4 => { + Name => 'AccelerometerUnknown', + Format => 'undef[16]', + Unknown => 1, + ValueConv => 'join " ", unpack("Cx4Cx4Cx4C", $val)', + }, + 5 => { # (NC) + Name => 'Accelerometer', + Format => 'undef[14]', + RawConv => 'GetFloat(\$val,0) . " " . GetFloat(\$val,5) . " " . GetFloat(\$val,10)', + }, + # 05-08: float Accelerometer X + # 09: 37 + # 10-13: float Accelerometer Y + # 14: 45 + # 15-18: float Accelerometer Z + # 19: 48 + # 20-24: 128-255 + # 25: 246 then 247 + # 26: 188 + # 27: 2 + # 28: 56 + # 29-32: 128-255 + # 33: increments slowly (about once every 56 samples or so) +); + +# ARCore Gyro data (ref PH) +%Image::ExifTool::Parrot::ARCoreGyro = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + NOTES => 'ARCore accelerometer data.', + FIRST_ENTRY => 0, + # 00-04: always 10 34 16 3 29 + 4 => { + Name => 'GyroscopeUnknown', + Format => 'undef[16]', + Unknown => 1, # always "29 37 45 48" in my sample, just like AccelerometerUnknown + ValueConv => 'join " ", unpack("Cx4Cx4Cx4C", $val)', + }, + 5 => { # (NC) + Name => 'Gyroscope', + Format => 'undef[14]', + RawConv => 'GetFloat(\$val,0) . " " . GetFloat(\$val,5) . " " . GetFloat(\$val,10)', + }, +); + +%Image::ExifTool::Parrot::ARCoreVideo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, +); + +%Image::ExifTool::Parrot::ARCoreCustom = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, +); + +%Image::ExifTool::Parrot::Composite = ( + GPSDateTime => { + Description => 'GPS Date/Time', + Groups => { 2 => 'Time' }, + SubDoc => 1, + Require => { + 0 => 'Parrot:GPSLatitude', # (avoids creating this tag for other videos) + 1 => 'Main:CreateDate', + 2 => 'SampleTime', + }, + ValueConv => q{ + my $time = $val[1]; + my $diff = $val[2]; + # handle time zone and shift to UTC + if ($time =~ s/([-+])(\d{1,2}):?(\d{2})$//) { + my $secs = (($2 * 60) + $3) * 60; + $secs *= -1 if $1 eq '+'; + $diff += $secs; + } elsif ($time !~ s/Z$//) { + # shift from local time + $diff += GetUnixTime($time, 1) - GetUnixTime($time); + } + my $sign = ($diff =~ s/^-// ? '-' : ''); + $time .= '.000'; # add decimal seconds + ShiftTime($time, "${sign}0:0:$diff"); + return $time . 'Z'; + }, + PrintConv => '$self->ConvertDateTime($val)', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::Parrot'); + + +#------------------------------------------------------------------------------ +# Parse Parrot 'mett' timed metadata +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +# (this metadata design is really stupid -- you need to know the size of the base structures) +sub Process_mett($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $dirEnd = length $$dataPt; + my $pos = $$dirInfo{DirStart} || 0; + my $metaType = $$et{MetaType} || ''; + + $et->VerboseDir('Parrot mett', undef, $dirEnd); + + if ($$tagTbl{$metaType}) { + $et->HandleTag($tagTbl, $metaType, undef, + DataPt => $dataPt, + DataPos => $dataPos, + Base => $$dirInfo{Base}, + ); + return 1; + } + while ($pos + 4 < $dirEnd) { + my ($id, $nwords) = unpack("x${pos}a2n", $$dataPt); + my $size; + if ($id !~ /^[EP]\d/) { + # no ID so this should be a 60-byte V1 recording record, otherwise give up + last unless $dirEnd == 60; + $id = 'P1'; # generate a fake ID + # ignore the first 4 of the record so the fields will align with + # the other V1 records (unfortunately, this means that we won't + # decode the V1 recording frame timestamp, but oh well) + $pos += 4; + $size = $dirEnd - $pos; + # must override size for P3 and P3 records since it includes the extensions (augh!) + } elsif ($id eq 'P2') { + $size = 56; + } elsif ($id eq 'P3') { + $size = 72; + } else { + $size = $nwords * 4 + 4; + } + last if $pos + $size > $dirEnd; + $et->HandleTag($tagTbl, $id, undef, + DataPt => $dataPt, + DataPos => $dataPos, + Base => $$dirInfo{Base}, + Start => $pos, + Size => $size, + ); + $pos += $size; + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Parrot - Read timed metadata from Parrot drone videos + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +timed metadata from the 'mett' frame found in Parrot drone MP4 videos. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://developer.parrot.com/docs/pdraw/metadata.html> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Parrot Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Pentax.pm b/lib/Image/ExifTool/Pentax.pm new file mode 100644 index 0000000..9b74ea4 --- /dev/null +++ b/lib/Image/ExifTool/Pentax.pm @@ -0,0 +1,6329 @@ +#------------------------------------------------------------------------------ +# File: Pentax.pm +# +# Description: Pentax/Asahi EXIF maker notes tags +# +# Revisions: 11/25/2003 - P. Harvey Created +# 02/10/2004 - P. Harvey Completely re-done +# 02/16/2004 - W. Smith Updated (see ref 3) +# 11/10/2004 - P. Harvey Added support for Asahi cameras +# 01/10/2005 - P. Harvey Added LensType with values from ref 4 +# 03/30/2005 - P. Harvey Added new tags from ref 5 +# 10/04/2005 - P. Harvey Added MOV tags +# 10/22/2007 - P. Harvey Got my new K10D! (more new tags to decode) +# 11/03/2010 - P. Harvey Got my new K-5! (a gold mine of new tags to discover!) +# +# References: 1) Image::MakerNotes::Pentax +# 2) http://johnst.org/sw/exiftags/ (Asahi cameras) +# 3) Wayne Smith private communication (Optio 550) +# 4) http://kobe1995.jp/~kaz/astro/istD.html +# 5) John Francis (http://www.panix.com/~johnf/raw/index.html) (ist-D/ist-DS) +# 6) http://www.cybercom.net/~dcoffin/dcraw/ +# 7) Douglas O'Brien private communication (*istD, K10D) +# 8) Denis Bourez private communication +# 9) Kazumichi Kawabata private communication +# 10) David Buret private communication (*istD) +# 11) http://forums.dpreview.com/forums/read.asp?forum=1036&message=17465929 +# 12) Derby Chang private communication +# 13) http://homepage3.nifty.com/kamisaka/makernote/makernote_pentax.htm (2007/02/28) +# 14) Ger Vermeulen private communication (Optio S6) +# 15) Barney Garrett private communication (Samsung GX-1S) +# 16) Axel Kellner private communication (K10D) +# 17) Cvetan Ivanov private communication (K100D) +# 18) http://gvsoft.homedns.org/exif/makernote-pentax-type3.html +# 19) Dave Nicholson private communication (K10D) +# 20) Bogdan and yeryry (http://www.cpanforum.com/posts/8037) +# 21) Peter (*istD, http://www.cpanforum.com/posts/8078) +# 22) Bozi (K10D, http://www.cpanforum.com/posts/8480) +# 23) Akos Szalkai (https://rt.cpan.org/Ticket/Display.html?id=43743) +# 24) Albert Bogner private communication +# 26) https://exiftool.org/forum/index.php/topic,3444.0.html +# 27) https://exiftool.org/forum/index.php/topic,3833.0.html +# 28) Klaus Homeister https://exiftool.org/forum/index.php/topic,4803.0.html +# 29) Louis Granboulan private communication (K-5II) +# 30) https://exiftool.org/forum/index.php?topic=5433 +# 31) Andras Salamon private communication (K-70) +# IB) Iliah Borg private communication (LibRaw) +# JD) Jens Duttke private communication +# NJ) Niels Kristian Bech Jensen private communication +# +# Notes: See POD documentation at the bottom of this file +#------------------------------------------------------------------------------ + +package Image::ExifTool::Pentax; + +use strict; +use vars qw($VERSION %pentaxLensTypes); +use Image::ExifTool::Exif; +use Image::ExifTool::GPS; +use Image::ExifTool::HP; + +$VERSION = '3.40'; + +sub CryptShutterCount($$); +sub PrintFilter($$$); +sub DecodeAFPoints($$$$;$); + +# pentax lens type codes (ref 4) +# The first number gives the lens series, and the 2nd gives the model number +# Series numbers: K=1; A=2; F=3; FAJ=4; DFA=4,7; FA=3,4,5,6; FA*=5,6; +# DA=3,4,7; DA*=7,8; FA645=11; DFA645=13; Q=21 +%pentaxLensTypes = ( + Notes => q{ + The first number gives the series of the lens, and the second identifies the + lens model. Note that newer series numbers may not always be properly + identified by cameras running older firmware versions. Decimal values have + been added to differentiate lenses which would otherwise have the same + LensType, and are used by the Composite LensID tag when attempting to + identify the specific lens model. + }, + OTHER => sub { + my ($val, $inv, $conv) = @_; + return undef if $inv; + # *istD may report a series number of 4 for series 7 lenses + $val =~ s/^4 /7 / and $$conv{$val} and return "$$conv{$val} ($_[0])"; + # cameras that don't recognize SDM lenses (eg. older K10 firmware) + # may report series 7 instead of 8 + $val =~ s/^7 /8 / and $$conv{$val} and return "$$conv{$val} ? ($_[0])"; + # there seems to some inconsistency between FA and DFA lenses for the 645D... + ($val =~ s/^11 /13 / or $val =~ s/^13 /11 /) and $$conv{$val} and return "$$conv{$val} ? ($_[0])"; + return undef; + }, + '0 0' => 'M-42 or No Lens', #17 + '1 0' => 'K or M Lens', + '2 0' => 'A Series Lens', #7 (from smc PENTAX-A 400mm F5.6) + '3 0' => 'Sigma', + # (and 'Sigma 18-50mm F2.8 EX Macro') + # (and 'Sigma 30mm F1.4 EX DC', ref PH) + # (and 'Sigma 50-500mm F4-6.3 DG APO') + # (and 'Sigma 70mm F2.8 EX DG Macro') + # (and 'Sigma 105mm F2.8 EX DG Macro', ref 24) + # (and 'Sigma 180mm F4.5 EX DG Macro') + '3 17' => 'smc PENTAX-FA SOFT 85mm F2.8', # (also F version, ref 29) + '3 18' => 'smc PENTAX-F 1.7X AF ADAPTER', + '3 19' => 'smc PENTAX-F 24-50mm F4', + '3 20' => 'smc PENTAX-F 35-80mm F4-5.6', + '3 21' => 'smc PENTAX-F 80-200mm F4.7-5.6', + '3 22' => 'smc PENTAX-F FISH-EYE 17-28mm F3.5-4.5', + '3 23' => 'smc PENTAX-F 100-300mm F4.5-5.6 or Sigma Lens', + '3 23.1' => 'Sigma AF 28-300mm F3.5-5.6 DL IF', #JD + '3 23.2' => 'Sigma AF 28-300mm F3.5-6.3 DG IF Macro', #JD + '3 23.3' => 'Tokina 80-200mm F2.8 ATX-Pro', #Exiv2 + '3 24' => 'smc PENTAX-F 35-135mm F3.5-4.5', + '3 25' => 'smc PENTAX-F 35-105mm F4-5.6 or Sigma or Tokina Lens', + '3 25.1' => 'Sigma 55-200mm F4-5.6 DC', #JD + '3 25.2' => 'Sigma AF 28-300mm F3.5-5.6 DL IF', #11 + '3 25.3' => 'Sigma AF 28-300mm F3.5-6.3 DL IF', #Exiv2 + '3 25.4' => 'Sigma AF 28-300mm F3.5-6.3 DG IF Macro', #JD + '3 25.5' => 'Tokina 80-200mm F2.8 ATX-Pro', #12 + '3 26' => 'smc PENTAX-F* 250-600mm F5.6 ED[IF]', + '3 27' => 'smc PENTAX-F 28-80mm F3.5-4.5 or Tokina Lens', + '3 27.1' => 'Tokina AT-X Pro AF 28-70mm F2.6-2.8', #JD + '3 28' => 'smc PENTAX-F 35-70mm F3.5-4.5 or Tokina Lens', + '3 28.1' => 'Tokina 19-35mm F3.5-4.5 AF', #12 + '3 28.2' => 'Tokina AT-X AF 400mm F5.6', #NJ + '3 29' => 'PENTAX-F 28-80mm F3.5-4.5 or Sigma or Tokina Lens', + '3 29.1' => 'Sigma AF 18-125mm F3.5-5.6 DC', #11 + '3 29.2' => 'Tokina AT-X PRO 28-70mm F2.6-2.8', #22 + '3 30' => 'PENTAX-F 70-200mm F4-5.6', + '3 31' => 'smc PENTAX-F 70-210mm F4-5.6 or Tokina or Takumar Lens', + '3 31.1' => 'Tokina AF 730 75-300mm F4.5-5.6', + '3 31.2' => 'Takumar-F 70-210mm F4-5.6', #JD + '3 32' => 'smc PENTAX-F 50mm F1.4', + '3 33' => 'smc PENTAX-F 50mm F1.7', + '3 34' => 'smc PENTAX-F 135mm F2.8 [IF]', + '3 35' => 'smc PENTAX-F 28mm F2.8', + '3 36' => 'Sigma 20mm F1.8 EX DG Aspherical RF', + '3 38' => 'smc PENTAX-F* 300mm F4.5 ED[IF]', + '3 39' => 'smc PENTAX-F* 600mm F4 ED[IF]', + '3 40' => 'smc PENTAX-F Macro 100mm F2.8', + '3 41' => 'smc PENTAX-F Macro 50mm F2.8 or Sigma Lens', #4 + '3 41.1' => 'Sigma 50mm F2.8 Macro', #16 + '3 42' => 'Sigma 300mm F2.8 EX DG APO IF', #27 + '3 44' => 'Sigma or Tamron Lens (3 44)', + '3 44.1' => 'Sigma AF 10-20mm F4-5.6 EX DC', #JD + '3 44.2' => 'Sigma 12-24mm F4.5-5.6 EX DG', #12 (added "-5.6", ref 29) + '3 44.3' => 'Sigma 17-70mm F2.8-4.5 DC Macro', #(Bart Hickman) + '3 44.4' => 'Sigma 18-50mm F3.5-5.6 DC', #4 + '3 44.5' => 'Sigma 17-35mm F2.8-4 EX DG', #29 + '3 44.6' => 'Tamron 35-90mm F4-5.6 AF', #12 (added "-5.6", ref IB) + '3 44.7' => 'Sigma AF 18-35mm F3.5-4.5 Aspherical', #29 + '3 46' => 'Sigma or Samsung Lens (3 46)', + '3 46.1' => 'Sigma APO 70-200mm F2.8 EX', + '3 46.2' => 'Sigma EX APO 100-300mm F4 IF', #JD + '3 46.3' => 'Samsung/Schneider D-XENON 50-200mm F4-5.6 ED', #29 + '3 50' => 'smc PENTAX-FA 28-70mm F4 AL', + '3 51' => 'Sigma 28mm F1.8 EX DG Aspherical Macro', + '3 52' => 'smc PENTAX-FA 28-200mm F3.8-5.6 AL[IF] or Tamron Lens', + '3 52.1' => 'Tamron AF LD 28-200mm F3.8-5.6 [IF] Aspherical (171D)', #JD + '3 53' => 'smc PENTAX-FA 28-80mm F3.5-5.6 AL', + '3 247' => 'smc PENTAX-DA FISH-EYE 10-17mm F3.5-4.5 ED[IF]', + '3 248' => 'smc PENTAX-DA 12-24mm F4 ED AL[IF]', + '3 250' => 'smc PENTAX-DA 50-200mm F4-5.6 ED', + '3 251' => 'smc PENTAX-DA 40mm F2.8 Limited', + '3 252' => 'smc PENTAX-DA 18-55mm F3.5-5.6 AL', + '3 253' => 'smc PENTAX-DA 14mm F2.8 ED[IF]', + '3 254' => 'smc PENTAX-DA 16-45mm F4 ED AL', + '3 255' => 'Sigma Lens (3 255)', + '3 255.1' => 'Sigma 18-200mm F3.5-6.3 DC', #8 + '3 255.2' => 'Sigma DL-II 35-80mm F4-5.6', #12 + '3 255.3' => 'Sigma DL Zoom 75-300mm F4-5.6', #12 + '3 255.4' => 'Sigma DF EX Aspherical 28-70mm F2.8', #12 + '3 255.5' => 'Sigma AF Tele 400mm F5.6 Multi-coated', #JD + '3 255.6' => 'Sigma 24-60mm F2.8 EX DG', #PH + '3 255.7' => 'Sigma 70-300mm F4-5.6 Macro', #JD (also DG Macro, ref 27) + '3 255.8' => 'Sigma 55-200mm F4-5.6 DC', #JD + '3 255.9' => 'Sigma 18-50mm F2.8 EX DC', #JD (also Macro version - PH) + '4 1' => 'smc PENTAX-FA SOFT 28mm F2.8', + '4 2' => 'smc PENTAX-FA 80-320mm F4.5-5.6', + '4 3' => 'smc PENTAX-FA 43mm F1.9 Limited', + '4 6' => 'smc PENTAX-FA 35-80mm F4-5.6', + '4 8' => 'Irix 150mm F2.8 Macro', #exiv2 issue 1084 + '4 9' => 'Irix 11mm F4 Firefly', #27 + '4 10' => 'Irix 15mm F2.4', #27 + '4 12' => 'smc PENTAX-FA 50mm F1.4', #17 + '4 15' => 'smc PENTAX-FA 28-105mm F4-5.6 [IF]', + '4 16' => 'Tamron AF 80-210mm F4-5.6 (178D)', #13 + '4 19' => 'Tamron SP AF 90mm F2.8 (172E)', + '4 20' => 'smc PENTAX-FA 28-80mm F3.5-5.6', + '4 21' => 'Cosina AF 100-300mm F5.6-6.7', #20 + '4 22' => 'Tokina 28-80mm F3.5-5.6', #13 + '4 23' => 'smc PENTAX-FA 20-35mm F4 AL', + '4 24' => 'smc PENTAX-FA 77mm F1.8 Limited', + '4 25' => 'Tamron SP AF 14mm F2.8', #13 + '4 26' => 'smc PENTAX-FA Macro 100mm F3.5 or Cosina Lens', + '4 26.1' => 'Cosina 100mm F3.5 Macro', #JD + '4 27' => 'Tamron AF 28-300mm F3.5-6.3 LD Aspherical[IF] Macro (185D/285D)', + '4 28' => 'smc PENTAX-FA 35mm F2 AL', + '4 29' => 'Tamron AF 28-200mm F3.8-5.6 LD Super II Macro (371D)', #JD + '4 34' => 'smc PENTAX-FA 24-90mm F3.5-4.5 AL[IF]', + '4 35' => 'smc PENTAX-FA 100-300mm F4.7-5.8', + # '4 36' => 'Tamron AF70-300mm F4-5.6 LD Macro', # both 572D and A17 (Di) - ref JD + '4 36' => 'Tamron AF 70-300mm F4-5.6 LD Macro 1:2', #NJ + '4 37' => 'Tamron SP AF 24-135mm F3.5-5.6 AD AL (190D)', #13 + '4 38' => 'smc PENTAX-FA 28-105mm F3.2-4.5 AL[IF]', + '4 39' => 'smc PENTAX-FA 31mm F1.8 AL Limited', + '4 41' => 'Tamron AF 28-200mm Super Zoom F3.8-5.6 Aspherical XR [IF] Macro (A03)', + '4 43' => 'smc PENTAX-FA 28-90mm F3.5-5.6', + '4 44' => 'smc PENTAX-FA J 75-300mm F4.5-5.8 AL', + '4 45' => 'Tamron Lens (4 45)', + '4 45.1' => 'Tamron 28-300mm F3.5-6.3 Ultra zoom XR', + '4 45.2' => 'Tamron AF 28-300mm F3.5-6.3 XR Di LD Aspherical [IF] Macro', #JD + '4 46' => 'smc PENTAX-FA J 28-80mm F3.5-5.6 AL', + '4 47' => 'smc PENTAX-FA J 18-35mm F4-5.6 AL', + #'4 49' => 'Tamron SP AF 28-75mm F2.8 XR Di (A09)', + '4 49' => 'Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical [IF] Macro', #NJ + '4 51' => 'smc PENTAX-D FA 50mm F2.8 Macro', + '4 52' => 'smc PENTAX-D FA 100mm F2.8 Macro', + '4 55' => 'Samsung/Schneider D-XENOGON 35mm F2', #29 + '4 56' => 'Samsung/Schneider D-XENON 100mm F2.8 Macro', #Alan Robinson + '4 75' => 'Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro (A001)', #JD + '4 214' => 'smc PENTAX-DA 35mm F2.4 AL', #PH + '4 229' => 'smc PENTAX-DA 18-55mm F3.5-5.6 AL II', #JD + '4 230' => 'Tamron SP AF 17-50mm F2.8 XR Di II', #20 + '4 231' => 'smc PENTAX-DA 18-250mm F3.5-6.3 ED AL [IF]', #21 + '4 237' => 'Samsung/Schneider D-XENOGON 10-17mm F3.5-4.5', #JD + '4 239' => 'Samsung/Schneider D-XENON 12-24mm F4 ED AL [IF]', #23 + '4 242' => 'smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM (SDM unused)', #Pietu Pohjalainen + '4 243' => 'smc PENTAX-DA 70mm F2.4 Limited', #JD + '4 244' => 'smc PENTAX-DA 21mm F3.2 AL Limited', #9 + '4 245' => 'Samsung/Schneider D-XENON 50-200mm F4-5.6', #15 + '4 246' => 'Samsung/Schneider D-XENON 18-55mm F3.5-5.6', #15 + '4 247' => 'smc PENTAX-DA FISH-EYE 10-17mm F3.5-4.5 ED[IF]', #10 + '4 248' => 'smc PENTAX-DA 12-24mm F4 ED AL [IF]', #10 + '4 249' => 'Tamron XR DiII 18-200mm F3.5-6.3 (A14)', + '4 250' => 'smc PENTAX-DA 50-200mm F4-5.6 ED', #8 + '4 251' => 'smc PENTAX-DA 40mm F2.8 Limited', #9 + '4 252' => 'smc PENTAX-DA 18-55mm F3.5-5.6 AL', #8 + '4 253' => 'smc PENTAX-DA 14mm F2.8 ED[IF]', + '4 254' => 'smc PENTAX-DA 16-45mm F4 ED AL', + '5 1' => 'smc PENTAX-FA* 24mm F2 AL[IF]', + '5 2' => 'smc PENTAX-FA 28mm F2.8 AL', + '5 3' => 'smc PENTAX-FA 50mm F1.7', + '5 4' => 'smc PENTAX-FA 50mm F1.4', + '5 5' => 'smc PENTAX-FA* 600mm F4 ED[IF]', + '5 6' => 'smc PENTAX-FA* 300mm F4.5 ED[IF]', + '5 7' => 'smc PENTAX-FA 135mm F2.8 [IF]', + '5 8' => 'smc PENTAX-FA Macro 50mm F2.8', + '5 9' => 'smc PENTAX-FA Macro 100mm F2.8', + '5 10' => 'smc PENTAX-FA* 85mm F1.4 [IF]', + '5 11' => 'smc PENTAX-FA* 200mm F2.8 ED[IF]', + '5 12' => 'smc PENTAX-FA 28-80mm F3.5-4.7', + '5 13' => 'smc PENTAX-FA 70-200mm F4-5.6', + '5 14' => 'smc PENTAX-FA* 250-600mm F5.6 ED[IF]', + '5 15' => 'smc PENTAX-FA 28-105mm F4-5.6', + '5 16' => 'smc PENTAX-FA 100-300mm F4.5-5.6', + '5 98' => 'smc PENTAX-FA 100-300mm F4.5-5.6', #JD (pre-production? - PH) + '6 1' => 'smc PENTAX-FA* 85mm F1.4 [IF]', + '6 2' => 'smc PENTAX-FA* 200mm F2.8 ED[IF]', + '6 3' => 'smc PENTAX-FA* 300mm F2.8 ED[IF]', + '6 4' => 'smc PENTAX-FA* 28-70mm F2.8 AL', + '6 5' => 'smc PENTAX-FA* 80-200mm F2.8 ED[IF]', + '6 6' => 'smc PENTAX-FA* 28-70mm F2.8 AL', + '6 7' => 'smc PENTAX-FA* 80-200mm F2.8 ED[IF]', + '6 8' => 'smc PENTAX-FA 28-70mm F4AL', + '6 9' => 'smc PENTAX-FA 20mm F2.8', + '6 10' => 'smc PENTAX-FA* 400mm F5.6 ED[IF]', + '6 13' => 'smc PENTAX-FA* 400mm F5.6 ED[IF]', + '6 14' => 'smc PENTAX-FA* Macro 200mm F4 ED[IF]', + '7 0' => 'smc PENTAX-DA 21mm F3.2 AL Limited', #13 + '7 58' => 'smc PENTAX-D FA Macro 100mm F2.8 WR', #PH - this bit of information cost me $600 ;) + '7 75' => 'Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro (A001)', #(Anton Bondar) + '7 201' => 'smc Pentax-DA L 50-200mm F4-5.6 ED WR', #(Bruce Rusk) + '7 202' => 'smc PENTAX-DA L 18-55mm F3.5-5.6 AL WR', #29 + '7 203' => 'HD PENTAX-DA 55-300mm F4-5.8 ED WR', #29 + '7 204' => 'HD PENTAX-DA 15mm F4 ED AL Limited', #forum5318 + '7 205' => 'HD PENTAX-DA 35mm F2.8 Macro Limited', #29 + '7 206' => 'HD PENTAX-DA 70mm F2.4 Limited', #29 + '7 207' => 'HD PENTAX-DA 21mm F3.2 ED AL Limited', #forum5327 + '7 208' => 'HD PENTAX-DA 40mm F2.8 Limited', #PH + '7 212' => 'smc PENTAX-DA 50mm F1.8', #PH + '7 213' => 'smc PENTAX-DA 40mm F2.8 XS', #PH + '7 214' => 'smc PENTAX-DA 35mm F2.4 AL', #PH + '7 216' => 'smc PENTAX-DA L 55-300mm F4-5.8 ED', #PH + '7 217' => 'smc PENTAX-DA 50-200mm F4-5.6 ED WR', #JD + '7 218' => 'smc PENTAX-DA 18-55mm F3.5-5.6 AL WR', #JD + '7 220' => 'Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical [IF]', #24 + '7 221' => 'smc PENTAX-DA L 50-200mm F4-5.6 ED', #Ar't + '7 222' => 'smc PENTAX-DA L 18-55mm F3.5-5.6', #PH (tag 0x003f -- was '7 229' in LensInfo of one test image) + '7 223' => 'Samsung/Schneider D-XENON 18-55mm F3.5-5.6 II', #PH + '7 224' => 'smc PENTAX-DA 15mm F4 ED AL Limited', #JD + '7 225' => 'Samsung/Schneider D-XENON 18-250mm F3.5-6.3', #8/PH + '7 226' => 'smc PENTAX-DA* 55mm F1.4 SDM (SDM unused)', #PH (NC) + '7 227' => 'smc PENTAX-DA* 60-250mm F4 [IF] SDM (SDM unused)', #PH (NC) + '7 228' => 'Samsung 16-45mm F4 ED', #29 + '7 229' => 'smc PENTAX-DA 18-55mm F3.5-5.6 AL II', #JD + '7 230' => 'Tamron AF 17-50mm F2.8 XR Di-II LD (Model A16)', #JD + '7 231' => 'smc PENTAX-DA 18-250mm F3.5-6.3 ED AL [IF]', #JD + '7 233' => 'smc PENTAX-DA 35mm F2.8 Macro Limited', #JD + '7 234' => 'smc PENTAX-DA* 300mm F4 ED [IF] SDM (SDM unused)', #19 (NC) + '7 235' => 'smc PENTAX-DA* 200mm F2.8 ED [IF] SDM (SDM unused)', #PH (NC) + '7 236' => 'smc PENTAX-DA 55-300mm F4-5.8 ED', #JD + '7 238' => 'Tamron AF 18-250mm F3.5-6.3 Di II LD Aspherical [IF] Macro', #JD + '7 241' => 'smc PENTAX-DA* 50-135mm F2.8 ED [IF] SDM (SDM unused)', #PH + '7 242' => 'smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM (SDM unused)', #19 + '7 243' => 'smc PENTAX-DA 70mm F2.4 Limited', #PH + '7 244' => 'smc PENTAX-DA 21mm F3.2 AL Limited', #16 + '8 0' => 'Sigma 50-150mm F2.8 II APO EX DC HSM', #forum2997 + '8 3' => 'Sigma 18-125mm F3.8-5.6 DC HSM', #forum10167 + '8 4' => 'Sigma 50mm F1.4 EX DG HSM', #Artur private communication + '8 6' => 'Sigma 4.5mm F2.8 EX DC Fisheye', #IB + '8 7' => 'Sigma 24-70mm F2.8 IF EX DG HSM', #Exiv2 + '8 8' => 'Sigma 18-250mm F3.5-6.3 DC OS HSM', #27 + '8 11' => 'Sigma 10-20mm F3.5 EX DC HSM', #27 + '8 12' => 'Sigma 70-300mm F4-5.6 DG OS', #forum3382 + '8 13' => 'Sigma 120-400mm F4.5-5.6 APO DG OS HSM', #26 + '8 14' => 'Sigma 17-70mm F2.8-4.0 DC Macro OS HSM', #(Hubert Meier) + '8 15' => 'Sigma 150-500mm F5-6.3 APO DG OS HSM', #26 + '8 16' => 'Sigma 70-200mm F2.8 EX DG Macro HSM II', #26 + '8 17' => 'Sigma 50-500mm F4.5-6.3 DG OS HSM', #(Heike Herrmann) (also APO, ref 26) + '8 18' => 'Sigma 8-16mm F4.5-5.6 DC HSM', #forum2998 + '8 20' => 'Sigma 18-50mm F2.8-4.5 DC HSM', #IB + '8 21' => 'Sigma 17-50mm F2.8 EX DC OS HSM', #26 + '8 22' => 'Sigma 85mm F1.4 EX DG HSM', #26 + '8 23' => 'Sigma 70-200mm F2.8 APO EX DG OS HSM', #27 + '8 24' => 'Sigma 17-70mm F2.8-4 DC Macro OS HSM', #27 + '8 25' => 'Sigma 17-50mm F2.8 EX DC HSM', #Exiv2 + '8 27' => 'Sigma 18-200mm F3.5-6.3 II DC HSM', #27 + '8 28' => 'Sigma 18-250mm F3.5-6.3 DC Macro HSM', #27 + '8 29' => 'Sigma 35mm F1.4 DG HSM', #27 + '8 30' => 'Sigma 17-70mm F2.8-4 DC Macro HSM | C', #27 + '8 31' => 'Sigma 18-35mm F1.8 DC HSM', #27 + '8 32' => 'Sigma 30mm F1.4 DC HSM | A', #27 + '8 33' => 'Sigma 18-200mm F3.5-6.3 DC Macro HSM', #DieterPearcey (C014) + '8 34' => 'Sigma 18-300mm F3.5-6.3 DC Macro HSM', #NJ + '8 59' => 'HD PENTAX-D FA 150-450mm F4.5-5.6 ED DC AW', #29 + '8 60' => 'HD PENTAX-D FA* 70-200mm F2.8 ED DC AW', #29 + '8 61' => 'HD PENTAX-D FA 28-105mm F3.5-5.6 ED DC WR', #PH + '8 62' => 'HD PENTAX-D FA 24-70mm F2.8 ED SDM WR', #PH + '8 63' => 'HD PENTAX-D FA 15-30mm F2.8 ED SDM WR', #PH + '8 64' => 'HD PENTAX-D FA* 50mm F1.4 SDM AW', #27 + '8 65' => 'HD PENTAX-D FA 70-210mm F4 ED SDM WR', #PH + '8 66' => 'HD PENTAX-D FA 85mm F1.4 ED SDM AW', #James O'Neill + '8 67' => 'HD PENTAX-D FA 21mm F2.4 ED Limited DC WR', #ChristianShulz + '8 195' => 'HD PENTAX DA* 16-50mm F2.8 ED PLM AW', #27 + '8 196' => 'HD PENTAX-DA* 11-18mm F2.8 ED DC AW', #29 + '8 197' => 'HD PENTAX-DA 55-300mm F4.5-6.3 ED PLM WR RE', #29 + '8 198' => 'smc PENTAX-DA L 18-50mm F4-5.6 DC WR RE', #29 + '8 199' => 'HD PENTAX-DA 18-50mm F4-5.6 DC WR RE', #29 + '8 200' => 'HD PENTAX-DA 16-85mm F3.5-5.6 ED DC WR', #29 + '8 209' => 'HD PENTAX-DA 20-40mm F2.8-4 ED Limited DC WR', #29 + '8 210' => 'smc PENTAX-DA 18-270mm F3.5-6.3 ED SDM', #Helmut Schutz + '8 211' => 'HD PENTAX-DA 560mm F5.6 ED AW', #PH + '8 215' => 'smc PENTAX-DA 18-135mm F3.5-5.6 ED AL [IF] DC WR', #PH + '8 226' => 'smc PENTAX-DA* 55mm F1.4 SDM', #JD + '8 227' => 'smc PENTAX-DA* 60-250mm F4 [IF] SDM', #JD + '8 232' => 'smc PENTAX-DA 17-70mm F4 AL [IF] SDM', #JD + '8 234' => 'smc PENTAX-DA* 300mm F4 ED [IF] SDM', #19 + '8 235' => 'smc PENTAX-DA* 200mm F2.8 ED [IF] SDM', #JD + '8 241' => 'smc PENTAX-DA* 50-135mm F2.8 ED [IF] SDM', #JD + '8 242' => 'smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM', #JD + '8 255' => 'Sigma Lens (8 255)', + '8 255.1' => 'Sigma 70-200mm F2.8 EX DG Macro HSM II', #JD + '8 255.2' => 'Sigma 150-500mm F5-6.3 DG APO [OS] HSM', #JD (non-OS version has same type, ref 29) + '8 255.3' => 'Sigma 50-150mm F2.8 II APO EX DC HSM', #forum2997 + '8 255.4' => 'Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye', #PH + '8 255.5' => 'Sigma 50-200mm F4-5.6 DC OS', #26 + '8 255.6' => 'Sigma 24-70mm F2.8 EX DG HSM', #29 +# +# 645 lenses +# + '9 0' => '645 Manual Lens', #PH (NC) + '10 0' => '645 A Series Lens', #PH + '11 1' => 'smc PENTAX-FA 645 75mm F2.8', #PH + '11 2' => 'smc PENTAX-FA 645 45mm F2.8', #PH + '11 3' => 'smc PENTAX-FA* 645 300mm F4 ED [IF]', #PH + '11 4' => 'smc PENTAX-FA 645 45-85mm F4.5', #PH + '11 5' => 'smc PENTAX-FA 645 400mm F5.6 ED [IF]', #PH + '11 7' => 'smc PENTAX-FA 645 Macro 120mm F4', #PH + '11 8' => 'smc PENTAX-FA 645 80-160mm F4.5', #PH + '11 9' => 'smc PENTAX-FA 645 200mm F4 [IF]', #PH + '11 10' => 'smc PENTAX-FA 645 150mm F2.8 [IF]', #PH + '11 11' => 'smc PENTAX-FA 645 35mm F3.5 AL [IF]', #PH + '11 12' => 'smc PENTAX-FA 645 300mm F5.6 ED [IF]', #29 + '11 14' => 'smc PENTAX-FA 645 55-110mm F5.6', #PH + '11 16' => 'smc PENTAX-FA 645 33-55mm F4.5 AL', #PH + '11 17' => 'smc PENTAX-FA 645 150-300mm F5.6 ED [IF]', #PH + '11 21' => 'HD PENTAX-D FA 645 35mm F3.5 AL [IF]', #29 + '13 18' => 'smc PENTAX-D FA 645 55mm F2.8 AL [IF] SDM AW', #PH + '13 19' => 'smc PENTAX-D FA 645 25mm F4 AL [IF] SDM AW', #PH + '13 20' => 'HD PENTAX-D FA 645 90mm F2.8 ED AW SR', #PH + '13 253' => 'HD PENTAX-DA 645 28-45mm F4.5 ED AW SR', #Dominique Schrekling email + '13 254' => 'smc PENTAX-DA 645 25mm F4 AL [IF] SDM AW', #forum8253 +# +# Q-mount lenses (21=auto focus lens, 22=manual focus) +# + '21 0' => 'Pentax Q Manual Lens', #PH + '21 1' => '01 Standard Prime 8.5mm F1.9', #PH + '21 2' => '02 Standard Zoom 5-15mm F2.8-4.5', #PH + '22 3' => '03 Fish-eye 3.2mm F5.6', #PH + '22 4' => '04 Toy Lens Wide 6.3mm F7.1', #PH + '22 5' => '05 Toy Lens Telephoto 18mm F8', #PH + '21 6' => '06 Telephoto Zoom 15-45mm F2.8', #PH + '21 7' => '07 Mount Shield 11.5mm F9', #PH (NC) + '21 8' => '08 Wide Zoom 3.8-5.9mm F3.7-4', #PH (NC) + '21 233' => 'Adapter Q for K-mount Lens', #29 +# +# Ricoh lenses +# + '31 1' => 'GR Lens', #PH (GR III 28mm F2.8) +); + +# Pentax model ID codes - PH +my %pentaxModelID = ( + 0x0000d => 'Optio 330/430', + 0x12926 => 'Optio 230', + 0x12958 => 'Optio 330GS', + 0x12962 => 'Optio 450/550', + 0x1296c => 'Optio S', + 0x12971 => 'Optio S V1.01', + 0x12994 => '*ist D', + 0x129b2 => 'Optio 33L', + 0x129bc => 'Optio 33LF', + 0x129c6 => 'Optio 33WR/43WR/555', + 0x129d5 => 'Optio S4', + 0x12a02 => 'Optio MX', + 0x12a0c => 'Optio S40', + 0x12a16 => 'Optio S4i', + 0x12a34 => 'Optio 30', + 0x12a52 => 'Optio S30', + 0x12a66 => 'Optio 750Z', + 0x12a70 => 'Optio SV', + 0x12a75 => 'Optio SVi', + 0x12a7a => 'Optio X', + 0x12a8e => 'Optio S5i', + 0x12a98 => 'Optio S50', + 0x12aa2 => '*ist DS', + 0x12ab6 => 'Optio MX4', + 0x12ac0 => 'Optio S5n', + 0x12aca => 'Optio WP', + 0x12afc => 'Optio S55', + 0x12b10 => 'Optio S5z', + 0x12b1a => '*ist DL', + 0x12b24 => 'Optio S60', + 0x12b2e => 'Optio S45', + 0x12b38 => 'Optio S6', + 0x12b4c => 'Optio WPi', #13 + 0x12b56 => 'BenQ DC X600', + 0x12b60 => '*ist DS2', + 0x12b62 => 'Samsung GX-1S', + 0x12b6a => 'Optio A10', + 0x12b7e => '*ist DL2', + 0x12b80 => 'Samsung GX-1L', + 0x12b9c => 'K100D', + 0x12b9d => 'K110D', + 0x12ba2 => 'K100D Super', #JD + 0x12bb0 => 'Optio T10/T20', + 0x12be2 => 'Optio W10', + 0x12bf6 => 'Optio M10', + 0x12c1e => 'K10D', + 0x12c20 => 'Samsung GX10', + 0x12c28 => 'Optio S7', + 0x12c2d => 'Optio L20', + 0x12c32 => 'Optio M20', + 0x12c3c => 'Optio W20', + 0x12c46 => 'Optio A20', + 0x12c78 => 'Optio E30', + 0x12c7d => 'Optio E35', + 0x12c82 => 'Optio T30', + 0x12c8c => 'Optio M30', + 0x12c91 => 'Optio L30', + 0x12c96 => 'Optio W30', + 0x12ca0 => 'Optio A30', + 0x12cb4 => 'Optio E40', + 0x12cbe => 'Optio M40', + 0x12cc3 => 'Optio L40', + 0x12cc5 => 'Optio L36', + 0x12cc8 => 'Optio Z10', + 0x12cd2 => 'K20D', + 0x12cd4 => 'Samsung GX20', #8 + 0x12cdc => 'Optio S10', + 0x12ce6 => 'Optio A40', + 0x12cf0 => 'Optio V10', + 0x12cfa => 'K200D', + 0x12d04 => 'Optio S12', + 0x12d0e => 'Optio E50', + 0x12d18 => 'Optio M50', + 0x12d22 => 'Optio L50', + 0x12d2c => 'Optio V20', + 0x12d40 => 'Optio W60', + 0x12d4a => 'Optio M60', + 0x12d68 => 'Optio E60/M90', + 0x12d72 => 'K2000', + 0x12d73 => 'K-m', + 0x12d86 => 'Optio P70', + 0x12d90 => 'Optio L70', + 0x12d9a => 'Optio E70', + 0x12dae => 'X70', + 0x12db8 => 'K-7', + 0x12dcc => 'Optio W80', + 0x12dea => 'Optio P80', + 0x12df4 => 'Optio WS80', + 0x12dfe => 'K-x', + 0x12e08 => '645D', + 0x12e12 => 'Optio E80', + 0x12e30 => 'Optio W90', + 0x12e3a => 'Optio I-10', + 0x12e44 => 'Optio H90', + 0x12e4e => 'Optio E90', + 0x12e58 => 'X90', + 0x12e6c => 'K-r', + 0x12e76 => 'K-5', + 0x12e8a => 'Optio RS1000/RS1500', + 0x12e94 => 'Optio RZ10', + 0x12e9e => 'Optio LS1000', + 0x12ebc => 'Optio WG-1 GPS', + 0x12ed0 => 'Optio S1', + 0x12ee4 => 'Q', + 0x12ef8 => 'K-01', + 0x12f0c => 'Optio RZ18', + 0x12f16 => 'Optio VS20', + 0x12f2a => 'Optio WG-2 GPS', + 0x12f48 => 'Optio LS465', + 0x12f52 => 'K-30', + 0x12f5c => 'X-5', + 0x12f66 => 'Q10', + 0x12f70 => 'K-5 II', + 0x12f71 => 'K-5 II s', #forum4515 + 0x12f7a => 'Q7', + 0x12f84 => 'MX-1', + 0x12f8e => 'WG-3 GPS', + 0x12f98 => 'WG-3', + 0x12fa2 => 'WG-10', + 0x12fb6 => 'K-50', + 0x12fc0 => 'K-3', #29 + 0x12fca => 'K-500', + 0x12fe8 => 'WG-4', # (Ricoh) + 0x12fde => 'WG-4 GPS', # (Ricoh) + 0x13006 => 'WG-20', # (Ricoh) + 0x13010 => '645Z', + 0x1301a => 'K-S1', + 0x13024 => 'K-S2', #29 (Ricoh) + 0x1302e => 'Q-S1', + 0x13056 => 'WG-30', # (Ricoh) + 0x1307e => 'WG-30W', # (Ricoh) + 0x13088 => 'WG-5 GPS', # (Ricoh) + 0x13092 => 'K-1', #IB (Ricoh) + 0x1309c => 'K-3 II', #29 (Ricoh) + 0x131f0 => 'WG-M2', # (Ricoh) + 0x1320e => 'GR III', # (Ricoh) + 0x13222 => 'K-70', #29 (Ricoh) + 0x1322c => 'KP', #29 (Ricoh) + 0x13240 => 'K-1 Mark II', # (Ricoh) + 0x13254 => 'K-3 Mark III', #IB (Ricoh) + 0x13290 => 'WG-70', # (Ricoh) +); + +# Pentax city codes - (PH, Optio WP) +my %pentaxCities = ( + 0 => 'Pago Pago', + 1 => 'Honolulu', + 2 => 'Anchorage', + 3 => 'Vancouver', + 4 => 'San Francisco', + 5 => 'Los Angeles', + 6 => 'Calgary', + 7 => 'Denver', + 8 => 'Mexico City', + 9 => 'Chicago', + 10 => 'Miami', + 11 => 'Toronto', + 12 => 'New York', + 13 => 'Santiago', + 14 => 'Caracus', + 15 => 'Halifax', + 16 => 'Buenos Aires', + 17 => 'Sao Paulo', + 18 => 'Rio de Janeiro', + 19 => 'Madrid', + 20 => 'London', + 21 => 'Paris', + 22 => 'Milan', + 23 => 'Rome', + 24 => 'Berlin', + 25 => 'Johannesburg', + 26 => 'Istanbul', + 27 => 'Cairo', + 28 => 'Jerusalem', + 29 => 'Moscow', + 30 => 'Jeddah', + 31 => 'Tehran', + 32 => 'Dubai', + 33 => 'Karachi', + 34 => 'Kabul', + 35 => 'Male', + 36 => 'Delhi', + 37 => 'Colombo', + 38 => 'Kathmandu', + 39 => 'Dacca', + 40 => 'Yangon', + 41 => 'Bangkok', + 42 => 'Kuala Lumpur', + 43 => 'Vientiane', + 44 => 'Singapore', + 45 => 'Phnom Penh', + 46 => 'Ho Chi Minh', + 47 => 'Jakarta', + 48 => 'Hong Kong', + 49 => 'Perth', + 50 => 'Beijing', + 51 => 'Shanghai', + 52 => 'Manila', + 53 => 'Taipei', + 54 => 'Seoul', + 55 => 'Adelaide', + 56 => 'Tokyo', + 57 => 'Guam', + 58 => 'Sydney', + 59 => 'Noumea', + 60 => 'Wellington', + 61 => 'Auckland', + 62 => 'Lima', + 63 => 'Dakar', + 64 => 'Algiers', + 65 => 'Helsinki', + 66 => 'Athens', + 67 => 'Nairobi', + 68 => 'Amsterdam', + 69 => 'Stockholm', + 70 => 'Lisbon', #14 + 71 => 'Copenhagen', #NJ + 72 => 'Warsaw', + 73 => 'Prague', + 74 => 'Budapest', +); + +# digital filter tag information (ref PH, K-5) +# (also see %filterSettings below for decoding of filter parameters) +my %digitalFilter = ( + Format => 'undef[17]', + RawConv => '($val!~/^\\0/ or $$self{OPTIONS}{Unknown}) ? join(" ",unpack("Cc*",$val)) : undef', + SeparateTable => 'DigitalFilter', + ValueConvInv => q{ + return "\0" x 17 if $val eq "0"; + $val = pack("Cc*", $val=~/[-+]?\d+/g); + length($val)==17 or warn("Expecting 17 values\n"), return undef; + return $val; + }, + PrintConv => { + OTHER => \&PrintFilter, # this routine actually converts all values + 0 => 'Off', + 1 => 'Base Parameter Adjust', + 2 => 'Soft Focus', + 3 => 'High Contrast', + 4 => 'Color Filter', + 5 => 'Extract Color', + 6 => 'Monochrome', + 7 => 'Slim', + 9 => 'Fisheye', + 10 => 'Toy Camera', + 11 => 'Retro', + 12 => 'Pastel', + 13 => 'Water Color', + 14 => 'HDR', + 16 => 'Miniature', + 17 => 'Starburst', + 18 => 'Posterization', + 19 => 'Sketch Filter', + 20 => 'Shading', # (Q) + 21 => 'Invert Color', # (Q) + 23 => 'Tone Expansion', #Forum5247 + 27 => 'Unicolor Bold', #31 + 28 => 'Bold Monochrome', #31 + 29 => 'Replace Color', #31 + 254 => 'Custom Filter', + }, +); + +# digital filter setting names and conversions (ref PH, K-5) +# Note: names must be unique for writing +my %filterSettings = ( + 1 => ['Brightness', '%+d'], # BPA (-8-+8) + 2 => ['Saturation', '%+d'], # BPA (-3-+3) + 3 => ['Hue', '%+d'], # BPA (-3-+3) + 4 => ['Contrast', '%+d'], # BPA (-3-+3) + 5 => ['Sharpness', '%+d'], # BPA (-3-+3) + 6 => ['SoftFocus', '%d'], # Soft Focus/Custom (1-3) + 7 => ['ShadowBlur', { 0=>'Off',1=>'On' }], # Soft Focus + 8 => ['HighContrast', '%d'], # High Contrast/Custom (1-5) + 9 => ['Color', { 1=>'Red',2=>'Magenta',3=>'Blue',4=>'Cyan',5=>'Green',6=>'Yellow' }], # Color Filter + 10 => ['Density', { 1=>'Light',2=>'Standard',3=>'Dark' }], # Color Filter + 11 => ['ExtractedColor',{ 0=>'Off',1=>'Red',2=>'Magenta',3=>'Blue',4=>'Cyan',5=>'Green',6=>'Yellow' }], # Extract Color [x2] + 12 => ['ColorRange', '%+d'], # Extract Color [x2] (-2-+2) + 13 => ['FilterEffect', { 0=>'Off',1=>'Red',2=>'Green',3=>'Blue',4=>'Infrared'}], # Monochrome + 14 => ['ToningBA', '%+d'], # Monochrome (-3-+3) + 15 => ['InvertColor', { 0=>'Off',1=>'On' }], # Custom/Invert Color + 16 => ['Slim', '%+d'], # Slim (-8-+8) + 17 => ['EffectDensity', { 1=>'Sparse',2=>'Normal',3=>'Dense' }], # Starburst + 18 => ['Size', { 1=>'Small',2=>'Medium',3=>'Large' }], # Starburst + 19 => ['Angle', { 0=>'0deg',2=>'30deg',3=>'45deg',4=>'60deg'}], # Starburst (1 is unused) + 20 => ['Fisheye', { 1=>'Weak',2=>'Medium',3=>'Strong' }], # Fisheye + 21 => ['DistortionType', '%d'], # Custom (1-3) + 22 => ['DistortionLevel',{0=>'Off',1=>'Weak',2=>'Medium',3=>'Strong' }], #Custom + 23 => ['ShadingType', '%d'], # Custom/Shading (1-6) + 24 => ['ShadingLevel', '%+d'], # Custom/Shading (-3-+3) + 25 => ['Shading', '%d'], # Toy Camera (1-3) + 26 => ['Blur', '%d'], # Toy Camera (1-3) + 27 => ['ToneBreak', { 0=>'Off',1=>'Red',2=>'Green',3=>'Blue',4=>'Yellow'}], # Toy Camera/Custom + 28 => ['Toning', '%+d'], # Retro (-3-+3) + 29 => ['FrameComposite',{ 0=>'None',1=>'Thin',2=>'Medium',3=>'Thick' }], # Retro + 30 => ['PastelStrength',{ 1=>'Weak',2=>'Medium',3=>'Strong' }], # Pastel + 31 => ['Intensity', '%d'], # Water Color (1-3) + 32 => ['Saturation2', { 0=>'Off',1=>'Low',2=>'Medium',3=>'High' }], # Water Color + 33 => ['HDR', { 1=>'Weak',2=>'Medium',3=>'Strong' }], # HDR + # (34 missing) + 35 => ['FocusPlane', '%+d'], # Miniature (-3-+3) + 36 => ['FocusWidth', { 1=>'Narrow',2=>'Middle',3=>'Wide' }], # Miniature + 37 => ['PlaneAngle', { 0=>'Horizontal',1=>'Vertical',2=>'Positive slope',3=>'Negative slope' }], # Miniature + 38 => ['Blur2', '%d'], # Miniature (1-3) + 39 => ['Shape', { 1=>'Cross',2=>'Star',3=>'Snowflake',4=>'Heart',5=>'Note'}], # Starburst + 40 => ['Posterization', '%d'], # Posterization (1-5) + 41 => ['Contrast2', { 1=>'Low',2=>'Medium',3=>'High'}], # Sketch Filter + 42 => ['ScratchEffect', { 0=>'Off',1=>'On' }], # Sketch Filter + 45 => ['ToneExpansion', { 1=>'Low',2=>'Medium',3=>'High' }], # Tone Expansion (ref Forum5247) + 47 => ['UnicolorBold', { 1=>'Red',2=>'Magenta',3=>'Blue',4=>'Cyan',5=>'Green',6=>'Yellow' }], #31 Unicolor Bold + 48 => ['BoldMonochrome', '%d'], #31 Bold Monochrome (1-3) + 49 => ['OriginalColor', { 1=>'Red',2=>'Magenta',3=>'Blue',4=>'Cyan',5=>'Green',6=>'Yellow' }], #31 Replace Color + 50 => ['NewColor', { 1=>'Red',2=>'Magenta',3=>'Blue',4=>'Cyan',5=>'Green',6=>'Yellow' }], #31 Replace Color + 51 => ['ColorScale', '%d'], #31 Replace Color (1-5) + 52 => ['Toning2', '%+d'], #31 Extract Color (-3-+3) +); + +# decoding for Pentax Firmware ID tags - PH +my %pentaxFirmwareID = ( + # the first 2 numbers are the firmware version, I'm not sure what the second 2 mean + # Note: the byte order may be different for some models + # which give, for example, version 0.01 instead of 1.00 + ValueConv => sub { + my $val = shift; + return $val unless length($val) == 4; + # (value is encrypted by toggling all bits) + my @a = map { $_ ^ 0xff } unpack("C*",$val); + return sprintf('%d %.2d %.2d %.2d', @a); + }, + ValueConvInv => sub { + my $val = shift; + my @a = $val=~/\b\d+\b/g; + return $val unless @a == 4; + @a = map { ($_ & 0xff) ^ 0xff } @a; + return pack("C*", @a); + }, + PrintConv => '$val=~tr/ /./; $val', + PrintConvInv => '$val=~s/^(\d+)\.(\d+)\.(\d+)\.(\d+)/$1 $2 $3 $4/ ? $val : undef', +); + +# convert 16 or 77 metering segment values to approximate LV equivalent - PH +my %convertMeteringSegments = ( + PrintConv => sub { join ' ', map( + { $_==255 ? 'n/a' : $_==0 ? '0' : sprintf '%.1f', $_ / 8 - 6 } split(' ',$_[0]) + ) }, + PrintConvInv => sub { join ' ', map( + { /^n/i ? 255 : $_==0 ? '0' : int(($_ + 6) * 8 + 0.5) } split(' ',$_[0]) + ) }, +); + +# lens code conversions +my %lensCode = ( + Unknown => 1, + PrintConv => 'sprintf("0x%.2x", $val)', + PrintConvInv => 'hex($val)', +); + +# conversions for tags 0x0053-0x005a +my %colorTemp = ( + Writable => 'undef', + Count => 4, + ValueConv => sub { + my $val = shift; + return $val unless length $val == 4; + my @a = unpack 'nCC', $val; + $a[0] = 53190 - $a[0]; + $a[1] = ($a[2] & 0x0f); $a[1] -= 16 if $a[1] >= 8; + $a[2] = ($a[2] >> 4); $a[2] -= 16 if $a[2] >= 8; + return "@a"; + }, + ValueConvInv => sub { + my $val = shift; + my @a = split ' ', $val; + return undef unless @a == 3; + return pack 'nCC', 53190 - $a[0], 0, ($a[1] & 0x0f) + (($a[2] & 0x0f) << 4); + }, + PrintConv => sub { + $_ = shift; + s/ ([1-9])/ +$1/g; + s/ 0/ 0/g; + return $_; + }, + PrintConvInv => '$val', +); + +# conversions for KelvinWB tags +my %kelvinWB = ( + Format => 'int16u[4]', + ValueConv => sub { + my @a = split ' ', shift; + (53190 - $a[0]) . ' ' . $a[1] . ' ' . ($a[2] / 8192) . ' ' . ($a[3] / 8192); + }, + ValueConvInv => sub { + my @a = split ' ', shift; + (53190 - $a[0]) . ' ' . $a[1] . ' ' . int($a[2]*8192+0.5) . ' ' . int($a[3]*8192+0.5); + }, +); + +my %noYes = ( 0 => 'No', 1 => 'Yes' ); + +# common attributes for writable BinaryData directories +my %binaryDataAttrs = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, +); + +# Pentax makernote tags +%Image::ExifTool::Pentax::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + WRITABLE => 1, + 0x0000 => { #5 + Name => 'PentaxVersion', + Writable => 'int8u', + Count => 4, + PrintConv => '$val=~tr/ /./; $val', + PrintConvInv => '$val=~tr/./ /; $val', + # 0.1.0.3 - PENTAX Optio E40 + # 3.0.0.0 - K10D + # 3.1.0.0 - Optio A40/S10/L36/L40/M40/V10 + # 3.1.1.0 - Optio L36/L40/M40/V10 + # 3.1.2.0 - Optio Z10 + # 4.0.2.0 - Optio E50 + # 4.1.0.0 - Optio S12 + # 4.1.1.0 - Optio M50 + # 4.1.2.0 - K20D, K200D + # 4.2.0.0 - Optio L50/V20 + # 4.2.1.0 - Optio E60/M90 + # 4.2.2.0 - Optio W60 + # 4.2.3.0 - Optio M60 + # 4.4.0.1 - K-m, K2000 + # 4.5.0.0 - Optio E70/L70 + # 4.5.0.0 - Optio E70/L70/P70 + # 4.6.0.0 - Optio E80/E90/W80 + # 5.0.0.0 - K-7, Optio P80/WS80 + # 5.1.0.0 - K-x + # 5.2.0.0 - Optio I-10 + # 5.3.0.0 - Optio H90 + # 5.3.2.0 - Optio W90/X90 + # 6.0.0.0 - K-r, 645D + # 6.1.3.0 - Optio LS1000/RS1000/RS1500/RZ10 + # 7.0.0.0 - K-5 + # 7.1.0.0 - Optio WG-1GPS/WG-10/WG-20 + # 7.2.0.0 - Optio S1 + # 8.0.0.0 - Q + # 8.0.1.0 - Optio RZ18 + # 8.0.4.0 - Optio VS20 + # 8.1.0.0 - Optio LS465/WG-2GPS + # 9.0.0.0 - K-01 + # 9.1.2.0 - X-5 + # 10.0.0.0 - K-30, K-50, K-500, K-5 II, K-5 II s + # 10.0.2.0 - Q10 + # 10.2.0.0 - WG-3/WG-4 + # 10.2.1.0 - MX-1 + # 10.4.1.0 - WG-3/4/5 GPS, WG-30/30W + # 10.6.1.0 - Q-S1, Q7 + # 11.0.0.0 - K-3 + # 11.2.1.0 - 645Z + # 11.3.0.0 - K-S1 + # 11.5.0.0 - K-S2 + # 11.6.1.0 - K-3 II + # 11.7.5.0 - WG-M2 + # 12.0.0.0 - K-1 + # 12.1.3.0 - K-70 + # 12.1.5.0 - KP + }, + 0x0001 => { #PH + Name => 'PentaxModelType', + Writable => 'int16u', + # (values of 0-5 seem to group models into 6 categories, ref 13) + }, + 0x0002 => { #PH + Name => 'PreviewImageSize', + Groups => { 2 => 'Image' }, + Writable => 'int16u', + Count => 2, + PrintConv => '$val =~ tr/ /x/; $val', + PrintConvInv => '$val =~ tr/x/ /; $val', + }, + 0x0003 => { #PH + Name => 'PreviewImageLength', + OffsetPair => 0x0004, # point to associated offset + DataTag => 'PreviewImage', + Groups => { 2 => 'Image' }, + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + 0x0004 => { #PH + Name => 'PreviewImageStart', + IsOffset => 2, # code to use original base + OffsetPair => 0x0003, # point to associated byte count + DataTag => 'PreviewImage', + Groups => { 2 => 'Image' }, + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + 0x0005 => { #13 + Name => 'PentaxModelID', + Writable => 'int32u', + PrintHex => 1, + SeparateTable => 1, + DataMember => 'PentaxModelID', + RawConv => '$$self{PentaxModelID} = $val', + PrintConv => \%pentaxModelID, + }, + 0x0006 => { #5 + # Note: Year is int16u in MM byte ordering regardless of EXIF byte order + Name => 'Date', + Groups => { 2 => 'Time' }, + Notes => 'changing either Date or Time will affect ShutterCount decryption', + Writable => 'undef', + Count => 4, + Shift => 'Time', + DataMember => 'PentaxDate', + RawConv => '$$self{PentaxDate} = $val', # save to decrypt ShutterCount + ValueConv => 'length($val)==4 ? sprintf("%.4d:%.2d:%.2d",unpack("nC2",$val)) : "Unknown ($val)"', + ValueConvInv => q{ + $val =~ s/(\d) .*/$1/; # remove Time + my @v = split /:/, $val; + return pack("nC2",$v[0],$v[1],$v[2]); + }, + }, + 0x0007 => { #5 + Name => 'Time', + Groups => { 2 => 'Time' }, + Writable => 'undef', + Count => 3, + Shift => 'Time', + DataMember => 'PentaxTime', + RawConv => '$$self{PentaxTime} = $val', # save to decrypt ShutterCount + ValueConv => 'length($val)>=3 ? sprintf("%.2d:%.2d:%.2d",unpack("C3",$val)) : "Unknown ($val)"', + ValueConvInv => q{ + $val =~ s/^[0-9:]+ (\d)/$1/; # remove Date + return pack("C3",split(/:/,$val)); + }, + }, + 0x0008 => { #2 + Name => 'Quality', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Good', + 1 => 'Better', + 2 => 'Best', + 3 => 'TIFF', #5 + 4 => 'RAW', #5 + 5 => 'Premium', #PH (K20D) + 7 => 'RAW (pixel shift enabled)', #forum6536 (K-3 II) + 8 => 'Dynamic Pixel Shift', #IB + 65535 => 'n/a', #PH (Q MOV video) + }, + }, + 0x0009 => { #3 + Name => 'PentaxImageSize', + Groups => { 2 => 'Image' }, + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 0 => '640x480', + 1 => 'Full', #PH - this can mean 2048x1536 or 2240x1680 or ... ? + 2 => '1024x768', + 3 => '1280x960', #PH (Optio WP) + 4 => '1600x1200', + 5 => '2048x1536', + 8 => '2560x1920 or 2304x1728', #PH (Optio WP) or #14 + 9 => '3072x2304', #PH (Optio M30) + 10 => '3264x2448', #13 + 19 => '320x240', #PH (Optio WP) + 20 => '2288x1712', #13 + 21 => '2592x1944', + 22 => '2304x1728 or 2592x1944', #2 or #14 + 23 => '3056x2296', #13 + 25 => '2816x2212 or 2816x2112', #13 or #14 + 27 => '3648x2736', #PH (Optio A20) + 29 => '4000x3000', #PH (X70) + 30 => '4288x3216', #PH (Optio RS1000) + 31 => '4608x3456', #PH (Optio RZ18) + 129 => '1920x1080', #PH (Optio RZ10) + 135 => '4608x2592', #PH (Q10 stretch filter) + 257 => '3216x3216', #PH (Optio RZ10) + '0 0' => '2304x1728', #13 + '4 0' => '1600x1200', #PH (Optio MX4) + '5 0' => '2048x1536', #13 + '8 0' => '2560x1920', #13 + '32 2' => '960x640', #7 + '33 2' => '1152x768', #7 + '34 2' => '1536x1024', #7 + '35 1' => '2400x1600', #7 + '36 0' => '3008x2008 or 3040x2024', #PH + '37 0' => '3008x2000', #13 + # 65535 - seen for an X-5 panorama (PH) + }, + }, + 0x000b => { #3 + Name => 'PictureMode', + Writable => 'int16u', + Count => -1, + Notes => q{ + 1 or 2 values. Decimal values differentiate Optio 555 modes which are + different from other models + }, + ValueConv => '(IsInt($val) and $val < 4 and $$self{Model} =~ /Optio 555\b/) ? $val + 0.1 : $val', + ValueConvInv => 'int $val', + PrintConvColumns => 2, + PrintConv => [{ + 0 => 'Program', #PH + 0.1 => 'Av', #PH (Optio 555) + 1 => 'Shutter Speed Priority', #JD + 1.1 => 'M', #PH (Optio 555) + 2 => 'Program AE', #13 + 2.1 => 'Tv', #PH (Optio 555) + 3 => 'Manual', #13 + 3.1 => 'USER', #PH (Optio 555) + 5 => 'Portrait', + 6 => 'Landscape', + 8 => 'Sport', #PH + 9 => 'Night Scene', + # 10 "full mode"? #13 + 11 => 'Soft', #PH + 12 => 'Surf & Snow', + 13 => 'Candlelight', #13 + 14 => 'Autumn', + 15 => 'Macro', + 17 => 'Fireworks', + 18 => 'Text', + 19 => 'Panorama', #PH + 20 => '3-D', #PH (Optio 555) + 21 => 'Black & White', #PH (Optio 555) + 22 => 'Sepia', #PH (Optio 555) + 23 => 'Red', #PH (Optio 555) + 24 => 'Pink', #PH (Optio 555) + 25 => 'Purple', #PH (Optio 555) + 26 => 'Blue', #PH (Optio 555) + 27 => 'Green', #PH (Optio 555) + 28 => 'Yellow', #PH (Optio 555) + 30 => 'Self Portrait', #PH + 31 => 'Illustrations', #13 + 33 => 'Digital Filter', #13 + 35 => 'Night Scene Portrait', #NJ + 37 => 'Museum', #PH + 38 => 'Food', #PH + 39 => 'Underwater', #NJ + 40 => 'Green Mode', #PH + 49 => 'Light Pet', #PH + 50 => 'Dark Pet', #PH + 51 => 'Medium Pet', #PH + 53 => 'Underwater', #PH + 54 => 'Candlelight', #PH + 55 => 'Natural Skin Tone', #PH + 56 => 'Synchro Sound Record', #PH + 58 => 'Frame Composite', #14 + 59 => 'Report', #NJ + 60 => 'Kids', #13 + 61 => 'Blur Reduction', #13 + 63 => 'Panorama 2', #PH (X-5) + 65 => 'Half-length Portrait', #JD + 66 => 'Portrait 2', #PH (LS645) + 74 => 'Digital Microscope', #PH (WG-4) + 75 => 'Blue Sky', #PH (LS465) + 80 => 'Miniature', #PH (VS20) + 81 => 'HDR', #PH (LS465) + 83 => 'Fisheye', #PH (VS20) + 85 => 'Digital Filter 4', #PH (WG-5) + 221 => 'P', #PH (Optio 555) + 255=> 'PICT', #PH (Optio 555) + }], + }, + 0x000c => { #PH + Name => 'FlashMode', + Writable => 'int16u', + Count => -1, + PrintHex => 1, + PrintConv => [{ + 0x000 => 'Auto, Did not fire', + 0x001 => 'Off, Did not fire', + 0x002 => 'On, Did not fire', #19 + 0x003 => 'Auto, Did not fire, Red-eye reduction', + 0x005 => 'On, Did not fire, Wireless (Master)', #19 + 0x100 => 'Auto, Fired', + 0x102 => 'On, Fired', + 0x103 => 'Auto, Fired, Red-eye reduction', + 0x104 => 'On, Red-eye reduction', + 0x105 => 'On, Wireless (Master)', #19 + 0x106 => 'On, Wireless (Control)', #19 + 0x108 => 'On, Soft', + 0x109 => 'On, Slow-sync', + 0x10a => 'On, Slow-sync, Red-eye reduction', + 0x10b => 'On, Trailing-curtain Sync', + },{ #19 (AF-540FGZ flash) + 0x000 => 'n/a - Off-Auto-Aperture', #19 + 0x03f => 'Internal', + 0x100 => 'External, Auto', + 0x23f => 'External, Flash Problem', #JD + 0x300 => 'External, Manual', + 0x304 => 'External, P-TTL Auto', + 0x305 => 'External, Contrast-control Sync', #JD + 0x306 => 'External, High-speed Sync', + 0x30c => 'External, Wireless', + 0x30d => 'External, Wireless, High-speed Sync', + }], + }, + 0x000d => [ #2 + { + Name => 'FocusMode', + # (can't test for "PENTAX" because MOV videos don't have Make) + Condition => '$$self{Make} !~ /^Asahi/', + Notes => 'Pentax models', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { #PH + 0 => 'Normal', + 1 => 'Macro', + 2 => 'Infinity', + 3 => 'Manual', + 4 => 'Super Macro', #JD + 5 => 'Pan Focus', + # 8 - seen for Ricoh GR III + # 9 - seen for Ricoh GR III + 16 => 'AF-S (Focus-priority)', #17 + 17 => 'AF-C (Focus-priority)', #17 + 18 => 'AF-A (Focus-priority)', #PH (educated guess) + 32 => 'Contrast-detect (Focus-priority)', #PH (K-5) + 33 => 'Tracking Contrast-detect (Focus-priority)', #PH (K-5) + # bit 8 indicates release priority + 272 => 'AF-S (Release-priority)', #PH (K-5,K-3) + 273 => 'AF-C (Release-priority)', #PH (K-5,K-3) + 274 => 'AF-A (Release-priority)', #PH (K-3) + 288 => 'Contrast-detect (Release-priority)', #PH (K-01) + # 32777 (0x8009) - seen for Ricoh GR III + # 32779 (0x800b) - seen for Ricoh GR III + }, + },{ + Name => 'FocusMode', + Writable => 'int16u', + Notes => 'Asahi models', + PrintConv => { #2 + 0 => 'Normal', + 1 => 'Macro (1)', + 2 => 'Macro (2)', + 3 => 'Infinity', + }, + }, + ], + 0x000e => [{ #29 + Name => 'AFPointSelected', + Condition => '$$self{Model} =~ /K-1\b/', + Writable => 'int16u', + Notes => 'K-1', + PrintConvColumns => 2, + PrintConv => [{ + 0xffff => 'Auto', + 0xfffe => 'Fixed Center', + 0xfffd => 'Automatic Tracking AF', #JD + 0xfffc => 'Face Detect AF', #JD + 0xfffb => 'AF Select', #PH (Q select from 25-areas) + # AF pattern: + # 01 02 03 04 05 + # 06 07 08 09 10 11 12 + # 13 14 15 16 17 18 19 20 21 + # 22 23 24 25 26 27 28 + # 29 30 31 32 33 + 0 => 'None', + 1 => 'Top-left', + 2 => 'Top Near-left', + 3 => 'Top', + 4 => 'Top Near-right', + 5 => 'Top-right', + 6 => 'Upper Far-left', + 7 => 'Upper-left', + 8 => 'Upper Near-left', + 9 => 'Upper-middle', + 10 => 'Upper Near-right', + 11 => 'Upper-right', + 12 => 'Upper Far-right', + 13 => 'Far Far Left', + 14 => 'Far Left', + 15 => 'Left', + 16 => 'Near-left', + 17 => 'Center', + 18 => 'Near-right', + 19 => 'Right', + 20 => 'Far Right', + 21 => 'Far Far Right', + 22 => 'Lower Far-left', + 23 => 'Lower-left', + 24 => 'Lower Near-left', + 25 => 'Lower-middle', + 26 => 'Lower Near-right', + 27 => 'Lower-right', + 28 => 'Lower Far-right', + 29 => 'Bottom-left', + 30 => 'Bottom Near-left', + 31 => 'Bottom', + 32 => 'Bottom Near-right', + 33 => 'Bottom-right', + 263 => 'Zone Select Upper-left', # 01,02;06,07,08;14,15,16 + 264 => 'Zone Select Upper Near-left', # 01,02,03;07,08,09;15,16,17 + 265 => 'Zone Select Upper Middle', # 02,03,04;08,09,10;16,17,18 + 266 => 'Zone Select Upper Near-right', # 03,04,05;09,10,11;17,18,19 + 267 => 'Zone Select Upper-right', # 04,05;10,11,12;18,19,20 + 270 => 'Zone Select Far Left', # 06,07;13,14,15;22,23 + 271 => 'Zone Select Left', # 06,07,08;14,15,16;22,23,24 + 272 => 'Zone Select Near-left', # 07,08,09;15,16,17;23,24,25 + 273 => 'Zone Select Center', # 08,09,10;16,17,18;24,25,26 + 274 => 'Zone Select Near-right', # 09,10,11;17,18,19;25,26,27 + 275 => 'Zone Select Right', # 10,11,12;18,19,20;26,27,28 + 276 => 'Zone Select Far Right', # 11,12;19,20,21;27,28 + 279 => 'Zone Select Lower-left', # 14,15,16;22,23,24;29,30 + 280 => 'Zone Select Lower Near-left', # 15,16,17;23,24,25;29,30,31 + 281 => 'Zone Select Lower-middle', # 16,17,18;24,25,26;30,31,32 + 282 => 'Zone Select Lower Near-right', # 17,18,19;25,26,27;31,32,33 + 283 => 'Zone Select Lower-right', # 18,19,20;26,27,28;32,33 + },{ + 0 => 'Single Point', + 1 => 'Expanded Area 9-point (S)', + 3 => 'Expanded Area 25-point (M)', + 5 => 'Expanded Area 33-point (L)', + }], + },{ + Name => 'AFPointSelected', + Condition => '$$self{Model} =~ /K-3\b/', + Writable => 'int16u', + Notes => 'K-3', + PrintConvColumns => 2, + PrintConv => [{ + # 0 - Contrast-detect AF? - PH (K-5) + 0xffff => 'Auto', + 0xfffe => 'Fixed Center', + 0xfffd => 'Automatic Tracking AF', #JD + 0xfffc => 'Face Detect AF', #JD + 0xfffb => 'AF Select', #PH (Q select from 25-areas) + # AF pattern: (ref forum5422) + # 01 02 03 04 05 + # 06 07 08 09 10 + # 11 12 13 14 15 16 17 + # 18 19 20 21 22 + # 23 24 25 26 27 + 0 => 'None', + 1 => 'Top-left', + 2 => 'Top Near-left', + 3 => 'Top', + 4 => 'Top Near-right', + 5 => 'Top-right', + 6 => 'Upper-left', + 7 => 'Upper Near-left', + 8 => 'Upper-middle', + 9 => 'Upper Near-right', + 10 => 'Upper-right', + 11 => 'Far Left', + 12 => 'Left', + 13 => 'Near-left', + 14 => 'Center', + 15 => 'Near-right', + 16 => 'Right', + 17 => 'Far Right', + 18 => 'Lower-left', + 19 => 'Lower Near-left', + 20 => 'Lower-middle', + 21 => 'Lower Near-right', + 22 => 'Lower-right', + 23 => 'Bottom-left', + 24 => 'Bottom Near-left', + 25 => 'Bottom', + 26 => 'Bottom Near-right', + 27 => 'Bottom-right', + #forum5892 + 257 => 'Zone Select Top-left', + 258 => 'Zone Select Top Near-left', + 259 => 'Zone Select Top', + 260 => 'Zone Select Top Near-right', + 261 => 'Zone Select Top-right', + 262 => 'Zone Select Upper-left', + 263 => 'Zone Select Upper Near-left', + 264 => 'Zone Select Upper-middle', + 265 => 'Zone Select Upper Near-right', + 266 => 'Zone Select Upper-right', + 267 => 'Zone Select Far Left', + 268 => 'Zone Select Left', + 269 => 'Zone Select Near-left', + 270 => 'Zone Select Center', + 271 => 'Zone Select Near-right', + 272 => 'Zone Select Right', + 273 => 'Zone Select Far Right', + 274 => 'Zone Select Lower-left', + 275 => 'Zone Select Lower Near-left', + 276 => 'Zone Select Lower-middle', + 277 => 'Zone Select Lower Near-right', + 278 => 'Zone Select Lower-right', + 279 => 'Zone Select Bottom-left', + 280 => 'Zone Select Bottom Near-left', + 281 => 'Zone Select Bottom', + 282 => 'Zone Select Bottom Near-right', + 283 => 'Zone Select Bottom-right', + },{ #forum5892 + 0 => 'Single Point', + 1 => 'Expanded Area 9-point (S)', + 3 => 'Expanded Area 25-point (M)', + 5 => 'Expanded Area 27-point (L)', + }], + },{ #7 + Name => 'AFPointSelected', + Writable => 'int16u', + Notes => 'other models', + PrintConvColumns => 2, + PrintConv => [{ + # 0 - Contrast-detect AF? - PH (K-5) + 0xffff => 'Auto', + 0xfffe => 'Fixed Center', + 0xfffd => 'Automatic Tracking AF', #JD + 0xfffc => 'Face Detect AF', #JD + 0xfffb => 'AF Select', #PH (Q select from 25-areas) + 0 => 'None', #PH (Q in manual focus mode) + 1 => 'Upper-left', + 2 => 'Top', + 3 => 'Upper-right', + 4 => 'Left', + 5 => 'Mid-left', + 6 => 'Center', + 7 => 'Mid-right', + 8 => 'Right', + 9 => 'Lower-left', + 10 => 'Bottom', + 11 => 'Lower-right', + }, + # (second number exists for K-5II(s) is usually 0, but is 1 for AF.C with + # AFPointMode=='Select' and extended tracking focus points are enabled in the settings) + ], + }], + 0x000f => [{ #PH + Name => 'AFPointsInFocus', + Condition => '$$self{Model} =~ /K-3\b/', + Writable => 'int32u', + Notes => 'K-3 only', + PrintHex => 1, + PrintConv => { + 0 => '(none)', + BITMASK => { + 0 => 'Top-left', + 1 => 'Top Near-left', + 2 => 'Top', + 3 => 'Top Near-right', + 4 => 'Top-right', + 5 => 'Upper-left', + 6 => 'Upper Near-left', + 7 => 'Upper-middle', + 8 => 'Upper Near-right', + 9 => 'Upper-right', + 10 => 'Far Left', + 11 => 'Left', + 12 => 'Near-left', + 13 => 'Center', + 14 => 'Near-right', + 15 => 'Right', + 16 => 'Far Right', + 17 => 'Lower-left', + 18 => 'Lower Near-left', + 19 => 'Lower-middle', + 20 => 'Lower Near-right', + 21 => 'Lower-right', + 22 => 'Bottom-left', + 23 => 'Bottom Near-left', + 24 => 'Bottom', + 25 => 'Bottom Near-right', + 26 => 'Bottom-right', + }, + }, + },{ #PH + Name => 'AFPointsInFocus', + Notes => 'other models', + Writable => 'int16u', + PrintHex => 1, + PrintConv => { + 0xffff => 'None', + 0 => 'Fixed Center or Multiple', #PH/14 + 1 => 'Top-left', + 2 => 'Top-center', + 3 => 'Top-right', + 4 => 'Left', + 5 => 'Center', + 6 => 'Right', + 7 => 'Bottom-left', + 8 => 'Bottom-center', + 9 => 'Bottom-right', + }, + }], + 0x0010 => { #PH + Name => 'FocusPosition', + Writable => 'int16u', + Notes => 'related to focus distance but affected by focal length', + }, + 0x0012 => { #PH + Name => 'ExposureTime', + Writable => 'int32u', + Priority => 0, + ValueConv => '$val * 1e-5', + ValueConvInv => '$val * 1e5', + # value may be 0xffffffff in Bulb mode (ref JD) + PrintConv => '$val > 42949 ? "Unknown (Bulb)" : Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => '$val=~/(unknown|bulb)/i ? $val : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x0013 => { #PH + Name => 'FNumber', + Writable => 'int16u', + Priority => 0, + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + # ISO Tag - Entries confirmed by W. Smith 12 FEB 04 + 0x0014 => { + Name => 'ISO', + Writable => 'int16u', + Notes => 'may be different than EXIF:ISO, which can round to the nearest full stop', + PrintConvColumns => 4, + PrintConv => { + # 1/3 EV step values + 3 => 50, + 4 => 64, + 5 => 80, + 6 => 100, + 7 => 125, #PH + 8 => 160, #PH + 9 => 200, + 10 => 250, + 11 => 320, #PH + 12 => 400, + 13 => 500, + 14 => 640, + 15 => 800, + 16 => 1000, + 17 => 1250, + 18 => 1600, #PH + 19 => 2000, #PH + 20 => 2500, #PH + 21 => 3200, #PH + 22 => 4000, + 23 => 5000, + 24 => 6400, #PH + 25 => 8000, #PH + 26 => 10000, #PH + 27 => 12800, #PH + 28 => 16000, #PH + 29 => 20000, #PH + 30 => 25600, #PH + 31 => 32000, #PH + 32 => 40000, #PH + 33 => 51200, #PH + 34 => 64000, #PH (NC) + 35 => 80000, #PH (NC) + 36 => 102400, #27 + 37 => 128000, #PH (NC) + 38 => 160000, #PH (NC) + 39 => 204800, #27 + 40 => 256000, #PH (NC) + 41 => 320000, #PH (NC) + 42 => 409600, #PH (NC) + 43 => 512000, #PH (NC) + 44 => 640000, #PH (NC) + 45 => 819200, #PH (KP) + # Optio 330/430 (oddball) + 50 => 50, #PH + 100 => 100, #PH + 200 => 200, #PH + 400 => 400, #PH + 800 => 800, #PH + 1600 => 1600, #PH + 3200 => 3200, #PH + # 1/2 EV step values + 258 => 50, #PH (NC) + 259 => 70, #PH (NC) + 260 => 100, #19 + 261 => 140, #19 + 262 => 200, #19 + 263 => 280, #19 + 264 => 400, #19 + 265 => 560, #19 + 266 => 800, #19 + 267 => 1100, #19 + 268 => 1600, #19 + 269 => 2200, #PH + 270 => 3200, #PH + 271 => 4500, #PH + 272 => 6400, #PH + 273 => 9000, #PH + 274 => 12800, #PH + 275 => 18000, #PH + 276 => 25600, #PH + 277 => 36000, #PH + 278 => 51200, #PH + 279 => 72000, #PH (NC) + 280 => 102400, #PH (NC) + 281 => 144000, #PH (NC) + 282 => 204800, #PH (NC) + 283 => 288000, #PH (NC) + 284 => 409600, #PH (NC) + 285 => 576000, #PH (NC) + 286 => 819200, #PH (NC) + 65534 => 'Auto 2', #PH (Q/Q10/Q7 MOV) [how is this different from 65535?] + 65535 => 'Auto', #PH/31 (K-01/K-70 MP4) + }, + }, + 0x0015 => { #PH + Name => 'LightReading', + Format => 'int16s', # (because I may have seen negative numbers) + Writable => 'int16u', + # ranges from 0-12 for my Optio WP - PH + Notes => q{ + calibrated differently for different models. For the Optio WP, add 6 to get + approximate Light Value. May not be valid for some models, eg. Optio S + }, + }, + 0x0016 => [{ #PH + Name => 'ExposureCompensation', + Condition => '$count == 1', + Notes => q{ + some models write two values here. The second value is meaning of the + second value is not yet known + }, + Writable => 'int16u', + ValueConv => '($val - 50) / 10', + ValueConvInv => 'int($val * 10 + 50.5)', + PrintConv => '$val ? sprintf("%+.1f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + },{ + Name => 'ExposureCompensation', + Writable => 'int16u', + # (2 values for K-70, etc -- have only seen "0" for the 2nd value - PH) + Count => 2, + ValueConv => '$val =~ s/ .*//; ($val - 50) / 10', + ValueConvInv => 'int($val * 10 + 50.5) . " 0"', + PrintConv => '$val ? sprintf("%+.1f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }], + 0x0017 => { #3 + Name => 'MeteringMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Multi-segment', + 1 => 'Center-weighted average', + 2 => 'Spot', + # have seen value of 16 for E70 + }, + }, + 0x0018 => { #PH + Name => 'AutoBracketing', + Writable => 'int16u', + Count => -1, + Notes => q{ + 1 or 2 values: exposure bracket step in EV, then extended bracket if + available. Extended bracket values are printed as 'WB-BA', 'WB-GM', + 'Saturation', 'Sharpness', 'Contrast', 'Hue' or 'HighLowKey' followed by + '+1', '+2' or '+3' for step size + }, + # 1=.3ev, 2=.7, 3=1.0 ... 10=.5, 11=1.5, ... 4096=0, 4097=0.5 ... 8192=0, 8193=0.3 + # (models like K-1 and K-5 use 0x1000 and 0x2000 to indicate 1/2 and 1/3 EV step + # size -- convert this as a fraction so we can recognize this format when writing) + ValueConv => [ q{ + return $val / 3 if $val < 10; + return $val - 9.5 if $val < 20; + return ($val - 0x1000) . '/2' if $val & 0x1000; + return ($val - 0x2000) . '/3' if $val & 0x2000; + return $val; # (shouldn't happen) + }], + ValueConvInv => [ q{ + if ($val =~ s{/(\d+)$}{}) { + return $val + 0x1000 if $1 == 2; + return $val + 0x2000 if $1 == 3; + return undef; + } + return abs($val-int($val)-.5)>0.05 ? int($val*3+0.5) : int($val+10); + }], + PrintConv => sub { + my @v = split(' ', shift); + $v[0] = sprintf('%.1f', $v[0]) if $v[0] and $v[0]!~m{/}; + if ($v[1]) { + my %s = (1=>'WB-BA',2=>'WB-GM',3=>'Saturation',4=>'Sharpness', + 5=>'Contrast',6=>'Hue',7=>'HighLowKey'); + my $t = $v[1] >> 8; + $v[1] = sprintf('%s+%d', $s{$t} || "Unknown($t)", $v[1] & 0xff); + } elsif (defined $v[1]) { + $v[1] = 'No Extended Bracket', + } + return join(' EV, ', @v); + }, + PrintConvInv => sub { + my @v = split(/, ?/, shift); + $v[0] =~ s/ ?EV//i; + if ($v[1]) { + my %s = ('WB-BA'=>1,'WB-GM'=>2,'Saturation'=>3,'Sharpness'=>4, + 'Contrast'=>5,'Hue'=>6,'HighLowKey'=>7); + if ($v[1] =~ /^No\b/i) { + $v[1] = 0; + } elsif ($v[1] =~ /Unknown\((\d+)\)\+(\d+)/i) { + $v[1] = ($1 << 8) + $2; + } elsif ($v[1] =~ /([\w-]+)\+(\d+)/ and $s{$1}) { + $v[1] = ($s{$1} << 8) + $2; + } else { + warn "Bad extended bracket\n"; + } + } + return "@v"; + }, + }, + 0x0019 => { #3 + Name => 'WhiteBalance', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Shade', + 3 => 'Fluorescent', #2 + 4 => 'Tungsten', + 5 => 'Manual', + 6 => 'Daylight Fluorescent', #13 + 7 => 'Day White Fluorescent', #13 + 8 => 'White Fluorescent', #13 + 9 => 'Flash', #13 + 10 => 'Cloudy', #13 + 11 => 'Warm White Fluorescent', #PH (K-3) + 14 => 'Multi Auto', #PH (K-3) + 15 => 'Color Temperature Enhancement', #PH + 17 => 'Kelvin', #PH + 0xfffe => 'Unknown', #13 + 0xffff => 'User-Selected', #13 + }, + }, + 0x001a => { #5 + Name => 'WhiteBalanceMode', + Writable => 'int16u', + PrintConv => { + 1 => 'Auto (Daylight)', + 2 => 'Auto (Shade)', + 3 => 'Auto (Flash)', + 4 => 'Auto (Tungsten)', + 6 => 'Auto (Daylight Fluorescent)', #19 (NC) + 7 => 'Auto (Day White Fluorescent)', #17 (K100D guess) + 8 => 'Auto (White Fluorescent)', #17 (K100D guess) + 10 => 'Auto (Cloudy)', #17 (K100D guess) + # 0xfffd observed in K100D (ref 17) + 0xfffe => 'Unknown', #PH (you get this when shooting night sky shots) + 0xffff => 'User-Selected', + }, + }, + 0x001b => { #6 + Name => 'BlueBalance', + Writable => 'int16u', + ValueConv => '$val / 256', + ValueConvInv => 'int($val * 256 + 0.5)', + }, + 0x001c => { #6 + Name => 'RedBalance', + Writable => 'int16u', + ValueConv => '$val / 256', + ValueConvInv => 'int($val * 256 + 0.5)', + }, + 0x001d => [ + # Would be nice if there was a general way to determine units for FocalLength... + { + # Optio 30, 33WR, 43WR, 450, 550, 555, 750Z, X + Name => 'FocalLength', + Condition => '$self->{Model} =~ /^PENTAX Optio (30|33WR|43WR|450|550|555|750Z|X)\b/', + Writable => 'int32u', + Priority => 0, + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm//;$val', + }, + { + # K100D, Optio 230, 330GS, 33L, 33LF, A10, M10, MX, MX4, S, S30, + # S4, S4i, S5i, S5n, S5z, S6, S45, S50, S55, S60, SV, Svi, W10, WP, + # *ist D, DL, DL2, DS, DS2 + # (Note: the Optio S6 seems to report the minimum focal length - PH) + Name => 'FocalLength', + Writable => 'int32u', + Priority => 0, + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm//;$val', + }, + ], + 0x001e => { #3 + Name => 'DigitalZoom', + Writable => 'int16u', + ValueConv => '$val / 100', #14 + ValueConvInv => '$val * 100', #14 + }, + 0x001f => { + Name => 'Saturation', + Writable => 'int16u', + Count => -1, + Notes => '1 or 2 values', + PrintConvColumns => 2, + PrintConv => [{ # the *istD has pairs of values - PH + 0 => '-2 (low)', #PH + 1 => '0 (normal)', #PH + 2 => '+2 (high)', #PH + 3 => '-1 (medium low)', #2 + 4 => '+1 (medium high)', #2 + 5 => '-3 (very low)', #PH + 6 => '+3 (very high)', #PH (NC) + 7 => '-4 (minimum)', #PH (NC) + 8 => '+4 (maximum)', #PH (K-5) + 65535 => 'None', #PH (Monochrome) + }], + }, + 0x0020 => { + Name => 'Contrast', + Writable => 'int16u', + Count => -1, + Notes => '1 or 2 values', + PrintConvColumns => 2, + PrintConv => [{ # the *istD has pairs of values - PH + 0 => '-2 (low)', #PH + 1 => '0 (normal)', #PH + 2 => '+2 (high)', #PH + 3 => '-1 (medium low)', #2 + 4 => '+1 (medium high)', #2 + 5 => '-3 (very low)', #PH + 6 => '+3 (very high)', #PH (NC) + 7 => '-4 (minimum)', #PH (NC) + 8 => '+4 (maximum)', #PH (K-5) + 65535 => 'n/a', # got this for a Backlight Silhouette - PH (Q) + }], + }, + 0x0021 => { + Name => 'Sharpness', + Writable => 'int16u', + Count => -1, + Notes => '1 or 2 values', + PrintConvColumns => 2, + PrintConv => [{ # the *istD has pairs of values - PH + 0 => '-2 (soft)', #PH + 1 => '0 (normal)', #PH + 2 => '+2 (hard)', #PH + 3 => '-1 (medium soft)', #2 + 4 => '+1 (medium hard)', #2 + 5 => '-3 (very soft)', #(NC) + 6 => '+3 (very hard)', #(NC) + 7 => '-4 (minimum)', #PH (NC) + 8 => '+4 (maximum)', #PH (NC) + }], + }, + 0x0022 => { #PH + Name => 'WorldTimeLocation', + Groups => { 2 => 'Time' }, + Writable => 'int16u', + PrintConv => { + 0 => 'Hometown', + 1 => 'Destination', + }, + }, + 0x0023 => { #PH + Name => 'HometownCity', + Groups => { 2 => 'Time' }, + Writable => 'int16u', + SeparateTable => 'City', + PrintConv => \%pentaxCities, + }, + 0x0024 => { #PH + Name => 'DestinationCity', + Groups => { 2 => 'Time' }, + Writable => 'int16u', + SeparateTable => 'City', + PrintConv => \%pentaxCities, + }, + 0x0025 => { #PH + Name => 'HometownDST', + Groups => { 2 => 'Time' }, + Writable => 'int16u', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0x0026 => { #PH + Name => 'DestinationDST', + Groups => { 2 => 'Time' }, + Writable => 'int16u', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0x0027 => { #PH + Name => 'DSPFirmwareVersion', + Writable => 'undef', + # - for K10D, this comes from 4 bytes at offset 0x1c in the firmware file + %pentaxFirmwareID, + }, + 0x0028 => { #PH + Name => 'CPUFirmwareVersion', + Writable => 'undef', + # - for K10D, this comes from 4 bytes at offset 0x83fbf8 in firmware file + %pentaxFirmwareID, + }, + 0x0029 => { #5 + Name => 'FrameNumber', + # - one report that this has a value of 84 for the first image with a *istDS + # - another report that file number 4 has frameNumber 154 for *istD, and + # that framenumber jumped at about 9700 to around 26000 + # - with *istDS firmware 2.0, this tag was removed and ShutterCount was added + Writable => 'int32u', + }, + # 0x002b - definitely exposure related somehow - PH + 0x002d => [{ #PH + Name => 'EffectiveLV', + Condition => '$format eq "int16u"', + Notes => 'camera-calculated light value, but includes exposure compensation', + Writable => 'int16u', + Format => 'int16s', # (negative values are valid even though Pentax writes int16u) + ValueConv => '$val/1024', + ValueConvInv => '$val * 1024', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + },{ + Name => 'EffectiveLV', + Condition => '$format eq "int32u"', + Writable => 'int32u', + Format => 'int32s', + ValueConv => '$val/1024', + ValueConvInv => '$val * 1024', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }], + 0x0032 => { #13 + Name => 'ImageEditing', + Writable => 'undef', + Format => 'int8u', + Count => 4, + PrintConv => { + '0 0' => 'None', #PH + '0 0 0 0' => 'None', + '0 0 0 4' => 'Digital Filter', + '1 0 0 0' => 'Resized', #PH (K-5) + '2 0 0 0' => 'Cropped', #PH + # note: doesn't apply to digital filters applied when picture is taken + '4 0 0 0' => 'Digital Filter 4', #PH (K10D, Ricoh WG-5) + '6 0 0 0' => 'Digital Filter 6', #PH (K-5) + '8 0 0 0' => 'Red-eye Correction', #PH (WG-10) + '16 0 0 0' => 'Frame Synthesis?', + }, + }, + 0x0033 => { #PH (K110D/K100D/K-m) + Name => 'PictureMode', + Writable => 'int8u', + Count => 3, + Relist => [ [0, 1], 2 ], # join values 0 and 1 for PrintConv + PrintConvColumns => 2, + PrintConv => [{ + # Program dial modes (from K110D) + '0 0' => 'Program', # (also on K10D, custom settings: Program Line 1, e-dial in Program 3, 4 or 5) + '0 1' => 'Hi-speed Program', #19 (K10D, custom settings: Program Line 2, e-dial in Program 3, 4 or 5) + '0 2' => 'DOF Program', #19 (K10D, custom settings: Program Line 3, e-dial in Program 3, 4 or 5) + '0 3' => 'MTF Program', #19 (K10D, custom settings: Program Line 4, e-dial in Program 3, 4 or 5) + '0 4' => 'Standard', #13 + '0 5' => 'Portrait', + '0 6' => 'Landscape', + '0 7' => 'Macro', + '0 8' => 'Sport', + '0 9' => 'Night Scene Portrait', + '0 10' => 'No Flash', + # SCN modes (menu-selected) (from K100D) + '0 11' => 'Night Scene', + '0 12' => 'Surf & Snow', + '0 13' => 'Text', + '0 14' => 'Sunset', + '0 15' => 'Kids', + '0 16' => 'Pet', + '0 17' => 'Candlelight', + '0 18' => 'Museum', + '0 19' => 'Food', + '0 20' => 'Stage Lighting', + '0 21' => 'Night Snap', + '0 23' => 'Blue Sky', # (Q) + '0 24' => 'Sunset', # (Q) + '0 26' => 'Night Scene HDR', # (Q) + '0 27' => 'HDR', # (Q) + '0 28' => 'Quick Macro', # (Q) + '0 29' => 'Forest', # (Q) + '0 30' => 'Backlight Silhouette', # (Q) + # AUTO PICT modes (auto-selected) + '1 4' => 'Auto PICT (Standard)', #13 + '1 5' => 'Auto PICT (Portrait)', #7 (K100D) + '1 6' => 'Auto PICT (Landscape)', # K110D + '1 7' => 'Auto PICT (Macro)', #13 + '1 8' => 'Auto PICT (Sport)', #13 + # *istD modes (ref 7) + '2 0' => 'Program (HyP)', #13 (K-5 Normal program line - PH) + '2 1' => 'Hi-speed Program (HyP)', #19 (K10D, custom settings: Program Line 2, e-dial in Program 1, 2) + '2 2' => 'DOF Program (HyP)', #19 (K10D, custom settings: Program Line 3, e-dial in Program 1, 2) + '2 3' => 'MTF Program (HyP)', #19 (K10D, custom settings: Program Line 4, e-dial in Program 1, 2) + '2 22' => 'Shallow DOF (HyP)', #PH (K-5) + '3 0' => 'Green Mode', #16 + '4 0' => 'Shutter Speed Priority', + '5 0' => 'Aperture Priority', + '6 0' => 'Program Tv Shift', + '7 0' => 'Program Av Shift', #19 + '8 0' => 'Manual', + '9 0' => 'Bulb', + '10 0' => 'Aperture Priority, Off-Auto-Aperture', + '11 0' => 'Manual, Off-Auto-Aperture', + '12 0' => 'Bulb, Off-Auto-Aperture', + '19 0' => 'Astrotracer', #29 + # extra K10D modes (ref 16) + '13 0' => 'Shutter & Aperture Priority AE', + '15 0' => 'Sensitivity Priority AE', + '16 0' => 'Flash X-Sync Speed AE', + '18 0' => 'Auto Program (Normal)', #PH (K-5) + '18 1' => 'Auto Program (Hi-speed)', #PH (NC) + '18 2' => 'Auto Program (DOF)', #PH (K-5) + '18 3' => 'Auto Program (MTF)', #PH (NC) + '18 22' => 'Auto Program (Shallow DOF)', #PH (NC) + '20 22' => 'Blur Control', #PH (Q) + '249 0' => 'Movie (TAv)', #31 + '250 0' => 'Movie (TAv, Auto Aperture)', #31 + '251 0' => 'Movie (Manual)', #31 + '252 0' => 'Movie (Manual, Auto Aperture)', #31 + '253 0' => 'Movie (Av)', #31 + '254 0' => 'Movie (Av, Auto Aperture)', #31 + '255 0' => 'Movie (P, Auto Aperture)', #31 + '255 4' => 'Video (4)', #PH (K-x,K-01) + },{ + # EV step size (ref 19) + 0 => '1/2 EV steps', + 1 => '1/3 EV steps', + }], + }, + 0x0034 => { #7/PH + Name => 'DriveMode', + Writable => 'int8u', + Count => 4, + PrintConv => [{ + 0 => 'Single-frame', # (also Interval Shooting for K-01 - PH) + 1 => 'Continuous', # (K-5 Hi) + 2 => 'Continuous (Lo)', #PH (K-5) + 3 => 'Burst', #PH (K20D) + 4 => 'Continuous (Medium)', #PH (K-3) + 255 => 'Video', #PH (K-x) + },{ + 0 => 'No Timer', + 1 => 'Self-timer (12 s)', + 2 => 'Self-timer (2 s)', + 15 => 'Video', #PH (Q MOV) + 16 => 'Mirror Lock-up', # (K-5) + 255 => 'n/a', #PH (K-x) + },{ + 0 => 'Shutter Button', # (also computer remote control - PH) + 1 => 'Remote Control (3 s delay)', #19 + 2 => 'Remote Control', #19 + 4 => 'Remote Continuous Shooting', # (K-5) + },{ + 0x00 => 'Single Exposure', + 0x01 => 'Multiple Exposure', + 0x02 => 'Composite Average', #31 + 0x03 => 'Composite Additive', #31 + 0x04 => 'Composite Bright', #31 + 0x08 => 'Interval Shooting', #31 + 0x0a => 'Interval Composite Average', #31 + 0x0b => 'Interval Composite Additive', #31 + 0x0c => 'Interval Composite Bright', #31 + 0x0f => 'Interval Movie', #PH (K-01) + 0x10 => 'HDR', #PH (645D) + 0x20 => 'HDR Strong 1', #PH (NC) (K-5) + 0x30 => 'HDR Strong 2', #PH (K-5) + 0x40 => 'HDR Strong 3', #PH (K-5) + 0x50 => 'HDR Manual', #31 (K-70 HDR 1 and HDR 2) + 0xe0 => 'HDR Auto', #PH (K-5, K-70) + 0xff => 'Video', #PH (K-x) + }], + }, + 0x0035 => { #PH + Name => 'SensorSize', + Format => 'int16u', + Count => 2, + Notes => 'includes masked pixels', + # values for various models (not sure why this is in 2um increments): + # 11894 7962 (K10D,K-m) 12012 7987 (*istDS,K100D,K110D) 12012 8019 (*istD), + # 12061 7988 (K-5) 12053 8005 (K-r,K-x) 14352 9535 (K20D,K-7) + # 22315 16711 (645) 12080 8008 (K-01) + ValueConv => 'my @a=split(" ",$val); $_/=500 foreach @a; join(" ",@a)', + ValueConvInv => 'my @a=split(" ",$val); $_*=500 foreach @a; join(" ",@a)', + PrintConv => 'sprintf("%.3f x %.3f mm", split(" ",$val))', + PrintConvInv => '$val=~s/\s*mm$//; $val=~s/\s*x\s*/ /; $val', + }, + 0x0037 => { #13 + Name => 'ColorSpace', + Writable => 'int16u', + PrintConv => { + 0 => 'sRGB', + 1 => 'Adobe RGB', + }, + }, + 0x0038 => { #5 (PEF only) + Name => 'ImageAreaOffset', + Writable => 'int16u', + Count => 2, + }, + 0x0039 => { #PH + Name => 'RawImageSize', + Writable => 'int16u', + Count => 2, + PrintConv => '$_=$val;s/ /x/;$_', + }, + 0x003c => { #7/PH + Name => 'AFPointsInFocus', + # not writable because I'm not decoding these 4 bytes fully: + # Nibble pattern: XSSSYUUU + # X = unknown (AF focused flag?, 0 or 1) + # SSS = selected AF point bitmask (0x000 or 0x7ff if unused) + # Y = unknown (observed 0,6,7,b,e, always 0 if SSS is 0x000 or 0x7ff) + # UUU = af points used + Format => 'int32u', + Notes => '*istD only', + ValueConv => '$val & 0x7ff', # ignore other bits for now + PrintConvColumns => 2, + PrintConv => { + 0 => '(none)', + BITMASK => { + 0 => 'Upper-left', + 1 => 'Top', + 2 => 'Upper-right', + 3 => 'Left', + 4 => 'Mid-left', + 5 => 'Center', + 6 => 'Mid-right', + 7 => 'Right', + 8 => 'Lower-left', + 9 => 'Bottom', + 10 => 'Lower-right', + }, + }, + }, + 0x003d => { #IB + Name => 'DataScaling', + Writable => 'int16u', + # divide by the second value of Pentax_0x0201 (WhitePoint), usually + # 8192, to get the floating point normalization factor. + # One of the examples of how this tag can be used is calculation of + # baseline exposure compensation (Adobe-style) for a PEF: + # log2(Pentax_0x007e)-14-0.5+log2(Pentax_0x003d)-13 + # or + # log2(Pentax_0x007e*(Pentax_0x003d/(2^13))/(2^14))-0.5 + # where + # makernotes:Pentax_0x003d/(2^13) is the normalization factor. (ref IB) + # - 8192 for most images, but occasionally 11571 for K100D/K110D, + # and 8289 or 8456 for the K-x (ref PH) + }, + 0x003e => { #PH + Name => 'PreviewImageBorders', + Writable => 'int8u', + Count => 4, + Notes => 'top, bottom, left, right', + }, + 0x003f => { #PH + Name => 'LensRec', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensRec' }, + }, + 0x0040 => { #PH + Name => 'SensitivityAdjust', + Writable => 'int16u', + ValueConv => '($val - 50) / 10', + ValueConvInv => '$val * 10 + 50', + PrintConv => '$val ? sprintf("%+.1f", $val) : 0', + PrintConvInv => '$val', + }, + 0x0041 => { #19 + Name => 'ImageEditCount', + Writable => 'int16u', + }, + 0x0047 => { #PH + Name => 'CameraTemperature', # (chassis temperature, ref forum6677) + Writable => 'int8s', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?c$//i; $val', + }, + 0x0048 => { #19 + Name => 'AELock', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 0x0049 => { #13 + Name => 'NoiseReduction', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x004d => [{ #PH + Name => 'FlashExposureComp', + Condition => '$count == 1', + Writable => 'int32s', + ValueConv => '$val / 256', + ValueConvInv => 'int($val * 256 + ($val > 0 ? 0.5 : -0.5))', + PrintConv => '$val ? sprintf("%+.1f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + },{ #PH (K-3) + Name => 'FlashExposureComp', + Writable => 'int8s', + Count => 2, # (don't know what the 2nd number is for) + ValueConv => [ '$val / 6' ], + ValueConvInv => [ '$val / 6' ], + PrintConv => [ '$val ? sprintf("%+.1f", $val) : 0' ], + PrintConvInv => [ 'Image::ExifTool::Exif::ConvertFraction($val)' ], + }], + 0x004f => { #PH + Name => 'ImageTone', # (Called CustomImageMode in K20D manual) + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Natural', + 1 => 'Bright', + 2 => 'Portrait', # (K20D/K200D) + 3 => 'Landscape', # (K20D) + 4 => 'Vibrant', # (K20D) + 5 => 'Monochrome', # (K20D) + 6 => 'Muted', # (645D) + 7 => 'Reversal Film', # (645D) (Ricoh WG-5 "Slide Film") + 8 => 'Bleach Bypass', # (K-5) + 9 => 'Radiant', # (Q) + 10 => 'Cross Processing', #31 (K-70) + 11 => 'Flat', #31 (K-70) + # 256 - seen for GR III + # 262 - seen for GR III + }, + }, + 0x0050 => { #PH + Name => 'ColorTemperature', + Writable => 'int16u', + RawConv => '$val ? $val : undef', + ValueConv => '53190 - $val', + ValueConvInv => '53190 - $val', + }, + # 0x0053-0x005a - not in JPEG images - PH + 0x0053 => { #28 + Name => 'ColorTempDaylight', + %colorTemp, + Notes => '0x0053-0x005a are 3 numbers: Kelvin, shift AB, shift GM', + }, + 0x0054 => { Name => 'ColorTempShade', %colorTemp }, #28 + 0x0055 => { Name => 'ColorTempCloudy', %colorTemp }, #28 + 0x0056 => { Name => 'ColorTempTungsten', %colorTemp }, #28 + 0x0057 => { Name => 'ColorTempFluorescentD', %colorTemp }, #28 + 0x0058 => { Name => 'ColorTempFluorescentN', %colorTemp }, #28 + 0x0059 => { Name => 'ColorTempFluorescentW', %colorTemp }, #28 + 0x005a => { Name => 'ColorTempFlash', %colorTemp }, #28 + 0x005c => [{ #PH + Name => 'ShakeReductionInfo', + Condition => '$count == 4', # (2 bytes for the K-3) + Format => 'undef', # (written as int8u) - do this just to save time converting the value + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::SRInfo' }, + },{ + Name => 'ShakeReductionInfo', + Format => 'undef', # (written as int8u) - do this just to save time converting the value + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::SRInfo2' }, + }], + 0x005d => { #JD/PH + # (used by all Pentax DSLR's except *istD and *istDS until firmware 2.0 - PH) + # Observed values for the first shot of a new K10D are: 81 [PH], 181 [19], + # 246 [7], and 209 [18 (one of the first 20 shots)], so there must be a number + # of test images shot in the factory. (But my new K-5 started at 1 - PH) + # This count includes shutter actuations even if they don't result in a + # recorded image (eg. manual white balance frame or digital preview), but + # does not include actuations due to Live View or video recording - PH + Name => 'ShutterCount', + Writable => 'undef', + Count => 4, + Notes => q{ + Note: May be reset by servicing! Also, does not include shutter actuations + for live view or video recording + }, + # raw value is a big-endian 4-byte integer, encrypted using Date and Time + RawConv => 'length($val) == 4 ? unpack("N",$val) : undef', + RawConvInv => q{ + my $val = Image::ExifTool::Pentax::CryptShutterCount($val,$self); + return pack('N', $val); + }, + ValueConv => \&CryptShutterCount, + ValueConvInv => '$val', + }, + # 0x005e - + 0x0060 => { #PH (K-5) + Name => 'FaceInfo', + Format => 'undef', # (written as int8u) + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::FaceInfo' }, + }, + 0x0062 => { #forum4803 + Name => 'RawDevelopmentProcess', + Condition => '$$self{Make} =~ /^(PENTAX|RICOH)/', # rules out Kodak, which also use this tag + Writable => 'int16u', + PrintConv => { + 1 => '1 (K10D,K200D,K2000,K-m)', + 3 => '3 (K20D)', + 4 => '4 (K-7)', + 5 => '5 (K-x)', + 6 => '6 (645D)', + 7 => '7 (K-r)', + 8 => '8 (K-5,K-5II,K-5IIs)', + 9 => '9 (Q)', + 10 => '10 (K-01,K-30,K-50,K-500)', + 11 => '11 (Q10)', + 12 => '12 (MX-1,Q-S1,Q7)', + 13 => '13 (K-3,K-3II)', + 14 => '14 (645Z)', + 15 => '15 (K-S1,K-S2)', #PH + 16 => '16 (K-1)', #PH + 17 => '17 (K-70)', #29 + 18 => '18 (KP)', #PH + 19 => '19 (GR III)', #PH + 20 => '20 (K-3III)', #PH + }, + }, + 0x0067 => { #PH (K-5) + Name => 'Hue', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 0 => -2, + 1 => 'Normal', + 2 => 2, + 3 => -1, + 4 => 1, + 5 => -3, + 6 => 3, + 7 => -4, + 8 => 4, + 65535 => 'None', # (Monochrome) + }, + }, + # 0x0067 - int16u: 1 [and 65535 in Monochrome] (K20D,K200D) - PH + 0x0068 => { #PH + Name => 'AWBInfo', + Format => 'undef', # (written as int8u) + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::AWBInfo' }, + }, + 0x0069 => { #PH (K20D, K-5, K-01 highlights only) + Name => 'DynamicRangeExpansion', + Notes => q{ + called highlight correction by Pentax for the K20D, K-5, K-01 and maybe + other models + }, + Writable => 'undef', + Format => 'int8u', + Count => 4, + PrintConv => [{ + 0 => 'Off', + 1 => 'On', + },{ + 0 => 0, + 1 => 'Enabled', # (K-01) + 2 => 'Auto', # (K-01) + }], + }, + 0x006b => { #PH (K-5) + Name => 'TimeInfo', + Format => 'undef', # (written as int8u) + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::TimeInfo' }, + }, + 0x006c => { #PH (K-5) + Name => 'HighLowKeyAdj', + Description => 'High/Low Key Adj', + Writable => 'int16s', + Count => 2, + PrintConvColumns => 3, + PrintConv => { + '-4 0' => -4, + '-3 0' => -3, + '-2 0' => -2, + '-1 0' => -1, + '0 0' => 0, + '1 0' => 1, + '2 0' => 2, + '3 0' => 3, + '4 0' => 4, + }, + }, + 0x006d => { #PH (K-5) + Name => 'ContrastHighlight', + Writable => 'int16s', + Count => 2, + PrintConvColumns => 3, + PrintConv => { + '-4 0' => -4, + '-3 0' => -3, + '-2 0' => -2, + '-1 0' => -1, + '0 0' => 0, + '1 0' => 1, + '2 0' => 2, + '3 0' => 3, + '4 0' => 4, + }, + }, + 0x006e => { #PH (K-5) + Name => 'ContrastShadow', + Writable => 'int16s', + Count => 2, + PrintConvColumns => 3, + PrintConv => { + '-4 0' => -4, + '-3 0' => -3, + '-2 0' => -2, + '-1 0' => -1, + '0 0' => 0, + '1 0' => 1, + '2 0' => 2, + '3 0' => 3, + '4 0' => 4, + }, + }, + 0x006f => { #PH (K-5) + Name => 'ContrastHighlightShadowAdj', + Description => 'Contrast Highlight/Shadow Adj', + Writable => 'int8u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 0x0070 => { #PH (K-5) + Name => 'FineSharpness', + Writable => 'int8u', + Count => -1, # 1 for K20/K200, 2 for K-5 + PrintConv => [{ + 0 => 'Off', + 1 => 'On', + },{ + 0 => 'Normal', + 2 => 'Extra fine', + }], + }, + 0x0071 => { #PH (K20D,K-x) + Name => 'HighISONoiseReduction', + Format => 'int8u', + PrintConv => [{ + 0 => 'Off', + 1 => 'Weakest', + 2 => 'Weak', # (called "Low" by K-x) + 3 => 'Strong', # (called "High" by K-x) + 4 => 'Medium', + 255 => 'Auto', # (K-5) + },{ + 0 => 'Inactive', + 1 => 'Active', + 2 => 'Active (Weak)', # (K-5) + 3 => 'Active (Strong)', # (K-5) + 4 => 'Active (Medium)', # (K-5) + },{ # Start ISO level for NR (K-x) + 48 => 'ISO>400', + 56 => 'ISO>800', + 64 => 'ISO>1600', + 72 => 'ISO>3200', + }], + }, + 0x0072 => { #JD (K20D) + Name => 'AFAdjustment', + Writable => 'int16s', + }, + 0x0073 => { #PH (K-5) + Name => 'MonochromeFilterEffect', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 65535 => 'None', + 1 => 'Green', + 2 => 'Yellow', + 3 => 'Orange', + 4 => 'Red', + 5 => 'Magenta', + 6 => 'Blue', + 7 => 'Cyan', + 8 => 'Infrared', + }, + }, + 0x0074 => { #PH (K-5) + Name => 'MonochromeToning', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 65535 => 'None', + 0 => -4, + 1 => -3, + 2 => -2, + 3 => -1, + 4 => 0, + 5 => 1, + 6 => 2, + 7 => 3, + 8 => 4, + }, + }, + 0x0076 => { #PH (K-5) + Name => 'FaceDetect', + Writable => 'int8u', + Count => 2, + # the Optio S12 writes this but not the FacesDetected tag, so get FacesDetected from here + DataMember => 'FacesDetected', + RawConv => '$val =~ / (\d+)/ and $$self{FacesDetected} = $1; $val', + # (the K-3 reports "On" even in phase-detect focus modes) + PrintConv => [ + '$val ? "On ($val faces max)" : "Off"', + '"$val faces detected"', + ], + PrintConvInv => [ + '$val =~ /(\d+)/ ? $1 : 0', + '$val =~ /(\d+)/ ? $1 : 0', + ], + }, + 0x0077 => { #PH (K-5) + # set by taking a picture with face detect AF, + # but it isn't reset until camera is turned off? - PH + Name => 'FaceDetectFrameSize', + Writable => 'int16u', + Count => 2, + }, + # 0x0078 - int16u[2]: '0 0' (K-5,K-7,K-r,K-x) + 0x0079 => { #PH + Name => 'ShadowCorrection', + Writable => 'int8u', + Count => -1, + PrintConvColumns => 2, + PrintConv => { + # (1 value for K-m/K2000, 2 for 645D) + 0 => 'Off', + 1 => 'On', + 2 => 'Auto 2', # (NC, WG-3) + '0 0' => 'Off', + '1 1' => 'Weak', + '1 2' => 'Normal', + '1 3' => 'Strong', + '2 4' => 'Auto', # (K-01) + }, + }, + 0x007a => { #PH + Name => 'ISOAutoParameters', + Writable => 'int8u', + Count => 2, + PrintConv => { + '1 0' => 'Slow', + '2 0' => 'Standard', + '3 0' => 'Fast', + # '1 108' - seen for GR III + # '3 84' - seen for K-3III + }, + }, + 0x007b => { #PH (K-5) + Name => 'CrossProcess', + Writable => 'int8u', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Off', + 1 => 'Random', + 2 => 'Preset 1', + 3 => 'Preset 2', + 4 => 'Preset 3', + 33 => 'Favorite 1', + 34 => 'Favorite 2', + 35 => 'Favorite 3', + }, + }, + 0x007d => { #PH + Name => 'LensCorr', + Format => 'undef', # (written as int8u) + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensCorr' }, + }, + 0x007e => { #IB + Name => 'WhiteLevel', # (with black level already subtracted) + Writable => 'int32u', + # 15859,15860,15864,15865,16315 (K-5 PEF/DNG only) - PH + # 3934, 3935 (Q DNG) - PH + }, + 0x007f => { #PH (K-5) + Name => 'BleachBypassToning', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + 65535 => 'n/a', #31 + 0 => 'Off', #31 + 1 => 'Green', + 2 => 'Yellow', + 3 => 'Orange', + 4 => 'Red', + 5 => 'Magenta', + 6 => 'Purple', + 7 => 'Blue', + 8 => 'Cyan', + }, + }, + 0x0080 => { #PH (Q) + Name => 'AspectRatio', + PrintConv => { + 0 => '4:3', + 1 => '3:2', + 2 => '16:9', + 3 => '1:1', + }, + }, + # 0x0081 - int8u: 0 (Q) + 0x0082 => { + Name => 'BlurControl', + Writable => 'int8u', + Count => 4, + PrintConv => [ + { + 0 => 'Off', + 1 => 'Low', + 2 => 'Medium', + 3 => 'High', + }, + undef, # 0 with BlurControl is Off, seen 0,1,3 when on (related to subject distance?) + undef, # 0 with BlurControl Off, 45 when on + undef, # always 0 + ], + }, + # 0x0083 - int8u: 0 (Q DNG) + # 0x0084 - int8u: 0 (Q) + 0x0085 => { #PH + Name => 'HDR', + Format => 'int8u', + Count => 4, + PrintConv => [{ # (K-01,K-3) + 0 => 'Off', + 1 => 'HDR Auto', + 2 => 'HDR 1', + 3 => 'HDR 2', + 4 => 'HDR 3', + 5 => 'HDR Advanced', #29 (K-1) + },{ # (K-01) + 0 => 'Auto-align Off', + 1 => 'Auto-align On', + },{ + # not sure about this - PH + # - you can set HDR "Exposure Bracket Value" with the K-3 + # - guessed from imaging-resource K-3 samples K3OUTBHDR_A{1,2,3} + 0 => 'n/a', + 4 => '1 EV', + 8 => '2 EV', + 12 => '3 EV', # (get this from K-01, but can't set EV) + }, + # (4th number is always 0) + ], + }, + # 0x0086 - int8u: 0, 111[Sport,Pet] (Q) - related to Tracking FocusMode? + # 0x0087 - int8u: 0 (Q) + 0x0087 => { #PH + Name => 'ShutterType', + Writable => 'int8u', + PrintConv => { + 0 => 'Normal', # ('Mechanical' if the camera has a mechanical shutter) + 1 => 'Electronic', # (KP) + }, + }, + 0x0088 => { #PH + Name => 'NeutralDensityFilter', + Writable => 'int8u', + Count => -1, + PrintConv => { + 0 => 'Off', + 1 => 'On', + '0 2' => 'Off (0 2)', #PH (NC, GR III) + '1 2' => 'On (1 2)', #PH (NC, GR III) + }, + }, + 0x008b => { #PH (LS465) + Name => 'ISO', + Priority => 0, + Writable => 'int32u', + }, + 0x0092 => { #31 + Name => 'IntervalShooting', + Notes => '2 numbers: 1. Shot number 2. Total number of shots', + Writable => 'int16u', + Count => 2, + PrintConv => { + '0 0' => 'Off', + OTHER => sub { + my ($val, $inv) = @_; + if ($inv) { + $val =~ tr/0-9 //dc; + } else { + $val =~ s/(\d+) (\d+)/Shot $1 of $2/; + } + return $val; + }, + }, + }, + 0x0095 => [{ #31 + Name => 'SkinToneCorrection', + Condition => '$count == 2', + Writable => 'int8s', + Count => 2, + PrintConv => { + '0 0' => 'Off', + '1 1' => 'On (type 1)', + '1 2' => 'On (type 2)', + }, + },{ + Name => 'SkinToneCorrection', + Condition => '$count == 3', + Writable => 'int8s', + Count => 3, + PrintConv => { + '0 0 0' => 'Off', + }, + }], + 0x0096 => { #31 + Name => 'ClarityControl', + Writable => 'int8s', + Count => 2, + PrintConv => { + '0 0' => 'Off', + OTHER => sub { + my ($val, $inv) = @_; + if ($inv) { + $val =~ /(\d+ -?\d+)/ and return $1; + return ("1 $val"); + } elsif ($val =~ /^1 (-?\d+)$/) { + return $1 ? sprintf('%+d', $1) : 0; + } else { + return "Unknown ($val)"; + } + }, + }, + }, + 0x0200 => { #5 + Name => 'BlackPoint', + Writable => 'int16u', + Count => 4, + }, + 0x0201 => { #5 + # (this doesn't change for different fixed white balances in JPEG images: Daylight, + # Tungsten, Kelvin, etc -- always "8192 8192 8192 8192", but it varies for these in + # RAW images, all images in Auto, for different Manual WB settings, and for images + # taken via Pentax Remote Assistant) - PH + Name => 'WhitePoint', + Writable => 'int16u', + Count => 4, + }, + # 0x0202: int16u[4]: all 0's in all my samples + 0x0203 => { #JD (not really sure what these mean) + Name => 'ColorMatrixA', # (camera RGB to sRGB matrix, *ist D, ref IB) + Writable => 'int16s', + Count => 9, + ValueConv => 'join(" ",map({ $_/8192 } split(" ",$val)))', + ValueConvInv => 'join(" ",map({ int($_*8192 + ($_<0?-0.5:0.5)) } split(" ",$val)))', + PrintConv => 'join(" ",map({sprintf("%.5f",$_)} split(" ",$val)))', + PrintConvInv => '"$val"', + }, + 0x0204 => { #JD + Name => 'ColorMatrixB', # (camera RGB to Adobe RGB matrix, *ist D, ref IB) + Writable => 'int16s', + Count => 9, + ValueConv => 'join(" ",map({ $_/8192 } split(" ",$val)))', + ValueConvInv => 'join(" ",map({ int($_*8192 + ($_<0?-0.5:0.5)) } split(" ",$val)))', + PrintConv => 'join(" ",map({sprintf("%.5f",$_)} split(" ",$val)))', + PrintConvInv => '"$val"', + }, + 0x0205 => [{ #19 + Name => 'CameraSettings', + # size: *istD/*istDs/K100D/K110D=16, K-m/K2000=14, K-7/K-x=19, + # K200D/K20D/K-5/645D=20, K-r=21, K10D=22, K-01=25 + Condition => '$count < 25', # (not valid for the K-01) + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::CameraSettings', + ByteOrder => 'BigEndian', + }, + },{ + Name => 'CameraSettingsUnknown', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::CameraSettingsUnknown', + ByteOrder => 'BigEndian', + }, + }], + 0x0206 => [{ #PH + Name => 'AEInfo', + # size: *istD/*istDs/K100D/K110D=14, K10D/K200D/K20D=16, K-m/K2000=20, + # K-7/K-x=24, K-5/K-r/645D=25 + Condition => '$count <= 25 and $count != 21 and $$self{AEInfoSize} = $count', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::AEInfo' }, + },{ + Name => 'AEInfo2', + # size: K-01=21 + Condition => '$count == 21', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::AEInfo2' }, + },{ + Name => 'AEInfo3', + # size: K-30=48 + Condition => '$count == 48', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::AEInfo3' }, + },{ + Name => 'AEInfoUnknown', + # size: Q/Q10=34 + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::AEInfoUnknown' }, + }], + 0x0207 => [ #PH + { + Name => 'LensInfo', + # the *ist series (and Samsung GX-1) always use the old format, and all + # other models but the K100D, K110D and K100D Super always use the newer + # format, and for the K110D/K110D we expect ff or 00 00 at byte 20 if + # it is the old format.) + Condition => q{ + $$self{Model}=~/(\*ist|GX-1[LS])/ or + ($$self{Model}=~/(K100D|K110D)/ and $$valPt=~/^.{20}(\xff|\0\0)/s) + }, + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo' }, + },{ + Name => 'LensInfo', + Condition => '$count != 90 and $count != 91 and $count != 80 and $count != 128 and $count != 168', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo2' }, + },{ + Name => 'LensInfo', # 645D + Condition => '$count == 90', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo3' }, + },{ + Name => 'LensInfo', # K-r, K-5, K-5II + Condition => '$count == 91', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo4' }, + },{ + Name => 'LensInfo', # K-01, K-30, K-50, K-500, K-3, K-3II + Condition => '$count == 80 or $count == 128', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfo5' }, + } + # ($count == 168 - Ricoh GR III) + ], + 0x0208 => [ #PH + { + Name => 'FlashInfo', + Condition => '$count == 27', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::FlashInfo' }, + }, + { + Name => 'FlashInfoUnknown', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::FlashInfoUnknown' }, + }, + ], + 0x0209 => { #PH + Name => 'AEMeteringSegments', + Format => 'int8u', + Count => -1, + Notes => q{ + measurements from each of the 16 AE metering segments for models such as the + K10D, 77 metering segments for models such as the K-5, and 4050 metering + segments for the K-3, converted to LV + }, + %convertMeteringSegments, + # 16 metering segment 77 metering segment + # locations (ref JD, K10D) locations (ref PH, K-5) + # +-------------------------+ + # | 14 | +----------------------------------+ + # | +---+---+---+---+ | | 0 1 2 3 4 5 6 7 8 9 10 | + # | | 5 | 3/1\ 2| 4 | | | 11 12 13 14 15 16 17 18 19 20 21 | + # | +-+-+-+-+ - +-+-+-+-+ | | 22 23 24 25 26 27 28 29 30 31 32 | + # +--+ 9 | 7 ||0|| 6 | 8 +--+ | 33 34 35 36 37 38 39 40 41 42 43 | + # | +-+-+-+-+ - +-+-+-+-+ | | 44 45 46 47 48 49 50 51 52 53 54 | + # | |13 |11\ /10|12 | | | 55 56 57 58 59 60 61 62 63 64 65 | + # | +---+---+---+---+ | | 66 67 68 69 70 71 72 73 74 75 76 | + # | 15 | +----------------------------------+ + # +-------------------------+ + }, + 0x020a => { #PH/JD/19 + Name => 'FlashMeteringSegments', + Format => 'int8u', + Count => -1, + %convertMeteringSegments, + }, + 0x020b => { #PH/JD/19 + Name => 'SlaveFlashMeteringSegments', + Format => 'int8u', + Count => -1, + Notes => 'used in wireless control mode', + %convertMeteringSegments, + }, + 0x020d => { #PH + Name => 'WB_RGGBLevelsDaylight', + Writable => 'int16u', + Count => 4, + }, + 0x020e => { #PH + Name => 'WB_RGGBLevelsShade', + Writable => 'int16u', + Count => 4, + }, + 0x020f => { #PH + Name => 'WB_RGGBLevelsCloudy', + Writable => 'int16u', + Count => 4, + }, + 0x0210 => { #PH + Name => 'WB_RGGBLevelsTungsten', + Writable => 'int16u', + Count => 4, + }, + 0x0211 => { #PH + Name => 'WB_RGGBLevelsFluorescentD', + Writable => 'int16u', + Count => 4, + }, + 0x0212 => { #PH + Name => 'WB_RGGBLevelsFluorescentN', + Writable => 'int16u', + Count => 4, + }, + 0x0213 => { #PH + Name => 'WB_RGGBLevelsFluorescentW', + Writable => 'int16u', + Count => 4, + }, + 0x0214 => { #PH + Name => 'WB_RGGBLevelsFlash', + Writable => 'int16u', + Count => 4, + }, + 0x0215 => { #PH + Name => 'CameraInfo', + Format => 'undef', # (written as int32u) + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::CameraInfo' }, + }, + 0x0216 => { #PH + Name => 'BatteryInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::BatteryInfo', + ByteOrder => 'BigEndian', # have seen makernotes changed to little-endian in DNG! + }, + }, + # 0x021a - undef[1068] (K-5) - ToneMode/Saturation mapping matrices (ref 28) + 0x021b => { #19 + Name => 'SaturationInfo', + Flags => [ 'Unknown', 'Binary' ], + Writable => 0, + Notes => 'only in PEF and DNG images', + # K10D values with various Saturation settings (ref 19): + # Very Low: 000000022820f9a0fe4000802660f92002e0fee01e402c40f880fb40ffc02b20f52002e0fe401ee0 + # Low: 000000022ae0f700fe20ff402840f88001e0fcc021602f60f560fb40fe602d20f48001c0fbc02280 + # Med Low: 000000022dc0f420fe20fe002a20f7e000c0fa8024c032c0f220fb20fce02f60f3c000a0f9202640 + # Normal: 000000023120f0e0fe00fc802c40f740ffa0f7e028803660ee80fb20fb4031c0f300ff60f6202a80 + # Med High: 0000000234e0ed40fde0fae02ea0f680fe60f5002ca03a80ea80fb00f9603480f220fe00f2e02f20 + # High: 0000000238c0e960fde0f9203140f5a0fce0f1e031403f00e600fb00f7803760f120fc60ef403460 + # Very High:000000023d20e520fdc0f7203420f4c0fb60ee6036404400e120fae0f5403aa0f020fac0eb403a00 + }, + 0x021c => { #IB + Name => 'ColorMatrixA2', + Format => 'int16s', + Writable => 'undef', + Count => 9, + }, + 0x021d => { #IB + Name => 'ColorMatrixB2', + Format => 'int16s', + Writable => 'undef', + Count => 9, + }, + # 0x021e - undef[8] (K-5, Q) + 0x021f => { #JD + Name => 'AFInfo', + SubDirectory => { + # NOTE: Most of these subdirectories are 'undef' format, and as such the + # byte ordering is not changed when changed via the Pentax software (which + # will write a little-endian TIFF on an Intel system). So we must define + # BigEndian byte ordering for any of these which contain multi-byte values. - PH + ByteOrder => 'BigEndian', + TagTable => 'Image::ExifTool::Pentax::AFInfo', + }, + }, + 0x0220 => { #6 + Name => 'HuffmanTable', + Flags => [ 'Unknown', 'Binary' ], + Writable => 0, + Notes => 'found in K10D, K20D and K2000 PEF images', + }, + 0x0221 => { #28 + Name => 'KelvinWB', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::KelvinWB' }, + }, + 0x0222 => { #PH + Name => 'ColorInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::ColorInfo' }, + }, + # 0x0223 - undef[198] (K-5 PEF/DNG only) + 0x0224 => { #19 + Name => 'EVStepInfo', + Drop => 200, # drop if larger than 200 bytes (40 kB in Pentax Q and Q10) + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::EVStepInfo' }, + }, + 0x0226 => { #PH + Name => 'ShotInfo', # (may want to change this later when more is decoded) + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::ShotInfo' }, + }, + 0x0227 => { #PH + Name => 'FacePos', + Condition => '$$self{FacesDetected}', # ignore if no faces to decode + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::FacePos' }, + }, + 0x0228 => { #PH + Name => 'FaceSize', + Condition => '$$self{FacesDetected}', # ignore if no faces to decode + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::FaceSize' }, + }, + 0x0229 => { #PH (verified) (K-m, K-x, K-7) + Name => 'SerialNumber', + Writable => 'string', + Notes => 'left blank by some cameras', + }, + 0x022a => [{ #PH (RICOH models (GR III)) + Name => 'FilterInfo', + Condition => '$$self{Make} =~ /^RICOH/', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::FilterInfo', + ByteOrder => 'LittleEndian', + }, + },{ #PH (K-5) + Name => 'FilterInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::FilterInfo', + ByteOrder => 'BigEndian', + }, + }], + 0x022b => { #PH (K-5) + Name => 'LevelInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LevelInfo' }, + }, + # 0x022c - undef[46] (K-5) + 0x022d => { #28 + Name => 'WBLevels', + Condition => '$count == 100', # (just to be safe, but no other counts observed) + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::WBLevels' }, + }, + 0x022e => { #PH (K-5 AVI videos) + Name => 'Artist', + Groups => { 2 => 'Author' }, + Writable => 'string', + }, + 0x022f => { #PH (K-5 AVI videos) + Name => 'Copyright', + Groups => { 2 => 'Author' }, + Writable => 'string', + }, + 0x0230 => { #PH (K-x AVI videos) (and K-70/Q-S1 MOV videos, ref 31) + Name => 'FirmwareVersion', + Notes => 'only in videos', + # this tag only exists in AVI/MOV videos, and for the K-x the value of + # this tag is "K-x Ver 1.00", which is the same as the EXIF Software + # tag. I used a different tag name for this because Pentax uses the + # AVI Software tag for a different string, "PENTAX K-x". + Writable => 'string', + }, + 0x0231 => { #PH (K-5) + Name => 'ContrastDetectAFArea', + Writable => 'int16u', + Count => 4, + Notes => q{ + AF area of the most recent contrast-detect focus operation. Coordinates + are left, top, width and height in a 720x480 frame, with Y downwards + }, + }, + 0x0235 => { #PH (K-5) + Name => 'CrossProcessParams', + # (it would be interesting to know exactly what these mean) + Writable => 'undef', + Format => 'int8u', + Count => 10, + }, + # 0x0236 - undef[52] (Q) + # 0x0237 - undef[11] possibly related to smart effect setting? (Q) + # 0x0238 - undef[9] (Q) + 0x0239 => { #PH + Name => 'LensInfoQ', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfoQ' }, + }, + # 0x023a - undef[10] (Q) + # 0x023b - undef[9] (K-01) + # 01a700500000000000, 91a700500000000000, 41a700500000000000, 002700500000000000 + # c00500400000000000, 400500500000000000, 4004ff420100000000, 4087ff480000000000 + 0x023f => { #31 (K-70 MOV videos) + Name => 'Model', + Description => 'Camera Model Name', + Writable => 'string', + }, + 0x0243 => { #PH + Name => 'PixelShiftInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::PixelShiftInfo' }, + }, + 0x0245 => { #29 + Name => 'AFPointInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::AFPointInfo' }, + }, + 0x03fe => { #PH + Name => 'DataDump', + Writable => 0, + PrintConv => '\$val', + }, + 0x03ff => [ #PH + { + Name => 'TempInfo', + Condition => '$$self{Model} =~ /K-(01|3|30|5|50|500)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::TempInfo' }, + },{ + Name => 'UnknownInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::UnknownInfo' }, + }, + ], + 0x0402 => { #5 + Name => 'ToneCurve', + PrintConv => '\$val', + }, + 0x0403 => { #5 + Name => 'ToneCurves', + PrintConv => '\$val', + }, + # 0x0404 - undef[2086] (K-5) + 0x0405 => { #PH - undef[24200] (K-5 PEF/DNG only), undef[28672] (Q DNG) + Name => 'UnknownBlock', + Writable => 'undef', + Notes => 'large unknown data block in PEF/DNG images but not JPG images', + Flags => [ 'Unknown', 'Binary', 'Drop' ], + }, + # 0x0406 - undef[4116] (K-5) + # 0x0407 - undef[3072] (Q DNG) + # 0x0408 - undef[1024] (Q DNG) + 0x0e00 => { + Name => 'PrintIM', + Description => 'Print Image Matching', + Writable => 0, + SubDirectory => { + TagTable => 'Image::ExifTool::PrintIM::Main', + }, + }, +); + +# shake reduction information (ref PH) +%Image::ExifTool::Pentax::SRInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Shake reduction information.', + 0 => { + Name => 'SRResult', + PrintConv => { #PH/JD + 0 => 'Not stabilized', + BITMASK => { + 0 => 'Stabilized', + # have seen 1 and 4 for 0.5 and 0.3 sec exposures with NR on and Bit 0 also set - ref 19 + # have seen bits 1,2,3,4 in K-5 AVI videos - PH + 6 => 'Not ready', + }, + }, + }, + 1 => { + Name => 'ShakeReduction', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 4 => 'Off (4)', # (K20D, K200D, K-7, K-5) + 5 => 'On but Disabled', # (K20D, K-5) + # (can be 5 "On but Disabled" for K-5 with HDR [auto-align off only], + # Composition Adjust, DriveMode = Self-timer or Remote, and movie with SR off!) + 6 => 'On (Video)', # (K-7) + 7 => 'On (7)', #(NC) (K20D, K200D, K-m, K-5) + 15 => 'On (15)', # (K20D with Tamron 10-20mm @ 10mm) + 39 => 'On (mode 2)', # (K-01) (on during capture and live view) + 135 => 'On (135)', # (K-5IIs) + 167 => 'On (mode 1)', # (K-01) (on during capture only) + }, + }, + 2 => { + Name => 'SRHalfPressTime', + # (was SR_SWSToSWRTime: SWS=photometering switch, SWR=shutter release switch) + # (from http://www.patentstorm.us/patents/6597867-description.html) + # (here, SR could more accurately mean Shutter Release, not Shake Reduction) + # (not valid for K-01 - PH) + Notes => q{ + time from when the shutter button was half pressed to when the shutter was + released, including time for focusing. Not valid for some models + }, + # (constant of 60 determined from times: 2sec=127; 3sec=184,197; 4sec=244,249,243,246 - PH) + ValueConv => '$val / 60', + ValueConvInv => 'my $v=$val*60; $v < 255 ? int($v + 0.5) : 255', + PrintConv => 'sprintf("%.2f s",$val) . ($val > 254.5/60 ? " or longer" : "")', + PrintConvInv => '$val=~tr/0-9.//dc; $val', + }, + 3 => { #JD + Name => 'SRFocalLength', + ValueConv => '$val & 0x01 ? $val * 4 : $val / 2', + ValueConvInv => '$val <= 127 ? int($val) * 2 : int($val / 4) | 0x01', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm//;$val', + }, +); + +# shake reduction information for the K-3 (ref PH) +%Image::ExifTool::Pentax::SRInfo2 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Shake reduction information for the K-3.', + 0 => { + Name => 'SRResult', + Unknown => 1, + PrintConv => { BITMASK => { + # Bit 0 - have seen this set in a few Pentax samples - PH + # Bit 6 - usually set when SR is Off, and occasionally when On - PH + # Bit 7 - set when AA simulation is on - PH + }}, + }, + 1 => { + Name => 'ShakeReduction', + PrintConv => { #forum5425 + 0 => 'Off', # (NC for K-3) + 1 => 'On', # (NC for K-3) + 4 => 'Off (AA simulation off)', + 5 => 'On but Disabled', # (NC for K-3) + 6 => 'On (Video)', # (NC for K-3) + 7 => 'On (AA simulation off)', + 8 => 'Off (AA simulation type 1) (8)', #forum8362 (K-70) + 12 => 'Off (AA simulation type 1)', # (AA linear motion) + 15 => 'On (AA simulation type 1)', # (AA linear motion) + 16 => 'Off (AA simulation type 2) (16)', #forum8362 (K-70) + 20 => 'Off (AA simulation type 2)', # (AA circular motion) + 23 => 'On (AA simulation type 2)', # (AA circular motion) + }, + }, +); + +# face detection information (ref PH, K-5) +%Image::ExifTool::Pentax::FaceInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0 ], + 0 => { + Name => 'FacesDetected', + RawConv => '$$self{FacesDetected} = $val', + }, + 2 => { + Name => 'FacePosition', + Notes => q{ + X/Y coordinates of the center of the main face in percent of frame size, + with positive Y downwards + }, + Format => 'int8u[2]', + }, +); + +# automatic white balance settings (ref PH, K-5) +%Image::ExifTool::Pentax::AWBInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # 0 - always 1? + # (data ends here for the K20D, K200D, K-x and K-7) + 0 => { + Name => 'WhiteBalanceAutoAdjustment', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 1 => { # (exists only for K-5) + Name => 'TungstenAWB', + PrintConv => { + 0 => 'Subtle Correction', + 1 => 'Strong Correction', + }, + }, +); + +# world time settings (ref PH, K-5) +%Image::ExifTool::Pentax::TimeInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Time' }, + 0.1 => { + Name => 'WorldTimeLocation', + Mask => 0x01, + PrintConv => { + 0 => 'Hometown', + 1 => 'Destination', + }, + }, + 0.2 => { + Name => 'HometownDST', + Mask => 0x02, + PrintConv => \%noYes, + }, + 0.3 => { + Name => 'DestinationDST', + Mask => 0x04, + PrintConv => \%noYes, + }, + 2 => { + Name => 'HometownCity', + SeparateTable => 'City', + PrintConv => \%pentaxCities, + }, + 3 => { + Name => 'DestinationCity', + SeparateTable => 'City', + PrintConv => \%pentaxCities, + }, +); + +# lens distortion correction (ref PH, K-5) +%Image::ExifTool::Pentax::LensCorr = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => { + Name => 'DistortionCorrection', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 1 => { + Name => 'ChromaticAberrationCorrection', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 2 => { + Name => 'PeripheralIlluminationCorr', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 3 => { + Name => 'DiffractionCorrection', + PrintConv => { 0 => 'Off', 16 => 'On' }, + }, +); + +# camera settings (ref 19) +%Image::ExifTool::Pentax::CameraSettings = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PRIORITY => 0, + NOTES => 'Camera settings information written by Pentax DSLR cameras.', + 0 => { + Name => 'PictureMode2', + PrintConv => { + 0 => 'Scene Mode', #PH + 1 => 'Auto PICT', #PH (NC) + 2 => 'Program AE', + 3 => 'Green Mode', + 4 => 'Shutter Speed Priority', + 5 => 'Aperture Priority', + 6 => 'Program Tv Shift', #PH + 7 => 'Program Av Shift', + 8 => 'Manual', #PH + 9 => 'Bulb', #PH + 10 => 'Aperture Priority, Off-Auto-Aperture', #PH (NC) + 11 => 'Manual, Off-Auto-Aperture', #PH + 12 => 'Bulb, Off-Auto-Aperture', #PH (NC) + 13 => 'Shutter & Aperture Priority AE', + 15 => 'Sensitivity Priority AE', + 16 => 'Flash X-Sync Speed AE', #PH + }, + }, + 1.1 => { + Name => 'ProgramLine', + # only set to other than Normal when in Program AE mode + Mask => 0x03, + PrintConv => { + 0 => 'Normal', + 1 => 'Hi Speed', + 2 => 'Depth', + 3 => 'MTF', + }, + }, + 1.2 => { # (K10D, K-5) + Name => 'EVSteps', + Mask => 0x20, + PrintConv => { + 0 => '1/2 EV Steps', + 1 => '1/3 EV Steps', + }, + }, + 1.3 => { # (this bit is set for movies with the K-5 - PH) + Name => 'E-DialInProgram', + # always set even when not in Program AE mode + Mask => 0x40, + PrintConv => { + 0 => 'Tv or Av', + 1 => 'P Shift', + }, + }, + 1.4 => { # (K10D, K-5) + Name => 'ApertureRingUse', + # always set even Aperture Ring is in A mode + Mask => 0x80, + PrintConv => { + 0 => 'Prohibited', + 1 => 'Permitted', + }, + }, + 2 => { + Name => 'FlashOptions', + Notes => 'the camera flash options settings, set even if the flash is off', + Mask => 0xf0, + # Note: These tags correlate with the FlashMode and InternalFlashMode values, + # and match what is displayed by the Pentax software + PrintConv => { + 0 => 'Normal', # (this value can occur in Green Mode) - ref 19 + 1 => 'Red-eye reduction', # (this value can occur in Green Mode) - ref 19 + 2 => 'Auto', # (this value can occur in other than Green Mode) - ref 19 + 3 => 'Auto, Red-eye reduction', #PH (this value can occur in other than Green Mode) - ref 19 + 5 => 'Wireless (Master)', + 6 => 'Wireless (Control)', + 8 => 'Slow-sync', + 9 => 'Slow-sync, Red-eye reduction', + 10 => 'Trailing-curtain Sync' + }, + }, + 2.1 => { + Name => 'MeteringMode2', + Mask => 0x0f, + Notes => 'may not be valid for some models, eg. *ist D', + PrintConv => { + 0 => 'Multi-segment', + BITMASK => { + 0 => 'Center-weighted average', + 1 => 'Spot', + }, + }, + }, + 3 => { + Name => 'AFPointMode', + Mask => 0xf0, + PrintConv => { + 0 => 'Auto', + BITMASK => { + 0 => 'Select', + 1 => 'Fixed Center', + # have seen bit 2 set in pre-production images (firmware 0.20) - PH + }, + }, + }, + 3.1 => { + Name => 'FocusMode2', + Mask => 0x0f, + PrintConv => { + 0 => 'Manual', + 1 => 'AF-S', + 2 => 'AF-C', + 3 => 'AF-A', #PH + }, + }, + 4 => { + Name => 'AFPointSelected2', + Format => 'int16u', + PrintConv => { + 0 => 'Auto', + BITMASK => { + 0 => 'Upper-left', + 1 => 'Top', + 2 => 'Upper-right', + 3 => 'Left', + 4 => 'Mid-left', + 5 => 'Center', + 6 => 'Mid-right', + 7 => 'Right', + 8 => 'Lower-left', + 9 => 'Bottom', + 10 => 'Lower-right', + }, + }, + }, + 6 => { + Name => 'ISOFloor', #PH + # manual ISO or minimum ISO in Auto ISO mode - PH + ValueConv => 'int(100*exp(Image::ExifTool::Pentax::PentaxEv($val-32)*log(2))+0.5)', + ValueConvInv => 'Image::ExifTool::Pentax::PentaxEvInv(log($val/100)/log(2))+32', + }, + 7 => { + Name => 'DriveMode2', + PrintConv => { + 0 => 'Single-frame', + BITMASK => { + 0 => 'Continuous', # (K-5 Hi) + 1 => 'Continuous (Lo)', #PH (K-5) + 2 => 'Self-timer (12 s)', #PH + 3 => 'Self-timer (2 s)', #PH + 4 => 'Remote Control (3 s delay)', + 5 => 'Remote Control', + 6 => 'Exposure Bracket', #PH/19 + 7 => 'Multiple Exposure', + }, + }, + }, + 8 => { + Name => 'ExposureBracketStepSize', + # This is set even when Exposure Bracket is Off (and the K10D + # displays "---" as the step size when you press the EB button) - DaveN + # because the last value is remembered and if you turn Exposure Bracket + # on the step size goes back to what it was before. + PrintConv => { + 3 => '0.3', + 4 => '0.5', + 5 => '0.7', + 8 => '1.0', #PH + 11 => '1.3', + 12 => '1.5', + 13 => '1.7', #(NC) + 16 => '2.0', #PH + }, + }, + 9 => { #PH/19 + Name => 'BracketShotNumber', + PrintHex => 1, + PrintConv => { + 0 => 'n/a', + 0x02 => '1 of 2', #PH (K-5) + 0x12 => '2 of 2', #PH (K-5) + 0x03 => '1 of 3', + 0x13 => '2 of 3', + 0x23 => '3 of 3', + 0x05 => '1 of 5', + 0x15 => '2 of 5', + 0x25 => '3 of 5', + 0x35 => '4 of 5', + 0x45 => '5 of 5', + }, + }, + 10 => { + Name => 'WhiteBalanceSet', + Mask => 0xf0, + # Not necessarily the white balance used; for example if the custom menu is set to + # "WB when using flash" -> "2 Flash", then this tag reports the camera setting while + # tag 0x0019 reports Flash if the Flash was used. + PrintConv => { + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Shade', + 3 => 'Cloudy', + 4 => 'Daylight Fluorescent', + 5 => 'Day White Fluorescent', + 6 => 'White Fluorescent', + 7 => 'Tungsten', + 8 => 'Flash', + 9 => 'Manual', + # The three Set Color Temperature settings refer to the 3 preset settings which + # can be saved in the menu (see page 123 of the K10D manual) + 12 => 'Set Color Temperature 1', + 13 => 'Set Color Temperature 2', + 14 => 'Set Color Temperature 3', + }, + }, + 10.1 => { + Name => 'MultipleExposureSet', + Mask => 0x0f, + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 13 => { + Name => 'RawAndJpgRecording', + Condition => '$$self{Model} =~ /(K10D|GX10)\b/', + Notes => 'K10D only', + # this is actually a bit field: - PH + # bit 0=JPEG, bit 2=PEF, bit 3=DNG; high nibble: 0x00=best, 0x20=better, 0x40=good + PrintHex => 1, + PrintConv => { + 0x01 => 'JPEG (Best)', #PH + 0x04 => 'RAW (PEF, Best)', + 0x05 => 'RAW+JPEG (PEF, Best)', + 0x08 => 'RAW (DNG, Best)', #PH (NC) + 0x09 => 'RAW+JPEG (DNG, Best)', #PH (NC) + 0x21 => 'JPEG (Better)', #PH + 0x24 => 'RAW (PEF, Better)', + 0x25 => 'RAW+JPEG (PEF, Better)', #PH + 0x28 => 'RAW (DNG, Better)', #PH + 0x29 => 'RAW+JPEG (DNG, Better)', #PH (NC) + 0x41 => 'JPEG (Good)', + 0x44 => 'RAW (PEF, Good)', #PH (NC) + 0x45 => 'RAW+JPEG (PEF, Good)', #PH (NC) + 0x48 => 'RAW (DNG, Good)', #PH (NC) + 0x49 => 'RAW+JPEG (DNG, Good)', + # have seen values of 0,2,34 for other models (not K10D) - PH + }, + }, + 14.1 => { #PH + Name => 'JpgRecordedPixels', + Condition => '$$self{Model} =~ /(K10D|GX10)\b/', + Notes => 'K10D only', + Mask => 0x03, + PrintConv => { + 0 => '10 MP', + 1 => '6 MP', + 2 => '2 MP', + }, + }, + 14.2 => { #PH (K-5) + Name => 'LinkAEToAFPoint', + Condition => '$$self{Model} =~ /K-5\b/', + Notes => 'K-5 only', + Mask => 0x01, + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 14.3 => { #PH (K-5) + Name => 'SensitivitySteps', + Condition => '$$self{Model} =~ /K-5\b/', + Notes => 'K-5 only', + Mask => 0x02, + PrintConv => { + 0 => '1 EV Steps', + 1 => 'As EV Steps', + }, + }, + 14.4 => { #PH (K-5) + Name => 'ISOAuto', + Condition => '$$self{Model} =~ /K-5\b/', + Notes => 'K-5 only', + Mask => 0x04, + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + # 14.5 Mask 0x80 - changes for K-5 + 16 => { + Name => 'FlashOptions2', + Condition => '$$self{Model} =~ /(K10D|GX10)\b/', + Notes => 'K10D only; set even if the flash is off', + Mask => 0xf0, + # Note: the Normal and Auto values (0x00 to 0x30) do not tags always + # correlate with the FlashMode, InternalFlashMode and FlashOptions values + # however, these values seem to better match the K10D's actual functionality + # (always Auto in Green mode always Normal otherwise if one of the other options + # isn't selected) - ref 19 + # (these tags relate closely to InternalFlashMode values - PH) + PrintConv => { + 0 => 'Normal', # (this value never occurs in Green Mode) - ref 19 + 1 => 'Red-eye reduction', # (this value never occurs in Green Mode) - ref 19 + 2 => 'Auto', # (this value only occurs in Green Mode) - ref 19 + 3 => 'Auto, Red-eye reduction', # (this value only occurs in Green Mode) - ref 19 + 5 => 'Wireless (Master)', + 6 => 'Wireless (Control)', + 8 => 'Slow-sync', + 9 => 'Slow-sync, Red-eye reduction', + 10 => 'Trailing-curtain Sync' + }, + }, + 16.1 => { + Name => 'MeteringMode3', + Condition => '$$self{Model} =~ /(K10D|GX10)\b/', + Notes => 'K10D only', + Mask => 0x0f, + PrintConv => { + 0 => 'Multi-segment', + BITMASK => { + 0 => 'Center-weighted average', + 1 => 'Spot', + }, + }, + }, + # 16 Mask 0x0f - changes when changing EV steps? (K-5) + 17.1 => { + Name => 'SRActive', + Condition => '$$self{Model} =~ /(K10D|GX10)\b/', + Notes => q{ + K10D only; SR is active only when ShakeReduction is On, DriveMode is not + Remote or Self-timer, and Internal/ExternalFlashMode is not "On, Wireless" + }, + Mask => 0x80, + PrintConv => \%noYes, + }, + 17.2 => { + Name => 'Rotation', + Condition => '$$self{Model} =~ /(K10D|GX10)\b/', + Notes => 'K10D only', + Mask => 0x60, + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 180', + 2 => 'Rotate 90 CW', + 3 => 'Rotate 270 CW', + }, + }, + # Bit 0x08 is set on 3 of my 3000 shots to (All 3 were Shutter Priority + # but this may not mean anything with such a small sample) - ref 19 + 17.3 => { + Name => 'ISOSetting', + Condition => '$$self{Model} =~ /(K10D|GX10)\b/', + Notes => 'K10D only', + Mask => 0x04, + PrintConv => { + 0 => 'Manual', + 1 => 'Auto', + }, + }, + 17.4 => { + Name => 'SensitivitySteps', + Condition => '$$self{Model} =~ /(K10D|GX10)\b/', + Notes => 'K10D only', + Mask => 0x02, + PrintConv => { + 0 => '1 EV Steps', + 1 => 'As EV Steps', + }, + }, + # 17 Mask 0x08 - changed when changing Auto ISO range (K-5) + 18 => { + Name => 'TvExposureTimeSetting', + Condition => '$$self{Model} =~ /(K10D|GX10)\b/', + Notes => 'K10D only', + ValueConv => 'exp(-Image::ExifTool::Pentax::PentaxEv($val-68)*log(2))', + ValueConvInv => 'Image::ExifTool::Pentax::PentaxEvInv(-log($val)/log(2))+68', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 19 => { + Name => 'AvApertureSetting', + Condition => '$$self{Model} =~ /(K10D|GX10)\b/', + Notes => 'K10D only', + ValueConv => 'exp(Image::ExifTool::Pentax::PentaxEv($val-68)*log(2)/2)', + ValueConvInv => 'Image::ExifTool::Pentax::PentaxEvInv(log($val)*2/log(2))+68', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 20 => { #PH + Name => 'SvISOSetting', + Condition => '$$self{Model} =~ /(K10D|GX10)\b/', + Notes => 'K10D only', + # ISO setting for sensitivity-priority mode + # (conversion may not give actual displayed values:) + # 32 => 100, 35 => 125, 36 => 140, 37 => 160, + # 40 => 200, 43 => 250, 44 => 280, 45 => 320, + # 48 => 400, 51 => 500, 52 => 560, 53 => 640, + # 56 => 800, 59 => 1000,60 => 1100,61 => 1250, 64 => 1600 + ValueConv => 'int(100*exp(Image::ExifTool::Pentax::PentaxEv($val-32)*log(2))+0.5)', + ValueConvInv => 'Image::ExifTool::Pentax::PentaxEvInv(log($val/100)/log(2))+32', + }, + 21 => { #PH + Name => 'BaseExposureCompensation', + Condition => '$$self{Model} =~ /(K10D|GX10)\b/', + Notes => 'K10D only; exposure compensation without auto bracketing', + ValueConv => 'Image::ExifTool::Pentax::PentaxEv(64-$val)', + ValueConvInv => '64-Image::ExifTool::Pentax::PentaxEvInv($val)', + PrintConv => '$val ? sprintf("%+.1f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, +); + +# unknown camera settings (K-01) +%Image::ExifTool::Pentax::CameraSettingsUnknown = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'This information has not yet been decoded for models such as the K-01.', +); + +# auto-exposure information (ref PH) +%Image::ExifTool::Pentax::AEInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 7 ], + NOTES => 'Auto-exposure information for most Pentax models.', + # instead of /8, should these be PentaxEv(), as in CameraSettings? - PH + 0 => { + Name => 'AEExposureTime', + Notes => 'val = 24 * 2**((32-raw)/8)', + ValueConv => '24*exp(-($val-32)*log(2)/8)', + ValueConvInv => '-log($val/24)*8/log(2)+32', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 1 => { + Name => 'AEAperture', + Notes => 'val = 2**((raw-68)/16)', + ValueConv => 'exp(($val-68)*log(2)/16)', + ValueConvInv => 'log($val)*16/log(2)+68', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 2 => { + Name => 'AE_ISO', + Notes => 'val = 100 * 2**((raw-32)/8)', + ValueConv => '100*exp(($val-32)*log(2)/8)', + ValueConvInv => 'log($val/100)*8/log(2)+32', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 3 => { + Name => 'AEXv', + Notes => 'val = (raw-64)/8', + ValueConv => '($val-64)/8', + ValueConvInv => '$val * 8 + 64', + }, + 4 => { + Name => 'AEBXv', + Format => 'int8s', + Notes => 'val = raw / 8', + ValueConv => '$val / 8', + ValueConvInv => '$val * 8', + }, + 5 => { + Name => 'AEMinExposureTime', #19 + Notes => 'val = 24 * 2**((32-raw)/8)', + ValueConv => '24*exp(-($val-32)*log(2)/8)', #JD + ValueConvInv => '-log($val/24)*8/log(2)+32', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 6 => { + Name => 'AEProgramMode', + PrintConvColumns => 2, + PrintConv => { + 0 => 'M, P or TAv', + 1 => 'Av, B or X', + 2 => 'Tv', + 3 => 'Sv or Green Mode', + 8 => 'Hi-speed Program', + 11 => 'Hi-speed Program (P-Shift)', #19 + 16 => 'DOF Program', #19 + 19 => 'DOF Program (P-Shift)', #19 + 24 => 'MTF Program', #19 + 27 => 'MTF Program (P-Shift)', #19 + 35 => 'Standard', + 43 => 'Portrait', + 51 => 'Landscape', + 59 => 'Macro', + 67 => 'Sport', + 75 => 'Night Scene Portrait', + 83 => 'No Flash', + 91 => 'Night Scene', + # 96 - seen for Pentax Q10 + 99 => 'Surf & Snow', + 104 => 'Night Snap', # (Q) + 107 => 'Text', + 115 => 'Sunset', + # 116 - seen for Pentax Q (vivid?) + 123 => 'Kids', + 131 => 'Pet', + 139 => 'Candlelight', + 144 => 'SCN', # (Q) + 160 => 'Program', # (Q) + # 142 - seen for Pentax Q in Program mode + 147 => 'Museum', + 184 => 'Shallow DOF Program', # (K-5) + 216 => 'HDR', # (Q) + }, + }, + 7 => { + Name => 'AEFlags', + Writable => 0, + Hook => '$size > 20 and $varSize += 1', + Notes => 'indices after this are incremented by 1 for some models', + # (this tag can't be unknown because the Hook must be evaluated + # to shift the following offsets if necessary. Instead, ignore + # the return value unless Unknown option used) + RawConv => '$$self{OPTIONS}{Unknown} ? $val : undef', + PrintConv => { #19 + # (seems to be the warnings displayed in the viewfinder for several bits) + BITMASK => { + # 0 - seen in extreme low light conditions (e.g. Lens Cap On) + # 1 - seen in 2 cases, Aperture Priority mode, Auto ISO at 100, + # Shutter speed at 1/4000 and aperture opened wider causing under exposure + # 2 - only (but not always) set in Shutter Speed Priority (seems to be when over/under exposed). + # In one case set when auto exposure compensation changed the Tv from 1/250 to 1/80. + # In another case set when external flash was in SB mode so did not fire. + 3 => 'AE lock', + 4 => 'Flash recommended?', # not 100% sure of this one + # 5 - seen lots... + # 6 - seen lots... + 7 => 'Aperture wide open', # mostly true... (Set for all my lenses except for DA* 16-50mm) + }, + }, + }, + # Note: Offsets below shifted by 1 if record size is > 20 bytes + # (implemented by the Hook above) + 8 => { #30 + Name => 'AEApertureSteps', + Notes => q{ + number of steps the aperture has been stopped down from wide open. There + are roughly 8 steps per F-stop for most lenses, or 18 steps for 645D lenses, + but it varies slightly by lens + }, + PrintConv => '$val == 255 ? "n/a" : $val', + PrintConvInv => '$val eq "n/a" ? 255 : $val', + }, + 9 => { #19 + Name => 'AEMaxAperture', + Notes => 'val = 2**((raw-68)/16)', + ValueConv => 'exp(($val-68)*log(2)/16)', + ValueConvInv => 'log($val)*16/log(2)+68', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 10 => { #19 + Name => 'AEMaxAperture2', + Notes => 'val = 2**((raw-68)/16)', + ValueConv => 'exp(($val-68)*log(2)/16)', + ValueConvInv => 'log($val)*16/log(2)+68', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 11 => { #19 + Name => 'AEMinAperture', + Notes => 'val = 2**((raw-68)/16)', + ValueConv => 'exp(($val-68)*log(2)/16)', + ValueConvInv => 'log($val)*16/log(2)+68', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 12 => { #19 + Name => 'AEMeteringMode', + PrintConv => { + 0 => 'Multi-segment', + BITMASK => { + 4 => 'Center-weighted average', + 5 => 'Spot', + }, + }, + }, + 13 => { #30 + Name => 'AEWhiteBalance', + Condition => '$$self{AEInfoSize} == 24', # (not thoroughly tested for other sizes) + Notes => 'K7 and Kx', + Mask => 0xf0, + PrintConv => { + 0 => 'Standard', + 1 => 'Daylight', + 2 => 'Shade', + 3 => 'Cloudy', + 4 => 'Daylight Fluorescent', + 5 => 'Day White Fluorescent', + 6 => 'White Fluorescent', + 7 => 'Tungsten', + 8 => 'Unknown', #31 (or not set due to inadequate lighting) + }, + }, + 13.1 => { #30 + Name => 'AEMeteringMode2', + Condition => '$$self{AEInfoSize} == 24', # (not thoroughly tested for other sizes) + Notes => 'K7 and Kx, override for an incompatible metering mode setting', + Mask => 0x0f, + PrintConv => { + 0 => 'Multi-segment', + BITMASK => { + 0 => 'Center-weighted average', + 1 => 'Spot', + # 2 - seen for K7 AVI movie + }, + }, + }, + 14 => { #19 + Name => 'FlashExposureCompSet', + Description => 'Flash Exposure Comp. Setting', + Format => 'int8s', + Notes => q{ + reports the camera setting, unlike tag 0x004d which reports 0 in Green mode + or if flash was on but did not fire. Both this tag and 0x004d report the + setting even if the flash is off + }, + ValueConv => 'Image::ExifTool::Pentax::PentaxEv($val)', + ValueConvInv => 'Image::ExifTool::Pentax::PentaxEvInv($val)', + PrintConv => '$val ? sprintf("%+.1f", $val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 21 => { #30 + Name => 'LevelIndicator', + PrintConv => '$val == 90 ? "n/a" : $val', + PrintConvInv => '$val eq "n/a" ? 90 : $val', + }, +); + +# auto-exposure information for the K-01 (ref PH) +%Image::ExifTool::Pentax::AEInfo2 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Auto-exposure information for the K-01.', + # instead of /8, should these be PentaxEv(), as in CameraSettings? - PH + 2 => { + Name => 'AEExposureTime', + Notes => 'val = 24 * 2**((32-raw)/8)', + ValueConv => '24*exp(-($val-32)*log(2)/8)', + ValueConvInv => '-log($val/24)*8/log(2)+32', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 3 => { + Name => 'AEAperture', + Notes => 'val = 2**((raw-68)/16)', + ValueConv => 'exp(($val-68)*log(2)/16)', + ValueConvInv => 'log($val)*16/log(2)+68', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 4 => { + Name => 'AE_ISO', + Notes => 'val = 100 * 2**((raw-32)/8)', + ValueConv => '100*exp(($val-32)*log(2)/8)', + ValueConvInv => 'log($val/100)*8/log(2)+32', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 5 => { + Name => 'AEXv', + # this is the negative of exposure compensation, not including bracketing + Notes => 'val = (raw-64)/8', + ValueConv => '($val-64)/8', + ValueConvInv => '$val * 8 + 64', + }, + 6 => { + Name => 'AEBXv', + # this is the negative of auto exposure bracketing compensation + Format => 'int8s', + Notes => 'val = raw / 8', + ValueConv => '$val / 8', + ValueConvInv => '$val * 8', + }, + 8 => { + Name => 'AEError', + Format => 'int8s', + # this is usually zero except in M exposure mode, but it can be non-zero + # in other modes (eg. if you hit an aperture limit in Tv mode) + ValueConv => '-($val-64)/8', # (negate to make overexposed positive) + ValueConvInv => '-$val * 8 + 64', + }, + 11 => { + Name => 'AEApertureSteps', + Notes => q{ + number of steps the aperture has been stopped down from wide open. There + are roughly 8 steps per F-stop, but it varies slightly by lens + }, + PrintConv => '$val == 255 ? "n/a" : $val', + PrintConvInv => '$val eq "n/a" ? 255 : $val', + }, + 15 => { + Name => 'SceneMode', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Off', + 1 => 'HDR', + 4 => 'Auto PICT', + 5 => 'Portrait', + 6 => 'Landscape', + 7 => 'Macro', + 8 => 'Sport', + 9 => 'Night Scene Portrait', + 10 => 'No Flash', + 11 => 'Night Scene', + 12 => 'Surf & Snow', + 14 => 'Sunset', + 15 => 'Kids', + 16 => 'Pet', + 17 => 'Candlelight', + 18 => 'Museum', + 20 => 'Food', + 21 => 'Stage Lighting', + 22 => 'Night Snap', + 25 => 'Night Scene HDR', + 26 => 'Blue Sky', + 27 => 'Forest', + 29 => 'Backlight Silhouette', + }, + }, + 16 => { + Name => 'AEMaxAperture', + Notes => 'val = 2**((raw-68)/16)', + ValueConv => 'exp(($val-68)*log(2)/16)', + ValueConvInv => 'log($val)*16/log(2)+68', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 17 => { + Name => 'AEMaxAperture2', + Notes => 'val = 2**((raw-68)/16)', + ValueConv => 'exp(($val-68)*log(2)/16)', + ValueConvInv => 'log($val)*16/log(2)+68', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 18 => { + Name => 'AEMinAperture', + Notes => 'val = 2**((raw-68)/16)', + ValueConv => 'exp(($val-68)*log(2)/16)', + ValueConvInv => 'log($val)*16/log(2)+68', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 19 => { + Name => 'AEMinExposureTime', + Notes => 'val = 24 * 2**((32-raw)/8)', + ValueConv => '24*exp(-($val-32)*log(2)/8)', + ValueConvInv => '-log($val/24)*8/log(2)+32', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, +); + +# auto-exposure information for the K-30 (ref PH) +%Image::ExifTool::Pentax::AEInfo3 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Auto-exposure information for the K-3, K-30, K-50 and K-500.', + # instead of /8, should these be PentaxEv(), as in CameraSettings? - PH + 16 => { + Name => 'AEExposureTime', + Notes => 'val = 24 * 2**((32-raw)/8)', + ValueConv => '24*exp(-($val-32)*log(2)/8)', + ValueConvInv => '-log($val/24)*8/log(2)+32', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 17 => { + Name => 'AEAperture', + Notes => 'val = 2**((raw-68)/16)', + ValueConv => 'exp(($val-68)*log(2)/16)', + ValueConvInv => 'log($val)*16/log(2)+68', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 18 => { + Name => 'AE_ISO', + Notes => 'val = 100 * 2**((raw-32)/8)', + ValueConv => '100*exp(($val-32)*log(2)/8)', + ValueConvInv => 'log($val/100)*8/log(2)+32', + PrintConv => 'int($val + 0.5)', + PrintConvInv => '$val', + }, + 28 => { + Name => 'AEMaxAperture', + Notes => 'val = 2**((raw-68)/16)', + ValueConv => 'exp(($val-68)*log(2)/16)', + ValueConvInv => 'log($val)*16/log(2)+68', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 29 => { + Name => 'AEMaxAperture2', + Notes => 'val = 2**((raw-68)/16)', + ValueConv => 'exp(($val-68)*log(2)/16)', + ValueConvInv => 'log($val)*16/log(2)+68', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 30 => { + Name => 'AEMinAperture', + Notes => 'val = 2**((raw-68)/16)', + ValueConv => 'exp(($val-68)*log(2)/16)', + ValueConvInv => 'log($val)*16/log(2)+68', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 31 => { + Name => 'AEMinExposureTime', + Notes => 'val = 24 * 2**((32-raw)/8)', + ValueConv => '24*exp(-($val-32)*log(2)/8)', + ValueConvInv => '-log($val/24)*8/log(2)+32', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, +); + +# unknown auto-exposure information (Q, Q10) +%Image::ExifTool::Pentax::AEInfoUnknown = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, +); + +# lens type +%Image::ExifTool::Pentax::LensRec = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + This record stores the LensType, plus one or two unknown bytes for some + models. + }, + 0 => { + Name => 'LensType', + Format => 'int8u[2]', + Priority => 0, + ValueConvInv => '$val=~s/\.\d+$//; $val', + PrintConv => \%pentaxLensTypes, + SeparateTable => 1, + }, + 3 => { #PH + Name => 'ExtenderStatus', + Notes => 'not valid if a non-AF lens is used', + PrintConv => { 0 => 'Not attached', 1 => 'Attached' }, + }, + # this is a binaryData table because some cameras add an extra + # byte or two here (typically zeros)... +); + +# lens information (ref PH) +%Image::ExifTool::Pentax::LensInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + IS_SUBDIR => [ 3 ], + NOTES => 'Pentax lens information structure for models such as the *istD.', + 0 => { + Name => 'LensType', + Format => 'int8u[2]', + Priority => 0, + ValueConvInv => '$val=~s/\.\d+$//; $val', + PrintConv => \%pentaxLensTypes, + SeparateTable => 1, + }, + 3 => { + Name => 'LensData', + Format => 'undef[17]', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensData' }, + }, +); + +# lens information for newer models (ref PH) +%Image::ExifTool::Pentax::LensInfo2 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + IS_SUBDIR => [ 4 ], + NOTES => 'Pentax lens information structure for models such as the K10D and K20D.', + 0 => { + Name => 'LensType', + Format => 'int8u[4]', + Priority => 0, + ValueConv => q{ + my @v = split(' ',$val); + $v[0] &= 0x0f; + $v[1] = $v[2] * 256 + $v[3]; # (always high byte first) + return "$v[0] $v[1]"; + }, + # just fill in the missing bits/bytes with zeros... + ValueConvInv => q{ + my @v = split(' ',$val); + return undef unless @v == 2; + $v[2] = ($v[1] >> 8) & 0xff; + $v[3] = $v[1] & 0xff; + $v[1] = 0; + return "@v"; + }, + PrintConv => \%pentaxLensTypes, + SeparateTable => 1, + }, + 4 => { + Name => 'LensData', + Format => 'undef[17]', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensData' }, + }, +); + +# lens information for 645D (ref PH) +%Image::ExifTool::Pentax::LensInfo3 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + IS_SUBDIR => [ 13 ], + NOTES => 'Pentax lens information structure for 645D.', + 1 => { + Name => 'LensType', + Format => 'int8u[4]', + Priority => 0, + ValueConv => q{ + my @v = split(' ',$val); + $v[0] &= 0x0f; + $v[1] = $v[2] * 256 + $v[3]; # (always high byte first) + return "$v[0] $v[1]"; + }, + # just fill in the missing bits/bytes with zeros... + ValueConvInv => q{ + my @v = split(' ',$val); + return undef unless @v == 2; + $v[2] = ($v[1] >> 8) & 0xff; + $v[3] = $v[1] & 0xff; + $v[1] = 0; + return "@v"; + }, + PrintConv => \%pentaxLensTypes, + SeparateTable => 1, + }, + 13 => { + Name => 'LensData', + Format => 'undef[17]', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensData' }, + }, +); + +# lens information for K-5, K-r, etc (ref PH) +%Image::ExifTool::Pentax::LensInfo4 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + IS_SUBDIR => [ 12 ], + NOTES => 'Pentax lens information structure for models such as the K-5 and K-r.', + 1 => { + Name => 'LensType', + Format => 'int8u[4]', + Priority => 0, + ValueConv => q{ + my @v = split(' ',$val); + $v[0] &= 0x0f; + $v[1] = $v[2] * 256 + $v[3]; # (always high byte first) + return "$v[0] $v[1]"; + }, + # just fill in the missing bits/bytes with zeros... + ValueConvInv => q{ + my @v = split(' ',$val); + return undef unless @v == 2; + $v[2] = ($v[1] >> 8) & 0xff; + $v[3] = $v[1] & 0xff; + $v[1] = 0; + return "@v"; + }, + PrintConv => \%pentaxLensTypes, + SeparateTable => 1, + }, + 12 => { + Name => 'LensData', + Format => 'undef[18]', + Condition => '$$self{NewLensData} = 1', # not really a condition, just used to set flag + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensData' }, + }, +); + +# lens information for K-01, K-30, K-50, K-500, K-3, K-3II, K-S1 (ref PH) +%Image::ExifTool::Pentax::LensInfo5 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + IS_SUBDIR => [ 15 ], + NOTES => 'Pentax lens information structure for the K-01 and newer models.', + 1 => { + Name => 'LensType', + Format => 'int8u[5]', + Priority => 0, + ValueConv => q{ + my @v = split(' ',$val); + $v[0] &= 0x0f; + $v[1] = $v[3] * 256 + $v[4]; # (always high byte first) + return "$v[0] $v[1]"; + }, + # just fill in the missing bits/bytes with zeros... + ValueConvInv => q{ + my @v = split(' ',$val); + return undef unless @v == 2; + $v[3] = ($v[1] >> 8) & 0xff; + $v[4] = $v[1] & 0xff; + $v[1] = $v[2] = 0; + return "@v"; + }, + PrintConv => \%pentaxLensTypes, + SeparateTable => 1, + }, + 15 => { + Name => 'LensData', + Format => 'undef[17]', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensData' }, + }, +); + +# lens data information, including lens codes (ref PH) +%Image::ExifTool::Pentax::LensData = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 12.1 ], + NOTES => q{ + Pentax lens data information. Some of these tags require interesting binary + gymnastics to decode them into useful values. + }, + # this byte comes from the lens electrical contacts + # (see http://kmp.bdimitrov.de/technology/K-mount/Ka.html) + 0.1 => { #JD + Name => 'AutoAperture', + Condition => 'not $$self{NewLensData}', + Notes => 'not valid for the K-r, K-5 or K-5II', #29 + Mask => 0x01, + PrintConv => { 0 => 'On', 1 => 'Off' }, + }, + 0.2 => { #JD + Name => 'MinAperture', + Condition => 'not $$self{NewLensData}', + Notes => 'not valid for the K-r, K-5 or K-5II', #29 + Mask => 0x06, + PrintConv => { + 0 => 22, + 1 => 32, + 2 => 45, + 3 => 16, + }, + }, + 0.3 => { #JD + Name => 'LensFStops', + Condition => 'not $$self{NewLensData}', + Notes => 'not valid for the K-r, K-5 or K-5II', #29 + Mask => 0x70, + ValueConv => '5 + ($val ^ 0x07) / 2', + ValueConvInv => '(($val - 5) * 2) ^ 0x07', + }, + # 1-16 look like Lens Codes LC0-LC15, ref patent 5617173 and 5999753 [+notes by PH] + 1 => { # LC0 = lens kind + version data + Name => 'LensKind', + %lensCode, + }, + 2 => { # LC1 = lens data (changes with AF setting) + Name => 'LC1', + %lensCode, + }, + # LC2 = distance data + 3 => { #29 + Name => 'MinFocusDistance', + Notes => 'minimum focus distance for the lens', + Mask => 0xf8, + PrintConv => { + 0 => '0.13-0.19 m', # (plus K or M lenses) + 1 => '0.20-0.24 m', + 2 => '0.25-0.28 m', + 3 => '0.28-0.30 m', + 4 => '0.35-0.38 m', + 5 => '0.40-0.45 m', + 6 => '0.49-0.50 m', # (plus many Sigma lenses) + 7 => '0.6 m', #PH (NC) + 8 => '0.7 m', # (plus Sigma 55-200) + 9 => '0.8-0.9 m', #PH (NC) Tokina 28-70/2.6-2.8 + 10 => '1.0 m', # (plus Sigma 70 macro) + 11 => '1.1-1.2 m', + 12 => '1.4-1.5 m', + 13 => '1.5 m', # Sigma 70-300/4-5.6 macro + 14 => '2.0 m', + 15 => '2.0-2.1 m', #PH (NC) + 16 => '2.1 m', # Sigma 135-400 APO & DG: 2.0-2.2m + 17 => '2.2-2.9 m', #PH (NC) + 18 => '3.0 m', # Sigma 50-500 : 1.0-3.0m depending on the focal length + ## 50mm, 100mm => 1.0m + ## 200mm => 1.1m + ## 300mm => 1.5m + ## 400mm => 2.2m + ## 500mm => 3.0m + 19 => '4-5 m', #PH (NC) + 20 => '5.6 m', # Pentax DA 560 + # To check: Sigma 120-400 OS: MFD 1.5m + # To check: Sigma 150-500 OS: MFD 2.2m + # To check: Sigma 50-500 has MFD 50-180cm + # 0xd0 - seen for the Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye (ref PH) + }, + }, + 3.1 => { #29 + Name => 'FocusRangeIndex', + Mask => 0x07, + PrintConv => { + 7 => '0 (very close)', + 6 => '1 (close)', + 4 => '2', + 5 => '3', + 1 => '4', + 0 => '5', + 2 => '6 (far)', + 3 => '7 (very far)', + }, + }, + 4 => { # LC3 = K-value data (AF pulses to displace image by unit length) + Name => 'LC3', + %lensCode, + }, + 5 => { # LC4 = aberration correction, near distance data + Name => 'LC4', + %lensCode, + }, + 6 => { # LC5 = light color aberration correction data + Name => 'LC5', + %lensCode, + }, + 7 => { # LC6 = open aberration data + Name => 'LC6', + %lensCode, + }, + 8 => { # LC7 = AF minimum actuation condition + Name => 'LC7', + %lensCode, + }, + 9 => [{ # LC8 = focal length data + Name => 'LensFocalLength', + Notes => 'focal length of lens alone, without adapter', #PH + Priority => 0, + Condition => '$$self{Model} !~ /645Z/', #PH (doesn't work for 645Z) + ValueConv => '10*($val>>2) * 4**(($val&0x03)-2)', #JD + ValueConvInv => q{ + my $range = int(log($val/10)/(2*log(2))); + warn("Value out of range") and return undef if $range < 0 or $range > 3; + return $range + (int($val/(10*4**($range-2))+0.5) << 2); + }, + PrintConv => 'sprintf("%.1f mm", $val)', + PrintConvInv => '$val=~s/\s*mm//; $val', + },{ + Name => 'LC8', + %lensCode, + }], + # the following aperture values change with focal length + 10 => { # LC9 = nominal AVmin/AVmax data (open/closed aperture values) + Name => 'NominalMaxAperture', + Mask => 0xf0, + ValueConv => '2**($val/4)', #JD + ValueConvInv => '4*log($val)/log(2)', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 10.1 => { # LC9 = nominal AVmin/AVmax data (open/closed aperture values) + Name => 'NominalMinAperture', + Mask => 0x0f, + ValueConv => '2**(($val+10)/4)', #JD + ValueConvInv => '4*log($val)/log(2) - 10', + PrintConv => 'sprintf("%.0f", $val)', + PrintConvInv => '$val', + }, + 11 => { # LC10 = mv'/nv' data (full-aperture metering error compensation/marginal lumination compensation) + Name => 'LC10', + %lensCode, + }, + 12 => { # LC11 = AVC 1/EXP data + Name => 'LC11', + %lensCode, + }, + 12.1 => { + Name => 'NewLensDataHook', + Hidden => 1, + Hook => '$varSize += 1 if $$self{NewLensData}', + RawConv => 'undef', + }, + 13 => { # LC12 = mv1 AVminsif data + Name => 'LC12', + Notes => "ID's 13-16 are offset by 1 for the K-r, K-5 and K-5II", #29 + %lensCode, + }, + # 14 - related to live view for K-5 (normally 3, but 1 or 5 in LV mode) + 14.1 => { # LC13 = AVmin (open aperture value) [MaxAperture=(2**((AVmin-1)/32))] + Name => 'MaxAperture', + Condition => '$$self{Model} ne "K-5"', + Notes => 'effective wide open aperture for current focal length', + Mask => 0x7f, # (not sure what the high bit indicates) + # (a value of 1 seems to indicate 'n/a') + RawConv => '$val > 1 ? $val : undef', + ValueConv => '2**(($val-1)/32)', + ValueConvInv => '32*log($val)/log(2) + 1', + PrintConv => 'sprintf("%.1f", $val)', + PrintConvInv => '$val', + }, + 15 => { # LC14 = UNT_12 UNT_6 data + Name => 'LC14', + %lensCode, + }, + 16 => { # LC15 = incorporated flash suited END data + Name => 'LC15', + %lensCode, + }, +); + +# flash information (ref PH) +%Image::ExifTool::Pentax::FlashInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Flash information tags for the K10D, K20D and K200D.', + 0 => { + Name => 'FlashStatus', + PrintHex => 1, + PrintConv => { #19 + 0x00 => 'Off', + 0x01 => 'Off (1)', #PH (K-5) + 0x02 => 'External, Did not fire', # 0010 + 0x06 => 'External, Fired', # 0110 + 0x08 => 'Internal, Did not fire (0x08)', + 0x09 => 'Internal, Did not fire', # 1001 + 0x0d => 'Internal, Fired', # 1101 + }, + }, + 1 => { + Name => 'InternalFlashMode', + PrintHex => 1, + PrintConv => { + 0x00 => 'n/a - Off-Auto-Aperture', #19 + 0x86 => 'Fired, Wireless (Control)', #19 + 0x95 => 'Fired, Wireless (Master)', #19 + 0xc0 => 'Fired', # K10D + 0xc1 => 'Fired, Red-eye reduction', # *istDS2, K10D + 0xc2 => 'Fired, Auto', # K100D, K110D + 0xc3 => 'Fired, Auto, Red-eye reduction', #PH + 0xc6 => 'Fired, Wireless (Control), Fired normally not as control', #19 (Remote 3s) + 0xc8 => 'Fired, Slow-sync', # K10D + 0xc9 => 'Fired, Slow-sync, Red-eye reduction', # K10D + 0xca => 'Fired, Trailing-curtain Sync', # K10D + 0xf0 => 'Did not fire, Normal', #19 + 0xf1 => 'Did not fire, Red-eye reduction', #19 + 0xf2 => 'Did not fire, Auto', #19 + 0xf3 => 'Did not fire, Auto, Red-eye reduction', #19 + 0xf4 => 'Did not fire, (Unknown 0xf4)', #19 + 0xf5 => 'Did not fire, Wireless (Master)', #19 + 0xf6 => 'Did not fire, Wireless (Control)', #19 + 0xf8 => 'Did not fire, Slow-sync', #19 + 0xf9 => 'Did not fire, Slow-sync, Red-eye reduction', #19 + 0xfa => 'Did not fire, Trailing-curtain Sync', #19 + }, + }, + 2 => { + Name => 'ExternalFlashMode', + PrintHex => 1, + PrintConv => { #19 + 0x00 => 'n/a - Off-Auto-Aperture', + 0x3f => 'Off', + 0x40 => 'On, Auto', + 0xbf => 'On, Flash Problem', #JD + 0xc0 => 'On, Manual', + 0xc4 => 'On, P-TTL Auto', + 0xc5 => 'On, Contrast-control Sync', #JD + 0xc6 => 'On, High-speed Sync', + 0xcc => 'On, Wireless', + 0xcd => 'On, Wireless, High-speed Sync', + 0xf0 => 'Not Connected', #PH (K-5) + }, + }, + 3 => { + Name => 'InternalFlashStrength', + Notes => 'saved from the most recent flash picture, on a scale of about 0 to 100', + }, + 4 => 'TTL_DA_AUp', + 5 => 'TTL_DA_ADown', + 6 => 'TTL_DA_BUp', + 7 => 'TTL_DA_BDown', + 24.1 => { #19/17 + Name => 'ExternalFlashGuideNumber', + Mask => 0x1f, + Notes => 'val = 2**(raw/16 + 4), with a few exceptions', + ValueConv => q{ + return 0 unless $val; + $val = -3 if $val == 29; # -3 is stored as 0x1d + return 2**($val/16 + 4); + }, + ValueConvInv => q{ + return 0 unless $val; + my $raw = int((log($val)/log(2)-4)*16+0.5); + $raw = 29 if $raw < 0; # guide number of 14 gives -3 which is stored as 0x1d + $raw = 31 if $raw > 31; # maximum value is 0x1f + return $raw; + }, + PrintConv => '$val ? int($val + 0.5) : "n/a"', + PrintConvInv => '$val=~/^n/ ? 0 : $val', + # observed values for various flash focal lengths/guide numbers: + # AF-540FGZ (ref 19) AF-360FGZ (ref 17) + # 6 => 20mm/21 29 => 20mm/14 (wide angle panel used) + # 16 => 24mm/32 6 => 24mm/21 + # 18 => 28mm/35 7 => 28mm/22 + # 21 => 35mm/39 10 => 35mm/25 + # 24 => 50mm/45 14 => 50mm/30 + # 26 => 70mm/50 17 => 70mm/33 + # 28 => 85mm/54 19 => 85mm/36 + # (I have also seen a value of 31 when both flashes are used together + # in a wired configuration, but I don't know exactly what this means - PH) + }, + # 24 - have seen bit 0x80 set when 2 external wired flashes are used - PH + # 24 - have seen bit 0x40 set when wireless high speed sync is used - ref 19 + 25 => { #19 + Name => 'ExternalFlashExposureComp', + PrintConv => { + 0 => 'n/a', # Off or Auto Modes + 144 => 'n/a (Manual Mode)', # Manual Flash Output + 164 => '-3.0', + 167 => '-2.5', + 168 => '-2.0', + 171 => '-1.5', + 172 => '-1.0', + 175 => '-0.5', + 176 => '0.0', + 179 => '0.5', + 180 => '1.0', + }, + }, + 26 => { #17 + Name => 'ExternalFlashBounce', + Notes => 'saved from the most recent external flash picture', #19 + PrintConv => { + 0 => 'n/a', + 16 => 'Direct', + 48 => 'Bounce', + }, + }, + # ? => 'ExternalFlashAOutput', + # ? => 'ExternalFlashBOutput', +); + +%Image::ExifTool::Pentax::FlashInfoUnknown = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # 4 - changes with FEC for K-5 - PH +); + +# camera manufacture information (ref PH) +%Image::ExifTool::Pentax::CameraInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int32u', + 0 => { + Name => 'PentaxModelID', + Priority => 0, # (Optio SVi uses incorrect Optio SV ID here) + SeparateTable => 1, + PrintHex => 1, + PrintConv => \%pentaxModelID, + }, + 1 => { + Name => 'ManufactureDate', + Groups => { 2 => 'Time' }, + Notes => q{ + this value, and the values of the tags below, may change if the camera is + serviced + }, + ValueConv => q{ + $val =~ /^(\d{4})(\d{2})(\d{2})$/ and return "$1:$2:$3"; + # Optio A10 and A20 leave "200" off the year + $val =~ /^(\d)(\d{2})(\d{2})$/ and return "200$1:$2:$3"; + return "Unknown ($val)"; + }, + ValueConvInv => '$val=~tr/0-9//dc; $val', + }, + 2 => { + #(see http://www.pentaxforums.com/forums/pentax-dslr-discussion/25711-k10d-update-model-revision-8-1-yes-no-8.html) + Name => 'ProductionCode', #(previously ModelRevision) + Format => 'int32u[2]', + Note => 'values of 8.x indicate that the camera has been serviced', + ValueConv => '$val=~tr/ /./; $val', + ValueConvInv => '$val=~tr/./ /; $val', + PrintConv => '$val=~/^8\./ ? "$val (camera has been serviced)" : $val', + PrintConvInv => '$val=~s/\s+.*//s; $val', + }, + 4 => 'InternalSerialNumber', +); + +# battery information (ref PH) +%Image::ExifTool::Pentax::BatteryInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, +# size of data: +# 4 (K-m,K2000=4xAA), 6 (*istD,K10D,K100D,K110D=2xCR-V3/4xAA), +# 7 (K20D=D-LI50, K200D=4xAA), 8 (645D=D-LI90), 10 (K-r pre-production?), +# 14 (K-7=D-LI90, K-r=D-LI109/4xAA, K-x=4xAA), 26 (K-5=D-LI90) +# battery grips available for: +# BG1 (*istD), BG2 (K10D/K20D), BG3 (K200D), BG4 (K-7,K-5) +# no grip available: K-x + 0.1 => { #19 + Name => 'PowerSource', + Mask => 0x0f, + # have seen the upper bit set (value of 0x82) for the + # *istDS and K100D, but I'm not sure what this means - PH + # I've also seen: 0x42 (K2000), 0xf2 (K-7,K-r,K-5), 0x12,0x22 (K-x) - PH + PrintConv => { + 1 => 'Camera Battery', #PH (NC, GR III) + 2 => 'Body Battery', + 3 => 'Grip Battery', + 4 => 'External Power Supply', #PH + }, + }, + 1.1 => [ + { + Name => 'BodyBatteryState', + Condition => '$$self{Model} =~ /(\*ist|K100D|K200D|K10D|GX10|K20D|GX20|GX-1[LS]?)\b/', + Notes => '*istD, K100D, K200D, K10D and K20D', + Mask => 0xf0, + PrintConv => { #19 + 1 => 'Empty or Missing', + 2 => 'Almost Empty', + 3 => 'Running Low', + 4 => 'Full', + }, + },{ + Name => 'BodyBatteryState', + Condition => '$$self{Model} !~ /(K110D|K2000|K-m)\b/', + Notes => 'other models except the K110D, K2000 and K-m', + Mask => 0xf0, + PrintConv => { + 1 => 'Empty or Missing', + 2 => 'Almost Empty', + 3 => 'Running Low', + 4 => 'Close to Full', + 5 => 'Full', + }, + },{ + Name => 'BodyBatteryState', + Notes => 'decoding unknown for other models', + Mask => 0xf0, + }, + ], + 1.2 => [ + { + Name => 'GripBatteryState', + Condition => '$$self{Model} =~ /(K10D|GX10|K20D|GX20)\b/', + Notes => 'K10D and K20D', + Mask => 0x0f, + PrintConv => { #19 + 1 => 'Empty or Missing', + 2 => 'Almost Empty', + 3 => 'Running Low', + 4 => 'Full', + }, + },{ + Name => 'GripBatteryState', + Notes => 'decoding unknown for other models', + Unknown => 1, # (doesn't appear to be valid for the K-5) + Mask => 0x0f, + }, + ], + # internal and grip battery voltage Analogue to Digital measurements, + # open circuit and under load + 2 => [ + { + Name => 'BodyBatteryADNoLoad', + Description => 'Body Battery A/D No Load', + Condition => '$$self{Model} =~ /(K10D|GX10|K20D|GX20)\b/', + Notes => 'roughly calibrated for K10D with a new Pentax battery', + # rough linear calibration drops quickly below 30% - PH + # DVM readings: 8.18V=186, 8.42-8.40V=192 (full), 6.86V=155 (empty) + PrintConv => 'sprintf("%d (%.1fV, %d%%)",$val,$val*8.18/186,($val-155)*100/35)', + PrintConvInv => '$val=~s/ .*//; $val', + }, + { + Name => 'BodyBatteryADNoLoad', + Description => 'Body Battery A/D No Load', + Condition => '$$self{Model} =~ /(\*ist|K100D|K200D|GX-1[LS]?)\b/', + }, + { + Name => 'BodyBatteryVoltage1', # (static?) + Condition => '$$self{Model} !~ /(K100D|K110D|K2000|K-m|Q\d*)\b/', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => 'sprintf("%.2f V", $val)', + PrintConvInv => '$val =~ s/\s*V$//', + # For my K-5: Min (0%) Max (100%) At Meas + # BodyBatteryVoltage1 6.24 V 7.75 V 7.66 V + # BodyBatteryVoltage2 5.98 V 7.43 V 7.34 V + # BodyBatteryVoltage3 6.41 V 7.93 V 7.84 V + # BodyBatteryVoltage4 6.10 V 7.55 V 7.45 V + # "Meas" open-circuit voltages with DVM: AB=0V, AC=+8.33V, BC=+8.22V + # (terminal "C" is closest to edge of battery) + }, + ], + 3 => [ + { + Name => 'BodyBatteryADLoad', + Description => 'Body Battery A/D Load', + Condition => '$$self{Model} =~ /(K10D|GX10|K20D|GX20)\b/', + Notes => 'roughly calibrated for K10D with a new Pentax battery', + # [have seen 187] - PH + PrintConv => 'sprintf("%d (%.1fV, %d%%)",$val,$val*8.18/186,($val-152)*100/34)', + PrintConvInv => '$val=~s/ .*//; $val', + }, + { + Name => 'BodyBatteryADLoad', + Description => 'Body Battery A/D Load', + Condition => '$$self{Model} =~ /(\*ist|K100D|K200D)\b/', + }, + ], + 4 => [ + { + Name => 'GripBatteryADNoLoad', + Description => 'Grip Battery A/D No Load', + Condition => '$$self{Model} =~ /(\*ist|K10D|GX10|K20D|GX20|GX-1[LS]?)\b/', + }, + { + Name => 'BodyBatteryVoltage2', # (less than BodyBatteryVoltage1 -- under load?) + Condition => '$$self{Model} !~ /(K100D|K110D|K2000|K-m|Q\d*)\b/', + Format => 'int16u', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => 'sprintf("%.2f V", $val)', + PrintConvInv => '$val =~ s/\s*V$//', + }, + ], + 5 => { + Name => 'GripBatteryADLoad', + Condition => '$$self{Model} =~ /(\*ist|K10D|GX10|K20D|GX20)\b/', + Description => 'Grip Battery A/D Load', + }, + 6 => { + Name => 'BodyBatteryVoltage3', # (greater than BodyBatteryVoltage1) + Condition => '$$self{Model} =~ /(K-5|K-r|645D)\b/', + Format => 'int16u', + Notes => 'K-5, K-r and 645D only', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => 'sprintf("%.2f V", $val)', + PrintConvInv => '$val =~ s/\s*V$//', + }, + 8 => { + Name => 'BodyBatteryVoltage4', # (between BodyBatteryVoltage1 and BodyBatteryVoltage2) + Condition => '$$self{Model} =~ /(K-5|K-r)\b/', + Format => 'int16u', + Notes => 'K-5 and K-r only', + ValueConv => '$val / 100', + ValueConvInv => '$val * 100', + PrintConv => 'sprintf("%.2f V", $val)', + PrintConvInv => '$val =~ s/\s*V$//', + }, +); + +# auto focus information +%Image::ExifTool::Pentax::AFInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # AF Info tag names in K10D debugging output - PH: + # SelectArea, InFocusArea, Predictor, Defocus, IntegTime2msStep, + # CalFlag, ContrastFlag, PrecalFlag, SelectSensor + 0x00 => { #PH + Name => 'AFPointsUnknown1', + Unknown => 1, + Format => 'int16u', + ValueConv => '$self->Options("Unknown") ? $val : $val & 0x7ff', + ValueConvInv => '$val', + PrintConvColumns => 2, + PrintConv => { + 0 => '(none)', + 0x07ff => 'All', + 0x0777 => 'Central 9 points', + BITMASK => { + 0 => 'Upper-left', + 1 => 'Top', + 2 => 'Upper-right', + 3 => 'Left', + 4 => 'Mid-left', + 5 => 'Center', + 6 => 'Mid-right', + 7 => 'Right', + 8 => 'Lower-left', + 9 => 'Bottom', + 10 => 'Lower-right', + # (bits 12-15 are flags of some sort) + }, + }, + }, + 0x02 => { #PH + Name => 'AFPointsUnknown2', + Unknown => 1, + Format => 'int16u', + ValueConv => '$self->Options("Unknown") ? $val : $val & 0x7ff', + ValueConvInv => '$val', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Auto', + BITMASK => { + 0 => 'Upper-left', + 1 => 'Top', + 2 => 'Upper-right', + 3 => 'Left', + 4 => 'Mid-left', + 5 => 'Center', + 6 => 'Mid-right', + 7 => 'Right', + 8 => 'Lower-left', + 9 => 'Bottom', + 10 => 'Lower-right', + # (bits 12-15 are flags of some sort) + # bit 15 is set for center focus point only if it is vertical + }, + }, + }, + 0x04 => { #PH (educated guess - predicted amount to drive lens) + Name => 'AFPredictor', + Format => 'int16s', + }, + 0x06 => 'AFDefocus', #PH (educated guess - calculated distance from focused) + 0x07 => { #PH + # effective exposure time for AF sensors in 2 ms increments + Name => 'AFIntegrationTime', + Notes => 'times less than 2 ms give a value of 0', + ValueConv => '$val * 2', + ValueConvInv => 'int($val / 2)', # (don't round up) + PrintConv => '"$val ms"', + PrintConvInv => '$val=~tr/0-9//dc; $val', + }, + # 0x0a - values: 00,05,0d,15,86,8e,a6,ae + 0x0b => { #JD + Name => 'AFPointsInFocus', + Condition => '$$self{Model} !~ /K-[13]\b/', + Notes => q{ + models other than the K-1 and K-3. May report two points in focus even + though a single AFPoint has been selected, in which case the selected + AFPoint is the first reported + }, + PrintConvColumns => 2, + PrintConv => { + 0 => 'None', + 1 => 'Lower-left, Bottom', + 2 => 'Bottom', + 3 => 'Lower-right, Bottom', + 4 => 'Mid-left, Center', + 5 => 'Center (horizontal)', #PH + 6 => 'Mid-right, Center', + 7 => 'Upper-left, Top', + 8 => 'Top', + 9 => 'Upper-right, Top', + 10 => 'Right', + 11 => 'Lower-left, Mid-left', + 12 => 'Upper-left, Mid-left', + 13 => 'Bottom, Center', + 14 => 'Top, Center', + 15 => 'Lower-right, Mid-right', + 16 => 'Upper-right, Mid-right', + 17 => 'Left', + 18 => 'Mid-left', + 19 => 'Center (vertical)', #PH + 20 => 'Mid-right', + }, + }, + 0x1fd => { + Name => 'AFHold', + Notes => 'decoded only for the K-3 II', + Condition => '$$self{Model} eq "PENTAX K-3 II"', + PrintConv => { 0 => 'Off', 1 => 'Short', 2 => 'Medium', 3 => 'Long' }, + }, +); + +# Kelvin white balance information (ref 28, topic 4834) +%Image::ExifTool::Pentax::KelvinWB = ( + %binaryDataAttrs, + FORMAT => 'int16u', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'White balance Blue/Red gains as a function of color temperature.', + 1 => { Name => 'KelvinWB_Daylight', %kelvinWB }, + 5 => { Name => 'KelvinWB_01', %kelvinWB }, + 9 => { Name => 'KelvinWB_02', %kelvinWB }, + 13 => { Name => 'KelvinWB_03', %kelvinWB }, + 17 => { Name => 'KelvinWB_04', %kelvinWB }, + 21 => { Name => 'KelvinWB_05', %kelvinWB }, + 25 => { Name => 'KelvinWB_06', %kelvinWB }, + 29 => { Name => 'KelvinWB_07', %kelvinWB }, + 33 => { Name => 'KelvinWB_08', %kelvinWB }, + 37 => { Name => 'KelvinWB_09', %kelvinWB }, + 41 => { Name => 'KelvinWB_10', %kelvinWB }, + 45 => { Name => 'KelvinWB_11', %kelvinWB }, + 49 => { Name => 'KelvinWB_12', %kelvinWB }, + 53 => { Name => 'KelvinWB_13', %kelvinWB }, + 57 => { Name => 'KelvinWB_14', %kelvinWB }, + 61 => { Name => 'KelvinWB_15', %kelvinWB }, + 65 => { Name => 'KelvinWB_16', %kelvinWB }, +); + +# color information - PH +%Image::ExifTool::Pentax::ColorInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + FORMAT => 'int8s', + 16 => { + Name => 'WBShiftAB', + Notes => 'positive is a shift toward blue', + }, + 17 => { + Name => 'WBShiftGM', + Notes => 'positive is a shift toward green', + }, +); + +# EV step size information - ref 19 +%Image::ExifTool::Pentax::EVStepInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'EVSteps', + PrintConv => { + 0 => '1/2 EV Steps', + 1 => '1/3 EV Steps', + }, + }, + 1 => { + Name => 'SensitivitySteps', + PrintConv => { + 0 => '1 EV Steps', + 1 => 'As EV Steps', + }, + }, +); + +# shot information? - ref PH (K-5) +%Image::ExifTool::Pentax::ShotInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # 0: 0xf2/0xf3 (HDR), 0xf0 (otherwise) + 1 => { # (presumably this is from an orientation sensor) + Name => 'CameraOrientation', + Condition => '$$self{Model} =~ /K-(5|7|r|x)\b/', + Notes => 'K-5, K-7, K-r and K-x', + PrintHex => 1, + PrintConv => { + 0x10 => 'Horizontal (normal)', + 0x20 => 'Rotate 180', + 0x30 => 'Rotate 90 CW', + 0x40 => 'Rotate 270 CW', + 0x50 => 'Upwards', # (to the sky) + 0x60 => 'Downwards', # (to the ground) + }, + }, + # 2: 0xd3 (live view), 0xdb (HDR), 0x7b (otherwise) + # 3: 0xff + # 4: 0x64, 0x6a, 0x6f, 0xa4, 0xaa, 0xab, 0xbf + # 5: 0xfe + # 6: 0x0e + # 7: 0x02 (live view), 0x06 (otherwise) + # 8-10: 0x00 +); + +# face detect positions - ref PH (Optio RZ10) +%Image::ExifTool::Pentax::FacePos = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + FORMAT => 'int16u', + 0 => { + Name => 'Face1Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 1 ? undef : $val', + Notes => 'X/Y coordinates of face center in full-sized image', + }, + 2 => { + Name => 'Face2Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 2 ? undef : $val', + }, + 4 => { + Name => 'Face3Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 3 ? undef : $val', + }, + 6 => { + Name => 'Face4Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 4 ? undef : $val', + }, + 8 => { + Name => 'Face5Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 5 ? undef : $val', + }, + 10 => { + Name => 'Face6Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 6 ? undef : $val', + }, + 12 => { + Name => 'Face7Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 7 ? undef : $val', + }, + 14 => { + Name => 'Face8Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 8 ? undef : $val', + }, + 16 => { + Name => 'Face9Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 9 ? undef : $val', + }, + 18 => { + Name => 'Face10Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 10 ? undef : $val', + }, + 20 => { + Name => 'Face11Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 11 ? undef : $val', + }, + 22 => { + Name => 'Face12Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 12 ? undef : $val', + }, + 24 => { + Name => 'Face13Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 13 ? undef : $val', + }, + 26 => { + Name => 'Face14Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 14 ? undef : $val', + }, + 28 => { + Name => 'Face15Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 15 ? undef : $val', + }, + 30 => { + Name => 'Face16Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 16 ? undef : $val', + }, + 32 => { + Name => 'Face17Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 17 ? undef : $val', + }, + 34 => { + Name => 'Face18Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 18 ? undef : $val', + }, + 36 => { + Name => 'Face19Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 19 ? undef : $val', + }, + 38 => { + Name => 'Face20Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 20 ? undef : $val', + }, + 40 => { + Name => 'Face21Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 21 ? undef : $val', + }, + 42 => { + Name => 'Face22Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 22 ? undef : $val', + }, + 44 => { + Name => 'Face23Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 23 ? undef : $val', + }, + 46 => { + Name => 'Face24Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 24 ? undef : $val', + }, + 48 => { + Name => 'Face25Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 25 ? undef : $val', + }, + 50 => { + Name => 'Face26Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 26 ? undef : $val', + }, + 52 => { + Name => 'Face27Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 27 ? undef : $val', + }, + 54 => { + Name => 'Face28Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 28 ? undef : $val', + }, + 56 => { + Name => 'Face29Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 29 ? undef : $val', + }, + 58 => { + Name => 'Face30Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 30 ? undef : $val', + }, + 60 => { + Name => 'Face31Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 31 ? undef : $val', + }, + 62 => { + Name => 'Face32Position', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 32 ? undef : $val', + }, +); + +# face detect sizes - ref PH (Optio RZ10) +%Image::ExifTool::Pentax::FaceSize = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + FORMAT => 'int16u', + 0 => { + Name => 'Face1Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 1 ? undef : $val', + }, + 2 => { + Name => 'Face2Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 2 ? undef : $val', + }, + 4 => { + Name => 'Face3Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 3 ? undef : $val', + }, + 6 => { + Name => 'Face4Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 4 ? undef : $val', + }, + 8 => { + Name => 'Face5Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 5 ? undef : $val', + }, + 10 => { + Name => 'Face6Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 6 ? undef : $val', + }, + 12 => { + Name => 'Face7Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 7 ? undef : $val', + }, + 14 => { + Name => 'Face8Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 8 ? undef : $val', + }, + 16 => { + Name => 'Face9Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 9 ? undef : $val', + }, + 18 => { + Name => 'Face10Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 10 ? undef : $val', + }, + 20 => { + Name => 'Face11Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 11 ? undef : $val', + }, + 22 => { + Name => 'Face12Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 12 ? undef : $val', + }, + 24 => { + Name => 'Face13Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 13 ? undef : $val', + }, + 26 => { + Name => 'Face14Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 14 ? undef : $val', + }, + 28 => { + Name => 'Face15Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 15 ? undef : $val', + }, + 30 => { + Name => 'Face16Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 16 ? undef : $val', + }, + 32 => { + Name => 'Face17Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 17 ? undef : $val', + }, + 34 => { + Name => 'Face18Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 18 ? undef : $val', + }, + 36 => { + Name => 'Face19Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 19 ? undef : $val', + }, + 38 => { + Name => 'Face20Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 20 ? undef : $val', + }, + 40 => { + Name => 'Face21Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 21 ? undef : $val', + }, + 42 => { + Name => 'Face22Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 22 ? undef : $val', + }, + 44 => { + Name => 'Face23Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 23 ? undef : $val', + }, + 46 => { + Name => 'Face24Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 24 ? undef : $val', + }, + 48 => { + Name => 'Face25Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 25 ? undef : $val', + }, + 50 => { + Name => 'Face26Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 26 ? undef : $val', + }, + 52 => { + Name => 'Face27Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 27 ? undef : $val', + }, + 54 => { + Name => 'Face28Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 28 ? undef : $val', + }, + 56 => { + Name => 'Face29Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 29 ? undef : $val', + }, + 58 => { + Name => 'Face30Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 30 ? undef : $val', + }, + 60 => { + Name => 'Face31Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 31 ? undef : $val', + }, + 62 => { + Name => 'Face32Size', + Format => 'int16u[2]', + RawConv => '$$self{FacesDetected} < 32 ? undef : $val', + }, +); + +# digital filter information - ref PH (K-5) +%Image::ExifTool::Pentax::FilterInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + FORMAT => 'int8u', + NOTES => q{ + The parameters associated with each type of digital filter are unique, and + these settings are also extracted with the DigitalFilter tag. Information + is not extracted for filters that are "Off" unless the L<Unknown|../ExifTool.html#Unknown> option is + used. + }, + 0 => { + Name => 'SourceDirectoryIndex', + Format => 'int16u', + }, + 2 => { + Name => 'SourceFileIndex', + Format => 'int16u', + }, + 0x005 => { Name => 'DigitalFilter01', %digitalFilter }, + 0x016 => { Name => 'DigitalFilter02', %digitalFilter }, + 0x027 => { Name => 'DigitalFilter03', %digitalFilter }, + 0x038 => { Name => 'DigitalFilter04', %digitalFilter }, + 0x049 => { Name => 'DigitalFilter05', %digitalFilter }, + 0x05a => { Name => 'DigitalFilter06', %digitalFilter }, + 0x06b => { Name => 'DigitalFilter07', %digitalFilter }, + 0x07c => { Name => 'DigitalFilter08', %digitalFilter }, + 0x08d => { Name => 'DigitalFilter09', %digitalFilter }, + 0x09e => { Name => 'DigitalFilter10', %digitalFilter }, + 0x0af => { Name => 'DigitalFilter11', %digitalFilter }, + 0x0c0 => { Name => 'DigitalFilter12', %digitalFilter }, + 0x0d1 => { Name => 'DigitalFilter13', %digitalFilter }, + 0x0e2 => { Name => 'DigitalFilter14', %digitalFilter }, + 0x0f3 => { Name => 'DigitalFilter15', %digitalFilter }, + 0x104 => { Name => 'DigitalFilter16', %digitalFilter }, + 0x115 => { Name => 'DigitalFilter17', %digitalFilter }, + 0x126 => { Name => 'DigitalFilter18', %digitalFilter }, + 0x137 => { Name => 'DigitalFilter19', %digitalFilter }, + 0x148 => { Name => 'DigitalFilter20', %digitalFilter }, +); + +# electronic level information - ref PH (K-5) +%Image::ExifTool::Pentax::LevelInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int8s', + NOTES => q{ + Tags decoded from the electronic level information for the K-5. May not be + valid for other models. + }, + 0 => { + Name => 'LevelOrientation', + Mask => 0x0f, + PrintHex => 0, + PrintConv => { + 0 => 'n/a', #PH (NC, GR III) + 1 => 'Horizontal (normal)', + 2 => 'Rotate 180', + 3 => 'Rotate 90 CW', + 4 => 'Rotate 270 CW', + 9 => 'Horizontal; Off Level', + 10 => 'Rotate 180; Off Level', + 11 => 'Rotate 90 CW; Off Level', + 12 => 'Rotate 270 CW; Off Level', + 13 => 'Upwards', + 14 => 'Downwards', + }, + }, + 0.1 => { + Name => 'CompositionAdjust', + Mask => 0xf0, + PrintConv => { + 0 => 'Off', + 2 => 'Composition Adjust', + 10 => 'Composition Adjust + Horizon Correction', + 12 => 'Horizon Correction', + }, + }, + 1 => { + Name => 'RollAngle', + Notes => 'converted to degrees of clockwise camera rotation', + ValueConv => '-$val / 2', + ValueConvInv => '-$val * 2', + }, + 2 => { + Name => 'PitchAngle', + Notes => 'converted to degrees of upward camera tilt', + ValueConv => '-$val / 2', + ValueConvInv => '-$val * 2', + }, + # 3,4 - related somehow to horizon correction and composition adjust + # 5,6,7 - (the notes below refer to how the image moves in the LCD monitor) + 5 => { + Name => 'CompositionAdjustX', + Notes => 'steps to the right, 1/16 mm per step', + ValueConv => '-$val', + ValueConvInv => '-$val', + }, + 6 => { + Name => 'CompositionAdjustY', + Notes => 'steps up, 1/16 mm per step', + ValueConv => '-$val', + ValueConvInv => '-$val', + }, + 7 => { + Name => 'CompositionAdjustRotation', + Notes => 'steps clockwise, 1/8 degree per step', + ValueConv => '-$val / 2', + ValueConvInv => '-$val * 2', + }, +); + +# white balance RGGB levels (ref 28) +%Image::ExifTool::Pentax::WBLevels = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # 0 - 11 (number of entries in this table) + # 1 - 0 + 2 => { + Name => 'WB_RGGBLevelsDaylight', + Format => 'int16u[4]', + }, + # 10 - 1 + 11 => { + Name => 'WB_RGGBLevelsShade', + Format => 'int16u[4]', + }, + # 19 - 2 + 20 => { + Name => 'WB_RGGBLevelsCloudy', + Format => 'int16u[4]', + }, + # 28 - 3 + 29 => { + Name => 'WB_RGGBLevelsTungsten', + Format => 'int16u[4]', + }, + # 37 - 4 + 38 => { + Name => 'WB_RGGBLevelsFluorescentD', + Format => 'int16u[4]', + }, + # 46 - 5 + 47 => { + Name => 'WB_RGGBLevelsFluorescentN', + Format => 'int16u[4]', + }, + # 55 - 6 + 56 => { + Name => 'WB_RGGBLevelsFluorescentW', + Format => 'int16u[4]', + }, + # 64 - 7 + 65 => { + Name => 'WB_RGGBLevelsFlash', + Format => 'int16u[4]', + }, + # 73 - 8 + 74 => { + Name => 'WB_RGGBLevelsFluorescentL', + Format => 'int16u[4]', + }, + # 82 - 0xfe + 83 => { + Name => 'WB_RGGBLevelsUnknown', + Format => 'int16u[4]', + Unknown => 1, + }, + # 91 - 0xff + 92 => { + Name => 'WB_RGGBLevelsUserSelected', + Format => 'int16u[4]', + }, +); + +# lens information for Penax Q (ref PH) +# (306 bytes long, I wonder if this contains vignetting information too?) +%Image::ExifTool::Pentax::LensInfoQ = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'More lens information stored by the Pentax Q.', + 0x0c => { + Name => 'LensModel', + Format => 'string[30]', + }, + 0x2a => { + Name => 'LensInfo', + Format => 'string[20]', + ValueConv => '$val=~s/mm/mm /; $val', + ValueConvInv => '$val=~tr/ //d; $val', + } +); + +# Pixel shift information for the K-3II (ref PH) +%Image::ExifTool::Pentax::PixelShiftInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Pixel shift information stored by the K-3 II.', + 0x00 => { + Name => 'PixelShiftResolution', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, +); + +# AF point information for the K-1 (ref 29) +%Image::ExifTool::Pentax::AFPointInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'AF point information written by the K-1.', + # 0 - int16u: 1 (version?) + 2 => { + Name => 'NumAFPoints', + Format => 'int16u', + }, + 4 => { + Name => 'AFPointsInFocus', + Condition => '$$self{Model} =~ /K-1\b/', + Format => 'int8u[9]', + PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,33,2,0x02)', + }, + 4.1 => { + Name => 'AFPointsSelected', + Condition => '$$self{Model} =~ /K-1\b/', + Format => 'int8u[9]', + PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,33,2,0x03)', + }, + 4.2 => { + Name => 'AFPointsSpecial', + Condition => '$$self{Model} =~ /K-1\b/', + Format => 'int8u[9]', + PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,33,2,0x03,0x03)', + }, +); + +# temperature information for some models - PH +%Image::ExifTool::Pentax::TempInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + A number of additional temperature readings are extracted from this 256-byte + binary-data block in images from models such as the K-01, K-3, K-5, K-50 and + K-500. It is currently not known where the corresponding temperature + sensors are located in the camera. + }, + # (it would be nice to know where these temperature sensors are located, + # but since according to the manual the Slow Shutter Speed NR Auto mode + # is based on "internal temperature", my guess is that there must be + # at least one on the sensor itself. These temperatures seem to rise + # more quickly than CameraTemperature when shooting video.) + 0x0c => { + Name => 'SensorTemperature', #forum6677 (was CameraTemperature2) + Format => 'int16s', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f C", $val)', + PrintConvInv => '$val=~s/ ?c$//i; $val', + }, + 0x0e => { + Name => 'SensorTemperature2', #forum6677 (was CameraTemperature3) + Format => 'int16s', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f C", $val)', + PrintConvInv => '$val=~s/ ?c$//i; $val', + }, + 0x14 => { + Name => 'CameraTemperature4', + Condition => '$$self{Model} =~ /K-5\b/', + Format => 'int16s', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?c$//i; $val', + }, + 0x16 => { # usually the same as CameraTemperature4, but not always + Name => 'CameraTemperature5', + Condition => '$$self{Model} =~ /K-5\b/', + Format => 'int16s', + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?c$//i; $val', + }, + # 0x18,0x1a,0x1c,0x1e = int16u[4] BlackPoint - PH +); + +# currently unknown info +%Image::ExifTool::Pentax::UnknownInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # K10D: first 8 bytes seem to be short integers which change with ISO (value + # is usually close to ISO/100) possibly smoothing or gain parameters? - PH + # byte 0-1 - Higher for high color temperatures (red boost or red noise suppression?) + # byte 6-7 - Higher for low color temperatures (blue boost or blue noise suppression?) + # also changing are bytes 10,11,14,15 +); + +# Pentax type 2 (Casio-like) maker notes (ref 1) +%Image::ExifTool::Pentax::Type2 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + WRITABLE => 'int16u', + NOTES => q{ + These tags are used by the Pentax Optio 330 and 430, and are similar to the + tags used by Casio. + }, + 0x0001 => { + Name => 'RecordingMode', + PrintConv => { + 0 => 'Auto', + 1 => 'Night Scene', + 2 => 'Manual', + }, + }, + 0x0002 => { + Name => 'Quality', + PrintConv => { + 0 => 'Good', + 1 => 'Better', + 2 => 'Best', + }, + }, + 0x0003 => { + Name => 'FocusMode', + PrintConv => { + 2 => 'Custom', + 3 => 'Auto', + }, + }, + 0x0004 => { + Name => 'FlashMode', + PrintConv => { + 1 => 'Auto', + 2 => 'On', + 4 => 'Off', + 6 => 'Red-eye reduction', + }, + }, + # Casio 0x0005 is FlashIntensity + # Casio 0x0006 is ObjectDistance + 0x0007 => { + Name => 'WhiteBalance', + PrintConv => { + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Shade', + 3 => 'Tungsten', + 4 => 'Fluorescent', + 5 => 'Manual', + }, + }, + 0x000a => { + Name => 'DigitalZoom', + Writable => 'int32u', + }, + 0x000b => { + Name => 'Sharpness', + PrintConv => { + 0 => 'Normal', + 1 => 'Soft', + 2 => 'Hard', + }, + }, + 0x000c => { + Name => 'Contrast', + PrintConv => { + 0 => 'Normal', + 1 => 'Low', + 2 => 'High', + }, + }, + 0x000d => { + Name => 'Saturation', + PrintConv => { + 0 => 'Normal', + 1 => 'Low', + 2 => 'High', + }, + }, + 0x0014 => { + Name => 'ISO', + Priority => 0, + PrintConv => { + 10 => 100, + 16 => 200, + 50 => 50, #PH + 100 => 100, #PH + 200 => 200, #PH + 400 => 400, #PH + 800 => 800, #PH + 1600 => 1600, #PH + 3200 => 3200, #PH + 65534 => 'Auto 2', #PH (Q-S1 MOV) [how is this different from 65535?] + 65535 => 'Auto', #PH (K-S1 MOV) + }, + }, + 0x0017 => { + Name => 'ColorFilter', + PrintConv => { + 1 => 'Full', + 2 => 'Black & White', + 3 => 'Sepia', + }, + }, + # Casio 0x0018 is AFPoint + # Casio 0x0019 is FlashIntensity + 0x0e00 => { + Name => 'PrintIM', + Description => 'Print Image Matching', + Writable => 0, + SubDirectory => { + TagTable => 'Image::ExifTool::PrintIM::Main', + }, + }, + 0x1000 => { + Name => 'HometownCityCode', + Writable => 'undef', + Count => 4, + }, + 0x1001 => { #PH + Name => 'DestinationCityCode', + Writable => 'undef', + Count => 4, + }, +); + +# ASCII-based maker notes of Optio E20 and E25 - PH +%Image::ExifTool::Pentax::Type4 = ( + PROCESS_PROC => \&Image::ExifTool::HP::ProcessHP, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + The following few tags are extracted from the wealth of information + available in maker notes of the Optio E20 and E25. These maker notes are + stored as ASCII text in a format very similar to some HP models. + }, + 'F/W Version' => 'FirmwareVersion', +); + +# tags in Pentax QuickTime videos (PH - tests with Optio WP) +# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos) +%Image::ExifTool::Pentax::MOV = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => 'This information is found in MOV videos from cameras such as the Optio WP.', + 0x00 => { + Name => 'Make', + Format => 'string[24]', + }, + # (01 00 at offset 0x20) + 0x26 => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val ? 10 / $val : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x2a => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x32 => { + Name => 'ExposureCompensation', + Format => 'rational64s', + PrintConv => '$val ? sprintf("%+.1f", $val) : 0', + }, + 0x44 => { + Name => 'WhiteBalance', + Format => 'int16u', + PrintConv => { + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Shade', + 3 => 'Fluorescent', #2 + 4 => 'Tungsten', + 5 => 'Manual', + }, + }, + 0x48 => { + Name => 'FocalLength', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f mm",$val)', + }, + 0xaf => { + Name => 'ISO', + Format => 'int16u', + }, +); + +# Pentax metadata in AVI videos (PH) +%Image::ExifTool::Pentax::AVI = ( + NOTES => 'Pentax-specific RIFF tags found in AVI videos.', + GROUPS => { 0 => 'MakerNotes', 2 => 'Video' }, + hymn => { + Name => 'MakerNotes', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::Main', + Start => 10, + Base => '$start', + ByteOrder => 'Unknown', # K-70 is little-endian, K-x is big-endian + }, + }, + mknt => { # (Q-S1) + Name => 'MakerNotes', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::Main', + Start => 10, + Base => '$start', + ByteOrder => 'Unknown', + }, + }, +); + +# Pentax metadata in S1 AVI maker notes (PH) +%Image::ExifTool::Pentax::S1 = ( + NOTES => 'Tags extracted from the maker notes of AVI videos from the Optio S1.', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x0000 => { #5 + Name => 'MakerNoteVersion', + Writable => 'undef', + Count => 4, + }, +); + +# Pentax metadata in AVI videos from the RS1000 (PH) +%Image::ExifTool::Pentax::Junk = ( + NOTES => 'Tags found in the JUNK chunk of AVI videos from the RS1000.', + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x0c => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[32]', + }, +); + +# PreviewImage information found in PXTH atom of K-01 MOV videos +%Image::ExifTool::Pentax::PXTH = ( + NOTES => 'Tags found in the PXTH atom of MOV videos from the K-01.', + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x00 => { + Name => 'PreviewImageLength', + Format => 'int32u', + }, + 0x04 => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Format => 'undef[$val{0}]', + Notes => '640-pixel-wide JPEG preview', # (360 pixels high, may depend on aspect ratio) + RawConv => '$self->ValidateImage(\$val,$tag)', + }, +); + +# information in PENT atom of MOV videos from the Optio WG-2 GPS +%Image::ExifTool::Pentax::PENT = ( + NOTES => 'Tags found in the PENT atom of MOV videos from the Optio WG-2 GPS.', + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0 => { + Name => 'Make', + Format => 'string[24]', + }, + 0x1a => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[24]', + }, + 0x38 => { #(NC) + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val ? 10 / $val : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x3c => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x44 => { #(NC) + Name => 'ExposureCompensation', + Format => 'rational64s', + PrintConv => '$val ? sprintf("%+.1f", $val) : 0', + }, + 0x54 => { #(NC) + Name => 'FocalLength', + Format => 'int32u', + PrintConv => '"$val mm"', + }, + 0x71 => { + Name => 'DateTime1', + Format => 'string[24]', + Groups => { 2 => 'Time' }, + }, + 0x8b => { + Name => 'DateTime2', + Format => 'string[24]', + Groups => { 2 => 'Time' }, + }, + 0xa7 => { #(NC) + Name => 'ISO', + Format => 'int32u', + }, + 0xc7 => { + Name => 'GPSVersionID', + Format => 'undef[8]', + Groups => { 1 => 'GPS', 2 => 'Location' }, + DataMember => 'GPSVersionID', + RawConv => '$$self{GPSVersionID} = ($val=~s/GPS_// ? join(" ",unpack("C*",$val)) : undef)', + PrintConv => '$val =~ tr/ /./; $val', + }, + 0xcf => { + Name => 'GPSLatitudeRef', + Condition => '$$self{GPSVersionID}', + Format => 'string[2]', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + N => 'North', + S => 'South', + }, + }, + 0xd1 => { + Name => 'GPSLatitude', + Condition => '$$self{GPSVersionID}', + Format => 'rational64u[3]', + Groups => { 1 => 'GPS', 2 => 'Location' }, + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)', + }, + 0xe9 => { + Name => 'GPSLongitudeRef', + Condition => '$$self{GPSVersionID}', + Format => 'string[2]', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + E => 'East', + W => 'West', + }, + }, + 0xeb => { + Name => 'GPSLongitude', + Condition => '$$self{GPSVersionID}', + Format => 'rational64u[3]', + Groups => { 1 => 'GPS', 2 => 'Location' }, + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)', + }, + 0x103 => { + Name => 'GPSAltitudeRef', + Condition => '$$self{GPSVersionID}', + Format => 'int8u', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + 0 => 'Above Sea Level', + 1 => 'Below Sea Level', + }, + }, + 0x104 => { + Name => 'GPSAltitude', + Condition => '$$self{GPSVersionID}', + Format => 'rational64u', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "$val m"', + }, + 0x11c => { + Name => 'GPSTimeStamp', + Condition => '$$self{GPSVersionID}', + Groups => { 1 => 'GPS', 2 => 'Time' }, + Format => 'rational64u[3]', + ValueConv => 'Image::ExifTool::GPS::ConvertTimeStamp($val)', + PrintConv => 'Image::ExifTool::GPS::PrintTimeStamp($val)', + }, + 0x134 => { + Name => 'GPSSatellites', + Condition => '$$self{GPSVersionID}', + Format => 'string[3]', + Groups => { 1 => 'GPS', 2 => 'Location' }, + }, + 0x137 => { + Name => 'GPSStatus', + Condition => '$$self{GPSVersionID}', + Format => 'string[2]', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + A => 'Measurement Active', + V => 'Measurement Void', + }, + }, + 0x139 => { + Name => 'GPSMeasureMode', + Condition => '$$self{GPSVersionID}', + Format => 'string[2]', + Groups => { 1 => 'GPS', 2 => 'Location' }, + PrintConv => { + 2 => '2-Dimensional Measurement', + 3 => '3-Dimensional Measurement', + }, + }, + 0x13b => { + Name => 'GPSMapDatum', + Condition => '$$self{GPSVersionID}', + Format => 'string[7]', + Groups => { 1 => 'GPS', 2 => 'Location' }, + }, + 0x142 => { + Name => 'GPSDateStamp', + Condition => '$$self{GPSVersionID}', + Groups => { 1 => 'GPS', 2 => 'Time' }, + Format => 'string[11]', + ValueConv => 'Image::ExifTool::Exif::ExifDate($val)', + }, + 0x173 => { #(NC) + Name => 'AudioCodecID', + Format => 'string[4]', + }, + 0x7d3 => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Format => 'undef[$size-0x7d3]', + Notes => '640x480 JPEG preview image', # (black borders pad to 480 pixels high) + RawConv => '$self->ValidateImage(\$val,$tag)', + }, +); + +# tags in Pentax Optio RZ18 AVI videos (ref PH) +# (very similar to Olympus::AVI tags) +%Image::ExifTool::Pentax::Junk2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + NOTES => 'This information is found in AVI videos from the Optio RZ18.', + 0x12 => { + Name => 'Make', + Format => 'string[24]', + }, + 0x2c => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[24]', + }, + 0x5e => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x83 => { + Name => 'DateTime1', + Format => 'string[24]', + Groups => { 2 => 'Time' }, + }, + 0x9d => { + Name => 'DateTime2', + Format => 'string[24]', + Groups => { 2 => 'Time' }, + }, + 0x12b => { + Name => 'ThumbnailWidth', + Format => 'int16u', + }, + 0x12d => { + Name => 'ThumbnailHeight', + Format => 'int16u', + }, + 0x12f => { + Name => 'ThumbnailLength', + Format => 'int32u', + }, + 0x133 => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Format => 'undef[$val{0x12f}]', + Notes => '160x120 JPEG thumbnail image', + RawConv => '$self->ValidateImage(\$val,$tag)', + }, +); + +#------------------------------------------------------------------------------ +# Convert filter settings (ref PH, K-5) +# Inputs: 0) value to convert, 1) flag for inverse conversion, 2) lookup table +# Returns: converted value +sub PrintFilter($$$) +{ + my ($val, $inv, $conv) = @_; + my (@vals, @cval, $t, $v); + + if (not $inv) { + # forward conversion (reading): + @vals = split ' ',$val; + $t = shift @vals; + push @cval, $$conv{$t} || "Unknown ($t)"; + while (@vals) { + $t = shift @vals; + $v = shift @vals; + next unless $t; + last unless defined $v; + my $c = $filterSettings{$t}; + if ($c) { + my $c1 = $$c[1]; + if (ref $c1) { + $v = $$c1{$v} || "Unknown($v)"; + } elsif ($v) { + $v = sprintf $c1, $v; + } + push @cval, "$$c[0]=$v"; + } else { + push @cval, "Unknown($t)=$v"; + } + } + return @cval ? \@cval : undef; + } else { + # reverse conversion (writing): + @vals = split /,\s*/, $val; + # convert filter name + delete $$conv{OTHER}; # avoid recursion + $v = Image::ExifTool::ReverseLookup(shift(@vals), $conv); + $$conv{OTHER} = \&PrintFilter; + return undef unless defined $v; + push @cval, $v; + # generate a lookup table for the filter setting name + my %settingNames; + $settingNames{$_} = $filterSettings{$_}[0] foreach keys %filterSettings; + # convert filter settings + foreach $v (@vals) { + $v =~ /^(.*)=(.*)$/ or return undef; + ($t, $v) = ($1, $2); + # look up settings name + $t = Image::ExifTool::ReverseLookup($t, \%settingNames); + return undef unless defined $t; + if (ref $filterSettings{$t}[1]) { + # look up settings value + $v = Image::ExifTool::ReverseLookup($v, $filterSettings{$t}[1]); + return undef unless defined $v; + } else { + return undef unless Image::ExifTool::IsInt($v); + } + push @cval, $t, $v; + } + push @cval, (0) x (17 - @cval) if @cval < 17; # pad with zeros if necessary + return join(' ', @cval); + } +} + +#------------------------------------------------------------------------------ +# Decode AF bit mask (ref 29) +# Inputs: 0) raw binary value, 1) number of AF points, 2) number of bits per AF point, +# 3) bit mask, 4) bit value (undef for any bit set) +sub DecodeAFPoints($$$$;$) +{ + my ($val, $num, $bits, $mask, $bitVal) = @_; + my @bytes = split ' ', $val; + my $i = 1; # (starts at AF point number 1) + my $shift = 8 - $bits; + my $byte = shift @bytes; + my @bitList; + for (;;) { + if ($bitVal) { + push @bitList, $i if (($byte >> $shift) & $mask) == $bitVal; + } else { + push @bitList, $i if ($byte >> $shift) & $mask; + } + last if ++$i > $num; + $shift -= $bits; + if ($shift < 0) { + last unless @bytes; + $byte = shift @bytes; + $shift += 8; + } + } + return join(',', @bitList); +} + +#------------------------------------------------------------------------------ +# Convert Pentax hex-based EV (modulo 8) to real number +# Inputs: 0) value to convert +# eg) 0x00 -> 0 +# 0x03 -> 0.33333 +# 0x04 -> 0.5 +# 0x05 -> 0.66666 +# 0x08 -> 1 ... etc +sub PentaxEv($) +{ + my $val = shift; + if ($val & 0x01) { + my $sign = $val < 0 ? -1 : 1; + my $frac = ($val * $sign) & 0x07; + if ($frac == 0x03) { + $val += $sign * ( 8 / 3 - $frac); + } elsif ($frac == 0x05) { + $val += $sign * (16 / 3 - $frac); + } + } + return $val / 8; +} + +#------------------------------------------------------------------------------ +# Convert number to Pentax hex-based EV (modulo 8) +# Inputs: 0) number +# Returns: Pentax EV code +sub PentaxEvInv($) +{ + my $num = shift; + my $val = $num * 8; + # extra fudging makes sure 0.3 and 0.33333 both round up to 3, etc + my $sign = $num < 0 ? -1 : 1; + my $inum = $num * $sign - int($num * $sign); + if ($inum > 0.29 and $inum < 0.4) { + $val += $sign / 3; + } elsif ($inum > 0.6 and $inum < .71) { + $val -= $sign / 3; + } + return int($val + 0.5 * $sign); +} + +#------------------------------------------------------------------------------ +# Encrypt or decrypt Pentax ShutterCount (symmetrical encryption) - PH +# Inputs: 0) shutter count value, 1) ExifTool object ref +# Returns: Encrypted or decrypted ShutterCount +sub CryptShutterCount($$) +{ + my ($val, $et) = @_; + # Pentax Date and Time values are used in the encryption + return undef unless $$et{PentaxDate} and $$et{PentaxTime} and + length($$et{PentaxDate})==4 and length($$et{PentaxTime})>=3; + # get Date and Time as integers (after padding Time with a null byte) + my $date = unpack('N', $$et{PentaxDate}); + my $time = unpack('N', $$et{PentaxTime} . "\0"); + return $val ^ $date ^ (0xffffffff - $time); +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Pentax - Pentax/Asahi maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Pentax and Asahi maker notes in EXIF information. + +=head1 NOTES + +I couldn't find a good source for Pentax maker notes information, but I've +managed to discover a fair bit of information by analyzing sample images +downloaded from the internet, and through tests with my own Optio S, Optio +WP, K10D, K-01 and K-5, and with help provided by other ExifTool users (see +L</ACKNOWLEDGEMENTS>). + +The Pentax maker notes are stored in standard EXIF format, but the offsets +used for some of their cameras are wacky. The Optio 330 gives the offset +relative to the offset of the tag in the directory, the Optio WP uses a base +offset in the middle of nowhere, and the Optio 550 uses different (and +totally illogical) bases for different menu entries. Very weird. (It +wouldn't surprise me if Pentax can't read their own maker notes!) Luckily, +there are only a few entries in the maker notes which are large enough to +require offsets, so this doesn't affect much useful information. ExifTool +attempts to make sense of this fiasco by making an assumption about where +the information should be stored to deduce the correct offsets. + +=head1 REFERENCES + +=over 4 + +=item L<Image::MakerNotes::Pentax|Image::MakerNotes::Pentax> + +=item L<http://johnst.org/sw/exiftags/> (Asahi models) + +=item L<http://kobe1995.jp/~kaz/astro/istD.html> + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=item (...plus lots of testing with my Optio WP, K10D and K-5!) + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Wayne Smith, John Francis, Douglas O'Brien, Cvetan Ivanov, Jens +Duttke, Dave Nicholson, Iliah Borg, Klaus Homeister, Louis Granboulan and +Andras Salamon for help figuring out some Pentax tags, Ger Vermeulen and +Niels Kristian Bech Jensen for contributing print conversion values for some +tags, and everyone who helped contribute to the LensType values. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Pentax Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::Info(3pm)|Image::Info> + +=cut diff --git a/lib/Image/ExifTool/PhaseOne.pm b/lib/Image/ExifTool/PhaseOne.pm new file mode 100644 index 0000000..23c2eb8 --- /dev/null +++ b/lib/Image/ExifTool/PhaseOne.pm @@ -0,0 +1,733 @@ +#------------------------------------------------------------------------------ +# File: PhaseOne.pm +# +# Description: Phase One maker notes tags +# +# Revisions: 2013-02-17 - P. Harvey Created +# +# References: 1) http://www.cybercom.net/~dcoffin/dcraw/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::PhaseOne; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.07'; + +sub WritePhaseOne($$$); +sub ProcessPhaseOne($$$); + +# default formats based on PhaseOne format size +my @formatName = ( undef, 'string', 'int16s', undef, 'int32s' ); + +# Phase One maker notes (ref PH) +%Image::ExifTool::PhaseOne::Main = ( + PROCESS_PROC => \&ProcessPhaseOne, + WRITE_PROC => \&WritePhaseOne, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => '1', + FORMAT => 'int32s', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + VARS => { ENTRY_SIZE => 16 }, # (entries contain a format field) + NOTES => 'These tags are extracted from the maker notes of Phase One images.', + 0x0100 => { #1 + Name => 'CameraOrientation', + ValueConv => '$val & 0x03', # ignore other bits for now + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + 3 => 'Rotate 180', + }, + }, + # 0x0101 - int32u: 96,160,192,256,544 (same as 0x0213) + 0x0102 => { Name => 'SerialNumber', Format => 'string' }, + # 0x0103 - int32u: 19,20,59769034 + # 0x0104 - int32u: 50,200 + 0x0105 => 'ISO', + 0x0106 => { + Name => 'ColorMatrix1', + Format => 'float', + Count => 9, + PrintConv => q{ + my @a = map { sprintf('%.3f', $_) } split ' ', $val; + return "@a"; + }, + PrintConvInv => '$val', + }, + 0x0107 => { Name => 'WB_RGBLevels', Format => 'float', Count => 3 }, + 0x0108 => 'SensorWidth', + 0x0109 => 'SensorHeight', + 0x010a => 'SensorLeftMargin', #1 + 0x010b => 'SensorTopMargin', #1 + 0x010c => 'ImageWidth', + 0x010d => 'ImageHeight', + 0x010e => { #1 + Name => 'RawFormat', + # 1 = raw bit mask 0x5555 (>1 mask 0x1354) + # >2 = compressed + # 5 = non-linear + PrintConv => { #PH + 1 => 'RAW 1', #? (encrypted) + 2 => 'RAW 2', #? (encrypted) + 3 => 'IIQ L', # (now "L14", ref IB) + # 4? + 5 => 'IIQ S', + 6 => 'IIQ Sv2', # (now "S14" for "IIQ 14 Smart" and "IIQ 14 Sensor+", ref IB) + 8 => 'IIQ L16', #IB ("IIQ 16 Extended" and "IIQ 16 Large") + }, + }, + 0x010f => { + Name => 'RawData', + Format => 'undef', # (actually 2-byte integers, but don't convert) + Binary => 1, + PutFirst => 1, + Writable => 0, + Drop => 1, # don't copy to other file types + }, + 0x0110 => { #1 + Name => 'SensorCalibration', + SubDirectory => { TagTable => 'Image::ExifTool::PhaseOne::SensorCalibration' }, + }, + 0x0112 => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Format => 'int32u', + Writable => 0, # (don't write because this is an encryption key for RawFormat 1 and 2) + Priority => 0, + Shift => 'Time', + Groups => { 2 => 'Time' }, + Notes => 'may be used as a key to encrypt the raw data', #1 + ValueConv => 'ConvertUnixTime($val)', + ValueConvInv => 'GetUnixTime($val)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + 0x0113 => 'ImageNumber', # (NC) + 0x0203 => { Name => 'Software', Format => 'string' }, + 0x0204 => { Name => 'System', Format => 'string' }, + # 0x020b - int32u: 0,1 + # 0x020c - int32u: 1,2 + # 0x020e - int32u: 1,3 + 0x0210 => { # (NC) (used in linearization formula - ref 1) + Name => 'SensorTemperature', + Format => 'float', + PrintConv => 'sprintf("%.2f C",$val)', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 0x0211 => { # (NC) + Name => 'SensorTemperature2', + Format => 'float', + PrintConv => 'sprintf("%.2f C",$val)', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 0x0212 => { + Name => 'UnknownDate', + Format => 'int32u', + Groups => { 2 => 'Time' }, + # (this time is within about 10 minutes before or after 0x0112) + Unknown => 1, + Shift => 'Time', + ValueConv => 'ConvertUnixTime($val)', + ValueConvInv => 'GetUnixTime($val)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + # 0x0213 - int32u: 96,160,192,256,544 (same as 0x0101) + # 0x0215 - int32u: 4,5 + # 0x021a - used by dcraw + 0x021c => { Name => 'StripOffsets', Binary => 1, Writable => 0 }, + 0x021d => 'BlackLevel', #1 + # 0x021e - int32u: 1 + # 0x0220 - int32u: 32 + # 0x0221 - float: 0-271 + 0x0222 => 'SplitColumn', #1 + 0x0223 => { Name => 'BlackLevelData', Format => 'int16u', Count => -1, Binary => 1 }, #1 + # 0x0224 - int32u: 1688,2748,3372 + 0x0225 => { + Name => 'PhaseOne_0x0225', + Format => 'int16s', + Count => -1, + Flags => ['Unknown','Hidden'], + PrintConv => 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val', + }, + 0x0226 => { + Name => 'ColorMatrix2', + Format => 'float', + Count => 9, + PrintConv => q{ + my @a = map { sprintf('%.3f', $_) } split ' ', $val; + return "@a"; + }, + PrintConvInv => '$val', + }, + # 0x0227 - int32u: 0,1 + # 0x0228 - int32u: 1,2 + # 0x0229 - int32s: -2,0 + 0x0267 => { #PH + Name => 'AFAdjustment', + Format => 'float', + }, + 0x022b => { #PH + Name => 'PhaseOne_0x022b', + Format => 'float', + Flags => ['Unknown','Hidden'], + }, + # 0x0242 - int32u: 55 + # 0x0244 - int32u: 102 + # 0x0245 - float: 1.2 + 0x0258 => { #PH + Name => 'PhaseOne_0x0258', + Format => 'int16s', + Flags => ['Unknown','Hidden'], + PrintConv => 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val', + }, + 0x025a => { #PH + Name => 'PhaseOne_0x025a', + Format => 'int16s', + Flags => ['Unknown','Hidden'], + PrintConv => 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val', + }, + # 0x0300 - int32u: 100,101,102 + 0x0301 => { Name => 'FirmwareVersions', Format => 'string' }, + # 0x0304 - int32u: 8,3073,3076 + 0x0400 => { + Name => 'ShutterSpeedValue', + Format => 'float', + ValueConv => 'abs($val)<100 ? 2**(-$val) : 0', + ValueConvInv => '$val>0 ? -log($val)/log(2) : -100', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x0401 => { + Name => 'ApertureValue', + Format => 'float', + ValueConv => '2 ** ($val / 2)', + ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x0402 => { + Name => 'ExposureCompensation', + Format => 'float', + PrintConv => 'sprintf("%.3f",$val)', + PrintConvInv => '$val', + }, + 0x0403 => { + Name => 'FocalLength', + Format => 'float', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + # 0x0404 - int32u: 0,3 + # 0x0405 - int32u? (big numbers) + # 0x0406 - int32u: 1 + # 0x0407 - float: -0.333 (exposure compensation again?) + # 0x0408-0x0409 - int32u: 1 + 0x0410 => { Name => 'CameraModel', Format => 'string' }, + # 0x0411 - int32u: 33556736 + 0x0412 => { Name => 'LensModel', Format => 'string' }, + 0x0414 => { + Name => 'MaxApertureValue', + Format => 'float', + ValueConv => '2 ** ($val / 2)', + ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x0415 => { + Name => 'MinApertureValue', + Format => 'float', + ValueConv => '2 ** ($val / 2)', + ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + # 0x0416 - float: (min focal length? ref LR, Credo50) (but looks more like an int32u date for the 645DF - PH) + # 0x0417 - float: 80 (max focal length? ref LR) + 0x0455 => { #PH + Name => 'Viewfinder', + Format => 'string', + }, +); + +# Phase One metadata (ref 1) +%Image::ExifTool::PhaseOne::SensorCalibration = ( + PROCESS_PROC => \&ProcessPhaseOne, + WRITE_PROC => \&WritePhaseOne, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + TAG_PREFIX => 'SensorCalibration', + WRITE_GROUP => 'PhaseOne', + VARS => { ENTRY_SIZE => 12 }, # (entries do not contain a format field) + 0x0400 => { + Name => 'SensorDefects', + # list of defects. each defect is 4 x int16u values: + # 0=column, 1=row, 2=type (129=bad pixel, 131=bad column), 3=? + # (but it isn't really worth the time decoding this -- it can be a few hundred kB) + Format => 'undef', + Binary => 1, + }, + 0x0401 => { + Name => 'AllColorFlatField1', + Format => 'undef', + Flags => ['Unknown','Binary'], + }, + 0x0404 => { #PH + Name => 'SensorCalibration_0x0404', + Format => 'string', + Flags => ['Unknown','Hidden'], + }, + 0x0405 => { #PH + Name => 'SensorCalibration_0x0405', + Format => 'string', + Flags => ['Unknown','Hidden'], + }, + 0x0406 => { #PH + Name => 'SensorCalibration_0x0406', + Format => 'string', + Flags => ['Unknown','Hidden'], + }, + 0x0407 => { #PH + Name => 'SerialNumber', + Format => 'string', + Writable => 1, + }, + 0x0408 => { #PH + Name => 'SensorCalibration_0x0408', + Format => 'float', + Flags => ['Unknown','Hidden'], + }, + 0x040b => { + Name => 'RedBlueFlatField', + Format => 'undef', + Flags => ['Unknown','Binary'], + }, + 0x040f => { #PH + Name => 'SensorCalibration_0x040f', + Format => 'undef', + Flags => ['Unknown','Hidden'], + }, + 0x0410 => { + Name => 'AllColorFlatField2', + Format => 'undef', + Flags => ['Unknown','Binary'], + }, + # 0x0412 - used by dcraw + 0x0413 => { #PH + Name => 'SensorCalibration_0x0413', + Format => 'double', + Flags => ['Unknown','Hidden'], + }, + 0x0414 => { #PH + Name => 'SensorCalibration_0x0414', + Format => 'undef', + Flags => ['Unknown','Hidden'], + ValueConv => q{ + my $order = GetByteOrder(); + if (length $val >= 8 and SetByteOrder(substr($val,0,2))) { + $val = ReadValue(\$val, 2, 'int16u', 1, length($val)-2) . ' ' . + ReadValue(\$val, 4, 'float', undef, length($val)-4); + SetByteOrder($order); + } + return $val; + }, + }, + 0x0416 => { + Name => 'AllColorFlatField3', + Format => 'undef', + Flags => ['Unknown','Binary'], + }, + 0x0418 => { #PH + Name => 'SensorCalibration_0x0418', + Format => 'undef', + Flags => ['Unknown','Hidden'], + }, + 0x0419 => { + Name => 'LinearizationCoefficients1', + Format => 'float', + PrintConv => 'my @a=split " ",$val;join " ", map { sprintf("%.5g",$_) } @a', + }, + 0x041a => { + Name => 'LinearizationCoefficients2', + Format => 'float', + PrintConv => 'my @a=split " ",$val;join " ", map { sprintf("%.5g",$_) } @a', + }, + 0x041c => { #PH + Name => 'SensorCalibration_0x041c', + Format => 'float', + Flags => ['Unknown','Hidden'], + }, + 0x041e => { #PH + Name => 'SensorCalibration_0x041e', + Format => 'undef', + Flags => ['Unknown','Hidden'], + ValueConv => q{ + my $order = GetByteOrder(); + if (length $val >= 8 and SetByteOrder(substr($val,0,2))) { + $val = ReadValue(\$val, 2, 'int16u', 1, length($val)-2) . ' ' . + ReadValue(\$val, 4, 'float', undef, length($val)-4); + SetByteOrder($order); + } + return $val; + }, + }, +); + +#------------------------------------------------------------------------------ +# Do HTML dump of an IFD entry +# Inputs: 0) ExifTool ref, 1) tag table ref, 3) tag ID, 4) tag value, +# 5) IFD entry offset, 6) IFD entry size, 7) parameter hash +sub HtmlDump($$$$$$%) +{ + my ($et, $tagTablePtr, $tagID, $value, $entry, $entryLen, %parms) = @_; + my ($dirName, $index, $formatStr, $dataPos, $base, $size, $valuePtr) = + @parms{qw(DirName Index Format DataPos Base Size Start)}; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID); + my ($tagName, $colName, $subdir); + my $count = $parms{Count} || $size; + $base = 0 unless defined $base; + if ($tagInfo) { + $tagName = $$tagInfo{Name}; + $subdir = $$tagInfo{SubDirectory}; + if ($$tagInfo{Format}) { + $formatStr = $$tagInfo{Format}; + $count = $size / Image::ExifTool::FormatSize($formatStr); + } + } else { + $tagName = sprintf("Tag 0x%.4x", $tagID); + } + my $dname = sprintf("${dirName}-%.2d", $index); + # build our tool tip + my $fstr = "$formatStr\[$count]"; + my $tip = sprintf("Tag ID: 0x%.4x\n", $tagID) . + "Format: $fstr\nSize: $size bytes\n"; + if ($size > 4) { + $tip .= sprintf("Value offset: 0x%.4x\n", $valuePtr - $base); + $tip .= sprintf("Actual offset: 0x%.4x\n", $valuePtr + $dataPos); + $tip .= sprintf("Offset base: 0x%.4x\n", $dataPos + $base); + $colName = "<span class=F>$tagName</span>"; + } else { + $colName = $tagName; + } + unless (ref $value) { + my $tval = length($value) > 32 ? substr($value,0,28) . '[...]' : $value; + $tval =~ tr/\x00-\x1f\x7f-\xff/./; + $tip .= "Value: $tval"; + } + $et->HDump($entry+$dataPos, $entryLen, "$dname $colName", $tip, 1); + if ($size > 4) { + my $dumpPos = $valuePtr + $dataPos; + # add value data block + $et->HDump($dumpPos,$size,"$tagName value",'SAME', $subdir ? 0x04 : 0); + } +} + +#------------------------------------------------------------------------------ +# Write PhaseOne maker notes (both types of PhaseOne IFD) +# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref +# Returns: data block or undef on error +sub WritePhaseOne($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to autoload this package + + # nothing to do if we aren't changing any PhaseOne tags + my $newTags = $et->GetNewTagInfoHash($tagTablePtr); + return undef unless %$newTags or $$et{DropTags} or $$et{EDIT_DIRS}{PhaseOne}; + + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos} || 0; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || $$dirInfo{DataLen} - $dirStart; + my $dirName = $$dirInfo{DirName}; + my $verbose = $et->Options('Verbose'); + + return undef if $dirLen < 12; + unless ($$tagTablePtr{VARS} and $$tagTablePtr{VARS}{ENTRY_SIZE}) { + $et->WarnOnce("No ENTRY_SIZE for $$tagTablePtr{TABLE_NAME}"); + return undef; + } + my $entrySize = $$tagTablePtr{VARS}{ENTRY_SIZE}; + my $ifdType = $$tagTablePtr{TAG_PREFIX} || 'PhaseOne'; + my $hdr = substr($$dataPt, $dirStart, 12); + if ($entrySize == 16) { + return undef unless $hdr =~ /^(IIII.waR|MMMMRaw.)/s; + } elsif ($hdr !~ /^(IIII\x01\0\0\0|MMMM\0\0\0\x01)/s) { + $et->Warn("Unrecognized $ifdType directory version"); + return undef; + } + SetByteOrder(substr($hdr, 0, 2)); + # get offset to start of PhaseOne directory + my $ifdStart = Get32u(\$hdr, 8); + return undef if $ifdStart + 8 > $dirLen; + # initialize output directory buffer with (fixed) number of entries plus 4-byte padding + my $dirBuff = substr($$dataPt, $dirStart + $ifdStart, 8); + # get number of entries in PhaseOne directory + my $numEntries = Get32u(\$dirBuff, 0); + my $ifdEnd = $ifdStart + 8 + $entrySize * $numEntries; + return undef if $numEntries < 2 or $numEntries > 300 or $ifdEnd > $dirLen; + my $hdrBuff = $hdr; + my $valBuff = ''; # buffer for value data + my $fixup = new Image::ExifTool::Fixup; + my $index; + for ($index=0; $index<$numEntries; ++$index) { + my $entry = $dirStart + $ifdStart + 8 + $entrySize * $index; + my $tagID = Get32u($dataPt, $entry); + my $size = Get32u($dataPt, $entry+$entrySize-8); + my ($formatSize, $formatStr); + if ($entrySize == 16) { + $formatSize = Get32u($dataPt, $entry+4); + $formatStr = $formatName[$formatSize]; + unless ($formatStr) { + $et->Warn("Possibly invalid $ifdType IFD entry $index",1); + delete $$newTags{$tagID}; # make sure we don't try to change this one + } + } else { + # (no format code for SensorCalibration IFD entries) + $formatSize = 1; + $formatStr = 'undef'; + } + my $valuePtr = $entry + $entrySize - 4; + if ($size > 4) { + if ($size > 0x7fffffff) { + $et->Error("Invalid size for $ifdType IFD entry $index",1); + return undef; + } + $valuePtr = Get32u($dataPt, $valuePtr); + if ($valuePtr + $size > $dirLen) { + $et->Error(sprintf("Invalid offset 0x%.4x for $ifdType IFD entry $index",$valuePtr),1); + return undef; + } + $valuePtr += $dirStart; + } + my $value = substr($$dataPt, $valuePtr, $size); + my $tagInfo = $$newTags{$tagID} || $$tagTablePtr{$tagID}; + $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID) if $tagInfo and ref($tagInfo) ne 'HASH'; + if ($$newTags{$tagID}) { + $formatStr = $$tagInfo{Format} if $$tagInfo{Format}; + my $count = int($size / Image::ExifTool::FormatSize($formatStr)); + my $val = ReadValue(\$value, 0, $formatStr, $count, $size); + my $nvHash = $et->GetNewValueHash($tagInfo); + if ($et->IsOverwriting($nvHash, $val)) { + my $newVal = $et->GetNewValue($nvHash); + # allow count to change for string and undef types only + undef $count if $formatStr eq 'string' or $formatStr eq 'undef'; + my $newValue = WriteValue($newVal, $formatStr, $count); + if (defined $newValue) { + $value = $newValue; + $size = length $newValue; + $et->VerboseValue("- $dirName:$$tagInfo{Name}", $val); + $et->VerboseValue("+ $dirName:$$tagInfo{Name}", $newVal); + ++$$et{CHANGED}; + } + } + } elsif ($tagInfo and $$tagInfo{SubDirectory}) { + my $subTable = GetTagTable($$tagInfo{SubDirectory}{TagTable}); + my %subdirInfo = ( + DirName => $$tagInfo{Name}, + DataPt => \$value, + DataLen => length $value, + ); + my $newValue = $et->WriteDirectory(\%subdirInfo, $subTable); + if (defined $newValue and length($newValue)) { + $value = $newValue; + $size = length $newValue; + } + } elsif ($$et{DropTags} and (($tagInfo and $$tagInfo{Drop}) or $size > 8192)) { + # decrease the number of entries in the directory + Set32u(Get32u(\$dirBuff, 0) - 1, \$dirBuff, 0); + next; # drop this tag + } + # add the tagID, possibly format size, and size to this directory entry + $dirBuff .= substr($$dataPt, $entry, $entrySize - 8) . Set32u($size); + + # pad value to an even 4-byte boundary just in case + $value .= ("\0" x (4 - ($size & 0x03))) if $size & 0x03 or not $size; + if ($size <= 4) { + # store value in place of the IFD value pointer (already padded to 4 bytes) + $dirBuff .= $value; + } elsif ($tagInfo and $$tagInfo{PutFirst}) { + # store value immediately after header + $dirBuff .= Set32u(length $hdrBuff); + $hdrBuff .= $value; + } else { + # store value at end of value buffer + $fixup->AddFixup(length $dirBuff); + $dirBuff .= Set32u(length $valBuff); + $valBuff .= $value; + } + } + # apply necessary fixup to offsets in PhaseOne directory + $$fixup{Shift} = length $hdrBuff; + $fixup->ApplyFixup(\$dirBuff); + # set pointer to PhaseOneIFD in header + Set32u(length($hdrBuff) + length($valBuff), \$hdrBuff, 8); + return $hdrBuff . $valBuff . $dirBuff; +} + +#------------------------------------------------------------------------------ +# Read Phase One maker notes +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +# Notes: This routine processes both the main PhaseOne IFD type (with 16 bytes +# per entry), and the SensorCalibration IFD type (12 bytes per entry) +sub ProcessPhaseOne($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = ($$dirInfo{DataPos} || 0) + ($$dirInfo{Base} || 0); + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || $$dirInfo{DataLen} - $dirStart; + my $binary = $et->Options('Binary'); + my $verbose = $et->Options('Verbose'); + my $htmlDump = $$et{HTML_DUMP}; + + return 0 if $dirLen < 12; + unless ($$tagTablePtr{VARS} and $$tagTablePtr{VARS}{ENTRY_SIZE}) { + $et->WarnOnce("No ENTRY_SIZE for $$tagTablePtr{TABLE_NAME}"); + return undef; + } + my $entrySize = $$tagTablePtr{VARS}{ENTRY_SIZE}; + my $ifdType = $$tagTablePtr{TAG_PREFIX} || 'PhaseOne'; + + my $hdr = substr($$dataPt, $dirStart, 12); + if ($entrySize == 16) { + return 0 unless $hdr =~ /^(IIII.waR|MMMMRaw.)/s; + } elsif ($hdr !~ /^(IIII\x01\0\0\0|MMMM\0\0\0\x01)/s) { + $et->Warn("Unrecognized $ifdType directory version"); + return 0; + } + SetByteOrder(substr($hdr, 0, 2)); + # get offset to start of PhaseOne directory + my $ifdStart = Get32u(\$hdr, 8); + return 0 if $ifdStart + 8 > $dirLen; + # get number of entries in PhaseOne directory + my $numEntries = Get32u($dataPt, $dirStart + $ifdStart); + my $ifdEnd = $ifdStart + 8 + $entrySize * $numEntries; + return 0 if $numEntries < 2 or $numEntries > 300 or $ifdEnd > $dirLen; + $et->VerboseDir($ifdType, $numEntries); + if ($htmlDump) { + $et->HDump($dirStart + $dataPos, 8, "$ifdType header"); + $et->HDump($dirStart + $dataPos + 8, 4, "$ifdType IFD offset"); + $et->HDump($dirStart + $dataPos + $ifdStart, 4, "$ifdType entries", + "Entry count: $numEntries"); + $et->HDump($dirStart + $dataPos + $ifdStart + 4, 4, '[unused]'); + } + my $index; + for ($index=0; $index<$numEntries; ++$index) { + my $entry = $dirStart + $ifdStart + 8 + $entrySize * $index; + my $tagID = Get32u($dataPt, $entry); + my $size = Get32u($dataPt, $entry+$entrySize-8); + my $valuePtr = $entry + $entrySize - 4; + my ($formatSize, $formatStr, $value); + if ($entrySize == 16) { + # (format code only for the 16-byte IFD entry) + $formatSize = Get32u($dataPt, $entry+4); + $formatStr = $formatName[$formatSize]; + unless ($formatStr) { + $et->WarnOnce("Unrecognized $ifdType format size $formatSize",1); + $formatSize = 1; + $formatStr = 'undef'; + } + } elsif ($size %4) { + $formatSize = 1; + $formatStr = 'undef'; + } else { + $formatSize = 4; + $formatStr = 'int32s'; + } + if ($size > 4) { + if ($size > 0x7fffffff) { + $et->Warn("Invalid size for $ifdType IFD entry $index"); + return 0; + } + $valuePtr = Get32u($dataPt, $valuePtr); + if ($valuePtr + $size > $dirLen) { + $et->Warn(sprintf("Invalid offset 0x%.4x for $ifdType IFD entry $index",$valuePtr)); + return 0; + } + $valuePtr += $dirStart; + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID); + if ($tagInfo) { + $formatStr = $$tagInfo{Format} if $$tagInfo{Format}; + } else { + next unless $verbose or $htmlDump; + } + my $count = int($size / Image::ExifTool::FormatSize($formatStr)); + if ($count > 100000 and not $binary) { + $value = \ "Binary data $size bytes"; + } else { + $value = ReadValue($dataPt,$valuePtr,$formatStr,$count,$size); + # try to distinguish between the various format types + if ($formatStr eq 'int32s') { + my ($val) = split ' ', $value; + if (defined $val) { + # get floating point exponent (has bias of 127) + my $exp = ($val & 0x7f800000) >> 23; + if ($exp > 120 and $exp < 140) { + $formatStr = 'float'; + $value = ReadValue($dataPt,$valuePtr,$formatStr,$count,$size); + } + } + } + } + my %parms = ( + DirName => $ifdType, + Index => $index, + DataPt => $dataPt, + DataPos => $dataPos, + Size => $size, + Start => $valuePtr, + Format => $formatStr, + Count => $count + ); + $htmlDump and HtmlDump($et, $tagTablePtr, $tagID, $value, $entry, $entrySize, + %parms, Base => $dirStart); + $et->HandleTag($tagTablePtr, $tagID, $value, %parms); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::PhaseOne - Phase One maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to decode Phase +One maker notes. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PhaseOne Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/PhotoCD.pm b/lib/Image/ExifTool/PhotoCD.pm new file mode 100644 index 0000000..441a328 --- /dev/null +++ b/lib/Image/ExifTool/PhotoCD.pm @@ -0,0 +1,506 @@ +#------------------------------------------------------------------------------ +# File: PhotoCD.pm +# +# Description: Read Kodak Photo CD Image Pac (PCD) metadata +# +# Revisions: 2012/05/07 - P. Harvey Created +# +# References: 1) http://pcdtojpeg.sourceforge.net/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::PhotoCD; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.03'; + +sub ProcessExtData($$$); + +# PhotoCD info +%Image::ExifTool::PhotoCD::Main = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + NOTES => 'Tags extracted from Kodak Photo CD Image Pac (PCD) files.', + 7 => { + Name => 'SpecificationVersion', + Format => 'int8u[2]', + RawConv => '$val eq "255 255" ? "n/a" : $val', + ValueConv => '$val =~ tr/ /./; $val', + }, + 9 => { + Name => 'AuthoringSoftwareRelease', + Format => 'int8u[2]', + RawConv => '$val eq "255 255" ? "n/a" : $val', + ValueConv => '$val =~ tr/ /./; $val', + }, + 11 => { + Name => 'ImageMagnificationDescriptor', + Format => 'int8u[2]', + ValueConv => '$val =~ tr/ /./; $val', + }, + 13 => { + Name => 'CreateDate', + Format => 'int32u', + Groups => { 2 => 'Time' }, + RawConv => '$val == 0xffffffff ? undef : $val', + ValueConv => 'ConvertUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + 17 => { + Name => 'ModifyDate', + Format => 'int32u', + Groups => { 2 => 'Time' }, + RawConv => '$val == 0xffffffff ? undef : $val', + ValueConv => 'ConvertUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + 21 => { + Name => 'ImageMedium', + PrintConv => { + 0 => 'Color negative', + 1 => 'Color reversal', + 2 => 'Color hard copy', + 3 => 'Thermal hard copy', + 4 => 'Black and white negative', + 5 => 'Black and white reversal', + 6 => 'Black and white hard copy', + 7 => 'Internegative', + 8 => 'Synthetic image', + }, + }, + 22 => { + Name => 'ProductType', + Format => 'string[20]', + ValueConv => '$val =~ s/[ \0]+$//; $val', + }, + 42 => { + Name => 'ScannerVendorID', + Format => 'string[20]', + ValueConv => '$val =~ s/[ \0]+$//; $val', + }, + 62 => { + Name => 'ScannerProductID', + Format => 'string[16]', + ValueConv => '$val =~ s/[ \0]+$//; $val', + }, + 78 => { + Name => 'ScannerFirmwareVersion', + Format => 'string[4]', + ValueConv => '$val =~ s/[ \0]+$//; $val', + }, + 82 => { + Name => 'ScannerFirmwareDate', + Format => 'string[8]', + ValueConv => '$val =~ s/[ \0]+$//; $val', + }, + 90 => { + Name => 'ScannerSerialNumber', + Format => 'string[20]', + ValueConv => '$val =~ s/[ \0]+$//; $val', + }, + 110 => { + Name => 'ScannerPixelSize', + Format => 'undef[2]', + ValueConv => 'join(".",unpack("H2H2",$val))', + PrintConv => '"$val micrometers"', + }, + 112 => { + Name => 'ImageWorkstationMake', + Format => 'string[20]', + ValueConv => '$val =~ s/[ \0]+$//; $val', + }, + 132 => { + Name => 'CharacterSet', + PrintConv => { + 1 => '38 characters ISO 646', + 2 => '65 characters ISO 646', + 3 => '95 characters ISO 646', + 4 => '191 characters ISO 8850-1', + 5 => 'ISO 2022', + 6 => 'Includes characters not ISO 2375 registered', + }, + }, + 133 => { + Name => 'CharacterEscapeSequence', + Format => 'undef[32]', + Binary => 1, + Unknown => 1, + }, + 165 => { + Name => 'PhotoFinisherName', + Format => 'string[60]', + ValueConv => '$val =~ s/[ \0]+$//; $val', + }, + 225 => { + Name => 'HasSBA', + Format => 'undef[3]', + Hidden => 1, + RawConv => '$val eq "SBA" and $$self{HasSBA} = 1; undef', + }, + 228 => { + Name => 'SceneBalanceAlgorithmRevision', + Condition => '$$self{HasSBA}', + Format => 'int8u[2]', + ValueConv => '$val =~ tr/ /./; $val', + }, + 230 => { + Name => 'SceneBalanceAlgorithmCommand', + Condition => '$$self{HasSBA}', + PrintConv => { + 0 => 'Neutral SBA On, Color SBA On', + 1 => 'Neutral SBA Off, Color SBA Off', + 2 => 'Neutral SBA On, Color SBA Off', + 3 => 'Neutral SBA Off, Color SBA On', + }, + }, + 325 => { + Name => 'SceneBalanceAlgorithmFilmID', + Condition => '$$self{HasSBA}', + Format => 'int16u', + PrintConv => { + 1 => '3M ScotchColor AT 100', + 2 => '3M ScotchColor AT 200', + 3 => '3M ScotchColor HR2 400', + 7 => '3M Scotch HR 200 Gen 2', + 9 => '3M Scotch HR 400 Gen 2', + 16 => 'Agfa Agfacolor XRS 400 Gen 1', + 17 => 'Agfa Agfacolor XRG/XRS 400', + 18 => 'Agfa Agfacolor XRG/XRS 200', + 19 => 'Agfa Agfacolor XRS 1000 Gen 2', + 20 => 'Agfa Agfacolor XRS 400 Gen 2', + 21 => 'Agfa Agfacolor XRS/XRC 100', + 26 => 'Fuji Reala 100 (JAPAN)', + 27 => 'Fuji Reala 100 Gen 1', + 28 => 'Fuji Reala 100 Gen 2', + 29 => 'Fuji SHR 400 Gen 2', + 30 => 'Fuji Super HG 100', + 31 => 'Fuji Super HG 1600 Gen 1', + 32 => 'Fuji Super HG 200', + 33 => 'Fuji Super HG 400', + 34 => 'Fuji Super HG 100 Gen 2', + 35 => 'Fuji Super HR 100 Gen 1', + 36 => 'Fuji Super HR 100 Gen 2', + 37 => 'Fuji Super HR 1600 Gen 2', + 38 => 'Fuji Super HR 200 Gen 1', + 39 => 'Fuji Super HR 200 Gen 2', + 40 => 'Fuji Super HR 400 Gen 1', + 43 => 'Fuji NSP 160S (Pro)', + 45 => 'Kodak Kodacolor VR 100 Gen 2', + 47 => 'Kodak Gold 400 Gen 3', + 55 => 'Kodak Ektar 100 Gen 1', + 56 => 'Kodak Ektar 1000 Gen 1', + 57 => 'Kodak Ektar 125 Gen 1', + 58 => 'Kodak Royal Gold 25 RZ', + 60 => 'Kodak Gold 1600 Gen 1', + 61 => 'Kodak Gold 200 Gen 2', + 62 => 'Kodak Gold 400 Gen 2', + 65 => 'Kodak Kodacolor VR 100 Gen 1', + 66 => 'Kodak Kodacolor VR 1000 Gen 2', + 67 => 'Kodak Kodacolor VR 1000 Gen 1', + 68 => 'Kodak Kodacolor VR 200 Gen 1', + 69 => 'Kodak Kodacolor VR 400 Gen 1', + 70 => 'Kodak Kodacolor VR 200 Gen 2', + 71 => 'Kodak Kodacolor VRG 100 Gen 1', + 72 => 'Kodak Gold 100 Gen 2', + 73 => 'Kodak Kodacolor VRG 200 Gen 1', + 74 => 'Kodak Gold 400 Gen 1', + 87 => 'Kodak Ektacolor Gold 160', + 88 => 'Kodak Ektapress 1600 Gen 1 PPC', + 89 => 'Kodak Ektapress Gold 100 Gen 1 PPA', + 90 => 'Kodak Ektapress Gold 400 PPB-3', + 92 => 'Kodak Ektar 25 Professional PHR', + 97 => 'Kodak T-Max 100 Professional', + 98 => 'Kodak T-Max 3200 Professional', + 99 => 'Kodak T-Max 400 Professional', + 101 => 'Kodak Vericolor 400 Prof VPH', + 102 => 'Kodak Vericolor III Pro', + 121 => 'Konika Konica Color SR-G 3200', + 122 => 'Konika Konica Color Super SR100', + 123 => 'Konika Konica Color Super SR 400', + 138 => 'Kodak Gold Unknown', + 139 => 'Kodak Unknown Neg A- Normal SBA', + 143 => 'Kodak Ektar 100 Gen 2', + 147 => 'Kodak Kodacolor CII', + 148 => 'Kodak Kodacolor II', + 149 => 'Kodak Gold Plus 200 Gen 3', + 150 => 'Kodak Internegative +10% Contrast', + 151 => 'Agfa Agfacolor Ultra 50', + 152 => 'Fuji NHG 400', + 153 => 'Agfa Agfacolor XRG 100', + 154 => 'Kodak Gold Plus 100 Gen 3', + 155 => 'Konika Konica Color Super SR200 Gen 1', + 156 => 'Konika Konica Color SR-G 160', + 157 => 'Agfa Agfacolor Optima 125', + 158 => 'Agfa Agfacolor Portrait 160', + 162 => 'Kodak Kodacolor VRG 400 Gen 1', + 163 => 'Kodak Gold 200 Gen 1', + 164 => 'Kodak Kodacolor VRG 100 Gen 2', + 174 => 'Kodak Internegative +20% Contrast', + 175 => 'Kodak Internegative +30% Contrast', + 176 => 'Kodak Internegative +40% Contrast', + 184 => 'Kodak TMax-100 D-76 CI = .40', + 185 => 'Kodak TMax-100 D-76 CI = .50', + 186 => 'Kodak TMax-100 D-76 CI = .55', + 187 => 'Kodak TMax-100 D-76 CI = .70', + 188 => 'Kodak TMax-100 D-76 CI = .80', + 189 => 'Kodak TMax-100 TMax CI = .40', + 190 => 'Kodak TMax-100 TMax CI = .50', + 191 => 'Kodak TMax-100 TMax CI = .55', + 192 => 'Kodak TMax-100 TMax CI = .70', + 193 => 'Kodak TMax-100 TMax CI = .80', + 195 => 'Kodak TMax-400 D-76 CI = .40', + 196 => 'Kodak TMax-400 D-76 CI = .50', + 197 => 'Kodak TMax-400 D-76 CI = .55', + 198 => 'Kodak TMax-400 D-76 CI = .70', + 214 => 'Kodak TMax-400 D-76 CI = .80', + 215 => 'Kodak TMax-400 TMax CI = .40', + 216 => 'Kodak TMax-400 TMax CI = .50', + 217 => 'Kodak TMax-400 TMax CI = .55', + 218 => 'Kodak TMax-400 TMax CI = .70', + 219 => 'Kodak TMax-400 TMax CI = .80', + 224 => '3M ScotchColor ATG 400/EXL 400', + 266 => 'Agfa Agfacolor Optima 200', + 267 => 'Konika Impressa 50', + 268 => 'Polaroid Polaroid CP 200', + 269 => 'Konika Konica Color Super SR200 Gen 2', + 270 => 'ILFORD XP2 400', + 271 => 'Polaroid Polaroid Color HD2 100', + 272 => 'Polaroid Polaroid Color HD2 400', + 273 => 'Polaroid Polaroid Color HD2 200', + 282 => '3M ScotchColor ATG-1 200', + 284 => 'Konika XG 400', + 307 => 'Kodak Universal Reversal B/W', + 308 => 'Kodak RPC Copy Film Gen 1', + 312 => 'Kodak Universal E6', + 324 => 'Kodak Gold Ultra 400 Gen 4', + 328 => 'Fuji Super G 100', + 329 => 'Fuji Super G 200', + 330 => 'Fuji Super G 400 Gen 2', + 333 => 'Kodak Universal K14', + 334 => 'Fuji Super G 400 Gen 1', + 366 => 'Kodak Vericolor HC 6329 VHC', + 367 => 'Kodak Vericolor HC 4329 VHC', + 368 => 'Kodak Vericolor L 6013 VPL', + 369 => 'Kodak Vericolor L 4013 VPL', + 418 => 'Kodak Ektacolor Gold II 400 Prof', + 430 => 'Kodak Royal Gold 1000', + 431 => 'Kodak Kodacolor VR 200 / 5093', + 432 => 'Kodak Gold Plus 100 Gen 4', + 443 => 'Kodak Royal Gold 100', + 444 => 'Kodak Royal Gold 400', + 445 => 'Kodak Universal E6 auto-balance', + 446 => 'Kodak Universal E6 illum. corr.', + 447 => 'Kodak Universal K14 auto-balance', + 448 => 'Kodak Universal K14 illum. corr.', + 449 => 'Kodak Ektar 100 Gen 3 SY', + 456 => 'Kodak Ektar 25', + 457 => 'Kodak Ektar 100 Gen 3 CX', + 458 => 'Kodak Ektapress Plus 100 Prof PJA-1', + 459 => 'Kodak Ektapress Gold II 100 Prof', + 460 => 'Kodak Pro 100 PRN', + 461 => 'Kodak Vericolor HC 100 Prof VHC-2', + 462 => 'Kodak Prof Color Neg 100', + 463 => 'Kodak Ektar 1000 Gen 2', + 464 => 'Kodak Ektapress Plus 1600 Pro PJC-1', + 465 => 'Kodak Ektapress Gold II 1600 Prof', + 466 => 'Kodak Super Gold 1600 GF Gen 2', + 467 => 'Kodak Kodacolor 100 Print Gen 4', + 468 => 'Kodak Super Gold 100 Gen 4', + 469 => 'Kodak Gold 100 Gen 4', + 470 => 'Kodak Gold III 100 Gen 4', + 471 => 'Kodak Funtime 100 FA', + 472 => 'Kodak Funtime 200 FB', + 473 => 'Kodak Kodacolor VR 200 Gen 4', + 474 => 'Kodak Gold Super 200 Gen 4', + 475 => 'Kodak Kodacolor 200 Print Gen 4', + 476 => 'Kodak Super Gold 200 Gen 4', + 477 => 'Kodak Gold 200 Gen 4', + 478 => 'Kodak Gold III 200 Gen 4', + 479 => 'Kodak Gold Ultra 400 Gen 5', + 480 => 'Kodak Super Gold 400 Gen 5', + 481 => 'Kodak Gold 400 Gen 5', + 482 => 'Kodak Gold III 400 Gen 5', + 483 => 'Kodak Kodacolor 400 Print Gen 5', + 484 => 'Kodak Ektapress Plus 400 Prof PJB-2', + 485 => 'Kodak Ektapress Gold II 400 Prof G5', + 486 => 'Kodak Pro 400 PPF-2', + 487 => 'Kodak Ektacolor Gold II 400 EGP-4', + 488 => 'Kodak Ektacolor Gold 400 Prof EGP-4', + 489 => 'Kodak Ektapress Gold II Multspd PJM', + 490 => 'Kodak Pro 400 MC PMC', + 491 => 'Kodak Vericolor 400 Prof VPH-2', + 492 => 'Kodak Vericolor 400 Plus Prof VPH-2', + 493 => 'Kodak Unknown Neg Product Code 83', + 505 => 'Kodak Ektacolor Pro Gold 160 GPX', + 508 => 'Kodak Royal Gold 200', + 517 => 'Kodak 4050000000', + 519 => 'Kodak Gold Plus 100 Gen 5', + 520 => 'Kodak Gold 800 Gen 1', + 521 => 'Kodak Gold Super 200 Gen 5', + 522 => 'Kodak Ektapress Plus 200 Prof', + 523 => 'Kodak 4050 E6 auto-balance', + 524 => 'Kodak 4050 E6 ilum. corr.', + 525 => 'Kodak 4050 K14', + 526 => 'Kodak 4050 K14 auto-balance', + 527 => 'Kodak 4050 K14 ilum. corr.', + 528 => 'Kodak 4050 Reversal B&W', + 532 => 'Kodak Advantix 200', + 533 => 'Kodak Advantix 400', + 534 => 'Kodak Advantix 100', + 535 => 'Kodak Ektapress Multspd Prof PJM-2', + 536 => 'Kodak Kodacolor VR 200 Gen 5', + 537 => 'Kodak Funtime 200 FB Gen 2', + 538 => 'Kodak Commercial 200', + 539 => 'Kodak Royal Gold 25 Copystand', + 540 => 'Kodak Kodacolor DA 100 Gen 5', + 545 => 'Kodak Kodacolor VR 400 Gen 2', + 546 => 'Kodak Gold 100 Gen 6', + 547 => 'Kodak Gold 200 Gen 6', + 548 => 'Kodak Gold 400 Gen 6', + 549 => 'Kodak Royal Gold 100 Gen 2', + 550 => 'Kodak Royal Gold 200 Gen 2', + 551 => 'Kodak Royal Gold 400 Gen 2', + 552 => 'Kodak Gold Max 800 Gen 2', + 554 => 'Kodak 4050 E6 high contrast', + 555 => 'Kodak 4050 E6 low saturation high contrast', + 556 => 'Kodak 4050 E6 low saturation', + 557 => 'Kodak Universal E-6 Low Saturation', + 558 => 'Kodak T-Max T400 CN', + 563 => 'Kodak Ektapress PJ100', + 564 => 'Kodak Ektapress PJ400', + 565 => 'Kodak Ektapress PJ800', + 567 => 'Kodak Portra 160NC', + 568 => 'Kodak Portra 160VC', + 569 => 'Kodak Portra 400NC', + 570 => 'Kodak Portra 400VC', + 575 => 'Kodak Advantix 100-2', + 576 => 'Kodak Advantix 200-2', + 577 => 'Kodak Advantix Black & White + 400', + 578 => 'Kodak Ektapress PJ800-2', + }, + }, + 331 => { + Name => 'CopyrightStatus', + Condition => '$$self{HasSBA}', + RawConv => '$$self{CopyrightStatus} = $val', + PrintConv => { + 1 => 'Restrictions apply', + 0xff => 'Not specified', + }, + }, + 332 => { + Name => 'CopyrightFileName', + Condition => '$$self{CopyrightStatus} and $$self{CopyrightStatus} == 1', + Format => 'string[12]', + ValueConv => '$val =~ s/[ \0]+$//; $val', + }, + 1538 => { + Name => 'Orientation', + Mask => 0x03, + RawConv => '$$self{Orient} = $val', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 270 CW', + 2 => 'Rotate 180', + 3 => 'Rotate 90 CW', + }, + }, + 1538.1 => { + Name => 'ImageWidth', + Mask => 0x0c, + # 0=Base (768x512), 1=4Base (1536x1024), 2=16Base (3072x2048) + ValueConv => '($$self{Orient} & 0x01 ? 512 : 768) * ($val * 2 || 1)', + }, + 1538.2 => { + Name => 'ImageHeight', + Mask => 0x0c, + ValueConv => '($$self{Orient} & 0x01 ? 768 : 512) * ($val * 2 || 1)', + }, + 1538.3 => { + Name => 'CompressionClass', + Mask => 0x60, + PrintConv => { + 0 => 'Class 1 - 35mm film; Pictoral hard copy', + 1 => 'Class 2 - Large format film', + 2 => 'Class 3 - Text and graphics, high resolution', + 3 => 'Class 4 - Text and graphics, high dynamic range', + }, + }, + #1544 => 'InterleaveRatio', + #1545 => 'ADPCMResolution', + #1546 => { + # Name => 'ADPCMMagnificationPanning', + # Format => 'int8u[2]', + #}, + #1548 => 'ADPCMMagnificationFactor', + #1549 => { + # Name => 'ADPCMDisplayOffset', + # Format => 'int8u[2]', + #}, + #1551 => 'ADPCMTransitionDescriptor', +); + +#------------------------------------------------------------------------------ +# Extract information from a PhotoCD image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid PhotoCD file +sub ProcessPCD($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + return 0 unless $raf->Seek(2048, 0) and + $raf->Read($buff, 2048) == 2048 and + $buff =~ /^PCD_IPI/; + SetByteOrder('MM'); + $et->SetFileType(); + my %dirInfo = ( + DirName => 'PhotoCD', + DataPt => \$buff, + DataPos => 4096, + ); + my $tagTablePtr = GetTagTable('Image::ExifTool::PhotoCD::Main'); + return $et->ProcessBinaryData(\%dirInfo, $tagTablePtr); +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::PhotoCD - Read Kodak Photo CD Image Pac (PCD) metadata + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to extract +information from Kodak Photo CD Image Pac (PCD) files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://pcdtojpeg.sourceforge.net/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PhotoCD Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/PhotoMechanic.pm b/lib/Image/ExifTool/PhotoMechanic.pm new file mode 100644 index 0000000..34dc610 --- /dev/null +++ b/lib/Image/ExifTool/PhotoMechanic.pm @@ -0,0 +1,256 @@ +#------------------------------------------------------------------------------ +# File: PhotoMechanic.pm +# +# Description: Read/write Camera Bits Photo Mechanic information +# +# Revisions: 10/28/2006 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::PhotoMechanic; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::IPTC; +use Image::ExifTool::XMP; + +$VERSION = '1.06'; + +sub ProcessPhotoMechanic($$); + +# color class names +my %colorClasses = ( + 0 => '0 (None)', + 1 => '1 (Winner)', + 2 => '2 (Winner alt)', + 3 => '3 (Superior)', + 4 => '4 (Superior alt)', + 5 => '5 (Typical)', + 6 => '6 (Typical alt)', + 7 => '7 (Extras)', + 8 => '8 (Trash)', +); + +# main tag table IPTC-format records in PhotoMechanic trailer +%Image::ExifTool::PhotoMechanic::Main = ( + GROUPS => { 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::IPTC::ProcessIPTC, + WRITE_PROC => \&Image::ExifTool::IPTC::WriteIPTC, + NOTES => q{ + The Photo Mechanic trailer contains data in an IPTC-format structure, with + soft edit information stored under record number 2. + }, + 2 => { + Name => 'SoftEdit', + SubDirectory => { + TagTable => 'Image::ExifTool::PhotoMechanic::SoftEdit', + }, + }, +); + +# raw/preview crop coordinate conversions +my %rawCropConv = ( + ValueConv => '$val / 655.36', + ValueConvInv => 'int($val * 655.36 + 0.5)', + PrintConv => 'sprintf("%.3f%%",$val)', + PrintConvInv => '$val=~tr/ %//d; $val', +); + +# Record 2 -- PhotoMechanic soft edit information +%Image::ExifTool::PhotoMechanic::SoftEdit = ( + GROUPS => { 2 => 'Image' }, + WRITE_PROC => \&Image::ExifTool::IPTC::WriteIPTC, + CHECK_PROC => \&Image::ExifTool::IPTC::CheckIPTC, + WRITABLE => 1, + FORMAT => 'int32s', + 209 => { Name => 'RawCropLeft', %rawCropConv }, + 210 => { Name => 'RawCropTop', %rawCropConv }, + 211 => { Name => 'RawCropRight', %rawCropConv }, + 212 => { Name => 'RawCropBottom', %rawCropConv }, + 213 => 'ConstrainedCropWidth', + 214 => 'ConstrainedCropHeight', + 215 => 'FrameNum', + 216 => { + Name => 'Rotation', + PrintConv => { + 0 => '0', + 1 => '90', + 2 => '180', + 3 => '270', + }, + }, + 217 => 'CropLeft', + 218 => 'CropTop', + 219 => 'CropRight', + 220 => 'CropBottom', + 221 => { + Name => 'Tagged', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 222 => { + Name => 'ColorClass', + PrintConv => \%colorClasses, + }, + 223 => 'Rating', + 236 => { Name => 'PreviewCropLeft', %rawCropConv }, + 237 => { Name => 'PreviewCropTop', %rawCropConv }, + 238 => { Name => 'PreviewCropRight', %rawCropConv }, + 239 => { Name => 'PreviewCropBottom', %rawCropConv }, +); + +# PhotoMechanic XMP properties +%Image::ExifTool::PhotoMechanic::XMP = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-photomech', 2 => 'Image' }, + NAMESPACE => { photomechanic => 'http://ns.camerabits.com/photomechanic/1.0/' }, + WRITE_PROC => \&Image::ExifTool::XMP::WriteXMP, + WRITABLE => 'string', + NOTES => q{ + Below is a list of the observed PhotoMechanic XMP tags. The actual + namespace prefix is "photomechanic" but ExifTool shortens this in + the family 1 group name. + }, + ColorClass => { + Writable => 'integer', + PrintConv => \%colorClasses, + }, + CountryCode => { Avoid => 1, Groups => { 2 => 'Location' } }, + EditStatus => { }, + PMVersion => { }, + Prefs => { + Notes => 'format is "Tagged:0, ColorClass:1, Rating:2, FrameNum:3"', + PrintConv => q{ + $val =~ s[\s*(\d+):\s*(\d+):\s*(\d+):\s*(\S*)] + [Tagged:$1, ColorClass:$2, Rating:$3, FrameNum:$4]; + return $val; + }, + PrintConvInv => q{ + $val =~ s[Tagged:\s*(\d+).*ColorClass:\s*(\d+).*Rating:\s*(\d+).*FrameNum:\s*(\S*)] + [$1:$2:$3:$4]is; + return $val; + }, + }, + Tagged => { Writable => 'boolean', PrintConv => { False => 'No', True => 'Yes' } }, + TimeCreated => { + Avoid => 1, + Groups => { 2 => 'Time' }, + Shift => 'Time', + ValueConv => 'Image::ExifTool::Exif::ExifTime($val)', + ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)', + }, +); + +#------------------------------------------------------------------------------ +# Read/write PhotoMechanic information in a file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this file didn't contain PhotoMechanic information +# - updates DataPos to point to start of PhotoMechanic information +# - updates DirLen to trailer length +sub ProcessPhotoMechanic($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $offset = $$dirInfo{Offset} || 0; + my $outfile = $$dirInfo{OutFile}; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my $rtnVal = 0; + my ($buff, $footer); + + for (;;) { + # read and validate trailer footer (last 12 bytes) + last unless $raf->Seek(-12-$offset, 2) and $raf->Read($footer, 12) == 12; + last unless $footer =~ /cbipcbbl$/; + my $size = unpack('N', $footer); + + if ($size & 0x80000000 or not $raf->Seek(-$size-12, 1)) { + $et->Warn('Bad PhotoMechanic trailer'); + last; + } + unless ($raf->Read($buff, $size) == $size) { + $et->Warn('Error reading PhotoMechanic trailer'); + last; + } + $rtnVal = 1; # we read the trailer successfully + + # set variables returned in dirInfo hash + $$dirInfo{DataPos} = $raf->Tell() - $size; + $$dirInfo{DirLen} = $size + 12; + + my %dirInfo = ( + DataPt => \$buff, + DataPos => $$dirInfo{DataPos}, + DirStart => 0, + DirLen => $size, + Parent => 'PhotoMechanic', + ); + my $tagTablePtr = GetTagTable('Image::ExifTool::PhotoMechanic::Main'); + if (not $outfile) { + # extract trailer information + $et->DumpTrailer($dirInfo) if $verbose or $$et{HTML_DUMP}; + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } elsif ($$et{DEL_GROUP}{PhotoMechanic}) { + # delete the trailer + $verbose and print $out " Deleting PhotoMechanic trailer\n"; + ++$$et{CHANGED}; + } else { + # rewrite the trailer + my $newPt; + my $newBuff = $et->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $newBuff) { + $newPt = \$newBuff; # write out the modified trailer + my $pad = 0x800 - length($newBuff); + if ($pad > 0 and not $$et{OPTIONS}{Compact}{NoPadding}) { + # pad out to 2kB like PhotoMechanic does + $newBuff .= "\0" x $pad; + } + # generate new footer + $footer = pack('N', length($$newPt)) . 'cbipcbbl'; + } else { + $newPt = \$buff; # just copy existing trailer + } + # write out the trailer + Write($outfile, $$newPt, $footer) or $rtnVal = -1; + } + last; + } + return $rtnVal; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::PhotoMechanic - Read/write Photo Mechanic information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read and +write information written by the Camera Bits Photo Mechanic software. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 ACKNOWLEDGEMENTS + +Many thanks to the great support provided by Camera Bits, and in particular +for the valuable exchanges with Kirk Baker. Based on this experience, I can +say that the technical support offered by Camera Bits is second to none. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PhotoMechanic Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Photoshop.pm b/lib/Image/ExifTool/Photoshop.pm new file mode 100644 index 0000000..8efac9d --- /dev/null +++ b/lib/Image/ExifTool/Photoshop.pm @@ -0,0 +1,1174 @@ +#------------------------------------------------------------------------------ +# File: Photoshop.pm +# +# Description: Read/write Photoshop IRB meta information +# +# Revisions: 02/06/2004 - P. Harvey Created +# 02/25/2004 - P. Harvey Added hack for problem with old photoshops +# 10/04/2004 - P. Harvey Added a bunch of tags (ref Image::MetaData::JPEG) +# but left most of them commented out until I have enough +# information to write PrintConv routines for them to +# display something useful +# 07/08/2005 - P. Harvey Added support for reading PSD files +# 01/07/2006 - P. Harvey Added PSD write support +# 11/04/2006 - P. Harvey Added handling of resource name +# +# References: 1) http://www.fine-view.com/jp/lab/doc/ps6ffspecsv2.pdf +# 2) http://www.ozhiker.com/electronics/pjmt/jpeg_info/irb_jpeg_qual.html +# 3) Matt Mueller private communication (tests with PS CS2) +# 4) http://www.fileformat.info/format/psd/egff.htm +# 5) http://www.telegraphics.com.au/svn/psdparse/trunk/resources.c +# 6) http://libpsd.graphest.com/files/Photoshop%20File%20Formats.pdf +# 7) http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::Photoshop; + +use strict; +use vars qw($VERSION $AUTOLOAD $iptcDigestInfo); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.65'; + +sub ProcessPhotoshop($$$); +sub WritePhotoshop($$$); +sub ProcessLayers($$$); + +# map of where information is stored in PSD image +my %psdMap = ( + IPTC => 'Photoshop', + XMP => 'Photoshop', + EXIFInfo => 'Photoshop', + IFD0 => 'EXIFInfo', + IFD1 => 'IFD0', + ICC_Profile => 'Photoshop', + ExifIFD => 'IFD0', + GPS => 'IFD0', + SubIFD => 'IFD0', + GlobParamIFD => 'IFD0', + PrintIM => 'IFD0', + InteropIFD => 'ExifIFD', + MakerNotes => 'ExifIFD', +); + +# tag information for PhotoshopThumbnail and PhotoshopBGRThumbnail +my %thumbnailInfo = ( + Writable => 'undef', + Protected => 1, + RawConv => 'my $img=substr($val,0x1c); $self->ValidateImage(\$img,$tag)', + ValueConvInv => q{ + my $et = new Image::ExifTool; + my @tags = qw{ImageWidth ImageHeight FileType}; + my $info = $et->ImageInfo(\$val, @tags); + my ($w, $h, $type) = @$info{@tags}; + $w and $h and $type eq 'JPEG' or warn("Not a valid JPEG image\n"), return undef; + my $wbytes = int(($w * 24 + 31) / 32) * 4; + return pack('N6n2', 1, $w, $h, $wbytes, $wbytes * $h, length($val), 24, 1) . $val; + }, +); + +# tag info to decode Photoshop Unicode string +my %unicodeString = ( + ValueConv => sub { + my ($val, $et) = @_; + return '<err>' if length($val) < 4; + my $len = unpack('N', $val) * 2; + return '<err>' if length($val) < 4 + $len; + return $et->Decode(substr($val, 4, $len), 'UCS2', 'MM'); + }, + ValueConvInv => sub { + my ($val, $et) = @_; + return pack('N', length $val) . $et->Encode($val, 'UCS2', 'MM'); + }, +); + +# Photoshop APP13 tag table +# (set Unknown flag for information we don't want to display normally) +%Image::ExifTool::Photoshop::Main = ( + GROUPS => { 2 => 'Image' }, + PROCESS_PROC => \&ProcessPhotoshop, + WRITE_PROC => \&WritePhotoshop, + 0x03e8 => { Unknown => 1, Name => 'Photoshop2Info' }, + 0x03e9 => { Unknown => 1, Name => 'MacintoshPrintInfo' }, + 0x03ea => { Unknown => 1, Name => 'XMLData', Binary => 1 }, #PH + 0x03eb => { Unknown => 1, Name => 'Photoshop2ColorTable' }, + 0x03ed => { + Name => 'ResolutionInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Photoshop::Resolution', + }, + }, + 0x03ee => { + Name => 'AlphaChannelsNames', + ValueConv => 'Image::ExifTool::Photoshop::ConvertPascalString($self,$val)', + }, + 0x03ef => { Unknown => 1, Name => 'DisplayInfo' }, + 0x03f0 => { Unknown => 1, Name => 'PStringCaption' }, + 0x03f1 => { Unknown => 1, Name => 'BorderInformation' }, + 0x03f2 => { Unknown => 1, Name => 'BackgroundColor' }, + 0x03f3 => { Unknown => 1, Name => 'PrintFlags', Format => 'int8u' }, + 0x03f4 => { Unknown => 1, Name => 'BW_HalftoningInfo' }, + 0x03f5 => { Unknown => 1, Name => 'ColorHalftoningInfo' }, + 0x03f6 => { Unknown => 1, Name => 'DuotoneHalftoningInfo' }, + 0x03f7 => { Unknown => 1, Name => 'BW_TransferFunc' }, + 0x03f8 => { Unknown => 1, Name => 'ColorTransferFuncs' }, + 0x03f9 => { Unknown => 1, Name => 'DuotoneTransferFuncs' }, + 0x03fa => { Unknown => 1, Name => 'DuotoneImageInfo' }, + 0x03fb => { Unknown => 1, Name => 'EffectiveBW', Format => 'int8u' }, + 0x03fc => { Unknown => 1, Name => 'ObsoletePhotoshopTag1' }, + 0x03fd => { Unknown => 1, Name => 'EPSOptions' }, + 0x03fe => { Unknown => 1, Name => 'QuickMaskInfo' }, + 0x03ff => { Unknown => 1, Name => 'ObsoletePhotoshopTag2' }, + 0x0400 => { Unknown => 1, Name => 'TargetLayerID', Format => 'int16u' }, # (LayerStateInfo) + 0x0401 => { Unknown => 1, Name => 'WorkingPath' }, + 0x0402 => { Unknown => 1, Name => 'LayersGroupInfo', Format => 'int16u' }, + 0x0403 => { Unknown => 1, Name => 'ObsoletePhotoshopTag3' }, + 0x0404 => { + Name => 'IPTCData', + SubDirectory => { + DirName => 'IPTC', + TagTable => 'Image::ExifTool::IPTC::Main', + }, + }, + 0x0405 => { Unknown => 1, Name => 'RawImageMode' }, + 0x0406 => { #2 + Name => 'JPEG_Quality', + SubDirectory => { + TagTable => 'Image::ExifTool::Photoshop::JPEG_Quality', + }, + }, + 0x0408 => { Unknown => 1, Name => 'GridGuidesInfo' }, + 0x0409 => { + Name => 'PhotoshopBGRThumbnail', + Notes => 'this is a JPEG image, but in BGR format instead of RGB', + %thumbnailInfo, + Groups => { 2 => 'Preview' }, + }, + 0x040a => { + Name => 'CopyrightFlag', + Writable => 'int8u', + Groups => { 2 => 'Author' }, + ValueConv => 'join(" ",unpack("C*", $val))', + ValueConvInv => 'pack("C*",split(" ",$val))', + PrintConv => { #3 + 0 => 'False', + 1 => 'True', + }, + }, + 0x040b => { + Name => 'URL', + Writable => 'string', + Groups => { 2 => 'Author' }, + }, + 0x040c => { + Name => 'PhotoshopThumbnail', + %thumbnailInfo, + Groups => { 2 => 'Preview' }, + }, + 0x040d => { + Name => 'GlobalAngle', + Writable => 'int32u', + ValueConv => 'unpack("N",$val)', + ValueConvInv => 'pack("N",$val)', + }, + 0x040e => { Unknown => 1, Name => 'ColorSamplersResource' }, + 0x040f => { + Name => 'ICC_Profile', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + }, + }, + 0x0410 => { Unknown => 1, Name => 'Watermark', Format => 'int8u' }, + 0x0411 => { Unknown => 1, Name => 'ICC_Untagged', Format => 'int8u' }, + 0x0412 => { Unknown => 1, Name => 'EffectsVisible', Format => 'int8u' }, + 0x0413 => { Unknown => 1, Name => 'SpotHalftone' }, + 0x0414 => { Unknown => 1, Name => 'IDsBaseValue', Description => 'IDs Base Value', Format => 'int32u' }, + 0x0415 => { Unknown => 1, Name => 'UnicodeAlphaNames' }, + 0x0416 => { Unknown => 1, Name => 'IndexedColorTableCount', Format => 'int16u' }, + 0x0417 => { Unknown => 1, Name => 'TransparentIndex', Format => 'int16u' }, + 0x0419 => { + Name => 'GlobalAltitude', + Writable => 'int32u', + ValueConv => 'unpack("N",$val)', + ValueConvInv => 'pack("N",$val)', + }, + 0x041a => { + Name => 'SliceInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::SliceInfo' }, + }, + 0x041b => { Name => 'WorkflowURL', %unicodeString }, + 0x041c => { Unknown => 1, Name => 'JumpToXPEP' }, + 0x041d => { Unknown => 1, Name => 'AlphaIdentifiers' }, + 0x041e => { + Name => 'URL_List', + List => 1, + Writable => 1, + ValueConv => sub { + my ($val, $et) = @_; + return '<err>' if length($val) < 4; + my $num = unpack('N', $val); + my ($i, @vals); + my $pos = 4; + for ($i=0; $i<$num; ++$i) { + $pos += 8; # (skip word and ID) + last if length($val) < $pos + 4; + my $len = unpack("x${pos}N", $val) * 2; + last if length($val) < $pos + 4 + $len; + push @vals, $et->Decode(substr($val,$pos+4,$len), 'UCS2', 'MM'); + $pos += 4 + $len; + } + return \@vals; + }, + # (this is tricky to make writable) + }, + 0x0421 => { + Name => 'VersionInfo', + SubDirectory => { + TagTable => 'Image::ExifTool::Photoshop::VersionInfo', + }, + }, + 0x0422 => { + Name => 'EXIFInfo', #PH (Found in EPS and PSD files) + SubDirectory => { + TagTable=> 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + WriteProc => \&Image::ExifTool::WriteTIFF, + }, + }, + 0x0423 => { Unknown => 1, Name => 'ExifInfo2', Binary => 1 }, #5 + 0x0424 => { + Name => 'XMP', + SubDirectory => { + TagTable => 'Image::ExifTool::XMP::Main', + }, + }, + 0x0425 => { + Name => 'IPTCDigest', + Writable => 'string', + Protected => 1, + Notes => q{ + this tag indicates provides a way for XMP-aware applications to indicate + that the XMP is synchronized with the IPTC. The MWG recommendation is to + ignore the XMP if IPTCDigest exists and doesn't match the CurrentIPTCDigest. + When writing, special values of "new" and "old" represent the digests of the + IPTC from the edited and original files respectively, and are undefined if + the IPTC does not exist in the respective file. Set this to "new" as an + indication that the XMP is synchronized with the IPTC + }, + # also note the 'new' feature requires that the IPTC comes before this tag is written + ValueConv => 'unpack("H*", $val)', + ValueConvInv => q{ + if (lc($val) eq 'new' or lc($val) eq 'old') { + { + local $SIG{'__WARN__'} = sub { }; + return lc($val) if eval { require Digest::MD5 }; + } + warn "Digest::MD5 must be installed\n"; + return undef; + } + return pack('H*', $val) if $val =~ /^[0-9a-f]{32}$/i; + warn "Value must be 'new', 'old' or 32 hexadecimal digits\n"; + return undef; + } + }, + 0x0426 => { + Name => 'PrintScaleInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::PrintScaleInfo' }, + }, + 0x0428 => { + Name => 'PixelInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::PixelInfo' }, + }, + 0x0429 => { Unknown => 1, Name => 'LayerComps' }, #5 + 0x042a => { Unknown => 1, Name => 'AlternateDuotoneColors' }, #5 + 0x042b => { Unknown => 1, Name => 'AlternateSpotColors' }, #5 + 0x042d => { #7 + Name => 'LayerSelectionIDs', + Description => 'Layer Selection IDs', + Unknown => 1, + ValueConv => q{ + my ($n, @a) = unpack("nN*",$val); + $#a = $n - 1 if $n > @a; + return join(' ', @a); + }, + }, + 0x042e => { Unknown => 1, Name => 'HDRToningInfo' }, #7 + 0x042f => { Unknown => 1, Name => 'PrintInfo' }, #7 + 0x0430 => { Unknown => 1, Name => 'LayerGroupsEnabledID', Format => 'int8u' }, #7 + 0x0431 => { Unknown => 1, Name => 'ColorSamplersResource2' }, #7 + 0x0432 => { Unknown => 1, Name => 'MeasurementScale' }, #7 + 0x0433 => { Unknown => 1, Name => 'TimelineInfo' }, #7 + 0x0434 => { Unknown => 1, Name => 'SheetDisclosure' }, #7 + 0x0435 => { Unknown => 1, Name => 'DisplayInfo' }, #7 + 0x0436 => { Unknown => 1, Name => 'OnionSkins' }, #7 + 0x0438 => { Unknown => 1, Name => 'CountInfo' }, #7 + 0x043a => { Unknown => 1, Name => 'PrintInfo2' }, #7 + 0x043b => { Unknown => 1, Name => 'PrintStyle' }, #7 + 0x043c => { Unknown => 1, Name => 'MacintoshNSPrintInfo' }, #7 + 0x043d => { Unknown => 1, Name => 'WindowsDEVMODE' }, #7 + 0x043e => { Unknown => 1, Name => 'AutoSaveFilePath' }, #7 + 0x043f => { Unknown => 1, Name => 'AutoSaveFormat' }, #7 + 0x0440 => { Unknown => 1, Name => 'PathSelectionState' }, #7 + # 0x07d0-0x0bb6 Path information + 0x0bb7 => { + Name => 'ClippingPathName', + # convert from a Pascal string (ignoring 6 bytes of unknown data after string) + ValueConv => q{ + my $len = ord($val); + $val = substr($val, 0, $len+1) if $len < length($val); + return Image::ExifTool::Photoshop::ConvertPascalString($self,$val); + }, + }, + 0x0bb8 => { Unknown => 1, Name => 'OriginPathInfo' }, #7 + # 0x0fa0-0x1387 - plug-in resources (ref 7) + 0x1b58 => { Unknown => 1, Name => 'ImageReadyVariables' }, #7 + 0x1b59 => { Unknown => 1, Name => 'ImageReadyDataSets' }, #7 + 0x1f40 => { Unknown => 1, Name => 'LightroomWorkflow' }, #7 + 0x2710 => { Unknown => 1, Name => 'PrintFlagsInfo' }, +); + +# Photoshop JPEG quality record (ref 2) +%Image::ExifTool::Photoshop::JPEG_Quality = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int16s', + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'PhotoshopQuality', + Writable => 1, + PrintConv => '$val + 4', + PrintConvInv => '$val - 4', + }, + 1 => { + Name => 'PhotoshopFormat', + PrintConv => { + 0x0000 => 'Standard', + 0x0001 => 'Optimized', + 0x0101 => 'Progressive', + }, + }, + 2 => { + Name => 'ProgressiveScans', + PrintConv => { + 1 => '3 Scans', + 2 => '4 Scans', + 3 => '5 Scans', + }, + }, +); + +# Photoshop Slices +%Image::ExifTool::Photoshop::SliceInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + 20 => { Name => 'SlicesGroupName', Format => 'var_ustr32' }, + 24 => { Name => 'NumSlices', Format => 'int32u' }, +); + +# Photoshop resolution information #PH +%Image::ExifTool::Photoshop::Resolution = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + WRITABLE => 1, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'XResolution', + Format => 'int32u', + Priority => 0, + ValueConv => '$val / 0x10000', + ValueConvInv => 'int($val * 0x10000 + 0.5)', + PrintConv => 'int($val * 100 + 0.5) / 100', + PrintConvInv => '$val', + }, + 2 => { + Name => 'DisplayedUnitsX', + PrintConv => { + 1 => 'inches', + 2 => 'cm', + }, + }, + 4 => { + Name => 'YResolution', + Format => 'int32u', + Priority => 0, + ValueConv => '$val / 0x10000', + ValueConvInv => 'int($val * 0x10000 + 0.5)', + PrintConv => 'int($val * 100 + 0.5) / 100', + PrintConvInv => '$val', + }, + 6 => { + Name => 'DisplayedUnitsY', + PrintConv => { + 1 => 'inches', + 2 => 'cm', + }, + }, +); + +# Photoshop version information +%Image::ExifTool::Photoshop::VersionInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FIRST_ENTRY => 0, + GROUPS => { 2 => 'Image' }, + # (always 1) 0 => { Name => 'PhotoshopVersion', Format => 'int32u' }, + 4 => { Name => 'HasRealMergedData', Format => 'int8u', PrintConv => { 0 => 'No', 1 => 'Yes' } }, + 5 => { Name => 'WriterName', Format => 'var_ustr32' }, + 9 => { Name => 'ReaderName', Format => 'var_ustr32' }, + # (always 1) 13 => { Name => 'FileVersion', Format => 'int32u' }, +); + +# Print Scale +%Image::ExifTool::Photoshop::PrintScaleInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FIRST_ENTRY => 0, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'PrintStyle', + Format => 'int16u', + PrintConv => { + 0 => 'Centered', + 1 => 'Size to Fit', + 2 => 'User Defined', + }, + }, + 2 => { Name => 'PrintPosition', Format => 'float[2]' }, + 10 => { Name => 'PrintScale', Format => 'float' }, +); + +# Pixel Aspect Ratio +%Image::ExifTool::Photoshop::PixelInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FIRST_ENTRY => 0, + GROUPS => { 2 => 'Image' }, + # 0 - version + 4 => { Name => 'PixelAspectRatio', Format => 'double' }, +); + +# Photoshop PSD file header +%Image::ExifTool::Photoshop::Header = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int16u', + GROUPS => { 2 => 'Image' }, + NOTES => 'This information is found in the PSD file header.', + 6 => 'NumChannels', + 7 => { Name => 'ImageHeight', Format => 'int32u' }, + 9 => { Name => 'ImageWidth', Format => 'int32u' }, + 11 => 'BitDepth', + 12 => { + Name => 'ColorMode', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Bitmap', + 1 => 'Grayscale', + 2 => 'Indexed', + 3 => 'RGB', + 4 => 'CMYK', + 7 => 'Multichannel', + 8 => 'Duotone', + 9 => 'Lab', + }, + }, +); + +# Layer information +%Image::ExifTool::Photoshop::Layers = ( + PROCESS_PROC => \&ProcessLayers, + GROUPS => { 2 => 'Image' }, + NOTES => 'Tags extracted from Photoshop layer information.', + # tags extracted from layer information + # (tag ID's are for convenience only) + _xcnt => { Name => 'LayerCount', Format => 'int16u' }, + _xrct => { + Name => 'LayerRectangles', + Format => 'int32u', + Count => 4, + List => 1, + Notes => 'top left bottom right', + }, + _xnam => { Name => 'LayerNames', + Format => 'string', + List => 1, + ValueConv => q{ + my $charset = $self->Options('CharsetPhotoshop') || 'Latin'; + return $self->Decode($val, $charset); + }, + }, + _xbnd => { + Name => 'LayerBlendModes', + Format => 'undef', + List => 1, + RawConv => 'GetByteOrder() eq "II" ? pack "N*", unpack "V*", $val : $val', + PrintConv => { + pass => 'Pass Through', + norm => 'Normal', + diss => 'Dissolve', + dark => 'Darken', + 'mul '=> 'Multiply', + idiv => 'Color Burn', + lbrn => 'Linear Burn', + dkCl => 'Darker Color', + lite => 'Lighten', + scrn => 'Screen', + 'div '=> 'Color Dodge', + lddg => 'Linear Dodge', + lgCl => 'Lighter Color', + over => 'Overlay', + sLit => 'Soft Light', + hLit => 'Hard Light', + vLit => 'Vivid Light', + lLit => 'Linear Light', + pLit => 'Pin Light', + hMix => 'Hard Mix', + diff => 'Difference', + smud => 'Exclusion', + fsub => 'Subtract', + fdiv => 'Divide', + 'hue '=> 'Hue', + 'sat '=> 'Saturation', + colr => 'Color', + 'lum '=> 'Luminosity', + }, + }, + _xopc => { + Name => 'LayerOpacities', + Format => 'int8u', + List => 1, + ValueConv => '100 * $val / 255', + PrintConv => 'sprintf("%d%%",$val)', + }, + # tags extracted from additional layer information (tag ID's are real) + # - must be able to accommodate a blank entry to preserve the list ordering + luni => { + Name => 'LayerUnicodeNames', + List => 1, + RawConv => q{ + return '' if length($val) < 4; + my $len = Get32u(\$val, 0); + return $self->Decode(substr($val, 4, $len * 2), 'UCS2'); + }, + }, + lyid => { + Name => 'LayerIDs', + Description => 'Layer IDs', + Format => 'int32u', + List => 1, + Unknown => 1, + }, + shmd => { # layer metadata (undocumented structure) + # (for now, only extract layerTime. May also contain "layerXMP" -- + # it would be nice to decode this but I need a sample) + Name => 'LayerModifyDates', + Groups => { 2 => 'Time' }, + List => 1, + RawConv => q{ + return '' unless $val =~ /layerTime(doub|buod)(.{8})/s; + my $tmp = $2; + return GetDouble(\$tmp, 0); + }, + ValueConv => 'length $val ? ConvertUnixTime($val,1) : ""', + PrintConv => 'length $val ? $self->ConvertDateTime($val) : ""', + }, +); + +# tags extracted from ImageSourceData found in TIFF images (ref PH) +%Image::ExifTool::Photoshop::DocumentData = ( + PROCESS_PROC => \&ProcessDocumentData, + GROUPS => { 2 => 'Image' }, + Layr => { + Name => 'Layers', + SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Layers' }, + }, + Lr16 => { # (NC) + Name => 'Layers', + SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Layers' }, + }, +); + +# image data +%Image::ExifTool::Photoshop::ImageData = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + 0 => { + Name => 'Compression', + Format => 'int16u', + PrintConv => { + 0 => 'Uncompressed', + 1 => 'RLE', + 2 => 'ZIP without prediction', + 3 => 'ZIP with prediction', + }, + }, +); + +# tags for unknown resource types +%Image::ExifTool::Photoshop::Unknown = ( + GROUPS => { 2 => 'Unknown' }, +); + +# define reference to IPTCDigest tagInfo hash for convenience +$iptcDigestInfo = $Image::ExifTool::Photoshop::Main{0x0425}; + + +#------------------------------------------------------------------------------ +# AutoLoad our writer routines when necessary +# +sub AUTOLOAD +{ + return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_); +} + +#------------------------------------------------------------------------------ +# Convert pascal string(s) to something we can use +# Inputs: 1) Pascal string data +# Returns: Strings, concatenated with ', ' +sub ConvertPascalString($$) +{ + my ($et, $inStr) = @_; + my $outStr = ''; + my $len = length($inStr); + my $i=0; + while ($i < $len) { + my $n = ord(substr($inStr, $i, 1)); + last if $i + $n >= $len; + $i and $outStr .= ', '; + $outStr .= substr($inStr, $i+1, $n); + $i += $n + 1; + } + my $charset = $et->Options('CharsetPhotoshop') || 'Latin'; + return $et->Decode($outStr, $charset); +} + +#------------------------------------------------------------------------------ +# Process Photoshop layers and mask information section of PSD/PSB file +# Inputs: 0) ExifTool ref, 1) DirInfo ref, 2) tag table ref +# Returns: 1 on success (and seeks to the end of this section) +sub ProcessLayersAndMask($$$) +{ + local $_; + my ($et, $dirInfo, $tagTablePtr) = @_; + my $raf = $$dirInfo{RAF}; + my $fileType = $$et{VALUE}{FileType}; + my $data; + + return 0 unless $fileType eq 'PSD' or $fileType eq 'PSB'; # (no layer section in CS1 files) + + # (some words are 4 bytes in PSD files and 8 bytes in PSB) + my ($psb, $psiz) = $fileType eq 'PSB' ? (1, 8) : (undef, 4); + + # read the layer information header + my $n = $psiz * 2 + 2; + $raf->Read($data, $n) == $n or return 0; + my $tot = $psb ? Get64u(\$data, 0) : Get32u(\$data, 0); # length of layer and mask info + return 1 if $tot == 0; + my $end = $raf->Tell() - $psiz - 2 + $tot; + $data = substr $data, $psiz; + my $len = $psb ? Get64u(\$data, 0) : Get32u(\$data, 0); # length of layer info section + my $num = Get16s(\$data, $psiz); + # check for Lr16 block if layers length is 0 (ref https://forums.adobe.com/thread/1540914) + if ($len == 0 and $num == 0) { + $raf->Read($data,10) == 10 or return 0; + if ($data =~ /^..8BIMLr16/s) { + $raf->Read($data, $psiz+2) == $psiz+2 or return 0; + $len = $psb ? Get64u(\$data, 0) : Get32u(\$data, 0); + } elsif ($data =~ /^..8BIMMt16/s) { # (have seen Mt16 before Lr16, ref PH) + $raf->Read($data, $psiz) == $psiz or return 0; + $raf->Read($data, 8) == 8 or return 0; + if ($data eq '8BIMLr16') { + $raf->Read($data, $psiz+2) == $psiz+2 or return 0; + $len = $psb ? Get64u(\$data, 0) : Get32u(\$data, 0); + } else { + $raf->Seek(-18-$psiz, 1) or return 0; + } + } else { + $raf->Seek(-10, 1) or return 0; + } + } + $len += 2; # include layer count with layer info section + $raf->Seek(-2, 1) or return 0; + my %dinfo = ( + RAF => $raf, + DirLen => $len, + ); + $$et{IsPSB} = $psb; # set PSB flag + ProcessLayers($et, \%dinfo, $tagTablePtr); + + # seek to the end of this section and return success flag + return $raf->Seek($end, 0) ? 1 : 0; +} + +#------------------------------------------------------------------------------ +# Process Photoshop layers (beginning with layer count) +# Inputs: 0) ExifTool ref, 1) DirInfo ref, 2) tag table ref +# Returns: 1 on success +# Notes: Uses ExifTool IsPSB member to determine whether file is PSB format +sub ProcessLayers($$$) +{ + local $_; + my ($et, $dirInfo, $tagTablePtr) = @_; + my ($i, $n, %count, $buff, $buf2); + my $raf = $$dirInfo{RAF}; + my $dirLen = $$dirInfo{DirLen}; + my $verbose = $$et{OPTIONS}{Verbose}; + my %dinfo = ( DataPt => \$buff, Base => $raf->Tell() ); + my $pos = 0; + return 0 if $dirLen < 2; + $raf->Read($buff, 2) == 2 or return 0; + my $num = Get16s(\$buff, 0); + $num = -$num if $num < 0; # (first channel is transparency data if negative) + $et->VerboseDir('Layers', $num, $dirLen); + $et->HandleTag($tagTablePtr, '_xcnt', $num, Start => $pos, Size => 2, %dinfo); # LayerCount + my $oldIndent = $$et{INDENT}; + $$et{INDENT} .= '| '; + + $pos += 2; + my $psb = $$et{IsPSB}; # is PSB format? + my $psiz = $psb ? 8 : 4; + for ($i=0; $i<$num; ++$i) { + $et->VPrint(0, $oldIndent.'+ [Layer '.($i+1)." of $num]\n"); + last if $pos + 18 > $dirLen; + $raf->Read($buff, 18) == 18 or last; + $dinfo{DataPos} = $pos; + # save the layer rectangle + $et->HandleTag($tagTablePtr, '_xrct', undef, Start => 0, Size => 16, %dinfo); + my $numChannels = Get16u(\$buff, 16); + $n = (2 + $psiz) * $numChannels; # size of channel information + $raf->Seek($n, 1) or last; + $pos += 18 + $n; + last if $pos + 20 > $dirLen; + $raf->Read($buff, 20) == 20 or last; + $dinfo{DataPos} = $pos; + my $sig = substr($buff, 0, 4); + $sig =~ /^(8BIM|MIB8)$/ or last; # verify signature + $et->HandleTag($tagTablePtr, '_xbnd', undef, Start => 4, Size => 4, %dinfo); + $et->HandleTag($tagTablePtr, '_xopc', undef, Start => 8, Size => 1, %dinfo); + my $nxt = $pos + 16 + Get32u(\$buff, 12); + $n = Get32u(\$buff, 16); # get size of layer mask data + $pos += 20 + $n; # skip layer mask data + last if $pos + 4 > $dirLen; + $raf->Seek($n, 1) and $raf->Read($buff, 4) == 4 or last; + $n = Get32u(\$buff, 0); # get size of layer blending ranges + $pos += 4 + $n; # skip layer blending ranges data + last if $pos + 1 > $dirLen; + $raf->Seek($n, 1) and $raf->Read($buff, 1) == 1 or last; + $n = Get8u(\$buff, 0); # get length of layer name + last if $pos + 1 + $n > $dirLen; + $raf->Read($buff, $n) == $n or last; + $dinfo{DataPos} = $pos + 1; + $et->HandleTag($tagTablePtr, '_xnam', undef, Start => 0, Size => $n, %dinfo); + my $frag = ($n + 1) & 0x3; + $raf->Seek(4 - $frag, 1) or last if $frag; + $n = ($n + 4) & 0xfffffffc; # +1 for length byte then pad to multiple of 4 bytes + $pos += $n; + # process additional layer info + while ($pos + 12 <= $nxt) { + $raf->Read($buff, 12) == 12 or last; + my $dat = substr($buff, 0, 8); + $dat = pack 'N*', unpack 'V*', $dat if GetByteOrder() eq 'II'; + my $sig = substr($dat, 0, 4); + last unless $sig eq '8BIM' or $sig eq '8B64'; # verify signature + my $tag = substr($dat, 4, 4); + # (some structures have an 8-byte size word [augh!] + # --> it would be great if '8B64' indicated a 64-bit version, and this may well + # be the case, but it is not mentioned in the Photoshop file format specification) + if ($psb and $tag =~ /^(LMsk|Lr16|Lr32|Layr|Mt16|Mt32|Mtrn|Alph|FMsk|lnk2|FEid|FXid|PxSD)$/) { + last if $pos + 16 > $nxt; + $raf->Read($buf2, 4) == 4 or last; + $buff .= $buf2; + $n = Get64u(\$buff, 8); + $pos += 4; + } else { + $n = Get32u(\$buff, 8); + } + $pos += 12; + last if $pos + $n > $nxt; + $frag = $n & 0x3; + if ($$tagTablePtr{$tag} or $verbose) { + # pad with empty entries if necessary to keep the same index for each item in the layer + $count{$tag} = 0 unless defined $count{$tag}; + $raf->Read($buff, $n) == $n or last; + $dinfo{DataPos} = $pos; + while ($count{$tag} < $i) { + $et->HandleTag($tagTablePtr, $tag, ''); + ++$count{$tag}; + } + $et->HandleTag($tagTablePtr, $tag, undef, Start => 0, Size => $n, %dinfo); + ++$count{$tag}; + if ($frag) { + $raf->Seek(4 - $frag, 1) or last; + $n += 4 - $frag; # pad to multiple of 4 bytes (PH NC) + } + } else { + $n += 4 - $frag if $frag; + $raf->Seek($n, 1) or last; + } + $pos += $n; # step to start of next structure + } + $pos = $nxt; + } + $$et{INDENT} = $oldIndent; + return 1; +} + +#------------------------------------------------------------------------------ +# Process Photoshop ImageSourceData +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessDocumentData($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $verbose = $$et{OPTIONS}{Verbose}; + my $raf = $$dirInfo{RAF}; + my $dirLen = $$dirInfo{DirLen}; + my $pos = 36; # length of header + my ($buff, $n, $err); + + $et->VerboseDir('Photoshop Document Data', undef, $dirLen); + unless ($raf) { + my $dataPt = $$dirInfo{DataPt}; + my $start = $$dirInfo{DirStart} || 0; + $raf = new File::RandomAccess($dataPt); + $raf->Seek($start, 0) if $start; + $dirLen = length $$dataPt - $start unless defined $dirLen; + $et->VerboseDump($dataPt, Start => $start, Len => $dirLen, Base => $$dirInfo{Base}); + } + unless ($raf->Read($buff, $pos) == $pos and + $buff =~ /^Adobe Photoshop Document Data (Block|V0002)\0/) + { + $et->Warn('Invalid Photoshop Document Data'); + return 0; + } + my $psb = ($1 eq 'V0002'); + my %dinfo = ( DataPt => \$buff ); + $$et{IsPSB} = $psb; # set PSB flag (needed when handling Layers directory) + while ($pos + 12 <= $dirLen) { + $raf->Read($buff, 8) == 8 or $err = 'Error reading document data', last; + # set byte order according to byte order of first signature + SetByteOrder($buff =~ /^(8BIM|8B64)/ ? 'MM' : 'II') if $pos == 36; + $buff = pack 'N*', unpack 'V*', $buff if GetByteOrder() eq 'II'; + my $sig = substr($buff, 0, 4); + $sig eq '8BIM' or $sig eq '8B64' or $err = 'Bad photoshop resource', last; # verify signature + my $tag = substr($buff, 4, 4); + if ($psb and $tag =~ /^(LMsk|Lr16|Lr32|Layr|Mt16|Mt32|Mtrn|Alph|FMsk|lnk2|FEid|FXid|PxSD)$/) { + $pos + 16 > $dirLen and $err = 'Short PSB resource', last; + $raf->Read($buff, 8) == 8 or $err = 'Error reading PSB resource', last; + $n = Get64u(\$buff, 0); + $pos += 4; + } else { + $raf->Read($buff, 4) == 4 or $err = 'Error reading PSD resource', last; + $n = Get32u(\$buff, 0); + } + $pos += 12; + $pos + $n > $dirLen and $err = 'Truncated photoshop resource', last; + my $pad = (4 - ($n & 3)) & 3; # number of padding bytes + my $tagInfo = $$tagTablePtr{$tag}; + if ($tagInfo or $verbose) { + if ($tagInfo and $$tagInfo{SubDirectory}) { + my $fpos = $raf->Tell() + $n + $pad; + my $subTable = GetTagTable($$tagInfo{SubDirectory}{TagTable}); + $et->ProcessDirectory({ RAF => $raf, DirLen => $n }, $subTable); + $raf->Seek($fpos, 0) or $err = 'Seek error', last; + } else { + $dinfo{DataPos} = $raf->Tell(); + $dinfo{Start} = 0; + $dinfo{Size} = $n; + $raf->Read($buff, $n) == $n or $err = 'Error reading photoshop resource', last; + $et->HandleTag($tagTablePtr, $tag, undef, %dinfo); + $raf->Seek($pad, 1) or $err = 'Seek error', last; + } + } else { + $raf->Seek($n + $pad, 1) or $err = 'Seek error', last; + } + $pos += $n + $pad; # step to start of next structure + } + $err and $et->Warn($err); + return 1; +} + +#------------------------------------------------------------------------------ +# Process Photoshop APP13 record +# Inputs: 0) ExifTool object reference, 1) Reference to directory information +# 2) Tag table reference +# Returns: 1 on success +sub ProcessPhotoshop($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $dirEnd = $pos + $$dirInfo{DirLen}; + my $verbose = $et->Options('Verbose'); + my $success = 0; + + # ignore non-standard XMP while in strict MWG compatibility mode + if (($Image::ExifTool::MWG::strict or $et->Options('Validate')) and + $$et{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/) + { + my $path = $et->MetadataPath(); + unless ($path =~ /^(JPEG-APP13-Photoshop|TIFF-IFD0-Photoshop|PSD)$/) { + if ($Image::ExifTool::MWG::strict) { + $et->Warn("Ignored non-standard Photoshop at $path"); + return 1; + } else { + $et->Warn("Non-standard Photoshop at $path", 1); + } + } + } + if ($$et{FILE_TYPE} eq 'JPEG' and $$dirInfo{Parent} ne 'APP13') { + $$et{LOW_PRIORITY_DIR}{'*'} = 1; # lower priority of all these tags + } + SetByteOrder('MM'); # Photoshop is always big-endian + $verbose and $et->VerboseDir('Photoshop', 0, $$dirInfo{DirLen}); + + # scan through resource blocks: + # Format: 0) Type, 4 bytes - '8BIM' (or the rare 'PHUT', 'DCSR', 'AgHg' or 'MeSa') + # 1) TagID,2 bytes + # 2) Name, pascal string padded to even no. bytes + # 3) Size, 4 bytes - N + # 4) Data, N bytes + while ($pos + 8 < $dirEnd) { + my $type = substr($$dataPt, $pos, 4); + my ($ttPtr, $extra, $val, $name); + if ($type eq '8BIM') { + $ttPtr = $tagTablePtr; + } elsif ($type =~ /^(PHUT|DCSR|AgHg|MeSa)$/) { # (PHUT~ImageReady, MeSa~PhotoDeluxe) + $ttPtr = GetTagTable('Image::ExifTool::Photoshop::Unknown'); + } else { + $type =~ s/([^\w])/sprintf("\\x%.2x",ord($1))/ge; + $et->Warn(qq{Bad Photoshop IRB resource "$type"}); + last; + } + my $tag = Get16u($dataPt, $pos + 4); + $pos += 6; # point to start of name + my $nameLen = Get8u($dataPt, $pos); + my $namePos = ++$pos; + # skip resource block name (pascal string, padded to an even # of bytes) + $pos += $nameLen; + ++$pos unless $nameLen & 0x01; + if ($pos + 4 > $dirEnd) { + $et->Warn("Bad Photoshop resource block"); + last; + } + my $size = Get32u($dataPt, $pos); + $pos += 4; + if ($size + $pos > $dirEnd) { + $et->Warn("Bad Photoshop resource data size $size"); + last; + } + $success = 1; + if ($nameLen) { + $name = substr($$dataPt, $namePos, $nameLen); + $extra = qq{, Name="$name"}; + } else { + $name = ''; + } + my $tagInfo = $et->GetTagInfo($ttPtr, $tag); + # append resource name to value if requested (braced by "/#...#/") + if ($tagInfo and defined $$tagInfo{SetResourceName} and + $$tagInfo{SetResourceName} eq '1' and $name !~ m{/#}) + { + $val = substr($$dataPt, $pos, $size) . '/#' . $name . '#/'; + } + $et->HandleTag($ttPtr, $tag, $val, + TagInfo => $tagInfo, + Extra => $extra, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + Size => $size, + Start => $pos, + Base => $$dirInfo{Base}, + Parent => $$dirInfo{DirName}, + ); + $size += 1 if $size & 0x01; # size is padded to an even # bytes + $pos += $size; + } + # warn about incorrect IPTCDigest + if ($$et{VALUE}{IPTCDigest} and $$et{VALUE}{CurrentIPTCDigest} and + $$et{VALUE}{IPTCDigest} ne $$et{VALUE}{CurrentIPTCDigest}) + { + $et->WarnOnce('IPTCDigest is not current. XMP may be out of sync'); + } + delete $$et{LOW_PRIORITY_DIR}{'*'}; + return $success; +} + +#------------------------------------------------------------------------------ +# extract information from Photoshop PSD file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 if this was a valid PSD file, -1 on write error +sub ProcessPSD($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $outfile = $$dirInfo{OutFile}; + my ($data, $err, $tagTablePtr); + + $raf->Read($data, 30) == 30 or return 0; + $data =~ /^8BPS\0([\x01\x02])/ or return 0; + SetByteOrder('MM'); + $et->SetFileType($1 eq "\x01" ? 'PSD' : 'PSB'); # set the FileType tag + my %dirInfo = ( + DataPt => \$data, + DirStart => 0, + DirName => 'Photoshop', + ); + my $len = Get32u(\$data, 26); + if ($outfile) { + Write($outfile, $data) or $err = 1; + $raf->Read($data, $len) == $len or return -1; + Write($outfile, $data) or $err = 1; # write color mode data + # initialize map of where things are written + $et->InitWriteDirs(\%psdMap); + } else { + # process the header + $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Header'); + $dirInfo{DirLen} = 30; + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + $raf->Seek($len, 1) or $err = 1; # skip over color mode data + } + # read image resource section + $raf->Read($data, 4) == 4 or $err = 1; + $len = Get32u(\$data, 0); + $raf->Read($data, $len) == $len or $err = 1; + $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Main'); + $dirInfo{DirLen} = $len; + my $rtnVal = 1; + if ($outfile) { + # rewrite IRB resources + $data = WritePhotoshop($et, \%dirInfo, $tagTablePtr); + if ($data) { + $len = Set32u(length $data); + Write($outfile, $len, $data) or $err = 1; + # look for trailer and edit if necessary + my $trailInfo = Image::ExifTool::IdentifyTrailer($raf); + if ($trailInfo) { + my $tbuf = ''; + $$trailInfo{OutFile} = \$tbuf; # rewrite trailer(s) + # rewrite all trailers to buffer + if ($et->ProcessTrailers($trailInfo)) { + my $copyBytes = $$trailInfo{DataPos} - $raf->Tell(); + if ($copyBytes >= 0) { + # copy remaining PSD file up to start of trailer + while ($copyBytes) { + my $n = ($copyBytes > 65536) ? 65536 : $copyBytes; + $raf->Read($data, $n) == $n or $err = 1; + Write($outfile, $data) or $err = 1; + $copyBytes -= $n; + } + # write the trailer (or not) + $et->WriteTrailerBuffer($trailInfo, $outfile) or $err = 1; + } else { + $et->Warn('Overlapping trailer'); + undef $trailInfo; + } + } else { + undef $trailInfo; + } + } + unless ($trailInfo) { + # copy over the rest of the file + while ($raf->Read($data, 65536)) { + Write($outfile, $data) or $err = 1; + } + } + } else { + $err = 1; + } + $rtnVal = -1 if $err; + } elsif ($err) { + $et->Warn('File format error'); + } else { + # read IRB resources + ProcessPhotoshop($et, \%dirInfo, $tagTablePtr); + # read layer and mask information section + $dirInfo{RAF} = $raf; + $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Layers'); + my $oldIndent = $$et{INDENT}; + $$et{INDENT} .= '| '; + if (ProcessLayersAndMask($et, \%dirInfo, $tagTablePtr) and + # read compression mode from image data section + $raf->Read($data,2) == 2) + { + my %dirInfo = ( + DataPt => \$data, + DataPos => $raf->Tell() - 2, + ); + $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::ImageData'); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + $$et{INDENT} = $oldIndent; + # process trailers if they exist + my $trailInfo = Image::ExifTool::IdentifyTrailer($raf); + $et->ProcessTrailers($trailInfo) if $trailInfo; + } + return $rtnVal; +} + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::Photoshop - Read/write Photoshop IRB meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +Photoshop writes its own format of meta information called a Photoshop IRB +resource which is located in the APP13 record of JPEG files. This module +contains the definitions to read this information. + +=head1 NOTES + +Photoshop IRB blocks may have an associated resource name. These names are +usually just an empty string, but if not empty they are displayed in the +verbose level 2 (or greater) output. A special C<SetResourceName> flag may +be set to '1' in the tag information hash to cause the resource name to be +appended to the value when extracted. If this is done, the returned value +has the form "VALUE/#NAME#/". When writing, the writer routine looks for +this syntax (if C<SetResourceName> is defined), and and uses the embedded +name to set the name of the new resource. This allows the resource names to +be preserved when copying Photoshop information via user-defined tags. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.fine-view.com/jp/lab/doc/ps6ffspecsv2.pdf> + +=item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/irb_jpeg_qual.html> + +=item L<http://www.fileformat.info/format/psd/egff.htm> + +=item L<http://libpsd.graphest.com/files/Photoshop%20File%20Formats.pdf> + +=item L<http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Photoshop Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::MetaData::JPEG(3pm)|Image::MetaData::JPEG> + +=cut diff --git a/lib/Image/ExifTool/PostScript.pm b/lib/Image/ExifTool/PostScript.pm new file mode 100644 index 0000000..47ce58e --- /dev/null +++ b/lib/Image/ExifTool/PostScript.pm @@ -0,0 +1,802 @@ +#------------------------------------------------------------------------------ +# File: PostScript.pm +# +# Description: Read PostScript meta information +# +# Revisions: 07/08/2005 - P. Harvey Created +# +# References: 1) http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf +# 2) http://partners.adobe.com/public/developer/en/ps/5001.DSC_Spec.pdf +# 3) http://partners.adobe.com/public/developer/en/illustrator/sdk/AI7FileFormat.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::PostScript; + +use strict; +use vars qw($VERSION $AUTOLOAD); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.44'; + +sub WritePS($$); +sub ProcessPS($$;$); + +# PostScript tag table +%Image::ExifTool::PostScript::Main = ( + PROCESS_PROC => \&ProcessPS, + WRITE_PROC => \&WritePS, + PREFERRED => 1, # always add these tags when writing + GROUPS => { 2 => 'Image' }, + # Note: Make all of these tags priority 0 since the first one found at + # the start of the file should take priority (in case multiples exist) + Author => { Priority => 0, Groups => { 2 => 'Author' }, Writable => 'string' }, + BoundingBox => { Priority => 0 }, + Copyright => { Priority => 0, Writable => 'string' }, #2 + CreationDate => { + Name => 'CreateDate', + Priority => 0, + Groups => { 2 => 'Time' }, + Writable => 'string', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + Creator => { Priority => 0, Writable => 'string' }, + ImageData => { Priority => 0 }, + For => { Priority => 0, Writable => 'string', Notes => 'for whom the document was prepared'}, + Keywords => { Priority => 0, Writable => 'string' }, + ModDate => { + Name => 'ModifyDate', + Priority => 0, + Groups => { 2 => 'Time' }, + Writable => 'string', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + Pages => { Priority => 0 }, + Routing => { Priority => 0, Writable => 'string' }, #2 + Subject => { Priority => 0, Writable => 'string' }, + Title => { Priority => 0, Writable => 'string' }, + Version => { Priority => 0, Writable => 'string' }, #2 + # these subdirectories for documentation only + BeginPhotoshop => { + Name => 'PhotoshopData', + SubDirectory => { + TagTable => 'Image::ExifTool::Photoshop::Main', + }, + }, + BeginICCProfile => { + Name => 'ICC_Profile', + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + }, + }, + begin_xml_packet => { + Name => 'XMP', + SubDirectory => { + TagTable => 'Image::ExifTool::XMP::Main', + }, + }, + TIFFPreview => { + Groups => { 2 => 'Preview' }, + Binary => 1, + Notes => q{ + not a real tag ID, but used to represent the TIFF preview extracted from DOS + EPS images + }, + }, + BeginDocument => { + Name => 'EmbeddedFile', + SubDirectory => { + TagTable => 'Image::ExifTool::PostScript::Main', + }, + Notes => 'extracted with L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> option', + }, + EmbeddedFileName => { + Notes => q{ + not a real tag ID, but the file name from a BeginDocument statement. + Extracted with document metadata when L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> option is used + }, + }, + # AI metadata (most with a single leading '%') + AI9_ColorModel => { + Name => 'AIColorModel', + PrintConv => { + 1 => 'RGB', + 2 => 'CMYK', + }, + }, + AI3_ColorUsage => { Name => 'AIColorUsage' }, + AI5_RulerUnits => { + Name => 'AIRulerUnits', + PrintConv => { + 0 => 'Inches', + 1 => 'Millimeters', + 2 => 'Points', + 3 => 'Picas', + 4 => 'Centimeters', + 6 => 'Pixels', + }, + }, + AI5_TargetResolution => { Name => 'AITargetResolution' }, + AI5_NumLayers => { Name => 'AINumLayers' }, + AI5_FileFormat => { Name => 'AIFileFormat' }, + AI8_CreatorVersion => { Name => 'AICreatorVersion' }, # (double leading '%') + AI12_BuildNumber => { Name => 'AIBuildNumber' }, +); + +# composite tags +%Image::ExifTool::PostScript::Composite = ( + GROUPS => { 2 => 'Image' }, + # BoundingBox is in points, not pixels, + # but use it anyway if ImageData is not available + ImageWidth => { + Desire => { + 0 => 'Main:PostScript:ImageData', + 1 => 'PostScript:BoundingBox', + }, + ValueConv => 'Image::ExifTool::PostScript::ImageSize(\@val, 0)', + }, + ImageHeight => { + Desire => { + 0 => 'Main:PostScript:ImageData', + 1 => 'PostScript:BoundingBox', + }, + ValueConv => 'Image::ExifTool::PostScript::ImageSize(\@val, 1)', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::PostScript'); + +#------------------------------------------------------------------------------ +# AutoLoad our writer routines when necessary +# +sub AUTOLOAD +{ + return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_); +} + +#------------------------------------------------------------------------------ +# Is this a PC system +# Returns: true for PC systems +my %isPC = (MSWin32 => 1, os2 => 1, dos => 1, NetWare => 1, symbian => 1, cygwin => 1); +sub IsPC() +{ + return $isPC{$^O}; +} + +#------------------------------------------------------------------------------ +# Get image width or height +# Inputs: 0) value list ref (ImageData, BoundingBox), 1) true to get height +sub ImageSize($$) +{ + my ($vals, $getHeight) = @_; + my ($w, $h); + if ($$vals[0] and $$vals[0] =~ /^(\d+) (\d+)/) { + ($w, $h) = ($1, $2); + } elsif ($$vals[1] and $$vals[1] =~ /^(\d+) (\d+) (\d+) (\d+)/) { + ($w, $h) = ($3 - $1, $4 - $2); + } + return $getHeight ? $h : $w; +} + +#------------------------------------------------------------------------------ +# Set PostScript format error warning +# Inputs: 0) ExifTool object reference, 1) error string +# Returns: 1 +sub PSErr($$) +{ + my ($et, $str) = @_; + # set file type if not done already + my $ext = $$et{FILE_EXT}; + $et->SetFileType(($ext and $ext eq 'AI') ? 'AI' : 'PS'); + $et->Warn("PostScript format error ($str)"); + return 1; +} + +#------------------------------------------------------------------------------ +# Return input record separator to use for the specified file +# Inputs: 0) RAF reference +# Returns: Input record separator or undef on error +sub GetInputRecordSeparator($) +{ + my $raf = shift; + my $pos = $raf->Tell(); # save current position + my ($data, $sep); + $raf->Read($data,256) or return undef; + my ($a, $d) = (999,999); + $a = pos($data), pos($data) = 0 if $data =~ /\x0a/g; + $d = pos($data) if $data =~ /\x0d/g; + my $diff = $a - $d; + if ($diff == 1) { + $sep = "\x0d\x0a"; + } elsif ($diff == -1) { + $sep = "\x0a\x0d"; + } elsif ($diff > 0) { + $sep = "\x0d"; + } elsif ($diff < 0) { + $sep = "\x0a"; + } # else error + $raf->Seek($pos, 0); # restore original position + return $sep; +} + +#------------------------------------------------------------------------------ +# Split into lines ending in any CR, LF or CR+LF combination +# (this is annoying, and could be avoided if EPS files didn't mix linefeeds!) +# Inputs: 0) data pointer, 1) reference to lines array +# Notes: Fills @$lines with lines from splitting $$dataPt +sub SplitLine($$) +{ + my ($dataPt, $lines) = @_; + for (;;) { + my $endl; + # find the position of the first LF (\x0a) + $endl = pos($$dataPt), pos($$dataPt) = 0 if $$dataPt =~ /\x0a/g; + if ($$dataPt =~ /\x0d/g) { # find the first CR (\x0d) + if (defined $endl) { + # (remember, CR+LF is a DOS newline...) + $endl = pos($$dataPt) if pos($$dataPt) < $endl - 1; + } else { + $endl = pos($$dataPt); + } + } elsif (not defined $endl) { + push @$lines, $$dataPt; + last; + } + if (length $$dataPt == $endl) { + push @$lines, $$dataPt; + last; + } else { + # continue to split into separate lines + push @$lines, substr($$dataPt, 0, $endl); + $$dataPt = substr($$dataPt, $endl); + } + } +} + +#------------------------------------------------------------------------------ +# check to be sure we haven't read past end of PS data in DOS-style file +# Inputs: 0) RAF ref (with PSEnd member), 1) data ref +# - modifies data and sets RAF to EOF if end of PS is reached +sub CheckPSEnd($$) +{ + my ($raf, $dataPt) = @_; + my $pos = $raf->Tell(); + if ($pos >= $$raf{PSEnd}) { + $raf->Seek(0, 2); # seek to end of file so we can't read any more + $$dataPt = substr($$dataPt, 0, length($$dataPt) - $pos + $$raf{PSEnd}) if $pos > $$raf{PSEnd}; + } +} + +#------------------------------------------------------------------------------ +# Read next line from EPS file +# Inputs: 0) RAF ref (with PSEnd member if Postscript ends before end of file) +# 1) array of lines from file +# Returns: true on success +sub GetNextLine($$) +{ + my ($raf, $lines) = @_; + my ($data, $changedNL); + my $altnl = ($/ eq "\x0d") ? "\x0a" : "\x0d"; + for (;;) { + $raf->ReadLine($data) or last; + $$raf{PSEnd} and CheckPSEnd($raf, \$data); + # split line if it contains other newline sequences + if ($data =~ /$altnl/) { + if (length($data) > 500000 and IsPC()) { + # patch for Windows memory problem + unless ($changedNL) { + $changedNL = $/; + $/ = $altnl; + $altnl = $changedNL; + $raf->Seek(-length($data), 1); + next; + } + } else { + # split into separate lines + # push @$lines, split /$altnl/, $data, -1; + # if (@$lines == 2 and $$lines[1] eq $/) { + # # handle case of DOS newline data inside file using Unix newlines + # $$lines[0] .= pop @$lines; + # } + # split into separate lines if necessary + SplitLine(\$data, $lines); + } + } else { + push @$lines, $data; + } + $/ = $changedNL if $changedNL; + return 1; + } + return 0; +} + +#------------------------------------------------------------------------------ +# Decode comment from PostScript file +# Inputs: 0) comment string, 1) RAF ref, 2) reference to lines array +# 3) optional data reference for extra lines read from file +# Returns: Decoded comment string (may be an array reference) +# - handles multi-line comments and escape sequences +sub DecodeComment($$$;$) +{ + my ($val, $raf, $lines, $dataPt) = @_; + $val =~ s/\x0d*\x0a*$//; # remove trailing CR, LF or CR/LF + # check for continuation comments + for (;;) { + @$lines or GetNextLine($raf, $lines) or last; + last unless $$lines[0] =~ /^%%\+/; # is the next line a continuation? + $$dataPt .= $$lines[0] if $dataPt; # add to data if necessary + $$lines[0] =~ s/\x0d*\x0a*$//; # remove trailing CR, LF or CR/LF + $val .= substr(shift(@$lines), 3); # add to value (without leading "%%+") + } + my @vals; + # handle bracketed string values + if ($val =~ s/^\((.*)\)$/$1/) { # remove brackets if necessary + # split into an array of strings if necessary + my $nesting = 1; + while ($val =~ /(\(|\))/g) { + my $bra = $1; + my $pos = pos($val) - 2; + my $backslashes = 0; + while ($pos and substr($val, $pos, 1) eq '\\') { + --$pos; + ++$backslashes; + } + next if $backslashes & 0x01; # escaped if odd number + if ($bra eq '(') { + ++$nesting; + } else { + --$nesting; + unless ($nesting) { + push @vals, substr($val, 0, pos($val)-1); + $val = substr($val, pos($val)); + ++$nesting if $val =~ s/\s*\(//; + } + } + } + push @vals, $val; + foreach $val (@vals) { + # decode escape sequences in bracketed strings + # (similar to code in PDF.pm, but without line continuation) + while ($val =~ /\\(.)/sg) { + my $n = pos($val) - 2; + my $c = $1; + my $r; + if ($c =~ /[0-7]/) { + # get up to 2 more octal digits + $c .= $1 if $val =~ /\G([0-7]{1,2})/g; + # convert octal escape code + $r = chr(oct($c) & 0xff); + } else { + # convert escaped characters + ($r = $c) =~ tr/nrtbf/\n\r\t\b\f/; + } + substr($val, $n, length($c)+1) = $r; + # continue search after this character + pos($val) = $n + length($r); + } + } + $val = @vals > 1 ? \@vals : $vals[0]; + } + return $val; +} + +#------------------------------------------------------------------------------ +# Unescape PostScript string +# Inputs: 0) string +# Returns: unescaped string +sub UnescapePostScript($) +{ + my $str = shift; + # decode escape sequences in literal strings + while ($str =~ /\\(.)/sg) { + my $n = pos($str) - 2; + my $c = $1; + my $r; + if ($c =~ /[0-7]/) { + # get up to 2 more octal digits + $c .= $1 if $str =~ /\G([0-7]{1,2})/g; + # convert octal escape code + $r = chr(oct($c) & 0xff); + } elsif ($c eq "\x0d") { + # the string is continued if the line ends with '\' + # (also remove "\x0d\x0a") + $c .= $1 if $str =~ /\G(\x0a)/g; + $r = ''; + } elsif ($c eq "\x0a") { + $r = ''; + } else { + # convert escaped characters + ($r = $c) =~ tr/nrtbf/\n\r\t\b\f/; + } + substr($str, $n, length($c)+1) = $r; + # continue search after this character + pos($str) = $n + length($r); + } + return $str; +} + +#------------------------------------------------------------------------------ +# Extract information from EPS, PS or AI file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) optional tag table ref +# Returns: 1 if this was a valid PostScript file +sub ProcessPS($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $raf = $$dirInfo{RAF}; + my $embedded = $et->Options('ExtractEmbedded'); + my ($data, $dos, $endDoc, $fontTable, $comment); + + # allow read from data + unless ($raf) { + $raf = new File::RandomAccess($$dirInfo{DataPt}); + $et->VerboseDir('PostScript'); + } +# +# determine if this is a postscript file +# + $raf->Read($data, 4) == 4 or return 0; + # accept either ASCII or DOS binary postscript file format + return 0 unless $data =~ /^(%!PS|%!Ad|%!Fo|\xc5\xd0\xd3\xc6)/; + if ($data =~ /^%!Ad/) { + # I've seen PS files start with "%!Adobe-PS"... + return 0 unless $raf->Read($data, 6) == 6 and $data eq "obe-PS"; + } elsif ($data =~ /^\xc5\xd0\xd3\xc6/) { + # process DOS binary file header + # - save DOS header then seek ahead and check PS header + $raf->Read($dos, 26) == 26 or return 0; + SetByteOrder('II'); + my $psStart = Get32u(\$dos, 0); + unless ($raf->Seek($psStart, 0) and + $raf->Read($data, 4) == 4 and $data eq '%!PS') + { + return PSErr($et, 'invalid header'); + } + $$raf{PSEnd} = $psStart + Get32u(\$dos, 4); # set end of PostScript data in RAF + } else { + # check for PostScript font file (PFA or PFB) + my $d2; + $data .= $d2 if $raf->Read($d2,12); + if ($data =~ /^%!(PS-(AdobeFont-|Bitstream )|FontType1-)/) { + $et->SetFileType('PFA'); # PostScript ASCII font file + $fontTable = GetTagTable('Image::ExifTool::Font::PSInfo'); + # PostScript font files may contain an unformatted comments which may + # contain useful information, so accumulate these for the Comment tag + $comment = 1; + } + $raf->Seek(-length($data), 1); + } +# +# set the newline type based on the first newline found in the file +# + local $/ = GetInputRecordSeparator($raf); + $/ or return PSErr($et, 'invalid PS data'); + + # set file type (PostScript or EPS) + $raf->ReadLine($data) or $data = ''; + my $type; + if ($data =~ /EPSF/) { + $type = 'EPS'; + } else { + # read next line to see if this is an Illustrator file + my $line2; + my $pos = $raf->Tell(); + if ($raf->ReadLine($line2) and $line2 =~ /^%%Creator: Adobe Illustrator/) { + $type = 'AI'; + } else { + $type = 'PS'; + } + $raf->Seek($pos, 0); + } + $et->SetFileType($type); + return 1 if $$et{OPTIONS}{FastScan} and $$et{OPTIONS}{FastScan} == 3; +# +# extract TIFF information from DOS header +# + $tagTablePtr or $tagTablePtr = GetTagTable('Image::ExifTool::PostScript::Main'); + if ($dos) { + my $base = Get32u(\$dos, 16); + if ($base) { + my $pos = $raf->Tell(); + # extract the TIFF preview + my $len = Get32u(\$dos, 20); + my $val = $et->ExtractBinary($base, $len, 'TIFFPreview'); + if (defined $val and $val =~ /^(MM\0\x2a|II\x2a\0|Binary)/) { + $et->HandleTag($tagTablePtr, 'TIFFPreview', $val); + } else { + $et->Warn('Bad TIFF preview image'); + } + # extract information from TIFF in DOS header + # (set Parent to '' to avoid setting FileType tag again) + my %dirInfo = ( + Parent => '', + RAF => $raf, + Base => $base, + ); + $et->ProcessTIFF(\%dirInfo) or $et->Warn('Bad embedded TIFF'); + # position file pointer to extract PS information + $raf->Seek($pos, 0); + } + } +# +# parse the postscript +# + my ($buff, $mode, $beginToken, $endToken, $docNum, $subDocNum, $changedNL); + my (@lines, $altnl); + if ($/ eq "\x0d") { + $altnl = "\x0a"; + } else { + $/ = "\x0a"; # end on any LF (even if DOS CR+LF) + $altnl = "\x0d"; + } + for (;;) { + if (@lines) { + $data = shift @lines; + } else { + $raf->ReadLine($data) or last; + # check for alternate newlines as efficiently as possible + if ($data =~ /$altnl/) { + if (length($data) > 500000 and IsPC()) { + # Windows can't split very long lines due to poor memory handling, + # so re-read the file with the other newline character instead + # (slower but uses less memory) + unless ($changedNL) { + $changedNL = 1; + my $t = $/; + $/ = $altnl; + $altnl = $t; + $raf->Seek(-length($data), 1); + next; + } + } else { + # split into separate lines + @lines = split /$altnl/, $data, -1; + $data = shift @lines; + if (@lines == 1 and $lines[0] eq $/) { + # handle case of DOS newline data inside file using Unix newlines + $data .= $lines[0]; + undef @lines; + } + } + } + } + undef $changedNL; + if ($mode) { + if (not $endToken) { + $buff .= $data; + next unless $data =~ m{<\?xpacket end=.(w|r).\?>(\n|\r|$)}; + } elsif ($data !~ /^$endToken/i) { + if ($mode eq 'XMP') { + $buff .= $data; + } elsif ($mode eq 'Document') { + # ignore embedded documents, but keep track of nesting level + $docNum .= '-1' if $data =~ /^$beginToken/; + } else { + # data is ASCII-hex encoded + $data =~ tr/0-9A-Fa-f//dc; # remove all but hex characters + $buff .= pack('H*', $data); # translate from hex + } + next; + } elsif ($mode eq 'Document') { + $docNum =~ s/-?\d+$//; # decrement document nesting level + # done with Document mode if we are back at the top level + undef $mode unless $docNum; + next; + } + } elsif ($endDoc and $data =~ /^$endDoc/i) { + $docNum =~ s/-?(\d+)$//; # decrement nesting level + $subDocNum = $1; # remember our last sub-document number + $$et{DOC_NUM} = $docNum; + undef $endDoc unless $docNum; # done with document if top level + next; + } elsif ($data =~ /^(%{1,2})(Begin)(_xml_packet|Photoshop|ICCProfile|Document|Binary)/i) { + # the beginning of a data block + my %modeLookup = ( + _xml_packet => 'XMP', + photoshop => 'Photoshop', + iccprofile => 'ICC_Profile', + document => 'Document', + binary => undef, # (we will try to skip this) + ); + $mode = $modeLookup{lc $3}; + unless ($mode) { + if (not @lines and $data =~ /^%{1,2}BeginBinary:\s*(\d+)/i) { + $raf->Seek($1, 1) or last; # skip binary data + } + next; + } + $buff = ''; + $beginToken = $1 . $2 . $3; + $endToken = $1 . ($2 eq 'begin' ? 'end' : 'End') . $3; + if ($mode eq 'Document') { + # this is either the 1st sub-document or Nth document + if ($docNum) { + # increase nesting level + $docNum .= '-' . (++$subDocNum); + } else { + # this is the Nth document + $docNum = $$et{DOC_COUNT} + 1; + } + $subDocNum = 0; # new level, so reset subDocNum + next unless $embedded; # skip over this document + # set document number for family 4-7 group names + $$et{DOC_NUM} = $docNum; + $$et{LIST_TAGS} = { }; # don't build lists across different documents + $$et{PROCESSED} = { }; # re-initialize processed directory lookup too + $endDoc = $endToken; # parse to EndDocument token + # reset mode to allow parsing into sub-directories + undef $endToken; + undef $mode; + # save document name if available + if ($data =~ /^$beginToken:\s+([^\n\r]+)/i) { + my $docName = $1; + # remove brackets if necessary + $docName = $1 if $docName =~ /^\((.*)\)$/; + $et->HandleTag($tagTablePtr, 'EmbeddedFileName', $docName); + } + } + next; + } elsif ($data =~ /^<\?xpacket begin=.{7,13}W5M0MpCehiHzreSzNTczkc9d/) { + # pick up any stray XMP data + $mode = 'XMP'; + $buff = $data; + undef $endToken; # no end token (just look for xpacket end) + # XMP could be contained in a single line (if newlines are different) + next unless $data =~ m{<\?xpacket end=.(w|r).\?>(\n|\r|$)}; + } elsif ($data =~ /^%%?(\w+): ?(.*)/s and $$tagTablePtr{$1}) { + my ($tag, $val) = ($1, $2); + # only allow 'ImageData' and AI tags to have single leading '%' + next unless $data =~ /^%(%|AI\d+_)/ or $tag eq 'ImageData'; + # decode comment string (reading continuation lines if necessary) + $val = DecodeComment($val, $raf, \@lines); + $et->HandleTag($tagTablePtr, $tag, $val); + next; + } elsif ($embedded and $data =~ /^%AI12_CompressedData/) { + # the rest of the file is compressed + unless (eval { require Compress::Zlib }) { + $et->Warn('Install Compress::Zlib to extract compressed embedded data'); + last; + } + # seek back to find the start of the compressed data in the file + my $tlen = length($data) + @lines; + $tlen += length $_ foreach @lines; + my $backTo = $raf->Tell() - $tlen - 64; + $backTo = 0 if $backTo < 0; + last unless $raf->Seek($backTo, 0) and $raf->Read($data, 2048); + last unless $data =~ s/.*?%AI12_CompressedData//; + my $inflate = Compress::Zlib::inflateInit(); + $inflate or $et->Warn('Error initializing inflate'), last; + # generate a PS-like file in memory from the compressed data + my $verbose = $et->Options('Verbose'); + if ($verbose > 1) { + $et->VerboseDir('AI12_CompressedData (first 4kB)'); + $et->VerboseDump(\$data); + } + # remove header if it exists (Windows AI files only) + $data =~ s/^.{0,256}EndData[\x0d\x0a]+//s; + my $val; + for (;;) { + my ($v2, $stat) = $inflate->inflate($data); + $stat == Compress::Zlib::Z_STREAM_END() and $val .= $v2, last; + $stat != Compress::Zlib::Z_OK() and undef($val), last; + if (defined $val) { + $val .= $v2; + } elsif ($v2 =~ /^%!PS/) { + $val = $v2; + } else { + # add postscript header (for file recognition) if it doesn't exist + $val = "%!PS-Adobe-3.0$/" . $v2; + } + $raf->Read($data, 65536) or last; + } + defined $val or $et->Warn('Error inflating AI compressed data'), last; + if ($verbose > 1) { + $et->VerboseDir('Uncompressed AI12 Data'); + $et->VerboseDump(\$val); + } + # extract information from embedded images in the uncompressed data + $val = # add PS header in case it needs one + ProcessPS($et, { DataPt => \$val }); + last; + } elsif ($fontTable) { + if (defined $comment) { + # extract initial comments from PostScript Font files + if ($data =~ /^%\s+(.*?)[\x0d\x0a]/) { + $comment .= "\n" if $comment; + $comment .= $1; + next; + } elsif ($data !~ /^%/) { + # stop extracting comments at the first non-comment line + $et->FoundTag('Comment', $comment) if length $comment; + undef $comment; + } + } + if ($data =~ m{^\s*/(\w+)\s*(.*)} and $$fontTable{$1}) { + my ($tag, $val) = ($1, $2); + if ($val =~ /^\((.*)\)/) { + $val = UnescapePostScript($1); + } elsif ($val =~ m{/?(\S+)}) { + $val = $1; + } + $et->HandleTag($fontTable, $tag, $val); + } elsif ($data =~ /^currentdict end/) { + # only extract tags from initial FontInfo dict + undef $fontTable; + } + next; + } else { + next; + } + # extract information from buffered data + my %dirInfo = ( + DataPt => \$buff, + DataLen => length $buff, + DirStart => 0, + DirLen => length $buff, + Parent => 'PostScript', + ); + my $subTablePtr = GetTagTable("Image::ExifTool::${mode}::Main"); + unless ($et->ProcessDirectory(\%dirInfo, $subTablePtr)) { + $et->Warn("Error processing $mode information in PostScript file"); + } + undef $buff; + undef $mode; + } + $mode = 'Document' if $endDoc and not $mode; + $mode and PSErr($et, "unterminated $mode data"); + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from EPS file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 if this was a valid PostScript file +sub ProcessEPS($$) +{ + return ProcessPS($_[0],$_[1]); +} + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::PostScript - Read PostScript meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This code reads meta information from EPS (Encapsulated PostScript), PS +(PostScript) and AI (Adobe Illustrator) files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf> + +=item L<http://partners.adobe.com/public/developer/en/ps/5001.DSC_Spec.pdf> + +=item L<http://partners.adobe.com/public/developer/en/illustrator/sdk/AI7FileFormat.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PostScript Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/PrintIM.pm b/lib/Image/ExifTool/PrintIM.pm new file mode 100644 index 0000000..e44d47d --- /dev/null +++ b/lib/Image/ExifTool/PrintIM.pm @@ -0,0 +1,125 @@ +#------------------------------------------------------------------------------ +# File: PrintIM.pm +# +# Description: Read PrintIM meta information +# +# Revisions: 04/07/2004 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::PrintIM; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess); + +$VERSION = '1.07'; + +sub ProcessPrintIM($$$); + +# PrintIM table (proprietary specification by Epson) +%Image::ExifTool::PrintIM::Main = ( + PROCESS_PROC => \&ProcessPrintIM, + GROUPS => { 0 => 'PrintIM', 1 => 'PrintIM', 2 => 'Printing' }, + PRINT_CONV => 'sprintf("0x%.8x", $val)', + TAG_PREFIX => 'PrintIM', + PrintIMVersion => { # values: 0100, 0250, 0260, 0300 + Description => 'PrintIM Version', + PrintConv => undef, + }, + # the following names are from http://www.kanzaki.com/ns/exif + # but the decoding is unknown: + # 9 => { Name => 'PIMContrast', Unknown => 1 }, #1 + # 10 => { Name => 'PIMBrightness', Unknown => 1 }, #1 + # 11 => { Name => 'PIMColorbalance', Unknown => 1 }, #1 + # 12 => { Name => 'PIMSaturation', Unknown => 1 }, #1 + # 13 => { Name => 'PIMSharpness', Unknown => 1 }, #1 +); + + +#------------------------------------------------------------------------------ +# Process PrintIM IFD +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessPrintIM($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $offset = $$dirInfo{DirStart}; + my $size = $$dirInfo{DirLen}; + my $verbose = $et->Options('Verbose'); + + unless ($size) { + $et->Warn('Empty PrintIM data', 1); + return 0; + } + unless ($size > 15) { + $et->Warn('Bad PrintIM data'); + return 0; + } + unless (substr($$dataPt, $offset, 7) eq 'PrintIM') { + $et->Warn('Invalid PrintIM header'); + return 0; + } + # check size of PrintIM block + my $num = Get16u($dataPt, $offset + 14); + if ($size < 16 + $num * 6) { + # size is too big, maybe byte ordering is wrong + ToggleByteOrder(); + $num = Get16u($dataPt, $offset + 14); + if ($size < 16 + $num * 6) { + $et->Warn('Bad PrintIM size'); + return 0; + } + } + $verbose and $et->VerboseDir('PrintIM', $num); + $et->HandleTag($tagTablePtr, 'PrintIMVersion', substr($$dataPt, $offset + 8, 4), + DataPt => $dataPt, + Start => $offset + 8, + Size => 4, + ); + my $n; + for ($n=0; $n<$num; ++$n) { + my $pos = $offset + 16 + $n * 6; + my $tag = Get16u($dataPt, $pos); + my $val = Get32u($dataPt, $pos + 2); + $et->HandleTag($tagTablePtr, $tag, $val, + Index => $n, + DataPt => $dataPt, + Start => $pos + 2, + Size => 4, + ); + } + return 1; +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::PrintIM - Read PrintIM meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Print Image Matching meta information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/PrintIM Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Qualcomm.pm b/lib/Image/ExifTool/Qualcomm.pm new file mode 100644 index 0000000..ed64e15 --- /dev/null +++ b/lib/Image/ExifTool/Qualcomm.pm @@ -0,0 +1,1344 @@ +#------------------------------------------------------------------------------ +# File: Qualcomm.pm +# +# Description: Read Qualcomm APP7 meta information +# +# Revisions: 2012/02/14 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::Qualcomm; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.01'; + +sub ProcessQualcomm($$$); +sub MakeNameAndDesc($$); + +# Qualcomm format codes (ref PH (NC)) +my @qualcommFormat = ( + 'int8u', 'int8s', 'int16u', 'int16s', + 'int32u', 'int32s', 'float', 'double', +); + +# information found in JPEG APP7 Qualcomm Camera Attributes segment +%Image::ExifTool::Qualcomm::Main = ( + PROCESS_PROC => \&ProcessQualcomm, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + VARS => { NO_ID => 1, NO_LOOKUP => 1 }, # too long, too many, and too obscure + NOTES => q{ + The tags below have been observed in the JPEG APP7 "Qualcomm Camera + Attributes" segment written by some cameras such as the HP iPAQ Voice + Messenger. ExifTool will extract any information found from this segment, + even if it is not listed in this table. + }, + 'aec_current_sensor_luma' => { }, + 'af_position' => { }, + 'aec_current_exp_index' => { }, + 'awb_sample_decision' => { }, + 'asf5_enable' => { }, + 'asf5_filter_mode' => { }, + 'asf5_exposure_index_1' => { }, + 'asf5_exposure_index_2' => { }, + 'asf5_max_exposure_index' => { }, + 'asf5_luma_filter[0]' => { }, + 'asf5_luma_filter[1]' => { }, + 'asf5_luma_filter[2]' => { }, + 'asf5_luma_filter[3]' => { }, + 'asf5_luma_filter[4]' => { }, + 'asf5_luma_filter[5]' => { }, + 'asf5_luma_filter[6]' => { }, + 'asf5_luma_filter[7]' => { }, + 'asf5_luma_filter[8]' => { }, + 'asf5_filter1_a11' => { }, + 'asf5_filter1_a12' => { }, + 'asf5_filter1_a13' => { }, + 'asf5_filter1_a14' => { }, + 'asf5_filter1_a15' => { }, + 'asf5_filter1_a21' => { }, + 'asf5_filter1_a22' => { }, + 'asf5_filter1_a23' => { }, + 'asf5_filter1_a24' => { }, + 'asf5_filter1_a25' => { }, + 'asf5_filter1_a31' => { }, + 'asf5_filter1_a32' => { }, + 'asf5_filter1_a33' => { }, + 'asf5_filter1_a34' => { }, + 'asf5_filter1_a35' => { }, + 'asf5_filter1_a41' => { }, + 'asf5_filter1_a42' => { }, + 'asf5_filter1_a43' => { }, + 'asf5_filter1_a44' => { }, + 'asf5_filter1_a45' => { }, + 'asf5_filter1_a51' => { }, + 'asf5_filter1_a52' => { }, + 'asf5_filter1_a53' => { }, + 'asf5_filter1_a54' => { }, + 'asf5_filter1_a55' => { }, + 'asf5_filter2_a11' => { }, + 'asf5_filter2_a12' => { }, + 'asf5_filter2_a13' => { }, + 'asf5_filter2_a14' => { }, + 'asf5_filter2_a15' => { }, + 'asf5_filter2_a21' => { }, + 'asf5_filter2_a22' => { }, + 'asf5_filter2_a23' => { }, + 'asf5_filter2_a24' => { }, + 'asf5_filter2_a25' => { }, + 'asf5_filter2_a31' => { }, + 'asf5_filter2_a32' => { }, + 'asf5_filter2_a33' => { }, + 'asf5_filter2_a34' => { }, + 'asf5_filter2_a35' => { }, + 'asf5_filter2_a41' => { }, + 'asf5_filter2_a42' => { }, + 'asf5_filter2_a43' => { }, + 'asf5_filter2_a44' => { }, + 'asf5_filter2_a45' => { }, + 'asf5_filter2_a51' => { }, + 'asf5_filter2_a52' => { }, + 'asf5_filter2_a53' => { }, + 'asf5_filter2_a54' => { }, + 'asf5_filter2_a55' => { }, + 'asf5_nrmize_factor1' => { }, + 'asf5_nrmize_factor2' => { }, + 'asf5_low_lo_thres' => { }, + 'asf5_low_up_thres' => { }, + 'asf5_low_shrp_deg_f1' => { }, + 'asf5_low_shrp_deg_f2' => { }, + 'asf5_low_smth_prcnt' => { }, + 'asf5_nrm_lo_thres' => { }, + 'asf5_nrm_up_thres' => { }, + 'asf5_nrm_shrp_deg_f1' => { }, + 'asf5_nrm_shrp_deg_f2' => { }, + 'asf5_nrm_smth_prcnt' => { }, + 'asf5_brt_lo_thres' => { }, + 'asf5_brt_up_thres' => { }, + 'asf5_brt_shrp_deg_f1' => { }, + 'asf5_brt_shrp_deg_f2' => { }, + 'asf5_brt_smth_percent' => { }, + 'asf3_enable' => { }, + 'asf3_edge_filter_a11' => { }, + 'asf3_edge_filter_a12' => { }, + 'asf3_edge_filter_a13' => { }, + 'asf3_edge_filter_a21' => { }, + 'asf3_edge_filter_a22' => { }, + 'asf3_edge_filter_a23' => { }, + 'asf3_edge_filter_a31' => { }, + 'asf3_edge_filter_a32' => { }, + 'asf3_edge_filter_a33' => { }, + 'asf3_noise_filter_a11' => { }, + 'asf3_noise_filter_a12' => { }, + 'asf3_noise_filter_a13' => { }, + 'asf3_noise_filter_a21' => { }, + 'asf3_noise_filter_a22' => { }, + 'asf3_noise_filter_a23' => { }, + 'asf3_noise_filter_a31' => { }, + 'asf3_noise_filter_a32' => { }, + 'asf3_noise_filter_a33' => { }, + 'asf3_lower_threshold' => { }, + 'asf3_upper_threshold' => { }, + 'asf3_edge_detect' => { }, + 'aec_enable' => { }, + 'aec_mode' => { }, + 'aec_aggressiveness' => { }, + 'aec_luma_target' => { }, + 'aec_luma_tolerance' => { }, + 'aec_indoor_idx' => { }, + 'aec_odoor_idx' => { }, + 'aec_exposure_index_adj_step' => { }, + 'aec_outdoor_gamma_index' => { }, + 'aec_vfe_luma' => { }, + 'aec_high_luma_region_threshold' => { }, + 'aec_snapshot_sensor_gain' => { }, + 'aec_snapshot_digital_gain' => { }, + 'aec_snapshot_line_count' => { }, + 'aec_snapshot_exposure_time_ms' => { }, + 'aec_outdoor_bright_enable' => { }, + 'aec_outdoor_bright_reduction' => { }, + 'aec_outdoor_bright_threshold_LO' => { }, + 'aec_outdoor_bright_threshold_HI' => { }, + 'aec_outdoor_bright_discarded' => { }, + 'aec_high_luma_region_count' => { }, + 'antibanding_enable' => { }, + 'anti_bading_pixel_clk' => { }, + 'anti_bading_pixel_clk_per_line' => { }, + 'afr_enable' => { }, + 'afr_faster_0_trigger' => { }, + 'afr_slower_0_trigger' => { }, + 'afr_faster_0_exp_mod' => { }, + 'afr_slower_0_exp_mod' => { }, + 'afr_faster_1_trigger' => { }, + 'afr_slower_1_trigger' => { }, + 'afr_faster_1_exp_mod' => { }, + 'afr_slower_1_exp_mod' => { }, + 'afr_faster_2_trigger' => { }, + 'afr_slower_2_trigger' => { }, + 'afr_faster_2_exp_mod' => { }, + 'afr_slower_2_exp_mod' => { }, + 'afr_faster_3_trigger' => { }, + 'afr_slower_3_trigger' => { }, + 'afr_faster_3_exp_mod' => { }, + 'afr_slower_3_exp_mod' => { }, + 'afr_faster_4_trigger' => { }, + 'afr_slower_4_trigger' => { }, + 'afr_faster_4_exp_mod' => { }, + 'afr_slower_4_exp_mod' => { }, + 'afr_possible_frame_cnt' => { }, + 'af_enable' => { }, + 'af_steps_near_far' => { }, + 'af_steps_near_infinity' => { }, + 'af_gross_step' => { }, + 'af_fine_step' => { }, + 'af_fine_srch_points' => { }, + 'af_process' => { }, + 'af_mode' => { }, + 'af_near_end' => { }, + 'af_boundary' => { }, + 'af_far_end' => { }, + 'af_collect_end_stat' => { }, + 'af_test_mode' => { }, + 'af_undershoot_protect' => { }, + 'af_reset_lens_after_snap' => { }, + 'clip_to_af_rato' => { }, + 'af_pos_def_macro' => { }, + 'af_pos_def_norm' => { }, + 'af_vfe_vert_offset' => { }, + 'af_vfe_horz_offset' => { }, + 'af_vfe_vert_height' => { }, + 'af_vfe_horz_width' => { }, + 'af_vfe_metric_max' => { }, + 'af_trace_positions[0]' => { }, + 'af_trace_positions[1]' => { }, + 'af_trace_positions[2]' => { }, + 'af_trace_positions[3]' => { }, + 'af_trace_positions[4]' => { }, + 'af_trace_positions[5]' => { }, + 'af_trace_positions[6]' => { }, + 'af_trace_positions[7]' => { }, + 'af_trace_positions[8]' => { }, + 'af_trace_positions[9]' => { }, + 'af_trace_positions[10]' => { }, + 'af_trace_positions[11]' => { }, + 'af_trace_positions[12]' => { }, + 'af_trace_positions[13]' => { }, + 'af_trace_positions[14]' => { }, + 'af_trace_positions[15]' => { }, + 'af_trace_positions[16]' => { }, + 'af_trace_positions[17]' => { }, + 'af_trace_positions[18]' => { }, + 'af_trace_positions[19]' => { }, + 'af_trace_positions[20]' => { }, + 'af_trace_positions[21]' => { }, + 'af_trace_positions[22]' => { }, + 'af_trace_positions[23]' => { }, + 'af_trace_positions[24]' => { }, + 'af_trace_positions[25]' => { }, + 'af_trace_positions[26]' => { }, + 'af_trace_positions[27]' => { }, + 'af_trace_positions[28]' => { }, + 'af_trace_positions[29]' => { }, + 'af_trace_positions[30]' => { }, + 'af_trace_positions[31]' => { }, + 'af_trace_positions[32]' => { }, + 'af_trace_positions[33]' => { }, + 'af_trace_positions[34]' => { }, + 'af_trace_positions[35]' => { }, + 'af_trace_positions[36]' => { }, + 'af_trace_positions[37]' => { }, + 'af_trace_positions[38]' => { }, + 'af_trace_positions[39]' => { }, + 'af_trace_positions[40]' => { }, + 'af_trace_positions[41]' => { }, + 'af_trace_positions[42]' => { }, + 'af_trace_positions[43]' => { }, + 'af_trace_positions[44]' => { }, + 'af_trace_positions[45]' => { }, + 'af_trace_positions[46]' => { }, + 'af_trace_positions[47]' => { }, + 'af_trace_positions[48]' => { }, + 'af_trace_positions[49]' => { }, + 'af_trace_stats[0]' => { }, + 'af_trace_stats[1]' => { }, + 'af_trace_stats[2]' => { }, + 'af_trace_stats[3]' => { }, + 'af_trace_stats[4]' => { }, + 'af_trace_stats[5]' => { }, + 'af_trace_stats[6]' => { }, + 'af_trace_stats[7]' => { }, + 'af_trace_stats[8]' => { }, + 'af_trace_stats[9]' => { }, + 'af_trace_stats[10]' => { }, + 'af_trace_stats[11]' => { }, + 'af_trace_stats[12]' => { }, + 'af_trace_stats[13]' => { }, + 'af_trace_stats[14]' => { }, + 'af_trace_stats[15]' => { }, + 'af_trace_stats[16]' => { }, + 'af_trace_stats[17]' => { }, + 'af_trace_stats[18]' => { }, + 'af_trace_stats[19]' => { }, + 'af_trace_stats[20]' => { }, + 'af_trace_stats[21]' => { }, + 'af_trace_stats[22]' => { }, + 'af_trace_stats[23]' => { }, + 'af_trace_stats[24]' => { }, + 'af_trace_stats[25]' => { }, + 'af_trace_stats[26]' => { }, + 'af_trace_stats[27]' => { }, + 'af_trace_stats[28]' => { }, + 'af_trace_stats[29]' => { }, + 'af_trace_stats[30]' => { }, + 'af_trace_stats[31]' => { }, + 'af_trace_stats[32]' => { }, + 'af_trace_stats[33]' => { }, + 'af_trace_stats[34]' => { }, + 'af_trace_stats[35]' => { }, + 'af_trace_stats[36]' => { }, + 'af_trace_stats[37]' => { }, + 'af_trace_stats[38]' => { }, + 'af_trace_stats[39]' => { }, + 'af_trace_stats[40]' => { }, + 'af_trace_stats[41]' => { }, + 'af_trace_stats[42]' => { }, + 'af_trace_stats[43]' => { }, + 'af_trace_stats[44]' => { }, + 'af_trace_stats[45]' => { }, + 'af_trace_stats[46]' => { }, + 'af_trace_stats[47]' => { }, + 'af_trace_stats[48]' => { }, + 'af_trace_stats[49]' => { }, + 'af_focus_time' => { }, + 'awb_enable' => { }, + 'awb_algorithm' => { }, + 'awb_aggressiveness' => { }, + 'awb_red_gain_ref1' => { }, + 'awb_blue_gain_ref1' => { }, + 'awb_red_gain_adj_ref1' => { }, + 'awb_blue_gain_adj_ref1' => { }, + 'awb_red_gain_ref2' => { }, + 'awb_blue_gain_ref2' => { }, + 'awb_red_gain_adj_ref2' => { }, + 'awb_blue_gain_adj_ref2' => { }, + 'awb_red_gain_ref3' => { }, + 'awb_blue_gain_ref3' => { }, + 'awb_red_gain_adj_ref3' => { }, + 'awb_blue_gain_adj_ref3' => { }, + 'awb_red_gain_ref4' => { }, + 'awb_blue_gain_ref4' => { }, + 'awb_red_gain_adj_ref4' => { }, + 'awb_blue_gain_adj_ref4' => { }, + 'awb_red_gain_ref5' => { }, + 'awb_blue_gain_ref5' => { }, + 'awb_red_gain_adj_ref5' => { }, + 'awb_blue_gain_adj_ref5' => { }, + 'awb_red_gain_ref6' => { }, + 'awb_blue_gain_ref6' => { }, + 'awb_red_gain_adj_ref6' => { }, + 'awb_blue_gain_adj_ref6' => { }, + 'awb_red_gain_ref7' => { }, + 'awb_blue_gain_ref7' => { }, + 'awb_red_gain_adj_ref7' => { }, + 'awb_blue_gain_adj_ref7' => { }, + 'awb_red_gain_ref8' => { }, + 'awb_blue_gain_ref8' => { }, + 'awb_red_gain_adj_ref8' => { }, + 'awb_blue_gain_adj_ref8' => { }, + 'awb_lo_vfe_max_y' => { }, + 'awb_lo_vfe_min_y' => { }, + 'awb_lo_vfe_m1' => { }, + 'awb_lo_vfe_m2' => { }, + 'awb_lo_vfe_m3' => { }, + 'awb_lo_vfe_m4' => { }, + 'awb_lo_vfe_c1' => { }, + 'awb_lo_vfe_c2' => { }, + 'awb_lo_vfe_c3' => { }, + 'awb_lo_vfe_c4' => { }, + 'awb_norm_vfe_max_y' => { }, + 'awb_norm_vfe_min_y' => { }, + 'awb_norm_vfe_m1' => { }, + 'awb_norm_vfe_m2' => { }, + 'awb_norm_vfe_m3' => { }, + 'awb_norm_vfe_m4' => { }, + 'awb_norm_vfe_c1' => { }, + 'awb_norm_vfe_c2' => { }, + 'awb_norm_vfe_c3' => { }, + 'awb_norm_vfe_c4' => { }, + 'awb_oudor_vfe_max_y' => { }, + 'awb_oudor_vfe_min_y' => { }, + 'awb_oudor_vfe_m1' => { }, + 'awb_oudor_vfe_m2' => { }, + 'awb_oudor_vfe_m3' => { }, + 'awb_oudor_vfe_m4' => { }, + 'awb_oudor_vfe_c1' => { }, + 'awb_oudor_vfe_c2' => { }, + 'awb_oudor_vfe_c3' => { }, + 'awb_oudor_vfe_c4' => { }, + 'awb_cc_bias' => { }, + 'awb_min_r_gain' => { }, + 'awb_min_g_gain' => { }, + 'awb_min_b_gain' => { }, + 'awb_max_r_gain' => { }, + 'awb_max_g_gain' => { }, + 'awb_max_b_gain' => { }, + 'awb_outdoor_sample_influence' => { }, + 'awb_indoor_sample_influence' => { }, + 'awb_low_lig_col_cor_ena' => { }, + 'awb_agw_grid_dist_2_thresh' => { }, + 'awb_ave_rg_ratio' => { }, + 'awb_ave_bg_ratio' => { }, + 'awb_compact_cluster_R2' => { }, + 'outlier_distance' => { }, + 'awb_green_offset_rg' => { }, + 'awb_green_offset_bg' => { }, + 'awb_prev_wb_rgain' => { }, + 'awb_prev_wb_ggain' => { }, + 'awb_prev_wb_bgain' => { }, + 'awb_snapshot_r_gain' => { }, + 'awb_snapshot_b_gain' => { }, + 'rolloff_enable' => { }, + 'r2_tl84_cx' => { }, + 'r2_tl84_cy' => { }, + 'r2_tl84_width' => { }, + 'r2_tl84_height' => { }, + 'r2_tl84_intervals' => { }, + 'r2_tl84_tbl[0]' => { }, + 'r2_tl84_tbl[1]' => { }, + 'r2_tl84_tbl[2]' => { }, + 'r2_tl84_tbl[3]' => { }, + 'r2_tl84_tbl[4]' => { }, + 'r2_tl84_tbl[5]' => { }, + 'r2_tl84_tbl[6]' => { }, + 'r2_tl84_tbl[7]' => { }, + 'r2_tl84_tbl[8]' => { }, + 'r2_tl84_tbl[9]' => { }, + 'r2_tl84_tbl[10]' => { }, + 'r2_tl84_tbl[11]' => { }, + 'r2_tl84_tbl[12]' => { }, + 'r2_tl84_tbl[13]' => { }, + 'r2_tl84_tbl[14]' => { }, + 'r2_tl84_tbl[15]' => { }, + 'r2_tl84_tbl[16]' => { }, + 'r2_tl84_tbl[17]' => { }, + 'r2_tl84_tbl[18]' => { }, + 'r2_tl84_tbl[19]' => { }, + 'r2_tl84_tbl[20]' => { }, + 'r2_tl84_tbl[21]' => { }, + 'r2_tl84_tbl[22]' => { }, + 'r2_tl84_tbl[23]' => { }, + 'r2_tl84_tbl[24]' => { }, + 'r2_tl84_tbl[25]' => { }, + 'r2_tl84_tbl[26]' => { }, + 'r2_tl84_tbl[27]' => { }, + 'r2_tl84_tbl[28]' => { }, + 'r2_tl84_tbl[29]' => { }, + 'r2_tl84_tbl[30]' => { }, + 'r2_tl84_tbl[31]' => { }, + 'r2_tl84_red_ctbl[0]' => { }, + 'r2_tl84_red_ctbl[1]' => { }, + 'r2_tl84_red_ctbl[2]' => { }, + 'r2_tl84_red_ctbl[3]' => { }, + 'r2_tl84_red_ctbl[4]' => { }, + 'r2_tl84_red_ctbl[5]' => { }, + 'r2_tl84_red_ctbl[6]' => { }, + 'r2_tl84_red_ctbl[7]' => { }, + 'r2_tl84_red_ctbl[8]' => { }, + 'r2_tl84_red_ctbl[9]' => { }, + 'r2_tl84_red_ctbl[10]' => { }, + 'r2_tl84_red_ctbl[11]' => { }, + 'r2_tl84_red_ctbl[12]' => { }, + 'r2_tl84_red_ctbl[13]' => { }, + 'r2_tl84_red_ctbl[14]' => { }, + 'r2_tl84_red_ctbl[15]' => { }, + 'r2_tl84_red_ctbl[16]' => { }, + 'r2_tl84_red_ctbl[17]' => { }, + 'r2_tl84_red_ctbl[18]' => { }, + 'r2_tl84_red_ctbl[19]' => { }, + 'r2_tl84_red_ctbl[20]' => { }, + 'r2_tl84_red_ctbl[21]' => { }, + 'r2_tl84_red_ctbl[22]' => { }, + 'r2_tl84_red_ctbl[23]' => { }, + 'r2_tl84_red_ctbl[24]' => { }, + 'r2_tl84_red_ctbl[25]' => { }, + 'r2_tl84_red_ctbl[26]' => { }, + 'r2_tl84_red_ctbl[27]' => { }, + 'r2_tl84_red_ctbl[28]' => { }, + 'r2_tl84_red_ctbl[29]' => { }, + 'r2_tl84_red_ctbl[30]' => { }, + 'r2_tl84_red_ctbl[31]' => { }, + 'r2_tl84_green_ctbl[0]' => { }, + 'r2_tl84_green_ctbl[1]' => { }, + 'r2_tl84_green_ctbl[2]' => { }, + 'r2_tl84_green_ctbl[3]' => { }, + 'r2_tl84_green_ctbl[4]' => { }, + 'r2_tl84_green_ctbl[5]' => { }, + 'r2_tl84_green_ctbl[6]' => { }, + 'r2_tl84_green_ctbl[7]' => { }, + 'r2_tl84_green_ctbl[8]' => { }, + 'r2_tl84_green_ctbl[9]' => { }, + 'r2_tl84_green_ctbl[10]' => { }, + 'r2_tl84_green_ctbl[11]' => { }, + 'r2_tl84_green_ctbl[12]' => { }, + 'r2_tl84_green_ctbl[13]' => { }, + 'r2_tl84_green_ctbl[14]' => { }, + 'r2_tl84_green_ctbl[15]' => { }, + 'r2_tl84_green_ctbl[16]' => { }, + 'r2_tl84_green_ctbl[17]' => { }, + 'r2_tl84_green_ctbl[18]' => { }, + 'r2_tl84_green_ctbl[19]' => { }, + 'r2_tl84_green_ctbl[20]' => { }, + 'r2_tl84_green_ctbl[21]' => { }, + 'r2_tl84_green_ctbl[22]' => { }, + 'r2_tl84_green_ctbl[23]' => { }, + 'r2_tl84_green_ctbl[24]' => { }, + 'r2_tl84_green_ctbl[25]' => { }, + 'r2_tl84_green_ctbl[26]' => { }, + 'r2_tl84_green_ctbl[27]' => { }, + 'r2_tl84_green_ctbl[28]' => { }, + 'r2_tl84_green_ctbl[29]' => { }, + 'r2_tl84_green_ctbl[30]' => { }, + 'r2_tl84_green_ctbl[31]' => { }, + 'r2_tl84_blue_ctbl[0]' => { }, + 'r2_tl84_blue_ctbl[1]' => { }, + 'r2_tl84_blue_ctbl[2]' => { }, + 'r2_tl84_blue_ctbl[3]' => { }, + 'r2_tl84_blue_ctbl[4]' => { }, + 'r2_tl84_blue_ctbl[5]' => { }, + 'r2_tl84_blue_ctbl[6]' => { }, + 'r2_tl84_blue_ctbl[7]' => { }, + 'r2_tl84_blue_ctbl[8]' => { }, + 'r2_tl84_blue_ctbl[9]' => { }, + 'r2_tl84_blue_ctbl[10]' => { }, + 'r2_tl84_blue_ctbl[11]' => { }, + 'r2_tl84_blue_ctbl[12]' => { }, + 'r2_tl84_blue_ctbl[13]' => { }, + 'r2_tl84_blue_ctbl[14]' => { }, + 'r2_tl84_blue_ctbl[15]' => { }, + 'r2_tl84_blue_ctbl[16]' => { }, + 'r2_tl84_blue_ctbl[17]' => { }, + 'r2_tl84_blue_ctbl[18]' => { }, + 'r2_tl84_blue_ctbl[19]' => { }, + 'r2_tl84_blue_ctbl[20]' => { }, + 'r2_tl84_blue_ctbl[21]' => { }, + 'r2_tl84_blue_ctbl[22]' => { }, + 'r2_tl84_blue_ctbl[23]' => { }, + 'r2_tl84_blue_ctbl[24]' => { }, + 'r2_tl84_blue_ctbl[25]' => { }, + 'r2_tl84_blue_ctbl[26]' => { }, + 'r2_tl84_blue_ctbl[27]' => { }, + 'r2_tl84_blue_ctbl[28]' => { }, + 'r2_tl84_blue_ctbl[29]' => { }, + 'r2_tl84_blue_ctbl[30]' => { }, + 'r2_tl84_blue_ctbl[31]' => { }, + 'r2_tl84_red_stbl[0]' => { }, + 'r2_tl84_red_stbl[1]' => { }, + 'r2_tl84_red_stbl[2]' => { }, + 'r2_tl84_red_stbl[3]' => { }, + 'r2_tl84_red_stbl[4]' => { }, + 'r2_tl84_red_stbl[5]' => { }, + 'r2_tl84_red_stbl[6]' => { }, + 'r2_tl84_red_stbl[7]' => { }, + 'r2_tl84_red_stbl[8]' => { }, + 'r2_tl84_red_stbl[9]' => { }, + 'r2_tl84_red_stbl[10]' => { }, + 'r2_tl84_red_stbl[11]' => { }, + 'r2_tl84_red_stbl[12]' => { }, + 'r2_tl84_red_stbl[13]' => { }, + 'r2_tl84_red_stbl[14]' => { }, + 'r2_tl84_red_stbl[15]' => { }, + 'r2_tl84_red_stbl[16]' => { }, + 'r2_tl84_red_stbl[17]' => { }, + 'r2_tl84_red_stbl[18]' => { }, + 'r2_tl84_red_stbl[19]' => { }, + 'r2_tl84_red_stbl[20]' => { }, + 'r2_tl84_red_stbl[21]' => { }, + 'r2_tl84_red_stbl[22]' => { }, + 'r2_tl84_red_stbl[23]' => { }, + 'r2_tl84_red_stbl[24]' => { }, + 'r2_tl84_red_stbl[25]' => { }, + 'r2_tl84_red_stbl[26]' => { }, + 'r2_tl84_red_stbl[27]' => { }, + 'r2_tl84_red_stbl[28]' => { }, + 'r2_tl84_red_stbl[29]' => { }, + 'r2_tl84_red_stbl[30]' => { }, + 'r2_tl84_red_stbl[31]' => { }, + 'r2_tl84_blue_stbl[0]' => { }, + 'r2_tl84_blue_stbl[1]' => { }, + 'r2_tl84_blue_stbl[2]' => { }, + 'r2_tl84_blue_stbl[3]' => { }, + 'r2_tl84_blue_stbl[4]' => { }, + 'r2_tl84_blue_stbl[5]' => { }, + 'r2_tl84_blue_stbl[6]' => { }, + 'r2_tl84_blue_stbl[7]' => { }, + 'r2_tl84_blue_stbl[8]' => { }, + 'r2_tl84_blue_stbl[9]' => { }, + 'r2_tl84_blue_stbl[10]' => { }, + 'r2_tl84_blue_stbl[11]' => { }, + 'r2_tl84_blue_stbl[12]' => { }, + 'r2_tl84_blue_stbl[13]' => { }, + 'r2_tl84_blue_stbl[14]' => { }, + 'r2_tl84_blue_stbl[15]' => { }, + 'r2_tl84_blue_stbl[16]' => { }, + 'r2_tl84_blue_stbl[17]' => { }, + 'r2_tl84_blue_stbl[18]' => { }, + 'r2_tl84_blue_stbl[19]' => { }, + 'r2_tl84_blue_stbl[20]' => { }, + 'r2_tl84_blue_stbl[21]' => { }, + 'r2_tl84_blue_stbl[22]' => { }, + 'r2_tl84_blue_stbl[23]' => { }, + 'r2_tl84_blue_stbl[24]' => { }, + 'r2_tl84_blue_stbl[25]' => { }, + 'r2_tl84_blue_stbl[26]' => { }, + 'r2_tl84_blue_stbl[27]' => { }, + 'r2_tl84_blue_stbl[28]' => { }, + 'r2_tl84_blue_stbl[29]' => { }, + 'r2_tl84_blue_stbl[30]' => { }, + 'r2_tl84_blue_stbl[31]' => { }, + 'r2_tl84_green_stbl[0]' => { }, + 'r2_tl84_green_stbl[1]' => { }, + 'r2_tl84_green_stbl[2]' => { }, + 'r2_tl84_green_stbl[3]' => { }, + 'r2_tl84_green_stbl[4]' => { }, + 'r2_tl84_green_stbl[5]' => { }, + 'r2_tl84_green_stbl[6]' => { }, + 'r2_tl84_green_stbl[7]' => { }, + 'r2_tl84_green_stbl[8]' => { }, + 'r2_tl84_green_stbl[9]' => { }, + 'r2_tl84_green_stbl[10]' => { }, + 'r2_tl84_green_stbl[11]' => { }, + 'r2_tl84_green_stbl[12]' => { }, + 'r2_tl84_green_stbl[13]' => { }, + 'r2_tl84_green_stbl[14]' => { }, + 'r2_tl84_green_stbl[15]' => { }, + 'r2_tl84_green_stbl[16]' => { }, + 'r2_tl84_green_stbl[17]' => { }, + 'r2_tl84_green_stbl[18]' => { }, + 'r2_tl84_green_stbl[19]' => { }, + 'r2_tl84_green_stbl[20]' => { }, + 'r2_tl84_green_stbl[21]' => { }, + 'r2_tl84_green_stbl[22]' => { }, + 'r2_tl84_green_stbl[23]' => { }, + 'r2_tl84_green_stbl[24]' => { }, + 'r2_tl84_green_stbl[25]' => { }, + 'r2_tl84_green_stbl[26]' => { }, + 'r2_tl84_green_stbl[27]' => { }, + 'r2_tl84_green_stbl[28]' => { }, + 'r2_tl84_green_stbl[29]' => { }, + 'r2_tl84_green_stbl[30]' => { }, + 'r2_tl84_green_stbl[31]' => { }, + 'r2_d65_cx' => { }, + 'r2_d65_cy' => { }, + 'r2_d65_width' => { }, + 'r2_d65_height' => { }, + 'r2_d65_intervals' => { }, + 'r2_d65_tbl[0]' => { }, + 'r2_d65_tbl[1]' => { }, + 'r2_d65_tbl[2]' => { }, + 'r2_d65_tbl[3]' => { }, + 'r2_d65_tbl[4]' => { }, + 'r2_d65_tbl[5]' => { }, + 'r2_d65_tbl[6]' => { }, + 'r2_d65_tbl[7]' => { }, + 'r2_d65_tbl[8]' => { }, + 'r2_d65_tbl[9]' => { }, + 'r2_d65_tbl[10]' => { }, + 'r2_d65_tbl[11]' => { }, + 'r2_d65_tbl[12]' => { }, + 'r2_d65_tbl[13]' => { }, + 'r2_d65_tbl[14]' => { }, + 'r2_d65_tbl[15]' => { }, + 'r2_d65_tbl[16]' => { }, + 'r2_d65_tbl[17]' => { }, + 'r2_d65_tbl[18]' => { }, + 'r2_d65_tbl[19]' => { }, + 'r2_d65_tbl[20]' => { }, + 'r2_d65_tbl[21]' => { }, + 'r2_d65_tbl[22]' => { }, + 'r2_d65_tbl[23]' => { }, + 'r2_d65_tbl[24]' => { }, + 'r2_d65_tbl[25]' => { }, + 'r2_d65_tbl[26]' => { }, + 'r2_d65_tbl[27]' => { }, + 'r2_d65_tbl[28]' => { }, + 'r2_d65_tbl[29]' => { }, + 'r2_d65_tbl[30]' => { }, + 'r2_d65_tbl[31]' => { }, + 'r2_d65_red_ctbl[0]' => { }, + 'r2_d65_red_ctbl[1]' => { }, + 'r2_d65_red_ctbl[2]' => { }, + 'r2_d65_red_ctbl[3]' => { }, + 'r2_d65_red_ctbl[4]' => { }, + 'r2_d65_red_ctbl[5]' => { }, + 'r2_d65_red_ctbl[6]' => { }, + 'r2_d65_red_ctbl[7]' => { }, + 'r2_d65_red_ctbl[8]' => { }, + 'r2_d65_red_ctbl[9]' => { }, + 'r2_d65_red_ctbl[10]' => { }, + 'r2_d65_red_ctbl[11]' => { }, + 'r2_d65_red_ctbl[12]' => { }, + 'r2_d65_red_ctbl[13]' => { }, + 'r2_d65_red_ctbl[14]' => { }, + 'r2_d65_red_ctbl[15]' => { }, + 'r2_d65_red_ctbl[16]' => { }, + 'r2_d65_red_ctbl[17]' => { }, + 'r2_d65_red_ctbl[18]' => { }, + 'r2_d65_red_ctbl[19]' => { }, + 'r2_d65_red_ctbl[20]' => { }, + 'r2_d65_red_ctbl[21]' => { }, + 'r2_d65_red_ctbl[22]' => { }, + 'r2_d65_red_ctbl[23]' => { }, + 'r2_d65_red_ctbl[24]' => { }, + 'r2_d65_red_ctbl[25]' => { }, + 'r2_d65_red_ctbl[26]' => { }, + 'r2_d65_red_ctbl[27]' => { }, + 'r2_d65_red_ctbl[28]' => { }, + 'r2_d65_red_ctbl[29]' => { }, + 'r2_d65_red_ctbl[30]' => { }, + 'r2_d65_red_ctbl[31]' => { }, + 'r2_d65_green_ctbl[0]' => { }, + 'r2_d65_green_ctbl[1]' => { }, + 'r2_d65_green_ctbl[2]' => { }, + 'r2_d65_green_ctbl[3]' => { }, + 'r2_d65_green_ctbl[4]' => { }, + 'r2_d65_green_ctbl[5]' => { }, + 'r2_d65_green_ctbl[6]' => { }, + 'r2_d65_green_ctbl[7]' => { }, + 'r2_d65_green_ctbl[8]' => { }, + 'r2_d65_green_ctbl[9]' => { }, + 'r2_d65_green_ctbl[10]' => { }, + 'r2_d65_green_ctbl[11]' => { }, + 'r2_d65_green_ctbl[12]' => { }, + 'r2_d65_green_ctbl[13]' => { }, + 'r2_d65_green_ctbl[14]' => { }, + 'r2_d65_green_ctbl[15]' => { }, + 'r2_d65_green_ctbl[16]' => { }, + 'r2_d65_green_ctbl[17]' => { }, + 'r2_d65_green_ctbl[18]' => { }, + 'r2_d65_green_ctbl[19]' => { }, + 'r2_d65_green_ctbl[20]' => { }, + 'r2_d65_green_ctbl[21]' => { }, + 'r2_d65_green_ctbl[22]' => { }, + 'r2_d65_green_ctbl[23]' => { }, + 'r2_d65_green_ctbl[24]' => { }, + 'r2_d65_green_ctbl[25]' => { }, + 'r2_d65_green_ctbl[26]' => { }, + 'r2_d65_green_ctbl[27]' => { }, + 'r2_d65_green_ctbl[28]' => { }, + 'r2_d65_green_ctbl[29]' => { }, + 'r2_d65_green_ctbl[30]' => { }, + 'r2_d65_green_ctbl[31]' => { }, + 'r2_d65_blue_ctbl[0]' => { }, + 'r2_d65_blue_ctbl[1]' => { }, + 'r2_d65_blue_ctbl[2]' => { }, + 'r2_d65_blue_ctbl[3]' => { }, + 'r2_d65_blue_ctbl[4]' => { }, + 'r2_d65_blue_ctbl[5]' => { }, + 'r2_d65_blue_ctbl[6]' => { }, + 'r2_d65_blue_ctbl[7]' => { }, + 'r2_d65_blue_ctbl[8]' => { }, + 'r2_d65_blue_ctbl[9]' => { }, + 'r2_d65_blue_ctbl[10]' => { }, + 'r2_d65_blue_ctbl[11]' => { }, + 'r2_d65_blue_ctbl[12]' => { }, + 'r2_d65_blue_ctbl[13]' => { }, + 'r2_d65_blue_ctbl[14]' => { }, + 'r2_d65_blue_ctbl[15]' => { }, + 'r2_d65_blue_ctbl[16]' => { }, + 'r2_d65_blue_ctbl[17]' => { }, + 'r2_d65_blue_ctbl[18]' => { }, + 'r2_d65_blue_ctbl[19]' => { }, + 'r2_d65_blue_ctbl[20]' => { }, + 'r2_d65_blue_ctbl[21]' => { }, + 'r2_d65_blue_ctbl[22]' => { }, + 'r2_d65_blue_ctbl[23]' => { }, + 'r2_d65_blue_ctbl[24]' => { }, + 'r2_d65_blue_ctbl[25]' => { }, + 'r2_d65_blue_ctbl[26]' => { }, + 'r2_d65_blue_ctbl[27]' => { }, + 'r2_d65_blue_ctbl[28]' => { }, + 'r2_d65_blue_ctbl[29]' => { }, + 'r2_d65_blue_ctbl[30]' => { }, + 'r2_d65_blue_ctbl[31]' => { }, + 'r2_d65_red_stbl[0]' => { }, + 'r2_d65_red_stbl[1]' => { }, + 'r2_d65_red_stbl[2]' => { }, + 'r2_d65_red_stbl[3]' => { }, + 'r2_d65_red_stbl[4]' => { }, + 'r2_d65_red_stbl[5]' => { }, + 'r2_d65_red_stbl[6]' => { }, + 'r2_d65_red_stbl[7]' => { }, + 'r2_d65_red_stbl[8]' => { }, + 'r2_d65_red_stbl[9]' => { }, + 'r2_d65_red_stbl[10]' => { }, + 'r2_d65_red_stbl[11]' => { }, + 'r2_d65_red_stbl[12]' => { }, + 'r2_d65_red_stbl[13]' => { }, + 'r2_d65_red_stbl[14]' => { }, + 'r2_d65_red_stbl[15]' => { }, + 'r2_d65_red_stbl[16]' => { }, + 'r2_d65_red_stbl[17]' => { }, + 'r2_d65_red_stbl[18]' => { }, + 'r2_d65_red_stbl[19]' => { }, + 'r2_d65_red_stbl[20]' => { }, + 'r2_d65_red_stbl[21]' => { }, + 'r2_d65_red_stbl[22]' => { }, + 'r2_d65_red_stbl[23]' => { }, + 'r2_d65_red_stbl[24]' => { }, + 'r2_d65_red_stbl[25]' => { }, + 'r2_d65_red_stbl[26]' => { }, + 'r2_d65_red_stbl[27]' => { }, + 'r2_d65_red_stbl[28]' => { }, + 'r2_d65_red_stbl[29]' => { }, + 'r2_d65_red_stbl[30]' => { }, + 'r2_d65_red_stbl[31]' => { }, + 'r2_d65_blue_stbl[0]' => { }, + 'r2_d65_blue_stbl[1]' => { }, + 'r2_d65_blue_stbl[2]' => { }, + 'r2_d65_blue_stbl[3]' => { }, + 'r2_d65_blue_stbl[4]' => { }, + 'r2_d65_blue_stbl[5]' => { }, + 'r2_d65_blue_stbl[6]' => { }, + 'r2_d65_blue_stbl[7]' => { }, + 'r2_d65_blue_stbl[8]' => { }, + 'r2_d65_blue_stbl[9]' => { }, + 'r2_d65_blue_stbl[10]' => { }, + 'r2_d65_blue_stbl[11]' => { }, + 'r2_d65_blue_stbl[12]' => { }, + 'r2_d65_blue_stbl[13]' => { }, + 'r2_d65_blue_stbl[14]' => { }, + 'r2_d65_blue_stbl[15]' => { }, + 'r2_d65_blue_stbl[16]' => { }, + 'r2_d65_blue_stbl[17]' => { }, + 'r2_d65_blue_stbl[18]' => { }, + 'r2_d65_blue_stbl[19]' => { }, + 'r2_d65_blue_stbl[20]' => { }, + 'r2_d65_blue_stbl[21]' => { }, + 'r2_d65_blue_stbl[22]' => { }, + 'r2_d65_blue_stbl[23]' => { }, + 'r2_d65_blue_stbl[24]' => { }, + 'r2_d65_blue_stbl[25]' => { }, + 'r2_d65_blue_stbl[26]' => { }, + 'r2_d65_blue_stbl[27]' => { }, + 'r2_d65_blue_stbl[28]' => { }, + 'r2_d65_blue_stbl[29]' => { }, + 'r2_d65_blue_stbl[30]' => { }, + 'r2_d65_blue_stbl[31]' => { }, + 'r2_d65_green_stbl[0]' => { }, + 'r2_d65_green_stbl[1]' => { }, + 'r2_d65_green_stbl[2]' => { }, + 'r2_d65_green_stbl[3]' => { }, + 'r2_d65_green_stbl[4]' => { }, + 'r2_d65_green_stbl[5]' => { }, + 'r2_d65_green_stbl[6]' => { }, + 'r2_d65_green_stbl[7]' => { }, + 'r2_d65_green_stbl[8]' => { }, + 'r2_d65_green_stbl[9]' => { }, + 'r2_d65_green_stbl[10]' => { }, + 'r2_d65_green_stbl[11]' => { }, + 'r2_d65_green_stbl[12]' => { }, + 'r2_d65_green_stbl[13]' => { }, + 'r2_d65_green_stbl[14]' => { }, + 'r2_d65_green_stbl[15]' => { }, + 'r2_d65_green_stbl[16]' => { }, + 'r2_d65_green_stbl[17]' => { }, + 'r2_d65_green_stbl[18]' => { }, + 'r2_d65_green_stbl[19]' => { }, + 'r2_d65_green_stbl[20]' => { }, + 'r2_d65_green_stbl[21]' => { }, + 'r2_d65_green_stbl[22]' => { }, + 'r2_d65_green_stbl[23]' => { }, + 'r2_d65_green_stbl[24]' => { }, + 'r2_d65_green_stbl[25]' => { }, + 'r2_d65_green_stbl[26]' => { }, + 'r2_d65_green_stbl[27]' => { }, + 'r2_d65_green_stbl[28]' => { }, + 'r2_d65_green_stbl[29]' => { }, + 'r2_d65_green_stbl[30]' => { }, + 'r2_d65_green_stbl[31]' => { }, + 'r2_a_cx' => { }, + 'r2_a_cy' => { }, + 'r2_a_width' => { }, + 'r2_a_height' => { }, + 'r2_a_intervals' => { }, + 'r2_a_tbl[0]' => { }, + 'r2_a_tbl[1]' => { }, + 'r2_a_tbl[2]' => { }, + 'r2_a_tbl[3]' => { }, + 'r2_a_tbl[4]' => { }, + 'r2_a_tbl[5]' => { }, + 'r2_a_tbl[6]' => { }, + 'r2_a_tbl[7]' => { }, + 'r2_a_tbl[8]' => { }, + 'r2_a_tbl[9]' => { }, + 'r2_a_tbl[10]' => { }, + 'r2_a_tbl[11]' => { }, + 'r2_a_tbl[12]' => { }, + 'r2_a_tbl[13]' => { }, + 'r2_a_tbl[14]' => { }, + 'r2_a_tbl[15]' => { }, + 'r2_a_tbl[16]' => { }, + 'r2_a_tbl[17]' => { }, + 'r2_a_tbl[18]' => { }, + 'r2_a_tbl[19]' => { }, + 'r2_a_tbl[20]' => { }, + 'r2_a_tbl[21]' => { }, + 'r2_a_tbl[22]' => { }, + 'r2_a_tbl[23]' => { }, + 'r2_a_tbl[24]' => { }, + 'r2_a_tbl[25]' => { }, + 'r2_a_tbl[26]' => { }, + 'r2_a_tbl[27]' => { }, + 'r2_a_tbl[28]' => { }, + 'r2_a_tbl[29]' => { }, + 'r2_a_tbl[30]' => { }, + 'r2_a_tbl[31]' => { }, + 'r2_a_red_ctbl[0]' => { }, + 'r2_a_red_ctbl[1]' => { }, + 'r2_a_red_ctbl[2]' => { }, + 'r2_a_red_ctbl[3]' => { }, + 'r2_a_red_ctbl[4]' => { }, + 'r2_a_red_ctbl[5]' => { }, + 'r2_a_red_ctbl[6]' => { }, + 'r2_a_red_ctbl[7]' => { }, + 'r2_a_red_ctbl[8]' => { }, + 'r2_a_red_ctbl[9]' => { }, + 'r2_a_red_ctbl[10]' => { }, + 'r2_a_red_ctbl[11]' => { }, + 'r2_a_red_ctbl[12]' => { }, + 'r2_a_red_ctbl[13]' => { }, + 'r2_a_red_ctbl[14]' => { }, + 'r2_a_red_ctbl[15]' => { }, + 'r2_a_red_ctbl[16]' => { }, + 'r2_a_red_ctbl[17]' => { }, + 'r2_a_red_ctbl[18]' => { }, + 'r2_a_red_ctbl[19]' => { }, + 'r2_a_red_ctbl[20]' => { }, + 'r2_a_red_ctbl[21]' => { }, + 'r2_a_red_ctbl[22]' => { }, + 'r2_a_red_ctbl[23]' => { }, + 'r2_a_red_ctbl[24]' => { }, + 'r2_a_red_ctbl[25]' => { }, + 'r2_a_red_ctbl[26]' => { }, + 'r2_a_red_ctbl[27]' => { }, + 'r2_a_red_ctbl[28]' => { }, + 'r2_a_red_ctbl[29]' => { }, + 'r2_a_red_ctbl[30]' => { }, + 'r2_a_red_ctbl[31]' => { }, + 'r2_a_green_ctbl[0]' => { }, + 'r2_a_green_ctbl[1]' => { }, + 'r2_a_green_ctbl[2]' => { }, + 'r2_a_green_ctbl[3]' => { }, + 'r2_a_green_ctbl[4]' => { }, + 'r2_a_green_ctbl[5]' => { }, + 'r2_a_green_ctbl[6]' => { }, + 'r2_a_green_ctbl[7]' => { }, + 'r2_a_green_ctbl[8]' => { }, + 'r2_a_green_ctbl[9]' => { }, + 'r2_a_green_ctbl[10]' => { }, + 'r2_a_green_ctbl[11]' => { }, + 'r2_a_green_ctbl[12]' => { }, + 'r2_a_green_ctbl[13]' => { }, + 'r2_a_green_ctbl[14]' => { }, + 'r2_a_green_ctbl[15]' => { }, + 'r2_a_green_ctbl[16]' => { }, + 'r2_a_green_ctbl[17]' => { }, + 'r2_a_green_ctbl[18]' => { }, + 'r2_a_green_ctbl[19]' => { }, + 'r2_a_green_ctbl[20]' => { }, + 'r2_a_green_ctbl[21]' => { }, + 'r2_a_green_ctbl[22]' => { }, + 'r2_a_green_ctbl[23]' => { }, + 'r2_a_green_ctbl[24]' => { }, + 'r2_a_green_ctbl[25]' => { }, + 'r2_a_green_ctbl[26]' => { }, + 'r2_a_green_ctbl[27]' => { }, + 'r2_a_green_ctbl[28]' => { }, + 'r2_a_green_ctbl[29]' => { }, + 'r2_a_green_ctbl[30]' => { }, + 'r2_a_green_ctbl[31]' => { }, + 'r2_a_blue_ctbl[0]' => { }, + 'r2_a_blue_ctbl[1]' => { }, + 'r2_a_blue_ctbl[2]' => { }, + 'r2_a_blue_ctbl[3]' => { }, + 'r2_a_blue_ctbl[4]' => { }, + 'r2_a_blue_ctbl[5]' => { }, + 'r2_a_blue_ctbl[6]' => { }, + 'r2_a_blue_ctbl[7]' => { }, + 'r2_a_blue_ctbl[8]' => { }, + 'r2_a_blue_ctbl[9]' => { }, + 'r2_a_blue_ctbl[10]' => { }, + 'r2_a_blue_ctbl[11]' => { }, + 'r2_a_blue_ctbl[12]' => { }, + 'r2_a_blue_ctbl[13]' => { }, + 'r2_a_blue_ctbl[14]' => { }, + 'r2_a_blue_ctbl[15]' => { }, + 'r2_a_blue_ctbl[16]' => { }, + 'r2_a_blue_ctbl[17]' => { }, + 'r2_a_blue_ctbl[18]' => { }, + 'r2_a_blue_ctbl[19]' => { }, + 'r2_a_blue_ctbl[20]' => { }, + 'r2_a_blue_ctbl[21]' => { }, + 'r2_a_blue_ctbl[22]' => { }, + 'r2_a_blue_ctbl[23]' => { }, + 'r2_a_blue_ctbl[24]' => { }, + 'r2_a_blue_ctbl[25]' => { }, + 'r2_a_blue_ctbl[26]' => { }, + 'r2_a_blue_ctbl[27]' => { }, + 'r2_a_blue_ctbl[28]' => { }, + 'r2_a_blue_ctbl[29]' => { }, + 'r2_a_blue_ctbl[30]' => { }, + 'r2_a_blue_ctbl[31]' => { }, + 'r2_a_red_stbl[0]' => { }, + 'r2_a_red_stbl[1]' => { }, + 'r2_a_red_stbl[2]' => { }, + 'r2_a_red_stbl[3]' => { }, + 'r2_a_red_stbl[4]' => { }, + 'r2_a_red_stbl[5]' => { }, + 'r2_a_red_stbl[6]' => { }, + 'r2_a_red_stbl[7]' => { }, + 'r2_a_red_stbl[8]' => { }, + 'r2_a_red_stbl[9]' => { }, + 'r2_a_red_stbl[10]' => { }, + 'r2_a_red_stbl[11]' => { }, + 'r2_a_red_stbl[12]' => { }, + 'r2_a_red_stbl[13]' => { }, + 'r2_a_red_stbl[14]' => { }, + 'r2_a_red_stbl[15]' => { }, + 'r2_a_red_stbl[16]' => { }, + 'r2_a_red_stbl[17]' => { }, + 'r2_a_red_stbl[18]' => { }, + 'r2_a_red_stbl[19]' => { }, + 'r2_a_red_stbl[20]' => { }, + 'r2_a_red_stbl[21]' => { }, + 'r2_a_red_stbl[22]' => { }, + 'r2_a_red_stbl[23]' => { }, + 'r2_a_red_stbl[24]' => { }, + 'r2_a_red_stbl[25]' => { }, + 'r2_a_red_stbl[26]' => { }, + 'r2_a_red_stbl[27]' => { }, + 'r2_a_red_stbl[28]' => { }, + 'r2_a_red_stbl[29]' => { }, + 'r2_a_red_stbl[30]' => { }, + 'r2_a_red_stbl[31]' => { }, + 'r2_a_blue_stbl[0]' => { }, + 'r2_a_blue_stbl[1]' => { }, + 'r2_a_blue_stbl[2]' => { }, + 'r2_a_blue_stbl[3]' => { }, + 'r2_a_blue_stbl[4]' => { }, + 'r2_a_blue_stbl[5]' => { }, + 'r2_a_blue_stbl[6]' => { }, + 'r2_a_blue_stbl[7]' => { }, + 'r2_a_blue_stbl[8]' => { }, + 'r2_a_blue_stbl[9]' => { }, + 'r2_a_blue_stbl[10]' => { }, + 'r2_a_blue_stbl[11]' => { }, + 'r2_a_blue_stbl[12]' => { }, + 'r2_a_blue_stbl[13]' => { }, + 'r2_a_blue_stbl[14]' => { }, + 'r2_a_blue_stbl[15]' => { }, + 'r2_a_blue_stbl[16]' => { }, + 'r2_a_blue_stbl[17]' => { }, + 'r2_a_blue_stbl[18]' => { }, + 'r2_a_blue_stbl[19]' => { }, + 'r2_a_blue_stbl[20]' => { }, + 'r2_a_blue_stbl[21]' => { }, + 'r2_a_blue_stbl[22]' => { }, + 'r2_a_blue_stbl[23]' => { }, + 'r2_a_blue_stbl[24]' => { }, + 'r2_a_blue_stbl[25]' => { }, + 'r2_a_blue_stbl[26]' => { }, + 'r2_a_blue_stbl[27]' => { }, + 'r2_a_blue_stbl[28]' => { }, + 'r2_a_blue_stbl[29]' => { }, + 'r2_a_blue_stbl[30]' => { }, + 'r2_a_blue_stbl[31]' => { }, + 'r2_a_green_stbl[0]' => { }, + 'r2_a_green_stbl[1]' => { }, + 'r2_a_green_stbl[2]' => { }, + 'r2_a_green_stbl[3]' => { }, + 'r2_a_green_stbl[4]' => { }, + 'r2_a_green_stbl[5]' => { }, + 'r2_a_green_stbl[6]' => { }, + 'r2_a_green_stbl[7]' => { }, + 'r2_a_green_stbl[8]' => { }, + 'r2_a_green_stbl[9]' => { }, + 'r2_a_green_stbl[10]' => { }, + 'r2_a_green_stbl[11]' => { }, + 'r2_a_green_stbl[12]' => { }, + 'r2_a_green_stbl[13]' => { }, + 'r2_a_green_stbl[14]' => { }, + 'r2_a_green_stbl[15]' => { }, + 'r2_a_green_stbl[16]' => { }, + 'r2_a_green_stbl[17]' => { }, + 'r2_a_green_stbl[18]' => { }, + 'r2_a_green_stbl[19]' => { }, + 'r2_a_green_stbl[20]' => { }, + 'r2_a_green_stbl[21]' => { }, + 'r2_a_green_stbl[22]' => { }, + 'r2_a_green_stbl[23]' => { }, + 'r2_a_green_stbl[24]' => { }, + 'r2_a_green_stbl[25]' => { }, + 'r2_a_green_stbl[26]' => { }, + 'r2_a_green_stbl[27]' => { }, + 'r2_a_green_stbl[28]' => { }, + 'r2_a_green_stbl[29]' => { }, + 'r2_a_green_stbl[30]' => { }, + 'r2_a_green_stbl[31]' => { }, + 'def_cor_c0' => { }, + 'def_cor_c1' => { }, + 'def_cor_c2' => { }, + 'def_cor_c3' => { }, + 'def_cor_c4' => { }, + 'def_cor_c5' => { }, + 'def_cor_c6' => { }, + 'def_cor_c7' => { }, + 'def_cor_c8' => { }, + 'def_cor_k0' => { }, + 'def_cor_k1' => { }, + 'def_cor_k2' => { }, + 'yhi_ylo_cor_c0' => { }, + 'yhi_ylo_cor_c1' => { }, + 'yhi_ylo_cor_c2' => { }, + 'yhi_ylo_cor_c3' => { }, + 'yhi_ylo_cor_c4' => { }, + 'yhi_ylo_cor_c5' => { }, + 'yhi_ylo_cor_c6' => { }, + 'yhi_ylo_cor_c7' => { }, + 'yhi_ylo_cor_c8' => { }, + 'yhi_ylo_cor_k0' => { }, + 'yhi_ylo_cor_k1' => { }, + 'yhi_ylo_cor_k2' => { }, + 'def_conv_chrm_a_m' => { }, + 'def_conv_chrm_a_p' => { }, + 'def_conv_chrm_b_m' => { }, + 'def_conv_chrm_b_p' => { }, + 'def_conv_chrm_c_m' => { }, + 'def_conv_chrm_c_p' => { }, + 'def_conv_chrm_d_m' => { }, + 'def_conv_chrm_d_p' => { }, + 'def_conv_chrm_k_cb' => { }, + 'def_conv_chrm_k_cr' => { }, + 'def_conv_luma_v0' => { }, + 'def_conv_luma_v1' => { }, + 'def_conv_luma_v2' => { }, + 'def_conv_luma_k' => { }, + 'tl84_conv_chrm_a_m' => { }, + 'tl84_conv_chrm_a_p' => { }, + 'tl84_conv_chrm_b_m' => { }, + 'tl84_conv_chrm_b_p' => { }, + 'tl84_conv_chrm_c_m' => { }, + 'tl84_conv_chrm_c_p' => { }, + 'tl84_conv_chrm_d_m' => { }, + 'tl84_conv_chrm_d_p' => { }, + 'tl84_conv_chrm_k_cb' => { }, + 'tl84_conv_chrm_k_cr' => { }, + 'tl84_conv_luma_v0' => { }, + 'tl84_conv_luma_v1' => { }, + 'tl84_conv_luma_v2' => { }, + 'tl84_conv_luma_k' => { }, + 'incand_conv_chrm_a_m' => { }, + 'incand_conv_chrm_a_p' => { }, + 'incand_conv_chrm_b_m' => { }, + 'incand_conv_chrm_b_p' => { }, + 'incand_conv_chrm_c_m' => { }, + 'incand_conv_chrm_c_p' => { }, + 'incand_conv_chrm_d_m' => { }, + 'incand_conv_chrm_d_p' => { }, + 'incand_conv_chrm_k_cb' => { }, + 'incand_conv_chrm_k_cr' => { }, + 'incand_conv_luma_v0' => { }, + 'incand_conv_luma_v1' => { }, + 'incand_conv_luma_v2' => { }, + 'incand_conv_luma_k' => { }, + 'daylt_conv_chrm_a_m' => { }, + 'daylt_conv_chrm_a_p' => { }, + 'daylt_conv_chrm_b_m' => { }, + 'daylt_conv_chrm_b_p' => { }, + 'daylt_conv_chrm_c_m' => { }, + 'daylt_conv_chrm_c_p' => { }, + 'daylt_conv_chrm_d_m' => { }, + 'daylt_conv_chrm_d_p' => { }, + 'daylt_conv_chrm_k_cb' => { }, + 'daylt_conv_chrm_k_cr' => { }, + 'daylt_conv_luma_v0' => { }, + 'daylt_conv_luma_v1' => { }, + 'daylt_conv_luma_v2' => { }, + 'daylt_conv_luma_k' => { }, + 'yhi_ylo_conv_chrm_a_m' => { }, + 'yhi_ylo_conv_chrm_a_p' => { }, + 'yhi_ylo_conv_chrm_b_m' => { }, + 'yhi_ylo_conv_chrm_b_p' => { }, + 'yhi_ylo_conv_chrm_c_m' => { }, + 'yhi_ylo_conv_chrm_c_p' => { }, + 'yhi_ylo_conv_chrm_d_m' => { }, + 'yhi_ylo_conv_chrm_d_p' => { }, + 'yhi_ylo_conv_chrm_k_cb' => { }, + 'yhi_ylo_conv_chrm_k_cr' => { }, + 'yhi_ylo_conv_luma_v0' => { }, + 'yhi_ylo_conv_luma_v1' => { }, + 'yhi_ylo_conv_luma_v2' => { }, + 'yhi_ylo_conv_luma_k' => { }, + 'gamma_enable' => { }, + 'def_luma_gamma_mode' => { }, + 'def_rgb_gamma_mode' => { }, + 'blck_lvl_even_cols' => { }, + 'blck_lvl_odd_cols' => { }, + 'defect_pix_min_thresh' => { }, + 'defect_pix_max_thresh' => { }, + 'defect_pix_cor_enable' => { }, + 'prview_resol' => { }, + 'snapshot_resol' => { }, + 'curr_resol' => { }, + 'sensor_fmt' => { }, + 'discard_frst_frm' => { }, + 'frm_skip_pttrn' => { }, + 'sensor_type' => { }, + 'max_video_fps' => { }, + 'video_fps' => { }, + 'max_prview_fps' => { }, + 'prview_fps' => { }, + 'nghtsht_fps' => { }, + 'sensr_ful_wdth' => { }, + 'sensr_ful_hght' => { }, + 'sensr_qtr_wdth' => { }, + 'sensr_qtr_hght' => { }, + 'nightshot_mode' => { }, + 'pclk_invert' => { }, + 'cam_mclk_hz' => { }, + 'chrom_supress' => { }, + 'chro_sup_luma_thres_1' => { }, + 'chro_sup_luma_thres_2' => { }, + 'chro_sup_luma_thres_3' => { }, + 'chro_sup_luma_thres_4' => { }, + 'chro_sup_chro_thres_1' => { }, + 'chro_sup_chro_thres_2' => { }, + 'la_detect' => { }, + 'la_enable' => { }, + 'HJR_enable' => { }, + 'HJR_max_num_frames' => { }, + 'HJR_one_to_two_offset' => { }, + 'HJR_n_reduction_flat' => { }, + 'HJR_n_reduction_texture' => { }, + 'HJR_texture_threshold' => { }, +); + +# generate tag names and descriptions +{ + local $_; + my $table = \%Image::ExifTool::Qualcomm::Main; + MakeNameAndDesc($_, $$table{$_}) foreach TagTableKeys($table); +} + +#------------------------------------------------------------------------------ +# Generate tag Name and Description from a Qualcomm tag ID +# Inputs: 0) tag ID, 1) tagInfo ref +# Returns: true on success +sub MakeNameAndDesc($$) +{ + local $_ = shift; + my $tagInfo = shift; + # capitalize various leading acronyms or just first letter... + s/^(asf|awb|aec|afr|af_|la_|r2_tl|tl)/\U$1/ or $_ = ucfirst; + s/_([a-z])/_\u$1/g; # capitalize first letter of each word + s/\[(\d+)\]$/sprintf("_%.2d",$1)/e; # use 2-digit subscripts (and remove brackets) + tr/-_a-zA-Z0-9//dc; # delete invalid characters + my $desc = $_; + # convert underlines to spaces in description + if ($desc =~ tr/_/ /) { + # remove unnecessary underlines from tag name... + s/_([A-Z][a-z])/$1/g; + s/([a-z0-9])_([A-Z])/$1$2/g; + s/([A-Za-z])_(\d)/$1$2/g; + } + return 0 unless length; + $$tagInfo{Name} = $_; + $$tagInfo{Description} = $desc; + return 1; +} + +#------------------------------------------------------------------------------ +# Process Qualcomm APP7 metadata (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessQualcomm($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $pos = $$dirInfo{DirStart}; + my $dirEnd = $pos + $$dirInfo{DirLen}; + + $et->VerboseDir('Qualcomm', undef, $$dirInfo{DirLen}); + SetByteOrder('II'); + + while ($pos + 3 < $dirEnd) { + my $valLen = Get16u($dataPt, $pos); + my $tagLen = Get8u($dataPt, $pos + 2); + last if $pos + 8 + $tagLen + $valLen > $dirEnd; + my $tag = substr($$dataPt, $pos + 3, $tagLen); + $pos += 3 + $tagLen; # point to format byte + my $fmt = Get8u($dataPt, $pos); + # (not sure what these counts are for -- both are always 1 in my samples) + #my $cnt1 = Get16u($dataPt, $pos + 1); + #my $cnt2 = Get16u($dataPt, $pos + 3); + $pos += 5; # point to start of value data + my ($val, $format); + if ($fmt <= 7) { + $format = $qualcommFormat[$fmt]; + $val = ReadValue($dataPt, $pos, $format, undef, $valLen); + } else { + $format = "format $fmt"; + my $value = substr($$dataPt, $pos, $valLen); + $val = \$value; + } + unless (defined $$tagTablePtr{$tag} or $Image::ExifTool::specialTags{$tag}) { + my %tagInfo; + if (MakeNameAndDesc($tag, \%tagInfo)) { + $et->VPrint(0, $$et{INDENT}, "[adding Qualcomm:$tagInfo{Name}]\n"); + AddTagToTable($tagTablePtr, $tag, \%tagInfo); + } + } + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $pos, + Size => $valLen, + Format => $format, + ); + $pos += $valLen; # point to start of next entry + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Qualcomm - Read Qualcomm APP7 meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read +information from the APP7 Qualcomm segment in JPEG images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Qualcomm Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/QuickTime.pm b/lib/Image/ExifTool/QuickTime.pm new file mode 100644 index 0000000..bef15cc --- /dev/null +++ b/lib/Image/ExifTool/QuickTime.pm @@ -0,0 +1,9733 @@ +#------------------------------------------------------------------------------ +# File: QuickTime.pm +# +# Description: Read QuickTime and MP4 meta information +# +# Revisions: 10/04/2005 - P. Harvey Created +# 12/19/2005 - P. Harvey Added MP4 support +# 09/22/2006 - P. Harvey Added M4A support +# 07/27/2010 - P. Harvey Updated to 2010-05-03 QuickTime spec +# +# References: +# +# 1) http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html +# 2) http://search.cpan.org/dist/MP4-Info-1.04/ +# 3) http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt +# 4) http://wiki.multimedia.cx/index.php?title=Apple_QuickTime +# 5) ISO 14496-12 (http://read.pudn.com/downloads64/ebook/226547/ISO_base_media_file_format.pdf) +# 6) ISO 14496-16 (http://www.iec-normen.de/previewpdf/info_isoiec14496-16%7Bed2.0%7Den.pdf) +# 7) http://atomicparsley.sourceforge.net/mpeg-4files.html +# 8) http://wiki.multimedia.cx/index.php?title=QuickTime_container +# 9) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf (Oct 2008) +# 10) http://code.google.com/p/mp4v2/wiki/iTunesMetadata +# 11) http://www.canieti.com.mx/assets/files/1011/IEC_100_1384_DC.pdf +# 12) QuickTime file format specification 2010-05-03 +# 13) http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf +# 14) http://standards.iso.org/ittf/PubliclyAvailableStandards/c051533_ISO_IEC_14496-12_2008.zip +# 15) http://getid3.sourceforge.net/source/module.audio-video.quicktime.phps +# 16) http://qtra.apple.com/atoms.html +# 17) http://www.etsi.org/deliver/etsi_ts/126200_126299/126244/10.01.00_60/ts_126244v100100p.pdf +# 18) https://github.com/appsec-labs/iNalyzer/blob/master/scinfo.m +# 19) http://nah6.com/~itsme/cvs-xdadevtools/iphone/tools/decodesinf.pl +# 20) https://developer.apple.com/legacy/library/documentation/quicktime/reference/QT7-1_Update_Reference/QT7-1_Update_Reference.pdf +# 21) Francois Bonzon private communication +# 22) https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html +# 23) http://atomicparsley.sourceforge.net/mpeg-4files.html +# 24) https://github.com/sergiomb2/libmp4v2/wiki/iTunesMetadata +# 25) https://cconcolato.github.io/mp4ra/atoms.html +# 26) https://github.com/SamsungVR/android_upload_sdk/blob/master/SDKLib/src/main/java/com/samsung/msca/samsungvr/sdk/UserVideo.java +# 27) https://exiftool.org/forum/index.php?topic=11517.0 +#------------------------------------------------------------------------------ + +package Image::ExifTool::QuickTime; + +use strict; +use vars qw($VERSION $AUTOLOAD %stringEncoding); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::GPS; + +$VERSION = '2.75'; + +sub ProcessMOV($$;$); +sub ProcessKeys($$$); +sub ProcessMetaKeys($$$); +sub ProcessMetaData($$$); +sub ProcessEncodingParams($$$); +sub ProcessSampleDesc($$$); +sub ProcessHybrid($$$); +sub ProcessRights($$$); +# ++vvvvvvvvvvvv++ (in QuickTimeStream.pl) +sub Process_mebx($$$); +sub Process_3gf($$$); +sub Process_gps0($$$); +sub Process_gsen($$$); +sub ProcessRIFFTrailer($$$); +sub ProcessTTAD($$$); +sub ProcessNMEA($$$); +sub ProcessGPSLog($$$); +sub SaveMetaKeys($$$); +# ++^^^^^^^^^^^^++ +sub ParseItemLocation($$); +sub ParseContentDescribes($$); +sub ParseItemInfoEntry($$); +sub ParseItemPropAssoc($$); +sub FixWrongFormat($); +sub GetMatrixStructure($$); +sub ConvertISO6709($); +sub ConvInvISO6709($); +sub ConvertChapterList($); +sub PrintChapter($); +sub PrintGPSCoordinates($); +sub PrintInvGPSCoordinates($); +sub UnpackLang($;$); +sub WriteKeys($$$); +sub WriteQuickTime($$$); +sub WriteMOV($$); +sub GetLangInfo($$); +sub CheckQTValue($$$); + +# MIME types for all entries in the ftypLookup with file extensions +# (defaults to 'video/mp4' if not found in this lookup) +my %mimeLookup = ( + '3G2' => 'video/3gpp2', + '3GP' => 'video/3gpp', + AAX => 'audio/vnd.audible.aax', + DVB => 'video/vnd.dvb.file', + F4A => 'audio/mp4', + F4B => 'audio/mp4', + JP2 => 'image/jp2', + JPM => 'image/jpm', + JPX => 'image/jpx', + M4A => 'audio/mp4', + M4B => 'audio/mp4', + M4P => 'audio/mp4', + M4V => 'video/x-m4v', + MOV => 'video/quicktime', + MQV => 'video/quicktime', + HEIC => 'image/heic', + HEVC => 'image/heic-sequence', + HEICS=> 'image/heic-sequence', + HEIF => 'image/heif', + HEIFS=> 'image/heif-sequence', + AVIF => 'image/avif', #PH (NC) + CRX => 'video/x-canon-crx', # (will get overridden) +); + +# look up file type from ftyp atom type, with MIME type in comment if known +# (ref http://www.ftyps.com/) +my %ftypLookup = ( + '3g2a' => '3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-0 V1.0', # video/3gpp2 + '3g2b' => '3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-A V1.0.0', # video/3gpp2 + '3g2c' => '3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-B v1.0', # video/3gpp2 + '3ge6' => '3GPP (.3GP) Release 6 MBMS Extended Presentations', # video/3gpp + '3ge7' => '3GPP (.3GP) Release 7 MBMS Extended Presentations', # video/3gpp + '3gg6' => '3GPP Release 6 General Profile', # video/3gpp + '3gp1' => '3GPP Media (.3GP) Release 1 (probably non-existent)', # video/3gpp + '3gp2' => '3GPP Media (.3GP) Release 2 (probably non-existent)', # video/3gpp + '3gp3' => '3GPP Media (.3GP) Release 3 (probably non-existent)', # video/3gpp + '3gp4' => '3GPP Media (.3GP) Release 4', # video/3gpp + '3gp5' => '3GPP Media (.3GP) Release 5', # video/3gpp + '3gp6' => '3GPP Media (.3GP) Release 6 Basic Profile', # video/3gpp + '3gp6' => '3GPP Media (.3GP) Release 6 Progressive Download', # video/3gpp + '3gp6' => '3GPP Media (.3GP) Release 6 Streaming Servers', # video/3gpp + '3gs7' => '3GPP Media (.3GP) Release 7 Streaming Servers', # video/3gpp + 'aax ' => 'Audible Enhanced Audiobook (.AAX)', #PH + 'avc1' => 'MP4 Base w/ AVC ext [ISO 14496-12:2005]', # video/mp4 + 'CAEP' => 'Canon Digital Camera', + 'caqv' => 'Casio Digital Camera', + 'CDes' => 'Convergent Design', + 'da0a' => 'DMB MAF w/ MPEG Layer II aud, MOT slides, DLS, JPG/PNG/MNG images', + 'da0b' => 'DMB MAF, extending DA0A, with 3GPP timed text, DID, TVA, REL, IPMP', + 'da1a' => 'DMB MAF audio with ER-BSAC audio, JPG/PNG/MNG images', + 'da1b' => 'DMB MAF, extending da1a, with 3GPP timed text, DID, TVA, REL, IPMP', + 'da2a' => 'DMB MAF aud w/ HE-AAC v2 aud, MOT slides, DLS, JPG/PNG/MNG images', + 'da2b' => 'DMB MAF, extending da2a, with 3GPP timed text, DID, TVA, REL, IPMP', + 'da3a' => 'DMB MAF aud with HE-AAC aud, JPG/PNG/MNG images', + 'da3b' => 'DMB MAF, extending da3a w/ BIFS, 3GPP timed text, DID, TVA, REL, IPMP', + 'dmb1' => 'DMB MAF supporting all the components defined in the specification', + 'dmpf' => 'Digital Media Project', # various + 'drc1' => 'Dirac (wavelet compression), encapsulated in ISO base media (MP4)', + 'dv1a' => 'DMB MAF vid w/ AVC vid, ER-BSAC aud, BIFS, JPG/PNG/MNG images, TS', + 'dv1b' => 'DMB MAF, extending dv1a, with 3GPP timed text, DID, TVA, REL, IPMP', + 'dv2a' => 'DMB MAF vid w/ AVC vid, HE-AAC v2 aud, BIFS, JPG/PNG/MNG images, TS', + 'dv2b' => 'DMB MAF, extending dv2a, with 3GPP timed text, DID, TVA, REL, IPMP', + 'dv3a' => 'DMB MAF vid w/ AVC vid, HE-AAC aud, BIFS, JPG/PNG/MNG images, TS', + 'dv3b' => 'DMB MAF, extending dv3a, with 3GPP timed text, DID, TVA, REL, IPMP', + 'dvr1' => 'DVB (.DVB) over RTP', # video/vnd.dvb.file + 'dvt1' => 'DVB (.DVB) over MPEG-2 Transport Stream', # video/vnd.dvb.file + 'F4A ' => 'Audio for Adobe Flash Player 9+ (.F4A)', # audio/mp4 + 'F4B ' => 'Audio Book for Adobe Flash Player 9+ (.F4B)', # audio/mp4 + 'F4P ' => 'Protected Video for Adobe Flash Player 9+ (.F4P)', # video/mp4 + 'F4V ' => 'Video for Adobe Flash Player 9+ (.F4V)', # video/mp4 + 'isc2' => 'ISMACryp 2.0 Encrypted File', # ?/enc-isoff-generic + 'iso2' => 'MP4 Base Media v2 [ISO 14496-12:2005]', # video/mp4 (or audio) + 'iso3' => 'MP4 Base Media v3', # video/mp4 (or audio) + 'iso4' => 'MP4 Base Media v4', # video/mp4 (or audio) + 'iso5' => 'MP4 Base Media v5', # video/mp4 (or audio) + 'iso6' => 'MP4 Base Media v6', # video/mp4 (or audio) + 'iso7' => 'MP4 Base Media v7', # video/mp4 (or audio) + 'iso8' => 'MP4 Base Media v8', # video/mp4 (or audio) + 'iso9' => 'MP4 Base Media v9', # video/mp4 (or audio) + 'isom' => 'MP4 Base Media v1 [IS0 14496-12:2003]', # video/mp4 (or audio) + 'JP2 ' => 'JPEG 2000 Image (.JP2) [ISO 15444-1 ?]', # image/jp2 + 'JP20' => 'Unknown, from GPAC samples (prob non-existent)', + 'jpm ' => 'JPEG 2000 Compound Image (.JPM) [ISO 15444-6]', # image/jpm + 'jpx ' => 'JPEG 2000 with extensions (.JPX) [ISO 15444-2]', # image/jpx + 'KDDI' => '3GPP2 EZmovie for KDDI 3G cellphones', # video/3gpp2 + #LCAG => (found in CompatibleBrands of Leica MOV videos) + 'M4A ' => 'Apple iTunes AAC-LC (.M4A) Audio', # audio/x-m4a + 'M4B ' => 'Apple iTunes AAC-LC (.M4B) Audio Book', # audio/mp4 + 'M4P ' => 'Apple iTunes AAC-LC (.M4P) AES Protected Audio', # audio/mp4 + 'M4V ' => 'Apple iTunes Video (.M4V) Video', # video/x-m4v + 'M4VH' => 'Apple TV (.M4V)', # video/x-m4v + 'M4VP' => 'Apple iPhone (.M4V)', # video/x-m4v + 'mj2s' => 'Motion JPEG 2000 [ISO 15444-3] Simple Profile', # video/mj2 + 'mjp2' => 'Motion JPEG 2000 [ISO 15444-3] General Profile', # video/mj2 + 'mmp4' => 'MPEG-4/3GPP Mobile Profile (.MP4/3GP) (for NTT)', # video/mp4 + 'mp21' => 'MPEG-21 [ISO/IEC 21000-9]', # various + 'mp41' => 'MP4 v1 [ISO 14496-1:ch13]', # video/mp4 + 'mp42' => 'MP4 v2 [ISO 14496-14]', # video/mp4 + 'mp71' => 'MP4 w/ MPEG-7 Metadata [per ISO 14496-12]', # various + 'MPPI' => 'Photo Player, MAF [ISO/IEC 23000-3]', # various + 'mqt ' => 'Sony / Mobile QuickTime (.MQV) US Patent 7,477,830 (Sony Corp)', # video/quicktime + 'MSNV' => 'MPEG-4 (.MP4) for SonyPSP', # audio/mp4 + 'NDAS' => 'MP4 v2 [ISO 14496-14] Nero Digital AAC Audio', # audio/mp4 + 'NDSC' => 'MPEG-4 (.MP4) Nero Cinema Profile', # video/mp4 + 'NDSH' => 'MPEG-4 (.MP4) Nero HDTV Profile', # video/mp4 + 'NDSM' => 'MPEG-4 (.MP4) Nero Mobile Profile', # video/mp4 + 'NDSP' => 'MPEG-4 (.MP4) Nero Portable Profile', # video/mp4 + 'NDSS' => 'MPEG-4 (.MP4) Nero Standard Profile', # video/mp4 + 'NDXC' => 'H.264/MPEG-4 AVC (.MP4) Nero Cinema Profile', # video/mp4 + 'NDXH' => 'H.264/MPEG-4 AVC (.MP4) Nero HDTV Profile', # video/mp4 + 'NDXM' => 'H.264/MPEG-4 AVC (.MP4) Nero Mobile Profile', # video/mp4 + 'NDXP' => 'H.264/MPEG-4 AVC (.MP4) Nero Portable Profile', # video/mp4 + 'NDXS' => 'H.264/MPEG-4 AVC (.MP4) Nero Standard Profile', # video/mp4 + 'odcf' => 'OMA DCF DRM Format 2.0 (OMA-TS-DRM-DCF-V2_0-20060303-A)', # various + 'opf2' => 'OMA PDCF DRM Format 2.1 (OMA-TS-DRM-DCF-V2_1-20070724-C)', + 'opx2' => 'OMA PDCF DRM + XBS extensions (OMA-TS-DRM_XBS-V1_0-20070529-C)', + 'pana' => 'Panasonic Digital Camera', + 'qt ' => 'Apple QuickTime (.MOV/QT)', # video/quicktime + 'ROSS' => 'Ross Video', + 'sdv ' => 'SD Memory Card Video', # various? + 'ssc1' => 'Samsung stereoscopic, single stream', + 'ssc2' => 'Samsung stereoscopic, dual stream', + 'XAVC' => 'Sony XAVC', #PH + 'heic' => 'High Efficiency Image Format HEVC still image (.HEIC)', # image/heic + 'hevc' => 'High Efficiency Image Format HEVC sequence (.HEICS)', # image/heic-sequence + 'mif1' => 'High Efficiency Image Format still image (.HEIF)', # image/heif + 'msf1' => 'High Efficiency Image Format sequence (.HEIFS)', # image/heif-sequence + 'heix' => 'High Efficiency Image Format still image (.HEIF)', # image/heif (ref PH, Canon 1DXmkIII) + 'avif' => 'AV1 Image File Format (.AVIF)', # image/avif + 'crx ' => 'Canon Raw (.CRX)', #PH (CR3 or CRM; use Canon CompressorVersion to decide) +); + +# information for int32u date/time tags (time zero is Jan 1, 1904) +my %timeInfo = ( + Notes => 'converted from UTC to local time if the QuickTimeUTC option is set', + Shift => 'Time', + Writable => 1, + Permanent => 1, + DelValue => 0, + # It is not uncommon for brain-dead software to use the wrong time zero, it should be + # Jan 1, 1904, so assume a time zero of Jan 1, 1970 if the date is before this + # Note: This value will be in UTC if generated by a system that is aware of the time zone + # (also note: this code is duplicated for the CreateDate tag) + RawConv => q{ + my $offset = (66 * 365 + 17) * 24 * 3600; + return $val - $offset if $val >= $offset or $$self{OPTIONS}{QuickTimeUTC}; + if ($val and not $$self{IsWriting}) { + $self->WarnOnce('Patched incorrect time zero for QuickTime date/time tag',1); + } + return $val; + }, + RawConvInv => q{ + if ($$self{FileType} eq 'CR3' and not $self->Options('QuickTimeUTC')) { + # convert to UTC + my $offset = (66 * 365 + 17) * 24 * 3600; + $val = ConvertUnixTime($val - $offset); + $val = GetUnixTime($val, 1) + $offset; + } + return $val; + }, + # (all CR3 files store UTC times - PH) + ValueConv => 'ConvertUnixTime($val, $self->Options("QuickTimeUTC") || $$self{FileType} eq "CR3")', + ValueConvInv => q{ + $val = GetUnixTime($val, $self->Options("QuickTimeUTC")); + return undef unless defined $val; + return $val + (66 * 365 + 17) * 24 * 3600; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + # (can't put Groups here because they aren't constant!) +); +# information for duration tags +my %durationInfo = ( + ValueConv => '$$self{TimeScale} ? $val / $$self{TimeScale} : $val', + PrintConv => '$$self{TimeScale} ? ConvertDuration($val) : $val', +); +# handle unknown tags +my %unknownInfo = ( + Unknown => 1, + ValueConv => '$val =~ /^([\x20-\x7e]*)\0*$/ ? $1 : \$val', +); + +# multi-language text with 6-byte header +my %langText = ( IText => 6 ); + +# parsing for most of the 3gp udta language text boxes +my %langText3gp = ( + Notes => 'used in 3gp videos', + Avoid => 1, + IText => 6, +); + +# 4-character Vendor ID codes (ref PH) +my %vendorID = ( + appl => 'Apple', + fe20 => 'Olympus (fe20)', # (FE200) + FFMP => 'FFmpeg', + 'GIC '=> 'General Imaging Co.', + kdak => 'Kodak', + KMPI => 'Konica-Minolta', + leic => 'Leica', + mino => 'Minolta', + niko => 'Nikon', + NIKO => 'Nikon', + olym => 'Olympus', + pana => 'Panasonic', + pent => 'Pentax', + pr01 => 'Olympus (pr01)', # (FE100,FE110,FE115) + sany => 'Sanyo', + 'SMI '=> 'Sorenson Media Inc.', + ZORA => 'Zoran Corporation', + 'AR.D'=> 'Parrot AR.Drone', + ' KD '=> 'Kodak', # (FZ201) +); + +# QuickTime data atom encodings for string types (ref 12) +%stringEncoding = ( + 1 => 'UTF8', + 2 => 'UTF16', + 3 => 'ShiftJIS', + 4 => 'UTF8', + 5 => 'UTF16', +); + +my %graphicsMode = ( + # (ref http://homepage.mac.com/vanhoek/MovieGuts%20docs/64.html) + 0x00 => 'srcCopy', + 0x01 => 'srcOr', + 0x02 => 'srcXor', + 0x03 => 'srcBic', + 0x04 => 'notSrcCopy', + 0x05 => 'notSrcOr', + 0x06 => 'notSrcXor', + 0x07 => 'notSrcBic', + 0x08 => 'patCopy', + 0x09 => 'patOr', + 0x0a => 'patXor', + 0x0b => 'patBic', + 0x0c => 'notPatCopy', + 0x0d => 'notPatOr', + 0x0e => 'notPatXor', + 0x0f => 'notPatBic', + 0x20 => 'blend', + 0x21 => 'addPin', + 0x22 => 'addOver', + 0x23 => 'subPin', + 0x24 => 'transparent', + 0x25 => 'addMax', + 0x26 => 'subOver', + 0x27 => 'addMin', + 0x31 => 'grayishTextOr', + 0x32 => 'hilite', + 0x40 => 'ditherCopy', + # the following ref ISO/IEC 15444-3 + 0x100 => 'Alpha', + 0x101 => 'White Alpha', + 0x102 => 'Pre-multiplied Black Alpha', + 0x110 => 'Component Alpha', +); + +my %channelLabel = ( + 0xFFFFFFFF => 'Unknown', + 0 => 'Unused', + 100 => 'UseCoordinates', + 1 => 'Left', + 2 => 'Right', + 3 => 'Center', + 4 => 'LFEScreen', + 5 => 'LeftSurround', + 6 => 'RightSurround', + 7 => 'LeftCenter', + 8 => 'RightCenter', + 9 => 'CenterSurround', + 10 => 'LeftSurroundDirect', + 11 => 'RightSurroundDirect', + 12 => 'TopCenterSurround', + 13 => 'VerticalHeightLeft', + 14 => 'VerticalHeightCenter', + 15 => 'VerticalHeightRight', + 16 => 'TopBackLeft', + 17 => 'TopBackCenter', + 18 => 'TopBackRight', + 33 => 'RearSurroundLeft', + 34 => 'RearSurroundRight', + 35 => 'LeftWide', + 36 => 'RightWide', + 37 => 'LFE2', + 38 => 'LeftTotal', + 39 => 'RightTotal', + 40 => 'HearingImpaired', + 41 => 'Narration', + 42 => 'Mono', + 43 => 'DialogCentricMix', + 44 => 'CenterSurroundDirect', + 45 => 'Haptic', + 200 => 'Ambisonic_W', + 201 => 'Ambisonic_X', + 202 => 'Ambisonic_Y', + 203 => 'Ambisonic_Z', + 204 => 'MS_Mid', + 205 => 'MS_Side', + 206 => 'XY_X', + 207 => 'XY_Y', + 301 => 'HeadphonesLeft', + 302 => 'HeadphonesRight', + 304 => 'ClickTrack', + 305 => 'ForeignLanguage', + 400 => 'Discrete', + 0x10000 => 'Discrete_0', + 0x10001 => 'Discrete_1', + 0x10002 => 'Discrete_2', + 0x10003 => 'Discrete_3', + 0x10004 => 'Discrete_4', + 0x10005 => 'Discrete_5', + 0x10006 => 'Discrete_6', + 0x10007 => 'Discrete_7', + 0x10008 => 'Discrete_8', + 0x10009 => 'Discrete_9', + 0x1000a => 'Discrete_10', + 0x1000b => 'Discrete_11', + 0x1000c => 'Discrete_12', + 0x1000d => 'Discrete_13', + 0x1000e => 'Discrete_14', + 0x1000f => 'Discrete_15', + 0x1ffff => 'Discrete_65535', +); + +# properties which don't get inherited from the parent +my %dontInherit = ( + ispe => 1, # size of parent may be different + hvcC => 1, # (likely redundant) +); + +# tags that may be duplicated and directories that may contain duplicate tags +# (used only to avoid warnings when Validate-ing) +my %dupTagOK = ( mdat => 1, trak => 1, free => 1, infe => 1, sgpd => 1, dimg => 1, CCDT => 1, + sbgp => 1, csgm => 1, uuid => 1, cdsc => 1, maxr => 1, '----' => 1 ); +my %dupDirOK = ( ipco => 1, '----' => 1 ); + +# the usual atoms required to decode timed metadata with the ExtractEmbedded option +my %eeStd = ( stco => 'stbl', co64 => 'stbl', stsz => 'stbl', stz2 => 'stbl', + stsc => 'stbl', stts => 'stbl' ); + +# boxes and their containers for the various handler types that we want to save +# when the ExtractEmbedded is enabled (currently only the 'gps ' container name is +# used, but others have been checked against all available sample files and may be +# useful in the future if the names are used for different boxes on other locations) +my %eeBox = ( + # (note: vide is only processed if specific atoms exist in the VideoSampleDesc) + vide => { %eeStd, + JPEG => 'stsd', + }, + text => { %eeStd }, + meta => { %eeStd }, + sbtl => { %eeStd }, + data => { %eeStd }, + camm => { %eeStd }, # (Insta360) + ctbx => { %eeStd }, # (GM cars) + '' => { 'gps ' => 'moov', 'GPS ' => 'main' }, # (no handler -- in top level 'moov' box, and main) +); +# boxes to save when ExtractEmbedded is set to 2 or higher +my %eeBox2 = ( + vide => { avcC => 'stsd' }, # (parses H264 video stream) +); + +# QuickTime atoms +%Image::ExifTool::QuickTime::Main = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, # (only needs to be defined for directories to process when writing) + GROUPS => { 2 => 'Video' }, + meta => { # 'meta' is found here in my Sony ILCE-7S MP4 sample - PH + Name => 'Meta', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Meta', + Start => 4, # skip 4-byte version number header + }, + }, + meco => { #ISO14496-12:2015 + Name => 'OtherMeta', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::OtherMeta' }, + }, + free => [ + { + Name => 'KodakFree', + # (found in Kodak M5370 MP4 videos) + Condition => '$$valPt =~ /^\0\0\0.Seri/s', + SubDirectory => { TagTable => 'Image::ExifTool::Kodak::Free' }, + },{ + Name => 'Pittasoft', + # (Pittasoft Blackview dashcam MP4 videos) + Condition => '$$valPt =~ /^\0\0..(cprt|sttm|ptnm|ptrh|thum|gps |3gf )/s', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Pittasoft' }, + },{ + Name => 'ThumbnailImage', + # (DJI Zenmuse XT2 thermal camera) + Groups => { 2 => 'Preview' }, + Condition => '$$valPt =~ /^.{4}mdat\xff\xd8\xff/s', + RawConv => q{ + my $len = unpack('N', $val); + return undef if $len <= 8 or $len > length($val); + return substr($val, 8, $len-8); + }, + Binary => 1, + },{ + Unknown => 1, + Binary => 1, + }, + # (also Samsung WB750 uncompressed thumbnail data starting with "SDIC\0") + ], + # fre1 - 4 bytes: "june" (Kodak PixPro SP360) + frea => { + Name => 'Kodak_frea', + SubDirectory => { TagTable => 'Image::ExifTool::Kodak::frea' }, + }, + skip => [ + { + Name => 'CanonSkip', + Condition => '$$valPt =~ /^\0.{3}(CNDB|CNCV|CNMN|CNFV|CNTH|CNDM)/s', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::Skip' }, + }, + { + Name => 'PreviewImage', # (found in DuDuBell M1 dashcam MOV files) + Groups => { 2 => 'Preview' }, + Condition => '$$valPt =~ /^.{12}\xff\xd8\xff/', + Binary => 1, + RawConv => q{ + my $len = Get32u(\$val, 8); + return undef unless length($val) >= $len + 12; + return substr($val, 12, $len); + }, + }, + { Name => 'Skip', Unknown => 1, Binary => 1 }, + ], + wide => { Unknown => 1, Binary => 1 }, + ftyp => { #MP4 + Name => 'FileType', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::FileType' }, + }, + pnot => { + Name => 'Preview', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Preview' }, + }, + PICT => { + Name => 'PreviewPICT', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + pict => { #8 + Name => 'PreviewPICT', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + # (note that moov is present for an HEIF sequence) + moov => { + Name => 'Movie', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Movie' }, + }, + moof => { + Name => 'MovieFragment', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MovieFragment' }, + }, + # mfra - movie fragment random access: contains tfra (track fragment random access), and + # mfro (movie fragment random access offset) (ref 5) + mdat => { Name => 'MediaData', Unknown => 1, Binary => 1 }, + 'mdat-size' => { + Name => 'MediaDataSize', + Notes => q{ + not a real tag ID, this tag represents the size of the 'mdat' data in bytes + and is used in the AvgBitrate calculation + }, + }, + 'mdat-offset' => 'MediaDataOffset', + junk => { Unknown => 1, Binary => 1 }, #8 + uuid => [ + { #9 (MP4 files) + Name => 'XMP', + # *** this is where ExifTool writes XMP in MP4 videos (as per XMP spec) *** + Condition => '$$valPt=~/^\xbe\x7a\xcf\xcb\x97\xa9\x42\xe8\x9c\x71\x99\x94\x91\xe3\xaf\xac/', + WriteGroup => 'XMP', # (write main XMP tags here) + PreservePadding => 1, + SubDirectory => { + TagTable => 'Image::ExifTool::XMP::Main', + Start => 16, + }, + }, + { #11 (MP4 files) + Name => 'UUID-PROF', + Condition => '$$valPt=~/^PROF!\xd2\x4f\xce\xbb\x88\x69\x5c\xfa\xc9\xc7\x40/', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Profile', + Start => 24, # uid(16) + version(1) + flags(3) + count(4) + }, + }, + { #PH (Flip MP4 files) + Name => 'UUID-Flip', + Condition => '$$valPt=~/^\x4a\xb0\x3b\x0f\x61\x8d\x40\x75\x82\xb2\xd9\xfa\xce\xd3\x5f\xf5/', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Flip', + Start => 16, + }, + }, + # "\x98\x7f\xa3\xdf\x2a\x85\x43\xc0\x8f\x8f\xd9\x7c\x47\x1e\x8e\xea" - unknown data in Flip videos + { #PH (Canon CR3) + Name => 'UUID-Canon2', + WriteLast => 1, # MUST come after mdat or DPP will drop mdat when writing! + Condition => '$$valPt=~/^\x21\x0f\x16\x87\x91\x49\x11\xe4\x81\x11\x00\x24\x21\x31\xfc\xe4/', + SubDirectory => { + TagTable => 'Image::ExifTool::Canon::uuid2', + Start => 16, + }, + }, + { # (ref https://github.com/JamesHeinrich/getID3/blob/master/getid3/module.audio-video.quicktime.php) + Name => 'SensorData', # sensor data for the 360Fly + Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/ and $$self{OPTIONS}{ExtractEmbedded}', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Tags360Fly' }, + }, + { + Name => 'SensorData', + Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/', + Notes => 'raw 360Fly sensor data without ExtractEmbedded option', + RawConv => q{ + $self->WarnOnce('Use the ExtractEmbedded option to decode timed SensorData',3); + return \$val; + }, + }, + { #PH (Canon CR3) + Name => 'PreviewImage', + Condition => '$$valPt=~/^\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16/', + Groups => { 2 => 'Preview' }, + PreservePadding => 1, + # 0x00 - undef[16]: UUID + # 0x10 - int32u[2]: "0 1" (version and/or item count?) + # 0x18 - int32u: PRVW atom size + # 0x20 - int32u: 'PRVW' + # 0x30 - int32u: 0 + # 0x34 - int16u: 1 + # 0x36 - int16u: image width + # 0x38 - int16u: image height + # 0x3a - int16u: 1 + # 0x3c - int32u: preview length + RawConv => '$val = substr($val, 0x30); $self->ValidateImage(\$val, $tag)', + }, + { #8 + Name => 'UUID-Unknown', + %unknownInfo, + }, + ], + _htc => { + Name => 'HTCInfo', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HTCInfo' }, + }, + udta => { + Name => 'UserData', + SubDirectory => { TagTable => 'Image::ExifTool::FLIR::UserData' }, + }, + thum => { #PH + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + 'thm ' => { #PH (70mai A800) + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + ardt => { #PH + Name => 'ARDroneFile', + ValueConv => 'length($val) > 4 ? substr($val,4) : $val', # remove length + }, + prrt => { #PH + Name => 'ARDroneTelemetry', + Notes => q{ + telemetry information for each video frame: status1, status2, time, pitch, + roll, yaw, speed, altitude + }, + ValueConv => q{ + my $size = length $val; + return \$val if $size < 12 or not $$self{OPTIONS}{Binary}; + my $len = Get16u(\$val, 2); + my $str = ''; + SetByteOrder('II'); + my $pos = 12; + while ($pos + $len <= $size) { + my $s1 = Get16u(\$val, $pos); + # s2: 7=take-off?, 3=moving, 4=hovering, 9=landing?, 2=landed + my $s2 = Get16u(\$val, $pos + 2); + $str .= "$s1 $s2"; + my $num = int(($len-4)/4); + my ($i, $v); + for ($i=0; $i<$num; ++$i) { + my $pt = $pos + 4 + $i * 4; + if ($i > 0 && $i < 4) { + $v = GetFloat(\$val, $pt); # pitch/roll/yaw + } else { + $v = Get32u(\$val, $pt); + # convert time to sec, and speed(NC)/altitude to metres + $v /= 1000 if $i <= 5; + } + $str .= " $v"; + } + $str .= "\n"; + $pos += $len; + } + SetByteOrder('MM'); + return \$str; + }, + }, + udat => { #PH (GPS NMEA-format log written by Datakam Player software) + Name => 'GPSLog', + Binary => 1, # (actually ASCII, but very lengthy) + Notes => 'parsed to extract GPS separately when ExtractEmbedded is used', + RawConv => q{ + $val =~ s/\0+$//; # remove trailing nulls + if (length $val and $$self{OPTIONS}{ExtractEmbedded}) { + my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream'); + Image::ExifTool::QuickTime::ProcessGPSLog($self, { DataPt => \$val }, $tagTbl); + } + return $val; + }, + }, + # meta - proprietary XML information written by some Flip cameras - PH + # beam - 16 bytes found in an iPhone video + IDIT => { #PH (written by DuDuBell M1, VSYS M6L dashcams) + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Format => 'string', # (removes trailing "\0") + Shift => 'Time', + Writable => 1, + Permanent => 1, + DelValue => '0000-00-00T00:00:00+0000', + ValueConv => '$val=~tr/-/:/; $val', + ValueConvInv => '$val=~s/(\d+):(\d+):/$1-$2-/; $val', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist) + }, + gps0 => { #PH (DuDuBell M1, VSYS M6L) + Name => 'GPSTrack', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Stream', + ProcessProc => \&Process_gps0, + }, + }, + gsen => { #PH (DuDuBell M1, VSYS M6L) + Name => 'GSensor', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Stream', + ProcessProc => \&Process_gsen, + }, + }, + # gpsa - seen hex "01 20 00 00" (DuDuBell M1, VSYS M6L) + # gsea - 20 bytes hex "05 00's..." (DuDuBell M1) "05 08 02 01 ..." (VSYS M6L) + 'GPS ' => { # GPS data written by 70mai dashcam (parsed in QuickTimeStream.pl) + Name => 'GPSDataList2', + Unknown => 1, + Binary => 1, + }, + sefd => { + Name => 'SamsungTrailer', + SubDirectory => { TagTable => 'Image::ExifTool::Samsung::Trailer' }, + }, + # 'samn'? - seen in Vantrue N2S sample video +); + +# MPEG-4 'ftyp' atom +# (ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html) +%Image::ExifTool::QuickTime::FileType = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int32u', + 0 => { + Name => 'MajorBrand', + Format => 'undef[4]', + PrintConv => \%ftypLookup, + }, + 1 => { + Name => 'MinorVersion', + Format => 'undef[4]', + ValueConv => 'sprintf("%x.%x.%x", unpack("nCC", $val))', + }, + 2 => { + Name => 'CompatibleBrands', + Format => 'undef[$size-8]', + # ignore any entry with a null, and return others as a list + ValueConv => 'my @a=($val=~/.{4}/sg); @a=grep(!/\0/,@a); \@a', + }, +); + +# proprietary HTC atom (HTC One MP4 video) +%Image::ExifTool::QuickTime::HTCInfo = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Video' }, + NOTES => 'Tags written by some HTC camera phones.', + slmt => { + Name => 'Unknown_slmt', + Unknown => 1, + Format => 'int32u', # (observed values: 4) + }, +); + +# atoms used in QTIF files +%Image::ExifTool::QuickTime::ImageFile = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Image' }, + NOTES => 'Tags used in QTIF QuickTime Image Files.', + idsc => { + Name => 'ImageDescription', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ImageDesc' }, + }, + idat => { + Name => 'ImageData', + Binary => 1, + }, + iicc => { + Name => 'ICC_Profile', + SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' }, + }, +); + +# image description data block +%Image::ExifTool::QuickTime::ImageDesc = ( + PROCESS_PROC => \&ProcessHybrid, + VARS => { ID_LABEL => 'ID/Index' }, + GROUPS => { 2 => 'Image' }, + FORMAT => 'int16u', + 2 => { + Name => 'CompressorID', + Format => 'string[4]', +# not very useful since this isn't a complete list and name is given below +# # ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html +# PrintConv => { +# cvid => 'Cinepak', +# jpeg => 'JPEG', +# 'smc '=> 'Graphics', +# 'rle '=> 'Animation', +# rpza => 'Apple Video', +# kpcd => 'Kodak Photo CD', +# 'png '=> 'Portable Network Graphics', +# mjpa => 'Motion-JPEG (format A)', +# mjpb => 'Motion-JPEG (format B)', +# SVQ1 => 'Sorenson video, version 1', +# SVQ3 => 'Sorenson video, version 3', +# mp4v => 'MPEG-4 video', +# 'dvc '=> 'NTSC DV-25 video', +# dvcp => 'PAL DV-25 video', +# 'gif '=> 'Compuserve Graphics Interchange Format', +# h263 => 'H.263 video', +# tiff => 'Tagged Image File Format', +# 'raw '=> 'Uncompressed RGB', +# '2vuY'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (2vuY)", +# 'yuv2'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (yuv2)", +# v308 => "Uncompressed Y'CbCr, 8-bit 4:4:4", +# v408 => "Uncompressed Y'CbCr, 8-bit 4:4:4:4", +# v216 => "Uncompressed Y'CbCr, 10, 12, 14, or 16-bit 4:2:2", +# v410 => "Uncompressed Y'CbCr, 10-bit 4:4:4", +# v210 => "Uncompressed Y'CbCr, 10-bit 4:2:2", +# hvc1 => 'HEVC', #PH +# }, + }, + 10 => { + Name => 'VendorID', + Format => 'string[4]', + RawConv => 'length $val ? $val : undef', + PrintConv => \%vendorID, + SeparateTable => 'VendorID', + }, + # 14 - ("Quality" in QuickTime docs) ?? + 16 => 'SourceImageWidth', + 17 => 'SourceImageHeight', + 18 => { Name => 'XResolution', Format => 'fixed32u' }, + 20 => { Name => 'YResolution', Format => 'fixed32u' }, + # 24 => 'FrameCount', # always 1 (what good is this?) + 25 => { + Name => 'CompressorName', + Format => 'string[32]', + # (sometimes this is a Pascal string, and sometimes it is a C string) + RawConv => q{ + $val=substr($val,1,ord($1)) if $val=~/^([\0-\x1f])/ and ord($1)<length($val); + length $val ? $val : undef; + }, + }, + 41 => 'BitDepth', +# +# Observed offsets for child atoms of various CompressorID types: +# +# CompressorID Offset Child atoms +# ----------- ------ ---------------- +# avc1 86 avcC, btrt, colr, pasp, fiel, clap, svcC +# mp4v 86 esds, pasp +# s263 86 d263 +# + btrt => { + Name => 'BitrateInfo', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Bitrate' }, + }, + # Reference for fiel, colr, pasp, clap: + # https://developer.apple.com/library/mac/technotes/tn2162/_index.html#//apple_ref/doc/uid/DTS40013070-CH1-TNTAG9 + fiel => { + Name => 'VideoFieldOrder', + ValueConv => 'join(" ", unpack("C*",$val))', + PrintConv => [{ + 1 => 'Progressive', + 2 => '2:1 Interlaced', + }], + }, + colr => { + Name => 'ColorRepresentation', + ValueConv => 'join(" ", substr($val,0,4), unpack("x4n*",$val))', + }, + pasp => { + Name => 'PixelAspectRatio', + ValueConv => 'join(":", unpack("N*",$val))', + }, + clap => { + Name => 'CleanAperture', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::CleanAperture' }, + }, + avcC => { + # (see http://thompsonng.blogspot.ca/2010/11/mp4-file-format-part-2.html) + Name => 'AVCConfiguration', + Unknown => 1, + Binary => 1, + }, + JPEG => { # (found in CR3 images; used as a flag to identify JpgFromRaw 'vide' stream) + Name => 'JPEGInfo', + # (4 bytes all zero) + Unknown => 1, + Binary => 1, + }, + # hvcC - HEVC configuration + # svcC - 7 bytes: 00 00 00 00 ff e0 00 + # esds - elementary stream descriptor + # d263 + gama => { Name => 'Gamma', Format => 'fixed32u' }, + # mjqt - default quantization table for MJPEG + # mjht - default Huffman table for MJPEG + # csgm ? (seen in hevc video) + CMP1 => { # Canon CR3 + Name => 'CMP1', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CMP1' }, + }, + CDI1 => { # Canon CR3 + Name => 'CDI1', + SubDirectory => { + TagTable => 'Image::ExifTool::Canon::CDI1', + Start => 4, + }, + }, + # JPEG - 4 bytes all 0 (Canon CR3) + # free - (Canon CR3) +# +# spherical video v2 stuff (untested) +# + st3d => { + Name => 'Stereoscopic3D', + Format => 'int8u', + ValueConv => '$val =~ s/.* //; $val', # (remove leading version/flags bytes?) + PrintConv => { + 0 => 'Monoscopic', + 1 => 'Stereoscopic Top-Bottom', + 2 => 'Stereoscopic Left-Right', + 3 => 'Stereoscopic Stereo-Custom', # (provisional in spec as of 2017-10-10) + }, + }, + sv3d => { + Name => 'SphericalVideo', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::sv3d' }, + }, +); + +# 'sv3d' atom information (ref https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md) +%Image::ExifTool::QuickTime::sv3d = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Video' }, + NOTES => q{ + Tags defined by the Spherical Video V2 specification. See + L<https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md> + for the specification. + }, + svhd => { + Name => 'MetadataSource', + Format => 'undef', + ValueConv => '$val=~tr/\0//d; $val', # (remove version/flags? and terminator?) + }, + proj => { + Name => 'Projection', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::proj' }, + }, +); + +# 'proj' atom information (ref https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md) +%Image::ExifTool::QuickTime::proj = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Video' }, + prhd => { + Name => 'ProjectionHeader', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::prhd' }, + }, + cbmp => { + Name => 'CubemapProj', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::cbmp' }, + }, + equi => { + Name => 'EquirectangularProj', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::equi' }, + }, + # mshp - MeshProjection (P.I.T.A. to decode, for not much reward, see ref) +); + +# 'prhd' atom information (ref https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md) +%Image::ExifTool::QuickTime::prhd = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'fixed32s', + # 0 - version (high 8 bits) / flags (low 24 bits) + 1 => 'PoseYawDegrees', + 2 => 'PosePitchDegrees', + 3 => 'PoseRollDegrees', +); + +# 'cbmp' atom information (ref https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md) +%Image::ExifTool::QuickTime::cbmp = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int32u', + # 0 - version (high 8 bits) / flags (low 24 bits) + 1 => 'Layout', + 2 => 'Padding', +); + +# 'equi' atom information (ref https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md) +%Image::ExifTool::QuickTime::equi = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int32u', # (actually 0.32 fixed point) + # 0 - version (high 8 bits) / flags (low 24 bits) + 1 => { Name => 'ProjectionBoundsTop', ValueConv => '$val / 4294967296' }, + 2 => { Name => 'ProjectionBoundsBottom',ValueConv => '$val / 4294967296' }, + 3 => { Name => 'ProjectionBoundsLeft', ValueConv => '$val / 4294967296' }, + 4 => { Name => 'ProjectionBoundsRight', ValueConv => '$val / 4294967296' }, +); + +# 'btrt' atom information (ref http://lists.freedesktop.org/archives/gstreamer-commits/2011-October/054459.html) +%Image::ExifTool::QuickTime::Bitrate = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int32u', + PRIORITY => 0, # often filled with zeros + 0 => 'BufferSize', + 1 => 'MaxBitrate', + 2 => 'AverageBitrate', +); + +# 'clap' atom information (ref https://developer.apple.com/library/mac/technotes/tn2162/_index.html#//apple_ref/doc/uid/DTS40013070-CH1-TNTAG9) +%Image::ExifTool::QuickTime::CleanAperture = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'rational64s', + 0 => 'CleanApertureWidth', + 1 => 'CleanApertureHeight', + 2 => 'CleanApertureOffsetX', + 3 => 'CleanApertureOffsetY', +); + +# preview data block +%Image::ExifTool::QuickTime::Preview = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 2 => 'Image' }, + FORMAT => 'int16u', + 0 => { + Name => 'PreviewDate', + Format => 'int32u', + Groups => { 2 => 'Time' }, + %timeInfo, + }, + 2 => 'PreviewVersion', + 3 => { + Name => 'PreviewAtomType', + Format => 'string[4]', + }, + 5 => 'PreviewAtomIndex', +); + +# movie atoms +%Image::ExifTool::QuickTime::Movie = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + GROUPS => { 2 => 'Video' }, + mvhd => { + Name => 'MovieHeader', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MovieHeader' }, + }, + trak => { + Name => 'Track', + CanCreate => 0, # don't create this atom + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Track' }, + }, + udta => { + Name => 'UserData', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::UserData' }, + }, + meta => { # 'meta' is found here in my EX-F1 MOV sample - PH + Name => 'Meta', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Meta' }, + }, + iods => { + Name => 'InitialObjectDescriptor', + Flags => ['Binary','Unknown'], + }, + uuid => [ + { #11 (MP4 files) (also found in QuickTime::Track) + Name => 'UUID-USMT', + Condition => '$$valPt=~/^USMT!\xd2\x4f\xce\xbb\x88\x69\x5c\xfa\xc9\xc7\x40/', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::UserMedia', + Start => 16, + }, + }, + { #PH (Canon SX280) + Name => 'UUID-Canon', + Condition => '$$valPt=~/^\x85\xc0\xb6\x87\x82\x0f\x11\xe0\x81\x11\xf4\xce\x46\x2b\x6a\x48/', + SubDirectory => { + TagTable => 'Image::ExifTool::Canon::uuid', + Start => 16, + }, + }, + { + Name => 'UUID-Unknown', + %unknownInfo, + }, + ], + cmov => { + Name => 'CompressedMovie', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::CMovie' }, + }, + htka => { # (written by HTC One M8 in slow-motion 1280x720 video - PH) + Name => 'HTCTrack', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Track' }, + }, + 'gps ' => { # GPS data written by Novatek cameras (parsed in QuickTimeStream.pl) + Name => 'GPSDataList', + Unknown => 1, + Binary => 1, + }, + meco => { #ISO14496-12:2015 + Name => 'OtherMeta', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::OtherMeta' }, + }, + # prfl - Profile (ref 12) + # clip - clipping --> contains crgn (clip region) (ref 12) + # mvex - movie extends --> contains mehd (movie extends header), trex (track extends) (ref 14) + # ICAT - 4 bytes: "6350" (Nikon CoolPix S6900), "6500" (Panasonic FT7) +); + +# (ref CFFMediaFormat-2_1.pdf) +%Image::ExifTool::QuickTime::MovieFragment = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + GROUPS => { 2 => 'Video' }, + mfhd => { + Name => 'MovieFragmentHeader', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MovieFragHdr' }, + }, + traf => { + Name => 'TrackFragment', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TrackFragment' }, + }, + meta => { #ISO14496-12:2015 + Name => 'Meta', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Meta' }, + }, +); + +# (ref CFFMediaFormat-2_1.pdf) +%Image::ExifTool::QuickTime::MovieFragHdr = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int32u', + 1 => 'MovieFragmentSequence', +); + +# (ref CFFMediaFormat-2_1.pdf) +%Image::ExifTool::QuickTime::TrackFragment = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + GROUPS => { 2 => 'Video' }, + meta => { #ISO14496-12:2015 + Name => 'Meta', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Meta' }, + }, + # tfhd - track fragment header + # edts - edits --> contains elst (edit list) (ref PH) + # tfdt - track fragment base media decode time + # trik - trick play box + # trun - track fragment run box + # avcn - AVC NAL unit storage box + # secn - sample encryption box + # saio - sample auxiliary information offsets box + # sbgp - sample to group box + # sgpd - sample group description box + # sdtp - independent and disposable samples (ref 5) + # subs - sub-sample information (ref 5) +); + +# movie header data block +%Image::ExifTool::QuickTime::MovieHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int32u', + DATAMEMBER => [ 0, 1, 2, 3, 4 ], + 0 => { + Name => 'MovieHeaderVersion', + Format => 'int8u', + RawConv => '$$self{MovieHeaderVersion} = $val', + }, + 1 => { + Name => 'CreateDate', + Groups => { 2 => 'Time' }, + %timeInfo, + RawConv => q{ + my $offset = (66 * 365 + 17) * 24 * 3600; + if ($val >= $offset or $$self{OPTIONS}{QuickTimeUTC}) { + $val -= $offset; + } elsif ($val and not $$self{IsWriting}) { + $self->WarnOnce('Patched incorrect time zero for QuickTime date/time tag',1); + } + return $$self{CreateDate} = $val; + }, + # this is int64u if MovieHeaderVersion == 1 (ref 13) + Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4', + }, + 2 => { + Name => 'ModifyDate', + Groups => { 2 => 'Time' }, + %timeInfo, + # this is int64u if MovieHeaderVersion == 1 (ref 13) + Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4', + }, + 3 => { + Name => 'TimeScale', + RawConv => '$$self{TimeScale} = $val', + }, + 4 => { + Name => 'Duration', + %durationInfo, + # this is int64u if MovieHeaderVersion == 1 (ref 13) + Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4', + }, + 5 => { + Name => 'PreferredRate', + ValueConv => '$val / 0x10000', + }, + 6 => { + Name => 'PreferredVolume', + Format => 'int16u', + ValueConv => '$val / 256', + PrintConv => 'sprintf("%.2f%%", $val * 100)', + }, + 9 => { + Name => 'MatrixStructure', + Format => 'fixed32s[9]', + # (the right column is fixed 2.30 instead of 16.16) + ValueConv => q{ + my @a = split ' ',$val; + $_ /= 0x4000 foreach @a[2,5,8]; + return "@a"; + }, + }, + 18 => { Name => 'PreviewTime', %durationInfo }, + 19 => { Name => 'PreviewDuration', %durationInfo }, + 20 => { Name => 'PosterTime', %durationInfo }, + 21 => { Name => 'SelectionTime', %durationInfo }, + 22 => { Name => 'SelectionDuration',%durationInfo }, + 23 => { Name => 'CurrentTime', %durationInfo }, + 24 => 'NextTrackID', +); + +# track atoms +%Image::ExifTool::QuickTime::Track = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + GROUPS => { 1 => 'Track#', 2 => 'Video' }, + tkhd => { + Name => 'TrackHeader', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TrackHeader' }, + }, + udta => { + Name => 'UserData', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::UserData' }, + }, + mdia => { #MP4 + Name => 'Media', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Media' }, + }, + meta => { #PH (MOV) + Name => 'Meta', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Meta' }, + }, + tref => { + Name => 'TrackRef', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TrackRef' }, + }, + tapt => { + Name => 'TrackAperture', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TrackAperture' }, + }, + uuid => [ + { #11 (MP4 files) (also found in QuickTime::Movie) + Name => 'UUID-USMT', + Condition => '$$valPt=~/^USMT!\xd2\x4f\xce\xbb\x88\x69\x5c\xfa\xc9\xc7\x40/', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::UserMedia', + Start => 16, + }, + }, + { #https://github.com/google/spatial-media/blob/master/docs/spherical-video-rfc.md + Name => 'SphericalVideoXML', + Condition => '$$valPt=~/^\xff\xcc\x82\x63\xf8\x55\x4a\x93\x88\x14\x58\x7a\x02\x52\x1f\xdd/', + WriteGroup => 'GSpherical', # write only GSpherical XMP tags here + HandlerType => 'vide', # only write in video tracks + SubDirectory => { + TagTable => 'Image::ExifTool::XMP::Main', + Start => 16, + WriteProc => 'Image::ExifTool::XMP::WriteGSpherical', + }, + }, + { + Name => 'UUID-Unknown', + %unknownInfo, + }, + ], + meco => { #ISO14492-12:2015 pg 83 + Name => 'OtherMeta', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::OtherMeta' }, + }, + # edts - edits --> contains elst (edit list) + # clip - clipping --> contains crgn (clip region) + # matt - track matt --> contains kmat (compressed matt) + # load - track loading settings + # imap - track input map --> contains ' in' --> contains ' ty', obid + # prfl - Profile (ref 12) +); + +# track header data block +%Image::ExifTool::QuickTime::TrackHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 1 => 'Track#', 2 => 'Video' }, + FORMAT => 'int32u', + DATAMEMBER => [ 0, 1, 2, 5, 7 ], + 0 => { + Name => 'TrackHeaderVersion', + Format => 'int8u', + Priority => 0, + RawConv => '$$self{TrackHeaderVersion} = $val', + }, + 1 => { + Name => 'TrackCreateDate', + Priority => 0, + Groups => { 2 => 'Time' }, + %timeInfo, + # this is int64u if TrackHeaderVersion == 1 (ref 13) + Hook => '$$self{TrackHeaderVersion} and $format = "int64u", $varSize += 4', + }, + 2 => { + Name => 'TrackModifyDate', + Priority => 0, + Groups => { 2 => 'Time' }, + %timeInfo, + # this is int64u if TrackHeaderVersion == 1 (ref 13) + Hook => '$$self{TrackHeaderVersion} and $format = "int64u", $varSize += 4', + }, + 3 => { + Name => 'TrackID', + Priority => 0, + }, + 5 => { + Name => 'TrackDuration', + Priority => 0, + %durationInfo, + # this is int64u if TrackHeaderVersion == 1 (ref 13) + Hook => '$$self{TrackHeaderVersion} and $format = "int64u", $varSize += 4', + }, + 7 => { # (used only for writing MatrixStructure) + Name => 'ImageSizeLookahead', + Hidden => 1, + Format => 'int32u[14]', + RawConv => '$$self{ImageSizeLookahead} = $val; undef', + }, + 8 => { + Name => 'TrackLayer', + Format => 'int16u', + Priority => 0, + }, + 9 => { + Name => 'TrackVolume', + Format => 'int16u', + Priority => 0, + ValueConv => '$val / 256', + PrintConv => 'sprintf("%.2f%%", $val * 100)', + }, + 10 => { + Name => 'MatrixStructure', + Format => 'fixed32s[9]', + Notes => 'writable for the video track via the Composite Rotation tag', + Writable => 1, + Protected => 1, + Permanent => 1, + # only set rotation if image size is non-zero + RawConvInv => \&GetMatrixStructure, + # (the right column is fixed 2.30 instead of 16.16) + ValueConv => q{ + my @a = split ' ',$val; + $_ /= 0x4000 foreach @a[2,5,8]; + return "@a"; + }, + ValueConvInv => q{ + my @a = split ' ',$val; + $_ *= 0x4000 foreach @a[2,5,8]; + return "@a"; + }, + }, + 19 => { + Name => 'ImageWidth', + Priority => 0, + RawConv => \&FixWrongFormat, + }, + 20 => { + Name => 'ImageHeight', + Priority => 0, + RawConv => \&FixWrongFormat, + }, +); + +# user data atoms +%Image::ExifTool::QuickTime::UserData = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + CHECK_PROC => \&CheckQTValue, + GROUPS => { 1 => 'UserData', 2 => 'Video' }, + WRITABLE => 1, + PREFERRED => 1, # (preferred over Keys tags when writing) + FORMAT => 'string', + WRITE_GROUP => 'UserData', + LANG_INFO => \&GetLangInfo, + NOTES => q{ + Tag ID's beginning with the copyright symbol (hex 0xa9) are multi-language + text. Alternate language tags are accessed by adding a dash followed by a + 3-character ISO 639-2 language code to the tag name. ExifTool will extract + any multi-language user data tags found, even if they aren't in this table. + Note when creating new tags, + L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> tags are + preferred over these, so to create the tag when a same-named ItemList tag + exists, either "UserData" must be specified (eg. C<-UserData:Artist=Monet> + on the command line), or the PREFERRED level must be changed via + L<the config file|../config.html#PREF>. + }, + "\xa9cpy" => { Name => 'Copyright', Groups => { 2 => 'Author' } }, + "\xa9day" => { + Name => 'ContentCreateDate', + Groups => { 2 => 'Time' }, + Shift => 'Time', + # handle values in the form "2010-02-12T13:27:14-0800" (written by Apple iPhone) + ValueConv => q{ + require Image::ExifTool::XMP; + $val = Image::ExifTool::XMP::ConvertXMPDate($val); + $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary + return $val; + }, + ValueConvInv => q{ + require Image::ExifTool::XMP; + my $tmp = Image::ExifTool::XMP::FormatXMPDate($val); + ($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon + return $val; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist) + }, + "\xa9ART" => 'Artist', #PH (iTunes 8.0.2) + "\xa9alb" => 'Album', #PH (iTunes 8.0.2) + "\xa9arg" => 'Arranger', #12 + "\xa9ark" => 'ArrangerKeywords', #12 + "\xa9cmt" => 'Comment', #PH (iTunes 8.0.2) + "\xa9cok" => 'ComposerKeywords', #12 + "\xa9com" => 'Composer', #12 + "\xa9dir" => 'Director', #12 + "\xa9ed1" => 'Edit1', + "\xa9ed2" => 'Edit2', + "\xa9ed3" => 'Edit3', + "\xa9ed4" => 'Edit4', + "\xa9ed5" => 'Edit5', + "\xa9ed6" => 'Edit6', + "\xa9ed7" => 'Edit7', + "\xa9ed8" => 'Edit8', + "\xa9ed9" => 'Edit9', + "\xa9fmt" => 'Format', + "\xa9gen" => 'Genre', #PH (iTunes 8.0.2) + "\xa9grp" => 'Grouping', #PH (NC) + "\xa9inf" => 'Information', + "\xa9isr" => 'ISRCCode', #12 + "\xa9lab" => 'RecordLabelName', #12 + "\xa9lal" => 'RecordLabelURL', #12 + "\xa9lyr" => 'Lyrics', #PH (NC) + "\xa9mak" => 'Make', #12 + "\xa9mal" => 'MakerURL', #12 + "\xa9mod" => 'Model', #PH + "\xa9nam" => 'Title', #12 + "\xa9pdk" => 'ProducerKeywords', #12 + "\xa9phg" => 'RecordingCopyright', #12 + "\xa9prd" => 'Producer', + "\xa9prf" => 'Performers', + "\xa9prk" => 'PerformerKeywords', #12 + "\xa9prl" => 'PerformerURL', + "\xa9req" => 'Requirements', + "\xa9snk" => 'SubtitleKeywords', #12 + "\xa9snm" => 'Subtitle', #12 + "\xa9src" => 'SourceCredits', #12 + "\xa9swf" => 'SongWriter', #12 + "\xa9swk" => 'SongWriterKeywords', #12 + "\xa9swr" => 'SoftwareVersion', #12 + "\xa9too" => 'Encoder', #PH (NC) + "\xa9trk" => 'Track', #PH (NC) + "\xa9wrt" => { Name => 'Composer', Avoid => 1 }, # ("\xa9com" is preferred in UserData) + "\xa9xyz" => { #PH (iPhone 3GS) + Name => 'GPSCoordinates', + Groups => { 2 => 'Location' }, + ValueConv => \&ConvertISO6709, + ValueConvInv => \&ConvInvISO6709, + PrintConv => \&PrintGPSCoordinates, + PrintConvInv => \&PrintInvGPSCoordinates, + }, + # \xa9 tags written by DJI Phantom 3: (ref PH) + "\xa9xsp" => 'SpeedX', #PH (guess) + "\xa9ysp" => 'SpeedY', #PH (guess) + "\xa9zsp" => 'SpeedZ', #PH (guess) + "\xa9fpt" => 'Pitch', #PH + "\xa9fyw" => 'Yaw', #PH + "\xa9frl" => 'Roll', #PH + "\xa9gpt" => 'CameraPitch', #PH + "\xa9gyw" => 'CameraYaw', #PH + "\xa9grl" => 'CameraRoll', #PH + "\xa9enc" => 'EncoderID', #PH (forum9271) + # and the following entries don't have the proper 4-byte header for \xa9 tags: + "\xa9dji" => { Name => 'UserData_dji', Format => 'undef', Binary => 1, Unknown => 1, Hidden => 1 }, + "\xa9res" => { Name => 'UserData_res', Format => 'undef', Binary => 1, Unknown => 1, Hidden => 1 }, + "\xa9uid" => { Name => 'UserData_uid', Format => 'undef', Binary => 1, Unknown => 1, Hidden => 1 }, + "\xa9mdl" => { + Name => 'Model', + Notes => 'non-standard-format DJI tag', + Format => 'string', + Avoid => 1, + }, + # end DJI tags + name => 'Name', + WLOC => { + Name => 'WindowLocation', + Format => 'int16u', + }, + LOOP => { + Name => 'LoopStyle', + Format => 'int32u', + PrintConv => { + 1 => 'Normal', + 2 => 'Palindromic', + }, + }, + SelO => { + Name => 'PlaySelection', + Format => 'int8u', + }, + AllF => { + Name => 'PlayAllFrames', + Format => 'int8u', + }, + meta => { + Name => 'Meta', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Meta', + Start => 4, # must skip 4-byte version number header + }, + }, + 'ptv '=> { + Name => 'PrintToVideo', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Video' }, + }, + hnti => { + Name => 'HintInfo', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintInfo' }, + }, + hinf => { + Name => 'HintTrackInfo', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintTrackInfo' }, + }, + hinv => 'HintVersion', #PH (guess) + XMP_ => { #PH (Adobe CS3 Bridge) + Name => 'XMP', + WriteGroup => 'XMP', # (write main tags here) + # *** this is where ExifTool writes XMP in MOV videos (as per XMP spec) *** + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, + # the following are 3gp tags, references: + # http://atomicparsley.sourceforge.net + # http://www.3gpp.org/ftp/tsg_sa/WG4_CODEC/TSGS4_25/Docs/ + # (note that all %langText3gp tags are Avoid => 1) + cprt => { Name => 'Copyright', %langText3gp, Groups => { 2 => 'Author' } }, + auth => { Name => 'Author', %langText3gp, Groups => { 2 => 'Author' } }, + titl => { Name => 'Title', %langText3gp }, + dscp => { Name => 'Description',%langText3gp }, + perf => { Name => 'Performer', %langText3gp }, + gnre => { Name => 'Genre', %langText3gp }, + albm => { Name => 'Album', %langText3gp }, + coll => { Name => 'CollectionName', %langText3gp }, #17 + rtng => { + Name => 'Rating', + Writable => 'undef', + Avoid => 1, + # (4-byte flags, 4-char entity, 4-char criteria, 2-byte lang, string) + IText => 14, # (14 bytes before string) + Notes => 'string in the form "Entity=XXXX Criteria=XXXX XXXXX", used in 3gp videos', + ValueConv => '$val=~s/^(.{4})(.{4})/Entity=$1 Criteria=$2 /i; $val', + ValueConvInv => '$val=~s/Entity=(.{4}) Criteria=(.{4}) ?/$1$2/i; $val', + }, + clsf => { + Name => 'Classification', + Writable => 'undef', + Avoid => 1, + # (4-byte flags, 4-char entity, 2-byte index, 2-byte lang, string) + IText => 12, + Notes => 'string in the form "Entity=XXXX Index=### XXXXX", used in 3gp videos', + ValueConv => '$val=~s/^(.{4})(.{2})/"Entity=$1 Index=".unpack("n",$2)." "/ie; $val', + ValueConvInv => '$val=~s/Entity=(.{4}) Index=(\d+) ?/$1.pack("n",$2)/ie; $val', + }, + kywd => { + Name => 'Keywords', + # (4 byte flags, 2-byte lang, 1-byte count, count x pascal strings, ref 17) + # (but I have also seen a simple string written by iPhone, so don't make writable yet) + Notes => "not writable because Apple doesn't follow the 3gp specification", + RawConv => q{ + my $sep = $self->Options('ListSep'); + return join($sep, split /\0+/, $val) unless $val =~ /^\0/; # (iPhone) + return '<err>' unless length $val >= 7; + my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 4)); + $lang = $lang ? "($lang) " : ''; + my $num = Get8u(\$val, 6); + my ($i, @vals); + my $pos = 7; + for ($i=0; $i<$num; ++$i) { + last if $pos >= length $val; + my $len = Get8u(\$val, $pos++); + last if $pos + $len > length $val; + my $v = substr($val, $pos, $len); + $v = $self->Decode($v, 'UCS2') if $v =~ /^\xfe\xff/; + push @vals, $v; + $pos += $len; + } + return $lang . join($sep, @vals); + }, + }, + loci => { + Name => 'LocationInformation', + Groups => { 2 => 'Location' }, + Writable => 'undef', + IText => 6, + Avoid => 1, + NoDecode => 1, # (we'll decode the data ourself) + Notes => q{ + string in the form "XXXXX Role=XXX Lat=XXX Lon=XXX Alt=XXX Body=XXX + Notes=XXX", used in 3gp videos + }, + # (4-byte flags, 2-byte lang, location string, 1-byte role, 4-byte fixed longitude, + # 4-byte fixed latitude, 4-byte fixed altitude, body string, notes string) + RawConv => q{ + my $str; + if ($val =~ /^\xfe\xff/) { + $val =~ s/^(\xfe\xff(.{2})*?)\0\0//s or return '<err>'; + $str = $self->Decode($1, 'UCS2'); + } else { + $val =~ s/^(.*?)\0//s or return '<err>'; + $str = $self->Decode($1, 'UTF8'); + } + $str = '(none)' unless length $str; + return '<err>' if length $val < 13; + my $role = Get8u(\$val, 0); + my $lon = GetFixed32s(\$val, 1); + my $lat = GetFixed32s(\$val, 5); + my $alt = GetFixed32s(\$val, 9); + my $roleStr = {0=>'shooting',1=>'real',2=>'fictional',3=>'reserved'}->{$role}; + $str .= ' Role=' . ($roleStr || "unknown($role)"); + $str .= sprintf(' Lat=%.5f Lon=%.5f Alt=%.2f', $lat, $lon, $alt); + $val = substr($val, 13); + if ($val =~ s/^(\xfe\xff(.{2})*?)\0\0//s) { + $str .= ' Body=' . $self->Decode($1, 'UCS2'); + } elsif ($val =~ s/^(.*?)\0//s) { + $str .= ' Body=' . $self->Decode($1, 'UTF8'); + } + if ($val =~ s/^(\xfe\xff(.{2})*?)\0\0//s) { + $str .= ' Notes=' . $self->Decode($1, 'UCS2'); + } elsif ($val =~ s/^(.*?)\0//s) { + $str .= ' Notes=' . $self->Decode($1, 'UTF8'); + } + return $str; + }, + RawConvInv => q{ + my ($role, $lat, $lon, $alt, $body, $note); + $lat = $1 if $val =~ s/ Lat=([-+]?[.\d]+)//i; + $lon = $1 if $val =~ s/ Lon=([-+]?[.\d]+)//i; + $alt = $1 if $val =~ s/ Alt=([-+]?[.\d]+)//i; + $note = $val =~ s/ Notes=(.*)//i ? $1 : ''; + $body = $val =~ s/ Body=(.*)//i ? $1 : ''; + $role = $val =~ s/ Role=(.*)//i ? $1 : ''; + $val = '' if $val eq '(none)'; + $role = {shooting=>0,real=>1,fictional=>2}->{lc $role} || 0; + return $self->Encode($val, 'UTF8') . "\0" . Set8u($role) . + SetFixed32s(defined $lon ? $lon : 999) . + SetFixed32s(defined $lat ? $lat : 999) . + SetFixed32s(defined $alt ? $alt : 0) . + $self->Encode($body) . "\0" . + $self->Encode($note) . "\0"; + }, + }, + yrrc => { + Name => 'Year', + Writable => 'undef', + Groups => { 2 => 'Time' }, + Avoid => 1, + Notes => 'used in 3gp videos', + ValueConv => 'length($val) >= 6 ? unpack("x4n",$val) : "<err>"', + ValueConvInv => 'pack("Nn",0,$val)', + }, + urat => { #17 + Name => 'UserRating', + Writable => 'undef', + Notes => 'used in 3gp videos', + Avoid => 1, + ValueConv => q{ + return '<err>' unless length $val >= 8; + unpack('x7C', $val); + }, + ValueConvInv => 'pack("N2",0,$val)', + }, + # tsel - TrackSelection (ref 17) + # Apple tags (ref 16[dead] -- see ref 25 instead) + angl => { Name => 'CameraAngle', Format => 'string' }, # (NC) + clfn => { Name => 'ClipFileName', Format => 'string' }, # (NC) + clid => { Name => 'ClipID', Format => 'string' }, # (NC) + cmid => { Name => 'CameraID', Format => 'string' }, # (NC) + cmnm => { # (NC) + Name => 'Model', + Description => 'Camera Model Name', + Avoid => 1, + Format => 'string', # (necessary to remove the trailing NULL) + }, + date => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Notes => q{ + Apple Photos has been reported to show a crazy date/time for some MP4 files + containing this tag, but perhaps only if it is missing a time zone + }, #forum10690/11125 + Shift => 'Time', + ValueConv => q{ + require Image::ExifTool::XMP; + $val = Image::ExifTool::XMP::ConvertXMPDate($val); + $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary + return $val; + }, + ValueConvInv => q{ + require Image::ExifTool::XMP; + $val = Image::ExifTool::XMP::FormatXMPDate($val); + $val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon + return $val; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist) + }, + manu => { # (SX280) + Name => 'Make', + Avoid => 1, + # (with Canon there are 6 unknown bytes before the model: "\0\0\0\0\x15\xc7") + RawConv => '$val=~s/^\0{4}..//s; $val=~s/\0.*//; $val', + }, + modl => { # (Samsung GT-S8530, Canon SX280) + Name => 'Model', + Description => 'Camera Model Name', + Avoid => 1, + # (with Canon there are 6 unknown bytes before the model: "\0\0\0\0\x15\xc7") + RawConv => '$val=~s/^\0{4}..//s; $val=~s/\0.*//; $val', + }, + reel => { Name => 'ReelName', Format => 'string' }, # (NC) + scen => { Name => 'Scene', Format => 'string' }, # (NC) + shot => { Name => 'ShotName', Format => 'string' }, # (NC) + slno => { Name => 'SerialNumber', Format => 'string' }, # (NC) + apmd => { Name => 'ApertureMode', Format => 'undef' }, #20 + kgtt => { #http://lists.ffmpeg.org/pipermail/ffmpeg-devel-irc/2012-June/000707.html + # 'TrackType' will expand to 'Track#Type' when found inside a track + Name => 'TrackType', + # set flag to process this as international text + # even though the tag ID doesn't start with 0xa9 + IText => 4, # IText with 4-byte header + }, + chpl => { # (Nero chapter list) + Name => 'ChapterList', + ValueConv => \&ConvertChapterList, + PrintConv => \&PrintChapter, + }, + # ndrm - 7 bytes (0 0 0 1 0 0 0) Nero Digital Rights Management? (PH) + # other non-Apple tags (ref 16) + # hpix - HipixRichPicture (ref 16, HIPIX) + # strk - sub-track information (ref 16, ISO) +# +# Manufacturer-specific metadata +# + TAGS => [ #PH + # these tags were initially discovered in a Pentax movie, + # but similar information is found in videos from other manufacturers + { + Name => 'FujiFilmTags', + Condition => '$$valPt =~ /^FUJIFILM DIGITAL CAMERA\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::FujiFilm::MOV', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'KodakTags', + Condition => '$$valPt =~ /^EASTMAN KODAK COMPANY/', + SubDirectory => { + TagTable => 'Image::ExifTool::Kodak::MOV', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'KonicaMinoltaTags', + Condition => '$$valPt =~ /^KONICA MINOLTA DIGITAL CAMERA/', + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::MOV1', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'MinoltaTags', + Condition => '$$valPt =~ /^MINOLTA DIGITAL CAMERA/', + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::MOV2', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'NikonTags', + Condition => '$$valPt =~ /^NIKON DIGITAL CAMERA\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::MOV', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'OlympusTags1', + Condition => '$$valPt =~ /^OLYMPUS DIGITAL CAMERA\0.{9}\x01\0/s', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::MOV1', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'OlympusTags2', + Condition => '$$valPt =~ /^OLYMPUS DIGITAL CAMERA(?!\0.{21}\x0a\0{3})/s', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::MOV2', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'OlympusTags3', + Condition => '$$valPt =~ /^OLYMPUS DIGITAL CAMERA\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::MP4', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'OlympusTags4', + Condition => '$$valPt =~ /^.{16}OLYM\0/s', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::MOV3', + Start => 12, + }, + }, + { + Name => 'PentaxTags', + Condition => '$$valPt =~ /^PENTAX DIGITAL CAMERA\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::MOV', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'SamsungTags', + Condition => '$$valPt =~ /^SAMSUNG DIGITAL CAMERA\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::Samsung::MP4', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'SanyoMOV', + Condition => q{ + $$valPt =~ /^SANYO DIGITAL CAMERA\0/ and + $self->{VALUE}->{FileType} eq "MOV" + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Sanyo::MOV', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'SanyoMP4', + Condition => q{ + $$valPt =~ /^SANYO DIGITAL CAMERA\0/ and + $self->{VALUE}->{FileType} eq "MP4" + }, + SubDirectory => { + TagTable => 'Image::ExifTool::Sanyo::MP4', + ByteOrder => 'LittleEndian', + }, + }, + { + Name => 'UnknownTags', + Unknown => 1, + Binary => 1 + }, + ], + # ---- Canon ---- + CNCV => { Name => 'CompressorVersion', Format => 'string' }, #PH (5D Mark II) + CNMN => { + Name => 'Model', #PH (EOS 550D) + Description => 'Camera Model Name', + Avoid => 1, + Format => 'string', # (necessary to remove the trailing NULL) + }, + CNFV => { Name => 'FirmwareVersion', Format => 'string' }, #PH (EOS 550D) + CNTH => { #PH (PowerShot S95) + Name => 'CanonCNTH', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CNTH' }, + }, + CNOP => { #PH (7DmkII) + Name => 'CanonCNOP', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CNOP' }, + }, + # CNDB - 2112 bytes (550D) + # CNDM - 4 bytes - 0xff,0xd8,0xff,0xd9 (S95) + # CNDG - 10232 bytes, mostly zeros (N100) + # ---- Casio ---- + QVMI => { #PH + Name => 'CasioQVMI', + # Casio stores standard EXIF-format information in MOV videos (eg. EX-S880) + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default) + DirName => 'IFD0', + Multi => 0, # (no NextIFD pointer) + Start => 10, + ByteOrder => 'BigEndian', + }, + }, + # ---- FujiFilm ---- + FFMV => { #PH (FinePix HS20EXR) + Name => 'FujiFilmFFMV', + SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::FFMV' }, + }, + MVTG => { #PH (FinePix HS20EXR) + Name => 'FujiFilmMVTG', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default) + DirName => 'IFD0', + Start => 16, + Base => '$start', + ByteOrder => 'LittleEndian', + }, + }, + # ---- Garmin ---- (ref PH) + uuid => [{ + Name => 'GarminSoftware', # (NC) + Condition => '$$valPt =~ /^VIRBactioncamera/', + RawConv => 'substr($val, 16)', + RawConvInv => '"VIRBactioncamera$val"', + },{ + # have seen "28 f3 11 e2 b7 91 4f 6f 94 e2 4f 5d ea cb 3c 01" for RicohThetaZ1 accelerometer RADT data (not yet decoded) + Name => 'UUID-Unknown', + Writable => 0, + %unknownInfo, + }], + pmcc => { + Name => 'GarminSettings', + ValueConv => 'substr($val, 4)', + ValueConvInv => '"\0\0\0\x01$val"', + }, + # hmtp - "\0\0\0\x01" followed by 408 bytes of zero + # vrin - "\0\0\0\x01" followed by 8 bytes of zero + # ---- GoPro ---- (ref PH) + GoPr => 'GoProType', # (Hero3+) + FIRM => { Name => 'FirmwareVersion', Avoid => 1 }, # (Hero4) + LENS => 'LensSerialNumber', # (Hero4) + CAME => { # (Hero4) + Name => 'SerialNumberHash', + Description => 'Camera Serial Number Hash', + ValueConv => 'unpack("H*",$val)', + ValueConvInv => 'pack("H*",$val)', + }, + # SETT? 12 bytes (Hero4) + # MUID? 32 bytes (Hero4, starts with serial number hash) + # HMMT? 404 bytes (Hero4, all zero) + # BCID? 26 bytes (Hero5, all zero), 36 bytes GoPro Max + # GUMI? 16 bytes (Hero5) + "FOV\0" => 'FieldOfView', #forum8938 (Hero2) seen: "Wide" + GPMF => { + Name => 'GoProGPMF', + SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPMF' }, + }, + # free (all zero) + "\xa9TSC" => 'StartTimeScale', # (Hero6) + "\xa9TSZ" => 'StartTimeSampleSize', # (Hero6) + "\xa9TIM" => 'StartTimecode', #PH (NC) + # --- HTC ---- + htcb => { + Name => 'HTCBinary', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HTCBinary' }, + }, + # ---- Kodak ---- + DcMD => { + Name => 'KodakDcMD', + SubDirectory => { TagTable => 'Image::ExifTool::Kodak::DcMD' }, + }, + SNum => { Name => 'SerialNumber', Avoid => 1, Groups => { 2 => 'Camera' } }, + ptch => { Name => 'Pitch', Format => 'rational64s', Avoid => 1 }, # Units?? + _yaw => { Name => 'Yaw', Format => 'rational64s', Avoid => 1 }, # Units?? + roll => { Name => 'Roll', Format => 'rational64s', Avoid => 1 }, # Units?? + _cx_ => { Name => 'CX', Format => 'rational64s', Unknown => 1 }, + _cy_ => { Name => 'CY', Format => 'rational64s', Unknown => 1 }, + rads => { Name => 'Rads', Format => 'rational64s', Unknown => 1 }, + lvlm => { Name => 'LevelMeter', Format => 'rational64s', Unknown => 1 }, # (guess) + Lvlm => { Name => 'LevelMeter', Format => 'rational64s', Unknown => 1 }, # (guess) + pose => { Name => 'pose', SubDirectory => { TagTable => 'Image::ExifTool::Kodak::pose' } }, + # AMBA => Ambarella AVC atom (unknown data written by Kodak Playsport video cam) + # tmlp - 1 byte: 0 (PixPro SP360/4KVR360) + # pivi - 72 bytes (PixPro SP360) + # pive - 12 bytes (PixPro SP360) + # loop - 4 bytes: 0 0 0 0 (PixPro 4KVR360) + # m cm - 2 bytes: 0 0 (PixPro 4KVR360) + # m ev - 2 bytes: 0 0 (PixPro SP360/4KVR360) (exposure comp?) + # m vr - 2 bytes: 0 1 (PixPro 4KVR360) (virtual reality?) + # m wb - 4 bytes: 0 0 0 0 (PixPro SP360/4KVR360) (white balance?) + # mclr - 4 bytes: 0 0 0 0 (PixPro SP360/4KVR360) + # mmtr - 4 bytes: 0,6 0 0 0 (PixPro SP360/4KVR360) + # mflr - 4 bytes: 0 0 0 0 (PixPro SP360) + # lvlm - 24 bytes (PixPro SP360) + # Lvlm - 24 bytes (PixPro 4KVR360) + # ufdm - 4 bytes: 0 0 0 1 (PixPro SP360) + # mtdt - 1 byte: 0 (PixPro SP360/4KVR360) + # gdta - 75240 bytes (PixPro SP360) + # EIS1 - 4 bytes: 03 07 00 00 (PixPro 4KVR360) + # EIS2 - 4 bytes: 04 97 00 00 (PixPro 4KVR360) + # ---- LG ---- + adzc => { Name => 'Unknown_adzc', Unknown => 1, Hidden => 1, %langText }, # "false\0/","true\0/" + adze => { Name => 'Unknown_adze', Unknown => 1, Hidden => 1, %langText }, # "false\0/" + adzm => { Name => 'Unknown_adzm', Unknown => 1, Hidden => 1, %langText }, # "\x0e\x04/","\x10\x06" + # ---- Microsoft ---- + Xtra => { #PH (microsoft) + Name => 'MicrosoftXtra', + WriteGroup => 'Microsoft', + SubDirectory => { + DirName => 'Microsoft', + TagTable => 'Image::ExifTool::Microsoft::Xtra', + }, + }, + # ---- Minolta ---- + MMA0 => { #PH (DiMage 7Hi) + Name => 'MinoltaMMA0', + SubDirectory => { TagTable => 'Image::ExifTool::Minolta::MMA' }, + }, + MMA1 => { #PH (Dimage A2) + Name => 'MinoltaMMA1', + SubDirectory => { TagTable => 'Image::ExifTool::Minolta::MMA' }, + }, + # ---- Nikon ---- + NCDT => { #PH + Name => 'NikonNCDT', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::NCDT' }, + }, + # ---- Olympus ---- + scrn => { #PH (TG-810) + Name => 'OlympusPreview', + Condition => '$$valPt =~ /^.{4}\xff\xd8\xff\xdb/s', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::scrn' }, + }, + # ---- Panasonic/Leica ---- + PANA => { #PH + Name => 'PanasonicPANA', + SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::PANA' }, + }, + LEIC => { #PH + Name => 'LeicaLEIC', + SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::PANA' }, + }, + # ---- Pentax ---- + thmb => [ # (apparently defined by 3gpp, ref 16) + { #PH (Pentax Q) + Name => 'MakerNotePentax5a', + Condition => '$$valPt =~ /^PENTAX \0II/', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::Main', + ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default) + Start => 10, + Base => '$start - 10', + ByteOrder => 'LittleEndian', + }, + },{ #PH (TG-810) + Name => 'OlympusThumbnail', + Condition => '$$valPt =~ /^.{4}\xff\xd8\xff\xdb/s', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::thmb' }, + },{ #17 (format is in bytes 3-7) + Name => 'ThumbnailImage', + Condition => '$$valPt =~ /^.{8}\xff\xd8\xff[\xdb\xe0]/s', + Groups => { 2 => 'Preview' }, + RawConv => 'substr($val, 8)', + Binary => 1, + },{ #17 (format is in bytes 3-7) + Name => 'ThumbnailPNG', + Condition => '$$valPt =~ /^.{8}\x89PNG\r\n\x1a\n/s', + Groups => { 2 => 'Preview' }, + RawConv => 'substr($val, 8)', + Binary => 1, + },{ + Name => 'UnknownThumbnail', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + ], + PENT => { #PH + Name => 'PentaxPENT', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::PENT', + ByteOrder => 'LittleEndian', + }, + }, + PXTH => { #PH (Pentax K-01) + Name => 'PentaxPreview', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::PXTH' }, + }, + PXMN => [{ #PH (Pentax K-01) + Name => 'MakerNotePentax5b', + Condition => '$$valPt =~ /^PENTAX \0MM/', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::Main', + ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default) + Start => 10, + Base => '$start - 10', + ByteOrder => 'BigEndian', + }, + },{ #PH (Pentax 645Z) + Name => 'MakerNotePentax5c', + Condition => '$$valPt =~ /^PENTAX \0II/', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::Main', + ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default) + Start => 10, + Base => '$start - 10', + ByteOrder => 'LittleEndian', + }, + },{ + Name => 'MakerNotePentaxUnknown', + Binary => 1, + }], + # ---- Ricoh ---- + RTHU => { #PH (GR) + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + RawConv => '$self->ValidateImage(\$val, $tag)', + }, + RMKN => { #PH (GR) + Name => 'RicohRMKN', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, # (because ProcessMOV is default) + }, + }, + '@mak' => { Name => 'Make', Avoid => 1 }, + '@mod' => { Name => 'Model', Avoid => 1 }, + '@swr' => { Name => 'SoftwareVersion', Avoid => 1 }, + '@day' => { + Name => 'ContentCreateDate', + Notes => q{ + some stupid Ricoh programmer used the '@' symbol instead of the copyright + symbol in these tag ID's for the Ricoh Theta Z1 and maybe other models + }, + Groups => { 2 => 'Time' }, + Shift => 'Time', + Avoid => 1, + # handle values in the form "2010-02-12T13:27:14-0800" + ValueConv => q{ + require Image::ExifTool::XMP; + $val = Image::ExifTool::XMP::ConvertXMPDate($val); + $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary + return $val; + }, + ValueConvInv => q{ + require Image::ExifTool::XMP; + my $tmp = Image::ExifTool::XMP::FormatXMPDate($val); + ($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon + return $val; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist) + }, + '@xyz' => { #PH (iPhone 3GS) + Name => 'GPSCoordinates', + Groups => { 2 => 'Location' }, + Avoid => 1, + ValueConv => \&ConvertISO6709, + ValueConvInv => \&ConvInvISO6709, + PrintConv => \&PrintGPSCoordinates, + PrintConvInv => \&PrintInvGPSCoordinates, + }, + # RDT1 - pairs of int32u_BE, starting at byte 8: "458275 471846" + # RDT2 - pairs of int32u_BE, starting at byte 8: "472276 468526" + # RDT3 - pairs of int32u_BE, starting at byte 8: "876603 482191" + # RDT4 - pairs of int32u_BE, starting at byte 8: "1955 484612" + # RDT6 - empty + # RDT7 - empty + # RDT8 - empty + # RDT9 - only 16-byte header? + # the boxes below all have a similar header (little-endian): + # 0 int32u - number of records + # 4 ? - "1e 00" + # 6 int16u - record length in bytes + # 8 ? - "23 01 00 00 00 00 00 00" + # 16 - start of records (each record ends in an int64u timestamp "ts" in ns) + # RDTA - float[4],ts: "-0.31289672 -0.2245330 11.303817 0 775.780" + # RDTB - float[4],ts: "-0.04841613 -0.2166595 0.0724792 0 775.780" + # RDTC - float[4],ts: "27.60925 -27.10037 -13.27285 0 775.829" + # RDTD - int16s[3],ts: "353 -914 16354 0 775.829" + # RDTG - ts: "775.825" + # RDTI - float[4],ts: "0.00165951 0.005770059 0.06838259 0.1744695 775.862" + # ---- Samsung ---- + vndr => 'Vendor', #PH (Samsung PL70) + SDLN => 'PlayMode', #PH (NC, Samsung ST80 "SEQ_PLAY") + INFO => { + Name => 'SamsungINFO', + SubDirectory => { TagTable => 'Image::ExifTool::Samsung::INFO' }, + }, + '@sec' => { #PH (Samsung WB30F) + Name => 'SamsungSec', + SubDirectory => { TagTable => 'Image::ExifTool::Samsung::sec' }, + }, + 'smta' => { #PH (Samsung SM-C101) + Name => 'SamsungSmta', + SubDirectory => { + TagTable => 'Image::ExifTool::Samsung::smta', + Start => 4, + }, + }, + cver => 'CodeVersion', #PH (guess, Samsung MV900F) + # ducp - 4 bytes all zero (Samsung ST96,WB750), 52 bytes all zero (Samsung WB30F) + # edli - 52 bytes all zero (Samsung WB30F) + # @etc - 4 bytes all zero (Samsung WB30F) + # saut - 4 bytes all zero (Samsung SM-N900T) + # smrd - string "TRUEBLUE" (Samsung SM-C101) + # ---- TomTom Bandit Action Cam ---- + TTMD => { + Name => 'TomTomMetaData', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TomTom' }, + }, + # ---- Samsung Gear 360 ---- + vrot => { + Name => 'AccelerometerData', + Notes => q{ + accelerometer readings for each frame of the video, expressed as sets of + yaw, pitch and roll angles in degrees + }, + Format => 'rational64s', + ValueConv => '$val =~ s/^-?\d+ //; \$val', # (ignore leading version/size words) + }, + # m360 - 8 bytes "0 0 0 0 0 0 0 1" + # opax - 164 bytes unknown (center and affine arrays? ref 26) + # opai - 32 bytes (maybe contains a serial number starting at byte 16? - PH) (rgb gains, degamma, gamma? ref 26) + # intv - 16 bytes all zero + # ---- Xaiomi ---- + mcvr => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + # ---- Unknown ---- + # CDET - 128 bytes (unknown origin) + # mtyp - 4 bytes all zero (some drone video) + # kgrf - 8 bytes all zero ? (in udta inside trak atom) + # kgcg - 128 bytes 0's and 1's + # kgsi - 4 bytes "00 00 00 80" + # FIEL - 18 bytes "FIEL\0\x01\0\0\0..." +# +# other 3rd-party tags +# (ref http://code.google.com/p/mp4parser/source/browse/trunk/isoparser/src/main/resources/isoparser-default.properties?r=814) +# + ccid => 'ContentID', + icnu => 'IconURI', + infu => 'InfoURL', + cdis => 'ContentDistributorID', + albr => { Name => 'AlbumArtist', Groups => { 2 => 'Author' } }, + cvru => 'CoverURI', + lrcu => 'LyricsURI', + + tags => { # found in Audible .m4b audio books (ref PH) + Name => 'Audible_tags', + SubDirectory => { TagTable => 'Image::ExifTool::Audible::tags' }, + }, +); + +# Unknown information stored in HTC One (M8) videos - PH +%Image::ExifTool::QuickTime::HTCBinary = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 1 => 'HTC', 2 => 'Video' }, + TAG_PREFIX => 'HTCBinary', + FORMAT => 'int32u', + FIRST_ENTRY => 0, + # 0 - values: 1 + # 1 - values: 0 + # 2 - values: 0 + # 3 - values: FileSize minus 12 (why?) + # 4 - values: 12 +); + +# TomTom Bandit Action Cam metadata (ref PH) +%Image::ExifTool::QuickTime::TomTom = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Video' }, + NOTES => 'Tags found in TomTom Bandit Action Cam MP4 videos.', + TTAD => { + Name => 'TomTomAD', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Stream', + ProcessProc => \&Image::ExifTool::QuickTime::ProcessTTAD, + }, + }, + TTHL => { Name => 'TomTomHL', Binary => 1, Unknown => 1 }, # (mostly zeros) + # (TTID values are different for each video) + TTID => { Name => 'TomTomID', ValueConv => 'unpack("x4H*",$val)' }, + TTVI => { Name => 'TomTomVI', Format => 'int32u', Unknown => 1 }, # seen: "0 1 61 508 508" + # TTVD seen: "normal 720p 60fps 60fps 16/9 wide 1x" + TTVD => { Name => 'TomTomVD', ValueConv => 'my @a = ($val =~ /[\x20-\x7f]+/g); "@a"' }, +); + +# User-specific media data atoms (ref 11) +%Image::ExifTool::QuickTime::UserMedia = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Video' }, + MTDT => { + Name => 'MetaData', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MetaData' }, + }, +); + +# User-specific media data atoms (ref 11) +%Image::ExifTool::QuickTime::MetaData = ( + PROCESS_PROC => \&ProcessMetaData, + GROUPS => { 2 => 'Video' }, + TAG_PREFIX => 'MetaData', + 0x01 => 'Title', + 0x03 => { + Name => 'ProductionDate', + Groups => { 2 => 'Time' }, + Shift => 'Time', + Writable => 1, + Permanent => 1, + DelValue => '0000/00/00 00:00:00', + # translate from format "YYYY/mm/dd HH:MM:SS" + ValueConv => '$val=~tr{/}{:}; $val', + ValueConvInv => '$val=~s[^(\d{4}):(\d{2}):][$1/$2/]; $val', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + 0x04 => 'Software', + 0x05 => 'Product', + 0x0a => { + Name => 'TrackProperty', + RawConv => 'my @a=unpack("Nnn",$val); "@a"', + PrintConv => [ + { 0 => 'No presentation', BITMASK => { 0 => 'Main track' } }, + { 0 => 'No attributes', BITMASK => { 15 => 'Read only' } }, + '"Priority $val"', + ], + }, + 0x0b => { + Name => 'TimeZone', + Groups => { 2 => 'Time' }, + Writable => 1, + Permanent => 1, + DelValue => 0, + RawConv => 'Get16s(\$val,0)', + RawConvInv => 'Set16s($val)', + PrintConv => 'TimeZoneString($val)', + PrintConvInv => q{ + return undef unless $val =~ /^([-+])(\d{1,2}):?(\d{2})$/' + my $tzmin = $2 * 60 + $3; + $tzmin = -$tzmin if $1 eq '-'; + return $tzmin; + } + }, + 0x0c => { + Name => 'ModifyDate', + Groups => { 2 => 'Time' }, + Shift => 'Time', + Writable => 1, + Permanent => 1, + DelValue => '0000/00/00 00:00:00', + # translate from format "YYYY/mm/dd HH:MM:SS" + ValueConv => '$val=~tr{/}{:}; $val', + ValueConvInv => '$val=~s[^(\d{4}):(\d{2}):][$1/$2/]; $val', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, +); + +# compressed movie atoms (ref http://wiki.multimedia.cx/index.php?title=QuickTime_container#cmov) +%Image::ExifTool::QuickTime::CMovie = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Video' }, + dcom => 'Compression', + # cmvd - compressed moov atom data +); + +# Profile atoms (ref 11) +%Image::ExifTool::QuickTime::Profile = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Video' }, + FPRF => { + Name => 'FileGlobalProfile', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::FileProf' }, + }, + APRF => { + Name => 'AudioProfile', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::AudioProf' }, + }, + VPRF => { + Name => 'VideoProfile', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::VideoProf' }, + }, + OLYM => { #PH + Name => 'OlympusOLYM', + SubDirectory => { + TagTable => 'Image::ExifTool::Olympus::OLYM', + ByteOrder => 'BigEndian', + }, + }, +); + +# FPRF atom information (ref 11) +%Image::ExifTool::QuickTime::FileProf = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int32u', + 0 => { Name => 'FileProfileVersion', Unknown => 1 }, # unknown = uninteresting + 1 => { + Name => 'FileFunctionFlags', + PrintConv => { BITMASK => { + 28 => 'Fragmented', + 29 => 'Additional tracks', + 30 => 'Edited', # (main AV track is edited) + }}, + }, + # 2 - reserved +); + +# APRF atom information (ref 11) +%Image::ExifTool::QuickTime::AudioProf = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + FORMAT => 'int32u', + 0 => { Name => 'AudioProfileVersion', Unknown => 1 }, + 1 => 'AudioTrackID', + 2 => { + Name => 'AudioCodec', + Format => 'undef[4]', + }, + 3 => { + Name => 'AudioCodecInfo', + Unknown => 1, + PrintConv => 'sprintf("0x%.4x", $val)', + }, + 4 => { + Name => 'AudioAttributes', + PrintConv => { BITMASK => { + 0 => 'Encrypted', + 1 => 'Variable bitrate', + 2 => 'Dual mono', + }}, + }, + 5 => { + Name => 'AudioAvgBitrate', + ValueConv => '$val * 1000', + PrintConv => 'ConvertBitrate($val)', + }, + 6 => { + Name => 'AudioMaxBitrate', + ValueConv => '$val * 1000', + PrintConv => 'ConvertBitrate($val)', + }, + 7 => 'AudioSampleRate', + 8 => 'AudioChannels', +); + +# VPRF atom information (ref 11) +%Image::ExifTool::QuickTime::VideoProf = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int32u', + 0 => { Name => 'VideoProfileVersion', Unknown => 1 }, + 1 => 'VideoTrackID', + 2 => { + Name => 'VideoCodec', + Format => 'undef[4]', + }, + 3 => { + Name => 'VideoCodecInfo', + Unknown => 1, + PrintConv => 'sprintf("0x%.4x", $val)', + }, + 4 => { + Name => 'VideoAttributes', + PrintConv => { BITMASK => { + 0 => 'Encrypted', + 1 => 'Variable bitrate', + 2 => 'Variable frame rate', + 3 => 'Interlaced', + }}, + }, + 5 => { + Name => 'VideoAvgBitrate', + ValueConv => '$val * 1000', + PrintConv => 'ConvertBitrate($val)', + }, + 6 => { + Name => 'VideoMaxBitrate', + ValueConv => '$val * 1000', + PrintConv => 'ConvertBitrate($val)', + }, + 7 => { + Name => 'VideoAvgFrameRate', + Format => 'fixed32u', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + }, + 8 => { + Name => 'VideoMaxFrameRate', + Format => 'fixed32u', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + }, + 9 => { + Name => 'VideoSize', + Format => 'int16u[2]', + PrintConv => '$val=~tr/ /x/; $val', + }, + 10 => { + Name => 'PixelAspectRatio', + Format => 'int16u[2]', + PrintConv => '$val=~tr/ /:/; $val', + }, +); + +# meta atoms +%Image::ExifTool::QuickTime::Meta = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + GROUPS => { 1 => 'Meta', 2 => 'Video' }, + ilst => { + Name => 'ItemList', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::ItemList', + HasData => 1, # process atoms as containers with 'data' elements + }, + }, + # MP4 tags (ref 5) + hdlr => { + Name => 'Handler', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Handler' }, + }, + dinf => { + Name => 'DataInfo', # (don't change this name -- used to recognize directory when writing) + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::DataInfo' }, + }, + ipmc => { + Name => 'IPMPControl', + Flags => ['Binary','Unknown'], + }, + iloc => { + Name => 'ItemLocation', + RawConv => \&ParseItemLocation, + WriteHook => \&ParseItemLocation, + Notes => 'parsed, but not extracted as a tag', + }, + ipro => { + Name => 'ItemProtection', + Flags => ['Binary','Unknown'], + }, + iinf => [{ + Name => 'ItemInformation', + Condition => '$$valPt =~ /^\0/', # (check for version 0) + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::ItemInfo', + Start => 6, # (4-byte version/flags + 2-byte count) + }, + },{ + Name => 'ItemInformation', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::ItemInfo', + Start => 8, # (4-byte version/flags + 4-byte count) + }, + }], + 'xml ' => { + Name => 'XML', + Flags => [ 'Binary', 'Protected' ], + SubDirectory => { + TagTable => 'Image::ExifTool::XMP::XML', + IgnoreProp => { NonRealTimeMeta => 1 }, # ignore container for Sony 'nrtm' + }, + }, + 'keys' => { + Name => 'Keys', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Keys' }, + }, + bxml => { + Name => 'BinaryXML', + Flags => ['Binary','Unknown'], + }, + pitm => [{ + Name => 'PrimaryItemReference', + Condition => '$$valPt =~ /^\0/', # (version 0?) + RawConv => '$$self{PrimaryItem} = unpack("x4n",$val)', + WriteHook => sub { my ($val,$et) = @_; $$et{PrimaryItem} = unpack("x4n",$val); }, + },{ + Name => 'PrimaryItemReference', + RawConv => '$$self{PrimaryItem} = unpack("x4N",$val)', + WriteHook => sub { my ($val,$et) = @_; $$et{PrimaryItem} = unpack("x4N",$val); }, + }], + free => { #PH + Name => 'Free', + Flags => ['Binary','Unknown'], + }, + iprp => { + Name => 'ItemProperties', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ItemProp' }, + }, + iref => { + Name => 'ItemReference', + # the version is needed to parse some of the item references + Condition => '$$self{ItemRefVersion} = ord($$valPt); 1', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::ItemRef', + Start => 4, + }, + }, + idat => { + Name => 'MetaImageSize', #PH (NC) + Format => 'int16u', + # (don't know what the first two numbers are for) + PrintConv => '$val =~ s/^(\d+) (\d+) (\d+) (\d+)/${3}x$4/; $val', + }, + uuid => [ + { #PH (Canon R5/R6 HIF) + Name => 'MetaVersion', # (NC) + Condition => '$$valPt=~/^\x85\xc0\xb6\x87\x82\x0f\x11\xe0\x81\x11\xf4\xce\x46\x2b\x6a\x48/', + RawConv => 'substr($val, 0x14)', + }, + { + Name => 'UUID-Unknown', + %unknownInfo, + }, + ], +); + +# additional metadata container (ref ISO14496-12:2015) +%Image::ExifTool::QuickTime::OtherMeta = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + GROUPS => { 2 => 'Video' }, + mere => { + Name => 'MetaRelation', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MetaRelation' }, + }, + meta => { + Name => 'Meta', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Meta' }, + }, +); + +# metabox relation (ref ISO14496-12:2015) +%Image::ExifTool::QuickTime::MetaRelation = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int32u', + # 0 => 'MetaRelationVersion', + # 1 => 'FirstMetaboxHandlerType', + # 2 => 'FirstMetaboxHandlerType', + # 3 => { Name => 'MetaboxRelation', Format => 'int8u' }, +); + +%Image::ExifTool::QuickTime::ItemProp = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + GROUPS => { 2 => 'Image' }, + ipco => { + Name => 'ItemPropertyContainer', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ItemPropCont' }, + }, + ipma => { + Name => 'ItemPropertyAssociation', + RawConv => \&ParseItemPropAssoc, + WriteHook => \&ParseItemPropAssoc, + Notes => 'parsed, but not extracted as a tag', + }, +); + +%Image::ExifTool::QuickTime::ItemPropCont = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + PERMANENT => 1, # (can't be deleted) + GROUPS => { 2 => 'Image' }, + VARS => { START_INDEX => 1 }, # show verbose indices starting at 1 + colr => [{ + Name => 'ICC_Profile', + Condition => '$$valPt =~ /^(prof|rICC)/', + Permanent => 0, # (in QuickTime, this writes a zero-length box instead of deleting) + SubDirectory => { + TagTable => 'Image::ExifTool::ICC_Profile::Main', + Start => 4, + }, + },{ + Name => 'ColorRepresentation', + ValueConv => 'join(" ", substr($val,0,4), unpack("x4n*",$val))', + }], + irot => { + Name => 'Rotation', + Format => 'int8u', + Writable => 'int8u', + Protected => 1, + ValueConv => '$val * 90', + ValueConvInv => 'int($val / 90 + 0.5)', + }, + ispe => { + Name => 'ImageSpatialExtent', + Condition => '$$valPt =~ /^\0{4}/', # (version/flags == 0/0) + RawConv => q{ + my @dim = unpack("x4N*", $val); + return undef if @dim < 2; + unless ($$self{DOC_NUM}) { + $self->FoundTag(ImageWidth => $dim[0]); + $self->FoundTag(ImageHeight => $dim[1]); + } + return join ' ', @dim; + }, + PrintConv => '$val =~ tr/ /x/; $val', + }, + pixi => { + Name => 'ImagePixelDepth', + Condition => '$$valPt =~ /^\0{4}./s', # (version/flags == 0/0 and count) + RawConv => 'join " ", unpack("x5C*", $val)', + }, + auxC => { + Name => 'AuxiliaryImageType', + Format => 'undef', + RawConv => '$val = substr($val, 4); $val =~ s/\0.*//s; $val', + }, + pasp => { + Name => 'PixelAspectRatio', + Format => 'int32u', + Writable => 'int32u', + Protected => 1, + }, + rloc => { + Name => 'RelativeLocation', + Format => 'int32u', + RawConv => '$val =~ s/^\S+\s+//; $val', # remove version/flags + }, + clap => { + Name => 'CleanAperture', + Format => 'rational64s', + Notes => '4 numbers: width, height, left and top', + }, + hvcC => { + Name => 'HEVCConfiguration', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HEVCConfig' }, + }, + av1C => { + Name => 'AV1Configuration', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::AV1Config' }, + }, +); + +# HEVC configuration (ref https://github.com/MPEGGroup/isobmff/blob/master/IsoLib/libisomediafile/src/HEVCConfigAtom.c) +%Image::ExifTool::QuickTime::HEVCConfig = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FIRST_ENTRY => 0, + 0 => 'HEVCConfigurationVersion', + 1 => { + Name => 'GeneralProfileSpace', + Mask => 0xc0, + PrintConv => { 0 => 'Conforming' }, + }, + 1.1 => { + Name => 'GeneralTierFlag', + Mask => 0x20, + PrintConv => { + 0 => 'Main Tier', + 1 => 'High Tier', + }, + }, + 1.2 => { + Name => 'GeneralProfileIDC', + Mask => 0x1f, + PrintConv => { + 0 => 'No Profile', + 1 => 'Main', + 2 => 'Main 10', + 3 => 'Main Still Picture', + 4 => 'Format Range Extensions', + 5 => 'High Throughput', + 6 => 'Multiview Main', + 7 => 'Scalable Main', + 8 => '3D Main', + 9 => 'Screen Content Coding Extensions', + 10 => 'Scalable Format Range Extensions', + 11 => 'High Throughput Screen Content Coding Extensions', + }, + }, + 2 => { + Name => 'GenProfileCompatibilityFlags', + Format => 'int32u', + PrintConv => { BITMASK => { + 31 => 'No Profile', # (bit 0 in stream) + 30 => 'Main', # (bit 1 in stream) + 29 => 'Main 10', # (bit 2 in stream) + 28 => 'Main Still Picture', # (bit 3 in stream) + 27 => 'Format Range Extensions',# (...) + 26 => 'High Throughput', + 25 => 'Multiview Main', + 24 => 'Scalable Main', + 23 => '3D Main', + 22 => 'Screen Content Coding Extensions', + 21 => 'Scalable Format Range Extensions', + 20 => 'High Throughput Screen Content Coding Extensions', + }}, + }, + 6 => { + Name => 'ConstraintIndicatorFlags', + Format => 'int8u[6]', + }, + 12 => { + Name => 'GeneralLevelIDC', + PrintConv => 'sprintf("%d (level %.1f)", $val, $val/30)', + }, + 13 => { + Name => 'MinSpatialSegmentationIDC', + Format => 'int16u', + Mask => 0x0fff, + }, + 15 => { + Name => 'ParallelismType', + Mask => 0x03, + }, + 16 => { + Name => 'ChromaFormat', + Mask => 0x03, + PrintConv => { + 0 => 'Monochrome', + 1 => '4:2:0', + 2 => '4:2:2', + 3 => '4:4:4', + }, + }, + 17 => { + Name => 'BitDepthLuma', + Mask => 0x07, + ValueConv => '$val + 8', + }, + 18 => { + Name => 'BitDepthChroma', + Mask => 0x07, + ValueConv => '$val + 8', + }, + 19 => { + Name => 'AverageFrameRate', + Format => 'int16u', + ValueConv => '$val / 256', + }, + 21 => { + Name => 'ConstantFrameRate', + Mask => 0xc0, + PrintConv => { + 0 => 'Unknown', + 1 => 'Constant Frame Rate', + 2 => 'Each Temporal Layer is Constant Frame Rate', + }, + }, + 21.1 => { + Name => 'NumTemporalLayers', + Mask => 0x38, + }, + 21.2 => { + Name => 'TemporalIDNested', + Mask => 0x04, + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + #21.3 => { + # Name => 'NALUnitLengthSize', + # Mask => 0x03, + # ValueConv => '$val + 1', + # PrintConv => { 1 => '8-bit', 2 => '16-bit', 4 => '32-bit' }, + #}, + #22 => 'NumberOfNALUnitArrays', + # (don't decode the NAL unit arrays) +); + +# HEVC configuration (ref https://aomediacodec.github.io/av1-isobmff/#av1codecconfigurationbox) +%Image::ExifTool::QuickTime::AV1Config = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FIRST_ENTRY => 0, + 0 => { + Name => 'AV1ConfigurationVersion', + Mask => 0x7f, + }, + 1.0 => { + Name => 'SeqProfile', + Mask => 0xe0, + Unknown => 1, + }, + 1.1 => { + Name => 'SeqLevelIdx0', + Mask => 0x1f, + Unknown => 1, + }, + 2.0 => { + Name => 'SeqTier0', + Mask => 0x80, + Unknown => 1, + }, + 2.1 => { + Name => 'HighBitDepth', + Mask => 0x40, + Unknown => 1, + }, + 2.2 => { + Name => 'TwelveBit', + Mask => 0x20, + Unknown => 1, + }, + 2.3 => { + Name => 'ChromaFormat', # (Monochrome+SubSamplingX+SubSamplingY) + Notes => 'bits: 0x04 = Monochrome, 0x02 = SubSamplingX, 0x01 = SubSamplingY', + Mask => 0x1c, + PrintConv => { + 0x00 => 'YUV 4:4:4', + 0x02 => 'YUV 4:2:2', + 0x03 => 'YUV 4:2:0', + 0x07 => 'Monochrome 4:0:0', + }, + }, + 2.4 => { + Name => 'ChromaSamplePosition', + Mask => 0x03, + PrintConv => { + 0 => 'Unknown', + 1 => 'Vertical', + 2 => 'Colocated', + 3 => '(reserved)', + }, + }, + 3 => { + Name => 'InitialDelaySamples', + RawConv => '$val & 0x10 ? undef : ($val & 0x0f) + 1', + Unknown => 1, + }, +); + +%Image::ExifTool::QuickTime::ItemRef = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + GROUPS => { 2 => 'Image' }, + # (Note: ExifTool's ItemRefVersion may be used to test the iref version number) + NOTES => q{ + The Item reference entries listed in the table below contain information about + the associations between items in the file. This information is used by + ExifTool, but these entries are not extracted as tags. + }, + dimg => { Name => 'DerivedImageRef', RawConv => 'undef' }, + thmb => { Name => 'ThumbnailRef', RawConv => 'undef' }, + auxl => { Name => 'AuxiliaryImageRef', RawConv => 'undef' }, + cdsc => { + Name => 'ContentDescribes', + RawConv => \&ParseContentDescribes, + WriteHook => \&ParseContentDescribes, + }, +); + +%Image::ExifTool::QuickTime::ItemInfo = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + GROUPS => { 2 => 'Image' }, + # avc1 - AVC image + # hvc1 - HEVC image + # lhv1 - L-HEVC image + # infe - ItemInformationEntry + # infe types: avc1,hvc1,lhv1,Exif,xml1,iovl(overlay image),grid,mime,hvt1(tile image) + infe => { + Name => 'ItemInfoEntry', + RawConv => \&ParseItemInfoEntry, + WriteHook => \&ParseItemInfoEntry, + Notes => 'parsed, but not extracted as a tag', + }, +); + +# track reference atoms +%Image::ExifTool::QuickTime::TrackRef = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 1 => 'Track#', 2 => 'Video' }, + chap => { Name => 'ChapterListTrackID', Format => 'int32u' }, + tmcd => { Name => 'TimeCode', Format => 'int32u' }, + mpod => { #PH (FLIR MP4) + Name => 'ElementaryStreamTrack', + Format => 'int32u', + ValueConv => '$val =~ s/^1 //; $val', # (why 2 numbers? -- ignore the first if "1") + }, + # also: sync, scpt, ssrc, iTunesInfo + cdsc => { + Name => 'ContentDescribes', + Format => 'int32u', + PrintConv => '"Track $val"', + }, + # cdep (Structural Dependency QT tag?) +); + +# track aperture mode dimensions atoms +# (ref https://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap2/qtff2.html) +%Image::ExifTool::QuickTime::TrackAperture = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 1 => 'Track#', 2 => 'Video' }, + clef => { + Name => 'CleanApertureDimensions', + Format => 'fixed32u', + Count => 3, + ValueConv => '$val =~ s/^.*? //; $val', # remove flags word + PrintConv => '$val =~ tr/ /x/; $val', + }, + prof => { + Name => 'ProductionApertureDimensions', + Format => 'fixed32u', + Count => 3, + ValueConv => '$val =~ s/^.*? //; $val', + PrintConv => '$val =~ tr/ /x/; $val', + }, + enof => { + Name => 'EncodedPixelsDimensions', + Format => 'fixed32u', + Count => 3, + ValueConv => '$val =~ s/^.*? //; $val', + PrintConv => '$val =~ tr/ /x/; $val', + }, +); + +# item list atoms +# -> these atoms are unique, and contain one or more 'data' atoms +%Image::ExifTool::QuickTime::ItemList = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + CHECK_PROC => \&CheckQTValue, + WRITABLE => 1, + PREFERRED => 2, # (preferred over UserData and Keys tags when writing) + FORMAT => 'string', + GROUPS => { 1 => 'ItemList', 2 => 'Audio' }, + WRITE_GROUP => 'ItemList', + LANG_INFO => \&GetLangInfo, + NOTES => q{ + This is the preferred location for creating new QuickTime tags. Tags in + this table support alternate languages which are accessed by adding a + 3-character ISO 639-2 language code and an optional ISO 3166-1 alpha 2 + country code to the tag name (eg. "ItemList:Title-fra" or + "ItemList::Title-fra-FR"). When creating a new Meta box to contain the + ItemList directory, by default ExifTool adds an 'mdir' (Metadata) Handler + box because Apple software may ignore ItemList tags otherwise, but the API + L<QuickTimeHandler|../ExifTool.html#QuickTimeHandler> option may be set to 0 to avoid this. + }, + # in this table, binary 1 and 2-byte "data"-type tags are interpreted as + # int8u and int16u. Multi-byte binary "data" tags are extracted as binary data. + # (Note that the Preferred property is set to 0 for some tags to prevent them + # from being created when a same-named tag already exists in the table) + "\xa9ART" => 'Artist', + "\xa9alb" => 'Album', + "\xa9aut" => { Name => 'Author', Avoid => 1, Groups => { 2 => 'Author' } }, #forum10091 ('auth' is preferred) + "\xa9cmt" => 'Comment', + "\xa9com" => { Name => 'Composer', Avoid => 1, }, # ("\xa9wrt" is preferred in ItemList) + "\xa9day" => { + Name => 'ContentCreateDate', + Groups => { 2 => 'Time' }, + Shift => 'Time', + # handle values in the form "2010-02-12T13:27:14-0800" + ValueConv => q{ + require Image::ExifTool::XMP; + $val = Image::ExifTool::XMP::ConvertXMPDate($val); + $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary + return $val; + }, + ValueConvInv => q{ + require Image::ExifTool::XMP; + $val = Image::ExifTool::XMP::FormatXMPDate($val); + $val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon + return $val; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist) + }, + "\xa9des" => 'Description', #4 + "\xa9enc" => 'EncodedBy', #10 + "\xa9gen" => 'Genre', + "\xa9grp" => 'Grouping', + "\xa9lyr" => 'Lyrics', + "\xa9nam" => 'Title', + "\xa9too" => 'Encoder', + "\xa9trk" => 'Track', + "\xa9wrt" => 'Composer', +# +# the following tags written by AtomicParsley 0.9.6 +# (ref https://exiftool.org/forum/index.php?topic=11455.0) +# + "\xa9st3" => 'Subtitle', + "\xa9con" => 'Conductor', + "\xa9sol" => 'Soloist', + "\xa9arg" => 'Arranger', + "\xa9ope" => 'OriginalArtist', + "\xa9dir" => 'Director', + "\xa9ard" => 'ArtDirector', + "\xa9sne" => 'SoundEngineer', + "\xa9prd" => 'Producer', + "\xa9xpd" => 'ExecutiveProducer', + sdes => 'StoreDescription', +# + '----' => { + Name => 'iTunesInfo', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::iTunesInfo' }, + }, + aART => { Name => 'AlbumArtist', Groups => { 2 => 'Author' } }, + covr => { Name => 'CoverArt', Groups => { 2 => 'Preview' } }, + cpil => { #10 + Name => 'Compilation', + Format => 'int8u', #27 (ref 23 contradicts what AtomicParsley actually writes, which is int8s) + Writable => 'int8s', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + disk => { + Name => 'DiskNumber', + Format => 'undef', # (necessary to prevent decoding as string!) + ValueConv => q{ + return \$val unless length($val) >= 6; + my @a = unpack 'x2nn', $val; + return $a[1] ? join(' of ', @a) : $a[0]; + }, + ValueConvInv => q{ + my @a = $val =~ /\d+/g; + return undef if @a == 0 or @a > 2; + push @a, 0 if @a == 1; + return pack('n3', 0, @a); + }, + }, + pgap => { #10 + Name => 'PlayGap', + Format => 'int8u', #23 + Writable => 'int8s', #27 + PrintConv => { + 0 => 'Insert Gap', + 1 => 'No Gap', + }, + }, + tmpo => { + Name => 'BeatsPerMinute', + # marked as boolean but really int16u in my sample + # (but written as int16s by iTunes and AtomicParsley, ref forum11506) + Format => 'int16u', + Writable => 'int16s', + }, + trkn => { + Name => 'TrackNumber', + Format => 'undef', # (necessary to prevent decoding as string!) + ValueConv => q{ + return \$val unless length($val) >= 6; + my @a = unpack 'x2nn', $val; + return $a[1] ? join(' of ', @a) : $a[0]; + }, + # (see forum11501 for discussion about the format used) + ValueConvInv => q{ + my @a = $val =~ /\d+/g; + return undef if @a == 0 or @a > 2; + push @a, 0 if @a == 1; + return pack('n4', 0, @a, 0); + }, + }, +# +# Note: it is possible that the tags below are not being decoded properly +# because I don't have samples to verify many of these - PH +# + akID => { #10 + Name => 'AppleStoreAccountType', + Format => 'int8u', #24 + Writable => 'int8s', #27 + PrintConv => { + 0 => 'iTunes', + 1 => 'AOL', + }, + }, + albm => { Name => 'Album', Avoid => 1 }, #(ffmpeg source) + apID => 'AppleStoreAccount', + atID => { #10 (or TV series) + Name => 'AlbumTitleID', + Format => 'int32u', + Writable => 'int32s', #27 + }, + auth => { Name => 'Author', Groups => { 2 => 'Author' } }, + catg => 'Category', #7 + cnID => { #10 + Name => 'AppleStoreCatalogID', + Format => 'int32u', + Writable => 'int32s', #27 + }, + cprt => { Name => 'Copyright', Groups => { 2 => 'Author' } }, + dscp => { Name => 'Description', Avoid => 1 }, + desc => { Name => 'Description', Avoid => 1 }, #7 + gnre => { #10 + Name => 'Genre', + Avoid => 1, + # (Note: see https://exiftool.org/forum/index.php?topic=11537.0) + Format => 'undef', + ValueConv => 'unpack("n",$val)', + ValueConvInv => '$val =~ /^\d+$/ ? pack("n",$val) : undef', + PrintConv => q{ + return $val unless $val =~ /^\d+$/; + require Image::ExifTool::ID3; + Image::ExifTool::ID3::PrintGenre($val - 1); # note the "- 1" + }, + PrintConvInv => q{ + return $val if $val =~ /^[0-9]+$/; + require Image::ExifTool::ID3; + my $id = Image::ExifTool::ID3::GetGenreID($val); + return unless defined $id and $id =~ /^\d+$/; + return $id + 1; + }, + }, + egid => 'EpisodeGlobalUniqueID', #7 + geID => { #10 + Name => 'GenreID', + Format => 'int32u', + Writable => 'int32s', #27 + SeparateTable => 1, + # the following lookup is based on http://itunes.apple.com/WebObjects/MZStoreServices.woa/ws/genres + # (see scripts/parse_genre to parse genre JSON file from above) + PrintConv => { #21/PH + 2 => 'Music|Blues', + 3 => 'Music|Comedy', + 4 => "Music|Children's Music", + 5 => 'Music|Classical', + 6 => 'Music|Country', + 7 => 'Music|Electronic', + 8 => 'Music|Holiday', + 9 => 'Music|Classical|Opera', + 10 => 'Music|Singer/Songwriter', + 11 => 'Music|Jazz', + 12 => 'Music|Latino', + 13 => 'Music|New Age', + 14 => 'Music|Pop', + 15 => 'Music|R&B/Soul', + 16 => 'Music|Soundtrack', + 17 => 'Music|Dance', + 18 => 'Music|Hip-Hop/Rap', + 19 => 'Music|World', + 20 => 'Music|Alternative', + 21 => 'Music|Rock', + 22 => 'Music|Christian & Gospel', + 23 => 'Music|Vocal', + 24 => 'Music|Reggae', + 25 => 'Music|Easy Listening', + 26 => 'Podcasts', + 27 => 'Music|J-Pop', + 28 => 'Music|Enka', + 29 => 'Music|Anime', + 30 => 'Music|Kayokyoku', + 31 => 'Music Videos', + 32 => 'TV Shows', + 33 => 'Movies', + 34 => 'Music', + 35 => 'iPod Games', + 36 => 'App Store', + 37 => 'Tones', + 38 => 'Books', + 39 => 'Mac App Store', + 40 => 'Textbooks', + 50 => 'Music|Fitness & Workout', + 51 => 'Music|Pop|K-Pop', + 52 => 'Music|Karaoke', + 53 => 'Music|Instrumental', + 74 => 'Audiobooks|News', + 75 => 'Audiobooks|Programs & Performances', + 500 => 'Fitness Music', + 501 => 'Fitness Music|Pop', + 502 => 'Fitness Music|Dance', + 503 => 'Fitness Music|Hip-Hop', + 504 => 'Fitness Music|Rock', + 505 => 'Fitness Music|Alt/Indie', + 506 => 'Fitness Music|Latino', + 507 => 'Fitness Music|Country', + 508 => 'Fitness Music|World', + 509 => 'Fitness Music|New Age', + 510 => 'Fitness Music|Classical', + 1001 => 'Music|Alternative|College Rock', + 1002 => 'Music|Alternative|Goth Rock', + 1003 => 'Music|Alternative|Grunge', + 1004 => 'Music|Alternative|Indie Rock', + 1005 => 'Music|Alternative|New Wave', + 1006 => 'Music|Alternative|Punk', + 1007 => 'Music|Blues|Chicago Blues', + 1009 => 'Music|Blues|Classic Blues', + 1010 => 'Music|Blues|Contemporary Blues', + 1011 => 'Music|Blues|Country Blues', + 1012 => 'Music|Blues|Delta Blues', + 1013 => 'Music|Blues|Electric Blues', + 1014 => "Music|Children's Music|Lullabies", + 1015 => "Music|Children's Music|Sing-Along", + 1016 => "Music|Children's Music|Stories", + 1017 => 'Music|Classical|Avant-Garde', + 1018 => 'Music|Classical|Baroque Era', + 1019 => 'Music|Classical|Chamber Music', + 1020 => 'Music|Classical|Chant', + 1021 => 'Music|Classical|Choral', + 1022 => 'Music|Classical|Classical Crossover', + 1023 => 'Music|Classical|Early Music', + 1024 => 'Music|Classical|Impressionist', + 1025 => 'Music|Classical|Medieval Era', + 1026 => 'Music|Classical|Minimalism', + 1027 => 'Music|Classical|Modern Era', + 1028 => 'Music|Classical|Opera', + 1029 => 'Music|Classical|Orchestral', + 1030 => 'Music|Classical|Renaissance', + 1031 => 'Music|Classical|Romantic Era', + 1032 => 'Music|Classical|Wedding Music', + 1033 => 'Music|Country|Alternative Country', + 1034 => 'Music|Country|Americana', + 1035 => 'Music|Country|Bluegrass', + 1036 => 'Music|Country|Contemporary Bluegrass', + 1037 => 'Music|Country|Contemporary Country', + 1038 => 'Music|Country|Country Gospel', + 1039 => 'Music|Country|Honky Tonk', + 1040 => 'Music|Country|Outlaw Country', + 1041 => 'Music|Country|Traditional Bluegrass', + 1042 => 'Music|Country|Traditional Country', + 1043 => 'Music|Country|Urban Cowboy', + 1044 => 'Music|Dance|Breakbeat', + 1045 => 'Music|Dance|Exercise', + 1046 => 'Music|Dance|Garage', + 1047 => 'Music|Dance|Hardcore', + 1048 => 'Music|Dance|House', + 1049 => "Music|Dance|Jungle/Drum'n'bass", + 1050 => 'Music|Dance|Techno', + 1051 => 'Music|Dance|Trance', + 1052 => 'Music|Jazz|Big Band', + 1053 => 'Music|Jazz|Bop', + 1054 => 'Music|Easy Listening|Lounge', + 1055 => 'Music|Easy Listening|Swing', + 1056 => 'Music|Electronic|Ambient', + 1057 => 'Music|Electronic|Downtempo', + 1058 => 'Music|Electronic|Electronica', + 1060 => 'Music|Electronic|IDM/Experimental', + 1061 => 'Music|Electronic|Industrial', + 1062 => 'Music|Singer/Songwriter|Alternative Folk', + 1063 => 'Music|Singer/Songwriter|Contemporary Folk', + 1064 => 'Music|Singer/Songwriter|Contemporary Singer/Songwriter', + 1065 => 'Music|Singer/Songwriter|Folk-Rock', + 1066 => 'Music|Singer/Songwriter|New Acoustic', + 1067 => 'Music|Singer/Songwriter|Traditional Folk', + 1068 => 'Music|Hip-Hop/Rap|Alternative Rap', + 1069 => 'Music|Hip-Hop/Rap|Dirty South', + 1070 => 'Music|Hip-Hop/Rap|East Coast Rap', + 1071 => 'Music|Hip-Hop/Rap|Gangsta Rap', + 1072 => 'Music|Hip-Hop/Rap|Hardcore Rap', + 1073 => 'Music|Hip-Hop/Rap|Hip-Hop', + 1074 => 'Music|Hip-Hop/Rap|Latin Rap', + 1075 => 'Music|Hip-Hop/Rap|Old School Rap', + 1076 => 'Music|Hip-Hop/Rap|Rap', + 1077 => 'Music|Hip-Hop/Rap|Underground Rap', + 1078 => 'Music|Hip-Hop/Rap|West Coast Rap', + 1079 => 'Music|Holiday|Chanukah', + 1080 => 'Music|Holiday|Christmas', + 1081 => "Music|Holiday|Christmas: Children's", + 1082 => 'Music|Holiday|Christmas: Classic', + 1083 => 'Music|Holiday|Christmas: Classical', + 1084 => 'Music|Holiday|Christmas: Jazz', + 1085 => 'Music|Holiday|Christmas: Modern', + 1086 => 'Music|Holiday|Christmas: Pop', + 1087 => 'Music|Holiday|Christmas: R&B', + 1088 => 'Music|Holiday|Christmas: Religious', + 1089 => 'Music|Holiday|Christmas: Rock', + 1090 => 'Music|Holiday|Easter', + 1091 => 'Music|Holiday|Halloween', + 1092 => 'Music|Holiday|Holiday: Other', + 1093 => 'Music|Holiday|Thanksgiving', + 1094 => 'Music|Christian & Gospel|CCM', + 1095 => 'Music|Christian & Gospel|Christian Metal', + 1096 => 'Music|Christian & Gospel|Christian Pop', + 1097 => 'Music|Christian & Gospel|Christian Rap', + 1098 => 'Music|Christian & Gospel|Christian Rock', + 1099 => 'Music|Christian & Gospel|Classic Christian', + 1100 => 'Music|Christian & Gospel|Contemporary Gospel', + 1101 => 'Music|Christian & Gospel|Gospel', + 1103 => 'Music|Christian & Gospel|Praise & Worship', + 1104 => 'Music|Christian & Gospel|Southern Gospel', + 1105 => 'Music|Christian & Gospel|Traditional Gospel', + 1106 => 'Music|Jazz|Avant-Garde Jazz', + 1107 => 'Music|Jazz|Contemporary Jazz', + 1108 => 'Music|Jazz|Crossover Jazz', + 1109 => 'Music|Jazz|Dixieland', + 1110 => 'Music|Jazz|Fusion', + 1111 => 'Music|Jazz|Latin Jazz', + 1112 => 'Music|Jazz|Mainstream Jazz', + 1113 => 'Music|Jazz|Ragtime', + 1114 => 'Music|Jazz|Smooth Jazz', + 1115 => 'Music|Latino|Latin Jazz', + 1116 => 'Music|Latino|Contemporary Latin', + 1117 => 'Music|Latino|Pop Latino', + 1118 => 'Music|Latino|Raices', # (Ra&iacute;ces) + 1119 => 'Music|Latino|Urbano latino', + 1120 => 'Music|Latino|Baladas y Boleros', + 1121 => 'Music|Latino|Rock y Alternativo', + 1122 => 'Music|Brazilian', + 1123 => 'Music|Latino|Musica Mexicana', # (M&uacute;sica Mexicana) + 1124 => 'Music|Latino|Musica tropical', # (M&uacute;sica tropical) + 1125 => 'Music|New Age|Environmental', + 1126 => 'Music|New Age|Healing', + 1127 => 'Music|New Age|Meditation', + 1128 => 'Music|New Age|Nature', + 1129 => 'Music|New Age|Relaxation', + 1130 => 'Music|New Age|Travel', + 1131 => 'Music|Pop|Adult Contemporary', + 1132 => 'Music|Pop|Britpop', + 1133 => 'Music|Pop|Pop/Rock', + 1134 => 'Music|Pop|Soft Rock', + 1135 => 'Music|Pop|Teen Pop', + 1136 => 'Music|R&B/Soul|Contemporary R&B', + 1137 => 'Music|R&B/Soul|Disco', + 1138 => 'Music|R&B/Soul|Doo Wop', + 1139 => 'Music|R&B/Soul|Funk', + 1140 => 'Music|R&B/Soul|Motown', + 1141 => 'Music|R&B/Soul|Neo-Soul', + 1142 => 'Music|R&B/Soul|Quiet Storm', + 1143 => 'Music|R&B/Soul|Soul', + 1144 => 'Music|Rock|Adult Alternative', + 1145 => 'Music|Rock|American Trad Rock', + 1146 => 'Music|Rock|Arena Rock', + 1147 => 'Music|Rock|Blues-Rock', + 1148 => 'Music|Rock|British Invasion', + 1149 => 'Music|Rock|Death Metal/Black Metal', + 1150 => 'Music|Rock|Glam Rock', + 1151 => 'Music|Rock|Hair Metal', + 1152 => 'Music|Rock|Hard Rock', + 1153 => 'Music|Rock|Metal', + 1154 => 'Music|Rock|Jam Bands', + 1155 => 'Music|Rock|Prog-Rock/Art Rock', + 1156 => 'Music|Rock|Psychedelic', + 1157 => 'Music|Rock|Rock & Roll', + 1158 => 'Music|Rock|Rockabilly', + 1159 => 'Music|Rock|Roots Rock', + 1160 => 'Music|Rock|Singer/Songwriter', + 1161 => 'Music|Rock|Southern Rock', + 1162 => 'Music|Rock|Surf', + 1163 => 'Music|Rock|Tex-Mex', + 1165 => 'Music|Soundtrack|Foreign Cinema', + 1166 => 'Music|Soundtrack|Musicals', + 1167 => 'Music|Comedy|Novelty', + 1168 => 'Music|Soundtrack|Original Score', + 1169 => 'Music|Soundtrack|Soundtrack', + 1171 => 'Music|Comedy|Standup Comedy', + 1172 => 'Music|Soundtrack|TV Soundtrack', + 1173 => 'Music|Vocal|Standards', + 1174 => 'Music|Vocal|Traditional Pop', + 1175 => 'Music|Jazz|Vocal Jazz', + 1176 => 'Music|Vocal|Vocal Pop', + 1177 => 'Music|African|Afro-Beat', + 1178 => 'Music|African|Afro-Pop', + 1179 => 'Music|World|Cajun', + 1180 => 'Music|World|Celtic', + 1181 => 'Music|World|Celtic Folk', + 1182 => 'Music|World|Contemporary Celtic', + 1183 => 'Music|Reggae|Modern Dancehall', + 1184 => 'Music|World|Drinking Songs', + 1185 => 'Music|Indian|Indian Pop', + 1186 => 'Music|World|Japanese Pop', + 1187 => 'Music|World|Klezmer', + 1188 => 'Music|World|Polka', + 1189 => 'Music|World|Traditional Celtic', + 1190 => 'Music|World|Worldbeat', + 1191 => 'Music|World|Zydeco', + 1192 => 'Music|Reggae|Roots Reggae', + 1193 => 'Music|Reggae|Dub', + 1194 => 'Music|Reggae|Ska', + 1195 => 'Music|World|Caribbean', + 1196 => 'Music|World|South America', + 1197 => 'Music|Arabic', + 1198 => 'Music|World|North America', + 1199 => 'Music|World|Hawaii', + 1200 => 'Music|World|Australia', + 1201 => 'Music|World|Japan', + 1202 => 'Music|World|France', + 1203 => 'Music|African', + 1204 => 'Music|World|Asia', + 1205 => 'Music|World|Europe', + 1206 => 'Music|World|South Africa', + 1207 => 'Music|Jazz|Hard Bop', + 1208 => 'Music|Jazz|Trad Jazz', + 1209 => 'Music|Jazz|Cool Jazz', + 1210 => 'Music|Blues|Acoustic Blues', + 1211 => 'Music|Classical|High Classical', + 1220 => 'Music|Brazilian|Axe', # (Ax&eacute;) + 1221 => 'Music|Brazilian|Bossa Nova', + 1222 => 'Music|Brazilian|Choro', + 1223 => 'Music|Brazilian|Forro', # (Forr&oacute;) + 1224 => 'Music|Brazilian|Frevo', + 1225 => 'Music|Brazilian|MPB', + 1226 => 'Music|Brazilian|Pagode', + 1227 => 'Music|Brazilian|Samba', + 1228 => 'Music|Brazilian|Sertanejo', + 1229 => 'Music|Brazilian|Baile Funk', + 1230 => 'Music|Alternative|Chinese Alt', + 1231 => 'Music|Alternative|Korean Indie', + 1232 => 'Music|Chinese', + 1233 => 'Music|Chinese|Chinese Classical', + 1234 => 'Music|Chinese|Chinese Flute', + 1235 => 'Music|Chinese|Chinese Opera', + 1236 => 'Music|Chinese|Chinese Orchestral', + 1237 => 'Music|Chinese|Chinese Regional Folk', + 1238 => 'Music|Chinese|Chinese Strings', + 1239 => 'Music|Chinese|Taiwanese Folk', + 1240 => 'Music|Chinese|Tibetan Native Music', + 1241 => 'Music|Hip-Hop/Rap|Chinese Hip-Hop', + 1242 => 'Music|Hip-Hop/Rap|Korean Hip-Hop', + 1243 => 'Music|Korean', + 1244 => 'Music|Korean|Korean Classical', + 1245 => 'Music|Korean|Korean Trad Song', + 1246 => 'Music|Korean|Korean Trad Instrumental', + 1247 => 'Music|Korean|Korean Trad Theater', + 1248 => 'Music|Rock|Chinese Rock', + 1249 => 'Music|Rock|Korean Rock', + 1250 => 'Music|Pop|C-Pop', + 1251 => 'Music|Pop|Cantopop/HK-Pop', + 1252 => 'Music|Pop|Korean Folk-Pop', + 1253 => 'Music|Pop|Mandopop', + 1254 => 'Music|Pop|Tai-Pop', + 1255 => 'Music|Pop|Malaysian Pop', + 1256 => 'Music|Pop|Pinoy Pop', + 1257 => 'Music|Pop|Original Pilipino Music', + 1258 => 'Music|Pop|Manilla Sound', + 1259 => 'Music|Pop|Indo Pop', + 1260 => 'Music|Pop|Thai Pop', + 1261 => 'Music|Vocal|Trot', + 1262 => 'Music|Indian', + 1263 => 'Music|Indian|Bollywood', + 1264 => 'Music|Indian|Regional Indian|Tamil', + 1265 => 'Music|Indian|Regional Indian|Telugu', + 1266 => 'Music|Indian|Regional Indian', + 1267 => 'Music|Indian|Devotional & Spiritual', + 1268 => 'Music|Indian|Sufi', + 1269 => 'Music|Indian|Indian Classical', + 1270 => 'Music|Russian|Russian Chanson', + 1271 => 'Music|World|Dini', + 1272 => 'Music|Turkish|Halk', + 1273 => 'Music|Turkish|Sanat', + 1274 => 'Music|World|Dangdut', + 1275 => 'Music|World|Indonesian Religious', + 1276 => 'Music|World|Calypso', + 1277 => 'Music|World|Soca', + 1278 => 'Music|Indian|Ghazals', + 1279 => 'Music|Indian|Indian Folk', + 1280 => 'Music|Turkish|Arabesque', + 1281 => 'Music|African|Afrikaans', + 1282 => 'Music|World|Farsi', + 1283 => 'Music|World|Israeli', + 1284 => 'Music|Arabic|Khaleeji', + 1285 => 'Music|Arabic|North African', + 1286 => 'Music|Arabic|Arabic Pop', + 1287 => 'Music|Arabic|Islamic', + 1288 => 'Music|Soundtrack|Sound Effects', + 1289 => 'Music|Folk', + 1290 => 'Music|Orchestral', + 1291 => 'Music|Marching', + 1293 => 'Music|Pop|Oldies', + 1294 => 'Music|Country|Thai Country', + 1295 => 'Music|World|Flamenco', + 1296 => 'Music|World|Tango', + 1297 => 'Music|World|Fado', + 1298 => 'Music|World|Iberia', + 1299 => 'Music|Russian', + 1300 => 'Music|Turkish', + 1301 => 'Podcasts|Arts', + 1302 => 'Podcasts|Society & Culture|Personal Journals', + 1303 => 'Podcasts|Comedy', + 1304 => 'Podcasts|Education', + 1305 => 'Podcasts|Kids & Family', + 1306 => 'Podcasts|Arts|Food', + 1307 => 'Podcasts|Health', + 1309 => 'Podcasts|TV & Film', + 1310 => 'Podcasts|Music', + 1311 => 'Podcasts|News & Politics', + 1314 => 'Podcasts|Religion & Spirituality', + 1315 => 'Podcasts|Science & Medicine', + 1316 => 'Podcasts|Sports & Recreation', + 1318 => 'Podcasts|Technology', + 1320 => 'Podcasts|Society & Culture|Places & Travel', + 1321 => 'Podcasts|Business', + 1323 => 'Podcasts|Games & Hobbies', + 1324 => 'Podcasts|Society & Culture', + 1325 => 'Podcasts|Government & Organizations', + 1337 => 'Music Videos|Classical|Piano', + 1401 => 'Podcasts|Arts|Literature', + 1402 => 'Podcasts|Arts|Design', + 1404 => 'Podcasts|Games & Hobbies|Video Games', + 1405 => 'Podcasts|Arts|Performing Arts', + 1406 => 'Podcasts|Arts|Visual Arts', + 1410 => 'Podcasts|Business|Careers', + 1412 => 'Podcasts|Business|Investing', + 1413 => 'Podcasts|Business|Management & Marketing', + 1415 => 'Podcasts|Education|K-12', + 1416 => 'Podcasts|Education|Higher Education', + 1417 => 'Podcasts|Health|Fitness & Nutrition', + 1420 => 'Podcasts|Health|Self-Help', + 1421 => 'Podcasts|Health|Sexuality', + 1438 => 'Podcasts|Religion & Spirituality|Buddhism', + 1439 => 'Podcasts|Religion & Spirituality|Christianity', + 1440 => 'Podcasts|Religion & Spirituality|Islam', + 1441 => 'Podcasts|Religion & Spirituality|Judaism', + 1443 => 'Podcasts|Society & Culture|Philosophy', + 1444 => 'Podcasts|Religion & Spirituality|Spirituality', + 1446 => 'Podcasts|Technology|Gadgets', + 1448 => 'Podcasts|Technology|Tech News', + 1450 => 'Podcasts|Technology|Podcasting', + 1454 => 'Podcasts|Games & Hobbies|Automotive', + 1455 => 'Podcasts|Games & Hobbies|Aviation', + 1456 => 'Podcasts|Sports & Recreation|Outdoor', + 1459 => 'Podcasts|Arts|Fashion & Beauty', + 1460 => 'Podcasts|Games & Hobbies|Hobbies', + 1461 => 'Podcasts|Games & Hobbies|Other Games', + 1462 => 'Podcasts|Society & Culture|History', + 1463 => 'Podcasts|Religion & Spirituality|Hinduism', + 1464 => 'Podcasts|Religion & Spirituality|Other', + 1465 => 'Podcasts|Sports & Recreation|Professional', + 1466 => 'Podcasts|Sports & Recreation|College & High School', + 1467 => 'Podcasts|Sports & Recreation|Amateur', + 1468 => 'Podcasts|Education|Educational Technology', + 1469 => 'Podcasts|Education|Language Courses', + 1470 => 'Podcasts|Education|Training', + 1471 => 'Podcasts|Business|Business News', + 1472 => 'Podcasts|Business|Shopping', + 1473 => 'Podcasts|Government & Organizations|National', + 1474 => 'Podcasts|Government & Organizations|Regional', + 1475 => 'Podcasts|Government & Organizations|Local', + 1476 => 'Podcasts|Government & Organizations|Non-Profit', + 1477 => 'Podcasts|Science & Medicine|Natural Sciences', + 1478 => 'Podcasts|Science & Medicine|Medicine', + 1479 => 'Podcasts|Science & Medicine|Social Sciences', + 1480 => 'Podcasts|Technology|Software How-To', + 1481 => 'Podcasts|Health|Alternative Health', + 1482 => 'Podcasts|Arts|Books', + 1483 => 'Podcasts|Fiction', + 1484 => 'Podcasts|Fiction|Drama', + 1485 => 'Podcasts|Fiction|Science Fiction', + 1486 => 'Podcasts|Fiction|Comedy Fiction', + 1487 => 'Podcasts|History', + 1488 => 'Podcasts|True Crime', + 1489 => 'Podcasts|News', + 1490 => 'Podcasts|News|Business News', + 1491 => 'Podcasts|Business|Management', + 1492 => 'Podcasts|Business|Marketing', + 1493 => 'Podcasts|Business|Entrepreneurship', + 1494 => 'Podcasts|Business|Non-Profit', + 1495 => 'Podcasts|Comedy|Improv', + 1496 => 'Podcasts|Comedy|Comedy Interviews', + 1497 => 'Podcasts|Comedy|Stand-Up', + 1498 => 'Podcasts|Education|Language Learning', + 1499 => 'Podcasts|Education|How To', + 1500 => 'Podcasts|Education|Self-Improvement', + 1501 => 'Podcasts|Education|Courses', + 1502 => 'Podcasts|Leisure', + 1503 => 'Podcasts|Leisure|Automotive', + 1504 => 'Podcasts|Leisure|Aviation', + 1505 => 'Podcasts|Leisure|Hobbies', + 1506 => 'Podcasts|Leisure|Crafts', + 1507 => 'Podcasts|Leisure|Games', + 1508 => 'Podcasts|Leisure|Home & Garden', + 1509 => 'Podcasts|Leisure|Video Games', + 1510 => 'Podcasts|Leisure|Animation & Manga', + 1511 => 'Podcasts|Government', + 1512 => 'Podcasts|Health & Fitness', + 1513 => 'Podcasts|Health & Fitness|Alternative Health', + 1514 => 'Podcasts|Health & Fitness|Fitness', + 1515 => 'Podcasts|Health & Fitness|Nutrition', + 1516 => 'Podcasts|Health & Fitness|Sexuality', + 1517 => 'Podcasts|Health & Fitness|Mental Health', + 1518 => 'Podcasts|Health & Fitness|Medicine', + 1519 => 'Podcasts|Kids & Family|Education for Kids', + 1520 => 'Podcasts|Kids & Family|Stories for Kids', + 1521 => 'Podcasts|Kids & Family|Parenting', + 1522 => 'Podcasts|Kids & Family|Pets & Animals', + 1523 => 'Podcasts|Music|Music Commentary', + 1524 => 'Podcasts|Music|Music History', + 1525 => 'Podcasts|Music|Music Interviews', + 1526 => 'Podcasts|News|Daily News', + 1527 => 'Podcasts|News|Politics', + 1528 => 'Podcasts|News|Tech News', + 1529 => 'Podcasts|News|Sports News', + 1530 => 'Podcasts|News|News Commentary', + 1531 => 'Podcasts|News|Entertainment News', + 1532 => 'Podcasts|Religion & Spirituality|Religion', + 1533 => 'Podcasts|Science', + 1534 => 'Podcasts|Science|Natural Sciences', + 1535 => 'Podcasts|Science|Social Sciences', + 1536 => 'Podcasts|Science|Mathematics', + 1537 => 'Podcasts|Science|Nature', + 1538 => 'Podcasts|Science|Astronomy', + 1539 => 'Podcasts|Science|Chemistry', + 1540 => 'Podcasts|Science|Earth Sciences', + 1541 => 'Podcasts|Science|Life Sciences', + 1542 => 'Podcasts|Science|Physics', + 1543 => 'Podcasts|Society & Culture|Documentary', + 1544 => 'Podcasts|Society & Culture|Relationships', + 1545 => 'Podcasts|Sports', + 1546 => 'Podcasts|Sports|Soccer', + 1547 => 'Podcasts|Sports|Football', + 1548 => 'Podcasts|Sports|Basketball', + 1549 => 'Podcasts|Sports|Baseball', + 1550 => 'Podcasts|Sports|Hockey', + 1551 => 'Podcasts|Sports|Running', + 1552 => 'Podcasts|Sports|Rugby', + 1553 => 'Podcasts|Sports|Golf', + 1554 => 'Podcasts|Sports|Cricket', + 1555 => 'Podcasts|Sports|Wrestling', + 1556 => 'Podcasts|Sports|Tennis', + 1557 => 'Podcasts|Sports|Volleyball', + 1558 => 'Podcasts|Sports|Swimming', + 1559 => 'Podcasts|Sports|Wilderness', + 1560 => 'Podcasts|Sports|Fantasy Sports', + 1561 => 'Podcasts|TV & Film|TV Reviews', + 1562 => 'Podcasts|TV & Film|After Shows', + 1563 => 'Podcasts|TV & Film|Film Reviews', + 1564 => 'Podcasts|TV & Film|Film History', + 1565 => 'Podcasts|TV & Film|Film Interviews', + 1602 => 'Music Videos|Blues', + 1603 => 'Music Videos|Comedy', + 1604 => "Music Videos|Children's Music", + 1605 => 'Music Videos|Classical', + 1606 => 'Music Videos|Country', + 1607 => 'Music Videos|Electronic', + 1608 => 'Music Videos|Holiday', + 1609 => 'Music Videos|Classical|Opera', + 1610 => 'Music Videos|Singer/Songwriter', + 1611 => 'Music Videos|Jazz', + 1612 => 'Music Videos|Latin', + 1613 => 'Music Videos|New Age', + 1614 => 'Music Videos|Pop', + 1615 => 'Music Videos|R&B/Soul', + 1616 => 'Music Videos|Soundtrack', + 1617 => 'Music Videos|Dance', + 1618 => 'Music Videos|Hip-Hop/Rap', + 1619 => 'Music Videos|World', + 1620 => 'Music Videos|Alternative', + 1621 => 'Music Videos|Rock', + 1622 => 'Music Videos|Christian & Gospel', + 1623 => 'Music Videos|Vocal', + 1624 => 'Music Videos|Reggae', + 1625 => 'Music Videos|Easy Listening', + 1626 => 'Music Videos|Podcasts', + 1627 => 'Music Videos|J-Pop', + 1628 => 'Music Videos|Enka', + 1629 => 'Music Videos|Anime', + 1630 => 'Music Videos|Kayokyoku', + 1631 => 'Music Videos|Disney', + 1632 => 'Music Videos|French Pop', + 1633 => 'Music Videos|German Pop', + 1634 => 'Music Videos|German Folk', + 1635 => 'Music Videos|Alternative|Chinese Alt', + 1636 => 'Music Videos|Alternative|Korean Indie', + 1637 => 'Music Videos|Chinese', + 1638 => 'Music Videos|Chinese|Chinese Classical', + 1639 => 'Music Videos|Chinese|Chinese Flute', + 1640 => 'Music Videos|Chinese|Chinese Opera', + 1641 => 'Music Videos|Chinese|Chinese Orchestral', + 1642 => 'Music Videos|Chinese|Chinese Regional Folk', + 1643 => 'Music Videos|Chinese|Chinese Strings', + 1644 => 'Music Videos|Chinese|Taiwanese Folk', + 1645 => 'Music Videos|Chinese|Tibetan Native Music', + 1646 => 'Music Videos|Hip-Hop/Rap|Chinese Hip-Hop', + 1647 => 'Music Videos|Hip-Hop/Rap|Korean Hip-Hop', + 1648 => 'Music Videos|Korean', + 1649 => 'Music Videos|Korean|Korean Classical', + 1650 => 'Music Videos|Korean|Korean Trad Song', + 1651 => 'Music Videos|Korean|Korean Trad Instrumental', + 1652 => 'Music Videos|Korean|Korean Trad Theater', + 1653 => 'Music Videos|Rock|Chinese Rock', + 1654 => 'Music Videos|Rock|Korean Rock', + 1655 => 'Music Videos|Pop|C-Pop', + 1656 => 'Music Videos|Pop|Cantopop/HK-Pop', + 1657 => 'Music Videos|Pop|Korean Folk-Pop', + 1658 => 'Music Videos|Pop|Mandopop', + 1659 => 'Music Videos|Pop|Tai-Pop', + 1660 => 'Music Videos|Pop|Malaysian Pop', + 1661 => 'Music Videos|Pop|Pinoy Pop', + 1662 => 'Music Videos|Pop|Original Pilipino Music', + 1663 => 'Music Videos|Pop|Manilla Sound', + 1664 => 'Music Videos|Pop|Indo Pop', + 1665 => 'Music Videos|Pop|Thai Pop', + 1666 => 'Music Videos|Vocal|Trot', + 1671 => 'Music Videos|Brazilian', + 1672 => 'Music Videos|Brazilian|Axe', # (Ax&eacute;) + 1673 => 'Music Videos|Brazilian|Baile Funk', + 1674 => 'Music Videos|Brazilian|Bossa Nova', + 1675 => 'Music Videos|Brazilian|Choro', + 1676 => 'Music Videos|Brazilian|Forro', + 1677 => 'Music Videos|Brazilian|Frevo', + 1678 => 'Music Videos|Brazilian|MPB', + 1679 => 'Music Videos|Brazilian|Pagode', + 1680 => 'Music Videos|Brazilian|Samba', + 1681 => 'Music Videos|Brazilian|Sertanejo', + 1682 => 'Music Videos|Classical|High Classical', + 1683 => 'Music Videos|Fitness & Workout', + 1684 => 'Music Videos|Instrumental', + 1685 => 'Music Videos|Jazz|Big Band', + 1686 => 'Music Videos|Pop|K-Pop', + 1687 => 'Music Videos|Karaoke', + 1688 => 'Music Videos|Rock|Heavy Metal', + 1689 => 'Music Videos|Spoken Word', + 1690 => 'Music Videos|Indian', + 1691 => 'Music Videos|Indian|Bollywood', + 1692 => 'Music Videos|Indian|Regional Indian|Tamil', + 1693 => 'Music Videos|Indian|Regional Indian|Telugu', + 1694 => 'Music Videos|Indian|Regional Indian', + 1695 => 'Music Videos|Indian|Devotional & Spiritual', + 1696 => 'Music Videos|Indian|Sufi', + 1697 => 'Music Videos|Indian|Indian Classical', + 1698 => 'Music Videos|Russian|Russian Chanson', + 1699 => 'Music Videos|World|Dini', + 1700 => 'Music Videos|Turkish|Halk', + 1701 => 'Music Videos|Turkish|Sanat', + 1702 => 'Music Videos|World|Dangdut', + 1703 => 'Music Videos|World|Indonesian Religious', + 1704 => 'Music Videos|Indian|Indian Pop', + 1705 => 'Music Videos|World|Calypso', + 1706 => 'Music Videos|World|Soca', + 1707 => 'Music Videos|Indian|Ghazals', + 1708 => 'Music Videos|Indian|Indian Folk', + 1709 => 'Music Videos|Turkish|Arabesque', + 1710 => 'Music Videos|African|Afrikaans', + 1711 => 'Music Videos|World|Farsi', + 1712 => 'Music Videos|World|Israeli', + 1713 => 'Music Videos|Arabic', + 1714 => 'Music Videos|Arabic|Khaleeji', + 1715 => 'Music Videos|Arabic|North African', + 1716 => 'Music Videos|Arabic|Arabic Pop', + 1717 => 'Music Videos|Arabic|Islamic', + 1718 => 'Music Videos|Soundtrack|Sound Effects', + 1719 => 'Music Videos|Folk', + 1720 => 'Music Videos|Orchestral', + 1721 => 'Music Videos|Marching', + 1723 => 'Music Videos|Pop|Oldies', + 1724 => 'Music Videos|Country|Thai Country', + 1725 => 'Music Videos|World|Flamenco', + 1726 => 'Music Videos|World|Tango', + 1727 => 'Music Videos|World|Fado', + 1728 => 'Music Videos|World|Iberia', + 1729 => 'Music Videos|Russian', + 1730 => 'Music Videos|Turkish', + 1731 => 'Music Videos|Alternative|College Rock', + 1732 => 'Music Videos|Alternative|Goth Rock', + 1733 => 'Music Videos|Alternative|Grunge', + 1734 => 'Music Videos|Alternative|Indie Rock', + 1735 => 'Music Videos|Alternative|New Wave', + 1736 => 'Music Videos|Alternative|Punk', + 1737 => 'Music Videos|Blues|Acoustic Blues', + 1738 => 'Music Videos|Blues|Chicago Blues', + 1739 => 'Music Videos|Blues|Classic Blues', + 1740 => 'Music Videos|Blues|Contemporary Blues', + 1741 => 'Music Videos|Blues|Country Blues', + 1742 => 'Music Videos|Blues|Delta Blues', + 1743 => 'Music Videos|Blues|Electric Blues', + 1744 => "Music Videos|Children's Music|Lullabies", + 1745 => "Music Videos|Children's Music|Sing-Along", + 1746 => "Music Videos|Children's Music|Stories", + 1747 => 'Music Videos|Christian & Gospel|CCM', + 1748 => 'Music Videos|Christian & Gospel|Christian Metal', + 1749 => 'Music Videos|Christian & Gospel|Christian Pop', + 1750 => 'Music Videos|Christian & Gospel|Christian Rap', + 1751 => 'Music Videos|Christian & Gospel|Christian Rock', + 1752 => 'Music Videos|Christian & Gospel|Classic Christian', + 1753 => 'Music Videos|Christian & Gospel|Contemporary Gospel', + 1754 => 'Music Videos|Christian & Gospel|Gospel', + 1755 => 'Music Videos|Christian & Gospel|Praise & Worship', + 1756 => 'Music Videos|Christian & Gospel|Southern Gospel', + 1757 => 'Music Videos|Christian & Gospel|Traditional Gospel', + 1758 => 'Music Videos|Classical|Avant-Garde', + 1759 => 'Music Videos|Classical|Baroque Era', + 1760 => 'Music Videos|Classical|Chamber Music', + 1761 => 'Music Videos|Classical|Chant', + 1762 => 'Music Videos|Classical|Choral', + 1763 => 'Music Videos|Classical|Classical Crossover', + 1764 => 'Music Videos|Classical|Early Music', + 1765 => 'Music Videos|Classical|Impressionist', + 1766 => 'Music Videos|Classical|Medieval Era', + 1767 => 'Music Videos|Classical|Minimalism', + 1768 => 'Music Videos|Classical|Modern Era', + 1769 => 'Music Videos|Classical|Orchestral', + 1770 => 'Music Videos|Classical|Renaissance', + 1771 => 'Music Videos|Classical|Romantic Era', + 1772 => 'Music Videos|Classical|Wedding Music', + 1773 => 'Music Videos|Comedy|Novelty', + 1774 => 'Music Videos|Comedy|Standup Comedy', + 1775 => 'Music Videos|Country|Alternative Country', + 1776 => 'Music Videos|Country|Americana', + 1777 => 'Music Videos|Country|Bluegrass', + 1778 => 'Music Videos|Country|Contemporary Bluegrass', + 1779 => 'Music Videos|Country|Contemporary Country', + 1780 => 'Music Videos|Country|Country Gospel', + 1781 => 'Music Videos|Country|Honky Tonk', + 1782 => 'Music Videos|Country|Outlaw Country', + 1783 => 'Music Videos|Country|Traditional Bluegrass', + 1784 => 'Music Videos|Country|Traditional Country', + 1785 => 'Music Videos|Country|Urban Cowboy', + 1786 => 'Music Videos|Dance|Breakbeat', + 1787 => 'Music Videos|Dance|Exercise', + 1788 => 'Music Videos|Dance|Garage', + 1789 => 'Music Videos|Dance|Hardcore', + 1790 => 'Music Videos|Dance|House', + 1791 => "Music Videos|Dance|Jungle/Drum'n'bass", + 1792 => 'Music Videos|Dance|Techno', + 1793 => 'Music Videos|Dance|Trance', + 1794 => 'Music Videos|Easy Listening|Lounge', + 1795 => 'Music Videos|Easy Listening|Swing', + 1796 => 'Music Videos|Electronic|Ambient', + 1797 => 'Music Videos|Electronic|Downtempo', + 1798 => 'Music Videos|Electronic|Electronica', + 1799 => 'Music Videos|Electronic|IDM/Experimental', + 1800 => 'Music Videos|Electronic|Industrial', + 1801 => 'Music Videos|Hip-Hop/Rap|Alternative Rap', + 1802 => 'Music Videos|Hip-Hop/Rap|Dirty South', + 1803 => 'Music Videos|Hip-Hop/Rap|East Coast Rap', + 1804 => 'Music Videos|Hip-Hop/Rap|Gangsta Rap', + 1805 => 'Music Videos|Hip-Hop/Rap|Hardcore Rap', + 1806 => 'Music Videos|Hip-Hop/Rap|Hip-Hop', + 1807 => 'Music Videos|Hip-Hop/Rap|Latin Rap', + 1808 => 'Music Videos|Hip-Hop/Rap|Old School Rap', + 1809 => 'Music Videos|Hip-Hop/Rap|Rap', + 1810 => 'Music Videos|Hip-Hop/Rap|Underground Rap', + 1811 => 'Music Videos|Hip-Hop/Rap|West Coast Rap', + 1812 => 'Music Videos|Holiday|Chanukah', + 1813 => 'Music Videos|Holiday|Christmas', + 1814 => "Music Videos|Holiday|Christmas: Children's", + 1815 => 'Music Videos|Holiday|Christmas: Classic', + 1816 => 'Music Videos|Holiday|Christmas: Classical', + 1817 => 'Music Videos|Holiday|Christmas: Jazz', + 1818 => 'Music Videos|Holiday|Christmas: Modern', + 1819 => 'Music Videos|Holiday|Christmas: Pop', + 1820 => 'Music Videos|Holiday|Christmas: R&B', + 1821 => 'Music Videos|Holiday|Christmas: Religious', + 1822 => 'Music Videos|Holiday|Christmas: Rock', + 1823 => 'Music Videos|Holiday|Easter', + 1824 => 'Music Videos|Holiday|Halloween', + 1825 => 'Music Videos|Holiday|Thanksgiving', + 1826 => 'Music Videos|Jazz|Avant-Garde Jazz', + 1828 => 'Music Videos|Jazz|Bop', + 1829 => 'Music Videos|Jazz|Contemporary Jazz', + 1830 => 'Music Videos|Jazz|Cool Jazz', + 1831 => 'Music Videos|Jazz|Crossover Jazz', + 1832 => 'Music Videos|Jazz|Dixieland', + 1833 => 'Music Videos|Jazz|Fusion', + 1834 => 'Music Videos|Jazz|Hard Bop', + 1835 => 'Music Videos|Jazz|Latin Jazz', + 1836 => 'Music Videos|Jazz|Mainstream Jazz', + 1837 => 'Music Videos|Jazz|Ragtime', + 1838 => 'Music Videos|Jazz|Smooth Jazz', + 1839 => 'Music Videos|Jazz|Trad Jazz', + 1840 => 'Music Videos|Latin|Alternative & Rock in Spanish', + 1841 => 'Music Videos|Latin|Baladas y Boleros', + 1842 => 'Music Videos|Latin|Contemporary Latin', + 1843 => 'Music Videos|Latin|Latin Jazz', + 1844 => 'Music Videos|Latin|Latin Urban', + 1845 => 'Music Videos|Latin|Pop in Spanish', + 1846 => 'Music Videos|Latin|Raices', + 1847 => 'Music Videos|Latin|Musica Mexicana', # (M&uacute;sica Mexicana) + 1848 => 'Music Videos|Latin|Salsa y Tropical', + 1849 => 'Music Videos|New Age|Healing', + 1850 => 'Music Videos|New Age|Meditation', + 1851 => 'Music Videos|New Age|Nature', + 1852 => 'Music Videos|New Age|Relaxation', + 1853 => 'Music Videos|New Age|Travel', + 1854 => 'Music Videos|Pop|Adult Contemporary', + 1855 => 'Music Videos|Pop|Britpop', + 1856 => 'Music Videos|Pop|Pop/Rock', + 1857 => 'Music Videos|Pop|Soft Rock', + 1858 => 'Music Videos|Pop|Teen Pop', + 1859 => 'Music Videos|R&B/Soul|Contemporary R&B', + 1860 => 'Music Videos|R&B/Soul|Disco', + 1861 => 'Music Videos|R&B/Soul|Doo Wop', + 1862 => 'Music Videos|R&B/Soul|Funk', + 1863 => 'Music Videos|R&B/Soul|Motown', + 1864 => 'Music Videos|R&B/Soul|Neo-Soul', + 1865 => 'Music Videos|R&B/Soul|Soul', + 1866 => 'Music Videos|Reggae|Modern Dancehall', + 1867 => 'Music Videos|Reggae|Dub', + 1868 => 'Music Videos|Reggae|Roots Reggae', + 1869 => 'Music Videos|Reggae|Ska', + 1870 => 'Music Videos|Rock|Adult Alternative', + 1871 => 'Music Videos|Rock|American Trad Rock', + 1872 => 'Music Videos|Rock|Arena Rock', + 1873 => 'Music Videos|Rock|Blues-Rock', + 1874 => 'Music Videos|Rock|British Invasion', + 1875 => 'Music Videos|Rock|Death Metal/Black Metal', + 1876 => 'Music Videos|Rock|Glam Rock', + 1877 => 'Music Videos|Rock|Hair Metal', + 1878 => 'Music Videos|Rock|Hard Rock', + 1879 => 'Music Videos|Rock|Jam Bands', + 1880 => 'Music Videos|Rock|Prog-Rock/Art Rock', + 1881 => 'Music Videos|Rock|Psychedelic', + 1882 => 'Music Videos|Rock|Rock & Roll', + 1883 => 'Music Videos|Rock|Rockabilly', + 1884 => 'Music Videos|Rock|Roots Rock', + 1885 => 'Music Videos|Rock|Singer/Songwriter', + 1886 => 'Music Videos|Rock|Southern Rock', + 1887 => 'Music Videos|Rock|Surf', + 1888 => 'Music Videos|Rock|Tex-Mex', + 1889 => 'Music Videos|Singer/Songwriter|Alternative Folk', + 1890 => 'Music Videos|Singer/Songwriter|Contemporary Folk', + 1891 => 'Music Videos|Singer/Songwriter|Contemporary Singer/Songwriter', + 1892 => 'Music Videos|Singer/Songwriter|Folk-Rock', + 1893 => 'Music Videos|Singer/Songwriter|New Acoustic', + 1894 => 'Music Videos|Singer/Songwriter|Traditional Folk', + 1895 => 'Music Videos|Soundtrack|Foreign Cinema', + 1896 => 'Music Videos|Soundtrack|Musicals', + 1897 => 'Music Videos|Soundtrack|Original Score', + 1898 => 'Music Videos|Soundtrack|Soundtrack', + 1899 => 'Music Videos|Soundtrack|TV Soundtrack', + 1900 => 'Music Videos|Vocal|Standards', + 1901 => 'Music Videos|Vocal|Traditional Pop', + 1902 => 'Music Videos|Jazz|Vocal Jazz', + 1903 => 'Music Videos|Vocal|Vocal Pop', + 1904 => 'Music Videos|African', + 1905 => 'Music Videos|African|Afro-Beat', + 1906 => 'Music Videos|African|Afro-Pop', + 1907 => 'Music Videos|World|Asia', + 1908 => 'Music Videos|World|Australia', + 1909 => 'Music Videos|World|Cajun', + 1910 => 'Music Videos|World|Caribbean', + 1911 => 'Music Videos|World|Celtic', + 1912 => 'Music Videos|World|Celtic Folk', + 1913 => 'Music Videos|World|Contemporary Celtic', + 1914 => 'Music Videos|World|Europe', + 1915 => 'Music Videos|World|France', + 1916 => 'Music Videos|World|Hawaii', + 1917 => 'Music Videos|World|Japan', + 1918 => 'Music Videos|World|Klezmer', + 1919 => 'Music Videos|World|North America', + 1920 => 'Music Videos|World|Polka', + 1921 => 'Music Videos|World|South Africa', + 1922 => 'Music Videos|World|South America', + 1923 => 'Music Videos|World|Traditional Celtic', + 1924 => 'Music Videos|World|Worldbeat', + 1925 => 'Music Videos|World|Zydeco', + 1926 => 'Music Videos|Christian & Gospel', + 1928 => 'Music Videos|Classical|Art Song', + 1929 => 'Music Videos|Classical|Brass & Woodwinds', + 1930 => 'Music Videos|Classical|Solo Instrumental', + 1931 => 'Music Videos|Classical|Contemporary Era', + 1932 => 'Music Videos|Classical|Oratorio', + 1933 => 'Music Videos|Classical|Cantata', + 1934 => 'Music Videos|Classical|Electronic', + 1935 => 'Music Videos|Classical|Sacred', + 1936 => 'Music Videos|Classical|Guitar', + 1938 => 'Music Videos|Classical|Violin', + 1939 => 'Music Videos|Classical|Cello', + 1940 => 'Music Videos|Classical|Percussion', + 1941 => 'Music Videos|Electronic|Dubstep', + 1942 => 'Music Videos|Electronic|Bass', + 1943 => 'Music Videos|Hip-Hop/Rap|UK Hip-Hop', + 1944 => 'Music Videos|Reggae|Lovers Rock', + 1945 => 'Music Videos|Alternative|EMO', + 1946 => 'Music Videos|Alternative|Pop Punk', + 1947 => 'Music Videos|Alternative|Indie Pop', + 1948 => 'Music Videos|New Age|Yoga', + 1949 => 'Music Videos|Pop|Tribute', + 1950 => 'Music Videos|Pop|Shows', + 1951 => 'Music Videos|Cuban', + 1952 => 'Music Videos|Cuban|Mambo', + 1953 => 'Music Videos|Cuban|Chachacha', + 1954 => 'Music Videos|Cuban|Guajira', + 1955 => 'Music Videos|Cuban|Son', + 1956 => 'Music Videos|Cuban|Bolero', + 1957 => 'Music Videos|Cuban|Guaracha', + 1958 => 'Music Videos|Cuban|Timba', + 1959 => 'Music Videos|Soundtrack|Video Game', + 1960 => 'Music Videos|Indian|Regional Indian|Punjabi|Punjabi Pop', + 1961 => 'Music Videos|Indian|Regional Indian|Bengali|Rabindra Sangeet', + 1962 => 'Music Videos|Indian|Regional Indian|Malayalam', + 1963 => 'Music Videos|Indian|Regional Indian|Kannada', + 1964 => 'Music Videos|Indian|Regional Indian|Marathi', + 1965 => 'Music Videos|Indian|Regional Indian|Gujarati', + 1966 => 'Music Videos|Indian|Regional Indian|Assamese', + 1967 => 'Music Videos|Indian|Regional Indian|Bhojpuri', + 1968 => 'Music Videos|Indian|Regional Indian|Haryanvi', + 1969 => 'Music Videos|Indian|Regional Indian|Odia', + 1970 => 'Music Videos|Indian|Regional Indian|Rajasthani', + 1971 => 'Music Videos|Indian|Regional Indian|Urdu', + 1972 => 'Music Videos|Indian|Regional Indian|Punjabi', + 1973 => 'Music Videos|Indian|Regional Indian|Bengali', + 1974 => 'Music Videos|Indian|Indian Classical|Carnatic Classical', + 1975 => 'Music Videos|Indian|Indian Classical|Hindustani Classical', + 1976 => 'Music Videos|African|Afro House', + 1977 => 'Music Videos|African|Afro Soul', + 1978 => 'Music Videos|African|Afrobeats', + 1979 => 'Music Videos|African|Benga', + 1980 => 'Music Videos|African|Bongo-Flava', + 1981 => 'Music Videos|African|Coupe-Decale', + 1982 => 'Music Videos|African|Gqom', + 1983 => 'Music Videos|African|Highlife', + 1984 => 'Music Videos|African|Kuduro', + 1985 => 'Music Videos|African|Kizomba', + 1986 => 'Music Videos|African|Kwaito', + 1987 => 'Music Videos|African|Mbalax', + 1988 => 'Music Videos|African|Ndombolo', + 1989 => 'Music Videos|African|Shangaan Electro', + 1990 => 'Music Videos|African|Soukous', + 1991 => 'Music Videos|African|Taarab', + 1992 => 'Music Videos|African|Zouglou', + 1993 => 'Music Videos|Turkish|Ozgun', + 1994 => 'Music Videos|Turkish|Fantezi', + 1995 => 'Music Videos|Turkish|Religious', + 1996 => 'Music Videos|Pop|Turkish Pop', + 1997 => 'Music Videos|Rock|Turkish Rock', + 1998 => 'Music Videos|Alternative|Turkish Alternative', + 1999 => 'Music Videos|Hip-Hop/Rap|Turkish Hip-Hop/Rap', + 2000 => 'Music Videos|African|Maskandi', + 2001 => 'Music Videos|Russian|Russian Romance', + 2002 => 'Music Videos|Russian|Russian Bard', + 2003 => 'Music Videos|Russian|Russian Pop', + 2004 => 'Music Videos|Russian|Russian Rock', + 2005 => 'Music Videos|Russian|Russian Hip-Hop', + 2006 => 'Music Videos|Arabic|Levant', + 2007 => 'Music Videos|Arabic|Levant|Dabke', + 2008 => 'Music Videos|Arabic|Maghreb Rai', + 2009 => 'Music Videos|Arabic|Khaleeji|Khaleeji Jalsat', + 2010 => 'Music Videos|Arabic|Khaleeji|Khaleeji Shailat', + 2011 => 'Music Videos|Tarab', + 2012 => 'Music Videos|Tarab|Iraqi Tarab', + 2013 => 'Music Videos|Tarab|Egyptian Tarab', + 2014 => 'Music Videos|Tarab|Khaleeji Tarab', + 2015 => 'Music Videos|Pop|Levant Pop', + 2016 => 'Music Videos|Pop|Iraqi Pop', + 2017 => 'Music Videos|Pop|Egyptian Pop', + 2018 => 'Music Videos|Pop|Maghreb Pop', + 2019 => 'Music Videos|Pop|Khaleeji Pop', + 2020 => 'Music Videos|Hip-Hop/Rap|Levant Hip-Hop', + 2021 => 'Music Videos|Hip-Hop/Rap|Egyptian Hip-Hop', + 2022 => 'Music Videos|Hip-Hop/Rap|Maghreb Hip-Hop', + 2023 => 'Music Videos|Hip-Hop/Rap|Khaleeji Hip-Hop', + 2024 => 'Music Videos|Alternative|Indie Levant', + 2025 => 'Music Videos|Alternative|Indie Egyptian', + 2026 => 'Music Videos|Alternative|Indie Maghreb', + 2027 => 'Music Videos|Electronic|Levant Electronic', + 2028 => "Music Videos|Electronic|Electro-Cha'abi", + 2029 => 'Music Videos|Electronic|Maghreb Electronic', + 2030 => 'Music Videos|Folk|Iraqi Folk', + 2031 => 'Music Videos|Folk|Khaleeji Folk', + 2032 => 'Music Videos|Dance|Maghreb Dance', + 4000 => 'TV Shows|Comedy', + 4001 => 'TV Shows|Drama', + 4002 => 'TV Shows|Animation', + 4003 => 'TV Shows|Action & Adventure', + 4004 => 'TV Shows|Classics', + 4005 => 'TV Shows|Kids & Family', + 4006 => 'TV Shows|Nonfiction', + 4007 => 'TV Shows|Reality TV', + 4008 => 'TV Shows|Sci-Fi & Fantasy', + 4009 => 'TV Shows|Sports', + 4010 => 'TV Shows|Teens', + 4011 => 'TV Shows|Latino TV', + 4401 => 'Movies|Action & Adventure', + 4402 => 'Movies|Anime', + 4403 => 'Movies|Classics', + 4404 => 'Movies|Comedy', + 4405 => 'Movies|Documentary', + 4406 => 'Movies|Drama', + 4407 => 'Movies|Foreign', + 4408 => 'Movies|Horror', + 4409 => 'Movies|Independent', + 4410 => 'Movies|Kids & Family', + 4411 => 'Movies|Musicals', + 4412 => 'Movies|Romance', + 4413 => 'Movies|Sci-Fi & Fantasy', + 4414 => 'Movies|Short Films', + 4415 => 'Movies|Special Interest', + 4416 => 'Movies|Thriller', + 4417 => 'Movies|Sports', + 4418 => 'Movies|Western', + 4419 => 'Movies|Urban', + 4420 => 'Movies|Holiday', + 4421 => 'Movies|Made for TV', + 4422 => 'Movies|Concert Films', + 4423 => 'Movies|Music Documentaries', + 4424 => 'Movies|Music Feature Films', + 4425 => 'Movies|Japanese Cinema', + 4426 => 'Movies|Jidaigeki', + 4427 => 'Movies|Tokusatsu', + 4428 => 'Movies|Korean Cinema', + 4429 => 'Movies|Russian', + 4430 => 'Movies|Turkish', + 4431 => 'Movies|Bollywood', + 4432 => 'Movies|Regional Indian', + 4433 => 'Movies|Middle Eastern', + 4434 => 'Movies|African', + 6000 => 'App Store|Business', + 6001 => 'App Store|Weather', + 6002 => 'App Store|Utilities', + 6003 => 'App Store|Travel', + 6004 => 'App Store|Sports', + 6005 => 'App Store|Social Networking', + 6006 => 'App Store|Reference', + 6007 => 'App Store|Productivity', + 6008 => 'App Store|Photo & Video', + 6009 => 'App Store|News', + 6010 => 'App Store|Navigation', + 6011 => 'App Store|Music', + 6012 => 'App Store|Lifestyle', + 6013 => 'App Store|Health & Fitness', + 6014 => 'App Store|Games', + 6015 => 'App Store|Finance', + 6016 => 'App Store|Entertainment', + 6017 => 'App Store|Education', + 6018 => 'App Store|Books', + 6020 => 'App Store|Medical', + 6021 => 'App Store|Magazines & Newspapers', + 6022 => 'App Store|Catalogs', + 6023 => 'App Store|Food & Drink', + 6024 => 'App Store|Shopping', + 6025 => 'App Store|Stickers', + 6026 => 'App Store|Developer Tools', + 6027 => 'App Store|Graphics & Design', + 7001 => 'App Store|Games|Action', + 7002 => 'App Store|Games|Adventure', + 7003 => 'App Store|Games|Casual', + 7004 => 'App Store|Games|Board', + 7005 => 'App Store|Games|Card', + 7006 => 'App Store|Games|Casino', + 7007 => 'App Store|Games|Dice', + 7008 => 'App Store|Games|Educational', + 7009 => 'App Store|Games|Family', + 7011 => 'App Store|Games|Music', + 7012 => 'App Store|Games|Puzzle', + 7013 => 'App Store|Games|Racing', + 7014 => 'App Store|Games|Role Playing', + 7015 => 'App Store|Games|Simulation', + 7016 => 'App Store|Games|Sports', + 7017 => 'App Store|Games|Strategy', + 7018 => 'App Store|Games|Trivia', + 7019 => 'App Store|Games|Word', + 8001 => 'Tones|Ringtones|Alternative', + 8002 => 'Tones|Ringtones|Blues', + 8003 => "Tones|Ringtones|Children's Music", + 8004 => 'Tones|Ringtones|Classical', + 8005 => 'Tones|Ringtones|Comedy', + 8006 => 'Tones|Ringtones|Country', + 8007 => 'Tones|Ringtones|Dance', + 8008 => 'Tones|Ringtones|Electronic', + 8009 => 'Tones|Ringtones|Enka', + 8010 => 'Tones|Ringtones|French Pop', + 8011 => 'Tones|Ringtones|German Folk', + 8012 => 'Tones|Ringtones|German Pop', + 8013 => 'Tones|Ringtones|Hip-Hop/Rap', + 8014 => 'Tones|Ringtones|Holiday', + 8015 => 'Tones|Ringtones|Inspirational', + 8016 => 'Tones|Ringtones|J-Pop', + 8017 => 'Tones|Ringtones|Jazz', + 8018 => 'Tones|Ringtones|Kayokyoku', + 8019 => 'Tones|Ringtones|Latin', + 8020 => 'Tones|Ringtones|New Age', + 8021 => 'Tones|Ringtones|Classical|Opera', + 8022 => 'Tones|Ringtones|Pop', + 8023 => 'Tones|Ringtones|R&B/Soul', + 8024 => 'Tones|Ringtones|Reggae', + 8025 => 'Tones|Ringtones|Rock', + 8026 => 'Tones|Ringtones|Singer/Songwriter', + 8027 => 'Tones|Ringtones|Soundtrack', + 8028 => 'Tones|Ringtones|Spoken Word', + 8029 => 'Tones|Ringtones|Vocal', + 8030 => 'Tones|Ringtones|World', + 8050 => 'Tones|Alert Tones|Sound Effects', + 8051 => 'Tones|Alert Tones|Dialogue', + 8052 => 'Tones|Alert Tones|Music', + 8053 => 'Tones|Ringtones', + 8054 => 'Tones|Alert Tones', + 8055 => 'Tones|Ringtones|Alternative|Chinese Alt', + 8056 => 'Tones|Ringtones|Alternative|College Rock', + 8057 => 'Tones|Ringtones|Alternative|Goth Rock', + 8058 => 'Tones|Ringtones|Alternative|Grunge', + 8059 => 'Tones|Ringtones|Alternative|Indie Rock', + 8060 => 'Tones|Ringtones|Alternative|Korean Indie', + 8061 => 'Tones|Ringtones|Alternative|New Wave', + 8062 => 'Tones|Ringtones|Alternative|Punk', + 8063 => 'Tones|Ringtones|Anime', + 8064 => 'Tones|Ringtones|Arabic', + 8065 => 'Tones|Ringtones|Arabic|Arabic Pop', + 8066 => 'Tones|Ringtones|Arabic|Islamic', + 8067 => 'Tones|Ringtones|Arabic|Khaleeji', + 8068 => 'Tones|Ringtones|Arabic|North African', + 8069 => 'Tones|Ringtones|Blues|Acoustic Blues', + 8070 => 'Tones|Ringtones|Blues|Chicago Blues', + 8071 => 'Tones|Ringtones|Blues|Classic Blues', + 8072 => 'Tones|Ringtones|Blues|Contemporary Blues', + 8073 => 'Tones|Ringtones|Blues|Country Blues', + 8074 => 'Tones|Ringtones|Blues|Delta Blues', + 8075 => 'Tones|Ringtones|Blues|Electric Blues', + 8076 => 'Tones|Ringtones|Brazilian', + 8077 => 'Tones|Ringtones|Brazilian|Axe', # (Ax&eacute;) + 8078 => 'Tones|Ringtones|Brazilian|Baile Funk', + 8079 => 'Tones|Ringtones|Brazilian|Bossa Nova', + 8080 => 'Tones|Ringtones|Brazilian|Choro', + 8081 => 'Tones|Ringtones|Brazilian|Forro', # (Forr&oacute;) + 8082 => 'Tones|Ringtones|Brazilian|Frevo', + 8083 => 'Tones|Ringtones|Brazilian|MPB', + 8084 => 'Tones|Ringtones|Brazilian|Pagode', + 8085 => 'Tones|Ringtones|Brazilian|Samba', + 8086 => 'Tones|Ringtones|Brazilian|Sertanejo', + 8087 => "Tones|Ringtones|Children's Music|Lullabies", + 8088 => "Tones|Ringtones|Children's Music|Sing-Along", + 8089 => "Tones|Ringtones|Children's Music|Stories", + 8090 => 'Tones|Ringtones|Chinese', + 8091 => 'Tones|Ringtones|Chinese|Chinese Classical', + 8092 => 'Tones|Ringtones|Chinese|Chinese Flute', + 8093 => 'Tones|Ringtones|Chinese|Chinese Opera', + 8094 => 'Tones|Ringtones|Chinese|Chinese Orchestral', + 8095 => 'Tones|Ringtones|Chinese|Chinese Regional Folk', + 8096 => 'Tones|Ringtones|Chinese|Chinese Strings', + 8097 => 'Tones|Ringtones|Chinese|Taiwanese Folk', + 8098 => 'Tones|Ringtones|Chinese|Tibetan Native Music', + 8099 => 'Tones|Ringtones|Christian & Gospel', + 8100 => 'Tones|Ringtones|Christian & Gospel|CCM', + 8101 => 'Tones|Ringtones|Christian & Gospel|Christian Metal', + 8102 => 'Tones|Ringtones|Christian & Gospel|Christian Pop', + 8103 => 'Tones|Ringtones|Christian & Gospel|Christian Rap', + 8104 => 'Tones|Ringtones|Christian & Gospel|Christian Rock', + 8105 => 'Tones|Ringtones|Christian & Gospel|Classic Christian', + 8106 => 'Tones|Ringtones|Christian & Gospel|Contemporary Gospel', + 8107 => 'Tones|Ringtones|Christian & Gospel|Gospel', + 8108 => 'Tones|Ringtones|Christian & Gospel|Praise & Worship', + 8109 => 'Tones|Ringtones|Christian & Gospel|Southern Gospel', + 8110 => 'Tones|Ringtones|Christian & Gospel|Traditional Gospel', + 8111 => 'Tones|Ringtones|Classical|Avant-Garde', + 8112 => 'Tones|Ringtones|Classical|Baroque Era', + 8113 => 'Tones|Ringtones|Classical|Chamber Music', + 8114 => 'Tones|Ringtones|Classical|Chant', + 8115 => 'Tones|Ringtones|Classical|Choral', + 8116 => 'Tones|Ringtones|Classical|Classical Crossover', + 8117 => 'Tones|Ringtones|Classical|Early Music', + 8118 => 'Tones|Ringtones|Classical|High Classical', + 8119 => 'Tones|Ringtones|Classical|Impressionist', + 8120 => 'Tones|Ringtones|Classical|Medieval Era', + 8121 => 'Tones|Ringtones|Classical|Minimalism', + 8122 => 'Tones|Ringtones|Classical|Modern Era', + 8123 => 'Tones|Ringtones|Classical|Orchestral', + 8124 => 'Tones|Ringtones|Classical|Renaissance', + 8125 => 'Tones|Ringtones|Classical|Romantic Era', + 8126 => 'Tones|Ringtones|Classical|Wedding Music', + 8127 => 'Tones|Ringtones|Comedy|Novelty', + 8128 => 'Tones|Ringtones|Comedy|Standup Comedy', + 8129 => 'Tones|Ringtones|Country|Alternative Country', + 8130 => 'Tones|Ringtones|Country|Americana', + 8131 => 'Tones|Ringtones|Country|Bluegrass', + 8132 => 'Tones|Ringtones|Country|Contemporary Bluegrass', + 8133 => 'Tones|Ringtones|Country|Contemporary Country', + 8134 => 'Tones|Ringtones|Country|Country Gospel', + 8135 => 'Tones|Ringtones|Country|Honky Tonk', + 8136 => 'Tones|Ringtones|Country|Outlaw Country', + 8137 => 'Tones|Ringtones|Country|Thai Country', + 8138 => 'Tones|Ringtones|Country|Traditional Bluegrass', + 8139 => 'Tones|Ringtones|Country|Traditional Country', + 8140 => 'Tones|Ringtones|Country|Urban Cowboy', + 8141 => 'Tones|Ringtones|Dance|Breakbeat', + 8142 => 'Tones|Ringtones|Dance|Exercise', + 8143 => 'Tones|Ringtones|Dance|Garage', + 8144 => 'Tones|Ringtones|Dance|Hardcore', + 8145 => 'Tones|Ringtones|Dance|House', + 8146 => "Tones|Ringtones|Dance|Jungle/Drum'n'bass", + 8147 => 'Tones|Ringtones|Dance|Techno', + 8148 => 'Tones|Ringtones|Dance|Trance', + 8149 => 'Tones|Ringtones|Disney', + 8150 => 'Tones|Ringtones|Easy Listening', + 8151 => 'Tones|Ringtones|Easy Listening|Lounge', + 8152 => 'Tones|Ringtones|Easy Listening|Swing', + 8153 => 'Tones|Ringtones|Electronic|Ambient', + 8154 => 'Tones|Ringtones|Electronic|Downtempo', + 8155 => 'Tones|Ringtones|Electronic|Electronica', + 8156 => 'Tones|Ringtones|Electronic|IDM/Experimental', + 8157 => 'Tones|Ringtones|Electronic|Industrial', + 8158 => 'Tones|Ringtones|Fitness & Workout', + 8159 => 'Tones|Ringtones|Folk', + 8160 => 'Tones|Ringtones|Hip-Hop/Rap|Alternative Rap', + 8161 => 'Tones|Ringtones|Hip-Hop/Rap|Chinese Hip-Hop', + 8162 => 'Tones|Ringtones|Hip-Hop/Rap|Dirty South', + 8163 => 'Tones|Ringtones|Hip-Hop/Rap|East Coast Rap', + 8164 => 'Tones|Ringtones|Hip-Hop/Rap|Gangsta Rap', + 8165 => 'Tones|Ringtones|Hip-Hop/Rap|Hardcore Rap', + 8166 => 'Tones|Ringtones|Hip-Hop/Rap|Hip-Hop', + 8167 => 'Tones|Ringtones|Hip-Hop/Rap|Korean Hip-Hop', + 8168 => 'Tones|Ringtones|Hip-Hop/Rap|Latin Rap', + 8169 => 'Tones|Ringtones|Hip-Hop/Rap|Old School Rap', + 8170 => 'Tones|Ringtones|Hip-Hop/Rap|Rap', + 8171 => 'Tones|Ringtones|Hip-Hop/Rap|Underground Rap', + 8172 => 'Tones|Ringtones|Hip-Hop/Rap|West Coast Rap', + 8173 => 'Tones|Ringtones|Holiday|Chanukah', + 8174 => 'Tones|Ringtones|Holiday|Christmas', + 8175 => "Tones|Ringtones|Holiday|Christmas: Children's", + 8176 => 'Tones|Ringtones|Holiday|Christmas: Classic', + 8177 => 'Tones|Ringtones|Holiday|Christmas: Classical', + 8178 => 'Tones|Ringtones|Holiday|Christmas: Jazz', + 8179 => 'Tones|Ringtones|Holiday|Christmas: Modern', + 8180 => 'Tones|Ringtones|Holiday|Christmas: Pop', + 8181 => 'Tones|Ringtones|Holiday|Christmas: R&B', + 8182 => 'Tones|Ringtones|Holiday|Christmas: Religious', + 8183 => 'Tones|Ringtones|Holiday|Christmas: Rock', + 8184 => 'Tones|Ringtones|Holiday|Easter', + 8185 => 'Tones|Ringtones|Holiday|Halloween', + 8186 => 'Tones|Ringtones|Holiday|Thanksgiving', + 8187 => 'Tones|Ringtones|Indian', + 8188 => 'Tones|Ringtones|Indian|Bollywood', + 8189 => 'Tones|Ringtones|Indian|Devotional & Spiritual', + 8190 => 'Tones|Ringtones|Indian|Ghazals', + 8191 => 'Tones|Ringtones|Indian|Indian Classical', + 8192 => 'Tones|Ringtones|Indian|Indian Folk', + 8193 => 'Tones|Ringtones|Indian|Indian Pop', + 8194 => 'Tones|Ringtones|Indian|Regional Indian', + 8195 => 'Tones|Ringtones|Indian|Sufi', + 8196 => 'Tones|Ringtones|Indian|Regional Indian|Tamil', + 8197 => 'Tones|Ringtones|Indian|Regional Indian|Telugu', + 8198 => 'Tones|Ringtones|Instrumental', + 8199 => 'Tones|Ringtones|Jazz|Avant-Garde Jazz', + 8201 => 'Tones|Ringtones|Jazz|Big Band', + 8202 => 'Tones|Ringtones|Jazz|Bop', + 8203 => 'Tones|Ringtones|Jazz|Contemporary Jazz', + 8204 => 'Tones|Ringtones|Jazz|Cool Jazz', + 8205 => 'Tones|Ringtones|Jazz|Crossover Jazz', + 8206 => 'Tones|Ringtones|Jazz|Dixieland', + 8207 => 'Tones|Ringtones|Jazz|Fusion', + 8208 => 'Tones|Ringtones|Jazz|Hard Bop', + 8209 => 'Tones|Ringtones|Jazz|Latin Jazz', + 8210 => 'Tones|Ringtones|Jazz|Mainstream Jazz', + 8211 => 'Tones|Ringtones|Jazz|Ragtime', + 8212 => 'Tones|Ringtones|Jazz|Smooth Jazz', + 8213 => 'Tones|Ringtones|Jazz|Trad Jazz', + 8214 => 'Tones|Ringtones|Pop|K-Pop', + 8215 => 'Tones|Ringtones|Karaoke', + 8216 => 'Tones|Ringtones|Korean', + 8217 => 'Tones|Ringtones|Korean|Korean Classical', + 8218 => 'Tones|Ringtones|Korean|Korean Trad Instrumental', + 8219 => 'Tones|Ringtones|Korean|Korean Trad Song', + 8220 => 'Tones|Ringtones|Korean|Korean Trad Theater', + 8221 => 'Tones|Ringtones|Latin|Alternative & Rock in Spanish', + 8222 => 'Tones|Ringtones|Latin|Baladas y Boleros', + 8223 => 'Tones|Ringtones|Latin|Contemporary Latin', + 8224 => 'Tones|Ringtones|Latin|Latin Jazz', + 8225 => 'Tones|Ringtones|Latin|Latin Urban', + 8226 => 'Tones|Ringtones|Latin|Pop in Spanish', + 8227 => 'Tones|Ringtones|Latin|Raices', + 8228 => 'Tones|Ringtones|Latin|Musica Mexicana', # (M&uacute;sica Mexicana) + 8229 => 'Tones|Ringtones|Latin|Salsa y Tropical', + 8230 => 'Tones|Ringtones|Marching Bands', + 8231 => 'Tones|Ringtones|New Age|Healing', + 8232 => 'Tones|Ringtones|New Age|Meditation', + 8233 => 'Tones|Ringtones|New Age|Nature', + 8234 => 'Tones|Ringtones|New Age|Relaxation', + 8235 => 'Tones|Ringtones|New Age|Travel', + 8236 => 'Tones|Ringtones|Orchestral', + 8237 => 'Tones|Ringtones|Pop|Adult Contemporary', + 8238 => 'Tones|Ringtones|Pop|Britpop', + 8239 => 'Tones|Ringtones|Pop|C-Pop', + 8240 => 'Tones|Ringtones|Pop|Cantopop/HK-Pop', + 8241 => 'Tones|Ringtones|Pop|Indo Pop', + 8242 => 'Tones|Ringtones|Pop|Korean Folk-Pop', + 8243 => 'Tones|Ringtones|Pop|Malaysian Pop', + 8244 => 'Tones|Ringtones|Pop|Mandopop', + 8245 => 'Tones|Ringtones|Pop|Manilla Sound', + 8246 => 'Tones|Ringtones|Pop|Oldies', + 8247 => 'Tones|Ringtones|Pop|Original Pilipino Music', + 8248 => 'Tones|Ringtones|Pop|Pinoy Pop', + 8249 => 'Tones|Ringtones|Pop|Pop/Rock', + 8250 => 'Tones|Ringtones|Pop|Soft Rock', + 8251 => 'Tones|Ringtones|Pop|Tai-Pop', + 8252 => 'Tones|Ringtones|Pop|Teen Pop', + 8253 => 'Tones|Ringtones|Pop|Thai Pop', + 8254 => 'Tones|Ringtones|R&B/Soul|Contemporary R&B', + 8255 => 'Tones|Ringtones|R&B/Soul|Disco', + 8256 => 'Tones|Ringtones|R&B/Soul|Doo Wop', + 8257 => 'Tones|Ringtones|R&B/Soul|Funk', + 8258 => 'Tones|Ringtones|R&B/Soul|Motown', + 8259 => 'Tones|Ringtones|R&B/Soul|Neo-Soul', + 8260 => 'Tones|Ringtones|R&B/Soul|Soul', + 8261 => 'Tones|Ringtones|Reggae|Modern Dancehall', + 8262 => 'Tones|Ringtones|Reggae|Dub', + 8263 => 'Tones|Ringtones|Reggae|Roots Reggae', + 8264 => 'Tones|Ringtones|Reggae|Ska', + 8265 => 'Tones|Ringtones|Rock|Adult Alternative', + 8266 => 'Tones|Ringtones|Rock|American Trad Rock', + 8267 => 'Tones|Ringtones|Rock|Arena Rock', + 8268 => 'Tones|Ringtones|Rock|Blues-Rock', + 8269 => 'Tones|Ringtones|Rock|British Invasion', + 8270 => 'Tones|Ringtones|Rock|Chinese Rock', + 8271 => 'Tones|Ringtones|Rock|Death Metal/Black Metal', + 8272 => 'Tones|Ringtones|Rock|Glam Rock', + 8273 => 'Tones|Ringtones|Rock|Hair Metal', + 8274 => 'Tones|Ringtones|Rock|Hard Rock', + 8275 => 'Tones|Ringtones|Rock|Metal', + 8276 => 'Tones|Ringtones|Rock|Jam Bands', + 8277 => 'Tones|Ringtones|Rock|Korean Rock', + 8278 => 'Tones|Ringtones|Rock|Prog-Rock/Art Rock', + 8279 => 'Tones|Ringtones|Rock|Psychedelic', + 8280 => 'Tones|Ringtones|Rock|Rock & Roll', + 8281 => 'Tones|Ringtones|Rock|Rockabilly', + 8282 => 'Tones|Ringtones|Rock|Roots Rock', + 8283 => 'Tones|Ringtones|Rock|Singer/Songwriter', + 8284 => 'Tones|Ringtones|Rock|Southern Rock', + 8285 => 'Tones|Ringtones|Rock|Surf', + 8286 => 'Tones|Ringtones|Rock|Tex-Mex', + 8287 => 'Tones|Ringtones|Singer/Songwriter|Alternative Folk', + 8288 => 'Tones|Ringtones|Singer/Songwriter|Contemporary Folk', + 8289 => 'Tones|Ringtones|Singer/Songwriter|Contemporary Singer/Songwriter', + 8290 => 'Tones|Ringtones|Singer/Songwriter|Folk-Rock', + 8291 => 'Tones|Ringtones|Singer/Songwriter|New Acoustic', + 8292 => 'Tones|Ringtones|Singer/Songwriter|Traditional Folk', + 8293 => 'Tones|Ringtones|Soundtrack|Foreign Cinema', + 8294 => 'Tones|Ringtones|Soundtrack|Musicals', + 8295 => 'Tones|Ringtones|Soundtrack|Original Score', + 8296 => 'Tones|Ringtones|Soundtrack|Sound Effects', + 8297 => 'Tones|Ringtones|Soundtrack|Soundtrack', + 8298 => 'Tones|Ringtones|Soundtrack|TV Soundtrack', + 8299 => 'Tones|Ringtones|Vocal|Standards', + 8300 => 'Tones|Ringtones|Vocal|Traditional Pop', + 8301 => 'Tones|Ringtones|Vocal|Trot', + 8302 => 'Tones|Ringtones|Jazz|Vocal Jazz', + 8303 => 'Tones|Ringtones|Vocal|Vocal Pop', + 8304 => 'Tones|Ringtones|African', + 8305 => 'Tones|Ringtones|African|Afrikaans', + 8306 => 'Tones|Ringtones|African|Afro-Beat', + 8307 => 'Tones|Ringtones|African|Afro-Pop', + 8308 => 'Tones|Ringtones|Turkish|Arabesque', + 8309 => 'Tones|Ringtones|World|Asia', + 8310 => 'Tones|Ringtones|World|Australia', + 8311 => 'Tones|Ringtones|World|Cajun', + 8312 => 'Tones|Ringtones|World|Calypso', + 8313 => 'Tones|Ringtones|World|Caribbean', + 8314 => 'Tones|Ringtones|World|Celtic', + 8315 => 'Tones|Ringtones|World|Celtic Folk', + 8316 => 'Tones|Ringtones|World|Contemporary Celtic', + 8317 => 'Tones|Ringtones|World|Dangdut', + 8318 => 'Tones|Ringtones|World|Dini', + 8319 => 'Tones|Ringtones|World|Europe', + 8320 => 'Tones|Ringtones|World|Fado', + 8321 => 'Tones|Ringtones|World|Farsi', + 8322 => 'Tones|Ringtones|World|Flamenco', + 8323 => 'Tones|Ringtones|World|France', + 8324 => 'Tones|Ringtones|Turkish|Halk', + 8325 => 'Tones|Ringtones|World|Hawaii', + 8326 => 'Tones|Ringtones|World|Iberia', + 8327 => 'Tones|Ringtones|World|Indonesian Religious', + 8328 => 'Tones|Ringtones|World|Israeli', + 8329 => 'Tones|Ringtones|World|Japan', + 8330 => 'Tones|Ringtones|World|Klezmer', + 8331 => 'Tones|Ringtones|World|North America', + 8332 => 'Tones|Ringtones|World|Polka', + 8333 => 'Tones|Ringtones|Russian', + 8334 => 'Tones|Ringtones|Russian|Russian Chanson', + 8335 => 'Tones|Ringtones|Turkish|Sanat', + 8336 => 'Tones|Ringtones|World|Soca', + 8337 => 'Tones|Ringtones|World|South Africa', + 8338 => 'Tones|Ringtones|World|South America', + 8339 => 'Tones|Ringtones|World|Tango', + 8340 => 'Tones|Ringtones|World|Traditional Celtic', + 8341 => 'Tones|Ringtones|Turkish', + 8342 => 'Tones|Ringtones|World|Worldbeat', + 8343 => 'Tones|Ringtones|World|Zydeco', + 8345 => 'Tones|Ringtones|Classical|Art Song', + 8346 => 'Tones|Ringtones|Classical|Brass & Woodwinds', + 8347 => 'Tones|Ringtones|Classical|Solo Instrumental', + 8348 => 'Tones|Ringtones|Classical|Contemporary Era', + 8349 => 'Tones|Ringtones|Classical|Oratorio', + 8350 => 'Tones|Ringtones|Classical|Cantata', + 8351 => 'Tones|Ringtones|Classical|Electronic', + 8352 => 'Tones|Ringtones|Classical|Sacred', + 8353 => 'Tones|Ringtones|Classical|Guitar', + 8354 => 'Tones|Ringtones|Classical|Piano', + 8355 => 'Tones|Ringtones|Classical|Violin', + 8356 => 'Tones|Ringtones|Classical|Cello', + 8357 => 'Tones|Ringtones|Classical|Percussion', + 8358 => 'Tones|Ringtones|Electronic|Dubstep', + 8359 => 'Tones|Ringtones|Electronic|Bass', + 8360 => 'Tones|Ringtones|Hip-Hop/Rap|UK Hip Hop', + 8361 => 'Tones|Ringtones|Reggae|Lovers Rock', + 8362 => 'Tones|Ringtones|Alternative|EMO', + 8363 => 'Tones|Ringtones|Alternative|Pop Punk', + 8364 => 'Tones|Ringtones|Alternative|Indie Pop', + 8365 => 'Tones|Ringtones|New Age|Yoga', + 8366 => 'Tones|Ringtones|Pop|Tribute', + 8367 => 'Tones|Ringtones|Pop|Shows', + 8368 => 'Tones|Ringtones|Cuban', + 8369 => 'Tones|Ringtones|Cuban|Mambo', + 8370 => 'Tones|Ringtones|Cuban|Chachacha', + 8371 => 'Tones|Ringtones|Cuban|Guajira', + 8372 => 'Tones|Ringtones|Cuban|Son', + 8373 => 'Tones|Ringtones|Cuban|Bolero', + 8374 => 'Tones|Ringtones|Cuban|Guaracha', + 8375 => 'Tones|Ringtones|Cuban|Timba', + 8376 => 'Tones|Ringtones|Soundtrack|Video Game', + 8377 => 'Tones|Ringtones|Indian|Regional Indian|Punjabi|Punjabi Pop', + 8378 => 'Tones|Ringtones|Indian|Regional Indian|Bengali|Rabindra Sangeet', + 8379 => 'Tones|Ringtones|Indian|Regional Indian|Malayalam', + 8380 => 'Tones|Ringtones|Indian|Regional Indian|Kannada', + 8381 => 'Tones|Ringtones|Indian|Regional Indian|Marathi', + 8382 => 'Tones|Ringtones|Indian|Regional Indian|Gujarati', + 8383 => 'Tones|Ringtones|Indian|Regional Indian|Assamese', + 8384 => 'Tones|Ringtones|Indian|Regional Indian|Bhojpuri', + 8385 => 'Tones|Ringtones|Indian|Regional Indian|Haryanvi', + 8386 => 'Tones|Ringtones|Indian|Regional Indian|Odia', + 8387 => 'Tones|Ringtones|Indian|Regional Indian|Rajasthani', + 8388 => 'Tones|Ringtones|Indian|Regional Indian|Urdu', + 8389 => 'Tones|Ringtones|Indian|Regional Indian|Punjabi', + 8390 => 'Tones|Ringtones|Indian|Regional Indian|Bengali', + 8391 => 'Tones|Ringtones|Indian|Indian Classical|Carnatic Classical', + 8392 => 'Tones|Ringtones|Indian|Indian Classical|Hindustani Classical', + 8393 => 'Tones|Ringtones|African|Afro House', + 8394 => 'Tones|Ringtones|African|Afro Soul', + 8395 => 'Tones|Ringtones|African|Afrobeats', + 8396 => 'Tones|Ringtones|African|Benga', + 8397 => 'Tones|Ringtones|African|Bongo-Flava', + 8398 => 'Tones|Ringtones|African|Coupe-Decale', + 8399 => 'Tones|Ringtones|African|Gqom', + 8400 => 'Tones|Ringtones|African|Highlife', + 8401 => 'Tones|Ringtones|African|Kuduro', + 8402 => 'Tones|Ringtones|African|Kizomba', + 8403 => 'Tones|Ringtones|African|Kwaito', + 8404 => 'Tones|Ringtones|African|Mbalax', + 8405 => 'Tones|Ringtones|African|Ndombolo', + 8406 => 'Tones|Ringtones|African|Shangaan Electro', + 8407 => 'Tones|Ringtones|African|Soukous', + 8408 => 'Tones|Ringtones|African|Taarab', + 8409 => 'Tones|Ringtones|African|Zouglou', + 8410 => 'Tones|Ringtones|Turkish|Ozgun', + 8411 => 'Tones|Ringtones|Turkish|Fantezi', + 8412 => 'Tones|Ringtones|Turkish|Religious', + 8413 => 'Tones|Ringtones|Pop|Turkish Pop', + 8414 => 'Tones|Ringtones|Rock|Turkish Rock', + 8415 => 'Tones|Ringtones|Alternative|Turkish Alternative', + 8416 => 'Tones|Ringtones|Hip-Hop/Rap|Turkish Hip-Hop/Rap', + 8417 => 'Tones|Ringtones|African|Maskandi', + 8418 => 'Tones|Ringtones|Russian|Russian Romance', + 8419 => 'Tones|Ringtones|Russian|Russian Bard', + 8420 => 'Tones|Ringtones|Russian|Russian Pop', + 8421 => 'Tones|Ringtones|Russian|Russian Rock', + 8422 => 'Tones|Ringtones|Russian|Russian Hip-Hop', + 8423 => 'Tones|Ringtones|Arabic|Levant', + 8424 => 'Tones|Ringtones|Arabic|Levant|Dabke', + 8425 => 'Tones|Ringtones|Arabic|Maghreb Rai', + 8426 => 'Tones|Ringtones|Arabic|Khaleeji|Khaleeji Jalsat', + 8427 => 'Tones|Ringtones|Arabic|Khaleeji|Khaleeji Shailat', + 8428 => 'Tones|Ringtones|Tarab', + 8429 => 'Tones|Ringtones|Tarab|Iraqi Tarab', + 8430 => 'Tones|Ringtones|Tarab|Egyptian Tarab', + 8431 => 'Tones|Ringtones|Tarab|Khaleeji Tarab', + 8432 => 'Tones|Ringtones|Pop|Levant Pop', + 8433 => 'Tones|Ringtones|Pop|Iraqi Pop', + 8434 => 'Tones|Ringtones|Pop|Egyptian Pop', + 8435 => 'Tones|Ringtones|Pop|Maghreb Pop', + 8436 => 'Tones|Ringtones|Pop|Khaleeji Pop', + 8437 => 'Tones|Ringtones|Hip-Hop/Rap|Levant Hip-Hop', + 8438 => 'Tones|Ringtones|Hip-Hop/Rap|Egyptian Hip-Hop', + 8439 => 'Tones|Ringtones|Hip-Hop/Rap|Maghreb Hip-Hop', + 8440 => 'Tones|Ringtones|Hip-Hop/Rap|Khaleeji Hip-Hop', + 8441 => 'Tones|Ringtones|Alternative|Indie Levant', + 8442 => 'Tones|Ringtones|Alternative|Indie Egyptian', + 8443 => 'Tones|Ringtones|Alternative|Indie Maghreb', + 8444 => 'Tones|Ringtones|Electronic|Levant Electronic', + 8445 => "Tones|Ringtones|Electronic|Electro-Cha'abi", + 8446 => 'Tones|Ringtones|Electronic|Maghreb Electronic', + 8447 => 'Tones|Ringtones|Folk|Iraqi Folk', + 8448 => 'Tones|Ringtones|Folk|Khaleeji Folk', + 8449 => 'Tones|Ringtones|Dance|Maghreb Dance', + 9002 => 'Books|Nonfiction', + 9003 => 'Books|Romance', + 9004 => 'Books|Travel & Adventure', + 9007 => 'Books|Arts & Entertainment', + 9008 => 'Books|Biographies & Memoirs', + 9009 => 'Books|Business & Personal Finance', + 9010 => 'Books|Children & Teens', + 9012 => 'Books|Humor', + 9015 => 'Books|History', + 9018 => 'Books|Religion & Spirituality', + 9019 => 'Books|Science & Nature', + 9020 => 'Books|Sci-Fi & Fantasy', + 9024 => 'Books|Lifestyle & Home', + 9025 => 'Books|Self-Development', + 9026 => 'Books|Comics & Graphic Novels', + 9027 => 'Books|Computers & Internet', + 9028 => 'Books|Cookbooks, Food & Wine', + 9029 => 'Books|Professional & Technical', + 9030 => 'Books|Parenting', + 9031 => 'Books|Fiction & Literature', + 9032 => 'Books|Mysteries & Thrillers', + 9033 => 'Books|Reference', + 9034 => 'Books|Politics & Current Events', + 9035 => 'Books|Sports & Outdoors', + 10001 => 'Books|Lifestyle & Home|Antiques & Collectibles', + 10002 => 'Books|Arts & Entertainment|Art & Architecture', + 10003 => 'Books|Religion & Spirituality|Bibles', + 10004 => 'Books|Self-Development|Spirituality', + 10005 => 'Books|Business & Personal Finance|Industries & Professions', + 10006 => 'Books|Business & Personal Finance|Marketing & Sales', + 10007 => 'Books|Business & Personal Finance|Small Business & Entrepreneurship', + 10008 => 'Books|Business & Personal Finance|Personal Finance', + 10009 => 'Books|Business & Personal Finance|Reference', + 10010 => 'Books|Business & Personal Finance|Careers', + 10011 => 'Books|Business & Personal Finance|Economics', + 10012 => 'Books|Business & Personal Finance|Investing', + 10013 => 'Books|Business & Personal Finance|Finance', + 10014 => 'Books|Business & Personal Finance|Management & Leadership', + 10015 => 'Books|Comics & Graphic Novels|Graphic Novels', + 10016 => 'Books|Comics & Graphic Novels|Manga', + 10017 => 'Books|Computers & Internet|Computers', + 10018 => 'Books|Computers & Internet|Databases', + 10019 => 'Books|Computers & Internet|Digital Media', + 10020 => 'Books|Computers & Internet|Internet', + 10021 => 'Books|Computers & Internet|Network', + 10022 => 'Books|Computers & Internet|Operating Systems', + 10023 => 'Books|Computers & Internet|Programming', + 10024 => 'Books|Computers & Internet|Software', + 10025 => 'Books|Computers & Internet|System Administration', + 10026 => 'Books|Cookbooks, Food & Wine|Beverages', + 10027 => 'Books|Cookbooks, Food & Wine|Courses & Dishes', + 10028 => 'Books|Cookbooks, Food & Wine|Special Diet', + 10029 => 'Books|Cookbooks, Food & Wine|Special Occasions', + 10030 => 'Books|Cookbooks, Food & Wine|Methods', + 10031 => 'Books|Cookbooks, Food & Wine|Reference', + 10032 => 'Books|Cookbooks, Food & Wine|Regional & Ethnic', + 10033 => 'Books|Cookbooks, Food & Wine|Specific Ingredients', + 10034 => 'Books|Lifestyle & Home|Crafts & Hobbies', + 10035 => 'Books|Professional & Technical|Design', + 10036 => 'Books|Arts & Entertainment|Theater', + 10037 => 'Books|Professional & Technical|Education', + 10038 => 'Books|Nonfiction|Family & Relationships', + 10039 => 'Books|Fiction & Literature|Action & Adventure', + 10040 => 'Books|Fiction & Literature|African American', + 10041 => 'Books|Fiction & Literature|Religious', + 10042 => 'Books|Fiction & Literature|Classics', + 10043 => 'Books|Fiction & Literature|Erotica', + 10044 => 'Books|Sci-Fi & Fantasy|Fantasy', + 10045 => 'Books|Fiction & Literature|Gay', + 10046 => 'Books|Fiction & Literature|Ghost', + 10047 => 'Books|Fiction & Literature|Historical', + 10048 => 'Books|Fiction & Literature|Horror', + 10049 => 'Books|Fiction & Literature|Literary', + 10050 => 'Books|Mysteries & Thrillers|Hard-Boiled', + 10051 => 'Books|Mysteries & Thrillers|Historical', + 10052 => 'Books|Mysteries & Thrillers|Police Procedural', + 10053 => 'Books|Mysteries & Thrillers|Short Stories', + 10054 => 'Books|Mysteries & Thrillers|British Detectives', + 10055 => 'Books|Mysteries & Thrillers|Women Sleuths', + 10056 => 'Books|Romance|Erotic Romance', + 10057 => 'Books|Romance|Contemporary', + 10058 => 'Books|Romance|Paranormal', + 10059 => 'Books|Romance|Historical', + 10060 => 'Books|Romance|Short Stories', + 10061 => 'Books|Romance|Suspense', + 10062 => 'Books|Romance|Western', + 10063 => 'Books|Sci-Fi & Fantasy|Science Fiction', + 10064 => 'Books|Sci-Fi & Fantasy|Science Fiction & Literature', + 10065 => 'Books|Fiction & Literature|Short Stories', + 10066 => 'Books|Reference|Foreign Languages', + 10067 => 'Books|Arts & Entertainment|Games', + 10068 => 'Books|Lifestyle & Home|Gardening', + 10069 => 'Books|Self-Development|Health & Fitness', + 10070 => 'Books|History|Africa', + 10071 => 'Books|History|Americas', + 10072 => 'Books|History|Ancient', + 10073 => 'Books|History|Asia', + 10074 => 'Books|History|Australia & Oceania', + 10075 => 'Books|History|Europe', + 10076 => 'Books|History|Latin America', + 10077 => 'Books|History|Middle East', + 10078 => 'Books|History|Military', + 10079 => 'Books|History|United States', + 10080 => 'Books|History|World', + 10081 => "Books|Children & Teens|Children's Fiction", + 10082 => "Books|Children & Teens|Children's Nonfiction", + 10083 => 'Books|Professional & Technical|Law', + 10084 => 'Books|Fiction & Literature|Literary Criticism', + 10085 => 'Books|Science & Nature|Mathematics', + 10086 => 'Books|Professional & Technical|Medical', + 10087 => 'Books|Arts & Entertainment|Music', + 10088 => 'Books|Science & Nature|Nature', + 10089 => 'Books|Arts & Entertainment|Performing Arts', + 10090 => 'Books|Lifestyle & Home|Pets', + 10091 => 'Books|Nonfiction|Philosophy', + 10092 => 'Books|Arts & Entertainment|Photography', + 10093 => 'Books|Fiction & Literature|Poetry', + 10094 => 'Books|Self-Development|Psychology', + 10095 => 'Books|Reference|Almanacs & Yearbooks', + 10096 => 'Books|Reference|Atlases & Maps', + 10097 => 'Books|Reference|Catalogs & Directories', + 10098 => 'Books|Reference|Consumer Guides', + 10099 => 'Books|Reference|Dictionaries & Thesauruses', + 10100 => 'Books|Reference|Encyclopedias', + 10101 => 'Books|Reference|Etiquette', + 10102 => 'Books|Reference|Quotations', + 10103 => 'Books|Reference|Words & Language', + 10104 => 'Books|Reference|Writing', + 10105 => 'Books|Religion & Spirituality|Bible Studies', + 10106 => 'Books|Religion & Spirituality|Buddhism', + 10107 => 'Books|Religion & Spirituality|Christianity', + 10108 => 'Books|Religion & Spirituality|Hinduism', + 10109 => 'Books|Religion & Spirituality|Islam', + 10110 => 'Books|Religion & Spirituality|Judaism', + 10111 => 'Books|Science & Nature|Astronomy', + 10112 => 'Books|Science & Nature|Chemistry', + 10113 => 'Books|Science & Nature|Earth Sciences', + 10114 => 'Books|Science & Nature|Essays', + 10115 => 'Books|Science & Nature|History', + 10116 => 'Books|Science & Nature|Life Sciences', + 10117 => 'Books|Science & Nature|Physics', + 10118 => 'Books|Science & Nature|Reference', + 10119 => 'Books|Self-Development|Self-Improvement', + 10120 => 'Books|Nonfiction|Social Science', + 10121 => 'Books|Sports & Outdoors|Baseball', + 10122 => 'Books|Sports & Outdoors|Basketball', + 10123 => 'Books|Sports & Outdoors|Coaching', + 10124 => 'Books|Sports & Outdoors|Extreme Sports', + 10125 => 'Books|Sports & Outdoors|Football', + 10126 => 'Books|Sports & Outdoors|Golf', + 10127 => 'Books|Sports & Outdoors|Hockey', + 10128 => 'Books|Sports & Outdoors|Mountaineering', + 10129 => 'Books|Sports & Outdoors|Outdoors', + 10130 => 'Books|Sports & Outdoors|Racket Sports', + 10131 => 'Books|Sports & Outdoors|Reference', + 10132 => 'Books|Sports & Outdoors|Soccer', + 10133 => 'Books|Sports & Outdoors|Training', + 10134 => 'Books|Sports & Outdoors|Water Sports', + 10135 => 'Books|Sports & Outdoors|Winter Sports', + 10136 => 'Books|Reference|Study Aids', + 10137 => 'Books|Professional & Technical|Engineering', + 10138 => 'Books|Nonfiction|Transportation', + 10139 => 'Books|Travel & Adventure|Africa', + 10140 => 'Books|Travel & Adventure|Asia', + 10141 => 'Books|Travel & Adventure|Specialty Travel', + 10142 => 'Books|Travel & Adventure|Canada', + 10143 => 'Books|Travel & Adventure|Caribbean', + 10144 => 'Books|Travel & Adventure|Latin America', + 10145 => 'Books|Travel & Adventure|Essays & Memoirs', + 10146 => 'Books|Travel & Adventure|Europe', + 10147 => 'Books|Travel & Adventure|Middle East', + 10148 => 'Books|Travel & Adventure|United States', + 10149 => 'Books|Nonfiction|True Crime', + 11001 => 'Books|Sci-Fi & Fantasy|Fantasy|Contemporary', + 11002 => 'Books|Sci-Fi & Fantasy|Fantasy|Epic', + 11003 => 'Books|Sci-Fi & Fantasy|Fantasy|Historical', + 11004 => 'Books|Sci-Fi & Fantasy|Fantasy|Paranormal', + 11005 => 'Books|Sci-Fi & Fantasy|Fantasy|Short Stories', + 11006 => 'Books|Sci-Fi & Fantasy|Science Fiction & Literature|Adventure', + 11007 => 'Books|Sci-Fi & Fantasy|Science Fiction & Literature|High Tech', + 11008 => 'Books|Sci-Fi & Fantasy|Science Fiction & Literature|Short Stories', + 11009 => 'Books|Professional & Technical|Education|Language Arts & Disciplines', + 11010 => 'Books|Communications & Media', + 11011 => 'Books|Communications & Media|Broadcasting', + 11012 => 'Books|Communications & Media|Digital Media', + 11013 => 'Books|Communications & Media|Journalism', + 11014 => 'Books|Communications & Media|Photojournalism', + 11015 => 'Books|Communications & Media|Print', + 11016 => 'Books|Communications & Media|Speech', + 11017 => 'Books|Communications & Media|Writing', + 11018 => 'Books|Arts & Entertainment|Art & Architecture|Urban Planning', + 11019 => 'Books|Arts & Entertainment|Dance', + 11020 => 'Books|Arts & Entertainment|Fashion', + 11021 => 'Books|Arts & Entertainment|Film', + 11022 => 'Books|Arts & Entertainment|Interior Design', + 11023 => 'Books|Arts & Entertainment|Media Arts', + 11024 => 'Books|Arts & Entertainment|Radio', + 11025 => 'Books|Arts & Entertainment|TV', + 11026 => 'Books|Arts & Entertainment|Visual Arts', + 11027 => 'Books|Biographies & Memoirs|Arts & Entertainment', + 11028 => 'Books|Biographies & Memoirs|Business', + 11029 => 'Books|Biographies & Memoirs|Culinary', + 11030 => 'Books|Biographies & Memoirs|Gay & Lesbian', + 11031 => 'Books|Biographies & Memoirs|Historical', + 11032 => 'Books|Biographies & Memoirs|Literary', + 11033 => 'Books|Biographies & Memoirs|Media & Journalism', + 11034 => 'Books|Biographies & Memoirs|Military', + 11035 => 'Books|Biographies & Memoirs|Politics', + 11036 => 'Books|Biographies & Memoirs|Religious', + 11037 => 'Books|Biographies & Memoirs|Science & Technology', + 11038 => 'Books|Biographies & Memoirs|Sports', + 11039 => 'Books|Biographies & Memoirs|Women', + 11040 => 'Books|Romance|New Adult', + 11042 => 'Books|Romance|Romantic Comedy', + 11043 => 'Books|Romance|Gay & Lesbian', + 11044 => 'Books|Fiction & Literature|Essays', + 11045 => 'Books|Fiction & Literature|Anthologies', + 11046 => 'Books|Fiction & Literature|Comparative Literature', + 11047 => 'Books|Fiction & Literature|Drama', + 11049 => 'Books|Fiction & Literature|Fairy Tales, Myths & Fables', + 11050 => 'Books|Fiction & Literature|Family', + 11051 => 'Books|Comics & Graphic Novels|Manga|School Drama', + 11052 => 'Books|Comics & Graphic Novels|Manga|Human Drama', + 11053 => 'Books|Comics & Graphic Novels|Manga|Family Drama', + 11054 => 'Books|Sports & Outdoors|Boxing', + 11055 => 'Books|Sports & Outdoors|Cricket', + 11056 => 'Books|Sports & Outdoors|Cycling', + 11057 => 'Books|Sports & Outdoors|Equestrian', + 11058 => 'Books|Sports & Outdoors|Martial Arts & Self Defense', + 11059 => 'Books|Sports & Outdoors|Motor Sports', + 11060 => 'Books|Sports & Outdoors|Rugby', + 11061 => 'Books|Sports & Outdoors|Running', + 11062 => 'Books|Self-Development|Diet & Nutrition', + 11063 => 'Books|Science & Nature|Agriculture', + 11064 => 'Books|Science & Nature|Atmosphere', + 11065 => 'Books|Science & Nature|Biology', + 11066 => 'Books|Science & Nature|Ecology', + 11067 => 'Books|Science & Nature|Environment', + 11068 => 'Books|Science & Nature|Geography', + 11069 => 'Books|Science & Nature|Geology', + 11070 => 'Books|Nonfiction|Social Science|Anthropology', + 11071 => 'Books|Nonfiction|Social Science|Archaeology', + 11072 => 'Books|Nonfiction|Social Science|Civics', + 11073 => 'Books|Nonfiction|Social Science|Government', + 11074 => 'Books|Nonfiction|Social Science|Social Studies', + 11075 => 'Books|Nonfiction|Social Science|Social Welfare', + 11076 => 'Books|Nonfiction|Social Science|Society', + 11077 => 'Books|Nonfiction|Philosophy|Aesthetics', + 11078 => 'Books|Nonfiction|Philosophy|Epistemology', + 11079 => 'Books|Nonfiction|Philosophy|Ethics', + 11080 => 'Books|Nonfiction|Philosophy|Language', + 11081 => 'Books|Nonfiction|Philosophy|Logic', + 11082 => 'Books|Nonfiction|Philosophy|Metaphysics', + 11083 => 'Books|Nonfiction|Philosophy|Political', + 11084 => 'Books|Nonfiction|Philosophy|Religion', + 11085 => 'Books|Reference|Manuals', + 11086 => 'Books|Kids', + 11087 => 'Books|Kids|Animals', + 11088 => 'Books|Kids|Basic Concepts', + 11089 => 'Books|Kids|Basic Concepts|Alphabet', + 11090 => 'Books|Kids|Basic Concepts|Body', + 11091 => 'Books|Kids|Basic Concepts|Colors', + 11092 => 'Books|Kids|Basic Concepts|Counting & Numbers', + 11093 => 'Books|Kids|Basic Concepts|Date & Time', + 11094 => 'Books|Kids|Basic Concepts|General', + 11095 => 'Books|Kids|Basic Concepts|Money', + 11096 => 'Books|Kids|Basic Concepts|Opposites', + 11097 => 'Books|Kids|Basic Concepts|Seasons', + 11098 => 'Books|Kids|Basic Concepts|Senses & Sensation', + 11099 => 'Books|Kids|Basic Concepts|Size & Shape', + 11100 => 'Books|Kids|Basic Concepts|Sounds', + 11101 => 'Books|Kids|Basic Concepts|Words', + 11102 => 'Books|Kids|Biography', + 11103 => 'Books|Kids|Careers & Occupations', + 11104 => 'Books|Kids|Computers & Technology', + 11105 => 'Books|Kids|Cooking & Food', + 11106 => 'Books|Kids|Arts & Entertainment', + 11107 => 'Books|Kids|Arts & Entertainment|Art', + 11108 => 'Books|Kids|Arts & Entertainment|Crafts', + 11109 => 'Books|Kids|Arts & Entertainment|Music', + 11110 => 'Books|Kids|Arts & Entertainment|Performing Arts', + 11111 => 'Books|Kids|Family', + 11112 => 'Books|Kids|Fiction', + 11113 => 'Books|Kids|Fiction|Action & Adventure', + 11114 => 'Books|Kids|Fiction|Animals', + 11115 => 'Books|Kids|Fiction|Classics', + 11116 => 'Books|Kids|Fiction|Comics & Graphic Novels', + 11117 => 'Books|Kids|Fiction|Culture, Places & People', + 11118 => 'Books|Kids|Fiction|Family & Relationships', + 11119 => 'Books|Kids|Fiction|Fantasy', + 11120 => 'Books|Kids|Fiction|Fairy Tales, Myths & Fables', + 11121 => 'Books|Kids|Fiction|Favorite Characters', + 11122 => 'Books|Kids|Fiction|Historical', + 11123 => 'Books|Kids|Fiction|Holidays & Celebrations', + 11124 => 'Books|Kids|Fiction|Monsters & Ghosts', + 11125 => 'Books|Kids|Fiction|Mysteries', + 11126 => 'Books|Kids|Fiction|Nature', + 11127 => 'Books|Kids|Fiction|Religion', + 11128 => 'Books|Kids|Fiction|Sci-Fi', + 11129 => 'Books|Kids|Fiction|Social Issues', + 11130 => 'Books|Kids|Fiction|Sports & Recreation', + 11131 => 'Books|Kids|Fiction|Transportation', + 11132 => 'Books|Kids|Games & Activities', + 11133 => 'Books|Kids|General Nonfiction', + 11134 => 'Books|Kids|Health', + 11135 => 'Books|Kids|History', + 11136 => 'Books|Kids|Holidays & Celebrations', + 11137 => 'Books|Kids|Holidays & Celebrations|Birthdays', + 11138 => 'Books|Kids|Holidays & Celebrations|Christmas & Advent', + 11139 => 'Books|Kids|Holidays & Celebrations|Easter & Lent', + 11140 => 'Books|Kids|Holidays & Celebrations|General', + 11141 => 'Books|Kids|Holidays & Celebrations|Halloween', + 11142 => 'Books|Kids|Holidays & Celebrations|Hanukkah', + 11143 => 'Books|Kids|Holidays & Celebrations|Other', + 11144 => 'Books|Kids|Holidays & Celebrations|Passover', + 11145 => 'Books|Kids|Holidays & Celebrations|Patriotic Holidays', + 11146 => 'Books|Kids|Holidays & Celebrations|Ramadan', + 11147 => 'Books|Kids|Holidays & Celebrations|Thanksgiving', + 11148 => "Books|Kids|Holidays & Celebrations|Valentine's Day", + 11149 => 'Books|Kids|Humor', + 11150 => 'Books|Kids|Humor|Jokes & Riddles', + 11151 => 'Books|Kids|Poetry', + 11152 => 'Books|Kids|Learning to Read', + 11153 => 'Books|Kids|Learning to Read|Chapter Books', + 11154 => 'Books|Kids|Learning to Read|Early Readers', + 11155 => 'Books|Kids|Learning to Read|Intermediate Readers', + 11156 => 'Books|Kids|Nursery Rhymes', + 11157 => 'Books|Kids|Government', + 11158 => 'Books|Kids|Reference', + 11159 => 'Books|Kids|Religion', + 11160 => 'Books|Kids|Science & Nature', + 11161 => 'Books|Kids|Social Issues', + 11162 => 'Books|Kids|Social Studies', + 11163 => 'Books|Kids|Sports & Recreation', + 11164 => 'Books|Kids|Transportation', + 11165 => 'Books|Young Adult', + 11166 => 'Books|Young Adult|Animals', + 11167 => 'Books|Young Adult|Biography', + 11168 => 'Books|Young Adult|Careers & Occupations', + 11169 => 'Books|Young Adult|Computers & Technology', + 11170 => 'Books|Young Adult|Cooking & Food', + 11171 => 'Books|Young Adult|Arts & Entertainment', + 11172 => 'Books|Young Adult|Arts & Entertainment|Art', + 11173 => 'Books|Young Adult|Arts & Entertainment|Crafts', + 11174 => 'Books|Young Adult|Arts & Entertainment|Music', + 11175 => 'Books|Young Adult|Arts & Entertainment|Performing Arts', + 11176 => 'Books|Young Adult|Family', + 11177 => 'Books|Young Adult|Fiction', + 11178 => 'Books|Young Adult|Fiction|Action & Adventure', + 11179 => 'Books|Young Adult|Fiction|Animals', + 11180 => 'Books|Young Adult|Fiction|Classics', + 11181 => 'Books|Young Adult|Fiction|Comics & Graphic Novels', + 11182 => 'Books|Young Adult|Fiction|Culture, Places & People', + 11183 => 'Books|Young Adult|Fiction|Dystopian', + 11184 => 'Books|Young Adult|Fiction|Family & Relationships', + 11185 => 'Books|Young Adult|Fiction|Fantasy', + 11186 => 'Books|Young Adult|Fiction|Fairy Tales, Myths & Fables', + 11187 => 'Books|Young Adult|Fiction|Favorite Characters', + 11188 => 'Books|Young Adult|Fiction|Historical', + 11189 => 'Books|Young Adult|Fiction|Holidays & Celebrations', + 11190 => 'Books|Young Adult|Fiction|Horror, Monsters & Ghosts', + 11191 => 'Books|Young Adult|Fiction|Crime & Mystery', + 11192 => 'Books|Young Adult|Fiction|Nature', + 11193 => 'Books|Young Adult|Fiction|Religion', + 11194 => 'Books|Young Adult|Fiction|Romance', + 11195 => 'Books|Young Adult|Fiction|Sci-Fi', + 11196 => 'Books|Young Adult|Fiction|Coming of Age', + 11197 => 'Books|Young Adult|Fiction|Sports & Recreation', + 11198 => 'Books|Young Adult|Fiction|Transportation', + 11199 => 'Books|Young Adult|Games & Activities', + 11200 => 'Books|Young Adult|General Nonfiction', + 11201 => 'Books|Young Adult|Health', + 11202 => 'Books|Young Adult|History', + 11203 => 'Books|Young Adult|Holidays & Celebrations', + 11204 => 'Books|Young Adult|Holidays & Celebrations|Birthdays', + 11205 => 'Books|Young Adult|Holidays & Celebrations|Christmas & Advent', + 11206 => 'Books|Young Adult|Holidays & Celebrations|Easter & Lent', + 11207 => 'Books|Young Adult|Holidays & Celebrations|General', + 11208 => 'Books|Young Adult|Holidays & Celebrations|Halloween', + 11209 => 'Books|Young Adult|Holidays & Celebrations|Hanukkah', + 11210 => 'Books|Young Adult|Holidays & Celebrations|Other', + 11211 => 'Books|Young Adult|Holidays & Celebrations|Passover', + 11212 => 'Books|Young Adult|Holidays & Celebrations|Patriotic Holidays', + 11213 => 'Books|Young Adult|Holidays & Celebrations|Ramadan', + 11214 => 'Books|Young Adult|Holidays & Celebrations|Thanksgiving', + 11215 => "Books|Young Adult|Holidays & Celebrations|Valentine's Day", + 11216 => 'Books|Young Adult|Humor', + 11217 => 'Books|Young Adult|Humor|Jokes & Riddles', + 11218 => 'Books|Young Adult|Poetry', + 11219 => 'Books|Young Adult|Politics & Government', + 11220 => 'Books|Young Adult|Reference', + 11221 => 'Books|Young Adult|Religion', + 11222 => 'Books|Young Adult|Science & Nature', + 11223 => 'Books|Young Adult|Coming of Age', + 11224 => 'Books|Young Adult|Social Studies', + 11225 => 'Books|Young Adult|Sports & Recreation', + 11226 => 'Books|Young Adult|Transportation', + 11227 => 'Books|Communications & Media', + 11228 => 'Books|Military & Warfare', + 11229 => 'Books|Romance|Inspirational', + 11231 => 'Books|Romance|Holiday', + 11232 => 'Books|Romance|Wholesome', + 11233 => 'Books|Romance|Military', + 11234 => 'Books|Arts & Entertainment|Art History', + 11236 => 'Books|Arts & Entertainment|Design', + 11243 => 'Books|Business & Personal Finance|Accounting', + 11244 => 'Books|Business & Personal Finance|Hospitality', + 11245 => 'Books|Business & Personal Finance|Real Estate', + 11246 => 'Books|Humor|Jokes & Riddles', + 11247 => 'Books|Religion & Spirituality|Comparative Religion', + 11255 => 'Books|Cookbooks, Food & Wine|Culinary Arts', + 11259 => 'Books|Mysteries & Thrillers|Cozy', + 11260 => 'Books|Politics & Current Events|Current Events', + 11261 => 'Books|Politics & Current Events|Foreign Policy & International Relations', + 11262 => 'Books|Politics & Current Events|Local Government', + 11263 => 'Books|Politics & Current Events|National Government', + 11264 => 'Books|Politics & Current Events|Political Science', + 11265 => 'Books|Politics & Current Events|Public Administration', + 11266 => 'Books|Politics & Current Events|World Affairs', + 11273 => 'Books|Nonfiction|Family & Relationships|Family & Childcare', + 11274 => 'Books|Nonfiction|Family & Relationships|Love & Romance', + 11275 => 'Books|Sci-Fi & Fantasy|Fantasy|Urban', + 11276 => 'Books|Reference|Foreign Languages|Arabic', + 11277 => 'Books|Reference|Foreign Languages|Bilingual Editions', + 11278 => 'Books|Reference|Foreign Languages|African Languages', + 11279 => 'Books|Reference|Foreign Languages|Ancient Languages', + 11280 => 'Books|Reference|Foreign Languages|Chinese', + 11281 => 'Books|Reference|Foreign Languages|English', + 11282 => 'Books|Reference|Foreign Languages|French', + 11283 => 'Books|Reference|Foreign Languages|German', + 11284 => 'Books|Reference|Foreign Languages|Hebrew', + 11285 => 'Books|Reference|Foreign Languages|Hindi', + 11286 => 'Books|Reference|Foreign Languages|Italian', + 11287 => 'Books|Reference|Foreign Languages|Japanese', + 11288 => 'Books|Reference|Foreign Languages|Korean', + 11289 => 'Books|Reference|Foreign Languages|Linguistics', + 11290 => 'Books|Reference|Foreign Languages|Other Languages', + 11291 => 'Books|Reference|Foreign Languages|Portuguese', + 11292 => 'Books|Reference|Foreign Languages|Russian', + 11293 => 'Books|Reference|Foreign Languages|Spanish', + 11294 => 'Books|Reference|Foreign Languages|Speech Pathology', + 11295 => 'Books|Science & Nature|Mathematics|Advanced Mathematics', + 11296 => 'Books|Science & Nature|Mathematics|Algebra', + 11297 => 'Books|Science & Nature|Mathematics|Arithmetic', + 11298 => 'Books|Science & Nature|Mathematics|Calculus', + 11299 => 'Books|Science & Nature|Mathematics|Geometry', + 11300 => 'Books|Science & Nature|Mathematics|Statistics', + 11301 => 'Books|Professional & Technical|Medical|Veterinary', + 11302 => 'Books|Professional & Technical|Medical|Neuroscience', + 11303 => 'Books|Professional & Technical|Medical|Immunology', + 11304 => 'Books|Professional & Technical|Medical|Nursing', + 11305 => 'Books|Professional & Technical|Medical|Pharmacology & Toxicology', + 11306 => 'Books|Professional & Technical|Medical|Anatomy & Physiology', + 11307 => 'Books|Professional & Technical|Medical|Dentistry', + 11308 => 'Books|Professional & Technical|Medical|Emergency Medicine', + 11309 => 'Books|Professional & Technical|Medical|Genetics', + 11310 => 'Books|Professional & Technical|Medical|Psychiatry', + 11311 => 'Books|Professional & Technical|Medical|Radiology', + 11312 => 'Books|Professional & Technical|Medical|Alternative Medicine', + 11317 => 'Books|Nonfiction|Philosophy|Political Philosophy', + 11319 => 'Books|Nonfiction|Philosophy|Philosophy of Language', + 11320 => 'Books|Nonfiction|Philosophy|Philosophy of Religion', + 11327 => 'Books|Nonfiction|Social Science|Sociology', + 11329 => 'Books|Professional & Technical|Engineering|Aeronautics', + 11330 => 'Books|Professional & Technical|Engineering|Chemical & Petroleum Engineering', + 11331 => 'Books|Professional & Technical|Engineering|Civil Engineering', + 11332 => 'Books|Professional & Technical|Engineering|Computer Science', + 11333 => 'Books|Professional & Technical|Engineering|Electrical Engineering', + 11334 => 'Books|Professional & Technical|Engineering|Environmental Engineering', + 11335 => 'Books|Professional & Technical|Engineering|Mechanical Engineering', + 11336 => 'Books|Professional & Technical|Engineering|Power Resources', + 11337 => 'Books|Comics & Graphic Novels|Manga|Boys', + 11338 => 'Books|Comics & Graphic Novels|Manga|Men', + 11339 => 'Books|Comics & Graphic Novels|Manga|Girls', + 11340 => 'Books|Comics & Graphic Novels|Manga|Women', + 11341 => 'Books|Comics & Graphic Novels|Manga|Other', + 11342 => 'Books|Comics & Graphic Novels|Manga|Yaoi', + 11343 => 'Books|Comics & Graphic Novels|Manga|Comic Essays', + 12001 => 'Mac App Store|Business', + 12002 => 'Mac App Store|Developer Tools', + 12003 => 'Mac App Store|Education', + 12004 => 'Mac App Store|Entertainment', + 12005 => 'Mac App Store|Finance', + 12006 => 'Mac App Store|Games', + 12007 => 'Mac App Store|Health & Fitness', + 12008 => 'Mac App Store|Lifestyle', + 12010 => 'Mac App Store|Medical', + 12011 => 'Mac App Store|Music', + 12012 => 'Mac App Store|News', + 12013 => 'Mac App Store|Photography', + 12014 => 'Mac App Store|Productivity', + 12015 => 'Mac App Store|Reference', + 12016 => 'Mac App Store|Social Networking', + 12017 => 'Mac App Store|Sports', + 12018 => 'Mac App Store|Travel', + 12019 => 'Mac App Store|Utilities', + 12020 => 'Mac App Store|Video', + 12021 => 'Mac App Store|Weather', + 12022 => 'Mac App Store|Graphics & Design', + 12201 => 'Mac App Store|Games|Action', + 12202 => 'Mac App Store|Games|Adventure', + 12203 => 'Mac App Store|Games|Casual', + 12204 => 'Mac App Store|Games|Board', + 12205 => 'Mac App Store|Games|Card', + 12206 => 'Mac App Store|Games|Casino', + 12207 => 'Mac App Store|Games|Dice', + 12208 => 'Mac App Store|Games|Educational', + 12209 => 'Mac App Store|Games|Family', + 12210 => 'Mac App Store|Games|Kids', + 12211 => 'Mac App Store|Games|Music', + 12212 => 'Mac App Store|Games|Puzzle', + 12213 => 'Mac App Store|Games|Racing', + 12214 => 'Mac App Store|Games|Role Playing', + 12215 => 'Mac App Store|Games|Simulation', + 12216 => 'Mac App Store|Games|Sports', + 12217 => 'Mac App Store|Games|Strategy', + 12218 => 'Mac App Store|Games|Trivia', + 12219 => 'Mac App Store|Games|Word', + 13001 => 'App Store|Magazines & Newspapers|News & Politics', + 13002 => 'App Store|Magazines & Newspapers|Fashion & Style', + 13003 => 'App Store|Magazines & Newspapers|Home & Garden', + 13004 => 'App Store|Magazines & Newspapers|Outdoors & Nature', + 13005 => 'App Store|Magazines & Newspapers|Sports & Leisure', + 13006 => 'App Store|Magazines & Newspapers|Automotive', + 13007 => 'App Store|Magazines & Newspapers|Arts & Photography', + 13008 => 'App Store|Magazines & Newspapers|Brides & Weddings', + 13009 => 'App Store|Magazines & Newspapers|Business & Investing', + 13010 => "App Store|Magazines & Newspapers|Children's Magazines", + 13011 => 'App Store|Magazines & Newspapers|Computers & Internet', + 13012 => 'App Store|Magazines & Newspapers|Cooking, Food & Drink', + 13013 => 'App Store|Magazines & Newspapers|Crafts & Hobbies', + 13014 => 'App Store|Magazines & Newspapers|Electronics & Audio', + 13015 => 'App Store|Magazines & Newspapers|Entertainment', + 13017 => 'App Store|Magazines & Newspapers|Health, Mind & Body', + 13018 => 'App Store|Magazines & Newspapers|History', + 13019 => 'App Store|Magazines & Newspapers|Literary Magazines & Journals', + 13020 => "App Store|Magazines & Newspapers|Men's Interest", + 13021 => 'App Store|Magazines & Newspapers|Movies & Music', + 13023 => 'App Store|Magazines & Newspapers|Parenting & Family', + 13024 => 'App Store|Magazines & Newspapers|Pets', + 13025 => 'App Store|Magazines & Newspapers|Professional & Trade', + 13026 => 'App Store|Magazines & Newspapers|Regional News', + 13027 => 'App Store|Magazines & Newspapers|Science', + 13028 => 'App Store|Magazines & Newspapers|Teens', + 13029 => 'App Store|Magazines & Newspapers|Travel & Regional', + 13030 => "App Store|Magazines & Newspapers|Women's Interest", + 15000 => 'Textbooks|Arts & Entertainment', + 15001 => 'Textbooks|Arts & Entertainment|Art & Architecture', + 15002 => 'Textbooks|Arts & Entertainment|Art & Architecture|Urban Planning', + 15003 => 'Textbooks|Arts & Entertainment|Art History', + 15004 => 'Textbooks|Arts & Entertainment|Dance', + 15005 => 'Textbooks|Arts & Entertainment|Design', + 15006 => 'Textbooks|Arts & Entertainment|Fashion', + 15007 => 'Textbooks|Arts & Entertainment|Film', + 15008 => 'Textbooks|Arts & Entertainment|Games', + 15009 => 'Textbooks|Arts & Entertainment|Interior Design', + 15010 => 'Textbooks|Arts & Entertainment|Media Arts', + 15011 => 'Textbooks|Arts & Entertainment|Music', + 15012 => 'Textbooks|Arts & Entertainment|Performing Arts', + 15013 => 'Textbooks|Arts & Entertainment|Photography', + 15014 => 'Textbooks|Arts & Entertainment|Theater', + 15015 => 'Textbooks|Arts & Entertainment|TV', + 15016 => 'Textbooks|Arts & Entertainment|Visual Arts', + 15017 => 'Textbooks|Biographies & Memoirs', + 15018 => 'Textbooks|Business & Personal Finance', + 15019 => 'Textbooks|Business & Personal Finance|Accounting', + 15020 => 'Textbooks|Business & Personal Finance|Careers', + 15021 => 'Textbooks|Business & Personal Finance|Economics', + 15022 => 'Textbooks|Business & Personal Finance|Finance', + 15023 => 'Textbooks|Business & Personal Finance|Hospitality', + 15024 => 'Textbooks|Business & Personal Finance|Industries & Professions', + 15025 => 'Textbooks|Business & Personal Finance|Investing', + 15026 => 'Textbooks|Business & Personal Finance|Management & Leadership', + 15027 => 'Textbooks|Business & Personal Finance|Marketing & Sales', + 15028 => 'Textbooks|Business & Personal Finance|Personal Finance', + 15029 => 'Textbooks|Business & Personal Finance|Real Estate', + 15030 => 'Textbooks|Business & Personal Finance|Reference', + 15031 => 'Textbooks|Business & Personal Finance|Small Business & Entrepreneurship', + 15032 => 'Textbooks|Children & Teens', + 15033 => 'Textbooks|Children & Teens|Fiction', + 15034 => 'Textbooks|Children & Teens|Nonfiction', + 15035 => 'Textbooks|Comics & Graphic Novels', + 15036 => 'Textbooks|Comics & Graphic Novels|Graphic Novels', + 15037 => 'Textbooks|Comics & Graphic Novels|Manga', + 15038 => 'Textbooks|Communications & Media', + 15039 => 'Textbooks|Communications & Media|Broadcasting', + 15040 => 'Textbooks|Communications & Media|Digital Media', + 15041 => 'Textbooks|Communications & Media|Journalism', + 15042 => 'Textbooks|Communications & Media|Photojournalism', + 15043 => 'Textbooks|Communications & Media|Print', + 15044 => 'Textbooks|Communications & Media|Speech', + 15045 => 'Textbooks|Communications & Media|Writing', + 15046 => 'Textbooks|Computers & Internet', + 15047 => 'Textbooks|Computers & Internet|Computers', + 15048 => 'Textbooks|Computers & Internet|Databases', + 15049 => 'Textbooks|Computers & Internet|Digital Media', + 15050 => 'Textbooks|Computers & Internet|Internet', + 15051 => 'Textbooks|Computers & Internet|Network', + 15052 => 'Textbooks|Computers & Internet|Operating Systems', + 15053 => 'Textbooks|Computers & Internet|Programming', + 15054 => 'Textbooks|Computers & Internet|Software', + 15055 => 'Textbooks|Computers & Internet|System Administration', + 15056 => 'Textbooks|Cookbooks, Food & Wine', + 15057 => 'Textbooks|Cookbooks, Food & Wine|Beverages', + 15058 => 'Textbooks|Cookbooks, Food & Wine|Courses & Dishes', + 15059 => 'Textbooks|Cookbooks, Food & Wine|Culinary Arts', + 15060 => 'Textbooks|Cookbooks, Food & Wine|Methods', + 15061 => 'Textbooks|Cookbooks, Food & Wine|Reference', + 15062 => 'Textbooks|Cookbooks, Food & Wine|Regional & Ethnic', + 15063 => 'Textbooks|Cookbooks, Food & Wine|Special Diet', + 15064 => 'Textbooks|Cookbooks, Food & Wine|Special Occasions', + 15065 => 'Textbooks|Cookbooks, Food & Wine|Specific Ingredients', + 15066 => 'Textbooks|Engineering', + 15067 => 'Textbooks|Engineering|Aeronautics', + 15068 => 'Textbooks|Engineering|Chemical & Petroleum Engineering', + 15069 => 'Textbooks|Engineering|Civil Engineering', + 15070 => 'Textbooks|Engineering|Computer Science', + 15071 => 'Textbooks|Engineering|Electrical Engineering', + 15072 => 'Textbooks|Engineering|Environmental Engineering', + 15073 => 'Textbooks|Engineering|Mechanical Engineering', + 15074 => 'Textbooks|Engineering|Power Resources', + 15075 => 'Textbooks|Fiction & Literature', + 15076 => 'Textbooks|Fiction & Literature|Latino', + 15077 => 'Textbooks|Fiction & Literature|Action & Adventure', + 15078 => 'Textbooks|Fiction & Literature|African American', + 15079 => 'Textbooks|Fiction & Literature|Anthologies', + 15080 => 'Textbooks|Fiction & Literature|Classics', + 15081 => 'Textbooks|Fiction & Literature|Comparative Literature', + 15082 => 'Textbooks|Fiction & Literature|Erotica', + 15083 => 'Textbooks|Fiction & Literature|Gay', + 15084 => 'Textbooks|Fiction & Literature|Ghost', + 15085 => 'Textbooks|Fiction & Literature|Historical', + 15086 => 'Textbooks|Fiction & Literature|Horror', + 15087 => 'Textbooks|Fiction & Literature|Literary', + 15088 => 'Textbooks|Fiction & Literature|Literary Criticism', + 15089 => 'Textbooks|Fiction & Literature|Poetry', + 15090 => 'Textbooks|Fiction & Literature|Religious', + 15091 => 'Textbooks|Fiction & Literature|Short Stories', + 15092 => 'Textbooks|Health, Mind & Body', + 15093 => 'Textbooks|Health, Mind & Body|Fitness', + 15094 => 'Textbooks|Health, Mind & Body|Self-Improvement', + 15095 => 'Textbooks|History', + 15096 => 'Textbooks|History|Africa', + 15097 => 'Textbooks|History|Americas', + 15098 => 'Textbooks|History|Americas|Canada', + 15099 => 'Textbooks|History|Americas|Latin America', + 15100 => 'Textbooks|History|Americas|United States', + 15101 => 'Textbooks|History|Ancient', + 15102 => 'Textbooks|History|Asia', + 15103 => 'Textbooks|History|Australia & Oceania', + 15104 => 'Textbooks|History|Europe', + 15105 => 'Textbooks|History|Middle East', + 15106 => 'Textbooks|History|Military', + 15107 => 'Textbooks|History|World', + 15108 => 'Textbooks|Humor', + 15109 => 'Textbooks|Language Studies', + 15110 => 'Textbooks|Language Studies|African Languages', + 15111 => 'Textbooks|Language Studies|Ancient Languages', + 15112 => 'Textbooks|Language Studies|Arabic', + 15113 => 'Textbooks|Language Studies|Bilingual Editions', + 15114 => 'Textbooks|Language Studies|Chinese', + 15115 => 'Textbooks|Language Studies|English', + 15116 => 'Textbooks|Language Studies|French', + 15117 => 'Textbooks|Language Studies|German', + 15118 => 'Textbooks|Language Studies|Hebrew', + 15119 => 'Textbooks|Language Studies|Hindi', + 15120 => 'Textbooks|Language Studies|Indigenous Languages', + 15121 => 'Textbooks|Language Studies|Italian', + 15122 => 'Textbooks|Language Studies|Japanese', + 15123 => 'Textbooks|Language Studies|Korean', + 15124 => 'Textbooks|Language Studies|Linguistics', + 15125 => 'Textbooks|Language Studies|Other Language', + 15126 => 'Textbooks|Language Studies|Portuguese', + 15127 => 'Textbooks|Language Studies|Russian', + 15128 => 'Textbooks|Language Studies|Spanish', + 15129 => 'Textbooks|Language Studies|Speech Pathology', + 15130 => 'Textbooks|Lifestyle & Home', + 15131 => 'Textbooks|Lifestyle & Home|Antiques & Collectibles', + 15132 => 'Textbooks|Lifestyle & Home|Crafts & Hobbies', + 15133 => 'Textbooks|Lifestyle & Home|Gardening', + 15134 => 'Textbooks|Lifestyle & Home|Pets', + 15135 => 'Textbooks|Mathematics', + 15136 => 'Textbooks|Mathematics|Advanced Mathematics', + 15137 => 'Textbooks|Mathematics|Algebra', + 15138 => 'Textbooks|Mathematics|Arithmetic', + 15139 => 'Textbooks|Mathematics|Calculus', + 15140 => 'Textbooks|Mathematics|Geometry', + 15141 => 'Textbooks|Mathematics|Statistics', + 15142 => 'Textbooks|Medicine', + 15143 => 'Textbooks|Medicine|Anatomy & Physiology', + 15144 => 'Textbooks|Medicine|Dentistry', + 15145 => 'Textbooks|Medicine|Emergency Medicine', + 15146 => 'Textbooks|Medicine|Genetics', + 15147 => 'Textbooks|Medicine|Immunology', + 15148 => 'Textbooks|Medicine|Neuroscience', + 15149 => 'Textbooks|Medicine|Nursing', + 15150 => 'Textbooks|Medicine|Pharmacology & Toxicology', + 15151 => 'Textbooks|Medicine|Psychiatry', + 15152 => 'Textbooks|Medicine|Psychology', + 15153 => 'Textbooks|Medicine|Radiology', + 15154 => 'Textbooks|Medicine|Veterinary', + 15155 => 'Textbooks|Mysteries & Thrillers', + 15156 => 'Textbooks|Mysteries & Thrillers|British Detectives', + 15157 => 'Textbooks|Mysteries & Thrillers|Hard-Boiled', + 15158 => 'Textbooks|Mysteries & Thrillers|Historical', + 15159 => 'Textbooks|Mysteries & Thrillers|Police Procedural', + 15160 => 'Textbooks|Mysteries & Thrillers|Short Stories', + 15161 => 'Textbooks|Mysteries & Thrillers|Women Sleuths', + 15162 => 'Textbooks|Nonfiction', + 15163 => 'Textbooks|Nonfiction|Family & Relationships', + 15164 => 'Textbooks|Nonfiction|Transportation', + 15165 => 'Textbooks|Nonfiction|True Crime', + 15166 => 'Textbooks|Parenting', + 15167 => 'Textbooks|Philosophy', + 15168 => 'Textbooks|Philosophy|Aesthetics', + 15169 => 'Textbooks|Philosophy|Epistemology', + 15170 => 'Textbooks|Philosophy|Ethics', + 15171 => 'Textbooks|Philosophy|Philosophy of Language', + 15172 => 'Textbooks|Philosophy|Logic', + 15173 => 'Textbooks|Philosophy|Metaphysics', + 15174 => 'Textbooks|Philosophy|Political Philosophy', + 15175 => 'Textbooks|Philosophy|Philosophy of Religion', + 15176 => 'Textbooks|Politics & Current Events', + 15177 => 'Textbooks|Politics & Current Events|Current Events', + 15178 => 'Textbooks|Politics & Current Events|Foreign Policy & International Relations', + 15179 => 'Textbooks|Politics & Current Events|Local Governments', + 15180 => 'Textbooks|Politics & Current Events|National Governments', + 15181 => 'Textbooks|Politics & Current Events|Political Science', + 15182 => 'Textbooks|Politics & Current Events|Public Administration', + 15183 => 'Textbooks|Politics & Current Events|World Affairs', + 15184 => 'Textbooks|Professional & Technical', + 15185 => 'Textbooks|Professional & Technical|Design', + 15186 => 'Textbooks|Professional & Technical|Language Arts & Disciplines', + 15187 => 'Textbooks|Professional & Technical|Engineering', + 15188 => 'Textbooks|Professional & Technical|Law', + 15189 => 'Textbooks|Professional & Technical|Medical', + 15190 => 'Textbooks|Reference', + 15191 => 'Textbooks|Reference|Almanacs & Yearbooks', + 15192 => 'Textbooks|Reference|Atlases & Maps', + 15193 => 'Textbooks|Reference|Catalogs & Directories', + 15194 => 'Textbooks|Reference|Consumer Guides', + 15195 => 'Textbooks|Reference|Dictionaries & Thesauruses', + 15196 => 'Textbooks|Reference|Encyclopedias', + 15197 => 'Textbooks|Reference|Etiquette', + 15198 => 'Textbooks|Reference|Quotations', + 15199 => 'Textbooks|Reference|Study Aids', + 15200 => 'Textbooks|Reference|Words & Language', + 15201 => 'Textbooks|Reference|Writing', + 15202 => 'Textbooks|Religion & Spirituality', + 15203 => 'Textbooks|Religion & Spirituality|Bible Studies', + 15204 => 'Textbooks|Religion & Spirituality|Bibles', + 15205 => 'Textbooks|Religion & Spirituality|Buddhism', + 15206 => 'Textbooks|Religion & Spirituality|Christianity', + 15207 => 'Textbooks|Religion & Spirituality|Comparative Religion', + 15208 => 'Textbooks|Religion & Spirituality|Hinduism', + 15209 => 'Textbooks|Religion & Spirituality|Islam', + 15210 => 'Textbooks|Religion & Spirituality|Judaism', + 15211 => 'Textbooks|Religion & Spirituality|Spirituality', + 15212 => 'Textbooks|Romance', + 15213 => 'Textbooks|Romance|Contemporary', + 15214 => 'Textbooks|Romance|Erotic Romance', + 15215 => 'Textbooks|Romance|Paranormal', + 15216 => 'Textbooks|Romance|Historical', + 15217 => 'Textbooks|Romance|Short Stories', + 15218 => 'Textbooks|Romance|Suspense', + 15219 => 'Textbooks|Romance|Western', + 15220 => 'Textbooks|Sci-Fi & Fantasy', + 15221 => 'Textbooks|Sci-Fi & Fantasy|Fantasy', + 15222 => 'Textbooks|Sci-Fi & Fantasy|Fantasy|Contemporary', + 15223 => 'Textbooks|Sci-Fi & Fantasy|Fantasy|Epic', + 15224 => 'Textbooks|Sci-Fi & Fantasy|Fantasy|Historical', + 15225 => 'Textbooks|Sci-Fi & Fantasy|Fantasy|Paranormal', + 15226 => 'Textbooks|Sci-Fi & Fantasy|Fantasy|Short Stories', + 15227 => 'Textbooks|Sci-Fi & Fantasy|Science Fiction', + 15228 => 'Textbooks|Sci-Fi & Fantasy|Science Fiction & Literature', + 15229 => 'Textbooks|Sci-Fi & Fantasy|Science Fiction & Literature|Adventure', + 15230 => 'Textbooks|Sci-Fi & Fantasy|Science Fiction & Literature|High Tech', + 15231 => 'Textbooks|Sci-Fi & Fantasy|Science Fiction & Literature|Short Stories', + 15232 => 'Textbooks|Science & Nature', + 15233 => 'Textbooks|Science & Nature|Agriculture', + 15234 => 'Textbooks|Science & Nature|Astronomy', + 15235 => 'Textbooks|Science & Nature|Atmosphere', + 15236 => 'Textbooks|Science & Nature|Biology', + 15237 => 'Textbooks|Science & Nature|Chemistry', + 15238 => 'Textbooks|Science & Nature|Earth Sciences', + 15239 => 'Textbooks|Science & Nature|Ecology', + 15240 => 'Textbooks|Science & Nature|Environment', + 15241 => 'Textbooks|Science & Nature|Essays', + 15242 => 'Textbooks|Science & Nature|Geography', + 15243 => 'Textbooks|Science & Nature|Geology', + 15244 => 'Textbooks|Science & Nature|History', + 15245 => 'Textbooks|Science & Nature|Life Sciences', + 15246 => 'Textbooks|Science & Nature|Nature', + 15247 => 'Textbooks|Science & Nature|Physics', + 15248 => 'Textbooks|Science & Nature|Reference', + 15249 => 'Textbooks|Social Science', + 15250 => 'Textbooks|Social Science|Anthropology', + 15251 => 'Textbooks|Social Science|Archaeology', + 15252 => 'Textbooks|Social Science|Civics', + 15253 => 'Textbooks|Social Science|Government', + 15254 => 'Textbooks|Social Science|Social Studies', + 15255 => 'Textbooks|Social Science|Social Welfare', + 15256 => 'Textbooks|Social Science|Society', + 15257 => 'Textbooks|Social Science|Society|African Studies', + 15258 => 'Textbooks|Social Science|Society|American Studies', + 15259 => 'Textbooks|Social Science|Society|Asia Pacific Studies', + 15260 => 'Textbooks|Social Science|Society|Cross-Cultural Studies', + 15261 => 'Textbooks|Social Science|Society|European Studies', + 15262 => 'Textbooks|Social Science|Society|Immigration & Emigration', + 15263 => 'Textbooks|Social Science|Society|Indigenous Studies', + 15264 => 'Textbooks|Social Science|Society|Latin & Caribbean Studies', + 15265 => 'Textbooks|Social Science|Society|Middle Eastern Studies', + 15266 => 'Textbooks|Social Science|Society|Race & Ethnicity Studies', + 15267 => 'Textbooks|Social Science|Society|Sexuality Studies', + 15268 => "Textbooks|Social Science|Society|Women's Studies", + 15269 => 'Textbooks|Social Science|Sociology', + 15270 => 'Textbooks|Sports & Outdoors', + 15271 => 'Textbooks|Sports & Outdoors|Baseball', + 15272 => 'Textbooks|Sports & Outdoors|Basketball', + 15273 => 'Textbooks|Sports & Outdoors|Coaching', + 15274 => 'Textbooks|Sports & Outdoors|Equestrian', + 15275 => 'Textbooks|Sports & Outdoors|Extreme Sports', + 15276 => 'Textbooks|Sports & Outdoors|Football', + 15277 => 'Textbooks|Sports & Outdoors|Golf', + 15278 => 'Textbooks|Sports & Outdoors|Hockey', + 15279 => 'Textbooks|Sports & Outdoors|Motor Sports', + 15280 => 'Textbooks|Sports & Outdoors|Mountaineering', + 15281 => 'Textbooks|Sports & Outdoors|Outdoors', + 15282 => 'Textbooks|Sports & Outdoors|Racket Sports', + 15283 => 'Textbooks|Sports & Outdoors|Reference', + 15284 => 'Textbooks|Sports & Outdoors|Soccer', + 15285 => 'Textbooks|Sports & Outdoors|Training', + 15286 => 'Textbooks|Sports & Outdoors|Water Sports', + 15287 => 'Textbooks|Sports & Outdoors|Winter Sports', + 15288 => 'Textbooks|Teaching & Learning', + 15289 => 'Textbooks|Teaching & Learning|Adult Education', + 15290 => 'Textbooks|Teaching & Learning|Curriculum & Teaching', + 15291 => 'Textbooks|Teaching & Learning|Educational Leadership', + 15292 => 'Textbooks|Teaching & Learning|Educational Technology', + 15293 => 'Textbooks|Teaching & Learning|Family & Childcare', + 15294 => 'Textbooks|Teaching & Learning|Information & Library Science', + 15295 => 'Textbooks|Teaching & Learning|Learning Resources', + 15296 => 'Textbooks|Teaching & Learning|Psychology & Research', + 15297 => 'Textbooks|Teaching & Learning|Special Education', + 15298 => 'Textbooks|Travel & Adventure', + 15299 => 'Textbooks|Travel & Adventure|Africa', + 15300 => 'Textbooks|Travel & Adventure|Americas', + 15301 => 'Textbooks|Travel & Adventure|Americas|Canada', + 15302 => 'Textbooks|Travel & Adventure|Americas|Latin America', + 15303 => 'Textbooks|Travel & Adventure|Americas|United States', + 15304 => 'Textbooks|Travel & Adventure|Asia', + 15305 => 'Textbooks|Travel & Adventure|Caribbean', + 15306 => 'Textbooks|Travel & Adventure|Essays & Memoirs', + 15307 => 'Textbooks|Travel & Adventure|Europe', + 15308 => 'Textbooks|Travel & Adventure|Middle East', + 15309 => 'Textbooks|Travel & Adventure|Oceania', + 15310 => 'Textbooks|Travel & Adventure|Specialty Travel', + 15311 => 'Textbooks|Comics & Graphic Novels|Comics', + 15312 => 'Textbooks|Reference|Manuals', + 16001 => 'App Store|Stickers|Emoji & Expressions', + 16003 => 'App Store|Stickers|Animals & Nature', + 16005 => 'App Store|Stickers|Art', + 16006 => 'App Store|Stickers|Celebrations', + 16007 => 'App Store|Stickers|Celebrities', + 16008 => 'App Store|Stickers|Comics & Cartoons', + 16009 => 'App Store|Stickers|Eating & Drinking', + 16010 => 'App Store|Stickers|Gaming', + 16014 => 'App Store|Stickers|Movies & TV', + 16015 => 'App Store|Stickers|Music', + 16017 => 'App Store|Stickers|People', + 16019 => 'App Store|Stickers|Places & Objects', + 16021 => 'App Store|Stickers|Sports & Activities', + 16025 => 'App Store|Stickers|Kids & Family', + 16026 => 'App Store|Stickers|Fashion', + 100000 => 'Music|Christian & Gospel', + 100001 => 'Music|Classical|Art Song', + 100002 => 'Music|Classical|Brass & Woodwinds', + 100003 => 'Music|Classical|Solo Instrumental', + 100004 => 'Music|Classical|Contemporary Era', + 100005 => 'Music|Classical|Oratorio', + 100006 => 'Music|Classical|Cantata', + 100007 => 'Music|Classical|Electronic', + 100008 => 'Music|Classical|Sacred', + 100009 => 'Music|Classical|Guitar', + 100010 => 'Music|Classical|Piano', + 100011 => 'Music|Classical|Violin', + 100012 => 'Music|Classical|Cello', + 100013 => 'Music|Classical|Percussion', + 100014 => 'Music|Electronic|Dubstep', + 100015 => 'Music|Electronic|Bass', + 100016 => 'Music|Hip-Hop/Rap|UK Hip-Hop', + 100017 => 'Music|Reggae|Lovers Rock', + 100018 => 'Music|Alternative|EMO', + 100019 => 'Music|Alternative|Pop Punk', + 100020 => 'Music|Alternative|Indie Pop', + 100021 => 'Music|New Age|Yoga', + 100022 => 'Music|Pop|Tribute', + 100023 => 'Music|Pop|Shows', + 100024 => 'Music|Cuban', + 100025 => 'Music|Cuban|Mambo', + 100026 => 'Music|Cuban|Chachacha', + 100027 => 'Music|Cuban|Guajira', + 100028 => 'Music|Cuban|Son', + 100029 => 'Music|Cuban|Bolero', + 100030 => 'Music|Cuban|Guaracha', + 100031 => 'Music|Cuban|Timba', + 100032 => 'Music|Soundtrack|Video Game', + 100033 => 'Music|Indian|Regional Indian|Punjabi|Punjabi Pop', + 100034 => 'Music|Indian|Regional Indian|Bengali|Rabindra Sangeet', + 100035 => 'Music|Indian|Regional Indian|Malayalam', + 100036 => 'Music|Indian|Regional Indian|Kannada', + 100037 => 'Music|Indian|Regional Indian|Marathi', + 100038 => 'Music|Indian|Regional Indian|Gujarati', + 100039 => 'Music|Indian|Regional Indian|Assamese', + 100040 => 'Music|Indian|Regional Indian|Bhojpuri', + 100041 => 'Music|Indian|Regional Indian|Haryanvi', + 100042 => 'Music|Indian|Regional Indian|Odia', + 100043 => 'Music|Indian|Regional Indian|Rajasthani', + 100044 => 'Music|Indian|Regional Indian|Urdu', + 100045 => 'Music|Indian|Regional Indian|Punjabi', + 100046 => 'Music|Indian|Regional Indian|Bengali', + 100047 => 'Music|Indian|Indian Classical|Carnatic Classical', + 100048 => 'Music|Indian|Indian Classical|Hindustani Classical', + 100049 => 'Music|African|Afro House', + 100050 => 'Music|African|Afro Soul', + 100051 => 'Music|African|Afrobeats', + 100052 => 'Music|African|Benga', + 100053 => 'Music|African|Bongo-Flava', + 100054 => 'Music|African|Coupe-Decale', + 100055 => 'Music|African|Gqom', + 100056 => 'Music|African|Highlife', + 100057 => 'Music|African|Kuduro', + 100058 => 'Music|African|Kizomba', + 100059 => 'Music|African|Kwaito', + 100060 => 'Music|African|Mbalax', + 100061 => 'Music|African|Ndombolo', + 100062 => 'Music|African|Shangaan Electro', + 100063 => 'Music|African|Soukous', + 100064 => 'Music|African|Taarab', + 100065 => 'Music|African|Zouglou', + 100066 => 'Music|Turkish|Ozgun', + 100067 => 'Music|Turkish|Fantezi', + 100068 => 'Music|Turkish|Religious', + 100069 => 'Music|Pop|Turkish Pop', + 100070 => 'Music|Rock|Turkish Rock', + 100071 => 'Music|Alternative|Turkish Alternative', + 100072 => 'Music|Hip-Hop/Rap|Turkish Hip-Hop/Rap', + 100073 => 'Music|African|Maskandi', + 100074 => 'Music|Russian|Russian Romance', + 100075 => 'Music|Russian|Russian Bard', + 100076 => 'Music|Russian|Russian Pop', + 100077 => 'Music|Russian|Russian Rock', + 100078 => 'Music|Russian|Russian Hip-Hop', + 100079 => 'Music|Arabic|Levant', + 100080 => 'Music|Arabic|Levant|Dabke', + 100081 => 'Music|Arabic|Maghreb Rai', + 100082 => 'Music|Arabic|Khaleeji|Khaleeji Jalsat', + 100083 => 'Music|Arabic|Khaleeji|Khaleeji Shailat', + 100084 => 'Music|Tarab', + 100085 => 'Music|Tarab|Iraqi Tarab', + 100086 => 'Music|Tarab|Egyptian Tarab', + 100087 => 'Music|Tarab|Khaleeji Tarab', + 100088 => 'Music|Pop|Levant Pop', + 100089 => 'Music|Pop|Iraqi Pop', + 100090 => 'Music|Pop|Egyptian Pop', + 100091 => 'Music|Pop|Maghreb Pop', + 100092 => 'Music|Pop|Khaleeji Pop', + 100093 => 'Music|Hip-Hop/Rap|Levant Hip-Hop', + 100094 => 'Music|Hip-Hop/Rap|Egyptian Hip-Hop', + 100095 => 'Music|Hip-Hop/Rap|Maghreb Hip-Hop', + 100096 => 'Music|Hip-Hop/Rap|Khaleeji Hip-Hop', + 100097 => 'Music|Alternative|Indie Levant', + 100098 => 'Music|Alternative|Indie Egyptian', + 100099 => 'Music|Alternative|Indie Maghreb', + 100100 => 'Music|Electronic|Levant Electronic', + 100101 => "Music|Electronic|Electro-Cha'abi", + 100102 => 'Music|Electronic|Maghreb Electronic', + 100103 => 'Music|Folk|Iraqi Folk', + 100104 => 'Music|Folk|Khaleeji Folk', + 100105 => 'Music|Dance|Maghreb Dance', + 40000000 => 'iTunes U', + 40000001 => 'iTunes U|Business & Economics', + 40000002 => 'iTunes U|Business & Economics|Economics', + 40000003 => 'iTunes U|Business & Economics|Finance', + 40000004 => 'iTunes U|Business & Economics|Hospitality', + 40000005 => 'iTunes U|Business & Economics|Management', + 40000006 => 'iTunes U|Business & Economics|Marketing', + 40000007 => 'iTunes U|Business & Economics|Personal Finance', + 40000008 => 'iTunes U|Business & Economics|Real Estate', + 40000009 => 'iTunes U|Engineering', + 40000010 => 'iTunes U|Engineering|Chemical & Petroleum Engineering', + 40000011 => 'iTunes U|Engineering|Civil Engineering', + 40000012 => 'iTunes U|Engineering|Computer Science', + 40000013 => 'iTunes U|Engineering|Electrical Engineering', + 40000014 => 'iTunes U|Engineering|Environmental Engineering', + 40000015 => 'iTunes U|Engineering|Mechanical Engineering', + 40000016 => 'iTunes U|Music, Art, & Design', + 40000017 => 'iTunes U|Music, Art, & Design|Architecture', + 40000019 => 'iTunes U|Music, Art, & Design|Art History', + 40000020 => 'iTunes U|Music, Art, & Design|Dance', + 40000021 => 'iTunes U|Music, Art, & Design|Film', + 40000022 => 'iTunes U|Music, Art, & Design|Design', + 40000023 => 'iTunes U|Music, Art, & Design|Interior Design', + 40000024 => 'iTunes U|Music, Art, & Design|Music', + 40000025 => 'iTunes U|Music, Art, & Design|Theater', + 40000026 => 'iTunes U|Health & Medicine', + 40000027 => 'iTunes U|Health & Medicine|Anatomy & Physiology', + 40000028 => 'iTunes U|Health & Medicine|Behavioral Science', + 40000029 => 'iTunes U|Health & Medicine|Dentistry', + 40000030 => 'iTunes U|Health & Medicine|Diet & Nutrition', + 40000031 => 'iTunes U|Health & Medicine|Emergency Medicine', + 40000032 => 'iTunes U|Health & Medicine|Genetics', + 40000033 => 'iTunes U|Health & Medicine|Gerontology', + 40000034 => 'iTunes U|Health & Medicine|Health & Exercise Science', + 40000035 => 'iTunes U|Health & Medicine|Immunology', + 40000036 => 'iTunes U|Health & Medicine|Neuroscience', + 40000037 => 'iTunes U|Health & Medicine|Pharmacology & Toxicology', + 40000038 => 'iTunes U|Health & Medicine|Psychiatry', + 40000039 => 'iTunes U|Health & Medicine|Global Health', + 40000040 => 'iTunes U|Health & Medicine|Radiology', + 40000041 => 'iTunes U|History', + 40000042 => 'iTunes U|History|Ancient History', + 40000043 => 'iTunes U|History|Medieval History', + 40000044 => 'iTunes U|History|Military History', + 40000045 => 'iTunes U|History|Modern History', + 40000046 => 'iTunes U|History|African History', + 40000047 => 'iTunes U|History|Asia-Pacific History', + 40000048 => 'iTunes U|History|European History', + 40000049 => 'iTunes U|History|Middle Eastern History', + 40000050 => 'iTunes U|History|North American History', + 40000051 => 'iTunes U|History|South American History', + 40000053 => 'iTunes U|Communications & Journalism', + 40000054 => 'iTunes U|Philosophy', + 40000055 => 'iTunes U|Religion & Spirituality', + 40000056 => 'iTunes U|Languages', + 40000057 => 'iTunes U|Languages|African Languages', + 40000058 => 'iTunes U|Languages|Ancient Languages', + 40000061 => 'iTunes U|Languages|English', + 40000063 => 'iTunes U|Languages|French', + 40000064 => 'iTunes U|Languages|German', + 40000065 => 'iTunes U|Languages|Italian', + 40000066 => 'iTunes U|Languages|Linguistics', + 40000068 => 'iTunes U|Languages|Spanish', + 40000069 => 'iTunes U|Languages|Speech Pathology', + 40000070 => 'iTunes U|Writing & Literature', + 40000071 => 'iTunes U|Writing & Literature|Anthologies', + 40000072 => 'iTunes U|Writing & Literature|Biography', + 40000073 => 'iTunes U|Writing & Literature|Classics', + 40000074 => 'iTunes U|Writing & Literature|Literary Criticism', + 40000075 => 'iTunes U|Writing & Literature|Fiction', + 40000076 => 'iTunes U|Writing & Literature|Poetry', + 40000077 => 'iTunes U|Mathematics', + 40000078 => 'iTunes U|Mathematics|Advanced Mathematics', + 40000079 => 'iTunes U|Mathematics|Algebra', + 40000080 => 'iTunes U|Mathematics|Arithmetic', + 40000081 => 'iTunes U|Mathematics|Calculus', + 40000082 => 'iTunes U|Mathematics|Geometry', + 40000083 => 'iTunes U|Mathematics|Statistics', + 40000084 => 'iTunes U|Science', + 40000085 => 'iTunes U|Science|Agricultural', + 40000086 => 'iTunes U|Science|Astronomy', + 40000087 => 'iTunes U|Science|Atmosphere', + 40000088 => 'iTunes U|Science|Biology', + 40000089 => 'iTunes U|Science|Chemistry', + 40000090 => 'iTunes U|Science|Ecology', + 40000091 => 'iTunes U|Science|Geography', + 40000092 => 'iTunes U|Science|Geology', + 40000093 => 'iTunes U|Science|Physics', + 40000094 => 'iTunes U|Social Science', + 40000095 => 'iTunes U|Law & Politics|Law', + 40000096 => 'iTunes U|Law & Politics|Political Science', + 40000097 => 'iTunes U|Law & Politics|Public Administration', + 40000098 => 'iTunes U|Social Science|Psychology', + 40000099 => 'iTunes U|Social Science|Social Welfare', + 40000100 => 'iTunes U|Social Science|Sociology', + 40000101 => 'iTunes U|Society', + 40000103 => 'iTunes U|Society|Asia Pacific Studies', + 40000104 => 'iTunes U|Society|European Studies', + 40000105 => 'iTunes U|Society|Indigenous Studies', + 40000106 => 'iTunes U|Society|Latin & Caribbean Studies', + 40000107 => 'iTunes U|Society|Middle Eastern Studies', + 40000108 => "iTunes U|Society|Women's Studies", + 40000109 => 'iTunes U|Teaching & Learning', + 40000110 => 'iTunes U|Teaching & Learning|Curriculum & Teaching', + 40000111 => 'iTunes U|Teaching & Learning|Educational Leadership', + 40000112 => 'iTunes U|Teaching & Learning|Family & Childcare', + 40000113 => 'iTunes U|Teaching & Learning|Learning Resources', + 40000114 => 'iTunes U|Teaching & Learning|Psychology & Research', + 40000115 => 'iTunes U|Teaching & Learning|Special Education', + 40000116 => 'iTunes U|Music, Art, & Design|Culinary Arts', + 40000117 => 'iTunes U|Music, Art, & Design|Fashion', + 40000118 => 'iTunes U|Music, Art, & Design|Media Arts', + 40000119 => 'iTunes U|Music, Art, & Design|Photography', + 40000120 => 'iTunes U|Music, Art, & Design|Visual Art', + 40000121 => 'iTunes U|Business & Economics|Entrepreneurship', + 40000122 => 'iTunes U|Communications & Journalism|Broadcasting', + 40000123 => 'iTunes U|Communications & Journalism|Digital Media', + 40000124 => 'iTunes U|Communications & Journalism|Journalism', + 40000125 => 'iTunes U|Communications & Journalism|Photojournalism', + 40000126 => 'iTunes U|Communications & Journalism|Print', + 40000127 => 'iTunes U|Communications & Journalism|Speech', + 40000128 => 'iTunes U|Communications & Journalism|Writing', + 40000129 => 'iTunes U|Health & Medicine|Nursing', + 40000130 => 'iTunes U|Languages|Arabic', + 40000131 => 'iTunes U|Languages|Chinese', + 40000132 => 'iTunes U|Languages|Hebrew', + 40000133 => 'iTunes U|Languages|Hindi', + 40000134 => 'iTunes U|Languages|Indigenous Languages', + 40000135 => 'iTunes U|Languages|Japanese', + 40000136 => 'iTunes U|Languages|Korean', + 40000137 => 'iTunes U|Languages|Other Languages', + 40000138 => 'iTunes U|Languages|Portuguese', + 40000139 => 'iTunes U|Languages|Russian', + 40000140 => 'iTunes U|Law & Politics', + 40000141 => 'iTunes U|Law & Politics|Foreign Policy & International Relations', + 40000142 => 'iTunes U|Law & Politics|Local Governments', + 40000143 => 'iTunes U|Law & Politics|National Governments', + 40000144 => 'iTunes U|Law & Politics|World Affairs', + 40000145 => 'iTunes U|Writing & Literature|Comparative Literature', + 40000146 => 'iTunes U|Philosophy|Aesthetics', + 40000147 => 'iTunes U|Philosophy|Epistemology', + 40000148 => 'iTunes U|Philosophy|Ethics', + 40000149 => 'iTunes U|Philosophy|Metaphysics', + 40000150 => 'iTunes U|Philosophy|Political Philosophy', + 40000151 => 'iTunes U|Philosophy|Logic', + 40000152 => 'iTunes U|Philosophy|Philosophy of Language', + 40000153 => 'iTunes U|Philosophy|Philosophy of Religion', + 40000154 => 'iTunes U|Social Science|Archaeology', + 40000155 => 'iTunes U|Social Science|Anthropology', + 40000156 => 'iTunes U|Religion & Spirituality|Buddhism', + 40000157 => 'iTunes U|Religion & Spirituality|Christianity', + 40000158 => 'iTunes U|Religion & Spirituality|Comparative Religion', + 40000159 => 'iTunes U|Religion & Spirituality|Hinduism', + 40000160 => 'iTunes U|Religion & Spirituality|Islam', + 40000161 => 'iTunes U|Religion & Spirituality|Judaism', + 40000162 => 'iTunes U|Religion & Spirituality|Other Religions', + 40000163 => 'iTunes U|Religion & Spirituality|Spirituality', + 40000164 => 'iTunes U|Science|Environment', + 40000165 => 'iTunes U|Society|African Studies', + 40000166 => 'iTunes U|Society|American Studies', + 40000167 => 'iTunes U|Society|Cross-cultural Studies', + 40000168 => 'iTunes U|Society|Immigration & Emigration', + 40000169 => 'iTunes U|Society|Race & Ethnicity Studies', + 40000170 => 'iTunes U|Society|Sexuality Studies', + 40000171 => 'iTunes U|Teaching & Learning|Educational Technology', + 40000172 => 'iTunes U|Teaching & Learning|Information/Library Science', + 40000173 => 'iTunes U|Languages|Dutch', + 40000174 => 'iTunes U|Languages|Luxembourgish', + 40000175 => 'iTunes U|Languages|Swedish', + 40000176 => 'iTunes U|Languages|Norwegian', + 40000177 => 'iTunes U|Languages|Finnish', + 40000178 => 'iTunes U|Languages|Danish', + 40000179 => 'iTunes U|Languages|Polish', + 40000180 => 'iTunes U|Languages|Turkish', + 40000181 => 'iTunes U|Languages|Flemish', + 50000024 => 'Audiobooks', + 50000040 => 'Audiobooks|Fiction', + 50000041 => 'Audiobooks|Arts & Entertainment', + 50000042 => 'Audiobooks|Biographies & Memoirs', + 50000043 => 'Audiobooks|Business & Personal Finance', + 50000044 => 'Audiobooks|Kids & Young Adults', + 50000045 => 'Audiobooks|Classics', + 50000046 => 'Audiobooks|Comedy', + 50000047 => 'Audiobooks|Drama & Poetry', + 50000048 => 'Audiobooks|Speakers & Storytellers', + 50000049 => 'Audiobooks|History', + 50000050 => 'Audiobooks|Languages', + 50000051 => 'Audiobooks|Mysteries & Thrillers', + 50000052 => 'Audiobooks|Nonfiction', + 50000053 => 'Audiobooks|Religion & Spirituality', + 50000054 => 'Audiobooks|Science & Nature', + 50000055 => 'Audiobooks|Sci Fi & Fantasy', + 50000056 => 'Audiobooks|Self-Development', + 50000057 => 'Audiobooks|Sports & Outdoors', + 50000058 => 'Audiobooks|Technology', + 50000059 => 'Audiobooks|Travel & Adventure', + 50000061 => 'Music|Spoken Word', + 50000063 => 'Music|Disney', + 50000064 => 'Music|French Pop', + 50000066 => 'Music|German Pop', + 50000068 => 'Music|German Folk', + 50000069 => 'Audiobooks|Romance', + 50000070 => 'Audiobooks|Audiobooks Latino', + 50000071 => 'Books|Comics & Graphic Novels|Manga|Action', + 50000072 => 'Books|Comics & Graphic Novels|Manga|Comedy', + 50000073 => 'Books|Comics & Graphic Novels|Manga|Erotica', + 50000074 => 'Books|Comics & Graphic Novels|Manga|Fantasy', + 50000075 => 'Books|Comics & Graphic Novels|Manga|Four Cell Manga', + 50000076 => 'Books|Comics & Graphic Novels|Manga|Gay & Lesbian', + 50000077 => 'Books|Comics & Graphic Novels|Manga|Hard-Boiled', + 50000078 => 'Books|Comics & Graphic Novels|Manga|Heroes', + 50000079 => 'Books|Comics & Graphic Novels|Manga|Historical Fiction', + 50000080 => 'Books|Comics & Graphic Novels|Manga|Mecha', + 50000081 => 'Books|Comics & Graphic Novels|Manga|Mystery', + 50000082 => 'Books|Comics & Graphic Novels|Manga|Nonfiction', + 50000083 => 'Books|Comics & Graphic Novels|Manga|Religious', + 50000084 => 'Books|Comics & Graphic Novels|Manga|Romance', + 50000085 => 'Books|Comics & Graphic Novels|Manga|Romantic Comedy', + 50000086 => 'Books|Comics & Graphic Novels|Manga|Science Fiction', + 50000087 => 'Books|Comics & Graphic Novels|Manga|Sports', + 50000088 => 'Books|Fiction & Literature|Light Novels', + 50000089 => 'Books|Comics & Graphic Novels|Manga|Horror', + 50000090 => 'Books|Comics & Graphic Novels|Comics', + 50000091 => 'Books|Romance|Multicultural', + 50000092 => 'Audiobooks|Erotica', + 50000093 => 'Audiobooks|Light Novels', + }, + }, + grup => { Name => 'Grouping', Avoid => 1 }, #10 + hdvd => { #10 + Name => 'HDVideo', + Format => 'int8u', #24 + Writable => 'int8s', #27 + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + keyw => 'Keyword', #7 + ldes => 'LongDescription', #10 + pcst => { #7 + Name => 'Podcast', + Format => 'int8u', #23 + Writable => 'int8s', #27 + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + perf => 'Performer', + plID => { #10 (or TV season) + Name => 'PlayListID', + Format => 'int8u', # actually int64u, but split it up + Writable => 'int32s', #27 + }, + purd => 'PurchaseDate', #7 + purl => 'PodcastURL', #7 + rtng => { #10 + Name => 'Rating', + Format => 'int8u', #23 + Writable => 'int8s', #27 + PrintConv => { + 0 => 'none', + 1 => 'Explicit', + 2 => 'Clean', + 4 => 'Explicit (old)', + }, + }, + sfID => { #10 + Name => 'AppleStoreCountry', + Format => 'int32u', + Writable => 'int32s', #27 + SeparateTable => 1, + PrintConv => { #21 + 143441 => 'United States', # US + 143442 => 'France', # FR + 143443 => 'Germany', # DE + 143444 => 'United Kingdom', # GB + 143445 => 'Austria', # AT + 143446 => 'Belgium', # BE + 143447 => 'Finland', # FI + 143448 => 'Greece', # GR + 143449 => 'Ireland', # IE + 143450 => 'Italy', # IT + 143451 => 'Luxembourg', # LU + 143452 => 'Netherlands', # NL + 143453 => 'Portugal', # PT + 143454 => 'Spain', # ES + 143455 => 'Canada', # CA + 143456 => 'Sweden', # SE + 143457 => 'Norway', # NO + 143458 => 'Denmark', # DK + 143459 => 'Switzerland', # CH + 143460 => 'Australia', # AU + 143461 => 'New Zealand', # NZ + 143462 => 'Japan', # JP + 143463 => 'Hong Kong', # HK + 143464 => 'Singapore', # SG + 143465 => 'China', # CN + 143466 => 'Republic of Korea', # KR + 143467 => 'India', # IN + 143468 => 'Mexico', # MX + 143469 => 'Russia', # RU + 143470 => 'Taiwan', # TW + 143471 => 'Vietnam', # VN + 143472 => 'South Africa', # ZA + 143473 => 'Malaysia', # MY + 143474 => 'Philippines', # PH + 143475 => 'Thailand', # TH + 143476 => 'Indonesia', # ID + 143477 => 'Pakistan', # PK + 143478 => 'Poland', # PL + 143479 => 'Saudi Arabia', # SA + 143480 => 'Turkey', # TR + 143481 => 'United Arab Emirates', # AE + 143482 => 'Hungary', # HU + 143483 => 'Chile', # CL + 143484 => 'Nepal', # NP + 143485 => 'Panama', # PA + 143486 => 'Sri Lanka', # LK + 143487 => 'Romania', # RO + 143489 => 'Czech Republic', # CZ + 143491 => 'Israel', # IL + 143492 => 'Ukraine', # UA + 143493 => 'Kuwait', # KW + 143494 => 'Croatia', # HR + 143495 => 'Costa Rica', # CR + 143496 => 'Slovakia', # SK + 143497 => 'Lebanon', # LB + 143498 => 'Qatar', # QA + 143499 => 'Slovenia', # SI + 143501 => 'Colombia', # CO + 143502 => 'Venezuela', # VE + 143503 => 'Brazil', # BR + 143504 => 'Guatemala', # GT + 143505 => 'Argentina', # AR + 143506 => 'El Salvador', # SV + 143507 => 'Peru', # PE + 143508 => 'Dominican Republic', # DO + 143509 => 'Ecuador', # EC + 143510 => 'Honduras', # HN + 143511 => 'Jamaica', # JM + 143512 => 'Nicaragua', # NI + 143513 => 'Paraguay', # PY + 143514 => 'Uruguay', # UY + 143515 => 'Macau', # MO + 143516 => 'Egypt', # EG + 143517 => 'Kazakhstan', # KZ + 143518 => 'Estonia', # EE + 143519 => 'Latvia', # LV + 143520 => 'Lithuania', # LT + 143521 => 'Malta', # MT + 143523 => 'Moldova', # MD + 143524 => 'Armenia', # AM + 143525 => 'Botswana', # BW + 143526 => 'Bulgaria', # BG + 143528 => 'Jordan', # JO + 143529 => 'Kenya', # KE + 143530 => 'Macedonia', # MK + 143531 => 'Madagascar', # MG + 143532 => 'Mali', # ML + 143533 => 'Mauritius', # MU + 143534 => 'Niger', # NE + 143535 => 'Senegal', # SN + 143536 => 'Tunisia', # TN + 143537 => 'Uganda', # UG + 143538 => 'Anguilla', # AI + 143539 => 'Bahamas', # BS + 143540 => 'Antigua and Barbuda', # AG + 143541 => 'Barbados', # BB + 143542 => 'Bermuda', # BM + 143543 => 'British Virgin Islands', # VG + 143544 => 'Cayman Islands', # KY + 143545 => 'Dominica', # DM + 143546 => 'Grenada', # GD + 143547 => 'Montserrat', # MS + 143548 => 'St. Kitts and Nevis', # KN + 143549 => 'St. Lucia', # LC + 143550 => 'St. Vincent and The Grenadines', # VC + 143551 => 'Trinidad and Tobago', # TT + 143552 => 'Turks and Caicos', # TC + 143553 => 'Guyana', # GY + 143554 => 'Suriname', # SR + 143555 => 'Belize', # BZ + 143556 => 'Bolivia', # BO + 143557 => 'Cyprus', # CY + 143558 => 'Iceland', # IS + 143559 => 'Bahrain', # BH + 143560 => 'Brunei Darussalam', # BN + 143561 => 'Nigeria', # NG + 143562 => 'Oman', # OM + 143563 => 'Algeria', # DZ + 143564 => 'Angola', # AO + 143565 => 'Belarus', # BY + 143566 => 'Uzbekistan', # UZ + 143568 => 'Azerbaijan', # AZ + 143571 => 'Yemen', # YE + 143572 => 'Tanzania', # TZ + 143573 => 'Ghana', # GH + 143575 => 'Albania', # AL + 143576 => 'Benin', # BJ + 143577 => 'Bhutan', # BT + 143578 => 'Burkina Faso', # BF + 143579 => 'Cambodia', # KH + 143580 => 'Cape Verde', # CV + 143581 => 'Chad', # TD + 143582 => 'Republic of the Congo', # CG + 143583 => 'Fiji', # FJ + 143584 => 'Gambia', # GM + 143585 => 'Guinea-Bissau', # GW + 143586 => 'Kyrgyzstan', # KG + 143587 => "Lao People's Democratic Republic", # LA + 143588 => 'Liberia', # LR + 143589 => 'Malawi', # MW + 143590 => 'Mauritania', # MR + 143591 => 'Federated States of Micronesia', # FM + 143592 => 'Mongolia', # MN + 143593 => 'Mozambique', # MZ + 143594 => 'Namibia', # NA + 143595 => 'Palau', # PW + 143597 => 'Papua New Guinea', # PG + 143598 => 'Sao Tome and Principe', # ST (S&atilde;o Tom&eacute; and Pr&iacute;ncipe) + 143599 => 'Seychelles', # SC + 143600 => 'Sierra Leone', # SL + 143601 => 'Solomon Islands', # SB + 143602 => 'Swaziland', # SZ + 143603 => 'Tajikistan', # TJ + 143604 => 'Turkmenistan', # TM + 143605 => 'Zimbabwe', # ZW + }, + }, + soaa => 'SortAlbumArtist', #10 + soal => 'SortAlbum', #10 + soar => 'SortArtist', #10 + soco => 'SortComposer', #10 + sonm => 'SortName', #10 + sosn => 'SortShow', #10 + stik => { #10 + Name => 'MediaType', + Format => 'int8u', #23 + Writable => 'int8s', #27 + PrintConvColumns => 2, + PrintConv => { #(http://weblog.xanga.com/gryphondwb/615474010/iphone-ringtones---what-did-itunes-741-really-do.html) + 0 => 'Movie (old)', #forum9059 (was Movie) + 1 => 'Normal (Music)', + 2 => 'Audiobook', + 5 => 'Whacked Bookmark', + 6 => 'Music Video', + 9 => 'Movie', #forum9059 (was Short Film) + 10 => 'TV Show', + 11 => 'Booklet', + 14 => 'Ringtone', + 21 => 'Podcast', #15 + 23 => 'iTunes U', #forum9059 + }, + }, + rate => 'RatingPercent', #PH + titl => { Name => 'Title', Avoid => 1 }, + tven => 'TVEpisodeID', #7 + tves => { #7/10 + Name => 'TVEpisode', + Format => 'int32u', + Writable => 'int32s', #27 + }, + tvnn => 'TVNetworkName', #7 + tvsh => 'TVShow', #10 + tvsn => { #7/10 + Name => 'TVSeason', + Format => 'int32u', + }, + yrrc => 'Year', #(ffmpeg source) + itnu => { #PH (iTunes 10.5) + Name => 'iTunesU', + Format => 'int8u', #27 + Writable => 'int8s', #27 + Description => 'iTunes U', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + #https://github.com/communitymedia/mediautilities/blob/master/src/net/sourceforge/jaad/mp4/boxes/BoxTypes.java + gshh => { Name => 'GoogleHostHeader', Format => 'string' }, + gspm => { Name => 'GooglePingMessage', Format => 'string' }, + gspu => { Name => 'GooglePingURL', Format => 'string' }, + gssd => { Name => 'GoogleSourceData', Format => 'string' }, + gsst => { Name => 'GoogleStartTime', Format => 'string' }, + gstd => { + Name => 'GoogleTrackDuration', + Format => 'string', + ValueConv => '$val / 1000', + ValueConvInv => '$val * 1000', + PrintConv => 'ConvertDuration($val)', + PrintConvInv => q{ + $val =~ s/ s$//; + my @a = split /(:| days )/, $val; + my $sign = ($val =~ s/^-//) ? -1 : 1; + $a[0] += shift(@a) * 24 if @a == 4; + $a[0] += shift(@a) * 60 while @a > 1; + return $a[0] * $sign; + }, + }, + + # atoms observed in AAX audiobooks (ref PH) + "\xa9cpy" => { Name => 'Copyright', Avoid => 1, Groups => { 2 => 'Author' } }, + "\xa9pub" => 'Publisher', + "\xa9nrt" => 'Narrator', + '@pti' => 'ParentTitle', # (guess -- same as "\xa9nam") + '@PST' => 'ParentShortTitle', # (guess -- same as "\xa9nam") + '@ppi' => 'ParentProductID', # (guess -- same as 'prID') + '@sti' => 'ShortTitle', # (guess -- same as "\xa9nam") + prID => 'ProductID', + rldt => { Name => 'ReleaseDate', Groups => { 2 => 'Time' }}, + CDEK => { Name => 'Unknown_CDEK', Unknown => 1 }, # eg: "B004ZMTFEG" - used in URL's ("asin=") + CDET => { Name => 'Unknown_CDET', Unknown => 1 }, # eg: "ADBL" + VERS => 'ProductVersion', + GUID => 'GUID', + AACR => { Name => 'Unknown_AACR', Unknown => 1 }, # eg: "CR!1T1H1QH6WX7T714G2BMFX3E9MC4S" + # ausr - 30 bytes (User Alias?) + "\xa9xyz" => { #PH (written by Google Photos) + Name => 'GPSCoordinates', + Groups => { 2 => 'Location' }, + ValueConv => \&ConvertISO6709, + ValueConvInv => \&ConvInvISO6709, + PrintConv => \&PrintGPSCoordinates, + PrintConvInv => \&PrintInvGPSCoordinates, + }, + # the following tags written by iTunes 12.5.1.21 + # (ref https://www.ventismedia.com/mantis/view.php?id=14963 + # https://community.mp3tag.de/t/x-mp4-new-tag-problems/19488) + "\xa9wrk" => 'Work', #PH + "\xa9mvn" => 'MovementName', #PH + "\xa9mvi" => { #PH + Name => 'MovementNumber', + Format => 'int16u', #27 + Writable => 'int16s', #27 + }, + "\xa9mvc" => { #PH + Name => 'MovementCount', + Format => 'int16u', #27 + Writable => 'int16s', #27 + }, + shwm => { #PH + Name => 'ShowMovement', + Format => 'int8u', #27 + Writable => 'int8s', #27 + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, +); + +# tag decoded from timed face records +%Image::ExifTool::QuickTime::FaceInfo = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Video' }, + crec => { + Name => 'FaceRec', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::FaceRec', + }, + }, +); + +# tag decoded from timed face records +%Image::ExifTool::QuickTime::FaceRec = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Video' }, + cits => { + Name => 'FaceItem', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Keys', + ProcessProc => \&Process_mebx, + }, + }, +); + +# item list keys (ref PH) +%Image::ExifTool::QuickTime::Keys = ( + PROCESS_PROC => \&ProcessKeys, + WRITE_PROC => \&WriteKeys, + CHECK_PROC => \&CheckQTValue, + VARS => { LONG_TAGS => 7 }, + WRITABLE => 1, + # (not PREFERRED when writing) + GROUPS => { 1 => 'Keys' }, + WRITE_GROUP => 'Keys', + LANG_INFO => \&GetLangInfo, + NOTES => q{ + This directory contains a list of key names which are used to decode tags + written by the "mdta" handler. Also in this table are a few tags found in + timed metadata that are not yet writable by ExifTool. The prefix of + "com.apple.quicktime." has been removed from the TagID's below. These tags + support alternate languages in the same way as the + L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> tags. Note + that by default, + L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> and + L<UserData|Image::ExifTool::TagNames/QuickTime UserData Tags> tags are + preferred when writing, so to create a tag when a same-named tag exists in + either of these tables, either the "Keys" location must be specified (eg. + C<-Keys:Author=Phil> on the command line), or the PREFERRED level must be + changed via L<the config file|../config.html#PREF>. + }, + version => 'Version', + album => 'Album', + artist => { }, + artwork => { }, + author => { Name => 'Author', Groups => { 2 => 'Author' } }, + comment => { }, + copyright => { Name => 'Copyright', Groups => { 2 => 'Author' } }, + creationdate=> { + Name => 'CreationDate', + Groups => { 2 => 'Time' }, + Shift => 'Time', + ValueConv => q{ + require Image::ExifTool::XMP; + $val = Image::ExifTool::XMP::ConvertXMPDate($val,1); + $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary + return $val; + }, + ValueConvInv => q{ + require Image::ExifTool::XMP; + $val = Image::ExifTool::XMP::FormatXMPDate($val); + $val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon + return $val; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist) + }, + description => { }, + director => { }, + displayname => { Name => 'DisplayName' }, + title => { }, #22 + genre => { }, + information => { }, + keywords => { }, + producer => { }, #22 + make => { Name => 'Make', Groups => { 2 => 'Camera' } }, + model => { Name => 'Model', Groups => { 2 => 'Camera' } }, + publisher => { }, + software => { }, + year => { Groups => { 2 => 'Time' } }, + 'camera.identifier' => 'CameraIdentifier', # (iPhone 4) + 'camera.framereadouttimeinmicroseconds' => { # (iPhone 4) + Name => 'FrameReadoutTime', + ValueConv => '$val * 1e-6', + ValueConvInv => 'int($val * 1e6 + 0.5)', + PrintConv => '$val * 1e6 . " microseconds"', + PrintConvInv => '$val =~ s/ .*//; $val * 1e-6', + }, + 'location.ISO6709' => { + Name => 'GPSCoordinates', + Groups => { 2 => 'Location' }, + Notes => q{ + Google Photos may ignore this if the coorinates have more than 5 digits + after the decimal + }, + ValueConv => \&ConvertISO6709, + ValueConvInv => \&ConvInvISO6709, + PrintConv => \&PrintGPSCoordinates, + PrintConvInv => \&PrintInvGPSCoordinates, + }, + 'location.name' => { Name => 'LocationName', Groups => { 2 => 'Location' } }, + 'location.body' => { Name => 'LocationBody', Groups => { 2 => 'Location' } }, + 'location.note' => { Name => 'LocationNote', Groups => { 2 => 'Location' } }, + 'location.role' => { + Name => 'LocationRole', + Groups => { 2 => 'Location' }, + PrintConv => { + 0 => 'Shooting Location', + 1 => 'Real Location', + 2 => 'Fictional Location', + }, + }, + 'location.date' => { + Name => 'LocationDate', + Groups => { 2 => 'Time' }, + Shift => 'Time', + ValueConv => q{ + require Image::ExifTool::XMP; + $val = Image::ExifTool::XMP::ConvertXMPDate($val); + $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary + return $val; + }, + ValueConvInv => q{ + require Image::ExifTool::XMP; + $val = Image::ExifTool::XMP::FormatXMPDate($val); + $val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon + return $val; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist) + }, + 'location.accuracy.horizontal' => { Name => 'LocationAccuracyHorizontal' }, + 'live-photo.auto' => { Name => 'LivePhotoAuto', Writable => 'int8u' }, + 'live-photo.vitality-score' => { Name => 'LivePhotoVitalityScore', Writable => 'float' }, + 'live-photo.vitality-scoring-version' => { Name => 'LivePhotoVitalityScoringVersion', Writable => 'int64s' }, + 'apple.photos.variation-identifier' => { Name => 'ApplePhotosVariationIdentifier', Writable => 'int64s' }, + 'direction.facing' => { Name => 'CameraDirection', Groups => { 2 => 'Location' } }, + 'direction.motion' => { Name => 'CameraMotion', Groups => { 2 => 'Location' } }, + 'location.body' => { Name => 'LocationBody', Groups => { 2 => 'Location' } }, + 'player.version' => 'PlayerVersion', + 'player.movie.visual.brightness'=> 'Brightness', + 'player.movie.visual.color' => 'Color', + 'player.movie.visual.tint' => 'Tint', + 'player.movie.visual.contrast' => 'Contrast', + 'player.movie.audio.gain' => 'AudioGain', + 'player.movie.audio.treble' => 'Treble', + 'player.movie.audio.bass' => 'Bass', + 'player.movie.audio.balance' => 'Balance', + 'player.movie.audio.pitchshift' => 'PitchShift', + 'player.movie.audio.mute' => { + Name => 'Mute', + Format => 'int8u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 'rating.user' => 'UserRating', # (Canon ELPH 510 HS) + 'collection.user' => 'UserCollection', #22 + 'Encoded_With' => 'EncodedWith', +# +# the following tags aren't in the com.apple.quicktime namespace: +# + 'com.apple.photos.captureMode' => 'CaptureMode', + 'com.android.version' => 'AndroidVersion', +# +# also seen +# + # com.divergentmedia.clipwrap.model ('NEX-FS700EK') + # com.divergentmedia.clipwrap.model1 ('49') + # com.divergentmedia.clipwrap.model2 ('0') + # com.divergentmedia.clipwrap.manufacturer ('Sony') + # com.divergentmedia.clipwrap.originalDateTime ('2013/2/6 10:30:40+0200') +# +# seen in timed metadata (mebx), and added dynamically to the table via SaveMetaKeys() +# NOTE: these tags are not writable! (timed metadata cannot yet be written) +# + # (mdta)com.apple.quicktime.video-orientation (dtyp=66, int16s) + 'video-orientation' => { + Name => 'VideoOrientation', + Writable => 0, + PrintConv => \%Image::ExifTool::Exif::orientation, #PH (NC) + }, + # (mdta)com.apple.quicktime.live-photo-info (dtyp=com.apple.quicktime.com.apple.quicktime.live-photo-info) + 'live-photo-info' => { + Name => 'LivePhotoInfo', + Writable => 0, + # not sure what these values mean, but unpack them anyway - PH + # (ignore the fact that the "f" and "l" unpacks won't work on a big-endian machine) + ValueConv => 'join " ",unpack "VfVVf6c4lCCcclf4Vvv", $val', + }, + # (mdta)com.apple.quicktime.still-image-time (dtyp=65, int8s) + 'still-image-time' => { # (found in live photo) + Name => 'StillImageTime', + Writable => 0, + Notes => q{ + this tag always has a value of -1; the time of the still image is obtained + from the associated SampleTime + }, + }, + # (mdta)com.apple.quicktime.detected-face (dtyp='com.apple.quicktime.detected-face') + 'detected-face' => { + Name => 'FaceInfo', + Writable => 0, + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::FaceInfo' }, + }, + # ---- detected-face fields ( ---- + # --> back here after a round trip through FaceInfo -> FaceRec -> FaceItem + # (fiel)com.apple.quicktime.detected-face.bounds (dtyp=80, float[8]) + 'detected-face.bounds' => { + Name => 'DetectedFaceBounds', + Writable => 0, + # round to a reasonable number of decimal places + PrintConv => 'my @a=split " ",$val;$_=int($_*1e6+.5)/1e6 foreach @a;join " ",@a', + PrintConvInv => '$val', + }, + # (fiel)com.apple.quicktime.detected-face.face-id (dtyp=77, int32u) + 'detected-face.face-id' => { Name => 'DetectedFaceID', Writable => 0 }, + # (fiel)com.apple.quicktime.detected-face.roll-angle (dtyp=23, float) + 'detected-face.roll-angle' => { Name => 'DetectedFaceRollAngle', Writable => 0 }, + # (fiel)com.apple.quicktime.detected-face.yaw-angle (dtyp=23, float) + 'detected-face.yaw-angle' => { Name => 'DetectedFaceYawAngle', Writable => 0 }, +# +# seen in Apple ProRes RAW file +# + # (mdta)com.apple.proapps.manufacturer (eg. "Sony") + # (mdta)com.apple.proapps.exif.{Exif}.FNumber (float, eg. 1.0) + # (mdta)org.smpte.rdd18.lens.irisfnumber (eg. "F1.0") + # (mdta)com.apple.proapps.exif.{Exif}.ShutterSpeedValue (float, eg. 1.006) + # (mdta)org.smpte.rdd18.camera.shutterspeed_angle (eg. "179.2deg") + # (mdta)org.smpte.rdd18.camera.neutraldensityfilterwheelsetting (eg. "ND1") + # (mdta)org.smpte.rdd18.camera.whitebalance (eg. "4300K") + # (mdta)com.apple.proapps.exif.{Exif}.ExposureIndex (float, eg. 4000) + # (mdta)org.smpte.rdd18.camera.isosensitivity (eg. "4000") + # (mdta)com.apple.proapps.image.{TIFF}.Make (eg. "Atmos") + # (mdta)com.apple.proapps.image.{TIFF}.Model (eg. "ShogunInferno") + # (mdta)com.apple.proapps.image.{TIFF}.Software (eg. "9.0") +); + +# iTunes info ('----') atoms +%Image::ExifTool::QuickTime::iTunesInfo = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 1 => 'iTunes', 2 => 'Audio' }, + VARS => { LONG_TAGS => 0 }, # (hack for discrepancy in the way long tags are counted in BuildTagLookup) + NOTES => q{ + ExifTool will extract any iTunesInfo tags that exist, even if they are not + defined in this table. These tags belong to the family 1 "iTunes" group, + and are not currently writable. + }, + # 'mean'/'name'/'data' atoms form a triplet, but unfortunately + # I haven't been able to find any documentation on this. + # 'mean' is normally 'com.apple.iTunes' + mean => { + Name => 'Mean', + # the 'Triplet' flag tells ProcessMOV() to generate + # a single tag from the mean/name/data triplet + Triplet => 1, + Hidden => 1, + }, + name => { + Name => 'Name', + Triplet => 1, + Hidden => 1, + }, + data => { + Name => 'Data', + Triplet => 1, + Hidden => 1, + }, + # the tag ID's below are composed from "mean/name", + # but "mean/" is omitted if it is "com.apple.iTunes/": + 'iTunMOVI' => { + Name => 'iTunMOVI', + SubDirectory => { TagTable => 'Image::ExifTool::PLIST::Main' }, + }, + 'tool' => { + Name => 'iTunTool', + Description => 'iTunTool', + Format => 'int32u', + PrintConv => 'sprintf("0x%.8x",$val)', + }, + 'iTunEXTC' => { + Name => 'ContentRating', + Notes => 'standard | rating | score | reasons', + # eg. 'us-tv|TV-14|500|V', 'mpaa|PG-13|300|For violence and sexuality' + # (see http://shadowofged.blogspot.ca/2008/06/itunes-content-ratings.html) + }, + 'iTunNORM' => { + Name => 'VolumeNormalization', + PrintConv => '$val=~s/ 0+(\w)/ $1/g; $val=~s/^\s+//; $val', + }, + 'iTunSMPB' => { + Name => 'iTunSMPB', + Description => 'iTunSMPB', + # hex format, similar to iTunNORM, but 12 words instead of 10, + # and 4th word is 16 hex digits (all others are 8) + # (gives AAC encoder delay, ref http://code.google.com/p/l-smash/issues/detail?id=1) + PrintConv => '$val=~s/ 0+(\w)/ $1/g; $val=~s/^\s+//; $val', + }, + # (CDDB = Compact Disc DataBase) + # iTunes_CDDB_1 = <CDDB1 disk ID>+<# tracks>+<logical block address for each track>... + 'iTunes_CDDB_1' => 'CDDB1Info', + 'iTunes_CDDB_TrackNumber' => 'CDDBTrackNumber', + 'Encoding Params' => { + Name => 'EncodingParams', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::EncodingParams' }, + }, + # also heard about 'iTunPGAP', but I haven't seen a sample + # all tags below were added based on samples I have seen - PH + DISCNUMBER => 'DiscNumber', + TRACKNUMBER => 'TrackNumber', + ARTISTS => 'Artists', + CATALOGNUMBER => 'CatalogNumber', + RATING => 'Rating', + MEDIA => 'Media', + SCRIPT => 'Script', # character set? (seen 'Latn') + BARCODE => 'Barcode', + LABEL => 'Label', + MOOD => 'Mood', + popularimeter => 'Popularimeter', + 'Dynamic Range (DR)'=> 'DynamicRange', + initialkey => 'InitialKey', + originalyear => 'OriginalYear', + originaldate => 'OriginalDate', + '~length' => 'Length', # play length? (ie. duration?) + replaygain_track_gain=>'ReplayTrackGain', + replaygain_track_peak=>'ReplayTrackPeak', + 'Volume Level (ReplayGain)'=> 'ReplayVolumeLevel', + 'Dynamic Range (R128)'=> 'DynamicRangeR128', + 'Volume Level (R128)' => 'VolumeLevelR128', + 'Peak Level (Sample)' => 'PeakLevelSample', + 'Peak Level (R128)' => 'PeakLevelR128', + # also seen (many from forum12777): + # 'MusicBrainz Album Release Country' + # 'MusicBrainz Album Type' + # 'MusicBrainz Album Status' + # 'MusicBrainz Track Id' + # 'MusicBrainz Release Track Id' + # 'MusicBrainz Album Id' + # 'MusicBrainz Album Artist Id' + # 'MusicBrainz Artist Id' + # 'Acoustid Id' (sic) + # 'Tool Version' + # 'Tool Name' + # 'ISRC' + # 'HDCD' + # 'Waveform' +); + +# iTunes audio encoding parameters +# ref https://developer.apple.com/library/mac/#documentation/MusicAudio/Reference/AudioCodecServicesRef/Reference/reference.html +%Image::ExifTool::QuickTime::EncodingParams = ( + PROCESS_PROC => \&ProcessEncodingParams, + GROUPS => { 2 => 'Audio' }, + # (I have commented out the ones that don't have integer values because they + # probably don't appear, and definitely wouldn't work with current decoding - PH) + + # global codec properties + #'lnam' => 'AudioCodecName', + #'lmak' => 'AudioCodecManufacturer', + #'lfor' => 'AudioCodecFormat', + 'vpk?' => 'AudioHasVariablePacketByteSizes', + #'ifm#' => 'AudioSupportedInputFormats', + #'ofm#' => 'AudioSupportedOutputFormats', + #'aisr' => 'AudioAvailableInputSampleRates', + #'aosr' => 'AudioAvailableOutputSampleRates', + 'abrt' => 'AudioAvailableBitRateRange', + 'mnip' => 'AudioMinimumNumberInputPackets', + 'mnop' => 'AudioMinimumNumberOutputPackets', + 'cmnc' => 'AudioAvailableNumberChannels', + 'lmrc' => 'AudioDoesSampleRateConversion', + #'aicl' => 'AudioAvailableInputChannelLayoutTags', + #'aocl' => 'AudioAvailableOutputChannelLayoutTags', + #'if4o' => 'AudioInputFormatsForOutputFormat', + #'of4i' => 'AudioOutputFormatsForInputFormat', + #'acfi' => 'AudioFormatInfo', + + # instance codec properties + 'tbuf' => 'AudioInputBufferSize', + 'pakf' => 'AudioPacketFrameSize', + 'pakb' => 'AudioMaximumPacketByteSize', + #'ifmt' => 'AudioCurrentInputFormat', + #'ofmt' => 'AudioCurrentOutputFormat', + #'kuki' => 'AudioMagicCookie', + 'ubuf' => 'AudioUsedInputBufferSize', + 'init' => 'AudioIsInitialized', + 'brat' => 'AudioCurrentTargetBitRate', + #'cisr' => 'AudioCurrentInputSampleRate', + #'cosr' => 'AudioCurrentOutputSampleRate', + 'srcq' => 'AudioQualitySetting', + #'brta' => 'AudioApplicableBitRateRange', + #'isra' => 'AudioApplicableInputSampleRates', + #'osra' => 'AudioApplicableOutputSampleRates', + 'pad0' => 'AudioZeroFramesPadded', + 'prmm' => 'AudioCodecPrimeMethod', + #'prim' => 'AudioCodecPrimeInfo', + #'icl ' => 'AudioInputChannelLayout', + #'ocl ' => 'AudioOutputChannelLayout', + #'acs ' => 'AudioCodecSettings', + #'acfl' => 'AudioCodecFormatList', + 'acbf' => 'AudioBitRateControlMode', + 'vbrq' => 'AudioVBRQuality', + 'mdel' => 'AudioMinimumDelayMode', + + # deprecated + 'pakd' => 'AudioRequiresPacketDescription', + #'brt#' => 'AudioAvailableBitRates', + 'acef' => 'AudioExtendFrequencies', + 'ursr' => 'AudioUseRecommendedSampleRate', + 'oppr' => 'AudioOutputPrecedence', + #'loud' => 'AudioCurrentLoudnessStatistics', + + # others + 'vers' => 'AudioEncodingParamsVersion', #PH + 'cdcv' => { #PH + Name => 'AudioComponentVersion', + ValueConv => 'join ".", unpack("ncc", pack("N",$val))', + }, +); + +# print to video data block +%Image::ExifTool::QuickTime::Video = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + 0 => { + Name => 'DisplaySize', + PrintConv => { + 0 => 'Normal', + 1 => 'Double Size', + 2 => 'Half Size', + 3 => 'Full Screen', + 4 => 'Current Size', + }, + }, + 6 => { + Name => 'SlideShow', + PrintConv => { + 0 => 'No', + 1 => 'Yes', + }, + }, +); + +# 'hnti' atoms +%Image::ExifTool::QuickTime::HintInfo = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Video' }, + 'rtp ' => { + Name => 'RealtimeStreamingProtocol', + PrintConv => '$val=~s/^sdp /(SDP) /; $val', + }, + 'sdp ' => 'StreamingDataProtocol', +); + +# 'hinf' atoms +%Image::ExifTool::QuickTime::HintTrackInfo = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Video' }, + trpY => { Name => 'TotalBytes', Format => 'int64u' }, #(documented) + trpy => { Name => 'TotalBytes', Format => 'int64u' }, #(observed) + totl => { Name => 'TotalBytes', Format => 'int32u' }, + nump => { Name => 'NumPackets', Format => 'int64u' }, + npck => { Name => 'NumPackets', Format => 'int32u' }, + tpyl => { Name => 'TotalBytesNoRTPHeaders', Format => 'int64u' }, + tpaY => { Name => 'TotalBytesNoRTPHeaders', Format => 'int32u' }, #(documented) + tpay => { Name => 'TotalBytesNoRTPHeaders', Format => 'int32u' }, #(observed) + maxr => { + Name => 'MaxDataRate', + Format => 'int32u', + Count => 2, + PrintConv => 'my @a=split(" ",$val);sprintf("%d bytes in %.3f s",$a[1],$a[0]/1000)', + }, + dmed => { Name => 'MediaTrackBytes', Format => 'int64u' }, + dimm => { Name => 'ImmediateDataBytes', Format => 'int64u' }, + drep => { Name => 'RepeatedDataBytes', Format => 'int64u' }, + tmin => { + Name => 'MinTransmissionTime', + Format => 'int32u', + PrintConv => 'sprintf("%.3f s",$val/1000)', + }, + tmax => { + Name => 'MaxTransmissionTime', + Format => 'int32u', + PrintConv => 'sprintf("%.3f s",$val/1000)', + }, + pmax => { Name => 'LargestPacketSize', Format => 'int32u' }, + dmax => { + Name => 'LargestPacketDuration', + Format => 'int32u', + PrintConv => 'sprintf("%.3f s",$val/1000)', + }, + payt => { + Name => 'PayloadType', + Format => 'undef', # (necessary to prevent decoding as string!) + ValueConv => 'unpack("N",$val) . " " . substr($val, 5)', + PrintConv => '$val=~s/ /, /;$val', + }, +); + +# MP4 media box (ref 5) +%Image::ExifTool::QuickTime::Media = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + GROUPS => { 1 => 'Track#', 2 => 'Video' }, + NOTES => 'MP4 media box.', + mdhd => { + Name => 'MediaHeader', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MediaHeader' }, + }, + hdlr => { + Name => 'Handler', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Handler' }, + }, + minf => { + Name => 'MediaInfo', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MediaInfo' }, + }, +); + +# MP4 media header box (ref 5) +%Image::ExifTool::QuickTime::MediaHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 1 => 'Track#', 2 => 'Video' }, + FORMAT => 'int32u', + DATAMEMBER => [ 0, 1, 2, 3, 4 ], + 0 => { + Name => 'MediaHeaderVersion', + RawConv => '$$self{MediaHeaderVersion} = $val', + }, + 1 => { + Name => 'MediaCreateDate', + Groups => { 2 => 'Time' }, + %timeInfo, + # this is int64u if MediaHeaderVersion == 1 (ref 5/13) + Hook => '$$self{MediaHeaderVersion} and $format = "int64u", $varSize += 4', + }, + 2 => { + Name => 'MediaModifyDate', + Groups => { 2 => 'Time' }, + %timeInfo, + # this is int64u if MediaHeaderVersion == 1 (ref 5/13) + Hook => '$$self{MediaHeaderVersion} and $format = "int64u", $varSize += 4', + }, + 3 => { + Name => 'MediaTimeScale', + RawConv => '$$self{MediaTS} = $val', + }, + 4 => { + Name => 'MediaDuration', + RawConv => '$$self{MediaTS} ? $val / $$self{MediaTS} : $val', + PrintConv => '$$self{MediaTS} ? ConvertDuration($val) : $val', + # this is int64u if MediaHeaderVersion == 1 (ref 5/13) + Hook => '$$self{MediaHeaderVersion} and $format = "int64u", $varSize += 4', + }, + 5 => { + Name => 'MediaLanguageCode', + Format => 'int16u', + RawConv => '$val ? $val : undef', + # allow both Macintosh (for MOV files) and ISO (for MP4 files) language codes + ValueConv => '($val < 0x400 or $val == 0x7fff) ? $val : pack "C*", map { (($val>>$_)&0x1f)+0x60 } 10, 5, 0', + PrintConv => q{ + return $val unless $val =~ /^\d+$/; + require Image::ExifTool::Font; + return $Image::ExifTool::Font::ttLang{Macintosh}{$val} || "Unknown ($val)"; + }, + }, +); + +# MP4 media information box (ref 5) +%Image::ExifTool::QuickTime::MediaInfo = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + GROUPS => { 1 => 'Track#', 2 => 'Video' }, + NOTES => 'MP4 media info box.', + vmhd => { + Name => 'VideoHeader', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::VideoHeader' }, + }, + smhd => { + Name => 'AudioHeader', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::AudioHeader' }, + }, + hmhd => { + Name => 'HintHeader', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintHeader' }, + }, + nmhd => { + Name => 'NullMediaHeader', + Flags => ['Binary','Unknown'], + }, + dinf => { + Name => 'DataInfo', # (don't change this name -- used to recognize directory when writing) + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::DataInfo' }, + }, + gmhd => { + Name => 'GenMediaHeader', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::GenMediaHeader' }, + }, + hdlr => { #PH + Name => 'Handler', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Handler' }, + }, + stbl => { + Name => 'SampleTable', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SampleTable' }, + }, +); + +# MP4 video media header (ref 5) +%Image::ExifTool::QuickTime::VideoHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + NOTES => 'MP4 video media header.', + FORMAT => 'int16u', + 2 => { + Name => 'GraphicsMode', + PrintHex => 1, + SeparateTable => 'GraphicsMode', + PrintConv => \%graphicsMode, + }, + 3 => { Name => 'OpColor', Format => 'int16u[3]' }, +); + +# MP4 audio media header (ref 5) +%Image::ExifTool::QuickTime::AudioHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + NOTES => 'MP4 audio media header.', + FORMAT => 'int16u', + 2 => { Name => 'Balance', Format => 'fixed16s' }, +); + +# MP4 hint media header (ref 5) +%Image::ExifTool::QuickTime::HintHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + NOTES => 'MP4 hint media header.', + FORMAT => 'int16u', + 2 => 'MaxPDUSize', + 3 => 'AvgPDUSize', + 4 => { Name => 'MaxBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' }, + 6 => { Name => 'AvgBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' }, +); + +# MP4 sample table box (ref 5) +%Image::ExifTool::QuickTime::SampleTable = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, + GROUPS => { 2 => 'Video' }, + NOTES => 'MP4 sample table box.', + stsd => [ + { + Name => 'AudioSampleDesc', + Condition => '$$self{HandlerType} and $$self{HandlerType} eq "soun"', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::AudioSampleDesc', + ProcessProc => \&ProcessSampleDesc, + }, + },{ + Name => 'VideoSampleDesc', + Condition => '$$self{HandlerType} and $$self{HandlerType} eq "vide"', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::ImageDesc', + ProcessProc => \&ProcessSampleDesc, + }, + },{ + Name => 'HintSampleDesc', + Condition => '$$self{HandlerType} and $$self{HandlerType} eq "hint"', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::HintSampleDesc', + ProcessProc => \&ProcessSampleDesc, + }, + },{ + Name => 'MetaSampleDesc', + Condition => '$$self{HandlerType} and $$self{HandlerType} eq "meta"', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::MetaSampleDesc', + ProcessProc => \&ProcessSampleDesc, + }, + },{ + Name => 'OtherSampleDesc', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::OtherSampleDesc', + ProcessProc => \&ProcessSampleDesc, + }, + }, + # (Note: "alis" HandlerType handled by the parent audio or video handler) + ], + stts => [ # decoding time-to-sample table + { + Name => 'VideoFrameRate', + Notes => 'average rate calculated from time-to-sample table for video media', + Condition => '$$self{HandlerType} and $$self{HandlerType} eq "vide"', + Format => 'undef', # (necessary to prevent decoding as string!) + # (must be RawConv so appropriate MediaTS is used in calculation) + RawConv => 'Image::ExifTool::QuickTime::CalcSampleRate($self, \$val)', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + }, + { + Name => 'TimeToSampleTable', + Flags => ['Binary','Unknown'], + }, + ], + ctts => { + Name => 'CompositionTimeToSample', + Flags => ['Binary','Unknown'], + }, + stsc => { + Name => 'SampleToChunk', + Flags => ['Binary','Unknown'], + }, + stsz => { + Name => 'SampleSizes', + Flags => ['Binary','Unknown'], + }, + stz2 => { + Name => 'CompactSampleSizes', + Flags => ['Binary','Unknown'], + }, + stco => { + Name => 'ChunkOffset', + Flags => ['Binary','Unknown'], + }, + co64 => { + Name => 'ChunkOffset64', + Flags => ['Binary','Unknown'], + }, + stss => { + Name => 'SyncSampleTable', + Flags => ['Binary','Unknown'], + }, + stsh => { + Name => 'ShadowSyncSampleTable', + Flags => ['Binary','Unknown'], + }, + padb => { + Name => 'SamplePaddingBits', + Flags => ['Binary','Unknown'], + }, + stdp => { + Name => 'SampleDegradationPriority', + Flags => ['Binary','Unknown'], + }, + sdtp => { + Name => 'IdependentAndDisposableSamples', + Flags => ['Binary','Unknown'], + }, + sbgp => { + Name => 'SampleToGroup', + Flags => ['Binary','Unknown'], + }, + sgpd => { + Name => 'SampleGroupDescription', + Flags => ['Binary','Unknown'], + # bytes 4-7 give grouping type (ref ISO/IEC 14496-15:2014) + # tsas - temporal sublayer sample + # stsa - step-wise temporal layer access + # avss - AVC sample + # tscl - temporal layer scalability + # sync - sync sample + }, + subs => { + Name => 'Sub-sampleInformation', + Flags => ['Binary','Unknown'], + }, + cslg => { + Name => 'CompositionToDecodeTimelineMapping', + Flags => ['Binary','Unknown'], + }, + stps => { + Name => 'PartialSyncSamples', + ValueConv => 'join " ",unpack("x8N*",$val)', + }, + # mark - 8 bytes all zero (GoPro) +); + +# MP4 audio sample description box (ref 5/AtomicParsley 0.9.4 parsley.cpp) +%Image::ExifTool::QuickTime::AudioSampleDesc = ( + PROCESS_PROC => \&ProcessHybrid, + VARS => { ID_LABEL => 'ID/Index' }, + GROUPS => { 2 => 'Audio' }, + NOTES => q{ + MP4 audio sample description. This hybrid atom contains both data and child + atoms. + }, + 4 => { + Name => 'AudioFormat', + Format => 'undef[4]', + RawConv => q{ + $$self{AudioFormat} = $val; + return undef unless $val =~ /^[\w ]{4}$/i; + # check for protected audio format + $self->OverrideFileType('M4P') if $val eq 'drms' and $$self{VALUE}{FileType} eq 'M4A'; + return $val; + }, + # see this link for print conversions (not complete): + # https://github.com/yannickcr/brooser/blob/master/php/librairies/getid3/module.audio-video.quicktime.php + }, + 20 => { #PH + Name => 'AudioVendorID', + Condition => '$$self{AudioFormat} ne "mp4s"', + Format => 'undef[4]', + RawConv => '$val eq "\0\0\0\0" ? undef : $val', + PrintConv => \%vendorID, + SeparateTable => 'VendorID', + }, + 24 => { Name => 'AudioChannels', Format => 'int16u' }, + 26 => { Name => 'AudioBitsPerSample', Format => 'int16u' }, + 32 => { Name => 'AudioSampleRate', Format => 'fixed32u' }, +# +# Observed offsets for child atoms of various AudioFormat types: +# +# AudioFormat Offset Child atoms +# ----------- ------ ---------------- +# mp4a 52 * wave, chan, esds, SA3D(Insta360 spherical video params?,also GoPro Max) +# in24 52 wave, chan +# "ms\0\x11" 52 wave +# sowt 52 chan +# mp4a 36 * esds, pinf +# drms 36 esds, sinf +# samr 36 damr +# alac 36 alac +# ac-3 36 dac3 +# +# (* child atoms found at different offsets in mp4a) +# + pinf => { + Name => 'PurchaseInfo', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ProtectionInfo' }, + }, + sinf => { # "protection scheme information" + Name => 'ProtectionInfo', #3 + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ProtectionInfo' }, + }, + # f - 16/36 bytes + # esds - 31/40/42/43 bytes - ES descriptor (ref 3) + damr => { #3 + Name => 'DecodeConfig', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::DecodeConfig' }, + }, + wave => { + Name => 'Wave', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Wave' }, + }, + chan => { + Name => 'AudioChannelLayout', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ChannelLayout' }, + } + # alac - 28 bytes + # adrm - AAX DRM atom? 148 bytes + # aabd - AAX unknown 17kB (contains 'aavd' strings) + # SA3D - written by Garmin VIRB360 +); + +# AMR decode config box (ref 3) +%Image::ExifTool::QuickTime::DecodeConfig = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + 0 => { + Name => 'EncoderVendor', + Format => 'undef[4]', + }, + 4 => 'EncoderVersion', + # 5 - int16u - packet modes + # 7 - int8u - number of packet mode changes + # 8 - int8u - bytes per packet +); + +%Image::ExifTool::QuickTime::ProtectionInfo = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Audio' }, + NOTES => 'Child atoms found in "sinf" and/or "pinf" atoms.', + frma => 'OriginalFormat', + # imif - IPMP information + schm => { + Name => 'SchemeType', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SchemeType' }, + }, + schi => { + Name => 'SchemeInfo', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SchemeInfo' }, + }, + enda => { + Name => 'Endianness', + Format => 'int16u', + PrintConv => { + 0 => 'Big-endian (Motorola, MM)', + 1 => 'Little-endian (Intel, II)', + }, + }, + # skcr +); + +%Image::ExifTool::QuickTime::Wave = ( + PROCESS_PROC => \&ProcessMOV, + frma => 'PurchaseFileFormat', + enda => { + Name => 'Endianness', + Format => 'int16u', + PrintConv => { + 0 => 'Big-endian (Motorola, MM)', + 1 => 'Little-endian (Intel, II)', + }, + }, + # "ms\0\x11" - 20 bytes +); + +# audio channel layout (ref CoreAudioTypes.h) +%Image::ExifTool::QuickTime::ChannelLayout = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + DATAMEMBER => [ 0, 8 ], + NOTES => 'Audio channel layout.', + # 0 - version and flags + 4 => { + Name => 'LayoutFlags', + Format => 'int16u', + RawConv => '$$self{LayoutFlags} = $val', + PrintConvColumns => 2, + PrintConv => { + 0 => 'UseDescriptions', + 1 => 'UseBitmap', + 100 => 'Mono', + 101 => 'Stereo', + 102 => 'StereoHeadphones', + 100 => 'Mono', + 101 => 'Stereo', + 102 => 'StereoHeadphones', + 103 => 'MatrixStereo', + 104 => 'MidSide', + 105 => 'XY', + 106 => 'Binaural', + 107 => 'Ambisonic_B_Format', + 108 => 'Quadraphonic', + 109 => 'Pentagonal', + 110 => 'Hexagonal', + 111 => 'Octagonal', + 112 => 'Cube', + 113 => 'MPEG_3_0_A', + 114 => 'MPEG_3_0_B', + 115 => 'MPEG_4_0_A', + 116 => 'MPEG_4_0_B', + 117 => 'MPEG_5_0_A', + 118 => 'MPEG_5_0_B', + 119 => 'MPEG_5_0_C', + 120 => 'MPEG_5_0_D', + 121 => 'MPEG_5_1_A', + 122 => 'MPEG_5_1_B', + 123 => 'MPEG_5_1_C', + 124 => 'MPEG_5_1_D', + 125 => 'MPEG_6_1_A', + 126 => 'MPEG_7_1_A', + 127 => 'MPEG_7_1_B', + 128 => 'MPEG_7_1_C', + 129 => 'Emagic_Default_7_1', + 130 => 'SMPTE_DTV', + 131 => 'ITU_2_1', + 132 => 'ITU_2_2', + 133 => 'DVD_4', + 134 => 'DVD_5', + 135 => 'DVD_6', + 136 => 'DVD_10', + 137 => 'DVD_11', + 138 => 'DVD_18', + 139 => 'AudioUnit_6_0', + 140 => 'AudioUnit_7_0', + 141 => 'AAC_6_0', + 142 => 'AAC_6_1', + 143 => 'AAC_7_0', + 144 => 'AAC_Octagonal', + 145 => 'TMH_10_2_std', + 146 => 'TMH_10_2_full', + 147 => 'DiscreteInOrder', + 148 => 'AudioUnit_7_0_Front', + 149 => 'AC3_1_0_1', + 150 => 'AC3_3_0', + 151 => 'AC3_3_1', + 152 => 'AC3_3_0_1', + 153 => 'AC3_2_1_1', + 154 => 'AC3_3_1_1', + 155 => 'EAC_6_0_A', + 156 => 'EAC_7_0_A', + 157 => 'EAC3_6_1_A', + 158 => 'EAC3_6_1_B', + 159 => 'EAC3_6_1_C', + 160 => 'EAC3_7_1_A', + 161 => 'EAC3_7_1_B', + 162 => 'EAC3_7_1_C', + 163 => 'EAC3_7_1_D', + 164 => 'EAC3_7_1_E', + 165 => 'EAC3_7_1_F', + 166 => 'EAC3_7_1_G', + 167 => 'EAC3_7_1_H', + 168 => 'DTS_3_1', + 169 => 'DTS_4_1', + 170 => 'DTS_6_0_A', + 171 => 'DTS_6_0_B', + 172 => 'DTS_6_0_C', + 173 => 'DTS_6_1_A', + 174 => 'DTS_6_1_B', + 175 => 'DTS_6_1_C', + 176 => 'DTS_7_0', + 177 => 'DTS_7_1', + 178 => 'DTS_8_0_A', + 179 => 'DTS_8_0_B', + 180 => 'DTS_8_1_A', + 181 => 'DTS_8_1_B', + 182 => 'DTS_6_1_D', + 183 => 'AAC_7_1_B', + 0xffff => 'Unknown', + }, + }, + 6 => { + Name => 'AudioChannels', + Condition => '$$self{LayoutFlags} != 0 and $$self{LayoutFlags} != 1', + Format => 'int16u', + }, + 8 => { + Name => 'AudioChannelTypes', + Condition => '$$self{LayoutFlags} == 1', + Format => 'int32u', + PrintConv => { BITMASK => { + 0 => 'Left', + 1 => 'Right', + 2 => 'Center', + 3 => 'LFEScreen', + 4 => 'LeftSurround', + 5 => 'RightSurround', + 6 => 'LeftCenter', + 7 => 'RightCenter', + 8 => 'CenterSurround', + 9 => 'LeftSurroundDirect', + 10 => 'RightSurroundDirect', + 11 => 'TopCenterSurround', + 12 => 'VerticalHeightLeft', + 13 => 'VerticalHeightCenter', + 14 => 'VerticalHeightRight', + 15 => 'TopBackLeft', + 16 => 'TopBackCenter', + 17 => 'TopBackRight', + }}, + }, + 12 => { + Name => 'NumChannelDescriptions', + Condition => '$$self{LayoutFlags} == 1', + Format => 'int32u', + RawConv => '$$self{NumChannelDescriptions} = $val', + }, + 16 => { + Name => 'Channel1Label', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 0', + Format => 'int32u', + SeparateTable => 'ChannelLabel', + PrintConv => \%channelLabel, + }, + 20 => { + Name => 'Channel1Flags', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 0', + Format => 'int32u', + PrintConv => { BITMASK => { 0 => 'Rectangular', 1 => 'Spherical', 2 => 'Meters' }}, + }, + 24 => { + Name => 'Channel1Coordinates', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 0', + Notes => q{ + 3 numbers: for rectangular coordinates left/right, back/front, down/up; for + spherical coordinates left/right degrees, down/up degrees, distance + }, + Format => 'float[3]', + }, + 36 => { + Name => 'Channel2Label', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 1', + Format => 'int32u', + SeparateTable => 'ChannelLabel', + PrintConv => \%channelLabel, + }, + 40 => { + Name => 'Channel2Flags', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 1', + Format => 'int32u', + PrintConv => { BITMASK => { 0 => 'Rectangular', 1 => 'Spherical', 2 => 'Meters' }}, + }, + 44 => { + Name => 'Channel2Coordinates', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 1', + Format => 'float[3]', + }, + 56 => { + Name => 'Channel3Label', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 2', + Format => 'int32u', + SeparateTable => 'ChannelLabel', + PrintConv => \%channelLabel, + }, + 60 => { + Name => 'Channel3Flags', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 2', + Format => 'int32u', + PrintConv => { BITMASK => { 0 => 'Rectangular', 1 => 'Spherical', 2 => 'Meters' }}, + }, + 64 => { + Name => 'Channel3Coordinates', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 2', + Format => 'float[3]', + }, + 76 => { + Name => 'Channel4Label', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 3', + Format => 'int32u', + SeparateTable => 'ChannelLabel', + PrintConv => \%channelLabel, + }, + 80 => { + Name => 'Channel4Flags', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 3', + Format => 'int32u', + PrintConv => { BITMASK => { 0 => 'Rectangular', 1 => 'Spherical', 2 => 'Meters' }}, + }, + 84 => { + Name => 'Channel4Coordinates', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 3', + Format => 'float[3]', + }, + 96 => { + Name => 'Channel5Label', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 4', + Format => 'int32u', + SeparateTable => 'ChannelLabel', + PrintConv => \%channelLabel, + }, + 100 => { + Name => 'Channel5Flags', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 4', + Format => 'int32u', + PrintConv => { BITMASK => { 0 => 'Rectangular', 1 => 'Spherical', 2 => 'Meters' }}, + }, + 104 => { + Name => 'Channel5Coordinates', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 4', + Format => 'float[3]', + }, + 116 => { + Name => 'Channel6Label', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 5', + Format => 'int32u', + SeparateTable => 'ChannelLabel', + PrintConv => \%channelLabel, + }, + 120 => { + Name => 'Channel6Flags', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 5', + Format => 'int32u', + PrintConv => { BITMASK => { 0 => 'Rectangular', 1 => 'Spherical', 2 => 'Meters' }}, + }, + 124 => { + Name => 'Channel6Coordinates', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 5', + Format => 'float[3]', + }, + 136 => { + Name => 'Channel7Label', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 6', + Format => 'int32u', + SeparateTable => 'ChannelLabel', + PrintConv => \%channelLabel, + }, + 140 => { + Name => 'Channel7Flags', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 6', + Format => 'int32u', + PrintConv => { BITMASK => { 0 => 'Rectangular', 1 => 'Spherical', 2 => 'Meters' }}, + }, + 144 => { + Name => 'Channel7Coordinates', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 6', + Format => 'float[3]', + }, + 156 => { + Name => 'Channel8Label', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 7', + Format => 'int32u', + SeparateTable => 'ChannelLabel', + PrintConv => \%channelLabel, + }, + 160 => { + Name => 'Channel8Flags', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 7', + Format => 'int32u', + PrintConv => { BITMASK => { 0 => 'Rectangular', 1 => 'Spherical', 2 => 'Meters' }}, + }, + 164 => { + Name => 'Channel8Coordinates', + Condition => '$$self{LayoutFlags} == 1 and $$self{NumChannelDescriptions} > 7', + Format => 'float[3]', + }, + # (arbitrarily decode only first 8 channels) +); + +# scheme type atom +# ref http://xhelmboyx.tripod.com/formats/mp4-layout.txt +%Image::ExifTool::QuickTime::SchemeType = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + # 0 - 4 bytes version + 4 => { Name => 'SchemeType', Format => 'undef[4]' }, + 8 => { Name => 'SchemeVersion', Format => 'int16u' }, + 10 => { Name => 'SchemeURL', Format => 'string[$size-10]' }, +); + +%Image::ExifTool::QuickTime::SchemeInfo = ( + PROCESS_PROC => \&ProcessMOV, + GROUPS => { 2 => 'Audio' }, + user => { + Name => 'UserID', + Groups => { 2 => 'Author' }, + ValueConv => '"0x" . unpack("H*",$val)', + }, + cert => { # ref http://www.onvif.org/specs/stream/ONVIF-ExportFileFormat-Spec-v100.pdf + Name => 'Certificate', + ValueConv => '"0x" . unpack("H*",$val)', + }, + 'key ' => { + Name => 'KeyID', + ValueConv => '"0x" . unpack("H*",$val)', + }, + iviv => { + Name => 'InitializationVector', + ValueConv => 'unpack("H*",$val)', + }, + righ => { + Name => 'Rights', + Groups => { 2 => 'Author' }, + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Rights' }, + }, + name => { Name => 'UserName', Groups => { 2 => 'Author' } }, + # chtb + # priv - private data + # sign + # adkm - Adobe DRM key management system (ref http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf) + # iKMS + # iSFM + # iSLT +); + +%Image::ExifTool::QuickTime::Rights = ( + PROCESS_PROC => \&ProcessRights, + GROUPS => { 2 => 'Audio' }, + veID => 'ItemVendorID', #PH ("VendorID" ref 19) + plat => 'Platform', #18? + aver => 'VersionRestrictions', #19 ("appversion?" ref 18) + tran => 'TransactionID', #18 + song => 'ItemID', #19 ("appid" ref 18) + tool => { + Name => 'ItemTool', #PH (guess) ("itunes build?" ref 18) + Format => 'string', + }, + medi => 'MediaFlags', #PH (?) + mode => 'ModeFlags', #PH (?) 0x04 is HD flag (https://compilr.com/heksesang/requiem-mac/UnDrm.java) +); + +# MP4 hint sample description box (ref 5) +# (ref https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-SW1) +%Image::ExifTool::QuickTime::HintSampleDesc = ( + PROCESS_PROC => \&ProcessHybrid, + VARS => { ID_LABEL => 'ID/Index' }, + NOTES => 'MP4 hint sample description.', + 4 => { Name => 'HintFormat', Format => 'undef[4]' }, + # 14 - int16u DataReferenceIndex + 16 => { Name => 'HintTrackVersion', Format => 'int16u' }, + # 18 - int16u LastCompatibleHintTrackVersion + 20 => { Name => 'MaxPacketSize', Format => 'int32u' }, +# +# Observed offsets for child atoms of various HintFormat types: +# +# HintFormat Offset Child atoms +# ----------- ------ ---------------- +# "rtp " 24 tims +# + tims => { Name => 'RTPTimeScale', Format => 'int32u' }, + tsro => { Name => 'TimestampRandomOffset', Format => 'int32u' }, + snro => { Name => 'SequenceNumberRandomOffset', Format => 'int32u' }, +); + +# MP4 metadata sample description box +%Image::ExifTool::QuickTime::MetaSampleDesc = ( + PROCESS_PROC => \&ProcessHybrid, + NOTES => 'MP4 metadata sample description.', + 4 => { + Name => 'MetaFormat', + Format => 'undef[4]', + RawConv => '$$self{MetaFormat} = $val', + }, + 8 => { # starts at 8 for MetaFormat eq 'camm', and 17 for 'mett' + Name => 'MetaType', + Format => 'undef[$size-8]', + # may start at various locations! + RawConv => '$$self{MetaType} = ($val=~/(application[^\0]+)/ ? $1 : undef)', + }, +# +# Observed offsets for child atoms of various MetaFormat types: +# +# MetaFormat Offset Child atoms +# ----------- ------ ---------------- +# mebx 24 keys,btrt,lidp,lidl +# fdsc - - +# gpmd - - +# rtmd - - +# CTMD - - +# + 'keys' => { #PH (iPhone7+ hevc) + Name => 'Keys', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Keys', + ProcessProc => \&ProcessMetaKeys, + }, + }, + btrt => { + Name => 'BitrateInfo', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Bitrate' }, + }, +); + +# MP4 generic sample description box +%Image::ExifTool::QuickTime::OtherSampleDesc = ( + PROCESS_PROC => \&ProcessHybrid, + 4 => { + Name => 'OtherFormat', + Format => 'undef[4]', + RawConv => '$$self{MetaFormat} = $val', # (yes, use MetaFormat for this too) + }, +# +# Observed offsets for child atoms of various OtherFormat types: +# +# OtherFormat Offset Child atoms +# ----------- ------ ---------------- +# avc1 86 avcC +# mp4a 36 esds +# mp4s 16 esds +# tmcd 34 name +# data - - +# + ftab => { Name => 'FontTable', Format => 'undef', ValueConv => 'substr($val, 5)' }, + name => { Name => 'OtherName', Format => 'undef', ValueConv => 'substr($val, 4)' }, + # mrlh = GM header? + # mrlv = GM data + # mrld = GM data (448-byte records): + # 0 - int32u count + # 4 - int32u ? (related to units) 0=none,1=m/km,2=L,3=kph,4=C,7=deg,8=rpm,9=kPa,10=G,11=V,15=Nm,16=% + # 8 - int32u ? (0,1,3,4,5) + # 12 - string[64] units + # 76 - int32u ? (1,3,7,15) + # 80 - int32u 0 + # 84 - undef[4] ? + # 88 - int16u[6] ? + # 100 - undef[32] ? + # 132 - string[64] measurement name + # 196 - string[64] measurement name +); + +# MP4 data information box (ref 5) +%Image::ExifTool::QuickTime::DataInfo = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, # (necessary to parse dref even though we don't change it) + NOTES => 'MP4 data information box.', + dref => { + Name => 'DataRef', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::DataRef', + Start => 8, + }, + }, +); + +# Generic media header +%Image::ExifTool::QuickTime::GenMediaHeader = ( + PROCESS_PROC => \&ProcessMOV, + gmin => { + Name => 'GenMediaInfo', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::GenMediaInfo' }, + }, + text => { + Name => 'Text', + Flags => ['Binary','Unknown'], + }, + tmcd => { + Name => 'TimeCode', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TimeCode' }, + }, +); + +# TimeCode header +%Image::ExifTool::QuickTime::TimeCode = ( + PROCESS_PROC => \&ProcessMOV, + tcmi => { + Name => 'TCMediaInfo', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TCMediaInfo' }, + }, +); + +# TimeCode media info (ref 12) +%Image::ExifTool::QuickTime::TCMediaInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + 4 => { + Name => 'TextFont', + Format => 'int16u', + PrintConv => { 0 => 'System' }, + }, + 6 => { + Name => 'TextFace', + Format => 'int16u', + PrintConv => { + 0 => 'Plain', + BITMASK => { + 0 => 'Bold', + 1 => 'Italic', + 2 => 'Underline', + 3 => 'Outline', + 4 => 'Shadow', + 5 => 'Condense', + 6 => 'Extend', + }, + }, + }, + 8 => { + Name => 'TextSize', + Format => 'int16u', + }, + # 10 - reserved + 12 => { + Name => 'TextColor', + Format => 'int16u[3]', + }, + 18 => { + Name => 'BackgroundColor', + Format => 'int16u[3]', + }, + 24 => { + Name => 'FontName', + Format => 'pstring', + ValueConv => '$self->Decode($val, $self->Options("CharsetQuickTime"))', + }, +); + +# Generic media info (ref http://sourceforge.jp/cvs/view/ntvrec/ntvrec/libqtime/gmin.h?view=co) +%Image::ExifTool::QuickTime::GenMediaInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + 0 => 'GenMediaVersion', + 1 => { Name => 'GenFlags', Format => 'int8u[3]' }, + 4 => { Name => 'GenGraphicsMode', + Format => 'int16u', + PrintHex => 1, + SeparateTable => 'GraphicsMode', + PrintConv => \%graphicsMode, + }, + 6 => { Name => 'GenOpColor', Format => 'int16u[3]' }, + 12 => { Name => 'GenBalance', Format => 'fixed16s' }, +); + +# MP4 data reference box (ref 5) +%Image::ExifTool::QuickTime::DataRef = ( + PROCESS_PROC => \&ProcessMOV, + WRITE_PROC => \&WriteQuickTime, # (necessary to parse dref even though we don't change it) + NOTES => 'MP4 data reference box.', + 'url ' => { + Name => 'URL', + Format => 'undef', # (necessary to prevent decoding as string!) + RawConv => q{ + # ignore if self-contained (flags bit 0 set) + return undef if unpack("N",$val) & 0x01; + $_ = substr($val,4); s/\0.*//s; $_; + }, + }, + "url\0" => { # (written by GoPro) + Name => 'URL', + Format => 'undef', # (necessary to prevent decoding as string!) + RawConv => q{ + # ignore if self-contained (flags bit 0 set) + return undef if unpack("N",$val) & 0x01; + $_ = substr($val,4); s/\0.*//s; $_; + }, + }, + 'urn ' => { + Name => 'URN', + Format => 'undef', # (necessary to prevent decoding as string!) + RawConv => q{ + return undef if unpack("N",$val) & 0x01; + $_ = substr($val,4); s/\0+/; /; s/\0.*//s; $_; + }, + }, +); + +# MP4 handler box (ref 5) +%Image::ExifTool::QuickTime::Handler = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + 4 => { #PH + Name => 'HandlerClass', + Format => 'undef[4]', + RawConv => '$val eq "\0\0\0\0" ? undef : $val', + PrintConv => { + mhlr => 'Media Handler', + dhlr => 'Data Handler', + }, + }, + 8 => { + Name => 'HandlerType', + Format => 'undef[4]', + RawConv => q{ + $$self{HandlerType} = $val unless $val eq 'alis' or $val eq 'url '; + $$self{HasHandler}{$val} = 1; # remember all our handlers + return $val; + }, + PrintConvColumns => 2, + PrintConv => { + alis => 'Alias Data', #PH + crsm => 'Clock Reference', #3 + hint => 'Hint Track', + ipsm => 'IPMP', #3 + m7sm => 'MPEG-7 Stream', #3 + meta => 'NRT Metadata', #PH + mdir => 'Metadata', #3 + mdta => 'Metadata Tags', #PH + mjsm => 'MPEG-J', #3 + ocsm => 'Object Content', #3 + odsm => 'Object Descriptor', #3 + priv => 'Private', #PH + sdsm => 'Scene Description', #3 + soun => 'Audio Track', + text => 'Text', #PH (but what type? subtitle?) + tmcd => 'Time Code', #PH + 'url '=> 'URL', #3 + vide => 'Video Track', + subp => 'Subpicture', #http://www.google.nl/patents/US7778526 + nrtm => 'Non-Real Time Metadata', #PH (Sony ILCE-7S) [how is this different from "meta"?] + pict => 'Picture', # (HEIC images) + camm => 'Camera Metadata', # (Insta360 MP4) + psmd => 'Panasonic Static Metadata', #PH (Leica C-Lux CAM-DC25) + data => 'Data', #PH (GPS and G-sensor data from DataKam) + sbtl => 'Subtitle', #PH (TomTom Bandit Action Cam) + }, + }, + 12 => { #PH + Name => 'HandlerVendorID', + Format => 'undef[4]', + RawConv => '$val eq "\0\0\0\0" ? undef : $val', + PrintConv => \%vendorID, + SeparateTable => 'VendorID', + }, + 24 => { + Name => 'HandlerDescription', + Format => 'string', + # (sometimes this is a Pascal string, and sometimes it is a C string) + RawConv => q{ + $val=substr($val,1,ord($1)) if $val=~/^([\0-\x1f])/ and ord($1)<length($val); + length $val ? $val : undef; + }, + }, +); + +# Flip uuid data (ref PH) +%Image::ExifTool::QuickTime::Flip = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + NOTES => 'Found in MP4 files from Flip Video cameras.', + GROUPS => { 1 => 'MakerNotes', 2 => 'Image' }, + 1 => 'PreviewImageWidth', + 2 => 'PreviewImageHeight', + 13 => 'PreviewImageLength', + 14 => { # (confirmed for FlipVideoMinoHD) + Name => 'SerialNumber', + Groups => { 2 => 'Camera' }, + Format => 'string[16]', + }, + 28 => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Format => 'undef[$val{13}]', + RawConv => '$self->ValidateImage(\$val, $tag)', + }, +); + +# atoms in Pittasoft "free" atom +%Image::ExifTool::QuickTime::Pittasoft = ( + PROCESS_PROC => \&ProcessMOV, + NOTES => 'Tags found in Pittasoft Blackvue dashcam "free" data.', + cprt => 'Copyright', + thum => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Binary => 1, + RawConv => q{ + return undef unless length $val > 4; + my $len = unpack('N', $val); + return undef unless length $val >= 4 + $len; + return substr($val, 4, $len); + }, + }, + ptnm => { + Name => 'OriginalFileName', + ValueConv => 'substr($val, 4, -1)', + }, + ptrh => { + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Pittasoft' }, + # contains these atoms: + # ptvi - 27 bytes: '..avc1...' + # ptso - 16 bytes: '..mp4a...' + }, + 'gps ' => { + Name => 'GPSLog', + Binary => 1, # (ASCII NMEA track log with leading timestamps) + Notes => 'parsed to extract GPS separately when ExtractEmbedded is used', + RawConv => q{ + $val =~ s/\0+$//; # remove trailing nulls + if (length $val and $$self{OPTIONS}{ExtractEmbedded}) { + my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream'); + Image::ExifTool::QuickTime::ProcessGPSLog($self, { DataPt => \$val }, $tagTbl); + } + return $val; + }, + }, + '3gf ' => { + Name => 'AccelData', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Stream', + ProcessProc => \&Process_3gf, + }, + }, + sttm => { + Name => 'StartTime', + Format => 'int64u', + Groups => { 2 => 'Time' }, + RawConv => '$$self{StartTime} = $val', + # (ms since Jan 1, 1970, in local time zone - PH) + ValueConv => q{ + my $secs = int($val / 1000); + return ConvertUnixTime($secs) . sprintf(".%03d",$val - $secs * 1000); + }, + PrintConv => '$self->ConvertDateTime($val)', + }, +); + +# QuickTime composite tags +%Image::ExifTool::QuickTime::Composite = ( + GROUPS => { 2 => 'Video' }, + Rotation => { + Notes => q{ + writing this tag updates QuickTime MatrixStructure for all tracks with a + non-zero image size + }, + Require => { + 0 => 'QuickTime:MatrixStructure', + 1 => 'QuickTime:HandlerType', + }, + Writable => 1, + Protected => 1, + WriteAlso => { + MatrixStructure => 'Image::ExifTool::QuickTime::GetRotationMatrix($val)', + }, + ValueConv => 'Image::ExifTool::QuickTime::CalcRotation($self)', + ValueConvInv => '$val', + }, + AvgBitrate => { + Priority => 0, # let QuickTime::AvgBitrate take priority + Require => { + 0 => 'QuickTime::MediaDataSize', + 1 => 'QuickTime::Duration', + }, + RawConv => q{ + return undef unless $val[1]; + $val[1] /= $$self{TimeScale} if $$self{TimeScale}; + my $key = 'MediaDataSize'; + my $size = $val[0]; + for (;;) { + $key = $self->NextTagKey($key) or last; + $size += $self->GetValue($key, 'ValueConv'); + } + return int($size * 8 / $val[1] + 0.5); + }, + PrintConv => 'ConvertBitrate($val)', + }, + GPSLatitude => { + Require => 'QuickTime:GPSCoordinates', + Groups => { 2 => 'Location' }, + ValueConv => 'my @c = split " ", $val; $c[0]', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + GPSLongitude => { + Require => 'QuickTime:GPSCoordinates', + Groups => { 2 => 'Location' }, + ValueConv => 'my @c = split " ", $val; $c[1]', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + # split altitude into GPSAltitude/GPSAltitudeRef like EXIF and XMP + GPSAltitude => { + Require => 'QuickTime:GPSCoordinates', + Groups => { 2 => 'Location' }, + Priority => 0, # (because it may not exist) + ValueConv => 'my @c = split " ", $val; defined $c[2] ? abs($c[2]) : undef', + PrintConv => '"$val m"', + }, + GPSAltitudeRef => { + Require => 'QuickTime:GPSCoordinates', + Groups => { 2 => 'Location' }, + Priority => 0, # (because altitude information may not exist) + ValueConv => 'my @c = split " ", $val; defined $c[2] ? ($c[2] < 0 ? 1 : 0) : undef', + PrintConv => { + 0 => 'Above Sea Level', + 1 => 'Below Sea Level', + }, + }, + GPSLatitude2 => { + Name => 'GPSLatitude', + Require => 'QuickTime:LocationInformation', + Groups => { 2 => 'Location' }, + ValueConv => '$val =~ /Lat=([-+.\d]+)/; $1', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + GPSLongitude2 => { + Name => 'GPSLongitude', + Require => 'QuickTime:LocationInformation', + Groups => { 2 => 'Location' }, + ValueConv => '$val =~ /Lon=([-+.\d]+)/; $1', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + GPSAltitude2 => { + Name => 'GPSAltitude', + Require => 'QuickTime:LocationInformation', + Groups => { 2 => 'Location' }, + ValueConv => '$val =~ /Alt=([-+.\d]+)/; abs($1)', + PrintConv => '"$val m"', + }, + GPSAltitudeRef2 => { + Name => 'GPSAltitudeRef', + Require => 'QuickTime:LocationInformation', + Groups => { 2 => 'Location' }, + ValueConv => '$val =~ /Alt=([-+.\d]+)/; $1 < 0 ? 1 : 0', + PrintConv => { + 0 => 'Above Sea Level', + 1 => 'Below Sea Level', + }, + }, + CDDBDiscPlayTime => { + Require => 'CDDB1Info', + Groups => { 2 => 'Audio' }, + ValueConv => '$val =~ /^..([a-z0-9]{4})/i ? hex($1) : undef', + PrintConv => 'ConvertDuration($val)', + }, + CDDBDiscTracks => { + Require => 'CDDB1Info', + Groups => { 2 => 'Audio' }, + ValueConv => '$val =~ /^.{6}([a-z0-9]{2})/i ? hex($1) : undef', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::QuickTime'); + + +#------------------------------------------------------------------------------ +# AutoLoad our routines when necessary +# +sub AUTOLOAD +{ + # (Note: no need to autoload routines in QuickTimeStream that use Stream table) + if ($AUTOLOAD eq 'Image::ExifTool::QuickTime::Process_mebx') { + require 'Image/ExifTool/QuickTimeStream.pl'; + no strict 'refs'; + return &$AUTOLOAD(@_); + } else { + return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_); + } +} + +#------------------------------------------------------------------------------ +# Get rotation matrix +# Inputs: 0) angle in degrees +# Returns: 9-element rotation matrix as a string (with 0 x/y offsets) +sub GetRotationMatrix($) +{ + my $ang = 3.1415926536 * shift() / 180; + my $cos = cos $ang; + my $sin = sin $ang; + my $msn = -$sin; + return "$cos $sin 0 $msn $cos 0 0 0 1"; +} + +#------------------------------------------------------------------------------ +# Get rotation angle from a matrix +# Inputs: 0) rotation matrix as a string +# Return: positive rotation angle in degrees rounded to 3 decimal points, +# or undef on error +sub GetRotationAngle($) +{ + my $rotMatrix = shift; + my @a = split ' ', $rotMatrix; + return undef if $a[0]==0 and $a[1]==0; + # calculate the rotation angle (assume uniform rotation) + my $angle = atan2($a[1], $a[0]) * 180 / 3.14159; + $angle += 360 if $angle < 0; + return int($angle * 1000 + 0.5) / 1000; +} + +#------------------------------------------------------------------------------ +# Calculate rotation of video track +# Inputs: 0) ExifTool object ref +# Returns: rotation angle or undef +sub CalcRotation($) +{ + my $et = shift; + my $value = $$et{VALUE}; + my ($i, $track); + # get the video track family 1 group (eg. "Track1"); + for ($i=0; ; ++$i) { + my $idx = $i ? " ($i)" : ''; + my $tag = "HandlerType$idx"; + last unless $$value{$tag}; + next unless $$value{$tag} eq 'vide'; + $track = $et->GetGroup($tag, 1); + last; + } + return undef unless $track; + # get the video track matrix + for ($i=0; ; ++$i) { + my $idx = $i ? " ($i)" : ''; + my $tag = "MatrixStructure$idx"; + last unless $$value{$tag}; + next unless $et->GetGroup($tag, 1) eq $track; + return GetRotationAngle($$value{$tag}); + } + return undef; +} + +#------------------------------------------------------------------------------ +# Get MatrixStructure for a given rotation angle +# Inputs: 0) rotation angle (deg), 1) ExifTool ref +# Returns: matrix structure as a string, or undef if it can't be rotated +# - requires ImageSizeLookahead to determine the video image size, and doesn't +# rotate matrix unless image size is valid +sub GetMatrixStructure($$) +{ + my ($val, $et) = @_; + my @a = split ' ', $val; + # pass straight through if it already has an offset + return $val unless $a[6] == 0 and $a[7] == 0; + my @s = split ' ', $$et{ImageSizeLookahead}; + my ($w, $h) = @s[12,13]; + return undef unless $w and $h; # don't rotate 0-sized track + $_ = Image::ExifTool::QuickTime::FixWrongFormat($_) foreach $w,$h; + # apply necessary offsets for the standard rotations + my $angle = GetRotationAngle($val); + return undef unless defined $angle; + if ($angle == 90) { + @a[6,7] = ($h, 0); + } elsif ($angle == 180) { + @a[6,7] = ($w, $h); + } elsif ($angle == 270) { + @a[6,7] = (0, $w); + } + return "@a"; +} + +#------------------------------------------------------------------------------ +# Determine the average sample rate from a time-to-sample table +# Inputs: 0) ExifTool object ref, 1) time-to-sample table data ref +# Returns: average sample rate (in Hz) +sub CalcSampleRate($$) +{ + my ($et, $valPt) = @_; + my @dat = unpack('N*', $$valPt); + my ($num, $dur) = (0, 0); + my $i; + for ($i=2; $i<@dat-1; $i+=2) { + $num += $dat[$i]; # total number of samples + $dur += $dat[$i] * $dat[$i+1]; # total sample duration + } + return undef unless $num and $dur and $$et{MediaTS}; + return $num * $$et{MediaTS} / $dur; +} + +#------------------------------------------------------------------------------ +# Fix incorrect format for ImageWidth/Height as written by Pentax +sub FixWrongFormat($) +{ + my $val = shift; + return undef unless $val; + return $val & 0xfff00000 ? unpack('n',pack('N',$val)) : $val; +} + +#------------------------------------------------------------------------------ +# Convert ISO 6709 string to standard lag/lon format +# Inputs: 0) ISO 6709 string (lat, lon, and optional alt) +# Returns: position in decimal degrees with altitude if available +# Notes: Wikipedia indicates altitude may be in feet -- how is this specified? +sub ConvertISO6709($) +{ + my $val = shift; + if ($val =~ /^([-+]\d{1,2}(?:\.\d*)?)([-+]\d{1,3}(?:\.\d*)?)([-+]\d+(?:\.\d*)?)?/) { + # +DD.DDD+DDD.DDD+AA.AAA + $val = ($1 + 0) . ' ' . ($2 + 0); + $val .= ' ' . ($3 + 0) if $3; + } elsif ($val =~ /^([-+])(\d{2})(\d{2}(?:\.\d*)?)([-+])(\d{3})(\d{2}(?:\.\d*)?)([-+]\d+(?:\.\d*)?)?/) { + # +DDMM.MMM+DDDMM.MMM+AA.AAA + my $lat = $2 + $3 / 60; + $lat = -$lat if $1 eq '-'; + my $lon = $5 + $6 / 60; + $lon = -$lon if $4 eq '-'; + $val = "$lat $lon"; + $val .= ' ' . ($7 + 0) if $7; + } elsif ($val =~ /^([-+])(\d{2})(\d{2})(\d{2}(?:\.\d*)?)([-+])(\d{3})(\d{2})(\d{2}(?:\.\d*)?)([-+]\d+(?:\.\d*)?)?/) { + # +DDMMSS.SSS+DDDMMSS.SSS+AA.AAA + my $lat = $2 + $3 / 60 + $4 / 3600; + $lat = -$lat if $1 eq '-'; + my $lon = $6 + $7 / 60 + $8 / 3600; + $lon = -$lon if $5 eq '-'; + $val = "$lat $lon"; + $val .= ' ' . ($9 + 0) if $9; + } + return $val; +} + +#------------------------------------------------------------------------------ +# Convert Nero chapter list (ref ffmpeg libavformat/movenc.c) +# Inputs: 0) binary chpl data +# Returns: chapter list +sub ConvertChapterList($) +{ + my $val = shift; + my $size = length $val; + return '<invalid>' if $size < 9; + my $num = Get8u(\$val, 8); + my ($i, @chapters); + my $pos = 9; + for ($i=0; $i<$num; ++$i) { + last if $pos + 9 > $size; + my $dur = Get64u(\$val, $pos) / 10000000; + my $len = Get8u(\$val, $pos + 8); + last if $pos + 9 + $len > $size; + my $title = substr($val, $pos + 9, $len); + $pos += 9 + $len; + push @chapters, "$dur $title"; + } + return \@chapters; # return as a list +} + +#------------------------------------------------------------------------------ +# Print conversion for a Nero chapter list item +# Inputs: 0) ValueConv chapter string +# Returns: formatted chapter string +sub PrintChapter($) +{ + my $val = shift; + $val =~ /^(\S+) (.*)/ or return $val; + my ($dur, $title) = ($1, $2); + my $h = int($dur / 3600); + $dur -= $h * 3600; + my $m = int($dur / 60); + my $s = $dur - $m * 60; + my $ss = sprintf('%06.3f', $s); + if ($ss >= 60) { + $ss = '00.000'; + ++$m >= 60 and $m -= 60, ++$h; + } + return sprintf("[%d:%.2d:%s] %s",$h,$m,$ss,$title); +} + +#------------------------------------------------------------------------------ +# Format GPSCoordinates for printing +# Inputs: 0) string with numerical lat, lon and optional alt, separated by spaces +# 1) ExifTool object reference +# Returns: PrintConv value +sub PrintGPSCoordinates($) +{ + my ($val, $et) = @_; + my @v = split ' ', $val; + my $prt = Image::ExifTool::GPS::ToDMS($et, $v[0], 1, "N") . ', ' . + Image::ExifTool::GPS::ToDMS($et, $v[1], 1, "E"); + if (defined $v[2]) { + $prt .= ', ' . ($v[2] < 0 ? -$v[2] . ' m Below' : $v[2] . ' m Above') . ' Sea Level'; + } + return $prt; +} + +#------------------------------------------------------------------------------ +# Unpack packed ISO 639/T language code +# Inputs: 0) packed language code (or undef/0), 1) true to not treat 'und' and 'eng' as default +# Returns: language code, or undef/0 for default language, or 'err' for format error +sub UnpackLang($;$) +{ + my ($lang, $noDef) = @_; + if ($lang) { + # language code is packed in 5-bit characters + $lang = pack 'C*', map { (($lang>>$_)&0x1f)+0x60 } 10, 5, 0; + # validate language code + if ($lang =~ /^[a-z]+$/) { + # treat 'eng' or 'und' as the default language + undef $lang if ($lang eq 'und' or $lang eq 'eng') and not $noDef; + } else { + $lang = 'err'; # invalid language code + } + } + return $lang; +} + +#------------------------------------------------------------------------------ +# Get language code string given QuickTime language and country codes +# Inputs: 0) numerical language code, 1) numerical country code, 2) no defaults +# Returns: language code string (ie. "fra-FR") or undef for default language +sub GetLangCode($;$$) +{ + my ($lang, $ctry, $noDef) = @_; + # ignore country ('ctry') and language lists ('lang') for now + undef $ctry if $ctry and $ctry <= 255; + undef $lang if $lang and $lang <= 255; + $lang = UnpackLang($lang, $noDef); + # add country code if specified + if ($ctry) { + $ctry = unpack('a2',pack('n',$ctry)); # unpack as ISO 3166-1 + # treat 'ZZ' like a default country (see ref 12) + undef $ctry if $ctry eq 'ZZ'; + if ($ctry and $ctry =~ /^[A-Z]{2}$/) { + $lang or $lang = 'und'; + $lang .= "-$ctry"; + } + } + return $lang; +} + +#------------------------------------------------------------------------------ +# Get langInfo hash and save details about alt-lang tags +# Inputs: 0) ExifTool ref, 1) tagInfo hash ref, 2) locale code +# Returns: new tagInfo hash ref, or undef if invalid +sub GetLangInfoQT($$$) +{ + my ($et, $tagInfo, $langCode) = @_; + my $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $langCode); + if ($langInfo) { + $$et{QTLang} or $$et{QTLang} = [ ]; + push @{$$et{QTLang}}, $$langInfo{Name}; + } + return $langInfo; +} + +#------------------------------------------------------------------------------ +# Get variable-length integer from data (used by ParseItemLocation) +# Inputs: 0) data ref, 1) start position, 2) integer size in bytes (0, 4 or 8), +# 3) default value +# Returns: integer value, and updates current position +sub GetVarInt($$$;$) +{ + my ($dataPt, $pos, $n, $default) = @_; + my $len = length $$dataPt; + $_[1] = $pos + $n; # update current position + return undef if $pos + $n > $len; + if ($n == 0) { + return $default || 0; + } elsif ($n == 4) { + return Get32u($dataPt, $pos); + } elsif ($n == 8) { + return Get64u($dataPt, $pos); + } + return undef; +} + +#------------------------------------------------------------------------------ +# Get null-terminated string from binary data (used by ParseItemInfoEntry) +# Inputs: 0) data ref, 1) start position +# Returns: string, and updates current position +sub GetString($$) +{ + my ($dataPt, $pos) = @_; + my $len = length $$dataPt; + my $str = ''; + while ($pos < $len) { + my $ch = substr($$dataPt, $pos, 1); + ++$pos; + last if ord($ch) == 0; + $str .= $ch; + } + $_[1] = $pos; # update current position + return $str; +} + +#------------------------------------------------------------------------------ +# Get a printable version of the tag ID +# Inputs: 0) tag ID, 1) Flag: 0x01 - print as 4- or 8-digit hex value if necessary +# 0x02 - put leading backslash before escaped character +# Returns: Printable tag ID +sub PrintableTagID($;$) +{ + my $tag = $_[0]; + my $n = ($tag =~ s/([\x00-\x1f\x7f-\xff])/'x'.unpack('H*',$1)/eg); + if ($n and $_[1]) { + if ($n > 2 and $_[1] & 0x01) { + $tag = '0x' . unpack('H8', $_[0]); + $tag =~ s/^0x0000/0x/; + } elsif ($_[1] & 0x02) { + ($tag = $_[0]) =~ s/([\x00-\x1f\x7f-\xff])/'\\x'.unpack('H*',$1)/eg; + } + } + return $tag; +} + +#============================================================================== +# The following ParseXxx routines parse various boxes to extract this +# information about embedded items in a $$et{ItemInfo} hash, keyed by item ID: +# +# iloc: +# ConstructionMethod - offset type: 0=file, 1=idat, 2=item +# DataReferenceIndex - 0 for "this file", otherwise index in dref box +# BaseOffset - base for file offsets +# Extents - list of details for data in file: +# 0) index (extent_index) +# 1) offset (extent_offset) +# 2) length (extent_length) +# 3) nlen (length_size) +# 4) lenPt (pointer to length word) +# infe: +# ProtectionIndex - index if item is protected (0 for unprotected) +# Name - item name +# ContentType - mime type of item +# ContentEncoding - item encoding +# URI - URI of a 'uri '-type item +# ipma: +# Association - list of associated properties in the ipco container +# Essential - list of "essential" flags for the associated properties +# cdsc: +# RefersTo - hash lookup of flags based on referred item ID +# other: +# DocNum - exiftool document number for this item +# +#------------------------------------------------------------------------------ +# Parse item location (iloc) box (ref ISO 14496-12:2015 pg.79) +# Inputs: 0) iloc data, 1) ExifTool ref +# Returns: undef, and fills in ExifTool ItemInfo hash +# Notes: see also Handle_iloc() in WriteQuickTime.pl +sub ParseItemLocation($$) +{ + my ($val, $et) = @_; + my ($i, $j, $num, $pos, $id); + my ($extent_index, $extent_offset, $extent_length); + + my $verbose = $$et{IsWriting} ? 0 : $et->Options('Verbose'); + my $items = $$et{ItemInfo} || ($$et{ItemInfo} = { }); + my $len = length $val; + return undef if $len < 8; + my $ver = Get8u(\$val, 0); + my $siz = Get16u(\$val, 4); + my $noff = ($siz >> 12); + my $nlen = ($siz >> 8) & 0x0f; + my $nbas = ($siz >> 4) & 0x0f; + my $nind = $siz & 0x0f; + if ($ver < 2) { + $num = Get16u(\$val, 6); + $pos = 8; + } else { + return undef if $len < 10; + $num = Get32u(\$val, 6); + $pos = 10; + } + for ($i=0; $i<$num; ++$i) { + if ($ver < 2) { + return undef if $pos + 2 > $len; + $id = Get16u(\$val, $pos); + $pos += 2; + } else { + return undef if $pos + 4 > $len; + $id = Get32u(\$val, $pos); + $pos += 4; + } + if ($ver == 1 or $ver == 2) { + return undef if $pos + 2 > $len; + $$items{$id}{ConstructionMethod} = Get16u(\$val, $pos) & 0x0f; + $pos += 2; + } + return undef if $pos + 2 > $len; + $$items{$id}{DataReferenceIndex} = Get16u(\$val, $pos); + $pos += 2; + $$items{$id}{BaseOffset} = GetVarInt(\$val, $pos, $nbas); + return undef if $pos + 2 > $len; + my $ext_num = Get16u(\$val, $pos); + $pos += 2; + my @extents; + for ($j=0; $j<$ext_num; ++$j) { + if ($ver == 1 or $ver == 2) { + $extent_index = GetVarInt(\$val, $pos, $nind, 1); + } + $extent_offset = GetVarInt(\$val, $pos, $noff); + $extent_length = GetVarInt(\$val, $pos, $nlen); + return undef unless defined $extent_length; + $et->VPrint(1, "$$et{INDENT} Item $id: const_meth=", + defined $$items{$id}{ConstructionMethod} ? $$items{$id}{ConstructionMethod} : '', + sprintf(" base=0x%x offset=0x%x len=0x%x\n", $$items{$id}{BaseOffset}, + $extent_offset, $extent_length)) if $verbose; + push @extents, [ $extent_index, $extent_offset, $extent_length, $nlen, $pos-$nlen ]; + } + # save item location information keyed on 1-based item ID: + $$items{$id}{Extents} = \@extents; + } + return undef; +} + +#------------------------------------------------------------------------------ +# Parse content describes entry (cdsc) box +# Inputs: 0) cdsc data, 1) ExifTool ref +# Returns: undef, and fills in ExifTool ItemInfo hash +sub ParseContentDescribes($$) +{ + my ($val, $et) = @_; + my ($id, $count, @to); + if ($$et{ItemRefVersion}) { + return undef if length $val < 10; + ($id, $count, @to) = unpack('NnN*', $val); + } else { + return undef if length $val < 6; + ($id, $count, @to) = unpack('nnn*', $val); + } + if ($count > @to) { + my $str = 'Missing values in ContentDescribes box'; + $$et{IsWriting} ? $et->Error($str) : $et->Warn($str); + } elsif ($count < @to) { + $et->Warn('Ignored extra values in ContentDescribes box', 1); + @to = $count; + } + # add all referenced item ID's to a "RefersTo" lookup + $$et{ItemInfo}{$id}{RefersTo}{$_} = 1 foreach @to; + return undef; +} + +#------------------------------------------------------------------------------ +# Parse item information entry (infe) box (ref ISO 14496-12:2015 pg.82) +# Inputs: 0) infe data, 1) ExifTool ref +# Returns: undef, and fills in ExifTool ItemInfo hash +sub ParseItemInfoEntry($$) +{ + my ($val, $et) = @_; + my $id; + + my $verbose = $$et{IsWriting} ? 0 : $et->Options('Verbose'); + my $items = $$et{ItemInfo} || ($$et{ItemInfo} = { }); + my $len = length $val; + return undef if $len < 4; + my $ver = Get8u(\$val, 0); + my $pos = 4; + return undef if $pos + 4 > $len; + if ($ver == 0 or $ver == 1) { + $id = Get16u(\$val, $pos); + $$items{$id}{ProtectionIndex} = Get16u(\$val, $pos + 2); + $pos += 4; + $$items{$id}{Name} = GetString(\$val, $pos); + $$items{$id}{ContentType} = GetString(\$val, $pos); + $$items{$id}{ContentEncoding} = GetString(\$val, $pos); + } else { + if ($ver == 2) { + $id = Get16u(\$val, $pos); + $pos += 2; + } elsif ($ver == 3) { + $id = Get32u(\$val, $pos); + $pos += 4; + } + return undef if $pos + 6 > $len; + $$items{$id}{ProtectionIndex} = Get16u(\$val, $pos); + my $type = substr($val, $pos + 2, 4); + $$items{$id}{Type} = $type; + $pos += 6; + $$items{$id}{Name} = GetString(\$val, $pos); + if ($type eq 'mime') { + $$items{$id}{ContentType} = GetString(\$val, $pos); + $$items{$id}{ContentEncoding} = GetString(\$val, $pos); + } elsif ($type eq 'uri ') { + $$items{$id}{URI} = GetString(\$val, $pos); + } + } + $et->VPrint(1, "$$et{INDENT} Item $id: Type=", $$items{$id}{Type} || '', + ' Name=', $$items{$id}{Name} || '', + ' ContentType=', $$items{$id}{ContentType} || '', + "\n") if $verbose > 1; + return undef; +} + +#------------------------------------------------------------------------------ +# Parse item property association (ipma) box (ref https://github.com/gpac/gpac/blob/master/src/isomedia/iff.c) +# Inputs: 0) ipma data, 1) ExifTool ref +# Returns: undef, and fills in ExifTool ItemInfo hash +sub ParseItemPropAssoc($$) +{ + my ($val, $et) = @_; + my ($i, $j, $id); + + my $verbose = $$et{IsWriting} ? 0 : $et->Options('Verbose'); + my $items = $$et{ItemInfo} || ($$et{ItemInfo} = { }); + my $len = length $val; + return undef if $len < 8; + my $ver = Get8u(\$val, 0); + my $flg = Get32u(\$val, 0); + my $num = Get32u(\$val, 4); + my $pos = 8; + for ($i=0; $i<$num; ++$i) { + if ($ver == 0) { + return undef if $pos + 3 > $len; + $id = Get16u(\$val, $pos); + $pos += 2; + } else { + return undef if $pos + 5 > $len; + $id = Get32u(\$val, $pos); + $pos += 4; + } + my $n = Get8u(\$val, $pos++); + my (@association, @essential); + if ($flg & 0x01) { + return undef if $pos + $n * 2 > $len; + for ($j=0; $j<$n; ++$j) { + my $tmp = Get16u(\$val, $pos + $j * 2); + push @association, $tmp & 0x7fff; + push @essential, ($tmp & 0x8000) ? 1 : 0; + } + $pos += $n * 2; + } else { + return undef if $pos + $n > $len; + for ($j=0; $j<$n; ++$j) { + my $tmp = Get8u(\$val, $pos + $j); + push @association, $tmp & 0x7f; + push @essential, ($tmp & 0x80) ? 1 : 0; + } + $pos += $n; + } + $$items{$id}{Association} = \@association; + $$items{$id}{Essential} = \@essential; + $et->VPrint(1, "$$et{INDENT} Item $id properties: @association\n") if $verbose > 1; + } + return undef; +} + +#------------------------------------------------------------------------------ +# Process item information now +# Inputs: 0) ExifTool ref +sub HandleItemInfo($) +{ + my $et = shift; + my $raf = $$et{RAF}; + my $items = $$et{ItemInfo}; + my $verbose = $et->Options('Verbose'); + my $buff; + + # extract information from EXIF/XMP metadata items + if ($items and $raf) { + push @{$$et{PATH}}, 'ItemInformation'; + my $curPos = $raf->Tell(); + my $primary = $$et{PrimaryItem}; + my $id; + $et->VerboseDir('Processing items from ItemInformation', scalar(keys %$items)); + foreach $id (sort { $a <=> $b } keys %$items) { + my $item = $$items{$id}; + my $type = $$item{ContentType} || $$item{Type} || next; + if ($verbose) { + # add up total length of this item for the verbose output + my $len = 0; + if ($$item{Extents} and @{$$item{Extents}}) { + $len += $$_[2] foreach @{$$item{Extents}}; + } + $et->VPrint(0, "$$et{INDENT}Item $id) '${type}' ($len bytes)\n"); + } + # get ExifTool name for this item + my $name = { Exif => 'EXIF', 'application/rdf+xml' => 'XMP' }->{$type} || ''; + my ($warn, $extent); + $warn = "Can't currently decode encoded $type metadata" if $$item{ContentEncoding}; + $warn = "Can't currently decode protected $type metadata" if $$item{ProtectionIndex}; + $warn = "Can't currently extract $type with construction method $$item{ConstructionMethod}" if $$item{ConstructionMethod}; + $et->WarnOnce($warn) if $warn and $name; + $warn = 'Not this file' if $$item{DataReferenceIndex}; # (can only extract from "this file") + unless (($$item{Extents} and @{$$item{Extents}}) or $warn) { + $warn = "No Extents for $type item"; + $et->WarnOnce($warn) if $name; + } + if ($warn) { + $et->VPrint(0, "$$et{INDENT} [not extracted] ($warn)\n") if $verbose > 2; + next; + } + my $base = $$item{BaseOffset} || 0; + if ($verbose > 2) { + # do verbose hex dump + my $len = 0; + undef $buff; + my $val = ''; + my $maxLen = $verbose > 3 ? 2048 : 96; + foreach $extent (@{$$item{Extents}}) { + my $n = $$extent[2]; + my $more = $maxLen - $len; + if ($more > 0 and $n) { + $more = $n if $more > $n; + $val .= $buff if defined $buff; + $raf->Seek($$extent[1] + $base, 0) or last; + $raf->Read($buff, $more) or last; + } + $len += $n; + } + if (defined $buff) { + $buff = $val . $buff if length $val; + $et->VerboseDump(\$buff, DataPos => $$item{Extents}[0][1] + $base); + my $snip = $len - length $buff; + $et->VPrint(0, "$$et{INDENT} [snip $snip bytes]\n") if $snip; + } + } + next unless $name; + # assemble the data for this item + undef $buff; + my $val = ''; + foreach $extent (@{$$item{Extents}}) { + $val .= $buff if defined $buff; + $raf->Seek($$extent[1] + $base, 0) or last; + $raf->Read($buff, $$extent[2]) or last; + } + next unless defined $buff; + $buff = $val . $buff if length $val; + next unless length $buff; # ignore empty directories + my ($start, $subTable, $proc); + my $pos = $$item{Extents}[0][1] + $base; + if ($name eq 'EXIF' and length $buff >= 4) { + if ($buff =~ /^(MM\0\x2a|II\x2a\0)/) { + $et->Warn('Missing Exif header'); + $start = 0; + } elsif ($buff =~ /^Exif\0\0/) { + # (haven't seen this yet, but it is just a matter of time + # until someone screws it up like this) + $et->Warn('Missing Exif header size'); + $start = 6; + } else { + my $n = unpack('N', $buff); + $start = 4 + $n; # skip "Exif\0\0" header if it exists + if ($start > length($buff)) { + $et->Warn('Invalid EXIF header'); + next; + } + if ($$et{HTML_DUMP}) { + $et->HDump($pos, 4, 'Exif header length', "Value: $n"); + $et->HDump($pos+4, $start-4, 'Exif header') if $n; + } + } + $subTable = GetTagTable('Image::ExifTool::Exif::Main'); + $proc = \&Image::ExifTool::ProcessTIFF; + } else { + $start = 0; + $subTable = GetTagTable('Image::ExifTool::XMP::Main'); + } + my %dirInfo = ( + DataPt => \$buff, + DataLen => length $buff, + DirStart => $start, + DirLen => length($buff) - $start, + DataPos => $pos, + Base => $pos + $start, # (needed for HtmlDump and IsOffset tags in binary data) + ); + # handle processing of metadata for sub-documents + if (defined $primary and $$item{RefersTo} and not $$item{RefersTo}{$primary}) { + # set document number if this doesn't refer to the primary document + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + # associate this document number with the lowest item index + my ($lowest) = sort { $a <=> $b } keys %{$$item{RefersTo}}; + $$items{$lowest}{DocNum} = $$et{DOC_NUM}; + } + $et->ProcessDirectory(\%dirInfo, $subTable, $proc); + delete $$et{DOC_NUM}; + } + $raf->Seek($curPos, 0); # seek back to original position + pop @{$$et{PATH}}; + } + # process the item properties now that we should know their associations and document numbers + if ($$et{ItemPropertyContainer}) { + my ($dirInfo, $subTable, $proc) = @{$$et{ItemPropertyContainer}}; + $$et{IsItemProperty} = 1; # set item property flag + $et->ProcessDirectory($dirInfo, $subTable, $proc); + delete $$et{ItemPropertyContainer}; + delete $$et{IsItemProperty}; + delete $$et{DOC_NUM}; + } + delete $$et{ItemInfo}; +} + +#------------------------------------------------------------------------------ +# Warn if ExtractEmbedded option isn't used +# Inputs: 0) ExifTool ref +sub EEWarn($) +{ + my $et = shift; + $et->WarnOnce('The ExtractEmbedded option may find more tags in the media data',3); +} + +#------------------------------------------------------------------------------ +# Get quicktime format from flags word +# Inputs: 0) quicktime atom flags, 1) data length +# Returns: ExifTool format string +sub QuickTimeFormat($$) +{ + my ($flags, $len) = @_; + my $format; + if ($flags == 0x15 or $flags == 0x16) { + $format = { 1=>'int8', 2=>'int16', 4=>'int32', 8=>'int64' }->{$len}; + $format .= $flags == 0x15 ? 's' : 'u' if $format; + } elsif ($flags == 0x17) { + $format = 'float'; + } elsif ($flags == 0x18) { + $format = 'double'; + } elsif ($flags == 0x00) { + $format = { 1=>'int8u', 2=>'int16u' }->{$len}; + } + return $format; +} + +#------------------------------------------------------------------------------ +# Process MPEG-4 MTDT atom (ref 11) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessMetaData($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = length $$dataPt; + my $verbose = $et->Options('Verbose'); + return 0 unless $dirLen >= 2; + my $count = Get16u($dataPt, 0); + $verbose and $et->VerboseDir('MetaData', $count); + my $i; + my $pos = 2; + for ($i=0; $i<$count; ++$i) { + last if $pos + 10 > $dirLen; + my $size = Get16u($dataPt, $pos); + last if $size < 10 or $size + $pos > $dirLen; + my $tag = Get32u($dataPt, $pos + 2); + my $lang = Get16u($dataPt, $pos + 6); + my $enc = Get16u($dataPt, $pos + 8); + my $val = substr($$dataPt, $pos + 10, $size); + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($tagInfo) { + # convert language code to ASCII (ignore read-only bit) + $lang = UnpackLang($lang); + # handle alternate languages + if ($lang) { + my $langInfo = GetLangInfoQT($et, $tagInfo, $lang); + $tagInfo = $langInfo if $langInfo; + } + $verbose and $et->VerboseInfo($tag, $tagInfo, + Value => $val, + DataPt => $dataPt, + Start => $pos + 10, + Size => $size - 10, + ); + # convert from UTF-16 BE if necessary + $val = $et->Decode($val, 'UCS2') if $enc == 1; + if ($enc == 0 and $$tagInfo{Unknown}) { + # binary data + $et->FoundTag($tagInfo, \$val); + } else { + $et->FoundTag($tagInfo, $val); + } + } + $pos += $size; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process sample description table +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +# (ref https://developer.apple.com/library/content/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-25691) +sub ProcessSampleDesc($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $pos); + return 0 if $pos + 8 > $dirLen; + + my $num = Get32u($dataPt, 4); # get number of sample entries in table + $pos += 8; + my ($i, $err); + for ($i=0; $i<$num; ++$i) { # loop through sample entries + $pos + 8 > $dirLen and $err = 1, last; + my $size = Get32u($dataPt, $pos); + $pos + $size > $dirLen and $err = 1, last; + $$dirInfo{DirStart} = $pos; + $$dirInfo{DirLen} = $size; + ProcessHybrid($et, $dirInfo, $tagTablePtr); + $pos += $size; + } + if ($err and $$et{HandlerType}) { + my $grp = $$et{SET_GROUP1} || $$dirInfo{Parent} || 'unknown'; + $et->Warn("Truncated $$et{HandlerType} sample table for $grp"); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process hybrid binary data + QuickTime container (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessHybrid($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + # brute-force search for child atoms after first 8 bytes of binary data + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $dirStart; + my $end = $dirStart + $dirLen; + my $pos = $dirStart + 8; # skip length/version + my $try = $pos; + my $childPos; + + while ($pos <= $end - 8) { + my $tag = substr($$dataPt, $try+4, 4); + # look only for well-behaved tag ID's + $tag =~ /[^\w ]/ and $try = ++$pos, next; + my $size = Get32u($dataPt, $try); + if ($size + $try == $end) { + # the atom ends exactly at the end of the parent -- this must be it + $childPos = $pos; + $$dirInfo{DirLen} = $pos; # the binary data ends at the first child atom + last; + } + if ($size < 8 or $size + $try > $end - 8) { + $try = ++$pos; # fail. try next position + } else { + $try += $size; # could be another atom following this + } + } + # process binary data + $$dirInfo{MixedTags} = 1; # ignore non-integer tag ID's + $et->ProcessBinaryData($dirInfo, $tagTablePtr); + # process child atoms if found + if ($childPos) { + $$dirInfo{DirStart} = $childPos; + $$dirInfo{DirLen} = $end - $childPos; + ProcessMOV($et, $dirInfo, $tagTablePtr); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process iTunes 'righ' atom (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessRights($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{Base}; + my $dirLen = length $$dataPt; + my $unknown = $$et{OPTIONS}{Unknown} || $$et{OPTIONS}{Verbose}; + my $pos; + $et->VerboseDir('righ', $dirLen / 8); + for ($pos = 0; $pos + 8 <= $dirLen; $pos += 8) { + my $tag = substr($$dataPt, $pos, 4); + last if $tag eq "\0\0\0\0"; + my $val = substr($$dataPt, $pos + 4, 4); + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + unless ($tagInfo) { + next unless $unknown; + my $name = PrintableTagID($tag); + $tagInfo = { + Name => "Unknown_$name", + Description => "Unknown $name", + Unknown => 1, + }, + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + $val = '0x' . unpack('H*', $val) unless $$tagInfo{Format}; + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $pos + 4, + Size => 4, + ); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process iTunes Encoding Params (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessEncodingParams($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = length $$dataPt; + my $pos; + $et->VerboseDir('Encoding Params', $dirLen / 8); + for ($pos = 0; $pos + 8 <= $dirLen; $pos += 8) { + my ($tag, $val) = unpack("x${pos}a4N", $$dataPt); + $et->HandleTag($tagTablePtr, $tag, $val); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Read Meta Keys and add tags to ItemList table ('mdta' handler) (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessKeys($$$) +{ + local $_; + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = length $$dataPt; + my $out; + if ($et->Options('Verbose')) { + $et->VerboseDir('Keys'); + $out = $et->Options('TextOut'); + } + my $pos = 8; + my $index = 1; + ++$$et{KeysCount}; # increment key count for this directory + my $itemList = GetTagTable('Image::ExifTool::QuickTime::ItemList'); + my $userData = GetTagTable('Image::ExifTool::QuickTime::UserData'); + while ($pos < $dirLen - 4) { + my $len = unpack("x${pos}N", $$dataPt); + last if $len < 8 or $pos + $len > $dirLen; + delete $$tagTablePtr{$index}; + my $ns = substr($$dataPt, $pos + 4, 4); + my $tag = substr($$dataPt, $pos + 8, $len - 8); + $tag =~ s/\0.*//s; # truncate at null + my $full = $tag; + $tag =~ s/^com\.(apple\.quicktime\.)?// if $ns eq 'mdta'; # remove apple quicktime domain + $tag = "Tag_$ns" unless $tag; + my $short = $tag; + my $tagInfo; + for (;;) { + $tagInfo = $et->GetTagInfo($tagTablePtr, $tag) and last; + # also try ItemList and UserData tables + $tagInfo = $et->GetTagInfo($itemList, $tag) and last; + $tagInfo = $et->GetTagInfo($userData, $tag) and last; + # (I have some samples where the tag is a reversed ItemList or UserData tag ID) + if ($tag =~ /^\w{3}\xa9$/) { + $tag = pack('N', unpack('V', $tag)); + $tagInfo = $et->GetTagInfo($itemList, $tag) and last; + $tagInfo = $et->GetTagInfo($userData, $tag); + last; + } + if ($tag eq $full) { + $tag = $short; + last; + } + $tag = $full; + } + my ($newInfo, $msg); + if ($tagInfo) { + # copy tag information into new Keys tag + $newInfo = { + Name => $$tagInfo{Name}, + Format => $$tagInfo{Format}, + ValueConv => $$tagInfo{ValueConv}, + ValueConvInv => $$tagInfo{ValueConvInv}, + PrintConv => $$tagInfo{PrintConv}, + PrintConvInv => $$tagInfo{PrintConvInv}, + Writable => defined $$tagInfo{Writable} ? $$tagInfo{Writable} : 1, + SubDirectory => $$tagInfo{SubDirectory}, + }; + my $groups = $$tagInfo{Groups}; + $$newInfo{Groups} = $groups ? { %$groups } : { }; + $$newInfo{Groups}{$_} or $$newInfo{Groups}{$_} = $$tagTablePtr{GROUPS}{$_} foreach 0..2; + $$newInfo{Groups}{1} = 'Keys'; + } elsif ($tag =~ /^[-\w. ]+$/ or $tag =~ /\w{4}/) { + # create info for tags with reasonable id's + my $name = ucfirst $tag; + $name =~ tr/-0-9a-zA-Z_. //dc; + $name =~ s/[. ]+(.?)/\U$1/g; + $name =~ s/_([a-z])/_\U$1/g; + $name =~ s/([a-z])_([A-Z])/$1$2/g; + $name = "Tag_$name" if length $name < 2; + $newInfo = { Name => $name, Groups => { 1 => 'Keys' } }; + $msg = ' (Unknown)'; + } + # substitute this tag in the ItemList table with the given index + my $id = $$et{KeysCount} . '.' . $index; + if (ref $$itemList{$id} eq 'HASH') { + # delete other languages too if they exist + my $oldInfo = $$itemList{$id}; + if ($$oldInfo{OtherLang}) { + delete $$itemList{$_} foreach @{$$oldInfo{OtherLang}}; + } + delete $$itemList{$id}; + } + if ($newInfo) { + $$newInfo{KeysID} = $tag; # save original ID for use in family 7 group name + AddTagToTable($itemList, $id, $newInfo); + $msg or $msg = ''; + $out and print $out "$$et{INDENT}Added ItemList Tag $id = ($ns) $tag$msg\n"; + } + $pos += $len; + ++$index; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process keys in MetaSampleDesc directory +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessMetaKeys($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + # save this information to decode timed metadata samples when ExtractEmbedded is used + SaveMetaKeys($et, $dirInfo, $tagTablePtr) if $$et{OPTIONS}{ExtractEmbedded}; + return 1; +} + +#------------------------------------------------------------------------------ +# Process a QuickTime atom +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref +# Returns: 1 on success +sub ProcessMOV($$;$) +{ + local $_; + my ($et, $dirInfo, $tagTablePtr) = @_; + my $raf = $$dirInfo{RAF}; + my $dataPt = $$dirInfo{DataPt}; + my $verbose = $et->Options('Verbose'); + my $validate = $$et{OPTIONS}{Validate}; + my $dataPos = $$dirInfo{Base} || 0; + my $dirID = $$dirInfo{DirID} || ''; + my $charsetQuickTime = $et->Options('CharsetQuickTime'); + my ($buff, $tag, $size, $track, $isUserData, %triplet, $doDefaultLang, $index); + my ($dirEnd, $unkOpt, %saveOptions, $atomCount); + + my $topLevel = not $$et{InQuickTime}; + $$et{InQuickTime} = 1; + $$et{HandlerType} = $$et{MetaFormat} = '' unless defined $$et{HandlerType}; + + unless (defined $$et{KeysCount}) { + $$et{KeysCount} = 0; # initialize ItemList key directory count + $doDefaultLang = 1; # flag to generate default language tags + } + # more convenient to package data as a RandomAccess file + unless ($raf) { + $raf = new File::RandomAccess($dataPt); + $dirEnd = $dataPos + $$dirInfo{DirLen} + ($$dirInfo{DirStart} || 0) if $$dirInfo{DirLen}; + } + # skip leading bytes if necessary + if ($$dirInfo{DirStart}) { + $raf->Seek($$dirInfo{DirStart}, 1) or return 0; + $dataPos += $$dirInfo{DirStart}; + } + # read size/tag name atom header + $raf->Read($buff,8) == 8 or return 0; + $dataPos += 8; + if ($tagTablePtr) { + $isUserData = ($tagTablePtr eq \%Image::ExifTool::QuickTime::UserData); + } else { + $tagTablePtr = GetTagTable('Image::ExifTool::QuickTime::Main'); + } + ($size, $tag) = unpack('Na4', $buff); + if ($dataPt) { + $verbose and $et->VerboseDir($$dirInfo{DirName}); + } else { + # check on file type if called with a RAF + $$tagTablePtr{$tag} or return 0; + if ($tag eq 'ftyp' and $size >= 12) { + # read ftyp atom to see what type of file this is + my $fileType; + if ($raf->Read($buff, $size-8) == $size-8) { + $raf->Seek(-($size-8), 1); + my $type = substr($buff, 0, 4); + $$et{save_ftyp} = $type; + # see if we know the extension for this file type + if ($ftypLookup{$type} and $ftypLookup{$type} =~ /\(\.(\w+)/) { + $fileType = $1; + # check compatible brands + } elsif ($buff =~ /^.{8}(.{4})+(mp41|mp42|avc1)/s) { + $fileType = 'MP4'; + } elsif ($buff =~ /^.{8}(.{4})+(f4v )/s) { + $fileType = 'F4V'; + } elsif ($buff =~ /^.{8}(.{4})+(qt )/s) { + $fileType = 'MOV'; + } + } + $fileType or $fileType = 'MP4'; # default to MP4 + $et->SetFileType($fileType, $mimeLookup{$fileType} || 'video/mp4'); + # temporarily set ExtractEmbedded option for CRX files + $saveOptions{ExtractEmbedded} = $et->Options(ExtractEmbedded => 1) if $fileType eq 'CRX'; + } else { + $et->SetFileType(); # MOV + } + SetByteOrder('MM'); + $$et{PRIORITY_DIR} = 'XMP'; # have XMP take priority + } + $$raf{NoBuffer} = 1 if $et->Options('FastScan'); # disable buffering in FastScan mode + + my $ee = $$et{OPTIONS}{ExtractEmbedded}; + if ($ee) { + $unkOpt = $$et{OPTIONS}{Unknown}; + require 'Image/ExifTool/QuickTimeStream.pl'; + } + if ($$tagTablePtr{VARS}) { + $index = $$tagTablePtr{VARS}{START_INDEX}; + $atomCount = $$tagTablePtr{VARS}{ATOM_COUNT}; + } + for (;;) { + my ($eeTag, $ignore); + last if defined $atomCount and --$atomCount < 0; + if ($size < 8) { + if ($size == 0) { + if ($dataPt) { + # a zero size isn't legal for contained atoms, but Canon uses it to + # terminate the CNTH atom (eg. CanonEOS100D.mov), so tolerate it here + my $pos = $raf->Tell() - 4; + $raf->Seek(0,2); + my $str = $$dirInfo{DirName} . ' with ' . ($raf->Tell() - $pos) . ' bytes'; + $et->VPrint(0,"$$et{INDENT}\[Terminator found in $str remaining]"); + } else { + my $t = PrintableTagID($tag,2); + $et->VPrint(0,"$$et{INDENT}Tag '${t}' extends to end of file"); + if ($$tagTablePtr{"$tag-size"}) { + my $pos = $raf->Tell(); + $raf->Seek(0, 2); + $et->HandleTag($tagTablePtr, "$tag-size", $raf->Tell() - $pos); + $et->HandleTag($tagTablePtr, "$tag-offset", $pos) if $$tagTablePtr{"$tag-offset"}; + } + } + last; + } + $size == 1 or $et->Warn('Invalid atom size'), last; + # read extended atom size + $raf->Read($buff, 8) == 8 or $et->Warn('Truncated atom header'), last; + $dataPos += 8; + my ($hi, $lo) = unpack('NN', $buff); + if ($hi or $lo > 0x7fffffff) { + if ($hi > 0x7fffffff) { + $et->Warn('Invalid atom size'); + last; + } elsif (not $et->Options('LargeFileSupport')) { + $et->Warn('End of processing at large atom (LargeFileSupport not enabled)'); + last; + } + } + $size = $hi * 4294967296 + $lo - 16; + $size < 0 and $et->Warn('Invalid extended size'), last; + } else { + $size -= 8; + } + if ($validate) { + $$et{ValidatePath} or $$et{ValidatePath} = { }; + my $path = join('-', @{$$et{PATH}}, $tag); + $path =~ s/-Track-/-$$et{SET_GROUP1}-/ if $$et{SET_GROUP1}; + if ($$et{ValidatePath}{$path} and not $dupTagOK{$tag} and not $dupDirOK{$dirID}) { + my $i = Get32u(\$tag,0); + my $str = $i < 255 ? "index $i" : "tag '" . PrintableTagID($tag,2) . "'"; + $et->WarnOnce("Duplicate $str at " . join('-', @{$$et{PATH}})); + $$et{ValidatePath} = { } if $path eq 'MOV-moov'; # avoid warnings for all contained dups + } + $$et{ValidatePath}{$path} = 1; + } + if ($isUserData and $$et{SET_GROUP1}) { + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + # add track name to UserData tags inside tracks + $tag = $$et{SET_GROUP1} . $tag; + if (not $$tagTablePtr{$tag} and $tagInfo) { + my %newInfo = %$tagInfo; + foreach ('Name', 'Description') { + next unless $$tagInfo{$_}; + $newInfo{$_} = $$et{SET_GROUP1} . $$tagInfo{$_}; + $newInfo{$_} =~ s/^(Track\d+)Track/$1/; # remove duplicate "Track" in name + } + AddTagToTable($tagTablePtr, $tag, \%newInfo); + } + } + # set flag to store additional information for ExtractEmbedded option + my $handlerType = $$et{HandlerType}; + if ($eeBox{$handlerType} and $eeBox{$handlerType}{$tag}) { + if ($ee) { + # (there is another 'gps ' box with a track log that doesn't contain offsets) + if ($tag ne 'gps ' or $eeBox{$handlerType}{$tag} eq $dirID) { + $eeTag = 1; + $$et{OPTIONS}{Unknown} = 1; # temporarily enable "Unknown" option + } + } elsif ($handlerType ne 'vide' and not $$et{OPTIONS}{Validate}) { + EEWarn($et); + } + } elsif ($ee and $ee > 1 and $eeBox2{$handlerType} and $eeBox2{$handlerType}{$tag}) { + $eeTag = 1; + $$et{OPTIONS}{Unknown} = 1; + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + + $$et{OPTIONS}{Unknown} = $unkOpt if $eeTag; # restore Unknown option + + # allow numerical tag ID's + unless ($tagInfo) { + my $id = $$et{KeysCount} . '.' . unpack('N', $tag); + if ($$tagTablePtr{$id}) { + $tagInfo = $et->GetTagInfo($tagTablePtr, $id); + $tag = $id; + } + } + # generate tagInfo if Unknown option set + if (not defined $tagInfo and ($$et{OPTIONS}{Unknown} or + $verbose or $tag =~ /^\xa9/)) + { + my $name = PrintableTagID($tag,1); + if ($name =~ /^xa9(.*)/) { + $tagInfo = { + Name => "UserData_$1", + Description => "User Data $1", + }; + } else { + $tagInfo = { + Name => "Unknown_$name", + Description => "Unknown $name", + %unknownInfo, + }; + } + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + # save required tag sizes + if ($$tagTablePtr{"$tag-size"}) { + $et->HandleTag($tagTablePtr, "$tag-size", $size); + $et->HandleTag($tagTablePtr, "$tag-offset", $raf->Tell()) if $$tagTablePtr{"$tag-offset"}; + } + # load values only if associated with a tag (or verbose) and not too big + if ($size > 0x2000000) { # start to get worried above 32 MB + # check for RIFF trailer (written by Auto-Vox dashcam) + if ($buff =~ /^(gpsa|gps0|gsen|gsea)...\0/s) { # (yet seen only gpsa as first record) + $et->VPrint(0, "Found RIFF trailer"); + if ($et->Options('ExtractEmbedded')) { + $raf->Seek(-8, 1) or last; # seek back to start of trailer + my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream'); + ProcessRIFFTrailer($et, { RAF => $raf }, $tbl); + } else { + EEWarn($et); + } + last; + } + $ignore = 1; + if ($tagInfo and not $$tagInfo{Unknown} and not $eeTag) { + my $t = PrintableTagID($tag,2); + if ($size > 0x8000000) { + $et->Warn("Skipping '${t}' atom > 128 MB", 1); + } else { + $et->Warn("Skipping '${t}' atom > 32 MB", 2) or $ignore = 0; + } + } + } + if (defined $tagInfo and not $ignore) { + # set document number for this item property if necessary + if ($$et{IsItemProperty}) { + my $items = $$et{ItemInfo}; + my ($id, $prop, $docNum, $lowest); + my $primary = $$et{PrimaryItem} || 0; +ItemID: foreach $id (keys %$items) { + next unless $$items{$id}{Association}; + my $item = $$items{$id}; + foreach $prop (@{$$item{Association}}) { + next unless $prop == $index; + if ($id == $primary or (not $dontInherit{$tag} and + (not $$item{RefersTo} or $$item{RefersTo}{$primary}))) + { + # this is associated with the primary item or an item describing + # the primary item, so consider this part of the main document + undef $docNum; + undef $lowest; + last ItemID; + } elsif ($$item{DocNum}) { + # this property is already associated with an item that has + # an ExifTool document number, so use the lowest associated DocNum + $docNum = $$item{DocNum} if not defined $docNum or $docNum > $$item{DocNum}; + } elsif (not defined $lowest or $lowest > $id) { + # keep track of the lowest associated item ID + $lowest = $id; + } + } + } + if (not defined $docNum and defined $lowest) { + # this is the first time we've seen metadata from this item, + # so use a new document number + $docNum = ++$$et{DOC_COUNT}; + $$items{$lowest}{DocNum} = $docNum; + } + $$et{DOC_NUM} = $docNum; + } + my $val; + my $missing = $size - $raf->Read($val, $size); + if ($missing) { + my $t = PrintableTagID($tag,2); + $et->Warn("Truncated '${t}' data (missing $missing bytes)"); + last; + } + # use value to get tag info if necessary + $tagInfo or $tagInfo = $et->GetTagInfo($tagTablePtr, $tag, \$val); + my $hasData = ($$dirInfo{HasData} and $val =~ /\0...data\0/s); + if ($verbose and not $hasData) { + my $tval; + if ($tagInfo and $$tagInfo{Format}) { + $tval = ReadValue(\$val, 0, $$tagInfo{Format}, $$tagInfo{Count}, length($val)); + } + $et->VerboseInfo($tag, $tagInfo, + Value => $tval, + DataPt => \$val, + DataPos => $dataPos, + Size => $size, + Format => $tagInfo ? $$tagInfo{Format} : undef, + Index => $index, + ); + # print iref item ID numbers + if ($dirID eq 'iref') { + my ($id, $count, @to, $i); + if ($$et{ItemRefVersion}) { + ($id, $count, @to) = unpack('NnN*', $val) if length $val >= 10; + } else { + ($id, $count, @to) = unpack('nnn*', $val) if length $val >= 6; + } + defined $id or $id = '<err>', $count = 0; + $id .= " (wrong count: $count)" if $count != @to; + # convert sequential numbers to a range + for ($i=1; $i<@to; ) { + $to[$i-1] =~ /(\d+)$/ and $to[$i] == $1 + 1 or ++$i, next; + $to[$i-1] =~ s/(-.*)?$/-$to[$i]/; + splice @to, $i, 1; + } + $et->VPrint(1, "$$et{INDENT} Item $id refers to: ",join(',',@to),"\n"); + } + } + # extract metadata from stream if ExtractEmbedded option is enabled + if ($eeTag) { + ParseTag($et, $tag, \$val); + # forget this tag if we generated it only for ExtractEmbedded + undef $tagInfo if $tagInfo and $$tagInfo{Unknown} and not $unkOpt; + } + + # handle iTunesInfo mean/name/data triplets + if ($tagInfo and $$tagInfo{Triplet}) { + if ($tag eq 'data' and $triplet{mean} and $triplet{name}) { + $tag = $triplet{name}; + # add 'mean' to name unless it is 'com.apple.iTunes' + $tag = $triplet{mean} . '/' . $tag unless $triplet{mean} eq 'com.apple.iTunes'; + $tagInfo = $et->GetTagInfo($tagTablePtr, $tag, \$val); + unless ($tagInfo) { + my $name = $triplet{name}; + my $desc = $name; + $name =~ tr/-_a-zA-Z0-9//dc; + $desc =~ tr/_/ /; + $tagInfo = { + Name => $name, + Description => $desc, + }; + $et->VPrint(0, $$et{INDENT}, "[adding QuickTime:$name]\n"); + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + # ignore 8-byte header + $val = substr($val, 8) if length($val) >= 8; + unless ($$tagInfo{Format} or $$tagInfo{SubDirectory}) { + # extract as binary if it contains any non-ASCII or control characters + if ($val =~ /[^\x20-\x7e]/) { + my $buff = $val; + $val = \$buff; + } + } + $$tagInfo{List} = 1; # (allow any of these tags to have multiple data elements) + $et->VerboseInfo($tag, $tagInfo, Value => $val) if $verbose; + } else { + $triplet{$tag} = substr($val,4) if length($val) > 4; + undef $tagInfo; # don't store this tag + } + } + if ($tagInfo) { + my $subdir = $$tagInfo{SubDirectory}; + if ($subdir) { + my $start = $$subdir{Start} || 0; + my ($base, $dPos) = ($dataPos, 0); + if ($$subdir{Base}) { + $dPos -= eval $$subdir{Base}; + $base -= $dPos; + } + my %dirInfo = ( + DataPt => \$val, + DataLen => $size, + DirStart => $start, + DirLen => $size - $start, + DirName => $$subdir{DirName} || $$tagInfo{Name}, + DirID => $tag, + HasData => $$subdir{HasData}, + Multi => $$subdir{Multi}, + IgnoreProp => $$subdir{IgnoreProp}, # (XML hack) + DataPos => $dPos, + Base => $base, # (needed for IsOffset tags in binary data) + ); + $dirInfo{BlockInfo} = $tagInfo if $$tagInfo{BlockExtract}; + if ($$subdir{ByteOrder} and $$subdir{ByteOrder} =~ /^Little/) { + SetByteOrder('II'); + } + my $oldGroup1 = $$et{SET_GROUP1}; + if ($$tagInfo{SubDirectory} and $$tagInfo{SubDirectory}{TagTable} and + $$tagInfo{SubDirectory}{TagTable} eq 'Image::ExifTool::QuickTime::Track') + { + $track or $track = 0; + $$et{SET_GROUP1} = 'Track' . (++$track); + } + my $subTable = GetTagTable($$subdir{TagTable}); + my $proc = $$subdir{ProcessProc}; + # make ProcessMOV() the default processing procedure for subdirectories + $proc = \&ProcessMOV unless $proc or $$subTable{PROCESS_PROC}; + if ($size > $start) { + # delay processing of ipco box until after all other boxes + if ($tag eq 'ipco' and not $$et{IsItemProperty}) { + $$et{ItemPropertyContainer} = [ \%dirInfo, $subTable, $proc ]; + $et->VPrint(0,"$$et{INDENT}\[Process ipco box later]"); + } else { + $et->ProcessDirectory(\%dirInfo, $subTable, $proc); + } + } + if ($tag eq 'stbl') { + # process sample data when exiting SampleTable box if extracting embedded + ProcessSamples($et) if $ee; + } elsif ($tag eq 'minf') { + $$et{HandlerType} = ''; # reset handler type at end of media info box + } + $$et{SET_GROUP1} = $oldGroup1; + SetByteOrder('MM'); + } elsif ($hasData) { + # handle atoms containing 'data' tags + # (currently ignore contained atoms: 'itif', 'name', etc.) + my $pos = 0; + for (;;) { + last if $pos + 16 > $size; + my ($len, $type, $flags, $ctry, $lang) = unpack("x${pos}Na4Nnn", $val); + last if $pos + $len > $size or not $len; + my ($value, $langInfo, $oldDir); + my $format = $$tagInfo{Format}; + if ($type eq 'data' and $len >= 16) { + $pos += 16; + $len -= 16; + $value = substr($val, $pos, $len); + # format flags (ref 12): + # 0x0=binary, 0x1=UTF-8, 0x2=UTF-16, 0x3=ShiftJIS, + # 0x4=UTF-8 0x5=UTF-16, 0xd=JPEG, 0xe=PNG, + # 0x15=signed int, 0x16=unsigned int, 0x17=float, + # 0x18=double, 0x1b=BMP, 0x1c='meta' atom + if ($stringEncoding{$flags}) { + # handle all string formats + $value = $et->Decode($value, $stringEncoding{$flags}); + # (shouldn't be null terminated, but some software writes it anyway) + $value =~ s/\0$// unless $$tagInfo{Binary}; + } else { + if (not $format) { + $format = QuickTimeFormat($flags, $len); + } elsif ($format =~ /^int\d+([us])$/) { + # adjust integer to available length (but not int64) + my $fmt = { 1=>'int8', 2=>'int16', 4=>'int32' }->{$len}; + $format = $fmt . $1 if defined $fmt; + } + if ($format) { + $value = ReadValue(\$value, 0, $format, $$tagInfo{Count}, $len); + } elsif (not $$tagInfo{ValueConv}) { + # make binary data a scalar reference unless a ValueConv exists + my $buf = $value; + $value = \$buf; + } + } + } + if ($ctry or $lang) { + my $langCode = GetLangCode($lang, $ctry); + if ($langCode) { + # get tagInfo for other language + $langInfo = GetLangInfoQT($et, $tagInfo, $langCode); + # save other language tag ID's so we can delete later if necessary + if ($langInfo) { + $$tagInfo{OtherLang} or $$tagInfo{OtherLang} = [ ]; + push @{$$tagInfo{OtherLang}}, $$langInfo{TagID}; + } + } + } + $langInfo or $langInfo = $tagInfo; + $et->VerboseInfo($tag, $langInfo, + Value => ref $value ? $$value : $value, + DataPt => \$val, + DataPos => $dataPos, + Start => $pos, + Size => $len, + Format => $format, + Index => $index, + Extra => sprintf(", Type='${type}', Flags=0x%x, Lang=0x%.4x",$flags,$lang), + ) if $verbose; + # use "Keys" in path instead of ItemList if this was defined by a Keys tag + my $isKey = $$tagInfo{Groups} && $$tagInfo{Groups}{1} && $$tagInfo{Groups}{1} eq 'Keys'; + if ($isKey) { + $oldDir = $$et{PATH}[-1]; + $$et{PATH}[-1] = 'Keys'; + } + $et->FoundTag($langInfo, $value) if defined $value; + $$et{PATH}[-1] = $oldDir if $isKey; + $pos += $len; + } + } elsif ($tag =~ /^\xa9/ or $$tagInfo{IText}) { + # parse international text to extract all languages + my $pos = 0; + if ($$tagInfo{Format}) { + $et->FoundTag($tagInfo, ReadValue(\$val, 0, $$tagInfo{Format}, undef, length($val))); + $pos = $size; + } + for (;;) { + my ($len, $lang); + if ($$tagInfo{IText} and $$tagInfo{IText} >= 6) { + last if $pos + $$tagInfo{IText} > $size; + $pos += $$tagInfo{IText} - 2; + $lang = unpack("x${pos}n", $val); + $pos += 2; + $len = $size - $pos; + } else { + last if $pos + 4 > $size; + ($len, $lang) = unpack("x${pos}nn", $val); + $pos += 4; + # according to the QuickTime spec (ref 12), $len should include + # 4 bytes for length and type words, but nobody (including + # Apple, Pentax and Kodak) seems to add these in, so try + # to allow for either + if ($pos + $len > $size) { + $len -= 4; + last if $pos + $len > $size or $len < 0; + } + } + # ignore any empty entries (or null padding) after the first + next if not $len and $pos; + my $str = substr($val, $pos, $len); + my ($langInfo, $enc); + if (($lang < 0x400 or $lang == 0x7fff) and $str !~ /^\xfe\xff/) { + # this is a Macintosh language code + # a language code of 0 is Macintosh english, so treat as default + if ($lang) { + if ($lang == 0x7fff) { + # technically, ISO 639-2 doesn't have a 2-character + # equivalent for 'und', but use 'un' anyway + $lang = 'un'; + } else { + # use Font.pm to look up language string + require Image::ExifTool::Font; + $lang = $Image::ExifTool::Font::ttLang{Macintosh}{$lang}; + } + } + # the spec says only "Macintosh text encoding", but + # allow this to be configured by the user + $enc = $charsetQuickTime; + } else { + # convert language code to ASCII (ignore read-only bit) + $lang = UnpackLang($lang); + # may be either UTF-8 or UTF-16BE + $enc = $str=~s/^\xfe\xff// ? 'UTF16' : 'UTF8'; + } + unless ($$tagInfo{NoDecode}) { + $str = $et->Decode($str, $enc); + $str =~ s/\0+$//; # remove any trailing nulls (eg. 3gp tags) + } + if ($$tagInfo{IText} and $$tagInfo{IText} > 6) { + my $n = $$tagInfo{IText} - 6; + # add back extra bytes (eg. 'rtng' box) + $str = substr($val, $pos-$n-2, $n) . $str; + } + $langInfo = GetLangInfoQT($et, $tagInfo, $lang) if $lang; + $et->FoundTag($langInfo || $tagInfo, $str); + $pos += $len; + } + } else { + my $format = $$tagInfo{Format}; + if ($format) { + $val = ReadValue(\$val, 0, $format, $$tagInfo{Count}, length($val)); + } + my $oldBase; + if ($$tagInfo{SetBase}) { + $oldBase = $$et{BASE}; + $$et{BASE} = $dataPos; + } + my $key = $et->FoundTag($tagInfo, $val); + $$et{BASE} = $oldBase if defined $oldBase; + # decode if necessary (NOTE: must be done after RawConv) + if (defined $key and (not $format or $format =~ /^string/) and + not $$tagInfo{Unknown} and not $$tagInfo{ValueConv} and + not $$tagInfo{Binary} and defined $$et{VALUE}{$key} and not ref $val) + { + my $vp = \$$et{VALUE}{$key}; + if (not ref $$vp and length($$vp) <= 65536 and $$vp =~ /[\x80-\xff]/) { + # the encoding of this is not specified, so use CharsetQuickTime + # unless the string is valid UTF-8 + require Image::ExifTool::XMP; + my $enc = Image::ExifTool::XMP::IsUTF8($vp) > 0 ? 'UTF8' : $charsetQuickTime; + $$vp = $et->Decode($$vp, $enc); + } + } + } + } + } else { + $et->VerboseInfo($tag, $tagInfo, + Size => $size, + Extra => sprintf(' at offset 0x%.4x', $raf->Tell()), + ) if $verbose; + if ($size and (not $raf->Seek($size-1, 1) or $raf->Read($buff, 1) != 1)) { + my $t = PrintableTagID($tag,2); + $et->Warn("Truncated '${t}' data"); + last; + } + } + $dataPos += $size + 8; # point to start of next atom data + last if $dirEnd and $dataPos >= $dirEnd; # (note: ignores last value if 0 bytes) + $raf->Read($buff, 8) == 8 or last; + ($size, $tag) = unpack('Na4', $buff); + ++$index if defined $index; + } + # tweak file type based on track content ("iso*" and "dash" ftyp only) + if ($topLevel and $$et{VALUE}{FileType} and $$et{VALUE}{FileType} eq 'MP4' and + $$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^(iso|dash)/ and + $$et{HasHandler}{soun} and not $$et{HasHandler}{vide}) + { + $et->OverrideFileType('M4A', 'audio/mp4'); + } + # fill in missing defaults for alternate language tags + # (the first language is taken as the default) + if ($doDefaultLang and $$et{QTLang}) { +QTLang: foreach $tag (@{$$et{QTLang}}) { + next unless defined $$et{VALUE}{$tag}; + my $langInfo = $$et{TAG_INFO}{$tag} or next; + my $tagInfo = $$langInfo{SrcTagInfo} or next; + my $infoHash = $$et{TAG_INFO}; + my $name = $$tagInfo{Name}; + # loop through all instances of this tag name and generate the default-language + # version only if we don't already have a QuickTime tag with this name + my ($i, $key); + for ($i=0, $key=$name; $$infoHash{$key}; ++$i, $key="$name ($i)") { + next QTLang if $et->GetGroup($key, 0) eq 'QuickTime'; + } + $et->FoundTag($tagInfo, $$et{VALUE}{$tag}); + } + delete $$et{QTLang}; + } + # process item information now that we are done processing its 'meta' container + HandleItemInfo($et) if $topLevel or $dirID eq 'meta'; + + ScanMediaData($et) if $ee and $topLevel; # brute force scan for metadata embedded in media data + + # restore any changed options + $et->Options($_ => $saveOptions{$_}) foreach keys %saveOptions; + return 1; +} + +#------------------------------------------------------------------------------ +# Process a QuickTime Image File +# Inputs: 0) ExifTool object reference, 1) directory information reference +# Returns: 1 on success +sub ProcessQTIF($$) +{ + my ($et, $dirInfo) = @_; + my $table = GetTagTable('Image::ExifTool::QuickTime::ImageFile'); + return ProcessMOV($et, $dirInfo, $table); +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::QuickTime - Read QuickTime and MP4 meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to extract +information from QuickTime and MP4 video, M4A audio, and HEIC image files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html> + +=item L<http://search.cpan.org/dist/MP4-Info-1.04/> + +=item L<http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt> + +=item L<http://wiki.multimedia.cx/index.php?title=Apple_QuickTime> + +=item L<http://atomicparsley.sourceforge.net/mpeg-4files.html> + +=item L<http://wiki.multimedia.cx/index.php?title=QuickTime_container> + +=item L<http://code.google.com/p/mp4v2/wiki/iTunesMetadata> + +=item L<http://www.canieti.com.mx/assets/files/1011/IEC_100_1384_DC.pdf> + +=item L<http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/QuickTime Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/QuickTimeStream.pl b/lib/Image/ExifTool/QuickTimeStream.pl new file mode 100644 index 0000000..284caba --- /dev/null +++ b/lib/Image/ExifTool/QuickTimeStream.pl @@ -0,0 +1,2934 @@ +#------------------------------------------------------------------------------ +# File: QuickTimeStream.pl +# +# Description: Extract embedded information from QuickTime media data +# +# Revisions: 2018-01-03 - P. Harvey Created +# +# References: 1) https://developer.apple.com/library/content/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-SW130 +# 2) http://sergei.nz/files/nvtk_mp42gpx.py +# 3) https://forum.flitsservice.nl/dashcam-info/dod-ls460w-gps-data-uit-mov-bestand-lezen-t87926.html +# 4) https://developers.google.com/streetview/publish/camm-spec +# 5) https://sergei.nz/extracting-gps-data-from-viofo-a119-and-other-novatek-powered-cameras/ +# 6) Thomas Allen https://github.com/exiftool/exiftool/pull/62 +#------------------------------------------------------------------------------ +package Image::ExifTool::QuickTime; + +use strict; + +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::QuickTime; + +sub Process_tx3g($$$); +sub Process_marl($$$); +sub Process_mebx($$$); +sub ProcessFreeGPS($$$); +sub ProcessFreeGPS2($$$); +sub Process360Fly($$$); +sub ProcessFMAS($$$); + +# QuickTime data types that have ExifTool equivalents +# (ref https://developer.apple.com/library/content/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW35) +my %qtFmt = ( + 0 => 'undef', + 1 => 'string', # (UTF-8) + # 2 - UTF-16 + # 3 - shift-JIS + # 4 - UTF-8 sort + # 5 - UTF-16 sort + # 13 - JPEG image + # 14 - PNG image + # 21 - signed integer (1,2,3 or 4 bytes) + # 22 - unsigned integer (1,2,3 or 4 bytes) + 23 => 'float', + 24 => 'double', + # 27 - BMP image + # 28 - QuickTime atom + 65 => 'int8s', + 66 => 'int16s', + 67 => 'int32s', + 70 => 'float', # float[2] x,y + 71 => 'float', # float[2] width,height + 72 => 'float', # float[4] x,y,width,height + 74 => 'int64s', + 75 => 'int8u', + 76 => 'int16u', + 77 => 'int32u', + 78 => 'int64u', + 79 => 'float', # float[9] transform matrix + 80 => 'float', # float[8] face coordinates +); + +# maximums for validating H,M,S,d,m,Y from "freeGPS " metadata +my @dateMax = ( 24, 59, 59, 2200, 12, 31 ); + +# typical (minimum?) size of freeGPS block +my $gpsBlockSize = 0x8000; + +# conversion factors +my $knotsToKph = 1.852; # knots --> km/h +my $mpsToKph = 3.6; # m/s --> km/h +my $mphToKph = 1.60934; # mph --> km/h + +# handler types to process based on MetaFormat/OtherFormat +my %processByMetaFormat = ( + meta => 1, # ('CTMD' in CR3 images, 'priv' unknown in DJI video) + data => 1, # ('RVMI') + sbtl => 1, # (subtitle; 'tx3g' in Yuneec drone videos) + ctbx => 1, # ('marl' in GM videos) +); + +# data lengths for each INSV record type +my %insvDataLen = ( + 0x300 => 0, # accelerometer (could be either 20 or 56 bytes) + 0x400 => 16, # exposure (ref 6) + 0x600 => 8, # timestamps (ref 6) + 0x700 => 53, # GPS +); + +# limit the default amount of data we read for some record types +# (to avoid running out of memory) +my %insvLimit = ( + 0x300 => [ 'accelerometer', 20000 ], # maximum of 20000 accelerometer records +); + +# tags extracted from various QuickTime data streams +%Image::ExifTool::QuickTime::Stream = ( + GROUPS => { 2 => 'Location' }, + NOTES => q{ + The tags below are extracted from timed metadata in QuickTime and other + formats of video files when the ExtractEmbedded option is used. Although + most of these tags are combined into the single table below, ExifTool + currently reads 59 different formats of timed GPS metadata from video files. + }, + VARS => { NO_ID => 1 }, + GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' }, + GPSLongitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")' }, + GPSAltitude => { PrintConv => '(sprintf("%.4f", $val) + 0) . " m"' }, # round to 4 decimals + GPSSpeed => { PrintConv => 'sprintf("%.4f", $val) + 0', Notes => 'in km/h unless GPSSpeedRef says otherwise' }, + GPSSpeedRef => { PrintConv => { K => 'km/h', M => 'mph', N => 'knots' } }, + GPSTrack => { PrintConv => 'sprintf("%.4f", $val) + 0', Notes => 'relative to true north unless GPSTrackRef says otherwise' }, + GPSTrackRef => { PrintConv => { M => 'Magnetic North', T => 'True North' } }, + GPSDateTime => { + Groups => { 2 => 'Time' }, + Description => 'GPS Date/Time', + RawConv => '$$self{FoundGPSDateTime} = 1; $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + GPSTimeStamp => { PrintConv => 'Image::ExifTool::GPS::PrintTimeStamp($val)', Groups => { 2 => 'Time' } }, + GPSSatellites=> { }, + GPSDOP => { Description => 'GPS Dilution Of Precision' }, + Distance => { PrintConv => '"$val m"' }, + VerticalSpeed=> { PrintConv => '"$val m/s"' }, + FNumber => { PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', Groups => { 2 => 'Camera' } }, + ExposureTime => { PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', Groups => { 2 => 'Camera' } }, + ExposureCompensation => { PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', Groups => { 2 => 'Camera' } }, + ISO => { Groups => { 2 => 'Camera' } }, + CameraDateTime=>{ PrintConv => '$self->ConvertDateTime($val)', Groups => { 2 => 'Time' } }, + VideoTimeStamp => { Groups => { 2 => 'Video' } }, + Accelerometer=> { Notes => '3-axis acceleration in units of g' }, + AccelerometerData => { }, + AngularVelocity => { }, + GSensor => { }, + Car => { }, + RawGSensor => { + # (same as GSensor, but offset by some unknown value) + ValueConv => 'my @a=split " ",$val; $_/=1000 foreach @a; "@a"', + }, + Text => { Groups => { 2 => 'Other' } }, + TimeCode => { Groups => { 2 => 'Video' } }, + FrameNumber => { Groups => { 2 => 'Video' } }, + SampleTime => { Groups => { 2 => 'Video' }, PrintConv => 'ConvertDuration($val)', Notes => 'sample decoding time' }, + SampleDuration=>{ Groups => { 2 => 'Video' }, PrintConv => 'ConvertDuration($val)' }, + UserLabel => { Groups => { 2 => 'Other' } }, + KiloCalories => { Groups => { 2 => 'Other' } }, + SampleDateTime => { + Groups => { 2 => 'Time' }, + ValueConv => q{ + my $str = ConvertUnixTime($val); + my $frac = $val - int($val); + if ($frac != 0) { + $frac = sprintf('%.6f', $frac); + $frac =~ s/^0//; + $frac =~ s/0+$//; + $str .= $frac; + } + return $str; + }, + PrintConv => '$self->ConvertDateTime($val)', + }, +# +# timed metadata decoded based on MetaFormat (format of 'meta' or 'data' sample description) +# [or HandlerType, or specific 'vide' type if specified] +# + mebx => { + Name => 'mebx', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Keys', + ProcessProc => \&Process_mebx, + }, + }, + gpmd => [{ + Name => 'gpmd_Kingslim', # Kingslim D4 dashcam + Condition => '$$valPt =~ /^.{21}\0\0\0A[NS][EW]/s', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Stream', + ProcessProc => \&ProcessFreeGPS, + }, + },{ + Name => 'gpmd_Rove', # Rove Stealth 4K encrypted text + Condition => '$$valPt =~ /^\0\0\xf2\xe1\xf0\xeeTT/', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Stream', + ProcessProc => \&Process_text, + }, + },{ + Name => 'gpmd_FMAS', # Vantrue N2S binary format + Condition => '$$valPt =~ /^FMAS\0\0\0\0/', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Stream', + ProcessProc => \&ProcessFMAS, + }, + },{ + Name => 'gpmd_GoPro', + SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPMF' }, + }], + fdsc => { + Name => 'fdsc', + Condition => '$$valPt =~ /^GPRO/', + # (other types of "fdsc" samples aren't yet parsed: /^GP\x00/ and /^GP\x04/) + SubDirectory => { TagTable => 'Image::ExifTool::GoPro::fdsc' }, + }, + rtmd => { + Name => 'rtmd', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::rtmd' }, + }, + marl => { + Name => 'marl', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::marl' }, + }, + CTMD => { # (Canon Timed MetaData) + Name => 'CTMD', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CTMD' }, + }, + tx3g => { + Name => 'tx3g', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::tx3g' }, + }, + RVMI => [{ # data "OtherFormat" written by unknown software + Name => 'RVMI_gReV', + Condition => '$$valPt =~ /^gReV/', # GPS data + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::RVMI_gReV', + ByteOrder => 'Little-endian', + }, + },{ + Name => 'RVMI_sReV', + Condition => '$$valPt =~ /^sReV/', # sensor data + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::RVMI_sReV', + ByteOrder => 'Little-endian', + }, + # (there is also "tReV" data that hasn't been decoded yet) + }], + camm => [{ + Name => 'camm0', + # (according to the spec. the first 2 bytes are reserved and should be zero, + # but I have a sample where these bytes are non-zero, so allow anything here) + Condition => '$$valPt =~ /^..\0\0/s', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::camm0', + ByteOrder => 'Little-Endian', + }, + },{ + Name => 'camm1', + Condition => '$$valPt =~ /^..\x01\0/s', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::camm1', + ByteOrder => 'Little-Endian', + }, + },{ # (written by Insta360) - [HandlerType, not MetaFormat] + Name => 'camm2', + Condition => '$$valPt =~ /^..\x02\0/s', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::camm2', + ByteOrder => 'Little-Endian', + }, + },{ + Name => 'camm3', + Condition => '$$valPt =~ /^..\x03\0/s', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::camm3', + ByteOrder => 'Little-Endian', + }, + },{ + Name => 'camm4', + Condition => '$$valPt =~ /^..\x04\0/s', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::camm4', + ByteOrder => 'Little-Endian', + }, + },{ + Name => 'camm5', + Condition => '$$valPt =~ /^..\x05\0/s', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::camm5', + ByteOrder => 'Little-Endian', + }, + },{ + Name => 'camm6', + Condition => '$$valPt =~ /^..\x06\0/s', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::camm6', + ByteOrder => 'Little-Endian', + }, + },{ + Name => 'camm7', + Condition => '$$valPt =~ /^..\x07\0/s', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::camm7', + ByteOrder => 'Little-Endian', + }, + }], + mett => { # Parrot drones + Name => 'mett', + SubDirectory => { TagTable => 'Image::ExifTool::Parrot::mett' }, + }, + JPEG => { # (in CR3 images) - [vide HandlerType with JPEG in SampleDescription, not MetaFormat] + Name => 'JpgFromRaw', + Groups => { 2 => 'Preview' }, + RawConv => '$self->ValidateImage(\$val,$tag)', + }, + text => { # (TomTom Bandit MP4) - [sbtl HandlerType with 'text' in SampleDescription] + Name => 'PreviewInfo', + Condition => 'length $$valPt > 12 and Get32u($valPt,4) == length($$valPt) and $$valPt =~ /^.{8}\xff\xd8\xff/s', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::PreviewInfo' }, + }, + INSV => { + Groups => { 0 => 'Trailer', 1 => 'Insta360' }, # (so these groups will appear in the -listg options) + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::INSV_MakerNotes' }, + }, + Unknown00 => { Unknown => 1 }, + Unknown01 => { Unknown => 1 }, + Unknown02 => { Unknown => 1 }, + Unknown03 => { Unknown => 1 }, +); + +# tags found in 'camm' type 0 timed metadata (ref 4) +%Image::ExifTool::QuickTime::camm0 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + FIRST_ENTRY => 0, + NOTES => q{ + The camm0 through camm7 tables define tags extracted from the Google Street + View Camera Motion Metadata of MP4 videos. See + L<https://developers.google.com/streetview/publish/camm-spec> for the + specification. + }, + 4 => { + Name => 'AngleAxis', + Notes => 'angle axis orientation in radians in local coordinate system', + Format => 'float[3]', + }, +); + +# tags found in 'camm' type 1 timed metadata (ref 4) +%Image::ExifTool::QuickTime::camm1 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Camera' }, + FIRST_ENTRY => 0, + 4 => { + Name => 'PixelExposureTime', + Format => 'int32s', + ValueConv => '$val * 1e-9', + PrintConv => 'sprintf("%.4g ms", $val * 1000)', + }, + 8 => { + Name => 'RollingShutterSkewTime', + Format => 'int32s', + ValueConv => '$val * 1e-9', + PrintConv => 'sprintf("%.4g ms", $val * 1000)', + }, +); + +# tags found in 'camm' type 2 timed metadata (ref PH, Insta360Pro) +%Image::ExifTool::QuickTime::camm2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + FIRST_ENTRY => 0, + 4 => { + Name => 'AngularVelocity', + Notes => 'gyro angular velocity about X, Y and Z axes in rad/s', + Format => 'float[3]', + }, +); + +# tags found in 'camm' type 3 timed metadata (ref PH, Insta360Pro) +%Image::ExifTool::QuickTime::camm3 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + FIRST_ENTRY => 0, + 4 => { + Name => 'Acceleration', + Notes => 'acceleration in the X, Y and Z directions in m/s^2', + Format => 'float[3]', + }, +); + +# tags found in 'camm' type 4 timed metadata (ref 4) +%Image::ExifTool::QuickTime::camm4 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + FIRST_ENTRY => 0, + 4 => { + Name => 'Position', + Notes => 'X, Y, Z position in local coordinate system', + Format => 'float[3]', + }, +); + +# tags found in 'camm' type 5 timed metadata (ref 4) +%Image::ExifTool::QuickTime::camm5 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + FIRST_ENTRY => 0, + 4 => { + Name => 'GPSLatitude', + Format => 'double', + RawConv => '$$self{FoundGPSLatitude} = 1; $val', + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + 12 => { + Name => 'GPSLongitude', + Format => 'double', + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + 20 => { + Name => 'GPSAltitude', + Format => 'double', + PrintConv => '$_ = sprintf("%.6f", $val); s/\.?0+$//; "$_ m"', + }, +); + +# tags found in 'camm' type 6 timed metadata (ref PH/4, Insta360) +%Image::ExifTool::QuickTime::camm6 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + FIRST_ENTRY => 0, + 0x04 => { + Name => 'GPSDateTime', + Description => 'GPS Date/Time', + Groups => { 2 => 'Time' }, + Format => 'double', + RawConv => '$$self{FoundGPSDateTime} = 1; $val', + # by the specification, this should use the GPS epoch of Jan 6, 1980, + # but I have samples which use the Unix epoch of Jan 1, 1970, so convert + # to the Unix Epoch only if it doesn't match the CreateDate within 5 years + ValueConv => q{ + my $offset = 315964800; + if ($$self{CreateDate} and $$self{CreateDate} - $val > 24 * 3600 * 365 * 5) { + $val += $offset; + } + my $str = ConvertUnixTime($val); + my $frac = $val - int($val); + if ($frac != 0) { + $frac = sprintf('%.6f', $frac); + $frac =~ s/^0//; + $frac =~ s/0+$//; + $str .= $frac; + } + return $str . 'Z'; + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x0c => { + Name => 'GPSMeasureMode', + Format => 'int32u', + PrintConv => { + 0 => 'No Measurement', + 2 => '2-Dimensional Measurement', + 3 => '3-Dimensional Measurement', + }, + }, + 0x10 => { + Name => 'GPSLatitude', + Format => 'double', + RawConv => '$$self{FoundGPSLatitude} = 1; $val', + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + 0x18 => { + Name => 'GPSLongitude', + Format => 'double', + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + 0x20 => { + Name => 'GPSAltitude', + Format => 'float', + PrintConv => '$_ = sprintf("%.3f", $val); s/\.?0+$//; "$_ m"', + }, + 0x24 => { Name => 'GPSHorizontalAccuracy', Format => 'float', Notes => 'metres' }, + 0x28 => { Name => 'GPSVerticalAccuracy', Format => 'float' }, + 0x2c => { Name => 'GPSVelocityEast', Format => 'float', Notes => 'm/s' }, + 0x30 => { Name => 'GPSVelocityNorth', Format => 'float' }, + 0x34 => { Name => 'GPSVelocityUp', Format => 'float' }, + 0x38 => { Name => 'GPSSpeedAccuracy', Format => 'float' }, +); + +# tags found in 'camm' type 7 timed metadata (ref 4) +%Image::ExifTool::QuickTime::camm7 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + FIRST_ENTRY => 0, + 4 => { + Name => 'MagneticField', + Format => 'float[3]', + Notes => 'microtesla', + }, +); + +# preview image stored by TomTom Bandit ActionCam +%Image::ExifTool::QuickTime::PreviewInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, + NOTES => 'Preview stored by TomTom Bandit ActionCam.', + 8 => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Binary => 1, + Format => 'undef[$size-8]', + }, +); + +# tags found in 'RVMI' 'gReV' timed metadata (ref PH) +%Image::ExifTool::QuickTime::RVMI_gReV = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + FIRST_ENTRY => 0, + NOTES => 'GPS information extracted from the RVMI box of MOV videos.', + 4 => { + Name => 'GPSLatitude', + Format => 'int32s', + RawConv => '$$self{FoundGPSLatitude} = 1; $val', + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val/1e6, 1)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + 8 => { + Name => 'GPSLongitude', + Format => 'int32s', + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val/1e6, 1)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + # 12 - int32s: space for altitude? (always zero in my sample) + 16 => { + Name => 'GPSSpeed', # km/h + Format => 'int16s', + ValueConv => '$val / 10', + }, + 18 => { + Name => 'GPSTrack', + Format => 'int16u', + ValueConv => '$val * 2', + }, +); + +# tags found in 'RVMI' 'sReV' timed metadata (ref PH) +%Image::ExifTool::QuickTime::RVMI_sReV = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + FIRST_ENTRY => 0, + NOTES => q{ + G-sensor information extracted from the RVMI box of MOV videos. + }, + 4 => { + Name => 'GSensor', + Format => 'int16s[3]', # X Y Z + ValueConv => 'my @a=split " ",$val; $_/=1000 foreach @a; "@a"', + }, +); + +# tags found in 'tx3g' sbtl timed metadata (ref PH) +%Image::ExifTool::QuickTime::tx3g = ( + PROCESS_PROC => \&Process_tx3g, + GROUPS => { 2 => 'Location' }, + FIRST_ENTRY => 0, + NOTES => q{ + Tags extracted from the tx3g sbtl timed metadata of Yuneec drones, and + subtitle text in some other videos. + }, + Lat => { + Name => 'GPSLatitude', + RawConv => '$$self{FoundGPSLatitude} = 1; $val', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + Lon => { + Name => 'GPSLongitude', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + Alt => { + Name => 'GPSAltitude', + ValueConv => '$val =~ s/\s*m$//; $val', # remove " m" + PrintConv => '"$val m"', # add it back again + }, + Yaw => 'Yaw', + Pitch => 'Pitch', + Roll => 'Roll', + GimYaw => 'GimbalYaw', + GimPitch => 'GimbalPitch', + GimRoll => 'GimbalRoll', + DateTime => { # for date/time-format subtitle text + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + Text => { Groups => { 2 => 'Other' } }, +); + +%Image::ExifTool::QuickTime::INSV_MakerNotes = ( + GROUPS => { 1 => 'MakerNotes', 2 => 'Camera' }, + 0x0a => 'SerialNumber', + 0x12 => 'Model', + 0x1a => 'Firmware', + 0x2a => { + Name => 'Parameters', + ValueConv => '$val =~ tr/_/ /; $val', + }, +); + +%Image::ExifTool::QuickTime::Tags360Fly = ( + PROCESS_PROC => \&Process360Fly, + NOTES => 'Timed metadata found in MP4 videos from the 360Fly.', + 1 => { + Name => 'Accel360Fly', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Accel360Fly' }, + }, + 2 => { + Name => 'Gyro360Fly', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Gyro360Fly' }, + }, + 3 => { + Name => 'Mag360Fly', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Mag360Fly' }, + }, + 5 => { + Name => 'GPS360Fly', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::GPS360Fly' }, + }, + 6 => { + Name => 'Rot360Fly', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Rot360Fly' }, + }, + 250 => { + Name => 'Fusion360Fly', + SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Fusion360Fly' }, + }, +); + +%Image::ExifTool::QuickTime::Accel360Fly = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + 1 => { Name => 'AccelMode', Unknown => 1 }, # (always 2 in my sample) + 2 => { + Name => 'SampleTime', + Groups => { 2 => 'Video' }, + Format => 'int64u', + ValueConv => '$val / 1e6', + PrintConv => 'ConvertDuration($val)', + }, + 10 => { Name => 'AccelYPR', Format => 'float[3]' }, +); + +%Image::ExifTool::QuickTime::Gyro360Fly = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + 1 => { Name => 'GyroMode', Unknown => 1 }, # (always 1 in my sample) + 2 => { + Name => 'SampleTime', + Groups => { 2 => 'Video' }, + Format => 'int64u', + ValueConv => '$val / 1e6', + PrintConv => 'ConvertDuration($val)', + }, + 10 => { Name => 'GyroYPR', Format => 'float[3]' }, +); + +%Image::ExifTool::QuickTime::Mag360Fly = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + 1 => { Name => 'MagMode', Unknown => 1 }, # (always 1 in my sample) + 2 => { + Name => 'SampleTime', + Groups => { 2 => 'Video' }, + Format => 'int64u', + ValueConv => '$val / 1e6', + PrintConv => 'ConvertDuration($val)', + }, + 10 => { Name => 'MagnetometerXYZ', Format => 'float[3]' }, +); + +%Image::ExifTool::QuickTime::GPS360Fly = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + 1 => { Name => 'GPSMode', Unknown => 1 }, # (always 16 in my sample) + 2 => { + Name => 'SampleTime', + Groups => { 2 => 'Video' }, + Format => 'int64u', + ValueConv => '$val / 1e6', + PrintConv => 'ConvertDuration($val)', + }, + 10 => { Name => 'GPSLatitude', Format => 'float', PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")' }, + 14 => { Name => 'GPSLongitude', Format => 'float', PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")' }, + 18 => { Name => 'GPSAltitude', Format => 'float', PrintConv => '"$val m"' }, # (questionable accuracy) + 22 => { + Name => 'GPSSpeed', + Notes => 'converted to km/hr', + Format => 'int16u', + ValueConv => '$val * 0.036', + PrintConv => 'sprintf("%.1f",$val)', + }, + 24 => { Name => 'GPSTrack', Format => 'int16u', ValueConv => '$val / 100' }, + 26 => { Name => 'Acceleration', Format => 'int16u', ValueConv => '$val / 1000' }, +); + +%Image::ExifTool::QuickTime::Rot360Fly = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + 1 => { Name => 'RotMode', Unknown => 1 }, # (always 1 in my sample) + 2 => { + Name => 'SampleTime', + Groups => { 2 => 'Video' }, + Format => 'int64u', + ValueConv => '$val / 1e6', + PrintConv => 'ConvertDuration($val)', + }, + 10 => { Name => 'RotationXYZ', Format => 'float[3]' }, +); + +%Image::ExifTool::QuickTime::Fusion360Fly = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + 1 => { Name => 'FusionMode', Unknown => 1 }, # (always 0 in my sample) + 2 => { + Name => 'SampleTime', + Groups => { 2 => 'Video' }, + Format => 'int64u', + ValueConv => '$val / 1e6', + PrintConv => 'ConvertDuration($val)', + }, + 10 => { Name => 'FusionYPR', Format => 'float[3]' }, +); + +# tags found in 'marl' ctbx timed metadata (ref PH) +%Image::ExifTool::QuickTime::marl = ( + PROCESS_PROC => \&Process_marl, + GROUPS => { 2 => 'Other' }, + NOTES => 'Tags extracted from the marl ctbx timed metadata of GM cars.', +); + +#------------------------------------------------------------------------------ +# Save information from keys in OtherSampleDesc directory for processing timed metadata +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +# (ref "Timed Metadata Media" here: +# https://developer.apple.com/library/content/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html) +sub SaveMetaKeys($$$) +{ + local $_; + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = length $$dataPt; + return 0 unless $dirLen > 8; + my $pos = 0; + my $verbose = $$et{OPTIONS}{Verbose}; + my $oldIndent = $$et{INDENT}; + my $ee = $$et{ee}; + $ee or $ee = $$et{ee} = { }; + + $verbose and $et->VerboseDir($$dirInfo{DirName}, undef, $dirLen); + + # loop through metadata key table + while ($pos + 8 < $dirLen) { + my $size = Get32u($dataPt, $pos); + my $id = substr($$dataPt, $pos+4, 4); + my $end = $pos + $size; + $end = $dirLen if $end > $dirLen; + $pos += 8; + my ($tagID, $format, $pid); + if ($verbose) { + $pid = PrintableTagID($id,1); + $et->VPrint(0, "$oldIndent+ [Metadata Key entry, Local ID=$pid, $size bytes]\n"); + $$et{INDENT} .= '| '; + } + + while ($pos + 4 < $end) { + my $len = unpack("x${pos}N", $$dataPt); + last if $len < 8 or $pos + $len > $end; + my $tag = substr($$dataPt, $pos + 4, 4); + $pos += 8; $len -= 8; + my $val = substr($$dataPt, $pos, $len); + $pos += $len; + my $str; + if ($tag eq 'keyd') { + ($tagID = $val) =~ s/^(mdta|fiel)com\.apple\.quicktime\.//; + $tagID = "Tag_$val" unless $tagID; + ($str = $val) =~ s/(.{4})/$1 / if $verbose; + } elsif ($tag eq 'dtyp') { + next if length $val < 4; + if (length $val >= 4) { + my $ns = unpack('N', $val); + if ($ns == 0) { + length $val >= 8 or $et->Warn('Short dtyp data'), next; + $str = unpack('x4N',$val); + $format = $qtFmt{$str} || 'undef'; + } elsif ($ns == 1) { + $str = substr($val, 4); + $format = 'undef'; + } else { + $format = 'undef'; + } + $str .= " ($format)" if $verbose and defined $str; + } + } + if ($verbose > 1) { + if (defined $str) { + $str =~ tr/\x00-\x1f\x7f-\xff/./; + $str = " = $str"; + } else { + $str = ''; + } + $et->VPrint(1, $$et{INDENT}."- Tag '".PrintableTagID($tag,2)."' ($len bytes)$str\n"); + $et->VerboseDump(\$val); + } + } + if (defined $tagID and defined $format) { + if ($verbose) { + my $t2 = PrintableTagID($tagID); + $et->VPrint(0, "$$et{INDENT}Added Local ID $pid = $t2 ($format)\n"); + } + $$ee{'keys'}{$id} = { TagID => $tagID, Format => $format }; + } + $$et{INDENT} = $oldIndent; + } + return 1; +} + +#------------------------------------------------------------------------------ +# We found some tags for this sample, so set document number and save timing information +# Inputs: 0) ExifTool ref, 1) tag table ref, 2) sample time, 3) sample duration +sub FoundSomething($$;$$) +{ + my ($et, $tagTbl, $time, $dur) = @_; + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + $et->HandleTag($tagTbl, SampleTime => $time) if defined $time; + $et->HandleTag($tagTbl, SampleDuration => $dur) if defined $dur; +} + +#------------------------------------------------------------------------------ +# Approximate GPSDateTime value from sample time and CreateDate +# Inputs: 0) ExifTool ref, 1) tag table ptr, 2) sample time (s) +# 3) true if CreateDate is at end of video +# Notes: Uses ExifTool CreateDateAtEnd as flag to subtract video duration +sub SetGPSDateTime($$$) +{ + my ($et, $tagTbl, $sampleTime) = @_; + my $value = $$et{VALUE}; + if (defined $sampleTime and $$value{CreateDate}) { + $sampleTime += $$value{CreateDate}; # adjust sample time to seconds since the epoch + if ($$et{CreateDateAtEnd}) { # adjust if CreateDate is at end of video + return unless $$value{TimeScale} and $$value{Duration}; + $sampleTime -= $$value{Duration} / $$value{TimeScale}; + $et->WarnOnce('Approximating GPSDateTime as CreateDate - Duration + SampleTime', 1); + } else { + $et->WarnOnce('Approximating GPSDateTime as CreateDate + SampleTime', 1); + } + unless ($et->Options('QuickTimeUTC')) { + my $tzOff = $$et{tzOff}; # use previously calculated offset + unless (defined $tzOff) { + # adjust to UTC, assuming time is local + my @tm = localtime $$value{CreateDate}; + my @gm = gmtime $$value{CreateDate}; + $tzOff = $$et{tzOff} = Image::ExifTool::GetTimeZone(\@tm, \@gm) * 60; + } + $sampleTime -= $tzOff; # shift from local time to UTC + } + $et->HandleTag($tagTbl, GPSDateTime => Image::ExifTool::ConvertUnixTime($sampleTime,0,3) . 'Z'); + } +} + +#------------------------------------------------------------------------------ +# Handle tags that we found in the subtitle 'text' +# Inputs: 0) ExifTool ref, 1) tag table ref, 2) hash of tag names/values +sub HandleTextTags($$$) +{ + my ($et, $tagTbl, $tags) = @_; + my $tag; + delete $$tags{done}; + delete $$tags{GPSTimeStamp} if $$tags{GPSDateTime}; + foreach $tag (sort keys %$tags) { + $et->HandleTag($tagTbl, $tag => $$tags{$tag}); + } + $$et{UnknownTextCount} = 0; + undef %$tags; # clear the hash +} + +#------------------------------------------------------------------------------ +# Process subtitle 'text' +# Inputs: 0) ExifTool ref, 1) data ref or dirInfo ref, 2) tag table ref +sub Process_text($$$) +{ + my ($et, $dataPt, $tagTbl) = @_; + my %tags; + + return if $$et{NoMoreTextDecoding}; + + if (ref $dataPt eq 'HASH') { + my $dirName = $$dataPt{DirName}; + $dataPt = $$dataPt{DataPt}; + $et->VerboseDir($dirName, undef, length($$dataPt)); + } + + while ($$dataPt =~ /\$(\w+)([^\$]*)/g) { + my ($tag, $dat) = ($1, $2); + if ($tag =~ /^[A-Z]{2}RMC$/ and $dat =~ /^,(\d{2})(\d{2})(\d+(?:\.\d*)),A?,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/) { + my $time = "$1:$2:$3"; + if ($$et{LastTime}) { + if ($$et{LastTime} eq $time) { + $$et{DOC_NUM} = $$et{LastDoc}; + } elsif (%tags) { + HandleTextTags($et, $tagTbl, \%tags); + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + } + } + $$et{LastTime} = $time; + $$et{LastDoc} = $$et{DOC_NUM}; + my $year = $14 + ($14 >= 70 ? 1900 : 2000); + my $dateTime = sprintf('%.4d:%.2d:%.2d %sZ', $year, $13, $12, $time); + $tags{GPSDateTime} = $dateTime; + $tags{GPSLatitude} = (($4 || 0) + $5/60) * ($6 eq 'N' ? 1 : -1); + $tags{GPSLongitude} = (($7 || 0) + $8/60) * ($9 eq 'E' ? 1 : -1); + $tags{GPSSpeed} = $10 * $knotsToKph if length $10; + $tags{GPSTrack} = $11 if length $11; + } elsif ($tag =~ /^[A-Z]{2}GGA$/ and $dat =~ /^,(\d{2})(\d{2})(\d+(?:\.\d*)?),(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),[1-6]?,(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?/s) { + my $time = "$1:$2:$3"; + if ($$et{LastTime}) { + if ($$et{LastTime} eq $time) { + $$et{DOC_NUM} = $$et{LastDoc}; + } elsif (%tags) { + HandleTextTags($et, $tagTbl, \%tags); + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + } + } + $$et{LastTime} = $time; + $$et{LastDoc} = $$et{DOC_NUM}; + $tags{GPSTimeStamp} = $time; + $tags{GPSLatitude} = (($4 || 0) + $5/60) * ($6 eq 'N' ? 1 : -1); + $tags{GPSLongitude} = (($7 || 0) + $8/60) * ($9 eq 'E' ? 1 : -1); + $tags{GPSSatellites} = $10 if defined $10; + $tags{GPSDOP} = $11 if defined $11; + $tags{GPSAltitude} = $12 if defined $12; + } elsif ($tag eq 'BEGINGSENSOR' and $dat =~ /^:([-+]\d+\.\d+):([-+]\d+\.\d+):([-+]\d+\.\d+)/) { + $tags{Accelerometer} = "$1 $2 $3"; + } elsif ($tag eq 'TIME' and $dat =~ /^:(\d+)/) { + $tags{TimeCode} = $1 / ($$et{MediaTS} || 1); + } elsif ($tag eq 'BEGIN') { + $tags{Text} = $dat if length $dat; + $tags{done} = 1; + } elsif ($tag ne 'END') { + $tags{Text} = "\$$tag$dat"; + } + } + %tags and HandleTextTags($et, $tagTbl, \%tags), return; + + # check for enciphered binary GPS data + # BlueSkySea: + # 0000: 00 00 aa aa aa aa 54 54 98 9a 9b 93 9a 92 98 9a [......TT........] + # 0010: 9a 9d 9f 9b 9f 9d aa aa aa aa aa aa aa aa aa aa [................] + # 0020: aa aa aa aa aa a9 e4 9e 92 9f 9b 9f 92 9d 99 ef [................] + # 0030: 9a 9a 98 9b 93 9d 9d 9c 93 aa aa aa aa aa 9a 99 [................] + # 0040: 9b aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa [................] + # [...] + # decrypted: + # 0000: aa aa 00 00 00 00 fe fe 32 30 31 39 30 38 32 30 [........20190820] + # 0010: 30 37 35 31 35 37 00 00 00 00 00 00 00 00 00 00 [075157..........] + # 0020: 00 00 00 00 00 03 4e 34 38 35 31 35 38 37 33 45 [......N48515873E] + # 0030: 30 30 32 31 39 37 37 36 39 00 00 00 00 00 30 33 [002197769.....03] + # 0040: 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [1...............] + # [...] + # Ambarella A12: + # 0000: 00 00 f2 e1 f0 ee 54 54 98 9a 9b 93 9b 9b 9b 9c [......TT........] + # 0010: 9b 9a 9a 93 9a 9b a6 9a 9b 9b 93 9b 9a 9b 9c 9a [................] + # 0020: 9d 9a 92 9f 93 a9 e4 9f 9f 9e 9f 9b 9b 9c 9d ef [................] + # 0030: 9a 99 9d 9e 99 9a 9a 9e 9b 81 9a 9b 9f 9d 9a 9a [................] + # 0040: 9a 87 9a 9a 9a 87 9a 98 99 87 9a 9a 99 87 9a 9a [................] + # [...] + # decrypted: + # 0000: aa aa 58 4b 5a 44 fe fe 32 30 31 39 31 31 31 36 [..XKZD..20191116] + # 0010: 31 30 30 39 30 31 0c 30 31 31 39 31 30 31 36 30 [100901.011910160] + # 0020: 37 30 38 35 39 03 4e 35 35 34 35 31 31 36 37 45 [70859.N55451167E] + # 0030: 30 33 37 34 33 30 30 34 31 2b 30 31 35 37 30 30 [037430041+015700] + # 0040: 30 2d 30 30 30 2d 30 32 33 2d 30 30 33 2d 30 30 [0-000-023-003-00] + # [...] + # 0100: aa 55 57 ed ed 45 58 54 44 00 01 30 30 30 30 31 [.UW..EXTD..00001] + # 0110: 31 30 38 30 30 30 58 00 58 00 58 00 58 00 58 00 [108000X.X.X.X.X.] + # 0120: 58 00 58 00 58 00 58 00 00 00 00 00 00 00 00 00 [X.X.X.X.........] + # 0130: 00 00 00 00 00 00 00 [.......] + if ($$dataPt =~ /^\0\0(..\xaa\xaa|\xf2\xe1\xf0\xee)/s and length $$dataPt >= 282) { + my $val = pack('C*', map { $_ ^ 0xaa } unpack('C*', substr($$dataPt, 8, 14))); + if ($val =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/) { + $tags{GPSDateTime} = "$1:$2:$3 $4:$5:$6"; + $val = pack('C*', map { $_ ^ 0xaa } unpack('C*', substr($$dataPt, 38, 9))); + if ($val =~ /^([NS])(\d{2})(\d+$)$/) { + $tags{GPSLatitude} = ($2 + $3 / 600000) * ($1 eq 'S' ? -1 : 1); + } + $val = pack('C*', map { $_ ^ 0xaa } unpack('C*', substr($$dataPt, 47, 10))); + if ($val =~ /^([EW])(\d{3})(\d+$)$/) { + $tags{GPSLongitude} = ($2 + $3 / 600000) * ($1 eq 'W' ? -1 : 1); + } + $val = pack('C*', map { $_ ^ 0xaa } unpack('C*', substr($$dataPt, 0x39, 5))); + $tags{GPSAltitude} = $val + 0 if $val =~ /^[-+]\d+$/; + $val = pack('C*', map { $_ ^ 0xaa } unpack('C*', substr($$dataPt, 0x3e, 3))); + $tags{GPSSpeed} = $val + 0 if $val =~ /^\d+$/; + if ($$dataPt =~ /^\0\0..\xaa\xaa/s) { # (BlueSkySea) + $val = pack('C*', map { $_ ^ 0xaa } unpack('C*', substr($$dataPt, 0xad, 12))); + # the first X,Y,Z accelerometer readings from the AccelerometerData + if ($val =~ /^([-+]\d{3})([-+]\d{3})([-+]\d{3})$/) { + $tags{Accelerometer} = "$1 $2 $3"; + $val = pack('C*', map { $_ ^ 0xaa } unpack('C*', substr($$dataPt, 0xba, 96))); + my $order = GetByteOrder(); + SetByteOrder('II'); + $val = ReadValue(\$val, 0, 'float'); + SetByteOrder($order); + $tags{AccelerometerData} = $val; + } + } else { # (Ambarella) + my @acc; + $val = pack('C*', map { $_ ^ 0xaa } unpack('C*', substr($$dataPt, 0x41, 195))); + push @acc, $1, $2, $3 while $val =~ /\G([-+]\d{3})([-+]\d{3})([-+]\d{3})/g; + $tags{Accelerometer} = "@acc" if @acc; + } + } + %tags and HandleTextTags($et, $tagTbl, \%tags), return; + } + + # check for DJI telemetry data, eg: + # "F/3.5, SS 1000, ISO 100, EV 0, GPS (8.6499, 53.1665, 18), D 24.26m, + # H 6.00m, H.S 2.10m/s, V.S 0.00m/s \n" + if ($$dataPt =~ /GPS \(([-+]?\d*\.\d+),\s*([-+]?\d*\.\d+)/) { + $$et{CreateDateAtEnd} = 1; # set flag indicating the file creation date is at the end + $tags{GPSLatitude} = $2; + $tags{GPSLongitude} = $1; + $tags{GPSAltitude} = $1 if $$dataPt =~ /,\s*H\s+([-+]?\d+\.?\d*)m/; + $tags{GPSSpeed} = $1 * $mpsToKph if $$dataPt =~ /,\s*H.S\s+([-+]?\d+\.?\d*)/; + $tags{Distance} = $1 * $mpsToKph if $$dataPt =~ /,\s*D\s+(\d+\.?\d*)m/; + $tags{VerticalSpeed} = $1 if $$dataPt =~ /,\s*V.S\s+([-+]?\d+\.?\d*)/; + $tags{FNumber} = $1 if $$dataPt =~ /\bF\/(\d+\.?\d*)/; + $tags{ExposureTime} = 1 / $1 if $$dataPt =~ /\bSS\s+(\d+\.?\d*)/; + $tags{ExposureCompensation} = ($1 / ($2 || 1)) if $$dataPt =~ /\bEV\s+([-+]?\d+\.?\d*)(\/\d+)?/; + $tags{ISO} = $1 if $$dataPt =~ /\bISO\s+(\d+\.?\d*)/; + HandleTextTags($et, $tagTbl, \%tags); + return; + } + + # check for Mini 0806 dashcam GPS, eg: + # "A,270519,201555.000,3356.8925,N,08420.2071,W,000.0,331.0M,+01.84,-09.80,-00.61;\n" + if ($$dataPt =~ /^A,(\d{2})(\d{2})(\d{2}),(\d{2})(\d{2})(\d{2}(\.\d+)?)/) { + $tags{GPSDateTime} = "20$3:$2:$1 $4:$5:$6Z"; + if ($$dataPt =~ /^A,.*?,.*?,(\d{2})(\d+\.\d+),([NS])/) { + $tags{GPSLatitude} = ($1 + $2/60) * ($3 eq 'S' ? -1 : 1); + } + if ($$dataPt =~ /^A,.*?,.*?,.*?,.*?,(\d{3})(\d+\.\d+),([EW])/) { + $tags{GPSLongitude} = ($1 + $2/60) * ($3 eq 'W' ? -1 : 1); + } + my @a = split ',', $$dataPt; + $tags{GPSAltitude} = $a[8] if $a[8] and $a[8] =~ s/M$//; + $tags{GPSSpeed} = $a[7] if $a[7] and $a[7] =~ /^\d+\.\d+$/; # (NC) + $tags{Accelerometer} = "$a[9] $a[10] $a[11]" if $a[11] and $a[11] =~ s/;\s*$//; + HandleTextTags($et, $tagTbl, \%tags); + return; + } + + # check for Roadhawk dashcam text + # ".;;;;D?JL;6+;;;D;R?;4;;;;DBB;;O;;;=D;L;;HO71G>F;-?=J-F:FNJJ;DPP-JF3F;;PL=DBRLBF0F;=?DNF-RD-PF;N;?=JF;;?D=F:*6F~" + # decoded: + # "X0000.2340Y-000.0720Z0000.9900G0001.0400$GPRMC,082138,A,5330.6683,N,00641.9749,W,012.5,87.86,050213,002.1,A" + # (note: "002.1" is magnetic variation and is not decoded; it should have ",E" or ",W" afterward for direction) + if ($$dataPt =~ /\*[0-9A-F]{2}~$/) { + # (ref https://reverseengineering.stackexchange.com/questions/11582/how-to-reverse-engineer-dash-cam-metadata) + my @decode = unpack 'C*', '-I8XQWRVNZOYPUTA0B1C2SJ9K.L,M$D3E4F5G6H7'; + my @chars = unpack 'C*', substr($$dataPt, 0, -4); + foreach (@chars) { + my $n = $_ - 43; + $_ = $decode[$n] if $n >= 0 and defined $decode[$n]; + } + my $buff = pack 'C*', @chars; + if ($buff =~ /X(.*?)Y(.*?)Z(.*?)G(.*?)\$/) { + # yup. the decoding worked out + $tags{Accelerometer} = "$1 $2 $3 $4"; + $$dataPt = $buff; # (process GPRMC below) + } + } + + # check for Thinkware format (and other NMEA RMC), eg: + # "gsensori,4,512,-67,-12,100;GNRMC,161313.00,A,4529.87489,N,07337.01215,W,6.225,35.34,310819,,,A*52..; + # CAR,0,0,0,0.0,0,0,0,0,0,0,0,0" + if ($$dataPt =~ /[A-Z]{2}RMC,(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/ and + # do some basic sanity checks on the date + $13 <= 31 and $14 <= 12 and $15 <= 99) + { + my $year = $15 + ($15 >= 70 ? 1900 : 2000); + $tags{GPSDateTime} = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ', $year, $14, $13, $1, $2, $3); + $tags{GPSLatitude} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1); + $tags{GPSLongitude} = (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1); + $tags{GPSSpeed} = $11 * $knotsToKph if length $11; + $tags{GPSTrack} = $12 if length $12; + } + $tags{GSensor} = $1 if $$dataPt =~ /\bgsensori,(.*?)(;|$)/; + $tags{Car} = $1 if $$dataPt =~ /\bCAR,(.*?)(;|$)/; + + if (%tags) { + HandleTextTags($et, $tagTbl, \%tags); + } else { + $$et{UnknownTextCount} = ($$et{UnknownTextCount} || 0) + 1; + # give up trying to decode useful information if we haven't found anything for a while + $$et{NoMoreTextDecoding} = 1 if $$et{UnknownTextCount} > 100; + } +} + +#------------------------------------------------------------------------------ +# Extract embedded metadata from media samples +# Inputs: 0) ExifTool ref +# Notes: Also accesses ExifTool RAF*, SET_GROUP1, HandlerType, MetaFormat, +# ee*, and avcC elements (* = must exist) +sub ProcessSamples($) +{ + my $et = shift; + my ($raf, $ee) = @$et{qw(RAF ee)}; + my ($i, $buff, $pos, $hdrLen, $hdrFmt, @time, @dur, $oldIndent); + + return unless $ee; + delete $$et{ee}; # use only once + + # only process specific types of video streams + my $type = $$et{HandlerType} || ''; + if ($type eq 'vide') { + if ($$ee{avcC}) { $type = 'avcC' } + elsif ($$ee{JPEG}) { $type = 'JPEG' } + else { return } + } + + my ($start, $size) = @$ee{qw(start size)}; +# +# determine sample start offsets from chunk offsets (stco) and sample-to-chunk table (stsc), +# and sample time/duration from time-to-sample (stts) +# + unless ($start and $size) { + return unless $size; + my ($stco, $stsc, $stts) = @$ee{qw(stco stsc stts)}; + return unless $stco and $stsc and @$stsc; + $start = [ ]; + my ($nextChunk, $iChunk) = (0, 1); + my ($chunkStart, $startChunk, $samplesPerChunk, $descIdx, $timeCount, $timeDelta, $time); + if ($stts and @$stts > 1) { + $time = 0; + $timeCount = shift @$stts; + $timeDelta = shift @$stts; + } + my $ts = $$et{MediaTS} || 1; + foreach $chunkStart (@$stco) { + if ($iChunk >= $nextChunk and @$stsc) { + ($startChunk, $samplesPerChunk, $descIdx) = @{shift @$stsc}; + $nextChunk = $$stsc[0][0] if @$stsc; + } + @$size < @$start + $samplesPerChunk and $et->WarnOnce('Sample size error'), last; + my $sampleStart = $chunkStart; +Sample: for ($i=0; ; ) { + push @$start, $sampleStart; + if (defined $time) { + until ($timeCount) { + if (@$stts < 2) { + undef $time; + last Sample; + } + $timeCount = shift @$stts; + $timeDelta = shift @$stts; + } + push @time, $time / $ts; + push @dur, $timeDelta / $ts; + $time += $timeDelta; + --$timeCount; + } + # (eventually should use the description indices: $descIdx) + last if ++$i >= $samplesPerChunk; + $sampleStart += $$size[$#$start]; + } + ++$iChunk; + } + @$start == @$size or $et->WarnOnce('Incorrect sample start/size count'), return; + } +# +# extract and parse the sample data +# + my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream'); + my $verbose = $et->Options('Verbose'); + my $metaFormat = $$et{MetaFormat} || ''; + my $tell = $raf->Tell(); + + if ($verbose) { + $et->VPrint(0, "---- Extract Embedded ----\n"); + $oldIndent = $$et{INDENT}; + $$et{INDENT} = ''; + } + # get required information from avcC box if parsing video data + if ($type eq 'avcC') { + $hdrLen = (Get8u(\$$ee{avcC}, 4) & 0x03) + 1; + $hdrFmt = ($hdrLen == 4 ? 'N' : $hdrLen == 2 ? 'n' : 'C'); + require Image::ExifTool::H264; + } + # loop through all samples + for ($i=0; $i<@$start and $i<@$size; ++$i) { + + # initialize our flags for setting GPSDateTime + delete $$et{FoundGPSLatitude}; + delete $$et{FoundGPSDateTime}; + + # read the sample data + my $size = $$size[$i]; + next unless $raf->Seek($$start[$i], 0) and $raf->Read($buff, $size) == $size; + + if ($type eq 'avcC') { + next if length($buff) <= $hdrLen; + # scan through all NAL units and send them to ParseH264Video() + for ($pos=0; ; ) { + my $len = unpack("x$pos$hdrFmt", $buff); + last if $pos + $hdrLen + $len > length($buff); + my $tmp = "\0\0\0\x01" . substr($buff, $pos+$hdrLen, $len); + Image::ExifTool::H264::ParseH264Video($et, \$tmp); + $pos += $hdrLen + $len; + last if $pos + $hdrLen >= length($buff); + } + if ($$et{GotNAL06}) { + my $eeOpt = $et->Options('ExtractEmbedded'); + last unless $eeOpt and $eeOpt > 2; + } + next; + } + if ($verbose > 1) { + my $hdr = $$et{SET_GROUP1} ? "$$et{SET_GROUP1} Type='${type}' Format='${metaFormat}'" : "Type='${type}'"; + $et->VPrint(1, "${hdr}, Sample ".($i+1).' of '.scalar(@$start)." ($size bytes)\n"); + $et->VerboseDump(\$buff, Addr => $$start[$i]); + } + if ($type eq 'text' or + # (PNDM is normally 'text', but was sbtl/tx3g in concatenated Garmin sample output_3videos.mp4) + ($type eq 'sbtl' and $metaFormat eq 'tx3g' and $buff =~ /^..PNDM/s)) + { + + FoundSomething($et, $tagTbl, $time[$i], $dur[$i]); + unless ($buff =~ /^\$BEGIN/) { + # remove ending "encd" box if it exists + $buff =~ s/\0\0\0\x0cencd\0\0\x01\0$// and $size -= 12; + # cameras such as the CanonPowerShotN100 store ASCII time codes with a + # leading 2-byte integer giving the length of the string + # (and chapter names start with a 2-byte integer too) + if ($size >= 2 and unpack('n',$buff) == $size - 2) { + next if $size == 2; + $buff = substr($buff,2); + } + my $val; + # check for encrypted GPS text as written by E-PRANCE B47FS camera + if ($buff =~ /^\0/ and $buff =~ /\x0a$/ and length($buff) > 5) { + # decode simple ASCII difference cipher, + # based on known value of 4th-last char = '*' + my $dif = ord('*') - ord(substr($buff, -4, 1)); + my $tmp = pack 'C*',map { $_=($_+$dif)&0xff } unpack 'C*',substr $buff,1,-1; + if ($verbose > 2) { + $et->VPrint(0, "[decrypted text]\n"); + $et->VerboseDump(\$tmp); + } + if ($tmp =~ /^(.*?)(\$[A-Z]{2}RMC.*)/s) { + ($val, $buff) = ($1, $2); + $val =~ tr/\t/ /; + $et->HandleTag($tagTbl, RawGSensor => $val) if length $val; + } + } elsif ($buff =~ /^(\0.{3})?PNDM/s) { + # Garmin Dashcam format (actually binary, not text) + my $n = $1 ? 4 : 0; # skip leading 4-byte size word if it exists + next if length($buff) < 20 + $n; + $et->HandleTag($tagTbl, GPSLatitude => Get32s(\$buff, 12+$n) * 180/0x80000000); + $et->HandleTag($tagTbl, GPSLongitude => Get32s(\$buff, 16+$n) * 180/0x80000000); + $et->HandleTag($tagTbl, GPSSpeed => Get16u(\$buff, 8+$n) * $mphToKph); + SetGPSDateTime($et, $tagTbl, $time[$i]); + next; # all done (don't store/process as text) + } + unless (defined $val) { + $et->HandleTag($tagTbl, Text => $buff); # just store any other text + } + } + Process_text($et, \$buff, $tagTbl); + + } elsif ($processByMetaFormat{$type}) { + + if ($$tagTbl{$metaFormat}) { + my $tagInfo = $et->GetTagInfo($tagTbl, $metaFormat, \$buff); + if ($tagInfo) { + FoundSomething($et, $tagTbl, $time[$i], $dur[$i]); + $$et{ee} = $ee; # need ee information for 'keys' + $et->HandleTag($tagTbl, $metaFormat, undef, + DataPt => \$buff, + DataPos => 0, + Base => $$start[$i], # (Base must be set for CR3 files) + TagInfo => $tagInfo, + ); + delete $$et{ee}; + } elsif ($metaFormat eq 'camm' and $buff =~ /^X/) { + # seen 'camm' metadata in this format (X/Y/Z acceleration and G force? + GPRMC + ?) + # "X0000.0000Y0000.0000Z0000.0000G0000.0000$GPRMC,000125,V,,,,,000.0,,280908,002.1,N*71~, 794021 \x0a" + FoundSomething($et, $tagTbl, $time[$i], $dur[$i]); + $et->HandleTag($tagTbl, Accelerometer => "$1 $2 $3 $4") if $buff =~ /X(.*?)Y(.*?)Z(.*?)G(.*?)\$/; + Process_text($et, \$buff, $tagTbl); + } + } elsif ($verbose) { + $et->VPrint(0, "Unknown $type format ($metaFormat)"); + } + + } elsif ($type eq 'gps ') { # (ie. GPSDataList tag) + + if ($buff =~ /^....freeGPS /s) { + # decode "freeGPS " data (Novatek) + ProcessFreeGPS($et, { + DataPt => \$buff, + DataPos => $$start[$i], + SampleTime => $time[$i], + SampleDuration => $dur[$i], + }, $tagTbl) ; + } + + } elsif ($$tagTbl{$type}) { + + my $tagInfo = $et->GetTagInfo($tagTbl, $type, \$buff); + if ($tagInfo) { + FoundSomething($et, $tagTbl, $time[$i], $dur[$i]); + $et->HandleTag($tagTbl, $type, undef, + DataPt => \$buff, + DataPos => 0, + Base => $$start[$i], # (Base must be set for CR3 files) + TagInfo => $tagInfo, + ); + } + } + # generate approximate GPSDateTime if necessary + SetGPSDateTime($et, $tagTbl, $time[$i]) if $$et{FoundGPSLatitude} and not $$et{FoundGPSDateTime}; + } + if ($verbose) { + $$et{INDENT} = $oldIndent; + $et->VPrint(0, "--------------------------\n"); + } + # clean up + $raf->Seek($tell, 0); # restore original file position + $$et{DOC_NUM} = 0; + $$et{HandlerType} = $$et{HanderDesc} = ''; +} + +#------------------------------------------------------------------------------ +# Convert latitude/longitude from DDDMM.MMMM format to decimal degrees +# Inputs: 0) latitude, 1) longitude +# Returns: lat/lon are changed in place +# (note: this method works fine for negative coordinates) +sub ConvertLatLon($$) +{ + my $deg = int($_[0] / 100); # latitude + $_[0] = $deg + ($_[0] - $deg * 100) / 60; + $deg = int($_[1] / 100); # longitude + $_[1] = $deg + ($_[1] - $deg * 100) / 60; +} + +#------------------------------------------------------------------------------ +# Process "freeGPS " data blocks referenced by a 'gps ' (GPSDataList) atom +# Inputs: 0) ExifTool ref, 1) dirInfo ref {DataPt,SampleTime,SampleDuration}, 2) tagTable ref +# Returns: 1 on success (or 0 on unrecognized or "measurement-void" GPS data) +# Notes: +# - also see ProcessFreeGPS2() below for processing of other types of freeGPS blocks +sub ProcessFreeGPS($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = length $$dataPt; + my ($yr, $mon, $day, $hr, $min, $sec, $stat, $lbl, $ddd); + my ($lat, $latRef, $lon, $lonRef, $spd, $trk, $alt, @acc, @xtra); + + return 0 if $dirLen < 92; + + if (substr($$dataPt,18,8) eq "\xaa\xaa\xf2\xe1\xf0\xee\x54\x54") { + + # (this is very similar to the encrypted text format) + # decode encrypted ASCII-based GPS (DashCam Azdome GS63H, ref 5) + # header looks like this in my sample: + # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 05 01 00 00 [....freeGPS ....] + # 0010: 01 03 aa aa f2 e1 f0 ee 54 54 98 9a 9b 92 9a 93 [........TT......] + # 0020: 98 9e 98 98 9e 93 98 92 a6 9f 9f 9c 9d ed fa 8a [................] + # decrypted (from byte 18): + # 0000: 00 00 58 4b 5a 44 fe fe 32 30 31 38 30 39 32 34 [..XKZD..20180924] + # 0010: 32 32 34 39 32 38 0c 35 35 36 37 47 50 20 20 20 [224928.5567GP ] + # 0020: 00 00 00 00 00 03 4e 34 30 34 36 34 33 35 30 57 [......N40464350W] + # 0030: 30 30 37 30 34 30 33 30 38 30 30 30 30 30 30 30 [0070403080000000] + # 0040: 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [7...............] + # [...] + # 00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 2b 30 39 [.............+09] + # 00b0: 33 2d 30 30 33 2d 30 30 35 00 00 00 00 00 00 00 [3-003-005.......] + # header looks like this for EEEkit gps: + # 0000: 00 00 04 00 66 72 65 65 47 50 53 20 f0 03 00 00 [....freeGPS ....] + # 0010: 01 03 aa aa f2 e1 f0 ee 54 54 98 9a 98 9a 9a 9f [........TT......] + # 0020: 9b 93 9b 9c 98 99 99 9f a6 9a 9a 98 9a 9a 9f 9b [................] + # 0030: 93 9b 9c 98 99 99 9c a9 e4 99 9d 9e 9f 98 9e 9b [................] + # 0040: 9c fd 9b 98 98 98 9f 9f 9a 9a 93 81 9a 9b 9d 9f [................] + # decrypted (from byte 18): + # 0000: 00 00 58 4b 5a 44 fe fe 32 30 32 30 30 35 31 39 [..XKZD..20200519] + # 0010: 31 36 32 33 33 35 0c 30 30 32 30 30 35 31 39 31 [162335.002005191] + # 0020: 36 32 33 33 36 03 4e 33 37 34 35 32 34 31 36 57 [62336.N37452416W] + # 0030: 31 32 32 32 35 35 30 30 39 2b 30 31 37 35 30 31 [122255009+017501] + # 0040: 31 2b 30 31 34 2b 30 30 32 2b 30 32 36 2b 30 31 [1+014+002+026+01] + my $n = $dirLen - 18; + $n = 0x101 if $n > 0x101; + my $buf2 = pack 'C*', map { $_ ^ 0xaa } unpack 'C*', substr($$dataPt,18,$n); + if ($et->Options('Verbose') > 1) { + $et->VPrint(1, '[decrypted freeGPS data]'); + $et->VerboseDump(\$buf2); + } + # (extract longitude as 9 digits, not 8, ref PH) + return 0 unless $buf2 =~ /^.{8}(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}).(.{15})([NS])(\d{8})([EW])(\d{9})(\d{8})?/s; + ($yr,$mon,$day,$hr,$min,$sec,$lbl,$latRef,$lat,$lonRef,$lon,$spd) = ($1,$2,$3,$4,$5,$6,$7,$8,$9/1e4,$10,$11/1e4,$12); + if (defined $spd) { # (Azdome) + $spd += 0; # remove leading 0's + } elsif ($buf2 =~ /^.{57}([-+]\d{4})(\d{3})/s) { # (EEEkit) + # $alt = $1 + 0; (doesn't look right for my sample, but the Ambarella A12 text has this) + $spd = $2 + 0; + } + $lbl =~ s/\0.*//s; $lbl =~ s/\s+$//; # truncate at null and remove trailing spaces + push @xtra, UserLabel => $lbl if length $lbl; + # extract accelerometer data (ref PH) + if ($buf2 =~ /^.{65}(([-+]\d{3})([-+]\d{3})([-+]\d{3})([-+]\d{3})*)/s) { + $_ = $1; + @acc = ($2/100, $3/100, $4/100); + s/([-+])/ $1/g; s/^ //; + push @xtra, AccelerometerData => $_; + } elsif ($buf2 =~ /^.{173}([-+]\d{3})([-+]\d{3})([-+]\d{3})/s) { # (Azdome) + @acc = ($1/100, $2/100, $3/100); + } + + } elsif ($$dataPt =~ /^.{52}(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/s) { + + # decode NMEA-format GPS data (NextBase 512GW dashcam, ref PH) + # header looks like this in my sample: + # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 40 01 00 00 [....freeGPS @...] + # 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + push @xtra, CameraDateTime => "$1:$2:$3 $4:$5:$6"; + if ($$dataPt =~ /\$[A-Z]{2}RMC,(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d+\.\d+),([NS]),(\d+\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/s) { + ($lat,$latRef,$lon,$lonRef) = ($5,$6,$7,$8); + $yr = $13 + ($13 >= 70 ? 1900 : 2000); + ($mon,$day,$hr,$min,$sec) = ($12,$11,$1,$2,$3); + $spd = $9 * $knotsToKph if length $9; + $trk = $10 if length $10; + } + if ($$dataPt =~ /\$[A-Z]{2}GGA,(\d{2})(\d{2})(\d+(\.\d*)?),(\d+\.\d+),([NS]),(\d+\.\d+),([EW]),[1-6]?,(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?/s) { + ($hr,$min,$sec,$lat,$latRef,$lon,$lonRef) = ($1,$2,$3,$5,$6,$7,$8) unless defined $yr; + $alt = $11; + unshift @xtra, GPSSatellites => $9; + unshift @xtra, GPSDOP => $10; + } + if (defined $lat) { + # extract accelerometer readings if GPS was valid + @acc = unpack('x68V3', $$dataPt); + # change to signed integer and divide by 256 + map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 256 } @acc; + } + + } elsif ($$dataPt =~ /^.{37}\0\0\0A([NS])([EW])/s) { + + # decode freeGPS from ViofoA119v3 dashcam (similar to Novatek GPS format) + # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....] + # 0010: 05 00 00 00 2f 00 00 00 03 00 00 00 13 00 00 00 [..../...........] + # 0020: 09 00 00 00 1b 00 00 00 41 4e 57 00 25 d1 99 45 [........ANW.%..E] + # 0030: f1 47 40 46 66 66 d2 41 85 eb 83 41 00 00 00 00 [.G@Fff.A...A....] + ($latRef, $lonRef) = ($1, $2); + ($hr,$min,$sec,$yr,$mon,$day) = unpack('x16V6', $$dataPt); + $yr += 2000; + SetByteOrder('II'); + $lat = GetFloat($dataPt, 0x2c); + $lon = GetFloat($dataPt, 0x30); + $spd = GetFloat($dataPt, 0x34) * $knotsToKph; # (convert knots to km/h) + $trk = GetFloat($dataPt, 0x38); + SetByteOrder('MM'); + + } elsif ($$dataPt =~ /^.{21}\0\0\0A([NS])([EW])/s) { + + # also decode 'gpmd' chunk from Kingslim D4 dashcam videos + # 0000: 0a 00 00 00 0b 00 00 00 07 00 00 00 e5 07 00 00 [................] + # 0010: 06 00 00 00 03 00 00 00 41 4e 57 31 91 52 83 45 [........ANW1.R.E] + # 0020: 15 70 fe c5 29 5c c3 41 ae c7 af 42 00 00 d1 be [.p..)\.A...B....] + # 0030: 00 00 80 3b 00 00 2c 3e 00 00 00 00 00 00 00 00 [...;..,>........] + # 0040: 00 00 00 00 00 00 00 00 00 00 00 00 26 26 26 26 [............&&&&] + # 0050: 4c 49 47 4f 47 50 53 49 4e 46 4f 00 00 00 00 05 [LIGOGPSINFO.....] + # 0060: 01 00 00 00 23 23 23 23 75 00 00 00 c0 22 20 20 [....####u...." ] + # 0070: 20 f0 12 10 12 21 e5 0e 10 12 2f 90 10 13 01 f2 [ ....!..../.....] + ($latRef, $lonRef) = ($1, $2); + ($hr,$min,$sec,$yr,$mon,$day) = unpack("V6", $$dataPt); + SetByteOrder('II'); + # lat/lon aren't decoded properly, but spd,trk,acc are + $lat = GetFloat($dataPt, 0x1c); + $lon = GetFloat($dataPt, 0x20); + $et->VPrint(0, sprintf("Raw lat/lon = %.9f %.9f\n", $lat, $lon)); + $et->WarnOnce('GPSLatitude/Longitude encryption is not yet known, so these will be wrong'); + $lat = abs $lat; + $lon = abs $lon; + $spd = GetFloat($dataPt, 0x24) * $knotsToKph; # (convert knots to km/h) + $trk = GetFloat($dataPt, 0x28); + $acc[0] = GetFloat($dataPt, 0x2c); + $acc[1] = GetFloat($dataPt, 0x30); + $acc[2] = GetFloat($dataPt, 0x34); + SetByteOrder('MM'); + + } elsif ($$dataPt =~ /^.{60}A\0{3}.{4}([NS])\0{3}.{4}([EW])\0{3}/s) { + + # decode freeGPS from Akaso dashcam + # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 60 00 00 00 [....freeGPS `...] + # 0010: 78 2e 78 78 00 00 00 00 00 00 00 00 00 00 00 00 [x.xx............] + # 0020: 30 30 30 30 30 00 00 00 00 00 00 00 00 00 00 00 [00000...........] + # 0030: 12 00 00 00 2f 00 00 00 19 00 00 00 41 00 00 00 [..../.......A...] + # 0040: 13 b3 ca 44 4e 00 00 00 29 92 fb 45 45 00 00 00 [...DN...)..EE...] + # 0050: d9 ee b4 41 ec d1 d3 42 e4 07 00 00 01 00 00 00 [...A...B........] + # 0060: 0c 00 00 00 01 00 00 00 05 00 00 00 00 00 00 00 [................] + ($latRef, $lonRef) = ($1, $2); + ($hr, $min, $sec, $yr, $mon, $day) = unpack('x48V3x28V3', $$dataPt); + SetByteOrder('II'); + $lat = GetFloat($dataPt, 0x40); + $lon = GetFloat($dataPt, 0x48); + $spd = GetFloat($dataPt, 0x50); + $trk = GetFloat($dataPt, 0x54) + 180; # (why is this off by 180?) + $trk -= 360 if $trk >= 360; + SetByteOrder('MM'); + + } elsif ($$dataPt =~ /^.{60}4W`b]S</s and length($$dataPt) >= 140) { + + # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 01 00 00 [..@.freeGPS ....] + # 0010: 5a 58 53 42 4e 58 59 53 00 00 00 00 00 00 00 00 [ZXSBNXYS........] + # 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0030: 00 00 00 00 00 00 00 00 00 00 00 00 34 57 60 62 [............4W`b] + # 0040: 5d 53 3c 41 44 45 41 41 42 3e 40 40 3c 51 3c 45 []S<ADEAAB>@@<Q<E] + # 0050: 41 40 43 3e 41 47 49 48 44 3c 5e 3c 40 41 46 43 [A@C>AGIHD<^<@AFC] + # 0060: 42 3e 49 49 40 42 45 3c 55 3c 45 47 3e 45 43 41 [B>II@BE<U<EG>ECA] + # decipher $GPRMC by subtracting 16 from each character value + $_ = pack 'C*', map { $_>=16 and $_-=16 } unpack('x60C80', $$dataPt); + return 0 unless /[A-Z]{2}RMC,(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d*?\d{1,2}\.\d+),([NS]),(\d*?\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/; + ($yr,$mon,$day,$hr,$min,$sec,$lat,$latRef,$lon,$lonRef) = ($13,$12,$11,$1,$2,$3,$5,$6,$7,$8); + $yr += ($yr >= 70 ? 1900 : 2000); + $spd = $9 * $knotsToKph if length $9; + $trk = $10 if length $10; + + } elsif ($$dataPt =~ /^.{64}[\x01-\x0c]\0{3}[\x01-\x1f]\0{3}A[NS][EW]\0{5}/s) { + + # Akaso V1 dascham + # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 00 00 00 [....freeGPS x...] + # 0010: 59 6e 64 41 6b 61 73 6f 43 61 72 00 00 00 00 00 [YndAkasoCar.....] + # 0020: 30 30 30 30 30 00 00 00 00 00 00 00 00 00 00 00 [00000...........] + # 0030: 0e 00 00 00 27 00 00 00 2c 00 00 00 e3 07 00 00 [....'...,.......] + # 0040: 05 00 00 00 1d 00 00 00 41 4e 45 00 00 00 00 00 [........ANE.....] + # 0050: f1 4e 3e 3d 90 df ca 40 e3 50 bf 0b 0b 31 a0 40 [.N>=...@.P...1.@] + # 0060: 4b dc c8 41 9a 79 a7 43 34 58 43 31 4f 37 31 35 [K..A.y.C4XC1O715] + # 0070: 35 31 32 36 36 35 37 35 59 4e 44 53 0d e7 cc f9 [51266575YNDS....] + # 0080: 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 [................] + # Redtiger F7N dashcam + # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 01 00 00 [..@.freeGPS ....] + # 0010: 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0020: 01 00 00 00 b0 56 50 01 7b 18 68 45 17 02 3f 46 [.....VP.{.hE..?F] + # 0030: 13 00 00 00 01 00 00 00 06 00 00 00 15 00 00 00 [................] + # 0040: 0c 00 00 00 1c 00 00 00 41 4e 57 00 00 00 00 00 [........ANW.....] + # 0050: 80 d4 26 4e 36 11 b5 40 74 b5 15 7b cd 7b f3 40 [..&N6..@t..{.{.@] + # 0060: 0a d7 a3 3d cd 4c 4e 43 38 34 37 41 45 48 31 36 [...=.LNC847AEH16] + # 0070: 33 36 30 38 32 34 35 37 59 53 4b 4a 01 00 00 00 [36082457YSKJ....] + # 0080: ec ff ff ff 00 00 00 00 0e 00 00 00 01 00 00 00 [................] + # 0090: 0a 00 00 00 e5 07 00 00 0c 00 00 00 1c 00 00 00 [................] + ($hr,$min,$sec,$yr,$mon,$day,$stat,$latRef,$lonRef) = + unpack('x48V6a1a1a1x1', $$dataPt); + # ignore invalid fixes + return 0 unless $stat eq 'A' and ($latRef eq 'N' or $latRef eq 'S') and + ($lonRef eq 'E' or $lonRef eq 'W'); + + $et->WarnOnce('GPSLatitude/Longitude encryption is not yet known, so these will be wrong'); + # (see https://exiftool.org/forum/index.php?topic=11320.0) + + SetByteOrder('II'); + + $spd = GetFloat($dataPt, 0x60); + $trk = GetFloat($dataPt, 0x64) + 180; # (why is this off by 180?) + $lat = GetDouble($dataPt, 0x50); # latitude is here, but encrypted somehow + $lon = GetDouble($dataPt, 0x58); # longitude is here, but encrypted somehow + $ddd = 1; # don't convert until we know what the format is + + SetByteOrder('MM'); + #my $serialNum = substr($$dataPt, 0x68, 20); + + } elsif ($$dataPt =~ /^.{12}\xac\0\0\0.{44}(.{72})/s) { + + # EACHPAI dash cam + # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 ac 00 00 00 [....freeGPS ....] + # 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0030: 00 00 00 00 00 00 00 00 00 00 00 00 34 57 60 62 [............4W`b] + # 0040: 5d 53 3c 41 47 45 45 42 42 3e 40 40 40 3c 51 3c []S<AGEEBB>@@@<Q<] + # 0050: 44 42 44 40 3e 48 46 43 45 3c 5e 3c 40 48 43 41 [DBD@>HFCE<^<@HCA] + # 0060: 42 3e 46 42 47 48 3c 67 3c 40 3e 40 42 3c 43 3e [B>FBGH<g<@>@B<C>] + # 0070: 43 41 3c 40 42 40 46 42 40 3c 3c 3c 51 3a 47 46 [CA<@B@FB@<<<Q:GF] + # 0080: 00 2a 36 35 00 00 00 00 00 00 00 00 00 00 00 00 [.*65............] + + $et->WarnOnce("Can't yet decrypt EACHPAI timed GPS", 1); + # (see https://exiftool.org/forum/index.php?topic=5095.msg61266#msg61266) + return 1; + + my $time = pack 'C*', map { $_ ^= 0 } unpack 'C*', $1; + # bytes 7-12 are the timestamp in ASCII HHMMSS after xor-ing with 0x70 + substr($time,7,6) = pack 'C*', map { $_ ^= 0x70 } unpack 'C*', substr($time,7,6); + # (other values are currently unknown) + + } elsif ($$dataPt =~ /^.{64}A([NS])([EW])\0/s) { + + # Vantrue S1 dashcam + # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 00 00 00 [....freeGPS x...] + # 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0030: 68 6f 72 73 6f 6e 74 65 63 68 00 00 00 00 00 00 [horsontech......] + # 0040: 41 4e 45 00 15 00 00 00 07 00 00 00 02 00 00 00 [ANE.............] + # 0050: 03 00 00 00 35 00 00 00 05 00 00 00 4f 74 4c 44 [....5.......OtLD] + # 0060: e2 77 a0 45 89 c1 98 42 71 bd ac 42 02 ab 0d 43 [.w.E...Bq..B...C] + # 0070: 05 00 00 00 7f 00 00 00 07 01 00 00 00 00 00 00 [................] + ($latRef, $lonRef) = ($1, $2); + ($yr,$mon,$day,$hr,$min,$sec,@acc) = unpack('x68V6x20V3', $$dataPt); + return 0 unless $mon>=1 and $mon<=12 and $day>=1 and $day<=31; + $yr += 2000 if $yr < 2000; + # (not sure about acc scaling) + map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 1000 } @acc; + SetByteOrder('II'); + $lon = GetFloat($dataPt, 0x5c); + $lat = GetFloat($dataPt, 0x60); + $spd = GetFloat($dataPt, 0x64) * $knotsToKph; + $trk = GetFloat($dataPt, 0x68); + $alt = GetFloat($dataPt, 0x6c); + SetByteOrder('MM'); + + } else { + + # decode binary GPS format (Viofo A119S, ref 2) + # header looks like this in my sample: + # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...] + # 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0030: 10 00 00 00 2d 00 00 00 14 00 00 00 11 00 00 00 [....-...........] + # 0040: 0c 00 00 00 1f 00 00 00 41 4e 45 00 5d 9a a9 45 [........ANE.]..E] + # 0050: ab 1e e5 44 ec 51 f0 40 b8 5e a5 43 00 00 00 00 [...D.Q.@.^.C....] + # (records are same structure as Type 3 Novatek GPS in ProcessFreeGPS2() below) + ($hr,$min,$sec,$yr,$mon,$day,$stat,$latRef,$lonRef,$lat,$lon,$spd,$trk) = + unpack('x48V6a1a1a1x1V4', $$dataPt); + # ignore invalid fixes + return 0 unless $stat eq 'A' and ($latRef eq 'N' or $latRef eq 'S') and + ($lonRef eq 'E' or $lonRef eq 'W'); + ($lat,$lon,$spd,$trk) = unpack 'f*', pack 'L*', $lat, $lon, $spd, $trk; + # lat/lon also stored as doubles by Transcend Driver Pro 230 (ref PH) + SetByteOrder('II'); + my ($lat2, $lon2, $alt2) = ( + GetDouble($dataPt, 0x70), + GetDouble($dataPt, 0x80), + # GetDouble($dataPt, 0x98), # (don't know what this is) + GetDouble($dataPt,0xa0), + # GetDouble($dataPt,0xa8)) # (don't know what this is) + ); + if (abs($lat2-$lat) < 0.001 and abs($lon2-$lon) < 0.001) { + $lat = $lat2; + $lon = $lon2; + $alt = $alt2; + } + SetByteOrder('MM'); + $yr += 2000 if $yr < 2000; + $spd *= $knotsToKph; # convert speed to km/h + # ($trk is not confirmed; may be GPSImageDirection, ref PH) + } +# +# save tag values extracted by above code +# + FoundSomething($et, $tagTbl, $$dirInfo{SampleTime}, $$dirInfo{SampleDuration}); + # lat/long are in DDDMM.MMMM format + ConvertLatLon($lat, $lon) unless $ddd; + $sec = '0' . $sec unless $sec =~ /^\d{2}/; # pad integer part of seconds to 2 digits + if (defined $yr) { + my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%sZ',$yr,$mon,$day,$hr,$min,$sec); + $et->HandleTag($tagTbl, GPSDateTime => $time); + } elsif (defined $hr) { + my $time = sprintf('%.2d:%.2d:%sZ',$hr,$min,$sec); + $et->HandleTag($tagTbl, GPSTimeStamp => $time); + } + $et->HandleTag($tagTbl, GPSLatitude => $lat * ($latRef eq 'S' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSLongitude => $lon * ($lonRef eq 'W' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSAltitude => $alt) if defined $alt; + $et->HandleTag($tagTbl, GPSSpeed => $spd) if defined $spd; + $et->HandleTag($tagTbl, GPSTrack => $trk) if defined $trk; + while (@xtra) { + my $tag = shift @xtra; + $et->HandleTag($tagTbl, $tag => shift @xtra); + } + $et->HandleTag($tagTbl, Accelerometer => \@acc) if @acc; + return 1; +} + +#------------------------------------------------------------------------------ +# Process "freeGPS " data blocks _not_ referenced by a 'gps ' atom +# Inputs: 0) ExifTool ref, 1) dirInfo ref {DataPt,DataPos,DirLen}, 2) tagTable ref +# Returns: 1 on success +# Notes: +# - also see ProcessFreeGPS() above +sub ProcessFreeGPS2($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + my ($yr, $mon, $day, $hr, $min, $sec, $pos, @acc); + my ($lat, $latRef, $lon, $lonRef, $spd, $trk, $alt, $ddd, $unk); + + return 0 if $dirLen < 82; # minimum size of block with a single GPS record + + if (substr($$dataPt,0x45,3) eq 'ATC') { + + # header looks like this: (sample 1) + # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 38 06 00 00 [....freeGPS 8...] + # 0010: 49 51 53 32 30 31 33 30 33 30 36 42 00 00 00 00 [IQS20130306B....] + # 0020: 4d 61 79 20 31 35 20 32 30 31 35 2c 20 31 39 3a [May 15 2015, 19:] + # (sample 2) + # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 06 00 00 [....freeGPS L...] + # 0010: 32 30 31 33 30 33 31 38 2e 30 31 00 00 00 00 00 [20130318.01.....] + # 0020: 4d 61 72 20 31 38 20 32 30 31 33 2c 20 31 34 3a [Mar 18 2013, 14:] + + my ($recPos, $lastRecPos, $foundNew); + my $verbose = $et->Options('Verbose'); + my $dataPos = $$dirInfo{DataPos}; + my $then = $$et{FreeGPS2}{Then}; + $then or $then = $$et{FreeGPS2}{Then} = [ (0) x 6 ]; + # Loop through records in the ATC-type GPS block until we find the most recent. + # If we have already found one, then we only need to check the first record + # (in case the buffer wrapped around), and the record after the position of + # the last record we found, because the others will be old. Odd, but this + # is the way it is done... I have only seen one new 52-byte record in the + # entire 32 kB block, but the entire device ring buffer (containing 30 + # entries in my samples) is stored every time. The code below allows for + # the possibility of missing blocks and multiple new records in a single + # block, but I have never seen this. Note that there may be some earlier + # GPS records at the end of the first block that we will miss decoding, but + # these should (I believe) be before the start of the video +ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) { + + my $a = substr($$dataPt, $recPos, 52); # isolate a single record + # decrypt record + my @a = unpack('C*', $a); + my ($key1, $key2) = @a[0x14, 0x1c]; + $a[$_] ^= $key1 foreach 0x00..0x14, 0x18..0x1b; + $a[$_] ^= $key2 foreach 0x1c, 0x20..0x32; + my $b = pack 'C*', @a; + # unpack and validate date/time + my @now = unpack 'x13C3x28vC2', $b; # (H-1,M,S,Y,m,d) + $now[0] = ($now[0] + 1) & 0xff; # increment hour + my $i; + for ($i=0; $i<@dateMax; ++$i) { + next if $now[$i] <= $dateMax[$i]; + $et->WarnOnce('Invalid GPS date/time'); + next ATCRec; # ignore this record + } + # look for next ATC record in temporal sequence + foreach $i (3..5, 0..2) { + if ($now[$i] < $$then[$i]) { + last ATCRec if $foundNew; + last; + } + next if $now[$i] == $$then[$i]; + # we found a more recent record -- extract it and remember its location + if ($verbose) { + $et->VPrint(2, " + [encrypted GPS record]\n"); + $et->VerboseDump(\$a, DataPos => $dataPos + $recPos); + $et->VPrint(2, " + [decrypted GPS record]\n"); + $et->VerboseDump(\$b); + #my @v = unpack 'H8VVC4V!CA3V!CA3VvvV!vCCCCH4', $b; + #$et->VPrint(2, " + [unpacked: @v]\n"); + # values unpacked above (ref PH): + # 0) 0x00 4 bytes - byte 0=1, 1=counts to 255, 2=record index, 3=0 (ref 3) + # 1) 0x04 4 bytes - int32u: bits 0-4=day, 5-8=mon, 9-19=year (ref 3) + # 2) 0x08 4 bytes - int32u: bits 0-5=sec, 6-11=min, 12-16=hour (ref 3) + # 3) 0x0c 1 byte - seen values of 0,1,2 - GPS status maybe? + # 4) 0x0d 1 byte - hour minus 1 + # 5) 0x0e 1 byte - minute + # 6) 0x0f 1 byte - second + # 7) 0x10 4 bytes - int32s latitude * 1e7 + # 8) 0x14 1 byte - always 0 (used for decryption) + # 9) 0x15 3 bytes - always "ATC" + # 10) 0x18 4 bytes - int32s longitude * 1e7 + # 11) 0x1c 1 byte - always 0 (used for decryption) + # 12) 0x1d 3 bytes - always "001" + # 13) 0x20 4 bytes - int32s speed * 100 (m/s) + # 14) 0x24 2 bytes - int16u heading * 100 (-180 to 180 deg) + # 15) 0x26 2 bytes - always zero + # 16) 0x28 4 bytes - int32s altitude * 1000 (ref 3) + # 17) 0x2c 2 bytes - int16u year + # 18) 0x2e 1 byte - month + # 19) 0x2f 1 byte - day + # 20) 0x30 1 byte - unknown + # 21) 0x31 1 byte - always zero + # 22) 0x32 2 bytes - checksum ? + } + @$then = @now; + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + $trk = Get16s(\$b, 0x24) / 100; + $trk += 360 if $trk < 0; + my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ', @now[3..5, 0..2]); + $et->HandleTag($tagTbl, GPSDateTime => $time); + $et->HandleTag($tagTbl, GPSLatitude => Get32s(\$b, 0x10) / 1e7); + $et->HandleTag($tagTbl, GPSLongitude => Get32s(\$b, 0x18) / 1e7); + $et->HandleTag($tagTbl, GPSSpeed => Get32s(\$b, 0x20) / 100 * $mpsToKph); + $et->HandleTag($tagTbl, GPSTrack => $trk); + $et->HandleTag($tagTbl, GPSAltitude => Get32s(\$b, 0x28) / 1000); + $lastRecPos = $recPos; + $foundNew = 1; + # don't skip to location of previous recent record in ring buffer + # since we found a more recent record here + delete $$et{FreeGPS2}{RecentRecPos}; + last; + } + # skip older records + my $recentRecPos = $$et{FreeGPS2}{RecentRecPos}; + $recPos = $recentRecPos if $recentRecPos and $recPos < $recentRecPos; + } + # save position of most recent record (needed when parsing the next freeGPS block) + $$et{FreeGPS2}{RecentRecPos} = $lastRecPos; + return 1; + + } elsif ($$dataPt =~ /^.{60}A\0.{10}([NS])\0.{14}([EW])\0/s) { + + # header looks like this in my sample: + # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 08 01 00 00 [....freeGPS ....] + # 0010: 32 30 31 33 30 38 31 35 2e 30 31 00 00 00 00 00 [20130815.01.....] + # 0020: 4a 75 6e 20 31 30 20 32 30 31 37 2c 20 31 34 3a [Jun 10 2017, 14:] + + # Type 2 (ref PH): + # 0x30 - int32u hour + # 0x34 - int32u minute + # 0x38 - int32u second + # 0x3c - int32u GPS status ('A' or 'V') + # 0x40 - double latitude (DDMM.MMMMMM) + # 0x48 - int32u latitude ref ('N' or 'S') + # 0x50 - double longitude (DDMM.MMMMMM) + # 0x58 - int32u longitude ref ('E' or 'W') + # 0x60 - double speed (knots) + # 0x68 - double heading (deg) + # 0x70 - int32u year - 2000 + # 0x74 - int32u month + # 0x78 - int32u day + # 0x7c - int32s[3] accelerometer * 1000 + ($latRef, $lonRef) = ($1, $2); + ($hr,$min,$sec,$yr,$mon,$day,@acc) = unpack('x48V3x52V6', $$dataPt); + map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 1000 } @acc; + $lat = GetDouble($dataPt, 0x40); + $lon = GetDouble($dataPt, 0x50); + $spd = GetDouble($dataPt, 0x60) * $knotsToKph; + $trk = GetDouble($dataPt, 0x68); + + } elsif ($$dataPt =~ /^.{72}A([NS])([EW])/s) { + + # Type 3 (Novatek GPS, ref 2): (in case it wasn't decoded via 'gps ' atom) + # 0x30 - int32u hour + # 0x34 - int32u minute + # 0x38 - int32u second + # 0x3c - int32u year - 2000 + # 0x40 - int32u month + # 0x44 - int32u day + # 0x48 - int8u GPS status ('A' or 'V') + # 0x49 - int8u latitude ref ('N' or 'S') + # 0x4a - int8u longitude ref ('E' or 'W') + # 0x4b - 0 + # 0x4c - float latitude (DDMM.MMMMMM) + # 0x50 - float longitude (DDMM.MMMMMM) + # 0x54 - float speed (knots) + # 0x58 - float heading (deg) + # Type 3b, same as above for 0x30-0x4a (ref PH) + # 0x4c - int32s latitude (decimal degrees * 1e7) + # 0x50 - int32s longitude (decimal degrees * 1e7) + # 0x54 - int32s speed (m/s * 100) + # 0x58 - float altitude (m * 1000, NC) + ($latRef, $lonRef) = ($1, $2); + ($hr,$min,$sec,$yr,$mon,$day) = unpack('x48V6', $$dataPt); + if (substr($$dataPt, 16, 3) eq 'IQS') { + # Type 3b (ref PH) + # header looks like this in my sample: + # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...] + # 0010: 49 51 53 5f 41 37 5f 32 30 31 35 30 34 31 37 00 [IQS_A7_20150417.] + # 0020: 4d 61 72 20 32 39 20 32 30 31 37 2c 20 31 36 3a [Mar 29 2017, 16:] + $ddd = 1; + $lat = abs Get32s($dataPt, 0x4c) / 1e7; + $lon = abs Get32s($dataPt, 0x50) / 1e7; + $spd = Get32s($dataPt, 0x54) / 100 * $mpsToKph; + $alt = GetFloat($dataPt, 0x58) / 1000; # (NC) + } else { + # Type 3 (ref 2) + # (no sample with this format) + $lat = GetFloat($dataPt, 0x4c); + $lon = GetFloat($dataPt, 0x50); + $spd = GetFloat($dataPt, 0x54) * $knotsToKph; + $trk = GetFloat($dataPt, 0x58); + } + + } elsif ($$dataPt =~ /^.{60}A\0.{6}([NS])\0.{6}([EW])\0/s and $dirLen >= 112) { + + # header looks like this in my sample (unknown dashcam, "Anticlock 2 2020_1125_1455_007.MOV"): + # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 68 00 00 00 [....freeGPS h...] + # 0010: 32 30 31 33 30 33 32 35 41 00 00 00 00 00 00 00 [20130325A.......] + # 0020: 41 70 72 20 20 36 20 32 30 31 36 2c 20 31 36 3a [Apr 6 2016, 16:] + # 0030: 0e 00 00 00 38 00 00 00 22 00 00 00 41 00 00 00 [....8..."...A...] + # 0040: 8a 63 24 45 53 00 00 00 9f e6 42 45 45 00 00 00 [.c$ES.....BEE...] + # 0050: 59 c0 04 3f 52 b8 42 41 14 00 00 00 0b 00 00 00 [Y..?R.BA........] + # 0060: 19 00 00 00 06 00 00 00 05 00 00 00 f6 ff ff ff [................] + # 0070: 03 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 [................] + ($latRef, $lonRef) = ($1, $2); + ($hr,$min,$sec,$yr,$mon,$day,@acc) = unpack('x48V3x28V6',$$dataPt); + map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 1000 } @acc; # (NC) + $lat = GetFloat($dataPt, 0x40); + $lon = GetFloat($dataPt, 0x48); + $spd = GetFloat($dataPt, 0x50); + $trk = GetFloat($dataPt, 0x54); + + } elsif ($$dataPt =~ /^.{16}A([NS])([EW])\0/s) { + + # INNOVV MP4 video (same format as INNOVV TS) + while ($$dataPt =~ /(A[NS][EW]\0.{28})/g) { + my $dat = $1; + $lat = abs(GetFloat(\$dat, 4)); # (abs just to be safe) + $lon = abs(GetFloat(\$dat, 8)); # (abs just to be safe) + $spd = GetFloat(\$dat, 12) * $knotsToKph; + $trk = GetFloat(\$dat, 16); + @acc = unpack('x20V3', $dat); + map { $_ = $_ - 4294967296 if $_ >= 0x80000000 } @acc; + ConvertLatLon($lat, $lon); + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + $et->HandleTag($tagTbl, GPSLatitude => $lat * (substr($dat,1,1) eq 'S' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSLongitude => $lon * (substr($dat,2,1) eq 'W' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSSpeed => $spd); + $et->HandleTag($tagTbl, GPSTrack => $trk); + $et->HandleTag($tagTbl, Accelerometer => "@acc"); + } + return 1; + + } else { + + # (look for binary GPS as stored by NextBase 512G, ref PH) + # header looks like this in my sample: + # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 01 00 00 [....freeGPS x...] + # 0010: 78 2e 78 78 00 00 00 00 00 00 00 00 00 00 00 00 [x.xx............] + # 0020: 30 30 30 30 30 00 00 00 00 00 00 00 00 00 00 00 [00000...........] + + # followed by a number of 32-byte records in this format (big endian!): + # 0x30 - int16u unknown (seen: 0x24 0x53 = "$S") + # 0x32 - int16u speed (m/s * 100) + # 0x34 - int16s heading (deg * 100) (or GPSImgDirection?) + # 0x36 - int16u year + # 0x38 - int8u month + # 0x39 - int8u day + # 0x3a - int8u hour + # 0x3b - int8u min + # 0x3c - int16u sec * 10 + # 0x3e - int8u unknown (seen: 2) + # 0x3f - int32s latitude (decimal degrees * 1e7) + # 0x43 - int32s longitude (decimal degrees * 1e7) + # 0x47 - int8u unknown (seen: 16) + # 0x48-0x4f - all zero + for ($pos=0x32; ; ) { + ($spd,$trk,$yr,$mon,$day,$hr,$min,$sec,$unk,$lat,$lon) = unpack "x${pos}nnnCCCCnCNN", $$dataPt; + # validate record using date/time + last if $yr < 2000 or $yr > 2200 or + $mon < 1 or $mon > 12 or + $day < 1 or $day > 31 or + $hr > 59 or $min > 59 or $sec > 600; + # change lat/lon to signed integer and divide by 1e7 + map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 1e7 } $lat, $lon; + $trk -= 0x10000 if $trk >= 0x8000; # make it signed + $trk /= 100; + $trk += 360 if $trk < 0; + my $time = sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%04.1fZ", $yr, $mon, $day, $hr, $min, $sec/10); + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + $et->HandleTag($tagTbl, GPSDateTime => $time); + $et->HandleTag($tagTbl, GPSLatitude => $lat); + $et->HandleTag($tagTbl, GPSLongitude => $lon); + $et->HandleTag($tagTbl, GPSSpeed => $spd / 100 * $mpsToKph); + $et->HandleTag($tagTbl, GPSTrack => $trk); + last if $pos += 0x20 > length($$dataPt) - 0x1e; + } + return $$et{DOC_NUM} ? 1 : 0; # return 0 if nothing extracted + } +# +# save tag values extracted by above code +# + return 0 if $mon < 1 or $mon > 12; # quick sanity check + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + $yr += 2000 if $yr < 2000; + my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ', $yr, $mon, $day, $hr, $min, $sec); + # convert from DDMM.MMMMMM to DD.DDDDDD format if necessary + ConvertLatLon($lat, $lon) unless $ddd; + $et->HandleTag($tagTbl, GPSDateTime => $time); + $et->HandleTag($tagTbl, GPSLatitude => $lat * ($latRef eq 'S' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSLongitude => $lon * ($lonRef eq 'W' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSSpeed => $spd) if defined $spd; # (now in km/h) + $et->HandleTag($tagTbl, GPSTrack => $trk) if defined $trk; + if (defined $alt) { + $et->HandleTag($tagTbl, GPSAltitude => $alt); + } + $et->HandleTag($tagTbl, Accelerometer => "@acc") if @acc; + return 1; +} + + +#------------------------------------------------------------------------------ +# Extract embedded information referenced from a track +# Inputs: 0) ExifTool ref, 1) tag name, 2) data ref +sub ParseTag($$$) +{ + local $_; + my ($et, $tag, $dataPt) = @_; + my $dataLen = length $$dataPt; + + if ($tag eq 'stsz' or $tag eq 'stz2' and $dataLen > 12) { + # read the sample sizes + my ($sz, $num) = unpack('x4N2', $$dataPt); + my $size = $$et{ee}{size} = [ ]; + if ($tag eq 'stsz') { + if ($sz == 0) { + @$size = ReadValue($dataPt, 12, 'int32u', $num, $dataLen-12); + } else { + @$size = ($sz) x $num; + } + } else { + $sz &= 0xff; + if ($sz == 4) { + my @tmp = ReadValue($dataPt, 12, 'int8u', int(($num+1)/2), $dataLen-12); + foreach (@tmp) { + push @$size, $_ >> 4; + push @$size, $_ & 0xff; + } + } elsif ($sz == 8 || $sz == 16) { + @$size = ReadValue($dataPt, 12, "int${sz}u", $num, $dataLen-12); + } + } + } elsif ($tag eq 'stco' or $tag eq 'co64' and $dataLen > 8) { + # read the chunk offsets + my $num = unpack('x4N', $$dataPt); + my $stco = $$et{ee}{stco} = [ ]; + @$stco = ReadValue($dataPt, 8, $tag eq 'stco' ? 'int32u' : 'int64u', $num, $dataLen-8); + } elsif ($tag eq 'stsc' and $dataLen > 8) { + # read the sample-to-chunk box + my $num = unpack('x4N', $$dataPt); + if ($dataLen >= 8 + $num * 12) { + my ($i, @stsc); + for ($i=0; $i<$num; ++$i) { + # list of (first-chunk, samples-per-chunk, sample-description-index) + push @stsc, [ unpack('x'.(8+$i*12).'N3', $$dataPt) ]; + } + $$et{ee}{stsc} = \@stsc; + } + } elsif ($tag eq 'stts' and $dataLen > 8) { + # read the time-to-sample box + my $num = unpack('x4N', $$dataPt); + if ($dataLen >= 8 + $num * 8) { + $$et{ee}{stts} = [ unpack('x8N'.($num*2), $$dataPt) ]; + } + } elsif ($tag eq 'avcC') { + # read the AVC compressor configuration + $$et{ee}{avcC} = $$dataPt if $dataLen >= 7; # (minimum length is 7) + } elsif ($tag eq 'JPEG') { + $$et{ee}{JPEG} = $$dataPt; + } elsif ($tag eq 'gps ' and $dataLen > 8) { + # decode Novatek 'gps ' box (ref 2) + my $num = Get32u($dataPt, 4); + $num = int(($dataLen - 8) / 8) if $num * 8 + 8 > $dataLen; + my $start = $$et{ee}{start} = [ ]; + my $size = $$et{ee}{size} = [ ]; + my $i; + for ($i=0; $i<$num; ++$i) { + push @$start, Get32u($dataPt, 8 + $i * 8); + push @$size, Get32u($dataPt, 12 + $i * 8); + } + $$et{HandlerType} = $tag; # fake handler type + ProcessSamples($et); # we have all we need to process sample data now + } elsif ($tag eq 'GPS ') { + my $pos = 0; + my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream'); + SetByteOrder('II'); + while ($pos + 36 < $dataLen) { + my $dat = substr($$dataPt, $pos, 36); + last if $dat eq "\x0" x 36; + my @a = unpack 'VVVVaVaV', $dat; + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + # 0=1, 1=1, 2=secs, 3=? + SetGPSDateTime($et, $tagTbl, $a[2]); + my $lat = $a[5] / 1e3; + my $lon = $a[7] / 1e3; + ConvertLatLon($lat, $lon); + $lat = -abs($lat) if $a[4] eq 'S'; + $lon = -abs($lon) if $a[6] eq 'W'; + $et->HandleTag($tagTbl, GPSLatitude => $lat); + $et->HandleTag($tagTbl, GPSLongitude => $lon); + $et->HandleTag($tagTbl, GPSSpeed => $a[3] / 1e3); + $pos += 36; + } + SetByteOrder('MM'); + delete $$et{DOC_NUM}; + } +} + +#------------------------------------------------------------------------------ +# Process Yuneec 'tx3g' sbtl metadata (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub Process_tx3g($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + return 0 if length $$dataPt < 2; + pos($$dataPt) = 2; # skip 2-byte length word + $et->VerboseDir('tx3g', undef, length($$dataPt)-2); + $et->HandleTag($tagTablePtr, 'Text', substr($$dataPt, 2)); + if ($$dataPt =~ /^..\w{3} (\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2}) ?([-+])(\d{2}):?(\d{2})$/s) { + $et->HandleTag($tagTablePtr, 'DateTime', "$1:$2:$3 $4$5$6:$7"); + } else { + $et->HandleTag($tagTablePtr, $1, $2) while $$dataPt =~ /(\w+):([^:]*[^:\s])(\s|$)/sg; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process GM 'marl' ctbx metadata (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub Process_marl($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + return 0 if length $$dataPt < 2; + + # 8-byte records: + # byte 0 seems to be tag ID (0=timestamp in sec * 1e7) + # bytes 1-3 seem to be 24-bit signed integer (unknown meaning) + # bytes 4-7 are an int32u value, usually a multiple of 10000 + + $et->WarnOnce("Can't yet decode timed GM data", 1); + # (see https://exiftool.org/forum/index.php?topic=11335.msg61393#msg61393) + return 1; +} + +#------------------------------------------------------------------------------ +# Process QuickTime 'mebx' timed metadata +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +# - uses tag ID keys stored in the ExifTool ee data member by a previous call to SaveMetaKeys +sub Process_mebx($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $ee = $$et{ee} or return 0; + return 0 unless $$ee{'keys'}; + my $dataPt = $$dirInfo{DataPt}; + + # parse using information from 'keys' table (eg. Apple iPhone7+ hevc 'Core Media Data Handler') + $et->VerboseDir('mebx', undef, length $$dataPt); + my ($pos, $len); + for ($pos=0; $pos+8<length($$dataPt); $pos+=$len) { + $len = Get32u($dataPt, $pos); + last if $len < 8 or $pos + $len > length $$dataPt; + my $id = substr($$dataPt, $pos+4, 4); + my $info = $$ee{'keys'}{$id}; + if ($info) { + my $tag = $$info{TagID}; + unless ($$tagTbl{$tag}) { + next unless $tag =~ /^[-\w.]+$/; + # create info for tags with reasonable id's + my $name = $tag; + $name =~ s/[-.](.)/\U$1/g; + AddTagToTable($tagTbl, $tag, { Name => ucfirst($name) }); + } + my $val = ReadValue($dataPt, $pos+8, $$info{Format}, undef, $len-8); + $et->HandleTag($tagTbl, $tag, $val, + DataPt => $dataPt, + Base => $$dirInfo{Base}, + Start => $pos + 8, + Size => $len - 8, + ); + } else { + $et->WarnOnce('No key information for mebx ID ' . PrintableTagID($id,1)); + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process QuickTime '3gf' timed metadata (ref PH, Pittasoft Blackvue dashcam) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub Process_3gf($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + my $recLen = 10; # 10-byte record length + $et->VerboseDir('3gf', undef, $dirLen); + if ($dirLen > $recLen and not $et->Options('ExtractEmbedded')) { + $dirLen = $recLen; + EEWarn($et); + } + my $pos; + for ($pos=0; $pos+$recLen<=$dirLen; $pos+=$recLen) { + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + my $tc = Get32u($dataPt, $pos); + last if $tc == 0xffffffff; + my ($x, $y, $z) = (Get16s($dataPt, $pos+4)/10, Get16s($dataPt, $pos+6)/10, Get16s($dataPt, $pos+8)/10); + $et->HandleTag($tagTbl, TimeCode => $tc / 1000); + $et->HandleTag($tagTbl, Accelerometer => "$x $y $z"); + } + delete $$et{DOC_NUM}; + return 1; +} + +#------------------------------------------------------------------------------ +# Process DuDuBell M1 dashcam / VSYS M6L 'gps0' atom (ref PH) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub Process_gps0($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + my $recLen = 32; # 32-byte record length + $et->VerboseDir('gps0', undef, $dirLen); + SetByteOrder('II'); + if ($dirLen > $recLen and not $et->Options('ExtractEmbedded')) { + $dirLen = $recLen; + EEWarn($et); + } + my $pos; + for ($pos=0; $pos+$recLen<=$dirLen; $pos+=$recLen) { + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + # lat/long are in DDDMM.MMMM format + my $lat = GetDouble($dataPt, $pos); + my $lon = GetDouble($dataPt, $pos+8); + next if abs($lat) > 9000 or abs($lon) > 18000; + ConvertLatLon($lat, $lon); + my @a = unpack('C*', substr($$dataPt, $pos+22, 6)); # unpack date/time + $a[0] += 2000; + $et->HandleTag($tagTbl, GPSDateTime => sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ", @a)); + $et->HandleTag($tagTbl, GPSLatitude => $lat); + $et->HandleTag($tagTbl, GPSLongitude => $lon); + $et->HandleTag($tagTbl, GPSSpeed => Get16u($dataPt, $pos+0x14)); + $et->HandleTag($tagTbl, GPSTrack => Get8u($dataPt, $pos+0x1c) * 2); # (NC) + $et->HandleTag($tagTbl, GPSAltitude => Get32s($dataPt, $pos + 0x10)); + # yet to be decoded: + # 0x1d - int8u[3] seen: "1 1 0" + } + delete $$et{DOC_NUM}; + SetByteOrder('MM'); + return 1; +} + +#------------------------------------------------------------------------------ +# Process DuDuBell M1 dashcam / VSYS M6L 'gsen' atom (ref PH) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub Process_gsen($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + my $recLen = 3; # 3-byte record length + $et->VerboseDir('gsen', undef, $dirLen); + if ($dirLen > $recLen and not $et->Options('ExtractEmbedded')) { + $dirLen = $recLen; + EEWarn($et); + } + my $pos; + for ($pos=0; $pos+$recLen<=$dirLen; $pos+=$recLen) { + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + my @acc = map { $_ /= 16 } unpack "x${pos}c3", $$dataPt; + $et->HandleTag($tagTbl, Accelerometer => "@acc"); + # (there are no associated timestamps, but these are sampled at 5 Hz in my test video) + } + delete $$et{DOC_NUM}; + return 1; +} + +#------------------------------------------------------------------------------ +# Process RIFF-format trailer written by Auto-Vox dashcam (ref PH) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +# Note: This trailer is basically RIFF chunks added to a QuickTime-format file (augh!), +# but there are differences in the record formats so we can't just call +# ProcessRIFF to process the gps0 and gsen atoms using the routines above +sub ProcessRIFFTrailer($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my ($buff, $pos); + SetByteOrder('II'); + for (;;) { + last unless $raf->Read($buff, 8) == 8; + my ($tag, $len) = unpack('a4V', $buff); + last if $tag eq "\0\0\0\0"; + unless ($tag =~ /^[\w ]{4}/ and $len < 0x2000000) { + $et->Warn('Bad RIFF trailer'); + last; + } + $raf->Read($buff, $len) == $len or $et->Warn("Truncated $tag record in RIFF trailer"), last; + if ($verbose) { + $et->VPrint(0, " - RIFF trailer '${tag}' ($len bytes)\n"); + $et->VerboseDump(\$buff, Addr => $raf->Tell() - $len) if $verbose > 2; + $$et{INDENT} .= '| '; + $et->VerboseDir($tag, undef, $len) if $tag =~ /^(gps0|gsen)$/; + } + if ($tag eq 'gps0') { + # (similar to record decoded in Process_gps0, but with some differences) + # 0000: 41 49 54 47 74 46 94 f6 c6 c5 b4 40 34 a2 b4 37 [AITGtF.....@4..7] + # 0010: f8 7b 8a 40 ff ff 00 00 38 00 77 0a 1a 0c 12 28 [.{.@....8.w....(] + # 0020: 8d 01 02 40 29 07 00 00 [...@)...] + # 0x00 - undef[4] 'AITG' + # 0x04 - double latitude (always positive) + # 0x0c - double longitude (always positive) + # 0x14 - ? seen hex "ff ff 00 00" (altitude in Process_gps0 record below) + # 0x18 - int16u speed in knots (different than km/hr in Process_gps0) + # 0x1a - int8u[6] yr-1900,mon,day,hr,min,sec (different than -2000 in Process_gps0) + # 0x20 - int8u direction in degrees / 2 + # 0x21 - int8u guessing that this is 1=N, 2=S - PH + # 0x22 - int8u guessing that this is 1=E, 2=W - PH + # 0x23 - ? seen hex "40" + # 0x24 - in32u time since start of video (ms) + my $recLen = 0x28; + for ($pos=0; $pos+$recLen<$len; $pos+=$recLen) { + substr($buff, $pos, 4) eq 'AITG' or $et->Warn('Unrecognized gps0 record'), last; + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + # lat/long are in DDDMM.MMMM format + my $lat = GetDouble(\$buff, $pos+4); + my $lon = GetDouble(\$buff, $pos+12); + $et->Warn('Bad gps0 record') and last if abs($lat) > 9000 or abs($lon) > 18000; + ConvertLatLon($lat, $lon); + $lat = -$lat if Get8u(\$buff, $pos+0x21) == 2; # wild guess + $lon = -$lon if Get8u(\$buff, $pos+0x22) == 2; # wild guess + my @a = unpack('C*', substr($buff, $pos+26, 6)); # unpack date/time + $a[0] += 1900; # (different than Proces_gps0) + $et->HandleTag($tagTbl, SampleTime => Get32u(\$buff, $pos + 0x24) / 1000); + $et->HandleTag($tagTbl, GPSDateTime => sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ", @a)); + $et->HandleTag($tagTbl, GPSLatitude => $lat); + $et->HandleTag($tagTbl, GPSLongitude => $lon); + $et->HandleTag($tagTbl, GPSSpeed => Get16u(\$buff, $pos+0x18) * $knotsToKph); + $et->HandleTag($tagTbl, GPSTrack => Get8u(\$buff, $pos+0x20) * 2); + } + } elsif ($tag eq 'gsen') { + # (similar to record decoded in Process_gsen) + # 0000: 41 49 54 53 1a 0d 05 ff c8 00 00 00 [AITS........] + # 0x00 - undef[4] 'AITS' + # 0x04 - int8s[3] accelerometer readings + # 0x07 - ? seen hex "ff" + # 0x08 - in32u time since start of video (ms) + my $recLen = 0x0c; + for ($pos=0; $pos+$recLen<$len; $pos+=$recLen) { + substr($buff, $pos, 4) eq 'AITS' or $et->Warn('Unrecognized gsen record'), last; + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + my @acc = map { $_ /= 24 } unpack('x'.($pos+4).'c3', $buff); + $et->HandleTag($tagTbl, SampleTime => Get32u(\$buff, $pos + 8) / 1000); + # 0=+Up, 1=+Right, 3=+Forward (calibration of 24 counts/g is a wild guess - PH) + $et->HandleTag($tagTbl, Accelerometer => "@acc"); + } + } + # also seen, but not decoded: + # gpsa (8 bytes): hex "01 20 00 00 08 03 02 08 " + # gsea (20 bytes): all zeros + $$et{INDENT} = substr($$et{INDENT}, 0, -2) if $verbose; + } + delete $$et{DOC_NUM}; + SetByteOrder('MM'); + return 1; +} + +#------------------------------------------------------------------------------ +# Process 'gps ' atom containing NMEA from Pittasoft Blackvue dashcam (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessNMEA($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my ($rtnVal, %fix); + # parse only RMC and GGA sentence [with leading timecode] for now + for (;;) { + my ($tc, $type, $tim); + if ($$dataPt =~ /(?:\[(\d+)\])?\$[A-Z]{2}(RMC|GGA),(\d{2}\d{2}\d+(\.\d*)?),/g) { + ($tc, $type, $tim) = ($1, $2, $3); + } + # write out last fix now if complete + # (use the GPS timestamps because they may be different for the same timecode) + if ($fix{tim} and (not $tim or $fix{tim} != $tim)) { + if ($fix{dat} and defined $fix{lat} and defined $fix{lon}) { + my $sampleTime; + $sampleTime = ($fix{tc} - $$et{StartTime}) / 1000 if $fix{tc} and $$et{StartTime}; + FoundSomething($et, $tagTbl, $sampleTime); + $et->HandleTag($tagTbl, GPSDateTime => $fix{dat}); + $et->HandleTag($tagTbl, GPSLatitude => $fix{lat}); + $et->HandleTag($tagTbl, GPSLongitude => $fix{lon}); + $et->HandleTag($tagTbl, GPSSpeed => $fix{spd} * $knotsToKph) if defined $fix{spd}; + $et->HandleTag($tagTbl, GPSTrack => $fix{trk}) if defined $fix{trk}; + $et->HandleTag($tagTbl, GPSAltitude => $fix{alt}) if defined $fix{alt}; + $et->HandleTag($tagTbl, GPSSatellites=> $fix{nsats}+0) if defined $fix{nsats}; + $et->HandleTag($tagTbl, GPSDOP => $fix{hdop}) if defined $fix{hdop}; + } + undef %fix; + } + $fix{tim} = $tim or last; + my $pos = pos($$dataPt); + pos($$dataPt) = $pos - length($tim) - 1; # rewind to re-parse time + # (parsing of NMEA strings copied from Geotag.pm) + if ($type eq 'RMC' and + $$dataPt =~ /\G(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/g) + { + my $year = $15 + ($15 >= 70 ? 1900 : 2000); + $fix{tc} = $tc; # use timecode of RMC sentence + $fix{dat} = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%sZ',$year,$14,$13,$1,$2,$3); + $fix{lat} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1); + $fix{lon} = (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1); + $fix{spd} = $11 if length $11; + $fix{trk} = $12 if length $12; + } elsif ($type eq 'GGA' and + $$dataPt =~ /\G(\d{2})(\d{2})(\d+(\.\d*)?),(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),[1-6]?,(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?/g) + { + $fix{lat} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1); + $fix{lon} = (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1); + @fix{qw(nsats hdop alt)} = ($11,$12,$13); + } else { + pos($$dataPt) = $pos; # continue searching from our last match + } + } + delete $$et{DOC_NUM}; + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Process 'gps ' or 'udat' atom possibly containing NMEA (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessGPSLog($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my ($rtnVal, @a); + + # try NMEA format first + return 1 if ProcessNMEA($et,$dirInfo,$tagTbl); + + # DENVER ACG-8050WMK2 format looks like this: + # 210318073213[1][N][52200970][E][006362321][+00152][100][00140][C000000]+000+000+000+000+000+000+000+000+000+000+000+000+000+000+000+000+000+000 + # YYMMDDHHMMSS A? NS lat EW lon alt kph dir kCal accel + while ($$dataPt =~ /\b(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\[1\]\[([NS])\]\[(\d{8})\]\[([EW])\]\[(\d{9})\]\[([-+]?\d*)\]\[(\d*)\]\[(\d*)\]\[C?(\d*)\](([-+]\d{3})+)/g) { + my $lat = substr( $8,0,2) + substr( $8,2) / 600000; + my $lon = substr($10,0,3) + substr($10,3) / 600000; + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + $et->HandleTag($tagTbl, GPSDateTime => "20$1:$2:$3 $4:$5:$6Z"); + $et->HandleTag($tagTbl, GPSLatitude => $lat * ($7 eq 'S' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSLongitude => $lon * ($9 eq 'W' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSAltitude => $11 / 10) if length $11; + $et->HandleTag($tagTbl, GPSSpeed => $12 + 0) if length $12; + $et->HandleTag($tagTbl, GPSTrack => $13 + 0) if length $13; + $et->HandleTag($tagTbl, KiloCalories => $14 / 10) if length $14; + $et->HandleTag($tagTbl, Accelerometer=> $15) if length $15; + $rtnVal = 1; + } + delete $$et{DOC_NUM}; + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Process TomTom Bandit Action Cam TTAD atom (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +my %ttLen = ( # lengths of known TomTom records + 0 => 12, # angular velocity (NC) + 1 => 4, # ? + 2 => 12, # ? + 3 => 12, # accelerometer (NC) + # (haven't seen a record 4 yet) + 5 => 92, # GPS + 0xff => 4, # timecode +); +sub ProcessTTAD($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + my $pos = 76; + + return 0 if $dirLen < $pos; + + $et->VerboseDir('TTAD', undef, $dirLen); + SetByteOrder('II'); + + my $eeOpt = $et->Options('ExtractEmbedded'); + my $unknown = $et->Options('Unknown'); + my $found = 0; + my $sampleTime = 0; + my $resync = 1; + my $skipped = 0; + my $warned; + + while ($pos < $dirLen) { + # get next record type + my $type = Get8u($dataPt, $pos++); + # resync if necessary by skipping data until next timecode record + if ($resync and $type != 0xff) { + ++$skipped > 0x100 and $et->Warn('Unrecognized or bad TTAD data', 1), last; + next; + } + unless ($ttLen{$type}) { + # skip unknown records + $et->Warn("Unknown TTAD record type $type",1) unless $warned; + $resync = $warned = 1; + ++$skipped; + next; + } + last if $pos + $ttLen{$type} > $dirLen; + if ($type == 0xff) { # timecode? + my $tm = Get32u($dataPt, $pos); + # validate timecode if skipping unknown data + if ($resync) { + if ($tm < $sampleTime or $tm > $sampleTime + 250) { + ++$skipped; + next; + } + undef $resync; + $skipped = 0; + } + $pos += $ttLen{$type}; + $sampleTime = $tm; + next; + } + unless ($eeOpt) { + # only extract one of each type without -ee option + $found & (1 << $type) and $pos += $ttLen{$type}, next; + $found |= (1 << $type); + } + if ($type == 0 or $type == 3) { + # (these are both just educated guesses - PH) + FoundSomething($et, $tagTbl, $sampleTime / 1000); + my @a = map { Get32s($dataPt,$pos+4*$_) / 1000 } 0..2; + $et->HandleTag($tagTbl, ($type ? 'Accelerometer' : 'AngularVelocity') => "@a"); + } elsif ($type == 5) { + # example records unpacked with 'dVddddVddddv*' + # datetime ? spd ele lat lon ? trk ? ? ? ? ? ? ? ? ? + # 2019:03:05 07:52:58.999Z 3 0.02 242 48.0254203 7.8497567 0 45.69 13.34 17.218 17.218 0 0 0 32760 5 0 + # 2019:03:05 07:52:59.999Z 3 0.14 242 48.0254203 7.8497567 0 45.7 12.96 15.662 15.662 0 0 0 32760 5 0 + # 2019:03:05 07:53:00.999Z 3 0.67 243.78 48.0254584 7.8497907 0 50.93 9.16 10.84 10.84 0 0 0 32760 5 0 + # (I think "5" may be the number of satellites. seen: 5,6,7 - PH) + FoundSomething($et, $tagTbl, $sampleTime / 1000); + my $t = GetDouble($dataPt, $pos); + $et->HandleTag($tagTbl, GPSDateTime => Image::ExifTool::ConvertUnixTime($t,undef,3).'Z'); + $et->HandleTag($tagTbl, GPSLatitude => GetDouble($dataPt, $pos+0x1c)); + $et->HandleTag($tagTbl, GPSLongitude => GetDouble($dataPt, $pos+0x24)); + $et->HandleTag($tagTbl, GPSAltitude => GetDouble($dataPt, $pos+0x14)); + $et->HandleTag($tagTbl, GPSSpeed => GetDouble($dataPt, $pos+0x0c) * $mpsToKph); + $et->HandleTag($tagTbl, GPSTrack => GetDouble($dataPt, $pos+0x30)); + if ($unknown) { + my @a = map { GetDouble($dataPt, $pos+0x38+8*$_) } 0..2; + $et->HandleTag($tagTbl, Unknown03 => "@a"); + } + } elsif ($type < 3) { + # as yet unknown: + # 1 - int32s[1]? (values around 98k) + # 2 - int32s[3] (values like "806 8124 4323" -- probably something * 1000 again) + if ($unknown) { + FoundSomething($et, $tagTbl, $sampleTime / 1000); + my $n = $type == 1 ? 0 : 2; + my @a = map { Get32s($dataPt,$pos+4*$_) } 0..$n; + $et->HandleTag($tagTbl, "Unknown0$type" => "@a"); + } + } else { + $et->WarnOnce("Unknown TTAD record type $type",1); + } + # without -ee, stop after we find types 0,3,5 (ie. bitmask 0x29) + $eeOpt or ($found & 0x29) != 0x29 or EEWarn($et), last; + $pos += $ttLen{$type}; + } + SetByteOrder('MM'); + delete $$et{DOC_NUM}; + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from Insta360 trailer (INSV and INSP files) (ref PH) +# Inputs: 0) ExifTool ref, 1) Optional dirInfo ref for returning trailer info +# Returns: true on success +sub ProcessInsta360($;$) +{ + local $_; + my ($et, $dirInfo) = @_; + my $raf = $$et{RAF}; + my $offset = $dirInfo ? $$dirInfo{Offset} || 0 : 0; + my $buff; + + return 0 unless $raf->Seek(-78-$offset, 2) and $raf->Read($buff, 78) == 78 and + substr($buff,-32) eq "8db42d694ccc418790edff439fe026bf"; # check magic number + + my $verbose = $et->Options('Verbose'); + my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream'); + my $fileEnd = $raf->Tell(); + my $trailerLen = unpack('x38V', $buff); + $trailerLen > $fileEnd and $et->Warn('Bad Insta360 trailer size'), return 0; + if ($dirInfo) { + $$dirInfo{DirLen} = $trailerLen; + $$dirInfo{DataPos} = $fileEnd - $trailerLen; + if ($$dirInfo{OutFile}) { + if ($$et{DEL_GROUP}{Insta360}) { + ++$$et{CHANGED}; + # just copy the trailer when writing + } elsif ($trailerLen > $fileEnd or not $raf->Seek($$dirInfo{DataPos}, 0) or + $raf->Read(${$$dirInfo{OutFile}}, $trailerLen) != $trailerLen) + { + return 0; + } else { + return 1; + } + } + $et->DumpTrailer($dirInfo) if $verbose or $$et{HTML_DUMP}; + } + unless ($et->Options('ExtractEmbedded')) { + # can arrive here when reading Insta360 trailer on JPEG image (INSP file) + $et->WarnOnce('Use ExtractEmbedded option to extract timed metadata from Insta360 trailer',3); + return 1; + } + + my $unknown = $et->Options('Unknown'); + # position relative to end of trailer (avoids using large offsets for files > 2 GB) + my $epos = -78-$offset; + my ($i, $p); + $$et{SET_GROUP0} = 'Trailer'; + $$et{SET_GROUP1} = 'Insta360'; + SetByteOrder('II'); + # loop through all records in the trailer, from last to first + for (;;) { + my ($id, $len) = unpack('vV', $buff); + ($epos -= $len) + $trailerLen < 0 and last; + $raf->Seek($epos, 2) or last; + my $dlen = $insvDataLen{$id}; + if ($verbose) { + $et->VPrint(0, sprintf("Insta360 Record 0x%x (offset 0x%x, %d bytes):\n", $id, $fileEnd + $epos, $len)); + } + # there are 2 types of record 0x300: + # 1. 56 byte records + # 0000: 4a f7 02 00 00 00 00 00 00 00 00 00 00 1e e7 3f [J..............?] + # 0010: 00 00 00 00 00 b2 ef bf 00 00 00 00 00 70 c1 bf [.............p..] + # 0020: 00 00 00 e0 91 5c 8c bf 00 00 00 20 8f ff 87 bf [.....\..... ....] + # 0030: 00 00 00 00 88 7f c9 bf + # 2. 20 byte records + # 0000: c1 d8 d9 0b 00 00 00 00 f5 83 14 80 df 7f fe 7f [................] + # 0010: fe 7f 01 80 + if ($id == 0x300) { + if ($len % 20 and not $len % 56) { + $dlen = 56; + } elsif ($len % 56 and not $len % 20) { + $dlen = 20; + } else { + if ($raf->Read($buff, 20) == 20) { + if (substr($buff, 16, 3) eq "\0\0\0") { + $dlen = 56; + } else { + $dlen = 20; + } + } + $raf->Seek($epos, 2) or last; + } + } + # limit the number of records we read if necessary + if ($dlen and $insvLimit{$id} and $len > $insvLimit{$id}[1] * $dlen and + $et->Warn("Insta360 $insvLimit{$id}[0] data is huge. Processing only the first $insvLimit{$id}[1] records",2)) + { + $len = $insvLimit{$id}[1] * $dlen; + } + $raf->Read($buff, $len) == $len or last; + $et->VerboseDump(\$buff) if $verbose > 2; + if ($dlen) { + if ($len % $dlen) { + $et->Warn(sprintf('Unexpected Insta360 record 0x%x length',$id)); + } elsif ($id == 0x300) { + for ($p=0; $p<$len; $p+=$dlen) { + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + my @a; + if ($dlen == 56) { + @a = map { GetDouble(\$buff, $p + 8 * $_) } 1..6; + } else { + @a = unpack("x${p}x8v6", $buff); + map { $_ = ($_ - 0x8000) / 1000 } @a; + } + $et->HandleTag($tagTbl, TimeCode => sprintf('%.3f', Get64u(\$buff, $p) / 1000)); + $et->HandleTag($tagTbl, Accelerometer => "@a[0..2]"); # (NC) + $et->HandleTag($tagTbl, AngularVelocity => "@a[3..5]"); # (NC) + } + } elsif ($id == 0x400) { + for ($p=0; $p<$len; $p+=$dlen) { + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + $et->HandleTag($tagTbl, TimeCode => sprintf('%.3f', Get64u(\$buff, $p) / 1000)); + $et->HandleTag($tagTbl, ExposureTime => GetDouble(\$buff, $p + 8)); #6 + } + } elsif ($id == 0x600) { #6 + for ($p=0; $p<$len; $p+=$dlen) { + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + $et->HandleTag($tagTbl, VideoTimeStamp => sprintf('%.3f', Get64u(\$buff, $p) / 1000)); + } + } elsif ($id == 0x700) { + for ($p=0; $p<$len; $p+=$dlen) { + my $tmp = substr($buff, $p, $dlen); + my @a = unpack('VVvaa8aa8aa8a8a8', $tmp); + next unless $a[3] eq 'A'; # (ignore void fixes) + unless (($a[5] eq 'N' or $a[5] eq 'S') and # (quick validation) + ($a[7] eq 'E' or $a[7] eq 'W' or + # (odd, but I've seen "O" instead of "W". Perhaps + # when the language is french? ie. "Ouest"?) + $a[7] eq 'O')) + { + $et->Warn('Unrecognized INSV GPS format'); + last; + } + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + $a[$_] = GetDouble(\$a[$_], 0) foreach 4,6,8,9,10; + $a[4] = -abs($a[4]) if $a[5] eq 'S'; # (abs just in case it was already signed) + $a[6] = -abs($a[6]) if $a[7] ne 'E'; + $et->HandleTag($tagTbl, GPSDateTime => Image::ExifTool::ConvertUnixTime($a[0]) . 'Z'); + $et->HandleTag($tagTbl, GPSLatitude => $a[4]); + $et->HandleTag($tagTbl, GPSLongitude => $a[6]); + $et->HandleTag($tagTbl, GPSSpeed => $a[8] * $mpsToKph); + $et->HandleTag($tagTbl, GPSTrack => $a[9]); + $et->HandleTag($tagTbl, GPSAltitude => $a[10]); + $et->HandleTag($tagTbl, Unknown02 => "@a[1,2]") if $unknown; # millisecond counter (https://exiftool.org/forum/index.php?topic=9884.msg65143#msg65143) + } + } + } elsif ($id == 0x101) { + my $tagTablePtr = GetTagTable('Image::ExifTool::QuickTime::INSV_MakerNotes'); + for ($i=0, $p=0; $i<4; ++$i) { + last if $p + 2 > $len; + my ($t, $n) = unpack("x${p}CC", $buff); + last if $p + 2 + $n > $len; + my $val = substr($buff, $p+2, $n); + $et->HandleTag($tagTablePtr, $t, $val); + $p += 2 + $n; + } + } + ($epos -= 6) + $trailerLen < 0 and last; # step back to previous record + $raf->Seek($epos, 2) or last; + $raf->Read($buff, 6) == 6 or last; + } + $$et{DOC_NUM} = 0; + SetByteOrder('MM'); + delete $$et{SET_GROUP0}; + delete $$et{SET_GROUP1}; + return 1; +} + +#------------------------------------------------------------------------------ +# Process 360Fly 'uuid' atom containing sensor data +# (ref https://github.com/JamesHeinrich/getID3/blob/master/getid3/module.audio-video.quicktime.php) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub Process360Fly($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataLen = length $$dataPt; + my $pos = 16; + my $lastTime = -1; + my $streamTbl = GetTagTable('Image::ExifTool::QuickTime::Stream'); + while ($pos + 32 <= $dataLen) { + my $type = ord substr $$dataPt, $pos, 1; + my $time = Get64u($dataPt, $pos + 2); # (only valid for some types) + if ($$tagTbl{$type}) { + if ($time != $lastTime) { + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + $lastTime = $time; + } + } + $et->HandleTag($tagTbl, $type, undef, DataPt => $dataPt, Start => $pos, Size => 32); + # synthesize GPSDateTime from the timestamp for GPS records + SetGPSDateTime($et, $streamTbl, $time / 1e6) if $type == 5; + $pos += 32; + } + delete $$et{DOC_NUM}; + return 1; +} + +#------------------------------------------------------------------------------ +# Process GPS from Vantrue N2S dashcam +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessFMAS($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + return 0 unless $$dataPt =~ /^FMAS\0\0\0\0.{72}SAMM.{36}A/s and length($$dataPt) >= 160; + $et->VerboseDir('FMAS', undef, length($$dataPt)); + # 0000: 46 4d 41 53 00 00 00 00 00 00 00 00 00 00 00 00 [FMAS............] + # 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + # 0030: 02 08 01 08 06 08 02 04 07 02 06 00 00 00 00 00 [................] + # 0040: 00 00 00 00 00 00 00 00 4f 46 4e 49 4d 4d 41 53 [........OFNIMMAS] + # 0050: 53 41 4d 4d 01 00 00 00 00 00 00 00 00 00 00 00 [SAMM............] + # 0060: e5 07 09 18 08 00 22 00 02 00 00 00 a1 82 8a bf [......".........] + # 0070: 89 23 8e bd 0b 2c 30 bc 41 57 4e 51 16 00 a1 01 [.#...,0.AWNQ....] + # 0080: 29 26 27 0c 4b 00 49 00 00 00 00 00 00 00 00 00 [)&'.K.I.........] + # 0090: 00 00 00 00 00 00 00 00 00 52 00 00 00 00 00 00 [.........R......] + my @a = unpack('x96vCCCCCCx16AAACCCvCCvvv',$$dataPt); + SetByteOrder('II'); + my $acc = ReadValue($dataPt, 0x6c, 'float', 3); # (looks like Z comes first in my sample) + my $lon = $a[10] + ($a[11] + $a[13]/6000) / 60; # (why zero byte at $a[12]?) + my $lat = $a[14] + ($a[15] + $a[16]/6000) / 60; + $et->HandleTag($tagTbl, GPSDateTime => sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @a[0..5])); + $et->HandleTag($tagTbl, GPSLatitude => $lat * ($a[9] eq 'S' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSLongitude => $lon * ($a[8] eq 'W' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSSpeed => $a[17] * $mphToKph); # convert mph -> kph + $et->HandleTag($tagTbl, GPSTrack => $a[18]); + $et->HandleTag($tagTbl, Accelerometer=> $acc); + SetByteOrder('MM'); + return 1; +} + +#------------------------------------------------------------------------------ +# Scan media data for "freeGPS" metadata if not found already (ref PH) +# Inputs: 0) ExifTool ref +sub ScanMediaData($) +{ + my $et = shift; + my $raf = $$et{RAF} or return; + my ($tagTbl, $oldByteOrder, $verbose, $buff, $dataLen); + my ($pos, $buf2) = (0, ''); + + # don't rescan for freeGPS if we already found embedded metadata + my $dataPos = $$et{VALUE}{MediaDataOffset}; + if ($dataPos and not $$et{DOC_COUNT}) { + $dataLen = $$et{VALUE}{MediaDataSize}; + if ($dataLen) { + if ($raf->Seek($dataPos, 0)) { + $$et{FreeGPS2} = { }; # initialize variable space for FreeGPS2() + } else { + undef $dataLen; + } + } + } + + # loop through 'mdat' media data looking for GPS information + while ($dataLen) { + last if $pos + $gpsBlockSize > $dataLen; + last unless $raf->Read($buff, $gpsBlockSize); + $buff = $buf2 . $buff if length $buf2; + last if length $buff < $gpsBlockSize; + # look for "freeGPS " block + # (found on an absolute 0x8000-byte boundary in all of my samples, + # but allow for any alignment when searching) + if ($buff !~ /\0..\0freeGPS /sg) { # (seen ".." = "\0\x80","\x01\0") + $buf2 = substr($buff,-12); + $pos += length($buff)-12; + # in all of my samples the first freeGPS block is within 2 MB of the start + # of the mdat, so limit the scan to the first 20 MB to be fast and safe + next if $tagTbl or $pos < 20e6; + last; + } elsif (not $tagTbl) { + # initialize variables for extracting metadata from this block + $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream'); + $verbose = $$et{OPTIONS}{Verbose}; + $oldByteOrder = GetByteOrder(); + SetByteOrder('II'); + $et->VPrint(0, "---- Extract Embedded ----\n"); + $$et{INDENT} .= '| '; + } + if (pos($buff) > 12) { + $pos += pos($buff) - 12; + $buff = substr($buff, pos($buff) - 12); + } + # make sure we have the full freeGPS record + my $len = unpack('N', $buff); + if ($len < 12) { + $len = 12; + } else { + my $more = $len - length($buff); + if ($more > 0) { + last unless $raf->Read($buf2, $more) == $more; + $buff .= $buf2; + } + if ($verbose) { + $et->VerboseDir('GPS', undef, $len); + $et->VerboseDump(\$buff, DataPos => $pos + $dataPos); + } + my $dirInfo = { DataPt => \$buff, DataPos => $pos + $dataPos, DirLen => $len }; + ProcessFreeGPS2($et, $dirInfo, $tagTbl); + } + $pos += $len; + $buf2 = substr($buff, $len); + } + if ($tagTbl) { + $$et{DOC_NUM} = 0; # reset DOC_NUM after extracting embedded metadata + $et->VPrint(0, "--------------------------\n"); + SetByteOrder($oldByteOrder); + $$et{INDENT} = substr $$et{INDENT}, 0, -2; + } + # process Insta360 trailer if it exists + ProcessInsta360($et); +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::QuickTime - Extract embedded information from media data + +=head1 SYNOPSIS + +These routines are autoloaded by Image::ExifTool::QuickTime. + +=head1 DESCRIPTION + +This file contains routines used by Image::ExifTool to extract embedded +information like GPS tracks from MOV, MP4 and INSV media data. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item Lhttps://developer.apple.com/library/content/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-SW130> + +=item L<http://sergei.nz/files/nvtk_mp42gpx.py> + +=item L<https://forum.flitsservice.nl/dashcam-info/dod-ls460w-gps-data-uit-mov-bestand-lezen-t87926.html> + +=item L<https://developers.google.com/streetview/publish/camm-spec> + +=item L<https://sergei.nz/extracting-gps-data-from-viofo-a119-and-other-novatek-powered-cameras/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::QuickTime(3pm)|Image::ExifTool::QuickTime>, +L<Image::ExifTool::TagNames/QuickTime Stream Tags>, +L<Image::ExifTool::TagNames/GoPro GPMF Tags>, +L<Image::ExifTool::TagNames/Sony rtmd Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/README b/lib/Image/ExifTool/README new file mode 100644 index 0000000..1b98905 --- /dev/null +++ b/lib/Image/ExifTool/README @@ -0,0 +1,1119 @@ +-------------------------------------------------------------------------------- +File: Image/ExifTool/README + +Description: ExifTool support modules documentation + +The ExifTool support modules are loaded by ExifTool to allow processing of +various meta information formats. + +The tables in these files are used as lookups based on the tag ID values. The +hash keys are the tag IDs (in decimal or hexadecimal if the ID is numerical as +with EXIF tables, or the tag name if the ID is ASCII as with XMP tables). In +the case of a BinaryData table, the IDs are numerical and specify offsets into +the binary data block (floating point IDs allow multiple tags for the same +offset, with the integer part being used for the offset). The corresponding +hash value provides information about the tag (explained later). + +Twenty-eight special keys (TABLE_NAME, SHORT_NAME, PROCESS_PROC, WRITE_PROC, +CHECK_PROC, INIT_TABLE, GROUPS, FORMAT, FIRST_ENTRY, TAG_PREFIX, PRINT_CONV, +WRITABLE, TABLE_DESC, NOTES, IS_OFFSET, IS_SUBDIR, EXTRACT_UNKNOWN, NAMESPACE, +PREFERRED, PERMANENT, SRC_TABLE, PRIORITY, AVOID, WRITE_GROUP, LANG_INFO, VARS, +DATAMEMBER and SET_GROUP1) are used to provide additional information about a +table. The special keys have names that are all capitalized to avoid possible +conflicts with tag keys. Below is an explanation of the meaning of each special +key: + + TABLE_NAME : Name of this table (set automatically by GetTagTable()). + + SHORT_NAME : Table name with leading "Image::ExifTool::" removed. + + PROCESS_PROC : Reference to a function used to process the directory for this + table. If PROCESS_PROC is not given, \&Image::ExifTool::Exif::ProcessExif is + assumed (except for QuickTime atoms for which + \&Image::ExifTool::QuickTime::ProcessMOV is the default). If PROCESS_PROC is + set to 0, the tags are not added to the lookup. The process proc returns 1 on + success or 0 on failure, and takes 3 arguments: 0) reference to the ExifTool + object, 1) reference to a directory information hash (with the following + entries:), 2) reference to the tag table hash. + + Name - Tag name for this SubDirectory entry (for verbose messages) + Base - Base offset for pointers from start of file + DataPt - Reference to data block containing directory (may be undef) + DataPos - Position of data block within file (relative to Base) + DataLen - Length of data block in bytes + DirStart - Offset to start of directory from start of data block + DirLen - Length of directory data within block + DirName - Name of this directory + OutFile - Output file or scalar reference + Parent - Name of parent directory + RAF - Reference to File::RandomAccess object if available + NewDataPos - File position of new data (write proc only) + Fixup - Reference to hash of offset fixups (used in EXIF writing only) + FixBase - Flag set to attempt to fix base offsets + FixOffsets - Evaluated for each value pointer to patch maker note offsets + LastIFD - Used by WriteExif() to return offset of last IFD written + ImageData - Used by WriteExif() to avoid buffering large image data blocks + NoRefTest - Flag to bypass "referenced by previous directory" test + + WRITE_PROC : Function reference or name for writing this directory. The + function returns the new directory data or undefined on error. It takes the + same arguments as the process proc above except that the second argument + (reference to directory information hash) is optional, and if specified gives + information about the source directory for tags to be copied to the output. + + CHECK_PROC : Reference to a function which validates Raw values for writing. + The function takes 3-4 arguments: 0) ExifTool object reference, 1) tagInfo + reference, 2) value reference, and 3) [optional] conversion type. It returns + undefined (and possibly modifies the input value) if successful, or an error + message if there was a format problem. May set ExifTool CHECK_WARN datamember + for success with a warning. + + INIT_TABLE : Routine called to do any necessary initialization before the + first time the table is loaded. Argument is a reference to the table. + + GROUPS : A hash lookup for the default group names for all entries in this + table. If not specified, the default Group 0 and 1 names will be set + automatically according to the name of the module, and the default Group 2 + name will be set to 'Other'. + + FORMAT : Specifies the default tag Format, and corresponding pointer increment + for entries in a BinaryData table. Defaults to 'int8u' for BinaryData tables + if not specified. The possible values of FORMAT are: + + int8s - Signed 8-bit integer (EXIF 'SBYTE') + int8u - Unsigned 8-bit integer (EXIF 'BYTE') + int16s - Signed 16-bit integer (EXIF 'SSHORT') + int16u - Unsigned 16-bit integer (EXIF 'SHORT') + int16uRev - Unsigned 16-bit integer, reversed byte order + int32s - Signed 32-bit integer (EXIF 'SLONG') + int32u - Unsigned 32-bit integer (EXIF 'LONG') + int64s - Signed 64-bit integer (BigTIFF 'SLONG8') + int64u - Unsigned 64-bit integer (BigTIFF 'LONG8') + rational32s - Rational consisting of 2 int16s values + rational32u - Rational consisting of 2 int16u values + rational64s - Rational consisting of 2 int32s values (EXIF 'SRATIONAL') + rational64u - Rational consisting of 2 int32u values (EXIF 'RATIONAL') + fixed16s - Signed 16-bit fixed point value + fixed16u - Unsigned 16-bit fixed point value + fixed32s - Signed 32-bit fixed point value + fixed32u - Unsigned 32-bit fixed point value + float - 32-bit IEEE floating point value (EXIF 'FLOAT') + double - 64-bit IEEE floating point value (EXIF 'DOUBLE') + extended - 80-bit extended floating float + ifd - Unsigned 32-bit integer sub-IFD pointer (EXIF 'IFD') + ifd64 - Unsigned 64-bit integer sub-IFD pointer (BigTIFF 'IFD8') + string - Series of 8-bit characters (EXIF 'ASCII') + undef - Undefined-format binary data (EXIF 'UNDEFINED') + binary - Binary data (same as 'undef') + + Additionally, the following variable-length Format types may be used in + individual tag information hashes of a BinaryData table. The 'var_' formats + cause subsequent tag indices to be incremented according to the size of the + data, not including the terminator. See "Format" below for more details. + + pstring - Pascal string (1-byte length followed by ASCII string) + var_string - variable-length null-terminated ASCII string + var_ustring - variable-length null-terminated UCS-2 string + var_pstring - variable-length Pascal string + var_pstr32 - variable-length Pascal string /w 32-bit len + var_ustr32 - variable-length UCS-2 string /w 32-bit len + var_int16u - variable-length undef data with int6u count + var_ue7 - variable-length 7-bit-at-a-time integer (BPG) + + And the following format codes are used for string values in XMP metadata. + (See the XMP specification for more details.) + + boolean - "True" or "False" + date - date/time string + integer - integer as a string + lang-alt - list of alternate-language strings + rational - "N/D" where N=numerator, D=Denominator + real - floating point value as a string + string - unformatted string + struct - structure + + FIRST_ENTRY : Specifies the index for the first tag entry in a binary table. + This value is only used if the Unknown option is set to 2 or higher, and + allows the binary data to be scanned for unknown tag entries. + + TAG_PREFIX : Prefix for names of unknown tags. + + PRINT_CONV : Default print conversion for tags where PrintConv isn't + specified. PrintConv may be set to undef for individual tags to disable print + conversion when PRINT_CONV is defined for a table. + + WRITABLE : Indicates that all tags in this table are writable. This is the + same as setting the Writable flag for each individual tag in the table, except + for SubDirectory tags which are not made Writable. + + TABLE_DESC : Short description for this table. Plain text only. Used only + for XML tag database output. + + NOTES : Notes to introduce the table in the TagNames documentation. Pod + formatting codes B<>, C<> and L<> may be used in this text. + + IS_OFFSET : Writable BinaryData tables only. Reference to list of sorted + TagID's representing offsets. + + IS_SUBDIR : Writable BinaryData tables only. A reference to a list of sorted + tag ID's representing subdirectories. + + EXTRACT_UNKNOWN : Used in PDF tables to specify a directory where all unknown + tags should be extracted. Set to 0 to extract only unknown numbered tags for + which the unnumbered tag is known. + + NAMESPACE : Namespace prefix for tags in the XMP table. If this isn't a + standard namespace defined in %Image::ExifTool::XMP::nsURI, then the URI must + be defined as well (however, this is not recommended for pre-defined + namespaces because then non-standard namespace prefixes won't be recognized). + To define the URI, the NAMESPACE value is a reference to a hash where the key + is the namespace prefix and and the value is the URI (alternatively, a + reference to a 2-element array containing the prefix and URI is also allowed + for backward compatibility). The NAMESPACE value may be undef for XMP tables + where tags have variable namespaces (in this case each tag must have a + Namespace entry). + + PREFERRED : Set to true if the tags in this table should always be added when + writing information. Overrides the order specified by SetNewGroups(). When + this feature is used, it may also be desirable to specify a preferred group + when calling InitWriteDirs() to write these tags; this avoids creating other + directories for tags which are already being creating in the preferred group. + + PERMANENT : Tags in this table are Permanent, and can't be deleted. Maker + notes tags are Permanent by default, without the need to set this property. + + SRC_TABLE : Used internally to store the source table name of a user-defined + tag table so the appropriate module can be loaded as required. + + PRIORITY : Default Priority for all tags in this table. + + AVOID : Flag set to Avoid writing all tags in this table. + + WRITE_GROUP : Default WriteGroup for all tags in the table. + + LANG_INFO : Code reference to a routine which returns a reference to a + language-specific tag information hash. The routine takes two arguments: a + reference to the non-specific tagInfo hash, and the language code. Used only + in tables with writable tags which support tag name language extensions (eg. + MIE and XMP). + + VARS : Hash used to store additional parameters. Individual modules may use + this to store any parameters they want. The following additional parameters + have been defined, and may be used by any module: + + ID_LABEL Label to use instead of "Tag ID" for column heading in tag + name documentation. When this is set, numerical TagID's are + not converted to hexadecimal notation. Unless otherwise set, + an ID_LABEL of "Index" is assumed for tables which use + ProcessBinaryData. + + NO_ID Avoid printing "Tag ID" column in tag name documentation. + + HEX_ID Print tag ID in hexadecimal (with 4 hex digits or more). Set + to 0 for string ID's that look like hex numbers to prevent + them from being converted when importing an XML file for + language translations in BuildLangModules(). + + NO_LOOKUP Do not add tags to TagLookup.pm lookup tables. + + CAPTURE Used by PDF module to name dictionaries to capture when + writing. + + MINOR_ERRORS [EXIF tables only] Flag to make errors in this IFD minor, or + to downgrade already minor errors to warnings while writing. + (Errors in MakerNote IFD's are already classified as minor.) + Note that for certain types errors, the response is to delete + the entire IFD from the image. + + ALPHA_FIRST Sort alphabetical tags before numerical in documentation. + + LONG_TAGS Suppress "Long tags" warning when generating documentation. + Value is the number of long tag names to expect. + + SORT_PROC Reference to sort procedure for sorting tag ID's in the + documentation. Takes two arguments and returns -1, 0 or 1 + if the first argument is less than, equal to, or greater than + the second argument. + + ENTRY_SIZE Used by ProcessPhaseOne to specify size of IFD entry + + MAP_FORMAT Lookup to map unknown format numbers (eg. Panasonic CameraIFD) + + START_INDEX [QuickTime tables only] Initial index for indices shown in + Verbose output. Indices are not show otherwise. + + ATOM_COUNT [QuickTime tables only] Maximum number of atoms contained in + within this atom. Currently used only for Canon CNTH atom, + which contains garbage after the first contained atom. + + DATAMEMBER : BinaryData tables only. A reference to a list of sorted tag ID's + which must be extracted as data members when writing. Must also list "var_" + format tags and tags with Hook so offsets are properly calculated if the table + is writable. + + SET_GROUP1 : [EXIF tables only] Flag to set group1 name to the directory name + for all tags in the table. + +The remaining entries in a tag table are the tag IDs with their associated +information. The information may exist in one of three forms: 1) A simple +scalar which is the name of the tag, 2) A reference to a hash of information +describing this tag, or 3) a reference to a list of hashes which contain +Condition expressions allowing the appropriate hash to be selected to suit the +conditions. The following is a description of possible hash entries. All +entries are optional, except for the tag Name which is required if the tag ID is +numerical, and generated automatically otherwise. + + Name : The tag name. Tag names need not be unique. If they aren't + unique, then duplicate tags will hide the values of previous + tags when extracting information unless the Duplicates option + is set or the new tag has lower Priority. With Duplicates + set, to allow multiple tags with the same name to exist in the + tag information hash, the key of the previous tag is changed + to the form "TagName (N)", where N starts at 1 and increments + for subsequent duplicate tags. A tag name should start with + an uppercase letter, and contain only the characters in the + set [A-Za-z0-9_-]. If not given, the Name is taken from the + tag ID with the first character changed to upper case. + + Description : A more readable description of tag name. If a tag doesn't + specify a Description, then the tag Name is used instead, with + spaces inserted between the words. + + Notes : Notes for this tag in the HTML TagNames documentation. + + Groups : Hash lookup for group names for this tag. If not specified, + defaults to the GROUPS specified in the table definition. + + Format : Only valid for BinaryData, EXIF and IPTC tables. For a Binary + or EXIF table, this gives the format that is used to convert + the binary data, and is one of the FORMAT types specified + above. If not specified, the Format of an EXIF entry is taken + from the EXIF information, and the Format of a BinaryData + entry is taken from the FORMAT specified for the table (or + int8u if FORMAT is not specified). Must be specified for + Writable tags where the value must be converted for a + Condition. For BinaryData tables, the format may have a size + in trailing brackets which is a Perl expression to be + evaluated. The expression may access any of the previous + table entries through a %val hash (read-only tags), the data + size via $size, or the ExifTool object via $self. For + example, 'string[$val{3}]' defines a string with length given + by the table entry with tag index '3'. An initial "var_" may + be added to the Format name of any BinaryData tag with a size + in brackets. In this case, subsequent offsets are adjusted by + the value length minus the size of the default table FORMAT + (eg. "var_int16u[10]" causes subsequent offsets to be + incremented by sizeof(int16u) * 10 - sizeof(int8u) if the + default table FORMAT is "int8u"). Note that all "var_" Format + tags (as well as tags with values used within "var_" Format + expressions) must have corresponding DATAMEMBER entries. + + Count : Used when writing EXIF information to specify the number + values to write, or the number of characters in a fixed-length + string. A value of -1 indicates that the count is variable + and should be determined by the number of values provided. + Defaults to 1 if not specified for non-string formats. Note + that this count corresponds to the specified Format, so if a + different-sized Writable format is defined, the actual count + written to the file will be different. + + FixCount : Flag set to determine correct count from offsets in IFD. This + is necessary for some Kodak tags which write an incorrect + Count value. + + Flags : Flags to specify characteristics for this tag. May be a + simple scalar flag name, a reference to a list of flag names, + or a reference to a hash of flag/value pairs. If not a hash + reference, the flag value is set to 1. Flags are expanded for + faster access at run time into members of the tagInfo hash, + and may be written directly as members if desired. The + available flag names are: + + 'AutoSplit' - [List tags only] Similar to ListSplit option, + but applied automatically to individual tags. Value specifies + pattern for split, or 1 for default pattern ',?\\s+'. + + 'Avoid' - avoid creating this tag if possible. This is only + effective if another tag exists with the same name. Setting + this flag also sets the default Priority to 0 for this tag. + + 'Binary' - set to 1 for binary data. This has the same effect + as setting ValueConv to '\$val', but it it a bit cleaner and + avoids dummy ValueConvInv entries for writable tags. Has no + effect if ValueConv is defined for the tag. Some values may + be treated as binary data even if this flag is not set. + + 'BlockExtract' - set for writable directories in EXIF + information which are extracted by default. Otherwise + writable directories are only extracted as a block if + specified explicitly. Also used for Jpeg2000 and QuickTime + XMP-like tags to extract as a block with a name other than + 'XMP'. + + 'ConvertBinary' - true to apply ValueConv and/or PrintConv to + Binary values (ie. SCALAR references). (By default, these + conversions are not done for Binary values.) + + 'DataMember' - name of exiftool data member associated with + this tag if it should be stored as a special data member when + writing information. Necessary only if the value of the tag + affects other written information. Currently only used for + tags in EXIF tables where it triggers the execution of the + RawConv to convert and store the value as an ExifTool data + member when writing. + + 'DataTag' - associated tag name containing data for offset or + byte count tags. + + 'DelGroup' - set if deleting this tag is the same as deleting + the group of the same name. + + 'Drop' - [IFD-format and PhaseOne makernote tags only] set to + 1 for tags that should be excluded when rebuilding maker notes + when copying all tags. Set to a number larger than 1 to drop + only if data is larger than this size. Works for SubDirectory + tags too. + + 'EntryBased' - set to 1 if the offset for this value is based + on the IFD entry position. This allows individual values to + be entry-based even though some others aren't (as with the + Casio PrintIM information). + + 'Flat' - [flattened XMP structure tags only] must be set for + all pre-defined flattened tags (including user-defined + flattened tags). This flag is reset to 0 internally after all + associated flattened tags in the structure have been + generated. + + 'Flattened' - [reserved] used internally to mark Struct tags + which have been processed to generate flattened equivalents. + + 'NotFlat' - [XMP tags only] Flag indicates that this tag ID + does not represent a flattened tag. Used to avoid a conflict + if the tag ID would be the same as a generated ID for a + flattened tag. The result is that the flattened tag will not + be accessible. + + 'Hidden' - set to hide tag from the TagName documentation. + Also suppresses verbose output of a BinaryData tag. The + RawConv of a Hidden tag should return undef so the tag value + is not seen by the user. + + 'IsComposite' - flag set for Composite tags + + 'IsOffset' - flag set if the tag represents an offset to some + data, and causes value will be adjusted to an absolute file + offset. If set to 2, the offset base of the parent directory + is used even if the base changes for the current directory + (only some maker notes are this messed up). Set to 3 if + absolute file offsets are used. May be set to an expression + to be evaluated. Expression may access $val and $et, + and is evaluated only when reading. + + 'iTXt' - [PNG TextualData tags only] flag to write tag as PNG + iTXt chunk even if it contains no special characters. + + 'List' - flag indicating that duplicate entries of this tag + are allowed, and will be accumulated in a list. Note that for + XMP information, 3 different types of lists are supported and + the List value specifies the type: 'Bag', 'Seq' or 'Alt'. As + well, a value of '1' is used internally in XMP to allow list + behaviour for a flattened tag which is itself not a list + element (eg. a member of list of structures). Note that in + ExifTool an XMP lang-alt tag (Writable="lang-alt") is NOT a + list-type tag (unless it is a list of lang-alt lists, which is + uncommon). + + 'MakerNotes' - set if this tag is maker note data. + + 'MakerPreview' - set in the PreviewImageStart tag information + if the preview must be stored inside the maker notes. + + 'Mandatory' - set for mandatory tags. Used only by TagInfoXML + and for documentation purposes. Mandatory tags may be added + automatically by ExifTool. + + 'NestedHtmlDump' - flag set if value for this tag is also + dumped when processing the SubDirectory. This flag is implied + if the MakerNotes flag is set. Set to 2 if the dump should + only be underlined if nested inside other maker notes. + + 'NotIFD' - set for 'MakerNotes' SubDirectory tags only if the + SubDirectory is not EXIF IFD format. (Note: All SubDirectory + tags in the MakerNotes table are 'MakerNotes' type by + default.) + + 'OffsetPair' - set if the tag represents half of an offset/ + byte count pair. Data for these tags must be handled + separately. Value is the tagID for the paired tag. + + 'Permanent' - flag indicates that a tag is permanent, and + can't be added or deleted from the file, although a new value + may be written if the tag already exists. By default, all + MakerNotes tags are permanent unless otherwise specified. + + 'PreservePadding' - [QuickTime only] flag to preserve the + original size of the QuickTime atom by padding with nulls when + writing with the QuickTimePad option. + + 'PrintHex' - specifies that unknown PrintConv values should + be printed in hex (eg. 'Unknown (0x1)'). Also causes + numerical tag values to be printed in hex in the HTML tag name + documentation, padded to the number of digits given by the + PrintHex value. + + 'PrintSort' - causes PrintConv values to be sorted by value + rather than key in the HTML tag name documentation. + + 'PrintString' - flag set to force PrintConv values to be + printed as strings in the documentation. + + 'Priority' - gives the priority of this tag while reading. If + set to zero, this tag will not override the value of previous + tags with the same name. If the priority is greater than + zero, this tag won't be overridden by subsequent tags unless + their priority is equal to or greater than this priority. A + special feature is that Priority 0 tags are automatically + incremented to Priority 1 if they exist in the IFD of the full + resolution image (as determined by SubfileType). If not + defined, the priority defaults to 1 for all tags except except + tags in IFD1 of JPEG images which default to priority 0. + + 'Protected' - bit mask to protect tags from writing: + Bit 0x01 indicates an 'Unsafe' tag, which is not set via + SetNewValuesFromFile() unless specified explicitly. + Bit 0x02 indicates a 'Protected' tag, which should not be set + directly by the user. + + 'PutFirst' - [EXIF only] flag to place this value before IFD0 + when writing (ie. immediately after TIFF header). Only used + for values in main IFD's (IFD0, IFD1, etc) and IFD's where + SubIFD flag is set to 2 (currently only ExifIFD). + + 'RawJoin' - [List tags only] Joins raw List-type tag values + into a single string with a space separator, allowing + ValueConv and PrintConv to act on the concatenated string so + the tag does not exhibit list-type behaviour. When writing, + the inverse is performed and the value is split at whitespace. + + 'Resource' - [XMP only] flag to write value as an rdf:resource + in an empty element instead of as a normal string. + + 'SeparateTable' - set to list PrintConv values in a separate + table in the HTML documentation. Value is 1 for a table name + of 'Module TagName', or 'TAG' for 'Module TAG', or 'MODULE + TAG' to fully specify the table name. The table may have a + 'Notes' entry for a description of the table. + + 'SetResourceName' - [Photoshop tags only] set to 1 to append + resource name to the extracted value (eg. 'VALUE/#NAME#/'). + Also allows resource name to be appended when writing new + values. May be set to any value other than 1 for a default + resource name to use when writing if an appended name is not + provided. + + 'StructType' - [reserved] used internally by XMP writer for + flattened structure tags as a flag to indicate that one or + more enclosing structures has a TYPE field. + + 'SubDoc' - [Composite tags only] set to cause this Composite + tag to also be generated for each sub-document. To achieve + this, 'Main:' and 'Doc#:' prefixes are added to all Require'd + and Desire'd tag names which don't already start with 'Main:' + or 'Doc#:', and the Composite tag is built once for each of + the main document and all sub-documents. May be a reference + to a list of indices for Desire'd tags, one of which must + exist to generate this tag for sub-documents. + + 'SubIFD' - used in writing to determine that the tag specifies + an offset to a sub-IFD. When this flag is set, the Group1 + name gives the name of the IFD. Must be set if and only if + the tag has a SubDirectory Start that references '$val' (this + is validated by BuildTagLookup). Set to 2 for standard EXIF + SubIFD's where the PutFirst flag is valid. + + 'Unknown' - this is an unknown tag (only extracted when the + Unknown option is set). This is set to 2 for Unknown tags in + binary tables (extracted when Unknown is 2). + + 'WriteNothing' - flag indicating that nothing is actually + written when this tag is set. It is a fake writable tag that + isn't actually written (eg. Geotag). Used to avoid processing + a file unnecessarily if nothing will actually be written. + + 'WritePseudo' - flag indicating that this is a writable pseudo + tag. If set, this tag may be written without actually writing + to the file (eg. FileName, FileModifyDate). + + 'WrongBase' - ['IsOffset' tags only] An expression using $self + that is evaluated to generate a base shift for 'IsOffset' tags + which use a different base than the rest of the tags. + + RawConv : Used to convert the Raw value at extraction time (while the + image file is still open, unlike ValueConv and PrintConv below + which are done later only if the value is requested). May be + a scalar expression using $val (the Raw tag value), $self (the + current ExifTool object), $tag (the tag key), $tagInfo + (reference to the tag information hash), $priority (to + dynamically set the priority of a tag), and @grps (to + dynamically set the family and/or groups), or a code reference + with $val and $self as arguments (in which case $$self{grps} + may be used to set the groups). For Composite tags, $val is a + reference to a hash of source ("derived from") tag names, and + @val may be used to access the Raw values of these tags. The + returned value may be a scalar which is used as the new Raw + value, a scalar reference to a binary data value, a hash + reference for Composite tags, an ARRAY reference for a list of + values, or undefined to indicate that the tag should be + ignored. If RawConv is specified for a Composite tag, then + ValueConv and PrintConv evals will no longer have access to + the source @val and @prt values unless the input $val is + returned. RawConv may generate Warning or Error tags, while + ValueConv and PrintConv should not (see ValueConv note below). + Note: RawConv should only be used if necessary (in general, + only if the conversion may return undef to ignore the tag, or + if a Warning may be issued) because ValueConv is more + efficient since it is only executed if the tag value is + requested, while RawConv is executed for all extracted tags. + Note that a tag is still writable if it has a RawConv without + a RawConvInv (with the exception of QuickTime ItemList and + UserData tags, which specifically require this), but this is + not true for ValueConv/PrintConv. + + ValueConv : Used to convert the Raw value to a useable form. May be a hash + reference to act as a lookup table, a scalar which is + evaluated as a Perl expression, a code reference to a + subroutine, or an ARRAY reference (in which case the value is + split at whitespace into a list of items and each item is + converted by the associated entry in the ValueConv list. A + special value of 'REPEAT' may be used to repeat the previous + conversion for all remaining elements). If a hash reference + is used and the Raw value doesn't appear as one of the keys, + then the converted value is set to "Unknown (X)", where X is + the Raw value (unless either of the special keys exist: + 'BITMASK', a reference to a hash used to decode individual + value bits; or 'OTHER', a reference to a subroutine used to + convert unknown values. The OTHER subroutine takes 3 + arguments: the value, a flag which is set for the inverse + conversion, and a reference to the PrintConv hash, and returns + the converted value or undef on error -- it may call warn() to + return an error message. The lookup hash may also contain a + 'Notes' entry which is used for documentation if the + SeparateTable flag is set). In an expression, $self is a + reference to the current ExifTool object, $val is the Raw + value, and $tag is the tag key. The subroutine takes 2 + arguments: the Raw value and a reference to the current + ExifTool object. The advanced formatting expression (if any) + may be accessed via the ExifTool "FMT_EXPR" member variable. + The expression or subroutine is evaluated if and when the tag + value is requested (ie. only after all extraction is + complete), so if necessary at this time the values of all + other tags are available via calls to + $self->GetValue("Tag","Raw"). (Note: In theory, types other + than "Raw" may be accessed, but they are slower and may lead + to cyclical dependencies so they should be avoided). When + evaluated, the expression or subroutine returns a scalar for + the converted value, a SCALAR reference to a binary data value + (see the 'Binary' flag), or an ARRAY reference for a list of + values. The return value should always be defined -- use + RawConv instead to return undef if it is necessary to test the + value for validity, otherwise an undef tag may hide a + previously defined value when the Duplicates option is not + enabled. If this isn't possible (as with Composite tags where + the converted values of the source tags are needed), set the + Priority to 0 to avoid taking priority over a valid tag. If + ValueConv is not specified, the Raw value is not converted. + Composite tags which Require or Desire other tags may access + the ValueConv, PrintConv and Raw values of these tags through + the elements of the @val, @prt and @raw lists respectively + (only if there was no RawConv or it returned a hash + reference). For these tags, $val may be used in an expression + to represent $val[0], and the first argument passed for a code + reference is a reference to @val. Note: Warnings issued by + these conversions are intercepted by ExifTool and saved as + Warning tags, but since ValueConv and PrintConv conversions + are done on demand, the warnings may be generated after the + list of extracted tags is returned, so may easily be missed. + + PrintConv : This entry is similar to ValueConv above, except that it is + used to further convert the tag value to a human readable + form. It can be either a hash lookup, a scalar Perl + expression, a code reference or a list reference. In this + expression, $self, $val and $tag may be used as with + ValueConv, but if ValueConv was defined then $val is the + ValueConv value instead of the Raw value. The returned value + should always be defined. Note that the print conversion is + only done if the PrintConv option is enabled (which it is by + default), and if the result of the ValueConv is not a scalar + reference. If it is a list reference, then the converted + values are joined by '; ' in the output string. + + RawConvInv : The inverse of RawConv. This should only be used in very rare + situations when the raw value can not be predetermined. + Unlike the other inverse conversions which are applied in + SetNewValue(), this conversion is applied in WriteInfo() as + the file is being written. This is important because it means + that FILE_TYPE and any DataMember tags ocurring before this + tag in the file are available. Beware that if the return + value is not defined, the tag will be deleted unless there is + specific logic to avoid this (currently, only EXIF and Binary + data directories handle this case). + + ValueConvInv : The inverse of ValueConv. Only necessary for Writable tags + when ValueConv is specified (except WriteAlso tags). Note + that DataMember tags may NOT be used in the inverse + conversions because these conversions are done before the + input file is parsed. Instead, a Condition or RawConvInv must + be used. May return undef on conversion error and call warn() + to issue a warning. If warn() is not called, a generic + warning is generated when undef is returned. An empty warning + ("\n") may be issued to suppress warning messages when undef + is returned. If a scalar, the expression may use the + variables $val, $self and $wantGroup. If a code ref, the + routine is passed 2 arguments: $val and $self. Note that this + conversion is not applied for deleted tags (ie. $val is + undef). + + PrintConvInv : The inverse of PrintConv. Necessary for Writable tags + when PrintConv is specified (unless WriteAlso is used), but + may be used without PrintConv. See ValueConvInv above for + more details. + + PrintConvColumns : Number of columns for PrintConv lookup in HTML docs. If not + set, the number of columns is determined automatically + according to the maximum width of the entries. + + DelValue : Raw value to be used when deleting a permanent tag. (Note all + MakerNotes tags are permanent.) If not specified, an attempt + is made to convert an empty string for the raw value. + + Validate : Scalar expression used to validate the raw value of a tag when + the Validate option is set. The expression may access $val + (the Raw tag value), $tag (the tag key) and $self (the current + ExifTool object), and should return a warning if any problem + is found, or false if OK. The evaluation is performed in the + Image::ExifTool::Validate package namespace, so functions of + this package need not be prefixed by the package name. + + Relist : [Only if ValueConv or PrintConv is a list ref] Reference to a + list of original value indices used to reorganize values. Each + entry in the list may be a scalar index, or a reference to a + list of indices to join values. (Currently values may be + joined, but the order of writable values must not be changed + until this ability is added to the writer.) + + Mask : [BinaryData tags only] Bitmask for this value. (Multiple tags + may have the same index by using floating point indices. An + unknown tag will only be generated for a certain TagID if + there is no integral TagID for that tag.) The Mask and + BitShift are applied before evaluating RawConv. + + BitShift : [Mask tags only] Bit shift for Mask-ed values. If not + specified, set to the number of trailing bits in the Mask. + When reading, the value is shifted right by this number of + bits after the Mask is applied. + + Condition : If given, specifies scalar which is evaluated as a Perl + expression at extraction time to decide whether the tag is + valid. If used in a list of alternate tag definitions, the + first list entry with a true condition is taken. If no + condition exists, then a 'true' condition is assumed. The + expression may use $self to access the ExifTool object. The + first 128 bytes of the raw data value are accessible through + the reference $valPt for EXIF, Jpeg2000, QuickTime and + BinaryData tags only (note that for BinaryData tags, the raw + data of $$valPt is always 'undef' type, and may not be used + when writing except for SubDirectory tags). EXIF tags (and + maybe some other types) may also reference the format string + and value count through $format and $count. Note that if the + value is writable and $valPt is used, the tag must have a + Format (unless 'undef' or 'string'), and a Count (unless 1 or + length of the 'undef' or 'string'), so the raw data may be + generated for evaluating the Condition. When writing, $valPt, + $format and $count refer to the new value, except for + MakerNotes tags where $format and $count refer to the old tag + if it existed. + + Require : [Composite tags only] A hash reference specifying the tags + required to calculate the Composite tag value. The hash + values are the names of the required tags, and the keys + specify the indices where the tag values are stored in the + @val list used in the ValueConv and/or PrintConv expression. + The Composite value is only calculated if the values for all + Require'd tags are defined. Require, Desire and Inhibit tag + names may be prefixed by an optional group family 0 or 1 name + followed by a colon. Case IS significant. The keys used by + the Require, Desire and Inhibit hashes must not overlap (since + they are used as indices into the common @val, @prt and @raw + lists), and together the keys must be sequential starting from + 0. A special feature allows a scalar tag name to be used + instead of the hash reference, in which case the next + available index will be used (avoiding collisions with Desire + and Inhibit hash entries). For example, the following two + definitions are equivalent: + + Require => { 0 => 'XMP:Title' }, + Require => 'XMP:Title', + + Desire : [Composite tags only] This is the same as Require except that + the Composite value is calculated even if the specified tags + don't exist. Beware that the elements of @val, @prt and @raw + may be undefined for Desire'd tags. If no tags are Require'd, + at least one of the Desire'd tags must exist for the Composite + tag to be generated. If there are no Require'd or Desire'd + tags, then the Composite tag is always generated. A scalar + Desire tag name is given the next available index (after + scalar Require tags are allocated). + + Inhibit : [Composite tags only] Similar to the Require and Desire + hashes, except that the Composite tag is NOT built if any of + the Inhibit tags exist. A scalar tag name is given the next + available index (after scalar Require and Desire tags are + allocated). + + Shift : [Writable tags only] Specifies type of shift to apply if this + value may be shifted. Set to 'Time' for shifting date/time + tags, or '0' to prevent tag from being shifted or + conditionally deleted. + + Writable : Indicates this tag can be written (or not written if Writable + is set to zero), and for EXIF and QuickTime tables gives + format for writing. Writable may be set to 1 for MakerNotes + information because the existing format is always used, + however providing a format is desirable because it is used in + validating the value. Set to 2 for tag to show "yes" in the + Writable column of the tag name documentation even when there + is no WRITE_PROC defined (eg. if it is written via an Extra + tag). For EXIF and QuickTime tables, the Writable flag may be + different than the Format flag, in which case Format is used + for converting the binary value and Writable specifies the + format code written to the EXIF IFD. For SubDirectories in + EXIF information, this flag is only defined if the + SubDirectory is writable as a block, or if the SubDirectory + can not be edited (in which case Writable is set to 0). If + non-zero, the SubDirectory is also extracted as a block, so + the Binary and Protected flags should usually set as well. + There is currently no way to specify a write format for a + SubDirectory that is not writable as a block (the default is + 'int32u' for IFD-type SubDirectories, and 'undef' for all + others). + + WriteAlso : Used for writable tag to specify other tags to write when this + tag is written. The value is a hash reference. The hash keys + are the names of the tags to write, and the values are + evaluated to obtain the ValueConv values of each tag (or undef + to delete the tag). In the eval, $val is the new Raw value of + the parent tag (which may be undef if the tag is being + deleted, and should not be modified because it will affect + subsequent WriteAlso tags), and the %opts hash may be accessed + to modify SetNewValue options for each tag. By default, Type + is set to "ValueConv" and the Protected option has bit 0x02 + set to allow writing of Protected tags that aren't directly + writable. The AddValue, DelValue, Shift and Replace options + from the parent tag are also defined, but no other options are + set by default. Previous new values of WriteAlso tags have + already been removed prior to the eval if the Replace option + was used for the parent tag. If an empty warning is issued + ("\n"), the target tag is not written and no error is + reported. + + WriteCheck : If given, specifies a scalar which is evaluated as a Perl + expression for a one-time validatation the Raw value being + written. The expression has access to 3 variables: $val is + the value to be written, $self is the ExifTool object, and + $tagInfo is the tag information hash reference. It returns an + error string, or undef if the value is good. If the error + string is empty, the tag is not written and no warnings are + issued, but WriteAlso is still evaluated if it exists. + + WriteHook : [QuickTime only] Routine to call with these arguments when tag + is encountered during writing: 0) tag value, 1) ExifTool ref. + + WriteOnly : Flag set if tag is write-only. Used for documentation only. + + DelCheck : Similar to WriteCheck, but called when the tag is deleted. The + expression may access $self, $tagInfo and $wantGroup. Returns + error string, or undef on success, and may set $val to + something other than undef. May return empty string ('') to + suppress warning messages but not delete tag (eg. when + deleting only associated tags). + + WriteCondition: [Writable EXIF tags only] Specifies a condition to be + evaluated before the tag can be written to a specific file. + The condition may use $self to reference the ExifTool object, + and returns true if it is OK for writing. Unlike WriteCheck + which is done only once when the new value is set, this + condition is evaluated just before the tag is written to the + file. + + WriteGroup : [Writable EXIF and Composite tags only] Specifies the IFD + where the information gets written by default. Must be + defined for writable EXIF tags if WRITE_GROUP is not specified + in table. A WriteGroup of 'All' is special: For writable + Composite tags this causes any group specified for the + Composite tag to be propagated to the WriteAlso tags when + writing. For other tags this allows writing to all EXIF IFD's + simultaneously (in which case the tag should have a Condition + or WriteCondition to restrict the IFD's to which the tag is + actually written). + + IsOverwriting : [Writable EXIF tags only] Specifies reference to subroutine + which determines if tag should be overwritten. Arguments are: + 0) ExifTool object ref, 1) new value hash ref, 2) old value, + 3) new value reference. + + Preferred : This tag is always preferred when writing. + + Override : [User-defined Composite tags only] Flag to specify that the + new tag definition should override the definition of existing + Composite tags with the same name. Default is 1 unless + otherwise specified. + + AllowGroup : [Writable tags only] Regular expression string (case + insensitive) to match group names which are allowed when + writing this tag. Only needed if tag can be written to + groups other than the normal groups for this tag (very rare). + + OffsetPair : Used in EXIF table to specify the tagID for the corresponding + offset or length tag. + + DataTag : Used in EXIF table to specify the tag name of the data + associated with offset/length tags. + + FixFormat : [Writable EXIF SubIFD SubDirectory's only] Used to specify a + format for writing an IFD pointer other than 'int32u'. + + ChangeBase : [EXIF tags in JPEG images only] Eval used to return new base + for the offset for this tag only. Eval may use $dirStart and + $dataPos. Note this is geared to the quirky Leica preview + image offset, and is only used if the preview is outside the + APP1 EXIF segment. + + BitsPerWord : [BITMASK tags only] Number of bits per decoded word. Defaults + to 32 if not specified. + + BitsTotal : [Writable BITMASK tags only] Total number of bits in bit mask. + Defaults to BitsPerWord if not specified. + + FixedSize : [EXIF only] Hack to ignore value size and use this instead. + Only valid if Format is also defined. + + Struct : [XMP tags only] Reference to structure hash for structured XMP + tags. See "STRUCTURES" section below for more details. (For + backward compatibility, this may be a name to an entry in + %Image::ExifTool::UserDefined::xmpStruct, but this use is + deprecated.) Flattened tags are automatically generated for + each field in the structure. Note that Struct tags can NOT + have ValueConv/PrintConv entries, because values that are HASH + references are are also used by Composite tags, which use the + the Conv entries to generate the Composite value. + + NoSubStruct : [XMP tags only] Flag set in flattened tag to break cyclical + recursion in nested structures. + + Namespace : [XMP tags only] Gives standard XMP namespace prefix to use for + this tag. If not defined, the tag table NAMESPACE is used. + + FlatName : [Struct tags and structure fields only] Name used for + automatically-generated flattened tag names, defaults to Name + if not specified. In general, this is used to remove the + redundant names found in some specifications. May be empty + ('') for a Struct tag but not for a structure field. + + Units : [MIE tags only] Reference to a list of valid units strings. + The default units are the first item in the list. + + Hook : [BinaryData tags only] Expression to be evaluated when + extracting tag to allow dynamic Format, etc for BinaryData + tags. May access $self, $size (the full size of the binary + data record), $dataPt (reference to the data block), and $pos + (position of this tag in the data block), and assign a new + value to $format to dynamically set the tag format, and/or + increment $varSize to add a byte offset to subsequent tags. + $varSize may be set to a large number to effectively abort + processing of the directory after this tag. Must have + corresponding DATAMEMBER entry in writable tables. Must not + have Unknown set. + + LargeTag : [BinaryData tags only] Flag to indicate that the data for this + tag is large, and that it shouldn't be stored in the %val + hash, even if the tag exists as a DATAMEMBER. + + SetBase : [QuickTime and BinaryData tags only] Sets ExifTool BASE offset + for use when ExtractInfo is called with the ReEntry flag from + inside the RawConv of a tag. + + TagID : [reserved] Used internally to save the table key for this tag. + Note: For XMP tables this corresponds to the XMP property + name, but the table key may have a full XMP namespace prefix + added. + + NewTagID : [reserved] Used internally to save new ID of tag in Composite + table if it is different that the original TagID (happens if + there was a conflict with an existing entry in the table) + + Index : [reserved] Used internally to save the index of tagInfo items + which are in a conditional list. + + Table : [reserved] Reference to parent tag table. + + PropertyPath : [reserved] Used internally by XMP writer to save property path + name. Also used in structure field information hashes, but + for these the full property path is not stored. + + SrcTagInfo : [reserved] Used internally to store reference to default + language tagInfo hash for alternate-language tags. + + OtherLang : [reserved] Used internally by QuickTime module to store a list + of tag ID's for alternate-language tags based on this one. + + RootTagInfo : [reserved] Used internally to store a reference to the tag + information hash of the top-level structure for flattened + structure tags. + + Module : [reserved] Used internally to store module name for writable + Composite tags. + + LangCode : [reserved] Used internally to indicate language code for + alternate language tags (eg. 'fr'). Only used with formats + which support alternate languages (eg. XMP, MIE, etc). + + AddedUnknown : [reserved] Used internally to mark Unknown tags that were + added to the table at run time. + + SubDirectory { If it exists, this specifies the start of a new subdirectory. + It contains a collection of variables which specify the type + and location of the subdirectory. Note that ValueConv and + PrintConv do not apply to SubDirectory tags, but RawConv is + evaluated before the SubDirectory is processed. The following + is a list of SubDirectory variables: + + TagTable : Specifies the name of the tag table lookup for the new + subdirectory. If not specified, the parent tag table is used. + + Start : The offset to the start of the subdirectory relative to the + current Base. This is a Perl expression which may use + $valuePtr to represent the location of the tag value in the + file, or $val for the value itself. If not specified, a Start + of '$valuePtr' is assumed. + + OffsetPt : [EXIF directories only] If specified, this is a Perl + expression that gives the position of a 32-bit word in the + current directory that is added to the Start position to get + the position of the new subdirectory. The expression + should use the position of the current tag ($valuePtr). + + Base : This expression specifies the base offset for all pointers in + the subdirectory. This need not be specified if the offset is + the same as the current directory, which is normally the case. + May use $start to represent the subdirectory start location + relative to the current base, and $base for the value of the + current base. If this is defined, the automatic validation of + base offsets is disabled for maker notes directories. The IFD + is flagged as using relative offsets when writing if '$start' + is used in this expression. + + EntryBased : [EXIF directories only] Flag indicating that the offsets are + based on the individual directory entry position, so offsets + are incremented by 12 times the corresponding entry index. + + MaxSubdirs : Maximum number of subdirectories specified by the current tag + (if the tag specifies multiple values). If not specified, the + tag value ($val) is used as-is. If MaxSubdirs is specified, + then one subdirectory is parsed for each value found up to the + maximum number specified. Ignored when writing. + + ByteOrder : Specifies byte ordering if different than than the rest of the + file. Must be either BigEndian, LittleEndian or Unknown. If + Unknown is specified, the byte order will be determined from + the directory count (however, this can not be done if OffsetPt + is specified). + + Validate : If given, specifies Perl expression which is used to validate + the subdirectory data (regardless of Validate option setting). + The following variables may be used in the expression: $val + (value of the tag), $dirData (reference to directory data), + $subdirStart (offset to subdirectory start) and $size (size of + subdirectory). Returns true if subdirectory is valid. + + ProcessProc: If given, specifies processing procedure used to decode this + subdirectory data. This overrides the default procedure + specified by PROCESS_PROC in the tag table. + + WriteProc : If given, specifies processing procedure used to write this + subdirectory data. This overrides the default procedure + specified by WRITE_PROC in the tag table. + + DirName : Name of this subdirectory. If not specified, the name is + taken from the tag name. DirName is important because it is + used when writing to compare against names in the directory + map to determine which directories need to be edited. + + FixBase : Flag set if base offsets should be fixed. Used to add a + constant to maker notes offsets to fix damage done by some + image editing utilities. (maker notes only) Set to 2 for + unknown maker notes to be a bit more flexible in adjusting + the base offset. + + AutoFix : Flag set to patch GE makernote offset quirks and apply FixBase + without warnings when writing. + + FixOffsets : Expression to evaluate for each value pointer to patch + problems with some EXIF maker note offsets. May access the + following variables: $valuePtr, $valEnd, $size, $tagID and + $wFlag. May return undef when writing to ignore the entry. + + RelativeBase:[EXIF directories only] Flag to adjust all offsets relative + to the start of the IFD when writing. + + Multi : [EXIF directories only] Flag to allow multiple linked IFD's. + 1 is assumed if DirName is IFD0 or SubIFD unless otherwise + defined. + + Magic : [TiffIFD directories only] Magic number used in TIFF-like + header. + } + +STRUCTURES + +Structure hashes are very similar to tag tables in that their keys are structure +field ID's and their values are structure field information hashes. The special +keys in structure hashes are: + + NAMESPACE : Same as in tag tables, but may be set to undef for a + variable-namespace structure which holds any top-level tag. This + is mandatory for built-in tags, but optional for user-defined + tags (where it defaults to the NAMESPACE of the tag table). + + STRUCT_NAME : Name of structure (used in warning messages and documentation). + May contain leading module name separated by a space to avoid + name conflicts with same-named structures in other modules. + Default module is "XMP" unless otherwise specified. + + TYPE : rdf:type resource for structure. + + NOTES : Notes for documentation. + + GROUPS : Same as in tag table, but only the family 2 group name is used, + as the default for the flattened tags. + +The contained structure field information hashes are similar to tag information +hashes, except that only the following elements are used: + + Raw/Value/PrintConv (and their inverses), TagID (optional), Groups, List, + Writable, Struct, Namespace, FlatName, LangCode, PropertyPath, Notes. + +But note that for PropertyPath, only the element of the path corresponding to +the specific field is stored (including any necessary list properties). The +full property path is obtained by walking the structure tree. + +Flattened tags corresponding to each field in a structure are automatically +generated (using an on-demand approach to reduce startup overhead). Pre-defined +flattened tags are allowed, and are used when it is necessary to change the Name +or Description of a flattened tag. The flattened tag information hash entries +are copied from the corresponding structure field definitions, even for +pre-defined flattened tags. The exception is that the List property is +generated automatically unless explicitly set to 0 in a pre-defined flattened +tag. + +-------------------------------------------------------------------------------- diff --git a/lib/Image/ExifTool/RIFF.pm b/lib/Image/ExifTool/RIFF.pm new file mode 100644 index 0000000..f561cfb --- /dev/null +++ b/lib/Image/ExifTool/RIFF.pm @@ -0,0 +1,2065 @@ +#------------------------------------------------------------------------------ +# File: RIFF.pm +# +# Description: Read RIFF/AVI/WAV meta information +# +# Revisions: 09/14/2005 - P. Harvey Created +# 06/28/2017 - PH Added MBWF/RF64 support +# +# References: 1) http://www.exif.org/Exif2-2.PDF +# 2) http://www.vlsi.fi/datasheets/vs1011.pdf +# 3) http://www.music-center.com.br/spec_rif.htm +# 4) http://www.codeproject.com/audio/wavefiles.asp +# 5) http://msdn.microsoft.com/archive/en-us/directx9_c/directx/htm/avirifffilereference.asp +# 6) http://research.microsoft.com/invisible/tests/riff.h.htm +# 7) http://www.onicos.com/staff/iz/formats/wav.html +# 8) http://graphics.cs.uni-sb.de/NMM/dist-0.9.1/Docs/Doxygen/html/mmreg_8h-source.html +# 9) http://developers.videolan.org/vlc/vlc/doc/doxygen/html/codecs_8h-source.html +# 10) http://wiki.multimedia.cx/index.php?title=TwoCC +# 11) Andreas Winter (SCLive) private communication +# 12) http://abcavi.kibi.ru/infotags.htm +# 13) http://tech.ebu.ch/docs/tech/tech3285.pdf +# 14) https://developers.google.com/speed/webp/docs/riff_container +# 15) https://tech.ebu.ch/docs/tech/tech3306-2009.pdf +# 16) https://sites.google.com/site/musicgapi/technical-documents/wav-file-format +#------------------------------------------------------------------------------ + +package Image::ExifTool::RIFF; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.59'; + +sub ConvertTimecode($); +sub ProcessSGLT($$$); +sub ProcessSLLT($$$); +sub ProcessLucas($$$); + +# recognized RIFF variants +my %riffType = ( + 'WAVE' => 'WAV', 'AVI ' => 'AVI', 'WEBP' => 'WEBP', + 'LA02' => 'LA', 'LA03' => 'LA', 'LA04' => 'LA', + 'OFR ' => 'OFR', 'LPAC' => 'PAC', 'wvpk' => 'WV', +); + +# MIME types of recognized RIFF-format files +my %riffMimeType = ( + WAV => 'audio/x-wav', + AVI => 'video/x-msvideo', + WEBP => 'image/webp', + LA => 'audio/x-nspaudio', + OFR => 'audio/x-ofr', + PAC => 'audio/x-lpac', + WV => 'audio/x-wavpack', +); + +# character sets for recognized Windows code pages +my %code2charset = ( + 0 => 'Latin', + 65001 => 'UTF8', + 1252 => 'Latin', + 1250 => 'Latin2', + 1251 => 'Cyrillic', + 1253 => 'Greek', + 1254 => 'Turkish', + 1255 => 'Hebrew', + 1256 => 'Arabic', + 1257 => 'Baltic', + 1258 => 'Vietnam', + 874 => 'Thai', + 10000 => 'MacRoman', + 10029 => 'MacLatin2', + 10007 => 'MacCyrillic', + 10006 => 'MacGreek', + 10081 => 'MacTurkish', + 10010 => 'MacRomanian', + 10079 => 'MacIceland', + 10082 => 'MacCroatian', +); + +%Image::ExifTool::RIFF::audioEncoding = ( #2 + Notes => 'These "TwoCC" audio encoding codes are used in RIFF and ASF files.', + 0x01 => 'Microsoft PCM', + 0x02 => 'Microsoft ADPCM', + 0x03 => 'Microsoft IEEE float', + 0x04 => 'Compaq VSELP', #4 + 0x05 => 'IBM CVSD', #4 + 0x06 => 'Microsoft a-Law', + 0x07 => 'Microsoft u-Law', + 0x08 => 'Microsoft DTS', #4 + 0x09 => 'DRM', #4 + 0x0a => 'WMA 9 Speech', #9 + 0x0b => 'Microsoft Windows Media RT Voice', #10 + 0x10 => 'OKI-ADPCM', + 0x11 => 'Intel IMA/DVI-ADPCM', + 0x12 => 'Videologic Mediaspace ADPCM', #4 + 0x13 => 'Sierra ADPCM', #4 + 0x14 => 'Antex G.723 ADPCM', #4 + 0x15 => 'DSP Solutions DIGISTD', + 0x16 => 'DSP Solutions DIGIFIX', + 0x17 => 'Dialoic OKI ADPCM', #6 + 0x18 => 'Media Vision ADPCM', #6 + 0x19 => 'HP CU', #7 + 0x1a => 'HP Dynamic Voice', #10 + 0x20 => 'Yamaha ADPCM', #6 + 0x21 => 'SONARC Speech Compression', #6 + 0x22 => 'DSP Group True Speech', #6 + 0x23 => 'Echo Speech Corp.', #6 + 0x24 => 'Virtual Music Audiofile AF36', #6 + 0x25 => 'Audio Processing Tech.', #6 + 0x26 => 'Virtual Music Audiofile AF10', #6 + 0x27 => 'Aculab Prosody 1612', #7 + 0x28 => 'Merging Tech. LRC', #7 + 0x30 => 'Dolby AC2', + 0x31 => 'Microsoft GSM610', + 0x32 => 'MSN Audio', #6 + 0x33 => 'Antex ADPCME', #6 + 0x34 => 'Control Resources VQLPC', #6 + 0x35 => 'DSP Solutions DIGIREAL', #6 + 0x36 => 'DSP Solutions DIGIADPCM', #6 + 0x37 => 'Control Resources CR10', #6 + 0x38 => 'Natural MicroSystems VBX ADPCM', #6 + 0x39 => 'Crystal Semiconductor IMA ADPCM', #6 + 0x3a => 'Echo Speech ECHOSC3', #6 + 0x3b => 'Rockwell ADPCM', + 0x3c => 'Rockwell DIGITALK', + 0x3d => 'Xebec Multimedia', #6 + 0x40 => 'Antex G.721 ADPCM', + 0x41 => 'Antex G.728 CELP', + 0x42 => 'Microsoft MSG723', #7 + 0x43 => 'IBM AVC ADPCM', #10 + 0x45 => 'ITU-T G.726', #9 + 0x50 => 'Microsoft MPEG', + 0x51 => 'RT23 or PAC', #7 + 0x52 => 'InSoft RT24', #4 + 0x53 => 'InSoft PAC', #4 + 0x55 => 'MP3', + 0x59 => 'Cirrus', #7 + 0x60 => 'Cirrus Logic', #6 + 0x61 => 'ESS Tech. PCM', #6 + 0x62 => 'Voxware Inc.', #6 + 0x63 => 'Canopus ATRAC', #6 + 0x64 => 'APICOM G.726 ADPCM', + 0x65 => 'APICOM G.722 ADPCM', + 0x66 => 'Microsoft DSAT', #6 + 0x67 => 'Microsoft DSAT DISPLAY', #6 + 0x69 => 'Voxware Byte Aligned', #7 + 0x70 => 'Voxware AC8', #7 + 0x71 => 'Voxware AC10', #7 + 0x72 => 'Voxware AC16', #7 + 0x73 => 'Voxware AC20', #7 + 0x74 => 'Voxware MetaVoice', #7 + 0x75 => 'Voxware MetaSound', #7 + 0x76 => 'Voxware RT29HW', #7 + 0x77 => 'Voxware VR12', #7 + 0x78 => 'Voxware VR18', #7 + 0x79 => 'Voxware TQ40', #7 + 0x7a => 'Voxware SC3', #10 + 0x7b => 'Voxware SC3', #10 + 0x80 => 'Soundsoft', #6 + 0x81 => 'Voxware TQ60', #7 + 0x82 => 'Microsoft MSRT24', #7 + 0x83 => 'AT&T G.729A', #7 + 0x84 => 'Motion Pixels MVI MV12', #7 + 0x85 => 'DataFusion G.726', #7 + 0x86 => 'DataFusion GSM610', #7 + 0x88 => 'Iterated Systems Audio', #7 + 0x89 => 'Onlive', #7 + 0x8a => 'Multitude, Inc. FT SX20', #10 + 0x8b => 'Infocom ITS A/S G.721 ADPCM', #10 + 0x8c => 'Convedia G729', #10 + 0x8d => 'Not specified congruency, Inc.', #10 + 0x91 => 'Siemens SBC24', #7 + 0x92 => 'Sonic Foundry Dolby AC3 APDIF', #7 + 0x93 => 'MediaSonic G.723', #8 + 0x94 => 'Aculab Prosody 8kbps', #8 + 0x97 => 'ZyXEL ADPCM', #7, + 0x98 => 'Philips LPCBB', #7 + 0x99 => 'Studer Professional Audio Packed', #7 + 0xa0 => 'Malden PhonyTalk', #8 + 0xa1 => 'Racal Recorder GSM', #10 + 0xa2 => 'Racal Recorder G720.a', #10 + 0xa3 => 'Racal G723.1', #10 + 0xa4 => 'Racal Tetra ACELP', #10 + 0xb0 => 'NEC AAC NEC Corporation', #10 + 0xff => 'AAC', #10 + 0x100 => 'Rhetorex ADPCM', #6 + 0x101 => 'IBM u-Law', #3 + 0x102 => 'IBM a-Law', #3 + 0x103 => 'IBM ADPCM', #3 + 0x111 => 'Vivo G.723', #7 + 0x112 => 'Vivo Siren', #7 + 0x120 => 'Philips Speech Processing CELP', #10 + 0x121 => 'Philips Speech Processing GRUNDIG', #10 + 0x123 => 'Digital G.723', #7 + 0x125 => 'Sanyo LD ADPCM', #8 + 0x130 => 'Sipro Lab ACEPLNET', #8 + 0x131 => 'Sipro Lab ACELP4800', #8 + 0x132 => 'Sipro Lab ACELP8V3', #8 + 0x133 => 'Sipro Lab G.729', #8 + 0x134 => 'Sipro Lab G.729A', #8 + 0x135 => 'Sipro Lab Kelvin', #8 + 0x136 => 'VoiceAge AMR', #10 + 0x140 => 'Dictaphone G.726 ADPCM', #8 + 0x150 => 'Qualcomm PureVoice', #8 + 0x151 => 'Qualcomm HalfRate', #8 + 0x155 => 'Ring Zero Systems TUBGSM', #8 + 0x160 => 'Microsoft Audio1', #8 + 0x161 => 'Windows Media Audio V2 V7 V8 V9 / DivX audio (WMA) / Alex AC3 Audio', #10 + 0x162 => 'Windows Media Audio Professional V9', #10 + 0x163 => 'Windows Media Audio Lossless V9', #10 + 0x164 => 'WMA Pro over S/PDIF', #10 + 0x170 => 'UNISYS NAP ADPCM', #10 + 0x171 => 'UNISYS NAP ULAW', #10 + 0x172 => 'UNISYS NAP ALAW', #10 + 0x173 => 'UNISYS NAP 16K', #10 + 0x174 => 'MM SYCOM ACM SYC008 SyCom Technologies', #10 + 0x175 => 'MM SYCOM ACM SYC701 G726L SyCom Technologies', #10 + 0x176 => 'MM SYCOM ACM SYC701 CELP54 SyCom Technologies', #10 + 0x177 => 'MM SYCOM ACM SYC701 CELP68 SyCom Technologies', #10 + 0x178 => 'Knowledge Adventure ADPCM', #10 + 0x180 => 'Fraunhofer IIS MPEG2AAC', #10 + 0x190 => 'Digital Theater Systems DTS DS', #10 + 0x200 => 'Creative Labs ADPCM', #6 + 0x202 => 'Creative Labs FASTSPEECH8', #6 + 0x203 => 'Creative Labs FASTSPEECH10', #6 + 0x210 => 'UHER ADPCM', #8 + 0x215 => 'Ulead DV ACM', #10 + 0x216 => 'Ulead DV ACM', #10 + 0x220 => 'Quarterdeck Corp.', #6 + 0x230 => 'I-Link VC', #8 + 0x240 => 'Aureal Semiconductor Raw Sport', #8 + 0x241 => 'ESST AC3', #10 + 0x250 => 'Interactive Products HSX', #8 + 0x251 => 'Interactive Products RPELP', #8 + 0x260 => 'Consistent CS2', #8 + 0x270 => 'Sony SCX', #8 + 0x271 => 'Sony SCY', #10 + 0x272 => 'Sony ATRAC3', #10 + 0x273 => 'Sony SPC', #10 + 0x280 => 'TELUM Telum Inc.', #10 + 0x281 => 'TELUMIA Telum Inc.', #10 + 0x285 => 'Norcom Voice Systems ADPCM', #10 + 0x300 => 'Fujitsu FM TOWNS SND', #6 + 0x301 => 'Fujitsu (not specified)', #10 + 0x302 => 'Fujitsu (not specified)', #10 + 0x303 => 'Fujitsu (not specified)', #10 + 0x304 => 'Fujitsu (not specified)', #10 + 0x305 => 'Fujitsu (not specified)', #10 + 0x306 => 'Fujitsu (not specified)', #10 + 0x307 => 'Fujitsu (not specified)', #10 + 0x308 => 'Fujitsu (not specified)', #10 + 0x350 => 'Micronas Semiconductors, Inc. Development', #10 + 0x351 => 'Micronas Semiconductors, Inc. CELP833', #10 + 0x400 => 'Brooktree Digital', #6 + 0x401 => 'Intel Music Coder (IMC)', #10 + 0x402 => 'Ligos Indeo Audio', #10 + 0x450 => 'QDesign Music', #8 + 0x500 => 'On2 VP7 On2 Technologies', #10 + 0x501 => 'On2 VP6 On2 Technologies', #10 + 0x680 => 'AT&T VME VMPCM', #7 + 0x681 => 'AT&T TCP', #8 + 0x700 => 'YMPEG Alpha (dummy for MPEG-2 compressor)', #10 + 0x8ae => 'ClearJump LiteWave (lossless)', #10 + 0x1000 => 'Olivetti GSM', #6 + 0x1001 => 'Olivetti ADPCM', #6 + 0x1002 => 'Olivetti CELP', #6 + 0x1003 => 'Olivetti SBC', #6 + 0x1004 => 'Olivetti OPR', #6 + 0x1100 => 'Lernout & Hauspie', #6 + 0x1101 => 'Lernout & Hauspie CELP codec', #10 + 0x1102 => 'Lernout & Hauspie SBC codec', #10 + 0x1103 => 'Lernout & Hauspie SBC codec', #10 + 0x1104 => 'Lernout & Hauspie SBC codec', #10 + 0x1400 => 'Norris Comm. Inc.', #6 + 0x1401 => 'ISIAudio', #7 + 0x1500 => 'AT&T Soundspace Music Compression', #7 + 0x181c => 'VoxWare RT24 speech codec', #10 + 0x181e => 'Lucent elemedia AX24000P Music codec', #10 + 0x1971 => 'Sonic Foundry LOSSLESS', #10 + 0x1979 => 'Innings Telecom Inc. ADPCM', #10 + 0x1c07 => 'Lucent SX8300P speech codec', #10 + 0x1c0c => 'Lucent SX5363S G.723 compliant codec', #10 + 0x1f03 => 'CUseeMe DigiTalk (ex-Rocwell)', #10 + 0x1fc4 => 'NCT Soft ALF2CD ACM', #10 + 0x2000 => 'FAST Multimedia DVM', #7 + 0x2001 => 'Dolby DTS (Digital Theater System)', #10 + 0x2002 => 'RealAudio 1 / 2 14.4', #10 + 0x2003 => 'RealAudio 1 / 2 28.8', #10 + 0x2004 => 'RealAudio G2 / 8 Cook (low bitrate)', #10 + 0x2005 => 'RealAudio 3 / 4 / 5 Music (DNET)', #10 + 0x2006 => 'RealAudio 10 AAC (RAAC)', #10 + 0x2007 => 'RealAudio 10 AAC+ (RACP)', #10 + 0x2500 => 'Reserved range to 0x2600 Microsoft', #10 + 0x3313 => 'makeAVIS (ffvfw fake AVI sound from AviSynth scripts)', #10 + 0x4143 => 'Divio MPEG-4 AAC audio', #10 + 0x4201 => 'Nokia adaptive multirate', #10 + 0x4243 => 'Divio G726 Divio, Inc.', #10 + 0x434c => 'LEAD Speech', #10 + 0x564c => 'LEAD Vorbis', #10 + 0x5756 => 'WavPack Audio', #10 + 0x674f => 'Ogg Vorbis (mode 1)', #10 + 0x6750 => 'Ogg Vorbis (mode 2)', #10 + 0x6751 => 'Ogg Vorbis (mode 3)', #10 + 0x676f => 'Ogg Vorbis (mode 1+)', #10 + 0x6770 => 'Ogg Vorbis (mode 2+)', #10 + 0x6771 => 'Ogg Vorbis (mode 3+)', #10 + 0x7000 => '3COM NBX 3Com Corporation', #10 + 0x706d => 'FAAD AAC', #10 + 0x7a21 => 'GSM-AMR (CBR, no SID)', #10 + 0x7a22 => 'GSM-AMR (VBR, including SID)', #10 + 0xa100 => 'Comverse Infosys Ltd. G723 1', #10 + 0xa101 => 'Comverse Infosys Ltd. AVQSBC', #10 + 0xa102 => 'Comverse Infosys Ltd. OLDSBC', #10 + 0xa103 => 'Symbol Technologies G729A', #10 + 0xa104 => 'VoiceAge AMR WB VoiceAge Corporation', #10 + 0xa105 => 'Ingenient Technologies Inc. G726', #10 + 0xa106 => 'ISO/MPEG-4 advanced audio Coding', #10 + 0xa107 => 'Encore Software Ltd G726', #10 + 0xa109 => 'Speex ACM Codec xiph.org', #10 + 0xdfac => 'DebugMode SonicFoundry Vegas FrameServer ACM Codec', #10 + 0xe708 => 'Unknown -', #10 + 0xf1ac => 'Free Lossless Audio Codec FLAC', #10 + 0xfffe => 'Extensible', #7 + 0xffff => 'Development', #4 +); + +# RIFF info +%Image::ExifTool::RIFF::Main = ( + PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks, + NOTES => q{ + The RIFF container format is used various types of fines including AVI, WAV, + WEBP, LA, OFR, PAC and WV. According to the EXIF specification, Meta + information is embedded in two types of RIFF C<LIST> chunks: C<INFO> and + C<exif>, and information about the audio content is stored in the C<fmt > + chunk. As well as this information, some video information and proprietary + manufacturer-specific information is also extracted. + + Large AVI videos may be a concatenation of two or more RIFF chunks. For + these files, information is extracted from subsequent RIFF chunks as + sub-documents, but the Duration is calculated for the full video. + }, + # (not 100% sure that the concatenation technique mentioned above is valid - PH) + 'fmt ' => { + Name => 'AudioFormat', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::AudioFormat' }, + }, + 'bext' => { + Name => 'BroadcastExtension', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::BroadcastExt' }, + }, + ds64 => { #15 + Name => 'DataSize64', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::DS64' }, + }, + list => 'ListType', #15 + labl => { #16 (in 'adtl' chunk) + Name => 'CuePointLabel', + Priority => 0, # (so they are stored in sequence) + ValueConv => 'my $str=substr($val,4); $str=~s/\0+$//; unpack("V",$val) . " " . $str', + }, + note => { #16 (in 'adtl' chunk) + Name => 'CuePointNote', + Priority => 0, # (so they are stored in sequence) + ValueConv => 'my $str=substr($val,4); $str=~s/\0+$//; unpack("V",$val) . " " . $str', + }, + ltxt => { #16 (in 'adtl' chunk) + Name => 'LabeledText', + Notes => 'CuePointID Length Purpose Country Language Dialect Codepage Text', + Priority => 0, # (so they are stored in sequence) + ValueConv => q{ + my @a = unpack('VVa4vvvv', $val); + $a[2] = "'$a[2]'"; + my $txt = substr($val, 18); + $txt =~ s/\0+$//; # remove null terminator + return join(' ', @a, $txt); + }, + }, + smpl => { #16 + Name => 'Sampler', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Sampler' }, + }, + inst => { #16 + Name => 'Instrument', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Instrument' }, + }, + LIST_INFO => { + Name => 'Info', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Info' }, + }, + LIST_exif => { + Name => 'Exif', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Exif' }, + }, + LIST_hdrl => { # AVI header LIST chunk + Name => 'Hdrl', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Hdrl' }, + }, + LIST_Tdat => { #PH (Adobe CS3 Bridge) + Name => 'Tdat', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Tdat' }, + }, + LIST_ncdt => { #PH (Nikon metadata) + Name => 'NikonData', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::AVI', + # define ProcessProc here so we don't need to load RIFF.pm from Nikon.pm + ProcessProc => \&Image::ExifTool::RIFF::ProcessChunks, + }, + }, + LIST_hydt => { #PH (Pentax metadata) + Name => 'PentaxData', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::AVI', + ProcessProc => \&Image::ExifTool::RIFF::ProcessChunks, + }, + }, + LIST_pntx => { #Andras Salamon (Q-S1 AVI) + Name => 'PentaxData2', + SubDirectory => { + TagTable => 'Image::ExifTool::Pentax::AVI', + ProcessProc => \&Image::ExifTool::RIFF::ProcessChunks, + }, + }, + LIST_adtl => { #PH (ref 16, forum12387) + Name => 'AssociatedDataList', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Main' }, + }, + # seen LIST_JUNK + JUNK => [ + { + Name => 'OlympusJunk', + Condition => '$$valPt =~ /^OLYMDigital Camera/', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::AVI' }, + }, + { + Name => 'CasioJunk', + Condition => '$$valPt =~ /^QVMI/', + # Casio stores standard EXIF-format information in AVI videos (EX-S600) + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + DirName => 'IFD0', + Multi => 0, # (IFD1 is not written) + Start => 10, + ByteOrder => 'BigEndian', + }, + }, + { + Name => 'RicohJunk', + # the Ricoh Caplio GX stores sub-chunks in here + Condition => '$$valPt =~ /^ucmt/', + SubDirectory => { + TagTable => 'Image::ExifTool::Ricoh::AVI', + ProcessProc => \&Image::ExifTool::RIFF::ProcessChunks, + }, + }, + { + Name => 'PentaxJunk', # (Optio RS1000) + Condition => '$$valPt =~ /^IIII\x01\0/', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::Junk' }, + }, + { + Name => 'PentaxJunk2', # (Optio RZ18) + Condition => '$$valPt =~ /^PENTDigital Camera/', + SubDirectory => { TagTable => 'Image::ExifTool::Pentax::Junk2' }, + }, + { + Name => 'LucasJunk', # (Lucas LK-7900 Ace) + Condition => '$$valPt =~ /^0G(DA|PS)/', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Stream', + ProcessProc => \&ProcessLucas, + }, + }, + { + Name => 'TextJunk', + # try to interpret unknown junk as an ASCII string + RawConv => '$val =~ /^([^\0-\x1f\x7f-\xff]+)\0*$/ ? $1 : undef', + } + ], + _PMX => { #PH (Adobe CS3 Bridge) + Name => 'XMP', + Notes => 'AVI and WAV files', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, + JUNQ => { #PH (Adobe CS3 Bridge) + # old XMP is preserved when metadata is replaced in Bridge + Name => 'OldXMP', + Binary => 1, + }, + olym => { + Name => 'Olym', + SubDirectory => { TagTable => 'Image::ExifTool::Olympus::WAV' }, + }, + fact => { + Name => 'NumberOfSamples', + RawConv => 'Get32u(\$val, 0)', + }, + 'cue '=> { + Name => 'CuePoints', + Binary => 1, + Notes => q{ + config_files/cutepointlist.config from full distribution will decode this + and generate a list of cue points with labels + }, + }, + plst => { Name => 'Playlist', Binary => 1 }, #16 + afsp => { }, + IDIT => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + ValueConv => 'Image::ExifTool::RIFF::ConvertRIFFDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + }, + CSET => { + Name => 'CharacterSet', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::CSET' }, + }, + # tx_ tags are generated based on the Codec used for the txts stream + tx_USER => { + Name => 'UserText', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::UserText' }, + }, + tx_Unknown => { # (untested) + Name => 'Text', + Notes => 'streamed text, extracted when the ExtractEmbedded option is used', + }, + 'id3 ' => { + Name => 'ID3', + SubDirectory => { TagTable => 'Image::ExifTool::ID3::Main' }, + }, +# +# WebP-specific tags +# + EXIF => [{ # (WebP) + Name => 'EXIF', + Condition => '$$valPt =~ /^(II\x2a\0|MM\0\x2a)/', + Notes => 'WebP files', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + }, + },{ # (WebP) - have also seen with "Exif\0\0" header - PH + Name => 'EXIF', + Condition => '$$valPt =~ /^Exif\0\0(II\x2a\0|MM\0\x2a)/', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + ProcessProc => \&Image::ExifTool::ProcessTIFF, + Start => 6, + }, + },{ + Name => 'UnknownEXIF', + Binary => 1, + }], + 'XMP ' => { #14 (WebP) + Name => 'XMP', + Notes => 'WebP files', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' }, + }, + ICCP => { #14 (WebP) + Name => 'ICC_Profile', + Notes => 'WebP files', + SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' }, + }, + 'VP8 ' => { # (WebP lossy) + Name => 'VP8Bitstream', + Condition => '$$valPt =~ /^...\x9d\x01\x2a/s', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::VP8' }, + }, + VP8L => { #14 (WebP lossless) + Name => 'VP8L', + Condition => '$$valPt =~ /^\x2f/', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::VP8L' }, + }, + VP8X => { #14 (WebP extended) + Name => 'VP8X', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::VP8X' }, + }, + ANIM => { #14 (WebP animation) + Name => 'ANIM', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::ANIM' }, + }, + ANMF => { #14 (WebP animation frame) + Name => 'ANMF', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::ANMF' }, + }, + ALPH => { #14 (WebP alpha) + Name => 'ALPH', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::ALPH' }, + }, + SGLT => { #PH (BikeBro) + Name => 'BikeBroAccel', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Stream', + ProcessProc => \&ProcessSGLT, + }, + }, + SLLT => { #PH (BikeBro) + Name => 'BikeBroGPS', + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Stream', + ProcessProc => \&ProcessSLLT, + }, + }, + iXML => { #PH + SubDirectory => { TagTable => 'Image::ExifTool::XMP::XML' }, + }, + aXML => { #PH + SubDirectory => { TagTable => 'Image::ExifTool::XMP::XML' }, + }, +# +# tags found in an AlphaImagingTech AVI video - PH +# + LIST_INF0 => { # ('0' instead of 'O' -- odd) + Name => 'Info', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Info' }, + }, + gps0 => { + Name => 'GPSTrack', + SetGroups => 'RIFF', # (moves "QuickTime" tags to the "RIFF" group) + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Stream', + # (don't use code ref here or get "Prototype mismatch" warning with some Perl versions) + ProcessProc => 'Image::ExifTool::QuickTime::Process_gps0', + }, + }, + gsen => { + Name => 'GSensor', + SetGroups => 'RIFF', # (moves "QuickTime" tags to the "RIFF" group) + SubDirectory => { + TagTable => 'Image::ExifTool::QuickTime::Stream', + ProcessProc => 'Image::ExifTool::QuickTime::Process_gsen', + }, + }, + # gpsa - seen hex "01 20 00 00", same as QuickTime + # gsea - 16 bytes hex "04 08 02 00 20 02 00 00 1f 03 00 00 01 00 00 00" +); + +# the maker notes used by some digital cameras +%Image::ExifTool::RIFF::Junk = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, +); + +# Format and Audio Stream Format chunk data +%Image::ExifTool::RIFF::AudioFormat = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + FORMAT => 'int16u', + 0 => { + Name => 'Encoding', + PrintHex => 1, + PrintConv => \%Image::ExifTool::RIFF::audioEncoding, + SeparateTable => 'AudioEncoding', + }, + 1 => 'NumChannels', + 2 => { + Name => 'SampleRate', + Format => 'int32u', + }, + 4 => { + Name => 'AvgBytesPerSec', + Format => 'int32u', + }, + # uninteresting + # 6 => 'BlockAlignment', + 7 => 'BitsPerSample', +); + +# Broadcast Audio Extension 'bext' information (ref 13) +%Image::ExifTool::RIFF::BroadcastExt = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + NOTES => q{ + Information found in the Broadcast Audio Extension chunk (see + L<http://tech.ebu.ch/docs/tech/tech3285.pdf>). + }, + 0 => { + Name => 'Description', + Format => 'string[256]', + }, + 256 => { + Name => 'Originator', + Format => 'string[32]', + }, + 288 => { + Name => 'OriginatorReference', + Format => 'string[32]', + }, + 320 => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + Format => 'string[18]', + ValueConv => '$_=$val; tr/-/:/; s/^(\d{4}:\d{2}:\d{2})/$1 /; $_', + PrintConv => '$self->ConvertDateTime($val)', + }, + 338 => { + Name => 'TimeReference', + Notes => 'first sample count since midnight', + Format => 'int32u[2]', + ValueConv => 'my @v=split(" ",$val); $v[0] + $v[1] * 4294967296', + }, + 346 => { + Name => 'BWFVersion', + Format => 'int16u', + }, + 348 => { + Name => 'BWF_UMID', + Format => 'undef[64]', + ValueConv => '$_=unpack("H*",$val); s/0{64}$//; uc $_', + }, + # 412 - int8u[190] - reserved + 602 => { + Name => 'CodingHistory', + Format => 'string[$size-602]', + }, +); + +# 64-bit chunk sizes (ref 15) +%Image::ExifTool::RIFF::DS64 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + FORMAT => 'int64u', + NOTES => q{ + 64-bit data sizes for MBWF/RF64 files. See + L<https://tech.ebu.ch/docs/tech/tech3306-2009.pdf> for the specification. + }, + 0 => { + Name => 'RIFFSize64', + PrintConv => \&Image::ExifTool::ConvertFileSize, + }, + 1 => { + Name => 'DataSize64', + DataMember => 'DataSize64', + RawConv => '$$self{DataSize64} = $val', + PrintConv => \&Image::ExifTool::ConvertFileSize, + }, + 2 => 'NumberOfSamples64', + # (after this comes a table of size overrides for chunk + # types other than 'data', but since these are currently + # very unlikely, support for these is not yet implemented) +); + +# Sampler chunk (ref 16) +%Image::ExifTool::RIFF::Sampler = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + FORMAT => 'int32u', + 0 => 'Manufacturer', + 1 => 'Product', + 2 => 'SamplePeriod', + 3 => 'MIDIUnityNote', + 4 => 'MIDIPitchFraction', + 5 => { + Name => 'SMPTEFormat', + PrintConv => { + 0 => 'none', + 24 => '24 fps', + 25 => '25 fps', + 29 => '29 fps', + 30 => '30 fps', + }, + }, + 6 => { + Name => 'SMPTEOffset', + Notes => 'HH:MM:SS:FF', + ValueConv => q{ + my $str = sprintf('%.8x', $val); + $str =~ s/(..)(..)(..)(..)/$1:$2:$3:$4/; + return $str; + }, + }, + 7 => 'NumSampleLoops', + 8 => 'SamplerDataLen', + 9 => { Name => 'SamplerData', Format => 'undef[$size-40]', Binary => 1 }, +); + +# Instrument chunk (ref 16) +%Image::ExifTool::RIFF::Instrument = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + FORMAT => 'int8s', + 0 => 'UnshiftedNote', + 1 => 'FineTune', + 2 => 'Gain', + 3 => 'LowNote', + 4 => 'HighNote', + 5 => 'LowVelocity', + 6 => 'HighVelocity', +); + +# Sub chunks of INFO LIST chunk +%Image::ExifTool::RIFF::Info = ( + PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks, + GROUPS => { 2 => 'Audio' }, + FORMAT => 'string', + NOTES => q{ + RIFF INFO tags found in AVI video and WAV audio files. Tags which are part + of the EXIF 2.3 specification have an underlined Tag Name in the HTML + version of this documentation. Other tags are found in AVI files generated + by some software. + }, + IARL => 'ArchivalLocation', + IART => { Name => 'Artist', Groups => { 2 => 'Author' } }, + ICMS => 'Commissioned', + ICMT => 'Comment', + ICOP => { Name => 'Copyright', Groups => { 2 => 'Author' } }, + ICRD => { + Name => 'DateCreated', + Groups => { 2 => 'Time' }, + ValueConv => '$_=$val; s/-/:/g; $_', + }, + ICRP => 'Cropped', + IDIM => 'Dimensions', + IDPI => 'DotsPerInch', + IENG => 'Engineer', + IGNR => 'Genre', + IKEY => 'Keywords', + ILGT => 'Lightness', + IMED => 'Medium', + INAM => 'Title', + ITRK => 'TrackNumber', + IPLT => 'NumColors', + IPRD => 'Product', + ISBJ => 'Subject', + ISFT => { + Name => 'Software', + # remove trailing nulls/spaces and split at first null + # (Casio writes "CASIO" in unicode after the first null) + ValueConv => '$_=$val; s/(\s*\0)+$//; s/(\s*\0)/, /; s/\0+//g; $_', + }, + ISHP => 'Sharpness', + ISRC => 'Source', + ISRF => 'SourceForm', + ITCH => 'Technician', +# +# 3rd party tags +# + # internet movie database (ref 12) + ISGN => 'SecondaryGenre', + IWRI => 'WrittenBy', + IPRO => 'ProducedBy', + ICNM => 'Cinematographer', + IPDS => 'ProductionDesigner', + IEDT => 'EditedBy', + ICDS => 'CostumeDesigner', + IMUS => 'MusicBy', + ISTD => 'ProductionStudio', + IDST => 'DistributedBy', + ICNT => 'Country', + ILNG => 'Language', + IRTD => 'Rating', + ISTR => 'Starring', + # MovieID (ref12) + TITL => 'Title', + DIRC => 'Directory', + YEAR => 'Year', + GENR => 'Genre', + COMM => 'Comments', + LANG => 'Language', + AGES => 'Rated', + STAR => 'Starring', + CODE => 'EncodedBy', + PRT1 => 'Part', + PRT2 => 'NumberOfParts', + # Morgan Multimedia INFO tags (ref 12) + IAS1 => 'FirstLanguage', + IAS2 => 'SecondLanguage', + IAS3 => 'ThirdLanguage', + IAS4 => 'FourthLanguage', + IAS5 => 'FifthLanguage', + IAS6 => 'SixthLanguage', + IAS7 => 'SeventhLanguage', + IAS8 => 'EighthLanguage', + IAS9 => 'NinthLanguage', + ICAS => 'DefaultAudioStream', + IBSU => 'BaseURL', + ILGU => 'LogoURL', + ILIU => 'LogoIconURL', + IWMU => 'WatermarkURL', + IMIU => 'MoreInfoURL', + IMBI => 'MoreInfoBannerImage', + IMBU => 'MoreInfoBannerURL', + IMIT => 'MoreInfoText', + # GSpot INFO tags (ref 12) + IENC => 'EncodedBy', + IRIP => 'RippedBy', + # Sound Forge Pro tags + DISP => 'SoundSchemeTitle', + TLEN => { Name => 'Length', ValueConv => '$val/1000', PrintConv => '"$val s"' }, + TRCK => 'TrackNumber', + TURL => 'URL', + TVER => 'Version', + LOCA => 'Location', + TORG => 'Organization', + # Sony Vegas AVI tags, also used by SCLive and Adobe Premier (ref 11) + TAPE => { + Name => 'TapeName', + Groups => { 2 => 'Video' }, + }, + TCOD => { + Name => 'StartTimecode', + # this is the tape time code for the start of the video + Groups => { 2 => 'Video' }, + ValueConv => '$val * 1e-7', + PrintConv => \&ConvertTimecode, + }, + TCDO => { + Name => 'EndTimecode', + Groups => { 2 => 'Video' }, + ValueConv => '$val * 1e-7', + PrintConv => \&ConvertTimecode, + }, + VMAJ => { + Name => 'VegasVersionMajor', + Groups => { 2 => 'Video' }, + }, + VMIN => { + Name => 'VegasVersionMinor', + Groups => { 2 => 'Video' }, + }, + CMNT => { + Name => 'Comment', + Groups => { 2 => 'Video' }, + }, + RATE => { + Name => 'Rate', #? (video? units?) + Groups => { 2 => 'Video' }, + }, + STAT => { + Name => 'Statistics', + Groups => { 2 => 'Video' }, + # ("7318 0 3.430307 1", "0 0 3500.000000 1", "7 0 3.433228 1") + PrintConv => [ + '"$val frames captured"', + '"$val dropped"', + '"Data rate $val"', + { 0 => 'Bad', 1 => 'OK' }, # capture OK? + ], + }, + DTIM => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + ValueConv => q{ + my @v = split ' ', $val; + return undef unless @v == 2; + # the Kodak EASYSHARE Sport stores this incorrectly as a string: + return $val if $val =~ /^\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2}$/; + # get time in seconds + $val = 1e-7 * ($v[0] * 4294967296 + $v[1]); + # shift from Jan 1, 1601 to Jan 1, 1970 + $val -= 134774 * 24 * 3600 if $val != 0; + return Image::ExifTool::ConvertUnixTime($val); + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + # not observed, but apparently part of the standard: + IDIT => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + ValueConv => 'Image::ExifTool::RIFF::ConvertRIFFDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + }, + ISMP => 'TimeCode', +); + +# Sub chunks of EXIF LIST chunk +%Image::ExifTool::RIFF::Exif = ( + PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks, + GROUPS => { 2 => 'Audio' }, + NOTES => 'These tags are part of the EXIF 2.3 specification for WAV audio files.', + ever => 'ExifVersion', + erel => 'RelatedImageFile', + etim => { Name => 'TimeCreated', Groups => { 2 => 'Time' } }, + ecor => { Name => 'Make', Groups => { 2 => 'Camera' } }, + emdl => { Name => 'Model', Groups => { 2 => 'Camera' }, Description => 'Camera Model Name' }, + emnt => { Name => 'MakerNotes', Binary => 1 }, + eucm => { + Name => 'UserComment', + PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,"RIFF:UserComment")', + }, +); + +# Sub chunks of hdrl LIST chunk +%Image::ExifTool::RIFF::Hdrl = ( + PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks, + GROUPS => { 2 => 'Image' }, + avih => { + Name => 'AVIHeader', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::AVIHeader' }, + }, + IDIT => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + ValueConv => 'Image::ExifTool::RIFF::ConvertRIFFDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + }, + ISMP => 'TimeCode', + LIST_strl => { + Name => 'Stream', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Stream' }, + }, + LIST_odml => { + Name => 'OpenDML', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::OpenDML' }, + }, +); + +# Sub chunks of Tdat LIST chunk (ref PH) +%Image::ExifTool::RIFF::Tdat = ( + PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks, + GROUPS => { 2 => 'Video' }, + # (have seen tc_O, tc_A, rn_O and rn_A) +); + +# RIFF character set chunk +%Image::ExifTool::RIFF::CSET = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + FORMAT => 'int16u', + 0 => { + Name => 'CodePage', + RawConv => '$$self{CodePage} = $val', + }, + 1 => 'CountryCode', + 2 => 'LanguageCode', + 3 => 'Dialect', +); + +%Image::ExifTool::RIFF::AVIHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + 0 => { + Name => 'FrameRate', + # (must use RawConv because raw value used in Composite tag) + RawConv => '$val ? 1e6 / $val : undef', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + }, + 1 => { + Name => 'MaxDataRate', + PrintConv => 'sprintf("%.4g kB/s",$val / 1024)', + }, + # 2 => 'PaddingGranularity', + # 3 => 'Flags', + 4 => 'FrameCount', + # 5 => 'InitialFrames', + 6 => 'StreamCount', + # 7 => 'SuggestedBufferSize', + 8 => 'ImageWidth', + 9 => 'ImageHeight', +); + +%Image::ExifTool::RIFF::Stream = ( + PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks, + GROUPS => { 2 => 'Image' }, + strh => { + Name => 'StreamHeader', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::StreamHeader' }, + }, + strn => 'StreamName', + strd => { #PH + Name => 'StreamData', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::StreamData' }, + }, + strf => [ + { + Name => 'AudioFormat', + Condition => '$$self{RIFFStreamType} eq "auds"', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::AudioFormat' }, + }, + { + Name => 'VideoFormat', + Condition => '$$self{RIFFStreamType} eq "vids"', + SubDirectory => { TagTable => 'Image::ExifTool::BMP::Main' }, + }, + { + Name => 'TextFormat', + Condition => '$$self{RIFFStreamType} eq "txts"', + Hidden => 1, + RawConv => '$self->Options("ExtractEmbedded") or $self->WarnOnce("Use ExtractEmbedded option to extract timed text",3); undef', + }, + ], +); + +# Open DML tags (ref http://www.morgan-multimedia.com/download/odmlff2.pdf) +%Image::ExifTool::RIFF::OpenDML = ( + PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessChunks, + GROUPS => { 2 => 'Video' }, + dmlh => { + Name => 'ExtendedAVIHeader', + SubDirectory => { TagTable => 'Image::ExifTool::RIFF::ExtAVIHdr' }, + }, +); + +# Extended AVI Header tags (ref http://www.morgan-multimedia.com/download/odmlff2.pdf) +%Image::ExifTool::RIFF::ExtAVIHdr = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int32u', + 0 => 'TotalFrameCount', +); + +%Image::ExifTool::RIFF::StreamHeader = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + PRIORITY => 0, # so we get values from the first stream + 0 => { + Name => 'StreamType', + Format => 'string[4]', + RawConv => '$$self{RIFFStreamNum} = ($$self{RIFFStreamNum} || 0) + 1; $$self{RIFFStreamType} = $val', + PrintConv => { + auds => 'Audio', + mids => 'MIDI', + txts => 'Text', + vids => 'Video', + iavs => 'Interleaved Audio+Video', + }, + }, + 1 => [ + { + Name => 'AudioCodec', + Condition => '$$self{RIFFStreamType} eq "auds"', + RawConv => '$$self{RIFFStreamCodec}[$$self{RIFFStreamNum}-1] = $val', + Format => 'string[4]', + }, + { + Name => 'VideoCodec', + Condition => '$$self{RIFFStreamType} eq "vids"', + RawConv => '$$self{RIFFStreamCodec}[$$self{RIFFStreamNum}-1] = $val', + Format => 'string[4]', + }, + { + Name => 'Codec', + Format => 'string[4]', + RawConv => '$$self{RIFFStreamCodec}[$$self{RIFFStreamNum}-1] = $val', + }, + ], + # 2 => 'StreamFlags', + # 3 => 'StreamPriority', + # 3.5 => 'Language', + # 4 => 'InitialFrames', + 5 => [ + { + Name => 'AudioSampleRate', + Condition => '$$self{RIFFStreamType} eq "auds"', + Format => 'rational64u', + ValueConv => '$val ? 1/$val : 0', + PrintConv => 'int($val * 100 + 0.5) / 100', + }, + { + Name => 'VideoFrameRate', + Condition => '$$self{RIFFStreamType} eq "vids"', + Format => 'rational64u', + # (must use RawConv because raw value used in Composite tag) + RawConv => '$val ? 1/$val : undef', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + }, + { + Name => 'StreamSampleRate', + Format => 'rational64u', + ValueConv => '$val ? 1/$val : 0', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + }, + ], + # 7 => 'Start', + 8 => [ + { + Name => 'AudioSampleCount', + Condition => '$$self{RIFFStreamType} eq "auds"', + }, + { + Name => 'VideoFrameCount', + Condition => '$$self{RIFFStreamType} eq "vids"', + }, + { + Name => 'StreamSampleCount', + }, + ], + # 9 => 'SuggestedBufferSize', + 10 => { + Name => 'Quality', + PrintConv => '$val eq 0xffffffff ? "Default" : $val', + }, + 11 => { + Name => 'SampleSize', + PrintConv => '$val ? "$val byte" . ($val==1 ? "" : "s") : "Variable"', + }, + # 12 => { Name => 'Frame', Format => 'int16u[4]' }, +); + +%Image::ExifTool::RIFF::StreamData = ( #PH + PROCESS_PROC => \&Image::ExifTool::RIFF::ProcessStreamData, + GROUPS => { 2 => 'Video' }, + NOTES => q{ + This chunk is used to store proprietary information in AVI videos from some + cameras. The first 4 characters of the data are used as the Tag ID below. + }, + AVIF => { + Name => 'AVIF', + SubDirectory => { + TagTable => 'Image::ExifTool::Exif::Main', + DirName => 'IFD0', + Start => 8, + ByteOrder => 'LittleEndian', + }, + }, + CASI => { # (used by Casio GV-10) + Name => 'CasioData', + SubDirectory => { TagTable => 'Image::ExifTool::Casio::AVI' }, + }, + Zora => 'VendorName', # (Samsung PL90 AVI files) + unknown => { + Name => 'UnknownData', + # try to interpret unknown stream data as a string + RawConv => '$_=$val; /^[^\0-\x1f\x7f-\xff]+$/ ? $_ : undef', + }, +); + +# VP8 bitstream (ref http://www.rfc-editor.org/rfc/pdfrfc/rfc6386.txt.pdf) +%Image::ExifTool::RIFF::VP8 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + NOTES => q{ + This chunk is found in simple-format (lossy) WebP files. See + L<https://developers.google.com/speed/webp/docs/riff_container> for the WebP + container specification. + }, + 0 => { + Name => 'VP8Version', + Mask => 0x0e, + PrintConv => { + 0 => '0 (bicubic reconstruction, normal loop)', + 1 => '1 (bilinear reconstruction, simple loop)', + 2 => '2 (bilinear reconstruction, no loop)', + 3 => '3 (no reconstruction, no loop)', + }, + }, + 6 => { + Name => 'ImageWidth', + Format => 'int16u', + Mask => 0x3fff, + }, + 6.1 => { + Name => 'HorizontalScale', + Format => 'int16u', + Mask => 0xc000, + }, + 8 => { + Name => 'ImageHeight', + Format => 'int16u', + Mask => 0x3fff, + }, + 8.1 => { + Name => 'VerticalScale', + Format => 'int16u', + Mask => 0xc000, + }, +); + +# WebP lossless info (ref 14) +%Image::ExifTool::RIFF::VP8L = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + NOTES => 'This chunk is found in lossless WebP files.', + GROUPS => { 2 => 'Image' }, + 1 => { + Name => 'ImageWidth', + Format => 'int16u', + ValueConv => '($val & 0x3fff) + 1', + }, + 2 => { + Name => 'ImageHeight', + Format => 'int32u', + ValueConv => '(($val >> 6) & 0x3fff) + 1', + }, +); + +# WebP extended info (ref 14) +%Image::ExifTool::RIFF::VP8X = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + NOTES => 'This chunk is found in extended WebP files.', + # 0 - bitmask: 2=ICC, 3=alpha, 4=EXIF, 5=XMP, 6=animation + 4 => { + Name => 'ImageWidth', + Format => 'int32u', + ValueConv => '($val & 0xffffff) + 1', + }, + 6 => { + Name => 'ImageHeight', + Format => 'int32u', + ValueConv => '($val >> 8) + 1', + }, +); + +# WebP animation info (ref 14) +%Image::ExifTool::RIFF::ANIM = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + NOTES => 'WebP animation chunk.', + 0 => { + Name => 'BackgroundColor', + Format => 'int8u[4]', + }, + 4 => { + Name => 'AnimationLoopCount', + PrintConv => '$val || "inf"', + }, +); + +# WebP animation frame info (ref 14) +%Image::ExifTool::RIFF::ANMF = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + NOTES => 'WebP animation frame chunk.', + 12 => { + Name => 'Duration', + Format => 'int32u', + Notes => 'extracted as the sum of durations of all animation frames', + RawConv => q{ + if (defined $$self{VALUE}{Duration}) { + $$self{VALUE}{Duration} += $val & 0x0fff; + return undef; + } + return $val & 0x0fff; + }, + ValueConv => '$val / 1000', + PrintConv => 'ConvertDuration($val)', + }, +); + +# streamed USER txts written by Momento M6 dashcam (ref PH) +%Image::ExifTool::RIFF::UserText = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Location' }, + NOTES => q{ + Tags decoded from the USER-format txts stream written by Momento M6 dashcam. + Extracted only if the ExtractEmbedded option is used. + }, + # (little-endian) + # 0 - int32u: 32 + # 4 - int32u: sample number (starting from unknown offset) + # 8 - int8u[4]: "w x y z" ? (w 0=front cam, 1=rear cam, z mostly 5-8) + # 12 - int8u[4]: "0 x 1 0" ? (x incrementing once per second) + # 16 - int8u[4]: "0 32 0 x" ? + # 20 - int32u: 100-150(mostly), 250-300(once per second) + # 24 - int8u[4]: "0 x y 0" ? + 28 => { Name => 'GPSAltitude', Format => 'int32u', ValueConv => '$val / 10' }, # (NC) + # 32 - int32u: 0(mostly), 23(once per second) + # 36 - int32u: 0 + 40 => { Name => 'Accelerometer', Format => 'float[3]' }, + # 52 - int32u: 1 + 56 => { Name => 'GPSSpeed', Format => 'float' }, # km/h + 60 => { + Name => 'GPSLatitude', + Format => 'float', + # Note: these values are unsigned and I don't know where the hemisphere is stored, + # but my only sample is from the U.S., so assume a positive latitude (for now) + ValueConv => 'my $deg = int($val / 100); $deg + ($val - $deg * 100) / 60', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + 64 => { + Name => 'GPSLongitude', + Format => 'float', + # Note: these values are unsigned and I don't know where the hemisphere is stored, + # but my only sample is from the U.S., so assume a negative longitude (for now) + ValueConv => 'my $deg = int($val / 100); -($deg + ($val - $deg * 100) / 60)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, + 68 => { + Name => 'GPSDateTime', + Description => 'GPS Date/Time', + Groups => { 2 => 'Time' }, + Format => 'int32u', + ValueConv => 'ConvertUnixTime($val)', + # (likely local time, but clock seemed off by 3 hours in my sample) + PrintConv => '$self->ConvertDateTime($val)', + }, +); + +# WebP alpha info (ref 14) +%Image::ExifTool::RIFF::ALPH = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Image' }, + NOTES => 'WebP alpha chunk.', + 0 => { + Name => 'AlphaPreprocessing', + Mask => 0x03, + PrintConv => { + 0 => 'none', + 1 => 'Level Reduction', + }, + }, + 0.1 => { + Name => 'AlphaFiltering', + Mask => 0x03, + PrintConv => { + 0 => 'none', + 1 => 'Horizontal', + 2 => 'Vertical', + 3 => 'Gradient', + }, + }, + 0.2 => { + Name => 'AlphaCompression', + Mask => 0x03, + PrintConv => { + 0 => 'none', + 1 => 'Lossless', + }, + }, +); + +# RIFF composite tags +%Image::ExifTool::RIFF::Composite = ( + Duration => { + Require => { + 0 => 'RIFF:FrameRate', + 1 => 'RIFF:FrameCount', + }, + Desire => { + 2 => 'VideoFrameRate', + 3 => 'VideoFrameCount', + }, + RawConv => 'Image::ExifTool::RIFF::CalcDuration($self, @val)', + PrintConv => 'ConvertDuration($val)', + }, + Duration2 => { + Name => 'Duration', + Require => { + 0 => 'RIFF:AvgBytesPerSec', + 1 => 'FileSize', + }, + Desire => { + # check FrameCount because this calculation only applies + # to audio-only files (eg. WAV) + 2 => 'FrameCount', + 3 => 'VideoFrameCount', + }, + # (can't calculate duration like this for compressed audio types) + RawConv => q{ + return undef if $$self{VALUE}{FileType} =~ /^(LA|OFR|PAC|WV)$/; + return(($val[0] and not ($val[2] or $val[3])) ? $val[1] / $val[0] : undef); + }, + PrintConv => 'ConvertDuration($val)', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::RIFF'); + + +#------------------------------------------------------------------------------ +# Convert RIFF date to EXIF format +my %monthNum = ( + Jan=>1, Feb=>2, Mar=>3, Apr=>4, May=>5, Jun=>6, + Jul=>7, Aug=>8, Sep=>9, Oct=>10,Nov=>11,Dec=>12 +); +sub ConvertRIFFDate($) +{ + my $val = shift; + my @part = split ' ', $val; + my $mon; + if (@part >= 5 and $mon = $monthNum{ucfirst(lc($part[1]))}) { + # the standard AVI date format (eg. "Mon Mar 10 15:04:43 2003") + $val = sprintf("%.4d:%.2d:%.2d %s", $part[4], + $mon, $part[2], $part[3]); + } elsif ($val =~ m{(\d{4})/\s*(\d+)/\s*(\d+)/?\s+(\d+):\s*(\d+)\s*(P?)}) { + # but the Casio QV-3EX writes dates like "2001/ 1/27 1:42PM", + # and the Casio EX-Z30 writes "2005/11/28/ 09:19"... doh! + $val = sprintf("%.4d:%.2d:%.2d %.2d:%.2d:00",$1,$2,$3,$4+($6?12:0),$5); + } elsif ($val =~ m{(\d{4})[-/](\d+)[-/](\d+)\s+(\d+:\d+:\d+)}) { + # the Konica KD500Z writes "2002-12-16 15:35:01\0\0" + $val = "$1:$2:$3 $4"; + } + return $val; +} + +#------------------------------------------------------------------------------ +# Print time +# Inputs: 0) time in seconds +# Returns: time string +sub ConvertTimecode($) +{ + my $val = shift; + my $hr = int($val / 3600); + $val -= $hr * 3600; + my $min = int($val / 60); + $val -= $min * 60; + my $ss = sprintf('%05.2f', $val); + if ($ss >= 60) { # handle round-off problems + $ss = '00.00'; + ++$min >= 60 and $min -= 60, ++$hr; + } + return sprintf('%d:%.2d:%s', $hr, $min, $ss); +} + +#------------------------------------------------------------------------------ +# Calculate duration of RIFF +# Inputs: 0) ExifTool ref, 1/2) RIFF:FrameRate/Count, 2/3) VideoFrameRate/Count +# Returns: Duration in seconds or undef +# Notes: Sums duration of all sub-documents (concatenated AVI files) +sub CalcDuration($@) +{ + my ($et, @val) = @_; + my $totalDuration = 0; + my $subDoc = 0; + my @keyList; + for (;;) { + # this is annoying. Apparently (although I couldn't verify this), FrameCount + # in the RIFF header includes multiple video tracks if they exist (eg. with the + # FujiFilm REAL 3D AVI's), but the video stream information isn't reliable for + # some cameras (eg. Olympus FE models), so use the video stream information + # only if the RIFF header duration is 2 to 3 times longer + my $dur1; + $dur1 = $val[1] / $val[0] if $val[0]; + if ($val[2] and $val[3]) { + my $dur2 = $val[3] / $val[2]; + my $rat = $dur1 / $dur2; + $dur1 = $dur2 if $rat > 1.9 and $rat < 3.1; + } + $totalDuration += $dur1 if defined $dur1; + last unless $subDoc++ < $$et{DOC_COUNT}; + # get tag values for next sub-document + my @tags = qw(FrameRate FrameCount VideoFrameRate VideoFrameCount); + my $rawValue = $$et{VALUE}; + my ($i, $j, $key, $keys); + for ($i=0; $i<@tags; ++$i) { + if ($subDoc == 1) { + # generate list of available keys for each tag + $keys = $keyList[$i] = [ ]; + for ($j=0; ; ++$j) { + $key = $tags[$i]; + $key .= " ($j)" if $j; + last unless defined $$rawValue{$key}; + push @$keys, $key; + } + } else { + $keys = $keyList[$i]; + } + # find key for tag in this sub-document + my $grp = "Doc$subDoc"; + $grp .= ":RIFF" if $i < 2; # (tags 0 and 1 also in RIFF group) + $key = $et->GroupMatches($grp, $keys); + $val[$i] = $key ? $$rawValue{$key} : undef; + } + last unless defined $val[0] and defined $val[1]; # (Require'd tags) + } + return $totalDuration; +} + +#------------------------------------------------------------------------------ +# Process stream data +# Inputs: 0) ExifTool object ref, 1) dirInfo reference, 2) tag table ref +# Returns: 1 on success +sub ProcessStreamData($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $start = $$dirInfo{DirStart}; + my $size = $$dirInfo{DirLen}; + return 0 if $size < 4; + if ($et->Options('Verbose')) { + $et->VerboseDir($$dirInfo{DirName}, 0, $size); + } + my $tag = substr($$dataPt, $start, 4); + my $tagInfo = $et->GetTagInfo($tagTbl, $tag); + unless ($tagInfo) { + $tagInfo = $et->GetTagInfo($tagTbl, 'unknown'); + return 1 unless $tagInfo; + } + my $subdir = $$tagInfo{SubDirectory}; + if ($$tagInfo{SubDirectory}) { + my $offset = $$subdir{Start} || 0; + my $baseShift = $$dirInfo{DataPos} + $$dirInfo{DirStart} + $offset; + my %subdirInfo = ( + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos} - $baseShift, + Base => ($$dirInfo{Base} || 0) + $baseShift, + DataLen => $$dirInfo{DataLen}, + DirStart=> $$dirInfo{DirStart} + $offset, + DirLen => $$dirInfo{DirLen} - $offset, + DirName => $$subdir{DirName}, + Parent => $$dirInfo{DirName}, + ); + unless ($offset) { + # allow processing of 2nd directory at the same address + my $addr = $subdirInfo{DirStart} + $subdirInfo{DataPos} + $subdirInfo{Base}; + delete $$et{PROCESSED}{$addr} + } + # (we could set FIRST_EXIF_POS to $subdirInfo{Base} here to make + # htmlDump offsets relative to EXIF base if we wanted...) + my $subTable = GetTagTable($$subdir{TagTable}); + $et->ProcessDirectory(\%subdirInfo, $subTable); + } else { + $et->HandleTag($tagTbl, $tag, undef, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + Start => $start, + Size => $size, + TagInfo => $tagInfo, + ); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Make tag information hash for unknown tag +# Inputs: 0) Tag table ref, 1) tag ID +sub MakeTagInfo($$) +{ + my ($tagTbl, $tag) = @_; + my $name = $tag; + my $n = ($name =~ s/([\x00-\x1f\x7f-\xff])/'x'.unpack('H*',$1)/eg); + # print in hex if tag is numerical + $name = sprintf('0x%.4x',unpack('N',$tag)) if $n > 2; + AddTagToTable($tagTbl, $tag, { + Name => "Unknown_$name", + Description => "Unknown $name", + Unknown => 1, + Binary => 1, + }); +} + +#------------------------------------------------------------------------------ +# Process RIFF chunks +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessChunks($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $start = $$dirInfo{DirStart}; + my $size = $$dirInfo{DirLen}; + my $end = $start + $size; + my $base = $$dirInfo{Base}; + my $verbose = $et->Options('Verbose'); + my $unknown = $et->Options('Unknown'); + my $charset = $et->Options('CharsetRIFF'); + + unless ($charset) { + if ($$et{CodePage}) { + $charset = $$et{CodePage}; + } elsif (defined $charset and $charset eq '0') { + $charset = 'Latin'; + } + } + + $et->VerboseDir($$dirInfo{DirName}, 0, $size) if $verbose; + + while ($start + 8 < $end) { + my $tag = substr($$dataPt, $start, 4); + my $len = Get32u($dataPt, $start + 4); + $start += 8; + if ($start + $len > $end) { + $et->Warn("Bad $tag chunk"); + return 0; + } + if ($tag eq 'LIST' and $len >= 4) { + $tag .= '_' . substr($$dataPt, $start, 4); + $len -= 4; + $start += 4; + } + my $tagInfo = $et->GetTagInfo($tagTbl, $tag); + my $baseShift = 0; + my $val; + if ($tagInfo) { + if ($$tagInfo{SubDirectory}) { + # adjust base if necessary (needed for Ricoh maker notes) + my $newBase = $tagInfo->{SubDirectory}{Base}; + if (defined $newBase) { + # different than your average Base eval... + # here we use an absolute $start address + $start += $base; + #### eval Base ($start) + $newBase = eval $newBase; + $baseShift = $newBase - $base; + $start -= $base; + } + } elsif (not $$tagInfo{Binary}) { + my $format = $$tagInfo{Format} || $$tagTbl{FORMAT}; + if ($format and $format eq 'string') { + $val = substr($$dataPt, $start, $len); + $val =~ s/\0+$//; # remove trailing nulls from strings + # decode if necessary + $val = $et->Decode($val, $charset) if $charset; + } + } + } elsif ($verbose or $unknown) { + MakeTagInfo($tagTbl, $tag); + } + $et->HandleTag($tagTbl, $tag, $val, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos} - $baseShift, + Start => $start, + Size => $len, + Base => $base + $baseShift, + Addr => $base + $baseShift + $start, + ); + ++$len if $len & 0x01; # must account for padding if odd number of bytes + $start += $len; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process BikeBro SGLT chunk (accelerometer data) (ref PH) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessSGLT($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataLen = length $$dataPt; + my $ee = $et->Options('ExtractEmbedded'); + my $pos; + # example accelerometer record: + # 0 1 2 3 4 5 6 7 + # 00 00 00 24 02 00 00 01 17 04 00 00 00 00 00 00 00 00 9b 02 + # frame------ ?? Xs X---------- Ys Y---------- Zs Z---------- + $$et{SET_GROUP0} = $$et{SET_GROUP1} = 'RIFF'; + for ($pos=0; $pos<=$dataLen-20; $pos+=20) { + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + my $buff = substr($$dataPt, $pos); + my @a = unpack('NCCNCNCN', $buff); + my @acc = ($a[3]*($a[2]?-1:1)/1e5, $a[5]*($a[4]?-1:1)/1e5, $a[7]*($a[6]?-1:1)/1e5); + $et->HandleTag($tagTbl, FrameNumber => $a[0]); + $et->HandleTag($tagTbl, Accelerometer => "@acc"); + unless ($ee) { + $et->Warn('Use ExtractEmbedded option to extract all accelerometer data', 3); + last; + } + } + delete $$et{SET_GROUP0}; + delete $$et{SET_GROUP1}; + $$et{DOC_NUM} = 0; + return 0; +} + +#------------------------------------------------------------------------------ +# Process BikeBro SLLT chunk (GPS information) (ref PH) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessSLLT($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataLen = length $$dataPt; + my $ee = $et->Options('ExtractEmbedded'); + my $pos; + # example GPS record: + # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + # 00 00 00 17 01 00 00 03 fa 21 ec 00 35 01 6e c0 06 00 08 00 62 10 0b 1b 07 e2 03 0e 57 4e + # frame------ ?? lonDD lonDDDDDDDD latDD latDDDDDDDD alt-- spd-- hr mn sc yr--- mn dy EW NS + $$et{SET_GROUP0} = $$et{SET_GROUP1} = 'RIFF'; + for ($pos=0; $pos<=$dataLen-30; $pos+=30) { + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + my $buff = substr($$dataPt, $pos); + my @a = unpack('NCnNnNnnCCCnCCaa', $buff); + # - is $a[1] perhaps GPSStatus? (only seen 1, or perhaps record type 1=GPS, 2=acc?) + my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ', @a[11..13, 8..10]); + $et->HandleTag($tagTbl, FrameNumber => $a[0]); + $et->HandleTag($tagTbl, GPSDateTime => $time); + $et->HandleTag($tagTbl, GPSLatitude => ($a[4] + $a[5]/1e8) * ($a[15] eq 'S' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSLongitude => ($a[2] + $a[3]/1e8) * ($a[14] eq 'W' ? -1 : 1)); + $et->HandleTag($tagTbl, GPSAltitude => $a[6]); + $et->HandleTag($tagTbl, GPSSpeed => $a[7]); + $et->HandleTag($tagTbl, GPSSpeedRef => 'K'); + unless ($ee) { + $et->Warn('Use ExtractEmbedded option to extract timed GPS', 3); + last; + } + } + delete $$et{SET_GROUP0}; + delete $$et{SET_GROUP1}; + $$et{DOC_NUM} = 0; + return 1; +} + +#------------------------------------------------------------------------------ +# Process Lucas streaming GPS information (Lucas LK-7900 Ace) (ref PH) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessLucas($$$) +{ + my ($et, $dirInfo, $tagTbl) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataLen = length $$dataPt; + + unless ($et->Options('ExtractEmbedded')) { + $et->Warn('Use ExtractEmbedded option to extract timed GPS', 3); + return 1; + } + my %recLen = ( # record lengths (not including 4-byte ID) + '0GDA' => 24, + '0GPS' => 48, + ); + my ($date,$time,$lat,$lon,$alt,$spd,$sat,$dop,$ew,$ns); + $$et{SET_GROUP0} = $$et{SET_GROUP1} = 'RIFF'; + while ($$dataPt =~ /(0GDA|0GPS)/g) { + my ($rec, $pos) = ($1, pos $$dataPt); + $pos + $recLen{$rec} > $dataLen and $et->Warn("Truncated $1 record"), last; + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + # records start with int64u sample date/time in ms since 1970 + $et->HandleTag($tagTbl, SampleDateTime => Get64u($dataPt, $pos) / 1000); + if ($rec eq '0GPS') { + my $len = Get32u($dataPt, $pos+8); + my $endPos = $pos + $recLen{$rec} + $len; + $endPos > $dataLen and $et->Warn('Truncated 0GPS record'), last; + my $buff = substr($$dataPt, $pos+$recLen{$rec}, $len); + while ($buff =~ /\$(GC|GA),(\d+),/g) { + my $p = pos $buff; + $time = $2; + if ($1 eq 'GC') { + # time date dist ? sat dop alt A + # $GC,052350,180914,0000955,1,08,1.1,0017,,A*45\x0d\x0a\0 + if ($buff =~ /\G(\d+),\d*,\d*,(\d+),([-\d.]+),(\d+),\d*,A/g) { + ($date,$sat,$dop,$alt) = ($1,$2,$3,$4); + } + } else { + # time A lat lon spd N W + # $GA,052351,A,0949.6626,07635.4439,049,N,E,*4C\x0d\x0a\0 + if ($buff =~ /\GA,([\d.]+),([\d.]+),(\d+),([NS]),([EW])/g) { + ($lat,$lon,$spd,$ns,$ew) = ($1,$2,$3,$4,$5,$6); + # lat/long are in DDDMM.MMMM format + my $deg = int($lat / 100); + $lat = $deg + ($lat - $deg * 100) / 60; + $deg = int($lon / 100); + $lon = $deg + ($lon - $deg * 100) / 60; + $lat *= -1 if $ns eq 'S'; + $lon *= -1 if $ew eq 'W'; + } + } + # look ahead to next NMEA-like sentence, and store the fix + # now only if the next sentence is not at the same time + if ($buff !~ /\$(GC|GA),$time,/g) { + pos($$dataPt) = $endPos; + if ($$dataPt !~ /\$(GC|GA),(\d+)/ or $1 ne $time) { + $time =~ s/(\d{2})(\d{2})(\d{2})/$1:$2:$3Z/; + if ($date) { + $date =~ s/(\d{2})(\d{2})(\d{2})/20$3:$2:$1/; + $et->HandleTag($tagTbl, GPSDateTime => "$date $time"); + } else { + $et->HandleTag($tagTbl, GPSTimeStamp => $time); + } + if (defined $lat) { + $et->HandleTag($tagTbl, GPSLatitude => $lat); + $et->HandleTag($tagTbl, GPSLongitude => $lon); + $et->HandleTag($tagTbl, GPSSpeed => $spd); + } + if (defined $alt) { + $et->HandleTag($tagTbl, GPSAltitude => $alt); + $et->HandleTag($tagTbl, GPSSatellites => $sat); + $et->HandleTag($tagTbl, GPSDOP => $dop); + } + undef $lat; + undef $alt; + } + } + pos($buff) = $p; + } + $pos += $len; + } else { # this is an accelerometer (0GDA) record + # record has 4 more int32s values (the last is always 57 or 58 -- + # maybe related to sample time in ms? -- not extracted) + my @acc = unpack('x'.($pos+8).'V3', $$dataPt); + # change to signed integer and divide by 256 + map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 256 } @acc; + $et->HandleTag($tagTbl, Accelerometer => "@acc"); + } + pos($$dataPt) = $pos + $recLen{$rec}; + } + delete $$et{SET_GROUP0}; + delete $$et{SET_GROUP1}; + $$et{DOC_NUM} = 0; + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from a RIFF file +# Inputs: 0) ExifTool object reference, 1) DirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid RIFF file +sub ProcessRIFF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $buf2, $type, $mime, $err, $rf64); + my $verbose = $et->Options('Verbose'); + my $unknown = $et->Options('Unknown'); + my $ee = $et->Options('ExtractEmbedded'); + + # verify this is a valid RIFF file + return 0 unless $raf->Read($buff, 12) == 12; + if ($buff =~ /^(RIFF|RF64)....(.{4})/s) { + $type = $riffType{$2}; + $rf64 = 1 if $1 eq 'RF64'; + } else { + # minimal support for a few obscure lossless audio formats... + return 0 unless $buff =~ /^(LA0[234]|OFR |LPAC|wvpk)/ and $raf->Read($buf2, 1024); + $type = $riffType{$1}; + $buff .= $buf2; + return 0 unless $buff =~ /WAVE(.{4})?fmt /sg and $raf->Seek(pos($buff) - 4, 0); + } + $$raf{NoBuffer} = 1 if $et->Options('FastScan'); # disable buffering in FastScan mode + $mime = $riffMimeType{$type} if $type; + $et->SetFileType($type, $mime); + $$et{VALUE}{FileType} .= ' (RF64)' if $rf64; + $$et{RIFFStreamType} = ''; # initialize stream type + $$et{RIFFStreamCodec} = []; # initialize codec array + SetByteOrder('II'); + my $tagTbl = GetTagTable('Image::ExifTool::RIFF::Main'); + my $pos = 12; +# +# Read chunks in RIFF image +# + for (;;) { + my $num = $raf->Read($buff, 8); + if ($num < 8) { + $err = 1 if $num; + last; + } + $pos += 8; + my ($tag, $len) = unpack('a4V', $buff); + # special case: construct new tag name from specific LIST type + if ($tag eq 'LIST') { + $raf->Read($buff, 4) == 4 or $err=1, last; + $pos += 4; + $tag .= "_$buff"; + $len -= 4; # already read 4 bytes (the LIST type) + } elsif ($tag eq 'data' and $len == 0xffffffff and $$et{DataSize64}) { + $len = $$et{DataSize64}; + } + $et->VPrint(0, "RIFF '${tag}' chunk ($len bytes of data):\n"); + if ($len <= 0) { + if ($len < 0) { + $et->Warn('Invalid chunk length'); + } elsif ($tag eq "\0\0\0\0") { + # avoid reading through corupted files filled with nulls because it takes forever + $et->Warn('Encountered empty null chunk. Processing aborted'); + } else { + next; + } + last; + } + # stop when we hit the audio data or AVI index or AVI movie data + # --> no more because Adobe Bridge stores XMP after this!! + # (so now we only do this on the FastScan option) + if ($et->Options('FastScan') and ($tag eq 'data' or $tag eq 'idx1' or + ($tag eq 'LIST_movi' and not $ee))) + { + $et->VPrint(0, "(end of parsing)\n"); + last; + } + # RIFF chunks are padded to an even number of bytes + my $len2 = $len + ($len & 0x01); + # change name of stream txts data depending on the Codec + if ($ee and $tag =~ /^(\d{2})tx$/) { + $tag = 'tx_' . ($$et{RIFFStreamCodec}[$1] || 'Unknown'); + $tag = "tx_Unknown" unless defined $$tagTbl{$tag}; + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; + } + my $tagInfo = $$tagTbl{$tag}; + if ($tagInfo or (($verbose or $unknown) and $tag !~ /^(data|idx1|LIST_movi|RIFF|\d{2}(db|dc|wb))$/)) { + $raf->Read($buff, $len2) == $len2 or $err=1, last; + my $setGroups; + if ($tagInfo and ref $tagInfo eq 'HASH' and $$tagInfo{SetGroups}) { + $setGroups = $$et{SET_GROUP0} = $$et{SET_GROUP1} = $$tagInfo{SetGroups}; + } + MakeTagInfo($tagTbl, $tag) if not $tagInfo and ($verbose or $unknown); + $et->HandleTag($tagTbl, $tag, $buff, + DataPt => \$buff, + DataPos => 0, # (relative to Base) + Start => 0, + Size => $len2, + Base => $pos, + ); + if ($setGroups) { + delete $$et{SET_GROUP0}; + delete $$et{SET_GROUP1}; + } + delete $$et{DOC_NUM} if $ee; + } elsif ($tag eq 'RIFF') { + # don't read into RIFF chunk (eg. concatenated video file) + $raf->Read($buff, 4) == 4 or $err=1, last; + # extract information from remaining file as an embedded file + $$et{DOC_NUM} = ++$$et{DOC_COUNT} + } elsif ($tag eq 'LIST_movi' and $ee) { + next; # parse into movi chunk + } else { + if ($len > 0x7fffffff and not $et->Options('LargeFileSupport')) { + $et->Warn("Stopped parsing at large $tag chunk (LargeFileSupport not set)"); + last; + } + $raf->Seek($len2, 1) or $err=1, last; + } + $pos += $len2; + } + delete $$et{DOC_NUM}; + $err and $et->Warn('Error reading RIFF file (corrupted?)'); + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::RIFF - Read RIFF/AVI/WAV meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to extract +information from RIFF-based (Resource Interchange File Format) files, +including AVI videos, WAV audio files and WEBP images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.exif.org/Exif2-2.PDF> + +=item L<http://www.vlsi.fi/datasheets/vs1011.pdf> + +=item L<http://www.music-center.com.br/spec_rif.htm> + +=item L<http://www.codeproject.com/audio/wavefiles.asp> + +=item L<http://msdn.microsoft.com/archive/en-us/directx9_c/directx/htm/avirifffilereference.asp> + +=item L<http://wiki.multimedia.cx/index.php?title=TwoCC> + +=item L<https://developers.google.com/speed/webp/docs/riff_container> + +=item L<https://tech.ebu.ch/docs/tech/tech3306-2009.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/RIFF Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/RSRC.pm b/lib/Image/ExifTool/RSRC.pm new file mode 100644 index 0000000..26e75ab --- /dev/null +++ b/lib/Image/ExifTool/RSRC.pm @@ -0,0 +1,247 @@ +#------------------------------------------------------------------------------ +# File: RSRC.pm +# +# Description: Read Mac OS Resource information +# +# Revisions: 2010/03/17 - P. Harvey Created +# +# References: 1) http://developer.apple.com/legacy/mac/library/documentation/mac/MoreToolbox/MoreToolbox-99.html +#------------------------------------------------------------------------------ + +package Image::ExifTool::RSRC; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.09'; + +sub ProcessRSRC($$); + +# Information decoded from Mac OS resources +%Image::ExifTool::RSRC::Main = ( + GROUPS => { 2 => 'Document' }, + PROCESS_PROC => \&ProcessRSRC, + NOTES => q{ + Tags extracted from Mac OS resource files, DFONT files and "._" sidecar + files. These tags may also be extracted from the resource fork of any file + in OS X, either by adding "/..namedfork/rsrc" to the filename to process the + resource fork alone, or by using the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> (-ee) option to process + the resource fork as a sub-document of the main file. When writing, + ExifTool preserves the Mac OS resource fork by default, but it may deleted + with C<-rsrc:all=> on the command line. + }, + '8BIM' => { + Name => 'PhotoshopInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Main' }, + }, + 'sfnt' => { + Name => 'Font', + SubDirectory => { TagTable => 'Image::ExifTool::Font::Name' }, + }, + # my samples of postscript-type DFONT files have a POST resource + # with ID 0x1f5 and the same format as a PostScript file + 'POST_0x01f5' => { + Name => 'PostscriptFont', + SubDirectory => { TagTable => 'Image::ExifTool::PostScript::Main' }, + }, + 'usro_0x0000' => 'OpenWithApplication', + 'vers_0x0001' => 'ApplicationVersion', + 'STR _0xbff3' => 'ApplicationMissingMsg', + 'STR _0xbff4' => 'CreatorApplication', + # the following written by Photoshop + # (ref http://www.adobe.ca/devnet/photoshop/psir/ps_image_resources.pdf) + 'STR#_0x0080' => 'Keywords', + 'TEXT_0x0080' => 'Description', + # don't extract PICT's because the clip region isn't set properly + # in the PICT resource for some reason. Also, a dummy 512-byte + # header would have to be added to create a valid PICT file. + # 'PICT' => { Name => 'PreviewPICT', Binary => 1 }, +); + +#------------------------------------------------------------------------------ +# Read information from a Mac resource file (ref 1) +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid resource file +sub ProcessRSRC($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($hdr, $map, $buff, $i, $j); + + # allow access with data reference + $raf or $raf = new File::RandomAccess($$dirInfo{DataPt}); + + # attempt to validate the format as thoroughly as practical + return 0 unless $raf->Read($hdr, 30) == 30; + my ($datOff, $mapOff, $datLen, $mapLen) = unpack('N*', $hdr); + return 0 unless $raf->Seek(0, 2); + my $fLen = $raf->Tell(); + return 0 if $datOff < 0x10 or $datOff + $datLen > $fLen; + return 0 if $mapOff < 0x10 or $mapOff + $mapLen > $fLen or $mapLen < 30; + return 0 if $datOff < $mapOff and $datOff + $datLen > $mapOff; + return 0 if $mapOff < $datOff and $mapOff + $mapLen > $datOff; + + # read the resource map + $raf->Seek($mapOff, 0) and $raf->Read($map, $mapLen) == $mapLen or return 0; + SetByteOrder('MM'); + my $typeOff = Get16u(\$map, 24); + my $nameOff = Get16u(\$map, 26); + my $numTypes = (Get16u(\$map, 28) + 1) & 0xffff; + + # validate offsets in the resource map + return 0 if $typeOff < 28 or $nameOff < 30; + + $et->SetFileType('RSRC') unless $$et{IN_RESOURCE}; + my $verbose = $et->Options('Verbose'); + my $tagTablePtr = GetTagTable('Image::ExifTool::RSRC::Main'); + $et->VerboseDir('RSRC', $numTypes); + + # parse resource type list + for ($i=0; $i<$numTypes; ++$i) { + my $off = $typeOff + 2 + 8 * $i; # offset of entry in type list + last if $off + 8 > $mapLen; + my $resType = substr($map,$off,4); # resource type + my $resNum = Get16u(\$map,$off+4); # number of resources - 1 + my $refOff = Get16u(\$map,$off+6) + $typeOff; # offset to first resource reference + # loop through all resources + for ($j=0; $j<=$resNum; ++$j) { + my $roff = $refOff + 12 * $j; + last if $roff + 12 > $mapLen; + # read only the 24-bit resource data offset + my $id = Get16u(\$map,$roff); + my $resOff = (Get32u(\$map,$roff+4) & 0x00ffffff) + $datOff; + my $resNameOff = Get16u(\$map,$roff+2) + $nameOff + $mapOff; + my ($tag, $val, $valLen); + my $tagInfo = $$tagTablePtr{$resType}; + if ($tagInfo) { + $tag = $resType; + } else { + $tag = sprintf('%s_0x%.4x', $resType, $id); + $tagInfo = $$tagTablePtr{$tag}; + } + # read the resource data if necessary + if ($tagInfo or $verbose) { + unless ($raf->Seek($resOff, 0) and $raf->Read($buff, 4) == 4 and + ($valLen = unpack('N', $buff)) < 100000000 and # arbitrary size limit (100MB) + $raf->Read($val, $valLen) == $valLen) + { + $et->Warn("Error reading $resType resource"); + next; + } + } + if ($verbose) { + my ($resName, $nameLen); + $resName = '' unless $raf->Seek($resNameOff, 0) and $raf->Read($buff, 1) and + ($nameLen = ord $buff) != 0 and $raf->Read($resName, $nameLen) == $nameLen; + $et->VPrint(0,sprintf("%s resource ID 0x%.4x (offset 0x%.4x, $valLen bytes, name='%s'):\n", + $resType, $id, $resOff, $resName)); + $et->VerboseDump(\$val); + } + next unless $tagInfo; + if ($resType eq 'vers') { + # parse the 'vers' resource to get the long version string + next unless $valLen > 8; + # long version string is after short version + my $p = 7 + Get8u(\$val, 6); + next if $p >= $valLen; + my $vlen = Get8u(\$val, $p++); + next if $p + $vlen > $valLen; + my $tagTablePtr = GetTagTable('Image::ExifTool::RSRC::Main'); + $val = $et->Decode(substr($val, $p, $vlen), 'MacRoman'); + } elsif ($resType eq 'sfnt') { + # parse the OTF font block + $raf->Seek($resOff + 4, 0) or next; + $$dirInfo{Base} = $resOff + 4; + require Image::ExifTool::Font; + unless (Image::ExifTool::Font::ProcessOTF($et, $dirInfo)) { + $et->Warn('Unrecognized sfnt resource format'); + } + # assume this is a DFONT file unless processing the rsrc fork + $et->OverrideFileType('DFONT') unless $$et{DOC_NUM}; + next; + } elsif ($resType eq '8BIM') { + my $ttPtr = GetTagTable('Image::ExifTool::Photoshop::Main'); + $et->HandleTag($ttPtr, $id, $val, + DataPt => \$val, + DataPos => $resOff + 4, + Size => $valLen, + Start => 0, + Parent => 'RSRC', + ); + next; + } elsif ($resType eq 'STR ' and $valLen > 1) { + # extract Pascal string + my $len = ord $val; + next unless $valLen >= $len + 1; + $val = substr($val, 1, $len); + } elsif ($resType eq 'usro' and $valLen > 4) { + my $len = unpack('N', $val); + next unless $valLen >= $len + 4; + ($val = substr($val, 4, $len)) =~ s/\0.*//g; # truncate at null + } elsif ($resType eq 'STR#' and $valLen > 2) { + # extract list of strings (ref http://simtech.sourceforge.net/tech/strings.html) + my $num = unpack('n', $val); + next if $num & 0xf000; # (ignore special-format STR# resources) + my ($i, @vals); + my $pos = 2; + for ($i=0; $i<$num; ++$i) { + last if $pos >= $valLen; + my $len = ord substr($val, $pos++, 1); + last if $pos + $len > $valLen; + push @vals, substr($val, $pos, $len); + $pos += $len; + } + $val = \@vals; + } elsif ($resType eq 'POST') { + # assume this is a DFONT file unless processing the rsrc fork + $et->OverrideFileType('DFONT') unless $$et{DOC_NUM}; + $val = substr $val, 2; + } elsif ($resType ne 'TEXT') { + next; + } + $et->HandleTag($tagTablePtr, $tag, $val); + } + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::RSRC - Read Mac OS Resource information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to read Mac OS +resource files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://developer.apple.com/legacy/mac/library/documentation/mac/MoreToolbox/MoreToolbox-99.html> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/RSRC Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/RTF.pm b/lib/Image/ExifTool/RTF.pm new file mode 100644 index 0000000..1b33e3a --- /dev/null +++ b/lib/Image/ExifTool/RTF.pm @@ -0,0 +1,390 @@ +#------------------------------------------------------------------------------ +# File: RTF.pm +# +# Description: Read Rich Text Format meta information +# +# Revisions: 2010/06/17 - P. Harvey Created +# +# References: 1) http://download.microsoft.com/download/2/f/5/2f599e18-07ee-4ec5-a1e7-f4e6a9423592/Word2007RTFSpec9.doc +# 2) http://search.cpan.org/dist/RTF-Writer/lib/RTF/Cookbook.pod +#------------------------------------------------------------------------------ + +package Image::ExifTool::RTF; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.04'; + +sub ProcessUserProps($$$); + +# supported RTF character entities +my %rtfEntity = ( + par => 0x0a, + tab => 0x09, + endash => 0x2013, + emdash => 0x2014, + lquote => 0x2018, + rquote => 0x2019, + ldblquote => 0x201c, + rdblquote => 0x201d, + bullet => 0x2022, +); + +# RTF tags (ref 1) +%Image::ExifTool::RTF::Main = ( + GROUPS => { 2 => 'Document' }, + NOTES => q{ + This table lists standard tags of the RTF information group, but ExifTool + will also extract any non-standard tags found in this group. As well, + ExifTool will extract any custom properties that are found. See + L<http://www.microsoft.com/en-ca/download/details.aspx?id=10725> for the + specification. + }, + title => { }, + subject => { }, + author => { Groups => { 2 => 'Author' } }, + manager => { }, + company => { }, + copyright=> { Groups => { 2 => 'Author' } }, # (written by Apple TextEdit) + operator => { Name => 'LastModifiedBy' }, + category => { }, + keywords => { }, + comment => { }, + doccomm => { Name => 'Comments' }, + hlinkbase=> { Name => 'HyperlinkBase' }, + creatim => { + Name => 'CreateDate', + Format => 'date', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + revtim => { + Name => 'ModifyDate', + Format => 'date', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + printim => { + Name => 'LastPrinted', + Format => 'date', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + buptim => { + Name => 'BackupTime', + Format => 'date', + Groups => { 2 => 'Time' }, + PrintConv => '$self->ConvertDateTime($val)', + }, + edmins => { + Name => 'TotalEditTime', # in minutes + PrintConv => 'ConvertTimeSpan($val, 60)', + }, + nofpages => { Name => 'Pages' }, + nofwords => { Name => 'Words' }, + nofchars => { Name => 'Characters' }, + nofcharsws=>{ + Name => 'CharactersWithSpaces', + Notes => q{ + according to the 2007 Microsoft RTF specification this is clearly the number + of characters NOT including spaces, but Microsoft Word writes this as the + number WITH spaces, so ExifTool names this tag according to the de facto + standard + }, + }, + id => { Name => 'InternalIDNumber' }, + version => { Name => 'RevisionNumber' }, + vern => { Name => 'InternalVersionNumber' }, +); + +# lookup for user-defined properties +# (none are pre-defined and this table doesn't appear in the docs) +%Image::ExifTool::RTF::UserProps = ( + GROUPS => { 2 => 'Document' }, +); + +#------------------------------------------------------------------------------ +# Read to nested closing curly bracket "}" +# Inputs: 0) data ref, 1) optional RAF ref to read more data if available +# Returns: text inside brackets, or undef on error +# Notes: On entry the current position in the data must be set to immediately +# after the command that opens the bracket. On return the current +# position is immediately following the closing brace if the return +# value is defined. +sub ReadToNested($;$) +{ + my ($dataPt, $raf) = @_; + my $pos = pos $$dataPt; + my $level = 1; + for (;;) { + # look for the next bracket + unless ($$dataPt =~ /(\\*)([{}])/g) { + # must read some more data + my $p = length $$dataPt; + my $buff; + last unless $raf and $raf->Read($buff, 65536); + $$dataPt .= $buff; + # rewind position to include any leading backslashes + --$p while $p and substr($$dataPt, $p - 1, 1) eq '\\'; + pos($$dataPt) = $p; # set position to continue search + next; + } + # bracket is escaped if preceded by an odd number of backslashes + next if $1 and length($1) & 0x01; + $2 eq '{' and ++$level, next; + next unless --$level <= 0; + return substr($$dataPt, $pos, pos($$dataPt) - $pos - 1); + } + return undef; +} + +#------------------------------------------------------------------------------ +# Unescape RTF escape sequences +# Inputs: 0) ExifTool ref, 1) RTF text, 2) RTF character set (for hex characters) +# Returns: Unescaped text (in current ExifTool Charset) +sub UnescapeRTF($$$) +{ + my ($et, $val, $charset) = @_; + + # return now unless we have a control sequence + unless ($val =~ /\\/) { + $val =~ tr/\n\r//d; # ignore CR's and LF's + return $val; + } + # CR/LF is significant if it terminates a control sequence (so change these to a space) + # (was $val =~ s/(^|[^\\])((?:\\\\)*)(\\[a-zA-Z]+(?:-?\d+)?)[\n\r]/$1$2$3 /g;) + $val =~ s/\\(?:([a-zA-Z]+(?:-?\d+)?)[\n\r]|(.))/'\\'.($1 ? "$1 " : $2)/sge; + # protect the newline control sequence by converting to a \par command + # (was $val =~ s/(^|[^\\])((?:\\\\)*)(\\[\n\r])/$1$2\\par /g;) + $val =~ s/(\\[\n\r])|(\\.)/$2 || '\\par '/sge; + # all other CR/LF's are ignored (so delete them) + $val =~ tr/\n\r//d; + + my $rtnVal = ''; + my $len = length $val; + my $skip = 1; # default Unicode skip count + my $p0 = 0; + + for (;;) { + # find next backslash + my $p1 = ($val =~ /\\/g) ? pos($val) : $len + 1; + # add text up to start of this control sequence (or up to end) + my $n = $p1 - $p0 - 1; + $rtnVal .= substr($val, $p0, $n) if $n > 0; + # all done if at the end or if control sequence is empty + last if $p1 >= $len; + # look for an ASCII-letter control word or Unicode control + if ($val =~ /\G([a-zA-Z]+)(-?\d+)? ?/g) { + # interpret command if recognized + if ($1 eq 'uc') { # \ucN + $skip = $2; + } elsif ($1 eq 'u') { # \uN + if ($2 < 0) { + $et->WarnOnce('Invalid Unicode character(s) in text'); + $rtnVal .= '?'; + } else { + require Image::ExifTool::Charset; + $rtnVal .= Image::ExifTool::Charset::Recompose($et, [$2]); + if ($skip) { + # must skip the specified number of characters + # (not simple because RTF control words count as a single character) + last unless $val =~ /\G([^\\]|\\([a-zA-Z]+)(-?\d+)? ?|\\'.{2}|\\.){$skip}/g; + } + } + } elsif ($rtfEntity{$1}) { + require Image::ExifTool::Charset; + $rtnVal .= Image::ExifTool::Charset::Recompose($et, [$rtfEntity{$1}]); + } # (else ignore the command) + } else { + my $ch = substr($val, $p1, 1); + if ($ch eq "'") { + # hex character code + last if $p1 + 3 > $len; + my $hex = substr($val, $p1 + 1, 2); + if ($hex =~ /^[0-9a-fA-F]{2}$/) { + require Image::ExifTool::Charset; + $rtnVal .= $et->Decode(chr(hex($hex)), $charset); + } + pos($val) = $p1 + 3; # skip to after the hex code + } else { + # assume a standard control symbol (\, {, }, etc) + # (note, this may not be valid for some uncommon + # control symbols like \~ for non-breaking space) + $rtnVal .= $ch; + pos($val) = $p1 + 1; # skip to after this character + } + } + $p0 = pos($val); + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Read information in a RTF document +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid RTF file +sub ProcessRTF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $buf2, $cs); + + return 0 unless $raf->Read($buff, 64) and $raf->Seek(0,0); + return 0 unless $buff =~ /^[\n\r]*\{[\n\r]*\\rtf[^a-zA-Z]/; + $et->SetFileType(); +# +# determine the RTF character set +# + if ($buff=~ /\\ansicpg(\d*)/) { + $cs = "cp$1"; + } elsif ($buff=~ /\\(ansi|mac|pc|pca)[^a-zA-Z]/) { + my %trans = ( + ansi => 'Latin', + mac => 'MacRoman', + pc => 'cp437', + pca => 'cp850', + ); + $cs = $trans{$1}; + } else { + $et->Warn('Unspecified RTF encoding. Will assume Latin'); + $cs = 'Latin'; + } + my $charset = $Image::ExifTool::charsetName{lc $cs}; + unless ($charset) { + $et->Warn("Unsupported RTF encoding $cs. Will assume Latin."); + $charset = 'Latin'; + } + my $tagTablePtr = GetTagTable('Image::ExifTool::RTF::Main'); + undef $buff; +# +# scan for \info group +# + for (;;) { + $raf->Read($buf2, 65536) or last; + if (defined $buff) { + # read more but leave some overlap for the match + $buff = substr($buff, -16) . $buf2; + } else { + $buff = $buf2; + } + next unless $buff =~ /[^\\]\{[\n\r]*\\info([^a-zA-Z])/g; + # anything but a space is included in the contents + pos($buff) = pos($buff) - 1 if $1 ne ' '; + my $info = ReadToNested(\$buff, $raf); + unless (defined $info) { + $et->Warn('Unterminated information group'); + last; + } + # process info commands (eg. "\author", "\*\copyright"); + while ($info =~ /\{[\n\r]*(\\\*[\n\r]*)?\\([a-zA-Z]+)([^a-zA-Z])/g) { + pos($info) = pos($info) - 1 if $3 ne ' '; + my $tag = $2; + my $val = ReadToNested(\$info); + last unless defined $val; + my $tagInfo = $$tagTablePtr{$tag}; + if ($tagInfo and $$tagInfo{Format} and $$tagInfo{Format} eq 'date') { + # parse RTF date commands + my %idx = (yr=>0,mo=>1,dy=>2,hr=>3,min=>4,sec=>5); + my @t = (0) x 6; + while ($val =~ /\\([a-z]+)(\d+)/g) { + next unless defined $idx{$1}; + $t[$idx{$1}] = $2; + } + $val = sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d", @t); + } else { + # unescape RTF string value + $val = UnescapeRTF($et, $val, $charset); + } + # create tagInfo for unknown tags + if (not $tagInfo) { + AddTagToTable($tagTablePtr, $tag, { Name => ucfirst($tag) }); + } + $et->HandleTag($tagTablePtr, $tag, $val); + } + } + return 1 unless defined $buff; +# +# scan for \userprops (but don't read more from file to find the start of this command) +# + pos($buff) = 0; + while ($buff =~ /[^\\]\{[\n\r]*\\\*[\n\r]*\\userprops([^a-zA-Z])/g) { + # Note: The RTF spec places brackets around each propinfo structure, + # but Microsoft Word doesn't write it this way, so tolerate either. + pos($buff) = pos($buff) - 1 if $1 ne ' '; + my $props = ReadToNested(\$buff, $raf); + $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::RTF::UserProps'); + unless (defined $props) { + $et->Warn('Unterminated user properties'); + last; + } + # process user properties + my $tag; + while ($props =~ /\{[\n\r]*(\\\*[\n\r]*)?\\([a-zA-Z]+)([^a-zA-Z])/g) { + pos($props) = pos($props) - 1 if $3 ne ' '; + my $t = $2; + my $val = ReadToNested(\$props); + last unless defined $val; + $val = UnescapeRTF($et, $val, $charset); + if ($t eq 'propname') { + $tag = $val; + next; + } elsif ($t ne 'staticval' or not defined $tag) { + next; # ignore \linkval and \proptype for now + } + $tag =~ s/\s(.)/\U$1/g; # capitalize all words in tag name + $tag =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters + next unless $tag; + # create tagInfo for unknown tags + unless ($$tagTablePtr{$tag}) { + AddTagToTable($tagTablePtr, $tag, { Name => $tag }); + } + $et->HandleTag($tagTablePtr, $tag, $val); + } + last; # (didn't really want to loop) + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::RTF - Read Rich Text Format meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read meta +information from RTF (Rich Text Format) documents. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://download.microsoft.com/download/2/f/5/2f599e18-07ee-4ec5-a1e7-f4e6a9423592/Word2007RTFSpec9.doc> + +=item L<http://search.cpan.org/dist/RTF-Writer/lib/RTF/Cookbook.pod> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/RTF Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Radiance.pm b/lib/Image/ExifTool/Radiance.pm new file mode 100644 index 0000000..5d315ab --- /dev/null +++ b/lib/Image/ExifTool/Radiance.pm @@ -0,0 +1,149 @@ +#------------------------------------------------------------------------------ +# File: Radiance.pm +# +# Description: Read Radiance RGBE HDR meta information +# +# Revisions: 2011/12/10 - P. Harvey Created +# +# References: 1) http://www.graphics.cornell.edu/online/formats/rgbe/ +# 2) http://radsite.lbl.gov/radiance/refer/filefmts.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::Radiance; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.02'; + +# Radiance tags +%Image::ExifTool::Radiance::Main = ( + GROUPS => { 2 => 'Image' }, + NOTES => q{ + Information extracted from Radiance RGBE HDR images. Tag ID's are all + uppercase as stored in the file, but converted to lowercase by when + extracting to avoid conflicts with internal ExifTool variables. See + L<http://radsite.lbl.gov/radiance/refer/filefmts.pdf> and + L<http://www.graphics.cornell.edu/online/formats/rgbe/> for the + specification. + }, + _orient => { + Name => 'Orientation', + PrintConv => { + '-Y +X' => 'Horizontal (normal)', + '-Y -X' => 'Mirror horizontal', + '+Y -X' => 'Rotate 180', + '+Y +X' => 'Mirror vertical', + '+X -Y' => 'Mirror horizontal and rotate 270 CW', + '+X +Y' => 'Rotate 90 CW', + '-X +Y' => 'Mirror horizontal and rotate 90 CW', + '-X -Y' => 'Rotate 270 CW', + }, + }, + _command => 'Command', + _comment => 'Comment', + software => 'Software', + view => 'View', + 'format' => 'Format', # <-- this is the one that caused the conflict when uppercase + exposure => { + Name => 'Exposure', + Notes => 'divide pixel values by this to get watts/steradian/meter^2', + }, + gamma => 'Gamma', + colorcorr => 'ColorCorrection', + pixaspect => 'PixelAspectRatio', + primaries => 'ColorPrimaries', +); + +#------------------------------------------------------------------------------ +# Extract information from a Radiance HDR file +# Inputs: 0) ExifTool object reference, 1) DirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid RGBE image +sub ProcessHDR($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + local $/ = "\x0a"; # set newline character for reading + + # verify this is a valid RIFF file + return 0 unless $raf->ReadLine($buff) and $buff =~ /^#\?(RADIANCE|RGBE)\x0a/s; + $et->SetFileType(); + my $tagTablePtr = GetTagTable('Image::ExifTool::Radiance::Main'); + + while ($raf->ReadLine($buff)) { + chomp $buff; + last unless length($buff) > 0 and length($buff) < 4096; + if ($buff =~ s/^#\s*//) { + $et->HandleTag($tagTablePtr, '_comment', $buff) if length $buff; + next; + } + unless ($buff =~ /^(.*)?\s*=\s*(.*)/) { + $et->HandleTag($tagTablePtr, '_command', $buff) if length $buff; + next; + } + # use lower-case tag names to avoid conflicts with reserved tag table entries + my ($tag, $val) = (lc $1, $2); + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + unless ($tagInfo) { + my $name = $tag; + $name =~ tr/-_a-zA-Z0-9//dc; + next unless length($name) > 1; + $name = ucfirst $name; + $tagInfo = { Name => $name }; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + $et->FoundTag($tagInfo, $val); + } + # get image dimensions + if ($raf->ReadLine($buff) and $buff =~ /([-+][XY])\s*(\d+)\s*([-+][XY])\s*(\d+)/) { + $et->HandleTag($tagTablePtr, '_orient', "$1 $3"); + $et->FoundTag('ImageHeight', $2); + $et->FoundTag('ImageWidth', $4); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Radiance - Read Radiance RGBE HDR meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from Radiance RGBE images. RGBE (Red Green Blue Exponent) +images are a type of high dynamic-range image. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://radsite.lbl.gov/radiance/refer/filefmts.pdf> + +=item L<http://www.graphics.cornell.edu/online/formats/rgbe/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Radiance Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Rawzor.pm b/lib/Image/ExifTool/Rawzor.pm new file mode 100644 index 0000000..c9e6110 --- /dev/null +++ b/lib/Image/ExifTool/Rawzor.pm @@ -0,0 +1,190 @@ +#------------------------------------------------------------------------------ +# File: Rawzor.pm +# +# Description: Read meta information from Rawzor compressed images +# +# Revisions: 09/09/2008 - P. Harvey Created +# +# References: 1) http://www.rawzor.com/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::Rawzor; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.05'; + +# currently support this version Rawzor images +my $implementedRawzorVersion = 199; # (up to version 1.99) + +# Rawzor-specific tags +%Image::ExifTool::Rawzor::Main = ( + GROUPS => { 2 => 'Other' }, + VARS => { NO_ID => 1 }, + NOTES => q{ + Rawzor files store compressed images of other formats. As well as the + information listed below, exiftool uncompresses and extracts the meta + information from the original image. + }, + OriginalFileType => { }, + OriginalFileSize => { + PrintConv => $Image::ExifTool::Extra{FileSize}->{PrintConv}, + }, + RawzorRequiredVersion => { + ValueConv => '$val / 100', + PrintConv => 'sprintf("%.2f", $val)', + }, + RawzorCreatorVersion => { + ValueConv => '$val / 100', + PrintConv => 'sprintf("%.2f", $val)', + }, + # compression factor is originalSize/compressedSize (and compression + # ratio is the inverse - ref "Data Compression" by David Salomon) + CompressionFactor => { PrintConv => 'sprintf("%.2f", $val)' }, +); + +#------------------------------------------------------------------------------ +# Extract information from a Rawzor file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid Rawzor file +sub ProcessRWZ($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $buf2); + + # read the Rawzor file header: + # 0 string - "rawzor" signature + # 6 int16u - Required SDK version + # 8 int16u - Creator SDK version + # 10 int64u - RWZ file size + # 18 int64u - original raw file size + # 26 undef[12] - reserved + # 38 int64u - metadata offset + $raf->Read($buff, 46) == 46 and $buff =~ /^rawzor/ or return 0; + + SetByteOrder('II'); + my $reqVers = Get16u(\$buff, 6); + my $creatorVers = Get16u(\$buff, 8); + my $rwzSize = Get64u(\$buff, 10); + my $origSize = Get64u(\$buff, 18); + my $tagTablePtr = GetTagTable('Image::ExifTool::Rawzor::Main'); + $et->HandleTag($tagTablePtr, RawzorRequiredVersion => $reqVers); + $et->HandleTag($tagTablePtr, RawzorCreatorVersion => $creatorVers); + $et->HandleTag($tagTablePtr, OriginalFileSize => $origSize); + $et->HandleTag($tagTablePtr, CompressionFactor => $origSize/$rwzSize) if $rwzSize; + # check version numbers + if ($reqVers > $implementedRawzorVersion) { + $et->Warn("Version $reqVers Rawzor images not yet supported"); + return 1; + } + my $metaOffset = Get64u(\$buff, 38); + if ($metaOffset > 0x7fffffff) { + $et->Warn('Bad metadata offset'); + return 1; + } + # check for the ability to uncompress the information + unless (eval { require IO::Uncompress::Bunzip2 }) { + $et->Warn('Install IO::Compress::Bzip2 to decode Rawzor bzip2 compression'); + return 1; + } + # read the metadata header: + # 0 int64u - metadata section 0 end (offset in original file) + # 8 int64u - metadata section 1 start + # 16 int64u - metadata section 1 end + # 24 int64u - metadata section 2 start + # 32 undef[4] - reserved + # 36 int32u - original metadata size + # 40 int32u - compressed metadata size + unless ($raf->Seek($metaOffset, 0) and $raf->Read($buff, 44) == 44) { + $et->Warn('Error reading metadata header'); + return 1; + } + my $metaSize = Get32u(\$buff, 36); + if ($metaSize) { + $$et{DontValidateImageData} = 1; + # validate the metadata header and read the compressed metadata + my $end0 = Get64u(\$buff, 0); + my $pos1 = Get64u(\$buff, 8); + my $end1 = Get64u(\$buff, 16); + my $pos2 = Get64u(\$buff, 24); + my $len = Get32u(\$buff, 40); + unless ($raf->Read($buff, $len) == $len and + $end0 + ($end1 - $pos1) + ($origSize - $pos2) == $metaSize and + $end0 <= $pos1 and $pos1 <= $end1 and $end1 <= $pos2) + { + $et->Warn('Error reading image metadata'); + return 1; + } + # uncompress the metadata + unless (IO::Uncompress::Bunzip2::bunzip2(\$buff, \$buf2) and + length($buf2) eq $metaSize) + { + $et->Warn('Error uncompressing image metadata'); + return 1; + } + # re-assemble the original file (sans image data) + undef $buff; # (can't hurt to free memory as soon as possible) + $buff = substr($buf2, 0, $end0) . ("\0" x ($pos1 - $end0)) . + substr($buf2, $end0, $end1 - $pos1) . ("\0" x ($pos2 - $end1)) . + substr($buf2, $end0 + $end1 - $pos1, $origSize - $pos2); + undef $buf2; + + # extract original information by calling ExtractInfo recursively + $et->ExtractInfo(\$buff, { ReEntry => 1 }); + undef $buff; + } + # set OriginalFileType from FileType of original file + # then change FileType and MIMEType to indicate a Rawzor image + my $origFileType = $$et{VALUE}{FileType}; + if ($origFileType) { + $et->HandleTag($tagTablePtr, OriginalFileType => $origFileType); + $et->OverrideFileType('RWZ'); + } else { + $et->HandleTag($tagTablePtr, OriginalFileType => 'Unknown'); + $et->SetFileType(); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Rawzor - Read meta information from Rawzor compressed images + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from Rawzor compressed images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.rawzor.com/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Rawzor Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Real.pm b/lib/Image/ExifTool/Real.pm new file mode 100644 index 0000000..203f6c1 --- /dev/null +++ b/lib/Image/ExifTool/Real.pm @@ -0,0 +1,739 @@ +#------------------------------------------------------------------------------ +# File: Real.pm +# +# Description: Read Real audio/video meta information +# +# Revisions: 05/16/2006 - P. Harvey Created +# +# References: 1) http://www.getid3.org/ +# 2) https://common.helixcommunity.org/nonav/2003/HCS_SDK_r5/htmfiles/rmff.htm +#------------------------------------------------------------------------------ + +package Image::ExifTool::Real; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Canon; + +$VERSION = '1.06'; + +sub ProcessRealMeta($$$); +sub ProcessRealProperties($$$); + +# Real property types (ref PH) +my %propertyType = ( + 0 => 'int32u', + 2 => 'string', +); + +# Real Metadata property types +my %metadataFormat = ( + 1 => 'string', # text + 2 => 'string', # text list + 3 => 'flag', # 1 or 4 byte integer + 4 => 'int32u', # 4-byte integer + 5 => 'undef', # binary data + 6 => 'string', # URL + 7 => 'string', # date + 8 => 'string', # file name + 9 => undef, # grouping + 10 => undef, # reference +); + +# Real Metadata property flag bit descriptions +my %metadataFlag = ( + 0 => 'Read Only', + 1 => 'Private', + 2 => 'Type Descriptor', +); + + +# tags used in RealMedia (RM, RV and RMVB) files +%Image::ExifTool::Real::Media = ( + GROUPS => { 2 => 'Video' }, + NOTES => q{ + These B<Tag ID>'s are Chunk ID's used in RealMedia and RealVideo (RM, RV and + RMVB) files. + }, + CONT => { SubDirectory => { TagTable => 'Image::ExifTool::Real::ContentDescr' } }, + MDPR => { SubDirectory => { TagTable => 'Image::ExifTool::Real::MediaProps' } }, + PROP => { SubDirectory => { TagTable => 'Image::ExifTool::Real::Properties' } }, + RJMD => { SubDirectory => { TagTable => 'Image::ExifTool::Real::Metadata' } }, +); + +# pseudo-tags used in RealAudio (RA) files +%Image::ExifTool::Real::Audio = ( + GROUPS => { 2 => 'Audio' }, + NOTES => q{ + Tags in the following table reference information extracted from various + versions of RealAudio (RA) files. + }, + '.ra3' => { Name => 'RA3', SubDirectory => { TagTable => 'Image::ExifTool::Real::AudioV3' } }, + '.ra4' => { Name => 'RA4', SubDirectory => { TagTable => 'Image::ExifTool::Real::AudioV4' } }, + '.ra5' => { Name => 'RA5', SubDirectory => { TagTable => 'Image::ExifTool::Real::AudioV5' } }, +); + +# pseudo-tags used in RealMedia Metafiles and RealMedia Plug-in Metafiles (RAM and RPM) +%Image::ExifTool::Real::Metafile = ( + GROUPS => { 2 => 'Video' }, + NOTES => q{ + Tags representing information extracted from Real Audio Metafile and + RealMedia Plug-in Metafile (RAM and RPM) files. + }, + txt => 'Text', + url => 'URL', +); + +%Image::ExifTool::Real::Properties = ( + GROUPS => { 1 => 'Real-PROP', 2 => 'Video' }, + PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData, + VARS => { ID_LABEL => 'Sequence' }, + FORMAT => 'int32u', + 0 => { Name => 'MaxBitrate', PrintConv => 'ConvertBitrate($val)' }, + 1 => { Name => 'AvgBitrate', PrintConv => 'ConvertBitrate($val)' }, + 2 => 'MaxPacketSize', + 3 => 'AvgPacketSize', + 4 => 'NumPackets', + 5 => { Name => 'Duration', ValueConv => '$val / 1000', PrintConv => 'ConvertDuration($val)' }, + 6 => { Name => 'Preroll', ValueConv => '$val / 1000', PrintConv => 'ConvertDuration($val)' }, + 7 => { Name => 'IndexOffset', Unknown => 1 }, + 8 => { Name => 'DataOffset', Unknown => 1 }, + 9 => { Name => 'NumStreams', Format => 'int16u' }, + 10 => { + Name => 'Flags', + Format => 'int16u', + PrintConv => { BITMASK => { + 0 => 'Allow Recording', + 1 => 'Perfect Play', + 2 => 'Live', + 3 => 'Allow Download', #PH (from rmeditor dump) + } }, + }, +); + +%Image::ExifTool::Real::MediaProps = ( + GROUPS => { 1 => 'Real-MDPR', 2 => 'Video' }, + PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData, + VARS => { ID_LABEL => 'Sequence' }, + FORMAT => 'int32u', + PRIORITY => 0, # first stream takes priority + 0 => { Name => 'StreamNumber', Format => 'int16u' }, + 1 => { Name => 'StreamMaxBitrate', PrintConv => 'ConvertBitrate($val)' }, + 2 => { Name => 'StreamAvgBitrate', PrintConv => 'ConvertBitrate($val)' }, + 3 => { Name => 'StreamMaxPacketSize' }, + 4 => { Name => 'StreamAvgPacketSize' }, + 5 => { Name => 'StreamStartTime' }, + 6 => { Name => 'StreamPreroll', ValueConv => '$val / 1000', PrintConv => 'ConvertDuration($val)' }, + 7 => { Name => 'StreamDuration',ValueConv => '$val / 1000', PrintConv => 'ConvertDuration($val)' }, + 8 => { Name => 'StreamNameLen', Format => 'int8u', Unknown => 1 }, + 9 => { Name => 'StreamName', Format => 'string[$val{8}]' }, + 10 => { Name => 'StreamMimeLen', Format => 'int8u', Unknown => 1 }, + 11 => { + Name => 'StreamMimeType', + Format => 'string[$val{10}]', + RawConv => '$self->{RealStreamMime} = $val', + }, + 12 => { Name => 'FileInfoLen', Unknown => 1 }, + 13 => { + Name => 'FileInfoLen2', + # if this condition fails, subsequent tags will not be processed + Condition => '$self->{RealStreamMime} eq "logical-fileinfo"', + Unknown => 1, + }, + 14 => { + Name => 'FileInfoVersion', + Format => 'int16u', + }, + 15 => { + Name => 'PhysicalStreams', + Format => 'int16u', + Unknown => 1, + }, + 16 => { + Name => 'PhysicalStreamNumbers', + Format => 'int16u[$val{15}]', + Unknown => 1, + }, + 17 => { + Name => 'DataOffsets', + Format => 'int32u[$val{15}]', + Unknown => 1, + }, + 18 => { + Name => 'NumRules', + Format => 'int16u', + Unknown => 1, + }, + 19 => { + Name => 'PhysicalStreamNumberMap', + Format => 'int16u[$val{18}]', + Unknown => 1, + }, + 20 => { + Name => 'NumProperties', + Format => 'int16u', + Unknown => 1, + }, + 21 => { + Name => 'FileInfoProperties', + Format => 'undef[$val{13}-$val{15}*6-$val{18}*2-12]', + SubDirectory => { TagTable => 'Image::ExifTool::Real::FileInfo' }, + }, +); + +# Observed FileInfo properties (ref PH) +%Image::ExifTool::Real::FileInfo = ( + GROUPS => { 1 => 'Real-MDPR', 2 => 'Video' }, + PROCESS_PROC => \&ProcessRealProperties, + NOTES => q{ + The following tags have been observed in the FileInfo properties, but any + other existing information will also be extracted. + }, + Indexable => { PrintConv => { 0 => 'False', 1 => 'True' } }, + Keywords => { }, + Description => { }, + 'File ID' => { Name => 'FileID' }, + 'Content Rating' => { + Name => 'ContentRating', + PrintConv => { + 0 => 'No Rating', + 1 => 'All Ages', + 2 => 'Older Children', + 3 => 'Younger Teens', + 4 => 'Older Teens', + 5 => 'Adult Supervision Recommended', + 6 => 'Adults Only', + }, + }, + Audiences => { }, + audioMode => { Name => 'AudioMode' }, + 'Creation Date' => { + Name => 'CreateDate', + Groups => { 2 => 'Time' }, + ValueConv => q{ + $val =~ m{(\d+)/(\d+)/(\d+)\s+(\d+):(\d+):(\d+)} ? + sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d",$3,$2,$1,$4,$5,$6) : $val + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 'Generated By' => { Name => 'Software' }, + 'Modification Date' => { + Name => 'ModifyDate', + Groups => { 2 => 'Time' }, + ValueConv => q{ + $val =~ m{(\d+)/(\d+)/(\d+)\s+(\d+):(\d+):(\d+)} ? + sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d",$3,$2,$1,$4,$5,$6) : $val + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 'Target Audiences' => { Name => 'TargetAudiences' }, + 'Audio Format' => { Name => 'AudioFormat' }, + 'Video Quality' => { Name => 'VideoQuality' }, + videoMode => { Name => 'VideoMode' }, +); + +%Image::ExifTool::Real::ContentDescr = ( + GROUPS => { 1 => 'Real-CONT', 2 => 'Video' }, + PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData, + VARS => { ID_LABEL => 'Sequence' }, + FORMAT => 'int16u', + 0 => { Name => 'TitleLen', Unknown => 1 }, + 1 => { Name => 'Title', Format => 'string[$val{0}]' }, + 2 => { Name => 'AuthorLen', Unknown => 1 }, + 3 => { Name => 'Author', Format => 'string[$val{2}]', Groups => { 2 => 'Author' } }, + 4 => { Name => 'CopyrightLen', Unknown => 1 }, + 5 => { Name => 'Copyright', Format => 'string[$val{4}]', Groups => { 2 => 'Author' } }, + 6 => { Name => 'CommentLen', Unknown => 1 }, + 7 => { Name => 'Comment', Format => 'string[$val{6}]' }, +); + +# Real RJMD meta information (ref PH) +%Image::ExifTool::Real::Metadata = ( + GROUPS => { 1 => 'Real-RJMD', 2 => 'Video' }, + PROCESS_PROC => \&ProcessRealMeta, + NOTES => q{ + The tags below represent information which has been observed in the Real + Metadata format, but ExifTool will extract any information it finds in this + format. (As far as I can tell from the referenced documentation, string + values should be plain text, but this is not the case for the only sample + file I have been able to obtain containing this information. These tags + could also be split into separate sub-directories, but this will wait until + I have better documentation or a more complete set of samples.) + }, + 'Album/Name' => 'AlbumName', + 'Track/Category' => 'TrackCategory', + 'Track/Comments' => 'TrackComments', + 'Track/Lyrics' => 'TrackLyrics', +); + +%Image::ExifTool::Real::AudioV3 = ( + GROUPS => { 1 => 'Real-RA3', 2 => 'Audio' }, + PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData, + VARS => { ID_LABEL => 'Sequence' }, + FORMAT => 'int8u', + 0 => { Name => 'Channels', Format => 'int16u' }, + 1 => { Name => 'Unknown', Format => 'int16u[3]', Unknown => 1 }, + 2 => { Name => 'BytesPerMinute', Format => 'int16u' }, + 3 => { Name => 'AudioBytes', Format => 'int32u' }, + 4 => { Name => 'TitleLen', Unknown => 1 }, + 5 => { Name => 'Title', Format => 'string[$val{4}]' }, + 6 => { Name => 'ArtistLen', Unknown => 1 }, + 7 => { Name => 'Artist', Format => 'string[$val{6}]', Groups => { 2 => 'Author' } }, + 8 => { Name => 'CopyrightLen', Unknown => 1 }, + 9 => { Name => 'Copyright', Format => 'string[$val{8}]', Groups => { 2 => 'Author' } }, + 10 => { Name => 'CommentLen', Unknown => 1 }, + 11 => { Name => 'Comment', Format => 'string[$val{10}]' }, +); + +%Image::ExifTool::Real::AudioV4 = ( + GROUPS => { 1 => 'Real-RA4', 2 => 'Audio' }, + PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData, + VARS => { ID_LABEL => 'Sequence' }, + FORMAT => 'int16u', + 0 => { Name => 'FourCC1', Format => 'undef[4]', Unknown => 1 }, + 1 => { Name => 'AudioFileSize', Format => 'int32u', Unknown => 1 }, + 2 => { Name => 'Version2', Unknown => 1 }, + 3 => { Name => 'HeaderSize', Format => 'int32u', Unknown => 1 }, + 4 => { Name => 'CodecFlavorID', Unknown => 1 }, + 5 => { Name => 'CodedFrameSize', Format => 'int32u', Unknown => 1 }, + 6 => { Name => 'AudioBytes', Format => 'int32u' }, + 7 => { Name => 'BytesPerMinute', Format => 'int32u' }, + 8 => { Name => 'Unknown', Format => 'int32u', Unknown => 1 }, + 9 => { Name => 'SubPacketH', Unknown => 1 }, + 10 => 'AudioFrameSize', + 11 => { Name => 'SubPacketSize', Unknown => 1 }, + 12 => { Name => 'Unknown', Unknown => 1 }, + 13 => 'SampleRate', + 14 => { Name => 'Unknown', Unknown => 1 }, + 15 => 'BitsPerSample', + 16 => 'Channels', + 17 => { Name => 'FourCC2Len', Format => 'int8u', Unknown => 1 }, + 18 => { Name => 'FourCC2', Format => 'undef[4]', Unknown => 1 }, + 19 => { Name => 'FourCC3Len', Format => 'int8u', Unknown => 1 }, + 20 => { Name => 'FourCC3', Format => 'undef[4]', Unknown => 1 }, + 21 => { Name => 'Unknown', Format => 'int8u', Unknown => 1 }, + 22 => { Name => 'Unknown', Unknown => 1 }, + 23 => { Name => 'TitleLen', Format => 'int8u', Unknown => 1 }, + 24 => { Name => 'Title', Format => 'string[$val{23}]' }, + 25 => { Name => 'ArtistLen', Format => 'int8u', Unknown => 1 }, + 26 => { Name => 'Artist', Format => 'string[$val{25}]', Groups => { 2 => 'Author' } }, + 27 => { Name => 'CopyrightLen', Format => 'int8u', Unknown => 1 }, + 28 => { Name => 'Copyright', Format => 'string[$val{27}]', Groups => { 2 => 'Author' } }, + 29 => { Name => 'CommentLen', Format => 'int8u', Unknown => 1 }, + 30 => { Name => 'Comment', Format => 'string[$val{29}]' }, +); + +%Image::ExifTool::Real::AudioV5 = ( + GROUPS => { 1 => 'Real-RA5', 2 => 'Audio' }, + PROCESS_PROC => \&Image::ExifTool::Canon::ProcessSerialData, + VARS => { ID_LABEL => 'Sequence' }, + FORMAT => 'int16u', + 0 => { Name => 'FourCC1', Format => 'undef[4]', Unknown => 1 }, + 1 => { Name => 'AudioFileSize', Format => 'int32u', Unknown => 1 }, + 2 => { Name => 'Version2', Unknown => 1 }, + 3 => { Name => 'HeaderSize', Format => 'int32u', Unknown => 1 }, + 4 => { Name => 'CodecFlavorID', Unknown => 1 }, + 5 => { Name => 'CodedFrameSize', Format => 'int32u', Unknown => 1 }, + 6 => { Name => 'AudioBytes', Format => 'int32u' }, + 7 => { Name => 'BytesPerMinute', Format => 'int32u' }, + 8 => { Name => 'Unknown', Format => 'int32u', Unknown => 1 }, + 9 => { Name => 'SubPacketH', Unknown => 1 }, + 10 => { Name => 'FrameSize', Unknown => 1 }, + 11 => { Name => 'SubPacketSize', Unknown => 1 }, + 12 => 'SampleRate', + 13 => { Name => 'SampleRate2', Unknown => 1 }, + 14 => { Name => 'BitsPerSample', Format => 'int32u' }, + 15 => 'Channels', + 16 => { Name => 'Genr', Format => 'int32u', Unknown => 1 }, + 17 => { Name => 'FourCC3', Format => 'undef[4]', Unknown => 1 }, +); + +#------------------------------------------------------------------------------ +# Process Real NameValueProperties +# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessRealProperties($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = $$dirInfo{DirLen}; + my $pos = $$dirInfo{DirStart}; + my $verbose = $et->Options('Verbose'); + + $verbose and $et->VerboseDir('RealProperties', undef, $dirLen); + + while ($pos + 6 <= $dirLen) { + + # get property size and version + my ($size, $vers) = unpack("x${pos}Nn", $$dataPt); + last if $size < 6; + unless ($vers == 0) { + $pos += $size; + next; + } + $pos += 6; + + my $tagLen = unpack("x${pos}C", $$dataPt); + ++$pos; + + last if $pos + $tagLen > $dirLen; + my $tag = substr($$dataPt, $pos, $tagLen); + $pos += $tagLen; + + last if $pos + 6 > $dirLen; + my ($type, $valLen) = unpack("x${pos}Nn", $$dataPt); + $pos += 6; + + last if $pos + $valLen > $dirLen; + my $format = $propertyType{$type} || 'undef'; + my $count = int($valLen / Image::ExifTool::FormatSize($format)); + my $val = ReadValue($dataPt, $pos, $format, $count, $dirLen-$pos); + + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + unless ($tagInfo) { + my $tagName; + ($tagName = $tag) =~ s/\s+//g; + next unless $tagName =~ /^\w+$/; # ignore crazy names + $tagInfo = { Name => ucfirst($tagName) }; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + if ($verbose) { + $et->VerboseInfo($tag, $tagInfo, + Table => $tagTablePtr, + Value => $val, + DataPt => $dataPt, + Size => $valLen, + Start => $pos, + Addr => $pos + $$dirInfo{DataPos}, + Format => $format, + Count => $count, + ); + } + $et->FoundTag($tagInfo, $val); + $pos += $valLen; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process Real metadata properties +# Inputs: 0) ExifTool object reference, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessRealMeta($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $pos = $$dirInfo{DirStart}; + my $dirEnd = $pos + $$dirInfo{DirLen}; + my $verbose = $et->Options('Verbose'); + my $prefix = $$dirInfo{Prefix} || ''; + $prefix and $prefix .= '/'; + + $verbose and $et->VerboseDir('RealMetadata', undef, $$dirInfo{DirLen}); + + for (;;) { + last if $pos + 28 > $dirEnd; + # extract fixed-position metadata structure members + my ($size, $type, $flags, $valuePos, $subPropPos, $numSubProps, $nameLen) + = unpack("x${pos}N7", $$dataPt); + # make pointers relative to data start + $valuePos += $pos; + $subPropPos += $pos; + # validate what we have read so far + last if $pos + $size > $dirEnd; + last if $pos + 28 + $nameLen > $dirEnd; + last if $valuePos < $pos + 28 + $nameLen; + last if $valuePos + 4 > $dirEnd; + my $tag = substr($$dataPt, $pos + 28, $nameLen); + $tag =~ s/\0.*//s; # truncate at null + $tag = $prefix . $tag; + my $valueLen = unpack("x${valuePos}N", $$dataPt); + $valuePos += 4; # point at value itself + last if $valuePos + $valueLen > $dirEnd; + + my $format = $metadataFormat{$type}; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + unless ($tagInfo) { + my $tagName = $tag; + $tagName =~ tr/A-Za-z0-9//dc; + $tagInfo = { Name => ucfirst($tagName) }; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + if ($verbose) { + $format = 'undef' unless defined $format; + $flags = Image::ExifTool::DecodeBits($flags, \%metadataFlag); + } + if ($valueLen and $format) { + # (a flag can be 1 or 4 bytes) + if ($format eq 'flag') { + $format = ($valueLen == 4) ? 'int32u' : 'int8u'; + } elsif ($type == 7 and $tagInfo) { + # add PrintConv and ValueConv for "date" type + $$tagInfo{ValueConv} or $$tagInfo{ValueConv} = q{ + $val =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/ ? + sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d",$1,$2,$3,$4,$5,$6) : + $val; + }; + $$tagInfo{PrintConv} or $$tagInfo{PrintConv} = '$self->ConvertDateTime($val)'; + } + my $count = int($valueLen / Image::ExifTool::FormatSize($format)); + my $val = ReadValue($dataPt, $valuePos, $format, $count, $dirEnd-$valuePos); + $et->HandleTag($tagTablePtr, $tag, $val, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $valuePos, + Size => $valueLen, + Format => "type=$type, flags=$flags", + ); + } + # extract sub-properties + if ($numSubProps) { + my $dirStart = $valuePos + $valueLen + $numSubProps * 8; + my %dirInfo = ( + DataPt => $dataPt, + DataPos => $dataPos, + DirStart => $dirStart, + DirLen => $pos + $size - $dirStart, + Prefix => $tag, + ); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + $pos += $size; # step to next Metadata structure + } + unless ($pos == $dirEnd) { + $et->Warn('Format error in Real Metadata'); + return 0; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Read information frame a Real file +# Inputs: 0) ExifTool object reference, 1) Directory information reference +# Returns: 1 on success, 0 if this wasn't a valid Real file +sub ProcessReal($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $tag, $vers, $extra, @mimeTypes, %dirCount); + + $raf->Read($buff, 8) == 8 or return 0; + $buff =~ m{^(\.RMF|\.ra\xfd|pnm://|rtsp://|http://)} or return 0; + + my $fast3 = $$et{OPTIONS}{FastScan} && $$et{OPTIONS}{FastScan} == 3; + my ($type, $tagTablePtr); + if ($1 eq '.RMF') { + $tagTablePtr = GetTagTable('Image::ExifTool::Real::Media'); + $type = 'RM'; + } elsif ($1 eq ".ra\xfd") { + $tagTablePtr = GetTagTable('Image::ExifTool::Real::Audio'); + $type = 'RA'; + } else { + $tagTablePtr = GetTagTable('Image::ExifTool::Real::Metafile'); + my $ext = $$et{FILE_EXT}; + $type = ($ext and $ext eq 'RPM') ? 'RPM' : 'RAM'; + require Image::ExifTool::PostScript; + local $/ = Image::ExifTool::PostScript::GetInputRecordSeparator($raf) || "\n"; + $raf->Seek(0,0); + while ($raf->ReadLine($buff)) { + last if length $buff > 256; + next unless $buff ; + chomp $buff; + if ($type) { + # must be a Real file type if protocol is http + return 0 if $buff =~ /^http/ and $buff !~ /\.(ra|rm|rv|rmvb|smil)$/i; + $et->SetFileType($type); + return 1 if $fast3; + undef $type; + } + # save URL or Text from RAM file + my $tag = $buff =~ m{^[a-z]{3,4}://} ? 'url' : 'txt'; + $et->HandleTag($tagTablePtr, $tag, $buff); + } + return 1; + } + + $et->SetFileType($type); + return 1 if $fast3; + SetByteOrder('MM'); + my $verbose = $et->Options('Verbose'); +# +# Process RealAudio file +# + if ($type eq 'RA') { + ($vers, $extra) = unpack('x4nn', $buff); + $tag = ".ra$vers"; + my $fpos = $raf->Tell(); + unless ($raf->Read($buff, 512)) { + $et->Warn('Error reading audio header'); + return 1; + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($verbose > 2) { + $et->VerboseInfo($tag, $tagInfo, DataPt => \$buff, DataPos => $fpos); + } + if ($tagInfo) { + my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + my %dirInfo = ( + DataPt => \$buff, + DataPos => $fpos, + DirLen => length $buff, + DirStart => 0, + ); + $et->ProcessDirectory(\%dirInfo, $subTablePtr); + } else { + $et->Warn('Unsupported RealAudio version'); + } + return 1; + } +# +# Process RealMedia file +# + # skip the rest of the RM header + my $size = unpack('x4N', $buff); + unless ($raf->Seek($size - 8, 1)) { + $et->Warn('Error seeking in file'); + return 0; + } + + # Process RealMedia chunks + for (;;) { + $raf->Read($buff, 10) == 10 or last; + ($tag, $size, $vers) = unpack('a4Nn', $buff); + last if $tag eq "\0\0\0\0"; + if ($verbose) { + $et->VPrint(0, "$tag chunk ($size bytes):\n"); + } else { + last if $tag eq 'DATA'; # stop normal parsing at DATA tag + } + if ($size & 0x80000000) { + $et->Warn('Bad chunk header'); + last; + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($tagInfo and $$tagInfo{SubDirectory}) { + my $fpos = $raf->Tell(); + unless ($raf->Read($buff, $size-10) == $size-10) { + $et->Warn("Error reading $tag chunk"); + last; + } + if ($verbose > 2) { + $et->VerboseInfo($tag, $tagInfo, DataPt => \$buff, DataPos => $fpos); + } + my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + my %dirInfo = ( + DataPt => \$buff, + DataPos => $fpos, + DirLen => length $buff, + DirStart => 0, + ); + if ($dirCount{$tag}) { + $$et{SET_GROUP1} = '+' . ++$dirCount{$tag}; + } else { + $dirCount{$tag} = 1; + } + $et->ProcessDirectory(\%dirInfo, $subTablePtr); + delete $$et{SET_GROUP1}; + # keep track of stream MIME types + my $mime = $$et{RealStreamMime}; + if ($mime) { + delete $$et{RealStreamMime}; + $mime =~ s/\0.*//s; + push @mimeTypes, $mime unless $mime =~ /^logical-/; + } + } else { + unless ($raf->Seek($size-10, 1)) { + $et->Warn('Error seeking in file'); + last; + } + } + } + # override MIMEType with stream MIME type if we only have one stream + if (@mimeTypes == 1 and length $mimeTypes[0]) { + $$et{VALUE}{MIMEType} = $mimeTypes[0]; + $et->VPrint(0, " MIMEType = $mimeTypes[0]\n"); + } +# +# Process footer containing Real metadata and ID3 information +# + if ($raf->Seek(-140, 2) and $raf->Read($buff, 12) == 12 and $buff =~ /^RMJE/) { + my $metaSize = unpack('x8N', $buff); + if ($raf->Seek(-$metaSize-12, 1) and + $raf->Read($buff, $metaSize) == $metaSize and + $buff =~ /^RJMD/) + { + my %dirInfo = ( + DataPt => \$buff, + DataPos => $raf->Tell() - $metaSize, + DirStart => 8, + DirLen => length($buff) - 8, + ); + my $tagTablePtr = GetTagTable('Image::ExifTool::Real::Metadata'); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } else { + $et->Warn('Bad metadata footer'); + } + if ($raf->Seek(-128, 2) and $raf->Read($buff, 128) == 128 and $buff =~ /^TAG/) { + $et->VPrint(0, "ID3v1:\n"); + my %dirInfo = ( + DataPt => \$buff, + DirStart => 0, + DirLen => length($buff), + ); + my $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v1'); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Real - Read Real audio/video meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains the routines required by Image::ExifTool to read meta +information in RealAudio (RA), RealMedia (RM, RV and RMVB) and RealMedia +Metafile (RAM and RPM) files. + +=head1 NOTES + +There must be a bug in the software that wrote the Metadata used in the test +file t/images/Real.rm because the TrackLyricsDataSize word is written +little-endian, but the Real format is big-endian. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.getid3.org/> + +=item L<https://common.helixcommunity.org/nonav/2003/HCS_SDK_r5/htmfiles/rmff.htm> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Real Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Reconyx.pm b/lib/Image/ExifTool/Reconyx.pm new file mode 100644 index 0000000..8b41fce --- /dev/null +++ b/lib/Image/ExifTool/Reconyx.pm @@ -0,0 +1,444 @@ +#------------------------------------------------------------------------------ +# File: Reconyx.pm +# +# Description: Reconyx maker notes tags +# +# Revisions: 2011-01-11 - P. Harvey Created +# +# References: 1) RCNX_MN10.pdf (courtesy of Reconyx Inc.) +# 2) ultrafire_makernote.pdf (courtesy of Reconyx Inc.) +# 3) Reconyx private communication +#------------------------------------------------------------------------------ + +package Image::ExifTool::Reconyx; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.06'; + +# info for Type2 version tags +my %versionInfo = ( + Format => 'undef[7]', + ValueConv => 'sprintf("V%.2x.%.2x %.4x:%.2x:%.2x Rev.%s", unpack("CCvCCa", $val))', + ValueConvInv => q{ + my @v = $val =~ /^V([0-9a-f]+)\.([0-9a-f]+) (\d{4}):(\d{2}):(\d{2})\s*Rev\.(\w)/i or return undef; + pack('CCvCCa', map(hex, @v[0..4]), $v[5]); + }, +); + +# maker notes for Reconyx Hyperfire cameras (ref PH) +%Image::ExifTool::Reconyx::Main = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + TAG_PREFIX => 'Reconyx', + FORMAT => 'int16u', + WRITABLE => 1, + FIRST_ENTRY => 0, + NOTES => q{ + The following tags are extracted from the maker notes of Reconyx Hyperfire + cameras such as the HC500, HC600 and PC900. + }, + 0x00 => { #1 + Name => 'MakerNoteVersion', + PrintConv => 'sprintf("0x%.4x", $val)', + Writable => 0, # (we use this for identification, 0xf101 --> rev 1.0) + PrintConvInv => 'hex $val', + }, + 0x01 => { #1 + Name => 'FirmwareVersion', + Format => 'int16u[3]', + PrintConv => '$val=~tr/ /./; $val', + Writable => 0, # (we use this for identification, 0x0003 --> ver 2 or 3) + }, + 0x04 => { #1 + Name => 'FirmwareDate', + Format => 'int16u[2]', + ValueConv => q{ + my @v = split(' ',$val); + sprintf('%.4x:%.2x:%.2x', $v[0], $v[1]>>8, $v[1]&0xff); + }, + ValueConvInv => q{ + my @v = split(':', $val); + hex($v[0]) . ' ' . hex($v[1] . $v[2]); + }, + }, + 0x06 => { + Name => 'TriggerMode', + Format => 'string[2]', + PrintConv => { + C => 'CodeLoc Not Entered', #1 + E => 'External Sensor', #1 + M => 'Motion Detection', + T => 'Time Lapse', + }, + }, + 0x07 => { + Name => 'Sequence', + Format => 'int16u[2]', + PrintConv => '$val =~ s/ / of /; $val', + PrintConvInv => 'join(" ", $val=~/\d+/g)', + }, + 0x09 => { #1 + Name => 'EventNumber', + Format => 'int16u[2]', + ValueConv => 'my @v=split(" ",$val); ($v[0]<<16) + $v[1]', + ValueConvInv => '($val>>16) . " " . ($val&0xffff)', + }, + 0x0b => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Format => 'int16u[6]', + Groups => { 2 => 'Time' }, + Priority => 0, # (not as reliable as EXIF) + Shift => 'Time', + ValueConv => q{ + my @a = split ' ', $val; + # have seen these values written big-endian when everything else is little-endian + if ($a[0] & 0xff00 and not $a[0] & 0xff) { + $_ = ($_ >> 8) | (($_ & 0xff) << 8) foreach @a; + } + sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @a[5,3,4,2,1,0]); + }, + ValueConvInv => q{ + my @a = ($val =~ /\d+/g); + return undef unless @a >= 6; + join ' ', @a[5,4,3,1,2,0]; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + 0x12 => { + Name => 'MoonPhase', + Groups => { 2 => 'Time' }, + PrintConv => { + 0 => 'New', + 1 => 'New Crescent', + 2 => 'First Quarter', + 3 => 'Waxing Gibbous', + 4 => 'Full', + 5 => 'Waning Gibbous', + 6 => 'Last Quarter', + 7 => 'Old Crescent', + }, + }, + 0x13 => { + Name => 'AmbientTemperatureFahrenheit', + Format => 'int16s', + PrintConv => '"$val F"', + PrintConvInv => '$val=~/(-?\d+)/ ? $1 : $val', + }, + 0x14 => { + Name => 'AmbientTemperature', + Format => 'int16s', + PrintConv => '"$val C"', + PrintConvInv => '$val=~/(-?\d+)/ ? $1 : $val', + }, + 0x15 => { + Name => 'SerialNumber', + Format => 'undef[30]', + RawConv => '$_ = $self->Decode($val, "UCS2"); s/\0.*//; $_', + RawConvInv => q{ + $_ = $self->Encode($val, "UCS2"); + $_ = substr($_, 0, 30) if length($_) > 30; + return $_; + }, + }, + 0x24 => 'Contrast', #1 + 0x25 => 'Brightness', #1 + 0x26 => 'Sharpness', #1 + 0x27 => 'Saturation', #1 + 0x28 => { + Name => 'InfraredIlluminator', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x29 => 'MotionSensitivity', #1 + 0x2a => { #1 + Name => 'BatteryVoltage', + ValueConv => '$val / 1000', + ValueConvInv => '$val * 1000', + PrintConv => '"$val V"', + PrintConvInv => '$val=~s/ ?V$//; $val', + }, + 0x2b => { + Name => 'UserLabel', + Format => 'string[22]', #1 (but manual says 16-char limit) + }, +); + +# maker notes for Reconyx UltraFire cameras (ref PH) +%Image::ExifTool::Reconyx::Type2 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + TAG_PREFIX => 'Reconyx', + WRITABLE => 1, + FIRST_ENTRY => 0, + NOTES => 'Tags extracted from models such as the UltraFire.', + # 0x0a - int32u makernote ID 0x00020000 #2 + # 0x0e - int16u makernote size #2 + # 0x12 - int32u public structure ID 0x07f100001 #2 + # 0x16 - int16u public structure size #2 (0x5d = start of public ID to end of UserLabel) + 0x18 => { Name => 'FirmwareVersion', %versionInfo }, + 0x1f => { Name => 'Micro1Version', %versionInfo }, #2 + 0x26 => { Name => 'BootLoaderVersion', %versionInfo }, #2 + 0x2d => { Name => 'Micro2Version', %versionInfo }, #2 + 0x34 => { + Name => 'TriggerMode', + Format => 'undef[1]', + PrintConv => { + M => 'Motion Detection', + T => 'Time Lapse', + P => 'Point and Shoot', #2 + }, + }, + 0x35 => { + Name => 'Sequence', + Format => 'int8u[2]', + PrintConv => '$val =~ s/ / of /; $val', + PrintConvInv => 'join(" ", $val=~/\d+/g)', + }, + 0x37 => { #2 + Name => 'EventNumber', + Format => 'int32u', + }, + 0x3b => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Format => 'int8u[7]', + Groups => { 2 => 'Time' }, + Priority => 0, # (not as reliable as EXIF) + Shift => 'Time', + ValueConv => q{ + my @a = split ' ', $val; + $a[5] += pop(@a) * 256; + sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', reverse @a); + }, + ValueConvInv => q{ + my @a = ($val =~ /\d+/g); + return undef unless @a >= 6; + unshift @a, ($a[0] >> 8); + $a[1] -= $a[0] * 256; + join ' ', @a[6,5,4,3,2,1,0]; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + 0x42 => { #2 + Name => 'DayOfWeek', + Groups => { 2 => 'Time' }, + PrintConv => { + 0 => 'Sunday', + 1 => 'Monday', + 2 => 'Tuesday', + 3 => 'Wednesday', + 4 => 'Thursday', + 5 => 'Friday', + 6 => 'Saturday', + }, + }, + 0x43 => { + Name => 'MoonPhase', + Groups => { 2 => 'Time' }, + PrintConv => { + 0 => 'New', + 1 => 'New Crescent', + 2 => 'First Quarter', + 3 => 'Waxing Gibbous', + 4 => 'Full', + 5 => 'Waning Gibbous', + 6 => 'Last Quarter', + 7 => 'Old Crescent', + }, + }, + 0x44 => { + Name => 'AmbientTemperatureFahrenheit', + Format => 'int16s', + PrintConv => '"$val F"', + PrintConvInv => '$val=~/(-?\d+)/ ? $1 : $val', + }, + 0x46 => { + Name => 'AmbientTemperature', + Format => 'int16s', + PrintConv => '"$val C"', + PrintConvInv => '$val=~/(-?\d+)/ ? $1 : $val', + }, + 0x48 => { + Name => 'Illumination', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x49 => { + Name => 'BatteryVoltage', + Format => 'int16u', + ValueConv => '$val / 1000', + ValueConvInv => '$val * 1000', + PrintConv => '"$val V"', + PrintConvInv => '$val=~s/ ?V$//; $val', + }, + 0x4b => { + Name => 'SerialNumber', + Format => 'string[15]', + }, + 0x5a => { + Name => 'UserLabel', + Format => 'string[21]', + }, +); + +# maker notes for Reconyx HF2 PRO cameras (ref 3) +%Image::ExifTool::Reconyx::Type3 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + TAG_PREFIX => 'Reconyx', + WRITABLE => 1, + FIRST_ENTRY => 0, + NOTES => 'Tags extracted from models such as the HF2 PRO.', + # 0x0a => { Name => 'StructureVersion', Format => 'int16u' }, + # 0x0c => { Name => 'ParentFileSize', Format => 'int32u' }, + 0x10 => { Name => 'FileNumber', Format => 'int16u' }, + 0x12 => { Name => 'DirectoryNumber', Format => 'int16u' }, + # 0x14 => { Name => 'DirCreateDate', Format => 'int16u' }, + # 0x16 => { Name => 'DirCreateTime', Format => 'int16u' }, + # 0x18 - int16[8] SDCardLabel + # 0x28 => { Name => 'MakerNoteVersion', Format => 'int16u' }, + 0x2a => { + Name => 'FirmwareVersion', + Format => 'int16u[3]', + ValueConv => 'my @a = split " ",$val; sprintf("%d.%d%c",@a)', + ValueConvInv => '$val=~/(\d+)\.(\d+)([a-zA-Z])/ ? "$1 $2 ".ord($3) : undef', + }, + 0x30 => { + Name => 'FirmwareDate', + Format => 'int16u[2]', + ValueConv => 'my ($y,$d) = split " ", $val; sprintf("%.4x:%.2x:%.2x",$y,$d>>8,$d&0xff)', + ValueConvInv => 'my @a=split ":", $val; hex($a[0])." ".hex($a[1].$a[2])', + }, + 0x34 => { + Name => 'TriggerMode', #PH (NC) (called EventType in the Reconyx code) + Format => 'string[2]', + PrintConv => { + M => 'Motion Detection', # (seen this one only) + T => 'Time Lapse', # (NC) + P => 'Point and Shoot', # (NC) + }, + }, + 0x36 => { + Name => 'Sequence', + Format => 'int16u[2]', + PrintConv => '$val =~ s/ / of /; $val', + PrintConvInv => 'join(" ", $val=~/\d+/g)', + }, + 0x3a => { + Name => 'EventNumber', + Format => 'int16u[2]', + ValueConv => 'my @a=split " ",$val;($a[0]<<16)+$a[1]', + ValueConvInv => '($val >> 16) . " " . ($val & 0xffff)', + }, + 0x3e => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Format => 'int16u[6]', + Groups => { 2 => 'Time' }, + Priority => 0, # (not as reliable as EXIF) + Shift => 'Time', + ValueConv => q{ + my @a = split ' ', $val; + sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', reverse @a); + }, + ValueConvInv => q{ + my @a = ($val =~ /\d+/g); + return undef unless @a >= 6; + join ' ', @a[6,5,4,3,2,1,0]; + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + 0x4a => { #2 + Name => 'DayOfWeek', + Groups => { 2 => 'Time' }, + Format => 'int16u', + PrintConv => { + 0 => 'Sunday', + 1 => 'Monday', + 2 => 'Tuesday', + 3 => 'Wednesday', + 4 => 'Thursday', + 5 => 'Friday', + 6 => 'Saturday', + }, + }, + 0x4c => { + Name => 'MoonPhase', + Groups => { 2 => 'Time' }, + Format => 'int16u', + PrintConv => { + 0 => 'New', + 1 => 'New Crescent', + 2 => 'First Quarter', + 3 => 'Waxing Gibbous', + 4 => 'Full', + 5 => 'Waning Gibbous', + 6 => 'Last Quarter', + 7 => 'Old Crescent', + }, + }, + 0x4e => { + Name => 'AmbientTemperatureFahrenheit', + Format => 'int16s', + PrintConv => '"$val F"', + PrintConvInv => '$val=~/(-?\d+)/ ? $1 : $val', + }, + 0x50 => { + Name => 'AmbientTemperature', + Format => 'int16s', + PrintConv => '"$val C"', + PrintConvInv => '$val=~/(-?\d+)/ ? $1 : $val', + }, + 0x52 => { Name => 'Contrast', Format => 'int16u' }, + 0x54 => { Name => 'Brightness', Format => 'int16u' }, + 0x56 => { Name => 'Sharpness', Format => 'int16u' }, + 0x58 => { Name => 'Saturation', Format => 'int16u' }, + 0x5a => { Name => 'Flash', Format => 'int16u', PrintConv => { 0 => 'Off', 1 => 'On' } }, + 0x5c => { Name => 'AmbientInfrared', Format => 'int16u' }, + 0x5e => { Name => 'AmbientLight', Format => 'int16u' }, + 0x60 => { Name => 'MotionSensitivity', Format => 'int16u' }, + 0x62 => { Name => 'BatteryVoltage', Format => 'int16u' }, + 0x64 => { Name => 'BatteryVoltageAvg', Format => 'int16u' }, + 0x66 => { Name => 'BatteryType', Format => 'int16u' }, + 0x68 => { Name => 'UserLabel', Format => 'string[22]' }, + 0x7e => { Name => 'SerialNumber', Format => 'unicode[15]' }, +); + +__END__ + +=head1 NAME + +Image::ExifTool::Reconyx - Reconyx maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +maker notes in images from Reconyx cameras. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Reconyx Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Red.pm b/lib/Image/ExifTool/Red.pm new file mode 100644 index 0000000..23b4ba8 --- /dev/null +++ b/lib/Image/ExifTool/Red.pm @@ -0,0 +1,325 @@ +#------------------------------------------------------------------------------ +# File: Red.pm +# +# Description: Read Redcode R3D video files +# +# Revisions: 2018-01-25 - P. Harvey Created +# +# References: 1) http://www.wikiwand.com/en/REDCODE +#------------------------------------------------------------------------------ + +package Image::ExifTool::Red; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.01'; + +sub ProcessR3D($$); + +# RED format codes (ref PH) +my %redFormat = ( + 0 => 'int8u', + 1 => 'string', + 2 => 'float', + 3 => 'int8u', # (how is this different than 0?) + 4 => 'int16u', + 5 => 'int8s', # (not sure about this) + 6 => 'int32s', + 7 => 'undef', # (mixed-format structure?) + 8 => 'int32u', # (NC) + 9 => 'undef', # ? (seen 256 bytes, all zero) +); + +# error strings +my $errTrunc = 'Truncated R3D file'; + +# RED directory tags (ref PH) +%Image::ExifTool::Red::Main = ( + GROUPS => { 2 => 'Camera' }, + NOTES => 'Tags extracted from Redcode R3D video files.', + VARS => { ALPHA_FIRST => 1 }, + + RED1 => { Name => 'Red1Header', SubDirectory => { TagTable => 'Image::ExifTool::Red::RED1' } }, + RED2 => { Name => 'Red2Header', SubDirectory => { TagTable => 'Image::ExifTool::Red::RED2' } }, + + # (upper 4 bits of tag ID are the format code) + # ---- format 1 ---- + 0x1000 => 'StartEdgeCode', #1 + 0x1001 => { Name => 'StartTimecode', Groups => { 2 => 'Time' } }, #1 + 0x1002 => { #1 + Name => 'OtherDate1', + Groups => { 2 => 'Time' }, + # format is "YYYY_MM_DD[_TZ?]" + ValueConv => '$val =~ s/(\d{4})_(\d{2})_/$1:$2:/; $val =~ tr/_/ /; $val', + }, + 0x1003 => { #1 + Name => 'OtherDate2', + Groups => { 2 => 'Time' }, + ValueConv => '$val =~ s/(\d{4})_(\d{2})_/$1:$2:/; $val =~ tr/_/ /; $val', + }, + 0x1004 => { #1 + Name => 'OtherDate3', + Groups => { 2 => 'Time' }, + ValueConv => '$val =~ s/(\d{4})_(\d{2})_/$1:$2:/; $val =~ tr/_/ /; $val', + }, + 0x1005 => { #1 + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + ValueConv => '$val =~ s/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/$1:$2:$3 $4:$5:/; $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + 0x1006 => 'SerialNumber', #1 + 0x1019 => 'CameraType', #1 + 0x101a => { Name => 'ReelNumber', Groups => { 2 => 'Video' } }, #1 + 0x101b => { Name => 'Take', Groups => { 2 => 'Video' } }, + 0x1023 => { #1 + Name => 'DateCreated', + Groups => { 2 => 'Time' }, + ValueConv => '$val =~ s/(\d{4})(\d{2})/$1:$2:/; $val', + }, + 0x1024 => { #1 + Name => 'TimeCreated', + Groups => { 2 => 'Time' }, + ValueConv => '$val =~ s/(\d{2})(\d{2})/$1:$2:/; $val', + }, + 0x1025 => 'FirmwareVersion', #1 + 0x1029 => { Name => 'ReelTimecode', Groups => { 2 => 'Time' } }, #1 + 0x102a => 'StorageType', #1 + 0x1030 => { #1 + Name => 'StorageFormatDate', + Groups => { 2 => 'Time' }, + ValueConv => '$val =~ s/(\d{4})(\d{2})/$1:$2:/; $val', + }, + 0x1031 => { #1 + Name => 'StorageFormatTime', + Groups => { 2 => 'Time' }, + ValueConv => '$val =~ s/(\d{2})(\d{2})/$1:$2:/; $val', + }, + 0x1032 => 'StorageSerialNumber', #1 + 0x1033 => 'StorageModel', #1 + 0x1036 => 'AspectRatio', #1 + # 0x1041 - seen 'NA' + 0x1042 => 'Revision', # ? (seen "TODO, rev EPIC-1.0" and "MYSTERIUM X, rev EPIC-1.0") + # 0x1051 - seen 'C', 'L' + 0x1056 => 'OriginalFileName', + 0x106e => 'LensMake', + 0x106f => 'LensNumber', # (last 2 hex digits are LensType) + 0x1070 => 'LensModel', + 0x1071 => { + Name => 'Model', + Description => 'Camera Model Name', + }, + 0x107c => { Name => 'CameraOperator', Groups => { 2 => 'Author' } }, + 0x1086 => { + Name => 'VideoFormat', + Groups => { 2 => 'Video' }, + }, + 0x1096 => 'Filter', # optical low-pass filter + 0x10a0 => 'Brain', + 0x10a1 => 'Sensor', + # ---- format 2 ---- + 0x200d => 'ColorTemperature', + # 0x200e - (sometimes this is frame rate) + # 0x2015 - seen '1 1 1' (RGBGain or RGBGamma?) + 0x204b => 'RGBCurves', # (blackx/y,toex/y,midx/y,kneex/y,whitex/y) + 0x2066 => { + Name => 'OriginalFrameRate', + Groups => { 2 => 'Video' }, + PrintConv => 'int($val * 1000 + 0.5) / 1000', + }, + # ---- format 4 ---- + 0x4037 => { Name => 'CropArea' }, # (NC) + 0x403b => 'ISO', + # 0x404e - related to CropArea (or "0 0 0 0") + 0x406a => { Name => 'FNumber', ValueConv => '$val / 10' }, + 0x406b => 'FocalLength', + # 0x4084 - related to ISO? + # 0x4087 - related to ISO? + # ---- format 6 ---- + 0x606c => { Name => 'FocusDistance', ValueConv => '$val/1000', PrintConv => '"$val m"' }, +); + +# RED1 file header (ref PH) +%Image::ExifTool::Red::RED1 = ( + GROUPS => { 2 => 'Video' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + NOTES => 'Redcode version 1 header.', + # 0x00 - int32u: length of header + # 0x04 - string: "RED1" + # 0x0a - string: "R1" + 0x07 => { Name => 'RedcodeVersion', Format => 'string[1]' }, #1 + # 0x0e - looks funny; my sample has a value of 43392 here + # 0x0e => { Name => 'AudioSampleRate', Format => 'int16u' }, #1 + 0x36 => { Name => 'ImageWidth', Format => 'int16u' }, #1 + 0x3a => { Name => 'ImageHeight', Format => 'int16u' }, #PH (ref 1 gave 0x3c) + 0x3e => { #PH (ref 1 gave 0x42 for denom) + Name => 'FrameRate', + Format => 'rational32u', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + }, + 0x43 => { Name => 'OriginalFileName', Format => 'string[32]' }, #1 +); + +# RED2 file header (ref PH) +%Image::ExifTool::Red::RED2 = ( + GROUPS => { 2 => 'Video' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + NOTES => 'Redcode version 2 header.', + # 0x00 - int32u: length of header + # 0x04 - string: "RED2" + 0x07 => { Name => 'RedcodeVersion', Format => 'string[1]' }, + # 0x08 - seen 0x05 + # 0x09 - seen 0x0d,0x0f,0x10 + # 0x0a - string: "R2" + # 0x0c - seen 0x04,0x05,0x07,0x08,0x0b,0x0c + # 0x0d - seen 0x01,0x08 (and 0x09 in block 1) + # 0x0e - int16u: seen 3072 + # 0x10 - looks like some sort of 32-byte hash or something (same in other blocks) + # 0x30-0x3f - mostly 0x00's with a couple of 0x01's + # 0x40 - int8u: count of 0x18-byte "rdi" records + # 0x41-0x43 - seen "\0\0\x01" + # ---- rdi record: (0x18 bytes long) ---- + # 0x44 - string: "rdi#" (where number is index of "rdi" record, starting at \x01) + 0x4c => { Name => 'ImageWidth', Format => 'int32u' }, + 0x50 => { Name => 'ImageHeight', Format => 'int32u' }, + # 0x54 - seen 0x11,0x13,0x15 (and 0x03 in "rdi\x02" record) + # 0x55 - seen 0x02 + 0x56 => { + Name => 'FrameRate', + Format => 'int16u[3]', + ValueConv => 'my @a = split " ",$val; ($a[1] * 0x10000 + $a[2]) / $a[0]', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + }, + # (immediately following last "rdi" record is a + # Red directory beginning with int16u size) +); + +#------------------------------------------------------------------------------ +# Process metadata from a Redcode R3D video (ref PH) +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid R3D file +sub ProcessR3D($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $buf2, $pos, $dirLen, $dirEnd); + my $verbose = $et->Options('Verbose'); + + # R3D file structure: + # - each block starts with int32u block size followed by 4-byte block type + # - first block type is either "RED1" (version 1) or "RED2" (version 2) + # - blocks begin on even 0x1000 byte boundaries for version 2 files + + # validate the file header + return 0 unless $raf->Read($buff, 8) == 8 and $buff =~ /^\0\0..RED(1|2)/s; + my $ver = $1; + my $size = unpack('N', $buff); + return 0 if $size < 8; + + $et->SetFileType(); + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::Red::Main'); + my $dataPos = 0; + + # read the first block of the file + $raf->Read($buf2, $size - 8) == $size - 8 or return $et->Warn($errTrunc); + $buff .= $buf2; + + # extract tags from the header + $et->HandleTag($tagTablePtr, "RED$ver", undef, DataPt => \$buff); + + # read the second block from a version 1 file because + # the first block doesn't contain a Red directory + if ($ver eq '1') { + # (read more than we need) + $raf->Read($buff, 0x10000) or return $et->Warn($errTrunc); + $dataPos += $size; + $pos = 0x22; # directory starts at offset 0x22 + } else { + # calculate position of Red directory start + length($buff) < 0x41 and return $et->Warn($errTrunc); + my $n = Get8u(\$buff, 0x40); # number of "rdi" records + $pos = 0x44 + $n * 0x18; + } + if ($pos + 8 > length $buff) { + $dirLen = 0; # find directory the hard way + } else { + $dirLen = Get16u(\$buff, $pos); # get length of Red directory + $pos += 2; # skip length word + } + # do sanity check on the directory size (in case our assumptions were wrong) + if ($dirLen < 300 or $dirLen >= 2048 or $pos + $dirLen > length $buff) { + # tag 0x1000 with length 0x000f should be near the directory start + $buff =~ /\0\x0f\x10\0/g or return $et->Warn("Can't find Red directory"); + $pos = pos($buff) - 4; + $dirEnd = length $buff; + undef $dirLen; + $et->Warn('This R3D file is different. Please submit a sample for testing'); + } else { + $dirEnd = $pos + $dirLen; + } + $$et{INDENT} .= '| ', $et->VerboseDir('Red', undef, $dirLen) if $verbose; + + # process the first Red directory + while ($pos + 4 <= $dirEnd) { + my $len = Get16u(\$buff, $pos); + last if $len < 4 or $pos + $len > $dirEnd; + my $tag = Get16u(\$buff, $pos + 2); + my $fmt = $redFormat{$tag >> 12}; # format is top 4 bits of tag ID (ref PH) + $fmt or $dirLen && $et->Warn('Unknown format code'), last; + $et->HandleTag($tagTablePtr, $tag, undef, + DataPt => \$buff, + DataPos => $dataPos, + Start => $pos + 4, + Size => $len - 4, + Format => $fmt, + ); + $pos += $len; + } + $$et{INDENT} = substr($$et{INDENT}, 0, -2) if $verbose; + + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Red - Read Redcode R3D video files + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains routines required by Image::ExifTool to read metadata +from Redcode R3D version 1 and 2 video files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.wikiwand.com/en/REDCODE> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Red Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Ricoh.pm b/lib/Image/ExifTool/Ricoh.pm new file mode 100644 index 0000000..816b864 --- /dev/null +++ b/lib/Image/ExifTool/Ricoh.pm @@ -0,0 +1,1168 @@ +#------------------------------------------------------------------------------ +# File: Ricoh.pm +# +# Description: Ricoh EXIF maker notes tags +# +# Revisions: 03/28/2005 - P. Harvey Created +# +# References: 1) http://www.ozhiker.com/electronics/pjmt/jpeg_info/ricoh_mn.html +# 2) http://homepage3.nifty.com/kamisaka/makernote/makernote_ricoh.htm +# 3) Tim Gray private communication (GR) +# 4) https://github.com/atotto/ricoh-theta-tools/ +# IB) Iliah Borg private communication (LibRaw) +#------------------------------------------------------------------------------ + +package Image::ExifTool::Ricoh; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.35'; + +sub ProcessRicohText($$$); +sub ProcessRicohRMETA($$$); + +# lens types for Ricoh GXR +my %ricohLensIDs = ( + Notes => q{ + Lens units available for the GXR, used by the Ricoh Composite LensID tag. Note + that unlike lenses for all other makes of cameras, the focal lengths in these + model names have already been scaled to include the 35mm crop factor. + }, + # (the exact lens model names used by Ricoh, except for a change in case) + 'RL1' => 'GR Lens A12 50mm F2.5 Macro', + 'RL2' => 'Ricoh Lens S10 24-70mm F2.5-4.4 VC', + 'RL3' => 'Ricoh Lens P10 28-300mm F3.5-5.6 VC', + 'RL5' => 'GR Lens A12 28mm F2.5', + 'RL8' => 'Mount A12', + 'RL6' => 'Ricoh Lens A16 24-85mm F3.5-5.5', +); + +%Image::ExifTool::Ricoh::Main = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + 0x0001 => { Name => 'MakerNoteType', Writable => 'string' }, + 0x0002 => { #PH + Name => 'FirmwareVersion', + Writable => 'string', + # eg. "Rev0113" is firmware version 1.13 + PrintConv => '$val=~/^Rev(\d+)$/ ? sprintf("%.2f",$1/100) : $val', + PrintConvInv => '$val=~/^(\d+)\.(\d+)$/ ? sprintf("Rev%.2d%.2d",$1,$2) : $val', + }, + 0x0005 => [ #PH + { + Condition => '$$valPt =~ /^[-\w ]+$/', + Name => 'SerialNumber', # (verified for GXR) + Writable => 'undef', + Count => 16, + Notes => q{ + the serial number stamped on the camera begins with 2 model-specific letters + followed by the last 8 digits of this value. For the GXR, this is the + serial number of the lens unit + }, + PrintConv => '$val=~s/^(.*)(.{8})$/($1)$2/; $val', + PrintConvInv => '$val=~tr/()//d; $val', + },{ + Name => 'InternalSerialNumber', + Writable => 'undef', + Count => 16, + ValueConv => 'unpack("H*", $val)', + ValueConvInv => 'pack("H*", $val)', + }, + ], + 0x0e00 => { + Name => 'PrintIM', + Writable => 0, + Description => 'Print Image Matching', + SubDirectory => { TagTable => 'Image::ExifTool::PrintIM::Main' }, + }, + 0x1000 => { #3 + Name => 'RecordingFormat', + Writable => 'int16u', + PrintConv => { + 2 => 'JPEG', + 3 => 'DNG', + }, + }, + 0x1001 => [{ + Name => 'ImageInfo', + Condition => '$format ne "int16u"', + SubDirectory => { TagTable => 'Image::ExifTool::Ricoh::ImageInfo' }, + },{ #3 + Name => 'ExposureProgram', + Writable => 'int16u', + Notes => 'GR', + PrintConv => { + 1 => 'Auto', + 2 => 'Program AE', + 3 => 'Aperture-priority AE', + 4 => 'Shutter speed priority AE', + 5 => 'Shutter/aperture priority AE', # TAv + 6 => 'Manual', + 7 => 'Movie', #PH + }, + }], + 0x1002 => { #3 + Name => 'DriveMode', + Condition => '$format eq "int16u"', + Notes => 'valid only for some models', + Writable => 'int16u', + PrintConv => { + 0 => 'Single-frame', + 1 => 'Continuous', + 8 => 'AF-priority Continuous', + }, + }, + 0x1003 => [{ + Name => 'Sharpness', + Condition => '$format ne "int16u"', + Writable => 'int32u', + PrintConv => { + 0 => 'Sharp', + 1 => 'Normal', + 2 => 'Soft', + }, + },{ #3 + Name => 'WhiteBalance', + Writable => 'int16u', + Notes => 'GR', + PrintConv => { + 0 => 'Auto', + 1 => 'Multi-P Auto', + 2 => 'Daylight', + 3 => 'Cloudy', + 4 => 'Incandescent 1', + 5 => 'Incandescent 2', + 6 => 'Daylight Fluorescent', + 7 => 'Neutral White Fluorescent', + 8 => 'Cool White Fluorescent', + 9 => 'Warm White Fluorescent', + 10 => 'Manual', + 11 => 'Kelvin', + 12 => 'Shade', #IB + }, + }], + 0x1004 => { #3 + Name => 'WhiteBalanceFineTune', + Condition => '$format eq "int16u"', + Format => 'int16s', + Writable => 'int16u', + Notes => q{ + 2 numbers: amount of adjustment towards Amber and Green. Not valid for all + models + }, + }, + # 0x1005 int16u - 5 + 0x1006 => { #3 + Name => 'FocusMode', + Writable => 'int16u', + PrintConv => { + 1 => 'Manual', + 2 => 'Multi AF', + 3 => 'Spot AF', + 4 => 'Snap', + 5 => 'Infinity', + 7 => 'Face Detect', #PH + 8 => 'Subject Tracking', + 9 => 'Pinpoint AF', + 10 => 'Movie', #PH + }, + }, + 0x1007 => { #3 + Name => 'AutoBracketing', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 9 => 'AE', + 11 => 'WB', + 16 => 'DR', # (dynamic range) + 17 => 'Contrast', + 18 => 'WB2', # (selects two different WB presets besides normal) + 19 => 'Effect', + }, + }, + 0x1009 => { #3 + Name => 'MacroMode', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x100a => { #3 + Name => 'FlashMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Auto, Fired', + 2 => 'On', + 3 => 'Auto, Fired, Red-eye reduction', + 4 => 'Slow Sync', + 5 => 'Manual', + 6 => 'On, Red-eye reduction', + 7 => 'Synchro, Red-eye reduction', + 8 => 'Auto, Did not fire', + }, + }, + 0x100b => { #3 + Name => 'FlashExposureComp', + Writable => 'rational64s', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 0x100c => { #3 + Name => 'ManualFlashOutput', + Writable => 'rational64s', + PrintConv => { + 0 => 'Full', + -24 => '1/1.4', + -48 => '1/2', + -72 => '1/2.8', + -96 => '1/4', + -120 => '1/5.6', + -144 => '1/8', + -168 => '1/11', + -192 => '1/16', + -216 => '1/22', + -240 => '1/32', + -288 => '1/64', + }, + }, + 0x100d => { #3 + Name => 'FullPressSnap', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x100e => { #3 + Name => 'DynamicRangeExpansion', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 3 => 'Weak', + 4 => 'Medium', + 5 => 'Strong', + }, + }, + 0x100f => { #3 + Name => 'NoiseReduction', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Weak', + 2 => 'Medium', + 3 => 'Strong', + }, + }, + 0x1010 => { #3 + Name => 'ImageEffects', + Writable => 'int16u', + PrintConv => { + 0 => 'Standard', + 1 => 'Vivid', + 3 => 'Black & White', + 5 => 'B&W Toning Effect', + 6 => 'Setting 1', + 7 => 'Setting 2', + 9 => 'High-contrast B&W', + 10 => 'Cross Process', + 11 => 'Positive Film', + 12 => 'Bleach Bypass', + 13 => 'Retro', + 15 => 'Miniature', + 17 => 'High Key', + }, + }, + 0x1011 => { #3 + Name => 'Vignetting', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Medium', + 3 => 'High', + }, + }, + 0x1012 => { #PH + Name => 'Contrast', + Writable => 'int32u', + Format => 'int32s', #3 (high-contrast B&W also has -1 and -2 settings) + PrintConv => { + OTHER => sub { shift }, + 2147483647 => 'MAX', #3 (high-contrast B&W effect MAX setting) + }, + }, + 0x1013 => { Name => 'Saturation', Writable => 'int32u' }, #PH + 0x1014 => { Name => 'Sharpness', Writable => 'int32u' }, #3 + 0x1015 => { #3 + Name => 'ToningEffect', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Sepia', + 2 => 'Red', + 3 => 'Green', + 4 => 'Blue', + 5 => 'Purple', + 6 => 'B&W', + 7 => 'Color', + }, + }, + 0x1016 => { #3 + Name => 'HueAdjust', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Basic', + 2 => 'Magenta', + 3 => 'Yellow', + 4 => 'Normal', + 5 => 'Warm', + 6 => 'Cool', + }, + }, + 0x1017 => { #3 + Name => 'WideAdapter', + Writable => 'int16u', + PrintConv => { + 0 => 'Not Attached', + 2 => 'Attached', # (21mm) + }, + }, + 0x1018 => { #3 + Name => 'CropMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On (35mm)', + 2 => 'On (47mm)', #IB + }, + }, + 0x1019 => { #3 + Name => 'NDFilter', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x101a => { Name => 'WBBracketShotNumber', Writable => 'int16u' }, #3 + # 0x1100 - related to DR correction (ref 3) + 0x1307 => { Name => 'ColorTempKelvin', Writable => 'int32u' }, #3 + 0x1308 => { Name => 'ColorTemperature', Writable => 'int32u' }, #3 + 0x1500 => { #3 + Name => 'FocalLength', + Writable => 'rational64u', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + 0x1200 => { #3 + Name => 'AFStatus', + Writable => 'int16u', + PrintConv => { + 0 => 'Out of Focus', + 1 => 'In Focus', + }, + }, + # 0x1201-0x1204 - related to focus points (ref 3) + 0x1201 => { #PH (NC) + Name => 'AFAreaXPosition1', + Writable => 'int32u', + Notes => 'manual AF area position in a 1280x864 image', + }, + 0x1202 => { Name => 'AFAreaYPosition1', Writable => 'int32u' }, #PH (NC) + 0x1203 => { #PH (NC) + Name => 'AFAreaXPosition', + Writable => 'int32u', + Notes => 'manual AF area position in the full image', + # (coordinates change to correspond with smaller image + # when recording reduced-size JPEG) + }, + 0x1204 => { Name => 'AFAreaYPosition', Writable => 'int32u' }, #PH (NC) + 0x1205 => { #3 + Name => 'AFAreaMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Auto', + 2 => 'Manual', + }, + }, + 0x1601 => { Name => 'SensorWidth', Writable => 'int32u' }, #3 + 0x1602 => { Name => 'SensorHeight', Writable => 'int32u' }, #3 + 0x1603 => { Name => 'CroppedImageWidth', Writable => 'int32u' }, #3 + 0x1604 => { Name => 'CroppedImageHeight', Writable => 'int32u' }, #3 + # 0x1700 - Composite? (0=normal image, 1=interval composite, 2=multi-exposure composite) (ref 3) + # 0x1703 - 0=normal, 1=final composite (ref 3) + # 0x1704 - 0=normal, 2=final composite (ref 3) + 0x2001 => [ + { + Name => 'RicohSubdir', + Condition => q{ + $self->{Model} !~ /^Caplio RR1\b/ and + ($format ne 'int32u' or $count != 1) + }, + SubDirectory => { + Validate => '$val =~ /^\[Ricoh Camera Info\]/', + TagTable => 'Image::ExifTool::Ricoh::Subdir', + Start => '$valuePtr + 20', + ByteOrder => 'BigEndian', + }, + }, + { + Name => 'RicohSubdirIFD', + # the CX6 and GR Digital 4 write an int32u pointer in AVI videos -- doh! + Condition => '$self->{Model} !~ /^Caplio RR1\b/', + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Ricoh::Subdir', + Start => '$val + 20', # (skip over "[Ricoh Camera Info]\0" header) + ByteOrder => 'BigEndian', + }, + }, + { + Name => 'RicohRR1Subdir', + SubDirectory => { + Validate => '$val =~ /^\[Ricoh Camera Info\]/', + TagTable => 'Image::ExifTool::Ricoh::Subdir', + Start => '$valuePtr + 20', + ByteOrder => 'BigEndian', + # the Caplio RR1 uses a different base address -- doh! + Base => '$start-20', + }, + }, + ], + 0x4001 => { + Name => 'ThetaSubdir', + Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Ricoh::ThetaSubdir', + Start => '$val', + }, + }, +); + +# Ricoh type 2 maker notes (ref PH) +# (similar to Kodak::Type11 and GE::Main) +%Image::ExifTool::Ricoh::Type2 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + Tags written by models such as the Ricoh HZ15 and the Pentax XG-1. These + are not writable due to numerous formatting errors as written by these + cameras. + }, + # 0x104 - int32u: 1 + # 0x200 - int32u[3]: 0 0 0 + # 0x202 - int16u: 0 (GE Macro?) + # 0x203 - int16u: 0,3 (Kodak PictureEffect?) + # 0x204 - rational64u: 0/10 + # 0x205 - rational64u: 150/1 + # 0x206 - float[6]: (not really float because size should be 2 bytes) + 0x207 => { + Name => 'RicohModel', + Writable => 'string', + }, + 0x300 => { + # brutal. There are lots of errors in the XG-1 maker notes. For the XG-1, + # 0x300 has a value of "XG-1Pentax". The "XG-1" part is likely an improperly + # stored 0x207 RicohModel, resulting in an erroneous 4-byte offset for this tag + Name => 'RicohMake', + Writable => 'undef', + ValueConv => '$val =~ s/ *$//; $val', + }, + # 0x306 - int16u: 1 + # 0x500 - int16u: 0,1 + # 0x501 - int16u: 0 + # 0x502 - int16u: 0 + # 0x9c9c - int8u[6]: ? + # 0xadad - int8u[20480]: ? +); + +# Ricoh image info (ref 2) +%Image::ExifTool::Ricoh::ImageInfo = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + PRIORITY => 0, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + IS_OFFSET => [ 28 ], # tag 28 is 'IsOffset' + 0 => { + Name => 'RicohImageWidth', + Format => 'int16u', + }, + 2 => { + Name => 'RicohImageHeight', + Format => 'int16u', + }, + 6 => { + Name => 'RicohDate', + Groups => { 2 => 'Time' }, + Format => 'int8u[7]', + # (what an insane way to encode the date) + ValueConv => q{ + sprintf("%.2x%.2x:%.2x:%.2x %.2x:%.2x:%.2x", + split(' ', $val)); + }, + ValueConvInv => q{ + my @vals = ($val =~ /(\d{1,2})/g); + push @vals, 0 if @vals < 7; + join(' ', map(hex, @vals)); + }, + }, + 28 => { + Name => 'PreviewImageStart', + Format => 'int16u', # ha! (only the lower 16 bits, even if > 0xffff) + Flags => 'IsOffset', + OffsetPair => 30, # associated byte count tagID + DataTag => 'PreviewImage', + Protected => 2, + WriteGroup => 'MakerNotes', + # prevent preview from being written to MakerNotes of DNG images + RawConvInv => q{ + return $val if $$self{FILE_TYPE} eq "JPEG"; + warn "\n"; # suppress warning + return undef; + }, + }, + 30 => { + Name => 'PreviewImageLength', + Format => 'int16u', + OffsetPair => 28, # point to associated offset + DataTag => 'PreviewImage', + Protected => 2, + WriteGroup => 'MakerNotes', + RawConvInv => q{ + return $val if $$self{FILE_TYPE} eq "JPEG"; + warn "\n"; # suppress warning + return undef; + }, + }, + 32 => { + Name => 'FlashMode', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', #PH + 2 => 'On', + }, + }, + 33 => { + Name => 'Macro', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 34 => { + Name => 'Sharpness', + PrintConv => { + 0 => 'Sharp', + 1 => 'Normal', + 2 => 'Soft', + }, + }, + 38 => { + Name => 'WhiteBalance', + PrintConv => { + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Cloudy', + 3 => 'Tungsten', + 4 => 'Fluorescent', + 5 => 'Manual', #PH (GXR) + 7 => 'Detail', + 9 => 'Multi-pattern Auto', #PH (GXR) + }, + }, + 39 => { + Name => 'ISOSetting', + PrintConv => { + 0 => 'Auto', + 1 => 64, + 2 => 100, + 4 => 200, + 6 => 400, + 7 => 800, + 8 => 1600, + 9 => 'Auto', #PH (? CX3) + 10 => 3200, #PH (A16) + 11 => '100 (Low)', #PH (A16) + }, + }, + 40 => { + Name => 'Saturation', + PrintConv => { + 0 => 'High', + 1 => 'Normal', + 2 => 'Low', + 3 => 'B&W', + 6 => 'Toning Effect', #PH (GXR Sepia,Red,Green,Blue,Purple) + 9 => 'Vivid', #PH (GXR) + 10 => 'Natural', #PH (GXR) + }, + }, +); + +# Ricoh subdirectory tags (ref PH) +# NOTE: this subdir is currently not writable because the offsets would require +# special code to handle the funny start location and base offset +%Image::ExifTool::Ricoh::Subdir = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + # the significance of the following 2 dates is not known. They are usually + # within a month of each other, but I have seen differences of nearly a year. + # Sometimes the first is more recent, and sometimes the second. + # 0x0003 - int32u[1] + 0x0004 => { # (NC) + Name => 'ManufactureDate1', + Groups => { 2 => 'Time' }, + Writable => 'string', + Count => 20, + }, + 0x0005 => { # (NC) + Name => 'ManufactureDate2', + Groups => { 2 => 'Time' }, + Writable => 'string', + Count => 20, + }, + # 0x0006 - undef[16] ? + # 0x0007 - int32u[1] ? + # 0x000c - int32u[2] 1st number is a counter (file number? shutter count?) - PH + # 0x0014 - int8u[338] could contain some data related to face detection? - PH + # 0x0015 - int8u[2]: related to noise reduction? + 0x001a => { #PH + Name => 'FaceInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Ricoh::FaceInfo' }, + }, + 0x0029 => { + Name => 'FirmwareInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Ricoh::FirmwareInfo' }, + }, + 0x002a => { + Name => 'NoiseReduction', + # this is the applied value if NR is set to "Auto" + Writable => 'int32u', + PrintConv => { + 0 => 'Off', + 1 => 'Weak', + 2 => 'Strong', + 3 => 'Max', + }, + }, + 0x002c => { # (GXR) + Name => 'SerialInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Ricoh::SerialInfo' }, + } + # 0x000E ProductionNumber? (ref 2) [no. zero for most models - PH] +); + +# Ricoh Theta subdirectory tags - Contains orientation information (ref 4) +%Image::ExifTool::Ricoh::ThetaSubdir = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + # 0x0001 - int16u[1] ? + # 0x0002 - int16u[1] ? + 0x0003 => { + Name => 'Accelerometer', + Writable => 'rational64s', + Count => 2, + }, + 0x0004 => { + Name => 'Compass', + Writable => 'rational64u', + }, + # 0x0005 - int16u[1] ? + # 0x0006 - int16u[1] ? + # 0x0007 - int16u[1] ? + # 0x0008 - int16u[1] ? + # 0x0009 - int16u[1] ? + 0x000a => { + Name => 'TimeZone', + Writable => 'string', + }, + # 0x0101 - int16u[4] ISO (why 4 values?) + # 0x0102 - rational64s[2] FNumber (why 2 values?) + # 0x0103 - rational64u[2] ExposureTime (why 2 values?) + # 0x0104 - string[9] SerialNumber? + # 0x0105 - string[9] SerialNumber? +); + +# face detection information (ref PH, CX4) +%Image::ExifTool::Ricoh::FaceInfo = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, + DATAMEMBER => [ 181 ], + 0xb5 => { # (should be int16u at 0xb4?) + Name => 'FacesDetected', + DataMember => 'FacesDetected', + RawConv => '$$self{FacesDetected} = $val', + }, + 0xb6 => { + Name => 'FaceDetectFrameSize', + Format => 'int16u[2]', + }, + 0xbc => { + Name => 'Face1Position', + Condition => '$$self{FacesDetected} >= 1', + Format => 'int16u[4]', + Notes => q{ + left, top, width and height of detected face in coordinates of + FaceDetectFrameSize with increasing Y downwards + }, + }, + 0xc8 => { + Name => 'Face2Position', + Condition => '$$self{FacesDetected} >= 2', + Format => 'int16u[4]', + }, + 0xd4 => { + Name => 'Face3Position', + Condition => '$$self{FacesDetected} >= 3', + Format => 'int16u[4]', + }, + 0xe0 => { + Name => 'Face4Position', + Condition => '$$self{FacesDetected} >= 4', + Format => 'int16u[4]', + }, + 0xec => { + Name => 'Face5Position', + Condition => '$$self{FacesDetected} >= 5', + Format => 'int16u[4]', + }, + 0xf8 => { + Name => 'Face6Position', + Condition => '$$self{FacesDetected} >= 6', + Format => 'int16u[4]', + }, + 0x104 => { + Name => 'Face7Position', + Condition => '$$self{FacesDetected} >= 7', + Format => 'int16u[4]', + }, + 0x110 => { + Name => 'Face8Position', + Condition => '$$self{FacesDetected} >= 8', + Format => 'int16u[4]', + }, +); + +# firmware version information (ref PH) +%Image::ExifTool::Ricoh::FirmwareInfo = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + 0x00 => { + Name => 'FirmwareRevision', + Format => 'string[12]', + }, + 0x0c => { + Name => 'FirmwareRevision2', + Format => 'string[12]', + }, +); + +# serial/version number information written by GXR (ref PH) +%Image::ExifTool::Ricoh::SerialInfo = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + NOTES => 'This information is found in images from the GXR.', + 0 => { + Name => 'BodyFirmware', #(NC) + Format => 'string[16]', + # observed: "RS1 :V00560000" --> FirmwareVersion "Rev0056" + # "RS1 :V01020200" --> FirmwareVersion "Rev0102" + }, + 16 => { + Name => 'BodySerialNumber', + Format => 'string[16]', + # observed: "SID:00100056" --> "WD00100056" on plate + }, + 32 => { + Name => 'LensFirmware', #(NC) + Format => 'string[16]', + # observed: "RL1 :V00560000", "RL1 :V01020200" - A12 50mm F2.5 Macro + # "RL2 :V00560000", "RL2 :V01020300" - S10 24-70mm F2.5-4.4 VC + # --> used in a Composite tag to determine LensType + }, + 48 => { + Name => 'LensSerialNumber', + Format => 'string[16]', + # observed: (S10) "LID:00010024" --> "WF00010024" on plate + # (A12) "LID:00010054" --> "WE00010029" on plate?? + }, +); + +# Ricoh text-type maker notes (PH) +%Image::ExifTool::Ricoh::Text = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PROCESS_PROC => \&ProcessRicohText, + NOTES => q{ + Some Ricoh DC and RDC models use a text-based format for their maker notes + instead of the IFD format used by the Caplio models. Below is a list of known + tags in this information. + }, + Rev => { + Name => 'FirmwareVersion', + PrintConv => '$val=~/^\d+$/ ? sprintf("%.2f",$val/100) : $val', + PrintConvInv => '$val=~/^(\d+)\.(\d+)$/ ? sprintf("%.2d%.2d",$1,$2) : $val', + }, + Rv => { + Name => 'FirmwareVersion', + PrintConv => '$val=~/^\d+$/ ? sprintf("%.2f",$val/100) : $val', + PrintConvInv => '$val=~/^(\d+)\.(\d+)$/ ? sprintf("%.2d%.2d",$1,$2) : $val', + }, + Rg => 'RedGain', + Gg => 'GreenGain', + Bg => 'BlueGain', +); + +%Image::ExifTool::Ricoh::RMETA = ( + GROUPS => { 0 => 'APP5', 1 => 'RMETA', 2 => 'Image' }, + PROCESS_PROC => \&Image::ExifTool::Ricoh::ProcessRicohRMETA, + NOTES => q{ + The Ricoh Caplio Pro G3 has the ability to add custom fields to the APP5 + "RMETA" segment of JPEG images. While only a few observed tags have been + defined below, ExifTool will extract any information found here. + }, + 'Sign type' => { Name => 'SignType', PrintConv => { + 1 => 'Directional', + 2 => 'Warning', + 3 => 'Information', + } }, + Location => { PrintConv => { + 1 => 'Verge', + 2 => 'Gantry', + 3 => 'Central reservation', + 4 => 'Roundabout', + } }, + Lit => { PrintConv => { + 1 => 'Yes', + 2 => 'No', + } }, + Condition => { PrintConv => { + 1 => 'Good', + 2 => 'Fair', + 3 => 'Poor', + 4 => 'Damaged', + } }, + Azimuth => { PrintConv => { + 1 => 'N', + 2 => 'NNE', + 3 => 'NE', + 4 => 'ENE', + 5 => 'E', + 6 => 'ESE', + 7 => 'SE', + 8 => 'SSE', + 9 => 'S', + 10 => 'SSW', + 11 => 'SW', + 12 => 'WSW', + 13 => 'W', + 14 => 'WNW', + 15 => 'NW', + 16 => 'NNW', + } }, + _audio => { + Name => 'SoundFile', + Notes => 'audio data recorded in JPEG images by the G700SE', + }, + _barcode => { Name => 'Barcodes', List => 1 }, +); + +# information stored in Ricoh AVI images (ref PH) +%Image::ExifTool::Ricoh::AVI = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Video' }, + ucmt => { + Name => 'Comment', + # Ricoh writes a "Unicode" header even when text is ASCII (spaces anyway) + ValueConv => '$_=$val; s/^(Unicode\0|ASCII\0\0\0)//; tr/\0//d; s/\s+$//; $_', + }, + mnrt => { + Name => 'MakerNoteRicoh', + SubDirectory => { + TagTable => 'Image::ExifTool::Ricoh::Main', + Start => '$valuePtr + 8', + ByteOrder => 'BigEndian', + Base => '8', + }, + }, + rdc2 => { + Name => 'RicohRDC2', + Unknown => 1, + ValueConv => 'unpack("H*",$val)', + # have seen values like 0a000444 and 00000000 - PH + }, + thum => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, +); + +# Ricoh composite tags +%Image::ExifTool::Ricoh::Composite = ( + GROUPS => { 2 => 'Camera' }, + LensID => { + SeparateTable => 'Ricoh LensID', + Require => 'Ricoh:LensFirmware', + RawConv => '$val[0] ? $val[0] : undef', + ValueConv => '$val=~s/\s*:.*//; $val', + PrintConv => \%ricohLensIDs, + }, + RicohPitch => { + Require => 'Ricoh:Accelerometer', + ValueConv => 'my @v = split(" ",$val); $v[1]', + }, + RicohRoll => { + Require => 'Ricoh:Accelerometer', + ValueConv => 'my @v = split(" ",$val); $v[0] <= 180 ? $v[0] : $v[0] - 360', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::Ricoh'); + + +#------------------------------------------------------------------------------ +# Process Ricoh text-based maker notes +# Inputs: 0) ExifTool object reference +# 1) Reference to directory information hash +# 2) Pointer to tag table for this directory +# Returns: 1 on success, otherwise returns 0 and sets a Warning +sub ProcessRicohText($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataLen = $$dirInfo{DataLen}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || $dataLen - $dirStart; + my $verbose = $et->Options('Verbose'); + + my $data = substr($$dataPt, $dirStart, $dirLen); + return 1 if $data =~ /^\0/; # blank Ricoh maker notes + # validate text maker notes + unless ($data =~ /^(Rev|Rv)/) { + $et->Warn('Bad Ricoh maker notes'); + return 0; + } + while ($data =~ m/([A-Z][a-z]{1,2})([0-9A-F]+);/sg) { + my $tag = $1; + my $val = $2; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($verbose) { + $et->VerboseInfo($tag, $tagInfo, + Table => $tagTablePtr, + Value => $val, + ); + } + unless ($tagInfo) { + next unless $$et{OPTIONS}{Unknown}; + $tagInfo = { + Name => "Ricoh_Text_$tag", + Unknown => 1, + PrintConv => 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val', + }; + # add tag information to table + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + $et->FoundTag($tagInfo, $val); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process Ricoh APP5 RMETA information +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, otherwise returns 0 and sets a Warning +sub ProcessRicohRMETA($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart}; + my $dataLen = length($$dataPt); + my $dirLen = $dataLen - $dirStart; + my $verbose = $et->Options('Verbose'); + + $et->VerboseDir('Ricoh RMETA') if $verbose; + $dirLen < 20 and $et->Warn('Truncated Ricoh RMETA data', 1), return 0; + my $byteOrder = substr($$dataPt, $dirStart, 2); + $byteOrder = GetByteOrder() if $byteOrder eq "\0\0"; # (same order as container) + SetByteOrder($byteOrder) or $et->Warn('Bad Ricoh RMETA data', 1), return 0; + # get the RMETA segment number + my $rmetaNum = Get16u($dataPt, $dirStart+4); + if ($rmetaNum != 0) { + # not sure how to recognize audio, so do it by checking for "RIFF" header + # and assume all subsequent RMETA segments are part of the audio data + # (but it looks like the int16u at $dirStart+6 is the next block number + # if the data is continued, or 0 for the last block) + $dirLen < 14 and $et->Warn('Short Ricoh RMETA block', 1), return 0; + if ($$dataPt =~ /^.{20}BARCODE/s) { + my $val = substr($$dataPt, 20); + $val =~ s/\0.*//s; + $val =~ s/^BARCODE\w+,\d{2},//; + my @codes; + for (;;) { + $val =~ s/(\d+),// and length $val >= $1 or last; + push @codes, substr($val, 0, $1); + last unless length $val > $1; + $val = substr($val, $1+1); + } + $et->HandleTag($tagTablePtr, '_barcode', \@codes) if @codes; + return 1; + } elsif ($$dataPt =~ /^.{18}ASCII/s) { + # (ignore barcode tag names for now) + return 1; + } + my $audioLen = Get16u($dataPt, $dirStart+12); + $audioLen + 14 > $dirLen and $et->Warn('Truncated Ricoh RMETA audio data', 1), return 0; + my $buff = substr($$dataPt, $dirStart + 14, $audioLen); + if ($audioLen >= 4 and substr($buff, 0, 4) eq 'RIFF') { + $et->HandleTag($tagTablePtr, '_audio', \$buff); + } elsif ($$et{VALUE}{SoundFile}) { + ${$$et{VALUE}{SoundFile}} .= $buff; + } else { + $et->Warn('Unknown Ricoh RMETA type', 1); + return 0; + } + return 1; + } + # decode standard RMETA tag directory + my (@tags, @vals, @nums, $valPos, $numPos); + my $pos = $dirStart + Get16u($dataPt, $dirStart+8); + my $numEntries = Get16u($dataPt, $pos); + $numEntries > 100 and $et->Warn('Bad RMETA entry count'), return 0; + $pos += 10; # start of first RMETA section + # loop through RMETA sections + while ($pos <= $dataLen - 4) { + my $type = Get16u($dataPt, $pos); + my $size = Get16u($dataPt, $pos + 2); + last unless $size; + $pos += 4; + $size -= 2; + if ($size < 0 or $pos + $size > $dataLen) { + $et->Warn('Corrupted Ricoh RMETA data', 1); + last; + } + my $dat = substr($$dataPt, $pos, $size); + if ($verbose) { + $et->VPrint(2, "$$et{INDENT}RMETA section type=$type size=$size\n"); + $et->VerboseDump(\$dat, Addr => $$dirInfo{DataPos} + $pos); + } + if ($type == 1) { # section 1: tag names + # save the tag names + @tags = split /\0/, $dat, $numEntries+1; + } elsif ($type == 2 || $type == 18) { # section 2/18: string values (G800 uses type 18) + # save the tag values (assume "ASCII\0" encoding since others never seen) + @vals = split /\0/, $dat, $numEntries+1; + $valPos = $pos; # save position of first string value + } elsif ($type == 3) { # section 3: numerical values + if ($size < $numEntries * 2) { + $et->Warn('Truncated RMETA section 3'); + } else { + # save the numerical tag values + # (0=empty, 0xffff=text input, otherwise menu item number) + @nums = unpack(($byteOrder eq 'MM' ? 'n' : 'v').$numEntries, $dat); + $numPos = $pos; # save position of numerical values + } + } elsif ($type != 16) { + $et->Warn("Unrecognized RMETA section (type $type, len $size)"); + } + $pos += $size; + } + return 1 unless @tags or @vals; + $valPos or $valPos = 0; # (just in case there was no value section) + # find next tag in null-delimited list + # unpack numerical values from block of int16u values + my ($i, $name); + for ($i=0; $i<$numEntries; ++$i) { + my $tag = $tags[$i]; + my $val = $vals[$i]; + $val = '' unless defined $val; + unless (defined $tag and length $tag) { + length $val or ++$valPos, next; # (skip empty entries) + $tag = ''; + } + ($name = $tag) =~ s/\b([a-z])/\U$1/gs; # capitalize all words + $name =~ s/ (\w)/\U$1/g; # remove special characters + $name = 'RMETA_Unknown' unless length($name); + my $num = $nums[$i]; + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($tagInfo) { + # make sure print conversion is defined + $$tagInfo{PrintConv} = { } unless ref $$tagInfo{PrintConv} eq 'HASH'; + } else { + # create tagInfo hash + $tagInfo = { Name => $name, PrintConv => { } }; + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + # use string value directly if no numerical value + $num = $val unless defined $num; + # add conversion for this value (replacing any existing entry) + $tagInfo->{PrintConv}->{$num} = length $val ? $val : $num; + if ($verbose) { + my %datParms; + if (length $val) { + %datParms = ( Start => $valPos, Size => length($val), Format => 'string' ); + } elsif ($numPos) { + %datParms = ( Start => $numPos + $i * 2, Size => 2, Format => 'int16u' ); + } + %datParms and $datParms{DataPt} = $dataPt, $datParms{DataPos} = $$dirInfo{DataPos}; + $et->VerboseInfo($tag, $tagInfo, Table=>$tagTablePtr, Value=>$num, %datParms); + } + $et->FoundTag($tagInfo, $num); + $valPos += length($val) + 1; + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Ricoh - Ricoh EXIF maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to +interpret Ricoh maker notes EXIF meta information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/ricoh_mn.html> + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Tim Gray for his help decoding a number of tags for the Ricoh GR. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Ricoh Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Samsung.pm b/lib/Image/ExifTool/Samsung.pm new file mode 100644 index 0000000..856d219 --- /dev/null +++ b/lib/Image/ExifTool/Samsung.pm @@ -0,0 +1,1747 @@ +#------------------------------------------------------------------------------ +# File: Samsung.pm +# +# Description: Samsung EXIF maker notes tags +# +# Revisions: 2010/03/01 - P. Harvey Created +# +# References: 1) Tae-Sun Park private communication +# 2) http://www.cybercom.net/~dcoffin/dcraw/ +# 3) Pascal de Bruijn private communication (NX100) +# 4) Jaroslav Stepanek via rt.cpan.org +# 5) Nick Livchits private communication +# 6) Sreerag Raghavan private communication (SM-C200) +# IB) Iliah Borg private communication (LibRaw) +# NJ) Niels Kristian Bech Jensen private communication +#------------------------------------------------------------------------------ + +package Image::ExifTool::Samsung; + +use strict; +use vars qw($VERSION %samsungLensTypes); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.52'; + +sub WriteSTMN($$$); +sub ProcessINFO($$$); +sub ProcessSamsungMeta($$$); +sub ProcessSamsungIFD($$$); +sub ProcessSamsung($$$); + +# Samsung LensType lookup +%samsungLensTypes = ( + # (added "Samsung NX" in all of these lens names - ref 4) + 0 => 'Built-in or Manual Lens', #PH (EX1, WB2000) + 1 => 'Samsung NX 30mm F2 Pancake', + 2 => 'Samsung NX 18-55mm F3.5-5.6 OIS', # (also version II, ref 1) + 3 => 'Samsung NX 50-200mm F4-5.6 ED OIS', + # what about the non-OIS version of the 18-55, + # which was supposed to be available before the 20-50? - PH + 4 => 'Samsung NX 20-50mm F3.5-5.6 ED', #PH/4 + 5 => 'Samsung NX 20mm F2.8 Pancake', #PH + 6 => 'Samsung NX 18-200mm F3.5-6.3 ED OIS', #4 + 7 => 'Samsung NX 60mm F2.8 Macro ED OIS SSA', #1 + 8 => 'Samsung NX 16mm F2.4 Pancake', #1/4 + 9 => 'Samsung NX 85mm F1.4 ED SSA', #4 + 10 => 'Samsung NX 45mm F1.8', #3 + 11 => 'Samsung NX 45mm F1.8 2D/3D', #3 + 12 => 'Samsung NX 12-24mm F4-5.6 ED', #4 + 13 => 'Samsung NX 16-50mm F2-2.8 S ED OIS', #forum3833 + 14 => 'Samsung NX 10mm F3.5 Fisheye', #NJ + 15 => 'Samsung NX 16-50mm F3.5-5.6 Power Zoom ED OIS', #5 + 20 => 'Samsung NX 50-150mm F2.8 S ED OIS', #PH + 21 => 'Samsung NX 300mm F2.8 ED OIS', #IB +); + +# range of values for Formats used in encrypted information +my %formatMinMax = ( + int16u => [ 0, 65535 ], + int32u => [ 0, 4294967295 ], + int16s => [ -32768, 32767 ], + int32s => [ -2147483648, 2147483647 ], +); + +# Samsung "STMN" maker notes (ref PH) +%Image::ExifTool::Samsung::Main = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&WriteSTMN, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + IS_OFFSET => [ 2 ], # tag 2 is 'IsOffset' + IS_SUBDIR => [ 11 ], + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + NOTES => q{ + Tags found in the binary "STMN" format maker notes written by a number of + Samsung models. + }, + 0 => { + Name => 'MakerNoteVersion', + Format => 'undef[8]', + }, + 2 => { + Name => 'PreviewImageStart', + OffsetPair => 3, # associated byte count tagID + DataTag => 'PreviewImage', + IsOffset => 3, + Protected => 2, + WriteGroup => 'MakerNotes', + }, + 3 => { + Name => 'PreviewImageLength', + OffsetPair => 2, # point to associated offset + DataTag => 'PreviewImage', + Protected => 2, + WriteGroup => 'MakerNotes', + }, + 11 => { + Name => 'SamsungIFD', + # Note: this is not always an IFD. In many models the string + # "Park Byeongchan" is found at this location + Condition => '$$valPt =~ /^[^\0]\0\0\0/', + Format => 'undef[$size - 44]', + SubDirectory => { TagTable => 'Image::ExifTool::Samsung::IFD' }, + }, +); + +%Image::ExifTool::Samsung::IFD = ( + PROCESS_PROC => \&ProcessSamsungIFD, + NOTES => q{ + This is a standard-format IFD found in the maker notes of some Samsung + models, except that the entry count is a 4-byte integer and the offsets are + relative to the end of the IFD. Currently, no tags in this IFD are known, + so the L<Unknown|../ExifTool.html#Unknown> (-u) or L<Verbose|../ExifTool.html#Verbose> (-v) option must be used to see this + information. + }, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + # 0x0001 - undef[4000|4100]: starts with "MN_PRV" (or all zeros) + # 0x0002 - undef[7000] : starts with "Kim Miae" + # 0x0003 - undef[5000] : starts with "Lee BK" + # 0x0004 - undef[500|2000] : starts with "IPCD" (or all zeros) + # 0x0006 - undef[100|200] : starts with "MN_ADS" (or all zeros) +); + +# Samsung maker notes (ref PH) +%Image::ExifTool::Samsung::Type2 = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + NOTES => 'Tags found in the EXIF-format maker notes of newer Samsung models.', + 0x0001 => { + Name => 'MakerNoteVersion', + Writable => 'undef', + Count => 4, + }, + 0x0002 => { + Name => 'DeviceType', + Groups => { 2 => 'Camera' }, + Writable => 'int32u', + PrintHex => 1, + PrintConv => { + 0x1000 => 'Compact Digital Camera', + 0x2000 => 'High-end NX Camera', + 0x3000 => 'HXM Video Camera', + 0x12000 => 'Cell Phone', + 0x300000 => 'SMX Video Camera', + }, + }, + 0x0003 => { + Name => 'SamsungModelID', + Groups => { 2 => 'Camera' }, + Writable => 'int32u', + PrintHex => 1, + PrintConv => { + 0x100101c => 'NX10', + 0x1001226 => 'HMX-S10BP', + 0x1001226 => 'HMX-S15BP', + 0x1001233 => 'HMX-Q10', + 0x1001234 => 'HMX-H300', + 0x1001234 => 'HMX-H304', + 0x100130c => 'NX100', + 0x1001327 => 'NX11', + 0x170104b => 'ES65, ES67 / VLUU ES65, ES67 / SL50', + 0x170104e => 'ES70, ES71 / VLUU ES70, ES71 / SL600', + 0x1701052 => 'ES73 / VLUU ES73 / SL605', + 0x1701055 => 'ES25, ES27 / VLUU ES25, ES27 / SL45', + 0x1701300 => 'ES28 / VLUU ES28', + 0x1701303 => 'ES74,ES75,ES78 / VLUU ES75,ES78', + 0x2001046 => 'PL150 / VLUU PL150 / TL210 / PL151', + 0x2001048 => 'PL100 / TL205 / VLUU PL100 / PL101', + 0x2001311 => 'PL120,PL121 / VLUU PL120,PL121', + 0x2001315 => 'PL170,PL171 / VLUUPL170,PL171', + 0x200131e => 'PL210, PL211 / VLUU PL210, PL211', + 0x2701317 => 'PL20,PL21 / VLUU PL20,PL21', + 0x2a0001b => 'WP10 / VLUU WP10 / AQ100', + 0x3000000 => 'Various Models (0x3000000)', + #0x3000000 => 'DV150F / DV151F / DV155F', + #0x3000000 => 'NX mini', + #0x3000000 => 'NX3000', + #0x3000000 => 'NX3300', + #0x3000000 => 'ST150F / ST151F / ST152F', + #0x3000000 => 'WB200F / WB201F / WB202F', + #0x3000000 => 'WB250F / WB251F / WB252F', + #0x3000000 => 'WB30F / WB31F / WB32F', + #0x3000000 => 'WB350F / WB351F / WB352F', + #0x3000000 => 'WB800F', + 0x3a00018 => 'Various Models (0x3a00018)', + #0x3a00018 => 'ES30 / VLUU ES30', + #0x3a00018 => 'ES80 / ES81', + #0x3a00018 => 'ES9 / ES8', + #0x3a00018 => 'PL200 / VLUU PL200', + #0x3a00018 => 'PL80 / VLUU PL80 / SL630 / PL81', + #0x3a00018 => 'PL90 / VLUU PL90', + #0x3a00018 => 'WB1100F / WB1101F / WB1102F', + #0x3a00018 => 'WB2200F', + 0x400101f => 'ST1000 / ST1100 / VLUU ST1000 / CL65', + 0x4001022 => 'ST550 / VLUU ST550 / TL225', + 0x4001025 => 'Various Models (0x4001025)', + #0x4001025 => 'DV300 / DV300F / DV305F', + #0x4001025 => 'ST500 / VLUU ST500 / TL220', + #0x4001025 => 'ST200 / ST200F / ST201 / ST201F / ST205F', + 0x400103e => 'VLUU ST5500, ST5500, CL80', + 0x4001041 => 'VLUU ST5000, ST5000, TL240', + 0x4001043 => 'ST70 / VLUU ST70 / ST71', + 0x400130a => 'Various Models (0x400130a)', + #0x400130a => 'VLUU ST100, ST100', + #0x400130a => 'VLUU ST600, ST600', + #0x400130a => 'VLUU ST80, ST80', + 0x400130e => 'ST90,ST91 / VLUU ST90,ST91', + 0x4001313 => 'VLUU ST95, ST95', + 0x4a00015 => 'VLUU ST60', + 0x4a0135b => 'ST30, ST65 / VLUU ST65 / ST67', + 0x5000000 => 'Various Models (0x5000000)', + #0x5000000 => 'EX2F', + #0x5000000 => 'NX1000', + #0x5000000 => 'NX20', + #0x5000000 => 'NX200', + #0x5000000 => 'NX210', + #0x5000000 => 'ST96', + #0x5000000 => 'WB750', + #0x5000000 => 'ST700', + 0x5001038 => 'Various Models (0x5001038)', + #0x5001038 => 'EK-GN120', + #0x5001038 => 'HMX-E10', + #0x5001038 => 'NX1', + #0x5001038 => 'NX2000', + #0x5001038 => 'NX30', + #0x5001038 => 'NX300', + #0x5001038 => 'NX500', + #0x5001038 => 'SM-C200', + #0x5001038 => 'WB2000', + 0x500103a => 'WB650 / VLUU WB650 / WB660', + 0x500103c => 'WB600 / VLUU WB600 / WB610', + 0x500133e => 'WB150 / WB150F / WB152 / WB152F / WB151', + 0x5a0000f => 'WB5000 / HZ25W', + 0x5a0001e => 'WB5500 / VLUU WB5500 / HZ50W', + 0x6001036 => 'EX1', + 0x700131c => 'VLUU SH100, SH100', + 0x27127002 => 'SMX-C20N', + }, + }, + # 0x0004 - undef[x] (SamsungContentsID?) + # 0x000a - int32u (ContinuousShotMode?) + # 0x000b - int16u (BestPhotoMode?) + # 0x000c - int32u ? values: 0,1 + # 0x000e - int32u[2] (SoundMultiPicture?) + # 0x0010 - rational64u ? values: undef,inf + 0x0011 => { #6 + Name => 'OrientationInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Samsung::OrientationInfo' }, + }, + 0x0020 => [{ #forum7685 + Name => 'SmartAlbumColor', + Condition => '$$valPt =~ /^\0{4}/', + Writable => 'int16u', + Count => 2, + PrintConv => { + '0 0' => 'n/a', + }, + },{ + Name => 'SmartAlbumColor', + Writable => 'int16u', + Count => 2, + PrintConv => [{ + 0 => 'Red', + 1 => 'Yellow', + 2 => 'Green', + 3 => 'Blue', + 4 => 'Magenta', + 5 => 'Black', + 6 => 'White', + 7 => 'Various', + }], + }], + 0x0021 => { #1 + Name => 'PictureWizard', + Writable => 'int16u', + SubDirectory => { TagTable => 'Image::ExifTool::Samsung::PictureWizard' }, + }, + # 0x0022 - int32u (CaptureMode?) (Gamma? eg. 65538 = 1.2, ref forum7720) + # 0x0023 - string: "0123456789" (PH) (placeholder for SerialNumber?) + # 0x0025 - int32u (ImageCount?) + # 0x002a - undef[4] (SNSDirectShare?) + # 0x002f - string (GPSInfo01?) + 0x0030 => { #1 (NX100 with GPS) + Name => 'LocalLocationName', + Groups => { 2 => 'Location' }, + Writable => 'string', + Format => 'undef', + # this contains 2 place names (in Korean if in Korea), separated by a null+space + # - terminate at double-null and replace nulls with newlines + ValueConv => '$val=~s/\0\0.*//; $val=~s/\0 */\n/g; $val', + ValueConvInv => '$val=~s/(\x0d\x0a|\x0d|\x0a)/\0 /g; $val . "\0\0"' + }, + 0x0031 => { #1 (NX100 with GPS) + Name => 'LocationName', + Groups => { 2 => 'Location' }, + Writable => 'string', + }, + # 0x0032 - string (GPSInfo03) + # 0x0033 - string (GPSInfo04) + # 0x0034 - string (GPSInfo05) + 0x0035 => [{ + Name => 'PreviewIFD', + Condition => '$$self{TIFF_TYPE} eq "SRW" and $$self{Model} ne "EK-GN120"', # (not an IFD in JPEG images) + Groups => { 1 => 'PreviewIFD' }, + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::PreviewIFD', + ByteOrder => 'Unknown', + Start => '$val', + }, + },{ + Name => 'PreviewIFD', + Condition => '$$self{TIFF_TYPE} eq "SRW"', # (not an IFD in JPEG images) + Groups => { 1 => 'PreviewIFD' }, + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Nikon::PreviewIFD', + ByteOrder => 'Unknown', + Start => '$val - 36', + }, + }], + # 0x003a - int16u[2] (SmartLensInfo?) + # 0x003b - int16u[2] (PhotoStyleSelectInfo?) + # 0x003c - int16u (SmartRange?) + # 0x003d - int16u[5] (SmartCropInfo?) + # 0x003e - int32u (DualCapture?) + # 0x003f - int16u[2] (SGIFInfo?) + 0x0040 => { #forum7432 + Name => 'RawDataByteOrder', + PrintConv => { + 0 => 'Little-endian (Intel, II)', + 1 => 'Big-endian (Motorola, MM)', #(NC) + }, + }, + 0x0041 => { #forum7684 + Name => 'WhiteBalanceSetup', + Writable => 'int32u', + PrintConv => { + 0 => 'Auto', + 1 => 'Manual', + }, + }, + 0x0043 => { #1 (NC) + Name => 'CameraTemperature', + Groups => { 2 => 'Camera' }, + Writable => 'rational64s', + # (DPreview samples all 0.2 C --> pre-production model) + PrintConv => '$val =~ /\d/ ? "$val C" : $val', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + # 0x0045 => { Name => 'RawCompressionMode', Writable => 'int32u' }, # (related to ExposureMode, not raw compresison? ref forum7432) + # 0x004a - int32u[7] (ImageVerification?) + # 0x004b - int32u[2] (RewindInfo?) + # 0x0050 - int32u (ColorSpace? - inconsistent) values: 1 (related to compression mode, ref forum7432) + 0x0050 => { #forum7432 + Name => 'RawDataCFAPattern', + PrintConv => { + 0 => 'Unchanged', + 1 => 'Swap', + 65535 => 'Roll', + }, + }, + # 0x0054 - int16u[2] (WeatherInfo?) + # 0x0060 - undef (AEInfo?) + # 0x0080 - undef (AFInfo?) + # 0x00a0 - undef[8192] (AWBInfo1): white balance information (ref 1): + # At byte 5788, the WBAdjust: "Adjust\0\X\0\Y\0\Z\xee\xea\xce\xab", where + # Y = BA adjust (0=Blue7, 7=0, 14=Amber7), Z = MG (0=Magenta7, 7=0, 14=Green7) + # 0x00a1 - undef (AWBInfo2?) + # 0x00c0 - undef (IPCInfo?) + # 0x00c7 - undef (SmartFunctionInfo?) + # 0x00e0 - int16u (SceneResult?) + # 0x00e1 - int16u[8] (SADebugInfo01?) + # 0x00e1 - int16u[x] (SADebugInfo02?) + 0x0100 => { + Name => 'FaceDetect', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'On' }, #(NC) + }, + # 0x0101 - int16u[6] (FaceDetectInfo?) + # 0x0102 - int16u[x] (FaceDetectInfo?) + 0x0120 => { + Name => 'FaceRecognition', + Writable => 'int32u', + PrintConv => { 0 => 'Off', 1 => 'On' }, #(NC) + }, + 0x0123 => { Name => 'FaceName', Writable => 'string' }, + # 0x140 - undef (LensInfo?) +# +# the following tags found only in SRW images +# + # 0xa000 - rational64u: 1 or 1.1 (ref PH) (MakerNoteVersion?) + 0xa001 => { #1 + Name => 'FirmwareName', + Groups => { 2 => 'Camera' }, + Writable => 'string', + }, + 0xa002 => { #PH/IB + Name => 'SerialNumber', + Condition => '$$valPt =~ /^\w{5}/', # should be at least 5 characters long + Groups => { 2 => 'Camera' }, + Writable => 'string', + }, + 0xa003 => { #1 (SRW images only) + Name => 'LensType', + Groups => { 2 => 'Camera' }, + Writable => 'int16u', + Count => -1, + PrintConv => [ \%samsungLensTypes ], + }, + 0xa004 => { #1 + Name => 'LensFirmware', + Groups => { 2 => 'Camera' }, + Writable => 'string', + }, + 0xa005 => { + Name => 'InternalLensSerialNumber', # Not the printed serial number (ref 1) + Groups => { 2 => 'Camera' }, + Writable => 'string', + }, + 0xa010 => { #1 + Name => 'SensorAreas', + Groups => { 2 => 'Camera' }, + Notes => 'full and valid sensor areas', + Writable => 'int32u', + Count => 8, + }, + 0xa011 => { #1 + Name => 'ColorSpace', + Writable => 'int16u', + PrintConv => { + 0 => 'sRGB', + 1 => 'Adobe RGB', + }, + }, + 0xa012 => { #1 + Name => 'SmartRange', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0xa013 => { #1 + Name => 'ExposureCompensation', + Writable => 'rational64s', + }, + 0xa014 => { #1 + Name => 'ISO', + Writable => 'int32u', + }, + 0xa018 => { #1 + Name => 'ExposureTime', + Writable => 'rational64u', + ValueConv => '$val=~s/ .*//; $val', # some models write 2 values here + ValueConvInv => '$val', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => '$val', + }, + 0xa019 => { #1 + Name => 'FNumber', + Priority => 0, + Writable => 'rational64u', + ValueConv => '$val=~s/ .*//; $val', # some models write 2 values here + ValueConvInv => '$val', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0xa01a => { #1 + Name => 'FocalLengthIn35mmFormat', + Groups => { 2 => 'Camera' }, + Priority => 0, + Format => 'int32u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + # 0xa01b - int32u (ImageCount?) + # 0xa01b - int16u (LDCLens?) + 0xa020 => { #1 + Name => 'EncryptionKey', + Writable => 'int32u', + Count => 11, + Protected => 1, + DataMember => 'EncryptionKey', + RawConv => '$$self{EncryptionKey} = [ split(" ",$val) ]; $val', + Notes => 'key used to decrypt the tags below', + # value is "305 72 737 456 282 307 519 724 13 505 193" + }, + 0xa021 => { #1 + Name => 'WB_RGGBLevelsUncorrected', + Writable => 'int32u', + Count => 4, + Notes => 'these tags not corrected for WB_RGGBLevelsBlack', + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)', + }, + 0xa022 => { #1 + Name => 'WB_RGGBLevelsAuto', + Writable => 'int32u', + Count => 4, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-4)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,4)', + }, + 0xa023 => { #1 + Name => 'WB_RGGBLevelsIlluminator1', + Writable => 'int32u', + Count => 4, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-8)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,8)', + }, + 0xa024 => { #1 + Name => 'WB_RGGBLevelsIlluminator2', + Writable => 'int32u', + Count => 4, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-1)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,1)', + }, + 0xa025 => { # (PostAEGain?) + Name => 'DigitalGain', #IB + Writable => 'int32u', + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,6)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-6)', + }, + 0xa025 => { #IB + Name => 'HighlightLinearityLimit', + Writable => 'int32u', + }, + 0xa028 => { #2/PH + Name => 'WB_RGGBLevelsBlack', + Writable => 'int32s', + Count => 4, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)', + }, + 0xa030 => { #1 + Name => 'ColorMatrix', + Writable => 'int32s', + Count => 9, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', + }, + 0xa031 => { #1 + Name => 'ColorMatrixSRGB', + Writable => 'int32s', + Count => 9, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', + }, + 0xa032 => { #1 + Name => 'ColorMatrixAdobeRGB', + Writable => 'int32s', + Count => 9, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', + }, + 0xa033 => { #1 + Name => 'CbCrMatrixDefault', + Writable => 'int32s', + Count => 4, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', + }, + 0xa034 => { #1 + Name => 'CbCrMatrix', + Writable => 'int32s', + Count => 4, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,4)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-4)', + }, + 0xa035 => { #1 + Name => 'CbCrGainDefault', + Writable => 'int32u', + Count => 2, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)', + }, + 0xa036 => { #1 + Name => 'CbCrGain', + Writable => 'int32u', + Count => 2, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-2)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,2)', + }, + 0xa040 => { #1 + Name => 'ToneCurveSRGBDefault', + Writable => 'int32u', + Count => 23, + Notes => q{ + first value gives the number of tone curve entries. This is followed by an + array of X coordinates then an array of Y coordinates + }, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', + }, + 0xa041 => { #1 + Name => 'ToneCurveAdobeRGBDefault', + Writable => 'int32u', + Count => 23, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', + }, + 0xa042 => { #1 + Name => 'ToneCurveSRGB', + Writable => 'int32u', + Count => 23, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', + }, + 0xa043 => { #1 + Name => 'ToneCurveAdobeRGB', + Writable => 'int32u', + Count => 23, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', + }, + 0xa048 => { #1 + Name => 'RawData', + Unknown => 1, + Writable => 'int32s', + Count => 12, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', + }, + 0xa050 => { #1 + Name => 'Distortion', + Unknown => 1, + Writable => 'int32s', + Count => 8, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', + }, + 0xa051 => { #1 + Name => 'ChromaticAberration', + Unknown => 1, + Writable => 'int16u', + Count => 22, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",-7,-3)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,7,3)', + }, + 0xa052 => { #1 + Name => 'Vignetting', + Unknown => 1, + Writable => 'int16u', + Count => 15, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', + }, + 0xa053 => { #1 + Name => 'VignettingCorrection', + Unknown => 1, + Writable => 'int16u', + Count => 15, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', + }, + 0xa054 => { #1 + Name => 'VignettingSetting', + Unknown => 1, + Writable => 'int16u', + Count => 15, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', + }, + 0xa055 => { #1 + Name => 'Samsung_Type2_0xa055', # (DistortionCamera1st?) + Unknown => 1, + Hidden => 1, + Writable => 'int32s', + Count => 8, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,8)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-8)', + }, + 0xa056 => { #1 + Name => 'Samsung_Type2_0xa056', # (DistortionCamera2nd?) + Unknown => 1, + Hidden => 1, + Writable => 'int32s', + Count => 8, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,5)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-5)', + }, + 0xa057 => { #1 + Name => 'Samsung_Type2_0xa057', # (DistortionCameraSetting?) + Unknown => 1, + Hidden => 1, + Writable => 'int32s', + Count => 8, + RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,2)', + RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-2)', + }, + # 0xa060 - rational64u (CISTemperature?) + # 0xa061 - int16u (Compression?) +); + +# orientation information (ref 6) +%Image::ExifTool::Samsung::OrientationInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'rational64s', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Camera orientation information written by the Gear 360 (SM-C200).', + 0 => { + Name => 'YawAngle', #(NC) + Unknown => 1, + Notes => 'always zero', + }, + 1 => { + Name => 'PitchAngle', + Notes => 'upward tilt of rear camera in degrees', + }, + 2 => { + Name => 'RollAngle', + Notes => 'clockwise rotation of rear camera in degrees', + }, +); + +# Picture Wizard information (ref 1) +%Image::ExifTool::Samsung::PictureWizard = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'int16u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => { + Name => 'PictureWizardMode', + PrintConvColumns => 3, + PrintConv => { #3 + 0 => 'Standard', + 1 => 'Vivid', + 2 => 'Portrait', + 3 => 'Landscape', + 4 => 'Forest', + 5 => 'Retro', + 6 => 'Cool', + 7 => 'Calm', + 8 => 'Classic', + 9 => 'Custom1', + 10 => 'Custom2', + 11 => 'Custom3', + 255 => 'n/a', #PH + }, + }, + 1 => 'PictureWizardColor', + 2 => { + Name => 'PictureWizardSaturation', + ValueConv => '$val - 4', + ValueConvInv => '$val + 4', + }, + 3 => { + Name => 'PictureWizardSharpness', + ValueConv => '$val - 4', + ValueConvInv => '$val + 4', + }, + 4 => { + Name => 'PictureWizardContrast', + ValueConv => '$val - 4', + ValueConvInv => '$val + 4', + }, +); + +# INFO tags in Samsung MP4 videos (ref PH) +%Image::ExifTool::Samsung::INFO = ( + PROCESS_PROC => \&ProcessINFO, + GROUPS => { 0 => 'MakerNotes', 2 => 'Video' }, + NOTES => q{ + This information is found in MP4 videos from Samsung models such as the + SMX-C20N. + }, + EFCT => 'Effect', # (guess) + QLTY => 'Quality', + # MDEL - value: 0 + # ASPT - value: 1, 2 +); + +# Samsung MP4 TAGS information (PH - from WP10 sample) +# --> very similar to Sanyo MP4 information +%Image::ExifTool::Samsung::MP4 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + This information is found in Samsung MP4 videos from models such as the + WP10. + }, + 0x00 => { + Name => 'Make', + Format => 'string[24]', + PrintConv => 'ucfirst(lc($val))', + }, + 0x18 => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[16]', + }, + 0x2e => { #(NC) + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val ? 10 / $val : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x32 => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x3a => { #(NC) + Name => 'ExposureCompensation', + Format => 'rational64s', + PrintConv => '$val ? sprintf("%+.1f", $val) : 0', + }, + 0x6a => { + Name => 'ISO', + Format => 'int32u', + }, + 0x7d => { + Name => 'Software', + Format => 'string[32]', + # (these tags are not at a constant offset for Olympus/Sanyo videos, + # so just to be safe use this to validate subsequent tags) + RawConv => q{ + $val =~ /^SAMSUNG/ or return undef; + $$self{SamsungMP4} = 1; + return $val; + }, + }, + 0xf4 => { + Name => 'Thumbnail', + Condition => '$$self{SamsungMP4}', + SubDirectory => { + TagTable => 'Image::ExifTool::Samsung::Thumbnail', + Base => '$start', + }, + }, +); + +# thumbnail image information found in MP4 videos (similar in Olympus,Samsung,Sanyo) +%Image::ExifTool::Samsung::Thumbnail = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + FORMAT => 'int32u', + 1 => 'ThumbnailWidth', + 2 => 'ThumbnailHeight', + 3 => 'ThumbnailLength', + 4 => { Name => 'ThumbnailOffset', IsOffset => 1 }, +); + +# Samsung MP4 @sec information (PH - from WB30F sample) +%Image::ExifTool::Samsung::sec = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + This information is found in the @sec atom of Samsung MP4 videos from models + such as the WB30F. + }, + 0x00 => { + Name => 'Make', + Format => 'string[32]', + PrintConv => 'ucfirst(lc($val))', + }, + 0x20 => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[32]', + }, + 0x200 => { Name => 'ThumbnailWidth', Format => 'int32u' }, + 0x204 => { Name => 'ThumbnailHeight', Format => 'int32u' }, + 0x208 => { Name => 'ThumbnailLength', Format => 'int32u' }, # (2 bytes too long in my sample) + 0x20c => { + Name => 'ThumbnailImage', + Groups => { 2 => 'Preview' }, + Format => 'undef[$val{0x208}]', + Notes => 'the THM image, embedded metadata is extracted as the first sub-document', + SetBase => 1, + RawConv => q{ + my $pt = $self->ValidateImage(\$val, $tag); + if ($pt) { + $$self{BASE} += 0x20c; + $$self{DOC_NUM} = ++$$self{DOC_COUNT}; + $self->ExtractInfo($pt, { ReEntry => 1 }); + $$self{DOC_NUM} = 0; + } + return $pt; + }, + }, +); + +# Samsung MP4 smta information (PH - from SM-C101 sample) +%Image::ExifTool::Samsung::smta = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Video' }, + NOTES => q{ + This information is found in the smta atom of Samsung MP4 videos from models + such as the Galaxy S4. + }, + svss => { + Name => 'SamsungSvss', + SubDirectory => { TagTable => 'Image::ExifTool::Samsung::svss' }, + }, + # swtr - 4 bytes, all zero + # scid - 8 bytes, all zero + # saut - 4 bytes, all zero +); + +# Samsung MP4 svss information (PH - from SM-C101 sample) +%Image::ExifTool::Samsung::svss = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Video' }, + NOTES => q{ + This information is found in the svss atom of Samsung MP4 videos from models + such as the Galaxy S4. + }, + # junk - 10240 bytes, all zero +); + +# thumbnail image information found in some MP4 videos +%Image::ExifTool::Samsung::Thumbnail2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + FORMAT => 'int32u', + 1 => 'ThumbnailWidth', + 2 => 'ThumbnailHeight', + 3 => 'ThumbnailLength', + 4 => { Name => 'ThumbnailOffset', IsOffset => 1 }, +); + +# information extracted from "ssuniqueid\0" APP5 (ref PH) +%Image::ExifTool::Samsung::APP5 = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + ssuniqueid => { + Name => 'UniqueID', + # 32 bytes - some sort of serial number? + ValueConv => 'unpack("H*",$val)', + }, +); + +# information extracted from Samsung trailer (ie. Samsung SM-T805 "Sound & Shot" JPEG) (ref PH) +%Image::ExifTool::Samsung::Trailer = ( + GROUPS => { 0 => 'MakerNotes', 2 => 'Other' }, + VARS => { NO_ID => 1, HEX_ID => 0 }, + PROCESS_PROC => \&ProcessSamsung, + PRIORITY => 0, # (first one takes priority so DepthMapWidth/Height match first DepthMapData) + NOTES => q{ + Tags extracted from the trailer of JPEG images written when using certain + features (such as "Sound & Shot" or "Shot & More") from Samsung models such + as the Galaxy S4 and Tab S, and from the 'sefd' atom in HEIC images from the + Samsung S10+. + }, + '0x0001-name' => { + Name => 'EmbeddedImageName', # ("DualShot_1","DualShot_2") + RawConv => '$$self{EmbeddedImageName} = $val', + }, + '0x0001' => [ + { + Name => 'EmbeddedImage', + Condition => '$$self{EmbeddedImageName} eq "DualShot_1"', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + { + Name => 'EmbeddedImage2', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + ], + '0x0100-name' => 'EmbeddedAudioFileName', # ("SoundShot_000") + '0x0100' => { Name => 'EmbeddedAudioFile', Groups => { 2 => 'Audio' }, Binary => 1 }, + '0x0201-name' => 'SurroundShotVideoName', # ("Interactive_Panorama_000") + '0x0201' => { Name => 'SurroundShotVideo', Groups => { 2 => 'Video' }, Binary => 1 }, + # 0x0800-name - seen 'SoundShot_Meta_Info' + # 0x0800 - unknown (29 bytes) (contains already-extracted EmbeddedAudioFileName) + # 0x0830-name - seen '1165724808.pre' + # 0x0830 - unknown (164004 bytes) + # 0x08d0-name - seen 'Interactive_Panorama_Info' + # 0x08d0 - unknown (7984 bytes) + # 0x08e0-name - seen 'Panorama_Shot_Info' + # 0x08e0 - string, seen 'PanoramaShot' + # 0x08e1-name - seen 'Motion_Panorama_Info' + # 0x0910-name - seen 'Front_Cam_Selfie_Info' + # 0x0910 - string, seen 'Front_Cam_Selfie_Info' + # 0x09e0-name - seen 'Burst_Shot_Info' + # 0x09e0 - string, seen '489489125' + # 0x0a01-name - seen 'Image_UTC_Data' + '0x0a01' => { #forum7161 + Name => 'TimeStamp', + Groups => { 2 => 'Time' }, + ValueConv => 'ConvertUnixTime($val / 1e3, 1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + '0x0a20-name' => 'DualCameraImageName', # ("FlipPhoto_002") + '0x0a20' => { Name => 'DualCameraImage', Groups => { 2 => 'Preview' }, Binary => 1 }, + '0x0a30-name' => 'EmbeddedVideoType', # ("MotionPhoto_Data") + '0x0a30' => { Name => 'EmbeddedVideoFile', Groups => { 2 => 'Video' }, Binary => 1 }, #forum7161 + # 0x0aa1-name - seen 'MCC_Data' + # 0x0aa1 - seen '204','222','234','302','429' + '0x0aa1' => { + Name => 'MCCData', + Groups => { 2 => 'Location' }, + PrintConv => { + 202 => 'Greece', + 204 => 'Netherlands', + 206 => 'Belgium', + 208 => 'France', + 212 => 'Monaco', + 213 => 'Andorra', + 214 => 'Spain', + 216 => 'Hungary', + 218 => 'Bosnia & Herzegov.', + 219 => 'Croatia', + 220 => 'Serbia', + 221 => 'Kosovo', + 222 => 'Italy', + 226 => 'Romania', + 228 => 'Switzerland', + 230 => 'Czech Rep.', + 231 => 'Slovakia', + 232 => 'Austria', + 234 => 'United Kingdom', + 235 => 'United Kingdom', + 238 => 'Denmark', + 240 => 'Sweden', + 242 => 'Norway', + 244 => 'Finland', + 246 => 'Lithuania', + 247 => 'Latvia', + 248 => 'Estonia', + 250 => 'Russian Federation', + 255 => 'Ukraine', + 257 => 'Belarus', + 259 => 'Moldova', + 260 => 'Poland', + 262 => 'Germany', + 266 => 'Gibraltar', + 268 => 'Portugal', + 270 => 'Luxembourg', + 272 => 'Ireland', + 274 => 'Iceland', + 276 => 'Albania', + 278 => 'Malta', + 280 => 'Cyprus', + 282 => 'Georgia', + 283 => 'Armenia', + 284 => 'Bulgaria', + 286 => 'Turkey', + 288 => 'Faroe Islands', + 289 => 'Abkhazia', + 290 => 'Greenland', + 292 => 'San Marino', + 293 => 'Slovenia', + 294 => 'Macedonia', + 295 => 'Liechtenstein', + 297 => 'Montenegro', + 302 => 'Canada', + 308 => 'St. Pierre & Miquelon', + 310 => 'United States / Guam', + 311 => 'United States / Guam', + 312 => 'United States', + 316 => 'United States', + 330 => 'Puerto Rico', + 334 => 'Mexico', + 338 => 'Jamaica', + 340 => 'French Guiana / Guadeloupe / Martinique', + 342 => 'Barbados', + 344 => 'Antigua and Barbuda', + 346 => 'Cayman Islands', + 348 => 'British Virgin Islands', + 350 => 'Bermuda', + 352 => 'Grenada', + 354 => 'Montserrat', + 356 => 'Saint Kitts and Nevis', + 358 => 'Saint Lucia', + 360 => 'St. Vincent & Gren.', + 362 => 'Bonaire, Sint Eustatius and Saba / Curacao / Netherlands Antilles', + 363 => 'Aruba', + 364 => 'Bahamas', + 365 => 'Anguilla', + 366 => 'Dominica', + 368 => 'Cuba', + 370 => 'Dominican Republic', + 372 => 'Haiti', + 374 => 'Trinidad and Tobago', + 376 => 'Turks and Caicos Islands / US Virgin Islands', + 400 => 'Azerbaijan', + 401 => 'Kazakhstan', + 402 => 'Bhutan', + 404 => 'India', + 405 => 'India', + 410 => 'Pakistan', + 412 => 'Afghanistan', + 413 => 'Sri Lanka', + 414 => 'Myanmar (Burma)', + 415 => 'Lebanon', + 416 => 'Jordan', + 417 => 'Syrian Arab Republic', + 418 => 'Iraq', + 419 => 'Kuwait', + 420 => 'Saudi Arabia', + 421 => 'Yemen', + 422 => 'Oman', + 424 => 'United Arab Emirates', + 425 => 'Israel / Palestinian Territory', + 426 => 'Bahrain', + 427 => 'Qatar', + 428 => 'Mongolia', + 429 => 'Nepal', + 430 => 'United Arab Emirates', + 431 => 'United Arab Emirates', + 432 => 'Iran', + 434 => 'Uzbekistan', + 436 => 'Tajikistan', + 437 => 'Kyrgyzstan', + 438 => 'Turkmenistan', + 440 => 'Japan', + 441 => 'Japan', + 450 => 'South Korea', + 452 => 'Viet Nam', + 454 => 'Hongkong, China', + 455 => 'Macao, China', + 456 => 'Cambodia', + 457 => 'Laos P.D.R.', + 460 => 'China', + 466 => 'Taiwan', + 467 => 'North Korea', + 470 => 'Bangladesh', + 472 => 'Maldives', + 502 => 'Malaysia', + 505 => 'Australia', + 510 => 'Indonesia', + 514 => 'Timor-Leste', + 515 => 'Philippines', + 520 => 'Thailand', + 525 => 'Singapore', + 528 => 'Brunei Darussalam', + 530 => 'New Zealand', + 537 => 'Papua New Guinea', + 539 => 'Tonga', + 540 => 'Solomon Islands', + 541 => 'Vanuatu', + 542 => 'Fiji', + 544 => 'American Samoa', + 545 => 'Kiribati', + 546 => 'New Caledonia', + 547 => 'French Polynesia', + 548 => 'Cook Islands', + 549 => 'Samoa', + 550 => 'Micronesia', + 552 => 'Palau', + 553 => 'Tuvalu', + 555 => 'Niue', + 602 => 'Egypt', + 603 => 'Algeria', + 604 => 'Morocco', + 605 => 'Tunisia', + 606 => 'Libya', + 607 => 'Gambia', + 608 => 'Senegal', + 609 => 'Mauritania', + 610 => 'Mali', + 611 => 'Guinea', + 612 => 'Ivory Coast', + 613 => 'Burkina Faso', + 614 => 'Niger', + 615 => 'Togo', + 616 => 'Benin', + 617 => 'Mauritius', + 618 => 'Liberia', + 619 => 'Sierra Leone', + 620 => 'Ghana', + 621 => 'Nigeria', + 622 => 'Chad', + 623 => 'Central African Rep.', + 624 => 'Cameroon', + 625 => 'Cape Verde', + 626 => 'Sao Tome & Principe', + 627 => 'Equatorial Guinea', + 628 => 'Gabon', + 629 => 'Congo, Republic', + 630 => 'Congo, Dem. Rep.', + 631 => 'Angola', + 632 => 'Guinea-Bissau', + 633 => 'Seychelles', + 634 => 'Sudan', + 635 => 'Rwanda', + 636 => 'Ethiopia', + 637 => 'Somalia', + 638 => 'Djibouti', + 639 => 'Kenya', + 640 => 'Tanzania', + 641 => 'Uganda', + 642 => 'Burundi', + 643 => 'Mozambique', + 645 => 'Zambia', + 646 => 'Madagascar', + 647 => 'Reunion', + 648 => 'Zimbabwe', + 649 => 'Namibia', + 650 => 'Malawi', + 651 => 'Lesotho', + 652 => 'Botswana', + 653 => 'Swaziland', + 654 => 'Comoros', + 655 => 'South Africa', + 657 => 'Eritrea', + 659 => 'South Sudan', + 702 => 'Belize', + 704 => 'Guatemala', + 706 => 'El Salvador', + 708 => 'Honduras', + 710 => 'Nicaragua', + 712 => 'Costa Rica', + 714 => 'Panama', + 716 => 'Peru', + 722 => 'Argentina Republic', + 724 => 'Brazil', + 730 => 'Chile', + 732 => 'Colombia', + 734 => 'Venezuela', + 736 => 'Bolivia', + 738 => 'Guyana', + 740 => 'Ecuador', + 744 => 'Paraguay', + 746 => 'Suriname', + 748 => 'Uruguay', + 750 => 'Falkland Islands (Malvinas)', + 901 => 'International Networks / Satellite Networks', + }, + }, + # 0x0ab0-name - seen 'DualShot_Meta_Info' + '0x0ab1-name' => { + Name => 'DepthMapName', + # seen 'DualShot_DepthMap_1' (SM-N950U), DualShot_DepthMap_5 (SM-G998W) + RawConv => '$$self{DepthMapName} = $val', + }, + '0x0ab1' => [ + { + Name => 'DepthMapData', + Condition => '$$self{DepthMapName} eq "DualShot_DepthMap_1"', + Binary => 1, + },{ + Name => 'DepthMapData2', + Binary => 1, + }, + ], + # 0x0ab3-name - seen 'DualShot_Extra_Info' (SM-N950U) + '0x0ab3' => { # (SM-N950U) + Name => 'DualShotExtra', + SubDirectory => { TagTable => 'Image::ExifTool::Samsung::DualShotExtra' }, + }, + # 0x0ac0-name - seen 'ZoomInOut_Info' (SM-N950U) + # 0x0ac0 - 2048 bytes of interesting stuff including firmware version? (SM-N950U) + '0x0b40' => { # (SM-N975X front camera) + Name => 'SingleShotMeta', + SubDirectory => { TagTable => 'Image::ExifTool::Samsung::SingleShotMeta' }, + }, + # 0x0b41-name - seen 'SingeShot_DepthMap_1' (Yes, "Singe") (SM-N975X front camera) + '0x0b41' => { Name => 'SingleShotDepthMap', Binary => 1 }, + # 0xa050-name - seen 'Jpeg360_2D_Info' (Samsung Gear 360) + # 0xa050 - seen 'Jpeg3602D' (Samsung Gear 360) +); + +# DualShot Extra Info (ref PH) +%Image::ExifTool::Samsung::DualShotExtra = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + FIRST_ENTRY => 0, + FORMAT => 'int32u', + # This is a pain, but the DepthMapWidth/Height move around in this record. + # In all of my samples so far, the bytes "01 00 ff ff" precede these tags. + # I have seen this byte sequence at offsets 32, 60, 64 and 68, so look for + # it in bytes 32-95, and use its location to adjust the tag positions + 8 => { + Name => 'DualShotDummy', + Format => 'undef[64]', + Hidden => 1, + Hook => q{ + if ($size >= 96) { + my $tmp = substr($$dataPt, $pos, 64); + # (have seen 0x01,0x03 and 0x07) + if ($tmp =~ /[\x01-\x09]\0\xff\xff/g and not pos($tmp) % 4) { + $$self{DepthMapTagPos} = pos($tmp); + $varSize += $$self{DepthMapTagPos} - 32; + } + } + }, + RawConv => 'undef', # not a real tag + }, + 16 => { + Name => 'DepthMapWidth', + Condition => '$$self{DepthMapTagPos}', + Notes => 'index varies depending on model', + }, + 17 => { + Name => 'DepthMapHeight', + Condition => '$$self{DepthMapTagPos}', + Notes => 'index varies depending on model', + }, +); + +# SingleShot Meta Info (ref PH) (SM-N975X front camera) +%Image::ExifTool::Samsung::SingleShotMeta = ( + PROCESS_PROC => \&ProcessSamsungMeta, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + inputWidth => { }, + inputHeight => { }, + outputWidth => { }, + outputHeight => { }, + segWidth => { }, + segHeight => { }, + depthSWWidth => { }, + depthSWHeight => { }, + depthHWWidth => { }, + depthHWHeight => { }, + flipStatus => { }, + lensFacing => { }, + deviceOrientation => { }, + objectOrientation => { }, + isArtBokeh => { }, + beautyRetouchLevel => { }, + beautyColorLevel => { }, + effectType => { }, + effectStrength => { }, + blurStrength => { }, + spinStrength => { }, + zoomStrength => { }, + colorpopStrength => { }, + monoStrength => { }, + sidelightStrength => { }, + vintageStrength => { }, + bokehShape => { }, + perfMode => { }, +); + +# Samsung composite tags +%Image::ExifTool::Samsung::Composite = ( + GROUPS => { 2 => 'Image' }, + WB_RGGBLevels => { + Require => { + 0 => 'WB_RGGBLevelsUncorrected', + 1 => 'WB_RGGBLevelsBlack', + }, + ValueConv => q{ + my @a = split ' ', $val[0]; + my @b = split ' ', $val[1]; + $a[$_] -= $b[$_] foreach 0..$#a; + return "@a"; + }, + }, + DepthMapTiff => { + Require => { + 0 => 'DepthMapData', + 1 => 'DepthMapWidth', + 2 => 'DepthMapHeight', + }, + ValueConv => q{ + return undef unless length ${$val[0]} == $val[1] * $val[2]; + my $tiff = MakeTiffHeader($val[1],$val[2],1,8) . ${$val[0]}; + return \$tiff; + }, + }, + SingleShotDepthMapTiff => { + Require => { + 0 => 'SingleShotDepthMap', + 1 => 'SegWidth', + 2 => 'SegHeight', + }, + ValueConv => q{ + return undef unless length ${$val[0]} == $val[1] * $val[2]; + my $tiff = MakeTiffHeader($val[1],$val[2],1,8) . ${$val[0]}; + return \$tiff; + }, + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::Samsung'); + +#------------------------------------------------------------------------------ +# Encrypt/Decrypt NX10 information +# Inputs: 0) ExifTool ref, 1) value as a string of integers, +# 2) tagInfo hash ref, 3-N) encryption salt values +# Returns: encrypted/decrypted value +# Notes: +# 1) The encryption salt starts with '-' to reverse the encryption algorithm +# 2) Additional salt values are provided when tag stores multiple arrays +# (in which case the first value of the tag gives the array length) +sub Crypt($$$@) +{ + my ($et, $val, $tagInfo, @salt) = @_; + my $key = $$et{EncryptionKey} or return undef; + my $format = $$tagInfo{Writable} || $$tagInfo{Format} or return undef; + return undef unless $formatMinMax{$format}; + my ($min, $max) = @{$formatMinMax{$format}}; + my @a = split ' ', $val; + my $newSalt = (@salt > 1) ? 1 : 0; # skip length entry if this is an array + my ($i, $sign, $salt, $start); + for ($i=$newSalt; $i<@a; ++$i) { + if ($i == $newSalt) { + $start = $i; + $salt = shift @salt; + $sign = ($salt =~ s/^-//) ? -1 : 1; + $newSalt += $a[0] if @salt; + } + $a[$i] += $sign * $$key[($salt+$i-$start) % scalar(@$key)]; + # handle integer wrap-around + if ($sign > 0) { + $a[$i] -= $max - $min + 1 if $a[$i] > $max; + } else { + $a[$i] += $max - $min + 1 if $a[$i] < $min; + } + } + return "@a"; +} + +#------------------------------------------------------------------------------ +# Process Samsung MP4 INFO data +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessINFO($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $len = $$dirInfo{DirLen}; + my $end = $pos + $len; + $et->VerboseDir('INFO', undef, $len); + while ($pos + 8 <= $end) { + my $tag = substr($$dataPt, $pos, 4); + my $val = Get32u($dataPt, $pos + 4); + unless ($$tagTablePtr{$tag}) { + my $name = "Samsung_INFO_$tag"; + $name =~ tr/-_0-9a-zA-Z//dc; + AddTagToTable($tagTablePtr, $tag, { Name => $name }) if $name; + } + $et->HandleTag($tagTablePtr, $tag, $val); + $pos += 8; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Read Samsung Meta Info from trailer +# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref +# Returns: true on success +sub ProcessSamsungMeta($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dirName = $$dirInfo{DirName}; + my $dataPt = $$dirInfo{DataPt}; + my $pos = $$dirInfo{DirStart}; + my $end = $$dirInfo{DirLen} + $pos; + unless ($pos + 8 <= $end and substr($$dataPt, $pos, 4) eq 'DOFS') { + $et->Warn("Unrecognized $dirName data"); + return 0; + } + my $ver = Get32u($dataPt, $pos + 4); + if ($ver == 3) { + unless ($pos + 18 <= $end and Get32u($dataPt, $pos + 12) == $$dirInfo{DirLen}) { + $et->Warn("Unrecognized $dirName version $ver data"); + return 0; + } + my $num = Get16u($dataPt, $pos + 16); + $et->VerboseDir("$dirName version $ver", $num); + $pos += 18; + my ($i, $val); + for ($i=0; $i<$num; ++$i) { + last if $pos + 2 > $end; + my ($x, $n) = unpack("x${pos}CC", $$dataPt); + $pos += 2; + last if $pos + $n + 2 > $end; + my $tag = substr($$dataPt, $pos, $n); + my $len = Get16u($dataPt, $pos + $n); + $pos += $n + 2; + last if $pos + $len > $end; + if ($len == 4) { + $val = Get32u($dataPt, $pos); + } else { + my $tmp = substr($$dataPt, $pos, $len); + $val = \$pos; + } + $et->HandleTag($tagTablePtr, $tag, $val); + $pos += $len; + } + $et->Warn("Unexpected end of $dirName version $ver $i $num data") if $i < $num; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref +# Returns: true on success +sub ProcessSamsungIFD($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $len = $$dirInfo{DataLen}; + my $pos = $$dirInfo{DirStart}; + return 0 unless $pos + 4 < $len; + my $dataPt = $$dirInfo{DataPt}; + my $buff = substr($$dataPt, $pos, 4); + # this is not an IFD for many models + # (the string "Park Byeongchan" is often found here) + return 0 unless $buff =~ s/^([^\0])\0\0\0/$1\0$1\0/s; + my $numEntries = ord $1; + if ($$et{HTML_DUMP}) { + my $pt = $$dirInfo{DirStart} + $$dirInfo{DataPos} + $$dirInfo{Base}; + $et->HDump($pt-44, 44, "MakerNotes header", 'Samsung'); + $et->HDump($pt, 4, "MakerNotes entries", "Format: int32u\nEntry count: $numEntries"); + $$dirInfo{NoDumpEntryCount} = 1; + } + substr($$dataPt, $pos, 4) = $buff; # insert bogus 2-byte entry count + # offset base is at end of IFD + my $shift = $$dirInfo{DirStart} + 4 + $numEntries * 12 + 4; + $$dirInfo{Base} += $shift; + $$dirInfo{DataPos} -= $shift; + $$dirInfo{DirStart} += 2; # start at bogus entry count + $$dirInfo{ZeroOffsetOK} = 1; # disable check for zero offset + delete $$et{NO_UNKNOWN}; # (set for BinaryData, but not for EXIF IFD's) + my $rtn = Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr); + substr($$dataPt, $pos + 2, 1) = "\0"; # remove bogus count + return $rtn; +} + +#------------------------------------------------------------------------------ +# Read/write Samsung trailer (ie. "Sound & Shot" written by Galaxy Tab S (SM-T805)) +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 not valid Samsung trailer, or -1 error writing +# - updates DataPos to point to start of Samsung trailer +# - updates DirLen to existing trailer length +sub ProcessSamsung($$$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $offset = $$dirInfo{Offset} || 0; + my $outfile = $$dirInfo{OutFile}; + my $verbose = $et->Options('Verbose'); + my $unknown = $et->Options('Unknown'); + my ($buff, $buf2, $index, $offsetPos, $audioNOff, $audioSize); + + unless ($raf) { + $raf = new File::RandomAccess($$dirInfo{DataPt}); + $et->VerboseDir('SamsungTrailer'); + } + return 0 unless $raf->Seek(-6-$offset, 2) and $raf->Read($buff, 6) == 6 and + ($buff eq 'QDIOBS' or $buff eq "\0\0SEFT"); + my $endPos = $raf->Tell(); + $raf->Seek(-2, 1) or return 0 if $buff eq 'QDIOBS'; # rewind to before 'BS' + my $blockEnd = $raf->Tell(); + SetByteOrder('II'); + + # read blocks backward until we find the SEFH/SEFT block + # (the only other block I have seen is QDIO/QDIO) +SamBlock: + for (;;) { + last unless $raf->Seek($blockEnd-8, 0) and $raf->Read($buff, 8) == 8; + my $type = substr($buff, 4); + last unless $type =~ /^\w+$/; + my $len = Get32u(\$buff, 0); + last unless $len < 0x10000 and $len >= 4 and $len + 8 < $blockEnd; + last unless $raf->Seek(-8-$len, 1) and $raf->Read($buff, $len) == $len; + $blockEnd -= $len + 8; + unless ($type eq 'SEFT') { # look for directory block (ends with "SEFT") + next unless $outfile and $type eq 'QDIO'; + # QDIO block format: + # 0 - 'QDIO' + # 4 - int32u: 101 (version) + # 8 - int32u: 1 + # 12 - int32u: absolute offset of audio file start (augh!!) + # 16 - int32u: absolute offset of audio file end (augh!!) + # 20 - int32u: 20 (QDIO block length minus 8) + # 24 - 'QDIO' + if ($len == 20) { + # save position of audio file offset in QDIO block + $offsetPos = $endPos - $raf->Tell() + $len - 12; + } else { + $et->Error('Unsupported Samsung trailer QDIO block', 1); + } + next; + } + last unless $buff =~ /^SEFH/ and $len >= 12; # validate SEFH header + my $dirPos = $raf->Tell() - $len; + # my $ver = Get32u(\$buff, 0x04); # version (=101) + my $count = Get32u(\$buff, 0x08); + last if 12 + 12 * $count > $len; + my $tagTablePtr = GetTagTable('Image::ExifTool::Samsung::Trailer'); + + # scan ahead quickly to look for the block where the data comes first + # (have only seen this to be the first in the directory, but just in case) + my $firstBlock = 0; + for ($index=0; $index<$count; ++$index) { + my $entry = 12 + 12 * $index; + my $noff = Get32u(\$buff, $entry + 4); # negative offset + $firstBlock = $noff if $firstBlock < $noff; + } + # save trailer position and length + my $dataPos = $$dirInfo{DataPos} = $dirPos - $firstBlock; + my $dirLen = $$dirInfo{DirLen} = $endPos - $dataPos; + if (($verbose or $$et{HTML_DUMP}) and not $outfile and $$dirInfo{RAF}) { + $et->DumpTrailer($dirInfo); + return 1 if $$et{HTML_DUMP}; + } + # read through the SEFH/SEFT directory entries + for ($index=0; $index<$count; ++$index) { + my $entry = 12 + 12 * $index; + # first 2 bytes always 0 (may be part of block type) + my $type = Get16u(\$buff, $entry + 2); # block type + my $noff = Get32u(\$buff, $entry + 4); # negative offset + my $size = Get32u(\$buff, $entry + 8); # block size + last SamBlock if $noff > $dirPos or $size > $noff or $size < 8; + $firstBlock = $noff if $firstBlock < $noff; + if ($outfile) { + next unless $type == 0x0100 and not $audioNOff; + # save offset and length of first audio file for QDIO block + last unless $raf->Seek($dirPos-$noff, 0) and $raf->Read($buf2, 8) == 8; + $len = Get32u(\$buf2, 4); + $audioNOff = $noff - 8 - $len; # negative offset to start of audio data + $audioSize = $size - 8 - $len; + next; + } + # add unknown tags if necessary + my $tag = sprintf("0x%.4x", $type); + unless ($$tagTablePtr{$tag}) { + next unless $unknown or $verbose; + my %tagInfo = ( + Name => "SamsungTrailer_$tag", + Description => "Samsung Trailer $tag", + Unknown => 1, + Binary => 1, + ); + AddTagToTable($tagTablePtr, $tag, \%tagInfo); + } + unless ($$tagTablePtr{"$tag-name"}) { + my %tagInfo2 = ( + Name => "SamsungTrailer_${tag}Name", + Description => "Samsung Trailer $tag Name", + Unknown => 1, + ); + AddTagToTable($tagTablePtr, "$tag-name", \%tagInfo2); + } + last unless $raf->Seek($dirPos-$noff, 0) and $raf->Read($buf2, $size) == $size; + # (could validate the first 4 bytes of the block because they + # are the same as the first 4 bytes of the directory entry) + $len = Get32u(\$buf2, 4); + last if $len + 8 > $size; + # extract tag name and value + $et->HandleTag($tagTablePtr, "$tag-name", undef, + DataPt => \$buf2, + DataPos => $dirPos - $noff, + Start => 8, + Size => $len, + ); + $et->HandleTag($tagTablePtr, $tag, undef, + DataPt => \$buf2, + DataPos => $dirPos - $noff, + Start => 8 + $len, + Size => $size - (8 + $len), + ); + } + if ($outfile) { + last unless $raf->Seek($dataPos, 0) and $raf->Read($buff, $dirLen) == $dirLen; + # adjust the absolute offset in the QDIO block if necessary + if ($offsetPos and $audioNOff) { + # initialize the audio file start/end position in the QDIO block + my $newPos = Tell($outfile) + $dirPos - $audioNOff - $dataPos; + Set32u($newPos, \$buff, length($buff) - $offsetPos); + Set32u($newPos + $audioSize, \$buff, length($buff) - $offsetPos + 4); + # add a fixup so the calling routine can apply further shifts if necessary + require Image::ExifTool::Fixup; + my $fixup = $$dirInfo{Fixup}; + $fixup or $fixup = $$dirInfo{Fixup} = new Image::ExifTool::Fixup; + $fixup->AddFixup(length($buff) - $offsetPos); + $fixup->AddFixup(length($buff) - $offsetPos + 4); + } + $et->VPrint(0, "Writing Samsung trailer ($dirLen bytes)\n") if $verbose; + Write($$dirInfo{OutFile}, $buff) or return -1; + return 1; + } + return 1; + } + $et->Warn('Error processing Samsung trailer',1); + return 0; +} + +#------------------------------------------------------------------------------ +# Write Samsung STMN maker notes +# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref +# Returns: Binary data block or undefined on error +sub WriteSTMN($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + # create a Fixup for the PreviewImage + $$dirInfo{Fixup} = new Image::ExifTool::Fixup; + my $val = Image::ExifTool::WriteBinaryData($et, $dirInfo, $tagTablePtr); + # force PreviewImage into the trailer even if it fits in EXIF segment + $$et{PREVIEW_INFO}{IsTrailer} = 1 if $$et{PREVIEW_INFO}; + return $val; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Samsung - Samsung EXIF maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Samsung maker notes in EXIF information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Tae-Sun Park for decoding a number of tags, Pascal de Bruijn for +the PictureWizard values, and everyone else who helped by discovering new +Samsung information. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Samsung Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Sanyo.pm b/lib/Image/ExifTool/Sanyo.pm new file mode 100644 index 0000000..67722f7 --- /dev/null +++ b/lib/Image/ExifTool/Sanyo.pm @@ -0,0 +1,440 @@ +#------------------------------------------------------------------------------ +# File: Sanyo.pm +# +# Description: Sanyo EXIF maker notes tags +# +# Revisions: 04/06/2004 - P. Harvey Created +# +# Reference: http://www.exif.org/makernotes/SanyoMakerNote.html +#------------------------------------------------------------------------------ + +package Image::ExifTool::Sanyo; + +use strict; +use vars qw($VERSION); +use Image::ExifTool::Exif; + +$VERSION = '1.16'; + +my %offOn = ( + 0 => 'Off', + 1 => 'On', +); + +%Image::ExifTool::Sanyo::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 1, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x00ff => { + # this is an absolute offset in the JPG file... odd - PH + Name => 'MakerNoteOffset', + Writable => 'int32u', + }, + 0x0100 => { + Name => 'SanyoThumbnail', + Groups => { 2 => 'Preview' }, + Writable => 'undef', + WriteCheck => '$self->CheckImage(\$val)', + RawConv => '$self->ValidateImage(\$val,$tag)', + }, + 0x0200 => { + Name => 'SpecialMode', + Writable => 'int32u', + Count => 3, + }, + 0x0201 => { + Name => 'SanyoQuality', + Flags => 'PrintHex', + Writable => 'int16u', + PrintConv => { + 0x0000 => 'Normal/Very Low', + 0x0001 => 'Normal/Low', + 0x0002 => 'Normal/Medium Low', + 0x0003 => 'Normal/Medium', + 0x0004 => 'Normal/Medium High', + 0x0005 => 'Normal/High', + 0x0006 => 'Normal/Very High', + 0x0007 => 'Normal/Super High', + # have seen 0x11 with HD2000 in '8M-H JPEG' mode - PH + 0x0100 => 'Fine/Very Low', + 0x0101 => 'Fine/Low', + 0x0102 => 'Fine/Medium Low', + 0x0103 => 'Fine/Medium', + 0x0104 => 'Fine/Medium High', + 0x0105 => 'Fine/High', + 0x0106 => 'Fine/Very High', + 0x0107 => 'Fine/Super High', + 0x0200 => 'Super Fine/Very Low', + 0x0201 => 'Super Fine/Low', + 0x0202 => 'Super Fine/Medium Low', + 0x0203 => 'Super Fine/Medium', + 0x0204 => 'Super Fine/Medium High', + 0x0205 => 'Super Fine/High', + 0x0206 => 'Super Fine/Very High', + 0x0207 => 'Super Fine/Super High', + }, + }, + 0x0202 => { + Name => 'Macro', + Writable => 'int16u', + PrintConv => { + 0 => 'Normal', + 1 => 'Macro', + 2 => 'View', + 3 => 'Manual', + }, + }, + 0x0204 => { + Name => 'DigitalZoom', + Writable => 'rational64u', + }, + 0x0207 => 'SoftwareVersion', + 0x0208 => 'PictInfo', + 0x0209 => 'CameraID', + 0x020e => { + Name => 'SequentialShot', + Writable => 'int16u', + PrintConv => { + 0 => 'None', + 1 => 'Standard', + 2 => 'Best', + 3 => 'Adjust Exposure', + }, + }, + 0x020f => { + Name => 'WideRange', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x0210 => { + Name => 'ColorAdjustmentMode', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x0213 => { + Name => 'QuickShot', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x0214 => { + Name => 'SelfTimer', + Writable => 'int16u', + PrintConv => \%offOn, + }, + # 0x0215 - Flash? + 0x0216 => { + Name => 'VoiceMemo', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x0217 => { + Name => 'RecordShutterRelease', + Writable => 'int16u', + PrintConv => { + 0 => 'Record while down', + 1 => 'Press start, press stop', + }, + }, + 0x0218 => { + Name => 'FlickerReduce', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x0219 => { + Name => 'OpticalZoomOn', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x021b => { + Name => 'DigitalZoomOn', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x021d => { + Name => 'LightSourceSpecial', + Writable => 'int16u', + PrintConv => \%offOn, + }, + 0x021e => { + Name => 'Resaved', + Writable => 'int16u', + PrintConv => { + 0 => 'No', + 1 => 'Yes', + }, + }, + 0x021f => { + Name => 'SceneSelect', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Sport', + 2 => 'TV', + 3 => 'Night', + 4 => 'User 1', + 5 => 'User 2', + 6 => 'Lamp', #PH + }, + }, + 0x0223 => [ + { + Name => 'ManualFocusDistance', + Condition => '$format eq "rational64u"', + Writable => 'rational64u', + }, { #PH + Name => 'FaceInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Sanyo::FaceInfo' }, + }, + ], + 0x0224 => { + Name => 'SequenceShotInterval', + Writable => 'int16u', + PrintConv => { + 0 => '5 frames/s', + 1 => '10 frames/s', + 2 => '15 frames/s', + 3 => '20 frames/s', + }, + }, + 0x0225 => { + Name => 'FlashMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Auto', + 1 => 'Force', + 2 => 'Disabled', + 3 => 'Red eye', + }, + }, + 0x0e00 => { + Name => 'PrintIM', + Description => 'Print Image Matching', + Writable => 0, + SubDirectory => { + TagTable => 'Image::ExifTool::PrintIM::Main', + }, + }, + 0x0f00 => { + Name => 'DataDump', + Writable => 0, + Binary => 1, + }, +); + +# face detection information (ref PH) +%Image::ExifTool::Sanyo::FaceInfo = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + WRITABLE => 1, + FORMAT => 'int32u', + FIRST_ENTRY => 0, + 0 => 'FacesDetected', + 4 => { + Name => 'FacePosition', + Format => 'int32u[4]', + Notes => q{ + left, top, right and bottom coordinates of detected face in an unrotated + 640-pixel-wide image, with increasing Y downwards + }, + }, +); + +# tags in Sanyo MOV videos (PH - observations from an E6 sample) +# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos) +%Image::ExifTool::Sanyo::MOV = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'This information is found in Sanyo MOV videos.', + 0x00 => { + Name => 'Make', + Format => 'string[24]', + }, + 0x18 => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[8]', + }, + # (01 00 at offset 0x20) + 0x26 => { + Name => 'ExposureTime', + Format => 'int32u', + ValueConv => '$val ? 10 / $val : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x2a => { + Name => 'FNumber', + Format => 'int32u', + ValueConv => '$val / 10', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x32 => { + Name => 'ExposureCompensation', + Format => 'int32s', + ValueConv => '$val / 10', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + 0x44 => { + Name => 'WhiteBalance', + Format => 'int16u', + PrintConv => { + 0 => 'Auto', + 1 => 'Daylight', + 2 => 'Shade', + 3 => 'Fluorescent', #2 + 4 => 'Tungsten', + 5 => 'Manual', + }, + }, + 0x48 => { + Name => 'FocalLength', + Format => 'int32u', + ValueConv => '$val / 10', + PrintConv => 'sprintf("%.1f mm",$val)', + }, +); + +# tags in Sanyo MP4 videos (PH - from C4, C5 and HD1A samples) +# --> very similar to Samsung MP4 information +# (there is still a lot more information here that could be decoded!) +%Image::ExifTool::Sanyo::MP4 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'This information is found in Sanyo MP4 videos.', + 0x00 => { + Name => 'Make', + Format => 'string[5]', + PrintConv => 'ucfirst(lc($val))', + }, + 0x18 => { + Name => 'Model', + Description => 'Camera Model Name', + Format => 'string[8]', + }, + # (01 00 at offset 0x28) + # (0x2e has values 0x31, 0x33 and 0x3c in my samples, but + # some of the shutter speeds should be around 1/500 or so) + 0x32 => { + Name => 'FNumber', + Format => 'rational64u', + PrintConv => 'sprintf("%.1f",$val)', + }, + 0x3a => { # (NC) + Name => 'ExposureCompensation', + Format => 'rational64s', + PrintConv => '$val ? sprintf("%+.1f", $val) : 0', + }, + 0x6a => { + Name => 'ISO', + Format => 'int32u', + }, + 0xd1 => { + Name => 'Software', + Notes => 'these tags are shifted up by 1 byte for some models like the HD1A', + Format => 'undef[32]', + RawConv => q{ + $val =~ /^SANYO/ or return undef; + $val =~ tr/\0//d; + $$self{SanyoSledder0xd1} = 1; + return $val; + }, + }, + 0xd2 => { + Name => 'Software', + Format => 'undef[32]', + RawConv => q{ + $val =~ /^SANYO/ or return undef; + $val =~ tr/\0//d; + $$self{SanyoSledder0xd2} = 1; + return $val; + }, + }, + 0xf1 => { + Name => 'Thumbnail', + Condition => '$$self{SanyoSledder0xd1}', + SubDirectory => { + TagTable => 'Image::ExifTool::Sanyo::Thumbnail', + Base => '$start', + }, + }, + 0xf2 => { + Name => 'Thumbnail', + Condition => '$$self{SanyoSledder0xd2}', + SubDirectory => { + TagTable => 'Image::ExifTool::Sanyo::Thumbnail', + Base => '$start', + }, + }, +); + +# thumbnail image information found in MP4 videos (similar in Olympus,Samsung,Sanyo) +%Image::ExifTool::Sanyo::Thumbnail = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FIRST_ENTRY => 0, + FORMAT => 'int32u', + 1 => 'ThumbnailWidth', + 2 => 'ThumbnailHeight', + 3 => 'ThumbnailLength', + 4 => { Name => 'ThumbnailOffset', IsOffset => 1 }, +); + + +#------------------------------------------------------------------------------ +# Patch incorrect offsets in J1, J2, J4, S1, S3 and S4 maker notes +# Inputs: 0) valuePtr, 1) end of previous value, 2) value size, 3) tag ID, 4) write flag +sub FixOffsets($$$$;$) +{ + my ($valuePtr, $valEnd, $size, $tagID, $wFlag) = @_; + # ignore existing offsets and calculate reasonable values instead + if ($tagID == 0x100) { + # just ignore the SanyoThumbnail when writing (pointer is garbage) + $_[0] = undef if $wFlag; + } else { + $_[0] = $valEnd; # set value pointer to next logical location + ++$size if $size & 0x01; + $_[1] += $size; # update end-of-value pointer + } +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Sanyo - Sanyo EXIF maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Sanyo maker notes in EXIF information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.exif.org/makernotes/SanyoMakerNote.html> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Sanyo Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Scalado.pm b/lib/Image/ExifTool/Scalado.pm new file mode 100644 index 0000000..333b963 --- /dev/null +++ b/lib/Image/ExifTool/Scalado.pm @@ -0,0 +1,141 @@ +#------------------------------------------------------------------------------ +# File: Scalado.pm +# +# Description: Read APP4 SCALADO metadata +# +# Revisions: 2013-09-13 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::Scalado; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::PLIST; + +$VERSION = '1.01'; + +sub ProcessScalado($$$); + +# JPEG APP4 SCALADO tags +%Image::ExifTool::Scalado::Main = ( + GROUPS => { 0 => 'APP4', 1 => 'Scalado', 2 => 'Image' }, + PROCESS_PROC => \&ProcessScalado, + TAG_PREFIX => 'Scalado', + FORMAT => 'int32s', + NOTES => q{ + Tags extracted from the JPEG APP4 "SCALADO" segment found in images from + HTC, LG and Samsung phones. (Presumably written by Scalado mobile software, + L<http://www.scalado.com/>.) + }, + SPMO => { + Name => 'DataLength', + Unknown => 1, + }, + WDTH => { + Name => 'PreviewImageWidth', + ValueConv => '$val ? abs($val) : undef', + }, + HGHT => { + Name => 'PreviewImageHeight', + ValueConv => '$val ? abs($val) : undef', + }, + QUAL => { + Name => 'PreviewQuality', + ValueConv => '$val ? abs($val) : undef', + }, + # tags not yet decoded with observed values: + # CHKH: 0, various negative values + # CHKL: various negative values + # CLEN: -1024 + # CSPC: -2232593 + # DATA: (+ve data length) + # HDEC: 0 + # MAIN: 0, 60 + # META: 24 + # SCI0: (+ve data length) often 36 + # SCI1: (+ve data length) 36 + # SCX0: (+ve data length) + # SCX1: (+ve data length) often 84 + # WDEC: 0 + # VERS: -131328 +); + +#------------------------------------------------------------------------------ +# Extract information from the JPEG APP4 SCALADO segment +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessScalado($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = 0; + my $end = length $$dataPt; + my $unknown = $et->Options('Unknown'); + + $et->VerboseDir('APP4 SCALADO', undef, $end); + SetByteOrder('MM'); + + for (;;) { + last if $pos + 12 > $end; + my $tag = substr($$dataPt, $pos, 4); + my $ver = Get32u($dataPt, $pos + 4); # (looks like a version for some tags) + if (not $$tagTablePtr{$tag} and $unknown) { + my $name = $tag; + $name =~ tr/-A-Za-z0-9_//dc; + last unless length $name; # stop if tag is garbage + AddTagToTable($tagTablePtr, $tag, { + Name => "Scalado_$name", + Description => "Scalado $name", + Unknown => 1, + }); + } + $et->HandleTag($tagTablePtr, $tag, undef, + DataPt => $dataPt, + Start => $pos + 8, + Size => 4, + Extra => ", ver $ver", + ); + if ($tag eq 'SPMO') { + my $val = Get32u($dataPt, $pos + 8) ; + if ($ver < 5) { # (I don't have samples for version 3 or 4, so I'm not sure about these) + $end -= $val; # SPMO gives trailer data length + } else { + $end = $val + 12; # SPMO gives length of Scalado directory (excepting this entry) + } + } + $pos += 12; + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Scalado - Read APP4 SCALADO metadata + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read +metadata from the JPEG APP4 SCALADO segment. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Scalado Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Shift.pl b/lib/Image/ExifTool/Shift.pl new file mode 100644 index 0000000..6f761ef --- /dev/null +++ b/lib/Image/ExifTool/Shift.pl @@ -0,0 +1,644 @@ +#------------------------------------------------------------------------------ +# File: Shift.pl +# +# Description: ExifTool time shifting routines +# +# Revisions: 10/28/2005 - P. Harvey Created +# 03/13/2019 - PH Added single-argument form of ShiftTime() +#------------------------------------------------------------------------------ + +package Image::ExifTool; + +use strict; + +sub ShiftTime($;$$$); + +#------------------------------------------------------------------------------ +# apply shift to value in new value hash +# Inputs: 0) ExifTool ref, 1) shift type, 2) shift string, 3) raw date/time value, +# 4) new value hash ref +# Returns: error string or undef on success and updates value in new value hash +sub ApplyShift($$$$;$) +{ + my ($self, $func, $shift, $val, $nvHash) = @_; + + # get shift direction from first character in shift string + my $pre = ($shift =~ s/^(\+|-)//) ? $1 : '+'; + my $dir = ($pre eq '+') ? 1 : -1; + my $tagInfo = $$nvHash{TagInfo}; + my $tag = $$tagInfo{Name}; + my $shiftOffset; + if ($$nvHash{ShiftOffset}) { + $shiftOffset = $$nvHash{ShiftOffset}; + } else { + $shiftOffset = $$nvHash{ShiftOffset} = { }; + } + + # initialize handler for eval warnings + local $SIG{'__WARN__'} = \&SetWarning; + SetWarning(undef); + + # shift is applied to ValueConv value, so we must ValueConv-Shift-ValueConvInv + my ($type, $err); + foreach $type ('ValueConv','Shift','ValueConvInv') { + if ($type eq 'Shift') { + #### eval ShiftXxx function + $err = eval "Shift$func(\$val, \$shift, \$dir, \$shiftOffset)"; + } elsif ($$tagInfo{$type}) { + my $conv = $$tagInfo{$type}; + if (ref $conv eq 'CODE') { + $val = &$conv($val, $self); + } else { + return "Can't handle $type for $tag in ApplyShift()" if ref $$tagInfo{$type}; + #### eval ValueConv/ValueConvInv ($val, $self) + $val = eval $$tagInfo{$type}; + } + } else { + next; + } + # handle errors + $err and return $err; + $@ and SetWarning($@); + GetWarning() and return CleanWarning(); + } + # update value in new value hash + $nvHash->{Value} = [ $val ]; + return undef; # success +} + +#------------------------------------------------------------------------------ +# Check date/time shift +# Inputs: 0) shift type, 1) shift string (without sign) +# Returns: updated shift string, or undef on error (and may update shift) +sub CheckShift($$) +{ + my ($type, $shift) = @_; + my $err; + if ($type eq 'Time') { + return "No shift direction" unless $shift =~ s/^(\+|-)//; + # do a test shift to validate the shift string + my $testTime = '2005:11:02 09:00:13.25-04:00'; + $err = ShiftTime($testTime, $shift, $1 eq '+' ? 1 : -1); + } else { + $err = "Unknown shift type ($type)"; + } + return $err; +} + +#------------------------------------------------------------------------------ +# return the number of days in a month +# Inputs: 0) month number (Jan=1, may be outside range), 1) year +# Returns: number of days in month +sub DaysInMonth($$) +{ + my ($mon, $year) = @_; + my @days = (31,28,31,30,31,30,31,31,30,31,30,31); + # adjust to the range [0,11] + while ($mon < 1) { $mon += 12; --$year; } + while ($mon > 12) { $mon -= 12; ++$year; } + # return standard number of days unless february on a leap year + return $days[$mon-1] unless $mon == 2 and not $year % 4; + # leap years don't occur on even centuries except every 400 years + return 29 if $year % 100 or not $year % 400; + return 28; +} + +#------------------------------------------------------------------------------ +# split times into corresponding components: YYYY mm dd HH MM SS tzh tzm +# Inputs: 0) date/time or shift string 1) reference to list for returned components +# 2) optional reference to list of time components (if shift string) +# Returns: true on success +# Returned components are 0-Y, 1-M, 2-D, 3-hr, 4-min, 5-sec, 6-tzhr, 7-tzmin +sub SplitTime($$;$) +{ + my ($val, $vals, $time) = @_; + # insert zeros if missing in shift string + if ($time) { + $val =~ s/(^|[-+:\s]):/${1}0:/g; + $val =~ s/:([:\s]|$)/:0$1/g; + } + # change dashes to colons in date (for XMP dates) + if ($val =~ s/^(\d{4})-(\d{2})-(\d{2})/$1:$2:$3/) { + $val =~ tr/T/ /; # change 'T' separator to ' ' + } + # add space before timezone to split it into a separate word + $val =~ s/(\+|-)/ $1/; + my @words = split ' ', $val; + my $err = 1; + my @v; + for (;;) { + my $word = shift @words; + last unless defined $word; + # split word into separate numbers (allow decimal points but no signs) + my @vals = $word =~ /(?=\d|\.\d)\d*(?:\.\d*)?/g or last; + if ($word =~ /^(\+|-)/) { + # this is the timezone + (defined $v[6] or @vals > 2) and $err = 1, last; + my $sign = ($1 ne '-') ? 1 : -1; + # apply sign to both minutes and seconds + $v[6] = $sign * shift(@vals); + $v[7] = $sign * (shift(@vals) || 0); + } elsif ((@words and $words[0] =~ /^\d+/) or # there is a time word to follow + (not $time and $vals[0] =~ /^\d{3}/) or # first value is year (3 or more digits) + ($time and not defined $$time[3] and not defined $v[0])) # we don't have a time + { + # this is a date (must come first) + (@v or @vals > 3) and $err = 1, last; + not $time and @vals != 3 and $err = 1, last; + $v[2] = pop(@vals); # take day first if only one specified + $v[1] = pop(@vals) || 0; + $v[0] = pop(@vals) || 0; + } else { + # this is a time (can't come after timezone) + (defined $v[3] or defined $v[6] or @vals > 3) and $err = 1, last; + not $time and @vals != 3 and @vals != 2 and $err = 1, last; + $v[3] = shift(@vals); # take hour first if only one specified + $v[4] = shift(@vals) || 0; + $v[5] = shift(@vals) || 0; + } + $err = 0; + } + return 0 if $err or not @v; + if ($time) { + # zero any required shift entries which aren't yet defined + $v[0] = $v[1] = $v[2] = 0 if defined $$time[0] and not defined $v[0]; + $v[3] = $v[4] = $v[5] = 0 if defined $$time[3] and not defined $v[3]; + $v[6] = $v[7] = 0 if defined $$time[6] and not defined $v[6]; + } + @$vals = @v; # return split time components + return 1; +} + +#------------------------------------------------------------------------------ +# shift date/time by components +# Inputs: 0) split date/time list ref, 1) split shift list ref, +# 2) shift direction, 3) reference to output list of shifted components +# 4) number of decimal points in seconds +# 5) reference to return time difference due to rounding +# Returns: error string or undef on success +sub ShiftComponents($$$$$;$) +{ + my ($time, $shift, $dir, $toTime, $dec, $rndPt) = @_; + # min/max for Y, M, D, h, m, s + my @min = ( 0, 1, 1, 0, 0, 0); + my @max = (10000,12,28,24,60,60); + my $i; +# +# apply the shift +# + my $c = 0; + for ($i=0; $i<@$time; ++$i) { + my $v = ($$time[$i] || 0) + $dir * ($$shift[$i] || 0) + $c; + # handle fractional values by propagating remainders downwards + if ($v != int($v) and $i < 5) { + my $iv = int($v); + $c = ($v - $iv) * $max[$i+1]; + $v = $iv; + } else { + $c = 0; + } + $$toTime[$i] = $v; + } + # round off seconds to the required number of decimal points + my $sec = $$toTime[5]; + if (defined $sec and $sec != int($sec)) { + my $mult = 10 ** $dec; + my $rndSec = int($sec * $mult + 0.5 * ($sec <=> 0)) / $mult; + $rndPt and $$rndPt = $sec - $rndSec; + $$toTime[5] = $rndSec; + } +# +# handle overflows, starting with least significant number first (seconds) +# + $c = 0; + for ($i=5; $i>=0; $i--) { + defined $$time[$i] or $c = 0, next; + # apply shift and adjust for previous overflow + my $v = $$toTime[$i] + $c; + $c = 0; # set carry to zero + # adjust for over/underflow + my ($min, $max) = ($min[$i], $max[$i]); + if ($v < $min) { + if ($i == 2) { # 2 = day of month + do { + # add number of days in previous month + --$c; + my $mon = $$toTime[$i-1] + $c; + $v += DaysInMonth($mon, $$toTime[$i-2]); + } while ($v < 1); + } else { + my $fc = ($v - $min) / $max; + # carry ($c) must be largest integer equal to or less than $fc + $c = int($fc); + --$c if $c > $fc; + $v -= $c * $max; + } + } elsif ($v >= $max + $min) { + if ($i == 2) { + for (;;) { + # test against number of days in current month + my $mon = $$toTime[$i-1] + $c; + my $days = DaysInMonth($mon, $$toTime[$i-2]); + last if $v <= $days; + $v -= $days; + ++$c; + last if $v <= 28; + } + } else { + my $fc = ($v - $max - $min) / $max; + # carry ($c) must be smallest integer greater than $fc + $c = int($fc); + ++$c if $c <= $fc; + $v -= $c * $max; + } + } + $$toTime[$i] = $v; # save the new value + } + # handle overflows in timezone + if (defined $$toTime[6]) { + my $m = $$toTime[6] * 60 + $$toTime[7]; + $m += 0.5 * ($m <=> 0); # avoid round-off errors + $$toTime[6] = int($m / 60); + $$toTime[7] = int($m - $$toTime[6] * 60); + } + return undef; # success +} + +#------------------------------------------------------------------------------ +# Shift an integer or floating-point number +# Inputs: 0) date/time string, 1) shift string, 2) shift direction (+1 or -1) +# 3) (unused) +# Returns: undef and updates input value +sub ShiftNumber($$$;$) +{ + my ($val, $shift, $dir) = @_; + $_[0] = $val + $shift * $dir; # return shifted value + return undef; # success! +} + +#------------------------------------------------------------------------------ +# Shift date/time string +# Inputs: 0) date/time string, 1) shift string, 2) shift direction (+1 or -1), +# or 0 or undef to take shift direction from sign of shift, +# 3) reference to ShiftOffset hash (with Date, DateTime, Time, Timezone keys) +# or 0) shift string (and operates on $_) +# Returns: error string or undef on success and date/time string is updated +sub ShiftTime($;$$$) +{ + my ($val, $shift, $dir, $shiftOffset); + my (@time, @shift, @toTime, $mode, $needShiftOffset, $dec); + + if (@_ == 1) { # single argument form of ShiftTime()? + $val = $_; + $shift = $_[0]; + } else { + ($val, $shift, $dir, $shiftOffset) = @_; + } + $dir or $dir = ($shift =~ s/^(\+|-)// and $1 eq '-') ? -1 : 1; +# +# figure out what we are dealing with (time, date or date/time) +# + SplitTime($val, \@time) or return "Invalid time string ($val)"; + if (defined $time[0]) { + return "Can't shift from year 0000" if $time[0] eq '0000'; + $mode = defined $time[3] ? 'DateTime' : 'Date'; + } elsif (defined $time[3]) { + $mode = 'Time'; + } else { + $mode = ''; + } + # get number of digits after the seconds decimal point + if (defined $time[5] and $time[5] =~ /\.(\d+)/) { + $dec = length($1); + } else { + $dec = 0; + } + if ($shiftOffset) { + $needShiftOffset = 1 unless defined $$shiftOffset{$mode}; + $needShiftOffset = 1 if defined $time[6] and not defined $$shiftOffset{Timezone}; + } else { + $needShiftOffset = 1; + } + if ($needShiftOffset) { +# +# apply date/time shift the hard way +# + SplitTime($shift, \@shift, \@time) or return "Invalid shift string ($shift)"; + + # change 'Z' timezone to '+00:00' only if necessary + if (@shift > 6 and @time <= 6) { + $time[6] = $time[7] = 0 if $val =~ s/Z$/\+00:00/; + } + my $rndDiff; + my $err = ShiftComponents(\@time, \@shift, $dir, \@toTime, $dec, \$rndDiff); + $err and return $err; +# +# calculate and save the shift offsets for next time +# + if ($shiftOffset) { + if (defined $time[0] or defined $time[3]) { + my @tm1 = (0, 0, 0, 1, 0, 2000); + my @tm2 = (0, 0, 0, 1, 0, 2000); + if (defined $time[0]) { + @tm1[3..5] = reverse @time[0..2]; + @tm2[3..5] = reverse @toTime[0..2]; + --$tm1[4]; # month should start from 0 + --$tm2[4]; + } + my $diff = 0; + if (defined $time[3]) { + @tm1[0..2] = reverse @time[3..5]; + @tm2[0..2] = reverse @toTime[3..5]; + # handle fractional seconds separately + $diff = $tm2[0] - int($tm2[0]) - ($tm1[0] - int($tm1[0])); + $diff += $rndDiff if defined $rndDiff; # un-do rounding + $tm1[0] = int($tm1[0]); + $tm2[0] = int($tm2[0]); + } + eval q{ + require Time::Local; + $diff += Time::Local::timegm(@tm2) - Time::Local::timegm(@tm1); + }; + # not a problem if we failed here since we'll just try again next time, + # so don't return error message + unless (@$) { + my $mode; + if (defined $time[0]) { + $mode = defined $time[3] ? 'DateTime' : 'Date'; + } else { + $mode = 'Time'; + } + $$shiftOffset{$mode} = $diff; + } + } + if (defined $time[6]) { + $$shiftOffset{Timezone} = ($toTime[6] - $time[6]) * 60 + + $toTime[7] - $time[7]; + } + } + + } else { +# +# apply shift from previously calculated offsets +# + if ($$shiftOffset{Timezone} and @time <= 6) { + # change 'Z' timezone to '+00:00' only if necessary + $time[6] = $time[7] = 0 if $val =~ s/Z$/\+00:00/; + } + # apply the previous date/time shift if necessary + if ($mode) { + my @tm = (0, 0, 0, 1, 0, 2000); + if (defined $time[0]) { + @tm[3..5] = reverse @time[0..2]; + --$tm[4]; # month should start from 0 + } + @tm[0..2] = reverse @time[3..5] if defined $time[3]; + # save fractional seconds + my $frac = $tm[0] - int($tm[0]); + $tm[0] = int($tm[0]); + my $tm; + eval q{ + require Time::Local; + $tm = Time::Local::timegm(@tm) + $frac; + }; + $@ and return CleanWarning($@); + $tm += $$shiftOffset{$mode}; # apply the shift + $tm < 0 and return 'Shift results in negative time'; + # save fractional seconds in shifted time + $frac = $tm - int($tm); + if ($frac) { + $tm = int($tm); + # must account for any rounding that could occur + $frac + 0.5 * 10 ** (-$dec) >= 1 and ++$tm, $frac = 0; + } + @tm = gmtime($tm); + @toTime = reverse @tm[0..5]; + $toTime[0] += 1900; + ++$toTime[1]; + $toTime[5] += $frac; # add the fractional seconds back in + } + # apply the previous timezone shift if necessary + if (defined $time[6]) { + my $m = $time[6] * 60 + $time[7]; + $m += $$shiftOffset{Timezone}; + $m += 0.5 * ($m <=> 0); # avoid round-off errors + $toTime[6] = int($m / 60); + $toTime[7] = int($m - $toTime[6] * 60); + } + } +# +# insert shifted time components back into original string +# + my $i; + for ($i=0; $i<@toTime; ++$i) { + next unless defined $time[$i] and defined $toTime[$i]; + my ($v, $d, $s); + if ($i != 6) { # not timezone hours + last unless $val =~ /((?=\d|\.\d)\d*(\.\d*)?)/g; + next if $toTime[$i] == $time[$i]; + $v = $1; # value + $d = $2; # decimal part of value + $s = ''; # no sign + } else { + last if $time[$i] == $toTime[$i] and $time[$i+1] == $toTime[$i+1]; + last unless $val =~ /((?:\+|-)(?=\d|\.\d)\d*(\.\d*)?)/g; + $v = $1; + $d = $2; + if ($toTime[6] >= 0 and $toTime[7] >= 0) { + $s = '+'; + } else { + $s = '-'; + $toTime[6] = -$toTime[6]; + $toTime[7] = -$toTime[7]; + } + } + my $nv = $toTime[$i]; + my $pos = pos $val; + my $len = length $v; + my $sig = $len - length $s; + my $dec = $d ? length($d) - 1 : 0; + my $newNum = sprintf($dec ? "$s%0$sig.${dec}f" : "$s%0${sig}d", $nv); + substr($val, $pos - $len, $len) = $newNum; + pos($val) = $pos + length($newNum) - $len; + } + if (@_ == 1) { + $_ = $val; # set $_ to the returned value + } else { + $_[0] = $val; # return shifted value + } + return undef; # success! +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Shift.pl - ExifTool time shifting routines + +=head1 DESCRIPTION + +This module contains routines used by ExifTool to shift date and time +values. + +=head1 METHODS + +=head2 ShiftTime + +Shift date/time value + + use Image::ExifTool; + $err = Image::ExifTool::ShiftTime($dateTime, $shift); + +=over 4 + +=item Inputs: + +0) Date/time string in EXIF format (eg. C<2016:01:30 11:45:00>). + +1) Shift string (see below) with optional leading sign for shift direction. + +2) [optional] Direction of shift (-1 or +1), or 0 or undef to use the sign +from the shift string. + +3) [optional] Reference to time-shift hash -- filled in by first call to +B<ShiftTime>, and used in subsequent calls to shift date/time values by the +same relative amount (see L</TRICKY> section below). + +or + +0) Shift string (and $_ contains the input date/time string). + +=item Return value: + +Error string, or undef on success and the input date/time string is shifted +by the specified amount. + +=back + +=head1 SHIFT STRING + +Time shifts are applied to standard EXIF-formatted date/time values (eg. +C<2005:03:14 18:55:00>). Date-only and time-only values may also be +shifted, and an optional timezone (eg. C<-05:00>) is also supported. Here +are some general rules and examples to explain how shift strings are +interpreted: + +Date-only values are shifted using the following formats: + + 'Y:M:D' - shift date by 'Y' years, 'M' months and 'D' days + 'M:D' - shift months and days only + 'D' - shift specified number of days + +Time-only values are shifted using the following formats: + + 'h:m:s' - shift time by 'h' hours, 'm' minutes and 's' seconds + 'h:m' - shift hours and minutes only + 'h' - shift specified number of hours + +Timezone shifts are specified in the following formats: + + '+h:m' - shift timezone by 'h' hours and 'm' minutes + '-h:m' - negative shift of timezone hours and minutes + '+h' - shift timezone hours only + '-h' - negative shift of timezone hours only + +A valid shift value consists of one or two arguments, separated by a space. +If only one is provided, it is assumed to be a time shift when applied to a +time-only or a date/time value, or a date shift when applied to a date-only +value. For example: + + '1' - shift by 1 hour if applied to a time or date/time + value, or by one day if applied to a date value + '2:0' - shift 2 hours (time, date/time), or 2 months (date) + '5:0:0' - shift 5 hours (time, date/time), or 5 years (date) + '0:0:1' - shift 1 s (time, date/time), or 1 day (date) + +If two arguments are given, the date shift is first, followed by the time +shift: + + '3:0:0 0' - shift date by 3 years + '0 15:30' - shift time by 15 hours and 30 minutes + '1:0:0 0:0:0+5:0' - shift date by 1 year and timezone by 5 hours + +A date shift is simply ignored if applied to a time value or visa versa. + +Numbers specified in shift fields may contain a decimal point: + + '1.5' - 1 hour 30 minutes (time, date/time), or 1 day (date) + '2.5 0' - 2 days 12 hours (date/time), 12 hours (time) or + 2 days (date) + +And to save typing, a zero is assumed for any missing numbers: + + '1::' - shift by 1 hour (time, date/time) or 1 year (date) + '26:: 0' - shift date by 26 years + '+:30' - shift timezone by 30 minutes + +Below are some specific examples applied to real date and/or time values +('Dir' is the applied shift direction: '+' is positive, '-' is negative): + + Original Value Shift Dir Shifted Value + --------------------- ------- --- --------------------- + '20:30:00' '5' + '01:30:00' + '2005:01:27' '5' + '2005:02:01' + '2005:01:27 20:30:00' '5' + '2005:01:28 01:30:00' + '11:54:00' '2.5 0' - '23:54:00' + '2005:11:02' '2.5 0' - '2005:10:31' + '2005:11:02 11:54:00' '2.5 0' - '2005:10:30 23:54:00' + '2004:02:28 08:00:00' '1 1.3' + '2004:02:29 09:18:00' + '07:00:00' '-5' + '07:00:00' + '07:00:00+01:00' '-5' + '07:00:00-04:00' + '07:00:00Z' '+2:30' - '07:00:00-02:30' + '1970:01:01' '35::' + '2005:01:01' + '2005:01:01' '400' + '2006:02:05' + '10:00:00.00' '::1.33' - '09:59:58.67' + +=head1 NOTES + +The format of the original date/time value is not changed when the time +shift is applied. This means that the length of the date/time string will +not change, and only the numbers in the string will be modified. The only +exception to this rule is that a 'Z' timezone is changed to '+00:00' +notation if a timezone shift is applied. A timezone will not be added to +the date/time string. + +=head1 TRICKY + +This module is perhaps more complicated than it needs to be because it is +designed to be very flexible in the way time shifts are specified and +applied... + +The ability to shift dates by Y years, M months, etc, conflicts with the +design goal of maintaining a constant shift for all time values when +applying a batch shift. This is because shifting by 1 month can be +equivalent to anything from 28 to 31 days, and 1 year can be 365 or 366 +days, depending on the starting date. + +The inconsistency is handled by shifting the first tag found with the actual +specified shift, then calculating the equivalent time difference in seconds +for this shift and applying this difference to subsequent tags in a batch +conversion. So if it works as designed, the behaviour should be both +intuitive and mathematically correct, and the user shouldn't have to worry +about details such as this (in keeping with Perl's "do the right thing" +philosophy). + +=head1 BUGS + +Due to the use of the standard time library functions, dates are typically +limited to the range 1970 to 2038 on 32-bit systems. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Shortcuts.pm b/lib/Image/ExifTool/Shortcuts.pm new file mode 100644 index 0000000..b0ae856 --- /dev/null +++ b/lib/Image/ExifTool/Shortcuts.pm @@ -0,0 +1,355 @@ +#------------------------------------------------------------------------------ +# File: Shortcuts.pm +# +# Description: ExifTool shortcut tags +# +# Revisions: 02/07/2004 - PH Moved out of Exif.pm +# 09/15/2004 - PH Added D70Boring from Greg Troxel +# 01/11/2005 - PH Added Canon20D from Christian Koller +# 03/03/2005 - PH Added user defined shortcuts +# 03/26/2005 - PH Added Nikon from Tom Christiansen +# 02/28/2007 - PH Removed model-dependent shortcuts +# --> this is what UserDefined::Shortcuts is for +# 02/25/2009 - PH Added Unsafe +# 07/03/2010 - PH Added CommonIFD0 +#------------------------------------------------------------------------------ + +package Image::ExifTool::Shortcuts; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.67'; + +# this is a special table used to define command-line shortcuts +# (documentation Notes may be added for these via %shortcutNotes in BuildTagLookup.pm) +%Image::ExifTool::Shortcuts::Main = ( + # this shortcut allows the three common date/time tags to be shifted at once + AllDates => [ + 'DateTimeOriginal', + 'CreateDate', + 'ModifyDate', + ], + # This is a shortcut to some common information which is useful in most images + Common => [ + 'FileName', + 'FileSize', + 'Model', + 'DateTimeOriginal', + 'ImageSize', + 'Quality', + 'FocalLength', + 'ShutterSpeed', + 'Aperture', + 'ISO', + 'WhiteBalance', + 'Flash', + ], + # This shortcut provides the same information as the Canon utilities + Canon => [ + 'FileName', + 'Model', + 'DateTimeOriginal', + 'ShootingMode', + 'ShutterSpeed', + 'Aperture', + 'MeteringMode', + 'ExposureCompensation', + 'ISO', + 'Lens', + 'FocalLength', + 'ImageSize', + 'Quality', + 'Flash', + 'FlashType', + 'ConditionalFEC', + 'RedEyeReduction', + 'ShutterCurtainHack', + 'WhiteBalance', + 'FocusMode', + 'Contrast', + 'Sharpness', + 'Saturation', + 'ColorTone', + 'ColorSpace', + 'LongExposureNoiseReduction', + 'FileSize', + 'FileNumber', + 'DriveMode', + 'OwnerName', + 'SerialNumber', + ], + Nikon => [ + 'Model', + 'SubSecDateTimeOriginal', + 'ShutterCount', + 'LensSpec', + 'FocalLength', + 'ImageSize', + 'ShutterSpeed', + 'Aperture', + 'ISO', + 'NoiseReduction', + 'ExposureProgram', + 'ExposureCompensation', + 'WhiteBalance', + 'WhiteBalanceFineTune', + 'ShootingMode', + 'Quality', + 'MeteringMode', + 'FocusMode', + 'ImageOptimization', + 'ToneComp', + 'ColorHue', + 'ColorSpace', + 'HueAdjustment', + 'Saturation', + 'Sharpness', + 'Flash', + 'FlashMode', + 'FlashExposureComp', + ], + # This shortcut may be useful when copying tags between files to either + # copy the maker notes as a block or prevent it from being copied + MakerNotes => [ + 'MakerNotes', # (for RIFF MakerNotes) + 'MakerNoteApple', + 'MakerNoteCanon', + 'MakerNoteCasio', + 'MakerNoteCasio2', + 'MakerNoteDJI', + 'MakerNoteDJIInfo', + 'MakerNoteFLIR', + 'MakerNoteFujiFilm', + 'MakerNoteGE', + 'MakerNoteGE2', + 'MakerNoteHasselblad', + 'MakerNoteHP', + 'MakerNoteHP2', + 'MakerNoteHP4', + 'MakerNoteHP6', + 'MakerNoteISL', + 'MakerNoteJVC', + 'MakerNoteJVCText', + 'MakerNoteKodak1a', + 'MakerNoteKodak1b', + 'MakerNoteKodak2', + 'MakerNoteKodak3', + 'MakerNoteKodak4', + 'MakerNoteKodak5', + 'MakerNoteKodak6a', + 'MakerNoteKodak6b', + 'MakerNoteKodak7', + 'MakerNoteKodak8a', + 'MakerNoteKodak8b', + 'MakerNoteKodak8c', + 'MakerNoteKodak9', + 'MakerNoteKodak10', + 'MakerNoteKodak11', + 'MakerNoteKodak12', + 'MakerNoteKodakUnknown', + 'MakerNoteKyocera', + 'MakerNoteMinolta', + 'MakerNoteMinolta2', + 'MakerNoteMinolta3', + 'MakerNoteMotorola', + 'MakerNoteNikon', + 'MakerNoteNikon2', + 'MakerNoteNikon3', + 'MakerNoteNintendo', + 'MakerNoteOlympus', + 'MakerNoteOlympus2', + 'MakerNoteOlympus3', + 'MakerNoteLeica', + 'MakerNoteLeica2', + 'MakerNoteLeica3', + 'MakerNoteLeica4', + 'MakerNoteLeica5', + 'MakerNoteLeica6', + 'MakerNoteLeica7', + 'MakerNoteLeica8', + 'MakerNoteLeica9', + 'MakerNoteLeica10', + 'MakerNotePanasonic', + 'MakerNotePanasonic2', + 'MakerNotePanasonic3', + 'MakerNotePentax', + 'MakerNotePentax2', + 'MakerNotePentax3', + 'MakerNotePentax4', + 'MakerNotePentax5', + 'MakerNotePentax6', + 'MakerNotePhaseOne', + 'MakerNoteReconyx', + 'MakerNoteReconyx2', + 'MakerNoteReconyx3', + 'MakerNoteRicoh', + 'MakerNoteRicoh2', + 'MakerNoteRicohPentax', + 'MakerNoteRicohText', + 'MakerNoteSamsung1a', + 'MakerNoteSamsung1b', + 'MakerNoteSamsung2', + 'MakerNoteSanyo', + 'MakerNoteSanyoC4', + 'MakerNoteSanyoPatch', + 'MakerNoteSigma', + 'MakerNoteSony', + 'MakerNoteSony2', + 'MakerNoteSony3', + 'MakerNoteSony4', + 'MakerNoteSony5', + 'MakerNoteSonyEricsson', + 'MakerNoteSonySRF', + 'MakerNoteUnknownText', + 'MakerNoteUnknownBinary', + 'MakerNoteUnknown', + ], + # "unsafe" tags we normally don't copy in JPEG images, defined + # as a shortcut to use when rebuilding JPEG EXIF from scratch + Unsafe => [ + 'IFD0:YCbCrPositioning', + 'IFD0:YCbCrCoefficients', + 'IFD0:TransferFunction', + 'ExifIFD:ComponentsConfiguration', + 'ExifIFD:CompressedBitsPerPixel', + 'InteropIFD:InteropIndex', + 'InteropIFD:InteropVersion', + 'InteropIFD:RelatedImageWidth', + 'InteropIFD:RelatedImageHeight', + ], + # standard tags used to define the color space of an image + # (useful to preserve color space when deleting all meta information) + ColorSpaceTags => [ + 'ExifIFD:ColorSpace', + 'ExifIFD:Gamma', + 'InteropIFD:InteropIndex', + 'ICC_Profile', + ], + # common metadata tags found in IFD0 of TIFF images + CommonIFD0 => [ + # standard EXIF + 'IFD0:ImageDescription', + 'IFD0:Make', + 'IFD0:Model', + 'IFD0:Software', + 'IFD0:ModifyDate', + 'IFD0:Artist', + 'IFD0:Copyright', + # other TIFF tags + 'IFD0:Rating', + 'IFD0:RatingPercent', + 'IFD0:DNGLensInfo', + 'IFD0:PanasonicTitle', + 'IFD0:PanasonicTitle2', + 'IFD0:XPTitle', + 'IFD0:XPComment', + 'IFD0:XPAuthor', + 'IFD0:XPKeywords', + 'IFD0:XPSubject', + ], + # large binary data tags which won't be loaded if excluded when extracting + LargeTags => [ + 'CanonVRD', + 'DLOData', + 'EXIF', + 'ICC_Profile', + 'IDCPreviewImage', + 'ImageData', + 'IPTC', + 'JpgFromRaw', + 'OriginalRawImage', + 'OtherImage', + 'PreviewImage', + 'ThumbnailImage', + 'TIFFPreview', + 'XML', + 'XMP', + 'ZoomedPreviewImage', + ], + 'ls-l' => [ + 'FilePermissions', + 'FileHardLinks', + 'FileUserID', + 'FileGroupID', + 'FileSize#', + 'FileModifyDate', + 'FileName', + ], +); + +#------------------------------------------------------------------------------ +# load user-defined shortcuts if available +# Inputs: reference to user-defined shortcut hash +sub LoadShortcuts($) +{ + my $shortcuts = shift; + my $shortcut; + foreach $shortcut (keys %$shortcuts) { + my $val = $$shortcuts{$shortcut}; + # also allow simple aliases + $val = [ $val ] unless ref $val eq 'ARRAY'; + # save the user-defined shortcut or alias + $Image::ExifTool::Shortcuts::Main{$shortcut} = $val; + } +} +# (for backward compatibility, renamed in ExifTool 7.75) +if (%Image::ExifTool::Shortcuts::UserDefined) { + LoadShortcuts(\%Image::ExifTool::Shortcuts::UserDefined); +} +if (%Image::ExifTool::UserDefined::Shortcuts) { + LoadShortcuts(\%Image::ExifTool::UserDefined::Shortcuts); +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Shortcuts - ExifTool shortcut tags + +=head1 SYNOPSIS + +This module is required by Image::ExifTool. + +=head1 DESCRIPTION + +This module contains definitions for tag name shortcuts used by +Image::ExifTool. You can customize this file to add your own shortcuts. + +Individual users may also add their own shortcuts to the .ExifTool_config +file in their home directory (or the directory specified by the +EXIFTOOL_HOME environment variable). The shortcuts are defined in a hash +called %Image::ExifTool::UserDefined::Shortcuts. The keys of the hash are +the shortcut names, and the elements are either tag names or references to +lists of tag names. + +An example shortcut definition in .ExifTool_config: + + %Image::ExifTool::UserDefined::Shortcuts = ( + MyShortcut => ['createdate','exif:exposuretime','aperture'], + MyAlias => 'FocalLengthIn35mmFormat', + ); + +In this example, MyShortcut is a shortcut for the CreateDate, +EXIF:ExposureTime and Aperture tags, and MyAlias is a shortcut for +FocalLengthIn35mmFormat. + +The target tag names may contain an optional group name prefix. A group +name applied to the shortcut will be ignored for any target tag with a group +name prefix. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Sigma.pm b/lib/Image/ExifTool/Sigma.pm new file mode 100644 index 0000000..d0a3bf1 --- /dev/null +++ b/lib/Image/ExifTool/Sigma.pm @@ -0,0 +1,858 @@ +#------------------------------------------------------------------------------ +# File: Sigma.pm +# +# Description: Sigma/Foveon EXIF maker notes tags +# +# Revisions: 04/06/2004 - P. Harvey Created +# 02/20/2007 - PH added SD14 tags +# 24/06/2010 - PH decode some SD15 tags +# +# References: 1) http://www.x3f.info/technotes/FileDocs/MakerNoteDoc.html +# IB) Iliah Borg private communication (LibRaw) +# NJ) Niels Kristian Bech Jensen +# JR) Jos Roost +#------------------------------------------------------------------------------ + +package Image::ExifTool::Sigma; + +use strict; +use vars qw($VERSION %sigmaLensTypes); +use Image::ExifTool::Exif; + +$VERSION = '1.31'; + +# sigma LensType lookup (ref IB) +%sigmaLensTypes = ( + Notes => q{ + Sigma LensType values are hexadecimal numbers stored as a string (without + the leading "0x"). Decimal values have been added to differentiate lenses + which would otherwise have the same LensType, and are used by the Composite + LensID tag when attempting to identify the specific lens model. + }, + # 0x0 => 'Sigma 50mm F2.8 EX Macro', (0x0 used for other lenses too) + # 0x8 - 18-125mm LENSARANGE@18mm=22-4 + 0x10, 'Sigma 50mm F2.8 EX DG MACRO', + # (0x10 = 16) + 16.1 => 'Sigma 70mm F2.8 EX DG Macro', + 16.2 => 'Sigma 105mm F2.8 EX DG Macro', + 0x16 => 'Sigma 18-50mm F3.5-5.6 DC', #PH + 0x103 => 'Sigma 180mm F3.5 EX IF HSM APO Macro', + 0x104 => 'Sigma 150mm F2.8 EX DG HSM APO Macro', + 0x105 => 'Sigma 180mm F3.5 EX DG HSM APO Macro', + 0x106 => 'Sigma 150mm F2.8 EX DG OS HSM APO Macro', + 0x107 => 'Sigma 180mm F2.8 EX DG OS HSM APO Macro', + # (0x129 = 297) + 0x129 => 'Sigma Lens (0x129)', #PH + 297.1 => 'Sigma 14mm F2.8 EX Aspherical', #PH + 297.2 => 'Sigma 30mm F1.4', + # (0x131 = 305) + 0x131 => 'Sigma Lens (0x131)', + 305.1 => 'Sigma 17-70mm F2.8-4.5 DC Macro', #PH + 305.2 => 'Sigma 70-200mm F2.8 APO EX HSM', + 305.3 => 'Sigma 120-300mm F2.8 APO EX IF HSM', + 0x134 => 'Sigma 100-300mm F4 EX DG HSM APO', + 0x135 => 'Sigma 120-300mm F2.8 EX DG HSM APO', + 0x136 => 'Sigma 120-300mm F2.8 EX DG OS HSM APO', + 0x137 => 'Sigma 120-300mm F2.8 DG OS HSM | S', + 0x143 => 'Sigma 600mm F8 Mirror', + # (0x145 = 325) + 0x145 => 'Sigma Lens (0x145)', #PH + 325.1 => 'Sigma 15-30mm F3.5-4.5 EX DG Aspherical', #PH + 325.2 => 'Sigma 18-50mm F2.8 EX DG', #PH (NC) + 325.3 => 'Sigma 20-40mm F2.8 EX DG', #PH + 0x150 => 'Sigma 30mm F1.4 DC HSM', + # (0x152 = 338) + 0x152 => 'Sigma Lens (0x152)', + 338.1 => 'Sigma APO 800mm F5.6 EX DG HSM', + 338.2 => 'Sigma 12-24mm F4.5-5.6 EX DG ASP HSM', + 338.3 => 'Sigma 10-20mm F4-5.6 EX DC HSM', + 0x165 => 'Sigma 70-200mm F2.8 EX', # ...but what specific model?: + # 70-200mm F2.8 EX APO - Original version, minimum focus distance 1.8m (1999) + # 70-200mm F2.8 EX DG - Adds 'digitally optimized' lens coatings to reduce flare (2005) + # 70-200mm F2.8 EX DG Macro (HSM) - Minimum focus distance reduced to 1m (2006) + # 70-200mm F2.8 EX DG Macro HSM II - Improved optical performance (2007) + 0x169 => 'Sigma 18-50mm F2.8 EX DC', #PH (NC) + 0x183 => 'Sigma 500mm F4.5 EX HSM APO', + 0x184 => 'Sigma 500mm F4.5 EX DG HSM APO', + 0x185 => 'Sigma 500mm F4 DG OS HSM | S', #JR (NC; based on product number) (016) + 0x194 => 'Sigma 300mm F2.8 EX HSM APO', + 0x195 => 'Sigma 300mm F2.8 EX DG HSM APO', + 0x200 => 'Sigma 12-24mm F4.5-5.6 EX DG ASP HSM', + 0x201 => 'Sigma 10-20mm F4-5.6 EX DC HSM', + 0x202 => 'Sigma 10-20mm F3.5 EX DC HSM', + 0x203 => 'Sigma 8-16mm F4.5-5.6 DC HSM', + 0x204 => 'Sigma 12-24mm F4.5-5.6 DG HSM II', + 0x205 => 'Sigma 12-24mm F4 DG HSM | A', #JR (NC; based on product number) (016) + 0x210 => 'Sigma 18-35mm F1.8 DC HSM | A', + 0x240 => 'Sigma 135mm F1.8 DG HSM | A', #JR (NC; based on product number) (017) + 0x256 => 'Sigma 105mm F2.8 EX Macro', + 0x257 => 'Sigma 105mm F2.8 EX DG Macro', + 0x258 => 'Sigma 105mm F2.8 EX DG OS HSM Macro', + 0x259 => 'Sigma 105mm F1.4 DG HSM | A', #IB (A018) + 0x270 => 'Sigma 70mm F2.8 EX DG Macro', #NJ (SD1) + 0x271 => 'Sigma 70mm F2.8 DG Macro | A', #IB (A018) + 0x300 => 'Sigma 30mm F1.4 EX DC HSM', + 0x301 => 'Sigma 30mm F1.4 DC HSM | A', + 0x302 => 'Sigma 30mm F1.4 DC DN | C', #JR (DN lenses are only for Sony E or MFT mount) + 0x310 => 'Sigma 50mm F1.4 EX DG HSM', + 0x311 => 'Sigma 50mm F1.4 DG HSM | A', + 0x320 => 'Sigma 85mm F1.4 EX DG HSM', + 0x321 => 'Sigma 85mm F1.4 DG HSM | A', #JR (NC; based on product number) (016) + 0x330 => 'Sigma 30mm F2.8 EX DN', + 0x340 => 'Sigma 35mm F1.4 DG HSM', + 0x345 => 'Sigma 50mm F2.8 EX Macro', + 0x346 => 'Sigma 50mm F2.8 EX DG Macro', + 0x350 => 'Sigma 60mm F2.8 DN | A', + 0x400 => 'Sigma 19mm F2.8 EX DN', + 0x401 => 'Sigma 24mm F1.4 DG HSM | A', + 0x411 => 'Sigma 20mm F1.8 EX DG ASP RF', + 0x412 => 'Sigma 20mm F1.4 DG HSM | A', + 0x432 => 'Sigma 24mm F1.8 EX DG ASP Macro', + 0x440 => 'Sigma 28mm F1.8 EX DG ASP Macro', + 0x450 => 'Sigma 14mm F1.8 DH HSM | A', #JR (NC; based on product number) (017) + 0x461 => 'Sigma 14mm F2.8 EX ASP HSM', + 0x475 => 'Sigma 15mm F2.8 EX Diagonal FishEye', + 0x476 => 'Sigma 15mm F2.8 EX DG Diagonal Fisheye', + 0x477 => 'Sigma 10mm F2.8 EX DC HSM Fisheye', + 0x483 => 'Sigma 8mm F4 EX Circular Fisheye', + 0x484 => 'Sigma 8mm F4 EX DG Circular Fisheye', + 0x485 => 'Sigma 8mm F3.5 EX DG Circular Fisheye', + 0x486 => 'Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye', + 0x504 => 'Sigma 70-300mm F4-5.6 Macro Super', #IB + 0x505 => 'Sigma APO 70-300mm F4-5.6 Macro Super', #IB + 0x506 => 'Sigma 70-300mm F4-5.6 APO Macro Super II', + 0x507 => 'Sigma 70-300mm F4-5.6 DL Macro Super II', + 0x508 => 'Sigma 70-300mm F4-5.6 DG APO Macro', + 0x509 => 'Sigma 70-300mm F4-5.6 DG Macro', + 0x510 => 'Sigma 17-35 F2.8-4 EX DG ASP', + 0x512 => 'Sigma 15-30mm F3.5-4.5 EX DG ASP DF', + 0x513 => 'Sigma 20-40mm F2.8 EX DG', + 0x519 => 'Sigma 17-35 F2.8-4 EX ASP HSM', + 0x520 => 'Sigma 100-300mm F4.5-6.7 DL', + 0x521 => 'Sigma 18-50mm F3.5-5.6 DC Macro', + 0x527 => 'Sigma 100-300mm F4 EX IF HSM', + 0x529 => 'Sigma 120-300mm F2.8 EX HSM IF APO', + 0x545 => 'Sigma 28-70mm F2.8 EX ASP DF', #IB + 0x547 => 'Sigma 24-60mm F2.8 EX DG', + 0x548 => 'Sigma 24-70mm F2.8 EX DG Macro', + 0x549 => 'Sigma 28-70mm F2.8 EX DG', + 0x566 => 'Sigma 70-200mm F2.8 EX IF APO', + 0x567 => 'Sigma 70-200mm F2.8 EX IF HSM APO', + 0x568 => 'Sigma 70-200mm F2.8 EX DG IF HSM APO', + 0x569 => 'Sigma 70-200 F2.8 EX DG HSM APO Macro', + 0x571 => 'Sigma 24-70mm F2.8 IF EX DG HSM', + 0x572 => 'Sigma 70-300mm F4-5.6 DG OS', + 0x576 => 'Sigma 24-70mm F2.8 DG OS HSM | A', #JR (NC; based on product number) (017) + 0x579 => 'Sigma 70-200mm F2.8 EX DG HSM APO Macro', # (also II version) + 0x580 => 'Sigma 18-50mm F2.8 EX DC', + 0x581 => 'Sigma 18-50mm F2.8 EX DC Macro', #PH (SD1) + 0x582 => 'Sigma 18-50mm F2.8 EX DC HSM Macro', + 0x583 => 'Sigma 17-50mm F2.8 EX DC OS HSM', #PH (also SD1 Kit, is this HSM? - PH) + 0x588 => 'Sigma 24-35mm F2 DG HSM | A', + 0x589 => 'Sigma APO 70-200mm F2.8 EX DG OS HSM', + 0x594 => 'Sigma 300-800mm F5.6 EX HSM IF APO', + 0x595 => 'Sigma 300-800mm F5.6 EX DG APO HSM', + 0x597 => 'Sigma 200-500mm F2.8 APO EX DG', + 0x5A8 => 'Sigma 70-300mm F4-5.6 APO DG Macro (Motorized)', + 0x5A9 => 'Sigma 70-300mm F4-5.6 DG Macro (Motorized)', + 0x605 => 'Sigma 24-70mm F3.5-5.6 ASP HF', #IB + 0x633 => 'Sigma 28-70mm F2.8-4 HS', + 0x634 => 'Sigma 28-70mm F2.8-4 DG', + 0x635 => 'Sigma 24-105mm F4 DG OS HSM | A', + 0x644 => 'Sigma 28-80mm F3.5-5.6 ASP HF Macro', + 0x659 => 'Sigma 28-80mm F3.5-5.6 Mini Zoom Macro II ASP', + 0x661 => 'Sigma 28-105mm F2.8-4 IF ASP', + 0x663 => 'Sigma 28-105mm F3.8-5.6 IF UC-III ASP', + 0x664 => 'Sigma 28-105mm F2.8-4 IF DG ASP', + 0x667 => 'Sigma 24-135mm F2.8-4.5 IF ASP', + 0x668 => 'Sigma 17-70mm F2.8-4 DC Macro OS HSM', + 0x669 => 'Sigma 17-70mm F2.8-4.5 DC HSM Macro', + 0x684 => 'Sigma 55-200mm F4-5.6 DC', + 0x686 => 'Sigma 50-200mm F4-5.6 DC OS HSM', + 0x689 => 'Sigma 17-70mm F2.8-4.5 DC Macro', + 0x690 => 'Sigma 50-150mm F2.8 EX DC HSM APO', + 0x691 => 'Sigma 50-150mm F2.8 EX DC APO HSM II', + 0x692 => 'Sigma APO 50-150mm F2.8 EX DC OS HSM', + 0x693 => 'Sigma 50-100mm F1.8 DC HSM | A', #JR (NC; based on product number) (016) + 0x709 => 'Sigma 28-135mm F3.8-5.6 IF ASP Macro', + 0x723 => 'Sigma 135-400mm F4.5-5.6 ASP APO', + 0x725 => 'Sigma 80-400mm F4.5-5.6 EX OS', + 0x726 => 'Sigma 80-400mm F4.5-5.6 EX DG OS APO', + 0x727 => 'Sigma 135-400mm F4.5-5.6 DG ASP APO', + 0x728 => 'Sigma 120-400mm F4.5-5.6 DG APO OS HSM', + 0x729 => 'Sigma 100-400mm F5-6.3 DG OS HSM | C', #JR (017) + 0x730 => 'Sigma 60-600mm F4.5-6.3 DG OS HSM | S', #IB (S018) + 0x733 => 'Sigma 170-500mm F5-6.3 ASP APO', + 0x734 => 'Sigma 170-500mm F5-6.3 DG ASP APO', + 0x735 => 'Sigma 50-500mm F4-6.3 EX RF HSM APO', + 0x736 => 'Sigma 50-500mm F4-6.3 EX DG HSM APO', + 0x737 => 'Sigma 150-500mm F5-6.3 APO DG OS HSM', + 0x738 => 'Sigma 50-500mm F4.5-6.3 APO DG OS HSM', + 0x740 => 'Sigma 150-600mm F5-6.3 DG OS HSM | S', + 0x745 => 'Sigma 150-600mm F5-6.3 DG OS HSM | C', + 0x777 => 'Sigma 18-200mm F3.5-6.3 DC', + 0x77D => 'Sigma 18-200mm F3.5-6.3 DC (Motorized)', + 0x785 => 'Sigma 28-200mm F3.5-5.6 DL ASP IF HZM Macro', #IB + 0x787 => 'Sigma 28-200mm F3.5-5.6 Compact ASP HZ Macro', + 0x789 => 'Sigma 18-125mm F3.5-5.6 DC', + 0x790 => 'Sigma 28-300mm F3.5-6.3 DL ASP IF HZM', #IB + 0x793 => 'Sigma 28-300mm F3.5-6.3 Macro', + 0x794 => 'Sigma 28-200mm F3.5-5.6 DG Compact ASP HZ Macro', + 0x795 => 'Sigma 28-300mm F3.5-6.3 DG Macro', + 0x823 => 'Sigma 1.4X TC EX APO', + 0x824 => 'Sigma 1.4X Teleconverter EX APO DG', + 0x853 => 'Sigma 18-125mm F3.8-5.6 DC OS HSM', + 0x861 => 'Sigma 18-50mm F2.8-4.5 DC OS HSM', #NJ (SD1) + 0x870 => 'Sigma 2.0X Teleconverter TC-2001', #JR + 0x875 => 'Sigma 2.0X TC EX APO', + 0x876 => 'Sigma 2.0X Teleconverter EX APO DG', + 0x879 => 'Sigma 1.4X Teleconverter TC-1401', #JR + 0x880 => 'Sigma 18-250mm F3.5-6.3 DC OS HSM', + 0x882 => 'Sigma 18-200mm F3.5-6.3 II DC OS HSM', + 0x883 => 'Sigma 18-250mm F3.5-6.3 DC Macro OS HSM', + 0x884 => 'Sigma 17-70mm F2.8-4 DC OS HSM Macro | C', + 0x885 => 'Sigma 18-200mm F3.5-6.3 DC OS HSM Macro | C', + 0x886 => 'Sigma 18-300mm F3.5-6.3 DC OS HSM Macro | C', + 0x888 => 'Sigma 18-200mm F3.5-6.3 DC OS', + 0x890 => 'Sigma Mount Converter MC-11', #JR + 0x929 => 'Sigma 19mm F2.8 DN | A', + 0x929 => 'Sigma 30mm F2.8 DN | A', + 0x929 => 'Sigma 60mm F2.8 DN | A', + 0x1003 => 'Sigma 19mm F2.8', #PH (DP1 Merrill kit) + 0x1004 => 'Sigma 30mm F2.8', #PH (DP2 Merrill kit) + 0x1005 => 'Sigma 50mm F2.8 Macro', #PH (DP3 Merrill kit) + 0x1006 => 'Sigma 19mm F2.8', #NJ (DP1 Quattro kit) + 0x1007 => 'Sigma 30mm F2.8', #PH (DP2 Quattro kit) + 0x1008 => 'Sigma 50mm F2.8 Macro', #NJ (DP3 Quattro kit) + 0x1009 => 'Sigma 14mm F4', #NJ (DP0 Quattro kit) + # L-mount lenses?: + 0x6001 => 'Sigma 150-600mm F5-6.3 DG OS HSM | S', #PH (NC, fp) + 0x6003 => 'Sigma 45mm F2.8 DG DN | C', #PH (NC, fp) + 0x6006 => 'Sigma 50mm F1.4 DG HSM | A', #IB (014) + 0x8005 => 'Sigma 35mm F1.4 DG HSM | A', #PH (012) + 0x8009 => 'Sigma 18-35mm F1.8 DC HSM | A', #PH + 0x8900 => 'Sigma 70-300mm F4-5.6 DG OS', #PH (SD15) + 0xA100 => 'Sigma 24-70mm F2.8 DG Macro', #PH (SD15) + # 'FFFF' - seen this for a 28-70mm F2.8 lens - PH +); + +%Image::ExifTool::Sigma::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + WRITABLE => 'string', + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + These tags are written by Sigma/Foveon cameras. In the early days Sigma was + a class leader by releasing their maker note specification to the public, + but since then they have deviated from this standard and newer camera models + are less than consistent about their metadata formats. + }, + 0x0002 => 'SerialNumber', + 0x0003 => 'DriveMode', + 0x0004 => 'ResolutionMode', + 0x0005 => 'AFMode', + 0x0006 => 'FocusSetting', + 0x0007 => 'WhiteBalance', + 0x0008 => { + Name => 'ExposureMode', + PrintConv => { #PH + A => 'Aperture-priority AE', + M => 'Manual', + P => 'Program AE', + S => 'Shutter speed priority AE', + }, + }, + 0x0009 => { + Name => 'MeteringMode', + PrintConv => { #PH + A => 'Average', + C => 'Center-weighted average', + 8 => 'Multi-segment', + }, + }, + 0x000a => 'LensFocalRange', + 0x000b => 'ColorSpace', + # SIGMA PhotoPro writes these tags as strings, but some cameras (at least) write them as rational + 0x000c => [ + { + Name => 'ExposureCompensation', + Condition => '$format eq "string"', + ValueConv => '$val =~ s/Expo:\s*//, $val', + ValueConvInv => 'IsFloat($val) ? sprintf("Expo:%+.1f",$val) : undef', + }, + { #PH + Name => 'ExposureAdjust', + Writable => 'rational64s', + Unknown => 1, + }, + ], + 0x000d => [ + { + Name => 'Contrast', + Condition => '$format eq "string"', + ValueConv => '$val =~ s/Cont:\s*//, $val', + ValueConvInv => 'IsFloat($val) ? sprintf("Cont:%+.1f",$val) : undef', + }, + { #PH + Name => 'Contrast', + Writable => 'rational64s', + Priority => 0, + }, + ], + 0x000e => [ + { + Name => 'Shadow', + Condition => '$format eq "string"', + ValueConv => '$val =~ s/Shad:\s*//, $val', + ValueConvInv => 'IsFloat($val) ? sprintf("Shad:%+.1f",$val) : undef', + }, + { #PH (may be incorrect for the SD1) + Name => 'Shadow', + Writable => 'rational64s', + Priority => 0, + }, + ], + 0x000f => [ + { + Name => 'Highlight', + Condition => '$format eq "string"', + ValueConv => '$val =~ s/High:\s*//, $val', + ValueConvInv => 'IsFloat($val) ? sprintf("High:%+.1f",$val) : undef', + }, + { #PH (may be incorrect for the SD1) + Name => 'Highlight', + Writable => 'rational64s', + Priority => 0, + }, + ], + 0x0010 => [ + { + Name => 'Saturation', + Condition => '$format eq "string"', + ValueConv => '$val =~ s/Satu:\s*//, $val', + ValueConvInv => 'IsFloat($val) ? sprintf("Satu:%+.1f",$val) : undef', + }, + { #PH (may be incorrect for the SD1) + Name => 'Saturation', + Writable => 'rational64s', + Priority => 0, + }, + ], + 0x0011 => [ + { + Name => 'Sharpness', + Condition => '$format eq "string"', + ValueConv => '$val =~ s/Shar:\s*//, $val', + ValueConvInv => 'IsFloat($val) ? sprintf("Shar:%+.1f",$val) : undef', + }, + { #PH (may be incorrect for the SD1) + Name => 'Sharpness', + Writable => 'rational64s', + Priority => 0, + }, + ], + 0x0012 => [ + { + Name => 'X3FillLight', + Condition => '$format eq "string"', + ValueConv => '$val =~ s/Fill:\s*//, $val', + ValueConvInv => 'IsFloat($val) ? sprintf("Fill:%+.1f",$val) : undef', + }, + { #PH + Name => 'X3FillLight', + Writable => 'rational64s', + }, + ], + 0x0014 => [ + { + Name => 'ColorAdjustment', + Condition => '$format eq "string"', + ValueConv => '$val =~ s/CC:\s*//, $val', + ValueConvInv => 'IsInt($val) ? "CC:$val" : undef', + }, + { #PH + Name => 'ColorAdjustment', + Writable => 'rational64s', + Count => 3, + }, + ], + 0x0015 => 'AdjustmentMode', + 0x0016 => { + Name => 'Quality', + ValueConv => '$val =~ s/Qual:\s*//, $val', + ValueConvInv => 'IsInt($val) ? "Qual:$val" : undef', + }, + 0x0017 => 'Firmware', + 0x0018 => { + Name => 'Software', + Priority => 0, + }, + 0x0019 => 'AutoBracket', + 0x001a => [ #PH + { + Name => 'PreviewImageStart', + Condition => '$format eq "int32u"', + Notes => q{ + Sigma Photo Pro writes ChrominanceNoiseReduction here, but various + models use this for PreviewImageStart + }, + IsOffset => 1, + OffsetPair => 0x001b, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + },{ # (written by Sigma Photo Pro) + Name => 'ChrominanceNoiseReduction', + Condition => '$format eq "string"', + ValueConv => '$val =~ s/Chro:\s*//, $val', + ValueConvInv => 'IsFloat($val) ? sprintf("Chro:%+.1f",$val) : undef', + }, + # the SD1 writes something else here (rational64s, value 0/10) + # (but we can't test by model because Sigma Photo Pro writes this too) + ], + 0x001b => [ #PH + { + Name => 'PreviewImageLength', + Condition => '$format eq "int32u"', + Notes => q{ + Sigma Photo Pro writes LuminanceNoiseReduction here, but various models use + this for PreviewImageLength + }, + OffsetPair => 0x001a, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + },{ # (written by Sigma Photo Pro) + Name => 'LuminanceNoiseReduction', + Condition => '$format eq "string"', + ValueConv => '$val =~ s/Luma:\s*//, $val', + ValueConvInv => 'IsFloat($val) ? sprintf("Luma:%+.1f",$val) : undef', + }, + # the SD1 writes something else here (rational64s, value 0/10) + ], + 0x001c => [ #PH + { + Name => 'PreviewImageSize', + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => q{ + PreviewImageStart for the SD1 and Merrill/Quattro models, and + PreviewImageSize for others + }, + Writable => 'int16u', + Count => 2, + PrintConv => '$val =~ tr/ /x/; $val', + PrintConvInv => '$val =~ tr/x/ /; $val', + },{ + Name => 'PreviewImageStart', + Condition => '$format eq "int32u"', + IsOffset => 1, + OffsetPair => 0x001d, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + ], + 0x001d => [ #PH + { + Name => 'MakerNoteVersion', + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => q{ + PreviewImageLength for the SD1 and Merrill/Quattro models, and + MakerNoteVersion for others + }, + Writable => 'undef', + },{ + Name => 'PreviewImageLength', + Condition => '$format eq "int32u"', + OffsetPair => 0x001c, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, + ], + # 0x001e - int16u: 0, 4, 13 - flash mode for other models? + 0x001e => { #PH + Name => 'PreviewImageSize', + Condition => '$$self{MakerNoteSigmaVer} >= 3', + Notes => 'only valid for some models', + Writable => 'int16u', + Count => 2, + PrintConv => '$val =~ tr/ /x/; $val', + PrintConvInv => '$val =~ tr/x/ /; $val', + }, + 0x001f => [ #PH + { + Name => 'AFPoint', # (NC -- invalid for SD9,SD14?) + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => q{ + MakerNoteVersion for the SD1 and Merrill/Quattro models, and AFPoint for + others + }, + # values: "", "Center", "Center,Center", "Right,Right" + },{ + Name => 'MakerNoteVersion', + Writable => 'undef', + }, + ], + # 0x0020 - string: " " for most models, or int16u: 4 for the DP3 Merrill + # 0x0021 - string: " " for most models, or int8u[2]: '3 3' for the DP3 Merrill + 0x0022 => { #PH (NC) + Name => 'FileFormat', + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => 'models other than the SD1 and Merrill/Quattro models', + # values: "JPG", "JPG-S", "JPG-P", "X3F", "X3F-S" + }, + # 0x0023 - string: "", 10, 83, 131, 145, 150, 152, 169 + 0x0024 => { # (invalid for SD9,SD14?) + Name => 'Calibration', + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => 'models other than the SD1 and Merrill/Quattro models', + }, + # 0x0025 - string: "", "0.70", "0.90" + # 0x0026-2b - int32u: 0 + 0x0026 => { #PH (NC) + Name => 'FileFormat', + Condition => '$$self{MakerNoteSigmaVer} >= 3', + Notes => 'some newer models only', + # (also Sigma fp) + }, + 0x0027 => [{ #PH + Name => 'LensType', + Condition => '$$self{MakerNoteSigmaVer} >= 3 and $format eq "string"', + Notes => 'some newer models only', + ValueConv => '$val =~ /^[0-9a-f]+$/i ? hex($val) : $val', + # (truncate decimal part and convert hex) + ValueConvInv => '$val=~s/\.\d+$//;$val=~/^0x/ and $val=hex($val);IsInt($val) ? sprintf("%x",$val) : $val', + SeparateTable => 'LensType', + PrintHex => 1, + PrintConv => \%sigmaLensTypes, + },{ #PH + Name => 'LensType', + Condition => '$$self{MakerNoteSigmaVer} >= 3', + Notes => 'some other models like the fp', + Writable => 'int16u', + SeparateTable => 'LensType', + PrintHex => 1, + PrintConv => \%sigmaLensTypes, + }], + 0x002a => { #PH + Name => 'LensFocalRange', + Condition => '$$self{MakerNoteSigmaVer} >= 3', + Notes => 'some newer models only', + Writable => 'rational64u', + Count => 2, + PrintConv => '$val=~s/ / to /; $val', + PrintConvInv => '$val=~s/to //; $val', + }, + 0x002b => { #PH + Name => 'LensMaxApertureRange', + # for most models this gives the max aperture at the long/short focal lengths, + # but for some models this gives the min/max aperture + Condition => '$$self{MakerNoteSigmaVer} >= 3', + Notes => 'some newer models only', + Writable => 'rational64u', + Count => 2, + PrintConv => '$val=~s/ / to /; $val', + PrintConvInv => '$val=~s/to /; $val', + }, + # 0x002c is rational64u for some models, with a value that may be related to FNumber - PH + 0x002c => { #PH + Name => 'ColorMode', + Condition => '$format eq "int32u"', + Notes => 'not valid for some models', + Writable => 'int32u', + # this tag written by Sigma Photo Pro even for cameras that write 'n/a' here + PrintConv => { + 0 => 'n/a', + 1 => 'Sepia', + 2 => 'B&W', + 3 => 'Standard', + 4 => 'Vivid', + 5 => 'Neutral', + 6 => 'Portrait', + 7 => 'Landscape', + 8 => 'FOV Classic Blue', + }, + }, + # 0x002d - int32u: 0 + # 0x002e - rational64s: (the negative of FlashExposureComp, but why?) + # 0x002f - int32u: 0, 1 + 0x0030 => [ #PH + { + Name => 'LensApertureRange', + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => q{ + Calibration for the SD1 and Merrill/Quattro models, and LensApertureRange + for others. Note that LensApertureRange changes with focal length, and some + models report the maximum aperture here + }, + },{ + Name => 'Calibration', + }, + ], + 0x0031 => { #PH + Name => 'FNumber', + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => 'models other than the SD1 and Merrill/Quattro models', + Writable => 'rational64u', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + Priority => 0, + }, + 0x0032 => { #PH + Name => 'ExposureTime', + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => 'models other than the SD1 and Merrill/Quattro models', + Writable => 'rational64u', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => '$val', + Priority => 0, + }, + 0x0033 => { #PH + Name => 'ExposureTime2', + Condition => '$$self{Model} !~ / (SD1|SD9|SD15|Merrill|Quattro|fp)$/', + Notes => 'models other than the SD1, SD9, SD15 and Merrill/Quattro models', + ValueConv => '$val * 1e-6', + ValueConvInv => 'int($val * 1e6 + 0.5)', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x0034 => { #PH + Name => 'BurstShot', + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => 'models other than the SD1 and Merrill/Quattro models', + Writable => 'int32u', + }, + # 0x0034 - int32u: 0,1,2,3 or 4 + 0x0035 => { #PH + Name => 'ExposureCompensation', + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => 'models other than the SD1 and Merrill/Quattro models', + Writable => 'rational64s', + # add a '+' sign to positive values + PrintConv => '$val and $val =~ s/^(\d)/\+$1/; $val', + PrintConvInv => '$val', + }, + # 0x0036 - string: " " + # 0x0037-38 - string: "" + 0x0039 => { #PH (invalid for SD9, SD14?) + Name => 'SensorTemperature', + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => 'models other than the SD1 and Merrill/Quattro models', + # (string format) + PrintConv => 'IsInt($val) ? "$val C" : $val', + PrintConvInv => '$val=~s/ ?C$//; $val', + }, + 0x003a => { #PH + Name => 'FlashExposureComp', + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => 'models other than the SD1 and Merrill/Quattro models', + Writable => 'rational64s', + }, + 0x003b => { #PH (how is this different from other Firmware?) + Name => 'Firmware', + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => 'models other than the SD1 and Merrill/Quattro models', + Priority => 0, + }, + 0x003c => { #PH + Name => 'WhiteBalance', + Condition => '$$self{MakerNoteSigmaVer} < 3', + Notes => 'models other than the SD1 and Merrill/Quattro models', + Priority => 0, + }, + 0x003d => { #PH (new for SD15 and SD1) + Name => 'PictureMode', + Notes => 'same as ColorMode, but "Standard" when ColorMode is Sepia or B&W', + }, + 0x0048 => { #PH + Name => 'LensApertureRange', + Condition => '$$self{MakerNoteSigmaVer} >= 3', + Notes => 'some newer models only', + }, + 0x0049 => { #PH + Name => 'FNumber', + Condition => '$$self{MakerNoteSigmaVer} >= 3', + Notes => 'some newer models only', + Writable => 'rational64u', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + Priority => 0, + }, + 0x004a => { #PH + Name => 'ExposureTime', + Condition => '$$self{MakerNoteSigmaVer} >= 3', + Notes => 'some newer models only', + Writable => 'rational64u', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => '$val', + Priority => 0, + }, + 0x004b => [{ #PH + Name => 'ExposureTime2', + Condition => '$$self{Model} =~ /^SIGMA (SD1( Merrill)?|DP\d Merrill)$/', + Notes => 'SD1 and DP Merrill models only', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + },{ #PH + Name => 'ExposureTime2', + Condition => '$$self{Model} =~ /^SIGMA dp\d Quattro$/i', + Notes => 'DP Quattro models only', + ValueConv => '$val / 1000000', + ValueConvInv => '$val * 1000000', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }], + 0x004d => { #PH + Name => 'ExposureCompensation', + Condition => '$$self{MakerNoteSigmaVer} >= 3', + Notes => 'some newer models only', + Writable => 'rational64s', + # add a '+' sign to positive values + PrintConv => '$val and $val =~ s/^(\d)/\+$1/; $val', + PrintConvInv => '$val', + }, + # 0x0054 - string: "F20","F23" + 0x0055 => { #PH + Name => 'SensorTemperature', + Condition => '$$self{MakerNoteSigmaVer} >= 3', + Notes => 'some newer models only', + # (string format) + PrintConv => 'IsInt($val) ? "$val C" : $val', + PrintConvInv => '$val=~s/ ?C$//; $val', + }, + 0x0056 => { #PH (NC) + Name => 'FlashExposureComp', + Condition => '$$self{MakerNoteSigmaVer} >= 3', + Notes => 'some newer models only', + Writable => 'rational64s', + }, + 0x0057 => { #PH (how is this different from other Firmware?) + Name => 'Firmware2', + Condition => '$format eq "string"', + Notes => 'some newer models only', + Priority => 0, + }, + 0x0058 => { #PH + Name => 'WhiteBalance', + Condition => '$$self{MakerNoteSigmaVer} >= 3', + Notes => 'some newer models only', + Priority => 0, + }, + 0x0059 => { #PH + Name => 'DigitalFilter', + Condition => '$$self{MakerNoteSigmaVer} >= 3', + Notes => 'some newer models only', + # seen: Standard,Landscape,Monochrome,Neutral,Portrait,Sepia,Vivid + }, + # 0x005a/b/c - rational64s: 0/10 for the SD1 + 0x0084 => { #PH (Quattro models and fp) + Name => 'Model', + Description => 'Camera Model Name', + }, + # 0x0085 + 0x0086 => { #PH (Quattro models) + Name => 'ISO', + Writable => 'int16u', + }, + 0x0087 => 'ResolutionMode', #PH (Quattro models) + 0x0088 => 'WhiteBalance', #PH (Quattro models) + 0x008c => 'Firmware', #PH (Quattro models) + 0x011f => { #IB (FP DNG images) + Name => 'CameraCalibration', + Writable => 'float', + Count => 9, + }, + 0x0120 => { #IB (FP DNG images) + Name => 'WBSettings', + SubDirectory => { TagTable => 'Image::ExifTool::Sigma::WBSettings' }, + }, + 0x0121 => { #IB (FP DNG images) + Name => 'WBSettings2', + SubDirectory => { TagTable => 'Image::ExifTool::Sigma::WBSettings2' }, + }, +); + +# WB settings (ref IB) +%Image::ExifTool::Sigma::WBSettings = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'float', + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => { Name => 'WB_RGBLevelsAuto', Format => 'float[3]' }, + 3 => { Name => 'WB_RGBLevelsDaylight', Format => 'float[3]' }, + 6 => { Name => 'WB_RGBLevelsShade', Format => 'float[3]' }, + 9 => { Name => 'WB_RGBLevelsOvercast', Format => 'float[3]' }, + 12 => { Name => 'WB_RGBLevelsIncandescent', Format => 'float[3]' }, + 15 => { Name => 'WB_RGBLevelsFluorescent', Format => 'float[3]' }, + 18 => { Name => 'WB_RGBLevelsFlash', Format => 'float[3]' }, + 21 => { Name => 'WB_RGBLevelsCustom1', Format => 'float[3]' }, + 24 => { Name => 'WB_RGBLevelsCustom2', Format => 'float[3]' }, + 27 => { Name => 'WB_RGBLevelsCustom3', Format => 'float[3]' }, +); + +# WB settings (ref IB) +%Image::ExifTool::Sigma::WBSettings2 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FORMAT => 'float', + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0 => { Name => 'WB_RGBLevelsUnknown0', Unknown => 1, Format => 'float[3]' }, + 3 => { Name => 'WB_RGBLevelsUnknown1', Unknown => 1, Format => 'float[3]' }, + 6 => { Name => 'WB_RGBLevelsUnknown2', Unknown => 1, Format => 'float[3]' }, + 9 => { Name => 'WB_RGBLevelsUnknown3', Unknown => 1, Format => 'float[3]' }, + 12 => { Name => 'WB_RGBLevelsUnknown4', Unknown => 1, Format => 'float[3]' }, + 15 => { Name => 'WB_RGBLevelsUnknown5', Unknown => 1, Format => 'float[3]' }, + 18 => { Name => 'WB_RGBLevelsUnknown6', Unknown => 1, Format => 'float[3]' }, + 21 => { Name => 'WB_RGBLevelsUnknown7', Unknown => 1, Format => 'float[3]' }, + 24 => { Name => 'WB_RGBLevelsUnknown8', Unknown => 1, Format => 'float[3]' }, + 27 => { Name => 'WB_RGBLevelsUnknown9', Unknown => 1, Format => 'float[3]' }, +); + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Sigma - Sigma/Foveon EXIF maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Sigma and Foveon maker notes in EXIF information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.x3f.info/technotes/FileDocs/MakerNoteDoc.html> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Sigma Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/SigmaRaw.pm b/lib/Image/ExifTool/SigmaRaw.pm new file mode 100644 index 0000000..46a694e --- /dev/null +++ b/lib/Image/ExifTool/SigmaRaw.pm @@ -0,0 +1,672 @@ +#------------------------------------------------------------------------------ +# File: SigmaRaw.pm +# +# Description: Read Sigma/Foveon RAW (X3F) meta information +# +# Revisions: 2005/10/16 - P. Harvey Created +# 2009/11/30 - P. Harvey Support X3F v2.3 written by Sigma DP2 +# +# References: 1) http://www.x3f.info/technotes/FileDocs/X3F_Format.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::SigmaRaw; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Sigma; + +$VERSION = '1.27'; + +sub ProcessX3FHeader($$$); +sub ProcessX3FDirectory($$$); +sub ProcessX3FProperties($$$); + +# main X3F sections (plus header stuff) +%Image::ExifTool::SigmaRaw::Main = ( + PROCESS_PROC => \&ProcessX3FDirectory, + NOTES => q{ + These tags are used in Sigma and Foveon RAW (.X3F) images. Metadata is also + extracted from the JpgFromRaw image if it exists (all models but the SD9 and + SD10). Currently, metadata may only be written to the embedded JpgFromRaw. + }, + Header => { + SubDirectory => { TagTable => 'Image::ExifTool::SigmaRaw::Header' }, + }, + Header4 => { + SubDirectory => { TagTable => 'Image::ExifTool::SigmaRaw::Header4' }, + }, + HeaderExt => { + SubDirectory => { TagTable => 'Image::ExifTool::SigmaRaw::HeaderExt' }, + }, + PROP => { + Name => 'Properties', + SubDirectory => { TagTable => 'Image::ExifTool::SigmaRaw::Properties' }, + }, + IMAG => { + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + IMA2 => [ + { + Name => 'PreviewImage', + Condition => 'not $$self{IsJpgFromRaw}', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + { + Name => 'JpgFromRaw', + Groups => { 2 => 'Preview' }, + Binary => 1, + }, + ] +); + +# common X3F header structure +%Image::ExifTool::SigmaRaw::Header = ( + PROCESS_PROC => \&ProcessX3FHeader, + FORMAT => 'int32u', + NOTES => 'Information extracted from the header of an X3F file.', + 1 => { + Name => 'FileVersion', + ValueConv => '($val >> 16) . "." . ($val & 0xffff)', + }, + 2 => { + Name => 'ImageUniqueID', + # the serial number (with an extra leading "0") makes up + # the first 8 digits of this UID, + Format => 'undef[16]', + ValueConv => 'unpack("H*", $val)', + }, + 6 => { + Name => 'MarkBits', + PrintConv => { BITMASK => { } }, + }, + 7 => 'ImageWidth', + 8 => 'ImageHeight', + 9 => 'Rotation', + 10 => { + Name => 'WhiteBalance', + Format => 'string[32]', + }, + 18 => { #PH (DP2, FileVersion 2.3) + Name => 'SceneCaptureType', + Format => 'string[32]', + }, +); + +# X3F version 4 header structure (ref PH) +%Image::ExifTool::SigmaRaw::Header4 = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FORMAT => 'int32u', + NOTES => 'Header information for version 4.0 or greater X3F.', + 1 => { + Name => 'FileVersion', + ValueConv => '($val >> 16) . "." . ($val & 0xffff)', + }, + # 8 - undef[4]: 4 random ASCII characters + 10 => 'ImageWidth', + 11 => 'ImageHeight', + 12 => 'Rotation', + # don't know what the rest of the header contains, but none of + # these values change in any of my samples... +); + +# extended header tags +%Image::ExifTool::SigmaRaw::HeaderExt = ( + GROUPS => { 2 => 'Camera' }, + FORMAT => 'float', + NOTES => 'Extended header data found in version 2.1 and 2.2 files', + 0 => 'Unused', + 1 => { Name => 'ExposureAdjust',PrintConv => 'sprintf("%.1f",$val)' }, + 2 => { Name => 'Contrast', PrintConv => 'sprintf("%.1f",$val)' }, + 3 => { Name => 'Shadow', PrintConv => 'sprintf("%.1f",$val)' }, + 4 => { Name => 'Highlight', PrintConv => 'sprintf("%.1f",$val)' }, + 5 => { Name => 'Saturation', PrintConv => 'sprintf("%.1f",$val)' }, + 6 => { Name => 'Sharpness', PrintConv => 'sprintf("%.1f",$val)' }, + 7 => { Name => 'RedAdjust', PrintConv => 'sprintf("%.1f",$val)' }, + 8 => { Name => 'GreenAdjust', PrintConv => 'sprintf("%.1f",$val)' }, + 9 => { Name => 'BlueAdjust', PrintConv => 'sprintf("%.1f",$val)' }, + 10 => { Name => 'X3FillLight', PrintConv => 'sprintf("%.1f",$val)' }, +); + +# PROP tags +%Image::ExifTool::SigmaRaw::Properties = ( + PROCESS_PROC => \&ProcessX3FProperties, + GROUPS => { 2 => 'Camera' }, + PRIORITY => 0, # (because these aren't writable like the EXIF ones) + AEMODE => { + Name => 'MeteringMode', + PrintConv => { + 8 => '8-segment', + C => 'Center-weighted average', + A => 'Average', + }, + }, + AFAREA => 'AFArea', # observed: CENTER_V + AFINFOCUS => 'AFInFocus', # observed: H + AFMODE => 'FocusMode', + AP_DESC => 'ApertureDisplayed', + APERTURE => { + Name => 'FNumber', + Groups => { 2 => 'Image' }, + PrintConv => 'sprintf("%.1f",$val)', + }, + BRACKET => 'BracketShot', + BURST => 'BurstShot', + CAMMANUF => 'Make', + CAMMODEL => 'Model', + CAMNAME => 'CameraName', + CAMSERIAL => 'SerialNumber', + CM_DESC => 'SceneCaptureType', #PH (DP2) + COLORSPACE => 'ColorSpace', # observed: sRGB + DRIVE => { + Name => 'DriveMode', + PrintConv => { + SINGLE => 'Single Shot', + MULTI => 'Multi Shot', + '2S' => '2 s Timer', + '10S' => '10 s Timer', + UP => 'Mirror Up', + AB => 'Auto Bracket', + OFF => 'Off', + }, + }, + EVAL_STATE => 'EvalState', # observed: POST-EXPOSURE + EXPCOMP => { + Name => 'ExposureCompensation', + Groups => { 2 => 'Image' }, + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + EXPNET => { + Name => 'NetExposureCompensation', + Groups => { 2 => 'Image' }, + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + }, + EXPTIME => { + Name => 'IntegrationTime', + Groups => { 2 => 'Image' }, + ValueConv => '$val * 1e-6', # convert from usec + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + FIRMVERS => 'FirmwareVersion', + FLASH => { + Name => 'FlashMode', + PrintConv => 'ucfirst(lc($val))', + }, + FLASHEXPCOMP=> 'FlashExpComp', + FLASHPOWER => 'FlashPower', + FLASHTTLMODE=> 'FlashTTLMode', # observed: ON + FLASHTYPE => 'FlashType', # observed: NONE + FLENGTH => { + Name => 'FocalLength', + PrintConv => 'sprintf("%.1f mm",$val)', + }, + FLEQ35MM => { + Name => 'FocalLengthIn35mmFormat', + PrintConv => 'sprintf("%.1f mm",$val)', + }, + FOCUS => { + Name => 'Focus', + PrintConv => { + AF => 'Auto-focus Locked', + 'NO LOCK' => "Auto-focus Didn't Lock", + M => 'Manual', + }, + }, + IMAGERBOARDID => 'ImagerBoardID', + IMAGERTEMP => { + Name => 'SensorTemperature', + PrintConv => '"$val C"', + }, + IMAGEBOARDID=> 'ImageBoardID', #PH (DP2) + ISO => 'ISO', + LENSARANGE => 'LensApertureRange', + LENSFRANGE => 'LensFocalRange', + LENSMODEL => { + Name => 'LensType', + ValueConv => '$val =~ /^[0-9a-f]+$/i ? hex($val) : $val', + ValueConvInv => '$val=~s/\.\d+$//; IsInt($val) ? sprintf("%x",$val) : $val', # (truncate decimal part) + SeparateTable => 'Sigma LensType', + PrintHex => 1, + PrintConv => \%Image::ExifTool::Sigma::sigmaLensTypes, + }, + PMODE => { + Name => 'ExposureProgram', + PrintConv => { + P => 'Program', + A => 'Aperture Priority', + S => 'Shutter Priority', + M => 'Manual', + }, + }, + RESOLUTION => { + Name => 'Quality', + PrintConv => { + LOW => 'Low', + MED => 'Medium', + HI => 'High', + }, + }, + SENSORID => 'SensorID', + SH_DESC => 'ShutterSpeedDisplayed', + SHUTTER => { + Name => 'ExposureTime', + Groups => { 2 => 'Image' }, + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + TIME => { + Name => 'DateTimeOriginal', + Groups => { 2 => 'Time' }, + Description => 'Date/Time Original', + ValueConv => 'ConvertUnixTime($val)', + PrintConv => '$self->ConvertDateTime($val)', + }, + WB_DESC => 'WhiteBalance', + VERSION_BF => 'VersionBF', +); + +#------------------------------------------------------------------------------ +# Extract null-terminated unicode string from list of characters +# Inputs: 0) ExifTool ref, 1) list ref, 2) position in list +# Returns: Converted string +sub ExtractUnicodeString($$$) +{ + my ($et, $chars, $pos) = @_; + my $i; + for ($i=$pos; $i<@$chars; ++$i) { + last unless $$chars[$i]; + } + my $buff = pack('v*', @$chars[$pos..$i-1]); + return $et->Decode($buff, 'UCS2', 'II'); +} + +#------------------------------------------------------------------------------ +# Process an X3F header +# Inputs: 0) ExifTool ref, 1) DirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessX3FHeader($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $hdrLen = $$dirInfo{DirLen}; + + # process the static header structure first + $et->ProcessBinaryData($dirInfo, $tagTablePtr); + + # process extended data if available + if (length($$dataPt) - $hdrLen >= 160) { + my $verbose = $et->Options('Verbose'); + if ($verbose) { + $et->VerboseDir('X3F HeaderExt', 32); + $et->VerboseDump($dataPt, Start => $hdrLen); + } + $tagTablePtr = GetTagTable('Image::ExifTool::SigmaRaw::HeaderExt'); + my @tags = unpack("x${hdrLen}C32", $$dataPt); + my $i; + my $unused = 0; + for ($i=0; $i<32; ++$i) { + $tags[$i] or ++$unused, next; + $et->HandleTag($tagTablePtr, $tags[$i], undef, + Index => $i, + DataPt => $dataPt, + Start => $hdrLen + 32 + $i * 4, + Size => 4, + ); + } + $et->VPrint(0, "$$et{INDENT}($unused entries unused)\n"); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Process an X3F properties +# Inputs: 0) ExifTool ref, 1) DirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessX3FProperties($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $size = length($$dataPt); + my $verbose = $et->Options('Verbose'); + my $unknown = $et->Options('Unknown'); + + unless ($size >= 24 and $$dataPt =~ /^SECp/) { + $et->Warn('Bad properties header'); + return 0; + } + my ($entries, $fmt, $len) = unpack('x8V2x4V', $$dataPt); + unless ($size >= 24 + 8 * $entries + $len) { + $et->Warn('Truncated Property directory'); + return 0; + } + $verbose and $et->VerboseDir('Properties', $entries); + $fmt == 0 or $et->Warn("Unsupported character format $fmt"), return 0; + my $charPos = 24 + 8 * $entries; + my @chars = unpack('v*',substr($$dataPt, $charPos, $len * 2)); + my $index; + for ($index=0; $index<$entries; ++$index) { + my ($namePos, $valPos) = unpack('V2',substr($$dataPt, $index*8 + 24, 8)); + if ($namePos >= @chars or $valPos >= @chars) { + $et->Warn('Bad Property pointer'); + return 0; + } + my $tag = ExtractUnicodeString($et, \@chars, $namePos); + my $val = ExtractUnicodeString($et, \@chars, $valPos); + if (not $$tagTablePtr{$tag} and $unknown and $tag =~ /^\w+$/) { + my $tagInfo = { + Name => "SigmaRaw_$tag", + Description => Image::ExifTool::MakeDescription('SigmaRaw', $tag), + Unknown => 1, + Writable => 0, # can't write unknown tags + }; + # add tag information to table + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + + $et->HandleTag($tagTablePtr, $tag, $val, + Index => $index, + DataPt => $dataPt, + Start => $charPos + 2 * $valPos, + Size => 2 * (length($val) + 1), + ); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Write an X3F file +# Inputs: 0) ExifTool ref, 1) DirInfo ref (DirStart = directory offset) +# Returns: error string, undef on success, or -1 on write error +# Notes: Writes metadata to embedded JpgFromRaw image +sub WriteX3F($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $outfile = $$dirInfo{OutFile}; + my ($outDir, $buff, $ver, $entries, $dir, $outPos, $index, $didContain); + + $raf->Seek($$dirInfo{DirStart}, 0) or return 'Error seeking to directory start'; + + # read the X3F directory header (will be copied directly to output) + $raf->Read($outDir, 12) == 12 or return 'Truncated X3F image'; + $outDir =~ /^SECd/ or return 'Bad section header'; + ($ver, $entries) = unpack('x4V2', $outDir); + + # do sanity check on number of entries in directory + return 'Invalid X3F directory count' unless $entries > 2 and $entries < 20; + # read the directory entries + unless ($raf->Read($dir, $entries * 12) == $entries * 12) { + return 'Truncated X3F directory'; + } + # do a quick scan to determine the offset of the first data subsection + for ($index=0; $index<$entries; ++$index) { + my $pos = $index * 12; + my ($offset, $len, $tag) = unpack("x${pos}V2a4", $dir); + # remember position of first data subsection + $outPos = $offset if not defined $outPos or $outPos > $offset; + } + # copy the file header up to the start of the first data subsection + unless ($raf->Seek(0,0) and $raf->Read($buff, $outPos) == $outPos) { + return 'Error reading X3F header'; + } + Write($outfile, $buff) or return -1; + + # loop through directory, rewriting each section + for ($index=0; $index<$entries; ++$index) { + + my $pos = $index * 12; + my ($offset, $len, $tag) = unpack("x${pos}V2a4", $dir); + $raf->Seek($offset, 0) or return 'Bad data offset'; + + if ($tag eq 'IMA2' and $len > 28) { + # check subsection header (28 bytes) to see if this is a JPEG preview image + $raf->Read($buff, 28) == 28 or return 'Error reading PreviewImage header'; + Write($outfile, $buff) or return -1; + $len -= 28; + + # only rewrite full-sized JpgFromRaw (version 2.0, type 2, format 18) + if ($buff =~ /^SECi\0\0\x02\0\x02\0\0\0\x12\0\0\0/) { + $raf->Read($buff, $len) == $len or return 'Error reading JpgFromRaw'; + if ($buff =~ /^\xff\xd8\xff\xe1/) { # does this preview contain EXIF? + # use same write directories as JPEG + $et->InitWriteDirs('JPEG'); + # make sure we don't add APP0 JFIF because it would mess up our preview identification + delete $$et{ADD_DIRS}{APP0}; + delete $$et{ADD_DIRS}{JFIF}; + # rewrite the embedded JPEG in memory + my $newData; + my %jpegInfo = ( + Parent => 'X3F', + RAF => new File::RandomAccess(\$buff), + OutFile => \$newData, + ); + $$et{FILE_TYPE} = 'JPEG'; + my $success = $et->WriteJPEG(\%jpegInfo); + $$et{FILE_TYPE} = 'X3F'; + SetByteOrder('II'); + return 'Error writing X3F JpgFromRaw' unless $success and $newData; + return -1 if $success < 0; + # (this shouldn't happen unless someone tries to delete the EXIF...) + return 'EXIF segment must come first in X3F JpgFromRaw' unless $newData =~ /^\xff\xd8\xff\xe1/; + # write new data if anything changed, otherwise copy old image + my $outPt = $$et{CHANGED} ? \$newData : \$buff; + Write($outfile, $$outPt) or return -1; + # set $len to the total subsection data length + $len = length($$outPt); + $didContain = 1; + } else { + Write($outfile, $buff) or return -1; + } + } else { + # copy original image data + Image::ExifTool::CopyBlock($raf, $outfile, $len) or return 'Corrupted X3F image'; + } + $len += 28; # add back header length + } else { + # copy data for this subsection + Image::ExifTool::CopyBlock($raf, $outfile, $len) or return 'Corrupted X3F directory'; + } + # add directory entry and update output file position + $outDir .= pack('V2a4', $outPos, $len, $tag); + $outPos += $len; + # pad data to an even 4-byte boundary + if ($len & 0x03) { + my $pad = 4 - ($len & 0x03); + Write($outfile, "\0" x $pad) or return -1; + $outPos += $pad; + } + } + # warn if we couldn't add metadata to this image (should only be SD9 or SD10) + $didContain or $et->Warn("Can't yet write SD9 or SD10 X3F images"); + # write out the directory and the directory pointer, and we are done + Write($outfile, $outDir, pack('V', $outPos)) or return -1; + return undef; +} + +#------------------------------------------------------------------------------ +# Process an X3F directory +# Inputs: 0) ExifTool ref, 1) DirInfo ref, 2) tag table ref +# Returns: error string or undef on success +sub ProcessX3FDirectory($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + + $raf->Seek($$dirInfo{DirStart}, 0) or return 'Error seeking to directory start'; + + # parse the X3F directory structure + my ($buff, $ver, $entries, $index, $dir); + $raf->Read($buff, 12) == 12 or return 'Truncated X3F image'; + $buff =~ /^SECd/ or return 'Bad section header'; + ($ver, $entries) = unpack('x4V2', $buff); + $verbose and $et->VerboseDir('X3F Subsection', $entries); + $raf->Read($dir, $entries * 12) == $entries * 12 or return 'Truncated X3F directory'; + for ($index=0; $index<$entries; ++$index) { + my $pos = $index * 12; + my ($offset, $len, $tag) = unpack("x${pos}V2a4", $dir); + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($verbose) { + $et->VPrint(0, "$$et{INDENT}$index) $tag Subsection ($len bytes):\n"); + if ($verbose > 2) { + $raf->Seek($offset, 0) or return 'Error seeking'; + $raf->Read($buff, $len) == $len or return 'Truncated image'; + $et->VerboseDump(\$buff); + } + } + next unless $tagInfo; + $raf->Seek($offset, 0) or return "Error seeking for $$tagInfo{Name}"; + if ($$tagInfo{Name} eq 'PreviewImage') { + # check image header to see if this is a JPEG preview image + $raf->Read($buff, 28) == 28 or return 'Error reading PreviewImage header'; + # ignore all image data but JPEG compressed (version 2.0, type 2, format 18) + next unless $buff =~ /^SECi\0\0\x02\0\x02\0\0\0\x12\0\0\0/; + $offset += 28; + $len -= 28; + $raf->Read($buff, $len) == $len or return "Error reading PreviewImage data"; + # check fore EXIF segment, and extract this image as the JpgFromRaw + if ($buff =~ /^\xff\xd8\xff\xe1/) { + $$et{IsJpgFromRaw} = 1; + $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + delete $$et{IsJpgFromRaw}; + } + } else { + $raf->Read($buff, $len) == $len or return "Error reading $$tagInfo{Name} data"; + } + my $subdir = $$tagInfo{SubDirectory}; + if ($subdir) { + my %dirInfo = ( DataPt => \$buff ); + my $subTable = GetTagTable($$subdir{TagTable}); + $et->ProcessDirectory(\%dirInfo, $subTable); + } else { + # extract metadata from JpgFromRaw + if ($$tagInfo{Name} eq 'JpgFromRaw') { + my %dirInfo = ( + Parent => 'X3F', + RAF => new File::RandomAccess(\$buff), + ); + $$et{BASE} += $offset; + $et->ProcessJPEG(\%dirInfo); + $$et{BASE} -= $offset; + SetByteOrder('II'); + } + $et->FoundTag($tagInfo, $buff); + } + } + return undef; +} + +#------------------------------------------------------------------------------ +# Read/write information from a Sigma raw (X3F) image +# Inputs: 0) ExifTool ref, 1) DirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid X3F image, or -1 on write error +sub ProcessX3F($$) +{ + my ($et, $dirInfo) = @_; + my $outfile = $$dirInfo{OutFile}; + my $raf = $$dirInfo{RAF}; + my $warn = $outfile ? \&Image::ExifTool::Error : \&Image::ExifTool::Warn; + my ($buff, $err, $hdrLen); + + return 0 unless $raf->Read($buff, 40) == 40; + return 0 unless $buff =~ /^FOVb/; + + SetByteOrder('II'); + $et->SetFileType(); + + # check version number + my $ver = unpack('x4V',$buff); + $ver = ($ver >> 16) . '.' . ($ver & 0xffff); + if ($ver > 5) { + &$warn($et, "Untested X3F version ($ver). Please submit sample for testing", 1); + } + # read version 2.1/2.2/2.3 extended header + if ($ver > 2) { + my ($extra, $buf2); + if ($ver >= 4) { + $hdrLen = 0x300; + $extra = 0; + } else { + $hdrLen = $ver > 2.2 ? 104 : 72; # SceneCaptureType string added in 2.3 + $extra = 160; # (extended header is 160 bytes) + } + my $more = $hdrLen - length($buff) + $extra; + unless ($raf->Read($buf2, $more) == $more) { + &$warn($et, 'Error reading X3F header'); + return 1; + } + $buff .= $buf2; + } + my ($widPos, $hdrType) = $ver < 4 ? (28, 'Header') : (40, 'Header4'); + # process header information + my $tagTablePtr = GetTagTable('Image::ExifTool::SigmaRaw::Main'); + unless ($outfile) { + $et->HandleTag($tagTablePtr, $hdrType, $buff, + DataPt => \$buff, + Size => $hdrLen, + ); + } + # read the directory pointer + $raf->Seek(-4, 2) or &$warn($et, 'Seek error'), return 1; + unless ($raf->Read($buff, 4) == 4) { + &$warn($et, 'Error reading X3F dir pointer'); + return 1; + } + my $offset = unpack('V', $buff); + my %dirInfo = ( + RAF => $raf, + DirStart => $offset, + ); + if ($outfile) { + $dirInfo{OutFile} = $outfile; + $err = WriteX3F($et, \%dirInfo); + return -1 if $err and $err eq '-1'; + } else { + # process the X3F subsections + $err = $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + } + $err and &$warn($et, $err); + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::SigmaRaw - Read Sigma/Foveon RAW (X3F) meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read +Sigma and Foveon X3F images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.x3f.info/technotes/FileDocs/X3F_Format.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/SigmaRaw Tags>, +L<Image::ExifTool::Sigma(3pm)|Image::ExifTool::Sigma>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Sony.pm b/lib/Image/ExifTool/Sony.pm new file mode 100644 index 0000000..22aaadc --- /dev/null +++ b/lib/Image/ExifTool/Sony.pm @@ -0,0 +1,11331 @@ +#------------------------------------------------------------------------------ +# File: Sony.pm +# +# Description: Sony EXIF Maker Notes tags +# +# Revisions: 04/06/2004 - P. Harvey Created +# +# References: 1) http://www.cybercom.net/~dcoffin/dcraw/ +# 2) http://homepage3.nifty.com/kamisaka/makernote/makernote_sony.htm (2006/08/06) +# 3) Thomas Bodenmann private communication +# 4) Philippe Devaux private communication (A700) +# 5) Marcus Holland-Moritz private communication (A700) +# 6) Andrey Tverdokhleb private communication +# 7) Rudiger Lange private communication (A700) +# 8) Igal Milchtaich private communication +# 9) Michael Reitinger private communication (DSC-TX7,RX100) +# 10) http://www.klingebiel.com/tempest/hd/pmp.html +# 11) Mike Battilana private communication +# 13) http://www.mi-fo.de/forum/index.php?showtopic=33239 +# http://www.dyxum.com/dforum/the-alpha-shutter-count-tool_topic97489_page4.html +# 14) Albert Shan private communication (A7M3) +# IB) Iliah Borg private communication (LibRaw) +# JD) Jens Duttke private communication +# JR) Jos Roost private communication +# +# NC = Not Confirmed +#------------------------------------------------------------------------------ + +package Image::ExifTool::Sony; + +use strict; +use vars qw($VERSION %sonyLensTypes %sonyLensTypes2); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::Minolta; + +$VERSION = '3.51'; + +sub ProcessSRF($$$); +sub ProcessSR2($$$); +sub ProcessSonyPIC($$$); +sub ProcessMoreInfo($$$); +sub Process_rtmd($$$); +sub Decipher($;$); +sub ProcessEnciphered($$$); +sub WriteEnciphered($$$); +sub WriteSR2($$$); +sub ConvLensSpec($); +sub ConvInvLensSpec($); +sub PrintLensSpec($); +sub PrintInvLensSpec($;$$); + +# (%sonyLensTypes is filled in based on Minolta LensType's) + +# Sony E-mount lenses +# (NOTE: these should be kept in sync with the 65535 entries in %minoltaLensTypes) +%sonyLensTypes2 = ( + Notes => 'Lens type numbers for Sony E-mount lenses used by NEX/ILCE models.', + 0 => 'Unknown E-mount lens or other lens', + 0.1 => 'Sigma 19mm F2.8 [EX] DN', + 0.2 => 'Sigma 30mm F2.8 [EX] DN', + 0.3 => 'Sigma 60mm F2.8 DN', + 0.4 => 'Sony E 18-200mm F3.5-6.3 OSS LE', # (firmware Ver.01) + 0.5 => 'Tamron 18-200mm F3.5-6.3 Di III VC', # (Model B011) + 0.6 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.00) samples from Tokina, May 2018 + 0.7 => 'Tokina FiRIN 20mm F2 FE MF', # samples from Tokina, 16-12-2016, DC-watch 01-02-2017 + 0.8 => 'Zeiss Touit 12mm F2.8', # (firmware Ver.00) + 0.9 => 'Zeiss Touit 32mm F1.8', # (firmware Ver.00) + '0.10' => 'Zeiss Touit 50mm F2.8 Macro', # (firmware Ver.00) + '0.11' => 'Zeiss Loxia 50mm F2', # (firmware Ver.01) + '0.12' => 'Zeiss Loxia 35mm F2', # (firmware Ver.01) + 1 => 'Sony LA-EA1 or Sigma MC-11 Adapter', # MC-11 with not-supported lenses + 2 => 'Sony LA-EA2 Adapter', + 3 => 'Sony LA-EA3 Adapter', + 6 => 'Sony LA-EA4 Adapter', + 7 => 'Sony LA-EA5 Adapter', #JR + # 27 => Venus Optics Laowa 12mm f2.8 Zero-D or 105mm f2 (T3.2) Smooth Trans Focus (ref IB) + 44 => 'Metabones Canon EF Smart Adapter', #JR + 78 => 'Metabones Canon EF Smart Adapter Mark III or Other Adapter', #PH/JR (also Mark IV, Fotodiox and Viltrox) + 184 => 'Metabones Canon EF Speed Booster Ultra', #JR ('Green' mode, LensMount reported as A-mount) + 234 => 'Metabones Canon EF Smart Adapter Mark IV', #JR (LensMount reported as A-mount) + 239 => 'Metabones Canon EF Speed Booster', #JR + 24593 => 'LA-EA4r MonsterAdapter', + # Sony VX product code: (http://www.mi-fo.de/forum/index.php?s=7df1c8d3b1cd675f2abf4f4442e19cf2&showtopic=35035&view=findpost&p=303746) + 32784 => 'Sony E 16mm F2.8', # VX9100 + 32785 => 'Sony E 18-55mm F3.5-5.6 OSS', # VX9101 + 32786 => 'Sony E 55-210mm F4.5-6.3 OSS', # VX9102 + 32787 => 'Sony E 18-200mm F3.5-6.3 OSS', # VX9103 + 32788 => 'Sony E 30mm F3.5 Macro', # VX9104 + 32789 => 'Sony E 24mm F1.8 ZA or Samyang AF 50mm F1.4', # VX9105 + 32789.1 => 'Samyang AF 50mm F1.4', + 32790 => 'Sony E 50mm F1.8 OSS or Samyang AF 14mm F2.8', # VX9106 + 32790.1 => 'Samyang AF 14mm F2.8', + 32791 => 'Sony E 16-70mm F4 ZA OSS', # VX9107 + 32792 => 'Sony E 10-18mm F4 OSS', # VX9108 + 32793 => 'Sony E PZ 16-50mm F3.5-5.6 OSS', # VX9109 + 32794 => 'Sony FE 35mm F2.8 ZA or Samyang Lens', # VX9110 + 32794.1 => 'Samyang AF 24mm F2.8', #JR + 32794.2 => 'Samyang AF 35mm F2.8', #IB (also 51505) + 32795 => 'Sony FE 24-70mm F4 ZA OSS', # VX9111 + 32796 => 'Sony FE 85mm F1.8 or Viltrox PFU RBMH 85mm F1.8', #JR + 32796.1 => 'Viltrox PFU RBMH 85mm F1.8', #JR (MF) + 32797 => 'Sony E 18-200mm F3.5-6.3 OSS LE', # VX9113 (firmware Ver.02) + 32798 => 'Sony E 20mm F2.8', # VX9114 + 32799 => 'Sony E 35mm F1.8 OSS', # VX9115 + 32800 => 'Sony E PZ 18-105mm F4 G OSS', #JR # VX9116 + 32801 => 'Sony FE 12-24mm F4 G', #JR + 32802 => 'Sony FE 90mm F2.8 Macro G OSS', # VX? + 32803 => 'Sony E 18-50mm F4-5.6', + 32804 => 'Sony FE 24mm F1.4 GM', #IB + 32805 => 'Sony FE 24-105mm F4 G OSS', #IB # VX9121 + + 32807 => 'Sony E PZ 18-200mm F3.5-6.3 OSS', # VX9123 + 32808 => 'Sony FE 55mm F1.8 ZA', # VX9124 + + 32810 => 'Sony FE 70-200mm F4 G OSS', #JR # VX9126 + 32811 => 'Sony FE 16-35mm F4 ZA OSS', #JR # VX9127 + 32812 => 'Sony FE 50mm F2.8 Macro', #JR + 32813 => 'Sony FE 28-70mm F3.5-5.6 OSS', # VX9129 + 32814 => 'Sony FE 35mm F1.4 ZA', # VX? + 32815 => 'Sony FE 24-240mm F3.5-6.3 OSS', # VX? + 32816 => 'Sony FE 28mm F2', #JR # VX? + 32817 => 'Sony FE PZ 28-135mm F4 G OSS',#JR # VX? + + 32819 => 'Sony FE 100mm F2.8 STF GM OSS', #JR (appears to use 33076 when switched to macro mode) + 32820 => 'Sony E PZ 18-110mm F4 G OSS', #JR + 32821 => 'Sony FE 24-70mm F2.8 GM', #JR/IB + 32822 => 'Sony FE 50mm F1.4 ZA', #JR + 32823 => 'Sony FE 85mm F1.4 GM or Samyang AF 85mm F1.4', #JR/IB + 32823.1 => 'Samyang AF 85mm F1.4', #IB + 32824 => 'Sony FE 50mm F1.8', #JR (Sony code 'SEL50F18F' with trailing "F" as compared to 'SEL50F18' for 32790) + + 32826 => 'Sony FE 21mm F2.8 (SEL28F20 + SEL075UWC)', #JR # (+ Ultra-wide converter) + 32827 => 'Sony FE 16mm F3.5 Fisheye (SEL28F20 + SEL057FEC)', #JR # (+ Fisheye converter) + 32828 => 'Sony FE 70-300mm F4.5-5.6 G OSS', #JR + 32829 => 'Sony FE 100-400mm F4.5-5.6 GM OSS', #JR + 32830 => 'Sony FE 70-200mm F2.8 GM OSS', #JR + 32831 => 'Sony FE 16-35mm F2.8 GM', #JR + 32848 => 'Sony FE 400mm F2.8 GM OSS', #IB + 32849 => 'Sony E 18-135mm F3.5-5.6 OSS', #JR + 32850 => 'Sony FE 135mm F1.8 GM', #IB + 32851 => 'Sony FE 200-600mm F5.6-6.3 G OSS', #IB + 32852 => 'Sony FE 600mm F4 GM OSS', #IB + 32853 => 'Sony E 16-55mm F2.8 G', #IB/JR + 32854 => 'Sony E 70-350mm F4.5-6.3 G OSS', #IB/JR + 32855 => 'Sony FE C 16-35mm T3.1 G', #JR (SELC1635G) (max aperture is 2.8) + 32858 => 'Sony FE 35mm F1.8', #JR/IB + 32859 => 'Sony FE 20mm F1.8 G', #IB/JR + 32860 => 'Sony FE 12-24mm F2.8 GM', #JR/IB + 32862 => 'Sony FE 50mm F1.2 GM', #IB/JR + 32863 => 'Sony FE 14mm F1.8 GM', #IB + 32864 => 'Sony FE 28-60mm F4-5.6', #JR + 32865 => 'Sony FE 35mm F1.4 GM', #IB/JR + 32866 => 'Sony FE 24mm F2.8 G', #IB + 32867 => 'Sony FE 40mm F2.5 G', #IB + 32868 => 'Sony FE 50mm F2.5 G', #IB + 32871 => 'Sony FE PZ 16-35mm F4 G', #JR + 32873 => 'Sony E PZ 10-20mm F4 G', #JR + 32874 => 'Sony FE 70-200mm F2.8 GM OSS II', #IB + 32875 => 'Sony FE 24-70mm F2.8 GM II', #JR + 32876 => 'Sony E 11mm F1.8', #JR + 32877 => 'Sony E 15mm F1.4 G', #JR + + # (comment this out so LensID will report the LensModel, which is more useful) + # 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount) + # 33002 => 'Metabones Canon EF Smart Adapter with Ver.5x', #PH/JR (corresponds to 234, but LensMount reported as E-mount) + + 33072 => 'Sony FE 70-200mm F2.8 GM OSS + 1.4X Teleconverter', #JR + 33073 => 'Sony FE 70-200mm F2.8 GM OSS + 2X Teleconverter', #JR + 33076 => 'Sony FE 100mm F2.8 STF GM OSS (macro mode)', #JR (with macro switching ring set to "0.57m - 1.0m") + 33077 => 'Sony FE 100-400mm F4.5-5.6 GM OSS + 1.4X Teleconverter', #JR + 33078 => 'Sony FE 100-400mm F4.5-5.6 GM OSS + 2X Teleconverter', #JR + 33079 => 'Sony FE 400mm F2.8 GM OSS + 1.4X Teleconverter', #IB + 33080 => 'Sony FE 400mm F2.8 GM OSS + 2X Teleconverter', #JR + 33081 => 'Sony FE 200-600mm F5.6-6.3 G OSS + 1.4X Teleconverter', #JR + 33082 => 'Sony FE 200-600mm F5.6-6.3 G OSS + 2X Teleconverter', #JR + 33083 => 'Sony FE 600mm F4 GM OSS + 1.4X Teleconverter', #JR (NC) + 33084 => 'Sony FE 600mm F4 GM OSS + 2X Teleconverter', #JR + + 49201 => 'Zeiss Touit 12mm F2.8', #JR (lens firmware Ver.02) + 49202 => 'Zeiss Touit 32mm F1.8', #JR (lens firmware Ver.02) + 49203 => 'Zeiss Touit 50mm F2.8 Macro', #JR (lens firmware Ver.02) + 49216 => 'Zeiss Batis 25mm F2', #JR + 49217 => 'Zeiss Batis 85mm F1.8', #JR + 49218 => 'Zeiss Batis 18mm F2.8', #IB + 49219 => 'Zeiss Batis 135mm F2.8', #IB + 49220 => 'Zeiss Batis 40mm F2 CF', #IB + 49232 => 'Zeiss Loxia 50mm F2', #JR (lens firmware Ver.02) + 49233 => 'Zeiss Loxia 35mm F2', #JR (lens firmware Ver.02) + 49234 => 'Zeiss Loxia 21mm F2.8', #PH + 49235 => 'Zeiss Loxia 85mm F2.4', #JR + 49236 => 'Zeiss Loxia 25mm F2.4', #JR + + 49457 => 'Tamron 28-75mm F2.8 Di III RXD', #JR (Model A036) + 49458 => 'Tamron 17-28mm F2.8 Di III RXD', #JR (Model A046) + 49459 => 'Tamron 35mm F2.8 Di III OSD M1:2', #IB (Model F053) + 49460 => 'Tamron 24mm F2.8 Di III OSD M1:2', #JR (Model F051) + 49461 => 'Tamron 20mm F2.8 Di III OSD M1:2', #JR (Model F050) + 49462 => 'Tamron 70-180mm F2.8 Di III VXD', #JR (Model A056) + 49463 => 'Tamron 28-200mm F2.8-5.6 Di III RXD', #JR (Model A071) + 49464 => 'Tamron 70-300mm F4.5-6.3 Di III RXD', #JR (Model A047) + 49465 => 'Tamron 17-70mm F2.8 Di III-A VC RXD', #JR (Model B070) + 49466 => 'Tamron 150-500mm F5-6.7 Di III VC VXD', #JR (Model A057) + 49467 => 'Tamron 11-20mm F2.8 Di III-A RXD', #JR (Model B060) + 49468 => 'Tamron 18-300mm F3.5-6.3 Di III-A VC VXD', #JR (Model B061) + 49469 => 'Tamron 35-150mm F2-F2.8 Di III VXD', #JR (Model A058) + 49470 => 'Tamron 28-75mm F2.8 Di III VXD G2', #JR (Model A063) + + 49473 => 'Tokina atx-m 85mm F1.8 FE or Viltrox lens', #JR + 49473.1 => 'Viltrox 23mm F1.4 E', #JR + 49473.2 => 'Viltrox 56mm F1.4 E', #JR + 49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01) + 49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01) + + 50480 => 'Sigma 30mm F1.4 DC DN | C', #IB/JR (016) + 50481 => 'Sigma 50mm F1.4 DG HSM | A', #JR (014 + MC-11 or 018) + 50482 => 'Sigma 18-300mm F3.5-6.3 DC MACRO OS HSM | C + MC-11', #JR (014) + 50483 => 'Sigma 18-35mm F1.8 DC HSM | A + MC-11', #JR (013) + 50484 => 'Sigma 24-35mm F2 DG HSM | A + MC-11', #JR (015) + 50485 => 'Sigma 24mm F1.4 DG HSM | A + MC-11', #JR (015) + 50486 => 'Sigma 150-600mm F5-6.3 DG OS HSM | C + MC-11', #JR (015) + 50487 => 'Sigma 20mm F1.4 DG HSM | A + MC-11', #JR (015) + 50488 => 'Sigma 35mm F1.4 DG HSM | A', #JR (012 + MC-11 or 018) + 50489 => 'Sigma 150-600mm F5-6.3 DG OS HSM | S + MC-11', #JR (014) + 50490 => 'Sigma 120-300mm F2.8 DG OS HSM | S + MC-11', #JR (013) + 50492 => 'Sigma 24-105mm F4 DG OS HSM | A + MC-11', #JR (013) + 50493 => 'Sigma 17-70mm F2.8-4 DC MACRO OS HSM | C + MC-11', #JR (013) + 50495 => 'Sigma 50-100mm F1.8 DC HSM | A + MC-11', #JR (016) + 50499 => 'Sigma 85mm F1.4 DG HSM | A', #JR (018) + 50501 => 'Sigma 100-400mm F5-6.3 DG OS HSM | C + MC-11', #JR (017) + 50503 => 'Sigma 16mm F1.4 DC DN | C', #JR (017) + 50507 => 'Sigma 105mm F1.4 DG HSM | A', #IB (018) + 50508 => 'Sigma 56mm F1.4 DC DN | C', #JR (018) + 50512 => 'Sigma 70-200mm F2.8 DG OS HSM | S + MC-11', #IB (018) (JR added "+ MC-11") + 50513 => 'Sigma 70mm F2.8 DG MACRO | A', #JR (018) + 50514 => 'Sigma 45mm F2.8 DG DN | C', #IB/JR (019) + 50515 => 'Sigma 35mm F1.2 DG DN | A', #IB/JR (019) + 50516 => 'Sigma 14-24mm F2.8 DG DN | A', #IB/JR (019) + 50517 => 'Sigma 24-70mm F2.8 DG DN | A', #JR (019) + 50518 => 'Sigma 100-400mm F5-6.3 DG DN OS | C', #JR (020) + 50521 => 'Sigma 85mm F1.4 DG DN | A', #JR (020) + 50522 => 'Sigma 105mm F2.8 DG DN MACRO | A', #JR (020) + 50523 => 'Sigma 65mm F2 DG DN | C', #IB (020) + 50524 => 'Sigma 35mm F2 DG DN | C', #IB (020) + 50525 => 'Sigma 24mm F3.5 DG DN | C', #JR (021) + 50526 => 'Sigma 28-70mm F2.8 DG DN | C', #JR (021) + 50527 => 'Sigma 150-600mm F5-6.3 DG DN OS | S', #JR (021) + 50528 => 'Sigma 35mm F1.4 DG DN | A', #IB/JR (021) + 50529 => 'Sigma 90mm F2.8 DG DN | C', #JR (021) + 50530 => 'Sigma 24mm F2 DG DN | C', #JR (021) + 50531 => 'Sigma 18-50mm F2.8 DC DN | C', #IB/JR (021) + 50532 => 'Sigma 20mm F2 DG DN | C', #JR (022) + 50533 => 'Sigma 16-28mm F2.8 DG DN | C', #JR (022) + + 50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR + 50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB + 50994 => 'Voigtlander ULTRA WIDE-HELIAR 12mm F5.6 III', #IB + 50995 => 'Voigtlander MACRO APO-LANTHAR 65mm F2 Aspherical', #JR + 50996 => 'Voigtlander NOKTON 40mm F1.2 Aspherical', #JR + 50997 => 'Voigtlander NOKTON classic 35mm F1.4', #JR + 50998 => 'Voigtlander MACRO APO-LANTHAR 110mm F2.5', #JR + 50999 => 'Voigtlander COLOR-SKOPAR 21mm F3.5 Aspherical', #IB + 51000 => 'Voigtlander NOKTON 50mm F1.2 Aspherical', #JR + 51001 => 'Voigtlander NOKTON 21mm F1.4 Aspherical', #JR + 51002 => 'Voigtlander APO-LANTHAR 50mm F2 Aspherical', #JR + 51003 => 'Voigtlander NOKTON 35mm F1.2 Aspherical SE', #JR + 51006 => 'Voigtlander APO-LANTHAR 35mm F2 Aspherical', #JR + + # lenses listed in the Sigma MC-11 list, but not yet seen: + # 504xx => 'Sigma 18-200mm F3.5-6.3 DC MACRO OS HSM | C + MC-11', # (014) + # 504xx => 'Sigma 30mm F1.4 DC HSM | A + MC-11', # (013) + + # Note: For Samyang lenses, the "FE" designation isn't written to + # EXIF:LensModel, so it isn't included in these strings either - JR/PH + 51504 => 'Samyang AF 50mm F1.4', #IB + 51505 => 'Samyang AF 14mm F2.8 or Samyang AF 35mm F2.8', #forum3833 + 51505.1 => 'Samyang AF 35mm F2.8', #PH (also 32794) + 51507 => 'Samyang AF 35mm F1.4', #IB + 51508 => 'Samyang AF 45mm F1.8', + 51510 => 'Samyang AF 18mm F2.8 or Samyang AF 35mm F1.8', #JR + 51510.1 => 'Samyang AF 35mm F1.8', #JR + 51512 => 'Samyang AF 75mm F1.8', #IB/JR + 51513 => 'Samyang AF 35mm F1.8', #JR + 51514 => 'Samyang AF 24mm F1.8', #IB + 51515 => 'Samyang AF 12mm F2.0', #JR + 51516 => 'Samyang AF 24-70mm F2.8', #JR + 51517 => 'Samyang AF 50mm F1.4 II', #JR + 51518 => 'Samyang AF 135mm F1.8', #JR +); + +# ExposureProgram values (ref PH, mainly decoded from A200) +my %sonyExposureProgram = ( + 0 => 'Auto', # (same as 'Program AE'?) + 1 => 'Manual', + 2 => 'Program AE', + 3 => 'Aperture-priority AE', + 4 => 'Shutter speed priority AE', + 8 => 'Program Shift A', #7 + 9 => 'Program Shift S', #7 + 16 => 'Portrait', # (A330) + 17 => 'Sports', # (A330) + 18 => 'Sunset', # (A330) + 19 => 'Night Portrait', # (A330) + 20 => 'Landscape', # (A330) + 21 => 'Macro', # (A330) + 35 => 'Auto No Flash', # (A330) +); + +# ExposureProgram values in CameraSettings3 (ref JR) +my %sonyExposureProgram2 = ( # A580 Mode Dial setting: + 1 => 'Program AE', # P + 2 => 'Aperture-priority AE', # A + 3 => 'Shutter speed priority AE', # S + 4 => 'Manual', # M + 5 => 'Cont. Priority AE', # (A35) + 16 => 'Auto', # AUTO + 17 => 'Auto (no flash)', # "flash strike-out" symbol + 18 => 'Auto+', #PH (A33) + 49 => 'Portrait', # SCN + 50 => 'Landscape', # SCN + 51 => 'Macro', # SCN + 52 => 'Sports', # SCN + 53 => 'Sunset', # SCN + 54 => 'Night view', # SCN + 55 => 'Night view/portrait', # SCN + 56 => 'Handheld Night Shot', # SCN (also called "Hand-held Twilight") + 57 => '3D Sweep Panorama', # "Panorama" symbol + 64 => 'Auto 2', #PH (A33 AUTO) + 65 => 'Auto 2 (no flash)', #JR (NC, A35) + 80 => 'Sweep Panorama', # "Panorama" symbol + 96 => 'Anti Motion Blur', #PH (NEX-5) + # 128-138 are A35 picture effects (combined SCN/Picture effect mode dial position) + 128 => 'Toy Camera', + 129 => 'Pop Color', + 130 => 'Posterization', + 131 => 'Posterization B/W', + 132 => 'Retro Photo', + 133 => 'High-key', + 134 => 'Partial Color Red', + 135 => 'Partial Color Green', + 136 => 'Partial Color Blue', + 137 => 'Partial Color Yellow', + 138 => 'High Contrast Monochrome', +); + +# ExposureProgram values in Tags 2010 and 94xx (ref JR) +my %sonyExposureProgram3 = ( + 0 => 'Program AE', + 1 => 'Aperture-priority AE', + 2 => 'Shutter speed priority AE', + 3 => 'Manual', + 4 => 'Auto', + 5 => 'iAuto', + 6 => 'Superior Auto', + 7 => 'iAuto+', + 8 => 'Portrait', + 9 => 'Landscape', + 10 => 'Twilight', + 11 => 'Twilight Portrait', + 12 => 'Sunset', + 14 => 'Action (High speed)', #PH (RX100) + 16 => 'Sports', + 17 => 'Handheld Night Shot', + 18 => 'Anti Motion Blur', + 19 => 'High Sensitivity', + 21 => 'Beach', + 22 => 'Snow', + 23 => 'Fireworks', + 26 => 'Underwater', + 27 => 'Gourmet', + 28 => 'Pet', + 29 => 'Macro', + 30 => 'Backlight Correction HDR', + # 32 => 'Night ... ???', # seen for HDR-CX360E + 33 => 'Sweep Panorama', + 36 => 'Background Defocus', + 37 => 'Soft Skin', + 42 => '3D Image', + 43 => 'Cont. Priority AE', + 45 => 'Document', + 46 => 'Party', +); + +# WhiteBalanceSetting values (ref JR) +my %whiteBalanceSetting = ( + 0x10 => 'Auto (-3)', #(NC) + 0x11 => 'Auto (-2)', #(NC) + 0x12 => 'Auto (-1)', #(NC) + 0x13 => 'Auto (0)', + 0x14 => 'Auto (+1)', #(NC) + 0x15 => 'Auto (+2)', #(NC) + 0x16 => 'Auto (+3)', #(NC) + 0x20 => 'Daylight (-3)', + 0x21 => 'Daylight (-2)', #(NC) + 0x22 => 'Daylight (-1)', #(NC) + 0x23 => 'Daylight (0)', + 0x24 => 'Daylight (+1)', + 0x25 => 'Daylight (+2)', + 0x26 => 'Daylight (+3)', + 0x30 => 'Shade (-3)', #(NC) + 0x31 => 'Shade (-2)', #(NC) + 0x32 => 'Shade (-1)', #(NC) + 0x33 => 'Shade (0)', + 0x34 => 'Shade (+1)', #(NC) + 0x35 => 'Shade (+2)', #(NC) + 0x36 => 'Shade (+3)', + 0x40 => 'Cloudy (-3)', #(NC) + 0x41 => 'Cloudy (-2)', #(NC) + 0x42 => 'Cloudy (-1)', #(NC) + 0x43 => 'Cloudy (0)', + 0x44 => 'Cloudy (+1)', #(NC) + 0x45 => 'Cloudy (+2)', #(NC) + 0x46 => 'Cloudy (+3)', #(NC) + 0x50 => 'Tungsten (-3)', #(NC) + 0x51 => 'Tungsten (-2)', #(NC) + 0x52 => 'Tungsten (-1)', #(NC) + 0x53 => 'Tungsten (0)', + 0x54 => 'Tungsten (+1)', #(NC) + 0x55 => 'Tungsten (+2)', #(NC) + 0x56 => 'Tungsten (+3)', #(NC) + 0x60 => 'Fluorescent (-3)', #(NC) + 0x61 => 'Fluorescent (-2)', #(NC) + 0x62 => 'Fluorescent (-1)', #(NC) + 0x63 => 'Fluorescent (0)', + 0x64 => 'Fluorescent (+1)', #(NC) + 0x65 => 'Fluorescent (+2)', #(NC) + 0x66 => 'Fluorescent (+3)', #(NC) + 0x70 => 'Flash (-3)', #(NC) + 0x71 => 'Flash (-2)', #(NC) + 0x72 => 'Flash (-1)', #(NC) + 0x73 => 'Flash (0)', + 0x74 => 'Flash (+1)', #(NC) + 0x75 => 'Flash (+2)', #(NC) + 0x76 => 'Flash (+3)', #(NC) + 0xa3 => 'Custom', + 0xf3 => 'Color Temperature/Color Filter', +); + +# AF points for cameras with 15-point AF (ref JR) +my %afPoint15 = ( + 0 => 'Upper-left', + 1 => 'Left', + 2 => 'Lower-left', + 3 => 'Far Left', + 4 => 'Top (horizontal)', + 5 => 'Near Right', + 6 => 'Center (horizontal)', + 7 => 'Near Left', + 8 => 'Bottom (horizontal)', + 9 => 'Top (vertical)', + 10 => 'Center (vertical)', + 11 => 'Bottom (vertical)', + 12 => 'Far Right', + 13 => 'Upper-right', + 14 => 'Right', + 15 => 'Lower-right', + 16 => 'Upper-middle', + 17 => 'Lower-middle', +); + +# AF points for cameras with 19-point AF (ref PH) +# (verified for A77 firmware 1.07) +my %afPoint19 = ( + 0 => 'Upper Far Left', + 1 => 'Upper-left (horizontal)', + 2 => 'Far Left (horizontal)', + 3 => 'Left (horizontal)', + 4 => 'Lower Far Left', + 5 => 'Lower-left (horizontal)', + 6 => 'Upper-left (vertical)', + 7 => 'Left (vertical)', + 8 => 'Lower-left (vertical)', + 9 => 'Far Left (vertical)', + 10 => 'Top (horizontal)', + 11 => 'Near Right', + 12 => 'Center (horizontal)', + 13 => 'Near Left', + 14 => 'Bottom (horizontal)', + 15 => 'Top (vertical)', + 16 => 'Upper-middle', + 17 => 'Center (vertical)', + 18 => 'Lower-middle', + 19 => 'Bottom (vertical)', + 20 => 'Upper Far Right', + 21 => 'Upper-right (horizontal)', + 22 => 'Far Right (horizontal)', + 23 => 'Right (horizontal)', + 24 => 'Lower Far Right', + 25 => 'Lower-right (horizontal)', + 26 => 'Far Right (vertical)', + 27 => 'Upper-right (vertical)', + 28 => 'Right (vertical)', + 29 => 'Lower-right (vertical)', +); + +# 79 AF point layout and indices for ILCA-68/77M2, numbered 0-78 for direct look-up from BITMASK in 0x2020, +# E6 = Center (ref JR) +my %afPoints79 = ( + 0=>'A5', 1=>'A6', 2=>'A7', + 3=>'B2', 4=>'B3', 5=>'B4', 6=>'B5', 7=>'B6', 8=>'B7', 9=>'B8', 10=>'B9', 11=>'B10', + 12=>'C1', 13=>'C2', 14=>'C3', 15=>'C4', 16=>'C5', 17=>'C6', 18=>'C7', 19=>'C8', 20=>'C9', 21=>'C10', 22=>'C11', + 23=>'D1', 24=>'D2', 25=>'D3', 26=>'D4', 27=>'D5', 28=>'D6', 29=>'D7', 30=>'D8', 31=>'D9', 32=>'D10', 33=>'D11', + 34=>'E1', 35=>'E2', 36=>'E3', 37=>'E4', 38=>'E5', 39=>'E6', 40=>'E7', 41=>'E8', 42=>'E9', 43=>'E10', 44=>'E11', + 45=>'F1', 46=>'F2', 47=>'F3', 48=>'F4', 49=>'F5', 50=>'F6', 51=>'F7', 52=>'F8', 53=>'F9', 54=>'F10', 55=>'F11', + 56=>'G1', 57=>'G2', 58=>'G3', 59=>'G4', 60=>'G5', 61=>'G6', 62=>'G7', 63=>'G8', 64=>'G9', 65=>'G10', 66=>'G11', + 67=>'H2', 68=>'H3', 69=>'H4', 70=>'H5', 71=>'H6', 72=>'H7', 73=>'H8', 74=>'H9', 75=>'H10', + 76=>'I5', 77=>'I6', 78=>'I7', +); + +# AFPoint and AFStatus tags in AFInfo(Tag940e) use numbers 0 to 94 for the 79 positions + 15 cross + 1 F2.8 +my %afPoints79_940e = ( + 59=>'A5', 50=>'A6', 41=>'A7', + 14=>'B2', 7=>'B3', 0=>'B4', 60=>'B5', 51=>'B6', 42=>'B7', 87=>'B8', 80=>'B9', 73=>'B10', + 21=>'C1', 15=>'C2', 8=>'C3', 1=>'C4', 61=>'C5', 52=>'C6', 43=>'C7', 88=>'C8', 81=>'C9', 74=>'C10', 68=>'C11', + 22=>'D1', 16=>'D2', 9=>'D3', 2=>'D4', 62=>'D5', 53=>'D6', 44=>'D7', 89=>'D8', 82=>'D9', 75=>'D10', 69=>'D11', + 23=>'E1', 17=>'E2', 10=>'E3', 3=>'E4', 63=>'E5', 54=>'E6 Center', 45=>'E7', 90=>'E8', 83=>'E9', 76=>'E10', 70=>'E11', + 24=>'F1', 18=>'F2', 11=>'F3', 4=>'F4', 64=>'F5', 55=>'F6', 46=>'F7', 91=>'F8', 84=>'F9', 77=>'F10', 71=>'F11', + 25=>'G1', 19=>'G2', 12=>'G3', 5=>'G4', 65=>'G5', 56=>'G6', 47=>'G7', 92=>'G8', 85=>'G9', 78=>'G10', 72=>'G11', + 20=>'H2', 13=>'H3', 6=>'H4', 66=>'H5', 57=>'H6', 48=>'H7', 93=>'H8', 86=>'H9', 79=>'H10', + 67=>'I5', 58=>'I6', 49=>'I7', + + 28=>'A5 Vertical', 27=>'A6 Vertical', 26=>'A7 Vertical', + 31=>'C5 Vertical', 30=>'C6 Vertical', 29=>'C7 Vertical', + 34=>'E5 Vertical', 33=>'E6 Center Vertical', 32=>'E7 Vertical', + 37=>'G5 Vertical', 36=>'G6 Vertical', 35=>'G7 Vertical', + 40=>'I5 Vertical', 39=>'I6 Vertical', 38=>'I7 Vertical', + + 94=>'E6 Center F2.8', +); + +# ILCA-99M2 has dedicated 79 point Phase Detection AF sensor with similar layout as ILCA-68 and ILCA-77M2. +# ILCA-99M2 has also 399 Focal Plane Phase-Detection AF Points in 19 rows of 21 points, same as ILCE-7RM2. +# Of these 399 points, 323 points are selectable: 19 rows of 17 points (2 left-most and right-most columns not selectable). +# The 79 Focal Plane points that overlap with the 79 points of the dedicated sensor provide for Hybrid Phase AF Points. +# Tag 0x201e gives value 162 for the Center AF point, and 162 is exactly the center of 323 points... +# The below table lists the selectable AF points that correspond to the 79 points of the dedicated sensor. (ref JR) +my %afPoints99M2 = ( + 93=>'A5 (93)', 94=>'A6 (94)', 95=>'A7 (95)', + 106=>'B2 (106)', 107=>'B3 (107)', 108=>'B4 (108)', 110=>'B5 (110)', 111=>'B6 (111)', 112=>'B7 (112)', 114=>'B8 (114)', 115=>'B9 (115)', 116=>'B10 (116)', + 122=>'C1 (122)', 123=>'C2 (123)', 124=>'C3 (124)', 125=>'C4 (125)', 127=>'C5 (127)', 128=>'C6 (128)', 129=>'C7 (129)', 131=>'C8 (131)', 132=>'C9 (132)', 133=>'C10 (133)', 134=>'C11 (134)', + 139=>'D1 (139)', 140=>'D2 (140)', 141=>'D3 (141)', 142=>'D4 (142)', 144=>'D5 (144)', 145=>'D6 (145)', 146=>'D7 (146)', 148=>'D8 (148)', 149=>'D9 (149)', 150=>'D10 (150)', 151=>'D11 (151)', + 156=>'E1 (156)', 157=>'E2 (157)', 158=>'E3 (158)', 159=>'E4 (159)', 161=>'E5 (161)', 162=>'E6 (162)', 163=>'E7 (163)', 165=>'E8 (165)', 166=>'E9 (166)', 167=>'E10 (167)', 168=>'E11 (168)', + 173=>'F1 (173)', 174=>'F2 (174)', 175=>'F3 (175)', 176=>'F4 (176)', 178=>'F5 (178)', 179=>'F6 (179)', 180=>'F7 (180)', 182=>'F8 (182)', 183=>'F9 (183)', 184=>'F10 (184)', 185=>'F11 (185)', + 190=>'G1 (190)', 191=>'G2 (191)', 192=>'G3 (192)', 193=>'G4 (193)', 195=>'G5 (195)', 196=>'G6 (196)', 197=>'G7 (197)', 199=>'G8 (199)', 200=>'G9 (200)', 201=>'G10 (201)', 202=>'G11 (202)', + 208=>'H2 (208)', 209=>'H3 (209)', 210=>'H4 (210)', 212=>'H5 (212)', 213=>'H6 (213)', 214=>'H7 (214)', 216=>'H8 (216)', 217=>'H9 (217)', 218=>'H10 (218)', + 229=>'I5 (229)', 230=>'I6 (230)', 231=>'I7 (231)', +); + +my %binaryDataAttrs = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + WRITE_PROC => \&Image::ExifTool::WriteBinaryData, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + WRITABLE => 1, + FIRST_ENTRY => 0, +); + +# tagInfo attributes for unknown cipher block tags +my %unknownCipherData = ( + Unknown => 1, # require Unknown option + Hidden => 1, # doesn't appear in Tag Name documentation + RawConv => sub { Decipher(\$_[0]); return $_[0] }, + ValueConv => 'PrintHex($val)', # print as hex + PrintConv => 'length($val) > 65 ? substr($val,0,60) . "[...]" : $val', # limit length +); + +my %meterInfo1 = ( + Format => 'int32u[27]', + PrintConv => 'sprintf("%19d %4d %6d" . " %3d %4d %6d" x 8, split(" ",$val))', + PrintConvInv => '$val', +); +my %meterInfo2 = ( + Format => 'int32u[33]', + PrintConv => 'sprintf("%3d %4d %6d" . " %3d %4d %6d" x 10, split(" ",$val))', + PrintConvInv => '$val', +); +my %meterInfo1b = ( + Format => 'undef[90]', + ValueConv => \&ConvMeter1, + PrintConv => 'sprintf("%19d %4d %6d" . " %3d %4d %6d" x 8, split(" ",$val))', +); +my %meterInfo2b = ( + Format => 'undef[110]', + ValueConv => \&ConvMeter2, + PrintConv => 'sprintf("%3d %4d %6d" . " %3d %4d %6d" x 10, split(" ",$val))', +); + +my %hidUnk = ( Hidden => 1, Unknown => 1 ); + +# Sony maker notes tags (some elements in common with %Image::ExifTool::Minolta::Main) +%Image::ExifTool::Sony::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + The following information has been decoded from the MakerNotes of Sony + cameras. Some of these tags have been inherited from the Minolta + MakerNotes. + }, + 0x0010 => [ #PH + # appears to contain mostly AF related information; + # for SLT-A77V and newer, similar info is found in 0x940e AFInfo" (ref JR) + { + Name => 'CameraInfo', + # count: A700=368, A850/A900=5478 + Condition => '$count == 368 or $count == 5478', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::CameraInfo', + ByteOrder => 'BigEndian', + }, + },{ + Name => 'CameraInfo2', + # count: A200/A300/A350=5506, A230/A290/A330/A380/A390=6118 + Condition => '$count == 5506 or $count == 6118', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::CameraInfo2', + ByteOrder => 'LittleEndian', + }, + },{ + Name => 'CameraInfo3', + # count: A33/A35/A55V/A450/A500/A550/A560/A580/NEX3/5/5C/C3/VG10E=15360 + Condition => '$count == 15360', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::CameraInfo3', + ByteOrder => 'LittleEndian', + }, + },{ + Name => 'CameraInfoUnknown', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::CameraInfoUnknown' }, + }, + ], + # 0x0018 - starts with "GYRO" for sweep panorama images (ref JR) + # - contains ImageStabilization information for Minolta + 0x0020 => [ + # similar to WBInfoA100 in Minolta.pm. + # appears to contain various types of information, as in MoreInfo. (ref JR) + { + Name => 'FocusInfo', #PH + # count: A200/A230/A290/A300/A330/A350/A380/A390==19154, A700/A850/A900=19148 + Condition => '$count == 19154 or $count == 19148', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::FocusInfo', + ByteOrder => 'LittleEndian', + }, + },{ + Name => 'MoreInfo', #JR + # count: A450/A500/A550/A560/A580/A33/A35/A55/NEX-3/5/C3/VG10E==20480 + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::MoreInfo', + ByteOrder => 'LittleEndian', + }, + }, + ], + 0x0102 => { #5/JD + Name => 'Quality', + Writable => 'int32u', + PrintConv => { + 0 => 'RAW', + 1 => 'Super Fine', + 2 => 'Fine', + 3 => 'Standard', + 4 => 'Economy', + 5 => 'Extra Fine', + 6 => 'RAW + JPEG/HEIF', + 7 => 'Compressed RAW', + 8 => 'Compressed RAW + JPEG', + 9 => 'Light', #JR + 0xffffffff => 'n/a', #PH (SLT-A57 panorama) + }, + }, + 0x0104 => { #5/JD + Name => 'FlashExposureComp', + Description => 'Flash Exposure Compensation', + Writable => 'rational64s', + }, + 0x0105 => { #5/JD (models since mid-2014, ILCA-77M2, ILCE-7M2/7RM2/7SM2, do not report this tag anymore, ref JR) + Name => 'Teleconverter', + Writable => 'int32u', + PrintHex => 1, + PrintConv => \%Image::ExifTool::Minolta::minoltaTeleconverters, + }, + 0x0112 => { #JD + Name => 'WhiteBalanceFineTune', + Format => 'int32s', + Writable => 'int32u', + }, + 0x0114 => [ #PH + { + Name => 'CameraSettings', + # count: A200/A300/A350/A700=280, A850/A900=364 + Condition => '$count == 280 or $count == 364', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::CameraSettings', + ByteOrder => 'BigEndian', + }, + },{ + Name => 'CameraSettings2', + # count: A230/A290/A330/A380/A390=332 + Condition => '$count == 332', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::CameraSettings2', + ByteOrder => 'BigEndian', + }, + },{ + Name => 'CameraSettings3', + # count: A560/A580/A33/A35/A55/NEX3/5/5C/C3/VG10E=1536, A450/A500/A550=2048 + Condition => '$count == 1536 || $count == 2048', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::CameraSettings3', + ByteOrder => 'LittleEndian', + }, + },{ + Name => 'CameraSettingsUnknown', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::CameraSettingsUnknown', + ByteOrder => 'BigEndian', + }, + }, + ], + 0x0115 => { #JD + Name => 'WhiteBalance', + Writable => 'int32u', + Priority => 2, # (more reliable for the RX100) + PrintHex => 1, + PrintConv => { + 0x00 => 'Auto', + 0x01 => 'Color Temperature/Color Filter', + 0x10 => 'Daylight', + 0x20 => 'Cloudy', + 0x30 => 'Shade', + 0x40 => 'Tungsten', + 0x50 => 'Flash', + 0x60 => 'Fluorescent', + 0x70 => 'Custom', + 0x80 => 'Underwater', + }, + }, + # Tag 0x0116: extra hardware info (ref JR) + # (tag not present for A100, A200, A300, A350, A700, nor for A37, A57, A65, A77) + 0x0116 => [ #JR + { + Name => 'ExtraInfo', + Condition => '$$self{Model} =~ /^DSLR-A(850|900)\b/', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::ExtraInfo', + ByteOrder => 'BigEndian', + }, + },{ + Name => 'ExtraInfo2', + Condition => '$$self{Model} =~ /^DSLR-A(230|290|330|380|390)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::ExtraInfo2' }, + },{ + Name => 'ExtraInfo3', + # for DSLR-A450/500/550/560/580, SLT-A33/35/55 and NEX-3/5/5C. + SubDirectory => { TagTable => 'Image::ExifTool::Sony::ExtraInfo3' }, + } + ], + 0x0e00 => { + Name => 'PrintIM', + Description => 'Print Image Matching', + SubDirectory => { TagTable => 'Image::ExifTool::PrintIM::Main' }, + }, + # the next 3 tags have a different meaning for some models (with format int32u) + 0x1000 => { #9 (F88, multi burst mode only) + Name => 'MultiBurstMode', + Condition => '$format eq "undef"', + Notes => 'MultiBurst tags valid only for models with this feature, like the F88', + Writable => 'undef', + Format => 'int8u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x1001 => { #9 (F88, multi burst mode only) + Name => 'MultiBurstImageWidth', + Condition => '$format eq "int16u"', + Writable => 'int16u', + }, + 0x1002 => { #9 (F88, multi burst mode only) + Name => 'MultiBurstImageHeight', + Condition => '$format eq "int16u"', + Writable => 'int16u', + }, + 0x1003 => { #9 (64 bytes, contains Panorama info for various DSC, NEX, SLT and DSLR models) + Name => 'Panorama', + # panorama: first 4 bytes '1 1 0 0' (little-endian) or '0 0 1 1' (big-endian) + # non-panorama: all bytes are '0' (ref JR) + Condition => '$$self{Panorama} = ($$valPt =~ /^(\0\0)?\x01\x01/)', # (little- or big-endian int32u = 257) + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Panorama' }, + }, + # 0x2000 - undef[1] + 0x2001 => { #PH (JPEG images from all DSLR's except the A100) + Name => 'PreviewImage', + Groups => { 2 => 'Preview' }, + Writable => 'undef', + DataTag => 'PreviewImage', + Notes => 'HD-size preview in JPEG images from almost all DSLR/SLT/ILCA/NEX/ILCE.', + # Note: the preview data starts with a 32-byte proprietary Sony header + # first 8 bytes after 32-byte header: + # \x00\xd8\xff\xe1\x00\x27\xff\xff for JPEG files from A33/35/55V/450/500/550/560/580, NEX-3/5/5C/C3/VG10 + # \x00\xd8\xff\xdb\x00\x84\x00\x01 for JPEG files from all other models + # ( \xff\xd8\xff\xdb\x00\x84\x00\x01 corresponding bytes for all ARW files ) + # + # DSLR-A700/A850/A900 and DSLR-A200/A300/A350: + # - no MPImage2 + # DSLR-A230/A290/A330/A380/A390: + # - PreviewImage start-offset is at 110 bytes inside MPImage2 + # DSLR-A450/A500/A550/A560/A580, SLT-A33/A35/A55V, NEX-3/5/5C/C3/VG10/VG10E: + # - PreviewImage start-offset is at 106 bytes inside MPImage2 + # - different first bytes after 32-byte header + # SLT-A37/A57/A58/A65V/A77V/A99V, ILCA-77M2, NEX-3N/5N/5R/5T/6/7/F3, ILCE-3000/3500/5000/6000/7/7R/7S: + # - PreviewImage start-offset is at 130 bytes inside MPImage2 + # NEX-VG20E/VG30E/VG900, ILCE-QX1: 0x2001 not present + # ILCE-5100/ILCE-7M2/7RM2/7SM2 : 0x2001 present but Size 0 and Offset 0 + # + WriteCheck => 'return $val=~/^(none|.{32}\xff\xd8\xff)/s ? undef : "Not a valid image"', + RawConv => q{ + return \$val if $val =~ /^Binary/; + $val = substr($val,0x20) if length($val) > 0x20; +# return \$val if $val =~ s/^.(\xd8\xff\xdb)/\xff$1/s; + return \$val if $val =~ s/^.(\xd8\xff[\xdb\xe1])/\xff$1/s; + $$self{PreviewError} = 1 unless $val eq 'none' or $val eq ''; + return undef; + }, + # must construct 0x20-byte header which contains length, width and height + ValueConvInv => q{ + return 'none' unless $val; + my $e = new Image::ExifTool; + my $info = $e->ImageInfo(\$val,'ImageWidth','ImageHeight'); + return undef unless $$info{ImageWidth} and $$info{ImageHeight}; + my $size = Set32u($$info{ImageWidth}) . Set32u($$info{ImageHeight}); + return Set32u(length $val) . $size . ("\0" x 8) . $size . ("\0" x 4) . $val; + }, + }, + 0x2002 => { #JR (written by Sony IDC) + Name => 'Rating', + Writable => 'int32u', # (0-5 stars) (4294967295 for an HX9V iSweep Panorama, ref JR) + }, + # 0x2003 - string[256]: all 0 for DSLR, SLT, NEX; data for DSC-HX9V + 0x2004 => { #PH (NEX-5) + Name => 'Contrast', + Writable => 'int32s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x2005 => { #PH (NEX-5) + Name => 'Saturation', + Writable => 'int32s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x2006 => { #PH + Name => 'Sharpness', + Writable => 'int32s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x2007 => { #PH + Name => 'Brightness', + Writable => 'int32s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x2008 => { #PH + Name => 'LongExposureNoiseReduction', + Writable => 'int32u', + PrintHex => 1, + PrintConv => { + 0 => 'Off', + 1 => 'On (unused)', + 0x10001 => 'On (dark subtracted)', # (NEX-C3) + 0xffff0000 => 'Off (65535)', + 0xffff0001 => 'On (65535)', + 0xffffffff => 'n/a', + }, + }, + 0x2009 => { #PH + Name => 'HighISONoiseReduction', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Normal', + 3 => 'High', + 256 => 'Auto', + # it seems that all DSC models except DSC-RX models give n/a here (ref JR) + 65535 => 'n/a', + }, + }, + 0x200a => { #PH (A550) + Name => 'HDR', + Writable => 'int32u', + Format => 'int16u', + Count => 2, + Notes => 'stored as a 32-bit integer, but read as two 16-bit integers', + PrintHex => 1, + PrintConv => [{ + 0x0 => 'Off', + 0x01 => 'Auto', + 0x10 => '1.0 EV', + 0x11 => '1.5 EV', + 0x12 => '2.0 EV', + 0x13 => '2.5 EV', + 0x14 => '3.0 EV', + 0x15 => '3.5 EV', + 0x16 => '4.0 EV', + 0x17 => '4.5 EV', + 0x18 => '5.0 EV', + 0x19 => '5.5 EV', + 0x1a => '6.0 EV', + },{ #JR (A580) + 0 => 'Uncorrected image', # A580 stores 2 images: uncorrected and HDR + 1 => 'HDR image (good)', + 2 => 'HDR image (fail 1)', # alignment problem? + 3 => 'HDR image (fail 2)', # contrast problem? + }], + }, + 0x200b => { #PH + Name => 'MultiFrameNoiseReduction', + Writable => 'int32u', + Notes => 'may not be valid for RS100', # (RS100 sample was 0 when this feature was turned on) + PrintConv => { + 0 => 'Off', + 1 => 'On', + 255 => 'n/a', + }, + }, + # 0x200c - int32u[3]: '0 0 0'; seen '2 1 0' for HX9V 3D-Image (in both JPG and MPO image) + # 0x200d - rational64u: 10/10, seen 2.5 for DSC-TX300V, 8 for DSC-HX100V/RX10 + 0x200e => { #PH (HX20V) + Name => 'PictureEffect', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Toy Camera', #JR (A35) + 2 => 'Pop Color', # (also A35/NEX-C3, ref JR) + 3 => 'Posterization', #JR (A35) + 4 => 'Posterization B/W', #JR (A35) + 5 => 'Retro Photo', #JR (A35, NEX-5) + 6 => 'Soft High Key', # (also A65V, A35/NEX-C3 call this "High-key", ref JR) + 7 => 'Partial Color (red)', #JR (A35) + 8 => 'Partial Color (green)', #JR (A35, NEX-5) + 9 => 'Partial Color (blue)', #JR (A35) + 10 => 'Partial Color (yellow)', #JR (A35, NEX-5) + 13 => 'High Contrast Monochrome', #JR (A35) + 16 => 'Toy Camera (normal)', # (also A65, ref JR) + 17 => 'Toy Camera (cool)', # (RX100) + 18 => 'Toy Camera (warm)', # (RX100) + 19 => 'Toy Camera (green)', # (RX100) + 20 => 'Toy Camera (magenta)', # (RX100) + 32 => 'Soft Focus (low)', #JR (RX100) + 33 => 'Soft Focus', #JR (A65V) + 34 => 'Soft Focus (high)', # (RX100) + 48 => 'Miniature (auto)', #JR (A65V/NEX-7, horizontal) + 49 => 'Miniature (top)', # (RX100) + 50 => 'Miniature (middle horizontal)', # (WX100/HX20V, horizontal) + 51 => 'Miniature (bottom)', # (WX100, rotate 90 CW) + 52 => 'Miniature (left)', # (RX100) + 53 => 'Miniature (middle vertical)', # (RX100) + 54 => 'Miniature (right)', # (RX100) + 64 => 'HDR Painting (low)', # (RX100) + 65 => 'HDR Painting', # (also A65V, ref JR) + 66 => 'HDR Painting (high)', # (RX100) + 80 => 'Rich-tone Monochrome', # (also A65V, ref JR) + 97 => 'Water Color', # (HX200V) + 98 => 'Water Color 2', + 112 => 'Illustration (low)', # (RX100) + 113 => 'Illustration', # (RX100) + 114 => 'Illustration (high)', # (RX100) + }, + }, + 0x200f => { #PH (RX100) + Name => 'SoftSkinEffect', + Writable => 'int32u', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Mid', + 3 => 'High', + # 0x10001 - seen (ref JR) + # 0x10002 - seen for landscape and portrait flash (ref JR) + # 0x10003 - seen (ref JR) + 0xffffffff => 'n/a', # (A35) + }, + }, + 0x2010 => [ #JR + # different camera models have similar content but at different offsets, appears to correlate with: + # 0x1206 - 0x1207 deciphered (0x1205 changes with firmware version): + # ad c3 - NEX-5N + # 0x0192 - 0x0193 deciphered (0x0191 changes with firmware version): + # 91 c3 - NEX-VG20E + # 93 c3 - NEX-7, SLT-A65V/A77V + # 94 c3 - Hasselblad Lunar + # 0x0012 - 0x0013 deciphered (0x0011 changes with firmware version): + # 94 c3 - SLT-A37/A57, NEX-F3 + # 95 d3 - DSC-WX50, WX70 + # 98 c3 - DSC-HX200V, HX20V, HX30V, TX200V, TX300V + # 98 d3 - DSC-HX10V, TX66, WX100, WX150 + # 9a c3 - DSC-RX1, RX1R + # 9b c3 - SLT-A99V, Hasselblad HV + # 9c c3 - NEX-VG30E + # 9d c3 - DSC-RX100, Hasselblad Stellar + # 9e c3 - NEX-VG900, SLT-A58 + # a1 d3 - DSC-TX30 + # a2 d3 - DSC-WX60, WX80, WX200, WX300 + # a3 c3 - NEX-6, DSC-HX300, HX50V + # a4 c3 - NEX-3N/5R/5T, ILCE-3000/3500 + # unknown offsets or values for DSC-TX20/TX55/WX30 + # unknown offsets or values for DSC-HX60V/HX350/HX400V/QX10/QX30/QX100/RX10/RX100M2/RX100M3/WX220/WX350, + # ILCA-68/77M2, ILCE-5000/5100/6000/7/7M2/7R/7S/QX1, Stellar2, Lusso + # unknown offsets or values for DSC-HX80/HX90V/RX0/RX1RM2/RX10M2/RX10M3/RX100M4/RX100M5/WX500, ILCE-6300/6500/7RM2/7SM2, ILCA-99M2 + # unknown offsets or values for ILCE-6100/6400/6600/7C/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M6/RX100M5A/RX100M7/HX99 + # July 2020: ILCE-7SM3 doesn't write this tag anymore + { + Name => 'Tag2010a', # ad + Condition => '$$self{Model} =~ /^NEX-5N$/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010a' }, + },{ + Name => 'Tag2010b', # 91, 93 + Condition => '$$self{Model} =~ /^(SLT-A(65|77)V?|NEX-(7|VG20E)|Lunar)$/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010b' }, + },{ + Name => 'Tag2010c', # 94 + Condition => '$$self{Model} =~ /^(SLT-A(37|57)|NEX-F3)$/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010c' }, + },{ + Name => 'Tag2010d', # 95, 98 + Condition => q{ + $$self{Model} =~ /^(DSC-(HX10V|HX20V|HX30V|HX200V|TX66|TX200V|TX300V|WX50|WX70|WX100|WX150))$/ and + not $$self{Panorama} + }, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010d' }, + },{ + Name => 'Tag2010e', # 9a, 9b, 9c, 9d, 9e, a1, a2, a3, a4 + Condition => q{ + $$self{Model} =~ /^(SLT-A99V?|HV|SLT-A58|ILCE-(3000|3500)|NEX-(3N|5R|5T|6|VG900|VG30E)|DSC-(RX100|RX1|RX1R)|Stellar)$/ or + ($$self{Model} =~ /^(DSC-(HX300|HX50|HX50V|TX30|WX60|WX80|WX200|WX300))$/ and not $$self{Panorama}) + }, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010e' }, + },{ + Name => 'Tag2010f', # ? + Condition => '$$self{Model} =~ /^(DSC-(RX100M2|QX10|QX100))$/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010f' }, + },{ + Name => 'Tag2010g', # ? + Condition => '$$self{Model} =~ /^(DSC-(QX30|RX10|RX100M3|HX60V|HX350|HX400V|WX220|WX350)|ILCE-(7(R|S|M2)?|[56]000|5100|QX1)|ILCA-(68|77M2))\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010g' }, + },{ + Name => 'Tag2010h', # ? + Condition => '$$self{Model} =~ /^(DSC-(RX0|RX1RM2|RX10M2|RX10M3|RX100M4|RX100M5|HX80|HX90V?|WX500)|ILCE-(6300|6500|7RM2|7SM2)|ILCA-99M2)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010h' }, + },{ + Name => 'Tag2010i', # ? + Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2)|ZV-(1|E10))\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010i' }, + },{ + Name => 'Tag_0x2010', + %unknownCipherData, + }], + 0x2011 => { #PH (A77, NEX-5N) + Name => 'VignettingCorrection', + Writable => 'int32u', + PrintConv => { + 0 => 'Off', + 2 => 'Auto', + 0xffffffff => 'n/a', # (RX100) + }, + }, + 0x2012 => { #PH (A77, NEX-5N) + Name => 'LateralChromaticAberration', + Writable => 'int32u', + PrintConv => { + 0 => 'Off', + 2 => 'Auto', + 0xffffffff => 'n/a', # (RX100) + }, + }, + 0x2013 => { #PH (A77, NEX-5N) ("Setting"; application of such correction is indicated in Tag9405 - ref JR) + Name => 'DistortionCorrectionSetting', + Writable => 'int32u', + PrintConv => { + 0 => 'Off', + 2 => 'Auto', + 0xffffffff => 'n/a', # (RX100) + }, + }, + 0x2014 => { #JR/9 + Name => 'WBShiftAB_GM', + Writable => 'int32s', + Count => 2, + Notes => q{ + 2 numbers: 1. positive is a shift toward amber, 2. positive is a shift + toward magenta + }, + }, + # 0x2015 - int16u: 65535, also for 'normal' HDR images; 0 for HDR-paint and Rich-tone Monochrome effect images + 0x2016 => { #PH (RX100) + Name => 'AutoPortraitFramed', + Writable => 'int16u', + Notes => '"Yes" if this image was created by the Auto Portrait Framing feature', + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + # 0x2017 - int32u: flash mode. 0=off, 1=fired, 2=red-eye (PH, NEX-6) (also in A99, RX1, NEX-5R) + 0x2017 => { #JR + Name => 'FlashAction', + Writable => 'int32u', + PrintConv => { + 0 => 'Did not fire', + 1 => 'Flash Fired', + 2 => 'External Flash Fired', + 3 => 'Wireless Controlled Flash Fired', # (NC) seen for ILCE-9 and ILCE-7M3 images + # 5 => 'External Flash ???', # seen for ILCE-7RM4 + }, + }, + # 0x2018 - something with external flash: seen 1 only when 0x2017 = 2 + # 0x2019 - 0 or 1 (seen 1 for ILCA-77M2, ILCE-7M2/7RM2) + # 0x201a - 0 or 1 + 0x201a => { #JR + Name => 'ElectronicFrontCurtainShutter', + Writable => 'int32u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 0x201b => { #PH + # FocusMode for SLT/HV/ILCA and NEX/ILCE; doesn't seem to apply to DSC models (always 0) + # from 2018: at least DSC-RX10M4 and RX100M6 also use this tag + Name => 'FocusMode', + Condition => '($$self{Model} !~ /^DSC-/) or ($$self{Model} =~ /^DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2)/)', + Writable => 'int8u', + Priority => 0, + PrintConv => { + 0 => 'Manual', + 2 => 'AF-S', + 3 => 'AF-C', + 4 => 'AF-A', + 6 => 'DMF', # "Direct Manual Focus" + 7 => 'AF-D', # "Depth Map Assist Continuous AF" + }, + }, + 0x201c => [ #JR + # AFAreaModeSetting for SLT/HV/ILCA and NEX/ILCE; doesn't seem to apply to DSC models (always 0) + # from 2018: at least DSC-RX10M4 and RX100M6 also use this tag + # all DSLR/SLT/HV Wide Zone Spot Local + # all NEX and ILCE-3000 Multi Center FlexibleSpot + # all ILCE and ILCA Wide Zone Center FlexibleSpot ExpandedFlexibleSpot + # (actual AFAreaMode used may be different as camera can override this under certain conditions) + { + Name => 'AFAreaModeSetting', + Condition => '$$self{Model} =~ /^(SLT-|HV)/', + Notes => 'SLT models', + Writable => 'int8u', + PrintConv => { + 0 => 'Wide', + 4 => 'Local', + 8 => 'Zone', #PH + 9 => 'Spot', + }, + },{ + Name => 'AFAreaModeSetting', + Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2))/', + Notes => 'NEX, ILCE and some DSC models', + RawConv => '$$self{AFAreaILCE} = $val', + DataMember => 'AFAreaILCE', + Writable => 'int8u', + PrintConv => { + 0 => 'Wide', # all NEX and ILCE-3000/3500 use the name 'Multi' + 1 => 'Center', + 3 => 'Flexible Spot', + 4 => 'Flexible Spot (LA-EA4)', # seen for ILCE-7RM2 with LA-EA4 + 9 => 'Center (LA-EA4)', # seen for ILCE-7RM2 with LA-EA4 + 11 => 'Zone', + 12 => 'Expanded Flexible Spot', + }, + },{ + Name => 'AFAreaModeSetting', + Condition => '$$self{Model} =~ /^ILCA-/', + Notes => 'ILCA models', + RawConv => '$$self{AFAreaILCA} = $val', + DataMember => 'AFAreaILCA', + Writable => 'int8u', + PrintConv => { + 0 => 'Wide', + 4 => 'Flexible Spot', + 8 => 'Zone', + 9 => 'Center', + 12 => 'Expanded Flexible Spot', + }, + }, + ], + 0x201d => { #JR + # Flexible Spot position for NEX/ILCE, non-zero only when AFAreaMode='Flexible Spot' + # from 2018: at least DSC-RX10M4 and RX100M6 also use this tag + # observed values in range (0 0) to (640 480), with center (320 240) often seen + # for NEX-5R/6, positions appear to be in an 11x9 grid + Name => 'FlexibleSpotPosition', + Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2))/', + Writable => 'int16u', + Count => 2, + Notes => q{ + X and Y coordinates of the AF point, valid only when AFAreaMode is Flexible + Spot + }, + }, + 0x201e => [{ #PH (A99) + # Selected AF Point for SLT/HV/ILCA or ILCE with LA-EA2/EA4 + # Selected AF Zone for NEX/ILCE/ILCA when AFAreaMode = 'Zone', + # but also with Expanded Flexible Spot for ILCE-7RM2/7SM2/9 ... + # doesn't seem to apply to DSC models (always 0) + Name => 'AFPointSelected', + Condition => q{ + ($$self{Model} =~ /^(SLT-|HV)/) or ($$self{Model} =~ /^(ILCE-|ILME-)/ and + defined $$self{AFAreaILCE} and $$self{AFAreaILCE} == 4) + }, + Notes => 'SLT models or ILCE with LA-EA2/EA4', + Writable => 'int8u', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Auto', #(NC) + 1 => 'Center', + 2 => 'Top', + 3 => 'Upper-right', + 4 => 'Right', + 5 => 'Lower-right', + 6 => 'Bottom', + 7 => 'Lower-left', + 8 => 'Left', + 9 => 'Upper-left', + 10 => 'Far Right', + 11 => 'Far Left', + 12 => 'Upper-middle', + 13 => 'Near Right', + 14 => 'Lower-middle', + 15 => 'Near Left', + 16 => 'Upper Far Right', + 17 => 'Lower Far Right', + 18 => 'Lower Far Left', + 19 => 'Upper Far Left', + }, + },{ + Name => 'AFPointSelected', + Condition => '$$self{Model} =~ /^ILCA-(68|77M2)/ and defined $$self{AFAreaILCA} and $$self{AFAreaILCA} != 8', + Notes => 'ILCA-68 and ILCA-77M2', + Writable => 'int8u', + ValueConv => '$val - 1', # to get the same numbers as from the BITMASK in 0x2020 + ValueConvInv => '$val + 1', + PrintConvColumns => 5, + PrintConv => { + -1 => 'Auto', + %afPoints79, + 39 => 'E6 (Center)', # (add " (Center)" to central point) + }, + },{ + Name => 'AFPointSelected', + Condition => '($$self{Model} =~ /^ILCA-99M2/ and defined $$self{AFAreaILCA} and $$self{AFAreaILCA} != 8)', + Notes => 'ILCA-99M2 when AFAreaModeSetting is not Zone', + # (appears to indicate the number of the selectable Focal Plane AF Point) + Writable => 'int8u', + PrintConvColumns => 4, + PrintConv => { + 0 => 'Auto', # seen for AFAreaModeSetting = Center, Wide + %afPoints99M2, # for selected AFPoints corresponding to the 79 dedicated AF points + 162 => 'E6 (162, Center)', # add " (Center)" to central point + OTHER => sub { shift }, # pass other values straight through + }, + },{ + Name => 'AFPointSelected', + Condition => '($$self{Model} =~ /^ILCA-/ and defined $$self{AFAreaILCA} and $$self{AFAreaILCA} == 8)', + Notes => 'ILCA models when AFAreaModeSetting is set to Zone', + # ILCA-68 and 77M2 have 9 Zones: numbers/locations verified for ILCA-77M2 + # ILCA-99M2 has 15 Zones in Hybrid-AF and 9 Zones in dedicated Phase AF Area, so may not be valid for ILCA-99M2... + Writable => 'int8u', + PrintConv => { + 0 => 'n/a', + 1 => 'Top Left Zone', + 2 => 'Top Zone', + 3 => 'Top Right Zone', + 4 => 'Left Zone', + 5 => 'Center Zone', + 6 => 'Right Zone', + 7 => 'Bottom Left Zone', + 8 => 'Bottom Zone', + 9 => 'Bottom Right Zone', + #14 => ' ??? ', # seen for ILCA-99M2 + }, + },{ + Name => 'AFPointSelected', + # non-zero only when AFAreaMode is 'Zone', and 'Expanded-Flexible-Spot' for ILCE-6300/7RM2/7SM2 + # each Zone has 3x3 AF Areas --> 9 positions within 5x5 total Contrast AF Areas + Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-)/', + Notes => 'NEX and ILCE models', + Writable => 'int8u', + PrintConv => { + 0 => 'n/a', + 1 => 'Center Zone', + 2 => 'Top Zone', + 3 => 'Right Zone', + 4 => 'Left Zone', + 5 => 'Bottom Zone', + 6 => 'Bottom Right Zone', + 7 => 'Bottom Left Zone', + 8 => 'Top Left Zone', + 9 => 'Top Right Zone', + }, + }], + # 0x201f - 0 0 0 0 for SLT and DSC; 4 values for NEX/ILCE with 4th value always 0: + # possibly bits relating to the 25 AF-Contrast-areas ??? + # 0x2020 - 10 values; for SLT/ILCA and NEX/ILCE with A-mount lens: relates to (phase-detect) AFPoints + # but not used by ILCA-99M2 anymore ... ? + 0x2020 => [{ + Name => 'AFPointsUsed', + Condition => '$$self{Model} !~ /^(ILCA-|DSC-)/', # (doesn't seem to apply to DSC-models) + Notes => 'SLT models, or NEX/ILCE with A-mount lenses', + BitsPerWord => 8, + BitsTotal => 80, + PrintConvColumns => 2, + PrintConv => { + 0 => '(none)', + BITMASK => { + 0 => 'Center', + 1 => 'Top', + 2 => 'Upper-right', + 3 => 'Right', + 4 => 'Lower-right', + 5 => 'Bottom', + 6 => 'Lower-left', + 7 => 'Left', + 8 => 'Upper-left', + 9 => 'Far Right', + 10 => 'Far Left', + 11 => 'Upper-middle', + 12 => 'Near Right', + 13 => 'Lower-middle', + 14 => 'Near Left', + 15 => 'Upper Far Right', + 16 => 'Lower Far Right', + 17 => 'Lower Far Left', + 18 => 'Upper Far Left', + }, + }, + },{ + Name => 'AFPointsUsed', + Condition => '$$self{Model} =~ /^ILCA-(68|77M2)/', + Notes => 'ILCA models', + BitsPerWord => 8, + BitsTotal => 80, + PrintConvColumns => 4, + PrintConv => { + 0 => '(none)', + BITMASK => { %afPoints79 }, + }, + }], + # 0x2021 - 0 for DSC; 0, 1 or 2 for SLT/ILCA and NEX/ILCE: 1=Face, 2=object-tracking ? + # from 2018: at least DSC-RX10M4 and RX100M6 also use this tag + 0x2021 => { #JR + Name => 'AFTracking', + Condition => '($$self{Model} !~ /^DSC-/) or ($$self{Model} =~ /^DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2)/)', + Writable => 'int8u', + PrintConv => { + 0 => 'Off', + 1 => 'Face tracking', + 2 => 'Lock On AF', + }, + }, + # 0x2022 - 13 bytes (104 bits) for SLT-A58/A99V, NEX-3N/5R/5T/6/VG30E/VG900, ILCE-3000/3500/5000/7/7R + # 26 bytes (208 bits) for ILCA-77M2, ILCE-5100/6000/7M2/7S/QX1 (7M2 has 117, 5100/6000 have 179 PhaseAFPoints) + # 52 bytes (416 bits) for ILCE-7RM2 (which has 399 PhaseAFPoints) and ILCE-7SM2 + # Only seen non-zero values for ILCE-5100/6000/7M2/7RM2 in AF-C mode: maybe FocalPlaneAFPointsUsed ??? + # (Similar number of bytes for contemporary DSC models, but mostly all non-zero values.) + # ILCE-6300 does not write this tag anymore, but writes 0x202a ... + 0x2022 => [{ + Name => 'FocalPlaneAFPointsUsed', + Condition => '$$self{Model} =~ /^(ILCE-(5100|6000|7M2))/', + Notes => 'On-sensor/focal-plane phase AF points for ILCE with hybrid AF', + BitsPerWord => 8, + BitsTotal => 208, # 26 words + PrintConv => { + 0 => '(none)', + BITMASK => { }, + }, + },{ + Name => 'FocalPlaneAFPointsUsed', + Condition => '$$self{Model} =~ /^ILCE-7RM2/', + # ILCE-7RM2 has 399 points in 19 rows of 21 points, numbered [0] to [398], [199] is Center + BitsPerWord => 8, + BitsTotal => 416, # 52 words + PrintConv => { + 0 => '(none)', + BITMASK => { }, + }, + }], + 0x2023 => { #JR + Name => 'MultiFrameNREffect', + Writable => 'int32u', + PrintConv => { + 0 => 'Normal', + 1 => 'High', # seen this only for ILCA-77M2 MFNR-12 images + }, + }, + # 0x2024 - 96 byte data block, very similar to 0x3000 ShotInfo, seen in Xperia Z5 + # 0x2025 - n1 n2 0 0 DSC-RX100M3/RX100M4/RX10M2/HX90V/WX500, ILCA-77M2, ILCE-5100/7M2/7RM2/7S/QX1 + # seen n1=0,2,4,5,7 and n2=0,1,3, very often: 7 3 0 0 + + # 0x2026 - 2 values: more precise WB Shift: AB in steps of 0.50, GM in steps of 0.25 (ILCE-7RM2 onwards) + 0x2026 => { #JR + Name => 'WBShiftAB_GM_Precise', + Writable => 'int32s', + Count => 2, + Notes => q{ + 2 numbers: 1. positive is a shift toward amber, 2. positive is a shift + toward magenta + }, + PrintConv => 'my @v=split(" ",$val); $_/=1000 foreach @v; sprintf("%.2f %.2f",$v[0],$v[1])', + }, + # 0x2027 - W H W/2 H/2 or W H val1 val2 (0 0 0 0 for Panorama images) + # Probably location of focus for Playback Zoom. + # Origin appears to be top-left, i.e. 1st coord to the right, 2nd coord. pointing down. + 0x2027 => { #JR + Name => 'FocusLocation', #(NC) + Writable => 'int16u', + Count => 4, + NOTES => q{ + Location in the image where the camera focused, used for Playback Zoom. + If the focus location information cannot be obtained, the centre of the + image will be used. + }, + }, + # 0x2028 - 0 0 for DSC-RX100M4/RX10M2, ILCE-7RM2/7SM2; seen non-zero values only for DSC-RX1RM2 + 0x2028 => { #JR + Name => 'VariableLowPassFilter', + Writable => 'int16u', + Count => 2, + PrintConv => { + '0 0' => 'n/a', + '1 0' => 'Off', + '1 1' => 'Standard', + '1 2' => 'High', + '65535 65535' => 'n/a', # ILCE-7SM3 + }, + }, + 0x2029 => { # uncompressed 14-bit RAW file type setting introduced 2015 + Name => 'RAWFileType', + Writable => 'int16u', + PrintConv => { + 0 => 'Compressed RAW', + 1 => 'Uncompressed RAW', + 2 => 'Lossless Compressed RAW', #JR (NC) seen for ILCE-1 + 65535 => 'n/a', # seen for ILCE-7SM3 JPEG-only + }, + }, + # 0x202a - first seen for ILCE-6300: 66 bytes + # possibly a 'replacement' for Tag2022 FocalPlaneAFPointsUsed, + # but now indicating locations in a 640x428 grid (3:2 part of LCD ?) + # first byte value 1 for ILCE-6300/6500/9, ILCA-99M2 + # values 110,137, ... for DSC-RX10M3, therefore limit to first byte = 1 for now + 0x202a => { + Name => 'Tag202a', + Condition => '$$valPt =~ /^\x01/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag202a' }, + }, + 0x202b => { #JR (ILCA-99M2, ILCE-6500/7M3/7RM3/9, DSC-RX10M4/RX100M5 and newer) + Name => 'PrioritySetInAWB', + Writable => 'int8u', + PrintConv => { + 0 => 'Standard', + 1 => 'Ambience', + 2 => 'White', + }, + }, + 0x202c => { #JR + Name => 'MeteringMode2', + Writable => 'int16u', + PrintHex => 1, + PrintConv => { + 0x100 => 'Multi-segment', + 0x200 => 'Center-weighted average', + 0x301 => 'Spot (Standard)', + 0x302 => 'Spot (Large)', + 0x400 => 'Average', + 0x500 => 'Highlight', + }, + }, + 0x202d => { #JR first seen for ILCA-99M2, ILCE-6500, DSC-RX100M5 + Name => 'ExposureStandardAdjustment', + Writable => 'rational64s', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 0x202e => { #JR (ILCE-7M3/7RM3 and newer) + Name => 'Quality', + Writable => 'int16u', + Count => 2, + PrintConv => { + '0 0' => 'n/a', + '0 1' => 'Standard', + '0 2' => 'Fine', + '0 3' => 'Extra Fine', + '0 4' => 'Light', #JR + '1 0' => 'RAW', + '1 1' => 'RAW + Standard', + '1 2' => 'RAW + Fine', + '1 3' => 'RAW + Extra Fine', + '1 4' => 'RAW + Light', #JR + }, + }, + 0x202f => { #JR (ILCE-7RM3) + Name => 'PixelShiftInfo', + Writable => 'undef', + # 6 bytes, all 0 for non-PixelShift images + # first 4 bytes: GroupID, read as int32u + # the ID displayed by Sony ImageDataConverter appears to be based on the lower 22 bits: + # 5 bits, 5 bits, 6 bits, 6 bits + # last 2 bytes: ShotNumber: (1 4) to (4 4) and (1 16) to (16 16) are the 4 or 16 source images, + # (0 4) is the combined image for 4-shot PixelShift mode + # (0 16) is the combined image for 16-shot PixelShift mode (ILCE-7RM4) + RawConv => q{ + my ($a,$b,$c) = (Get32u(\$val,0), Get8u(\$val,4), Get8u(\$val,5)); + sprintf("%.2d%.2d%.2d%.2d %d %d 0x%x",($a>>17)&0x1f,($a>>12)&0x1f,($a>>6)&0x3f,$a&0x3f,$b,$c,$a>>22); + }, + RawConvInv => q{ + my ($a,$b,$c,$d) = split ' ', $val; + my @a = $a =~ /../g; + return undef unless @a == 4; + return Set32u((hex($d)<<22) | ($a[0]<<17) | ($a[1]<<12) | ($a[2]<<6) | $a[3]) . chr($b & 0xff) . chr($c & 0xff); + }, + PrintConv => { + '00000000 0 0 0x0' => 'n/a', + OTHER => sub { + my ($val, $inv) = @_; + if ($inv) { + $val =~ s{Composed (\d+)-shot}{Shot 0/$1}i; + $val =~ s{^(?:Group)?\s*(\d+)[, ]+(?:Shot\s*)?(\d+)[/ ](\d+)\s*\(?(\w+)\)?}{$1 $2 $3 $4}i or return undef; + } else { + $val =~ s{(\d+) (\d+) (\d+) (\w+)}{Group $1, Shot $2/$3 ($4)} or return undef; + $val =~ s{Shot 0+/0*(\d+)\b}{Composed $1-shot}i; + } + return $val; + }, + }, + }, + 0x2031 => { #JR (only for ILCE-9 v2.00; ILCE-9 v2.10 and higher have "option" to write into EXIF tag 0xa431 ) + Name => 'SerialNumber', + Writable => 'string', + ValueConv => '$val=~s/(\d{2})(\d{2})(\d{2})(\d{2})/$4$3$2$1/; $val=~s/^0//; $val', + ValueConvInv => '$val="0$val" if length($val)==7; $val=~s/(\d{2})(\d{2})(\d{2})(\d{2})/$4$3$2$1/; $val', + PrintConv => 'sprintf("%.8d",$val)', + PrintConvInv => '$val', + }, +# 0x2032 - 0x2039: from July 2020 for ILCE-7SM3, ILCE-1, ILME-FX3 and newer + 0x2032 => { + Name => 'Shadows', + Writable => 'int32s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x2033 => { + Name => 'Highlights', + Writable => 'int32s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x2034 => { + Name => 'Fade', + Writable => 'int32s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x2035 => { + Name => 'SharpnessRange', + Writable => 'int32s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x2036 => { + Name => 'Clarity', + Writable => 'int32s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x2037 => { + Name => 'FocusFrameSize', + Format => 'int16u', + Count => '3', + Notes => 'width and height of FocusFrame, centered on FocusLocation', + PrintConv => q{ + my @a = split ' ', $val; + return $a[2] ? sprintf('%3dx%3d', $a[0], $a[1]) : 'n/a'; + }, + PrintConvInv => '$val =~ /(\d+)x(\d+)/ ? "$1 $2 257" : "0 0 0"', + }, + 0x2039 => { #JR + Name => 'JPEG-HEIFSwitch', # (name used in camera menus) + Writable => 'int16u', + PrintConv => { + 0 => 'JPEG', + 1 => 'HEIF', + 65535 => 'n/a', + }, + }, +# 0x203a - 0x2041: first seen October 2021 for ILCE-7M4 + 0x3000 => { + Name => 'ShotInfo', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::ShotInfo' }, + }, + # 0x3000: data block that includes DateTimeOriginal string + # 0x5001 - 0 + # 0x5002 - 128 +# +# at least some data for tags 0x2010, 0x9050 and 0x94xx is encrypted - PH +# (This is certainly true for at least parts of 0x2010, 0x9050, 0x9400, 0x9402 and 0x9403, +# but hasn't been verified for other tags -- just to be thorough, decipher all of them) +# Note: "(e)" in a comment indicates an enciphered value, all other values are deciphered +# + # 0x900b - 1st byte 0xae: face detection info for A450/500/550/560/580, A33/35/55, NEX-3/5/5C/C3/VG10 + # - other 1st byte values for some DSC-models + # - seen many 1,8,27,64... values: assume encrypted like other 9xxx tags + 0x900b => { + Name => 'Tag900b', + Condition => '$$valPt =~ /^\xae/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag900b' }, + }, + 0x9050 => [ + # 944 bytes for A37, A57, A99, NEX-F3, NEX-5R, NEX-6, DSC-RX1, DSC-RX100 + # 3072 bytes for A65, A77, NEX-5N, NEX-7, NEX-VG20 (ref JR) + # not valid for DSC/Stellar models + # from mid-2015: ILCE-7RM2/7SM2/6300 and newer models use different offsets + { + Name => 'Tag9050a', + Condition => '$$self{Model} !~ /^(DSC-|Stellar|ILCE-(1|6100|6300|6400|6500|6600|7C|7M3|7M4|7RM2|7RM3A?|7RM4A?|7SM2|7SM3|9|9M2)|ILCA-99M2|ILME-FX3|ZV-)/', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::Tag9050a', + ByteOrder => 'LittleEndian', + }, + },{ + Name => 'Tag9050b', + Condition => '$$self{Model} =~ /^(ILCE-(6100|6300|6400|6500|6600|7C|7M3|7RM2|7RM3A?|7RM4A?|7SM2|9|9M2)|ILCA-99M2|ZV-E10)/', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::Tag9050b', + ByteOrder => 'LittleEndian', + }, + },{ + Name => 'Tag9050c', + Condition => '$$self{Model} =~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)/', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::Tag9050c', + ByteOrder => 'LittleEndian', + }, + },{ + Name => 'Sony_0x9050', + %unknownCipherData, + }], + 0x9400 => [ + # first byte: + # 0x07 (e) for DSC-HX7V/HX9V/HX100V/TX10/TX100/TX100V/WX7/WX9/WX10, HDR-CX../PJ.. + # 0x09 (e) for DSC-TX20/TX55/WX30 + # 0x0a (e) for SLT-A37/A57/A65V/A77V/A99V, NEX-F3/5N/5R/5T/6/7/VG20E, DSC-RX100/RX1/RX1R/HX10V/HX20V/HX30V/HX200V/TX200V/TX300V/TX66/WX50/WX100/WX150, Lunar/Stellar/HV + # 0x0c (e) for ILCE-3000/3500, NEX-3N, SLT-A58, DSC-HX50V/HX300/RX100M2/TX30/WX60/WX80/WX200/WX300, DSC-QX10/QX100 + # 0xd0 (e) H90, W650, W690: tag9400 decoding appears not valid/different + # 0x23 (e) for DSC-RX10/HX60V/HX350/HX400V/WX220/WX350, ILCE-7/7R/5000/6000, ILCA-68/77M2 + # 0x24 (e) for ILCA-99M2,ILCE-5100/6300/6500/7M2/7RM2/7S/7SM2/QX1, DSC-HX80/HX90V/QX30/RX0/RX100M3/RX100M4/RX100M5/RX10M2/RX10M3/RX1RM2/WX500 + # 0x26 (e) for ILCE-6100/6400/6600/7M3/7RM3/9, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/HX99 + # 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1/E10 + # 0x31 (e) for ILCE-1/7SM3, ILME-FX3 + # first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28, 106 respectively + { + Name => 'Tag9400a', + Condition => q{ + $$valPt =~ /^[\x07\x09\x0a]/ or + ($$valPt =~ /^[\x5e\xe7\x04]/ and $$self{DoubleCipher} = 1) + }, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400a' }, + },{ + Name => 'Tag9400b', + Condition => '$$valPt =~ /^\x0c/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400b' }, + },{ + Name => 'Tag9400c', + Condition => '$$valPt =~ /^[\x23\x24\x26\x28\x31]/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400c' }, + },{ + Name => 'Sony_0x9400', + %unknownCipherData, + }], + 0x9401 => { + Name => 'Tag9401', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9401' }, + # notes for data in this block (ref PH/JR): + # 0x02-0x03 appear to have some relation to start-offset of data... + # 0x00 - 0x03 Metering + # Mode + # f4 00 00 03 - - DSC-H90/W650/W690 + # cf 0b 9f 0f 0x09bc (a) DSC-WX9 + # 1c 00 ac 0f 0x09c9 (b) HDR-CX130E/CX160E/CX360E/CX560E/CX700E/PJ10E/PJ30E + # b7 0f f7 0f 0x09dd (c) DSC-HX7V/TX10/WX7/WX10 + # b7 0f fa 0f 0x09e0 (d) DSC-HX9V/HX100V/TX100/TX100V + # 27 00 fd 0f 0x09e7 (e) DSC-TX20/TX55/WX30 + # 69 1f ff 0f 0x09e9 (f) NEX-5N + # 21 2b cf 0f 0x09e9 (f) NEX-7/VG20E, SLT-A65V/A77V, Lunar + # 2d 00 d5 0d 0x09a2 (g) DSC-HX10V/HX20V/HX30V/HX200V/TX66/TX200V/TX300V/WX50/WX70/WX100/WX150 + # 2f 00 d6 0d 0x09a3 (h) NEX-F3, SLT-A37/A57 + # 30 00 d8 0d 0x09a5 (i) HDR-AS15 + # 32 00 e2 0d 0x09ac (j) DSC-RX100, Stellar + # 33 00 e2 0d 0x09ac (j) NEX-5R/5T/6, NEX-VG900/VG30E + # 33 50 e2 0d 0x09ac (j) SLT-A99V, HV + # 33 40 0d 0e 0x09d7 (k) DSC-RX1 v0.01 + # 33 41 0d 0e 0x09d7 (k) DSC-RX1, DSC-RX1R + # 38 00 32 0e 0x09fc (l) SLT-A58, ILCE-3000/3500, NEX-3N, DSC-HX300/HX50V/WX200/WX300/WX60/WX80/TX30 + # 3a 10 3a 0e 0x0a01 (m) DSC-QX10/QX100 + # 3a 20 47 0e 0x0a01 (m) DSC-RX100M2 + # 43 00 66 0e 0x0a1b (n) ILCE-7/7R v0.xx/v1.00/v1.01, ILCE-5000, DSC-RX10 + # 43 10 66 0e 0x0a1b (n) ILCE-7/7R v1.02/v1.10 + # 43 30 6c 0e 0x0a1b (n) ILCE-7/7R v1.20-v3.20 + # 44 00 9c 0e 0x0a39 (o) ILCE-6000 v1.00/v1.10, DSC-HX60V/HX350/HX400V/WX220/WX350 (also DSC-QX30 samples from sony.net) + # 44 10 a2 0e 0x0a39 (o) ILCE-6000 v1.20/v1.21 + # 44 20 a2 0e 0x0a39 (o) ILCE-6000 v2.00-v3.20 + # 49 00 b0 0e 0x0a3b (p) ILCA-68 v1.00, ILCA-77M2 V1.00/v1.01/v2.00 (also DSC-RX100M3 samples from sony.net) + # 4a 00 b3 0e 0x0a3d (q) ILCE-7S v1.00, ILCE-5100 v1.00/v1.10, ILCE-QX1, DSC-QX30/RX100M3 + # 4a 20 b9 0e 0x0a3d (q) ILCE-7S v1.20-v3.20 + # 4e 10 d0 0e 0x0a5a (r) ILCE-7M2 v1.00/v1.10 + # 4e 30 d6 0e 0x0a5a (r) ILCE-7M2 v1.20-v4.00 + # 5a 00 14 0f 0x0a85 (s) DSC-HX80/HX90V/WX500 + # 5d 00 56 0f 0x0ac7 (t) DSC-RX10M2/RX100M4, ILCE-7RM2/7SM2 v1.00-v2.20 (also DSC-RX1RM2 samples from Sony) + # 5d 1d 58 0f 0x0ac7 (t) ILCE-7RM2 v3.00-v4.00 + # 5d 1e 57 0f 0x0ac7 (t) DSC-RX1RM2 v1.00 + # 5d 10 56 0f 0x0ac7 (t) ILCE-6300 v1.00 (samples from Sony) + # 5d 20 58 0f 0x0ac7 (t) ILCE-6300 v1.00/v1.10 + # 5e 00 56 0f 0x0ac7 (t) DSC-RX10M3 v1.00 + # 64 00 a8 0f 0x0b15 (u) DSC-RX100M5 v1.00 + # 67 00 f9 0f 0x0b66 (v) ILCA-99M2 v1.00, ILCE-6500 v1.00-v1.05, DSC-RX0 v1.00 + # 7c 00 fe 0f 0x0adb (w) ILCE-9 v0.01-v2.00 + # 7d 00 fe 0f 0x0adb (w) ILCE-9 v2.10-v4.10 + # 7f 00 fa 0f 0x0add (x) DSC-RX10M4 v1.00 + # 80 00 fa 0f 0x0add (x) ILCE-7M3/7RM3 v1.00-v3.01 + # 82 00 fc 0f 0x0ad9 (y) DSC-RX100M5A v1.00, DSC-RX100M6 v1.00 + # 90 00 fe 0f 0x098f? (z) DSC-HX99 v1.00 + # 92 10 ff 0f 0x0990 (za) ILCE-6100/6400/6600 v1.00 + # 94 00 ce 0b 0x0879 (zb) ILCE-9 v5.00-v6.00, DSC-RX0M2 + # 98 00 db 0c 0x088a (zc) ILCE-7RM4 v1.00 + # 9a 00 e3 0c 0x088a (zc) DSC-RX100M7 v1.00, ILCE-9M2 v1.00 + # + # 0x0004 - (RX100: 0 or 1. subsequent data valid only if 1 - PH) + # 0x0007 => { + # Name => 'DynamicRangeOptimizer_9401', + # PrintConv => { + # 0 => 'Disabled', # seen for Panorama images + # 1 => 'Auto', + # 3 => 'Lv1', #(NC) + # 4 => 'Lv2', #(NC) + # 5 => 'Lv3', + # 6 => 'Lv4', + # 7 => 'Lv5', + # # 8 - seen for VG20E and some other models - PH + # 255 => 'Off', + # }, + # }, + }, + 0x9402 => [{ + Name => 'Tag9402', + # first 2 bytes deciphered: + # 0x00 0x00 SLT-A37/A57/A65/A77 + # 0x0e 0x00 DSC-H90/HX7V/HX9V/HX100V/TX10/TX100/TX100V/TX20/TX55/W650/W690/W730/WX10/WX30/WX7/WX9, but also seen: + # 0x0e 0x01 for a few DSC-W650/W690 samples ... + # 0x0f 0x01 NEX-5N/7/VG20, Lunar + # 0x10 0x01 DSC-HX10V/HX200V/HX20V/HX300/HX30V/HX50V/TX200V/TX30/TX300V/TX66/RX100/RX1/RX1R/WX100/WX150/WX200/WX300/WX50/WX60/WX70/WX80, Stellar, + # ILCE-3000/3500, NEX-F3/3N/5R/5T/6/VG30/VG900 + # 0x11 0x01 DSC-RX100M2/QX10/QX100 + # 0x13 0x01 ILCE-5000/7/7R, DSC-RX10, but also seen: + # 0x12 0x01 for ILCE-7/7R and DSC-RX10 samples from Sony.net ... + # 0x15 0x01 for a few ILCE-7/7R ... + # 0x14 0x01 ILCE-6000, DSC-HX60V/HX350/HX400V/WX220/WX350 + # 0x17 0x01 ILCE-7S/7M2/5100/QX1, DSC-QX30/RX100M3 + # 0x19 0x01 DSC-HX80/HX90V/RX1RM2/RX10M2/RX100M4/WX500, ILCE-6300/7RM2/7SM2 + # 0x1a 0x01 DSC-RX0/RX10M3/RX100M5, ILCE-6500 + # 0x1c 0x01 ILCE-9 + # 0x1d 0x01 DSC-RX10M4 + # 0x1e 0x01 ILCE-7M3/7RM3, DSC-RX100M5A/RX100M6 + # 0x1f 0x01 DSC-HX99 + # 0x20 0x01 ILCE-6100/6400/6600/7RM4/9M2, ILCE-9 v5.00-v6.00, DSC-RX0M2/RX100M7 + # var var SLT-A58/A99V, HV, ILCA-68/77M2/99M2 + # only valid when first byte 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x17, 0x19, 0x1a, 0x1c (enciphered 0x8a, 0x70, 0xb6, 0x69, 0x88, 0x20, 0x30, 0xd7, 0xbb, 0x92, 0x28) +# Condition => '$$self{DoubleCipher} ? $$valPt =~ /^[\x7e\x46\x1d\x18\x3a\x95\x24\x26\xd6]\x01/ : $$valPt =~ /^[\x8a\x70\xb6\x69\x88\x20\x30\xd7\xbb\x92\x28]\x01/', +# alternative simpler Condition: +# not valid for SLT/HV/ILCA models, and not valid for first byte 0x0e or 0xff (enciphered 0x05 or 0xff) + Condition => '$$self{Model} !~ /^(SLT-|HV|ILCA-)/ and $$valPt !~ /^[\x05\xff]/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9402' }, + },{ + Name => 'Sony_0x9402', + %unknownCipherData, + }], + 0x9403 => { + Name => 'Tag9403', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9403' }, + }, + # 0x9404 first 5 bytes (deciphered): + # 4 0 163 1 2 SLT-A65V/A77V, NEX-5N/7, Lunar, DSC-HX7V/HX9V/HX100V/TX10/TX20/TX55/TX100/TX100V/WX9/WX10/WX30... + # 5 0 172 1 2 DSC-HX10V/HX200V/HX20V/HX30V/TX66/TX200V/TX300V/WX50/WX70/WX100/WX150... + # 9 0 38 2 2 SLT-A37/A57/A99V, NEX-5R/5T/6/F3/VG30E/VG900, DSC-RX1/RX1R/RX100, Stellar + # 12 0 8 2 2 SLT-A58, NEX-3N, ILCE-3000/3500, DSC-HX300/HX50V/WX60/WX80/WX300/TX30... + # 13 0 9 2 2 DSC-QX10/QX100/RX100M2 + # 15 0 35 2 2 ILCA-68/77M2, ILCE-5000/5100/6000/7/7R/7S/7M2/QX1, DSC-HX60V/HX350/HX400V/QX30/RX10/RX100M3/WX220/WX350 + # 16 0 85 2 2 DSC-HX80/HX90V/WX500 + # 17 0 232 1 2 DSC-RX0/RX0M2/RX1RM2/RX10M2/RX10M3/RX10M4/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/HX99, ILCE-6100/6300/6400/6500/6600/7C/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2, ILCA-99M2, ZV-1 + # 18 0 20 0 164 ILCE-7SM3 + # other values for Panorama images and several other models + 0x9404 => [{ + Name => 'Tag9404a', + # first byte must be 4 or 5 and 4th byte must be 1 (deciphered) + Condition => '$$valPt =~ /^[\x40\x7d]..\x01/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9404a' }, + },{ + Name => 'Tag9404b', + # first byte must be 9 or 12 or 13 or 15 or 16 and 4th byte must be 2 (deciphered) + Condition => '$$valPt =~ /^[\xe7\xea\xcd\x8a\x70]..\x08/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9404b' }, + },{ + Name => 'Tag9404c', + # first byte must be 17 and 4th byte must be 1 (deciphered) + Condition => '$$valPt =~ /^\xb6..\x01/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9404c' }, + },{ + Name => 'Sony_0x9404', + %unknownCipherData, + }], + # 0x9405 first 2 bytes: + # 0 0 (0x00 = 0 0 enc.) DSC-H90 + # 2 0 (0x08 = 8 0 enc.) DSC and HDR of HX9V generation + # 3 0 (0x1b = 27 0 enc.) SLT, NEX, ILCE-3000/3500, DSC-RX100/RX1 + other DSC of same generation, also QX10 and QX100 + # 4 0 (0x40 = 64 0 enc.) DSC-RX1R + # 5 0 (0x7d = 125 0 enc.) DSC-RX100M2 + # 136 var (0x3a = 58 var enc.) ILCE-7/7R/5000/6000, DSC-HX60V/HX350/HX400V/RX10/WX220/WX350 + # 137 var (0xb3 = 179 var enc.) ILCA-68/77M2, DSC-RX100M3 - appears to go with 136 + # 138 var (0x7e = 126 var enc.) ILCE-7S/5100/QX1, DSC-QX30 - appears to go with 136 + # 139 var (0x9a = 154 var enc.) ILCE-7M2 + # 142 var (0x25 = 37 var enc.) DSC-HX80/HX90V/RX1RM2/RX10M2/RX10M3/RX100M4/WX500, ILCE-6300/7RM2/7SM2 + # 144 var (0xe1 = 225 var enc.) DSC-RX100M5 + # 145 var (0x76 = 118 var enc.) ILCA-99M2, ILCE-6500, DSC-RX0 + # 163 var (0x8b = 139 var enc.) ILCE-6100/6400/6600/7C/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/RX100M7/HX99, ZV-1/E10 + # July 2020: ILCE-7SM3 doesn't write this tag anymore, but writes 0x9416 + 0x9405 => [{ + Name => 'Tag9405a', + # first byte must be 0x1b or 0x40 or 0x7d + Condition => '$$valPt =~ /^[\x1b\x40\x7d]/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9405a' }, + },{ + Name => 'Tag9405b', + # first byte must be 0x3a, 0xb3, 0x7e, 0x9a, 0x25, 0xe1, 0x76 or 0x8b + Condition => '$$valPt =~ /^[\x3a\xb3\x7e\x9a\x25\xe1\x76\x8b]/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9405b' }, + },{ + Name => 'Sony_0x9405', + %unknownCipherData, + }], + 0x9406 => [{ + Name => 'Tag9406', + # - first byte must be 0x01 or 0x02 (enciphered 0x01 or 0x08), + # or 0x03 (enc. 0x1b) for ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2, and ILCA-99M2 + # third byte must be 0x02 or 0x03 (enciphered 0x08 or 0x1b) - ref JR + # (applies to most SLT/ILCA and NEX/ILCE models, but no DSC models) + Condition => '$$valPt =~ /^[\x01\x08\x1b].[\x08\x1b]/s', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9406' }, + },{ + Name => 'Sony_0x9406', + %unknownCipherData, + }], + 0x9407 => { + Name => 'Sony_0x9407', + %unknownCipherData, + }, + 0x9408 => { + Name => 'Sony_0x9408', + %unknownCipherData, + }, + 0x9409 => { + Name => 'Sony_0x9409', + %unknownCipherData, + }, + 0x940a => [{ + Name => 'Tag940a', + Condition => '$$self{Model} =~ /^(SLT-|HV)/', # but appears not valid for ILCA models ... + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag940a' }, + },{ + Name => 'Sony_0x940a', + %unknownCipherData, + }], + 0x940b => { + Name => 'Sony_0x940b', + %unknownCipherData, + }, + 0x940c => [{ + Name => 'Tag940c', + Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|Lunar|ZV-E10)\b/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag940c' }, + },{ + Name => 'Sony_0x940c', + %unknownCipherData, + }], + 0x940d => { + Name => 'Sony_0x940d', + %unknownCipherData, + }, +# 0x940e: 2nd byte = 0: no AFInfo, default for NEX/ILCE +# 2nd byte = 1: AFInfo for SLT/ILCA models (but also seen 1 for DSC-HX20W/HX300/WX70 ...) +# 2nd byte = 2: AFInfo for NEX/ILCE with LA-EA2/EA4 Phase-detect AF Adapter + 0x940e => [{ + Name => 'AFInfo', + Condition => '$$self{Model} =~ /^(SLT-|HV|ILCA-)/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::AFInfo' }, + },{ + Name => 'Tag940e', + Condition => '$$self{Model} =~ /^(NEX-|ILCE-|Lunar)/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag940e' }, + },{ + Name => 'Sony_0x940e', + %unknownCipherData, + }], + 0x940f => { + Name => 'Sony_0x940f', + %unknownCipherData, + }, + 0x9411 => { + Name => 'Sony_0x9411', + %unknownCipherData, + # 0x02 - int32u?: 1,3,5,7,9 (A77) + }, + 0x9416 => { # replaces 0x9405 for the Sony ILCE-7SM3, from July 2020 + Name => 'Sony_0x9416', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9416' }, + }, + 0xb000 => { #8 + Name => 'FileFormat', + Writable => 'int8u', + Count => 4, + # dynamically set the file type to SR2 because we could have assumed ARW up till now + RawConv => q{ + $self->OverrideFileType($$self{TIFF_TYPE} = 'SR2') if $val eq '1 0 0 0'; + return $val; + }, + PrintConvColumns => 2, + PrintConv => { + '0 0 0 2' => 'JPEG', + '1 0 0 0' => 'SR2', + '2 0 0 0' => 'ARW 1.0', + '3 0 0 0' => 'ARW 2.0', + '3 1 0 0' => 'ARW 2.1', + '3 2 0 0' => 'ARW 2.2', #PH (NEX-5) + '3 3 0 0' => 'ARW 2.3', #PH (SLT-A65,SLT-A77) + '3 3 1 0' => 'ARW 2.3.1', #PH/JR (DSC-RX1R/RX100M2/Stellar2) + '3 3 2 0' => 'ARW 2.3.2', #JR (DSC-RX1RM2,ILCE-7SM2 - support for uncompressed 14-bit RAW) + '3 3 3 0' => 'ARW 2.3.3', #JR (ILCE-9) + '3 3 5 0' => 'ARW 2.3.5', #JR (DSC-HX99) + '4 0 0 0' => 'ARW 4.0', # (ILCE-7SM3) + # what about cRAW images? + }, + }, + 0xb001 => { # ref http://forums.dpreview.com/forums/read.asp?forum=1037&message=33609644 + # (ARW and SR2 images only until the SLT-A65V started writing them to JPEG too) + Name => 'SonyModelID', + Writable => 'int16u', + PrintConvColumns => 2, + PrintConv => { + #0 => 'DSC-HX80', #PH (and several other DSC models) + 2 => 'DSC-R1', + 256 => 'DSLR-A100', + 257 => 'DSLR-A900', + 258 => 'DSLR-A700', + 259 => 'DSLR-A200', + 260 => 'DSLR-A350', + 261 => 'DSLR-A300', + 262 => 'DSLR-A900 (APS-C mode)', #https://exiftool.org/forum/index.php/topic,3994.0.html + 263 => 'DSLR-A380/A390', #PH (A390) + 264 => 'DSLR-A330', + 265 => 'DSLR-A230', + 266 => 'DSLR-A290', #PH + 269 => 'DSLR-A850', + 270 => 'DSLR-A850 (APS-C mode)', #https://exiftool.org/forum/index.php/topic,3994.0.html + 273 => 'DSLR-A550', + 274 => 'DSLR-A500', #PH + 275 => 'DSLR-A450', #http://dev.exiv2.org/issues/show/0000611 + 278 => 'NEX-5', #PH + 279 => 'NEX-3', #PH + 280 => 'SLT-A33', #PH + 281 => 'SLT-A55 / SLT-A55V', #PH (A55 NC) + 282 => 'DSLR-A560', #PH + 283 => 'DSLR-A580', #https://exiftool.org/forum/index.php/topic,2881.0.html + 284 => 'NEX-C3', #PH + 285 => 'SLT-A35', #JR + 286 => 'SLT-A65 / SLT-A65V', #PH + 287 => 'SLT-A77 / SLT-A77V', #PH + 288 => 'NEX-5N', #PH + 289 => 'NEX-7', #PH (also Hasselblad Lunar, ref JR) + 290 => 'NEX-VG20E', #JR + 291 => 'SLT-A37', #JR + 292 => 'SLT-A57', #JR + 293 => 'NEX-F3', #PH + 294 => 'SLT-A99 / SLT-A99V', #JR (also Hasselblad HV) + 295 => 'NEX-6', #JR + 296 => 'NEX-5R', #JR + 297 => 'DSC-RX100', #PH (also Hasselblad Stellar, ref JR) + 298 => 'DSC-RX1', #JR + 299 => 'NEX-VG900', #JR + 300 => 'NEX-VG30E', #JR + 302 => 'ILCE-3000 / ILCE-3500', #JR + 303 => 'SLT-A58', #JR + 305 => 'NEX-3N', #PH + 306 => 'ILCE-7', #JR + 307 => 'NEX-5T', #JR + 308 => 'DSC-RX100M2', #JR + 309 => 'DSC-RX10', #JR + 310 => 'DSC-RX1R', #JR + 311 => 'ILCE-7R', #JR + 312 => 'ILCE-6000', #JR + 313 => 'ILCE-5000', #JR + 317 => 'DSC-RX100M3', #JR + 318 => 'ILCE-7S', #JR + 319 => 'ILCA-77M2', #IB + 339 => 'ILCE-5100', #JR + 340 => 'ILCE-7M2', #JR + 341 => 'DSC-RX100M4', #PH + 342 => 'DSC-RX10M2', #JR + 344 => 'DSC-RX1RM2', #JR + 346 => 'ILCE-QX1', #IB + 347 => 'ILCE-7RM2', #JR + 350 => 'ILCE-7SM2', #JR + 353 => 'ILCA-68', #IB + 354 => 'ILCA-99M2', #JR + 355 => 'DSC-RX10M3', #PH + 356 => 'DSC-RX100M5', #IB/JR + 357 => 'ILCE-6300', #IB + 358 => 'ILCE-9', #JR + 360 => 'ILCE-6500', #JR + 362 => 'ILCE-7RM3', #IB + 363 => 'ILCE-7M3', #JR/IB + 364 => 'DSC-RX0', #PH + 365 => 'DSC-RX10M4', #JR + 366 => 'DSC-RX100M6', #IB + 367 => 'DSC-HX99', #IB + 369 => 'DSC-RX100M5A', #JR + 371 => 'ILCE-6400', #IB + 372 => 'DSC-RX0M2', #JR + 374 => 'DSC-RX100M7', #IB + 375 => 'ILCE-7RM4', #IB + 376 => 'ILCE-9M2', #JR + 378 => 'ILCE-6600', #IB/JR + 379 => 'ILCE-6100', #IB/JR + 380 => 'ZV-1', #JR + 381 => 'ILCE-7C', #JR + 382 => 'ZV-E10', #JR + 383 => 'ILCE-7SM3', + 384 => 'ILCE-1', #PH + 385 => 'ILME-FX3', #JR + 386 => 'ILCE-7RM3A', #JR + 387 => 'ILCE-7RM4A', #forum12542 + 388 => 'ILCE-7M4', #IB/JR + }, + }, + 0xb020 => { #2 + Name => 'CreativeStyle', # (called CreativeLook by the 7SM3, ref JR) + Writable => 'string', + # (all of these values have been observed, ref JR and PH) + # - this PrintConv is included to make these strings consistent with + # other CreativeStyle tags, and to facilitate the language translations + # - these values are always English, regardless of the camera language settings + PrintConv => { + OTHER => sub { shift }, # pass other values straight through + None => 'None', + AdobeRGB => 'Adobe RGB', + Real => 'Real', + Standard => 'Standard', + Vivid => 'Vivid', + Portrait => 'Portrait', + Landscape => 'Landscape', + Sunset => 'Sunset', + Nightview => 'Night View/Portrait', + BW => 'B&W', + Neutral => 'Neutral', + Clear => 'Clear', + Deep => 'Deep', + Light => 'Light', + Autumnleaves=> 'Autumn Leaves', + Sepia => 'Sepia', + # new for the ILCE-7SM3 (ref JR) + VV2 => 'Vivid 2', # (NC) + FL => 'FL', # "moody finish with sharp contrast and calm coloring as well as the impressive sky and colors of the greens" + IN => 'IN', # "matte textures by suppressing the contrast and saturation" + SH => 'SH', # "bright, transparent, soft, and vivid mood" + # (...also Custom Look 1-6, but don't konw the values) + }, + }, + 0xb021 => { #2 + Name => 'ColorTemperature', + Writable => 'int32u', + PrintConv => '$val ? ($val==0xffffffff ? "n/a" : $val) : "Auto"', + PrintConvInv => '$val=~/Auto/i ? 0 : ($val eq "n/a" ? 0xffffffff : $val)', + }, + 0xb022 => { #7 + Name => 'ColorCompensationFilter', + Format => 'int32s', + Writable => 'int32u', # (written incorrectly as unsigned by Sony) + Notes => 'negative is green, positive is magenta', + }, + 0xb023 => { #PH (A100) - (set by mode dial) + Name => 'SceneMode', + Writable => 'int32u', + PrintConvColumns => 2, + PrintConv => \%Image::ExifTool::Minolta::minoltaSceneMode, + }, + 0xb024 => { #PH (A100) + Name => 'ZoneMatching', + Writable => 'int32u', + PrintConv => { + 0 => 'ISO Setting Used', + 1 => 'High Key', + 2 => 'Low Key', + }, + }, + 0xb025 => { #PH (A100) + Name => 'DynamicRangeOptimizer', + Writable => 'int32u', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Off', + 1 => 'Standard', + 2 => 'Advanced Auto', + 3 => 'Auto', # (A550) + 8 => 'Advanced Lv1', #JD + 9 => 'Advanced Lv2', #JD + 10 => 'Advanced Lv3', #JD + 11 => 'Advanced Lv4', #JD + 12 => 'Advanced Lv5', #JD + 16 => 'Lv1', # (NEX-5) + 17 => 'Lv2', + 18 => 'Lv3', + 19 => 'Lv4', + 20 => 'Lv5', + }, + }, + 0xb026 => { #PH (A100) + Name => 'ImageStabilization', + Writable => 'int32u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 0xffffffff => 'n/a', # (HX9V sweep panorama, ref JR) + }, + }, + 0xb027 => { #2 + Name => 'LensType', + Writable => 'int32u', + SeparateTable => 1, + # set to 65535 for E-mount lenses (values 0x80xx) + ValueConvInv => '($val & 0xff00) == 0x8000 ? 65535 : int($val)', + PrintConv => \%sonyLensTypes, + }, + 0xb028 => { #2 + # (used by the DSLR-A100) + Name => 'MinoltaMakerNote', + # must check for zero since apparently a value of zero indicates the IFD doesn't exist + # (dumb Sony -- they shouldn't write this tag if the IFD is missing!) + Condition => '$$valPt ne "\0\0\0\0"', + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Minolta::Main', + Start => '$val', + }, + }, + 0xb029 => { #2 (set by creative style menu) + Name => 'ColorMode', + Writable => 'int32u', + PrintConvColumns => 2, + PrintConv => \%Image::ExifTool::Minolta::sonyColorMode, + }, + 0xb02a => { + Name => 'LensSpec', + Format => 'undef', + Writable => 'int8u', + Count => 8, + Notes => q{ + like LensInfo, but also specifies lens features: DT, E, ZA, G, SSM, SAM, + OSS, STF, Reflex, Macro and Fisheye + }, + ValueConv => \&ConvLensSpec, + ValueConvInv => \&ConvInvLensSpec, + PrintConv => \&PrintLensSpec, + PrintConvInv => \&PrintInvLensSpec, + }, + 0xb02b => { #PH (A550 JPEG and A200, A230, A300, A350, A380, A700 and A900 ARW) + Name => 'FullImageSize', + Writable => 'int32u', + Count => 2, + # values stored height first, so swap to get "width height" + ValueConv => 'join(" ", reverse split(" ", $val))', + ValueConvInv => 'join(" ", reverse split(" ", $val))', + PrintConv => '$val =~ tr/ /x/; $val', + PrintConvInv => '$val =~ tr/x/ /; $val', + }, + 0xb02c => { #PH (A550 JPEG and A200, A230, A300, A350, A380, A700 and A900 ARW) + Name => 'PreviewImageSize', + Writable => 'int32u', + Count => 2, + ValueConv => 'join(" ", reverse split(" ", $val))', + ValueConvInv => 'join(" ", reverse split(" ", $val))', + PrintConv => '$val =~ tr/ /x/; $val', + PrintConvInv => '$val =~ tr/x/ /; $val', + }, + 0xb040 => { #2 + Name => 'Macro', + Writable => 'int16u', + RawConv => '$val == 65535 ? undef : $val', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'Close Focus', #9 + 65535 => 'n/a', #PH (A100) + }, + }, + 0xb041 => { #2 + Name => 'ExposureMode', + Writable => 'int16u', + RawConv => '$val == 65535 ? undef : $val', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Program AE', # (RX100 'Program','Sunset' - PH) + 1 => 'Portrait', #PH (HX1) + 2 => 'Beach', #9 + 3 => 'Sports', #9 + 4 => 'Snow', #9 + 5 => 'Landscape', + 6 => 'Auto', # (RX100 'Intelligent Auto' - PH) + 7 => 'Aperture-priority AE', + 8 => 'Shutter speed priority AE', + 9 => 'Night Scene / Twilight',#2/9 + 10 => 'Hi-Speed Shutter', #9 + 11 => 'Twilight Portrait', #9 (RX100 'Night Portrait' - PH) + 12 => 'Soft Snap/Portrait', #9 (TX7 'Soft Snap'; RX100/A37 'Portrait' but manuals say "reproduces soft skin tone" - PH) + 13 => 'Fireworks', #9 + 14 => 'Smile Shutter', #9 (T200) + 15 => 'Manual', + 18 => 'High Sensitivity', #9 + 19 => 'Macro', #JR + 20 => 'Advanced Sports Shooting', #9 + 29 => 'Underwater', #9 + # 30 seen for DSC-W110 and W390, maybe something with Face or Portrait ?? + 33 => 'Food', #9 + 34 => 'Sweep Panorama', #PH (HX1) + 35 => 'Handheld Night Shot', #PH (HX1/TX1, also called "Hand-held Twilight") + 36 => 'Anti Motion Blur', #PH (TX1) + 37 => 'Pet', #9 + 38 => 'Backlight Correction HDR', #9 + 39 => 'Superior Auto', #9 + 40 => 'Background Defocus', #PH (HX20V) + 41 => 'Soft Skin', #JR (HX9V) (HX200V Portrait - PH) + 42 => '3D Image', #JR (HX9V) + # 50 seen for DSC-W530 + 65535 => 'n/a', #PH (A100) + }, + }, + 0xb042 => { #9 + Name => 'FocusMode', + # Only FocusMode for older DSC models; + # Newest DSC models give only 0, many models of 'HX9V generation' give only 4 - + # these models give FocusMode in tag 0xb04e, and are excluded here. + Condition => q{ + ($$self{TagB042} = Get16u($valPt, 0)) and + (not $$self{MetaVersion} or $$self{MetaVersion} ne 'DC7303320222000') + }, + Notes => 'not valid for all models', + Writable => 'int16u', + RawConv => '$val == 65535 ? undef : $val', + PrintConv => { + # 0 - seen this for panorama shot + 1 => 'AF-S', # (called Single-AF by Sony) + 2 => 'AF-C', # (called Monitor-AF by Sony) + 4 => 'Permanent-AF', # (TX7,HX9V?) + 65535 => 'n/a', #PH (A100), also for DSC-W690 panorama shots + }, + }, + 0xb043 => [{ #9 + Name => 'AFAreaMode', + # AFAreaMode only for older models; + # exclude newest DSC models, which give AFAreaMode in Tag9402 0x0017 (eg. RX100 - PH) + Writable => 'int16u', + Condition => 'not $$self{MetaVersion} or $$self{MetaVersion} ne "DC7303320222000"', #JR + RawConv => '$val == 65535 ? undef : $val', + Notes => 'older models', + PrintConv => { + # 0 - (takes this value after camera reset, but can't be set back once changed) + 0 => 'Default', + 1 => 'Multi', + 2 => 'Center', + 3 => 'Spot', + 4 => 'Flexible Spot', # (T200) + 6 => 'Touch', + 14 => 'Tracking', #JR (HX9V) ("Manual" for the T200?, ref 9) + 15 => 'Face Tracking', # (not set when in face detect mode and no faces detected) + 65535 => 'n/a', #PH (A100) + }, + },{ #JR + Name => 'AFAreaMode', + # AFAreaMode for DSC-HX9V generation, having values that appear to be different from older models. + Writable => 'int16u', + Condition => '$$self{TagB042} and $$self{TagB042} != 0', + Notes => 'DSC-HX9V generation cameras', + PrintConv => { + 0 => 'Multi', + 1 => 'Center', + 2 => 'Spot', #(NC) seen for DSC-WX9 + 3 => 'Flexible Spot', + 10 => 'Selective (for Miniature effect)', # seen for Miniature effect of DSC-WX30 + 14 => 'Tracking', + 15 => 'Face Tracking', + 255 => 'Manual', + }, + }], + 0xb044 => { #9 + Name => 'AFIlluminator', + Writable => 'int16u', + RawConv => '$val == 65535 ? undef : $val', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 65535 => 'n/a', #PH (A100) + }, + }, + # 0xb045 - int16u: 0 + # 0xb046 - int16u: 0 + 0xb047 => { #2 + Name => 'JPEGQuality', + Writable => 'int16u', + RawConv => '$val == 65535 ? undef : $val', + PrintConv => { + 0 => 'Standard', + 1 => 'Fine', + 2 => 'Extra Fine', #JR + 65535 => 'n/a', #PH (A100) + }, + }, + 0xb048 => { #9 + Name => 'FlashLevel', #JR other name, but values -9 to 9 match FlashExposureCompensation + Writable => 'int16s', + RawConv => '($val == -1 and $$self{Model} =~ /DSLR-A100\b/) ? undef : $val', + PrintConv => { + -32768 => 'Low', + -9 => '-9/3', #JR + -6 => '-6/3', #JR + -5 => '-5/3', #JR + -4 => '-4/3', #JR + -3 => '-3/3', + -2 => '-2/3', + -1 => '-1/3', # (for the A100, -1 is effectively 'n/a' - PH) + 0 => 'Normal', + 1 => '+1/3', + 2 => '+2/3', + 3 => '+3/3', + 4 => '+4/3', #JR (NC) + 5 => '+5/3', #JR (NC) + 6 => '+6/3', #JR + 9 => '+9/3', #JR + 128 => 'n/a', #JR (HX9V) + 32767 => 'High', + }, + }, + 0xb049 => { #9 + Name => 'ReleaseMode', + Writable => 'int16u', + RawConv => '$val == 65535 ? undef : $val', + PrintConv => { + 0 => 'Normal', # (ie. shutter button) + 2 => 'Continuous', + 5 => 'Exposure Bracketing', + 6 => 'White Balance Bracketing', # (HX5) + 8 => 'DRO Bracketing', #JR (ILCE-7RM2) + 65535 => 'n/a', #PH (A100) + }, + }, + 0xb04a => { #9 + Name => 'SequenceNumber', + Notes => 'shot number in continuous burst', + Writable => 'int16u', + RawConv => '$val == 65535 ? undef : $val', + PrintConv => { + 0 => 'Single', + 65535 => 'n/a', #PH (A100) + OTHER => sub { shift }, # pass all other numbers straight through + }, + }, + 0xb04b => { #2/PH + Name => 'Anti-Blur', + Writable => 'int16u', + RawConv => '$val == 65535 ? undef : $val', + PrintConv => { + 0 => 'Off', + 1 => 'On (Continuous)', #PH (NC) + 2 => 'On (Shooting)', #PH (NC) + 65535 => 'n/a', + }, + }, + # 0xb04c - rational64u: 10/10 (seen 5 for HX9V Manual-exposure images, ref JR) + # 0xb04d - int16u: 0 + # (the Kamisaka decoding of 0xb04e seems wrong - ref JR) + # 0xb04e => { #2 + # Name => 'LongExposureNoiseReduction', + # Notes => 'LongExposureNoiseReduction for other models', + # Writable => 'int16u', + # RawConv => '$val == 65535 ? undef : $val', + # PrintConv => { + # 0 => 'Off', + # 1 => 'On', + # 2 => 'On 2', #PH (TX10, TX100, WX9, WX10, etc) + # # 4 - seen this (CX360E, CX700E) + # 65535 => 'n/a', #PH (A100) + # }, + # }, + 0xb04e => { #PH (RX100) - but not in RX100M3 anymore (ref JR) + Name => 'FocusMode', + Condition => '$$self{MetaVersion} and $$self{MetaVersion} eq "DC7303320222000"', #JR + Notes => 'valid for DSC-HX9V generation and newer', + Writable => 'int16u', + PrintConv => { + 0 => 'Manual', + # 1 - seen for DSC-WX7 burst, HDR-CX130E/CX560E + 2 => 'AF-S', + 3 => 'AF-C', + # 4 - seen for HDR-CX360E/CX700E + 5 => 'Semi-manual', #JR (HX9V) + 6 => 'DMF', # "Direct Manual Focus" + }, + }, + 0xb04f => { #PH (TX1) + Name => 'DynamicRangeOptimizer', + Writable => 'int16u', + Priority => 0, # (unreliable for the A77) + PrintConv => { + 0 => 'Off', + 1 => 'Standard', + 2 => 'Plus', + # 8 for HDR models - what does this mean? + }, + }, + 0xb050 => { #PH (RX100) + Name => 'HighISONoiseReduction2', + Condition => '$$self{Model} =~ /^(DSC-|Stellar)/', + Notes => 'DSC models only', + Writable => 'int16u', + PrintConv => { + 0 => 'Normal', + 1 => 'High', + 2 => 'Low', + 3 => 'Off', #JR + # it seems that all SLT and NEX models give n/a here (ref JR) + 65535 => 'n/a', + }, + }, + # 0xb051 - int16u: 0 + 0xb052 => { #PH (TX1) + Name => 'IntelligentAuto', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + 2 => 'Advanced', #9 + }, + }, + # 0xb053 - int16u: normally 0, but got 1 for a superior auto backlight picture (RX100) + 0xb054 => { #PH/9/JR (TX1,TX7,RX100,HX9V) + Name => 'WhiteBalance', + Writable => 'int16u', + Notes => q{ + decoding of the Fluorescent settings matches the EXIF standard, which is + different than the names used by Sony for some models + }, + PrintConv => { + 0 => 'Auto', + 4 => 'Custom', # (manual) + 5 => 'Daylight', + 6 => 'Cloudy', + # PrintConv names matching Exif Fluorescent LightSource names (ref JR) + # (Sony uses conflicting names for some models) + 7 => 'Cool White Fluorescent', # (RX100) (TX7/HX9V "Fluorescent 1 (White)", ref 9/JR) + 8 => 'Day White Fluorescent', # (RX100) (TX7/HX9V "Fluorescent 2 (Natural White)", ref 9/JR) + 9 => 'Daylight Fluorescent', # (RX100) (TX7/HX9V "Fluorescent 3 (Day White)", ref 9/JR) + 10 => 'Incandescent2', #JR (HX9V) + 11 => 'Warm White Fluorescent', + 14 => 'Incandescent', + 15 => 'Flash', + 17 => 'Underwater 1 (Blue Water)', #9 + 18 => 'Underwater 2 (Green Water)', #9 + 19 => 'Underwater Auto', #JR + }, + }, +); + +# "SEMC MS" maker notes +%Image::ExifTool::Sony::Ericsson = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + NOTES => 'Maker notes found in images from some Sony Ericsson phones.', + 0x2000 => { + Name => 'MakerNoteVersion', + Writable => 'undef', + Count => 4, + }, + 0x201 => { + Name => 'PreviewImageStart', + IsOffset => 1, + MakerPreview => 1, # force preview inside maker notes + OffsetPair => 0x202, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + Notes => 'a small 320x200 preview image', + }, + 0x202 => { + Name => 'PreviewImageLength', + OffsetPair => 0x201, + DataTag => 'PreviewImage', + Writable => 'int32u', + WriteGroup => 'MakerNotes', + Protected => 2, + }, +); + +# camera information for the A700/A850/A900 (ref JR) +%Image::ExifTool::Sony::CameraInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Camera information for the A700, A850 and A900.', + 0x00 => { + Name => 'LensSpec', + # the A700/A850/A900 use a different int16 byte ordering! - PH + Format => 'undef[8]', + ValueConv => sub { + my $val = shift;; + return ConvLensSpec(pack('v*', unpack('n*', $val))); + }, + ValueConvInv => sub { + my $val = shift; + return pack('v*', unpack('n*', ConvInvLensSpec($val))); + }, + PrintConv => \&PrintLensSpec, + PrintConvInv => \&PrintInvLensSpec, + }, + 0x0014 => { + Name => 'FocusModeSetting', + Notes => 'FocusModeSetting for the A700, A850 and A900', + PrintConv => { + 0 => 'Manual', + 1 => 'AF-S', + 2 => 'AF-C', + 3 => 'AF-A', + 4 => 'DMF', + }, + }, + 0x0015 => { # the AF Point selected in AFAreaMode=Local or Spot; always '0' for AFAreaMode=Wide + Name => 'AFPointSelected', + PrintConvColumns => 2, + PrintConv => { + 0 => 'Auto', + 1 => 'Center', + 2 => 'Top', + 3 => 'Upper-right', + 4 => 'Right', + 5 => 'Lower-right', + 6 => 'Bottom', + 7 => 'Lower-left', + 8 => 'Left', + 9 => 'Upper-left', + 10 => 'Far Right', # only given by A700 + 11 => 'Far Left', # only given by A700 + }, + }, + # 0x0019 - AF sensor used for focusing for A700/A850/A900: + # + # A700 AF sensor layout: A850/A900 AF sensor layout: + # + # - *-* - = AF sensor + # | | | | * = assist sensor + # - *-* o = F2.8 sensor + # | | |o| | | | * |o| * | A700 center: double-cross + F2.8 + # - *-* A850 center: double-cross + F2.8 + 4 assist + # | | | | + # - *-* + # + # Following values seen for A700/A850 in AFAreaMode=Local or Spot: (other values only seen in "Wide") + # + # 16 + # 0 19 + # 13 + # 3 1 22 20 18 + # 8 + # 2 21 + # 5 + # + # Note 1: A850/A900 AFPoint Selected 'Left'/'Right' (in 0x0015) corresponds in position (see diagram) + # to A700 Local AFPoint 'Far Left'/'Far Right', and gives 'Far Left'/'Far Right' in 0x0019. + # Note 2: A700 in "Wide" also gives all 23 values in 0x0019, although it doesn't have assist-points ... + 0x0019 => { # the AF sensor used for focusing + Name => 'AFPoint', + PrintConv => { + 0 => 'Upper-left', + 1 => 'Left', + 2 => 'Lower-left', + 3 => 'Far Left', + 4 => 'Bottom Assist-left', #(NC) + 5 => 'Bottom', + 6 => 'Bottom Assist-right', #(NC) + # values 7-14: 8 center points: 4 from double-cross + 4 assist; 7-10 appear horizontal, 11-14 vertical + 7 => 'Center (7)', #(NC) + 8 => 'Center (horizontal)', + 9 => 'Center (9)', #(NC) + 10 => 'Center (10)', #(NC) + 11 => 'Center (11)', #(NC) + 12 => 'Center (12)', #(NC) + 13 => 'Center (vertical)', + 14 => 'Center (14)', #(NC) + 15 => 'Top Assist-left', #(NC) + 16 => 'Top', + 17 => 'Top Assist-right', #(NC) + 18 => 'Far Right', + 19 => 'Upper-right', + 20 => 'Right', + 21 => 'Lower-right', + 22 => 'Center F2.8', + }, + }, + # AF Status for A700/A850/A900, which have different sensor layout + # and different int16 byte ordering + 0x001e => { Name => 'AFStatusActiveSensor', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0020 => { Name => 'AFStatusUpper-left', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0022 => { Name => 'AFStatusLeft', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0024 => { Name => 'AFStatusLower-left', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0026 => { Name => 'AFStatusFarLeft', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0028 => { Name => 'AFStatusBottomAssist-left', %Image::ExifTool::Minolta::afStatusInfo }, + 0x002a => { Name => 'AFStatusBottom', %Image::ExifTool::Minolta::afStatusInfo }, + 0x002c => { Name => 'AFStatusBottomAssist-right', %Image::ExifTool::Minolta::afStatusInfo }, + 0x002e => { Name => 'AFStatusCenter-7', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0030 => { Name => 'AFStatusCenter-horizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0032 => { Name => 'AFStatusCenter-9', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0034 => { Name => 'AFStatusCenter-10', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0036 => { Name => 'AFStatusCenter-11', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0038 => { Name => 'AFStatusCenter-12', %Image::ExifTool::Minolta::afStatusInfo }, + 0x003a => { Name => 'AFStatusCenter-vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x003c => { Name => 'AFStatusCenter-14', %Image::ExifTool::Minolta::afStatusInfo }, + 0x003e => { Name => 'AFStatusTopAssist-left', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0040 => { Name => 'AFStatusTop', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0042 => { Name => 'AFStatusTopAssist-right', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0044 => { Name => 'AFStatusFarRight', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0046 => { Name => 'AFStatusUpper-right', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0048 => { Name => 'AFStatusRight', %Image::ExifTool::Minolta::afStatusInfo }, + 0x004a => { Name => 'AFStatusLower-right', %Image::ExifTool::Minolta::afStatusInfo }, + 0x004c => { Name => 'AFStatusCenterF2-8', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0130 => { + Name => 'AFMicroAdjValue', + Condition => '$$self{Model} =~ /^DSLR-A(850|900)\b/', + ValueConv => '$val - 20', + ValueConvInv => '$val + 20', + }, + 0x0131 => { + Name => 'AFMicroAdjMode', + Condition => '$$self{Model} =~ /^DSLR-A(850|900)\b/', + Mask => 0x80, + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 305.1 => { # (0x131) + Name => 'AFMicroAdjRegisteredLenses', + Notes => 'number of registered lenses with a non-zero AFMicroAdjValue', + Condition => '$$self{Model} =~ /^DSLR-A(850|900)\b/', + Mask => 0x7f, + }, + # 0x0166 - 40 x 128 int8u values: AF Info Blocks for A850 and A900, not for A700 +); + +# camera information for other DSLR models (ref JR) +%Image::ExifTool::Sony::CameraInfo2 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + Camera information for the DSLR-A200, A230, A290, A300, A330, A350, A380 and + A390. + }, + 0x00 => { + Name => 'LensSpec', + Format => 'undef[8]', + ValueConv => \&ConvLensSpec, + ValueConvInv => \&ConvInvLensSpec, + PrintConv => \&PrintLensSpec, + PrintConvInv => \&PrintInvLensSpec, + }, + # 0x0010 - maybe to do with AFStatus: 0 na./Manual, 4 Failed, 16 Tracking, 64 Focused + 0x0014 => { + Name => 'AFPointSelected', + PrintConvColumns => 2, + PrintConv => { #JR (NC) same list as A100, A700/A900, as all have 9 point AF + 0 => 'Auto', + 1 => 'Center', + 2 => 'Top', + 3 => 'Upper-right', + 4 => 'Right', + 5 => 'Lower-right', + 6 => 'Bottom', + 7 => 'Lower-left', + 8 => 'Left', + 9 => 'Upper-left', + }, + }, + 0x0015 => { + Name => 'FocusModeSetting', + Notes => 'FocusModeSetting for other models', + PrintConv => { + 0 => 'Manual', + 1 => 'AF-S', + 2 => 'AF-C', + 3 => 'AF-A', + 4 => 'DMF', + }, + }, + # 0x0018 - AF sensor used for focusing for A200/A230/A290/A300/A330/A350/A380/A390; AF sensor layout: + # + # - - = AF sensor + # | | + = cross sensor + # + # - + - + # + # | | + # - + # + 0x0018 => { # used A100 list which appears to match + Name => 'AFPoint', + PrintConv => { + 0 => 'Top-right', + 1 => 'Bottom-right', + 2 => 'Bottom', + 3 => 'Middle Horizontal', + 4 => 'Center Vertical', + 5 => 'Top', + 6 => 'Top-left', + 7 => 'Bottom-left', + }, + }, + # AF Status for A200/A230/A290/A300/A330/A350/A380/A390: analogous to A100 in Minolta.pm + 0x001b => { Name => 'AFStatusActiveSensor', %Image::ExifTool::Minolta::afStatusInfo }, + 0x001d => { Name => 'AFStatusTop-right', %Image::ExifTool::Minolta::afStatusInfo }, + 0x001f => { Name => 'AFStatusBottom-right', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0021 => { Name => 'AFStatusBottom', %Image::ExifTool::Minolta::afStatusInfo }, + # MiddleHorizontal is any of the 3 central horizontal sensors + 0x0023 => { Name => 'AFStatusMiddleHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0025 => { Name => 'AFStatusCenterVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0027 => { Name => 'AFStatusTop', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0029 => { Name => 'AFStatusTop-left', %Image::ExifTool::Minolta::afStatusInfo }, + 0x002b => { Name => 'AFStatusBottom-left', %Image::ExifTool::Minolta::afStatusInfo }, + # the 3 MiddleHorizontal sensors + 0x002d => { Name => 'AFStatusLeft', %Image::ExifTool::Minolta::afStatusInfo }, + 0x002f => { Name => 'AFStatusCenterHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0031 => { Name => 'AFStatusRight', %Image::ExifTool::Minolta::afStatusInfo }, + # 0x0166 - 59 x 96 int8u values: AF Info Blocks for A230/A290/A330/A380/A390 + # 0x0182 - 58 x 88 int8u values: AF Info Blocks for A200/A300/A350 +); + +# Camera information for the A55 (ref PH) +# (also valid for A33, A35, A560, A580 - ref JR) +%Image::ExifTool::Sony::CameraInfo3 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + IS_SUBDIR => [ 0x23 ], + NOTES => q{ + Camera information stored by the A33, A35, A55, A450, A500, A550, A560, + A580, NEX-3/5/5C/C3 and VG10E. Some tags are valid only for some of these + models. + }, + 0x00 => { #JR + Name => 'LensSpec', + Condition => '$$self{Model} !~ /^NEX-5C/', + Format => 'undef[8]', + ValueConv => \&ConvLensSpec, + ValueConvInv => \&ConvInvLensSpec, + PrintConv => \&PrintLensSpec, + PrintConvInv => \&PrintInvLensSpec, + }, + 0x0e => { #JR + Name => 'FocalLength', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + Format => 'int16u', + Priority => 0, + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ mm//; $val', + }, + 0x10 => { #JR + Name => 'FocalLengthTeleZoom', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + Format => 'int16u', + ValueConv => '$val * 2 / 3', + ValueConvInv => 'int($val * 3 / 2 + 0.5)', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ mm//; $val', + }, +# +# Note: +# The below AF decoding covers cameras with 2 different AF systems, with overlapping offsets ! +# 1) DSLR-A450/A500/A550 with 9 point AF system: decoding/offsets identical to A200 - A390 in CameraInfo +# 2) SLT-A33/A35/A55 and DSLR-A560/A580 with 15 point AF system: similar/more info but at different offsets +# + 0x14 => { #JR + Name => 'AFPointSelected', + Condition => '$$self{Model} =~ /^(DSLR-A(450|500|550))\b/', + # (these cameras have a 9-point AF system, ref JR) + PrintConvColumns => 2, + PrintConv => { + 0 => 'Auto', # (seen in Wide mode and for Manual Focus) + 1 => 'Center', # seen for AFArea=Spot + 2 => 'Top', + 3 => 'Upper-right', + 4 => 'Right', + 5 => 'Lower-right', + 6 => 'Bottom', + 7 => 'Lower-left', + 8 => 'Left', + 9 => 'Upper-left', + }, + }, + 0x15 => { #JR + Name => 'FocusMode', + Condition => '$$self{Model} =~ /^(DSLR-A(450|500|550))\b/', + PrintConv => { + 0 => 'Manual', + 1 => 'AF-S', + 2 => 'AF-C', + 3 => 'AF-A', + }, + }, + 0x18 => { #JR + Name => 'AFPoint', + Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)\b/', + PrintConv => { + 0 => 'Top-right', + 1 => 'Bottom-right', + 2 => 'Bottom', + 3 => 'Middle Horizontal', + 4 => 'Center Vertical', + 5 => 'Top', + 6 => 'Top-left', + 7 => 'Bottom-left', + }, + }, + 0x19 => { #JR + Name => 'FocusStatus', + Condition => '$$self{Model} =~ /^(SLT-|DSLR-A(560|580))\b/', + Notes => 'not valid with Contrast AF or for NEX models', + # seen the following values: + # 0 with MF (A35, A55V-HDR, A560, A580), non-AF lens (A35), and A580 Contrast-AF + # 4 with MF (A33, A55V), and A580 Contrast-AF + # 16 with AF-C (or AF-A) and focus OK + # 24 with AF-C (or AF-A) and unsharp or fast moving subject e.g. bird in flight + # 64 with AF-S (or AF-A) and focus OK + PrintConv => { + 0 => 'Manual - Not confirmed (0)', + 4 => 'Manual - Not confirmed (4)', + 16 => 'AF-C - Confirmed', + 24 => 'AF-C - Not Confirmed', + 64 => 'AF-S - Confirmed', + }, + }, + 0x1b => { #JR + Name => 'AFStatusActiveSensor', + Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)\b/', + %Image::ExifTool::Minolta::afStatusInfo, + }, + 0x1c => { + Name => 'AFPointSelected', # (v8.88: renamed from LocalAFAreaPointSelected) + Condition => '$$self{Model} =~ /^(SLT-|DSLR-A(560|580))\b/', + Notes => 'not valid for Contrast AF', #JR + # (all of these cameras have an 15-point three-cross AF system, ref JR) + PrintConvColumns => 2, + PrintConv => { + 0 => 'Auto', # (seen in Wide mode) + 1 => 'Center', + 2 => 'Top', + 3 => 'Upper-right', + 4 => 'Right', + 5 => 'Lower-right', + 6 => 'Bottom', + 7 => 'Lower-left', + 8 => 'Left', + 9 => 'Upper-left', + 10 => 'Far Right', + 11 => 'Far Left', + 12 => 'Upper-middle', + 13 => 'Near Right', + 14 => 'Lower-middle', + 15 => 'Near Left', + }, + }, + 0x1d => [ + { + Name => 'FocusMode', + Condition => '$$self{Model} =~ /^(SLT-|DSLR-A(560|580))\b/', + PrintConv => { + 0 => 'Manual', + 1 => 'AF-S', + 2 => 'AF-C', + 3 => 'AF-A', + }, + },{ #JR + Name => 'AFStatusTop-right', + Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)\b/', + %Image::ExifTool::Minolta::afStatusInfo, + }, + ], + 0x1f => { #JR + Name => 'AFStatusBottom-right', + Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)\b/', + %Image::ExifTool::Minolta::afStatusInfo, + }, + 0x20 => { #JR + Name => 'AFPoint', # (v8.88: renamed from LocalAFAreaPointUsed) + Condition => '$$self{Model} =~ /^(SLT-|DSLR-A(560|580))\b/', + Notes => 'the AF sensor used for focusing. Not valid for Contrast AF', + PrintConvColumns => 2, + PrintConv => { + %afPoint15, + 255 => '(none)', #PH (A55, guess; also A35 with non-AF lens, ref JR) + }, + }, + 0x21 => [ #JR + { + Name => 'AFStatusActiveSensor', + Condition => '$$self{Model} =~ /^(SLT-|DSLR-A(560|580))\b/', + %Image::ExifTool::Minolta::afStatusInfo, + },{ + Name => 'AFStatusBottom', + Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)\b/', + %Image::ExifTool::Minolta::afStatusInfo, + }, + ], + 0x23 => [ #JR + { + Name => 'AFStatus15', + Condition => '$$self{Model} =~ /^(SLT-|DSLR-A(560|580))\b/', + Format => 'int16s[18]', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::AFStatus15' }, + },{ + Name => 'AFStatusMiddleHorizontal', # MiddleHorizontal is any of the 3 central horizontal sensors + Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)\b/', + %Image::ExifTool::Minolta::afStatusInfo, + }, + ], + 0x25 => { Name => 'AFStatusCenterVertical', Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)\b/', %Image::ExifTool::Minolta::afStatusInfo }, + 0x27 => { Name => 'AFStatusTop', Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)\b/', %Image::ExifTool::Minolta::afStatusInfo }, + 0x29 => { Name => 'AFStatusTop-left', Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)\b/', %Image::ExifTool::Minolta::afStatusInfo }, + 0x2b => { Name => 'AFStatusBottom-left', Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)\b/', %Image::ExifTool::Minolta::afStatusInfo }, + # the 3 MiddleHorizontal sensors: + 0x2d => { Name => 'AFStatusLeft', Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)\b/', %Image::ExifTool::Minolta::afStatusInfo }, + 0x2f => { Name => 'AFStatusCenterHorizontal', Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)\b/', %Image::ExifTool::Minolta::afStatusInfo }, + 0x31 => { Name => 'AFStatusRight', Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)\b/', %Image::ExifTool::Minolta::afStatusInfo }, + # 0x0166 - starting here there are 96 AF Info blocks of 155 bytes each for the SLT-A33/A35/A55 and DSLR-A560/A580, + # starting here there are 86 AF Info blocks of 174 bytes each for the DSLR-A450/A500/A550, + # but NOT for NEX, and not for the A580 in Contrast-AF mode (ref JR) + # The 43rd byte of each block for A580 appears to be the AFPoint as in offset 0x20, + # possibly also 73rd and 74th byte +); + +# Camera information for other models (ref PH) +%Image::ExifTool::Sony::CameraInfoUnknown = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, +); + +# white balance and other camera information (ref PH) +%Image::ExifTool::Sony::FocusInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PRIORITY => 0, + NOTES => q{ + More camera settings and focus information decoded for models such as the + A200, A230, A290, A300, A330, A350, A380, A390, A700, A850 and A900. + }, + 0x0e => [{ #7/JR + Name => 'DriveMode2', + Condition => '$$self{Model} =~ /^DSLR-A(230|290|330|380|390)$/', + Notes => 'A230, A290, A330, A380 and A390', + ValueConvInv => '$val', + PrintHex => 1, + PrintConv => { # (values confirmed for specified models - PH) + 0x01 => 'Single Frame', # (A230,A330,A380) + 0x02 => 'Continuous High', #PH (A230,A330) + 0x04 => 'Self-timer 10 sec', # (A230) + 0x05 => 'Self-timer 2 sec, Mirror Lock-up', # (A230,A290,A330,A380,390) + 0x07 => 'Continuous Bracketing', # (A230,A330) + 0x0a => 'Remote Commander', # (A230) + 0x0b => 'Continuous Self-timer', # (A230,A330) + }, + },{ + Name => 'DriveMode2', + Notes => 'A200, A300, A350, A700, A850 and A900', + ValueConvInv => '$val', + PrintHex => 1, + PrintConv => { + 0x01 => 'Single Frame', + 0x02 => 'Continuous High', # A700/A900; not on A850 + 0x12 => 'Continuous Low', #JR + 0x04 => 'Self-timer 10 sec', + 0x05 => 'Self-timer 2 sec, Mirror Lock-up', + 0x06 => 'Single-frame Bracketing', + 0x07 => 'Continuous Bracketing', + 0x18 => 'White Balance Bracketing Low', #JR + 0x28 => 'White Balance Bracketing High', #JR + 0x19 => 'D-Range Optimizer Bracketing Low', #JR + 0x29 => 'D-Range Optimizer Bracketing High', #JR + 0x0a => 'Remote Commander', #JR + 0x0b => 'Mirror Lock-up', #JR (A850/A900; not on A700) + }, + }], + 0x10 => { #JR (1 and 2 inverted!) + Name => 'Rotation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 270 CW', + 2 => 'Rotate 90 CW', + }, + }, + 0x14 => { + Name => 'ImageStabilizationSetting', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x15 => { #7 + Name => 'DynamicRangeOptimizerMode', + PrintConv => { + 0 => 'Off', + 1 => 'Standard', + 2 => 'Advanced Auto', + 3 => 'Advanced Level', + }, + }, + 0x2b => { #JR seen 2,1,3 for both WB and DRO bracketing + Name => 'BracketShotNumber', + Notes => 'WB and DRO bracketing', + }, + 0x2c => { #JR + Name => 'WhiteBalanceBracketing', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'High', + }, + }, + 0x2d => { #JR seen 2,1,3 for both WB and DRO bracketing + Name => 'BracketShotNumber2', + }, + 0x2e => { #JR + Name => 'DynamicRangeOptimizerBracket', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'High', + }, + }, + 0x2f => { #JR seen 0,1,2 and 0,1,2,3,4 for 3 and 5 image bracketing sequences + Name => 'ExposureBracketShotNumber', + }, + 0x3f => { #JR + Name => 'ExposureProgram', + SeparateTable => 'ExposureProgram', + PrintConv => \%sonyExposureProgram, + }, + 0x41 => { #JR style actually used (combination of mode dial + creative style menu) + Name => 'CreativeStyle', + PrintConvColumns => 2, + PrintConv => { + 1 => 'Standard', + 2 => 'Vivid', + 3 => 'Portrait', + 4 => 'Landscape', + 5 => 'Sunset', + 6 => 'Night View/Portrait', + 8 => 'B&W', + 9 => 'Adobe RGB', # A700 + 11 => 'Neutral', + 12 => 'Clear', #7 + 13 => 'Deep', #7 + 14 => 'Light', #7 + 15 => 'Autumn Leaves', #7 + 16 => 'Sepia', #7 + }, + }, + 0x6d => { + Name => 'ISOSetting', + ValueConv => '$val ? exp(($val/8-6)*log(2))*100 : $val', + ValueConvInv => '$val ? 8*(log($val/100)/log(2)+6) : $val', + PrintConv => '$val ? sprintf("%.0f",$val) : "Auto"', + PrintConvInv => '$val =~ /auto/i ? 0 : $val', + }, + 0x6f => { + Name => 'ISO', + ValueConv => '$val ? exp(($val/8-6)*log(2))*100 : $val', + ValueConvInv => '$val ? 8*(log($val/100)/log(2)+6) : $val', + PrintConv => '$val ? sprintf("%.0f",$val) : "Auto"', + PrintConvInv => '$val =~ /auto/i ? 0 : $val', + }, + 0x77 => { #JR + Name => 'DynamicRangeOptimizerMode', + PrintConv => { + 0 => 'Off', + 1 => 'Standard', + 2 => 'Advanced Auto', + 3 => 'Advanced Level', + }, + }, + 0x79 => 'DynamicRangeOptimizerLevel', +# 0x06f1 - int16u LensType, Condition => '$$self{Model} =~ /^DSLR-A(700|850|900)$/', +# 0x4a81 - int16u LensType, Condition => '$$self{Model} !~ /^DSLR-A(700|850|900)$/', +# 0x4a84 - int16uRev LensType, Condition => '$$self{Model} =~ /^DSLR-A(700|850|900)$/', + 0x0846 => { #13 + Name => 'ShutterCount', # (=ImageCount for these models) + Condition => '$$self{Model} =~ /^DSLR-A(230|290|330|380|390|850|900)$/', + Format => 'int32u', + Notes => 'only valid for some DSLR models', + RawConv => '$val & 0x00ffffff', #PH + }, + 0x09bb => { #PH (validated only for DSLR-A850) + Name => 'FocusPosition', + Condition => '$$self{Model} =~ /^DSLR-A(200|230|290|300|330|350|380|390|700|850|900)$/', + Notes => 'only valid for some DSLR models', + # 128 = infinity -- see Composite:FocusDistance below + }, + 0x1110 => { # (9600 bytes: 4 sets of 40x30 int16u values in the range 0-8191) + Name => 'TiffMeteringImage', + Format => 'undef[9600]', + Notes => q{ + 13-bit RBGG (?) 40x30 pixels, presumably metering info, extracted as a + 16-bit TIFF image; + }, + ValueConv => sub { + my ($val, $et) = @_; + return undef unless length $val >= 9600; + return \ "Binary data 7404 bytes" unless $et->Options('Binary'); + my @dat = unpack('n*', $val); + # TIFF header for a 16-bit RGB 10dpi 40x30 image + $val = Image::ExifTool::MakeTiffHeader(40,30,3,16,10); + # re-order data to RGB pixels + my ($i, @val); + for ($i=0; $i<40*30; ++$i) { + # data is 13-bit (max 8191), shift left to fill 16 bits + # (typically, this gives a very dark image since the data should + # really be anti-logged to convert from EV to perceived brightness) +# push @val, $dat[$i]<<3, $dat[$i+2400]<<3, $dat[$i+1200]<<3; + push @val, int(5041.1*log($dat[$i]+1)/log(2)), int(5041.1*log($dat[$i+2400]+1)/log(2)), int(5041.1*log($dat[$i+1200]+1)/log(2)); + } + $val .= pack('v*', @val); # add TIFF strip data + return \$val; + }, + }, +); + +# more camera setting information (ref JR) +# - many of these tags are the same as in CameraSettings3 +%Image::ExifTool::Sony::MoreInfo = ( + PROCESS_PROC => \&ProcessMoreInfo, + WRITE_PROC => \&ProcessMoreInfo, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + More camera settings information decoded for the A450, A500, A550, A560, + A580, A33, A35, A55, NEX-3/5/C3 and VG10E. + }, + 0x0001 => { # (256 bytes) + Name => 'MoreSettings', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::MoreSettings' }, + }, + # (byte sizes for a single A580 image -- not checked for other images) + 0x0002 => [ # (256 bytes) + { + Name => 'FaceInfo', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::FaceInfo' }, + },{ + Name => 'FaceInfoA', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::FaceInfoA' }, + }, + ], + # 0x0101: 512 bytes + # 0x0102: 1804 bytes + # 0x0103: 176 bytes + # 0x0104: 1088 bytes + # 0x0105: 160 bytes (all zero unless flash is used, ref JR) + # 0x0106: 256 bytes (faces detected if first byte is non-zero? ref JR) + 0x0107 => { # (7200 bytes: 3 sets of 40x30 int16u values in the range 0-1023) + Name => 'TiffMeteringImage', + Notes => q{ + 10-bit RGB data from the 1200 AE metering segments, extracted as a 16-bit + TIFF image + }, + ValueConv => sub { + my ($val, $et) = @_; + return undef unless length $val >= 7200; + return \ "Binary data 7404 bytes" unless $et->Options('Binary'); + my @dat = unpack('v*', $val); + # TIFF header for a 16-bit RGB 10dpi 40x30 image + $val = Image::ExifTool::MakeTiffHeader(40,30,3,16,10); + # re-order data to RGB pixels + my ($i, @val); + for ($i=0; $i<40*30; ++$i) { + # data is 10-bit (max 1023), shift left to fill 16 bits + # (typically, this gives a very dark image since the data should + # really be anti-logged to convert from EV to perceived brightness) + push @val, $dat[$i]<<6, $dat[$i+1200]<<6, $dat[$i+2400]<<6; + } + $val .= pack('v*', @val); # add TIFF strip data + return \$val; + }, + }, + # 0x0108: 140 bytes + # 0x0109: 256 bytes + # 0x010a: 256 bytes + # 0x0306: 276 bytes + # 0x0307: 256 bytes + # 0x0308: 96 bytes + # 0x0309: 112 bytes + # 0xffff: 788 bytes + 0x0201 => { # (368 bytes) + Name => 'MoreInfo0201', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::MoreInfo0201' }, + }, + # 0x0202: 144 bytes + # 0x0401: 4608 bytes + 0x0401 => { + Name => 'MoreInfo0401', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::MoreInfo0401' }, + }, +); + +%Image::ExifTool::Sony::MoreInfo0201 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PRIORITY => 0, +# 0x005d - also from 0 - 255, in sync with but lower than 0x005e, depending on FocalLength +# 0x005e => { +# # FocusPosition for A560/A580/A33/A35/A55V +# # seen values from 80 - 255 (= infinity) -- see Composite:FocusDistance2 below +# Name => 'FocusPosition2_0201', +# Condition => '$$self{Model} !~ /^(NEX-|DSLR-(A450|A500|A550)$)/', +# }, +# 0x0093 - also from 0 - 255, in sync with but lower than 0x0094, depending on FocalLength +# 0x0094 => { +# # FocusPosition for A450/A500/A550 +# # seen values from 80 - 255 (= infinity) -- see Composite:FocusDistance2 below +# Name => 'FocusPosition2_0201', +# Condition => '$$self{Model} =~ /^(DSLR-(A450|A500|A550)$)/', +# }, + 0x011b => { #13 + Name => 'ImageCount', + Condition => '$$self{Model} !~ /^DSLR-A(450|500|550)$/', #JR + Format => 'int32u', + Notes => 'not valid for the A450, A500 or A550', + RawConv => '$val & 0x00ffffff', + }, + 0x0125 => { #13 + Name => 'ShutterCount', + Condition => '$$self{Model} !~ /^DSLR-A(450|500|550)$/', #JR + Format => 'int32u', + Notes => 'not valid for the A450, A500 or A550', + RawConv => '$val & 0x00ffffff', + }, + 0x014a => { #13 + Name => 'ShutterCount', # (=ImageCount for these models) + Condition => '$$self{Model} =~ /^DSLR-A(450|500|550)$/', #JR + Format => 'int32u', + Notes => 'A450, A500 and A550 only', + RawConv => '$val & 0x00ffffff', + }, +); + +%Image::ExifTool::Sony::MoreInfo0401 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PRIORITY => 0, + 0x044e => { #JR + Name => 'ShotNumberSincePowerUp', + Condition => '$$self{Model} !~ /^NEX-(3|5)$/', + Format => 'int32u', + Notes => 'Not valid for the NEX-3 or NEX-5', + RawConv => '$val & 0x00ffffff', + }, +# 0x101e - int16u LensType Condition => '$$self{Model} =~ /^SLT-A(33|55V)/', +# 0x1022 - int16u LensType Condition => '$$self{Model} =~ /^DSLR-A(560|580)/', +# 0x102a - int16u LensType Condition => '$$self{Model} =~ /^(SLT-A35|NEX-C3)/', + +# 0x10a8 - int16u LensType Condition => '$$self{Model} =~ /^SLT-A(33|55V)/', +# 0x10ac - int16u LensType Condition => '$$self{Model} =~ /^DSLR-A(560|580)/', +# 0x10b4 - int16u LensType Condition => '$$self{Model} =~ /^(SLT-A35|NEX-C3)/', +# +# 0x10f7 - int16u LensType Condition => '$$self{Model} =~ /^SLT-A(33|55V)/', +# 0x10fb - int16u LensType Condition => '$$self{Model} =~ /^DSLR-A(560|580)/', +# 0x1103 - int16u LensType Condition => '$$self{Model} =~ /^(SLT-A35|NEX-C3)/', +# +# 0x1181 - int16u LensType Condition => '$$self{Model} =~ /^SLT-A(33|55V)/', +# 0x1185 - int16u LensType Condition => '$$self{Model} =~ /^DSLR-A(560|580)/', +# 0x118d - int16u LensType Condition => '$$self{Model} =~ /^(SLT-A35|NEX-C3)/', +); + +# more camera setting information (ref JR) +# - many of these tags are the same as in CameraSettings3 +%Image::ExifTool::Sony::MoreSettings = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + PRIORITY => 0, + 0x01 => { # interesting: somewhere between CameraSettings3 0x04 and 0x34 + Name => 'DriveMode2', + PrintHex => 1, + PrintConv => { + 0x10 => 'Single Frame', + 0x21 => 'Continuous High', # also automatically selected for Scene mode Sports-action (0x05=52) + 0x22 => 'Continuous Low', + 0x30 => 'Speed Priority Continuous', + 0x51 => 'Self-timer 10 sec', + 0x52 => 'Self-timer 2 sec, Mirror Lock-up', + 0x71 => 'Continuous Bracketing 0.3 EV', + 0x75 => 'Continuous Bracketing 0.7 EV', + 0x91 => 'White Balance Bracketing Low', + 0x92 => 'White Balance Bracketing High', + 0xc0 => 'Remote Commander', + }, + }, + 0x02 => { + Name => 'ExposureProgram', + SeparateTable => 'ExposureProgram2', + PrintConv => \%sonyExposureProgram2, + }, + 0x03 => { + Name => 'MeteringMode', + PrintConv => { + 1 => 'Multi-segment', + 2 => 'Center-weighted average', + 3 => 'Spot', + }, + }, + 0x04 => { + Name => 'DynamicRangeOptimizerSetting', + PrintConv => { + 1 => 'Off', + 16 => 'On (Auto)', + 17 => 'On (Manual)', + }, + }, + 0x05 => 'DynamicRangeOptimizerLevel', + 0x06 => { + Name => 'ColorSpace', + PrintConv => { + 1 => 'sRGB', + 2 => 'Adobe RGB', + }, + }, + 0x07 => { + Name => 'CreativeStyleSetting', + PrintConvColumns => 2, + PrintConv => { + 16 => 'Standard', + 32 => 'Vivid', + 64 => 'Portrait', + 80 => 'Landscape', + 96 => 'B&W', + 160 => 'Sunset', + }, + }, + 0x08 => { #JR + Name => 'ContrastSetting', + Format => 'int8s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x09 => { + Name => 'SaturationSetting', + Format => 'int8s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x0a => { + Name => 'SharpnessSetting', + Format => 'int8s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x0d => { + Name => 'WhiteBalanceSetting', + # many guessed, based on "logical system" as observed for Daylight and Shade and steps of 16 between the modes + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => \%whiteBalanceSetting, + SeparateTable => 1, + }, + 0x0e => { + Name => 'ColorTemperatureSetting', + # matches "0xb021 ColorTemperature" when WB set to "Custom" or "Color Temperature/Color Filter" + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + PrintConv => '"$val K"', + PrintConvInv => '$val =~ s/ ?K$//i; $val', + }, + 0x0f => { + Name => 'ColorCompensationFilterSet', + # seen 0, 1-9 and 245-255, corresponding to 0, M1-M9 and G9-G1 on camera display + # matches "0xb022 ColorCompensationFilter" when WB set to "Custom" or "Color Temperature/Color Filter" + Format => 'int8s', + Notes => 'negative is green, positive is magenta', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x10 => { + Name => 'FlashMode', + PrintConvColumns => 2, + PrintConv => { + 1 => 'Flash Off', + 16 => 'Autoflash', + 17 => 'Fill-flash', + 18 => 'Slow Sync', + 19 => 'Rear Sync', + 20 => 'Wireless', + }, + }, + 0x11 => { + Name => 'LongExposureNoiseReduction', + PrintConv => { + 1 => 'Off', + 16 => 'On', # (unused or dark subject) + }, + }, + 0x12 => { + Name => 'HighISONoiseReduction', + PrintConv => { + 16 => 'Low', + 17 => 'High', + 19 => 'Auto', + }, + }, + 0x13 => { # why is this not valid for A450/A500/A550 ? + Name => 'FocusMode', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + PrintConv => { + 17 => 'AF-S', + 18 => 'AF-C', + 19 => 'AF-A', + 32 => 'Manual', + 48 => 'DMF', #(NC) (seen for NEX-5) + }, + }, + 0x15 => { + Name => 'MultiFrameNoiseReduction', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + PrintConv => { + 0 => 'n/a', # seen for A450/A500/A550 + 1 => 'Off', + 16 => 'On', + 255 => 'None', # seen for NEX-3/5/C3 + }, + }, + 0x16 => { + Name => 'HDRSetting', + PrintConv => { + 1 => 'Off', + 16 => 'On (Auto)', + 17 => 'On (Manual)', + }, + }, + 0x17 => { + Name => 'HDRLevel', + PrintConvColumns => 3, + PrintConv => { + 33 => '1 EV', + 34 => '1.5 EV', #JR (NC) + 35 => '2 EV', + 36 => '2.5 EV', #JR (NC) + 37 => '3 EV', + 38 => '3.5 EV', #PH (NC) + 39 => '4 EV', + 40 => '5 EV', + 41 => '6 EV', + }, + }, + 0x18 => { + Name => 'ViewingMode', + PrintConv => { + 16 => 'ViewFinder', + 33 => 'Focus Check Live View', + 34 => 'Quick AF Live View', + }, + }, + 0x19 => { + Name => 'FaceDetection', + PrintConv => { + 1 => 'Off', + 16 => 'On', + }, + }, + 0x1a => { + Name => 'CustomWB_RBLevels', + # matches "0x7313 WB_RGGBLevels" when WB set to "Custom", except factor of 4 + Format => 'int16uRev[2]', + }, + # From here different and overlapping offsets for 3 groups of cameras: + # 1) DSLR-A450/A500/A550 + # 2) NEX-3/5/5C + # 3) DSLR-A560/A580, NEX-C3/VG10/VG10E, SLT-A33/A35/A55V + 0x1e => [{ + Name => 'BrightnessValue', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + ValueConv => '($val-106)/8', + ValueConvInv => '$val * 8 + 106', + },{ + Name => 'ExposureCompensationSet', + Notes => 'other models', + ValueConv => '($val - 128) / 24', #PH + ValueConvInv => 'int($val * 24 + 128.5)', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }], + 0x1f => [{ + Name => 'ISO', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + ValueConv => '$val ? exp(($val/8-6)*log(2))*100 : $val', + ValueConvInv => '$val ? 8*(log($val/100)/log(2)+6) : $val', + PrintConv => '$val ? sprintf("%.0f",$val) : "Auto"', + PrintConvInv => '$val =~ /auto/i ? 0 : $val', + },{ + Name => 'FlashExposureCompSet', + Notes => 'other models', + Description => 'Flash Exposure Comp. Setting', + ValueConv => '($val - 128) / 24', #PH + ValueConvInv => 'int($val * 24 + 128.5)', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }], + 0x20 => [{ + Name => 'FNumber', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + ValueConv => '2 ** (($val/8 - 1) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', + },{ + Name => 'LiveViewAFMethod', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)/', + Notes => 'other models except the NEX-3/5/5C', + PrintConv => { + 0 => 'n/a', + 1 => 'Phase-detect AF', + 2 => 'Contrast AF', + # Contrast AF is only available with SSM/SAM lenses and in Focus Check LV, + # NOT in Quick AF LV, and is automatically set when mounting SSM/SAM lens + # - changes into Phase-AF when switching to Quick AF LV. + }, + }], + 0x21 => [{ + Name => 'ExposureTime', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + ValueConv => '$val ? 2 ** (6 - $val/8) : 0', + ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + },{ + Name => 'ISO', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C', + ValueConv => '$val ? exp(($val/8-6)*log(2))*100 : $val', + ValueConvInv => '$val ? 8*(log($val/100)/log(2)+6) : $val', + PrintConv => '$val ? sprintf("%.0f",$val) : "Auto"', + PrintConvInv => '$val =~ /auto/i ? 0 : $val', + }], + 0x22 => { + Name => 'FNumber', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C only', + ValueConv => '2 ** (($val/8 - 1) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', + }, + 0x23 => [{ + Name => 'FocalLength2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + ValueConv => '10 * 2 ** (($val-28)/16)', + ValueConvInv => '$val>0 ? log($val/10)/log(2) * 16 + 28 : 0', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//; $val', + },{ + Name => 'ExposureTime', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C', + ValueConv => '$val ? 2 ** (6 - $val/8) : 0', + ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }], + 0x24 => { + Name => 'ExposureCompensation2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + Format => 'int16s', + ValueConv => '$val / 8', + ValueConvInv => '$val * 8', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }, + 0x25 => [{ + Name => 'FocalLength2', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C', + ValueConv => '10 * 2 ** (($val-28)/16)', + ValueConvInv => '$val>0 ? log($val/10)/log(2) * 16 + 28 : 0', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//; $val', + },{ + Name => 'ISO', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)/', + Notes => 'other models except the A450, A500 and A550', + ValueConv => '$val ? exp(($val/8-6)*log(2))*100 : $val', + ValueConvInv => '$val ? 8*(log($val/100)/log(2)+6) : $val', + PrintConv => '$val ? sprintf("%.0f",$val) : "Auto"', + PrintConvInv => '$val =~ /auto/i ? 0 : $val', + }], + 0x26 => [{ + Name => 'FlashExposureCompSet2', + Description => 'Flash Exposure Comp. Setting 2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + Format => 'int16s', + ValueConv => '$val / 8', + ValueConvInv => '$val * 8', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + },{ + Name => 'ExposureCompensation2', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C', + Format => 'int16s', + ValueConv => '$val / 8', + ValueConvInv => '$val * 8', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + },{ + Name => 'FNumber', + Notes => 'other models', + ValueConv => '2 ** (($val/8 - 1) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', + }], + 0x27 => { + Name => 'ExposureTime', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)|DSLR-(A450|A500|A550)/', + Notes => 'models other than the A450, A500, A550 and NEX-3/5/5C', + ValueConv => '$val ? 2 ** (6 - $val/8) : 0', + ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x28 => { + Name => 'Orientation2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + PrintConv => { + 1 => 'Horizontal (normal)', + 2 => 'Rotate 180', + 6 => 'Rotate 90 CW', + 8 => 'Rotate 270 CW', + }, + }, + 0x29 => [{ + # FocusPosition for A450/A500/A550 + # seen values from 80 - 255 (= infinity) -- see Composite:FocusDistance2 below + Name => 'FocusPosition2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + },{ + # value increase of 16 corresponds to doubling of FocalLength + Name => 'FocalLength2', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)/', + Notes => 'other models except the NEX-3/5/5C', + ValueConv => '10 * 2 ** (($val-28)/16)', + ValueConvInv => '$val>0 ? log($val/10)/log(2) * 16 + 28 : 0', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//; $val', + }], + 0x2a => [{ + Name => 'FlashAction', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + PrintConv => { + 0 => 'Did not fire', + 1 => 'Fired', + }, + },{ + Name => 'ExposureCompensation2', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)/', + Notes => 'other models except the NEX-3/5/5C', + Format => 'int16s', + ValueConv => '$val / 8', + ValueConvInv => '$val * 8', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }], + 0x2b => { + # FocusPosition for NEX-3/5/5C + # seen values from 80 - 255 (= infinity) -- see Composite:FocusDistance2 below + Name => 'FocusPosition2', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C only', + }, + 0x2c => [{ + Name => 'FocusMode2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + PrintConv => { + 0 => 'AF', + 1 => 'MF', + }, + },{ + Name => 'FlashAction', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C FlashAction2', + PrintConv => { + 0 => 'Did not fire', + 1 => 'Fired', + }, + },{ + Name => 'FlashExposureCompSet2', + Description => 'Flash Exposure Comp. Setting 2', + Notes => 'other models FlashExposureCompSet2', + Format => 'int16s', + ValueConv => '$val / 8', + ValueConvInv => '$val * 8', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', + }], + 0x2e => [{ + Name => 'FocusMode2', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C', + PrintConv => { + 0 => 'AF', + 1 => 'MF', + }, + },{ + Name => 'Orientation2', # seen some A55 images where this does not match the other Orientation tags + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)/', + Notes => 'other models except the A450, A500 and A550', + PrintConv => { + 1 => 'Horizontal (normal)', + 2 => 'Rotate 180', + 6 => 'Rotate 90 CW', + 8 => 'Rotate 270 CW', + }, + }], + 0x2f => { + # FocusPosition for A560/A580/A33/A35/A55V and NEX-C3/VG10/VG10E + # seen values from 80 - 255 (= infinity) -- see Composite:FocusDistance2 below + Name => 'FocusPosition2', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)|DSLR-(A450|A500|A550)/', + Notes => 'models other than the A450, A500, A550 and NEX-3/5/5C', + }, + 0x30 => { + Name => 'FlashAction', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)|DSLR-(A450|A500|A550)/', + Notes => 'models other than the A450, A500, A550 and NEX-3/5/5C', + PrintConv => { + 0 => 'Did not fire', + 1 => 'Fired', + }, + }, + 0x32 => { + Name => 'FocusMode2', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)|DSLR-(A450|A500|A550)/', + Notes => 'models other than the A450, A500, A550 and NEX-3/5/5C', + PrintConv => { + 0 => 'AF', + 1 => 'MF', + }, + }, + 0x0077 => { + Name => 'FlashAction2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + PrintConv => { + 0 => 'Did not fire', + 2 => 'External Flash fired (2)', + 3 => 'Built-in Flash fired', + 4 => 'External Flash fired (4)', # what is difference with 2 ? + }, + }, + 0x0078 => { + Name => 'FlashActionExternal', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + PrintConv => { + 136 => 'Did not fire', + 121 => 'Fired', # what is difference with 122 ? + 122 => 'Fired', + }, + }, + 0x007c => { + Name => 'FlashActionExternal', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)|DSLR-(A450|A500|A550)/', + PrintConv => { + 136 => 'Did not fire', + 167 => 'Fired', + 182 => 'Fired, HSS', + }, + }, + 0x0082 => { + Name => 'FlashStatus', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + PrintConv => { + 0 => 'None', + 2 => 'External', + }, + }, + 0x0086 => { + Name => 'FlashStatus', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)|DSLR-(A450|A500|A550)/', + PrintConv => { + 0 => 'None', + 1 => 'Built-in', + 2 => 'External', + }, + }, +); + +# Face detection information (ref JR) +my %faceInfo = ( + Format => 'int16u[4]', + # re-order to top,left,height,width and scale to full-sized image like other Sony models + ValueConv => 'my @v=split(" ",$val); $_*=15 foreach @v; "$v[1] $v[0] $v[3] $v[2]"', + ValueConvInv => 'my @v=split(" ",$val); $_=int($_/15+0.5) foreach @v; "$v[1] $v[0] $v[3] $v[2]"', +); +%Image::ExifTool::Sony::FaceInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int16u', + DATAMEMBER => [ 0x00 ], + 0x00 => { + Name => 'FacesDetected', + DataMember => 'FacesDetected', + Format => 'int16s', + RawConv => '$$self{FacesDetected} = ($val == -1 ? 0 : $val); $val', + PrintConv => { + OTHER => sub { shift }, # pass other values straight through + -1 => 'n/a', + }, + }, + 0x01 => { + Name => 'Face1Position', + Condition => '$$self{FacesDetected} >= 1', + %faceInfo, + Notes => q{ + re-ordered and scaled to return the top, left, height and width of detected + face, with coordinates relative to the full-sized unrotated image and + increasing Y downwards + }, + }, + 0x06 => { + Name => 'Face2Position', + Condition => '$$self{FacesDetected} >= 2', + %faceInfo, + }, + 0x0b => { + Name => 'Face3Position', + Condition => '$$self{FacesDetected} >= 3', + %faceInfo, + }, + 0x10 => { + Name => 'Face4Position', + Condition => '$$self{FacesDetected} >= 4', + %faceInfo, + }, + 0x15 => { + Name => 'Face5Position', + Condition => '$$self{FacesDetected} >= 5', + %faceInfo, + }, + 0x1a => { + Name => 'Face6Position', + Condition => '$$self{FacesDetected} >= 6', + %faceInfo, + }, + 0x1f => { + Name => 'Face7Position', + Condition => '$$self{FacesDetected} >= 7', + %faceInfo, + }, + 0x24 => { + Name => 'Face8Position', + Condition => '$$self{FacesDetected} >= 8', + %faceInfo, + }, +); + +%Image::ExifTool::Sony::FaceInfoA = ( # different offsets for A450/A500/A550 + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int16u', + DATAMEMBER => [ 0x02, 0x03, 0x08 ], +# +# The FacesDetected number at 0x03 below is often 1 lower than the one at Tag900b 0x02. +# The number of Face Positions starting at 0x5b (max. 4) corresponds to the number at 0x03. +# The number of Face Positions starting at 0x0b usually corresponds to the FacesDetected number of Tag900b... +# Therefore created the extra condition at 0x0b (11.1) to output an available FacePosition, even when 0x03=0... +# + 0x02 => { + Name => 'FaceTest2', + DataMember => 'FaceTest2', + Hidden => 1, + RawConv => '$$self{FaceTest2} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val', + }, + 0x03 => { + Name => 'FacesDetected', + DataMember => 'FacesDetected', + RawConv => '$$self{FacesDetected} = ($val > 8 ? 0 : $val); $val', + ValueConv => '$val > 8 ? 0 : $val', + }, + 0x08 => { + Name => 'FaceTest8', + DataMember => 'FaceTest8', + Hidden => 1, + RawConv => '$$self{FaceTest8} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val', + }, +# 0x0b - start of 8 Face Positions of 10 int16u values each + 0x0b => { + Name => 'PotentialFace1Position', + Condition => q{ + $$self{FacesDetected} >= 1 or + ($$self{FaceTest8} > 0 and ($$self{FaceTest2} == 1 or $$self{FaceTest2} == 257)) + }, + %faceInfo, + }, + 0x15 => { + Name => 'PotentialFace2Position', + Condition => '$$self{FacesDetected} >= 2 or ($$self{FacesDetected} == 1 and $$self{FaceTest8} > 0)', + %faceInfo, + }, + 0x1f => { + Name => 'PotentialFace3Position', + Condition => '$$self{FacesDetected} >= 3 or ($$self{FacesDetected} == 2 and $$self{FaceTest8} > 0)', + %faceInfo, + }, + 0x29 => { + Name => 'PotentialFace4Position', + Condition => '$$self{FacesDetected} >= 4 or ($$self{FacesDetected} == 3 and $$self{FaceTest8} > 0)', + %faceInfo, + }, + 0x33 => { + Name => 'PotentialFace5Position', + Condition => '$$self{FacesDetected} >= 5 or ($$self{FacesDetected} == 4 and $$self{FaceTest8} > 0)', + %faceInfo, + }, + 0x3d => { + Name => 'PotentialFace6Position', + Condition => '$$self{FacesDetected} >= 6 or ($$self{FacesDetected} == 5 and $$self{FaceTest8} > 0)', + %faceInfo, + }, + 0x47 => { + Name => 'PotentialFace7Position', + Condition => '$$self{FacesDetected} >= 7 or ($$self{FacesDetected} == 6 and $$self{FaceTest8} > 0)', + %faceInfo, + }, + 0x51 => { + Name => 'PotentialFace8Position', + Condition => '$$self{FacesDetected} >= 8 or ($$self{FacesDetected} == 7 and $$self{FaceTest8} > 0)', + %faceInfo, + }, +# 0x5b - start of max. 4 further Face Positions here + 0x5b => { + Name => 'Face1Position', + Condition => '$$self{FacesDetected} >= 1', + %faceInfo, + }, + 0x65 => { + Name => 'Face2Position', + Condition => '$$self{FacesDetected} >= 2', + %faceInfo, + }, + 0x6f => { + Name => 'Face3Position', + Condition => '$$self{FacesDetected} >= 3', + %faceInfo, + }, + 0x79 => { + Name => 'Face4Position', + Condition => '$$self{FacesDetected} >= 4', + %faceInfo, + }, +); + +# Camera settings (ref PH) (decoded mainly from A200) +%Image::ExifTool::Sony::CameraSettings = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int16u', + PRIORITY => 0, + NOTES => 'Camera settings for the A200, A300, A350, A700, A850 and A900.', + 0x00 => { #JR + Name => 'ExposureTime', + ValueConv => '$val ? 2 ** (6 - $val/8) : 0', + ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x01 => { #JR + Name => 'FNumber', + ValueConv => '2 ** (($val/8 - 1) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', + }, + 0x02 => { #JR (requires external flash) + Name => 'HighSpeedSync', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 0x03 => { #JR + Name => 'ExposureCompensationSet', + ValueConv => '($val - 128) / 24', + ValueConvInv => 'int($val * 24 + 128.5)', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x04 => { #7/JR + Name => 'DriveMode', + Mask => 0xff, # (not sure what upper byte is for) + PrintHex => 1, + PrintConv => { + 0x01 => 'Single Frame', + 0x02 => 'Continuous High', # A700/A900; not on A850 + 0x12 => 'Continuous Low', #JR + 0x04 => 'Self-timer 10 sec', + 0x05 => 'Self-timer 2 sec, Mirror Lock-up', + 0x06 => 'Single-frame Bracketing', + 0x07 => 'Continuous Bracketing', # (A200 val=0x1107) + 0x18 => 'White Balance Bracketing Low', #JR + 0x28 => 'White Balance Bracketing High', #JR + 0x19 => 'D-Range Optimizer Bracketing Low', #JR + 0x29 => 'D-Range Optimizer Bracketing High', #JR + 0x0a => 'Remote Commander', #JR + 0x0b => 'Mirror Lock-up', #JR (A850/A900; not on A700) + }, + }, + 0x05 => { #JR + Name => 'WhiteBalanceSetting', + PrintConv => { + 2 => 'Auto', + 4 => 'Daylight', + 5 => 'Fluorescent', + 6 => 'Tungsten', + 7 => 'Flash', + 16 => 'Cloudy', + 17 => 'Shade', + 18 => 'Color Temperature/Color Filter', + 32 => 'Custom 1', + 33 => 'Custom 2', + 34 => 'Custom 3', + }, + }, + 0x06 => { #7 (A700) (ref JR: at least also valid for A200, ValueConv as for ColorCompensationFilterSet) + Name => 'WhiteBalanceFineTune', + ValueConv => '$val > 128 ? $val - 256 : $val', + ValueConvInv => '$val < 0 ? $val + 256 : $val', + }, + 0x07 => { #JR as set in WB "Color Temperature/Color Filter" and in White Balance Bracketing + Name => 'ColorTemperatureSet', + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + PrintConv => '"$val K"', + PrintConvInv => '$val =~ s/ ?K$//i; $val', + }, + 0x08 => { #JR as set in WB "Color Temperature/Color Filter" + Name => 'ColorCompensationFilterSet', + Notes => 'negative is green, positive is magenta', + ValueConv => '$val > 128 ? $val - 256 : $val', + ValueConvInv => '$val < 0 ? $val + 256 : $val', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x0c => { #JR as set in WB "Custom" and in White Balance Bracketing + Name => 'ColorTemperatureCustom', + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + PrintConv => '"$val K"', + PrintConvInv => '$val =~ s/ ?K$//i; $val', + }, + 0x0d => { #JR as set in WB "Custom" + Name => 'ColorCompensationFilterCustom', + Notes => 'negative is green, positive is magenta', + ValueConv => '$val > 128 ? $val - 256 : $val', + ValueConvInv => '$val < 0 ? $val + 256 : $val', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x0f => { #JR + Name => 'WhiteBalance', + PrintConv => { + 2 => 'Auto', + 4 => 'Daylight', + 5 => 'Fluorescent', + 6 => 'Tungsten', + 7 => 'Flash', + 12 => 'Color Temperature', + 13 => 'Color Filter', + 14 => 'Custom', + 16 => 'Cloudy', + 17 => 'Shade', + }, + }, + 0x10 => { #7 (A700) + Name => 'FocusModeSetting', + PrintConv => { + 0 => 'Manual', + 1 => 'AF-S', + 2 => 'AF-C', + 3 => 'AF-A', + 4 => 'DMF', #JR + }, + }, + 0x11 => { #JD (A700) + Name => 'AFAreaMode', + PrintConv => { + 0 => 'Wide', + 1 => 'Local', + 2 => 'Spot', + }, + }, + 0x12 => { #7 (A700) + Name => 'AFPointSetting', + Format => 'int16u', + # The AF point as selected by the user in AFAreaMode=Local or Spot; + # Reported value remains at the last-set position in AFAreaModes=Wide. + # A200, A300, A350: 9-point centre-cross (ref JR) + # A700: 11-point centre-dual-cross (ref JR) + # A850, A900: 9-point centre-dual-cross with 10 assist-points (ref JR) + PrintConvColumns => 2, + PrintConv => { + 1 => 'Center', + 2 => 'Top', + 3 => 'Upper-right', + 4 => 'Right', + 5 => 'Lower-right', + 6 => 'Bottom', + 7 => 'Lower-left', + 8 => 'Left', + 9 => 'Upper-left', + 10 => 'Far Right', # (presumably A700 only) + 11 => 'Far Left', # (presumably A700 only) + }, + }, + 0x13 => { #JR + Name => 'FlashMode', + PrintConv => { + 0 => 'Autoflash', + 2 => 'Rear Sync', + 3 => 'Wireless', + 4 => 'Fill-flash', + 5 => 'Flash Off', + 6 => 'Slow Sync', + }, + }, + 0x14 => { #JR + Name => 'FlashExposureCompSet', + Description => 'Flash Exposure Comp. Setting', + # (as pre-selected by the user, not zero if flash didn't fire) + ValueConv => '($val - 128) / 24', #PH + ValueConvInv => 'int($val * 24 + 128.5)', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x15 => { #7 + Name => 'MeteringMode', + PrintConv => { + 1 => 'Multi-segment', + 2 => 'Center-weighted average', + 4 => 'Spot', + }, + }, + 0x16 => { + Name => 'ISOSetting', + # 0 indicates 'Auto' (I think) + ValueConv => '$val ? exp(($val/8-6)*log(2))*100 : $val', + ValueConvInv => '$val ? 8*(log($val/100)/log(2)+6) : $val', + PrintConv => '$val ? sprintf("%.0f",$val) : "Auto"', + PrintConvInv => '$val =~ /auto/i ? 0 : $val', + }, + 0x18 => { #7 + Name => 'DynamicRangeOptimizerMode', + PrintConv => { + 0 => 'Off', + 1 => 'Standard', + 2 => 'Advanced Auto', + 3 => 'Advanced Level', + }, + }, + 0x19 => { #7 + Name => 'DynamicRangeOptimizerLevel', + }, + 0x1a => { # style actually used (combination of mode dial + creative style menu) + Name => 'CreativeStyle', + PrintConvColumns => 2, + PrintConv => { + 1 => 'Standard', + 2 => 'Vivid', + 3 => 'Portrait', + 4 => 'Landscape', + 5 => 'Sunset', + 6 => 'Night View/Portrait', + 8 => 'B&W', + 9 => 'Adobe RGB', # A700 + 11 => 'Neutral', + 12 => 'Clear', #7 + 13 => 'Deep', #7 + 14 => 'Light', #7 + 15 => 'Autumn Leaves', #7 + 16 => 'Sepia', #7 + }, + }, + 0x1b => { #JR + Name => 'ColorSpace', + PrintConv => { + 0 => 'sRGB', + 1 => 'Adobe RGB', # (A850, selected via Colorspace menu item) + 5 => 'Adobe RGB (A700)', # (A700, selected via CreativeStyle menu) + }, + }, + 0x1c => { + Name => 'Sharpness', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x1d => { + Name => 'Contrast', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x1e => { + Name => 'Saturation', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x1f => { #7 + Name => 'ZoneMatchingValue', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x22 => { #7 + Name => 'Brightness', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x23 => { + Name => 'FlashControl', + PrintConv => { + 0 => 'ADI', + 1 => 'Pre-flash TTL', + 2 => 'Manual', + }, + }, + 0x28 => { #7 + Name => 'PrioritySetupShutterRelease', + PrintConv => { + 0 => 'AF', + 1 => 'Release', + }, + }, + 0x29 => { #7 + Name => 'AFIlluminator', + PrintConv => { + 0 => 'Auto', + 1 => 'Off', + }, + }, + 0x2a => { #7 + Name => 'AFWithShutter', + PrintConv => { 0 => 'On', 1 => 'Off' }, + }, + 0x2b => { #7 + Name => 'LongExposureNoiseReduction', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x2c => { #7 + Name => 'HighISONoiseReduction', + PrintConv => { + 0 => 'Normal', + 1 => 'Low', + 2 => 'High', + 3 => 'Off', + }, + }, + 0x2d => { #7 + Name => 'ImageStyle', + PrintConvColumns => 2, + PrintConv => { + 1 => 'Standard', + 2 => 'Vivid', + 3 => 'Portrait', #PH + 4 => 'Landscape', #PH + 5 => 'Sunset', #PH + 7 => 'Night View/Portrait', #PH (A200/A350 when CreativeStyle was 6!) + 8 => 'B&W', #PH (guess) + 9 => 'Adobe RGB', + 11 => 'Neutral', + 129 => 'StyleBox1', + 130 => 'StyleBox2', + 131 => 'StyleBox3', + 132 => 'StyleBox4', #JR (A850) + 133 => 'StyleBox5', #JR (A850) + 134 => 'StyleBox6', #JR (A850) + }, + }, + 0x2e => { #JR (may not apply to A200/A300/A350 -- they don't have the AF/MF button) + Name => 'FocusModeSwitch', + PrintConv => { + 0 => 'AF', + 1 => 'Manual', + }, + }, + 0x2f => { #JR + Name => 'ShutterSpeedSetting', + Notes => 'used in M, S and Program Shift S modes', + ValueConv => '$val ? 2 ** (6 - $val/8) : 0', + ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x30 => { #JR + Name => 'ApertureSetting', + Notes => 'used in M, A and Program Shift A modes', + ValueConv => '2 ** (($val/8 - 1) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', + }, + 0x3c => { + Name => 'ExposureProgram', + SeparateTable => 'ExposureProgram', + PrintConv => \%sonyExposureProgram, + }, + 0x3d => { + Name => 'ImageStabilizationSetting', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x3e => { #JR + Name => 'FlashAction', + PrintConv => { + 0 => 'Did not fire', + 1 => 'Fired', + 2 => 'External Flash, Did not fire', + 3 => 'External Flash, Fired', + }, + }, + 0x3f => { # (verified for A330/A380) + Name => 'Rotation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', #(NC) + 2 => 'Rotate 270 CW', + }, + }, + 0x40 => { #JR + Name => 'AELock', + PrintConv => { + 1 => 'Off', + 2 => 'On', + }, + }, + 0x4c => { #JR + Name => 'FlashAction2', + PrintConv => { + 1 => 'Fired, Autoflash', + 2 => 'Fired, Fill-flash', + 3 => 'Fired, Rear Sync', + 4 => 'Fired, Wireless', + 5 => 'Did not fire', + 6 => 'Fired, Slow Sync', + 17 => 'Fired, Autoflash, Red-eye reduction', + 18 => 'Fired, Fill-flash, Red-eye reduction', + 34 => 'Fired, Fill-flash, HSS', + }, + }, + 0x4d => { #JR + Name => 'FocusMode', # (focus mode actually used) + PrintConv => { + 0 => 'Manual', + 1 => 'AF-S', + 2 => 'AF-C', + 3 => 'AF-A', + 4 => 'DMF', #JR + }, + }, + 0x50 => { #JR + Name => 'BatteryState', + PrintConv => { + 2 => 'Empty', # 0% + 3 => 'Very Low', # 1 - 20% + 4 => 'Low', # 21 - 50% + 5 => 'Sufficient', # 51 - 80% + 6 => 'Full', # > 80% + }, + }, + 0x51 => { #JR + Name => 'BatteryLevel', + PrintConv => '"$val%"', + PrintConvInv => '$val=~s/\s*\%//; $val', + }, + 0x53 => { #JR + Name => 'FocusStatus', + PrintConv => { + 0 => 'Not confirmed', + 4 => 'Not confirmed, Tracking', + BITMASK => { + 0 => 'Confirmed', + 1 => 'Failed', + 2 => 'Tracking', + }, + }, + }, + 0x54 => { + Name => 'SonyImageSize', + PrintConv => { + 1 => 'Large', + 2 => 'Medium', + 3 => 'Small', + }, + }, + 0x55 => { #7 + Name => 'AspectRatio', + PrintConv => { + 1 => '3:2', + 2 => '16:9', + }, + }, + 0x56 => { #PH/7 + Name => 'Quality', + PrintConv => { + 0 => 'RAW', + 2 => 'CRAW', + 34 => 'RAW + JPEG', + 35 => 'CRAW + JPEG', + 16 => 'Extra Fine', + 32 => 'Fine', + 48 => 'Standard', + }, + }, + 0x58 => { #7 + Name => 'ExposureLevelIncrements', + PrintConv => { + 33 => '1/3 EV', + 50 => '1/2 EV', + }, + }, + 0x6a => { #JR + Name => 'RedEyeReduction', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 0x9a => { #JR + Name => 'FolderNumber', + Mask => 0x03ff, # (not sure what the upper 6 bits are for) + PrintConv => 'sprintf("%.3d",$val)', + PrintConvInv => '$val', + }, + 0x9b => { #JR + Name => 'ImageNumber', + Mask => 0x3fff, # (not sure what the upper 2 bits are for) + PrintConv => 'sprintf("%.4d",$val)', + PrintConvInv => '$val', + }, +); + +# Camera settings (ref PH) (A230, A290, A330, A380 and A390) +%Image::ExifTool::Sony::CameraSettings2 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int16u', + PRIORITY => 0, + NOTES => 'Camera settings for the A230, A290, A330, A380 and A390.', +### 0x00-0x03: same TagID as CameraSettings + 0x00 => { #JR + Name => 'ExposureTime', + ValueConv => '$val ? 2 ** (6 - $val/8) : 0', + ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x01 => { #JR + Name => 'FNumber', + ValueConv => '2 ** (($val/8 - 1) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', + }, + 0x02 => { #JR (requires external flash) + Name => 'HighSpeedSync', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 0x03 => { #JR + Name => 'ExposureCompensationSet', + ValueConv => '($val - 128) / 24', + ValueConvInv => 'int($val * 24 + 128.5)', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, +### 0x04-0x11: subtract 1 from CameraSettings TagID + 0x04 => { #JR + Name => 'WhiteBalanceSetting', + PrintConv => { + 2 => 'Auto', + 4 => 'Daylight', + 5 => 'Fluorescent', + 6 => 'Tungsten', + 7 => 'Flash', + 16 => 'Cloudy', + 17 => 'Shade', + 18 => 'Color Temperature/Color Filter', + 32 => 'Custom 1', + 33 => 'Custom 2', + 34 => 'Custom 3', + }, + }, + 0x05 => { #JR + Name => 'WhiteBalanceFineTune', + ValueConv => '$val > 128 ? $val - 256 : $val', + ValueConvInv => '$val < 0 ? $val + 256 : $val', + }, + 0x06 => { #JR as set in WB "Color Temperature/Color Filter" and in White Balance Bracketing + Name => 'ColorTemperatureSet', + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + PrintConv => '"$val K"', + PrintConvInv => '$val =~ s/ ?K$//i; $val', + }, + 0x07 => { #JR as set in WB "Color Temperature/Color Filter" + Name => 'ColorCompensationFilterSet', + Notes => 'negative is green, positive is magenta', + ValueConv => '$val > 128 ? $val - 256 : $val', + ValueConvInv => '$val < 0 ? $val + 256 : $val', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x08 => { #JR + Name => 'CustomWB_RGBLevels', + Format => 'int16u[3]', + }, + 0x0b => { #JR as set in WB "Custom" and in White Balance Bracketing + Name => 'ColorTemperatureCustom', + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + PrintConv => '"$val K"', + PrintConvInv => '$val =~ s/ ?K$//i; $val', + }, + 0x0c => { #JR as set in WB "Custom" + Name => 'ColorCompensationFilterCustom', + Notes => 'negative is green, positive is magenta', + ValueConv => '$val > 128 ? $val - 256 : $val', + ValueConvInv => '$val < 0 ? $val + 256 : $val', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x0e => { #JR + Name => 'WhiteBalance', + PrintConv => { + 2 => 'Auto', + 4 => 'Daylight', + 5 => 'Fluorescent', + 6 => 'Tungsten', + 7 => 'Flash', + 12 => 'Color Temperature', + 13 => 'Color Filter', + 14 => 'Custom', + 16 => 'Cloudy', + 17 => 'Shade', + }, + }, + 0x0f => { #JR/PH (educated guess) + Name => 'FocusModeSetting', + PrintConv => { + 0 => 'Manual', + 1 => 'AF-S', + 2 => 'AF-C', + 3 => 'AF-A', + # seen 5 for A380 (FocusMode was Manual and FocusStatus was Confirmed) + }, + }, + 0x10 => { #JR/PH (educated guess) + Name => 'AFAreaMode', + PrintConv => { + 0 => 'Wide', + 1 => 'Local', + 2 => 'Spot', + }, + }, + 0x11 => { #JR/PH (educated guess) + Name => 'AFPointSetting', + Format => 'int16u', + # The AF point as selected by the user in AFAreaMode=Local or Spot; + # Reported value remains at the last-set position in AFAreaModes=Wide. + # (all of these cameras have a 9-point centre-cross AF system, ref JR) + PrintConvColumns => 2, + PrintConv => { + 1 => 'Center', + 2 => 'Top', + 3 => 'Upper-right', + 4 => 'Right', + 5 => 'Lower-right', + 6 => 'Bottom', + 7 => 'Lower-left', + 8 => 'Left', + 9 => 'Upper-left', + }, + }, +### 0x12-0x18: subtract 2 from CameraSettings TagID + 0x12 => { #JR + Name => 'FlashExposureCompSet', + Description => 'Flash Exposure Comp. Setting', + # (as pre-selected by the user, not zero if flash didn't fire) + ValueConv => '($val - 128) / 24', #PH + ValueConvInv => 'int($val * 24 + 128.5)', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x13 => { + Name => 'MeteringMode', + PrintConv => { + 1 => 'Multi-segment', + 2 => 'Center-weighted average', + 4 => 'Spot', + }, + }, + 0x14 => { # A330/A380 + Name => 'ISOSetting', + # 0 indicates 'Auto' (?) + ValueConv => '$val ? exp(($val/8-6)*log(2))*100 : $val', + ValueConvInv => '$val ? 8*(log($val/100)/log(2)+6) : $val', + PrintConv => '$val ? sprintf("%.0f",$val) : "Auto"', + PrintConvInv => '$val =~ /auto/i ? 0 : $val', + }, + 0x16 => { + Name => 'DynamicRangeOptimizerMode', + PrintConv => { + 0 => 'Off', + 1 => 'Standard', + 2 => 'Advanced Auto', + 3 => 'Advanced Level', + }, + }, + 0x17 => 'DynamicRangeOptimizerLevel', + 0x18 => { # A380 + Name => 'CreativeStyle', + PrintConvColumns => 2, + PrintConv => { + 1 => 'Standard', + 2 => 'Vivid', + 3 => 'Portrait', + 4 => 'Landscape', + 5 => 'Sunset', + 6 => 'Night View/Portrait', + 8 => 'B&W', + # (these models don't have Neutral - PH) + }, + }, +### 0x19-0x1b: subtract 3 from CameraSettings TagID + 0x19 => { + Name => 'Sharpness', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x1a => { + Name => 'Contrast', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x1b => { + Name => 'Saturation', + ValueConv => '$val - 10', + ValueConvInv => '$val + 10', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, +### 0x1c-0x24: subtract 4 from CameraSettings TagID (not sure about 0x1c) + 0x1f => { #PH (educated guess) + Name => 'FlashControl', + PrintConv => { + 0 => 'ADI', + 1 => 'Pre-flash TTL', + 2 => 'Manual', + }, + }, +### 0x25-0x27: subtract 6 from CameraSettings TagID + 0x25 => { #PH + Name => 'LongExposureNoiseReduction', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x26 => { #PH + Name => 'HighISONoiseReduction', + # (Note: the order is different from that in CameraSettings) + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Normal', + 3 => 'High', + }, + }, + 0x27 => { #PH + Name => 'ImageStyle', + PrintConvColumns => 2, + PrintConv => { + 1 => 'Standard', + 2 => 'Vivid', + 3 => 'Portrait', #PH + 4 => 'Landscape', #PH + 5 => 'Sunset', #PH + 7 => 'Night View/Portrait', #PH (A200 when CreativeStyle was 6!) + 8 => 'B&W', #PH (A380) + # (these models don't have Neutral - PH) + }, + }, +### 0x28-0x3b: subtract 7 from CameraSettings TagID + 0x28 => { #PH + Name => 'ShutterSpeedSetting', + Notes => 'used in M, S and Program Shift S modes', + ValueConv => '$val ? 2 ** (6 - $val/8) : 0', + ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x29 => { #PH + Name => 'ApertureSetting', + Notes => 'used in M, A and Program Shift A modes', + ValueConv => '2 ** (($val/8 - 1) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', + }, +### 0x3c-0x59: same TagID as CameraSettings + 0x3c => { + Name => 'ExposureProgram', + SeparateTable => 'ExposureProgram', + PrintConv => \%sonyExposureProgram, + }, + 0x3d => { # (copied from CameraSettings, ref JR) + Name => 'ImageStabilizationSetting', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x3e => { #JR + Name => 'FlashAction', + PrintConv => { + 0 => 'Did not fire', + 1 => 'Fired', + 2 => 'External Flash, Did not fire', + 3 => 'External Flash, Fired', + }, + }, + 0x3f => { # (verified for A330/A380) + Name => 'Rotation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', #(NC) + 2 => 'Rotate 270 CW', + }, + }, + 0x40 => { #JR + Name => 'AELock', + PrintConv => { + 1 => 'Off', + 2 => 'On', + }, + }, + 0x4c => { #JR + Name => 'FlashAction2', + PrintConv => { + 1 => 'Fired, Autoflash', + 2 => 'Fired, Fill-flash', + 3 => 'Fired, Rear Sync', + 4 => 'Fired, Wireless', + 5 => 'Did not fire', + 6 => 'Fired, Slow Sync', + 17 => 'Fired, Autoflash, Red-eye reduction', + 18 => 'Fired, Fill-flash, Red-eye reduction', + 34 => 'Fired, Fill-flash, HSS', + }, + }, + 0x4d => { #JR + Name => 'FocusMode', # (focus mode actually used) + PrintConv => { + 0 => 'Manual', + 1 => 'AF-S', + 2 => 'AF-C', + 3 => 'AF-A', + }, + }, + 0x53 => { #JR (copied from CameraSettings, but all bits may not be applicable for these models) + Name => 'FocusStatus', + PrintConv => { + 0 => 'Not confirmed', + 4 => 'Not confirmed, Tracking', + BITMASK => { + 0 => 'Confirmed', + 1 => 'Failed', + 2 => 'Tracking', + }, + }, + }, + 0x54 => { + Name => 'SonyImageSize', + PrintConv => { + 1 => 'Large', + 2 => 'Medium', + 3 => 'Small', + }, + }, + 0x55 => { # (copied from CameraSettings, ref JR) + Name => 'AspectRatio', + PrintConv => { + 1 => '3:2', + 2 => '16:9', + }, + }, + 0x56 => { # (copied from CameraSettings, ref JR) + Name => 'Quality', + PrintConv => { + 0 => 'RAW', + 2 => 'CRAW', + 34 => 'RAW + JPEG', + 35 => 'CRAW + JPEG', + 16 => 'Extra Fine', + 32 => 'Fine', + 48 => 'Standard', + }, + }, + 0x58 => { # (copied from CameraSettings, ref JR) + Name => 'ExposureLevelIncrements', + PrintConv => { + 33 => '1/3 EV', + 50 => '1/2 EV', + }, + }, +### 0x5a onwards: subtract 1 from CameraSettings TagID + # (0x69 not confirmed) + #0x69 => { #JR + # Name => 'RedEyeReduction', + # PrintConv => { + # 0 => 'Off', + # 1 => 'On', + # }, + #}, + 0x7e => { #JR + Name => 'DriveMode', + Mask => 0xff, # (not sure what upper byte is for) + PrintConv => { # (values confirmed for specified models - PH) + 1 => 'Single Frame', # (A230,A330,A380) + 2 => 'Continuous High', #PH (A230,A330) + 4 => 'Self-timer 10 sec', # (A230) + 5 => 'Self-timer 2 sec, Mirror Lock-up', # (A230,A290,A330,A380,390) + 7 => 'Continuous Bracketing', # (A230 val=0x1107, A330 val=0x1307 [0.7 EV]) + 10 => 'Remote Commander', # (A230) + 11 => 'Continuous Self-timer', # (A230 val=0x800b [5 shots], A330 val=0x400b [3 shots]) + }, + }, + 0x7f => { #JR + Name => 'FlashMode', + PrintConv => { + 0 => 'Autoflash', + 2 => 'Rear Sync', + 3 => 'Wireless', + 4 => 'Fill-flash', + 5 => 'Flash Off', + 6 => 'Slow Sync', + }, + }, + 0x83 => { #PH + Name => 'ColorSpace', + PrintConv => { + 5 => 'Adobe RGB', + 6 => 'sRGB', + }, + }, +); + +# more Camera settings (ref PH) +# This was decoded for the A55, but it seems to apply to the following models: +# A33, A35, A55, A450, A500, A550, A560, A580, NEX-3, NEX-5, NEX-C3 and NEX-VG10E +%Image::ExifTool::Sony::CameraSettings3 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int8u', + PRIORITY => 0, + DATAMEMBER => [ 0x99 ], + NOTES => q{ + Camera settings for models such as the A33, A35, A55, A450, A500, A550, + A560, A580, NEX-3, NEX-5, NEX-C3 and NEX-VG10E. + }, + 0x00 => { #JR + Name => 'ShutterSpeedSetting', + Notes => 'used only in M and S exposure modes', + ValueConv => '$val ? 2 ** (6 - $val/8) : 0', + ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x01 => { #JR + Name => 'ApertureSetting', + Notes => 'used only in M and A exposure modes', + ValueConv => '2 ** (($val/8 - 1) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', + }, + 0x02 => { + Name => 'ISOSetting', + ValueConv => '($val and $val < 254) ? exp(($val/8-6)*log(2))*100 : $val', + ValueConvInv => '($val and $val != 254) ? 8*(log($val/100)/log(2)+6) : $val', + PrintConv => { + OTHER => sub { + my ($val, $inv) = @_; + return int($val + 0.5) unless $inv; + return Image::ExifTool::IsFloat($val) ? $val : undef; + }, + 0 => 'Auto', + 254 => 'n/a', # get this for multi-shot noise reduction + }, + }, + 0x03 => { #JR + Name => 'ExposureCompensationSet', + ValueConv => '($val - 128) / 24', #PH + ValueConvInv => 'int($val * 24 + 128.5)', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x04 => { #JR + Name => 'DriveModeSetting', + # Same drivemode info is repeated in 0x0034, but with at least the following exceptions: + # - 0x0034 not for A550 ? - seen "0" + # - hand-held night (0x05=56): 0x0004=0x10 and 0x0034=0xd3 + # - 3D sweep panorama (0x05=57): 0x0004=0x10 and 0x0034=0xd6 + # - sweep panorama (0x05=80): 0x0004=0x10 and 0x0034=0xd5 + # preliminary conclusion: 0x0004 is Drivemode as pre-set, but may be overruled by Scene/Panorama mode selections + # 0x0034 is Divemode as actually used + PrintHex => 1, + PrintConv => { + 0x10 => 'Single Frame', + 0x21 => 'Continuous High', # also automatically selected for Scene mode Sports-action (0x05=52) + 0x22 => 'Continuous Low', + 0x30 => 'Speed Priority Continuous', + 0x51 => 'Self-timer 10 sec', + 0x52 => 'Self-timer 2 sec, Mirror Lock-up', + 0x71 => 'Continuous Bracketing 0.3 EV', + 0x75 => 'Continuous Bracketing 0.7 EV', + 0x91 => 'White Balance Bracketing Low', + 0x92 => 'White Balance Bracketing High', + 0xc0 => 'Remote Commander', + }, + }, + 0x05 => { #JR + Name => 'ExposureProgram', + # Camera exposure program/mode as selected with the Mode dial. + # For SCN a further selection is done via the menu + # Matches OK with 0xb023 + SeparateTable => 'ExposureProgram2', + PrintConv => \%sonyExposureProgram2, + }, + 0x06 => { #JR + Name => 'FocusModeSetting', + PrintConv => { + 17 => 'AF-S', + 18 => 'AF-C', + 19 => 'AF-A', + 32 => 'Manual', + 48 => 'DMF', #(NC) (seen for NEX-5) + }, + }, + 0x07 => { #JR + Name => 'MeteringMode', + PrintConv => { + 1 => 'Multi-segment', + 2 => 'Center-weighted average', + 3 => 'Spot', + }, + }, + 0x09 => { #JR + Name => 'SonyImageSize', + PrintConv => { # values confirmed as noted for the A580 and A33 + 21 => 'Large (3:2)', # A580: 16M (4912x3264), A33: 14M (4592x3056) + 22 => 'Medium (3:2)', # A580: 8.4M (3568x2368), A33: 7.4M (3344x2224) + 23 => 'Small (3:2)', # A580: 4.0M (2448x1624), A33: 3.5M (2288x1520) + 25 => 'Large (16:9)', # A580: 14M (4912x2760) + 26 => 'Medium (16:9)', # A580: 7.1M (3568x2000) + 27 => 'Small (16:9)', # A580: 3.4M (2448x1376) + }, + }, + 0x0a => { #JR + Name => 'AspectRatio', + # normally 4 for A580 3:2 ratio images + # seen 8 when selecting 16:9 via menu, and when selecting Panorama mode + PrintConv => { + 4 => '3:2', + 8 => '16:9', + }, + }, + 0x0b => { #JR + Name => 'Quality', + PrintConv => { + 2 => 'RAW', + 4 => 'RAW + JPEG', + 6 => 'Fine', + 7 => 'Standard', + }, + }, + 0x0c => { + Name => 'DynamicRangeOptimizerSetting', + PrintConv => { + 1 => 'Off', + 16 => 'On (Auto)', + 17 => 'On (Manual)', + }, + }, + 0x0d => 'DynamicRangeOptimizerLevel', + 0x0e => { #JR + Name => 'ColorSpace', + PrintConv => { + 1 => 'sRGB', + 2 => 'Adobe RGB', + }, + }, + 0x0f => { #JR + Name => 'CreativeStyleSetting', + PrintConvColumns => 2, + PrintConv => { + 16 => 'Standard', + 32 => 'Vivid', + 64 => 'Portrait', + 80 => 'Landscape', + 96 => 'B&W', + 160 => 'Sunset', + }, + }, + 0x10 => { #JR (seen values 253, 254, 255, 0, 1, 2, 3) + Name => 'ContrastSetting', + Format => 'int8s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x11 => { #JR + Name => 'SaturationSetting', + Format => 'int8s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x12 => { #JR + Name => 'SharpnessSetting', + Format => 'int8s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x16 => { #JR + Name => 'WhiteBalanceSetting', + # many guessed, based on "logical system" as observed for Daylight and Shade and steps of 16 between the modes + PrintHex => 1, + PrintConvColumns => 2, + PrintConv => \%whiteBalanceSetting, + SeparateTable => 1, + }, + 0x17 => { #JR + Name => 'ColorTemperatureSetting', + # matches "0xb021 ColorTemperature" when WB set to "Custom" or "Color Temperature/Color Filter" + ValueConv => '$val * 100', + ValueConvInv => '$val / 100', + PrintConv => '"$val K"', + PrintConvInv => '$val =~ s/ ?K$//i; $val', + }, + 0x18 => { #JR + Name => 'ColorCompensationFilterSet', + # seen 0, 1-9 and 245-255, corresponding to 0, M1-M9 and G9-G1 on camera display + # matches "0xb022 ColorCompensationFilter" when WB set to "Custom" or "Color Temperature/Color Filter" + Format => 'int8s', + Notes => 'negative is green, positive is magenta', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x19 => { #JR + Name => 'CustomWB_RGBLevels', + Format => 'int16uRev[3]', + # 0x19 - 0x1e are related to Custom WB measurements performed by the camera. + # The values change only each time when measuring and setting a new Custom WB. + # (0x19,0x1a) and (0x1d,0x1e) are same as MoreSettings (0x1a,0x1b) and (0x1c,0x1d) + }, + # 0x1f - always 2 (ref JR) + 0x20 => { #JR + Name => 'FlashMode', + PrintConvColumns => 2, + PrintConv => { + 1 => 'Flash Off', + 16 => 'Autoflash', + 17 => 'Fill-flash', + 18 => 'Slow Sync', + 19 => 'Rear Sync', + 20 => 'Wireless', + }, + }, + 0x21 => { #JR + Name => 'FlashControl', + PrintConv => { + 1 => 'ADI Flash', + 2 => 'Pre-flash TTL', + }, + }, + 0x23 => { #JR + Name => 'FlashExposureCompSet', + Description => 'Flash Exposure Comp. Setting', + # (as pre-selected by the user, not zero if flash didn't fire) + ValueConv => '($val - 128) / 24', #PH + ValueConvInv => 'int($val * 24 + 128.5)', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x24 => { + Name => 'AFAreaMode', + PrintConv => { + 1 => 'Wide', + 2 => 'Spot', + 3 => 'Local', + 4 => 'Flexible', #JR + # (Flexible Spot is a grid of 17x11 points for the NEX-5) + }, + }, + 0x25 => { #JR + Name => 'LongExposureNoiseReduction', + PrintConv => { + 1 => 'Off', + 16 => 'On', # (unused or dark subject) + }, + }, + 0x26 => { #JR + Name => 'HighISONoiseReduction', + PrintConv => { + 16 => 'Low', + 17 => 'High', + 19 => 'Auto', + }, + }, + 0x27 => { #JR + Name => 'SmileShutterMode', + PrintConv => { + 17 => 'Slight Smile', + 18 => 'Normal Smile', + 19 => 'Big Smile', + }, + }, + 0x28 => { #JR + Name => 'RedEyeReduction', + PrintConv => { + 1 => 'Off', + 16 => 'On', + }, + }, + 0x2d => { + Name => 'HDRSetting', + PrintConv => { + 1 => 'Off', + 16 => 'On (Auto)', + 17 => 'On (Manual)', + }, + }, + 0x2e => { + Name => 'HDRLevel', + PrintConvColumns => 3, + PrintConv => { + 33 => '1 EV', + 34 => '1.5 EV', #JR (NC) + 35 => '2 EV', + 36 => '2.5 EV', #JR (NC) + 37 => '3 EV', + 38 => '3.5 EV', #PH (NC) + 39 => '4 EV', + 40 => '5 EV', + 41 => '6 EV', + }, + }, + 0x2f => { #JR (not sure what is difference with 0x85) + Name => 'ViewingMode', + PrintConv => { + 16 => 'ViewFinder', + 33 => 'Focus Check Live View', + 34 => 'Quick AF Live View', + }, + }, + 0x30 => { #JR + Name => 'FaceDetection', + PrintConv => { + 1 => 'Off', + 16 => 'On', + }, + }, + 0x31 => { #JR + Name => 'SmileShutter', + PrintConv => { + 1 => 'Off', + 16 => 'On', + }, + }, + 0x32 => { #JR + Name => 'SweepPanoramaSize', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + PrintConv => { + 1 => 'Standard', + 2 => 'Wide', + }, + }, + 0x33 => { #JR + Name => 'SweepPanoramaDirection', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + PrintConv => { + 1 => 'Right', + 2 => 'Left', + 3 => 'Up', + 4 => 'Down', + }, + }, + 0x34 => { #JR + Name => 'DriveMode', # (drive mode actually used) + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + PrintHex => 1, + PrintConv => { + 0x10 => 'Single Frame', + 0x21 => 'Continuous High', # also automatically selected for Scene mode Sports-action (0x05=52) + 0x22 => 'Continuous Low', + 0x30 => 'Speed Priority Continuous', + 0x51 => 'Self-timer 10 sec', + 0x52 => 'Self-timer 2 sec, Mirror Lock-up', + 0x71 => 'Continuous Bracketing 0.3 EV', + 0x75 => 'Continuous Bracketing 0.7 EV', + 0x91 => 'White Balance Bracketing Low', + 0x92 => 'White Balance Bracketing High', + 0xc0 => 'Remote Commander', + 0xd1 => 'Continuous - HDR', + 0xd2 => 'Continuous - Multi Frame NR', + 0xd3 => 'Continuous - Handheld Night Shot', # (also called "Hand-held Twilight") + 0xd4 => 'Continuous - Anti Motion Blur', #PH (NEX-5) + 0xd5 => 'Continuous - Sweep Panorama', + 0xd6 => 'Continuous - 3D Sweep Panorama', + }, + }, + 0x35 => { + Name => 'MultiFrameNoiseReduction', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + PrintConv => { + 0 => 'n/a', # seen for A450/A500/A550 + 1 => 'Off', + 16 => 'On', + 255 => 'None', # seen for NEX-3/5/C3 + }, + }, + 0x36 => { #JR (not 100% sure about this one) + Name => 'LiveViewAFSetting', + Condition => '$$self{Model} !~ /^(NEX-|DSLR-(A450|A500|A550)$)/', + PrintConv => { + 0 => 'n/a', + 1 => 'Phase-detect AF', + 2 => 'Contrast AF', + # Contrast AF is only available with SSM/SAM lenses and in Focus Check LV, + # NOT in Quick AF LV, and is automatically set when mounting SSM/SAM lens + # - changes into Phase-AF when switching to Quick AF LV. + }, + }, + 0x38 => { #JR + Name => 'PanoramaSize3D', + Description => '3D Panorama Size', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + PrintConv => { + 0 => 'n/a', + 1 => 'Standard', + 2 => 'Wide', + 3 => '16:9', + }, + }, + 0x83 => { #JR + Name => 'AFButtonPressed', + # only indicates pressing and holding the "AF" button (centre-controller), + # not pressing the shutter release button halfway down + Condition => '$$self{Model} !~ /^(NEX-|DSLR-(A450|A500|A550)$)/', + PrintConv => { + 1 => 'No', + 16 => 'Yes', + }, + }, + 0x84 => { #JR (not 100% sure about this one) + Name => 'LiveViewMetering', + Condition => '$$self{Model} !~ /^(NEX-|DSLR-(A450|A500|A550)$)/', + PrintConv => { + 0 => 'n/a', + 16 => '40 Segment', # DSLR with LiveView/OVF switch in OVF position + 32 => '1200-zone Evaluative', # SLT, or DSLR with LiveView/OVF switch in LiveView position + }, + }, + 0x85 => { #JR (not sure what is difference with 0x2f) + Name => 'ViewingMode2', + Condition => '$$self{Model} !~ /^(NEX-|DSLR-(A450|A500|A550)$)/', + PrintConv => { + 0 => 'n/a', + 16 => 'Viewfinder', + 33 => 'Focus Check Live View', + 34 => 'Quick AF Live View', + }, + }, + 0x86 => { #JR + Name => 'AELock', + Condition => '$$self{Model} !~ /^(NEX-|DSLR-(A450|A500|A550)$)/', + PrintConv => { + 1 => 'On', + 2 => 'Off', + }, + }, + 0x87 => { #JR + Name => 'FlashStatusBuilt-in', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)/', + PrintConv => { + 1 => 'Off', + 2 => 'On', + }, + }, + 0x88 => { #JR + Name => 'FlashStatusExternal', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)/', + PrintConv => { + 1 => 'None', + 2 => 'Off', + 3 => 'On', + }, + }, +# 0x8a => { #JR +# Name => 'LensAF', +# Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', +# PrintConv => { +# 1 => 'No', +# 16 => 'AF Lens', +# }, +# }, + 0x8b => { #JR + Name => 'LiveViewFocusMode', + Condition => '$$self{Model} !~ /^(NEX-|DSLR-(A450|A500|A550)$)/', + PrintConv => { + 0 => 'n/a', + 1 => 'AF', + 16 => 'Manual', + }, + }, +# 0x8e => { #JR +# Name => 'LensSAM', +# Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', +# PrintConv => { +# 1 => 'No', +# 16 => 'SAM Lens', +# }, +# }, + 0x99 => { #JR + Name => 'LensMount', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + DataMember => 'LensMount', + RawConv => '$$self{LensMount} = $val', + PrintConv => { + 1 => 'Unknown', + 16 => 'A-mount', + 17 => 'E-mount', + }, + }, +# 0x9b => { #JR +# Name => 'LensOSS', +# Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', +# PrintConv => { +# 1 => 'No', +# 16 => 'OSS Lens', +# 17 => 'OSS Lens (NEX-VG)', # active ? +# }, +# }, + # 0x9c - 1; 2 for multi-shot modes + 0x10c => { #JR + Name => 'SequenceNumber', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', # seen 18 for A550, so better exclude ? + # normally 0; seen 1,2,3 for bracketing, 6 for Handheld Night Shot, 3 for HDR, 6 for MFNR + PrintConv => { + 0 => 'Single', + 255 => 'n/a', + OTHER => sub { shift }, # pass all other numbers straight through + }, + }, + # when reading 0x0114 - 0x0117 as int32u: + # - upper 8 bits (0x0117): always value 4, meaning unknown + # - next 10 bits: FolderNumber (max. 999 according to manual) + # - last 14 bits: ImageNumber (max 9999) + 0x0114 => { #JR + Name => 'FolderNumber', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + Format => 'int32u', + Mask => 0x00ffc000, + PrintConv => 'sprintf("%.3d",$val)', + PrintConvInv => '$val', + }, + 276.1 => { #JR (0x0114.1) + Name => 'ImageNumber', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + Format => 'int32u', + Mask => 0x00003fff, + PrintConv => 'sprintf("%.4d",$val)', + PrintConvInv => '$val', + }, + 0x200 => { #JR + Name => 'ShotNumberSincePowerUp2', + Notes => q{ + same as ShotNumberSincePowerUp for single-shot images, but includes all + shots of the current image in multi-shot modes like HDR, panorama, and + multi-frame noise reduction + }, + # (includes all shutter actuations of the current shot) + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + Format => 'int32u', + }, + 0x283 => { #JR + Name => 'AFButtonPressed', + # only indicates pressing and holding the "AF" button (centre-controller), + # not pressing the shutter release button halfway down + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', + PrintConv => { + 1 => 'No', + 16 => 'Yes', + }, + }, + 0x284 => { #JR (not 100% sure about this one) + Name => 'LiveViewMetering', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', + PrintConv => { + 0 => 'n/a', + 16 => '40 Segment', # DSLR with LiveView/OVF switch in OVF position + 32 => '1200-zone Evaluative', # DSLR with LiveView/OVF switch in LiveView position + }, + }, + 0x285 => { #JR (not sure what is difference with 0x2f) + Name => 'ViewingMode2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', + PrintConv => { + 0 => 'n/a', + 16 => 'Viewfinder', + 33 => 'Focus Check Live View', + 34 => 'Quick AF Live View', + }, + }, + 0x286 => { #JR + Name => 'AELock', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', + PrintConv => { + 1 => 'On', + 2 => 'Off', + }, + }, + 0x287 => { #JR + Name => 'FlashStatusBuilt-in', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', + Notes => 'A450, A500 and A550', + PrintConv => { + 1 => 'Off', + 2 => 'On', + }, + }, + 0x288 => { #JR + Name => 'FlashStatusExternal', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', + Notes => 'A450, A500 and A550', + PrintConv => { + 1 => 'None', + 2 => 'Off', + 3 => 'On', + }, + }, + 0x28b => { #JR + Name => 'LiveViewFocusMode', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', + PrintConv => { + 0 => 'n/a', + 1 => 'AF', + 16 => 'Manual', + }, + }, + 0x30c => { #JR + Name => 'SequenceNumber', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', + Notes => 'A450, A500 and A550', + # normally 0; seen 2 for HDR + PrintConv => { + 0 => 'Single', + 255 => 'n/a', + OTHER => sub { shift }, # pass all other numbers straight through + }, + }, + 0x314 => { #JR + Name => 'ImageNumber', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', + Format => 'int16u', + Notes => 'A450, A500 and A550', + Mask => 0x3fff, #PH (not sure what the upper 2 bits are for) + PrintConv => 'sprintf("%.4d",$val)', + PrintConvInv => '$val', + }, + 0x316 => { #JR + Name => 'FolderNumber', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', + Notes => 'A450, A500 and A550', + Format => 'int16u', + Mask => 0x03ff, #(NC) + PrintConv => 'sprintf("%.3d",$val)', + PrintConvInv => '$val', + }, + 0x03f0 => { + Name => 'LensE-mountVersion', + Format => 'int16u', + Condition => '($$self{Model} =~ /^NEX-/)', + PrintConv => 'sprintf("%x.%.2x",$val>>8,$val&0xff)', + PrintConvInv => 'my @a=split(/\./,$val);(hex($a[0])<<8)|hex($a[1])', + }, + # 0x03f3 - this is probably LensFirmwareVersion and not CameraE-MountVersion (ref JR, Sept.2015) + # 0x03f3 and 0x03f4 change together and behave similarly to Tag940c 0x0014 and 0x0015 - see comments there. + 0x03f3 => { + Name => 'LensFirmwareVersion', + Format => 'int16u', + Condition => '($$self{Model} =~ /^NEX-/)', + PrintConv => 'sprintf("Ver.%.2x.%.3d",$val>>8,$val&0xff)', + }, + 0x3f7 => { #JR + Name => 'LensType2', + Condition => '($$self{Model} =~ /^NEX-/) and ($$self{LensMount} != 1)', + Format => 'int16u', + SeparateTable => 'LensType2', + PrintConv => \%sonyLensTypes2, + }, + 0x400 => { #JR + Name => 'ImageNumber', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', + Format => 'int16u', + Notes => 'A450, A500 and A550', + Mask => 0x3fff, #PH (not sure what the upper 2 bits are for) + PrintConv => 'sprintf("%.4d",$val)', + PrintConvInv => '$val', + }, + 0x402 => { #JR + Name => 'FolderNumber', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', + Format => 'int16u', + Mask => 0x03ff, #(NC) + Notes => 'A450, A500 and A550', + PrintConv => 'sprintf("%.3d",$val)', + PrintConvInv => '$val', + }, +); + +# Camera settings for other models +%Image::ExifTool::Sony::CameraSettingsUnknown = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int16u', +); + +# extra hardware information (ref JR) +%Image::ExifTool::Sony::ExtraInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Extra hardware information for the A850 and A900.', + # 0x0000: seen values 5 or 6 + 0x0001 => { + Name => 'BatteryTemperature', + # seen values of appr. 55 - 115: looks like temperature Fahrenheit + # changing battery in cold weather: new battery starts with value 53 + ValueConv => '($val - 32) / 1.8', # convert to Celsius + ValueConvInv => '$val * 1.8 + 32', + PrintConv => 'sprintf("%.1f C",$val)', + PrintConvInv => '$val=~ s/\s*C//; $val', + # (may be invalid for non-OEM batteries) + }, + 0x0002 => { + Name => 'BatteryUnknown', + # appears to be an int16u value together with 0x0005 (values similar to ExtraInfo3 0x0000) + # seen values of appr. 800 at 23 deg C to 630 at 40 deg C for A850 with NP-FM500H battery (7.2 V nominal) + # i.e. inversely proportional to BatteryTemperature: can not be BatteryVoltage, must be something else ? + Unknown => 1, + Format => 'undef[4]', + ValueConv => sub { + my $val = shift;; + my @a = unpack("CvC",pack('v*', unpack('n*', $val))); + return $a[1]; + }, + }, + # 0x0003: seen 0 or 16 + # 0x0004: always 255 + # 0x0006: int16u value together with 0x0009: same behaviour and almost same values as 0x0002 + # 0x0007: always 3 + 0x0008 => { + Name => 'BatteryVoltage', + # 0x0008: int16u value together with 0x000b: + # values follow BatteryLevel: from appr.900 when battery full, to appr. 775 when empty. + # with factor 118 they range from appr. 7.6 to 6.6 - looks like battery voltage (nominal 7.2 V) + Unknown => 1, + Format => 'undef[4]', + ValueConv => sub { + my $val = shift;; + my @a = unpack("CvC",pack('v*', unpack('n*', $val))); + return $a[1]/118; + }, + PrintConv => 'sprintf("%.2f V",$val)', + }, + 0x000a => { + # seen mostly 213 and 246, corresponding with other ImageStabilization On/Off tags. + Name => 'ImageStabilization2', + Unknown => 1, # (because the decoding is funny and possibly incomplete - PH) + PrintConv => { + 191 => 'On (191)', # seen a few times with moving subject, continuous drive, bracketing + 207 => 'On (207)', # seen once with RemoteCommander + 210 => 'On (210)', # seen a few times with continuous drive + 213 => 'On', + 246 => 'Off', + }, + }, + # 0x000c: seen always decreasing values, from max. 107 to min. 0, + # then jump back to high value: correlates with battery change/recharging + # Seen once 255 immediately after inserting new battery, next frame OK at 106. + # Validation: matches exactly with batterylevel display on camera (all 100+ values displayed as 100%) + 0x000c => { + Name => 'BatteryLevel', + PrintConv => '"$val%"', + PrintConvInv => '$val=~s/\s*\%//; $val', + }, + # 0x000d: always 2 + # 0x000e: always 204 + # 0x000f: always 0 + # 0x0010-0x0019: always 204 + 0x001a => { + Name => 'ExtraInfoVersion', + Format => 'int8u[4]', + PrintConv => '$val=~tr/ /./; $val', + PrintConvInv => '$val=~tr/./ /; $val', + # always 0 1 0 1 for 0x0131 Software = DSLR-A850 v1.00 + # always 0 2 0 4 for 0x0131 Software = DSLR-A850 v2.00 + # seen 0 2 0 0 for 0x0131 Software = DSLR-A900 v1.00 + # seen 0 4 0 0 for 0x0131 Software = DSLR-A900 v1.00 + # seen 0 5 0 4 for 0x0131 Software = DSLR-A900 v2.00 + # A850: correlates exactly with Firmware versions. + # A900: have there been different FW 1.0 versions ? + }, +); + +# extra hardware information (ref JR) +%Image::ExifTool::Sony::ExtraInfo2 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'Extra hardware information for the A230/290/330/380/390.', + 0x0004 => { + Name => 'BatteryLevel', + PrintConv => '"$val%"', + PrintConvInv => '$val=~s/\s*\%//; $val', + }, + 0x0012 => { + Name => 'ImageStabilization', + PrintConv => { + 0 => 'Off', + 64 => 'On', + }, + }, +); + +# extra hardware information (ref JR) +%Image::ExifTool::Sony::ExtraInfo3 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + Extra hardware information for the A33, A35, A55, A450, A500, A550, A560, + A580 and NEX-3/5/C3/VG10. + }, + 0x0000 => { + Name => 'BatteryUnknown', + # seen values of appr. 870 at 10 deg C to 650 at 39 deg C for A580 with NP-FM500H battery (7.2 V nominal) + # i.e. inversely proportional to BatteryTemperature: can not be BatteryVoltage, must be something else ? + Unknown => 1, + Format => 'int16u', + }, + 0x0002 => { + Name => 'BatteryTemperature', + ValueConv => '($val - 32) / 1.8', # convert to Celsius + ValueConvInv => '$val * 1.8 + 32', + PrintConv => 'sprintf("%.1f C",$val)', + PrintConvInv => '$val=~ s/\s*C//; $val', + }, + 0x0004 => { + Name => 'BatteryLevel', + PrintConv => '"$val%"', + PrintConvInv => '$val=~s/\s*\%//; $val', + }, + # 0x0005: always 255 + # from here on the differences between DSLR, SLT and NEX + # 0x0006 and 0x0008: + # values follow BatteryLevel: start high (970, 940) when battery full, + # and decrease with decreasing battery level to (850, 815) + # with factor 128 they range from (7.6, 7.3) to (6.6, 6.4) - looks like battery voltage (nominal 7.2 V) + 0x0006 => { + Name => 'BatteryVoltage1', + Format => 'int16u', + Condition => '$$self{Model} !~ /^(NEX-(3|5|5C|C3|VG10|VG10E))\b/', + ValueConv => '$val / 128', + ValueConvInv => '$val * 128', + PrintConv => 'sprintf("%.2f V",$val)', + PrintConvInv => '$val=~s/\s*V//; $val', + }, + 0x0008 => { + Name => 'BatteryVoltage2', + Format => 'int16u', + Condition => '$$self{Model} !~ /^(NEX-(3|5|5C|C3|VG10|VG10E))\b/', + ValueConv => '$val / 128', + ValueConvInv => '$val * 128', + PrintConv => 'sprintf("%.2f V",$val)', + PrintConvInv => '$val=~s/\s*V//; $val', + }, + # 0x000a - 0x000f: 3 int16u values: probably some mode or status info: + # seen various 3-number-sequences for SLT and DSLR, but meaning unknown + # 0x000a => { + # Name => 'ExtraInfo_000a', + # Format => 'int16u[3]', + # Condition => '$$self{Model} !~ /^(NEX-(3|5|5C|C3|VG10|VG10E))\b/', + # }, + # 0x0010 seen: + # 176 for SLT + # 204 for NEX + # 240 for DSLR + 0x0011 => { + Name => 'ImageStabilization', + Condition => '$$self{Model} !~ /^(NEX-(3|5|5C|C3|VG10|VG10E))\b/', + # usually matches 0xb026 ImageStabilization, except some images with SelfTimer and on tripod + PrintConv => { + 0 => 'Off', + 64 => 'On', + }, + }, + 0x0014 => [ + { + Name => 'BatteryState', + Condition => '$$self{Model} =~ /^SLT-/', + # possibly relates to "simple" batterylevel indication with battery-icon, but not completely sure + Notes => 'BatteryState for SLT models', + PrintConv => { + 1 => 'Empty', + 2 => 'Low', + 3 => 'Half full', + 4 => 'Almost full', + 5 => 'Full', + }, + },{ + Name => 'ExposureProgram', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)\b/', + Notes => 'ExposureProgram for the A450, A500 and A550', + Priority => 0, # (some unknown values) + PrintConv => { + 241 => 'Landscape', + 243 => 'Aperture-priority AE', + 245 => 'Portrait', + 246 => 'Auto', + 247 => 'Program AE', + 249 => 'Macro', + 252 => 'Sunset', + 253 => 'Sports', #PH (A550) + 255 => 'Manual', + # missing: Shutter speed priority AE, No Flash, Night View + }, + },{ + Name => 'ModeDialPosition', + Condition => '$$self{Model} =~ /^DSLR-/', + Notes => 'ModeDialPosition for other DSLR models', + # (decoded from A560/A580) + PrintConv => { + 248 => 'No Flash', + 249 => 'Aperture-priority AE', + 250 => 'SCN', # <-- the reason we don't call it ExposureProgram for these models + 251 => 'Shutter speed priority AE', + 252 => 'Auto', + 253 => 'Program AE', + 254 => 'Panorama', + 255 => 'Manual', + }, + }, + ], + # 0x0015: DSLR: appears to be a bitmask relating to "switch" positions: + # bit 0 ( 1) only seen OFF for A580 + # bit 1 ( 2) ON = Flash down, OFF = Flash raised + # bit 2 ( 4) only seen ON for A580 + # bit 3 ( 8) only seen ON for A580 + # bit 4 ( 16) ON = AF, OFF = MF + # bit 5 ( 32) ON = OVF, OFF = LiveView + # bit 6 ( 64) seen ON and OFF, meaning unknown + # bit 7 (128) seen ON and OFF, meaning unknown + # 0x0016: DSLR: seen 244,245,252,254, decoded for A580 with 32GB SD and 16GB MS cards + # 0x0016: NEX: seen 61,62, 125,126, 190: bits '64' and '128' appear to relate to CameraOrientation + # 0x0016: SLT: seen 64 - 78, meaning unknown + 0x0016 => [{ + Name => 'MemoryCardConfiguration', + Condition => '$$self{Model} =~ /^DSLR-/', + PrintConv => { + 244 => 'MemoryStick in use, SD card present', + 245 => 'MemoryStick in use, SD slot empty', + 252 => 'SD card in use, MemoryStick present', + 254 => 'SD card in use, MemoryStick slot empty', + }, + },{ + Name => 'CameraOrientation', + Condition => '$$self{Model} =~ /^(NEX-(3|5|5C|C3|VG10|VG10E))\b/', + Mask => 0xc0, # (don't know what other bits mean) + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + 3 => 'Rotate 180', #(NC) + }, + + }], + # 0x0017: seen 0 for SLT, 255 for DSLR, variable for NEX + 0x0018 => { + Name => 'CameraOrientation', + Condition => '$$self{Model} !~ /^(NEX-(3|5|5C|C3|VG10|VG10E))\b/', + Mask => 0x30, # (don't know what other bits mean) + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 90 CW', + 2 => 'Rotate 270 CW', + 3 => 'Rotate 180', + }, + }, + # 0x0019: + # A450/500/550: 0 - 12 and 233 - 255 + # A560/580: 1 or 64, seen a few 0 and 8 + # A33/35/55: seen 0, 1, 64 + # NEX: 204 + # 0x001a, 0x001c appear to be 2 int16u values, meaning unknown +); + +# shot information (ref PH) +%Image::ExifTool::Sony::ShotInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0x02, 0x30, 0x32, 0x34 ], + IS_SUBDIR => [ 0x48, 0x5e ], + # 0x00 - byte order 'II' + 0x02 => { + Name => 'FaceInfoOffset', + Format => 'int16u', + DataMember => 'FaceInfoOffset', + Writable => 0, + RawConv => '$$self{FaceInfoOffset} = $val', + }, + 0x06 => { + Name => 'SonyDateTime', + Format => 'string[20]', + Groups => { 2 => 'Time' }, + Shift => 'Time', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,0)', + }, + 0x1a => { Name => 'SonyImageHeight', Format => 'int16u' }, #JR + 0x1c => { Name => 'SonyImageWidth', Format => 'int16u' }, #JR + 0x30 => { #Jeffrey Friedl + Name => 'FacesDetected', + DataMember => 'FacesDetected', + Format => 'int16u', + RawConv => '$$self{FacesDetected} = $val', + }, + 0x32 => { + Name => 'FaceInfoLength', # length of a single FaceInfo entry + DataMember => 'FaceInfoLength', + Format => 'int16u', + Writable => 0, + RawConv => '$$self{FaceInfoLength} = $val', + }, + 0x34 => { + # oldest/other DSC/other - + # older DSC models "DC5303320222000" or "DC6303320222000" + # DSC-W650/W690/W730 "THm101000000000" or "THm211000000000" + # DSC-HX9V generation and newer "DC7303320222000" + Name => 'MetaVersion', # (tentative) + Format => 'string[16]', + DataMember => 'MetaVersion', + RawConv => '$$self{MetaVersion} = $val', + }, + 0x48 => { # (most models: DC5303320222000 and DC6303320222000) + Name => 'FaceInfo1', + Condition => q{ + $$self{FacesDetected} and + $$self{FaceInfoOffset} == 0x48 and + $$self{FaceInfoLength} == 0x20 + }, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::FaceInfo1' }, + }, + 0x5e => { # (HX7V: DC7303320222000) + Name => 'FaceInfo2', + Condition => q{ + $$self{FacesDetected} and + $$self{FaceInfoOffset} == 0x5e and + $$self{FaceInfoLength} == 0x25 + }, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::FaceInfo2' }, + }, +); + +# tags used in Tag2010 and Tag9400 tables +my %sequenceImageNumber = ( #PH + Name => 'SequenceImageNumber', + Notes => 'number of images captured in burst sequence', + # (not shutter count because it increments for auto portrait framing) + Format => 'int32u', + ValueConv => '$val + 1', + ValueConvInv => '$val - 1', +); +my %sequenceFileNumber = ( #PH + Name => 'SequenceFileNumber', + Notes => 'file number in burst sequence', + Format => 'int32u', + ValueConv => '$val + 1', #JR + ValueConvInv => '$val - 1', +); +my %releaseMode2 = ( #JR + Name => 'ReleaseMode2', + SeparateTable => 'ReleaseMode2', + PrintConv => { + 0 => 'Normal', + 1 => 'Continuous', # (RX100 "Continuous - Self-timer") + 2 => 'Continuous - Exposure Bracketing', # (RX100) +# 3 - also DRO Bracketing (ILCE-7RM2), not "Continuous" because only single exposure from which camera makes 3 versions + 3 => 'DRO or White Balance Bracketing', # (HX9V) (RX100) (ILCE-7RM2) + 5 => 'Continuous - Burst', # (HX9V) + 6 => 'Single Frame - Capture During Movie', #PH (RX100) + 7 => 'Continuous - Sweep Panorama', + 8 => 'Continuous - Anti-Motion Blur, Hand-held Twilight', # (HX9V) + 9 => 'Continuous - HDR', + 10 => 'Continuous - Background defocus', # (HX9V) + 13 => 'Continuous - 3D Sweep Panorama', #PH/JR + 15 => 'Continuous - High Resolution Sweep Panorama', #JR (HX50V) + 16 => 'Continuous - 3D Image', # (HX9V) + 17 => 'Continuous - Burst 2', # (WX7 - PH) (#JR 9400-SequenceLength=10 shots) + 18 => 'Normal - iAuto+', # seen for several ILCE-3500/6000/6500/7S iAuto+ single-shot images ... + 19 => 'Continuous - Speed/Advance Priority', #PH/JR (RX100) + 20 => 'Continuous - Multi Frame NR', + 23 => 'Single-frame - Exposure Bracketing', # (seen for ILCE-7 series) + 26 => 'Continuous Low', #PH (A77) + 27 => 'Continuous - High Sensitivity', # seen for DSC-WX60 and WX300 + 28 => 'Smile Shutter', #PH (RX100) + 29 => 'Continuous - Tele-zoom Advance Priority', + # 30 - seen quite often for single-shot images ... SLT-A58, ILCE-5100/6000 + # 33 - Continuous - seen for DSC-RX100M5, RX10M4, maybe 24 fps mode ??? + 146 => 'Single Frame - Movie Capture', #PH (seen in Tag2010 ReleaseMode2 values) + }, +); + +# tag definitions for Tag2010 tables (ref JR) +my %sonyDateTime2010 = ( + Name => 'SonyDateTime', + Format => 'undef[7]', + Shift => 'Time', + ValueConv => q{ + my @v = unpack('vC*', $val); + return sprintf("%.4d:%.2d:%.2d %.2d:%.2d:%.2d", @v) + }, + ValueConvInv => q{ + my @v = ($val =~ /\d+/g); + return undef unless @v == 6; + return pack('vC*', @v); + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,0)', +); +my %releaseMode2010 = ( + Name => 'ReleaseMode3', + PrintConv => { + 0 => 'Normal', + 1 => 'Continuous', + 2 => 'Bracketing', # (all types: Continuous and Single-Frame Exposure, White Balance and DRO bracketing - PH/JR) + # 3 => 'Remote Commander', (NC) (seen this when other ReleaseMode and ReleaseMode2 are 'Normal' - PH, A77) + 4 => 'Continuous - Burst', # seen for DSC-WX500 with burst of 10 shots + 5 => 'Continuous - Speed/Advance Priority', + 6 => 'Normal - Self-timer', # seen for ILCE-6300/6500/9, ILCA-99M2 + 9 => 'Single Burst Shooting', # first seen for DSC-RX100M7 + }, +); +my %selfTimer2010 = ( + Name => 'SelfTimer', + PrintConv => { + 0 => 'Off', + 1 => 'Self-timer 10 s', + 2 => 'Self-timer 2 s', + }, +); +my %selfTimerB2010 = ( # also value 1 for new 5 s mode of DSC-HX90V/RX10M2/RX100M4/WX500, ILCE-7RM2/7SM2 + Name => 'SelfTimer', + PrintConv => { + 0 => 'Off', + 1 => 'Self-timer 5 or 10 s', + 2 => 'Self-timer 2 s', + }, +); +my %gain2010 = ( + Name => 'StopsAboveBaseISO', + # BaseISO is 100 for SLT, ILCE-3000, NEX-5N/5R/5T/6/7/VG20/VG30/VG900, DSC-RX1/RX1R + # BaseISO is 200 for NEX-F3/3N + # BaseISO is 160 for DSC-RX100M2 + # BaseISO is 125 for DSC-RX100 + # Also several other DSC models have BaseISO different from 100. + Format => 'int16u', + ValueConv => '16 - $val/256', + ValueConvInv => '(16 - $val) * 256', + PrintConv => '$val ? sprintf("%.1f",$val) : $val', + PrintConvInv => '$val', +); +my %brightnessValue2010 = ( + Name => 'BrightnessValue', + Format => 'int16u', + ValueConv => '$val/256 - 56.6', + ValueConvInv => '($val + 56.6) * 256', +); +my %dynamicRangeOptimizer2010 = ( + Name => 'DynamicRangeOptimizer', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 3 => 'Lv1', + 4 => 'Lv2', + 5 => 'Lv3', + 6 => 'Lv4', + 7 => 'Lv5', + 8 => 'n/a', + }, +); +my %hdr2010 = ( + Name => 'HDRSetting', # (Off when HDR tag is On for RX100 superior auto backlight - PH) + PrintConv => { + 0 => 'Off', + 1 => 'HDR Auto', + 3 => 'HDR 1 EV', + 5 => 'HDR 2 EV', + 7 => 'HDR 3 EV', + 9 => 'HDR 4 EV', + 11 => 'HDR 5 EV', + 13 => 'HDR 6 EV', + }, +); +my %exposureComp2010 = ( # only as set manually, remains 0 in exposure-bracketing modes + Name => 'ExposureCompensation', + Format=>'int16s', + ValueConv => '-$val/256', + ValueConvInv => '-$val*256', + PrintConv => '$val ? sprintf("%+.1f",$val) : 0', + PrintConvInv => '$val', +); +my %pictureEffect2010 = ( + Name => 'PictureEffect2', + SeparateTable => 'PictureEffect2', + PrintConv => { + 0 => 'Off', + 1 => 'Toy Camera', + 2 => 'Pop Color', + 3 => 'Posterization', + 4 => 'Retro Photo', + 5 => 'Soft High Key', + 6 => 'Partial Color', + 7 => 'High Contrast Monochrome', + 8 => 'Soft Focus', + 9 => 'HDR Painting', + 10 => 'Rich-tone Monochrome', + 11 => 'Miniature', + 12 => 'Water Color', + 13 => 'Illustration', + }, +); +my %quality2010 = ( + Name => 'Quality2', + PrintConv => { + 0 => 'JPEG', + 1 => 'RAW', + 2 => 'RAW + JPEG', + }, +); +my %meteringMode2010 = ( + Name => 'MeteringMode', + PrintConv => { + 0 => 'Multi-segment', + 2 => 'Center-weighted average', + 3 => 'Spot', + 4 => 'Average', + 5 => 'Highlight', + }, +); +my %flashMode2010 = ( + Name => 'FlashMode', + PrintConv => { + 0 => 'Autoflash', + 1 => 'Fill-flash', + 2 => 'Flash Off', + 3 => 'Slow Sync', + 4 => 'Rear Sync', + 6 => 'Wireless', + # 129 => 'unknown', # seen for ILCE-7M3 images + }, +); +my %exposureProgram2010 = ( + Name => 'ExposureProgram', + SeparateTable => 'ExposureProgram3', + PrintConv => \%sonyExposureProgram3, +); +my %pictureProfile2010 = ( + Name => 'PictureProfile', + # values 0-9: Seen for all cameras writing this tag: matches CreativeStyle and/or SceneMode settings. + # 10 and higher: Seen for ILCE-7S/7M2 and newer, having a PictureProfile setting, also some DSC/HDR models. + # Although intended for video, when set these profiles are also applied to (JPG) still images. + PrintConv => { + 0 => 'Gamma Still - Standard/Neutral (PP2)', # CreativeStyle = Standard or Neutral + 1 => 'Gamma Still - Portrait', + #2 - seen for DSC-HX90 + 3 => 'Gamma Still - Night View/Portrait', + 4 => 'Gamma Still - B&W/Sepia', + 5 => 'Gamma Still - Clear', + 6 => 'Gamma Still - Deep', + 7 => 'Gamma Still - Light', + 8 => 'Gamma Still - Vivid', # SceneMode or CreativeStyle = Vivid, Autumn, Sunset or Landscape + 9 => 'Gamma Still - Real', + 10 => 'Gamma Movie (PP1)', + 22 => 'Gamma ITU709 (PP3 or PP4)', # (also PP4 for A7M3, ref 14) + 24 => 'Gamma Cine1 (PP5)', + 25 => 'Gamma Cine2 (PP6)', + 26 => 'Gamma Cine3', + 27 => 'Gamma Cine4', + 28 => 'Gamma S-Log2 (PP7)', + 29 => 'Gamma ITU709 (800%)', + 31 => 'Gamma S-Log3 (PP8 or PP9)', #14 + 33 => 'Gamma HLG2 (PP10)', #14 + 34 => 'Gamma HLG3', #IB + 37 => 'FL', + 38 => 'VV2', + 39 => 'IN', + 40 => 'SH', + }, +); +my %isoSetting2010 = ( + 0 => 'Auto', + 5 => 25, + 7 => 40, + 8 => 50, + 9 => 64, + 10 => 80, + 11 => 100, + 12 => 125, + 13 => 160, + 14 => 200, + 15 => 250, + 16 => 320, + 17 => 400, + 18 => 500, + 19 => 640, + 20 => 800, + 21 => 1000, + 22 => 1250, + 23 => 1600, + 24 => 2000, + 25 => 2500, + 26 => 3200, + 27 => 4000, + 28 => 5000, + 29 => 6400, + 30 => 8000, + 31 => 10000, + 32 => 12800, + 33 => 16000, + 34 => 20000, + 35 => 25600, + 36 => 32000, + 37 => 40000, + 38 => 51200, + 39 => 64000, + 40 => 80000, + 41 => 102400, + 42 => 128000, + 43 => 160000, + 44 => 204800, + 45 => 256000, + 46 => 320000, + 47 => 409600, +); + +%Image::ExifTool::Sony::Tag2010a = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => 'Valid for NEX-5N.', + WRITABLE => 1, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + IS_SUBDIR => [ 0x04b0 ], + 0x04b0 => { + Name => 'MeterInfo', + Format => 'int32u[486]', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::MeterInfo' }, + }, + 0x1128 => { %releaseMode2010 }, + 0x112c => { %releaseMode2 }, + 0x1134 => { %selfTimer2010 }, + 0x1138 => { %flashMode2010 }, + 0x113e => { %gain2010 }, + 0x1140 => { %brightnessValue2010 }, + 0x1144 => { %dynamicRangeOptimizer2010 }, + 0x1148 => { %hdr2010 }, + 0x114c => { %exposureComp2010 }, + 0x115e => { %pictureProfile2010 }, + 0x115f => { %pictureProfile2010 }, + 0x1163 => { %pictureEffect2010 }, + 0x1170 => { %quality2010 }, + 0x1174 => { %meteringMode2010 }, + 0x1175 => { %exposureProgram2010 }, + 0x117c => { Name => 'WB_RGBLevels', Format => 'int16u[3]' }, + #0x1a08 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x1a0c => { Name => 'SonyImageHeight', Format => 'int16u' }, +); + +%Image::ExifTool::Sony::Tag2010b = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => 'Valid for SLT-A65/A77, NEX-7/VG20E.', + WRITABLE => 1, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + IS_SUBDIR => [ 0x04b4 ], + 0x0000 => { %sequenceImageNumber }, #PH + 0x0004 => { %sequenceFileNumber }, #PH + 0x0008 => { %releaseMode2, Format => 'int32u' }, + #0x0044 => { Name => 'SonyImageWidth3', Format => 'int16u' }, + #0x0048 => { Name => 'SonyImageHeight3', Format => 'int16u' }, + #0x0054 => { Name => 'SonyImageWidth2', Format => 'int16u' }, + #0x0058 => { Name => 'SonyImageHeight2', Format => 'int16u' }, + #0x0064 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x0068 => { Name => 'SonyImageHeight', Format => 'int16u' }, + #0x00a8 => { Name => 'SonyImageWidth2', Format => 'int16u' }, + #0x00ac => { Name => 'SonyImageHeight2', Format => 'int16u' }, + #0x00b8 => { Name => 'SonyImageWidth2', Format => 'int16u' }, + #0x00bc => { Name => 'SonyImageHeight2', Format => 'int16u' }, + #0x00c8 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x00cc => { Name => 'SonyImageHeight', Format => 'int16u' }, + 0x01b6 => { %sonyDateTime2010, Groups => { 2 => 'Time' } }, + #0x0204 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x0206 => { Name => 'SonyImageHeight', Format => 'int16u' }, + 0x0324 => { %dynamicRangeOptimizer2010 }, + 0x04b4 => { + Name => 'MeterInfo', + Format => 'int32u[486]', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::MeterInfo' }, + }, + 0x1128 => { %releaseMode2010 }, + 0x112c => { %releaseMode2 }, + 0x1134 => { %selfTimer2010 }, + 0x1138 => { %flashMode2010 }, + 0x113e => { %gain2010 }, + 0x1140 => { %brightnessValue2010 }, + 0x1144 => { %dynamicRangeOptimizer2010 }, + 0x1148 => { %hdr2010 }, + 0x114c => { %exposureComp2010 }, + 0x1162 => { %pictureProfile2010 }, + 0x1163 => { %pictureProfile2010 }, + 0x1167 => { %pictureEffect2010 }, + 0x1174 => { %quality2010 }, + 0x1178 => { %meteringMode2010 }, + 0x1179 => { %exposureProgram2010 }, + 0x1180 => { Name => 'WB_RGBLevels', Format => 'int16u[3]' }, + 0x1218 => { + Name => 'SonyISO', + Format => 'int16u', + ValueConv => '100 * 2**(16 - $val/256)', + ValueConvInv => '256 * (16 - log($val/100)/log(2))', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + #0x1a08 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x1a0c => { Name => 'SonyImageHeight', Format => 'int16u' }, + 0x1a23 => { # only for NEX-7 with Firmware v1.02 and higher, but slightly different from Tag9405 ... + Name => 'DistortionCorrParams', + Format => 'int16s[16]', + }, +); + +%Image::ExifTool::Sony::Tag2010c = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => 'Valid for SLT-A37/A57 and NEX-F3.', + WRITABLE => 1, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + IS_SUBDIR => [ 0x0490 ], + 0x0000 => { %sequenceImageNumber }, #PH + 0x0004 => { %sequenceFileNumber }, #PH + 0x0008 => { %releaseMode2, Format => 'int32u' }, + #0x0048 => { Name => 'SonyImageWidth3', Format => 'int16u' }, + #0x004c => { Name => 'SonyImageHeight3', Format => 'int16u' }, + #0x0058 => { Name => 'SonyImageWidth2', Format => 'int16u' }, + #0x005c => { Name => 'SonyImageHeight2', Format => 'int16u' }, + #0x0068 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x006c => { Name => 'SonyImageHeight', Format => 'int16u' }, + #0x00c0 => { Name => 'SonyImageWidth2', Format => 'int16u' }, + #0x00c4 => { Name => 'SonyImageHeight2', Format => 'int16u' }, + #0x00d0 => { Name => 'SonyImageWidth2', Format => 'int16u' }, + #0x00d4 => { Name => 'SonyImageHeight2', Format => 'int16u' }, + #0x00e0 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x00e4 => { Name => 'SonyImageHeight', Format => 'int16u' }, + #0x0134 => { Name => 'SonyImageHeight', Format => 'int16u' }, + #0x0144 => { Name => 'SonyImageHeight', Format => 'int16u' }, + #0x0154 => { Name => 'SonyImageHeight', Format => 'int16u' }, + 0x0200 => { Name => 'DigitalZoomRatio', ValueConv => '$val/16', ValueConvInv => '$val*16', Priority => 0 }, + 0x0210 => { %sonyDateTime2010, Groups => { 2 => 'Time' } }, + 0x0300 => { %dynamicRangeOptimizer2010 }, + 0x0490 => { + Name => 'MeterInfo', + Format => 'int32u[486]', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::MeterInfo' }, + }, + 0x1104 => { %releaseMode2010 }, + 0x1108 => { %releaseMode2 }, + 0x1110 => { %selfTimer2010 }, + 0x1114 => { %flashMode2010 }, + 0x111a => { %gain2010 }, + 0x111c => { %brightnessValue2010 }, + 0x1120 => { %dynamicRangeOptimizer2010 }, + 0x1124 => { %hdr2010 }, + 0x1128 => { %exposureComp2010 }, + 0x113e => { %pictureProfile2010 }, + 0x113f => { %pictureProfile2010 }, + 0x1143 => { %pictureEffect2010 }, + 0x1150 => { %quality2010 }, + 0x1154 => { %meteringMode2010 }, + 0x1155 => { %exposureProgram2010 }, + 0x115c => { Name => 'WB_RGBLevels', Format => 'int16u[3]' }, + 0x11f4 => { + Name => 'SonyISO', + Format => 'int16u', + ValueConv => '100 * 2**(16 - $val/256)', + ValueConvInv => '256 * (16 - log($val/100)/log(2))', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + #0x1a08 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x1a0c => { Name => 'SonyImageHeight', Format => 'int16u' }, +); + +%Image::ExifTool::Sony::Tag2010d = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => q{ + Valid for DSC-HX10V/HX20V/HX200V/TX66/TX200V/TX300V/WX50/WX100/WX150, but + not valid for panorama images. + }, + WRITABLE => 1, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + IS_SUBDIR => [ 0x050c ], + 0x0000 => { %sequenceImageNumber }, #PH + 0x0004 => { %sequenceFileNumber }, #PH + 0x0008 => { %releaseMode2, Format => 'int32u' }, + #0x0048 => { Name => 'SonyImageWidth3', Format => 'int16u' }, + #0x004c => { Name => 'SonyImageHeight3', Format => 'int16u' }, + #0x0058 => { Name => 'SonyImageWidth2', Format => 'int16u' }, + #0x005c => { Name => 'SonyImageHeight2', Format => 'int16u' }, + #0x0068 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x006c => { Name => 'SonyImageHeight', Format => 'int16u' }, + #0x00c0 => { Name => 'SonyImageWidth2', Format => 'int16u' }, + #0x00c4 => { Name => 'SonyImageHeight2', Format => 'int16u' }, + #0x00d0 => { Name => 'SonyImageWidth2', Format => 'int16u' }, + #0x00d4 => { Name => 'SonyImageHeight2', Format => 'int16u' }, + #0x00e0 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x00e4 => { Name => 'SonyImageHeight', Format => 'int16u' }, + 0x01fe => { %sonyDateTime2010, Groups => { 2 => 'Time' } }, + 0x037c => { %dynamicRangeOptimizer2010 }, + 0x050c => { + Name => 'MeterInfo', + Format => 'int32u[486]', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::MeterInfo' }, + }, + 0x1180 => { %releaseMode2010 }, + 0x1184 => { %releaseMode2 }, + 0x118c => { %selfTimer2010 }, + 0x1190 => { %flashMode2010 }, + 0x1196 => { %gain2010 }, + 0x1198 => { %brightnessValue2010 }, + 0x119c => { %dynamicRangeOptimizer2010 }, + 0x11a0 => { %hdr2010 }, + 0x11ba => { %pictureProfile2010 }, + 0x11bb => { %pictureProfile2010 }, + 0x11bf => { %pictureEffect2010 }, + 0x11d0 => { %meteringMode2010 }, + # 0x11d1 - not valid for HX20V panorama images - PH + 0x11d1 => { %exposureProgram2010 }, + 0x11d8 => { Name => 'WB_RGBLevels', Format => 'int16u[3]' }, + 0x1270 => { + Name => 'SonyISO', + Format => 'int16u', + ValueConv => '100 * 2**(16 - $val/256)', + ValueConvInv => '256 * (16 - log($val/100)/log(2))', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, +); + +%Image::ExifTool::Sony::Tag2010e = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => q{ + Valid for SLT-A58/A99, ILCE-3000/3500, NEX-3N/5R/5T/6/VG30E/VG900, + DSC-RX100, DSC-RX1/RX1R. Also valid for DSC-HX300/HX50V/TX30/WX60/WX200/ + WX300, but not for panorama images. + }, + WRITABLE => 1, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0x1892 ], + IS_SUBDIR => [ 0x04b8 ], + 0x0000 => { %sequenceImageNumber }, #PH + 0x0004 => { %sequenceFileNumber }, #PH + 0x0008 => { %releaseMode2, Format => 'int32u' }, + #0x0048 => { Name => 'SonyImageWidth3', Format => 'int16u' }, + #0x004c => { Name => 'SonyImageHeight3', Format => 'int16u' }, + #0x0058 => { Name => 'SonyImageWidth2', Format => 'int16u' }, + #0x005c => { Name => 'SonyImageHeight2', Format => 'int16u' }, + #0x0068 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x006c => { Name => 'SonyImageHeight', Format => 'int16u' }, + #0x00c0 => { Name => 'SonyImageWidth2', Format => 'int16u' }, + #0x00c4 => { Name => 'SonyImageHeight2', Format => 'int16u' }, + #0x00d0 => { Name => 'SonyImageWidth2', Format => 'int16u' }, + #0x00d4 => { Name => 'SonyImageHeight2', Format => 'int16u' }, + #0x00e0 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x00e4 => { Name => 'SonyImageHeight', Format => 'int16u' }, + #0x01fa => { Name => 'SonyImageHeight', Format => 'int16u' }, + #0x0200 => { Name => 'SonyImageWidth', Format => 'int16u' }, + 0x021c => { Name => 'DigitalZoomRatio', ValueConv => '$val/16', ValueConvInv => '$val*16', Priority => 0 }, + 0x022c => { %sonyDateTime2010, Groups => { 2 => 'Time' } }, + 0x0328 => { %dynamicRangeOptimizer2010 }, + 0x04b8 => { + Name => 'MeterInfo', + Format => 'int32u[486]', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::MeterInfo' }, + }, + 0x115c => { %releaseMode2010 }, + 0x1160 => { %releaseMode2 }, + 0x1168 => { %selfTimer2010 }, + 0x116c => { %flashMode2010 }, + 0x1172 => { %gain2010 }, + 0x1174 => { %brightnessValue2010 }, + 0x1178 => { %dynamicRangeOptimizer2010 }, + 0x117c => { %hdr2010 }, + 0x1180 => { %exposureComp2010 }, + 0x1196 => { %pictureProfile2010 }, + 0x1197 => { %pictureProfile2010 }, + 0x119b => { %pictureEffect2010 }, + 0x11a8 => { %quality2010 }, + 0x11ac => { %meteringMode2010 }, + 0x11ad => { %exposureProgram2010 }, + 0x11b4 => { Name => 'WB_RGBLevels', Format => 'int16u[3]' }, + 0x1254 => { + Condition => '$$self{Model} =~ /^(SLT-(A99|A99V)|NEX-(5R|5T|6|VG900|VG30E)|DSC-RX100|Stellar|HV)\b/', + Name => 'SonyISO', + Format => 'int16u', + ValueConv => '100 * 2**(16 - $val/256)', + ValueConvInv => '256 * (16 - log($val/100)/log(2))', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 0x1258 => { + Condition => '$$self{Model} =~ /^(DSC-(RX1|RX1R))\b/', + Name => 'SonyISO', + Format => 'int16u', + ValueConv => '100 * 2**(16 - $val/256)', + ValueConvInv => '256 * (16 - log($val/100)/log(2))', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 0x1278 => { + Condition => '$$self{Model} =~ /^(SLT-A58|ILCE-(3000|3500)|NEX-3N|DSC-(HX300|HX50V|WX60|WX80|WX200|WX300|TX30))\b/', + Name => 'FocalLength', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x127a => { + Condition => '$$self{Model} =~ /^(SLT-A58|ILCE-(3000|3500)|NEX-3N|DSC-(HX300|HX50V|WX60|WX80|WX200|WX300|TX30))\b/', + Name => 'MinFocalLength', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x127c => { # may give 0 for fixed focal length lenses + Condition => '$$self{Model} =~ /^(SLT-A58|ILCE-(3000|3500)|NEX-3N|DSC-(HX300|HX50V|WX60|WX80|WX200|WX300|TX30))\b/', + Name => 'MaxFocalLength', + Format => 'int16u', + RawConv => '$val || undef', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x1280 => { + Condition => '$$self{Model} =~ /^(SLT-A58|ILCE-(3000|3500)|NEX-3N|DSC-(HX300|HX50V|WX60|WX80|WX200|WX300|TX30))\b/', + Name => 'SonyISO', + Format => 'int16u', + ValueConv => '100 * 2**(16 - $val/256)', + ValueConvInv => '256 * (16 - log($val/100)/log(2))', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 0x1870 => { + Name => 'DistortionCorrParams', + Condition => '$$self{Model} !~ /^(DSC-|Stellar)/', + Format => 'int16s[16]', + }, + # 0x1890 - same as 0x1892, but has value 3 for SAL18135, SAL50F14Z, SAL55300, SAL70200G2, SAL70300G2, SAL70400G2 + # Presumably, these are the A-mount lenses "compatible with software updates" as referred to in the ILCA-99M2 manual. + # Indeed, SAL70400G2 on ILCA-77M2 gives Version: "Lens: Ver.01" + 0x1891 => { + Name => 'LensFormat', + Condition => '$$self{Model} !~ /^(DSC-|Stellar)/', + PrintConv => { + 0 => 'Unknown', + 1 => 'APS-C', + 2 => 'Full-frame', + }, + }, + 0x1892 => { + Name => 'LensMount', + DataMember => 'LensMount', + RawConv => '$$self{LensMount} = $val; $$self{Model} =~ /^(DSC-|Stellar)/ ? undef : $val', + PrintConv => { + 0 => 'Unknown', + 1 => 'A-mount', + 2 => 'E-mount', + }, + }, + 0x1893 => { #JR + Name => 'LensType2', + Condition => '$$self{LensMount} == 2', + Format => 'int16u', + SeparateTable => 'LensType2', + PrintConv => \%sonyLensTypes2, + }, + 0x1896 => { + Name => 'LensType', + Condition => '$$self{LensMount} == 1', + Priority => 0, #PH (just to be safe) + Format => 'int16u', #PH + SeparateTable => 1, + ValueConvInv => '($val & 0xff00) == 0x8000 ? 0 : int($val)', + PrintConv => \%sonyLensTypes, + }, + 0x1898 => { + Name => 'DistortionCorrParamsPresent', + Condition => '$$self{Model} !~ /^(DSC-|Stellar)/', + PrintConv => { 0 => 'No', 1 => 'Yes'}, + }, + 0x1899 => { + Name => 'DistortionCorrParamsNumber', + Condition => '$$self{Model} !~ /^DSC-/', + PrintConv => { 11 => '11 (APS-C)', 16 => '16 (Full-frame)'}, + }, + #0x1914 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x1918 => { Name => 'SonyImageHeight', Format => 'int16u' }, + #0x192e => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x1930 => { Name => 'SonyImageHeight', Format => 'int16u' }, +); + +%Image::ExifTool::Sony::Tag2010f = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => 'Valid for DSC-RX100M2, DSC-QX10/QX100.', + WRITABLE => 1, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + IS_SUBDIR => [ 0x01e0 ], + 0x0004 => { %releaseMode2, Format => 'int32u' }, # NOT at offset 0x08 ! + #0x002e => { Name => 'SonyImageWidth3', Format => 'int16u' }, + #0x0042 => { Name => 'SonyImageWidth3', Format => 'int16u' }, + 0x0050 => { %dynamicRangeOptimizer2010 }, + 0x01e0 => { + Name => 'MeterInfo', + Format => 'int32u[486]', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::MeterInfo' }, + }, + 0x1014 => { %releaseMode2010 }, + 0x1018 => { %releaseMode2 }, + 0x1020 => { %selfTimer2010 }, + 0x1024 => { %flashMode2010 }, + 0x102a => { %gain2010 }, + 0x102c => { %brightnessValue2010 }, + 0x1030 => { %dynamicRangeOptimizer2010 }, + 0x1034 => { %hdr2010 }, + 0x1038 => { %exposureComp2010 }, + 0x104e => { %pictureProfile2010 }, + 0x104f => { %pictureProfile2010 }, + 0x1053 => { %pictureEffect2010 }, + 0x1060 => { %quality2010 }, + 0x1064 => { %meteringMode2010 }, + 0x1065 => { %exposureProgram2010 }, + 0x106c => { Name => 'WB_RGBLevels', Format => 'int16u[3]' }, + #0x1096 => { Name => 'SonyImageWidth3', Format => 'int16u' }, + #0x10aa => { Name => 'SonyImageWidth3', Format => 'int16u' }, + 0x1134 => { + Name => 'FocalLength', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x1136 => { + Name => 'MinFocalLength', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x1138 => { + Name => 'MaxFocalLength', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x113c => { + Name => 'SonyISO', + Format => 'int16u', + ValueConv => '100 * 2**(16 - $val/256)', + ValueConvInv => '256 * (16 - log($val/100)/log(2))', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + #0x1914 => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x1918 => { Name => 'SonyImageHeight', Format => 'int16u' }, + #0x192e => { Name => 'SonyImageWidth', Format => 'int16u' }, + #0x1930 => { Name => 'SonyImageHeight', Format => 'int16u' }, +); + +%Image::ExifTool::Sony::Tag2010g = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => q{ + Valid for DSC-HX60V/HX350/HX400V/QX30/RX10/RX100M3/WX220/WX350, + ILCE-7/7R/7S/7M2/5000/5100/6000/QX1, ILCA-68/77M2. + }, + WRITABLE => 1, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0x18be ], + IS_SUBDIR => [ 0x0388 ], + 0x0004 => { %releaseMode2, Format => 'int32u' }, # NOT at offset 0x08 ! + 0x0050 => { %dynamicRangeOptimizer2010 }, + 0x020c => { %releaseMode2010 }, + 0x0210 => { %releaseMode2 }, + 0x0218 => { %selfTimer2010 }, + 0x021c => { %flashMode2010 }, + 0x0222 => { %gain2010 }, + 0x0224 => { %brightnessValue2010 }, + 0x0228 => { %dynamicRangeOptimizer2010 }, + 0x022c => { %hdr2010 }, + 0x0230 => { %exposureComp2010 }, + 0x0246 => { %pictureProfile2010 }, + 0x0247 => { %pictureProfile2010 }, + 0x024b => { %pictureEffect2010 }, + 0x0258 => { %quality2010 }, + 0x025c => { %meteringMode2010 }, + 0x025d => { %exposureProgram2010 }, + 0x0264 => { Name => 'WB_RGBLevels', Format => 'int16u[3]' }, + 0x032c => { + Name => 'FocalLength', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x032e => { + Name => 'MinFocalLength', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x0330 => { # may give 0 for fixed focal length lenses + Name => 'MaxFocalLength', + Format => 'int16u', + RawConv => '$val || undef', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x0344 => { + Name => 'SonyISO', + Format => 'int16u', + ValueConv => '100 * 2**(16 - $val/256)', + ValueConvInv => '256 * (16 - log($val/100)/log(2))', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 0x0388 => { + Name => 'MeterInfo', + Format => 'int32u[486]', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::MeterInfo' }, + }, + 0x189c => { + Name => 'DistortionCorrParams', + Condition => '$$self{Model} !~ /^DSC-/', + Format => 'int16s[16]', + }, + # 0x18bc - same as 0x18be, but has value 3 for SAL18135, SAL50F14Z, SAL55300, SAL70200G2, SAL70300G2, SAL70400G2 + 0x18bd => { + Name => 'LensFormat', + Condition => '$$self{Model} !~ /^DSC-/', + PrintConv => { + 0 => 'Unknown', + 1 => 'APS-C', + 2 => 'Full-frame', + }, + }, + 0x18be => { + Name => 'LensMount', + DataMember => 'LensMount', + RawConv => '$$self{LensMount} = $val; $$self{Model} =~ /^DSC-/ ? undef : $val', + PrintConv => { + 0 => 'Unknown', + 1 => 'A-mount', + 2 => 'E-mount', + }, + }, + 0x18bf => { #JR + Name => 'LensType2', + Condition => '$$self{LensMount} == 2', + Format => 'int16u', + SeparateTable => 'LensType2', + PrintConv => \%sonyLensTypes2, + }, + 0x18c2 => { + Name => 'LensType', + Condition => '$$self{LensMount} == 1', + Priority => 0, #PH (just to be safe) + Format => 'int16u', #PH + SeparateTable => 1, + ValueConvInv => '($val & 0xff00) == 0x8000 ? 0 : int($val)', + PrintConv => \%sonyLensTypes, + }, + 0x18c4 => { + Name => 'DistortionCorrParamsPresent', + Condition => '$$self{Model} !~ /^DSC-/', + PrintConv => { 0 => 'No', 1 => 'Yes'}, + }, + 0x18c5 => { + Name => 'DistortionCorrParamsNumber', + Condition => '$$self{Model} !~ /^DSC-/', + PrintConv => { 11 => '11 (APS-C)', 16 => '16 (Full-frame)'}, + }, + # 0x1940 => { Name => 'SonyImageWidth', Format => 'int16u' }, + # 0x1944 => { Name => 'SonyImageHeight', Format => 'int16u' }, + # 0x195a => { Name => 'SonyImageWidth', Format => 'int16u' }, + # 0x195c => { Name => 'SonyImageHeight', Format => 'int16u' }, +); + +%Image::ExifTool::Sony::Tag2010h = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => q{ + Valid for DSC-HX80/HX90V/RX0/RX1RM2/RX10M2/RX10M3/RX100M4/RX100M5/WX500, + ILCE-6300/6500/7RM2/7SM2, ILCA-99M2. + }, + WRITABLE => 1, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0x18ee ], + IS_SUBDIR => [ 0x0388, 0x0398 ], + 0x0004 => { %releaseMode2, Format => 'int32u' }, + 0x0050 => { %dynamicRangeOptimizer2010 }, + 0x020c => { %releaseMode2010 }, + 0x0210 => { %releaseMode2 }, + 0x0218 => { %selfTimerB2010 }, + 0x021c => { %flashMode2010 }, + 0x0222 => { %gain2010 }, + 0x0224 => { %brightnessValue2010 }, + 0x0228 => { %dynamicRangeOptimizer2010 }, + 0x022c => { %hdr2010 }, + 0x0230 => { %exposureComp2010 }, + 0x0246 => { %pictureProfile2010 }, + 0x0247 => { %pictureProfile2010 }, + 0x024b => { %pictureEffect2010 }, + 0x0258 => { %quality2010 }, + 0x025c => { %meteringMode2010 }, + 0x025d => { %exposureProgram2010 }, + 0x0264 => { Name => 'WB_RGBLevels', Format => 'int16u[3]' }, + 0x032c => { + Name => 'FocalLength', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x032e => { + Name => 'MinFocalLength', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x0330 => { # may give 0 for fixed focal length lenses + Name => 'MaxFocalLength', + Format => 'int16u', + RawConv => '$val || undef', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x0346 => { + Name => 'SonyISO', + Format => 'int16u', + ValueConv => '100 * 2**(16 - $val/256)', + ValueConvInv => '256 * (16 - log($val/100)/log(2))', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 0x0388 => { + Name => 'MeterInfo', + Format => 'int32u[486]', + Condition => '$$self{Model} !~ /^(ILCA-99M2|ILCE-6500|DSC-(RX0|RX100M5))/', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::MeterInfo' }, + }, + 0x0398 => { + Name => 'MeterInfo', + Format => 'int32u[486]', + Condition => '$$self{Model} =~ /^(ILCA-99M2|ILCE-6500|DSC-(RX0|RX100M5))/', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::MeterInfo' }, + }, + 0x18cc => { + Name => 'DistortionCorrParams', + Condition => '$$self{Model} !~ /^DSC-/', + Format => 'int16s[16]', + }, + # 0x18ec - same as 0x18ee, but has value 3 for SAL18135, SAL50F14Z, SAL55300, SAL70200G2, SAL70300G2, SAL70400G2 + 0x18ed => { + Name => 'LensFormat', + Condition => '$$self{Model} !~ /^DSC-/', + PrintConv => { + 0 => 'Unknown', + 1 => 'APS-C', + 2 => 'Full-frame', + }, + }, + 0x18ee => { + Name => 'LensMount', + DataMember => 'LensMount', + RawConv => '$$self{LensMount} = $val; $$self{Model} =~ /^DSC-/ ? undef : $val', + PrintConv => { + 0 => 'Unknown', + 1 => 'A-mount', + 2 => 'E-mount', + }, + }, + 0x18ef => { #JR + Name => 'LensType2', + Condition => '$$self{LensMount} == 2', + Format => 'int16u', + SeparateTable => 'LensType2', + PrintConv => \%sonyLensTypes2, + }, + 0x18f2 => { + Name => 'LensType', + Condition => '$$self{LensMount} == 1', + Priority => 0, #PH (just to be safe) + Format => 'int16u', #PH + SeparateTable => 1, + ValueConvInv => '($val & 0xff00) == 0x8000 ? 0 : int($val)', + PrintConv => \%sonyLensTypes, + }, + 0x18f4 => { + Name => 'DistortionCorrParamsPresent', + Condition => '$$self{Model} !~ /^DSC-/', + PrintConv => { 0 => 'No', 1 => 'Yes'}, + }, + 0x18f5 => { + Name => 'DistortionCorrParamsNumber', + Condition => '$$self{Model} !~ /^DSC-/', + PrintConv => { 11 => '11 (APS-C)', 16 => '16 (Full-frame)'}, + }, + # 0x1970 => { Name => 'SonyImageWidth', Format => 'int16u' }, + # 0x1974 => { Name => 'SonyImageHeight', Format => 'int16u' }, + # 0x198a => { Name => 'SonyImageWidth', Format => 'int16u' }, + # 0x198c => { Name => 'SonyImageHeight', Format => 'int16u' }, +); + +%Image::ExifTool::Sony::Tag2010i = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => q{ + Valid for ILCE-6100/6400/6600/7C/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M6/ + RX100M5A/RX100M7/HX99. + }, + WRITABLE => 1, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0x17f2 ], + IS_SUBDIR => [ 0x036d ], + 0x0004 => { %releaseMode2, Format => 'int32u' }, + 0x004e => { %dynamicRangeOptimizer2010 }, + 0x0204 => { %releaseMode2010 }, + 0x0208 => { %releaseMode2 }, + 0x0210 => { %selfTimerB2010 }, + 0x0211 => { %flashMode2010 }, + 0x0217 => { %gain2010 }, + 0x0219 => { %brightnessValue2010 }, + 0x021b => { %dynamicRangeOptimizer2010 }, + 0x021f => { %hdr2010 }, + 0x0223 => { %exposureComp2010 }, + 0x0237 => { %pictureProfile2010 }, + 0x0238 => { %pictureProfile2010 }, + 0x023c => { %pictureEffect2010 }, + 0x0247 => { %quality2010 }, + 0x024b => { %meteringMode2010 }, + 0x024c => { %exposureProgram2010 }, + 0x0252 => { Name => 'WB_RGBLevels', Format => 'int16u[3]' }, + 0x030a => { + Name => 'FocalLength', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x030c => { + Name => 'MinFocalLength', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x030e => { # may give 0 for fixed focal length lenses + Name => 'MaxFocalLength', + Format => 'int16u', + RawConv => '$val || undef', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x0320 => { + Name => 'SonyISO', + Format => 'int16u', + ValueConv => '100 * 2**(16 - $val/256)', + ValueConvInv => '256 * (16 - log($val/100)/log(2))', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 0x036d => { # different format from all previous cameras: now each triple is int16u-int32u-int32u + Name => 'MeterInfo', + Format => 'undef[1620]', + Unknown => 1, + SubDirectory => { TagTable => 'Image::ExifTool::Sony::MeterInfo9' }, + }, + 0x17d0 => { + Name => 'DistortionCorrParams', + Condition => '$$self{Model} !~ /^DSC-/', + Format => 'int16s[16]', + }, + # 0x17f0 - same as 0x17f2, but has value 3 for SAL18135, SAL50F14Z, SAL55300, SAL70200G2, SAL70300G2, SAL70400G2 + 0x17f1 => { + Name => 'LensFormat', + Condition => '$$self{Model} !~ /^DSC-/', + PrintConv => { + 0 => 'Unknown', + 1 => 'APS-C', + 2 => 'Full-frame', + }, + }, + 0x17f2 => { + Name => 'LensMount', + DataMember => 'LensMount', + RawConv => '$$self{LensMount} = $val; $$self{Model} =~ /^DSC-/ ? undef : $val', + PrintConv => { + 0 => 'Unknown', + 1 => 'A-mount', + 2 => 'E-mount', + }, + }, + 0x17f3 => { #JR + Name => 'LensType2', + Condition => '$$self{LensMount} == 2', + Format => 'int16u', + SeparateTable => 'LensType2', + PrintConv => \%sonyLensTypes2, + }, + 0x17f6 => { + Name => 'LensType', + Condition => '$$self{LensMount} == 1', + Priority => 0, #PH (just to be safe) + Format => 'int16u', #PH + SeparateTable => 1, + ValueConvInv => '($val & 0xff00) == 0x8000 ? 0 : int($val)', + PrintConv => \%sonyLensTypes, + }, + 0x17f8 => { + Name => 'DistortionCorrParamsPresent', + Condition => '$$self{Model} !~ /^DSC-/', + PrintConv => { 0 => 'No', 1 => 'Yes'}, + }, + 0x17f9 => { + Name => 'DistortionCorrParamsNumber', + Condition => '$$self{Model} !~ /^DSC-/', + PrintConv => { 11 => '11 (APS-C)', 16 => '16 (Full-frame)'}, + }, +); + +%Image::ExifTool::Sony::Tag202a = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + FORMAT => 'int8u', + DATAMEMBER => [ 0x01 ], +# +# first seen for ILCE-6300 +# Possibly the Locations of the FocalPlaneAFPointsUsed are indicated here. +# 66 bytes, structure appears to be as follows: +# 0x00 - 1 for ILCE-6300/6500, ILCA-99M2 +# 0x01 - int8u: 0 to 15 - nr of locations to follow +# 0x02 and 0x03 - (128 2) or 640 - (max.) width (X) of (LCD screen) area of following locations +# 0x04 and 0x05 - (172 1) or 428 - (max.) height (Y) of (LCD screen) area of following locations +# origin of X-Y coordinates appears to be top-left, i.e. X to the right, Y pointing down. +# 0x06 0x07 0x08 0x09 - 2x int16u : X and Y coordinates of Location 1 +# etc. +# + 0x01 => { + Name => 'FocalPlaneAFPointsUsed', + DataMember => 'Locations', + Format => 'int8u', + RawConv => '$$self{Locations} = $val', + }, + 0x02 => { + Name => 'FocalPlaneAFPointArea', + Condition => '$$self{Locations} >= 1', # only output this if at least 1 Location follows ? + Format => 'int16u[2]', + }, + 0x06 => { Name => 'FocalPlaneAFPointLocation1', Condition => '$$self{Locations} >= 1', Format => 'int16u[2]' }, + 0x0a => { Name => 'FocalPlaneAFPointLocation2', Condition => '$$self{Locations} >= 2', Format => 'int16u[2]' }, + 0x0e => { Name => 'FocalPlaneAFPointLocation3', Condition => '$$self{Locations} >= 3', Format => 'int16u[2]' }, + 0x12 => { Name => 'FocalPlaneAFPointLocation4', Condition => '$$self{Locations} >= 4', Format => 'int16u[2]' }, + 0x16 => { Name => 'FocalPlaneAFPointLocation5', Condition => '$$self{Locations} >= 5', Format => 'int16u[2]' }, + 0x1a => { Name => 'FocalPlaneAFPointLocation6', Condition => '$$self{Locations} >= 6', Format => 'int16u[2]' }, + 0x1e => { Name => 'FocalPlaneAFPointLocation7', Condition => '$$self{Locations} >= 7', Format => 'int16u[2]' }, + 0x22 => { Name => 'FocalPlaneAFPointLocation8', Condition => '$$self{Locations} >= 8', Format => 'int16u[2]' }, + 0x26 => { Name => 'FocalPlaneAFPointLocation9', Condition => '$$self{Locations} >= 9', Format => 'int16u[2]' }, + 0x2a => { Name => 'FocalPlaneAFPointLocation10', Condition => '$$self{Locations} >= 10', Format => 'int16u[2]' }, + 0x2e => { Name => 'FocalPlaneAFPointLocation11', Condition => '$$self{Locations} >= 11', Format => 'int16u[2]' }, + 0x32 => { Name => 'FocalPlaneAFPointLocation12', Condition => '$$self{Locations} >= 12', Format => 'int16u[2]' }, + 0x36 => { Name => 'FocalPlaneAFPointLocation13', Condition => '$$self{Locations} >= 13', Format => 'int16u[2]' }, + 0x3a => { Name => 'FocalPlaneAFPointLocation14', Condition => '$$self{Locations} >= 14', Format => 'int16u[2]' }, + 0x3e => { Name => 'FocalPlaneAFPointLocation15', Condition => '$$self{Locations} >= 15', Format => 'int16u[2]' }, +); + +# possible metering information (ref JR) +%Image::ExifTool::Sony::MeterInfo = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + NOTES => q{ + Information possibly related to metering. Extracted only if the Unknown + option is used. + }, +# +# 162 'triplets' of 3 int32u numbers: (k,n1,n2) +# These appear to relate to two sets of brightness distribution over the image area: +# Set 1: 7 rows of 9 +# Set 2: 9 rows of 11 +# +# Exact meaning presently unknown, however: +# n1 ranges from 0 (black) - appr. 1300 (bright white) +# n2 ranges from 0 (black) - appr. 142000 (bright white), i.e. roughly factor 100 higher +# Many panorama images: all 0 +# Flash images: n2 = n1 +# k maybe some kind of 'gain' or multiplication factor ? +# k distribution over the image as function of Aspect-Ratio is as follows: +# +# 3:2 image 16:9 image 4:3 image +# set 1: +# +# 12 12 12 12 12 12 12 12 12 12 12 12 15 18 15 12 12 12 9 12 12 12 12 12 12 12 9 +# 12 12 12 12 12 12 12 12 12 12 12 12 15 18 15 12 12 12 9 12 12 12 12 12 12 12 9 +# 16 16 16 16 16 16 16 16 16 12 12 12 15 18 15 12 12 12 12 16 16 16 16 16 16 16 12 +# 16 16 16 16 16 16 16 16 16 12 12 12 15 18 15 12 12 12 12 16 16 16 16 16 16 16 12 +# 16 16 16 16 16 16 16 16 16 12 12 12 15 18 15 12 12 12 12 16 16 16 16 16 16 16 12 +# 12 12 12 12 12 12 12 12 12 12 12 12 15 18 15 12 12 12 9 12 12 12 12 12 12 12 9 +# 12 12 12 12 12 12 12 12 12 12 12 12 15 18 15 12 12 12 9 12 12 12 12 12 12 12 9 +# +# set 2: +# +# 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 15 18 15 12 12 12 12 9 9 12 12 12 12 12 12 12 9 9 +# 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 15 18 15 12 12 12 12 9 9 12 12 12 12 12 12 12 9 9 +# 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 15 18 15 12 12 12 12 9 9 12 12 12 12 12 12 12 9 9 +# 16 16 16 16 16 16 16 16 16 16 16 12 12 12 12 15 18 15 12 12 12 12 12 12 16 16 16 16 16 16 16 12 12 +# 16 16 16 16 16 16 16 16 16 16 16 12 12 12 12 15 18 15 12 12 12 12 12 12 16 16 16 16 16 16 16 12 12 +# 16 16 16 16 16 16 16 16 16 16 16 12 12 12 12 15 18 15 12 12 12 12 12 12 16 16 16 16 16 16 16 12 12 +# 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 15 18 15 12 12 12 12 9 9 12 12 12 12 12 12 12 9 9 +# 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 15 18 15 12 12 12 12 9 9 12 12 12 12 12 12 12 9 9 +# 12 12 12 12 12 12 12 12 12 12 12 8 8 8 8 10 12 10 8 8 8 8 9 9 12 12 12 12 12 12 12 9 9 +# +# Usually, in the center, the numbers of set 1 row 2-6 match with set 2 row 3-7, except for first and last 2 columns. +# + 0x0000 => { Name => 'MeterInfo1Row1', %meterInfo1 }, + 0x006c => { Name => 'MeterInfo1Row2', %meterInfo1 }, + 0x00d8 => { Name => 'MeterInfo1Row3', %meterInfo1 }, + 0x0144 => { Name => 'MeterInfo1Row4', %meterInfo1 }, + 0x01b0 => { Name => 'MeterInfo1Row5', %meterInfo1 }, + 0x021c => { Name => 'MeterInfo1Row6', %meterInfo1 }, + 0x0288 => { Name => 'MeterInfo1Row7', %meterInfo1 }, + + 0x02f4 => { Name => 'MeterInfo2Row1', %meterInfo2 }, + 0x0378 => { Name => 'MeterInfo2Row2', %meterInfo2 }, + 0x03fc => { Name => 'MeterInfo2Row3', %meterInfo2 }, + 0x0480 => { Name => 'MeterInfo2Row4', %meterInfo2 }, + 0x0504 => { Name => 'MeterInfo2Row5', %meterInfo2 }, + 0x0588 => { Name => 'MeterInfo2Row6', %meterInfo2 }, + 0x060c => { Name => 'MeterInfo2Row7', %meterInfo2 }, + 0x0690 => { Name => 'MeterInfo2Row8', %meterInfo2 }, + 0x0714 => { Name => 'MeterInfo2Row9', %meterInfo2 }, +); + +# possible metering information (ref JR) +%Image::ExifTool::Sony::MeterInfo9 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + NOTES => q{ + Information possibly related to metering. Extracted only if the Unknown + option is used. + }, +# new format for ILCE-9: +# 162 'triplets' of (int16u int32u int32u) numbers: (k,n1,n2) +# Set 1: 7 rows of 9 +# Set 2: 9 rows of 11 + 0x0000 => { Name => 'MeterInfo1Row1', %meterInfo1b }, + 0x005a => { Name => 'MeterInfo1Row2', %meterInfo1b }, + 0x00b4 => { Name => 'MeterInfo1Row3', %meterInfo1b }, + 0x010e => { Name => 'MeterInfo1Row4', %meterInfo1b }, + 0x0168 => { Name => 'MeterInfo1Row5', %meterInfo1b }, + 0x01c2 => { Name => 'MeterInfo1Row6', %meterInfo1b }, + 0x021c => { Name => 'MeterInfo1Row7', %meterInfo1b }, + + 0x0276 => { Name => 'MeterInfo2Row1', %meterInfo2b }, + 0x02e4 => { Name => 'MeterInfo2Row2', %meterInfo2b }, + 0x0352 => { Name => 'MeterInfo2Row3', %meterInfo2b }, + 0x03c0 => { Name => 'MeterInfo2Row4', %meterInfo2b }, + 0x042e => { Name => 'MeterInfo2Row5', %meterInfo2b }, + 0x049c => { Name => 'MeterInfo2Row6', %meterInfo2b }, + 0x050a => { Name => 'MeterInfo2Row7', %meterInfo2b }, + 0x0578 => { Name => 'MeterInfo2Row8', %meterInfo2b }, + 0x05e6 => { Name => 'MeterInfo2Row9', %meterInfo2b }, +); + +%Image::ExifTool::Sony::Tag900b = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + # 0x0000 - always 174 (e) + 0x0002 => { + Name => 'FacesDetected', + PrintConv => { + 0 => '0', + 98 => '1', + 57 => '2', + 93 => '3', + 77 => '4', + 33 => '5', + 168 => '6', + 241 => '7', + 115 => '8', + }, + }, + # 0x00bc - always 98 (221 (e)) + 0x00bd => { + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', # always 98 for A450/A500/A550: exclude + Name => 'FaceDetection', + PrintConv => { + 0 => 'Off', + 98 => 'On', + }, + }, +); + +%Image::ExifTool::Sony::Tag9050a = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => q{ + Valid for SLT, ILCA, NEX and ILCE models, except ILCE-6300/6500/7RM2/7SM2, + ILCA-99M2. + }, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0x0031, 0x0105 ], + NOTES => q{ + Data for tags 0x9050, 0x94xx and 0x2010 is encrypted by a simple + substitution cipher, but the deciphered values are listed below. + }, + 0x0000 => { + Condition => '$$self{Model} !~ /^(NEX-|Lunar|ILCE-)/', + Name => 'SonyMaxAperture', # (at current focal length) + # seen values from 17 - 48 + ValueConv => '2 ** (($val/8 - 1.06) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x0001 => { + Condition => '$$self{Model} !~ /^(NEX-|Lunar|ILCE-)/', + Name => 'SonyMinAperture', # (at current focal length) + # seen values from 80 - 95 + ValueConv => '2 ** (($val/8 - 1.06) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, +# 0x0002 and 0x0004 (int16u) for SLT: +# appears to be difference between used FNumber and MaxAperture, 256 being +1 APEX or stop +# however, not always valid e.g. bracketing, Shutter-prio e.a. +# difference between 0x0002 and 0x0004 mostly 0.0, 0.1 or 0.2 stops. + 0x0020 => { + Name => 'Shutter', + Format => 'int16u[3]', + PrintConv => { + '0 0 0' => 'Silent / Electronic (0 0 0)', + OTHER => sub { + my ($val, $inv) = @_; + return $inv ? ($val=~/\((.*?)\)/ ? $1 : undef) : "Mechanical ($val)"; + }, + }, + }, + 0x0031 => { #JR + Name => 'FlashStatus', + RawConv => '$$self{FlashFired} = $val', + PrintConv => { + 0 => 'No Flash present', + 2 => 'Flash Inhibited', # seen for ILCE-7/7R continuous, panorama, HDR mode + 64 => 'Built-in Flash present', + 65 => 'Built-in Flash Fired', + 66 => 'Built-in Flash Inhibited', # seen for panorama, HDR, burst mode + 128 => 'External Flash present', # seen for NEX-5N/5T + 129 => 'External Flash Fired', # seen for SLT-A99V, ILCE-7R, NEX-5N/5R + }, + }, + 0x0032 => { #13 + Name => 'ShutterCount', + # this seems to be valid for the A7R,A37,A57,A65,A77,A99,A99V and possibly the + # NEX-5N/7. For the A99V it is definitely more than 16 bits, but it wraps at + # 65536 for the A7R. + Format => 'int32u', + Notes => q{ + total number of image exposures made by the camera, modulo 65536 for some + models + }, + RawConv => '$val & 0x00ffffff', + }, + 0x003a => { # appr. same value as Exif ExposureTime, but longer in HDR-modes + Name => 'SonyExposureTime', + Format => 'int16u', + ValueConv => '$val ? 2 ** (16 - $val/256) : 0', + ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x003c => { + Name => 'SonyFNumber', + Format => 'int16u', + ValueConv => '2 ** (($val/256 - 16) / 2)', + ValueConvInv => '(log($val)*2/log(2)+16)*256', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x003f => { + Name => 'ReleaseMode2', + %releaseMode2, + }, +# 0x004c - 0x005b: A-Mount: 16 values, only non-zero data for lenses giving "A-mount (3)" in 0x0104 below. +# e.g for SAL70400G2: 9 5 5 64 69 74 79 84 89 94 98 104 255 105 89 80 +# where 9 means 9 focal lengths: 64 ... 104, +# corresponding to 70-400mm via FocalLength = 4.375*2**($val/16) +# 0x004c, 0x0051: E-Mount: ShutterCount and dateTime + 0x004c => { # only ILCE-7/7R/7S/7M2/5000/5100/6000/QX1 - but appears not valid when flash is used ... + Name => 'ShutterCount2', + Condition => '($$self{Model} =~ /^(ILCE-(7(R|S|M2)?|[56]000|5100|QX1))\b/) and (($$self{FlashFired} & 0x01) != 1)', + Format => 'int32u', + RawConv => '$val & 0x00ffffff', + }, + 0x0051 => { # only ILCE-7/7R/7S/7M2/5000/5100/6000/QX1, but hours usually different from SonyDateTime - UTC? + # appears not valid (all '0') when flash is used, panorama, hdr modes ... + Name => 'SonyDateTime2', + Condition => '$$self{Model} =~ /^(ILCE-(7(R|S|M2)?|[56]000|5100|QX1))\b/', + Groups => { 2 => 'Time' }, + Shift => 'Time', + Format => 'undef[6]', + ValueConv => q{ + my @v = unpack('C*', $val); + return undef unless $v[0] > 0; + return sprintf("20%.2d:%.2d:%.2d %.2d:%.2d:%.2d", @v) + }, + ValueConvInv => q{ + my @v = ($val =~ /\d+/g); + return undef unless @v == 6 and ($v[0]-=2000) >= 0; + return pack('C*', @v); + }, + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,0)', + }, + 0x0067 => { + Name => 'ReleaseMode2', + Condition => '$$self{Model} !~ /^(SLT-A(65|77)V?|Lunar|NEX-(5N|7|VG20E))/', + %releaseMode2, + }, + 0x007c => { #JR valid for ILCE and most NEX + Name => 'InternalSerialNumber', #(NC) + Condition => '$$self{Model} !~ /^(Lunar|NEX-(5N|7|VG20E)|SLT-|HV|ILCA-)/', + Format => 'int8u[4]', + PrintConv => 'unpack "H*", pack "C*", split " ", $val', + }, + 0x00f0 => { #JR valid for SLT/ILCA models + Name => 'InternalSerialNumber', #(NC) + Condition => '$$self{Model} =~ /^(SLT-|HV|ILCA-)/', + Format => 'int8u[5]', + PrintConv => 'unpack "H*", pack "C*", split " ", $val', + PrintConvInv => 'join " ", unpack "C*", pack "H*", $val', + }, + # 0x0104 - same as 0x0105, but has value 3 for SAL18135, SAL50F14Z, SAL55300, SAL70200G2, SAL70300G2, SAL70400G2 + 0x0105 => { + Name => 'LensMount', + DataMember => 'LensMount', + RawConv => '$$self{LensMount} = $val', + PrintConv => { + 0 => 'Unknown', + 1 => 'A-mount', + 2 => 'E-mount', + }, + }, + 0x0106 => { + Name => 'LensFormat', + PrintConv => { + 0 => 'Unknown', + 1 => 'APS-C', + 2 => 'Full-frame', + }, + }, + 0x0107 => { + Name => 'LensType2', + Condition => '$$self{LensMount} == 2', + Format => 'int16u', + SeparateTable => 'LensType2', + PrintConv => \%sonyLensTypes2, + }, + 0x0109 => { + Name => 'LensType', + Condition => '$$self{LensMount} == 1', + Priority => 0, #PH (just to be safe) + Format => 'int16u', #PH + Notes => 'SLT models, and NEX with A-mount lenses', + SeparateTable => 1, + # has a value of 0 for E-mount lenses (values 0x80xx) + ValueConvInv => '($val & 0xff00) == 0x8000 ? 0 : int($val)', + PrintConv => \%sonyLensTypes, + }, + 0x010b => { + Name => 'DistortionCorrParamsPresent', + PrintConv => { 0 => 'No', 1 => 'Yes'}, + }, + 0x0114 => { + Name => 'APS-CSizeCapture', + Condition => '$$self{Model} =~ /^(SLT-A99|HV|ILCE-7)/', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + # 0x0115 and 0x0116, or 0x0116 and 0x0117: + # give the same info as the first and last bytes of LensSpec, + # but also for older Sony and Minolta lenses where all LensSpec bytes are 0. + 0x0115 => { + Name => 'LensSpecFeatures', + Condition => '$$self{Model} =~ /^(SLT-A(37|57|65|77)V?|Lunar|NEX-(F3|5N|7|VG20E))/', + Format => 'undef[2]', + ValueConv => 'join " ", unpack "H2H2", $val', + ValueConvInv => sub { + my @a = split(" ", shift); + return @a == 2 ? pack 'CC', hex($a[0]), hex($a[1]) : undef; + }, + PrintConv => \&PrintLensSpec, + PrintConvInv => 'Image::ExifTool::Sony::PrintInvLensSpec($val, $self, 1)', + }, + 0x0116 => { + Name => 'LensSpecFeatures', + Condition => '$$self{Model} !~ /^(SLT-A(37|57|65|77)V?|Lunar|NEX-(F3|5N|7|VG20E))/', + Format => 'undef[2]', + ValueConv => 'join " ", unpack "H2H2", $val', + ValueConvInv => sub { + my @a = split(" ", shift); + return @a == 2 ? pack 'CC', hex($a[0]), hex($a[1]) : undef; + }, + PrintConv => \&PrintLensSpec, + PrintConvInv => 'Image::ExifTool::Sony::PrintInvLensSpec($val, $self, 1)', + }, + +# 0x0122 => {Name=>'LensType',Format=>'int16u',Condition =>'$$self{Model}=~/^(SLT-A(37|57|65|77)V?|Lunar|NEX-(F3|5N|7|VG20E))/'}, +# 0x0123 => {Name=>'LensType',Format=>'int16u',Condition =>'$$self{Model}=~/^(SLT-A(58|99V?)|HV|ILCA-(68|77M2)|NEX-(3N|5R|5T|6|VG30E|VG900)|ILCE-(3000|3500|5000|5100|6000|7|7R|7S|7M2|QX1))/'}, +# 0x012d => {Name=>'LensType',Format=>'int16u',Condition =>'$$self{Model}=~/^(SLT-A(37|57|65|77)V?|Lunar|NEX-(F3|5N|7|VG20E))/'}, +# 0x012e => {Name=>'LensType',Format=>'int16u',Condition =>'$$self{Model}=~/^(SLT-A(58|99V?)|HV|ILCA-(68|77M2)|NEX-(3N|5R|5T|6|VG30E|VG900)|ILCE-(3000|3500|5000|5100|6000|7|7R|7S|7M2|QX1))/'}, + +# ShutterCount3 = ShutterCount for SLT-A58, ILCE, ILCA, NEX-3N +# ShutterCount-1 for SLT-A37,A57,A65,A77,A99, NEX-F3,5N,5R,5T,6,7, sometimes 0 +# ShutterCount-2 for NEX-VG, and often 0; "ShutterCount-2" also seen on a few A99V images +# The offset for ShutterCount3 changes with firmware version for the ILCE-7/7R/7S/7M2, so don't decode it for now: +# ILCE-7M2/7S: 0x01a0 (firmware 1.0x, 1.1x), 0x01b6 (firmware 1.20, 1.21, 2.00) +# ILCE-7/7R: 0x01aa (firmware 1.0x, 1.1x), 0x01c0 (firmware 1.20, 1.21, 2.00) +# Similarly for ILCE-6000 v2.00: 0x01aa --> 0x01c0: removed from 0x01aa + 0x01a0 => { + Name => 'ShutterCount3', + Format => 'int32u', + RawConv => '$val == 0 ? undef : $val', + Condition => '$$self{Model} =~ /^(ILCE-(5100|QX1)|ILCA-(68|77M2))/', + }, + 0x01aa => { + Name => 'ShutterCount3', + Format => 'int32u', + RawConv => '$val == 0 ? undef : $val', + Condition => '$$self{Model} =~ /^(SLT-A(58|99V?)|HV|NEX-(3N|5R|5T|6|VG900|VG30E)|ILCE-([35]000|3500))\b/', + }, + 0x01bd => { + Name => 'ShutterCount3', + Format => 'int32u', + RawConv => '$val == 0 ? undef : $val', + Condition => '$$self{Model} =~ /^(SLT-A(37|57|65|77)V?|Lunar|NEX-(F3|5N|7|VG20E))/', + }, + +# 0x0222 => {Name=>'LensType2',Format=>'int16u',Condition =>'$$self{Model}=~/^(ILCE-(5100|7S|7M2|QX1))/'}, +# 0x0224 => {Name=>'LensType', Format=>'int16u',Condition =>'$$self{Model}=~/^(ILCE-(5100|7S|7M2|QX1)|ILCA-(68|77M2))/'}, +# 0x0229 => {Name=>'LensType2',Format=>'int16u',Condition =>'$$self{Model}=~/^(NEX-(5R|5T|6|VG30E|VG900))/'}, +# 0x022b => {Name=>'LensType', Format=>'int16u',Condition =>'$$self{Model}=~/^(NEX-(5R|5T|6|VG30E|VG900))/'}, +# 0x022c => {Name=>'LensType2',Format=>'int16u',Condition =>'$$self{Model}=~/^(ILCE-(3000|3500|5000|6000|7|7R)|NEX-3N)\b/'}, +# 0x022e => {Name=>'LensType', Format=>'int16u',Condition =>'$$self{Model}=~/^(ILCE-(3000|3500|5000|6000|7|7R)|NEX-3N|SLT-A(58|99V?)|HV)\b/'}, + +# 0x0231 => {Name=>'LensSpecFeatures',Format=>'undef[2]',Condition=>'$$self{Model}=~/^(ILCE-(7S|7M2|5100|QX1)|ILCA-(68|77M2))/'}, +# 0x0238 => {Name=>'LensSpecFeatures',Format=>'undef[2]',Condition=>'$$self{Model}=~/^(NEX-(5R|5T|6|VG30E|VG900))/'}, +# 0x023b => {Name=>'LensSpecFeatures',Format=>'undef[2]',Condition=>'$$self{Model}=~/^(SLT-A(58|99V?)|HV|ILCE-(3000|3500|5000|6000|7|7R)|NEX-3N)\b/'}, + +# 0x023c => {Name=>'LensType2',Format=>'int16u',Condition =>'$$self{Model}=~/^(Lunar|NEX-(F3|5N|7|VG20E))/'}, +# 0x023e => {Name=>'LensType', Format=>'int16u',Condition =>'$$self{Model}=~/^(SLT-A(37|57|65|77)V?|Lunar|NEX-(F3|5N|7|VG20E)|ILCE-(5100|7S|7M2|QX1)|ILCA-(68|77M2))/'}, +# 0x0245 => {Name=>'LensType', Format=>'int16u',Condition =>'$$self{Model}=~/^(NEX-(5R|5T|6|VG30E|VG900))/'}, +# 0x0248 => {Name=>'LensType', Format=>'int16u',Condition =>'$$self{Model}=~/^(SLT-A(58|99V?)|HV|ILCE-(3000|3500|5000|6000|7|7R)|NEX-3N)\b/'}, +# 0x0249 => {Name=>'LensType', Format=>'int16u',Condition =>'$$self{Model}=~/^(ILCE-(5100|7S|7M2|QX1)|ILCA-(68|77M2))/'}, + +# 0x024a => {Name=>'LensSpecFeatures',Format=>'undef[2]',Condition=>'$$self{Model}=~/^(SLT-A(37|57|65|77)V?|Lunar|NEX-(F3|5N|7|VG20E))/'}, + +# 0x0250 => {Name=>'LensType', Format=>'int16u',Condition =>'$$self{Model}=~/^(NEX-(5R|5T|6|VG30E|VG900))/'}, +# 0x0253 => {Name=>'LensType', Format=>'int16u',Condition =>'$$self{Model}=~/^(SLT-A(58|99V?)|HV|ILCE-(3000|3500|5000|6000|7|7R|7S|7M2)|NEX-3N)\b/'}, +# 0x0257 => {Name=>'LensType', Format=>'int16u',Condition =>'$$self{Model}=~/^(SLT-A(37|57|65|77)V?|Lunar|NEX-(F3|5N|7|VG20E))/'}, +# 0x0262 => {Name=>'LensType', Format=>'int16u',Condition =>'$$self{Model}=~/^(SLT-A(37|57|65|77)V?|Lunar|NEX-(F3|5N|7|VG20E))/'}, + +# 0x031b => {%gain2010,Condition=>'$$self{Model}=~/^(DSC-RX100M3|ILCA-(68|77M2)|ILCE-(5100|7S|7M2|QX1))/'}, +# 0x032c => {%gain2010,Condition=>'$$self{Model}=~/^(NEX-(5R|5T|6|VG30E|VG900))/'}, +# 0x032f => {%gain2010,Condition=>'$$self{Model}=~/^(DSC-RX10|SLT-A(58|99V?)|HV|ILCE-(3000|3500|5000|6000|7|7R)|NEX-3N)\b/'}, +# 0x0350 => {%gain2010,Condition=>'$$self{Model}=~/^(SLT-A(37|57)|NEX-F3)/'}, +# 0x037b => {%gain2010,Condition=>'$$self{Model}=~/^(SLT-A(65|77)V?|Lunar|NEX-(7|VG20E))/'}, +); + +%Image::ExifTool::Sony::Tag9050b = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => q{ + Valid from July 2015 for ILCE-6100/6300/6400/6500/6600/7C/7M3/7RM2/7RM3/7RM4/ + 7SM2/9/9M2, ILCA-99M2. + }, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0x0039, 0x0105 ], + 0x0000 => { + Condition => '$$self{Model} =~ /^(ILCA-)/', + Name => 'SonyMaxAperture', # (at current focal length) + # seen values from 17 - 48 + ValueConv => '2 ** (($val/8 - 1.06) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x0001 => { + Condition => '$$self{Model} =~ /^(ILCA-)/', + Name => 'SonyMinAperture', # (at current focal length) + # seen values from 80 - 95 + ValueConv => '2 ** (($val/8 - 1.06) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 0x0026 => { + Name => 'Shutter', + Format => 'int16u[3]', + PrintConv => { + '0 0 0' => 'Silent / Electronic (0 0 0)', + OTHER => sub { + my ($val, $inv) = @_; + return $inv ? ($val=~/\((.*?)\)/ ? $1 : undef) : "Mechanical ($val)"; + }, + }, + }, + #0x002c => { + # Name => 'Shutter', + # Condition => '$$self{Model} !~ /^(ILCE-6400)/ and $$self{Software} !~ /^ILCE-9 v5.0/', + # PrintConv => { + # 0 => 'Silent / Electronic', + # 56 => 'Mechanical', + # }, + #}, + 0x0039 => { + Name => 'FlashStatus', + RawConv => '$$self{FlashFired} = $val', + PrintConv => { + 0 => 'No Flash present', + 2 => 'Flash Inhibited', # seen for ILCE-7/7R continuous, panorama, HDR mode + 64 => 'Built-in Flash present', + 65 => 'Built-in Flash Fired', + 66 => 'Built-in Flash Inhibited', # seen for panorama, HDR, burst mode + 128 => 'External Flash present', # seen for NEX-5N/5T + 129 => 'External Flash Fired', # seen for SLT-A99V, ILCE-7R, NEX-5N/5R +# 131 => 'External Flash ???', # seen for ILCE-7RM4 + }, + }, + 0x003a => { + Name => 'ShutterCount', + # or "ShutterCount"? : number of shutter actuations, does not increase during Silent Shooting, + # at least for ILCE-7RM2 + Format => 'int32u', + Notes => 'total number of image exposures made by the camera', + RawConv => '$val & 0x00ffffff', + }, + 0x0046 => { # appr. same value as Exif ExposureTime, but longer in HDR-modes + Name => 'SonyExposureTime', + Format => 'int16u', + ValueConv => '$val ? 2 ** (16 - $val/256) : 0', + ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x0048 => { + Name => 'SonyFNumber', + Format => 'int16u', + ValueConv => '2 ** (($val/256 - 16) / 2)', + ValueConvInv => '(log($val)*2/log(2)+16)*256', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x004b => { + Name => 'ReleaseMode2', + %releaseMode2, + }, +# March 2019: ILCE-9 with v5.0x firmware follows ILCE-6400 in many tags ... + 0x0050 => { + Name => 'ShutterCount2', + Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7RM4A?|9M2)|ZV-E10)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/)', + Format => 'int32u', + RawConv => '$val & 0x00ffffff', + }, + 0x0052 => { + Name => 'ShutterCount2', + Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-(7M3|7RM3A?))/)', + Format => 'int32u', + RawConv => '$val & 0x00ffffff', + }, +# 0x0058 - 0x0067: A-Mount: 16 values, only non-zero data for lenses giving "A-mount (3)" in 0x0104 below. +# e.g for SAL70400G2: 9 5 5 64 69 74 79 84 89 94 98 104 255 105 89 80 +# where 9 means 9 focal lengths: 64 ... 104, +# corresponding to 70-400mm via FocalLength = 4.375*2**($val/16) +# 0x0058, 0x0061: E-Mount: ShutterCount and dateTime + 0x0058 => { # appears not valid when flash is used ... not for ILCA-99M2 + Name => 'ShutterCount2', + Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9M2)|ZV-E10)/) and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/', + Format => 'int32u', + RawConv => '$val & 0x00ffffff', + }, + 0x0061 => { # only minutes-seconds, not for ILCA-99M2, ILCE-9 + Name => 'SonyTimeMinSec', + Condition => '$$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|ZV-E10)/', + Format => 'undef[2]', + ValueConv => q{ + my @v = unpack('C*', $val); + return sprintf("%.2d:%.2d", @v) + }, + }, + 0x006b => { + Name => 'ReleaseMode2', + Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7RM4A?|9M2)|ZV-E10)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/', + %releaseMode2, + }, + 0x006d => { + Name => 'ReleaseMode2', + Condition => '$$self{Model} =~ /^(ILCE-(7M3|7RM3A?))/', + %releaseMode2, + }, + 0x0073 => { + Name => 'ReleaseMode2', + Condition => '$$self{Model} !~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9M2)|ZV-E10)/ and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/', + %releaseMode2, + }, + 0x0088 => { + Name => 'InternalSerialNumber', #(NC) + Format => 'int8u[6]', + PrintConv => 'unpack "H*", pack "C*", split " ", $val', + }, + +##### same offsets for lens info tags + + # 0x0104 - same as 0x0105, but has value 3 for SAL18135, SAL50F14Z, SAL55300, SAL70200G2, SAL70300G2, SAL70400G2 + 0x0105 => { + Name => 'LensMount', + DataMember => 'LensMount', + RawConv => '$$self{LensMount} = $val', + PrintConv => { + 0 => 'Unknown', + 1 => 'A-mount', + 2 => 'E-mount', + }, + }, + 0x0106 => { + Name => 'LensFormat', + PrintConv => { + 0 => 'Unknown', + 1 => 'APS-C', + 2 => 'Full-frame', + }, + }, + 0x0107 => { + Name => 'LensType2', + Condition => '$$self{LensMount} == 2', + Format => 'int16u', + SeparateTable => 'LensType2', + PrintConv => \%sonyLensTypes2, + }, + 0x0109 => { + Name => 'LensType', + Condition => '$$self{LensMount} == 1', + Priority => 0, #PH (just to be safe) + Format => 'int16u', #PH + Notes => 'SLT models, and NEX with A-mount lenses', + SeparateTable => 1, + # has a value of 0 for E-mount lenses (values 0x80xx) + ValueConvInv => '($val & 0xff00) == 0x8000 ? 0 : int($val)', + PrintConv => \%sonyLensTypes, + }, + 0x010b => { + Name => 'DistortionCorrParamsPresent', + PrintConv => { 0 => 'No', 1 => 'Yes'}, + }, + 0x0114 => { + Name => 'APS-CSizeCapture', + Condition => '$$self{Model} =~ /^(ILCE-7|ILCE-9|ILCA-99)/', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + # 0x0116 and 0x0117: + # give the same info as the first and last bytes of LensSpec, + # but also for older Sony and Minolta lenses where all LensSpec bytes are 0. + 0x0116 => { + Name => 'LensSpecFeatures', + Format => 'undef[2]', + ValueConv => 'join " ", unpack "H2H2", $val', + ValueConvInv => sub { + my @a = split(" ", shift); + return @a == 2 ? pack 'CC', hex($a[0]), hex($a[1]) : undef; + }, + PrintConv => \&PrintLensSpec, + PrintConvInv => 'Image::ExifTool::Sony::PrintInvLensSpec($val, $self, 1)', + }, +# +# tags becoming model- and/or firmware-dependent from here. +# + 0x019f => { + Name => 'ShutterCount3', + Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|ZV-E10)\b/', + Format => 'int32u', + RawConv => '$val == 0 ? undef : $val', + }, + 0x01cb => { + Name => 'ShutterCount3', + Condition => '$$self{Model} =~ /^(ILCE-(7RM2|7SM2))/', + Format => 'int32u', + RawConv => '$val == 0 ? undef : $val', + }, + 0x01cd => { + Name => 'ShutterCount3', + Condition => '$$self{Model} =~ /^(ILCE-(6300|6500)|ILCA-99M2)/', + Format => 'int32u', + RawConv => '$val == 0 ? undef : $val', + }, + 0x01eb => { + Name => 'APS-CSizeCapture', + Condition => '$$self{Model} =~ /^ILCE-(7RM4A?|7C|9M2)|ZV-E10/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 0x01ed => { + Name => 'LensSpecFeatures', + Condition => '$$self{Model} =~ /^ILCE-(7RM4A?|7C|9M2)|ZV-E10/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/', + Priority => 0, + Format => 'undef[2]', + ValueConv => 'join " ", unpack "H2H2", $val', + ValueConvInv => sub { + my @a = split(" ", shift); + return @a == 2 ? pack 'CC', hex($a[0]), hex($a[1]) : undef; + }, + PrintConv => \&PrintLensSpec, + PrintConvInv => 'Image::ExifTool::Sony::PrintInvLensSpec($val, $self, 1)', + }, + 0x01ee => { + Name => 'APS-CSizeCapture', + Condition => '$$self{Model} =~ /^(ILCE-(7M3|7RM3A?|9))\b/ and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 0x01f0 => { + Name => 'LensSpecFeatures', + Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3A?|9))\b/ and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/', + Priority => 0, + Format => 'undef[2]', + ValueConv => 'join " ", unpack "H2H2", $val', + ValueConvInv => sub { + my @a = split(" ", shift); + return @a == 2 ? pack 'CC', hex($a[0]), hex($a[1]) : undef; + }, + PrintConv => \&PrintLensSpec, + PrintConvInv => 'Image::ExifTool::Sony::PrintInvLensSpec($val, $self, 1)', + }, +# the following tags are commented out because they can cause problems for the +# Composite LensID of non-electronic lenses (even if Priority is set to 0) +# 0x020d => { +# Name=>'LensType2', +# Condition => '$$self{Model} =~ /^(ILCE-(7RM2|7SM2))/', +# Format=>'int16u', +# }, +# 0x020f => [{ +# Name=>'LensType', +# Condition => '$$self{Model} =~ /^(ILCE-(7RM2|7SM2))/', +# Format=>'int16u', +# },{ +# Name=>'LensType2', +# Condition => '$$self{Model} =~ /^(ILCE-(6300|6500)|ILCA-99M2)/', +# Format=>'int16u', +# }], +# 0x0211 => { +# Name=>'LensType', +# Condition => '$$self{Model} =~ /^(ILCE-(6300|6500)|ILCA-99M2)/', +# Format=>'int16u', +# }, + 0x021a => { + Name => 'APS-CSizeCapture', + Condition => '$$self{Model} =~ /^(ILCE-(7RM2|7SM2))/', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 0x021c => [{ + Name => 'LensSpecFeatures', + Condition => '$$self{Model} =~ /^(ILCE-(7RM2|7SM2))/', + Priority => 0, + Format => 'undef[2]', + ValueConv => 'join " ", unpack "H2H2", $val', + ValueConvInv => sub { + my @a = split(" ", shift); + return @a == 2 ? pack 'CC', hex($a[0]), hex($a[1]) : undef; + }, + PrintConv => \&PrintLensSpec, + PrintConvInv => 'Image::ExifTool::Sony::PrintInvLensSpec($val, $self, 1)', + },{ + Name => 'APS-CSizeCapture', + Condition => '$$self{Model} =~ /^(ILCA-99M2)/', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }], + 0x021e => { + Name => 'LensSpecFeatures', + Condition => '$$self{Model} =~ /^(ILCE-(6300|6500)|ILCA-99M2)/', + Priority => 0, + Format => 'undef[2]', + ValueConv => 'join " ", unpack "H2H2", $val', + ValueConvInv => sub { + my @a = split(" ", shift); + return @a == 2 ? pack 'CC', hex($a[0]), hex($a[1]) : undef; + }, + PrintConv => \&PrintLensSpec, + PrintConvInv => 'Image::ExifTool::Sony::PrintInvLensSpec($val, $self, 1)', + }, +); + +%Image::ExifTool::Sony::Tag9050c = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => q{ + Valid from July 2020 for ILCE-1/7SM3, ILME-FX3. + }, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0x0039 ], + 0x0026 => { + Name => 'Shutter', + Format => 'int16u[3]', + PrintConv => { + '0 0 0' => 'Silent / Electronic (0 0 0)', + OTHER => sub { + my ($val, $inv) = @_; + return $inv ? ($val=~/\((.*?)\)/ ? $1 : undef) : "Mechanical ($val)"; + }, + }, + }, + 0x0039 => { + Name => 'FlashStatus', + RawConv => '$$self{FlashFired} = $val', + PrintConv => { + 0 => 'No Flash present', + 2 => 'Flash Inhibited', # seen for ILCE-7/7R continuous, panorama, HDR mode + 64 => 'Built-in Flash present', + 65 => 'Built-in Flash Fired', + 66 => 'Built-in Flash Inhibited', # seen for panorama, HDR, burst mode + 128 => 'External Flash present', # seen for NEX-5N/5T + 129 => 'External Flash Fired', # seen for SLT-A99V, ILCE-7R, NEX-5N/5R + }, + }, + 0x003a => { + Name => 'ShutterCount', + # or "ShutterCount"? : number of shutter actuations, does not increase during Silent Shooting, + # at least for ILCE-7RM2 + Format => 'int32u', + Notes => 'total number of image exposures made by the camera', + RawConv => '$val & 0x00ffffff', + PrintConv => 'sprintf("%6d",$val)', + }, + 0x0046 => { # appr. same value as Exif ExposureTime, but longer in HDR-modes + Name => 'SonyExposureTime', + Format => 'int16u', + ValueConv => '$val ? 2 ** (16 - $val/256) : 0', + ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x0048 => { + Name => 'SonyFNumber', + Format => 'int16u', + ValueConv => '2 ** (($val/256 - 16) / 2)', + ValueConvInv => '(log($val)*2/log(2)+16)*256', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x004b => { + Name => 'ReleaseMode2', + %releaseMode2, + }, + 0x0050 => { + Name => 'ShutterCount2', + Condition => '($$self{FlashFired} & 0x01) != 1', + Format => 'int32u', + RawConv => '$val & 0x00ffffff', + }, + 0x0066 => { # appr. same value as Exif ExposureTime, but not valid in HDR-modes + Name => 'SonyExposureTime', + Format => 'int16u', + ValueConv => '$val ? 2 ** (16 - $val/256) : 0', + ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x0068 => { # appr. same value as Exif ExposureTime, but not valid in HDR-modes + Name => 'SonyFNumber', + Format => 'int16u', + ValueConv => '2 ** (($val/256 - 16) / 2)', + ValueConvInv => '(log($val)*2/log(2)+16)*256', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x006b => { + Name => 'ReleaseMode2', + %releaseMode2, + }, + 0x0088 => { + Name => 'InternalSerialNumber', #(NC) + Condition => '$$self{Model} =~ /^(ILCE-(7M4|7SM3)|ILME-FX3)/', + Format => 'int8u[6]', + PrintConv => 'unpack "H*", pack "C*", split " ", $val', + }, + 0x008a => { + Name => 'InternalSerialNumber', #(NC) + Condition => '$$self{Model} =~ /^(ILCE-1)/', + Format => 'int8u[6]', + PrintConv => 'unpack "H*", pack "C*", split " ", $val', + }, +); + +%Image::ExifTool::Sony::Tag9400a = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => 'Valid for many DSC, NEX and SLT models', + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x0008 => { %sequenceImageNumber }, #PH + 0x000c => { %sequenceFileNumber }, #PH + 0x0010 => { %releaseMode2 }, + 0x0012 => { + Name => 'DigitalZoom', + Condition => '$$self{Model} !~ /^(SLT-(A65|A77)V?|NEX-(5N|7|VG20E)|Lunar|DSC-(HX10V|HX20V|HX200V|TX20|TX55|TX300V|WX30|WX70))\b/', + PrintConv => { + 0 => 'No', + 1 => 'Yes', + }, + }, +# 0x0013 - Flash fired 0=no, 1=yes +# 0x0014 - related to flash / RedEyeReduction ? +# 0x0015 - CameraType: 1=HDR, 2=DSC, 3=SLT/NEX + 0x001a => { #PH + Name => 'ShotNumberSincePowerUp', + Format => 'int32u', + }, +# 0x001e - increments by 4 or 6 or 8 each shutter release press since power up +# 0x001f - 0=most pictures, 1='Self-timer/Self-portrait', 2='Self-portrait (2 people)', +# 3='Continuous Self-timer', 26='Sweep Panorama' (PH, RX100) +# 0x0021 - maybe related to Image Stabilization or Smile Shutter ? + 0x0022 => { + Name => 'SequenceLength', + PrintConv => { + 0 => 'Continuous', # (RX100 too) + 1 => '1 shot', + 2 => '2 shots', # (Background defocus, 3D Image) + 3 => '3 shots', # (HDR, WB Bracketing) (RX100, also continuous bracket) + 4 => '4 shots', # seen for DSC-WX300 in Superior-Auto Anti-Motion-Blur + 5 => '5 shots', # (PH, RX100) + 6 => '6 shots', # (Multi Frame NR, Anti Motion blur, Hand-held Twilight) + 10 => '10 shots', # (HX9V Burst) + 100 => 'Continuous - iSweep Panorama', # (HX9V) + 200 => 'Continuous - Sweep Panorama', + }, + }, +# 0x0027 - 1=single exposure, 2=multi-exposure (eg. pano,some superior auto) (PH, RX100) + 0x0028 => { + Name => 'CameraOrientation', # (also RX100 - PH) + PrintConv => { + 1 => 'Horizontal (normal)', + 3 => 'Rotate 180', + 6 => 'Rotate 90 CW', + 8 => 'Rotate 270 CW', + }, + }, + 0x0029 => { + Name => 'Quality2', # (also RX100 - PH) + PrintConv => { + 0 => 'JPEG', + 1 => 'RAW', + 2 => 'RAW + JPEG', + 3 => 'JPEG + MPO', # 3D images + }, + }, +# 0x002b - FacesDetected_OK 0=no, 1=yes appears valid for SLT, but not for NEX and DSC-HX9V +# 0x0030 - long exposure noise reduction used 0=no, 1=yes (PH, RX100) +# 0x0031 - smile shutter used 0=no, 1=yes (PH, RX100) +# 0x0033 - 0 for DSC-HX9V, 8 for SLT, NEX +# 0x0034 and 0x0038 - different offset for HX9V and SLT/NEX, but similar numbers, non-zero when flash fired + 0x0044 => { + Condition => '$$self{Model} =~ /^(SLT-|HV|NEX-|Lunar|DSC-RX|Stellar)/', # not valid for most other DSC and HDR models + Name => 'SonyImageHeight', + Format => 'int16u', + PrintConv => '$val > 0 ? 8*$val : "n.a."', + }, + 0x0052 => { + Name => 'ModelReleaseYear', + Condition => '$$self{Model} =~ /^(SLT-|HV|NEX-|Lunar|DSC-RX|Stellar)/', # not valid for most other DSC and HDR models + Format => 'int8u', + PrintConv => 'sprintf("20%.2d", $val)', + }, +); + +%Image::ExifTool::Sony::Tag9400b = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => q{ + Valid for NEX-3N, ILCE-3000/3500, SLT-A58, DSC-WX60, DSC-WX300, DSC-RX100M2, + DSC-HX50V, DSC-QX10/QX100. + }, + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x0008 => { %sequenceImageNumber }, #PH + 0x000c => { %sequenceFileNumber }, #PH + 0x0010 => { %releaseMode2 }, + 0x0012 => { + Name => 'DigitalZoom', + PrintConv => { + 0 => 'No', + 1 => 'Yes', + }, + }, +# 0x0013 - Flash fired 0=no, 1=yes +# 0x0014 - related to flash / RedEyeReduction ? +# 0x0015 - CameraType: 1=HDR, 2=DSC, 3=SLT/NEX + 0x0016 => { #PH + Name => 'ShotNumberSincePowerUp', + Format => 'int32u', + }, + 0x001e => { + Name => 'SequenceLength', + PrintConv => { + 0 => 'Continuous', + 1 => '1 shot', + 2 => '2 shots', + 3 => '3 shots', + 4 => '4 shots', + 5 => '5 shots', + 6 => '6 shots', + 10 => '10 shots', + 100 => 'Continuous - iSweep Panorama', + 200 => 'Continuous - Sweep Panorama', + }, + }, + 0x0024 => { + Name => 'CameraOrientation', + PrintConv => { + 1 => 'Horizontal (normal)', + 3 => 'Rotate 180', + 6 => 'Rotate 90 CW', + 8 => 'Rotate 270 CW', + }, + }, + 0x0025 => { + Name => 'Quality2', + PrintConv => { + 0 => 'JPEG', + 1 => 'RAW', + 2 => 'RAW + JPEG', + 3 => 'JPEG + MPO', # 3D images + }, + }, +# 0x0027 - FacesDetected_OK 0=no, 1=yes +# 0x002c - long exposure noise reduction used 0=no, 1=yes (PH, RX100) + 0x003f => { + Name => 'SonyImageHeight', + Format => 'int16u', + PrintConv => '$val > 0 ? 8*$val : "n.a."', + }, + 0x0046 => { # but Panorama images give incorrect result + Name => 'ModelReleaseYear', + Format => 'int8u', + PrintConv => 'sprintf("20%.2d", $val)', + }, +); + +%Image::ExifTool::Sony::Tag9400c = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + WRITABLE => 1, + NOTES => q{ + Valid for DSC-HX60V/HX80/HX90V/HX99/HX350/HX400V/QX30/RX0/RX1RM2/RX10/ + RX10M2/RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/WX220/ + WX350/WX500, ILCE-1/7/7C/7R/7S/7M2/7M3/7RM2/7RM3/7RM4/7SM2/7SM3/9/9M2/5000/ + 5100/6000/6100/6300/6400/6500/6600/QX1, ILCA-68/77M2/99M2. + }, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x0009 => { %releaseMode2 }, + 0x000a => { + Name => 'ShotNumberSincePowerUp', + Condition => '$$self{Model} =~ /^(ILCA-(68|77M2|99M2)|ILCE-(5000|5100|6000|6300|6500|7|7M2|7R|7RM2|7S|7SM2|QX1)|DSC-(HX350|HX400V|HX60V|HX80|HX90|HX90V|QX30|RX0|RX1RM2|RX10|RX10M2|RX10M3|RX100M3|RX100M4|RX100M5|WX220|WX350|WX500))\b/', + Notes => 'valid only for some models', + Format => 'int32u', + }, + 0x0012 => { %sequenceImageNumber }, + 0x0016 => { + Name => 'SequenceLength', + PrintConv => { + 0 => 'Continuous', + 1 => '1 shot', + 2 => '2 shots', + 3 => '3 shots', + 4 => '4 shots', + 5 => '5 shots', + 6 => '6 shots', + 7 => '7 shots', # DSC-RX100M7 Single Burst Shooting + 9 => '9 shots', # ILCE-7RM2 9-shot bracketing + 10 => '10 shots', + 12 => '12 shots', # ILCA-77M2 12-shot MFNR-mode + 16 => '16 shots', # ILCE-7RM4 16-shot PixelShift + 100 => 'Continuous - iSweep Panorama', + 200 => 'Continuous - Sweep Panorama', + }, + }, + 0x001a => { %sequenceFileNumber }, + 0x001e => { + Name => 'SequenceLength', + PrintConv => { + 0 => 'Continuous', + 1 => '1 file', + 2 => '2 files', + 3 => '3 files', + 5 => '5 files', + 7 => '7 files', # DSC-RX100M7 Single Burst Shooting + 9 => '9 files', # ILCE-7RM2 9-shot bracketing + 10 => '10 files', # seen for DSC-WX500 with burst of 10 shots + }, + }, + 0x0029 => { + Name => 'CameraOrientation', + PrintConv => { + 1 => 'Horizontal (normal)', + 3 => 'Rotate 180', + 6 => 'Rotate 90 CW', + 8 => 'Rotate 270 CW', + }, + }, + 0x002a => [{ + Name => 'Quality2', + Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)\b/', + PrintConv => { + 0 => 'JPEG', + 1 => 'RAW', + 2 => 'RAW + JPEG', + 3 => 'JPEG + MPO', # 3D images + }, + },{ + Name => 'Quality2', + Condition => '$$self{Model} =~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)\b/', + PrintConv => { + 1 => 'JPEG', + 2 => 'RAW', + 3 => 'RAW + JPEG', + 4 => 'HEIF', + 6 => 'RAW + HEIF', + }, + }], + 0x0047 => { + Name => 'SonyImageHeight', + Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)\b/', + Format => 'int16u', + PrintConv => '$val > 0 ? 8*$val : "n.a."', + }, + 0x0053 => { + Name => 'ModelReleaseYear', + Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)\b/', + Format => 'int8u', + PrintConv => 'sprintf("20%.2d", $val)', + }, +); + +%Image::ExifTool::Sony::Tag9401 = ( # JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0 ], + IS_SUBDIR => [ 0x0498, 0x049d, 0x04a1, 0x04a2, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ], + 0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' }, + + 0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } }, + 0x049d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } }, + 0x04a1 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(160|164)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } }, + 0x04a2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(152|154|155)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } }, + 0x059d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(144|146)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } }, + 0x0634 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 68', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } }, + 0x0636 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(73|74)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } }, + 0x064c => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 78', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } }, + 0x0653 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 90', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } }, + 0x0678 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(93|94)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } }, + 0x06b8 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(100|103)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } }, + 0x06de => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(124|125)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } }, + 0x06e7 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(127|128|130)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } }, +); + +%Image::ExifTool::Sony::ISOInfo = ( # JR + FORMAT => 'int8u', + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + 0x0000 => { Name => 'ISOSetting', ValueConv => \%isoSetting2010 }, + 0x0002 => { Name => 'ISOAutoMin', ValueConv => \%isoSetting2010 }, + 0x0004 => { Name => 'ISOAutoMax', ValueConv => \%isoSetting2010 }, +); + +# PH (RX100) +%Image::ExifTool::Sony::Tag9402 = ( + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0x02 ], + PRIORITY => 0, + 0x02 => { + Name => 'TempTest1', + DataMember => 'TempTest1', + Hidden => 1, + RawConv => '$$self{TempTest1}=$val; $$self{OPTIONS}{Unknown}<2 ? undef : $val', + }, + 0x04 => { + Name => 'AmbientTemperature', + # this (and many other values) are only valid if 0x02 is 255 (why?) + Condition => '$$self{TempTest1} == 255', + Format => 'int8s', # (verified for negative temperature) + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + 0x16 => { #JR + Name => 'FocusMode', + Mask => 0x7f, # (often +128, not sure what upper bit is for) + PrintConv => { + 0 => 'Manual', + 2 => 'AF-S', + 3 => 'AF-C', + 4 => 'AF-A', # seen in ILCE-6000 images + 6 => 'DMF', + # 7 => 'AF-D', # not for DSC, NEX, ILCE ... + }, + }, + 0x17 => { + Name => 'AFAreaMode', + PrintConv => { + 0 => 'Multi', # newer DSC/ILC use name 'Wide' + 1 => 'Center', + 2 => 'Spot', #(NC) seen for DSC-WX300 + 3 => 'Flexible Spot', + 10 => 'Selective (for Miniature effect)', # seen for DSC-HX30V,TX30,WX60,WX100 + 11 => 'Zone', #JR (ILCE-7 series) + 12 => 'Expanded Flexible Spot', #JR (HX90V, ILCE-7 series) + 14 => 'Tracking', + 15 => 'Face Tracking', + 20 => 'Animal Eye Tracking', +# 21 => '???', # (ILCE-7SM3) + 255 => 'Manual', + }, + }, + # 0x24, 0x26: factor 10 for NEX and ILCE, factor 100 for DSC + # 0x24, 0x26, 0x28, 0x2a: inconsistent for A-mount lenses on NEX/ILCE: some correct, some 0, some incorrect ... + # 0x28 - not valid for DSC-[HTW]X models, or DSC-RX100 +# 0x24 => { # same values as Exif FocalLength (but have seen FocalLength for previous shot, ref IB, RX100M5) +# Name => 'FocalLength', +# Format => 'int16u', +# RawConv => '$val || undef', +# ValueConv => '$val / ($$self{Model}=~/DSC/ ? 100 : 10)', +# ValueConvInv => '$val * ($$self{Model}=~/DSC/ ? 100 : 10)', +# PrintConv => 'sprintf("%.1f mm",$val)', +# PrintConvInv => '$val =~ s/ ?mm//; $val', +# }, +# 0x26 => { # usually identical to 0x24 or 0 +# Name => 'FocalLength', +# Format => 'int16u', +# ValueConv => '$val / ($$self{Model}=~/DSC/ ? 100 : 10)', +# ValueConvInv => '$val * ($$self{Model}=~/DSC/ ? 100 : 10)', +# PrintConv => 'sprintf("%.1f mm",$val)', +# PrintConvInv => '$val =~ s/ ?mm//; $val', +# }, +# 0x28 => { # values slightly different from Exif FocalLength +# Name => 'FocalLength2', +# Format => 'int16u', +# RawConv => '$val || undef', +# ValueConv => '$val / 10', +# ValueConvInv => '$val * 10', +# PrintConv => 'sprintf("%.1f mm",$val)', +# PrintConvInv => '$val =~ s/ ?mm//; $val', +# }, +# 0x2a => { # usually identical to 0x28 or 0 +# Name => 'FocalLength2', +# Format => 'int16u', +# ValueConv => '$val / 10', +# ValueConvInv => '$val * 10', +# PrintConv => 'sprintf("%.1f mm",$val)', +# PrintConvInv => '$val =~ s/ ?mm//; $val', +# }, +# 0x002c => { +# # seen values from 80 - 255 (= infinity) -- see Composite:FocusDistance2 below +# Name => 'FocusPosition2', +# Condition => '$$self{Model} !~ /^(DSC-|Stellar)/', +# }, + 0x002d => { # usually same as 0x002c, but some differences + # seen values from 80 - 255 (= infinity) -- see Composite:FocusDistance2 below + Name => 'FocusPosition2', + Condition => '$$self{Model} !~ /^(DSC-|Stellar)/', + }, + # 0x8a - int32u: some sort of accumulated time or something since power up + # (doesn't increment during continuous shooting and at some other times) +); + +# PH (RX100) +%Image::ExifTool::Sony::Tag9403 = ( + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0x04 ], + 0x04 => { + # seen values 0,2,3,18,19,32,49,50,83,130,132,148,213,229,255 + # CameraTemperature is valid for all values above except ==0 and >=130 + Name => 'TempTest2', + DataMember => 'TempTest2', + Hidden => 1, + RawConv => '$$self{TempTest2}=$val; $$self{OPTIONS}{Unknown}<2 ? undef : $val', + }, + 0x05 => { + Name => 'CameraTemperature', # (maybe SensorTemperature? - heats up when taking movies) + Condition => '$$self{TempTest2} and $$self{TempTest2} < 100', + Format => 'int8s', # have seen as low as -1 for AmbientTemperature of -18 + PrintConv => '"$val C"', + PrintConvInv => '$val=~s/ ?C//; $val', + }, + # 0x0f - same as 0x05 + # 0x18 - maybe another temperature? +); + +# Tag9404 (ref JR) +%Image::ExifTool::Sony::Tag9404a = ( + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x000b => { %exposureProgram2010 }, + 0x000d => { Name => 'IntelligentAuto', PrintConv => { 0 => 'Off', 1 => 'On'} }, + 0x0019 => { + Name => 'LensZoomPosition', + Format => 'int16u', + Condition => '$$self{Model} !~ /^SLT-/', + PrintConv => 'sprintf("%.0f%%",$val/10.24)', + PrintConvInv => '$val=~s/ ?%$//; $val * 10.24', + }, +); + +# Tag9404 (ref JR) +%Image::ExifTool::Sony::Tag9404b= ( + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x000c => { %exposureProgram2010 }, + 0x000e => { Name => 'IntelligentAuto', PrintConv => { 0 => 'Off', 1 => 'On'} }, + 0x001e => { + Name => 'LensZoomPosition', + Format => 'int16u', + Condition => '$$self{Model} !~ /^(SLT-|HV|ILCA-)/', + PrintConv => 'sprintf("%.0f%%",$val/10.24)', + PrintConvInv => '$val=~s/ ?%$//; $val * 10.24', + }, + 0x0020 => { + # seen values from 80 - 255 (= infinity) -- see Composite:FocusDistance2 below + Name => 'FocusPosition2', + Condition => '$$self{Model} =~ /^(SLT-|HV|ILCA-)/', + }, +); + +# Tag9404 (ref JR) +%Image::ExifTool::Sony::Tag9404c= ( + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x000b => { %exposureProgram2010 }, + 0x000d => { Name => 'IntelligentAuto', PrintConv => { 0 => 'Off', 1 => 'On'} }, +); + +# Tag9405 (ref JR) +%Image::ExifTool::Sony::Tag9405a = ( + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + WRITABLE => 1, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0x0604 ], + NOTES => 'Valid for SLT, NEX, ILCE-3000/3500 and several DSC models.', + 0x0600 => { + Name => 'DistortionCorrParamsPresent', + Condition => '$$self{Model} !~ /^(DSC-|Stellar)/', + PrintConv => { 0 => 'No', 1 => 'Yes'}, + }, + 0x0601 => { + Name => 'DistortionCorrection', + PrintConv => { + 0 => 'None', + 1 => 'Applied', + }, + }, + # 0x0602 - same as 0x0604, but has value 3 for SAL18135, SAL50F14Z, SAL55300, SAL70200G2, SAL70300G2, SAL70400G2 + 0x0603 => { + Name => 'LensFormat', + Condition => '$$self{Model} !~ /^(DSC-|Stellar)/', + PrintConv => { + 0 => 'Unknown', + 1 => 'APS-C', + 2 => 'Full-frame', + }, + }, + 0x0604 => { + Name => 'LensMount', + DataMember => 'LensMount', + RawConv => '$$self{LensMount} = $val; $$self{Model} =~ /^(DSC-|Stellar)/ ? undef : $val', + PrintConv => { + 0 => 'Unknown', + 1 => 'A-mount', + 2 => 'E-mount', + # 6 - seen for A58 panorama image + }, + }, + 0x0605 => { + Name => 'LensType2', + Condition => '$$self{LensMount} == 2', + Format => 'int16u', + Notes => 'E-mount lenses', + SeparateTable => 'LensType2', + PrintConv => \%sonyLensTypes2, + }, + 0x0608 => { + Name => 'LensType', + Condition => '$$self{LensMount} == 1', + Format => 'int16u', + Notes => 'A-mount lenses on SLT and NEX', + SeparateTable => 1, + PrintConv => \%sonyLensTypes, + }, + 0x064a => { + Name => 'VignettingCorrParams', + Condition => '$$self{Model} !~ /^(DSC-|Stellar)/', + Format => 'int16s[16]', + }, + 0x066a => { + Name => 'ChromaticAberrationCorrParams', + Condition => '$$self{Model} !~ /^(DSC-|Stellar)/', + Format => 'int16s[32]', + }, + 0x06ca => { + Name => 'DistortionCorrParams', + Condition => '$$self{Model} !~ /^(DSC-|Stellar)/', + Format => 'int16s[16]', + }, +); + +# Tag9405b (ref JR) +%Image::ExifTool::Sony::Tag9405b = ( + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + WRITABLE => 1, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0x005e ], + NOTES => q{ + Valid for DSC-HX60V/HX80/HX90V/HX99/HX350/HX400V/QX30/RX0/RX10/RX10M2/ + RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/WX220/WX350, + ILCE-7/7M2/7M3/7R/7RM2/7RM3/7RM4/7S/7SM2/9/9M2/5000/5100/6000/6100/6300/ + 6400/6500/6600/QX1, ILCA-68/77M2/99M2. + }, + 0x0004 => { + Name => 'SonyISO', + Format => 'int16u', + ValueConv => '100 * 2**(16 - $val/256)', + ValueConvInv => '256 * (16 - log($val/100)/log(2))', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 0x0006 => { + Name => 'BaseISO', + Format => 'int16u', + ValueConv => '100 * 2**(16 - $val/256)', + ValueConvInv => '256 * (16 - log($val/100)/log(2))', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 0x000a => { %gain2010 }, + 0x000e => { # appr. same value as Exif ExposureTime, but shorter in HDR-modes + Name => 'SonyExposureTime2', + Format => 'int16u', + ValueConv => '$val ? 2 ** (16 - $val/256) : 0', + ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x0010 => { + Name => 'ExposureTime', + Format => 'rational32u', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', # (Bulb NC) + PrintConvInv => 'lc($val) eq "bulb" ? 0 : $val', + }, + 0x0014 => { # but often odd results for DSC models: exclude + # also often deviating results for Sony FE 90mm F2.8 Macro G OSS ... + Name => 'SonyFNumber', + Format => 'int16u', + Condition => '$$self{Model} !~ /^(DSC-|ZV-)/', + ValueConv => '2 ** (($val/256 - 16) / 2)', + ValueConvInv => '(log($val)*2/log(2)+16)*256', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x0016 => { + Name => 'SonyMaxApertureValue', # (at current focal length) + Format => 'int16u', + ValueConv => '2 ** (($val/256 - 16) / 2)', + ValueConvInv => '(log($val)*2/log(2)+16)*256', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x0024 => { %sequenceImageNumber }, + 0x0034 => { %releaseMode2 }, + # 0x003e and 0x0040: maximum image size; ShotInfo gives actual image size + 0x003e => { Name => 'SonyImageWidthMax', Format => 'int16u' }, + 0x0040 => { Name => 'SonyImageHeightMax', Format => 'int16u' }, + 0x0042 => { + Name => 'HighISONoiseReduction', + PrintConv => { + 0 => 'Off', + 1 => 'Low', + 2 => 'Normal', + 3 => 'High', + }, + }, + 0x0044 => { + Name => 'LongExposureNoiseReduction', + PrintConv => { + 0 => 'Off', + 1 => 'On', # (unused or dark subject) + }, + }, + 0x0046 => { %pictureEffect2010 }, + 0x0048 => { %exposureProgram2010 }, + 0x004a => { + Name => 'CreativeStyle', + PrintConv => { + 0 => 'Standard', + 1 => 'Vivid', + 2 => 'Neutral', + 3 => 'Portrait', + 4 => 'Landscape', + 5 => 'B&W', + 6 => 'Clear', + 7 => 'Deep', + 8 => 'Light', + 9 => 'Sunset', + 10 => 'Night View/Portrait', + 11 => 'Autumn Leaves', + 13 => 'Sepia', + }, + }, + 0x0052 => { + Name => 'Sharpness', + Format => 'int8s', + PrintConv => '$val > 0 ? "+$val" : $val', + PrintConvInv => '$val', + }, + 0x005a => { + Name => 'DistortionCorrParamsPresent', + Condition => '$$self{Model} !~ /^DSC-/', + PrintConv => { 0 => 'No', 1 => 'Yes'}, + }, + 0x005b => { + Name => 'DistortionCorrection', + PrintConv => { + 0 => 'None', + 1 => 'Applied', + }, + }, + # 0x005c - same as 0x005e, but has value 3 for SAL18135, SAL50F14Z, SAL55300, SAL70200G2, SAL70300G2, SAL70400G2 + 0x005d => { + Name => 'LensFormat', + Condition => '$$self{Model} !~ /^DSC-/', + PrintConv => { + 0 => 'Unknown', + 1 => 'APS-C', + 2 => 'Full-frame', + }, + }, + 0x005e => { + Name => 'LensMount', + DataMember => 'LensMount', + RawConv => '$$self{LensMount} = $val; $$self{Model} =~ /^DSC-/ ? undef : $val', + PrintConv => { + 0 => 'Unknown', + 1 => 'A-mount', + 2 => 'E-mount', + }, + }, + 0x0060 => { + Name => 'LensType2', + Condition => '$$self{LensMount} == 2', + Format => 'int16u', + Notes => 'E-mount lenses', + SeparateTable => 'LensType2', + PrintConv => \%sonyLensTypes2, + }, + 0x0062 => { + Name => 'LensType', + Condition => '$$self{LensMount} == 1', + Format => 'int16u', + Notes => 'A-mount lenses on SLT and NEX', + SeparateTable => 1, + PrintConv => \%sonyLensTypes, + }, + 0x0064 => { + Name => 'DistortionCorrParams', + Condition => '$$self{Model} !~ /^DSC-/', + Format => 'int16s[16]', + }, + 0x0342 => { + Name => 'LensZoomPosition', + Condition => '$$self{Model} !~ /^(ILCA-|ILCE-(7RM2|7M3|7RM3A?|7RM4A?|7SM2|6100|6300|6400|6500|6600|7C|9|9M2)|DSC-(HX80|HX90V|HX99|RX0|RX10M2|RX10M3|RX10M4|RX100M4|RX100M5|RX100M5A|RX100M6|RX100M7|WX500)|ZV-)/', + Format => 'int16u', + PrintConv => 'sprintf("%.0f%%",$val/10.24)', + PrintConvInv => '$val=~s/ ?%$//; $val * 10.24', + }, + 0x034a => { + Name => 'VignettingCorrParams', + Condition => '$$self{Model} =~ /^(ILCA-(68|77M2)|ILCE-(5000|5100|6000|7|7R|7S|QX1)|Lusso)\b/', + Format => 'int16s[16]', + }, + 0x034e => { + Name => 'LensZoomPosition', + Condition => '$$self{Model} =~ /^(DSC-(RX100M5|RX100M5A|RX100M6|RX100M7|RX10M4|HX99)|ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9M2)|ZV-E10)/', + Format => 'int16u', + PrintConv => 'sprintf("%.0f%%",$val/10.24)', + PrintConvInv => '$val=~s/ ?%$//; $val * 10.24', + }, + 0x0350 => { + Name => 'VignettingCorrParams', + Condition => '$$self{Model} =~ /^(ILCE-7M2)/', + Format => 'int16s[16]', + }, + 0x035c => { + Name => 'VignettingCorrParams', + Condition => '$$self{Model} =~ /^(ILCA-99M2|ILCE-(6100|6400|6500|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|ZV-E10)/', + Format => 'int16s[16]', + }, + 0x035a => { + Name => 'LensZoomPosition', + Condition => '$$self{Model} =~ /^(ILCE-(7RM2|7SM2)|DSC-(HX80|HX90V|RX10M2|RX10M3|RX100M4|WX500))/', + Format => 'int16u', + PrintConv => 'sprintf("%.0f%%",$val/10.24)', + PrintConvInv => '$val=~s/ ?%$//; $val * 10.24', + }, + 0x0368 => { + Name => 'VignettingCorrParams', + Condition => '$$self{Model} =~ /^(ILCE-(6300|7RM2|7SM2))/', + Format => 'int16s[16]', + }, + 0x037c => { + Name => 'ChromaticAberrationCorrParams', + Condition => '$$self{Model} =~ /^(ILCA-(68|77M2)|ILCE-(5000|5100|6000|7|7R|7S|QX1)|Lusso)\b/', + Format => 'int16s[32]', + }, + 0x0384 => { + Name => 'ChromaticAberrationCorrParams', + Condition => '$$self{Model} =~ /^(ILCE-7M2)/', + Format => 'int16s[32]', + }, + 0x039c => { + Name => 'ChromaticAberrationCorrParams', + Condition => '$$self{Model} =~ /^(ILCE-(6300|7RM2|7SM2))/', + Format => 'int16s[32]', + }, + 0x03b0 => { + Name => 'ChromaticAberrationCorrParams', + Condition => '$$self{Model} =~ /^(ILCA-99M2|ILCE-6500)/', + Format => 'int16s[32]', + }, + 0x03b8 => { + Name => 'ChromaticAberrationCorrParams', + Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|ZV-E10)/', + Format => 'int16s[32]', + }, +); + +# Tag9406 (ref JR) +%Image::ExifTool::Sony::Tag9406 = ( + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, +# 0x0000: 1 for SLT-A37/A57/A65/A77, NEX-5N/7/F3/VG20 +# 2 for SLT-A58/99V, NEX-3N/5R/5T/6/VG30/VG900, ILCA-68/77M2, ILCE-3000/3500/7/7M2/7R/7S/5000/6000 +# 3 for ILCA-99M2, ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2 +# 0x0001+0x0002: Int16u, seen 580 - 770: similar to "BatteryUnknown" ?? +# 0x0005: int8u, seen 73 - 117: maybe Fahrenheit? Higher than "AmbientTemperature", but same trend. + 0x0005 => { + Name => 'BatteryTemperature', + ValueConv => '($val - 32) / 1.8', # convert to Celsius + ValueConvInv => '$val * 1.8 + 32', + PrintConv => 'sprintf("%.1f C",$val)', + PrintConvInv => '$val=~s/\s*C//; $val', + }, + # 0x0006: usually 0, seen non-zero values only for SLT-A99V, ILCA-77M2/99M2 and ILCE-7/7R/7RM2/9: BatteryLevel Grip ? + 0x0006 => { + Name => 'BatteryLevelGrip1', + RawConv => '$val ? $val : undef', # only valid when not 0 + PrintConv => '"$val%"', + PrintConvInv => '$val=~s/\s*\%//; $val', + }, + # 0x0007: seen values from 8 - 105, decreasing in sequences of images: BatteryLevel + 0x0007 => { + Name => 'BatteryLevel', + PrintConv => '"$val%"', + PrintConvInv => '$val=~s/\s*\%//; $val', + }, + # 0x0008: usually 255 or 0 (ILCE-7/7R), seen other values only for A99V and ILCE-7/7R when 0x0006 not 0. + # A99V with grip can have 3 batteries: => Grip 2; + # but ILCE-7/7R with grip can have max 2, and as all ILCE-7/7R samples give >100 values, exclude... + 0x0008 => { + Name => 'BatteryLevelGrip2', + Condition => '$$self{Model} !~ /^(ILCE-(7|7R)|Lusso)$/', # not valid for ILCE-7/7R + RawConv => '($val and $val != 255) ? $val : undef', # not valid if 0 or 255 + PrintConv => '"$val%"', + PrintConvInv => '$val=~s/\s*\%//; $val', + }, +# 0x0009-0x001a: looks like 9 Int16u values +# 0x0022: 0 or 1 for A99, NEX-5R, 6 +# 0x0025: 0 or 1 for other SLT and NEX (0x0022, 0x0023, 0x0024 = 255) +); + +# Tag940a (ref PH, decoded mainly from A77) +%Image::ExifTool::Sony::Tag940a = ( + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'These tags are currently extracted for SLT models only.', + # 0x00 - 10(A65,A77,NEX-5N,7,VG20E), 11(A37,A57,A99,NEX-5R,6,F3,RX1,RX100), + # 9(HX9V), 4,68,86,110(panoramas) - ref JR + 0x04 => { + Name => 'AFPointsSelected', + Format => 'int32u', + PrintConvColumns => 2, + PrintConv => { + # verified for A77 firmware 1.03 and 1.07 and A99 firmware 1.00, + # but there were inconsistencies with my A77 firmware 1.04 samples - PH + 0 => '(none)', # ILCA-68/77M2/99M2 always give this + 0x00007801 => 'Center Zone', + 0x0001821c => 'Right Zone', + 0x000605c0 => 'Left Zone', + 0x0003ffff => '(all LA-EA4)', # for LA-EA4: 18 bits + 0x7fffffff => '(all)', # also for LA-EA2 + 0xffffffff => 'n/a', # DSC and ILCE/NEX models always give this, except when using LA-EA2 or LA-EA4 + # (on Wide AFAreaMode, outer focus points are dropped + # at progressively higher digital zoom ratios, ref JR) + BITMASK => { + 0 => 'Center', # (1.04 gave this for Upper-middle and Near Left) + 1 => 'Top', # (1.04 didn't give this value) + 2 => 'Upper-right', # (1.04 OK) + 3 => 'Right', # (1.04 didn't give this value) + 4 => 'Lower-right', # (1.04 gave this for Bottom) + 5 => 'Bottom', # (1.04 gave this for Lower-middle) + 6 => 'Lower-left', # (1.04 gave this for Left and Lower Far Left) + 7 => 'Left', # (1.04 gave this for Far Left) + 8 => 'Upper-left', # (1.04 OK) + 9 => 'Far Right', # (1.04 gave this for Upper Far Right and Right) + 10 => 'Far Left', # (1.04 didn't give this value) + 11 => 'Upper-middle', # (1.04 gave this for Top) + 12 => 'Near Right', # (1.04 gave this for Center) + 13 => 'Lower-middle', # (1.04 gave this for Lower-left and Near Right) + 14 => 'Near Left', # (1.04 didn't give this value) + 15 => 'Upper Far Right',# (1.04 didn't give this value) + 16 => 'Lower Far Right',# (1.04 OK, but gave this for Far Right and Lower-right too) + 17 => 'Lower Far Left', # (1.04 didn't give this value) + 18 => 'Upper Far Left', # (1.04 OK) + # higher bits may be used in panorama images - ref JR + }, + }, + }, + # 0x0a - int16u: 0,1,2,3 + # 0xa6 - 8 bytes face detection info ?; starts with 1, otherwise all 0 +); + +# Tag940c (ref JR) +%Image::ExifTool::Sony::Tag940c = ( + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + WRITABLE => 1, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + DATAMEMBER => [ 0x0008 ], + NOTES => 'E-mount cameras only.', + + # 0x0001 - 0 for all NEX and ILCE-3000/3500, 20 for all other ILCE (17 for ILCE samples from Sony.net) + # 0x0008 - LensMount, but different values from Tag9405-0x0105 and Tag9050-0x0604. + # don't know what difference is between values '1' and '5' ... + 0x0008 => { + Name => 'LensMount2', # ? maybe some other meaning ? (A-mount adapter-only images give 0) + RawConv => '$$self{LensMount} = $val', + PrintConv => { + 0 => 'Unknown', # LA-EA3 with non-SSM/SAM lens will often give this, not 1 or 5 + 1 => 'A-mount (1)', + 4 => 'E-mount', + 5 => 'A-mount (5)', + }, + }, + # 0x0009 - LensType3: + # This tag appears to also indicate adapter info, similar to CameraSettings3-0x03f7 for the original NEX-3/5. + # (Tag9405-0x0605 and Tag9050-0x0107 LensType2 always give '0' for adapters/A-mount lenses.) + # - seen a few instances of 0x0009 indicating an E-mount lens, but 0xb027 LensType indicating an A-mount lens: + # possibly due to adapter info not being read/reset correctly ? + # August 2015: renamed from LensType2 into Lenstype3 because too often info here relates to previously-mounted-lens + 0x0009 => { + Name => 'LensType3', + RawConv => '(($$self{LensMount} != 0) or ($val > 0 and $val < 32784)) ? $val : undef', + Format => 'int16u', + SeparateTable => 'LensType2', + PrintConv => \%sonyLensTypes2, + }, + 0x000b => { + Name => 'CameraE-mountVersion', + Format => 'int16u', + PrintConv => 'sprintf("%x.%.2x",$val>>8,$val&0xff)', + PrintConvInv => 'my @a=split(/\./,$val);(hex($a[0])<<8)|hex($a[1])', + # E-mount versions seen for various cameras / camera-firmware versions: + # - : info not present in CameraSettings3 for NEX-3/5/5C/C3/VG10E + # 1.14: NEX-5N/5R/6/7/F3/VG20E/VG30E/VG900 v1.00, NEX-5N v1.01, NEX-3N v0.90 + # 1.20: NEX-3N v1.00, NEX-6 v1.01, NEX-7 v1.02, ILCE-3000 v1.00, ILCE-3500 v1.01 + # 1.30: NEX-5T v1.00, NEX-6 v1.02/v1.03, NEX-7 v1.03 + # 1.31: ILCE-7/7R v0.95/v1.00/v1.01, ILCE-5000 + # 1.40: ILCE-7/7R v1.02/v1.10, ILCE-7S v1.00, ILCE-6000 v1.00/v1.10, ILCE-5100/QX1 + # 1.50: ILCE-7/7R/7S v1.20-v3.20, ILCE-7M2, ILCE-7RM2 v1.00-v3.00, ILCE-7SM2 v1.00-v2.20, + # ILCE-6000 v1.20-v3.20 + # 1.60: ILCE-6300/6500, ILCE-7RM2 v3.05-v4.00 + # 1.70: ILCE-7M3/7RM3, ILCE-9 v1.00-v4.10 + # 1.80: ILCE-6100/6400/6600/7RM4/9M2, ILCE-9 v5.00-v6.00 + }, + 0x000d => { + Name => 'LensE-mountVersion', + Condition => '$$self{LensMount} != 0', + Format => 'int16u', + PrintConv => 'sprintf("%x.%.2x",$val>>8,$val&0xff)', + PrintConvInv => 'my @a=split(/\./,$val);(hex($a[0])<<8)|hex($a[1])', + # E-mount versions seen for various lens models: + # 0.00: Unknown lenses/adapters + # 1.00: SEL18200LE, Sigma DN, Tamron Di III, Zeiss Touit + # 1.07: (Ver.01) original E-lenses (SEL16F28, SEL18200, SEL1855, SEL24F18Z, SEL30M35, SEL50F18, SEL55210) and LA-EA1 + # 1.08: LA-EA1 (Ver.02), Metabones Smart + # 1.14: LA-EA2 + # 1.20: (Ver.02) firmware-updated E-lenses (SEL1855, SEL24F18Z, SEL30M35, SEL50F18, SEL55210), + # newer E-lenses (SEL1018, SEL1670Z, SEL20F28, SEL35F18, SELP1650, SELP18105G, SELP18200) or LA-EA3 Ver.01 + # 1.30: LA-EA4 + # 1.31: original FE-lenses (SEL2470Z, SEL2870, SEL35F28Z, SEL55F18Z), SEL1850 + # 1.35: SEL70200G, SEL55210 (Black?, seen with ILCE-3500) + # 1.40: SEL1635Z, SEL24240, SEL35F14Z, SELP28135G, Zeiss Loxia 35mm/50mm Ver.01, Zeiss Touit Ver.02 + # 1.41: SELP18105G Ver.02 + # 1.50: SEL28F20, SEL90M28G, Zeiss Batis 18mm/25mm/85mm/135mm, Zeiss Loxia 21mm, Zeiss Loxia 35mm/50mm Ver.02, + # Tokina FiRIN 20mm + # 1.60: SEL1224G, SEL1635GM, SEL1655G, SELP18110G, SEL18135, SEL2470GM, SEL24105G, SEL35F18F, SEL50F14Z, SEL50F18F, + # SEL50M28, SEL70200GM, SEL70300G, SEL70350G, SEL85F14GM, SEL85F18, SEL100F28GM, SEL100400GM, SEL135F18GM, + # SEL200600G, SEL600F40GM, Sigma 16F14DCDN/30F14DCDN/35F12DGDN/45F28DGDN, Sigma MC-11, Samyang AF 14mm/50mm, + # Voigtlander 15mm, Viltrox 85mm MF + # 1.70: LA-EA3 Ver.02, Samyang AF 24mm/35mm/85mm, Tamron 17-28mm, 28-75mm, Tokina FiRIN 20mm AF Ver.01, Tokina FiRIN 100mm Macro, + # Voigtlander 10mm/12mm/40mm/65mm, Zeiss Loxia 25mm/85mm, Sigma 14-24mm + # 1.80: Voigtlander 21mm + }, + # 0x0014 and 0x0015: change together: LensFirmwareVersion + # 0x0015 as 2-digit hex matches known firmware versions of Sony lenses and Metabones adapters, + # 0x0014 as 3-digit decimal: not confirmed sub-versions + # Some versions as seen with this decoding: + # 00.nnn for several pre-production Sony E-mount lenses + # 01.000 - 01.009 for various Sony E-mount lenses + # 02.nnn, 03.nnn for various Sony E-mount lenses for which a Ver.02 or Ver.03 update is available + # 16.001 for Metabones Speed Booster + # 19/22/24/30/32/41.001 etc. for Metabones Canon EF Smart adapters + 0x0014 => { + Name => 'LensFirmwareVersion', + Condition => '$$self{LensMount} != 0', + Format => 'int16u', + PrintConv => 'sprintf("Ver.%.2x.%.3d",$val>>8,$val&0xff)', + }, + # 0x0016 - 0x003f: non-0 data present when: 0x0001>0 AND 0x0008=4(E-mount) AND 0x000f<255 +); + + +# AFInfo 0x940e (SLT models only) (ref PH, decoded mainly from A77) +%Image::ExifTool::Sony::AFInfo = ( + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + WRITABLE => 1, + FIRST_ENTRY => 0, + PRIORITY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + DATAMEMBER => [ 0x02 ], + IS_SUBDIR => [ 0x11, 0x7d ], + NOTES => 'These tags are currently extracted for SLT models only.', + # first 4 bytes (deciphered) (ref JR): + # 0 1 1 0 for A37, A57, A58 + # 2 1 1 0 for A65V + # 2 1 2 0 for A77V + # 0 1 2 0 for A99V + # 1 1 3 0 for ILCA-68/77M2/99M2 + # 0 0 0 0 for NEX and ILCE-3000/3500, also seen for SLT/ILCA with non-AF lens + # 1 0 0 0 for ILCE-5000/5100/6000/7/7M2/7R/7S/QX1 + # 6 0 0 0 for ILCE-6100/6300/6400/6500/6600/7C/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2 + # 9 . . . for ILCE-7SM3 + # 11 . . . for ILCE-1 + # 0 2 0 0 for NEX/ILCE with LA-EA2/EA4 Phase-AF adapter + # 2 0 0 0 seen for a few NEX-5N images + # 2 2 0 0 seen for a few NEX-5N/7 images with LA-EA2 adapter + 0x02 => { + Name => 'AFType', + RawConv => '$$self{AFType} = $val', + PrintConv => { + # 0 => '?? n.a.', # seen on some A99V images with non-AF (Samyang) lens + 1 => '15-point', + 2 => '19-point', + 3 => '79-point', # ILCA-68/77M2/99M2 + }, + }, + +### decoding for SLT; ILCA-68/77M2/99M2 (AFType == 3) uses different offsets: see below + + 0x04 => { + Name => 'AFStatusActiveSensor', + Condition => '$$self{Model} !~ /^ILCA-/', + %Image::ExifTool::Minolta::afStatusInfo, + }, + 0x07 => [ # the active AF sensor + { + Name => 'AFPoint', + Condition => '$$self{AFType} == 1', + Notes => 'models with 15-point AF', + PrintConvColumns => 2, + PrintConv => \%afPoint15, + },{ + Name => 'AFPoint', + Condition => '$$self{AFType} == 2', + Notes => 'models with 19-point AF', + PrintConvColumns => 2, + PrintConv => \%afPoint19, + }, + ], + 0x08 => [ # the AF sensor in focus at focus time (shutter release half press) + { + Name => 'AFPointInFocus', + Condition => '$$self{AFType} == 1', + Notes => 'models with 15-point AF', + PrintConvColumns => 2, + PrintConv => { + %afPoint15, + 255 => '(none)', + }, + },{ + Name => 'AFPointInFocus', + Condition => '$$self{AFType} == 2', + Notes => 'models with 19-point AF', + PrintConvColumns => 2, + PrintConv => { + %afPoint19, + 255 => '(none)', + }, + }, + ], + 0x09 => [ # the AF sensor in focus at shutter release (shutter release full press) + { + Name => 'AFPointAtShutterRelease', + Condition => '$$self{AFType} == 1', + Notes => 'models with 15-point AF', + PrintConvColumns => 2, + PrintConv => { + %afPoint15, + 30 => '(out of focus)', + }, + },{ + Name => 'AFPointAtShutterRelease', + Condition => '$$self{AFType} == 2', + Notes => 'models with 19-point AF', + PrintConvColumns => 2, + PrintConv => { + %afPoint19, + 30 => '(out of focus)', + }, + }, + ], + 0x0a => { + Name => 'AFAreaMode', + Condition => '$$self{Model} !~ /^ILCA-/', + PrintConv => { + 0 => 'Wide', + 1 => 'Spot', + 2 => 'Local', + 3 => 'Zone', + }, + }, + 0x0b => { + Name => 'FocusMode', + Condition => '$$self{Model} !~ /^ILCA-/', + PrintConvColumns => 2, + # validated for A77 firmware 1.03, 1.04 and 1.07 and A99 + # - not confirmed for A37,A57 and A65 which also write this tag + PrintConv => { + 0 => 'Manual', + 2 => 'AF-S', + 3 => 'AF-C', + 4 => 'AF-A', + 6 => 'DMF', + 7 => 'AF-D', # (unique to A99) + }, + }, + 0x11 => [ #JR + { + Name => 'AFStatus15', + Condition => '$$self{AFType} == 1', + Format => 'int16s[18]', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::AFStatus15' }, + },{ + Name => 'AFStatus19', + Condition => '$$self{AFType} == 2', + Format => 'int16s[30]', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::AFStatus19' }, + }, + ], + # 0x004d - 18 or 30 int16 values + # 0x0089 - 18 or 30 int16 values + # 0x00b1 - 18 or 30 int16 values + # 0x0121 - 18 or 30 int16s values, similar to 0x11 AFStatus + # 0x016e - SLT: 4 bytes indicating 'AFPointsUsed', identical to first 4 bytes of 0x2020 for A58/A99V + 0x016e => { + Name => 'AFPointsUsed', + Condition => '$$self{Model} !~ /^ILCA-/', + Notes => 'SLT models only', + Format => 'int32u', + PrintConvColumns => 2, + PrintConv => { + 0 => '(none)', + BITMASK => { + 0 => 'Center', + 1 => 'Top', + 2 => 'Upper-right', + 3 => 'Right', + 4 => 'Lower-right', + 5 => 'Bottom', + 6 => 'Lower-left', + 7 => 'Left', + 8 => 'Upper-left', + 9 => 'Far Right', + 10 => 'Far Left', + 11 => 'Upper-middle', + 12 => 'Near Right', + 13 => 'Lower-middle', + 14 => 'Near Left', + 15 => 'Upper Far Right', + 16 => 'Lower Far Right', + 17 => 'Lower Far Left', + 18 => 'Upper Far Left', + }, + }, + }, + # 0x017b: int16s: also has to do with AFMicroAdj: value equals -AFMA * 4 * MaxApertureValue (ref JR) + 0x017d => { #PH (verified for the SLT-A77/A99; other SLT models don't have this setting - ref JR) + # (different from AFMicroAdjValue because it is 0 when the adjustment is off) + Name => 'AFMicroAdj', + Condition => '$$self{Model} !~ /^ILCA-/', + Format => 'int8s', + }, + 0x017e => { #JR + Name => 'ExposureProgram', + Condition => '$$self{Model} !~ /^ILCA-/', + Priority => 0, + SeparateTable => 'ExposureProgram3', + PrintConv => \%sonyExposureProgram3, + }, + # 0x01b8 - 65 AF Info blocks of 180 bytes each for SLT (ref JR) + # In each block, the 9th, 10th and 11th byte appear to relate to AFPoint as at offsets 0x07, 0x08, 0x09 above.. + # Possibly, these blocks relate to sequential focusing attempts and/or object tracking, + # the first byte being an Index or Counter. + # The last block before the block with index 0, appears to relate to the AF data at ShutterRelease. + + # 0xf38,0x1208,0x14d8,0x158c,0x1640,(and more) - 0 if AFMicroAdj is On, 1 if Off + # 0x1ab6 - 0x80 if AFMicroAdj is On, 0 if Off + # tags also related to AFPoint (PH, A77): + # 0x11ec, 0x122a, 0x1408, 0x1446, 0x14bc, 0x1f86, + # 0x14fa, 0x1570, 0x1572, 0x15ae, 0x1f48 + +### decoding for ILCA-68/77M2/99M2, AFType == 3 + + 0x0005 => { #JR + Name => 'FocusMode', + Condition => '$$self{Model} =~ /^ILCA-/', + Notes => 'ILCA models only', + Writable => 'int8u', + Priority => 0, + PrintConv => { + 0 => 'Manual', + 2 => 'AF-S', + 3 => 'AF-C', + 4 => 'AF-A', + 6 => 'DMF', + # 7 => 'AF-D', # not yet seen + }, + }, + # 0x0010 - for ILCA-68/77M2/99M2: 10 bytes identical to 0x2020, and probably indicating 'AFPointsUsed' (ref JR) + 0x0010 => { + Name => 'AFPointsUsed', + Condition => '$$self{Model} =~ /^ILCA-/', + Format => 'int8u[10]', + BitsPerWord => 8, + BitsTotal => 80, + PrintConv => { + 0 => '(none)', + BITMASK => { %afPoints79 }, + }, + }, + # 0x0037, 0x0038, 0x0039 similar to 0x07, 0x08, 0x09, but using numbers from 0-94 for ILCA-68/77M2/99M2 + 0x0037 => { # the active AF sensor + Name => 'AFPoint', + Condition => '$$self{AFType} == 3', + PrintConv => { + %afPoints79_940e, + 255 => '(none)', + }, + }, + 0x0038 => { # the AF sensor in focus at focus time (shutter release half press) + Name => 'AFPointInFocus', + Condition => '$$self{AFType} == 3', + PrintConv => { + %afPoints79_940e, + 255 => '(none)', + }, + }, + 0x0039 => { # the AF sensor in focus at shutter release (shutter release full press) + Name => 'AFPointAtShutterRelease', + Condition => '$$self{AFType} == 3', + PrintConv => { + %afPoints79_940e, + 95 => '(none)', + }, + }, + 0x003a => { #JR + Name => 'AFAreaMode', + Condition => '$$self{Model} =~ /^ILCA-/', + PrintConv => { + 0 => 'Wide', + 1 => 'Center', + 2 => 'Flexible Spot', + 3 => 'Zone', + 4 => 'Expanded Flexible Spot', #(NC) + }, + }, + 0x003b => { + Name => 'AFStatusActiveSensor', + Condition => '$$self{Model} =~ /^ILCA-/', + %Image::ExifTool::Minolta::afStatusInfo, + }, + 0x0043 => { + Name => 'ExposureProgram', + Condition => '$$self{Model} =~ /^ILCA-/', + Priority => 0, + SeparateTable => 'ExposureProgram3', + PrintConv => \%sonyExposureProgram3, + }, + # 0x004e: int16s: also has to do with AFMicroAdj: value equals -AFMA * 4 * MaxApertureValue (ref JR) + 0x0050 => { #PH (ILCA-A77M2, to be confirmed for other ILCA models) + Name => 'AFMicroAdj', + Condition => '$$self{Model} =~ /^ILCA-/', + Format => 'int8s', + }, + # 0x007d - AFStatus79 - 95 int16s values for the ILCA-68/77M2/99M2: 79 AF points + 15 cross + 1 F2.8 + 0x007d => { + Name => 'AFStatus79', + Condition => '$$self{AFType} == 3', + Format => 'int16s[95]', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::AFStatus79' }, + }, + # 0x013b - 95 int8u values + # 0x01ab - 95 int8u values + # 0x021b - 95 int16s values, similar to 0x007d AFStatus79, but not sure if this is valid for ILCA-99M2 + # 0x04c0 - 45 AF Info blocks of 244 bytes each for ILCA-68/77M2 + # 0x12a0 - 30 AF Info blocks of 244 bytes each for ILCA-99M2 +); + +%Image::ExifTool::Sony::Tag940e = ( #JR + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + NOTES => 'E-mount models.', + + # (see comment in AFInfo for deciphered values of first 4 bytes for various models) + + # 0x0004 - if 0x0001 == 2: LA-EA2/EA4 15-point SLT Phase-detect AF adapter used: + # start of 164-byte AF Info Blocks, possibly the 11th byte might be the AFPoint. + # ILCE-7M2/7RM2/7SM2: 40 Blocks of 164 bytes + # other NEX/ILCE: 74 blocks of 164 bytes + + # 0x1a06 onwards - first seen for ILCE-7RM2: appears to be some kind of metering image + # but not valid anymore for ILCE-6400, ILCE-9 v5.0x + 0x1a06 => { Name => 'TiffMeteringImageWidth', Condition => '$$self{Model} =~ /^(ILCE-(6300|6500|7M3|7RM2|7RM3A?|7SM2|9))\b/ and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/' }, + 0x1a07 => { Name => 'TiffMeteringImageHeight', Condition => '$$self{Model} =~ /^(ILCE-(6300|6500|7M3|7RM2|7RM3A?|7SM2|9))\b/ and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/' }, + 0x1a08 => { # (2640 bytes: 1 set of 44x30 int16u values) + Name => 'TiffMeteringImage', + Condition => '$$self{Model} =~ /^(ILCE-(6300|6500|7M3|7RM2|7RM3A?|7SM2|9))\b/ and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/', + Format => 'undef[2640]', + Notes => q{ + 13(?)-bit intensity data from 1320 (1200) metering segments, extracted as a + 16-bit TIFF image + }, + ValueConv => sub { + my ($val, $et) = @_; + return undef unless length $val >= 2640; + return \ "Binary data 2640 bytes" unless $et->Options('Binary'); + my @dat = unpack('v*', $val); + # TIFF header for a 16-bit RGB 10dpi 44x30 image + $val = Image::ExifTool::MakeTiffHeader(44,30,3,16,10); + # re-order data to RGB pixels - use same value for R, G and B + my ($i, @val); + for ($i=0; $i<44*30; ++$i) { + # data is 13-bit (max 8191), shift left to fill 16 bits + push @val, int(5041.1*log($dat[$i]+1)/log(2)), int(5041.1*log($dat[$i]+1)/log(2)), int(5041.1*log($dat[$i]+1)/log(2)); + } + $val .= pack('v*', @val); # add TIFF strip data + return \$val; + }, + }, +); + +# AF Point Status (ref JR) +%Image::ExifTool::Sony::AFStatus15 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'AF Status information for models with 15-point AF.', + 0x00 => { Name => 'AFStatusUpper-left', %Image::ExifTool::Minolta::afStatusInfo }, + 0x02 => { Name => 'AFStatusLeft', %Image::ExifTool::Minolta::afStatusInfo }, + 0x04 => { Name => 'AFStatusLower-left', %Image::ExifTool::Minolta::afStatusInfo }, + 0x06 => { Name => 'AFStatusFarLeft', %Image::ExifTool::Minolta::afStatusInfo }, + 0x08 => { Name => 'AFStatusTopHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0a => { Name => 'AFStatusNearRight', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0c => { Name => 'AFStatusCenterHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0e => { Name => 'AFStatusNearLeft', %Image::ExifTool::Minolta::afStatusInfo }, + 0x10 => { Name => 'AFStatusBottomHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x12 => { Name => 'AFStatusTopVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x14 => { Name => 'AFStatusCenterVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x16 => { Name => 'AFStatusBottomVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x18 => { Name => 'AFStatusFarRight', %Image::ExifTool::Minolta::afStatusInfo }, + 0x1a => { Name => 'AFStatusUpper-right', %Image::ExifTool::Minolta::afStatusInfo }, + 0x1c => { Name => 'AFStatusRight', %Image::ExifTool::Minolta::afStatusInfo }, + 0x1e => { Name => 'AFStatusLower-right', %Image::ExifTool::Minolta::afStatusInfo }, + 0x20 => { Name => 'AFStatusUpper-middle', %Image::ExifTool::Minolta::afStatusInfo }, + 0x22 => { Name => 'AFStatusLower-middle', %Image::ExifTool::Minolta::afStatusInfo }, +); + +# AF Point Status (ref JR) +%Image::ExifTool::Sony::AFStatus19 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'AF Status information for models with 19-point AF.', + 0x00 => { Name => 'AFStatusUpperFarLeft', %Image::ExifTool::Minolta::afStatusInfo }, + 0x02 => { Name => 'AFStatusUpper-leftHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x04 => { Name => 'AFStatusFarLeftHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x06 => { Name => 'AFStatusLeftHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x08 => { Name => 'AFStatusLowerFarLeft', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0a => { Name => 'AFStatusLower-leftHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0c => { Name => 'AFStatusUpper-leftVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0e => { Name => 'AFStatusLeftVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x10 => { Name => 'AFStatusLower-leftVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x12 => { Name => 'AFStatusFarLeftVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x14 => { Name => 'AFStatusTopHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x16 => { Name => 'AFStatusNearRight', %Image::ExifTool::Minolta::afStatusInfo }, + 0x18 => { Name => 'AFStatusCenterHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x1a => { Name => 'AFStatusNearLeft', %Image::ExifTool::Minolta::afStatusInfo }, + 0x1c => { Name => 'AFStatusBottomHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x1e => { Name => 'AFStatusTopVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x20 => { Name => 'AFStatusUpper-middle', %Image::ExifTool::Minolta::afStatusInfo }, + 0x22 => { Name => 'AFStatusCenterVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x24 => { Name => 'AFStatusLower-middle', %Image::ExifTool::Minolta::afStatusInfo }, + 0x26 => { Name => 'AFStatusBottomVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x28 => { Name => 'AFStatusUpperFarRight', %Image::ExifTool::Minolta::afStatusInfo }, + 0x2a => { Name => 'AFStatusUpper-rightHorizontal',%Image::ExifTool::Minolta::afStatusInfo }, + 0x2c => { Name => 'AFStatusFarRightHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x2e => { Name => 'AFStatusRightHorizontal', %Image::ExifTool::Minolta::afStatusInfo }, + 0x30 => { Name => 'AFStatusLowerFarRight', %Image::ExifTool::Minolta::afStatusInfo }, + 0x32 => { Name => 'AFStatusLower-rightHorizontal',%Image::ExifTool::Minolta::afStatusInfo }, + 0x34 => { Name => 'AFStatusFarRightVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x36 => { Name => 'AFStatusUpper-rightVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x38 => { Name => 'AFStatusRightVertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x3a => { Name => 'AFStatusLower-rightVertical', %Image::ExifTool::Minolta::afStatusInfo }, +); + +# AF Point Status (ref JR) +%Image::ExifTool::Sony::AFStatus79 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => 'AF Status information for models with 79-point AF.', +# +# ILCA-68/77M2 AF sensor layout: +# A5* A6* A7* +# B2 B3 B4 B5 B6 B7 B8 B9 B10 +# C1 C2 C3 C4 C5* C6* C7* C8 C9 C10 C11 +# D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 +# E1 E2 E3 E4 E5* E6* E7* E8 E9 E10 E11 +# F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 +# G1 G2 G3 G4 G5* G6* G7* G8 G9 G10 G11 +# H2 H3 H4 H5 H6 H7 H8 H9 H10 +# I5* I6* I7* +# left section, from top to bottom, from right to left + 0x00 => { Name => 'AFStatus_00_B4', %Image::ExifTool::Minolta::afStatusInfo }, + 0x02 => { Name => 'AFStatus_01_C4', %Image::ExifTool::Minolta::afStatusInfo }, + 0x04 => { Name => 'AFStatus_02_D4', %Image::ExifTool::Minolta::afStatusInfo }, + 0x06 => { Name => 'AFStatus_03_E4', %Image::ExifTool::Minolta::afStatusInfo }, + 0x08 => { Name => 'AFStatus_04_F4', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0a => { Name => 'AFStatus_05_G4', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0c => { Name => 'AFStatus_06_H4', %Image::ExifTool::Minolta::afStatusInfo }, + 0x0e => { Name => 'AFStatus_07_B3', %Image::ExifTool::Minolta::afStatusInfo }, + 0x10 => { Name => 'AFStatus_08_C3', %Image::ExifTool::Minolta::afStatusInfo }, + 0x12 => { Name => 'AFStatus_09_D3', %Image::ExifTool::Minolta::afStatusInfo }, + 0x14 => { Name => 'AFStatus_10_E3', %Image::ExifTool::Minolta::afStatusInfo }, + 0x16 => { Name => 'AFStatus_11_F3', %Image::ExifTool::Minolta::afStatusInfo }, + 0x18 => { Name => 'AFStatus_12_G3', %Image::ExifTool::Minolta::afStatusInfo }, + 0x1a => { Name => 'AFStatus_13_H3', %Image::ExifTool::Minolta::afStatusInfo }, + 0x1c => { Name => 'AFStatus_14_B2', %Image::ExifTool::Minolta::afStatusInfo }, + 0x1e => { Name => 'AFStatus_15_C2', %Image::ExifTool::Minolta::afStatusInfo }, + 0x20 => { Name => 'AFStatus_16_D2', %Image::ExifTool::Minolta::afStatusInfo }, + 0x22 => { Name => 'AFStatus_17_E2', %Image::ExifTool::Minolta::afStatusInfo }, + 0x24 => { Name => 'AFStatus_18_F2', %Image::ExifTool::Minolta::afStatusInfo }, + 0x26 => { Name => 'AFStatus_19_G2', %Image::ExifTool::Minolta::afStatusInfo }, + 0x28 => { Name => 'AFStatus_20_H2', %Image::ExifTool::Minolta::afStatusInfo }, + 0x2a => { Name => 'AFStatus_21_C1', %Image::ExifTool::Minolta::afStatusInfo }, + 0x2c => { Name => 'AFStatus_22_D1', %Image::ExifTool::Minolta::afStatusInfo }, + 0x2e => { Name => 'AFStatus_23_E1', %Image::ExifTool::Minolta::afStatusInfo }, + 0x30 => { Name => 'AFStatus_24_F1', %Image::ExifTool::Minolta::afStatusInfo }, + 0x32 => { Name => 'AFStatus_25_G1', %Image::ExifTool::Minolta::afStatusInfo }, +# center section, cross-sensors *, from right to left, from top to bottom +# These are presumably Vertical, as all others are default Horizontal (ref Sony ILCA-77M2 brochure). + 0x34 => { Name => 'AFStatus_26_A7_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x36 => { Name => 'AFStatus_27_A6_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x38 => { Name => 'AFStatus_28_A5_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x3a => { Name => 'AFStatus_29_C7_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x3c => { Name => 'AFStatus_30_C6_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x3e => { Name => 'AFStatus_31_C5_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x40 => { Name => 'AFStatus_32_E7_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x42 => { Name => 'AFStatus_33_E6_Center_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x44 => { Name => 'AFStatus_34_E5_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x46 => { Name => 'AFStatus_35_G7_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x48 => { Name => 'AFStatus_36_G6_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x4a => { Name => 'AFStatus_37_G5_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x4c => { Name => 'AFStatus_38_I7_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x4e => { Name => 'AFStatus_39_I6_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, + 0x50 => { Name => 'AFStatus_40_I5_Vertical', %Image::ExifTool::Minolta::afStatusInfo }, +# center section, all sensors, from top to bottom, from right to left + 0x52 => { Name => 'AFStatus_41_A7', %Image::ExifTool::Minolta::afStatusInfo }, + 0x54 => { Name => 'AFStatus_42_B7', %Image::ExifTool::Minolta::afStatusInfo }, + 0x56 => { Name => 'AFStatus_43_C7', %Image::ExifTool::Minolta::afStatusInfo }, + 0x58 => { Name => 'AFStatus_44_D7', %Image::ExifTool::Minolta::afStatusInfo }, + 0x5a => { Name => 'AFStatus_45_E7', %Image::ExifTool::Minolta::afStatusInfo }, + 0x5c => { Name => 'AFStatus_46_F7', %Image::ExifTool::Minolta::afStatusInfo }, + 0x5e => { Name => 'AFStatus_47_G7', %Image::ExifTool::Minolta::afStatusInfo }, + 0x60 => { Name => 'AFStatus_48_H7', %Image::ExifTool::Minolta::afStatusInfo }, + 0x62 => { Name => 'AFStatus_49_I7', %Image::ExifTool::Minolta::afStatusInfo }, + 0x64 => { Name => 'AFStatus_50_A6', %Image::ExifTool::Minolta::afStatusInfo }, + 0x66 => { Name => 'AFStatus_51_B6', %Image::ExifTool::Minolta::afStatusInfo }, + 0x68 => { Name => 'AFStatus_52_C6', %Image::ExifTool::Minolta::afStatusInfo }, + 0x6a => { Name => 'AFStatus_53_D6', %Image::ExifTool::Minolta::afStatusInfo }, + 0x6c => { Name => 'AFStatus_54_E6_Center', %Image::ExifTool::Minolta::afStatusInfo }, + 0x6e => { Name => 'AFStatus_55_F6', %Image::ExifTool::Minolta::afStatusInfo }, + 0x70 => { Name => 'AFStatus_56_G6', %Image::ExifTool::Minolta::afStatusInfo }, + 0x72 => { Name => 'AFStatus_57_H6', %Image::ExifTool::Minolta::afStatusInfo }, + 0x74 => { Name => 'AFStatus_58_I6', %Image::ExifTool::Minolta::afStatusInfo }, + 0x76 => { Name => 'AFStatus_59_A5', %Image::ExifTool::Minolta::afStatusInfo }, + 0x78 => { Name => 'AFStatus_60_B5', %Image::ExifTool::Minolta::afStatusInfo }, + 0x7a => { Name => 'AFStatus_61_C5', %Image::ExifTool::Minolta::afStatusInfo }, + 0x7c => { Name => 'AFStatus_62_D5', %Image::ExifTool::Minolta::afStatusInfo }, + 0x7e => { Name => 'AFStatus_63_E5', %Image::ExifTool::Minolta::afStatusInfo }, + 0x80 => { Name => 'AFStatus_64_F5', %Image::ExifTool::Minolta::afStatusInfo }, + 0x82 => { Name => 'AFStatus_65_G5', %Image::ExifTool::Minolta::afStatusInfo }, + 0x84 => { Name => 'AFStatus_66_H5', %Image::ExifTool::Minolta::afStatusInfo }, + 0x86 => { Name => 'AFStatus_67_I5', %Image::ExifTool::Minolta::afStatusInfo }, +# right section, from top to bottom, from right to left + 0x88 => { Name => 'AFStatus_68_C11', %Image::ExifTool::Minolta::afStatusInfo }, + 0x8a => { Name => 'AFStatus_69_D11', %Image::ExifTool::Minolta::afStatusInfo }, + 0x8c => { Name => 'AFStatus_70_E11', %Image::ExifTool::Minolta::afStatusInfo }, + 0x8e => { Name => 'AFStatus_71_F11', %Image::ExifTool::Minolta::afStatusInfo }, + 0x90 => { Name => 'AFStatus_72_G11', %Image::ExifTool::Minolta::afStatusInfo }, + 0x92 => { Name => 'AFStatus_73_B10', %Image::ExifTool::Minolta::afStatusInfo }, + 0x94 => { Name => 'AFStatus_74_C10', %Image::ExifTool::Minolta::afStatusInfo }, + 0x96 => { Name => 'AFStatus_75_D10', %Image::ExifTool::Minolta::afStatusInfo }, + 0x98 => { Name => 'AFStatus_76_E10', %Image::ExifTool::Minolta::afStatusInfo }, + 0x9a => { Name => 'AFStatus_77_F10', %Image::ExifTool::Minolta::afStatusInfo }, + 0x9c => { Name => 'AFStatus_78_G10', %Image::ExifTool::Minolta::afStatusInfo }, + 0x9e => { Name => 'AFStatus_79_H10', %Image::ExifTool::Minolta::afStatusInfo }, + 0xa0 => { Name => 'AFStatus_80_B9', %Image::ExifTool::Minolta::afStatusInfo }, + 0xa2 => { Name => 'AFStatus_81_C9', %Image::ExifTool::Minolta::afStatusInfo }, + 0xa4 => { Name => 'AFStatus_82_D9', %Image::ExifTool::Minolta::afStatusInfo }, + 0xa6 => { Name => 'AFStatus_83_E9', %Image::ExifTool::Minolta::afStatusInfo }, + 0xa8 => { Name => 'AFStatus_84_F9', %Image::ExifTool::Minolta::afStatusInfo }, + 0xaa => { Name => 'AFStatus_85_G9', %Image::ExifTool::Minolta::afStatusInfo }, + 0xac => { Name => 'AFStatus_86_H9', %Image::ExifTool::Minolta::afStatusInfo }, + 0xae => { Name => 'AFStatus_87_B8', %Image::ExifTool::Minolta::afStatusInfo }, + 0xb0 => { Name => 'AFStatus_88_C8', %Image::ExifTool::Minolta::afStatusInfo }, + 0xb2 => { Name => 'AFStatus_89_D8', %Image::ExifTool::Minolta::afStatusInfo }, + 0xb4 => { Name => 'AFStatus_90_E8', %Image::ExifTool::Minolta::afStatusInfo }, + 0xb6 => { Name => 'AFStatus_91_F8', %Image::ExifTool::Minolta::afStatusInfo }, + 0xb8 => { Name => 'AFStatus_92_G8', %Image::ExifTool::Minolta::afStatusInfo }, + 0xba => { Name => 'AFStatus_93_H8', %Image::ExifTool::Minolta::afStatusInfo }, +# central F2.8 sensor + 0xbc => { Name => 'AFStatus_94_E6_Center_F2-8', %Image::ExifTool::Minolta::afStatusInfo }, +); + +# tag 0x9416 decoding (ref JR) +%Image::ExifTool::Sony::Tag9416 = ( + PROCESS_PROC => \&ProcessEnciphered, + WRITE_PROC => \&WriteEnciphered, + CHECK_PROC => \&Image::ExifTool::CheckBinaryData, + FORMAT => 'int8u', + NOTES => 'Valid for the ILCE-1/7M4/7SM3, ILME-FX3.', + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x0000 => { Name => 'Tag9416_0000', PrintConv => 'sprintf("%3d",$val)', RawConv => '$$self{TagVersion} = $val' }, + 0x0004 => { + Name => 'SonyISO', + Format => 'int16u', + ValueConv => '100 * 2**(16 - $val/256)', + ValueConvInv => '256 * (16 - log($val/100)/log(2))', + PrintConv => 'sprintf("%.0f",$val)', + PrintConvInv => '$val', + }, + 0x0006 => { %gain2010 }, + 0x000a => { # appr. same value as Exif ExposureTime, but shorter in HDR-modes + Name => 'SonyExposureTime2', + Format => 'int16u', + ValueConv => '$val ? 2 ** (16 - $val/256) : 0', + ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }, + 0x000c => { + Name => 'ExposureTime', + Format => 'rational32u', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', # (Bulb NC) + PrintConvInv => 'lc($val) eq "bulb" ? 0 : $val', + }, + 0x0010 => { # but sometimes deviating results + Name => 'SonyFNumber2', + Format => 'int16u', + ValueConv => '2 ** (($val/256 - 16) / 2)', + ValueConvInv => '(log($val)*2/log(2)+16)*256', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x0012 => { + Name => 'SonyMaxApertureValue', # (at current focal length) + Format => 'int16u', + ValueConv => '2 ** (($val/256 - 16) / 2)', + ValueConvInv => '(log($val)*2/log(2)+16)*256', + PrintConv => 'sprintf("%.1f",$val)', + PrintConvInv => '$val', + }, + 0x001d => { %sequenceImageNumber }, + 0x0035 => { + Name => 'ExposureProgram', + Priority => 0, + SeparateTable => 'ExposureProgram3', + PrintConv => \%sonyExposureProgram3, + }, + 0x0048 => { + Name => 'LensMount', + Condition => '$$self{Model} !~ /^(DSC-)/', + PrintConv => { + 0 => 'Unknown', + 1 => 'A-mount', + 2 => 'E-mount', + 3 => 'A-mount (3)', + }, + }, + 0x0049 => { + Name => 'LensFormat', + Condition => '$$self{Model} !~ /^(DSC-)/', + PrintConv => { + 0 => 'Unknown', + 1 => 'APS-C', + 2 => 'Full-frame', + }, + }, + 0x004a => { + Name => 'LensMount', + DataMember => 'LensMount', + RawConv => '$$self{LensMount} = $val; $$self{Model} =~ /^(DSC-)/ ? undef : $val', + PrintConv => { + 0 => 'Unknown', + 1 => 'A-mount', + 2 => 'E-mount', + }, + }, + 0x004b => { + Name => 'LensType2', + Condition => '$$self{LensMount} == 2', + Format => 'int16u', + SeparateTable => 'LensType2', + PrintConv => \%sonyLensTypes2, + }, + 0x004d => { + Name => 'LensType', + Condition => '$$self{LensMount} == 1', + Priority => 0, #PH (just to be safe) + Format => 'int16u', #PH + SeparateTable => 1, + ValueConvInv => '($val & 0xff00) == 0x8000 ? 0 : int($val)', + PrintConv => \%sonyLensTypes, + }, + 0x004f => { + Name => 'DistortionCorrParams', + Format => 'int16s[16]', + }, + 0x0070 => { %pictureProfile2010 }, #IB + 0x0071 => { + Name => 'FocalLength', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x0073 => { + Name => 'MinFocalLength', + Format => 'int16u', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x0075 => { # may give 0 for fixed focal length lenses + Name => 'MaxFocalLength', + Format => 'int16u', + RawConv => '$val || undef', + ValueConv => '$val / 10', + ValueConvInv => '$val * 10', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val =~ s/ ?mm//; $val', + }, + 0x088f => { + Name => 'VignettingCorrParams', + Condition => '$$self{Model} !~ /^(ILCE-7M4)/', + Format => 'int16s[16]', + }, + 0x0891 => { + Name => 'VignettingCorrParams', + Condition => '$$self{Model} =~ /^(ILCE-7M4)/', + Format => 'int16s[16]', + }, + 0x0914 => { + Name => 'ChromaticAberrationCorrParams', + Condition => '$$self{Model} !~ /^(ILCE-7M4)/', + Format => 'int16s[32]', + }, + 0x0916 => { + Name => 'ChromaticAberrationCorrParams', + Condition => '$$self{Model} =~ /^(ILCE-7M4)/', + Format => 'int16s[32]', + }, +); + +%Image::ExifTool::Sony::FaceInfo1 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x00 => { + Name => 'Face1Position', + Format => 'int16u[4]', + Notes => q{ + top, left, height and width of detected face. Coordinates are relative to + the full-sized unrotated image, with increasing Y downwards + }, + RawConv => '$$self{FacesDetected} < 1 ? undef : $val', + }, + 0x20 => { + Name => 'Face2Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 2 ? undef : $val', + }, + 0x40 => { + Name => 'Face3Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 3 ? undef : $val', + }, + 0x60 => { + Name => 'Face4Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 4 ? undef : $val', + }, + 0x80 => { + Name => 'Face5Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 5 ? undef : $val', + }, + 0xa0 => { + Name => 'Face6Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 6 ? undef : $val', + }, + 0xc0 => { + Name => 'Face7Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 7 ? undef : $val', + }, + 0xe0 => { + Name => 'Face8Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 8 ? undef : $val', + }, +); + +%Image::ExifTool::Sony::FaceInfo2 = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + 0x00 => { + Name => 'Face1Position', + Format => 'int16u[4]', + Notes => q{ + top, left, height and width of detected face. Coordinates are relative to + the full-sized unrotated image, with increasing Y downwards + }, + RawConv => '$$self{FacesDetected} < 1 ? undef : $val', + }, + 0x25 => { + Name => 'Face2Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 2 ? undef : $val', + }, + 0x4a => { + Name => 'Face3Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 3 ? undef : $val', + }, + 0x6f => { + Name => 'Face4Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 4 ? undef : $val', + }, + 0x94 => { + Name => 'Face5Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 5 ? undef : $val', + }, + 0xb9 => { + Name => 'Face6Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 6 ? undef : $val', + }, + 0xde => { + Name => 'Face7Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 7 ? undef : $val', + }, + 0x103 => { + Name => 'Face8Position', + Format => 'int16u[4]', + RawConv => '$$self{FacesDetected} < 8 ? undef : $val', + }, +); + +# panorama info for cameras such as the HX1, HX5, TX7 (ref 9/PH) +%Image::ExifTool::Sony::Panorama = ( + %binaryDataAttrs, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + FORMAT => 'int32u', + NOTES => q{ + Tags found in panorama images from various Sony DSC, NEX, SLT and DSLR + cameras. The width/height values of these tags are not affected by camera + rotation -- the width is always the longer dimension. + }, + # 0: 257 for panorama images, 0 for all other images (ref JR) + 1 => 'PanoramaFullWidth', # (including black/gray borders) + 2 => 'PanoramaFullHeight', + 3 => { + Name => 'PanoramaDirection', + PrintConv => { + 0 => 'Left or Up', + 1 => 'Right or Down', + }, + }, + # crop area to remove black/gray borders from full image + 4 => 'PanoramaCropLeft', + 5 => 'PanoramaCropTop', #PH guess (NC) + 6 => 'PanoramaCropRight', + 7 => 'PanoramaCropBottom', + # 8: 1728 (HX1), 1824 (HX5/TX7) (value8/value9 = 16/9) + 8 => 'PanoramaFrameWidth', #PH guess (NC) + # 9: 972 (HX1), 1026 (HX5/TX7) + 9 => 'PanoramaFrameHeight', #PH guess (NC) + # 10: 3200-3800 (HX1), 4000-4900 (HX5/TX7) + 10 => 'PanoramaSourceWidth', #PH guess (NC) + # 11: 800-1800 (larger for taller panoramas) + 11 => 'PanoramaSourceHeight', #PH guess (NC) + # 12-15: 0 +); + +# tag table for SRF0 IFD (ref 1) +%Image::ExifTool::Sony::SRF = ( + PROCESS_PROC => \&ProcessSRF, + GROUPS => { 0 => 'MakerNotes', 1 => 'SRF#', 2 => 'Camera' }, + NOTES => q{ + The maker notes in SRF (Sony Raw Format) images contain 7 IFD's with family + 1 group names SRF0 through SRF6. SRF0 and SRF1 use the tags in this table, + while SRF2 through SRF5 use the tags in the next table, and SRF6 uses + standard EXIF tags. All information other than SRF0 is encrypted, but + thanks to Dave Coffin the decryption algorithm is known. SRF images are + written by the Sony DSC-F828 and DSC-V3. + }, + # tags 0-1 are used in SRF1 + 0 => { + Name => 'SRF2Key', + Notes => 'key to decrypt maker notes from the start of SRF2', + RawConv => '$$self{SRF2Key} = $val', + }, + 1 => { + Name => 'DataKey', + Notes => 'key to decrypt the rest of the file from the end of the maker notes', + RawConv => '$$self{SRFDataKey} = $val', + }, + # SRF0 contains a single unknown tag with TagID 0x0003 +); + +# tag table for Sony RAW Format (ref 1) +%Image::ExifTool::Sony::SRF2 = ( + PROCESS_PROC => \&ProcessSRF, + GROUPS => { 0 => 'MakerNotes', 1 => 'SRF#', 2 => 'Camera' }, + NOTES => "These tags are found in the SRF2 through SRF5 IFD's.", + # the following tags are used in SRF2-5 + 2 => 'SRF6Offset', #PH + # SRFDataOffset references 2220 bytes of unknown data for the DSC-F828 - PH + 3 => { Name => 'SRFDataOffset', Unknown => 1 }, #PH + 4 => { Name => 'RawDataOffset' }, #PH + 5 => { Name => 'RawDataLength' }, #PH + 0x0043 => 'MaxApertureAtMaxFocal', #IB + 0x0044 => 'MaxApertureAtMinFocal', #IB + 0x0045 => { #IB + Name => 'MinFocalLength', + PrintConv => '"$val mm"', + }, + 0x0046 => { #IB + Name => 'MaxFocalLength', + PrintConv => '"$val mm"', + }, + 0x00c0 => 'WBRedDaylight', #IB + 0x00c1 => 'WBGreenDaylight', #IB + 0x00c2 => 'WBBlueDaylight', #IB + 0x00c3 => 'WBRedCloudy', #IB + 0x00c4 => 'WBGreenCloudy', #IB + 0x00c5 => 'WBBlueCloudy', #IB + 0x00c6 => 'WBRedFluorescent', #IB + 0x00c7 => 'WBGreenFluorescent', #IB + 0x00c8 => 'WBBlueFluorescent', #IB + 0x00c9 => 'WBRedTungsten', #IB + 0x00ca => 'WBGreenTungsten', #IB + 0x00cb => 'WBBlueTungsten', #IB + 0x00cc => 'WBRedFlash', #IB + 0x00cd => 'WBGreenFlash', #IB + 0x00ce => 'WBBlueFlash', #IB + 0x00d0 => 'WBRedAsShot', #IB + 0x00d1 => 'WBGreenAsShot', #IB + 0x00d2 => 'WBBlueAsShot', #IB +); + +# tag table for Sony RAW 2 Format Private IFD (ref 1) +%Image::ExifTool::Sony::SR2Private = ( + PROCESS_PROC => \&ProcessSR2, + WRITE_PROC => \&WriteSR2, + GROUPS => { 0 => 'MakerNotes', 1 => 'SR2', 2 => 'Camera' }, + NOTES => q{ + The SR2 format uses the DNGPrivateData tag to reference a private IFD + containing these tags. SR2 images are written by the Sony DSC-R1, but + this information is also written to ARW images by other models. + }, + 0x7200 => { + Name => 'SR2SubIFDOffset', + # (adjusting offset messes up calculations for AdobeSR2 in DNG images) + # Flags => 'IsOffset', + # (can't set OffsetPair or else DataMember won't be set when writing) + # OffsetPair => 0x7201, + DataMember => 'SR2SubIFDOffset', + RawConv => '$$self{SR2SubIFDOffset} = $val', + }, + 0x7201 => { + Name => 'SR2SubIFDLength', + # (can't set OffsetPair or else DataMember won't be set when writing) + # OffsetPair => 0x7200, + DataMember => 'SR2SubIFDLength', + RawConv => '$$self{SR2SubIFDLength} = $val', + }, + 0x7221 => { + Name => 'SR2SubIFDKey', + Format => 'int32u', + Notes => 'key to decrypt SR2SubIFD', + DataMember => 'SR2SubIFDKey', + RawConv => '$$self{SR2SubIFDKey} = $val', + PrintConv => 'sprintf("0x%.8x", $val)', + }, + 0x7240 => { #PH + Name => 'IDC_IFD', + Groups => { 1 => 'SonyIDC' }, + Condition => '$$valPt !~ /^\0\0\0\0/', # (just in case this could be zero) + Flags => 'SubIFD', + SubDirectory => { + DirName => 'SonyIDC', + TagTable => 'Image::ExifTool::SonyIDC::Main', + Start => '$val', + }, + }, + 0x7241 => { #PH + Name => 'IDC2_IFD', + Groups => { 1 => 'SonyIDC' }, + Condition => '$$valPt !~ /^\0\0\0\0/', # may be zero if dir doesn't exist + Flags => 'SubIFD', + SubDirectory => { + DirName => 'SonyIDC2', + TagTable => 'Image::ExifTool::SonyIDC::Main', + Start => '$val', + Base => '$start', + MaxSubdirs => 20, # (A900 has 10 null entries, but IDC writes only 1) + RelativeBase => 1, # needed to write SubIFD with relative offsets + }, + }, + 0x7250 => { #1 + Name => 'MRWInfo', + Condition => '$$valPt !~ /^\0\0\0\0/', # (just in case this could be zero) + SubDirectory => { + TagTable => 'Image::ExifTool::MinoltaRaw::Main', + }, + }, +); + +%Image::ExifTool::Sony::SR2SubIFD = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 1 => 'SR2SubIFD', 2 => 'Camera' }, + WRITE_GROUP => 'SR2SubIFD', + PERMANENT => 1, + SET_GROUP1 => 1, # set group1 name to directory name for all tags in table + NOTES => 'Tags in the encrypted SR2SubIFD', + 0x7300 => { Name => 'BlackLevel', Writable => 'int16u', Count => 4, Protected => 1 }, + 0x7302 => { Name => 'WB_GRBGLevelsAuto', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1) + 0x7303 => { Name => 'WB_GRBGLevels', Writable => 'int16s', Count => 4, Protected => 1 }, #1 (R1 "as shot", ref IB) + 0x7310 => { Name => 'BlackLevel', Writable => 'int16u', Count => 4, Protected => 1 }, #IB (divide by 4) + 0x7312 => { Name => 'WB_RGGBLevelsAuto', Writable => 'int16s', Count => 4, Protected => 1 }, #IB + 0x7313 => { Name => 'WB_RGGBLevels', Writable => 'int16s', Count => 4, Protected => 1 }, #6 + 0x7480 => { Name => 'WB_RGBLevelsDaylight', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1) + 0x7481 => { Name => 'WB_RGBLevelsCloudy', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1) + 0x7482 => { Name => 'WB_RGBLevelsTungsten', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1) + 0x7483 => { Name => 'WB_RGBLevelsFlash', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1) + 0x7484 => { Name => 'WB_RGBLevels4500K', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1) + 0x7486 => { Name => 'WB_RGBLevelsFluorescent', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1) + 0x74a0 => 'MaxApertureAtMaxFocal', #PH + 0x74a1 => 'MaxApertureAtMinFocal', #PH + 0x74a2 => { #IB (R1) + Name => 'MaxFocalLength', + PrintConv => '"$val mm"', + }, + 0x74a3 => { #IB (R1) + Name => 'MinFocalLength', + PrintConv => '"$val mm"', + }, + 0x74c0 => { #PH + Name => 'SR2DataIFD', + Groups => { 1 => 'SR2DataIFD' }, # (needed to set SubIFD DirName) + Flags => 'SubIFD', + SubDirectory => { + TagTable => 'Image::ExifTool::Sony::SR2DataIFD', + Start => '$val', + MaxSubdirs => 20, # an A700 ARW has 14 of these! - PH + }, + }, + 0x7800 => 'ColorMatrix', #IB (divide by 1024) + 0x7820 => { Name => 'WB_RGBLevelsDaylight', Writable => 'int16s', Count => 3, Protected => 1 }, #6 (or 5300K, ref IB) + 0x7821 => { Name => 'WB_RGBLevelsCloudy', Writable => 'int16s', Count => 3, Protected => 1 }, #6 (or 6100K, ref IB) + 0x7822 => { Name => 'WB_RGBLevelsTungsten', Writable => 'int16s', Count => 3, Protected => 1 }, #6 + 0x7823 => { Name => 'WB_RGBLevelsFlash', Writable => 'int16s', Count => 3, Protected => 1 }, #IB + 0x7824 => { Name => 'WB_RGBLevels4500K', Writable => 'int16s', Count => 3, Protected => 1 }, #IB + 0x7825 => { Name => 'WB_RGBLevelsShade', Writable => 'int16s', Count => 3, Protected => 1 }, #6 (or 7500K, ref IB) + 0x7826 => { Name => 'WB_RGBLevelsFluorescent', Writable => 'int16s', Count => 3, Protected => 1 }, #6 (~4000K) + 0x7827 => { Name => 'WB_RGBLevelsFluorescentP1', Writable => 'int16s', Count => 3, Protected => 1 }, #IB (~5000K) + 0x7828 => { Name => 'WB_RGBLevelsFluorescentP2', Writable => 'int16s', Count => 3, Protected => 1 }, #IB (~6500K) (was Flash, ref 6) + 0x7829 => { Name => 'WB_RGBLevelsFluorescentM1', Writable => 'int16s', Count => 3, Protected => 1 }, #IB (~3500K) + 0x782a => { Name => 'WB_RGBLevels8500K', Writable => 'int16s', Count => 3, Protected => 1 }, #IB + 0x782b => { Name => 'WB_RGBLevels6000K', Writable => 'int16s', Count => 3, Protected => 1 }, #IB + 0x782c => { Name => 'WB_RGBLevels3200K', Writable => 'int16s', Count => 3, Protected => 1 }, #IB + 0x782d => { Name => 'WB_RGBLevels2500K', Writable => 'int16s', Count => 3, Protected => 1 }, #IB + 0x787f => { Name => 'WhiteLevel', Writable => 'int16u', Count => 3, Protected => 1 }, #IB (divide by 4) + 0x797d => 'VignettingCorrParams', #forum7640 + 0x7980 => 'ChromaticAberrationCorrParams', #forum6509 (Sony A7 ARW) + 0x7982 => 'DistortionCorrParams', #forum6509 (Sony A7 ARW) +); + +%Image::ExifTool::Sony::SR2DataIFD = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 1 => 'SR2DataIFD', 2 => 'Camera' }, + SET_GROUP1 => 1, # set group1 name to directory name for all tags in table + # 0x7313 => 'WB_RGGBLevels', (duplicated in all SR2DataIFD's) + 0x7770 => { #PH + Name => 'ColorMode', + Priority => 0, + }, +); + +# extract information from "SONY PIC\0" maker notes (ref PH) +%Image::ExifTool::Sony::PIC = ( + PROCESS_PROC => \&ProcessSonyPIC, + GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, + NOTES => q{ + The TextInfo data is extracted as a block to preserve the formatting, and + some of the more interesting information is extracted as separate tags. + }, + TextInfo1 => { Binary => 1 }, + TextInfo2 => { Binary => 1 }, + # tags extracted from TextInfo blocks (ID's must end with ':') + 'Temp:' => { + Name => 'CameraTemperature', + RawConv => '$val =~ /^-?\d+/ ? $val : undef', + PrintConv => '"$val C"', + }, + 'Temp:Clbt:' => { Name => 'BoardTemperature', PrintConv => '"$val C"' }, #(NC) + 'Capt:' => { Name => 'SensorTemperature', PrintConv => '"$val C"' }, #(NC) + 'VR Enable C:' => { + Name => 'VibrationReduction', + PrintConv => { 0 => 'Off', 1 => 'On' }, #(NC) + }, + 'FWVer:' => 'FirmwareVersion', + 'BC:' => { + Name => 'Barcode', + Condition => 'not $$self{VALUE}{Barcode}', + ValueConv => '$val=~s/IP1.*//; $val', + }, + 'barcode:' => 'Barcode', + 'BarCode:' => { + Name => 'Barcode', + ValueConv => 'length($val) > 12 ? substr($val,0,12) : $val', + }, + # 'EvA:' - exposure compensation * 10 (ref JR) + # IFD: for documentation only -- this IFD is handled manually + IFD => { + Name => 'PIC_IFD', + SubDirectory => { TagTable => 'Image::ExifTool::Sony::Main' }, + }, +); + +# tags found in DSC-F1 PMP header (ref 10) +%Image::ExifTool::Sony::PMP = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + FIRST_ENTRY => 0, + NOTES => q{ + These tags are written in the proprietary-format header of PMP images from + the DSC-F1. + }, + 8 => { #PH + Name => 'JpgFromRawStart', + Format => 'int32u', + Notes => q{ + OK, not really a RAW file, but this mechanism is used to allow extraction of + the JPEG image from a PMP file + }, + }, + 12 => { Name => 'JpgFromRawLength', Format => 'int32u' }, + 22 => { Name => 'SonyImageWidth', Format => 'int16u' }, + 24 => { Name => 'SonyImageHeight', Format => 'int16u' }, + 27 => { + Name => 'Orientation', + PrintConv => { + 0 => 'Horizontal (normal)', + 1 => 'Rotate 270 CW',#11 + 2 => 'Rotate 180', + 3 => 'Rotate 90 CW',#11 + }, + }, + 29 => { + Name => 'ImageQuality', + PrintConv => { + 8 => 'Snap Shot', + 23 => 'Standard', + 51 => 'Fine', + }, + }, + # 40 => ImageWidth again (int16u) + # 42 => ImageHeight again (int16u) + 52 => { Name => 'Comment', Format => 'string[19]' }, + 76 => { + Name => 'DateTimeOriginal', + Description => 'Date/Time Original', + Format => 'int8u[6]', + Groups => { 2 => 'Time' }, + ValueConv => q{ + my @a = split ' ', $val; + $a[0] += $a[0] < 70 ? 2000 : 1900; + sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @a); + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 84 => { + Name => 'ModifyDate', + Format => 'int8u[6]', + Groups => { 2 => 'Time' }, + ValueConv => q{ + my @a = split ' ', $val; + $a[0] += $a[0] < 70 ? 2000 : 1900; + sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @a); + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 102 => { + Name => 'ExposureTime', + Format => 'int16s', + RawConv => '$val <= 0 ? undef : $val', + ValueConv => '2 ** (-$val / 100)', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 106 => { # (NC -- not written by DSC-F1) + Name => 'FNumber', + Format => 'int16s', + RawConv => '$val <= 0 ? undef : $val', + ValueConv => '$val / 100', # (likely wrong) + }, + 108 => { # (NC -- not written by DSC-F1) + Name => 'ExposureCompensation', + Format => 'int16s', + RawConv => '($val == -1 or $val == -32768) ? undef : $val', + ValueConv => '$val / 100', # (probably wrong too) + }, + 112 => { # (NC -- not written by DSC-F1) + Name => 'FocalLength', + Format => 'int16s', + Groups => { 2 => 'Camera' }, + RawConv => '$val <= 0 ? undef : $val', + ValueConv => '$val / 100', + PrintConv => 'sprintf("%.1f mm",$val)', + }, + 118 => { + Name => 'Flash', + Groups => { 2 => 'Camera' }, + PrintConv => { 0 => 'No Flash', 1 => 'Fired' }, + }, +); + +# tags found in 'rtmd' timed metadata in ILCE-7S/DSC-RX100M6 MP4 videos (ref PH) +%Image::ExifTool::Sony::rtmd = ( + PROCESS_PROC => \&Process_rtmd, + GROUPS => { 2 => 'Video' }, + NOTES => q{ + These tags are extracted from the 'rtmd' timed metadata of MP4 videos from + some models when the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> option is used. + }, + # 0x060e - 16 bytes starting with 0x060e2b340253 (fake tag ID - comes before 0x8300 container) + 0x060e => { Name => 'Sony_rtmd_0x060e', Format => 'int8u', %hidUnk }, + # 0x32xx - 16 bytes starting with 0x060e2b340401 + 0x3210 => { Name => 'Sony_rtmd_0x3210', Format => 'int8u', %hidUnk }, + 0x3219 => { Name => 'Sony_rtmd_0x3219', Format => 'int8u', %hidUnk }, + 0x321a => { Name => 'Sony_rtmd_0x321a', Format => 'int8u', %hidUnk }, + 0x8000 => { #forum12218 + Name => 'FNumber', + Format => 'int16u', + ValueConv => '2 ** (8-$val/8192)', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + }, + 0x8001 => { Name => 'Sony_rtmd_0x8001', Format => 'int16u', %hidUnk }, + 0x8004 => { Name => 'Sony_rtmd_0x8004', Format => 'int16u', %hidUnk }, + 0x8005 => { Name => 'Sony_rtmd_0x8005', Format => 'int16u', %hidUnk }, + 0x800a => { Name => 'Sony_rtmd_0x800a', Format => 'int16u', %hidUnk }, + 0x800b => { Name => 'Sony_rtmd_0x800b', Format => 'int16u', %hidUnk }, + # 0x8100 - 16 bytes starting with 0x060e2b340401 + 0x8100 => { Name => 'Sony_rtmd_0x8100', Format => 'int8u', %hidUnk }, + 0x8101 => { Name => 'Sony_rtmd_0x8101', Format => 'int8u', %hidUnk }, # seen: 0,1 + 0x8104 => { Name => 'Sony_rtmd_0x8104', Format => 'int16u', %hidUnk }, # seen: 35616 + 0x8105 => { Name => 'Sony_rtmd_0x8105', Format => 'int16u', %hidUnk }, # seen: 20092 + 0x8106 => { Name => 'Sony_rtmd_0x8106', Format => 'int32u', %hidUnk }, # seen: "25 1","24000 1001" frame rate? + 0x8109 => { #forum12218 + Name => 'ExposureTime', + Format => 'rational64u', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + }, + 0x810a => { #PH (NC, based on samples from forum12218) + Name => 'MasterGainAdjustment', + Format => 'int16u', + ValueConv => '$val / 100', + PrintConv => 'sprintf("%.2f dB", $val)', + }, + 0x810b => { Name => 'ISO', Format => 'int16u' }, #forum12218 + 0x810c => { #PH (NC, based on samples from forum12218) + Name => 'ElectricalExtenderMagnification', + Format => 'int16u', + }, + 0x810d => { Name => 'Sony_rtmd_0x810d', Format => 'int8u', %hidUnk }, # seen: 0,1 + 0x8115 => { Name => 'Sony_rtmd_0x8115', Format => 'int16u', %hidUnk }, # seen: 100 + # 0x8300 - container for other tags in this format + 0x8500 => { + Name => 'GPSVersionID', + Groups => { 2 => 'Location' }, + Format => 'int8u', + PrintConv => '$val =~ tr/ /./; $val', + }, + 0x8501 => { + Name => 'GPSLatitudeRef', + Groups => { 2 => 'Location' }, + Format => 'string', + PrintConv => { + N => 'North', + S => 'South', + }, + }, + 0x8502 => { + Name => 'GPSLatitude', + Groups => { 2 => 'Location' }, + Format => 'rational64u', + ValueConv => 'require Image::ExifTool::GPS;Image::ExifTool::GPS::ToDegrees($val)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)', + }, + 0x8503 => { + Name => 'GPSLongitudeRef', + Groups => { 2 => 'Location' }, + Format => 'string', + PrintConv => { + E => 'East', + W => 'West', + }, + }, + 0x8504 => { + Name => 'GPSLongitude', + Groups => { 2 => 'Location' }, + Format => 'rational64u', + ValueConv => 'require Image::ExifTool::GPS;Image::ExifTool::GPS::ToDegrees($val)', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)', + }, + 0x8507 => { + Name => 'GPSTimeStamp', + Groups => { 2 => 'Time' }, + Format => 'rational64u', + ValueConv => 'require Image::ExifTool::GPS;Image::ExifTool::GPS::ConvertTimeStamp($val)', + PrintConv => 'Image::ExifTool::GPS::PrintTimeStamp($val)', + }, + 0x8509 => { + Name => 'GPSStatus', + Groups => { 2 => 'Location' }, + Format => 'string', + PrintConv => { + A => 'Measurement Active', + V => 'Measurement Void', + }, + }, + 0x850a => { + Name => 'GPSMeasureMode', + Groups => { 2 => 'Location' }, + Format => 'string', + PrintConv => { + 2 => '2-Dimensional Measurement', + 3 => '3-Dimensional Measurement', + }, + }, + 0x8512 => { + Name => 'GPSMapDatum', + Groups => { 2 => 'Location' }, + Format => 'string', + }, + 0x851d => { + Name => 'GPSDateStamp', + Groups => { 2 => 'Time' }, + Format => 'string', + ValueConv => 'Image::ExifTool::Exif::ExifDate($val)', + }, + 0xe000 => { Name => 'Sony_rtmd_0xe000', Format => 'int8u', %hidUnk }, # (16 bytes) + 0xe300 => { Name => 'Sony_rtmd_0xe300', Format => 'int8u', %hidUnk }, # seen: 0,1 + 0xe301 => { Name => 'Sony_rtmd_0xe301', Format => 'int32u', %hidUnk }, # seen: 100,1600,12800 + 0xe302 => { Name => 'Sony_rtmd_0xe302', Format => 'int8u', %hidUnk }, # seen: 1 + 0xe303 => { #forum12218 + Name => 'WhiteBalance', + Format => 'int8u', + PrintConv => { + 1 => 'Incandescent', + 2 => 'Fluorescent', + 4 => 'Daylight', + 5 => 'Cloudy', + 6 => 'Custom', # ("Shade" uses this value too) + 255 => 'Preset', + }, + }, + 0xe304 => { + Name => 'DateTime', + Groups => { 2 => 'Time' }, + Format => 'undef', + ValueConv => 'my @a=unpack("x1H4H2H2H2H2H2",$val); "$a[0]:$a[1]:$a[2] $a[3]:$a[4]:$a[5]"', + PrintConv => '$self->ConvertDateTime($val)', + }, + 0xe435 => { Name => 'Sony_rtmd_0xe435', Format => 'int32u', %hidUnk }, # seen: 2000 + 0xe437 => { Name => 'Sony_rtmd_0xe437', Format => 'int32s', %hidUnk }, # seen: -3800 to -3400 + 0xe43b => { + Name => 'PitchRollYaw', + Format => 'int16s', + RawConv => 'substr($val, 8)', + }, + 0xe445 => { Name => 'Sony_rtmd_0xe445', Format => 'int32u', %hidUnk }, # seen: 2000 + 0xe44b => { + Name => 'Accelerometer', # (NC) + Format => 'int16s', + RawConv => 'substr($val, 8)', + }, + # f010 - 2048 bytes + # f020 - 543 bytes +); + +# Composite Sony tags +%Image::ExifTool::Sony::Composite = ( + GROUPS => { 2 => 'Camera' }, + FocusDistance => { + Require => { + 0 => 'Sony:FocusPosition', + 1 => 'FocalLength', + }, + Notes => 'distance in metres = FocusPosition * FocalLength / 1000', + ValueConv => '$val >= 128 ? "inf" : $val * $val[1] / 1000', + PrintConv => '$val eq "inf" ? $val : "$val m"', + }, + FocusDistance2 => { + # For DSLR-A550 and newer, NEX/ILCE/SLT/ILCA (only A65V/A77V are missing ...): + # seen FocusPosition2 with values from 80 - 255 (and 21 for Touit 12mm...) + # Formula from minolta.pm (WBInfoA100 - 0x49bb) gives mostly correct/acceptable distance indications. + # (https://exiftool.org/forum/index.php/topic,3688.0.html) + # if this value is the 35mm equivalent magnification, then the formula could + # be (1.5 * 2**($val/16-5)+1) * FocalLength, but this tends to underestimate + # distance by about 18% (ref 20) (255=inf) + # modified 16-10-2014 based on A99V measurements: use FocalLengthIn35mmFormat and leave out the "1.5*" factor. + Require => { + 0 => 'Sony:FocusPosition2', + 1 => 'FocalLengthIn35mmFormat', + }, + ValueConv => q{ + return undef unless $val; + return 'inf' if $val >= 255; + return (2**($val/16-5) + 1) * $val[1] / 1000; + }, + PrintConv => '$val eq "inf" ? $val : sprintf("%.2f m",$val)', + }, + GPSDateTime => { + Description => 'GPS Date/Time', + Groups => { 2 => 'Time' }, + SubDoc => 1, # generate for all sub-documents + Require => { + 0 => 'Sony:GPSDateStamp', + 1 => 'Sony:GPSTimeStamp', + }, + ValueConv => '"$val[0] $val[1]Z"', + PrintConv => '$self->ConvertDateTime($val)', + }, + GPSLatitude => { + SubDoc => 1, # generate for all sub-documents + Groups => { 2 => 'Location' }, + Require => { + 0 => 'Sony:GPSLatitude', + 1 => 'Sony:GPSLatitudeRef', + }, + ValueConv => '$val[1] =~ /^S/i ? -$val[0] : $val[0]', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + }, + GPSLongitude => { + SubDoc => 1, # generate for all sub-documents + Groups => { 2 => 'Location' }, + Require => { + 0 => 'Sony:GPSLongitude', + 1 => 'Sony:GPSLongitudeRef', + }, + ValueConv => '$val[1] =~ /^W/i ? -$val[0] : $val[0]', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::Sony'); + +sub SortLensTypes +{ + return $a <=> $b unless $a =~ /\./ and $b =~ /\./; + my @a = split /\./, $a; + my @b = split /\./, $b; + # must compare the decimal part separately to sort in proper order + return $a[0] <=> $b[0] || $a[1] <=> $b[1]; +} + +# fill in Sony LensType lookup based on Minolta values +{ + my $minoltaTypes = \%Image::ExifTool::Minolta::minoltaLensTypes; + %sonyLensTypes = %$minoltaTypes; + my $other = $$minoltaTypes{OTHER}; + delete $$minoltaTypes{Notes}; # (temporarily) + delete $$minoltaTypes{OTHER}; # (temporarily) + my $id; + # 5-digit lens ID's are missing the last digit (usually "1") in the metadata for + # some Sony models, so generate corresponding 4-digit entries for these cameras + foreach $id (sort SortLensTypes keys %$minoltaTypes) { + next if $id < 10000; + my $sid = int($id/10); + my $i; + my $lens = $$minoltaTypes{$id}; + if ($sonyLensTypes{$sid}) { + # put lens name with "or" first in list + if ($lens =~ / or /) { + my $tmp = $sonyLensTypes{$sid}; + $sonyLensTypes{$sid} = $lens; + $lens = $tmp; + } + for (;;) { + $i = ($i || 0) + 1; + $sid = int($id/10) . ".$i"; + last unless $sonyLensTypes{$sid}; + } + } + $sonyLensTypes{$sid} = $lens; + } + $$minoltaTypes{Notes} = $sonyLensTypes{Notes}; # (restore original Notes) + $$minoltaTypes{OTHER} = $other; +} + +#------------------------------------------------------------------------------ +# Process "SONY PIC\0" maker notes (DSC-H200/J10/W370/W510, MHS-TS20, ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 +sub ProcessSonyPIC($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $start = $$dirInfo{DirStart} || 0; + my $len = $$dirInfo{DirLen} || (length($$dataPt) - $start); + my $data = substr($$dataPt, $start, $len); + + # H200 panorama images have an IFD at offset 12 (non-panoramas have 0's here) + # - assume other images could too, but do a bit of validation to check + # - MHS-TS20 images have some other data here + if ($len >= 26) { + my $count = Get16u($dataPt, $start + 12); + if ($count > 256) { + ToggleByteOrder(); + $count = Get16u($dataPt, $start + 12); + } + if ($count and $count < 256) { + my $format = Get16u($dataPt, $start + 16); + if ($format >= 1 and $format <= 10) { + $$dirInfo{DirStart} = $start + 12; + $$dirInfo{DirLen} = $len - 12; + my $sonyTable = GetTagTable('Image::ExifTool::Sony::Main'); + Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $sonyTable); + } + } + } + # Do a brute force search for text data: + # For the DSC-J10/W370/W510 the first text block is at offset 0x1ec and + # starts with "BarCode:". For the H200 it is at 0x1f0 and starts with "BC:". + # For the TS20 it is at 0x5b and starts with "V400 AELOG\nbarcode:". + # The second text block starts with "AFLOG" (Auto-Focus log) and is at + # 0x600 for all models, except for the TS20 it is at 0x45b. + my $i = 0; + while ($data =~ /(\w[\x09\x0a\x0d\x20-\x7e]+)/sg) { + next unless length $1 > 32; + my ($tag, $val) = ('TextInfo' . (++$i), $1); + $$tagTablePtr{$tag} or AddTagToTable($tagTablePtr, $tag, { Name => $tag, Binary => 1 }); + $et->HandleTag($tagTablePtr, $tag, $val); + # extract interesting tags separately (might want to speed this up) + foreach $tag (sort { lc $a cmp lc $b } keys %$tagTablePtr) { + next unless $tag =~ /:$/ and $val =~ /\b$tag\s*([^\s;,:]+)/; + $et->HandleTag($tagTablePtr, $tag, $1); + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# MeterInfo value conversions +# Inputs: 0) value +# Returns: converted value +sub ConvMeter1($) +{ + my $val = shift; + return \$val unless length($val) == 90; + my @a = unpack("SLLSLLSLLSLLSLLSLLSLLSLLSLL",$val); + return join ' ', @a; +} +sub ConvMeter2($) +{ + my $val = shift; + return \$val unless length($val) == 110; + my @a = unpack("SLLSLLSLLSLLSLLSLLSLLSLLSLLSLLSLL",$val); + return join ' ', @a; +} + +#------------------------------------------------------------------------------ +# LensSpec value conversions +# Inputs: 0) value +# Returns: converted value +# Notes: unpacks in format compatible with LensInfo, with extra flags bytes at start and end +sub ConvLensSpec($) +{ + my $val = shift; + return \$val unless length($val) == 8; + my @a = unpack("H2H4H4H2H2H2",$val); + $a[1] += 0; $a[2] += 0; # remove leading zeros from focal lengths + s/([a-f])/hex($1)/e foreach @a[3,4]; # convert hex digits (ie. "b0" = f11) + $a[3] /= 10; $a[4] /= 10; # divide f-numbers by 10 + return join ' ', @a; +} +sub ConvInvLensSpec($) +{ + my $val = shift; + my @a=split(" ", $val); + return $val unless @a == 6; + $a[3] *= 10; $a[4] *= 10; # f-numbers are multiplied by 10 + s/^(\d{2})0$/sprintf('%x0',$1)/e foreach @a[3,4]; + $_ = hex foreach @a; # convert from hex + return pack 'CnnCCC', @a; +} + +#------------------------------------------------------------------------------ +# Print Sony LensSpec value +# Inputs: 0) LensSpec numerical value +# Returns: converted LensSpec string (eg. "DT 18-55mm F3.5-5.6 SAM") +# Refs: http://equational.org/importphotos/alphalensinfo.html +# http://www.dyxum.com/dforum/the-lens-information-different-from-lensid_topic37682.html +my @lensFeatures = ( + # lens features in the order they are added to the LensSpec string + # (high byte of Mask/Bits represents byte 0 of LensSpec, low byte is byte 7) + # Mask { Bits Name Bits Name } Prefix flag + # ------ ------ ----- ------ ----- ----------- + [ 0x4000, { 0x4000 => 'PZ' }, 1 ], + [ 0x0300, { 0x0100 => 'DT', 0x0200 => 'FE', 0x0300 => 'E' }, 1 ], # (will come before preceding prefix), FE added (ref JR) + [ 0x00e0, { 0x0020 => 'STF', 0x0040 => 'Reflex', 0x0060 => 'Macro', 0x0080 => 'Fisheye' } ], + [ 0x000c, { 0x0004 => 'ZA', 0x0008 => 'G' } ], + [ 0x0003, { 0x0001 => 'SSM', 0x0002 => 'SAM' } ], + [ 0x8000, { 0x8000 => 'OSS' } ], + [ 0x2000, { 0x2000 => 'LE' } ], #JR + [ 0x0800, { 0x0800 => 'II' } ], #JR +); +sub PrintLensSpec($) +{ + my $val = shift; + my ($rtnVal, $feature, $f1, $sf, $lf, $sa, $la, $f2); + # 0=flags1, 1=short focal, 2=long focal, 3=max aperture at short focal, + # 4=max aperture at long focal, 5=flags2 + my @a = split ' ', $val; + if (@a == 2) { # LensSpecFeatures patch + ($f1, $f2) = @a; + $rtnVal = ''; + } elsif (@a >= 6) { + ($f1, $sf, $lf, $sa, $la, $f2) = @a; + # crude validation of focal length and aperture values + if ($sf != 0 and $sa != 0 and ($lf == 0 or $lf >= $sf) and ($la == 0 or $la >= $sa)) { + # use focal and aperture range if this is a zoom lens + $sf .= '-' . $lf if $lf != $sf and $lf != 0; + $sa .= '-' . $la if $sa != $la and $la != 0; + $rtnVal = "${sf}mm F$sa"; # heart of LensSpec is a LensInfo string + } + } + if (defined $rtnVal) { + # loop through available lens features + my $flags = hex($f1 . $f2); + foreach $feature (@lensFeatures) { + my $bits = $$feature[0] & $flags; + next unless $bits or $$feature[1]{$bits}; + # add feature name as a prefix or suffix to the LensSpec + my $str = $$feature[1]{$bits} || sprintf('Unknown(%.4x)',$bits); + $rtnVal = $rtnVal ? ($$feature[2] ? "$str $rtnVal" : "$rtnVal $str") : $str; + } + } else { + $rtnVal = "Unknown ($val)"; + } + return $rtnVal; +} +# inverse conversion +sub PrintInvLensSpec($;$$) +{ + my ($val, $self, $features) = @_; + return $1 if $val =~ /Unknown \((.*)\)/i; + my ($sf, $lf, $sa, $la) = Image::ExifTool::Exif::GetLensInfo($val); + my $str; + if ($features) { + $str = ''; + } elsif ($sf) { + # fixed focal length and aperture have zero for 2nd number + $lf = 0 if $lf == $sf; + $la = 0 if $la == $sa; + $str = " $sf $lf $sa $la"; + } else { + return undef; + } + my $flags = 0; + my ($feature, $bits); + foreach $feature (@lensFeatures) { + foreach $bits (keys %{$$feature[1]}) { + # set corresponding flag bits for each feature name found + my $name = $$feature[1]{$bits}; + $val =~ /\b$name\b/i and $flags |= $bits; + } + } + return sprintf "%.2x$str %.2x", $flags>>8, $flags&0xff; +} + +#------------------------------------------------------------------------------ +# Read/Write MoreInfo information (tag 0x0020, count 20480) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success when reading, or new directory when writing (IsWriting set) +sub ProcessMoreInfo($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to write routine + my $dataPt = $$dirInfo{DataPt}; + my $start = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || length($$dataPt); + my $isWriting = $$dirInfo{IsWriting}; + my $rtnVal = $isWriting ? undef : 0; + return $rtnVal if $dirLen < 4; + + my $num = Get16u($dataPt, $start); # number of entries + my $len = Get16u($dataPt, $start + 2); # total data length + + if ($dirLen < 4 + $num * 4) { + $et->Warn('Truncated MoreInfo data', 1); + return $rtnVal; + } + if ($num > 50) { + $et->Warn('Possibly corrupted MoreInfo data', 1); + return $rtnVal; + } + + $et->VerboseDir('MoreInfo', $num, $len) unless $isWriting; + + if ($len > $dirLen) { + $et->Warn('MoreInfo data length too large', 1); + $len = $dirLen; + } + # loop through the MoreInfo index section to get the block offsets and tag ID's + # (in case they are out of order, even though this may never happen) + my ($i, @offset, @tagID, %blockSize); + for ($i=0; $i<$num; ++$i) { + my $entry = $start + 4 + $i * 4; + push @tagID, Get16u($dataPt, $entry); + push @offset, Get16u($dataPt, $entry + 2); + if ($offset[-1] > $len and $offset[-1] <= $dirLen) { + $et->Warn('MoreInfo data length too small', 1); + $len = $dirLen; + } + } + # generate a lookup table of block sizes + my @sorted = sort { $a <=> $b } @offset; + push @sorted, 0xffff; # (simplifies logic in loop below) + for ($i=0; $i<$num; ++$i) { + my $offset = $sorted[$i]; + my $size = $sorted[$i+1] - $offset; + # note that block size will be negative for blocks with starting + # offsets greater than $dirLen, but we will ignore these below + $size = $len - $offset if $size > $len - $offset; + # (if blockSize is already defined for this offset, then there + # are 2 blocks with the same starting offset and the existing + # size must be zero. Since we can't know which block is + # actually non-zero size, the reasonable thing to do is + # assume that both have a size of zero) + $blockSize{$offset} = $size unless defined $blockSize{$offset}; + } + # initialize successful return value + $rtnVal = $isWriting ? substr($$dataPt, $start, $dirLen) : 1; + # now process each block + my $unknown = $$et{OPTIONS}{Unknown}; + for ($i=0; $i<$num; ++$i) { + next if $offset[$i] > $dirLen; # ignore bad offsets + my $tag = $tagID[$i]; + if ($isWriting) { + # write new tags + my $tagInfo = $$tagTablePtr{$tag}; + next unless ref $tagInfo eq 'HASH' and $$tagInfo{SubDirectory}; + my $offset = $offset[$i]; + my $size = $blockSize{$offset}; + next unless $size; # ignore zero-length blocks + my %dirInfo = ( + DirName => $$tagInfo{Name}, + Parent => $$dirInfo{DirName}, + DataPt => \$rtnVal, + DirStart => $offset, + DirLen => $size, + ); + my $subTable = GetTagTable($$tagInfo{SubDirectory}{TagTable}); + my $val = $et->WriteDirectory(\%dirInfo, $subTable); + # update this block in the returned MoreInfo data + substr($rtnVal, $offset, $size) = $val if defined $val; + next; + } + # generate binary tables for unknown tags if -U option used + if (not defined $$tagTablePtr{$tag} and $unknown > 1) { + my $name = sprintf('MoreInfo%.4x', $tag); + my $table = "Image::ExifTool::Sony::$name"; + no strict 'refs'; + %$table = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + FIRST_ENTRY => 0, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + ); + use strict 'refs'; + my %tagInfo = ( + Name => $name, + SubDirectory => { TagTable => $table }, + ); + AddTagToTable($tagTablePtr, $tag, \%tagInfo); + } + $et->HandleTag($tagTablePtr, $tag, undef, + Index => $i, + DataPt => $dataPt, + DataPos => $$dirInfo{DataPos}, + Start => $start + $offset[$i], + Size => $blockSize{$offset[$i]}, + ); + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Read Sony DSC-F1 PMP file +# Inputs: 0) ExifTool object ref, 1) dirInfo ref +# Returns: 1 on success when reading, 0 if this isn't a valid PMP file +sub ProcessPMP($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $buff; + $raf->Read($buff, 128) == 128 or return 0; + # validate header length (124 bytes) + $buff =~ /^.{8}\0{3}\x7c.{112}\xff\xd8\xff\xdb$/s or return 0; + $et->SetFileType(); + SetByteOrder('MM'); + $et->FoundTag(Make => 'Sony'); + $et->FoundTag(Model => 'DSC-F1'); + # extract information from 124-byte header + my $tagTablePtr = GetTagTable('Image::ExifTool::Sony::PMP'); + my %dirInfo = ( DataPt => \$buff, DirName => 'PMP' ); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + # process JPEG image + $raf->Seek(124, 0); + $$dirInfo{Base} = 124; + $et->ProcessJPEG($dirInfo); + return 1; +} + +#------------------------------------------------------------------------------ +# Set the ARW file type and decide between SubIFD and A100DataOffset +# Inputs: 0) ExifTool object ref, 1) reference to tag 0x14a raw data +# Returns: true if tag 0x14a is a SubIFD, false otherwise +sub SetARW($$) +{ + my ($et, $valPt) = @_; + + # assume ARW for now -- SR2's get identified when FileFormat is parsed + $et->OverrideFileType($$et{TIFF_TYPE} = 'ARW'); + + # this should always be a SubIFD for models other than the A100 + return 1 unless $$et{Model} eq 'DSLR-A100' and length $$valPt == 4; + + # for the A100, IFD0 tag 0x14a is either a pointer to the raw data if this is + # an original image, or a SubIFD offset if the image was edited by Sony IDC, + # so assume it points to the raw data if it isn't a valid IFD (this assumption + # will be checked later when we try to parse the SR2Private directory) + my %subdir = ( + DirStart => Get32u($valPt, 0), + Base => 0, + RAF => $$et{RAF}, + AllowOutOfOrderTags => 1, # doh! + ); + return Image::ExifTool::Exif::ValidateIFD(\%subdir); +} + +#------------------------------------------------------------------------------ +# Finish writing ARW image, patching necessary Sony quirks, etc +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) EXIF data ref, 3) image data reference +# Returns: undef on success, error string otherwise +# Notes: (it turns that all of this is for the A100 only) +sub FinishARW($$$$) +{ + my ($et, $dirInfo, $dataPt, $imageData) = @_; + + # pre-scan IFD0 to get IFD entry offsets for each tag + my $dataLen = length $$dataPt; + return 'Truncated IFD0' if $dataLen < 2; + my $n = Get16u($dataPt, 0); + return 'Truncated IFD0' if $dataLen < 2 + 12 * $n; + my ($i, %entry, $dataBlock, $pad, $dataOffset); + for ($i=0; $i<$n; ++$i) { + my $entry = 2 + $i * 12; + $entry{Get16u($dataPt, $entry)} = $entry; + } + # fix up SR2Private offset and A100DataOffset (A100 only) + if ($entry{0xc634} and $$et{MRWDirData}) { + return 'Unexpected MRW block' unless $$et{Model} eq 'DSLR-A100'; + return 'Missing A100DataOffset' unless $entry{0x14a} and $$et{A100DataOffset}; + # account for total length of image data + my $totalLen = 8 + $dataLen; + if (ref $imageData) { + foreach $dataBlock (@$imageData) { + my ($pos, $size, $pad) = @$dataBlock; + $totalLen += $size + $pad; + } + } + # align MRW block on an even 4-byte boundary + my $remain = $totalLen & 0x03; + $pad = 4 - $remain and $totalLen += $pad if $remain; + # set offset for the MRW directory data + Set32u($totalLen, $dataPt, $entry{0xc634} + 8); + # also pad MRWDirData data to an even 4 bytes (just to be safe) + $remain = length($$et{MRWDirData}) & 0x03; + $$et{MRWDirData} .= "\0" x (4 - $remain) if $remain; + $totalLen += length $$et{MRWDirData}; + # fix up A100DataOffset + $dataOffset = $$et{A100DataOffset}; + Set32u($totalLen, $dataPt, $entry{0x14a} + 8); + } + # patch double-referenced and incorrectly-sized A100 PreviewImage + if ($entry{0x201} and $$et{A100PreviewStart} and + $entry{0x202} and $$et{A100PreviewLength}) + { + Set32u($$et{A100PreviewStart}, $dataPt, $entry{0x201} + 8); + Set32u($$et{A100PreviewLength}, $dataPt, $entry{0x202} + 8); + } + # write TIFF IFD structure + my $outfile = $$dirInfo{OutFile}; + my $header = GetByteOrder() . Set16u(0x2a) . Set32u(8); + Write($outfile, $header, $$dataPt) or return 'Error writing'; + # copy over image data + if (ref $imageData) { + $et->CopyImageData($imageData, $outfile) or return 'Error copying image data'; + } + # write MRW data if necessary + if ($$et{MRWDirData}) { + Write($outfile, "\0" x $pad) if $pad; # write padding if necessary + Write($outfile, $$et{MRWDirData}); + delete $$et{MRWDirData}; + # set TIFF_END to copy over the MRW image data + $$et{TIFF_END} = $dataOffset if $dataOffset; + } + return undef; +} + +#------------------------------------------------------------------------------ +# Decrypt/Encrypt Sony data (ref 1) (reversible encryption) +# Inputs: 0) data reference, 1) start offset, 2) data length, 3) decryption key +# Returns: nothing (original data buffer is updated with decrypted data) +# Notes: data length should be a multiple of 4 +sub Decrypt($$$$) +{ + my ($dataPt, $start, $len, $key) = @_; + my ($i, $j, @pad); + my $words = int ($len / 4); + + for ($i=0; $i<4; ++$i) { + my $lo = ($key & 0xffff) * 0x0edd + 1; + my $hi = ($key >> 16) * 0x0edd + ($key & 0xffff) * 0x02e9 + ($lo >> 16); + $pad[$i] = $key = (($hi & 0xffff) << 16) + ($lo & 0xffff); + } + $pad[3] = ($pad[3] << 1 | ($pad[0]^$pad[2]) >> 31) & 0xffffffff; + for ($i=4; $i<0x7f; ++$i) { + $pad[$i] = (($pad[$i-4]^$pad[$i-2]) << 1 | + ($pad[$i-3]^$pad[$i-1]) >> 31) & 0xffffffff; + } + my @data = unpack("x$start N$words", $$dataPt); + for ($i=0x7f,$j=0; $j<$words; ++$i,++$j) { + $data[$j] ^= $pad[$i & 0x7f] = $pad[($i+1) & 0x7f] ^ $pad[($i+65) & 0x7f]; + } + substr($$dataPt, $start, $words*4) = pack('N*', @data); +} + +#------------------------------------------------------------------------------ +# Decipher/encipher Sony tag 0x2010, 0x900b, 0x9050 and 0x940x data (ref PH) +# Inputs: 0) data reference, 1) true to encipher the data +sub Decipher($;$) +{ + my ($dataPt, $encipher) = @_; + # This is a simple substitution cipher, so use a hardcoded translation table for speed. + # The formula is: $c = ($b*$b*$b) % 249, where $c is the enciphered data byte + # (note that bytes with values 249-255 are not translated, and 0-1, 82-84, + # 165-167 and 248 have the same enciphered value) + if ($encipher) { # encipher + $$dataPt =~ tr/\x02-\xf7/\x08\x1b\x40\x7d\xd8\x5e\x0e\xe7\x04V\xea\xcd\x05\x8ap\xb6i\x88\x200\xbe\xd7\x81\xbb\x92\x0c\x28\xecl\xa0\x95Q\xd3\x2f\x5dj\x5c9\x07\xc5\x87L\x1a\xf0\xe2\xef\x24y\x02\xb7\xac\xe0\x60\x2bG\xba\x91\xcbu\x8e\x233\xc4\xe3\x96\xdc\xc2N\x7fb\xf6OeE\xeet\xcf\x138KRST\x5bn\x93\xd02\xb1aAW\xa9D\x27X\xdd\xc3\x10\xbc\xdbs\x83\x181\xd4\x15\xe5_\x7bF\xbf\xf3\xe8\xa4\x2d\x82\xb0\xbd\xaf\x8cZ\x1f\xda\x9fmJ\x3cIw\xccU\x11\x06\x3a\xb3\x7e\x9a\x14\xe4\x25\xc8\xe1v\x86\x1e\x3d\xe96\x1c\xa1\xd2\xb5P\xa2\xb8\x98H\xc7\x29f\x8b\x9e\xa5\xa6\xa7\xae\xc1\xe6\x2a\x85\x0b\xb4\x94\xaa\x03\x97z\xab7\x1dc\x165\xc6\xd6k\x84\x2eh\x3f\xb2\xce\x99\x19MB\xf7\x80\xd5\x0a\x17\x09\xdf\xadr4\xf2\xc0\x9d\x8f\x9c\xca\x26\xa8dY\x8d\x0d\xd1\xedg\x3ex\x22\x3b\xc9\xd9q\x90C\x89o\xf4\x2c\x0f\xa3\xf5\x12\xeb\x9b\x21\x7c\xb9\xde\xf1/; + } else { # decipher + $$dataPt =~ tr/\x08\x1b\x40\x7d\xd8\x5e\x0e\xe7\x04V\xea\xcd\x05\x8ap\xb6i\x88\x200\xbe\xd7\x81\xbb\x92\x0c\x28\xecl\xa0\x95Q\xd3\x2f\x5dj\x5c9\x07\xc5\x87L\x1a\xf0\xe2\xef\x24y\x02\xb7\xac\xe0\x60\x2bG\xba\x91\xcbu\x8e\x233\xc4\xe3\x96\xdc\xc2N\x7fb\xf6OeE\xeet\xcf\x138KRST\x5bn\x93\xd02\xb1aAW\xa9D\x27X\xdd\xc3\x10\xbc\xdbs\x83\x181\xd4\x15\xe5_\x7bF\xbf\xf3\xe8\xa4\x2d\x82\xb0\xbd\xaf\x8cZ\x1f\xda\x9fmJ\x3cIw\xccU\x11\x06\x3a\xb3\x7e\x9a\x14\xe4\x25\xc8\xe1v\x86\x1e\x3d\xe96\x1c\xa1\xd2\xb5P\xa2\xb8\x98H\xc7\x29f\x8b\x9e\xa5\xa6\xa7\xae\xc1\xe6\x2a\x85\x0b\xb4\x94\xaa\x03\x97z\xab7\x1dc\x165\xc6\xd6k\x84\x2eh\x3f\xb2\xce\x99\x19MB\xf7\x80\xd5\x0a\x17\x09\xdf\xadr4\xf2\xc0\x9d\x8f\x9c\xca\x26\xa8dY\x8d\x0d\xd1\xedg\x3ex\x22\x3b\xc9\xd9q\x90C\x89o\xf4\x2c\x0f\xa3\xf5\x12\xeb\x9b\x21\x7c\xb9\xde\xf1/\x02-\xf7/; + } +} + +#------------------------------------------------------------------------------ +# Process Sony 0x94xx cipherdata directory +# Inputs: 0) ExifTool object ref, 1) directory information ref, 2) tag table ref +# Returns: 1 on success +# Notes: +# 1) dirInfo may contain VarFormatData (reference to empty list) to return +# details about any variable-length-format tags in the table (used when writing) +# 2) A bug in ExifTool 9.04-9.10 could have double-enciphered these blocks +sub ProcessEnciphered($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart); + my $data = substr($$dataPt, $dirStart, $dirLen); + my %dirInfo = ( + %$dirInfo, + DataPt => \$data, + DataPos => $$dirInfo{DataPos} + $dirStart, + DirStart => 0, + ); + Decipher(\$data); + if ($$et{DoubleCipher}) { + Decipher(\$data); + $et->WarnOnce('Some Sony metadata is double-enciphered. Write any tag to fix',1); + } + if ($et->Options('Verbose') > 2) { + my $tagInfo = $$dirInfo{TagInfo} || { Name => 'data' }; + my $str = $$et{DoubleCipher} ? 'ouble-d' : ''; + $et->VerboseDir("D${str}eciphered $$tagInfo{Name}"); + $et->VerboseDump(\$data, + Prefix => $$et{INDENT} . ' ', + DataPos => $$dirInfo{DirStart} + $$dirInfo{DataPos} + ($$dirInfo{Base} || 0), + ); + } + return $et->ProcessBinaryData(\%dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Write Sony 0x94xx cipherdata directory +# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref +# Returns: cipherdata block or undefined on error +sub WriteEnciphered($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; + my $dataPt = $$dirInfo{DataPt}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart); + my $data = substr($$dataPt, $dirStart, $dirLen); + my $changed = $$et{CHANGED}; + Decipher(\$data); + # fix double-enciphered data (due to bug in ExifTool 9.04-9.10) + if ($$et{DoubleCipher}) { + Decipher(\$data); + ++$$et{CHANGED}; + $et->WarnOnce('Fixed double-enciphered Sony metadata',1); + } + my %dirInfo = ( + %$dirInfo, + DataPt => \$data, + DataPos => $$dirInfo{DataPos} + $dirStart, + DirStart => 0, + ); + $data = $et->WriteBinaryData(\%dirInfo, $tagTablePtr); + if ($changed == $$et{CHANGED}) { + # nothing changed, so recover original data + $data = substr($$dataPt, $dirStart, $dirLen); + } elsif (defined $data) { + Decipher(\$data,1); # re-encipher + } + return $data; +} + +#------------------------------------------------------------------------------ +# Process "rtmd" timed metadata embedded in Sony MP4 videos (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub Process_rtmd($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = ($$dirInfo{DataPos} || 0) + ($$dirInfo{Base} || 0); + my $end = length $$dataPt; + return 0 if $end < 2; + $et->VerboseDir('Sony rtmd', undef, $end); + # Note: The 0x1c-byte header contains some as-yet unextracted information: + # offset 0x0e: int8u some minutes + # 0x0f: int8u some seconds + # 0x11: int8u frame number? (0-24 or 0-25) + my $pos = Get16u($dataPt, 0); # get header length (= 0x1c) + while ($pos + 4 < $end) { + my $tag = Get16u($dataPt, $pos); + last if $tag == 0; + my $len = Get16u($dataPt, $pos+2); + if ($tag == 0x060e) { + $len = 0x10; # (unknown 16 bytes starting with 0x060e2b340253) + } else { + $pos += 4; # skip tag id/size + next if $tag == 0x8300; # descend into contents of 0x8300 (container) + } + last if $pos + $len > $end; + $et->HandleTag($tagTablePtr, $tag, undef, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $pos, + Size => $len, + ); + $pos += $len; # step to next tag + } + return 1; +}; + +#------------------------------------------------------------------------------ +# Process SRF maker notes +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success +sub ProcessSRF($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $start = $$dirInfo{DirStart}; + my $verbose = $et->Options('Verbose'); + + # process IFD chain + my ($ifd, $success); + for ($ifd=0; ; ) { + # switch tag table for SRF2-5 and SRF6 + if ($ifd == 2) { + $tagTablePtr = GetTagTable('Image::ExifTool::Sony::SRF2'); + } elsif ($ifd == 6) { + # SRF6 uses standard EXIF tags + $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main'); + } + my $srf = $$dirInfo{DirName} = "SRF$ifd"; + $$et{SET_GROUP1} = $srf; + $success = Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr); + delete $$et{SET_GROUP1}; + last unless $success; +# +# get pointer to next IFD +# + my $count = Get16u($dataPt, $$dirInfo{DirStart}); + my $dirEnd = $$dirInfo{DirStart} + 2 + $count * 12; + last if $dirEnd + 4 > length($$dataPt); + my $nextIFD = Get32u($dataPt, $dirEnd); + last unless $nextIFD; + $nextIFD -= $$dirInfo{DataPos}; # adjust for position of makernotes data + $$dirInfo{DirStart} = $nextIFD; +# +# decrypt next IFD data if necessary +# + ++$ifd; + my ($key, $len); + if ($ifd == 1) { + # get the key to decrypt IFD1 + my $cp = $start + 0x8ddc; # why? + last if $cp + 1 > length($$dataPt); + my $ip = $cp + 4 * unpack("x$cp C", $$dataPt); + last if $ip + 4 > length($$dataPt); + $key = unpack("x$ip N", $$dataPt); + $len = $cp + $nextIFD; # decrypt up to $cp + } elsif ($ifd == 2) { + # get the key to decrypt IFD2 + $key = $$et{SRF2Key}; + $len = length($$dataPt) - $nextIFD; # decrypt rest of maker notes + } else { + next; # no decryption needed + } + # decrypt data + Decrypt($dataPt, $nextIFD, $len, $key) if defined $key; + next unless $verbose > 2; + # display decrypted data in verbose mode + $et->VerboseDir("Decrypted SRF$ifd", 0, $nextIFD + $len); + $et->VerboseDump($dataPt, + Prefix => "$$et{INDENT} ", + Start => $nextIFD, + DataPos => $$dirInfo{DataPos}, + ); + } +} + +#------------------------------------------------------------------------------ +# Write SR2 data +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success when reading, or SR2 directory or undef when writing +sub WriteSR2($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access + my $buff = ''; + $$dirInfo{OutFile} = \$buff; + return ProcessSR2($et, $dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Read/Write SR2 IFD and its encrypted subdirectories +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success when reading, or SR2 directory or undef when writing +sub ProcessSR2($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $raf = $$dirInfo{RAF}; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $dataLen = $$dirInfo{DataLen} || length $$dataPt; + my $base = $$dirInfo{Base} || 0; + my $outfile = $$dirInfo{OutFile}; + + # clear SR2 member variables to be safe + delete $$et{SR2SubIFDOffset}; + delete $$et{SR2SubIFDLength}; + delete $$et{SR2SubIFDKey}; + + # make sure we have the first 4 bytes available to test directory type + my $buff; + if ($dataLen < 4 and $raf) { + my $pos = $dataPos + ($$dirInfo{DirStart}||0) + $base; + if ($raf->Seek($pos, 0) and $raf->Read($buff, 4) == 4) { + $dataPt = \$buff; + undef $$dirInfo{DataPt}; # must load data from file + $raf->Seek($pos, 0); + } + } + # this may either be a normal IFD, or a MRW data block + # (only original ARW images from the A100 use the MRW block) + my $dataOffset; + if ($dataPt and $$dataPt =~ /^\0MR[IM]/) { + my ($err, $srfPos, $srfLen, $dataOffset); + $dataOffset = $$et{A100DataOffset}; + if ($dataOffset) { + # save information about the RAW data trailer so it will be preserved + $$et{KnownTrailer} = { Name => 'A100 RAW Data', Start => $dataOffset }; + } else { + $err = 'A100DataOffset tag is missing from A100 ARW image'; + } + $raf or $err = 'Unrecognized SR2 structure'; + unless ($err) { + $srfPos = $raf->Tell(); + $srfLen = $dataOffset - $srfPos; + unless ($srfLen > 0 and $raf->Read($buff, $srfLen) == $srfLen) { + $err = 'Error reading MRW directory'; + } + } + if ($err) { + $outfile and $et->Error($err), return undef; + $et->Warn($err); + return 0; + } + my %dirInfo = ( DataPt => \$buff ); + require Image::ExifTool::MinoltaRaw; + if ($outfile) { + # save MRW data to be written last + $$et{MRWDirData} = Image::ExifTool::MinoltaRaw::WriteMRW($et, \%dirInfo); + return $$et{MRWDirData} ? "\0\0\0\0\0\0" : undef; + } else { + if (not $outfile and $$et{HTML_DUMP}) { + $et->HDump($srfPos, $srfLen, '[A100 SRF Data]'); + } + return Image::ExifTool::MinoltaRaw::ProcessMRW($et, \%dirInfo); + } + } elsif ($$et{A100DataOffset}) { + my $err = 'Unexpected A100DataOffset tag'; + $outfile and $et->Error($err), return undef; + $et->Warn($err); + return 0; + } + my $verbose = $et->Options('Verbose'); + my $result; + if ($outfile) { + $result = Image::ExifTool::Exif::WriteExif($et, $dirInfo, $tagTablePtr); + return undef unless $result; + $$outfile .= $result; + + } else { + $result = Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr); + } + return $result unless $result and $$et{SR2SubIFDOffset}; + # only take first offset value if more than one! + my @offsets = split ' ', $$et{SR2SubIFDOffset}; + my $offset = shift @offsets; + my $length = $$et{SR2SubIFDLength}; + my $key = $$et{SR2SubIFDKey}; + my @subifdPos; + if ($offset and $length and defined $key) { + my $buff; + # read encrypted SR2SubIFD from file + if (($raf and $raf->Seek($offset+$base, 0) and + $raf->Read($buff, $length) == $length) or + # or read from data (when processing Adobe DNGPrivateData) + ($offset - $dataPos >= 0 and $offset - $dataPos + $length < $dataLen and + ($buff = substr($$dataPt, $offset - $dataPos, $length)))) + { + Decrypt(\$buff, 0, $length, $key); + # display decrypted data in verbose mode + if ($verbose > 2 and not $outfile) { + $et->VerboseDir("Decrypted SR2SubIFD", 0, $length); + $et->VerboseDump(\$buff, Addr => $offset + $base); + } + my $num = ''; + my $dPos = $offset; + for (;;) { + my %dirInfo = ( + Base => $base, + DataPt => \$buff, + DataLen => length $buff, + DirStart => $offset - $dPos, + DirName => "SR2SubIFD$num", + DataPos => $dPos, + ); + my $subTable = GetTagTable('Image::ExifTool::Sony::SR2SubIFD'); + if ($outfile) { + my $fixup = new Image::ExifTool::Fixup; + $dirInfo{Fixup} = $fixup; + $result = $et->WriteDirectory(\%dirInfo, $subTable); + return undef unless $result; + # save position of this SubIFD + push @subifdPos, length($$outfile); + # add this directory to the returned data + $$fixup{Start} += length($$outfile); + $$outfile .= $result; + $$dirInfo{Fixup}->AddFixup($fixup); + } else { + $result = $et->ProcessDirectory(\%dirInfo, $subTable); + } + last unless @offsets; + $offset = shift @offsets; + $num = ($num || 1) + 1; + } + + } else { + $et->Warn('Error reading SR2 data'); + } + } + if ($outfile and @subifdPos) { + # the SR2SubIFD must be padded to a multiple of 4 bytes for the encryption + my $sr2Len = length($$outfile) - $subifdPos[0]; + if ($sr2Len & 0x03) { + my $pad = 4 - ($sr2Len & 0x03); + $sr2Len += $pad; + $$outfile .= ' ' x $pad; + } + # save the new SR2SubIFD Length and Key to be used later for encryption + $$et{SR2SubIFDLength} = $sr2Len; + my $newKey = $$et{VALUE}{SR2SubIFDKey}; + $$et{SR2SubIFDKey} = $newKey if defined $newKey; + # update SubIFD pointers manually and add to fixup, and set SR2SubIFDLength + my $n = Get16u($outfile, 0); + my ($i, %found); + for ($i=0; $i<$n; ++$i) { + my $entry = 2 + 12 * $i; + my $tagID = Get16u($outfile, $entry); + # only interested in SR2SubIFDOffset (0x7200) and SR2SubIFDLength (0x7201) + next unless $tagID == 0x7200 or $tagID == 0x7201; + $found{$tagID} = 1; + my $fmt = Get16u($outfile, $entry + 2); + if ($fmt != 0x04) { # must be int32u + $et->Error("Unexpected format ($fmt) for SR2SubIFD tag"); + return undef; + } + if ($tagID == 0x7201) { # SR2SubIFDLength + Set32u($sr2Len, $outfile, $entry + 8); + next; + } + my $tag = 'SR2SubIFDOffset'; + my $valuePtr = @subifdPos < 2 ? $entry+8 : Get32u($outfile, $entry+8); + my $pos; + foreach $pos (@subifdPos) { + Set32u($pos, $outfile, $valuePtr); + $$dirInfo{Fixup}->AddFixup($valuePtr, $tag); + undef $tag; + $valuePtr += 4; + } + } + unless ($found{0x7200} and $found{0x7201}) { + $et->Error('Missing SR2SubIFD tag'); + return undef; + } + } + return $outfile ? $$outfile : $result; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Sony - Sony EXIF maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to interpret +Sony maker notes EXIF meta information. + +=head1 NOTES + +Also see Minolta.pm since Sony DSLR models use structures originating from +Minolta. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.cybercom.net/~dcoffin/dcraw/> + +=item L<http://homepage3.nifty.com/kamisaka/makernote/makernote_sony.htm> + +=item L<http://www.klingebiel.com/tempest/hd/pmp.html> + +=item (...plus lots of testing with my RX100!) + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Thomas Bodenmann, Philippe Devaux, Jens Duttke, Marcus +Holland-Moritz, Andrey Tverdokhleb, Rudiger Lange, Igal Milchtaich, Michael +Reitinger and Jos Roost for help decoding some tags. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Sony Tags>, +L<Image::ExifTool::TagNames/Minolta Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/SonyIDC.pm b/lib/Image/ExifTool/SonyIDC.pm new file mode 100644 index 0000000..33f5152 --- /dev/null +++ b/lib/Image/ExifTool/SonyIDC.pm @@ -0,0 +1,393 @@ +#------------------------------------------------------------------------------ +# File: SonyIDC.pm +# +# Description: Read/write Sony IDC information +# +# Revisions: 2010/01/05 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::SonyIDC; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::Exif; + +$VERSION = '1.08'; + +# Sony IDC tags (ref PH) +%Image::ExifTool::SonyIDC::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, + NOTES => 'Tags written by the Sony Image Data Converter utility in ARW images.', + SET_GROUP1 => 1, + 0x201 => { + Name => 'IDCPreviewStart', + IsOffset => 1, + OffsetPair => 0x202, + DataTag => 'IDCPreview', + Writable => 'int32u', + Protected => 2, + }, + 0x202 => { + Name => 'IDCPreviewLength', + OffsetPair => 0x201, + DataTag => 'IDCPreview', + Writable => 'int32u', + Protected => 2, + }, + 0x8000 => { + Name => 'IDCCreativeStyle', + Writable => 'int32u', + PrintConvColumns => 2, + PrintConv => { + 1 => 'Camera Setting', + 2 => 'Standard', + 3 => 'Real', + 4 => 'Vivid', + 5 => 'Adobe RGB', + 6 => 'A100 Standard', # shows up as '-' in IDC menu + 7 => 'Neutral', + 8 => 'Portrait', + 9 => 'Landscape', + 10 => 'Clear', + 11 => 'Deep', + 12 => 'Light', + 13 => 'Sunset', + 14 => 'Night View', + 15 => 'Autumn Leaves', + 16 => 'B&W', + 17 => 'Sepia', + }, + }, + 0x8001 => { + Name => 'CreativeStyleWasChanged', + Writable => 'int32u', + Notes => 'set if the creative style was ever changed', + # (even if it was changed back again later) + PrintConv => { 0 => 'No', 1 => 'Yes' }, + }, + 0x8002 => { + Name => 'PresetWhiteBalance', + Writable => 'int32u', + PrintConv => { + 1 => 'Camera Setting', + 2 => 'Color Temperature', + 3 => 'Specify Gray Point', + 4 => 'Daylight', + 5 => 'Cloudy', + 6 => 'Shade', + 7 => 'Cool White Fluorescent', + 8 => 'Day Light Fluorescent', + 9 => 'Day White Fluorescent', + 10 => 'Warm White Fluorescent', + 11 => 'Tungsten', + 12 => 'Flash', + 13 => 'Auto', + }, + }, + 0x8013 => { Name => 'ColorTemperatureAdj', Writable => 'int16u' }, + 0x8014 => { Name => 'PresetWhiteBalanceAdj',Writable => 'int32s' }, + 0x8015 => { Name => 'ColorCorrection', Writable => 'int32s' }, + 0x8016 => { Name => 'SaturationAdj', Writable => 'int32s' }, + 0x8017 => { Name => 'ContrastAdj', Writable => 'int32s' }, + 0x8018 => { + Name => 'BrightnessAdj', + Writable => 'int32s', + PrintConv => 'sprintf("%.2f", $val/300)', #JR + PrintConvInv => '$val * 300', + }, + 0x8019 => { Name => 'HueAdj', Writable => 'int32s' }, + 0x801a => { Name => 'SharpnessAdj', Writable => 'int32s' }, + 0x801b => { Name => 'SharpnessOvershoot', Writable => 'int32s' }, + 0x801c => { Name => 'SharpnessUndershoot', Writable => 'int32s' }, + 0x801d => { Name => 'SharpnessThreshold', Writable => 'int32s' }, + 0x801e => { + Name => 'NoiseReductionMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 0x8021 => { + Name => 'GrayPoint', + Writable => 'int16u', + Count => 4, + }, + 0x8022 => { + Name => 'D-RangeOptimizerMode', + Writable => 'int16u', + PrintConv => { + 0 => 'Off', + 1 => 'Auto', + 2 => 'Manual', + }, + }, + 0x8023 => { Name => 'D-RangeOptimizerValue', Writable => 'int32s' }, + 0x8024 => { Name => 'D-RangeOptimizerHighlight',Writable => 'int32s' }, + 0x8026 => { + Name => 'HighlightColorDistortReduct', + Writable => 'int16u', + PrintConv => { + 0 => 'Standard', + 1 => 'Advanced', + }, + }, + 0x8027 => { + Name => 'NoiseReductionValue', + Writable => 'int32s', + ValueConv => '($val + 100) / 2', + ValueConvInv => '$val * 2 - 100', + }, + 0x8028 => { + Name => 'EdgeNoiseReduction', + Writable => 'int32s', + ValueConv => '($val + 100) / 2', + ValueConvInv => '$val * 2 - 100', + }, + 0x8029 => { + Name => 'ColorNoiseReduction', + Writable => 'int32s', + ValueConv => '($val + 100) / 2', + ValueConvInv => '$val * 2 - 100', + }, + 0x802d => { Name => 'D-RangeOptimizerShadow', Writable => 'int32s' }, + 0x8030 => { Name => 'PeripheralIllumCentralRadius', Writable => 'int32s' }, + 0x8031 => { Name => 'PeripheralIllumCentralValue', Writable => 'int32s' }, + 0x8032 => { Name => 'PeripheralIllumPeriphValue', Writable => 'int32s' }, + 0x8040 => { #JR + Name => 'DistortionCompensation', + Writable => 'int32s', + PrintConv => { + -1 => 'n/a', # (fixed by lens) + 1 => 'On', + 2 => 'Off', + }, + }, + 0x9000 => { + Name => 'ToneCurveBrightnessX', + Writable => 'int16u', + Count => -1, + }, + 0x9001 => { + Name => 'ToneCurveRedX', + Writable => 'int16u', + Count => -1, + }, + 0x9002 => { + Name => 'ToneCurveGreenX', + Writable => 'int16u', + Count => -1, + }, + 0x9003 => { + Name => 'ToneCurveBlueX', + Writable => 'int16u', + Count => -1, + }, + 0x9004 => { + Name => 'ToneCurveBrightnessY', + Writable => 'int16u', + Count => -1, + }, + 0x9005 => { + Name => 'ToneCurveRedY', + Writable => 'int16u', + Count => -1, + }, + 0x9006 => { + Name => 'ToneCurveGreenY', + Writable => 'int16u', + Count => -1, + }, + 0x9007 => { + Name => 'ToneCurveBlueY', + Writable => 'int16u', + Count => -1, + }, + 0x900d => { #JR + Name => 'ChromaticAberrationCorrection', # "Magnification Chromatic Aberration" + Writable => 'int32s', + PrintConv => { 1 => 'On', 2 => 'Off' }, + }, + 0x900e => { #JR + Name => 'InclinationCorrection', + Writable => 'int32u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x900f => { #JR + Name => 'InclinationAngle', + Writable => 'int32s', + PrintConv => 'sprintf("%.1f deg", $val/1000)', + PrintConvInv => 'ToFloat($val) * 1000', + }, + 0x9010 => { #JR + Name => 'Cropping', + Writable => 'int32u', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x9011 => { #JR + Name => 'CropArea', + Writable => 'int32u', + Count => 4, + }, + 0x9012 => { #JR + Name => 'PreviewImageSize', + Writable => 'int32u', + Count => 2, + }, + 0x9013 => { #JR (ARQ images) + Name => 'PxShiftPeriphEdgeNR', + Writable => 'int32s', + PrintConv => { 0 => 'Off', 1 => 'On' }, + }, + 0x9014 => { #JR (ARQ images) + Name => 'PxShiftPeriphEdgeNRValue', + Writable => 'int32s', + PrintConv => 'sprintf("%.1f", $val/10)', + PrintConvInv => '$val * 10', + }, + 0x9017 => { Name => 'WhitesAdj', Writable => 'int32s' }, #JR + 0x9018 => { Name => 'BlacksAdj', Writable => 'int32s' }, #JR + 0x9019 => { Name => 'HighlightsAdj', Writable => 'int32s' }, #JR + 0x901a => { Name => 'ShadowsAdj', Writable => 'int32s' }, #JR + 0xd000 => { Name => 'CurrentVersion', Writable => 'int32u' }, + 0xd001 => { + Name => 'VersionIFD', + Groups => { 1 => 'Version0' }, + Flags => 'SubIFD', + Notes => 'there is one VersionIFD for each entry in the "Version Stack"', + SubDirectory => { + DirName => 'Version0', + TagTable => 'Image::ExifTool::SonyIDC::Main', + Start => '$val', + Base => '$start', + MaxSubdirs => 20, # (IDC v3.0 writes max. 10) + RelativeBase => 1, # needed to write SubIFD with relative offsets + }, + }, + 0xd100 => { + Name => 'VersionCreateDate', + Writable => 'string', + Groups => { 2 => 'Time' }, + Notes => 'date/time when this entry was created in the "Version Stack"', + Shift => 'Time', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,0)', + }, + 0xd101 => { + Name => 'VersionModifyDate', + Writable => 'string', + Groups => { 2 => 'Time' }, + Shift => 'Time', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,0)', + }, +); + +# extract IDC preview images as composite tags +%Image::ExifTool::SonyIDC::Composite = ( + GROUPS => { 2 => 'Image' }, + IDCPreviewImage => { + Groups => { 2 => 'Preview' }, + Require => { + 0 => 'IDCPreviewStart', + 1 => 'IDCPreviewLength', + }, + # extract all preview images (not just one) + RawConv => q{ + @grps = $self->GetGroup($$val{0}); + require Image::ExifTool::SonyIDC; + Image::ExifTool::SonyIDC::ExtractPreviews($self); + }, + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::SonyIDC'); + +# set "Permanent" flag for all tags +{ + my $key; + foreach $key (TagTableKeys(\%Image::ExifTool::SonyIDC::Main)) { + $Image::ExifTool::SonyIDC::Main{$key}{Permanent} = 1; + } +} + +#------------------------------------------------------------------------------ +# Extract all IDC preview images +# Inputs: 0) ExifTool object ref +# Returns: data for "IDCPreviewImage" tag (which I have never seen), +# or undef if there was no preview in the SonyIDC IFD +sub ExtractPreviews($) +{ + my $et = shift; + my $i = 1; + my $xtra = ' (1)'; + my $preview; + # loop through all available IDC preview images in the order they were found + for (;;) { + my $key = "IDCPreviewStart$xtra"; + unless (defined $$et{VALUE}{$key}) { + last unless $xtra; + $xtra = ''; # do the last tag extracted last + next; + } + # run through IDC preview images in the same order they were extracted + my $off = $et->GetValue($key, 'ValueConv') or last; + my $len = $et->GetValue("IDCPreviewLength$xtra", 'ValueConv') or last; + # get stack version from number in group 1 name + my $grp1 = $et->GetGroup($key, 1); + if ($grp1 =~ /(\d+)$/) { + my $tag = "IDCPreviewImage$1"; + unless ($Image::ExifTool::Extra{$tag}) { + AddTagToTable(\%Image::ExifTool::Extra, $tag, { + Name => $tag, + Groups => { 0 => 'Composite', 1 => 'Composite', 2 => 'Preview'}, + }); + } + my $val = Image::ExifTool::Exif::ExtractImage($et, $off, $len, $tag); + $et->FoundTag($tag, $val, $et->GetGroup($key)); + } else { + $preview = Image::ExifTool::Exif::ExtractImage($et, $off, $len, 'IDCPreviewImage'); + } + # step to next set of tags unless we are done + last unless $xtra; + ++$i; + $xtra = " ($i)"; + } + return $preview; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::SonyIDC - Read/write Sony IDC information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read and +write Sony Image Data Converter version 3.0 metadata in ARW images. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/SonyIDC Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Stim.pm b/lib/Image/ExifTool/Stim.pm new file mode 100644 index 0000000..d51a281 --- /dev/null +++ b/lib/Image/ExifTool/Stim.pm @@ -0,0 +1,196 @@ +#------------------------------------------------------------------------------ +# File: Stim.pm +# +# Description: Definitions for Stereo Still Image tags +# +# Revisions: 06/12/2009 - P. Harvey Created +# +# References: 1) http://www.cipa.jp/std/documents/e/DC-006_E.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::Stim; + +use strict; +use vars qw($VERSION); + +$VERSION = '1.01'; + +# Tags found in APP3 Stim segment in JPEG images +%Image::ExifTool::Stim::Main = ( + GROUPS => { 0 => 'Stim', 1 => 'Stim', 2 => 'Image'}, + NOTES => q{ + These tags are part of the CIPA Stereo Still Image specification, and are + found in the APP3 "Stim" segment of JPEG images. See + L<https://web.archive.org/web/20190718152459/http://www.cipa.jp/std/documents/e/DC-006_E.pdf> + for the official specification. + }, + 0 => 'StimVersion', + 1 => { + Name => 'ApplicationData', + Binary => 1, + }, + 2 => { + Name => 'ImageArrangement', + PrintConv => { + 0 => 'Parallel View Alignment', + 1 => 'Cross View Alignment', + }, + }, + 3 => { + Name => 'ImageRotation', + PrintConv => { + 1 => 'None', + }, + }, + 4 => 'ScalingFactor', + 5 => 'CropXSize', + 6 => 'CropYSize', + 7 => { + Name => 'CropX', + SubDirectory => { + TagTable => 'Image::ExifTool::Stim::CropX', + }, + }, + 8 => { + Name => 'CropY', + SubDirectory => { + TagTable => 'Image::ExifTool::Stim::CropY', + }, + }, + 9 => { + Name => 'ViewType', + PrintConv => { + 0 => 'No Pop-up Effect', + 1 => 'Pop-up Effect', + }, + }, + 10 => { + Name => 'RepresentativeImage', + PrintConv => { + 0 => 'Left Viewpoint', + 1 => 'Right Viewpoint', + }, + }, + 11 => { + Name => 'ConvergenceBaseImage', + PrintConv => { + 0 => 'Left Viewpoint', + 1 => 'Right Viewpoint', + 255 => 'Equivalent for Both Viewpoints', + }, + }, + 12 => { + Name => 'AssumedDisplaySize', + PrintConv => '"$val mm"', + }, + 13 => { + Name => 'AssumedDistanceView', + PrintConv => '"$val mm"', + }, + 14 => 'RepresentativeDisparityNear', + 15 => 'RepresentativeDisparityFar', + 16 => { + Name => 'InitialDisplayEffect', + PrintConv => { + 0 => 'Off', + 1 => 'On', + }, + }, + 17 => { + Name => 'ConvergenceDistance', + PrintConv => '$val ? "$val mm" : "inf"', + }, + 18 => { + Name => 'CameraArrangementInterval', + PrintConv => '"$val mm"', + }, + 19 => 'ShootingCount', +); + +# crop offset X tags +%Image::ExifTool::Stim::CropX = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'Stim', 1 => 'Stim', 2 => 'Image'}, + 0 => { + Name => 'CropXCommonOffset', + Format => 'int16u', + PrintConv => { + 0 => 'Common Offset Setting', + 1 => 'Individual Offset Setting', + }, + }, + 2 => 'CropXViewpointNumber', + 3 => { + Name => 'CropXOffset', + Format => 'int32s', + }, + 7 => 'CropXViewpointNumber2', + 8 => { + Name => 'CropXOffset2', + Format => 'int32s', + }, +); + +# crop offset Y tags +%Image::ExifTool::Stim::CropY = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'Stim', 1 => 'Stim', 2 => 'Image'}, + 0 => { + Name => 'CropYCommonOffset', + Format => 'int16u', + PrintConv => { + 0 => 'Common Offset Setting', + 1 => 'Individual Offset Setting', + }, + }, + 2 => 'CropYViewpointNumber', + 3 => { + Name => 'CropYOffset', + Format => 'int32s', + }, + 7 => 'CropYViewpointNumber2', + 8 => { + Name => 'CropYOffset2', + Format => 'int32s', + }, +); + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Stim - Definitions for Stereo Still Image tags + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains tag definitions for Stereo Still Image format (Stim) +information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.cipa.jp/std/documents/e/DC-006_E.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Stim Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/TagInfoXML.pm b/lib/Image/ExifTool/TagInfoXML.pm new file mode 100644 index 0000000..fbbacb7 --- /dev/null +++ b/lib/Image/ExifTool/TagInfoXML.pm @@ -0,0 +1,840 @@ +#------------------------------------------------------------------------------ +# File: TagInfoXML.pm +# +# Description: Read/write tag information XML database +# +# Revisions: 2009/01/28 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::TagInfoXML; + +use strict; +require Exporter; + +use vars qw($VERSION @ISA $makeMissing); +use Image::ExifTool qw(:Utils :Vars); +use Image::ExifTool::XMP; + +$VERSION = '1.32'; +@ISA = qw(Exporter); + +# set this to a language code to generate Lang module with 'MISSING' entries +$makeMissing = ''; + +sub LoadLangModules($;$); +sub WriteLangModule($$;$); +sub NumbersFirst; + +# names for acknowledgements in the POD documentation +my %credits = ( + cs => 'Jens Duttke and Petr MichE<aacute>lek', + de => 'Jens Duttke, Herbert Kauer and Jobi', + es => 'Jens Duttke, Santiago del BrE<iacute>o GonzE<aacute>lez and Emilio Sancha', + fi => 'Jens Duttke and Jarkko ME<auml>kineva', + fr => 'Jens Duttke, Bernard Guillotin, Jean Glasser, Jean Piquemal, Harry Nizard and Alphonse Philippe', + it => 'Jens Duttke, Ferdinando Agovino, Emilio Dati and Michele Locati', + ja => 'Jens Duttke and Kazunari Nishina', + ko => 'Jens Duttke and Jeong Beom Kim', + nl => 'Jens Duttke, Peter Moonen, Herman Beld and Peter van der Laan', + pl => 'Jens Duttke, Przemyslaw Sulek and Kacper Perschke', + ru => 'Jens Duttke, Sergey Shemetov, Dmitry Yerokhin, Anton Sukhinov and Alexander', + sv => 'Jens Duttke and BjE<ouml>rn SE<ouml>derstrE<ouml>m', + 'tr' => 'Jens Duttke, Hasan Yildirim and Cihan Ulusoy', + zh_cn => 'Jens Duttke and Haibing Zhong', + zh_tw => 'Jens Duttke and MikeF', +); + +# translate country codes to language codes +my %translateLang = ( + ch_s => 'zh_cn', + ch_cn => 'zh_cn', + ch_tw => 'zh_tw', + cz => 'cs', + jp => 'ja', + kr => 'ko', + se => 'sv', +); + +my $numbersFirst = 1; # set to -1 to sort numbers last, or 2 to put negative numbers last +my $caseInsensitive; # used internally by sort routine + +# write groups that don't represent real family 1 group names +my %fakeWriteGroup = ( + Comment => 1, # (JPEG Comment) + colr => 1, # (Jpeg2000 'colr' box) +); + +#------------------------------------------------------------------------------ +# Utility to print tag information database as an XML list +# Inputs: 0) output file name (undef to send to console), +# 1) group name (may be undef), 2) options hash ('Flags','NoDesc','Lang') +# Returns: true on success +sub Write(;$$%) +{ + local ($_, *PTIFILE); + my ($file, $group, %opts) = @_; + my $et = new Image::ExifTool; + my ($fp, $tableName, %langInfo, @langs, $defaultLang, @groups); + @groups = split ':', $group if $group; + + Image::ExifTool::LoadAllTables(); # first load all our tables + unless ($opts{NoDesc}) { + $defaultLang = $Image::ExifTool::defaultLang; + LoadLangModules(\%langInfo, $opts{Lang}); # load necessary Lang modules + if ($opts{Lang}) { + @langs = grep /^$opts{Lang}$/i, keys %langInfo; + } else { + @langs = sort keys %langInfo; + } + } + if (defined $file) { + open PTIFILE, ">$file" or return 0; + $fp = \*PTIFILE; + } else { + $fp = \*STDOUT; + } + print $fp "<?xml version='1.0' encoding='UTF-8'?>\n"; + print $fp "<!-- Generated by Image::ExifTool $Image::ExifTool::VERSION -->\n"; + print $fp "<taginfo>\n\n"; + + # loop through all tables and save tag names to %allTags hash + foreach $tableName (sort keys %allTables) { + my $table = GetTagTable($tableName); + my $grps = $$table{GROUPS}; + my ($tagID, $didTag); + # sort in same order as tag name documentation + $caseInsensitive = ($tableName =~ /::XMP::/); + # get list of languages defining elements in this table + my $isBinary = ($$table{PROCESS_PROC} and + $$table{PROCESS_PROC} eq \&Image::ExifTool::ProcessBinaryData); + # generate flattened tag names for structure fields if this is an XMP table + if ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP') { + Image::ExifTool::XMP::AddFlattenedTags($table); + } + $numbersFirst = 2; + $numbersFirst = -1 if $$table{VARS} and $$table{VARS}{ALPHA_FIRST}; + my @keys = sort NumbersFirst TagTableKeys($table); + $numbersFirst = 1; + # loop through all tag ID's in this table + foreach $tagID (@keys) { + my @infoArray = GetTagInfoList($table, $tagID); + my $xmlID = Image::ExifTool::XMP::FullEscapeXML($tagID); + # get a list of languages defining elements for this ID + my ($index, $fam); +PTILoop: for ($index=0; $index<@infoArray; ++$index) { + my $tagInfo = $infoArray[$index]; + # don't list subdirectories unless they are writable + next unless $$tagInfo{Writable} or not $$tagInfo{SubDirectory}; + if (@groups) { + my @tg = $et->GetGroup($tagInfo); + foreach $group (@groups) { + next PTILoop unless grep /^$group$/i, @tg; + } + } + unless ($didTag) { + my $tname = $$table{SHORT_NAME}; + print $fp "<table name='${tname}' g0='$$grps{0}' g1='$$grps{1}' g2='$$grps{2}'>\n"; + unless ($opts{NoDesc}) { + # print table description + my $desc = $$table{TABLE_DESC}; + unless ($desc) { + ($desc = $tname) =~ s/::Main$//; + $desc =~ s/::/ /g; + } + # print alternate language descriptions + print $fp " <desc lang='en'>$desc</desc>\n"; + foreach (@langs) { + $desc = $langInfo{$_}{$tableName} or next; + $desc = Image::ExifTool::XMP::EscapeXML($desc); + print $fp " <desc lang='${_}'>$desc</desc>\n"; + } + } + $didTag = 1; + } + my $name = $$tagInfo{Name}; + my $ind = @infoArray > 1 ? " index='${index}'" : ''; + my $format = $$tagInfo{Writable} || $$table{WRITABLE}; + my $writable = $format ? 'true' : 'false'; + # check our conversions to make sure we can really write this tag + if ($writable eq 'true') { + foreach ('PrintConv','ValueConv') { + next unless $$tagInfo{$_}; + next if $$tagInfo{$_ . 'Inv'}; + next if ref($$tagInfo{$_}) =~ /^(HASH|ARRAY)$/; + next if $$tagInfo{WriteAlso}; + $writable = 'false'; + last; + } + } + $format = $$tagInfo{Format} || $$table{FORMAT} if not defined $format or $format eq '1'; + $format = 'struct' if $$tagInfo{Struct}; + if (defined $format) { + $format =~ s/\[.*\$.*\]//; # remove expressions from format + $format = 'undef' if $format eq '2'; # (special case) + } elsif ($isBinary) { + $format = 'int8u'; + } else { + $format = '?'; + } + my $count = ''; + if ($format =~ s/\[.*?(\d*)\]$//) { + $count = " count='${1}'" if length $1; + } elsif ($$tagInfo{Count} and $$tagInfo{Count} > 1) { + $count = " count='$$tagInfo{Count}'"; + } + my @groups = $et->GetGroup($tagInfo); + my $writeGroup = $$tagInfo{WriteGroup} || $$table{WRITE_GROUP}; + # use common write group for group 1 (unless fake) + $groups[1] = $writeGroup if $writeGroup and not $fakeWriteGroup{$writeGroup}; + # add group names if different from table defaults + my $grp = ''; + for ($fam=0; $fam<3; ++$fam) { + $grp .= " g$fam='$groups[$fam]'" if $groups[$fam] ne $$grps{$fam}; + } + # add flags if necessary + if ($opts{Flags}) { + my @flags; + foreach (qw(Avoid Binary List Mandatory Unknown)) { + push @flags, $_ if $$tagInfo{$_}; + } + push @flags, $$tagInfo{List} if $$tagInfo{List} and $$tagInfo{List} =~ /^(Alt|Bag|Seq)$/; + push @flags, 'Flattened' if defined $$tagInfo{Flat}; + push @flags, 'Unsafe' if $$tagInfo{Protected} and $$tagInfo{Protected} & 0x01; + push @flags, 'Protected' if $$tagInfo{Protected} and $$tagInfo{Protected} & 0x02; + push @flags, 'Permanent' if $$tagInfo{Permanent} or + ($groups[0] eq 'MakerNotes' and not defined $$tagInfo{Permanent}); + $grp = " flags='" . join(',', sort @flags) . "'$grp" if @flags; + } + print $fp " <tag id='${xmlID}' name='${name}'$ind type='${format}'$count writable='${writable}'$grp"; + if ($opts{NoDesc}) { + # short output format + print $fp "/>\n"; # empty tag element + next; # no descriptions or values + } else { + print $fp ">"; + } + my $desc = $$tagInfo{Description}; + $desc = Image::ExifTool::MakeDescription($name) unless defined $desc; + # add alternate language descriptions and get references + # to alternate language PrintConv hashes + my $altDescr = ''; + my %langConv; + foreach (@langs) { + my $ld = $langInfo{$_}{$name} or next; + if (ref $ld) { + $langConv{$_} = $$ld{PrintConv}; + $ld = $$ld{Description} or next; + } + # ignore descriptions that are the same as the default language + next if $ld eq $desc; + $ld = Image::ExifTool::XMP::EscapeXML($ld); + $altDescr .= "\n <desc lang='${_}'>$ld</desc>"; + } + # print tag descriptions + $desc = Image::ExifTool::XMP::EscapeXML($desc); + unless ($opts{Lang} and $altDescr) { + print $fp "\n <desc lang='${defaultLang}'>$desc</desc>"; + } + print $fp "$altDescr\n"; + for (my $i=0; ; ++$i) { + my $conv = $$tagInfo{PrintConv}; + my $idx = ''; + if (ref $conv eq 'ARRAY') { + last unless $i < @$conv; + $conv = $$conv[$i]; + $idx = " index='${i}'"; + } else { + last if $i; + } + next unless ref $conv eq 'HASH'; + # make a list of available alternate languages + my @langConv = sort keys %langConv; + print $fp " <values$idx>\n"; + my $key; + $caseInsensitive = 0; + # add bitmask values to main lookup + if ($$conv{BITMASK}) { + foreach $key (keys %{$$conv{BITMASK}}) { + my $mask = 0x01 << $key; + next if not $mask or $$conv{$mask}; + $$conv{$mask} = $$conv{BITMASK}{$key}; + } + } + foreach $key (sort NumbersFirst keys %$conv) { + next if $key eq 'BITMASK' or $key eq 'OTHER' or $key eq 'Notes'; + my $val = $$conv{$key}; + my $xmlVal = Image::ExifTool::XMP::EscapeXML($val); + my $xmlKey = Image::ExifTool::XMP::FullEscapeXML($key); + print $fp " <key id='${xmlKey}'>\n"; + # add alternate language values + my $altConv = ''; + foreach (@langConv) { + my $lv = $langConv{$_}; + # handle indexed PrintConv entries + $lv = $$lv[$i] or next if ref $lv eq 'ARRAY'; + $lv = $$lv{$val}; + # ignore values that are missing or same as default + next unless defined $lv and $lv ne $val; + $lv = Image::ExifTool::XMP::EscapeXML($lv); + $altConv .= " <val lang='${_}'>$lv</val>\n"; + } + unless ($opts{Lang} and $altConv) { + print $fp " <val lang='${defaultLang}'>$xmlVal</val>\n" + } + print $fp "$altConv </key>\n"; + } + print $fp " </values>\n"; + } + print $fp " </tag>\n"; + } + } + print $fp "</table>\n\n" if $didTag; + } + my $success = 1; + print $fp "</taginfo>\n" or $success = 0; + close $fp or $success = 0 if defined $file; + return $success; +} + +#------------------------------------------------------------------------------ +# Escape backslash and quote in string +# Inputs: string +# Returns: escaped string +sub EscapePerl +{ + my $str = shift; + $str =~ s/\\/\\\\/g; + $str =~ s/'/\\'/g; + return $str; +} + +#------------------------------------------------------------------------------ +# Generate Lang modules from input tag info XML database +# Inputs: 0) XML filename, 1) update flags: +# 0x01 = preserve version numbers +# 0x02 = update all modules, even if they didn't change +# 0x04 = update from scratch, ignoring existing definitions +# 0x08 = override existing different descriptions and values +# Returns: Count of updated Lang modules, or -1 on error +# Notes: Must be run from the directory containing 'lib' +sub BuildLangModules($;$) +{ + local ($_, *XFILE); + my ($file, $updateFlag) = @_; + my ($table, $tableName, $id, $index, $valIndex, $name, $key, $lang, $defDesc); + my (%langInfo, %different, %changed, $overrideDifferent); + + Image::ExifTool::LoadAllTables(); # first load all our tables + # generate our flattened tags + foreach $tableName (sort keys %allTables) { + my $table = GetTagTable($tableName); + next unless $$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP'; + Image::ExifTool::XMP::AddFlattenedTags($table); + } + LoadLangModules(\%langInfo); # load all existing Lang modules + $updateFlag = 0 unless $updateFlag; + %langInfo = () if $updateFlag & 0x04; + $overrideDifferent = 1 if $updateFlag & 0x08; + + if (defined $file) { + open XFILE, $file or return -1; + while (<XFILE>) { + next unless /^\s*<(\/?)(\w+)/; + my $tok = $2; + if ($1) { + # close appropriate entities + if ($tok eq 'tag') { + undef $id; + undef $index; + undef $name; + undef $defDesc; + } elsif ($tok eq 'values') { + undef $key; + undef $valIndex; + } elsif ($tok eq 'table') { + undef $table; + undef $id; + } + next; + } + if ($tok eq 'table') { + /^\s*<table name='([^']+)'[ >]/ or warn('Bad table'), next; + $tableName = "Image::ExifTool::$1"; + # ignore userdefined tables + next if $tableName =~ /^Image::ExifTool::UserDefined/; + $table = Image::ExifTool::GetTagTable($tableName); + $table or warn("Unknown tag table $tableName\n"); + next; + } + next unless defined $table; + if ($tok eq 'tag') { + /^\s*<tag id='([^']*)' name='([^']+)'( index='(\d+)')?[ >]/ or warn('Bad tag'), next; + $id = Image::ExifTool::XMP::FullUnescapeXML($1); + $name = $2; + $index = $4; + # convert hex ID's unless HEX_ID is 0 (for string ID's that look like hex) + if ($id =~ /^0x[\da-fA-F]+$/ and (not defined $$table{VARS} or + not defined $$table{VARS}{HEX_ID} or $$table{VARS}{HEX_ID})) + { + $id = hex($id); + } + next; + } + if ($tok eq 'values') { + /^\s*<values index='([^']*)'>/ or next; + $valIndex = $1; + } elsif ($tok eq 'key') { + defined $id or warn('No ID'), next; + /^\s*<key id='([^']*)'>/ or warn('Bad key'), next; + $key = Image::ExifTool::XMP::FullUnescapeXML($1); + $key = hex($key) if $key =~ /^0x[\da-fA-F]+$/; # convert hex keys + } elsif ($tok eq 'val' or $tok eq 'desc') { + /^\s*<$tok( lang='([-\w]+?)')?>(.*)<\/$tok>/ or warn("Bad $tok"), next; + $tok eq 'desc' and defined $key and warn('Out of order "desc"'), next; + my $lang = $2 or next; # looking only for alternate languages + $lang =~ tr/-A-Z/_a-z/; + # use standard ISO 639-1 language codes + $lang = $translateLang{$lang} if $translateLang{$lang}; + my $tval = Image::ExifTool::XMP::UnescapeXML($3); + my $val = ucfirst $tval; + $val = $tval if $tval =~ /^(cRAW|iTun)/; # special-case non-capitalized values + my $cap = ($tval ne $val); + if ($makeMissing and $lang eq 'en') { + $lang = $makeMissing; + $val = 'MISSING'; + undef $cap; + } + my $isDefault = ($lang eq $Image::ExifTool::defaultLang); + unless ($langInfo{$lang} or $isDefault) { + print "Creating new language $lang\n"; + $langInfo{$lang} = { }; + } + defined $name or $name = '<unknown>'; + unless (defined $id) { + next if $isDefault; + # this is a table description + next if $langInfo{$lang}{$tableName} and + $langInfo{$lang}{$tableName} eq $val; + $langInfo{$lang}{$tableName} = $val; + $changed{$lang} = 1; + warn("Capitalized '${lang}' val for $name: $val\n") if $cap; + next; + } + my @infoArray = GetTagInfoList($table, $id); + + # this will fail for UserDefined tags and tags without ID's + @infoArray or warn("Error loading tag for $tableName ID='${id}'\n"), next; + my ($tagInfo, $langInfo); + if (defined $index) { + $tagInfo = $infoArray[$index]; + $tagInfo or warn('Invalid index'), next; + } else { + @infoArray > 1 and warn('Missing index'), next; + $tagInfo = $infoArray[0]; + } + my $tagName = $$tagInfo{Name}; + if ($isDefault) { + unless ($$tagInfo{Description}) { + $$tagInfo{Description} = Image::ExifTool::MakeDescription($tagName); + } + $defDesc = $$tagInfo{Description}; + $langInfo = $tagInfo; + } else { + $langInfo = $langInfo{$lang}{$tagName}; + if (not defined $langInfo) { + $langInfo = $langInfo{$lang}{$tagName} = { }; + } elsif (not ref $langInfo) { + $langInfo = $langInfo{$lang}{$tagName} = { Description => $langInfo }; + } + } + # save new value in langInfo record + if ($tok eq 'desc') { + my $oldVal = $$langInfo{Description}; + next if defined $oldVal and $oldVal eq $val; + if ($makeMissing) { + next if defined $oldVal and $val eq 'MISSING'; + } elsif (defined $oldVal) { + my $t = "$lang $tagName"; + unless (defined $different{$t} and $different{$t} eq $val) { + my $a = defined $different{$t} ? 'ANOTHER ' : ''; + warn "${a}Different '${lang}' desc for $tagName: $val (was $$langInfo{Description})\n"; + next if defined $different{$t}; # don't change back again + $different{$t} = $val; + } + next unless $overrideDifferent; + } + next if $isDefault; + if (defined $defDesc and $defDesc eq $val) { + delete $$langInfo{Description}; # delete if same as default language + } else { + $$langInfo{Description} = $val; + } + } else { + defined $key or warn("No key for $$tagInfo{Name}"), next; + my $printConv = $$tagInfo{PrintConv}; + if (ref $printConv eq 'ARRAY') { + defined $valIndex or warn('No value index'), next; + $printConv = $$printConv[$valIndex]; + } + ref $printConv eq 'HASH' or warn('No PrintConv'), next; + my $convVal = $$printConv{$key}; + unless (defined $convVal) { + if ($$printConv{BITMASK} and $key =~ /^\d+$/) { + my $i; + for ($i=0; $i<64; ++$i) { + my $mask = (0x01 << $i) or last; + next unless $key == $mask; + $convVal = $$printConv{BITMASK}{$i}; + } + } + warn("Missing PrintConv entry for $tableName $$tagInfo{Name} $key\n") and next unless defined $convVal; + } + if ($cap and $convVal =~ /^[a-z]/) { + $val = lcfirst $val; # change back to lower case + undef $cap; + } + my $lc = $$langInfo{PrintConv}; + $lc or $lc = $$langInfo{PrintConv} = { }; + $lc = $printConv if ref $lc eq 'ARRAY'; #(default lang only) + my $oldVal = $$lc{$convVal}; + next if defined $oldVal and $oldVal eq $val; + if ($makeMissing) { + next if defined $oldVal and $val eq 'MISSING'; + } elsif (defined $oldVal and (not $isDefault or not $val=~/^\d+$/)) { + my $t = "$lang $tagName $convVal"; + unless (defined $different{$t} and $different{$t} eq $val) { + my $a = defined $different{$t} ? 'ANOTHER ' : ''; + warn "${a}Different '${lang}' val for $tagName '${convVal}': $val (was $oldVal)\n"; + next if defined $different{$t}; # don't change back again + $different{$t} = $val; + } + next unless $overrideDifferent; + } + next if $isDefault; + warn("Capitalized '${lang}' val for $tagName: $tval\n") if $cap; + $$lc{$convVal} = $val; + } + $changed{$lang} = 1; + } + } + close XFILE; + } + # rewrite all changed Lang modules + my $rtnVal = 0; + foreach $lang ($updateFlag & 0x02 ? @Image::ExifTool::langs : sort keys %changed) { + next if $lang eq $Image::ExifTool::defaultLang; + ++$rtnVal; + # write this module (only increment version number if not forced) + WriteLangModule($lang, $langInfo{$lang}, not $updateFlag & 0x01) or $rtnVal = -1, last; + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Write Lang module +# Inputs: 0) language string, 1) langInfo lookup reference, 2) flag to increment version +# Returns: true on success +sub WriteLangModule($$;$) +{ + local ($_, *XOUT); + my ($lang, $langTags, $newVersion) = @_; + my $err; + -e "lib/Image/ExifTool" or die "Must run from directory containing 'lib'\n"; + my $out = "lib/Image/ExifTool/Lang/$lang.pm"; + my $tmp = "$out.tmp"; + open XOUT, ">$tmp" or die "Error creating $tmp\n"; + my $ver = "Image::ExifTool::Lang::${lang}::VERSION"; + no strict 'refs'; + if ($$ver) { + $ver = $$ver; + $ver = int($ver * 100 + 1.5) / 100 if $newVersion; + } else { + $ver = 1.0; + } + $ver = sprintf('%.2f', $ver); + use strict 'refs'; + my $langName = $Image::ExifTool::langName{$lang} || $lang; + $langName =~ s/\s*\(.*//; + print XOUT <<HEADER; +#------------------------------------------------------------------------------ +# File: $lang.pm +# +# Description: ExifTool $langName language translations +# +# Notes: This file generated automatically by Image::ExifTool::TagInfoXML +#------------------------------------------------------------------------------ + +package Image::ExifTool::Lang::$lang; + +use strict; +use vars qw(\$VERSION); + +\$VERSION = '${ver}'; + +HEADER + print XOUT "\%Image::ExifTool::Lang::${lang}::Translate = (\n"; + # loop through all tag and table names + my $tag; + foreach $tag (sort keys %$langTags) { + my $desc = $$langTags{$tag}; + my $conv; + if (ref $desc) { + $conv = $$desc{PrintConv}; + $desc = $$desc{Description}; + # remove description if not necessary + # (not strictly correct -- should test against tag description, not name) + undef $desc if $desc and $desc eq $tag; + # remove unnecessary value translations + if ($conv) { + my @keys = keys %$conv; + foreach (@keys) { + delete $$conv{$_} if $_ eq $$conv{$_}; + } + undef $conv unless %$conv; + } + } + if (defined $desc) { + $desc = EscapePerl($desc); + } else { + next unless $conv; + } + print XOUT " '${tag}' => "; + unless ($conv) { + print XOUT "'${desc}',\n"; + next; + } + print XOUT "{\n"; + print XOUT " Description => '${desc}',\n" if defined $desc; + if ($conv) { + print XOUT " PrintConv => {\n"; + foreach (sort keys %$conv) { + my $str = EscapePerl($_); + my $val = EscapePerl($$conv{$_}); + print XOUT " '${str}' => '${val}',\n"; + } + print XOUT " },\n"; + } + print XOUT " },\n"; + } + # generate acknowledgements for this language + my $ack; + if ($credits{$lang}) { + $ack = "Thanks to $credits{$lang} for providing this translation."; + $ack =~ s/(.{1,76})( +|$)/$1\n/sg; # wrap text to 76 columns + $ack = "~head1 ACKNOWLEDGEMENTS\n\n$ack\n"; + } else { + $ack = ''; + } + my $footer = <<FOOTER; +); + +1; # end + +__END__ + +~head1 NAME + +Image::ExifTool::Lang::$lang.pm - ExifTool $langName language translations + +~head1 DESCRIPTION + +This file is used by Image::ExifTool to generate localized tag descriptions +and values. + +~head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +$ack~head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagInfoXML(3pm)|Image::ExifTool::TagInfoXML> + +~cut +FOOTER + $footer =~ s/^~/=/mg; # un-do pod obfuscation + print XOUT $footer or $err = 1; + close XOUT or $err = 1; + if ($err or not rename($tmp, $out)) { + warn "Error writing $out\n"; + unlink $tmp; + $err = 1; + } + return $err ? 0 : 1; +} + +#------------------------------------------------------------------------------ +# load all lang modules into hash +# Inputs: 0) Hash reference, 1) specific language to load (undef for all) +sub LoadLangModules($;$) +{ + my ($langHash, $lang) = @_; + require Image::ExifTool; + my @langs = $lang ? ($lang) : @Image::ExifTool::langs; + foreach $lang (@langs) { + next if $lang eq $Image::ExifTool::defaultLang; + eval "require Image::ExifTool::Lang::$lang" or warn("Can't load Lang::$lang\n"), next; + my $xlat = "Image::ExifTool::Lang::${lang}::Translate"; + no strict 'refs'; + %$xlat or warn("Missing Info for $lang\n"), next; + $$langHash{$lang} = \%$xlat; + use strict 'refs'; + } +} + +#------------------------------------------------------------------------------ +# sort numbers first numerically, then strings alphabetically (case insensitive) +sub NumbersFirst +{ + my $rtnVal; + my ($bNum, $bDec); + ($bNum, $bDec) = ($1, $3) if $b =~ /^(-?[0-9]+)(\.(\d*))?$/; + if ($a =~ /^(-?[0-9]+)(\.(\d*))?$/) { + if (defined $bNum) { + $bNum += 1e9 if $numbersFirst == 2 and $bNum < 0; + my $aInt = $1; + $aInt += 1e9 if $numbersFirst == 2 and $aInt < 0; + # compare integer part as a number + $rtnVal = $aInt <=> $bNum; + unless ($rtnVal) { + my $aDec = $3 || 0; + $bDec or $bDec = 0; + # compare decimal part as an integer too + # (so that "1.10" comes after "1.9") + $rtnVal = $aDec <=> $bDec; + } + } else { + $rtnVal = -$numbersFirst; + } + } elsif (defined $bNum) { + $rtnVal = $numbersFirst; + } else { + my ($a2, $b2) = ($a, $b); + # expand numbers to 3 digits (with restrictions to avoid messing up ascii-hex tags) + $a2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $a2 =~ /^(APP|DMC-\w+ )?[.0-9 ]*$/ and length($a2)<16; + $b2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $b2 =~ /^(APP|DMC-\w+ )?[.0-9 ]*$/ and length($b2)<16; + $caseInsensitive and $rtnVal = (lc($a2) cmp lc($b2)); + $rtnVal or $rtnVal = ($a2 cmp $b2); + } + return $rtnVal; +} + +1; # end + + +__END__ + +=head1 NAME + +Image::ExifTool::TagInfoXML - Read/write tag information XML database + +=head1 DESCRIPTION + +This module is used to generate an XML database from all ExifTool tag +information. The XML database may then be edited and used to re-generate +the language modules (Image::ExifTool::Lang::*). + +=head1 METHODS + +=head2 Write + +Print complete tag information database in XML format. + + # save list of all tags + $success = Image::ExifTool::TagInfoXML::Write('dst.xml'); + + # list all IPTC tags to console, including Flags + Image::ExifTool::TagInfoXML::Write(undef, 'IPTC', Flags => 1); + + # write all EXIF Camera tags to file + Image::ExifTool::TagInfoXML::Write($outfile, 'exif:camera'); + +=over 4 + +=item Inputs: + +0) [optional] Output file name, or undef for console output. Output file +will be overwritten if it already exists. + +1) [optional] String of group names separated by colons to specify the group +to print. A specific IFD may not be given as a group, since EXIF tags may +be written to any IFD. Saves all groups if not specified. + +2) [optional] Hash of options values: + + Flags - Set to output 'flags' attribute + NoDesc - Set to suppress output of descriptions + Lang - Select a single language for output + +=item Return Value: + +True on success. + +=item Sample XML Output: + +=back + + <?xml version='1.0' encoding='UTF-8'?> + <taginfo> + + <table name='XMP::dc' g0='XMP' g1='XMP-dc' g2='Other'> + <desc lang='en'>XMP Dublin Core</desc> + <tag id='title' name='Title' type='lang-alt' writable='true' g2='Image'> + <desc lang='en'>Title</desc> + <desc lang='de'>Titel</desc> + <desc lang='fr'>Titre</desc> + </tag> + ... + </table> + + </taginfo> + +Flags (if selected and available) are formatted as a comma-separated list of +the following possible values: Avoid, Binary, List, Mandatory, Permanent, +Protected, Unknown and Unsafe. See the +L<tag name documentation|Image::ExifTool::TagNames> and +lib/Image/ExifTool/README for a description of these flags. For XMP List +tags, the list type (Alt, Bag or Seq) is also output as a flag if +applicable. + +=head2 BuildLangModules + +Build all Image::ExifTool::Lang modules from an XML database file. + + Image::ExifTool::TagInfoXML::BuildLangModules('src.xml'); + +=over 4 + +=item Inputs: + +0) XML file name + +1) Update flags: + + 0x01 = preserve version numbers + 0x02 = update all modules, even if they didn't change + 0x04 = update from scratch, ignoring existing definitions + 0x08 = override existing different descriptions and values + +=item Return Value: + +Number of modules updated, or negative on error. + +=back + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagNames(3pm)|Image::ExifTool::TagNames> + +=cut diff --git a/lib/Image/ExifTool/TagLookup.pm b/lib/Image/ExifTool/TagLookup.pm new file mode 100644 index 0000000..5cc7788 --- /dev/null +++ b/lib/Image/ExifTool/TagLookup.pm @@ -0,0 +1,12486 @@ +#------------------------------------------------------------------------------ +# File: TagLookup.pm +# +# Description: Fast lookup for ExifTool tags +# +# Notes: This lookup is used to look up tag names for writing +# +# Revisions: 2004-12-31 - P. Harvey Created +# 2013-01-06 - PH Allow wildcards in FindTagInfo() +#------------------------------------------------------------------------------ + +package Image::ExifTool::TagLookup; + +use strict; +require Exporter; + +use vars qw($VERSION @ISA @EXPORT_OK); +use Image::ExifTool qw(:Utils); + +$VERSION = '1.18'; +@ISA = qw(Exporter); +@EXPORT_OK = qw(FindTagInfo TagExists); + +sub AddTags($$); +sub AddFields($$$$$$;$$); + +# +# Note: the lists below were generated by Image::ExifTool::BuildTagLookup +# + +#++++ Begin automatically generated code ++++ + +# list of tables containing writable tags +my @tableList = ( + 'Image::ExifTool::APP12::Ducky', + 'Image::ExifTool::Apple::Main', + 'Image::ExifTool::Canon::AFConfig', + 'Image::ExifTool::Canon::AFMicroAdj', + 'Image::ExifTool::Canon::Ambience', + 'Image::ExifTool::Canon::AspectInfo', + 'Image::ExifTool::Canon::CNTH', + 'Image::ExifTool::Canon::CameraInfo1000D', + 'Image::ExifTool::Canon::CameraInfo1D', + 'Image::ExifTool::Canon::CameraInfo1DX', + 'Image::ExifTool::Canon::CameraInfo1DmkII', + 'Image::ExifTool::Canon::CameraInfo1DmkIII', + 'Image::ExifTool::Canon::CameraInfo1DmkIIN', + 'Image::ExifTool::Canon::CameraInfo1DmkIV', + 'Image::ExifTool::Canon::CameraInfo40D', + 'Image::ExifTool::Canon::CameraInfo450D', + 'Image::ExifTool::Canon::CameraInfo500D', + 'Image::ExifTool::Canon::CameraInfo50D', + 'Image::ExifTool::Canon::CameraInfo550D', + 'Image::ExifTool::Canon::CameraInfo5D', + 'Image::ExifTool::Canon::CameraInfo5DmkII', + 'Image::ExifTool::Canon::CameraInfo5DmkIII', + 'Image::ExifTool::Canon::CameraInfo600D', + 'Image::ExifTool::Canon::CameraInfo60D', + 'Image::ExifTool::Canon::CameraInfo650D', + 'Image::ExifTool::Canon::CameraInfo6D', + 'Image::ExifTool::Canon::CameraInfo70D', + 'Image::ExifTool::Canon::CameraInfo750D', + 'Image::ExifTool::Canon::CameraInfo7D', + 'Image::ExifTool::Canon::CameraInfo80D', + 'Image::ExifTool::Canon::CameraInfoPowerShot', + 'Image::ExifTool::Canon::CameraInfoPowerShot2', + 'Image::ExifTool::Canon::CameraInfoUnknown', + 'Image::ExifTool::Canon::CameraInfoUnknown32', + 'Image::ExifTool::Canon::CameraSettings', + 'Image::ExifTool::Canon::ColorBalance', + 'Image::ExifTool::Canon::ColorCalib', + 'Image::ExifTool::Canon::ColorCalib2', + 'Image::ExifTool::Canon::ColorCoefs', + 'Image::ExifTool::Canon::ColorCoefs2', + 'Image::ExifTool::Canon::ColorData1', + 'Image::ExifTool::Canon::ColorData10', + 'Image::ExifTool::Canon::ColorData11', + 'Image::ExifTool::Canon::ColorData2', + 'Image::ExifTool::Canon::ColorData3', + 'Image::ExifTool::Canon::ColorData4', + 'Image::ExifTool::Canon::ColorData5', + 'Image::ExifTool::Canon::ColorData6', + 'Image::ExifTool::Canon::ColorData7', + 'Image::ExifTool::Canon::ColorData8', + 'Image::ExifTool::Canon::ColorData9', + 'Image::ExifTool::Canon::ColorInfo', + 'Image::ExifTool::Canon::ContrastInfo', + 'Image::ExifTool::Canon::CropInfo', + 'Image::ExifTool::Canon::FaceDetect1', + 'Image::ExifTool::Canon::FaceDetect2', + 'Image::ExifTool::Canon::FaceDetect3', + 'Image::ExifTool::Canon::FileInfo', + 'Image::ExifTool::Canon::Flags', + 'Image::ExifTool::Canon::FocalLength', + 'Image::ExifTool::Canon::HDRInfo', + 'Image::ExifTool::Canon::LensInfo', + 'Image::ExifTool::Canon::LightingOpt', + 'Image::ExifTool::Canon::LogInfo', + 'Image::ExifTool::Canon::Main', + 'Image::ExifTool::Canon::MeasuredColor', + 'Image::ExifTool::Canon::ModifiedInfo', + 'Image::ExifTool::Canon::MovieInfo', + 'Image::ExifTool::Canon::MultiExp', + 'Image::ExifTool::Canon::MyColors', + 'Image::ExifTool::Canon::PSInfo', + 'Image::ExifTool::Canon::PSInfo2', + 'Image::ExifTool::Canon::Panorama', + 'Image::ExifTool::Canon::PreviewImageInfo', + 'Image::ExifTool::Canon::Processing', + 'Image::ExifTool::Canon::RawBurstInfo', + 'Image::ExifTool::Canon::SerialInfo', + 'Image::ExifTool::Canon::ShotInfo', + 'Image::ExifTool::Canon::TimeInfo', + 'Image::ExifTool::Canon::VignettingCorr', + 'Image::ExifTool::Canon::VignettingCorr2', + 'Image::ExifTool::Canon::WBInfo', + 'Image::ExifTool::CanonCustom::Functions10D', + 'Image::ExifTool::CanonCustom::Functions1D', + 'Image::ExifTool::CanonCustom::Functions2', + 'Image::ExifTool::CanonCustom::Functions20D', + 'Image::ExifTool::CanonCustom::Functions30D', + 'Image::ExifTool::CanonCustom::Functions350D', + 'Image::ExifTool::CanonCustom::Functions400D', + 'Image::ExifTool::CanonCustom::Functions5D', + 'Image::ExifTool::CanonCustom::FunctionsD30', + 'Image::ExifTool::CanonCustom::PersonalFuncValues', + 'Image::ExifTool::CanonCustom::PersonalFuncs', + 'Image::ExifTool::CanonRaw::ExposureInfo', + 'Image::ExifTool::CanonRaw::FlashInfo', + 'Image::ExifTool::CanonRaw::ImageFormat', + 'Image::ExifTool::CanonRaw::ImageInfo', + 'Image::ExifTool::CanonRaw::Main', + 'Image::ExifTool::CanonRaw::MakeModel', + 'Image::ExifTool::CanonRaw::RawJpgInfo', + 'Image::ExifTool::CanonRaw::TimeStamp', + 'Image::ExifTool::CanonVRD::CropInfo', + 'Image::ExifTool::CanonVRD::DLOInfo', + 'Image::ExifTool::CanonVRD::DR4', + 'Image::ExifTool::CanonVRD::DR4Header', + 'Image::ExifTool::CanonVRD::GammaInfo', + 'Image::ExifTool::CanonVRD::Main', + 'Image::ExifTool::CanonVRD::ToneCurve', + 'Image::ExifTool::CanonVRD::Ver1', + 'Image::ExifTool::CanonVRD::Ver2', + 'Image::ExifTool::Casio::FaceInfo1', + 'Image::ExifTool::Casio::FaceInfo2', + 'Image::ExifTool::Casio::Main', + 'Image::ExifTool::Casio::Type2', + 'Image::ExifTool::Composite', + 'Image::ExifTool::DJI::Main', + 'Image::ExifTool::DJI::XMP', + 'Image::ExifTool::DNG::AdobeData', + 'Image::ExifTool::DarwinCore::Main', + 'Image::ExifTool::Exif::Main', + 'Image::ExifTool::Extra', + 'Image::ExifTool::FLIR::Main', + 'Image::ExifTool::FotoStation::Main', + 'Image::ExifTool::FotoStation::SoftEdit', + 'Image::ExifTool::FujiFilm::AFCSettings', + 'Image::ExifTool::FujiFilm::DriveSettings', + 'Image::ExifTool::FujiFilm::FocusSettings', + 'Image::ExifTool::FujiFilm::Main', + 'Image::ExifTool::FujiFilm::PrioritySettings', + 'Image::ExifTool::GE::Main', + 'Image::ExifTool::GPS::Main', + 'Image::ExifTool::IPTC::ApplicationRecord', + 'Image::ExifTool::IPTC::EnvelopeRecord', + 'Image::ExifTool::IPTC::NewsPhoto', + 'Image::ExifTool::JFIF::Main', + 'Image::ExifTool::Jpeg2000::ColorSpec', + 'Image::ExifTool::Jpeg2000::Main', + 'Image::ExifTool::Kodak::CameraInfo', + 'Image::ExifTool::Kodak::IFD', + 'Image::ExifTool::Kodak::KDC_IFD', + 'Image::ExifTool::Kodak::Main', + 'Image::ExifTool::Kodak::Meta', + 'Image::ExifTool::Kodak::SubIFD0', + 'Image::ExifTool::Kodak::SubIFD1', + 'Image::ExifTool::Kodak::SubIFD2', + 'Image::ExifTool::Kodak::SubIFD3', + 'Image::ExifTool::Kodak::SubIFD5', + 'Image::ExifTool::Kodak::Type10', + 'Image::ExifTool::Kodak::Type2', + 'Image::ExifTool::Kodak::Type3', + 'Image::ExifTool::Kodak::Type4', + 'Image::ExifTool::Kodak::Type5', + 'Image::ExifTool::Kodak::Type6', + 'Image::ExifTool::Kodak::Type7', + 'Image::ExifTool::Kodak::Type9', + 'Image::ExifTool::MIE::Audio', + 'Image::ExifTool::MIE::Camera', + 'Image::ExifTool::MIE::Doc', + 'Image::ExifTool::MIE::Extender', + 'Image::ExifTool::MIE::Flash', + 'Image::ExifTool::MIE::GPS', + 'Image::ExifTool::MIE::Geo', + 'Image::ExifTool::MIE::Image', + 'Image::ExifTool::MIE::Lens', + 'Image::ExifTool::MIE::Main', + 'Image::ExifTool::MIE::Orient', + 'Image::ExifTool::MIE::Preview', + 'Image::ExifTool::MIE::Thumbnail', + 'Image::ExifTool::MIE::UTM', + 'Image::ExifTool::MIE::Video', + 'Image::ExifTool::MWG::Collections', + 'Image::ExifTool::MWG::Keywords', + 'Image::ExifTool::MWG::Regions', + 'Image::ExifTool::MacOS::MDItem', + 'Image::ExifTool::MacOS::XAttr', + 'Image::ExifTool::Microsoft::MP', + 'Image::ExifTool::Microsoft::MP1', + 'Image::ExifTool::Microsoft::Stitch', + 'Image::ExifTool::Microsoft::XMP', + 'Image::ExifTool::Microsoft::Xtra', + 'Image::ExifTool::Minolta::CameraInfoA100', + 'Image::ExifTool::Minolta::CameraSettings', + 'Image::ExifTool::Minolta::CameraSettings5D', + 'Image::ExifTool::Minolta::CameraSettings7D', + 'Image::ExifTool::Minolta::CameraSettingsA100', + 'Image::ExifTool::Minolta::ISInfoA100', + 'Image::ExifTool::Minolta::Main', + 'Image::ExifTool::Minolta::WBInfoA100', + 'Image::ExifTool::MinoltaRaw::PRD', + 'Image::ExifTool::MinoltaRaw::RIF', + 'Image::ExifTool::MinoltaRaw::WBG', + 'Image::ExifTool::Motorola::Main', + 'Image::ExifTool::Nikon::AFInfo', + 'Image::ExifTool::Nikon::AFInfo2', + 'Image::ExifTool::Nikon::AFInfo2V0400', + 'Image::ExifTool::Nikon::AFTune', + 'Image::ExifTool::Nikon::BarometerInfo', + 'Image::ExifTool::Nikon::CaptureOutput', + 'Image::ExifTool::Nikon::ColorBalance1', + 'Image::ExifTool::Nikon::ColorBalance2', + 'Image::ExifTool::Nikon::ColorBalance3', + 'Image::ExifTool::Nikon::ColorBalance4', + 'Image::ExifTool::Nikon::ColorBalanceA', + 'Image::ExifTool::Nikon::ColorBalanceB', + 'Image::ExifTool::Nikon::ColorBalanceC', + 'Image::ExifTool::Nikon::ColorBalanceUnknown', + 'Image::ExifTool::Nikon::DistortInfo', + 'Image::ExifTool::Nikon::FaceDetect', + 'Image::ExifTool::Nikon::FileInfo', + 'Image::ExifTool::Nikon::FlashInfo0100', + 'Image::ExifTool::Nikon::FlashInfo0102', + 'Image::ExifTool::Nikon::FlashInfo0103', + 'Image::ExifTool::Nikon::FlashInfo0106', + 'Image::ExifTool::Nikon::FlashInfo0107', + 'Image::ExifTool::Nikon::FlashInfo0300', + 'Image::ExifTool::Nikon::GEM', + 'Image::ExifTool::Nikon::HDRInfo', + 'Image::ExifTool::Nikon::ISOInfo', + 'Image::ExifTool::Nikon::LensData00', + 'Image::ExifTool::Nikon::LensData01', + 'Image::ExifTool::Nikon::LensData0204', + 'Image::ExifTool::Nikon::LensData0400', + 'Image::ExifTool::Nikon::LensData0402', + 'Image::ExifTool::Nikon::LensData0403', + 'Image::ExifTool::Nikon::LensData0800', + 'Image::ExifTool::Nikon::LocationInfo', + 'Image::ExifTool::Nikon::Main', + 'Image::ExifTool::Nikon::MakerNotes0x51', + 'Image::ExifTool::Nikon::MenuSettingsZ7II', + 'Image::ExifTool::Nikon::MenuSettingsZ9', + 'Image::ExifTool::Nikon::MultiExposure', + 'Image::ExifTool::Nikon::PictureControl', + 'Image::ExifTool::Nikon::PictureControl2', + 'Image::ExifTool::Nikon::PictureControl3', + 'Image::ExifTool::Nikon::PreviewIFD', + 'Image::ExifTool::Nikon::ROC', + 'Image::ExifTool::Nikon::RetouchInfo', + 'Image::ExifTool::Nikon::Scan', + 'Image::ExifTool::Nikon::ShotInfo', + 'Image::ExifTool::Nikon::ShotInfoD300S', + 'Image::ExifTool::Nikon::ShotInfoD300a', + 'Image::ExifTool::Nikon::ShotInfoD300b', + 'Image::ExifTool::Nikon::ShotInfoD3S', + 'Image::ExifTool::Nikon::ShotInfoD3X', + 'Image::ExifTool::Nikon::ShotInfoD3a', + 'Image::ExifTool::Nikon::ShotInfoD3b', + 'Image::ExifTool::Nikon::ShotInfoD40', + 'Image::ExifTool::Nikon::ShotInfoD4S', + 'Image::ExifTool::Nikon::ShotInfoD500', + 'Image::ExifTool::Nikon::ShotInfoD5000', + 'Image::ExifTool::Nikon::ShotInfoD5100', + 'Image::ExifTool::Nikon::ShotInfoD5200', + 'Image::ExifTool::Nikon::ShotInfoD6', + 'Image::ExifTool::Nikon::ShotInfoD700', + 'Image::ExifTool::Nikon::ShotInfoD7000', + 'Image::ExifTool::Nikon::ShotInfoD80', + 'Image::ExifTool::Nikon::ShotInfoD800', + 'Image::ExifTool::Nikon::ShotInfoD810', + 'Image::ExifTool::Nikon::ShotInfoD850', + 'Image::ExifTool::Nikon::ShotInfoD90', + 'Image::ExifTool::Nikon::ShotInfoZ7II', + 'Image::ExifTool::Nikon::ShotInfoZ9', + 'Image::ExifTool::Nikon::Type2', + 'Image::ExifTool::Nikon::VRInfo', + 'Image::ExifTool::Nikon::WorldTime', + 'Image::ExifTool::NikonCapture::Brightness', + 'Image::ExifTool::NikonCapture::ColorBoost', + 'Image::ExifTool::NikonCapture::CropData', + 'Image::ExifTool::NikonCapture::DLightingHQ', + 'Image::ExifTool::NikonCapture::DLightingHS', + 'Image::ExifTool::NikonCapture::Exposure', + 'Image::ExifTool::NikonCapture::HighlightData', + 'Image::ExifTool::NikonCapture::Main', + 'Image::ExifTool::NikonCapture::NoiseReduction', + 'Image::ExifTool::NikonCapture::PhotoEffects', + 'Image::ExifTool::NikonCapture::PictureCtrl', + 'Image::ExifTool::NikonCapture::RedEyeData', + 'Image::ExifTool::NikonCapture::UnsharpData', + 'Image::ExifTool::NikonCapture::WBAdjData', + 'Image::ExifTool::NikonCustom::SettingsD3', + 'Image::ExifTool::NikonCustom::SettingsD4', + 'Image::ExifTool::NikonCustom::SettingsD40', + 'Image::ExifTool::NikonCustom::SettingsD5', + 'Image::ExifTool::NikonCustom::SettingsD500', + 'Image::ExifTool::NikonCustom::SettingsD5000', + 'Image::ExifTool::NikonCustom::SettingsD5100', + 'Image::ExifTool::NikonCustom::SettingsD5200', + 'Image::ExifTool::NikonCustom::SettingsD610', + 'Image::ExifTool::NikonCustom::SettingsD700', + 'Image::ExifTool::NikonCustom::SettingsD7000', + 'Image::ExifTool::NikonCustom::SettingsD80', + 'Image::ExifTool::NikonCustom::SettingsD800', + 'Image::ExifTool::NikonCustom::SettingsD810', + 'Image::ExifTool::NikonCustom::SettingsD850', + 'Image::ExifTool::NikonCustom::SettingsD90', + 'Image::ExifTool::NikonCustom::SettingsZ9', + 'Image::ExifTool::Nintendo::CameraInfo', + 'Image::ExifTool::Olympus::CameraSettings', + 'Image::ExifTool::Olympus::Equipment', + 'Image::ExifTool::Olympus::FETags', + 'Image::ExifTool::Olympus::FocusInfo', + 'Image::ExifTool::Olympus::ImageProcessing', + 'Image::ExifTool::Olympus::Main', + 'Image::ExifTool::Olympus::RawDevelopment', + 'Image::ExifTool::Olympus::RawDevelopment2', + 'Image::ExifTool::Olympus::RawInfo', + 'Image::ExifTool::PDF::Info', + 'Image::ExifTool::PLUS::XMP', + 'Image::ExifTool::PNG::Main', + 'Image::ExifTool::PNG::PhysicalPixel', + 'Image::ExifTool::PNG::TextualData', + 'Image::ExifTool::Panasonic::Data1', + 'Image::ExifTool::Panasonic::FaceDetInfo', + 'Image::ExifTool::Panasonic::FaceRecInfo', + 'Image::ExifTool::Panasonic::FocusInfo', + 'Image::ExifTool::Panasonic::Leica2', + 'Image::ExifTool::Panasonic::Leica3', + 'Image::ExifTool::Panasonic::Leica5', + 'Image::ExifTool::Panasonic::Leica6', + 'Image::ExifTool::Panasonic::Leica9', + 'Image::ExifTool::Panasonic::Main', + 'Image::ExifTool::Panasonic::ShotInfo', + 'Image::ExifTool::Panasonic::Subdir', + 'Image::ExifTool::Panasonic::TimeInfo', + 'Image::ExifTool::PanasonicRaw::DistortionInfo', + 'Image::ExifTool::PanasonicRaw::Main', + 'Image::ExifTool::PanasonicRaw::WBInfo', + 'Image::ExifTool::PanasonicRaw::WBInfo2', + 'Image::ExifTool::Pentax::AEInfo', + 'Image::ExifTool::Pentax::AEInfo2', + 'Image::ExifTool::Pentax::AEInfo3', + 'Image::ExifTool::Pentax::AFInfo', + 'Image::ExifTool::Pentax::AFPointInfo', + 'Image::ExifTool::Pentax::AWBInfo', + 'Image::ExifTool::Pentax::BatteryInfo', + 'Image::ExifTool::Pentax::CameraInfo', + 'Image::ExifTool::Pentax::CameraSettings', + 'Image::ExifTool::Pentax::ColorInfo', + 'Image::ExifTool::Pentax::EVStepInfo', + 'Image::ExifTool::Pentax::FaceInfo', + 'Image::ExifTool::Pentax::FacePos', + 'Image::ExifTool::Pentax::FaceSize', + 'Image::ExifTool::Pentax::FilterInfo', + 'Image::ExifTool::Pentax::FlashInfo', + 'Image::ExifTool::Pentax::KelvinWB', + 'Image::ExifTool::Pentax::LensCorr', + 'Image::ExifTool::Pentax::LensData', + 'Image::ExifTool::Pentax::LensInfo', + 'Image::ExifTool::Pentax::LensInfo2', + 'Image::ExifTool::Pentax::LensInfo3', + 'Image::ExifTool::Pentax::LensInfo4', + 'Image::ExifTool::Pentax::LensInfo5', + 'Image::ExifTool::Pentax::LensInfoQ', + 'Image::ExifTool::Pentax::LensRec', + 'Image::ExifTool::Pentax::LevelInfo', + 'Image::ExifTool::Pentax::Main', + 'Image::ExifTool::Pentax::PixelShiftInfo', + 'Image::ExifTool::Pentax::SRInfo', + 'Image::ExifTool::Pentax::SRInfo2', + 'Image::ExifTool::Pentax::ShotInfo', + 'Image::ExifTool::Pentax::TempInfo', + 'Image::ExifTool::Pentax::TimeInfo', + 'Image::ExifTool::Pentax::Type2', + 'Image::ExifTool::Pentax::WBLevels', + 'Image::ExifTool::PhaseOne::Main', + 'Image::ExifTool::PhaseOne::SensorCalibration', + 'Image::ExifTool::PhotoMechanic::SoftEdit', + 'Image::ExifTool::PhotoMechanic::XMP', + 'Image::ExifTool::Photoshop::JPEG_Quality', + 'Image::ExifTool::Photoshop::Main', + 'Image::ExifTool::Photoshop::Resolution', + 'Image::ExifTool::PostScript::Main', + 'Image::ExifTool::QuickTime::ItemList', + 'Image::ExifTool::QuickTime::ItemPropCont', + 'Image::ExifTool::QuickTime::Keys', + 'Image::ExifTool::QuickTime::Main', + 'Image::ExifTool::QuickTime::MediaHeader', + 'Image::ExifTool::QuickTime::MovieHeader', + 'Image::ExifTool::QuickTime::Preview', + 'Image::ExifTool::QuickTime::TrackHeader', + 'Image::ExifTool::QuickTime::UserData', + 'Image::ExifTool::Reconyx::Main', + 'Image::ExifTool::Reconyx::Type2', + 'Image::ExifTool::Reconyx::Type3', + 'Image::ExifTool::Ricoh::FaceInfo', + 'Image::ExifTool::Ricoh::FirmwareInfo', + 'Image::ExifTool::Ricoh::ImageInfo', + 'Image::ExifTool::Ricoh::Main', + 'Image::ExifTool::Ricoh::SerialInfo', + 'Image::ExifTool::Ricoh::Subdir', + 'Image::ExifTool::Ricoh::ThetaSubdir', + 'Image::ExifTool::Samsung::Main', + 'Image::ExifTool::Samsung::OrientationInfo', + 'Image::ExifTool::Samsung::PictureWizard', + 'Image::ExifTool::Samsung::Type2', + 'Image::ExifTool::Sanyo::FaceInfo', + 'Image::ExifTool::Sanyo::Main', + 'Image::ExifTool::Sigma::Main', + 'Image::ExifTool::Sigma::WBSettings', + 'Image::ExifTool::Sigma::WBSettings2', + 'Image::ExifTool::Sony::AFInfo', + 'Image::ExifTool::Sony::AFStatus15', + 'Image::ExifTool::Sony::AFStatus19', + 'Image::ExifTool::Sony::AFStatus79', + 'Image::ExifTool::Sony::CameraInfo', + 'Image::ExifTool::Sony::CameraInfo2', + 'Image::ExifTool::Sony::CameraInfo3', + 'Image::ExifTool::Sony::CameraSettings', + 'Image::ExifTool::Sony::CameraSettings2', + 'Image::ExifTool::Sony::CameraSettings3', + 'Image::ExifTool::Sony::Ericsson', + 'Image::ExifTool::Sony::ExtraInfo', + 'Image::ExifTool::Sony::ExtraInfo2', + 'Image::ExifTool::Sony::ExtraInfo3', + 'Image::ExifTool::Sony::FaceInfo', + 'Image::ExifTool::Sony::FaceInfo1', + 'Image::ExifTool::Sony::FaceInfo2', + 'Image::ExifTool::Sony::FaceInfoA', + 'Image::ExifTool::Sony::FocusInfo', + 'Image::ExifTool::Sony::ISOInfo', + 'Image::ExifTool::Sony::Main', + 'Image::ExifTool::Sony::MeterInfo', + 'Image::ExifTool::Sony::MeterInfo9', + 'Image::ExifTool::Sony::MoreInfo0201', + 'Image::ExifTool::Sony::MoreInfo0401', + 'Image::ExifTool::Sony::MoreSettings', + 'Image::ExifTool::Sony::Panorama', + 'Image::ExifTool::Sony::SR2SubIFD', + 'Image::ExifTool::Sony::ShotInfo', + 'Image::ExifTool::Sony::Tag2010a', + 'Image::ExifTool::Sony::Tag2010b', + 'Image::ExifTool::Sony::Tag2010c', + 'Image::ExifTool::Sony::Tag2010d', + 'Image::ExifTool::Sony::Tag2010e', + 'Image::ExifTool::Sony::Tag2010f', + 'Image::ExifTool::Sony::Tag2010g', + 'Image::ExifTool::Sony::Tag2010h', + 'Image::ExifTool::Sony::Tag2010i', + 'Image::ExifTool::Sony::Tag202a', + 'Image::ExifTool::Sony::Tag9050a', + 'Image::ExifTool::Sony::Tag9050b', + 'Image::ExifTool::Sony::Tag9050c', + 'Image::ExifTool::Sony::Tag9400a', + 'Image::ExifTool::Sony::Tag9400b', + 'Image::ExifTool::Sony::Tag9400c', + 'Image::ExifTool::Sony::Tag9402', + 'Image::ExifTool::Sony::Tag9403', + 'Image::ExifTool::Sony::Tag9404a', + 'Image::ExifTool::Sony::Tag9404b', + 'Image::ExifTool::Sony::Tag9404c', + 'Image::ExifTool::Sony::Tag9405a', + 'Image::ExifTool::Sony::Tag9405b', + 'Image::ExifTool::Sony::Tag9406', + 'Image::ExifTool::Sony::Tag940a', + 'Image::ExifTool::Sony::Tag940c', + 'Image::ExifTool::SonyIDC::Main', + 'Image::ExifTool::XMP::Album', + 'Image::ExifTool::XMP::DICOM', + 'Image::ExifTool::XMP::Device', + 'Image::ExifTool::XMP::ExpressionMedia', + 'Image::ExifTool::XMP::GAudio', + 'Image::ExifTool::XMP::GCamera', + 'Image::ExifTool::XMP::GCreations', + 'Image::ExifTool::XMP::GDepth', + 'Image::ExifTool::XMP::GFocus', + 'Image::ExifTool::XMP::GImage', + 'Image::ExifTool::XMP::GPano', + 'Image::ExifTool::XMP::GSpherical', + 'Image::ExifTool::XMP::GettyImages', + 'Image::ExifTool::XMP::LImage', + 'Image::ExifTool::XMP::Lightroom', + 'Image::ExifTool::XMP::MediaPro', + 'Image::ExifTool::XMP::aas', + 'Image::ExifTool::XMP::acdsee', + 'Image::ExifTool::XMP::apple_fi', + 'Image::ExifTool::XMP::aux', + 'Image::ExifTool::XMP::cc', + 'Image::ExifTool::XMP::cell', + 'Image::ExifTool::XMP::crd', + 'Image::ExifTool::XMP::creatorAtom', + 'Image::ExifTool::XMP::crs', + 'Image::ExifTool::XMP::dc', + 'Image::ExifTool::XMP::dex', + 'Image::ExifTool::XMP::digiKam', + 'Image::ExifTool::XMP::exif', + 'Image::ExifTool::XMP::exifEX', + 'Image::ExifTool::XMP::extensis', + 'Image::ExifTool::XMP::fpv', + 'Image::ExifTool::XMP::ics', + 'Image::ExifTool::XMP::iptcCore', + 'Image::ExifTool::XMP::iptcExt', + 'Image::ExifTool::XMP::pdf', + 'Image::ExifTool::XMP::photoshop', + 'Image::ExifTool::XMP::pmi', + 'Image::ExifTool::XMP::prism', + 'Image::ExifTool::XMP::prl', + 'Image::ExifTool::XMP::prm', + 'Image::ExifTool::XMP::pur', + 'Image::ExifTool::XMP::rdf', + 'Image::ExifTool::XMP::swf', + 'Image::ExifTool::XMP::tiff', + 'Image::ExifTool::XMP::x', + 'Image::ExifTool::XMP::xmp', + 'Image::ExifTool::XMP::xmpBJ', + 'Image::ExifTool::XMP::xmpDM', + 'Image::ExifTool::XMP::xmpMM', + 'Image::ExifTool::XMP::xmpNote', + 'Image::ExifTool::XMP::xmpPLUS', + 'Image::ExifTool::XMP::xmpRights', + 'Image::ExifTool::XMP::xmpTPg', +); + +# lookup for all writable tags +my %tagLookup = ( + 'aberrationcorrectiondistance' => { 109 => 0x69 }, + 'about' => { 498 => 'about' }, + 'aboutcvterm' => { 490 => 'AboutCvTerm' }, + 'aboutcvtermcvid' => { 490 => [\'AboutCvTerm','AboutCvTermCvId'] }, + 'aboutcvtermid' => { 490 => [\'AboutCvTerm','AboutCvTermCvTermId'] }, + 'aboutcvtermname' => { 490 => [\'AboutCvTerm','AboutCvTermCvTermName'] }, + 'aboutcvtermrefinedabout' => { 490 => [\'AboutCvTerm','AboutCvTermCvTermRefinedAbout'] }, + 'absolutealtitude' => { 116 => 'AbsoluteAltitude' }, + 'abspeakaudiofilepath' => { 504 => 'absPeakAudioFilePath' }, + 'academicfield' => { 494 => 'academicField' }, + 'acceleration' => { 119 => 0x9404, 485 => 'Acceleration' }, + 'accelerationtracking' => { 84 => 0x518 }, + 'accelerationvector' => { 1 => 0x8 }, + 'accelerometer' => { 390 => 0x3 }, + 'accelerometerdata' => { 380 => 'vrot' }, + 'accelerometerx' => { 320 => 0x8d }, + 'accelerometery' => { 320 => 0x8e }, + 'accelerometerz' => { 320 => 0x8c }, + 'accessoryserialnumber' => { 320 => 0x54 }, + 'accessorytype' => { 320 => 0x53 }, + 'actionadvised' => { 131 => 0x2a }, + 'activearea' => { 119 => 0xc68d }, + 'actived-lighting' => { 226 => 0x22, 270 => 0x24 }, + 'actived-lightingmode' => { 270 => 0x25 }, + 'adaptervoltage' => { 138 => 0x407 }, + 'addaspectratioinfo' => { 84 => 0x80e }, + 'addiptcinformation' => { 84 => 0x815 }, + 'additionalmodelinformation' => { 490 => 'AddlModelInfo' }, + 'addoriginaldecisiondata' => { 84 => 0x80f, 85 => 0x11, 86 => 0x13, 89 => 0x14 }, + 'address' => { 161 => 'Address' }, + 'adjustmentmode' => { 397 => 0x15 }, + 'adlbracketingstep' => { 248 => 0x883 }, + 'adlbracketingtype' => { 248 => 0x884 }, + 'adobe' => { 120 => 'Adobe' }, + 'adultcontentwarning' => { 307 => 'AdultContentWarning', 497 => 'adultContentWarning' }, + 'advancedfilter' => { 127 => 0x1201 }, + 'advancedraw' => { 272 => 0x76a43203 }, + 'advancedscenetype' => { 320 => 0x3d }, + 'advisory' => { 502 => 'Advisory' }, + 'ae_iso' => { 328 => 0x2, 329 => 0x4, 330 => 0x12 }, + 'aeaperture' => { 328 => 0x1, 329 => 0x3, 330 => 0x11 }, + 'aeaperturesteps' => { 328 => 0x8, 329 => 0xb }, + 'aebautocancel' => { 84 => 0x104 }, + 'aebbracketvalue' => { 77 => 0x11 }, + 'aebracketingsteps' => { 247 => 0x174c, 248 => 0x87b, 257 => 0x1756 }, + 'aebsequence' => { 84 => 0x105 }, + 'aebsequenceautocancel' => { 82 => 0x9, 83 => 0x9, 85 => 0x8, 86 => 0x9, 89 => 0x9, 90 => 0x7 }, + 'aebshotcount' => { 84 => 0x106 }, + 'aebxv' => { 328 => 0x4, 329 => 0x6 }, + 'aeerror' => { 329 => 0x8 }, + 'aeexposuretime' => { 328 => 0x0, 329 => 0x2, 330 => 0x10 }, + 'aelbutton' => { 184 => 0x45 }, + 'aelexposureindicator' => { 184 => 0x51 }, + 'aelock' => { 184 => 0x5b, 281 => '4.2', 290 => '4.2', 297 => 0x201, 355 => 0x48, 407 => 0x40, 408 => 0x40, 409 => [0x86,0x286] }, + 'aelockbutton' => { 279 => '16.1', 281 => '4.1', 284 => '15.1', 285 => '16.1', 286 => '16.1', 288 => '30.1', 289 => '16.1', 290 => '4.1', 292 => '17.1', 294 => '17.1' }, + 'aelockbuttonplusdials' => { 279 => '16.2', 288 => '32.1', 292 => '44.1' }, + 'aelockformb-d80' => { 294 => '3.1' }, + 'aelockmetermodeafterfocus' => { 84 => 0x114 }, + 'aemaxaperture' => { 328 => 0x9, 329 => 0x10, 330 => 0x1c }, + 'aemaxaperture2' => { 328 => 0xa, 329 => 0x11, 330 => 0x1d }, + 'aemeteringmode' => { 328 => 0xc }, + 'aemeteringmode2' => { 328 => '13.1' }, + 'aemeteringsegments' => { 187 => 0x628, 355 => 0x209 }, + 'aemicroadjustment' => { 84 => 0x110 }, + 'aeminaperture' => { 328 => 0xb, 329 => 0x12, 330 => 0x1e }, + 'aeminexposuretime' => { 328 => 0x5, 329 => 0x13, 330 => 0x1f }, + 'aeprogrammode' => { 328 => 0x6 }, + 'aeprojectlink' => { 479 => 'aeProjectLink' }, + 'aeprojectlinkcompositionid' => { 479 => [\'aeProjectLink','aeProjectLinkCompositionID'] }, + 'aeprojectlinkfullpath' => { 479 => [\'aeProjectLink','aeProjectLinkFullPath'] }, + 'aeprojectlinkrenderoutputmoduleindex' => { 479 => [\'aeProjectLink','aeProjectLinkRenderOutputModuleIndex'] }, + 'aeprojectlinkrenderqueueitemid' => { 479 => [\'aeProjectLink','aeProjectLinkRenderQueueItemID'] }, + 'aeprojectlinkrendertimestamp' => { 479 => [\'aeProjectLink','aeProjectLinkRenderTimeStamp'] }, + 'aesetting' => { 34 => 0x21 }, + 'aewhitebalance' => { 328 => 0xd }, + 'aexv' => { 328 => 0x3, 329 => 0x5 }, + 'af-assistilluminator' => { 295 => 0x19 }, + 'af-cfocusdisplay' => { 295 => 0x234 }, + 'af-cpriority' => { 128 => '0.2' }, + 'af-cpriorityselection' => { 279 => '1.1', 280 => '1.1', 282 => '1.1', 283 => '1.1', 285 => '0.1', 286 => '0.1', 287 => '0.1', 288 => '1.1', 289 => '0.1', 292 => '1.1', 293 => '1.1', 295 => 0x3 }, + 'af-csetting' => { 124 => 0x0 }, + 'af-cspeedtrackingsensitivity' => { 124 => '0.2' }, + 'af-ctrackingsensitivity' => { 124 => '0.1' }, + 'af-czoneareaswitching' => { 124 => '0.3' }, + 'af-onbutton' => { 282 => '70.1', 283 => '70.1', 293 => '70.1' }, + 'af-onformb-d10' => { 279 => '3.3', 288 => '3.2' }, + 'af-onformb-d11' => { 289 => '2.2' }, + 'af-onformb-d12' => { 292 => '50.1' }, + 'af-onoutoffocusrelease' => { 295 => 0x10 }, + 'af-spriority' => { 128 => '0.1' }, + 'af-spriorityselection' => { 279 => '1.2', 280 => '1.2', 282 => '1.2', 283 => '1.2', 287 => '0.2', 288 => '1.2', 289 => '0.2', 292 => '1.2', 293 => '1.2', 295 => 0x5 }, + 'afacceldeceltracking' => { 2 => 0x3 }, + 'afactivation' => { 279 => '2.1', 280 => '2.1', 282 => '78.3', 283 => '78.3', 288 => '2.1', 292 => '2.1', 293 => '78.3', 295 => 0xf }, + 'afadjustment' => { 355 => 0x72, 364 => 0x267 }, + 'afandmeteringbuttons' => { 84 => 0x701 }, + 'afaperture' => { 219 => 0x5, 220 => 0x5, 224 => 0x5 }, + 'afareaheight' => { 193 => [0x1a,0x34,0x50], 194 => 0x48 }, + 'afareaillumination' => { 184 => 0x4b, 290 => '15.3' }, + 'afareamode' => { 126 => '0.3', 180 => 0x33, 184 => 0xe, 192 => 0x0, 193 => 0x5, 229 => 0x210, 320 => 0xf, 387 => 0x1205, 400 => [0xa,0x3a], 407 => 0x11, 408 => 0x10, 409 => 0x24, 420 => 0xb043, 445 => 0x17 }, + 'afareamodesetting' => { 281 => '11.1', 284 => '0.1', 290 => '16.1', 294 => '2.1', 420 => 0x201c }, + 'afareapointsize' => { 126 => '0.4' }, + 'afareas' => { 297 => 0x304 }, + 'afareaselectionmethod' => { 2 => 0xd }, + 'afareaselectmethod' => { 84 => 0x51b }, + 'afareawidth' => { 193 => [0x18,0x32,0x4e], 194 => 0x46 }, + 'afareaxposition' => { 193 => [0x14,0x2e,0x4a], 387 => 0x1203 }, + 'afareaxposition1' => { 387 => 0x1201 }, + 'afareayposition' => { 193 => [0x16,0x30,0x4c], 387 => 0x1204 }, + 'afareayposition1' => { 387 => 0x1202 }, + 'afareazonesize' => { 126 => '0.5' }, + 'afassist' => { 82 => 0x5, 90 => 0x5, 184 => 0x48, 279 => '2.5', 281 => '0.2', 284 => '0.2', 285 => '1.1', 286 => '1.1', 287 => '1.3', 288 => '2.4', 289 => '1.3', 290 => '0.2', 292 => '2.4', 294 => '2.3' }, + 'afassistbeam' => { 2 => 0x8, 84 => 0x50e, 85 => 0x4, 86 => 0x5, 87 => 0x4, 88 => 0x4, 89 => 0x5 }, + 'afassistlamp' => { 320 => 0x31 }, + 'afbuttonpressed' => { 409 => [0x83,0x283] }, + 'afconfigtool' => { 2 => 0x1 }, + 'afdefocus' => { 331 => 0x6 }, + 'afduringliveview' => { 84 => 0x511 }, + 'affinea' => { 472 => 'AffineA' }, + 'affineb' => { 472 => 'AffineB' }, + 'affinec' => { 472 => 'AffineC' }, + 'affined' => { 472 => 'AffineD' }, + 'affinetune' => { 195 => 0x0, 229 => 0x5b0, 297 => 0x306 }, + 'affinetuneadj' => { 195 => 0x2, 240 => 0x2d1, 241 => 0x2dc, 297 => 0x307 }, + 'affinetuneadjtele' => { 195 => 0x3 }, + 'affinetuneindex' => { 195 => 0x1 }, + 'affinex' => { 472 => 'AffineX' }, + 'affiney' => { 472 => 'AffineY' }, + 'affocuspointxposition' => { 193 => 0x2f }, + 'affocuspointyposition' => { 193 => 0x31 }, + 'afhold' => { 331 => 0x1fd }, + 'afilluminator' => { 407 => 0x29, 420 => 0xb044 }, + 'afimageheight' => { 193 => [0x12,0x2c,0x48], 194 => 0x40 }, + 'afimagewidth' => { 193 => [0x10,0x2a,0x46], 194 => 0x3e }, + 'afintegrationtime' => { 331 => 0x7 }, + 'afmicroadj' => { 400 => [0x17d,0x50] }, + 'afmicroadjmode' => { 3 => 0x1, 404 => 0x131 }, + 'afmicroadjregisteredlenses' => { 404 => '305.1' }, + 'afmicroadjustment' => { 84 => 0x507 }, + 'afmicroadjvalue' => { 3 => 0x2, 404 => 0x130 }, + 'afmode' => { 113 => 0x3009, 127 => 0x1022, 180 => 0x16, 397 => 0x5 }, + 'afmoderestrictions' => { 280 => '50.3', 282 => '48.3', 283 => '48.3', 292 => '48.3', 293 => '48.3' }, + 'afonaelockbuttonswitch' => { 84 => 0x702 }, + 'afonbutton' => { 279 => '3.1', 280 => '47.1', 295 => 0x83 }, + 'afpoint' => { 34 => 0x13, 112 => 0x18, 180 => 0x15, 192 => 0x1, 300 => 0x308, 397 => 0x1f, 400 => [0x37,0x7], 404 => 0x19, 405 => 0x18, 406 => [0x18,0x20] }, + 'afpointactivationarea' => { 83 => 0x11, 89 => 0x11 }, + 'afpointareaexpansion' => { 84 => 0x508 }, + 'afpointatshutterrelease' => { 400 => [0x39,0x9] }, + 'afpointautoselection' => { 84 => 0x50b }, + 'afpointbrightness' => { 84 => 0x50d, 279 => '2.4', 280 => '46.5', 282 => '2.2', 283 => '2.2', 292 => '2.3', 293 => '2.2' }, + 'afpointdisplayduringfocus' => { 2 => 0x10, 84 => 0x50c }, + 'afpointillumination' => { 83 => 0xa, 279 => '2.3', 280 => '46.2', 282 => '47.2', 283 => '47.2', 287 => '1.2', 288 => '2.3', 289 => '1.2', 292 => '47.2', 293 => '47.2', 294 => '2.4' }, + 'afpointinfocus' => { 400 => [0x38,0x8] }, + 'afpointmode' => { 336 => 0x3 }, + 'afpointposition' => { 113 => 0x2021, 320 => 0x4d }, + 'afpointregistration' => { 82 => 0x7 }, + 'afpoints' => { 183 => 0x10 }, + 'afpointsel' => { 295 => 0xb }, + 'afpointselected' => { 184 => 0xd, 297 => 0x305, 355 => 0xe, 404 => 0x15, 405 => 0x14, 406 => [0x14,0x1c], 420 => 0x201e }, + 'afpointselected2' => { 336 => 0x4 }, + 'afpointselection' => { 83 => 0xb, 279 => '1.3', 280 => '1.3', 288 => '1.3', 292 => '1.3', 293 => '1.3' }, + 'afpointselectionmethod' => { 84 => 0x50f, 85 => 0xc, 86 => 0xd, 89 => 0xd }, + 'afpointsetting' => { 407 => 0x12, 408 => 0x11 }, + 'afpointsinfocus' => { 77 => 0xe, 192 => 0x2, 193 => 0x30, 331 => 0xb, 332 => 0x4, 355 => [0xf,0x3c] }, + 'afpointsinfocus5d' => { 19 => 0x38 }, + 'afpointspotmetering' => { 83 => 0xd }, + 'afpointsselected' => { 193 => 0x1c, 332 => '4.1', 453 => 0x4 }, + 'afpointsspecial' => { 332 => '4.2' }, + 'afpointsunknown1' => { 331 => 0x0 }, + 'afpointsunknown2' => { 331 => 0x2 }, + 'afpointsused' => { 193 => [0xa,0x8], 400 => [0x10,0x16e] }, + 'afpointswitching' => { 2 => 0x4 }, + 'afpredictor' => { 331 => 0x4 }, + 'afresponse' => { 226 => 0xad }, + 'afresult' => { 302 => 0x1038 }, + 'afsearch' => { 297 => 0x303 }, + 'afsensoractive' => { 180 => 0x1 }, + 'afstatus' => { 387 => 0x1200 }, + 'afstatus_00_b4' => { 403 => 0x0 }, + 'afstatus_01_c4' => { 403 => 0x2 }, + 'afstatus_02_d4' => { 403 => 0x4 }, + 'afstatus_03_e4' => { 403 => 0x6 }, + 'afstatus_04_f4' => { 403 => 0x8 }, + 'afstatus_05_g4' => { 403 => 0xa }, + 'afstatus_06_h4' => { 403 => 0xc }, + 'afstatus_07_b3' => { 403 => 0xe }, + 'afstatus_08_c3' => { 403 => 0x10 }, + 'afstatus_09_d3' => { 403 => 0x12 }, + 'afstatus_10_e3' => { 403 => 0x14 }, + 'afstatus_11_f3' => { 403 => 0x16 }, + 'afstatus_12_g3' => { 403 => 0x18 }, + 'afstatus_13_h3' => { 403 => 0x1a }, + 'afstatus_14_b2' => { 403 => 0x1c }, + 'afstatus_15_c2' => { 403 => 0x1e }, + 'afstatus_16_d2' => { 403 => 0x20 }, + 'afstatus_17_e2' => { 403 => 0x22 }, + 'afstatus_18_f2' => { 403 => 0x24 }, + 'afstatus_19_g2' => { 403 => 0x26 }, + 'afstatus_20_h2' => { 403 => 0x28 }, + 'afstatus_21_c1' => { 403 => 0x2a }, + 'afstatus_22_d1' => { 403 => 0x2c }, + 'afstatus_23_e1' => { 403 => 0x2e }, + 'afstatus_24_f1' => { 403 => 0x30 }, + 'afstatus_25_g1' => { 403 => 0x32 }, + 'afstatus_26_a7_vertical' => { 403 => 0x34 }, + 'afstatus_27_a6_vertical' => { 403 => 0x36 }, + 'afstatus_28_a5_vertical' => { 403 => 0x38 }, + 'afstatus_29_c7_vertical' => { 403 => 0x3a }, + 'afstatus_30_c6_vertical' => { 403 => 0x3c }, + 'afstatus_31_c5_vertical' => { 403 => 0x3e }, + 'afstatus_32_e7_vertical' => { 403 => 0x40 }, + 'afstatus_33_e6_center_vertical' => { 403 => 0x42 }, + 'afstatus_34_e5_vertical' => { 403 => 0x44 }, + 'afstatus_35_g7_vertical' => { 403 => 0x46 }, + 'afstatus_36_g6_vertical' => { 403 => 0x48 }, + 'afstatus_37_g5_vertical' => { 403 => 0x4a }, + 'afstatus_38_i7_vertical' => { 403 => 0x4c }, + 'afstatus_39_i6_vertical' => { 403 => 0x4e }, + 'afstatus_40_i5_vertical' => { 403 => 0x50 }, + 'afstatus_41_a7' => { 403 => 0x52 }, + 'afstatus_42_b7' => { 403 => 0x54 }, + 'afstatus_43_c7' => { 403 => 0x56 }, + 'afstatus_44_d7' => { 403 => 0x58 }, + 'afstatus_45_e7' => { 403 => 0x5a }, + 'afstatus_46_f7' => { 403 => 0x5c }, + 'afstatus_47_g7' => { 403 => 0x5e }, + 'afstatus_48_h7' => { 403 => 0x60 }, + 'afstatus_49_i7' => { 403 => 0x62 }, + 'afstatus_50_a6' => { 403 => 0x64 }, + 'afstatus_51_b6' => { 403 => 0x66 }, + 'afstatus_52_c6' => { 403 => 0x68 }, + 'afstatus_53_d6' => { 403 => 0x6a }, + 'afstatus_54_e6_center' => { 403 => 0x6c }, + 'afstatus_55_f6' => { 403 => 0x6e }, + 'afstatus_56_g6' => { 403 => 0x70 }, + 'afstatus_57_h6' => { 403 => 0x72 }, + 'afstatus_58_i6' => { 403 => 0x74 }, + 'afstatus_59_a5' => { 403 => 0x76 }, + 'afstatus_60_b5' => { 403 => 0x78 }, + 'afstatus_61_c5' => { 403 => 0x7a }, + 'afstatus_62_d5' => { 403 => 0x7c }, + 'afstatus_63_e5' => { 403 => 0x7e }, + 'afstatus_64_f5' => { 403 => 0x80 }, + 'afstatus_65_g5' => { 403 => 0x82 }, + 'afstatus_66_h5' => { 403 => 0x84 }, + 'afstatus_67_i5' => { 403 => 0x86 }, + 'afstatus_68_c11' => { 403 => 0x88 }, + 'afstatus_69_d11' => { 403 => 0x8a }, + 'afstatus_70_e11' => { 403 => 0x8c }, + 'afstatus_71_f11' => { 403 => 0x8e }, + 'afstatus_72_g11' => { 403 => 0x90 }, + 'afstatus_73_b10' => { 403 => 0x92 }, + 'afstatus_74_c10' => { 403 => 0x94 }, + 'afstatus_75_d10' => { 403 => 0x96 }, + 'afstatus_76_e10' => { 403 => 0x98 }, + 'afstatus_77_f10' => { 403 => 0x9a }, + 'afstatus_78_g10' => { 403 => 0x9c }, + 'afstatus_79_h10' => { 403 => 0x9e }, + 'afstatus_80_b9' => { 403 => 0xa0 }, + 'afstatus_81_c9' => { 403 => 0xa2 }, + 'afstatus_82_d9' => { 403 => 0xa4 }, + 'afstatus_83_e9' => { 403 => 0xa6 }, + 'afstatus_84_f9' => { 403 => 0xa8 }, + 'afstatus_85_g9' => { 403 => 0xaa }, + 'afstatus_86_h9' => { 403 => 0xac }, + 'afstatus_87_b8' => { 403 => 0xae }, + 'afstatus_88_c8' => { 403 => 0xb0 }, + 'afstatus_89_d8' => { 403 => 0xb2 }, + 'afstatus_90_e8' => { 403 => 0xb4 }, + 'afstatus_91_f8' => { 403 => 0xb6 }, + 'afstatus_92_g8' => { 403 => 0xb8 }, + 'afstatus_93_h8' => { 403 => 0xba }, + 'afstatus_94_e6_center_f2-8' => { 403 => 0xbc }, + 'afstatusactivesensor' => { 180 => 0x2, 400 => [0x4,0x3b], 404 => 0x1e, 405 => 0x1b, 406 => [0x1b,0x21] }, + 'afstatusbottom' => { 180 => 0x8, 404 => 0x2a, 405 => 0x21, 406 => 0x21 }, + 'afstatusbottom-left' => { 180 => 0x12, 405 => 0x2b, 406 => 0x2b }, + 'afstatusbottom-right' => { 180 => 0x6, 405 => 0x1f, 406 => 0x1f }, + 'afstatusbottomassist-left' => { 404 => 0x28 }, + 'afstatusbottomassist-right' => { 404 => 0x2c }, + 'afstatusbottomhorizontal' => { 401 => 0x10, 402 => 0x1c }, + 'afstatusbottomvertical' => { 401 => 0x16, 402 => 0x26 }, + 'afstatuscenter-10' => { 404 => 0x34 }, + 'afstatuscenter-11' => { 404 => 0x36 }, + 'afstatuscenter-12' => { 404 => 0x38 }, + 'afstatuscenter-14' => { 404 => 0x3c }, + 'afstatuscenter-7' => { 404 => 0x2e }, + 'afstatuscenter-9' => { 404 => 0x32 }, + 'afstatuscenter-horizontal' => { 404 => 0x30 }, + 'afstatuscenter-vertical' => { 404 => 0x3a }, + 'afstatuscenterf2-8' => { 404 => 0x4c }, + 'afstatuscenterhorizontal' => { 180 => 0x2f, 401 => 0xc, 402 => 0x18, 405 => 0x2f, 406 => 0x2f }, + 'afstatuscentervertical' => { 180 => 0xc, 401 => 0x14, 402 => 0x22, 405 => 0x25, 406 => 0x25 }, + 'afstatusfarleft' => { 401 => 0x6, 404 => 0x26 }, + 'afstatusfarlefthorizontal' => { 402 => 0x4 }, + 'afstatusfarleftvertical' => { 402 => 0x12 }, + 'afstatusfarright' => { 401 => 0x18, 404 => 0x44 }, + 'afstatusfarrighthorizontal' => { 402 => 0x2c }, + 'afstatusfarrightvertical' => { 402 => 0x34 }, + 'afstatusleft' => { 180 => 0x2d, 401 => 0x2, 404 => 0x22, 405 => 0x2d, 406 => 0x2d }, + 'afstatuslefthorizontal' => { 402 => 0x6 }, + 'afstatusleftvertical' => { 402 => 0xe }, + 'afstatuslower-left' => { 401 => 0x4, 404 => 0x24 }, + 'afstatuslower-lefthorizontal' => { 402 => 0xa }, + 'afstatuslower-leftvertical' => { 402 => 0x10 }, + 'afstatuslower-middle' => { 401 => 0x22, 402 => 0x24 }, + 'afstatuslower-right' => { 401 => 0x1e, 404 => 0x4a }, + 'afstatuslower-righthorizontal' => { 402 => 0x32 }, + 'afstatuslower-rightvertical' => { 402 => 0x3a }, + 'afstatuslowerfarleft' => { 402 => 0x8 }, + 'afstatuslowerfarright' => { 402 => 0x30 }, + 'afstatusmiddlehorizontal' => { 180 => 0xa, 405 => 0x23, 406 => 0x23 }, + 'afstatusnearleft' => { 401 => 0xe, 402 => 0x1a }, + 'afstatusnearright' => { 401 => 0xa, 402 => 0x16 }, + 'afstatusright' => { 180 => 0x31, 401 => 0x1c, 404 => 0x48, 405 => 0x31, 406 => 0x31 }, + 'afstatusrighthorizontal' => { 402 => 0x2e }, + 'afstatusrightvertical' => { 402 => 0x38 }, + 'afstatustop' => { 180 => 0xe, 404 => 0x40, 405 => 0x27, 406 => 0x27 }, + 'afstatustop-left' => { 180 => 0x10, 405 => 0x29, 406 => 0x29 }, + 'afstatustop-right' => { 180 => 0x4, 405 => 0x1d, 406 => 0x1d }, + 'afstatustopassist-left' => { 404 => 0x3e }, + 'afstatustopassist-right' => { 404 => 0x42 }, + 'afstatustophorizontal' => { 401 => 0x8, 402 => 0x14 }, + 'afstatustopvertical' => { 401 => 0x12, 402 => 0x1e }, + 'afstatusupper-left' => { 401 => 0x0, 404 => 0x20 }, + 'afstatusupper-lefthorizontal' => { 402 => 0x2 }, + 'afstatusupper-leftvertical' => { 402 => 0xc }, + 'afstatusupper-middle' => { 401 => 0x20, 402 => 0x20 }, + 'afstatusupper-right' => { 401 => 0x1a, 404 => 0x46 }, + 'afstatusupper-righthorizontal' => { 402 => 0x2a }, + 'afstatusupper-rightvertical' => { 402 => 0x36 }, + 'afstatusupperfarleft' => { 402 => 0x0 }, + 'afstatusupperfarright' => { 402 => 0x28 }, + 'afstatusviewfinder' => { 2 => 0x12 }, + 'aftracking' => { 420 => 0x2021 }, + 'aftrackingsensitivity' => { 2 => 0x2 }, + 'aftype' => { 400 => 0x2 }, + 'afwithshutter' => { 407 => 0x2a }, + 'aggregateissuenumber' => { 494 => 'aggregateIssueNumber' }, + 'aggregationtype' => { 494 => 'aggregationType' }, + 'agreement' => { 497 => 'agreement' }, + 'ah2greeninterpolationthreshold' => { 138 => 0xe4e }, + 'airplanemode' => { 229 => 0x624 }, + 'aiservocontinuousshooting' => { 83 => 0x15 }, + 'aiservofirstimage' => { 2 => 0x5 }, + 'aiservofirstimagepriority' => { 84 => 0x519 }, + 'aiservoimagepriority' => { 84 => 0x503 }, + 'aiservosecondimage' => { 2 => 0x6 }, + 'aiservosecondimagepriority' => { 84 => 0x51a }, + 'aiservotrackingmethod' => { 84 => 0x504 }, + 'aiservotrackingsensitivity' => { 83 => 0x14, 84 => 0x502 }, + 'aisubjecttrackingmode' => { 297 => 0x309 }, + 'album' => { 372 => ['albm',"\xa9alb"], 374 => 'album', 380 => ['albm',"\xa9alb"], 504 => 'album' }, + 'albumartist' => { 179 => 'WM/AlbumArtist', 372 => 'aART', 380 => 'albr' }, + 'albumcoverurl' => { 179 => 'WM/AlbumCoverURL' }, + 'albumtitle' => { 179 => 'WM/AlbumTitle' }, + 'albumtitleid' => { 372 => 'atID' }, + 'alreadyapplied' => { 478 => 'AlreadyApplied', 480 => 'AlreadyApplied' }, + 'alternatetitle' => { 494 => 'alternateTitle' }, + 'alternatetitlea-lang' => { 494 => [\'alternateTitle','alternateTitleA-lang'] }, + 'alternatetitlea-platform' => { 494 => [\'alternateTitle','alternateTitleA-platform'] }, + 'alternatetitletext' => { 494 => [\'alternateTitle','alternateTitleText'] }, + 'altitude' => { 196 => 0x6 }, + 'alttapename' => { 504 => 'altTapeName' }, + 'alttextaccessibility' => { 489 => 'AltTextAccessibility' }, + 'alttimecode' => { 504 => 'altTimecode' }, + 'alttimecodetimeformat' => { 504 => [\'altTimecode','altTimecodeTimeFormat'] }, + 'alttimecodetimevalue' => { 504 => [\'altTimecode','altTimecodeTimeValue'] }, + 'alttimecodevalue' => { 504 => [\'altTimecode','altTimecodeValue'] }, + 'ambienceselection' => { 4 => 0x1 }, + 'ambientinfrared' => { 383 => 0x5c }, + 'ambientlight' => { 383 => 0x5e }, + 'ambienttemperature' => { 119 => 0x9400, 381 => 0x14, 382 => 0x46, 383 => 0x50, 445 => 0x4, 485 => 'Temperature' }, + 'ambienttemperaturefahrenheit' => { 381 => 0x13, 382 => 0x44, 383 => 0x4e }, + 'analogbalance' => { 119 => 0xc627 }, + 'analogcaptureiso' => { 138 => 0x89e }, + 'analogisotable' => { 138 => 0x89d }, + 'androidversion' => { 374 => 'com.android.version' }, + 'angleadj' => { 103 => 0x10003, 109 => 0x8b }, + 'angleinforoll' => { 474 => 'AngleInfoRoll' }, + 'angleinfoyaw' => { 474 => 'AngleInfoYaw' }, + 'anti-blur' => { 420 => 0xb04b }, + 'antialiasstrength' => { 119 => 0xc632 }, + 'aperturelock' => { 280 => '38.2', 282 => '38.2', 283 => '38.2', 292 => '38.2', 293 => '38.2', 295 => 0xb8 }, + 'aperturemode' => { 380 => 'apmd' }, + 'aperturerange' => { 84 => 0x10d }, + 'apertureringuse' => { 336 => '1.4' }, + 'aperturesetting' => { 184 => 0x7, 407 => 0x30, 408 => 0x29, 409 => 0x1 }, + 'aperturevalue' => { 93 => 0x2, 119 => 0x9202, 302 => 0x1002, 364 => 0x401, 484 => 'ApertureValue' }, + 'appinfo' => { 458 => 'AppInfo' }, + 'appinfoapplication' => { 458 => [\'AppInfo','AppInfoApplication'] }, + 'appinfoitemuri' => { 458 => [\'AppInfo','AppInfoItemURI'] }, + 'appinfoversion' => { 458 => [\'AppInfo','AppInfoVersion'] }, + 'applekeywords' => { 306 => 'AAPL:Keywords' }, + 'applephotosvariationidentifier' => { 374 => 'apple.photos.variation-identifier' }, + 'applestoreaccount' => { 372 => 'apID' }, + 'applestoreaccounttype' => { 372 => 'akID' }, + 'applestorecatalogid' => { 372 => 'cnID' }, + 'applestorecountry' => { 372 => 'sfID' }, + 'applicationkeystring' => { 138 => 0x400 }, + 'applicationnotes' => { 119 => 0x2bc, 325 => 0x2bc }, + 'applicationrecordversion' => { 131 => 0x0 }, + 'applyshootingmeteringmode' => { 84 => 0x10e }, + 'approved' => { 486 => 'Approved' }, + 'approvedby' => { 486 => 'ApprovedBy' }, + 'approximatefnumber' => { 315 => 0x313, 322 => 0x3406 }, + 'approximatefocusdistance' => { 475 => 'ApproximateFocusDistance' }, + 'appversion' => { 488 => 'AppVersion' }, + 'aps-csizecapture' => { 439 => 0x114, 440 => [0x114,0x1eb,0x1ee,0x21a,0x21c] }, + 'aquahsl' => { 103 => 0x20914 }, + 'armidentifier' => { 132 => 0x78 }, + 'armversion' => { 132 => 0x7a }, + 'arranger' => { 372 => "\xa9arg", 380 => "\xa9arg" }, + 'arrangerkeywords' => { 380 => "\xa9ark" }, + 'artdirector' => { 372 => "\xa9ard" }, + 'artfilter' => { 297 => 0x529 }, + 'artfiltereffect' => { 297 => 0x52f }, + 'artist' => { 119 => 0x13b, 310 => 'Artist', 355 => 0x22e, 372 => "\xa9ART", 374 => 'artist', 380 => "\xa9ART", 500 => 'Artist', 504 => 'artist' }, + 'artmode' => { 113 => 0x301b }, + 'artmodeparameters' => { 113 => 0x310b }, + 'artwork' => { 374 => 'artwork' }, + 'artworkcircadatecreated' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOCircaDateCreated'] }, + 'artworkcontentdescription' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOContentDescription'] }, + 'artworkcontributiondescription' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOContributionDescription'] }, + 'artworkcopyrightnotice' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOCopyrightNotice'] }, + 'artworkcopyrightownerid' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOCurrentCopyrightOwnerId'] }, + 'artworkcopyrightownername' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOCurrentCopyrightOwnerName'] }, + 'artworkcreator' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOCreator'] }, + 'artworkcreatorid' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOCreatorId'] }, + 'artworkdatecreated' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAODateCreated'] }, + 'artworklicensorid' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOCurrentLicensorId'] }, + 'artworklicensorname' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOCurrentLicensorName'] }, + 'artworkorobject' => { 490 => 'ArtworkOrObject' }, + 'artworkphysicaldescription' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOPhysicalDescription'] }, + 'artworksource' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOSource'] }, + 'artworksourceinventoryno' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOSourceInvNo'] }, + 'artworksourceinvurl' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOSourceInvURL'] }, + 'artworkstyleperiod' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOStylePeriod'] }, + 'artworktitle' => { 490 => [\'ArtworkOrObject','ArtworkOrObjectAOTitle'] }, + 'aspectframe' => { 301 => 0x1113 }, + 'aspectratio' => { 5 => 0x0, 301 => 0x1112, 355 => 0x80, 407 => 0x55, 408 => 0x55, 409 => 0xa }, + 'assetid' => { 468 => 'AssetID' }, + 'asshoticcprofile' => { 119 => 0xc68f }, + 'asshotneutral' => { 119 => 0xc628 }, + 'asshotpreprofilematrix' => { 119 => 0xc690 }, + 'asshotprofilename' => { 119 => 0xc6f6 }, + 'asshotwhitexy' => { 119 => 0xc629 }, + 'assignbktbutton' => { 279 => '4.2', 280 => '16.1', 282 => '16.1', 283 => '16.1', 292 => '16.1', 293 => '16.1' }, + 'assignfuncbutton' => { 84 => 0x70b }, + 'assignmb-d17af-onbutton' => { 283 => '79.1' }, + 'assignmb-d17funcbutton' => { 283 => '67.1' }, + 'assignmb-d17funcbuttonplusdials' => { 283 => '68.1' }, + 'assignmb-d18af-onbutton' => { 293 => '79.1' }, + 'assignmb-d18funcbutton' => { 293 => '67.1' }, + 'assignmb-d18funcbuttonplusdials' => { 293 => '68.1' }, + 'assignmoviefunc1buttonplusdials' => { 282 => '75.1', 283 => '75.1', 293 => '75.1' }, + 'assignmoviefunc2button' => { 282 => '82.1', 283 => '82.1', 293 => '82.1' }, + 'assignmoviepreviewbuttonplusdials' => { 282 => '75.2', 283 => '75.2', 293 => '75.2' }, + 'assignmovierecordbutton' => { 280 => '43.2', 292 => '45.1', 295 => 0x9b }, + 'assignmovierecordbuttonplusdials' => { 282 => '45.1', 283 => '45.1', 293 => '45.1' }, + 'assignmoviesubselector' => { 282 => '74.1', 283 => '74.1', 293 => '74.1' }, + 'assignmoviesubselectorplusdials' => { 282 => '76.1', 283 => '76.1', 293 => '76.1' }, + 'assignremotefnbutton' => { 280 => '54.1', 292 => '51.1' }, + 'assistbuttonfunction' => { 82 => 0xd }, + 'atcaptureusercrop' => { 138 => 0x943 }, + 'attributionname' => { 476 => 'attributionName' }, + 'attributionurl' => { 476 => 'attributionURL' }, + 'audio' => { 320 => 0x20 }, + 'audiobitrate' => { 67 => 0x6c, 490 => 'audioBitRate' }, + 'audiobitratemode' => { 490 => 'audioBitRateMode' }, + 'audiobitspersample' => { 490 => 'audioBitsPerSample' }, + 'audiobutton' => { 295 => 0x17b }, + 'audiobuttonplaybackmode' => { 295 => 0x1b9 }, + 'audiochannelcount' => { 490 => 'audioChannelCount' }, + 'audiochannels' => { 67 => 0x70 }, + 'audiochanneltype' => { 504 => 'audioChannelType' }, + 'audiocompression' => { 84 => 0x816, 155 => 'Compression' }, + 'audiocompressor' => { 504 => 'audioCompressor' }, + 'audiodata' => { 460 => 'Data' }, + 'audioduration' => { 131 => 0x99 }, + 'audiogain' => { 374 => 'player.movie.audio.gain' }, + 'audiomimetype' => { 460 => 'Mime' }, + 'audiomoddate' => { 504 => 'audioModDate' }, + 'audiooutcue' => { 131 => 0x9a }, + 'audiosamplerate' => { 67 => 0x6e, 504 => 'audioSampleRate' }, + 'audiosampletype' => { 504 => 'audioSampleType' }, + 'audiosamplingrate' => { 131 => 0x97 }, + 'audiosamplingresolution' => { 131 => 0x98 }, + 'audiotype' => { 131 => 0x96 }, + 'author' => { 157 => 'Author', 306 => 'Author', 310 => 'Author', 371 => 'Author', 372 => ['auth',"\xa9aut"], 374 => 'author', 380 => 'auth', 473 => 'author', 491 => 'Author', 502 => 'Author' }, + 'authorsposition' => { 492 => 'AuthorsPosition' }, + 'authorurl' => { 179 => 'WM/AuthorURL' }, + 'autoafpointcolortracking' => { 84 => 0x51c }, + 'autoafpointseleositraf' => { 2 => 0xa }, + 'autoaperture' => { 346 => '0.1' }, + 'autobracket' => { 397 => 0x19 }, + 'autobracketing' => { 127 => 0x1100, 355 => 0x18, 387 => 0x1007 }, + 'autobracketingmode' => { 291 => '12.3' }, + 'autobracketingset' => { 291 => '12.1' }, + 'autobracketmodem' => { 279 => '21.2', 280 => '13.3', 282 => '13.2', 283 => '13.2', 288 => '26.2', 292 => '13.3', 293 => '13.2', 295 => 0x5f }, + 'autobracketorder' => { 184 => 0x43, 279 => '21.3', 280 => '13.2', 282 => '13.1', 283 => '13.1', 288 => '26.3', 289 => '12.2', 290 => '2.2', 291 => '12.2', 292 => '13.2', 293 => '13.1', 294 => '13.2', 295 => 0x61 }, + 'autobracketset' => { 279 => '21.1', 280 => '13.1', 284 => '11.1', 285 => '12.1', 286 => '12.1', 288 => '26.1', 289 => '12.1', 290 => '2.1', 292 => '13.1', 294 => '13.1' }, + 'autobrightness' => { 478 => 'AutoBrightness', 480 => 'AutoBrightness' }, + 'autocontrast' => { 478 => 'AutoContrast', 480 => 'AutoContrast' }, + 'autodistortioncontrol' => { 206 => 0x4, 228 => 0x143 }, + 'autodynamicrange' => { 127 => 0x140b }, + 'autoexposure' => { 478 => 'AutoExposure', 480 => 'AutoExposure' }, + 'autoexposurebracketing' => { 77 => 0x10 }, + 'autoflashisosensitivity' => { 282 => '38.5', 283 => '38.5', 293 => '38.5', 295 => 0x5b }, + 'autofocus' => { 300 => 0x209 }, + 'autofocusmoderestrictions' => { 295 => 0x107 }, + 'autofp' => { 290 => '7.3', 294 => '31.4' }, + 'autoiso' => { 77 => 0x1, 113 => 0x3008, 229 => 0x142, 281 => '1.1', 290 => '1.1' }, + 'autoisomax' => { 281 => '1.2', 290 => '1.2' }, + 'autoisominshutterspeed' => { 281 => '1.3', 290 => '1.3' }, + 'autolateralca' => { 478 => 'AutoLateralCA', 480 => 'AutoLateralCA' }, + 'autolightingoptimizer' => { 16 => 0xbe, 17 => 0xbf, 20 => 0xbf, 62 => 0x2, 84 => 0x204, 103 => 0x20500, 109 => 0x6f }, + 'autolightingoptimizeron' => { 103 => '0x20500.0', 109 => 0x6e }, + 'autoportraitframed' => { 420 => 0x2016 }, + 'autoredeye' => { 272 => 0xfe28a44f }, + 'autorotate' => { 77 => 0x1b }, + 'autoshadows' => { 478 => 'AutoShadows', 480 => 'AutoShadows' }, + 'autotone' => { 478 => 'AutoTone', 480 => 'AutoTone' }, + 'autotonedigest' => { 478 => 'AutoToneDigest', 480 => 'AutoToneDigest' }, + 'autotonedigestnosat' => { 478 => 'AutoToneDigestNoSat', 480 => 'AutoToneDigestNoSat' }, + 'autowhiteversion' => { 478 => 'AutoWhiteVersion', 480 => 'AutoWhiteVersion' }, + 'auxiliarylens' => { 226 => 0x82 }, + 'avaperturesetting' => { 336 => 0x13 }, + 'averageblacklevel' => { 45 => 0xe7, 47 => 0xfb, 48 => 0x114, 49 => 0x146 }, + 'averagelv' => { 187 => 0x38 }, + 'avsettingwithoutlens' => { 84 => 0x707 }, + 'azimuth' => { 165 => 'Azimuth' }, + 'babyage' => { 320 => [0x8010,0x33] }, + 'babyname' => { 320 => 0x66 }, + 'backgroundalpha' => { 499 => 'bgalpha' }, + 'balance' => { 374 => 'player.movie.audio.balance' }, + 'baseexposurecompensation' => { 336 => 0x15 }, + 'baseiso' => { 77 => 0x2, 97 => 0x101c, 138 => 0x903, 322 => 0x312a, 451 => 0x6 }, + 'baseisodaylight' => { 138 => 0x910 }, + 'baseisoflash' => { 138 => 0x913 }, + 'baseisofluorescent' => { 138 => 0x912 }, + 'baseisotungsten' => { 138 => 0x911 }, + 'baselineexposure' => { 119 => 0xc62a }, + 'baselineexposureoffset' => { 119 => 0xc7a5 }, + 'baselinenoise' => { 119 => 0xc62b }, + 'baselinesharpness' => { 119 => 0xc62c }, + 'baseurl' => { 502 => 'BaseURL' }, + 'bass' => { 374 => 'player.movie.audio.bass' }, + 'batterylevel' => { 320 => 0x38, 407 => 0x51, 411 => 0xc, 412 => 0x4, 413 => 0x4, 452 => 0x7 }, + 'batterylevelgrip1' => { 452 => 0x6 }, + 'batterylevelgrip2' => { 452 => 0x8 }, + 'batteryorder' => { 279 => '12.5', 288 => '13.2', 289 => '2.1', 292 => '3.1' }, + 'batterystate' => { 184 => 0x60, 407 => 0x50, 413 => 0x14 }, + 'batterytemperature' => { 411 => 0x1, 413 => 0x2, 452 => 0x5 }, + 'batterytype' => { 64 => 0x38, 383 => 0x66 }, + 'batteryunknown' => { 411 => 0x2, 413 => 0x0 }, + 'batteryvoltage' => { 138 => 0x408, 381 => 0x2a, 382 => 0x49, 383 => 0x62, 411 => 0x8 }, + 'batteryvoltage1' => { 413 => 0x6 }, + 'batteryvoltage2' => { 413 => 0x8 }, + 'batteryvoltageavg' => { 383 => 0x64 }, + 'bayergreensplit' => { 119 => 0xc62d }, + 'bayerpattern' => { 137 => 0xf902, 188 => 0x17 }, + 'beatsperminute' => { 372 => 'tmpo' }, + 'beatspliceparams' => { 504 => 'beatSpliceParams' }, + 'beatspliceparamsriseindecibel' => { 504 => [\'beatSpliceParams','beatSpliceParamsRiseInDecibel'] }, + 'beatspliceparamsriseintimeduration' => { 504 => [\'beatSpliceParams','beatSpliceParamsRiseInTimeDuration'] }, + 'beatspliceparamsriseintimedurationscale' => { 504 => [\'beatSpliceParams','beatSpliceParamsRiseInTimeDurationScale'] }, + 'beatspliceparamsriseintimedurationvalue' => { 504 => [\'beatSpliceParams','beatSpliceParamsRiseInTimeDurationValue'] }, + 'beatspliceparamsusefilebeatsmarker' => { 504 => [\'beatSpliceParams','beatSpliceParamsUseFileBeatsMarker'] }, + 'beep' => { 279 => '13.1', 280 => '5.4', 281 => '0.1', 284 => '2.1', 285 => '3.1', 286 => '3.1', 288 => '10.1', 290 => '0.1', 292 => '5.5', 294 => '4.1' }, + 'beeppitch' => { 289 => '3.1' }, + 'beepvolume' => { 289 => '4.5' }, + 'bestqualityscale' => { 119 => 0xc65c }, + 'bestshotmode' => { 113 => 0x3007 }, + 'bitdepth' => { 162 => 'BitDepth', 188 => 0x11, 237 => 0x41 }, + 'bitspercomponent' => { 133 => 0x87 }, + 'bitspersample' => { 119 => 0x102, 325 => 0xa, 500 => 'BitsPerSample' }, + 'blackacquirerows' => { 138 => 0x18ba }, + 'blacklevel' => { 119 => 0xc61a, 204 => 0x20, 226 => 0x3d, 302 => [0x401,0x1012], 364 => 0x21d, 427 => [0x7300,0x7310] }, + 'blacklevel2' => { 301 => 0x600, 305 => 0x600 }, + 'blacklevelblue' => { 325 => 0x1e }, + 'blacklevelbottom' => { 138 => 0x3f0 }, + 'blackleveldata' => { 364 => 0x223 }, + 'blackleveldeltah' => { 119 => 0xc61b }, + 'blackleveldeltav' => { 119 => 0xc61c }, + 'blacklevelgreen' => { 325 => 0x1d }, + 'blacklevelred' => { 325 => 0x1c }, + 'blacklevelrepeatdim' => { 119 => 0xc619 }, + 'blacklevelrough' => { 138 => 0x40e }, + 'blacklevelroughafter' => { 138 => 0x416 }, + 'blacklevels' => { 35 => 0x1d }, + 'blackleveltop' => { 138 => 0x3ef }, + 'blackpoint' => { 355 => 0x200 }, + 'blacks2012' => { 478 => 'Blacks2012', 480 => 'Blacks2012' }, + 'blacksadj' => { 455 => 0x9018 }, + 'bleachbypasstoning' => { 355 => 0x7f }, + 'blockshotafresponse' => { 282 => '1.5', 283 => '1.5', 293 => '1.5', 295 => 0x7 }, + 'blogtitle' => { 494 => 'blogTitle' }, + 'blogurl' => { 494 => 'blogURL' }, + 'bluebalance' => { 302 => 0x1018, 325 => 0x12, 355 => 0x1b }, + 'bluecurvelimits' => { 108 => 0x1fe }, + 'bluecurvepoints' => { 107 => 0x79, 108 => 0x1d4 }, + 'bluehsl' => { 103 => 0x20915 }, + 'bluehue' => { 478 => 'BlueHue', 480 => 'BlueHue' }, + 'bluesaturation' => { 478 => 'BlueSaturation', 480 => 'BlueSaturation' }, + 'bluratinfinity' => { 464 => 'BlurAtInfinity' }, + 'blurcontrol' => { 355 => 0x82 }, + 'blurwarning' => { 127 => 0x1300 }, + 'bodybatteryadload' => { 334 => 0x3 }, + 'bodybatteryadnoload' => { 334 => 0x2 }, + 'bodybatterystate' => { 334 => '1.1' }, + 'bodybatteryvoltage1' => { 334 => 0x2 }, + 'bodybatteryvoltage2' => { 334 => 0x4 }, + 'bodybatteryvoltage3' => { 334 => 0x6 }, + 'bodybatteryvoltage4' => { 334 => 0x8 }, + 'bodyfirmware' => { 388 => 0x0 }, + 'bodyfirmwareversion' => { 298 => 0x104, 299 => 0x100, 302 => 0x104 }, + 'bodyserialnumber' => { 388 => 0x10 }, + 'bookedition' => { 494 => 'bookEdition' }, + 'bootloaderversion' => { 382 => 0x26 }, + 'bracketincrement' => { 229 => 0x21a }, + 'bracketmode' => { 57 => 0x3 }, + 'bracketprogram' => { 229 => 0x218 }, + 'bracketsequence' => { 113 => 0x301d }, + 'bracketset' => { 229 => 0x216 }, + 'bracketsettings' => { 320 => 0x45 }, + 'bracketshotnumber' => { 57 => 0x5, 336 => 0x9, 418 => 0x2b }, + 'bracketshotnumber2' => { 418 => 0x2d }, + 'bracketstep' => { 181 => 0xe }, + 'bracketvalue' => { 57 => 0x4 }, + 'brightness' => { 119 => 0xfe53, 156 => 'Brightness', 176 => 'Brightness', 181 => 0x2c, 231 => 0x34, 232 => 0x39, 233 => 0x41, 374 => 'player.movie.visual.brightness', 381 => 0x25, 383 => 0x54, 407 => 0x22, 420 => 0x2007, 478 => 'Brightness', 480 => 'Brightness' }, + 'brightnessadj' => { 108 => 0x114, 265 => 0x0, 275 => 0x2d, 455 => 0x8018 }, + 'brightnessvalue' => { 119 => 0x9203, 187 => [0x691,0x49c3], 302 => 0x1003, 425 => 0x1e, 429 => 0x1140, 430 => 0x1140, 431 => 0x111c, 432 => 0x1198, 433 => 0x1174, 434 => 0x102c, 435 => 0x224, 436 => 0x224, 437 => 0x219, 484 => 'BrightnessValue' }, + 'buildnumber' => { 191 => 0x5500 }, + 'bulbduration' => { 77 => 0x18 }, + 'burstcount' => { 138 => 0x40d }, + 'burstid' => { 461 => 'BurstID' }, + 'burstmode' => { 140 => 0xa, 320 => 0x2a }, + 'burstmode2' => { 140 => 0x18 }, + 'burstprimary' => { 461 => 'BurstPrimary' }, + 'burstshot' => { 397 => 0x34 }, + 'burstspeed' => { 320 => 0x77 }, + 'burstuuid' => { 1 => 0xb }, + 'buttonfunctioncontroloff' => { 84 => 0x70a }, + 'bwadjustment' => { 127 => 0x1049 }, + 'bwfilter' => { 181 => 0x2a, 189 => 0x39 }, + 'bwmode' => { 302 => 0x203 }, + 'by-line' => { 131 => 0x50 }, + 'by-linetitle' => { 131 => 0x55 }, + 'bytecount' => { 494 => 'byteCount' }, + 'c14configuration' => { 138 => 0x1964 }, + 'cacheversion' => { 119 => 0xc7aa }, + 'calibratedfocallength' => { 116 => 'CalibratedFocalLength' }, + 'calibratedopticalcenterx' => { 116 => 'CalibratedOpticalCenterX' }, + 'calibratedopticalcentery' => { 116 => 'CalibratedOpticalCenterY' }, + 'calibration' => { 397 => [0x24,0x30] }, + 'calibrationhistory' => { 138 => 0x9c9 }, + 'calibrationilluminant1' => { 119 => 0xc65a }, + 'calibrationilluminant2' => { 119 => 0xc65b }, + 'calibrationilluminant3' => { 119 => 0xcd31 }, + 'calibrationversion' => { 138 => 0x9c6 }, + 'callforimage' => { 468 => 'CallForImage' }, + 'camera' => { 458 => [\'Cameras','CamerasCamera'] }, + 'cameraangle' => { 380 => 'angl', 504 => 'cameraAngle' }, + 'cameraappinfo' => { 458 => [\'Cameras','CamerasCameraAppInfo'] }, + 'cameraappinfoapplication' => { 458 => [\'Cameras','CamerasCameraAppInfoApplication'] }, + 'cameraappinfoitemuri' => { 458 => [\'Cameras','CamerasCameraAppInfoItemURI'] }, + 'cameraappinfoversion' => { 458 => [\'Cameras','CamerasCameraAppInfoVersion'] }, + 'cameraburstid' => { 462 => 'CameraBurstID' }, + 'cameracalibration' => { 397 => 0x11f }, + 'cameracalibration1' => { 119 => 0xc623 }, + 'cameracalibration2' => { 119 => 0xc624 }, + 'cameracalibration3' => { 119 => 0xcd32 }, + 'cameracalibrationsig' => { 119 => 0xc6f3 }, + 'cameracolorcalibration01' => { 36 => 0x0, 37 => 0x0 }, + 'cameracolorcalibration02' => { 36 => 0x4, 37 => 0x5 }, + 'cameracolorcalibration03' => { 36 => 0x8, 37 => 0xa }, + 'cameracolorcalibration04' => { 36 => 0xc, 37 => 0xf }, + 'cameracolorcalibration05' => { 36 => 0x10, 37 => 0x14 }, + 'cameracolorcalibration06' => { 36 => 0x14, 37 => 0x19 }, + 'cameracolorcalibration07' => { 36 => 0x18, 37 => 0x1e }, + 'cameracolorcalibration08' => { 36 => 0x1c, 37 => 0x23 }, + 'cameracolorcalibration09' => { 36 => 0x20, 37 => 0x28 }, + 'cameracolorcalibration10' => { 36 => 0x24, 37 => 0x2d }, + 'cameracolorcalibration11' => { 36 => 0x28, 37 => 0x32 }, + 'cameracolorcalibration12' => { 36 => 0x2c, 37 => 0x37 }, + 'cameracolorcalibration13' => { 36 => 0x30, 37 => 0x3c }, + 'cameracolorcalibration14' => { 36 => 0x34, 37 => 0x41 }, + 'cameracolorcalibration15' => { 36 => 0x38, 37 => 0x46 }, + 'cameradepthmap' => { 458 => [\'Cameras','CamerasCameraDepthMap'] }, + 'cameradepthmapconfidenceuri' => { 458 => [\'Cameras','CamerasCameraDepthMapConfidenceURI'] }, + 'cameradepthmapdepthuri' => { 458 => [\'Cameras','CamerasCameraDepthMapDepthURI'] }, + 'cameradepthmapfar' => { 458 => [\'Cameras','CamerasCameraDepthMapFar'] }, + 'cameradepthmapfocaltable' => { 458 => [\'Cameras','CamerasCameraDepthMapFocalTable'] }, + 'cameradepthmapfocaltableentrycount' => { 458 => [\'Cameras','CamerasCameraDepthMapFocalTableEntryCount'] }, + 'cameradepthmapformat' => { 458 => [\'Cameras','CamerasCameraDepthMapFormat'] }, + 'cameradepthmapitemsemantic' => { 458 => [\'Cameras','CamerasCameraDepthMapItemSemantic'] }, + 'cameradepthmapmeasuretype' => { 458 => [\'Cameras','CamerasCameraDepthMapMeasureType'] }, + 'cameradepthmapnear' => { 458 => [\'Cameras','CamerasCameraDepthMapNear'] }, + 'cameradepthmapsoftware' => { 458 => [\'Cameras','CamerasCameraDepthMapSoftware'] }, + 'cameradepthmapunits' => { 458 => [\'Cameras','CamerasCameraDepthMapUnits'] }, + 'cameradirection' => { 374 => 'direction.facing' }, + 'camerae-mountversion' => { 454 => 0xb }, + 'cameraelevationangle' => { 119 => 0x9405, 485 => 'CameraElevationAngle' }, + 'camerafilename' => { 468 => 'CameraFilename' }, + 'cameraid' => { 302 => 0x209, 380 => 'cmid', 396 => 0x209 }, + 'cameraidentifier' => { 374 => 'camera.identifier' }, + 'cameraimage' => { 458 => [\'Cameras','CamerasCameraImage'] }, + 'cameraimageitemsemantic' => { 458 => [\'Cameras','CamerasCameraImageItemSemantic'] }, + 'cameraimageitemuri' => { 458 => [\'Cameras','CamerasCameraImageItemURI'] }, + 'cameraimagingmodel' => { 458 => [\'Cameras','CamerasCameraImagingModel'] }, + 'cameraimagingmodeldistortion' => { 458 => [\'Cameras','CamerasCameraImagingModelDistortion'] }, + 'cameraimagingmodeldistortioncount' => { 458 => [\'Cameras','CamerasCameraImagingModelDistortionCount'] }, + 'cameraimagingmodelfocallengthx' => { 458 => [\'Cameras','CamerasCameraImagingModelFocalLengthX'] }, + 'cameraimagingmodelfocallengthy' => { 458 => [\'Cameras','CamerasCameraImagingModelFocalLengthY'] }, + 'cameraimagingmodelimageheight' => { 458 => [\'Cameras','CamerasCameraImagingModelImageHeight'] }, + 'cameraimagingmodelimagewidth' => { 458 => [\'Cameras','CamerasCameraImagingModelImageWidth'] }, + 'cameraimagingmodelpixelaspectratio' => { 458 => [\'Cameras','CamerasCameraImagingModelPixelAspectRatio'] }, + 'cameraimagingmodelprincipalpointx' => { 458 => [\'Cameras','CamerasCameraImagingModelPrincipalPointX'] }, + 'cameraimagingmodelprincipalpointy' => { 458 => [\'Cameras','CamerasCameraImagingModelPrincipalPointY'] }, + 'cameraimagingmodelskew' => { 458 => [\'Cameras','CamerasCameraImagingModelSkew'] }, + 'cameraiso' => { 34 => 0x10 }, + 'cameralabel' => { 119 => 0xc7a1, 504 => 'cameraLabel' }, + 'cameralightestimate' => { 458 => [\'Cameras','CamerasCameraLightEstimate'] }, + 'cameralightestimatecolorcorrectionb' => { 458 => [\'Cameras','CamerasCameraLightEstimateColorCorrectionB'] }, + 'cameralightestimatecolorcorrectiong' => { 458 => [\'Cameras','CamerasCameraLightEstimateColorCorrectionG'] }, + 'cameralightestimatecolorcorrectionr' => { 458 => [\'Cameras','CamerasCameraLightEstimateColorCorrectionR'] }, + 'cameralightestimatepixelintensity' => { 458 => [\'Cameras','CamerasCameraLightEstimatePixelIntensity'] }, + 'cameramakemodel' => { 468 => 'CameraMakeModel' }, + 'cameramodel' => { 364 => 0x410, 504 => 'cameraModel' }, + 'cameramodelid' => { 176 => 'CameraModelID' }, + 'cameramodelrestriction' => { 478 => 'CameraModelRestriction', 480 => 'CameraModelRestriction' }, + 'cameramotion' => { 374 => 'direction.motion' }, + 'cameramove' => { 504 => 'cameraMove' }, + 'cameraorientation' => { 7 => 0x30, 9 => 0x7d, 11 => 0x30, 13 => 0x35, 14 => 0x30, 15 => 0x30, 16 => 0x31, 17 => 0x31, 18 => 0x35, 19 => 0x27, 20 => 0x31, 21 => 0x7d, 22 => 0x38, 23 => [0x36,0x3a], 24 => 0x7d, 25 => 0x83, 26 => 0x84, 27 => 0x96, 28 => 0x35, 29 => 0x96, 320 => 0x8f, 359 => 0x1, 364 => 0x100, 413 => [0x16,0x18], 442 => 0x28, 443 => 0x24, 444 => 0x29 }, + 'cameraowner' => { 141 => 0xc353 }, + 'cameraparameters' => { 302 => 0x2050 }, + 'camerapicturestyle' => { 28 => 0xaf }, + 'camerapitch' => { 115 => 0x9, 380 => "\xa9gpt" }, + 'camerapointcloud' => { 458 => [\'Cameras','CamerasCameraPointCloud'] }, + 'camerapointcloudmetric' => { 458 => [\'Cameras','CamerasCameraPointCloudMetric'] }, + 'camerapointcloudpointcloud' => { 458 => [\'Cameras','CamerasCameraPointCloudPointCloud'] }, + 'camerapointcloudpoints' => { 458 => [\'Cameras','CamerasCameraPointCloudPoints'] }, + 'camerapose' => { 458 => [\'Cameras','CamerasCameraPose'] }, + 'cameraposepositionx' => { 458 => [\'Cameras','CamerasCameraPosePositionX'] }, + 'cameraposepositiony' => { 458 => [\'Cameras','CamerasCameraPosePositionY'] }, + 'cameraposepositionz' => { 458 => [\'Cameras','CamerasCameraPosePositionZ'] }, + 'cameraposerotationw' => { 458 => [\'Cameras','CamerasCameraPoseRotationW'] }, + 'cameraposerotationx' => { 458 => [\'Cameras','CamerasCameraPoseRotationX'] }, + 'cameraposerotationy' => { 458 => [\'Cameras','CamerasCameraPoseRotationY'] }, + 'cameraposerotationz' => { 458 => [\'Cameras','CamerasCameraPoseRotationZ'] }, + 'cameraposetimestamp' => { 458 => [\'Cameras','CamerasCameraPoseTimestamp'] }, + 'cameraprofile' => { 478 => 'CameraProfile', 480 => 'CameraProfile' }, + 'cameraprofiledigest' => { 478 => 'CameraProfileDigest', 480 => 'CameraProfileDigest' }, + 'camerarawcolortone' => { 109 => 0xe1 }, + 'camerarawcontrast' => { 109 => 0xe3 }, + 'camerarawhighlightpoint' => { 109 => 0xe6 }, + 'camerarawlinear' => { 109 => 0xe4 }, + 'camerarawoutputhighlightpoint' => { 109 => 0xe8 }, + 'camerarawoutputshadowpoint' => { 109 => 0xe9 }, + 'camerarawsaturation' => { 109 => 0xe2 }, + 'camerarawshadowpoint' => { 109 => 0xe7 }, + 'camerarawsharpness' => { 109 => 0xe5 }, + 'cameraroll' => { 115 => 0xb, 380 => "\xa9grl" }, + 'cameras' => { 458 => 'Cameras' }, + 'cameraserialnumber' => { 119 => 0xc62f, 178 => 'CameraSerialNumber', 468 => 'CameraSerialNumber' }, + 'camerasettingsversion' => { 297 => 0x0 }, + 'cameratemperature' => { 7 => 0x18, 9 => 0x1b, 11 => 0x18, 13 => 0x19, 14 => 0x18, 15 => 0x18, 16 => 0x19, 17 => 0x19, 18 => 0x19, 19 => 0x17, 20 => 0x19, 21 => 0x1b, 22 => 0x19, 23 => 0x19, 24 => 0x1b, 25 => 0x1b, 26 => 0x1b, 27 => 0x1b, 28 => 0x19, 29 => 0x1b, 30 => [0x87,0x91], 31 => [0x99,0x9f,0xa4,0xa8,0x105], 33 => ['-3',0x64,0x47,0x53,0x5b,0x5c], 77 => 0xc, 138 => 0x406, 301 => 0x1306, 315 => 0x320, 322 => 0x3402, 355 => 0x47, 394 => 0x43, 446 => 0x5 }, + 'cameratemperature4' => { 360 => 0x14 }, + 'cameratemperature5' => { 360 => 0x16 }, + 'cameratemperaturerangemax' => { 121 => 0x5 }, + 'cameratemperaturerangemin' => { 121 => 0x6 }, + 'cameratrait' => { 458 => [\'Cameras','CamerasCameraTrait'] }, + 'cameratype' => { 77 => 0x1a, 302 => 0x207 }, + 'cameratype2' => { 298 => 0x100 }, + 'cameravendorinfo' => { 458 => [\'Cameras','CamerasCameraVendorInfo'] }, + 'cameravendorinfomanufacturer' => { 458 => [\'Cameras','CamerasCameraVendorInfoManufacturer'] }, + 'cameravendorinfomodel' => { 458 => [\'Cameras','CamerasCameraVendorInfoModel'] }, + 'cameravendorinfonotes' => { 458 => [\'Cameras','CamerasCameraVendorInfoNotes'] }, + 'camerayaw' => { 115 => 0xa, 380 => "\xa9gyw" }, + 'camreverse' => { 116 => 'CamReverse' }, + 'canondr4' => { 120 => 'CanonDR4' }, + 'canonexposuremode' => { 34 => 0x14 }, + 'canonfiledescription' => { 97 => 0x805 }, + 'canonfilelength' => { 64 => 0xe }, + 'canonfirmwareversion' => { 64 => 0x7, 97 => 0x80b }, + 'canonflashinfo' => { 97 => 0x1028 }, + 'canonflashmode' => { 34 => 0x4 }, + 'canonimagesize' => { 10 => 0x39, 34 => 0xa }, + 'canonimagetype' => { 64 => 0x6, 97 => 0x815 }, + 'canonlogversion' => { 63 => 0xb }, + 'canonmodelid' => { 64 => 0x10, 97 => 0x1834 }, + 'canonvrd' => { 120 => 'CanonVRD' }, + 'caption' => { 473 => 'caption' }, + 'caption-abstract' => { 131 => 0x78 }, + 'captionsauthornames' => { 483 => 'CaptionsAuthorNames' }, + 'captionsdatetimestamps' => { 483 => 'CaptionsDateTimeStamps' }, + 'captionwriter' => { 492 => 'CaptionWriter' }, + 'captureframerate' => { 113 => 0x4001 }, + 'captureheightnormal' => { 138 => 0x1839 }, + 'capturelook' => { 138 => 0xc48 }, + 'capturemode' => { 374 => 'com.apple.photos.captureMode' }, + 'capturesoftware' => { 466 => 'CaptureSoftware' }, + 'capturewidthnormal' => { 138 => 0x1838 }, + 'capturewidthtest' => { 138 => 0x1842 }, + 'cardshutterlock' => { 184 => 0x49 }, + 'casioimagesize' => { 113 => 0x9 }, + 'catalogsets' => { 131 => 0xff, 459 => 'CatalogSets', 471 => 'CatalogSets' }, + 'categories' => { 64 => 0x23, 473 => 'categories' }, + 'category' => { 131 => 0xf, 179 => 'WM/Category', 296 => 0x30, 372 => 'catg', 492 => 'Category' }, + 'cbcrgain' => { 394 => 0xa036 }, + 'cbcrgaindefault' => { 394 => 0xa035 }, + 'cbcrmatrix' => { 394 => 0xa034 }, + 'cbcrmatrixdefault' => { 394 => 0xa033 }, + 'ccdboardversion' => { 315 => 0x331 }, + 'ccdscanmode' => { 302 => 0x1039 }, + 'ccdsensitivity' => { 262 => 0x6 }, + 'ccdversion' => { 315 => 0x330 }, + 'cellglobalid' => { 477 => 'cgi' }, + 'celllength' => { 119 => 0x109 }, + 'cellr' => { 477 => 'r' }, + 'celltowerid' => { 477 => 'cellid' }, + 'cellwidth' => { 119 => 0x108 }, + 'centerafarea' => { 290 => '15.1' }, + 'centerfocuspoint' => { 294 => '2.2' }, + 'centerpixel' => { 138 => 0x40c }, + 'centerweightedareasize' => { 279 => '7.1', 280 => '8.1', 282 => '8.1', 283 => '8.1', 287 => '7.1', 288 => '5.1', 289 => '7.1', 290 => '6.3', 292 => '8.1', 293 => '8.1', 294 => '8.1', 295 => 0x1f }, + 'certificate' => { 508 => 'Certificate' }, + 'cfainterpolationalgorithm' => { 138 => 0xe60 }, + 'cfainterpolationmetric' => { 138 => 0xe61 }, + 'cfaoffsetcols' => { 138 => 0xc71 }, + 'cfaoffsetrows' => { 138 => 0xc6f }, + 'cfapattern' => { 119 => 0xa302, 325 => 0x9, 484 => 'CFAPattern' }, + 'cfapattern2' => { 119 => 0x828e }, + 'cfapatterncolumns' => { 484 => [\'CFAPattern','CFAPatternColumns'] }, + 'cfapatternrows' => { 484 => [\'CFAPattern','CFAPatternRows'] }, + 'cfapatternvalues' => { 484 => [\'CFAPattern','CFAPatternValues'] }, + 'cfarepeatpatterndim' => { 119 => 0x828d }, + 'cfazipperfixthreshold' => { 138 => 0xe62 }, + 'channel' => { 494 => 'channel' }, + 'channela-lang' => { 494 => [\'channel','channelA-lang'] }, + 'channelchannel' => { 494 => [\'channel','channelChannel'] }, + 'channels' => { 155 => 'Channels' }, + 'channelsubchannel1' => { 494 => [\'channel','channelSubchannel1'] }, + 'channelsubchannel2' => { 494 => [\'channel','channelSubchannel2'] }, + 'channelsubchannel3' => { 494 => [\'channel','channelSubchannel3'] }, + 'channelsubchannel4' => { 494 => [\'channel','channelSubchannel4'] }, + 'chapterlist' => { 380 => 'chpl' }, + 'checkmark' => { 103 => 0x10101, 108 => 0x26a }, + 'checkmark2' => { 109 => 0x8e }, + 'childfontfiles' => { 509 => [\'Fonts','FontsChildFontFiles'] }, + 'chmodeshootingspeed' => { 279 => '10.3', 280 => '11.2', 295 => 0x10b }, + 'chromablurradius' => { 119 => 0xc631 }, + 'chromanoisecolorspace' => { 138 => 0xe6d }, + 'chromanoiseedgemapthresh' => { 138 => 0xe6c }, + 'chromanoisehighfthresh' => { 138 => 0xe6a }, + 'chromanoiselowfthresh' => { 138 => 0xe6b }, + 'chromaticaberration' => { 103 => 0x20703, 109 => 0x66, 394 => 0xa051 }, + 'chromaticaberrationb' => { 478 => 'ChromaticAberrationB', 480 => 'ChromaticAberrationB' }, + 'chromaticaberrationblue' => { 103 => 0x20708, 109 => 0x6b }, + 'chromaticaberrationcorr' => { 79 => [0x4,0x5] }, + 'chromaticaberrationcorrection' => { 119 => 0x7034, 345 => 0x1, 455 => 0x900d }, + 'chromaticaberrationcorrparams' => { 119 => 0x7035, 450 => 0x66a, 451 => [0x37c,0x384,0x39c,0x3b0,0x3b8] }, + 'chromaticaberrationon' => { 103 => '0x20703.0', 109 => 0x62 }, + 'chromaticaberrationr' => { 478 => 'ChromaticAberrationR', 480 => 'ChromaticAberrationR' }, + 'chromaticaberrationred' => { 103 => 0x20707, 109 => 0x6a }, + 'chromaticaberrationsetting' => { 80 => 0x6 }, + 'chrominancenoisereduction' => { 103 => 0x20601, 109 => 0x5e, 397 => 0x1a }, + 'chrominancenr_tiff_jpeg' => { 109 => 0x60 }, + 'circadatecreated' => { 490 => 'CircaDateCreated' }, + 'circgradbasedcorractive' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionActive'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionActive'] }, + 'circgradbasedcorramount' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionAmount'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionAmount'] }, + 'circgradbasedcorrblacks2012' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalBlacks2012'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalBlacks2012'] }, + 'circgradbasedcorrbrightness' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalBrightness'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalBrightness'] }, + 'circgradbasedcorrclarity' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalClarity'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalClarity'] }, + 'circgradbasedcorrclarity2012' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalClarity2012'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalClarity2012'] }, + 'circgradbasedcorrcontrast' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalContrast'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalContrast'] }, + 'circgradbasedcorrcontrast2012' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalContrast2012'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalContrast2012'] }, + 'circgradbasedcorrcorrectionname' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionName'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionName'] }, + 'circgradbasedcorrcorrectionsyncid' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionSyncID'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionSyncID'] }, + 'circgradbasedcorrdefringe' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalDefringe'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalDefringe'] }, + 'circgradbasedcorrdehaze' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalDehaze'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalDehaze'] }, + 'circgradbasedcorrexposure' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalExposure'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalExposure'] }, + 'circgradbasedcorrexposure2012' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalExposure2012'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalExposure2012'] }, + 'circgradbasedcorrhighlights2012' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalHighlights2012'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalHighlights2012'] }, + 'circgradbasedcorrhue' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalHue'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalHue'] }, + 'circgradbasedcorrluminancenoise' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalLuminanceNoise'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalLuminanceNoise'] }, + 'circgradbasedcorrmaskalpha' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksAlpha'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksAlpha'] }, + 'circgradbasedcorrmaskangle' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksAngle'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksAngle'] }, + 'circgradbasedcorrmaskbottom' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksBottom'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksBottom'] }, + 'circgradbasedcorrmaskcentervalue' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCenterValue'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCenterValue'] }, + 'circgradbasedcorrmaskcenterweight' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCenterWeight'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCenterWeight'] }, + 'circgradbasedcorrmaskdabs' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksDabs'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksDabs'] }, + 'circgradbasedcorrmaskfeather' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFeather'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFeather'] }, + 'circgradbasedcorrmaskflipped' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFlipped'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFlipped'] }, + 'circgradbasedcorrmaskflow' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFlow'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFlow'] }, + 'circgradbasedcorrmaskfullx' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFullX'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFullX'] }, + 'circgradbasedcorrmaskfully' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFullY'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksFullY'] }, + 'circgradbasedcorrmaskinputdigest' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksInputDigest'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksInputDigest'] }, + 'circgradbasedcorrmaskleft' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksLeft'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksLeft'] }, + 'circgradbasedcorrmaskmaskactive' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskActive'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskActive'] }, + 'circgradbasedcorrmaskmaskblendmode' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskBlendMode'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskBlendMode'] }, + 'circgradbasedcorrmaskmaskdigest' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskDigest'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskDigest'] }, + 'circgradbasedcorrmaskmaskinverted' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskInverted'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskInverted'] }, + 'circgradbasedcorrmaskmaskname' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskName'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskName'] }, + 'circgradbasedcorrmaskmasks' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasks'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasks'] }, + 'circgradbasedcorrmaskmasksalpha' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksAlpha'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksAlpha'] }, + 'circgradbasedcorrmaskmasksangle' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksAngle'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksAngle'] }, + 'circgradbasedcorrmaskmasksbottom' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksBottom'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksBottom'] }, + 'circgradbasedcorrmaskmaskscentervalue' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksCenterValue'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksCenterValue'] }, + 'circgradbasedcorrmaskmaskscenterweight' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksCenterWeight'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksCenterWeight'] }, + 'circgradbasedcorrmaskmasksdabs' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksDabs'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksDabs'] }, + 'circgradbasedcorrmaskmasksfeather' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksFeather'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksFeather'] }, + 'circgradbasedcorrmaskmasksflipped' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksFlipped'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksFlipped'] }, + 'circgradbasedcorrmaskmasksflow' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksFlow'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksFlow'] }, + 'circgradbasedcorrmaskmasksfullx' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksFullX'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksFullX'] }, + 'circgradbasedcorrmaskmasksfully' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksFullY'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksFullY'] }, + 'circgradbasedcorrmaskmasksinputdigest' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksInputDigest'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksInputDigest'] }, + 'circgradbasedcorrmaskmasksleft' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksLeft'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksLeft'] }, + 'circgradbasedcorrmaskmasksmaskactive' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskActive'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskActive'] }, + 'circgradbasedcorrmaskmasksmaskblendmode' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskBlendMode'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskBlendMode'] }, + 'circgradbasedcorrmaskmasksmaskdigest' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskDigest'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskDigest'] }, + 'circgradbasedcorrmaskmasksmaskinverted' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskInverted'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskInverted'] }, + 'circgradbasedcorrmaskmasksmaskname' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskName'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskName'] }, + 'circgradbasedcorrmaskmasksmasksubtype' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskSubType'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskSubType'] }, + 'circgradbasedcorrmaskmasksmasksyncid' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskSyncID'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskSyncID'] }, + 'circgradbasedcorrmaskmasksmaskversion' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskVersion'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskVersion'] }, + 'circgradbasedcorrmaskmasksmidpoint' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMidpoint'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMidpoint'] }, + 'circgradbasedcorrmaskmasksorigin' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksOrigin'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksOrigin'] }, + 'circgradbasedcorrmaskmasksperimetervalue' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksPerimeterValue'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksPerimeterValue'] }, + 'circgradbasedcorrmaskmasksradius' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksRadius'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksRadius'] }, + 'circgradbasedcorrmaskmasksreferencepoint' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksReferencePoint'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksReferencePoint'] }, + 'circgradbasedcorrmaskmasksright' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksRight'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksRight'] }, + 'circgradbasedcorrmaskmasksroundness' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksRoundness'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksRoundness'] }, + 'circgradbasedcorrmaskmaskssizex' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksSizeX'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksSizeX'] }, + 'circgradbasedcorrmaskmaskssizey' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksSizeY'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksSizeY'] }, + 'circgradbasedcorrmaskmaskstop' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksTop'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksTop'] }, + 'circgradbasedcorrmaskmasksubtype' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskSubType'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskSubType'] }, + 'circgradbasedcorrmaskmasksvalue' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskValue'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksMaskValue'] }, + 'circgradbasedcorrmaskmasksversion' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksVersion'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksVersion'] }, + 'circgradbasedcorrmaskmaskswhat' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksWhat'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksWhat'] }, + 'circgradbasedcorrmaskmaskswholeimagearea' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksWholeImageArea'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksWholeImageArea'] }, + 'circgradbasedcorrmaskmasksx' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksX'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksX'] }, + 'circgradbasedcorrmaskmasksy' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksY'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksY'] }, + 'circgradbasedcorrmaskmasksyncid' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskSyncID'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskSyncID'] }, + 'circgradbasedcorrmaskmaskszerox' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksZeroX'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksZeroX'] }, + 'circgradbasedcorrmaskmaskszeroy' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksZeroY'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMasksZeroY'] }, + 'circgradbasedcorrmaskmaskversion' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskVersion'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskVersion'] }, + 'circgradbasedcorrmaskmidpoint' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMidpoint'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMidpoint'] }, + 'circgradbasedcorrmaskorigin' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksOrigin'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksOrigin'] }, + 'circgradbasedcorrmaskperimetervalue' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksPerimeterValue'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksPerimeterValue'] }, + 'circgradbasedcorrmaskradius' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksRadius'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksRadius'] }, + 'circgradbasedcorrmaskrange' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMask'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMask'] }, + 'circgradbasedcorrmaskrangeareamodels' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels'] }, + 'circgradbasedcorrmaskrangeareamodelscolorsampleinfo' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'] }, + 'circgradbasedcorrmaskrangeareamodelscomponents' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents'] }, + 'circgradbasedcorrmaskrangecoloramount' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount'] }, + 'circgradbasedcorrmaskrangedepthfeather' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather'] }, + 'circgradbasedcorrmaskrangedepthmax' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax'] }, + 'circgradbasedcorrmaskrangedepthmin' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin'] }, + 'circgradbasedcorrmaskrangeinvert' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert'] }, + 'circgradbasedcorrmaskrangelumfeather' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather'] }, + 'circgradbasedcorrmaskrangeluminancedepthsampleinfo' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo'] }, + 'circgradbasedcorrmaskrangelummax' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax'] }, + 'circgradbasedcorrmaskrangelummin' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin'] }, + 'circgradbasedcorrmaskrangelumrange' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange'] }, + 'circgradbasedcorrmaskrangesampletype' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType'] }, + 'circgradbasedcorrmaskrangetype' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskType'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskType'] }, + 'circgradbasedcorrmaskrangeversion' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion'] }, + 'circgradbasedcorrmaskreferencepoint' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksReferencePoint'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksReferencePoint'] }, + 'circgradbasedcorrmaskright' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksRight'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksRight'] }, + 'circgradbasedcorrmaskroundness' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksRoundness'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksRoundness'] }, + 'circgradbasedcorrmasks' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasks'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasks'] }, + 'circgradbasedcorrmasksizex' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksSizeX'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksSizeX'] }, + 'circgradbasedcorrmasksizey' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksSizeY'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksSizeY'] }, + 'circgradbasedcorrmasktop' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksTop'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksTop'] }, + 'circgradbasedcorrmaskvalue' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskValue'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksMaskValue'] }, + 'circgradbasedcorrmaskversion' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksVersion'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksVersion'] }, + 'circgradbasedcorrmaskwhat' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksWhat'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksWhat'] }, + 'circgradbasedcorrmaskwholeimagearea' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksWholeImageArea'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksWholeImageArea'] }, + 'circgradbasedcorrmaskx' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksX'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksX'] }, + 'circgradbasedcorrmasky' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksY'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksY'] }, + 'circgradbasedcorrmaskzerox' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksZeroX'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksZeroX'] }, + 'circgradbasedcorrmaskzeroy' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksZeroY'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionMasksZeroY'] }, + 'circgradbasedcorrmoire' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalMoire'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalMoire'] }, + 'circgradbasedcorrrangemask' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMask'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMask'] }, + 'circgradbasedcorrrangemaskareamodels' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskAreaModels'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskAreaModels'] }, + 'circgradbasedcorrrangemaskareamodelscolorsampleinfo' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'] }, + 'circgradbasedcorrrangemaskareamodelscomponents' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents'] }, + 'circgradbasedcorrrangemaskcoloramount' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskColorAmount'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskColorAmount'] }, + 'circgradbasedcorrrangemaskdepthfeather' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskDepthFeather'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskDepthFeather'] }, + 'circgradbasedcorrrangemaskdepthmax' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskDepthMax'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskDepthMax'] }, + 'circgradbasedcorrrangemaskdepthmin' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskDepthMin'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskDepthMin'] }, + 'circgradbasedcorrrangemaskinvert' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskInvert'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskInvert'] }, + 'circgradbasedcorrrangemasklumfeather' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskLumFeather'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskLumFeather'] }, + 'circgradbasedcorrrangemaskluminancedepthsampleinfo' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo'] }, + 'circgradbasedcorrrangemasklummax' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskLumMax'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskLumMax'] }, + 'circgradbasedcorrrangemasklummin' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskLumMin'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskLumMin'] }, + 'circgradbasedcorrrangemasklumrange' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskLumRange'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskLumRange'] }, + 'circgradbasedcorrrangemasksampletype' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskSampleType'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskSampleType'] }, + 'circgradbasedcorrrangemasktype' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskType'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskType'] }, + 'circgradbasedcorrrangemaskversion' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskVersion'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsCorrectionRangeMaskVersion'] }, + 'circgradbasedcorrsaturation' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalSaturation'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalSaturation'] }, + 'circgradbasedcorrshadows2012' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalShadows2012'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalShadows2012'] }, + 'circgradbasedcorrsharpness' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalSharpness'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalSharpness'] }, + 'circgradbasedcorrtemperature' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalTemperature'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalTemperature'] }, + 'circgradbasedcorrtexture' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalTexture'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalTexture'] }, + 'circgradbasedcorrtint' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalTint'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalTint'] }, + 'circgradbasedcorrtoninghue' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalToningHue'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalToningHue'] }, + 'circgradbasedcorrtoningsaturation' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalToningSaturation'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalToningSaturation'] }, + 'circgradbasedcorrwhat' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsWhat'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsWhat'] }, + 'circgradbasedcorrwhites2012' => { 478 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalWhites2012'], 480 => [\'CircularGradientBasedCorrections','CircularGradientBasedCorrectionsLocalWhites2012'] }, + 'circulargradientbasedcorrections' => { 478 => 'CircularGradientBasedCorrections', 480 => 'CircularGradientBasedCorrections' }, + 'city' => { 131 => 0x5a, 161 => 'City', 320 => 0x6d, 492 => 'City' }, + 'city2' => { 320 => 0x80 }, + 'clarity' => { 232 => 0x35, 233 => 0x3d, 420 => 0x2036, 478 => 'Clarity', 480 => 'Clarity' }, + 'clarity2012' => { 478 => 'Clarity2012', 480 => 'Clarity2012' }, + 'claritycontrol' => { 355 => 0x96 }, + 'classification' => { 380 => 'clsf' }, + 'classifystate' => { 131 => 0xe1 }, + 'clearretouch' => { 320 => 0x7c }, + 'clearretouchvalue' => { 320 => 0xa3 }, + 'client' => { 504 => 'client' }, + 'clientname' => { 486 => 'ClientName' }, + 'clipboardaspectratio' => { 478 => 'ClipboardAspectRatio', 480 => 'ClipboardAspectRatio' }, + 'clipboardorientation' => { 478 => 'ClipboardOrientation', 480 => 'ClipboardOrientation' }, + 'clipfilename' => { 380 => 'clfn' }, + 'clipid' => { 380 => 'clid' }, + 'clmodeshootingspeed' => { 279 => '10.2', 280 => '11.3', 282 => '11.2', 283 => '11.2', 288 => '11.2', 289 => '10.2', 292 => '11.2', 293 => '11.2', 294 => '11.1', 295 => 0x3b }, + 'cluster' => { 478 => 'Cluster', 480 => 'Cluster' }, + 'cmcontrast' => { 305 => 0x2022 }, + 'cmddialsreverserotation' => { 295 => 0xba }, + 'cmexposurecompensation' => { 305 => 0x2000 }, + 'cmhue' => { 305 => 0x2021 }, + 'cmsaturation' => { 305 => 0x2020 }, + 'cmsharpness' => { 305 => 0x2023 }, + 'cmwhitebalance' => { 305 => 0x2001 }, + 'cmwhitebalancecomp' => { 305 => 0x2002 }, + 'cmwhitebalancegraypoint' => { 305 => 0x2010 }, + 'codec' => { 169 => 'Codec' }, + 'codedcharacterset' => { 132 => 0x5a }, + 'codeversion' => { 380 => 'cver' }, + 'collection' => { 310 => 'Collection' }, + 'collectionname' => { 170 => [\'Collections','CollectionsCollectionName'], 380 => 'coll' }, + 'collections' => { 170 => 'Collections', 473 => 'collections' }, + 'collectionuri' => { 170 => [\'Collections','CollectionsCollectionURI'] }, + 'color' => { 374 => 'player.movie.visual.color', 493 => 'color' }, + 'coloraberrationcontrol' => { 272 => 0xc89224b }, + 'coloradjustment' => { 397 => 0x14 }, + 'coloradjustmentmode' => { 396 => 0x210 }, + 'coloranta' => { 509 => [\'Colorants','ColorantsA'] }, + 'colorantb' => { 509 => [\'Colorants','ColorantsB'] }, + 'colorantblack' => { 509 => [\'Colorants','ColorantsBlack'] }, + 'colorantblue' => { 509 => [\'Colorants','ColorantsBlue'] }, + 'colorantcyan' => { 509 => [\'Colorants','ColorantsCyan'] }, + 'colorantgray' => { 509 => [\'Colorants','ColorantsGray'] }, + 'colorantgreen' => { 509 => [\'Colorants','ColorantsGreen'] }, + 'colorantl' => { 509 => [\'Colorants','ColorantsL'] }, + 'colorantmagenta' => { 509 => [\'Colorants','ColorantsMagenta'] }, + 'colorantmode' => { 509 => [\'Colorants','ColorantsMode'] }, + 'colorantred' => { 509 => [\'Colorants','ColorantsRed'] }, + 'colorants' => { 509 => 'Colorants' }, + 'colorantswatchname' => { 509 => [\'Colorants','ColorantsSwatchName'] }, + 'coloranttint' => { 509 => [\'Colorants','ColorantsTint'] }, + 'coloranttype' => { 509 => [\'Colorants','ColorantsType'] }, + 'colorantyellow' => { 509 => [\'Colorants','ColorantsYellow'] }, + 'colorbalance' => { 156 => 'ColorBalance' }, + 'colorbalanceadj' => { 272 => 0x76a43202 }, + 'colorbalanceblue' => { 181 => 0x1e }, + 'colorbalancegreen' => { 181 => 0x1d }, + 'colorbalancered' => { 181 => 0x1c }, + 'colorbalanceversion' => { 203 => 0x4, 204 => 0x4, 205 => 0x0 }, + 'colorblur' => { 109 => 0x65 }, + 'colorbluron' => { 103 => 0x20704 }, + 'colorbooster' => { 272 => 0x5f0e7d23 }, + 'colorboostlevel' => { 266 => 0x1 }, + 'colorboosttype' => { 266 => 0x0 }, + 'colorchromeeffect' => { 127 => 0x1048 }, + 'colorchromefxblue' => { 127 => 0x104e }, + 'colorclass' => { 366 => 0xde, 367 => 'ColorClass' }, + 'colorcompensationfilter' => { 184 => [0x3a,0x5f], 186 => 0x111, 420 => 0xb022 }, + 'colorcompensationfiltercustom' => { 407 => 0xd, 408 => 0xc }, + 'colorcompensationfilterset' => { 407 => 0x8, 408 => 0x7, 409 => 0x18, 425 => 0xf }, + 'colorcontrol' => { 302 => 0x102b }, + 'colorcorrection' => { 455 => 0x8015 }, + 'colorcreatoreffect' => { 297 => 0x532 }, + 'colordataversion' => { 41 => 0x0, 42 => 0x0, 44 => 0x0, 45 => 0x0, 46 => 0x0, 47 => 0x0, 48 => 0x0, 49 => 0x0, 50 => 0x0 }, + 'coloreffect' => { 320 => 0x28 }, + 'colorfilter' => { 112 => 0x17, 113 => 0x3017, 181 => 0x29, 189 => [0x38,0x4d,0x4f], 362 => 0x17 }, + 'colorgain' => { 237 => 0x51 }, + 'colorgradeblending' => { 478 => 'ColorGradeBlending', 480 => 'ColorGradeBlending' }, + 'colorgradeglobalhue' => { 478 => 'ColorGradeGlobalHue', 480 => 'ColorGradeGlobalHue' }, + 'colorgradegloballum' => { 478 => 'ColorGradeGlobalLum', 480 => 'ColorGradeGlobalLum' }, + 'colorgradeglobalsat' => { 478 => 'ColorGradeGlobalSat', 480 => 'ColorGradeGlobalSat' }, + 'colorgradehighlightlum' => { 478 => 'ColorGradeHighlightLum', 480 => 'ColorGradeHighlightLum' }, + 'colorgrademidtonehue' => { 478 => 'ColorGradeMidtoneHue', 480 => 'ColorGradeMidtoneHue' }, + 'colorgrademidtonelum' => { 478 => 'ColorGradeMidtoneLum', 480 => 'ColorGradeMidtoneLum' }, + 'colorgrademidtonesat' => { 478 => 'ColorGradeMidtoneSat', 480 => 'ColorGradeMidtoneSat' }, + 'colorgradeshadowlum' => { 478 => 'ColorGradeShadowLum', 480 => 'ColorGradeShadowLum' }, + 'colorhue' => { 103 => 0x20900, 226 => 0x8d }, + 'colorimetricreference' => { 119 => 0xc6bf }, + 'colorlabel' => { 483 => 'ColorLabel' }, + 'colormatrix' => { 63 => 0xa, 301 => 0x200, 302 => 0x1011, 394 => 0xa030 }, + 'colormatrix1' => { 119 => 0xc621, 364 => 0x106 }, + 'colormatrix2' => { 119 => 0xc622, 305 => 0x200, 364 => 0x226 }, + 'colormatrix3' => { 119 => 0xcd33 }, + 'colormatrixa' => { 355 => 0x203 }, + 'colormatrixa2' => { 355 => 0x21c }, + 'colormatrixadobergb' => { 394 => 0xa032 }, + 'colormatrixb' => { 355 => 0x204 }, + 'colormatrixb2' => { 355 => 0x21d }, + 'colormatrixnumber' => { 302 => 0x1019 }, + 'colormatrixsrgb' => { 394 => 0xa031 }, + 'colormode' => { 113 => 0x3015, 127 => 0x1210, 140 => 0x66, 181 => 0x28, 184 => 0x16, 186 => 0x101, 187 => 0x36, 189 => 0x7, 226 => 0x3, 262 => 0x4, 320 => 0x32, 397 => 0x2c, 420 => 0xb029, 492 => 'ColorMode' }, + 'colormoirereduction' => { 103 => 0x20670, 273 => 0x15 }, + 'colormoirereductionmode' => { 273 => 0x5 }, + 'colormoirereductionon' => { 103 => '0x20670.0' }, + 'colornoisereduction' => { 455 => 0x8029, 478 => 'ColorNoiseReduction', 480 => 'ColorNoiseReduction' }, + 'colornoisereductiondetail' => { 478 => 'ColorNoiseReductionDetail', 480 => 'ColorNoiseReductionDetail' }, + 'colornoisereductionintensity' => { 273 => 0x18 }, + 'colornoisereductionsharpness' => { 273 => 0x1c }, + 'colornoisereductionsmoothness' => { 478 => 'ColorNoiseReductionSmoothness', 480 => 'ColorNoiseReductionSmoothness' }, + 'colorplanes' => { 123 => 0x2 }, + 'colorprofile' => { 181 => 0x33 }, + 'colorprofilesettings' => { 297 => 0x539 }, + 'colorrepresentation' => { 133 => 0x3c }, + 'colorsaturationadj' => { 103 => 0x20305 }, + 'colorsequence' => { 133 => 0x41 }, + 'colorspace' => { 51 => 0x3, 64 => 0xb4, 97 => 0x10b4, 119 => 0xa001, 135 => 0x3, 162 => 'ColorSpace', 182 => 0x2f, 183 => 0x25, 184 => 0x17, 226 => 0x1e, 297 => 0x507, 355 => 0x37, 394 => 0xa011, 397 => 0xb, 407 => 0x1b, 408 => 0x83, 409 => 0xe, 425 => 0x6, 484 => 'ColorSpace' }, + 'colorspace2' => { 63 => 0x9 }, + 'colorspecapproximation' => { 135 => 0x2 }, + 'colorspecdata' => { 135 => 0x3 }, + 'colorspecmethod' => { 135 => 0x0 }, + 'colorspecprecedence' => { 135 => 0x1 }, + 'colortempasshot' => { 38 => 0x4, 39 => 0x7, 40 => 0x1d, 41 => 0x59, 42 => 0x6d, 43 => 0x26, 44 => 0x43, 47 => 0x43, 48 => 0x43, 49 => 0x43, 50 => 0x4b }, + 'colortempauto' => { 38 => 0x9, 39 => 0xf, 40 => 0x22, 41 => 0x5e, 42 => 0x72, 43 => 0x1c, 44 => 0x48, 47 => 0x48, 48 => 0x48, 49 => 0x48, 50 => 0x50 }, + 'colortempcloudy' => { 38 => 0x22, 39 => 0x37, 40 => 0x31, 41 => 0xa4, 42 => 0xdb, 43 => 0x35, 44 => 0x5c, 47 => 0x75, 48 => 0x8e, 49 => 0x93, 50 => 0x96, 355 => 0x55 }, + 'colortempcustom' => { 44 => 0x84 }, + 'colortempcustom1' => { 40 => 0x45 }, + 'colortempcustom2' => { 40 => 0x4a }, + 'colortempdaylight' => { 38 => 0x18, 39 => 0x27, 40 => 0x27, 41 => 0x9a, 42 => 0xd1, 43 => 0x2b, 44 => 0x52, 47 => 0x6b, 48 => 0x84, 49 => 0x89, 50 => 0x8c, 355 => 0x53 }, + 'colortemperature' => { 7 => 0x73, 8 => [0x48,0x4e], 9 => 0xc0, 10 => 0x37, 11 => 0x62, 12 => 0x37, 13 => 0x7c, 14 => 0x73, 15 => 0x73, 16 => 0x77, 17 => 0x73, 18 => 0x7c, 19 => 0x58, 20 => 0x73, 21 => 0xc0, 22 => 0x7f, 23 => 0x7d, 24 => 0xc0, 25 => 0xc6, 26 => 0xc7, 27 => 0x135, 28 => 0x7b, 29 => 0x13a, 64 => 0xae, 74 => 0x9, 97 => 0x10ae, 127 => 0x1005, 138 => 0x846, 156 => 'ColorTemperature', 182 => [0x6e,0x49], 183 => 0x3f, 184 => [0x39,0x5e], 186 => 0x10b, 189 => [0x3c,0x4c,0x4e], 315 => 0x321, 355 => 0x50, 387 => 0x1308, 420 => 0xb021, 478 => 'Temperature', 480 => 'Temperature' }, + 'colortemperatureadj' => { 455 => 0x8013 }, + 'colortemperatureauto' => { 226 => 0x4f }, + 'colortemperaturebg' => { 302 => 0x1013 }, + 'colortemperaturecustom' => { 407 => 0xc, 408 => 0xb }, + 'colortemperaturerg' => { 302 => 0x1014 }, + 'colortemperatureset' => { 407 => 0x7, 408 => 0x6 }, + 'colortemperaturesetting' => { 184 => 0x25, 409 => 0x17, 425 => 0xe }, + 'colortempflash' => { 38 => 0x36, 39 => 0x57, 40 => 0x40, 41 => 0xb8, 42 => 0xef, 43 => 0x49, 44 => 0x70, 47 => 0x89, 48 => 0xa2, 49 => 0xa7, 50 => 0xaa, 355 => 0x5a }, + 'colortempflashdata' => { 44 => 0x24a }, + 'colortempfluorescent' => { 38 => 0x2c, 39 => 0x47, 40 => 0x3b, 41 => 0xae, 42 => 0xe5, 43 => 0x3f, 44 => 0x66, 47 => 0x7f, 48 => 0x98, 49 => 0x9d, 50 => 0xa0 }, + 'colortempfluorescentd' => { 355 => 0x57 }, + 'colortempfluorescentn' => { 355 => 0x58 }, + 'colortempfluorescentw' => { 355 => 0x59 }, + 'colortempkelvin' => { 38 => 0x31, 39 => 0x4f, 41 => 0xb3, 42 => 0xea, 43 => 0x44, 44 => 0x6b, 47 => 0x84, 48 => 0x9d, 49 => 0xa2, 50 => 0xa5, 320 => 0x44, 387 => 0x1307 }, + 'colortempmeasured' => { 38 => 0xe, 39 => 0x17, 41 => 0x63, 42 => 0x77, 44 => 0x4d, 47 => 0x4d, 48 => 0x4d, 49 => 0x4d, 50 => 0x55 }, + 'colortemppc1' => { 43 => 0x94, 44 => 0x75 }, + 'colortemppc2' => { 43 => 0x99, 44 => 0x7a }, + 'colortemppc3' => { 43 => 0x9e, 44 => 0x7f }, + 'colortempshade' => { 38 => 0x1d, 39 => 0x2f, 40 => 0x2c, 41 => 0x9f, 42 => 0xd6, 43 => 0x30, 44 => 0x57, 47 => 0x70, 48 => 0x89, 49 => 0x8e, 50 => 0x91, 355 => 0x54 }, + 'colortemptungsten' => { 38 => 0x27, 39 => 0x3f, 40 => 0x36, 41 => 0xa9, 42 => 0xe0, 43 => 0x3a, 44 => 0x61, 47 => 0x7a, 48 => 0x93, 49 => 0x98, 50 => 0x9b, 355 => 0x56 }, + 'colortempunknown' => { 38 => 0x13, 39 => 0x1f, 41 => 0x68, 42 => 0x7c, 43 => 0x21, 47 => 0x52, 48 => 0x52, 49 => 0x52, 50 => 0x5a }, + 'colortempunknown10' => { 38 => 0x63, 39 => 0x9f, 41 => 0x95, 42 => 0xa9, 43 => 0x76, 47 => 0xa2, 48 => 0x7f, 49 => 0x7f, 50 => 0x87 }, + 'colortempunknown11' => { 38 => 0x68, 39 => 0xa7, 41 => 0xbd, 42 => [0xae,0xb3], 43 => 0x7b, 47 => 0xa7, 48 => 0xa7, 49 => 0x84, 50 => 0xaf }, + 'colortempunknown12' => { 38 => 0x6d, 39 => 0xaf, 41 => 0xc2, 42 => 0xb8, 43 => 0x80, 47 => 0xac, 48 => 0xac, 49 => 0xac, 50 => 0xb4 }, + 'colortempunknown13' => { 38 => 0x72, 39 => 0xb7, 41 => 0xc7, 42 => 0xbd, 43 => 0x85, 47 => 0xb1, 48 => 0xb1, 49 => 0xb1, 50 => 0xb9 }, + 'colortempunknown14' => { 41 => 0xcc, 42 => 0xc2, 43 => 0x8a, 47 => 0xb6, 48 => 0xb6, 49 => 0xb6, 50 => 0xbe }, + 'colortempunknown15' => { 41 => 0xd1, 42 => 0xc7, 43 => 0x8f, 47 => 0xbb, 48 => 0xbb, 49 => 0xbb, 50 => 0xc3 }, + 'colortempunknown16' => { 41 => 0xd6, 42 => 0xcc, 43 => 0xa3, 48 => 0xc0, 49 => 0xc0, 50 => 0xc8 }, + 'colortempunknown17' => { 41 => 0xdb, 42 => 0xf4, 48 => 0xc5, 49 => 0xc5, 50 => 0xcd }, + 'colortempunknown18' => { 41 => 0xe0, 42 => 0xf9, 48 => 0xca, 49 => 0xca, 50 => 0xd2 }, + 'colortempunknown19' => { 41 => 0xe5, 42 => 0xfe, 48 => 0xcf, 49 => 0xcf, 50 => 0xd7 }, + 'colortempunknown2' => { 38 => 0x3b, 39 => 0x5f, 41 => 0x6d, 42 => 0x81, 43 => 0x4e, 47 => 0x57, 48 => 0x57, 49 => 0x57, 50 => 0x5f }, + 'colortempunknown20' => { 41 => 0xea, 42 => 0x103, 48 => 0xd4, 49 => 0xd4, 50 => 0xdc }, + 'colortempunknown21' => { 41 => 0xef, 42 => 0x108, 49 => 0xd9, 50 => 0xe1 }, + 'colortempunknown22' => { 41 => 0xf4, 42 => 0x10d, 49 => 0xde, 50 => 0xe6 }, + 'colortempunknown23' => { 41 => 0xf9, 42 => 0x112, 49 => 0xe3, 50 => 0xeb }, + 'colortempunknown24' => { 41 => 0xfe, 42 => 0x117, 49 => 0xe8, 50 => 0xf0 }, + 'colortempunknown25' => { 41 => 0x103, 42 => 0x11c, 49 => 0xed, 50 => 0xf5 }, + 'colortempunknown26' => { 41 => 0x108, 42 => 0x121, 49 => 0xf2, 50 => 0xfa }, + 'colortempunknown27' => { 41 => 0x10d, 42 => 0x126, 49 => 0xf7, 50 => 0xff }, + 'colortempunknown28' => { 41 => 0x112, 49 => 0xfc, 50 => 0x104 }, + 'colortempunknown29' => { 41 => 0x117, 49 => 0x101, 50 => 0x109 }, + 'colortempunknown3' => { 38 => 0x40, 39 => 0x67, 41 => 0x72, 42 => 0x86, 43 => 0x53, 47 => 0x5c, 48 => 0x5c, 49 => 0x5c, 50 => 0x64 }, + 'colortempunknown30' => { 49 => 0x106 }, + 'colortempunknown4' => { 38 => 0x45, 39 => 0x6f, 41 => 0x77, 42 => 0x8b, 43 => 0x58, 47 => 0x61, 48 => 0x61, 49 => 0x61, 50 => 0x69 }, + 'colortempunknown5' => { 38 => 0x4a, 39 => 0x77, 41 => 0x7c, 42 => 0x90, 43 => 0x5d, 47 => 0x66, 48 => 0x66, 49 => 0x66, 50 => 0x6e }, + 'colortempunknown6' => { 38 => 0x4f, 39 => 0x7f, 41 => 0x81, 42 => 0x95, 43 => 0x62, 47 => 0x8e, 48 => 0x6b, 49 => 0x6b, 50 => 0x73 }, + 'colortempunknown7' => { 38 => 0x54, 39 => 0x87, 41 => 0x86, 42 => 0x9a, 43 => 0x67, 47 => 0x93, 48 => 0x70, 49 => 0x70, 50 => 0x78 }, + 'colortempunknown8' => { 38 => 0x59, 39 => 0x8f, 41 => 0x8b, 42 => 0x9f, 43 => 0x6c, 47 => 0x98, 48 => 0x75, 49 => 0x75, 50 => 0x7d }, + 'colortempunknown9' => { 38 => 0x5e, 39 => 0x97, 41 => 0x90, 42 => 0xa4, 43 => 0x71, 47 => 0x9d, 48 => 0x7a, 49 => 0x7a, 50 => 0x82 }, + 'colortint' => { 319 => 0x35c }, + 'colortone' => { 10 => 0x6f, 12 => 0x77, 34 => 0x2a, 51 => 0x2, 63 => 0x8 }, + 'colortoneadj' => { 103 => 0x20304, 108 => 0x11e }, + 'colortoneauto' => { 71 => 0x9c }, + 'colortonefaithful' => { 19 => 0x107, 70 => 0x6c, 71 => 0x6c }, + 'colortonelandscape' => { 19 => 0x105, 70 => 0x3c, 71 => 0x3c }, + 'colortonemonochrome' => { 70 => 0x84, 71 => 0x84 }, + 'colortoneneutral' => { 19 => 0x106, 70 => 0x54, 71 => 0x54 }, + 'colortoneportrait' => { 19 => 0x104, 70 => 0x24, 71 => 0x24 }, + 'colortonestandard' => { 19 => 0x103, 70 => 0xc, 71 => 0xc }, + 'colortoneuserdef1' => { 19 => 0x109, 70 => 0x9c, 71 => 0xb4 }, + 'colortoneuserdef2' => { 19 => 0x10a, 70 => 0xb4, 71 => 0xcc }, + 'colortoneuserdef3' => { 19 => 0x10b, 70 => 0xcc, 71 => 0xe4 }, + 'comlenblksize' => { 138 => 0xfde8 }, + 'commanddialplaybackmode' => { 295 => 0x1cb }, + 'commanddials' => { 290 => '5.1' }, + 'commanddialsaperturesetting' => { 279 => '17.3', 280 => '18.3', 282 => '18.3', 283 => '18.3', 288 => '33.3', 289 => '17.3', 292 => '18.3', 293 => '18.3' }, + 'commanddialschangemainsub' => { 279 => '17.2', 280 => '18.1', 282 => '18.1', 283 => '18.1', 288 => '33.2', 289 => '17.2', 292 => '18.1', 293 => '18.1' }, + 'commanddialsmenuandplayback' => { 279 => '17.4', 280 => '18.2', 282 => '18.2', 283 => '18.2', 288 => '33.4', 289 => '17.4', 292 => '18.2', 293 => '18.2' }, + 'commanddialsreverserotation' => { 279 => '17.1', 280 => '6.4', 282 => '6.2', 283 => '6.2', 284 => '16.2', 285 => '17.2', 288 => '33.1', 289 => '17.1', 292 => '6.2', 293 => '6.2', 294 => '18.1' }, + 'commanderchannel' => { 290 => '10.2', 291 => '25.2' }, + 'commandergroupa_ttl-aacomp' => { 290 => '13.1', 291 => '31.1' }, + 'commandergroupa_ttlcomp' => { 294 => '32.1' }, + 'commandergroupamanualoutput' => { 290 => '13.2', 291 => '28.2' }, + 'commandergroupamode' => { 290 => '11.2', 291 => '28.1' }, + 'commandergroupb_ttl-aacomp' => { 290 => '14.1', 291 => '32.1' }, + 'commandergroupb_ttlcomp' => { 294 => '33.1' }, + 'commandergroupbmanualoutput' => { 290 => '14.2', 291 => '29.2' }, + 'commandergroupbmode' => { 290 => '11.3', 291 => '29.1' }, + 'commanderinternalflash' => { 290 => '11.1', 291 => '27.1' }, + 'commanderinternalmanualoutput' => { 290 => '12.2', 291 => '27.2' }, + 'commanderinternalttlchannel' => { 288 => '18.2' }, + 'commanderinternalttlcomp' => { 290 => '12.1', 291 => '30.2', 294 => '31.2' }, + 'commanderinternalttlcompbuiltin' => { 288 => '20.1', 289 => '26.1' }, + 'commanderinternalttlcompgroupa' => { 288 => '21.1', 289 => '27.1' }, + 'commanderinternalttlcompgroupb' => { 288 => '22.1', 289 => '28.1' }, + 'comment' => { 0 => 0x2, 120 => 'Comment', 157 => 'Comment', 310 => 'Comment', 372 => "\xa9cmt", 374 => 'comment', 380 => "\xa9cmt" }, + 'compass' => { 390 => 0x4 }, + 'compatibleversion' => { 478 => 'CompatibleVersion', 480 => 'CompatibleVersion' }, + 'compilation' => { 372 => 'cpil' }, + 'compimageimagespersequence' => { 485 => [\'CompositeImageExposureTimes','CompositeImageExposureTimesNumberOfImagesInSequences'] }, + 'compimagemaxexposureall' => { 485 => [\'CompositeImageExposureTimes','CompositeImageExposureTimesMaxExposureTimesOfAll'] }, + 'compimagemaxexposureused' => { 485 => [\'CompositeImageExposureTimes','CompositeImageExposureTimesMaxExposureTimesOfUsed'] }, + 'compimageminexposureall' => { 485 => [\'CompositeImageExposureTimes','CompositeImageExposureTimesMinExposureTimesOfAll'] }, + 'compimageminexposureused' => { 485 => [\'CompositeImageExposureTimes','CompositeImageExposureTimesMinExposureTimesOfUsed'] }, + 'compimagenumsequences' => { 485 => [\'CompositeImageExposureTimes','CompositeImageExposureTimesNumberOfSequences'] }, + 'compimagesumexposureall' => { 485 => [\'CompositeImageExposureTimes','CompositeImageExposureTimesSumOfExposureTimesOfAll'] }, + 'compimagesumexposureused' => { 485 => [\'CompositeImageExposureTimes','CompositeImageExposureTimesSumOfExposureTimesOfUsed'] }, + 'compimagetotalexposureperiod' => { 485 => [\'CompositeImageExposureTimes','CompositeImageExposureTimesTotalExposurePeriod'] }, + 'compimagevalues' => { 485 => [\'CompositeImageExposureTimes','CompositeImageExposureTimesValues'] }, + 'complianceprofile' => { 494 => 'complianceProfile' }, + 'componentsconfiguration' => { 119 => 0x9101, 162 => 'Components', 484 => 'ComponentsConfiguration' }, + 'componentversion' => { 97 => 0x80c }, + 'composer' => { 179 => 'WM/Composer', 372 => ["\xa9com","\xa9wrt"], 380 => ["\xa9com","\xa9wrt"], 504 => 'composer' }, + 'composerkeywords' => { 380 => "\xa9cok" }, + 'compositeimage' => { 119 => 0xa460, 485 => 'CompositeImage' }, + 'compositeimagecount' => { 119 => 0xa461, 485 => 'CompositeImageCount' }, + 'compositeimageexposuretimes' => { 119 => 0xa462, 485 => 'CompositeImageExposureTimes' }, + 'composition' => { 468 => 'Composition' }, + 'compositionadjust' => { 354 => '0.1' }, + 'compositionadjustrotation' => { 354 => 0x7 }, + 'compositionadjustx' => { 354 => 0x5 }, + 'compositionadjusty' => { 354 => 0x6 }, + 'compressedbitsperpixel' => { 119 => 0x9102, 484 => 'CompressedBitsPerPixel' }, + 'compressedimagesize' => { 186 => 0x40, 302 => 0x40 }, + 'compression' => { 119 => 0x103, 325 => 0xb, 500 => 'Compression' }, + 'compressionfactor' => { 297 => 0x50d }, + 'compressionformat' => { 63 => 0x4 }, + 'compressionratio' => { 162 => 'Compression', 302 => 0x1034 }, + 'compressorversion' => { 380 => 'CNCV' }, + 'condadobvfactor' => { 138 => 0xf3e }, + 'condadodaybvthresh' => { 138 => 0xf3c }, + 'condadodayoffsets' => { 138 => 0xf42 }, + 'condadofluoffsets' => { 138 => 0xf44 }, + 'condadofluthresh' => { 138 => 0xf41 }, + 'condadoillfactor' => { 138 => 0xf3f }, + 'condadoneurange' => { 138 => 0xf3d }, + 'condadotunoffsets' => { 138 => 0xf43 }, + 'condadotunthresh' => { 138 => 0xf40 }, + 'conductor' => { 179 => 'WM/Conductor', 372 => "\xa9con" }, + 'confidence' => { 463 => 'Confidence' }, + 'confidencelevel' => { 474 => 'ConfidenceLevel' }, + 'confidencemime' => { 463 => 'ConfidenceMime' }, + 'constrainedcropheight' => { 108 => 0x266, 366 => 0xd6 }, + 'constrainedcropwidth' => { 108 => 0x262, 366 => 0xd5 }, + 'contact' => { 131 => 0x76 }, + 'contactinfo' => { 478 => 'ContactInfo', 480 => 'ContactInfo', 493 => 'contactInfo' }, + 'container' => { 458 => 'Container' }, + 'containerdirectory' => { 458 => [\'Container','ContainerDirectory'] }, + 'containerdirectoryitem' => { 458 => [\'Container','ContainerDirectoryItem'] }, + 'containerdirectoryitemdatauri' => { 458 => [\'Container','ContainerDirectoryItemDataURI'] }, + 'containerdirectoryitemlength' => { 458 => [\'Container','ContainerDirectoryItemLength'] }, + 'containerdirectoryitemmime' => { 458 => [\'Container','ContainerDirectoryItemMime'] }, + 'containerdirectoryitempadding' => { 458 => [\'Container','ContainerDirectoryItemPadding'] }, + 'containerformat' => { 490 => 'ContainerFormat' }, + 'containerformatidentifier' => { 490 => [\'ContainerFormat','ContainerFormatIdentifier'] }, + 'containerformatname' => { 490 => [\'ContainerFormat','ContainerFormatName'] }, + 'contentcreatedate' => { 372 => "\xa9day", 380 => ['@day',"\xa9day"] }, + 'contentdistributor' => { 179 => 'WM/ContentDistributor' }, + 'contentdistributorid' => { 380 => 'cdis' }, + 'contentid' => { 380 => 'ccid' }, + 'contentlocationcode' => { 131 => 0x1a }, + 'contentlocationname' => { 131 => 0x1b }, + 'contenttype' => { 494 => 'contentType' }, + 'continuousbracketing' => { 184 => 0x20 }, + 'continuousdrive' => { 34 => 0x5 }, + 'continuousmodedisplay' => { 295 => 0x51 }, + 'continuousmodeliveview' => { 293 => '77.2' }, + 'continuousshootingspeed' => { 84 => 0x610 }, + 'continuousshotlimit' => { 84 => 0x611 }, + 'contrast' => { 10 => 0x73, 12 => 0x75, 34 => 0xd, 112 => 0xc, 113 => [0x3012,0x20], 119 => [0xa408,0xfe54], 127 => [0x1004,0x1006], 156 => 'Contrast', 176 => 'Contrast', 181 => 0x20, 182 => 0x31, 183 => 0x27, 184 => 0x19, 189 => 0x2, 231 => 0x33, 232 => 0x37, 233 => 0x3f, 302 => 0x1029, 320 => 0x39, 322 => 0x300a, 355 => 0x20, 362 => 0xc, 374 => 'player.movie.visual.contrast', 381 => 0x24, 383 => 0x52, 387 => 0x1012, 397 => 0xd, 407 => 0x1d, 408 => 0x1a, 420 => 0x2004, 478 => 'Contrast', 480 => 'Contrast', 484 => 'Contrast' }, + 'contrast2012' => { 478 => 'Contrast2012', 480 => 'Contrast2012' }, + 'contrastadj' => { 103 => 0x20303, 108 => 0x115, 275 => 0x2c, 455 => 0x8017 }, + 'contrastauto' => { 71 => 0x90 }, + 'contrastcurve' => { 226 => 0x8c }, + 'contrastdetectaf' => { 193 => 0x4 }, + 'contrastdetectafarea' => { 355 => 0x231 }, + 'contrastdetectafinfocus' => { 193 => [0x1c,0x52] }, + 'contrastfaithful' => { 19 => 0xec, 70 => 0x60, 71 => 0x60 }, + 'contrasthighlight' => { 355 => 0x6d }, + 'contrasthighlightshadowadj' => { 355 => 0x6f }, + 'contrastlandscape' => { 19 => 0xea, 70 => 0x30, 71 => 0x30 }, + 'contrastmode' => { 320 => 0x2c }, + 'contrastmonochrome' => { 19 => 0xed, 70 => 0x78, 71 => 0x78 }, + 'contrastneutral' => { 19 => 0xeb, 70 => 0x48, 71 => 0x48 }, + 'contrastportrait' => { 19 => 0xe9, 70 => 0x18, 71 => 0x18 }, + 'contrastsetting' => { 297 => 0x505, 305 => 0x1012, 409 => 0x10, 425 => 0x8 }, + 'contrastshadow' => { 355 => 0x6e }, + 'contraststandard' => { 19 => 0xe8, 70 => 0x0, 71 => 0x0 }, + 'contrastuserdef1' => { 19 => 0xee, 70 => 0x90, 71 => 0xa8 }, + 'contrastuserdef2' => { 19 => 0xef, 70 => 0xa8, 71 => 0xc0 }, + 'contrastuserdef3' => { 19 => 0xf0, 70 => 0xc0, 71 => 0xd8 }, + 'contributedmedia' => { 504 => 'contributedMedia' }, + 'contributedmediaduration' => { 504 => [\'contributedMedia','contributedMediaDuration'] }, + 'contributedmediadurationscale' => { 504 => [\'contributedMedia','contributedMediaDurationScale'] }, + 'contributedmediadurationvalue' => { 504 => [\'contributedMedia','contributedMediaDurationValue'] }, + 'contributedmediamanaged' => { 504 => [\'contributedMedia','contributedMediaManaged'] }, + 'contributedmediapath' => { 504 => [\'contributedMedia','contributedMediaPath'] }, + 'contributedmediastarttime' => { 504 => [\'contributedMedia','contributedMediaStartTime'] }, + 'contributedmediastarttimescale' => { 504 => [\'contributedMedia','contributedMediaStartTimeScale'] }, + 'contributedmediastarttimevalue' => { 504 => [\'contributedMedia','contributedMediaStartTimeValue'] }, + 'contributedmediatrack' => { 504 => [\'contributedMedia','contributedMediaTrack'] }, + 'contributedmediawebstatement' => { 504 => [\'contributedMedia','contributedMediaWebStatement'] }, + 'contributor' => { 481 => 'contributor', 490 => 'Contributor' }, + 'contributoridentifier' => { 490 => [\'Contributor','ContributorIdentifier'] }, + 'contributorname' => { 490 => [\'Contributor','ContributorName'] }, + 'contributorrole' => { 490 => [\'Contributor','ContributorRole'] }, + 'contributors' => { 157 => 'Contributors' }, + 'controldialset' => { 184 => 0x46 }, + 'controlledvocabularyterm' => { 490 => 'CVterm' }, + 'controllerboardversion' => { 315 => 0x332 }, + 'controlmode' => { 77 => 0x12 }, + 'controlringresponse' => { 295 => 0x1d5 }, + 'controlringrotation' => { 84 => 0x712 }, + 'conversionlens' => { 298 => 0x403, 320 => 0x35 }, + 'converter' => { 119 => 0xfe4d, 262 => 0xb, 478 => 'Converter', 480 => 'Converter' }, + 'converttograyscale' => { 478 => 'ConvertToGrayscale', 480 => 'ConvertToGrayscale' }, + 'cookingequipment' => { 496 => 'cookingEquipment' }, + 'cookingmethod' => { 496 => 'cookingMethod' }, + 'copyright' => { 0 => 0x3, 119 => 0x8298, 157 => 'Copyright', 310 => 'Copyright', 355 => 0x22f, 371 => 'Copyright', 372 => ['cprt',"\xa9cpy"], 374 => 'copyright', 380 => ['cprt',"\xa9cpy"], 478 => 'Copyright', 480 => 'Copyright', 491 => 'Copyright', 497 => 'copyright', 500 => 'Copyright', 504 => 'copyright' }, + 'copyrightflag' => { 369 => 0x40a }, + 'copyrightnotice' => { 131 => 0x74 }, + 'copyrightowner' => { 307 => 'CopyrightOwner' }, + 'copyrightownerid' => { 307 => [\'CopyrightOwner','CopyrightOwnerCopyrightOwnerID'] }, + 'copyrightownerimageid' => { 307 => 'CopyrightOwnerImageID' }, + 'copyrightownername' => { 307 => [\'CopyrightOwner','CopyrightOwnerCopyrightOwnerName'] }, + 'copyrightregistrationnumber' => { 307 => 'CopyrightRegistrationNumber' }, + 'copyrightstatus' => { 307 => 'CopyrightStatus' }, + 'copyrightyear' => { 490 => 'CopyrightYear', 494 => 'copyrightYear' }, + 'coringfilter' => { 301 => 0x310, 302 => 0x102d, 305 => 0x310 }, + 'coringvalues' => { 301 => 0x311, 305 => 0x311 }, + 'corporateentity' => { 494 => 'corporateEntity' }, + 'correlatedcolortemp' => { 319 => 0x35b }, + 'country' => { 161 => 'Country', 320 => 0x69, 492 => 'Country' }, + 'country-primarylocationcode' => { 131 => 0x64 }, + 'country-primarylocationname' => { 131 => 0x65 }, + 'countrycode' => { 225 => 0x5, 367 => 'CountryCode', 489 => 'CountryCode' }, + 'course' => { 496 => 'course' }, + 'coverage' => { 481 => 'coverage' }, + 'coverart' => { 372 => 'covr' }, + 'coverdate' => { 494 => 'coverDate' }, + 'coverdisplaydate' => { 494 => 'coverDisplayDate' }, + 'coveruri' => { 380 => 'cvru' }, + 'cpufirmwareversion' => { 355 => 0x28 }, + 'crc32' => { 482 => 'crc32' }, + 'createdate' => { 119 => 0x9004, 157 => 'CreateDate', 306 => 'CreationDate', 310 => 'create-date', 371 => 'CreationDate', 377 => 0x1, 502 => 'CreateDate' }, + 'creationdate' => { 374 => 'creationdate', 491 => 'CreationDate', 494 => 'creationDate' }, + 'creationtime' => { 310 => 'Creation Time' }, + 'creativestyle' => { 407 => 0x1a, 408 => 0x18, 418 => 0x41, 420 => 0xb020, 451 => 0x4a }, + 'creativestylesetting' => { 409 => 0xf, 425 => 0x7 }, + 'creativestylewaschanged' => { 455 => 0x8001 }, + 'creator' => { 306 => 'Creator', 371 => 'Creator', 481 => 'creator', 490 => 'Creator', 491 => 'Creator' }, + 'creatoraddress' => { 489 => [\'CreatorContactInfo','CreatorContactInfoCiAdrExtadr'] }, + 'creatorappid' => { 178 => 'CreatorAppId' }, + 'creatorcity' => { 489 => [\'CreatorContactInfo','CreatorContactInfoCiAdrCity'] }, + 'creatorcontactinfo' => { 489 => 'CreatorContactInfo' }, + 'creatorcountry' => { 489 => [\'CreatorContactInfo','CreatorContactInfoCiAdrCtry'] }, + 'creatoridentifier' => { 490 => [\'Creator','CreatorIdentifier'] }, + 'creatorname' => { 490 => [\'Creator','CreatorName'] }, + 'creatoropenwithuioptions' => { 178 => 'CreatorOpenWithUIOptions' }, + 'creatorpostalcode' => { 489 => [\'CreatorContactInfo','CreatorContactInfoCiAdrPcode'] }, + 'creatorregion' => { 489 => [\'CreatorContactInfo','CreatorContactInfoCiAdrRegion'] }, + 'creatorrole' => { 490 => [\'Creator','CreatorRole'] }, + 'creatortool' => { 502 => 'CreatorTool' }, + 'creatorworkemail' => { 489 => [\'CreatorContactInfo','CreatorContactInfoCiEmailWork'] }, + 'creatorworktelephone' => { 489 => [\'CreatorContactInfo','CreatorContactInfoCiTelWork'] }, + 'creatorworkurl' => { 489 => [\'CreatorContactInfo','CreatorContactInfoCiUrlWork'] }, + 'credit' => { 131 => 0x6e, 492 => 'Credit' }, + 'creditline' => { 497 => 'creditLine' }, + 'creditlinereq' => { 507 => 'CreditLineReq' }, + 'creditlinerequired' => { 307 => 'CreditLineRequired' }, + 'cropactive' => { 101 => 0x0, 108 => 0x244 }, + 'cropangle' => { 478 => 'CropAngle', 480 => 'CropAngle' }, + 'croparea' => { 226 => 0x45, 455 => 0x9011 }, + 'cropaspectratio' => { 103 => 0x30101, 108 => 0x260 }, + 'cropaspectratiocustom' => { 103 => 0x30102 }, + 'cropbottom' => { 123 => 0x9, 267 => 0x36, 325 => 0x31, 366 => 0xdc, 478 => 'CropBottom', 480 => 'CropBottom' }, + 'cropbottommargin' => { 53 => 0x3 }, + 'cropcircleactive' => { 109 => 0xd6 }, + 'cropcircleradius' => { 109 => 0xd9 }, + 'cropcirclex' => { 109 => 0xd7 }, + 'cropcircley' => { 109 => 0xd8 }, + 'cropconstraintowarp' => { 478 => 'CropConstrainToWarp', 480 => 'CropConstrainToWarp' }, + 'croph' => { 472 => 'CropH' }, + 'cropheight' => { 101 => 0x6, 108 => 0x24c, 301 => 0x615, 305 => 0x615, 478 => 'CropHeight', 480 => 'CropHeight' }, + 'crophispeed' => { 226 => 0x1b }, + 'cropleft' => { 108 => 0x246, 123 => 0x6, 267 => 0x1e, 301 => 0x612, 305 => 0x612, 325 => 0x30, 366 => 0xd9, 478 => 'CropLeft', 480 => 'CropLeft' }, + 'cropleftmargin' => { 53 => 0x0 }, + 'cropmode' => { 127 => 0x104d, 387 => 0x1018 }, + 'croporiginalheight' => { 101 => 0xb }, + 'croporiginalwidth' => { 101 => 0xa }, + 'cropoutputheight' => { 267 => 0xce }, + 'cropoutputheightinches' => { 267 => 0x96 }, + 'cropoutputpixels' => { 267 => 0xd6 }, + 'cropoutputresolution' => { 267 => 0xb6 }, + 'cropoutputscale' => { 267 => 0xbe }, + 'cropoutputwidth' => { 267 => 0xc6 }, + 'cropoutputwidthinches' => { 267 => 0x8e }, + 'croppedareaimageheightpixels' => { 466 => 'CroppedAreaImageHeightPixels', 467 => 'CroppedAreaImageHeightPixels' }, + 'croppedareaimagewidthpixels' => { 466 => 'CroppedAreaImageWidthPixels', 467 => 'CroppedAreaImageWidthPixels' }, + 'croppedarealeftpixels' => { 466 => 'CroppedAreaLeftPixels', 467 => 'CroppedAreaLeftPixels' }, + 'croppedareatoppixels' => { 466 => 'CroppedAreaTopPixels', 467 => 'CroppedAreaTopPixels' }, + 'croppedimageheight' => { 5 => 0x2, 387 => 0x1604 }, + 'croppedimageleft' => { 5 => 0x3 }, + 'croppedimagetop' => { 5 => 0x4 }, + 'croppedimagewidth' => { 5 => 0x1, 387 => 0x1603 }, + 'cropping' => { 455 => 0x9010 }, + 'cropright' => { 123 => 0x8, 267 => 0x2e, 325 => 0x32, 366 => 0xdb, 478 => 'CropRight', 480 => 'CropRight' }, + 'croprightmargin' => { 53 => 0x1 }, + 'croprotatedoriginalheight' => { 101 => 0x2 }, + 'croprotatedoriginalwidth' => { 101 => 0x1 }, + 'croprotation' => { 101 => 0x8, 123 => 0xb }, + 'cropscaledresolution' => { 267 => 0x9e }, + 'cropsourceresolution' => { 267 => 0xae }, + 'croptop' => { 108 => 0x248, 123 => 0x7, 267 => 0x26, 301 => 0x613, 305 => 0x613, 325 => 0x2f, 366 => 0xda, 478 => 'CropTop', 480 => 'CropTop' }, + 'croptopmargin' => { 53 => 0x2 }, + 'cropunit' => { 478 => 'CropUnit', 480 => 'CropUnit' }, + 'cropunits' => { 478 => 'CropUnits', 480 => 'CropUnits' }, + 'cropw' => { 472 => 'CropW' }, + 'cropwidth' => { 101 => 0x5, 108 => 0x24a, 301 => 0x614, 305 => 0x614, 478 => 'CropWidth', 480 => 'CropWidth' }, + 'cropx' => { 101 => 0x3, 472 => 'CropX' }, + 'cropy' => { 101 => 0x4, 472 => 'CropY' }, + 'crossprocess' => { 355 => 0x7b }, + 'crossprocessparams' => { 355 => 0x235 }, + 'cuisine' => { 496 => 'cuisine' }, + 'currenticcprofile' => { 119 => 0xc691 }, + 'currentpreprofilematrix' => { 119 => 0xc692 }, + 'currentversion' => { 455 => 0xd000 }, + 'curve0x' => { 472 => 'Curve0x' }, + 'curve0y' => { 472 => 'Curve0y' }, + 'curve1x' => { 472 => 'Curve1x' }, + 'curve1y' => { 472 => 'Curve1y' }, + 'curve2x' => { 472 => 'Curve2x' }, + 'curve2y' => { 472 => 'Curve2y' }, + 'curve3x' => { 472 => 'Curve3x' }, + 'curve3y' => { 472 => 'Curve3y' }, + 'curve4x' => { 472 => 'Curve4x' }, + 'curve4y' => { 472 => 'Curve4y' }, + 'curves' => { 272 => 0x76a43201 }, + 'custom1' => { 307 => 'Custom1' }, + 'custom10' => { 307 => 'Custom10' }, + 'custom2' => { 307 => 'Custom2' }, + 'custom3' => { 307 => 'Custom3' }, + 'custom4' => { 307 => 'Custom4' }, + 'custom5' => { 307 => 'Custom5' }, + 'custom6' => { 307 => 'Custom6' }, + 'custom7' => { 307 => 'Custom7' }, + 'custom8' => { 307 => 'Custom8' }, + 'custom9' => { 307 => 'Custom9' }, + 'customcolortone' => { 109 => 0x4c }, + 'customcontrast' => { 109 => 0x4e }, + 'customcontrols' => { 84 => 0x70c }, + 'customdefaultunsharpfineness' => { 109 => 0xbe }, + 'customdefaultunsharpstrength' => { 109 => 0xbc }, + 'customdefaultunsharpthreshold' => { 109 => 0xc0 }, + 'customilluminant' => { 138 => 0x405 }, + 'customizedials' => { 84 => 0x715 }, + 'customlinear' => { 109 => 0x4f }, + 'customoutputhighlightpoint' => { 109 => 0x53 }, + 'customoutputshadowpoint' => { 109 => 0x54 }, + 'custompicturestyle' => { 103 => 0x10021 }, + 'custompicturestyledata' => { 103 => 0xf0500 }, + 'custompicturestylefilename' => { 64 => 0x4010 }, + 'customrawhighlight' => { 109 => 0x7c }, + 'customrawhighlightpoint' => { 109 => 0x51 }, + 'customrawshadow' => { 109 => 0x85 }, + 'customrawshadowpoint' => { 109 => 0x52 }, + 'customrendered' => { 119 => 0xa401, 191 => 0x6420, 484 => 'CustomRendered' }, + 'customsaturation' => { 109 => 0x4d, 297 => 0x503 }, + 'customsettingsalldefault' => { 279 => '0.2', 288 => '0.2' }, + 'customsettingsbank' => { 279 => '0.1', 280 => '0.1', 282 => '0.1', 283 => '0.1', 288 => '0.1', 292 => '0.2', 293 => '0.2', 295 => 0x1 }, + 'customsharpness' => { 109 => 0x50 }, + 'customunsharpmaskfineness' => { 109 => 0xb8 }, + 'customunsharpmaskstrength' => { 109 => 0xb6 }, + 'customunsharpmaskthreshold' => { 109 => 0xba }, + 'customwb_rblevels' => { 425 => 0x1a }, + 'customwb_rgblevels' => { 408 => 0x8, 409 => 0x19 }, + 'customwbbluelevel' => { 184 => 0x36 }, + 'customwberror' => { 184 => 0x37 }, + 'customwbgreenlevel' => { 184 => 0x35 }, + 'customwbredlevel' => { 184 => 0x34 }, + 'customwbsetting' => { 184 => 0x26 }, + 'cx' => { 380 => '_cx_' }, + 'cy' => { 380 => '_cy_' }, + 'd-lightinghq' => { 272 => 0x2175eb78 }, + 'd-lightinghqcolorboost' => { 268 => 0x2 }, + 'd-lightinghqhighlight' => { 268 => 0x1 }, + 'd-lightinghqselected' => { 272 => 0x6a6e36b6 }, + 'd-lightinghqshadow' => { 268 => 0x0 }, + 'd-lightinghs' => { 272 => 0xce5554aa }, + 'd-lightinghsadjustment' => { 269 => 0x0 }, + 'd-lightinghscolorboost' => { 269 => 0x1 }, + 'd-rangeoptimizerhighlight' => { 455 => 0x8024 }, + 'd-rangeoptimizermode' => { 455 => 0x8022 }, + 'd-rangeoptimizershadow' => { 455 => 0x802d }, + 'd-rangeoptimizervalue' => { 455 => 0x8023 }, + 'darkblacksegrows' => { 138 => 0x18d8 }, + 'darkfocusenvironment' => { 320 => 0x8003 }, + 'darkframecountfactor' => { 138 => 0xc85 }, + 'darkframelongexposure' => { 138 => 0xc84 }, + 'darkframeshortexposure' => { 138 => 0xc83 }, + 'darkpedestal' => { 138 => 0xc7f }, + 'datacompressionmethod' => { 133 => 0x6e }, + 'dataimprint' => { 181 => 0x34 }, + 'dataonscreen' => { 490 => 'DataOnScreen' }, + 'dataonscreenregion' => { 490 => [\'DataOnScreen','DataOnScreenRegion'] }, + 'dataonscreenregiond' => { 490 => [\'DataOnScreen','DataOnScreenRegionD'] }, + 'dataonscreenregionh' => { 490 => [\'DataOnScreen','DataOnScreenRegionH'] }, + 'dataonscreenregiontext' => { 490 => [\'DataOnScreen','DataOnScreenRegionText'] }, + 'dataonscreenregionunit' => { 490 => [\'DataOnScreen','DataOnScreenRegionUnit'] }, + 'dataonscreenregionw' => { 490 => [\'DataOnScreen','DataOnScreenRegionW'] }, + 'dataonscreenregionx' => { 490 => [\'DataOnScreen','DataOnScreenRegionX'] }, + 'dataonscreenregiony' => { 490 => [\'DataOnScreen','DataOnScreenRegionY'] }, + 'datascaling' => { 355 => 0x3d }, + 'date' => { 355 => 0x6, 481 => 'date' }, + 'dateacquired' => { 178 => 'DateAcquired', 179 => '{2CBAA8F5-D81F-47CA-B17A-F8D822300131} 100' }, + 'datecreated' => { 131 => 0x37, 492 => 'DateCreated' }, + 'datedisplayformat' => { 264 => 0x3 }, + 'dateidentified' => { 118 => [\'Identification','IdentificationDateIdentified'] }, + 'dateimprint' => { 284 => '4.2' }, + 'daterecieved' => { 494 => 'dateRecieved' }, + 'datesent' => { 132 => 0x46 }, + 'datestampmode' => { 64 => 0x1c, 226 => 0x9d }, + 'datetime' => { 473 => 'datetime', 500 => 'DateTime' }, + 'datetimedigitized' => { 484 => 'DateTimeDigitized' }, + 'datetimeoriginal' => { 100 => 0x0, 119 => 0x9003, 154 => 0x14, 157 => 'OriginalDate', 375 => 'IDIT', 380 => 'date', 381 => 0xb, 382 => 0x3b, 383 => 0x3e, 484 => 'DateTimeOriginal' }, + 'datetimestamp' => { 140 => 0x64 }, + 'datetimeutc' => { 297 => 0x908 }, + 'daylightsavings' => { 78 => 0x3, 264 => 0x2 }, + 'dayofweek' => { 382 => 0x42, 383 => 0x4a }, + 'dccontinent' => { 118 => [\'dctermsLocation','dctermsLocationContinent'] }, + 'dccoordinateprecision' => { 118 => [\'dctermsLocation','dctermsLocationCoordinatePrecision'] }, + 'dccoordinateuncertaintyinmeters' => { 118 => [\'dctermsLocation','dctermsLocationCoordinateUncertaintyInMeters'] }, + 'dccountry' => { 118 => [\'dctermsLocation','dctermsLocationCountry'] }, + 'dccountrycode' => { 118 => [\'dctermsLocation','dctermsLocationCountryCode'] }, + 'dccounty' => { 118 => [\'dctermsLocation','dctermsLocationCounty'] }, + 'dcdecimallatitude' => { 118 => [\'dctermsLocation','dctermsLocationDecimalLatitude'] }, + 'dcdecimallongitude' => { 118 => [\'dctermsLocation','dctermsLocationDecimalLongitude'] }, + 'dcevent' => { 118 => 'Event' }, + 'dcfootprintspatialfit' => { 118 => [\'dctermsLocation','dctermsLocationFootprintSpatialFit'] }, + 'dcfootprintsrs' => { 118 => [\'dctermsLocation','dctermsLocationFootprintSRS'] }, + 'dcfootprintwkt' => { 118 => [\'dctermsLocation','dctermsLocationFootprintWKT'] }, + 'dcgeodeticdatum' => { 118 => [\'dctermsLocation','dctermsLocationGeodeticDatum'] }, + 'dcgeoreferencedby' => { 118 => [\'dctermsLocation','dctermsLocationGeoreferencedBy'] }, + 'dcgeoreferenceddate' => { 118 => [\'dctermsLocation','dctermsLocationGeoreferencedDate'] }, + 'dcgeoreferenceprotocol' => { 118 => [\'dctermsLocation','dctermsLocationGeoreferenceProtocol'] }, + 'dcgeoreferenceremarks' => { 118 => [\'dctermsLocation','dctermsLocationGeoreferenceRemarks'] }, + 'dcgeoreferencesources' => { 118 => [\'dctermsLocation','dctermsLocationGeoreferenceSources'] }, + 'dcgeoreferenceverificationstatus' => { 118 => [\'dctermsLocation','dctermsLocationGeoreferenceVerificationStatus'] }, + 'dchighergeography' => { 118 => [\'dctermsLocation','dctermsLocationHigherGeography'] }, + 'dchighergeographyid' => { 118 => [\'dctermsLocation','dctermsLocationHigherGeographyID'] }, + 'dcisland' => { 118 => [\'dctermsLocation','dctermsLocationIsland'] }, + 'dcislandgroup' => { 118 => [\'dctermsLocation','dctermsLocationIslandGroup'] }, + 'dclocality' => { 118 => [\'dctermsLocation','dctermsLocationLocality'] }, + 'dclocationaccordingto' => { 118 => [\'dctermsLocation','dctermsLocationLocationAccordingTo'] }, + 'dclocationid' => { 118 => [\'dctermsLocation','dctermsLocationLocationID'] }, + 'dclocationremarks' => { 118 => [\'dctermsLocation','dctermsLocationLocationRemarks'] }, + 'dcmaximumdepthinmeters' => { 118 => [\'dctermsLocation','dctermsLocationMaximumDepthInMeters'] }, + 'dcmaximumdistanceabovesurfaceinmeters' => { 118 => [\'dctermsLocation','dctermsLocationMaximumDistanceAboveSurfaceInMeters'] }, + 'dcmaximumelevationinmeters' => { 118 => [\'dctermsLocation','dctermsLocationMaximumElevationInMeters'] }, + 'dcminimumdepthinmeters' => { 118 => [\'dctermsLocation','dctermsLocationMinimumDepthInMeters'] }, + 'dcminimumdistanceabovesurfaceinmeters' => { 118 => [\'dctermsLocation','dctermsLocationMinimumDistanceAboveSurfaceInMeters'] }, + 'dcminimumelevationinmeters' => { 118 => [\'dctermsLocation','dctermsLocationMinimumElevationInMeters'] }, + 'dcmunicipality' => { 118 => [\'dctermsLocation','dctermsLocationMunicipality'] }, + 'dcpointradiusspatialfit' => { 118 => [\'dctermsLocation','dctermsLocationPointRadiusSpatialFit'] }, + 'dcstateprovince' => { 118 => [\'dctermsLocation','dctermsLocationStateProvince'] }, + 'dctermslocation' => { 118 => 'dctermsLocation' }, + 'dcverbatimcoordinates' => { 118 => [\'dctermsLocation','dctermsLocationVerbatimCoordinates'] }, + 'dcverbatimcoordinatesystem' => { 118 => [\'dctermsLocation','dctermsLocationVerbatimCoordinateSystem'] }, + 'dcverbatimdepth' => { 118 => [\'dctermsLocation','dctermsLocationVerbatimDepth'] }, + 'dcverbatimelevation' => { 118 => [\'dctermsLocation','dctermsLocationVerbatimElevation'] }, + 'dcverbatimlatitude' => { 118 => [\'dctermsLocation','dctermsLocationVerbatimLatitude'] }, + 'dcverbatimlocality' => { 118 => [\'dctermsLocation','dctermsLocationVerbatimLocality'] }, + 'dcverbatimlongitude' => { 118 => [\'dctermsLocation','dctermsLocationVerbatimLongitude'] }, + 'dcverbatimsrs' => { 118 => [\'dctermsLocation','dctermsLocationVerbatimSRS'] }, + 'dcverticaldatum' => { 118 => [\'dctermsLocation','dctermsLocationVerticalDatum'] }, + 'dcwaterbody' => { 118 => [\'dctermsLocation','dctermsLocationWaterBody'] }, + 'declination' => { 165 => 'Declination' }, + 'decposition' => { 181 => 0x32 }, + 'defaultautogray' => { 478 => 'DefaultAutoGray', 480 => 'DefaultAutoGray' }, + 'defaultautotone' => { 478 => 'DefaultAutoTone', 480 => 'DefaultAutoTone' }, + 'defaultblackrender' => { 119 => 0xc7a6 }, + 'defaultcroporigin' => { 119 => 0xc61f }, + 'defaultcropsize' => { 119 => 0xc620 }, + 'defaulteraseoption' => { 84 => 0x813 }, + 'defaultscale' => { 119 => 0xc61e }, + 'defaultsspecifictoiso' => { 478 => 'DefaultsSpecificToISO', 480 => 'DefaultsSpecificToISO' }, + 'defaultsspecifictoserial' => { 478 => 'DefaultsSpecificToSerial', 480 => 'DefaultsSpecificToSerial' }, + 'defaultusercrop' => { 119 => 0xc7b5 }, + 'defectisocode' => { 138 => 0x90f }, + 'defringe' => { 478 => 'Defringe', 480 => 'Defringe' }, + 'defringegreenamount' => { 478 => 'DefringeGreenAmount', 480 => 'DefringeGreenAmount' }, + 'defringegreenhuehi' => { 478 => 'DefringeGreenHueHi', 480 => 'DefringeGreenHueHi' }, + 'defringegreenhuelo' => { 478 => 'DefringeGreenHueLo', 480 => 'DefringeGreenHueLo' }, + 'defringepurpleamount' => { 478 => 'DefringePurpleAmount', 480 => 'DefringePurpleAmount' }, + 'defringepurplehuehi' => { 478 => 'DefringePurpleHueHi', 480 => 'DefringePurpleHueHi' }, + 'defringepurplehuelo' => { 478 => 'DefringePurpleHueLo', 480 => 'DefringePurpleHueLo' }, + 'dehaze' => { 478 => 'Dehaze', 480 => 'Dehaze' }, + 'deletedimagecount' => { 226 => 0xa6, 238 => 0x6e }, + 'deprecatedon' => { 476 => 'deprecatedOn' }, + 'depthfar' => { 119 => 0xc7eb }, + 'depthformat' => { 119 => 0xc7e9 }, + 'depthimage' => { 463 => 'Data' }, + 'depthmeasuretype' => { 119 => 0xc7ed }, + 'depthnear' => { 119 => 0xc7ea }, + 'depthunits' => { 119 => 0xc7ec }, + 'derivedfrom' => { 505 => 'DerivedFrom' }, + 'derivedfromalternatepaths' => { 505 => [\'DerivedFrom','DerivedFromAlternatePaths'] }, + 'derivedfromdocumentid' => { 505 => [\'DerivedFrom','DerivedFromDocumentID'] }, + 'derivedfromfilepath' => { 505 => [\'DerivedFrom','DerivedFromFilePath'] }, + 'derivedfromfrompart' => { 505 => [\'DerivedFrom','DerivedFromFromPart'] }, + 'derivedfrominstanceid' => { 505 => [\'DerivedFrom','DerivedFromInstanceID'] }, + 'derivedfromlastmodifydate' => { 505 => [\'DerivedFrom','DerivedFromLastModifyDate'] }, + 'derivedfromlasturl' => { 505 => [\'DerivedFrom','DerivedFromLastURL'] }, + 'derivedfromlinkcategory' => { 505 => [\'DerivedFrom','DerivedFromLinkCategory'] }, + 'derivedfromlinkform' => { 505 => [\'DerivedFrom','DerivedFromLinkForm'] }, + 'derivedfrommanager' => { 505 => [\'DerivedFrom','DerivedFromManager'] }, + 'derivedfrommanagervariant' => { 505 => [\'DerivedFrom','DerivedFromManagerVariant'] }, + 'derivedfrommanageto' => { 505 => [\'DerivedFrom','DerivedFromManageTo'] }, + 'derivedfrommanageui' => { 505 => [\'DerivedFrom','DerivedFromManageUI'] }, + 'derivedfrommaskmarkers' => { 505 => [\'DerivedFrom','DerivedFromMaskMarkers'] }, + 'derivedfromoriginaldocumentid' => { 505 => [\'DerivedFrom','DerivedFromOriginalDocumentID'] }, + 'derivedfrompartmapping' => { 505 => [\'DerivedFrom','DerivedFromPartMapping'] }, + 'derivedfromplacedresolutionunit' => { 505 => [\'DerivedFrom','DerivedFromPlacedResolutionUnit'] }, + 'derivedfromplacedxresolution' => { 505 => [\'DerivedFrom','DerivedFromPlacedXResolution'] }, + 'derivedfromplacedyresolution' => { 505 => [\'DerivedFrom','DerivedFromPlacedYResolution'] }, + 'derivedfromrenditionclass' => { 505 => [\'DerivedFrom','DerivedFromRenditionClass'] }, + 'derivedfromrenditionparams' => { 505 => [\'DerivedFrom','DerivedFromRenditionParams'] }, + 'derivedfromtopart' => { 505 => [\'DerivedFrom','DerivedFromToPart'] }, + 'derivedfromversionid' => { 505 => [\'DerivedFrom','DerivedFromVersionID'] }, + 'description' => { 310 => 'Description', 372 => ['desc','dscp',"\xa9des"], 374 => 'description', 380 => 'dscp', 478 => 'Description', 480 => 'Description', 481 => 'description', 502 => 'Description' }, + 'destination' => { 132 => 0x5 }, + 'destinationcity' => { 355 => 0x24, 361 => 0x3 }, + 'destinationcitycode' => { 362 => 0x1001 }, + 'destinationdst' => { 355 => 0x26, 361 => '0.3' }, + 'developmentdynamicrange' => { 127 => 0x1403 }, + 'deviantmatrixcustom' => { 138 => 0x7de }, + 'deviantmatrixdaylight' => { 138 => 0x7da }, + 'deviantmatrixflash' => { 138 => 0x7dd }, + 'deviantmatrixfluorescent' => { 138 => 0x7dc }, + 'deviantmatrixtungsten' => { 138 => 0x7db }, + 'deviantwhitecustom' => { 138 => 0x842 }, + 'deviantwhitedaylight' => { 138 => 0x83e }, + 'deviantwhiteflash' => { 138 => 0x841 }, + 'deviantwhitefluorescent' => { 138 => 0x840 }, + 'deviantwhitetungsten' => { 138 => 0x83f }, + 'device' => { 494 => 'device' }, + 'devicesettingdescription' => { 484 => 'DeviceSettingDescription' }, + 'devicesettingdescriptioncolumns' => { 484 => [\'DeviceSettingDescription','DeviceSettingDescriptionColumns'] }, + 'devicesettingdescriptionrows' => { 484 => [\'DeviceSettingDescription','DeviceSettingDescriptionRows'] }, + 'devicesettingdescriptionsettings' => { 484 => [\'DeviceSettingDescription','DeviceSettingDescriptionSettings'] }, + 'devicetype' => { 394 => 0x2 }, + 'dewarpdata' => { 116 => 'DewarpData' }, + 'dewarpflag' => { 116 => 'DewarpFlag' }, + 'dialdirectiontvav' => { 84 => 0x706 }, + 'dietaryneeds' => { 496 => 'dietaryNeeds' }, + 'diffractioncompensation' => { 228 => 0x142, 229 => 0x1a2, 252 => 0xc4a0 }, + 'diffractioncorrection' => { 320 => 0xbc, 345 => 0x3 }, + 'diffractioncorrectionon' => { 103 => 0x2070b }, + 'digitalcreationdate' => { 131 => 0x3e }, + 'digitalcreationtime' => { 131 => 0x3f }, + 'digitaldeehighlightadj' => { 237 => 0x202 }, + 'digitaldeeshadowadj' => { 237 => 0x200 }, + 'digitaldeethreshold' => { 237 => 0x201 }, + 'digitalfilter' => { 397 => 0x59 }, + 'digitalfilter01' => { 342 => 0x5 }, + 'digitalfilter02' => { 342 => 0x16 }, + 'digitalfilter03' => { 342 => 0x27 }, + 'digitalfilter04' => { 342 => 0x38 }, + 'digitalfilter05' => { 342 => 0x49 }, + 'digitalfilter06' => { 342 => 0x5a }, + 'digitalfilter07' => { 342 => 0x6b }, + 'digitalfilter08' => { 342 => 0x7c }, + 'digitalfilter09' => { 342 => 0x8d }, + 'digitalfilter10' => { 342 => 0x9e }, + 'digitalfilter11' => { 342 => 0xaf }, + 'digitalfilter12' => { 342 => 0xc0 }, + 'digitalfilter13' => { 342 => 0xd1 }, + 'digitalfilter14' => { 342 => 0xe2 }, + 'digitalfilter15' => { 342 => 0xf3 }, + 'digitalfilter16' => { 342 => 0x104 }, + 'digitalfilter17' => { 342 => 0x115 }, + 'digitalfilter18' => { 342 => 0x126 }, + 'digitalfilter19' => { 342 => 0x137 }, + 'digitalfilter20' => { 342 => 0x148 }, + 'digitalgain' => { 74 => 0xb }, + 'digitalgem' => { 215 => 0x0 }, + 'digitalice' => { 237 => 0x100 }, + 'digitalimageguid' => { 490 => 'DigImageGUID' }, + 'digitalroc' => { 235 => 0x0 }, + 'digitalsourcefiletype' => { 490 => 'DigitalSourcefileType' }, + 'digitalsourcetype' => { 490 => 'DigitalSourceType' }, + 'digitalzoom' => { 34 => 0xc, 112 => 0xa, 127 => 0x1044, 140 => 0x68, 151 => 0x22, 152 => 0x1e, 156 => 'DigitalZoom', 181 => 0xc, 226 => 0x86, 262 => 0xa, 302 => 0x204, 355 => 0x1e, 362 => 0xa, 396 => 0x204, 442 => 0x12, 443 => 0x12 }, + 'digitalzoomon' => { 396 => 0x21b }, + 'digitalzoomratio' => { 119 => 0xa404, 431 => 0x200, 433 => 0x21c, 484 => 'DigitalZoomRatio' }, + 'director' => { 179 => 'WM/Director', 372 => "\xa9dir", 374 => 'director', 380 => "\xa9dir", 504 => 'director' }, + 'directorphotography' => { 504 => 'directorPhotography' }, + 'directory' => { 120 => 'Directory' }, + 'directoryindex' => { 7 => 0x137, 9 => 0x2dc, 11 => 0x17e, 13 => 0x238, 14 => 0x13f, 15 => 0x133, 16 => 0x1df, 17 => 0x1a7, 18 => 0x1f0, 19 => 0xcc, 20 => 0x1c7, 21 => 0x298, 22 => 0x1e7, 23 => 0x1e5, 24 => [0x27c,0x280], 25 => 0x2b6, 26 => 0x2bf, 28 => 0x1f7, 29 => 0x4ba }, + 'directoryindex2' => { 21 => 0x29c }, + 'directorynumber' => { 208 => 0x3, 383 => 0x12 }, + 'disableautocreation' => { 461 => 'DisableAutoCreation' }, + 'disclaimer' => { 310 => 'Disclaimer' }, + 'discnumber' => { 504 => 'discNumber' }, + 'dishtype' => { 496 => 'dishType' }, + 'disknumber' => { 372 => 'disk' }, + 'displayallafpoints' => { 84 => 0x514 }, + 'displayaperture' => { 34 => 0x23 }, + 'displayedunitsx' => { 370 => 0x2 }, + 'displayedunitsy' => { 370 => 0x6 }, + 'displayname' => { 374 => 'displayname', 493 => 'displayName' }, + 'distance1' => { 140 => 0x28 }, + 'distance2' => { 140 => 0x2c }, + 'distance3' => { 140 => 0x30 }, + 'distance4' => { 140 => 0x34 }, + 'distortion' => { 394 => 0xa050 }, + 'distortioncompensation' => { 455 => 0x8040 }, + 'distortioncontrol' => { 238 => 0x10 }, + 'distortioncorrection' => { 79 => 0x3, 103 => 0x20705, 109 => 0x67, 119 => 0x7036, 297 => 0x50b, 324 => '7.1', 345 => 0x0, 450 => 0x601, 451 => 0x5b }, + 'distortioncorrection2' => { 301 => 0x1011 }, + 'distortioncorrectionalreadyapplied' => { 475 => 'DistortionCorrectionAlreadyApplied' }, + 'distortioncorrectionon' => { 103 => '0x20705.0', 109 => 0x63 }, + 'distortioncorrectionsetting' => { 80 => 0x7, 420 => 0x2013 }, + 'distortioncorrectionvalue' => { 79 => 0x9 }, + 'distortioncorrparams' => { 119 => 0x7037, 430 => 0x1a23, 433 => 0x1870, 435 => 0x189c, 436 => 0x18cc, 437 => 0x17d0, 450 => 0x6ca, 451 => 0x64 }, + 'distortioncorrparamsnumber' => { 433 => 0x1899, 435 => 0x18c5, 436 => 0x18f5, 437 => 0x17f9 }, + 'distortioncorrparamspresent' => { 433 => 0x1898, 435 => 0x18c4, 436 => 0x18f4, 437 => 0x17f8, 439 => 0x10b, 440 => 0x10b, 450 => 0x600, 451 => 0x5a }, + 'distortioneffect' => { 103 => 0x20709 }, + 'distortionn' => { 324 => 0xc }, + 'distortionparam02' => { 324 => 0x2 }, + 'distortionparam04' => { 324 => 0x4 }, + 'distortionparam08' => { 324 => 0x8 }, + 'distortionparam09' => { 324 => 0x9 }, + 'distortionparam11' => { 324 => 0xb }, + 'distortionscale' => { 324 => 0x5 }, + 'distributor' => { 494 => 'distributor' }, + 'distributorproductid' => { 493 => 'distributorProductID' }, + 'dloon' => { 103 => '0x20706.0', 109 => 0xdc }, + 'dlosetting' => { 103 => 0x20706, 109 => 0xdd }, + 'dlosettingapplied' => { 102 => 0x4 }, + 'dloshootingdistance' => { 109 => 0xde }, + 'dloversion' => { 102 => 0x5 }, + 'dmcomment' => { 504 => 'comment' }, + 'dmdithermatrix' => { 138 => 0xc7a }, + 'dmdithermatrixheight' => { 138 => 0xc7c }, + 'dmdithermatrixwidth' => { 138 => 0xc7b }, + 'dngadobedata' => { 119 => 0xc634 }, + 'dngbackwardversion' => { 119 => 0xc613 }, + 'dngignoresidecars' => { 478 => 'DNGIgnoreSidecars', 480 => 'DNGIgnoreSidecars' }, + 'dnglensinfo' => { 119 => 0xc630 }, + 'dngprivatedata' => { 119 => 0xc634 }, + 'dngversion' => { 119 => 0xc612 }, + 'document' => { 310 => 'Document' }, + 'documentancestors' => { 492 => 'DocumentAncestors' }, + 'documenthistory' => { 131 => 0xe7 }, + 'documentid' => { 505 => 'DocumentID' }, + 'documentname' => { 119 => 0x10d }, + 'documentnotes' => { 131 => 0xe6 }, + 'doi' => { 494 => 'doi' }, + 'dopesheet' => { 490 => 'Dopesheet' }, + 'dopesheetlink' => { 490 => 'DopesheetLink' }, + 'dopesheetlinklink' => { 490 => [\'DopesheetLink','DopesheetLinkLink'] }, + 'dopesheetlinklinkqualifier' => { 490 => [\'DopesheetLink','DopesheetLinkLinkQualifier'] }, + 'doublingmicrovolts' => { 138 => 0xc82 }, + 'dpp' => { 473 => 'dpp' }, + 'dr4cameramodel' => { 104 => 0x3 }, + 'drangepriority' => { 127 => 0x1443 }, + 'drangepriorityauto' => { 127 => 0x1444 }, + 'drangepriorityfixed' => { 127 => 0x1445 }, + 'drivemode' => { 113 => 0x3103, 125 => '0.1', 181 => 0x6, 184 => 0x1e, 187 => 0xe, 191 => 0x64d0, 297 => 0x600, 355 => 0x34, 387 => 0x1002, 397 => 0x3, 407 => 0x4, 408 => 0x7e, 409 => 0x34 }, + 'drivemode2' => { 184 => 0xa, 336 => 0x7, 418 => 0xe, 425 => 0x1 }, + 'drivemodesetting' => { 409 => 0x4 }, + 'drivespeed' => { 125 => '0.2' }, + 'dspfirmwareversion' => { 355 => 0x27 }, + 'duration' => { 67 => 0x6a, 155 => 'Duration', 169 => 'Duration', 496 => 'duration', 504 => 'duration' }, + 'durationscale' => { 504 => [\'duration','durationScale'] }, + 'durationvalue' => { 504 => [\'duration','durationValue'] }, + 'dustremovaldata' => { 64 => 0x97 }, + 'dxcropalert' => { 229 => 0x23c }, + 'dynamicafarea' => { 279 => '1.4', 288 => '1.4' }, + 'dynamicareaafassist' => { 295 => 0x18 }, + 'dynamicareaafdisplay' => { 280 => '46.1', 282 => '47.1', 283 => '47.1', 292 => '47.1', 293 => '47.1' }, + 'dynamicrange' => { 127 => 0x1400 }, + 'dynamicrangeexpansion' => { 355 => 0x69, 387 => 0x100e }, + 'dynamicrangemax' => { 108 => 0x7c }, + 'dynamicrangemin' => { 108 => 0x7a }, + 'dynamicrangeoptimizer' => { 184 => 0x15, 420 => [0xb025,0xb04f], 429 => 0x1144, 430 => [0x1144,0x324], 431 => [0x1120,0x300], 432 => [0x119c,0x37c], 433 => [0x1178,0x328], 434 => [0x1030,0x50], 435 => [0x228,0x50], 436 => [0x228,0x50], 437 => [0x21b,0x4e] }, + 'dynamicrangeoptimizerbracket' => { 418 => 0x2e }, + 'dynamicrangeoptimizerlevel' => { 407 => 0x19, 408 => 0x17, 409 => 0xd, 418 => 0x79, 425 => 0x5 }, + 'dynamicrangeoptimizermode' => { 187 => 0x15, 407 => 0x18, 408 => 0x16, 418 => [0x77,0x15] }, + 'dynamicrangeoptimizersetting' => { 184 => 0x27, 409 => 0xc, 425 => 0x4 }, + 'dynamicrangesetting' => { 127 => 0x1402 }, + 'e-dialinprogram' => { 336 => '1.3' }, + 'earliestageorloweststage' => { 118 => [\'GeologicalContext','GeologicalContextEarliestAgeOrLowestStage'] }, + 'earliesteonorlowesteonothem' => { 118 => [\'GeologicalContext','GeologicalContextEarliestEonOrLowestEonothem'] }, + 'earliestepochorlowestseries' => { 118 => [\'GeologicalContext','GeologicalContextEarliestEpochOrLowestSeries'] }, + 'earliesteraorlowesterathem' => { 118 => [\'GeologicalContext','GeologicalContextEarliestEraOrLowestErathem'] }, + 'earliestperiodorlowestsystem' => { 118 => [\'GeologicalContext','GeologicalContextEarliestPeriodOrLowestSystem'] }, + 'earthpos' => { 458 => 'EarthPos' }, + 'earthposaltitude' => { 458 => [\'EarthPos','EarthPosAltitude'] }, + 'earthposlatitude' => { 458 => [\'EarthPos','EarthPosLatitude'] }, + 'earthposlongitude' => { 458 => [\'EarthPos','EarthPosLongitude'] }, + 'earthposrotationw' => { 458 => [\'EarthPos','EarthPosRotationW'] }, + 'earthposrotationx' => { 458 => [\'EarthPos','EarthPosRotationX'] }, + 'earthposrotationy' => { 458 => [\'EarthPos','EarthPosRotationY'] }, + 'earthposrotationz' => { 458 => [\'EarthPos','EarthPosRotationZ'] }, + 'earthpostimestamp' => { 458 => [\'EarthPos','EarthPosTimestamp'] }, + 'easyexposurecomp' => { 294 => '6.1' }, + 'easyexposurecompensation' => { 279 => '6.4', 280 => '6.5', 282 => '6.3', 283 => '6.3', 287 => '5.1', 288 => '4.4', 289 => '5.2', 292 => '6.3', 293 => '6.3', 295 => 0x1d }, + 'easymode' => { 34 => 0xb }, + 'edgemapslope' => { 138 => 0x930 }, + 'edgemapx1' => { 138 => 0x931 }, + 'edgemapx2' => { 138 => 0x932 }, + 'edgemapx3' => { 138 => 0x934 }, + 'edgemapx4' => { 138 => 0x935 }, + 'edgenoisereduction' => { 273 => 0x4, 455 => 0x8028 }, + 'edit1' => { 380 => "\xa9ed1" }, + 'edit2' => { 380 => "\xa9ed2" }, + 'edit3' => { 380 => "\xa9ed3" }, + 'edit4' => { 380 => "\xa9ed4" }, + 'edit5' => { 380 => "\xa9ed5" }, + 'edit6' => { 380 => "\xa9ed6" }, + 'edit7' => { 380 => "\xa9ed7" }, + 'edit8' => { 380 => "\xa9ed8" }, + 'edit9' => { 380 => "\xa9ed9" }, + 'edition' => { 494 => 'edition' }, + 'editorialupdate' => { 131 => 0x8 }, + 'editstatus' => { 131 => 0x7, 367 => 'EditStatus', 473 => 'EditStatus' }, + 'editversionname' => { 272 => 0x3d136244 }, + 'effectivelv' => { 355 => 0x2d }, + 'effectivemaxaperture' => { 219 => 0x12, 220 => 0x13, 224 => 0x14 }, + 'eissn' => { 494 => 'eIssn' }, + 'electricalblackcolumns' => { 138 => 0x1810 }, + 'electronicfront-curtainshutter' => { 282 => '5.2', 283 => '5.2', 292 => '5.3', 293 => '5.2' }, + 'electronicfrontcurtainshutter' => { 420 => 0x201a }, + 'elevation' => { 165 => 'Elevation' }, + 'email' => { 157 => 'EMail' }, + 'embargodate' => { 497 => 'embargoDate' }, + 'embdencrightsexpr' => { 490 => 'EmbdEncRightsExpr' }, + 'embeddedencodedrightsexpr' => { 490 => [\'EmbdEncRightsExpr','EmbdEncRightsExprEncRightsExpr'] }, + 'embeddedencodedrightsexprlangid' => { 490 => [\'EmbdEncRightsExpr','EmbdEncRightsExprRightsExprLangId'] }, + 'embeddedencodedrightsexprtype' => { 490 => [\'EmbdEncRightsExpr','EmbdEncRightsExprRightsExprEncType'] }, + 'embeddedxmpdigest' => { 492 => 'EmbeddedXMPDigest' }, + 'emissivity' => { 121 => 0x3 }, + 'emptyslotrelease' => { 229 => 0x625 }, + 'enablechromanoisereduction' => { 138 => 0xe6e }, + 'enablesharpening' => { 138 => 0x92e }, + 'encodedby' => { 179 => 'WM/EncodedBy', 372 => "\xa9enc" }, + 'encodedwith' => { 374 => 'Encoded_With' }, + 'encoder' => { 372 => "\xa9too", 380 => "\xa9too" }, + 'encoderid' => { 380 => "\xa9enc" }, + 'encodingtime' => { 179 => 'WM/EncodingTime' }, + 'encryptionkey' => { 394 => 0xa020 }, + 'endingpage' => { 494 => 'endingPage' }, + 'enduser' => { 307 => 'EndUser' }, + 'enduserid' => { 307 => [\'EndUser','EndUserEndUserID'] }, + 'endusername' => { 307 => [\'EndUser','EndUserEndUserName'] }, + 'energysavingmode' => { 229 => 0x648 }, + 'engineer' => { 504 => 'engineer' }, + 'enhancedarktones' => { 265 => 0x8 }, + 'enhancement' => { 112 => 0x16, 113 => 0x3016 }, + 'enhanceparams' => { 119 => 0xc7ee }, + 'enhancer' => { 301 => 0x300 }, + 'enhancervalues' => { 301 => 0x301 }, + 'envelopenumber' => { 132 => 0x28 }, + 'envelopepriority' => { 132 => 0x3c }, + 'enveloperecordversion' => { 132 => 0x0 }, + 'episode' => { 490 => 'Episode' }, + 'episodeglobaluniqueid' => { 372 => 'egid' }, + 'episodeidentifier' => { 490 => [\'Episode','EpisodeIdentifier'] }, + 'episodename' => { 490 => [\'Episode','EpisodeName'] }, + 'episodenumber' => { 490 => [\'Episode','EpisodeNumber'] }, + 'epsonimageheight' => { 302 => 0x20c }, + 'epsonimagewidth' => { 302 => 0x20b }, + 'epsonsoftware' => { 302 => 0x20d }, + 'equipmentinstitution' => { 457 => 'EquipmentInstitution' }, + 'equipmentmanufacturer' => { 457 => 'EquipmentManufacturer' }, + 'equipmentversion' => { 298 => 0x0 }, + 'ettlii' => { 84 => 0x304, 85 => 0xd, 86 => 0xe, 87 => 0x7, 88 => 0x7, 89 => 0xe }, + 'event' => { 459 => 'Event', 471 => 'Event', 490 => 'Event', 494 => 'event' }, + 'eventalias' => { 493 => 'eventAlias' }, + 'eventdate' => { 118 => [\'Event','EventEventDate'] }, + 'eventday' => { 118 => [\'Event','EventDay'] }, + 'eventearliestdate' => { 118 => [\'Event','EventEarliestDate'] }, + 'eventend' => { 493 => 'eventEnd' }, + 'eventenddayofyear' => { 118 => [\'Event','EventEndDayOfYear'] }, + 'eventfieldnotes' => { 118 => [\'Event','EventFieldNotes'] }, + 'eventfieldnumber' => { 118 => [\'Event','EventFieldNumber'] }, + 'eventhabitat' => { 118 => [\'Event','EventHabitat'] }, + 'eventid' => { 118 => [\'Event','EventEventID'], 490 => 'EventId' }, + 'eventlatestdate' => { 118 => [\'Event','EventLatestDate'] }, + 'eventmonth' => { 118 => [\'Event','EventMonth'] }, + 'eventnumber' => { 381 => 0x9, 382 => 0x37, 383 => 0x3a }, + 'eventparenteventid' => { 118 => [\'Event','EventParentEventID'] }, + 'eventremarks' => { 118 => [\'Event','EventEventRemarks'] }, + 'eventsamplesizeunit' => { 118 => [\'Event','EventSampleSizeUnit'] }, + 'eventsamplesizevalue' => { 118 => [\'Event','EventSampleSizeValue'] }, + 'eventsamplingeffort' => { 118 => [\'Event','EventSamplingEffort'] }, + 'eventsamplingprotocol' => { 118 => [\'Event','EventSamplingProtocol'] }, + 'eventstart' => { 493 => 'eventStart' }, + 'eventstartdayofyear' => { 118 => [\'Event','EventStartDayOfYear'] }, + 'eventsubtype' => { 493 => 'eventSubtype' }, + 'eventtime' => { 118 => [\'Event','EventEventTime'] }, + 'eventtype' => { 493 => 'eventType' }, + 'eventverbatimeventdate' => { 118 => [\'Event','EventVerbatimEventDate'] }, + 'eventyear' => { 118 => [\'Event','EventYear'] }, + 'evfgrid' => { 295 => 0x165 }, + 'evfimageframe' => { 295 => 0x164 }, + 'evfreleaseindicator' => { 295 => 0x24f }, + 'evfwarmdisplaybrightness' => { 295 => 0x24d }, + 'evfwarmdisplaymode' => { 295 => 0x24b }, + 'evsteps' => { 336 => '1.2', 338 => 0x0 }, + 'evstepsize' => { 284 => '5.1', 285 => '6.1', 286 => '6.1', 290 => '0.7' }, + 'exclusivecoverage' => { 468 => 'ExclusiveCoverage' }, + 'exclusivityenddate' => { 497 => 'exclusivityEndDate' }, + 'excursiontolerance' => { 133 => 0x82 }, + 'executiveproducer' => { 372 => "\xa9xpd" }, + 'exif' => { 120 => 'EXIF' }, + 'exifbyteorder' => { 120 => 'ExifByteOrder' }, + 'exifcamerainfo' => { 131 => 0xe8 }, + 'exifimageheight' => { 119 => 0xa003, 484 => 'PixelYDimension' }, + 'exifimagewidth' => { 119 => 0xa002, 484 => 'PixelXDimension' }, + 'exifunicodebyteorder' => { 120 => 'ExifUnicodeByteOrder' }, + 'exifversion' => { 119 => 0x9000, 484 => 'ExifVersion' }, + 'exitpupilposition' => { 219 => 0x4, 220 => 0x4, 224 => 0x4 }, + 'expirationdate' => { 131 => 0x25, 497 => 'expirationDate' }, + 'expirationtime' => { 131 => 0x26 }, + 'exposure' => { 119 => 0xfe51, 478 => 'Exposure', 480 => 'Exposure' }, + 'exposure2012' => { 478 => 'Exposure2012', 480 => 'Exposure2012' }, + 'exposureadj' => { 270 => 0x0 }, + 'exposureadj2' => { 270 => 0x12 }, + 'exposureadjust' => { 397 => 0xc }, + 'exposurebracketingindicatorlast' => { 184 => 0x52 }, + 'exposurebracketshotnumber' => { 187 => 0x2d, 418 => 0x2f }, + 'exposurebracketstepsize' => { 336 => 0x8 }, + 'exposurebracketvalue' => { 226 => 0x19 }, + 'exposurecompautocancel' => { 84 => 0x113 }, + 'exposurecompensation' => { 77 => 0x6, 93 => 0x0, 119 => 0x9204, 140 => 0x24, 156 => 'ExposureComp', 176 => 'ExposureCompensation', 181 => 0xd, 182 => 0x53, 183 => 0x1e, 187 => 0x49c0, 302 => 0x1006, 355 => 0x16, 364 => 0x402, 394 => 0xa013, 397 => [0xc,0x35,0x4d], 429 => 0x114c, 430 => 0x114c, 431 => 0x1128, 433 => 0x1180, 434 => 0x1038, 435 => 0x230, 436 => 0x230, 437 => 0x223, 484 => 'ExposureBiasValue' }, + 'exposurecompensation2' => { 425 => [0x24,0x26,0x2a] }, + 'exposurecompensationmode' => { 184 => 0x47, 187 => 0x2a }, + 'exposurecompensationset' => { 407 => 0x3, 408 => 0x3, 409 => 0x3, 425 => 0x1e }, + 'exposurecompensationsetting' => { 184 => 0x1 }, + 'exposurecompstepsize' => { 279 => '6.3', 280 => '7.3', 282 => '7.3', 283 => '7.3', 288 => '4.3', 292 => '7.3', 293 => '7.3' }, + 'exposurecontrolstep' => { 287 => '6.1', 289 => '6.1' }, + 'exposurecontrolstepsize' => { 279 => '6.2', 280 => '7.1', 282 => '7.1', 283 => '7.1', 288 => '4.2', 292 => '7.1', 293 => '7.1', 294 => '7.1', 295 => 0x1b }, + 'exposurecount' => { 127 => 0x1032 }, + 'exposuredelaymode' => { 279 => '10.1', 280 => '11.1', 282 => '11.1', 283 => '11.1', 284 => '9.1', 285 => '10.1', 286 => '10.1', 288 => '10.4', 289 => '10.1', 290 => '6.4', 292 => '11.1', 293 => '11.1', 294 => '11.2' }, + 'exposuredifference' => { 226 => 0xe }, + 'exposuregaincustom' => { 138 => 0x89c }, + 'exposuregaindaylight' => { 138 => 0x898 }, + 'exposuregainflash' => { 138 => 0x89b }, + 'exposuregainfluorescent' => { 138 => 0x89a }, + 'exposuregaintungsten' => { 138 => 0x899 }, + 'exposureindex' => { 119 => 0xa215, 484 => 'ExposureIndex' }, + 'exposureindicator' => { 184 => 0x50 }, + 'exposurelevelincrements' => { 82 => 0x6, 83 => 0x6, 84 => 0x101, 85 => 0x5, 86 => 0x6, 87 => 0x5, 88 => 0x5, 89 => 0x6, 90 => 0x4, 407 => 0x58, 408 => 0x58 }, + 'exposurelockused' => { 466 => 'ExposureLockUsed' }, + 'exposuremode' => { 119 => 0xa402, 156 => 'ExposureMode', 181 => 0x1, 182 => 0xa, 183 => 0x0, 184 => 0x0, 187 => 0x34, 297 => 0x200, 317 => 0x40d, 397 => 0x8, 420 => 0xb041, 484 => 'ExposureMode' }, + 'exposuremodeinmanual' => { 84 => 0x10b }, + 'exposureprogram' => { 119 => 0x8822, 387 => 0x1001, 400 => [0x17e,0x43], 407 => 0x3c, 408 => 0x3c, 409 => 0x5, 413 => 0x14, 418 => 0x3f, 425 => 0x2, 429 => 0x1175, 430 => 0x1179, 431 => 0x1155, 432 => 0x11d1, 433 => 0x11ad, 434 => 0x1065, 435 => 0x25d, 436 => 0x25d, 437 => 0x24c, 447 => 0xb, 448 => 0xc, 449 => 0xb, 451 => 0x48, 484 => 'ExposureProgram' }, + 'exposureshift' => { 297 => 0x203 }, + 'exposurestandardadjustment' => { 420 => 0x202d }, + 'exposuretime' => { 7 => 0x4, 8 => 0x4, 9 => 0x4, 10 => 0x4, 11 => 0x4, 12 => 0x4, 13 => 0x4, 14 => 0x4, 15 => 0x4, 16 => 0x4, 17 => 0x4, 18 => 0x4, 19 => 0x4, 20 => 0x4, 21 => 0x4, 22 => 0x4, 23 => 0x4, 24 => 0x4, 25 => 0x4, 26 => 0x4, 27 => 0x4, 28 => 0x4, 29 => 0x4, 30 => 0x6, 31 => 0x7, 77 => 0x16, 119 => 0x829a, 137 => 0xfd05, 140 => 0x20, 142 => 0xfa24, 144 => 0xf104, 147 => 0x12, 149 => 0x38, 151 => 0x14, 152 => 0x10, 154 => 0x10, 156 => 'ExposureTime', 181 => 0x9, 182 => 0x35, 183 => 0x48, 184 => 0x8, 187 => 0x49b8, 355 => 0x12, 394 => 0xa018, 397 => [0x32,0x4a], 407 => 0x0, 408 => 0x0, 425 => [0x21,0x23,0x27], 451 => 0x10, 484 => 'ExposureTime' }, + 'exposuretime2' => { 397 => [0x33,0x4b] }, + 'exposuretuning' => { 226 => 0x1c }, + 'exposurevalue' => { 138 => 0x3 }, + 'exposurewarning' => { 127 => 0x1302 }, + 'exrauto' => { 127 => 0x1033 }, + 'exrmode' => { 127 => 0x1034 }, + 'extdescraccessibility' => { 489 => 'ExtDescrAccessibility' }, + 'extendedmenubanks' => { 229 => 0x114 }, + 'extendedshutterspeeds' => { 295 => 0x102 }, + 'extendedwbdetect' => { 297 => 0x902 }, + 'extender' => { 298 => 0x301 }, + 'extenderfirmwareversion' => { 298 => 0x304 }, + 'extendermagnification' => { 158 => 'Magnification' }, + 'extendermake' => { 158 => 'Make' }, + 'extendermodel' => { 158 => 'Model', 298 => 0x303 }, + 'extenderserialnumber' => { 158 => 'SerialNumber', 298 => 0x302 }, + 'extenderstatus' => { 353 => 0x3 }, + 'externalflash' => { 300 => 0x1201 }, + 'externalflashae1' => { 302 => 0x101f }, + 'externalflashae1_0' => { 302 => 0x101b }, + 'externalflashae2' => { 302 => 0x1020 }, + 'externalflashae2_0' => { 302 => 0x101c }, + 'externalflashbounce' => { 300 => 0x1204, 302 => 0x1026, 343 => 0x1a }, + 'externalflashcompensation' => { 211 => 0x1b }, + 'externalflashexposurecomp' => { 226 => 0x17, 343 => 0x19 }, + 'externalflashfirmware' => { 209 => 0x6, 210 => 0x6, 211 => 0x6, 212 => 0x6, 213 => 0x6, 214 => 0x6 }, + 'externalflashflags' => { 209 => 0x8, 210 => 0x8, 211 => 0x8, 212 => 0x8 }, + 'externalflashguidenumber' => { 300 => 0x1203, 343 => '24.1' }, + 'externalflashgvalue' => { 302 => 0x1025 }, + 'externalflashmode' => { 302 => 0x1028, 343 => 0x2 }, + 'externalflashreadystate' => { 213 => '9.1' }, + 'externalflashstatus' => { 213 => '8.2' }, + 'externalflashzoom' => { 300 => 0x1205, 302 => 0x1027 }, + 'externalflashzoomoverride' => { 213 => '8.1' }, + 'externalmetadatalink' => { 490 => 'ExternalMetadataLink' }, + 'externalsensorbrightnessvalue' => { 315 => 0x311, 318 => 0x311, 319 => 0x311, 322 => 0x3408 }, + 'extrainfoversion' => { 411 => 0x1a }, + 'eyestartaf' => { 184 => 0x40 }, + 'fac100per' => { 138 => 0xe94 }, + 'fac170per' => { 138 => 0xe93 }, + 'fac18per' => { 138 => 0xe92 }, + 'face10position' => { 110 => 0x3f4, 111 => 0x1ec, 207 => 0x28, 340 => 0x12 }, + 'face10size' => { 341 => 0x12 }, + 'face11position' => { 207 => 0x2c, 340 => 0x14 }, + 'face11size' => { 341 => 0x14 }, + 'face12position' => { 207 => 0x30, 340 => 0x16 }, + 'face12size' => { 341 => 0x16 }, + 'face13position' => { 340 => 0x18 }, + 'face13size' => { 341 => 0x18 }, + 'face14position' => { 340 => 0x1a }, + 'face14size' => { 341 => 0x1a }, + 'face15position' => { 340 => 0x1c }, + 'face15size' => { 341 => 0x1c }, + 'face16position' => { 340 => 0x1e }, + 'face16size' => { 341 => 0x1e }, + 'face17position' => { 340 => 0x20 }, + 'face17size' => { 341 => 0x20 }, + 'face18position' => { 340 => 0x22 }, + 'face18size' => { 341 => 0x22 }, + 'face19position' => { 340 => 0x24 }, + 'face19size' => { 341 => 0x24 }, + 'face1position' => { 54 => 0x8, 110 => 0xd, 111 => 0x18, 207 => 0x4, 312 => 0x1, 340 => 0x0, 384 => 0xbc, 414 => 0x1, 415 => 0x0, 416 => 0x0, 417 => 0x5b }, + 'face1size' => { 341 => 0x0 }, + 'face20position' => { 340 => 0x26 }, + 'face20size' => { 341 => 0x26 }, + 'face21position' => { 340 => 0x28 }, + 'face21size' => { 341 => 0x28 }, + 'face22position' => { 340 => 0x2a }, + 'face22size' => { 341 => 0x2a }, + 'face23position' => { 340 => 0x2c }, + 'face23size' => { 341 => 0x2c }, + 'face24position' => { 340 => 0x2e }, + 'face24size' => { 341 => 0x2e }, + 'face25position' => { 340 => 0x30 }, + 'face25size' => { 341 => 0x30 }, + 'face26position' => { 340 => 0x32 }, + 'face26size' => { 341 => 0x32 }, + 'face27position' => { 340 => 0x34 }, + 'face27size' => { 341 => 0x34 }, + 'face28position' => { 340 => 0x36 }, + 'face28size' => { 341 => 0x36 }, + 'face29position' => { 340 => 0x38 }, + 'face29size' => { 341 => 0x38 }, + 'face2position' => { 54 => 0xa, 110 => 0x7c, 111 => 0x4c, 207 => 0x8, 312 => 0x5, 340 => 0x2, 384 => 0xc8, 414 => 0x6, 415 => 0x20, 416 => 0x25, 417 => 0x65 }, + 'face2size' => { 341 => 0x2 }, + 'face30position' => { 340 => 0x3a }, + 'face30size' => { 341 => 0x3a }, + 'face31position' => { 340 => 0x3c }, + 'face31size' => { 341 => 0x3c }, + 'face32position' => { 340 => 0x3e }, + 'face32size' => { 341 => 0x3e }, + 'face3position' => { 54 => 0xc, 110 => 0xeb, 111 => 0x80, 207 => 0xc, 312 => 0x9, 340 => 0x4, 384 => 0xd4, 414 => 0xb, 415 => 0x40, 416 => 0x4a, 417 => 0x6f }, + 'face3size' => { 341 => 0x4 }, + 'face4position' => { 54 => 0xe, 110 => 0x15a, 111 => 0xb4, 207 => 0x10, 312 => 0xd, 340 => 0x6, 384 => 0xe0, 414 => 0x10, 415 => 0x60, 416 => 0x6f, 417 => 0x79 }, + 'face4size' => { 341 => 0x6 }, + 'face5position' => { 54 => 0x10, 110 => 0x1c9, 111 => 0xe8, 207 => 0x14, 312 => 0x11, 340 => 0x8, 384 => 0xec, 414 => 0x15, 415 => 0x80, 416 => 0x94 }, + 'face5size' => { 341 => 0x8 }, + 'face6position' => { 54 => 0x12, 110 => 0x238, 111 => 0x11c, 207 => 0x18, 340 => 0xa, 384 => 0xf8, 414 => 0x1a, 415 => 0xa0, 416 => 0xb9 }, + 'face6size' => { 341 => 0xa }, + 'face7position' => { 54 => 0x14, 110 => 0x2a7, 111 => 0x150, 207 => 0x1c, 340 => 0xc, 384 => 0x104, 414 => 0x1f, 415 => 0xc0, 416 => 0xde }, + 'face7size' => { 341 => 0xc }, + 'face8position' => { 54 => 0x16, 110 => 0x316, 111 => 0x184, 207 => 0x20, 340 => 0xe, 384 => 0x110, 414 => 0x24, 415 => 0xe0, 416 => 0x103 }, + 'face8size' => { 341 => 0xe }, + 'face9position' => { 54 => 0x18, 110 => 0x385, 111 => 0x1b8, 207 => 0x24, 340 => 0x10 }, + 'face9size' => { 341 => 0x10 }, + 'facebalanceorigi' => { 472 => 'FaceBalanceOrigI' }, + 'facebalanceorigq' => { 472 => 'FaceBalanceOrigQ' }, + 'facebalancestrength' => { 472 => 'FaceBalanceStrength' }, + 'facebalancewarmth' => { 472 => 'FaceBalanceWarmth' }, + 'facedetect' => { 355 => 0x76, 394 => 0x100 }, + 'facedetectarea' => { 301 => 0x1201 }, + 'facedetectframecrop' => { 301 => 0x1207 }, + 'facedetectframesize' => { 54 => 0x3, 110 => 0x1, 111 => 0x4, 207 => 0x1, 301 => 0x1203, 355 => 0x77, 384 => 0xb6 }, + 'facedetection' => { 409 => 0x30, 425 => 0x19 }, + 'faceelementpositions' => { 127 => 0x4203 }, + 'faceelementselected' => { 127 => 0x4005 }, + 'faceelementtypes' => { 127 => 0x4201 }, + 'faceid' => { 474 => 'FaceID' }, + 'faceinfounknown' => { 113 => 0x2089 }, + 'facename' => { 394 => 0x123 }, + 'faceorientation' => { 111 => 0x8 }, + 'faceposition' => { 339 => 0x2, 395 => 0x4 }, + 'facepositions' => { 127 => 0x4103 }, + 'facerecognition' => { 394 => 0x120 }, + 'facesdetected' => { 54 => 0x2, 55 => 0x2, 56 => 0x3, 110 => 0x0, 111 => 0x2, 113 => 0x211c, 127 => 0x4100, 207 => 0x3, 301 => 0x1200, 320 => 0x3f, 339 => 0x0, 384 => 0xb5, 395 => 0x0, 414 => 0x0, 417 => 0x3, 428 => 0x30 }, + 'facesrecognized' => { 313 => 0x0 }, + 'facewidth' => { 55 => 0x1 }, + 'fade' => { 420 => 0x2034 }, + 'faithfuloutputhighlightpoint' => { 109 => 0x38 }, + 'faithfuloutputshadowpoint' => { 109 => 0x39 }, + 'faithfulrawcolortone' => { 109 => 0x31 }, + 'faithfulrawcontrast' => { 109 => 0x33 }, + 'faithfulrawhighlight' => { 109 => 0x79 }, + 'faithfulrawhighlightpoint' => { 109 => 0x36 }, + 'faithfulrawlinear' => { 109 => 0x34 }, + 'faithfulrawsaturation' => { 109 => 0x32 }, + 'faithfulrawshadow' => { 109 => 0x82 }, + 'faithfulrawshadowpoint' => { 109 => 0x37 }, + 'faithfulrawsharpness' => { 109 => 0x35 }, + 'faithfulunsharpmaskfineness' => { 109 => 0xac }, + 'faithfulunsharpmaskstrength' => { 109 => 0xaa }, + 'faithfulunsharpmaskthreshold' => { 109 => 0xae }, + 'far' => { 463 => 'Far' }, + 'fastresetlinetime' => { 138 => 0x1860 }, + 'feedidentifier' => { 490 => 'FeedIdentifier' }, + 'femicroadjustment' => { 84 => 0x111 }, + 'ffid' => { 482 => 'ffid' }, + 'field' => { 493 => 'field' }, + 'fieldcount' => { 302 => 0x103f }, + 'fieldofview' => { 380 => "FOV\x00" }, + 'fifoenonepixeldelay' => { 138 => 0x1901 }, + 'filecreatedate' => { 120 => 'FileCreateDate' }, + 'filedatarate' => { 504 => 'fileDataRate' }, + 'fileformat' => { 95 => 0x0, 132 => 0x14, 397 => [0x22,0x26], 420 => 0xb000 }, + 'filegroupid' => { 120 => 'FileGroupID' }, + 'fileindex' => { 7 => 0x143, 9 => 0x2d0, 11 => 0x172, 13 => 0x22c, 14 => 0x133, 15 => 0x13f, 16 => 0x1d3, 17 => 0x19b, 18 => 0x1e4, 19 => 0xd0, 20 => 0x1bb, 21 => 0x28c, 22 => 0x1db, 23 => 0x1d9, 24 => [0x270,0x274], 25 => 0x2aa, 26 => 0x2b3, 28 => 0x1eb, 29 => 0x4ae, 321 => 0x0 }, + 'fileindex2' => { 21 => 0x290 }, + 'filemodifydate' => { 120 => 'FileModifyDate' }, + 'filename' => { 120 => 'FileName' }, + 'filenameasdelivered' => { 307 => 'FileNameAsDelivered' }, + 'filenumber' => { 57 => 0x1, 64 => 0x8, 97 => 0x1817, 114 => 'Canon-FileNumber', 208 => 0x4, 383 => 0x10 }, + 'filenumbermemory' => { 181 => 0x1a }, + 'filenumbersequence' => { 279 => '12.2', 284 => '3.1', 285 => '4.1', 286 => '4.1', 288 => '11.1', 289 => '4.3', 294 => '5.2', 295 => 0x48 }, + 'filepermissions' => { 120 => 'FilePermissions' }, + 'filesource' => { 119 => 0xa300, 127 => 0x8000, 484 => 'FileSource' }, + 'fileuserid' => { 120 => 'FileUserID' }, + 'fileversion' => { 132 => 0x16 }, + 'fillflashautoreduction' => { 82 => 0xe, 83 => 0xe, 90 => 0xa }, + 'filllight' => { 478 => 'FillLight', 480 => 'FillLight' }, + 'fillorder' => { 119 => 0x10a }, + 'filmgraineffect' => { 297 => 0x538 }, + 'filmmode' => { 127 => 0x1401, 317 => 0x412, 320 => 0x42 }, + 'filmtype' => { 237 => 0x2 }, + 'filtereffect' => { 57 => 0xe, 231 => 0x37, 232 => 0x3f, 233 => 0x47, 320 => 0xa1 }, + 'filtereffectauto' => { 71 => 0xa0 }, + 'filtereffectfaithful' => { 70 => 0x70, 71 => 0x70 }, + 'filtereffectlandscape' => { 70 => 0x40, 71 => 0x40 }, + 'filtereffectmonochrome' => { 19 => 0xff, 70 => 0x88, 71 => 0x88 }, + 'filtereffectneutral' => { 70 => 0x58, 71 => 0x58 }, + 'filtereffectportrait' => { 70 => 0x28, 71 => 0x28 }, + 'filtereffectstandard' => { 70 => 0x10, 71 => 0x10 }, + 'filtereffectuserdef1' => { 70 => 0xa0, 71 => 0xb8 }, + 'filtereffectuserdef2' => { 70 => 0xb8, 71 => 0xd0 }, + 'filtereffectuserdef3' => { 70 => 0xd0, 71 => 0xe8 }, + 'finderdisplayduringexposure' => { 83 => 0x1 }, + 'finesharpness' => { 355 => 0x70 }, + 'finetuneoptcenterweighted' => { 279 => '7.2', 280 => '9.1', 282 => '9.1', 283 => '9.1', 287 => '8.1', 292 => '9.1', 293 => '9.1', 294 => '9.1', 295 => 0x23 }, + 'finetuneopthighlightweighted' => { 282 => '46.1', 283 => '46.1', 292 => '46.1', 293 => '46.1', 295 => 0x27 }, + 'finetuneoptmatrixmetering' => { 279 => '8.1', 280 => '8.2', 282 => '8.2', 283 => '8.2', 287 => '7.2', 288 => '6.1', 292 => '8.2', 293 => '8.2', 294 => '8.2', 295 => 0x21 }, + 'finetuneoptspotmetering' => { 279 => '8.2', 280 => '9.2', 282 => '9.2', 283 => '9.2', 287 => '8.2', 288 => '6.2', 292 => '9.2', 293 => '9.2', 294 => '9.2', 295 => 0x25 }, + 'finishexposure' => { 138 => 0xdbd }, + 'finishfiletype' => { 138 => 0xdb8 }, + 'finishlook' => { 138 => 0xdbc }, + 'finishnoise' => { 138 => 0xdba }, + 'finishresolution' => { 138 => 0xdb9 }, + 'finishsharpening' => { 138 => 0xdbb }, + 'firmware' => { 302 => 0x405, 397 => [0x8c,0x17,0x3b], 475 => 'Firmware' }, + 'firmware2' => { 397 => 0x57 }, + 'firmwaredate' => { 112 => 0x15, 113 => 0x2001, 381 => 0x4, 383 => 0x30 }, + 'firmwareid' => { 188 => 0x0 }, + 'firmwarename' => { 394 => 0xa001 }, + 'firmwarerevision' => { 19 => 0xa4, 64 => 0x1e, 385 => 0x0 }, + 'firmwarerevision2' => { 385 => 0xc }, + 'firmwareversion' => { 7 => 0x10b, 11 => 0x136, 14 => 0xff, 15 => 0x107, 127 => 0x1447, 138 => [0x415,0xce5], 154 => 0x57, 156 => 'FirmwareVersion', 318 => 0x320, 320 => 0x2, 322 => 0x3109, 355 => 0x230, 380 => ['CNFV','FIRM'], 382 => 0x18, 383 => 0x2a, 387 => 0x2 }, + 'firmwareversion2' => { 127 => 0x1448 }, + 'firmwareversions' => { 364 => 0x301 }, + 'firstphotodate' => { 466 => 'FirstPhotoDate' }, + 'firstpublicationdate' => { 307 => 'FirstPublicationDate' }, + 'fixtureidentifier' => { 131 => 0x16, 473 => 'FixtureIdentifier' }, + 'flash' => { 114 => 'XMP-Flash', 119 => 0x9209, 152 => 0x22, 182 => 0x1f, 183 => 0x15, 383 => 0x5a, 484 => 'Flash' }, + 'flashaction' => { 407 => 0x3e, 408 => 0x3e, 420 => 0x2017, 425 => [0x2a,0x2c,0x30] }, + 'flashaction2' => { 407 => 0x4c, 408 => 0x4c, 425 => 0x77 }, + 'flashactionexternal' => { 425 => [0x78,0x7c] }, + 'flashactivity' => { 34 => 0x1c }, + 'flashbatterylevel' => { 44 => 0x249 }, + 'flashbias' => { 320 => 0x24 }, + 'flashbits' => { 34 => 0x1d }, + 'flashburstpriority' => { 295 => 0x111 }, + 'flashbuttonfunction' => { 84 => 0x70e }, + 'flashchargelevel' => { 302 => 0x1010 }, + 'flashcolorfilter' => { 211 => 0x10, 212 => 0x10 }, + 'flashcommandermode' => { 209 => '9.1', 210 => '9.1', 211 => '9.1', 212 => '9.1' }, + 'flashcompensation' => { 138 => 0x3f3, 209 => 0xa, 210 => 0xa, 211 => 0xa, 212 => 0x27, 213 => 0xa, 214 => 0xa, 475 => 'FlashCompensation' }, + 'flashcontrol' => { 407 => 0x23, 408 => 0x1f, 409 => 0x21 }, + 'flashcontrolbuilt-in' => { 288 => '16.1', 289 => '23.1', 291 => '23.1', 292 => '24.1' }, + 'flashcontrolmode' => { 209 => '9.2', 210 => '9.2', 211 => '9.2', 212 => '9.2', 228 => 0x148, 229 => 0x1a8, 252 => 0xc4a6, 297 => 0x404 }, + 'flashcurtain' => { 320 => 0x48 }, + 'flashdefault' => { 184 => 0x42 }, + 'flashdevice' => { 302 => 0x1005 }, + 'flashdistance' => { 113 => 0x2034 }, + 'flashenergy' => { 119 => 0xa20b, 484 => 'FlashEnergy' }, + 'flashexposurebracketvalue' => { 226 => 0x18 }, + 'flashexposurecomp' => { 77 => 0xf, 127 => 0x1011, 159 => 'ExposureComp', 181 => 0x23, 186 => 0x104, 187 => 0x49c1, 226 => 0x12, 297 => 0x401, 302 => 0x1023, 355 => 0x4d, 387 => 0x100b, 397 => [0x3a,0x56], 420 => 0x104 }, + 'flashexposurecomp2' => { 256 => 0x4d2 }, + 'flashexposurecomp3' => { 211 => 0x1d }, + 'flashexposurecomp4' => { 211 => 0x27 }, + 'flashexposurecomparea' => { 280 => '38.4', 282 => '38.4', 283 => '38.4', 292 => '38.4', 293 => '38.4', 295 => 0x59 }, + 'flashexposurecompset' => { 184 => 0x10, 328 => 0xe, 407 => 0x14, 408 => 0x12, 409 => 0x23, 425 => 0x1f }, + 'flashexposurecompset2' => { 425 => [0x26,0x2c] }, + 'flashexposureindicator' => { 184 => 0x54 }, + 'flashexposureindicatorlast' => { 184 => 0x56 }, + 'flashexposureindicatornext' => { 184 => 0x55 }, + 'flashexposurelock' => { 57 => 0x19 }, + 'flashfired' => { 140 => 0x5d, 159 => 'Fired', 181 => 0x14, 255 => '590.3', 484 => [\'Flash','FlashFired'] }, + 'flashfiring' => { 84 => 0x306, 85 => 0x6, 86 => 0x7, 89 => 0x7 }, + 'flashfirmwareversion' => { 298 => 0x1002 }, + 'flashfocallength' => { 209 => 0xb, 210 => 0xc, 211 => 0xc, 212 => 0xc, 213 => 0xc }, + 'flashfunction' => { 187 => 0x31, 484 => [\'Flash','FlashFunction'] }, + 'flashgndistance' => { 209 => 0xe, 210 => 0xf, 211 => 0xf, 212 => 0xf, 213 => 0xf, 228 => 0x14e, 229 => 0x1ae, 252 => 0xc4ac }, + 'flashgroupacompensation' => { 209 => 0x11, 210 => 0x12, 211 => 0x13, 212 => 0x28, 213 => 0x28 }, + 'flashgroupacontrolmode' => { 209 => 0xf, 210 => '16.1', 211 => '17.1', 212 => '17.1', 213 => '17.1' }, + 'flashgroupaoutput' => { 209 => 0x11, 210 => 0x12, 211 => 0x13, 212 => 0x28, 213 => 0x28 }, + 'flashgroupbcompensation' => { 209 => 0x12, 210 => 0x13, 211 => 0x14, 212 => 0x29, 213 => 0x29 }, + 'flashgroupbcontrolmode' => { 209 => 0x10, 210 => '17.1', 211 => '18.1', 212 => '18.1', 213 => '18.1' }, + 'flashgroupboutput' => { 209 => 0x12, 210 => 0x13, 211 => 0x14, 212 => 0x29, 213 => 0x29 }, + 'flashgroupccompensation' => { 210 => 0x14, 211 => 0x15, 212 => 0x2a, 213 => 0x2a }, + 'flashgroupccontrolmode' => { 210 => '17.2', 211 => '18.2', 212 => '18.2', 213 => '18.2' }, + 'flashgroupcoutput' => { 210 => 0x14, 211 => 0x15, 212 => 0x2a, 213 => 0x2a }, + 'flashguidenumber' => { 77 => 0xd, 94 => 0x0, 159 => 'GuideNumber' }, + 'flashintensity' => { 112 => [0x19,0x5], 297 => 0x405 }, + 'flashlevel' => { 281 => 0x9, 420 => 0xb048 }, + 'flashmake' => { 159 => 'Make' }, + 'flashmanufacturer' => { 178 => 'FlashManufacturer' }, + 'flashmastercompensation' => { 228 => 0x162, 229 => 0x1aa, 252 => 0xc4c0 }, + 'flashmastercontrolmode' => { 228 => 0x160, 252 => 0xc4be }, + 'flashmasteroutput' => { 228 => 0x166, 252 => 0xc4c4 }, + 'flashmetering' => { 181 => 0x3f, 184 => 0x1c }, + 'flashmeteringmode' => { 7 => 0x15, 13 => 0x15, 14 => 0x15, 15 => 0x15, 16 => 0x15, 17 => 0x15, 18 => 0x15, 20 => 0x15, 22 => 0x15, 28 => 0x15 }, + 'flashmeteringsegments' => { 355 => 0x20a }, + 'flashmode' => { 112 => 0x4, 138 => 0x3f2, 140 => 0x5c, 151 => 0x27, 159 => 'Mode', 181 => 0x2, 182 => 0x20, 183 => 0x16, 184 => 0xf, 226 => 0x87, 297 => 0x400, 302 => 0x1004, 355 => 0xc, 362 => 0x4, 386 => 0x20, 387 => 0x100a, 396 => 0x225, 407 => 0x13, 408 => 0x7f, 409 => 0x20, 425 => 0x10, 429 => 0x1138, 430 => 0x1138, 431 => 0x1114, 432 => 0x1190, 433 => 0x116c, 434 => 0x1024, 435 => 0x21c, 436 => 0x21c, 437 => 0x211, 484 => [\'Flash','FlashMode'] }, + 'flashmodel' => { 159 => 'Model', 178 => 'FlashModel', 298 => 0x1001 }, + 'flashoptions' => { 336 => 0x2 }, + 'flashoptions2' => { 336 => 0x10 }, + 'flashoutput' => { 44 => 0x248, 77 => 0x21, 209 => 0xa, 210 => 0xa, 211 => 0xa, 212 => 0x27, 228 => 0x152, 229 => 0x1b2, 252 => 0xc4b0 }, + 'flashpixversion' => { 119 => 0xa000, 484 => 'FlashpixVersion' }, + 'flashredeyemode' => { 484 => [\'Flash','FlashRedEyeMode'] }, + 'flashremotecontrol' => { 228 => 0x15c, 229 => 0x1bc, 252 => 0xc4ba, 297 => 0x403 }, + 'flashreturn' => { 484 => [\'Flash','FlashReturn'] }, + 'flashserialnumber' => { 159 => 'SerialNumber', 298 => 0x1003 }, + 'flashsetting' => { 226 => 0x8 }, + 'flashshutterspeed' => { 279 => '20.2', 280 => '23.2', 282 => '23.2', 283 => '23.2', 288 => '15.2', 289 => '22.2', 290 => '7.2', 291 => '22.2', 292 => '23.2', 293 => '23.2', 294 => '23.1', 295 => 0x57 }, + 'flashsource' => { 209 => 0x4, 210 => 0x4, 211 => 0x4, 212 => 0x4, 213 => 0x4, 214 => 0x4 }, + 'flashstatus' => { 343 => 0x0, 425 => [0x82,0x86], 439 => 0x31, 440 => 0x39, 441 => 0x39 }, + 'flashstatusbuilt-in' => { 409 => [0x87,0x287] }, + 'flashstatusexternal' => { 409 => [0x88,0x288] }, + 'flashsyncspeed' => { 279 => '20.1', 280 => '23.1', 282 => '23.1', 283 => '23.1', 288 => '15.1', 289 => '22.1', 291 => '22.1', 292 => '23.1', 293 => '23.1', 295 => 0x53 }, + 'flashsyncspeedav' => { 82 => 0x3, 84 => 0x10f, 85 => 0x2, 86 => 0x3, 87 => 0x2, 88 => 0x2, 89 => 0x3, 90 => 0x6 }, + 'flashthreshold' => { 94 => 0x1 }, + 'flashtype' => { 159 => 'Type', 184 => 0x59, 226 => 0x9, 298 => 0x1000 }, + 'flashwarning' => { 289 => '30.1', 290 => '7.1', 294 => '31.1', 320 => 0x62 }, + 'flashwirelessoption' => { 228 => 0x15a, 229 => 0x1c8, 252 => 0xc4c6 }, + 'flexiblespotposition' => { 420 => 0x201d }, + 'flickadvancedirection' => { 295 => 0x25f }, + 'flickerreduce' => { 396 => 0x218 }, + 'flickerreduction' => { 127 => 0x1446, 248 => 0xe84 }, + 'flickerreductionindicator' => { 248 => 0x5e2 }, + 'flickerreductionshooting' => { 229 => 0x1a4 }, + 'flightpitchdegree' => { 116 => 'FlightPitchDegree' }, + 'flightrolldegree' => { 116 => 'FlightRollDegree' }, + 'flightxspeed' => { 116 => 'FlightXSpeed' }, + 'flightyawdegree' => { 116 => 'FlightYawDegree' }, + 'flightyspeed' => { 116 => 'FlightYSpeed' }, + 'flightzspeed' => { 116 => 'FlightZSpeed' }, + 'fliphorizontal' => { 272 => 0x76a43206 }, + 'fnumber' => { 7 => 0x3, 9 => 0x3, 11 => 0x3, 13 => 0x3, 14 => 0x3, 15 => 0x3, 16 => 0x3, 17 => 0x3, 18 => 0x3, 19 => 0x3, 20 => 0x3, 21 => 0x3, 22 => 0x3, 23 => 0x3, 24 => 0x3, 25 => 0x3, 26 => 0x3, 27 => 0x3, 28 => 0x3, 29 => 0x3, 30 => 0x5, 31 => 0x6, 77 => 0x15, 119 => 0x829d, 137 => 0xfd04, 140 => 0x1e, 142 => 0xfa23, 144 => 0xf103, 147 => 0x13, 149 => 0x3c, 151 => 0x1c, 152 => 0x18, 154 => 0xc, 163 => 'FNumber', 181 => 0xa, 182 => 0x36, 183 => 0x47, 184 => 0x9, 187 => 0x49c7, 224 => 0x38, 319 => 0x35a, 355 => 0x13, 394 => 0xa019, 397 => [0x31,0x49], 407 => 0x1, 408 => 0x1, 425 => [0x20,0x22,0x26], 484 => 'FNumber' }, + 'focaldistance' => { 464 => 'FocalDistance' }, + 'focallength' => { 7 => 0x1d, 8 => 0xa, 9 => 0x23, 10 => 0x9, 11 => 0x1d, 12 => 0x9, 13 => 0x1e, 14 => 0x1d, 15 => 0x1d, 16 => 0x1e, 17 => 0x1e, 18 => 0x1e, 19 => 0x28, 20 => 0x1e, 21 => 0x23, 22 => 0x1e, 23 => 0x1e, 24 => 0x23, 25 => 0x23, 26 => 0x23, 27 => 0x23, 28 => 0x1e, 29 => 0x23, 59 => 0x1, 113 => 0x1d, 119 => 0x920a, 147 => 0x1d, 163 => 'FocalLength', 181 => 0x12, 219 => 0xa, 220 => 0xb, 224 => [0xc,0x3c], 314 => 0x1, 355 => 0x1d, 364 => 0x403, 387 => 0x1500, 406 => 0xe, 433 => 0x1278, 434 => 0x1134, 435 => 0x32c, 436 => 0x32c, 437 => 0x30a, 484 => 'FocalLength' }, + 'focallength2' => { 425 => [0x23,0x25,0x29] }, + 'focallengthin35mmformat' => { 119 => 0xa405, 394 => 0xa01a, 484 => 'FocalLengthIn35mmFilm' }, + 'focallengthtelezoom' => { 406 => 0x10 }, + 'focalplaneafpointarea' => { 438 => 0x2 }, + 'focalplaneafpointlocation1' => { 438 => 0x6 }, + 'focalplaneafpointlocation10' => { 438 => 0x2a }, + 'focalplaneafpointlocation11' => { 438 => 0x2e }, + 'focalplaneafpointlocation12' => { 438 => 0x32 }, + 'focalplaneafpointlocation13' => { 438 => 0x36 }, + 'focalplaneafpointlocation14' => { 438 => 0x3a }, + 'focalplaneafpointlocation15' => { 438 => 0x3e }, + 'focalplaneafpointlocation2' => { 438 => 0xa }, + 'focalplaneafpointlocation3' => { 438 => 0xe }, + 'focalplaneafpointlocation4' => { 438 => 0x12 }, + 'focalplaneafpointlocation5' => { 438 => 0x16 }, + 'focalplaneafpointlocation6' => { 438 => 0x1a }, + 'focalplaneafpointlocation7' => { 438 => 0x1e }, + 'focalplaneafpointlocation8' => { 438 => 0x22 }, + 'focalplaneafpointlocation9' => { 438 => 0x26 }, + 'focalplaneafpointsused' => { 438 => 0x1 }, + 'focalplanediagonal' => { 298 => 0x103, 302 => 0x205 }, + 'focalplaneresolutionunit' => { 119 => 0xa210, 484 => 'FocalPlaneResolutionUnit' }, + 'focalplanexresolution' => { 119 => 0xa20e, 484 => 'FocalPlaneXResolution' }, + 'focalplanexsize' => { 59 => 0x2 }, + 'focalplanexunknown' => { 59 => 0x2 }, + 'focalplaneyresolution' => { 119 => 0xa20f, 484 => 'FocalPlaneYResolution' }, + 'focalplaneysize' => { 59 => 0x3 }, + 'focalplaneyunknown' => { 59 => 0x3 }, + 'focalpointx' => { 464 => 'FocalPointX' }, + 'focalpointy' => { 464 => 'FocalPointY' }, + 'focaltype' => { 10 => 0x2d, 59 => 0x0 }, + 'focalunits' => { 34 => 0x19 }, + 'focus' => { 262 => 0x8 }, + 'focusarea' => { 181 => 0x31 }, + 'focusareaselection' => { 290 => '15.2' }, + 'focusbracket' => { 320 => 0xbd }, + 'focusbracketstepsize' => { 297 => 0x308 }, + 'focuscontinuous' => { 34 => 0x20 }, + 'focusdisplayaiservoandmf' => { 84 => 0x515 }, + 'focusdistance' => { 163 => 'FocusDistance', 181 => 0x13, 187 => 0x49bb, 219 => 0x9, 220 => 0xa, 224 => [0xb,0x4e], 300 => 0x305, 314 => 0x0, 318 => 0x304, 319 => 0x304 }, + 'focusdistancelower' => { 7 => 0x45, 9 => 0x8e, 11 => 0x45, 13 => 0x56, 14 => 0x45, 15 => 0x45, 16 => 0x52, 17 => 0x52, 18 => 0x56, 20 => 0x52, 21 => 0x8e, 22 => 0x59, 23 => 0x57, 24 => 0x8e, 25 => 0x94, 26 => 0x95, 27 => 0xa7, 28 => 0x56, 29 => 0xa7, 57 => 0x15, 77 => 0x14 }, + 'focusdistancerange' => { 1 => 0xc }, + 'focusdistancerangewidth' => { 224 => 0x4c }, + 'focusdistanceupper' => { 7 => 0x43, 9 => 0x8c, 11 => 0x43, 13 => 0x54, 14 => 0x43, 15 => 0x43, 16 => 0x50, 17 => 0x50, 18 => 0x54, 20 => 0x50, 21 => 0x8c, 22 => 0x57, 23 => 0x55, 24 => 0x8c, 25 => 0x92, 26 => 0x93, 27 => 0xa5, 28 => 0x54, 29 => 0xa5, 57 => 0x14, 77 => 0x13 }, + 'focusholdbutton' => { 184 => 0x44 }, + 'focusinfoversion' => { 300 => 0x0 }, + 'focusingscreen' => { 83 => 0x0, 84 => 0x80b, 89 => 0x0 }, + 'focuslocation' => { 420 => 0x2027 }, + 'focuslocked' => { 180 => 0x14 }, + 'focusmode' => { 34 => 0x7, 112 => 0x3, 113 => [0x3003,0xd], 127 => 0x1021, 138 => 0x3f5, 140 => 0x38, 156 => 'FocusMode', 181 => 0x30, 183 => 0xe, 184 => 0xc, 226 => 0x7, 297 => 0x301, 302 => 0x100b, 320 => 0x7, 355 => 0xd, 362 => 0x3, 387 => 0x1006, 400 => [0xb,0x5], 406 => [0x15,0x1d], 407 => 0x4d, 408 => 0x4d, 420 => [0xb042,0xb04e,0x201b], 425 => 0x13, 445 => 0x16 }, + 'focusmode2' => { 126 => '0.1', 336 => '3.1', 425 => [0x2c,0x2e,0x32] }, + 'focusmodesetting' => { 281 => '10.1', 404 => 0x14, 405 => 0x15, 407 => 0x10, 408 => 0xf, 409 => 0x6 }, + 'focusmodeswitch' => { 184 => 0x58, 407 => 0x2e }, + 'focuspeakingdisplay' => { 295 => 0x235 }, + 'focuspeakinghighlightcolor' => { 295 => 0x4b }, + 'focuspeakinglevel' => { 295 => 0x49 }, + 'focuspixel' => { 127 => 0x1023 }, + 'focuspointlock' => { 295 => 0x1d3 }, + 'focuspointpersistence' => { 295 => 0x105 }, + 'focuspointwrap' => { 279 => '2.2', 280 => '2.2', 282 => '2.1', 283 => '2.1', 287 => '1.1', 288 => '2.2', 289 => '1.1', 292 => '2.2', 293 => '2.1', 294 => '2.5', 295 => 0x16 }, + 'focusposition' => { 219 => 0x8, 220 => 0x8, 355 => 0x10, 418 => 0x9bb }, + 'focusposition2' => { 425 => [0x29,0x2b,0x2f], 445 => 0x2d, 448 => 0x20 }, + 'focuspositionhorizontal' => { 194 => 0x43 }, + 'focuspositionvertical' => { 194 => 0x45 }, + 'focusprocess' => { 297 => 0x302 }, + 'focusrange' => { 34 => 0x12, 302 => 0x100a }, + 'focusrangeindex' => { 346 => '3.1' }, + 'focusringrotation' => { 84 => 0x713 }, + 'focussetting' => { 397 => 0x6 }, + 'focusshiftexposurelock' => { 228 => 0xe8, 229 => 0xf4, 252 => 0xc446 }, + 'focusshiftinterval' => { 228 => 0xe4, 229 => 0xf0, 252 => 0xc442 }, + 'focusshiftnumbershots' => { 228 => 0xdc, 229 => 0xe8, 252 => 0xc43a }, + 'focusshiftshooting' => { 261 => 0x7844 }, + 'focusshiftstepwidth' => { 228 => 0xe0, 229 => 0xec, 252 => 0xc43e }, + 'focusstatus' => { 406 => 0x19, 407 => 0x53, 408 => 0x53 }, + 'focusstepcount' => { 300 => 0x301, 302 => 0x100e }, + 'focusstepinfinity' => { 300 => 0x303, 302 => 0x103b }, + 'focusstepnear' => { 300 => 0x304, 302 => 0x103c }, + 'focustrackinglockon' => { 279 => ['1.5','4.1'], 280 => '1.4', 287 => '0.4', 288 => '3.1', 289 => '0.4', 292 => '1.4' }, + 'focuswarning' => { 127 => 0x1301 }, + 'foldername' => { 181 => 0x27 }, + 'foldernumber' => { 407 => 0x9a, 409 => [0x402,0x114,0x316] }, + 'fontcomposite' => { 509 => [\'Fonts','FontsComposite'] }, + 'fontface' => { 509 => [\'Fonts','FontsFontFace'] }, + 'fontfamily' => { 509 => [\'Fonts','FontsFontFamily'] }, + 'fontfilename' => { 509 => [\'Fonts','FontsFontFileName'] }, + 'fontname' => { 509 => [\'Fonts','FontsFontName'] }, + 'fonts' => { 509 => 'Fonts' }, + 'fonttype' => { 509 => [\'Fonts','FontsFontType'] }, + 'fontversion' => { 509 => [\'Fonts','FontsVersionString'] }, + 'for' => { 371 => 'For' }, + 'forcewrite' => { 120 => 'ForceWrite' }, + 'format' => { 380 => "\xa9fmt", 463 => 'Format', 481 => 'format', 502 => 'Format' }, + 'forwardlock' => { 499 => 'forwardlock' }, + 'forwardmatrix1' => { 119 => 0xc714 }, + 'forwardmatrix2' => { 119 => 0xc715 }, + 'forwardmatrix3' => { 119 => 0xcd34 }, + 'fossilspecimen' => { 118 => 'FossilSpecimen' }, + 'fossilspecimenmaterialsampleid' => { 118 => [\'FossilSpecimen','FossilSpecimenMaterialSampleID'] }, + 'framecount' => { 67 => [0x2,0x4] }, + 'frameheight' => { 127 => 0x3822 }, + 'framenum' => { 366 => 0xd7 }, + 'framenumber' => { 127 => 0x8003, 187 => 0x3c, 355 => 0x29 }, + 'framerate' => { 67 => [0x1,0x6], 119 => 0xc764, 127 => 0x3820 }, + 'framereadouttime' => { 374 => 'camera.framereadouttimeinmicroseconds' }, + 'framewidth' => { 127 => 0x3821 }, + 'framing' => { 493 => 'framing' }, + 'freebytes' => { 97 => 0x1 }, + 'freememorycardimages' => { 182 => [0x37,0x54], 183 => [0x2d,0x4a], 184 => 0x32 }, + 'fujiflashmode' => { 127 => 0x1010 }, + 'fullhdhighspeedrec' => { 127 => 0x3824 }, + 'fullimagesize' => { 420 => 0xb02b }, + 'fullpanoheightpixels' => { 466 => 'FullPanoHeightPixels', 467 => 'FullPanoHeightPixels' }, + 'fullpanowidthpixels' => { 466 => 'FullPanoWidthPixels', 467 => 'FullPanoWidthPixels' }, + 'fullpresssnap' => { 387 => 0x100d }, + 'fullsizeimage' => { 162 => 'data' }, + 'fullsizeimagename' => { 162 => '1Name' }, + 'fullsizeimagetype' => { 162 => '0Type' }, + 'func1button' => { 282 => '14.1', 283 => '14.1', 293 => '14.1', 295 => 0x63 }, + 'func1buttonplaybackmode' => { 295 => 0x1a5 }, + 'func1buttonplusdials' => { 282 => '42.1', 283 => '42.1', 293 => '42.1' }, + 'func2button' => { 282 => '80.1', 283 => '80.1', 293 => '80.1', 295 => 0x73 }, + 'func2buttonplaybackmode' => { 295 => 0x1a7 }, + 'func2buttonplusdials' => { 282 => '81.1' }, + 'func3button' => { 282 => '83.1', 295 => 0x119 }, + 'func3buttonplaybackmode' => { 295 => 0x1a9 }, + 'func4button' => { 295 => 0x175 }, + 'func4buttonplaybackmode' => { 295 => 0x1af }, + 'funcbutton' => { 279 => ['14.1','15.1'], 280 => '14.1', 288 => '28.1', 289 => '13.1', 292 => '14.1', 294 => '14.1' }, + 'funcbuttonplusdials' => { 279 => ['14.2','15.2'], 280 => '14.2', 288 => '31.1', 292 => '42.1' }, + 'functionbutton' => { 286 => '13.1', 290 => '5.2' }, + 'gainbase' => { 301 => 0x610 }, + 'gaincontrol' => { 119 => 0xa407, 484 => 'GainControl' }, + 'gamma' => { 119 => 0xa500, 138 => 0x8fe, 308 => 'gAMA', 325 => 0x11c, 485 => 'Gamma' }, + 'gammablackpoint' => { 105 => 0xc }, + 'gammacolortone' => { 105 => 0x3 }, + 'gammacompensatedvalue' => { 133 => 0x91 }, + 'gammacontrast' => { 105 => 0x2 }, + 'gammacurveoutputrange' => { 105 => 0xf }, + 'gammahighlight' => { 105 => 0xa }, + 'gammalinear' => { 103 => 0x20200 }, + 'gammamidpoint' => { 105 => 0xe }, + 'gammasaturation' => { 105 => 0x4 }, + 'gammashadow' => { 105 => 0x9 }, + 'gammasharpnessstrength' => { 105 => 0x8 }, + 'gammaunsharpmaskfineness' => { 105 => 0x6 }, + 'gammaunsharpmaskstrength' => { 105 => 0x5 }, + 'gammaunsharpmaskthreshold' => { 105 => 0x7 }, + 'gammawhitepoint' => { 105 => 0xd }, + 'garminsettings' => { 380 => 'pmcc' }, + 'garminsoftware' => { 380 => 'uuid' }, + 'gdalmetadata' => { 119 => 0xa480 }, + 'gdalnodata' => { 119 => 0xa481 }, + 'geimagesize' => { 127 => 0x1304 }, + 'gemake' => { 129 => 0x300 }, + 'gemodel' => { 129 => 0x207 }, + 'genre' => { 372 => ['gnre',"\xa9gen"], 374 => 'genre', 380 => ['gnre',"\xa9gen"], 490 => 'Genre', 494 => 'genre', 504 => 'genre' }, + 'genrecvid' => { 490 => [\'Genre','GenreCvId'] }, + 'genrecvtermid' => { 490 => [\'Genre','GenreCvTermId'] }, + 'genrecvtermname' => { 490 => [\'Genre','GenreCvTermName'] }, + 'genrecvtermrefinedabout' => { 490 => [\'Genre','GenreCvTermRefinedAbout'] }, + 'genreid' => { 372 => 'geID' }, + 'geography' => { 495 => 'geography' }, + 'geologicalcontext' => { 118 => 'GeologicalContext' }, + 'geologicalcontextbed' => { 118 => [\'GeologicalContext','GeologicalContextBed'] }, + 'geologicalcontextformation' => { 118 => [\'GeologicalContext','GeologicalContextFormation'] }, + 'geologicalcontextgroup' => { 118 => [\'GeologicalContext','GeologicalContextGroup'] }, + 'geologicalcontextid' => { 118 => [\'GeologicalContext','GeologicalContextGeologicalContextID'] }, + 'geologicalcontextmember' => { 118 => [\'GeologicalContext','GeologicalContextMember'] }, + 'geosync' => { 120 => 'Geosync' }, + 'geotag' => { 120 => 'Geotag' }, + 'geotiffasciiparams' => { 119 => 0x87b1 }, + 'geotiffdirectory' => { 119 => 0x87af }, + 'geotiffdoubleparams' => { 119 => 0x87b0 }, + 'geotime' => { 120 => 'Geotime' }, + 'giftftppriority' => { 468 => 'GIFTFtpPriority' }, + 'gimbalpitchdegree' => { 116 => 'GimbalPitchDegree' }, + 'gimbalreverse' => { 116 => 'GimbalReverse' }, + 'gimbalrolldegree' => { 116 => 'GimbalRollDegree' }, + 'gimbalyawdegree' => { 116 => 'GimbalYawDegree' }, + 'globalaltitude' => { 369 => 0x419 }, + 'globalangle' => { 369 => 0x40d }, + 'good' => { 504 => 'good' }, + 'googlehostheader' => { 372 => 'gshh' }, + 'googlepingmessage' => { 372 => 'gspm' }, + 'googlepingurl' => { 372 => 'gspu' }, + 'googleplusuploadcode' => { 119 => 0x9009 }, + 'googlesourcedata' => { 372 => 'gssd' }, + 'googlestarttime' => { 372 => 'gsst' }, + 'googletrackduration' => { 372 => 'gstd' }, + 'goprotype' => { 380 => 'GoPr' }, + 'gpsaltitude' => { 130 => 0x6, 160 => 'Altitude', 484 => 'GPSAltitude' }, + 'gpsaltituderef' => { 130 => 0x5, 484 => 'GPSAltitudeRef' }, + 'gpsareainformation' => { 130 => 0x1c, 484 => 'GPSAreaInformation' }, + 'gpscoordinates' => { 372 => "\xa9xyz", 374 => 'location.ISO6709', 380 => ['@xyz',"\xa9xyz"] }, + 'gpsdatestamp' => { 130 => 0x1d }, + 'gpsdatetime' => { 160 => 'DateTime', 484 => 'GPSTimeStamp' }, + 'gpsdestbearing' => { 130 => 0x18, 160 => 'Bearing', 484 => 'GPSDestBearing' }, + 'gpsdestbearingref' => { 130 => 0x17, 484 => 'GPSDestBearingRef' }, + 'gpsdestdistance' => { 130 => 0x1a, 160 => 'Distance', 484 => 'GPSDestDistance' }, + 'gpsdestdistanceref' => { 130 => 0x19, 484 => 'GPSDestDistanceRef' }, + 'gpsdestlatitude' => { 130 => 0x14, 484 => 'GPSDestLatitude' }, + 'gpsdestlatituderef' => { 130 => 0x13 }, + 'gpsdestlongitude' => { 130 => 0x16, 484 => 'GPSDestLongitude' }, + 'gpsdestlongituderef' => { 130 => 0x15 }, + 'gpsdifferential' => { 130 => 0x1e, 160 => 'Differential', 484 => 'GPSDifferential' }, + 'gpsdop' => { 130 => 0xb, 484 => 'GPSDOP' }, + 'gpshpositioningerror' => { 130 => 0x1f, 484 => 'GPSHPositioningError' }, + 'gpsimgdirection' => { 130 => 0x11, 484 => 'GPSImgDirection' }, + 'gpsimgdirectionref' => { 130 => 0x10, 484 => 'GPSImgDirectionRef' }, + 'gpslatitude' => { 114 => 'GPS-GPSLatitude', 116 => 'GpsLatitude', 130 => 0x2, 160 => 'Latitude', 484 => 'GPSLatitude' }, + 'gpslatituderef' => { 130 => 0x1 }, + 'gpslongitude' => { 114 => 'GPS-GPSLongitude', 116 => 'GpsLongitude', 130 => 0x4, 160 => 'Longitude', 484 => 'GPSLongitude' }, + 'gpslongituderef' => { 130 => 0x3 }, + 'gpslongtitude' => { 116 => 'GpsLongtitude' }, + 'gpsmapdatum' => { 130 => 0x12, 160 => 'Datum', 484 => 'GPSMapDatum' }, + 'gpsmeasuremode' => { 130 => 0xa, 160 => 'MeasureMode', 484 => 'GPSMeasureMode' }, + 'gpsposition' => { 114 => 'Exif-GPSPosition' }, + 'gpsprocessingmethod' => { 130 => 0x1b, 484 => 'GPSProcessingMethod' }, + 'gpssatellites' => { 130 => 0x8, 160 => 'Satellites', 484 => 'GPSSatellites' }, + 'gpsspeed' => { 130 => 0xd, 160 => 'Speed', 484 => 'GPSSpeed' }, + 'gpsspeedref' => { 130 => 0xc, 484 => 'GPSSpeedRef' }, + 'gpsstatus' => { 130 => 0x9, 484 => 'GPSStatus' }, + 'gpsstring' => { 138 => 0x402 }, + 'gpstimestamp' => { 130 => 0x7 }, + 'gpstrack' => { 130 => 0xf, 160 => 'Heading', 484 => 'GPSTrack' }, + 'gpstrackref' => { 130 => 0xe, 484 => 'GPSTrackRef' }, + 'gpsversionid' => { 130 => 0x0, 484 => 'GPSVersionID' }, + 'gradation' => { 297 => 0x50f }, + 'gradientbasedcorractive' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionActive'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionActive'] }, + 'gradientbasedcorramount' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionAmount'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionAmount'] }, + 'gradientbasedcorrblacks2012' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalBlacks2012'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalBlacks2012'] }, + 'gradientbasedcorrbrightness' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalBrightness'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalBrightness'] }, + 'gradientbasedcorrclarity' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalClarity'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalClarity'] }, + 'gradientbasedcorrclarity2012' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalClarity2012'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalClarity2012'] }, + 'gradientbasedcorrcontrast' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalContrast'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalContrast'] }, + 'gradientbasedcorrcontrast2012' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalContrast2012'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalContrast2012'] }, + 'gradientbasedcorrcorrectionname' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionName'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionName'] }, + 'gradientbasedcorrcorrectionsyncid' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionSyncID'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionSyncID'] }, + 'gradientbasedcorrdefringe' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalDefringe'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalDefringe'] }, + 'gradientbasedcorrdehaze' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalDehaze'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalDehaze'] }, + 'gradientbasedcorrections' => { 478 => 'GradientBasedCorrections', 480 => 'GradientBasedCorrections' }, + 'gradientbasedcorrexposure' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalExposure'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalExposure'] }, + 'gradientbasedcorrexposure2012' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalExposure2012'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalExposure2012'] }, + 'gradientbasedcorrhighlights2012' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalHighlights2012'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalHighlights2012'] }, + 'gradientbasedcorrhue' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalHue'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalHue'] }, + 'gradientbasedcorrluminancenoise' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalLuminanceNoise'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalLuminanceNoise'] }, + 'gradientbasedcorrmaskalpha' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksAlpha'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksAlpha'] }, + 'gradientbasedcorrmaskangle' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksAngle'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksAngle'] }, + 'gradientbasedcorrmaskbottom' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksBottom'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksBottom'] }, + 'gradientbasedcorrmaskcentervalue' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCenterValue'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCenterValue'] }, + 'gradientbasedcorrmaskcenterweight' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCenterWeight'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCenterWeight'] }, + 'gradientbasedcorrmaskdabs' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksDabs'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksDabs'] }, + 'gradientbasedcorrmaskfeather' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFeather'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFeather'] }, + 'gradientbasedcorrmaskflipped' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFlipped'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFlipped'] }, + 'gradientbasedcorrmaskflow' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFlow'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFlow'] }, + 'gradientbasedcorrmaskfullx' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFullX'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFullX'] }, + 'gradientbasedcorrmaskfully' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFullY'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksFullY'] }, + 'gradientbasedcorrmaskinputdigest' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksInputDigest'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksInputDigest'] }, + 'gradientbasedcorrmaskleft' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksLeft'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksLeft'] }, + 'gradientbasedcorrmaskmaskactive' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskActive'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskActive'] }, + 'gradientbasedcorrmaskmaskblendmode' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskBlendMode'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskBlendMode'] }, + 'gradientbasedcorrmaskmaskdigest' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskDigest'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskDigest'] }, + 'gradientbasedcorrmaskmaskinverted' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskInverted'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskInverted'] }, + 'gradientbasedcorrmaskmaskname' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskName'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskName'] }, + 'gradientbasedcorrmaskmasks' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasks'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasks'] }, + 'gradientbasedcorrmaskmasksalpha' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksAlpha'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksAlpha'] }, + 'gradientbasedcorrmaskmasksangle' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksAngle'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksAngle'] }, + 'gradientbasedcorrmaskmasksbottom' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksBottom'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksBottom'] }, + 'gradientbasedcorrmaskmaskscentervalue' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksCenterValue'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksCenterValue'] }, + 'gradientbasedcorrmaskmaskscenterweight' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksCenterWeight'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksCenterWeight'] }, + 'gradientbasedcorrmaskmasksdabs' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksDabs'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksDabs'] }, + 'gradientbasedcorrmaskmasksfeather' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksFeather'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksFeather'] }, + 'gradientbasedcorrmaskmasksflipped' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksFlipped'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksFlipped'] }, + 'gradientbasedcorrmaskmasksflow' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksFlow'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksFlow'] }, + 'gradientbasedcorrmaskmasksfullx' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksFullX'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksFullX'] }, + 'gradientbasedcorrmaskmasksfully' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksFullY'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksFullY'] }, + 'gradientbasedcorrmaskmasksinputdigest' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksInputDigest'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksInputDigest'] }, + 'gradientbasedcorrmaskmasksleft' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksLeft'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksLeft'] }, + 'gradientbasedcorrmaskmasksmaskactive' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskActive'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskActive'] }, + 'gradientbasedcorrmaskmasksmaskblendmode' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskBlendMode'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskBlendMode'] }, + 'gradientbasedcorrmaskmasksmaskdigest' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskDigest'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskDigest'] }, + 'gradientbasedcorrmaskmasksmaskinverted' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskInverted'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskInverted'] }, + 'gradientbasedcorrmaskmasksmaskname' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskName'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskName'] }, + 'gradientbasedcorrmaskmasksmasksubtype' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskSubType'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskSubType'] }, + 'gradientbasedcorrmaskmasksmasksyncid' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskSyncID'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskSyncID'] }, + 'gradientbasedcorrmaskmasksmaskversion' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskVersion'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskVersion'] }, + 'gradientbasedcorrmaskmasksmidpoint' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMidpoint'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMidpoint'] }, + 'gradientbasedcorrmaskmasksorigin' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksOrigin'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksOrigin'] }, + 'gradientbasedcorrmaskmasksperimetervalue' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksPerimeterValue'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksPerimeterValue'] }, + 'gradientbasedcorrmaskmasksradius' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksRadius'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksRadius'] }, + 'gradientbasedcorrmaskmasksreferencepoint' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksReferencePoint'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksReferencePoint'] }, + 'gradientbasedcorrmaskmasksright' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksRight'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksRight'] }, + 'gradientbasedcorrmaskmasksroundness' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksRoundness'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksRoundness'] }, + 'gradientbasedcorrmaskmaskssizex' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksSizeX'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksSizeX'] }, + 'gradientbasedcorrmaskmaskssizey' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksSizeY'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksSizeY'] }, + 'gradientbasedcorrmaskmaskstop' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksTop'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksTop'] }, + 'gradientbasedcorrmaskmasksubtype' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskSubType'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskSubType'] }, + 'gradientbasedcorrmaskmasksvalue' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskValue'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksMaskValue'] }, + 'gradientbasedcorrmaskmasksversion' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksVersion'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksVersion'] }, + 'gradientbasedcorrmaskmaskswhat' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksWhat'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksWhat'] }, + 'gradientbasedcorrmaskmaskswholeimagearea' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksWholeImageArea'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksWholeImageArea'] }, + 'gradientbasedcorrmaskmasksx' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksX'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksX'] }, + 'gradientbasedcorrmaskmasksy' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksY'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksY'] }, + 'gradientbasedcorrmaskmasksyncid' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskSyncID'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskSyncID'] }, + 'gradientbasedcorrmaskmaskszerox' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksZeroX'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksZeroX'] }, + 'gradientbasedcorrmaskmaskszeroy' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksZeroY'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMasksZeroY'] }, + 'gradientbasedcorrmaskmaskversion' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskVersion'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskVersion'] }, + 'gradientbasedcorrmaskmidpoint' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMidpoint'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMidpoint'] }, + 'gradientbasedcorrmaskorigin' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksOrigin'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksOrigin'] }, + 'gradientbasedcorrmaskperimetervalue' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksPerimeterValue'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksPerimeterValue'] }, + 'gradientbasedcorrmaskradius' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksRadius'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksRadius'] }, + 'gradientbasedcorrmaskrange' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMask'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMask'] }, + 'gradientbasedcorrmaskrangeareamodels' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels'] }, + 'gradientbasedcorrmaskrangeareamodelscolorsampleinfo' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'] }, + 'gradientbasedcorrmaskrangeareamodelscomponents' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents'] }, + 'gradientbasedcorrmaskrangecoloramount' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount'] }, + 'gradientbasedcorrmaskrangedepthfeather' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather'] }, + 'gradientbasedcorrmaskrangedepthmax' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax'] }, + 'gradientbasedcorrmaskrangedepthmin' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin'] }, + 'gradientbasedcorrmaskrangeinvert' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert'] }, + 'gradientbasedcorrmaskrangelumfeather' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather'] }, + 'gradientbasedcorrmaskrangeluminancedepthsampleinfo' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo'] }, + 'gradientbasedcorrmaskrangelummax' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax'] }, + 'gradientbasedcorrmaskrangelummin' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin'] }, + 'gradientbasedcorrmaskrangelumrange' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange'] }, + 'gradientbasedcorrmaskrangesampletype' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType'] }, + 'gradientbasedcorrmaskrangetype' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskType'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskType'] }, + 'gradientbasedcorrmaskrangeversion' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion'] }, + 'gradientbasedcorrmaskreferencepoint' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksReferencePoint'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksReferencePoint'] }, + 'gradientbasedcorrmaskright' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksRight'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksRight'] }, + 'gradientbasedcorrmaskroundness' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksRoundness'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksRoundness'] }, + 'gradientbasedcorrmasks' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasks'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasks'] }, + 'gradientbasedcorrmasksizex' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksSizeX'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksSizeX'] }, + 'gradientbasedcorrmasksizey' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksSizeY'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksSizeY'] }, + 'gradientbasedcorrmasktop' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksTop'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksTop'] }, + 'gradientbasedcorrmaskvalue' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskValue'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksMaskValue'] }, + 'gradientbasedcorrmaskversion' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksVersion'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksVersion'] }, + 'gradientbasedcorrmaskwhat' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksWhat'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksWhat'] }, + 'gradientbasedcorrmaskwholeimagearea' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksWholeImageArea'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksWholeImageArea'] }, + 'gradientbasedcorrmaskx' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksX'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksX'] }, + 'gradientbasedcorrmasky' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksY'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksY'] }, + 'gradientbasedcorrmaskzerox' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksZeroX'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksZeroX'] }, + 'gradientbasedcorrmaskzeroy' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksZeroY'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionMasksZeroY'] }, + 'gradientbasedcorrmoire' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalMoire'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalMoire'] }, + 'gradientbasedcorrrangemask' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMask'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMask'] }, + 'gradientbasedcorrrangemaskareamodels' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskAreaModels'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskAreaModels'] }, + 'gradientbasedcorrrangemaskareamodelscolorsampleinfo' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'] }, + 'gradientbasedcorrrangemaskareamodelscomponents' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents'] }, + 'gradientbasedcorrrangemaskcoloramount' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskColorAmount'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskColorAmount'] }, + 'gradientbasedcorrrangemaskdepthfeather' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskDepthFeather'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskDepthFeather'] }, + 'gradientbasedcorrrangemaskdepthmax' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskDepthMax'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskDepthMax'] }, + 'gradientbasedcorrrangemaskdepthmin' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskDepthMin'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskDepthMin'] }, + 'gradientbasedcorrrangemaskinvert' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskInvert'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskInvert'] }, + 'gradientbasedcorrrangemasklumfeather' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskLumFeather'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskLumFeather'] }, + 'gradientbasedcorrrangemaskluminancedepthsampleinfo' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo'] }, + 'gradientbasedcorrrangemasklummax' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskLumMax'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskLumMax'] }, + 'gradientbasedcorrrangemasklummin' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskLumMin'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskLumMin'] }, + 'gradientbasedcorrrangemasklumrange' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskLumRange'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskLumRange'] }, + 'gradientbasedcorrrangemasksampletype' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskSampleType'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskSampleType'] }, + 'gradientbasedcorrrangemasktype' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskType'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskType'] }, + 'gradientbasedcorrrangemaskversion' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskVersion'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsCorrectionRangeMaskVersion'] }, + 'gradientbasedcorrsaturation' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalSaturation'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalSaturation'] }, + 'gradientbasedcorrshadows2012' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalShadows2012'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalShadows2012'] }, + 'gradientbasedcorrsharpness' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalSharpness'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalSharpness'] }, + 'gradientbasedcorrtemperature' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalTemperature'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalTemperature'] }, + 'gradientbasedcorrtexture' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalTexture'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalTexture'] }, + 'gradientbasedcorrtint' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalTint'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalTint'] }, + 'gradientbasedcorrtoninghue' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalToningHue'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalToningHue'] }, + 'gradientbasedcorrtoningsaturation' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalToningSaturation'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalToningSaturation'] }, + 'gradientbasedcorrwhat' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsWhat'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsWhat'] }, + 'gradientbasedcorrwhites2012' => { 478 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalWhites2012'], 480 => [\'GradientBasedCorrections','GradientBasedCorrectionsLocalWhites2012'] }, + 'grainamount' => { 478 => 'GrainAmount', 480 => 'GrainAmount' }, + 'graineffect' => { 127 => 0x1047 }, + 'grainfrequency' => { 478 => 'GrainFrequency', 480 => 'GrainFrequency' }, + 'grainseed' => { 478 => 'GrainSeed', 480 => 'GrainSeed' }, + 'grainsize' => { 478 => 'GrainSize', 480 => 'GrainSize' }, + 'graymixeraqua' => { 478 => 'GrayMixerAqua', 480 => 'GrayMixerAqua' }, + 'graymixerblue' => { 478 => 'GrayMixerBlue', 480 => 'GrayMixerBlue' }, + 'graymixergreen' => { 478 => 'GrayMixerGreen', 480 => 'GrayMixerGreen' }, + 'graymixermagenta' => { 478 => 'GrayMixerMagenta', 480 => 'GrayMixerMagenta' }, + 'graymixerorange' => { 478 => 'GrayMixerOrange', 480 => 'GrayMixerOrange' }, + 'graymixerpurple' => { 478 => 'GrayMixerPurple', 480 => 'GrayMixerPurple' }, + 'graymixerred' => { 478 => 'GrayMixerRed', 480 => 'GrayMixerRed' }, + 'graymixeryellow' => { 478 => 'GrayMixerYellow', 480 => 'GrayMixerYellow' }, + 'graypoint' => { 455 => 0x8021 }, + 'grayresponseunit' => { 119 => 0x122 }, + 'greencurvelimits' => { 108 => 0x1c4 }, + 'greencurvepoints' => { 107 => 0x53, 108 => 0x19a }, + 'greenhsl' => { 103 => 0x20913 }, + 'greenhue' => { 478 => 'GreenHue', 480 => 'GreenHue' }, + 'greensaturation' => { 478 => 'GreenSaturation', 480 => 'GreenSaturation' }, + 'griddisplay' => { 279 => '13.3', 280 => '4.3', 282 => '4.2', 283 => '4.2', 284 => '2.2', 288 => '10.5', 289 => '3.4', 290 => '6.1', 292 => '4.4', 293 => '4.2', 294 => '4.2' }, + 'gripbatteryadload' => { 334 => 0x5 }, + 'gripbatteryadnoload' => { 334 => 0x4 }, + 'gripbatterystate' => { 334 => '1.2' }, + 'group' => { 478 => 'Group', 480 => 'Group' }, + 'groupareaafillumination' => { 280 => '46.4', 283 => '47.4', 292 => '47.4' }, + 'grouping' => { 372 => ['grup',"\xa9grp"], 380 => "\xa9grp" }, + 'guid' => { 372 => 'GUID' }, + 'h2resetblackpixels' => { 138 => 0x18a6 }, + 'h3resetblackcolumns' => { 138 => 0x18ce }, + 'h3resetblackpixels' => { 138 => 0x18b0 }, + 'halftonehints' => { 119 => 0x141 }, + 'hardlink' => { 120 => 'HardLink' }, + 'hasalternative' => { 494 => 'hasAlternative' }, + 'hascorrection' => { 494 => 'hasCorrection' }, + 'hascorrectiona-lang' => { 494 => [\'hasCorrection','hasCorrectionA-lang'] }, + 'hascorrectiona-platform' => { 494 => [\'hasCorrection','hasCorrectionA-platform'] }, + 'hascorrectiontext' => { 494 => [\'hasCorrection','hasCorrectionText'] }, + 'hascrop' => { 478 => 'HasCrop', 480 => 'HasCrop' }, + 'hasextendedxmp' => { 506 => 'HasExtendedXMP' }, + 'hassettings' => { 478 => 'HasSettings', 480 => 'HasSettings' }, + 'hastranslation' => { 494 => 'hasTranslation' }, + 'hasvisibleoverprint' => { 509 => 'HasVisibleOverprint' }, + 'hasvisibletransparency' => { 509 => 'HasVisibleTransparency' }, + 'hdmioutputn-log' => { 228 => 0x35a }, + 'hdmioutputresolution' => { 229 => 0x610 }, + 'hdmiviewassist' => { 295 => 0x20f }, + 'hdr' => { 60 => 0x1, 216 => 0x4, 320 => 0x9e, 355 => 0x85, 420 => 0x200a }, + 'hdreffect' => { 60 => 0x2 }, + 'hdrimagetype' => { 1 => 0xa }, + 'hdrinfoversion' => { 216 => 0x0 }, + 'hdrlevel' => { 216 => 0x5, 409 => 0x2e, 425 => 0x17 }, + 'hdrlevel2' => { 216 => 0x7 }, + 'hdrpmakernote' => { 461 => 'hdrp_makernote' }, + 'hdrsetting' => { 409 => 0x2d, 425 => 0x16, 429 => 0x1148, 430 => 0x1148, 431 => 0x1124, 432 => 0x11a0, 433 => 0x117c, 434 => 0x1034, 435 => 0x22c, 436 => 0x22c, 437 => 0x21f }, + 'hdrshot' => { 320 => 0x76 }, + 'hdrsmoothing' => { 216 => 0x6 }, + 'hdvideo' => { 372 => 'hdvd' }, + 'headline' => { 131 => 0x69, 490 => 'Headline', 492 => 'Headline' }, + 'hierarchicalkeywords' => { 171 => [\'Keywords','KeywordsHierarchy'] }, + 'hierarchicalkeywords1' => { 171 => [\'Keywords','KeywordsHierarchyKeyword'] }, + 'hierarchicalkeywords1applied' => { 171 => [\'Keywords','KeywordsHierarchyApplied'] }, + 'hierarchicalkeywords1children' => { 171 => [\'Keywords','KeywordsHierarchyChildren'] }, + 'hierarchicalkeywords2' => { 171 => [\'Keywords','KeywordsHierarchyChildrenKeyword'] }, + 'hierarchicalkeywords2applied' => { 171 => [\'Keywords','KeywordsHierarchyChildrenApplied'] }, + 'hierarchicalkeywords2children' => { 171 => [\'Keywords','KeywordsHierarchyChildrenChildren'] }, + 'hierarchicalkeywords3' => { 171 => [\'Keywords','KeywordsHierarchyChildrenChildrenKeyword'] }, + 'hierarchicalkeywords3applied' => { 171 => [\'Keywords','KeywordsHierarchyChildrenChildrenApplied'] }, + 'hierarchicalkeywords3children' => { 171 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildren'] }, + 'hierarchicalkeywords4' => { 171 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenKeyword'] }, + 'hierarchicalkeywords4applied' => { 171 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenApplied'] }, + 'hierarchicalkeywords4children' => { 171 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildren'] }, + 'hierarchicalkeywords5' => { 171 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenKeyword'] }, + 'hierarchicalkeywords5applied' => { 171 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenApplied'] }, + 'hierarchicalkeywords5children' => { 171 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenChildren'] }, + 'hierarchicalkeywords6' => { 171 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenChildrenKeyword'] }, + 'hierarchicalkeywords6applied' => { 171 => [\'Keywords','KeywordsHierarchyChildrenChildrenChildrenChildrenChildrenApplied'] }, + 'hierarchicalsubject' => { 470 => 'hierarchicalSubject' }, + 'highestbiostratigraphiczone' => { 118 => [\'GeologicalContext','GeologicalContextHighestBiostratigraphicZone'] }, + 'highisomultiplierblue' => { 325 => 0x1a }, + 'highisomultipliergreen' => { 325 => 0x19 }, + 'highisomultiplierred' => { 325 => 0x18 }, + 'highisonoisereduction' => { 16 => 0xbc, 17 => 0xbd, 20 => 0xbd, 28 => 0xc9, 62 => 0x5, 84 => 0x202, 226 => 0xb1, 355 => 0x71, 407 => 0x2c, 408 => 0x26, 409 => 0x26, 420 => 0x2009, 425 => 0x12, 451 => 0x42 }, + 'highisonoisereduction2' => { 420 => 0xb050 }, + 'highlight' => { 397 => 0xf }, + 'highlight2012' => { 478 => 'Highlight2012', 480 => 'Highlight2012' }, + 'highlightadj' => { 103 => 0x2030c }, + 'highlightcolordistortreduct' => { 455 => 0x8026 }, + 'highlightlinearitylimit' => { 394 => 0xa025 }, + 'highlightprotection' => { 271 => 0x6 }, + 'highlightrecovery' => { 478 => 'HighlightRecovery', 480 => 'HighlightRecovery' }, + 'highlights' => { 420 => 0x2033, 472 => 'Highlights' }, + 'highlights2012' => { 478 => 'Highlights2012', 480 => 'Highlights2012' }, + 'highlightsadj' => { 455 => 0x9019 }, + 'highlightshadow' => { 320 => 0xad }, + 'highlighttone' => { 127 => 0x1041 }, + 'highlighttonepriority' => { 13 => 0x7, 16 => 0x7, 17 => 0x7, 18 => 0x7, 20 => 0x7, 22 => 0x7, 28 => 0x7, 62 => 0x3, 84 => 0x203 }, + 'highlightwarning' => { 320 => 0x8002 }, + 'highlowkeyadj' => { 355 => 0x6c }, + 'highspeedsync' => { 184 => 0x5, 295 => 0x55, 407 => 0x2, 408 => 0x2 }, + 'hintversion' => { 380 => 'hinv' }, + 'histogramxml' => { 272 => 0x83a1a25 }, + 'history' => { 492 => 'History', 505 => 'History' }, + 'historyaction' => { 505 => [\'History','HistoryAction'] }, + 'historychanged' => { 505 => [\'History','HistoryChanged'] }, + 'historyinstanceid' => { 505 => [\'History','HistoryInstanceID'] }, + 'historyparameters' => { 505 => [\'History','HistoryParameters'] }, + 'historysoftwareagent' => { 505 => [\'History','HistorySoftwareAgent'] }, + 'historywhen' => { 505 => [\'History','HistoryWhen'] }, + 'holefilldarkdeltathreshold' => { 138 => 0xc88 }, + 'holefilldeltathreshold' => { 138 => 0xc7e }, + 'hometowncity' => { 113 => 0x3006, 355 => 0x23, 361 => 0x2 }, + 'hometowncitycode' => { 362 => 0x1000 }, + 'hometowndst' => { 355 => 0x25, 361 => '0.2' }, + 'hostcomputer' => { 119 => 0x13c }, + 'hostsoftwarerendering' => { 138 => 0xce7 }, + 'hue' => { 189 => 0x3b, 232 => 0x3d, 233 => 0x45, 355 => 0x67 }, + 'hueadj' => { 275 => 0x2f, 455 => 0x8019 }, + 'hueadjust' => { 387 => 0x1016 }, + 'hueadjustment' => { 182 => 0x4a, 183 => 0x40, 226 => 0x92, 231 => 0x36 }, + 'hueadjustmentaqua' => { 478 => 'HueAdjustmentAqua', 480 => 'HueAdjustmentAqua' }, + 'hueadjustmentblue' => { 478 => 'HueAdjustmentBlue', 480 => 'HueAdjustmentBlue' }, + 'hueadjustmentgreen' => { 478 => 'HueAdjustmentGreen', 480 => 'HueAdjustmentGreen' }, + 'hueadjustmentmagenta' => { 478 => 'HueAdjustmentMagenta', 480 => 'HueAdjustmentMagenta' }, + 'hueadjustmentorange' => { 478 => 'HueAdjustmentOrange', 480 => 'HueAdjustmentOrange' }, + 'hueadjustmentpurple' => { 478 => 'HueAdjustmentPurple', 480 => 'HueAdjustmentPurple' }, + 'hueadjustmentred' => { 478 => 'HueAdjustmentRed', 480 => 'HueAdjustmentRed' }, + 'hueadjustmentyellow' => { 478 => 'HueAdjustmentYellow', 480 => 'HueAdjustmentYellow' }, + 'huesetting' => { 305 => 0x1011 }, + 'humanobservation' => { 118 => 'HumanObservation' }, + 'humanobservationday' => { 118 => [\'HumanObservation','HumanObservationDay'] }, + 'humanobservationearliestdate' => { 118 => [\'HumanObservation','HumanObservationEarliestDate'] }, + 'humanobservationenddayofyear' => { 118 => [\'HumanObservation','HumanObservationEndDayOfYear'] }, + 'humanobservationeventdate' => { 118 => [\'HumanObservation','HumanObservationEventDate'] }, + 'humanobservationeventid' => { 118 => [\'HumanObservation','HumanObservationEventID'] }, + 'humanobservationeventremarks' => { 118 => [\'HumanObservation','HumanObservationEventRemarks'] }, + 'humanobservationeventtime' => { 118 => [\'HumanObservation','HumanObservationEventTime'] }, + 'humanobservationfieldnotes' => { 118 => [\'HumanObservation','HumanObservationFieldNotes'] }, + 'humanobservationfieldnumber' => { 118 => [\'HumanObservation','HumanObservationFieldNumber'] }, + 'humanobservationhabitat' => { 118 => [\'HumanObservation','HumanObservationHabitat'] }, + 'humanobservationlatestdate' => { 118 => [\'HumanObservation','HumanObservationLatestDate'] }, + 'humanobservationmonth' => { 118 => [\'HumanObservation','HumanObservationMonth'] }, + 'humanobservationparenteventid' => { 118 => [\'HumanObservation','HumanObservationParentEventID'] }, + 'humanobservationsamplesizeunit' => { 118 => [\'HumanObservation','HumanObservationSampleSizeUnit'] }, + 'humanobservationsamplesizevalue' => { 118 => [\'HumanObservation','HumanObservationSampleSizeValue'] }, + 'humanobservationsamplingeffort' => { 118 => [\'HumanObservation','HumanObservationSamplingEffort'] }, + 'humanobservationsamplingprotocol' => { 118 => [\'HumanObservation','HumanObservationSamplingProtocol'] }, + 'humanobservationstartdayofyear' => { 118 => [\'HumanObservation','HumanObservationStartDayOfYear'] }, + 'humanobservationverbatimeventdate' => { 118 => [\'HumanObservation','HumanObservationVerbatimEventDate'] }, + 'humanobservationyear' => { 118 => [\'HumanObservation','HumanObservationYear'] }, + 'humidity' => { 119 => 0x9401, 485 => 'Humidity' }, + 'icc_profile' => { 120 => 'ICC_Profile' }, + 'iccprofilename' => { 492 => 'ICCProfile' }, + 'iconuri' => { 380 => 'icnu' }, + 'idccreativestyle' => { 455 => 0x8000 }, + 'idcpreviewlength' => { 455 => 0x202 }, + 'idcpreviewstart' => { 455 => 0x201 }, + 'identification' => { 118 => 'Identification' }, + 'identificationid' => { 118 => [\'Identification','IdentificationIdentificationID'] }, + 'identificationqualifier' => { 118 => [\'Identification','IdentificationIdentificationQualifier'] }, + 'identificationreferences' => { 118 => [\'Identification','IdentificationIdentificationReferences'] }, + 'identificationremarks' => { 118 => [\'Identification','IdentificationIdentificationRemarks'] }, + 'identificationverificationstatus' => { 118 => [\'Identification','IdentificationIdentificationVerificationStatus'] }, + 'identifiedby' => { 118 => [\'Identification','IdentificationIdentifiedBy'] }, + 'identifiedbyid' => { 118 => [\'Identification','IdentificationIdentifiedByID'] }, + 'identifier' => { 481 => 'identifier', 502 => 'Identifier' }, + 'ifcameramodel' => { 138 => 0x9c8 }, + 'illuminantdata1' => { 119 => 0xcd35 }, + 'illuminantdata2' => { 119 => 0xcd36 }, + 'illuminantdata3' => { 119 => 0xcd37 }, + 'illumination' => { 290 => '0.5', 382 => 0x48 }, + 'imageabsolutex' => { 138 => 0x3fe }, + 'imageabsolutey' => { 138 => 0x3ff }, + 'imageadjustment' => { 226 => 0x80, 262 => 0x5 }, + 'imagealterationconstraints' => { 307 => 'ImageAlterationConstraints' }, + 'imagearea' => { 242 => 0x10, 245 => 0x10 }, + 'imageareaoffset' => { 355 => 0x38 }, + 'imageauthentication' => { 226 => 0x20 }, + 'imageboundary' => { 226 => 0x16 }, + 'imagecount' => { 127 => 0x1438, 226 => 0xa5, 423 => 0x11b }, + 'imagecreator' => { 307 => 'ImageCreator' }, + 'imagecreatorid' => { 307 => [\'ImageCreator','ImageCreatorImageCreatorID'] }, + 'imagecreatorimageid' => { 307 => 'ImageCreatorImageID' }, + 'imagecreatorname' => { 307 => [\'ImageCreator','ImageCreatorImageCreatorName'] }, + 'imagecropx' => { 138 => 0x41f }, + 'imagecropy' => { 138 => 0x420 }, + 'imagedata' => { 465 => 'Data' }, + 'imagedatasize' => { 226 => 0xa2 }, + 'imagedescription' => { 119 => 0x10e, 500 => 'ImageDescription' }, + 'imageduplicationconstraints' => { 307 => 'ImageDuplicationConstraints' }, + 'imagedustoff' => { 272 => 0xfe443a45 }, + 'imageeditcount' => { 355 => 0x41 }, + 'imageediting' => { 355 => 0x32 }, + 'imageeffects' => { 387 => 0x1010 }, + 'imagefileconstraints' => { 307 => 'ImageFileConstraints' }, + 'imagefileformatasdelivered' => { 307 => 'ImageFileFormatAsDelivered' }, + 'imagefilesizeasdelivered' => { 307 => 'ImageFileSizeAsDelivered' }, + 'imagegeneration' => { 127 => 0x1436 }, + 'imageheight' => { 119 => 0x101, 188 => 0xc, 364 => 0x10d, 463 => 'ImageHeight', 500 => 'ImageLength' }, + 'imagehistory' => { 119 => 0x9213, 483 => 'ImageHistory' }, + 'imageidnumber' => { 315 => 0x340 }, + 'imagemimetype' => { 465 => 'Mime' }, + 'imagenumber' => { 119 => 0x9211, 156 => 'ImageNumber', 182 => 0xae, 183 => 0x5e, 364 => 0x113, 407 => 0x9b, 409 => [0x400,'276.1',0x314], 475 => 'ImageNumber' }, + 'imagenumber2' => { 183 => 0x62 }, + 'imageoptimization' => { 226 => 0xa9 }, + 'imageorientation' => { 131 => 0x83 }, + 'imageprocessing' => { 226 => 0x1a }, + 'imageprocessingfiledatecreated' => { 138 => 0xc81 }, + 'imageprocessingfiletagsversionnumber' => { 138 => 0xc80 }, + 'imageprocessingversion' => { 301 => 0x0 }, + 'imagequality' => { 156 => 'ImageQuality', 244 => '723.2', 245 => '732.2', 255 => '708.1', 320 => 0x1 }, + 'imagequality2' => { 297 => 0x603 }, + 'imagerank' => { 468 => 'ImageRank' }, + 'imagerbiassettlingdelaymsec' => { 138 => 0x600 }, + 'imagerboardversion' => { 138 => 0x439 }, + 'imagercols' => { 138 => 0x17d4 }, + 'imageref' => { 488 => 'ImageRef' }, + 'imageregion' => { 490 => 'ImageRegion' }, + 'imageregionboundary' => { 490 => [\'ImageRegion','ImageRegionRegionBoundary'] }, + 'imageregionboundaryh' => { 490 => [\'ImageRegion','ImageRegionRegionBoundaryRbH'] }, + 'imageregionboundaryrx' => { 490 => [\'ImageRegion','ImageRegionRegionBoundaryRbRx'] }, + 'imageregionboundaryshape' => { 490 => [\'ImageRegion','ImageRegionRegionBoundaryRbShape'] }, + 'imageregionboundaryunit' => { 490 => [\'ImageRegion','ImageRegionRegionBoundaryRbUnit'] }, + 'imageregionboundaryvertices' => { 490 => [\'ImageRegion','ImageRegionRegionBoundaryRbVertices'] }, + 'imageregionboundaryverticesx' => { 490 => [\'ImageRegion','ImageRegionRegionBoundaryRbVerticesRbX'] }, + 'imageregionboundaryverticesy' => { 490 => [\'ImageRegion','ImageRegionRegionBoundaryRbVerticesRbY'] }, + 'imageregionboundaryw' => { 490 => [\'ImageRegion','ImageRegionRegionBoundaryRbW'] }, + 'imageregionboundaryx' => { 490 => [\'ImageRegion','ImageRegionRegionBoundaryRbX'] }, + 'imageregionboundaryy' => { 490 => [\'ImageRegion','ImageRegionRegionBoundaryRbY'] }, + 'imageregionctype' => { 490 => [\'ImageRegion','ImageRegionRCtype'] }, + 'imageregionctypeidentifier' => { 490 => [\'ImageRegion','ImageRegionRCtypeIdentifier'] }, + 'imageregionctypename' => { 490 => [\'ImageRegion','ImageRegionRCtypeName'] }, + 'imageregionid' => { 490 => [\'ImageRegion','ImageRegionRId'] }, + 'imageregionname' => { 490 => [\'ImageRegion','ImageRegionName'] }, + 'imageregionrole' => { 490 => [\'ImageRegion','ImageRegionRRole'] }, + 'imageregionroleidentifier' => { 490 => [\'ImageRegion','ImageRegionRRoleIdentifier'] }, + 'imageregionrolename' => { 490 => [\'ImageRegion','ImageRegionRRoleName'] }, + 'imageresolution' => { 138 => 0x944 }, + 'imageresolutionjpg' => { 138 => 0x945 }, + 'imagereview' => { 281 => '0.4', 290 => '0.4' }, + 'imagereviewmonitorofftime' => { 280 => '21.1', 282 => '21.1', 283 => '21.1', 287 => '20.1', 292 => '21.1', 293 => '21.1', 295 => 0x39 }, + 'imagereviewtime' => { 279 => '25.1', 281 => '2.1', 284 => '19.1', 285 => '20.1', 286 => '20.1', 288 => '9.2', 289 => '20.1', 294 => '21.2' }, + 'imagerfiledatecreated' => { 138 => 0x9c5 }, + 'imagerfileproductionlevel' => { 138 => 0x9c4 }, + 'imagerfiletagsversionstandard' => { 138 => 0x9c7 }, + 'imagerotated' => { 151 => 0x2a }, + 'imagerpowerondelaymsec' => { 138 => 0x5fd }, + 'imagerrows' => { 138 => 0x17de }, + 'imagesegmentlines' => { 138 => 0x184d }, + 'imagesegmentstartline' => { 138 => 0x184c }, + 'imagesize' => { 162 => 'ImageSize' }, + 'imagesizeraw' => { 226 => 0x3e }, + 'imagesizerestriction' => { 497 => 'imageSizeRestriction' }, + 'imagesourcedata' => { 119 => 0x935c }, + 'imagespace' => { 138 => 0x909 }, + 'imagestabilization' => { 34 => 0x22, 113 => 0x3020, 127 => 0x1422, 156 => 'ImageStabilization', 182 => 0xbd, 183 => 0x71, 184 => 0x57, 185 => 0x0, 186 => [0x18,0x107,0x113], 187 => 0x49c2, 226 => 0xac, 297 => 0x604, 300 => 0x1600, 320 => 0x1a, 412 => 0x12, 413 => 0x11, 420 => 0xb026 }, + 'imagestabilization2' => { 411 => 0xa }, + 'imagestabilizationsetting' => { 187 => 0x14, 407 => 0x3d, 408 => 0x3d, 418 => 0x14 }, + 'imagestyle' => { 407 => 0x2d, 408 => 0x27 }, + 'imagesupplier' => { 307 => 'ImageSupplier' }, + 'imagesupplierid' => { 307 => [\'ImageSupplier','ImageSupplierImageSupplierID'] }, + 'imagesupplierimageid' => { 307 => 'ImageSupplierImageID' }, + 'imagesuppliername' => { 307 => [\'ImageSupplier','ImageSupplierImageSupplierName'] }, + 'imagetemperaturemax' => { 121 => 0x1 }, + 'imagetemperaturemin' => { 121 => 0x2 }, + 'imagetone' => { 355 => 0x4f }, + 'imagetype' => { 131 => 0x82, 307 => 'ImageType' }, + 'imageuniqueid' => { 1 => 0x15, 64 => 0x28, 119 => 0xa420, 483 => 'ImageUniqueID', 484 => 'ImageUniqueID' }, + 'imagewidth' => { 119 => 0x100, 188 => 0xe, 364 => 0x10c, 463 => 'ImageWidth', 500 => 'ImageWidth' }, + 'inclinationangle' => { 455 => 0x900f }, + 'inclinationcorrection' => { 455 => 0x900e }, + 'incrementaltemperature' => { 478 => 'IncrementalTemperature', 480 => 'IncrementalTemperature' }, + 'incrementaltint' => { 478 => 'IncrementalTint', 480 => 'IncrementalTint' }, + 'industry' => { 494 => 'industry', 495 => 'industry' }, + 'infobuttonwhenshooting' => { 84 => 0x409 }, + 'information' => { 374 => 'information', 380 => "\xa9inf" }, + 'infourl' => { 380 => 'infu' }, + 'infraredilluminator' => { 381 => 0x28 }, + 'ingredientexclusion' => { 496 => 'ingredientExclusion' }, + 'ingredients' => { 505 => 'Ingredients' }, + 'ingredientsalternatepaths' => { 505 => [\'Ingredients','IngredientsAlternatePaths'] }, + 'ingredientsdocumentid' => { 505 => [\'Ingredients','IngredientsDocumentID'] }, + 'ingredientsfilepath' => { 505 => [\'Ingredients','IngredientsFilePath'] }, + 'ingredientsfrompart' => { 505 => [\'Ingredients','IngredientsFromPart'] }, + 'ingredientsinstanceid' => { 505 => [\'Ingredients','IngredientsInstanceID'] }, + 'ingredientslastmodifydate' => { 505 => [\'Ingredients','IngredientsLastModifyDate'] }, + 'ingredientslasturl' => { 505 => [\'Ingredients','IngredientsLastURL'] }, + 'ingredientslinkcategory' => { 505 => [\'Ingredients','IngredientsLinkCategory'] }, + 'ingredientslinkform' => { 505 => [\'Ingredients','IngredientsLinkForm'] }, + 'ingredientsmanager' => { 505 => [\'Ingredients','IngredientsManager'] }, + 'ingredientsmanagervariant' => { 505 => [\'Ingredients','IngredientsManagerVariant'] }, + 'ingredientsmanageto' => { 505 => [\'Ingredients','IngredientsManageTo'] }, + 'ingredientsmanageui' => { 505 => [\'Ingredients','IngredientsManageUI'] }, + 'ingredientsmaskmarkers' => { 505 => [\'Ingredients','IngredientsMaskMarkers'] }, + 'ingredientsoriginaldocumentid' => { 505 => [\'Ingredients','IngredientsOriginalDocumentID'] }, + 'ingredientspartmapping' => { 505 => [\'Ingredients','IngredientsPartMapping'] }, + 'ingredientsplacedresolutionunit' => { 505 => [\'Ingredients','IngredientsPlacedResolutionUnit'] }, + 'ingredientsplacedxresolution' => { 505 => [\'Ingredients','IngredientsPlacedXResolution'] }, + 'ingredientsplacedyresolution' => { 505 => [\'Ingredients','IngredientsPlacedYResolution'] }, + 'ingredientsrenditionclass' => { 505 => [\'Ingredients','IngredientsRenditionClass'] }, + 'ingredientsrenditionparams' => { 505 => [\'Ingredients','IngredientsRenditionParams'] }, + 'ingredientstopart' => { 505 => [\'Ingredients','IngredientsToPart'] }, + 'ingredientsversionid' => { 505 => [\'Ingredients','IngredientsVersionID'] }, + 'initialafpointaiservoaf' => { 84 => 0x51e }, + 'initialafpointinservo' => { 2 => 0x13 }, + 'initialcameradolly' => { 466 => 'InitialCameraDolly' }, + 'initialhorizontalfovdegrees' => { 466 => 'InitialHorizontalFOVDegrees' }, + 'initialkey' => { 179 => 'WM/InitialKey' }, + 'initialverticalfovdegrees' => { 466 => 'InitialVerticalFOVDegrees' }, + 'initialviewheadingdegrees' => { 466 => 'InitialViewHeadingDegrees', 467 => 'InitialViewHeadingDegrees' }, + 'initialviewpitchdegrees' => { 466 => 'InitialViewPitchDegrees', 467 => 'InitialViewPitchDegrees' }, + 'initialviewrolldegrees' => { 466 => 'InitialViewRollDegrees', 467 => 'InitialViewRollDegrees' }, + 'initialzoomliveview' => { 279 => '4.4' }, + 'initialzoomsetting' => { 279 => '9.3', 288 => '27.3' }, + 'inkset' => { 119 => 0x14c }, + 'inputprofile' => { 138 => 0x1389 }, + 'instanceid' => { 505 => 'InstanceID' }, + 'instantplaybacksetup' => { 184 => 0x3e }, + 'instantplaybacktime' => { 184 => 0x3d }, + 'instructions' => { 492 => 'Instructions' }, + 'instrument' => { 504 => 'instrument' }, + 'integrationtime' => { 138 => 0x423 }, + 'intellectualgenre' => { 489 => 'IntellectualGenre' }, + 'intelligentauto' => { 420 => 0xb052, 447 => 0xd, 448 => 0xe, 449 => 0xd }, + 'intelligentcontrast' => { 52 => 0x4 }, + 'intelligentd-range' => { 320 => 0x79 }, + 'intelligentexposure' => { 320 => 0x5d }, + 'intelligentresolution' => { 320 => 0x70 }, + 'interchangecolorspace' => { 133 => 0x40 }, + 'intergraphmatrix' => { 119 => 0x8480 }, + 'internalflash' => { 181 => 0x2b, 279 => '23.1', 281 => '8.1', 284 => '22.1', 286 => '23.1', 290 => '8.1', 294 => '24.1', 300 => 0x1208 }, + 'internalflashae1' => { 302 => 0x1021 }, + 'internalflashae1_0' => { 302 => 0x101d }, + 'internalflashae2' => { 302 => 0x1022 }, + 'internalflashae2_0' => { 302 => 0x101e }, + 'internalflashmode' => { 343 => 0x1 }, + 'internalflashstrength' => { 343 => 0x3 }, + 'internalflashtable' => { 302 => 0x1024 }, + 'internallensserialnumber' => { 394 => 0xa005 }, + 'internalndfilter' => { 320 => 0x9d }, + 'internalserialnumber' => { 64 => 0x96, 76 => 0x9, 127 => 0x10, 187 => 0x49dc, 296 => 0x18, 298 => 0x102, 317 => 0x500, 320 => 0x25, 335 => 0x4, 387 => 0x5, 439 => [0x7c,0xf0], 440 => 0x88, 441 => [0x88,0x8a] }, + 'interopindex' => { 119 => 0x1, 485 => 'InteroperabilityIndex' }, + 'interopversion' => { 119 => 0x2 }, + 'interval' => { 248 => 0xd0 }, + 'intervaldurationhours' => { 228 => 0xa0 }, + 'intervaldurationminutes' => { 228 => 0xa4 }, + 'intervaldurationseconds' => { 228 => 0xa8 }, + 'intervalexposuresmoothing' => { 228 => 0xb8, 252 => 0xc416 }, + 'intervalframe' => { 248 => 0xd4 }, + 'intervallength' => { 181 => 0x10 }, + 'intervalmode' => { 181 => 0x26 }, + 'intervalnumber' => { 181 => 0x11 }, + 'intervalpriority' => { 228 => 0xba, 252 => 0xc418 }, + 'intervals' => { 228 => 0xb0, 229 => 0xbc, 252 => 0xc40e }, + 'intervalshooting' => { 252 => 0x760c, 260 => 0x760c, 261 => 0x6c98, 355 => 0x92 }, + 'introtime' => { 504 => 'introTime' }, + 'introtimescale' => { 504 => [\'introTime','introTimeScale'] }, + 'introtimevalue' => { 504 => [\'introTime','introTimeValue'] }, + 'ipaversion' => { 138 => 0xdae }, + 'ipfcameramodel' => { 138 => 0xe4d }, + 'iptc' => { 120 => 'IPTC' }, + 'iptc-naa' => { 119 => 0x83bb, 325 => 0x83bb }, + 'iptcbitspersample' => { 133 => 0x56 }, + 'iptcdigest' => { 369 => 0x425 }, + 'iptcimageheight' => { 133 => 0x1e }, + 'iptcimagerotation' => { 133 => 0x66 }, + 'iptcimagewidth' => { 133 => 0x14 }, + 'iptclastedited' => { 490 => 'IptcLastEdited' }, + 'iptcpicturenumber' => { 133 => 0xa }, + 'iptcpixelheight' => { 133 => 0x32 }, + 'iptcpixelwidth' => { 133 => 0x28 }, + 'isalternativeof' => { 494 => 'isAlternativeOf' }, + 'isbn' => { 494 => 'isbn' }, + 'iscorrectionof' => { 494 => 'isCorrectionOf' }, + 'iscustompicturestyle' => { 109 => 0x3 }, + 'ismergedhdr' => { 475 => 'IsMergedHDR' }, + 'ismergedpanorama' => { 475 => 'IsMergedPanorama' }, + 'iso' => { 7 => 0x6, 9 => 0x6, 10 => 0x75, 11 => 0x6, 12 => 0x79, 13 => 0x6, 14 => 0x6, 15 => 0x6, 16 => 0x6, 17 => 0x6, 18 => 0x6, 19 => 0x6, 20 => 0x6, 21 => 0x6, 22 => 0x6, 23 => 0x6, 24 => 0x6, 25 => 0x6, 26 => 0x6, 27 => 0x6, 28 => 0x6, 29 => 0x6, 30 => 0x0, 31 => 0x1, 112 => 0x14, 113 => [0x3014,0x14], 119 => 0x8827, 137 => 0xfd06, 138 => 0x1784, 140 => 0x60, 142 => [0xfa2e,0xfa46], 143 => [0x27,0x28], 144 => 0xf105, 147 => 0x14, 149 => 0x4e, 151 => 0x1e, 152 => 0x1a, 154 => 0x34, 156 => 'ISO', 181 => 0x8, 187 => 0x49ba, 217 => 0x0, 226 => 0x2, 320 => 0xd1, 325 => 0x17, 355 => [0x8b,0x14], 362 => 0x14, 364 => 0x105, 394 => 0xa014, 397 => 0x86, 418 => 0x6f, 425 => [0x1f,0x21,0x25], 484 => 'ISOSpeedRatings' }, + 'iso2' => { 217 => 0x6, 239 => 0x265, 240 => 0x25c, 241 => 0x265, 242 => 0x221, 243 => 0x25d, 244 => 0x256, 245 => 0x25d, 249 => 0x2b5, 253 => 0x265, 259 => 0x2b5 }, + 'isoauto' => { 336 => '14.4' }, + 'isoautoflashlimit' => { 229 => 0x146 }, + 'isoautohilimit' => { 229 => 0x144, 247 => 0x18eb, 248 => 0xe82, 257 => 0x185d }, + 'isoautomax' => { 419 => 0x4 }, + 'isoautomin' => { 419 => 0x2 }, + 'isoautoparameters' => { 355 => 0x7a }, + 'isoautoshuttertime' => { 229 => 0x14e, 247 => 0x18ea, 248 => 0xe81, 257 => 0x185c }, + 'isocalibrationgain' => { 138 => 0x89f }, + 'isodisplay' => { 282 => '4.1', 283 => '4.1', 284 => '2.3', 285 => '3.3', 286 => '3.3', 289 => '3.3', 292 => '4.3', 293 => '4.1', 294 => '4.3' }, + 'isoexpansion' => { 84 => 0x103, 85 => 0x7, 86 => 0x8, 89 => 0x8, 217 => 0x4 }, + 'isoexpansion2' => { 217 => 0xa }, + 'isofloor' => { 336 => 0x6 }, + 'isoselected' => { 319 => 0x359 }, + 'isoselection' => { 226 => 0xf }, + 'isosensitivitystep' => { 287 => '6.2', 289 => '6.2' }, + 'isosetting' => { 140 => 0x5e, 152 => 0x14, 156 => 'ISOSetting', 181 => 0x24, 182 => 0x26, 183 => 0x1c, 184 => 0x13, 189 => 0x6, 226 => 0x13, 336 => '17.3', 386 => 0x27, 407 => 0x16, 408 => 0x14, 409 => 0x2, 418 => 0x6d, 419 => 0x0 }, + 'isospeed' => { 119 => 0x8833, 485 => 'ISOSpeed' }, + 'isospeedexpansion' => { 83 => 0x3 }, + 'isospeedincrements' => { 84 => 0x102 }, + 'isospeedlatitudeyyy' => { 119 => 0x8834, 485 => 'ISOSpeedLatitudeyyy' }, + 'isospeedlatitudezzz' => { 119 => 0x8835, 485 => 'ISOSpeedLatitudezzz' }, + 'isospeedrange' => { 84 => 0x103 }, + 'isostepsize' => { 279 => '6.1', 280 => '7.2', 282 => '7.2', 283 => '7.2', 288 => '4.1', 292 => '7.2', 293 => '7.2', 295 => 0x15d }, + 'isovalue' => { 302 => 0x1001 }, + 'isrccode' => { 380 => "\xa9isr" }, + 'issn' => { 494 => 'issn' }, + 'issueidentifier' => { 494 => 'issueIdentifier' }, + 'issuename' => { 494 => 'issueName' }, + 'issueteaser' => { 494 => 'issueTeaser' }, + 'issuetype' => { 494 => 'issueType' }, + 'istranslationof' => { 494 => 'isTranslationOf' }, + 'itemsubtype' => { 178 => 'ItemSubType' }, + 'itunesu' => { 372 => 'itnu' }, + 'jobid' => { 131 => 0xb8 }, + 'jobname' => { 486 => 'JobName' }, + 'jobref' => { 503 => 'JobRef' }, + 'jobrefid' => { 503 => [\'JobRef','JobRefId'] }, + 'jobrefname' => { 503 => [\'JobRef','JobRefName'] }, + 'jobrefurl' => { 503 => [\'JobRef','JobRefUrl'] }, + 'jobstatus' => { 486 => 'JobStatus' }, + 'jpeg-heifswitch' => { 420 => 0x2039 }, + 'jpeghandling' => { 478 => 'JPEGHandling', 480 => 'JPEGHandling' }, + 'jpegquality' => { 10 => 0x66, 320 => 0x43, 322 => 0x3034, 420 => 0xb047 }, + 'jpegsize' => { 322 => 0x303a }, + 'jpgcompression' => { 248 => 0x7d4 }, + 'jpgfromraw' => { 97 => 0x2007, 114 => 'Exif-JpgFromRaw', 325 => 0x2e }, + 'jpgfromrawlength' => { 119 => [0x117,0x202] }, + 'jpgfromrawstart' => { 119 => [0x111,0x201] }, + 'jpgrecordedpixels' => { 336 => '14.1' }, + 'jurisdiction' => { 476 => 'jurisdiction' }, + 'keepexposure' => { 295 => 0x237 }, + 'kelvinwb_01' => { 344 => 0x5 }, + 'kelvinwb_02' => { 344 => 0x9 }, + 'kelvinwb_03' => { 344 => 0xd }, + 'kelvinwb_04' => { 344 => 0x11 }, + 'kelvinwb_05' => { 344 => 0x15 }, + 'kelvinwb_06' => { 344 => 0x19 }, + 'kelvinwb_07' => { 344 => 0x1d }, + 'kelvinwb_08' => { 344 => 0x21 }, + 'kelvinwb_09' => { 344 => 0x25 }, + 'kelvinwb_10' => { 344 => 0x29 }, + 'kelvinwb_11' => { 344 => 0x2d }, + 'kelvinwb_12' => { 344 => 0x31 }, + 'kelvinwb_13' => { 344 => 0x35 }, + 'kelvinwb_14' => { 344 => 0x39 }, + 'kelvinwb_15' => { 344 => 0x3d }, + 'kelvinwb_16' => { 344 => 0x41 }, + 'kelvinwb_daylight' => { 344 => 0x1 }, + 'kerneldenominators' => { 138 => 0x933 }, + 'key' => { 504 => 'key' }, + 'keystonecompensation' => { 301 => 0x1900 }, + 'keystonedirection' => { 301 => 0x1901 }, + 'keystonevalue' => { 301 => 0x1906 }, + 'keyword' => { 372 => 'keyw', 494 => 'keyword' }, + 'keywordinfo' => { 171 => 'Keywords' }, + 'keywords' => { 131 => 0x19, 157 => 'Keywords', 306 => 'Keywords', 371 => 'Keywords', 374 => 'keywords', 473 => 'keywords', 491 => 'Keywords', 502 => 'Keywords' }, + 'killdate' => { 494 => 'killDate' }, + 'killdatea-platform' => { 494 => [\'killDate','killDateA-platform'] }, + 'killdatedate' => { 494 => [\'killDate','killDateDate'] }, + 'kodakimageheight' => { 137 => 0xf908, 140 => 0xe, 142 => [0xfa1e,0xfa52], 148 => 0x70 }, + 'kodakimagewidth' => { 137 => 0xf907, 140 => 0xc, 142 => [0xfa1d,0xfa51], 148 => 0x6c }, + 'kodakinfotype' => { 137 => 0xfa00 }, + 'kodaklook' => { 138 => 0xe4c }, + 'kodaklookprofile' => { 138 => 0x138a }, + 'kodakmaker' => { 148 => 0x8 }, + 'kodakmodel' => { 140 => 0x0, 148 => 0x28 }, + 'kodaktag' => { 138 => 0x3ea }, + 'kodakversion' => { 138 => 0x0 }, + 'label' => { 310 => 'Label', 502 => 'Label' }, + 'labelname1' => { 488 => [\'TagStructure','TagStructureLabelName'] }, + 'labelname2' => { 488 => [\'TagStructure','TagStructureSubLabelsLabelName'] }, + 'labelname3' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsLabelName'] }, + 'labelname4' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsLabelName'] }, + 'labelname5' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsLabelName'] }, + 'labelname6' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsLabelName'] }, + 'landmark' => { 320 => 0x6f }, + 'landscapeoutputhighlightpoint' => { 109 => 0x26 }, + 'landscapeoutputshadowpoint' => { 109 => 0x27 }, + 'landscaperawcolortone' => { 109 => 0x1f }, + 'landscaperawcontrast' => { 109 => 0x21 }, + 'landscaperawhighlight' => { 109 => 0x77 }, + 'landscaperawhighlightpoint' => { 109 => 0x24 }, + 'landscaperawlinear' => { 109 => 0x22 }, + 'landscaperawsaturation' => { 109 => 0x20 }, + 'landscaperawshadow' => { 109 => 0x80 }, + 'landscaperawshadowpoint' => { 109 => 0x25 }, + 'landscaperawsharpness' => { 109 => 0x23 }, + 'landscapeunsharpmaskfineness' => { 109 => 0xa0 }, + 'landscapeunsharpmaskstrength' => { 109 => 0x9e }, + 'landscapeunsharpmaskthreshold' => { 109 => 0xa2 }, + 'language' => { 229 => 0x592, 481 => 'language' }, + 'languageidentifier' => { 131 => 0x87 }, + 'largestvalidinteriorrectheight' => { 466 => 'LargestValidInteriorRectHeight' }, + 'largestvalidinteriorrectleft' => { 466 => 'LargestValidInteriorRectLeft' }, + 'largestvalidinteriorrecttop' => { 466 => 'LargestValidInteriorRectTop' }, + 'largestvalidinteriorrectwidth' => { 466 => 'LargestValidInteriorRectWidth' }, + 'lastfilenumber' => { 181 => 0x1b }, + 'lastkeywordiptc' => { 178 => 'LastKeywordIPTC' }, + 'lastkeywordxmp' => { 178 => 'LastKeywordXMP' }, + 'lastphotodate' => { 466 => 'LastPhotoDate' }, + 'lasturl' => { 505 => 'LastURL' }, + 'lateralchromaticaberration' => { 420 => 0x2012 }, + 'lateralchromaticaberrationcorrectionalreadyapplied' => { 475 => 'LateralChromaticAberrationCorrectionAlreadyApplied' }, + 'latestageorhigheststage' => { 118 => [\'GeologicalContext','GeologicalContextLatestAgeOrHighestStage'] }, + 'latesteonorhighesteonothem' => { 118 => [\'GeologicalContext','GeologicalContextLatestEonOrHighestEonothem'] }, + 'latestepochorhighestseries' => { 118 => [\'GeologicalContext','GeologicalContextLatestEpochOrHighestSeries'] }, + 'latesteraorhighesterathem' => { 118 => [\'GeologicalContext','GeologicalContextLatestEraOrHighestErathem'] }, + 'latestperiodorhighestsystem' => { 118 => [\'GeologicalContext','GeologicalContextLatestPeriodOrHighestSystem'] }, + 'latitude' => { 116 => 'Latitude' }, + 'lc1' => { 346 => 0x2 }, + 'lc10' => { 346 => 0xb }, + 'lc11' => { 346 => 0xc }, + 'lc12' => { 346 => 0xd }, + 'lc14' => { 346 => 0xf }, + 'lc15' => { 346 => 0x10 }, + 'lc3' => { 346 => 0x4 }, + 'lc4' => { 346 => 0x5 }, + 'lc5' => { 346 => 0x6 }, + 'lc6' => { 346 => 0x7 }, + 'lc7' => { 346 => 0x8 }, + 'lc8' => { 346 => 0x9 }, + 'lcddisplayatpoweron' => { 84 => 0x811, 88 => 0xa }, + 'lcddisplayreturntoshoot' => { 89 => 0x12 }, + 'lcdillumination' => { 279 => '17.5', 280 => '5.2', 282 => '5.1', 283 => '5.1', 288 => '10.3', 289 => '4.2', 292 => '5.2', 293 => '5.1', 294 => '5.4', 295 => 0x101 }, + 'lcdilluminationduringbulb' => { 84 => 0x408 }, + 'lcdmatrix' => { 138 => 0xe74 }, + 'lcdmatrixchickfix' => { 138 => 0xe75 }, + 'lcdmatrixmarvin' => { 138 => 0xe76 }, + 'lcdpanels' => { 83 => 0x8 }, + 'lcheditor' => { 272 => 0x8ae85e }, + 'legacyiptcdigest' => { 492 => 'LegacyIPTCDigest' }, + 'legalcode' => { 476 => 'legalcode' }, + 'lens' => { 119 => 0xfdea, 226 => 0x84, 475 => 'Lens' }, + 'lensafstopbutton' => { 82 => 0x11, 83 => 0x13, 84 => 0x506, 85 => 0x10, 86 => 0x12, 89 => 0x13, 90 => 0x9 }, + 'lensaperturerange' => { 397 => [0x30,0x48] }, + 'lenscontrolring' => { 295 => 0xad }, + 'lenscorrectionsettings' => { 483 => 'LensCorrectionSettings' }, + 'lensdistortinfo' => { 475 => 'LensDistortInfo' }, + 'lensdistortionparams' => { 302 => 0x206 }, + 'lensdriveend' => { 224 => 0x56 }, + 'lensdrivenoaf' => { 84 => 0x505 }, + 'lensdrivewhenafimpossible' => { 2 => 0xb }, + 'lense-mountversion' => { 409 => 0x3f0, 454 => 0xd }, + 'lensfirmware' => { 388 => 0x20, 394 => 0xa004 }, + 'lensfirmwareversion' => { 298 => 0x204, 320 => 0x60, 409 => 0x3f3, 454 => 0x14 }, + 'lensfocallength' => { 103 => 0xf0512, 346 => 0x9 }, + 'lensfocalrange' => { 397 => [0xa,0x2a] }, + 'lensfocusfunctionbuttons' => { 280 => '55.1', 282 => '52.1', 283 => '52.1', 292 => '52.1', 293 => '52.1' }, + 'lensformat' => { 433 => 0x1891, 435 => 0x18bd, 436 => 0x18ed, 437 => 0x17f1, 439 => 0x106, 440 => 0x106, 450 => 0x603, 451 => 0x5d }, + 'lensfstops' => { 218 => 0x7, 219 => 0xc, 220 => 0xd, 224 => 0xe, 226 => 0x8b, 346 => '0.3' }, + 'lensfunc1button' => { 295 => 0x9f }, + 'lensfunc2button' => { 295 => 0xa7 }, + 'lensid' => { 224 => 0x30, 475 => 'LensID' }, + 'lensidnumber' => { 218 => 0x6, 219 => 0xb, 220 => 0xc, 224 => 0xd }, + 'lensinfo' => { 119 => 0xa432, 352 => 0x2a, 475 => 'LensInfo', 485 => 'LensSpecification' }, + 'lenskind' => { 346 => 0x1 }, + 'lensmake' => { 119 => 0xa433, 163 => 'Make', 485 => 'LensMake' }, + 'lensmanualdistortionamount' => { 478 => 'LensManualDistortionAmount', 480 => 'LensManualDistortionAmount' }, + 'lensmanufacturer' => { 178 => 'LensManufacturer' }, + 'lensmaxaperturerange' => { 397 => 0x2b }, + 'lensmodel' => { 7 => 0x937, 14 => 0x92b, 15 => 0x933, 64 => 0x95, 119 => 0xa434, 163 => 'Model', 178 => 'LensModel', 221 => 0x18a, 222 => 0x18b, 223 => 0x2ac, 298 => 0x203, 352 => 0xc, 364 => 0x412, 485 => 'LensModel' }, + 'lensmodulationoptimizer' => { 127 => 0x1045 }, + 'lensmount' => { 409 => 0x99, 433 => 0x1892, 435 => 0x18be, 436 => 0x18ee, 437 => 0x17f2, 439 => 0x105, 440 => 0x105, 450 => 0x604, 451 => 0x5e }, + 'lensmount2' => { 454 => 0x8 }, + 'lensmounttype' => { 224 => 0x35 }, + 'lenspositionabsolute' => { 224 => 0x5a }, + 'lensprofilechromaticaberrationscale' => { 478 => 'LensProfileChromaticAberrationScale', 480 => 'LensProfileChromaticAberrationScale' }, + 'lensprofiledigest' => { 478 => 'LensProfileDigest', 480 => 'LensProfileDigest' }, + 'lensprofiledistortionscale' => { 478 => 'LensProfileDistortionScale', 480 => 'LensProfileDistortionScale' }, + 'lensprofileenable' => { 478 => 'LensProfileEnable', 480 => 'LensProfileEnable' }, + 'lensprofilefilename' => { 478 => 'LensProfileFilename', 480 => 'LensProfileFilename' }, + 'lensprofileisembedded' => { 478 => 'LensProfileIsEmbedded', 480 => 'LensProfileIsEmbedded' }, + 'lensprofilematchkeycameramodelname' => { 478 => 'LensProfileMatchKeyCameraModelName', 480 => 'LensProfileMatchKeyCameraModelName' }, + 'lensprofilematchkeyexifmake' => { 478 => 'LensProfileMatchKeyExifMake', 480 => 'LensProfileMatchKeyExifMake' }, + 'lensprofilematchkeyexifmodel' => { 478 => 'LensProfileMatchKeyExifModel', 480 => 'LensProfileMatchKeyExifModel' }, + 'lensprofilematchkeyisraw' => { 478 => 'LensProfileMatchKeyIsRaw', 480 => 'LensProfileMatchKeyIsRaw' }, + 'lensprofilematchkeylensid' => { 478 => 'LensProfileMatchKeyLensID', 480 => 'LensProfileMatchKeyLensID' }, + 'lensprofilematchkeylensinfo' => { 478 => 'LensProfileMatchKeyLensInfo', 480 => 'LensProfileMatchKeyLensInfo' }, + 'lensprofilematchkeylensname' => { 478 => 'LensProfileMatchKeyLensName', 480 => 'LensProfileMatchKeyLensName' }, + 'lensprofilematchkeysensorformatfactor' => { 478 => 'LensProfileMatchKeySensorFormatFactor', 480 => 'LensProfileMatchKeySensorFormatFactor' }, + 'lensprofilename' => { 478 => 'LensProfileName', 480 => 'LensProfileName' }, + 'lensprofilesetup' => { 478 => 'LensProfileSetup', 480 => 'LensProfileSetup' }, + 'lensprofilevignettingscale' => { 478 => 'LensProfileVignettingScale', 480 => 'LensProfileVignettingScale' }, + 'lensproperties' => { 298 => 0x20b }, + 'lensserialnumber' => { 21 => 0x164, 32 => 0x16b, 61 => 0x0, 119 => 0xa435, 163 => 'SerialNumber', 298 => 0x202, 318 => 0x321, 320 => 0x52, 380 => 'LENS', 388 => 0x30, 475 => 'LensSerialNumber', 485 => 'LensSerialNumber' }, + 'lensshutterlock' => { 184 => 0x4a }, + 'lensspec' => { 404 => 0x0, 405 => 0x0, 406 => 0x0, 420 => 0xb02a }, + 'lensspecfeatures' => { 439 => [0x115,0x116], 440 => [0x116,0x1ed,0x1f0,0x21c,0x21e] }, + 'lenstemperature' => { 302 => 0x1008 }, + 'lenstype' => { 7 => 0xe2, 8 => 0xd, 9 => 0x1a7, 10 => 0xc, 11 => 0x111, 12 => 0xc, 13 => 0x14f, 14 => 0xd6, 15 => 0xde, 16 => 0xf6, 17 => 0xea, 18 => 0xff, 19 => [0xc,0x97], 20 => 0xe6, 21 => 0x153, 22 => 0xea, 23 => 0xe8, 24 => 0x127, 25 => 0x161, 26 => 0x166, 27 => 0x184, 28 => 0x112, 29 => 0x189, 34 => 0x16, 186 => 0x10c, 187 => 0x49bd, 226 => 0x83, 298 => 0x201, 311 => 0x16, 315 => 0x310, 317 => 0x303, 318 => 0x303, 320 => 0x51, 322 => 0x3405, 347 => 0x0, 348 => 0x0, 349 => 0x1, 350 => 0x1, 351 => 0x1, 353 => 0x0, 394 => 0xa003, 397 => 0x27, 420 => 0xb027, 433 => 0x1896, 435 => 0x18c2, 436 => 0x18f2, 437 => 0x17f6, 439 => 0x109, 440 => 0x109, 450 => 0x608, 451 => 0x62 }, + 'lenstype2' => { 409 => 0x3f7, 433 => 0x1893, 435 => 0x18bf, 436 => 0x18ef, 437 => 0x17f3, 439 => 0x107, 440 => 0x107, 450 => 0x605, 451 => 0x60 }, + 'lenstype3' => { 454 => 0x9 }, + 'lenstypemake' => { 320 => 0xc4 }, + 'lenstypemodel' => { 320 => [0xc5,0xe4] }, + 'lenszoomposition' => { 447 => 0x19, 448 => 0x1e, 451 => [0x342,0x34e,0x35a] }, + 'levelindicator' => { 328 => 0x15 }, + 'levelmeter' => { 380 => ['Lvlm','lvlm'] }, + 'levelorientation' => { 354 => 0x0 }, + 'license' => { 476 => 'license' }, + 'licensee' => { 307 => 'Licensee' }, + 'licenseeid' => { 307 => [\'Licensee','LicenseeLicenseeID'] }, + 'licenseeimageid' => { 307 => 'LicenseeImageID' }, + 'licenseeimagenotes' => { 307 => 'LicenseeImageNotes' }, + 'licenseename' => { 307 => [\'Licensee','LicenseeLicenseeName'] }, + 'licenseenddate' => { 307 => 'LicenseEndDate' }, + 'licenseeprojectreference' => { 307 => 'LicenseeProjectReference' }, + 'licenseetransactionid' => { 307 => 'LicenseeTransactionID' }, + 'licenseid' => { 307 => 'LicenseID' }, + 'licensestartdate' => { 307 => 'LicenseStartDate' }, + 'licensetransactiondate' => { 307 => 'LicenseTransactionDate' }, + 'licensetype' => { 482 => 'licensetype' }, + 'licensor' => { 307 => 'Licensor' }, + 'licensorcity' => { 307 => [\'Licensor','LicensorLicensorCity'] }, + 'licensorcountry' => { 307 => [\'Licensor','LicensorLicensorCountry'] }, + 'licensoremail' => { 307 => [\'Licensor','LicensorLicensorEmail'] }, + 'licensorextendedaddress' => { 307 => [\'Licensor','LicensorLicensorExtendedAddress'] }, + 'licensorid' => { 307 => [\'Licensor','LicensorLicensorID'] }, + 'licensorimageid' => { 307 => 'LicensorImageID' }, + 'licensorname' => { 307 => [\'Licensor','LicensorLicensorName'] }, + 'licensornotes' => { 307 => 'LicensorNotes' }, + 'licensorpostalcode' => { 307 => [\'Licensor','LicensorLicensorPostalCode'] }, + 'licensorregion' => { 307 => [\'Licensor','LicensorLicensorRegion'] }, + 'licensorstreetaddress' => { 307 => [\'Licensor','LicensorLicensorStreetAddress'] }, + 'licensortelephone1' => { 307 => [\'Licensor','LicensorLicensorTelephone1'] }, + 'licensortelephone2' => { 307 => [\'Licensor','LicensorLicensorTelephone2'] }, + 'licensortelephonetype1' => { 307 => [\'Licensor','LicensorLicensorTelephoneType1'] }, + 'licensortelephonetype2' => { 307 => [\'Licensor','LicensorLicensorTelephoneType2'] }, + 'licensortransactionid' => { 307 => 'LicensorTransactionID' }, + 'licensorurl' => { 307 => [\'Licensor','LicensorLicensorURL'] }, + 'lightcondition' => { 302 => 0x1009 }, + 'lightingmode' => { 113 => 0x302a }, + 'lightreading' => { 355 => 0x15 }, + 'lightsource' => { 119 => 0x9208, 226 => 0x90, 305 => 0x1000, 484 => 'LightSource' }, + 'lightsourcespecial' => { 396 => 0x21d }, + 'lightswitch' => { 292 => '0.1', 294 => '0.1' }, + 'lightvaluecenter' => { 302 => 0x103d }, + 'lightvalueperiphery' => { 302 => 0x103e }, + 'limitaf-areamodesel3dtracking' => { 295 => 0x153 }, + 'limitaf-areamodeseldynamic_l' => { 295 => 0x151 }, + 'limitaf-areamodeseldynamic_m' => { 295 => 0x150 }, + 'limitaf-areamodeseldynamic_s' => { 295 => 0x14f }, + 'limitaf-areamodeselpinpoint' => { 295 => 0x11 }, + 'limitaf-areamodeselwideaf_l' => { 295 => 0x14 }, + 'limitaf-areamodeselwideaf_s' => { 295 => 0x13 }, + 'limitafareamodeselauto' => { 295 => 0x15 }, + 'limitafareamodeselection' => { 280 => '51.1', 282 => '49.1', 283 => '49.1', 292 => '49.1', 293 => '49.1' }, + 'limitreleasemodeselc120' => { 295 => '269.4' }, + 'limitreleasemodeselc30' => { 295 => '269.3' }, + 'limitreleasemodeselch' => { 295 => '269.2' }, + 'limitreleasemodeselcl' => { 295 => '269.1' }, + 'limitreleasemodeselself' => { 295 => '269.5' }, + 'limitselectableimagearea16to9' => { 295 => 0x47 }, + 'limitselectableimagearea1to1' => { 295 => 0x46 }, + 'limitselectableimageareadx' => { 295 => 0x45 }, + 'linearitylimitblue' => { 325 => 0x10 }, + 'linearitylimitgreen' => { 325 => 0xf }, + 'linearitylimitred' => { 325 => 0xe }, + 'linearityuppermargin' => { 41 => 0x32c, 42 => 0x282, 45 => [0x2ba,0x2d1,0x2d5], 47 => 0x1e5, 48 => [0x1fe,0x2de], 49 => [0x232,0x310], 50 => 0x31e }, + 'linearizationtable' => { 119 => 0xc618 }, + 'linearresponselimit' => { 119 => 0xc62e }, + 'link' => { 494 => 'link' }, + 'linkaetoafpoint' => { 336 => '14.2' }, + 'linkedencodedrightsexpr' => { 490 => [\'LinkedEncRightsExpr','LinkedEncRightsExprLinkedRightsExpr'] }, + 'linkedencodedrightsexprlangid' => { 490 => [\'LinkedEncRightsExpr','LinkedEncRightsExprRightsExprLangId'] }, + 'linkedencodedrightsexprtype' => { 490 => [\'LinkedEncRightsExpr','LinkedEncRightsExprRightsExprEncType'] }, + 'linkedencrightsexpr' => { 490 => 'LinkedEncRightsExpr' }, + 'linlogcoring' => { 138 => 0x904 }, + 'lithostratigraphicterms' => { 118 => [\'GeologicalContext','GeologicalContextLithostratigraphicTerms'] }, + 'livephotoauto' => { 374 => 'live-photo.auto' }, + 'livephotovitalityscore' => { 374 => 'live-photo.vitality-score' }, + 'livephotovitalityscoringversion' => { 374 => 'live-photo.vitality-scoring-version' }, + 'liveviewaf' => { 284 => '32.1', 294 => '34.1' }, + 'liveviewafareamode' => { 289 => '34.1' }, + 'liveviewafmethod' => { 425 => 0x20 }, + 'liveviewafmode' => { 289 => '34.2' }, + 'liveviewafsetting' => { 409 => 0x36 }, + 'liveviewbuttonoptions' => { 280 => '50.2', 282 => '48.2', 283 => '48.2', 292 => '48.2', 293 => '48.2' }, + 'liveviewexposuresimulation' => { 84 => 0x810 }, + 'liveviewfocusmode' => { 409 => [0x8b,0x28b] }, + 'liveviewmetering' => { 409 => [0x84,0x284] }, + 'liveviewmonitorofftime' => { 280 => '21.2', 282 => '21.2', 283 => '21.2', 285 => '20.2', 286 => '20.2', 287 => '20.2', 289 => '20.2', 292 => '21.2', 293 => '21.2' }, + 'liveviewshooting' => { 57 => 0x13 }, + 'livingspecimen' => { 118 => 'LivingSpecimen' }, + 'livingspecimenmaterialsampleid' => { 118 => [\'LivingSpecimen','LivingSpecimenMaterialSampleID'] }, + 'localcaption' => { 131 => 0x79 }, + 'localizedcameramodel' => { 119 => 0xc615 }, + 'locallocationname' => { 394 => 0x30 }, + 'location' => { 225 => 0x9, 320 => 0x67, 471 => 'Location', 489 => 'Location', 493 => 'location', 494 => 'location' }, + 'locationaccuracyhorizontal' => { 374 => 'location.accuracy.horizontal' }, + 'locationareacode' => { 477 => 'lac' }, + 'locationbody' => { 374 => 'location.body' }, + 'locationcreated' => { 490 => 'LocationCreated' }, + 'locationcreatedcity' => { 490 => [\'LocationCreated','LocationCreatedCity'] }, + 'locationcreatedcountrycode' => { 490 => [\'LocationCreated','LocationCreatedCountryCode'] }, + 'locationcreatedcountryname' => { 490 => [\'LocationCreated','LocationCreatedCountryName'] }, + 'locationcreatedgpsaltitude' => { 490 => [\'LocationCreated','LocationCreatedGPSAltitude'] }, + 'locationcreatedgpslatitude' => { 490 => [\'LocationCreated','LocationCreatedGPSLatitude'] }, + 'locationcreatedgpslongitude' => { 490 => [\'LocationCreated','LocationCreatedGPSLongitude'] }, + 'locationcreatedidentifier' => { 490 => [\'LocationCreated','LocationCreatedIdentifier'] }, + 'locationcreatedlocationid' => { 490 => [\'LocationCreated','LocationCreatedLocationId'] }, + 'locationcreatedlocationname' => { 490 => [\'LocationCreated','LocationCreatedLocationName'] }, + 'locationcreatedprovincestate' => { 490 => [\'LocationCreated','LocationCreatedProvinceState'] }, + 'locationcreatedsublocation' => { 490 => [\'LocationCreated','LocationCreatedSublocation'] }, + 'locationcreatedworldregion' => { 490 => [\'LocationCreated','LocationCreatedWorldRegion'] }, + 'locationdate' => { 374 => 'location.date' }, + 'locationinformation' => { 380 => 'loci' }, + 'locationinfoversion' => { 225 => 0x0 }, + 'locationname' => { 374 => 'location.name', 394 => 0x31 }, + 'locationnote' => { 374 => 'location.note' }, + 'locationrole' => { 374 => 'location.role' }, + 'locationshown' => { 490 => 'LocationShown' }, + 'locationshowncity' => { 490 => [\'LocationShown','LocationShownCity'] }, + 'locationshowncountrycode' => { 490 => [\'LocationShown','LocationShownCountryCode'] }, + 'locationshowncountryname' => { 490 => [\'LocationShown','LocationShownCountryName'] }, + 'locationshowngpsaltitude' => { 490 => [\'LocationShown','LocationShownGPSAltitude'] }, + 'locationshowngpslatitude' => { 490 => [\'LocationShown','LocationShownGPSLatitude'] }, + 'locationshowngpslongitude' => { 490 => [\'LocationShown','LocationShownGPSLongitude'] }, + 'locationshownidentifier' => { 490 => [\'LocationShown','LocationShownIdentifier'] }, + 'locationshownlocationid' => { 490 => [\'LocationShown','LocationShownLocationId'] }, + 'locationshownlocationname' => { 490 => [\'LocationShown','LocationShownLocationName'] }, + 'locationshownprovincestate' => { 490 => [\'LocationShown','LocationShownProvinceState'] }, + 'locationshownsublocation' => { 490 => [\'LocationShown','LocationShownSublocation'] }, + 'locationshownworldregion' => { 490 => [\'LocationShown','LocationShownWorldRegion'] }, + 'lockmicrophonebutton' => { 84 => 0x709 }, + 'logcomment' => { 504 => 'logComment' }, + 'logscale' => { 138 => 0x902 }, + 'longdescription' => { 372 => 'ldes' }, + 'longexposurenoisereduction' => { 62 => 0x4, 84 => 0x201, 85 => 0x1, 86 => 0x2, 87 => 0x1, 88 => 0x1, 89 => 0x2, 90 => 0x1, 320 => 0x49, 407 => 0x2b, 408 => 0x25, 409 => 0x25, 420 => 0x2008, 425 => 0x11, 451 => 0x44 }, + 'longexposurenoisereduction2' => { 57 => 0x8 }, + 'longexposurenrused' => { 320 => 0xbe }, + 'longitude' => { 116 => 'Longitude' }, + 'look' => { 478 => 'Look', 480 => 'Look' }, + 'lookamount' => { 478 => [\'Look','LookAmount'], 480 => [\'Look','LookAmount'] }, + 'lookcluster' => { 478 => [\'Look','LookCluster'], 480 => [\'Look','LookCluster'] }, + 'lookcopyright' => { 478 => [\'Look','LookCopyright'], 480 => [\'Look','LookCopyright'] }, + 'lookgroup' => { 478 => [\'Look','LookGroup'], 480 => [\'Look','LookGroup'] }, + 'lookname' => { 478 => 'LookName', 480 => 'LookName' }, + 'lookparameters' => { 478 => [\'Look','LookParameters'], 480 => [\'Look','LookParameters'] }, + 'lookparameterscameraprofile' => { 478 => [\'Look','LookParametersCameraProfile'], 480 => [\'Look','LookParametersCameraProfile'] }, + 'lookparametersclarity2012' => { 478 => [\'Look','LookParametersClarity2012'], 480 => [\'Look','LookParametersClarity2012'] }, + 'lookparametersconverttograyscale' => { 478 => [\'Look','LookParametersConvertToGrayscale'], 480 => [\'Look','LookParametersConvertToGrayscale'] }, + 'lookparameterslooktable' => { 478 => [\'Look','LookParametersLookTable'], 480 => [\'Look','LookParametersLookTable'] }, + 'lookparametersprocessversion' => { 478 => [\'Look','LookParametersProcessVersion'], 480 => [\'Look','LookParametersProcessVersion'] }, + 'lookparameterstonecurvepv2012' => { 478 => [\'Look','LookParametersToneCurvePV2012'], 480 => [\'Look','LookParametersToneCurvePV2012'] }, + 'lookparameterstonecurvepv2012blue' => { 478 => [\'Look','LookParametersToneCurvePV2012Blue'], 480 => [\'Look','LookParametersToneCurvePV2012Blue'] }, + 'lookparameterstonecurvepv2012green' => { 478 => [\'Look','LookParametersToneCurvePV2012Green'], 480 => [\'Look','LookParametersToneCurvePV2012Green'] }, + 'lookparameterstonecurvepv2012red' => { 478 => [\'Look','LookParametersToneCurvePV2012Red'], 480 => [\'Look','LookParametersToneCurvePV2012Red'] }, + 'lookparametersversion' => { 478 => [\'Look','LookParametersVersion'], 480 => [\'Look','LookParametersVersion'] }, + 'looksupportsamount' => { 478 => [\'Look','LookSupportsAmount'], 480 => [\'Look','LookSupportsAmount'] }, + 'looksupportsmonochrome' => { 478 => [\'Look','LookSupportsMonochrome'], 480 => [\'Look','LookSupportsMonochrome'] }, + 'looksupportsoutputreferred' => { 478 => [\'Look','LookSupportsOutputReferred'], 480 => [\'Look','LookSupportsOutputReferred'] }, + 'lookuuid' => { 478 => [\'Look','LookUUID'], 480 => [\'Look','LookUUID'] }, + 'loop' => { 504 => 'loop' }, + 'loopstyle' => { 380 => 'LOOP' }, + 'lowestbiostratigraphiczone' => { 118 => [\'GeologicalContext','GeologicalContextLowestBiostratigraphicZone'] }, + 'luminanceadjustmentaqua' => { 478 => 'LuminanceAdjustmentAqua', 480 => 'LuminanceAdjustmentAqua' }, + 'luminanceadjustmentblue' => { 478 => 'LuminanceAdjustmentBlue', 480 => 'LuminanceAdjustmentBlue' }, + 'luminanceadjustmentgreen' => { 478 => 'LuminanceAdjustmentGreen', 480 => 'LuminanceAdjustmentGreen' }, + 'luminanceadjustmentmagenta' => { 478 => 'LuminanceAdjustmentMagenta', 480 => 'LuminanceAdjustmentMagenta' }, + 'luminanceadjustmentorange' => { 478 => 'LuminanceAdjustmentOrange', 480 => 'LuminanceAdjustmentOrange' }, + 'luminanceadjustmentpurple' => { 478 => 'LuminanceAdjustmentPurple', 480 => 'LuminanceAdjustmentPurple' }, + 'luminanceadjustmentred' => { 478 => 'LuminanceAdjustmentRed', 480 => 'LuminanceAdjustmentRed' }, + 'luminanceadjustmentyellow' => { 478 => 'LuminanceAdjustmentYellow', 480 => 'LuminanceAdjustmentYellow' }, + 'luminancecurvelimits' => { 108 => 0x150 }, + 'luminancecurvepoints' => { 108 => 0x126 }, + 'luminancenoisereduction' => { 103 => 0x20600, 109 => 0x5f, 397 => 0x1b }, + 'luminancenoisereductioncontrast' => { 478 => 'LuminanceNoiseReductionContrast', 480 => 'LuminanceNoiseReductionContrast' }, + 'luminancenoisereductiondetail' => { 478 => 'LuminanceNoiseReductionDetail', 480 => 'LuminanceNoiseReductionDetail' }, + 'luminancenr_tiff_jpeg' => { 109 => 0x6d }, + 'luminancesmoothing' => { 478 => 'LuminanceSmoothing', 480 => 'LuminanceSmoothing' }, + 'lvshootingareadisplay' => { 84 => [0x40b,0x40c] }, + 'lyrics' => { 372 => "\xa9lyr", 380 => "\xa9lyr", 504 => 'lyrics' }, + 'lyricsuri' => { 380 => 'lrcu' }, + 'm16cversion' => { 315 => 0x333 }, + 'macatom' => { 479 => 'macAtom' }, + 'macatomapplicationcode' => { 479 => [\'macAtom','macAtomApplicationCode'] }, + 'macatominvocationappleevent' => { 479 => [\'macAtom','macAtomInvocationAppleEvent'] }, + 'macatomposixprojectpath' => { 479 => [\'macAtom','macAtomPosixProjectPath'] }, + 'machineobservation' => { 118 => 'MachineObservation' }, + 'machineobservationday' => { 118 => [\'MachineObservation','MachineObservationDay'] }, + 'machineobservationearliestdate' => { 118 => [\'MachineObservation','MachineObservationEarliestDate'] }, + 'machineobservationenddayofyear' => { 118 => [\'MachineObservation','MachineObservationEndDayOfYear'] }, + 'machineobservationeventdate' => { 118 => [\'MachineObservation','MachineObservationEventDate'] }, + 'machineobservationeventid' => { 118 => [\'MachineObservation','MachineObservationEventID'] }, + 'machineobservationeventremarks' => { 118 => [\'MachineObservation','MachineObservationEventRemarks'] }, + 'machineobservationeventtime' => { 118 => [\'MachineObservation','MachineObservationEventTime'] }, + 'machineobservationfieldnotes' => { 118 => [\'MachineObservation','MachineObservationFieldNotes'] }, + 'machineobservationfieldnumber' => { 118 => [\'MachineObservation','MachineObservationFieldNumber'] }, + 'machineobservationhabitat' => { 118 => [\'MachineObservation','MachineObservationHabitat'] }, + 'machineobservationlatestdate' => { 118 => [\'MachineObservation','MachineObservationLatestDate'] }, + 'machineobservationmonth' => { 118 => [\'MachineObservation','MachineObservationMonth'] }, + 'machineobservationparenteventid' => { 118 => [\'MachineObservation','MachineObservationParentEventID'] }, + 'machineobservationsamplesizeunit' => { 118 => [\'MachineObservation','MachineObservationSampleSizeUnit'] }, + 'machineobservationsamplesizevalue' => { 118 => [\'MachineObservation','MachineObservationSampleSizeValue'] }, + 'machineobservationsamplingeffort' => { 118 => [\'MachineObservation','MachineObservationSamplingEffort'] }, + 'machineobservationsamplingprotocol' => { 118 => [\'MachineObservation','MachineObservationSamplingProtocol'] }, + 'machineobservationstartdayofyear' => { 118 => [\'MachineObservation','MachineObservationStartDayOfYear'] }, + 'machineobservationverbatimeventdate' => { 118 => [\'MachineObservation','MachineObservationVerbatimEventDate'] }, + 'machineobservationyear' => { 118 => [\'MachineObservation','MachineObservationYear'] }, + 'macro' => { 127 => 0x1020, 129 => 0x202, 151 => 0x2b, 302 => 0x202, 386 => 0x21, 396 => 0x202, 420 => 0xb040 }, + 'macroled' => { 300 => 0x120a }, + 'macromagnification' => { 7 => 0x1b, 11 => 0x1b, 14 => 0x1b, 15 => 0x1b, 19 => 0x1b, 20 => 0x1b, 57 => 0x10 }, + 'macromode' => { 34 => 0x1, 181 => 0xb, 297 => 0x300, 320 => 0x1c, 387 => 0x1009 }, + 'magentahsl' => { 103 => 0x20917 }, + 'magicfilter' => { 297 => 0x52c }, + 'magnifiedview' => { 86 => 0x11, 88 => 0x9 }, + 'mainboardversion' => { 138 => 0x438 }, + 'maindialexposurecomp' => { 290 => '0.6' }, + 'mainingredient' => { 496 => 'mainIngredient' }, + 'majorversion' => { 469 => 'MajorVersion' }, + 'make' => { 98 => 0x0, 115 => 0x1, 119 => 0x10f, 156 => 'Make', 310 => 'Make', 325 => 0x10f, 374 => 'make', 380 => ['@mak',"\xa9mak"], 493 => 'make', 500 => 'Make' }, + 'makernote' => { 484 => 'MakerNote' }, + 'makernoteapple' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotecanon' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotecasio' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotecasio2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotedji' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotedjiinfo' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteflir' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotefujifilm' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotege' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotege2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotehasselblad' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotehp' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotehp2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotehp4' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotehp6' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteisl' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotejvc' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotejvctext' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak10' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak11' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak12' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak1a' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak1b' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak3' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak4' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak5' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak6a' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak6b' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak7' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak8a' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak8b' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak8c' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodak9' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekodakunknown' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotekyocera' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteleica' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteleica10' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteleica2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteleica3' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteleica4' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteleica5' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteleica6' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteleica7' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteleica8' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteleica9' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteminolta' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteminolta2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteminolta3' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotemotorola' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotenikon' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotenikon2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotenikon3' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotenintendo' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteoffset' => { 396 => 0xff }, + 'makernoteolympus' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteolympus2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteolympus3' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotepanasonic' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotepanasonic2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotepanasonic3' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotepentax' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotepentax2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotepentax3' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotepentax4' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotepentax5' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotepentax6' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotepentaxunknown' => { 380 => 'PXMN' }, + 'makernotephaseone' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotereconyx' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotereconyx2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotereconyx3' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotericoh' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotericoh2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotericohpentax' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotericohtext' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesafety' => { 119 => 0xc635 }, + 'makernotesamsung1a' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesamsung1b' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesamsung2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesanyo' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesanyoc4' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesanyopatch' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesigma' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesony' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesony2' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesony3' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesony4' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesony5' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesonyericsson' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotesonysrf' => { 117 => 'MakN', 119 => 0x927c }, + 'makernotetype' => { 387 => 0x1 }, + 'makernoteunknown' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteunknownbinary' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteunknowntext' => { 117 => 'MakN', 119 => 0x927c }, + 'makernoteversion' => { 186 => 0x0, 226 => 0x1, 302 => 0x0, 320 => 0x8000, 391 => 0x0, 394 => 0x1, 397 => [0x1d,0x1f], 410 => 0x2000 }, + 'makerurl' => { 380 => "\xa9mal" }, + 'managedfrom' => { 505 => 'ManagedFrom' }, + 'managedfromalternatepaths' => { 505 => [\'ManagedFrom','ManagedFromAlternatePaths'] }, + 'managedfromdocumentid' => { 505 => [\'ManagedFrom','ManagedFromDocumentID'] }, + 'managedfromfilepath' => { 505 => [\'ManagedFrom','ManagedFromFilePath'] }, + 'managedfromfrompart' => { 505 => [\'ManagedFrom','ManagedFromFromPart'] }, + 'managedfrominstanceid' => { 505 => [\'ManagedFrom','ManagedFromInstanceID'] }, + 'managedfromlastmodifydate' => { 505 => [\'ManagedFrom','ManagedFromLastModifyDate'] }, + 'managedfromlasturl' => { 505 => [\'ManagedFrom','ManagedFromLastURL'] }, + 'managedfromlinkcategory' => { 505 => [\'ManagedFrom','ManagedFromLinkCategory'] }, + 'managedfromlinkform' => { 505 => [\'ManagedFrom','ManagedFromLinkForm'] }, + 'managedfrommanager' => { 505 => [\'ManagedFrom','ManagedFromManager'] }, + 'managedfrommanagervariant' => { 505 => [\'ManagedFrom','ManagedFromManagerVariant'] }, + 'managedfrommanageto' => { 505 => [\'ManagedFrom','ManagedFromManageTo'] }, + 'managedfrommanageui' => { 505 => [\'ManagedFrom','ManagedFromManageUI'] }, + 'managedfrommaskmarkers' => { 505 => [\'ManagedFrom','ManagedFromMaskMarkers'] }, + 'managedfromoriginaldocumentid' => { 505 => [\'ManagedFrom','ManagedFromOriginalDocumentID'] }, + 'managedfrompartmapping' => { 505 => [\'ManagedFrom','ManagedFromPartMapping'] }, + 'managedfromplacedresolutionunit' => { 505 => [\'ManagedFrom','ManagedFromPlacedResolutionUnit'] }, + 'managedfromplacedxresolution' => { 505 => [\'ManagedFrom','ManagedFromPlacedXResolution'] }, + 'managedfromplacedyresolution' => { 505 => [\'ManagedFrom','ManagedFromPlacedYResolution'] }, + 'managedfromrenditionclass' => { 505 => [\'ManagedFrom','ManagedFromRenditionClass'] }, + 'managedfromrenditionparams' => { 505 => [\'ManagedFrom','ManagedFromRenditionParams'] }, + 'managedfromtopart' => { 505 => [\'ManagedFrom','ManagedFromToPart'] }, + 'managedfromversionid' => { 505 => [\'ManagedFrom','ManagedFromVersionID'] }, + 'manager' => { 505 => 'Manager' }, + 'managervariant' => { 505 => 'ManagerVariant' }, + 'manageto' => { 505 => 'ManageTo' }, + 'manageui' => { 505 => 'ManageUI' }, + 'manifest' => { 505 => 'Manifest' }, + 'manifestlinkform' => { 505 => [\'Manifest','ManifestLinkForm'] }, + 'manifestplacedresolutionunit' => { 505 => [\'Manifest','ManifestPlacedResolutionUnit'] }, + 'manifestplacedxresolution' => { 505 => [\'Manifest','ManifestPlacedXResolution'] }, + 'manifestplacedyresolution' => { 505 => [\'Manifest','ManifestPlacedYResolution'] }, + 'manifestreference' => { 505 => [\'Manifest','ManifestReference'] }, + 'manifestreferencealternatepaths' => { 505 => [\'Manifest','ManifestReferenceAlternatePaths'] }, + 'manifestreferencedocumentid' => { 505 => [\'Manifest','ManifestReferenceDocumentID'] }, + 'manifestreferencefilepath' => { 505 => [\'Manifest','ManifestReferenceFilePath'] }, + 'manifestreferencefrompart' => { 505 => [\'Manifest','ManifestReferenceFromPart'] }, + 'manifestreferenceinstanceid' => { 505 => [\'Manifest','ManifestReferenceInstanceID'] }, + 'manifestreferencelastmodifydate' => { 505 => [\'Manifest','ManifestReferenceLastModifyDate'] }, + 'manifestreferencelasturl' => { 505 => [\'Manifest','ManifestReferenceLastURL'] }, + 'manifestreferencelinkcategory' => { 505 => [\'Manifest','ManifestReferenceLinkCategory'] }, + 'manifestreferencelinkform' => { 505 => [\'Manifest','ManifestReferenceLinkForm'] }, + 'manifestreferencemanager' => { 505 => [\'Manifest','ManifestReferenceManager'] }, + 'manifestreferencemanagervariant' => { 505 => [\'Manifest','ManifestReferenceManagerVariant'] }, + 'manifestreferencemanageto' => { 505 => [\'Manifest','ManifestReferenceManageTo'] }, + 'manifestreferencemanageui' => { 505 => [\'Manifest','ManifestReferenceManageUI'] }, + 'manifestreferencemaskmarkers' => { 505 => [\'Manifest','ManifestReferenceMaskMarkers'] }, + 'manifestreferenceoriginaldocumentid' => { 505 => [\'Manifest','ManifestReferenceOriginalDocumentID'] }, + 'manifestreferencepartmapping' => { 505 => [\'Manifest','ManifestReferencePartMapping'] }, + 'manifestreferenceplacedresolutionunit' => { 505 => [\'Manifest','ManifestReferencePlacedResolutionUnit'] }, + 'manifestreferenceplacedxresolution' => { 505 => [\'Manifest','ManifestReferencePlacedXResolution'] }, + 'manifestreferenceplacedyresolution' => { 505 => [\'Manifest','ManifestReferencePlacedYResolution'] }, + 'manifestreferencerenditionclass' => { 505 => [\'Manifest','ManifestReferenceRenditionClass'] }, + 'manifestreferencerenditionparams' => { 505 => [\'Manifest','ManifestReferenceRenditionParams'] }, + 'manifestreferencetopart' => { 505 => [\'Manifest','ManifestReferenceToPart'] }, + 'manifestreferenceversionid' => { 505 => [\'Manifest','ManifestReferenceVersionID'] }, + 'manometerpressure' => { 297 => 0x900, 320 => 0x86 }, + 'manometerreading' => { 297 => 0x901 }, + 'manualafpointselectpattern' => { 84 => 0x513 }, + 'manualafpointselpattern' => { 2 => 0xf }, + 'manualflash' => { 300 => 0x1209 }, + 'manualflashoutput' => { 34 => 0x29, 281 => '8.2', 284 => '22.2', 285 => '23.1', 286 => '23.2', 288 => '16.2', 289 => '23.2', 290 => '8.2', 291 => '23.2', 294 => '24.2', 387 => 0x100c }, + 'manualflashstrength' => { 297 => 0x406 }, + 'manualfocusdistance' => { 226 => 0x85, 302 => 0x100c, 396 => 0x223 }, + 'manualfocuspointillumination' => { 295 => 0x17 }, + 'manualfocusringinafmode' => { 295 => 0x1a }, + 'manualtv' => { 83 => 0x5, 84 => 0x705 }, + 'manufacturedate' => { 191 => 0x6705, 335 => 0x1 }, + 'manufacturedate1' => { 389 => 0x4 }, + 'manufacturedate2' => { 389 => 0x5 }, + 'manufacturer' => { 463 => 'Manufacturer', 493 => 'manufacturer' }, + 'mariahchromablursize' => { 138 => 0xf0d }, + 'mariahmaphithreshold' => { 138 => 0xf0c }, + 'mariahmaplothreshold' => { 138 => 0xf0b }, + 'mariahsigmathreshold' => { 138 => 0xf0e }, + 'mariahtexturethreshold' => { 138 => 0xf0a }, + 'marked' => { 491 => 'Marked', 508 => 'Marked' }, + 'markers' => { 504 => 'markers' }, + 'markerscomment' => { 504 => [\'markers','markersComment'] }, + 'markerscuepointparams' => { 504 => [\'markers','markersCuePointParams'] }, + 'markerscuepointparamskey' => { 504 => [\'markers','markersCuePointParamsKey'] }, + 'markerscuepointparamsvalue' => { 504 => [\'markers','markersCuePointParamsValue'] }, + 'markerscuepointtype' => { 504 => [\'markers','markersCuePointType'] }, + 'markersduration' => { 504 => [\'markers','markersDuration'] }, + 'markerslocation' => { 504 => [\'markers','markersLocation'] }, + 'markersname' => { 504 => [\'markers','markersName'] }, + 'markersprobability' => { 504 => [\'markers','markersProbability'] }, + 'markersspeaker' => { 504 => [\'markers','markersSpeaker'] }, + 'markersstarttime' => { 504 => [\'markers','markersStartTime'] }, + 'markerstarget' => { 504 => [\'markers','markersTarget'] }, + 'markerstype' => { 504 => [\'markers','markersType'] }, + 'maskedareas' => { 119 => 0xc68e }, + 'maskgroupbasedcorractive' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionActive'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionActive'] }, + 'maskgroupbasedcorramount' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionAmount'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionAmount'] }, + 'maskgroupbasedcorrblacks2012' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalBlacks2012'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalBlacks2012'] }, + 'maskgroupbasedcorrbrightness' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalBrightness'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalBrightness'] }, + 'maskgroupbasedcorrclarity' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalClarity'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalClarity'] }, + 'maskgroupbasedcorrclarity2012' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalClarity2012'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalClarity2012'] }, + 'maskgroupbasedcorrcontrast' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalContrast'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalContrast'] }, + 'maskgroupbasedcorrcontrast2012' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalContrast2012'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalContrast2012'] }, + 'maskgroupbasedcorrcorrectionname' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionName'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionName'] }, + 'maskgroupbasedcorrcorrectionsyncid' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionSyncID'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionSyncID'] }, + 'maskgroupbasedcorrdefringe' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalDefringe'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalDefringe'] }, + 'maskgroupbasedcorrdehaze' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalDehaze'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalDehaze'] }, + 'maskgroupbasedcorrections' => { 478 => 'MaskGroupBasedCorrections', 480 => 'MaskGroupBasedCorrections' }, + 'maskgroupbasedcorrexposure' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalExposure'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalExposure'] }, + 'maskgroupbasedcorrexposure2012' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalExposure2012'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalExposure2012'] }, + 'maskgroupbasedcorrhighlights2012' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalHighlights2012'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalHighlights2012'] }, + 'maskgroupbasedcorrhue' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalHue'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalHue'] }, + 'maskgroupbasedcorrluminancenoise' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalLuminanceNoise'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalLuminanceNoise'] }, + 'maskgroupbasedcorrmask' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasks'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasks'] }, + 'maskgroupbasedcorrmaskalpha' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksAlpha'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksAlpha'] }, + 'maskgroupbasedcorrmaskangle' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksAngle'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksAngle'] }, + 'maskgroupbasedcorrmaskbottom' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksBottom'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksBottom'] }, + 'maskgroupbasedcorrmaskcentervalue' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCenterValue'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCenterValue'] }, + 'maskgroupbasedcorrmaskcenterweight' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCenterWeight'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCenterWeight'] }, + 'maskgroupbasedcorrmaskdabs' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksDabs'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksDabs'] }, + 'maskgroupbasedcorrmaskfeather' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksFeather'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksFeather'] }, + 'maskgroupbasedcorrmaskflipped' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksFlipped'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksFlipped'] }, + 'maskgroupbasedcorrmaskflow' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksFlow'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksFlow'] }, + 'maskgroupbasedcorrmaskfullx' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksFullX'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksFullX'] }, + 'maskgroupbasedcorrmaskfully' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksFullY'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksFullY'] }, + 'maskgroupbasedcorrmaskinputdigest' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksInputDigest'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksInputDigest'] }, + 'maskgroupbasedcorrmaskleft' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksLeft'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksLeft'] }, + 'maskgroupbasedcorrmaskmaskactive' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskActive'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskActive'] }, + 'maskgroupbasedcorrmaskmaskblendmode' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskBlendMode'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskBlendMode'] }, + 'maskgroupbasedcorrmaskmaskdigest' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskDigest'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskDigest'] }, + 'maskgroupbasedcorrmaskmaskinverted' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskInverted'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskInverted'] }, + 'maskgroupbasedcorrmaskmaskname' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskName'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskName'] }, + 'maskgroupbasedcorrmaskmasks' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasks'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasks'] }, + 'maskgroupbasedcorrmaskmasksalpha' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksAlpha'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksAlpha'] }, + 'maskgroupbasedcorrmaskmasksangle' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksAngle'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksAngle'] }, + 'maskgroupbasedcorrmaskmasksbottom' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksBottom'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksBottom'] }, + 'maskgroupbasedcorrmaskmaskscentervalue' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksCenterValue'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksCenterValue'] }, + 'maskgroupbasedcorrmaskmaskscenterweight' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksCenterWeight'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksCenterWeight'] }, + 'maskgroupbasedcorrmaskmasksdabs' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksDabs'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksDabs'] }, + 'maskgroupbasedcorrmaskmasksfeather' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksFeather'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksFeather'] }, + 'maskgroupbasedcorrmaskmasksflipped' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksFlipped'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksFlipped'] }, + 'maskgroupbasedcorrmaskmasksflow' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksFlow'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksFlow'] }, + 'maskgroupbasedcorrmaskmasksfullx' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksFullX'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksFullX'] }, + 'maskgroupbasedcorrmaskmasksfully' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksFullY'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksFullY'] }, + 'maskgroupbasedcorrmaskmasksinputdigest' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksInputDigest'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksInputDigest'] }, + 'maskgroupbasedcorrmaskmasksleft' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksLeft'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksLeft'] }, + 'maskgroupbasedcorrmaskmasksmaskactive' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskActive'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskActive'] }, + 'maskgroupbasedcorrmaskmasksmaskblendmode' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskBlendMode'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskBlendMode'] }, + 'maskgroupbasedcorrmaskmasksmaskdigest' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskDigest'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskDigest'] }, + 'maskgroupbasedcorrmaskmasksmaskinverted' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskInverted'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskInverted'] }, + 'maskgroupbasedcorrmaskmasksmaskname' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskName'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskName'] }, + 'maskgroupbasedcorrmaskmasksmasksubtype' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskSubType'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskSubType'] }, + 'maskgroupbasedcorrmaskmasksmasksyncid' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskSyncID'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskSyncID'] }, + 'maskgroupbasedcorrmaskmasksmaskversion' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskVersion'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskVersion'] }, + 'maskgroupbasedcorrmaskmasksmidpoint' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMidpoint'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMidpoint'] }, + 'maskgroupbasedcorrmaskmasksorigin' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksOrigin'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksOrigin'] }, + 'maskgroupbasedcorrmaskmasksperimetervalue' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksPerimeterValue'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksPerimeterValue'] }, + 'maskgroupbasedcorrmaskmasksradius' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksRadius'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksRadius'] }, + 'maskgroupbasedcorrmaskmasksreferencepoint' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksReferencePoint'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksReferencePoint'] }, + 'maskgroupbasedcorrmaskmasksright' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksRight'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksRight'] }, + 'maskgroupbasedcorrmaskmasksroundness' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksRoundness'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksRoundness'] }, + 'maskgroupbasedcorrmaskmaskssizex' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksSizeX'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksSizeX'] }, + 'maskgroupbasedcorrmaskmaskssizey' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksSizeY'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksSizeY'] }, + 'maskgroupbasedcorrmaskmaskstop' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksTop'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksTop'] }, + 'maskgroupbasedcorrmaskmasksubtype' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskSubType'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskSubType'] }, + 'maskgroupbasedcorrmaskmasksvalue' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskValue'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksMaskValue'] }, + 'maskgroupbasedcorrmaskmasksversion' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksVersion'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksVersion'] }, + 'maskgroupbasedcorrmaskmaskswhat' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksWhat'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksWhat'] }, + 'maskgroupbasedcorrmaskmaskswholeimagearea' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksWholeImageArea'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksWholeImageArea'] }, + 'maskgroupbasedcorrmaskmasksx' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksX'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksX'] }, + 'maskgroupbasedcorrmaskmasksy' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksY'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksY'] }, + 'maskgroupbasedcorrmaskmasksyncid' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskSyncID'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskSyncID'] }, + 'maskgroupbasedcorrmaskmaskszerox' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksZeroX'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksZeroX'] }, + 'maskgroupbasedcorrmaskmaskszeroy' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksZeroY'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMasksZeroY'] }, + 'maskgroupbasedcorrmaskmaskversion' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskVersion'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskVersion'] }, + 'maskgroupbasedcorrmaskmidpoint' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMidpoint'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMidpoint'] }, + 'maskgroupbasedcorrmaskorigin' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksOrigin'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksOrigin'] }, + 'maskgroupbasedcorrmaskperimetervalue' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksPerimeterValue'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksPerimeterValue'] }, + 'maskgroupbasedcorrmaskradius' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksRadius'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksRadius'] }, + 'maskgroupbasedcorrmaskrange' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMask'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMask'] }, + 'maskgroupbasedcorrmaskrangeareamodels' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels'] }, + 'maskgroupbasedcorrmaskrangeareamodelscolorsampleinfo' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'] }, + 'maskgroupbasedcorrmaskrangeareamodelscomponents' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents'] }, + 'maskgroupbasedcorrmaskrangecoloramount' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount'] }, + 'maskgroupbasedcorrmaskrangedepthfeather' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather'] }, + 'maskgroupbasedcorrmaskrangedepthmax' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax'] }, + 'maskgroupbasedcorrmaskrangedepthmin' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin'] }, + 'maskgroupbasedcorrmaskrangeinvert' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert'] }, + 'maskgroupbasedcorrmaskrangelumfeather' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather'] }, + 'maskgroupbasedcorrmaskrangeluminancedepthsampleinfo' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo'] }, + 'maskgroupbasedcorrmaskrangelummax' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax'] }, + 'maskgroupbasedcorrmaskrangelummin' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin'] }, + 'maskgroupbasedcorrmaskrangelumrange' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange'] }, + 'maskgroupbasedcorrmaskrangesampletype' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType'] }, + 'maskgroupbasedcorrmaskrangetype' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskType'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskType'] }, + 'maskgroupbasedcorrmaskrangeversion' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion'] }, + 'maskgroupbasedcorrmaskreferencepoint' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksReferencePoint'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksReferencePoint'] }, + 'maskgroupbasedcorrmaskright' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksRight'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksRight'] }, + 'maskgroupbasedcorrmaskroundness' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksRoundness'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksRoundness'] }, + 'maskgroupbasedcorrmasksizex' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksSizeX'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksSizeX'] }, + 'maskgroupbasedcorrmasksizey' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksSizeY'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksSizeY'] }, + 'maskgroupbasedcorrmasktop' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksTop'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksTop'] }, + 'maskgroupbasedcorrmaskvalue' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskValue'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksMaskValue'] }, + 'maskgroupbasedcorrmaskversion' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksVersion'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksVersion'] }, + 'maskgroupbasedcorrmaskwhat' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksWhat'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksWhat'] }, + 'maskgroupbasedcorrmaskwholeimagearea' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksWholeImageArea'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksWholeImageArea'] }, + 'maskgroupbasedcorrmaskx' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksX'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksX'] }, + 'maskgroupbasedcorrmasky' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksY'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksY'] }, + 'maskgroupbasedcorrmaskzerox' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksZeroX'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksZeroX'] }, + 'maskgroupbasedcorrmaskzeroy' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksZeroY'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionMasksZeroY'] }, + 'maskgroupbasedcorrmoire' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalMoire'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalMoire'] }, + 'maskgroupbasedcorrrangemask' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMask'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMask'] }, + 'maskgroupbasedcorrrangemaskareamodels' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskAreaModels'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskAreaModels'] }, + 'maskgroupbasedcorrrangemaskareamodelscolorsampleinfo' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'] }, + 'maskgroupbasedcorrrangemaskareamodelscomponents' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents'] }, + 'maskgroupbasedcorrrangemaskcoloramount' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskColorAmount'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskColorAmount'] }, + 'maskgroupbasedcorrrangemaskdepthfeather' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskDepthFeather'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskDepthFeather'] }, + 'maskgroupbasedcorrrangemaskdepthmax' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskDepthMax'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskDepthMax'] }, + 'maskgroupbasedcorrrangemaskdepthmin' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskDepthMin'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskDepthMin'] }, + 'maskgroupbasedcorrrangemaskinvert' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskInvert'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskInvert'] }, + 'maskgroupbasedcorrrangemasklumfeather' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskLumFeather'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskLumFeather'] }, + 'maskgroupbasedcorrrangemaskluminancedepthsampleinfo' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo'] }, + 'maskgroupbasedcorrrangemasklummax' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskLumMax'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskLumMax'] }, + 'maskgroupbasedcorrrangemasklummin' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskLumMin'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskLumMin'] }, + 'maskgroupbasedcorrrangemasklumrange' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskLumRange'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskLumRange'] }, + 'maskgroupbasedcorrrangemasksampletype' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskSampleType'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskSampleType'] }, + 'maskgroupbasedcorrrangemasktype' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskType'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskType'] }, + 'maskgroupbasedcorrrangemaskversion' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskVersion'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsCorrectionRangeMaskVersion'] }, + 'maskgroupbasedcorrsaturation' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalSaturation'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalSaturation'] }, + 'maskgroupbasedcorrshadows2012' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalShadows2012'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalShadows2012'] }, + 'maskgroupbasedcorrsharpness' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalSharpness'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalSharpness'] }, + 'maskgroupbasedcorrtemperature' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalTemperature'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalTemperature'] }, + 'maskgroupbasedcorrtexture' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalTexture'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalTexture'] }, + 'maskgroupbasedcorrtint' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalTint'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalTint'] }, + 'maskgroupbasedcorrtoninghue' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalToningHue'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalToningHue'] }, + 'maskgroupbasedcorrtoningsaturation' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalToningSaturation'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalToningSaturation'] }, + 'maskgroupbasedcorrwhat' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsWhat'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsWhat'] }, + 'maskgroupbasedcorrwhites2012' => { 478 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalWhites2012'], 480 => [\'MaskGroupBasedCorrections','MaskGroupBasedCorrectionsLocalWhites2012'] }, + 'masterdocumentid' => { 131 => 0xb9 }, + 'mastergain' => { 237 => 0x50 }, + 'materialsample' => { 118 => 'MaterialSample' }, + 'materialsampleid' => { 118 => [\'MaterialSample','MaterialSampleMaterialSampleID'] }, + 'matrixmetering' => { 280 => '50.1', 282 => '48.1', 283 => '48.1', 292 => '48.1', 293 => '48.1', 295 => 0x233 }, + 'matrixselectk' => { 138 => 0x91b }, + 'matrixselectthreshold' => { 138 => 0x91a }, + 'matrixselectthreshold1' => { 138 => 0x91e }, + 'matrixselectthreshold2' => { 138 => 0x91f }, + 'matrixstructure' => { 379 => 0xa }, + 'maxaperture' => { 34 => 0x1a, 138 => 0x3f9, 144 => 0x6103, 163 => 'MaxAperture', 181 => 0x17, 187 => 0x49c5, 224 => 0x36, 298 => 0x20a, 346 => '14.1' }, + 'maxapertureatmaxfocal' => { 127 => 0x1407, 163 => 'MaxApertureAtMaxFocal', 218 => 0xb, 219 => 0x10, 220 => 0x11, 224 => 0x12, 298 => 0x206 }, + 'maxapertureatminfocal' => { 127 => 0x1406, 218 => 0xa, 219 => 0xf, 220 => 0x10, 224 => 0x11, 298 => 0x205 }, + 'maxaperturevalue' => { 119 => 0x9205, 364 => 0x414, 484 => 'MaxApertureValue' }, + 'maxavailheight' => { 490 => 'MaxAvailHeight' }, + 'maxavailwidth' => { 490 => 'MaxAvailWidth' }, + 'maxcontinuousrelease' => { 279 => 0xb, 280 => 0xc, 282 => '12.1', 283 => '12.1', 288 => 0xc, 289 => 0xb, 292 => '12.1', 293 => '12.1', 295 => 0x3d }, + 'maxfaces' => { 301 => 0x1202 }, + 'maxfocallength' => { 7 => 0xe6, 8 => 0x10, 9 => 0x1ab, 10 => 0x13, 11 => 0x115, 12 => 0x13, 13 => 0x153, 14 => 0xda, 16 => 0xfa, 17 => 0xee, 18 => 0x103, 19 => 0x95, 20 => 0xea, 21 => 0x157, 22 => 0xee, 23 => 0xec, 24 => 0x12b, 25 => 0x165, 26 => 0x16a, 27 => 0x188, 28 => 0x116, 29 => 0x18d, 34 => 0x17, 127 => 0x1405, 163 => 'MaxFocalLength', 218 => 0x9, 219 => 0xe, 220 => 0xf, 224 => 0x10, 298 => 0x208, 433 => 0x127c, 434 => 0x1138, 435 => 0x330, 436 => 0x330, 437 => 0x30e }, + 'maximumdensityrange' => { 133 => 0x8c }, + 'maxpagesize' => { 509 => 'MaxPageSize' }, + 'maxpagesizeh' => { 509 => [\'MaxPageSize','MaxPageSizeH'] }, + 'maxpagesizeunit' => { 509 => [\'MaxPageSize','MaxPageSizeUnit'] }, + 'maxpagesizew' => { 509 => [\'MaxPageSize','MaxPageSizeW'] }, + 'maxpixelvaluethreshold' => { 138 => 0xc7d }, + 'maxsamplevalue' => { 119 => 0x119 }, + 'maxstorage' => { 499 => 'maxstorage' }, + 'mb-d10batteries' => { 279 => '12.6' }, + 'mb-d10batterytype' => { 288 => '13.3' }, + 'mb-d11batterytype' => { 289 => '2.3' }, + 'mb-d12batterytype' => { 292 => '3.2' }, + 'mb-d80batteries' => { 290 => '6.5' }, + 'mb-d80batterytype' => { 294 => '3.2' }, + 'mcuversion' => { 218 => 0xc, 219 => 0x11, 220 => 0x12, 224 => 0x13 }, + 'md5digest' => { 164 => 'zmd5' }, + 'mditemfindercomment' => { 173 => 'MDItemFinderComment' }, + 'mditemfscreationdate' => { 173 => 'MDItemFSCreationDate' }, + 'mditemfslabel' => { 173 => 'MDItemFSLabel' }, + 'mditemusertags' => { 173 => 'MDItemUserTags' }, + 'meal' => { 496 => 'meal' }, + 'measuredev' => { 28 => 0x9, 77 => 0x3, 97 => 0x1814, 156 => 'MeasuredEV' }, + 'measuredev2' => { 13 => 0x8, 28 => 0x8, 77 => 0x17 }, + 'measuredev3' => { 13 => 0x9 }, + 'measuredlv' => { 187 => 0x690, 315 => 0x312, 318 => 0x312, 319 => 0x312, 322 => 0x3407 }, + 'measuredrggb' => { 65 => 0x1 }, + 'measuredrggbdata' => { 44 => 0x287 }, + 'measurementaccuracy' => { 118 => [\'MeasurementOrFact','MeasurementOrFactMeasurementAccuracy'] }, + 'measurementdeterminedby' => { 118 => [\'MeasurementOrFact','MeasurementOrFactMeasurementDeterminedBy'] }, + 'measurementdetermineddate' => { 118 => [\'MeasurementOrFact','MeasurementOrFactMeasurementDeterminedDate'] }, + 'measurementid' => { 118 => [\'MeasurementOrFact','MeasurementOrFactMeasurementID'] }, + 'measurementmethod' => { 118 => [\'MeasurementOrFact','MeasurementOrFactMeasurementMethod'] }, + 'measurementorfact' => { 118 => 'MeasurementOrFact' }, + 'measurementremarks' => { 118 => [\'MeasurementOrFact','MeasurementOrFactMeasurementRemarks'] }, + 'measurementtype' => { 118 => [\'MeasurementOrFact','MeasurementOrFactMeasurementType'] }, + 'measurementunit' => { 118 => [\'MeasurementOrFact','MeasurementOrFactMeasurementUnit'] }, + 'measurementvalue' => { 118 => [\'MeasurementOrFact','MeasurementOrFactMeasurementValue'] }, + 'measuretype' => { 463 => 'MeasureType' }, + 'mechanicalshuttercount' => { 226 => 0x37 }, + 'mediaclassprimaryid' => { 179 => 'WM/MediaClassPrimaryID' }, + 'mediaclasssecondaryid' => { 179 => 'WM/MediaClassSecondaryID' }, + 'mediaconstraints' => { 307 => 'MediaConstraints' }, + 'mediacreatedate' => { 376 => 0x1 }, + 'mediaeventiddate' => { 468 => 'MediaEventIdDate' }, + 'mediagroupuuid' => { 1 => 0x11 }, + 'mediamodifydate' => { 376 => 0x2 }, + 'mediasummarycode' => { 307 => 'MediaSummaryCode' }, + 'mediatype' => { 372 => 'stik' }, + 'memoaudioquality' => { 84 => 0x812 }, + 'memorycardconfiguration' => { 413 => 0x16 }, + 'memorycardnumber' => { 208 => 0x2 }, + 'menubuttondisplayposition' => { 82 => 0xb, 85 => 0xa, 86 => 0xb, 89 => 0xb }, + 'menubuttonreturn' => { 90 => 0xb }, + 'menumonitorofftime' => { 279 => '26.1', 280 => '22.1', 282 => '22.1', 283 => '22.1', 287 => '21.1', 288 => '8.2', 289 => '21.1', 292 => '22.1', 293 => '22.1', 294 => '22.1', 295 => 0x35 }, + 'menusettingsz7iioffset' => { 260 => 0xceb6 }, + 'metadatadate' => { 502 => 'MetadataDate' }, + 'metadatamoddate' => { 504 => 'metadataModDate' }, + 'metaversion' => { 428 => 0x34 }, + 'meterinfo1row1' => { 421 => 0x0, 422 => 0x0 }, + 'meterinfo1row2' => { 421 => 0x6c, 422 => 0x5a }, + 'meterinfo1row3' => { 421 => 0xd8, 422 => 0xb4 }, + 'meterinfo1row4' => { 421 => 0x144, 422 => 0x10e }, + 'meterinfo1row5' => { 421 => 0x1b0, 422 => 0x168 }, + 'meterinfo1row6' => { 421 => 0x21c, 422 => 0x1c2 }, + 'meterinfo1row7' => { 421 => 0x288, 422 => 0x21c }, + 'meterinfo2row1' => { 421 => 0x2f4, 422 => 0x276 }, + 'meterinfo2row2' => { 421 => 0x378, 422 => 0x2e4 }, + 'meterinfo2row3' => { 421 => 0x3fc, 422 => 0x352 }, + 'meterinfo2row4' => { 421 => 0x480, 422 => 0x3c0 }, + 'meterinfo2row5' => { 421 => 0x504, 422 => 0x42e }, + 'meterinfo2row6' => { 421 => 0x588, 422 => 0x49c }, + 'meterinfo2row7' => { 421 => 0x60c, 422 => 0x50a }, + 'meterinfo2row8' => { 421 => 0x690, 422 => 0x578 }, + 'meterinfo2row9' => { 421 => 0x714, 422 => 0x5e6 }, + 'metering' => { 281 => '6.1' }, + 'meteringmode' => { 34 => 0x11, 119 => 0x9207, 140 => 0x1c, 181 => 0x7, 182 => 0x25, 184 => 0x12, 297 => 0x202, 355 => 0x17, 397 => 0x9, 407 => 0x15, 408 => 0x13, 409 => 0x7, 425 => 0x3, 429 => 0x1174, 430 => 0x1178, 431 => 0x1154, 432 => 0x11d0, 433 => 0x11ac, 434 => 0x1064, 435 => 0x25c, 436 => 0x25c, 437 => 0x24b, 484 => 'MeteringMode' }, + 'meteringmode2' => { 336 => '2.1', 420 => 0x202c }, + 'meteringmode3' => { 336 => '16.1' }, + 'meteringoffscaleindicator' => { 184 => 0x53 }, + 'meteringtime' => { 279 => '22.2', 281 => '3.2', 284 => '17.1', 285 => '18.1', 288 => '7.3', 289 => '18.1', 290 => '3.2', 294 => '19.1' }, + 'micro1version' => { 382 => 0x1f }, + 'micro2version' => { 382 => 0x2d }, + 'microphoneattenuator' => { 229 => 0x2d2 }, + 'microphonefrequencyresponse' => { 229 => 0x2d4 }, + 'microphonejackpower' => { 229 => 0x2fa }, + 'microphonesensitivity' => { 229 => 0x2d0 }, + 'microvideo' => { 461 => 'MicroVideo' }, + 'microvideooffset' => { 461 => 'MicroVideoOffset' }, + 'microvideopresentationtimestampus' => { 461 => 'MicroVideoPresentationTimestampUs' }, + 'microvideoversion' => { 461 => 'MicroVideoVersion' }, + 'midrangesharpness' => { 233 => 0x3b }, + 'mieversion' => { 164 => '0Vers' }, + 'mime' => { 463 => 'Mime' }, + 'minaperture' => { 34 => 0x1b, 138 => 0x3f8, 163 => 'MinAperture', 346 => '0.2' }, + 'minaperturevalue' => { 364 => 0x415 }, + 'minfocallength' => { 7 => 0xe4, 8 => 0xe, 9 => 0x1a9, 10 => 0x11, 11 => 0x113, 12 => 0x11, 13 => 0x151, 14 => 0xd8, 16 => 0xf8, 17 => 0xec, 18 => 0x101, 19 => 0x93, 20 => 0xe8, 21 => 0x155, 22 => 0xec, 23 => 0xea, 24 => 0x129, 25 => 0x163, 26 => 0x168, 27 => 0x186, 28 => 0x114, 29 => 0x18b, 34 => 0x18, 127 => 0x1404, 163 => 'MinFocalLength', 218 => 0x8, 219 => 0xd, 220 => 0xe, 224 => 0xf, 298 => 0x207, 433 => 0x127a, 434 => 0x1136, 435 => 0x32e, 436 => 0x32e, 437 => 0x30c }, + 'minfocusdistance' => { 346 => 0x3 }, + 'minintegrationrows' => { 138 => 0x1874 }, + 'minoltadate' => { 181 => 0x15 }, + 'minoltaimagesize' => { 181 => 0x4, 182 => 0xc, 183 => 0x2, 186 => 0x103 }, + 'minoltamodelid' => { 181 => 0x25 }, + 'minoltaquality' => { 181 => 0x5, 182 => 0xd, 183 => 0x3, 186 => [0x102,0x103] }, + 'minoltatime' => { 181 => 0x16 }, + 'minormodelagedisclosure' => { 307 => 'MinorModelAgeDisclosure' }, + 'minorversion' => { 469 => 'MinorVersion' }, + 'minsamplevalue' => { 119 => 0x118 }, + 'mirrorlockup' => { 82 => 0xc, 83 => 0xc, 84 => 0x60f, 85 => 0xb, 86 => 0xc, 87 => 0x6, 88 => 0x6, 89 => 0xc, 90 => 0x3 }, + 'mobilecountrycode' => { 477 => 'mcc' }, + 'mobilenetworkcode' => { 477 => 'mnc' }, + 'moddate' => { 310 => 'modify-date', 491 => 'ModDate' }, + 'modedialposition' => { 413 => 0x14 }, + 'model' => { 98 => 0x6, 119 => 0x110, 156 => 'Model', 310 => 'Model', 325 => 0x110, 355 => 0x23f, 374 => 'model', 380 => ['@mod','CNMN','cmnm',"\xa9mdl","\xa9mod"], 397 => 0x84, 463 => 'Model', 493 => 'model', 500 => 'Model' }, + 'modelage' => { 490 => 'ModelAge' }, + 'modelid' => { 296 => 0x0 }, + 'modelingflash' => { 279 => '21.4', 280 => '31.1', 282 => '31.1', 283 => '31.1', 288 => '26.4', 289 => '30.2', 290 => '7.4', 291 => '30.1', 292 => '31.1', 293 => '31.1', 294 => '31.3', 295 => 0x5d }, + 'modelreleaseid' => { 307 => 'ModelReleaseID' }, + 'modelreleasestatus' => { 307 => 'ModelReleaseStatus' }, + 'modelreleaseyear' => { 442 => 0x52, 443 => 0x46, 444 => 0x53 }, + 'modeltiepoint' => { 119 => 0x8482 }, + 'modeltransform' => { 119 => 0x85d8 }, + 'modelyear' => { 493 => 'modelYear' }, + 'modificationdate' => { 494 => 'modificationDate' }, + 'modifiedcolortemp' => { 66 => 0x9 }, + 'modifieddigitalgain' => { 66 => 0xb }, + 'modifiedparamflag' => { 58 => 0x1 }, + 'modifiedpicturestyle' => { 66 => 0xa }, + 'modifiedsaturation' => { 297 => 0x504 }, + 'modifiedsensorbluelevel' => { 66 => 0x5 }, + 'modifiedsensorredlevel' => { 66 => 0x4 }, + 'modifiedsharpness' => { 66 => 0x2 }, + 'modifiedsharpnessfreq' => { 66 => 0x3 }, + 'modifiedtonecurve' => { 66 => 0x1 }, + 'modifiedwhitebalance' => { 66 => 0x8 }, + 'modifiedwhitebalanceblue' => { 66 => 0x7 }, + 'modifiedwhitebalancered' => { 66 => 0x6 }, + 'modifydate' => { 119 => 0x132, 157 => 'ModifyDate', 306 => 'ModDate', 308 => 'tIME', 371 => 'ModDate', 377 => 0x2, 502 => 'ModifyDate' }, + 'moirefilter' => { 119 => 0xfe58, 478 => 'MoireFilter', 480 => 'MoireFilter' }, + 'monitorbrightness' => { 229 => 0x59a }, + 'monitordisplayoff' => { 184 => 0x4c }, + 'monitormatrix' => { 138 => 0x8fc }, + 'monitorofftime' => { 279 => '18.2', 281 => '3.1', 290 => '3.1' }, + 'monochromecolor' => { 297 => 0x53b }, + 'monochromecontrast' => { 109 => 0x3c }, + 'monochromefiltereffect' => { 103 => 0x20307, 109 => 0x3a, 320 => 0xac, 355 => 0x73 }, + 'monochromegraineffect' => { 320 => 0xd2 }, + 'monochromelinear' => { 109 => 0x3d }, + 'monochromeoutputhighlightpoint' => { 109 => 0x41 }, + 'monochromeoutputshadowpoint' => { 109 => 0x42 }, + 'monochromeprofilesettings' => { 297 => 0x537 }, + 'monochromerawhighlight' => { 109 => 0x7a }, + 'monochromerawhighlightpoint' => { 109 => 0x3f }, + 'monochromerawshadow' => { 109 => 0x83 }, + 'monochromerawshadowpoint' => { 109 => 0x40 }, + 'monochromesharpness' => { 109 => 0x3e }, + 'monochrometoning' => { 355 => 0x74 }, + 'monochrometoningeffect' => { 103 => 0x20306, 109 => 0x3b }, + 'monochromeunsharpmaskfineness' => { 109 => 0xb2 }, + 'monochromeunsharpmaskstrength' => { 109 => 0xb0 }, + 'monochromeunsharpmaskthreshold' => { 109 => 0xb4 }, + 'monochromevignetting' => { 297 => 0x53a }, + 'monthdaycreated' => { 140 => 0x12, 149 => 0xe }, + 'mood' => { 179 => 'WM/Mood' }, + 'moonphase' => { 381 => 0x12, 382 => 0x43, 383 => 0x4c }, + 'morepermissions' => { 476 => 'morePermissions' }, + 'motionsensitivity' => { 381 => 0x29, 383 => 0x60 }, + 'movementcount' => { 372 => "\xa9mvc" }, + 'movementname' => { 372 => "\xa9mvn" }, + 'movementnumber' => { 372 => "\xa9mvi" }, + 'movieactived-lighting' => { 228 => 0x238, 229 => 0x2b8 }, + 'movieaelockbuttonassignment' => { 292 => '40.1' }, + 'movieaf-onbutton' => { 295 => 0xcb }, + 'movieafareamode' => { 229 => 0x2c6, 295 => 0x203 }, + 'movieafspeed' => { 295 => 0xdd }, + 'movieafspeedapply' => { 295 => 0xdf }, + 'movieaftrackingsensitivity' => { 295 => 0xe1 }, + 'movieaperturelock' => { 295 => 0x259 }, + 'movieautodistortioncontrol' => { 228 => 0x242 }, + 'moviediffractioncompensation' => { 228 => 0x241 }, + 'moviedxcropalert' => { 229 => 0x2fb }, + 'movieelectronicvr' => { 229 => 0x2cc }, + 'movieevfgrid' => { 295 => 0x21d }, + 'movieflickerreduction' => { 229 => 0x2c0 }, + 'moviefocusmode' => { 228 => 0x248, 229 => 0x2c4 }, + 'moviefocuspointlock' => { 295 => 0x226 }, + 'movieframerate' => { 228 => 0x1f8, 229 => 0x2f4 }, + 'movieframesize' => { 228 => 0x1f6, 229 => 0x2f2 }, + 'moviefunc1button' => { 282 => '41.1', 283 => '41.1', 293 => '41.1', 295 => 0xc3 }, + 'moviefunc3button' => { 295 => 0x127 }, + 'moviefunctionbutton' => { 280 => '41.1', 292 => '41.1' }, + 'moviefunctionbuttonplusdials' => { 280 => '52.1' }, + 'moviehighisonoisereduction' => { 228 => 0x23c, 229 => 0x2ba }, + 'moviehighlightdisplaythreshold' => { 295 => 0x215 }, + 'movieimagearea' => { 229 => 0x25c }, + 'movieisoautocontrolmanualmode' => { 229 => 0x26a }, + 'movieisoautohilimit' => { 229 => 0x268 }, + 'movieisoautomanualmode' => { 228 => 0x204, 229 => 0x26c }, + 'moviemeteringmode' => { 229 => 0x2c2 }, + 'moviemidtonedisplayrange' => { 295 => 0x219 }, + 'moviemidtonedisplayvalue' => { 295 => 0x217 }, + 'moviemultiselector' => { 295 => 0xd9 }, + 'moviepreviewbutton' => { 280 => '41.2', 282 => '41.2', 283 => '41.2', 292 => '41.2', 293 => '41.2' }, + 'moviepreviewbuttonplusdials' => { 280 => '52.2' }, + 'movierecordbuttonplaybackmode' => { 295 => 0x1b5 }, + 'movieshutterbutton' => { 280 => '38.3', 282 => '38.3', 283 => '38.3', 292 => '38.3', 293 => '38.3' }, + 'movieshutterspeedlock' => { 295 => 0x225 }, + 'movieslowmotion' => { 228 => 0x1fa }, + 'moviesoundrecording' => { 229 => 0x2ce }, + 'moviesubjectdetection' => { 229 => 0x2fc }, + 'moviesubselectorassignment' => { 280 => '48.2' }, + 'moviesubselectorassignmentplusdials' => { 280 => '53.1' }, + 'movietonemap' => { 229 => 0x2ec }, + 'movietype' => { 228 => 0x1fe, 229 => 0x266, 252 => 0xc55c }, + 'movievibrationreduction' => { 228 => 0x24e }, + 'movievibrationreductionsameasphoto' => { 228 => 0x24f }, + 'movievignettecontrol' => { 228 => 0x23e, 229 => 0x1a0 }, + 'movievignettecontrolsameasphoto' => { 228 => 0x240 }, + 'movievrmode' => { 229 => 0x2c8 }, + 'moviezebrapattern' => { 295 => 0x213 }, + 'multiburstimageheight' => { 420 => 0x1002 }, + 'multiburstimagewidth' => { 420 => 0x1001 }, + 'multiburstmode' => { 420 => 0x1000 }, + 'multicontrollerwhilemetering' => { 84 => 0x517 }, + 'multiexposure' => { 68 => 0x1, 320 => 0xb4 }, + 'multiexposureautogain' => { 230 => 0x3 }, + 'multiexposurecontrol' => { 68 => 0x2 }, + 'multiexposuremode' => { 230 => 0x1 }, + 'multiexposureshots' => { 68 => 0x3, 229 => 0x8e, 230 => 0x2 }, + 'multiframenoisereduction' => { 409 => 0x35, 420 => 0x200b, 425 => 0x15 }, + 'multiframenreffect' => { 420 => 0x2023 }, + 'multifunctionlock' => { 84 => 0x70f }, + 'multipleexposuremode' => { 229 => 0x8c, 301 => 0x101c }, + 'multipleexposureset' => { 336 => '10.1' }, + 'multisample' => { 237 => 0x40 }, + 'multiselector' => { 279 => '9.4', 280 => '10.3', 282 => '10.3', 283 => '10.3', 288 => '27.4', 292 => '10.3', 293 => '10.3' }, + 'multiselectorliveview' => { 279 => '4.3', 282 => '37.1', 283 => '37.1', 292 => '37.1', 293 => '37.1' }, + 'multiselectorliveviewmode' => { 247 => 0x18c2 }, + 'multiselectorplaybackmode' => { 279 => ['13.5','9.2'], 280 => '10.2', 283 => '10.2', 288 => '27.2', 292 => '10.2', 293 => '10.2', 295 => 0xb3 }, + 'multiselectorshootmode' => { 279 => '9.1', 280 => '10.1', 282 => '10.1', 283 => '10.1', 288 => '27.1', 292 => '10.1', 293 => '10.1', 295 => 0xaf }, + 'multishot' => { 325 => 0x121 }, + 'mute' => { 374 => 'player.movie.audio.mute' }, + 'mycolormode' => { 69 => 0x2 }, + 'name' => { 380 => 'name', 478 => 'Name', 480 => 'Name' }, + 'narrator' => { 372 => "\xa9nrt" }, + 'nationalcatalognumber' => { 494 => 'nationalCatalogNumber' }, + 'nativedigest' => { 484 => 'NativeDigest', 500 => 'NativeDigest' }, + 'ndfilter' => { 77 => 0x1c, 297 => 0x204, 387 => 0x1019 }, + 'near' => { 463 => 'Near' }, + 'nefbitdepth' => { 226 => 0xe22 }, + 'nefcompression' => { 226 => 0x93, 227 => 0xa }, + 'neflinearizationtable' => { 226 => 0x96 }, + 'negativecachelargepreviewsize' => { 478 => 'NegativeCacheLargePreviewSize', 480 => 'NegativeCacheLargePreviewSize' }, + 'negativecachemaximumsize' => { 478 => 'NegativeCacheMaximumSize', 480 => 'NegativeCacheMaximumSize' }, + 'negativecachepath' => { 478 => 'NegativeCachePath', 480 => 'NegativeCachePath' }, + 'neutraldensityfactor' => { 475 => 'NeutralDensityFactor' }, + 'neutraldensityfilter' => { 355 => 0x88 }, + 'neutraloutputhighlightpoint' => { 109 => 0x2f }, + 'neutraloutputshadowpoint' => { 109 => 0x30 }, + 'neutralrawcolortone' => { 109 => 0x28 }, + 'neutralrawcontrast' => { 109 => 0x2a }, + 'neutralrawhighlight' => { 109 => 0x78 }, + 'neutralrawhighlightpoint' => { 109 => 0x2d }, + 'neutralrawlinear' => { 109 => 0x2b }, + 'neutralrawsaturation' => { 109 => 0x29 }, + 'neutralrawshadow' => { 109 => 0x81 }, + 'neutralrawshadowpoint' => { 109 => 0x2e }, + 'neutralrawsharpness' => { 109 => 0x2c }, + 'neutralunsharpmaskfineness' => { 109 => 0xa6 }, + 'neutralunsharpmaskthreshold' => { 109 => 0xa8 }, + 'neutraunsharpmaskstrength' => { 109 => 0xa4 }, + 'newrawimagedigest' => { 119 => 0xc7a7 }, + 'newsphotoversion' => { 133 => 0x0 }, + 'nickname' => { 502 => 'Nickname' }, + 'nikoncapturedata' => { 226 => 0xe01 }, + 'nikoncaptureeditversions' => { 226 => 0xe13 }, + 'nikoncaptureoffsets' => { 226 => 0xe0e }, + 'nikoncaptureoutput' => { 226 => 0xe1e }, + 'nikoncaptureversion' => { 226 => 0xe09 }, + 'nikoniccprofile' => { 226 => 0xe1d }, + 'nikonimagesize' => { 244 => '723.1', 245 => '732.1', 255 => 0x2c4 }, + 'nikonmeteringmode' => { 228 => 0x146, 248 => 0x2ea4, 257 => 0x175e }, + 'nikonsettings' => { 226 => 0x4e }, + 'noisefilter' => { 297 => 0x527 }, + 'noiseprofile' => { 119 => 0xc761 }, + 'noisereduction' => { 127 => [0x100b,0x100e], 182 => 0xb0, 183 => 0x60, 184 => 0x3f, 226 => 0x95, 272 => 0x753dcbc0, 273 => 0x17, 297 => 0x50a, 302 => 0x103a, 320 => 0x2d, 355 => 0x49, 387 => 0x100f, 389 => 0x2a }, + 'noisereduction2' => { 301 => 0x1010 }, + 'noisereductionapplied' => { 119 => 0xc6f7 }, + 'noisereductionintensity' => { 273 => 0x9 }, + 'noisereductionmethod' => { 273 => 0x11 }, + 'noisereductionmode' => { 455 => 0x801e }, + 'noisereductionparametersatcapture' => { 138 => 0xe73 }, + 'noisereductionparameterscamera' => { 138 => 0xe72 }, + 'noisereductionparametershost3mp' => { 138 => 0xe71 }, + 'noisereductionparametershost6mp' => { 138 => 0xe70 }, + 'noisereductionparametershostrgb' => { 138 => 0xe6f }, + 'noisereductionparameterskhufu3mp' => { 138 => 0xe65 }, + 'noisereductionparameterskhufu6mp' => { 138 => 0xe64 }, + 'noisereductionparameterskhufurgb' => { 138 => 0xe63 }, + 'noisereductionparams' => { 325 => 0x1b }, + 'noisereductionsharpness' => { 273 => 0xd }, + 'noisereductionstrength' => { 320 => 0xd6 }, + 'noisereductionvalue' => { 455 => 0x8027 }, + 'nomemorycard' => { 279 => '22.1', 280 => '4.2', 281 => '0.3', 284 => '2.4', 285 => '3.2', 286 => '3.2', 288 => '33.7', 289 => '3.2', 290 => '0.3', 292 => '4.2', 294 => '4.5' }, + 'nominalmaxaperture' => { 346 => 0xa }, + 'nominalminaperture' => { 346 => '10.1' }, + 'normallinetime' => { 138 => 0x186a }, + 'normalwhitelevel' => { 41 => 0x32a, 42 => 0x280, 45 => [0x2b8,0x2cf,0x2d3], 46 => 0x569, 47 => 0x1e3, 48 => [0x1fc,0x2dc], 49 => [0x230,0x30e], 50 => 0x31c }, + 'notes' => { 456 => 'Notes', 473 => 'notes' }, + 'npages' => { 509 => 'NPages' }, + 'nullrecord' => { 97 => 0x0 }, + 'numafpoints' => { 332 => 0x2 }, + 'number' => { 494 => 'number' }, + 'numberofbeats' => { 504 => 'numberOfBeats' }, + 'numberoffocuspoints' => { 282 => '1.3', 283 => '1.3', 286 => '0.2', 287 => '0.3', 289 => '0.3' }, + 'numfaceelements' => { 127 => 0x4200 }, + 'numfacepositions' => { 312 => 0x0 }, + 'numindexentries' => { 133 => 0x54 }, + 'numwbentries' => { 326 => 0x0, 327 => 0x0 }, + 'object' => { 494 => 'object' }, + 'objectattributereference' => { 131 => 0x4 }, + 'objectcycle' => { 131 => 0x4b, 473 => 'ObjectCycle' }, + 'objectdescription' => { 493 => 'objectDescription' }, + 'objectdistance' => { 112 => 0x6, 113 => 0x2022 }, + 'objectname' => { 131 => 0x5 }, + 'objectpreviewdata' => { 131 => 0xca }, + 'objectpreviewfileformat' => { 131 => 0xc8 }, + 'objectpreviewfileversion' => { 131 => 0xc9 }, + 'objectsubtype' => { 493 => 'objectSubtype' }, + 'objecttype' => { 493 => 'objectType' }, + 'objecttypereference' => { 131 => 0x3 }, + 'occurrence' => { 118 => 'Occurrence' }, + 'occurrenceassociatedmedia' => { 118 => [\'Occurrence','OccurrenceAssociatedMedia'] }, + 'occurrenceassociatedoccurrences' => { 118 => [\'Occurrence','OccurrenceAssociatedOccurrences'] }, + 'occurrenceassociatedreferences' => { 118 => [\'Occurrence','OccurrenceAssociatedReferences'] }, + 'occurrenceassociatedsequences' => { 118 => [\'Occurrence','OccurrenceAssociatedSequences'] }, + 'occurrenceassociatedtaxa' => { 118 => [\'Occurrence','OccurrenceAssociatedTaxa'] }, + 'occurrencebehavior' => { 118 => [\'Occurrence','OccurrenceBehavior'] }, + 'occurrencecatalognumber' => { 118 => [\'Occurrence','OccurrenceCatalogNumber'] }, + 'occurrencedegreeofestablishment' => { 118 => [\'Occurrence','OccurrenceDegreeOfEstablishment'] }, + 'occurrencedetails' => { 118 => [\'Occurrence','OccurrenceOccurrenceDetails'] }, + 'occurrencedisposition' => { 118 => [\'Occurrence','OccurrenceDisposition'] }, + 'occurrenceestablishmentmeans' => { 118 => [\'Occurrence','OccurrenceEstablishmentMeans'] }, + 'occurrencegeoreferenceverificationstatus' => { 118 => [\'Occurrence','OccurrenceGeoreferenceVerificationStatus'] }, + 'occurrenceid' => { 118 => [\'Occurrence','OccurrenceOccurrenceID'] }, + 'occurrenceindividualcount' => { 118 => [\'Occurrence','OccurrenceIndividualCount'] }, + 'occurrenceindividualid' => { 118 => [\'Occurrence','OccurrenceIndividualID'] }, + 'occurrencelifestage' => { 118 => [\'Occurrence','OccurrenceLifeStage'] }, + 'occurrenceorganismquantity' => { 118 => [\'Occurrence','OccurrenceOrganismQuantity'] }, + 'occurrenceorganismquantitytype' => { 118 => [\'Occurrence','OccurrenceOrganismQuantityType'] }, + 'occurrenceothercatalognumbers' => { 118 => [\'Occurrence','OccurrenceOtherCatalogNumbers'] }, + 'occurrencepathway' => { 118 => [\'Occurrence','OccurrencePathway'] }, + 'occurrencepreparations' => { 118 => [\'Occurrence','OccurrencePreparations'] }, + 'occurrencepreviousidentifications' => { 118 => [\'Occurrence','OccurrencePreviousIdentifications'] }, + 'occurrencerecordedby' => { 118 => [\'Occurrence','OccurrenceRecordedBy'] }, + 'occurrencerecordedbyid' => { 118 => [\'Occurrence','OccurrenceRecordedByID'] }, + 'occurrencerecordnumber' => { 118 => [\'Occurrence','OccurrenceRecordNumber'] }, + 'occurrenceremarks' => { 118 => [\'Occurrence','OccurrenceOccurrenceRemarks'] }, + 'occurrencereproductivecondition' => { 118 => [\'Occurrence','OccurrenceReproductiveCondition'] }, + 'occurrencesex' => { 118 => [\'Occurrence','OccurrenceSex'] }, + 'occurrencestatus' => { 118 => [\'Occurrence','OccurrenceOccurrenceStatus'] }, + 'oecfcolumns' => { 484 => [\'OECF','OECFColumns'] }, + 'oecfnames' => { 484 => [\'OECF','OECFNames'] }, + 'oecfrows' => { 484 => [\'OECF','OECFRows'] }, + 'oecfvalues' => { 484 => [\'OECF','OECFValues'] }, + 'offsaledate' => { 494 => 'offSaleDate' }, + 'offsaledatea-platform' => { 494 => [\'offSaleDate','offSaleDateA-platform'] }, + 'offsaledatedate' => { 494 => [\'offSaleDate','offSaleDateDate'] }, + 'offsetdacvalue' => { 138 => 0x190a }, + 'offsetschema' => { 119 => 0xea1d }, + 'offsettime' => { 119 => 0x9010 }, + 'offsettimedigitized' => { 119 => 0x9012 }, + 'offsettimeoriginal' => { 119 => 0x9011 }, + 'okbutton' => { 289 => '15.1', 294 => '16.1' }, + 'oldsubfiletype' => { 119 => 0xff }, + 'olympusimageheight' => { 302 => 0x102f }, + 'olympusimagewidth' => { 302 => 0x102e }, + 'omenatcapturestrength' => { 138 => 0xa60 }, + 'omenautostrength' => { 138 => 0xa5f }, + 'omenearlystrength' => { 138 => 0xa5e }, + 'omenfocallengthlimit' => { 138 => 0xa62 }, + 'omeninitialipfstrength' => { 138 => 0xa5d }, + 'omensurfaceindex' => { 138 => 0xa64 }, + 'oneshotafrelease' => { 2 => 0x9 }, + 'onetouchwb' => { 302 => 0x302 }, + 'onsaledate' => { 494 => 'onSaleDate' }, + 'onsaledatea-platform' => { 494 => [\'onSaleDate','onSaleDateA-platform'] }, + 'onsaledatedate' => { 494 => [\'onSaleDate','onSaleDateDate'] }, + 'onsaleday' => { 494 => 'onSaleDay' }, + 'onsaledaya-platform' => { 494 => [\'onSaleDay','onSaleDayA-platform'] }, + 'onsaledayday' => { 494 => [\'onSaleDay','onSaleDayDay'] }, + 'opcodelist1' => { 119 => 0xc740 }, + 'opcodelist2' => { 119 => 0xc741 }, + 'opcodelist3' => { 119 => 0xc74e }, + 'opticalzoom' => { 142 => 0xfa3d, 144 => [0x6006,0xf006], 145 => 0x1000, 146 => 0xf, 149 => 0x1e, 151 => 0x20, 152 => 0x1c, 163 => 'OpticalZoom' }, + 'opticalzoomcode' => { 77 => 0xa }, + 'opticalzoommode' => { 320 => 0x34 }, + 'opticalzoomon' => { 396 => 0x219 }, + 'optionenddate' => { 497 => 'optionEndDate' }, + 'opto-electricconvfactor' => { 484 => 'OECF' }, + 'orangehsl' => { 103 => 0x20911 }, + 'ordernumber' => { 127 => 0x8002 }, + 'organisationinimagecode' => { 490 => 'OrganisationInImageCode' }, + 'organisationinimagename' => { 490 => 'OrganisationInImageName' }, + 'organism' => { 118 => 'Organism' }, + 'organismassociatedoccurrences' => { 118 => [\'Organism','OrganismAssociatedOccurrences'] }, + 'organismassociatedorganisms' => { 118 => [\'Organism','OrganismAssociatedOrganisms'] }, + 'organismid' => { 118 => [\'Organism','OrganismOrganismID'] }, + 'organismname' => { 118 => [\'Organism','OrganismOrganismName'] }, + 'organismpreviousidentifications' => { 118 => [\'Organism','OrganismPreviousIdentifications'] }, + 'organismremarks' => { 118 => [\'Organism','OrganismOrganismRemarks'] }, + 'organismscope' => { 118 => [\'Organism','OrganismOrganismScope'] }, + 'organization' => { 494 => 'organization' }, + 'orientation' => { 119 => 0x112, 325 => 0x112, 493 => 'orientation', 500 => 'Orientation' }, + 'orientation2' => { 425 => [0x28,0x2e] }, + 'orientationlinkedaf' => { 2 => 0xe }, + 'orientationlinkedafpoint' => { 84 => 0x516 }, + 'originalalbumtitle' => { 179 => 'WM/OriginalAlbumTitle' }, + 'originalartist' => { 179 => 'WM/OriginalArtist', 372 => "\xa9ope" }, + 'originalbestqualitysize' => { 119 => 0xc792 }, + 'originalcreatedatetime' => { 468 => 'OriginalCreateDateTime' }, + 'originaldecisiondata' => { 114 => 'Canon-OriginalDecisionData' }, + 'originaldecisiondataoffset' => { 64 => 0x83 }, + 'originaldefaultcropsize' => { 119 => 0xc793 }, + 'originaldefaultfinalsize' => { 119 => 0xc791 }, + 'originaldirectory' => { 317 => 0x408 }, + 'originaldocumentid' => { 505 => 'OriginalDocumentID' }, + 'originalfilename' => { 97 => 0x816, 138 => 0x3e9, 150 => 0x20, 317 => 0x407, 468 => 'OriginalFilename' }, + 'originalimageheight' => { 79 => 0xc, 123 => 0x1 }, + 'originalimagewidth' => { 79 => 0xb, 123 => 0x0 }, + 'originallyricist' => { 179 => 'WM/OriginalLyricist' }, + 'originalrawfiledata' => { 119 => 0xc68c }, + 'originalrawfiledigest' => { 119 => 0xc71d }, + 'originalrawfilename' => { 119 => 0xc68b }, + 'originaltransmissionreference' => { 131 => 0x67 }, + 'originatingprogram' => { 131 => 0x41, 473 => 'OriginatingProgram' }, + 'originplatform' => { 494 => 'originPlatform' }, + 'os' => { 482 => 'os' }, + 'otherconditions' => { 307 => 'OtherConditions' }, + 'otherconstraints' => { 307 => 'OtherConstraints' }, + 'otherimage' => { 114 => 'Exif-OtherImage' }, + 'otherimageinfo' => { 307 => 'OtherImageInfo' }, + 'otherimagelength' => { 119 => 0x202 }, + 'otherimagestart' => { 119 => 0x201 }, + 'otherlicensedocuments' => { 307 => 'OtherLicenseDocuments' }, + 'otherlicenseinfo' => { 307 => 'OtherLicenseInfo' }, + 'otherlicenserequirements' => { 307 => 'OtherLicenseRequirements' }, + 'outcue' => { 504 => 'outCue' }, + 'outcuescale' => { 504 => [\'outCue','outCueScale'] }, + 'outcuevalue' => { 504 => [\'outCue','outCueValue'] }, + 'outputimageheight' => { 197 => 0x3 }, + 'outputimagewidth' => { 197 => 0x2 }, + 'outputlut' => { 320 => 0xa7 }, + 'outputprofile' => { 138 => 0x138b }, + 'outputresolution' => { 197 => 0x4 }, + 'overclockcols' => { 138 => 0x189c }, + 'overclockrows' => { 138 => 0x18c4 }, + 'overridelookvignette' => { 478 => 'OverrideLookVignette', 480 => 'OverrideLookVignette' }, + 'owner' => { 508 => 'Owner' }, + 'ownerid' => { 131 => 0xbc }, + 'ownername' => { 15 => 0x10f, 64 => 0x9, 97 => 0x810, 119 => [0xa430,0xfde8], 156 => 'OwnerName', 475 => 'OwnerName', 485 => 'CameraOwnerName' }, + 'padding' => { 119 => 0xea1c }, + 'pagecount' => { 494 => 'pageCount' }, + 'pageimage' => { 502 => [\'PageInfo','PageInfoImage'] }, + 'pageimageformat' => { 502 => [\'PageInfo','PageInfoFormat'] }, + 'pageimageheight' => { 502 => [\'PageInfo','PageInfoHeight'] }, + 'pageimagepagenumber' => { 502 => [\'PageInfo','PageInfoPageNumber'] }, + 'pageimagewidth' => { 502 => [\'PageInfo','PageInfoWidth'] }, + 'pageinfo' => { 502 => 'PageInfo' }, + 'pagename' => { 119 => 0x11d }, + 'pagenumber' => { 119 => 0x129 }, + 'pageprogressiondirection' => { 494 => 'pageProgressionDirection' }, + 'pagerange' => { 494 => 'pageRange' }, + 'paintbasedcorrectionmasks' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasks'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasks'] }, + 'paintbasedcorrections' => { 478 => 'PaintBasedCorrections', 480 => 'PaintBasedCorrections' }, + 'paintcorrectionactive' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionActive'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionActive'] }, + 'paintcorrectionamount' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionAmount'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionAmount'] }, + 'paintcorrectionblacks2012' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalBlacks2012'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalBlacks2012'] }, + 'paintcorrectionbrightness' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalBrightness'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalBrightness'] }, + 'paintcorrectionclarity' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalClarity'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalClarity'] }, + 'paintcorrectionclarity2012' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalClarity2012'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalClarity2012'] }, + 'paintcorrectioncontrast' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalContrast'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalContrast'] }, + 'paintcorrectioncontrast2012' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalContrast2012'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalContrast2012'] }, + 'paintcorrectioncorrectionname' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionName'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionName'] }, + 'paintcorrectioncorrectionsyncid' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionSyncID'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionSyncID'] }, + 'paintcorrectiondefringe' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalDefringe'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalDefringe'] }, + 'paintcorrectiondehaze' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalDehaze'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalDehaze'] }, + 'paintcorrectionexposure' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalExposure'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalExposure'] }, + 'paintcorrectionexposure2012' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalExposure2012'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalExposure2012'] }, + 'paintcorrectionhighlights2012' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalHighlights2012'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalHighlights2012'] }, + 'paintcorrectionhue' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalHue'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalHue'] }, + 'paintcorrectionluminancenoise' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalLuminanceNoise'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalLuminanceNoise'] }, + 'paintcorrectionmaskalpha' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksAlpha'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksAlpha'] }, + 'paintcorrectionmaskangle' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksAngle'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksAngle'] }, + 'paintcorrectionmaskbottom' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksBottom'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksBottom'] }, + 'paintcorrectionmaskcentervalue' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCenterValue'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCenterValue'] }, + 'paintcorrectionmaskcenterweight' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCenterWeight'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCenterWeight'] }, + 'paintcorrectionmaskdabs' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksDabs'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksDabs'] }, + 'paintcorrectionmaskfeather' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFeather'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFeather'] }, + 'paintcorrectionmaskflipped' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFlipped'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFlipped'] }, + 'paintcorrectionmaskflow' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFlow'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFlow'] }, + 'paintcorrectionmaskfullx' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFullX'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFullX'] }, + 'paintcorrectionmaskfully' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFullY'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksFullY'] }, + 'paintcorrectionmaskinputdigest' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksInputDigest'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksInputDigest'] }, + 'paintcorrectionmaskleft' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksLeft'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksLeft'] }, + 'paintcorrectionmaskmaskactive' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskActive'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskActive'] }, + 'paintcorrectionmaskmaskblendmode' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskBlendMode'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskBlendMode'] }, + 'paintcorrectionmaskmaskdigest' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskDigest'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskDigest'] }, + 'paintcorrectionmaskmaskinverted' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskInverted'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskInverted'] }, + 'paintcorrectionmaskmaskname' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskName'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskName'] }, + 'paintcorrectionmaskmasks' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasks'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasks'] }, + 'paintcorrectionmaskmasksalpha' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksAlpha'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksAlpha'] }, + 'paintcorrectionmaskmasksangle' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksAngle'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksAngle'] }, + 'paintcorrectionmaskmasksbottom' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksBottom'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksBottom'] }, + 'paintcorrectionmaskmaskscentervalue' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksCenterValue'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksCenterValue'] }, + 'paintcorrectionmaskmaskscenterweight' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksCenterWeight'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksCenterWeight'] }, + 'paintcorrectionmaskmasksdabs' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksDabs'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksDabs'] }, + 'paintcorrectionmaskmasksfeather' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksFeather'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksFeather'] }, + 'paintcorrectionmaskmasksflipped' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksFlipped'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksFlipped'] }, + 'paintcorrectionmaskmasksflow' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksFlow'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksFlow'] }, + 'paintcorrectionmaskmasksfullx' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksFullX'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksFullX'] }, + 'paintcorrectionmaskmasksfully' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksFullY'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksFullY'] }, + 'paintcorrectionmaskmasksinputdigest' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksInputDigest'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksInputDigest'] }, + 'paintcorrectionmaskmasksleft' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksLeft'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksLeft'] }, + 'paintcorrectionmaskmasksmaskactive' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskActive'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskActive'] }, + 'paintcorrectionmaskmasksmaskblendmode' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskBlendMode'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskBlendMode'] }, + 'paintcorrectionmaskmasksmaskdigest' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskDigest'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskDigest'] }, + 'paintcorrectionmaskmasksmaskinverted' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskInverted'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskInverted'] }, + 'paintcorrectionmaskmasksmaskname' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskName'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskName'] }, + 'paintcorrectionmaskmasksmasksubtype' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskSubType'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskSubType'] }, + 'paintcorrectionmaskmasksmasksyncid' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskSyncID'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskSyncID'] }, + 'paintcorrectionmaskmasksmaskversion' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskVersion'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskVersion'] }, + 'paintcorrectionmaskmasksmidpoint' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMidpoint'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMidpoint'] }, + 'paintcorrectionmaskmasksorigin' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksOrigin'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksOrigin'] }, + 'paintcorrectionmaskmasksperimetervalue' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksPerimeterValue'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksPerimeterValue'] }, + 'paintcorrectionmaskmasksradius' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksRadius'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksRadius'] }, + 'paintcorrectionmaskmasksreferencepoint' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksReferencePoint'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksReferencePoint'] }, + 'paintcorrectionmaskmasksright' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksRight'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksRight'] }, + 'paintcorrectionmaskmasksroundness' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksRoundness'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksRoundness'] }, + 'paintcorrectionmaskmaskssizex' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksSizeX'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksSizeX'] }, + 'paintcorrectionmaskmaskssizey' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksSizeY'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksSizeY'] }, + 'paintcorrectionmaskmaskstop' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksTop'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksTop'] }, + 'paintcorrectionmaskmasksubtype' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskSubType'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskSubType'] }, + 'paintcorrectionmaskmasksvalue' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskValue'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksMaskValue'] }, + 'paintcorrectionmaskmasksversion' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksVersion'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksVersion'] }, + 'paintcorrectionmaskmaskswhat' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksWhat'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksWhat'] }, + 'paintcorrectionmaskmaskswholeimagearea' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksWholeImageArea'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksWholeImageArea'] }, + 'paintcorrectionmaskmasksx' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksX'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksX'] }, + 'paintcorrectionmaskmasksy' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksY'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksY'] }, + 'paintcorrectionmaskmasksyncid' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskSyncID'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskSyncID'] }, + 'paintcorrectionmaskmaskszerox' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksZeroX'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksZeroX'] }, + 'paintcorrectionmaskmaskszeroy' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksZeroY'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMasksZeroY'] }, + 'paintcorrectionmaskmaskversion' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskVersion'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskVersion'] }, + 'paintcorrectionmaskmidpoint' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMidpoint'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMidpoint'] }, + 'paintcorrectionmaskorigin' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksOrigin'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksOrigin'] }, + 'paintcorrectionmaskperimetervalue' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksPerimeterValue'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksPerimeterValue'] }, + 'paintcorrectionmaskradius' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksRadius'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksRadius'] }, + 'paintcorrectionmaskrange' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMask'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMask'] }, + 'paintcorrectionmaskrangeareamodels' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModels'] }, + 'paintcorrectionmaskrangeareamodelscolorsampleinfo' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'] }, + 'paintcorrectionmaskrangeareamodelscomponents' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskAreaModelsAreaComponents'] }, + 'paintcorrectionmaskrangecoloramount' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskColorAmount'] }, + 'paintcorrectionmaskrangedepthfeather' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthFeather'] }, + 'paintcorrectionmaskrangedepthmax' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMax'] }, + 'paintcorrectionmaskrangedepthmin' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskDepthMin'] }, + 'paintcorrectionmaskrangeinvert' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskInvert'] }, + 'paintcorrectionmaskrangelumfeather' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumFeather'] }, + 'paintcorrectionmaskrangeluminancedepthsampleinfo' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLuminanceDepthSampleInfo'] }, + 'paintcorrectionmaskrangelummax' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMax'] }, + 'paintcorrectionmaskrangelummin' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumMin'] }, + 'paintcorrectionmaskrangelumrange' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskLumRange'] }, + 'paintcorrectionmaskrangesampletype' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskSampleType'] }, + 'paintcorrectionmaskrangetype' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskType'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskType'] }, + 'paintcorrectionmaskrangeversion' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksCorrectionRangeMaskVersion'] }, + 'paintcorrectionmaskreferencepoint' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksReferencePoint'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksReferencePoint'] }, + 'paintcorrectionmaskright' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksRight'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksRight'] }, + 'paintcorrectionmaskroundness' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksRoundness'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksRoundness'] }, + 'paintcorrectionmasksizex' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksSizeX'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksSizeX'] }, + 'paintcorrectionmasksizey' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksSizeY'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksSizeY'] }, + 'paintcorrectionmasktop' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksTop'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksTop'] }, + 'paintcorrectionmaskvalue' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskValue'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksMaskValue'] }, + 'paintcorrectionmaskversion' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksVersion'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksVersion'] }, + 'paintcorrectionmaskwhat' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksWhat'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksWhat'] }, + 'paintcorrectionmaskwholeimagearea' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksWholeImageArea'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksWholeImageArea'] }, + 'paintcorrectionmaskx' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksX'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksX'] }, + 'paintcorrectionmasky' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksY'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksY'] }, + 'paintcorrectionmaskzerox' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksZeroX'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksZeroX'] }, + 'paintcorrectionmaskzeroy' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksZeroY'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionMasksZeroY'] }, + 'paintcorrectionmoire' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalMoire'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalMoire'] }, + 'paintcorrectionrangemask' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMask'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMask'] }, + 'paintcorrectionrangemaskareamodels' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskAreaModels'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskAreaModels'] }, + 'paintcorrectionrangemaskareamodelscolorsampleinfo' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'] }, + 'paintcorrectionrangemaskareamodelscomponents' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskAreaModelsAreaComponents'] }, + 'paintcorrectionrangemaskcoloramount' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskColorAmount'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskColorAmount'] }, + 'paintcorrectionrangemaskdepthfeather' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskDepthFeather'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskDepthFeather'] }, + 'paintcorrectionrangemaskdepthmax' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskDepthMax'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskDepthMax'] }, + 'paintcorrectionrangemaskdepthmin' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskDepthMin'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskDepthMin'] }, + 'paintcorrectionrangemaskinvert' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskInvert'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskInvert'] }, + 'paintcorrectionrangemasklumfeather' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskLumFeather'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskLumFeather'] }, + 'paintcorrectionrangemaskluminancedepthsampleinfo' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskLuminanceDepthSampleInfo'] }, + 'paintcorrectionrangemasklummax' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskLumMax'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskLumMax'] }, + 'paintcorrectionrangemasklummin' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskLumMin'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskLumMin'] }, + 'paintcorrectionrangemasklumrange' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskLumRange'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskLumRange'] }, + 'paintcorrectionrangemasksampletype' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskSampleType'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskSampleType'] }, + 'paintcorrectionrangemasktype' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskType'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskType'] }, + 'paintcorrectionrangemaskversion' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskVersion'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsCorrectionRangeMaskVersion'] }, + 'paintcorrectionsaturation' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalSaturation'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalSaturation'] }, + 'paintcorrectionshadows2012' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalShadows2012'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalShadows2012'] }, + 'paintcorrectionsharpness' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalSharpness'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalSharpness'] }, + 'paintcorrectiontemperature' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalTemperature'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalTemperature'] }, + 'paintcorrectiontexture' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalTexture'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalTexture'] }, + 'paintcorrectiontint' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalTint'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalTint'] }, + 'paintcorrectiontoninghue' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalToningHue'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalToningHue'] }, + 'paintcorrectiontoningsaturation' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalToningSaturation'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalToningSaturation'] }, + 'paintcorrectionwhat' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsWhat'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsWhat'] }, + 'paintcorrectionwhites2012' => { 478 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalWhites2012'], 480 => [\'PaintBasedCorrections','PaintBasedCorrectionsLocalWhites2012'] }, + 'panasonicdatetime' => { 323 => 0x0 }, + 'panasonicexifversion' => { 320 => 0x26 }, + 'panasonicimageheight' => { 320 => 0x4c }, + 'panasonicimagewidth' => { 320 => 0x4b }, + 'panasonicrawversion' => { 325 => 0x1 }, + 'panasonictitle' => { 119 => 0xc6d2 }, + 'panasonictitle2' => { 119 => 0xc6d3 }, + 'panoramaangle' => { 127 => 0x1153 }, + 'panoramacropbottom' => { 426 => 0x7 }, + 'panoramacropleft' => { 426 => 0x4 }, + 'panoramacropright' => { 426 => 0x6 }, + 'panoramacroptop' => { 426 => 0x5 }, + 'panoramadirection' => { 72 => 0x5, 127 => 0x1154, 426 => 0x3 }, + 'panoramaframeheight' => { 426 => 0x9 }, + 'panoramaframenumber' => { 72 => 0x2 }, + 'panoramaframewidth' => { 426 => 0x8 }, + 'panoramafullheight' => { 426 => 0x2 }, + 'panoramafullwidth' => { 426 => 0x1 }, + 'panoramamode' => { 140 => 0x3c, 297 => 0x601 }, + 'panoramasize3d' => { 409 => 0x38 }, + 'panoramasourceheight' => { 426 => 0xb }, + 'panoramasourcewidth' => { 426 => 0xa }, + 'panoramicstitchcameramotion' => { 176 => 'PanoramicStitchCameraMotion', 177 => 0x1 }, + 'panoramicstitchmaptype' => { 176 => 'PanoramicStitchMapType', 177 => 0x2 }, + 'panoramicstitchphi0' => { 176 => 'PanoramicStitchPhi0', 177 => 0x5 }, + 'panoramicstitchphi1' => { 176 => 'PanoramicStitchPhi1', 177 => 0x6 }, + 'panoramicstitchtheta0' => { 176 => 'PanoramicStitchTheta0', 177 => 0x3 }, + 'panoramicstitchtheta1' => { 176 => 'PanoramicStitchTheta1', 177 => 0x4 }, + 'panoramicstitchversion' => { 177 => 0x0 }, + 'pantry' => { 505 => 'Pantry' }, + 'pantryinstanceid' => { 505 => [\'Pantry','PantryInstanceID'] }, + 'parallax' => { 127 => 0xb211, 296 => 0x28 }, + 'parametricdarks' => { 478 => 'ParametricDarks', 480 => 'ParametricDarks' }, + 'parametrichighlights' => { 478 => 'ParametricHighlights', 480 => 'ParametricHighlights' }, + 'parametrichighlightsplit' => { 478 => 'ParametricHighlightSplit', 480 => 'ParametricHighlightSplit' }, + 'parametriclights' => { 478 => 'ParametricLights', 480 => 'ParametricLights' }, + 'parametricmidtonesplit' => { 478 => 'ParametricMidtoneSplit', 480 => 'ParametricMidtoneSplit' }, + 'parametricshadows' => { 478 => 'ParametricShadows', 480 => 'ParametricShadows' }, + 'parametricshadowsplit' => { 478 => 'ParametricShadowSplit', 480 => 'ParametricShadowSplit' }, + 'parentalrating' => { 179 => 'WM/ParentalRating' }, + 'parentmediaeventid' => { 468 => 'ParentMediaEventID' }, + 'parentmeid' => { 468 => 'ParentMEID' }, + 'parentproductid' => { 372 => '@ppi' }, + 'parentreference1' => { 488 => [\'TagStructure','TagStructureParentReference'] }, + 'parentreference2' => { 488 => [\'TagStructure','TagStructureSubLabelsParentReference'] }, + 'parentreference3' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsParentReference'] }, + 'parentreference4' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsParentReference'] }, + 'parentreference5' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsParentReference'] }, + 'parentreference6' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsParentReference'] }, + 'parentshorttitle' => { 372 => '@PST' }, + 'parenttitle' => { 372 => '@pti' }, + 'partialactivecols1' => { 138 => 0x17e8 }, + 'partialactivecols2' => { 138 => 0x17f2 }, + 'partialactiverows1' => { 138 => 0x17fc }, + 'partialactiverows2' => { 138 => 0x1806 }, + 'partofcompilation' => { 504 => 'partOfCompilation' }, + 'patientbirthdate' => { 457 => 'PatientDOB' }, + 'patientid' => { 457 => 'PatientID' }, + 'patientname' => { 457 => 'PatientName' }, + 'patientsex' => { 457 => 'PatientSex' }, + 'patternareaheight' => { 138 => 0x963 }, + 'patternareawidth' => { 138 => 0x962 }, + 'patterncorrectionfactorscale' => { 138 => 0x969 }, + 'patterncropcols1' => { 138 => 0x96c }, + 'patterncropcols2' => { 138 => 0x96d }, + 'patterncroprows1' => { 138 => 0x96a }, + 'patterncroprows2' => { 138 => 0x96b }, + 'patternimagerheight' => { 138 => 0x961 }, + 'patternimagerwidth' => { 138 => 0x960 }, + 'patternx' => { 138 => 0x966 }, + 'patterny' => { 138 => 0x967 }, + 'pdfversion' => { 491 => 'PDFVersion' }, + 'pentaximagesize' => { 355 => 0x9 }, + 'pentaxmodelid' => { 335 => 0x0, 355 => 0x5 }, + 'pentaxmodeltype' => { 355 => 0x1 }, + 'pentaxversion' => { 355 => 0x0 }, + 'people' => { 459 => 'People', 471 => 'People' }, + 'perchannelblacklevel' => { 41 => 0x157, 42 => 0x16b, 44 => 0xc4, 45 => [0x2b4,0x2cb,0x2cf], 46 => [0x108,0x14d], 47 => 0x1df, 48 => [0x1f8,0x2d8], 49 => [0x22c,0x30a], 50 => 0x149 }, + 'performer' => { 372 => 'perf', 380 => 'perf' }, + 'performerkeywords' => { 380 => "\xa9prk" }, + 'performers' => { 380 => "\xa9prf" }, + 'performerurl' => { 380 => "\xa9prl" }, + 'period' => { 179 => 'WM/Period' }, + 'peripheralillumcentralradius' => { 455 => 0x8030 }, + 'peripheralillumcentralvalue' => { 455 => 0x8031 }, + 'peripheralillumination' => { 103 => 0x20702, 109 => 0x68 }, + 'peripheralilluminationcorr' => { 62 => 0x1, 345 => 0x2 }, + 'peripheralilluminationon' => { 103 => '0x20702.0', 109 => 0x64 }, + 'peripheralillumperiphvalue' => { 455 => 0x8032 }, + 'peripherallighting' => { 79 => 0x2, 127 => 0x3804 }, + 'peripherallightingsetting' => { 80 => 0x5 }, + 'peripherallightingvalue' => { 79 => 0x6 }, + 'permissions' => { 497 => 'permissions' }, + 'permits' => { 476 => 'permits' }, + 'person' => { 494 => 'person' }, + 'personality' => { 468 => 'Personality' }, + 'personheard' => { 490 => 'PersonHeard' }, + 'personheardidentifier' => { 490 => [\'PersonHeard','PersonHeardIdentifier'] }, + 'personheardname' => { 490 => [\'PersonHeard','PersonHeardName'] }, + 'personinimage' => { 490 => 'PersonInImage' }, + 'personinimagecharacteristic' => { 490 => [\'PersonInImageWDetails','PersonInImageWDetailsPersonCharacteristic'] }, + 'personinimagecvtermcvid' => { 490 => [\'PersonInImageWDetails','PersonInImageWDetailsPersonCharacteristicCvId'] }, + 'personinimagecvtermid' => { 490 => [\'PersonInImageWDetails','PersonInImageWDetailsPersonCharacteristicCvTermId'] }, + 'personinimagecvtermname' => { 490 => [\'PersonInImageWDetails','PersonInImageWDetailsPersonCharacteristicCvTermName'] }, + 'personinimagecvtermrefinedabout' => { 490 => [\'PersonInImageWDetails','PersonInImageWDetailsPersonCharacteristicCvTermRefinedAbout'] }, + 'personinimagedescription' => { 490 => [\'PersonInImageWDetails','PersonInImageWDetailsPersonDescription'] }, + 'personinimageid' => { 490 => [\'PersonInImageWDetails','PersonInImageWDetailsPersonId'] }, + 'personinimagename' => { 490 => [\'PersonInImageWDetails','PersonInImageWDetailsPersonName'] }, + 'personinimagewdetails' => { 490 => 'PersonInImageWDetails' }, + 'perspectiveaspect' => { 478 => 'PerspectiveAspect', 480 => 'PerspectiveAspect' }, + 'perspectivehorizontal' => { 478 => 'PerspectiveHorizontal', 480 => 'PerspectiveHorizontal' }, + 'perspectiverotate' => { 478 => 'PerspectiveRotate', 480 => 'PerspectiveRotate' }, + 'perspectivescale' => { 478 => 'PerspectiveScale', 480 => 'PerspectiveScale' }, + 'perspectiveupright' => { 478 => 'PerspectiveUpright', 480 => 'PerspectiveUpright' }, + 'perspectivevertical' => { 478 => 'PerspectiveVertical', 480 => 'PerspectiveVertical' }, + 'perspectivex' => { 478 => 'PerspectiveX', 480 => 'PerspectiveX' }, + 'perspectivey' => { 478 => 'PerspectiveY', 480 => 'PerspectiveY' }, + 'pf0customfuncregistration' => { 92 => 0x1 }, + 'pf10retainprogramshift' => { 92 => 0xb }, + 'pf13drivepriority' => { 92 => 0xe }, + 'pf14disablefocussearch' => { 92 => 0xf }, + 'pf15disableafassistbeam' => { 92 => 0x10 }, + 'pf16autofocuspointshoot' => { 92 => 0x11 }, + 'pf17disableafpointsel' => { 92 => 0x12 }, + 'pf18enableautoafpointsel' => { 92 => 0x13 }, + 'pf19continuousshootspeed' => { 92 => 0x14 }, + 'pf19shootingspeedhigh' => { 91 => 0xa }, + 'pf19shootingspeedlow' => { 91 => 0x9 }, + 'pf1disableshootingmodes' => { 92 => 0x2 }, + 'pf1value' => { 91 => 0x1 }, + 'pf20limitcontinousshots' => { 92 => 0x15 }, + 'pf20maxcontinousshots' => { 91 => 0xb }, + 'pf21enablequietoperation' => { 92 => 0x16 }, + 'pf23felocktime' => { 91 => 0xd }, + 'pf23postreleasetime' => { 91 => 0xe }, + 'pf23settimerlengths' => { 92 => 0x18 }, + 'pf23shutterbuttontime' => { 91 => 0xc }, + 'pf24lightlcdduringbulb' => { 92 => 0x19 }, + 'pf25aemode' => { 91 => 0xf }, + 'pf25afmode' => { 91 => 0x12 }, + 'pf25afpointsel' => { 91 => 0x13 }, + 'pf25colormatrix' => { 91 => 0x17 }, + 'pf25defaultclearsettings' => { 92 => 0x1a }, + 'pf25drivemode' => { 91 => 0x11 }, + 'pf25imagesize' => { 91 => 0x14 }, + 'pf25meteringmode' => { 91 => 0x10 }, + 'pf25parameters' => { 91 => 0x16 }, + 'pf25wbmode' => { 91 => 0x15 }, + 'pf26shortenreleaselag' => { 92 => 0x1b }, + 'pf27reversedialrotation' => { 92 => 0x1c }, + 'pf27value' => { 91 => 0x18 }, + 'pf28noquickdialexpcomp' => { 92 => 0x1d }, + 'pf29quickdialswitchoff' => { 92 => 0x1e }, + 'pf2disablemeteringmodes' => { 92 => 0x3 }, + 'pf2value' => { 91 => 0x2 }, + 'pf30enlargementmode' => { 92 => 0x1f }, + 'pf31originaldecisiondata' => { 92 => 0x20 }, + 'pf3manualexposuremetering' => { 92 => 0x4 }, + 'pf3value' => { 91 => 0x3 }, + 'pf4exposuretimelimits' => { 92 => 0x5 }, + 'pf4exposuretimemax' => { 91 => 0x5 }, + 'pf4exposuretimemin' => { 91 => 0x4 }, + 'pf5aperturelimits' => { 92 => 0x6 }, + 'pf5aperturemax' => { 91 => 0x7 }, + 'pf5aperturemin' => { 91 => 0x6 }, + 'pf6presetshootingmodes' => { 92 => 0x7 }, + 'pf7bracketcontinuousshoot' => { 92 => 0x8 }, + 'pf8bracketshots' => { 91 => 0x8 }, + 'pf8setbracketshots' => { 92 => 0x9 }, + 'pf9changebracketsequence' => { 92 => 0xa }, + 'phasedetectaf' => { 193 => 0x6 }, + 'phonenumber' => { 157 => 'Phone' }, + 'photoeffect' => { 34 => 0x28 }, + 'photoeffecthistoryxml' => { 272 => 0xe9651831 }, + 'photoeffects' => { 272 => 0xab5eca5e }, + 'photoeffectsblue' => { 274 => 0x8 }, + 'photoeffectsgreen' => { 274 => 0x6 }, + 'photoeffectsred' => { 274 => 0x4 }, + 'photoeffectstype' => { 274 => 0x0 }, + 'photographicsensitivity' => { 485 => 'PhotographicSensitivity' }, + 'photoinfoplayback' => { 279 => '17.6', 288 => '33.6' }, + 'photometricinterpretation' => { 119 => 0x106, 500 => 'PhotometricInterpretation' }, + 'photoshootingmenubank' => { 229 => 0x112, 248 => 0xe7d, 258 => 0xfbd }, + 'photoshootingmenubankimagearea' => { 229 => 0x134, 248 => '3716.1', 258 => 0x791 }, + 'photoshopbgrthumbnail' => { 369 => 0x409 }, + 'photoshopquality' => { 368 => 0x0 }, + 'photoshopthumbnail' => { 369 => 0x40c }, + 'photostyle' => { 320 => 0x89 }, + 'picklabel' => { 483 => 'PickLabel' }, + 'pictinfo' => { 396 => 0x208 }, + 'picturecontrol' => { 272 => 0xe2173c47 }, + 'picturecontrolactive' => { 275 => 0x0 }, + 'picturecontroladjust' => { 231 => 0x30, 232 => 0x30, 233 => 0x36 }, + 'picturecontrolbase' => { 231 => 0x18, 232 => 0x18, 233 => 0x1c }, + 'picturecontroldata' => { 226 => [0xbd,0x23] }, + 'picturecontrolmode' => { 275 => 0x13 }, + 'picturecontrolname' => { 231 => 0x4, 232 => 0x4, 233 => 0x8 }, + 'picturecontrolquickadjust' => { 231 => 0x31, 232 => 0x31, 233 => 0x37 }, + 'pictureeffect' => { 420 => 0x200e }, + 'pictureeffect2' => { 429 => 0x1163, 430 => 0x1167, 431 => 0x1143, 432 => 0x11bf, 433 => 0x119b, 434 => 0x1053, 435 => 0x24b, 436 => 0x24b, 437 => 0x23c, 451 => 0x46 }, + 'picturefinish' => { 182 => 0x71 }, + 'picturemode' => { 127 => 0x1031, 297 => 0x520, 355 => [0xb,0x33], 397 => 0x3d }, + 'picturemode2' => { 336 => 0x0 }, + 'picturemodebwfilter' => { 297 => 0x525 }, + 'picturemodecontrast' => { 297 => 0x523 }, + 'picturemodeeffect' => { 297 => 0x52d }, + 'picturemodehue' => { 297 => 0x522 }, + 'picturemodesaturation' => { 297 => 0x521 }, + 'picturemodesharpness' => { 297 => 0x524 }, + 'picturemodetone' => { 297 => 0x526 }, + 'pictureprofile' => { 429 => [0x115e,0x115f], 430 => [0x1162,0x1163], 431 => [0x113e,0x113f], 432 => [0x11ba,0x11bb], 433 => [0x1196,0x1197], 434 => [0x104e,0x104f], 435 => [0x246,0x247], 436 => [0x246,0x247], 437 => [0x237,0x238] }, + 'picturestyle' => { 8 => [0x4b,0x51], 9 => 0xf4, 10 => 0x6c, 11 => 0x86, 12 => 0x73, 16 => 0xab, 17 => 0xa7, 18 => 0xb0, 19 => 0x6c, 20 => 0xa7, 21 => 0xf4, 22 => 0xb3, 24 => 0xf4, 25 => 0xfa, 27 => 0x169, 74 => 0xa, 103 => 0x20301, 109 => 0x2 }, + 'picturestylepc' => { 64 => 0x4009 }, + 'picturestyleuserdef' => { 64 => 0x4008 }, + 'picturewizard' => { 394 => 0x21 }, + 'picturewizardcolor' => { 393 => 0x1 }, + 'picturewizardcontrast' => { 393 => 0x4 }, + 'picturewizardmode' => { 393 => 0x0 }, + 'picturewizardsaturation' => { 393 => 0x2 }, + 'picturewizardsharpness' => { 393 => 0x3 }, + 'pipelineversion' => { 176 => 'PipelineVersion' }, + 'pitch' => { 115 => 0x6, 280 => '4.1', 292 => '4.1', 380 => ['ptch',"\xa9fpt"] }, + 'pitchangle' => { 247 => 0x350f, 248 => 0x2c28, 252 => 0xc21e, 257 => 0x36f8, 258 => 0x2eff, 260 => 0xce36, 261 => 0xeaef, 297 => 0x904, 320 => 0x91, 354 => 0x2, 392 => 0x1 }, + 'pitchshift' => { 374 => 'player.movie.audio.pitchshift' }, + 'pixelaspectratio' => { 373 => 'pasp' }, + 'pixelclockfrequency' => { 138 => 0x40b }, + 'pixelcorrectionoffset' => { 138 => 0x972 }, + 'pixelcorrectionscale' => { 138 => 0x971 }, + 'pixelscale' => { 119 => 0x830e }, + 'pixelshiftinfo' => { 420 => 0x202f }, + 'pixelshiftoffset' => { 127 => 0x1106 }, + 'pixelshiftresolution' => { 356 => 0x0 }, + 'pixelshiftshots' => { 127 => 0x1105 }, + 'pixelsperunitx' => { 309 => 0x0 }, + 'pixelsperunity' => { 309 => 0x4 }, + 'pixelunits' => { 309 => 0x8 }, + 'planarconfiguration' => { 119 => 0x11c, 500 => 'PlanarConfiguration' }, + 'plane' => { 458 => [\'Planes','PlanesPlane'] }, + 'planeboundary' => { 458 => [\'Planes','PlanesPlaneBoundary'] }, + 'planeboundaryvertexcount' => { 458 => [\'Planes','PlanesPlaneBoundaryVertexCount'] }, + 'planeextentx' => { 458 => [\'Planes','PlanesPlaneExtentX'] }, + 'planeextentz' => { 458 => [\'Planes','PlanesPlaneExtentZ'] }, + 'planepose' => { 458 => [\'Planes','PlanesPlanePose'] }, + 'planeposepositionx' => { 458 => [\'Planes','PlanesPlanePosePositionX'] }, + 'planeposepositiony' => { 458 => [\'Planes','PlanesPlanePosePositionY'] }, + 'planeposepositionz' => { 458 => [\'Planes','PlanesPlanePosePositionZ'] }, + 'planeposerotationw' => { 458 => [\'Planes','PlanesPlanePoseRotationW'] }, + 'planeposerotationx' => { 458 => [\'Planes','PlanesPlanePoseRotationX'] }, + 'planeposerotationy' => { 458 => [\'Planes','PlanesPlanePoseRotationY'] }, + 'planeposerotationz' => { 458 => [\'Planes','PlanesPlanePoseRotationZ'] }, + 'planeposetimestamp' => { 458 => [\'Planes','PlanesPlanePoseTimestamp'] }, + 'planes' => { 458 => 'Planes' }, + 'planningref' => { 490 => 'PlanningRef' }, + 'planningrefidentifier' => { 490 => [\'PlanningRef','PlanningRefIdentifier'] }, + 'planningrefname' => { 490 => [\'PlanningRef','PlanningRefName'] }, + 'planningrefrole' => { 490 => [\'PlanningRef','PlanningRefRole'] }, + 'platenames' => { 509 => 'PlateNames' }, + 'platform' => { 494 => 'platform' }, + 'playallframes' => { 380 => 'AllF' }, + 'playbackflickdown' => { 295 => 0x159 }, + 'playbackflickup' => { 295 => 0x155 }, + 'playbackmenustime' => { 284 => '20.1', 285 => '21.1', 286 => '21.1' }, + 'playbackmonitorofftime' => { 279 => '25.2', 280 => '36.1', 282 => '36.1', 283 => '36.1', 287 => '35.1', 288 => '8.1', 289 => '35.1', 292 => '36.1', 293 => '36.1', 294 => '21.1', 295 => 0x33 }, + 'playbackzoom' => { 280 => '37.1' }, + 'playdisplay' => { 184 => 0x4e }, + 'playerversion' => { 374 => 'player.version' }, + 'playgap' => { 372 => 'pgap' }, + 'playlistid' => { 372 => 'plID' }, + 'playmode' => { 380 => 'SDLN' }, + 'playselection' => { 380 => 'SelO' }, + 'plusversion' => { 307 => 'Version' }, + 'pmversion' => { 367 => 'PMVersion' }, + 'pngwarning' => { 310 => 'Warning' }, + 'podcast' => { 372 => 'pcst' }, + 'podcasturl' => { 372 => 'purl' }, + 'poilevel' => { 225 => 0x8 }, + 'portraitimpressionbalance' => { 260 => 0x7fa0 }, + 'portraitnote' => { 461 => 'PortraitNote' }, + 'portraitoutputhighlightpoint' => { 109 => 0x1d }, + 'portraitoutputshadowpoint' => { 109 => 0x1e }, + 'portraitrawcolortone' => { 109 => 0x16 }, + 'portraitrawcontrast' => { 109 => 0x18 }, + 'portraitrawhighlight' => { 109 => 0x76 }, + 'portraitrawhighlightpoint' => { 109 => 0x1b }, + 'portraitrawlinear' => { 109 => 0x19 }, + 'portraitrawsaturation' => { 109 => 0x17 }, + 'portraitrawshadow' => { 109 => 0x7f }, + 'portraitrawshadowpoint' => { 109 => 0x1c }, + 'portraitrawsharpness' => { 109 => 0x1a }, + 'portraitrefiner' => { 113 => 0x302b }, + 'portraitrequest' => { 461 => 'PortraitRequest' }, + 'portraitunsharpmaskfineness' => { 109 => 0x9a }, + 'portraitunsharpmaskstrength' => { 109 => 0x98 }, + 'portraitunsharpmaskthreshold' => { 109 => 0x9c }, + 'portraitversion' => { 461 => 'PortraitVersion' }, + 'pose' => { 458 => 'Pose' }, + 'poseheadingdegrees' => { 466 => 'PoseHeadingDegrees' }, + 'posepitchdegrees' => { 466 => 'PosePitchDegrees' }, + 'posepositionx' => { 458 => [\'Pose','PosePositionX'] }, + 'posepositiony' => { 458 => [\'Pose','PosePositionY'] }, + 'posepositionz' => { 458 => [\'Pose','PosePositionZ'] }, + 'poserolldegrees' => { 466 => 'PoseRollDegrees' }, + 'poserotationw' => { 458 => [\'Pose','PoseRotationW'] }, + 'poserotationx' => { 458 => [\'Pose','PoseRotationX'] }, + 'poserotationy' => { 458 => [\'Pose','PoseRotationY'] }, + 'poserotationz' => { 458 => [\'Pose','PoseRotationZ'] }, + 'posetimestamp' => { 458 => [\'Pose','PoseTimestamp'] }, + 'positiondescriptor' => { 493 => 'positionDescriptor' }, + 'postalcode' => { 161 => 'PostalCode' }, + 'postcropvignetteamount' => { 478 => 'PostCropVignetteAmount', 480 => 'PostCropVignetteAmount' }, + 'postcropvignettefeather' => { 478 => 'PostCropVignetteFeather', 480 => 'PostCropVignetteFeather' }, + 'postcropvignettehighlightcontrast' => { 478 => 'PostCropVignetteHighlightContrast', 480 => 'PostCropVignetteHighlightContrast' }, + 'postcropvignettemidpoint' => { 478 => 'PostCropVignetteMidpoint', 480 => 'PostCropVignetteMidpoint' }, + 'postcropvignetteroundness' => { 478 => 'PostCropVignetteRoundness', 480 => 'PostCropVignetteRoundness' }, + 'postcropvignettestyle' => { 478 => 'PostCropVignetteStyle', 480 => 'PostCropVignetteStyle' }, + 'postfocusmerging' => { 320 => 0xbf }, + 'potentialface1position' => { 417 => 0xb }, + 'potentialface2position' => { 417 => 0x15 }, + 'potentialface3position' => { 417 => 0x1f }, + 'potentialface4position' => { 417 => 0x29 }, + 'potentialface5position' => { 417 => 0x33 }, + 'potentialface6position' => { 417 => 0x3d }, + 'potentialface7position' => { 417 => 0x47 }, + 'potentialface8position' => { 417 => 0x51 }, + 'powersource' => { 334 => '0.1' }, + 'poweruptime' => { 226 => 0xb6 }, + 'preaf' => { 126 => '0.2' }, + 'precaptureframes' => { 302 => 0x300 }, + 'predictor' => { 119 => 0x13d }, + 'preflashreturnstrength' => { 245 => 0x28a }, + 'prefs' => { 131 => 0xdd, 367 => 'Prefs' }, + 'prereadfastresetcount' => { 138 => 0x187e }, + 'preservedfilename' => { 505 => 'PreservedFileName' }, + 'preservedspecimen' => { 118 => 'PreservedSpecimen' }, + 'preservedspecimenmaterialsampleid' => { 118 => [\'PreservedSpecimen','PreservedSpecimenMaterialSampleID'] }, + 'presettype' => { 478 => 'PresetType', 480 => 'PresetType' }, + 'presetwhitebalance' => { 184 => 0x24, 455 => 0x8002 }, + 'presetwhitebalanceadj' => { 455 => 0x8014 }, + 'pressure' => { 119 => 0x9402, 485 => 'Pressure' }, + 'previewapplicationname' => { 119 => 0xc716 }, + 'previewapplicationversion' => { 119 => 0xc717 }, + 'previewbutton' => { 279 => ['14.1','15.1'], 280 => '15.1', 282 => '15.1', 283 => '15.1', 288 => '29.1', 289 => '14.1', 292 => '15.1', 293 => '15.1' }, + 'previewbuttonplusdials' => { 279 => ['14.2','15.2'], 280 => '15.2', 282 => '43.1', 283 => '43.1', 288 => '31.2', 292 => '43.1', 293 => '43.1' }, + 'previewcolorspace' => { 119 => 0xc71a }, + 'previewcropbottom' => { 366 => 0xef }, + 'previewcropleft' => { 366 => 0xec }, + 'previewcropright' => { 366 => 0xee }, + 'previewcroptop' => { 366 => 0xed }, + 'previewdate' => { 378 => 0x0 }, + 'previewdatetime' => { 119 => 0xc71b }, + 'previewimage' => { 113 => 0x2000, 114 => 'Exif-PreviewImage', 120 => 'PreviewImage', 122 => 0x4, 166 => 'data', 186 => 0x81, 302 => 0x280, 318 => 0x300, 380 => 'mcvr', 420 => 0x2001 }, + 'previewimageborders' => { 355 => 0x3e }, + 'previewimageheight' => { 73 => 0x4, 142 => 0xfa58 }, + 'previewimagelength' => { 73 => 0x2, 113 => 0x3, 119 => [0x117,0x202], 186 => 0x89, 234 => 0x202, 297 => 0x102, 302 => 0x1037, 355 => 0x3, 386 => 0x1e, 391 => 0x3, 397 => [0x1b,0x1d], 410 => 0x202 }, + 'previewimagename' => { 166 => '1Name' }, + 'previewimagesize' => { 113 => 0x2, 147 => 0x2, 166 => 'ImageSize', 355 => 0x2, 397 => [0x1c,0x1e], 420 => 0xb02c, 455 => 0x9012 }, + 'previewimagestart' => { 73 => 0x5, 113 => 0x4, 119 => [0x111,0x201], 186 => 0x88, 234 => 0x201, 297 => 0x101, 302 => 0x1036, 355 => 0x4, 386 => 0x1c, 391 => 0x2, 397 => [0x1a,0x1c], 410 => 0x201 }, + 'previewimagetype' => { 166 => '0Type' }, + 'previewimagevalid' => { 297 => 0x100, 302 => 0x1035 }, + 'previewimagewidth' => { 73 => 0x3, 142 => 0xfa57 }, + 'previewquality' => { 73 => 0x1 }, + 'previewsettingsdigest' => { 119 => 0xc719 }, + 'previewsettingsname' => { 119 => 0xc718 }, + 'primaryafpoint' => { 193 => [0x38,0x44,0x7] }, + 'primarychromaticities' => { 119 => 0x13f, 500 => 'PrimaryChromaticities' }, + 'primaryftp' => { 468 => 'PrimaryFTP' }, + 'primaryslot' => { 248 => 0xe7f, 258 => 0xfbf }, + 'printim' => { 119 => 0xc4a5 }, + 'prioritysetinawb' => { 420 => 0x202b }, + 'prioritysetupshutterrelease' => { 184 => 0x1d, 407 => 0x28 }, + 'privatertkinfo' => { 470 => 'privateRTKInfo' }, + 'processbordercolsleft' => { 138 => 0xc61 }, + 'processbordercolsright' => { 138 => 0xc62 }, + 'processborderrowsbottom' => { 138 => 0xc64 }, + 'processborderrowstop' => { 138 => 0xc63 }, + 'processingsoftware' => { 119 => 0xb }, + 'processversion' => { 478 => 'ProcessVersion', 480 => 'ProcessVersion' }, + 'producer' => { 179 => 'WM/Producer', 306 => 'Producer', 372 => "\xa9prd", 374 => 'producer', 380 => "\xa9prd", 491 => 'Producer' }, + 'producerkeywords' => { 380 => "\xa9pdk" }, + 'productcode' => { 494 => 'productCode' }, + 'productid' => { 132 => 0x32, 372 => 'prID', 493 => 'productID' }, + 'productidtype' => { 493 => 'productIDType' }, + 'productinimage' => { 490 => 'ProductInImage' }, + 'productinimagedescription' => { 490 => [\'ProductInImage','ProductInImageProductDescription'] }, + 'productinimagegtin' => { 490 => [\'ProductInImage','ProductInImageProductGTIN'] }, + 'productinimagename' => { 490 => [\'ProductInImage','ProductInImageProductName'] }, + 'productioncode' => { 335 => 0x2 }, + 'productorserviceconstraints' => { 307 => 'ProductOrServiceConstraints' }, + 'productversion' => { 372 => 'VERS' }, + 'profession' => { 494 => 'profession' }, + 'profile' => { 458 => [\'Profiles','ProfilesProfile'] }, + 'profilecalibrationsig' => { 119 => 0xc6f4 }, + 'profilecameraindices' => { 458 => [\'Profiles','ProfilesProfileCameraIndices'] }, + 'profilecopyright' => { 119 => 0xc6fe }, + 'profileembedpolicy' => { 119 => 0xc6fd }, + 'profilegaintablemap' => { 119 => 0xcd2d }, + 'profilehuesatmapdata1' => { 119 => 0xc6fa }, + 'profilehuesatmapdata2' => { 119 => 0xc6fb }, + 'profilehuesatmapdata3' => { 119 => 0xcd39 }, + 'profilehuesatmapdims' => { 119 => 0xc6f9 }, + 'profilehuesatmapencoding' => { 119 => 0xc7a3 }, + 'profilelooktabledata' => { 119 => 0xc726 }, + 'profilelooktabledims' => { 119 => 0xc725 }, + 'profilelooktableencoding' => { 119 => 0xc7a4 }, + 'profilename' => { 119 => 0xc6f8, 308 => 'iCCP-name' }, + 'profiles' => { 458 => 'Profiles' }, + 'profiletonecurve' => { 119 => 0xc6fc }, + 'profiletype' => { 458 => [\'Profiles','ProfilesProfileType'] }, + 'programiso' => { 320 => 0x3c }, + 'programline' => { 336 => '1.1' }, + 'programmode' => { 189 => 0x5 }, + 'programshift' => { 226 => 0xd }, + 'programversion' => { 131 => 0x46 }, + 'prohibits' => { 476 => 'prohibits' }, + 'projectiontype' => { 466 => 'ProjectionType', 467 => 'ProjectionType' }, + 'projectname' => { 504 => 'projectName' }, + 'projectref' => { 504 => 'projectRef' }, + 'projectrefpath' => { 504 => [\'projectRef','projectRefPath'] }, + 'projectreftype' => { 504 => [\'projectRef','projectRefType'] }, + 'promotionurl' => { 179 => 'WM/PromotionURL' }, + 'propertyreleaseid' => { 307 => 'PropertyReleaseID' }, + 'propertyreleasestatus' => { 307 => 'PropertyReleaseStatus' }, + 'provider' => { 179 => 'WM/Provider' }, + 'province-state' => { 131 => 0x5f }, + 'publicationdate' => { 494 => 'publicationDate' }, + 'publicationdatea-platform' => { 494 => [\'publicationDate','publicationDateA-platform'] }, + 'publicationdatedate' => { 494 => [\'publicationDate','publicationDateDate'] }, + 'publicationdisplaydate' => { 494 => 'publicationDisplayDate' }, + 'publicationdisplaydatea-platform' => { 494 => [\'publicationDisplayDate','publicationDisplayDateA-platform'] }, + 'publicationdisplaydatedate' => { 494 => [\'publicationDisplayDate','publicationDisplayDateDate'] }, + 'publicationevent' => { 490 => 'PublicationEvent' }, + 'publicationeventdate' => { 490 => [\'PublicationEvent','PublicationEventDate'] }, + 'publicationeventidentifier' => { 490 => [\'PublicationEvent','PublicationEventIdentifier'] }, + 'publicationeventname' => { 490 => [\'PublicationEvent','PublicationEventName'] }, + 'publicationname' => { 494 => 'publicationName' }, + 'publisher' => { 179 => 'WM/Publisher', 372 => "\xa9pub", 374 => 'publisher', 481 => 'publisher' }, + 'publishingfrequency' => { 494 => 'publishingFrequency' }, + 'pulldown' => { 504 => 'pullDown' }, + 'purchasedate' => { 372 => 'purd' }, + 'purplehsl' => { 103 => 0x20916 }, + 'pxshiftperiphedgenr' => { 455 => 0x9013 }, + 'pxshiftperiphedgenrvalue' => { 455 => 0x9014 }, + 'quality' => { 0 => 0x1, 34 => 0x3, 112 => 0x2, 113 => 0x3002, 127 => 0x1000, 140 => 0x9, 226 => 0x4, 262 => 0x3, 302 => 0x201, 315 => 0x300, 355 => 0x8, 362 => 0x2, 397 => 0x16, 407 => 0x56, 408 => 0x56, 409 => 0xb, 420 => [0x102,0x202e] }, + 'quality2' => { 429 => 0x1170, 430 => 0x1174, 431 => 0x1150, 433 => 0x11a8, 434 => 0x1060, 435 => 0x258, 436 => 0x258, 437 => 0x247, 442 => 0x29, 443 => 0x25, 444 => 0x2a }, + 'qualitybutton' => { 295 => 0x17d }, + 'qualitybuttonplaybackmode' => { 295 => 0x1bf }, + 'qualitymode' => { 113 => 0x8 }, + 'quantizationmethod' => { 133 => 0x78 }, + 'quickadjust' => { 275 => 0x2a }, + 'quickcontroldialinmeter' => { 84 => 0x703 }, + 'quickfix' => { 272 => 0x416391c6 }, + 'quickshot' => { 396 => 0x213 }, + 'quiettime' => { 138 => 0x188a }, + 'rads' => { 380 => 'rads' }, + 'rangefinder' => { 284 => '4.1', 285 => '5.1', 286 => '5.1' }, + 'rangemask' => { 478 => 'RangeMaskMapInfo', 480 => 'RangeMaskMapInfo' }, + 'rangemaskmapinfo' => { 478 => [\'RangeMaskMapInfo','RangeMaskMapInfoRangeMaskMapInfo'], 480 => [\'RangeMaskMapInfo','RangeMaskMapInfoRangeMaskMapInfo'] }, + 'rangemaskmapinfolabmax' => { 478 => [\'RangeMaskMapInfo','RangeMaskMapInfoRangeMaskMapInfoLabMax'], 480 => [\'RangeMaskMapInfo','RangeMaskMapInfoRangeMaskMapInfoLabMax'] }, + 'rangemaskmapinfolabmin' => { 478 => [\'RangeMaskMapInfo','RangeMaskMapInfoRangeMaskMapInfoLabMin'], 480 => [\'RangeMaskMapInfo','RangeMaskMapInfoRangeMaskMapInfoLabMin'] }, + 'rangemaskmapinfolumeq' => { 478 => [\'RangeMaskMapInfo','RangeMaskMapInfoRangeMaskMapInfoLumEq'], 480 => [\'RangeMaskMapInfo','RangeMaskMapInfoRangeMaskMapInfoLumEq'] }, + 'rangemaskmapinforgbmax' => { 478 => [\'RangeMaskMapInfo','RangeMaskMapInfoRangeMaskMapInfoRGBMax'], 480 => [\'RangeMaskMapInfo','RangeMaskMapInfoRangeMaskMapInfoRGBMax'] }, + 'rangemaskmapinforgbmin' => { 478 => [\'RangeMaskMapInfo','RangeMaskMapInfoRangeMaskMapInfoRGBMin'], 480 => [\'RangeMaskMapInfo','RangeMaskMapInfoRangeMaskMapInfoRGBMin'] }, + 'rasterizedcaption' => { 131 => 0x7d }, + 'rating' => { 119 => 0x4746, 127 => 0x1431, 366 => 0xdf, 372 => 'rtng', 380 => 'rtng', 420 => 0x2002, 473 => 'rating', 482 => 'rating', 490 => 'Rating', 494 => 'rating', 502 => 'Rating' }, + 'ratingpercent' => { 119 => 0x4749, 178 => 'Rating', 372 => 'rate', 502 => 'RatingPercent' }, + 'ratingregion' => { 490 => [\'Rating','RatingRatingRegion'] }, + 'ratingregioncity' => { 490 => [\'Rating','RatingRatingRegionCity'] }, + 'ratingregioncountrycode' => { 490 => [\'Rating','RatingRatingRegionCountryCode'] }, + 'ratingregioncountryname' => { 490 => [\'Rating','RatingRatingRegionCountryName'] }, + 'ratingregiongpsaltitude' => { 490 => [\'Rating','RatingRatingRegionGPSAltitude'] }, + 'ratingregiongpslatitude' => { 490 => [\'Rating','RatingRatingRegionGPSLatitude'] }, + 'ratingregiongpslongitude' => { 490 => [\'Rating','RatingRatingRegionGPSLongitude'] }, + 'ratingregionidentifier' => { 490 => [\'Rating','RatingRatingRegionIdentifier'] }, + 'ratingregionlocationid' => { 490 => [\'Rating','RatingRatingRegionLocationId'] }, + 'ratingregionlocationname' => { 490 => [\'Rating','RatingRatingRegionLocationName'] }, + 'ratingregionprovincestate' => { 490 => [\'Rating','RatingRatingRegionProvinceState'] }, + 'ratingregionsublocation' => { 490 => [\'Rating','RatingRatingRegionSublocation'] }, + 'ratingregionworldregion' => { 490 => [\'Rating','RatingRatingRegionWorldRegion'] }, + 'ratingscalemaxvalue' => { 490 => [\'Rating','RatingRatingScaleMaxValue'] }, + 'ratingscaleminvalue' => { 490 => [\'Rating','RatingRatingScaleMinValue'] }, + 'ratingsourcelink' => { 490 => [\'Rating','RatingRatingSourceLink'] }, + 'ratingvalue' => { 490 => [\'Rating','RatingRatingValue'] }, + 'ratingvaluelogolink' => { 490 => [\'Rating','RatingRatingValueLogoLink'] }, + 'rawandjpgrecording' => { 82 => 0x8, 186 => 0x109, 336 => 0xd }, + 'rawbrightnessadj' => { 103 => 0x20001, 108 => 0x38 }, + 'rawburstimagecount' => { 75 => 0x2 }, + 'rawburstimagenum' => { 75 => 0x1 }, + 'rawcoloradj' => { 108 => 0x2e }, + 'rawcropbottom' => { 366 => 0xd4 }, + 'rawcropleft' => { 366 => 0xd1 }, + 'rawcropright' => { 366 => 0xd3 }, + 'rawcroptop' => { 366 => 0xd2 }, + 'rawcustomsaturation' => { 108 => 0x30 }, + 'rawcustomtone' => { 108 => 0x34 }, + 'rawdata' => { 394 => 0xa048 }, + 'rawdatabyteorder' => { 394 => 0x40 }, + 'rawdatacfapattern' => { 394 => 0x50 }, + 'rawdatauniqueid' => { 119 => 0xc65d }, + 'rawdepth' => { 188 => 0x10 }, + 'rawdevartfilter' => { 304 => 0x121 }, + 'rawdevautogradation' => { 304 => 0x119 }, + 'rawdevcolorspace' => { 303 => 0x108, 304 => 0x109 }, + 'rawdevcontrastvalue' => { 303 => 0x106, 304 => 0x105 }, + 'rawdeveditstatus' => { 303 => 0x10b }, + 'rawdevelopmentprocess' => { 355 => 0x62 }, + 'rawdevengine' => { 303 => 0x109, 304 => 0x10b }, + 'rawdevexposurebiasvalue' => { 303 => 0x100, 304 => 0x100 }, + 'rawdevgradation' => { 304 => 0x112 }, + 'rawdevgraypoint' => { 303 => 0x103, 304 => 0x104 }, + 'rawdevmemorycoloremphasis' => { 303 => 0x105, 304 => 0x108 }, + 'rawdevnoisereduction' => { 303 => 0x10a, 304 => 0x10a }, + 'rawdevpicturemode' => { 304 => 0x10c }, + 'rawdevpm_bwfilter' => { 304 => 0x110 }, + 'rawdevpmcontrast' => { 304 => 0x10e }, + 'rawdevpmnoisefilter' => { 304 => 0x120 }, + 'rawdevpmpicturetone' => { 304 => 0x111 }, + 'rawdevpmsaturation' => { 304 => 0x10d }, + 'rawdevpmsharpness' => { 304 => 0x10f }, + 'rawdevsaturation3' => { 304 => 0x113 }, + 'rawdevsaturationemphasis' => { 303 => 0x104, 304 => 0x107 }, + 'rawdevsettings' => { 303 => 0x10c }, + 'rawdevsharpnessvalue' => { 303 => 0x107, 304 => 0x106 }, + 'rawdevversion' => { 303 => 0x0, 304 => 0x0 }, + 'rawdevwbfineadjustment' => { 303 => 0x102, 304 => 0x103 }, + 'rawdevwhitebalance' => { 304 => 0x101 }, + 'rawdevwhitebalancevalue' => { 303 => 0x101, 304 => 0x102 }, + 'rawfile' => { 119 => 0xfe4c }, + 'rawfilename' => { 478 => 'RawFileName', 480 => 'RawFileName' }, + 'rawfiletype' => { 420 => 0x2029 }, + 'rawformat' => { 325 => 0x2d, 364 => 0x10e }, + 'rawimagecenter' => { 226 => 0x99 }, + 'rawimagedigest' => { 119 => 0xc71c }, + 'rawimagesize' => { 355 => 0x39 }, + 'rawinfoversion' => { 305 => 0x0 }, + 'rawjpgheight' => { 99 => 0x4 }, + 'rawjpgquality' => { 57 => 0x6, 99 => 0x1 }, + 'rawjpgsize' => { 57 => 0x7, 99 => 0x2 }, + 'rawjpgwidth' => { 99 => 0x3 }, + 'rawmeasuredrggb' => { 43 => 0x26a, 45 => 0x280, 47 => 0x194, 48 => [0x1ad,0x26b] }, + 'rawrppused' => { 473 => 'rawrppused' }, + 'rawtopreviewgain' => { 119 => 0xc7a8 }, + 'readouttypeactual' => { 138 => 0x1903 }, + 'readouttyperequested' => { 138 => 0x1902 }, + 'reardisplay' => { 279 => '12.3', 280 => '6.2' }, + 'recdevice' => { 490 => 'RecDevice' }, + 'recdeviceattlensdescription' => { 490 => [\'RecDevice','RecDeviceAttLensDescription'] }, + 'recdevicemanufacturer' => { 490 => [\'RecDevice','RecDeviceManufacturer'] }, + 'recdevicemodelname' => { 490 => [\'RecDevice','RecDeviceModelName'] }, + 'recdeviceownersdeviceid' => { 490 => [\'RecDevice','RecDeviceOwnersDeviceId'] }, + 'recdeviceserialnumber' => { 490 => [\'RecDevice','RecDeviceSerialNumber'] }, + 'recipeendingpage' => { 496 => 'recipeEndingPage' }, + 'recipepagerange' => { 496 => 'recipePageRange' }, + 'recipesource' => { 496 => 'recipeSource' }, + 'recipestartingpage' => { 496 => 'recipeStartingPage' }, + 'recipetitle' => { 496 => 'recipeTitle' }, + 'recognizedface1age' => { 313 => 0x20 }, + 'recognizedface1name' => { 313 => 0x4 }, + 'recognizedface1position' => { 313 => 0x18 }, + 'recognizedface2age' => { 313 => 0x50 }, + 'recognizedface2name' => { 313 => 0x34 }, + 'recognizedface2position' => { 313 => 0x48 }, + 'recognizedface3age' => { 313 => 0x80 }, + 'recognizedface3name' => { 313 => 0x64 }, + 'recognizedface3position' => { 313 => 0x78 }, + 'recognizedfaceflags' => { 320 => 0x63 }, + 'recommendedexposureindex' => { 119 => 0x8832, 485 => 'RecommendedExposureIndex' }, + 'record' => { 118 => 'Record' }, + 'recordbasisofrecord' => { 118 => [\'Record','RecordBasisOfRecord'] }, + 'recordcollectioncode' => { 118 => [\'Record','RecordCollectionCode'] }, + 'recordcollectionid' => { 118 => [\'Record','RecordCollectionID'] }, + 'recorddatageneralizations' => { 118 => [\'Record','RecordDataGeneralizations'] }, + 'recorddatasetid' => { 118 => [\'Record','RecordDatasetID'] }, + 'recorddatasetname' => { 118 => [\'Record','RecordDatasetName'] }, + 'recorddisplay' => { 184 => 0x4d }, + 'recorddynamicproperties' => { 118 => [\'Record','RecordDynamicProperties'] }, + 'recordid' => { 97 => 0x1804 }, + 'recordinformationwithheld' => { 118 => [\'Record','RecordInformationWithheld'] }, + 'recordingcopyright' => { 380 => "\xa9phg" }, + 'recordingformat' => { 387 => 0x1000 }, + 'recordingmode' => { 112 => 0x1, 362 => 0x1 }, + 'recordinstitutioncode' => { 118 => [\'Record','RecordInstitutionCode'] }, + 'recordinstitutionid' => { 118 => [\'Record','RecordInstitutionID'] }, + 'recordlabelname' => { 380 => "\xa9lab" }, + 'recordlabelurl' => { 380 => "\xa9lal" }, + 'recordlocationdata' => { 229 => 0x660 }, + 'recordmode' => { 34 => 0x9, 113 => 0x3000 }, + 'recordownerinstitutioncode' => { 118 => [\'Record','RecordOwnerInstitutionCode'] }, + 'recordshutterrelease' => { 396 => 0x217 }, + 'redbalance' => { 302 => 0x1017, 325 => 0x11, 355 => 0x1c }, + 'redcurvelimits' => { 108 => 0x18a }, + 'redcurvepoints' => { 107 => 0x2d, 108 => 0x160 }, + 'redeyecorrection' => { 276 => 0x0 }, + 'redeyeinfo' => { 478 => 'RedEyeInfo', 480 => 'RedEyeInfo' }, + 'redeyereduction' => { 184 => 0x41, 407 => 0x6a, 409 => 0x28 }, + 'redeyeremoval' => { 320 => 0xb9 }, + 'redhsl' => { 103 => 0x20910 }, + 'redhue' => { 478 => 'RedHue', 480 => 'RedHue' }, + 'redsaturation' => { 478 => 'RedSaturation', 480 => 'RedSaturation' }, + 'reductionmatrix1' => { 119 => 0xc625 }, + 'reductionmatrix2' => { 119 => 0xc626 }, + 'reductionmatrix3' => { 119 => 0xcd3a }, + 'reelname' => { 119 => 0xc789, 380 => 'reel' }, + 'reference1' => { 488 => [\'TagStructure','TagStructureReference'] }, + 'reference2' => { 488 => [\'TagStructure','TagStructureSubLabelsReference'] }, + 'reference3' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsReference'] }, + 'reference4' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsReference'] }, + 'reference5' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsReference'] }, + 'reference6' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsReference'] }, + 'referenceblackwhite' => { 119 => 0x214, 500 => 'ReferenceBlackWhite' }, + 'referencedate' => { 131 => 0x2f }, + 'referencenumber' => { 131 => 0x32 }, + 'references' => { 157 => 'References' }, + 'referenceservice' => { 131 => 0x2d }, + 'regionappliedtodimensions' => { 172 => [\'Regions','RegionsAppliedToDimensions'] }, + 'regionappliedtodimensionsh' => { 172 => [\'Regions','RegionsAppliedToDimensionsH'] }, + 'regionappliedtodimensionsunit' => { 172 => [\'Regions','RegionsAppliedToDimensionsUnit'] }, + 'regionappliedtodimensionsw' => { 172 => [\'Regions','RegionsAppliedToDimensionsW'] }, + 'regionarea' => { 172 => [\'Regions','RegionsRegionListArea'] }, + 'regionaread' => { 172 => [\'Regions','RegionsRegionListAreaD'] }, + 'regionareah' => { 172 => [\'Regions','RegionsRegionListAreaH'] }, + 'regionareaunit' => { 172 => [\'Regions','RegionsRegionListAreaUnit'] }, + 'regionareaw' => { 172 => [\'Regions','RegionsRegionListAreaW'] }, + 'regionareax' => { 172 => [\'Regions','RegionsRegionListAreaX'] }, + 'regionareay' => { 172 => [\'Regions','RegionsRegionListAreaY'] }, + 'regionbarcodevalue' => { 172 => [\'Regions','RegionsRegionListBarCodeValue'] }, + 'regionconstraints' => { 307 => 'RegionConstraints' }, + 'regiondescription' => { 172 => [\'Regions','RegionsRegionListDescription'] }, + 'regionextensions' => { 172 => [\'Regions','RegionsRegionListExtensions'] }, + 'regionfocususage' => { 172 => [\'Regions','RegionsRegionListFocusUsage'] }, + 'regioninfo' => { 172 => 'Regions' }, + 'regioninfodateregionsvalid' => { 175 => [\'RegionInfo','RegionInfoDateRegionsValid'] }, + 'regioninfomp' => { 175 => 'RegionInfo' }, + 'regioninforegions' => { 175 => [\'RegionInfo','RegionInfoRegions'] }, + 'regionlist' => { 172 => [\'Regions','RegionsRegionList'] }, + 'regionname' => { 172 => [\'Regions','RegionsRegionListName'] }, + 'regionpersondisplayname' => { 175 => [\'RegionInfo','RegionInfoRegionsPersonDisplayName'] }, + 'regionpersonemaildigest' => { 175 => [\'RegionInfo','RegionInfoRegionsPersonEmailDigest'] }, + 'regionpersonliveidcid' => { 175 => [\'RegionInfo','RegionInfoRegionsPersonLiveIdCID'] }, + 'regionpersonsourceid' => { 175 => [\'RegionInfo','RegionInfoRegionsPersonSourceID'] }, + 'regionrectangle' => { 175 => [\'RegionInfo','RegionInfoRegionsRectangle'] }, + 'regionrotation' => { 172 => [\'Regions','RegionsRegionListRotation'] }, + 'regionseealso' => { 172 => [\'Regions','RegionsRegionListSeeAlso'] }, + 'regiontype' => { 172 => [\'Regions','RegionsRegionListType'] }, + 'registryentryrole' => { 490 => [\'RegistryId','RegistryIdRegEntryRole'] }, + 'registryid' => { 490 => 'RegistryId' }, + 'registryitemid' => { 490 => [\'RegistryId','RegistryIdRegItemId'] }, + 'registryorganisationid' => { 490 => [\'RegistryId','RegistryIdRegOrgId'] }, + 'relatedaudiofile' => { 155 => 'data' }, + 'relatedaudiofilename' => { 155 => '1Name' }, + 'relatedaudiofiletype' => { 155 => '0Type' }, + 'relatedimagefileformat' => { 119 => 0x1000 }, + 'relatedimageheight' => { 119 => 0x1002 }, + 'relatedimagewidth' => { 119 => 0x1001 }, + 'relatedresourceid' => { 118 => [\'ResourceRelationship','ResourceRelationshipRelatedResourceID'] }, + 'relatedsoundfile' => { 119 => 0xa004, 484 => 'RelatedSoundFile' }, + 'relatedvideofile' => { 169 => 'data' }, + 'relatedvideofilename' => { 169 => '1Name' }, + 'relatedvideofiletype' => { 169 => '0Type' }, + 'relation' => { 481 => 'relation' }, + 'relationshipaccordingto' => { 118 => [\'ResourceRelationship','ResourceRelationshipRelationshipAccordingTo'] }, + 'relationshipestablisheddate' => { 118 => [\'ResourceRelationship','ResourceRelationshipRelationshipEstablishedDate'] }, + 'relationshipofresource' => { 118 => [\'ResourceRelationship','ResourceRelationshipRelationshipOfResource'] }, + 'relationshipofresourceid' => { 118 => [\'ResourceRelationship','ResourceRelationshipRelationshipOfResourceID'] }, + 'relationshipremarks' => { 118 => [\'ResourceRelationship','ResourceRelationshipRelationshipRemarks'] }, + 'relativealtitude' => { 116 => 'RelativeAltitude' }, + 'relativepeakaudiofilepath' => { 504 => 'relativePeakAudioFilePath' }, + 'relativetimestamp' => { 504 => 'relativeTimestamp' }, + 'relativetimestampscale' => { 504 => [\'relativeTimestamp','relativeTimestampScale'] }, + 'relativetimestampvalue' => { 504 => [\'relativeTimestamp','relativeTimestampValue'] }, + 'releasebuttontousedial' => { 279 => '17.8', 280 => '18.5', 282 => '18.4', 283 => '18.4', 288 => '33.8', 289 => '17.6', 292 => '18.5', 293 => '18.4' }, + 'releasedate' => { 131 => 0x1e, 372 => 'rldt', 473 => 'ReleaseDate', 504 => 'releaseDate' }, + 'releasemode' => { 113 => 0x3001, 247 => 0x184d, 420 => 0xb049 }, + 'releasemode2' => { 429 => 0x112c, 430 => [0x112c,0x8], 431 => [0x1108,0x8], 432 => [0x1184,0x8], 433 => [0x1160,0x8], 434 => [0x4,0x1018], 435 => [0x4,0x210], 436 => [0x4,0x210], 437 => [0x4,0x208], 439 => [0x67,0x3f], 440 => [0x6b,0x6d,0x73,0x4b], 441 => [0x6b,0x4b], 442 => 0x10, 443 => 0x10, 444 => 0x9, 451 => 0x34 }, + 'releasemode3' => { 429 => 0x1128, 430 => 0x1128, 431 => 0x1104, 432 => 0x1180, 433 => 0x115c, 434 => 0x1014, 435 => 0x20c, 436 => 0x20c, 437 => 0x204 }, + 'releaseready' => { 490 => 'ReleaseReady' }, + 'releasesetting' => { 97 => 0x1016 }, + 'releasetime' => { 131 => 0x23, 473 => 'ReleaseTime' }, + 'remoteonduration' => { 281 => '3.4', 284 => '17.2', 285 => '18.2', 286 => '18.2', 287 => '18.2', 289 => '18.2', 290 => '4.3', 294 => '19.2' }, + 'renditionclass' => { 505 => 'RenditionClass' }, + 'renditionof' => { 505 => 'RenditionOf' }, + 'renditionofalternatepaths' => { 505 => [\'RenditionOf','RenditionOfAlternatePaths'] }, + 'renditionofdocumentid' => { 505 => [\'RenditionOf','RenditionOfDocumentID'] }, + 'renditionoffilepath' => { 505 => [\'RenditionOf','RenditionOfFilePath'] }, + 'renditionoffrompart' => { 505 => [\'RenditionOf','RenditionOfFromPart'] }, + 'renditionofinstanceid' => { 505 => [\'RenditionOf','RenditionOfInstanceID'] }, + 'renditionoflastmodifydate' => { 505 => [\'RenditionOf','RenditionOfLastModifyDate'] }, + 'renditionoflasturl' => { 505 => [\'RenditionOf','RenditionOfLastURL'] }, + 'renditionoflinkcategory' => { 505 => [\'RenditionOf','RenditionOfLinkCategory'] }, + 'renditionoflinkform' => { 505 => [\'RenditionOf','RenditionOfLinkForm'] }, + 'renditionofmanager' => { 505 => [\'RenditionOf','RenditionOfManager'] }, + 'renditionofmanagervariant' => { 505 => [\'RenditionOf','RenditionOfManagerVariant'] }, + 'renditionofmanageto' => { 505 => [\'RenditionOf','RenditionOfManageTo'] }, + 'renditionofmanageui' => { 505 => [\'RenditionOf','RenditionOfManageUI'] }, + 'renditionofmaskmarkers' => { 505 => [\'RenditionOf','RenditionOfMaskMarkers'] }, + 'renditionoforiginaldocumentid' => { 505 => [\'RenditionOf','RenditionOfOriginalDocumentID'] }, + 'renditionofpartmapping' => { 505 => [\'RenditionOf','RenditionOfPartMapping'] }, + 'renditionofplacedresolutionunit' => { 505 => [\'RenditionOf','RenditionOfPlacedResolutionUnit'] }, + 'renditionofplacedxresolution' => { 505 => [\'RenditionOf','RenditionOfPlacedXResolution'] }, + 'renditionofplacedyresolution' => { 505 => [\'RenditionOf','RenditionOfPlacedYResolution'] }, + 'renditionofrenditionclass' => { 505 => [\'RenditionOf','RenditionOfRenditionClass'] }, + 'renditionofrenditionparams' => { 505 => [\'RenditionOf','RenditionOfRenditionParams'] }, + 'renditionoftopart' => { 505 => [\'RenditionOf','RenditionOfToPart'] }, + 'renditionofversionid' => { 505 => [\'RenditionOf','RenditionOfVersionID'] }, + 'renditionparams' => { 505 => 'RenditionParams' }, + 'repeatingflashcount' => { 209 => 0xd, 210 => 0xe, 211 => 0xe, 212 => 0xe, 213 => 0xe, 288 => '17.2', 289 => '24.2', 290 => '9.2', 291 => '24.2', 294 => '25.2' }, + 'repeatingflashcountbuilt-in' => { 256 => 0x4db }, + 'repeatingflashcountexternal' => { 256 => 0x4c3 }, + 'repeatingflashoutput' => { 288 => '17.1', 289 => '24.1', 290 => '9.1', 291 => '24.1', 294 => '25.1' }, + 'repeatingflashoutputexternal' => { 256 => 0x4c0 }, + 'repeatingflashrate' => { 209 => 0xc, 210 => 0xd, 211 => 0xd, 212 => 0xd, 213 => 0xd, 288 => '18.1', 289 => '25.1', 290 => '10.1', 291 => '25.1', 294 => '26.1' }, + 'repeatingflashratebuilt-in' => { 256 => 0x4da }, + 'repeatingflashrateexternal' => { 256 => 0x4c2 }, + 'requirements' => { 380 => "\xa9req" }, + 'requires' => { 476 => 'requires' }, + 'resampleparams' => { 504 => 'resampleParams' }, + 'resampleparamsquality' => { 504 => [\'resampleParams','resampleParamsQuality'] }, + 'resamplingkerneldenominators050' => { 138 => 0xe50 }, + 'resamplingkerneldenominators067' => { 138 => 0xe4f }, + 'resamplingkerneldenominators100' => { 138 => 0xe51 }, + 'resaved' => { 396 => 0x21e }, + 'resetblacksegrows' => { 138 => 0x181a }, + 'resolution' => { 162 => 'Resolution' }, + 'resolutionmode' => { 397 => [0x87,0x4] }, + 'resolutionunit' => { 119 => 0x128, 134 => 0x2, 500 => 'ResolutionUnit' }, + 'resourceid' => { 118 => [\'ResourceRelationship','ResourceRelationshipResourceID'] }, + 'resourcerelationship' => { 118 => 'ResourceRelationship' }, + 'resourcerelationshipid' => { 118 => [\'ResourceRelationship','ResourceRelationshipResourceRelationshipID'] }, + 'restrictdrivemodes' => { 84 => 0x612 }, + 'restrictions' => { 497 => 'restrictions' }, + 'retouchareafeather' => { 478 => [\'RetouchAreas','RetouchAreasFeather'], 480 => [\'RetouchAreas','RetouchAreasFeather'] }, + 'retouchareamaskalpha' => { 478 => [\'RetouchAreas','RetouchAreasMasksAlpha'], 480 => [\'RetouchAreas','RetouchAreasMasksAlpha'] }, + 'retouchareamaskangle' => { 478 => [\'RetouchAreas','RetouchAreasMasksAngle'], 480 => [\'RetouchAreas','RetouchAreasMasksAngle'] }, + 'retouchareamaskbottom' => { 478 => [\'RetouchAreas','RetouchAreasMasksBottom'], 480 => [\'RetouchAreas','RetouchAreasMasksBottom'] }, + 'retouchareamaskcentervalue' => { 478 => [\'RetouchAreas','RetouchAreasMasksCenterValue'], 480 => [\'RetouchAreas','RetouchAreasMasksCenterValue'] }, + 'retouchareamaskcenterweight' => { 478 => [\'RetouchAreas','RetouchAreasMasksCenterWeight'], 480 => [\'RetouchAreas','RetouchAreasMasksCenterWeight'] }, + 'retouchareamaskdabs' => { 478 => [\'RetouchAreas','RetouchAreasMasksDabs'], 480 => [\'RetouchAreas','RetouchAreasMasksDabs'] }, + 'retouchareamaskfeather' => { 478 => [\'RetouchAreas','RetouchAreasMasksFeather'], 480 => [\'RetouchAreas','RetouchAreasMasksFeather'] }, + 'retouchareamaskflipped' => { 478 => [\'RetouchAreas','RetouchAreasMasksFlipped'], 480 => [\'RetouchAreas','RetouchAreasMasksFlipped'] }, + 'retouchareamaskflow' => { 478 => [\'RetouchAreas','RetouchAreasMasksFlow'], 480 => [\'RetouchAreas','RetouchAreasMasksFlow'] }, + 'retouchareamaskfullx' => { 478 => [\'RetouchAreas','RetouchAreasMasksFullX'], 480 => [\'RetouchAreas','RetouchAreasMasksFullX'] }, + 'retouchareamaskfully' => { 478 => [\'RetouchAreas','RetouchAreasMasksFullY'], 480 => [\'RetouchAreas','RetouchAreasMasksFullY'] }, + 'retouchareamaskinputdigest' => { 478 => [\'RetouchAreas','RetouchAreasMasksInputDigest'], 480 => [\'RetouchAreas','RetouchAreasMasksInputDigest'] }, + 'retouchareamaskleft' => { 478 => [\'RetouchAreas','RetouchAreasMasksLeft'], 480 => [\'RetouchAreas','RetouchAreasMasksLeft'] }, + 'retouchareamaskmaskactive' => { 478 => [\'RetouchAreas','RetouchAreasMasksMaskActive'], 480 => [\'RetouchAreas','RetouchAreasMasksMaskActive'] }, + 'retouchareamaskmaskblendmode' => { 478 => [\'RetouchAreas','RetouchAreasMasksMaskBlendMode'], 480 => [\'RetouchAreas','RetouchAreasMasksMaskBlendMode'] }, + 'retouchareamaskmaskdigest' => { 478 => [\'RetouchAreas','RetouchAreasMasksMaskDigest'], 480 => [\'RetouchAreas','RetouchAreasMasksMaskDigest'] }, + 'retouchareamaskmaskinverted' => { 478 => [\'RetouchAreas','RetouchAreasMasksMaskInverted'], 480 => [\'RetouchAreas','RetouchAreasMasksMaskInverted'] }, + 'retouchareamaskmaskname' => { 478 => [\'RetouchAreas','RetouchAreasMasksMaskName'], 480 => [\'RetouchAreas','RetouchAreasMasksMaskName'] }, + 'retouchareamaskmasks' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasks'], 480 => [\'RetouchAreas','RetouchAreasMasksMasks'] }, + 'retouchareamaskmasksalpha' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksAlpha'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksAlpha'] }, + 'retouchareamaskmasksangle' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksAngle'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksAngle'] }, + 'retouchareamaskmasksbottom' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksBottom'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksBottom'] }, + 'retouchareamaskmaskscentervalue' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksCenterValue'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksCenterValue'] }, + 'retouchareamaskmaskscenterweight' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksCenterWeight'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksCenterWeight'] }, + 'retouchareamaskmasksdabs' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksDabs'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksDabs'] }, + 'retouchareamaskmasksfeather' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksFeather'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksFeather'] }, + 'retouchareamaskmasksflipped' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksFlipped'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksFlipped'] }, + 'retouchareamaskmasksflow' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksFlow'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksFlow'] }, + 'retouchareamaskmasksfullx' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksFullX'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksFullX'] }, + 'retouchareamaskmasksfully' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksFullY'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksFullY'] }, + 'retouchareamaskmasksinputdigest' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksInputDigest'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksInputDigest'] }, + 'retouchareamaskmasksleft' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksLeft'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksLeft'] }, + 'retouchareamaskmasksmaskactive' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksMaskActive'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksMaskActive'] }, + 'retouchareamaskmasksmaskblendmode' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksMaskBlendMode'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksMaskBlendMode'] }, + 'retouchareamaskmasksmaskdigest' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksMaskDigest'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksMaskDigest'] }, + 'retouchareamaskmasksmaskinverted' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksMaskInverted'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksMaskInverted'] }, + 'retouchareamaskmasksmaskname' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksMaskName'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksMaskName'] }, + 'retouchareamaskmasksmasksubtype' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksMaskSubType'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksMaskSubType'] }, + 'retouchareamaskmasksmasksyncid' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksMaskSyncID'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksMaskSyncID'] }, + 'retouchareamaskmasksmaskversion' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksMaskVersion'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksMaskVersion'] }, + 'retouchareamaskmasksmidpoint' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksMidpoint'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksMidpoint'] }, + 'retouchareamaskmasksorigin' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksOrigin'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksOrigin'] }, + 'retouchareamaskmasksperimetervalue' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksPerimeterValue'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksPerimeterValue'] }, + 'retouchareamaskmasksradius' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksRadius'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksRadius'] }, + 'retouchareamaskmasksreferencepoint' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksReferencePoint'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksReferencePoint'] }, + 'retouchareamaskmasksright' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksRight'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksRight'] }, + 'retouchareamaskmasksroundness' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksRoundness'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksRoundness'] }, + 'retouchareamaskmaskssizex' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksSizeX'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksSizeX'] }, + 'retouchareamaskmaskssizey' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksSizeY'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksSizeY'] }, + 'retouchareamaskmaskstop' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksTop'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksTop'] }, + 'retouchareamaskmasksubtype' => { 478 => [\'RetouchAreas','RetouchAreasMasksMaskSubType'], 480 => [\'RetouchAreas','RetouchAreasMasksMaskSubType'] }, + 'retouchareamaskmasksvalue' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksMaskValue'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksMaskValue'] }, + 'retouchareamaskmasksversion' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksVersion'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksVersion'] }, + 'retouchareamaskmaskswhat' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksWhat'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksWhat'] }, + 'retouchareamaskmaskswholeimagearea' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksWholeImageArea'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksWholeImageArea'] }, + 'retouchareamaskmasksx' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksX'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksX'] }, + 'retouchareamaskmasksy' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksY'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksY'] }, + 'retouchareamaskmasksyncid' => { 478 => [\'RetouchAreas','RetouchAreasMasksMaskSyncID'], 480 => [\'RetouchAreas','RetouchAreasMasksMaskSyncID'] }, + 'retouchareamaskmaskszerox' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksZeroX'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksZeroX'] }, + 'retouchareamaskmaskszeroy' => { 478 => [\'RetouchAreas','RetouchAreasMasksMasksZeroY'], 480 => [\'RetouchAreas','RetouchAreasMasksMasksZeroY'] }, + 'retouchareamaskmaskversion' => { 478 => [\'RetouchAreas','RetouchAreasMasksMaskVersion'], 480 => [\'RetouchAreas','RetouchAreasMasksMaskVersion'] }, + 'retouchareamaskmidpoint' => { 478 => [\'RetouchAreas','RetouchAreasMasksMidpoint'], 480 => [\'RetouchAreas','RetouchAreasMasksMidpoint'] }, + 'retouchareamaskorigin' => { 478 => [\'RetouchAreas','RetouchAreasMasksOrigin'], 480 => [\'RetouchAreas','RetouchAreasMasksOrigin'] }, + 'retouchareamaskperimetervalue' => { 478 => [\'RetouchAreas','RetouchAreasMasksPerimeterValue'], 480 => [\'RetouchAreas','RetouchAreasMasksPerimeterValue'] }, + 'retouchareamaskradius' => { 478 => [\'RetouchAreas','RetouchAreasMasksRadius'], 480 => [\'RetouchAreas','RetouchAreasMasksRadius'] }, + 'retouchareamaskrange' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMask'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMask'] }, + 'retouchareamaskrangeareamodels' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskAreaModels'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskAreaModels'] }, + 'retouchareamaskrangeareamodelscolorsampleinfo' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskAreaModelsColorRangeMaskAreaSampleInfo'] }, + 'retouchareamaskrangeareamodelscomponents' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskAreaModelsAreaComponents'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskAreaModelsAreaComponents'] }, + 'retouchareamaskrangecoloramount' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskColorAmount'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskColorAmount'] }, + 'retouchareamaskrangedepthfeather' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskDepthFeather'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskDepthFeather'] }, + 'retouchareamaskrangedepthmax' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskDepthMax'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskDepthMax'] }, + 'retouchareamaskrangedepthmin' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskDepthMin'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskDepthMin'] }, + 'retouchareamaskrangeinvert' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskInvert'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskInvert'] }, + 'retouchareamaskrangelumfeather' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskLumFeather'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskLumFeather'] }, + 'retouchareamaskrangeluminancedepthsampleinfo' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskLuminanceDepthSampleInfo'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskLuminanceDepthSampleInfo'] }, + 'retouchareamaskrangelummax' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskLumMax'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskLumMax'] }, + 'retouchareamaskrangelummin' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskLumMin'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskLumMin'] }, + 'retouchareamaskrangelumrange' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskLumRange'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskLumRange'] }, + 'retouchareamaskrangesampletype' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskSampleType'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskSampleType'] }, + 'retouchareamaskrangetype' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskType'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskType'] }, + 'retouchareamaskrangeversion' => { 478 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskVersion'], 480 => [\'RetouchAreas','RetouchAreasMasksCorrectionRangeMaskVersion'] }, + 'retouchareamaskreferencepoint' => { 478 => [\'RetouchAreas','RetouchAreasMasksReferencePoint'], 480 => [\'RetouchAreas','RetouchAreasMasksReferencePoint'] }, + 'retouchareamaskright' => { 478 => [\'RetouchAreas','RetouchAreasMasksRight'], 480 => [\'RetouchAreas','RetouchAreasMasksRight'] }, + 'retouchareamaskroundness' => { 478 => [\'RetouchAreas','RetouchAreasMasksRoundness'], 480 => [\'RetouchAreas','RetouchAreasMasksRoundness'] }, + 'retouchareamasks' => { 478 => [\'RetouchAreas','RetouchAreasMasks'], 480 => [\'RetouchAreas','RetouchAreasMasks'] }, + 'retouchareamasksizex' => { 478 => [\'RetouchAreas','RetouchAreasMasksSizeX'], 480 => [\'RetouchAreas','RetouchAreasMasksSizeX'] }, + 'retouchareamasksizey' => { 478 => [\'RetouchAreas','RetouchAreasMasksSizeY'], 480 => [\'RetouchAreas','RetouchAreasMasksSizeY'] }, + 'retouchareamasktop' => { 478 => [\'RetouchAreas','RetouchAreasMasksTop'], 480 => [\'RetouchAreas','RetouchAreasMasksTop'] }, + 'retouchareamaskvalue' => { 478 => [\'RetouchAreas','RetouchAreasMasksMaskValue'], 480 => [\'RetouchAreas','RetouchAreasMasksMaskValue'] }, + 'retouchareamaskversion' => { 478 => [\'RetouchAreas','RetouchAreasMasksVersion'], 480 => [\'RetouchAreas','RetouchAreasMasksVersion'] }, + 'retouchareamaskwhat' => { 478 => [\'RetouchAreas','RetouchAreasMasksWhat'], 480 => [\'RetouchAreas','RetouchAreasMasksWhat'] }, + 'retouchareamaskwholeimagearea' => { 478 => [\'RetouchAreas','RetouchAreasMasksWholeImageArea'], 480 => [\'RetouchAreas','RetouchAreasMasksWholeImageArea'] }, + 'retouchareamaskx' => { 478 => [\'RetouchAreas','RetouchAreasMasksX'], 480 => [\'RetouchAreas','RetouchAreasMasksX'] }, + 'retouchareamasky' => { 478 => [\'RetouchAreas','RetouchAreasMasksY'], 480 => [\'RetouchAreas','RetouchAreasMasksY'] }, + 'retouchareamaskzerox' => { 478 => [\'RetouchAreas','RetouchAreasMasksZeroX'], 480 => [\'RetouchAreas','RetouchAreasMasksZeroX'] }, + 'retouchareamaskzeroy' => { 478 => [\'RetouchAreas','RetouchAreasMasksZeroY'], 480 => [\'RetouchAreas','RetouchAreasMasksZeroY'] }, + 'retouchareamethod' => { 478 => [\'RetouchAreas','RetouchAreasMethod'], 480 => [\'RetouchAreas','RetouchAreasMethod'] }, + 'retouchareaoffsety' => { 478 => [\'RetouchAreas','RetouchAreasOffsetY'], 480 => [\'RetouchAreas','RetouchAreasOffsetY'] }, + 'retouchareaopacity' => { 478 => [\'RetouchAreas','RetouchAreasOpacity'], 480 => [\'RetouchAreas','RetouchAreasOpacity'] }, + 'retouchareas' => { 478 => 'RetouchAreas', 480 => 'RetouchAreas' }, + 'retouchareaseed' => { 478 => [\'RetouchAreas','RetouchAreasSeed'], 480 => [\'RetouchAreas','RetouchAreasSeed'] }, + 'retouchareasourcestate' => { 478 => [\'RetouchAreas','RetouchAreasSourceState'], 480 => [\'RetouchAreas','RetouchAreasSourceState'] }, + 'retouchareasourcex' => { 478 => [\'RetouchAreas','RetouchAreasSourceX'], 480 => [\'RetouchAreas','RetouchAreasSourceX'] }, + 'retouchareaspottype' => { 478 => [\'RetouchAreas','RetouchAreasSpotType'], 480 => [\'RetouchAreas','RetouchAreasSpotType'] }, + 'retouchhistory' => { 226 => 0x9e }, + 'retouchinfo' => { 478 => 'RetouchInfo', 480 => 'RetouchInfo' }, + 'retouchnefprocessing' => { 236 => 0x5 }, + 'retractlensonpoweroff' => { 84 => 0x814 }, + 'reuse' => { 307 => 'Reuse' }, + 'reuseallowed' => { 507 => 'ReuseAllowed' }, + 'reuseprohibited' => { 497 => 'reuseProhibited' }, + 'reverseexposurecompdial' => { 286 => '5.2' }, + 'reversefocusring' => { 295 => 0x163 }, + 'reverseindicators' => { 279 => '12.1', 280 => '6.1', 282 => '6.1', 283 => '6.1', 284 => '4.3', 285 => '5.2', 286 => '5.4', 288 => '33.5', 289 => '5.1', 292 => '6.1', 293 => '6.1', 294 => '6.2', 295 => 0xc1 }, + 'reverseshutterspeedaperture' => { 286 => '5.3' }, + 'revision' => { 482 => 'revision' }, + 'rflensmffocusringsensitivity' => { 84 => 0x714 }, + 'rflenstype' => { 57 => 0x3d }, + 'rgbcurvelimits' => { 108 => 0x238 }, + 'rgbcurvepoints' => { 107 => 0x7, 108 => 0x20e }, + 'rgbtables' => { 119 => 0xcd3b }, + 'richtextcomment' => { 487 => 'RichTextComment' }, + 'ricohdate' => { 386 => 0x6 }, + 'ricohimageheight' => { 386 => 0x2 }, + 'ricohimagewidth' => { 386 => 0x0 }, + 'rightalbedo' => { 469 => 'RightAlbedo' }, + 'rightascension' => { 165 => 'RightAscension' }, + 'rights' => { 481 => 'rights' }, + 'rightsagent' => { 497 => 'rightsAgent' }, + 'rightsowner' => { 497 => 'rightsOwner' }, + 'roll' => { 115 => 0x8, 380 => ['roll',"\xa9frl"] }, + 'rollangle' => { 247 => 0x350b, 248 => 0x2c24, 252 => 0xc21a, 257 => 0x36f4, 258 => 0x2efb, 260 => 0xce32, 261 => 0xeaeb, 297 => 0x903, 320 => 0x90, 354 => 0x1, 392 => 0x2 }, + 'romoperationmode' => { 97 => 0x80d }, + 'rotation' => { 30 => 0x17, 31 => 0x18, 96 => 0x3, 103 => 0x10002, 108 => 0x26e, 114 => 'QuickTime-Rotation', 123 => 0x4, 165 => 'Rotation', 182 => [0x65,0x50], 183 => 0x46, 184 => 0x5a, 187 => 0x10, 247 => 0x3693, 248 => 0xca, 255 => '590.1', 272 => 0x76a43207, 320 => 0x30, 336 => '17.2', 366 => 0xd8, 373 => 'irot', 407 => 0x3f, 408 => 0x3f, 418 => 0x10 }, + 'routedto' => { 486 => 'RoutedTo' }, + 'routing' => { 371 => 'Routing' }, + 'routingdestinations' => { 468 => 'RoutingDestinations' }, + 'routingexclusions' => { 468 => 'RoutingExclusions' }, + 'routingnotes' => { 486 => 'RoutingNotes' }, + 'rowsperstrip' => { 119 => 0x116 }, + 'rpp' => { 473 => 'rpp' }, + 'rtkflag' => { 116 => 'RtkFlag' }, + 'rtkstdhgt' => { 116 => 'RtkStdHgt' }, + 'rtkstdlat' => { 116 => 'RtkStdLat' }, + 'rtkstdlon' => { 116 => 'RtkStdLon' }, + 'safetyshift' => { 84 => 0x108 }, + 'safetyshiftinavortv' => { 82 => 0x10, 83 => 0x10, 85 => 0xf, 86 => 0x10, 89 => 0x10 }, + 'sameexposurefornewaperture' => { 84 => 0x112 }, + 'samplebits' => { 155 => 'SampleBits' }, + 'samplepagerange' => { 494 => 'samplePageRange' }, + 'samplerate' => { 155 => 'SampleRate' }, + 'samplesperpixel' => { 119 => 0x115, 325 => 0x8, 500 => 'SamplesPerPixel' }, + 'samplestructure' => { 133 => 0x5a }, + 'samsungmodelid' => { 394 => 0x3 }, + 'sanyoquality' => { 396 => 0x201 }, + 'sanyothumbnail' => { 396 => 0x100 }, + 'saturation' => { 10 => 0x6e, 12 => 0x76, 34 => 0xe, 51 => 0x1, 63 => 0x7, 112 => 0xd, 113 => [0x3013,0x1f], 119 => [0xa409,0xfe55], 127 => 0x1003, 156 => 'Saturation', 181 => 0x1f, 182 => 0x32, 183 => 0x28, 184 => 0x1a, 189 => 0x1, 226 => 0xaa, 231 => 0x35, 232 => 0x3b, 233 => 0x43, 320 => 0x40, 322 => 0x300d, 355 => 0x1f, 362 => 0xd, 381 => 0x27, 383 => 0x58, 386 => 0x28, 387 => 0x1013, 397 => 0x10, 407 => 0x1e, 408 => 0x1b, 420 => 0x2005, 478 => 'Saturation', 480 => 'Saturation', 484 => 'Saturation' }, + 'saturationadj' => { 103 => 0x20901, 108 => 0x116, 226 => 0x94, 271 => 0x1, 275 => 0x2e, 455 => 0x8016 }, + 'saturationadjustmentaqua' => { 478 => 'SaturationAdjustmentAqua', 480 => 'SaturationAdjustmentAqua' }, + 'saturationadjustmentblue' => { 478 => 'SaturationAdjustmentBlue', 480 => 'SaturationAdjustmentBlue' }, + 'saturationadjustmentgreen' => { 478 => 'SaturationAdjustmentGreen', 480 => 'SaturationAdjustmentGreen' }, + 'saturationadjustmentmagenta' => { 478 => 'SaturationAdjustmentMagenta', 480 => 'SaturationAdjustmentMagenta' }, + 'saturationadjustmentorange' => { 478 => 'SaturationAdjustmentOrange', 480 => 'SaturationAdjustmentOrange' }, + 'saturationadjustmentpurple' => { 478 => 'SaturationAdjustmentPurple', 480 => 'SaturationAdjustmentPurple' }, + 'saturationadjustmentred' => { 478 => 'SaturationAdjustmentRed', 480 => 'SaturationAdjustmentRed' }, + 'saturationadjustmentyellow' => { 478 => 'SaturationAdjustmentYellow', 480 => 'SaturationAdjustmentYellow' }, + 'saturationauto' => { 71 => 0x98 }, + 'saturationfaithful' => { 19 => 0xfe, 70 => 0x68, 71 => 0x68 }, + 'saturationlandscape' => { 19 => 0xfc, 70 => 0x38, 71 => 0x38 }, + 'saturationmonochrome' => { 70 => 0x80, 71 => 0x80 }, + 'saturationneutral' => { 19 => 0xfd, 70 => 0x50, 71 => 0x50 }, + 'saturationportrait' => { 19 => 0xfb, 70 => 0x20, 71 => 0x20 }, + 'saturationsetting' => { 305 => 0x1010, 409 => 0x11, 425 => 0x9 }, + 'saturationstandard' => { 19 => 0xfa, 70 => 0x8, 71 => 0x8 }, + 'saturationuserdef1' => { 19 => 0x100, 70 => 0x98, 71 => 0xb0 }, + 'saturationuserdef2' => { 19 => 0x101, 70 => 0xb0, 71 => 0xc8 }, + 'saturationuserdef3' => { 19 => 0x102, 70 => 0xc8, 71 => 0xe0 }, + 'saveid' => { 505 => 'SaveID' }, + 'sbaanalysiscomplete' => { 138 => 0xc35 }, + 'sbablack' => { 138 => 0xc25 }, + 'sbagmoffset' => { 138 => 0xc4a }, + 'sbagray' => { 138 => 0xc26 }, + 'sbagreenmagentabal' => { 138 => 0xc33 }, + 'sbahighgray' => { 138 => 0xc46 }, + 'sbailloffset' => { 138 => 0xc49 }, + 'sbailluminantbal' => { 138 => 0xc34 }, + 'sbalowgray' => { 138 => 0xc47 }, + 'sbaneutralbal' => { 138 => 0xc32 }, + 'sbawhite' => { 138 => 0xc27 }, + 'scaletype' => { 504 => 'scaleType' }, + 'scanimageenhancer' => { 237 => 0x60 }, + 'scanningdirection' => { 133 => 0x64 }, + 'scene' => { 380 => 'scen', 489 => 'Scene', 504 => 'scene' }, + 'scenearea' => { 300 => 0x211, 302 => 0x1031 }, + 'sceneassist' => { 226 => 0x9c }, + 'scenecapturetype' => { 119 => 0xa406, 484 => 'SceneCaptureType' }, + 'scenedetect' => { 300 => 0x210, 302 => 0x1030 }, + 'scenedetectdata' => { 300 => 0x212, 302 => 0x1033 }, + 'scenemode' => { 142 => 0xfa02, 186 => 0x100, 226 => 0x8f, 297 => 0x509, 302 => 0x403, 320 => 0x8001, 329 => 0xf, 420 => 0xb023 }, + 'scenemodeused' => { 144 => [0x6002,0xf002] }, + 'scenerecognition' => { 127 => 0x1425 }, + 'sceneselect' => { 396 => 0x21f }, + 'scenetype' => { 119 => 0xa301, 484 => 'SceneType' }, + 'screentips' => { 279 => '12.7', 280 => '5.3', 288 => '13.1', 289 => '4.4', 292 => '5.4', 294 => '5.1' }, + 'scriptversion' => { 138 => 0x1770 }, + 'season' => { 490 => 'Season', 493 => 'season' }, + 'seasonidentifier' => { 490 => [\'Season','SeasonIdentifier'] }, + 'seasonname' => { 490 => [\'Season','SeasonName'] }, + 'seasonnumber' => { 490 => [\'Season','SeasonNumber'] }, + 'secondaryftp' => { 468 => 'SecondaryFTP' }, + 'secondaryslotfunction' => { 229 => 0x22c, 247 => 0x1d0, 257 => 0x1d0 }, + 'section' => { 494 => 'section' }, + 'securityclassification' => { 119 => 0x9212 }, + 'selectableafpoint' => { 84 => 0x509 }, + 'selectafareaselectionmode' => { 2 => 0xc }, + 'selectafareaselectmode' => { 84 => 0x512 }, + 'selfdata' => { 116 => 'SelfData' }, + 'selftimer' => { 34 => 0x2, 320 => 0x2e, 396 => 0x214, 429 => 0x1134, 430 => 0x1134, 431 => 0x1110, 432 => 0x118c, 433 => 0x1168, 434 => 0x1020, 435 => 0x218, 436 => 0x218, 437 => 0x210 }, + 'selftimer2' => { 77 => 0x1d }, + 'selftimerinterval' => { 289 => '19.2' }, + 'selftimermode' => { 119 => 0x882b }, + 'selftimershotcount' => { 280 => '20.2', 282 => '20.3', 283 => '20.3', 284 => '18.2', 285 => '19.2', 286 => '19.2', 287 => '19.3', 289 => '19.3', 292 => '20.3', 293 => '20.3', 294 => '20.2', 295 => 0x2d }, + 'selftimershotinterval' => { 280 => '20.3', 282 => '20.2', 283 => '20.2', 287 => '19.2', 292 => '20.2', 293 => '20.2', 295 => 0x31 }, + 'selftimertime' => { 97 => 0x1806, 184 => 0x1f, 279 => '18.1', 280 => '20.1', 281 => '3.3', 282 => '20.1', 283 => '20.1', 284 => '18.1', 285 => '19.1', 286 => '19.1', 287 => '19.1', 288 => '7.2', 289 => '19.1', 290 => '3.3', 292 => '20.1', 293 => '20.1', 294 => '20.1', 295 => 0x2b }, + 'sellingagency' => { 494 => 'sellingAgency' }, + 'seminfo' => { 119 => 0x8546 }, + 'sensingmethod' => { 119 => 0xa217, 484 => 'SensingMethod' }, + 'sensitivityadjust' => { 355 => 0x40 }, + 'sensitivitysteps' => { 336 => ['14.3','17.4'], 338 => 0x1 }, + 'sensitivitytype' => { 119 => 0x8830, 485 => 'SensitivityType' }, + 'sensor' => { 191 => 0x665e }, + 'sensorarea' => { 302 => 0x400 }, + 'sensorareas' => { 394 => 0xa010 }, + 'sensorbitdepth' => { 322 => 0x312d }, + 'sensorbluelevel' => { 74 => 0x5 }, + 'sensorcalibration' => { 301 => 0x805 }, + 'sensorcleaning' => { 90 => 0xd }, + 'sensorfullheight' => { 137 => 0xf904 }, + 'sensorfullwidth' => { 137 => 0xf903 }, + 'sensorheight' => { 137 => 0xf901, 142 => 0xfa21, 188 => 0x8, 322 => 0x312c, 364 => 0x109, 387 => 0x1602 }, + 'sensorimageheight' => { 138 => 0x3ee }, + 'sensorimagewidth' => { 138 => 0x3ed }, + 'sensorleftborder' => { 138 => 0x3eb }, + 'sensorleftmargin' => { 364 => 0x10a }, + 'sensorpixelsize' => { 226 => 0x9a }, + 'sensorredlevel' => { 74 => 0x4 }, + 'sensorserialnumber' => { 138 => 0x9ce }, + 'sensorshield' => { 229 => 0x66d }, + 'sensorsize' => { 156 => 'SensorSize', 355 => 0x35 }, + 'sensortemperature' => { 300 => 0x1500, 302 => 0x1007, 360 => 0xc, 364 => 0x210, 397 => [0x39,0x55] }, + 'sensortemperature2' => { 360 => 0xe, 364 => 0x211 }, + 'sensortopborder' => { 138 => 0x3ec }, + 'sensortopmargin' => { 364 => 0x10b }, + 'sensortype' => { 320 => 0xca }, + 'sensorwidth' => { 137 => 0xf900, 142 => 0xfa20, 188 => 0xa, 322 => 0x312b, 364 => 0x108, 387 => 0x1601 }, + 'sequence' => { 381 => 0x7, 382 => 0x35, 383 => 0x36 }, + 'sequencefilenumber' => { 430 => 0x4, 431 => 0x4, 432 => 0x4, 433 => 0x4, 442 => 0xc, 443 => 0xc, 444 => 0x1a }, + 'sequenceimagenumber' => { 430 => 0x0, 431 => 0x0, 432 => 0x0, 433 => 0x0, 442 => 0x8, 443 => 0x8, 444 => 0x12, 451 => 0x24 }, + 'sequencelength' => { 442 => 0x22, 443 => 0x1e, 444 => [0x16,0x1e] }, + 'sequencename' => { 493 => 'sequenceName' }, + 'sequencenumber' => { 77 => 0x9, 113 => 0x301c, 127 => 0x1101, 140 => 0x1d, 256 => 0x51c, 320 => 0x2b, 409 => [0x10c,0x30c], 420 => 0xb04a, 493 => 'sequenceNumber' }, + 'sequenceshotinterval' => { 396 => 0x224 }, + 'sequencetotalnumber' => { 493 => 'sequenceTotalNumber' }, + 'sequentialshot' => { 396 => 0x20e }, + 'serialnumber' => { 64 => 0xc, 97 => 0x180b, 119 => [0xa431,0xfde9], 137 => 0xfa04, 139 => 0xfa00, 141 => 0xc354, 142 => 0xfa19, 153 => 0x0, 156 => 'SerialNumber', 191 => 0x5501, 226 => [0xa0,0x1d], 298 => 0x101, 302 => [0x404,0x101a], 315 => 0x303, 317 => 0x305, 322 => 0x3103, 355 => 0x229, 364 => 0x102, 365 => 0x407, 380 => ['SNum','slno'], 381 => 0x15, 382 => 0x4b, 383 => 0x7e, 387 => 0x5, 394 => 0xa002, 397 => 0x2, 420 => 0x2031, 475 => 'SerialNumber', 485 => 'BodySerialNumber' }, + 'serialnumberformat' => { 64 => 0x15, 97 => 0x183b }, + 'serialnumberhash' => { 380 => 'CAME' }, + 'series' => { 490 => 'Series' }, + 'seriesdatetime' => { 457 => 'SeriesDateTime' }, + 'seriesdescription' => { 457 => 'SeriesDescription' }, + 'seriesidentifier' => { 490 => [\'Series','SeriesIdentifier'] }, + 'seriesmodality' => { 457 => 'SeriesModality' }, + 'seriesname' => { 490 => [\'Series','SeriesName'] }, + 'seriesnumber' => { 457 => 'SeriesNumber', 494 => 'seriesNumber' }, + 'seriestitle' => { 494 => 'seriesTitle' }, + 'serviceidentifier' => { 132 => 0x1e }, + 'servingsize' => { 496 => 'servingSize' }, + 'setbuttoncrosskeysfunc' => { 87 => 0x0, 88 => 0x0 }, + 'setbuttonwhenshooting' => { 82 => 0x1, 84 => 0x704, 90 => 0xc }, + 'setclockfromlocationdata' => { 229 => 0x61d }, + 'setfunctionwhenshooting' => { 85 => 0x0, 86 => 0x1, 89 => 0x1 }, + 'setting' => { 493 => 'setting' }, + 'shadingcompensation' => { 297 => 0x50c, 320 => 0x8a }, + 'shadingcompensation2' => { 301 => 0x1012 }, + 'shadow' => { 397 => 0xe }, + 'shadowadj' => { 103 => 0x2030b }, + 'shadowcorrection' => { 355 => 0x79 }, + 'shadowprotection' => { 271 => 0x0 }, + 'shadows' => { 119 => 0xfe52, 420 => 0x2032, 472 => 'Shadows', 478 => 'Shadows', 480 => 'Shadows' }, + 'shadows2012' => { 478 => 'Shadows2012', 480 => 'Shadows2012' }, + 'shadowsadj' => { 455 => 0x901a }, + 'shadowscale' => { 119 => 0xc633 }, + 'shadowtint' => { 478 => 'ShadowTint', 480 => 'ShadowTint' }, + 'shadowtone' => { 127 => 0x1040 }, + 'shakereduction' => { 357 => 0x1, 358 => 0x1 }, + 'shareduserrating' => { 179 => 'WM/SharedUserRating' }, + 'sharpendetail' => { 478 => 'SharpenDetail', 480 => 'SharpenDetail' }, + 'sharpenedgemasking' => { 478 => 'SharpenEdgeMasking', 480 => 'SharpenEdgeMasking' }, + 'sharpening' => { 322 => 0x300b }, + 'sharpeningadj' => { 275 => 0x2b }, + 'sharpeningkernel' => { 138 => 0x92f }, + 'sharpenradius' => { 478 => 'SharpenRadius', 480 => 'SharpenRadius' }, + 'sharpness' => { 8 => [0x42,0x48], 10 => 0x72, 12 => 0x74, 34 => 0xf, 63 => 0x6, 74 => 0x2, 112 => 0xb, 113 => [0x3011,0x21], 119 => [0xa40a,0xfe56], 127 => 0x1001, 140 => 0x6b, 149 => 0x37, 156 => 'Sharpness', 181 => 0x21, 182 => 0x30, 183 => 0x26, 184 => 0x18, 189 => 0x3, 226 => 0x6, 231 => 0x32, 232 => 0x33, 233 => 0x39, 302 => 0x100f, 320 => 0x41, 355 => 0x21, 362 => 0xb, 381 => 0x26, 383 => 0x56, 386 => 0x22, 387 => [0x1003,0x1014], 397 => 0x11, 407 => 0x1c, 408 => 0x19, 420 => 0x2006, 451 => 0x52, 478 => 'Sharpness', 480 => 'Sharpness', 484 => 'Sharpness' }, + 'sharpnessadj' => { 103 => 0x20310, 108 => 0x25a, 455 => 0x801a }, + 'sharpnessadjon' => { 103 => '0x20310.0' }, + 'sharpnessauto' => { 71 => 0x94 }, + 'sharpnessfactor' => { 302 => 0x102a }, + 'sharpnessfaithful' => { 19 => 0xf5, 70 => 0x64, 71 => 0x64 }, + 'sharpnessfrequency' => { 8 => [0x41,0x47], 74 => 0x3 }, + 'sharpnesslandscape' => { 19 => 0xf3, 70 => 0x34, 71 => 0x34 }, + 'sharpnessmonochrome' => { 19 => 0xf6, 70 => 0x7c, 71 => 0x7c }, + 'sharpnessneutral' => { 19 => 0xf4, 70 => 0x4c, 71 => 0x4c }, + 'sharpnessovershoot' => { 455 => 0x801b }, + 'sharpnessportrait' => { 19 => 0xf2, 70 => 0x1c, 71 => 0x1c }, + 'sharpnessrange' => { 420 => 0x2035 }, + 'sharpnesssetting' => { 297 => 0x506, 305 => 0x1013, 409 => 0x12, 425 => 0xa }, + 'sharpnessstandard' => { 19 => 0xf1, 70 => 0x4, 71 => 0x4 }, + 'sharpnessstrength' => { 103 => 0x20311 }, + 'sharpnessthreshold' => { 455 => 0x801d }, + 'sharpnessundershoot' => { 455 => 0x801c }, + 'sharpnessuserdef1' => { 19 => 0xf7, 70 => 0x94, 71 => 0xac }, + 'sharpnessuserdef2' => { 19 => 0xf8, 70 => 0xac, 71 => 0xc4 }, + 'sharpnessuserdef3' => { 19 => 0xf9, 70 => 0xc4, 71 => 0xdc }, + 'shiftcols' => { 138 => 0xc70 }, + 'shootid' => { 493 => 'shootID' }, + 'shootingdistance' => { 103 => 0x20701 }, + 'shootinginfodisplay' => { 279 => '13.2', 280 => '5.1', 288 => '10.2', 289 => '4.1', 292 => '5.1', 294 => '5.3' }, + 'shootinginfomonitorofftime' => { 279 => '26.2', 280 => '22.2', 282 => '22.2', 283 => '22.2', 287 => '21.2', 288 => '9.1', 289 => '21.2', 292 => '22.2', 293 => '22.2', 294 => '22.2', 295 => 0x37 }, + 'shootingmode' => { 156 => 'ShootingMode', 226 => 0x89, 320 => 0x1f }, + 'shootingmodesetting' => { 281 => '5.1' }, + 'shortdescription' => { 482 => 'shortdescription' }, + 'shortdocumentid' => { 131 => 0xba }, + 'shortname' => { 478 => 'ShortName', 480 => 'ShortName' }, + 'shortownername' => { 19 => 0xac }, + 'shortreleasetimelag' => { 84 => 0x80d }, + 'shorttitle' => { 372 => '@sti' }, + 'shotdate' => { 504 => 'shotDate' }, + 'shotday' => { 504 => 'shotDay' }, + 'shotlocation' => { 504 => 'shotLocation' }, + 'shotname' => { 380 => 'shot', 504 => 'shotName' }, + 'shotnumber' => { 504 => 'shotNumber' }, + 'shotnumbersincepowerup' => { 424 => 0x44e, 442 => 0x1a, 443 => 0x16, 444 => 0xa }, + 'shotnumbersincepowerup2' => { 409 => 0x200 }, + 'shotsize' => { 504 => 'shotSize' }, + 'shotsperinterval' => { 228 => 0xb4, 229 => 0xc0, 252 => 0xc412 }, + 'showmovement' => { 372 => 'shwm' }, + 'shownevent' => { 490 => 'EventExt' }, + 'showneventidentifier' => { 490 => [\'EventExt','EventExtIdentifier'] }, + 'showneventname' => { 490 => [\'EventExt','EventExtName'] }, + 'shutter' => { 439 => 0x20, 440 => 0x26, 441 => 0x26 }, + 'shutter-aelock' => { 82 => 0x4, 84 => 0x701, 85 => 0x3, 86 => 0x4, 87 => 0x3, 88 => 0x3, 89 => 0x4, 90 => 0x2 }, + 'shutteraelbutton' => { 83 => 0x4 }, + 'shutterbuttonafonbutton' => { 84 => 0x701 }, + 'shuttercount' => { 11 => 0x176, 57 => 0x1, 226 => 0xa7, 238 => [0x6a,0x157,0x24d], 239 => 0x286, 240 => 0x279, 241 => 0x284, 242 => 0x242, 243 => 0x280, 244 => 0x276, 245 => [0x27d,0x27f], 246 => 0x246, 249 => 0x2d6, 250 => 0x321, 251 => 0xbd8, 253 => 0x287, 254 => 0x320, 255 => 0x24a, 256 => 0x5fb, 259 => 0x2d5, 355 => 0x5d, 418 => 0x846, 423 => [0x125,0x14a], 439 => 0x32, 440 => 0x3a, 441 => 0x3a }, + 'shuttercount2' => { 439 => 0x4c, 440 => [0x50,0x52,0x58], 441 => 0x50 }, + 'shuttercount3' => { 439 => [0x1a0,0x1aa,0x1bd], 440 => [0x19f,0x1cb,0x1cd] }, + 'shuttercurtainsync' => { 82 => 0xf, 83 => 0xf, 84 => 0x305, 85 => 0xe, 86 => 0xf, 87 => 0x8, 88 => 0x8, 89 => 0xf, 90 => 0x8 }, + 'shuttermode' => { 57 => 0x17, 140 => 0x1b, 226 => 0x34 }, + 'shutterreleasebuttonae-l' => { 279 => '17.7', 280 => '18.4', 282 => '78.4', 283 => '78.4', 284 => '16.1', 285 => '17.1', 286 => '17.1', 287 => '17.1', 288 => '7.1', 289 => '17.5', 292 => '18.4', 293 => '78.4', 294 => '18.2', 295 => 0x29 }, + 'shutterreleasemethod' => { 97 => 0x1010 }, + 'shutterreleasenocfcard' => { 82 => 0x2, 83 => 0x2, 90 => 0xf }, + 'shutterreleasetiming' => { 97 => 0x1011 }, + 'shutterreleasewithoutlens' => { 84 => 0x711 }, + 'shutterspeedlock' => { 280 => '38.1', 282 => '38.1', 283 => '38.1', 292 => '38.1', 293 => '38.1', 295 => 0xb7 }, + 'shutterspeedrange' => { 84 => 0x10c }, + 'shutterspeedsetting' => { 184 => 0x6, 407 => 0x2f, 408 => 0x28, 409 => 0x0 }, + 'shutterspeedvalue' => { 93 => 0x1, 119 => 0x9201, 302 => 0x1000, 364 => 0x400, 484 => 'ShutterSpeedValue' }, + 'shuttertype' => { 127 => 0x1050, 320 => 0x9f, 355 => 0x87 }, + 'sidecarforextension' => { 492 => 'SidecarForExtension' }, + 'sigmaimpulseparameters' => { 138 => 0xe0d }, + 'sigmascalingfactorcamera' => { 138 => 0xe0c }, + 'sigmascalingfactorlowres' => { 138 => 0xe0b }, + 'sigmasizetable' => { 138 => 0xe0f }, + 'silentphotography' => { 226 => 0xbf }, + 'similarityindex' => { 131 => 0xe4 }, + 'singleframebracketing' => { 184 => 0x21 }, + 'skilllevel' => { 496 => 'skillLevel' }, + 'skintonecorrection' => { 355 => 0x95 }, + 'skiplinetime' => { 138 => 0x184e }, + 'slaveflashmeteringsegments' => { 355 => 0x20b }, + 'slideshowname' => { 493 => 'slideshowName' }, + 'slideshownumber' => { 493 => 'slideshowNumber' }, + 'slideshowtotalnumber' => { 493 => 'slideshowTotalNumber' }, + 'slowshutter' => { 77 => 0x8 }, + 'slowsync' => { 127 => 0x1030 }, + 'smartalbumcolor' => { 394 => 0x20 }, + 'smartrange' => { 394 => 0xa012 }, + 'smileshutter' => { 409 => 0x31 }, + 'smileshuttermode' => { 409 => 0x27 }, + 'smoothness' => { 119 => 0xfe57, 478 => 'Smoothness', 480 => 'Smoothness' }, + 'snapshot' => { 490 => 'SnapshotLink' }, + 'snapshotformat' => { 490 => [\'SnapshotLink','SnapshotLinkFormat'] }, + 'snapshotheightpixels' => { 490 => [\'SnapshotLink','SnapshotLinkHeightPixels'] }, + 'snapshotimagerole' => { 490 => [\'SnapshotLink','SnapshotLinkImageRole'] }, + 'snapshotlink' => { 490 => [\'SnapshotLink','SnapshotLinkLink'] }, + 'snapshotlinkqualifier' => { 490 => [\'SnapshotLink','SnapshotLinkLinkQualifier'] }, + 'snapshots' => { 473 => 'Snapshots' }, + 'snapshotusedvideoframe' => { 490 => [\'SnapshotLink','SnapshotLinkUsedVideoFrame'] }, + 'snapshotusedvideoframetimeformat' => { 490 => [\'SnapshotLink','SnapshotLinkUsedVideoFrameTimeFormat'] }, + 'snapshotusedvideoframetimevalue' => { 490 => [\'SnapshotLink','SnapshotLinkUsedVideoFrameTimeValue'] }, + 'snapshotusedvideoframevalue' => { 490 => [\'SnapshotLink','SnapshotLinkUsedVideoFrameValue'] }, + 'snapshotwidthpixels' => { 490 => [\'SnapshotLink','SnapshotLinkWidthPixels'] }, + 'softskineffect' => { 420 => 0x200f }, + 'software' => { 119 => 0x131, 157 => 'Software', 310 => 'Software', 364 => 0x203, 374 => 'software', 397 => 0x18, 463 => 'Software', 500 => 'Software' }, + 'softwareversion' => { 380 => ['@swr',"\xa9swr"], 396 => 0x207 }, + 'soloist' => { 372 => "\xa9sol" }, + 'songwriter' => { 380 => "\xa9swf" }, + 'songwriterkeywords' => { 380 => "\xa9swk" }, + 'sonycropsize' => { 119 => 0x74c8 }, + 'sonycroptopleft' => { 119 => 0x74c7 }, + 'sonydatetime' => { 428 => 0x6, 430 => 0x1b6, 431 => 0x210, 432 => 0x1fe, 433 => 0x22c }, + 'sonydatetime2' => { 439 => 0x51 }, + 'sonyexposuretime' => { 439 => 0x3a, 440 => 0x46, 441 => [0x66,0x46] }, + 'sonyexposuretime2' => { 451 => 0xe }, + 'sonyfnumber' => { 439 => 0x3c, 440 => 0x48, 441 => [0x68,0x48], 451 => 0x14 }, + 'sonyimageheight' => { 428 => 0x1a, 442 => 0x44, 443 => 0x3f, 444 => 0x47 }, + 'sonyimageheightmax' => { 451 => 0x40 }, + 'sonyimagesize' => { 184 => 0x3b, 407 => 0x54, 408 => 0x54, 409 => 0x9 }, + 'sonyimagewidth' => { 428 => 0x1c }, + 'sonyimagewidthmax' => { 451 => 0x3e }, + 'sonyiso' => { 430 => 0x1218, 431 => 0x11f4, 432 => 0x1270, 433 => [0x1254,0x1258,0x1280], 434 => 0x113c, 435 => 0x344, 436 => 0x346, 437 => 0x320, 451 => 0x4 }, + 'sonymaxaperture' => { 439 => 0x0, 440 => 0x0 }, + 'sonymaxaperturevalue' => { 451 => 0x16 }, + 'sonyminaperture' => { 439 => 0x1, 440 => 0x1 }, + 'sonymodelid' => { 420 => 0xb001 }, + 'sonyquality' => { 184 => 0x3c }, + 'sonytimeminsec' => { 440 => 0x61 }, + 'sortalbum' => { 372 => 'soal' }, + 'sortalbumartist' => { 372 => 'soaa' }, + 'sortartist' => { 372 => 'soar' }, + 'sortcomposer' => { 372 => 'soco' }, + 'sortname' => { 372 => 'sonm', 478 => 'SortName', 480 => 'SortName' }, + 'sortshow' => { 372 => 'sosn' }, + 'soundengineer' => { 372 => "\xa9sne" }, + 'source' => { 131 => 0x73, 310 => 'Source', 481 => 'source', 482 => 'source', 492 => 'Source' }, + 'sourcecount' => { 467 => 'SourceCount' }, + 'sourcecredits' => { 380 => "\xa9src" }, + 'sourcedirectoryindex' => { 342 => 0x0 }, + 'sourcefileindex' => { 342 => 0x2 }, + 'sourcephotoscount' => { 466 => 'SourcePhotosCount' }, + 'sourceprofileprefix' => { 138 => 0x1390 }, + 'spatialfrequencyresponse' => { 484 => 'SpatialFrequencyResponse' }, + 'spatialfrequencyresponsecolumns' => { 484 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseColumns'] }, + 'spatialfrequencyresponsenames' => { 484 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseNames'] }, + 'spatialfrequencyresponserows' => { 484 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseRows'] }, + 'spatialfrequencyresponsevalues' => { 484 => [\'SpatialFrequencyResponse','SpatialFrequencyResponseValues'] }, + 'speakerplacement' => { 504 => 'speakerPlacement' }, + 'specialeffectlevel' => { 113 => 0x3030 }, + 'specialeffectmode' => { 113 => 0x2076 }, + 'specialeffectsetting' => { 113 => 0x3031 }, + 'specialinstructions' => { 131 => 0x28 }, + 'specialmode' => { 302 => 0x200, 396 => 0x200 }, + 'specialoccasion' => { 496 => 'specialOccasion' }, + 'specialtypeid' => { 461 => 'SpecialTypeID' }, + 'spectralsensitivity' => { 119 => 0x8824, 484 => 'SpectralSensitivity' }, + 'specularwhitelevel' => { 41 => 0x32b, 42 => 0x281, 45 => [0x2b9,0x2d0,0x2d4], 46 => 0x56a, 47 => 0x1e4, 48 => [0x1fd,0x2dd], 49 => [0x231,0x30f], 50 => 0x31d }, + 'speedx' => { 115 => 0x3, 380 => "\xa9xsp" }, + 'speedy' => { 115 => 0x4, 380 => "\xa9ysp" }, + 'speedz' => { 115 => 0x5, 380 => "\xa9zsp" }, + 'spherical' => { 467 => 'Spherical' }, + 'splitcolumn' => { 364 => 0x222 }, + 'splittoningbalance' => { 478 => 'SplitToningBalance', 480 => 'SplitToningBalance' }, + 'splittoninghighlighthue' => { 478 => 'SplitToningHighlightHue', 480 => 'SplitToningHighlightHue' }, + 'splittoninghighlightsaturation' => { 478 => 'SplitToningHighlightSaturation', 480 => 'SplitToningHighlightSaturation' }, + 'splittoningshadowhue' => { 478 => 'SplitToningShadowHue', 480 => 'SplitToningShadowHue' }, + 'splittoningshadowsaturation' => { 478 => 'SplitToningShadowSaturation', 480 => 'SplitToningShadowSaturation' }, + 'sport' => { 494 => 'sport' }, + 'spotfocuspointx' => { 181 => 0x2d }, + 'spotfocuspointy' => { 181 => 0x2e }, + 'spotmeteringmode' => { 34 => 0x27 }, + 'spotmeterlinktoafpoint' => { 84 => 0x107 }, + 'sractive' => { 336 => '17.1' }, + 'srawquality' => { 34 => 0x2e }, + 'srfocallength' => { 357 => 0x3 }, + 'srgbrendering' => { 308 => 'sRGB' }, + 'srhalfpresstime' => { 357 => 0x2 }, + 'srresult' => { 357 => 0x0, 358 => 0x0 }, + 'stackedimage' => { 297 => 0x804 }, + 'standardmatrixcustom' => { 138 => 0x7d4 }, + 'standardmatrixdaylight' => { 138 => 0x7d0 }, + 'standardmatrixflash' => { 138 => 0x7d3 }, + 'standardmatrixfluorescent' => { 138 => 0x7d2 }, + 'standardmatrixtungsten' => { 138 => 0x7d1 }, + 'standardoutputhighlightpoint' => { 109 => 0x14 }, + 'standardoutputsensitivity' => { 119 => 0x8831, 485 => 'StandardOutputSensitivity' }, + 'standardoutputshadowpoint' => { 109 => 0x15 }, + 'standardrawcolortone' => { 109 => 0xd }, + 'standardrawcontrast' => { 109 => 0xf }, + 'standardrawhighlight' => { 109 => 0x75 }, + 'standardrawhighlightpoint' => { 109 => 0x12 }, + 'standardrawlinear' => { 109 => 0x10 }, + 'standardrawsaturation' => { 109 => 0xe }, + 'standardrawshadow' => { 109 => 0x7e }, + 'standardrawshadowpoint' => { 109 => 0x13 }, + 'standardrawsharpness' => { 109 => 0x11 }, + 'standardunsharpmaskfineness' => { 109 => 0x94 }, + 'standardunsharpmaskstrength' => { 109 => 0x92 }, + 'standardunsharpmaskthreshold' => { 109 => 0x96 }, + 'standardwhitecustom' => { 138 => 0x838 }, + 'standardwhitedaylight' => { 138 => 0x834 }, + 'standardwhiteflash' => { 138 => 0x837 }, + 'standardwhitefluorescent' => { 138 => 0x836 }, + 'standardwhitetungsten' => { 138 => 0x835 }, + 'standbytimer' => { 280 => '19.1', 282 => '19.1', 283 => '19.1', 286 => '18.1', 287 => '18.1', 292 => '19.1', 293 => '19.1' }, + 'starlightview' => { 295 => 0x249 }, + 'startingpage' => { 494 => 'startingPage' }, + 'startmovieshooting' => { 84 => 0x70d }, + 'starttimecode' => { 380 => "\xa9TIM", 504 => 'startTimecode' }, + 'starttimecodetimeformat' => { 504 => [\'startTimecode','startTimecodeTimeFormat'] }, + 'starttimecodetimevalue' => { 504 => [\'startTimecode','startTimecodeTimeValue'] }, + 'starttimecodevalue' => { 504 => [\'startTimecode','startTimecodeValue'] }, + 'starttimesamplesize' => { 380 => "\xa9TSZ", 504 => 'startTimeSampleSize' }, + 'starttimescale' => { 380 => "\xa9TSC", 504 => 'startTimeScale' }, + 'state' => { 161 => 'State', 320 => 0x6b, 492 => 'State' }, + 'status' => { 459 => 'Status', 471 => 'Status' }, + 'stereomode' => { 467 => 'StereoMode' }, + 'stitched' => { 467 => 'Stitched' }, + 'stitchingsoftware' => { 466 => 'StitchingSoftware', 467 => 'StitchingSoftware' }, + 'stopsabovebaseiso' => { 429 => 0x113e, 430 => 0x113e, 431 => 0x111a, 432 => 0x1196, 433 => 0x1172, 434 => 0x102a, 435 => 0x222, 436 => 0x222, 437 => 0x217, 451 => 0xa }, + 'storagemethod' => { 188 => 0x12 }, + 'storebyorientation' => { 280 => '46.3', 282 => '47.3', 283 => '47.3', 292 => '47.3', 293 => '47.3', 295 => 0xd }, + 'storedescription' => { 372 => 'sdes' }, + 'storylineidentifier' => { 490 => 'StorylineIdentifier' }, + 'straightenangle' => { 272 => 0x2fc08431 }, + 'streamready' => { 490 => 'StreamReady' }, + 'streamtype' => { 176 => 'StreamType' }, + 'stretchmode' => { 504 => 'stretchMode' }, + 'studydatetime' => { 457 => 'StudyDateTime' }, + 'studydescription' => { 457 => 'StudyDescription' }, + 'studyid' => { 457 => 'StudyID' }, + 'studyphysician' => { 457 => 'StudyPhysician' }, + 'styleperiod' => { 490 => 'StylePeriod' }, + 'sub-location' => { 131 => 0x5c }, + 'subcommanddialplaybackmode' => { 295 => 0x1cf }, + 'subfiledata' => { 164 => 'data' }, + 'subfiledirectory' => { 164 => '1Directory' }, + 'subfilemimetype' => { 164 => '2MIME' }, + 'subfilename' => { 164 => '1Name' }, + 'subfileresource' => { 164 => 'rsrc' }, + 'subfiletype' => { 119 => 0xfe, 164 => '0Type' }, + 'subject' => { 306 => 'Subject', 371 => 'Subject', 481 => 'subject', 491 => 'Subject', 505 => 'subject' }, + 'subjectarea' => { 119 => 0x9214, 484 => 'SubjectArea' }, + 'subjectcode' => { 489 => 'SubjectCode' }, + 'subjectdetection' => { 229 => 0x23e }, + 'subjectdistance' => { 119 => 0x9206, 140 => 0x3e, 484 => 'SubjectDistance' }, + 'subjectdistancerange' => { 119 => 0xa40c, 484 => 'SubjectDistanceRange' }, + 'subjectlocation' => { 119 => 0xa214, 484 => 'SubjectLocation' }, + 'subjectmotion' => { 282 => '78.2', 283 => '78.2', 293 => '78.2', 295 => 0x103 }, + 'subjectprogram' => { 181 => 0x22 }, + 'subjectreference' => { 131 => 0xc }, + 'sublabels1' => { 488 => [\'TagStructure','TagStructureSubLabels'] }, + 'sublabels2' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabels'] }, + 'sublabels3' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabels'] }, + 'sublabels4' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabels'] }, + 'sublabels5' => { 488 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabels'] }, + 'subseccreatedate' => { 114 => 'Exif-SubSecCreateDate' }, + 'subsecdatetimeoriginal' => { 114 => 'Exif-SubSecDateTimeOriginal' }, + 'subsecmodifydate' => { 114 => 'Exif-SubSecModifyDate' }, + 'subsectime' => { 119 => 0x9290 }, + 'subsectimedigitized' => { 119 => 0x9292 }, + 'subsectimeoriginal' => { 119 => 0x9291 }, + 'subsection1' => { 494 => 'subsection1' }, + 'subsection2' => { 494 => 'subsection2' }, + 'subsection3' => { 494 => 'subsection3' }, + 'subsection4' => { 494 => 'subsection4' }, + 'subselector' => { 280 => '49.1', 282 => '71.1', 283 => '71.1', 293 => '71.1', 295 => 0x8f }, + 'subselectorassignment' => { 280 => '48.1' }, + 'subselectorcenter' => { 282 => '72.1', 283 => '72.1', 293 => '72.1' }, + 'subselectorplusdials' => { 280 => '49.2', 282 => '73.1', 283 => '73.1', 293 => '73.1' }, + 'subtitle' => { 179 => 'WM/SubTitle', 372 => "\xa9st3", 380 => "\xa9snm", 494 => 'subtitle' }, + 'subtitlekeywords' => { 380 => "\xa9snk" }, + 'subversionfilename' => { 488 => [\'SubVersions','SubVersionsFileName'] }, + 'subversionreference' => { 488 => [\'SubVersions','SubVersionsVersRef'] }, + 'subversions' => { 488 => 'SubVersions' }, + 'superimposeddisplay' => { 82 => 0xa, 84 => 0x510, 85 => 0x9, 86 => 0xa, 89 => 0xa, 90 => 0xe }, + 'supermacro' => { 64 => 0x1a }, + 'supplementalcategories' => { 131 => 0x14, 492 => 'SupplementalCategories' }, + 'supplementaltype' => { 133 => 0x37 }, + 'supplementdisplayid' => { 494 => 'supplementDisplayID' }, + 'supplementstartingpage' => { 494 => 'supplementStartingPage' }, + 'supplementtitle' => { 494 => 'supplementTitle' }, + 'supplychainsource' => { 490 => 'SupplyChainSource' }, + 'supplychainsourceidentifier' => { 490 => [\'SupplyChainSource','SupplyChainSourceIdentifier'] }, + 'supplychainsourcename' => { 490 => [\'SupplyChainSource','SupplyChainSourceName'] }, + 'supportsamount' => { 478 => 'SupportsAmount', 480 => 'SupportsAmount' }, + 'supportscolor' => { 478 => 'SupportsColor', 480 => 'SupportsColor' }, + 'supportshighdynamicrange' => { 478 => 'SupportsHighDynamicRange', 480 => 'SupportsHighDynamicRange' }, + 'supportsmonochrome' => { 478 => 'SupportsMonochrome', 480 => 'SupportsMonochrome' }, + 'supportsnormaldynamicrange' => { 478 => 'SupportsNormalDynamicRange', 480 => 'SupportsNormalDynamicRange' }, + 'supportsoutputreferred' => { 478 => 'SupportsOutputReferred', 480 => 'SupportsOutputReferred' }, + 'supportsscenereferred' => { 478 => 'SupportsSceneReferred', 480 => 'SupportsSceneReferred' }, + 'svisosetting' => { 336 => 0x14 }, + 'swatchcoloranta' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsA'] }, + 'swatchcolorantb' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsB'] }, + 'swatchcolorantblack' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsBlack'] }, + 'swatchcolorantblue' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsBlue'] }, + 'swatchcolorantcyan' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsCyan'] }, + 'swatchcolorantgray' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsGray'] }, + 'swatchcolorantgreen' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsGreen'] }, + 'swatchcolorantl' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsL'] }, + 'swatchcolorantmagenta' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsMagenta'] }, + 'swatchcolorantmode' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsMode'] }, + 'swatchcolorantred' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsRed'] }, + 'swatchcolorantswatchname' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsSwatchName'] }, + 'swatchcoloranttint' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsTint'] }, + 'swatchcoloranttype' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsType'] }, + 'swatchcolorantyellow' => { 509 => [\'SwatchGroups','SwatchGroupsColorantsYellow'] }, + 'swatchgroupname' => { 509 => [\'SwatchGroups','SwatchGroupsGroupName'] }, + 'swatchgroups' => { 509 => 'SwatchGroups' }, + 'swatchgroupscolorants' => { 509 => [\'SwatchGroups','SwatchGroupsColorants'] }, + 'swatchgrouptype' => { 509 => [\'SwatchGroups','SwatchGroupsGroupType'] }, + 'sweeppanoramadirection' => { 320 => 0x93, 409 => 0x33 }, + 'sweeppanoramafieldofview' => { 320 => 0x94 }, + 'sweeppanoramasize' => { 409 => 0x32 }, + 'switchtoregisteredafpoint' => { 83 => 0x12, 84 => 0x50a }, + 'symlink' => { 120 => 'SymLink' }, + 'syncreleasemode' => { 282 => '77.1', 283 => '77.1', 293 => '77.1', 295 => 0x41 }, + 'system' => { 364 => 0x204 }, + 'tagged' => { 366 => 0xdd, 367 => 'Tagged', 473 => 'tagged' }, + 'tagslist' => { 483 => 'TagsList' }, + 'tagstructure' => { 488 => 'TagStructure' }, + 'takenumber' => { 504 => 'takeNumber' }, + 'tapename' => { 504 => 'tapeName' }, + 'targetaperture' => { 77 => 0x4 }, + 'targetcompressionratio' => { 95 => 0x1 }, + 'targetdistancesetting' => { 97 => 0x1807 }, + 'targetexposuretime' => { 77 => 0x5 }, + 'targetimagetype' => { 97 => 0x100a }, + 'targetprinter' => { 119 => 0x151 }, + 'taxon' => { 118 => 'Taxon' }, + 'taxonacceptednameusage' => { 118 => [\'Taxon','TaxonAcceptedNameUsage'] }, + 'taxonacceptednameusageid' => { 118 => [\'Taxon','TaxonAcceptedNameUsageID'] }, + 'taxonclass' => { 118 => [\'Taxon','TaxonClass'] }, + 'taxonconceptid' => { 118 => [\'Taxon','TaxonTaxonConceptID'] }, + 'taxoncultivarepithet' => { 118 => [\'Taxon','TaxonCultivarEpithet'] }, + 'taxonfamily' => { 118 => [\'Taxon','TaxonFamily'] }, + 'taxongenus' => { 118 => [\'Taxon','TaxonGenus'] }, + 'taxonhigherclassification' => { 118 => [\'Taxon','TaxonHigherClassification'] }, + 'taxonid' => { 118 => [\'Taxon','TaxonTaxonID'] }, + 'taxoninfraspecificepithet' => { 118 => [\'Taxon','TaxonInfraspecificEpithet'] }, + 'taxonkingdom' => { 118 => [\'Taxon','TaxonKingdom'] }, + 'taxonnameaccordingto' => { 118 => [\'Taxon','TaxonNameAccordingTo'] }, + 'taxonnameaccordingtoid' => { 118 => [\'Taxon','TaxonNameAccordingToID'] }, + 'taxonnamepublishedin' => { 118 => [\'Taxon','TaxonNamePublishedIn'] }, + 'taxonnamepublishedinid' => { 118 => [\'Taxon','TaxonNamePublishedInID'] }, + 'taxonnamepublishedinyear' => { 118 => [\'Taxon','TaxonNamePublishedInYear'] }, + 'taxonnomenclaturalcode' => { 118 => [\'Taxon','TaxonNomenclaturalCode'] }, + 'taxonnomenclaturalstatus' => { 118 => [\'Taxon','TaxonNomenclaturalStatus'] }, + 'taxonorder' => { 118 => [\'Taxon','TaxonOrder'] }, + 'taxonoriginalnameusage' => { 118 => [\'Taxon','TaxonOriginalNameUsage'] }, + 'taxonoriginalnameusageid' => { 118 => [\'Taxon','TaxonOriginalNameUsageID'] }, + 'taxonparentnameusage' => { 118 => [\'Taxon','TaxonParentNameUsage'] }, + 'taxonparentnameusageid' => { 118 => [\'Taxon','TaxonParentNameUsageID'] }, + 'taxonphylum' => { 118 => [\'Taxon','TaxonPhylum'] }, + 'taxonrank' => { 118 => [\'Taxon','TaxonTaxonRank'] }, + 'taxonremarks' => { 118 => [\'Taxon','TaxonTaxonRemarks'] }, + 'taxonscientificname' => { 118 => [\'Taxon','TaxonScientificName'] }, + 'taxonscientificnameauthorship' => { 118 => [\'Taxon','TaxonScientificNameAuthorship'] }, + 'taxonscientificnameid' => { 118 => [\'Taxon','TaxonScientificNameID'] }, + 'taxonspecificepithet' => { 118 => [\'Taxon','TaxonSpecificEpithet'] }, + 'taxonsubgenus' => { 118 => [\'Taxon','TaxonSubgenus'] }, + 'taxontaxonomicstatus' => { 118 => [\'Taxon','TaxonTaxonomicStatus'] }, + 'taxonverbatimtaxonrank' => { 118 => [\'Taxon','TaxonVerbatimTaxonRank'] }, + 'taxonvernacularname' => { 118 => [\'Taxon','TaxonVernacularName'] }, + 'tda1bandwidth' => { 138 => 0x196f }, + 'tda1edgepolarity' => { 138 => 0x1971 }, + 'tda1gain' => { 138 => 0x1970 }, + 'tda1offset' => { 138 => 0x196e }, + 'tda2bandwidth' => { 138 => 0x1979 }, + 'tda2edgepolarity' => { 138 => 0x197b }, + 'tda2gain' => { 138 => 0x197a }, + 'tda2offset' => { 138 => 0x1978 }, + 'tda3bandwidth' => { 138 => 0x1983 }, + 'tda3edgepolarity' => { 138 => 0x1985 }, + 'tda3gain' => { 138 => 0x1984 }, + 'tda3offset' => { 138 => 0x1982 }, + 'tda4bandwidth' => { 138 => 0x198d }, + 'tda4edgepolarity' => { 138 => 0x198f }, + 'tda4gain' => { 138 => 0x198e }, + 'tda4offset' => { 138 => 0x198c }, + 'teaser' => { 494 => 'teaser' }, + 'teleconverter' => { 186 => 0x105, 420 => 0x105 }, + 'tempampgainx100' => { 138 => 0x1914 }, + 'tempo' => { 504 => 'tempo' }, + 'temporalcoverage' => { 490 => 'TemporalCoverage' }, + 'temporalcoveragefrom' => { 490 => [\'TemporalCoverage','TemporalCoverageTempCoverageFrom'] }, + 'temporalcoverageto' => { 490 => [\'TemporalCoverage','TemporalCoverageTempCoverageTo'] }, + 'termsandconditionstext' => { 307 => 'TermsAndConditionsText' }, + 'termsandconditionsurl' => { 307 => 'TermsAndConditionsURL' }, + 'testname' => { 120 => 'TestName' }, + 'textencoding' => { 225 => 0x4 }, + 'textlayername' => { 492 => [\'TextLayers','TextLayersLayerName'] }, + 'textlayers' => { 492 => 'TextLayers' }, + 'textlayertext' => { 492 => [\'TextLayers','TextLayersLayerText'] }, + 'textstamp' => { 320 => [0x8008,0x8009,0x3b,0x3e] }, + 'texture' => { 478 => 'Texture', 480 => 'Texture' }, + 'three-dtrackingfacedetection' => { 282 => '1.4', 283 => '1.4', 293 => '1.4' }, + 'three-dtrackingwatcharea' => { 282 => '78.1', 283 => '78.1', 293 => '78.1' }, + 'thresholding' => { 119 => 0x107 }, + 'thumbnailfilename' => { 97 => 0x817 }, + 'thumbnailformat' => { 502 => [\'Thumbnails','ThumbnailsFormat'] }, + 'thumbnailheight' => { 142 => 0xfa55, 502 => [\'Thumbnails','ThumbnailsHeight'] }, + 'thumbnailimage' => { 6 => 'CNDA', 97 => 0x2008, 114 => 'Exif-ThumbnailImage', 122 => 0x3, 167 => 'data', 302 => 0x100, 380 => 'thmb', 502 => [\'Thumbnails','ThumbnailsImage'] }, + 'thumbnailimagename' => { 167 => '1Name' }, + 'thumbnailimagesize' => { 167 => 'ImageSize' }, + 'thumbnailimagetype' => { 167 => '0Type' }, + 'thumbnailimagevalidarea' => { 64 => 0x13 }, + 'thumbnaillength' => { 119 => 0x202 }, + 'thumbnailoffset' => { 119 => 0x201 }, + 'thumbnailpng' => { 380 => 'thmb' }, + 'thumbnails' => { 502 => 'Thumbnails' }, + 'thumbnailwidth' => { 142 => 0xfa54, 502 => [\'Thumbnails','ThumbnailsWidth'] }, + 'ticker' => { 494 => 'ticker' }, + 'tiffhandling' => { 478 => 'TIFFHandling', 480 => 'TIFFHandling' }, + 'tiffmeteringimage' => { 187 => 0x104c, 418 => 0x1110 }, + 'tilelength' => { 119 => 0x143 }, + 'tilewidth' => { 119 => 0x142 }, + 'time' => { 138 => 0x401, 355 => 0x7 }, + 'timecodes' => { 119 => 0xc763 }, + 'timecreated' => { 131 => 0x3c, 140 => 0x14, 149 => 0x10, 367 => 'TimeCreated' }, + 'timelapseshotnumber' => { 323 => 0x10 }, + 'timeperiod' => { 494 => 'timePeriod' }, + 'timerfunctionbutton' => { 281 => '5.2', 284 => '12.1', 285 => '13.1' }, + 'timerlength' => { 84 => 0x80c }, + 'timerrecording' => { 320 => 0x96 }, + 'timescaleparams' => { 504 => 'timeScaleParams' }, + 'timescaleparamsframeoverlappingpercentage' => { 504 => [\'timeScaleParams','timeScaleParamsFrameOverlappingPercentage'] }, + 'timescaleparamsframesize' => { 504 => [\'timeScaleParams','timeScaleParamsFrameSize'] }, + 'timescaleparamsquality' => { 504 => [\'timeScaleParams','timeScaleParamsQuality'] }, + 'timesent' => { 132 => 0x50 }, + 'timeshot' => { 468 => 'TimeShot' }, + 'timesignature' => { 504 => 'timeSignature' }, + 'timesincepoweron' => { 320 => 0x29 }, + 'timestamp' => { 11 => 0x45e, 19 => 0x11c, 296 => 0x8, 310 => 'TimeStamp', 320 => 0xaf, 467 => 'Timestamp', 474 => 'Timestamp', 488 => 'TimeStamp' }, + 'timestamp1' => { 11 => 0x45a }, + 'timezone' => { 78 => 0x1, 229 => 0x594, 264 => 0x0, 390 => 0xa }, + 'timezonecity' => { 78 => 0x2 }, + 'timezonecode' => { 100 => 0x1 }, + 'timezoneinfo' => { 100 => 0x2 }, + 'timezoneoffset' => { 119 => 0x882a }, + 'tint' => { 374 => 'player.movie.visual.tint', 478 => 'Tint', 480 => 'Tint' }, + 'title' => { 157 => 'Title', 306 => 'Title', 310 => 'Title', 320 => 0x65, 371 => 'Title', 372 => ['titl',"\xa9nam"], 374 => 'title', 380 => ['titl',"\xa9nam"], 481 => 'title', 491 => 'Title', 502 => 'Title' }, + 'togglestyleamount' => { 478 => 'ToggleStyleAmount', 480 => 'ToggleStyleAmount' }, + 'togglestyledigest' => { 478 => 'ToggleStyleDigest', 480 => 'ToggleStyleDigest' }, + 'tonecomp' => { 226 => 0x81 }, + 'tonecurve' => { 74 => 0x1, 355 => 0x402, 478 => 'ToneCurve', 480 => 'ToneCurve' }, + 'tonecurveactive' => { 108 => 0x110 }, + 'tonecurveadobergb' => { 394 => 0xa043 }, + 'tonecurveadobergbdefault' => { 394 => 0xa041 }, + 'tonecurveblue' => { 478 => 'ToneCurveBlue', 480 => 'ToneCurveBlue' }, + 'tonecurvebluex' => { 455 => 0x9003 }, + 'tonecurvebluey' => { 455 => 0x9007 }, + 'tonecurvebrightness' => { 103 => 0x20410 }, + 'tonecurvebrightnessx' => { 455 => 0x9000 }, + 'tonecurvebrightnessy' => { 455 => 0x9004 }, + 'tonecurvecolorspace' => { 107 => 0x0 }, + 'tonecurvecontrast' => { 103 => 0x20411 }, + 'tonecurvegreen' => { 478 => 'ToneCurveGreen', 480 => 'ToneCurveGreen' }, + 'tonecurvegreenx' => { 455 => 0x9002 }, + 'tonecurvegreeny' => { 455 => 0x9006 }, + 'tonecurveinputrange' => { 107 => 0x3 }, + 'tonecurveinterpolation' => { 108 => 0x159 }, + 'tonecurvemode' => { 108 => 0x113 }, + 'tonecurvename' => { 478 => 'ToneCurveName', 480 => 'ToneCurveName' }, + 'tonecurvename2012' => { 478 => 'ToneCurveName2012', 480 => 'ToneCurveName2012' }, + 'tonecurveoriginal' => { 103 => '0x20400.1' }, + 'tonecurveoutputrange' => { 107 => 0x5 }, + 'tonecurveprofilename' => { 138 => 0x1391 }, + 'tonecurveproperty' => { 108 => 0x3c }, + 'tonecurvepv2012' => { 478 => 'ToneCurvePV2012', 480 => 'ToneCurvePV2012' }, + 'tonecurvepv2012blue' => { 478 => 'ToneCurvePV2012Blue', 480 => 'ToneCurvePV2012Blue' }, + 'tonecurvepv2012green' => { 478 => 'ToneCurvePV2012Green', 480 => 'ToneCurvePV2012Green' }, + 'tonecurvepv2012red' => { 478 => 'ToneCurvePV2012Red', 480 => 'ToneCurvePV2012Red' }, + 'tonecurvered' => { 478 => 'ToneCurveRed', 480 => 'ToneCurveRed' }, + 'tonecurveredx' => { 455 => 0x9001 }, + 'tonecurveredy' => { 455 => 0x9005 }, + 'tonecurves' => { 355 => 0x403 }, + 'tonecurveshape' => { 107 => 0x1 }, + 'tonecurvesrgb' => { 394 => 0xa042 }, + 'tonecurvesrgbdefault' => { 394 => 0xa040 }, + 'tonecurvex' => { 107 => 0xa }, + 'tonecurvey' => { 107 => 0xb }, + 'tonelevel' => { 297 => 0x52e }, + 'tonemapstrength' => { 478 => 'ToneMapStrength', 480 => 'ToneMapStrength' }, + 'toningeffect' => { 57 => 0xf, 226 => 0xb3, 231 => 0x38, 232 => 0x40, 233 => 0x48, 387 => 0x1015 }, + 'toningeffectauto' => { 71 => 0xa4 }, + 'toningeffectfaithful' => { 70 => 0x74, 71 => 0x74 }, + 'toningeffectlandscape' => { 70 => 0x44, 71 => 0x44 }, + 'toningeffectmonochrome' => { 19 => 0x108, 70 => 0x8c, 71 => 0x8c }, + 'toningeffectneutral' => { 70 => 0x5c, 71 => 0x5c }, + 'toningeffectportrait' => { 70 => 0x2c, 71 => 0x2c }, + 'toningeffectstandard' => { 70 => 0x14, 71 => 0x14 }, + 'toningeffectuserdef1' => { 70 => 0xa4, 71 => 0xbc }, + 'toningeffectuserdef2' => { 70 => 0xbc, 71 => 0xd4 }, + 'toningeffectuserdef3' => { 70 => 0xd4, 71 => 0xec }, + 'toningsaturation' => { 231 => 0x39, 232 => 0x41, 233 => 0x49 }, + 'totalzoom' => { 140 => 0x62 }, + 'touchae' => { 320 => 0xab }, + 'track' => { 372 => "\xa9trk", 380 => "\xa9trk" }, + 'trackcreatedate' => { 379 => 0x1 }, + 'trackmodifydate' => { 379 => 0x2 }, + 'tracknumber' => { 372 => 'trkn', 504 => 'trackNumber' }, + 'tracks' => { 504 => 'Tracks' }, + 'tracksframerate' => { 504 => [\'Tracks','TracksFrameRate'] }, + 'tracksmarkers' => { 504 => [\'Tracks','TracksMarkers'] }, + 'tracksmarkerscomment' => { 504 => [\'Tracks','TracksMarkersComment'] }, + 'tracksmarkerscuepointparams' => { 504 => [\'Tracks','TracksMarkersCuePointParams'] }, + 'tracksmarkerscuepointparamskey' => { 504 => [\'Tracks','TracksMarkersCuePointParamsKey'] }, + 'tracksmarkerscuepointparamsvalue' => { 504 => [\'Tracks','TracksMarkersCuePointParamsValue'] }, + 'tracksmarkerscuepointtype' => { 504 => [\'Tracks','TracksMarkersCuePointType'] }, + 'tracksmarkersduration' => { 504 => [\'Tracks','TracksMarkersDuration'] }, + 'tracksmarkerslocation' => { 504 => [\'Tracks','TracksMarkersLocation'] }, + 'tracksmarkersname' => { 504 => [\'Tracks','TracksMarkersName'] }, + 'tracksmarkersprobability' => { 504 => [\'Tracks','TracksMarkersProbability'] }, + 'tracksmarkersspeaker' => { 504 => [\'Tracks','TracksMarkersSpeaker'] }, + 'tracksmarkersstarttime' => { 504 => [\'Tracks','TracksMarkersStartTime'] }, + 'tracksmarkerstarget' => { 504 => [\'Tracks','TracksMarkersTarget'] }, + 'tracksmarkerstype' => { 504 => [\'Tracks','TracksMarkersType'] }, + 'trackstrackname' => { 504 => [\'Tracks','TracksTrackName'] }, + 'trackstracktype' => { 504 => [\'Tracks','TracksTrackType'] }, + 'tracktype' => { 380 => 'kgtt' }, + 'trailer' => { 120 => 'Trailer' }, + 'trailersignature' => { 164 => 'zmie' }, + 'transcript' => { 490 => 'Transcript' }, + 'transcriptlink' => { 490 => 'TranscriptLink' }, + 'transcriptlinklink' => { 490 => [\'TranscriptLink','TranscriptLinkLink'] }, + 'transcriptlinklinkqualifier' => { 490 => [\'TranscriptLink','TranscriptLinkLinkQualifier'] }, + 'transferfunction' => { 119 => 0x12d, 500 => 'TransferFunction' }, + 'transfertimenormal' => { 138 => 0x1888 }, + 'transfertimetest' => { 138 => 0x1889 }, + 'transform' => { 320 => [0x8012,0x59] }, + 'transmissionreference' => { 492 => 'TransmissionReference' }, + 'trapped' => { 306 => 'Trapped', 491 => 'Trapped' }, + 'trashbuttonfunction' => { 84 => 0x710 }, + 'travelday' => { 320 => 0x36 }, + 'treble' => { 374 => 'player.movie.audio.treble' }, + 'triggermode' => { 381 => 0x6, 382 => 0x34, 383 => 0x34 }, + 'tstop' => { 119 => 0xc772 }, + 'ttl_da_adown' => { 343 => 0x5 }, + 'ttl_da_aup' => { 343 => 0x4 }, + 'ttl_da_bdown' => { 343 => 0x7 }, + 'ttl_da_bup' => { 343 => 0x6 }, + 'tungstenawb' => { 333 => 0x1 }, + 'tvepisode' => { 372 => 'tves' }, + 'tvepisodeid' => { 372 => 'tven' }, + 'tvexposuretimesetting' => { 336 => 0x12 }, + 'tvnetworkname' => { 372 => 'tvnn' }, + 'tvseason' => { 372 => 'tvsn' }, + 'tvshow' => { 372 => 'tvsh' }, + 'type' => { 481 => 'type', 499 => 'type' }, + 'typestatus' => { 118 => [\'Identification','IdentificationTypeStatus'] }, + 'uniquecameramodel' => { 119 => 0xc614 }, + 'uniquedocumentid' => { 131 => 0xbb }, + 'uniquematrixauto' => { 138 => 0x7e9 }, + 'uniquematrixcustom' => { 138 => 0x7e8 }, + 'uniquematrixdaylight' => { 138 => 0x7e4 }, + 'uniquematrixflash' => { 138 => 0x7e7 }, + 'uniquematrixfluorescent' => { 138 => 0x7e6 }, + 'uniquematrixtungsten' => { 138 => 0x7e5 }, + 'uniqueobjectname' => { 132 => 0x64 }, + 'units' => { 463 => 'Units' }, + 'unknown_aacr' => { 372 => 'AACR' }, + 'unknown_cdek' => { 372 => 'CDEK' }, + 'unknown_cdet' => { 372 => 'CDET' }, + 'unknownblock' => { 355 => 0x405 }, + 'unknownblock1' => { 301 => 0x635 }, + 'unknownblock2' => { 301 => 0x636 }, + 'unknownblock3' => { 301 => 0x1103 }, + 'unknownblock4' => { 301 => 0x1104 }, + 'unknowncontrast' => { 109 => 0x45 }, + 'unknowndate' => { 364 => 0x212 }, + 'unknownev' => { 138 => 0x1 }, + 'unknownlinear' => { 109 => 0x46 }, + 'unknownnumber' => { 97 => 0x180b }, + 'unknownoutputhighlightpoint' => { 109 => 0x4a }, + 'unknownoutputshadowpoint' => { 109 => 0x4b }, + 'unknownrawhighlight' => { 109 => 0x7b }, + 'unknownrawhighlightpoint' => { 109 => 0x48 }, + 'unknownrawshadow' => { 109 => 0x84 }, + 'unknownrawshadowpoint' => { 109 => 0x49 }, + 'unknownsharpness' => { 109 => 0x47 }, + 'unknowntags' => { 380 => 'TAGS' }, + 'unknowntemperature' => { 121 => 0x4 }, + 'unknownthumbnail' => { 380 => 'thmb' }, + 'unsharp1color' => { 277 => 0x13 }, + 'unsharp1halowidth' => { 277 => 0x19 }, + 'unsharp1intensity' => { 277 => 0x17 }, + 'unsharp1threshold' => { 277 => 0x1b }, + 'unsharp2color' => { 277 => 0x2e }, + 'unsharp2halowidth' => { 277 => 0x34 }, + 'unsharp2intensity' => { 277 => 0x32 }, + 'unsharp2threshold' => { 277 => 0x36 }, + 'unsharp3color' => { 277 => 0x49 }, + 'unsharp3halowidth' => { 277 => 0x4f }, + 'unsharp3intensity' => { 277 => 0x4d }, + 'unsharp3threshold' => { 277 => 0x51 }, + 'unsharp4color' => { 277 => 0x64 }, + 'unsharp4halowidth' => { 277 => 0x6a }, + 'unsharp4intensity' => { 277 => 0x68 }, + 'unsharp4threshold' => { 277 => 0x6c }, + 'unsharpcount' => { 277 => 0x0 }, + 'unsharpmask' => { 109 => 0x90, 272 => 0x76a43200 }, + 'unsharpmaskfineness' => { 103 => 0x20309 }, + 'unsharpmaskstrength' => { 103 => 0x20308 }, + 'unsharpmaskthreshold' => { 103 => 0x2030a }, + 'uprightcentermode' => { 478 => 'UprightCenterMode', 480 => 'UprightCenterMode' }, + 'uprightcenternormx' => { 478 => 'UprightCenterNormX', 480 => 'UprightCenterNormX' }, + 'uprightcenternormy' => { 478 => 'UprightCenterNormY', 480 => 'UprightCenterNormY' }, + 'uprightdependentdigest' => { 478 => 'UprightDependentDigest', 480 => 'UprightDependentDigest' }, + 'uprightfocallength35mm' => { 478 => 'UprightFocalLength35mm', 480 => 'UprightFocalLength35mm' }, + 'uprightfocalmode' => { 478 => 'UprightFocalMode', 480 => 'UprightFocalMode' }, + 'uprightfoursegmentscount' => { 478 => 'UprightFourSegmentsCount', 480 => 'UprightFourSegmentsCount' }, + 'uprightpreview' => { 478 => 'UprightPreview', 480 => 'UprightPreview' }, + 'uprighttransform_0' => { 478 => 'UprightTransform_0', 480 => 'UprightTransform_0' }, + 'uprighttransform_1' => { 478 => 'UprightTransform_1', 480 => 'UprightTransform_1' }, + 'uprighttransform_2' => { 478 => 'UprightTransform_2', 480 => 'UprightTransform_2' }, + 'uprighttransform_3' => { 478 => 'UprightTransform_3', 480 => 'UprightTransform_3' }, + 'uprighttransform_4' => { 478 => 'UprightTransform_4', 480 => 'UprightTransform_4' }, + 'uprighttransform_5' => { 478 => 'UprightTransform_5', 480 => 'UprightTransform_5' }, + 'uprighttransformcount' => { 478 => 'UprightTransformCount', 480 => 'UprightTransformCount' }, + 'uprightversion' => { 478 => 'UprightVersion', 480 => 'UprightVersion' }, + 'urgency' => { 131 => 0xa, 492 => 'Urgency' }, + 'url' => { 157 => 'URL', 310 => 'URL', 369 => 0x40b, 494 => 'url' }, + 'url_list' => { 369 => 0x41e }, + 'urla-platform' => { 494 => [\'url','urlA-platform'] }, + 'urlurl' => { 494 => [\'url','urlUrl'] }, + 'usablemeteringmodes' => { 84 => 0x10a }, + 'usableshootingmodes' => { 84 => 0x109 }, + 'usage' => { 495 => 'usage' }, + 'usageterms' => { 508 => 'UsageTerms' }, + 'usbpowerdelivery' => { 229 => 0x664 }, + 'usedialwithouthold' => { 295 => 0xbf }, + 'useguidelines' => { 476 => 'useGuidelines' }, + 'usepanoramaviewer' => { 466 => 'UsePanoramaViewer' }, + 'usercollection' => { 374 => 'collection.user' }, + 'usercomment' => { 97 => 0x805, 119 => 0x9286, 484 => 'UserComment' }, + 'userdef1picturestyle' => { 19 => 0x10c, 70 => 0xd8, 71 => 0xf0 }, + 'userdef2picturestyle' => { 19 => 0x10e, 70 => 0xda, 71 => 0xf2 }, + 'userdef3picturestyle' => { 19 => 0x110, 70 => 0xdc, 71 => 0xf4 }, + 'userfields' => { 471 => 'UserFields' }, + 'userlabel' => { 381 => 0x2b, 382 => 0x5a, 383 => 0x68 }, + 'userprofile' => { 315 => 0x302, 319 => 0x34c, 322 => 0x3038 }, + 'userrating' => { 374 => 'rating.user', 380 => 'urat' }, + 'usmlenselectronicmf' => { 2 => 0x7, 83 => 0x7, 84 => 0x501 }, + 'uspsnumber' => { 494 => 'uspsNumber' }, + 'utmeasting' => { 168 => 'Easting' }, + 'utmmapdatum' => { 168 => 'Datum' }, + 'utmnorthing' => { 168 => 'Northing' }, + 'utmzone' => { 168 => 'Zone' }, + 'uuid' => { 478 => 'UUID', 480 => 'UUID' }, + 'uv-irfiltercorrection' => { 315 => 0x325 }, + 'validbits' => { 301 => 0x611, 302 => 0x102c }, + 'validpixeldepth' => { 305 => 0x611 }, + 'variablelowpassfilter' => { 420 => 0x2028 }, + 'variousmodes' => { 140 => 0x26 }, + 'variousmodes2' => { 140 => 0x3a }, + 'variprogram' => { 226 => 0xab }, + 'varraydacnominalvalues' => { 138 => 0x191e }, + 'vendor' => { 380 => 'vndr' }, + 'vendorinfo' => { 458 => 'VendorInfo' }, + 'vendorinfomanufacturer' => { 458 => [\'VendorInfo','VendorInfoManufacturer'] }, + 'vendorinfomodel' => { 458 => [\'VendorInfo','VendorInfoModel'] }, + 'vendorinfonotes' => { 458 => [\'VendorInfo','VendorInfoNotes'] }, + 'verbatimidentification' => { 118 => [\'Identification','IdentificationVerbatimIdentification'] }, + 'version' => { 127 => 0x0, 371 => 'Version', 374 => 'version', 478 => 'Version', 480 => 'Version' }, + 'versioncreatedate' => { 455 => 0xd100 }, + 'versionid' => { 505 => 'VersionID' }, + 'versionidentifier' => { 494 => 'versionIdentifier' }, + 'versionmodifydate' => { 455 => 0xd101 }, + 'versions' => { 505 => 'Versions' }, + 'versionscomments' => { 505 => [\'Versions','VersionsComments'] }, + 'versionsevent' => { 505 => [\'Versions','VersionsEvent'] }, + 'versionseventaction' => { 505 => [\'Versions','VersionsEventAction'] }, + 'versionseventchanged' => { 505 => [\'Versions','VersionsEventChanged'] }, + 'versionseventinstanceid' => { 505 => [\'Versions','VersionsEventInstanceID'] }, + 'versionseventparameters' => { 505 => [\'Versions','VersionsEventParameters'] }, + 'versionseventsoftwareagent' => { 505 => [\'Versions','VersionsEventSoftwareAgent'] }, + 'versionseventwhen' => { 505 => [\'Versions','VersionsEventWhen'] }, + 'versionsmodifier' => { 505 => [\'Versions','VersionsModifier'] }, + 'versionsmodifydate' => { 505 => [\'Versions','VersionsModifyDate'] }, + 'versionsversion' => { 505 => [\'Versions','VersionsVersion'] }, + 'verticalafonbutton' => { 279 => '3.2', 280 => '47.2', 282 => '79.1', 295 => 0x11d }, + 'verticalclockoverlaps' => { 138 => 0x412 }, + 'verticalfuncbutton' => { 280 => '42.2', 282 => '67.1', 295 => 0x115 }, + 'verticalfuncbuttonplaybackmode' => { 295 => 0x1b7 }, + 'verticalfuncbuttonplusdials' => { 280 => '43.1' }, + 'verticalfuncplusdials' => { 282 => '68.1' }, + 'verticalmovieafonbutton' => { 295 => 0x1f9 }, + 'verticalmoviefuncbutton' => { 295 => 0x1e1 }, + 'verticalmultiselector' => { 280 => '42.1', 282 => '66.1', 283 => '66.1', 293 => '66.1', 295 => 0x18f }, + 'verticalmultiselectorplaybackmode' => { 295 => 0x125 }, + 'vfdisplayillumination' => { 2 => 0x11, 84 => [0x510,0x51d] }, + 'vibrance' => { 472 => 'Vibrance', 478 => 'Vibrance', 480 => 'Vibrance' }, + 'vibrationreduction' => { 238 => [0x75,0x82,0x1ae], 246 => '586.1', 255 => '590.2', 263 => 0x4 }, + 'videoalphamode' => { 504 => 'videoAlphaMode' }, + 'videoalphapremultiplecolor' => { 504 => 'videoAlphaPremultipleColor' }, + 'videoalphapremultiplecolora' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorA'] }, + 'videoalphapremultiplecolorb' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorB'] }, + 'videoalphapremultiplecolorblack' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorBlack'] }, + 'videoalphapremultiplecolorblue' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorBlue'] }, + 'videoalphapremultiplecolorcyan' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorCyan'] }, + 'videoalphapremultiplecolorgray' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorGray'] }, + 'videoalphapremultiplecolorgreen' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorGreen'] }, + 'videoalphapremultiplecolorl' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorL'] }, + 'videoalphapremultiplecolormagenta' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorMagenta'] }, + 'videoalphapremultiplecolormode' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorMode'] }, + 'videoalphapremultiplecolorred' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorRed'] }, + 'videoalphapremultiplecolorswatchname' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorSwatchName'] }, + 'videoalphapremultiplecolortint' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorTint'] }, + 'videoalphapremultiplecolortype' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorType'] }, + 'videoalphapremultiplecoloryellow' => { 504 => [\'videoAlphaPremultipleColor','videoAlphaPremultipleColorYellow'] }, + 'videoalphaunityistransparent' => { 504 => 'videoAlphaUnityIsTransparent' }, + 'videobitrate' => { 490 => 'videoBitRate' }, + 'videobitratemode' => { 490 => 'videoBitRateMode' }, + 'videoburstmode' => { 320 => 0xbb }, + 'videoburstresolution' => { 320 => 0xb3 }, + 'videocodec' => { 67 => 0x74 }, + 'videocolorspace' => { 504 => 'videoColorSpace' }, + 'videocompression' => { 127 => 0x3806 }, + 'videocompressor' => { 504 => 'videoCompressor' }, + 'videodisplayaspectratio' => { 490 => 'videoDisplayAspectRatio' }, + 'videoencodingprofile' => { 490 => 'videoEncodingProfile' }, + 'videofieldorder' => { 504 => 'videoFieldOrder' }, + 'videoframerate' => { 320 => 0x27, 504 => 'videoFrameRate' }, + 'videoframesize' => { 504 => 'videoFrameSize' }, + 'videoframesizeh' => { 504 => [\'videoFrameSize','videoFrameSizeH'] }, + 'videoframesizeunit' => { 504 => [\'videoFrameSize','videoFrameSizeUnit'] }, + 'videoframesizew' => { 504 => [\'videoFrameSize','videoFrameSizeW'] }, + 'videomoddate' => { 504 => 'videoModDate' }, + 'videopixelaspectratio' => { 504 => 'videoPixelAspectRatio' }, + 'videopixeldepth' => { 504 => 'videoPixelDepth' }, + 'videopreburst' => { 320 => 0xc1 }, + 'videoquality' => { 113 => 0x4003 }, + 'videorecordingmode' => { 127 => 0x3803 }, + 'videoshottype' => { 490 => 'VideoShotType' }, + 'videoshottypeidentifier' => { 490 => [\'VideoShotType','VideoShotTypeIdentifier'] }, + 'videoshottypename' => { 490 => [\'VideoShotType','VideoShotTypeName'] }, + 'videostreamscount' => { 490 => 'videoStreamsCount' }, + 'viewfinder' => { 364 => 0x455 }, + 'viewfinderdisplay' => { 279 => '12.4', 280 => '6.3' }, + 'viewfinderwarning' => { 279 => '13.4', 289 => '3.5', 290 => '6.2', 294 => '4.4' }, + 'viewfinderwarnings' => { 84 => 0x40a }, + 'viewinfoduringexposure' => { 84 => 0x407 }, + 'viewingmode' => { 409 => 0x2f, 425 => 0x18 }, + 'viewingmode2' => { 409 => [0x85,0x285] }, + 'viewpoint' => { 493 => 'viewpoint' }, + 'vignetteamount' => { 478 => 'VignetteAmount', 480 => 'VignetteAmount' }, + 'vignettecontrol' => { 226 => 0x2a, 272 => 0x76a43205 }, + 'vignettecontrolintensity' => { 272 => 0xac6bd5c0 }, + 'vignettecorrectionalreadyapplied' => { 475 => 'VignetteCorrectionAlreadyApplied' }, + 'vignettemidpoint' => { 478 => 'VignetteMidpoint', 480 => 'VignetteMidpoint' }, + 'vignetting' => { 387 => 0x1011, 394 => 0xa052 }, + 'vignettingcorrection' => { 119 => 0x7031, 394 => 0xa053, 420 => 0x2011 }, + 'vignettingcorrparams' => { 119 => 0x7032, 450 => 0x64a, 451 => [0x34a,0x350,0x35c,0x368] }, + 'vignettingsetting' => { 394 => 0xa054 }, + 'virtualhorizonstyle' => { 295 => 0x167 }, + 'visualcolor' => { 490 => 'VisualColour' }, + 'visualtechnique' => { 493 => 'visualTechnique' }, + 'voicememo' => { 396 => 0x216 }, + 'volume' => { 494 => 'volume' }, + 'vr_0x66' => { 238 => 0x66 }, + 'vrdoffset' => { 64 => 0xd0 }, + 'vrmode' => { 229 => 0x212, 263 => 0x6 }, + 'waterdepth' => { 119 => 0x9403, 485 => 'WaterDepth' }, + 'wb_bluelevel3500k' => { 187 => 0x19a }, + 'wb_bluelevel6500k' => { 187 => 0x18a }, + 'wb_bluelevelcustom' => { 187 => 0x18e }, + 'wb_bluelevelscloudy' => { 187 => 0x106 }, + 'wb_bluelevelsdaylight' => { 187 => 0xea }, + 'wb_bluelevelsflash' => { 187 => 0x122 }, + 'wb_bluelevelsfluorescent' => { 187 => [0x40a,0x15a] }, + 'wb_bluelevelskelvin' => { 187 => 0x254 }, + 'wb_bluelevelsshade' => { 187 => 0x176 }, + 'wb_bluelevelstungsten' => { 187 => 0xce }, + 'wb_gbrglevels' => { 187 => 0xae, 190 => 0x4 }, + 'wb_glevel' => { 301 => 0x11f }, + 'wb_glevel3000k' => { 301 => 0x113 }, + 'wb_glevel3300k' => { 301 => 0x114 }, + 'wb_glevel3600k' => { 301 => 0x115 }, + 'wb_glevel3900k' => { 301 => 0x116 }, + 'wb_glevel4000k' => { 301 => 0x117 }, + 'wb_glevel4300k' => { 301 => 0x118 }, + 'wb_glevel4500k' => { 301 => 0x119 }, + 'wb_glevel4800k' => { 301 => 0x11a }, + 'wb_glevel5300k' => { 301 => 0x11b }, + 'wb_glevel6000k' => { 301 => 0x11c }, + 'wb_glevel6600k' => { 301 => 0x11d }, + 'wb_glevel7500k' => { 301 => 0x11e }, + 'wb_grbglevels' => { 201 => 0x0, 427 => 0x7303 }, + 'wb_grbglevelsauto' => { 81 => 0x2, 427 => 0x7302 }, + 'wb_grbglevelscloudy' => { 81 => 0x12 }, + 'wb_grbglevelscustom1' => { 81 => 0x42 }, + 'wb_grbglevelscustom2' => { 81 => 0x4a }, + 'wb_grbglevelsdaylight' => { 81 => 0xa }, + 'wb_grbglevelsflash' => { 81 => 0x32 }, + 'wb_grbglevelsfluorescent' => { 81 => 0x22 }, + 'wb_grbglevelsfluorhigh' => { 81 => 0x2a }, + 'wb_grbglevelstungsten' => { 81 => 0x1a }, + 'wb_grbglevelsunderwater' => { 81 => 0x3a }, + 'wb_rbgglevels' => { 198 => 0x0 }, + 'wb_rblevels' => { 202 => 0x270, 226 => 0xc, 301 => 0x100 }, + 'wb_rblevels1' => { 326 => 0x2 }, + 'wb_rblevels2' => { 326 => 0x5 }, + 'wb_rblevels3' => { 326 => 0x8 }, + 'wb_rblevels3000k' => { 301 => 0x102 }, + 'wb_rblevels3300k' => { 301 => 0x103 }, + 'wb_rblevels3500k' => { 187 => 0x430 }, + 'wb_rblevels3600k' => { 301 => 0x104 }, + 'wb_rblevels3900k' => { 301 => 0x105 }, + 'wb_rblevels4' => { 326 => 0xb }, + 'wb_rblevels4000k' => { 301 => 0x106 }, + 'wb_rblevels4300k' => { 301 => 0x107 }, + 'wb_rblevels4500k' => { 301 => 0x108 }, + 'wb_rblevels4800k' => { 301 => 0x109 }, + 'wb_rblevels5' => { 326 => 0xe }, + 'wb_rblevels5300k' => { 301 => 0x10a }, + 'wb_rblevels6' => { 326 => 0x11 }, + 'wb_rblevels6000k' => { 301 => 0x10b }, + 'wb_rblevels6500k' => { 187 => 0x420 }, + 'wb_rblevels6600k' => { 301 => 0x10c }, + 'wb_rblevels7' => { 326 => 0x14 }, + 'wb_rblevels7500k' => { 301 => 0x10d }, + 'wb_rblevelsauto' => { 202 => 0x272, 305 => 0x110 }, + 'wb_rblevelscloudy' => { 187 => 0x3f0, 189 => 0x10, 202 => 0x296, 305 => 0x121 }, + 'wb_rblevelscoolwhitef' => { 187 => 0x308, 189 => 0x14 }, + 'wb_rblevelscoolwhitefluor' => { 305 => 0x132 }, + 'wb_rblevelscustom' => { 187 => 0x424, 189 => 0x1c }, + 'wb_rblevelscwb1' => { 301 => 0x10e }, + 'wb_rblevelscwb2' => { 301 => 0x10f }, + 'wb_rblevelscwb3' => { 301 => 0x110 }, + 'wb_rblevelscwb4' => { 301 => 0x111 }, + 'wb_rblevelsdaylight' => { 187 => [0x3ec,0x528], 189 => 0xc, 202 => 0x274 }, + 'wb_rblevelsdaylightf' => { 189 => 0x24 }, + 'wb_rblevelsdaylightfluor' => { 305 => 0x130 }, + 'wb_rblevelsdaywhitef' => { 189 => 0x28 }, + 'wb_rblevelsdaywhitefluor' => { 305 => 0x131 }, + 'wb_rblevelseveningsunlight' => { 305 => 0x124 }, + 'wb_rblevelsfineweather' => { 305 => 0x122 }, + 'wb_rblevelsflash' => { 187 => [0x3f4,0x304], 189 => 0x18, 202 => 0x2a4 }, + 'wb_rblevelsfluorescent' => { 202 => 0x290 }, + 'wb_rblevelsincandescent' => { 202 => 0x282 }, + 'wb_rblevelsshade' => { 187 => 0x418, 189 => 0x20, 202 => 0x2b2, 305 => 0x120 }, + 'wb_rblevelstungsten' => { 187 => 0x3e8, 189 => 0x8, 305 => 0x123 }, + 'wb_rblevelsused' => { 305 => 0x100 }, + 'wb_rblevelswhitef' => { 189 => 0x2c }, + 'wb_rblevelswhitefluorescent' => { 305 => 0x133 }, + 'wb_redlevel3500k' => { 187 => 0x198 }, + 'wb_redlevel6500k' => { 187 => 0x188 }, + 'wb_redlevelcustom' => { 187 => 0x18c }, + 'wb_redlevelscloudy' => { 187 => 0xf8 }, + 'wb_redlevelsdaylight' => { 187 => 0xdc }, + 'wb_redlevelsflash' => { 187 => 0x114 }, + 'wb_redlevelsfluorescent' => { 187 => [0x3fc,0x14c] }, + 'wb_redlevelskelvin' => { 187 => 0x1be }, + 'wb_redlevelsshade' => { 187 => 0x168 }, + 'wb_redlevelstungsten' => { 187 => 0xc0 }, + 'wb_rgbglevels' => { 200 => 0x0 }, + 'wb_rgblevels' => { 187 => [0x546,0x96], 316 => 0xd, 317 => 0x413, 322 => 0x3036, 364 => 0x107, 429 => 0x117c, 430 => 0x1180, 431 => 0x115c, 432 => 0x11d8, 433 => 0x11b4, 434 => 0x106c, 435 => 0x264, 436 => 0x264, 437 => 0x252 }, + 'wb_rgblevels1' => { 327 => 0x2 }, + 'wb_rgblevels2' => { 327 => 0x6 }, + 'wb_rgblevels2500k' => { 427 => 0x782d }, + 'wb_rgblevels3' => { 327 => 0xa }, + 'wb_rgblevels3200k' => { 427 => 0x782c }, + 'wb_rgblevels4' => { 327 => 0xe }, + 'wb_rgblevels4500k' => { 427 => [0x7484,0x7824] }, + 'wb_rgblevels5' => { 327 => 0x12 }, + 'wb_rgblevels6' => { 327 => 0x16 }, + 'wb_rgblevels6000k' => { 427 => 0x782b }, + 'wb_rgblevels7' => { 327 => 0x1a }, + 'wb_rgblevels8500k' => { 427 => 0x782a }, + 'wb_rgblevelsauto' => { 398 => 0x0 }, + 'wb_rgblevelscloudy' => { 427 => [0x7481,0x7821] }, + 'wb_rgblevelscustom1' => { 398 => 0x15 }, + 'wb_rgblevelscustom2' => { 398 => 0x18 }, + 'wb_rgblevelscustom3' => { 398 => 0x1b }, + 'wb_rgblevelsdaylight' => { 398 => 0x3, 427 => [0x7480,0x7820] }, + 'wb_rgblevelsflash' => { 398 => 0x12, 427 => [0x7483,0x7823] }, + 'wb_rgblevelsfluorescent' => { 398 => 0xf, 427 => [0x7486,0x7826] }, + 'wb_rgblevelsfluorescentm1' => { 427 => 0x7829 }, + 'wb_rgblevelsfluorescentp1' => { 427 => 0x7827 }, + 'wb_rgblevelsfluorescentp2' => { 427 => 0x7828 }, + 'wb_rgblevelsincandescent' => { 398 => 0xc }, + 'wb_rgblevelsovercast' => { 398 => 0x9 }, + 'wb_rgblevelsshade' => { 398 => 0x6, 427 => 0x7825 }, + 'wb_rgblevelstungsten' => { 427 => [0x7482,0x7822] }, + 'wb_rgblevelsunknown0' => { 399 => 0x0 }, + 'wb_rgblevelsunknown1' => { 399 => 0x3 }, + 'wb_rgblevelsunknown2' => { 399 => 0x6 }, + 'wb_rgblevelsunknown3' => { 399 => 0x9 }, + 'wb_rgblevelsunknown4' => { 399 => 0xc }, + 'wb_rgblevelsunknown5' => { 399 => 0xf }, + 'wb_rgblevelsunknown6' => { 399 => 0x12 }, + 'wb_rgblevelsunknown7' => { 399 => 0x15 }, + 'wb_rgblevelsunknown8' => { 399 => 0x18 }, + 'wb_rgblevelsunknown9' => { 399 => 0x1b }, + 'wb_rgbmuldaylight' => { 138 => 0x852 }, + 'wb_rgbmulflash' => { 138 => 0x855 }, + 'wb_rgbmulfluorescent' => { 138 => 0x854 }, + 'wb_rgbmultungsten' => { 138 => 0x853 }, + 'wb_rggbblacklevels' => { 35 => 0x25 }, + 'wb_rggblevels' => { 190 => 0x4, 199 => 0x0, 203 => 0x13e8, 204 => 0x38, 427 => 0x7313 }, + 'wb_rggblevelsasshot' => { 38 => 0x0, 39 => 0x0, 40 => 0x19, 41 => 0x55, 42 => 0x69, 43 => 0x22, 44 => 0x3f, 47 => 0x3f, 48 => 0x3f, 49 => 0x3f, 50 => 0x47 }, + 'wb_rggblevelsauto' => { 35 => 0x1, 38 => 0x5, 39 => 0x8, 40 => 0x1e, 41 => 0x5a, 42 => 0x6e, 43 => 0x18, 44 => 0x44, 47 => 0x44, 48 => 0x44, 49 => 0x44, 50 => 0x4c, 203 => 0x1478, 204 => 0x114, 394 => 0xa022, 427 => 0x7312 }, + 'wb_rggblevelsblack' => { 394 => 0xa028 }, + 'wb_rggblevelscloudy' => { 35 => 0xd, 38 => 0x1e, 39 => 0x30, 40 => 0x2d, 41 => 0xa0, 42 => 0xd7, 43 => 0x31, 44 => 0x58, 47 => 0x71, 48 => 0x8a, 49 => 0x8f, 50 => 0x92, 203 => 0x1408, 204 => 0x60, 355 => 0x20f, 363 => 0x14 }, + 'wb_rggblevelscustom' => { 35 => 0x1d, 44 => 0x80, 203 => 0x1468, 204 => 0x100 }, + 'wb_rggblevelscustom1' => { 40 => 0x41 }, + 'wb_rggblevelscustom2' => { 40 => 0x46 }, + 'wb_rggblevelsdaylight' => { 35 => 0x5, 38 => 0x14, 39 => 0x20, 40 => 0x23, 41 => 0x96, 42 => 0xcd, 43 => 0x27, 44 => 0x4e, 47 => 0x67, 48 => 0x80, 49 => 0x85, 50 => 0x88, 203 => 0x13f8, 204 => 0x4c, 355 => 0x20d, 363 => 0x2 }, + 'wb_rggblevelsflash' => { 35 => 0x19, 38 => 0x32, 39 => 0x50, 40 => 0x3c, 41 => 0xb4, 42 => 0xeb, 43 => 0x45, 44 => 0x6c, 47 => 0x85, 48 => 0x9e, 49 => 0xa3, 50 => 0xa6, 203 => 0x1448, 355 => 0x214, 363 => 0x41 }, + 'wb_rggblevelsfluorescent' => { 35 => 0x15, 38 => 0x28, 39 => 0x40, 40 => 0x37, 41 => 0xaa, 42 => 0xe1, 43 => 0x3b, 44 => 0x62, 47 => 0x7b, 48 => 0x94, 49 => 0x99, 50 => 0x9c }, + 'wb_rggblevelsfluorescentd' => { 204 => 0xc4, 355 => 0x211, 363 => 0x26 }, + 'wb_rggblevelsfluorescentl' => { 363 => 0x4a }, + 'wb_rggblevelsfluorescentn' => { 204 => 0xb0, 355 => 0x212, 363 => 0x2f }, + 'wb_rggblevelsfluorescentw' => { 203 => 0x1438, 204 => 0x9c, 355 => 0x213, 363 => 0x38 }, + 'wb_rggblevelshtmercury' => { 204 => 0xd8 }, + 'wb_rggblevelsilluminator1' => { 394 => 0xa023 }, + 'wb_rggblevelsilluminator2' => { 394 => 0xa024 }, + 'wb_rggblevelskelvin' => { 35 => 0x21, 38 => 0x2d, 39 => 0x48, 41 => 0xaf, 42 => 0xe6, 43 => 0x40, 44 => 0x67, 47 => 0x80, 48 => 0x99, 49 => 0x9e, 50 => 0xa1 }, + 'wb_rggblevelsmeasured' => { 38 => 0xa, 39 => 0x10, 41 => 0x5f, 42 => 0x73, 44 => 0x49, 47 => 0x49, 48 => 0x49, 49 => 0x49, 50 => 0x51 }, + 'wb_rggblevelspc1' => { 43 => 0x90, 44 => 0x71 }, + 'wb_rggblevelspc2' => { 43 => 0x95, 44 => 0x76 }, + 'wb_rggblevelspc3' => { 43 => 0x9a, 44 => 0x7b }, + 'wb_rggblevelsshade' => { 35 => 0x9, 38 => 0x19, 39 => 0x28, 40 => 0x28, 41 => 0x9b, 42 => 0xd2, 43 => 0x2c, 44 => 0x53, 47 => 0x6c, 48 => 0x85, 49 => 0x8a, 50 => 0x8d, 204 => 0x74, 355 => 0x20e, 363 => 0xb }, + 'wb_rggblevelstungsten' => { 35 => 0x11, 38 => 0x23, 39 => 0x38, 40 => 0x32, 41 => 0xa5, 42 => 0xdc, 43 => 0x36, 44 => 0x5d, 47 => 0x76, 48 => 0x8f, 49 => 0x94, 50 => 0x97, 203 => 0x1428, 204 => 0x88, 355 => 0x210, 363 => 0x1d }, + 'wb_rggblevelsuncorrected' => { 394 => 0xa021 }, + 'wb_rggblevelsunknown' => { 38 => 0xf, 39 => 0x18, 41 => 0x64, 42 => 0x78, 43 => 0x1d, 47 => 0x4e, 48 => 0x4e, 49 => 0x4e, 50 => 0x56, 363 => 0x53 }, + 'wb_rggblevelsunknown10' => { 38 => 0x5f, 39 => 0x98, 41 => 0x91, 42 => 0xa5, 43 => 0x72, 47 => 0x9e, 48 => 0x7b, 49 => 0x7b, 50 => 0x83 }, + 'wb_rggblevelsunknown11' => { 38 => 0x64, 39 => 0xa0, 41 => 0xb9, 42 => [0xaa,0xaf], 43 => 0x77, 47 => 0xa3, 48 => 0xa3, 49 => 0x80, 50 => 0xab }, + 'wb_rggblevelsunknown12' => { 38 => 0x69, 39 => 0xa8, 41 => 0xbe, 42 => 0xb4, 43 => 0x7c, 47 => 0xa8, 48 => 0xa8, 49 => 0xa8, 50 => 0xb0 }, + 'wb_rggblevelsunknown13' => { 38 => 0x6e, 39 => 0xb0, 41 => 0xc3, 42 => 0xb9, 43 => 0x81, 47 => 0xad, 48 => 0xad, 49 => 0xad, 50 => 0xb5 }, + 'wb_rggblevelsunknown14' => { 41 => 0xc8, 42 => 0xbe, 43 => 0x86, 47 => 0xb2, 48 => 0xb2, 49 => 0xb2, 50 => 0xba }, + 'wb_rggblevelsunknown15' => { 41 => 0xcd, 42 => 0xc3, 43 => 0x8b, 47 => 0xb7, 48 => 0xb7, 49 => 0xb7, 50 => 0xbf }, + 'wb_rggblevelsunknown16' => { 41 => 0xd2, 42 => 0xc8, 43 => 0x9f, 48 => 0xbc, 49 => 0xbc, 50 => 0xc4 }, + 'wb_rggblevelsunknown17' => { 41 => 0xd7, 42 => 0xf0, 48 => 0xc1, 49 => 0xc1, 50 => 0xc9 }, + 'wb_rggblevelsunknown18' => { 41 => 0xdc, 42 => 0xf5, 48 => 0xc6, 49 => 0xc6, 50 => 0xce }, + 'wb_rggblevelsunknown19' => { 41 => 0xe1, 42 => 0xfa, 48 => 0xcb, 49 => 0xcb, 50 => 0xd3 }, + 'wb_rggblevelsunknown2' => { 38 => 0x37, 39 => 0x58, 41 => 0x69, 42 => 0x7d, 43 => 0x4a, 47 => 0x53, 48 => 0x53, 49 => 0x53, 50 => 0x5b }, + 'wb_rggblevelsunknown20' => { 41 => 0xe6, 42 => 0xff, 48 => 0xd0, 49 => 0xd0, 50 => 0xd8 }, + 'wb_rggblevelsunknown21' => { 41 => 0xeb, 42 => 0x104, 49 => 0xd5, 50 => 0xdd }, + 'wb_rggblevelsunknown22' => { 41 => 0xf0, 42 => 0x109, 49 => 0xda, 50 => 0xe2 }, + 'wb_rggblevelsunknown23' => { 41 => 0xf5, 42 => 0x10e, 49 => 0xdf, 50 => 0xe7 }, + 'wb_rggblevelsunknown24' => { 41 => 0xfa, 42 => 0x113, 49 => 0xe4, 50 => 0xec }, + 'wb_rggblevelsunknown25' => { 41 => 0xff, 42 => 0x118, 49 => 0xe9, 50 => 0xf1 }, + 'wb_rggblevelsunknown26' => { 41 => 0x104, 42 => 0x11d, 49 => 0xee, 50 => 0xf6 }, + 'wb_rggblevelsunknown27' => { 41 => 0x109, 42 => 0x122, 49 => 0xf3, 50 => 0xfb }, + 'wb_rggblevelsunknown28' => { 41 => 0x10e, 49 => 0xf8, 50 => 0x100 }, + 'wb_rggblevelsunknown29' => { 41 => 0x113, 49 => 0xfd, 50 => 0x105 }, + 'wb_rggblevelsunknown3' => { 38 => 0x3c, 39 => 0x60, 41 => 0x6e, 42 => 0x82, 43 => 0x4f, 47 => 0x58, 48 => 0x58, 49 => 0x58, 50 => 0x60 }, + 'wb_rggblevelsunknown30' => { 49 => 0x102 }, + 'wb_rggblevelsunknown4' => { 38 => 0x41, 39 => 0x68, 41 => 0x73, 42 => 0x87, 43 => 0x54, 47 => 0x5d, 48 => 0x5d, 49 => 0x5d, 50 => 0x65 }, + 'wb_rggblevelsunknown5' => { 38 => 0x46, 39 => 0x70, 41 => 0x78, 42 => 0x8c, 43 => 0x59, 47 => 0x62, 48 => 0x62, 49 => 0x62, 50 => 0x6a }, + 'wb_rggblevelsunknown6' => { 38 => 0x4b, 39 => 0x78, 41 => 0x7d, 42 => 0x91, 43 => 0x5e, 47 => 0x8a, 48 => 0x67, 49 => 0x67, 50 => 0x6f }, + 'wb_rggblevelsunknown7' => { 38 => 0x50, 39 => 0x80, 41 => 0x82, 42 => 0x96, 43 => 0x63, 47 => 0x8f, 48 => 0x6c, 49 => 0x6c, 50 => 0x74 }, + 'wb_rggblevelsunknown8' => { 38 => 0x55, 39 => 0x88, 41 => 0x87, 42 => 0x9b, 43 => 0x68, 47 => 0x94, 48 => 0x71, 49 => 0x71, 50 => 0x79 }, + 'wb_rggblevelsunknown9' => { 38 => 0x5a, 39 => 0x90, 41 => 0x8c, 42 => 0xa0, 43 => 0x6d, 47 => 0x99, 48 => 0x76, 49 => 0x76, 50 => 0x7e }, + 'wb_rggblevelsuserselected' => { 363 => 0x5c }, + 'wbadjblueamber' => { 103 => 0x20106 }, + 'wbadjbluebalance' => { 278 => 0x8 }, + 'wbadjcolortemp' => { 103 => 0x20102, 108 => 0x1a }, + 'wbadjlighting' => { 278 => 0x14 }, + 'wbadjmagentagreen' => { 103 => 0x20105 }, + 'wbadjmode' => { 278 => 0x10 }, + 'wbadjredbalance' => { 278 => 0x0 }, + 'wbadjrggblevels' => { 103 => 0x20125, 108 => 0x6 }, + 'wbadjtemperature' => { 278 => 0x18 }, + 'wbadjtint' => { 278 => 0x25 }, + 'wbbluelevel' => { 315 => 0x324, 320 => 0x8006, 325 => 0x26 }, + 'wbbracketingsteps' => { 247 => 0x174d, 248 => 0x87c, 257 => 0x1757 }, + 'wbbracketmode' => { 57 => 0x9 }, + 'wbbracketshotnumber' => { 187 => 0x2b, 387 => 0x101a }, + 'wbbracketvalueab' => { 57 => 0xc }, + 'wbbracketvaluegm' => { 57 => 0xd }, + 'wbfinetuneactive' => { 108 => 0x24 }, + 'wbfinetunesaturation' => { 108 => 0x28 }, + 'wbfinetunetone' => { 108 => 0x2c }, + 'wbgreenlevel' => { 315 => 0x323, 320 => 0x8005, 325 => 0x25 }, + 'wbmediaimagesizesetting' => { 84 => 0x708 }, + 'wbmode' => { 189 => 0x4, 302 => 0x1015 }, + 'wbredlevel' => { 315 => 0x322, 320 => 0x8004, 325 => 0x24 }, + 'wbscale' => { 190 => 0x0 }, + 'wbshiftab' => { 74 => 0xc, 320 => 0x46, 337 => 0x10 }, + 'wbshiftab_gm' => { 420 => 0x2014 }, + 'wbshiftab_gm_precise' => { 420 => 0x2026 }, + 'wbshiftcreativecontrol' => { 320 => 0x92 }, + 'wbshiftgm' => { 74 => 0xd, 320 => 0x47, 337 => 0x11 }, + 'wbshiftintelligentauto' => { 320 => 0x8b }, + 'wbtype1' => { 326 => 0x1, 327 => 0x1 }, + 'wbtype2' => { 326 => 0x4, 327 => 0x5 }, + 'wbtype3' => { 326 => 0x7, 327 => 0x9 }, + 'wbtype4' => { 326 => 0xa, 327 => 0xd }, + 'wbtype5' => { 326 => 0xd, 327 => 0x11 }, + 'wbtype6' => { 326 => 0x10, 327 => 0x15 }, + 'wbtype7' => { 326 => 0x13, 327 => 0x19 }, + 'webstatement' => { 508 => 'WebStatement' }, + 'weightedflatsubject' => { 470 => 'weightedFlatSubject' }, + 'what' => { 478 => 'What', 480 => 'What' }, + 'whitebalance' => { 7 => 0x6f, 8 => [0x44,0x4a], 9 => 0xbc, 10 => 0x36, 11 => 0x5e, 12 => 0x36, 13 => 0x78, 14 => 0x6f, 15 => 0x6f, 16 => 0x73, 17 => 0x6f, 18 => 0x78, 19 => 0x54, 20 => 0x6f, 21 => 0xbc, 22 => 0x7b, 24 => 0xbc, 25 => 0xc2, 27 => 0x131, 28 => 0x77, 74 => 0x8, 77 => 0x7, 112 => 0x7, 113 => [0x19,0x2012], 119 => [0xa403,0xfe4e], 127 => 0x1002, 138 => 0x3fc, 139 => 0xfa0d, 140 => 0x40, 151 => 0x1a, 181 => 0x3, 182 => 0xe, 183 => 0x4, 184 => 0xb, 186 => 0x115, 226 => 0x5, 262 => 0x7, 315 => 0x304, 320 => 0x3, 322 => 0x3033, 355 => 0x19, 362 => 0x7, 386 => 0x26, 387 => 0x1003, 397 => [0x88,0x3c,0x7,0x58], 407 => 0xf, 408 => 0xe, 420 => [0x115,0xb054], 478 => 'WhiteBalance', 480 => 'WhiteBalance', 484 => 'WhiteBalance' }, + 'whitebalance0' => { 176 => 'WhiteBalance0' }, + 'whitebalance1' => { 176 => 'WhiteBalance1' }, + 'whitebalance2' => { 176 => 'WhiteBalance2', 297 => 0x500 }, + 'whitebalanceadj' => { 103 => 0x20101, 108 => 0x18, 272 => 0x76a43204 }, + 'whitebalanceautoadjustment' => { 333 => 0x0 }, + 'whitebalancebias' => { 113 => 0x2011, 302 => 0x304, 320 => 0x23 }, + 'whitebalanceblue' => { 74 => 0x7 }, + 'whitebalancebracket' => { 297 => 0x502, 302 => 0x303 }, + 'whitebalancebracketing' => { 184 => 0x22, 187 => 0x2c, 418 => 0x2c }, + 'whitebalancebuttonplaybackmode' => { 295 => 0x1c5 }, + 'whitebalancecomp' => { 305 => 0x1001 }, + 'whitebalancedetected' => { 138 => 0x3fb }, + 'whitebalancefinetune' => { 127 => 0x100a, 184 => 0x38, 186 => 0x112, 226 => 0xb, 387 => 0x1004, 407 => 0x6, 408 => 0x5, 420 => 0x112 }, + 'whitebalancemode' => { 138 => 0x3fa, 355 => 0x1a }, + 'whitebalancered' => { 74 => 0x6 }, + 'whitebalanceset' => { 336 => 0xa }, + 'whitebalancesetting' => { 184 => 0x23, 407 => 0x5, 408 => 0x4, 409 => 0x16, 425 => 0xd }, + 'whitebalancesetup' => { 394 => 0x41 }, + 'whitebalancetemperature' => { 297 => 0x501 }, + 'whiteboard' => { 302 => 0x301 }, + 'whitelevel' => { 119 => 0xc61d, 355 => 0x7e, 427 => 0x787f }, + 'whitepoint' => { 119 => 0x13e, 319 => 0x35d, 355 => 0x201, 500 => 'WhitePoint' }, + 'whites2012' => { 478 => 'Whites2012', 480 => 'Whites2012' }, + 'whitesadj' => { 455 => 0x9017 }, + 'wideadapter' => { 387 => 0x1017 }, + 'widefocuszone' => { 181 => 0x2f }, + 'widerange' => { 396 => 0x20f }, + 'windmode' => { 138 => 0x3f4 }, + 'windnoisereduction' => { 229 => 0x2d6 }, + 'windowlocation' => { 380 => 'WLOC' }, + 'windowsatom' => { 479 => 'windowsAtom' }, + 'windowsatomextension' => { 479 => [\'windowsAtom','windowsAtomExtension'] }, + 'windowsatominvocationflags' => { 479 => [\'windowsAtom','windowsAtomInvocationFlags'] }, + 'windowsatomuncprojectpath' => { 479 => [\'windowsAtom','windowsAtomUncProjectPath'] }, + 'wordcount' => { 494 => 'wordCount' }, + 'work' => { 372 => "\xa9wrk" }, + 'workcolorspace' => { 103 => 0x10200, 108 => 0x270 }, + 'workflowtag' => { 490 => 'WorkflowTag' }, + 'workflowtagcvid' => { 490 => [\'WorkflowTag','WorkflowTagCvId'] }, + 'workflowtagcvtermid' => { 490 => [\'WorkflowTag','WorkflowTagCvTermId'] }, + 'workflowtagcvtermname' => { 490 => [\'WorkflowTag','WorkflowTagCvTermName'] }, + 'workflowtagcvtermrefinedabout' => { 490 => [\'WorkflowTag','WorkflowTagCvTermRefinedAbout'] }, + 'worktodo' => { 486 => 'WorkToDo' }, + 'worldtimelocation' => { 320 => 0x3a, 355 => 0x22, 361 => '0.1' }, + 'writer' => { 179 => 'WM/Writer' }, + 'writer-editor' => { 131 => 0x7a }, + 'x3filllight' => { 397 => 0x12 }, + 'xattrquarantine' => { 174 => 'com.apple.quarantine' }, + 'xilinxversion' => { 138 => 0x414 }, + 'xml' => { 136 => 'xml ' }, + 'xmp' => { 106 => 0xffff00f6, 120 => 'XMP' }, + 'xmptoolkit' => { 501 => 'xmptk' }, + 'xpauthor' => { 119 => 0x9c9d }, + 'xpcomment' => { 119 => 0x9c9c }, + 'xpkeywords' => { 119 => 0x9c9e }, + 'xposition' => { 119 => 0x11e }, + 'xpsubject' => { 119 => 0x9c9f }, + 'xptitle' => { 119 => 0x9c9b }, + 'xresolution' => { 119 => 0x11a, 134 => 0x3, 370 => 0x0, 500 => 'XResolution' }, + 'xyresolution' => { 123 => 0x3 }, + 'yaw' => { 115 => 0x7, 380 => ['_yaw',"\xa9fyw"] }, + 'yawangle' => { 247 => 0x3513, 248 => 0x2c2c, 252 => 0xc222, 257 => 0x36fc, 258 => 0x2f03, 260 => 0xce3a, 261 => 0xeaf3, 392 => 0x0 }, + 'ycbcrcoefficients' => { 119 => 0x211, 500 => 'YCbCrCoefficients' }, + 'ycbcrpositioning' => { 119 => 0x213, 500 => 'YCbCrPositioning' }, + 'ycbcrsubsampling' => { 119 => 0x212, 500 => 'YCbCrSubSampling' }, + 'year' => { 372 => 'yrrc', 374 => 'year', 380 => 'yrrc' }, + 'yearcreated' => { 140 => 0x10, 149 => 0xc }, + 'yellowhsl' => { 103 => 0x20912 }, + 'yield' => { 496 => 'yield' }, + 'yposition' => { 119 => 0x11f }, + 'yresolution' => { 119 => 0x11b, 134 => 0x5, 370 => 0x4, 500 => 'YResolution' }, + 'zebrapatterntonerange' => { 295 => 0x211 }, + 'zoneidentifier' => { 120 => 'ZoneIdentifier' }, + 'zonematching' => { 186 => 0x10a, 189 => [0x3a,0x4a], 420 => 0xb024 }, + 'zonematchingmode' => { 184 => 0x14 }, + 'zonematchingon' => { 183 => 0x75 }, + 'zonematchingvalue' => { 407 => 0x1f }, + 'zoomedpreviewlength' => { 302 => 0xf05 }, + 'zoomedpreviewsize' => { 302 => 0xf06 }, + 'zoomedpreviewstart' => { 302 => 0xf04 }, + 'zoomsourcewidth' => { 34 => 0x24 }, + 'zoomstepcount' => { 300 => 0x300, 302 => 0x100d }, + 'zoomtargetwidth' => { 34 => 0x25 }, +); + +# lookup for non-writable tags to check if the name exists +my %tagExists = ( + '_ac3' => 1, + '_h264' => 1, + '_stream' => 1, + 'a100dataoffset' => 1, + 'aas' => 1, + 'abovecolor' => 1, + 'abstract' => 1, + 'abstractfilename' => 1, + 'accel360fly' => 1, + 'acceldata' => 1, + 'accelerometermatrix' => 1, + 'accelerometertime' => 1, + 'accelerometerunknown' => 1, + 'accelmode' => 1, + 'accelypr' => 1, + 'accessdate' => 1, + 'accountname' => 1, + 'acdsee' => 1, + 'acquisitiontime' => 1, + 'acquisitiontimeday' => 1, + 'acquisitiontimemonth' => 1, + 'acquisitiontimeyear' => 1, + 'acquisitiontimeyearmonth' => 1, + 'acquisitiontimeyearmonthday' => 1, + 'acroform' => 1, + 'activebuf1cols' => 1, + 'activebuf1rows' => 1, + 'activebuf2cols' => 1, + 'activebuf2rows' => 1, + 'activecols' => 1, + 'activectemonitor1cols' => 1, + 'activectemonitor2cols' => 1, + 'activectemonitorrows' => 1, + 'activerows' => 1, + 'actor' => 1, + 'actualcompensation' => 1, + 'actualscalemax' => 1, + 'actualscalemin' => 1, + 'actualsoftpostpadding' => 1, + 'actualsoftprepadding' => 1, + 'additionalinfo' => 1, + 'adjdebuginfo' => 1, + 'adjustedtbnimageheight' => 1, + 'adjustedtbnimagewidth' => 1, + 'adobe_cm' => 1, + 'adobecmtype' => 1, + 'adobecrw' => 1, + 'adobekoda' => 1, + 'adobeleaf' => 1, + 'adobemrw' => 1, + 'adobepano' => 1, + 'adobephotoshop' => 1, + 'adoberaf' => 1, + 'adobesr2' => 1, + 'adoptedneutral' => 1, + 'adult' => 1, + 'advancedcontentencryption' => 1, + 'advancedmutualexcl' => 1, + 'advancedscenemode' => 1, + 'adventrevision' => 1, + 'adventscale' => 1, + 'aedebuginfo' => 1, + 'aeflags' => 1, + 'aehistograminfo' => 1, + 'aeinfo' => 1, + 'aeinfo2' => 1, + 'aeinfo3' => 1, + 'aeinfounknown' => 1, + 'aeliveviewhistograminfo' => 1, + 'aeliveviewlocalhistogram' => 1, + 'aelocalhistogram' => 1, + 'af-cprioritysel' => 1, + 'af-sprioritysel' => 1, + 'afarea' => 1, + 'afareaheights' => 1, + 'afareawidths' => 1, + 'afareaxpositions' => 1, + 'afareaypositions' => 1, + 'afconfig' => 1, + 'afcp' => 1, + 'afcp_iptc' => 1, + 'afcsettings' => 1, + 'afdebuginfo' => 1, + 'aff1' => 1, + 'aff5' => 1, + 'affheader' => 1, + 'affinetransformmat' => 1, + 'afinfo' => 1, + 'afinfo2' => 1, + 'afinfo2version' => 1, + 'afinfo3' => 1, + 'afinfocus' => 1, + 'afinfosize' => 1, + 'afm' => 1, + 'afpointinfo' => 1, + 'afpointsinfocus1d' => 1, + 'afsp' => 1, + 'afstatus15' => 1, + 'afstatus19' => 1, + 'afstatus79' => 1, + 'aftune' => 1, + 'aibuildnumber' => 1, + 'aicolormodel' => 1, + 'aicolorusage' => 1, + 'aicreatorversion' => 1, + 'aifileformat' => 1, + 'aimetadata' => 1, + 'ainumlayers' => 1, + 'aipdfprivatedata' => 1, + 'aiprivatedata' => 1, + 'airspeed' => 1, + 'airulerunits' => 1, + 'aitargetresolution' => 1, + 'album2' => 1, + 'albumartistsortorder' => 1, + 'albumid' => 1, + 'albumidalbumartist' => 1, + 'albumname' => 1, + 'albumsortorder' => 1, + 'albumtitlesortorder' => 1, + 'aliaslayermetadata' => 1, + 'alignment' => 1, + 'allcolorflatfield1' => 1, + 'allcolorflatfield2' => 1, + 'allcolorflatfield3' => 1, + 'alph' => 1, + 'alpha' => 1, + 'alphabitdepth' => 1, + 'alphabytecount' => 1, + 'alphachannelsnames' => 1, + 'alphacompression' => 1, + 'alphadatadiscard' => 1, + 'alphafilter' => 1, + 'alphafiltering' => 1, + 'alphaidentifiers' => 1, + 'alphainterlace' => 1, + 'alphamask' => 1, + 'alphaoffset' => 1, + 'alphapreprocessing' => 1, + 'alphasample' => 1, + 'alternateduotonecolors' => 1, + 'alternatesourceurl' => 1, + 'alternatespotcolors' => 1, + 'altitudefromtakeoff' => 1, + 'ambienceinfo' => 1, + 'angleaxis' => 1, + 'angularvelocity' => 1, + 'anim' => 1, + 'animation' => 1, + 'animationcontrol' => 1, + 'animationframes' => 1, + 'animationiterations' => 1, + 'animationloopcount' => 1, + 'animationplays' => 1, + 'anmf' => 1, + 'anniversary' => 1, + 'annotation' => 1, + 'annotations' => 1, + 'annotationusagerights' => 1, + 'announce' => 1, + 'announcelist1' => 1, + 'anoiselines' => 1, + 'anta' => 1, + 'aperture' => 1, + 'aperturedisplayed' => 1, + 'apeversion' => 1, + 'app14flags0' => 1, + 'app14flags1' => 1, + 'app1_profile' => 1, + 'apple-fi' => 1, + 'appledataoffsets' => 1, + 'applemaildatereceived' => 1, + 'applemaildatesent' => 1, + 'applemailflagged' => 1, + 'applemailisremoteattachment' => 1, + 'applemailmessageid' => 1, + 'applemailpriority' => 1, + 'applemailread' => 1, + 'applemailrepliedto' => 1, + 'application' => 1, + 'applicationdata' => 1, + 'applicationmissingmsg' => 1, + 'applicationversion' => 1, + 'applysettingstoliveview' => 1, + 'appname' => 1, + 'archivallocation' => 1, + 'archivedfilename' => 1, + 'arcoreaccel' => 1, + 'arcorecustom' => 1, + 'arcoregyro' => 1, + 'arcorevideo' => 1, + 'ardronefile' => 1, + 'ardronetelemetry' => 1, + 'artist2' => 1, + 'artistlen' => 1, + 'artists' => 1, + 'artisturl' => 1, + 'ascender' => 1, + 'ascent' => 1, + 'asfleakybucketpairs' => 1, + 'asfpacketcount' => 1, + 'asfsecurityobjectssize' => 1, + 'asin' => 1, + 'asin2' => 1, + 'aspectinfo' => 1, + 'aspectratiox' => 1, + 'aspectratioy' => 1, + 'assistantsname' => 1, + 'assistantsphone' => 1, + 'associateddatalist' => 1, + 'associatedimagefile' => 1, + 'association' => 1, + 'assumeddisplaysize' => 1, + 'assumeddistanceview' => 1, + 'ast' => 1, + 'atmospherictemperature' => 1, + 'atmospherictransalpha1' => 1, + 'atmospherictransalpha2' => 1, + 'atmospherictransbeta1' => 1, + 'atmospherictransbeta2' => 1, + 'atmospherictransx' => 1, + 'atob0' => 1, + 'atob1' => 1, + 'atob2' => 1, + 'atob3' => 1, + 'atom0' => 1, + 'atsccontent' => 1, + 'attachments' => 1, + 'attitude' => 1, + 'attitudetarget' => 1, + 'attr' => 1, + 'attributes' => 1, + 'audible_cvrx' => 1, + 'audible_meta' => 1, + 'audible_meta2' => 1, + 'audible_tags' => 1, + 'audible_tseg' => 1, + 'audiences' => 1, + 'audioattributes' => 1, + 'audioavailablebitraterange' => 1, + 'audioavailablenumberchannels' => 1, + 'audioavgbitrate' => 1, + 'audiobitratecontrolmode' => 1, + 'audiobytes' => 1, + 'audiochannellayout' => 1, + 'audiochanneltypes' => 1, + 'audiocodec' => 1, + 'audiocodecdescription' => 1, + 'audiocodecid' => 1, + 'audiocodecinfo' => 1, + 'audiocodecname' => 1, + 'audiocodecprimemethod' => 1, + 'audiocomponentversion' => 1, + 'audiocurrenttargetbitrate' => 1, + 'audiodelay' => 1, + 'audiodoessamplerateconversion' => 1, + 'audioencoding' => 1, + 'audioencodingparamsversion' => 1, + 'audioextendfrequencies' => 1, + 'audiofilesize' => 1, + 'audiofileurl' => 1, + 'audioformat' => 1, + 'audioframesize' => 1, + 'audiohasvariablepacketbytesizes' => 1, + 'audioheader' => 1, + 'audioinfo' => 1, + 'audioinputbuffersize' => 1, + 'audioisinitialized' => 1, + 'audiolayer' => 1, + 'audiomaxbitrate' => 1, + 'audiomaximumpacketbytesize' => 1, + 'audiominimumdelaymode' => 1, + 'audiominimumnumberinputpackets' => 1, + 'audiominimumnumberoutputpackets' => 1, + 'audiomode' => 1, + 'audiooutputprecedence' => 1, + 'audiopacketframesize' => 1, + 'audioprofile' => 1, + 'audioprofileversion' => 1, + 'audioqualitysetting' => 1, + 'audiorequirespacketdescription' => 1, + 'audiosamplecount' => 1, + 'audiosampledesc' => 1, + 'audiosamplesize' => 1, + 'audiosetting' => 1, + 'audiosize' => 1, + 'audiosourceurl' => 1, + 'audiostream' => 1, + 'audiostreamtype' => 1, + 'audiotrackid' => 1, + 'audiousedinputbuffersize' => 1, + 'audiouserecommendedsamplerate' => 1, + 'audiovbrquality' => 1, + 'audiovendorid' => 1, + 'audiozeroframespadded' => 1, + 'authenticationtime' => 1, + 'authenticationtype' => 1, + 'authoridentifier' => 1, + 'authoringsoftwarerelease' => 1, + 'authorlen' => 1, + 'authorname' => 1, + 'authorship' => 1, + 'authorsortorder' => 1, + 'autoareaafstartingpoint' => 1, + 'autoisomin' => 1, + 'autolowlightduration' => 1, + 'automationanimation' => 1, + 'automationflags' => 1, + 'autorotation' => 1, + 'autosavefilepath' => 1, + 'autosaveformat' => 1, + 'autosummary' => 1, + 'aux' => 1, + 'auxiliaryimageref' => 1, + 'auxiliaryimagetype' => 1, + 'av1configuration' => 1, + 'av1configurationversion' => 1, + 'avcconfiguration' => 1, + 'averagebitrate' => 1, + 'averageframerate' => 1, + 'averagelevel' => 1, + 'avgbitrate' => 1, + 'avgbytespersec' => 1, + 'avgpacketsize' => 1, + 'avgpdusize' => 1, + 'avgwidth' => 1, + 'avi1' => 1, + 'avif' => 1, + 'aviheader' => 1, + 'awbdebuginfo' => 1, + 'awbinfo' => 1, + 'axisdistancex' => 1, + 'axisdistancey' => 1, + 'axisdistancez' => 1, + 'axml' => 1, + 'b1' => 1, + 'b2' => 1, + 'background' => 1, + 'backgroundcolor' => 1, + 'backgroundcolorindicator' => 1, + 'backgroundcolorvalue' => 1, + 'backgroundimageid' => 1, + 'backgroundtiling' => 1, + 'backlight' => 1, + 'backserial' => 1, + 'backuptime' => 1, + 'badfaxlines' => 1, + 'bahpver' => 1, + 'balpver' => 1, + 'band' => 1, + 'bandwidthsharing' => 1, + 'bannerimage' => 1, + 'bannerimagedata' => 1, + 'bannerimagetype' => 1, + 'bannerimageurl' => 1, + 'barcode' => 1, + 'barcodes' => 1, + 'barometerinfo' => 1, + 'barometerinfoversion' => 1, + 'baselinelength' => 1, + 'basename' => 1, + 'baseviewpointnum' => 1, + 'basicfileinfo' => 1, + 'basisobject' => 1, + 'battery' => 1, + 'batterycapacity' => 1, + 'batterycurrent' => 1, + 'batteryinfo' => 1, + 'batterystatus' => 1, + 'batterytime' => 1, + 'batteryvoltage3' => 1, + 'batteryvoltage4' => 1, + 'bavpver' => 1, + 'bccaddresses' => 1, + 'bccnames' => 1, + 'beats-per-minute' => 1, + 'beautycolorlevel' => 1, + 'beautyretouchlevel' => 1, + 'belowcolor' => 1, + 'beta' => 1, + 'bibligraphicfilename' => 1, + 'bikebroaccel' => 1, + 'bikebrogps' => 1, + 'billinginformation' => 1, + 'binarydata' => 1, + 'binarydatatype' => 1, + 'binaryfilter' => 1, + 'binaryxml' => 1, + 'binning' => 1, + 'birthday' => 1, + 'bitdepthchroma' => 1, + 'bitdepthluma' => 1, + 'bitrate' => 1, + 'bitrateinfo' => 1, + 'bitratemutualexclusion' => 1, + 'bitsperextendedrunlength' => 1, + 'bitsperpixel' => 1, + 'bitsperrunlength' => 1, + 'blackadcountsperdacvolt' => 1, + 'blackclamp' => 1, + 'blackclampoffset' => 1, + 'blackcolsleft' => 1, + 'blackcolsright' => 1, + 'blackdacchannel' => 1, + 'blackdacsettlingmsec' => 1, + 'blackmaskbottomborder' => 1, + 'blackmaskleftborder' => 1, + 'blackmaskrightborder' => 1, + 'blackmasktopborder' => 1, + 'blackrowsbottom' => 1, + 'blackrowstop' => 1, + 'blacktarget' => 1, + 'blocklocation' => 1, + 'blocksize' => 1, + 'blocksizemax' => 1, + 'blocksizemin' => 1, + 'blockspercolumn' => 1, + 'blocksperframe' => 1, + 'blocksperrow' => 1, + 'blueadjust' => 1, + 'blueendpoint' => 1, + 'bluegain' => 1, + 'bluegrassscale1' => 1, + 'bluegrassscale2' => 1, + 'bluegrasstable' => 1, + 'bluemask' => 1, + 'bluematrixcolumn' => 1, + 'blueprimary' => 1, + 'bluesample' => 1, + 'bluetrc' => 1, + 'bluex' => 1, + 'bluey' => 1, + 'blurstrength' => 1, + 'bmpversion' => 1, + 'boardtemperature' => 1, + 'bokehshape' => 1, + 'bookname' => 1, + 'booktitle' => 1, + 'booktype' => 1, + 'bookversion' => 1, + 'bootidentifier' => 1, + 'bootrecord' => 1, + 'bootsystem' => 1, + 'bordercolor' => 1, + 'borderid' => 1, + 'borderinformation' => 1, + 'borderlocation' => 1, + 'bordername' => 1, + 'bordersversion' => 1, + 'bordertype' => 1, + 'bottomdarkrow1' => 1, + 'bottomdarkrow2' => 1, + 'bottommag' => 1, + 'boundaryorigin' => 1, + 'boundingbox' => 1, + 'bracketingburstoptions' => 1, + 'bracketingcounter' => 1, + 'bracketingmode' => 1, + 'bracketingstep' => 1, + 'bracketshot' => 1, + 'brain' => 1, + 'brandingimageid' => 1, + 'brandingname' => 1, + 'brdfatob0' => 1, + 'brdfatob1' => 1, + 'brdfatob2' => 1, + 'brdfatob3' => 1, + 'brdfbtoa0' => 1, + 'brdfbtoa1' => 1, + 'brdfbtoa2' => 1, + 'brdfbtoa3' => 1, + 'brdfbtod0' => 1, + 'brdfbtod1' => 1, + 'brdfbtod2' => 1, + 'brdfbtod3' => 1, + 'brdfcolorimetricparam0' => 1, + 'brdfcolorimetricparam1' => 1, + 'brdfcolorimetricparam2' => 1, + 'brdfcolorimetricparam3' => 1, + 'brdfdtob0' => 1, + 'brdfdtob1' => 1, + 'brdfdtob2' => 1, + 'brdfdtob3' => 1, + 'brdfmtob0' => 1, + 'brdfmtob1' => 1, + 'brdfmtob2' => 1, + 'brdfmtob3' => 1, + 'brdfmtos0' => 1, + 'brdfmtos1' => 1, + 'brdfmtos2' => 1, + 'brdfmtos3' => 1, + 'brdfspectralparam0' => 1, + 'brdfspectralparam1' => 1, + 'brdfspectralparam2' => 1, + 'brdfspectralparam3' => 1, + 'breakchar' => 1, + 'brightdefectintegrationms' => 1, + 'brightdefectisocode' => 1, + 'brightdefectthreshold' => 1, + 'brightnessdata' => 1, + 'brightrowstop' => 1, + 'broadcast' => 1, + 'broadcastdate' => 1, + 'broadcastextension' => 1, + 'btoa0' => 1, + 'btoa1' => 1, + 'btoa2' => 1, + 'btoa3' => 1, + 'btod0' => 1, + 'btod1' => 1, + 'btod2' => 1, + 'btod3' => 1, + 'bufferaverage' => 1, + 'buffersize' => 1, + 'builddate' => 1, + 'buildversion' => 1, + 'businessaddress' => 1, + 'businesscity' => 1, + 'businesscountry-region' => 1, + 'businessfax' => 1, + 'businesshomepage' => 1, + 'businessphone' => 1, + 'businesspobox' => 1, + 'businesspostalcode' => 1, + 'businessstateorprovince' => 1, + 'businessstreet' => 1, + 'buynow' => 1, + 'buytickets' => 1, + 'bw_halftoninginfo' => 1, + 'bw_transferfunc' => 1, + 'bwf_umid' => 1, + 'bwfversion' => 1, + 'bytelength' => 1, + 'byteorder' => 1, + 'byteordermark' => 1, + 'bytes' => 1, + 'bytesperline' => 1, + 'bytesperminute' => 1, + 'cachecontrol' => 1, + 'cachedimageheight' => 1, + 'cachedimagewidth' => 1, + 'calculatedscalemax' => 1, + 'calculatedscalemin' => 1, + 'calibrationdatetime' => 1, + 'calibrationlog' => 1, + 'callbacknumber' => 1, + 'callletters' => 1, + 'camcore' => 1, + 'camera1' => 1, + 'camera2' => 1, + 'cameraarrangementinterval' => 1, + 'camerabacktype' => 1, + 'camerabody' => 1, + 'camerabyteorder' => 1, + 'cameradatetime' => 1, + 'cameraifd' => 1, + 'camerainfo' => 1, + 'camerainfo2' => 1, + 'camerainfo3' => 1, + 'camerainfoa100' => 1, + 'camerainfounknown' => 1, + 'cameramaker' => 1, + 'cameramanufacturer' => 1, + 'cameraname' => 1, + 'cameraobjbacktype' => 1, + 'cameraobject' => 1, + 'cameraobjname' => 1, + 'cameraobjtype' => 1, + 'cameraobjversion' => 1, + 'cameraoperator' => 1, + 'camerapan' => 1, + 'camerapartnumber' => 1, + 'cameraprofileversion' => 1, + 'camerascalemax' => 1, + 'camerascalemin' => 1, + 'camerasettings' => 1, + 'camerasettings2' => 1, + 'camerasettings3' => 1, + 'camerasettingsa100' => 1, + 'camerasettingsifd' => 1, + 'camerasettingsunknown' => 1, + 'camerasetup' => 1, + 'camerasoftware' => 1, + 'cameraspecification' => 1, + 'cameratemperaturemaxclip' => 1, + 'cameratemperaturemaxsaturated' => 1, + 'cameratemperaturemaxwarn' => 1, + 'cameratemperatureminclip' => 1, + 'cameratemperatureminsaturated' => 1, + 'cameratemperatureminwarn' => 1, + 'cameratilt' => 1, + 'camm0' => 1, + 'camm1' => 1, + 'camm2' => 1, + 'camm3' => 1, + 'camm4' => 1, + 'camm5' => 1, + 'camm6' => 1, + 'camm7' => 1, + 'can_skip_backward' => 1, + 'can_skip_forward' => 1, + 'canon' => 1, + 'canon_afinfo2_0x000d' => 1, + 'canon_afinfo_0x000b' => 1, + 'canonafinfo' => 1, + 'canonafinfo2' => 1, + 'canoncamerainfo1000d' => 1, + 'canoncamerainfo1100d' => 1, + 'canoncamerainfo1200d' => 1, + 'canoncamerainfo1d' => 1, + 'canoncamerainfo1dmkii' => 1, + 'canoncamerainfo1dmkiii' => 1, + 'canoncamerainfo1dmkiin' => 1, + 'canoncamerainfo1dmkiv' => 1, + 'canoncamerainfo1dx' => 1, + 'canoncamerainfo40d' => 1, + 'canoncamerainfo450d' => 1, + 'canoncamerainfo500d' => 1, + 'canoncamerainfo50d' => 1, + 'canoncamerainfo550d' => 1, + 'canoncamerainfo5d' => 1, + 'canoncamerainfo5dmkii' => 1, + 'canoncamerainfo5dmkiii' => 1, + 'canoncamerainfo600d' => 1, + 'canoncamerainfo60d' => 1, + 'canoncamerainfo650d' => 1, + 'canoncamerainfo6d' => 1, + 'canoncamerainfo700d' => 1, + 'canoncamerainfo70d' => 1, + 'canoncamerainfo750d' => 1, + 'canoncamerainfo760d' => 1, + 'canoncamerainfo7d' => 1, + 'canoncamerainfo80d' => 1, + 'canoncamerainfopowershot' => 1, + 'canoncamerainfopowershot2' => 1, + 'canoncamerainfounknown' => 1, + 'canoncamerainfounknown16' => 1, + 'canoncamerainfounknown32' => 1, + 'canoncamerasettings' => 1, + 'canoncctp' => 1, + 'canoncnop' => 1, + 'canoncnth' => 1, + 'canoncolorinfo1' => 1, + 'canoncolorinfo2' => 1, + 'canonfileinfo' => 1, + 'canonflags' => 1, + 'canonfocallength' => 1, + 'canonimageheight' => 1, + 'canonimagewidth' => 1, + 'canonpanorama' => 1, + 'canonrawmakemodel' => 1, + 'canonshotinfo' => 1, + 'canonskip' => 1, + 'canseekontime' => 1, + 'canseektoend' => 1, + 'capheight' => 1, + 'captiontext' => 1, + 'captprofbacktype' => 1, + 'captprofname' => 1, + 'captproftype' => 1, + 'captprofversion' => 1, + 'captureconditionspar' => 1, + 'capturedevicefid' => 1, + 'captureheightresetblacksegnormal' => 1, + 'captureheightresetblacksegtest' => 1, + 'captureheighttest' => 1, + 'captureobjbacktype' => 1, + 'captureobjname' => 1, + 'captureobjtype' => 1, + 'captureobjversion' => 1, + 'captureprofile' => 1, + 'captureresolution' => 1, + 'captureserial' => 1, + 'capturesetup' => 1, + 'capturewidthresetblacksegnormal' => 1, + 'capturewidthresetblacksegtest' => 1, + 'capturexresolution' => 1, + 'capturexresolutionunit' => 1, + 'captureyresolution' => 1, + 'captureyresolutionunit' => 1, + 'car' => 1, + 'carphone' => 1, + 'casio' => 1, + 'casiodata' => 1, + 'casiojunk' => 1, + 'casioquality' => 1, + 'casioqvmi' => 1, + 'cast' => 1, + 'catalognumber' => 1, + 'cbordata' => 1, + 'cc' => 1, + 'ccaddresses' => 1, + 'ccdrect' => 1, + 'ccdvalidrect' => 1, + 'ccdvideorect' => 1, + 'ccnames' => 1, + 'cddb1info' => 1, + 'cddbdiscplaytime' => 1, + 'cddbdisctracks' => 1, + 'cddbtracknumber' => 1, + 'cdetype' => 1, + 'cdi1' => 1, + 'cdtrackenabled' => 1, + 'cell' => 1, + 'cellphone' => 1, + 'centerdarkrect' => 1, + 'cfagreenthreshold1' => 1, + 'cfagreenthreshold2' => 1, + 'cfalayout' => 1, + 'cfaplanecolor' => 1, + 'channel0lagkernel' => 1, + 'channel1coordinates' => 1, + 'channel1flags' => 1, + 'channel1label' => 1, + 'channel1lagkernel' => 1, + 'channel2coordinates' => 1, + 'channel2flags' => 1, + 'channel2label' => 1, + 'channel2lagkernel' => 1, + 'channel3coordinates' => 1, + 'channel3flags' => 1, + 'channel3label' => 1, + 'channel3lagkernel' => 1, + 'channel4coordinates' => 1, + 'channel4flags' => 1, + 'channel4label' => 1, + 'channel5coordinates' => 1, + 'channel5flags' => 1, + 'channel5label' => 1, + 'channel6coordinates' => 1, + 'channel6flags' => 1, + 'channel6label' => 1, + 'channel7coordinates' => 1, + 'channel7flags' => 1, + 'channel7label' => 1, + 'channel8coordinates' => 1, + 'channel8flags' => 1, + 'channel8label' => 1, + 'channelcoarsegainadjust' => 1, + 'channelmode' => 1, + 'channelnumber' => 1, + 'channelusage' => 1, + 'chapter' => 1, + 'chaptercount' => 1, + 'chapterlisttrackid' => 1, + 'chaptername' => 1, + 'chapternum' => 1, + 'chapternumber' => 1, + 'characterescapesequence' => 1, + 'characters' => 1, + 'characterset' => 1, + 'characterswithspaces' => 1, + 'charcountwithspaces' => 1, + 'chartarget' => 1, + 'chartcontourinterval' => 1, + 'chartcorrdate' => 1, + 'chartcountryorigin' => 1, + 'chartdepthunits' => 1, + 'chartformat' => 1, + 'chartmagvar' => 1, + 'chartmagvarannchange' => 1, + 'chartmagvaryear' => 1, + 'chartrasteredition' => 1, + 'chartsoundingdatum' => 1, + 'chartsource' => 1, + 'chartsourcedate' => 1, + 'chartsourceedition' => 1, + 'chartwgsnsshift' => 1, + 'checkedby' => 1, + 'children' => 1, + 'chmversion' => 1, + 'chromaformat' => 1, + 'chromasampleposition' => 1, + 'chromaticaberrationparams' => 1, + 'chromaticadaptation' => 1, + 'chromaticities' => 1, + 'chromaticity' => 1, + 'chromaticitychannel1' => 1, + 'chromaticitychannel2' => 1, + 'chromaticitychannel3' => 1, + 'chromaticitychannel4' => 1, + 'chromaticitychannels' => 1, + 'chromaticitycolorant' => 1, + 'chunkoffset' => 1, + 'chunkoffset64' => 1, + 'ciff' => 1, + 'cinematographer' => 1, + 'cip3datafile' => 1, + 'cip3sheet' => 1, + 'cip3side' => 1, + 'circleofconfusion' => 1, + 'class' => 1, + 'cleanaperture' => 1, + 'cleanaperturedimensions' => 1, + 'cleanapertureheight' => 1, + 'cleanapertureoffsetx' => 1, + 'cleanapertureoffsety' => 1, + 'cleanaperturewidth' => 1, + 'cleanfaxdata' => 1, + 'clientid' => 1, + 'clipboundary' => 1, + 'clipobjects' => 1, + 'clippath' => 1, + 'clippingboundary' => 1, + 'clippinglimit' => 1, + 'clippingpathname' => 1, + 'cloneid' => 1, + 'cloneobject' => 1, + 'clonetype' => 1, + 'closedcaptioning' => 1, + 'cmddialsaperturesetting' => 1, + 'cmddialschangemainsub' => 1, + 'cmddialschangemainsubexposure' => 1, + 'cmddialsmenuandplayback' => 1, + 'cmddialsreverserotexposurecomp' => 1, + 'cmmflags' => 1, + 'cmp1' => 1, + 'cmykequivalent' => 1, + 'coarsedata' => 1, + 'coarsemapimage' => 1, + 'coarsemapimageheight' => 1, + 'coarsemapimagetype' => 1, + 'coarsemapimagewidth' => 1, + 'codecflavorid' => 1, + 'codeclist' => 1, + 'codedframesize' => 1, + 'codepage' => 1, + 'codesize' => 1, + 'codestreamheader' => 1, + 'codestreamregistration' => 1, + 'codinghistory' => 1, + 'codingmethods' => 1, + 'codirectors' => 1, + 'colorant1coordinates' => 1, + 'colorant1name' => 1, + 'colorant2coordinates' => 1, + 'colorant2name' => 1, + 'colorant3coordinates' => 1, + 'colorant3name' => 1, + 'colorantcount' => 1, + 'colorantinfoout' => 1, + 'colorantorder' => 1, + 'colorantorderout' => 1, + 'coloranttable' => 1, + 'coloranttableout' => 1, + 'coloraverages' => 1, + 'colorbalance0100' => 1, + 'colorbalance0102' => 1, + 'colorbalance0103' => 1, + 'colorbalance02' => 1, + 'colorbalance0205' => 1, + 'colorbalance0209' => 1, + 'colorbalance0211' => 1, + 'colorbalance0213' => 1, + 'colorbalance0215' => 1, + 'colorbalancea' => 1, + 'colorbalanceunknown' => 1, + 'colorbalanceunknown02' => 1, + 'colorbalanceunknown04' => 1, + 'colorbitdepth' => 1, + 'colorboostdata' => 1, + 'colorbw' => 1, + 'colorcalib' => 1, + 'colorcalib2' => 1, + 'colorcalibrationmatrix' => 1, + 'colorcasts' => 1, + 'colorcharacterization' => 1, + 'colorcoefs' => 1, + 'colorcoefs2' => 1, + 'colorcomponents' => 1, + 'colordata1' => 1, + 'colordata10' => 1, + 'colordata11' => 1, + 'colordata2' => 1, + 'colordata3' => 1, + 'colordata4' => 1, + 'colordata5' => 1, + 'colordata6' => 1, + 'colordata7' => 1, + 'colordata8' => 1, + 'colordata9' => 1, + 'colordataunknown' => 1, + 'colorencodingparams' => 1, + 'colorgroup' => 1, + 'colorhalftoninginfo' => 1, + 'colorimetricintentimagestate' => 1, + 'colorimetricspecification' => 1, + 'colorimetry' => 1, + 'colorinfo' => 1, + 'colormap' => 1, + 'colorobjbacktype' => 1, + 'colorobjname' => 1, + 'colorobjtype' => 1, + 'colorobjversion' => 1, + 'colorpalette' => 1, + 'colorpopstrength' => 1, + 'colorprimaries' => 1, + 'colorresolutiondepth' => 1, + 'colorresponseunit' => 1, + 'colors' => 1, + 'colorsamplersresource' => 1, + 'colorsamplersresource2' => 1, + 'colorsetup' => 1, + 'colorspacedata' => 1, + 'colorspacename' => 1, + 'colorspecification' => 1, + 'colortable' => 1, + 'colortemperatures' => 1, + 'colortransferfuncs' => 1, + 'colortransform' => 1, + 'colortwistmatrix' => 1, + 'colortype' => 1, + 'columncount' => 1, + 'columngainfactors' => 1, + 'columnresetoffsets' => 1, + 'command' => 1, + 'commandlinearguments' => 1, + 'commentby' => 1, + 'commentlen' => 1, + 'comments' => 1, + 'commenttime' => 1, + 'commercialurl' => 1, + 'commissioned' => 1, + 'common' => 1, + 'commonnetworkrellink' => 1, + 'commonpathsuffix' => 1, + 'compactsamplesizes' => 1, + 'company' => 1, + 'companymainphone' => 1, + 'companyname' => 1, + 'compatibility' => 1, + 'compatiblebrands' => 1, + 'compatiblefontname' => 1, + 'complete' => 1, + 'compobj' => 1, + 'compobjusertype' => 1, + 'compobjusertypelen' => 1, + 'componentbitdepth' => 1, + 'componentdefinition' => 1, + 'componentmapping' => 1, + 'componenttable' => 1, + 'composers' => 1, + 'composersortorder' => 1, + 'compositinglayerheader' => 1, + 'compositionmode' => 1, + 'compositionoptions' => 1, + 'compositiontimetosample' => 1, + 'compositiontodecodetimelinemapping' => 1, + 'compressed' => 1, + 'compressedannotation' => 1, + 'compresseddatalength' => 1, + 'compresseddataoffset' => 1, + 'compressedmovie' => 1, + 'compressedsize' => 1, + 'compressedtext' => 1, + 'compressionclass' => 1, + 'compressionlevel' => 1, + 'compressiontype' => 1, + 'compressorid' => 1, + 'compressorname' => 1, + 'computedatmospherictrans' => 1, + 'computer' => 1, + 'concreteflag' => 1, + 'condition' => 1, + 'conditionalfec' => 1, + 'conductors' => 1, + 'confirmedobjectsize' => 1, + 'connectionspaceilluminant' => 1, + 'consecutivebadfaxlines' => 1, + 'consoledata' => 1, + 'consolefedata' => 1, + 'constantframerate' => 1, + 'constraintindicatorflags' => 1, + 'cont' => 1, + 'contactnames' => 1, + 'containerversion' => 1, + 'contake' => 1, + 'contentbranding' => 1, + 'contentdescribes' => 1, + 'contentdescription' => 1, + 'contentdescriptionnotes' => 1, + 'contentdisposition' => 1, + 'contentdistributorduration' => 1, + 'contentdistributortype' => 1, + 'contentencryption' => 1, + 'contentgroupdescription' => 1, + 'contentlanguage' => 1, + 'contentprotected' => 1, + 'contentprotectedpercent' => 1, + 'contentrating' => 1, + 'contents' => 1, + 'contentscripttype' => 1, + 'contentstyletype' => 1, + 'contiguouscodestream' => 1, + 'contrastadjustment' => 1, + 'contrastinfo' => 1, + 'controller' => 1, + 'convergenceangle' => 1, + 'convergencebaseimage' => 1, + 'convergencedistance' => 1, + 'conversationid' => 1, + 'copyrightfilename' => 1, + 'copyrightlen' => 1, + 'copyrighturl' => 1, + 'coringtablebest' => 1, + 'coringtablebetter' => 1, + 'coringtablegood' => 1, + 'correctionmethod' => 1, + 'costumedesigner' => 1, + 'count' => 1, + 'countinfo' => 1, + 'country-region' => 1, + 'coverartmimetype' => 1, + 'coverarttype' => 1, + 'coyotesense' => 1, + 'coyotestatus' => 1, + 'cpuarchitecture' => 1, + 'cpubyteorder' => 1, + 'cpucount' => 1, + 'cpusubtype' => 1, + 'cputype' => 1, + 'cpuversions' => 1, + 'cr2cfapattern' => 1, + 'crc' => 1, + 'crcdevelparams' => 1, + 'crd' => 1, + 'crdinfo' => 1, + 'createdby' => 1, + 'creatingapplication' => 1, + 'creatingtransform' => 1, + 'creationpathvector' => 1, + 'creatorapp' => 1, + 'creatorapplication' => 1, + 'creatorappversion' => 1, + 'creatoratom' => 1, + 'creatorbuildnumber' => 1, + 'creatorbuildnumber2' => 1, + 'creatorinfo' => 1, + 'creatormajorversion' => 1, + 'creatorminorversion' => 1, + 'creatorsoftware' => 1, + 'creatorversion' => 1, + 'crgbtoerimm0spline' => 1, + 'crgbtoerimm1spline' => 1, + 'crgbtoerimm2spline' => 1, + 'crgbtoerimm3spline' => 1, + 'crgbtoerimm4spline' => 1, + 'crgbtoerimm5spline' => 1, + 'crgbtoerimm6spline' => 1, + 'crgbtoerimm7spline' => 1, + 'crgbtoerimm8spline' => 1, + 'crgbtoerimm9spline' => 1, + 'cropdata' => 1, + 'cropinfo' => 1, + 'cropped' => 1, + 'cropxcommonoffset' => 1, + 'cropxoffset' => 1, + 'cropxoffset2' => 1, + 'cropxsize' => 1, + 'cropxviewpointnumber' => 1, + 'cropxviewpointnumber2' => 1, + 'cropycommonoffset' => 1, + 'cropyoffset' => 1, + 'cropyoffset2' => 1, + 'cropysize' => 1, + 'cropyviewpointnumber' => 1, + 'cropyviewpointnumber2' => 1, + 'cross-reference' => 1, + 'crossbarenable' => 1, + 'crossref' => 1, + 'crs' => 1, + 'crwparam' => 1, + 'cs0' => 1, + 'cs1' => 1, + 'ctmd' => 1, + 'cubemapproj' => 1, + 'cuepoint' => 1, + 'cuepointlabel' => 1, + 'cuepointnote' => 1, + 'cuepoints' => 1, + 'cuesheet' => 1, + 'currentbitrate' => 1, + 'currentiptcdigest' => 1, + 'currenttime' => 1, + 'currentuser' => 1, + 'cursorsize' => 1, + 'customfunctions10d' => 1, + 'customfunctions1d' => 1, + 'customfunctions2' => 1, + 'customfunctions20d' => 1, + 'customfunctions30d' => 1, + 'customfunctions350d' => 1, + 'customfunctions400d' => 1, + 'customfunctions5d' => 1, + 'customfunctionsd30' => 1, + 'customfunctionsd60' => 1, + 'customfunctionsunknown' => 1, + 'customsettingsd3' => 1, + 'customsettingsd300' => 1, + 'customsettingsd300s' => 1, + 'customsettingsd3s' => 1, + 'customsettingsd3x' => 1, + 'customsettingsd4' => 1, + 'customsettingsd40' => 1, + 'customsettingsd4s' => 1, + 'customsettingsd5' => 1, + 'customsettingsd500' => 1, + 'customsettingsd5000' => 1, + 'customsettingsd5100' => 1, + 'customsettingsd5200' => 1, + 'customsettingsd610' => 1, + 'customsettingsd700' => 1, + 'customsettingsd7000' => 1, + 'customsettingsd80' => 1, + 'customsettingsd800' => 1, + 'customsettingsd810' => 1, + 'customsettingsd850' => 1, + 'customsettingsd90' => 1, + 'customsettingsz9' => 1, + 'customtostandardpcc' => 1, + 'cxf' => 1, + 'd-lightinghqdata' => 1, + 'd-lightinghsdata' => 1, + 'd2' => 1, + 'daccountspervolt' => 1, + 'dacgainscoarse' => 1, + 'dacgainscoarseadjpreif41' => 1, + 'dacgainsfine' => 1, + 'dacvoltages' => 1, + 'dacvoltagesflush' => 1, + 'darkcorrectiontype' => 1, + 'darkmapscale' => 1, + 'darkrefoffsetnormal' => 1, + 'darkrefoffsettest' => 1, + 'darkthreshold' => 1, + 'darwindata' => 1, + 'data' => 1, + 'data1' => 1, + 'data2' => 1, + 'databasename' => 1, + 'datacreatedate' => 1, + 'datadump' => 1, + 'datadump2' => 1, + 'datainfo' => 1, + 'datakey' => 1, + 'datalen' => 1, + 'datalength' => 1, + 'datalocation' => 1, + 'datamodifydate' => 1, + 'dataobject' => 1, + 'dataobjectid' => 1, + 'dataobjectstatus' => 1, + 'dataobjecttitle' => 1, + 'dataoffset' => 1, + 'dataoffsets' => 1, + 'datapackets' => 1, + 'datapreparer' => 1, + 'datarate' => 1, + 'dataref' => 1, + 'datareference' => 1, + 'datasign' => 1, + 'datasize' => 1, + 'datasize64' => 1, + 'datatype' => 1, + 'datawindow' => 1, + 'dateaccessed' => 1, + 'datearchived' => 1, + 'datecompleted' => 1, + 'dateimported' => 1, + 'datelastsaved' => 1, + 'datemodified' => 1, + 'datepicturetaken' => 1, + 'datereceived' => 1, + 'datereleased' => 1, + 'datetime1' => 1, + 'datetime2' => 1, + 'datetimecreated' => 1, + 'datetimeend' => 1, + 'datetimegenerated' => 1, + 'datevisited' => 1, + 'daymat0' => 1, + 'daymat1' => 1, + 'daymat2' => 1, + 'daymat3' => 1, + 'daymat4' => 1, + 'daymat5' => 1, + 'daymat6' => 1, + 'daymat7' => 1, + 'daymat8' => 1, + 'daymat9' => 1, + 'db' => 1, + 'dblcoldcacthres1' => 1, + 'dblcoldcacthres2' => 1, + 'dc' => 1, + 'dcem' => 1, + 'dcme' => 1, + 'dcs3xxprocessinginfo' => 1, + 'dcs3xxprocessinginfoifd' => 1, + 'dctencodeversion' => 1, + 'dealeridnumber' => 1, + 'decimationmethod' => 1, + 'decimationprefilterwidth' => 1, + 'decode' => 1, + 'decodeconfig' => 1, + 'decodertable' => 1, + 'decodertablenumber' => 1, + 'decoderversion' => 1, + 'defaultaudiostream' => 1, + 'defaultchar' => 1, + 'defaultcmyk' => 1, + 'defaultdisplayheight' => 1, + 'defaultdisplaywidth' => 1, + 'defaultimagecolor' => 1, + 'defaultrgb' => 1, + 'defaultstyle' => 1, + 'defectconcealartcorrectthres' => 1, + 'defectconcealthrestable' => 1, + 'defectcount' => 1, + 'defectlist' => 1, + 'defectlistpacked' => 1, + 'defineobject' => 1, + 'definequantizationtable' => 1, + 'delay' => 1, + 'delaycols' => 1, + 'delaytime' => 1, + 'delimiter' => 1, + 'delta12to8spline' => 1, + 'delta8to12spline' => 1, + 'deltapngheader' => 1, + 'deltatype' => 1, + 'deltaxy' => 1, + 'department' => 1, + 'dependentimage1entrynumber' => 1, + 'dependentimage2entrynumber' => 1, + 'depth' => 1, + 'depthhwheight' => 1, + 'depthhwwidth' => 1, + 'depthmapdata' => 1, + 'depthmapdata2' => 1, + 'depthmapheight' => 1, + 'depthmapname' => 1, + 'depthmaptiff' => 1, + 'depthmapwidth' => 1, + 'depthswheight' => 1, + 'depthswwidth' => 1, + 'derivedimageref' => 1, + 'descender' => 1, + 'designer' => 1, + 'designerurl' => 1, + 'desiredreproductions' => 1, + 'destinationid' => 1, + 'detectedfacebounds' => 1, + 'detectedfaceid' => 1, + 'detectedfacerollangle' => 1, + 'detectedfaceyawangle' => 1, + 'detector' => 1, + 'detectorboard' => 1, + 'deviceattributes' => 1, + 'devicecontainer' => 1, + 'deviceid' => 1, + 'devicemanufacturer' => 1, + 'devicemfgdesc' => 1, + 'devicemodel' => 1, + 'devicemodeldesc' => 1, + 'devicename' => 1, + 'deviceorientation' => 1, + 'devicesettings' => 1, + 'dex' => 1, + 'dialect' => 1, + 'dicom' => 1, + 'dictionary' => 1, + 'dictionaryshortname' => 1, + 'difftilegains24t852822' => 1, + 'difftilegains602832' => 1, + 'digikam' => 1, + 'digitalcreationdatetime' => 1, + 'digitaleffectsname' => 1, + 'digitaleffectstype' => 1, + 'digitaleffectsversion' => 1, + 'digitalexposurebiases' => 1, + 'digitalexposuregains' => 1, + 'digitalimagebroker' => 1, + 'digitalsignature' => 1, + 'dimensions' => 1, + 'directionalatob0' => 1, + 'directionalatob1' => 1, + 'directionalatob2' => 1, + 'directionalatob3' => 1, + 'directionalbtoa0' => 1, + 'directionalbtoa1' => 1, + 'directionalbtoa2' => 1, + 'directionalbtoa3' => 1, + 'directionalbtod0' => 1, + 'directionalbtod1' => 1, + 'directionalbtod2' => 1, + 'directionalbtod3' => 1, + 'directionaldtob0' => 1, + 'directionaldtob1' => 1, + 'directionaldtob2' => 1, + 'directionaldtob3' => 1, + 'directors' => 1, + 'disableflagspresent' => 1, + 'discardobjects' => 1, + 'displayartist' => 1, + 'displayinfo' => 1, + 'displayresolution' => 1, + 'displaysize' => 1, + 'displayunits' => 1, + 'displaywindow' => 1, + 'displayxresolution' => 1, + 'displayxresolutionunit' => 1, + 'displayyresolution' => 1, + 'displayyresolutionunit' => 1, + 'dispose' => 1, + 'disposition' => 1, + 'distance' => 1, + 'distancefromhome' => 1, + 'distortinfo' => 1, + 'distortioninfo' => 1, + 'distortionversion' => 1, + 'distributedby' => 1, + 'distribution' => 1, + 'dittokey' => 1, + 'division' => 1, + 'dji_dtat' => 1, + 'djvuversion' => 1, + 'dlnaserverudn' => 1, + 'dlnasourceuri' => 1, + 'dlodata' => 1, + 'dlodatalength' => 1, + 'dloinfo' => 1, + 'dmeroderadius' => 1, + 'dmfillrejthresh' => 1, + 'dmnoisescale' => 1, + 'dmnumpatches' => 1, + 'dmpixelthresholdfactor' => 1, + 'dmsmoothrejthresh' => 1, + 'dmtrimfraction' => 1, + 'dmwindowthresholdfactor' => 1, + 'docclass' => 1, + 'docflags' => 1, + 'docmdp' => 1, + 'docrights' => 1, + 'docsecurity' => 1, + 'doctype' => 1, + 'documentinfo' => 1, + 'documentnumber' => 1, + 'documentusagerights' => 1, + 'dof' => 1, + 'donotshow' => 1, + 'dop' => 1, + 'dotrange' => 1, + 'dotsperinch' => 1, + 'downsampleby2hor' => 1, + 'downsampleby2hor3mpdcr' => 1, + 'downsampleby2ver' => 1, + 'downsampleby2ver3mpdcr' => 1, + 'downsampleby3hor' => 1, + 'downsampleby3ver' => 1, + 'downsampleby4hor' => 1, + 'downsampleby4ver' => 1, + 'downsampleby6hor' => 1, + 'downsampleby6ver' => 1, + 'dpxfilesize' => 1, + 'dr4' => 1, + 'dr4header' => 1, + 'driveserialnumber' => 1, + 'drivesettings' => 1, + 'drivetype' => 1, + 'drm' => 1, + 'drm_contentid' => 1, + 'drm_drmheader' => 1, + 'drm_drmheader_contentdistributor' => 1, + 'drm_drmheader_contentid' => 1, + 'drm_drmheader_individualizedversion' => 1, + 'drm_drmheader_keyid' => 1, + 'drm_drmheader_licenseacqurl' => 1, + 'drm_drmheader_subscriptioncontentid' => 1, + 'drm_e-bookbaseid' => 1, + 'drm_individualizedversion' => 1, + 'drm_keyid' => 1, + 'drm_lasignaturecert' => 1, + 'drm_lasignaturelicsrvcert' => 1, + 'drm_lasignatureprivkey' => 1, + 'drm_lasignaturerootcert' => 1, + 'drm_licenseacqurl' => 1, + 'drm_v1licenseacqurl' => 1, + 'drmcommerceid' => 1, + 'drmindividualizedversion' => 1, + 'drmkeyid' => 1, + 'drmserverid' => 1, + 'drone-dji' => 1, + 'dronepitch' => 1, + 'dronequaternion' => 1, + 'droneroll' => 1, + 'droneyaw' => 1, + 'dropbykeyword' => 1, + 'dropchunks' => 1, + 'dtcpiphost' => 1, + 'dtcpipport' => 1, + 'dtob0' => 1, + 'dtob1' => 1, + 'dtob2' => 1, + 'dtob3' => 1, + 'dtvcontent' => 1, + 'dualcameraimage' => 1, + 'dualcameraimagename' => 1, + 'dualshotextra' => 1, + 'ducky' => 1, + 'duedate' => 1, + 'dummycolsleft' => 1, + 'dummycolsright' => 1, + 'duotonehalftoninginfo' => 1, + 'duotoneimageinfo' => 1, + 'duotonetransferfuncs' => 1, + 'dustdeleteapplied' => 1, + 'dustinfo' => 1, + 'dvdid' => 1, + 'dwc' => 1, + 'dynamicranger128' => 1, + 'e-mail2' => 1, + 'e-mail3' => 1, + 'e-mailaddress' => 1, + 'e-maildisplayname' => 1, + 'e-maillist' => 1, + 'edgespline' => 1, + 'edgesplinehigh' => 1, + 'edgesplinelow' => 1, + 'edgesplinemed' => 1, + 'edit4data' => 1, + 'editdata' => 1, + 'editedby' => 1, + 'editor' => 1, + 'edittagarray' => 1, + 'effect' => 1, + 'effectivebw' => 1, + 'effectstrength' => 1, + 'effectsvisible' => 1, + 'effecttype' => 1, + 'eighteenpercentpoint' => 1, + 'eighthlanguage' => 1, + 'electricalextendermagnification' => 1, + 'electronicimagestabilization' => 1, + 'electronicvr' => 1, + 'elementarystreamtrack' => 1, + 'embeddedaudiofile' => 1, + 'embeddedaudiofilename' => 1, + 'embeddedfile' => 1, + 'embeddedfilename' => 1, + 'embeddedfileusagerights' => 1, + 'embeddedimage' => 1, + 'embeddedimage2' => 1, + 'embeddedimagecolorspace' => 1, + 'embeddedimagefilter' => 1, + 'embeddedimageheight' => 1, + 'embeddedimagename' => 1, + 'embeddedimagetype' => 1, + 'embeddedimagewidth' => 1, + 'embeddedjpg' => 1, + 'embeddedpng' => 1, + 'embeddedvideo' => 1, + 'embeddedvideofile' => 1, + 'embeddedvideotype' => 1, + 'emphasis' => 1, + 'empty' => 1, + 'encodedpixelsdimensions' => 1, + 'encodedusing' => 1, + 'encoderoptions' => 1, + 'encodersettings' => 1, + 'encodervendor' => 1, + 'encoderversion' => 1, + 'encodetime' => 1, + 'encoding' => 1, + 'encodingparams' => 1, + 'encodingprocess' => 1, + 'encodingscheme' => 1, + 'encodingsettings' => 1, + 'encrypt' => 1, + 'encryption' => 1, + 'enddate' => 1, + 'endianness' => 1, + 'endpoints' => 1, + 'endtime' => 1, + 'endtimecode' => 1, + 'entrypoint' => 1, + 'entrytype' => 1, + 'environmentmap' => 1, + 'envvardata' => 1, + 'eppim' => 1, + 'eprint' => 1, + 'epsoptions' => 1, + 'equipment' => 1, + 'equipmentifd' => 1, + 'equirectangularproj' => 1, + 'erimmnonlinearityspline' => 1, + 'erimmtocrgb0spline' => 1, + 'erimmtocrgb1spline' => 1, + 'erimmtocrgb2spline' => 1, + 'erimmtocrgb3spline' => 1, + 'erimmtocrgb4spline' => 1, + 'erimmtocrgb5spline' => 1, + 'erimmtocrgb6spline' => 1, + 'erimmtocrgb7spline' => 1, + 'erimmtocrgb8spline' => 1, + 'erimmtocrgb9spline' => 1, + 'erimmtonescale0spline' => 1, + 'erimmtonescale1spline' => 1, + 'erimmtonescale2spline' => 1, + 'erimmtonescale3spline' => 1, + 'erimmtonescale4spline' => 1, + 'erimmtonescale5spline' => 1, + 'erimmtonescale6spline' => 1, + 'erimmtonescale7spline' => 1, + 'erimmtonescale8spline' => 1, + 'erimmtonescale9spline' => 1, + 'error' => 1, + 'errorcorrection' => 1, + 'errorcorrectiontype' => 1, + 'escapestatus' => 1, + 'escchar' => 1, + 'estimatedatmospherictrans' => 1, + 'evalstate' => 1, + 'eventlogcapture' => 1, + 'eventlogprocess' => 1, + 'events' => 1, + 'evstepinfo' => 1, + 'exif_profile' => 1, + 'exifdata' => 1, + 'exifex' => 1, + 'exififd' => 1, + 'exifinfo' => 1, + 'exifinfo2' => 1, + 'exifinfo7' => 1, + 'exifinfo8' => 1, + 'exifinfo9' => 1, + 'exifinformation' => 1, + 'exifoffset' => 1, + 'exiftoolversion' => 1, + 'expandfilm' => 1, + 'expandfilterlens' => 1, + 'expandflashlamp' => 1, + 'expandlens' => 1, + 'expandscanner' => 1, + 'expandsoftware' => 1, + 'expirationspan' => 1, + 'expires' => 1, + 'exportimage' => 1, + 'exposurebias' => 1, + 'exposureheadroomfactor' => 1, + 'exposureinfo' => 1, + 'exposurereferencegain' => 1, + 'exposurereferenceoffset' => 1, + 'exposuretimes' => 1, + 'exposureunknown' => 1, + 'expressionmedia' => 1, + 'exrversion' => 1, + 'extcache' => 1, + 'extendedalbumname' => 1, + 'extendedartistname' => 1, + 'extendedaviheader' => 1, + 'extendedcontentdescr' => 1, + 'extendedcontentencryption' => 1, + 'extendedinfo' => 1, + 'extendedstreamprops' => 1, + 'extendedtracktitle' => 1, + 'extendedxmp' => 1, + 'extensionclassid' => 1, + 'extensioncreatedate' => 1, + 'extensiondescription' => 1, + 'extensionmodifydate' => 1, + 'extensionname' => 1, + 'extensionpersistence' => 1, + 'extensions' => 1, + 'extensis' => 1, + 'externalleading' => 1, + 'externaltriggercount' => 1, + 'extraflags' => 1, + 'extrainfo' => 1, + 'extrainfo2' => 1, + 'extrainfo3' => 1, + 'extrasamples' => 1, + 'extraticklocations' => 1, + 'f-stop' => 1, + 'face1birthday' => 1, + 'face1category' => 1, + 'face1name' => 1, + 'face2birthday' => 1, + 'face2category' => 1, + 'face2name' => 1, + 'face3birthday' => 1, + 'face3category' => 1, + 'face3name' => 1, + 'face4birthday' => 1, + 'face4category' => 1, + 'face4name' => 1, + 'face5birthday' => 1, + 'face5category' => 1, + 'face5name' => 1, + 'face6birthday' => 1, + 'face6category' => 1, + 'face6name' => 1, + 'face7birthday' => 1, + 'face7category' => 1, + 'face7name' => 1, + 'face8birthday' => 1, + 'face8category' => 1, + 'face8name' => 1, + 'facedetect1' => 1, + 'facedetect2' => 1, + 'facedetect3' => 1, + 'facedetected' => 1, + 'facedetinfo' => 1, + 'faceinfo' => 1, + 'faceinfo1' => 1, + 'faceinfo2' => 1, + 'faceinfoa' => 1, + 'faceinfolength' => 1, + 'faceinfooffset' => 1, + 'faceitem' => 1, + 'facenumbers' => 1, + 'facepos' => 1, + 'facerec' => 1, + 'facerecinfo' => 1, + 'facesize' => 1, + 'factorywhitegainsdaylight' => 1, + 'factorywhiteoffsetsdaylight' => 1, + 'farklewhitethreshold' => 1, + 'fastseek' => 1, + 'faxprofile' => 1, + 'faxrecvparams' => 1, + 'faxrecvtime' => 1, + 'faxsubaddress' => 1, + 'fdsc' => 1, + 'fedexedr' => 1, + 'fffheader' => 1, + 'fieldmdp' => 1, + 'fieldpermissions' => 1, + 'fifthlanguage' => 1, + 'file1duration' => 1, + 'file1length' => 1, + 'file1md5sum' => 1, + 'file1media' => 1, + 'file1path' => 1, + 'file1pathutf-8' => 1, + 'fileaccessdate' => 1, + 'fileas' => 1, + 'fileattributes' => 1, + 'fileblockcount' => 1, + 'fileblocksize' => 1, + 'filecount' => 1, + 'filedescription' => 1, + 'filedeviceid' => 1, + 'filedevicenumber' => 1, + 'fileflags' => 1, + 'fileflagsmask' => 1, + 'filefunctionflags' => 1, + 'fileglobalprofile' => 1, + 'fileguid' => 1, + 'filehardlinks' => 1, + 'fileid' => 1, + 'fileinfo' => 1, + 'fileinfolen' => 1, + 'fileinfolen2' => 1, + 'fileinfoproperties' => 1, + 'fileinfoversion' => 1, + 'fileinodechangedate' => 1, + 'fileinodenumber' => 1, + 'filelength' => 1, + 'fileos' => 1, + 'fileowner' => 1, + 'filepath' => 1, + 'fileprofileversion' => 1, + 'fileproperties' => 1, + 'files' => 1, + 'filesequence' => 1, + 'filesize' => 1, + 'filesizebytes' => 1, + 'filesubtype' => 1, + 'filetype' => 1, + 'filetypeextension' => 1, + 'fileurl' => 1, + 'fileversionnumber' => 1, + 'fillattributes' => 1, + 'fillmethod' => 1, + 'filmbrand' => 1, + 'filmcategory' => 1, + 'filmframenumber' => 1, + 'filmgencode' => 1, + 'filmproductcode' => 1, + 'filmrollnumber' => 1, + 'filmsize' => 1, + 'filter' => 1, + 'filterinfo' => 1, + 'filtering' => 1, + 'filtermodel' => 1, + 'filterparametersbinary' => 1, + 'filterparameterscustomcustomdata' => 1, + 'filterparametersexportexportdata' => 1, + 'filterpartnumber' => 1, + 'filterserialnumber' => 1, + 'finalflushsequence' => 1, + 'finalframeblocks' => 1, + 'finetune' => 1, + 'finishedfileprocessingrequest' => 1, + 'finishipaversion' => 1, + 'finishipfversion' => 1, + 'firmwareinfo' => 1, + 'firstchar' => 1, + 'firstflushsequence' => 1, + 'firstlanguage' => 1, + 'firstlines' => 1, + 'firstlinetransfertiming' => 1, + 'firstname' => 1, + 'firstobject' => 1, + 'firstobjectid' => 1, + 'fisheyefilter' => 1, + 'flac' => 1, + 'flagcolor' => 1, + 'flags' => 1, + 'flagstatus' => 1, + 'flashattributes' => 1, + 'flashexpcomp' => 1, + 'flashinfo' => 1, + 'flashinfo0100' => 1, + 'flashinfo0102' => 1, + 'flashinfo0103' => 1, + 'flashinfo0106' => 1, + 'flashinfo0107' => 1, + 'flashinfo0300' => 1, + 'flashinfounknown' => 1, + 'flashinfoversion' => 1, + 'flashmat0' => 1, + 'flashmat1' => 1, + 'flashmat2' => 1, + 'flashmat3' => 1, + 'flashmat4' => 1, + 'flashmat5' => 1, + 'flashmat6' => 1, + 'flashmat7' => 1, + 'flashmat8' => 1, + 'flashmat9' => 1, + 'flashpixstreamfieldoffset' => 1, + 'flashpixstreampathname' => 1, + 'flashpower' => 1, + 'flashsyncmode' => 1, + 'flashttlmode' => 1, + 'flashused' => 1, + 'flashversion' => 1, + 'flavor' => 1, + 'flightdegree' => 1, + 'flightspeed' => 1, + 'flipstatus' => 1, + 'flir' => 1, + 'flir_gps' => 1, + 'flir_moreinfo' => 1, + 'flir_params' => 1, + 'flir_parts' => 1, + 'flir_serial' => 1, + 'flir_unknown' => 1, + 'flir_unknownuuid' => 1, + 'fluormat0' => 1, + 'fluormat1' => 1, + 'fluormat2' => 1, + 'fluormat3' => 1, + 'fluormat4' => 1, + 'fluormat5' => 1, + 'fluormat6' => 1, + 'fluormat7' => 1, + 'fluormat8' => 1, + 'fluormat9' => 1, + 'flushtiming' => 1, + 'flyingstate' => 1, + 'focalinfo' => 1, + 'focallength35efl' => 1, + 'focallength35mm' => 1, + 'focalplanecolorimetryestimates' => 1, + 'focalrange' => 1, + 'focusdistance2' => 1, + 'focusedgemap' => 1, + 'focusframesize' => 1, + 'focusinfo' => 1, + 'focusinfoifd' => 1, + 'focuspointbrightness' => 1, + 'focuspointselectionspeed' => 1, + 'focuspos' => 1, + 'focussettings' => 1, + 'folder' => 1, + 'folderpath' => 1, + 'follow-meanimation' => 1, + 'follow-memode' => 1, + 'font' => 1, + 'fontsize' => 1, + 'fontsubfamily' => 1, + 'fontsubfamilyid' => 1, + 'fonttable' => 1, + 'fontweight' => 1, + 'footerposition' => 1, + 'footnotes' => 1, + 'form' => 1, + 'formattag' => 1, + 'formatter' => 1, + 'formatversion' => 1, + 'formatversiontime' => 1, + 'formextrausagerights' => 1, + 'formfields' => 1, + 'formusagerights' => 1, + 'forwardto' => 1, + 'fotostation' => 1, + 'fourcc' => 1, + 'fourcc1' => 1, + 'fourcc2' => 1, + 'fourcc2len' => 1, + 'fourcc3' => 1, + 'fourcc3len' => 1, + 'fourthlanguage' => 1, + 'fov' => 1, + 'fovcot' => 1, + 'fpfversion' => 1, + 'fpv' => 1, + 'fpxr' => 1, + 'fractalparameters' => 1, + 'fragmentlist' => 1, + 'fragmenttable' => 1, + 'frame' => 1, + 'framebaseview' => 1, + 'frameexposuretime' => 1, + 'frameid' => 1, + 'frameinfo' => 1, + 'framepriority' => 1, + 'framesize' => 1, + 'framesizemax' => 1, + 'framesizemin' => 1, + 'framespersecond' => 1, + 'frameview' => 1, + 'framinggriddisplay' => 1, + 'free' => 1, + 'free-busystatus' => 1, + 'freebytecounts' => 1, + 'freeoffsets' => 1, + 'frequency' => 1, + 'fromaddresses' => 1, + 'fromnames' => 1, + 'fstype' => 1, + 'fujifilm' => 1, + 'fujifilmffmv' => 1, + 'fujifilmmvtg' => 1, + 'fujifilmtags' => 1, + 'fujiifd' => 1, + 'fujilayout' => 1, + 'fullname' => 1, + 'fullscreen' => 1, + 'fusion360fly' => 1, + 'fusionmode' => 1, + 'fusionypr' => 1, + 'gain' => 1, + 'gaindeaddata' => 1, + 'gaindeadmapimage' => 1, + 'gaindeadmapimageheight' => 1, + 'gaindeadmapimagetype' => 1, + 'gaindeadmapimagewidth' => 1, + 'gammablue' => 1, + 'gammagreen' => 1, + 'gammainfo' => 1, + 'gammared' => 1, + 'gammatable' => 1, + 'gamut' => 1, + 'gamutboundarydescription0' => 1, + 'gamutboundarydescription1' => 1, + 'gamutboundarydescription2' => 1, + 'gamutboundarydescription3' => 1, + 'gapless' => 1, + 'gaudio' => 1, + 'gaussianweights' => 1, + 'gcamera' => 1, + 'gcreations' => 1, + 'gdepth' => 1, + 'geminfo' => 1, + 'genbalance' => 1, + 'gender' => 1, + 'generallevelidc' => 1, + 'generalprofileidc' => 1, + 'generalprofilespace' => 1, + 'generaltierflag' => 1, + 'generator' => 1, + 'generatorversion' => 1, + 'genflags' => 1, + 'gengraphicsmode' => 1, + 'genmediaheader' => 1, + 'genmediainfo' => 1, + 'genmediaversion' => 1, + 'genopcolor' => 1, + 'genprofilecompatibilityflags' => 1, + 'genr' => 1, + 'geo' => 1, + 'geogangularunits' => 1, + 'geogangularunitsize' => 1, + 'geogazimuthunits' => 1, + 'geogcitation' => 1, + 'geogellipsoid' => 1, + 'geoggeodeticdatum' => 1, + 'geoginvflattening' => 1, + 'geoglinearunits' => 1, + 'geoglinearunitsize' => 1, + 'geogprimemeridian' => 1, + 'geogprimemeridianlong' => 1, + 'geographictype' => 1, + 'geogsemimajoraxis' => 1, + 'geogsemiminoraxis' => 1, + 'geogtowgs84' => 1, + 'geometricdistortionparams' => 1, + 'geotiffversion' => 1, + 'getty' => 1, + 'gfocus' => 1, + 'gidcver' => 1, + 'gidpver' => 1, + 'gifapplicationextension' => 1, + 'gifgraphiccontrolextension' => 1, + 'gifplaintextextension' => 1, + 'gifversion' => 1, + 'gimage' => 1, + 'gimbaldegree' => 1, + 'gimbalpitch' => 1, + 'gimbalroll' => 1, + 'gimbalyaw' => 1, + 'gipc_cpld' => 1, + 'gipcver' => 1, + 'givenname' => 1, + 'gixiver' => 1, + 'globalinfo' => 1, + 'globalparametersifd' => 1, + 'globalpixelsize' => 1, + 'googlebot' => 1, + 'gopro' => 1, + 'goprogpmf' => 1, + 'gpano' => 1, + 'gpmd_fmas' => 1, + 'gpmd_gopro' => 1, + 'gpmd_kingslim' => 1, + 'gpmd_rove' => 1, + 'gps' => 1, + 'gps360fly' => 1, + 'gpsaltituderaw' => 1, + 'gpsdatalist' => 1, + 'gpsdatalist2' => 1, + 'gpsdatetimeraw' => 1, + 'gpsdestaltitude' => 1, + 'gpsframingaltitude' => 1, + 'gpsframinglatitude' => 1, + 'gpsframinglongitude' => 1, + 'gpshorizontalaccuracy' => 1, + 'gpsinfo' => 1, + 'gpslatituderaw' => 1, + 'gpslog' => 1, + 'gpslongituderaw' => 1, + 'gpsmode' => 1, + 'gpspos' => 1, + 'gpsraw' => 1, + 'gpsspeed3d' => 1, + 'gpsspeedaccuracy' => 1, + 'gpsspeedraw' => 1, + 'gpsspeedx' => 1, + 'gpsspeedy' => 1, + 'gpsspeedz' => 1, + 'gpstargetaltitude' => 1, + 'gpstargetlatitude' => 1, + 'gpstargetlongitude' => 1, + 'gpstrackraw' => 1, + 'gpsvalid' => 1, + 'gpsvelocitydown' => 1, + 'gpsvelocityeast' => 1, + 'gpsvelocitynorth' => 1, + 'gpsvelocityup' => 1, + 'gpsverticalaccuracy' => 1, + 'grainybwfilter' => 1, + 'graphicconverter' => 1, + 'graphicsmode' => 1, + 'graphicstechnologystandardoutput' => 1, + 'grayresponsecurve' => 1, + 'graytrc' => 1, + 'greenadjust' => 1, + 'greenendpoint' => 1, + 'greengain' => 1, + 'greenmask' => 1, + 'greenmatrixcolumn' => 1, + 'greenprimary' => 1, + 'greensample' => 1, + 'greentrc' => 1, + 'greenx' => 1, + 'greeny' => 1, + 'gridguidesinfo' => 1, + 'groupareac1' => 1, + 'groupcaption' => 1, + 'groupmutualexclusion' => 1, + 'groups' => 1, + 'gsensor' => 1, + 'gspherical' => 1, + 'gtcitation' => 1, + 'gtmodeltype' => 1, + 'gtrastertype' => 1, + 'gyro360fly' => 1, + 'gyromode' => 1, + 'gyroscope' => 1, + 'gyroscopeunknown' => 1, + 'gyroypr' => 1, + 'handler' => 1, + 'handlerclass' => 1, + 'handlerdescription' => 1, + 'handlertype' => 1, + 'handlervendorid' => 1, + 'hardpostpadding' => 1, + 'hardprepadding' => 1, + 'hasarbitrarydatastream' => 1, + 'hasattachedimages' => 1, + 'hasattachments' => 1, + 'hasaudio' => 1, + 'hascolormap' => 1, + 'hascuepoints' => 1, + 'hasfiletransferstream' => 1, + 'hasflag' => 1, + 'hasicc' => 1, + 'hasimage' => 1, + 'haskeyframes' => 1, + 'hasmetadata' => 1, + 'hasrealmergeddata' => 1, + 'hasscript' => 1, + 'hasselbladexif' => 1, + 'hasselbladrawimage' => 1, + 'hasvideo' => 1, + 'hasxfa' => 1, + 'hcusage' => 1, + 'hdcontent' => 1, + 'hdmibitdepth' => 1, + 'hdmiexternalrecorder' => 1, + 'hdmioutputhdr' => 1, + 'hdmioutputrange' => 1, + 'hdrinfo' => 1, + 'hdrl' => 1, + 'hdrtoninginfo' => 1, + 'header' => 1, + 'header4' => 1, + 'headerext' => 1, + 'headerextension' => 1, + 'headersize' => 1, + 'headerversion' => 1, + 'headingpairs' => 1, + 'heightresolution' => 1, + 'hevcconfiguration' => 1, + 'hevcconfigurationversion' => 1, + 'hiddenslides' => 1, + 'highbitdepth' => 1, + 'highisomode' => 1, + 'highlightdata' => 1, + 'highlightendpoints' => 1, + 'highnote' => 1, + 'highvelocity' => 1, + 'hintformat' => 1, + 'hintheader' => 1, + 'hintinfo' => 1, + 'hintsampledesc' => 1, + 'hinttrackinfo' => 1, + 'hinttrackversion' => 1, + 'histogram' => 1, + 'historybuffersize' => 1, + 'hmaphandling' => 1, + 'hmcolrejthresh' => 1, + 'hmcolthresh' => 1, + 'hmpixthresh' => 1, + 'hmwsize' => 1, + 'hobbies' => 1, + 'homeaddress' => 1, + 'homecity' => 1, + 'homecountry-region' => 1, + 'homefax' => 1, + 'homephone' => 1, + 'homepobox' => 1, + 'homepostalcode' => 1, + 'homestateorprovince' => 1, + 'homestreet' => 1, + 'horizontalresolution' => 1, + 'horizontalscale' => 1, + 'hostsoftwareexportversion' => 1, + 'hotkey' => 1, + 'howpublished' => 1, + 'hp_tdhd' => 1, + 'hrnoiselines' => 1, + 'htcbinary' => 1, + 'htcinfo' => 1, + 'htctrack' => 1, + 'http-equiv' => 1, + 'httphostheader' => 1, + 'huawei' => 1, + 'huffmantable' => 1, + 'huffmantablelength' => 1, + 'huffmantablevalue' => 1, + 'hyperfocaldistance' => 1, + 'hyperlapsdebuginfo' => 1, + 'hyperlinkbase' => 1, + 'hyperlinks' => 1, + 'hyperlinkschanged' => 1, + 'iad1' => 1, + 'icc_untagged' => 1, + 'iccbased' => 1, + 'iconenvdata' => 1, + 'iconfilename' => 1, + 'iconindex' => 1, + 'ics' => 1, + 'id' => 1, + 'id3' => 1, + 'id3size' => 1, + 'id3v1' => 1, + 'id3v1_enh' => 1, + 'id3v2_2' => 1, + 'id3v2_3' => 1, + 'id3v2_4' => 1, + 'idc2_ifd' => 1, + 'idc_ifd' => 1, + 'idcpreviewimage' => 1, + 'idependentanddisposablesamples' => 1, + 'idlesequence' => 1, + 'idletiming' => 1, + 'idsbasevalue' => 1, + 'ifd0' => 1, + 'ifd0_offset' => 1, + 'ihl_exif' => 1, + 'ihldata' => 1, + 'illuminantdetectordata' => 1, + 'illuminantdetecttable' => 1, + 'illustrator' => 1, + 'im' => 1, + 'imaddresses' => 1, + 'image' => 1, + 'image2description' => 1, + 'image3description' => 1, + 'image4description' => 1, + 'image5description' => 1, + 'image6description' => 1, + 'image7description' => 1, + 'image8description' => 1, + 'imagearrangement' => 1, + 'imageboardid' => 1, + 'imagebounds' => 1, + 'imagebytecount' => 1, + 'imageclass' => 1, + 'imagecolor' => 1, + 'imagecolorindicator' => 1, + 'imagecolorvalue' => 1, + 'imagecompressiontable' => 1, + 'imagedatadiscard' => 1, + 'imagedataoffset' => 1, + 'imagedepth' => 1, + 'imageelements' => 1, + 'imageexpansiontable' => 1, + 'imagefields' => 1, + 'imagefilecharacteristics' => 1, + 'imagefilename' => 1, + 'imageformat' => 1, + 'imagefullheight' => 1, + 'imagefullwidth' => 1, + 'imageheader' => 1, + 'imageid' => 1, + 'imageinfo' => 1, + 'imagelayer' => 1, + 'imagelength' => 1, + 'imagelimitexposurebias' => 1, + 'imagemagnificationdescriptor' => 1, + 'imagemedium' => 1, + 'imagemodulationexposurebias' => 1, + 'imageoffset' => 1, + 'imagepixeldepth' => 1, + 'imagepixelformat' => 1, + 'imageprintstatus' => 1, + 'imageprocessingifd' => 1, + 'imageprofile' => 1, + 'imageprops' => 1, + 'imagerboardid' => 1, + 'imagereadydatasets' => 1, + 'imagereadyvariables' => 1, + 'imagereferencepoints' => 1, + 'imageresources' => 1, + 'imagerinitialtimingcode' => 1, + 'imagerlogicprogram' => 1, + 'imagerotation' => 1, + 'imagerotationstatus' => 1, + 'imagertimingdata' => 1, + 'imagesensorgain' => 1, + 'imagesourceek' => 1, + 'imagespatialextent' => 1, + 'imagestatus' => 1, + 'imagetoolbar' => 1, + 'imageuidlist' => 1, + 'imageversion' => 1, + 'imageworkstationmake' => 1, + 'imgprofbacktype' => 1, + 'imgprofname' => 1, + 'imgproftype' => 1, + 'imgprofversion' => 1, + 'immediatedatabytes' => 1, + 'importance' => 1, + 'imprint' => 1, + 'inbandratingattributes' => 1, + 'inbandratinglevel' => 1, + 'inbandratingsystem' => 1, + 'includedfileid' => 1, + 'incomplete' => 1, + 'index' => 1, + 'index01' => 1, + 'index02' => 1, + 'index03' => 1, + 'index04' => 1, + 'index05' => 1, + 'index06' => 1, + 'index07' => 1, + 'index08' => 1, + 'index09' => 1, + 'index10' => 1, + 'index11' => 1, + 'index12' => 1, + 'index13' => 1, + 'index14' => 1, + 'index15' => 1, + 'index16' => 1, + 'indexable' => 1, + 'indexed' => 1, + 'indexedcolortablecount' => 1, + 'indexoffset' => 1, + 'indexparameters' => 1, + 'indications' => 1, + 'info' => 1, + 'ingrreserved' => 1, + 'initialdelaysamples' => 1, + 'initialdisplayeffect' => 1, + 'initializationvector' => 1, + 'initializeddatasize' => 1, + 'initialobjectdescriptor' => 1, + 'initials' => 1, + 'inknames' => 1, + 'inputdataobjectlist' => 1, + 'inputdevicename' => 1, + 'inputdeviceserialnumber' => 1, + 'inputheight' => 1, + 'inputorientation' => 1, + 'inputuniformity' => 1, + 'inputwidth' => 1, + 'insertmode' => 1, + 'insetnwpixelx' => 1, + 'insetnwpixely' => 1, + 'insta360' => 1, + 'institution' => 1, + 'instructionset' => 1, + 'insv' => 1, + 'integratetiming' => 1, + 'intellectualproperty' => 1, + 'intellectualpropertynotes' => 1, + 'intensitystereo' => 1, + 'intergraphflagregisters' => 1, + 'intergraphpacketdata' => 1, + 'interlace' => 1, + 'interleavedfield' => 1, + 'internalidnumber' => 1, + 'internalleading' => 1, + 'internalname' => 1, + 'internalversionnumber' => 1, + 'internationaltext' => 1, + 'internetradiostationname' => 1, + 'internetradiostationowner' => 1, + 'internetradiostationurl' => 1, + 'interopoffset' => 1, + 'interpolationcoefficients' => 1, + 'interpolationcoefficients3mp' => 1, + 'interpolationcoefficients6mp' => 1, + 'interpretedby' => 1, + 'inversemonitormatrix' => 1, + 'inverserimnonlinearity' => 1, + 'inversesbalog12transform' => 1, + 'inversesbalogtransform' => 1, + 'invnifnonlinearity' => 1, + 'involvedpeople' => 1, + 'ipmpcontrol' => 1, + 'iptc_profile' => 1, + 'iptcapplication' => 1, + 'iptccore' => 1, + 'iptcdata' => 1, + 'iptcenvelope' => 1, + 'iptcext' => 1, + 'iptcfotostation' => 1, + 'iptcnewsphoto' => 1, + 'iptcobjectdata' => 1, + 'iptcpostobjectdata' => 1, + 'iptcpreobjectdata' => 1, + 'irwindowtemperature' => 1, + 'irwindowtransmission' => 1, + 'is_protected' => 1, + 'is_trusted' => 1, + 'isartbokeh' => 1, + 'isattachment' => 1, + 'isbasefont' => 1, + 'iscompleted' => 1, + 'isdeleted' => 1, + 'isfixedpitch' => 1, + 'isfixedv' => 1, + 'isinfoa100' => 1, + 'isnetworkfeed' => 1, + 'isocalibrationgaintable' => 1, + 'isoinfo' => 1, + 'isonline' => 1, + 'isospeeds' => 1, + 'isotherm1color' => 1, + 'isotherm2color' => 1, + 'isprotected' => 1, + 'isrc' => 1, + 'isrcnumber' => 1, + 'isrecurring' => 1, + 'isvbr' => 1, + 'it8header' => 1, + 'italic' => 1, + 'italicangle' => 1, + 'itch' => 1, + 'item' => 1, + 'item0032' => 1, + 'itemid' => 1, + 'iteminfoentry' => 1, + 'iteminformation' => 1, + 'itemlist' => 1, + 'itemlocation' => 1, + 'itemproperties' => 1, + 'itempropertyassociation' => 1, + 'itempropertycontainer' => 1, + 'itemprotection' => 1, + 'itemreference' => 1, + 'itemtool' => 1, + 'itemvendorid' => 1, + 'iterationcount' => 1, + 'iterationendaction' => 1, + 'iterationmax' => 1, + 'iterationminmax' => 1, + 'iterations' => 1, + 'itunesinfo' => 1, + 'itunesmediatype' => 1, + 'itunmovi' => 1, + 'itunsmpb' => 1, + 'ituntool' => 1, + 'ixml' => 1, + 'jbigoptions' => 1, + 'jfif' => 1, + 'jfifversion' => 1, + 'jfxx' => 1, + 'jngheader' => 1, + 'jobtitle' => 1, + 'journal' => 1, + 'jp2header' => 1, + 'jp2signature' => 1, + 'jpeg-hdr' => 1, + 'jpeg-hdrversion' => 1, + 'jpeg-likedata' => 1, + 'jpeg_quality' => 1, + 'jpegactables' => 1, + 'jpegdctables' => 1, + 'jpegdigest' => 1, + 'jpegexifdata' => 1, + 'jpegimagelength' => 1, + 'jpeginfo' => 1, + 'jpeglosslesspredictors' => 1, + 'jpegpointtransforms' => 1, + 'jpegproc' => 1, + 'jpegprocess' => 1, + 'jpegqtablebest' => 1, + 'jpegqtablebetter' => 1, + 'jpegqtablegood' => 1, + 'jpegqtables' => 1, + 'jpegqualityestimate' => 1, + 'jpegrestartinterval' => 1, + 'jpegtables' => 1, + 'jplcartoifd' => 1, + 'jps' => 1, + 'jpscomment' => 1, + 'jpsflags' => 1, + 'jpslayout' => 1, + 'jpsseparation' => 1, + 'jpstype' => 1, + 'jsondata' => 1, + 'jsonmetadata' => 1, + 'jumbf' => 1, + 'jumbfbox' => 1, + 'jumbfdescr' => 1, + 'jumdid' => 1, + 'jumdlabel' => 1, + 'jumdsignature' => 1, + 'jumdtoggles' => 1, + 'jumdtype' => 1, + 'jumptoxpep' => 1, + 'junk' => 1, + 'jxlcodestream' => 1, + 'k1' => 1, + 'k2' => 1, + 'k3' => 1, + 'k4' => 1, + 'kbytesize' => 1, + 'kdc_ifd' => 1, + 'keepexposurewithteleconverter' => 1, + 'keepuntil' => 1, + 'kelvinwb' => 1, + 'keycode' => 1, + 'keyframepositions' => 1, + 'keyframestimes' => 1, + 'keyid' => 1, + 'keys' => 1, + 'kf' => 1, + 'kf8coveruri' => 1, + 'khufui0thresholds' => 1, + 'khufui1thresholds' => 1, + 'khufui2thresholds' => 1, + 'khufui3thresholds' => 1, + 'khufui4thresholds' => 1, + 'khufui5thresholds' => 1, + 'khufulinearbluemixingcoefficient' => 1, + 'khufulineargreenmixingcoefficient' => 1, + 'khufulinearredmixingcoefficient' => 1, + 'khufusigmagaussianweights' => 1, + 'khufusigmascalingfactors14mp' => 1, + 'khufusigmascalingfactors3mp' => 1, + 'khufusigmascalingfactors6mp' => 1, + 'khufuuspacec2mixingcoefficient' => 1, + 'kids' => 1, + 'kilocalories' => 1, + 'kinds' => 1, + 'kj' => 1, + 'kk' => 1, + 'klut' => 1, + 'klut12tolin12' => 1, + 'knownfolderdata' => 1, + 'kodak' => 1, + 'kodak_frea' => 1, + 'kodakbordersifd' => 1, + 'kodakdcmd' => 1, + 'kodakeffectsifd' => 1, + 'kodakfree' => 1, + 'kodakifd' => 1, + 'kodakmake' => 1, + 'kodaktags' => 1, + 'konicaminolta' => 1, + 'konicaminoltatags' => 1, + 'label0' => 1, + 'label1' => 1, + 'label2' => 1, + 'label3' => 1, + 'labeledtext' => 1, + 'lamebitrate' => 1, + 'lameheader' => 1, + 'lamelowpassfilter' => 1, + 'lamemethod' => 1, + 'lamequality' => 1, + 'lamestereomode' => 1, + 'lamevbrquality' => 1, + 'languagecode' => 1, + 'languagelist' => 1, + 'largestpacketduration' => 1, + 'largestpacketsize' => 1, + 'lastauthor' => 1, + 'lastbackupdate' => 1, + 'lastchar' => 1, + 'lastkeyframetime' => 1, + 'lastmodifiedby' => 1, + 'lastmodifier' => 1, + 'lastname' => 1, + 'lastobject' => 1, + 'lastobjectid' => 1, + 'lastprinted' => 1, + 'lastsavedby' => 1, + 'lasttimestamp' => 1, + 'lastupdate' => 1, + 'lastupdatetime' => 1, + 'layerblendmodes' => 1, + 'layercomps' => 1, + 'layercount' => 1, + 'layergroupsenabledid' => 1, + 'layerids' => 1, + 'layermodifydates' => 1, + 'layernames' => 1, + 'layeropacities' => 1, + 'layerrectangles' => 1, + 'layers' => 1, + 'layerselectionids' => 1, + 'layersgroupinfo' => 1, + 'layerunicodenames' => 1, + 'layout' => 1, + 'layoutflags' => 1, + 'lcdedgemapslope' => 1, + 'lcdedgemapx1' => 1, + 'lcdedgemapx2' => 1, + 'lcdedgemapx3' => 1, + 'lcdedgemapx4' => 1, + 'lcdedgespline' => 1, + 'lcdgammatable' => 1, + 'lcdgammatablechickfix' => 1, + 'lcdgammatablemarvin' => 1, + 'lcdhistlut0' => 1, + 'lcdhistlut1' => 1, + 'lcdhistlut2' => 1, + 'lcdhistlut3' => 1, + 'lcdhistlut4' => 1, + 'lcdhistlut5' => 1, + 'lcdhistlut6' => 1, + 'lcdhistlut7' => 1, + 'lcdhistlut8' => 1, + 'lcdhistlut9' => 1, + 'lcdlinearclipvalue' => 1, + 'lcdsharpeningf1' => 1, + 'lcdsharpeningf2' => 1, + 'lcdsharpeningf3' => 1, + 'lcdsharpeningf4' => 1, + 'lcdstepyvalues' => 1, + 'lcdstepyvalueschickfix' => 1, + 'lcdstepyvaluesmarvin' => 1, + 'leadperformer' => 1, + 'leafautoactive' => 1, + 'leafautobasename' => 1, + 'leafdata' => 1, + 'leafhotfolder' => 1, + 'leafopenprochdr' => 1, + 'leafoutputfiletype' => 1, + 'leafsaveselection' => 1, + 'leafsubifd' => 1, + 'leftdarkcol1' => 1, + 'leftdarkcol2' => 1, + 'leftdarkrect' => 1, + 'leftmag' => 1, + 'leftmargin' => 1, + 'legalcopyright' => 1, + 'legaltrademarks' => 1, + 'leicaleic' => 1, + 'length' => 1, + 'lens35efl' => 1, + 'lensattached' => 1, + 'lenscorr' => 1, + 'lensdata' => 1, + 'lensdata0100' => 1, + 'lensdata0101' => 1, + 'lensdata0201' => 1, + 'lensdata0204' => 1, + 'lensdata0400' => 1, + 'lensdata0402' => 1, + 'lensdata0403' => 1, + 'lensdata0800' => 1, + 'lensdataunknown' => 1, + 'lensdataversion' => 1, + 'lensfacing' => 1, + 'lensinfoq' => 1, + 'lensmaker' => 1, + 'lensnumber' => 1, + 'lenspartnumber' => 1, + 'lensrec' => 1, + 'lensshading' => 1, + 'lenstableindex' => 1, + 'levelinfo' => 1, + 'libraryid' => 1, + 'libraryname' => 1, + 'licenseinfourl' => 1, + 'lightingopt' => 1, + 'lightness' => 1, + 'lightroomworkflow' => 1, + 'lights' => 1, + 'lightvalue' => 1, + 'limage' => 1, + 'limitaf-areamodeselautoanimals' => 1, + 'limitaf-areamodeselautopeople' => 1, + 'limitaf-areamodeseldynamic' => 1, + 'limitaf-areamodeselwidelanimals' => 1, + 'limitaf-areamodeselwidelpeople' => 1, + 'limitafareamodesel3d' => 1, + 'limitafareamodeseld105' => 1, + 'limitafareamodeseld25' => 1, + 'limitafareamodeseld49' => 1, + 'limitafareamodeseld9' => 1, + 'limitafareamodeselgroup' => 1, + 'limitafareamodeselgroupc1' => 1, + 'limitafareamodeselgroupc2' => 1, + 'limitreleasemodeselmirror-up' => 1, + 'limitreleasemodeselq' => 1, + 'limitreleasemodeseltimer' => 1, + 'limitselectableimagearea5to4' => 1, + 'lin12toklut12' => 1, + 'lin12toklut8' => 1, + 'linearitysplinetags' => 1, + 'linearizationcoefficients1' => 1, + 'linearizationcoefficients2' => 1, + 'linearized' => 1, + 'linecount' => 1, + 'lineorder' => 1, + 'lines' => 1, + 'linkedprofilename' => 1, + 'linkerversion' => 1, + 'linkgoodput' => 1, + 'linkinfo' => 1, + 'linkquality' => 1, + 'linkstatus' => 1, + 'linksuptodate' => 1, + 'linktarget' => 1, + 'linlogtable' => 1, + 'listtype' => 1, + 'lit' => 1, + 'livephotoinfo' => 1, + 'ln0' => 1, + 'ln1' => 1, + 'localbasepath' => 1, + 'localdeltatype' => 1, + 'localeindicator' => 1, + 'localpositionned' => 1, + 'locationinfo' => 1, + 'lockedpropertylist' => 1, + 'locks' => 1, + 'loginfo' => 1, + 'loglintable' => 1, + 'logoiconurl' => 1, + 'logourl' => 1, + 'lookheadbacktype' => 1, + 'lookheader' => 1, + 'lookheadname' => 1, + 'lookheadtype' => 1, + 'lookheadversion' => 1, + 'lookmat0' => 1, + 'lookmat1' => 1, + 'lookmat2' => 1, + 'lookmat3' => 1, + 'lookmat4' => 1, + 'lookmat5' => 1, + 'lookmat6' => 1, + 'lookmat7' => 1, + 'lookmat8' => 1, + 'lookmat9' => 1, + 'lookmodtransform' => 1, + 'lookuptable' => 1, + 'lotus' => 1, + 'lowlightaf' => 1, + 'lownote' => 1, + 'lowvelocity' => 1, + 'lr' => 1, + 'lslv' => 1, + 'lucasjunk' => 1, + 'luminance' => 1, + 'luminanceconsts' => 1, + 'lyricist' => 1, + 'lyrics_synchronised' => 1, + 'machineid' => 1, + 'machinetype' => 1, + 'macintoshnsprintinfo' => 1, + 'macintoshprintinfo' => 1, + 'mag360fly' => 1, + 'magmode' => 1, + 'magneticfield' => 1, + 'magnetometer' => 1, + 'magnetometerxyz' => 1, + 'magnification' => 1, + 'magnifyobject' => 1, + 'mailingaddress' => 1, + 'mailstop' => 1, + 'mainboard' => 1, + 'maininfo' => 1, + 'maininfoifd' => 1, + 'majorbrand' => 1, + 'makeandmodel' => 1, + 'makemodel' => 1, + 'makernotepentax5a' => 1, + 'makernotepentax5b' => 1, + 'makernotepentax5c' => 1, + 'makernotes' => 1, + 'mandatorybackground' => 1, + 'manufacturecode' => 1, + 'manufactureindex' => 1, + 'manufacturername' => 1, + 'mappingscheme' => 1, + 'mapscale' => 1, + 'mariahthresholds' => 1, + 'mariahthresholdslow' => 1, + 'mariahthresholdsnormal' => 1, + 'mariahthresholdsstrong' => 1, + 'markbits' => 1, + 'marker' => 1, + 'markerid' => 1, + 'markinfo' => 1, + 'marl' => 1, + 'masksubarea' => 1, + 'mastergainadjustment' => 1, + 'matrixworldtocamera' => 1, + 'matrixworldtoscreen' => 1, + 'mattcolor' => 1, + 'matte' => 1, + 'matteing' => 1, + 'matter' => 1, + 'maxband' => 1, + 'maxbitrate' => 1, + 'maxdatarate' => 1, + 'maximumbitrate' => 1, + 'maximumimageindex' => 1, + 'maximumobjectsize' => 1, + 'maximumoperationindex' => 1, + 'maximumshutterangle' => 1, + 'maximumtransformindex' => 1, + 'maxjpegtableindex' => 1, + 'maxpacketsize' => 1, + 'maxpagenormal' => 1, + 'maxpdusize' => 1, + 'maxsubfilesize' => 1, + 'maxtransmissiontime' => 1, + 'maxval' => 1, + 'maxwidth' => 1, + 'mc' => 1, + 'mccdata' => 1, + 'mcdi' => 1, + 'md5signature' => 1, + 'md5sum' => 1, + 'mdcolortable' => 1, + 'mdfiletag' => 1, + 'mdfileunits' => 1, + 'mditemaccounthandles' => 1, + 'mditemaccountidentifier' => 1, + 'mditemacquisitionmake' => 1, + 'mditemacquisitionmodel' => 1, + 'mditemaltitude' => 1, + 'mditemaperture' => 1, + 'mditemaudiobitrate' => 1, + 'mditemaudiochannelcount' => 1, + 'mditemauthoremailaddresses' => 1, + 'mditemauthors' => 1, + 'mditembitspersample' => 1, + 'mditembundleidentifier' => 1, + 'mditemcity' => 1, + 'mditemcodecs' => 1, + 'mditemcolorspace' => 1, + 'mditemcomment' => 1, + 'mditemcontentcreationdate' => 1, + 'mditemcontentcreationdate_ranking' => 1, + 'mditemcontentcreationdateranking' => 1, + 'mditemcontentmodificationdate' => 1, + 'mditemcontenttype' => 1, + 'mditemcontenttypetree' => 1, + 'mditemcontributors' => 1, + 'mditemcopyright' => 1, + 'mditemcountry' => 1, + 'mditemcreator' => 1, + 'mditemdateadded' => 1, + 'mditemdateadded_ranking' => 1, + 'mditemdescription' => 1, + 'mditemdisplayname' => 1, + 'mditemdownloadeddate' => 1, + 'mditemdurationseconds' => 1, + 'mditememailconversationid' => 1, + 'mditemencodingapplications' => 1, + 'mditemexifgpsversion' => 1, + 'mditemexifversion' => 1, + 'mditemexposuremode' => 1, + 'mditemexposureprogram' => 1, + 'mditemexposuretimeseconds' => 1, + 'mditemflashonoff' => 1, + 'mditemfnumber' => 1, + 'mditemfocallength' => 1, + 'mditemfscontentchangedate' => 1, + 'mditemfscreatorcode' => 1, + 'mditemfsfinderflags' => 1, + 'mditemfshascustomicon' => 1, + 'mditemfsinvisible' => 1, + 'mditemfsisextensionhidden' => 1, + 'mditemfsisstationery' => 1, + 'mditemfsname' => 1, + 'mditemfsnodecount' => 1, + 'mditemfsownergroupid' => 1, + 'mditemfsowneruserid' => 1, + 'mditemfssize' => 1, + 'mditemfstypecode' => 1, + 'mditemgpsdatestamp' => 1, + 'mditemgpsstatus' => 1, + 'mditemgpstrack' => 1, + 'mditemhasalphachannel' => 1, + 'mditemidentifier' => 1, + 'mditemimagedirection' => 1, + 'mditeminterestingdate_ranking' => 1, + 'mditeminterestingdateranking' => 1, + 'mditemisapplicationmanaged' => 1, + 'mditemisexistingthread' => 1, + 'mditemislikelyjunk' => 1, + 'mditemisospeed' => 1, + 'mditemkeywords' => 1, + 'mditemkind' => 1, + 'mditemlastuseddate' => 1, + 'mditemlastuseddate_ranking' => 1, + 'mditemlatitude' => 1, + 'mditemlensmodel' => 1, + 'mditemlogicalsize' => 1, + 'mditemlongitude' => 1, + 'mditemmailboxes' => 1, + 'mditemmaildatereceived_ranking' => 1, + 'mditemmediatypes' => 1, + 'mditemnumberofpages' => 1, + 'mditemorientation' => 1, + 'mditemoriginapplicationidentifier' => 1, + 'mditemoriginmessageid' => 1, + 'mditemoriginsenderdisplayname' => 1, + 'mditemoriginsenderhandle' => 1, + 'mditemoriginsubject' => 1, + 'mditempageheight' => 1, + 'mditempagewidth' => 1, + 'mditemphysicalsize' => 1, + 'mditempixelcount' => 1, + 'mditempixelheight' => 1, + 'mditempixelwidth' => 1, + 'mditemprimaryrecipientemailaddresses' => 1, + 'mditemprofilename' => 1, + 'mditemrecipients' => 1, + 'mditemredeyeonoff' => 1, + 'mditemresolutionheightdpi' => 1, + 'mditemresolutionwidthdpi' => 1, + 'mditemsecuritymethod' => 1, + 'mditemspeed' => 1, + 'mditemstateorprovince' => 1, + 'mditemstreamable' => 1, + 'mditemsubject' => 1, + 'mditemtimestamp' => 1, + 'mditemtitle' => 1, + 'mditemtotalbitrate' => 1, + 'mditemusecount' => 1, + 'mditemuseddates' => 1, + 'mditemuserdownloadeddate' => 1, + 'mditemuserdownloadeduserhandle' => 1, + 'mditemusersharedreceiveddate' => 1, + 'mditemusersharedreceivedrecipient' => 1, + 'mditemusersharedreceivedrecipienthandle' => 1, + 'mditemusersharedreceivedsender' => 1, + 'mditemusersharedreceivedsenderhandle' => 1, + 'mditemusersharedreceivedtransport' => 1, + 'mditemversion' => 1, + 'mditemvideobitrate' => 1, + 'mditemwherefroms' => 1, + 'mditemwhitebalance' => 1, + 'mdlabname' => 1, + 'mdpm' => 1, + 'mdpr' => 1, + 'mdprepdate' => 1, + 'mdpreptime' => 1, + 'mdsampleinfo' => 1, + 'mdscalepixel' => 1, + 'meas1label' => 1, + 'meas1params' => 1, + 'meas1type' => 1, + 'measuredcolor' => 1, + 'measuredinfo' => 1, + 'measurement' => 1, + 'measurementbacking' => 1, + 'measurementflare' => 1, + 'measurementgeometry' => 1, + 'measurementilluminant' => 1, + 'measurementinfo' => 1, + 'measurementinputinfo' => 1, + 'measurementobserver' => 1, + 'measurementscale' => 1, + 'mebx' => 1, + 'media' => 1, + 'mediablackpoint' => 1, + 'mediacolor' => 1, + 'mediacontenttypes' => 1, + 'mediacreated' => 1, + 'mediacredits' => 1, + 'mediadata' => 1, + 'mediadataoffset' => 1, + 'mediadatasize' => 1, + 'mediaduration' => 1, + 'mediaflags' => 1, + 'mediaheader' => 1, + 'mediaheaderversion' => 1, + 'mediaindex' => 1, + 'mediainfo' => 1, + 'mediaisdelay' => 1, + 'mediaisfinale' => 1, + 'mediaislive' => 1, + 'mediaismovie' => 1, + 'mediaispremiere' => 1, + 'mediaisrepeat' => 1, + 'mediaissap' => 1, + 'mediaissport' => 1, + 'mediaisstereo' => 1, + 'mediaissubtitled' => 1, + 'mediaistape' => 1, + 'mediajukebox' => 1, + 'medialanguagecode' => 1, + 'medianetworkaffiliation' => 1, + 'mediaoriginalbroadcastdatetime' => 1, + 'mediaoriginalchannel' => 1, + 'mediaoriginalchannelsubnumber' => 1, + 'mediaoriginalruntime' => 1, + 'mediapro' => 1, + 'mediastationcallsign' => 1, + 'mediastationname' => 1, + 'mediathumbaspectratiox' => 1, + 'mediathumbaspectratioy' => 1, + 'mediathumbheight' => 1, + 'mediathumbratingattributes' => 1, + 'mediathumbratinglevel' => 1, + 'mediathumbratingsystem' => 1, + 'mediathumbret' => 1, + 'mediathumbstride' => 1, + 'mediathumbtimestamp' => 1, + 'mediathumbwidth' => 1, + 'mediatimescale' => 1, + 'mediatrackbytes' => 1, + 'mediauniqueid' => 1, + 'mediaweight' => 1, + 'mediawhitepoint' => 1, + 'medium' => 1, + 'megapixels' => 1, + 'melodicpolyphony' => 1, + 'menusettingsz7ii' => 1, + 'menusettingsz9' => 1, + 'message' => 1, + 'meta' => 1, + 'metadata' => 1, + 'metadatacreator' => 1, + 'metadataid' => 1, + 'metadatalibrary' => 1, + 'metadatanumber' => 1, + 'metadatasource' => 1, + 'metadataversion' => 1, + 'metaformat' => 1, + 'metaimagesize' => 1, + 'metarelation' => 1, + 'metasampledesc' => 1, + 'metatype' => 1, + 'metdata' => 1, + 'meterinfo' => 1, + 'meteringbutton' => 1, + 'meterlink' => 1, + 'metermode' => 1, + 'mett' => 1, + 'microsoft' => 1, + 'microsoftxtra' => 1, + 'middlename' => 1, + 'midicontrol' => 1, + 'midicontrolversion' => 1, + 'midipitchfraction' => 1, + 'midisong' => 1, + 'midiunitynote' => 1, + 'mie' => 1, + 'mileage' => 1, + 'mimeencoding' => 1, + 'mimetype' => 1, + 'miniaturefilter' => 1, + 'miniaturefilterorientation' => 1, + 'miniaturefilterparameter' => 1, + 'miniaturefilterposition' => 1, + 'minimumbitrate' => 1, + 'minimumflushrows' => 1, + 'minimumversion' => 1, + 'minoltacamerasettings' => 1, + 'minoltacamerasettings2' => 1, + 'minoltacamerasettings5d' => 1, + 'minoltacamerasettings7d' => 1, + 'minoltacamerasettingsold' => 1, + 'minoltamakernote' => 1, + 'minoltamma0' => 1, + 'minoltamma1' => 1, + 'minoltaprd' => 1, + 'minoltarif' => 1, + 'minoltatags' => 1, + 'minoltattw' => 1, + 'minoltawbg' => 1, + 'minpacketsize' => 1, + 'minspatialsegmentationidc' => 1, + 'mintransmissiontime' => 1, + 'mmclips' => 1, + 'mngheader' => 1, + 'mobitype' => 1, + 'mobiversion' => 1, + 'modeextension' => 1, + 'modeflags' => 1, + 'model2' => 1, + 'modelandversion' => 1, + 'modeltype' => 1, + 'modenumber' => 1, + 'modificationnumber' => 1, + 'modificationpermissions' => 1, + 'modifiedby' => 1, + 'modifiedinfo' => 1, + 'moiversion' => 1, + 'monomonitormatrix' => 1, + 'monostrength' => 1, + 'monotonescaletable' => 1, + 'monouniquematrix' => 1, + 'montage' => 1, + 'month' => 1, + 'moreinfo' => 1, + 'moreinfo0201' => 1, + 'moreinfo0401' => 1, + 'moreinfobannerimage' => 1, + 'moreinfobannerurl' => 1, + 'moreinfotext' => 1, + 'moreinfourl' => 1, + 'moresettings' => 1, + 'mosaicpattern' => 1, + 'movableinfo' => 1, + 'moveobjects' => 1, + 'movie' => 1, + 'moviefragment' => 1, + 'moviefragmentheader' => 1, + 'moviefragmentsequence' => 1, + 'moviefunc2button' => 1, + 'movieheader' => 1, + 'movieheaderversion' => 1, + 'moviehighlightdisplaypattern' => 1, + 'movieinfo' => 1, + 'moviestreamname' => 1, + 'moviewhitebalancesameasphoto' => 1, + 'mp' => 1, + 'mp1' => 1, + 'mpeg7binary' => 1, + 'mpegaudioversion' => 1, + 'mpf' => 1, + 'mpfversion' => 1, + 'mpimage' => 1, + 'mpimageflags' => 1, + 'mpimageformat' => 1, + 'mpimagelength' => 1, + 'mpimagelist' => 1, + 'mpimagestart' => 1, + 'mpimagetype' => 1, + 'mpindividualnum' => 1, + 'mrwinfo' => 1, + 'msdocumenttext' => 1, + 'msdocumenttextposition' => 1, + 'mspropertysetstorage' => 1, + 'msstereo' => 1, + 'mtoa0' => 1, + 'mtob0' => 1, + 'mtob1' => 1, + 'mtob2' => 1, + 'mtob3' => 1, + 'mtos0' => 1, + 'mtos1' => 1, + 'mtos2' => 1, + 'mtos3' => 1, + 'multiexp' => 1, + 'multiexposureversion' => 1, + 'multimediatype' => 1, + 'multiplexdefaultvalues' => 1, + 'multiplextypearray' => 1, + 'multiprofiles' => 1, + 'multiquality' => 1, + 'multishoton' => 1, + 'multiview' => 1, + 'musicby' => 1, + 'musiccdidentifier' => 1, + 'musiciancredits' => 1, + 'mwg-coll' => 1, + 'mwg-kw' => 1, + 'mwg-rs' => 1, + 'mxfversion' => 1, + 'mycolors' => 1, + 'namedcolor' => 1, + 'namedcolor2' => 1, + 'nametableversion' => 1, + 'nameutf-8' => 1, + 'nativedisplayinfo' => 1, + 'nativeresolutionunit' => 1, + 'nativexresolution' => 1, + 'nativeyresolution' => 1, + 'ncc' => 1, + 'nemoblurkernel' => 1, + 'nemodarklimit' => 1, + 'nemogainfactors' => 1, + 'nemohighlight12limit' => 1, + 'nemotilesize' => 1, + 'nestedsignalstream' => 1, + 'nestlevel' => 1, + 'netexposurecompensation' => 1, + 'netname' => 1, + 'netprovidertype' => 1, + 'neutals' => 1, + 'neutobjbacktype' => 1, + 'neutobjname' => 1, + 'neutobjtype' => 1, + 'neutobjversion' => 1, + 'neutrals' => 1, + 'newbitdepth' => 1, + 'newcolortype' => 1, + 'newguid' => 1, + 'newlines' => 1, + 'nexttrackid' => 1, + 'nifnonlinearity' => 1, + 'nifnonlinearity12bit' => 1, + 'nifnonlinearity12to16' => 1, + 'nifnonlinearity16bit' => 1, + 'nifnonlinearityext' => 1, + 'nikon' => 1, + 'nikonapp' => 1, + 'nikondata' => 1, + 'nikondatetime' => 1, + 'nikonncdb' => 1, + 'nikonncdt' => 1, + 'nikonnefinfo' => 1, + 'nikonscanifd' => 1, + 'nikontags' => 1, + 'nikonvers' => 1, + 'nine' => 1, + 'nineedits' => 1, + 'ninthlanguage' => 1, + 'nitf' => 1, + 'nitfversion' => 1, + 'noise' => 1, + 'noisereductiondata' => 1, + 'noisereductionkernel' => 1, + 'noisereductionparametershostlow' => 1, + 'noisereductionparametershostnormal' => 1, + 'noisereductionparametershoststrong' => 1, + 'nominalbitrate' => 1, + 'nominalframecount' => 1, + 'nominallayercount' => 1, + 'nominalplaytime' => 1, + 'nominalvideobitrate' => 1, + 'nomssmarttags' => 1, + 'normallinetransfertiming' => 1, + 'note' => 1, + 'notice' => 1, + 'now' => 1, + 'npts' => 1, + 'nrwdata' => 1, + 'nsc_address' => 1, + 'nsc_description' => 1, + 'nsc_email' => 1, + 'nsc_name' => 1, + 'nsc_phone' => 1, + 'nullmediaheader' => 1, + 'numberlist' => 1, + 'numberofcomponents' => 1, + 'numberofframes' => 1, + 'numberofimages' => 1, + 'numberofinks' => 1, + 'numberofparts' => 1, + 'numberofplanes' => 1, + 'numberofresolutions' => 1, + 'numberofsamples' => 1, + 'numberofsamples64' => 1, + 'numchanneldescriptions' => 1, + 'numchannels' => 1, + 'numcolors' => 1, + 'numfonts' => 1, + 'numhistorybuffers' => 1, + 'numimportantcolors' => 1, + 'numpackets' => 1, + 'numproperties' => 1, + 'numrules' => 1, + 'numsampleframes' => 1, + 'numsampleloops' => 1, + 'numslices' => 1, + 'numstreams' => 1, + 'numtemporallayers' => 1, + 'objectfiletype' => 1, + 'objectflags' => 1, + 'objectid' => 1, + 'objectorientation' => 1, + 'objectsizeannounced' => 1, + 'observationdate' => 1, + 'observationdateend' => 1, + 'observationtime' => 1, + 'observationtimeend' => 1, + 'observer' => 1, + 'obsoletephotoshoptag1' => 1, + 'obsoletephotoshoptag2' => 1, + 'obsoletephotoshoptag3' => 1, + 'ocad' => 1, + 'ocadrevision' => 1, + 'oceapplicationselector' => 1, + 'oceidnumber' => 1, + 'oceimagelogic' => 1, + 'ocescanjobdesc' => 1, + 'office' => 1, + 'officelocation' => 1, + 'offlineavailability' => 1, + 'offlinestatus' => 1, + 'offsetmaphorizontal' => 1, + 'offsetmapvertical' => 1, + 'offsetorigin' => 1, + 'offsetx' => 1, + 'offsetxy' => 1, + 'offsety' => 1, + 'oldxmp' => 1, + 'olym' => 1, + 'olympus' => 1, + 'olympus2100' => 1, + 'olympus2100ifd' => 1, + 'olympus2200' => 1, + 'olympus2200ifd' => 1, + 'olympus2300' => 1, + 'olympus2300ifd' => 1, + 'olympus2400' => 1, + 'olympus2400ifd' => 1, + 'olympus2500' => 1, + 'olympus2500ifd' => 1, + 'olympus2600' => 1, + 'olympus2600ifd' => 1, + 'olympus2700' => 1, + 'olympus2700ifd' => 1, + 'olympus2800' => 1, + 'olympus2800ifd' => 1, + 'olympus2900' => 1, + 'olympus2900ifd' => 1, + 'olympusatom' => 1, + 'olympusdss' => 1, + 'olympusjunk' => 1, + 'olympusolym' => 1, + 'olympuspreview' => 1, + 'olympustags1' => 1, + 'olympustags2' => 1, + 'olympustags3' => 1, + 'olympustags4' => 1, + 'olympusthumbnail' => 1, + 'omenatcapturemode' => 1, + 'omenearlygobcolumns' => 1, + 'omenearlygobrows' => 1, + 'omenearlygobsurface' => 1, + 'omengradientexclusionlimits' => 1, + 'omengradientkernel' => 1, + 'omengradientkerneltaps' => 1, + 'omengradientoffset' => 1, + 'omeninitialcolumns' => 1, + 'omeninitialrows' => 1, + 'omeninitialscaling' => 1, + 'omenmeantostrength' => 1, + 'omenpercenttorationallimitsblue' => 1, + 'omenpercenttorationallimitsgob' => 1, + 'omenpercenttorationallimitsgor' => 1, + 'omenpercenttorationallimitsred' => 1, + 'omenrangeweighting' => 1, + 'omenratioclipfactors' => 1, + 'omenratioexclusionfactors' => 1, + 'omenroicoefficients' => 1, + 'omenroicoordinates' => 1, + 'omensmoothingkernel' => 1, + 'on1_settingsdata' => 1, + 'on1_settingsmetadatacreated' => 1, + 'on1_settingsmetadatamodified' => 1, + 'on1_settingsmetadataname' => 1, + 'on1_settingsmetadatapluginid' => 1, + 'on1_settingsmetadatatimestamp' => 1, + 'on1_settingsmetadatausage' => 1, + 'on1_settingsmetadatavisibletouser' => 1, + 'onionskins' => 1, + 'opacity' => 1, + 'opcolor' => 1, + 'opendml' => 1, + 'openwithapplication' => 1, + 'operatingsystem' => 1, + 'operation' => 1, + 'operationclassid' => 1, + 'operationid' => 1, + 'operationnumber' => 1, + 'opiproxy' => 1, + 'opticalvr' => 1, + 'optics' => 1, + 'optimalbitrate' => 1, + 'optionalattendeeaddresses' => 1, + 'optionalattendees' => 1, + 'opus' => 1, + 'opusversion' => 1, + 'orderingrestrictions' => 1, + 'organizeraddress' => 1, + 'organizername' => 1, + 'orientationinfo' => 1, + 'originalalbum' => 1, + 'originaldate' => 1, + 'originaldocumentsize' => 1, + 'originalfilesize' => 1, + 'originalfiletype' => 1, + 'originalformat' => 1, + 'originalframerate' => 1, + 'originalimagebroker' => 1, + 'originalmedia' => 1, + 'originalmedium' => 1, + 'originalrawcreator' => 1, + 'originalrawfiletype' => 1, + 'originalrawimage' => 1, + 'originalrawresource' => 1, + 'originalreleasetime' => 1, + 'originalreleaseyear' => 1, + 'originalscannedimagesize' => 1, + 'originalsoftpostpadding' => 1, + 'originalsoftprepadding' => 1, + 'originalthmcreator' => 1, + 'originalthmfiletype' => 1, + 'originalthmimage' => 1, + 'originalthmresource' => 1, + 'originalyear' => 1, + 'originator' => 1, + 'originatorreference' => 1, + 'originpathinfo' => 1, + 'osversion' => 1, + 'otheraddress' => 1, + 'othercity' => 1, + 'othercodecdescription' => 1, + 'othercodecname' => 1, + 'othercountry-region' => 1, + 'otherdate1' => 1, + 'otherdate2' => 1, + 'otherdate3' => 1, + 'otherfirmware' => 1, + 'otherformat' => 1, + 'otherinfo' => 1, + 'othermeta' => 1, + 'othername' => 1, + 'otherpobox' => 1, + 'otherpostalcode' => 1, + 'othersampledesc' => 1, + 'otherserialnumber' => 1, + 'otherstateorprovince' => 1, + 'otherstreet' => 1, + 'outputdataobjectlist' => 1, + 'outputgain' => 1, + 'outputheight' => 1, + 'outputorientation' => 1, + 'outputresponse' => 1, + 'outputwidth' => 1, + 'overclockcolsright' => 1, + 'overclockrowsbottom' => 1, + 'overflowcolor' => 1, + 'ownership' => 1, + 'packets' => 1, + 'packingmethod' => 1, + 'page' => 1, + 'pageenter' => 1, + 'pageexit' => 1, + 'pagefront' => 1, + 'pagelayout' => 1, + 'pagemode' => 1, + 'pagenormal' => 1, + 'pager' => 1, + 'pages' => 1, + 'pagespecial' => 1, + 'paintdata' => 1, + 'paintimage' => 1, + 'paintimageheight' => 1, + 'paintimagetype' => 1, + 'paintimagewidth' => 1, + 'paintingfilter' => 1, + 'palette' => 1, + 'palettecolors' => 1, + 'palettefilename' => 1, + 'palettehistogram' => 1, + 'paletteinfo' => 1, + 'palettemethod' => 1, + 'palettename' => 1, + 'palettestretch' => 1, + 'palmfiletype' => 1, + 'panasonic' => 1, + 'panasonicpana' => 1, + 'panorama' => 1, + 'panorientation' => 1, + 'panoverlaph' => 1, + 'panoverlapv' => 1, + 'paragraphs' => 1, + 'parallelismtype' => 1, + 'param0' => 1, + 'param1' => 1, + 'param2' => 1, + 'param3' => 1, + 'parameter' => 1, + 'parameterinfo' => 1, + 'parameters' => 1, + 'parasites' => 1, + 'parentalratingreason' => 1, + 'parrotautomation' => 1, + 'parrotfollowme' => 1, + 'parrottimestamp' => 1, + 'parrotv1' => 1, + 'parrotv2' => 1, + 'parrotv3' => 1, + 'part' => 1, + 'partialactivecolsleft' => 1, + 'partialactivecolsright' => 1, + 'partialactiverowsbottom' => 1, + 'partialactiverowstop' => 1, + 'partialpalette' => 1, + 'partialsyncsamples' => 1, + 'participants' => 1, + 'partnumber' => 1, + 'partofset' => 1, + 'pastclippingboundary' => 1, + 'pasteimage' => 1, + 'path' => 1, + 'pathselectionstate' => 1, + 'pathtablelocation' => 1, + 'pathtablesize' => 1, + 'patternangle' => 1, + 'patterncorrectionfactors' => 1, + 'patterncorrectiongains' => 1, + 'patterncorrectionoffsets' => 1, + 'patterngainconversiontable' => 1, + 'payloadtype' => 1, + 'paymenturl' => 1, + 'pcscitation' => 1, + 'pdahistogram' => 1, + 'pdf' => 1, + 'pdfx' => 1, + 'peakbitrate' => 1, + 'peaklevelr128' => 1, + 'peaklevelsample' => 1, + 'peakspectralsensitivity' => 1, + 'peakvalue' => 1, + 'pefversion' => 1, + 'pentax' => 1, + 'pentaxdata' => 1, + 'pentaxdata2' => 1, + 'pentaxjunk' => 1, + 'pentaxjunk2' => 1, + 'pentaxpent' => 1, + 'pentaxpreview' => 1, + 'pentaxtags' => 1, + 'perceivedtype' => 1, + 'perceptualrenderingintentgamut' => 1, + 'percussivepolyphony' => 1, + 'perfmode' => 1, + 'performersortorder' => 1, + 'perms' => 1, + 'perpicturenotes' => 1, + 'personalfunctions' => 1, + 'personalfunctionvalues' => 1, + 'personaltitle' => 1, + 'petype' => 1, + 'pfmheader' => 1, + 'pfmversion' => 1, + 'pgfversion' => 1, + 'photoeffectsdata' => 1, + 'photofinishername' => 1, + 'photomech' => 1, + 'photomechanic' => 1, + 'photoresolution' => 1, + 'photoshop' => 1, + 'photoshop2colortable' => 1, + 'photoshop2info' => 1, + 'photoshop_profile' => 1, + 'photoshopdata' => 1, + 'photoshopformat' => 1, + 'photoshopinfo' => 1, + 'photoshopsettings' => 1, + 'physicalpixel' => 1, + 'physicalstreamnumbermap' => 1, + 'physicalstreamnumbers' => 1, + 'physicalstreams' => 1, + 'pic_ifd' => 1, + 'picslabel' => 1, + 'picture' => 1, + 'picturebitsperpixel' => 1, + 'picturecontrolversion' => 1, + 'picturectrl' => 1, + 'picturedescription' => 1, + 'pictureformat' => 1, + 'pictureheight' => 1, + 'pictureindexedcolors' => 1, + 'pictureinfo' => 1, + 'picturelength' => 1, + 'picturemimetype' => 1, + 'picturestyleinfo' => 1, + 'picturetype' => 1, + 'picturewidth' => 1, + 'pieceinfo' => 1, + 'piecelength' => 1, + 'pieces' => 1, + 'pilotingmode' => 1, + 'pip' => 1, + 'pipx1' => 1, + 'pipx2' => 1, + 'pipy1' => 1, + 'pipy2' => 1, + 'pitchandfamily' => 1, + 'pitchrollyaw' => 1, + 'pittasoft' => 1, + 'pixelaspectratiox' => 1, + 'pixelaspectratioy' => 1, + 'pixelcalibration' => 1, + 'pixelcorrectiongains' => 1, + 'pixelexposuretime' => 1, + 'pixelformat' => 1, + 'pixelinfo' => 1, + 'pixelintensityrange' => 1, + 'pixellive' => 1, + 'pixelmagicjbigoptions' => 1, + 'pixelspermeterx' => 1, + 'pixelspermetery' => 1, + 'pixheight' => 1, + 'pixwidth' => 1, + 'places' => 1, + 'planckb' => 1, + 'planckf' => 1, + 'plancko' => 1, + 'planckr1' => 1, + 'planckr2' => 1, + 'playbackflickdownrating' => 1, + 'playbackflickuprating' => 1, + 'playcounter' => 1, + 'playlist' => 1, + 'playlistdelay' => 1, + 'playlistindex' => 1, + 'plus' => 1, + 'pmi' => 1, + 'pobox' => 1, + 'podcastcategory' => 1, + 'podcastdescription' => 1, + 'podcastid' => 1, + 'podcastkeywords' => 1, + 'pointsize' => 1, + 'popularimeter' => 1, + 'popupfillattributes' => 1, + 'popupflash' => 1, + 'portraitmatrix' => 1, + 'portraittonescaletable' => 1, + 'poseyawdegrees' => 1, + 'position' => 1, + 'postertime' => 1, + 'postscript2crd0' => 1, + 'postscript2crd1' => 1, + 'postscript2crd2' => 1, + 'postscript2crd3' => 1, + 'postscript2csa' => 1, + 'postscriptfont' => 1, + 'postscriptfontname' => 1, + 'pragma' => 1, + 'preferredfamily' => 1, + 'preferredrate' => 1, + 'preferredsubfamily' => 1, + 'preferredvolume' => 1, + 'prefersubselectorcenter' => 1, + 'preroll' => 1, + 'presentationformat' => 1, + 'presentationtarget' => 1, + 'preview' => 1, + 'preview0' => 1, + 'preview1' => 1, + 'preview2' => 1, + 'previewatomindex' => 1, + 'previewatomtype' => 1, + 'previewduration' => 1, + 'previewifd' => 1, + 'previewifd_offset' => 1, + 'previewimage1' => 1, + 'previewimage2' => 1, + 'previewimagedata' => 1, + 'previewimageinfo' => 1, + 'previewinfo' => 1, + 'previewpdf' => 1, + 'previewpict' => 1, + 'previewpng' => 1, + 'previewtiff' => 1, + 'previewtime' => 1, + 'previewversion' => 1, + 'previewwmf' => 1, + 'primarye-mail' => 1, + 'primaryfileguid' => 1, + 'primaryitemreference' => 1, + 'primaryphone' => 1, + 'primaryplatform' => 1, + 'primaryvolume' => 1, + 'printflags' => 1, + 'printflagsinfo' => 1, + 'printimversion' => 1, + 'printinfo' => 1, + 'printinfo2' => 1, + 'printposition' => 1, + 'printquality' => 1, + 'printscale' => 1, + 'printscaleinfo' => 1, + 'printstyle' => 1, + 'printtovideo' => 1, + 'priority' => 1, + 'prioritysettings' => 1, + 'prism' => 1, + 'private' => 1, + 'privatebuild' => 1, + 'prl' => 1, + 'prm' => 1, + 'processing' => 1, + 'processinginfo' => 1, + 'processingparameters' => 1, + 'processingtime' => 1, + 'processparametersv2' => 1, + 'prod' => 1, + 'prodnotes' => 1, + 'producedby' => 1, + 'produceddate' => 1, + 'producednotice' => 1, + 'producers' => 1, + 'product' => 1, + 'productionaperturedimensions' => 1, + 'productiondate' => 1, + 'productiondesigner' => 1, + 'productionstudio' => 1, + 'productname' => 1, + 'producttype' => 1, + 'productversionnumber' => 1, + 'profile1audiocodec' => 1, + 'profile1height' => 1, + 'profile1videocodec' => 1, + 'profile1width' => 1, + 'profileclass' => 1, + 'profilecmmtype' => 1, + 'profileconnectionspace' => 1, + 'profilecreator' => 1, + 'profiledataoffset' => 1, + 'profiledatetime' => 1, + 'profiledescription' => 1, + 'profiledescriptionml' => 1, + 'profilefilesignature' => 1, + 'profileheader' => 1, + 'profileid' => 1, + 'profileifd' => 1, + 'profilesequencedesc' => 1, + 'profilesequenceidentifier' => 1, + 'profilesequenceinfo' => 1, + 'profilesize' => 1, + 'profileversion' => 1, + 'progid' => 1, + 'programdescription' => 1, + 'programid' => 1, + 'programname' => 1, + 'progressivescans' => 1, + 'projazimuthangle' => 1, + 'projcentereasting' => 1, + 'projcenterlat' => 1, + 'projcenterlong' => 1, + 'projcenternorthing' => 1, + 'projcoordtrans' => 1, + 'project' => 1, + 'projectedcstype' => 1, + 'projection' => 1, + 'projectionboundsbottom' => 1, + 'projectionboundsleft' => 1, + 'projectionboundsright' => 1, + 'projectionboundstop' => 1, + 'projectionheader' => 1, + 'projects' => 1, + 'projfalseeasting' => 1, + 'projfalsenorthing' => 1, + 'projfalseorigineasting' => 1, + 'projfalseoriginlat' => 1, + 'projfalseoriginlong' => 1, + 'projfalseoriginnorthing' => 1, + 'projlinearunits' => 1, + 'projlinearunitsize' => 1, + 'projnatoriginlat' => 1, + 'projnatoriginlong' => 1, + 'projrectifiedgridangle' => 1, + 'projscaleatcenter' => 1, + 'projscaleatnatorigin' => 1, + 'projstdparallel1' => 1, + 'projstdparallel2' => 1, + 'projstraightvertpolelong' => 1, + 'promoteparent' => 1, + 'prop' => 1, + 'properties' => 1, + 'propertysetidcodes' => 1, + 'propertysetpathname' => 1, + 'propertystoredata' => 1, + 'propertyvectorelements' => 1, + 'protect' => 1, + 'protected' => 1, + 'protectioninfo' => 1, + 'protectiontype' => 1, + 'protune' => 1, + 'providercopyright' => 1, + 'providerlogourl' => 1, + 'providerrating' => 1, + 'providerstyle' => 1, + 'providerurl' => 1, + 'ps2crdvmsize' => 1, + 'ps2renderingintent' => 1, + 'psfontinfo' => 1, + 'pstringcaption' => 1, + 'ptrh' => 1, + 'publishdate' => 1, + 'publishdatestart' => 1, + 'publisherlimit' => 1, + 'publisherurl' => 1, + 'pur' => 1, + 'purchasefileformat' => 1, + 'purchaseinfo' => 1, + 'purpose' => 1, + 'pyramidlevels' => 1, + 'qtablelarge100pct' => 1, + 'qtablelarge25pct' => 1, + 'qtablelarge50pct' => 1, + 'qtablelarge67pct' => 1, + 'qtablemedium100pct' => 1, + 'qtablemedium25pct' => 1, + 'qtablemedium50pct' => 1, + 'qtablemedium67pct' => 1, + 'qtablesmall100pct' => 1, + 'qtablesmall25pct' => 1, + 'qtablesmall50pct' => 1, + 'qtablesmall67pct' => 1, + 'qualcomm' => 1, + 'quickedit' => 1, + 'quickmaskinfo' => 1, + 'quietshuttershootingspeed' => 1, + 'quoting' => 1, + 'qvci' => 1, + 'ra3' => 1, + 'ra4' => 1, + 'ra5' => 1, + 'radioband' => 1, + 'radioformat' => 1, + 'radiostationname' => 1, + 'radiostationowner' => 1, + 'rafdata' => 1, + 'rafversion' => 1, + 'rasterpadding' => 1, + 'rate' => 1, + 'rated' => 1, + 'ratingorg' => 1, + 'ratioimage' => 1, + 'rawburstmoderoll' => 1, + 'rawcfacomponentaverages' => 1, + 'rawcodecversion' => 1, + 'rawdatalength' => 1, + 'rawdataoffset' => 1, + 'rawdatarotation' => 1, + 'rawdev2' => 1, + 'rawdev2ifd' => 1, + 'rawdevelopment' => 1, + 'rawdevelopmentifd' => 1, + 'rawexposurebias' => 1, + 'rawgsensor' => 1, + 'rawhistogram' => 1, + 'rawimageaspectratio' => 1, + 'rawimagecroppedsize' => 1, + 'rawimagecroptopleft' => 1, + 'rawimagefullheight' => 1, + 'rawimagefullsize' => 1, + 'rawimagefullwidth' => 1, + 'rawimageheight' => 1, + 'rawimagemode' => 1, + 'rawimagesegmentation' => 1, + 'rawimagewidth' => 1, + 'rawinfo' => 1, + 'rawinfoifd' => 1, + 'rawjpginfo' => 1, + 'rawthermalimage' => 1, + 'rawthermalimageheight' => 1, + 'rawthermalimagetype' => 1, + 'rawthermalimagewidth' => 1, + 'rawvaluemedian' => 1, + 'rawvaluerange' => 1, + 'rawvaluerangemax' => 1, + 'rawvaluerangemin' => 1, + 'rawzorcreatorversion' => 1, + 'rawzorrequiredversion' => 1, + 'rdf' => 1, + 'readername' => 1, + 'readerrequirements' => 1, + 'reading1description' => 1, + 'reading1device' => 1, + 'reading1units' => 1, + 'reading1value' => 1, + 'reading2description' => 1, + 'reading2device' => 1, + 'reading2units' => 1, + 'reading2value' => 1, + 'reading3description' => 1, + 'reading3device' => 1, + 'reading3units' => 1, + 'reading3value' => 1, + 'reading4description' => 1, + 'reading4device' => 1, + 'reading4units' => 1, + 'reading4value' => 1, + 'readstatus' => 1, + 'real2ir' => 1, + 'realtimestreamingprotocol' => 1, + 'rearcontropaneldisplay' => 1, + 'recallshootfuncaf-on' => 1, + 'recallshootfuncafareamode' => 1, + 'recallshootfuncaperture' => 1, + 'recallshootfuncexposurecomp' => 1, + 'recallshootfuncexposuremode' => 1, + 'recallshootfuncfocustracking' => 1, + 'recallshootfunciso' => 1, + 'recallshootfuncmeteringmode' => 1, + 'recallshootfuncshutterspeed' => 1, + 'recallshootfuncwhitebalance' => 1, + 'receivedfrom' => 1, + 'recengineer' => 1, + 'recinfo' => 1, + 'reclocation' => 1, + 'reconstructiontype' => 1, + 'recordedby' => 1, + 'recordeddate' => 1, + 'recordingdates' => 1, + 'recordingtime' => 1, + 'recordingtimeday' => 1, + 'recordingtimemonth' => 1, + 'recordingtimeyear' => 1, + 'recordingtimeyearmonth' => 1, + 'recordingtimeyearmonthday' => 1, + 'rect' => 1, + 'rectangleofinterest' => 1, + 'red1header' => 1, + 'red2header' => 1, + 'redadjust' => 1, + 'redblueflatfield' => 1, + 'redcodeversion' => 1, + 'redendpoint' => 1, + 'redeyedata' => 1, + 'redgain' => 1, + 'redmask' => 1, + 'redmatrixcolumn' => 1, + 'redprimary' => 1, + 'redsample' => 1, + 'redtrc' => 1, + 'redx' => 1, + 'redy' => 1, + 'reelnumber' => 1, + 'reeltimecode' => 1, + 'reference' => 1, + 'referencename' => 1, + 'referencetemperature' => 1, + 'reflectedapparenttemperature' => 1, + 'reflection' => 1, + 'reflectionhardcopyorigcolorimetry' => 1, + 'reflectionprintoutputcolorimetry' => 1, + 'refresh' => 1, + 'regionxformtackpoint' => 1, + 'registerreadtiming' => 1, + 'relatedimagefile' => 1, + 'relationship' => 1, + 'relativeexposure' => 1, + 'relativehumidity' => 1, + 'relativelocation' => 1, + 'relativepath' => 1, + 'relativevolumeadjustment' => 1, + 'releasedateday' => 1, + 'releasedatemonth' => 1, + 'releasedateyear' => 1, + 'releasedateyearmonth' => 1, + 'releasedateyearmonthday' => 1, + 'rembrandtconsumertonescale' => 1, + 'rembrandtportraittonescale' => 1, + 'rembrandttonescale' => 1, + 'remindertime' => 1, + 'remotefuncbutton' => 1, + 'removehistoryduplicates' => 1, + 'renderingintent' => 1, + 'renderingtransform' => 1, + 'rentalexpirationdate' => 1, + 'rentalflag' => 1, + 'repeateddatabytes' => 1, + 'replaygainalbumgain' => 1, + 'replaygainalbumpeak' => 1, + 'replaygaintrackgain' => 1, + 'replaygaintrackpeak' => 1, + 'replaytrackgain' => 1, + 'replaytrackpeak' => 1, + 'replayvolumelevel' => 1, + 'replyto' => 1, + 'representativedisparityfar' => 1, + 'representativedisparitynear' => 1, + 'representativeimage' => 1, + 'requestid' => 1, + 'requeststate' => 1, + 'requiredattendeeaddresses' => 1, + 'requiredattendees' => 1, + 'rerun' => 1, + 'reserved1' => 1, + 'reserved5' => 1, + 'reservedblob2' => 1, + 'reservedblob3' => 1, + 'reservedblob4' => 1, + 'reservedblob5' => 1, + 'reservedblob6' => 1, + 'reservedblob7' => 1, + 'reservedblob8' => 1, + 'reservedblob9' => 1, + 'resolutioninfo' => 1, + 'resourcecount' => 1, + 'resourceforksize' => 1, + 'resources' => 1, + 'resourcesneeded' => 1, + 'resourcetype' => 1, + 'resultaspectratio' => 1, + 'retailprice' => 1, + 'retailpricecurrency' => 1, + 'retouchinfoversion' => 1, + 'review' => 1, + 'revisiondate' => 1, + 'revisionnumber' => 1, + 'revisitafter' => 1, + 'rgb_profile' => 1, + 'rgbcurves' => 1, + 'rgbtoev0' => 1, + 'rgbtoev1' => 1, + 'rgbtoev2' => 1, + 'rgbtoev3' => 1, + 'rgbtoev4' => 1, + 'rgbtoev5' => 1, + 'rgbtoev6' => 1, + 'rgbtoev7' => 1, + 'rgbtoev8' => 1, + 'rgbtoev9' => 1, + 'rgtable' => 1, + 'ricoh' => 1, + 'ricohjunk' => 1, + 'ricohmake' => 1, + 'ricohmodel' => 1, + 'ricohpitch' => 1, + 'ricohrdc2' => 1, + 'ricohrmkn' => 1, + 'ricohroll' => 1, + 'ricohrr1subdir' => 1, + 'ricohsubdir' => 1, + 'ricohsubdirifd' => 1, + 'riffsize64' => 1, + 'rightdarkcol1' => 1, + 'rightdarkcol2' => 1, + 'rightdarkrect' => 1, + 'rightmag' => 1, + 'rimm13toerimm12spline' => 1, + 'rimmtocrgb0spline' => 1, + 'rimmtocrgb1spline' => 1, + 'rimmtocrgb2spline' => 1, + 'rimmtocrgb3spline' => 1, + 'rimmtocrgb4spline' => 1, + 'rimmtocrgb5spline' => 1, + 'rimmtocrgb6spline' => 1, + 'rimmtocrgb7spline' => 1, + 'rimmtocrgb8spline' => 1, + 'rimmtocrgb9spline' => 1, + 'rimnonlinearity' => 1, + 'rimtonifcolortransform' => 1, + 'rimtonifscalefactor' => 1, + 'rippedby' => 1, + 'rjmd' => 1, + 'rmeta' => 1, + 'rnoiselines' => 1, + 'robots' => 1, + 'rocinfo' => 1, + 'roidescription' => 1, + 'rollguidelements' => 1, + 'rollingshutterskewtime' => 1, + 'root' => 1, + 'rootdirectorycreatedate' => 1, + 'rot360fly' => 1, + 'rotationangle' => 1, + 'rotationxyz' => 1, + 'rotmode' => 1, + 'roundtripversion' => 1, + 'rowcount' => 1, + 'rowinterleavefactor' => 1, + 'rsrc' => 1, + 'rtmd' => 1, + 'rtptimescale' => 1, + 'runtime' => 1, + 'runtimeepoch' => 1, + 'runtimeflags' => 1, + 'runtimescale' => 1, + 'runtimesincepowerup' => 1, + 'runtimevalue' => 1, + 'runwindow' => 1, + 'rvmi_grev' => 1, + 'rvmi_srev' => 1, + 's2n' => 1, + 'sampleblacksequence' => 1, + 'sampledatetime' => 1, + 'sampledegradationpriority' => 1, + 'sampleduration' => 1, + 'sampleflag' => 1, + 'sampleformat' => 1, + 'samplegroupdescription' => 1, + 'samplepaddingbits' => 1, + 'sampleperiod' => 1, + 'sampler' => 1, + 'samplerate2' => 1, + 'samplerdata' => 1, + 'samplerdatalen' => 1, + 'samplesize' => 1, + 'samplesizes' => 1, + 'sampletable' => 1, + 'sampletext' => 1, + 'sampletime' => 1, + 'sampletochunk' => 1, + 'sampletogroup' => 1, + 'samsung' => 1, + 'samsungifd' => 1, + 'samsunginfo' => 1, + 'samsungrawbyteorder' => 1, + 'samsungrawpointerslength' => 1, + 'samsungrawpointersoffset' => 1, + 'samsungrawunknown' => 1, + 'samsungsec' => 1, + 'samsungsmta' => 1, + 'samsungsvss' => 1, + 'samsungtags' => 1, + 'samsungtrailer' => 1, + 'samsunguniqueid' => 1, + 'sanyomov' => 1, + 'sanyomp4' => 1, + 'sap' => 1, + 'saturationinfo' => 1, + 'saturationrenderingintentgamut' => 1, + 'savefocus' => 1, + 'saveobjbacktype' => 1, + 'saveobjects' => 1, + 'saveobjname' => 1, + 'saveobjtype' => 1, + 'saveobjversion' => 1, + 'savesetup' => 1, + 'sba_rgbshifts' => 1, + 'sbabluebalancelut' => 1, + 'sbaexposurerecord' => 1, + 'sbagreenbalancelut' => 1, + 'sbainputimagebitdepth' => 1, + 'sbainputimagecolorspace' => 1, + 'sbalog12transform' => 1, + 'sbalogtransform' => 1, + 'sbaredbalancelut' => 1, + 'scalado' => 1, + 'scale' => 1, + 'scalecrop' => 1, + 'scaledimu' => 1, + 'scaledpressure' => 1, + 'scalefactor' => 1, + 'scalefactor35efl' => 1, + 'scalingfactor' => 1, + 'scandate' => 1, + 'scannerfirmwaredate' => 1, + 'scannerfirmwareversion' => 1, + 'scannermake' => 1, + 'scannermodel' => 1, + 'scannerpixelsize' => 1, + 'scannerproductid' => 1, + 'scannerserialnumber' => 1, + 'scannervendorid' => 1, + 'scanoperatorid' => 1, + 'scansoftware' => 1, + 'scansoftwarerevisiondate' => 1, + 'scav11cols' => 1, + 'scav12cols' => 1, + 'scav21cols' => 1, + 'scav22cols' => 1, + 'sceneappearanceestimates' => 1, + 'scenebalancealgorithmcommand' => 1, + 'scenebalancealgorithmfilmid' => 1, + 'scenebalancealgorithmrevision' => 1, + 'scenecolorimetryestimates' => 1, + 'scheduleitemid' => 1, + 'schemeinfo' => 1, + 'schemetype' => 1, + 'schemeurl' => 1, + 'schemeversion' => 1, + 'school' => 1, + 'screenbuffersize' => 1, + 'screendescriptor' => 1, + 'screenheight' => 1, + 'screening' => 1, + 'screeningdesc' => 1, + 'screennail' => 1, + 'screenwidth' => 1, + 'screenwindowcenter' => 1, + 'screenwindowwidth' => 1, + 'screenwriters' => 1, + 'script' => 1, + 'scriptcommand' => 1, + 'sdc' => 1, + 'searchranking' => 1, + 'secondarygenre' => 1, + 'secondlanguage' => 1, + 'security' => 1, + 'seekable' => 1, + 'seekpoint' => 1, + 'seektable' => 1, + 'segheight' => 1, + 'segwidth' => 1, + 'selection' => 1, + 'selectionduration' => 1, + 'selectiontime' => 1, + 'selobjbacktype' => 1, + 'selobjname' => 1, + 'selobjtype' => 1, + 'selobjversion' => 1, + 'semanticinstanceifd' => 1, + 'semanticname' => 1, + 'sendduration' => 1, + 'senderaddress' => 1, + 'sendername' => 1, + 'sensitivity' => 1, + 'sensitivityvalue' => 1, + 'sensorbottomborder' => 1, + 'sensordata' => 1, + 'sensordefects' => 1, + 'sensorid' => 1, + 'sensorinfo' => 1, + 'sensorreadouttime' => 1, + 'sensorrightborder' => 1, + 'seqlevelidx0' => 1, + 'seqprofile' => 1, + 'seqtier0' => 1, + 'sequenceframenumber' => 1, + 'sequencenumberrandomoffset' => 1, + 'serialinfo' => 1, + 'seriesuid' => 1, + 'serviceid' => 1, + 'serviceorganizationname' => 1, + 'setcookie' => 1, + 'setinfo' => 1, + 'setsubtitle' => 1, + 'seventhlanguage' => 1, + 'sfsboundary' => 1, + 'sglcoldcacthres1' => 1, + 'sglcoldcacthres2' => 1, + 'sglcoldcacthres3' => 1, + 'shadowendpoints' => 1, + 'shadowfilepath' => 1, + 'shadowsyncsampletable' => 1, + 'shakereductioninfo' => 1, + 'shared' => 1, + 'shareddata' => 1, + 'shareddoc' => 1, + 'sharedwith' => 1, + 'sharpenforthumbnail' => 1, + 'sharpeningon' => 1, + 'sharpinfo' => 1, + 'sharpmethod' => 1, + 'sharpnessapproximation' => 1, + 'sharpnessfreqtable' => 1, + 'sharpnesstable' => 1, + 'sharpobjbacktype' => 1, + 'sharpobjname' => 1, + 'sharpobjtype' => 1, + 'sharpobjversion' => 1, + 'sheetdisclosure' => 1, + 'shifttiming' => 1, + 'shimdata' => 1, + 'shootingcount' => 1, + 'shootingrecord' => 1, + 'shootobjbacktype' => 1, + 'shootobjname' => 1, + 'shootobjtype' => 1, + 'shootobjversion' => 1, + 'shootsetup' => 1, + 'shotinfo' => 1, + 'shotinfo02xx' => 1, + 'shotinfod300a' => 1, + 'shotinfod300b' => 1, + 'shotinfod300s' => 1, + 'shotinfod3a' => 1, + 'shotinfod3b' => 1, + 'shotinfod3s' => 1, + 'shotinfod3x' => 1, + 'shotinfod4' => 1, + 'shotinfod40' => 1, + 'shotinfod4s' => 1, + 'shotinfod5' => 1, + 'shotinfod500' => 1, + 'shotinfod5000' => 1, + 'shotinfod5100' => 1, + 'shotinfod5200' => 1, + 'shotinfod6' => 1, + 'shotinfod610' => 1, + 'shotinfod700' => 1, + 'shotinfod7000' => 1, + 'shotinfod80' => 1, + 'shotinfod800' => 1, + 'shotinfod810' => 1, + 'shotinfod850' => 1, + 'shotinfod90' => 1, + 'shotinfounknown' => 1, + 'shotinfoversion' => 1, + 'shotinfoz7ii' => 1, + 'shotinfoz9' => 1, + 'showmode' => 1, + 'showobjects' => 1, + 'shutterangle' => 1, + 'shuttercurtainhack' => 1, + 'shutterspeed' => 1, + 'shutterspeeddisplayed' => 1, + 'sidebars' => 1, + 'sidelightstrength' => 1, + 'sigma' => 1, + 'sigmanoisefiltercaltablev1' => 1, + 'sigmanoisefiltertablev1' => 1, + 'sigmanoisefiltertablev1version' => 1, + 'sigmanoisethreshtablev2' => 1, + 'signalnumber' => 1, + 'signature' => 1, + 'signature_name' => 1, + 'signatureusagerights' => 1, + 'signercontactinfo' => 1, + 'significantbits' => 1, + 'signingauthority' => 1, + 'signingdate' => 1, + 'signinglocation' => 1, + 'signingreason' => 1, + 'signtype' => 1, + 'simpleindex' => 1, + 'simplicityprofile' => 1, + 'singlequality' => 1, + 'singleshotdepthmap' => 1, + 'singleshotdepthmaptiff' => 1, + 'singleshotmeta' => 1, + 'site' => 1, + 'siteenter' => 1, + 'siteexit' => 1, + 'siunits' => 1, + 'sixthlanguage' => 1, + 'size' => 1, + 'sizemode' => 1, + 'skip' => 1, + 'slateinformation' => 1, + 'sliceinfo' => 1, + 'slicesgroupname' => 1, + 'slides' => 1, + 'slideshow' => 1, + 'smaxsamplevalue' => 1, + 'sminsamplevalue' => 1, + 'smpteformat' => 1, + 'smpteoffset' => 1, + 'snapshotid' => 1, + 'snapshotname' => 1, + 'soctemperature' => 1, + 'softedit' => 1, + 'softfocusfilter' => 1, + 'softwarecomponents' => 1, + 'softwarerelease' => 1, + 'sony' => 1, + 'sony_0x9416' => 1, + 'sonyfnumber2' => 1, + 'sonyrawfiletype' => 1, + 'sonytonecurve' => 1, + 'soundfile' => 1, + 'soundschemetitle' => 1, + 'sourcecreatedate' => 1, + 'sourcedata' => 1, + 'sourcedate' => 1, + 'sourceedition' => 1, + 'sourcefilename' => 1, + 'sourceform' => 1, + 'sourceid' => 1, + 'sourceimagedirectory' => 1, + 'sourceimagefilename' => 1, + 'sourceimageheight' => 1, + 'sourceimagevolumename' => 1, + 'sourceimagewidth' => 1, + 'sourcepublisher' => 1, + 'sourcerights' => 1, + 'sourcetitle' => 1, + 'sourceurl' => 1, + 'spacefree' => 1, + 'spaceused' => 1, + 'spatialorientation' => 1, + 'spatialresolution' => 1, + 'specialbuild' => 1, + 'specialeffectsopticalfilter' => 1, + 'specialfolderdata' => 1, + 'specificationversion' => 1, + 'spectralviewingconditions' => 1, + 'spectralwhitepoint' => 1, + 'speed' => 1, + 'sphericalvideo' => 1, + 'sphericalvideoxml' => 1, + 'spiff' => 1, + 'spiffversion' => 1, + 'spinstrength' => 1, + 'spothalftone' => 1, + 'spouse' => 1, + 'sr2dataifd' => 1, + 'sr2private' => 1, + 'sr2subifdkey' => 1, + 'sr2subifdlength' => 1, + 'sr2subifdoffset' => 1, + 'srawtype' => 1, + 'srf2key' => 1, + 'srf6offset' => 1, + 'srfdataoffset' => 1, + 'stampinfo' => 1, + 'stamptoolcount' => 1, + 'standardtocustompcc' => 1, + 'standbymonitorofftime' => 1, + 'starring' => 1, + 'startdate' => 1, + 'startedgecode' => 1, + 'startofframe' => 1, + 'startreading' => 1, + 'starttime' => 1, + 'stateorprovince' => 1, + 'stationcallsign' => 1, + 'stationname' => 1, + 'statistics' => 1, + 'stdautoactive' => 1, + 'stdbasename' => 1, + 'stdhotfolder' => 1, + 'stdopeninphotoshop' => 1, + 'stdoutputbitdepth' => 1, + 'stdoutputcolormode' => 1, + 'stdoutputfiletype' => 1, + 'stdoxygen' => 1, + 'stdsaveselection' => 1, + 'stdscaledoutput' => 1, + 'stdsharpenoutput' => 1, + 'stereo' => 1, + 'stereoimage' => 1, + 'stereoscopic3d' => 1, + 'stillimagetime' => 1, + 'stim' => 1, + 'stimversion' => 1, + 'stitchcolumns' => 1, + 'stitchinfo' => 1, + 'stitchrows' => 1, + 'stonits' => 1, + 'storage-streampathname' => 1, + 'storageformatdate' => 1, + 'storageformattime' => 1, + 'storagemodel' => 1, + 'storageserialnumber' => 1, + 'storagetype' => 1, + 'store' => 1, + 'stream' => 1, + 'streamavgbitrate' => 1, + 'streamavgpacketsize' => 1, + 'streambitdepth' => 1, + 'streambitrateprops' => 1, + 'streamcolor' => 1, + 'streamcount' => 1, + 'streamdata' => 1, + 'streamduration' => 1, + 'streamheader' => 1, + 'streaminfo' => 1, + 'streamingdataprotocol' => 1, + 'streammaxbitrate' => 1, + 'streammaxpacketsize' => 1, + 'streammimelen' => 1, + 'streammimetype' => 1, + 'streamname' => 1, + 'streamnamelen' => 1, + 'streamnumber' => 1, + 'streampreroll' => 1, + 'streamprioritization' => 1, + 'streamproperties' => 1, + 'streamsamplecount' => 1, + 'streamsamplerate' => 1, + 'streamstarttime' => 1, + 'streamtypeinfo' => 1, + 'street' => 1, + 'stridable' => 1, + 'strikeout' => 1, + 'stripbytecounts' => 1, + 'stripoffsets' => 1, + 'striprowcounts' => 1, + 'strobe' => 1, + 'strobetime' => 1, + 'structuretype' => 1, + 'studio' => 1, + 'sub-sampleinformation' => 1, + 'subdialframeadvance' => 1, + 'subdialframeadvancerating0' => 1, + 'subdialframeadvancerating1' => 1, + 'subdialframeadvancerating2' => 1, + 'subdialframeadvancerating3' => 1, + 'subdialframeadvancerating4' => 1, + 'subdialframeadvancerating5' => 1, + 'subdir3000' => 1, + 'subdir3100' => 1, + 'subdir3400' => 1, + 'subdir3900' => 1, + 'subfile' => 1, + 'subifd' => 1, + 'subifd0' => 1, + 'subifd1' => 1, + 'subifd2' => 1, + 'subifd255' => 1, + 'subifd3' => 1, + 'subifd4' => 1, + 'subifd5' => 1, + 'subifd6' => 1, + 'subifd_offset' => 1, + 'subimagecolor' => 1, + 'subimagehdr' => 1, + 'subimageheight' => 1, + 'subimageicc_profile' => 1, + 'subimagenumericalformat' => 1, + 'subimageresolutions' => 1, + 'subimagetilecount' => 1, + 'subimagetileheight' => 1, + 'subimagetilewidth' => 1, + 'subimagewidth' => 1, + 'subjectpixelheight' => 1, + 'subjectpixelwidth' => 1, + 'subjectscale' => 1, + 'subjectunits' => 1, + 'subpacketh' => 1, + 'subpacketsize' => 1, + 'subscriptioncontentid' => 1, + 'subsystem' => 1, + 'subsystemversion' => 1, + 'subtileblocksize' => 1, + 'subtitledescription' => 1, + 'suffix' => 1, + 'suggestedpalette' => 1, + 'summary' => 1, + 'summaryinfo' => 1, + 'surfacemap' => 1, + 'surroundmode' => 1, + 'surroundshotvideo' => 1, + 'surroundshotvideoname' => 1, + 'svgversion' => 1, + 'swf' => 1, + 'sync01' => 1, + 'sync02' => 1, + 'sync03' => 1, + 'sync04' => 1, + 'sync05' => 1, + 'sync06' => 1, + 'sync07' => 1, + 'sync08' => 1, + 'sync09' => 1, + 'sync10' => 1, + 'sync11' => 1, + 'sync12' => 1, + 'sync13' => 1, + 'sync14' => 1, + 'sync15' => 1, + 'sync16' => 1, + 'synchronizedlyricsdescription' => 1, + 'synchronizedlyricstext' => 1, + 'synchronizedlyricstype' => 1, + 'synconly' => 1, + 'syncsampletable' => 1, + 'syncstate' => 1, + 'synlyrics' => 1, + 'systemtime' => 1, + 't4options' => 1, + 't6options' => 1, + 't82options' => 1, + 't88options' => 1, + 'tag2010a' => 1, + 'tag2010b' => 1, + 'tag2010c' => 1, + 'tag2010d' => 1, + 'tag2010e' => 1, + 'tag2010f' => 1, + 'tag2010g' => 1, + 'tag2010h' => 1, + 'tag2010i' => 1, + 'tag202a' => 1, + 'tag900b' => 1, + 'tag9050a' => 1, + 'tag9050b' => 1, + 'tag9050c' => 1, + 'tag9400a' => 1, + 'tag9400b' => 1, + 'tag9400c' => 1, + 'tag9401' => 1, + 'tag9402' => 1, + 'tag9403' => 1, + 'tag9404a' => 1, + 'tag9404b' => 1, + 'tag9404c' => 1, + 'tag9405a' => 1, + 'tag9405b' => 1, + 'tag9406' => 1, + 'tag940a' => 1, + 'tag940c' => 1, + 'tag940e' => 1, + 'tag9416_0000' => 1, + 'taggedpdf' => 1, + 'taggingtime' => 1, + 'take' => 1, + 'tamper-proofkeys' => 1, + 'targetaudiences' => 1, + 'targetdeltatype' => 1, + 'targetfiledosname' => 1, + 'targetfilesize' => 1, + 'targetlayerid' => 1, + 'targetxy' => 1, + 'taskowner' => 1, + 'tattoo' => 1, + 'tcmediainfo' => 1, + 'tdat' => 1, + 'tdhd' => 1, + 'technician' => 1, + 'technology' => 1, + 'telephonenumber' => 1, + 'telescope' => 1, + 'telex' => 1, + 'temperature' => 1, + 'tempinfo' => 1, + 'template' => 1, + 'temporalidnested' => 1, + 'temporary' => 1, + 'terminationaction' => 1, + 'terminationcondition' => 1, + 'termsofuse' => 1, + 'testtarget' => 1, + 'testtransfertiming' => 1, + 'text' => 1, + 'textcolor' => 1, + 'textface' => 1, + 'textfont' => 1, + 'textinfo' => 1, + 'textinfo1' => 1, + 'textinfo2' => 1, + 'textjunk' => 1, + 'textsize' => 1, + 'texttospeech' => 1, + 'textualdata' => 1, + 'textualinfo' => 1, + 'textureformat' => 1, + 'theora' => 1, + 'theoraversion' => 1, + 'thermalcalibration' => 1, + 'thermaldata' => 1, + 'thermalparams' => 1, + 'thetasubdir' => 1, + 'things' => 1, + 'thirdlanguage' => 1, + 'thumbinfo' => 1, + 'thumbnail' => 1, + 'thumbnailbpg' => 1, + 'thumbnailclip' => 1, + 'thumbnailcompressiontable' => 1, + 'thumbnailexpansiontable' => 1, + 'thumbnailhash' => 1, + 'thumbnailref' => 1, + 'thumbnailresizeratio' => 1, + 'thumbnailtiff' => 1, + 'thumbnailurl' => 1, + 'tickspersecond' => 1, + 'tiff' => 1, + 'tiff-epstandardid' => 1, + 'tiff_fxextensions' => 1, + 'tiffmeteringimageheight' => 1, + 'tiffmeteringimagewidth' => 1, + 'tiffpreview' => 1, + 'tilebytecounts' => 1, + 'tiledepth' => 1, + 'tilegaindeterminationtable' => 1, + 'tileoffsets' => 1, + 'tiles' => 1, + 'timecode' => 1, + 'timecodeindex' => 1, + 'timecodeindexparms' => 1, + 'timeinfo' => 1, + 'timelineinfo' => 1, + 'timeoffset' => 1, + 'timereference' => 1, + 'timescale' => 1, + 'timestamplist' => 1, + 'timestamprandomoffset' => 1, + 'timetosampletable' => 1, + 'title2' => 1, + 'titlelen' => 1, + 'titlenum' => 1, + 'titleofparts' => 1, + 'titlesofparts' => 1, + 'titlesortorder' => 1, + 'toaddresses' => 1, + 'tocitems' => 1, + 'todotitle' => 1, + 'tomtomad' => 1, + 'tomtomhl' => 1, + 'tomtomid' => 1, + 'tomtommetadata' => 1, + 'tomtomvd' => 1, + 'tomtomvi' => 1, + 'tonames' => 1, + 'tonecurvematching' => 1, + 'tonecurvetable' => 1, + 'tonematrix' => 1, + 'toneobjbacktype' => 1, + 'toneobjname' => 1, + 'toneobjtype' => 1, + 'toneobjversion' => 1, + 'tones' => 1, + 'tonescale0' => 1, + 'tonescale0spline' => 1, + 'tonescale1' => 1, + 'tonescale1spline' => 1, + 'tonescale2' => 1, + 'tonescale2spline' => 1, + 'tonescale3' => 1, + 'tonescale3spline' => 1, + 'tonescale4' => 1, + 'tonescale4spline' => 1, + 'tonescale5' => 1, + 'tonescale5spline' => 1, + 'tonescale6' => 1, + 'tonescale6spline' => 1, + 'tonescale7' => 1, + 'tonescale7spline' => 1, + 'tonescale8' => 1, + 'tonescale8spline' => 1, + 'tonescale9' => 1, + 'tonescale9spline' => 1, + 'tonespaceflow' => 1, + 'tonscaletable' => 1, + 'tool_name' => 1, + 'tool_version' => 1, + 'toolname' => 1, + 'toolversion' => 1, + 'topdarkrow1' => 1, + 'topdarkrow2' => 1, + 'topmag' => 1, + 'topmargin' => 1, + 'totalbitrate' => 1, + 'totalbytes' => 1, + 'totalbytesnortpheaders' => 1, + 'totaldatarate' => 1, + 'totalduration' => 1, + 'totaleditingtime' => 1, + 'totaledittime' => 1, + 'totalfilesize' => 1, + 'totalframecount' => 1, + 'totalframes' => 1, + 'totalsamples' => 1, + 'totalsize' => 1, + 'toycamerafilter' => 1, + 'trackaperture' => 1, + 'trackcategory' => 1, + 'trackcomments' => 1, + 'trackduration' => 1, + 'trackerdata' => 1, + 'trackfragment' => 1, + 'trackheader' => 1, + 'trackheaderversion' => 1, + 'trackid' => 1, + 'trackingid' => 1, + 'tracklayer' => 1, + 'tracklyrics' => 1, + 'trackproperty' => 1, + 'trackref' => 1, + 'trackvolume' => 1, + 'trademark' => 1, + 'transactionid' => 1, + 'transfercharacteristic' => 1, + 'transferrange' => 1, + 'transfersequence' => 1, + 'transformation' => 1, + 'transformcreatedate' => 1, + 'transformedimagetitle' => 1, + 'transformmodifydate' => 1, + 'transformnodeid' => 1, + 'transformparams' => 1, + 'transformtitle' => 1, + 'transparency' => 1, + 'transparencyindicator' => 1, + 'transparentcolor' => 1, + 'transparentindex' => 1, + 'trapindicator' => 1, + 'trashcolsright' => 1, + 'trashrowsbottom' => 1, + 'trim' => 1, + 'tty-ttdphone' => 1, + 'tungmat0' => 1, + 'tungmat1' => 1, + 'tungmat2' => 1, + 'tungmat3' => 1, + 'tungmat4' => 1, + 'tungmat5' => 1, + 'tungmat6' => 1, + 'tungmat7' => 1, + 'tungmat8' => 1, + 'tungmat9' => 1, + 'twelvebit' => 1, + 'tx3g' => 1, + 'typeoforiginal' => 1, + 'typist' => 1, + 'ucrbg' => 1, + 'uic1tag' => 1, + 'uic2tag' => 1, + 'uic3tag' => 1, + 'uic4tag' => 1, + 'uncompressed' => 1, + 'uncompressedsize' => 1, + 'uncompressedtextlength' => 1, + 'underflowcolor' => 1, + 'underline' => 1, + 'underlineposition' => 1, + 'underlinethickness' => 1, + 'unicodealphanames' => 1, + 'uninitializeddatasize' => 1, + 'uniquefileidentifier' => 1, + 'uniqueid' => 1, + 'unknown' => 1, + 'unknown00' => 1, + 'unknown01' => 1, + 'unknown02' => 1, + 'unknown03' => 1, + 'unknown_cndb' => 1, + 'unknown_slmt' => 1, + 'unknownd30' => 1, + 'unknowndata' => 1, + 'unknownexif' => 1, + 'unknowninfo' => 1, + 'unknowninfo2' => 1, + 'unknowninfo2version' => 1, + 'unknowninfoifd' => 1, + 'unknowninfoversion' => 1, + 'unknownserial1' => 1, + 'unknownserial2' => 1, + 'unknownserial3' => 1, + 'unknownserial4' => 1, + 'unknowntemperature1' => 1, + 'unknowntemperature2' => 1, + 'unsharpdata' => 1, + 'unshiftednote' => 1, + 'untitled0' => 1, + 'untitled1' => 1, + 'untitled2' => 1, + 'unused' => 1, + 'unusedblackcolsleftin' => 1, + 'unusedblackcolsleftout' => 1, + 'unusedblackcolsrightin' => 1, + 'unusedblackcolsrightout' => 1, + 'unusedblackrowsbottomin' => 1, + 'unusedblackrowsbottomout' => 1, + 'unusedblackrowstopin' => 1, + 'unusedblackrowstopout' => 1, + 'updatedtitle' => 1, + 'ur3' => 1, + 'urllist1' => 1, + 'urn' => 1, + 'usagerightsmessage' => 1, + 'usedextensionnumbers' => 1, + 'useraccess' => 1, + 'useradjsba_rgbshifts' => 1, + 'usercustom1' => 1, + 'usercustom2' => 1, + 'userdata' => 1, + 'userdefinedid' => 1, + 'userdefinedtext' => 1, + 'userdefinedurl' => 1, + 'usereffectiverating' => 1, + 'userid' => 1, + 'userlastplayedtime' => 1, + 'usermetadata' => 1, + 'username' => 1, + 'userplaycount' => 1, + 'userplaycountafternoon' => 1, + 'userplaycountevening' => 1, + 'userplaycountmorning' => 1, + 'userplaycountnight' => 1, + 'userplaycountweekday' => 1, + 'userplaycountweekend' => 1, + 'userselectgrouptitle' => 1, + 'userservicerating' => 1, + 'usertext' => 1, + 'userweburl' => 1, + 'usingtransforms' => 1, + 'usmparametershigh' => 1, + 'usmparametershost' => 1, + 'usmparametershost3mp' => 1, + 'usmparametershost6mp' => 1, + 'usmparameterslow' => 1, + 'usmparametersmed' => 1, + 'usptomiscellaneous' => 1, + 'usptooriginalcontenttype' => 1, + 'utm' => 1, + 'uuid-c2paclaimsignature' => 1, + 'uuid-canon' => 1, + 'uuid-canon2' => 1, + 'uuid-exif' => 1, + 'uuid-exif2' => 1, + 'uuid-exif_bad' => 1, + 'uuid-flip' => 1, + 'uuid-geojp2' => 1, + 'uuid-iptc' => 1, + 'uuid-iptc2' => 1, + 'uuid-photoshop' => 1, + 'uuid-prof' => 1, + 'uuid-signature' => 1, + 'uuid-unknown' => 1, + 'uuid-usmt' => 1, + 'uuid-xmp' => 1, + 'uuidinfo' => 1, + 'uuidlist' => 1, + 'validafpoints' => 1, + 'validate' => 1, + 'value0' => 1, + 'value1' => 1, + 'value2' => 1, + 'value3' => 1, + 'vary' => 1, + 'vbrbytes' => 1, + 'vbrframes' => 1, + 'vbrpeak' => 1, + 'vbrscale' => 1, + 'vddimdacnominalvalues' => 1, + 'vegasversionmajor' => 1, + 'vegasversionminor' => 1, + 'vendorid' => 1, + 'vendorname' => 1, + 'vendorurl' => 1, + 'version1' => 1, + 'version2' => 1, + 'versionbf' => 1, + 'versionifd' => 1, + 'versioninfo' => 1, + 'versionrestrictions' => 1, + 'versionyear' => 1, + 'verticalaf-onbutton' => 1, + 'verticalcitation' => 1, + 'verticalcstype' => 1, + 'verticaldatum' => 1, + 'verticaldivergence' => 1, + 'verticalresolution' => 1, + 'verticalscale' => 1, + 'verticalspeed' => 1, + 'verticalunits' => 1, + 'video' => 1, + 'videoattributes' => 1, + 'videoavgbitrate' => 1, + 'videoavgframerate' => 1, + 'videocardgamma' => 1, + 'videoclosedcaptioning' => 1, + 'videocodecdescription' => 1, + 'videocodecid' => 1, + 'videocodecinfo' => 1, + 'videocodecname' => 1, + 'videoencoding' => 1, + 'videoformat' => 1, + 'videoframecount' => 1, + 'videoheader' => 1, + 'videoheight' => 1, + 'videomaxbitrate' => 1, + 'videomaxframerate' => 1, + 'videomode' => 1, + 'videoorientation' => 1, + 'videoprofile' => 1, + 'videoprofileversion' => 1, + 'videosampledesc' => 1, + 'videoscantype' => 1, + 'videosize' => 1, + 'videostreamtype' => 1, + 'videotimestamp' => 1, + 'videotrackid' => 1, + 'videowidth' => 1, + 'view' => 1, + 'viewable' => 1, + 'viewingconddesc' => 1, + 'viewingcondilluminant' => 1, + 'viewingcondilluminanttype' => 1, + 'viewingconditions' => 1, + 'viewingcondsurround' => 1, + 'viewtype' => 1, + 'vignettingcorr' => 1, + 'vignettingcorr2' => 1, + 'vignettingcorrunknown1' => 1, + 'vignettingcorrunknown2' => 1, + 'vignettingcorrversion' => 1, + 'vignettingparams' => 1, + 'vintagestrength' => 1, + 'virtualimageheight' => 1, + 'virtualimagewidth' => 1, + 'virtualpage' => 1, + 'virtualpageunits' => 1, + 'visibleoutputs' => 1, + 'vistaidlistdata' => 1, + 'visualflightruleshud' => 1, + 'vmaphandling' => 1, + 'vmcoldropthresh' => 1, + 'vmcolthresh' => 1, + 'vmnbands' => 1, + 'vmpatchreslimit' => 1, + 'vmpixthresh' => 1, + 'vmwsize' => 1, + 'volumeblockcount' => 1, + 'volumeblocksize' => 1, + 'volumecreatedate' => 1, + 'volumeeffectivedate' => 1, + 'volumeexpirationdate' => 1, + 'volumeid' => 1, + 'volumelabel' => 1, + 'volumelevelr128' => 1, + 'volumemodifydate' => 1, + 'volumename' => 1, + 'volumenormalization' => 1, + 'volumesetdiskcount' => 1, + 'volumesetdisknumber' => 1, + 'volumesetname' => 1, + 'volumesize' => 1, + 'vorbis' => 1, + 'vorbiscomment' => 1, + 'vorbisversion' => 1, + 'vp8bitstream' => 1, + 'vp8l' => 1, + 'vp8version' => 1, + 'vp8x' => 1, + 'vrd1' => 1, + 'vrd2' => 1, + 'vrdstamptool' => 1, + 'vrdversion' => 1, + 'vrinfo' => 1, + 'vrinfoversion' => 1, + 'vw96' => 1, + 'wangannotation' => 1, + 'wangtag1' => 1, + 'wangtag3' => 1, + 'wangtag4' => 1, + 'warning' => 1, + 'warpquadrilateral' => 1, + 'watched' => 1, + 'watercolorfilter' => 1, + 'watermark' => 1, + 'watermarktype' => 1, + 'watermarkurl' => 1, + 'wave' => 1, + 'wb_bluelevelauto' => 1, + 'wb_cfa0_leveldaylight' => 1, + 'wb_cfa1_leveldaylight' => 1, + 'wb_cfa2_leveldaylight' => 1, + 'wb_cfa3_leveldaylight' => 1, + 'wb_grblevels' => 1, + 'wb_grblevelsauto' => 1, + 'wb_grblevelsstandard' => 1, + 'wb_grgblevels' => 1, + 'wb_grgblevelsauto' => 1, + 'wb_grgblevelscloudy' => 1, + 'wb_grgblevelsdaylight' => 1, + 'wb_grgblevelsdaylightfluor' => 1, + 'wb_grgblevelsdaywhitefluor' => 1, + 'wb_grgblevelslivingroomwarmwhitefluor' => 1, + 'wb_grgblevelstungsten' => 1, + 'wb_grgblevelswarmwhitefluor' => 1, + 'wb_grgblevelswhitefluorescent' => 1, + 'wb_redlevelauto' => 1, + 'wb_rgbcoeffsdaylight' => 1, + 'wb_rgbcoeffsflash' => 1, + 'wb_rgbcoeffsfluorescent' => 1, + 'wb_rgbcoeffstungsten' => 1, + 'wb_rgblevelsasshot' => 1, + 'wb_rgblevelscustom' => 1, + 'wbadjdata' => 1, + 'wbblueasshot' => 1, + 'wbbluecloudy' => 1, + 'wbbluedaylight' => 1, + 'wbblueflash' => 1, + 'wbbluefluorescent' => 1, + 'wbbluetungsten' => 1, + 'wbgreenasshot' => 1, + 'wbgreencloudy' => 1, + 'wbgreendaylight' => 1, + 'wbgreenflash' => 1, + 'wbgreenfluorescent' => 1, + 'wbgreentungsten' => 1, + 'wbinfo' => 1, + 'wbinfo2' => 1, + 'wbinfoa100' => 1, + 'wblevels' => 1, + 'wbredasshot' => 1, + 'wbredcloudy' => 1, + 'wbreddaylight' => 1, + 'wbredflash' => 1, + 'wbredfluorescent' => 1, + 'wbredtungsten' => 1, + 'wbsettings' => 1, + 'wbsettings2' => 1, + 'wcsprofiles' => 1, + 'webpage' => 1, + 'weight' => 1, + 'whitebalancematching' => 1, + 'whitebalancergb' => 1, + 'whitebalancetable' => 1, + 'whiteluminance' => 1, + 'whitepointx' => 1, + 'whitepointy' => 1, + 'whitesample' => 1, + 'whitesamplebits' => 1, + 'whitesampleheight' => 1, + 'whitesampleleftborder' => 1, + 'whitesampletopborder' => 1, + 'whitesamplewidth' => 1, + 'wide' => 1, + 'widthbytes' => 1, + 'widthresolution' => 1, + 'wifirssi' => 1, + 'windoworigin' => 1, + 'windoworiginauto' => 1, + 'windowsdevmode' => 1, + 'windowsfilename' => 1, + 'windowsize' => 1, + 'windowtarget' => 1, + 'wm_collectiongroupid' => 1, + 'wm_collectionid' => 1, + 'wm_contentid' => 1, + 'wm_mediaclassprimaryid' => 1, + 'wm_mediaclasssecondaryid' => 1, + 'wm_provider' => 1, + 'wmadrcaveragereference' => 1, + 'wmadrcaveragetarget' => 1, + 'wmadrcpeakreference' => 1, + 'wmadrcpeaktarget' => 1, + 'wmcollectiongroupid' => 1, + 'wmcollectionid' => 1, + 'wmcontentid' => 1, + 'wmshadowfilesourcedrmtype' => 1, + 'wmshadowfilesourcefiletype' => 1, + 'word97' => 1, + 'worddocument' => 1, + 'words' => 1, + 'workflowurl' => 1, + 'workingdirectory' => 1, + 'workingpath' => 1, + 'worldtime' => 1, + 'worldtocamera' => 1, + 'worldtondc' => 1, + 'wrapmodes' => 1, + 'writername' => 1, + 'writers' => 1, + 'writtenby' => 1, + 'wwsfamilyname' => 1, + 'wwssubfamilyname' => 1, + 'x' => 1, + 'xattrapplemaildatereceived' => 1, + 'xattrapplemaildatesent' => 1, + 'xattrapplemailisremoteattachment' => 1, + 'xattrfinderinfo' => 1, + 'xattrlastuseddate' => 1, + 'xattrmditemdownloadeddate' => 1, + 'xattrmditemfindercomment' => 1, + 'xattrmditemwherefroms' => 1, + 'xattrmdlabel' => 1, + 'xattrresourcefork' => 1, + 'xcfversion' => 1, + 'xclippathunits' => 1, + 'xheight' => 1, + 'xidiri' => 1, + 'xmag' => 1, + 'xmethod' => 1, + 'xmldata' => 1, + 'xmlfiletype' => 1, + 'xmlpackets' => 1, + 'xmp_profile' => 1, + 'xmpbj' => 1, + 'xmpdm' => 1, + 'xmpmm' => 1, + 'xmpnote' => 1, + 'xmpplus' => 1, + 'xmprights' => 1, + 'xmptpg' => 1, + 'xobject' => 1, + 'xoffset' => 1, + 'xp_dip_xml' => 1, + 'xtranslayout' => 1, + 'xylocation' => 1, + 'xyoffsetinfo' => 1, + 'yclippathunits' => 1, + 'ycrcbmatrix' => 1, + 'ylevel' => 1, + 'ymag' => 1, + 'ymethod' => 1, + 'yoffset' => 1, + 'ytarget' => 1, + 'zipbitflag' => 1, + 'zipcompressedsize' => 1, + 'zipcompression' => 1, + 'zipcrc' => 1, + 'zipfilecomment' => 1, + 'zipfilename' => 1, + 'zipmodifydate' => 1, + 'ziprequiredversion' => 1, + 'zipuncompressedsize' => 1, + 'zisrawversion' => 1, + 'zoom' => 1, + 'zoomedpreviewimage' => 1, + 'zoompos' => 1, + 'zoomposition' => 1, + 'zoomstrength' => 1, + 'zxif' => 1, +); + +# module names for writable Composite tags +my %compositeModules = ( + 'filenumber' => 'Image::ExifTool::Canon', + 'flash' => 'Image::ExifTool::XMP', + 'gpslatitude' => 'Image::ExifTool::GPS', + 'gpslongitude' => 'Image::ExifTool::GPS', + 'gpsposition' => 'Image::ExifTool::Exif', + 'jpgfromraw' => 'Image::ExifTool::Exif', + 'originaldecisiondata' => 'Image::ExifTool::Canon', + 'otherimage' => 'Image::ExifTool::Exif', + 'previewimage' => 'Image::ExifTool::Exif', + 'rotation' => 'Image::ExifTool::QuickTime', + 'subseccreatedate' => 'Image::ExifTool::Exif', + 'subsecdatetimeoriginal' => 'Image::ExifTool::Exif', + 'subsecmodifydate' => 'Image::ExifTool::Exif', + 'thumbnailimage' => 'Image::ExifTool::Exif', +); + +#++++ End automatically generated code ++++ + +my %specialStruct = ( + NAMESPACE => 1, + STRUCT_NAME => 1, + TYPE => 1, + NOTES => 1, + GROUPS => 1, +); + +# insert any user-defined tags into our tag lookup +if (%Image::ExifTool::UserDefined) { + my @userTables = sort keys %Image::ExifTool::UserDefined; + while (@userTables) { + my $table = shift @userTables; + AddTags($Image::ExifTool::UserDefined{$table}, $table); + } +} + +# insert any other queued tags from plug-in modules +if (@Image::ExifTool::pluginTags) { + my $args; + foreach $args (@Image::ExifTool::pluginTags) { + AddTags($$args[0], $$args[1]); + } + undef @Image::ExifTool::pluginTags; +} + + +#------------------------------------------------------------------------------ +# Add tag names corresponding to flattened XMP tags for all structure fields +# Inputs: 0) tag table ref for flattened tags, 1) tagID, 2) lowercase tag name, +# 3) tag ID list ref, 4) reference to list of lowercase tag names +# 5) table number in lookup, 6) tagInfo hash for parent structure +# 7) tag ID of top-level structure +# Notes: Used only for user-defined structures +sub AddFields($$$$$$;$$) +{ + my ($tagTablePtr, $tagID, $lcTag, $tagIDs, $lcTags, $tnum, $tagInfo, $baseID) = @_; + return if length($tagID) > 500; # avoid deep recursion + unless ($tagInfo) { + $tagInfo = $$tagTablePtr{$tagID}; + $baseID = $tagID; + } + my $strTable = $$tagInfo{Struct}; + unless (ref $strTable) { + my $strName = $strTable; + $strTable = $Image::ExifTool::UserDefined::xmpStruct{$strTable}; + $strTable or warn("No definition for structure '${strName}'\n"), return; + $$strTable{STRUCT_NAME} or $$strTable{STRUCT_NAME} = "XMP $strName"; + $$tagInfo{Struct} = $strTable; # replace name with hash ref + delete $$tagInfo{SubDirectory}; # deprecated use of SubDirectory in Struct tags + } + # inherit NAMESPACE from parent table if it doesn't exist + $$strTable{NAMESPACE} = $$tagTablePtr{NAMESPACE} unless exists $$strTable{NAMESPACE}; + my $field; + foreach $field (keys %$strTable) { + next if $specialStruct{$field}; + my $id = $tagID . ucfirst($field); + # use name of existing flattened tag if already defined + my $flatInfo = $$tagTablePtr{$id}; + my $fieldInfo = $$strTable{$field}; + my $flatName; + $flatName = $$fieldInfo{FlatName} if ref $fieldInfo eq 'HASH'; + $flatName or ($flatName = $field) =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters + my $lc = ($flatInfo and $$flatInfo{Name}) ? lc $$flatInfo{Name} : $lcTag . lc($flatName); + my $copyID = $baseID; + push @$tagIDs, \$copyID, $id; + push @$lcTags, $lc, $lc; + next unless ref $fieldInfo eq 'HASH' and $$fieldInfo{Struct}; + # recursively add flattened tags for all sub-fields + AddFields($tagTablePtr, $id, $lc, $tagIDs, $lcTags, $tnum, $fieldInfo, $baseID); + } +} + +#------------------------------------------------------------------------------ +# Add tags to the lookup (for user-defined tags, etc) +# Inputs: 0) tag table ref, 1) table name +my %tableNumHash; +sub AddTags($$) +{ + my ($tagTablePtr, $table) = @_; + + # generate lookup for table numbers if not done already + unless (%tableNumHash) { + my $tnum = 0; + my $tbl; + foreach $tbl (@tableList) { + $tableNumHash{$tbl} = $tnum++; + } + } + my (@moreTables, %moreTableRefs); + for (;;) { + my $tnum = $tableNumHash{$table}; + unless (defined $tnum) { + # add new table to list + $tnum = scalar @tableList; + push @tableList, $table; + } + my $tagID; + foreach $tagID (Image::ExifTool::TagTableKeys($tagTablePtr)) { + my $newInfo = $$tagTablePtr{$tagID}; + if (ref $newInfo eq 'HASH') { + $$newInfo{Name} or $$newInfo{Name} = Image::ExifTool::MakeTagName($tagID); + # use new ID of tag in Composite table in case it changed + $tagID = $$newInfo{NewTagID} if defined $$newInfo{NewTagID}; + } else { + $newInfo = $$tagTablePtr{$tagID} = { Name => $newInfo }; + } + my $lcTag = lc $$newInfo{Name}; + my (@lcTags, @tagIDs, $existed, $isFlat); + # if this is a structure, add all flattened tag names to lookup + if ($$newInfo{Struct}) { + AddFields($tagTablePtr, $tagID, $lcTag, \@tagIDs, \@lcTags, $tnum); + } + # add tags to lookup even though we don't know if they are writable + # (to save speed by not having to load the module) +Tags: for (;;) { + my $lookup = $tagLookup{$lcTag}; + $lookup or $lookup = $tagLookup{$lcTag} = { }; + if ($$lookup{$tnum}) { + my $le = $$lookup{$tnum}; + my $ids = (ref $le eq 'ARRAY') ? $le : [ $le ]; + if (ref $tagID) { + # a reference points to the tag ID of the base structure for + # a flattened tag. There must be only one of these, + # and it must come first. + unshift @$ids, $tagID unless ref $$ids[0]; + # only add new tag ID if it didn't already exist + } elsif (grep /^$tagID$/, @$ids) { + $existed = 1 unless $isFlat; + } else { + push @$ids, $tagID; + } + # only update lookup if there is now more than one entry + $$lookup{$tnum} = $ids if @$ids > 1; + } else { + $$lookup{$tnum} = $tagID; + } + last unless @tagIDs; + for (;;) { + $tagID = shift @tagIDs; + $lcTag = shift @lcTags; + last unless $$tagTablePtr{$tagID}; # don't waste time if it exists + last Tags unless @tagIDs; + } + $isFlat = 1; + } + # add any new subdirectory tables (unless done already) + next if $existed or not $$newInfo{SubDirectory}; + my $subTable = $$newInfo{SubDirectory}{TagTable}; + next unless $subTable and not defined $tableNumHash{$subTable}; + next if $moreTableRefs{$subTable}; + no strict 'refs'; + next unless %$subTable; + # save new table to process after this one + push @moreTables, $subTable; + $moreTableRefs{$subTable} = \%$subTable; + # save source table name so we can load it when necessary + $$subTable{SRC_TABLE} = $table; + } + $table = shift @moreTables or last; + $tagTablePtr = $moreTableRefs{$table}; + } +} + +#------------------------------------------------------------------------------ +# Return true if the tag exists +# Inputs: 0) tag name (case insensitive) +# Returns: true if tag exists +sub TagExists($) +{ + my $tag = lc($_[0]); + return 1 if $tagExists{$tag} or $tagLookup{$tag}; + return 0; +} + +#------------------------------------------------------------------------------ +# Find information for writable tags (case insensitive) +# Inputs: 0) tag name (case insensitive) +# Returns: Scalar context: tag info or false if none found +# List context: list of all matching tagInfo hashes +sub FindTagInfo($) +{ + local $_; + my $tag = shift; + my $lcTag = lc($tag); + my ($tableNum, @tagInfoList, @lookups); + my $lookup = $tagLookup{$lcTag}; + if (not $lookup and $lcTag =~ /[?*]/) { + # allow wildcards in tag name + my $pat = $lcTag; + $pat =~ s/\*/[-\\w]*/g; + $pat =~ s/\?/[-\\w]/g; + my @tags = grep(/^$pat$/, keys %tagLookup); + if (@tags) { + push @lookups, $tagLookup{$_} foreach sort @tags; + $lookup = shift @lookups; + } + } + while ($lookup) { + foreach $tableNum (sort { $a <=> $b } keys %$lookup) { + my $table = GetTagTable($tableList[$tableNum]); + my $le = $$lookup{$tableNum}; + my ($tagID, $tagIDs); + if (ref $le eq 'ARRAY') { + $tagIDs = $le; + # if first entry is a reference, it indicates that this is a + # flattened tag and refers to the tag ID of the containing top-level + # structure, so now is the time to generate the flattened tags + if (ref $$tagIDs[0]) { + # (remove from the lookup since we only need to do this once) + my $rootIDPtr = shift @$tagIDs; + require Image::ExifTool::XMP; + Image::ExifTool::XMP::AddFlattenedTags($table, $$rootIDPtr); + } + } else { + $tagIDs = [ $le ]; + } + foreach $tagID (@$tagIDs) { + my @infoList = GetTagInfoList($table,$tagID); + unless (@infoList) { + my $reload; + # call write proc if it exists in case it adds tags to the table + my $writeProc = $table->{WRITE_PROC}; + if ($writeProc) { + no strict 'refs'; + $reload = 1 if &$writeProc(); + } + # load module with composite tag if necessary + my $compMod = $compositeModules{$lcTag}; + $reload = 1 if $compMod and eval "require $compMod"; + @infoList = GetTagInfoList($table,$tagID) if $reload; + } + if (@infoList == 1) { + push @tagInfoList, @infoList; + } elsif (@infoList > 1) { + my $tagInfo; + # must check tag list in case tags have different names + foreach $tagInfo (@infoList) { + next unless $lcTag eq lc($$tagInfo{Name}); + push @tagInfoList, $tagInfo; + } + } + } + } + $lookup = shift @lookups; + } + if (wantarray) { + return @tagInfoList; + } else { + return $tagInfoList[0]; + } +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::TagLookup - Fast lookup for ExifTool tags + +=head1 SYNOPSIS + +This module is required by Image::ExifTool for writing tags. + +=head1 DESCRIPTION + +Provides a fast, case insensitive lookup for tag names. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::BuildTagLookup(3pm)|Image::ExifTool::BuildTagLookup>, +L<Image::ExifTool::TagNames(3pm)|Image::ExifTool::TagNames> + +=cut diff --git a/lib/Image/ExifTool/TagNames.pod b/lib/Image/ExifTool/TagNames.pod new file mode 100644 index 0000000..dfbdcbd --- /dev/null +++ b/lib/Image/ExifTool/TagNames.pod @@ -0,0 +1,37990 @@ + +=head1 NAME + +Image::ExifTool::TagNames - ExifTool tag name documentation + +=head1 DESCRIPTION + +This document contains a complete list of ExifTool tag names, organized into +tables based on information type. Tag names are used to reference specific +meta information extracted from or written to a file. + +=head1 TAG TABLES + +The tables listed below give the names of all tags recognized by ExifTool. +They contain a total of 25816 tags, with 16503 unique tag names. + +B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each +table. A B<Tag ID> is the computer-readable equivalent of a tag name, and +is the identifier that is actually stored in the file. B<Index#> refers to +the offset of a value when found at a fixed position within a data block +(B<#> is the multiplier for calculating a byte offset: B<1>, B<2>, B<4> or +B<8>). These offsets may have a decimal part which is used only to +differentiate tags with values stored at the same position. (Note that +writable tags within binary data blocks are not individually deletable, +and the usual alternative is to set them to a value of zero.) B<Sequence> +gives the order of values for a serial data stream. + +A B<Tag Name> is the handle by which the information is accessed in +ExifTool. In some instances, more than one name may correspond to a single +tag ID. In these cases, the actual name used depends on the context in +which the information is found. Case is not significant for tag names. A +question mark (C<?>) after a tag name indicates that the information is +either not understood, not verified, or not very useful -- these tags are +not extracted by ExifTool unless the Unknown (-u) option is enabled. Be +aware that some tag names are different than the descriptions printed out by +default when extracting information with exiftool. To see the tag names +instead of the descriptions, use C<exiftool -s>. + +The B<Writable> column indicates whether the tag is writable by ExifTool. +Anything but a C<no> in this column means the tag is writable. A C<yes> +indicates writable information that is either unformatted or written using +the existing format. Other expressions give details about the format of the +stored value, and vary depending on the general type of information. The +format name may be followed by a number in square brackets to indicate the +number of values written, or the number of characters in a fixed-length +string (including a null terminator which is added if required). + +A plus sign (C<+>) after an entry in the B<Writable> column indicates a +I<List> tag which supports multiple values and allows individual values to +be added and deleted. A slash (C</>) indicates a tag that ExifTool will +I<Avoid> when writing. These will be edited but not created if another +same-named tag may be created instead. To create these tags, the group +should be specified. A tilde (C<~>) indicates a tag this is writable only +when the print conversion is disabled (by setting PrintConv to 0, using the +-n option, or suffixing the tag name with a C<#> character). An exclamation +point (C<!>) indicates a tag that is considered I<Unsafe> to write under +normal circumstances. These tags are not written unless specified +explicitly (ie. not when wildcards or "all" are used), and care should be +taken when editing them manually since they may affect the way an image is +rendered. An asterisk (C<*>) indicates a I<Protected> tag which is not +writable directly, but is written automatically by ExifTool (often when a +corresponding L<Composite|Image::ExifTool::TagNames/Composite Tags> or +L<Extra|Image::ExifTool::TagNames/Extra Tags> tag is written). A colon +(C<:>) indicates a I<Mandatory> tag which may be added automatically when +writing. Normally MakerNotes tags may not be deleted individually, but a +caret (C<^>) indicates a I<Deletable> MakerNotes tag. + +The HTML version of these tables also lists possible B<Values> for +discrete-valued tags, as well as B<Notes> for some tags. The B<Values> are +listed with the computer-readable values on the left of the equals sign +(C<=>), and the human-readable values on the right. The human-readable +values are used by default when reading and writing, but the +computer-readable values may be accessed by disabling the value conversion +with the -n option on the command line, by setting the PrintConv option to 0 +in the API, or or on a per-tag basis by adding a hash (C<#>) after the tag +name. + +B<Note>: If you are familiar with common meta-information tag names, you may +find that some ExifTool tag names are different than expected. The usual +reason for this is to make the tag names more consistent across different +types of meta information. To determine a tag name, either consult this +documentation or run C<exiftool -s> on a file containing the information in +question. + +I<(This documentation is the result of years of research, testing and +reverse engineering, and is the most complete metadata tag list available +anywhere on the internet. It is provided not only for ExifTool users, but +more importantly as a public service to help augment the collective +knowledge, and is often used as a primary source of information in the +development of other metadata software. Please help keep this documentation +as accurate and complete as possible, and feed any new discoveries back to +ExifTool. A big thanks to everyone who has helped with this so far!)> + +=head2 JPEG Tags + +This table lists information extracted by ExifTool from JPEG images. See +L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'APP0' JFIF JFIF + JFXX JFIF Extension + CIFF CanonRaw + AVI1 JPEG AVI1 + Ocad JPEG Ocad + 'APP1' EXIF EXIF + ExtendedXMP XMP + XMP XMP + QVCI Casio QVCI + FLIR FLIR FFF + RawThermalImage no + 'APP2' ICC_Profile ICC_Profile + FPXR FlashPix + MPF MPF + PreviewImage no + 'APP3' Meta Kodak Meta + Stim Stim + JPS JPEG JPS + ThermalData no + PreviewImage no + 'APP4' Scalado Scalado + FPXR FlashPix + ThermalParams DJI ThermalParams + PreviewImage no + 'APP5' RMETA Ricoh RMETA + SamsungUniqueID Samsung APP5 + ThermalCalibration no + PreviewImage no + 'APP6' EPPIM JPEG EPPIM + NITF JPEG NITF + HP_TDHD HP TDHD + GoPro GoPro GPMF + DJI_DTAT no + 'APP7' Pentax Pentax + Huawei Unknown + Qualcomm Qualcomm + 'APP8' SPIFF JPEG SPIFF + 'APP9' MediaJukebox JPEG MediaJukebox + 'APP10' Comment no + 'APP11' JPEG-HDR JPEG HDR + JUMBF Jpeg2000 + 'APP12' PictureInfo APP12 PictureInfo + Ducky APP12 Ducky + 'APP13' Photoshop Photoshop + Adobe_CM JPEG AdobeCM + 'APP14' Adobe JPEG Adobe + 'APP15' GraphicConverter JPEG GraphConv + 'COM' Comment yes + 'DQT' DefineQuantizationTable no + 'SOF' StartOfFrame JPEG SOF + 'Trailer' AFCP AFCP + CanonVRD CanonVRD + FotoStation FotoStation + PhotoMechanic PhotoMechanic + MIE MIE + Samsung Samsung Trailer + EmbeddedVideo no + Insta360 no + NikonApp no + PreviewImage yes + +=head3 JPEG AVI1 Tags + +This information may be found in APP0 of JPEG image data from AVI videos. + + Index1 Tag Name Writable + ------ -------- -------- + 0 InterleavedField no + +=head3 JPEG Ocad Tags + +Tags extracted from the JPEG APP0 "Ocad" segment (found in Photobucket +images). + + Tag ID Tag Name Writable + ------ -------- -------- + 'Rev' OcadRevision no + +=head3 JPEG JPS Tags + +Tags found in JPEG Stereo (JPS) images. + + Index1 Tag Name Writable + ------ -------- -------- + 10 JPSSeparation no + 11 JPSFlags no + 12 JPSLayout no + 13 JPSType no + 16 JPSComment no + +=head3 JPEG EPPIM Tags + +APP6 is used in by the Toshiba PDR-M700 to store a TIFF structure containing +PrintIM information. + + Tag ID Tag Name Writable + ------ -------- -------- + 0xc4a5 PrintIM PrintIM + +=head3 JPEG NITF Tags + +Information in APP6 used by the National Imagery Transmission Format. See +L<http://www.gwg.nga.mil/ntb/baseline/docs/n010697/bwcguide25aug98.pdf> for +the official specification. + + Index1 Tag Name Writable + ------ -------- -------- + 0 NITFVersion no + 2 ImageFormat no + 3 BlocksPerRow no + 5 BlocksPerColumn no + 7 ImageColor no + 8 BitDepth no + 9 ImageClass no + 10 JPEGProcess no + 11 Quality no + 12 StreamColor no + 13 StreamBitDepth no + 14 Flags no + +=head3 JPEG SPIFF Tags + +This information is found in APP8 of SPIFF-style JPEG images (the "official" +yet rarely used JPEG file format standard: Still Picture Interchange File +Format). See L<http://www.jpeg.org/public/spiff.pdf> for the official +specification. + + Index1 Tag Name Writable + ------ -------- -------- + 0 SPIFFVersion no + 2 ProfileID no + 3 ColorComponents no + 6 ImageHeight no + 10 ImageWidth no + 14 ColorSpace no + 15 BitsPerSample no + 16 Compression no + 17 ResolutionUnit no + 18 YResolution no + 22 XResolution no + +=head3 JPEG MediaJukebox Tags + +Tags found in the XML metadata of the APP9 "Media Jukebox" segment. + + Tag Name Writable + -------- -------- + Album no + Caption no + Date no + Keywords no + Name no + People no + Places no + Tool_Name no + Tool_Version no + +=head3 JPEG HDR Tags + +Information extracted from APP11 of a JPEG-HDR image. + + Tag ID Tag Name Writable + ------ -------- -------- + 'RatioImage' RatioImage no + 'alp' Alpha no + 'bet' Beta no + 'cor' CorrectionMethod no + 'ln0' Ln0 no + 'ln1' Ln1 no + 's2n' S2n no + 'ver' JPEG-HDRVersion no + +=head3 JPEG AdobeCM Tags + +The APP13 "Adobe_CM" segment presumably contains color management +information, but the meaning of the data is currently unknown. If anyone +has an idea about what this means, please let me know. + + Index2 Tag Name Writable + ------ -------- -------- + 0 AdobeCMType no + +=head3 JPEG Adobe Tags + +The APP14 "Adobe" segment stores image encoding information for DCT filters. +This segment may be copied or deleted as a block using the Extra "Adobe" +tag, but note that it is not deleted by default when deleting all metadata +because it may affect the appearance of the image. + + Index2 Tag Name Writable + ------ -------- -------- + 0 DCTEncodeVersion no + 1 APP14Flags0 no + 2 APP14Flags1 no + 3 ColorTransform no + +=head3 JPEG GraphConv Tags + +APP15 is used by GraphicConverter to store JPEG quality. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Q' Quality no + +=head3 JPEG SOF Tags + +This information is extracted from the JPEG Start Of Frame segment. + + Tag Name Writable + -------- -------- + BitsPerSample no + ColorComponents no + EncodingProcess no + ImageHeight no + ImageWidth no + YCbCrSubSampling no + +=head2 EXIF Tags + +EXIF stands for "Exchangeable Image File Format". This type of information +is formatted according to the TIFF specification, and may be found in JPG, +TIFF, PNG, JP2, PGF, MIFF, HDP, PSP and XCF images, as well as many +TIFF-based RAW images, and even some AVI and MOV videos. + +The EXIF meta information is organized into different Image File Directories +(IFD's) within an image. The names of these IFD's correspond to the +ExifTool family 1 group names. When writing EXIF information, the default +B<Group> listed below is used unless another group is specified. + +Mandatory tags (indicated by a colon after the B<Writable> type) may be +added automatically with default values when creating a new IFD, and the IFD +is removed automatically when deleting tags if only default-valued mandatory +tags remain. + +The table below lists all EXIF tags. Also listed are TIFF, DNG, HDP and +other tags which are not part of the EXIF specification, but may co-exist +with EXIF tags in some images. Tags which are part of the EXIF 2.32 +specification have an underlined B<Tag Name> in the HTML version of this +documentation. See +L<https://web.archive.org/web/20190624045241if_/http://www.cipa.jp:80/std/documents/e/DC-008-Translation-2019-E.pdf> +for the official EXIF 2.32 specification. + + Tag ID Tag Name Group Writable + ------ -------- ----- -------- + 0x0001 InteropIndex InteropIFD string! + 0x0002 InteropVersion InteropIFD undef!: + 0x000b ProcessingSoftware IFD0 string + 0x00fe SubfileType IFD0 int32u! + 0x00ff OldSubfileType IFD0 int16u! + 0x0100 ImageWidth IFD0 int32u! + 0x0101 ImageHeight IFD0 int32u! + 0x0102 BitsPerSample IFD0 int16u[n]! + 0x0103 Compression IFD0 int16u!: + 0x0106 PhotometricInterpretation IFD0 int16u! + 0x0107 Thresholding IFD0 int16u! + 0x0108 CellWidth IFD0 int16u! + 0x0109 CellLength IFD0 int16u! + 0x010a FillOrder IFD0 int16u! + 0x010d DocumentName IFD0 string + 0x010e ImageDescription IFD0 string + 0x010f Make IFD0 string + 0x0110 Model IFD0 string + 0x0111 StripOffsets - no + PreviewImageStart IFD0 int32u* + PreviewImageStart All int32u* + JpgFromRawStart SubIFD2 int32u* + 0x0112 Orientation IFD0 int16u + 0x0115 SamplesPerPixel IFD0 int16u! + 0x0116 RowsPerStrip IFD0 int32u! + 0x0117 StripByteCounts - no + PreviewImageLength IFD0 int32u* + PreviewImageLength All int32u* + JpgFromRawLength SubIFD2 int32u* + 0x0118 MinSampleValue IFD0 int16u + 0x0119 MaxSampleValue IFD0 int16u + 0x011a XResolution IFD0 rational64u: + 0x011b YResolution IFD0 rational64u: + 0x011c PlanarConfiguration IFD0 int16u! + 0x011d PageName IFD0 string + 0x011e XPosition IFD0 rational64u + 0x011f YPosition IFD0 rational64u + 0x0120 FreeOffsets - no + 0x0121 FreeByteCounts - no + 0x0122 GrayResponseUnit IFD0 int16u + 0x0123 GrayResponseCurve - no + 0x0124 T4Options - no + 0x0125 T6Options - no + 0x0128 ResolutionUnit IFD0 int16u: + 0x0129 PageNumber IFD0 int16u[2] + 0x012c ColorResponseUnit - no + 0x012d TransferFunction IFD0 int16u[768]! + 0x0131 Software IFD0 string + 0x0132 ModifyDate IFD0 string + 0x013b Artist IFD0 string + 0x013c HostComputer IFD0 string + 0x013d Predictor IFD0 int16u! + 0x013e WhitePoint IFD0 rational64u[2] + 0x013f PrimaryChromaticities IFD0 rational64u[6] + 0x0140 ColorMap - no + 0x0141 HalftoneHints IFD0 int16u[2] + 0x0142 TileWidth IFD0 int32u! + 0x0143 TileLength IFD0 int32u! + 0x0144 TileOffsets - no + 0x0145 TileByteCounts - no + 0x0146 BadFaxLines - no + 0x0147 CleanFaxData - no + 0x0148 ConsecutiveBadFaxLines - no + 0x014a SubIFD - EXIF + A100DataOffset IFD0 no + 0x014c InkSet IFD0 int16u + 0x014d InkNames - no + 0x014e NumberofInks - no + 0x0150 DotRange - no + 0x0151 TargetPrinter IFD0 string + 0x0152 ExtraSamples - no + 0x0153 SampleFormat SubIFD no + 0x0154 SMinSampleValue - no + 0x0155 SMaxSampleValue - no + 0x0156 TransferRange - no + 0x0157 ClipPath - no + 0x0158 XClipPathUnits - no + 0x0159 YClipPathUnits - no + 0x015a Indexed - no + 0x015b JPEGTables - no + 0x015f OPIProxy - no + 0x0190 GlobalParametersIFD - EXIF + 0x0191 ProfileType - no + 0x0192 FaxProfile - no + 0x0193 CodingMethods - no + 0x0194 VersionYear - no + 0x0195 ModeNumber - no + 0x01b1 Decode - no + 0x01b2 DefaultImageColor - no + 0x01b3 T82Options - no + 0x01b5 JPEGTables - no + 0x0200 JPEGProc - no + 0x0201 ThumbnailOffset IFD1 int32u* + ThumbnailOffset IFD0 int32u* + ThumbnailOffset SubIFD int32u* + PreviewImageStart MakerNotes int32u* + PreviewImageStart IFD0 int32u* + JpgFromRawStart SubIFD int32u* + JpgFromRawStart IFD2 int32u* + OtherImageStart SubIFD1 int32u* + OtherImageStart SubIFD2 int32u* + OtherImageStart - no + 0x0202 ThumbnailLength IFD1 int32u* + ThumbnailLength IFD0 int32u* + ThumbnailLength SubIFD int32u* + PreviewImageLength MakerNotes int32u* + PreviewImageLength IFD0 int32u* + JpgFromRawLength SubIFD int32u* + JpgFromRawLength IFD2 int32u* + OtherImageLength SubIFD1 int32u* + OtherImageLength SubIFD2 int32u* + OtherImageLength - no + 0x0203 JPEGRestartInterval - no + 0x0205 JPEGLosslessPredictors - no + 0x0206 JPEGPointTransforms - no + 0x0207 JPEGQTables - no + 0x0208 JPEGDCTables - no + 0x0209 JPEGACTables - no + 0x0211 YCbCrCoefficients IFD0 rational64u[3]! + 0x0212 YCbCrSubSampling IFD0 int16u[2]! + 0x0213 YCbCrPositioning IFD0 int16u!: + 0x0214 ReferenceBlackWhite IFD0 rational64u[6] + 0x022f StripRowCounts - no + 0x02bc ApplicationNotes IFD0 XMP + 0x03e7 USPTOMiscellaneous - no + 0x1000 RelatedImageFileFormat InteropIFD string! + 0x1001 RelatedImageWidth InteropIFD int16u! + 0x1002 RelatedImageHeight InteropIFD int16u! + 0x4746 Rating IFD0 int16u/ + 0x4747 XP_DIP_XML - no + 0x4748 StitchInfo - Microsoft Stitch + 0x4749 RatingPercent IFD0 int16u/ + 0x7000 SonyRawFileType - no + 0x7010 SonyToneCurve - no + 0x7031 VignettingCorrection SubIFD int16s! + 0x7032 VignettingCorrParams SubIFD int16s[17]! + 0x7034 ChromaticAberrationCorrection SubIFD int16s! + 0x7035 ChromaticAberrationCorrParams SubIFD int16s[33]! + 0x7036 DistortionCorrection SubIFD int16s! + 0x7037 DistortionCorrParams SubIFD int16s[17]! + 0x74c7 SonyCropTopLeft SubIFD int32u[2]! + 0x74c8 SonyCropSize SubIFD int32u[2]! + 0x800d ImageID - no + 0x80a3 WangTag1 - no + 0x80a4 WangAnnotation - no + 0x80a5 WangTag3 - no + 0x80a6 WangTag4 - no + 0x80b9 ImageReferencePoints - no + 0x80ba RegionXformTackPoint - no + 0x80bb WarpQuadrilateral - no + 0x80bc AffineTransformMat - no + 0x80e3 Matteing - no + 0x80e4 DataType - no + 0x80e5 ImageDepth - no + 0x80e6 TileDepth - no + 0x8214 ImageFullWidth - no + 0x8215 ImageFullHeight - no + 0x8216 TextureFormat - no + 0x8217 WrapModes - no + 0x8218 FovCot - no + 0x8219 MatrixWorldToScreen - no + 0x821a MatrixWorldToCamera - no + 0x827d Model2 - no + 0x828d CFARepeatPatternDim SubIFD int16u[2]! + 0x828e CFAPattern2 SubIFD int8u[n]! + 0x828f BatteryLevel - no + 0x8290 KodakIFD - Kodak IFD + 0x8298 Copyright IFD0 string + 0x829a ExposureTime ExifIFD rational64u + 0x829d FNumber ExifIFD rational64u + 0x82a5 MDFileTag - no + 0x82a6 MDScalePixel - no + 0x82a7 MDColorTable - no + 0x82a8 MDLabName - no + 0x82a9 MDSampleInfo - no + 0x82aa MDPrepDate - no + 0x82ab MDPrepTime - no + 0x82ac MDFileUnits - no + 0x830e PixelScale IFD0 double[3] + 0x8335 AdventScale - no + 0x8336 AdventRevision - no + 0x835c UIC1Tag - no + 0x835d UIC2Tag - no + 0x835e UIC3Tag - no + 0x835f UIC4Tag - no + 0x83bb IPTC-NAA IFD0 IPTC + 0x847e IntergraphPacketData - no + 0x847f IntergraphFlagRegisters - no + 0x8480 IntergraphMatrix IFD0 double[n] + 0x8481 INGRReserved - no + 0x8482 ModelTiePoint IFD0 double[n] + 0x84e0 Site - no + 0x84e1 ColorSequence - no + 0x84e2 IT8Header - no + 0x84e3 RasterPadding - no + 0x84e4 BitsPerRunLength - no + 0x84e5 BitsPerExtendedRunLength - no + 0x84e6 ColorTable - no + 0x84e7 ImageColorIndicator - no + 0x84e8 BackgroundColorIndicator - no + 0x84e9 ImageColorValue - no + 0x84ea BackgroundColorValue - no + 0x84eb PixelIntensityRange - no + 0x84ec TransparencyIndicator - no + 0x84ed ColorCharacterization - no + 0x84ee HCUsage - no + 0x84ef TrapIndicator - no + 0x84f0 CMYKEquivalent - no + 0x8546 SEMInfo IFD0 string + 0x8568 AFCP_IPTC - IPTC + 0x85b8 PixelMagicJBIGOptions - no + 0x85d7 JPLCartoIFD - no + 0x85d8 ModelTransform IFD0 double[16] + 0x8602 WB_GRGBLevels - no + 0x8606 LeafData - Leaf + 0x8649 PhotoshopSettings IFD0 Photoshop + 0x8769 ExifOffset IFD0 EXIF + 0x8773 ICC_Profile IFD0 ICC_Profile + 0x877f TIFF_FXExtensions - no + 0x8780 MultiProfiles - no + 0x8781 SharedData - no + 0x8782 T88Options - no + 0x87ac ImageLayer - no + 0x87af GeoTiffDirectory IFD0 int16u[0.5] + 0x87b0 GeoTiffDoubleParams IFD0 double[0.125] + 0x87b1 GeoTiffAsciiParams IFD0 string + 0x87be JBIGOptions - no + 0x8822 ExposureProgram ExifIFD int16u + 0x8824 SpectralSensitivity ExifIFD string + 0x8825 GPSInfo IFD0 GPS + 0x8827 ISO ExifIFD int16u[n] + 0x8828 Opto-ElectricConvFactor - no + 0x8829 Interlace - no + 0x882a TimeZoneOffset ExifIFD int16s[n] + 0x882b SelfTimerMode ExifIFD int16u + 0x8830 SensitivityType ExifIFD int16u + 0x8831 StandardOutputSensitivity ExifIFD int32u + 0x8832 RecommendedExposureIndex ExifIFD int32u + 0x8833 ISOSpeed ExifIFD int32u + 0x8834 ISOSpeedLatitudeyyy ExifIFD int32u + 0x8835 ISOSpeedLatitudezzz ExifIFD int32u + 0x885c FaxRecvParams - no + 0x885d FaxSubAddress - no + 0x885e FaxRecvTime - no + 0x8871 FedexEDR - no + 0x888a LeafSubIFD - Leaf SubIFD + 0x9000 ExifVersion ExifIFD undef: + 0x9003 DateTimeOriginal ExifIFD string + 0x9004 CreateDate ExifIFD string + 0x9009 GooglePlusUploadCode ExifIFD undef[n] + 0x9010 OffsetTime ExifIFD string + 0x9011 OffsetTimeOriginal ExifIFD string + 0x9012 OffsetTimeDigitized ExifIFD string + 0x9101 ComponentsConfiguration ExifIFD undef[4]!: + 0x9102 CompressedBitsPerPixel ExifIFD rational64u! + 0x9201 ShutterSpeedValue ExifIFD rational64s + 0x9202 ApertureValue ExifIFD rational64u + 0x9203 BrightnessValue ExifIFD rational64s + 0x9204 ExposureCompensation ExifIFD rational64s + 0x9205 MaxApertureValue ExifIFD rational64u + 0x9206 SubjectDistance ExifIFD rational64u + 0x9207 MeteringMode ExifIFD int16u + 0x9208 LightSource ExifIFD int16u + 0x9209 Flash ExifIFD int16u + 0x920a FocalLength ExifIFD rational64u + 0x920b FlashEnergy - no + 0x920c SpatialFrequencyResponse - no + 0x920d Noise - no + 0x920e FocalPlaneXResolution - no + 0x920f FocalPlaneYResolution - no + 0x9210 FocalPlaneResolutionUnit - no + 0x9211 ImageNumber ExifIFD int32u + 0x9212 SecurityClassification ExifIFD string + 0x9213 ImageHistory ExifIFD string + 0x9214 SubjectArea ExifIFD int16u[n] + 0x9215 ExposureIndex - no + 0x9216 TIFF-EPStandardID - no + 0x9217 SensingMethod - no + 0x923a CIP3DataFile - no + 0x923b CIP3Sheet - no + 0x923c CIP3Side - no + 0x923f StoNits - no + 0x927c MakerNoteApple ExifIFD Apple + MakerNoteNikon ExifIFD Nikon + MakerNoteCanon ExifIFD Canon + MakerNoteCasio ExifIFD Casio + MakerNoteCasio2 ExifIFD Casio Type2 + MakerNoteDJIInfo ExifIFD DJI Info + MakerNoteDJI ExifIFD DJI + MakerNoteFLIR ExifIFD FLIR + MakerNoteFujiFilm ExifIFD FujiFilm + MakerNoteGE ExifIFD GE + MakerNoteGE2 ExifIFD FujiFilm + MakerNoteHasselblad ExifIFD Unknown + MakerNoteHP ExifIFD HP + MakerNoteHP2 ExifIFD HP Type2 + MakerNoteHP4 ExifIFD HP Type4 + MakerNoteHP6 ExifIFD HP Type6 + MakerNoteISL ExifIFD Unknown + MakerNoteJVC ExifIFD JVC + MakerNoteJVCText ExifIFD JVC Text + MakerNoteKodak1a ExifIFD Kodak + MakerNoteKodak1b ExifIFD Kodak + MakerNoteKodak2 ExifIFD Kodak Type2 + MakerNoteKodak3 ExifIFD Kodak Type3 + MakerNoteKodak4 ExifIFD Kodak Type4 + MakerNoteKodak5 ExifIFD Kodak Type5 + MakerNoteKodak6a ExifIFD Kodak Type6 + MakerNoteKodak6b ExifIFD Kodak Type6 + MakerNoteKodak7 ExifIFD Kodak Type7 + MakerNoteKodak8a ExifIFD Kodak Type8 + MakerNoteKodak8b ExifIFD Kodak Type8 + MakerNoteKodak8c ExifIFD Kodak Type8 + MakerNoteKodak9 ExifIFD Kodak Type9 + MakerNoteKodak10 ExifIFD Kodak Type10 + MakerNoteKodak11 ExifIFD Kodak Type11 + MakerNoteKodak12 ExifIFD Kodak Type11 + MakerNoteKodakUnknown ExifIFD Kodak Unknown + MakerNoteKyocera ExifIFD Unknown + MakerNoteMinolta ExifIFD Minolta + MakerNoteMinolta2 ExifIFD Olympus + MakerNoteMinolta3 ExifIFD undef + MakerNoteMotorola ExifIFD Motorola + MakerNoteNikon2 ExifIFD Nikon Type2 + MakerNoteNikon3 ExifIFD Nikon + MakerNoteNintendo ExifIFD Nintendo + MakerNoteOlympus ExifIFD Olympus + MakerNoteOlympus2 ExifIFD Olympus + MakerNoteOlympus3 ExifIFD Olympus + MakerNoteLeica ExifIFD Panasonic + MakerNoteLeica2 ExifIFD Panasonic Leica2 + MakerNoteLeica3 ExifIFD Panasonic Leica3 + MakerNoteLeica4 ExifIFD Panasonic Leica4 + MakerNoteLeica5 ExifIFD Panasonic Leica5 + MakerNoteLeica6 ExifIFD Panasonic Leica6 + MakerNoteLeica7 ExifIFD Panasonic Leica6 + MakerNoteLeica8 ExifIFD Panasonic Leica5 + MakerNoteLeica9 ExifIFD Panasonic Leica9 + MakerNoteLeica10 ExifIFD Panasonic + MakerNotePanasonic ExifIFD Panasonic + MakerNotePanasonic2 ExifIFD Panasonic Type2 + MakerNotePanasonic3 ExifIFD Panasonic + MakerNotePentax ExifIFD Pentax + MakerNotePentax2 ExifIFD Pentax Type2 + MakerNotePentax3 ExifIFD Casio Type2 + MakerNotePentax4 ExifIFD Pentax Type4 + MakerNotePentax5 ExifIFD Pentax + MakerNotePentax6 ExifIFD Pentax S1 + MakerNotePhaseOne ExifIFD PhaseOne + MakerNoteReconyx ExifIFD Reconyx + MakerNoteReconyx2 ExifIFD Reconyx Type2 + MakerNoteReconyx3 ExifIFD Reconyx Type3 + MakerNoteRicohPentax ExifIFD Pentax + MakerNoteRicoh ExifIFD Ricoh + MakerNoteRicoh2 ExifIFD Ricoh Type2 + MakerNoteRicohText ExifIFD Ricoh Text + MakerNoteSamsung1a ExifIFD undef + MakerNoteSamsung1b ExifIFD Samsung + MakerNoteSamsung2 ExifIFD Samsung Type2 + MakerNoteSanyo ExifIFD Sanyo + MakerNoteSanyoC4 ExifIFD Sanyo + MakerNoteSanyoPatch ExifIFD Sanyo + MakerNoteSigma ExifIFD Sigma + MakerNoteSony ExifIFD Sony + MakerNoteSony2 ExifIFD Olympus + MakerNoteSony3 ExifIFD Olympus + MakerNoteSony4 ExifIFD Sony PIC + MakerNoteSony5 ExifIFD Sony + MakerNoteSonyEricsson ExifIFD Sony Ericsson + MakerNoteSonySRF ExifIFD Sony SRF + MakerNoteUnknownText ExifIFD undef + MakerNoteUnknownBinary ExifIFD undef + MakerNoteUnknown ExifIFD Unknown + 0x9286 UserComment ExifIFD undef + 0x9290 SubSecTime ExifIFD string + 0x9291 SubSecTimeOriginal ExifIFD string + 0x9292 SubSecTimeDigitized ExifIFD string + 0x932f MSDocumentText - no + 0x9330 MSPropertySetStorage - no + 0x9331 MSDocumentTextPosition - no + 0x935c ImageSourceData IFD0 Photoshop DocumentData + 0x9400 AmbientTemperature ExifIFD rational64s + 0x9401 Humidity ExifIFD rational64u + 0x9402 Pressure ExifIFD rational64u + 0x9403 WaterDepth ExifIFD rational64s + 0x9404 Acceleration ExifIFD rational64u + 0x9405 CameraElevationAngle ExifIFD rational64s + 0x9c9b XPTitle IFD0 int8u + 0x9c9c XPComment IFD0 int8u + 0x9c9d XPAuthor IFD0 int8u + 0x9c9e XPKeywords IFD0 int8u + 0x9c9f XPSubject IFD0 int8u + 0xa000 FlashpixVersion ExifIFD undef: + 0xa001 ColorSpace ExifIFD int16u: + 0xa002 ExifImageWidth ExifIFD int16u: + 0xa003 ExifImageHeight ExifIFD int16u: + 0xa004 RelatedSoundFile ExifIFD string + 0xa005 InteropOffset - EXIF + 0xa010 SamsungRawPointersOffset - no + 0xa011 SamsungRawPointersLength - no + 0xa101 SamsungRawByteOrder - no + 0xa102 SamsungRawUnknown? - no + 0xa20b FlashEnergy ExifIFD rational64u + 0xa20c SpatialFrequencyResponse - no + 0xa20d Noise - no + 0xa20e FocalPlaneXResolution ExifIFD rational64u + 0xa20f FocalPlaneYResolution ExifIFD rational64u + 0xa210 FocalPlaneResolutionUnit ExifIFD int16u + 0xa211 ImageNumber - no + 0xa212 SecurityClassification - no + 0xa213 ImageHistory - no + 0xa214 SubjectLocation ExifIFD int16u[2] + 0xa215 ExposureIndex ExifIFD rational64u + 0xa216 TIFF-EPStandardID - no + 0xa217 SensingMethod ExifIFD int16u + 0xa300 FileSource ExifIFD undef + 0xa301 SceneType ExifIFD undef + 0xa302 CFAPattern ExifIFD undef + 0xa401 CustomRendered ExifIFD int16u + 0xa402 ExposureMode ExifIFD int16u + 0xa403 WhiteBalance ExifIFD int16u + 0xa404 DigitalZoomRatio ExifIFD rational64u + 0xa405 FocalLengthIn35mmFormat ExifIFD int16u + 0xa406 SceneCaptureType ExifIFD int16u + 0xa407 GainControl ExifIFD int16u + 0xa408 Contrast ExifIFD int16u + 0xa409 Saturation ExifIFD int16u + 0xa40a Sharpness ExifIFD int16u + 0xa40b DeviceSettingDescription - no + 0xa40c SubjectDistanceRange ExifIFD int16u + 0xa420 ImageUniqueID ExifIFD string + 0xa430 OwnerName ExifIFD string + 0xa431 SerialNumber ExifIFD string + 0xa432 LensInfo ExifIFD rational64u[4] + 0xa433 LensMake ExifIFD string + 0xa434 LensModel ExifIFD string + 0xa435 LensSerialNumber ExifIFD string + 0xa460 CompositeImage ExifIFD int16u + 0xa461 CompositeImageCount ExifIFD int16u[2] + 0xa462 CompositeImageExposureTimes ExifIFD undef + 0xa480 GDALMetadata IFD0 string + 0xa481 GDALNoData IFD0 string + 0xa500 Gamma ExifIFD rational64u + 0xafc0 ExpandSoftware - no + 0xafc1 ExpandLens - no + 0xafc2 ExpandFilm - no + 0xafc3 ExpandFilterLens - no + 0xafc4 ExpandScanner - no + 0xafc5 ExpandFlashLamp - no + 0xb4c3 HasselbladRawImage - no + 0xbc01 PixelFormat - no + 0xbc02 Transformation - no + 0xbc03 Uncompressed - no + 0xbc04 ImageType - no + 0xbc80 ImageWidth - no + 0xbc81 ImageHeight - no + 0xbc82 WidthResolution - no + 0xbc83 HeightResolution - no + 0xbcc0 ImageOffset - no + 0xbcc1 ImageByteCount - no + 0xbcc2 AlphaOffset - no + 0xbcc3 AlphaByteCount - no + 0xbcc4 ImageDataDiscard - no + 0xbcc5 AlphaDataDiscard - no + 0xc427 OceScanjobDesc - no + 0xc428 OceApplicationSelector - no + 0xc429 OceIDNumber - no + 0xc42a OceImageLogic - no + 0xc44f Annotations - no + 0xc4a5 PrintIM IFD0 PrintIM + 0xc51b HasselbladExif - no + 0xc573 OriginalFileName - no + 0xc580 USPTOOriginalContentType - no + 0xc5e0 CR2CFAPattern - no + 0xc612 DNGVersion IFD0 int8u[4]! + 0xc613 DNGBackwardVersion IFD0 int8u[4]! + 0xc614 UniqueCameraModel IFD0 string + 0xc615 LocalizedCameraModel IFD0 string + 0xc616 CFAPlaneColor SubIFD no + 0xc617 CFALayout SubIFD no + 0xc618 LinearizationTable SubIFD int16u[n]! + 0xc619 BlackLevelRepeatDim SubIFD int16u[2]! + 0xc61a BlackLevel SubIFD rational64u[n]! + 0xc61b BlackLevelDeltaH SubIFD rational64s[n]! + 0xc61c BlackLevelDeltaV SubIFD rational64s[n]! + 0xc61d WhiteLevel SubIFD int32u[n]! + 0xc61e DefaultScale SubIFD rational64u[2]! + 0xc61f DefaultCropOrigin SubIFD int32u[2]! + 0xc620 DefaultCropSize SubIFD int32u[2]! + 0xc621 ColorMatrix1 IFD0 rational64s[n]! + 0xc622 ColorMatrix2 IFD0 rational64s[n]! + 0xc623 CameraCalibration1 IFD0 rational64s[n]! + 0xc624 CameraCalibration2 IFD0 rational64s[n]! + 0xc625 ReductionMatrix1 IFD0 rational64s[n]! + 0xc626 ReductionMatrix2 IFD0 rational64s[n]! + 0xc627 AnalogBalance IFD0 rational64u[n]! + 0xc628 AsShotNeutral IFD0 rational64u[n]! + 0xc629 AsShotWhiteXY IFD0 rational64u[2]! + 0xc62a BaselineExposure IFD0 rational64s! + 0xc62b BaselineNoise IFD0 rational64u! + 0xc62c BaselineSharpness IFD0 rational64u! + 0xc62d BayerGreenSplit SubIFD int32u! + 0xc62e LinearResponseLimit IFD0 rational64u! + 0xc62f CameraSerialNumber IFD0 string + 0xc630 DNGLensInfo IFD0 rational64u[4] + 0xc631 ChromaBlurRadius SubIFD rational64u! + 0xc632 AntiAliasStrength SubIFD rational64u! + 0xc633 ShadowScale IFD0 rational64u! + 0xc634 SR2Private IFD0 Sony SR2Private + DNGAdobeData IFD0 DNG AdobeData + MakerNotePentax IFD0 Pentax + MakerNotePentax5 IFD0 Pentax + MakerNoteRicohPentax IFD0 Pentax + MakerNoteDJIInfo IFD0 DJI Info + DNGPrivateData IFD0 int8u! + 0xc635 MakerNoteSafety IFD0 int16u + 0xc640 RawImageSegmentation - no + 0xc65a CalibrationIlluminant1 IFD0 int16u! + 0xc65b CalibrationIlluminant2 IFD0 int16u! + 0xc65c BestQualityScale SubIFD rational64u! + 0xc65d RawDataUniqueID IFD0 int8u[16]! + 0xc660 AliasLayerMetadata - no + 0xc68b OriginalRawFileName IFD0 string! + 0xc68c OriginalRawFileData IFD0 DNG OriginalRaw + 0xc68d ActiveArea SubIFD int32u[4]! + 0xc68e MaskedAreas SubIFD int32u[n]! + 0xc68f AsShotICCProfile IFD0 ICC_Profile + 0xc690 AsShotPreProfileMatrix IFD0 rational64s[n]! + 0xc691 CurrentICCProfile IFD0 ICC_Profile + 0xc692 CurrentPreProfileMatrix IFD0 rational64s[n]! + 0xc6bf ColorimetricReference IFD0 int16u! + 0xc6c5 SRawType IFD0 no + 0xc6d2 PanasonicTitle IFD0 undef + 0xc6d3 PanasonicTitle2 IFD0 undef + 0xc6f3 CameraCalibrationSig IFD0 string! + 0xc6f4 ProfileCalibrationSig IFD0 string! + 0xc6f5 ProfileIFD IFD0 EXIF + 0xc6f6 AsShotProfileName IFD0 string! + 0xc6f7 NoiseReductionApplied SubIFD rational64u! + 0xc6f8 ProfileName IFD0 string! + 0xc6f9 ProfileHueSatMapDims IFD0 int32u[3]! + 0xc6fa ProfileHueSatMapData1 IFD0 float[n]! + 0xc6fb ProfileHueSatMapData2 IFD0 float[n]! + 0xc6fc ProfileToneCurve IFD0 float[n]! + 0xc6fd ProfileEmbedPolicy IFD0 int32u! + 0xc6fe ProfileCopyright IFD0 string! + 0xc714 ForwardMatrix1 IFD0 rational64s[n]! + 0xc715 ForwardMatrix2 IFD0 rational64s[n]! + 0xc716 PreviewApplicationName IFD0 string! + 0xc717 PreviewApplicationVersion IFD0 string! + 0xc718 PreviewSettingsName IFD0 string! + 0xc719 PreviewSettingsDigest IFD0 int8u! + 0xc71a PreviewColorSpace IFD0 int32u! + 0xc71b PreviewDateTime IFD0 string! + 0xc71c RawImageDigest IFD0 int8u[16]! + 0xc71d OriginalRawFileDigest IFD0 int8u[16]! + 0xc71e SubTileBlockSize - no + 0xc71f RowInterleaveFactor - no + 0xc725 ProfileLookTableDims IFD0 int32u[3]! + 0xc726 ProfileLookTableData IFD0 float[n]! + 0xc740 OpcodeList1 SubIFD undef! + 0xc741 OpcodeList2 SubIFD undef! + 0xc74e OpcodeList3 SubIFD undef! + 0xc761 NoiseProfile SubIFD double[n]! + 0xc763 TimeCodes IFD0 int8u[n] + 0xc764 FrameRate IFD0 rational64s + 0xc772 TStop IFD0 rational64u[n] + 0xc789 ReelName IFD0 string + 0xc791 OriginalDefaultFinalSize IFD0 int32u[2]! + 0xc792 OriginalBestQualitySize IFD0 int32u[2]! + 0xc793 OriginalDefaultCropSize IFD0 rational64u[2]! + 0xc7a1 CameraLabel IFD0 string + 0xc7a3 ProfileHueSatMapEncoding IFD0 int32u! + 0xc7a4 ProfileLookTableEncoding IFD0 int32u! + 0xc7a5 BaselineExposureOffset IFD0 rational64s! + 0xc7a6 DefaultBlackRender IFD0 int32u! + 0xc7a7 NewRawImageDigest IFD0 int8u[16]! + 0xc7a8 RawToPreviewGain IFD0 double! + 0xc7aa CacheVersion SubIFD2 int32u! + 0xc7b5 DefaultUserCrop SubIFD rational64u[4]! + 0xc7d5 NikonNEFInfo - Nikon NEFInfo + 0xc7e9 DepthFormat IFD0 int16u! + 0xc7ea DepthNear IFD0 rational64u! + 0xc7eb DepthFar IFD0 rational64u! + 0xc7ec DepthUnits IFD0 int16u! + 0xc7ed DepthMeasureType IFD0 int16u! + 0xc7ee EnhanceParams IFD0 string! + 0xcd2d ProfileGainTableMap SubIFD undef! + 0xcd2e SemanticName SubIFD no + 0xcd30 SemanticInstanceIFD SubIFD no + 0xcd31 CalibrationIlluminant3 IFD0 int16u! + 0xcd32 CameraCalibration3 IFD0 rational64s[n]! + 0xcd33 ColorMatrix3 IFD0 rational64s[n]! + 0xcd34 ForwardMatrix3 IFD0 rational64s[n]! + 0xcd35 IlluminantData1 IFD0 undef! + 0xcd36 IlluminantData2 IFD0 undef! + 0xcd37 IlluminantData3 IFD0 undef! + 0xcd38 MaskSubArea SubIFD no + 0xcd39 ProfileHueSatMapData3 IFD0 float[n]! + 0xcd3a ReductionMatrix3 IFD0 rational64s[n]! + 0xcd3b RGBTables IFD0 undef! + 0xea1c Padding ExifIFD undef! + 0xea1d OffsetSchema ExifIFD int32s! + 0xfde8 OwnerName ExifIFD string/ + 0xfde9 SerialNumber ExifIFD string/ + 0xfdea Lens ExifIFD string/ + 0xfe00 KDC_IFD - Kodak KDC_IFD + 0xfe4c RawFile ExifIFD string/ + 0xfe4d Converter ExifIFD string/ + 0xfe4e WhiteBalance ExifIFD string/ + 0xfe51 Exposure ExifIFD string/ + 0xfe52 Shadows ExifIFD string/ + 0xfe53 Brightness ExifIFD string/ + 0xfe54 Contrast ExifIFD string/ + 0xfe55 Saturation ExifIFD string/ + 0xfe56 Sharpness ExifIFD string/ + 0xfe57 Smoothness ExifIFD string/ + 0xfe58 MoireFilter ExifIFD string/ + +=head2 IPTC Tags + +The tags listed below are part of the International Press Telecommunications +Council (IPTC) and the Newspaper Association of America (NAA) Information +Interchange Model (IIM). This is an older meta information format, slowly +being phased out in favor of XMP -- the newer IPTCCore specification uses +XMP format. IPTC information may be found in JPG, TIFF, PNG, MIFF, PS, PDF, +PSD, XCF and DNG images. + +IPTC information is separated into different records, each of which has its +own set of tags. See +L<http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf> for the +official IPTC IIM specification. + +This specification dictates a length for ASCII (C<string> or C<digits>) and +binary (C<undef>) values. These lengths are given in square brackets after +the B<Writable> format name. For tags where a range of lengths is allowed, +the minimum and maximum lengths are separated by a comma within the +brackets. When writing, ExifTool issues a minor warning and truncates the +value if it is longer than allowed by the IPTC specification. Minor errors +may be ignored with the IgnoreMinorErrors (-m) option, allowing longer +values to be written, but beware that values like this may cause problems +for some other IPTC readers. ExifTool will happily read IPTC values of any +length. + +Separate IPTC date and time tags may be written with a combined date/time +value and ExifTool automagically takes the appropriate part of the date/time +string depending on whether a date or time tag is being written. This is +very useful when copying date/time values to IPTC from other metadata +formats. + +IPTC time values include a timezone offset. If written with a value which +doesn't include a timezone then the current local timezone offset is used +(unless written with a combined date/time, in which case the local timezone +offset at the specified date/time is used, which may be different due to +changes in daylight savings time). + +Note that it is not uncommon for IPTC to be found in non-standard locations +in JPEG and TIFF-based images. When reading, the family 1 group name has a +number added for non-standard IPTC ("IPTC2", "IPTC3", etc), but when writing +only "IPTC" may be specified as the group. To keep the IPTC consistent, +ExifTool updates tags in all existing IPTC locations, but will create a new +IPTC group only in the standard location. + + Record Tag Name Writable + ------ -------- -------- + 1 IPTCEnvelope IPTC EnvelopeRecord + 2 IPTCApplication IPTC ApplicationRecord + 3 IPTCNewsPhoto IPTC NewsPhoto + 7 IPTCPreObjectData IPTC PreObjectData + 8 IPTCObjectData IPTC ObjectData + 9 IPTCPostObjectData IPTC PostObjectData + 240 IPTCFotoStation IPTC FotoStation + +=head3 IPTC EnvelopeRecord Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0 EnvelopeRecordVersion int16u: + 5 Destination string[0,1024]+ + 20 FileFormat int16u + 22 FileVersion int16u + 30 ServiceIdentifier string[0,10] + 40 EnvelopeNumber digits[8] + 50 ProductID string[0,32]+ + 60 EnvelopePriority digits[1] + 70 DateSent digits[8] + 80 TimeSent string[11] + 90 CodedCharacterSet string[0,32]! + 100 UniqueObjectName string[14,80] + 120 ARMIdentifier int16u + 122 ARMVersion int16u + +=head3 IPTC ApplicationRecord Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0 ApplicationRecordVersion int16u: + 3 ObjectTypeReference string[3,67] + 4 ObjectAttributeReference string[4,68]+ + 5 ObjectName string[0,64] + 7 EditStatus string[0,64] + 8 EditorialUpdate digits[2] + 10 Urgency digits[1] + 12 SubjectReference string[13,236]+ + 15 Category string[0,3] + 20 SupplementalCategories string[0,32]+ + 22 FixtureIdentifier string[0,32] + 25 Keywords string[0,64]+ + 26 ContentLocationCode string[3]+ + 27 ContentLocationName string[0,64]+ + 30 ReleaseDate digits[8] + 35 ReleaseTime string[11] + 37 ExpirationDate digits[8] + 38 ExpirationTime string[11] + 40 SpecialInstructions string[0,256] + 42 ActionAdvised digits[2] + 45 ReferenceService string[0,10]+ + 47 ReferenceDate digits[8]+ + 50 ReferenceNumber digits[8]+ + 55 DateCreated digits[8] + 60 TimeCreated string[11] + 62 DigitalCreationDate digits[8] + 63 DigitalCreationTime string[11] + 65 OriginatingProgram string[0,32] + 70 ProgramVersion string[0,10] + 75 ObjectCycle string[1] + 80 By-line string[0,32]+ + 85 By-lineTitle string[0,32]+ + 90 City string[0,32] + 92 Sub-location string[0,32] + 95 Province-State string[0,32] + 100 Country-PrimaryLocationCode string[3] + 101 Country-PrimaryLocationName string[0,64] + 103 OriginalTransmissionReference string[0,32] + 105 Headline string[0,256] + 110 Credit string[0,32] + 115 Source string[0,32] + 116 CopyrightNotice string[0,128] + 118 Contact string[0,128]+ + 120 Caption-Abstract string[0,2000] + 121 LocalCaption string[0,256] + 122 Writer-Editor string[0,32]+ + 125 RasterizedCaption undef[7360] + 130 ImageType string[2] + 131 ImageOrientation string[1] + 135 LanguageIdentifier string[2,3] + 150 AudioType string[2] + 151 AudioSamplingRate digits[6] + 152 AudioSamplingResolution digits[2] + 153 AudioDuration digits[6] + 154 AudioOutcue string[0,64] + 184 JobID string[0,64] + 185 MasterDocumentID string[0,256] + 186 ShortDocumentID string[0,64] + 187 UniqueDocumentID string[0,128] + 188 OwnerID string[0,128] + 200 ObjectPreviewFileFormat int16u + 201 ObjectPreviewFileVersion int16u + 202 ObjectPreviewData undef[0,256000] + 221 Prefs string[0,64] + 225 ClassifyState string[0,64] + 228 SimilarityIndex string[0,32] + 230 DocumentNotes string[0,1024] + 231 DocumentHistory string[0,256] + 232 ExifCameraInfo string[0,4096] + 255 CatalogSets string[0,256]+ + +=head3 IPTC NewsPhoto Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0 NewsPhotoVersion int16u: + 10 IPTCPictureNumber string[16] + 20 IPTCImageWidth int16u + 30 IPTCImageHeight int16u + 40 IPTCPixelWidth int16u + 50 IPTCPixelHeight int16u + 55 SupplementalType int8u + 60 ColorRepresentation int16u + 64 InterchangeColorSpace int8u + 65 ColorSequence int8u + 66 ICC_Profile no + 70 ColorCalibrationMatrix no + 80 LookupTable no + 84 NumIndexEntries int16u + 85 ColorPalette no + 86 IPTCBitsPerSample int8u + 90 SampleStructure int8u + 100 ScanningDirection int8u + 102 IPTCImageRotation int8u + 110 DataCompressionMethod int32u + 120 QuantizationMethod int8u + 125 EndPoints no + 130 ExcursionTolerance int8u + 135 BitsPerComponent int8u + 140 MaximumDensityRange int16u + 145 GammaCompensatedValue int16u + +=head3 IPTC PreObjectData Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 10 SizeMode no + 20 MaxSubfileSize no + 90 ObjectSizeAnnounced no + 95 MaximumObjectSize no + +=head3 IPTC ObjectData Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 10 SubFile no+ + +=head3 IPTC PostObjectData Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 10 ConfirmedObjectSize no + +=head3 IPTC FotoStation Tags + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head2 XMP Tags + +XMP stands for "Extensible Metadata Platform", an XML/RDF-based metadata +format which is being pushed by Adobe. Information in this format can be +embedded in many different image file types including JPG, JP2, TIFF, GIF, +EPS, PDF, PSD, IND, INX, PNG, DJVU, SVG, PGF, MIFF, XCF, CRW, DNG and a +variety of proprietary TIFF-based RAW images, as well as MOV, AVI, ASF, WMV, +FLV, SWF and MP4 videos, and WMA and audio formats supporting ID3v2 +information. + +The XMP B<Tag ID>'s aren't listed because in most cases they are identical +to the B<Tag Name> (aside from differences in case). Tags with different +ID's are mentioned in the B<Notes> column of the HTML version of this +document. + +All XMP information is stored as character strings. The B<Writable> column +specifies the information format: C<string> is an unformatted string, +C<integer> is a string of digits (possibly beginning with a '+' or '-'), +C<real> is a floating point number, C<rational> is entered as a floating +point number but stored as two C<integer> strings separated by a '/' +character, C<date> is a date/time string entered in the format "YYYY:mm:dd +HH:MM:SS[.ss][+/-HH:MM]", C<boolean> is either "True" or "False" (but "true" +and "false" may be written as a ValueConv value for compatibility with +non-conforming applications), C<struct> indicates a structured tag, and +C<lang-alt> is a tag that supports alternate languages. + +When reading, C<struct> tags are extracted only if the Struct (-struct) +option is used. Otherwise the corresponding I<Flattened> tags, indicated by +an underline (C<_>) after the B<Writable> type, are extracted. When +copying, by default both structured and flattened tags are available, but +the flattened tags are considered "unsafe" so they aren't copied unless +specified explicitly. The Struct option may be disabled by setting Struct +to 0 via the API or with --struct on the command line to copy only flattened +tags, or enabled by setting Struct to 1 via the API or with -struct on the +command line to copy only as structures. When writing, the Struct option +has no effect, and both structured and flattened tags may be written. See +L<https://exiftool.org/struct.html> for more details. + +Individual languages for C<lang-alt> tags are accessed by suffixing the tag +name with a '-', followed by an RFC 3066 language code (eg. "XMP:Title-fr", +or "Rights-en-US"). (See L<http://www.ietf.org/rfc/rfc3066.txt> for the RFC +3066 specification.) A C<lang-alt> tag with no language code accesses the +"x-default" language, but causes other languages for this tag to be deleted +when writing. The "x-default" language code may be specified when writing +to preserve other existing languages (eg. "XMP-dc:Description-x-default"). +When reading, "x-default" is not specified. + +The XMP tags are organized according to schema B<Namespace> in the following +tables. The ExifTool family 1 group names are derived from the namespace +prefixes by adding a leading "XMP-" (eg. "XMP-dc"). A few of the longer +prefixes have been shortened (as mentioned in the documentation below) to +avoid excessively long ExifTool group names. The tags of any namespace may +be deleted as a group by specifying the family 1 group name (eg. +"-XMP-dc:all=" on the command line). This includes namespaces which are not +pre-defined by ExifTool. + +In cases where a tag name exists in more than one namespace, less common +namespaces are avoided when writing. However, a specific namespace may be +written by providing a family 1 group name for the tag (eg. XMP-crs:Contrast +or XMP-exif:Contrast). When deciding on which tags to add to an image, +using standard schemas such as L<dc|/XMP dc Tags>, L<xmp|/XMP xmp Tags>, +L<iptcCore|/XMP iptcCore Tags> and L<iptcExt|/XMP iptcExt Tags> is +recommended if possible. + +For structures, the heading of the first column is B<Field Name>. Field +names are very similar to tag names, except they are used to identify fields +inside structures instead of stand-alone tags. See +L<https://exiftool.org/struct.html#Fields> for more +details. + +ExifTool will extract XMP information even if it is not listed in these +tables, but other tags are not writable unless added as user-defined tags in +the ExifTool config file. For example, the C<pdfx> namespace doesn't have a +predefined set of tag names because it is used to store application-defined +PDF information, so although this information will be extracted, it is only +writable if the corresponding user-defined tags have been created. + +The tables below list tags from the official XMP specification (with an +underlined B<Namespace> in the HTML version of this documentation), as well +as extensions from various other sources. See +L<http://www.adobe.com/devnet/xmp/> for the official XMP specification. + + Namespace Writable + --------- -------- + aas XMP aas + acdsee XMP acdsee + album XMP Album + apple-fi XMP apple_fi + ast Nikon ast + aux XMP aux + cc XMP cc + cell XMP cell + crd XMP crd + creatorAtom XMP creatorAtom + crs XMP crs + dc XMP dc + Device XMP Device + dex XMP dex + DICOM XMP DICOM + digiKam XMP digiKam + drone-dji DJI XMP + dwc DarwinCore + exif XMP exif + exifEX XMP exifEX + expressionmedia XMP ExpressionMedia + extensis XMP extensis + fpv XMP fpv + GAudio XMP GAudio + GCamera XMP GCamera + GCreations XMP GCreations + GDepth XMP GDepth + getty XMP GettyImages + GFocus XMP GFocus + GImage XMP GImage + GPano XMP GPano + GSpherical XMP GSpherical + ics XMP ics + iptcCore XMP iptcCore + iptcExt XMP iptcExt + LImage XMP LImage + lr XMP Lightroom + mediapro XMP MediaPro + microsoft Microsoft XMP + MP Microsoft MP + MP1 Microsoft MP1 + mwg-coll MWG Collections + mwg-kw MWG Keywords + mwg-rs MWG Regions + nine Nikon nine + pdf XMP pdf + pdfx XMP pdfx + photomech PhotoMechanic XMP + photoshop XMP photoshop + PixelLive XMP PixelLive + plus PLUS XMP + pmi XMP pmi + prism XMP prism + prl XMP prl + prm XMP prm + pur XMP pur + rdf XMP rdf + sdc Nikon sdc + swf XMP swf + tiff XMP tiff + x XMP x + xmp XMP xmp + xmpBJ XMP xmpBJ + xmpDM XMP xmpDM + xmpMM XMP xmpMM + xmpNote XMP xmpNote + xmpPLUS XMP xmpPLUS + xmpRights XMP xmpRights + xmpTPg XMP xmpTPg + +=head3 XMP aas Tags + +Apple Adjustment Settings used by iPhone/iPad. + +These tags belong to the ExifTool XMP-aas family 1 group. + + Tag Name Writable + -------- -------- + AffineA real + AffineB real + AffineC real + AffineD real + AffineX real + AffineY real + CropH integer/ + CropW integer/ + CropX integer/ + CropY integer/ + Curve0x real + Curve0y real + Curve1x real + Curve1y real + Curve2x real + Curve2y real + Curve3x real + Curve3y real + Curve4x real + Curve4y real + FaceBalanceOrigI real + FaceBalanceOrigQ real + FaceBalanceStrength real + FaceBalanceWarmth real + Highlights real/ + Shadows real/ + Vibrance real/ + +=head3 XMP acdsee Tags + +ACD Systems ACDSee namespace tags. + +(A note to software developers: Re-inventing your own private tags instead +of using the equivalent tags in standard XMP namespaces defeats one of the +most valuable features of metadata: interoperability. Your applications +mumble to themselves instead of speaking out for the rest of the world to +hear.) + +These tags belong to the ExifTool XMP-acdsee family 1 group. + + Tag Name Writable + -------- -------- + Author string/ + Caption string/ + Categories string/ + Collections string/ + DateTime date/ + DPP lang-alt/ + EditStatus string/ + FixtureIdentifier string/ + Keywords string/+ + Notes string/ + ObjectCycle string/ + OriginatingProgram string/ + Rating real/ + Rawrppused boolean/ + ReleaseDate string/ + ReleaseTime string/ + RPP lang-alt/ + Snapshots string/+ + Tagged boolean/ + +=head3 XMP Album Tags + +Adobe Album namespace tags. + +These tags belong to the ExifTool XMP-album family 1 group. + + Tag Name Writable + -------- -------- + Notes string + +=head3 XMP apple_fi Tags + +Face information tags written by the Apple iPhone 5 inside the mwg-rs +RegionExtensions. + +These tags belong to the ExifTool XMP-apple-fi family 1 group. + + Tag Name Writable + -------- -------- + AngleInfoRoll integer + AngleInfoYaw integer + ConfidenceLevel integer + FaceID integer + TimeStamp integer + +=head3 XMP aux Tags + +Adobe-defined auxiliary EXIF tags. This namespace existed in the XMP +specification until it was dropped in 2012, presumably due to the +introduction of the EXIF 2.3 for XMP specification and the exifEX namespace +at this time. For this reason, tags below with equivalents in the +L<exifEX namespace|/XMP exifEX Tags> are avoided when writing. + +These tags belong to the ExifTool XMP-aux family 1 group. + + Tag Name Writable + -------- -------- + ApproximateFocusDistance rational + DistortionCorrectionAlreadyApplied boolean + Firmware string + FlashCompensation rational + ImageNumber string + IsMergedHDR boolean + IsMergedPanorama boolean + LateralChromaticAberrationCorrectionAlreadyApplied boolean + Lens string + LensDistortInfo string + LensID string + LensInfo string/ + LensSerialNumber string/ + NeutralDensityFactor string + OwnerName string/ + SerialNumber string/ + VignetteCorrectionAlreadyApplied boolean + +=head3 XMP cc Tags + +Creative Commons namespace tags. Note that the CC specification for XMP is +non-existent, so ExifTool must make some assumptions about the format of the +specific properties in XMP (see L<http://creativecommons.org/ns>). + +These tags belong to the ExifTool XMP-cc family 1 group. + + Tag Name Writable + -------- -------- + AttributionName string + AttributionURL string + DeprecatedOn date + Jurisdiction string + LegalCode string + License string + MorePermissions string + Permits string+ + Prohibits string+ + Requires string+ + UseGuidelines string + +=head3 XMP cell Tags + +Location tags written by some Sony Ericsson phones. + +These tags belong to the ExifTool XMP-cell family 1 group. + + Tag Name Writable + -------- -------- + CellTowerID string + CellGlobalID string + LocationAreaCode string + MobileCountryCode string + MobileNetworkCode string + CellR string + +=head3 XMP crd Tags + +Adobe Camera Raw Defaults tags. + +These tags belong to the ExifTool XMP-crd family 1 group. + + Tag Name Writable + -------- -------- + AlreadyApplied boolean/ + AutoBrightness boolean/ + AutoContrast boolean/ + AutoExposure boolean/ + AutoLateralCA integer/ + AutoShadows boolean/ + AutoTone boolean/ + AutoToneDigest string/ + AutoToneDigestNoSat string/ + AutoWhiteVersion integer/ + Blacks2012 integer/ + BlueHue integer/ + BlueSaturation integer/ + Brightness integer/ + CameraModelRestriction string/ + CameraProfile string/ + CameraProfileDigest string/ + ChromaticAberrationB integer/ + ChromaticAberrationR integer/ + CircularGradientBasedCorrections Correction Struct+ + CircGradBasedCorrActive boolean/_ + CircGradBasedCorrAmount real/_ + CircGradBasedCorrMasks CorrectionMask Struct_+ + CircGradBasedCorrMaskAlpha real/_ + CircGradBasedCorrMaskAngle real/_ + CircGradBasedCorrMaskBottom real/_ + CircGradBasedCorrMaskCenterValue real/_ + CircGradBasedCorrMaskCenterWeight real/_ + CircGradBasedCorrMaskRange CorrRangeMask Struct_+ + CircGradBasedCorrMaskRangeAreaModels AreaModels Struct_+ + CircGradBasedCorrMaskRangeAreaModelsComponents string/_+ + CircGradBasedCorrMaskRangeAreaModelsColorSampleInfo string/_+ + CircGradBasedCorrMaskRangeColorAmount real/_+ + CircGradBasedCorrMaskRangeDepthFeather real/_+ + CircGradBasedCorrMaskRangeDepthMax real/_+ + CircGradBasedCorrMaskRangeDepthMin real/_+ + CircGradBasedCorrMaskRangeInvert boolean/_+ + CircGradBasedCorrMaskRangeLumFeather real/_+ + CircGradBasedCorrMaskRangeLuminanceDepthSampleInfo string/_+ + CircGradBasedCorrMaskRangeLumMax real/_+ + CircGradBasedCorrMaskRangeLumMin real/_+ + CircGradBasedCorrMaskRangeLumRange string/_+ + CircGradBasedCorrMaskRangeSampleType integer/_+ + CircGradBasedCorrMaskRangeType string/_+ + CircGradBasedCorrMaskRangeVersion string/_+ + CircGradBasedCorrMaskDabs string/_ + CircGradBasedCorrMaskFeather real/_ + CircGradBasedCorrMaskFlipped boolean/_ + CircGradBasedCorrMaskFlow real/_ + CircGradBasedCorrMaskFullX real/_ + CircGradBasedCorrMaskFullY real/_ + CircGradBasedCorrMaskInputDigest string/_ + CircGradBasedCorrMaskLeft real/_ + CircGradBasedCorrMaskMaskActive boolean/_ + CircGradBasedCorrMaskMaskBlendMode integer/_ + CircGradBasedCorrMaskMaskDigest string/_ + CircGradBasedCorrMaskMaskInverted boolean/_ + CircGradBasedCorrMaskMaskName string/_ + CircGradBasedCorrMaskMasks CorrectionMask Struct_+ + CircGradBasedCorrMaskMasksAlpha real/_ + CircGradBasedCorrMaskMasksAngle real/_ + CircGradBasedCorrMaskMasksBottom real/_ + CircGradBasedCorrMaskMasksCenterValue real/_ + CircGradBasedCorrMaskMasksCenterWeight real/_ + CircGradBasedCorrMaskMasksDabs string/_+ + CircGradBasedCorrMaskMasksFeather real/_ + CircGradBasedCorrMaskMasksFlipped boolean/_ + CircGradBasedCorrMaskMasksFlow real/_ + CircGradBasedCorrMaskMasksFullX real/_ + CircGradBasedCorrMaskMasksFullY real/_ + CircGradBasedCorrMaskMasksInputDigest string/_ + CircGradBasedCorrMaskMasksLeft real/_ + CircGradBasedCorrMaskMasksMaskActive boolean/_ + CircGradBasedCorrMaskMasksMaskBlendMode integer/_ + CircGradBasedCorrMaskMasksMaskDigest string/_ + CircGradBasedCorrMaskMasksMaskInverted boolean/_ + CircGradBasedCorrMaskMasksMaskName string/_ + CircGradBasedCorrMaskMasksMaskSubType string/_ + CircGradBasedCorrMaskMasksMaskSyncID string/_ + CircGradBasedCorrMaskMasksValue real/_ + CircGradBasedCorrMaskMasksMaskVersion string/_ + CircGradBasedCorrMaskMasksMidpoint real/_ + CircGradBasedCorrMaskMasksOrigin string/_ + CircGradBasedCorrMaskMasksPerimeterValue real/_ + CircGradBasedCorrMaskMasksRadius real/_ + CircGradBasedCorrMaskMasksReferencePoint string/_ + CircGradBasedCorrMaskMasksRight real/_ + CircGradBasedCorrMaskMasksRoundness real/_ + CircGradBasedCorrMaskMasksSizeX real/_ + CircGradBasedCorrMaskMasksSizeY real/_ + CircGradBasedCorrMaskMasksTop real/_ + CircGradBasedCorrMaskMaskSubType string/_ + CircGradBasedCorrMaskMasksVersion integer/_ + CircGradBasedCorrMaskMasksWhat string/_ + CircGradBasedCorrMaskMasksWholeImageArea string/_ + CircGradBasedCorrMaskMasksX real/_ + CircGradBasedCorrMaskMasksY real/_ + CircGradBasedCorrMaskMaskSyncID string/_ + CircGradBasedCorrMaskMasksZeroX real/_ + CircGradBasedCorrMaskMasksZeroY real/_ + CircGradBasedCorrMaskValue real/_ + CircGradBasedCorrMaskMaskVersion string/_ + CircGradBasedCorrMaskMidpoint real/_ + CircGradBasedCorrMaskOrigin string/_ + CircGradBasedCorrMaskPerimeterValue real/_ + CircGradBasedCorrMaskRadius real/_ + CircGradBasedCorrMaskReferencePoint string/_ + CircGradBasedCorrMaskRight real/_ + CircGradBasedCorrMaskRoundness real/_ + CircGradBasedCorrMaskSizeX real/_ + CircGradBasedCorrMaskSizeY real/_ + CircGradBasedCorrMaskTop real/_ + CircGradBasedCorrMaskVersion integer/_ + CircGradBasedCorrMaskWhat string/_ + CircGradBasedCorrMaskWholeImageArea string/_ + CircGradBasedCorrMaskX real/_ + CircGradBasedCorrMaskY real/_ + CircGradBasedCorrMaskZeroX real/_ + CircGradBasedCorrMaskZeroY real/_ + CircGradBasedCorrCorrectionName string/_+ + CircGradBasedCorrRangeMask CorrRangeMask Struct_+ + CircGradBasedCorrRangeMaskAreaModels AreaModels Struct_+ + CircGradBasedCorrRangeMaskAreaModelsComponents string/_+ + CircGradBasedCorrRangeMaskAreaModelsColorSampleInfo string/_+ + CircGradBasedCorrRangeMaskColorAmount real/_+ + CircGradBasedCorrRangeMaskDepthFeather real/_+ + CircGradBasedCorrRangeMaskDepthMax real/_+ + CircGradBasedCorrRangeMaskDepthMin real/_+ + CircGradBasedCorrRangeMaskInvert boolean/_+ + CircGradBasedCorrRangeMaskLumFeather real/_+ + CircGradBasedCorrRangeMaskLuminanceDepthSampleInfo string/_+ + CircGradBasedCorrRangeMaskLumMax real/_+ + CircGradBasedCorrRangeMaskLumMin real/_+ + CircGradBasedCorrRangeMaskLumRange string/_+ + CircGradBasedCorrRangeMaskSampleType integer/_+ + CircGradBasedCorrRangeMaskType string/_+ + CircGradBasedCorrRangeMaskVersion string/_+ + CircGradBasedCorrCorrectionSyncID string/_+ + CircGradBasedCorrBlacks2012 real/_ + CircGradBasedCorrBrightness real/_ + CircGradBasedCorrClarity real/_ + CircGradBasedCorrClarity2012 real/_ + CircGradBasedCorrContrast real/_ + CircGradBasedCorrContrast2012 real/_ + CircGradBasedCorrDefringe real/_ + CircGradBasedCorrDehaze real/_ + CircGradBasedCorrExposure real/_ + CircGradBasedCorrExposure2012 real/_ + CircGradBasedCorrHighlights2012 real/_ + CircGradBasedCorrHue real/_ + CircGradBasedCorrLuminanceNoise real/_ + CircGradBasedCorrMoire real/_ + CircGradBasedCorrSaturation real/_ + CircGradBasedCorrShadows2012 real/_ + CircGradBasedCorrSharpness real/_ + CircGradBasedCorrTemperature real/_ + CircGradBasedCorrTexture real/_ + CircGradBasedCorrTint real/_ + CircGradBasedCorrToningHue real/_ + CircGradBasedCorrToningSaturation real/_ + CircGradBasedCorrWhites2012 real/_ + CircGradBasedCorrWhat string/_ + Clarity integer/ + Clarity2012 integer/ + ClipboardAspectRatio integer/ + ClipboardOrientation integer/ + Cluster string/ + ColorGradeBlending integer/ + ColorGradeGlobalHue integer/ + ColorGradeGlobalLum integer/ + ColorGradeGlobalSat integer/ + ColorGradeHighlightLum integer/ + ColorGradeMidtoneHue integer/ + ColorGradeMidtoneLum integer/ + ColorGradeMidtoneSat integer/ + ColorGradeShadowLum integer/ + ColorNoiseReduction integer/ + ColorNoiseReductionDetail integer/ + ColorNoiseReductionSmoothness integer/ + CompatibleVersion string/ + ContactInfo string/ + Contrast integer/ + Contrast2012 integer/ + Converter string/ + ConvertToGrayscale boolean/ + Copyright string/ + CropAngle real/ + CropBottom real/ + CropConstrainToWarp integer/ + CropHeight real/ + CropLeft real/ + CropRight real/ + CropTop real/ + CropUnit integer/ + CropUnits integer/ + CropWidth real/ + DefaultAutoGray boolean/ + DefaultAutoTone boolean/ + DefaultsSpecificToISO boolean/ + DefaultsSpecificToSerial boolean/ + Defringe integer/ + DefringeGreenAmount integer/ + DefringeGreenHueHi integer/ + DefringeGreenHueLo integer/ + DefringePurpleAmount integer/ + DefringePurpleHueHi integer/ + DefringePurpleHueLo integer/ + Dehaze real/ + Description lang-alt/ + DNGIgnoreSidecars boolean/ + Exposure real/ + Exposure2012 real/ + FillLight integer/ + GradientBasedCorrections Correction Struct+ + GradientBasedCorrActive boolean/_ + GradientBasedCorrAmount real/_ + GradientBasedCorrMasks CorrectionMask Struct_+ + GradientBasedCorrMaskAlpha real/_ + GradientBasedCorrMaskAngle real/_ + GradientBasedCorrMaskBottom real/_ + GradientBasedCorrMaskCenterValue real/_ + GradientBasedCorrMaskCenterWeight real/_ + GradientBasedCorrMaskRange CorrRangeMask Struct_+ + GradientBasedCorrMaskRangeAreaModels AreaModels Struct_+ + GradientBasedCorrMaskRangeAreaModelsComponents string/_+ + GradientBasedCorrMaskRangeAreaModelsColorSampleInfo string/_+ + GradientBasedCorrMaskRangeColorAmount real/_+ + GradientBasedCorrMaskRangeDepthFeather real/_+ + GradientBasedCorrMaskRangeDepthMax real/_+ + GradientBasedCorrMaskRangeDepthMin real/_+ + GradientBasedCorrMaskRangeInvert boolean/_+ + GradientBasedCorrMaskRangeLumFeather real/_+ + GradientBasedCorrMaskRangeLuminanceDepthSampleInfo string/_+ + GradientBasedCorrMaskRangeLumMax real/_+ + GradientBasedCorrMaskRangeLumMin real/_+ + GradientBasedCorrMaskRangeLumRange string/_+ + GradientBasedCorrMaskRangeSampleType integer/_+ + GradientBasedCorrMaskRangeType string/_+ + GradientBasedCorrMaskRangeVersion string/_+ + GradientBasedCorrMaskDabs string/_ + GradientBasedCorrMaskFeather real/_ + GradientBasedCorrMaskFlipped boolean/_ + GradientBasedCorrMaskFlow real/_ + GradientBasedCorrMaskFullX real/_ + GradientBasedCorrMaskFullY real/_ + GradientBasedCorrMaskInputDigest string/_ + GradientBasedCorrMaskLeft real/_ + GradientBasedCorrMaskMaskActive boolean/_ + GradientBasedCorrMaskMaskBlendMode integer/_ + GradientBasedCorrMaskMaskDigest string/_ + GradientBasedCorrMaskMaskInverted boolean/_ + GradientBasedCorrMaskMaskName string/_ + GradientBasedCorrMaskMasks CorrectionMask Struct_+ + GradientBasedCorrMaskMasksAlpha real/_ + GradientBasedCorrMaskMasksAngle real/_ + GradientBasedCorrMaskMasksBottom real/_ + GradientBasedCorrMaskMasksCenterValue real/_ + GradientBasedCorrMaskMasksCenterWeight real/_ + GradientBasedCorrMaskMasksDabs string/_+ + GradientBasedCorrMaskMasksFeather real/_ + GradientBasedCorrMaskMasksFlipped boolean/_ + GradientBasedCorrMaskMasksFlow real/_ + GradientBasedCorrMaskMasksFullX real/_ + GradientBasedCorrMaskMasksFullY real/_ + GradientBasedCorrMaskMasksInputDigest string/_ + GradientBasedCorrMaskMasksLeft real/_ + GradientBasedCorrMaskMasksMaskActive boolean/_ + GradientBasedCorrMaskMasksMaskBlendMode integer/_ + GradientBasedCorrMaskMasksMaskDigest string/_ + GradientBasedCorrMaskMasksMaskInverted boolean/_ + GradientBasedCorrMaskMasksMaskName string/_ + GradientBasedCorrMaskMasksMaskSubType string/_ + GradientBasedCorrMaskMasksMaskSyncID string/_ + GradientBasedCorrMaskMasksValue real/_ + GradientBasedCorrMaskMasksMaskVersion string/_ + GradientBasedCorrMaskMasksMidpoint real/_ + GradientBasedCorrMaskMasksOrigin string/_ + GradientBasedCorrMaskMasksPerimeterValue real/_ + GradientBasedCorrMaskMasksRadius real/_ + GradientBasedCorrMaskMasksReferencePoint string/_ + GradientBasedCorrMaskMasksRight real/_ + GradientBasedCorrMaskMasksRoundness real/_ + GradientBasedCorrMaskMasksSizeX real/_ + GradientBasedCorrMaskMasksSizeY real/_ + GradientBasedCorrMaskMasksTop real/_ + GradientBasedCorrMaskMaskSubType string/_ + GradientBasedCorrMaskMasksVersion integer/_ + GradientBasedCorrMaskMasksWhat string/_ + GradientBasedCorrMaskMasksWholeImageArea string/_ + GradientBasedCorrMaskMasksX real/_ + GradientBasedCorrMaskMasksY real/_ + GradientBasedCorrMaskMaskSyncID string/_ + GradientBasedCorrMaskMasksZeroX real/_ + GradientBasedCorrMaskMasksZeroY real/_ + GradientBasedCorrMaskValue real/_ + GradientBasedCorrMaskMaskVersion string/_ + GradientBasedCorrMaskMidpoint real/_ + GradientBasedCorrMaskOrigin string/_ + GradientBasedCorrMaskPerimeterValue real/_ + GradientBasedCorrMaskRadius real/_ + GradientBasedCorrMaskReferencePoint string/_ + GradientBasedCorrMaskRight real/_ + GradientBasedCorrMaskRoundness real/_ + GradientBasedCorrMaskSizeX real/_ + GradientBasedCorrMaskSizeY real/_ + GradientBasedCorrMaskTop real/_ + GradientBasedCorrMaskVersion integer/_ + GradientBasedCorrMaskWhat string/_ + GradientBasedCorrMaskWholeImageArea string/_ + GradientBasedCorrMaskX real/_ + GradientBasedCorrMaskY real/_ + GradientBasedCorrMaskZeroX real/_ + GradientBasedCorrMaskZeroY real/_ + GradientBasedCorrCorrectionName string/_+ + GradientBasedCorrRangeMask CorrRangeMask Struct_+ + GradientBasedCorrRangeMaskAreaModels AreaModels Struct_+ + GradientBasedCorrRangeMaskAreaModelsComponents string/_+ + GradientBasedCorrRangeMaskAreaModelsColorSampleInfo string/_+ + GradientBasedCorrRangeMaskColorAmount real/_+ + GradientBasedCorrRangeMaskDepthFeather real/_+ + GradientBasedCorrRangeMaskDepthMax real/_+ + GradientBasedCorrRangeMaskDepthMin real/_+ + GradientBasedCorrRangeMaskInvert boolean/_+ + GradientBasedCorrRangeMaskLumFeather real/_+ + GradientBasedCorrRangeMaskLuminanceDepthSampleInfo string/_+ + GradientBasedCorrRangeMaskLumMax real/_+ + GradientBasedCorrRangeMaskLumMin real/_+ + GradientBasedCorrRangeMaskLumRange string/_+ + GradientBasedCorrRangeMaskSampleType integer/_+ + GradientBasedCorrRangeMaskType string/_+ + GradientBasedCorrRangeMaskVersion string/_+ + GradientBasedCorrCorrectionSyncID string/_+ + GradientBasedCorrBlacks2012 real/_ + GradientBasedCorrBrightness real/_ + GradientBasedCorrClarity real/_ + GradientBasedCorrClarity2012 real/_ + GradientBasedCorrContrast real/_ + GradientBasedCorrContrast2012 real/_ + GradientBasedCorrDefringe real/_ + GradientBasedCorrDehaze real/_ + GradientBasedCorrExposure real/_ + GradientBasedCorrExposure2012 real/_ + GradientBasedCorrHighlights2012 real/_ + GradientBasedCorrHue real/_ + GradientBasedCorrLuminanceNoise real/_ + GradientBasedCorrMoire real/_ + GradientBasedCorrSaturation real/_ + GradientBasedCorrShadows2012 real/_ + GradientBasedCorrSharpness real/_ + GradientBasedCorrTemperature real/_ + GradientBasedCorrTexture real/_ + GradientBasedCorrTint real/_ + GradientBasedCorrToningHue real/_ + GradientBasedCorrToningSaturation real/_ + GradientBasedCorrWhites2012 real/_ + GradientBasedCorrWhat string/_ + GrainAmount integer/ + GrainFrequency integer/ + GrainSeed integer/ + GrainSize integer/ + GrayMixerAqua integer/ + GrayMixerBlue integer/ + GrayMixerGreen integer/ + GrayMixerMagenta integer/ + GrayMixerOrange integer/ + GrayMixerPurple integer/ + GrayMixerRed integer/ + GrayMixerYellow integer/ + GreenHue integer/ + GreenSaturation integer/ + Group lang-alt/ + HasCrop boolean/ + HasSettings boolean/ + Highlight2012 integer/ + HighlightRecovery integer/ + Highlights2012 integer/ + HueAdjustmentAqua integer/ + HueAdjustmentBlue integer/ + HueAdjustmentGreen integer/ + HueAdjustmentMagenta integer/ + HueAdjustmentOrange integer/ + HueAdjustmentPurple integer/ + HueAdjustmentRed integer/ + HueAdjustmentYellow integer/ + IncrementalTemperature integer/ + IncrementalTint integer/ + JPEGHandling string/ + LensManualDistortionAmount integer/ + LensProfileChromaticAberrationScale integer/ + LensProfileDigest string/ + LensProfileDistortionScale integer/ + LensProfileEnable integer/ + LensProfileFilename string/ + LensProfileIsEmbedded boolean/ + LensProfileMatchKeyCameraModelName string/ + LensProfileMatchKeyExifMake string/ + LensProfileMatchKeyExifModel string/ + LensProfileMatchKeyIsRaw boolean/ + LensProfileMatchKeyLensID string/ + LensProfileMatchKeyLensInfo string/ + LensProfileMatchKeyLensName string/ + LensProfileMatchKeySensorFormatFactor real/ + LensProfileName string/ + LensProfileSetup string/ + LensProfileVignettingScale integer/ + Look Look Struct + LookAmount string/_ + LookCluster string/_ + LookCopyright string/_ + LookGroup lang-alt/_ + LookName string/ + LookParameters LookParms Struct_ + LookParametersCameraProfile string/_ + LookParametersClarity2012 string/_ + LookParametersConvertToGrayscale string/_ + LookParametersLookTable string/_ + LookParametersProcessVersion string/_ + LookParametersToneCurvePV2012 string/_+ + LookParametersToneCurvePV2012Blue string/_+ + LookParametersToneCurvePV2012Green string/_+ + LookParametersToneCurvePV2012Red string/_+ + LookParametersVersion string/_ + LookSupportsAmount string/_ + LookSupportsMonochrome string/_ + LookSupportsOutputReferred string/_ + LookUUID string/_ + LuminanceAdjustmentAqua integer/ + LuminanceAdjustmentBlue integer/ + LuminanceAdjustmentGreen integer/ + LuminanceAdjustmentMagenta integer/ + LuminanceAdjustmentOrange integer/ + LuminanceAdjustmentPurple integer/ + LuminanceAdjustmentRed integer/ + LuminanceAdjustmentYellow integer/ + LuminanceNoiseReductionContrast integer/ + LuminanceNoiseReductionDetail integer/ + LuminanceSmoothing integer/ + MaskGroupBasedCorrections Correction Struct+ + MaskGroupBasedCorrActive boolean/_ + MaskGroupBasedCorrAmount real/_ + MaskGroupBasedCorrMask CorrectionMask Struct_+ + MaskGroupBasedCorrMaskAlpha real/_ + MaskGroupBasedCorrMaskAngle real/_ + MaskGroupBasedCorrMaskBottom real/_ + MaskGroupBasedCorrMaskCenterValue real/_ + MaskGroupBasedCorrMaskCenterWeight real/_ + MaskGroupBasedCorrMaskRange CorrRangeMask Struct_+ + MaskGroupBasedCorrMaskRangeAreaModels AreaModels Struct_+ + MaskGroupBasedCorrMaskRangeAreaModelsComponents string/_+ + MaskGroupBasedCorrMaskRangeAreaModelsColorSampleInfo string/_+ + MaskGroupBasedCorrMaskRangeColorAmount real/_+ + MaskGroupBasedCorrMaskRangeDepthFeather real/_+ + MaskGroupBasedCorrMaskRangeDepthMax real/_+ + MaskGroupBasedCorrMaskRangeDepthMin real/_+ + MaskGroupBasedCorrMaskRangeInvert boolean/_+ + MaskGroupBasedCorrMaskRangeLumFeather real/_+ + MaskGroupBasedCorrMaskRangeLuminanceDepthSampleInfo string/_+ + MaskGroupBasedCorrMaskRangeLumMax real/_+ + MaskGroupBasedCorrMaskRangeLumMin real/_+ + MaskGroupBasedCorrMaskRangeLumRange string/_+ + MaskGroupBasedCorrMaskRangeSampleType integer/_+ + MaskGroupBasedCorrMaskRangeType string/_+ + MaskGroupBasedCorrMaskRangeVersion string/_+ + MaskGroupBasedCorrMaskDabs string/_+ + MaskGroupBasedCorrMaskFeather real/_ + MaskGroupBasedCorrMaskFlipped boolean/_ + MaskGroupBasedCorrMaskFlow real/_ + MaskGroupBasedCorrMaskFullX real/_ + MaskGroupBasedCorrMaskFullY real/_ + MaskGroupBasedCorrMaskInputDigest string/_ + MaskGroupBasedCorrMaskLeft real/_ + MaskGroupBasedCorrMaskMaskActive boolean/_ + MaskGroupBasedCorrMaskMaskBlendMode integer/_ + MaskGroupBasedCorrMaskMaskDigest string/_ + MaskGroupBasedCorrMaskMaskInverted boolean/_ + MaskGroupBasedCorrMaskMaskName string/_ + MaskGroupBasedCorrMaskMasks CorrectionMask Struct_+ + MaskGroupBasedCorrMaskMasksAlpha real/_ + MaskGroupBasedCorrMaskMasksAngle real/_ + MaskGroupBasedCorrMaskMasksBottom real/_ + MaskGroupBasedCorrMaskMasksCenterValue real/_ + MaskGroupBasedCorrMaskMasksCenterWeight real/_ + MaskGroupBasedCorrMaskMasksDabs string/_+ + MaskGroupBasedCorrMaskMasksFeather real/_ + MaskGroupBasedCorrMaskMasksFlipped boolean/_ + MaskGroupBasedCorrMaskMasksFlow real/_ + MaskGroupBasedCorrMaskMasksFullX real/_ + MaskGroupBasedCorrMaskMasksFullY real/_ + MaskGroupBasedCorrMaskMasksInputDigest string/_ + MaskGroupBasedCorrMaskMasksLeft real/_ + MaskGroupBasedCorrMaskMasksMaskActive boolean/_ + MaskGroupBasedCorrMaskMasksMaskBlendMode integer/_ + MaskGroupBasedCorrMaskMasksMaskDigest string/_ + MaskGroupBasedCorrMaskMasksMaskInverted boolean/_ + MaskGroupBasedCorrMaskMasksMaskName string/_ + MaskGroupBasedCorrMaskMasksMaskSubType string/_ + MaskGroupBasedCorrMaskMasksMaskSyncID string/_ + MaskGroupBasedCorrMaskMasksValue real/_ + MaskGroupBasedCorrMaskMasksMaskVersion string/_ + MaskGroupBasedCorrMaskMasksMidpoint real/_ + MaskGroupBasedCorrMaskMasksOrigin string/_ + MaskGroupBasedCorrMaskMasksPerimeterValue real/_ + MaskGroupBasedCorrMaskMasksRadius real/_ + MaskGroupBasedCorrMaskMasksReferencePoint string/_ + MaskGroupBasedCorrMaskMasksRight real/_ + MaskGroupBasedCorrMaskMasksRoundness real/_ + MaskGroupBasedCorrMaskMasksSizeX real/_ + MaskGroupBasedCorrMaskMasksSizeY real/_ + MaskGroupBasedCorrMaskMasksTop real/_ + MaskGroupBasedCorrMaskMaskSubType string/_ + MaskGroupBasedCorrMaskMasksVersion integer/_ + MaskGroupBasedCorrMaskMasksWhat string/_ + MaskGroupBasedCorrMaskMasksWholeImageArea string/_ + MaskGroupBasedCorrMaskMasksX real/_ + MaskGroupBasedCorrMaskMasksY real/_ + MaskGroupBasedCorrMaskMaskSyncID string/_ + MaskGroupBasedCorrMaskMasksZeroX real/_ + MaskGroupBasedCorrMaskMasksZeroY real/_ + MaskGroupBasedCorrMaskValue real/_ + MaskGroupBasedCorrMaskMaskVersion string/_ + MaskGroupBasedCorrMaskMidpoint real/_ + MaskGroupBasedCorrMaskOrigin string/_ + MaskGroupBasedCorrMaskPerimeterValue real/_ + MaskGroupBasedCorrMaskRadius real/_ + MaskGroupBasedCorrMaskReferencePoint string/_ + MaskGroupBasedCorrMaskRight real/_ + MaskGroupBasedCorrMaskRoundness real/_ + MaskGroupBasedCorrMaskSizeX real/_ + MaskGroupBasedCorrMaskSizeY real/_ + MaskGroupBasedCorrMaskTop real/_ + MaskGroupBasedCorrMaskVersion integer/_ + MaskGroupBasedCorrMaskWhat string/_ + MaskGroupBasedCorrMaskWholeImageArea string/_ + MaskGroupBasedCorrMaskX real/_ + MaskGroupBasedCorrMaskY real/_ + MaskGroupBasedCorrMaskZeroX real/_ + MaskGroupBasedCorrMaskZeroY real/_ + MaskGroupBasedCorrCorrectionName string/_+ + MaskGroupBasedCorrRangeMask CorrRangeMask Struct_+ + MaskGroupBasedCorrRangeMaskAreaModels AreaModels Struct_+ + MaskGroupBasedCorrRangeMaskAreaModelsComponents string/_+ + MaskGroupBasedCorrRangeMaskAreaModelsColorSampleInfo string/_+ + MaskGroupBasedCorrRangeMaskColorAmount real/_+ + MaskGroupBasedCorrRangeMaskDepthFeather real/_+ + MaskGroupBasedCorrRangeMaskDepthMax real/_+ + MaskGroupBasedCorrRangeMaskDepthMin real/_+ + MaskGroupBasedCorrRangeMaskInvert boolean/_+ + MaskGroupBasedCorrRangeMaskLumFeather real/_+ + MaskGroupBasedCorrRangeMaskLuminanceDepthSampleInfo string/_+ + MaskGroupBasedCorrRangeMaskLumMax real/_+ + MaskGroupBasedCorrRangeMaskLumMin real/_+ + MaskGroupBasedCorrRangeMaskLumRange string/_+ + MaskGroupBasedCorrRangeMaskSampleType integer/_+ + MaskGroupBasedCorrRangeMaskType string/_+ + MaskGroupBasedCorrRangeMaskVersion string/_+ + MaskGroupBasedCorrCorrectionSyncID string/_+ + MaskGroupBasedCorrBlacks2012 real/_ + MaskGroupBasedCorrBrightness real/_ + MaskGroupBasedCorrClarity real/_ + MaskGroupBasedCorrClarity2012 real/_ + MaskGroupBasedCorrContrast real/_ + MaskGroupBasedCorrContrast2012 real/_ + MaskGroupBasedCorrDefringe real/_ + MaskGroupBasedCorrDehaze real/_ + MaskGroupBasedCorrExposure real/_ + MaskGroupBasedCorrExposure2012 real/_ + MaskGroupBasedCorrHighlights2012 real/_ + MaskGroupBasedCorrHue real/_ + MaskGroupBasedCorrLuminanceNoise real/_ + MaskGroupBasedCorrMoire real/_ + MaskGroupBasedCorrSaturation real/_ + MaskGroupBasedCorrShadows2012 real/_ + MaskGroupBasedCorrSharpness real/_ + MaskGroupBasedCorrTemperature real/_ + MaskGroupBasedCorrTexture real/_ + MaskGroupBasedCorrTint real/_ + MaskGroupBasedCorrToningHue real/_ + MaskGroupBasedCorrToningSaturation real/_ + MaskGroupBasedCorrWhites2012 real/_ + MaskGroupBasedCorrWhat string/_ + MoireFilter string/ + Name lang-alt/ + NegativeCacheLargePreviewSize integer/ + NegativeCacheMaximumSize real/ + NegativeCachePath string/ + OverrideLookVignette boolean/ + PaintBasedCorrections Correction Struct+ + PaintCorrectionActive boolean/_ + PaintCorrectionAmount real/_ + PaintBasedCorrectionMasks CorrectionMask Struct_+ + PaintCorrectionMaskAlpha real/_ + PaintCorrectionMaskAngle real/_ + PaintCorrectionMaskBottom real/_ + PaintCorrectionMaskCenterValue real/_ + PaintCorrectionMaskCenterWeight real/_ + PaintCorrectionMaskRange CorrRangeMask Struct_+ + PaintCorrectionMaskRangeAreaModels AreaModels Struct_+ + PaintCorrectionMaskRangeAreaModelsComponents string/_+ + PaintCorrectionMaskRangeAreaModelsColorSampleInfo string/_+ + PaintCorrectionMaskRangeColorAmount real/_+ + PaintCorrectionMaskRangeDepthFeather real/_+ + PaintCorrectionMaskRangeDepthMax real/_+ + PaintCorrectionMaskRangeDepthMin real/_+ + PaintCorrectionMaskRangeInvert boolean/_+ + PaintCorrectionMaskRangeLumFeather real/_+ + PaintCorrectionMaskRangeLuminanceDepthSampleInfo string/_+ + PaintCorrectionMaskRangeLumMax real/_+ + PaintCorrectionMaskRangeLumMin real/_+ + PaintCorrectionMaskRangeLumRange string/_+ + PaintCorrectionMaskRangeSampleType integer/_+ + PaintCorrectionMaskRangeType string/_+ + PaintCorrectionMaskRangeVersion string/_+ + PaintCorrectionMaskDabs string/_ + PaintCorrectionMaskFeather real/_ + PaintCorrectionMaskFlipped boolean/_ + PaintCorrectionMaskFlow real/_ + PaintCorrectionMaskFullX real/_ + PaintCorrectionMaskFullY real/_ + PaintCorrectionMaskInputDigest string/_ + PaintCorrectionMaskLeft real/_ + PaintCorrectionMaskMaskActive boolean/_ + PaintCorrectionMaskMaskBlendMode integer/_ + PaintCorrectionMaskMaskDigest string/_ + PaintCorrectionMaskMaskInverted boolean/_ + PaintCorrectionMaskMaskName string/_ + PaintCorrectionMaskMasks CorrectionMask Struct_+ + PaintCorrectionMaskMasksAlpha real/_ + PaintCorrectionMaskMasksAngle real/_ + PaintCorrectionMaskMasksBottom real/_ + PaintCorrectionMaskMasksCenterValue real/_ + PaintCorrectionMaskMasksCenterWeight real/_ + PaintCorrectionMaskMasksDabs string/_+ + PaintCorrectionMaskMasksFeather real/_ + PaintCorrectionMaskMasksFlipped boolean/_ + PaintCorrectionMaskMasksFlow real/_ + PaintCorrectionMaskMasksFullX real/_ + PaintCorrectionMaskMasksFullY real/_ + PaintCorrectionMaskMasksInputDigest string/_ + PaintCorrectionMaskMasksLeft real/_ + PaintCorrectionMaskMasksMaskActive boolean/_ + PaintCorrectionMaskMasksMaskBlendMode integer/_ + PaintCorrectionMaskMasksMaskDigest string/_ + PaintCorrectionMaskMasksMaskInverted boolean/_ + PaintCorrectionMaskMasksMaskName string/_ + PaintCorrectionMaskMasksMaskSubType string/_ + PaintCorrectionMaskMasksMaskSyncID string/_ + PaintCorrectionMaskMasksValue real/_ + PaintCorrectionMaskMasksMaskVersion string/_ + PaintCorrectionMaskMasksMidpoint real/_ + PaintCorrectionMaskMasksOrigin string/_ + PaintCorrectionMaskMasksPerimeterValue real/_ + PaintCorrectionMaskMasksRadius real/_ + PaintCorrectionMaskMasksReferencePoint string/_ + PaintCorrectionMaskMasksRight real/_ + PaintCorrectionMaskMasksRoundness real/_ + PaintCorrectionMaskMasksSizeX real/_ + PaintCorrectionMaskMasksSizeY real/_ + PaintCorrectionMaskMasksTop real/_ + PaintCorrectionMaskMaskSubType string/_ + PaintCorrectionMaskMasksVersion integer/_ + PaintCorrectionMaskMasksWhat string/_ + PaintCorrectionMaskMasksWholeImageArea string/_ + PaintCorrectionMaskMasksX real/_ + PaintCorrectionMaskMasksY real/_ + PaintCorrectionMaskMaskSyncID string/_ + PaintCorrectionMaskMasksZeroX real/_ + PaintCorrectionMaskMasksZeroY real/_ + PaintCorrectionMaskValue real/_ + PaintCorrectionMaskMaskVersion string/_ + PaintCorrectionMaskMidpoint real/_ + PaintCorrectionMaskOrigin string/_ + PaintCorrectionMaskPerimeterValue real/_ + PaintCorrectionMaskRadius real/_ + PaintCorrectionMaskReferencePoint string/_ + PaintCorrectionMaskRight real/_ + PaintCorrectionMaskRoundness real/_ + PaintCorrectionMaskSizeX real/_ + PaintCorrectionMaskSizeY real/_ + PaintCorrectionMaskTop real/_ + PaintCorrectionMaskVersion integer/_ + PaintCorrectionMaskWhat string/_ + PaintCorrectionMaskWholeImageArea string/_ + PaintCorrectionMaskX real/_ + PaintCorrectionMaskY real/_ + PaintCorrectionMaskZeroX real/_ + PaintCorrectionMaskZeroY real/_ + PaintCorrectionCorrectionName string/_+ + PaintCorrectionRangeMask CorrRangeMask Struct_+ + PaintCorrectionRangeMaskAreaModels AreaModels Struct_+ + PaintCorrectionRangeMaskAreaModelsComponents string/_+ + PaintCorrectionRangeMaskAreaModelsColorSampleInfo string/_+ + PaintCorrectionRangeMaskColorAmount real/_+ + PaintCorrectionRangeMaskDepthFeather real/_+ + PaintCorrectionRangeMaskDepthMax real/_+ + PaintCorrectionRangeMaskDepthMin real/_+ + PaintCorrectionRangeMaskInvert boolean/_+ + PaintCorrectionRangeMaskLumFeather real/_+ + PaintCorrectionRangeMaskLuminanceDepthSampleInfo string/_+ + PaintCorrectionRangeMaskLumMax real/_+ + PaintCorrectionRangeMaskLumMin real/_+ + PaintCorrectionRangeMaskLumRange string/_+ + PaintCorrectionRangeMaskSampleType integer/_+ + PaintCorrectionRangeMaskType string/_+ + PaintCorrectionRangeMaskVersion string/_+ + PaintCorrectionCorrectionSyncID string/_+ + PaintCorrectionBlacks2012 real/_ + PaintCorrectionBrightness real/_ + PaintCorrectionClarity real/_ + PaintCorrectionClarity2012 real/_ + PaintCorrectionContrast real/_ + PaintCorrectionContrast2012 real/_ + PaintCorrectionDefringe real/_ + PaintCorrectionDehaze real/_ + PaintCorrectionExposure real/_ + PaintCorrectionExposure2012 real/_ + PaintCorrectionHighlights2012 real/_ + PaintCorrectionHue real/_ + PaintCorrectionLuminanceNoise real/_ + PaintCorrectionMoire real/_ + PaintCorrectionSaturation real/_ + PaintCorrectionShadows2012 real/_ + PaintCorrectionSharpness real/_ + PaintCorrectionTemperature real/_ + PaintCorrectionTexture real/_ + PaintCorrectionTint real/_ + PaintCorrectionToningHue real/_ + PaintCorrectionToningSaturation real/_ + PaintCorrectionWhites2012 real/_ + PaintCorrectionWhat string/_ + ParametricDarks integer/ + ParametricHighlights integer/ + ParametricHighlightSplit integer/ + ParametricLights integer/ + ParametricMidtoneSplit integer/ + ParametricShadows integer/ + ParametricShadowSplit integer/ + PerspectiveAspect integer/ + PerspectiveHorizontal integer/ + PerspectiveRotate real/ + PerspectiveScale integer/ + PerspectiveUpright integer/ + PerspectiveVertical integer/ + PerspectiveX real/ + PerspectiveY real/ + PostCropVignetteAmount integer/ + PostCropVignetteFeather integer/ + PostCropVignetteHighlightContrast integer/ + PostCropVignetteMidpoint integer/ + PostCropVignetteRoundness integer/ + PostCropVignetteStyle integer/ + PresetType string/ + ProcessVersion string/ + RangeMask RangeMask Struct + RangeMaskMapInfo MapInfo Struct_ + RangeMaskMapInfoLabMax string/_ + RangeMaskMapInfoLabMin string/_ + RangeMaskMapInfoLumEq string/_+ + RangeMaskMapInfoRGBMax string/_ + RangeMaskMapInfoRGBMin string/_ + RawFileName string/ + RedEyeInfo string/+ + RedHue integer/ + RedSaturation integer/ + RetouchAreas RetouchArea Struct+ + RetouchAreaFeather real/_ + RetouchAreaMasks CorrectionMask Struct_+ + RetouchAreaMaskAlpha real/_ + RetouchAreaMaskAngle real/_ + RetouchAreaMaskBottom real/_ + RetouchAreaMaskCenterValue real/_ + RetouchAreaMaskCenterWeight real/_ + RetouchAreaMaskRange CorrRangeMask Struct_+ + RetouchAreaMaskRangeAreaModels AreaModels Struct_+ + RetouchAreaMaskRangeAreaModelsComponents string/_+ + RetouchAreaMaskRangeAreaModelsColorSampleInfo string/_+ + RetouchAreaMaskRangeColorAmount real/_+ + RetouchAreaMaskRangeDepthFeather real/_+ + RetouchAreaMaskRangeDepthMax real/_+ + RetouchAreaMaskRangeDepthMin real/_+ + RetouchAreaMaskRangeInvert boolean/_+ + RetouchAreaMaskRangeLumFeather real/_+ + RetouchAreaMaskRangeLuminanceDepthSampleInfo string/_+ + RetouchAreaMaskRangeLumMax real/_+ + RetouchAreaMaskRangeLumMin real/_+ + RetouchAreaMaskRangeLumRange string/_+ + RetouchAreaMaskRangeSampleType integer/_+ + RetouchAreaMaskRangeType string/_+ + RetouchAreaMaskRangeVersion string/_+ + RetouchAreaMaskDabs string/_ + RetouchAreaMaskFeather real/_ + RetouchAreaMaskFlipped boolean/_ + RetouchAreaMaskFlow real/_ + RetouchAreaMaskFullX real/_ + RetouchAreaMaskFullY real/_ + RetouchAreaMaskInputDigest string/_ + RetouchAreaMaskLeft real/_ + RetouchAreaMaskMaskActive boolean/_ + RetouchAreaMaskMaskBlendMode integer/_ + RetouchAreaMaskMaskDigest string/_ + RetouchAreaMaskMaskInverted boolean/_ + RetouchAreaMaskMaskName string/_ + RetouchAreaMaskMasks CorrectionMask Struct_+ + RetouchAreaMaskMasksAlpha real/_ + RetouchAreaMaskMasksAngle real/_ + RetouchAreaMaskMasksBottom real/_ + RetouchAreaMaskMasksCenterValue real/_ + RetouchAreaMaskMasksCenterWeight real/_ + RetouchAreaMaskMasksDabs string/_+ + RetouchAreaMaskMasksFeather real/_ + RetouchAreaMaskMasksFlipped boolean/_ + RetouchAreaMaskMasksFlow real/_ + RetouchAreaMaskMasksFullX real/_ + RetouchAreaMaskMasksFullY real/_ + RetouchAreaMaskMasksInputDigest string/_ + RetouchAreaMaskMasksLeft real/_ + RetouchAreaMaskMasksMaskActive boolean/_ + RetouchAreaMaskMasksMaskBlendMode integer/_ + RetouchAreaMaskMasksMaskDigest string/_ + RetouchAreaMaskMasksMaskInverted boolean/_ + RetouchAreaMaskMasksMaskName string/_ + RetouchAreaMaskMasksMaskSubType string/_ + RetouchAreaMaskMasksMaskSyncID string/_ + RetouchAreaMaskMasksValue real/_ + RetouchAreaMaskMasksMaskVersion string/_ + RetouchAreaMaskMasksMidpoint real/_ + RetouchAreaMaskMasksOrigin string/_ + RetouchAreaMaskMasksPerimeterValue real/_ + RetouchAreaMaskMasksRadius real/_ + RetouchAreaMaskMasksReferencePoint string/_ + RetouchAreaMaskMasksRight real/_ + RetouchAreaMaskMasksRoundness real/_ + RetouchAreaMaskMasksSizeX real/_ + RetouchAreaMaskMasksSizeY real/_ + RetouchAreaMaskMasksTop real/_ + RetouchAreaMaskMaskSubType string/_ + RetouchAreaMaskMasksVersion integer/_ + RetouchAreaMaskMasksWhat string/_ + RetouchAreaMaskMasksWholeImageArea string/_ + RetouchAreaMaskMasksX real/_ + RetouchAreaMaskMasksY real/_ + RetouchAreaMaskMaskSyncID string/_ + RetouchAreaMaskMasksZeroX real/_ + RetouchAreaMaskMasksZeroY real/_ + RetouchAreaMaskValue real/_ + RetouchAreaMaskMaskVersion string/_ + RetouchAreaMaskMidpoint real/_ + RetouchAreaMaskOrigin string/_ + RetouchAreaMaskPerimeterValue real/_ + RetouchAreaMaskRadius real/_ + RetouchAreaMaskReferencePoint string/_ + RetouchAreaMaskRight real/_ + RetouchAreaMaskRoundness real/_ + RetouchAreaMaskSizeX real/_ + RetouchAreaMaskSizeY real/_ + RetouchAreaMaskTop real/_ + RetouchAreaMaskVersion integer/_ + RetouchAreaMaskWhat string/_ + RetouchAreaMaskWholeImageArea string/_ + RetouchAreaMaskX real/_ + RetouchAreaMaskY real/_ + RetouchAreaMaskZeroX real/_ + RetouchAreaMaskZeroY real/_ + RetouchAreaMethod string/_ + RetouchAreaOffsetY real/_ + RetouchAreaOpacity real/_ + RetouchAreaSeed integer/_ + RetouchAreaSourceState string/_ + RetouchAreaSourceX real/_ + RetouchAreaSpotType string/_ + RetouchInfo string/+ + Saturation integer/ + SaturationAdjustmentAqua integer/ + SaturationAdjustmentBlue integer/ + SaturationAdjustmentGreen integer/ + SaturationAdjustmentMagenta integer/ + SaturationAdjustmentOrange integer/ + SaturationAdjustmentPurple integer/ + SaturationAdjustmentRed integer/ + SaturationAdjustmentYellow integer/ + Shadows integer/ + Shadows2012 integer/ + ShadowTint integer/ + SharpenDetail integer/ + SharpenEdgeMasking integer/ + SharpenRadius real/ + Sharpness integer/ + ShortName lang-alt/ + Smoothness integer/ + SortName lang-alt/ + SplitToningBalance integer/ + SplitToningHighlightHue integer/ + SplitToningHighlightSaturation integer/ + SplitToningShadowHue integer/ + SplitToningShadowSaturation integer/ + SupportsAmount boolean/ + SupportsColor boolean/ + SupportsHighDynamicRange boolean/ + SupportsMonochrome boolean/ + SupportsNormalDynamicRange boolean/ + SupportsOutputReferred boolean/ + SupportsSceneReferred boolean/ + ColorTemperature integer/ + Texture integer/ + TIFFHandling string/ + Tint integer/ + ToggleStyleAmount integer/ + ToggleStyleDigest string/ + ToneCurve string/+ + ToneCurveBlue string/+ + ToneCurveGreen string/+ + ToneCurveName string/ + ToneCurveName2012 string/ + ToneCurvePV2012 string/+ + ToneCurvePV2012Blue string/+ + ToneCurvePV2012Green string/+ + ToneCurvePV2012Red string/+ + ToneCurveRed string/+ + ToneMapStrength real/ + UprightCenterMode integer/ + UprightCenterNormX real/ + UprightCenterNormY real/ + UprightDependentDigest string/ + UprightFocalLength35mm real/ + UprightFocalMode integer/ + UprightFourSegmentsCount integer/ + UprightPreview boolean/ + UprightTransform_0 string/ + UprightTransform_1 string/ + UprightTransform_2 string/ + UprightTransform_3 string/ + UprightTransform_4 string/ + UprightTransform_5 string/ + UprightTransformCount integer/ + UprightVersion integer/ + UUID string/ + Version string/ + Vibrance integer/ + VignetteAmount integer/ + VignetteMidpoint integer/ + What string/ + WhiteBalance string/ + Whites2012 integer/ + +=head3 XMP Correction Struct + + Field Name Writable + ---------- -------- + CorrectionActive boolean + CorrectionAmount real + CorrectionMasks CorrectionMask Struct+ + CorrectionName string + CorrRangeMask CorrRangeMask Struct + - + CorrectionSyncID string + LocalBlacks2012 real + LocalBrightness real + LocalClarity real + LocalClarity2012 real + LocalContrast real + LocalContrast2012 real + LocalDefringe real + LocalDehaze real + LocalExposure real + LocalExposure2012 real + LocalHighlights2012 real + LocalHue real + LocalLuminanceNoise real + LocalMoire real + LocalSaturation real + LocalShadows2012 real + LocalSharpness real + LocalTemperature real + LocalTexture real + LocalTint real + LocalToningHue real + LocalToningSaturation real + LocalWhites2012 real + What string + +=head3 XMP CorrectionMask Struct + + Field Name Writable + ---------- -------- + Alpha real + Angle real + Bottom real + CenterValue real + CenterWeight real + CorrRangeMask CorrRangeMask Struct + - + Dabs string+ + Feather real + Flipped boolean + Flow real + FullX real + FullY real + InputDigest string + Left real + MaskActive boolean + MaskBlendMode integer + MaskDigest string + MaskInverted boolean + MaskName string + MaskSubType string + MaskSyncID string + MaskValue real + MaskVersion string + Masks CorrectionMask Struct + Midpoint real + Origin string + PerimeterValue real + Radius real + ReferencePoint string + Right real + Roundness real + SizeX real + SizeY real + Top real + Version integer + What string + WholeImageArea string + X real + Y real + ZeroX real + ZeroY real + +=head3 XMP CorrRangeMask Struct + +Called CorrectionRangeMask by the spec. + + Field Name Writable + ---------- -------- + AreaModels AreaModels Struct+ + ColorAmount real + DepthFeather real + DepthMax real + DepthMin real + Invert boolean + LumFeather real + LumMax real + LumMin real + LumRange string + LuminanceDepthSampleInfo string + SampleType integer + Type string + Version string + +=head3 XMP AreaModels Struct + + Field Name Writable + ---------- -------- + AreaComponents string+ + ColorRangeMaskAreaSampleInfo string + +=head3 XMP Look Struct + + Field Name Writable + ---------- -------- + Amount string + Cluster string + Copyright string + Group lang-alt + Name string + Parameters LookParms Struct + SupportsAmount string + SupportsMonochrome string + SupportsOutputReferred string + UUID string + +=head3 XMP LookParms Struct + + Field Name Writable + ---------- -------- + CameraProfile string + Clarity2012 string + ConvertToGrayscale string + LookTable string + ProcessVersion string + ToneCurvePV2012 string+ + ToneCurvePV2012Blue string+ + ToneCurvePV2012Green string+ + ToneCurvePV2012Red string+ + Version string + +=head3 XMP RangeMask Struct + +This structure is actually called RangeMaskMapInfo, but it only contains one +element which is a RangeMaskMapInfo structure (Yes, really!). So these are +renamed to RangeMask and MapInfo respectively to avoid confusion and +redundancy in the tag names. + + Field Name Writable + ---------- -------- + RangeMaskMapInfo MapInfo Struct + +=head3 XMP MapInfo Struct + +Called RangeMaskMapInfo by the specification, the same as the containing +structure. + + Field Name Writable + ---------- -------- + LabMax string + LabMin string + LumEq string+ + RGBMax string + RGBMin string + +=head3 XMP RetouchArea Struct + + Field Name Writable + ---------- -------- + Feather real + Masks CorrectionMask Struct+ + Method string + OffsetY real + Opacity real + Seed integer + SourceState string + SourceX real + SpotType string + +=head3 XMP creatorAtom Tags + +Adobe creatorAtom tags, written by After Effects. + +These tags belong to the ExifTool XMP-creatorAtom family 1 group. + + Tag Name Writable + -------- -------- + AeProjectLink AEProjectLink Struct + AeProjectLinkCompositionID string_ + AeProjectLinkFullPath string_ + AeProjectLinkRenderOutputModuleIndex string_ + AeProjectLinkRenderQueueItemID string_ + AeProjectLinkRenderTimeStamp integer_ + MacAtom MacAtom Struct + MacAtomApplicationCode string_ + MacAtomInvocationAppleEvent string_ + MacAtomPosixProjectPath string_ + WindowsAtom WindowsAtom Struct + WindowsAtomExtension string_ + WindowsAtomInvocationFlags string_ + WindowsAtomUncProjectPath string_ + +=head3 XMP AEProjectLink Struct + + Field Name Writable + ---------- -------- + CompositionID string + FullPath string + RenderOutputModuleIndex string + RenderQueueItemID string + RenderTimeStamp integer + +=head3 XMP MacAtom Struct + + Field Name Writable + ---------- -------- + ApplicationCode string + InvocationAppleEvent string + PosixProjectPath string + +=head3 XMP WindowsAtom Struct + + Field Name Writable + ---------- -------- + Extension string + InvocationFlags string + UncProjectPath string + +=head3 XMP crs Tags + +Photoshop Camera Raw namespace tags. It is a shame that Adobe pollutes the +metadata space with these incredibly bulky image editing parameters. + +These tags belong to the ExifTool XMP-crs family 1 group. + + Tag Name Writable + -------- -------- + AlreadyApplied boolean + AutoBrightness boolean + AutoContrast boolean + AutoExposure boolean + AutoLateralCA integer + AutoShadows boolean + AutoTone boolean + AutoToneDigest string + AutoToneDigestNoSat string + AutoWhiteVersion integer + Blacks2012 integer + BlueHue integer + BlueSaturation integer + Brightness integer + CameraModelRestriction string + CameraProfile string + CameraProfileDigest string + ChromaticAberrationB integer + ChromaticAberrationR integer + CircularGradientBasedCorrections Correction Struct+ + CircGradBasedCorrActive boolean_ + CircGradBasedCorrAmount real_ + CircGradBasedCorrMasks CorrectionMask Struct_+ + CircGradBasedCorrMaskAlpha real_ + CircGradBasedCorrMaskAngle real_ + CircGradBasedCorrMaskBottom real_ + CircGradBasedCorrMaskCenterValue real_ + CircGradBasedCorrMaskCenterWeight real_ + CircGradBasedCorrMaskRange CorrRangeMask Struct_+ + CircGradBasedCorrMaskRangeAreaModels AreaModels Struct_+ + CircGradBasedCorrMaskRangeAreaModelsComponents string_+ + CircGradBasedCorrMaskRangeAreaModelsColorSampleInfo string_+ + CircGradBasedCorrMaskRangeColorAmount real_+ + CircGradBasedCorrMaskRangeDepthFeather real_+ + CircGradBasedCorrMaskRangeDepthMax real_+ + CircGradBasedCorrMaskRangeDepthMin real_+ + CircGradBasedCorrMaskRangeInvert boolean_+ + CircGradBasedCorrMaskRangeLumFeather real_+ + CircGradBasedCorrMaskRangeLuminanceDepthSampleInfo string_+ + CircGradBasedCorrMaskRangeLumMax real_+ + CircGradBasedCorrMaskRangeLumMin real_+ + CircGradBasedCorrMaskRangeLumRange string_+ + CircGradBasedCorrMaskRangeSampleType integer_+ + CircGradBasedCorrMaskRangeType string_+ + CircGradBasedCorrMaskRangeVersion string_+ + CircGradBasedCorrMaskDabs string_ + CircGradBasedCorrMaskFeather real_ + CircGradBasedCorrMaskFlipped boolean_ + CircGradBasedCorrMaskFlow real_ + CircGradBasedCorrMaskFullX real_ + CircGradBasedCorrMaskFullY real_ + CircGradBasedCorrMaskInputDigest string_ + CircGradBasedCorrMaskLeft real_ + CircGradBasedCorrMaskMaskActive boolean_ + CircGradBasedCorrMaskMaskBlendMode integer_ + CircGradBasedCorrMaskMaskDigest string_ + CircGradBasedCorrMaskMaskInverted boolean_ + CircGradBasedCorrMaskMaskName string_ + CircGradBasedCorrMaskMasks CorrectionMask Struct_+ + CircGradBasedCorrMaskMasksAlpha real_ + CircGradBasedCorrMaskMasksAngle real_ + CircGradBasedCorrMaskMasksBottom real_ + CircGradBasedCorrMaskMasksCenterValue real_ + CircGradBasedCorrMaskMasksCenterWeight real_ + CircGradBasedCorrMaskMasksDabs string_+ + CircGradBasedCorrMaskMasksFeather real_ + CircGradBasedCorrMaskMasksFlipped boolean_ + CircGradBasedCorrMaskMasksFlow real_ + CircGradBasedCorrMaskMasksFullX real_ + CircGradBasedCorrMaskMasksFullY real_ + CircGradBasedCorrMaskMasksInputDigest string_ + CircGradBasedCorrMaskMasksLeft real_ + CircGradBasedCorrMaskMasksMaskActive boolean_ + CircGradBasedCorrMaskMasksMaskBlendMode integer_ + CircGradBasedCorrMaskMasksMaskDigest string_ + CircGradBasedCorrMaskMasksMaskInverted boolean_ + CircGradBasedCorrMaskMasksMaskName string_ + CircGradBasedCorrMaskMasksMaskSubType string_ + CircGradBasedCorrMaskMasksMaskSyncID string_ + CircGradBasedCorrMaskMasksValue real_ + CircGradBasedCorrMaskMasksMaskVersion string_ + CircGradBasedCorrMaskMasksMidpoint real_ + CircGradBasedCorrMaskMasksOrigin string_ + CircGradBasedCorrMaskMasksPerimeterValue real_ + CircGradBasedCorrMaskMasksRadius real_ + CircGradBasedCorrMaskMasksReferencePoint string_ + CircGradBasedCorrMaskMasksRight real_ + CircGradBasedCorrMaskMasksRoundness real_ + CircGradBasedCorrMaskMasksSizeX real_ + CircGradBasedCorrMaskMasksSizeY real_ + CircGradBasedCorrMaskMasksTop real_ + CircGradBasedCorrMaskMaskSubType string_ + CircGradBasedCorrMaskMasksVersion integer_ + CircGradBasedCorrMaskMasksWhat string_ + CircGradBasedCorrMaskMasksWholeImageArea string_ + CircGradBasedCorrMaskMasksX real_ + CircGradBasedCorrMaskMasksY real_ + CircGradBasedCorrMaskMaskSyncID string_ + CircGradBasedCorrMaskMasksZeroX real_ + CircGradBasedCorrMaskMasksZeroY real_ + CircGradBasedCorrMaskValue real_ + CircGradBasedCorrMaskMaskVersion string_ + CircGradBasedCorrMaskMidpoint real_ + CircGradBasedCorrMaskOrigin string_ + CircGradBasedCorrMaskPerimeterValue real_ + CircGradBasedCorrMaskRadius real_ + CircGradBasedCorrMaskReferencePoint string_ + CircGradBasedCorrMaskRight real_ + CircGradBasedCorrMaskRoundness real_ + CircGradBasedCorrMaskSizeX real_ + CircGradBasedCorrMaskSizeY real_ + CircGradBasedCorrMaskTop real_ + CircGradBasedCorrMaskVersion integer_ + CircGradBasedCorrMaskWhat string_ + CircGradBasedCorrMaskWholeImageArea string_ + CircGradBasedCorrMaskX real_ + CircGradBasedCorrMaskY real_ + CircGradBasedCorrMaskZeroX real_ + CircGradBasedCorrMaskZeroY real_ + CircGradBasedCorrCorrectionName string_+ + CircGradBasedCorrRangeMask CorrRangeMask Struct_+ + CircGradBasedCorrRangeMaskAreaModels AreaModels Struct_+ + CircGradBasedCorrRangeMaskAreaModelsComponents string_+ + CircGradBasedCorrRangeMaskAreaModelsColorSampleInfo string_+ + CircGradBasedCorrRangeMaskColorAmount real_+ + CircGradBasedCorrRangeMaskDepthFeather real_+ + CircGradBasedCorrRangeMaskDepthMax real_+ + CircGradBasedCorrRangeMaskDepthMin real_+ + CircGradBasedCorrRangeMaskInvert boolean_+ + CircGradBasedCorrRangeMaskLumFeather real_+ + CircGradBasedCorrRangeMaskLuminanceDepthSampleInfo string_+ + CircGradBasedCorrRangeMaskLumMax real_+ + CircGradBasedCorrRangeMaskLumMin real_+ + CircGradBasedCorrRangeMaskLumRange string_+ + CircGradBasedCorrRangeMaskSampleType integer_+ + CircGradBasedCorrRangeMaskType string_+ + CircGradBasedCorrRangeMaskVersion string_+ + CircGradBasedCorrCorrectionSyncID string_+ + CircGradBasedCorrBlacks2012 real_ + CircGradBasedCorrBrightness real_ + CircGradBasedCorrClarity real_ + CircGradBasedCorrClarity2012 real_ + CircGradBasedCorrContrast real_ + CircGradBasedCorrContrast2012 real_ + CircGradBasedCorrDefringe real_ + CircGradBasedCorrDehaze real_ + CircGradBasedCorrExposure real_ + CircGradBasedCorrExposure2012 real_ + CircGradBasedCorrHighlights2012 real_ + CircGradBasedCorrHue real_ + CircGradBasedCorrLuminanceNoise real_ + CircGradBasedCorrMoire real_ + CircGradBasedCorrSaturation real_ + CircGradBasedCorrShadows2012 real_ + CircGradBasedCorrSharpness real_ + CircGradBasedCorrTemperature real_ + CircGradBasedCorrTexture real_ + CircGradBasedCorrTint real_ + CircGradBasedCorrToningHue real_ + CircGradBasedCorrToningSaturation real_ + CircGradBasedCorrWhites2012 real_ + CircGradBasedCorrWhat string_ + Clarity integer + Clarity2012 integer + ClipboardAspectRatio integer + ClipboardOrientation integer + Cluster string + ColorGradeBlending integer + ColorGradeGlobalHue integer + ColorGradeGlobalLum integer + ColorGradeGlobalSat integer + ColorGradeHighlightLum integer + ColorGradeMidtoneHue integer + ColorGradeMidtoneLum integer + ColorGradeMidtoneSat integer + ColorGradeShadowLum integer + ColorNoiseReduction integer + ColorNoiseReductionDetail integer + ColorNoiseReductionSmoothness integer + CompatibleVersion string + ContactInfo string + Contrast integer/ + Contrast2012 integer + Converter string + ConvertToGrayscale boolean + Copyright string/ + CropAngle real + CropBottom real + CropConstrainToWarp integer + CropHeight real + CropLeft real + CropRight real + CropTop real + CropUnit integer + CropUnits integer + CropWidth real + DefaultAutoGray boolean + DefaultAutoTone boolean + DefaultsSpecificToISO boolean + DefaultsSpecificToSerial boolean + Defringe integer + DefringeGreenAmount integer + DefringeGreenHueHi integer + DefringeGreenHueLo integer + DefringePurpleAmount integer + DefringePurpleHueHi integer + DefringePurpleHueLo integer + Dehaze real + Description lang-alt/ + DNGIgnoreSidecars boolean + Exposure real + Exposure2012 real + FillLight integer + GradientBasedCorrections Correction Struct+ + GradientBasedCorrActive boolean_ + GradientBasedCorrAmount real_ + GradientBasedCorrMasks CorrectionMask Struct_+ + GradientBasedCorrMaskAlpha real_ + GradientBasedCorrMaskAngle real_ + GradientBasedCorrMaskBottom real_ + GradientBasedCorrMaskCenterValue real_ + GradientBasedCorrMaskCenterWeight real_ + GradientBasedCorrMaskRange CorrRangeMask Struct_+ + GradientBasedCorrMaskRangeAreaModels AreaModels Struct_+ + GradientBasedCorrMaskRangeAreaModelsComponents string_+ + GradientBasedCorrMaskRangeAreaModelsColorSampleInfo string_+ + GradientBasedCorrMaskRangeColorAmount real_+ + GradientBasedCorrMaskRangeDepthFeather real_+ + GradientBasedCorrMaskRangeDepthMax real_+ + GradientBasedCorrMaskRangeDepthMin real_+ + GradientBasedCorrMaskRangeInvert boolean_+ + GradientBasedCorrMaskRangeLumFeather real_+ + GradientBasedCorrMaskRangeLuminanceDepthSampleInfo string_+ + GradientBasedCorrMaskRangeLumMax real_+ + GradientBasedCorrMaskRangeLumMin real_+ + GradientBasedCorrMaskRangeLumRange string_+ + GradientBasedCorrMaskRangeSampleType integer_+ + GradientBasedCorrMaskRangeType string_+ + GradientBasedCorrMaskRangeVersion string_+ + GradientBasedCorrMaskDabs string_ + GradientBasedCorrMaskFeather real_ + GradientBasedCorrMaskFlipped boolean_ + GradientBasedCorrMaskFlow real_ + GradientBasedCorrMaskFullX real_ + GradientBasedCorrMaskFullY real_ + GradientBasedCorrMaskInputDigest string_ + GradientBasedCorrMaskLeft real_ + GradientBasedCorrMaskMaskActive boolean_ + GradientBasedCorrMaskMaskBlendMode integer_ + GradientBasedCorrMaskMaskDigest string_ + GradientBasedCorrMaskMaskInverted boolean_ + GradientBasedCorrMaskMaskName string_ + GradientBasedCorrMaskMasks CorrectionMask Struct_+ + GradientBasedCorrMaskMasksAlpha real_ + GradientBasedCorrMaskMasksAngle real_ + GradientBasedCorrMaskMasksBottom real_ + GradientBasedCorrMaskMasksCenterValue real_ + GradientBasedCorrMaskMasksCenterWeight real_ + GradientBasedCorrMaskMasksDabs string_+ + GradientBasedCorrMaskMasksFeather real_ + GradientBasedCorrMaskMasksFlipped boolean_ + GradientBasedCorrMaskMasksFlow real_ + GradientBasedCorrMaskMasksFullX real_ + GradientBasedCorrMaskMasksFullY real_ + GradientBasedCorrMaskMasksInputDigest string_ + GradientBasedCorrMaskMasksLeft real_ + GradientBasedCorrMaskMasksMaskActive boolean_ + GradientBasedCorrMaskMasksMaskBlendMode integer_ + GradientBasedCorrMaskMasksMaskDigest string_ + GradientBasedCorrMaskMasksMaskInverted boolean_ + GradientBasedCorrMaskMasksMaskName string_ + GradientBasedCorrMaskMasksMaskSubType string_ + GradientBasedCorrMaskMasksMaskSyncID string_ + GradientBasedCorrMaskMasksValue real_ + GradientBasedCorrMaskMasksMaskVersion string_ + GradientBasedCorrMaskMasksMidpoint real_ + GradientBasedCorrMaskMasksOrigin string_ + GradientBasedCorrMaskMasksPerimeterValue real_ + GradientBasedCorrMaskMasksRadius real_ + GradientBasedCorrMaskMasksReferencePoint string_ + GradientBasedCorrMaskMasksRight real_ + GradientBasedCorrMaskMasksRoundness real_ + GradientBasedCorrMaskMasksSizeX real_ + GradientBasedCorrMaskMasksSizeY real_ + GradientBasedCorrMaskMasksTop real_ + GradientBasedCorrMaskMaskSubType string_ + GradientBasedCorrMaskMasksVersion integer_ + GradientBasedCorrMaskMasksWhat string_ + GradientBasedCorrMaskMasksWholeImageArea string_ + GradientBasedCorrMaskMasksX real_ + GradientBasedCorrMaskMasksY real_ + GradientBasedCorrMaskMaskSyncID string_ + GradientBasedCorrMaskMasksZeroX real_ + GradientBasedCorrMaskMasksZeroY real_ + GradientBasedCorrMaskValue real_ + GradientBasedCorrMaskMaskVersion string_ + GradientBasedCorrMaskMidpoint real_ + GradientBasedCorrMaskOrigin string_ + GradientBasedCorrMaskPerimeterValue real_ + GradientBasedCorrMaskRadius real_ + GradientBasedCorrMaskReferencePoint string_ + GradientBasedCorrMaskRight real_ + GradientBasedCorrMaskRoundness real_ + GradientBasedCorrMaskSizeX real_ + GradientBasedCorrMaskSizeY real_ + GradientBasedCorrMaskTop real_ + GradientBasedCorrMaskVersion integer_ + GradientBasedCorrMaskWhat string_ + GradientBasedCorrMaskWholeImageArea string_ + GradientBasedCorrMaskX real_ + GradientBasedCorrMaskY real_ + GradientBasedCorrMaskZeroX real_ + GradientBasedCorrMaskZeroY real_ + GradientBasedCorrCorrectionName string_+ + GradientBasedCorrRangeMask CorrRangeMask Struct_+ + GradientBasedCorrRangeMaskAreaModels AreaModels Struct_+ + GradientBasedCorrRangeMaskAreaModelsComponents string_+ + GradientBasedCorrRangeMaskAreaModelsColorSampleInfo string_+ + GradientBasedCorrRangeMaskColorAmount real_+ + GradientBasedCorrRangeMaskDepthFeather real_+ + GradientBasedCorrRangeMaskDepthMax real_+ + GradientBasedCorrRangeMaskDepthMin real_+ + GradientBasedCorrRangeMaskInvert boolean_+ + GradientBasedCorrRangeMaskLumFeather real_+ + GradientBasedCorrRangeMaskLuminanceDepthSampleInfo string_+ + GradientBasedCorrRangeMaskLumMax real_+ + GradientBasedCorrRangeMaskLumMin real_+ + GradientBasedCorrRangeMaskLumRange string_+ + GradientBasedCorrRangeMaskSampleType integer_+ + GradientBasedCorrRangeMaskType string_+ + GradientBasedCorrRangeMaskVersion string_+ + GradientBasedCorrCorrectionSyncID string_+ + GradientBasedCorrBlacks2012 real_ + GradientBasedCorrBrightness real_ + GradientBasedCorrClarity real_ + GradientBasedCorrClarity2012 real_ + GradientBasedCorrContrast real_ + GradientBasedCorrContrast2012 real_ + GradientBasedCorrDefringe real_ + GradientBasedCorrDehaze real_ + GradientBasedCorrExposure real_ + GradientBasedCorrExposure2012 real_ + GradientBasedCorrHighlights2012 real_ + GradientBasedCorrHue real_ + GradientBasedCorrLuminanceNoise real_ + GradientBasedCorrMoire real_ + GradientBasedCorrSaturation real_ + GradientBasedCorrShadows2012 real_ + GradientBasedCorrSharpness real_ + GradientBasedCorrTemperature real_ + GradientBasedCorrTexture real_ + GradientBasedCorrTint real_ + GradientBasedCorrToningHue real_ + GradientBasedCorrToningSaturation real_ + GradientBasedCorrWhites2012 real_ + GradientBasedCorrWhat string_ + GrainAmount integer + GrainFrequency integer + GrainSeed integer + GrainSize integer + GrayMixerAqua integer + GrayMixerBlue integer + GrayMixerGreen integer + GrayMixerMagenta integer + GrayMixerOrange integer + GrayMixerPurple integer + GrayMixerRed integer + GrayMixerYellow integer + GreenHue integer + GreenSaturation integer + Group lang-alt/ + HasCrop boolean + HasSettings boolean + Highlight2012 integer + HighlightRecovery integer + Highlights2012 integer + HueAdjustmentAqua integer + HueAdjustmentBlue integer + HueAdjustmentGreen integer + HueAdjustmentMagenta integer + HueAdjustmentOrange integer + HueAdjustmentPurple integer + HueAdjustmentRed integer + HueAdjustmentYellow integer + IncrementalTemperature integer + IncrementalTint integer + JPEGHandling string + LensManualDistortionAmount integer + LensProfileChromaticAberrationScale integer + LensProfileDigest string + LensProfileDistortionScale integer + LensProfileEnable integer + LensProfileFilename string + LensProfileIsEmbedded boolean + LensProfileMatchKeyCameraModelName string + LensProfileMatchKeyExifMake string + LensProfileMatchKeyExifModel string + LensProfileMatchKeyIsRaw boolean + LensProfileMatchKeyLensID string + LensProfileMatchKeyLensInfo string + LensProfileMatchKeyLensName string + LensProfileMatchKeySensorFormatFactor real + LensProfileName string + LensProfileSetup string + LensProfileVignettingScale integer + Look Look Struct + LookAmount string_ + LookCluster string_ + LookCopyright string_ + LookGroup lang-alt_ + LookName string + LookParameters LookParms Struct_ + LookParametersCameraProfile string_ + LookParametersClarity2012 string_ + LookParametersConvertToGrayscale string_ + LookParametersLookTable string_ + LookParametersProcessVersion string_ + LookParametersToneCurvePV2012 string_+ + LookParametersToneCurvePV2012Blue string_+ + LookParametersToneCurvePV2012Green string_+ + LookParametersToneCurvePV2012Red string_+ + LookParametersVersion string_ + LookSupportsAmount string_ + LookSupportsMonochrome string_ + LookSupportsOutputReferred string_ + LookUUID string_ + LuminanceAdjustmentAqua integer + LuminanceAdjustmentBlue integer + LuminanceAdjustmentGreen integer + LuminanceAdjustmentMagenta integer + LuminanceAdjustmentOrange integer + LuminanceAdjustmentPurple integer + LuminanceAdjustmentRed integer + LuminanceAdjustmentYellow integer + LuminanceNoiseReductionContrast integer + LuminanceNoiseReductionDetail integer + LuminanceSmoothing integer + MaskGroupBasedCorrections Correction Struct+ + MaskGroupBasedCorrActive boolean_ + MaskGroupBasedCorrAmount real_ + MaskGroupBasedCorrMask CorrectionMask Struct_+ + MaskGroupBasedCorrMaskAlpha real_ + MaskGroupBasedCorrMaskAngle real_ + MaskGroupBasedCorrMaskBottom real_ + MaskGroupBasedCorrMaskCenterValue real_ + MaskGroupBasedCorrMaskCenterWeight real_ + MaskGroupBasedCorrMaskRange CorrRangeMask Struct_+ + MaskGroupBasedCorrMaskRangeAreaModels AreaModels Struct_+ + MaskGroupBasedCorrMaskRangeAreaModelsComponents string_+ + MaskGroupBasedCorrMaskRangeAreaModelsColorSampleInfo string_+ + MaskGroupBasedCorrMaskRangeColorAmount real_+ + MaskGroupBasedCorrMaskRangeDepthFeather real_+ + MaskGroupBasedCorrMaskRangeDepthMax real_+ + MaskGroupBasedCorrMaskRangeDepthMin real_+ + MaskGroupBasedCorrMaskRangeInvert boolean_+ + MaskGroupBasedCorrMaskRangeLumFeather real_+ + MaskGroupBasedCorrMaskRangeLuminanceDepthSampleInfo string_+ + MaskGroupBasedCorrMaskRangeLumMax real_+ + MaskGroupBasedCorrMaskRangeLumMin real_+ + MaskGroupBasedCorrMaskRangeLumRange string_+ + MaskGroupBasedCorrMaskRangeSampleType integer_+ + MaskGroupBasedCorrMaskRangeType string_+ + MaskGroupBasedCorrMaskRangeVersion string_+ + MaskGroupBasedCorrMaskDabs string_+ + MaskGroupBasedCorrMaskFeather real_ + MaskGroupBasedCorrMaskFlipped boolean_ + MaskGroupBasedCorrMaskFlow real_ + MaskGroupBasedCorrMaskFullX real_ + MaskGroupBasedCorrMaskFullY real_ + MaskGroupBasedCorrMaskInputDigest string_ + MaskGroupBasedCorrMaskLeft real_ + MaskGroupBasedCorrMaskMaskActive boolean_ + MaskGroupBasedCorrMaskMaskBlendMode integer_ + MaskGroupBasedCorrMaskMaskDigest string_ + MaskGroupBasedCorrMaskMaskInverted boolean_ + MaskGroupBasedCorrMaskMaskName string_ + MaskGroupBasedCorrMaskMasks CorrectionMask Struct_+ + MaskGroupBasedCorrMaskMasksAlpha real_ + MaskGroupBasedCorrMaskMasksAngle real_ + MaskGroupBasedCorrMaskMasksBottom real_ + MaskGroupBasedCorrMaskMasksCenterValue real_ + MaskGroupBasedCorrMaskMasksCenterWeight real_ + MaskGroupBasedCorrMaskMasksDabs string_+ + MaskGroupBasedCorrMaskMasksFeather real_ + MaskGroupBasedCorrMaskMasksFlipped boolean_ + MaskGroupBasedCorrMaskMasksFlow real_ + MaskGroupBasedCorrMaskMasksFullX real_ + MaskGroupBasedCorrMaskMasksFullY real_ + MaskGroupBasedCorrMaskMasksInputDigest string_ + MaskGroupBasedCorrMaskMasksLeft real_ + MaskGroupBasedCorrMaskMasksMaskActive boolean_ + MaskGroupBasedCorrMaskMasksMaskBlendMode integer_ + MaskGroupBasedCorrMaskMasksMaskDigest string_ + MaskGroupBasedCorrMaskMasksMaskInverted boolean_ + MaskGroupBasedCorrMaskMasksMaskName string_ + MaskGroupBasedCorrMaskMasksMaskSubType string_ + MaskGroupBasedCorrMaskMasksMaskSyncID string_ + MaskGroupBasedCorrMaskMasksValue real_ + MaskGroupBasedCorrMaskMasksMaskVersion string_ + MaskGroupBasedCorrMaskMasksMidpoint real_ + MaskGroupBasedCorrMaskMasksOrigin string_ + MaskGroupBasedCorrMaskMasksPerimeterValue real_ + MaskGroupBasedCorrMaskMasksRadius real_ + MaskGroupBasedCorrMaskMasksReferencePoint string_ + MaskGroupBasedCorrMaskMasksRight real_ + MaskGroupBasedCorrMaskMasksRoundness real_ + MaskGroupBasedCorrMaskMasksSizeX real_ + MaskGroupBasedCorrMaskMasksSizeY real_ + MaskGroupBasedCorrMaskMasksTop real_ + MaskGroupBasedCorrMaskMaskSubType string_ + MaskGroupBasedCorrMaskMasksVersion integer_ + MaskGroupBasedCorrMaskMasksWhat string_ + MaskGroupBasedCorrMaskMasksWholeImageArea string_ + MaskGroupBasedCorrMaskMasksX real_ + MaskGroupBasedCorrMaskMasksY real_ + MaskGroupBasedCorrMaskMaskSyncID string_ + MaskGroupBasedCorrMaskMasksZeroX real_ + MaskGroupBasedCorrMaskMasksZeroY real_ + MaskGroupBasedCorrMaskValue real_ + MaskGroupBasedCorrMaskMaskVersion string_ + MaskGroupBasedCorrMaskMidpoint real_ + MaskGroupBasedCorrMaskOrigin string_ + MaskGroupBasedCorrMaskPerimeterValue real_ + MaskGroupBasedCorrMaskRadius real_ + MaskGroupBasedCorrMaskReferencePoint string_ + MaskGroupBasedCorrMaskRight real_ + MaskGroupBasedCorrMaskRoundness real_ + MaskGroupBasedCorrMaskSizeX real_ + MaskGroupBasedCorrMaskSizeY real_ + MaskGroupBasedCorrMaskTop real_ + MaskGroupBasedCorrMaskVersion integer_ + MaskGroupBasedCorrMaskWhat string_ + MaskGroupBasedCorrMaskWholeImageArea string_ + MaskGroupBasedCorrMaskX real_ + MaskGroupBasedCorrMaskY real_ + MaskGroupBasedCorrMaskZeroX real_ + MaskGroupBasedCorrMaskZeroY real_ + MaskGroupBasedCorrCorrectionName string_+ + MaskGroupBasedCorrRangeMask CorrRangeMask Struct_+ + MaskGroupBasedCorrRangeMaskAreaModels AreaModels Struct_+ + MaskGroupBasedCorrRangeMaskAreaModelsComponents string_+ + MaskGroupBasedCorrRangeMaskAreaModelsColorSampleInfo string_+ + MaskGroupBasedCorrRangeMaskColorAmount real_+ + MaskGroupBasedCorrRangeMaskDepthFeather real_+ + MaskGroupBasedCorrRangeMaskDepthMax real_+ + MaskGroupBasedCorrRangeMaskDepthMin real_+ + MaskGroupBasedCorrRangeMaskInvert boolean_+ + MaskGroupBasedCorrRangeMaskLumFeather real_+ + MaskGroupBasedCorrRangeMaskLuminanceDepthSampleInfo string_+ + MaskGroupBasedCorrRangeMaskLumMax real_+ + MaskGroupBasedCorrRangeMaskLumMin real_+ + MaskGroupBasedCorrRangeMaskLumRange string_+ + MaskGroupBasedCorrRangeMaskSampleType integer_+ + MaskGroupBasedCorrRangeMaskType string_+ + MaskGroupBasedCorrRangeMaskVersion string_+ + MaskGroupBasedCorrCorrectionSyncID string_+ + MaskGroupBasedCorrBlacks2012 real_ + MaskGroupBasedCorrBrightness real_ + MaskGroupBasedCorrClarity real_ + MaskGroupBasedCorrClarity2012 real_ + MaskGroupBasedCorrContrast real_ + MaskGroupBasedCorrContrast2012 real_ + MaskGroupBasedCorrDefringe real_ + MaskGroupBasedCorrDehaze real_ + MaskGroupBasedCorrExposure real_ + MaskGroupBasedCorrExposure2012 real_ + MaskGroupBasedCorrHighlights2012 real_ + MaskGroupBasedCorrHue real_ + MaskGroupBasedCorrLuminanceNoise real_ + MaskGroupBasedCorrMoire real_ + MaskGroupBasedCorrSaturation real_ + MaskGroupBasedCorrShadows2012 real_ + MaskGroupBasedCorrSharpness real_ + MaskGroupBasedCorrTemperature real_ + MaskGroupBasedCorrTexture real_ + MaskGroupBasedCorrTint real_ + MaskGroupBasedCorrToningHue real_ + MaskGroupBasedCorrToningSaturation real_ + MaskGroupBasedCorrWhites2012 real_ + MaskGroupBasedCorrWhat string_ + MoireFilter string + Name lang-alt/ + NegativeCacheLargePreviewSize integer + NegativeCacheMaximumSize real + NegativeCachePath string + OverrideLookVignette boolean + PaintBasedCorrections Correction Struct+ + PaintCorrectionActive boolean_ + PaintCorrectionAmount real_ + PaintBasedCorrectionMasks CorrectionMask Struct_+ + PaintCorrectionMaskAlpha real_ + PaintCorrectionMaskAngle real_ + PaintCorrectionMaskBottom real_ + PaintCorrectionMaskCenterValue real_ + PaintCorrectionMaskCenterWeight real_ + PaintCorrectionMaskRange CorrRangeMask Struct_+ + PaintCorrectionMaskRangeAreaModels AreaModels Struct_+ + PaintCorrectionMaskRangeAreaModelsComponents string_+ + PaintCorrectionMaskRangeAreaModelsColorSampleInfo string_+ + PaintCorrectionMaskRangeColorAmount real_+ + PaintCorrectionMaskRangeDepthFeather real_+ + PaintCorrectionMaskRangeDepthMax real_+ + PaintCorrectionMaskRangeDepthMin real_+ + PaintCorrectionMaskRangeInvert boolean_+ + PaintCorrectionMaskRangeLumFeather real_+ + PaintCorrectionMaskRangeLuminanceDepthSampleInfo string_+ + PaintCorrectionMaskRangeLumMax real_+ + PaintCorrectionMaskRangeLumMin real_+ + PaintCorrectionMaskRangeLumRange string_+ + PaintCorrectionMaskRangeSampleType integer_+ + PaintCorrectionMaskRangeType string_+ + PaintCorrectionMaskRangeVersion string_+ + PaintCorrectionMaskDabs string_ + PaintCorrectionMaskFeather real_ + PaintCorrectionMaskFlipped boolean_ + PaintCorrectionMaskFlow real_ + PaintCorrectionMaskFullX real_ + PaintCorrectionMaskFullY real_ + PaintCorrectionMaskInputDigest string_ + PaintCorrectionMaskLeft real_ + PaintCorrectionMaskMaskActive boolean_ + PaintCorrectionMaskMaskBlendMode integer_ + PaintCorrectionMaskMaskDigest string_ + PaintCorrectionMaskMaskInverted boolean_ + PaintCorrectionMaskMaskName string_ + PaintCorrectionMaskMasks CorrectionMask Struct_+ + PaintCorrectionMaskMasksAlpha real_ + PaintCorrectionMaskMasksAngle real_ + PaintCorrectionMaskMasksBottom real_ + PaintCorrectionMaskMasksCenterValue real_ + PaintCorrectionMaskMasksCenterWeight real_ + PaintCorrectionMaskMasksDabs string_+ + PaintCorrectionMaskMasksFeather real_ + PaintCorrectionMaskMasksFlipped boolean_ + PaintCorrectionMaskMasksFlow real_ + PaintCorrectionMaskMasksFullX real_ + PaintCorrectionMaskMasksFullY real_ + PaintCorrectionMaskMasksInputDigest string_ + PaintCorrectionMaskMasksLeft real_ + PaintCorrectionMaskMasksMaskActive boolean_ + PaintCorrectionMaskMasksMaskBlendMode integer_ + PaintCorrectionMaskMasksMaskDigest string_ + PaintCorrectionMaskMasksMaskInverted boolean_ + PaintCorrectionMaskMasksMaskName string_ + PaintCorrectionMaskMasksMaskSubType string_ + PaintCorrectionMaskMasksMaskSyncID string_ + PaintCorrectionMaskMasksValue real_ + PaintCorrectionMaskMasksMaskVersion string_ + PaintCorrectionMaskMasksMidpoint real_ + PaintCorrectionMaskMasksOrigin string_ + PaintCorrectionMaskMasksPerimeterValue real_ + PaintCorrectionMaskMasksRadius real_ + PaintCorrectionMaskMasksReferencePoint string_ + PaintCorrectionMaskMasksRight real_ + PaintCorrectionMaskMasksRoundness real_ + PaintCorrectionMaskMasksSizeX real_ + PaintCorrectionMaskMasksSizeY real_ + PaintCorrectionMaskMasksTop real_ + PaintCorrectionMaskMaskSubType string_ + PaintCorrectionMaskMasksVersion integer_ + PaintCorrectionMaskMasksWhat string_ + PaintCorrectionMaskMasksWholeImageArea string_ + PaintCorrectionMaskMasksX real_ + PaintCorrectionMaskMasksY real_ + PaintCorrectionMaskMaskSyncID string_ + PaintCorrectionMaskMasksZeroX real_ + PaintCorrectionMaskMasksZeroY real_ + PaintCorrectionMaskValue real_ + PaintCorrectionMaskMaskVersion string_ + PaintCorrectionMaskMidpoint real_ + PaintCorrectionMaskOrigin string_ + PaintCorrectionMaskPerimeterValue real_ + PaintCorrectionMaskRadius real_ + PaintCorrectionMaskReferencePoint string_ + PaintCorrectionMaskRight real_ + PaintCorrectionMaskRoundness real_ + PaintCorrectionMaskSizeX real_ + PaintCorrectionMaskSizeY real_ + PaintCorrectionMaskTop real_ + PaintCorrectionMaskVersion integer_ + PaintCorrectionMaskWhat string_ + PaintCorrectionMaskWholeImageArea string_ + PaintCorrectionMaskX real_ + PaintCorrectionMaskY real_ + PaintCorrectionMaskZeroX real_ + PaintCorrectionMaskZeroY real_ + PaintCorrectionCorrectionName string_+ + PaintCorrectionRangeMask CorrRangeMask Struct_+ + PaintCorrectionRangeMaskAreaModels AreaModels Struct_+ + PaintCorrectionRangeMaskAreaModelsComponents string_+ + PaintCorrectionRangeMaskAreaModelsColorSampleInfo string_+ + PaintCorrectionRangeMaskColorAmount real_+ + PaintCorrectionRangeMaskDepthFeather real_+ + PaintCorrectionRangeMaskDepthMax real_+ + PaintCorrectionRangeMaskDepthMin real_+ + PaintCorrectionRangeMaskInvert boolean_+ + PaintCorrectionRangeMaskLumFeather real_+ + PaintCorrectionRangeMaskLuminanceDepthSampleInfo string_+ + PaintCorrectionRangeMaskLumMax real_+ + PaintCorrectionRangeMaskLumMin real_+ + PaintCorrectionRangeMaskLumRange string_+ + PaintCorrectionRangeMaskSampleType integer_+ + PaintCorrectionRangeMaskType string_+ + PaintCorrectionRangeMaskVersion string_+ + PaintCorrectionCorrectionSyncID string_+ + PaintCorrectionBlacks2012 real_ + PaintCorrectionBrightness real_ + PaintCorrectionClarity real_ + PaintCorrectionClarity2012 real_ + PaintCorrectionContrast real_ + PaintCorrectionContrast2012 real_ + PaintCorrectionDefringe real_ + PaintCorrectionDehaze real_ + PaintCorrectionExposure real_ + PaintCorrectionExposure2012 real_ + PaintCorrectionHighlights2012 real_ + PaintCorrectionHue real_ + PaintCorrectionLuminanceNoise real_ + PaintCorrectionMoire real_ + PaintCorrectionSaturation real_ + PaintCorrectionShadows2012 real_ + PaintCorrectionSharpness real_ + PaintCorrectionTemperature real_ + PaintCorrectionTexture real_ + PaintCorrectionTint real_ + PaintCorrectionToningHue real_ + PaintCorrectionToningSaturation real_ + PaintCorrectionWhites2012 real_ + PaintCorrectionWhat string_ + ParametricDarks integer + ParametricHighlights integer + ParametricHighlightSplit integer + ParametricLights integer + ParametricMidtoneSplit integer + ParametricShadows integer + ParametricShadowSplit integer + PerspectiveAspect integer + PerspectiveHorizontal integer + PerspectiveRotate real + PerspectiveScale integer + PerspectiveUpright integer + PerspectiveVertical integer + PerspectiveX real + PerspectiveY real + PostCropVignetteAmount integer + PostCropVignetteFeather integer + PostCropVignetteHighlightContrast integer + PostCropVignetteMidpoint integer + PostCropVignetteRoundness integer + PostCropVignetteStyle integer + PresetType string + ProcessVersion string + RangeMask RangeMask Struct + RangeMaskMapInfo MapInfo Struct_ + RangeMaskMapInfoLabMax string_ + RangeMaskMapInfoLabMin string_ + RangeMaskMapInfoLumEq string_+ + RangeMaskMapInfoRGBMax string_ + RangeMaskMapInfoRGBMin string_ + RawFileName string + RedEyeInfo string+ + RedHue integer + RedSaturation integer + RetouchAreas RetouchArea Struct+ + RetouchAreaFeather real_ + RetouchAreaMasks CorrectionMask Struct_+ + RetouchAreaMaskAlpha real_ + RetouchAreaMaskAngle real_ + RetouchAreaMaskBottom real_ + RetouchAreaMaskCenterValue real_ + RetouchAreaMaskCenterWeight real_ + RetouchAreaMaskRange CorrRangeMask Struct_+ + RetouchAreaMaskRangeAreaModels AreaModels Struct_+ + RetouchAreaMaskRangeAreaModelsComponents string_+ + RetouchAreaMaskRangeAreaModelsColorSampleInfo string_+ + RetouchAreaMaskRangeColorAmount real_+ + RetouchAreaMaskRangeDepthFeather real_+ + RetouchAreaMaskRangeDepthMax real_+ + RetouchAreaMaskRangeDepthMin real_+ + RetouchAreaMaskRangeInvert boolean_+ + RetouchAreaMaskRangeLumFeather real_+ + RetouchAreaMaskRangeLuminanceDepthSampleInfo string_+ + RetouchAreaMaskRangeLumMax real_+ + RetouchAreaMaskRangeLumMin real_+ + RetouchAreaMaskRangeLumRange string_+ + RetouchAreaMaskRangeSampleType integer_+ + RetouchAreaMaskRangeType string_+ + RetouchAreaMaskRangeVersion string_+ + RetouchAreaMaskDabs string_ + RetouchAreaMaskFeather real_ + RetouchAreaMaskFlipped boolean_ + RetouchAreaMaskFlow real_ + RetouchAreaMaskFullX real_ + RetouchAreaMaskFullY real_ + RetouchAreaMaskInputDigest string_ + RetouchAreaMaskLeft real_ + RetouchAreaMaskMaskActive boolean_ + RetouchAreaMaskMaskBlendMode integer_ + RetouchAreaMaskMaskDigest string_ + RetouchAreaMaskMaskInverted boolean_ + RetouchAreaMaskMaskName string_ + RetouchAreaMaskMasks CorrectionMask Struct_+ + RetouchAreaMaskMasksAlpha real_ + RetouchAreaMaskMasksAngle real_ + RetouchAreaMaskMasksBottom real_ + RetouchAreaMaskMasksCenterValue real_ + RetouchAreaMaskMasksCenterWeight real_ + RetouchAreaMaskMasksDabs string_+ + RetouchAreaMaskMasksFeather real_ + RetouchAreaMaskMasksFlipped boolean_ + RetouchAreaMaskMasksFlow real_ + RetouchAreaMaskMasksFullX real_ + RetouchAreaMaskMasksFullY real_ + RetouchAreaMaskMasksInputDigest string_ + RetouchAreaMaskMasksLeft real_ + RetouchAreaMaskMasksMaskActive boolean_ + RetouchAreaMaskMasksMaskBlendMode integer_ + RetouchAreaMaskMasksMaskDigest string_ + RetouchAreaMaskMasksMaskInverted boolean_ + RetouchAreaMaskMasksMaskName string_ + RetouchAreaMaskMasksMaskSubType string_ + RetouchAreaMaskMasksMaskSyncID string_ + RetouchAreaMaskMasksValue real_ + RetouchAreaMaskMasksMaskVersion string_ + RetouchAreaMaskMasksMidpoint real_ + RetouchAreaMaskMasksOrigin string_ + RetouchAreaMaskMasksPerimeterValue real_ + RetouchAreaMaskMasksRadius real_ + RetouchAreaMaskMasksReferencePoint string_ + RetouchAreaMaskMasksRight real_ + RetouchAreaMaskMasksRoundness real_ + RetouchAreaMaskMasksSizeX real_ + RetouchAreaMaskMasksSizeY real_ + RetouchAreaMaskMasksTop real_ + RetouchAreaMaskMaskSubType string_ + RetouchAreaMaskMasksVersion integer_ + RetouchAreaMaskMasksWhat string_ + RetouchAreaMaskMasksWholeImageArea string_ + RetouchAreaMaskMasksX real_ + RetouchAreaMaskMasksY real_ + RetouchAreaMaskMaskSyncID string_ + RetouchAreaMaskMasksZeroX real_ + RetouchAreaMaskMasksZeroY real_ + RetouchAreaMaskValue real_ + RetouchAreaMaskMaskVersion string_ + RetouchAreaMaskMidpoint real_ + RetouchAreaMaskOrigin string_ + RetouchAreaMaskPerimeterValue real_ + RetouchAreaMaskRadius real_ + RetouchAreaMaskReferencePoint string_ + RetouchAreaMaskRight real_ + RetouchAreaMaskRoundness real_ + RetouchAreaMaskSizeX real_ + RetouchAreaMaskSizeY real_ + RetouchAreaMaskTop real_ + RetouchAreaMaskVersion integer_ + RetouchAreaMaskWhat string_ + RetouchAreaMaskWholeImageArea string_ + RetouchAreaMaskX real_ + RetouchAreaMaskY real_ + RetouchAreaMaskZeroX real_ + RetouchAreaMaskZeroY real_ + RetouchAreaMethod string_ + RetouchAreaOffsetY real_ + RetouchAreaOpacity real_ + RetouchAreaSeed integer_ + RetouchAreaSourceState string_ + RetouchAreaSourceX real_ + RetouchAreaSpotType string_ + RetouchInfo string+ + Saturation integer/ + SaturationAdjustmentAqua integer + SaturationAdjustmentBlue integer + SaturationAdjustmentGreen integer + SaturationAdjustmentMagenta integer + SaturationAdjustmentOrange integer + SaturationAdjustmentPurple integer + SaturationAdjustmentRed integer + SaturationAdjustmentYellow integer + Shadows integer + Shadows2012 integer + ShadowTint integer + SharpenDetail integer + SharpenEdgeMasking integer + SharpenRadius real + Sharpness integer/ + ShortName lang-alt + Smoothness integer + SortName lang-alt + SplitToningBalance integer + SplitToningHighlightHue integer + SplitToningHighlightSaturation integer + SplitToningShadowHue integer + SplitToningShadowSaturation integer + SupportsAmount boolean + SupportsColor boolean + SupportsHighDynamicRange boolean + SupportsMonochrome boolean + SupportsNormalDynamicRange boolean + SupportsOutputReferred boolean + SupportsSceneReferred boolean + ColorTemperature integer + Texture integer + TIFFHandling string + Tint integer + ToggleStyleAmount integer + ToggleStyleDigest string + ToneCurve string+ + ToneCurveBlue string+ + ToneCurveGreen string+ + ToneCurveName string + ToneCurveName2012 string + ToneCurvePV2012 string+ + ToneCurvePV2012Blue string+ + ToneCurvePV2012Green string+ + ToneCurvePV2012Red string+ + ToneCurveRed string+ + ToneMapStrength real + UprightCenterMode integer + UprightCenterNormX real + UprightCenterNormY real + UprightDependentDigest string + UprightFocalLength35mm real + UprightFocalMode integer + UprightFourSegmentsCount integer + UprightPreview boolean + UprightTransform_0 string + UprightTransform_1 string + UprightTransform_2 string + UprightTransform_3 string + UprightTransform_4 string + UprightTransform_5 string + UprightTransformCount integer + UprightVersion integer + UUID string/ + Version string + Vibrance integer + VignetteAmount integer + VignetteMidpoint integer + What string + WhiteBalance string/ + Whites2012 integer + +=head3 XMP dc Tags + +Dublin Core namespace tags. + +These tags belong to the ExifTool XMP-dc family 1 group. + + Tag Name Writable + -------- -------- + Contributor string+ + Coverage string + Creator string+ + Date date+ + Description lang-alt + Format string + Identifier string + Language string+ + Publisher string+ + Relation string+ + Rights lang-alt + Source string/ + Subject string+ + Title lang-alt + Type string+ + +=head3 XMP Device Tags + +Google depth-map Device tags. See +L<https://developer.android.com/training/camera2/Dynamic-depth-v1.0.pdf> for +the specification. + +These tags belong to the ExifTool XMP-Device family 1 group. + + Tag Name Writable + -------- -------- + AppInfo AppInfo Struct + AppInfoApplication string_ + AppInfoItemURI string_ + AppInfoVersion string_ + Cameras DeviceCameras Struct+ + Camera DeviceCamera Struct_+ + CameraAppInfo AppInfo Struct_+ + CameraAppInfoApplication string_+ + CameraAppInfoItemURI string_+ + CameraAppInfoVersion string_+ + CameraDepthMap DeviceDepthMap Struct_+ + CameraDepthMapConfidenceURI string_+ + CameraDepthMapDepthURI string_+ + CameraDepthMapFar real_+ + CameraDepthMapFocalTable string_+ + CameraDepthMapFocalTableEntryCount integer_+ + CameraDepthMapFormat string_+ + CameraDepthMapItemSemantic string_+ + CameraDepthMapMeasureType string_+ + CameraDepthMapNear real_+ + CameraDepthMapSoftware string_+ + CameraDepthMapUnits string_+ + CameraImage DeviceImage Struct_+ + CameraImageItemSemantic string_+ + CameraImageItemURI string_+ + CameraImagingModel DeviceImagingModel Struct_+ + CameraImagingModelDistortion string_+ + CameraImagingModelDistortionCount integer_+ + CameraImagingModelFocalLengthX real_+ + CameraImagingModelFocalLengthY real_+ + CameraImagingModelImageHeight integer_+ + CameraImagingModelImageWidth integer_+ + CameraImagingModelPixelAspectRatio real_+ + CameraImagingModelPrincipalPointX real_+ + CameraImagingModelPrincipalPointY real_+ + CameraImagingModelSkew real_+ + CameraLightEstimate DeviceLightEstimate Struct_+ + CameraLightEstimateColorCorrectionB real_+ + CameraLightEstimateColorCorrectionG real_+ + CameraLightEstimateColorCorrectionR real_+ + CameraLightEstimatePixelIntensity real_+ + CameraPointCloud DevicePointCloud Struct_+ + CameraPointCloudMetric boolean_+ + CameraPointCloudPointCloud integer_+ + CameraPointCloudPoints string_+ + CameraPose Pose Struct_+ + CameraPosePositionX real_+ + CameraPosePositionY real_+ + CameraPosePositionZ real_+ + CameraPoseRotationW real_+ + CameraPoseRotationX real_+ + CameraPoseRotationY real_+ + CameraPoseRotationZ real_+ + CameraPoseTimestamp integer_+ + CameraTrait string_+ + CameraVendorInfo VendorInfo Struct_+ + CameraVendorInfoManufacturer string_+ + CameraVendorInfoModel string_+ + CameraVendorInfoNotes string_+ + Container DeviceContainer Struct + ContainerDirectory DeviceDirectory Struct_+ + ContainerDirectoryItem DeviceItem Struct_+ + ContainerDirectoryItemDataURI string_+ + ContainerDirectoryItemLength integer_+ + ContainerDirectoryItemMime string_+ + ContainerDirectoryItemPadding integer_+ + EarthPos EarthPose Struct + EarthPosAltitude real_ + EarthPosLatitude real_ + EarthPosLongitude real_ + EarthPosRotationW real_ + EarthPosRotationX real_ + EarthPosRotationY real_ + EarthPosRotationZ real_ + EarthPosTimestamp integer_ + Planes DevicePlanes Struct+ + Plane DevicePlane Struct_+ + PlaneBoundary string_+ + PlaneBoundaryVertexCount integer_+ + PlaneExtentX real_+ + PlaneExtentZ real_+ + PlanePose Pose Struct_+ + PlanePosePositionX real_+ + PlanePosePositionY real_+ + PlanePosePositionZ real_+ + PlanePoseRotationW real_+ + PlanePoseRotationX real_+ + PlanePoseRotationY real_+ + PlanePoseRotationZ real_+ + PlanePoseTimestamp integer_+ + Pose Pose Struct + PosePositionX real_ + PosePositionY real_ + PosePositionZ real_ + PoseRotationW real_ + PoseRotationX real_ + PoseRotationY real_ + PoseRotationZ real_ + PoseTimestamp integer_ + Profiles DeviceProfiles Struct+ + Profile DeviceProfile Struct_+ + ProfileCameraIndices integer_+ + ProfileType string_+ + VendorInfo VendorInfo Struct + VendorInfoManufacturer string_ + VendorInfoModel string_ + VendorInfoNotes string_ + +=head3 XMP AppInfo Struct + + Field Name Writable + ---------- -------- + Application string + ItemURI string + Version string + +=head3 XMP DeviceCameras Struct + + Field Name Writable + ---------- -------- + Camera DeviceCamera Struct + +=head3 XMP DeviceCamera Struct + + Field Name Writable + ---------- -------- + AppInfo AppInfo Struct + DepthMap DeviceDepthMap Struct + Image DeviceImage Struct + ImagingModel DeviceImagingModel Struct + LightEstimate DeviceLightEstimate Struct + PointCloud DevicePointCloud Struct + Pose Pose Struct + Trait string + VendorInfo VendorInfo Struct + +=head3 XMP DeviceDepthMap Struct + + Field Name Writable + ---------- -------- + ConfidenceURI string + DepthURI string + Far real + FocalTable string + FocalTableEntryCount integer + Format string + ItemSemantic string + MeasureType string + Near real + Software string + Units string + +=head3 XMP DeviceImage Struct + + Field Name Writable + ---------- -------- + ItemSemantic string + ItemURI string + +=head3 XMP DeviceImagingModel Struct + + Field Name Writable + ---------- -------- + Distortion string + DistortionCount integer + FocalLengthX real + FocalLengthY real + ImageHeight integer + ImageWidth integer + PixelAspectRatio real + PrincipalPointX real + PrincipalPointY real + Skew real + +=head3 XMP DeviceLightEstimate Struct + + Field Name Writable + ---------- -------- + ColorCorrectionB real + ColorCorrectionG real + ColorCorrectionR real + PixelIntensity real + +=head3 XMP DevicePointCloud Struct + + Field Name Writable + ---------- -------- + Metric boolean + PointCloud integer + Points string + +=head3 XMP Pose Struct + + Field Name Writable + ---------- -------- + PositionX real + PositionY real + PositionZ real + RotationW real + RotationX real + RotationY real + RotationZ real + Timestamp integer + +=head3 XMP VendorInfo Struct + + Field Name Writable + ---------- -------- + Manufacturer string + Model string + Notes string + +=head3 XMP DeviceContainer Struct + + Field Name Writable + ---------- -------- + Directory DeviceDirectory Struct+ + +=head3 XMP DeviceDirectory Struct + + Field Name Writable + ---------- -------- + Item DeviceItem Struct + +=head3 XMP DeviceItem Struct + + Field Name Writable + ---------- -------- + DataURI string + Length integer + Mime string + Padding integer + +=head3 XMP EarthPose Struct + + Field Name Writable + ---------- -------- + Altitude real + Latitude real + Longitude real + RotationW real + RotationX real + RotationY real + RotationZ real + Timestamp integer + +=head3 XMP DevicePlanes Struct + + Field Name Writable + ---------- -------- + Plane DevicePlane Struct + +=head3 XMP DevicePlane Struct + + Field Name Writable + ---------- -------- + Boundary string + BoundaryVertexCount integer + ExtentX real + ExtentZ real + Pose Pose Struct + +=head3 XMP DeviceProfiles Struct + + Field Name Writable + ---------- -------- + Profile DeviceProfile Struct + +=head3 XMP DeviceProfile Struct + + Field Name Writable + ---------- -------- + CameraIndices integer+ + Type string + +=head3 XMP dex Tags + +Description Explorer namespace tags. These tags are not very common. The +Source and Rating tags are avoided when writing due to name conflicts with +other XMP tags. (see L<http://www.optimasc.com/products/fileid/>) + +These tags belong to the ExifTool XMP-dex family 1 group. + + Tag Name Writable + -------- -------- + CRC32 integer + FFID string + LicenseType string + OS integer + Rating string/ + Revision string + ShortDescription lang-alt + Source string/ + +=head3 XMP DICOM Tags + +DICOM namespace tags. These XMP tags allow some DICOM information to be +stored in files of other than DICOM format. See the +L<DICOM Tags documentation|Image::ExifTool::TagNames/DICOM Tags> for a list +of tags available in DICOM-format files. + +These tags belong to the ExifTool XMP-DICOM family 1 group. + + Tag Name Writable + -------- -------- + EquipmentInstitution string + EquipmentManufacturer string + PatientBirthDate date + PatientID string + PatientName string + PatientSex string + SeriesDateTime date + SeriesDescription string + SeriesModality string + SeriesNumber string + StudyDateTime date + StudyDescription string + StudyID string + StudyPhysician string + +=head3 XMP digiKam Tags + +DigiKam namespace tags. + +These tags belong to the ExifTool XMP-digiKam family 1 group. + + Tag Name Writable + -------- -------- + CaptionsAuthorNames lang-alt + CaptionsDateTimeStamps lang-alt + ColorLabel string + ImageHistory string/ + ImageUniqueID string/ + LensCorrectionSettings string + PickLabel string + TagsList string+ + +=head3 XMP exif Tags + +EXIF namespace for EXIF tags. See +L<https://web.archive.org/web/20180921145139if_/http://www.cipa.jp:80/std/documents/e/DC-010-2017_E.pdf> +for the specification. + +These tags belong to the ExifTool XMP-exif family 1 group. + + Tag Name Writable + -------- -------- + ApertureValue rational + BrightnessValue rational + CFAPattern CFAPattern Struct + CFAPatternColumns integer_ + CFAPatternRows integer_ + CFAPatternValues integer_+ + ColorSpace integer + ComponentsConfiguration integer+ + CompressedBitsPerPixel rational + Contrast integer + CustomRendered integer + DateTimeDigitized date + DateTimeOriginal date + DeviceSettingDescription DeviceSettings Struct + DeviceSettingDescriptionColumns integer_ + DeviceSettingDescriptionRows integer_ + DeviceSettingDescriptionSettings string_+ + DigitalZoomRatio rational + ExifVersion string + ExposureCompensation rational + ExposureIndex rational + ExposureMode integer + ExposureProgram integer + ExposureTime rational + FileSource integer + Flash Flash Struct + FlashEnergy rational + FlashFired boolean_ + FlashFunction boolean_ + FlashMode integer_ + FlashpixVersion string + FlashRedEyeMode boolean_ + FlashReturn integer_ + FNumber rational + FocalLength rational + FocalLengthIn35mmFormat integer + FocalPlaneResolutionUnit integer + FocalPlaneXResolution rational + FocalPlaneYResolution rational + GainControl integer + GPSAltitude rational + GPSAltitudeRef integer + GPSAreaInformation string + GPSDestBearing rational + GPSDestBearingRef string + GPSDestDistance rational + GPSDestDistanceRef string + GPSDestLatitude string + GPSDestLongitude string + GPSDifferential integer + GPSDOP rational + GPSHPositioningError rational + GPSImgDirection rational + GPSImgDirectionRef string + GPSLatitude string + GPSLongitude string + GPSMapDatum string + GPSMeasureMode integer + GPSProcessingMethod string + GPSSatellites string + GPSSpeed rational + GPSSpeedRef string + GPSStatus string + GPSDateTime date + GPSTrack rational + GPSTrackRef string + GPSVersionID string + ImageUniqueID string + ISO integer+ + LightSource string + MakerNote string + MaxApertureValue rational + MeteringMode integer + NativeDigest string + Opto-ElectricConvFactor OECF Struct + OECFColumns integer_ + OECFNames string_+ + OECFRows integer_ + OECFValues rational_+ + ExifImageWidth integer + ExifImageHeight integer + RelatedSoundFile string + Saturation integer + SceneCaptureType integer + SceneType integer + SensingMethod integer + Sharpness integer + ShutterSpeedValue rational + SpatialFrequencyResponse OECF Struct + SpatialFrequencyResponseColumns integer_ + SpatialFrequencyResponseNames string_+ + SpatialFrequencyResponseRows integer_ + SpatialFrequencyResponseValues rational_+ + SpectralSensitivity string + SubjectArea integer+ + SubjectDistance rational + SubjectDistanceRange integer + SubjectLocation integer+ + UserComment lang-alt + WhiteBalance integer + +=head3 XMP CFAPattern Struct + + Field Name Writable + ---------- -------- + Columns integer + Rows integer + Values integer+ + +=head3 XMP DeviceSettings Struct + + Field Name Writable + ---------- -------- + Columns integer + Rows integer + Settings string+ + +=head3 XMP Flash Struct + + Field Name Writable + ---------- -------- + Fired boolean + Function boolean + Mode integer + RedEyeMode boolean + Return integer + +=head3 XMP OECF Struct + + Field Name Writable + ---------- -------- + Columns integer + Names string+ + Rows integer + Values rational+ + +=head3 XMP exifEX Tags + +EXIF tags added by the EXIF 2.32 for XMP specification (see +L<https://cipa.jp/std/documents/download_e.html?DC-010-2020_E>). + +These tags belong to the ExifTool XMP-exifEX family 1 group. + + Tag Name Writable + -------- -------- + Acceleration rational + SerialNumber string + CameraElevationAngle rational + OwnerName string + CompositeImage integer + CompositeImageCount integer+ + CompositeImageExposureTimes CompImageExp Struct + CompImageMaxExposureAll rational_ + CompImageMaxExposureUsed rational_ + CompImageMinExposureAll rational_ + CompImageMinExposureUsed rational_ + CompImageImagesPerSequence integer_ + CompImageNumSequences integer_ + CompImageSumExposureAll rational_ + CompImageSumExposureUsed rational_ + CompImageTotalExposurePeriod rational_ + CompImageValues rational_+ + Gamma rational + Humidity rational + InteropIndex string + ISOSpeed integer + ISOSpeedLatitudeyyy integer + ISOSpeedLatitudezzz integer + LensMake string + LensModel string + LensSerialNumber string + LensInfo rational+ + PhotographicSensitivity integer + Pressure rational + RecommendedExposureIndex integer + SensitivityType integer + StandardOutputSensitivity integer + AmbientTemperature rational + WaterDepth rational + +=head3 XMP CompImageExp Struct + + Field Name Writable + ---------- -------- + MaxExposureTimesOfAll rational + MaxExposureTimesOfUsed rational + MinExposureTimesOfAll rational + MinExposureTimesOfUsed rational + NumberOfImagesInSequences integer + NumberOfSequences integer + SumOfExposureTimesOfAll rational + SumOfExposureTimesOfUsed rational + TotalExposurePeriod rational + Values rational+ + +=head3 XMP ExpressionMedia Tags + +Microsoft Expression Media namespace tags. These tags are avoided when +writing due to name conflicts with tags in other schemas. + +These tags belong to the ExifTool XMP-expressionmedia family 1 group. + + Tag Name Writable + -------- -------- + CatalogSets string/+ + Event string/ + People string/+ + Status string/ + +=head3 XMP extensis Tags + +Tags used by Extensis Portfolio. + +These tags belong to the ExifTool XMP-extensis family 1 group. + + Tag Name Writable + -------- -------- + Approved boolean + ApprovedBy string + ClientName string + JobName string + JobStatus string + RoutedTo string + RoutingNotes string + WorkToDo string + +=head3 XMP fpv Tags + +Fast Picture Viewer tags (see +L<http://www.fastpictureviewer.com/help/#rtfcomments>). + +These tags belong to the ExifTool XMP-fpv family 1 group. + + Tag Name Writable + -------- -------- + RichTextComment string + +=head3 XMP GAudio Tags + +These tags belong to the ExifTool XMP-GAudio family 1 group. + + Tag Name Writable + -------- -------- + AudioData string + AudioMimeType string + +=head3 XMP GCamera Tags + +Camera information found in Google panorama images. + +These tags belong to the ExifTool XMP-GCamera family 1 group. + + Tag Name Writable + -------- -------- + BurstID string + BurstPrimary string + DisableAutoCreation string+ + HDRPMakerNote string + MicroVideo integer + MicroVideoOffset integer + MicroVideoPresentationTimestampUs integer + MicroVideoVersion integer + PortraitNote string + PortraitRequest string + PortraitVersion string + SpecialTypeID string+ + +=head3 XMP GCreations Tags + +Google creations tags. + +These tags belong to the ExifTool XMP-GCreations family 1 group. + + Tag Name Writable + -------- -------- + CameraBurstID string + +=head3 XMP GDepth Tags + +Google depthmap information. See +L<https://developers.google.com/depthmap-metadata/> for the specification. + +These tags belong to the ExifTool XMP-GDepth family 1 group. + + Tag Name Writable + -------- -------- + Confidence string/ + ConfidenceMime string/ + DepthImage string/ + Far real/ + Format string/ + ImageHeight real/ + ImageWidth real/ + Manufacturer string/ + MeasureType string/ + Mime string/ + Model string/ + Near real/ + Software string/ + Units string/ + +=head3 XMP GettyImages Tags + +The actual Getty Images namespace prefix is "GettyImagesGIFT", which is the +prefix recorded in the file, but ExifTool shortens this for the family 1 +group name. + +These tags belong to the ExifTool XMP-getty family 1 group. + + Tag Name Writable + -------- -------- + AssetID string + CallForImage string + CameraFilename string + CameraMakeModel string/ + CameraSerialNumber string/ + Composition string + ExclusiveCoverage string + GIFTFtpPriority string + ImageRank string + MediaEventIdDate string + OriginalCreateDateTime date/ + OriginalFileName string + ParentMediaEventID string + ParentMEID string + Personality string+ + PrimaryFTP string+ + RoutingDestinations string+ + RoutingExclusions string+ + SecondaryFTP string+ + TimeShot string + +=head3 XMP GFocus Tags + +Focus information found in Google depthmap images. + +These tags belong to the ExifTool XMP-GFocus family 1 group. + + Tag Name Writable + -------- -------- + BlurAtInfinity real + FocalDistance real + FocalPointX real + FocalPointY real + +=head3 XMP GImage Tags + +These tags belong to the ExifTool XMP-GImage family 1 group. + + Tag Name Writable + -------- -------- + ImageData string + ImageMimeType string + +=head3 XMP GPano Tags + +Panorama tags written by Google Photosphere. See +L<https://developers.google.com/panorama/metadata/> for the specification. + +These tags belong to the ExifTool XMP-GPano family 1 group. + + Tag Name Writable + -------- -------- + CaptureSoftware string + CroppedAreaImageHeightPixels real + CroppedAreaImageWidthPixels real + CroppedAreaLeftPixels real + CroppedAreaTopPixels real + ExposureLockUsed boolean + FirstPhotoDate date + FullPanoHeightPixels real + FullPanoWidthPixels real + InitialCameraDolly real + InitialHorizontalFOVDegrees real + InitialVerticalFOVDegrees real + InitialViewHeadingDegrees real + InitialViewPitchDegrees real + InitialViewRollDegrees real + LargestValidInteriorRectHeight real + LargestValidInteriorRectLeft real + LargestValidInteriorRectTop real + LargestValidInteriorRectWidth real + LastPhotoDate date + PoseHeadingDegrees real + PosePitchDegrees real + PoseRollDegrees real + ProjectionType string + SourcePhotosCount integer + StitchingSoftware string + UsePanoramaViewer boolean + +=head3 XMP GSpherical Tags + +Not actually XMP. These RDF/XML tags are used in Google spherical MP4 +videos. These tags are written into the video track of MOV/MP4 files, and +not at the top level like other XMP tags. See +L<https://github.com/google/spatial-media/blob/master/docs/spherical-video-rfc.md> +for the specification. + +These tags belong to the ExifTool XMP-GSpherical family 1 group. + + Tag Name Writable + -------- -------- + CroppedAreaImageHeightPixels integer/ + CroppedAreaImageWidthPixels integer/ + CroppedAreaLeftPixels integer/ + CroppedAreaTopPixels integer/ + FullPanoHeightPixels integer/ + FullPanoWidthPixels integer/ + InitialViewHeadingDegrees real/ + InitialViewPitchDegrees real/ + InitialViewRollDegrees real/ + ProjectionType string/ + SourceCount integer/ + Spherical boolean/ + StereoMode string/ + Stitched boolean/ + StitchingSoftware string/ + TimeStamp integer/ + +=head3 XMP ics Tags + +Tags used by IDimager. Nested TagStructure structures are unrolled to an +arbitrary depth of 6 to avoid infinite recursion. + +These tags belong to the ExifTool XMP-ics family 1 group. + + Tag Name Writable + -------- -------- + AppVersion string/ + ImageRef string + SubVersions SubVersion Struct+ + SubVersionFileName string_+ + SubVersionReference string_+ + TagStructure TagStructure Struct+ + LabelName1 string_+ + ParentReference1 string_+ + Reference1 string_+ + SubLabels1 TagStructure Struct_+ + LabelName2 string_+ + ParentReference2 string_+ + Reference2 string_+ + SubLabels2 TagStructure Struct_+ + LabelName3 string_+ + ParentReference3 string_+ + Reference3 string_+ + SubLabels3 TagStructure Struct_+ + LabelName4 string_+ + ParentReference4 string_+ + Reference4 string_+ + SubLabels4 TagStructure Struct_+ + LabelName5 string_+ + ParentReference5 string_+ + Reference5 string_+ + SubLabels5 TagStructure Struct_+ + LabelName6 string_+ + ParentReference6 string_+ + Reference6 string_+ + TimeStamp date/ + +=head3 XMP SubVersion Struct + + Field Name Writable + ---------- -------- + FileName string + VersRef string + +=head3 XMP TagStructure Struct + + Field Name Writable + ---------- -------- + LabelName string + ParentReference string + Reference string + SubLabels TagStructure Struct+ + +=head3 XMP iptcCore Tags + +IPTC Core namespace tags. The actual IPTC Core namespace prefix is +"Iptc4xmpCore", which is the prefix recorded in the file, but ExifTool +shortens this for the family 1 group name. (see +L<http://www.iptc.org/IPTC4XMP/>) + +These tags belong to the ExifTool XMP-iptcCore family 1 group. + + Tag Name Writable + -------- -------- + AltTextAccessibility lang-alt + CountryCode string + CreatorContactInfo ContactInfo Struct + CreatorCity string_ + CreatorCountry string_ + CreatorAddress string_ + CreatorPostalCode string_ + CreatorRegion string_ + CreatorWorkEmail string_ + CreatorWorkTelephone string_ + CreatorWorkURL string_ + ExtDescrAccessibility lang-alt + IntellectualGenre string + Location string + Scene string+ + SubjectCode string+ + +=head3 XMP ContactInfo Struct + + Field Name Writable + ---------- -------- + CiAdrCity string + CiAdrCtry string + CiAdrExtadr string + CiAdrPcode string + CiAdrRegion string + CiEmailWork string + CiTelWork string + CiUrlWork string + +=head3 XMP iptcExt Tags + +This table contains tags defined by the IPTC Extension schema version 1.6. +The actual namespace prefix is "Iptc4xmpExt", but ExifTool shortens this for +the family 1 group name. (see +L<http://www.iptc.org/standards/photo-metadata/iptc-standard/>) + +These tags belong to the ExifTool XMP-iptcExt family 1 group. + + Tag Name Writable + -------- -------- + AboutCvTerm CVTermDetails Struct+ + AboutCvTermCvId string_+ + AboutCvTermId string_+ + AboutCvTermName lang-alt_+ + AboutCvTermRefinedAbout string_+ + AdditionalModelInformation string + ArtworkOrObject ArtworkOrObjectDetails Struct+ + ArtworkCircaDateCreated string!_+ + ArtworkContentDescription lang-alt_+ + ArtworkContributionDescription lang-alt_+ + ArtworkCopyrightNotice string_+ + ArtworkCreator string_+ + ArtworkCreatorID string_+ + ArtworkCopyrightOwnerID string_+ + ArtworkCopyrightOwnerName string_+ + ArtworkLicensorID string_+ + ArtworkLicensorName string_+ + ArtworkDateCreated date_+ + ArtworkPhysicalDescription lang-alt_+ + ArtworkSource string_+ + ArtworkSourceInventoryNo string_+ + ArtworkSourceInvURL string_+ + ArtworkStylePeriod string_+ + ArtworkTitle lang-alt_+ + AudioBitrate integer + AudioBitrateMode string + AudioBitsPerSample integer + AudioChannelCount integer + CircaDateCreated string + ContainerFormat Entity Struct + ContainerFormatIdentifier string_+ + ContainerFormatName lang-alt_ + Contributor EntityWithRole Struct+ + ContributorIdentifier string_+ + ContributorName lang-alt_+ + ContributorRole string_+ + CopyrightYear integer + Creator EntityWithRole Struct+ + CreatorIdentifier string_+ + CreatorName lang-alt_+ + CreatorRole string_+ + ControlledVocabularyTerm string+ + DataOnScreen TextRegion Struct+ + DataOnScreenRegion Area Struct_+ + DataOnScreenRegionD real_+ + DataOnScreenRegionH real_+ + DataOnScreenRegionText string_+ + DataOnScreenRegionUnit string_+ + DataOnScreenRegionW real_+ + DataOnScreenRegionX real_+ + DataOnScreenRegionY real_+ + DigitalImageGUID string + DigitalSourceFileType string + DigitalSourceType string + Dopesheet lang-alt + DopesheetLink QualifiedLink Struct+ + DopesheetLinkLink string_+ + DopesheetLinkLinkQualifier string_+ + EmbdEncRightsExpr EEREDetails Struct+ + EmbeddedEncodedRightsExpr string_+ + EmbeddedEncodedRightsExprType string_+ + EmbeddedEncodedRightsExprLangID string_+ + Episode EpisodeOrSeason Struct + EpisodeIdentifier string_ + EpisodeName string_ + EpisodeNumber string_ + Event lang-alt + ShownEvent Entity Struct+ + ShownEventIdentifier string_+ + ShownEventName lang-alt_+ + EventID string+ + ExternalMetadataLink string+ + FeedIdentifier string + Genre CVTermDetails Struct+ + GenreCvId string_+ + GenreCvTermId string_+ + GenreCvTermName lang-alt_+ + GenreCvTermRefinedAbout string_+ + Headline lang-alt/ + ImageRegion ImageRegion Struct+ + ImageRegionName lang-alt_+ + ImageRegionCtype Entity Struct_+ + ImageRegionCtypeIdentifier string_+ + ImageRegionCtypeName lang-alt_+ + ImageRegionBoundary RegionBoundary Struct_+ + ImageRegionBoundaryH real_+ + ImageRegionBoundaryRx real_+ + ImageRegionBoundaryShape string_+ + ImageRegionBoundaryUnit string_+ + ImageRegionBoundaryVertices BoundaryPoint Struct_+ + ImageRegionBoundaryVerticesX real_+ + ImageRegionBoundaryVerticesY real_+ + ImageRegionBoundaryW real_+ + ImageRegionBoundaryX real_+ + ImageRegionBoundaryY real_+ + ImageRegionID string_+ + ImageRegionRole Entity Struct_+ + ImageRegionRoleIdentifier string_+ + ImageRegionRoleName lang-alt_+ + IPTCLastEdited date + LinkedEncRightsExpr LEREDetails Struct+ + LinkedEncodedRightsExpr string_+ + LinkedEncodedRightsExprType string_+ + LinkedEncodedRightsExprLangID string_+ + LocationCreated LocationDetails Struct+ + LocationCreatedCity string_+ + LocationCreatedCountryCode string_+ + LocationCreatedCountryName string_+ + LocationCreatedGPSAltitude rational_+ + LocationCreatedGPSLatitude string_+ + LocationCreatedGPSLongitude string_+ + LocationCreatedIdentifier string_+ + LocationCreatedLocationId string_+ + LocationCreatedLocationName lang-alt_+ + LocationCreatedProvinceState string_+ + LocationCreatedSublocation string_+ + LocationCreatedWorldRegion string_+ + LocationShown LocationDetails Struct+ + LocationShownCity string_+ + LocationShownCountryCode string_+ + LocationShownCountryName string_+ + LocationShownGPSAltitude rational_+ + LocationShownGPSLatitude string_+ + LocationShownGPSLongitude string_+ + LocationShownIdentifier string_+ + LocationShownLocationId string_+ + LocationShownLocationName lang-alt_+ + LocationShownProvinceState string_+ + LocationShownSublocation string_+ + LocationShownWorldRegion string_+ + MaxAvailHeight integer + MaxAvailWidth integer + ModelAge integer+ + OrganisationInImageCode string+ + OrganisationInImageName string+ + PersonHeard Entity Struct+ + PersonHeardIdentifier string_+ + PersonHeardName lang-alt_+ + PersonInImage string+ + PersonInImageWDetails PersonDetails Struct+ + PersonInImageCharacteristic CVTermDetails Struct_+ + PersonInImageCvTermCvId string_+ + PersonInImageCvTermId string_+ + PersonInImageCvTermName lang-alt_+ + PersonInImageCvTermRefinedAbout string_+ + PersonInImageDescription lang-alt_+ + PersonInImageId string_+ + PersonInImageName lang-alt_+ + PlanningRef EntityWithRole Struct+ + PlanningRefIdentifier string_+ + PlanningRefName lang-alt_+ + PlanningRefRole string_+ + ProductInImage ProductDetails Struct+ + ProductInImageDescription lang-alt_+ + ProductInImageGTIN string_+ + ProductInImageName lang-alt_+ + PublicationEvent PublicationEvent Struct+ + PublicationEventDate date_+ + PublicationEventIdentifier string_+ + PublicationEventName string_+ + Rating Rating Struct+ + RatingRegion LocationDetails Struct_+ + RatingRegionCity string_+ + RatingRegionCountryCode string_+ + RatingRegionCountryName string_+ + RatingRegionGPSAltitude rational_+ + RatingRegionGPSLatitude string_+ + RatingRegionGPSLongitude string_+ + RatingRegionIdentifier string_+ + RatingRegionLocationId string_+ + RatingRegionLocationName lang-alt_+ + RatingRegionProvinceState string_+ + RatingRegionSublocation string_+ + RatingRegionWorldRegion string_+ + RatingScaleMaxValue string_+ + RatingScaleMinValue string_+ + RatingSourceLink string_+ + RatingValue string_+ + RatingValueLogoLink string_+ + RecDevice Device Struct + RecDeviceAttLensDescription string_ + RecDeviceManufacturer string_ + RecDeviceModelName string_ + RecDeviceOwnersDeviceId string_ + RecDeviceSerialNumber string_ + RegistryID RegistryEntryDetails Struct+ + RegistryEntryRole string_+ + RegistryItemID string_+ + RegistryOrganisationID string_+ + ReleaseReady boolean + Season EpisodeOrSeason Struct + SeasonIdentifier string_ + SeasonName string_ + SeasonNumber string_ + Series Series Struct + SeriesIdentifier string_ + SeriesName string_ + Snapshot LinkedImage Struct+ + SnapshotFormat string_+ + SnapshotHeightPixels integer_+ + SnapshotImageRole string_+ + SnapshotLink string_+ + SnapshotLinkQualifier string_+ + SnapshotUsedVideoFrame Timecode Struct_+ + SnapshotUsedVideoFrameTimeFormat string_+ + SnapshotUsedVideoFrameTimeValue string_+ + SnapshotUsedVideoFrameValue integer_+ + SnapshotWidthPixels integer_+ + StorylineIdentifier string+ + StreamReady string + StylePeriod string + SupplyChainSource Entity Struct+ + SupplyChainSourceIdentifier string_+ + SupplyChainSourceName lang-alt_+ + TemporalCoverage TemporalCoverage Struct + TemporalCoverageFrom date_ + TemporalCoverageTo date_ + Transcript lang-alt + TranscriptLink QualifiedLink Struct+ + TranscriptLinkLink string_+ + TranscriptLinkLinkQualifier string_+ + VideoBitrate integer + VideoBitrateMode string + VideoDisplayAspectRatio rational + VideoEncodingProfile string + VideoShotType Entity Struct+ + VideoShotTypeIdentifier string_+ + VideoShotTypeName lang-alt_+ + VideoStreamsCount integer + VisualColor string + WorkflowTag CVTermDetails Struct + WorkflowTagCvId string_ + WorkflowTagCvTermId string_ + WorkflowTagCvTermName lang-alt_ + WorkflowTagCvTermRefinedAbout string_ + +=head3 XMP CVTermDetails Struct + + Field Name Writable + ---------- -------- + CvId string + CvTermId string + CvTermName lang-alt + CvTermRefinedAbout string + +=head3 XMP ArtworkOrObjectDetails Struct + + Field Name Writable + ---------- -------- + AOCircaDateCreated string + AOContentDescription lang-alt + AOContributionDescription lang-alt + AOCopyrightNotice string + AOCreator string+ + AOCreatorId string+ + AOCurrentCopyrightOwnerId string + AOCurrentCopyrightOwnerName string + AOCurrentLicensorId string + AOCurrentLicensorName string + AODateCreated date + AOPhysicalDescription lang-alt + AOSource string + AOSourceInvNo string + AOSourceInvURL string + AOStylePeriod string+ + AOTitle lang-alt + +=head3 XMP Entity Struct + + Field Name Writable + ---------- -------- + Identifier string+ + Name lang-alt + +=head3 XMP EntityWithRole Struct + + Field Name Writable + ---------- -------- + Identifier string+ + Name lang-alt + Role string+ + +=head3 XMP TextRegion Struct + + Field Name Writable + ---------- -------- + Region Area Struct + RegionText string + +=head3 XMP Area Struct + + Field Name Writable + ---------- -------- + D real + H real + Unit string + W real + X real + Y real + +=head3 XMP QualifiedLink Struct + + Field Name Writable + ---------- -------- + Link string + LinkQualifier string + +=head3 XMP EEREDetails Struct + + Field Name Writable + ---------- -------- + EncRightsExpr string + RightsExprEncType string + RightsExprLangId string + +=head3 XMP EpisodeOrSeason Struct + + Field Name Writable + ---------- -------- + Identifier string + Name string + Number string + +=head3 XMP ImageRegion Struct + +This structure is new in the IPTC Extension version 1.5 specification. As +well as the fields defined below, this structure may contain any top-level +XMP tags, but since they aren't pre-defined the only way to add these tags +is to write ImageRegion as a structure with these tags as new fields. + + Field Name Writable + ---------- -------- + Name lang-alt + RegionBoundary RegionBoundary Struct + RCtype Entity Struct+ + RId string + RRole Entity Struct+ + +=head3 XMP RegionBoundary Struct + + Field Name Writable + ---------- -------- + RbH real + RbRx real + RbShape string + RbUnit string + RbVertices BoundaryPoint Struct+ + RbW real + RbX real + RbY real + +=head3 XMP BoundaryPoint Struct + + Field Name Writable + ---------- -------- + RbX real + RbY real + +=head3 XMP LEREDetails Struct + + Field Name Writable + ---------- -------- + LinkedRightsExpr string + RightsExprEncType string + RightsExprLangId string + +=head3 XMP LocationDetails Struct + + Field Name Writable + ---------- -------- + City string + CountryCode string + CountryName string + GPSAltitude rational + GPSLatitude string + GPSLongitude string + Identifier string+ + LocationId string+ + LocationName lang-alt + ProvinceState string + Sublocation string + WorldRegion string + +=head3 XMP PersonDetails Struct + + Field Name Writable + ---------- -------- + PersonCharacteristic CVTermDetails Struct+ + PersonDescription lang-alt + PersonId string+ + PersonName lang-alt + +=head3 XMP ProductDetails Struct + + Field Name Writable + ---------- -------- + ProductDescription lang-alt + ProductGTIN string + ProductName lang-alt + +=head3 XMP PublicationEvent Struct + + Field Name Writable + ---------- -------- + Date date + Identifier string + Name string + +=head3 XMP Rating Struct + + Field Name Writable + ---------- -------- + RatingRegion LocationDetails Struct+ + RatingScaleMaxValue string + RatingScaleMinValue string + RatingSourceLink string + RatingValue string + RatingValueLogoLink string + +=head3 XMP Device Struct + + Field Name Writable + ---------- -------- + AttLensDescription string + Manufacturer string + ModelName string + OwnersDeviceId string + SerialNumber string + +=head3 XMP RegistryEntryDetails Struct + + Field Name Writable + ---------- -------- + RegEntryRole string + RegItemId string + RegOrgId string + +=head3 XMP Series Struct + + Field Name Writable + ---------- -------- + Identifier string + Name string + +=head3 XMP LinkedImage Struct + + Field Name Writable + ---------- -------- + HeightPixels integer + ImageRole string + Link string + LinkQualifier string+ + UsedVideoFrame Timecode Struct + WidthPixels integer + Format string + +=head3 XMP Timecode Struct + + Field Name Writable + ---------- -------- + TimeFormat string + TimeValue string + Value integer + +=head3 XMP TemporalCoverage Struct + + Field Name Writable + ---------- -------- + TempCoverageFrom date + TempCoverageTo date + +=head3 XMP LImage Tags + +Tags written by RED smartphones. + +These tags belong to the ExifTool XMP-LImage family 1 group. + + Tag Name Writable + -------- -------- + MajorVersion string + MinorVersion string + RightAlbedo string + +=head3 XMP Lightroom Tags + +Adobe Lightroom "lr" namespace tags. + +These tags belong to the ExifTool XMP-lr family 1 group. + + Tag Name Writable + -------- -------- + HierarchicalSubject string+ + PrivateRTKInfo string + WeightedFlatSubject string+ + +=head3 XMP MediaPro Tags + +iView MediaPro namespace tags. + +These tags belong to the ExifTool XMP-mediapro family 1 group. + + Tag Name Writable + -------- -------- + CatalogSets string+ + Event string/ + Location string/ + People string+ + Status string + UserFields string+ + +=head3 XMP pdf Tags + +Adobe PDF namespace tags. The official XMP specification defines only +Keywords, PDFVersion, Producer and Trapped. The other tags are included +because they have been observed in PDF files, but some are avoided when +writing due to name conflicts with other XMP namespaces. + +These tags belong to the ExifTool XMP-pdf family 1 group. + + Tag Name Writable + -------- -------- + Author string + Copyright string/ + CreationDate date + Creator string/ + Keywords string + Marked boolean/ + ModDate date + PDFVersion string + Producer string + Subject string/ + Title string/ + Trapped string + +=head3 XMP pdfx Tags + +PDF extension tags. This namespace is used to store application-defined PDF +information, so there are no pre-defined tags. User-defined tags must be +created to enable writing of XMP-pdfx information. + +These tags belong to the ExifTool XMP-pdfx family 1 group. + + Tag Name Writable + -------- -------- + [no tags known] + +=head3 XMP photoshop Tags + +Adobe Photoshop namespace tags. + +These tags belong to the ExifTool XMP-photoshop family 1 group. + + Tag Name Writable + -------- -------- + AuthorsPosition string + CaptionWriter string + Category string + City string + ColorMode integer + Country string + Credit string + DateCreated date + DocumentAncestors string+ + EmbeddedXMPDigest string + Headline string + History string + ICCProfileName string + Instructions string + LegacyIPTCDigest string + SidecarForExtension string + Source string + State string + SupplementalCategories string+ + TextLayers Layer Struct+ + TextLayerName string_+ + TextLayerText string_+ + TransmissionReference string + Urgency integer + +=head3 XMP Layer Struct + + Field Name Writable + ---------- -------- + LayerName string + LayerText string + +=head3 XMP PixelLive Tags + +PixelLive namespace tags. These tags are not writable because they are very +uncommon and I haven't been able to locate a reference which gives the +namespace URI. + +These tags belong to the ExifTool XMP-PixelLive family 1 group. + + Tag Name Writable + -------- -------- + Author no + Comments no + Copyright no + Date no + Genre no + Title no + +=head3 XMP pmi Tags + +PRISM Metadata for Images 3.0 namespace tags. (see +L<http://www.prismstandard.org/>) + +These tags belong to the ExifTool XMP-pmi family 1 group. + + Tag Name Writable + -------- -------- + Color string/ + ContactInfo string/ + DisplayName string/ + DistributorProductID string/ + EventAlias string/ + EventEnd string/ + EventStart string/ + EventSubtype string/ + EventType string/ + Field string/ + Framing string/ + Location string/ + Make string/ + Manufacturer string/ + Model string/ + ModelYear string/ + ObjectDescription string/ + ObjectSubtype string/ + ObjectType string/ + Orientation string/ + PositionDescriptor string/ + ProductID string/ + ProductIDType string/ + Season string/ + SequenceName string/ + SequenceNumber string/ + SequenceTotalNumber string/ + Setting string/ + ShootID string/ + SlideshowName string/ + SlideshowNumber integer/ + SlideshowTotalNumber integer/ + Viewpoint string/ + VisualTechnique string/ + +=head3 XMP prism Tags + +Publishing Requirements for Industry Standard Metadata 3.0 namespace +tags. (see L<http://www.prismstandard.org/>) + +These tags belong to the ExifTool XMP-prism family 1 group. + + Tag Name Writable + -------- -------- + AcademicField string/ + AggregateIssueNumber integer/ + AggregationType string/+ + AlternateTitle prismAlternateTitle Struct+ + AlternateTitleA-lang string/_+ + AlternateTitleA-platform string/_+ + AlternateTitleText string/_+ + BlogTitle string/ + BlogURL string/ + BookEdition string/ + ByteCount integer/ + Channel prismChannel Struct+ + ChannelA-lang string/_+ + ChannelChannel string/_+ + ChannelSubchannel1 string/_+ + ChannelSubchannel2 string/_+ + ChannelSubchannel3 string/_+ + ChannelSubchannel4 string/_+ + ComplianceProfile string/ + ContentType string/ + CopyrightYear string/ + CorporateEntity string/+ + CoverDate date/ + CoverDisplayDate string/ + CreationDate date/ + DateRecieved date/ + Device string/ + Distributor string/ + DOI string/ + Edition string/ + EIssn string/ + EndingPage string/ + Event string/+ + Genre string/+ + HasAlternative string/+ + HasCorrection prismHasCorrection Struct + HasCorrectionA-lang string/_ + HasCorrectionA-platform string/_ + HasCorrectionText string/_ + HasTranslation string/+ + Industry string/+ + IsAlternativeOf string/+ + ISBN string/+ + IsCorrectionOf string/+ + ISSN string/ + IssueIdentifier string/ + IssueName string/ + IssueTeaser string/ + IssueType string/ + IsTranslationOf string/ + Keyword string/+ + KillDate prismKillDate Struct + KillDateA-platform string/_ + KillDateDate date/_ + Link string/+ + Location string/+ + ModificationDate date/ + NationalCatalogNumber string/ + Number string/ + Object string/+ + OffSaleDate prismOffSaleDate Struct+ + OffSaleDateA-platform string/_+ + OffSaleDateDate date/_+ + OnSaleDate prismOnSaleDate Struct+ + OnSaleDateA-platform string/_+ + OnSaleDateDate date/_+ + OnSaleDay prismOnSaleDay Struct+ + OnSaleDayA-platform string/_+ + OnSaleDayDay string/_+ + Organization string/+ + OriginPlatform string/+ + PageCount integer/ + PageProgressionDirection string/ + PageRange string/+ + Person string/ + Platform string/ + ProductCode string/ + Profession string/ + PublicationDate prismPublicationDate Struct+ + PublicationDateA-platform string/_+ + PublicationDateDate date/_+ + PublicationDisplayDate prismPublicationDate Struct+ + PublicationDisplayDateA-platform string/_+ + PublicationDisplayDateDate date/_+ + PublicationName string/ + PublishingFrequency string/ + Rating string/ + SamplePageRange string/ + Section string/ + SellingAgency string/ + SeriesNumber integer/ + SeriesTitle string/ + Sport string/ + StartingPage string/ + Subsection1 string/ + Subsection2 string/ + Subsection3 string/ + Subsection4 string/ + Subtitle string/ + SupplementDisplayID string/ + SupplementStartingPage string/ + SupplementTitle string/ + Teaser string/+ + Ticker string/+ + TimePeriod string/ + URL prismUrl Struct+ + URLA-platform string/_+ + URLUrl string/_+ + UspsNumber string/ + VersionIdentifier string/ + Volume string/ + WordCount integer/ + +=head3 XMP prismAlternateTitle Struct + + Field Name Writable + ---------- -------- + A-lang string + A-platform string + Text string + +=head3 XMP prismChannel Struct + + Field Name Writable + ---------- -------- + A-lang string + Channel string + Subchannel1 string + Subchannel2 string + Subchannel3 string + Subchannel4 string + +=head3 XMP prismHasCorrection Struct + + Field Name Writable + ---------- -------- + A-lang string + A-platform string + Text string + +=head3 XMP prismKillDate Struct + + Field Name Writable + ---------- -------- + A-platform string + Date date + +=head3 XMP prismOffSaleDate Struct + + Field Name Writable + ---------- -------- + A-platform string + Date date + +=head3 XMP prismOnSaleDate Struct + + Field Name Writable + ---------- -------- + A-platform string + Date date + +=head3 XMP prismOnSaleDay Struct + + Field Name Writable + ---------- -------- + A-platform string + Day string + +=head3 XMP prismPublicationDate Struct + + Field Name Writable + ---------- -------- + A-platform string + Date date + +=head3 XMP prismUrl Struct + + Field Name Writable + ---------- -------- + A-platform string + Url string + +=head3 XMP prl Tags + +PRISM Rights Language 2.1 namespace tags. These tags have been deprecated +since the release of the PRISM Usage Rights 3.0. (see +L<http://www.prismstandard.org/>) + +These tags belong to the ExifTool XMP-prl family 1 group. + + Tag Name Writable + -------- -------- + Geography string/+ + Industry string/+ + Usage string/+ + +=head3 XMP prm Tags + +PRISM Recipe Metadata 3.0 namespace tags. (see +L<http://www.prismstandard.org/>) + +These tags belong to the ExifTool XMP-prm family 1 group. + + Tag Name Writable + -------- -------- + CookingEquipment string/ + CookingMethod string/ + Course string/ + Cuisine string/ + DietaryNeeds string/ + DishType string/ + Duration string/ + IngredientExclusion string/ + MainIngredient string/ + Meal string/ + RecipeEndingPage string/ + RecipePageRange string/ + RecipeSource string/ + RecipeStartingPage string/ + RecipeTitle string/ + ServingSize string/ + SkillLevel string/ + SpecialOccasion string/ + Yield string/ + +=head3 XMP pur Tags + +PRISM Usage Rights 3.0 namespace tags. (see +L<http://www.prismstandard.org/>) + +These tags belong to the ExifTool XMP-pur family 1 group. + + Tag Name Writable + -------- -------- + AdultContentWarning string/+ + Agreement string/+ + Copyright lang-alt/ + CreditLine string/+ + EmbargoDate date/+ + ExclusivityEndDate date/+ + ExpirationDate date/+ + ImageSizeRestriction string/ + OptionEndDate date/+ + Permissions string/+ + Restrictions string/+ + ReuseProhibited boolean/ + RightsAgent string/ + RightsOwner string/ + +=head3 XMP rdf Tags + +Most RDF attributes are handled internally, but the "about" attribute is +treated specially to allow it to be set to a specific value if required. + +These tags belong to the ExifTool XMP-rdf family 1 group. + + Tag Name Writable + -------- -------- + About string! + +=head3 XMP swf Tags + +Adobe SWF namespace tags. + +These tags belong to the ExifTool XMP-swf family 1 group. + + Tag Name Writable + -------- -------- + BackgroundAlpha integer + ForwardLock boolean + MaxStorage integer + Type string/ + +=head3 XMP tiff Tags + +EXIF namespace for TIFF tags. See +L<https://web.archive.org/web/20180921145139if_/http://www.cipa.jp:80/std/documents/e/DC-010-2017_E.pdf> +for the specification. + +These tags belong to the ExifTool XMP-tiff family 1 group. + + Tag Name Writable + -------- -------- + Artist string + BitsPerSample integer+ + Compression integer + Copyright lang-alt + DateTime date + ImageDescription lang-alt + ImageHeight integer + ImageWidth integer + Make string + Model string + NativeDigest string/ + Orientation integer + PhotometricInterpretation integer + PlanarConfiguration integer + PrimaryChromaticities rational+ + ReferenceBlackWhite rational+ + ResolutionUnit integer + SamplesPerPixel integer + Software string + TransferFunction integer+ + WhitePoint rational+ + XResolution rational + YCbCrCoefficients rational+ + YCbCrPositioning integer + YCbCrSubSampling integer+ + YResolution rational + +=head3 XMP x Tags + +The "x" namespace is used for the "xmpmeta" wrapper, and may contain an +"xmptk" attribute that is extracted as the XMPToolkit tag. When writing, +the XMPToolkit tag is generated automatically by ExifTool unless +specifically set to another value. + +These tags belong to the ExifTool XMP-x family 1 group. + + Tag Name Writable + -------- -------- + XMPToolkit string! + +=head3 XMP xmp Tags + +XMP namespace tags. If the older "xap", "xapBJ", "xapMM" or "xapRights" +namespace prefixes are found, they are translated to the newer "xmp", +"xmpBJ", "xmpMM" and "xmpRights" prefixes for use in family 1 group names. + +These tags belong to the ExifTool XMP-xmp family 1 group. + + Tag Name Writable + -------- -------- + Advisory string+ + Author string/ + BaseURL string + CreateDate date + CreatorTool string + Description lang-alt/ + Format string/ + Identifier string/+ + Keywords string/ + Label string + MetadataDate date + ModifyDate date + Nickname string + PageInfo PageInfo Struct+ + PageImageFormat string_+ + PageImageHeight integer_+ + PageImage string_+ + PageImagePageNumber integer_+ + PageImageWidth integer_+ + Rating real + RatingPercent real/ + Thumbnails Thumbnail Struct+ + ThumbnailFormat string_+ + ThumbnailHeight integer_+ + ThumbnailImage string/_+ + ThumbnailWidth integer_+ + Title lang-alt/ + +=head3 XMP PageInfo Struct + + Field Name Writable + ---------- -------- + PageNumber integer + Format string + Height integer + Image string + Width integer + +=head3 XMP Thumbnail Struct + + Field Name Writable + ---------- -------- + Format string + Height integer + Image string + Width integer + +=head3 XMP xmpBJ Tags + +XMP Basic Job Ticket namespace tags. + +These tags belong to the ExifTool XMP-xmpBJ family 1 group. + + Tag Name Writable + -------- -------- + JobRef JobRef Struct+ + JobRefId string_+ + JobRefName string_+ + JobRefUrl string_+ + +=head3 XMP JobRef Struct + + Field Name Writable + ---------- -------- + Id string + Name string + Url string + +=head3 XMP xmpDM Tags + +XMP Dynamic Media namespace tags. + +These tags belong to the ExifTool XMP-xmpDM family 1 group. + + Tag Name Writable + -------- -------- + AbsPeakAudioFilePath string + Album string + AltTapeName string + AltTimecode Timecode Struct + AltTimecodeTimeFormat string_ + AltTimecodeTimeValue string_ + AltTimecodeValue integer_ + Artist string/ + AudioChannelType string + AudioCompressor string + AudioModDate date + AudioSampleRate integer + AudioSampleType string + BeatSpliceParams BeatSpliceStretch Struct + BeatSpliceParamsRiseInDecibel real_ + BeatSpliceParamsRiseInTimeDuration Time Struct_ + BeatSpliceParamsRiseInTimeDurationScale rational_ + BeatSpliceParamsRiseInTimeDurationValue integer_ + BeatSpliceParamsUseFileBeatsMarker boolean_ + CameraAngle string + CameraLabel string + CameraModel string + CameraMove string + Client string + DMComment string + Composer string + ContributedMedia Media Struct+ + ContributedMediaDuration Time Struct_+ + ContributedMediaDurationScale rational_+ + ContributedMediaDurationValue integer_+ + ContributedMediaManaged boolean_+ + ContributedMediaPath string_+ + ContributedMediaStartTime Time Struct_+ + ContributedMediaStartTimeScale rational_+ + ContributedMediaStartTimeValue integer_+ + ContributedMediaTrack string_+ + ContributedMediaWebStatement string_+ + Copyright string/ + Director string + DirectorPhotography string + DiscNumber string + Duration Time Struct + DurationScale rational_ + DurationValue integer_ + Engineer string + FileDataRate rational + Genre string + Good boolean + Instrument string + IntroTime Time Struct + IntroTimeScale rational_ + IntroTimeValue integer_ + Key string + LogComment string + Loop boolean + Lyrics string + Markers Marker Struct+ + MarkersComment string_+ + MarkersCuePointParams CuePointParam Struct_+ + MarkersCuePointParamsKey string_+ + MarkersCuePointParamsValue string_+ + MarkersCuePointType string_+ + MarkersDuration string_+ + MarkersLocation string_+ + MarkersName string_+ + MarkersProbability real_+ + MarkersSpeaker string_+ + MarkersStartTime string_+ + MarkersTarget string_+ + MarkersType string_+ + MetadataModDate date + NumberOfBeats real + OutCue Time Struct + OutCueScale rational_ + OutCueValue integer_ + PartOfCompilation boolean + ProjectName string + ProjectRef ProjectLink Struct + ProjectRefPath string_ + ProjectRefType string_ + PullDown string + RelativePeakAudioFilePath string + RelativeTimestamp Time Struct + RelativeTimestampScale rational_ + RelativeTimestampValue integer_ + ReleaseDate date + ResampleParams ResampleStretch Struct + ResampleParamsQuality string_ + ScaleType string + Scene string/ + ShotDate date + ShotDay string + ShotLocation string + ShotName string + ShotNumber string + ShotSize string + SpeakerPlacement string + StartTimecode Timecode Struct + StartTimecodeTimeFormat string_ + StartTimecodeTimeValue string_ + StartTimecodeValue integer_ + StartTimeSampleSize integer + StartTimeScale string + StretchMode string + TakeNumber integer + TapeName string + Tempo real + TimeScaleParams TimeScaleStretch Struct + TimeScaleParamsFrameOverlappingPercentage real_ + TimeScaleParamsFrameSize real_ + TimeScaleParamsQuality string_ + TimeSignature string + TrackNumber integer + Tracks Track Struct+ + TracksFrameRate string_+ + TracksMarkers Marker Struct_+ + TracksMarkersComment string_+ + TracksMarkersCuePointParams CuePointParam Struct_+ + TracksMarkersCuePointParamsKey string_+ + TracksMarkersCuePointParamsValue string_+ + TracksMarkersCuePointType string_+ + TracksMarkersDuration string_+ + TracksMarkersLocation string_+ + TracksMarkersName string_+ + TracksMarkersProbability real_+ + TracksMarkersSpeaker string_+ + TracksMarkersStartTime string_+ + TracksMarkersTarget string_+ + TracksMarkersType string_+ + TracksTrackName string_+ + TracksTrackType string_+ + VideoAlphaMode string + VideoAlphaPremultipleColor Colorant Struct + VideoAlphaPremultipleColorA integer_ + VideoAlphaPremultipleColorB integer_ + VideoAlphaPremultipleColorBlack real_ + VideoAlphaPremultipleColorBlue integer_ + VideoAlphaPremultipleColorCyan real_ + VideoAlphaPremultipleColorGray integer_ + VideoAlphaPremultipleColorGreen integer_ + VideoAlphaPremultipleColorL real_ + VideoAlphaPremultipleColorMagenta real_ + VideoAlphaPremultipleColorMode string_ + VideoAlphaPremultipleColorRed integer_ + VideoAlphaPremultipleColorSwatchName string_ + VideoAlphaPremultipleColorTint integer_ + VideoAlphaPremultipleColorType string_ + VideoAlphaPremultipleColorYellow real_ + VideoAlphaUnityIsTransparent boolean + VideoColorSpace string + VideoCompressor string + VideoFieldOrder string + VideoFrameRate real + VideoFrameSize Dimensions Struct + VideoFrameSizeH real_ + VideoFrameSizeUnit string_ + VideoFrameSizeW real_ + VideoModDate date + VideoPixelAspectRatio rational + VideoPixelDepth string + +=head3 XMP BeatSpliceStretch Struct + + Field Name Writable + ---------- -------- + RiseInDecibel real + RiseInTimeDuration Time Struct + UseFileBeatsMarker boolean + +=head3 XMP Time Struct + + Field Name Writable + ---------- -------- + Scale rational + Value integer + +=head3 XMP Media Struct + + Field Name Writable + ---------- -------- + Duration Time Struct + Managed boolean + Path string + StartTime Time Struct + Track string + WebStatement string + +=head3 XMP Marker Struct + + Field Name Writable + ---------- -------- + Comment string + CuePointParams CuePointParam Struct+ + CuePointType string + Duration string + Location string + Name string + Probability real + Speaker string + StartTime string + Target string + Type string + +=head3 XMP CuePointParam Struct + + Field Name Writable + ---------- -------- + Key string + Value string + +=head3 XMP ProjectLink Struct + + Field Name Writable + ---------- -------- + Path string + Type string + +=head3 XMP ResampleStretch Struct + + Field Name Writable + ---------- -------- + Quality string + +=head3 XMP TimeScaleStretch Struct + + Field Name Writable + ---------- -------- + FrameOverlappingPercentage real + FrameSize real + Quality string + +=head3 XMP Track Struct + + Field Name Writable + ---------- -------- + FrameRate string + Markers Marker Struct+ + TrackName string + TrackType string + +=head3 XMP Colorant Struct + + Field Name Writable + ---------- -------- + A integer + B integer + L real + Black real + Blue integer + Cyan real + Gray integer + Green integer + Magenta real + Mode string + Red integer + SwatchName string + Tint integer + Type string + Yellow real + +=head3 XMP Dimensions Struct + + Field Name Writable + ---------- -------- + H real + Unit string + W real + +=head3 XMP xmpMM Tags + +XMP Media Management namespace tags. + +These tags belong to the ExifTool XMP-xmpMM family 1 group. + + Tag Name Writable + -------- -------- + DerivedFrom ResourceRef Struct + DerivedFromAlternatePaths string_+ + DerivedFromDocumentID string_ + DerivedFromFilePath string_ + DerivedFromFromPart string_ + DerivedFromInstanceID string_ + DerivedFromLastModifyDate date_ + DerivedFromLastURL string_ + DerivedFromLinkCategory string_ + DerivedFromLinkForm string_ + DerivedFromManager string_ + DerivedFromManagerVariant string_ + DerivedFromManageTo string_ + DerivedFromManageUI string_ + DerivedFromMaskMarkers string_ + DerivedFromOriginalDocumentID string_ + DerivedFromPartMapping string_ + DerivedFromPlacedResolutionUnit string_ + DerivedFromPlacedXResolution string_ + DerivedFromPlacedYResolution string_ + DerivedFromRenditionClass string_ + DerivedFromRenditionParams string_ + DerivedFromToPart string_ + DerivedFromVersionID string_ + DocumentID string + History ResourceEvent Struct+ + HistoryAction string_+ + HistoryChanged string_+ + HistoryInstanceID string_+ + HistoryParameters string_+ + HistorySoftwareAgent string_+ + HistoryWhen date_+ + Ingredients ResourceRef Struct+ + IngredientsAlternatePaths string_+ + IngredientsDocumentID string_+ + IngredientsFilePath string_+ + IngredientsFromPart string_+ + IngredientsInstanceID string_+ + IngredientsLastModifyDate date_+ + IngredientsLastURL string_+ + IngredientsLinkCategory string_+ + IngredientsLinkForm string_+ + IngredientsManager string_+ + IngredientsManagerVariant string_+ + IngredientsManageTo string_+ + IngredientsManageUI string_+ + IngredientsMaskMarkers string_+ + IngredientsOriginalDocumentID string_+ + IngredientsPartMapping string_+ + IngredientsPlacedResolutionUnit string_+ + IngredientsPlacedXResolution string_+ + IngredientsPlacedYResolution string_+ + IngredientsRenditionClass string_+ + IngredientsRenditionParams string_+ + IngredientsToPart string_+ + IngredientsVersionID string_+ + InstanceID string + LastURL string + ManagedFrom ResourceRef Struct + ManagedFromAlternatePaths string_+ + ManagedFromDocumentID string_ + ManagedFromFilePath string_ + ManagedFromFromPart string_ + ManagedFromInstanceID string_ + ManagedFromLastModifyDate date_ + ManagedFromLastURL string_ + ManagedFromLinkCategory string_ + ManagedFromLinkForm string_ + ManagedFromManager string_ + ManagedFromManagerVariant string_ + ManagedFromManageTo string_ + ManagedFromManageUI string_ + ManagedFromMaskMarkers string_ + ManagedFromOriginalDocumentID string_ + ManagedFromPartMapping string_ + ManagedFromPlacedResolutionUnit string_ + ManagedFromPlacedXResolution string_ + ManagedFromPlacedYResolution string_ + ManagedFromRenditionClass string_ + ManagedFromRenditionParams string_ + ManagedFromToPart string_ + ManagedFromVersionID string_ + Manager string + ManagerVariant string + ManageTo string + ManageUI string + Manifest ManifestItem Struct+ + ManifestLinkForm string_+ + ManifestPlacedResolutionUnit string_+ + ManifestPlacedXResolution real_+ + ManifestPlacedYResolution real_+ + ManifestReference ResourceRef Struct_+ + ManifestReferenceAlternatePaths string_+ + ManifestReferenceDocumentID string_+ + ManifestReferenceFilePath string_+ + ManifestReferenceFromPart string_+ + ManifestReferenceInstanceID string_+ + ManifestReferenceLastModifyDate date_+ + ManifestReferenceLastURL string_+ + ManifestReferenceLinkCategory string_+ + ManifestReferenceLinkForm string_+ + ManifestReferenceManager string_+ + ManifestReferenceManagerVariant string_+ + ManifestReferenceManageTo string_+ + ManifestReferenceManageUI string_+ + ManifestReferenceMaskMarkers string_+ + ManifestReferenceOriginalDocumentID string_+ + ManifestReferencePartMapping string_+ + ManifestReferencePlacedResolutionUnit string_+ + ManifestReferencePlacedXResolution string_+ + ManifestReferencePlacedYResolution string_+ + ManifestReferenceRenditionClass string_+ + ManifestReferenceRenditionParams string_+ + ManifestReferenceToPart string_+ + ManifestReferenceVersionID string_+ + OriginalDocumentID string + Pantry PantryItem Struct+ + PantryInstanceID string_ + PreservedFileName string + RenditionClass string + RenditionOf ResourceRef Struct + RenditionOfAlternatePaths string_+ + RenditionOfDocumentID string_ + RenditionOfFilePath string_ + RenditionOfFromPart string_ + RenditionOfInstanceID string_ + RenditionOfLastModifyDate date_ + RenditionOfLastURL string_ + RenditionOfLinkCategory string_ + RenditionOfLinkForm string_ + RenditionOfManager string_ + RenditionOfManagerVariant string_ + RenditionOfManageTo string_ + RenditionOfManageUI string_ + RenditionOfMaskMarkers string_ + RenditionOfOriginalDocumentID string_ + RenditionOfPartMapping string_ + RenditionOfPlacedResolutionUnit string_ + RenditionOfPlacedXResolution string_ + RenditionOfPlacedYResolution string_ + RenditionOfRenditionClass string_ + RenditionOfRenditionParams string_ + RenditionOfToPart string_ + RenditionOfVersionID string_ + RenditionParams string + SaveID integer + Subject string/+ + VersionID string + Versions Version Struct+ + VersionsComments string_+ + VersionsEvent ResourceEvent Struct_+ + VersionsEventAction string_+ + VersionsEventChanged string_+ + VersionsEventInstanceID string_+ + VersionsEventParameters string_+ + VersionsEventSoftwareAgent string_+ + VersionsEventWhen date_+ + VersionsModifier string_+ + VersionsModifyDate date_+ + VersionsVersion string_+ + +=head3 XMP ResourceRef Struct + + Field Name Writable + ---------- -------- + AlternatePaths string+ + DocumentID string + FilePath string + FromPart string + InstanceID string + LastModifyDate date + LastURL string + LinkCategory string + LinkForm string + ManageTo string + ManageUI string + Manager string + ManagerVariant string + MaskMarkers string + OriginalDocumentID string + PartMapping string + PlacedResolutionUnit string + PlacedXResolution string + PlacedYResolution string + RenditionClass string + RenditionParams string + ToPart string + VersionID string + +=head3 XMP ResourceEvent Struct + + Field Name Writable + ---------- -------- + Action string + Changed string + InstanceID string + Parameters string + SoftwareAgent string + When date + +=head3 XMP ManifestItem Struct + + Field Name Writable + ---------- -------- + LinkForm string + PlacedResolutionUnit string + PlacedXResolution real + PlacedYResolution real + Reference ResourceRef Struct + +=head3 XMP PantryItem Struct + +This structure must have an InstanceID field, but may also contain any other +XMP properties. + + Field Name Writable + ---------- -------- + InstanceID string + +=head3 XMP Version Struct + + Field Name Writable + ---------- -------- + Comments string + Event ResourceEvent Struct + Modifier string + ModifyDate date + Version string + +=head3 XMP xmpNote Tags + +XMP Note namespace tags. + +These tags belong to the ExifTool XMP-xmpNote family 1 group. + + Tag Name Writable + -------- -------- + HasExtendedXMP string* + +=head3 XMP xmpPLUS Tags + +XMP Picture Licensing Universal System (PLUS) tags as written by some older +Adobe applications. See L<PLUS XMP Tags|Image::ExifTool::TagNames/PLUS XMP Tags> +for the current PLUS tags. + +These tags belong to the ExifTool XMP-xmpPLUS family 1 group. + + Tag Name Writable + -------- -------- + CreditLineReq boolean/ + ReuseAllowed boolean/ + +=head3 XMP xmpRights Tags + +XMP Rights Management namespace tags. + +These tags belong to the ExifTool XMP-xmpRights family 1 group. + + Tag Name Writable + -------- -------- + Certificate string + Marked boolean + Owner string+ + UsageTerms lang-alt + WebStatement string + +=head3 XMP xmpTPg Tags + +XMP Paged-Text namespace tags. + +These tags belong to the ExifTool XMP-xmpTPg family 1 group. + + Tag Name Writable + -------- -------- + Colorants Colorant Struct+ + ColorantA integer_+ + ColorantB integer_+ + ColorantBlack real_+ + ColorantBlue integer_+ + ColorantCyan real_+ + ColorantGray integer_+ + ColorantGreen integer_+ + ColorantL real_+ + ColorantMagenta real_+ + ColorantMode string_+ + ColorantRed integer_+ + ColorantSwatchName string_+ + ColorantTint integer_+ + ColorantType string_+ + ColorantYellow real_+ + Fonts Font Struct+ + ChildFontFiles string_+ + FontComposite boolean_+ + FontFace string_+ + FontFamily string_+ + FontFileName string_+ + FontName string_+ + FontType string_+ + FontVersion string_+ + HasVisibleOverprint boolean + HasVisibleTransparency boolean + MaxPageSize Dimensions Struct + MaxPageSizeH real_ + MaxPageSizeUnit string_ + MaxPageSizeW real_ + NPages integer + PlateNames string+ + SwatchGroups SwatchGroup Struct+ + SwatchGroupsColorants Colorant Struct_+ + SwatchColorantA integer_+ + SwatchColorantB integer_+ + SwatchColorantBlack real_+ + SwatchColorantBlue integer_+ + SwatchColorantCyan real_+ + SwatchColorantGray integer_+ + SwatchColorantGreen integer_+ + SwatchColorantL real_+ + SwatchColorantMagenta real_+ + SwatchColorantMode string_+ + SwatchColorantRed integer_+ + SwatchColorantSwatchName string_+ + SwatchColorantTint integer_+ + SwatchColorantType string_+ + SwatchColorantYellow real_+ + SwatchGroupName string_+ + SwatchGroupType integer_+ + +=head3 XMP Font Struct + + Field Name Writable + ---------- -------- + ChildFontFiles string+ + Composite boolean + FontFace string + FontFamily string + FontFileName string + FontName string + FontType string + VersionString string + +=head3 XMP SwatchGroup Struct + + Field Name Writable + ---------- -------- + Colorants Colorant Struct+ + GroupName string + GroupType integer + +=head3 XMP XML Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'dc' dc XMP dc + 'lastUpdate' LastUpdate no + +=head3 XMP SVG Tags + +SVG (Scalable Vector Graphics) image tags. By default, only the top-level +SVG and Metadata tags are extracted from these images, but all graphics tags +may be extracted by setting the Unknown option to 2 (-U on the command +line). The SVG tags are not part of XMP as such, but are included with the +XMP module for convenience. (see L<http://www.w3.org/TR/SVG11/>) + +These tags belong to the ExifTool XMP-svg family 1 group. + + Tag ID Tag Name Writable + ------ -------- -------- + 'height' ImageHeight no + 'id' ID no + 'metadataId' MetadataID no + 'version' SVGVersion no + 'width' ImageWidth no + +=head2 GPS Tags + +These GPS tags are part of the EXIF standard, and are stored in a separate +IFD within the EXIF information. + +ExifTool is very flexible about the input format when writing lat/long +coordinates, and will accept from 1 to 3 floating point numbers (for decimal +degrees, degrees and minutes, or degrees, minutes and seconds) separated by +just about anything, and will format them properly according to the EXIF +specification. + +Some GPS tags have values which are fixed-length strings. For these, the +indicated string lengths include a null terminator which is added +automatically by ExifTool. Remember that the descriptive values are used +when writing (eg. 'Above Sea Level', not '0') unless the print conversion is +disabled (with '-n' on the command line or the PrintConv option in the API, +or by suffixing the tag name with a C<#> character). + +When adding GPS information to an image, it is important to set all of the +following tags: GPSLatitude, GPSLatitudeRef, GPSLongitude, GPSLongitudeRef, +and GPSAltitude and GPSAltitudeRef if the altitude is known. ExifTool will +write the required GPSVersionID tag automatically if new a GPS IFD is added +to an image. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 GPSVersionID int8u[4]: + 0x0001 GPSLatitudeRef string[2] + 0x0002 GPSLatitude rational64u[3] + 0x0003 GPSLongitudeRef string[2] + 0x0004 GPSLongitude rational64u[3] + 0x0005 GPSAltitudeRef int8u + 0x0006 GPSAltitude rational64u + 0x0007 GPSTimeStamp rational64u[3] + 0x0008 GPSSatellites string + 0x0009 GPSStatus string[2] + 0x000a GPSMeasureMode string[2] + 0x000b GPSDOP rational64u + 0x000c GPSSpeedRef string[2] + 0x000d GPSSpeed rational64u + 0x000e GPSTrackRef string[2] + 0x000f GPSTrack rational64u + 0x0010 GPSImgDirectionRef string[2] + 0x0011 GPSImgDirection rational64u + 0x0012 GPSMapDatum string + 0x0013 GPSDestLatitudeRef string[2] + 0x0014 GPSDestLatitude rational64u[3] + 0x0015 GPSDestLongitudeRef string[2] + 0x0016 GPSDestLongitude rational64u[3] + 0x0017 GPSDestBearingRef string[2] + 0x0018 GPSDestBearing rational64u + 0x0019 GPSDestDistanceRef string[2] + 0x001a GPSDestDistance rational64u + 0x001b GPSProcessingMethod undef + 0x001c GPSAreaInformation undef + 0x001d GPSDateStamp string[11] + 0x001e GPSDifferential int16u + 0x001f GPSHPositioningError rational64u + +=head2 GeoTiff Tags + +ExifTool extracts the following tags from GeoTIFF images. See +L<http://www.remotesensing.org/geotiff/spec/geotiffhome.html> for the +complete GeoTIFF specification. Also included in the table below are +ChartTIFF tags (see L<http://www.charttiff.com/whitepapers.shtml>). GeoTIFF +tags are not writable individually, but they may be copied en mass via the +block tags GeoTiffDirectory, GeoTiffDoubleParams and GeoTiffAsciiParams. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 GeoTiffVersion no + 0x0400 GTModelType no + 0x0401 GTRasterType no + 0x0402 GTCitation no + 0x0800 GeographicType no + 0x0801 GeogCitation no + 0x0802 GeogGeodeticDatum no + 0x0803 GeogPrimeMeridian no + 0x0804 GeogLinearUnits no + 0x0805 GeogLinearUnitSize no + 0x0806 GeogAngularUnits no + 0x0807 GeogAngularUnitSize no + 0x0808 GeogEllipsoid no + 0x0809 GeogSemiMajorAxis no + 0x080a GeogSemiMinorAxis no + 0x080b GeogInvFlattening no + 0x080c GeogAzimuthUnits no + 0x080d GeogPrimeMeridianLong no + 0x080e GeogToWGS84 no + 0x0c00 ProjectedCSType no + 0x0c01 PCSCitation no + 0x0c02 Projection no + 0x0c03 ProjCoordTrans no + 0x0c04 ProjLinearUnits no + 0x0c05 ProjLinearUnitSize no + 0x0c06 ProjStdParallel1 no + 0x0c07 ProjStdParallel2 no + 0x0c08 ProjNatOriginLong no + 0x0c09 ProjNatOriginLat no + 0x0c0a ProjFalseEasting no + 0x0c0b ProjFalseNorthing no + 0x0c0c ProjFalseOriginLong no + 0x0c0d ProjFalseOriginLat no + 0x0c0e ProjFalseOriginEasting no + 0x0c0f ProjFalseOriginNorthing no + 0x0c10 ProjCenterLong no + 0x0c11 ProjCenterLat no + 0x0c12 ProjCenterEasting no + 0x0c13 ProjCenterNorthing no + 0x0c14 ProjScaleAtNatOrigin no + 0x0c15 ProjScaleAtCenter no + 0x0c16 ProjAzimuthAngle no + 0x0c17 ProjStraightVertPoleLong no + 0x0c18 ProjRectifiedGridAngle no + 0x1000 VerticalCSType no + 0x1001 VerticalCitation no + 0x1002 VerticalDatum no + 0x1003 VerticalUnits no + 0xb799 ChartFormat no + 0xb79a ChartSource no + 0xb79b ChartSourceEdition no + 0xb79c ChartSourceDate no + 0xb79d ChartCorrDate no + 0xb79e ChartCountryOrigin no + 0xb79f ChartRasterEdition no + 0xb7a0 ChartSoundingDatum no + 0xb7a1 ChartDepthUnits no + 0xb7a2 ChartMagVar no + 0xb7a3 ChartMagVarYear no + 0xb7a4 ChartMagVarAnnChange no + 0xb7a5 ChartWGSNSShift no + 0xb7a7 InsetNWPixelX no + 0xb7a8 InsetNWPixelY no + 0xb7a9 ChartContourInterval no + +=head2 PLUS Tags + +=head3 PLUS XMP Tags + +PLUS (Picture Licensing Universal System) License Data Format 1.2.1 XMP +tags. Note that all controlled-vocabulary tags in this table (ie. tags with +a fixed set of values) have raw values which begin with +"http://ns.useplus.org/ldf/vocab/", but to reduce clutter this prefix has +been removed from the values shown below. See L<http://ns.useplus.org/> for +the complete specification. + +These tags belong to the ExifTool XMP-plus family 1 group. + + Tag Name Writable + -------- -------- + AdultContentWarning string + CopyrightOwner CopyrightOwner Struct+ + CopyrightOwnerID string_+ + CopyrightOwnerName string_+ + CopyrightOwnerImageID string + CopyrightRegistrationNumber string + CopyrightStatus string + CreditLineRequired string + Custom1 lang-alt+ + Custom10 lang-alt+ + Custom2 lang-alt+ + Custom3 lang-alt+ + Custom4 lang-alt+ + Custom5 lang-alt+ + Custom6 lang-alt+ + Custom7 lang-alt+ + Custom8 lang-alt+ + Custom9 lang-alt+ + EndUser EndUser Struct+ + EndUserID string_+ + EndUserName string_+ + FileNameAsDelivered string + FirstPublicationDate date + ImageAlterationConstraints string+ + ImageCreator ImageCreator Struct+ + ImageCreatorID string_+ + ImageCreatorName string_+ + ImageCreatorImageID string + ImageDuplicationConstraints string + ImageFileConstraints string+ + ImageFileFormatAsDelivered string + ImageFileSizeAsDelivered string + ImageSupplier ImageSupplier Struct+ + ImageSupplierImageID string + ImageSupplierID string_+ + ImageSupplierName string_+ + ImageType string + Licensee Licensee Struct+ + LicenseeImageID string + LicenseeImageNotes lang-alt + LicenseeID string_+ + LicenseeName string_+ + LicenseEndDate date + LicenseeProjectReference string+ + LicenseeTransactionID string+ + LicenseID string + LicenseStartDate date + LicenseTransactionDate date + Licensor Licensor Struct+ + LicensorImageID string + LicensorCity string_+ + LicensorCountry string_+ + LicensorEmail string_+ + LicensorExtendedAddress string_+ + LicensorID string_+ + LicensorName string_+ + LicensorPostalCode string_+ + LicensorRegion string_+ + LicensorStreetAddress string_+ + LicensorTelephone1 string_+ + LicensorTelephone2 string_+ + LicensorTelephoneType1 string_+ + LicensorTelephoneType2 string_+ + LicensorURL string_+ + LicensorNotes lang-alt + LicensorTransactionID string+ + MediaConstraints lang-alt + MediaSummaryCode string + MinorModelAgeDisclosure string + ModelReleaseID string+ + ModelReleaseStatus string + OtherConditions lang-alt + OtherConstraints lang-alt + OtherImageInfo lang-alt + OtherLicenseDocuments string+ + OtherLicenseInfo lang-alt + OtherLicenseRequirements lang-alt + ProductOrServiceConstraints lang-alt + PropertyReleaseID string+ + PropertyReleaseStatus string + RegionConstraints lang-alt + Reuse string + TermsAndConditionsText lang-alt + TermsAndConditionsURL string + PLUSVersion string + +=head3 XMP CopyrightOwner Struct + + Field Name Writable + ---------- -------- + CopyrightOwnerID string + CopyrightOwnerName string + +=head3 XMP EndUser Struct + + Field Name Writable + ---------- -------- + EndUserID string + EndUserName string + +=head3 XMP ImageCreator Struct + + Field Name Writable + ---------- -------- + ImageCreatorID string + ImageCreatorName string + +=head3 XMP ImageSupplier Struct + + Field Name Writable + ---------- -------- + ImageSupplierID string + ImageSupplierName string + +=head3 XMP Licensee Struct + + Field Name Writable + ---------- -------- + LicenseeID string + LicenseeName string + +=head3 XMP Licensor Struct + + Field Name Writable + ---------- -------- + LicensorCity string + LicensorCountry string + LicensorEmail string + LicensorExtendedAddress string + LicensorID string + LicensorName string + LicensorPostalCode string + LicensorRegion string + LicensorStreetAddress string + LicensorTelephone1 string + LicensorTelephone2 string + LicensorTelephoneType1 string + LicensorTelephoneType2 string + LicensorURL string + +=head2 ICC_Profile Tags + +ICC profile information is used in many different file types including JPEG, +TIFF, PDF, PostScript, Photoshop, PNG, MIFF, PICT, QuickTime, XCF and some +RAW formats. While the tags listed below are not individually writable, the +entire profile itself can be accessed via the extra 'ICC_Profile' tag, but +this tag is neither extracted nor written unless specified explicitly. See +L<http://www.color.org/icc_specs2.xalter> for the official ICC +specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'A2B0' AToB0 no + 'A2B1' AToB1 no + 'A2B2' AToB2 no + 'A2B3' AToB3 no + 'A2M0' AToM0 no + 'B2A0' BToA0 no + 'B2A1' BToA1 no + 'B2A2' BToA2 no + 'B2A3' BToA3 no + 'B2D0' BToD0 no + 'B2D1' BToD1 no + 'B2D2' BToD2 no + 'B2D3' BToD3 no + 'CxF ' CXF no + 'D2B0' DToB0 no + 'D2B1' DToB1 no + 'D2B2' DToB2 no + 'D2B3' DToB3 no + 'Header' ProfileHeader ICC_Profile Header + 'M2A0' MToA0 no + 'M2B0' MToB0 no + 'M2B1' MToB1 no + 'M2B2' MToB2 no + 'M2B3' MToB3 no + 'M2S0' MToS0 no + 'M2S1' MToS1 no + 'M2S2' MToS2 no + 'M2S3' MToS3 no + 'MS00' WCSProfiles no + 'bAB0' BRDFAToB0 no + 'bAB1' BRDFAToB1 no + 'bAB2' BRDFAToB2 no + 'bAB3' BRDFAToB3 no + 'bBA0' BRDFBToA0 no + 'bBA1' BRDFBToA1 no + 'bBA2' BRDFBToA2 no + 'bBA3' BRDFBToA3 no + 'bBD0' BRDFBToD0 no + 'bBD1' BRDFBToD1 no + 'bBD2' BRDFBToD2 no + 'bBD3' BRDFBToD3 no + 'bDB0' BRDFDToB0 no + 'bDB1' BRDFDToB1 no + 'bDB2' BRDFDToB2 no + 'bDB3' BRDFDToB3 no + 'bMB0' BRDFMToB0 no + 'bMB1' BRDFMToB1 no + 'bMB2' BRDFMToB2 no + 'bMB3' BRDFMToB3 no + 'bMS0' BRDFMToS0 no + 'bMS1' BRDFMToS1 no + 'bMS2' BRDFMToS2 no + 'bMS3' BRDFMToS3 no + 'bTRC' BlueTRC no + 'bXYZ' BlueMatrixColumn no + 'bcp0' BRDFColorimetricParam0 no + 'bcp1' BRDFColorimetricParam1 no + 'bcp2' BRDFColorimetricParam2 no + 'bcp3' BRDFColorimetricParam3 no + 'bfd ' UCRBG no + 'bkpt' MediaBlackPoint no + 'bsp0' BRDFSpectralParam0 no + 'bsp1' BRDFSpectralParam1 no + 'bsp2' BRDFSpectralParam2 no + 'bsp3' BRDFSpectralParam3 no + 'c2sp' CustomToStandardPcc no + 'calt' CalibrationDateTime no + 'cept' ColorEncodingParams no + 'chad' ChromaticAdaptation no + 'chrm' Chromaticity ICC_Profile Chromaticity + 'ciis' ColorimetricIntentImageState no + 'clio' ColorantInfoOut no + 'cloo' ColorantOrderOut no + 'clot' ColorantTableOut no + 'clro' ColorantOrder no + 'clrt' ColorantTable ICC_Profile ColorantTable + 'cprt' ProfileCopyright no + 'crdi' CRDInfo no + 'csnm' ColorSpaceName no + 'dAB0' DirectionalAToB0 no + 'dAB1' DirectionalAToB1 no + 'dAB2' DirectionalAToB2 no + 'dAB3' DirectionalAToB3 no + 'dBA0' DirectionalBToA0 no + 'dBA1' DirectionalBToA1 no + 'dBA2' DirectionalBToA2 no + 'dBA3' DirectionalBToA3 no + 'dBD0' DirectionalBToD0 no + 'dBD1' DirectionalBToD1 no + 'dBD2' DirectionalBToD2 no + 'dBD3' DirectionalBToD3 no + 'dDB0' DirectionalDToB0 no + 'dDB1' DirectionalDToB1 no + 'dDB2' DirectionalDToB2 no + 'dDB3' DirectionalDToB3 no + 'desc' ProfileDescription no + 'devs' DeviceSettings no + 'dmdd' DeviceModelDesc no + 'dmnd' DeviceMfgDesc no + 'dscm' ProfileDescriptionML no + 'fpce' FocalPlaneColorimetryEstimates no + 'gTRC' GreenTRC no + 'gXYZ' GreenMatrixColumn no + 'gamt' Gamut no + 'gdb0' GamutBoundaryDescription0 no + 'gdb1' GamutBoundaryDescription1 no + 'gdb2' GamutBoundaryDescription2 no + 'gdb3' GamutBoundaryDescription3 no + 'kTRC' GrayTRC no + 'lumi' Luminance no + 'mcta' MultiplexTypeArray no + 'mdv ' MultiplexDefaultValues no + 'meas' Measurement ICC_Profile Measurement + 'meta' Metadata ICC_Profile Metadata + 'miin' MeasurementInputInfo no + 'minf' MeasurementInfo no + 'mmod' MakeAndModel no + 'ncl2' NamedColor2 no + 'ncol' NamedColor no + 'ndin' NativeDisplayInfo no + 'nmcl' NamedColor no + 'pre0' Preview0 no + 'pre1' Preview1 no + 'pre2' Preview2 no + 'ps2i' PS2RenderingIntent no + 'ps2s' PostScript2CSA no + 'psd0' PostScript2CRD0 no + 'psd1' PostScript2CRD1 no + 'psd2' PostScript2CRD2 no + 'psd3' PostScript2CRD3 no + 'pseq' ProfileSequenceDesc no + 'psid' ProfileSequenceIdentifier no + 'psin' ProfileSequenceInfo no + 'psvm' PS2CRDVMSize no + 'rTRC' RedTRC no + 'rXYZ' RedMatrixColumn no + 'resp' OutputResponse no + 'rfnm' ReferenceName no + 'rhoc' ReflectionHardcopyOrigColorimetry no + 'rig0' PerceptualRenderingIntentGamut no + 'rig2' SaturationRenderingIntentGamut no + 'rpoc' ReflectionPrintOutputColorimetry no + 's2cp' StandardToCustomPcc no + 'sape' SceneAppearanceEstimates no + 'scoe' SceneColorimetryEstimates no + 'scrd' ScreeningDesc no + 'scrn' Screening no + 'smap' SurfaceMap no + 'svcn' SpectralViewingConditions no + 'swpt' SpectralWhitePoint no + 'targ' CharTarget no + 'tech' Technology no + 'vcgt' VideoCardGamma no + 'view' ViewingConditions ICC_Profile ViewingConditions + 'vued' ViewingCondDesc no + 'wtpt' MediaWhitePoint no + +=head3 ICC_Profile Header Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 ProfileCMMType no + 8 ProfileVersion no + 12 ProfileClass no + 16 ColorSpaceData no + 20 ProfileConnectionSpace no + 24 ProfileDateTime no + 36 ProfileFileSignature no + 40 PrimaryPlatform no + 44 CMMFlags no + 48 DeviceManufacturer no + 52 DeviceModel no + 56 DeviceAttributes no + 64 RenderingIntent no + 68 ConnectionSpaceIlluminant no + 80 ProfileCreator no + 84 ProfileID no + +=head3 ICC_Profile Chromaticity Tags + + Index1 Tag Name Writable + ------ -------- -------- + 8 ChromaticityChannels no + 10 ChromaticityColorant no + 12 ChromaticityChannel1 no + 20 ChromaticityChannel2 no + 28 ChromaticityChannel3 no + 36 ChromaticityChannel4 no + +=head3 ICC_Profile ColorantTable Tags + + Index1 Tag Name Writable + ------ -------- -------- + 8 ColorantCount no + 12 Colorant1Name no + 44 Colorant1Coordinates no + 50 Colorant2Name no + 82 Colorant2Coordinates no + 88 Colorant3Name no + 120 Colorant3Coordinates no + +=head3 ICC_Profile Measurement Tags + + Index1 Tag Name Writable + ------ -------- -------- + 8 MeasurementObserver no + 12 MeasurementBacking no + 24 MeasurementGeometry no + 28 MeasurementFlare no + 32 MeasurementIlluminant no + +=head3 ICC_Profile Metadata Tags + +Only these few tags have been pre-defined, but ExifTool will extract any +Metadata tags that exist. + + Tag Name Writable + -------- -------- + CreatorApp no + ManufacturerName no + MediaColor no + MediaWeight no + +=head3 ICC_Profile ViewingConditions Tags + + Index1 Tag Name Writable + ------ -------- -------- + 8 ViewingCondIlluminant no + 20 ViewingCondSurround no + 32 ViewingCondIlluminantType no + +=head2 PrintIM Tags + +The format of the PrintIM information is known, however no PrintIM tags have +been decoded. Use the Unknown (-u) option to extract PrintIM information. + + Tag ID Tag Name Writable + ------ -------- -------- + 'PrintIMVersion' PrintIMVersion no + +=head2 Photoshop Tags + +Photoshop tags are found in PSD and PSB files, as well as inside embedded +Photoshop information in many other file types (JPEG, TIFF, PDF, PNG to name +a few). + +Many Photoshop tags are marked as Unknown (indicated by a question mark +after the tag name) because the information they provide is not very useful +under normal circumstances. These unknown tags are not extracted unless the +Unknown (-u) option is used. See +L<http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/> for the +official specification + +Photoshop path tags (Tag ID's 0x7d0 to 0xbb5) are not defined by default, +but a config file included in the full ExifTool distribution +(config_files/photoshop_paths.config) contains the tag definitions to allow +access to this information. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x03e8 Photoshop2Info? no + 0x03e9 MacintoshPrintInfo? no + 0x03ea XMLData? no + 0x03eb Photoshop2ColorTable? no + 0x03ed ResolutionInfo Photoshop Resolution + 0x03ee AlphaChannelsNames no + 0x03ef DisplayInfo? no + 0x03f0 PStringCaption? no + 0x03f1 BorderInformation? no + 0x03f2 BackgroundColor? no + 0x03f3 PrintFlags? no + 0x03f4 BW_HalftoningInfo? no + 0x03f5 ColorHalftoningInfo? no + 0x03f6 DuotoneHalftoningInfo? no + 0x03f7 BW_TransferFunc? no + 0x03f8 ColorTransferFuncs? no + 0x03f9 DuotoneTransferFuncs? no + 0x03fa DuotoneImageInfo? no + 0x03fb EffectiveBW? no + 0x03fc ObsoletePhotoshopTag1? no + 0x03fd EPSOptions? no + 0x03fe QuickMaskInfo? no + 0x03ff ObsoletePhotoshopTag2? no + 0x0400 TargetLayerID? no + 0x0401 WorkingPath? no + 0x0402 LayersGroupInfo? no + 0x0403 ObsoletePhotoshopTag3? no + 0x0404 IPTCData IPTC + 0x0405 RawImageMode? no + 0x0406 JPEG_Quality Photoshop JPEG_Quality + 0x0408 GridGuidesInfo? no + 0x0409 PhotoshopBGRThumbnail undef! + 0x040a CopyrightFlag int8u + 0x040b URL string + 0x040c PhotoshopThumbnail undef! + 0x040d GlobalAngle int32u + 0x040e ColorSamplersResource? no + 0x040f ICC_Profile ICC_Profile + 0x0410 Watermark? no + 0x0411 ICC_Untagged? no + 0x0412 EffectsVisible? no + 0x0413 SpotHalftone? no + 0x0414 IDsBaseValue? no + 0x0415 UnicodeAlphaNames? no + 0x0416 IndexedColorTableCount? no + 0x0417 TransparentIndex? no + 0x0419 GlobalAltitude int32u + 0x041a SliceInfo Photoshop SliceInfo + 0x041b WorkflowURL no + 0x041c JumpToXPEP? no + 0x041d AlphaIdentifiers? no + 0x041e URL_List no+ + 0x0421 VersionInfo Photoshop VersionInfo + 0x0422 EXIFInfo EXIF + 0x0423 ExifInfo2? no + 0x0424 XMP XMP + 0x0425 IPTCDigest string! + 0x0426 PrintScaleInfo Photoshop PrintScaleInfo + 0x0428 PixelInfo Photoshop PixelInfo + 0x0429 LayerComps? no + 0x042a AlternateDuotoneColors? no + 0x042b AlternateSpotColors? no + 0x042d LayerSelectionIDs? no + 0x042e HDRToningInfo? no + 0x042f PrintInfo? no + 0x0430 LayerGroupsEnabledID? no + 0x0431 ColorSamplersResource2? no + 0x0432 MeasurementScale? no + 0x0433 TimelineInfo? no + 0x0434 SheetDisclosure? no + 0x0435 DisplayInfo? no + 0x0436 OnionSkins? no + 0x0438 CountInfo? no + 0x043a PrintInfo2? no + 0x043b PrintStyle? no + 0x043c MacintoshNSPrintInfo? no + 0x043d WindowsDEVMODE? no + 0x043e AutoSaveFilePath? no + 0x043f AutoSaveFormat? no + 0x0440 PathSelectionState? no + 0x0bb7 ClippingPathName no + 0x0bb8 OriginPathInfo? no + 0x1b58 ImageReadyVariables? no + 0x1b59 ImageReadyDataSets? no + 0x1f40 LightroomWorkflow? no + 0x2710 PrintFlagsInfo? no + +=head3 Photoshop Resolution Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 XResolution int32u + 2 DisplayedUnitsX int16u + 4 YResolution int32u + 6 DisplayedUnitsY int16u + +=head3 Photoshop JPEG_Quality Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 PhotoshopQuality int16s + 1 PhotoshopFormat no + 2 ProgressiveScans no + +=head3 Photoshop SliceInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 20 SlicesGroupName no + 24 NumSlices no + +=head3 Photoshop VersionInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 HasRealMergedData no + 5 WriterName no + 9 ReaderName no + +=head3 Photoshop PrintScaleInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 PrintStyle no + 2 PrintPosition no + 10 PrintScale no + +=head3 Photoshop PixelInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 PixelAspectRatio no + +=head3 Photoshop DocumentData Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Layr' Layers Photoshop Layers + 'Lr16' Layers Photoshop Layers + +=head3 Photoshop Layers Tags + +Tags extracted from Photoshop layer information. + + Tag ID Tag Name Writable + ------ -------- -------- + '_xbnd' LayerBlendModes no+ + '_xcnt' LayerCount no + '_xnam' LayerNames no+ + '_xopc' LayerOpacities no+ + '_xrct' LayerRectangles no+ + 'luni' LayerUnicodeNames no+ + 'lyid' LayerIDs? no+ + 'shmd' LayerModifyDates no+ + +=head3 Photoshop Header Tags + +This information is found in the PSD file header. + + Index2 Tag Name Writable + ------ -------- -------- + 6 NumChannels no + 7 ImageHeight no + 9 ImageWidth no + 11 BitDepth no + 12 ColorMode no + +=head3 Photoshop ImageData Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 Compression no + +=head2 Apple Tags + +Tags extracted from the maker notes of iPhone images. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0003 RunTime Apple RunTime + 0x0008 AccelerationVector rational64s[3] + 0x000a HDRImageType int32s + 0x000b BurstUUID string + 0x000c FocusDistanceRange rational64s[2] + 0x0011 MediaGroupUUID string + 0x0015 ImageUniqueID string + +=head3 Apple RunTime Tags + +This PLIST-format information contains the elements of a CMTime structure +representing the amount of time the phone has been running since the last +boot, not including standby time. + + Tag ID Tag Name Writable + ------ -------- -------- + 'epoch' RunTimeEpoch no + 'flags' RunTimeFlags no + 'timescale' RunTimeScale no + 'value' RunTimeValue no + +=head2 NikonSettings Tags + +User settings for newer Nikon models. A number of the tags are marked as +Unknown only to reduce the volume of the normal output. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 ISOAutoHiLimit no + 0x0002 ISOAutoFlashLimit no + 0x0003 ISOAutoShutterTime no + 0x000b FlickerReductionShooting no + 0x000c FlickerReductionIndicator no + 0x000d MovieISOAutoHiLimit no + 0x000e MovieISOAutoControlManualMode no + 0x000f MovieWhiteBalanceSameAsPhoto no + 0x001d AF-CPrioritySel no + 0x001e AF-SPrioritySel no + 0x0020 AFPointSel no + 0x0022 AFActivation no + 0x0023 FocusPointWrap no + 0x0025 ManualFocusPointIllumination no + 0x0026 AF-AssistIlluminator no + 0x0027 ManualFocusRingInAFMode no + 0x0029 ISOStepSize no + 0x002a ExposureControlStepSize no + 0x002b EasyExposureCompensation no + 0x002c MatrixMetering no + 0x002d CenterWeightedAreaSize no + 0x002f FineTuneOptMatrixMetering no + 0x0030 FineTuneOptCenterWeighted no + 0x0031 FineTuneOptSpotMetering no + 0x0032 FineTuneOptHighlightWeighted no + 0x0033 ShutterReleaseButtonAE-L no + 0x0034 StandbyMonitorOffTime no + 0x0035 SelfTimerTime no + 0x0036 SelfTimerShotCount no + 0x0037 SelfTimerShotInterval no + 0x0038 PlaybackMonitorOffTime no + 0x0039 MenuMonitorOffTime no + 0x003a ShootingInfoMonitorOffTime no + 0x003b ImageReviewMonitorOffTime no + 0x003c LiveViewMonitorOffTime no + 0x003e CLModeShootingSpeed no + 0x003f MaxContinuousRelease no + 0x0040 ExposureDelayMode no + 0x0041 ElectronicFront-CurtainShutter no + 0x0042 FileNumberSequence no + 0x0043 FramingGridDisplay no + 0x0045 LCDIllumination no + 0x0046 OpticalVR no + 0x0047 FlashSyncSpeed no + 0x0048 FlashShutterSpeed no + 0x0049 FlashExposureCompArea no + 0x004a AutoFlashISOSensitivity no + 0x0051 AssignBktButton no + 0x0052 AssignMovieRecordButton no + 0x0053 MultiSelectorShootMode no + 0x0054 MultiSelectorPlaybackMode no + 0x0056 MultiSelectorLiveView no + 0x0058 CmdDialsReverseRotExposureComp? no + 0x0059 CmdDialsChangeMainSubExposure? no + 0x005a CmdDialsChangeMainSub no + 0x005b CmdDialsMenuAndPlayback no + 0x005c SubDialFrameAdvance no + 0x005d ReleaseButtonToUseDial no + 0x005e ReverseIndicators no + 0x0062 MovieShutterButton no + 0x0063 Language no + 0x006c ShootingInfoDisplay no + 0x0074 FlickAdvanceDirection no + 0x0075 HDMIOutputResolution no + 0x0077 HDMIOutputRange no + 0x0080 RemoteFuncButton no + 0x008b CmdDialsReverseRotation no + 0x008d FocusPeakingHighlightColor no + 0x008e ContinuousModeDisplay no + 0x008f ShutterSpeedLock no + 0x0090 ApertureLock no + 0x0091 MovieHighlightDisplayThreshold no + 0x0092 HDMIExternalRecorder no + 0x0093 BlockShotAFResponse no + 0x0094 SubjectMotion no + 0x0095 Three-DTrackingFaceDetection no + 0x0097 StoreByOrientation no + 0x0099 DynamicAreaAFAssist no + 0x009a ExposureCompStepSize no + 0x009b SyncReleaseMode no + 0x009c ModelingFlash no + 0x009d AutoBracketModeM no + 0x009e PreviewButton no + 0x00a0 Func1Button no + 0x00a2 Func2Button no + 0x00a3 AF-OnButton no + 0x00a4 SubSelector no + 0x00a5 SubSelectorCenter no + 0x00a7 LensFunc1Button no + 0x00a8 CmdDialsApertureSetting no + 0x00a9 MultiSelector no + 0x00aa LiveViewButtonOptions no + 0x00ab LightSwitch no + 0x00b1 MoviePreviewButton no + MovieFunc1Button no + 0x00b3 MovieFunc1Button no + MovieFunc2Button no + 0x00b5 MovieFunc2Button no + 0x00b6 AssignMovieSubselector no + 0x00b8 LimitAFAreaModeSelD9? no + 0x00b9 LimitAFAreaModeSelD25? no + 0x00bc LimitAFAreaModeSel3D? no + 0x00bd LimitAFAreaModeSelGroup? no + 0x00be LimitAFAreaModeSelAuto? no + 0x00c1 LimitSelectableImageArea5To4? no + 0x00c2 LimitSelectableImageArea1To1? no + 0x00d4 PhotoShootingMenuBank no + 0x00d5 CustomSettingsBank no + 0x00d6 LimitAF-AreaModeSelPinpoint? no + 0x00d7 LimitAF-AreaModeSelDynamic? no + 0x00d8 LimitAF-AreaModeSelWideAF_S? no + 0x00d9 LimitAF-AreaModeSelWideAF_L? no + 0x00da LowLightAF no + 0x00db LimitSelectableImageAreaDX? no + 0x00dc LimitSelectableImageArea5To4? no + 0x00dd LimitSelectableImageArea1To1? no + 0x00de LimitSelectableImageArea16To9? no + 0x00df ApplySettingsToLiveView no + 0x00e0 FocusPeakingLevel no + 0x00ea LensControlRing no + 0x00ed MovieMultiSelector no + 0x00ee MovieAFSpeed no + 0x00ef MovieAFSpeedApply no + 0x00f0 MovieAFTrackingSensitivity no + 0x00f1 MovieHighlightDisplayPattern no + 0x00f2 SubDialFrameAdvanceRating5? no + 0x00f3 SubDialFrameAdvanceRating4? no + 0x00f4 SubDialFrameAdvanceRating3? no + 0x00f5 SubDialFrameAdvanceRating2? no + 0x00f6 SubDialFrameAdvanceRating1? no + 0x00f7 SubDialFrameAdvanceRating0? no + 0x00f9 MovieAF-OnButton no + 0x00fb SecondarySlotFunction no + 0x00fc SilentPhotography no + 0x00fd ExtendedShutterSpeeds no + 0x0102 HDMIBitDepth no + 0x0103 HDMIOutputHDR no + 0x0104 HDMIViewAssist no + 0x0109 BracketSet no + 0x010a BracketProgram no + 0x010b BracketIncrement no + 0x010c BracketIncrement no + 0x010e MonitorBrightness no + 0x0116 GroupAreaC1 no + 0x0117 AutoAreaAFStartingPoint no + 0x0118 FocusPointPersistence no + 0x0119 LimitAFAreaModeSelD49? no + 0x011a LimitAFAreaModeSelD105? no + 0x011b LimitAFAreaModeSelGroupC1? no + 0x011c LimitAFAreaModeSelGroupC2? no + 0x011d AutoFocusModeRestrictions no + 0x011e FocusPointBrightness no + 0x011f CHModeShootingSpeed no + 0x0120 CLModeShootingSpeed no + 0x0121 QuietShutterShootingSpeed no + 0x0122 LimitReleaseModeSelCL? no + 0x0123 LimitReleaseModeSelCH? no + 0x0124 LimitReleaseModeSelQ? no + 0x0125 LimitReleaseModeSelTimer? no + 0x0126 LimitReleaseModeSelMirror-Up? no + 0x0127 LimitSelectableImageArea16To9? no + 0x0128 RearControPanelDisplay no + 0x0129 FlashBurstPriority no + 0x012a RecallShootFuncExposureMode no + 0x012b RecallShootFuncShutterSpeed no + 0x012c RecallShootFuncAperture no + 0x012d RecallShootFuncExposureComp no + 0x012e RecallShootFuncISO no + 0x012f RecallShootFuncMeteringMode no + 0x0130 RecallShootFuncWhiteBalance no + 0x0131 RecallShootFuncAFAreaMode no + 0x0132 RecallShootFuncFocusTracking no + 0x0133 RecallShootFuncAF-On no + 0x0134 VerticalFuncButton no + 0x0135 Func3Button no + 0x0136 VerticalAF-OnButton no + 0x0137 VerticalMultiSelector no + 0x0138 MeteringButton no + 0x0139 PlaybackFlickUp no + 0x013a PlaybackFlickUpRating no + 0x013b PlaybackFlickDown no + 0x013c PlaybackFlickDownRating no + 0x013d MovieFunc3Button no + 0x0150 ShutterType no + 0x0151 LensFunc2Button no + 0x0158 USBPowerDelivery no + 0x0159 EnergySavingMode no + 0x015c BracketingBurstOptions no + 0x015e PrimarySlot no + 0x015f ReverseFocusRing no + 0x0160 VerticalFuncButton no + 0x0161 VerticalAFOnButton no + 0x0162 VerticalMultiSelector no + 0x0164 VerticalMovieFuncButton no + 0x0165 VerticalMovieAFOnButton no + 0x0169 LimitAF-AreaModeSelAutoPeople? no + 0x016a LimitAF-AreaModeSelAutoAnimals? no + 0x016b LimitAF-AreaModeSelWideLPeople? no + 0x016c LimitAF-AreaModeSelWideLAnimals? no + 0x016d SaveFocus no + 0x016e AFAreaMode no + 0x016f MovieAFAreaMode no + 0x0170 PreferSubSelectorCenter no + 0x0171 KeepExposureWithTeleconverter no + 0x0174 FocusPointSelectionSpeed no + +=head2 Canon Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 CanonCameraSettings Canon CameraSettings + 0x0002 CanonFocalLength Canon FocalLength + 0x0003 CanonFlashInfo? no + 0x0004 CanonShotInfo Canon ShotInfo + 0x0005 CanonPanorama Canon Panorama + 0x0006 CanonImageType string + 0x0007 CanonFirmwareVersion string + 0x0008 FileNumber int32u + 0x0009 OwnerName string + 0x000a UnknownD30 Canon UnknownD30 + 0x000c SerialNumber int32u + 0x000d CanonCameraInfo1D Canon CameraInfo1D + CanonCameraInfo1DmkII Canon CameraInfo1DmkII + CanonCameraInfo1DmkIIN Canon CameraInfo1DmkIIN + CanonCameraInfo1DmkIII Canon CameraInfo1DmkIII + CanonCameraInfo1DmkIV Canon CameraInfo1DmkIV + CanonCameraInfo1DX Canon CameraInfo1DX + CanonCameraInfo5D Canon CameraInfo5D + CanonCameraInfo5DmkII Canon CameraInfo5DmkII + CanonCameraInfo5DmkIII Canon CameraInfo5DmkIII + CanonCameraInfo6D Canon CameraInfo6D + CanonCameraInfo7D Canon CameraInfo7D + CanonCameraInfo40D Canon CameraInfo40D + CanonCameraInfo50D Canon CameraInfo50D + CanonCameraInfo60D Canon CameraInfo60D + CanonCameraInfo70D Canon CameraInfo70D + CanonCameraInfo80D Canon CameraInfo80D + CanonCameraInfo450D Canon CameraInfo450D + CanonCameraInfo500D Canon CameraInfo500D + CanonCameraInfo550D Canon CameraInfo550D + CanonCameraInfo600D Canon CameraInfo600D + CanonCameraInfo650D Canon CameraInfo650D + CanonCameraInfo700D Canon CameraInfo650D + CanonCameraInfo750D Canon CameraInfo750D + CanonCameraInfo760D Canon CameraInfo750D + CanonCameraInfo1000D Canon CameraInfo1000D + CanonCameraInfo1100D Canon CameraInfo600D + CanonCameraInfo1200D Canon CameraInfo60D + CanonCameraInfoPowerShot Canon CameraInfoPowerShot + CanonCameraInfoPowerShot2 Canon CameraInfoPowerShot2 + CanonCameraInfoUnknown32 Canon CameraInfoUnknown32 + CanonCameraInfoUnknown16 Canon CameraInfoUnknown16 + CanonCameraInfoUnknown Canon CameraInfoUnknown + 0x000e CanonFileLength int32u + 0x000f CustomFunctions1D CanonCustom Functions1D + CustomFunctions5D CanonCustom Functions5D + CustomFunctions10D CanonCustom Functions10D + CustomFunctions20D CanonCustom Functions20D + CustomFunctions30D CanonCustom Functions30D + CustomFunctions350D CanonCustom Functions350D + CustomFunctions400D CanonCustom Functions400D + CustomFunctionsD30 CanonCustom FunctionsD30 + CustomFunctionsD60 CanonCustom FunctionsD30 + CustomFunctionsUnknown CanonCustom FuncsUnknown + 0x0010 CanonModelID int32u + 0x0011 MovieInfo Canon MovieInfo + 0x0012 CanonAFInfo Canon AFInfo + 0x0013 ThumbnailImageValidArea int16u[4] + 0x0015 SerialNumberFormat int32u + 0x001a SuperMacro int16u + 0x001c DateStampMode int16u + 0x001d MyColors Canon MyColors + 0x001e FirmwareRevision int32u + 0x0023 Categories int32u[2] + 0x0024 FaceDetect1 Canon FaceDetect1 + 0x0025 FaceDetect2 Canon FaceDetect2 + 0x0026 CanonAFInfo2 Canon AFInfo2 + 0x0027 ContrastInfo Canon ContrastInfo + 0x0028 ImageUniqueID int8u + 0x0029 WBInfo Canon WBInfo + 0x002f FaceDetect3 Canon FaceDetect3 + 0x0035 TimeInfo Canon TimeInfo + 0x0038 BatteryType undef + 0x003c AFInfo3 Canon AFInfo2 + 0x0081 RawDataOffset no + 0x0083 OriginalDecisionDataOffset int32u* + 0x0090 CustomFunctions1D CanonCustom Functions1D + 0x0091 PersonalFunctions CanonCustom PersonalFuncs + 0x0092 PersonalFunctionValues CanonCustom PersonalFuncValues + 0x0093 CanonFileInfo Canon FileInfo + 0x0094 AFPointsInFocus1D no + 0x0095 LensModel string + 0x0096 SerialInfo Canon SerialInfo + InternalSerialNumber string + 0x0097 DustRemovalData undef! + 0x0098 CropInfo Canon CropInfo + 0x0099 CustomFunctions2 CanonCustom Functions2 + 0x009a AspectInfo Canon AspectInfo + 0x00a0 ProcessingInfo Canon Processing + 0x00a1 ToneCurveTable no + 0x00a2 SharpnessTable no + 0x00a3 SharpnessFreqTable no + 0x00a4 WhiteBalanceTable no + 0x00a9 ColorBalance Canon ColorBalance + 0x00aa MeasuredColor Canon MeasuredColor + 0x00ae ColorTemperature int16u + 0x00b0 CanonFlags Canon Flags + 0x00b1 ModifiedInfo Canon ModifiedInfo + 0x00b2 ToneCurveMatching no + 0x00b3 WhiteBalanceMatching no + 0x00b4 ColorSpace int16u + 0x00b6 PreviewImageInfo Canon PreviewImageInfo + 0x00d0 VRDOffset int32u* + 0x00e0 SensorInfo Canon SensorInfo + 0x4001 ColorData1 Canon ColorData1 + ColorData2 Canon ColorData2 + ColorData3 Canon ColorData3 + ColorData4 Canon ColorData4 + ColorData5 Canon ColorData5 + ColorData6 Canon ColorData6 + ColorData7 Canon ColorData7 + ColorData8 Canon ColorData8 + ColorData9 Canon ColorData9 + ColorData10 Canon ColorData10 + ColorData11 Canon ColorData11 + ColorDataUnknown Canon ColorDataUnknown + 0x4002 CRWParam? no + 0x4003 ColorInfo Canon ColorInfo + 0x4005 Flavor? no + 0x4008 PictureStyleUserDef [Values 0-2] + Canon PictureStyle + 0x4009 PictureStylePC [Values 0-2] + Canon PictureStyle + 0x4010 CustomPictureStyleFileName string + 0x4013 AFMicroAdj Canon AFMicroAdj + 0x4015 VignettingCorr Canon VignettingCorr + VignettingCorrUnknown1 Canon VignettingCorrUnknown + VignettingCorrUnknown2 Canon VignettingCorrUnknown + 0x4016 VignettingCorr2 Canon VignettingCorr2 + 0x4018 LightingOpt Canon LightingOpt + 0x4019 LensInfo Canon LensInfo + 0x4020 AmbienceInfo Canon Ambience + 0x4021 MultiExp Canon MultiExp + 0x4024 FilterInfo Canon FilterInfo + 0x4025 HDRInfo Canon HDRInfo + 0x4026 LogInfo Canon LogInfo + 0x4028 AFConfig Canon AFConfig + 0x403f RawBurstModeRoll Canon RawBurstInfo + +=head3 Canon CameraSettings Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 MacroMode int16s + 2 SelfTimer int16s + 3 Quality int16s + 4 CanonFlashMode int16s + 5 ContinuousDrive int16s + 7 FocusMode int16s + 9 RecordMode int16s + 10 CanonImageSize int16s + 11 EasyMode int16s + 12 DigitalZoom int16s + 13 Contrast int16s + 14 Saturation int16s + 15 Sharpness int16s + 16 CameraISO int16s + 17 MeteringMode int16s + 18 FocusRange int16s + 19 AFPoint int16s + 20 CanonExposureMode int16s + 22 LensType int16u + 23 MaxFocalLength int16u + 24 MinFocalLength int16u + 25 FocalUnits int16s + 26 MaxAperture int16s + 27 MinAperture int16s + 28 FlashActivity int16s + 29 FlashBits int16s + 32 FocusContinuous int16s + 33 AESetting int16s + 34 ImageStabilization int16s + 35 DisplayAperture int16s + 36 ZoomSourceWidth int16s + 37 ZoomTargetWidth int16s + 39 SpotMeteringMode int16s + 40 PhotoEffect int16s + 41 ManualFlashOutput int16s + 42 ColorTone int16s + 46 SRAWQuality int16s + +=head3 Canon FocalLength Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 FocalType int16u + 1 FocalLength int16u + 2 FocalPlaneXSize int16u + FocalPlaneXUnknown? int16u + 3 FocalPlaneYSize int16u + FocalPlaneYUnknown? int16u + +=head3 Canon ShotInfo Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 AutoISO int16s + 2 BaseISO int16s + 3 MeasuredEV int16s + 4 TargetAperture int16s + 5 TargetExposureTime int16s + 6 ExposureCompensation int16s + 7 WhiteBalance int16s + 8 SlowShutter int16s + 9 SequenceNumber int16s + 10 OpticalZoomCode int16s + 12 CameraTemperature int16s + 13 FlashGuideNumber int16s + 14 AFPointsInFocus int16s + 15 FlashExposureComp int16s + 16 AutoExposureBracketing int16s + 17 AEBBracketValue int16s + 18 ControlMode int16s + 19 FocusDistanceUpper int16u + 20 FocusDistanceLower int16u + 21 FNumber int16s + 22 ExposureTime int16s + 23 MeasuredEV2 int16s + 24 BulbDuration int16s + 26 CameraType int16s + 27 AutoRotate int16s + 28 NDFilter int16s + 29 SelfTimer2 int16s + 33 FlashOutput int16s + +=head3 Canon Panorama Tags + + Index2 Tag Name Writable + ------ -------- -------- + 2 PanoramaFrameNumber int16s + 5 PanoramaDirection int16s + +=head3 Canon UnknownD30 Tags + + Index2 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Canon CameraInfo1D Tags + +Information in the "CameraInfo" records is tricky to decode because the +encodings are very different than in other Canon records (even sometimes +switching endianness between values within a single camera), plus there is +considerable variation in format from model to model. The first table below +lists CameraInfo tags for the 1D and 1DS. + + Index1 Tag Name Writable + ------ -------- -------- + 4 ExposureTime int8u + 10 FocalLength int16u + 13 LensType int16uRev + 14 MinFocalLength int16u + 16 MaxFocalLength int16u + 65 SharpnessFrequency int8u + 66 Sharpness int8s + 68 WhiteBalance int8u + 71 SharpnessFrequency int8u + 72 ColorTemperature int16u + Sharpness int8s + 74 WhiteBalance int8u + 75 PictureStyle int8u + 78 ColorTemperature int16u + 81 PictureStyle int8u + +=head3 Canon CameraInfo1DmkII Tags + +CameraInfo tags for the 1DmkII and 1DSmkII. + + Index1 Tag Name Writable + ------ -------- -------- + 4 ExposureTime int8u + 9 FocalLength int16uRev + 12 LensType int16uRev + 17 MinFocalLength int16uRev + 19 MaxFocalLength int16uRev + 45 FocalType int8u + 54 WhiteBalance int8u + 55 ColorTemperature int16uRev + 57 CanonImageSize int16u + 102 JPEGQuality int8u + 108 PictureStyle int8u + 110 Saturation int8s + 111 ColorTone int8s + 114 Sharpness int8s + 115 Contrast int8s + 117 ISO string[5] + +=head3 Canon CameraInfo1DmkIIN Tags + +CameraInfo tags for the 1DmkIIN. + + Index1 Tag Name Writable + ------ -------- -------- + 4 ExposureTime int8u + 9 FocalLength int16uRev + 12 LensType int16uRev + 17 MinFocalLength int16uRev + 19 MaxFocalLength int16uRev + 54 WhiteBalance int8u + 55 ColorTemperature int16uRev + 115 PictureStyle int8u + 116 Sharpness int8s + 117 Contrast int8s + 118 Saturation int8s + 119 ColorTone int8s + 121 ISO string[5] + +=head3 Canon CameraInfo1DmkIII Tags + +CameraInfo tags for the 1DmkIII and 1DSmkIII. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 24 CameraTemperature int8u + 27 MacroMagnification int8u + 29 FocalLength int16uRev + 48 CameraOrientation int8u + 67 FocusDistanceUpper int16uRev + 69 FocusDistanceLower int16uRev + 94 WhiteBalance int16u + 98 ColorTemperature int16u + 134 PictureStyle int8u + 273 LensType int16uRev + 275 MinFocalLength int16uRev + 277 MaxFocalLength int16uRev + 310 FirmwareVersion string[6] + 370 FileIndex int32u + 374 ShutterCount int32u + 382 DirectoryIndex int32u + 682 PictureStyleInfo Canon PSInfo + 1114 TimeStamp1 int32u + 1118 TimeStamp int32u + +=head3 Canon PSInfo Tags + +Custom picture style information for various models. + + Index1 Tag Name Writable + ------ -------- -------- + 0 ContrastStandard int32s + 4 SharpnessStandard int32s + 8 SaturationStandard int32s + 12 ColorToneStandard int32s + 16 FilterEffectStandard? int32s + 20 ToningEffectStandard? int32s + 24 ContrastPortrait int32s + 28 SharpnessPortrait int32s + 32 SaturationPortrait int32s + 36 ColorTonePortrait int32s + 40 FilterEffectPortrait? int32s + 44 ToningEffectPortrait? int32s + 48 ContrastLandscape int32s + 52 SharpnessLandscape int32s + 56 SaturationLandscape int32s + 60 ColorToneLandscape int32s + 64 FilterEffectLandscape? int32s + 68 ToningEffectLandscape? int32s + 72 ContrastNeutral int32s + 76 SharpnessNeutral int32s + 80 SaturationNeutral int32s + 84 ColorToneNeutral int32s + 88 FilterEffectNeutral? int32s + 92 ToningEffectNeutral? int32s + 96 ContrastFaithful int32s + 100 SharpnessFaithful int32s + 104 SaturationFaithful int32s + 108 ColorToneFaithful int32s + 112 FilterEffectFaithful? int32s + 116 ToningEffectFaithful? int32s + 120 ContrastMonochrome int32s + 124 SharpnessMonochrome int32s + 128 SaturationMonochrome? int32s + 132 ColorToneMonochrome? int32s + 136 FilterEffectMonochrome int32s + 140 ToningEffectMonochrome int32s + 144 ContrastUserDef1 int32s + 148 SharpnessUserDef1 int32s + 152 SaturationUserDef1 int32s + 156 ColorToneUserDef1 int32s + 160 FilterEffectUserDef1 int32s + 164 ToningEffectUserDef1 int32s + 168 ContrastUserDef2 int32s + 172 SharpnessUserDef2 int32s + 176 SaturationUserDef2 int32s + 180 ColorToneUserDef2 int32s + 184 FilterEffectUserDef2 int32s + 188 ToningEffectUserDef2 int32s + 192 ContrastUserDef3 int32s + 196 SharpnessUserDef3 int32s + 200 SaturationUserDef3 int32s + 204 ColorToneUserDef3 int32s + 208 FilterEffectUserDef3 int32s + 212 ToningEffectUserDef3 int32s + 216 UserDef1PictureStyle int16u + 218 UserDef2PictureStyle int16u + 220 UserDef3PictureStyle int16u + +=head3 Canon CameraInfo1DmkIV Tags + +CameraInfo tags for the EOS 1D Mark IV. Indices shown are for firmware +versions 1.0.x, but they may be different for other firmware versions. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 7 HighlightTonePriority int8u + 8 MeasuredEV2 int8u + 9 MeasuredEV3 int8u + 21 FlashMeteringMode int8u + 25 CameraTemperature int8u + 30 FocalLength int16uRev + 53 CameraOrientation int8u + 84 FocusDistanceUpper int16uRev + 86 FocusDistanceLower int16uRev + 120 WhiteBalance int16u + 124 ColorTemperature int16u + 335 LensType int16uRev + 337 MinFocalLength int16uRev + 339 MaxFocalLength int16uRev + 493 FirmwareVersion no + 556 FileIndex int32u + 568 DirectoryIndex int32u + 872 PictureStyleInfo Canon PSInfo + +=head3 Canon CameraInfo1DX Tags + +CameraInfo tags for the EOS 1D X. Indices shown are for firmware version +1.0.2, but they may be different for other firmware versions. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 27 CameraTemperature int8u + 35 FocalLength int16uRev + 125 CameraOrientation int8u + 140 FocusDistanceUpper int16uRev + 142 FocusDistanceLower int16uRev + 188 WhiteBalance int16u + 192 ColorTemperature int16u + 244 PictureStyle int8u + 423 LensType int16uRev + 425 MinFocalLength int16uRev + 427 MaxFocalLength int16uRev + 640 FirmwareVersion no + 720 FileIndex int32u + 732 DirectoryIndex int32u + 1012 PictureStyleInfo Canon PSInfo2 + +=head3 Canon PSInfo2 Tags + +Custom picture style information for the EOS 5DmkIII, 60D, 600D and 1100D. + + Index1 Tag Name Writable + ------ -------- -------- + 0 ContrastStandard int32s + 4 SharpnessStandard int32s + 8 SaturationStandard int32s + 12 ColorToneStandard int32s + 16 FilterEffectStandard? int32s + 20 ToningEffectStandard? int32s + 24 ContrastPortrait int32s + 28 SharpnessPortrait int32s + 32 SaturationPortrait int32s + 36 ColorTonePortrait int32s + 40 FilterEffectPortrait? int32s + 44 ToningEffectPortrait? int32s + 48 ContrastLandscape int32s + 52 SharpnessLandscape int32s + 56 SaturationLandscape int32s + 60 ColorToneLandscape int32s + 64 FilterEffectLandscape? int32s + 68 ToningEffectLandscape? int32s + 72 ContrastNeutral int32s + 76 SharpnessNeutral int32s + 80 SaturationNeutral int32s + 84 ColorToneNeutral int32s + 88 FilterEffectNeutral? int32s + 92 ToningEffectNeutral? int32s + 96 ContrastFaithful int32s + 100 SharpnessFaithful int32s + 104 SaturationFaithful int32s + 108 ColorToneFaithful int32s + 112 FilterEffectFaithful? int32s + 116 ToningEffectFaithful? int32s + 120 ContrastMonochrome int32s + 124 SharpnessMonochrome int32s + 128 SaturationMonochrome? int32s + 132 ColorToneMonochrome? int32s + 136 FilterEffectMonochrome int32s + 140 ToningEffectMonochrome int32s + 144 ContrastAuto int32s + 148 SharpnessAuto int32s + 152 SaturationAuto int32s + 156 ColorToneAuto int32s + 160 FilterEffectAuto int32s + 164 ToningEffectAuto int32s + 168 ContrastUserDef1 int32s + 172 SharpnessUserDef1 int32s + 176 SaturationUserDef1 int32s + 180 ColorToneUserDef1 int32s + 184 FilterEffectUserDef1 int32s + 188 ToningEffectUserDef1 int32s + 192 ContrastUserDef2 int32s + 196 SharpnessUserDef2 int32s + 200 SaturationUserDef2 int32s + 204 ColorToneUserDef2 int32s + 208 FilterEffectUserDef2 int32s + 212 ToningEffectUserDef2 int32s + 216 ContrastUserDef3 int32s + 220 SharpnessUserDef3 int32s + 224 SaturationUserDef3 int32s + 228 ColorToneUserDef3 int32s + 232 FilterEffectUserDef3 int32s + 236 ToningEffectUserDef3 int32s + 240 UserDef1PictureStyle int16u + 242 UserDef2PictureStyle int16u + 244 UserDef3PictureStyle int16u + +=head3 Canon CameraInfo5D Tags + +CameraInfo tags for the EOS 5D. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 12 LensType int16uRev + 23 CameraTemperature int8u + 27 MacroMagnification int8s + 39 CameraOrientation int8s + 40 FocalLength int16uRev + 56 AFPointsInFocus5D int16uRev + 84 WhiteBalance int16u + 88 ColorTemperature int16u + 108 PictureStyle int8u + 147 MinFocalLength int16uRev + 149 MaxFocalLength int16uRev + 151 LensType int16uRev + 164 FirmwareRevision string[8] + 172 ShortOwnerName string[16] + 204 DirectoryIndex int32u + 208 FileIndex int16u + 232 ContrastStandard int8s + 233 ContrastPortrait int8s + 234 ContrastLandscape int8s + 235 ContrastNeutral int8s + 236 ContrastFaithful int8s + 237 ContrastMonochrome int8s + 238 ContrastUserDef1 int8s + 239 ContrastUserDef2 int8s + 240 ContrastUserDef3 int8s + 241 SharpnessStandard int8s + 242 SharpnessPortrait int8s + 243 SharpnessLandscape int8s + 244 SharpnessNeutral int8s + 245 SharpnessFaithful int8s + 246 SharpnessMonochrome int8s + 247 SharpnessUserDef1 int8s + 248 SharpnessUserDef2 int8s + 249 SharpnessUserDef3 int8s + 250 SaturationStandard int8s + 251 SaturationPortrait int8s + 252 SaturationLandscape int8s + 253 SaturationNeutral int8s + 254 SaturationFaithful int8s + 255 FilterEffectMonochrome int8s + 256 SaturationUserDef1 int8s + 257 SaturationUserDef2 int8s + 258 SaturationUserDef3 int8s + 259 ColorToneStandard int8s + 260 ColorTonePortrait int8s + 261 ColorToneLandscape int8s + 262 ColorToneNeutral int8s + 263 ColorToneFaithful int8s + 264 ToningEffectMonochrome int8s + 265 ColorToneUserDef1 int8s + 266 ColorToneUserDef2 int8s + 267 ColorToneUserDef3 int8s + 268 UserDef1PictureStyle int16u + 270 UserDef2PictureStyle int16u + 272 UserDef3PictureStyle int16u + 284 TimeStamp int32u + +=head3 Canon CameraInfo5DmkII Tags + +CameraInfo tags for the EOS 5D Mark II. Indices shown are for firmware +version 1.0.6, but they may be different for other firmware versions. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 7 HighlightTonePriority int8u + 21 FlashMeteringMode int8u + 25 CameraTemperature int8u + 27 MacroMagnification int8u + 30 FocalLength int16uRev + 49 CameraOrientation int8u + 80 FocusDistanceUpper int16uRev + 82 FocusDistanceLower int16uRev + 111 WhiteBalance int16u + 115 ColorTemperature int16u + 167 PictureStyle int8u + 189 HighISONoiseReduction int8u + 191 AutoLightingOptimizer int8u + 230 LensType int16uRev + 232 MinFocalLength int16uRev + 234 MaxFocalLength int16uRev + 382 FirmwareVersion no + 443 FileIndex int32u + 455 DirectoryIndex int32u + 759 PictureStyleInfo Canon PSInfo + +=head3 Canon CameraInfo5DmkIII Tags + +CameraInfo tags for the EOS 5D Mark III. Indices shown are for firmware +versions 1.0.x, but they may be different for other firmware versions. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 27 CameraTemperature int8u + 35 FocalLength int16uRev + 125 CameraOrientation int8u + 140 FocusDistanceUpper int16uRev + 142 FocusDistanceLower int16uRev + 188 WhiteBalance int16u + 192 ColorTemperature int16u + 244 PictureStyle int8u + 339 LensType int16uRev + 341 MinFocalLength int16uRev + 343 MaxFocalLength int16uRev + 356 LensSerialNumber undef[5] + 572 FirmwareVersion no + 652 FileIndex int32u + 656 FileIndex2 int32u + 664 DirectoryIndex int32u + 668 DirectoryIndex2 int32u + 944 PictureStyleInfo Canon PSInfo2 + +=head3 Canon CameraInfo6D Tags + +CameraInfo tags for the EOS 6D. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 27 CameraTemperature int8u + 35 FocalLength int16uRev + 131 CameraOrientation int8u + 146 FocusDistanceUpper int16uRev + 148 FocusDistanceLower int16uRev + 194 WhiteBalance int16u + 198 ColorTemperature int16u + 250 PictureStyle int8u + 353 LensType int16uRev + 355 MinFocalLength int16uRev + 357 MaxFocalLength int16uRev + 598 FirmwareVersion no + 682 FileIndex int32u + 694 DirectoryIndex int32u + 966 PictureStyleInfo Canon PSInfo2 + +=head3 Canon CameraInfo7D Tags + +CameraInfo tags for the EOS 7D. Indices shown are for firmware versions +1.0.x, but they may be different for other firmware versions. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 7 HighlightTonePriority int8u + 8 MeasuredEV2 int8u + 9 MeasuredEV int8u + 21 FlashMeteringMode int8u + 25 CameraTemperature int8u + 30 FocalLength int16uRev + 53 CameraOrientation int8u + 84 FocusDistanceUpper int16uRev + 86 FocusDistanceLower int16uRev + 119 WhiteBalance int16u + 123 ColorTemperature int16u + 175 CameraPictureStyle int8u + 201 HighISONoiseReduction int8u + 274 LensType int16uRev + 276 MinFocalLength int16uRev + 278 MaxFocalLength int16uRev + 428 FirmwareVersion no + 491 FileIndex int32u + 503 DirectoryIndex int32u + 807 PictureStyleInfo Canon PSInfo + +=head3 Canon CameraInfo40D Tags + +CameraInfo tags for the EOS 40D. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 21 FlashMeteringMode int8u + 24 CameraTemperature int8u + 27 MacroMagnification int8u + 29 FocalLength int16uRev + 48 CameraOrientation int8u + 67 FocusDistanceUpper int16uRev + 69 FocusDistanceLower int16uRev + 111 WhiteBalance int16u + 115 ColorTemperature int16u + 214 LensType int16uRev + 216 MinFocalLength int16uRev + 218 MaxFocalLength int16uRev + 255 FirmwareVersion string[6] + 307 FileIndex int32u + 319 DirectoryIndex int32u + 603 PictureStyleInfo Canon PSInfo + 2347 LensModel string[64] + +=head3 Canon CameraInfo50D Tags + +CameraInfo tags for the EOS 50D. Indices shown are for firmware versions +1.0.x, but they may be different for other firmware versions. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 7 HighlightTonePriority int8u + 21 FlashMeteringMode int8u + 25 CameraTemperature int8u + 30 FocalLength int16uRev + 49 CameraOrientation int8u + 80 FocusDistanceUpper int16uRev + 82 FocusDistanceLower int16uRev + 111 WhiteBalance int16u + 115 ColorTemperature int16u + 167 PictureStyle int8u + 189 HighISONoiseReduction int8u + 191 AutoLightingOptimizer int8u + 234 LensType int16uRev + 236 MinFocalLength int16uRev + 238 MaxFocalLength int16uRev + 350 FirmwareVersion no + 411 FileIndex int32u + 423 DirectoryIndex int32u + 727 PictureStyleInfo Canon PSInfo + +=head3 Canon CameraInfo60D Tags + +CameraInfo tags for the EOS 60D and 1200D. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 25 CameraTemperature int8u + 30 FocalLength int16uRev + 54 CameraOrientation int8u + 58 CameraOrientation int8u + 85 FocusDistanceUpper int16uRev + 87 FocusDistanceLower int16uRev + 125 ColorTemperature int16u + 232 LensType int16uRev + 234 MinFocalLength int16uRev + 236 MaxFocalLength int16uRev + 409 FirmwareVersion no + 473 FileIndex int32u + 485 DirectoryIndex int32u + 761 PictureStyleInfo Canon PSInfo2 + 801 PictureStyleInfo Canon PSInfo2 + +=head3 Canon CameraInfo70D Tags + +CameraInfo tags for the EOS 70D. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 27 CameraTemperature int8u + 35 FocalLength int16uRev + 132 CameraOrientation int8u + 147 FocusDistanceUpper int16uRev + 149 FocusDistanceLower int16uRev + 199 ColorTemperature int16u + 358 LensType int16uRev + 360 MinFocalLength int16uRev + 362 MaxFocalLength int16uRev + 606 FirmwareVersion no + 691 FileIndex int32u + 703 DirectoryIndex int32u + 975 PictureStyleInfo Canon PSInfo2 + +=head3 Canon CameraInfo80D Tags + +CameraInfo tags for the EOS 80D. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 27 CameraTemperature int8u + 35 FocalLength int16uRev + 150 CameraOrientation int8u + 165 FocusDistanceUpper int16uRev + 167 FocusDistanceLower int16uRev + 314 ColorTemperature int16u + 393 LensType int16uRev + 395 MinFocalLength int16uRev + 397 MaxFocalLength int16uRev + 1114 FirmwareVersion no + 1198 FileIndex int32u + 1210 DirectoryIndex int32u + +=head3 Canon CameraInfo450D Tags + +CameraInfo tags for the EOS 450D. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 21 FlashMeteringMode int8u + 24 CameraTemperature int8u + 27 MacroMagnification int8u + 29 FocalLength int16uRev + 48 CameraOrientation int8u + 67 FocusDistanceUpper int16uRev + 69 FocusDistanceLower int16uRev + 111 WhiteBalance int16u + 115 ColorTemperature int16u + 222 LensType int16uRev + 263 FirmwareVersion string[6] + 271 OwnerName string[32] + 307 DirectoryIndex int32u + 319 FileIndex int32u + 611 PictureStyleInfo Canon PSInfo + 2355 LensModel string[64] + +=head3 Canon CameraInfo500D Tags + +CameraInfo tags for the EOS 500D. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 7 HighlightTonePriority int8u + 21 FlashMeteringMode int8u + 25 CameraTemperature int8u + 30 FocalLength int16uRev + 49 CameraOrientation int8u + 80 FocusDistanceUpper int16uRev + 82 FocusDistanceLower int16uRev + 115 WhiteBalance int16u + 119 ColorTemperature int16u + 171 PictureStyle int8u + 188 HighISONoiseReduction int8u + 190 AutoLightingOptimizer int8u + 246 LensType int16uRev + 248 MinFocalLength int16uRev + 250 MaxFocalLength int16uRev + 400 FirmwareVersion no + 467 FileIndex int32u + 479 DirectoryIndex int32u + 779 PictureStyleInfo Canon PSInfo + +=head3 Canon CameraInfo550D Tags + +CameraInfo tags for the EOS 550D. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 7 HighlightTonePriority int8u + 21 FlashMeteringMode int8u + 25 CameraTemperature int8u + 30 FocalLength int16uRev + 53 CameraOrientation int8u + 84 FocusDistanceUpper int16uRev + 86 FocusDistanceLower int16uRev + 120 WhiteBalance int16u + 124 ColorTemperature int16u + 176 PictureStyle int8u + 255 LensType int16uRev + 257 MinFocalLength int16uRev + 259 MaxFocalLength int16uRev + 420 FirmwareVersion no + 484 FileIndex int32u + 496 DirectoryIndex int32u + 796 PictureStyleInfo Canon PSInfo + +=head3 Canon CameraInfo600D Tags + +CameraInfo tags for the EOS 600D and 1100D. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 7 HighlightTonePriority int8u + 21 FlashMeteringMode int8u + 25 CameraTemperature int8u + 30 FocalLength int16uRev + 56 CameraOrientation int8u + 87 FocusDistanceUpper int16uRev + 89 FocusDistanceLower int16uRev + 123 WhiteBalance int16u + 127 ColorTemperature int16u + 179 PictureStyle int8u + 234 LensType int16uRev + 236 MinFocalLength int16uRev + 238 MaxFocalLength int16uRev + 411 FirmwareVersion no + 475 FileIndex int32u + 487 DirectoryIndex int32u + 763 PictureStyleInfo Canon PSInfo2 + +=head3 Canon CameraInfo650D Tags + +CameraInfo tags for the EOS 650D and 700D. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 27 CameraTemperature int8u + 35 FocalLength int16uRev + 125 CameraOrientation int8u + 140 FocusDistanceUpper int16uRev + 142 FocusDistanceLower int16uRev + 188 WhiteBalance int16u + 192 ColorTemperature int16u + 244 PictureStyle int8u + 295 LensType int16uRev + 297 MinFocalLength int16uRev + 299 MaxFocalLength int16uRev + 539 FirmwareVersion no + 544 FirmwareVersion no + 624 FileIndex int32u + 628 FileIndex int32u + 636 DirectoryIndex int32u + 640 DirectoryIndex int32u + 912 PictureStyleInfo Canon PSInfo2 + +=head3 Canon CameraInfo750D Tags + +CameraInfo tags for the EOS 750D and 760D. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 27 CameraTemperature int8u + 35 FocalLength int16uRev + 150 CameraOrientation int8u + 165 FocusDistanceUpper int16uRev + 167 FocusDistanceLower int16uRev + 305 WhiteBalance int16u + 309 ColorTemperature int16u + 361 PictureStyle int8u + 388 LensType int16uRev + 390 MinFocalLength int16uRev + 392 MaxFocalLength int16uRev + 1085 FirmwareVersion no + 1097 FirmwareVersion no + +=head3 Canon CameraInfo1000D Tags + +CameraInfo tags for the EOS 1000D. + + Index1 Tag Name Writable + ------ -------- -------- + 3 FNumber int8u + 4 ExposureTime int8u + 6 ISO int8u + 21 FlashMeteringMode int8u + 24 CameraTemperature int8u + 27 MacroMagnification int8u + 29 FocalLength int16uRev + 48 CameraOrientation int8u + 67 FocusDistanceUpper int16uRev + 69 FocusDistanceLower int16uRev + 111 WhiteBalance int16u + 115 ColorTemperature int16u + 226 LensType int16uRev + 228 MinFocalLength int16uRev + 230 MaxFocalLength int16uRev + 267 FirmwareVersion string[6] + 311 DirectoryIndex int32u + 323 FileIndex int32u + 615 PictureStyleInfo Canon PSInfo + 2359 LensModel string[64] + +=head3 Canon CameraInfoPowerShot Tags + +CameraInfo tags for PowerShot models such as the A450, A460, A550, A560, +A570, A630, A640, A650, A710, A720, G7, G9, S5, SD40, SD750, SD800, SD850, +SD870, SD900, SD950, SD1000, SX100 and TX1. + + Index4 Tag Name Writable + ------ -------- -------- + 0 ISO int32s + 5 FNumber int32s + 6 ExposureTime int32s + 23 Rotation int32s + 135 CameraTemperature int32s + 145 CameraTemperature int32s + +=head3 Canon CameraInfoPowerShot2 Tags + +CameraInfo tags for PowerShot models such as the A470, A480, A490, A495, +A580, A590, A1000, A1100, A2000, A2100, A3000, A3100, D10, E1, G10, G11, +S90, S95, SD770, SD780, SD790, SD880, SD890, SD940, SD960, SD970, SD980, +SD990, SD1100, SD1200, SD1300, SD1400, SD3500, SD4000, SD4500, SX1, SX10, +SX20, SX110, SX120, SX130, SX200 and SX210. + + Index4 Tag Name Writable + ------ -------- -------- + 1 ISO int32s + 6 FNumber int32s + 7 ExposureTime int32s + 24 Rotation int32s + 153 CameraTemperature int32s + 159 CameraTemperature int32s + 164 CameraTemperature int32s + 168 CameraTemperature int32s + 261 CameraTemperature int32s + +=head3 Canon CameraInfoUnknown32 Tags + +Unknown CameraInfo tags are divided into 3 tables based on format size. + + Index4 Tag Name Writable + ------ -------- -------- + 71 CameraTemperature int32s + 83 CameraTemperature int32s + 91 CameraTemperature int32s + 92 CameraTemperature int32s + 100 CameraTemperature int32s + -3 CameraTemperature int32s + +=head3 Canon CameraInfoUnknown16 Tags + + Index2 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Canon CameraInfoUnknown Tags + + Index1 Tag Name Writable + ------ -------- -------- + 363 LensSerialNumber undef[5] + 1473 FirmwareVersion no + +=head3 Canon MovieInfo Tags + +Tags written by some Canon cameras when recording video. + + Index2 Tag Name Writable + ------ -------- -------- + 1 FrameRate int16u + 2 FrameCount int16u + 4 FrameCount int32u + 6 FrameRate rational32u + 106 Duration int32u + 108 AudioBitrate int32u + 110 AudioSampleRate int32u + 112 AudioChannels int32u + 116 VideoCodec undef[4] + +=head3 Canon AFInfo Tags + +Auto-focus information used by many older Canon models. The values in this +record are sequential, and some have variable sizes based on the value of +NumAFPoints (which may be 1,5,7,9,15,45 or 53). The AFArea coordinates are +given in a system where the image has dimensions given by AFImageWidth and +AFImageHeight, and 0,0 is the image center. The direction of the Y axis +depends on the camera model, with positive Y upwards for EOS models, but +apparently downwards for PowerShot models. + + Sequence Tag Name Writable + -------- -------- -------- + 0 NumAFPoints no + 1 ValidAFPoints no + 2 CanonImageWidth no + 3 CanonImageHeight no + 4 AFImageWidth no + 5 AFImageHeight no + 6 AFAreaWidth no + 7 AFAreaHeight no + 8 AFAreaXPositions no + 9 AFAreaYPositions no + 10 AFPointsInFocus no + 11 PrimaryAFPoint no + Canon_AFInfo_0x000b? no + 12 PrimaryAFPoint no + +=head3 Canon MyColors Tags + + Index2 Tag Name Writable + ------ -------- -------- + 2 MyColorMode int16u + +=head3 Canon FaceDetect1 Tags + + Index2 Tag Name Writable + ------ -------- -------- + 2 FacesDetected int16u + 3 FaceDetectFrameSize int16u[2] + 8 Face1Position int16s[2] + 10 Face2Position int16s[2] + 12 Face3Position int16s[2] + 14 Face4Position int16s[2] + 16 Face5Position int16s[2] + 18 Face6Position int16s[2] + 20 Face7Position int16s[2] + 22 Face8Position int16s[2] + 24 Face9Position int16s[2] + +=head3 Canon FaceDetect2 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1 FaceWidth int8u + 2 FacesDetected int8u + +=head3 Canon AFInfo2 Tags + +Newer version of the AFInfo record containing much of the same information +(and coordinate confusion) as the older version. In this record, NumAFPoints +may be 7, 9, 11, 19, 31, 45 or 61, depending on the camera model. + + Sequence Tag Name Writable + -------- -------- -------- + 0 AFInfoSize? no + 1 AFAreaMode no + 2 NumAFPoints no + 3 ValidAFPoints no + 4 CanonImageWidth no + 5 CanonImageHeight no + 6 AFImageWidth no + 7 AFImageHeight no + 8 AFAreaWidths no + 9 AFAreaHeights no + 10 AFAreaXPositions no + 11 AFAreaYPositions no + 12 AFPointsInFocus no + 13 AFPointsSelected no + Canon_AFInfo2_0x000d? no + 14 PrimaryAFPoint no + +=head3 Canon ContrastInfo Tags + + Index2 Tag Name Writable + ------ -------- -------- + 4 IntelligentContrast int16u + +=head3 Canon WBInfo Tags + +WB tags for the Canon G9. + + Index4 Tag Name Writable + ------ -------- -------- + 2 WB_GRBGLevelsAuto int32s[4] + 10 WB_GRBGLevelsDaylight int32s[4] + 18 WB_GRBGLevelsCloudy int32s[4] + 26 WB_GRBGLevelsTungsten int32s[4] + 34 WB_GRBGLevelsFluorescent int32s[4] + 42 WB_GRBGLevelsFluorHigh int32s[4] + 50 WB_GRBGLevelsFlash int32s[4] + 58 WB_GRBGLevelsUnderwater int32s[4] + 66 WB_GRBGLevelsCustom1 int32s[4] + 74 WB_GRBGLevelsCustom2 int32s[4] + +=head3 Canon FaceDetect3 Tags + + Index2 Tag Name Writable + ------ -------- -------- + 3 FacesDetected int16u + +=head3 Canon TimeInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 TimeZone int32s + 2 TimeZoneCity int32s + 3 DaylightSavings int32s + +=head3 Canon FileInfo Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 FileNumber int32u + ShutterCount int32u + 3 BracketMode int16s + 4 BracketValue int16s + 5 BracketShotNumber int16s + 6 RawJpgQuality int16s + 7 RawJpgSize int16s + 8 LongExposureNoiseReduction2 int16s + 9 WBBracketMode int16s + 12 WBBracketValueAB int16s + 13 WBBracketValueGM int16s + 14 FilterEffect int16s + 15 ToningEffect int16s + 16 MacroMagnification int16s + 19 LiveViewShooting int16s + 20 FocusDistanceUpper int16u + 21 FocusDistanceLower int16u + 23 ShutterMode int16s + 25 FlashExposureLock int16s + 61 RFLensType int16u + +=head3 Canon SerialInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 9 InternalSerialNumber string + +=head3 Canon CropInfo Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 CropLeftMargin int16u + 1 CropRightMargin int16u + 2 CropTopMargin int16u + 3 CropBottomMargin int16u + +=head3 Canon AspectInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 AspectRatio int32u + 1 CroppedImageWidth int32u + 2 CroppedImageHeight int32u + 3 CroppedImageLeft int32u + 4 CroppedImageTop int32u + +=head3 Canon Processing Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 ToneCurve int16s + 2 Sharpness int16s + 3 SharpnessFrequency int16s + 4 SensorRedLevel int16s + 5 SensorBlueLevel int16s + 6 WhiteBalanceRed int16s + 7 WhiteBalanceBlue int16s + 8 WhiteBalance int16s + 9 ColorTemperature int16s + 10 PictureStyle int16s + 11 DigitalGain int16s + 12 WBShiftAB int16s + 13 WBShiftGM int16s + +=head3 Canon ColorBalance Tags + +These tags are used by the 10D and 300D. + + Index2 Tag Name Writable + ------ -------- -------- + 1 WB_RGGBLevelsAuto int16s[4] + 5 WB_RGGBLevelsDaylight int16s[4] + 9 WB_RGGBLevelsShade int16s[4] + 13 WB_RGGBLevelsCloudy int16s[4] + 17 WB_RGGBLevelsTungsten int16s[4] + 21 WB_RGGBLevelsFluorescent int16s[4] + 25 WB_RGGBLevelsFlash int16s[4] + 29 WB_RGGBLevelsCustom int16s[4] + BlackLevels int16s[4] + 33 WB_RGGBLevelsKelvin int16s[4] + 37 WB_RGGBBlackLevels int16s[4] + +=head3 Canon MeasuredColor Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 MeasuredRGGB int16u[4] + +=head3 Canon Flags Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 ModifiedParamFlag int16s + +=head3 Canon ModifiedInfo Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 ModifiedToneCurve int16s + 2 ModifiedSharpness int16s + 3 ModifiedSharpnessFreq int16s + 4 ModifiedSensorRedLevel int16s + 5 ModifiedSensorBlueLevel int16s + 6 ModifiedWhiteBalanceRed int16s + 7 ModifiedWhiteBalanceBlue int16s + 8 ModifiedWhiteBalance int16s + 9 ModifiedColorTemp int16s + 10 ModifiedPictureStyle int16s + 11 ModifiedDigitalGain int16s + +=head3 Canon PreviewImageInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 PreviewQuality int32u + 2 PreviewImageLength int32u* + 3 PreviewImageWidth int32u + 4 PreviewImageHeight int32u + 5 PreviewImageStart int32u* + +=head3 Canon SensorInfo Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 SensorWidth no + 2 SensorHeight no + 5 SensorLeftBorder no + 6 SensorTopBorder no + 7 SensorRightBorder no + 8 SensorBottomBorder no + 9 BlackMaskLeftBorder no + 10 BlackMaskTopBorder no + 11 BlackMaskRightBorder no + 12 BlackMaskBottomBorder no + +=head3 Canon ColorData1 Tags + +These tags are used by the 20D and 350D. + + Index2 Tag Name Writable + ------ -------- -------- + 25 WB_RGGBLevelsAsShot int16s[4] + 29 ColorTempAsShot int16s + 30 WB_RGGBLevelsAuto int16s[4] + 34 ColorTempAuto int16s + 35 WB_RGGBLevelsDaylight int16s[4] + 39 ColorTempDaylight int16s + 40 WB_RGGBLevelsShade int16s[4] + 44 ColorTempShade int16s + 45 WB_RGGBLevelsCloudy int16s[4] + 49 ColorTempCloudy int16s + 50 WB_RGGBLevelsTungsten int16s[4] + 54 ColorTempTungsten int16s + 55 WB_RGGBLevelsFluorescent int16s[4] + 59 ColorTempFluorescent int16s + 60 WB_RGGBLevelsFlash int16s[4] + 64 ColorTempFlash int16s + 65 WB_RGGBLevelsCustom1 int16s[4] + 69 ColorTempCustom1 int16s + 70 WB_RGGBLevelsCustom2 int16s[4] + 74 ColorTempCustom2 int16s + 75 ColorCalib? Canon ColorCalib + +=head3 Canon ColorCalib Tags + +Camera color calibration data. For the 20D, 350D, 1DmkII and 1DSmkII the +order of the coefficients is A, B, C, Temperature, but for newer models it +is B, C, A, Temperature. These tags are extracted only when the Unknown +option is used. + + Index2 Tag Name Writable + ------ -------- -------- + 0 CameraColorCalibration01? int16s[4] + 4 CameraColorCalibration02? int16s[4] + 8 CameraColorCalibration03? int16s[4] + 12 CameraColorCalibration04? int16s[4] + 16 CameraColorCalibration05? int16s[4] + 20 CameraColorCalibration06? int16s[4] + 24 CameraColorCalibration07? int16s[4] + 28 CameraColorCalibration08? int16s[4] + 32 CameraColorCalibration09? int16s[4] + 36 CameraColorCalibration10? int16s[4] + 40 CameraColorCalibration11? int16s[4] + 44 CameraColorCalibration12? int16s[4] + 48 CameraColorCalibration13? int16s[4] + 52 CameraColorCalibration14? int16s[4] + 56 CameraColorCalibration15? int16s[4] + +=head3 Canon ColorData2 Tags + +These tags are used by the 1DmkII and 1DSmkII. + + Index2 Tag Name Writable + ------ -------- -------- + 24 WB_RGGBLevelsAuto int16s[4] + 28 ColorTempAuto int16s + 29 WB_RGGBLevelsUnknown? int16s[4] + 33 ColorTempUnknown? int16s + 34 WB_RGGBLevelsAsShot int16s[4] + 38 ColorTempAsShot int16s + 39 WB_RGGBLevelsDaylight int16s[4] + 43 ColorTempDaylight int16s + 44 WB_RGGBLevelsShade int16s[4] + 48 ColorTempShade int16s + 49 WB_RGGBLevelsCloudy int16s[4] + 53 ColorTempCloudy int16s + 54 WB_RGGBLevelsTungsten int16s[4] + 58 ColorTempTungsten int16s + 59 WB_RGGBLevelsFluorescent int16s[4] + 63 ColorTempFluorescent int16s + 64 WB_RGGBLevelsKelvin int16s[4] + 68 ColorTempKelvin int16s + 69 WB_RGGBLevelsFlash int16s[4] + 73 ColorTempFlash int16s + 74 WB_RGGBLevelsUnknown2? int16s[4] + 78 ColorTempUnknown2? int16s + 79 WB_RGGBLevelsUnknown3? int16s[4] + 83 ColorTempUnknown3? int16s + 84 WB_RGGBLevelsUnknown4? int16s[4] + 88 ColorTempUnknown4? int16s + 89 WB_RGGBLevelsUnknown5? int16s[4] + 93 ColorTempUnknown5? int16s + 94 WB_RGGBLevelsUnknown6? int16s[4] + 98 ColorTempUnknown6? int16s + 99 WB_RGGBLevelsUnknown7? int16s[4] + 103 ColorTempUnknown7? int16s + 104 WB_RGGBLevelsUnknown8? int16s[4] + 108 ColorTempUnknown8? int16s + 109 WB_RGGBLevelsUnknown9? int16s[4] + 113 ColorTempUnknown9? int16s + 114 WB_RGGBLevelsUnknown10? int16s[4] + 118 ColorTempUnknown10? int16s + 119 WB_RGGBLevelsUnknown11? int16s[4] + 123 ColorTempUnknown11? int16s + 124 WB_RGGBLevelsUnknown12? int16s[4] + 128 ColorTempUnknown12? int16s + 129 WB_RGGBLevelsUnknown13? int16s[4] + 133 ColorTempUnknown13? int16s + 134 WB_RGGBLevelsUnknown14? int16s[4] + 138 ColorTempUnknown14? int16s + 139 WB_RGGBLevelsUnknown15? int16s[4] + 143 ColorTempUnknown15? int16s + 144 WB_RGGBLevelsPC1 int16s[4] + 148 ColorTempPC1 int16s + 149 WB_RGGBLevelsPC2 int16s[4] + 153 ColorTempPC2 int16s + 154 WB_RGGBLevelsPC3 int16s[4] + 158 ColorTempPC3 int16s + 159 WB_RGGBLevelsUnknown16? int16s[4] + 163 ColorTempUnknown16? int16s + 164 ColorCalib? Canon ColorCalib + 618 RawMeasuredRGGB int32u[4] + +=head3 Canon ColorData3 Tags + +These tags are used by the 1DmkIIN, 5D, 30D and 400D. + + Index2 Tag Name Writable + ------ -------- -------- + 0 ColorDataVersion int16s + 63 WB_RGGBLevelsAsShot int16s[4] + 67 ColorTempAsShot int16s + 68 WB_RGGBLevelsAuto int16s[4] + 72 ColorTempAuto int16s + 73 WB_RGGBLevelsMeasured int16s[4] + 77 ColorTempMeasured int16s + 78 WB_RGGBLevelsDaylight int16s[4] + 82 ColorTempDaylight int16s + 83 WB_RGGBLevelsShade int16s[4] + 87 ColorTempShade int16s + 88 WB_RGGBLevelsCloudy int16s[4] + 92 ColorTempCloudy int16s + 93 WB_RGGBLevelsTungsten int16s[4] + 97 ColorTempTungsten int16s + 98 WB_RGGBLevelsFluorescent int16s[4] + 102 ColorTempFluorescent int16s + 103 WB_RGGBLevelsKelvin int16s[4] + 107 ColorTempKelvin int16s + 108 WB_RGGBLevelsFlash int16s[4] + 112 ColorTempFlash int16s + 113 WB_RGGBLevelsPC1 int16s[4] + 117 ColorTempPC1 int16s + 118 WB_RGGBLevelsPC2 int16s[4] + 122 ColorTempPC2 int16s + 123 WB_RGGBLevelsPC3 int16s[4] + 127 ColorTempPC3 int16s + 128 WB_RGGBLevelsCustom int16s[4] + 132 ColorTempCustom int16s + 133 ColorCalib? Canon ColorCalib + 196 PerChannelBlackLevel int16u[4] + 584 FlashOutput int16s + 585 FlashBatteryLevel int16s + 586 ColorTempFlashData int16s + 647 MeasuredRGGBData int32u[4] + +=head3 Canon ColorData4 Tags + +These tags are used by the 1DmkIII, 1DSmkIII, 1DmkIV, 5DmkII, 7D, 40D, 50D, +60D, 450D, 500D, 550D, 1000D and 1100D. + + Index2 Tag Name Writable + ------ -------- -------- + 0 ColorDataVersion int16s + 63 ColorCoefs Canon ColorCoefs + 168 ColorCalib? Canon ColorCalib + 231 AverageBlackLevel int16u[4] + 640 RawMeasuredRGGB int32u[4] + 692 PerChannelBlackLevel int16u[4] + 696 NormalWhiteLevel int16u + 697 SpecularWhiteLevel int16u + 698 LinearityUpperMargin int16u + 715 PerChannelBlackLevel int16u[4] + 719 NormalWhiteLevel int16u + PerChannelBlackLevel int16u[4] + 720 SpecularWhiteLevel int16u + 721 LinearityUpperMargin int16u + 723 NormalWhiteLevel int16u + 724 SpecularWhiteLevel int16u + 725 LinearityUpperMargin int16u + +=head3 Canon ColorCoefs Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 WB_RGGBLevelsAsShot int16s[4] + 4 ColorTempAsShot int16s + 5 WB_RGGBLevelsAuto int16s[4] + 9 ColorTempAuto int16s + 10 WB_RGGBLevelsMeasured int16s[4] + 14 ColorTempMeasured int16s + 15 WB_RGGBLevelsUnknown? int16s[4] + 19 ColorTempUnknown? int16s + 20 WB_RGGBLevelsDaylight int16s[4] + 24 ColorTempDaylight int16s + 25 WB_RGGBLevelsShade int16s[4] + 29 ColorTempShade int16s + 30 WB_RGGBLevelsCloudy int16s[4] + 34 ColorTempCloudy int16s + 35 WB_RGGBLevelsTungsten int16s[4] + 39 ColorTempTungsten int16s + 40 WB_RGGBLevelsFluorescent int16s[4] + 44 ColorTempFluorescent int16s + 45 WB_RGGBLevelsKelvin int16s[4] + 49 ColorTempKelvin int16s + 50 WB_RGGBLevelsFlash int16s[4] + 54 ColorTempFlash int16s + 55 WB_RGGBLevelsUnknown2? int16s[4] + 59 ColorTempUnknown2? int16s + 60 WB_RGGBLevelsUnknown3? int16s[4] + 64 ColorTempUnknown3? int16s + 65 WB_RGGBLevelsUnknown4? int16s[4] + 69 ColorTempUnknown4? int16s + 70 WB_RGGBLevelsUnknown5? int16s[4] + 74 ColorTempUnknown5? int16s + 75 WB_RGGBLevelsUnknown6? int16s[4] + 79 ColorTempUnknown6? int16s + 80 WB_RGGBLevelsUnknown7? int16s[4] + 84 ColorTempUnknown7? int16s + 85 WB_RGGBLevelsUnknown8? int16s[4] + 89 ColorTempUnknown8? int16s + 90 WB_RGGBLevelsUnknown9? int16s[4] + 94 ColorTempUnknown9? int16s + 95 WB_RGGBLevelsUnknown10? int16s[4] + 99 ColorTempUnknown10? int16s + 100 WB_RGGBLevelsUnknown11? int16s[4] + 104 ColorTempUnknown11? int16s + 105 WB_RGGBLevelsUnknown12? int16s[4] + 109 ColorTempUnknown12? int16s + 110 WB_RGGBLevelsUnknown13? int16s[4] + 114 ColorTempUnknown13? int16s + +=head3 Canon ColorData5 Tags + +These tags are used by many EOS M and PowerShot models. + + Index2 Tag Name Writable + ------ -------- -------- + 0 ColorDataVersion int16s + 71 ColorCoefs Canon ColorCoefs + ColorCoefs2 Canon ColorCoefs2 + 186 ColorCalib2? Canon ColorCalib2 + 255 ColorCalib2? Canon ColorCalib2 + 264 PerChannelBlackLevel int16s[4] + 333 PerChannelBlackLevel int16s[4] + 1385 NormalWhiteLevel int16u + 1386 SpecularWhiteLevel int16u + +=head3 Canon ColorCoefs2 Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 WB_RGGBLevelsAsShot int16s[4] + 7 ColorTempAsShot int16s + 8 WB_RGGBLevelsAuto int16s[4] + 15 ColorTempAuto int16s + 16 WB_RGGBLevelsMeasured int16s[4] + 23 ColorTempMeasured int16s + 24 WB_RGGBLevelsUnknown? int16s[4] + 31 ColorTempUnknown? int16s + 32 WB_RGGBLevelsDaylight int16s[4] + 39 ColorTempDaylight int16s + 40 WB_RGGBLevelsShade int16s[4] + 47 ColorTempShade int16s + 48 WB_RGGBLevelsCloudy int16s[4] + 55 ColorTempCloudy int16s + 56 WB_RGGBLevelsTungsten int16s[4] + 63 ColorTempTungsten int16s + 64 WB_RGGBLevelsFluorescent int16s[4] + 71 ColorTempFluorescent int16s + 72 WB_RGGBLevelsKelvin int16s[4] + 79 ColorTempKelvin int16s + 80 WB_RGGBLevelsFlash int16s[4] + 87 ColorTempFlash int16s + 88 WB_RGGBLevelsUnknown2? int16s[4] + 95 ColorTempUnknown2? int16s + 96 WB_RGGBLevelsUnknown3? int16s[4] + 103 ColorTempUnknown3? int16s + 104 WB_RGGBLevelsUnknown4? int16s[4] + 111 ColorTempUnknown4? int16s + 112 WB_RGGBLevelsUnknown5? int16s[4] + 119 ColorTempUnknown5? int16s + 120 WB_RGGBLevelsUnknown6? int16s[4] + 127 ColorTempUnknown6? int16s + 128 WB_RGGBLevelsUnknown7? int16s[4] + 135 ColorTempUnknown7? int16s + 136 WB_RGGBLevelsUnknown8? int16s[4] + 143 ColorTempUnknown8? int16s + 144 WB_RGGBLevelsUnknown9? int16s[4] + 151 ColorTempUnknown9? int16s + 152 WB_RGGBLevelsUnknown10? int16s[4] + 159 ColorTempUnknown10? int16s + 160 WB_RGGBLevelsUnknown11? int16s[4] + 167 ColorTempUnknown11? int16s + 168 WB_RGGBLevelsUnknown12? int16s[4] + 175 ColorTempUnknown12? int16s + 176 WB_RGGBLevelsUnknown13? int16s[4] + 183 ColorTempUnknown13? int16s + +=head3 Canon ColorCalib2 Tags + +B, C, A, D, Temperature. + + Index2 Tag Name Writable + ------ -------- -------- + 0 CameraColorCalibration01? int16s[5] + 5 CameraColorCalibration02? int16s[5] + 10 CameraColorCalibration03? int16s[5] + 15 CameraColorCalibration04? int16s[5] + 20 CameraColorCalibration05? int16s[5] + 25 CameraColorCalibration06? int16s[5] + 30 CameraColorCalibration07? int16s[5] + 35 CameraColorCalibration08? int16s[5] + 40 CameraColorCalibration09? int16s[5] + 45 CameraColorCalibration10? int16s[5] + 50 CameraColorCalibration11? int16s[5] + 55 CameraColorCalibration12? int16s[5] + 60 CameraColorCalibration13? int16s[5] + 65 CameraColorCalibration14? int16s[5] + 70 CameraColorCalibration15? int16s[5] + +=head3 Canon ColorData6 Tags + +These tags are used by the EOS 600D and 1200D. + + Index2 Tag Name Writable + ------ -------- -------- + 0 ColorDataVersion int16s + 63 WB_RGGBLevelsAsShot int16s[4] + 67 ColorTempAsShot int16s + 68 WB_RGGBLevelsAuto int16s[4] + 72 ColorTempAuto int16s + 73 WB_RGGBLevelsMeasured int16s[4] + 77 ColorTempMeasured int16s + 78 WB_RGGBLevelsUnknown? int16s[4] + 82 ColorTempUnknown? int16s + 83 WB_RGGBLevelsUnknown2? int16s[4] + 87 ColorTempUnknown2? int16s + 88 WB_RGGBLevelsUnknown3? int16s[4] + 92 ColorTempUnknown3? int16s + 93 WB_RGGBLevelsUnknown4? int16s[4] + 97 ColorTempUnknown4? int16s + 98 WB_RGGBLevelsUnknown5? int16s[4] + 102 ColorTempUnknown5? int16s + 103 WB_RGGBLevelsDaylight int16s[4] + 107 ColorTempDaylight int16s + 108 WB_RGGBLevelsShade int16s[4] + 112 ColorTempShade int16s + 113 WB_RGGBLevelsCloudy int16s[4] + 117 ColorTempCloudy int16s + 118 WB_RGGBLevelsTungsten int16s[4] + 122 ColorTempTungsten int16s + 123 WB_RGGBLevelsFluorescent int16s[4] + 127 ColorTempFluorescent int16s + 128 WB_RGGBLevelsKelvin int16s[4] + 132 ColorTempKelvin int16s + 133 WB_RGGBLevelsFlash int16s[4] + 137 ColorTempFlash int16s + 138 WB_RGGBLevelsUnknown6? int16s[4] + 142 ColorTempUnknown6? int16s + 143 WB_RGGBLevelsUnknown7? int16s[4] + 147 ColorTempUnknown7? int16s + 148 WB_RGGBLevelsUnknown8? int16s[4] + 152 ColorTempUnknown8? int16s + 153 WB_RGGBLevelsUnknown9? int16s[4] + 157 ColorTempUnknown9? int16s + 158 WB_RGGBLevelsUnknown10? int16s[4] + 162 ColorTempUnknown10? int16s + 163 WB_RGGBLevelsUnknown11? int16s[4] + 167 ColorTempUnknown11? int16s + 168 WB_RGGBLevelsUnknown12? int16s[4] + 172 ColorTempUnknown12? int16s + 173 WB_RGGBLevelsUnknown13? int16s[4] + 177 ColorTempUnknown13? int16s + 178 WB_RGGBLevelsUnknown14? int16s[4] + 182 ColorTempUnknown14? int16s + 183 WB_RGGBLevelsUnknown15? int16s[4] + 187 ColorTempUnknown15? int16s + 188 ColorCalib? Canon ColorCalib + 251 AverageBlackLevel int16u[4] + 404 RawMeasuredRGGB int32u[4] + 479 PerChannelBlackLevel int16u[4] + 483 NormalWhiteLevel int16u + 484 SpecularWhiteLevel int16u + 485 LinearityUpperMargin int16u + +=head3 Canon ColorData7 Tags + +These tags are used by the EOS 1DX, 5DmkIII, 6D, 7DmkII, 100D, 650D, 700D, +8000D, M and M2. + + Index2 Tag Name Writable + ------ -------- -------- + 0 ColorDataVersion int16s + 63 WB_RGGBLevelsAsShot int16s[4] + 67 ColorTempAsShot int16s + 68 WB_RGGBLevelsAuto int16s[4] + 72 ColorTempAuto int16s + 73 WB_RGGBLevelsMeasured int16s[4] + 77 ColorTempMeasured int16s + 78 WB_RGGBLevelsUnknown? int16s[4] + 82 ColorTempUnknown? int16s + 83 WB_RGGBLevelsUnknown2? int16s[4] + 87 ColorTempUnknown2? int16s + 88 WB_RGGBLevelsUnknown3? int16s[4] + 92 ColorTempUnknown3? int16s + 93 WB_RGGBLevelsUnknown4? int16s[4] + 97 ColorTempUnknown4? int16s + 98 WB_RGGBLevelsUnknown5? int16s[4] + 102 ColorTempUnknown5? int16s + 103 WB_RGGBLevelsUnknown6? int16s[4] + 107 ColorTempUnknown6? int16s + 108 WB_RGGBLevelsUnknown7? int16s[4] + 112 ColorTempUnknown7? int16s + 113 WB_RGGBLevelsUnknown8? int16s[4] + 117 ColorTempUnknown8? int16s + 118 WB_RGGBLevelsUnknown9? int16s[4] + 122 ColorTempUnknown9? int16s + 123 WB_RGGBLevelsUnknown10? int16s[4] + 127 ColorTempUnknown10? int16s + 128 WB_RGGBLevelsDaylight int16s[4] + 132 ColorTempDaylight int16s + 133 WB_RGGBLevelsShade int16s[4] + 137 ColorTempShade int16s + 138 WB_RGGBLevelsCloudy int16s[4] + 142 ColorTempCloudy int16s + 143 WB_RGGBLevelsTungsten int16s[4] + 147 ColorTempTungsten int16s + 148 WB_RGGBLevelsFluorescent int16s[4] + 152 ColorTempFluorescent int16s + 153 WB_RGGBLevelsKelvin int16s[4] + 157 ColorTempKelvin int16s + 158 WB_RGGBLevelsFlash int16s[4] + 162 ColorTempFlash int16s + 163 WB_RGGBLevelsUnknown11? int16s[4] + 167 ColorTempUnknown11? int16s + 168 WB_RGGBLevelsUnknown12? int16s[4] + 172 ColorTempUnknown12? int16s + 173 WB_RGGBLevelsUnknown13? int16s[4] + 177 ColorTempUnknown13? int16s + 178 WB_RGGBLevelsUnknown14? int16s[4] + 182 ColorTempUnknown14? int16s + 183 WB_RGGBLevelsUnknown15? int16s[4] + 187 ColorTempUnknown15? int16s + 188 WB_RGGBLevelsUnknown16? int16s[4] + 192 ColorTempUnknown16? int16s + 193 WB_RGGBLevelsUnknown17? int16s[4] + 197 ColorTempUnknown17? int16s + 198 WB_RGGBLevelsUnknown18? int16s[4] + 202 ColorTempUnknown18? int16s + 203 WB_RGGBLevelsUnknown19? int16s[4] + 207 ColorTempUnknown19? int16s + 208 WB_RGGBLevelsUnknown20? int16s[4] + 212 ColorTempUnknown20? int16s + 213 ColorCalib? Canon ColorCalib + 276 AverageBlackLevel int16u[4] + 429 RawMeasuredRGGB int32u[4] + 504 PerChannelBlackLevel int16u[4] + 508 NormalWhiteLevel int16u + 509 SpecularWhiteLevel int16u + 510 LinearityUpperMargin int16u + 619 RawMeasuredRGGB int32u[4] + 728 PerChannelBlackLevel int16u[4] + 732 NormalWhiteLevel int16u + 733 SpecularWhiteLevel int16u + 734 LinearityUpperMargin int16u + +=head3 Canon ColorData8 Tags + +These tags are used by the EOS 1DXmkII, 5DS, 5DSR, 5DmkIV, 6DmkII, 77D, 80D, +200D, 800D, 1300D, 2000D, 4000D and 9000D. + + Index2 Tag Name Writable + ------ -------- -------- + 0 ColorDataVersion int16s + 63 WB_RGGBLevelsAsShot int16s[4] + 67 ColorTempAsShot int16s + 68 WB_RGGBLevelsAuto int16s[4] + 72 ColorTempAuto int16s + 73 WB_RGGBLevelsMeasured int16s[4] + 77 ColorTempMeasured int16s + 78 WB_RGGBLevelsUnknown? int16s[4] + 82 ColorTempUnknown? int16s + 83 WB_RGGBLevelsUnknown2? int16s[4] + 87 ColorTempUnknown2? int16s + 88 WB_RGGBLevelsUnknown3? int16s[4] + 92 ColorTempUnknown3? int16s + 93 WB_RGGBLevelsUnknown4? int16s[4] + 97 ColorTempUnknown4? int16s + 98 WB_RGGBLevelsUnknown5? int16s[4] + 102 ColorTempUnknown5? int16s + 103 WB_RGGBLevelsUnknown6? int16s[4] + 107 ColorTempUnknown6? int16s + 108 WB_RGGBLevelsUnknown7? int16s[4] + 112 ColorTempUnknown7? int16s + 113 WB_RGGBLevelsUnknown8? int16s[4] + 117 ColorTempUnknown8? int16s + 118 WB_RGGBLevelsUnknown9? int16s[4] + 122 ColorTempUnknown9? int16s + 123 WB_RGGBLevelsUnknown10? int16s[4] + 127 ColorTempUnknown10? int16s + 128 WB_RGGBLevelsUnknown11? int16s[4] + 132 ColorTempUnknown11? int16s + 133 WB_RGGBLevelsDaylight int16s[4] + 137 ColorTempDaylight int16s + 138 WB_RGGBLevelsShade int16s[4] + 142 ColorTempShade int16s + 143 WB_RGGBLevelsCloudy int16s[4] + 147 ColorTempCloudy int16s + 148 WB_RGGBLevelsTungsten int16s[4] + 152 ColorTempTungsten int16s + 153 WB_RGGBLevelsFluorescent int16s[4] + 157 ColorTempFluorescent int16s + 158 WB_RGGBLevelsKelvin int16s[4] + 162 ColorTempKelvin int16s + 163 WB_RGGBLevelsFlash int16s[4] + 167 ColorTempFlash int16s + 168 WB_RGGBLevelsUnknown12? int16s[4] + 172 ColorTempUnknown12? int16s + 173 WB_RGGBLevelsUnknown13? int16s[4] + 177 ColorTempUnknown13? int16s + 178 WB_RGGBLevelsUnknown14? int16s[4] + 182 ColorTempUnknown14? int16s + 183 WB_RGGBLevelsUnknown15? int16s[4] + 187 ColorTempUnknown15? int16s + 188 WB_RGGBLevelsUnknown16? int16s[4] + 192 ColorTempUnknown16? int16s + 193 WB_RGGBLevelsUnknown17? int16s[4] + 197 ColorTempUnknown17? int16s + 198 WB_RGGBLevelsUnknown18? int16s[4] + 202 ColorTempUnknown18? int16s + 203 WB_RGGBLevelsUnknown19? int16s[4] + 207 ColorTempUnknown19? int16s + 208 WB_RGGBLevelsUnknown20? int16s[4] + 212 ColorTempUnknown20? int16s + 213 WB_RGGBLevelsUnknown21? int16s[4] + 217 ColorTempUnknown21? int16s + 218 WB_RGGBLevelsUnknown22? int16s[4] + 222 ColorTempUnknown22? int16s + 223 WB_RGGBLevelsUnknown23? int16s[4] + 227 ColorTempUnknown23? int16s + 228 WB_RGGBLevelsUnknown24? int16s[4] + 232 ColorTempUnknown24? int16s + 233 WB_RGGBLevelsUnknown25? int16s[4] + 237 ColorTempUnknown25? int16s + 238 WB_RGGBLevelsUnknown26? int16s[4] + 242 ColorTempUnknown26? int16s + 243 WB_RGGBLevelsUnknown27? int16s[4] + 247 ColorTempUnknown27? int16s + 248 WB_RGGBLevelsUnknown28? int16s[4] + 252 ColorTempUnknown28? int16s + 253 WB_RGGBLevelsUnknown29? int16s[4] + 257 ColorTempUnknown29? int16s + 258 WB_RGGBLevelsUnknown30? int16s[4] + 262 ColorTempUnknown30? int16s + 263 ColorCalib? Canon ColorCalib + 326 AverageBlackLevel int16u[4] + 556 PerChannelBlackLevel int16u[4] + 560 NormalWhiteLevel int16u + 561 SpecularWhiteLevel int16u + 562 LinearityUpperMargin int16u + 778 PerChannelBlackLevel int16u[4] + 782 NormalWhiteLevel int16u + 783 SpecularWhiteLevel int16u + 784 LinearityUpperMargin int16u + +=head3 Canon ColorData9 Tags + +These tags are used by the M6mkII, M50, M200, EOS R, RP, 90D, 250D and 850D + + Index2 Tag Name Writable + ------ -------- -------- + 0 ColorDataVersion int16s + 71 WB_RGGBLevelsAsShot int16s[4] + 75 ColorTempAsShot int16s + 76 WB_RGGBLevelsAuto int16s[4] + 80 ColorTempAuto int16s + 81 WB_RGGBLevelsMeasured int16s[4] + 85 ColorTempMeasured int16s + 86 WB_RGGBLevelsUnknown? int16s[4] + 90 ColorTempUnknown? int16s + 91 WB_RGGBLevelsUnknown2? int16s[4] + 95 ColorTempUnknown2? int16s + 96 WB_RGGBLevelsUnknown3? int16s[4] + 100 ColorTempUnknown3? int16s + 101 WB_RGGBLevelsUnknown4? int16s[4] + 105 ColorTempUnknown4? int16s + 106 WB_RGGBLevelsUnknown5? int16s[4] + 110 ColorTempUnknown5? int16s + 111 WB_RGGBLevelsUnknown6? int16s[4] + 115 ColorTempUnknown6? int16s + 116 WB_RGGBLevelsUnknown7? int16s[4] + 120 ColorTempUnknown7? int16s + 121 WB_RGGBLevelsUnknown8? int16s[4] + 125 ColorTempUnknown8? int16s + 126 WB_RGGBLevelsUnknown9? int16s[4] + 130 ColorTempUnknown9? int16s + 131 WB_RGGBLevelsUnknown10? int16s[4] + 135 ColorTempUnknown10? int16s + 136 WB_RGGBLevelsDaylight int16s[4] + 140 ColorTempDaylight int16s + 141 WB_RGGBLevelsShade int16s[4] + 145 ColorTempShade int16s + 146 WB_RGGBLevelsCloudy int16s[4] + 150 ColorTempCloudy int16s + 151 WB_RGGBLevelsTungsten int16s[4] + 155 ColorTempTungsten int16s + 156 WB_RGGBLevelsFluorescent int16s[4] + 160 ColorTempFluorescent int16s + 161 WB_RGGBLevelsKelvin int16s[4] + 165 ColorTempKelvin int16s + 166 WB_RGGBLevelsFlash int16s[4] + 170 ColorTempFlash int16s + 171 WB_RGGBLevelsUnknown11? int16s[4] + 175 ColorTempUnknown11? int16s + 176 WB_RGGBLevelsUnknown12? int16s[4] + 180 ColorTempUnknown12? int16s + 181 WB_RGGBLevelsUnknown13? int16s[4] + 185 ColorTempUnknown13? int16s + 186 WB_RGGBLevelsUnknown14? int16s[4] + 190 ColorTempUnknown14? int16s + 191 WB_RGGBLevelsUnknown15? int16s[4] + 195 ColorTempUnknown15? int16s + 196 WB_RGGBLevelsUnknown16? int16s[4] + 200 ColorTempUnknown16? int16s + 201 WB_RGGBLevelsUnknown17? int16s[4] + 205 ColorTempUnknown17? int16s + 206 WB_RGGBLevelsUnknown18? int16s[4] + 210 ColorTempUnknown18? int16s + 211 WB_RGGBLevelsUnknown19? int16s[4] + 215 ColorTempUnknown19? int16s + 216 WB_RGGBLevelsUnknown20? int16s[4] + 220 ColorTempUnknown20? int16s + 221 WB_RGGBLevelsUnknown21? int16s[4] + 225 ColorTempUnknown21? int16s + 226 WB_RGGBLevelsUnknown22? int16s[4] + 230 ColorTempUnknown22? int16s + 231 WB_RGGBLevelsUnknown23? int16s[4] + 235 ColorTempUnknown23? int16s + 236 WB_RGGBLevelsUnknown24? int16s[4] + 240 ColorTempUnknown24? int16s + 241 WB_RGGBLevelsUnknown25? int16s[4] + 245 ColorTempUnknown25? int16s + 246 WB_RGGBLevelsUnknown26? int16s[4] + 250 ColorTempUnknown26? int16s + 251 WB_RGGBLevelsUnknown27? int16s[4] + 255 ColorTempUnknown27? int16s + 256 WB_RGGBLevelsUnknown28? int16s[4] + 260 ColorTempUnknown28? int16s + 261 WB_RGGBLevelsUnknown29? int16s[4] + 265 ColorTempUnknown29? int16s + 266 ColorCalib? Canon ColorCalib + 329 PerChannelBlackLevel int16u[4] + 796 NormalWhiteLevel int16u + 797 SpecularWhiteLevel int16u + 798 LinearityUpperMargin int16u + +=head3 Canon ColorData10 Tags + +These tags are used by the R5, R5 and EOS 1DXmkIII. + + Index2 Tag Name Writable + ------ -------- -------- + 0 ColorDataVersion int16s + 85 WB_RGGBLevelsAsShot int16s[4] + 89 ColorTempAsShot int16s + 90 WB_RGGBLevelsAuto int16s[4] + 94 ColorTempAuto int16s + 95 WB_RGGBLevelsMeasured int16s[4] + 99 ColorTempMeasured int16s + 100 WB_RGGBLevelsUnknown? int16s[4] + 104 ColorTempUnknown? int16s + 105 WB_RGGBLevelsUnknown2? int16s[4] + 109 ColorTempUnknown2? int16s + 110 WB_RGGBLevelsUnknown3? int16s[4] + 114 ColorTempUnknown3? int16s + 115 WB_RGGBLevelsUnknown4? int16s[4] + 119 ColorTempUnknown4? int16s + 120 WB_RGGBLevelsUnknown5? int16s[4] + 124 ColorTempUnknown5? int16s + 125 WB_RGGBLevelsUnknown6? int16s[4] + 129 ColorTempUnknown6? int16s + 130 WB_RGGBLevelsUnknown7? int16s[4] + 134 ColorTempUnknown7? int16s + 135 WB_RGGBLevelsUnknown8? int16s[4] + 139 ColorTempUnknown8? int16s + 140 WB_RGGBLevelsUnknown9? int16s[4] + 144 ColorTempUnknown9? int16s + 145 WB_RGGBLevelsUnknown10? int16s[4] + 149 ColorTempUnknown10? int16s + 150 WB_RGGBLevelsDaylight int16s[4] + 154 ColorTempDaylight int16s + 155 WB_RGGBLevelsShade int16s[4] + 159 ColorTempShade int16s + 160 WB_RGGBLevelsCloudy int16s[4] + 164 ColorTempCloudy int16s + 165 WB_RGGBLevelsTungsten int16s[4] + 169 ColorTempTungsten int16s + 170 WB_RGGBLevelsFluorescent int16s[4] + 174 ColorTempFluorescent int16s + 175 WB_RGGBLevelsKelvin int16s[4] + 179 ColorTempKelvin int16s + 180 WB_RGGBLevelsFlash int16s[4] + 184 ColorTempFlash int16s + 185 WB_RGGBLevelsUnknown11? int16s[4] + 189 ColorTempUnknown11? int16s + 190 WB_RGGBLevelsUnknown12? int16s[4] + 194 ColorTempUnknown12? int16s + 195 WB_RGGBLevelsUnknown13? int16s[4] + 199 ColorTempUnknown13? int16s + 200 WB_RGGBLevelsUnknown14? int16s[4] + 204 ColorTempUnknown14? int16s + 205 WB_RGGBLevelsUnknown15? int16s[4] + 209 ColorTempUnknown15? int16s + 210 WB_RGGBLevelsUnknown16? int16s[4] + 214 ColorTempUnknown16? int16s + 215 WB_RGGBLevelsUnknown17? int16s[4] + 219 ColorTempUnknown17? int16s + 220 WB_RGGBLevelsUnknown18? int16s[4] + 224 ColorTempUnknown18? int16s + 225 WB_RGGBLevelsUnknown19? int16s[4] + 229 ColorTempUnknown19? int16s + 230 WB_RGGBLevelsUnknown20? int16s[4] + 234 ColorTempUnknown20? int16s + 235 WB_RGGBLevelsUnknown21? int16s[4] + 239 ColorTempUnknown21? int16s + 240 WB_RGGBLevelsUnknown22? int16s[4] + 244 ColorTempUnknown22? int16s + 245 WB_RGGBLevelsUnknown23? int16s[4] + 249 ColorTempUnknown23? int16s + 250 WB_RGGBLevelsUnknown24? int16s[4] + 254 ColorTempUnknown24? int16s + 255 WB_RGGBLevelsUnknown25? int16s[4] + 259 ColorTempUnknown25? int16s + 260 WB_RGGBLevelsUnknown26? int16s[4] + 264 ColorTempUnknown26? int16s + 265 WB_RGGBLevelsUnknown27? int16s[4] + 269 ColorTempUnknown27? int16s + 270 WB_RGGBLevelsUnknown28? int16s[4] + 274 ColorTempUnknown28? int16s + 275 WB_RGGBLevelsUnknown29? int16s[4] + 279 ColorTempUnknown29? int16s + 280 ColorCalib? Canon ColorCalib + 343 PerChannelBlackLevel int16u[4] + 810 NormalWhiteLevel int16u + 811 SpecularWhiteLevel int16u + 812 LinearityUpperMargin int16u + +=head3 Canon ColorData11 Tags + +These tags are used by the EOS R3 + + Index2 Tag Name Writable + ------ -------- -------- + 0 ColorDataVersion int16s + 105 WB_RGGBLevelsAsShot int16s[4] + 109 ColorTempAsShot int16s + 110 WB_RGGBLevelsAuto int16s[4] + 114 ColorTempAuto int16s + 115 WB_RGGBLevelsMeasured int16s[4] + 119 ColorTempMeasured int16s + 120 WB_RGGBLevelsUnknown? int16s[4] + 124 ColorTempUnknown? int16s + 125 WB_RGGBLevelsUnknown2? int16s[4] + 129 ColorTempUnknown2? int16s + 130 WB_RGGBLevelsUnknown3? int16s[4] + 134 ColorTempUnknown3? int16s + 135 WB_RGGBLevelsUnknown4? int16s[4] + 139 ColorTempUnknown4? int16s + 140 WB_RGGBLevelsUnknown5? int16s[4] + 144 ColorTempUnknown5? int16s + 145 WB_RGGBLevelsUnknown6? int16s[4] + 149 ColorTempUnknown6? int16s + 150 WB_RGGBLevelsUnknown7? int16s[4] + 154 ColorTempUnknown7? int16s + 155 WB_RGGBLevelsUnknown8? int16s[4] + 159 ColorTempUnknown8? int16s + 160 WB_RGGBLevelsUnknown9? int16s[4] + 164 ColorTempUnknown9? int16s + 165 WB_RGGBLevelsUnknown10? int16s[4] + 169 ColorTempUnknown10? int16s + 170 WB_RGGBLevelsUnknown11? int16s[4] + 174 ColorTempUnknown11? int16s + 175 WB_RGGBLevelsUnknown11? int16s[4] + 179 ColorTempUnknown11? int16s + 180 WB_RGGBLevelsUnknown12? int16s[4] + 184 ColorTempUnknown12? int16s + 185 WB_RGGBLevelsUnknown13? int16s[4] + 189 ColorTempUnknown13? int16s + 190 WB_RGGBLevelsUnknown14? int16s[4] + 194 ColorTempUnknown14? int16s + 195 WB_RGGBLevelsUnknown15? int16s[4] + 199 ColorTempUnknown15? int16s + 200 WB_RGGBLevelsUnknown16? int16s[4] + 204 ColorTempUnknown16? int16s + 205 WB_RGGBLevelsDaylight int16s[4] + 209 ColorTempDaylight int16s + 210 WB_RGGBLevelsShade int16s[4] + 214 ColorTempShade int16s + 215 WB_RGGBLevelsCloudy int16s[4] + 219 ColorTempCloudy int16s + 220 WB_RGGBLevelsTungsten int16s[4] + 224 ColorTempTungsten int16s + 225 WB_RGGBLevelsFluorescent int16s[4] + 229 ColorTempFluorescent int16s + 230 WB_RGGBLevelsKelvin int16s[4] + 234 ColorTempKelvin int16s + 235 WB_RGGBLevelsFlash int16s[4] + 239 ColorTempFlash int16s + 240 WB_RGGBLevelsUnknown17? int16s[4] + 244 ColorTempUnknown17? int16s + 245 WB_RGGBLevelsUnknown18? int16s[4] + 249 ColorTempUnknown18? int16s + 250 WB_RGGBLevelsUnknown19? int16s[4] + 254 ColorTempUnknown19? int16s + 255 WB_RGGBLevelsUnknown20? int16s[4] + 259 ColorTempUnknown20? int16s + 260 WB_RGGBLevelsUnknown21? int16s[4] + 264 ColorTempUnknown21? int16s + 265 WB_RGGBLevelsUnknown22? int16s[4] + 269 ColorTempUnknown22? int16s + 270 WB_RGGBLevelsUnknown23? int16s[4] + 274 ColorTempUnknown23? int16s + 275 WB_RGGBLevelsUnknown24? int16s[4] + 279 ColorTempUnknown24? int16s + 280 WB_RGGBLevelsUnknown25? int16s[4] + 284 ColorTempUnknown25? int16s + 285 WB_RGGBLevelsUnknown26? int16s[4] + 289 ColorTempUnknown26? int16s + 290 WB_RGGBLevelsUnknown27? int16s[4] + 294 ColorTempUnknown27? int16s + 300 ColorCalib? Canon ColorCalib + 363 PerChannelBlackLevel int16u[4] + 640 NormalWhiteLevel int16u + 641 SpecularWhiteLevel int16u + 642 LinearityUpperMargin int16u + +=head3 Canon ColorDataUnknown Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 ColorDataVersion no + +=head3 Canon ColorInfo Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 Saturation int16s + 2 ColorTone int16s + 3 ColorSpace int16s + +=head3 Canon AFMicroAdj Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 AFMicroAdjMode int32s + 2 AFMicroAdjValue rational64s + +=head3 Canon VignettingCorr Tags + +This information is found in images from newer EOS models. + + Index2 Tag Name Writable + ------ -------- -------- + 0 VignettingCorrVersion no + 2 PeripheralLighting int16s + 3 DistortionCorrection int16s + 4 ChromaticAberrationCorr int16s + 5 ChromaticAberrationCorr int16s + 6 PeripheralLightingValue int16s + 9 DistortionCorrectionValue int16s + 11 OriginalImageWidth int16s + 12 OriginalImageHeight int16s + +=head3 Canon VignettingCorrUnknown Tags + +Vignetting correction from PowerShot models. + + Index2 Tag Name Writable + ------ -------- -------- + 0 VignettingCorrVersion no + +=head3 Canon VignettingCorr2 Tags + + Index4 Tag Name Writable + ------ -------- -------- + 5 PeripheralLightingSetting int32s + 6 ChromaticAberrationSetting int32s + 7 DistortionCorrectionSetting int32s + +=head3 Canon LightingOpt Tags + +This information is new in images from the EOS 7D. + + Index4 Tag Name Writable + ------ -------- -------- + 1 PeripheralIlluminationCorr int32s + 2 AutoLightingOptimizer int32s + 3 HighlightTonePriority int32s + 4 LongExposureNoiseReduction int32s + 5 HighISONoiseReduction int32s + +=head3 Canon LensInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensSerialNumber undef[5] + +=head3 Canon Ambience Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 AmbienceSelection int32s + +=head3 Canon MultiExp Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 MultiExposure int32s + 2 MultiExposureControl int32s + 3 MultiExposureShots int32s + +=head3 Canon FilterInfo Tags + +Information about creative filter settings. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0101 GrainyBWFilter no + 0x0201 SoftFocusFilter no + 0x0301 ToyCameraFilter no + 0x0401 MiniatureFilter no + 0x0402 MiniatureFilterOrientation no + 0x0403 MiniatureFilterPosition no + 0x0404 MiniatureFilterParameter no + 0x0501 FisheyeFilter no + 0x0601 PaintingFilter no + 0x0701 WatercolorFilter no + +=head3 Canon HDRInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 HDR int32s + 2 HDREffect int32s + +=head3 Canon LogInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 4 CompressionFormat int32s + 6 Sharpness int32s + 7 Saturation int32s + 8 ColorTone int32s + 9 ColorSpace2 int32s + 10 ColorMatrix int32s + 11 CanonLogVersion int32s + +=head3 Canon AFConfig Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 AFConfigTool int32s + 2 AFTrackingSensitivity int32s + 3 AFAccelDecelTracking int32s + 4 AFPointSwitching int32s + 5 AIServoFirstImage int32s + 6 AIServoSecondImage int32s + 7 USMLensElectronicMF int32s + 8 AFAssistBeam int32s + 9 OneShotAFRelease int32s + 10 AutoAFPointSelEOSiTRAF int32s + 11 LensDriveWhenAFImpossible int32s + 12 SelectAFAreaSelectionMode int32s + 13 AFAreaSelectionMethod int32s + 14 OrientationLinkedAF int32s + 15 ManualAFPointSelPattern int32s + 16 AFPointDisplayDuringFocus int32s + 17 VFDisplayIllumination int32s + 18 AFStatusViewfinder int32s + 19 InitialAFPointInServo int32s + +=head3 Canon RawBurstInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 RawBurstImageNum int32u + 2 RawBurstImageCount int32u + +=head3 Canon CTMD Tags + +Canon Timed MetaData tags found in CR3 images. The ExtractEmbedded option +is automatically applied when reading CR3 files to be able to extract this +information. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 TimeStamp no + 0x0004 FocalInfo Canon FocalInfo + 0x0005 ExposureInfo Canon ExposureInfo + 0x0007 ExifInfo7 Canon ExifInfo + 0x0008 ExifInfo8 Canon ExifInfo + 0x0009 ExifInfo9 Canon ExifInfo + +=head3 Canon FocalInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 FocalLength no + +=head3 Canon ExposureInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 FNumber no + 1 ExposureTime no + 2 ISO no + +=head3 Canon ExifInfo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x8769 ExifIFD EXIF + 0x927c MakerNoteCanon Canon + +=head3 Canon CDI1 Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'IAD1' IAD1 Canon IAD1 + +=head3 Canon IAD1 Tags + + Index2 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Canon CMP1 Tags + + Index2 Tag Name Writable + ------ -------- -------- + 8 ImageWidth no + 10 ImageHeight no + +=head3 Canon CNOP Tags + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Canon CNTH Tags + +Canon-specific QuickTime tags found in the CNTH atom of MOV/MP4 videos from +some cameras. + + Tag ID Tag Name Writable + ------ -------- -------- + 'CNDA' ThumbnailImage undef + +=head3 Canon uuid Tags + +Tags extracted from the uuid atom of MP4 videos from cameras such as the +SX280, and CR3 images from cameras such as the EOS M50. + + Tag ID Tag Name Writable + ------ -------- -------- + 'CCTP' CanonCCTP Canon CCTP + 'CMT1' IFD0 EXIF + 'CMT2' ExifIFD EXIF + 'CMT3' MakerNoteCanon Canon + 'CMT4' GPSInfo GPS + 'CNCV' CompressorVersion no + 'CNOP' CanonCNOP Canon CNOP + 'CNTH' CanonCNTH Canon CNTH + 'THMB' ThumbnailImage no + +=head3 Canon CCTP Tags + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Canon Skip Tags + +Information found in the "skip" atom of Canon MOV videos. + + Tag ID Tag Name Writable + ------ -------- -------- + 'CNDB' Unknown_CNDB? no + +=head3 Canon uuid2 Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'CNOP' CanonVRD CanonVRD + +=head2 CanonCustom Tags + +=head3 CanonCustom Functions1D Tags + +These custom functions are used by all 1D models up to but not including the +Mark III. + + Tag ID Tag Name Writable + ------ -------- -------- + 0 FocusingScreen int8u + 1 FinderDisplayDuringExposure int8u + 2 ShutterReleaseNoCFCard int8u + 3 ISOSpeedExpansion int8u + 4 ShutterAELButton int8u + 5 ManualTv int8u + 6 ExposureLevelIncrements int8u + 7 USMLensElectronicMF int8u + 8 LCDPanels int8u + 9 AEBSequenceAutoCancel int8u + 10 AFPointIllumination int8u + 11 AFPointSelection int8u + 12 MirrorLockup int8u + 13 AFPointSpotMetering int8u + 14 FillFlashAutoReduction int8u + 15 ShutterCurtainSync int8u + 16 SafetyShiftInAvOrTv int8u + 17 AFPointActivationArea int8u + 18 SwitchToRegisteredAFPoint int8u + 19 LensAFStopButton int8u + 20 AIServoTrackingSensitivity int8u + 21 AIServoContinuousShooting int8u + +=head3 CanonCustom Functions5D Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0 FocusingScreen int8u + 1 SetFunctionWhenShooting int8u + 2 LongExposureNoiseReduction int8u + 3 FlashSyncSpeedAv int8u + 4 Shutter-AELock int8u + 5 AFAssistBeam int8u + 6 ExposureLevelIncrements int8u + 7 FlashFiring int8u + 8 ISOExpansion int8u + 9 AEBSequenceAutoCancel int8u + 10 SuperimposedDisplay int8u + 11 MenuButtonDisplayPosition int8u + 12 MirrorLockup int8u + 13 AFPointSelectionMethod int8u + 14 ETTLII int8u + 15 ShutterCurtainSync int8u + 16 SafetyShiftInAvOrTv int8u + 17 AFPointActivationArea int8u + 18 LCDDisplayReturnToShoot int8u + 19 LensAFStopButton int8u + 20 AddOriginalDecisionData int8u + +=head3 CanonCustom Functions10D Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 1 SetButtonWhenShooting int8u + 2 ShutterReleaseNoCFCard int8u + 3 FlashSyncSpeedAv int8u + 4 Shutter-AELock int8u + 5 AFAssist int8u + 6 ExposureLevelIncrements int8u + 7 AFPointRegistration int8u + 8 RawAndJpgRecording int8u + 9 AEBSequenceAutoCancel int8u + 10 SuperimposedDisplay int8u + 11 MenuButtonDisplayPosition int8u + 12 MirrorLockup int8u + 13 AssistButtonFunction int8u + 14 FillFlashAutoReduction int8u + 15 ShutterCurtainSync int8u + 16 SafetyShiftInAvOrTv int8u + 17 LensAFStopButton int8u + +=head3 CanonCustom Functions20D Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0 SetFunctionWhenShooting int8u + 1 LongExposureNoiseReduction int8u + 2 FlashSyncSpeedAv int8u + 3 Shutter-AELock int8u + 4 AFAssistBeam int8u + 5 ExposureLevelIncrements int8u + 6 FlashFiring int8u + 7 ISOExpansion int8u + 8 AEBSequenceAutoCancel int8u + 9 SuperimposedDisplay int8u + 10 MenuButtonDisplayPosition int8u + 11 MirrorLockup int8u + 12 AFPointSelectionMethod int8u + 13 ETTLII int8u + 14 ShutterCurtainSync int8u + 15 SafetyShiftInAvOrTv int8u + 16 LensAFStopButton int8u + 17 AddOriginalDecisionData int8u + +=head3 CanonCustom Functions30D Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 1 SetFunctionWhenShooting int8u + 2 LongExposureNoiseReduction int8u + 3 FlashSyncSpeedAv int8u + 4 Shutter-AELock int8u + 5 AFAssistBeam int8u + 6 ExposureLevelIncrements int8u + 7 FlashFiring int8u + 8 ISOExpansion int8u + 9 AEBSequenceAutoCancel int8u + 10 SuperimposedDisplay int8u + 11 MenuButtonDisplayPosition int8u + 12 MirrorLockup int8u + 13 AFPointSelectionMethod int8u + 14 ETTLII int8u + 15 ShutterCurtainSync int8u + 16 SafetyShiftInAvOrTv int8u + 17 MagnifiedView int8u + 18 LensAFStopButton int8u + 19 AddOriginalDecisionData int8u + +=head3 CanonCustom Functions350D Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0 SetButtonCrossKeysFunc int8u + 1 LongExposureNoiseReduction int8u + 2 FlashSyncSpeedAv int8u + 3 Shutter-AELock int8u + 4 AFAssistBeam int8u + 5 ExposureLevelIncrements int8u + 6 MirrorLockup int8u + 7 ETTLII int8u + 8 ShutterCurtainSync int8u + +=head3 CanonCustom Functions400D Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0 SetButtonCrossKeysFunc int8u + 1 LongExposureNoiseReduction int8u + 2 FlashSyncSpeedAv int8u + 3 Shutter-AELock int8u + 4 AFAssistBeam int8u + 5 ExposureLevelIncrements int8u + 6 MirrorLockup int8u + 7 ETTLII int8u + 8 ShutterCurtainSync int8u + 9 MagnifiedView int8u + 10 LCDDisplayAtPowerOn int8u + +=head3 CanonCustom FunctionsD30 Tags + +Custom functions for the EOS D30 and D60. + + Tag ID Tag Name Writable + ------ -------- -------- + 1 LongExposureNoiseReduction int8u + 2 Shutter-AELock int8u + 3 MirrorLockup int8u + 4 ExposureLevelIncrements int8u + 5 AFAssist int8u + 6 FlashSyncSpeedAv int8u + 7 AEBSequenceAutoCancel int8u + 8 ShutterCurtainSync int8u + 9 LensAFStopButton int8u + 10 FillFlashAutoReduction int8u + 11 MenuButtonReturn int8u + 12 SetButtonWhenShooting int8u + 13 SensorCleaning int8u + 14 SuperimposedDisplay int8u + 15 ShutterReleaseNoCFCard int8u + +=head3 CanonCustom FuncsUnknown Tags + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 CanonCustom PersonalFuncs Tags + +Personal function settings for the EOS-1D. + + Index2 Tag Name Writable + ------ -------- -------- + 1 PF0CustomFuncRegistration int16u + 2 PF1DisableShootingModes int16u + 3 PF2DisableMeteringModes int16u + 4 PF3ManualExposureMetering int16u + 5 PF4ExposureTimeLimits int16u + 6 PF5ApertureLimits int16u + 7 PF6PresetShootingModes int16u + 8 PF7BracketContinuousShoot int16u + 9 PF8SetBracketShots int16u + 10 PF9ChangeBracketSequence int16u + 11 PF10RetainProgramShift int16u + 14 PF13DrivePriority int16u + 15 PF14DisableFocusSearch int16u + 16 PF15DisableAFAssistBeam int16u + 17 PF16AutoFocusPointShoot int16u + 18 PF17DisableAFPointSel int16u + 19 PF18EnableAutoAFPointSel int16u + 20 PF19ContinuousShootSpeed int16u + 21 PF20LimitContinousShots int16u + 22 PF21EnableQuietOperation int16u + 24 PF23SetTimerLengths int16u + 25 PF24LightLCDDuringBulb int16u + 26 PF25DefaultClearSettings int16u + 27 PF26ShortenReleaseLag int16u + 28 PF27ReverseDialRotation int16u + 29 PF28NoQuickDialExpComp int16u + 30 PF29QuickDialSwitchOff int16u + 31 PF30EnlargementMode int16u + 32 PF31OriginalDecisionData int16u + +=head3 CanonCustom PersonalFuncValues Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 PF1Value int16u + 2 PF2Value int16u + 3 PF3Value int16u + 4 PF4ExposureTimeMin int16u + 5 PF4ExposureTimeMax int16u + 6 PF5ApertureMin int16u + 7 PF5ApertureMax int16u + 8 PF8BracketShots int16u + 9 PF19ShootingSpeedLow int16u + 10 PF19ShootingSpeedHigh int16u + 11 PF20MaxContinousShots int16u + 12 PF23ShutterButtonTime int16u + 13 PF23FELockTime int16u + 14 PF23PostReleaseTime int16u + 15 PF25AEMode int16u + 16 PF25MeteringMode int16u + 17 PF25DriveMode int16u + 18 PF25AFMode int16u + 19 PF25AFPointSel int16u + 20 PF25ImageSize int16u + 21 PF25WBMode int16u + 22 PF25Parameters int16u + 23 PF25ColorMatrix int16u + 24 PF27Value int16u + +=head3 CanonCustom Functions2 Tags + +Beginning with the EOS 1D Mark III, Canon finally created a set of custom +function tags which are (reasonably) consistent across models. The EOS 1D +Mark III has 57 custom function tags divided into four main groups: 1. +Exposure (0x0101-0x010f), 2. Image (0x0201-0x0203), Flash Exposure +(0x0304-0x0306) and Display (0x0407-0x0409), 3. Auto Focus (0x0501-0x050e) +and Drive (0x060f-0x0611), and 4. Operation (0x0701-0x070a) and Others +(0x080b-0x0810). The table below lists tags used by the EOS 1D Mark III, as +well as newer tags and values added by later models. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0101 ExposureLevelIncrements int32s + 0x0102 ISOSpeedIncrements int32s + 0x0103 ISOSpeedRange int32s[3] + ISOExpansion int32s + 0x0104 AEBAutoCancel int32s + 0x0105 AEBSequence int32s + 0x0106 AEBShotCount int32s + AEBShotCount int32s[2] + 0x0107 SpotMeterLinkToAFPoint int32s + 0x0108 SafetyShift int32s + 0x0109 UsableShootingModes int32s + UsableShootingModes int32s[2] + 0x010a UsableMeteringModes int32s + UsableMeteringModes int32s[2] + 0x010b ExposureModeInManual int32s + 0x010c ShutterSpeedRange int32s[3] + ShutterSpeedRange int32s[4] + 0x010d ApertureRange int32s[3] + ApertureRange int32s[4] + 0x010e ApplyShootingMeteringMode int32s[8] + 0x010f FlashSyncSpeedAv int32s + 0x0110 AEMicroadjustment int32s[3] + 0x0111 FEMicroadjustment int32s[3] + 0x0112 SameExposureForNewAperture int32s + 0x0113 ExposureCompAutoCancel int32s + 0x0114 AELockMeterModeAfterFocus int32s + 0x0201 LongExposureNoiseReduction int32s + 0x0202 HighISONoiseReduction int32s + 0x0203 HighlightTonePriority int32s + 0x0204 AutoLightingOptimizer int32s + 0x0304 ETTLII int32s + 0x0305 ShutterCurtainSync int32s + 0x0306 FlashFiring int32s + 0x0407 ViewInfoDuringExposure int32s + 0x0408 LCDIlluminationDuringBulb int32s + 0x0409 InfoButtonWhenShooting int32s + 0x040a ViewfinderWarnings int32s + 0x040b LVShootingAreaDisplay int32s + 0x040c LVShootingAreaDisplay int32s + 0x0501 USMLensElectronicMF int32s + 0x0502 AIServoTrackingSensitivity int32s + 0x0503 AIServoImagePriority int32s + 0x0504 AIServoTrackingMethod int32s + 0x0505 LensDriveNoAF int32s + 0x0506 LensAFStopButton int32s + 0x0507 AFMicroadjustment int32s[5] + 0x0508 AFPointAreaExpansion int32s + 0x0509 SelectableAFPoint int32s + 0x050a SwitchToRegisteredAFPoint int32s + 0x050b AFPointAutoSelection int32s + 0x050c AFPointDisplayDuringFocus int32s + 0x050d AFPointBrightness int32s + 0x050e AFAssistBeam int32s + 0x050f AFPointSelectionMethod int32s + 0x0510 VFDisplayIllumination int32s + SuperimposedDisplay int32s + 0x0511 AFDuringLiveView int32s + 0x0512 SelectAFAreaSelectMode int32s + 0x0513 ManualAFPointSelectPattern int32s + 0x0514 DisplayAllAFPoints int32s + 0x0515 FocusDisplayAIServoAndMF int32s + 0x0516 OrientationLinkedAFPoint int32s + 0x0517 MultiControllerWhileMetering int32s + 0x0518 AccelerationTracking int32s + 0x0519 AIServoFirstImagePriority int32s + 0x051a AIServoSecondImagePriority int32s + 0x051b AFAreaSelectMethod int32s + 0x051c AutoAFPointColorTracking int32s + 0x051d VFDisplayIllumination int32s + 0x051e InitialAFPointAIServoAF int32s + 0x060f MirrorLockup int32s + 0x0610 ContinuousShootingSpeed int32s[6] + ContinuousShootingSpeed int32s[5] + ContinuousShootingSpeed int32s[3] + 0x0611 ContinuousShotLimit int32s[2] + 0x0612 RestrictDriveModes int32s + RestrictDriveModes int32s[2] + 0x0701 Shutter-AELock int32s + AFAndMeteringButtons int32s + ShutterButtonAFOnButton int32s + 0x0702 AFOnAELockButtonSwitch int32s + 0x0703 QuickControlDialInMeter int32s + 0x0704 SetButtonWhenShooting int32s + 0x0705 ManualTv int32s + 0x0706 DialDirectionTvAv int32s + 0x0707 AvSettingWithoutLens int32s + 0x0708 WBMediaImageSizeSetting int32s + 0x0709 LockMicrophoneButton int32s + 0x070a ButtonFunctionControlOff int32s + 0x070b AssignFuncButton int32s + 0x070c CustomControls int32s + 0x070d StartMovieShooting int32s + 0x070e FlashButtonFunction int32s + 0x070f MultiFunctionLock int32s + 0x0710 TrashButtonFunction int32s + 0x0711 ShutterReleaseWithoutLens int32s + 0x0712 ControlRingRotation int32s + 0x0713 FocusRingRotation int32s + 0x0714 RFLensMFFocusRingSensitivity int32s + 0x0715 CustomizeDials int32s + 0x080b FocusingScreen int32s + 0x080c TimerLength int32s[3] + TimerLength int32s[4] + 0x080d ShortReleaseTimeLag int32s + 0x080e AddAspectRatioInfo int32s + 0x080f AddOriginalDecisionData int32s + 0x0810 LiveViewExposureSimulation int32s + 0x0811 LCDDisplayAtPowerOn int32s + 0x0812 MemoAudioQuality int32s + 0x0813 DefaultEraseOption int32s + 0x0814 RetractLensOnPowerOff int32s + 0x0815 AddIPTCInformation int32s + 0x0816 AudioCompression int32s + +=head2 CanonVRD Tags + +Canon Digital Photo Professional writes VRD (Recipe Data) information as a +trailer record to JPEG, TIFF, CRW and CR2 images, or as stand-alone VRD or +DR4 files. The tags listed below represent information found in these +records. The complete VRD/DR4 data record may be accessed as a block using +the Extra 'CanonVRD' or 'CanonDR4' tag, but this tag is not extracted or +copied unless specified explicitly. + + Tag ID Tag Name Writable + ------ -------- -------- + 0xffff00f4 EditData CanonVRD Edit + 0xffff00f5 IHLData CanonVRD IHL + 0xffff00f6 XMP XMP + 0xffff00f7 Edit4Data CanonVRD Edit4 + +=head3 CanonVRD Edit Tags + +Canon VRD edit information. + + Index Tag Name Writable + ----- -------- -------- + 0 VRD1 CanonVRD Ver1 + 1 VRDStampTool CanonVRD StampTool + 2 VRD2 CanonVRD Ver2 + +=head3 CanonVRD Ver1 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 2 VRDVersion no + 6 WBAdjRGGBLevels int16u[4] + 24 WhiteBalanceAdj int16u + 26 WBAdjColorTemp int16u + 36 WBFineTuneActive int16u + 40 WBFineTuneSaturation int16u + 44 WBFineTuneTone int16u + 46 RawColorAdj int16u + 48 RawCustomSaturation int32s + 52 RawCustomTone int32s + 56 RawBrightnessAdj int32s + 60 ToneCurveProperty int16u + 122 DynamicRangeMin int16u + 124 DynamicRangeMax int16u + 272 ToneCurveActive int16u + 275 ToneCurveMode int8u + 276 BrightnessAdj int8s + 277 ContrastAdj int8s + 278 SaturationAdj int16s + 286 ColorToneAdj int32s + 294 LuminanceCurvePoints int16u[21] + 336 LuminanceCurveLimits int16u[4] + 345 ToneCurveInterpolation int8u + 352 RedCurvePoints int16u[21] + 394 RedCurveLimits int16u[4] + 410 GreenCurvePoints int16u[21] + 452 GreenCurveLimits int16u[4] + 468 BlueCurvePoints int16u[21] + 510 BlueCurveLimits int16u[4] + 526 RGBCurvePoints int16u[21] + 568 RGBCurveLimits int16u[4] + 580 CropActive int16u + 582 CropLeft int16u + 584 CropTop int16u + 586 CropWidth int16u + 588 CropHeight int16u + 602 SharpnessAdj int16u + 608 CropAspectRatio int16u + 610 ConstrainedCropWidth float + 614 ConstrainedCropHeight float + 618 CheckMark int16u + 622 Rotation int16u + 624 WorkColorSpace int16u + +=head3 CanonVRD StampTool Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 StampToolCount no + +=head3 CanonVRD Ver2 Tags + +Tags added in DPP version 2.0 and later. + + Index2 Tag Name Writable + ------ -------- -------- + 2 PictureStyle int16s + 3 IsCustomPictureStyle int16s + 13 StandardRawColorTone int16s + 14 StandardRawSaturation int16s + 15 StandardRawContrast int16s + 16 StandardRawLinear int16s + 17 StandardRawSharpness int16s + 18 StandardRawHighlightPoint int16s + 19 StandardRawShadowPoint int16s + 20 StandardOutputHighlightPoint int16s + 21 StandardOutputShadowPoint int16s + 22 PortraitRawColorTone int16s + 23 PortraitRawSaturation int16s + 24 PortraitRawContrast int16s + 25 PortraitRawLinear int16s + 26 PortraitRawSharpness int16s + 27 PortraitRawHighlightPoint int16s + 28 PortraitRawShadowPoint int16s + 29 PortraitOutputHighlightPoint int16s + 30 PortraitOutputShadowPoint int16s + 31 LandscapeRawColorTone int16s + 32 LandscapeRawSaturation int16s + 33 LandscapeRawContrast int16s + 34 LandscapeRawLinear int16s + 35 LandscapeRawSharpness int16s + 36 LandscapeRawHighlightPoint int16s + 37 LandscapeRawShadowPoint int16s + 38 LandscapeOutputHighlightPoint int16s + 39 LandscapeOutputShadowPoint int16s + 40 NeutralRawColorTone int16s + 41 NeutralRawSaturation int16s + 42 NeutralRawContrast int16s + 43 NeutralRawLinear int16s + 44 NeutralRawSharpness int16s + 45 NeutralRawHighlightPoint int16s + 46 NeutralRawShadowPoint int16s + 47 NeutralOutputHighlightPoint int16s + 48 NeutralOutputShadowPoint int16s + 49 FaithfulRawColorTone int16s + 50 FaithfulRawSaturation int16s + 51 FaithfulRawContrast int16s + 52 FaithfulRawLinear int16s + 53 FaithfulRawSharpness int16s + 54 FaithfulRawHighlightPoint int16s + 55 FaithfulRawShadowPoint int16s + 56 FaithfulOutputHighlightPoint int16s + 57 FaithfulOutputShadowPoint int16s + 58 MonochromeFilterEffect int16s + 59 MonochromeToningEffect int16s + 60 MonochromeContrast int16s + 61 MonochromeLinear int16s + 62 MonochromeSharpness int16s + 63 MonochromeRawHighlightPoint int16s + 64 MonochromeRawShadowPoint int16s + 65 MonochromeOutputHighlightPoint int16s + 66 MonochromeOutputShadowPoint int16s + 69 UnknownContrast? int16s + 70 UnknownLinear? int16s + 71 UnknownSharpness? int16s + 72 UnknownRawHighlightPoint? int16s + 73 UnknownRawShadowPoint? int16s + 74 UnknownOutputHighlightPoint? int16s + 75 UnknownOutputShadowPoint? int16s + 76 CustomColorTone int16s + 77 CustomSaturation int16s + 78 CustomContrast int16s + 79 CustomLinear int16s + 80 CustomSharpness int16s + 81 CustomRawHighlightPoint int16s + 82 CustomRawShadowPoint int16s + 83 CustomOutputHighlightPoint int16s + 84 CustomOutputShadowPoint int16s + 88 CustomPictureStyleData no + 94 ChrominanceNoiseReduction int16s + 95 LuminanceNoiseReduction int16s + 96 ChrominanceNR_TIFF_JPEG int16s + 98 ChromaticAberrationOn int16s + 99 DistortionCorrectionOn int16s + 100 PeripheralIlluminationOn int16s + 101 ColorBlur int16s + 102 ChromaticAberration int16s + 103 DistortionCorrection int16s + 104 PeripheralIllumination int16s + 105 AberrationCorrectionDistance int16s + 106 ChromaticAberrationRed int16s + 107 ChromaticAberrationBlue int16s + 109 LuminanceNR_TIFF_JPEG int16s + 110 AutoLightingOptimizerOn int16s + 111 AutoLightingOptimizer int16s + 117 StandardRawHighlight int16s + 118 PortraitRawHighlight int16s + 119 LandscapeRawHighlight int16s + 120 NeutralRawHighlight int16s + 121 FaithfulRawHighlight int16s + 122 MonochromeRawHighlight int16s + 123 UnknownRawHighlight? int16s + 124 CustomRawHighlight int16s + 126 StandardRawShadow int16s + 127 PortraitRawShadow int16s + 128 LandscapeRawShadow int16s + 129 NeutralRawShadow int16s + 130 FaithfulRawShadow int16s + 131 MonochromeRawShadow int16s + 132 UnknownRawShadow? int16s + 133 CustomRawShadow int16s + 139 AngleAdj int32s + 142 CheckMark2 int16u + 144 UnsharpMask int16s + 146 StandardUnsharpMaskStrength int16s + 148 StandardUnsharpMaskFineness int16s + 150 StandardUnsharpMaskThreshold int16s + 152 PortraitUnsharpMaskStrength int16s + 154 PortraitUnsharpMaskFineness int16s + 156 PortraitUnsharpMaskThreshold int16s + 158 LandscapeUnsharpMaskStrength int16s + 160 LandscapeUnsharpMaskFineness int16s + 162 LandscapeUnsharpMaskThreshold int16s + 164 NeutraUnsharpMaskStrength int16s + 166 NeutralUnsharpMaskFineness int16s + 168 NeutralUnsharpMaskThreshold int16s + 170 FaithfulUnsharpMaskStrength int16s + 172 FaithfulUnsharpMaskFineness int16s + 174 FaithfulUnsharpMaskThreshold int16s + 176 MonochromeUnsharpMaskStrength int16s + 178 MonochromeUnsharpMaskFineness int16s + 180 MonochromeUnsharpMaskThreshold int16s + 182 CustomUnsharpMaskStrength int16s + 184 CustomUnsharpMaskFineness int16s + 186 CustomUnsharpMaskThreshold int16s + 188 CustomDefaultUnsharpStrength int16s + 190 CustomDefaultUnsharpFineness int16s + 192 CustomDefaultUnsharpThreshold int16s + 214 CropCircleActive int16s + 215 CropCircleX int16s + 216 CropCircleY int16s + 217 CropCircleRadius int16s + 220 DLOOn int16s + 221 DLOSetting int16s + 222 DLOShootingDistance int16s + 223 DLODataLength no + 224 DLOInfo CanonVRD DLOInfo + 225 CameraRawColorTone int16s + 226 CameraRawSaturation int16s + 227 CameraRawContrast int16s + 228 CameraRawLinear int16s + 229 CameraRawSharpness int16s + 230 CameraRawHighlightPoint int16s + 231 CameraRawShadowPoint int16s + 232 CameraRawOutputHighlightPoint int16s + 233 CameraRawOutputShadowPoint int16s + +=head3 CanonVRD DLOInfo Tags + +Tags added when DLO (Digital Lens Optimizer) is on. + + Index2 Tag Name Writable + ------ -------- -------- + 4 DLOSettingApplied int16s + 5 DLOVersion string[10] + 10 DLOData no + +=head3 CanonVRD IHL Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 IHL_EXIF EXIF + IHL_EXIF? no + 0x0003 ThumbnailImage no + 0x0004 PreviewImage no + 0x0005 RawCodecVersion no + 0x0006 CRCDevelParams? no + +=head3 CanonVRD Edit4 Tags + +Canon DPP version 4 edit information. + + Index Tag Name Writable + ----- -------- -------- + 0 DR4 CanonVRD DR4 + +=head3 CanonVRD DR4 Tags + +Tags written by Canon DPP version 4 in CanonVRD trailers and DR4 files. Each +tag has three associated flag words which are stored with the directory +entry, some of which are extracted as a separate tag, indicated in the table +below by a decimal appended to the tag ID (.0, .1 or .2). + + Tag ID Tag Name Writable + ------ -------- -------- + 'header' DR4Header CanonVRD DR4Header + 0x10002 Rotation yes + 0x10003 AngleAdj yes + 0x10021 CustomPictureStyle yes + 0x10101 CheckMark yes + 0x10200 WorkColorSpace yes + 0x20001 RawBrightnessAdj yes + 0x20101 WhiteBalanceAdj yes + 0x20102 WBAdjColorTemp yes + 0x20105 WBAdjMagentaGreen yes + 0x20106 WBAdjBlueAmber yes + 0x20125 WBAdjRGGBLevels yes + 0x20200 GammaLinear yes + 0x20301 PictureStyle yes + 0x20303 ContrastAdj yes + 0x20304 ColorToneAdj yes + 0x20305 ColorSaturationAdj yes + 0x20306 MonochromeToningEffect yes + 0x20307 MonochromeFilterEffect yes + 0x20308 UnsharpMaskStrength yes + 0x20309 UnsharpMaskFineness yes + 0x2030a UnsharpMaskThreshold yes + 0x2030b ShadowAdj yes + 0x2030c HighlightAdj yes + 0x20310 SharpnessAdj yes + 0x20310.0 SharpnessAdjOn yes + 0x20311 SharpnessStrength yes + 0x20400 ToneCurve CanonVRD ToneCurve + 0x20400.1 ToneCurveOriginal yes + 0x20410 ToneCurveBrightness yes + 0x20411 ToneCurveContrast yes + 0x20500 AutoLightingOptimizer yes + 0x20500.0 AutoLightingOptimizerOn yes + 0x20600 LuminanceNoiseReduction yes + 0x20601 ChrominanceNoiseReduction yes + 0x20670 ColorMoireReduction yes + 0x20670.0 ColorMoireReductionOn yes + 0x20701 ShootingDistance yes + 0x20702 PeripheralIllumination yes + 0x20702.0 PeripheralIlluminationOn yes + 0x20703 ChromaticAberration yes + 0x20703.0 ChromaticAberrationOn yes + 0x20704 ColorBlurOn yes + 0x20705 DistortionCorrection yes + 0x20705.0 DistortionCorrectionOn yes + 0x20706 DLOSetting yes + 0x20706.0 DLOOn yes + 0x20707 ChromaticAberrationRed yes + 0x20708 ChromaticAberrationBlue yes + 0x20709 DistortionEffect yes + 0x2070b DiffractionCorrectionOn yes + 0x20900 ColorHue yes + 0x20901 SaturationAdj yes + 0x20910 RedHSL yes + 0x20911 OrangeHSL yes + 0x20912 YellowHSL yes + 0x20913 GreenHSL yes + 0x20914 AquaHSL yes + 0x20915 BlueHSL yes + 0x20916 PurpleHSL yes + 0x20917 MagentaHSL yes + 0x20a00 GammaInfo CanonVRD GammaInfo + 0x30101 CropAspectRatio yes + 0x30102 CropAspectRatioCustom yes + 0xf0100 CropInfo CanonVRD CropInfo + 0xf0500 CustomPictureStyleData yes + 0xf0510 StampInfo CanonVRD StampInfo + 0xf0511 DustInfo CanonVRD DustInfo + 0xf0512 LensFocalLength yes + +=head3 CanonVRD DR4Header Tags + + Index4 Tag Name Writable + ------ -------- -------- + 3 DR4CameraModel int32u + +=head3 CanonVRD ToneCurve Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 ToneCurveColorSpace int32u + 1 ToneCurveShape int32u + 3 ToneCurveInputRange int32u[2] + 5 ToneCurveOutputRange int32u[2] + 7 RGBCurvePoints int32u[21] + 10 ToneCurveX int32u + 11 ToneCurveY int32u + 45 RedCurvePoints int32u[21] + 83 GreenCurvePoints int32u[21] + 121 BlueCurvePoints int32u[21] + +=head3 CanonVRD GammaInfo Tags + + Index8 Tag Name Writable + ------ -------- -------- + 2 GammaContrast double + 3 GammaColorTone double + 4 GammaSaturation double + 5 GammaUnsharpMaskStrength double + 6 GammaUnsharpMaskFineness double + 7 GammaUnsharpMaskThreshold double + 8 GammaSharpnessStrength double + 9 GammaShadow double + 10 GammaHighlight double + 12 GammaBlackPoint double + 13 GammaWhitePoint double + 14 GammaMidPoint double + 15 GammaCurveOutputRange double[2] + +=head3 CanonVRD CropInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 CropActive int32s + 1 CropRotatedOriginalWidth int32s + 2 CropRotatedOriginalHeight int32s + 3 CropX int32s + 4 CropY int32s + 5 CropWidth int32s + 6 CropHeight int32s + 8 CropRotation double + 10 CropOriginalWidth int32s + 11 CropOriginalHeight int32s + +=head3 CanonVRD StampInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 2 StampToolCount no + +=head3 CanonVRD DustInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 2 DustDeleteApplied no + +=head2 Casio Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 RecordingMode int16u + 0x0002 Quality int16u + 0x0003 FocusMode int16u + 0x0004 FlashMode int16u + 0x0005 FlashIntensity int16u + 0x0006 ObjectDistance int32u + 0x0007 WhiteBalance int16u + 0x000a DigitalZoom int32u + 0x000b Sharpness int16u + 0x000c Contrast int16u + 0x000d Saturation int16u + 0x0014 ISO int16u + 0x0015 FirmwareDate string[18] + 0x0016 Enhancement int16u + 0x0017 ColorFilter int16u + 0x0018 AFPoint int16u + 0x0019 FlashIntensity int16u + 0x0e00 PrintIM PrintIM + +=head3 Casio Type2 Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0002 PreviewImageSize int16u[2] + 0x0003 PreviewImageLength int32u* + 0x0004 PreviewImageStart int32u* + 0x0008 QualityMode int16u + 0x0009 CasioImageSize int16u + 0x000d FocusMode int16u + 0x0014 ISO int16u + 0x0019 WhiteBalance int16u + 0x001d FocalLength rational64u + 0x001f Saturation int16u + 0x0020 Contrast int16u + 0x0021 Sharpness int16u + 0x0e00 PrintIM PrintIM + 0x2000 PreviewImage undef + 0x2001 FirmwareDate string[18] + 0x2011 WhiteBalanceBias int16u[2] + 0x2012 WhiteBalance int16u + 0x2021 AFPointPosition int16u[4]~ + 0x2022 ObjectDistance int32u + 0x2034 FlashDistance int16u + 0x2076 SpecialEffectMode int8u[3] + 0x2089 FaceInfo1 Casio FaceInfo1 + FaceInfo2 Casio FaceInfo2 + FaceInfoUnknown? yes + 0x211c FacesDetected int8u + 0x3000 RecordMode int16u + 0x3001 ReleaseMode int16u + 0x3002 Quality int16u + 0x3003 FocusMode int16u + 0x3006 HometownCity string + 0x3007 BestShotMode int16u + 0x3008 AutoISO int16u + 0x3009 AFMode int16u + 0x3011 Sharpness undef[2] + 0x3012 Contrast undef[2] + 0x3013 Saturation undef[2] + 0x3014 ISO int16u + 0x3015 ColorMode int16u + 0x3016 Enhancement int16u + 0x3017 ColorFilter int16u + 0x301b ArtMode int16u + 0x301c SequenceNumber int16u + 0x301d BracketSequence int16u[2] + 0x3020 ImageStabilization int16u + 0x302a LightingMode int16u + 0x302b PortraitRefiner int16u + 0x3030 SpecialEffectLevel int16u + 0x3031 SpecialEffectSetting int16u + 0x3103 DriveMode int16u + 0x310b ArtModeParameters int8u[3] + 0x4001 CaptureFrameRate int16u[n] + 0x4003 VideoQuality int16u + +=head3 Casio FaceInfo1 Tags + +Face-detect tags extracted from models such as the EX-H5. + + Index1 Tag Name Writable + ------ -------- -------- + 0 FacesDetected int8u + 1 FaceDetectFrameSize int16u[2] + 13 Face1Position int16u[4] + 124 Face2Position int16u[4] + 235 Face3Position int16u[4] + 346 Face4Position int16u[4] + 457 Face5Position int16u[4] + 568 Face6Position int16u[4] + 679 Face7Position int16u[4] + 790 Face8Position int16u[4] + 901 Face9Position int16u[4] + 1012 Face10Position int16u[4] + +=head3 Casio FaceInfo2 Tags + +Face-detect tags extracted from models such as the EX-H20G and EX-ZR100. + + Index1 Tag Name Writable + ------ -------- -------- + 2 FacesDetected int8u + 4 FaceDetectFrameSize int16u[2] + 8 FaceOrientation int8u + 24 Face1Position int16u[4] + 76 Face2Position int16u[4] + 128 Face3Position int16u[4] + 180 Face4Position int16u[4] + 232 Face5Position int16u[4] + 284 Face6Position int16u[4] + 336 Face7Position int16u[4] + 388 Face8Position int16u[4] + 440 Face9Position int16u[4] + 492 Face10Position int16u[4] + +=head3 Casio QVCI Tags + +This information is found in the APP1 QVCI segment of JPEG images from the +Casio QV-7000SX. + + Index1 Tag Name Writable + ------ -------- -------- + 44 CasioQuality no + 55 FocalRange? no + 77 DateTimeOriginal no + 98 ModelType no + 114 ManufactureIndex no + 124 ManufactureCode no + +=head3 Casio AVI Tags + +This information is found in Casio GV-10 AVI videos. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Software no + +=head2 DJI Tags + +This table lists tags found in the maker notes of images from some DJI +Phantom drones. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 Make string + 0x0003 SpeedX float + 0x0004 SpeedY float + 0x0005 SpeedZ float + 0x0006 Pitch float + 0x0007 Yaw float + 0x0008 Roll float + 0x0009 CameraPitch float + 0x000a CameraYaw float + 0x000b CameraRoll float + +=head3 DJI XMP Tags + +XMP tags used by DJI for images from drones. + +These tags belong to the ExifTool XMP-drone-dji family 1 group. + + Tag Name Writable + -------- -------- + AbsoluteAltitude real + CalibratedFocalLength real + CalibratedOpticalCenterX real + CalibratedOpticalCenterY real + CamReverse string + DewarpData string + DewarpFlag string + FlightPitchDegree real + FlightRollDegree real + FlightXSpeed real + FlightYSpeed real + FlightYawDegree real + FlightZSpeed real + GPSLatitude real/ + GPSLongitude real/ + GPSLongtitude real + GimbalPitchDegree real + GimbalReverse string + GimbalRollDegree real + GimbalYawDegree real + Latitude real + Longitude real + RelativeAltitude real + RtkFlag string + RtkStdHgt real + RtkStdLat real + RtkStdLon real + SelfData string + +=head3 DJI Info Tags + +Tags written by some DJI drones. + + Tag ID Tag Name Writable + ------ -------- -------- + 'FlightDegree(Y,P,R)' FlightDegree no + 'FlightSpeed(X,Y,Z)' FlightSpeed no + 'GimbalDegree(Y,P,R)' GimbalDegree no + 'adj_dbg_info' ADJDebugInfo no + 'ae_dbg_info' AEDebugInfo no + 'ae_histogram_info' AEHistogramInfo no + 'ae_liveview_histogram_info' + AELiveViewHistogramInfo no + 'ae_liveview_local_histogram' + AELiveViewLocalHistogram no + 'ae_local_histogram' AELocalHistogram no + 'af_dbg_info' AFDebugInfo no + 'awb_dbg_info' AWBDebugInfo no + 'hiso' Histogram no + 'hyperlapse_dbg_info' HyperlapsDebugInfo no + 'sensor_id' SensorID no + 'xidiri' Xidiri no + +=head3 DJI ThermalParams Tags + +Thermal parameters extracted from APP4 of DJI RJPEG files from the ZH20T. + + Index1 Tag Name Writable + ------ -------- -------- + 36 K1 no + 40 K2 no + 44 K3 no + 48 K4 no + 52 KF no + 56 B1 no + 60 B2 no + 68 ObjectDistance no + 70 RelativeHumidity no + 72 Emissivity no + 74 Reflection no + 76 AmbientTemperature no + 80 D2 no + 84 KJ no + 86 DB no + 88 KK no + +=head2 FLIR Tags + +Information extracted from the maker notes of JPEG images from thermal +imaging cameras by FLIR Systems Inc. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 ImageTemperatureMax rational64u + 0x0002 ImageTemperatureMin rational64u + 0x0003 Emissivity rational64u + 0x0004 UnknownTemperature? rational64u + 0x0005 CameraTemperatureRangeMax? rational64u + 0x0006 CameraTemperatureRangeMin? rational64u + +=head3 FLIR FFF Tags + +Information extracted from FLIR FFF images and the APP1 FLIR segment of JPEG +images. These tags may also be extracted from the first frame of an FLIR +SEQ file, or all frames if the ExtractEmbedded option is used. + + Tag ID Tag Name Writable + ------ -------- -------- + '_header' FFFHeader FLIR Header + 0x0001 RawData FLIR RawData + 0x0005 GainDeadData FLIR GainDeadData + 0x0006 CoarseData FLIR CoarseData + 0x000e EmbeddedImage FLIR EmbeddedImage + 0x0020 CameraInfo FLIR CameraInfo + 0x0021 MeasurementInfo FLIR MeasInfo + 0x0022 PaletteInfo FLIR PaletteInfo + 0x0023 TextInfo FLIR TextInfo + 0x0024 EmbeddedAudioFile no + 0x0028 PaintData FLIR PaintData + 0x002a PiP FLIR PiP + 0x002b GPSInfo FLIR GPSInfo + 0x002c MeterLink FLIR MeterLink + 0x002e ParameterInfo FLIR ParamInfo + +=head3 FLIR Header Tags + +Tags extracted from the FLIR FFF/AFF header. + + Index1 Tag Name Writable + ------ -------- -------- + 4 CreatorSoftware no + +=head3 FLIR RawData Tags + +The thermal image data may be stored either as raw data, or in PNG format. +If stored as raw data, ExifTool adds a TIFF header to allow the data to be +viewed as a TIFF image. If stored in PNG format, the PNG image is extracted +as-is. Note that most FLIR cameras using the PNG format seem to write the +16-bit raw image data in the wrong byte order. + + Index2 Tag Name Writable + ------ -------- -------- + 1 RawThermalImageWidth no + 2 RawThermalImageHeight no + 16 RawThermalImageType no + 16.1 RawThermalImage no + +=head3 FLIR GainDeadData Tags + +Information found in FFF-format .GAN calibration image files. + + Index2 Tag Name Writable + ------ -------- -------- + 1 GainDeadMapImageWidth no + 2 GainDeadMapImageHeight no + 16 GainDeadMapImageType no + 16.1 GainDeadMapImage no + +=head3 FLIR CoarseData Tags + +Information found in FFF-format .CRS correction image files. + + Index2 Tag Name Writable + ------ -------- -------- + 1 CoarseMapImageWidth no + 2 CoarseMapImageHeight no + 16 CoarseMapImageType no + 16.1 CoarseMapImage no + +=head3 FLIR EmbeddedImage Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 EmbeddedImageWidth no + 2 EmbeddedImageHeight no + 16 EmbeddedImageType no + 16.1 EmbeddedImage no + +=head3 FLIR CameraInfo Tags + +FLIR camera information. The Planck tags are variables used in the +temperature calculation. See +L<https://exiftool.org/forum/index.php?topic=4898.msg23972#msg23972> +for details. + + Index1 Tag Name Writable + ------ -------- -------- + 32 Emissivity no + 36 ObjectDistance no + 40 ReflectedApparentTemperature no + 44 AtmosphericTemperature no + 48 IRWindowTemperature no + 52 IRWindowTransmission no + 60 RelativeHumidity no + 88 PlanckR1 no + 92 PlanckB no + 96 PlanckF no + 112 AtmosphericTransAlpha1 no + 116 AtmosphericTransAlpha2 no + 120 AtmosphericTransBeta1 no + 124 AtmosphericTransBeta2 no + 128 AtmosphericTransX no + 144 CameraTemperatureRangeMax no + 148 CameraTemperatureRangeMin no + 152 CameraTemperatureMaxClip no + 156 CameraTemperatureMinClip no + 160 CameraTemperatureMaxWarn no + 164 CameraTemperatureMinWarn no + 168 CameraTemperatureMaxSaturated no + 172 CameraTemperatureMinSaturated no + 212 CameraModel no + 244 CameraPartNumber no + 260 CameraSerialNumber no + 276 CameraSoftware no + 368 LensModel no + 400 LensPartNumber no + 416 LensSerialNumber no + 436 FieldOfView no + 492 FilterModel no + 508 FilterPartNumber no + 540 FilterSerialNumber no + 776 PlanckO no + 780 PlanckR2 no + 784 RawValueRangeMin no + 786 RawValueRangeMax no + 824 RawValueMedian no + 828 RawValueRange no + 900 DateTimeOriginal no + 912 FocusStepCount no + 1116 FocusDistance no + 1124 FrameRate no + +=head3 FLIR MeasInfo Tags + +Tags listed below are only for the first measurement tool, however multiple +measurements may be added, and information is extracted for all of them. +Tags for subsequent measurements are generated as required with the prefixes +"Meas2", "Meas3", etc. + + Tag Name Writable + -------- -------- + Meas1Label no + Meas1Params no + Meas1Type no + +=head3 FLIR PaletteInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 PaletteColors no + 6 AboveColor no + 9 BelowColor no + 12 OverflowColor no + 15 UnderflowColor no + 18 Isotherm1Color no + 21 Isotherm2Color no + 26 PaletteMethod no + 27 PaletteStretch no + 48 PaletteFileName no + 80 PaletteName no + 112 Palette no + +=head3 FLIR TextInfo Tags + + Tag Name Writable + -------- -------- + Label0 no + Label1 no + Label2 no + Label3 no + Value0 no + Value1 no + Value2 no + Value3 no + +=head3 FLIR PaintData Tags + +Information generated by FLIR Tools "Paint colors" tool. + + Index2 Tag Name Writable + ------ -------- -------- + 5 PaintImageWidth no + 6 PaintImageHeight no + 20 PaintImageType no + 20.1 PaintImage no + +=head3 FLIR PiP Tags + +FLIR Picture in Picture tags. + + Index2 Tag Name Writable + ------ -------- -------- + 0 Real2IR no + 2 OffsetX no + 3 OffsetY no + 4 PiPX1 no + 5 PiPX2 no + 6 PiPY1 no + 7 PiPY2 no + +=head3 FLIR GPSInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 GPSValid no + 4 GPSVersionID no + 8 GPSLatitudeRef no + 10 GPSLongitudeRef no + 16 GPSLatitude no + 24 GPSLongitude no + 32 GPSAltitude no + 64 GPSDOP no + 68 GPSSpeedRef no + 70 GPSTrackRef no + 72 GPSImgDirectionRef no + 76 GPSSpeed no + 80 GPSTrack no + 84 GPSImgDirection no + 88 GPSMapDatum no + +=head3 FLIR MeterLink Tags + +Tags containing Meterlink humidity meter information. + + Index1 Tag Name Writable + ------ -------- -------- + 26 Reading1Units no + 28 Reading1Description no + 32 Reading1Device no + 96 Reading1Value no + 126 Reading2Units no + 128 Reading2Description no + 132 Reading2Device no + 196 Reading2Value no + 226 Reading3Units no + 228 Reading3Description no + 232 Reading3Device no + 296 Reading3Value no + 326 Reading4Units no + 328 Reading4Description no + 332 Reading4Device no + 396 Reading4Value no + +=head3 FLIR ParamInfo Tags + + Tag Name Writable + -------- -------- + DateTimeGenerated no + Param0 no + Param1 no + Param2 no + Param3 no + +=head3 FLIR UserData Tags + +Tags written by some FLIR cameras in a top-level (!) "udta" atom of MP4 +videos. + + Tag ID Tag Name Writable + ------ -------- -------- + 'uuid' FLIR_Parts FLIR Parts + FLIR_Serial FLIR SerialNums + FLIR_Params FLIR Params + FLIR_UnknownUUID FLIR UnknownUUID + FLIR_GPS FLIR GPS_UUID + FLIR_MoreInfo FLIR MoreInfo + SoftwareComponents? no + FLIR_Unknown? no + Units no+ + ThumbnailImage no + +=head3 FLIR Parts Tags + +Tags extracted from the "uuid" box with ID 43c3993b0f94424b82056b66513f485d +in FLIR MP4 videos. + + Index1 Tag Name Writable + ------ -------- -------- + 4 BAHPVer no + BALPVer no + Battery no + BAVPVer no + CamCore no + DetectorBoard no + Detector no + GIDCVer no + GIDPVer no + GIPC_CPLD no + GIPCVer no + GIXIVer no + MainBoard no + Optics no + PartNumber no + +=head3 FLIR SerialNums Tags + +Tags extracted from the "uuid" box with ID 57f5b93e51e448afa0d9c3ef1b37f712 +in FLIR MP4 videos. + + Index1 Tag Name Writable + ------ -------- -------- + 12 UnknownSerial1? no + 45 UnknownSerial2? no + 78 UnknownSerial3? no + 111 UnknownSerial4? no + 123 UnknownNumber? no + 126 CameraSerialNumber no + +=head3 FLIR Params Tags + +Tags extracted from the "uuid" box with ID 41e5dcf9e80a41ceadfe7f0c58082c19 +in FLIR MP4 videos. + + Index4 Tag Name Writable + ------ -------- -------- + 1 ReflectedApparentTemperature no + 2 AtmosphericTemperature no + 3 Emissivity no + 4 ObjectDistance no + 5 RelativeHumidity no + 6 EstimatedAtmosphericTrans no + 7 IRWindowTemperature no + 8 IRWindowTransmission no + +=head3 FLIR UnknownUUID Tags + +Tags extracted from the "uuid" box with ID 574520502cbb44adae5415e9b839d903 +in FLIR MP4 videos. + + Index4 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 FLIR GPS_UUID Tags + +Tags extracted from the "uuid" box with ID 7f2e21008b464918afb1de709a74f6f5 +in FLIR MP4 videos. + + Index4 Tag Name Writable + ------ -------- -------- + 1 GPSLatitude no + 2 GPSLongitude no + 3 GPSAltitude no + +=head3 FLIR MoreInfo Tags + +Tags extracted from the "uuid" box with ID 2b452fdc74354094baee22a6b23a7cf8 +in FLIR MP4 videos. + + Index1 Tag Name Writable + ------ -------- -------- + 5 LensModel no + 11 UnknownTemperature1? no + 15 UnknownTemperature2? no + +=head3 FLIR AFF Tags + +Tags extracted from FLIR "AFF" SEQ images. + + Tag ID Tag Name Writable + ------ -------- -------- + '_header' AFFHeader FLIR Header + 0x0001 AFF1 FLIR AFF1 + 0x0005 AFF5 FLIR AFF5 + +=head3 FLIR AFF1 Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 SensorWidth no + 2 SensorHeight no + +=head3 FLIR AFF5 Tags + + Index2 Tag Name Writable + ------ -------- -------- + 19 SensorWidth no + 20 SensorHeight no + +=head3 FLIR FPF Tags + +Tags extracted from FLIR Public image Format (FPF) files. + + Index1 Tag Name Writable + ------ -------- -------- + 32 FPFVersion no + 36 ImageDataOffset no + 40 ImageType no + 42 ImagePixelFormat no + 44 ImageWidth no + 46 ImageHeight no + 48 ExternalTriggerCount no + 52 SequenceFrameNumber no + 120 CameraModel no + 152 CameraPartNumber no + 184 CameraSerialNumber no + 216 CameraTemperatureRangeMin no + 220 CameraTemperatureRangeMax no + 224 LensModel no + 256 LensPartNumber no + 288 LensSerialNumber no + 320 FilterModel no + 336 FilterPartNumber no + 384 FilterSerialNumber no + 480 Emissivity no + 484 ObjectDistance no + 488 ReflectedApparentTemperature no + 492 AtmosphericTemperature no + 496 RelativeHumidity no + 500 ComputedAtmosphericTrans no + 504 EstimatedAtmosphericTrans no + 508 ReferenceTemperature no + 512 IRWindowTemperature no + 516 IRWindowTransmission no + 584 DateTimeOriginal no + 676 CameraScaleMin no + 680 CameraScaleMax no + 684 CalculatedScaleMin no + 688 CalculatedScaleMax no + 692 ActualScaleMin no + 696 ActualScaleMax no + +=head2 FujiFilm Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 Version undef + 0x0010 InternalSerialNumber string + 0x1000 Quality string + 0x1001 Sharpness int16u + 0x1002 WhiteBalance int16u + 0x1003 Saturation int16u + 0x1004 Contrast int16u + 0x1005 ColorTemperature int16u + 0x1006 Contrast int16u + 0x100a WhiteBalanceFineTune int32s[2] + 0x100b NoiseReduction int16u + 0x100e NoiseReduction int16u + 0x1010 FujiFlashMode int16u + 0x1011 FlashExposureComp rational64s + 0x1020 Macro int16u + 0x1021 FocusMode int16u + 0x1022 AFMode int16u + 0x1023 FocusPixel int16u[2] + 0x102b PrioritySettings FujiFilm PrioritySettings + 0x102d FocusSettings FujiFilm FocusSettings + 0x102e AFCSettings FujiFilm AFCSettings + 0x1030 SlowSync int16u + 0x1031 PictureMode int16u + 0x1032 ExposureCount int16u + 0x1033 EXRAuto int16u + 0x1034 EXRMode int16u + 0x1040 ShadowTone int32s + 0x1041 HighlightTone int32s + 0x1044 DigitalZoom int32u + 0x1045 LensModulationOptimizer int32u + 0x1047 GrainEffect int32s + 0x1048 ColorChromeEffect int32s + 0x1049 BWAdjustment int8s + 0x104d CropMode int16u + 0x104e ColorChromeFXBlue int32s + 0x1050 ShutterType int16u + 0x1100 AutoBracketing int16u + 0x1101 SequenceNumber int16u + 0x1103 DriveSettings FujiFilm DriveSettings + 0x1105 PixelShiftShots int16u + 0x1106 PixelShiftOffset rational64s[2] + 0x1153 PanoramaAngle int16u + 0x1154 PanoramaDirection int16u + 0x1201 AdvancedFilter int32u + 0x1210 ColorMode int16u + 0x1300 BlurWarning int16u + 0x1301 FocusWarning int16u + 0x1302 ExposureWarning int16u + 0x1304 GEImageSize string + 0x1400 DynamicRange int16u + 0x1401 FilmMode int16u + 0x1402 DynamicRangeSetting int16u + 0x1403 DevelopmentDynamicRange int16u + 0x1404 MinFocalLength rational64s + 0x1405 MaxFocalLength rational64s + 0x1406 MaxApertureAtMinFocal rational64s + 0x1407 MaxApertureAtMaxFocal rational64s + 0x140b AutoDynamicRange int16u + 0x1422 ImageStabilization int16u[3] + 0x1425 SceneRecognition int16u + 0x1431 Rating int32u + 0x1436 ImageGeneration int16u + 0x1438 ImageCount int16u + 0x1443 DRangePriority int16u + 0x1444 DRangePriorityAuto int16u + 0x1445 DRangePriorityFixed int16u + 0x1446 FlickerReduction int32u + 0x1447 FirmwareVersion string + 0x1448 FirmwareVersion2 string + 0x3803 VideoRecordingMode int32u + 0x3804 PeripheralLighting int16u + 0x3806 VideoCompression int16u + 0x3820 FrameRate int16u + 0x3821 FrameWidth int16u + 0x3822 FrameHeight int16u + 0x3824 FullHDHighSpeedRec int32u + 0x4005 FaceElementSelected int16u[4] + 0x4100 FacesDetected int16u + 0x4103 FacePositions int16u[n] + 0x4200 NumFaceElements int16u + 0x4201 FaceElementTypes int8u[n] + 0x4203 FaceElementPositions int16u[n] + 0x4282 FaceRecInfo FujiFilm FaceRecInfo + 0x8000 FileSource string + 0x8002 OrderNumber int32u + 0x8003 FrameNumber int16u + 0xb211 Parallax rational64s + +=head3 FujiFilm PrioritySettings Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0.1 AF-SPriority int16u & 0x0f + 0.2 AF-CPriority int16u & 0xf0 + +=head3 FujiFilm FocusSettings Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0.1 FocusMode2 int32u & 0x0f + 0.2 PreAF int32u & 0xf0 + 0.3 AFAreaMode int32u & 0xf00 + 0.4 AFAreaPointSize int32u & 0xf000 + 0.5 AFAreaZoneSize int32u & 0xf0000 + +=head3 FujiFilm AFCSettings Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 AF-CSetting int32u + 0.1 AF-CTrackingSensitivity int32u & 0x0f + 0.2 AF-CSpeedTrackingSensitivity int32u & 0xf0 + 0.3 AF-CZoneAreaSwitching int32u & 0xf00 + +=head3 FujiFilm DriveSettings Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0.1 DriveMode int32u & 0xff + 0.2 DriveSpeed int32u & 0xff000000 + +=head3 FujiFilm FaceRecInfo Tags + +Face recognition information. + + Tag Name Writable + -------- -------- + Face1Birthday no + Face1Category no + Face1Name no + Face2Birthday no + Face2Category no + Face2Name no + Face3Birthday no + Face3Category no + Face3Name no + Face4Birthday no + Face4Category no + Face4Name no + Face5Birthday no + Face5Category no + Face5Name no + Face6Birthday no + Face6Category no + Face6Name no + Face7Birthday no + Face7Category no + Face7Name no + Face8Birthday no + Face8Category no + Face8Name no + +=head3 FujiFilm RAF Tags + +FujiFilm RAF images contain meta information stored in a proprietary +FujiFilm RAF format, as well as EXIF information stored inside an embedded +JPEG preview image. The table below lists tags currently decoded from the +RAF-format information. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0100 RawImageFullSize no + 0x0110 RawImageCropTopLeft no + 0x0111 RawImageCroppedSize no + 0x0115 RawImageAspectRatio no + 0x0121 RawImageSize no + 0x0130 FujiLayout no + 0x0131 XTransLayout no + 0x2000 WB_GRGBLevelsAuto no + 0x2100 WB_GRGBLevelsDaylight no + 0x2200 WB_GRGBLevelsCloudy no + 0x2300 WB_GRGBLevelsDaylightFluor no + 0x2301 WB_GRGBLevelsDayWhiteFluor no + 0x2302 WB_GRGBLevelsWhiteFluorescent no + 0x2310 WB_GRGBLevelsWarmWhiteFluor no + 0x2311 WB_GRGBLevelsLivingRoomWarmWhiteFluor no + 0x2400 WB_GRGBLevelsTungsten no + 0x2ff0 WB_GRGBLevels no + 0x9200 RelativeExposure no + 0x9650 RawExposureBias no + 0xc000 RAFData FujiFilm RAFData + +=head3 FujiFilm RAFData Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 RawImageWidth no + 4 RawImageWidth no + RawImageHeight no + 8 RawImageWidth no + RawImageHeight no + 12 RawImageHeight no + +=head3 FujiFilm IFD Tags + +Tags found in the FujiIFD information of RAF images from some models. + + Tag ID Tag Name Writable + ------ -------- -------- + 0xf000 FujiIFD FujiFilm IFD + 0xf001 RawImageFullWidth no + 0xf002 RawImageFullHeight no + 0xf003 BitsPerSample no + 0xf007 StripOffsets no + 0xf008 StripByteCounts no + 0xf00a BlackLevel no + 0xf00b GeometricDistortionParams no + 0xf00c WB_GRBLevelsStandard no + 0xf00d WB_GRBLevelsAuto no + 0xf00e WB_GRBLevels no + 0xf00f ChromaticAberrationParams no + 0xf010 VignettingParams no + +=head3 FujiFilm FFMV Tags + +Information found in the FFMV atom of MOV videos. + + Index1 Tag Name Writable + ------ -------- -------- + 0 MovieStreamName no + +=head3 FujiFilm MOV Tags + +This information is found in MOV videos from some FujiFilm cameras. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 24 Model no + 46 ExposureTime no + 50 FNumber no + 58 ExposureCompensation no + +=head2 GE Tags + +This table lists tags found in the maker notes of some General Imaging +camera models. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0202 Macro int16u + 0x0207 GEModel string + 0x0300 GEMake string + +=head2 HP Tags + +These tables list tags found in the maker notes of some Hewlett-Packard +camera models. + +The first table lists tags found in the EXIF-format maker notes of the +PhotoSmart 720 (also used by the Vivitar ViviCam 3705, 3705B and 3715). + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0e00 PrintIM PrintIM + +=head3 HP Type2 Tags + +These tags are used by the PhotoSmart E427. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Lens Shading' LensShading no + 'PreviewImage' PreviewImage no + 'Serial Number' SerialNumber no + +=head3 HP Type4 Tags + +These tags are used by the PhotoSmart M627. + + Index1 Tag Name Writable + ------ -------- -------- + 12 MaxAperture no + 16 ExposureTime no + 20 CameraDateTime no + 52 ISO no + 92 SerialNumber no + +=head3 HP Type6 Tags + +These tags are used by the PhotoSmart M425, M525 and M527. + + Index1 Tag Name Writable + ------ -------- -------- + 12 FNumber no + 16 ExposureTime no + 20 CameraDateTime no + 52 ISO no + 88 SerialNumber no + +=head3 HP TDHD Tags + +These tags are extracted from the APP6 "TDHD" segment of Photosmart R837 +JPEG images. Many other unknown tags exist in is data, and can be seen with +the Unknown (-u) option. + + Tag ID Tag Name Writable + ------ -------- -------- + 'CMSN' SerialNumber no + 'FWRV' FirmwareVersion no + 'LSLV' LSLV HP TDHD + 'TDHD' TDHD HP TDHD + +=head2 JVC Tags + +JVC EXIF maker note tags. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0002 CPUVersions no + 0x0003 Quality no + +=head3 JVC Text Tags + +JVC/Victor text-based maker note tags. + + Tag ID Tag Name Writable + ------ -------- -------- + 'QTY' Quality no + 'VER' MakerNoteVersion no + +=head2 Kodak Tags + +Many Kodak models don't store the maker notes in standard IFD format, and +these formats vary with different models. Some information has been +decoded, but much of the Kodak information remains unknown. + +The table below contains the most common set of Kodak tags. The following +Kodak camera models have been tested and found to use these tags: C360, +C663, C875, CX6330, CX6445, CX7330, CX7430, CX7525, CX7530, DC4800, DC4900, +DX3500, DX3600, DX3900, DX4330, DX4530, DX4900, DX6340, DX6440, DX6490, +DX7440, DX7590, DX7630, EasyShare-One, LS420, LS443, LS633, LS743, LS753, +V530, V550, V570, V603, V610, V705, Z650, Z700, Z710, Z730, Z740, Z760 and +Z7590. + + Index1 Tag Name Writable + ------ -------- -------- + 0 KodakModel string[8] + 9 Quality int8u + 10 BurstMode int8u + 12 KodakImageWidth int16u + 14 KodakImageHeight int16u + 16 YearCreated int16u + 18 MonthDayCreated int8u[2] + 20 TimeCreated int8u[4] + 24 BurstMode2? int16u + 27 ShutterMode int8u + 28 MeteringMode int8u + 29 SequenceNumber int8u + 30 FNumber int16u + 32 ExposureTime int32u + 36 ExposureCompensation int16s + 38 VariousModes? int16u + 40 Distance1? int32u + 44 Distance2? int32u + 48 Distance3? int32u + 52 Distance4? int32u + 56 FocusMode int8u + 58 VariousModes2? int16u + 60 PanoramaMode? int16u + 62 SubjectDistance? int16u + 64 WhiteBalance int8u + 92 FlashMode int8u + 93 FlashFired int8u + 94 ISOSetting int16u + 96 ISO int16u + 98 TotalZoom int16u + 100 DateTimeStamp int16u + 102 ColorMode int16u + 104 DigitalZoom int16u + 107 Sharpness int8s + +=head3 Kodak IFD Tags + +These tags are found in a separate IFD of JPEG, TIFF, DCR and KDC images +from some older Kodak models such as the DC50, DC120, DCS760C, DCS Pro 14N, +14nx, SLR/n, Pro Back and Canon EOS D2000. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 KodakVersion int8u[4] + 0x0001 UnknownEV? rational64u + 0x0003 ExposureValue rational64u + 0x03e9 OriginalFileName string + 0x03ea KodakTag int32u + 0x03eb SensorLeftBorder int16u + 0x03ec SensorTopBorder int16u + 0x03ed SensorImageWidth int16u + 0x03ee SensorImageHeight int16u + 0x03ef BlackLevelTop int16u + 0x03f0 BlackLevelBottom int16u + 0x03f1 TextualInfo Kodak TextualInfo + 0x03f2 FlashMode? int16u + 0x03f3 FlashCompensation rational64s + 0x03f4 WindMode? int16u + 0x03f5 FocusMode? int16u + 0x03f8 MinAperture rational64u + 0x03f9 MaxAperture rational64u + 0x03fa WhiteBalanceMode? int16u + 0x03fb WhiteBalanceDetected? int16u + 0x03fc WhiteBalance int16u + 0x03fd Processing Kodak Processing + ProcessingParameters no + 0x03fe ImageAbsoluteX int16s + 0x03ff ImageAbsoluteY int16s + 0x0400 ApplicationKeyString string + 0x0401 Time string + 0x0402 GPSString string + 0x0403 EventLogCapture? no + 0x0404 ComponentTable? no + 0x0405 CustomIlluminant? int16u + 0x0406 CameraTemperature rational64s + CameraTemperature no + 0x0407 AdapterVoltage rational64u + 0x0408 BatteryVoltage rational64u + 0x0409 DacVoltages no + 0x040a IlluminantDetectorData? no + 0x040b PixelClockFrequency int32u + 0x040c CenterPixel int16u[3] + 0x040d BurstCount int16u + 0x040e BlackLevelRough int16u + 0x040f OffsetMapHorizontal? no + 0x0410 OffsetMapVertical? no + 0x0411 Histogram? no + 0x0412 VerticalClockOverlaps int16u[2] + 0x0413 SensorTemperature no + 0x0414 XilinxVersion string + 0x0415 FirmwareVersion int32u + 0x0416 BlackLevelRoughAfter int16u + 0x0417 BrightRowsTop no + 0x0418 EventLogProcess no + 0x0419 DacVoltagesFlush no + 0x041a FlashUsed no + 0x041b FlashType no + 0x041c SelfTimer no + 0x041d AFMode no + 0x041e LensType no + 0x041f ImageCropX int16s + 0x0420 ImageCropY int16s + 0x0421 AdjustedTbnImageWidth no + 0x0422 AdjustedTbnImageHeight no + 0x0423 IntegrationTime int32u + 0x0424 BracketingMode no + 0x0425 BracketingStep no + 0x0426 BracketingCounter no + 0x042e HuffmanTableLength no + 0x042f HuffmanTableValue no + 0x0438 MainBoardVersion int32u + 0x0439 ImagerBoardVersion int32u + 0x044c FocusEdgeMap no + 0x05e6 IdleTiming no + 0x05e7 FlushTiming no + 0x05e8 IntegrateTiming no + 0x05e9 RegisterReadTiming no + 0x05ea FirstLineTransferTiming no + 0x05eb ShiftTiming no + 0x05ec NormalLineTransferTiming no + 0x05ed TestTransferTiming no + 0x05fa MinimumFlushRows no + 0x05fd ImagerPowerOnDelayMsec int32u + 0x05fe ImagerInitialTimingCode no + 0x05ff ImagerLogicProgram no + 0x0600 ImagerBiasSettlingDelayMsec int32u + 0x0604 IdleSequence no + 0x0605 FirstFlushSequence no + 0x0606 FinalFlushSequence no + 0x0607 SampleBlackSequence no + 0x0608 TransferSequence no + 0x060e DacCountsPerVolt no + 0x060f BlackDacChannel no + 0x0610 BlackAdCountsPerDacVolt no + 0x0611 BlackTarget no + 0x0612 BlackDacSettlingMsec no + 0x07d0 StandardMatrixDaylight rational64s[9] + 0x07d1 StandardMatrixTungsten rational64s[9] + 0x07d2 StandardMatrixFluorescent rational64s[9] + 0x07d3 StandardMatrixFlash rational64s[9] + 0x07d4 StandardMatrixCustom rational64s[9] + 0x07da DeviantMatrixDaylight rational64s[9] + 0x07db DeviantMatrixTungsten rational64s[9] + 0x07dc DeviantMatrixFluorescent rational64s[9] + 0x07dd DeviantMatrixFlash rational64s[9] + 0x07de DeviantMatrixCustom rational64s[9] + 0x07e4 UniqueMatrixDaylight rational64s[9] + 0x07e5 UniqueMatrixTungsten rational64s[9] + 0x07e6 UniqueMatrixFluorescent rational64s[9] + 0x07e7 UniqueMatrixFlash rational64s[9] + 0x07e8 UniqueMatrixCustom rational64s[9] + 0x07e9 UniqueMatrixAuto rational64s[9] + 0x0834 StandardWhiteDaylight rational64s[3] + 0x0835 StandardWhiteTungsten rational64s[3] + 0x0836 StandardWhiteFluorescent rational64s[3] + 0x0837 StandardWhiteFlash rational64s[3] + 0x0838 StandardWhiteCustom rational64s[3] + 0x083e DeviantWhiteDaylight rational64s[3] + 0x083f DeviantWhiteTungsten rational64s[3] + 0x0840 DeviantWhiteFluorescent rational64s[3] + 0x0841 DeviantWhiteFlash rational64s[3] + 0x0842 DeviantWhiteCustom rational64s[3] + 0x0846 ColorTemperature int16u + 0x0847 WB_RGBLevelsAsShot no + 0x0848 WB_RGBLevelsDaylight no + 0x0849 WB_RGBLevelsTungsten no + 0x084a WB_RGBLevelsFluorescent no + 0x084b WB_RGBLevelsFlash no + 0x084c WB_RGBLevelsCustom no + 0x084d WB_RGBLevelsAuto no + 0x0852 WB_RGBMulDaylight rational64u[3] + 0x0853 WB_RGBMulTungsten rational64u[3] + 0x0854 WB_RGBMulFluorescent rational64u[3] + 0x0855 WB_RGBMulFlash rational64u[3] + 0x085c WB_RGBCoeffsDaylight no + 0x085d WB_RGBCoeffsTungsten no + 0x085e WB_RGBCoeffsFluorescent no + 0x085f WB_RGBCoeffsFlash no + 0x0898 ExposureGainDaylight rational64s + 0x0899 ExposureGainTungsten rational64s + 0x089a ExposureGainFluorescent rational64s + 0x089b ExposureGainFlash rational64s + 0x089c ExposureGainCustom rational64s + 0x089d AnalogISOTable rational64u[3] + 0x089e AnalogCaptureISO int32u + 0x089f ISOCalibrationGain rational64u + 0x08a0 ISOCalibrationGainTable no + 0x08a1 ExposureHeadroomFactor no + 0x08ab LinearitySplineTags no + 0x08fc MonitorMatrix rational64s[9] + 0x08fd TonScaleTable no + 0x08fe Gamma rational64u + 0x08ff LogLinTable no + 0x0900 LinLogTable no + 0x0901 GammaTable no + 0x0902 LogScale rational64u + 0x0903 BaseISO rational64u + 0x0904 LinLogCoring int16u + 0x0905 PatternGainConversionTable no + 0x0906 DefectCount no + 0x0907 DefectList no + 0x0908 DefectListPacked no + 0x0909 ImageSpace int16u + 0x090a ThumbnailCompressionTable no + 0x090b ThumbnailExpansionTable no + 0x090c ImageCompressionTable no + 0x090d ImageExpansionTable no + 0x090e EighteenPercentPoint no + 0x090f DefectIsoCode int16u + 0x0910 BaseISODaylight rational64u + 0x0911 BaseISOTungsten rational64u + 0x0912 BaseISOFluorescent rational64u + 0x0913 BaseISOFlash rational64u + 0x091a MatrixSelectThreshold int16s + 0x091b MatrixSelectK rational64u + 0x091c IlluminantDetectTable no + 0x091d RGTable no + 0x091e MatrixSelectThreshold1 int16s + 0x091f MatrixSelectThreshold2 int16s + 0x0924 PortraitMatrix no + 0x0925 PortraitToneScaleTable no + 0x092e EnableSharpening int16u + 0x092f SharpeningKernel int16s[25] + 0x0930 EdgeMapSlope int16u + 0x0931 EdgeMapX1 int16u + 0x0932 EdgeMapX2 int16u + 0x0933 KernelDenominators int16u[3] + 0x0934 EdgeMapX3 int16u + 0x0935 EdgeMapX4 int16u + 0x0936 SharpenForThumbnail no + 0x0937 EdgeSpline no + 0x0938 DownSampleBy2Hor no + 0x0939 DownSampleBy2Ver no + 0x093a DownSampleBy4Hor no + 0x093b DownSampleBy4Ver no + 0x093c DownSampleBy3Hor no + 0x093d DownSampleBy3Ver no + 0x093e DownSampleBy6Hor no + 0x093f DownSampleBy6Ver no + 0x0940 DownSampleBy2Hor3MPdcr no + 0x0941 DownSampleBy2Ver3MPdcr no + 0x0942 ThumbnailResizeRatio no + 0x0943 AtCaptureUserCrop int32u[4] + 0x0944 ImageResolution int32u + 0x0945 ImageResolutionJpg int32u + 0x094c USMParametersLow no + 0x094d USMParametersMed no + 0x094e USMParametersHigh no + 0x094f USMParametersHost no + 0x0950 EdgeSplineLow no + 0x0951 EdgeSplineMed no + 0x0952 EdgeSplineHigh no + 0x0953 USMParametersHost6MP no + 0x0954 USMParametersHost3MP no + 0x0960 PatternImagerWidth int16u + 0x0961 PatternImagerHeight int16u + 0x0962 PatternAreaWidth int16u + 0x0963 PatternAreaHeight int16u + 0x0964 PatternCorrectionGains no + 0x0965 PatternCorrectionOffsets no + 0x0966 PatternX int16u + 0x0967 PatternY int16u + 0x0968 PatternCorrectionFactors no + 0x0969 PatternCorrectionFactorScale int16u + 0x096a PatternCropRows1 int16u + 0x096b PatternCropRows2 int16u + 0x096c PatternCropCols1 int16u + 0x096d PatternCropCols2 int16u + 0x096e PixelCorrectionGains no + 0x096f StitchRows no + 0x0970 StitchColumns no + 0x0971 PixelCorrectionScale int16u + 0x0972 PixelCorrectionOffset int16u + 0x0988 LensTableIndex no + 0x0992 DiffTileGains602832 no + 0x0993 DiffTileGains24t852822 no + 0x099c TileGainDeterminationTable no + 0x099d NemoBlurKernel no + 0x099e NemoTileSize no + 0x099f NemoGainFactors no + 0x09a0 NemoDarkLimit no + 0x09a1 NemoHighlight12Limit no + 0x09c4 ImagerFileProductionLevel int16u + 0x09c5 ImagerFileDateCreated int32u + 0x09c6 CalibrationVersion string + 0x09c7 ImagerFileTagsVersionStandard int16u + 0x09c8 IFCameraModel string + 0x09c9 CalibrationHistory string + 0x09ca CalibrationLog no + 0x09ce SensorSerialNumber string + 0x09f6 DefectConcealArtCorrectThres no + 0x09f7 SglColDCACThres1 no + 0x09f8 SglColDCACThres2 no + 0x09f9 SglColDCACTHres3 no + 0x0a01 DblColDCACThres1 no + 0x0a02 DblColDCACThres2 no + 0x0a0a DefectConcealThresTable no + 0x0a28 MonoUniqueMatrix no + 0x0a29 MonoMonitorMatrix no + 0x0a2a MonoToneScaleTable no + 0x0a5a OmenInitialScaling no + 0x0a5b OmenInitialRows no + 0x0a5c OmenInitialColumns no + 0x0a5d OmenInitialIPFStrength int32s[4] + 0x0a5e OmenEarlyStrength int32s[4] + 0x0a5f OmenAutoStrength int32s[4] + 0x0a60 OmenAtCaptureStrength int32s[4] + 0x0a61 OmenAtCaptureMode no + 0x0a62 OmenFocalLengthLimit int16s + 0x0a64 OmenSurfaceIndex int16s + 0x0a65 OmenPercentToRationalLimitsRed no + 0x0a66 OmenPercentToRationalLimitsGoR no + 0x0a67 OmenPercentToRationalLimitsBlue no + 0x0a68 OmenPercentToRationalLimitsGoB no + 0x0a6e OmenEarlyGoBSurface no + 0x0a6f OmenEarlyGoBRows no + 0x0a70 OmenEarlyGoBColumns no + 0x0a73 OmenSmoothingKernel no + 0x0a74 OmenGradientOffset no + 0x0a75 OmenGradientKernel no + 0x0a76 OmenGradientKernelTaps no + 0x0a77 OmenRatioClipFactors no + 0x0a78 OmenRatioExclusionFactors no + 0x0a79 OmenGradientExclusionLimits no + 0x0a7a OmenROICoordinates no + 0x0a7b OmenROICoefficients no + 0x0a7c OmenRangeWeighting no + 0x0a7d OmenMeanToStrength no + 0x0bb8 FactoryWhiteGainsDaylight no + 0x0bb9 FactoryWhiteOffsetsDaylight no + 0x0bba DacGainsCoarse no + 0x0bbb DacGainsFine no + 0x0bbc DigitalExposureGains no + 0x0bbd DigitalExposureBiases no + 0x0bbe BlackClamp no + 0x0bbf ChannelCoarseGainAdjust no + 0x0bc0 BlackClampOffset no + 0x0bf4 DMPixelThresholdFactor no + 0x0bf5 DMWindowThresholdFactor no + 0x0bf6 DMTrimFraction no + 0x0bf7 DMSmoothRejThresh no + 0x0bf8 DMFillRejThresh no + 0x0bf9 VMWsize no + 0x0bfa DMErodeRadius no + 0x0bfb DMNumPatches no + 0x0bfc DMNoiseScale no + 0x0bfe BrightDefectThreshold no + 0x0bff BrightDefectIntegrationMS no + 0x0c00 BrightDefectIsoCode no + 0x0c03 TopDarkRow1 no + 0x0c04 TopDarkRow2 no + 0x0c05 BottomDarkRow1 no + 0x0c06 BottomDarkRow2 no + 0x0c07 LeftDarkCol1 no + 0x0c08 LeftDarkCol2 no + 0x0c09 RightDarkCol1 no + 0x0c0a RightDarkCol2 no + 0x0c0b HMPixThresh no + 0x0c0c HMColThresh no + 0x0c0d HMWsize no + 0x0c0e HMColRejThresh no + 0x0c0f VMPixThresh no + 0x0c10 VMColThresh no + 0x0c11 VMNbands no + 0x0c12 VMColDropThresh no + 0x0c13 VMPatchResLimit no + 0x0c14 MapScale no + 0x0c1c Klut no + 0x0c1d RimNonlinearity no + 0x0c1e InverseRimNonlinearity no + 0x0c1f RembrandtToneScale no + 0x0c20 RimToNifColorTransform no + 0x0c21 RimToNifScaleFactor no + 0x0c22 NifNonlinearity no + 0x0c23 SBALogTransform no + 0x0c24 InverseSBALogTransform no + 0x0c25 SBABlack int16u + 0x0c26 SBAGray int16u + 0x0c27 SBAWhite int16u + 0x0c28 GaussianWeights no + 0x0c29 SfsBoundary no + 0x0c2a CoringTableBest no + 0x0c2b CoringTableBetter no + 0x0c2c CoringTableGood no + 0x0c2d ExposureReferenceGain no + 0x0c2e ExposureReferenceOffset no + 0x0c2f SBARedBalanceLut no + 0x0c30 SBAGreenBalanceLut no + 0x0c31 SBABlueBalanceLut no + 0x0c32 SBANeutralBAL int32s + 0x0c33 SBAGreenMagentaBAL int32s + 0x0c34 SBAIlluminantBAL int32s + 0x0c35 SBAAnalysisComplete int8u + 0x0c36 JPEGQTableBest no + 0x0c37 JPEGQTableBetter no + 0x0c38 JPEGQTableGood no + 0x0c39 RembrandtPortraitToneScale no + 0x0c3a RembrandtConsumerToneScale no + 0x0c3b CFAGreenThreshold1 no + 0x0c3c CFAGreenThreshold2 no + 0x0c3d QTableLarge50Pct no + 0x0c3e QTableLarge67Pct no + 0x0c3f QTableLarge100Pct no + 0x0c40 QTableMedium50Pct no + 0x0c41 QTableMedium67Pct no + 0x0c42 QTableMedium100Pct no + 0x0c43 QTableSmall50Pct no + 0x0c44 QTableSmall67Pct no + 0x0c45 QTableSmall100Pct no + 0x0c46 SBAHighGray int16u + 0x0c47 SBALowGray int16u + 0x0c48 CaptureLook int16u + 0x0c49 SBAIllOffset int16s + 0x0c4a SBAGmOffset int16s + 0x0c4b NifNonlinearity12Bit no + 0x0c4c SharpeningOn no + 0x0c4d NifNonlinearity16Bit no + 0x0c4e RawHistogram no + 0x0c4f RawCFAComponentAverages no + 0x0c50 DisableFlagsPresent no + 0x0c51 DelayCols no + 0x0c52 DummyColsLeft no + 0x0c53 TrashColsRight no + 0x0c54 BlackColsRight no + 0x0c55 DummyColsRight no + 0x0c56 OverClockColsRight no + 0x0c57 UnusedBlackRowsTopOut no + 0x0c58 TrashRowsBottom no + 0x0c59 BlackRowsBottom no + 0x0c5a OverClockRowsBottom no + 0x0c5b BlackColsLeft no + 0x0c5c BlackRowsTop no + 0x0c5d PartialActiveColsLeft no + 0x0c5e PartialActiveColsRight no + 0x0c5f PartialActiveRowsTop no + 0x0c60 PartialActiveRowsBottom no + 0x0c61 ProcessBorderColsLeft int16u + 0x0c62 ProcessBorderColsRight int16u + 0x0c63 ProcessBorderRowsTop int16u + 0x0c64 ProcessBorderRowsBottom int16u + 0x0c65 ActiveCols no + 0x0c66 ActiveRows no + 0x0c67 FirstLines no + 0x0c68 UnusedBlackRowsTopIn no + 0x0c69 UnusedBlackRowsBottomIn no + 0x0c6a UnusedBlackRowsBottomOut no + 0x0c6b UnusedBlackColsLeftOut no + 0x0c6c UnusedBlackColsLeftIn no + 0x0c6d UnusedBlackColsRightIn no + 0x0c6e UnusedBlackColsRightOut no + 0x0c6f CFAOffsetRows int32u + 0x0c70 ShiftCols int16s + 0x0c71 CFAOffsetCols int32u + 0x0c76 DarkMapScale no + 0x0c77 HMapHandling no + 0x0c78 VMapHandling no + 0x0c79 DarkThreshold no + 0x0c7a DMDitherMatrix int16u + 0x0c7b DMDitherMatrixWidth int16u + 0x0c7c DMDitherMatrixHeight int16u + 0x0c7d MaxPixelValueThreshold int16u + 0x0c7e HoleFillDeltaThreshold int16u + 0x0c7f DarkPedestal int16u + 0x0c80 ImageProcessingFileTagsVersionNumber int16u + 0x0c81 ImageProcessingFileDateCreated string + 0x0c82 DoublingMicrovolts int32s + 0x0c83 DarkFrameShortExposure int32u + 0x0c84 DarkFrameLongExposure int32u + 0x0c85 DarkFrameCountFactor rational64u + 0x0c88 HoleFillDarkDeltaThreshold int16u + 0x0c89 FarkleWhiteThreshold no + 0x0c8a ColumnResetOffsets no + 0x0c8b ColumnGainFactors no + 0x0c8c Channel0LagKernel no + 0x0c8d Channel1LagKernel no + 0x0c8e Channel2LagKernel no + 0x0c8f Channel3LagKernel no + 0x0c90 BluegrassTable no + 0x0c91 BluegrassScale1 no + 0x0c92 BluegrassScale2 no + 0x0ce4 FinishedFileProcessingRequest no + 0x0ce5 FirmwareVersion string + 0x0ce6 HostSoftwareExportVersion no + 0x0ce7 HostSoftwareRendering int32u + 0x0dac DCS3XXProcessingInfoIFD no + 0x0dad DCS3XXProcessingInfo no + 0x0dae IPAVersion int32u + 0x0db6 FinishIPAVersion no + 0x0db7 FinishIPFVersion no + 0x0db8 FinishFileType int32u + 0x0db9 FinishResolution int32u + 0x0dba FinishNoise int32u + 0x0dbb FinishSharpening int32u + 0x0dbc FinishLook int32u + 0x0dbd FinishExposure int32u + 0x0e0b SigmaScalingFactorLowRes rational64u + 0x0e0c SigmaScalingFactorCamera rational64u + 0x0e0d SigmaImpulseParameters int16u[n] + 0x0e0e SigmaNoiseThreshTableV2 no + 0x0e0f SigmaSizeTable int16u[n] + 0x0e10 DacGainsCoarseAdjPreIF41 no + 0x0e11 SigmaNoiseFilterCalTableV1 no + 0x0e12 SigmaNoiseFilterTableV1 no + 0x0e13 Lin12ToKlut8 no + 0x0e14 SigmaNoiseFilterTableV1Version no + 0x0e15 Lin12ToKlut12 no + 0x0e16 Klut12ToLin12 no + 0x0e17 NifNonlinearity12To16 no + 0x0e18 SBALog12Transform no + 0x0e19 InverseSBALog12Transform no + 0x0e1a ToneScale0 no + 0x0e1b ToneScale1 no + 0x0e1c ToneScale2 no + 0x0e1d ToneScale3 no + 0x0e1e ToneScale4 no + 0x0e1f ToneScale5 no + 0x0e20 ToneScale6 no + 0x0e21 ToneScale7 no + 0x0e22 ToneScale8 no + 0x0e23 ToneScale9 no + 0x0e24 DayMat0 no + 0x0e25 DayMat1 no + 0x0e26 DayMat2 no + 0x0e27 DayMat3 no + 0x0e28 DayMat4 no + 0x0e29 DayMat5 no + 0x0e2a DayMat6 no + 0x0e2b DayMat7 no + 0x0e2c DayMat8 no + 0x0e2d DayMat9 no + 0x0e2e TungMat0 no + 0x0e2f TungMat1 no + 0x0e30 TungMat2 no + 0x0e31 TungMat3 no + 0x0e32 TungMat4 no + 0x0e33 TungMat5 no + 0x0e34 TungMat6 no + 0x0e35 TungMat7 no + 0x0e36 TungMat8 no + 0x0e37 TungMat9 no + 0x0e38 FluorMat0 no + 0x0e39 FluorMat1 no + 0x0e3a FluorMat2 no + 0x0e3b FluorMat3 no + 0x0e3c FluorMat4 no + 0x0e3d FluorMat5 no + 0x0e3e FluorMat6 no + 0x0e3f FluorMat7 no + 0x0e40 FluorMat8 no + 0x0e41 FluorMat9 no + 0x0e42 FlashMat0 no + 0x0e43 FlashMat1 no + 0x0e44 FlashMat2 no + 0x0e45 FlashMat3 no + 0x0e46 FlashMat4 no + 0x0e47 FlashMat5 no + 0x0e48 FlashMat6 no + 0x0e49 FlashMat7 no + 0x0e4a FlashMat8 no + 0x0e4b FlashMat9 no + 0x0e4c KodakLook string + 0x0e4d IPFCameraModel string + 0x0e4e AH2GreenInterpolationThreshold int16u + 0x0e4f ResamplingKernelDenominators067 int16u[3] + 0x0e50 ResamplingKernelDenominators050 int16u[3] + 0x0e51 ResamplingKernelDenominators100 int16u[3] + 0x0e56 LookMat0 no + 0x0e57 LookMat1 no + 0x0e58 LookMat2 no + 0x0e59 LookMat3 no + 0x0e5a LookMat4 no + 0x0e5b LookMat5 no + 0x0e5c LookMat6 no + 0x0e5d LookMat7 no + 0x0e5e LookMat8 no + 0x0e5f LookMat9 no + 0x0e60 CFAInterpolationAlgorithm int16u + 0x0e61 CFAInterpolationMetric int16u + 0x0e62 CFAZipperFixThreshold int16u + 0x0e63 NoiseReductionParametersKhufuRGB int16u[9] + 0x0e64 NoiseReductionParametersKhufu6MP int16u[9] + 0x0e65 NoiseReductionParametersKhufu3MP int16u[9] + 0x0e6a ChromaNoiseHighFThresh int32u[2] + 0x0e6b ChromaNoiseLowFThresh int32u[2] + 0x0e6c ChromaNoiseEdgeMapThresh int32u + 0x0e6d ChromaNoiseColorSpace int32u + 0x0e6e EnableChromaNoiseReduction int16u + 0x0e6f NoiseReductionParametersHostRGB int16u[9] + 0x0e70 NoiseReductionParametersHost6MP int16u[9] + 0x0e71 NoiseReductionParametersHost3MP int16u[9] + 0x0e72 NoiseReductionParametersCamera int16u[6] + 0x0e73 NoiseReductionParametersAtCapture int16u[6] + 0x0e74 LCDMatrix rational64s[9] + 0x0e75 LCDMatrixChickFix rational64s[9] + 0x0e76 LCDMatrixMarvin rational64s[9] + 0x0e7c LCDGammaTableChickFix no + 0x0e7d LCDGammaTableMarvin no + 0x0e7e LCDGammaTable no + 0x0e7f LCDSharpeningF1 no + 0x0e80 LCDSharpeningF2 no + 0x0e81 LCDSharpeningF3 no + 0x0e82 LCDSharpeningF4 no + 0x0e83 LCDEdgeMapX1 no + 0x0e84 LCDEdgeMapX2 no + 0x0e85 LCDEdgeMapX3 no + 0x0e86 LCDEdgeMapX4 no + 0x0e87 LCDEdgeMapSlope no + 0x0e88 YCrCbMatrix no + 0x0e89 LCDEdgeSpline no + 0x0e92 Fac18Per int16u + 0x0e93 Fac170Per int16u + 0x0e94 Fac100Per int16u + 0x0e9b ExtraTickLocations no + 0x0e9c RGBtoeV0 no + 0x0e9d RGBtoeV1 no + 0x0e9e RGBtoeV2 no + 0x0e9f RGBtoeV3 no + 0x0ea0 RGBtoeV4 no + 0x0ea1 RGBtoeV5 no + 0x0ea2 RGBtoeV6 no + 0x0ea3 RGBtoeV7 no + 0x0ea4 RGBtoeV8 no + 0x0ea5 RGBtoeV9 no + 0x0ea6 LCDHistLUT0 no + 0x0ea7 LCDHistLUT1 no + 0x0ea8 LCDHistLUT2 no + 0x0ea9 LCDHistLUT3 no + 0x0eaa LCDHistLUT4 no + 0x0eab LCDHistLUT5 no + 0x0eac LCDHistLUT6 no + 0x0ead LCDHistLUT7 no + 0x0eae LCDHistLUT8 no + 0x0eaf LCDHistLUT9 no + 0x0eb0 LCDLinearClipValue no + 0x0ece LCDStepYvalues no + 0x0ecf LCDStepYvaluesChickFix no + 0x0ed0 LCDStepYvaluesMarvin no + 0x0ed8 InterpolationCoefficients no + 0x0ed9 InterpolationCoefficients6MP no + 0x0eda InterpolationCoefficients3MP no + 0x0f00 NoiseReductionParametersHostNormal no + 0x0f01 NoiseReductionParametersHostStrong no + 0x0f02 NoiseReductionParametersHostLow no + 0x0f0a MariahTextureThreshold int16u + 0x0f0b MariahMapLoThreshold int16u + 0x0f0c MariahMapHiThreshold int16u + 0x0f0d MariahChromaBlurSize int16u + 0x0f0e MariahSigmaThreshold int16u + 0x0f0f MariahThresholds no + 0x0f10 MariahThresholdsNormal no + 0x0f11 MariahThresholdsStrong no + 0x0f12 MariahThresholdsLow no + 0x0f14 KhufuLinearRedMixingCoefficient no + 0x0f15 KhufuLinearGreenMixingCoefficient no + 0x0f16 KhufuLinearBlueMixingCoefficient no + 0x0f17 KhufuUSpaceC2MixingCoefficient no + 0x0f18 KhufuSigmaGaussianWeights no + 0x0f19 KhufuSigmaScalingFactors6MP no + 0x0f1a KhufuSigmaScalingFactors3MP no + 0x0f1b KhufuSigmaScalingFactors14MP no + 0x0f32 KhufuI0Thresholds no + 0x0f33 KhufuI1Thresholds no + 0x0f34 KhufuI2Thresholds no + 0x0f35 KhufuI3Thresholds no + 0x0f36 KhufuI4Thresholds no + 0x0f37 KhufuI5Thresholds no + 0x0f3c CondadoDayBVThresh int16u + 0x0f3d CondadoNeuRange int16u + 0x0f3e CondadoBVFactor int16s + 0x0f3f CondadoIllFactor int16s + 0x0f40 CondadoTunThresh int16s + 0x0f41 CondadoFluThresh int16s + 0x0f42 CondadoDayOffsets int16s[2] + 0x0f43 CondadoTunOffsets int16s[2] + 0x0f44 CondadoFluOffsets int16s[2] + 0x0f5a ERIMMToCRGB0Spline no + 0x0f5b ERIMMToCRGB1Spline no + 0x0f5c ERIMMToCRGB2Spline no + 0x0f5d ERIMMToCRGB3Spline no + 0x0f5e ERIMMToCRGB4Spline no + 0x0f5f ERIMMToCRGB5Spline no + 0x0f60 ERIMMToCRGB6Spline no + 0x0f61 ERIMMToCRGB7Spline no + 0x0f62 ERIMMToCRGB8Spline no + 0x0f63 ERIMMToCRGB9Spline no + 0x0f64 CRGBToERIMM0Spline no + 0x0f65 CRGBToERIMM1Spline no + 0x0f66 CRGBToERIMM2Spline no + 0x0f67 CRGBToERIMM3Spline no + 0x0f68 CRGBToERIMM4Spline no + 0x0f69 CRGBToERIMM5Spline no + 0x0f6a CRGBToERIMM6Spline no + 0x0f6b CRGBToERIMM7Spline no + 0x0f6c CRGBToERIMM8Spline no + 0x0f6d CRGBToERIMM9Spline no + 0x0f6e ERIMMNonLinearitySpline no + 0x0f6f Delta12To8Spline no + 0x0f70 Delta8To12Spline no + 0x0f71 InverseMonitorMatrix no + 0x0f72 NifNonlinearityExt no + 0x0f73 InvNifNonLinearity no + 0x0f74 RIMM13ToERIMM12Spline no + 0x0f78 ToneScale0Spline no + 0x0f79 ToneScale1Spline no + 0x0f7a ToneScale2Spline no + 0x0f7b ToneScale3Spline no + 0x0f7c ToneScale4Spline no + 0x0f7d ToneScale5Spline no + 0x0f7e ToneScale6Spline no + 0x0f7f ToneScale7Spline no + 0x0f80 ToneScale8Spline no + 0x0f81 ToneScale9Spline no + 0x0f82 ERIMMToneScale0Spline no + 0x0f83 ERIMMToneScale1Spline no + 0x0f84 ERIMMToneScale2Spline no + 0x0f85 ERIMMToneScale3Spline no + 0x0f86 ERIMMToneScale4Spline no + 0x0f87 ERIMMToneScale5Spline no + 0x0f88 ERIMMToneScale6Spline no + 0x0f89 ERIMMToneScale7Spline no + 0x0f8a ERIMMToneScale8Spline no + 0x0f8b ERIMMToneScale9Spline no + 0x0f8c RIMMToCRGB0Spline no + 0x0f8d RIMMToCRGB1Spline no + 0x0f8e RIMMToCRGB2Spline no + 0x0f8f RIMMToCRGB3Spline no + 0x0f90 RIMMToCRGB4Spline no + 0x0f91 RIMMToCRGB5Spline no + 0x0f92 RIMMToCRGB6Spline no + 0x0f93 RIMMToCRGB7Spline no + 0x0f94 RIMMToCRGB8Spline no + 0x0f95 RIMMToCRGB9Spline no + 0x0fa0 QTableLarge25Pct no + 0x0fa1 QTableMedium25Pct no + 0x0fa2 QTableSmall25Pct no + 0x1130 NoiseReductionKernel no + 0x1388 UserMetaData no + 0x1389 InputProfile undef + 0x138a KodakLookProfile undef + 0x138b OutputProfile undef + 0x1390 SourceProfilePrefix string + 0x1391 ToneCurveProfileName string + 0x1392 InputProfile ICC_Profile + 0x1393 ProcessParametersV2 no + 0x1394 ReservedBlob2 no + 0x1395 ReservedBlob3 no + 0x1396 ReservedBlob4 no + 0x1397 ReservedBlob5 no + 0x1398 ReservedBlob6 no + 0x1399 ReservedBlob7 no + 0x139a ReservedBlob8 no + 0x139b ReservedBlob9 no + 0x1770 ScriptVersion int32u + 0x177a ImagerTimingData no + 0x1784 ISO int32u + 0x17a2 Scav11Cols no + 0x17a3 Scav12Cols no + 0x17a4 Scav21Cols no + 0x17a5 Scav22Cols no + 0x17a6 ActiveCTEMonitor1Cols no + 0x17a7 ActiveCTEMonitor2Cols no + 0x17a8 ActiveCTEMonitorRows no + 0x17a9 ActiveBuf1Cols no + 0x17aa ActiveBuf2Cols no + 0x17ab ActiveBuf1Rows no + 0x17ac ActiveBuf2Rows no + 0x17c0 HRNoiseLines no + 0x17c1 RNoiseLines no + 0x17c2 ANoiseLines no + 0x17d4 ImagerCols int16u + 0x17de ImagerRows int16u + 0x17e8 PartialActiveCols1 int32u + 0x17f2 PartialActiveCols2 int32u + 0x17fc PartialActiveRows1 int32u + 0x1806 PartialActiveRows2 int32u + 0x1810 ElectricalBlackColumns int32u + 0x181a ResetBlackSegRows int32u + 0x1838 CaptureWidthNormal int32u + 0x1839 CaptureHeightNormal int32u + 0x183a CaptureWidthResetBlackSegNormal no + 0x183b CaptureHeightResetBlackSegNormal no + 0x183c DarkRefOffsetNormal no + 0x1842 CaptureWidthTest int32u + 0x1843 CaptureHeightTest no + 0x1844 CaptureWidthResetBlackSegTest no + 0x1845 CaptureHeightResetBlackSegTest no + 0x1846 DarkRefOffsetTest no + 0x184c ImageSegmentStartLine int32u + 0x184d ImageSegmentLines int32u + 0x184e SkipLineTime int32u + 0x1860 FastResetLineTime int32u + 0x186a NormalLineTime int32u + 0x1874 MinIntegrationRows int32u + 0x187e PreReadFastResetCount int32u + 0x1888 TransferTimeNormal int32u + 0x1889 TransferTimeTest int32u + 0x188a QuietTime int32u + 0x189c OverClockCols int16u + 0x18a6 H2ResetBlackPixels int32u + 0x18b0 H3ResetBlackPixels int32u + 0x18ba BlackAcquireRows int32u + 0x18c4 OverClockRows int16u + 0x18ce H3ResetBlackColumns int32u + 0x18d8 DarkBlackSegRows int32u + 0x1900 CrossbarEnable no + 0x1901 FifoenOnePixelDelay int32u + 0x1902 ReadoutTypeRequested int32u + 0x1903 ReadoutTypeActual int32u + 0x190a OffsetDacValue int32u + 0x1914 TempAmpGainX100 int32u + 0x191e VarrayDacNominalValues int32u[3] + 0x1928 VddimDacNominalValues no + 0x1964 C14Configuration int32u + 0x196e TDA1Offset int32u[3] + 0x196f TDA1Bandwidth int32u + 0x1970 TDA1Gain int32u[3] + 0x1971 TDA1EdgePolarity int32u + 0x1978 TDA2Offset int32u[3] + 0x1979 TDA2Bandwidth int32u + 0x197a TDA2Gain int32u[3] + 0x197b TDA2EdgePolarity int32u + 0x1982 TDA3Offset int32u[3] + 0x1983 TDA3Bandwidth int32u + 0x1984 TDA3Gain int32u[3] + 0x1985 TDA3EdgePolarity int32u + 0x198c TDA4Offset int32u[3] + 0x198d TDA4Bandwidth int32u + 0x198e TDA4Gain int32u[3] + 0x198f TDA4EdgePolarity int32u + 0xfde8 ComLenBlkSize int16u + +=head3 Kodak TextualInfo Tags + +Below is a list of tags which have been observed in the Kodak TextualInfo +data, however ExifTool will extract information from any tags found here. + + Tag ID Tag Name Writable + ------ -------- -------- + 'AF Function' AFMode no + 'Actual Compensation' ActualCompensation no + 'Aperture' Aperture no + 'Auto Bracket' AutoBracket no + 'Brightness Value' BrightnessValue no + 'Camera' CameraModel no + 'Camera body' CameraBody no + 'Compensation' ExposureCompensation no + 'Date' Date no + 'Exposure Bias' ExposureBias no + 'Exposure Mode' ExposureMode no + 'Firmware Version' FirmwareVersion no + 'Flash Compensation' FlashExposureComp no + 'Flash Fired' FlashFired no + 'Flash Sync Mode' FlashSyncMode no + 'Focal Length' FocalLength no + 'Height' KodakImageHeight no + 'ISO' ISO no + 'ISO Speed' ISO no + 'Image Number' ImageNumber no + 'Lens' Lens no + 'Max Aperture' MaxAperture no + 'Meter Mode' MeterMode no + 'Min Aperture' MinAperture no + 'Popup Flash' PopupFlash no + 'Serial Number' SerialNumber no + 'Shooting Mode' ShootingMode no + 'Shutter' ShutterSpeed no + 'Temperature' Temperature no + 'Time' Time no + 'White balance' WhiteBalance no + 'Width' KodakImageWidth no + '_other_info' OtherInfo no + +=head3 Kodak Processing Tags + + Index2 Tag Name Writable + ------ -------- -------- + 20 WB_RGBLevels no + +=head3 Kodak Type2 Tags + +These tags are used by the Kodak DC220, DC260, DC265 and DC290, +Hewlett-Packard PhotoSmart 618, C500 and C912, Pentax EI-200 and EI-2000, +and Minolta EX1500Z. + + Index1 Tag Name Writable + ------ -------- -------- + 8 KodakMaker string[32] + 40 KodakModel string[32] + 108 KodakImageWidth int32u + 112 KodakImageHeight int32u + +=head3 Kodak Type3 Tags + +These tags are used by the DC240, DC280, DC3400 and DC5000. + + Index1 Tag Name Writable + ------ -------- -------- + 12 YearCreated int16u + 14 MonthDayCreated int8u[2] + 16 TimeCreated int8u[4] + 30 OpticalZoom int16u + 55 Sharpness int8s + 56 ExposureTime int32u + 60 FNumber int16u + 78 ISO int16u + +=head3 Kodak Type4 Tags + +These tags are used by the DC200 and DC215. + + Index1 Tag Name Writable + ------ -------- -------- + 32 OriginalFileName string[12] + +=head3 Kodak Type5 Tags + +These tags are used by the CX4200, CX4210, CX4230, CX4300, CX4310, CX6200 +and CX6230. + + Index1 Tag Name Writable + ------ -------- -------- + 20 ExposureTime int32u + 26 WhiteBalance int8u + 28 FNumber int16u + 30 ISO int16u + 32 OpticalZoom int16u + 34 DigitalZoom int16u + 39 FlashMode int8u + 42 ImageRotated int8u + 43 Macro int8u + +=head3 Kodak Type6 Tags + +These tags are used by the DX3215 and DX3700. + + Index1 Tag Name Writable + ------ -------- -------- + 16 ExposureTime int32u + 20 ISOSetting? int32u + 24 FNumber int16u + 26 ISO int16u + 28 OpticalZoom int16u + 30 DigitalZoom int16u + 34 Flash int16u + +=head3 Kodak Type7 Tags + +The maker notes of models such as the C340, C433, CC533, LS755, V803 and +V1003 seem to start with the camera serial number. The C310, C315, C330, +C643, C743, CD33, CD43, CX7220 and CX7300 maker notes are also decoded using +this table, although the strings for these cameras don't conform to the +usual Kodak serial number format, and instead have the model name followed +by 8 digits. + + Index1 Tag Name Writable + ------ -------- -------- + 0 SerialNumber string[16] + +=head3 Kodak Type8 Tags + +Kodak models such as the ZD710, P712, P850, P880, V1233, V1253, V1275, +V1285, Z612, Z712, Z812, Z885 use standard TIFF IFD format for the maker +notes. In keeping with Kodak's strategy of inconsistent makernotes, models +such as the M380, M1033, M1093, V1073, V1273, Z1012, Z1085 and Z8612 +also use these tags, but these makernotes begin with a TIFF header instead +of an IFD entry count and use relative instead of absolute offsets. There +is a large amount of information stored in these maker notes (apparently +with much duplication), but relatively few tags have so far been decoded. + + Tag ID Tag Name Writable + ------ -------- -------- + 0xfc00 SubIFD0 Kodak SubIFD0 + Kodak SubIFD0 + 0xfc01 SubIFD1 Kodak SubIFD1 + Kodak SubIFD1 + 0xfc02 SubIFD2 Kodak SubIFD2 + Kodak SubIFD2 + 0xfc03 SubIFD3 Kodak SubIFD3 + Kodak SubIFD3 + 0xfc04 SubIFD4 Kodak SubIFD4 + Kodak SubIFD4 + 0xfc05 SubIFD5 Kodak SubIFD5 + Kodak SubIFD5 + 0xfc06 SubIFD6 Kodak SubIFD6 + Kodak SubIFD6 + 0xfcff SubIFD255 Kodak SubIFD0 + 0xff00 CameraInfo Kodak CameraInfo + +=head3 Kodak SubIFD0 Tags + +SubIFD0 through SubIFD5 tags are written a number of newer Kodak models. + + Tag ID Tag Name Writable + ------ -------- -------- + 0xfa02 SceneMode int16u + 0xfa19 SerialNumber string + 0xfa1d KodakImageWidth int16u + 0xfa1e KodakImageHeight int16u + 0xfa20 SensorWidth int16u + 0xfa21 SensorHeight int16u + 0xfa23 FNumber int16u + 0xfa24 ExposureTime int32u + 0xfa2e ISO int16u + 0xfa3d OpticalZoom int16u + 0xfa46 ISO int16u + 0xfa51 KodakImageWidth int16u + 0xfa52 KodakImageHeight int16u + 0xfa54 ThumbnailWidth int16u + 0xfa55 ThumbnailHeight int16u + 0xfa57 PreviewImageWidth int16u + 0xfa58 PreviewImageHeight int16u + +=head3 Kodak SubIFD1 Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0027 ISO int16u + 0x0028 ISO int16u + +=head3 Kodak SubIFD2 Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x6002 SceneModeUsed int32u + 0x6006 OpticalZoom int32u + 0x6103 MaxAperture int32u + 0xf002 SceneModeUsed int32u + 0xf006 OpticalZoom int32u + 0xf103 FNumber int32u + 0xf104 ExposureTime int32u + 0xf105 ISO int32u + +=head3 Kodak SubIFD3 Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x1000 OpticalZoom int16u + +=head3 Kodak SubIFD4 Tags + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Kodak SubIFD5 Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x000f OpticalZoom int16u + +=head3 Kodak SubIFD6 Tags + +SubIFD6 is written by the M580. + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Kodak CameraInfo Tags + +These tags are used by the P712, P850 and P880. + + Tag ID Tag Name Writable + ------ -------- -------- + 0xf900 SensorWidth int16u + 0xf901 SensorHeight int16u + 0xf902 BayerPattern string + 0xf903 SensorFullWidth int16u + 0xf904 SensorFullHeight int16u + 0xf907 KodakImageWidth int16u + 0xf908 KodakImageHeight int16u + 0xfa00 KodakInfoType string + 0xfa04 SerialNumber string + 0xfd04 FNumber int16u + 0xfd05 ExposureTime int32u + 0xfd06 ISO int16u + +=head3 Kodak Type9 Tags + +These tags are used by the Kodak C140, C180, C913, C1013, M320, M340 and +M550, as well as various cameras marketed by other manufacturers. + + Index1 Tag Name Writable + ------ -------- -------- + 12 FNumber int16u + 16 ExposureTime int32u + 20 DateTimeOriginal string[20] + 52 ISO int16u + 87 FirmwareVersion string[16] + 168 UnknownNumber no + 196 UnknownNumber no + +=head3 Kodak Type10 Tags + +Another variation of the IFD-format type, this time with just a byte order +indicator instead of a full TIFF header. These tags are used by the Z980. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0002 PreviewImageSize int16u[2] + 0x0012 ExposureTime int32u + 0x0013 FNumber int16u + 0x0014 ISO int16u + 0x001d FocalLength int32u + +=head3 Kodak Type11 Tags + +These tags are found in models such as the PixPro S-1. They are not +writable because the inconsistency of Kodak maker notes is beginning to get +on my nerves. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0104 FirmwareVersion no + 0x0203 PictureEffect no + 0x0207 KodakModel no + 0x0300 KodakMake no + 0x0308 LensSerialNumber no + 0x0309 LensModel no + 0x030d LevelMeter? no + 0x0311 Pitch no + 0x0312 Yaw no + 0x0313 Roll no + 0x0314 CX? no + 0x0315 CY? no + 0x0316 Rads? no + +=head3 Kodak Unknown Tags + + Index1 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Kodak Meta Tags + +These tags are found in the APP3 "Meta" segment of JPEG images from Kodak +cameras such as the DC280, DC3400, DC5000, MC3, M580, Z950 and Z981. The +structure of this segment is similar to the APP1 "Exif" segment, but a +different set of tags is used. + + Tag ID Tag Name Writable + ------ -------- -------- + 0xc350 FilmProductCode no + 0xc351 ImageSourceEK no + 0xc352 CaptureConditionsPAR no + 0xc353 CameraOwner undef + 0xc354 SerialNumber undef + 0xc355 UserSelectGroupTitle no + 0xc356 DealerIDNumber no + 0xc357 CaptureDeviceFID no + 0xc358 EnvelopeNumber no + 0xc359 FrameNumber no + 0xc35a FilmCategory no + 0xc35b FilmGencode no + 0xc35c ModelAndVersion no + 0xc35d FilmSize no + 0xc35e SBA_RGBShifts no + 0xc35f SBAInputImageColorspace no + 0xc360 SBAInputImageBitDepth no + 0xc361 SBAExposureRecord no + 0xc362 UserAdjSBA_RGBShifts no + 0xc363 ImageRotationStatus no + 0xc364 RollGuidElements no + 0xc365 MetadataNumber no + 0xc366 EditTagArray no + 0xc367 Magnification no + 0xc36c NativeXResolution no + 0xc36d NativeYResolution no + 0xc36e KodakEffectsIFD Kodak SpecialEffects + 0xc36f KodakBordersIFD Kodak Borders + 0xc37a NativeResolutionUnit no + 0xc418 SourceImageDirectory no + 0xc419 SourceImageFileName no + 0xc41a SourceImageVolumeName no + 0xc46c PrintQuality no + 0xc46e ImagePrintStatus no + +=head3 Kodak SpecialEffects Tags + +The Kodak SpecialEffects and Borders tags are found in sub-IFD's within the +Kodak JPEG APP3 "Meta" segment. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 DigitalEffectsVersion no + 0x0001 DigitalEffectsName no + 0x0002 DigitalEffectsType no + +=head3 Kodak Borders Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 BordersVersion no + 0x0001 BorderName no + 0x0002 BorderID no + 0x0003 BorderLocation no + 0x0004 BorderType no + 0x0008 WatermarkType no + +=head3 Kodak KDC_IFD Tags + +These tags are found in a separate IFD of KDC images from some newer Kodak +models such as the P880 and Z1015IS. + + Tag ID Tag Name Writable + ------ -------- -------- + 0xfa00 SerialNumber string + 0xfa0d WhiteBalance int8u + 0xfa25 WB_RGBLevelsAuto no + 0xfa27 WB_RGBLevelsTungsten no + 0xfa28 WB_RGBLevelsFluorescent no + 0xfa29 WB_RGBLevelsDaylight no + 0xfa2a WB_RGBLevelsShade no + +=head3 Kodak frea Tags + +Information stored in the "frea" atom of Kodak PixPro SP360 MP4 videos. + + Tag ID Tag Name Writable + ------ -------- -------- + 'scra' PreviewImage no + 'thma' ThumbnailImage no + 'tima' Duration no + 'ver ' KodakVersion no + +=head3 Kodak Free Tags + +Information stored in the "free" atom of Kodak MP4 videos. (VERY bad form +for Kodak to store useful information in an atom intended for unused space!) + + Tag ID Tag Name Writable + ------ -------- -------- + 'AprV' ApertureValue no + 'BrtV' BrightnessValue no + 'Expc' ExposureCompensation no + 'Expo' ExposureTime no + 'FL35' FocalLengthIn35mmFormat no + 'FNum' FNumber no + 'FoLn' FocalLength no + 'ISOS' ISO no + 'SVer' FirmwareVersion no + 'Scrn' PreviewInfo Kodak Scrn + 'Seri' SerialNumber no + 'StSV' ShutterSpeedValue no + +=head3 Kodak Scrn Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 PreviewImageWidth no + 1 PreviewImageHeight no + 2 PreviewImageLength no + 4 PreviewImage no + +=head3 Kodak DcMD Tags + +Metadata directory found in MOV and MP4 videos from some Kodak cameras. + + Tag ID Tag Name Writable + ------ -------- -------- + 'CMbo' CameraByteOrder no + 'Cmbo' CameraByteOrder no + 'DcEM' DcEM Kodak DcEM + 'DcME' DcME Kodak DcME + +=head3 Kodak DcEM Tags + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Kodak DcME Tags + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Kodak MOV Tags + +This information is found in the TAGS atom of MOV videos from Kodak models +such as the P880. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 22 Model no + 64 ModelType no + 78 ExposureTime no + 82 FNumber no + 90 ExposureCompensation no + 112 FocalLength no + +=head3 Kodak pose Tags + +Streamed orientation information from the PixPro 4KVR360, extracted as +sub-documents when the Duplicates option is used. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Accelerometer' Accelerometer no + 'AngularVelocity' AngularVelocity no + +=head2 Leaf Tags + +These tags are found in .MOS images from Leaf digital camera backs as +written by Creo Leaf Capture. They exist within the Leaf-specific directory +structure of EXIF tag 0x8606. The tables below list observed Leaf tags, +however ExifTool will extract any tags found in the Leaf directories even if +they don't appear in these tables. + + Tag ID Tag Name Writable + ------ -------- -------- + 'JPEG_preview_data' PreviewImage no + 'JPEG_preview_info' PreviewInfo no + 'PDA_histogram_data' PDAHistogram no + 'back_serial_number' BackSerial no + 'camera_profile' CameraProfile Leaf CameraProfile + 'icc_camera_profile' ICC_Profile ICC_Profile + 'icc_camera_to_tone_matrix' ToneMatrix no + 'icc_camera_to_tone_space_flow' ToneSpaceFlow no + 'icc_rgb_ws_profile' RGB_Profile ICC_Profile + 'image_offset' ImageOffset no + 'pattern_ratation_angle' PatternAngle no + +=head3 Leaf CameraProfile Tags + +All B<Tag ID>'s in the following table have a leading 'CamProf_' which +has been removed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'back_type' CameraBackType no + 'capture_profile' CaptureProfile Leaf CaptureProfile + 'image_profile' ImageProfile Leaf ImageProfile + 'name' CameraName no + 'type' CameraType no + 'version' CameraProfileVersion no + +=head3 Leaf CaptureProfile Tags + +All B<Tag ID>'s in the following table have a leading 'CaptProf_' which +has been removed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'CCD_rect' CCDRect no + 'CCD_valid_rect' CCDValidRect no + 'CCD_video_rect' CCDVideoRect no + 'back_type' CaptProfBackType no + 'center_dark_rect' CenterDarkRect no + 'color_averages' ColorAverages no + 'color_matrix' ColorMatrix no + 'dark_correction_type' DarkCorrectionType no + 'image_bounds' ImageBounds no + 'image_fields' ImageFields no + 'image_offset' ImageOffset no + 'left_dark_rect' LeftDarkRect no + 'luminance_consts' LuminanceConsts no + 'mosaic_pattern' MosaicPattern no + 'name' CaptProfName no + 'number_of_planes' NumberOfPlanes no + 'raw_data_rotation' RawDataRotation no + 'reconstruction_type' ReconstructionType no + 'right_dark_rect' RightDarkRect no + 'serial_number' CaptureSerial no + 'type' CaptProfType no + 'version' CaptProfVersion no + 'xy_offset_info' XYOffsetInfo no + +=head3 Leaf ImageProfile Tags + +All B<Tag ID>'s in the following table have a leading 'ImgProf_' which +has been removed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'back_type' ImgProfBackType no + 'image_status' ImageStatus no + 'name' ImgProfName no + 'rotation_angle' RotationAngle no + 'shoot_setup' ShootSetup Leaf ShootSetup + 'type' ImgProfType no + 'version' ImgProfVersion no + +=head3 Leaf ShootSetup Tags + +All B<Tag ID>'s in the following table have a leading 'ShootObj_' which +has been removed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'back_type' ShootObjBackType no + 'camera_setup' CameraSetup Leaf CameraSetup + 'capture_setup' CaptureSetup Leaf CaptureSetup + 'color_setup' ColorSetup Leaf ColorSetup + 'look_header' LookHeader Leaf LookHeader + 'name' ShootObjName no + 'save_setup' SaveSetup Leaf SaveSetup + 'type' ShootObjType no + 'version' ShootObjVersion no + +=head3 Leaf CameraSetup Tags + +All B<Tag ID>'s in the following table have a leading 'CameraObj_' which +has been removed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'ISO_speed' ISOSpeed no + 'back_type' CameraObjBackType no + 'camera_type' CameraType no + 'lens_ID' LensID no + 'lens_type' LensType no + 'name' CameraObjName no + 'strobe' Strobe no + 'type' CameraObjType no + 'version' CameraObjVersion no + +=head3 Leaf CaptureSetup Tags + +All B<Tag ID>'s in the following table have a leading 'CaptureObj_' which +has been removed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Multi_quality' MultiQuality no + 'back_type' CaptureObjBackType no + 'name' CaptureObjName no + 'neutals' Neutals Leaf Neutrals + 'selection' Selection Leaf Selection + 'sharpness' Sharpness Leaf Sharpness + 'single_quality' SingleQuality no + 'tone_curve' ToneCurve Leaf ToneCurve + 'type' CaptureObjType no + 'version' CaptureObjVersion no + +=head3 Leaf Neutrals Tags + +All B<Tag ID>'s in the following table have a leading 'NeutObj_' which +has been removed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'back_type' NeutObjBackType no + 'color_casts' ColorCasts no + 'highlight_end_points' HighlightEndPoints no + 'name' NeutObjName no + 'neutrals' Neutrals no + 'shadow_end_points' ShadowEndPoints no + 'type' NeutObjType no + 'version' NeutObjVersion no + +=head3 Leaf Selection Tags + +All B<Tag ID>'s in the following table have a leading 'SelObj_' which +has been removed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'back_type' SelObjBackType no + 'locks' Locks no + 'name' SelObjName no + 'orientation' Orientation no + 'rect' Rect no + 'resolution' Resolution no + 'scale' Scale no + 'type' SelObjType no + 'version' SelObjVersion no + +=head3 Leaf Sharpness Tags + +All B<Tag ID>'s in the following table have a leading 'SharpObj_' which +has been removed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'back_type' SharpObjBackType no + 'data_len' DataLen no + 'name' SharpObjName no + 'sharp_info' SharpInfo no + 'sharp_method' SharpMethod no + 'type' SharpObjType no + 'version' SharpObjVersion no + +=head3 Leaf ToneCurve Tags + +All B<Tag ID>'s in the following table have a leading 'ToneObj_' which +has been removed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'back_type' ToneObjBackType no + 'gamma' Gamma no + 'name' ToneObjName no + 'npts' Npts no + 'tones' Tones no + 'type' ToneObjType no + 'version' ToneObjVersion no + +=head3 Leaf ColorSetup Tags + +All B<Tag ID>'s in the following table have a leading 'ColorObj_' which +has been removed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'back_type' ColorObjBackType no + 'color_mode' ColorMode no + 'color_type' ColorType no + 'has_ICC' HasICC no + 'input_profile' InputProfile no + 'name' ColorObjName no + 'output_profile' OutputProfile no + 'type' ColorObjType no + 'version' ColorObjVersion no + +=head3 Leaf LookHeader Tags + +All B<Tag ID>'s in the following table have a leading 'LookHead_' which +has been removed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'back_type' LookHeadBackType no + 'name' LookHeadName no + 'type' LookHeadType no + 'version' LookHeadVersion no + +=head3 Leaf SaveSetup Tags + +All B<Tag ID>'s in the following table have a leading 'SaveObj_' which +has been removed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'back_type' SaveObjBackType no + 'leaf_auto_active' LeafAutoActive no + 'leaf_auto_base_name' LeafAutoBaseName no + 'leaf_hot_folder' LeafHotFolder no + 'leaf_open_proc_HDR' LeafOpenProcHDR no + 'leaf_output_file_type' LeafOutputFileType no + 'leaf_save_selection' LeafSaveSelection no + 'name' SaveObjName no + 'std_auto_active' StdAutoActive no + 'std_base_name' StdBaseName no + 'std_hot_folder' StdHotFolder no + 'std_open_in_photoshop' StdOpenInPhotoshop no + 'std_output_bit_depth' StdOutputBitDepth no + 'std_output_color_mode' StdOutputColorMode no + 'std_output_file_type' StdOutputFileType no + 'std_oxygen' StdOxygen no + 'std_save_selection' StdSaveSelection no + 'std_scaled_output' StdScaledOutput no + 'std_sharpen_output' StdSharpenOutput no + 'type' SaveObjType no + 'version' SaveObjVersion no + +=head3 Leaf SubIFD Tags + +Leaf writes a TIFF-format sub-IFD inside IFD0 of a MOS image. No tags in +this sub-IFD are currently known, except for tags 0x8602 and 0x8606 which +really shouldn't be here anyway (so they don't appear in the table below) +because they duplicate references to the same data from tags with the same +ID in IFD0. + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head2 Minolta Tags + +These tags are used by Minolta, Konica/Minolta as well as some Sony cameras. +Minolta doesn't make things easy for decoders because the meaning of some +tags and the location where some information is stored is different for +different camera models. (Take MinoltaQuality for example, which may be +located in 5 different places.) + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 MakerNoteVersion undef[4] + 0x0001 MinoltaCameraSettingsOld Minolta CameraSettings + 0x0003 MinoltaCameraSettings Minolta CameraSettings + 0x0004 MinoltaCameraSettings7D Minolta CameraSettings7D + 0x0010 CameraInfoA100 Minolta CameraInfoA100 + 0x0018 ISInfoA100 Minolta ISInfoA100 + ImageStabilization no + 0x0020 WBInfoA100 Minolta WBInfoA100 + 0x0040 CompressedImageSize int32u + 0x0081 PreviewImage undef + 0x0088 PreviewImageStart int32u* + 0x0089 PreviewImageLength int32u* + 0x0100 SceneMode int32u + 0x0101 ColorMode int32u + 0x0102 MinoltaQuality int32u + 0x0103 MinoltaQuality int32u + MinoltaImageSize int32u + 0x0104 FlashExposureComp rational64s + 0x0105 Teleconverter int32u + 0x0107 ImageStabilization int32u + 0x0109 RawAndJpgRecording int32u + 0x010a ZoneMatching int32u + 0x010b ColorTemperature int32u + 0x010c LensType int32u + 0x0111 ColorCompensationFilter int32s + 0x0112 WhiteBalanceFineTune int32u + 0x0113 ImageStabilization int32u + 0x0114 MinoltaCameraSettings5D Minolta CameraSettings5D + CameraSettingsA100 Minolta CameraSettingsA100 + 0x0115 WhiteBalance int32u + 0x0e00 PrintIM PrintIM + 0x0f00 MinoltaCameraSettings2 no + +=head3 Minolta CameraSettings Tags + +There is some variability in CameraSettings information between different +models (and sometimes even between different firmware versions), so this +information may not be as reliable as it should be. Because of this, tags +in the following tables are set to lower priority to prevent them from +superseding the values of same-named tags in other locations when duplicate +tags are disabled. + + Index4 Tag Name Writable + ------ -------- -------- + 1 ExposureMode int32u + 2 FlashMode int32u + 3 WhiteBalance int32u~ + 4 MinoltaImageSize int32u + 5 MinoltaQuality int32u + 6 DriveMode int32u + 7 MeteringMode int32u + 8 ISO int32u + 9 ExposureTime int32u + 10 FNumber int32u + 11 MacroMode int32u + 12 DigitalZoom int32u + 13 ExposureCompensation int32u + 14 BracketStep int32u + 16 IntervalLength int32u + 17 IntervalNumber int32u + 18 FocalLength int32u + 19 FocusDistance int32u + 20 FlashFired int32u + 21 MinoltaDate int32u + 22 MinoltaTime int32u + 23 MaxAperture int32u + 26 FileNumberMemory int32u + 27 LastFileNumber int32u + 28 ColorBalanceRed int32u + 29 ColorBalanceGreen int32u + 30 ColorBalanceBlue int32u + 31 Saturation int32u + 32 Contrast int32u + 33 Sharpness int32u + 34 SubjectProgram int32u + 35 FlashExposureComp int32u + 36 ISOSetting int32u + 37 MinoltaModelID int32u + 38 IntervalMode int32u + 39 FolderName int32u + 40 ColorMode int32u + 41 ColorFilter int32u + 42 BWFilter int32u + 43 InternalFlash int32u + 44 Brightness int32u + 45 SpotFocusPointX int32u + 46 SpotFocusPointY int32u + 47 WideFocusZone int32u + 48 FocusMode int32u + 49 FocusArea int32u + 50 DECPosition int32u + 51 ColorProfile int32u + 52 DataImprint int32u + 63 FlashMetering int32u + +=head3 Minolta CameraSettings7D Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 ExposureMode int16u + 2 MinoltaImageSize int16u + 3 MinoltaQuality int16u + 4 WhiteBalance int16u + 14 FocusMode int16u + 16 AFPoints int16u + 21 Flash int16u + 22 FlashMode int16u + 28 ISOSetting int16u + 30 ExposureCompensation int16s + 37 ColorSpace int16u + 38 Sharpness int16u + 39 Contrast int16u + 40 Saturation int16u + 45 FreeMemoryCardImages int16u + 63 ColorTemperature int16s + 64 HueAdjustment int16u + 70 Rotation int16u + 71 FNumber int16u + 72 ExposureTime int16u + 74 FreeMemoryCardImages int16u + 94 ImageNumber int16u + 96 NoiseReduction int16u + 98 ImageNumber2 int16u + 113 ImageStabilization int16u + 117 ZoneMatchingOn int16u + +=head3 Minolta CameraInfoA100 Tags + +Camera information for the Sony DSLR-A100. + + Index1 Tag Name Writable + ------ -------- -------- + 1 AFSensorActive int8u + 2 AFStatusActiveSensor int16s + 4 AFStatusTop-right int16s + 6 AFStatusBottom-right int16s + 8 AFStatusBottom int16s + 10 AFStatusMiddleHorizontal int16s + 12 AFStatusCenterVertical int16s + 14 AFStatusTop int16s + 16 AFStatusTop-left int16s + 18 AFStatusBottom-left int16s + 20 FocusLocked int8u + 21 AFPoint int8u + 22 AFMode int8u + 45 AFStatusLeft int16s + 47 AFStatusCenterHorizontal int16s + 49 AFStatusRight int16s + 51 AFAreaMode int8u + +=head3 Minolta ISInfoA100 Tags + +Image stabilization information for the Sony DSLR-A100. + + Index1 Tag Name Writable + ------ -------- -------- + 0 ImageStabilization int16u + +=head3 Minolta WBInfoA100 Tags + +White balance information for the Sony DSLR-A100. + + Index1 Tag Name Writable + ------ -------- -------- + 14 DriveMode int8u + 16 Rotation int8u + 20 ImageStabilizationSetting int8u + 21 DynamicRangeOptimizerMode int8u + 42 ExposureCompensationMode int8u + 43 WBBracketShotNumber int8u + 44 WhiteBalanceBracketing int8u + 45 ExposureBracketShotNumber int8u + 49 FlashFunction int16u + 52 ExposureMode int16u + 54 ColorMode int16u + 56 AverageLV int16u + 60 FrameNumber int8u + 150 WB_RGBLevels int16u[3] + 174 WB_GBRGLevels int16u[4] + 192 WB_RedLevelsTungsten int16u[7] + 206 WB_BlueLevelsTungsten int16u[7] + 220 WB_RedLevelsDaylight int16u[7] + 234 WB_BlueLevelsDaylight int16u[7] + 248 WB_RedLevelsCloudy int16u[7] + 262 WB_BlueLevelsCloudy int16u[7] + 276 WB_RedLevelsFlash int16u[7] + 290 WB_BlueLevelsFlash int16u[7] + 332 WB_RedLevelsFluorescent int16u[7] + 346 WB_BlueLevelsFluorescent int16u[7] + 360 WB_RedLevelsShade int16u[7] + 374 WB_BlueLevelsShade int16u[7] + 392 WB_RedLevel6500K int16u + 394 WB_BlueLevel6500K int16u + 396 WB_RedLevelCustom int16u + 398 WB_BlueLevelCustom int16u + 408 WB_RedLevel3500K int16u + 410 WB_BlueLevel3500K int16u + 446 WB_RedLevelsKelvin int16u[75] + 596 WB_BlueLevelsKelvin int16u[75] + 772 WB_RBLevelsFlash int16u[2] + 776 WB_RBLevelsCoolWhiteF int16u[2] + 1000 WB_RBLevelsTungsten int16u[2] + 1004 WB_RBLevelsDaylight int16u[2] + 1008 WB_RBLevelsCloudy int16u[2] + 1012 WB_RBLevelsFlash int16u[2] + 1020 WB_RedLevelsFluorescent int16u[7] + 1034 WB_BlueLevelsFluorescent int16u[7] + 1048 WB_RBLevelsShade int16u[2] + 1056 WB_RBLevels6500K int16u[2] + 1060 WB_RBLevelsCustom int16u[2] + 1072 WB_RBLevels3500K int16u[2] + 1320 WB_RBLevelsDaylight int16u[2] + 1350 WB_RGBLevels int16u[3] + 1576 AEMeteringSegments int8u[40] + 1680 MeasuredLV int8u + 1681 BrightnessValue int8u + 4172 TiffMeteringImage no + 18872 ExposureTime int8u + 18874 ISO int8u + 18875 FocusDistance int8u + 18877 LensType int16uRev + 18880 ExposureCompensation int8s + 18881 FlashExposureComp int8s + 18882 ImageStabilization int8u + 18883 BrightnessValue int8u + 18885 MaxAperture int8u + 18887 FNumber int8u + 18908 InternalSerialNumber string[12] + +=head3 Minolta CameraSettings5D Tags + + Index2 Tag Name Writable + ------ -------- -------- + 10 ExposureMode int16u + 12 MinoltaImageSize int16u + 13 MinoltaQuality int16u + 14 WhiteBalance int16u + 31 Flash int16u + 32 FlashMode int16u + 37 MeteringMode int16u + 38 ISOSetting int16u + 47 ColorSpace int16u + 48 Sharpness int16u + 49 Contrast int16u + 50 Saturation int16u + 53 ExposureTime int16u + 54 FNumber int16u + 55 FreeMemoryCardImages int16u + 73 ColorTemperature int16s + 74 HueAdjustment int16u + 80 Rotation int16u + 83 ExposureCompensation int16u + 84 FreeMemoryCardImages int16u + 101 Rotation int16u + 110 ColorTemperature int16s + 113 PictureFinish int16u + 174 ImageNumber int16u + 176 NoiseReduction int16u + 189 ImageStabilization int16u + +=head3 Minolta CameraSettingsA100 Tags + +Camera settings information for the Sony DSLR-A100. + + Index2 Tag Name Writable + ------ -------- -------- + 0 ExposureMode int16u + 1 ExposureCompensationSetting int16u + 5 HighSpeedSync int16u + 6 ShutterSpeedSetting int16u + 7 ApertureSetting int16u + 8 ExposureTime int16u + 9 FNumber int16u + 10 DriveMode2 int16u + 11 WhiteBalance int16u + 12 FocusMode int16u + 13 AFPointSelected int16u + 14 AFAreaMode int16u + 15 FlashMode int16u + 16 FlashExposureCompSet int16u + 18 MeteringMode int16u + 19 ISOSetting int16u + 20 ZoneMatchingMode int16u + 21 DynamicRangeOptimizer int16u + 22 ColorMode int16u + 23 ColorSpace int16u + 24 Sharpness int16u + 25 Contrast int16u + 26 Saturation int16u + 28 FlashMetering int16u + 29 PrioritySetupShutterRelease int16u + 30 DriveMode int16u + 31 SelfTimerTime int16u + 32 ContinuousBracketing int16u + 33 SingleFrameBracketing int16u + 34 WhiteBalanceBracketing int16u + 35 WhiteBalanceSetting int16u + 36 PresetWhiteBalance int16u + 37 ColorTemperatureSetting int16u + 38 CustomWBSetting int16u + 39 DynamicRangeOptimizerSetting int16u + 50 FreeMemoryCardImages int16u + 52 CustomWBRedLevel int16u + 53 CustomWBGreenLevel int16u + 54 CustomWBBlueLevel int16u + 55 CustomWBError int16u + 56 WhiteBalanceFineTune int16s + 57 ColorTemperature int16u + 58 ColorCompensationFilter int16s + 59 SonyImageSize int16u + 60 SonyQuality int16u + 61 InstantPlaybackTime int16u + 62 InstantPlaybackSetup int16u + 63 NoiseReduction int16u + 64 EyeStartAF int16u + 65 RedEyeReduction int16u + 66 FlashDefault int16u + 67 AutoBracketOrder int16u + 68 FocusHoldButton int16u + 69 AELButton int16u + 70 ControlDialSet int16u + 71 ExposureCompensationMode int16u + 72 AFAssist int16u + 73 CardShutterLock int16u + 74 LensShutterLock int16u + 75 AFAreaIllumination int16u + 76 MonitorDisplayOff int16u + 77 RecordDisplay int16u + 78 PlayDisplay int16u + 80 ExposureIndicator int16u + 81 AELExposureIndicator int16u + 82 ExposureBracketingIndicatorLast int16u + 83 MeteringOffScaleIndicator int16u + 84 FlashExposureIndicator int16u + 85 FlashExposureIndicatorNext int16u + 86 FlashExposureIndicatorLast int16u + 87 ImageStabilization int16u + 88 FocusModeSwitch int16u + 89 FlashType int16u + 90 Rotation int16u + 91 AELock int16u + 94 ColorTemperature int16u + 95 ColorCompensationFilter int16s + 96 BatteryState int16u + +=head3 Minolta MMA Tags + +This information is found in MOV videos from Minolta models such as the +DiMAGE A2, S414 and 7Hi. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 20 SoftwareVersion no + +=head3 Minolta MOV1 Tags + +This information is found in MOV videos from some Konica Minolta models such +as the DiMage Z10 and X50. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 32 ModelType no + 46 ExposureTime no + 50 FNumber no + 58 ExposureCompensation no + 80 FocalLength no + +=head3 Minolta MOV2 Tags + +This information is found in MOV videos from some Minolta models such as the +DiMAGE X and Xt. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 24 ModelType no + 38 ExposureTime no + 42 FNumber no + 50 ExposureCompensation no + 72 FocalLength no + +=head2 Motorola Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x5500 BuildNumber string + 0x5501 SerialNumber string + 0x6420 CustomRendered string + 0x64d0 DriveMode string + 0x665e Sensor string + 0x6705 ManufactureDate string + +=head2 Nikon Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 MakerNoteVersion undef[4] + 0x0002 ISO int16u[2] + 0x0003 ColorMode string + 0x0004 Quality string + 0x0005 WhiteBalance string + 0x0006 Sharpness string + 0x0007 FocusMode string + 0x0008 FlashSetting string + 0x0009 FlashType string + 0x000b WhiteBalanceFineTune int16s[n] + 0x000c WB_RBLevels rational64u[4] + 0x000d ProgramShift undef[4] + 0x000e ExposureDifference undef[4] + 0x000f ISOSelection string + 0x0010 DataDump no + 0x0011 PreviewIFD Nikon PreviewIFD + 0x0012 FlashExposureComp undef[4] + 0x0013 ISOSetting int16u[2] + 0x0014 ColorBalanceA Nikon ColorBalanceA + NRWData Nikon ColorBalanceB + Nikon ColorBalanceC + 0x0016 ImageBoundary int16u[4] + 0x0017 ExternalFlashExposureComp undef[4] + 0x0018 FlashExposureBracketValue undef[4] + 0x0019 ExposureBracketValue rational64s + 0x001a ImageProcessing string + 0x001b CropHiSpeed int16u[7] + 0x001c ExposureTuning undef[3] + 0x001d SerialNumber string! + 0x001e ColorSpace int16u + 0x001f VRInfo Nikon VRInfo + 0x0020 ImageAuthentication int8u + 0x0021 FaceDetect Nikon FaceDetect + 0x0022 ActiveD-Lighting int16u + 0x0023 PictureControlData Nikon PictureControl + Nikon PictureControl2 + Nikon PictureControl3 + Nikon PictureControlUnknown + 0x0024 WorldTime Nikon WorldTime + 0x0025 ISOInfo Nikon ISOInfo + 0x002a VignetteControl int16u + 0x002b DistortInfo Nikon DistortInfo + 0x002c UnknownInfo Nikon UnknownInfo + 0x0032 UnknownInfo2 Nikon UnknownInfo2 + 0x0034 ShutterMode int16u + 0x0035 HDRInfo Nikon HDRInfo + 0x0037 MechanicalShutterCount int32u + 0x0039 LocationInfo Nikon LocationInfo + 0x003d BlackLevel int16u[4] + 0x003e ImageSizeRAW yes + 0x0045 CropArea int16u[4] + 0x004e NikonSettings NikonSettings + 0x004f ColorTemperatureAuto int16u + 0x0080 ImageAdjustment string + 0x0081 ToneComp string + 0x0082 AuxiliaryLens string + 0x0083 LensType int8u + 0x0084 Lens rational64u[4] + 0x0085 ManualFocusDistance rational64u + 0x0086 DigitalZoom rational64u + 0x0087 FlashMode int8u + 0x0088 AFInfo Nikon AFInfo + Nikon AFInfo + 0x0089 ShootingMode int16u~ + 0x008b LensFStops undef[4] + 0x008c ContrastCurve undef! + 0x008d ColorHue string + 0x008f SceneMode string + 0x0090 LightSource string + 0x0091 ShotInfoD40 Nikon ShotInfoD40 + ShotInfoD80 Nikon ShotInfoD80 + ShotInfoD90 Nikon ShotInfoD90 + ShotInfoD3a Nikon ShotInfoD3a + ShotInfoD3b Nikon ShotInfoD3b + ShotInfoD3X Nikon ShotInfoD3X + ShotInfoD3S Nikon ShotInfoD3S + ShotInfoD300a Nikon ShotInfoD300a + ShotInfoD300b Nikon ShotInfoD300b + ShotInfoD300S Nikon ShotInfoD300S + ShotInfoD700 Nikon ShotInfoD700 + ShotInfoD800 Nikon ShotInfoD800 + ShotInfoD810 Nikon ShotInfoD810 + ShotInfoD850 Nikon ShotInfoD850 + ShotInfoD5000 Nikon ShotInfoD5000 + ShotInfoD5100 Nikon ShotInfoD5100 + ShotInfoD5200 Nikon ShotInfoD5200 + ShotInfoD7000 Nikon ShotInfoD7000 + ShotInfoD4 Nikon ShotInfoD4 + ShotInfoD4S Nikon ShotInfoD4S + ShotInfoD5 Nikon ShotInfoD500 + ShotInfoD500 Nikon ShotInfoD500 + ShotInfoD6 Nikon ShotInfoD6 + ShotInfoD610 Nikon ShotInfoD610 + ShotInfoZ7II Nikon ShotInfoZ7II + ShotInfoZ9 Nikon ShotInfoZ9 + ShotInfo02xx Nikon ShotInfo + ShotInfoUnknown Nikon ShotInfo + 0x0092 HueAdjustment int16s + 0x0093 NEFCompression int16u + 0x0094 SaturationAdj int16s + 0x0095 NoiseReduction string + 0x0096 NEFLinearizationTable undef! + 0x0097 ColorBalance0100 Nikon ColorBalance1 + ColorBalance0102 Nikon ColorBalance2 + ColorBalance0103 Nikon ColorBalance3 + ColorBalance0205 Nikon ColorBalance2 + ColorBalance0209 Nikon ColorBalance4 + ColorBalance02 Nikon ColorBalance2 + ColorBalance0211 Nikon ColorBalance4 + ColorBalance0213 Nikon ColorBalance2 + ColorBalance0215 Nikon ColorBalance4 + ColorBalanceUnknown02 Nikon ColorBalanceUnknown + ColorBalanceUnknown04 Nikon ColorBalanceUnknown + ColorBalanceUnknown Nikon ColorBalanceUnknown + 0x0098 LensData0100 Nikon LensData00 + LensData0101 Nikon LensData01 + LensData0201 Nikon LensData01 + LensData0204 Nikon LensData0204 + LensData0400 Nikon LensData0400 + LensData0402 Nikon LensData0402 + LensData0403 Nikon LensData0403 + LensData0800 Nikon LensData0800 + LensDataUnknown Nikon LensDataUnknown + 0x0099 RawImageCenter int16u[2] + 0x009a SensorPixelSize rational64u[2] + 0x009c SceneAssist string + 0x009d DateStampMode int16u + 0x009e RetouchHistory int16u[10] + 0x00a0 SerialNumber string + 0x00a2 ImageDataSize int32u + 0x00a5 ImageCount int32u + 0x00a6 DeletedImageCount int32u + 0x00a7 ShutterCount int32u! + 0x00a8 FlashInfo0100 Nikon FlashInfo0100 + FlashInfo0102 Nikon FlashInfo0102 + FlashInfo0103 Nikon FlashInfo0103 + FlashInfo0106 Nikon FlashInfo0106 + FlashInfo0107 Nikon FlashInfo0107 + FlashInfo0300 Nikon FlashInfo0300 + FlashInfoUnknown Nikon FlashInfoUnknown + 0x00a9 ImageOptimization string + 0x00aa Saturation string + 0x00ab VariProgram string + 0x00ac ImageStabilization string + 0x00ad AFResponse string + 0x00b0 MultiExposure Nikon MultiExposure + Nikon MultiExposure + 0x00b1 HighISONoiseReduction int16u + 0x00b3 ToningEffect string + 0x00b6 PowerUpTime undef + 0x00b7 AFInfo2 Nikon AFInfo2V0400 + Nikon AFInfo2 + 0x00b8 FileInfo Nikon FileInfo + Nikon FileInfo + 0x00b9 AFTune Nikon AFTune + 0x00bb RetouchInfo Nikon RetouchInfo + 0x00bd PictureControlData Nikon PictureControl + 0x00bf SilentPhotography yes + 0x00c3 BarometerInfo Nikon BarometerInfo + 0x0e00 PrintIM PrintIM + 0x0e01 NikonCaptureData NikonCapture + 0x0e09 NikonCaptureVersion string^ + 0x0e0e NikonCaptureOffsets Nikon CaptureOffsets + 0x0e10 NikonScanIFD Nikon Scan + 0x0e13 NikonCaptureEditVersions NikonCapture + NikonCaptureEditVersions undef!^ + 0x0e1d NikonICCProfile ICC_Profile + 0x0e1e NikonCaptureOutput Nikon CaptureOutput + 0x0e22 NEFBitDepth int16u[4]! + +=head3 Nikon ast Tags + +Tags used by Nikon NX Studio in Nikon NKSC sidecar files and trailers. + +These tags belong to the ExifTool XMP-ast family 1 group. + + Tag Name Writable + -------- -------- + About no + GPSAltitude no + GPSAltitudeRef no + GPSImgDirection no + GPSImgDirectionRef no + GPSLatitude no + GPSLatitudeRef no + GPSLongitude no + GPSLongitudeRef no + GPSMapDatum no + GPSVersionID no + IPTC IPTC + Version no + XMLPackets XMP + +=head3 Nikon nine Tags + +These tags belong to the ExifTool XMP-nine family 1 group. + + Tag Name Writable + -------- -------- + About no + Label no + NineEdits Nikon NineEdits + Rating no + Trim no + Version no + +=head3 Nikon NineEdits Tags + +XML-based tags used to store editing information. + + Tag Name Writable + -------- -------- + FilterParametersBinary no + FilterParametersCustomCustomData no + FilterParametersExportExportData no + +=head3 Nikon sdc Tags + +These tags belong to the ExifTool XMP-sdc family 1 group. + + Tag Name Writable + -------- -------- + About no + AppName no + AppVersion no + Version no + +=head3 Nikon PreviewIFD Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x00fe SubfileType no + 0x0103 Compression no + 0x011a XResolution no + 0x011b YResolution no + 0x0128 ResolutionUnit no + 0x0201 PreviewImageStart int32u* + 0x0202 PreviewImageLength int32u* + 0x0213 YCbCrPositioning no + +=head3 Nikon ColorBalanceA Tags + + Index2 Tag Name Writable + ------ -------- -------- + 624 WB_RBLevels int16u[2]! + 626 WB_RBLevelsAuto int16u[2]! + 628 WB_RBLevelsDaylight int16u[14]! + 642 WB_RBLevelsIncandescent int16u[14]! + 656 WB_RBLevelsFluorescent int16u[6]! + 662 WB_RBLevelsCloudy int16u[14]! + 676 WB_RBLevelsFlash int16u[14]! + 690 WB_RBLevelsShade int16u[14]! + +=head3 Nikon ColorBalanceB Tags + +Color balance tags used by the P6000. + + Index1 Tag Name Writable + ------ -------- -------- + 4 ColorBalanceVersion undef[4] + 5096 WB_RGGBLevels int32u[4]! + 5112 WB_RGGBLevelsDaylight int32u[4]! + 5128 WB_RGGBLevelsCloudy int32u[4]! + 5160 WB_RGGBLevelsTungsten int32u[4]! + 5176 WB_RGGBLevelsFluorescentW int32u[4]! + 5192 WB_RGGBLevelsFlash int32u[4]! + 5224 WB_RGGBLevelsCustom int32u[4]! + 5240 WB_RGGBLevelsAuto int32u[4]! + +=head3 Nikon ColorBalanceC Tags + +Color balance tags used by the P1000, P7000, P7100 and B700. + + Index1 Tag Name Writable + ------ -------- -------- + 4 ColorBalanceVersion undef[4] + 32 BlackLevel int16u + 56 WB_RGGBLevels int32u[4]! + 76 WB_RGGBLevelsDaylight int32u[4]! + 96 WB_RGGBLevelsCloudy int32u[4]! + 116 WB_RGGBLevelsShade int32u[4]! + 136 WB_RGGBLevelsTungsten int32u[4]! + 156 WB_RGGBLevelsFluorescentW int32u[4]! + 176 WB_RGGBLevelsFluorescentN int32u[4]! + 196 WB_RGGBLevelsFluorescentD int32u[4]! + 216 WB_RGGBLevelsHTMercury int32u[4]! + 256 WB_RGGBLevelsCustom int32u[4]! + 276 WB_RGGBLevelsAuto int32u[4]! + +=head3 Nikon VRInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 VRInfoVersion no + 4 VibrationReduction int8u + 6 VRMode int8u + +=head3 Nikon FaceDetect Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 FaceDetectFrameSize int16u[2] + 3 FacesDetected int16u + 4 Face1Position int16u[4] + 8 Face2Position int16u[4] + 12 Face3Position int16u[4] + 16 Face4Position int16u[4] + 20 Face5Position int16u[4] + 24 Face6Position int16u[4] + 28 Face7Position int16u[4] + 32 Face8Position int16u[4] + 36 Face9Position int16u[4] + 40 Face10Position int16u[4] + 44 Face11Position int16u[4] + 48 Face12Position int16u[4] + +=head3 Nikon PictureControl Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 PictureControlVersion no + 4 PictureControlName string[20] + 24 PictureControlBase string[20] + 48 PictureControlAdjust int8u + 49 PictureControlQuickAdjust int8u + 50 Sharpness int8u + 51 Contrast int8u + 52 Brightness int8u + 53 Saturation int8u + 54 HueAdjustment int8u + 55 FilterEffect int8u + 56 ToningEffect int8u + 57 ToningSaturation int8u + +=head3 Nikon PictureControl2 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 PictureControlVersion no + 4 PictureControlName string[20] + 24 PictureControlBase string[20] + 48 PictureControlAdjust int8u + 49 PictureControlQuickAdjust int8u + 51 Sharpness int8u + 53 Clarity int8u + 55 Contrast int8u + 57 Brightness int8u + 59 Saturation int8u + 61 Hue int8u + 63 FilterEffect int8u + 64 ToningEffect int8u + 65 ToningSaturation int8u + +=head3 Nikon PictureControl3 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 PictureControlVersion no + 8 PictureControlName string[20] + 28 PictureControlBase string[20] + 54 PictureControlAdjust int8u + 55 PictureControlQuickAdjust int8u + 57 Sharpness int8u + 59 MidRangeSharpness int8u + 61 Clarity int8u + 63 Contrast int8u + 65 Brightness int8u + 67 Saturation int8u + 69 Hue int8u + 71 FilterEffect int8u + 72 ToningEffect int8u + 73 ToningSaturation int8u + +=head3 Nikon PictureControlUnknown Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 PictureControlVersion no + +=head3 Nikon WorldTime Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 TimeZone int16s + 2 DaylightSavings int8u + 3 DateDisplayFormat int8u + +=head3 Nikon ISOInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ISO int8u + 4 ISOExpansion int16u + 6 ISO2 int8u + 10 ISOExpansion2 int16u + +=head3 Nikon DistortInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 DistortionVersion? no + 4 AutoDistortionControl int8u + +=head3 Nikon UnknownInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 UnknownInfoVersion? no + +=head3 Nikon UnknownInfo2 Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 UnknownInfo2Version? no + +=head3 Nikon HDRInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 HDRInfoVersion string[4] + 4 HDR int8u + 5 HDRLevel int8u + 6 HDRSmoothing int8u + 7 HDRLevel2 int8u + +=head3 Nikon LocationInfo Tags + +Tags written by some Nikon GPS-equipped cameras like the AW100. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LocationInfoVersion undef[4] + 4 TextEncoding int8u + 5 CountryCode undef[3] + 8 POILevel int8u + 9 Location undef[70] + +=head3 Nikon MakerNotes0x51 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 FirmwareVersion no + 10 NEFCompression int16u[0.5] + +=head3 Nikon AFInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 AFAreaMode int8u + 1 AFPoint int8u + 2 AFPointsInFocus int16u + +=head3 Nikon ShotInfoD40 Tags + +These tags are extracted from encrypted data in D40 and D40X images. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 582 ShutterCount int32u + 586.1 VibrationReduction int8u & 0x08 + 729 CustomSettingsD40 NikonCustom SettingsD40 + +=head3 Nikon ShotInfoD80 Tags + +These tags are extracted from encrypted data in D80 images. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 586 ShutterCount int32u + 590.1 Rotation int8u & 0x07 + 590.2 VibrationReduction int8u & 0x18 + 590.3 FlashFired int8u & 0xe0 + 708 NikonImageSize int8u & 0xf0 + 708.1 ImageQuality int8u & 0x0f + 748 CustomSettingsD80 NikonCustom SettingsD80 + +=head3 Nikon ShotInfoD90 Tags + +These tags are extracted from encrypted data in images from the D90 with +firmware 1.00. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 693 ISO2 int8u + 725 ShutterCount int32u + 884 CustomSettingsD90 NikonCustom SettingsD90 + +=head3 Nikon ShotInfoD3a Tags + +These tags are extracted from encrypted data in images from the D3 with +firmware 1.00 and earlier. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 598 ISO2 int8u + 630 ShutterCount int32u + 723.1 NikonImageSize int8u & 0x18 + 723.2 ImageQuality int8u & 0x07 + 769 CustomSettingsD3 NikonCustom SettingsD3 + +=head3 Nikon ShotInfoD3b Tags + +These tags are extracted from encrypted data in images from the D3 with +firmware 1.10, 2.00, 2.01 and 2.02. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 16 ImageArea int8u + 605 ISO2 int8u + 637 ShutterCount int32u + 639 ShutterCount int32u + 650 PreFlashReturnStrength int8u + 732.1 NikonImageSize int8u & 0x18 + 732.2 ImageQuality int8u & 0x07 + 778 CustomSettingsD3 NikonCustom SettingsD3 + +=head3 Nikon ShotInfoD3X Tags + +These tags are extracted from encrypted data in images from the D3X with +firmware 1.00. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 605 ISO2 int8u + 640 ShutterCount int32u + 779 CustomSettingsD3X NikonCustom SettingsD3 + +=head3 Nikon ShotInfoD3S Tags + +These tags are extracted from encrypted data in images from the D3S with +firmware 1.00 and earlier. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 16 ImageArea int8u + 545 ISO2 int8u + 578 ShutterCount int32u + 718 CustomSettingsD3S NikonCustom SettingsD3 + +=head3 Nikon ShotInfoD300a Tags + +These tags are extracted from encrypted data in images from the D300 with +firmware 1.00 and earlier. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 604 ISO2 int8u + 633 ShutterCount int32u + 721 AFFineTuneAdj int16u + 790 CustomSettingsD300 NikonCustom SettingsD3 + +=head3 Nikon ShotInfoD300b Tags + +These tags are extracted from encrypted data in images from the D300 with +firmware 1.10. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 613 ISO2 int8u + 644 ShutterCount int32u + 732 AFFineTuneAdj int16u + 802 CustomSettingsD300 NikonCustom SettingsD3 + +=head3 Nikon ShotInfoD300S Tags + +These tags are extracted from encrypted data in images from the D300S with +firmware 1.00. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 613 ISO2 int8u + 646 ShutterCount int32u + 804 CustomSettingsD300S NikonCustom SettingsD3 + +=head3 Nikon ShotInfoD700 Tags + +These tags are extracted from encrypted data in images from the D700 with +firmware 1.02f. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 613 ISO2 int8u + 647 ShutterCount int32u + 804 CustomSettingsD700 NikonCustom SettingsD700 + +=head3 Nikon ShotInfoD800 Tags + +These tags are extracted from encrypted data in images from the D800. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 1216 RepeatingFlashOutputExternal int8u + 1218 RepeatingFlashRateExternal int8u + 1219 RepeatingFlashCountExternal int8u + 1234 FlashExposureComp2 int8s + 1242 RepeatingFlashRateBuilt-in int8u + 1243 RepeatingFlashCountBuilt-in int8u + 1308 SequenceNumber int8u + 1531 ShutterCount int32u + 1772 CustomSettingsD800 NikonCustom SettingsD800 + +=head3 Nikon ShotInfoD810 Tags + +These tags are extracted from encrypted data in images from the D810. Note +that the indices listed below are for firmware version 1.0, but they may be +different for other firmware versions. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 464 SecondarySlotFunction int8u & 0x03 + 5974 AEBracketingSteps int8u & 0xff + 5975 WBBracketingSteps int8u & 0xff + 5982 NikonMeteringMode int8u & 0x03 + 6236 ISOAutoShutterTime int8u & 0x3f + 6237 ISOAutoHiLimit int8u & 0xff + 6315 CustomSettingsD810 NikonCustom SettingsD810 + 14068 RollAngle fixed32u + 14072 PitchAngle fixed32u + 14076 YawAngle fixed32u + +=head3 Nikon ShotInfoD850 Tags + +These tags are extracted from encrypted data in images from the D850. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 1937 PhotoShootingMenuBankImageArea int8u & 0x07 + 4029 PhotoShootingMenuBank int8u & 0x03 + 4031 PrimarySlot int8u & 0x80 + 4152 CustomSettingsD850 NikonCustom SettingsD850 + 12027 RollAngle fixed32u + 12031 PitchAngle fixed32u + 12035 YawAngle fixed32u + +=head3 Nikon ShotInfoD5000 Tags + +These tags are extracted from encrypted data in images from the D5000 with +firmware 1.00. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 693 ISO2 int8u + 726 ShutterCount int32u + 888 CustomSettingsD5000 NikonCustom SettingsD5000 + +=head3 Nikon ShotInfoD5100 Tags + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 801 ShutterCount int32u + 1031 CustomSettingsD5100 NikonCustom SettingsD5100 + +=head3 Nikon ShotInfoD5200 Tags + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 3032 ShutterCount int32u + 3285 CustomSettingsD5200 NikonCustom SettingsD5200 + +=head3 Nikon ShotInfoD7000 Tags + +These tags are extracted from encrypted data in images from the D7000 with +firmware 1.01b. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 800 ShutterCount int32u + 1028 CustomSettingsD7000 NikonCustom SettingsD7000 + +=head3 Nikon ShotInfoD4 Tags + +These tags are extracted from encrypted data in images from the D4. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 1873 CustomSettingsD4 NikonCustom SettingsD4 + +=head3 Nikon ShotInfoD4S Tags + +These tags are extracted from encrypted data in images from the D4S. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 464 SecondarySlotFunction int8u & 0x03 + 5964 AEBracketingSteps int8u & 0xff + 5965 WBBracketingSteps int8u & 0xff + 6221 ReleaseMode int8u & 0xff + 6301 CustomSettingsD4S NikonCustom SettingsD4 + 6338 MultiSelectorLiveViewMode int8u & 0xc0 + 6378 ISOAutoShutterTime int8u & 0x3f + 6379 ISOAutoHiLimit int8u & 0xff + 6461 CustomSettingsD4S NikonCustom SettingsD4 + 13579 RollAngle fixed32u + 13583 PitchAngle fixed32u + 13587 YawAngle fixed32u + 13971 Rotation int8u & 0x30 + +=head3 Nikon ShotInfoD500 Tags + +These tags are extracted from encrypted data in images from the D5 and D500. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 202 Rotation int8u & 0x03 + 208 Interval int8u~ + 212 IntervalFrame int8u~ + 1506 FlickerReductionIndicator int8u & 0x01 + 2004 JPGCompression int8u & 0x01 + 2171 AEBracketingSteps int8u & 0xff + 2172 WBBracketingSteps int8u & 0xff + 2179 ADLBracketingStep int8u & 0xf0 + 2180 ADLBracketingType int8u & 0x0f + 3709 PhotoShootingMenuBank int8u & 0x03 + 3711 PrimarySlot int8u & 0x80 + 3713 ISOAutoShutterTime int8u & 0x3f + 3714 ISOAutoHiLimit int8u & 0xff + 3716 FlickerReduction int8u & 0x20 + 3716.1 PhotoShootingMenuBankImageArea int8u & 0x07 + 3819 CustomSettingsD5 NikonCustom SettingsD5 + CustomSettingsD500 NikonCustom SettingsD500 + 11300 RollAngle fixed32u + 11304 PitchAngle fixed32u + 11308 YawAngle fixed32u + 11940 NikonMeteringMode int8u & 0x03 + +=head3 Nikon ShotInfoD6 Tags + +These tags are extracted from encrypted data in images from the D6. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 30220 IntervalShooting int16u~ + 49690 RollAngle fixed32u + 49694 PitchAngle fixed32u + 49698 YawAngle fixed32u + 50190 Intervals int32u + 50194 ShotsPerInterval int32u + 50198 IntervalExposureSmoothing int8u + 50200 IntervalPriority int8u + 50234 FocusShiftNumberShots int8u + 50238 FocusShiftStepWidth int8u + 50242 FocusShiftInterval int8u~ + 50246 FocusShiftExposureLock int8u + 50336 DiffractionCompensation int8u + 50342 FlashControlMode int8u + 50348 FlashGNDistance? no + 50352 FlashOutput? int8u + 50362 FlashRemoteControl? int8u + 50366 FlashMasterControlMode int8u + 50368 FlashMasterCompensation? int8s + 50372 FlashMasterOutput? int8u + 50374 FlashWirelessOption? int8u + 50524 MovieType? int8u + +=head3 Nikon ShotInfoD610 Tags + +These tags are extracted from encrypted data in images from the D610. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 1999 CustomSettingsD610 NikonCustom SettingsD610 + +=head3 Nikon ShotInfoZ7II Tags + +These tags are extracted from encrypted data in images from the Z7II. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 30220 IntervalShooting int16u~ + 32672 PortraitImpressionBalance int8u[2]~ + 52786 RollAngle fixed32u + 52790 PitchAngle fixed32u + 52794 YawAngle fixed32u + 52918 MenuSettingsZ7IIOffset int8u + 52920 MenuSettingsZ7II Nikon MenuSettingsZ7II + +=head3 Nikon MenuSettingsZ7II Tags + +These tags are used by the Z5, Z6, Z7, Z6II, Z7II, Z50 and Zfc. + + Index1 Tag Name Writable + ------ -------- -------- + 160 IntervalDurationHours int32u + 164 IntervalDurationMinutes int32u + 168 IntervalDurationSeconds int32u + 176 Intervals int32u + 180 ShotsPerInterval int32u + 184 IntervalExposureSmoothing int8u + 186 IntervalPriority int8u + 220 FocusShiftNumberShots int8u + 224 FocusShiftStepWidth int8u + 228 FocusShiftInterval int8u~ + 232 FocusShiftExposureLock int8u + 322 DiffractionCompensation int8u + 323 AutoDistortionControl int8u + 326 NikonMeteringMode int8u + 328 FlashControlMode int8u + 334 FlashGNDistance? no + 338 FlashOutput? int8u + 346 FlashWirelessOption? int8u + 348 FlashRemoteControl? int8u + 352 FlashMasterControlMode int8u + 354 FlashMasterCompensation? int8s + 358 FlashMasterOutput? int8u + 502 MovieFrameSize? int8u + 504 MovieFrameRate? int8u + 506 MovieSlowMotion? int8u + 510 MovieType? int8u + 516 MovieISOAutoManualMode? int16u + 568 MovieActiveD-Lighting? int8u + 572 MovieHighISONoiseReduction? int8u + 574 MovieVignetteControl? int8u + 576 MovieVignetteControlSameAsPhoto? int8u + 577 MovieDiffractionCompensation? int8u + 578 MovieAutoDistortionControl? int8u + 584 MovieFocusMode? int8u + 590 MovieVibrationReduction? int8u + 591 MovieVibrationReductionSameAsPhoto? int8u + 858 HDMIOutputN-Log? int8u + +=head3 Nikon ShotInfoZ9 Tags + +These tags are extracted from encrypted data in images from the Z9. + + Index Tag Name Writable + ----- -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 27800 IntervalShooting int16u~ + 30788 FocusShiftShooting int8u~ + 60139 RollAngle fixed32u + 60143 PitchAngle fixed32u + 60147 YawAngle fixed32u + 60491 MenuSettingsZ9 Nikon MenuSettingsZ9 + +=head3 Nikon MenuSettingsZ9 Tags + +These tags are used by the Z9. + + Index1 Tag Name Writable + ------ -------- -------- + 140 MultipleExposureMode int8u + 142 MultiExposureShots int8u + 188 Intervals int32u + 192 ShotsPerInterval int32u + 232 FocusShiftNumberShots int8u + 236 FocusShiftStepWidth int8u + 240 FocusShiftInterval int8u~ + 244 FocusShiftExposureLock? int8u + 274 PhotoShootingMenuBank int8u + 276 ExtendedMenuBanks int8u + 308 PhotoShootingMenuBankImageArea int8u + 322 AutoISO int8u + 324 ISOAutoHiLimit? int16u + 326 ISOAutoFlashLimit? int16u + 334 ISOAutoShutterTime no + 416 MovieVignetteControl? int8u + 418 DiffractionCompensation int8u + 420 FlickerReductionShooting int8u + 424 FlashControlMode int8u + 426 FlashMasterCompensation? int8s + 430 FlashGNDistance? no + 434 FlashOutput? int8u + 444 FlashRemoteControl? int8u + 456 FlashWirelessOption? int8u + 528 AFAreaMode int8u + 530 VRMode int8u + 534 BracketSet int8u + 536 BracketProgram int8u + 538 BracketIncrement int8u + 556 SecondarySlotFunction int8u + 572 DXCropAlert int8u + 574 SubjectDetection int8u + 604 MovieImageArea? int8u & 0x01 + 614 MovieType? int8u + 616 MovieISOAutoHiLimit? int16u + 618 MovieISOAutoControlManualMode? int8u + 620 MovieISOAutoManualMode? int16u + 696 MovieActiveD-Lighting? int8u + 698 MovieHighISONoiseReduction? int8u + 704 MovieFlickerReduction int8u + 706 MovieMeteringMode? int8u + 708 MovieFocusMode? int8u + 710 MovieAFAreaMode int8u + 712 MovieVRMode? int8u + 716 MovieElectronicVR? int8u + 718 MovieSoundRecording? int8u + 720 MicrophoneSensitivity? int8u + 722 MicrophoneAttenuator? int8u + 724 MicrophoneFrequencyResponse? int8u + 726 WindNoiseReduction? int8u + 748 MovieToneMap? int8u + 754 MovieFrameSize? int8u + 756 MovieFrameRate? int8u + 762 MicrophoneJackPower? int8u + 763 MovieDXCropAlert? int8u + 764 MovieSubjectDetection? int8u + 799 CustomSettingsZ9 NikonCustom SettingsZ9 + 1426 Language? int8u + 1428 TimeZone int8u + 1434 MonitorBrightness? no + 1456 AFFineTune? int8u + 1552 HDMIOutputResolution int8u + 1565 SetClockFromLocationData? int8u + 1572 AirplaneMode? int8u + 1573 EmptySlotRelease? int8u + 1608 EnergySavingMode? int8u + 1632 RecordLocationData? int8u + 1636 USBPowerDelivery? int8u + 1645 SensorShield? int8u + +=head3 Nikon ShotInfo Tags + +This information is encrypted for ShotInfoVersion 02xx, and some tags are +only valid for specific models. + + Index1 Tag Name Writable + ------ -------- -------- + 0 ShotInfoVersion no + 4 FirmwareVersion no + 16 DistortionControl int8u + 102 VR_0x66? int8u + 106 ShutterCount int32u + 110 DeletedImageCount int32u + 117 VibrationReduction int8u + 130 VibrationReduction int8u + 343 ShutterCount undef[2] + 430 VibrationReduction int8u + 589 ShutterCount int32u + +=head3 Nikon ColorBalance1 Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 WB_RBGGLevels int16u[4]! + +=head3 Nikon ColorBalance2 Tags + +This information is encrypted for most camera models. + + Index2 Tag Name Writable + ------ -------- -------- + 0 WB_RGGBLevels int16u[4]! + +=head3 Nikon ColorBalance3 Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 WB_RGBGLevels int16u[4]! + +=head3 Nikon ColorBalance4 Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 WB_GRBGLevels int16u[4]! + +=head3 Nikon ColorBalanceUnknown Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ColorBalanceVersion undef[4] + +=head3 Nikon LensData00 Tags + +This structure is used by the D100, and D1X with firmware version 1.1. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensDataVersion no + 6 LensIDNumber int8u + 7 LensFStops int8u + 8 MinFocalLength int8u + 9 MaxFocalLength int8u + 10 MaxApertureAtMinFocal int8u + 11 MaxApertureAtMaxFocal int8u + 12 MCUVersion int8u + +=head3 Nikon LensData01 Tags + +Nikon encrypts the LensData information below if LensDataVersion is 0201 or +higher, but the decryption algorithm is known so the information can be +extracted. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensDataVersion no + 4 ExitPupilPosition int8u + 5 AFAperture int8u + 8 FocusPosition int8u + 9 FocusDistance int8u + 10 FocalLength int8u + 11 LensIDNumber int8u + 12 LensFStops int8u + 13 MinFocalLength int8u + 14 MaxFocalLength int8u + 15 MaxApertureAtMinFocal int8u + 16 MaxApertureAtMaxFocal int8u + 17 MCUVersion int8u + 18 EffectiveMaxAperture int8u + +=head3 Nikon LensData0204 Tags + +Nikon encrypts the LensData information below if LensDataVersion is 0201 or +higher, but the decryption algorithm is known so the information can be +extracted. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensDataVersion no + 4 ExitPupilPosition int8u + 5 AFAperture int8u + 8 FocusPosition int8u + 10 FocusDistance int8u + 11 FocalLength int8u + 12 LensIDNumber int8u + 13 LensFStops int8u + 14 MinFocalLength int8u + 15 MaxFocalLength int8u + 16 MaxApertureAtMinFocal int8u + 17 MaxApertureAtMaxFocal int8u + 18 MCUVersion int8u + 19 EffectiveMaxAperture int8u + +=head3 Nikon LensData0400 Tags + +Tags extracted from the encrypted lens data of the Nikon 1J1/1V1/1J2. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensDataVersion no + 394 LensModel string[64] + +=head3 Nikon LensData0402 Tags + +Tags extracted from the encrypted lens data of the Nikon 1J3/1S1/1V2. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensDataVersion no + 395 LensModel string[64] + +=head3 Nikon LensData0403 Tags + +Tags extracted from the encrypted lens data of the Nikon 1J4/1J5. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensDataVersion no + 684 LensModel string[64] + +=head3 Nikon LensData0800 Tags + +Tags found in the encrypted LensData from cameras such as the Z6 and Z7. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensDataVersion no + 4 ExitPupilPosition int8u + 5 AFAperture int8u + 11 FocusDistance int8u + 12 FocalLength int8u + 13 LensIDNumber int8u + 14 LensFStops int8u + 15 MinFocalLength int8u + 16 MaxFocalLength int8u + 17 MaxApertureAtMinFocal int8u + 18 MaxApertureAtMaxFocal int8u + 19 MCUVersion int8u + 20 EffectiveMaxAperture int8u + 48 LensID int16u + 53 LensMountType? int8u + 54 MaxAperture int16u + 56 FNumber int16u + 60 FocalLength int16u + 76 FocusDistanceRangeWidth? int8u + 78 FocusDistance int16u~ + 86 LensDriveEnd? int8u + 90 LensPositionAbsolute? int32s + +=head3 Nikon LensDataUnknown Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensDataVersion no + +=head3 Nikon FlashInfo0100 Tags + +These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and +D200. + + Index1 Tag Name Writable + ------ -------- -------- + 0 FlashInfoVersion no + 4 FlashSource int8u + 6 ExternalFlashFirmware int8u[2] + 8 ExternalFlashFlags int8u + 9.1 FlashCommanderMode int8u & 0x80 + 9.2 FlashControlMode int8u & 0x7f + 10 FlashOutput int8u + FlashCompensation int8s + 11 FlashFocalLength int8u + 12 RepeatingFlashRate int8u + 13 RepeatingFlashCount int8u + 14 FlashGNDistance int8u + 15 FlashGroupAControlMode int8u & 0x0f + 16 FlashGroupBControlMode int8u & 0x0f + 17 FlashGroupAOutput int8u + FlashGroupACompensation int8s + 18 FlashGroupBOutput int8u + FlashGroupBCompensation int8s + +=head3 Nikon FlashInfo0102 Tags + +These tags are used by the D3 (firmware 1.x), D40, D40X, D60 and D300 +(firmware 1.00). + + Index1 Tag Name Writable + ------ -------- -------- + 0 FlashInfoVersion no + 4 FlashSource int8u + 6 ExternalFlashFirmware int8u[2] + 8 ExternalFlashFlags int8u + 9.1 FlashCommanderMode int8u & 0x80 + 9.2 FlashControlMode int8u & 0x7f + 10 FlashOutput int8u + FlashCompensation int8s + 12 FlashFocalLength int8u + 13 RepeatingFlashRate int8u + 14 RepeatingFlashCount int8u + 15 FlashGNDistance int8u + 16.1 FlashGroupAControlMode int8u & 0x0f + 17.1 FlashGroupBControlMode int8u & 0xf0 + 17.2 FlashGroupCControlMode int8u & 0x0f + 18 FlashGroupAOutput int8u + FlashGroupACompensation int8s + 19 FlashGroupBOutput int8u + FlashGroupBCompensation int8s + 20 FlashGroupCOutput int8u + FlashGroupCCompensation int8s + +=head3 Nikon FlashInfo0103 Tags + +These tags are used by the D3 (firmware 2.x), D3X, D3S, D4, D90, D300 +(firmware 1.10), D300S, D600, D700, D800, D3000, D3100, D3200, D5000, D5100, +D5200, D7000. + + Index1 Tag Name Writable + ------ -------- -------- + 0 FlashInfoVersion no + 4 FlashSource int8u + 6 ExternalFlashFirmware int8u[2] + 8 ExternalFlashFlags int8u + 9.1 FlashCommanderMode int8u & 0x80 + 9.2 FlashControlMode int8u & 0x7f + 10 FlashOutput int8u + FlashCompensation int8s + 12 FlashFocalLength int8u + 13 RepeatingFlashRate int8u + 14 RepeatingFlashCount int8u + 15 FlashGNDistance int8u + 16 FlashColorFilter int8u + 17.1 FlashGroupAControlMode int8u & 0x0f + 18.1 FlashGroupBControlMode int8u & 0xf0 + 18.2 FlashGroupCControlMode int8u & 0x0f + 19 FlashGroupAOutput int8u + FlashGroupACompensation int8s + 20 FlashGroupBOutput int8u + FlashGroupBCompensation int8s + 21 FlashGroupCOutput int8u + FlashGroupCCompensation int8s + 27 ExternalFlashCompensation int8s + 29 FlashExposureComp3 int8s + 39 FlashExposureComp4 int8s + +=head3 Nikon FlashInfo0106 Tags + +These tags are used by the Df, D610, D3300, D5300, D7100 and Coolpix A. + + Index1 Tag Name Writable + ------ -------- -------- + 0 FlashInfoVersion no + 4 FlashSource int8u + 6 ExternalFlashFirmware int8u[2] + 8 ExternalFlashFlags int8u + 9.1 FlashCommanderMode int8u & 0x80 + 9.2 FlashControlMode int8u & 0x7f + 12 FlashFocalLength int8u + 13 RepeatingFlashRate int8u + 14 RepeatingFlashCount int8u + 15 FlashGNDistance int8u + 16 FlashColorFilter int8u + 17.1 FlashGroupAControlMode int8u & 0x0f + 18.1 FlashGroupBControlMode int8u & 0xf0 + 18.2 FlashGroupCControlMode int8u & 0x0f + 39 FlashOutput int8u + FlashCompensation int8s + 40 FlashGroupAOutput int8u + FlashGroupACompensation int8s + 41 FlashGroupBOutput int8u + FlashGroupBCompensation int8s + 42 FlashGroupCOutput int8u + FlashGroupCCompensation int8s + +=head3 Nikon FlashInfo0107 Tags + +These tags are used by the D4S, D750, D810, D5500, D7200 (FlashInfoVersion +0107) and the D5, D500, D850 and D3400 (FlashInfoVersion 0108). + + Index1 Tag Name Writable + ------ -------- -------- + 0 FlashInfoVersion no + 4 FlashSource int8u + 6 ExternalFlashFirmware int8u[2] + 8.1 ExternalFlashZoomOverride int8u & 0x80 + 8.2 ExternalFlashStatus int8u & 0x01 + 9.1 ExternalFlashReadyState int8u & 0x07 + 10 FlashCompensation int8s + 12 FlashFocalLength int8u + 13 RepeatingFlashRate int8u + 14 RepeatingFlashCount int8u + 15 FlashGNDistance int8u + 17.1 FlashGroupAControlMode int8u & 0x0f + 18.1 FlashGroupBControlMode int8u & 0xf0 + 18.2 FlashGroupCControlMode int8u & 0x0f + 40 FlashGroupAOutput int8u + FlashGroupACompensation int8s + 41 FlashGroupBOutput int8u + FlashGroupBCompensation int8s + 42 FlashGroupCOutput int8u + FlashGroupCCompensation int8s + +=head3 Nikon FlashInfo0300 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 FlashInfoVersion no + 4 FlashSource int8u + 6 ExternalFlashFirmware int8u[2] + 10 FlashCompensation int8s + +=head3 Nikon FlashInfoUnknown Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 FlashInfoVersion no + +=head3 Nikon MultiExposure Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 MultiExposureVersion no + 1 MultiExposureMode int32u + 2 MultiExposureShots int32u + 3 MultiExposureAutoGain int32u + +=head3 Nikon AFInfo2V0400 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 AFInfo2Version no + 62 AFImageWidth int16u + 64 AFImageHeight int16u + 67 FocusPositionHorizontal int8u~ + 69 FocusPositionVertical int8u~ + 70 AFAreaWidth int16u + 72 AFAreaHeight int16u + +=head3 Nikon AFInfo2 Tags + +These tags are written by Nikon DSLR's which have the live view feature. + + Index1 Tag Name Writable + ------ -------- -------- + 0 AFInfo2Version no + 4 ContrastDetectAF int8u + 5 AFAreaMode int8u + 6 PhaseDetectAF int8u + 7 PrimaryAFPoint int8u + 8 AFPointsUsed undef[7] + AFPointsUsed undef[2] + AFPointsUsed undef[5] + AFPointsUsed undef[17] + AFPointsUsed undef[21] + AFPointsUsed undef[29] + AFPointsUsed undef[20] + AFPointsUsed undef[13] + AFPointsUsed undef[7] + 10 AFPointsUsed undef[14] + 16 AFImageWidth int16u + 18 AFImageHeight int16u + 20 AFAreaXPosition int16u + 22 AFAreaYPosition int16u + 24 AFAreaWidth int16u + 26 AFAreaHeight int16u + 28 ContrastDetectAFInFocus int8u + AFPointsSelected undef[20] + 42 AFImageWidth int16u + 44 AFImageHeight int16u + 46 AFAreaXPosition int16u + 47 AFFocusPointXPosition int8u~ + 48 AFAreaYPosition int16u + AFPointsInFocus undef[20] + 49 AFFocusPointYPosition int8u~ + 50 AFAreaWidth int16u + 52 AFAreaHeight int16u + 56 PrimaryAFPoint int8u + 68 PrimaryAFPoint int8u + 70 AFImageWidth int16u + 72 AFImageHeight int16u + 74 AFAreaXPosition int16u + 76 AFAreaYPosition int16u + 78 AFAreaWidth int16u + 80 AFAreaHeight int16u + 82 ContrastDetectAFInFocus int8u + +=head3 Nikon FileInfo Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 FileInfoVersion no + 2 MemoryCardNumber int16u + 3 DirectoryNumber int16u + 4 FileNumber int16u + +=head3 Nikon AFTune Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 AFFineTune int8u + 1 AFFineTuneIndex int8u + 2 AFFineTuneAdj int8s + 3 AFFineTuneAdjTele int8s + +=head3 Nikon RetouchInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 RetouchInfoVersion no + 5 RetouchNEFProcessing int8s + +=head3 Nikon BarometerInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 BarometerInfoVersion no + 6 Altitude int32s + +=head3 Nikon CaptureOffsets Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 IFD0_Offset no + 0x0002 PreviewIFD_Offset no + 0x0003 SubIFD_Offset no + +=head3 Nikon Scan Tags + +This information is written by the Nikon Scan software. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0002 FilmType string + 0x0040 MultiSample string + 0x0041 BitDepth int16u + 0x0050 MasterGain rational64s + 0x0051 ColorGain rational64s[3] + 0x0060 ScanImageEnhancer int32u + 0x0100 DigitalICE string + 0x0110 ROCInfo Nikon ROC + 0x0120 GEMInfo Nikon GEM + 0x0200 DigitalDEEShadowAdj int32u + 0x0201 DigitalDEEThreshold int32u + 0x0202 DigitalDEEHighlightAdj int32u + +=head3 Nikon ROC Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 DigitalROC int32u + +=head3 Nikon GEM Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 DigitalGEM int32u + +=head3 Nikon CaptureOutput Tags + + Index4 Tag Name Writable + ------ -------- -------- + 2 OutputImageWidth int32u + 3 OutputImageHeight int32u + 4 OutputResolution int32u + +=head3 Nikon Type2 Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0003 Quality yes + 0x0004 ColorMode yes + 0x0005 ImageAdjustment yes + 0x0006 CCDSensitivity yes + 0x0007 WhiteBalance yes + 0x0008 Focus yes + 0x000a DigitalZoom yes + 0x000b Converter yes + +=head3 Nikon NEFInfo Tags + +As-yet unknown information found in SubIFD1 tag 0xc7d5 of NEF images from +cameras such as the Z6 and Z7, and NRW images from some Coolpix cameras. + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Nikon NCDT Tags + +Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from +various Nikon models. + + Tag ID Tag Name Writable + ------ -------- -------- + 'NCDB' NikonNCDB Nikon NCDB + 'NCHD' MakerNoteVersion no + 'NCM1' PreviewImage1 no + 'NCM2' PreviewImage2 no + 'NCTG' NikonTags Nikon NCTG + 'NCTH' ThumbnailImage no + 'NCVW' PreviewImage no + +=head3 Nikon NCDB Tags + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Nikon NCTG Tags + +These tags are found in proprietary-format records of the NCTG atom in MOV +videos from some Nikon cameras. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 Make no + 0x0002 Model no + 0x0003 Software no + 0x0011 CreateDate no + 0x0012 DateTimeOriginal no + 0x0013 FrameCount no + 0x0016 FrameRate no + 0x0019 TimeZone no + 0x0022 FrameWidth no + 0x0023 FrameHeight no + 0x0032 AudioChannels no + 0x0033 AudioBitsPerSample no + 0x0034 AudioSampleRate no + 0x1002 NikonDateTime no + 0x1013 ElectronicVR no + 0x110829a ExposureTime no + 0x110829d FNumber no + 0x1108822 ExposureProgram no + 0x1109204 ExposureCompensation no + 0x1109207 MeteringMode no + 0x110920a FocalLength no + 0x110a431 SerialNumber no + 0x110a432 LensInfo no + 0x110a433 LensMake no + 0x110a434 LensModel no + 0x110a435 LensSerialNumber no + 0x1200000 GPSVersionID no + 0x1200001 GPSLatitudeRef no + 0x1200002 GPSLatitude no + 0x1200003 GPSLongitudeRef no + 0x1200004 GPSLongitude no + 0x1200005 GPSAltitudeRef no + 0x1200006 GPSAltitude no + 0x1200007 GPSTimeStamp no + 0x1200008 GPSSatellites no + 0x1200010 GPSImgDirectionRef no + 0x1200011 GPSImgDirection no + 0x1200012 GPSMapDatum no + 0x120001d GPSDateStamp no + 0x2000001 MakerNoteVersion no + 0x2000005 WhiteBalance no + 0x2000007 FocusMode no + 0x200000b WhiteBalanceFineTune no + 0x200001b CropHiSpeed no + 0x200001e ColorSpace no + 0x200001f VRInfo Nikon VRInfo + 0x2000022 ActiveD-Lighting no + 0x2000023 PictureControlData Nikon PictureControl + Nikon PictureControl2 + Nikon PictureControl3 + Nikon PictureControlUnknown + 0x2000024 WorldTime Nikon WorldTime + 0x2000025 ISOInfo Nikon ISOInfo + 0x200002a VignetteControl no + 0x200002c UnknownInfo Nikon UnknownInfo + 0x2000032 UnknownInfo2 Nikon UnknownInfo2 + 0x2000039 LocationInfo Nikon LocationInfo + 0x2000083 LensType no + 0x2000084 Lens no + 0x2000087 FlashMode no + 0x2000098 LensData0100 Nikon LensData00 + LensData0101 Nikon LensData01 + LensData0201 Nikon LensData01 + LensData0204 Nikon LensData0204 + LensData0400 Nikon LensData0400 + LensData0402 Nikon LensData0402 + LensData0403 Nikon LensData0403 + LensData0800 Nikon LensData0800 + LensDataUnknown Nikon LensDataUnknown + 0x20000a7 ShutterCount no + 0x20000a8 FlashInfo0100 Nikon FlashInfo0100 + FlashInfo0102 Nikon FlashInfo0102 + FlashInfo0103 Nikon FlashInfo0103 + FlashInfo0106 Nikon FlashInfo0106 + FlashInfo0107 Nikon FlashInfo0107 + FlashInfoUnknown Nikon FlashInfoUnknown + 0x20000ab VariProgram no + 0x20000b1 HighISONoiseReduction no + 0x20000b7 AFInfo2 Nikon AFInfo2 + 0x20000c3 BarometerInfo Nikon BarometerInfo + +=head3 Nikon MOV Tags + +This information is found in MOV and QT videos from some Nikon cameras. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 24 Model no + 38 ExposureTime no + 42 FNumber no + 50 ExposureCompensation no + 68 WhiteBalance no + 72 FocalLength no + 175 Software no + 223 ISO no + +=head3 Nikon AVI Tags + +Nikon-specific RIFF tags found in AVI videos. + + Tag ID Tag Name Writable + ------ -------- -------- + 'nctg' NikonTags Nikon AVITags + 'ncth' ThumbnailImage no + 'ncvr' NikonVers Nikon AVIVers + 'ncvw' PreviewImage no + +=head3 Nikon AVITags Tags + +These tags and the AVIVer tags below are found in proprietary-format records +of Nikon AVI videos. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0003 Make no + 0x0004 Model no + 0x0005 Software no + 0x0006 Equipment no + 0x0007 Orientation no + 0x0008 ExposureTime no + 0x0009 FNumber no + 0x000a ExposureCompensation no + 0x000b MaxApertureValue no + 0x000c MeteringMode no + 0x000f FocalLength no + 0x0010 XResolution no + 0x0011 YResolution no + 0x0012 ResolutionUnit no + 0x0013 DateTimeOriginal no + 0x0014 CreateDate no + 0x0016 Duration no + 0x0018 FocusMode no + 0x001b DigitalZoom no + 0x001d ColorMode no + 0x001e Sharpness no + 0x001f WhiteBalance no + 0x0020 NoiseReduction no + +=head3 Nikon AVIVers Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 MakerNoteType no + 0x0002 MakerNoteVersion no + +=head2 NikonCustom Tags + +Unfortunately, the NikonCustom settings are stored in a binary data block +which changes from model to model. This means that significant effort must +be spent in decoding these for each model, usually requiring hundreds of +test images from a dedicated Nikon owner. For this reason, the NikonCustom +settings have not been decoded for all models. The tables below list the +custom settings for the currently supported models. + +=head3 NikonCustom SettingsD40 Tags + +Custom settings for the Nikon D40. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 Beep int8u & 0x80 + 0.2 AFAssist int8u & 0x40 + 0.3 NoMemoryCard int8u & 0x20 + 0.4 ImageReview int8u & 0x10 + 1.1 AutoISO int8u & 0x80 + 1.2 AutoISOMax int8u & 0x30 + 1.3 AutoISOMinShutterSpeed int8u & 0x07 + 2.1 ImageReviewTime int8u & 0x07 + 3.1 MonitorOffTime int8u & 0xe0 + 3.2 MeteringTime int8u & 0x1c + 3.3 SelfTimerTime int8u & 0x03 + 3.4 RemoteOnDuration int8u & 0xc0 + 4.1 AELockButton int8u & 0x0e + 4.2 AELock int8u & 0x01 + 5.1 ShootingModeSetting int8u & 0x70 + 5.2 TimerFunctionButton int8u & 0x07 + 6.1 Metering int8u & 0x03 + 8.1 InternalFlash int8u & 0x10 + 8.2 ManualFlashOutput int8u & 0x07 + 9 FlashLevel int8s + 10.1 FocusModeSetting int8u & 0xc0 + 11.1 AFAreaModeSetting int8u & 0x30 + +=head3 NikonCustom SettingsD80 Tags + +Custom settings for the Nikon D80. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 Beep int8u & 0x80 + 0.2 AFAssist int8u & 0x40 + 0.3 NoMemoryCard int8u & 0x20 + 0.4 ImageReview int8u & 0x10 + 0.5 Illumination int8u & 0x08 + 0.6 MainDialExposureComp int8u & 0x04 + 0.7 EVStepSize int8u & 0x01 + 1.1 AutoISO int8u & 0x40 + 1.2 AutoISOMax int8u & 0x30 + 1.3 AutoISOMinShutterSpeed int8u & 0x0f + 2.1 AutoBracketSet int8u & 0xc0 + 2.2 AutoBracketOrder int8u & 0x20 + 3.1 MonitorOffTime int8u & 0xe0 + 3.2 MeteringTime int8u & 0x1c + 3.3 SelfTimerTime int8u & 0x03 + 4.1 AELockButton int8u & 0x1e + 4.2 AELock int8u & 0x01 + 4.3 RemoteOnDuration int8u & 0xc0 + 5.1 CommandDials int8u & 0x80 + 5.2 FunctionButton int8u & 0x78 + 6.1 GridDisplay int8u & 0x80 + 6.2 ViewfinderWarning int8u & 0x40 + 6.3 CenterWeightedAreaSize int8u & 0x0c + 6.4 ExposureDelayMode int8u & 0x20 + 6.5 MB-D80Batteries int8u & 0x03 + 7.1 FlashWarning int8u & 0x80 + 7.2 FlashShutterSpeed int8u & 0x78 + 7.3 AutoFP int8u & 0x04 + 7.4 ModelingFlash int8u & 0x02 + 8.1 InternalFlash int8u & 0xc0 + 8.2 ManualFlashOutput int8u & 0x07 + 9.1 RepeatingFlashOutput int8u & 0x70 + 9.2 RepeatingFlashCount int8u & 0x0f + 10.1 RepeatingFlashRate int8u & 0xf0 + 10.2 CommanderChannel int8u & 0x03 + 11.1 CommanderInternalFlash int8u & 0xc0 + 11.2 CommanderGroupAMode int8u & 0x30 + 11.3 CommanderGroupBMode int8u & 0x0c + 12.1 CommanderInternalTTLComp int8u & 0x1f + 12.2 CommanderInternalManualOutput int8u & 0xe0 + 13.1 CommanderGroupA_TTL-AAComp int8u & 0x1f + 13.2 CommanderGroupAManualOutput int8u & 0xe0 + 14.1 CommanderGroupB_TTL-AAComp int8u & 0x1f + 14.2 CommanderGroupBManualOutput int8u & 0xe0 + 15.1 CenterAFArea int8u & 0x80 + 15.2 FocusAreaSelection int8u & 0x04 + 15.3 AFAreaIllumination int8u & 0x03 + 16.1 AFAreaModeSetting int8u & 0xc0 + +=head3 NikonCustom SettingsD90 Tags + +Custom settings for the D90. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 LightSwitch int8u & 0x08 + 2.1 AFAreaModeSetting int8u & 0x60 + 2.2 CenterFocusPoint int8u & 0x10 + 2.3 AFAssist int8u & 0x01 + 2.4 AFPointIllumination int8u & 0x06 + 2.5 FocusPointWrap int8u & 0x08 + 3.1 AELockForMB-D80 int8u & 0x1c + 3.2 MB-D80BatteryType int8u & 0x03 + 4.1 Beep int8u & 0x40 + 4.2 GridDisplay int8u & 0x02 + 4.3 ISODisplay int8u & 0x0c + 4.4 ViewfinderWarning int8u & 0x01 + 4.5 NoMemoryCard int8u & 0x20 + 5.1 ScreenTips int8u & 0x04 + 5.2 FileNumberSequence int8u & 0x08 + 5.3 ShootingInfoDisplay int8u & 0xc0 + 5.4 LCDIllumination int8u & 0x20 + 6.1 EasyExposureComp int8u & 0x01 + 6.2 ReverseIndicators int8u & 0x80 + 7.1 ExposureControlStepSize int8u & 0x40 + 8.1 CenterWeightedAreaSize int8u & 0x60 + 8.2 FineTuneOptMatrixMetering int8u & 0x0f + 9.1 FineTuneOptCenterWeighted int8u & 0xf0 + 9.2 FineTuneOptSpotMetering int8u & 0x0f + 11.1 CLModeShootingSpeed int8u & 0x07 + 11.2 ExposureDelayMode int8u & 0x40 + 13.1 AutoBracketSet int8u & 0xe0 + 13.2 AutoBracketOrder int8u & 0x10 + 14.1 FuncButton int8u & 0x78 + 16.1 OKButton int8u & 0x18 + 17.1 AELockButton int8u & 0x38 + 18.1 CommandDialsReverseRotation int8u & 0x80 + 18.2 ShutterReleaseButtonAE-L int8u & 0x02 + 19.1 MeteringTime int8u & 0xf0 + 19.2 RemoteOnDuration int8u & 0x03 + 20.1 SelfTimerTime int8u & 0xc0 + 20.2 SelfTimerShotCount int8u & 0x1e + 21.1 PlaybackMonitorOffTime int8u & 0x1c + 21.2 ImageReviewTime int8u & 0xe0 + 22.1 MenuMonitorOffTime int8u & 0xe0 + 22.2 ShootingInfoMonitorOffTime int8u & 0x1c + 23.1 FlashShutterSpeed int8u & 0x0f + 24.1 InternalFlash int8u & 0xc0 + 24.2 ManualFlashOutput int8u & 0x1f + 25.1 RepeatingFlashOutput int8u & 0x70 + 25.2 RepeatingFlashCount int8u & 0x0f + 26.1 RepeatingFlashRate int8u & 0xf0 + 31.1 FlashWarning int8u & 0x80 + 31.2 CommanderInternalTTLComp int8u & 0x1f + 31.3 ModelingFlash int8u & 0x20 + 31.4 AutoFP int8u & 0x40 + 32.1 CommanderGroupA_TTLComp int8u & 0x1f + 33.1 CommanderGroupB_TTLComp int8u & 0x1f + 34.1 LiveViewAF int8u & 0xc0 + +=head3 NikonCustom SettingsD3 Tags + +Custom settings for the D3, D3S, D3X, D300 and D300S. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 CustomSettingsBank int8u & 0x03 + 0.2 CustomSettingsAllDefault int8u & 0x80 + 1.1 AF-CPrioritySelection int8u & 0xc0 + 1.2 AF-SPrioritySelection int8u & 0x20 + 1.3 AFPointSelection int8u & 0x10 + 1.4 DynamicAFArea int8u & 0x0c + 1.5 FocusTrackingLockOn int8u & 0x03 + 2.1 AFActivation int8u & 0x80 + 2.2 FocusPointWrap int8u & 0x08 + 2.3 AFPointIllumination int8u & 0x60 + AFPointIllumination int8u & 0x06 + 2.4 AFPointBrightness int8u & 0x06 + 2.5 AFAssist int8u & 0x01 + 3.1 AFOnButton int8u & 0x07 + 3.2 VerticalAFOnButton int8u & 0x70 + 3.3 AF-OnForMB-D10 int8u & 0x70 + 4.1 FocusTrackingLockOn int8u & 0x07 + 4.2 AssignBktButton int8u & 0x08 + 4.3 MultiSelectorLiveView int8u & 0xc0 + 4.4 InitialZoomLiveView int8u & 0x30 + 6.1 ISOStepSize int8u & 0xc0 + 6.2 ExposureControlStepSize int8u & 0x30 + 6.3 ExposureCompStepSize int8u & 0x0c + 6.4 EasyExposureCompensation int8u & 0x03 + 7.1 CenterWeightedAreaSize int8u & 0xe0 + 7.2 FineTuneOptCenterWeighted int8u & 0x0f + 8.1 FineTuneOptMatrixMetering int8u & 0xf0 + 8.2 FineTuneOptSpotMetering int8u & 0x0f + 9.1 MultiSelectorShootMode int8u & 0xc0 + 9.2 MultiSelectorPlaybackMode int8u & 0x30 + 9.3 InitialZoomSetting int8u & 0x0c + 9.4 MultiSelector int8u & 0x01 + 10.1 ExposureDelayMode int8u & 0x40 + 10.2 CLModeShootingSpeed int8u & 0x07 + 10.3 CHModeShootingSpeed int8u & 0x30 + 11 MaxContinuousRelease int8u + 12.1 ReverseIndicators int8u & 0x20 + 12.2 FileNumberSequence int8u & 0x02 + FileNumberSequence int8u & 0x08 + 12.3 RearDisplay int8u & 0x80 + 12.4 ViewfinderDisplay int8u & 0x40 + 12.5 BatteryOrder int8u & 0x04 + 12.6 MB-D10Batteries int8u & 0x03 + 12.7 ScreenTips int8u & 0x10 + 13.1 Beep int8u & 0xc0 + 13.2 ShootingInfoDisplay int8u & 0x30 + 13.3 GridDisplay int8u & 0x02 + 13.4 ViewfinderWarning int8u & 0x01 + 13.5 MultiSelectorPlaybackMode int8u & 0x03 + 14.1 PreviewButton int8u & 0xf8 + FuncButton int8u & 0xf8 + 14.2 PreviewButtonPlusDials int8u & 0x07 + FuncButtonPlusDials int8u & 0x07 + 15.1 FuncButton int8u & 0xf8 + PreviewButton int8u & 0xf8 + 15.2 FuncButtonPlusDials int8u & 0x07 + PreviewButtonPlusDials int8u & 0x07 + 16.1 AELockButton int8u & 0xf8 + 16.2 AELockButtonPlusDials int8u & 0x07 + 17.1 CommandDialsReverseRotation int8u & 0x80 + 17.2 CommandDialsChangeMainSub int8u & 0x40 + 17.3 CommandDialsApertureSetting int8u & 0x20 + 17.4 CommandDialsMenuAndPlayback int8u & 0x10 + 17.5 LCDIllumination int8u & 0x08 + 17.6 PhotoInfoPlayback int8u & 0x04 + 17.7 ShutterReleaseButtonAE-L int8u & 0x02 + 17.8 ReleaseButtonToUseDial int8u & 0x01 + 18.1 SelfTimerTime int8u & 0x18 + 18.2 MonitorOffTime int8u & 0x07 + 20.1 FlashSyncSpeed int8u & 0xe0 + FlashSyncSpeed int8u & 0xf0 + 20.2 FlashShutterSpeed int8u & 0x0f + 21.1 AutoBracketSet int8u & 0xc0 + AutoBracketSet int8u & 0xe0 + 21.2 AutoBracketModeM int8u & 0x30 + AutoBracketModeM int8u & 0x18 + 21.3 AutoBracketOrder int8u & 0x08 + AutoBracketOrder int8u & 0x04 + 21.4 ModelingFlash int8u & 0x01 + 22.1 NoMemoryCard int8u & 0x80 + 22.2 MeteringTime int8u & 0x0f + 23.1 InternalFlash int8u & 0xc0 + 25.1 ImageReviewTime int8u & 0xe0 + 25.2 PlaybackMonitorOffTime int8u & 0x1c + 26.1 MenuMonitorOffTime int8u & 0xe0 + 26.2 ShootingInfoMonitorOffTime int8u & 0x1c + +=head3 NikonCustom SettingsD700 Tags + +Custom settings for the D700. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 CustomSettingsBank int8u & 0x03 + 0.2 CustomSettingsAllDefault int8u & 0x80 + 1.1 AF-CPrioritySelection int8u & 0xc0 + 1.2 AF-SPrioritySelection int8u & 0x20 + 1.3 AFPointSelection int8u & 0x10 + 1.4 DynamicAFArea int8u & 0x0c + 2.1 AFActivation int8u & 0x80 + 2.2 FocusPointWrap int8u & 0x08 + 2.3 AFPointIllumination int8u & 0x06 + 2.4 AFAssist int8u & 0x01 + 3.1 FocusTrackingLockOn int8u & 0x07 + 3.2 AF-OnForMB-D10 int8u & 0x70 + 4.1 ISOStepSize int8u & 0xc0 + 4.2 ExposureControlStepSize int8u & 0x30 + 4.3 ExposureCompStepSize int8u & 0x0c + 4.4 EasyExposureCompensation int8u & 0x03 + 5.1 CenterWeightedAreaSize int8u & 0x70 + 6.1 FineTuneOptMatrixMetering int8u & 0xf0 + 6.2 FineTuneOptSpotMetering int8u & 0x0f + 7.1 ShutterReleaseButtonAE-L int8u & 0x80 + 7.2 SelfTimerTime int8u & 0x30 + 7.3 MeteringTime int8u & 0x0f + 8.1 PlaybackMonitorOffTime int8u & 0x38 + 8.2 MenuMonitorOffTime int8u & 0x07 + 9.1 ShootingInfoMonitorOffTime int8u & 0x38 + 9.2 ImageReviewTime int8u & 0x07 + 10.1 Beep int8u & 0xc0 + 10.2 ShootingInfoDisplay int8u & 0x30 + 10.3 LCDIllumination int8u & 0x08 + 10.4 ExposureDelayMode int8u & 0x04 + 10.5 GridDisplay int8u & 0x02 + 11.1 FileNumberSequence int8u & 0x40 + 11.2 CLModeShootingSpeed int8u & 0x07 + 12 MaxContinuousRelease int8u + 13.1 ScreenTips int8u & 0x08 + 13.2 BatteryOrder int8u & 0x04 + 13.3 MB-D10BatteryType int8u & 0x03 + 15.1 FlashSyncSpeed int8u & 0xf0 + 15.2 FlashShutterSpeed int8u & 0x0f + 16.1 FlashControlBuilt-in int8u & 0xc0 + 16.2 ManualFlashOutput int8u & 0x1f + 17.1 RepeatingFlashOutput int8u & 0x70 + 17.2 RepeatingFlashCount int8u & 0x0f + 18.1 RepeatingFlashRate int8u & 0xf0 + 18.2 CommanderInternalTTLChannel int8u & 0x03 + 20.1 CommanderInternalTTLCompBuiltin int8u & 0x1f + 21.1 CommanderInternalTTLCompGroupA int8u & 0x1f + 22.1 CommanderInternalTTLCompGroupB int8u & 0x1f + 26.1 AutoBracketSet int8u & 0xc0 + 26.2 AutoBracketModeM int8u & 0x30 + 26.3 AutoBracketOrder int8u & 0x08 + 26.4 ModelingFlash int8u & 0x01 + 27.1 MultiSelectorShootMode int8u & 0xc0 + 27.2 MultiSelectorPlaybackMode int8u & 0x30 + 27.3 InitialZoomSetting int8u & 0x0c + 27.4 MultiSelector int8u & 0x01 + 28.1 FuncButton int8u & 0xf8 + 29.1 PreviewButton int8u & 0xf8 + 30.1 AELockButton int8u & 0xf8 + 31.1 FuncButtonPlusDials int8u & 0x70 + 31.2 PreviewButtonPlusDials int8u & 0x07 + 32.1 AELockButtonPlusDials int8u & 0x70 + 33.1 CommandDialsReverseRotation int8u & 0x80 + 33.2 CommandDialsChangeMainSub int8u & 0x40 + 33.3 CommandDialsApertureSetting int8u & 0x20 + 33.4 CommandDialsMenuAndPlayback int8u & 0x10 + 33.5 ReverseIndicators int8u & 0x08 + 33.6 PhotoInfoPlayback int8u & 0x04 + 33.7 NoMemoryCard int8u & 0x02 + 33.8 ReleaseButtonToUseDial int8u & 0x01 + +=head3 NikonCustom SettingsD800 Tags + +Custom settings for the D800 and D800E. + + Index1 Tag Name Writable + ------ -------- -------- + 12.1 AutoBracketingSet int8u & 0xe0 + 12.2 AutoBracketOrder int8u & 0x10 + 12.3 AutoBracketingMode int8u & 0x0c + 22.1 FlashSyncSpeed int8u & 0xf0 + 22.2 FlashShutterSpeed int8u & 0x0f + 23.1 FlashControlBuilt-in int8u & 0xc0 + 23.2 ManualFlashOutput int8u & 0x1f + 24.1 RepeatingFlashOutput int8u & 0x70 + 24.2 RepeatingFlashCount int8u & 0x0f + 25.1 RepeatingFlashRate int8u & 0xf0 + 25.2 CommanderChannel int8u & 0x03 + 27.1 CommanderInternalFlash int8u & 0xc0 + 27.2 CommanderInternalManualOutput int8u & 0x1f + 28.1 CommanderGroupAMode int8u & 0xc0 + 28.2 CommanderGroupAManualOutput int8u & 0x1f + 29.1 CommanderGroupBMode int8u & 0xc0 + 29.2 CommanderGroupBManualOutput int8u & 0x1f + 30.1 ModelingFlash int8u & 0x20 + 30.2 CommanderInternalTTLComp int8u & 0x1f + 31.1 CommanderGroupA_TTL-AAComp int8u & 0x1f + 32.1 CommanderGroupB_TTL-AAComp int8u & 0x1f + +=head3 NikonCustom SettingsD810 Tags + +Custom settings for the D810. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 LightSwitch int8u & 0x08 + 0.2 CustomSettingsBank int8u & 0x03 + 1.1 AF-CPrioritySelection int8u & 0xc0 + 1.2 AF-SPrioritySelection int8u & 0x20 + 1.3 AFPointSelection int8u & 0x10 + 1.4 FocusTrackingLockOn int8u & 0x07 + 2.1 AFActivation int8u & 0x80 + 2.2 FocusPointWrap int8u & 0x08 + 2.3 AFPointBrightness int8u & 0x06 + 2.4 AFAssist int8u & 0x01 + 3.1 BatteryOrder int8u & 0x40 + 3.2 MB-D12BatteryType int8u & 0x03 + 4.1 Pitch int8u & 0x40 + 4.2 NoMemoryCard int8u & 0x20 + 4.3 ISODisplay int8u & 0x0c + 4.4 GridDisplay int8u & 0x02 + 5.1 ShootingInfoDisplay int8u & 0xc0 + 5.2 LCDIllumination int8u & 0x20 + 5.3 ElectronicFront-CurtainShutter int8u & 0x08 + 5.4 ScreenTips int8u & 0x04 + 5.5 Beep int8u & 0x03 + 6.1 ReverseIndicators int8u & 0x80 + 6.2 CommandDialsReverseRotation int8u & 0x18 + 6.3 EasyExposureCompensation int8u & 0x03 + 7.1 ExposureControlStepSize int8u & 0xc0 + 7.2 ISOStepSize int8u & 0x30 + 7.3 ExposureCompStepSize int8u & 0x0c + 8.1 CenterWeightedAreaSize int8u & 0xe0 + 8.2 FineTuneOptMatrixMetering int8u & 0x0f + 9.1 FineTuneOptCenterWeighted int8u & 0xf0 + 9.2 FineTuneOptSpotMetering int8u & 0x0f + 10.1 MultiSelectorShootMode int8u & 0xc0 + 10.2 MultiSelectorPlaybackMode int8u & 0x30 + 10.3 MultiSelector int8u & 0x01 + 11.1 ExposureDelayMode int8u & 0xc0 + 11.2 CLModeShootingSpeed int8u & 0x0f + 12.1 MaxContinuousRelease int8u + 13.1 AutoBracketSet int8u & 0xe0 + 13.2 AutoBracketOrder int8u & 0x10 + 13.3 AutoBracketModeM int8u & 0x0c + 14.1 FuncButton int8u & 0x1f + 15.1 PreviewButton int8u & 0x1f + 16.1 AssignBktButton int8u & 0x07 + 17.1 AELockButton int8u & 0x1f + 18.1 CommandDialsChangeMainSub int8u & 0xe0 + 18.2 CommandDialsMenuAndPlayback int8u & 0x18 + 18.3 CommandDialsApertureSetting int8u & 0x04 + 18.4 ShutterReleaseButtonAE-L int8u & 0x02 + 18.5 ReleaseButtonToUseDial int8u & 0x01 + 19.1 StandbyTimer int8u & 0xf0 + 20.1 SelfTimerTime int8u & 0xc0 + 20.2 SelfTimerShotInterval int8u & 0x30 + 20.3 SelfTimerShotCount int8u & 0x0f + 21.1 ImageReviewMonitorOffTime int8u & 0xe0 + 21.2 LiveViewMonitorOffTime int8u & 0x1c + 22.1 MenuMonitorOffTime int8u & 0xe0 + 22.2 ShootingInfoMonitorOffTime int8u & 0x1c + 23.1 FlashSyncSpeed int8u & 0xf0 + 23.2 FlashShutterSpeed int8u & 0x0f + 24.1 FlashControlBuilt-in int8u & 0xc0 + 31.1 ModelingFlash int8u & 0x20 + 36.1 PlaybackMonitorOffTime int8u & 0xe0 + 37.1 MultiSelectorLiveView int8u & 0xc0 + 38.1 ShutterSpeedLock int8u & 0x80 + 38.2 ApertureLock int8u & 0x40 + 38.3 MovieShutterButton int8u & 0x20 + 38.4 FlashExposureCompArea int8u & 0x04 + 40.1 MovieAELockButtonAssignment int8u & 0x0f + 41.1 MovieFunctionButton int8u & 0x70 + 41.2 MoviePreviewButton int8u & 0x07 + 42.1 FuncButtonPlusDials int8u & 0x0f + 43.1 PreviewButtonPlusDials int8u & 0x0f + 44.1 AELockButtonPlusDials int8u & 0x0f + 45.1 AssignMovieRecordButton int8u & 0x0f + 46.1 FineTuneOptHighlightWeighted int8u & 0x0f + 47.1 DynamicAreaAFDisplay int8u & 0x80 + 47.2 AFPointIllumination int8u & 0x40 + 47.3 StoreByOrientation int8u & 0x18 + 47.4 GroupAreaAFIllumination int8u & 0x04 + 48.1 MatrixMetering int8u & 0x80 + 48.2 LiveViewButtonOptions int8u & 0x30 + 48.3 AFModeRestrictions int8u & 0x03 + 49.1 LimitAFAreaModeSelection int8u & 0x7e + 50.1 AF-OnForMB-D12 int8u & 0x07 + 51.1 AssignRemoteFnButton int8u & 0x1f + 52.1 LensFocusFunctionButtons int8u & 0x3f + +=head3 NikonCustom SettingsD850 Tags + +Custom settings for the D850. + + Index1 Tag Name Writable + ------ -------- -------- + 0.2 CustomSettingsBank int8u & 0x03 + 1.1 AF-CPrioritySelection int8u & 0xc0 + 1.2 AF-SPrioritySelection int8u & 0x20 + 1.3 AFPointSelection int8u & 0x10 + 1.4 Three-DTrackingFaceDetection int8u & 0x08 + 1.5 BlockShotAFResponse int8u & 0x07 + 2.1 FocusPointWrap int8u & 0x08 + 2.2 AFPointBrightness int8u & 0x06 + 4.1 ISODisplay int8u & 0x08 + 4.2 GridDisplay int8u & 0x02 + 5.1 LCDIllumination int8u & 0x20 + 5.2 ElectronicFront-CurtainShutter int8u & 0x08 + 6.1 ReverseIndicators int8u & 0x80 + 6.2 CommandDialsReverseRotation int8u & 0x18 + 6.3 EasyExposureCompensation int8u & 0x03 + 7.1 ExposureControlStepSize int8u & 0xc0 + 7.2 ISOStepSize int8u & 0x30 + 7.3 ExposureCompStepSize int8u & 0x0c + 8.1 CenterWeightedAreaSize int8u & 0xe0 + 8.2 FineTuneOptMatrixMetering int8u & 0x0f + 9.1 FineTuneOptCenterWeighted int8u & 0xf0 + 9.2 FineTuneOptSpotMetering int8u & 0x0f + 10.1 MultiSelectorShootMode int8u & 0xe0 + 10.2 MultiSelectorPlaybackMode int8u & 0x0c + 10.3 MultiSelector int8u & 0x01 + 11.1 ExposureDelayMode int8u & 0xe0 + 11.2 CLModeShootingSpeed int8u & 0x0f + 12.1 MaxContinuousRelease int8u + 13.1 AutoBracketOrder int8u & 0x10 + 13.2 AutoBracketModeM int8u & 0x0c + 14.1 Func1Button int8u & 0x3f + 15.1 PreviewButton int8u & 0x3f + 16.1 AssignBktButton int8u & 0x07 + 18.1 CommandDialsChangeMainSub int8u & 0xe0 + 18.2 CommandDialsMenuAndPlayback int8u & 0x18 + 18.3 CommandDialsApertureSetting int8u & 0x04 + 18.4 ReleaseButtonToUseDial int8u & 0x01 + 19.1 StandbyTimer int8u & 0xf0 + 20.1 SelfTimerTime int8u & 0xc0 + 20.2 SelfTimerShotInterval int8u & 0x30 + 20.3 SelfTimerShotCount int8u & 0x0f + 21.1 ImageReviewMonitorOffTime int8u & 0xe0 + 21.2 LiveViewMonitorOffTime int8u & 0x1c + 22.1 MenuMonitorOffTime int8u & 0xe0 + 22.2 ShootingInfoMonitorOffTime int8u & 0x1c + 23.1 FlashSyncSpeed int8u & 0xf0 + 23.2 FlashShutterSpeed int8u & 0x0f + 31.1 ModelingFlash int8u & 0x20 + 36.1 PlaybackMonitorOffTime int8u & 0xe0 + 37.1 MultiSelectorLiveView int8u & 0xc0 + 38.1 ShutterSpeedLock int8u & 0x80 + 38.2 ApertureLock int8u & 0x40 + 38.3 MovieShutterButton int8u & 0x10 + 38.4 FlashExposureCompArea int8u & 0x04 + 38.5 AutoFlashISOSensitivity int8u & 0x02 + 41.1 MovieFunc1Button int8u & 0xf0 + 41.2 MoviePreviewButton int8u & 0x0f + 42.1 Func1ButtonPlusDials int8u & 0x0f + 43.1 PreviewButtonPlusDials int8u & 0x0f + 45.1 AssignMovieRecordButtonPlusDials int8u & 0x0f + 46.1 FineTuneOptHighlightWeighted int8u & 0x0f + 47.1 DynamicAreaAFDisplay int8u & 0x80 + 47.2 AFPointIllumination int8u & 0x40 + 47.3 StoreByOrientation int8u & 0x18 + 48.1 MatrixMetering int8u & 0x80 + 48.2 LiveViewButtonOptions int8u & 0x30 + 48.3 AFModeRestrictions int8u & 0x03 + 49.1 LimitAFAreaModeSelection int8u & 0x7e + 52.1 LensFocusFunctionButtons int8u & 0x3f + 66.1 VerticalMultiSelector int8u & 0xff + 67.1 AssignMB-D18FuncButton int8u & 0x3f + 68.1 AssignMB-D18FuncButtonPlusDials int8u & 0x0f + 70.1 AF-OnButton int8u & 0x3f + 71.1 SubSelector int8u & 0x80 + 72.1 SubSelectorCenter int8u & 0x3f + 73.1 SubSelectorPlusDials int8u & 0x0f + 74.1 AssignMovieSubselector int8u & 0xf0 + 75.1 AssignMovieFunc1ButtonPlusDials int8u & 0x10 + 75.2 AssignMoviePreviewButtonPlusDials int8u & 0x01 + 76.1 AssignMovieSubselectorPlusDials int8u & 0x10 + 77.1 SyncReleaseMode int8u & 0x80 + 77.2 ContinuousModeLiveView int8u & 0x40 + 78.1 Three-DTrackingWatchArea int8u & 0x80 + 78.2 SubjectMotion int8u & 0x60 + 78.3 AFActivation int8u & 0x08 + 78.4 ShutterReleaseButtonAE-L int8u & 0x03 + 79.1 AssignMB-D18AF-OnButton int8u & 0x7f + 80.1 Func2Button int8u & 0x3f + 82.1 AssignMovieFunc2Button int8u & 0x70 + +=head3 NikonCustom SettingsD5000 Tags + +Custom settings for the D5000. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 AFAreaModeSetting int8u & 0x60 + 0.2 AFAssist int8u & 0x01 + 2.1 Beep int8u & 0xc0 + 2.2 GridDisplay int8u & 0x02 + 2.3 ISODisplay int8u & 0x08 + 2.4 NoMemoryCard int8u & 0x20 + 3.1 FileNumberSequence int8u & 0x08 + 4.1 RangeFinder int8u & 0x10 + 4.2 DateImprint int8u & 0x08 + 4.3 ReverseIndicators int8u & 0x80 + 5.1 EVStepSize int8u & 0x40 + 9.1 ExposureDelayMode int8u & 0x40 + 11.1 AutoBracketSet int8u & 0xc0 + 12.1 TimerFunctionButton int8u & 0x38 + 15.1 AELockButton int8u & 0x38 + 16.1 ShutterReleaseButtonAE-L int8u & 0x02 + 16.2 CommandDialsReverseRotation int8u & 0x80 + 17.1 MeteringTime int8u & 0x70 + 17.2 RemoteOnDuration int8u & 0x03 + 18.1 SelfTimerTime int8u & 0xc0 + 18.2 SelfTimerShotCount int8u & 0x1e + 19.1 ImageReviewTime int8u & 0xe0 + 20.1 PlaybackMenusTime int8u & 0xe0 + 22.1 InternalFlash int8u & 0xc0 + 22.2 ManualFlashOutput int8u & 0x1f + 32.1 LiveViewAF int8u & 0x60 + +=head3 NikonCustom SettingsD5100 Tags + +Custom settings for the D5100. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 AF-CPrioritySelection int8u & 0x80 + 1.1 AFAssist int8u & 0x01 + 3.1 Beep int8u & 0xc0 + 3.2 NoMemoryCard int8u & 0x20 + 3.3 ISODisplay int8u & 0x08 + 4.1 FileNumberSequence int8u & 0x08 + 5.1 RangeFinder int8u & 0x10 + 5.2 ReverseIndicators int8u & 0x80 + 6.1 EVStepSize int8u & 0x40 + 10.1 ExposureDelayMode int8u & 0x40 + 12.1 AutoBracketSet int8u & 0xc0 + 13.1 TimerFunctionButton int8u & 0x38 + 16.1 AELockButton int8u & 0x38 + 17.1 ShutterReleaseButtonAE-L int8u & 0x02 + 17.2 CommandDialsReverseRotation int8u & 0x80 + 18.1 MeteringTime int8u & 0x70 + 18.2 RemoteOnDuration int8u & 0x03 + 19.1 SelfTimerTime int8u & 0xc0 + 19.2 SelfTimerShotCount int8u & 0x0f + 20.1 ImageReviewTime int8u & 0xe0 + 20.2 LiveViewMonitorOffTime int8u & 0x1c + 21.1 PlaybackMenusTime int8u & 0xe0 + 23.1 ManualFlashOutput int8u & 0x1f + +=head3 NikonCustom SettingsD5200 Tags + +Custom settings for the D5200. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 AF-CPrioritySelection int8u & 0x80 + 0.2 NumberOfFocusPoints int8u & 0x10 + 1.1 AFAssist int8u & 0x01 + 3.1 Beep int8u & 0xc0 + 3.2 NoMemoryCard int8u & 0x20 + 3.3 ISODisplay int8u & 0x08 + 4.1 FileNumberSequence int8u & 0x08 + 5.1 RangeFinder int8u & 0x04 + 5.2 ReverseExposureCompDial int8u & 0x10 + 5.3 ReverseShutterSpeedAperture int8u & 0x08 + 5.4 ReverseIndicators int8u & 0x80 + 6.1 EVStepSize int8u & 0x40 + 10.1 ExposureDelayMode int8u & 0x40 + 12.1 AutoBracketSet int8u & 0xc0 + 13.1 FunctionButton int8u & 0x1f + 16.1 AELockButton int8u & 0x0f + 17.1 ShutterReleaseButtonAE-L int8u & 0x02 + 18.1 StandbyTimer int8u & 0xe0 + 18.2 RemoteOnDuration int8u & 0x03 + 19.1 SelfTimerTime int8u & 0xc0 + 19.2 SelfTimerShotCount int8u & 0x0f + 20.1 ImageReviewTime int8u & 0xe0 + 20.2 LiveViewMonitorOffTime int8u & 0x1c + 21.1 PlaybackMenusTime int8u & 0xe0 + 23.1 InternalFlash int8u & 0xc0 + 23.2 ManualFlashOutput int8u & 0x1f + +=head3 NikonCustom SettingsD7000 Tags + +Custom settings for the D7000. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 AF-CPrioritySelection int8u & 0x80 + 0.2 AF-SPrioritySelection int8u & 0x20 + 0.3 NumberOfFocusPoints int8u & 0x10 + 0.4 FocusTrackingLockOn int8u & 0x07 + 1.1 FocusPointWrap int8u & 0x08 + 1.2 AFPointIllumination int8u & 0x06 + 1.3 AFAssist int8u & 0x01 + 2.1 BatteryOrder int8u & 0x40 + 2.2 AF-OnForMB-D11 int8u & 0x1c + 2.3 MB-D11BatteryType int8u & 0x03 + 3.1 BeepPitch int8u & 0xc0 + 3.2 NoMemoryCard int8u & 0x20 + 3.3 ISODisplay int8u & 0x0c + 3.4 GridDisplay int8u & 0x02 + 3.5 ViewfinderWarning int8u & 0x01 + 4.1 ShootingInfoDisplay int8u & 0xc0 + 4.2 LCDIllumination int8u & 0x20 + 4.3 FileNumberSequence int8u & 0x08 + 4.4 ScreenTips int8u & 0x04 + 4.5 BeepVolume int8u & 0x03 + 5.1 ReverseIndicators int8u & 0x80 + 5.2 EasyExposureCompensation int8u & 0x03 + 6.1 ExposureControlStep int8u & 0x40 + 6.2 ISOSensitivityStep int8u & 0x10 + 7.1 CenterWeightedAreaSize int8u & 0xe0 + 10.1 ExposureDelayMode int8u & 0x40 + 10.2 CLModeShootingSpeed int8u & 0x07 + 11 MaxContinuousRelease int8u + 12.1 AutoBracketSet int8u & 0xe0 + 12.2 AutoBracketOrder int8u & 0x10 + 13.1 FuncButton int8u & 0xf8 + 14.1 PreviewButton int8u & 0xf8 + 15.1 OKButton int8u & 0x18 + 16.1 AELockButton int8u & 0x38 + 17.1 CommandDialsReverseRotation int8u & 0x80 + 17.2 CommandDialsChangeMainSub int8u & 0x60 + 17.3 CommandDialsApertureSetting int8u & 0x04 + 17.4 CommandDialsMenuAndPlayback int8u & 0x18 + 17.5 ShutterReleaseButtonAE-L int8u & 0x02 + 17.6 ReleaseButtonToUseDial int8u & 0x01 + 18.1 MeteringTime int8u & 0xf0 + 18.2 RemoteOnDuration int8u & 0x03 + 19.1 SelfTimerTime int8u & 0xc0 + 19.2 SelfTimerInterval int8u & 0x30 + 19.3 SelfTimerShotCount int8u & 0x0f + 20.1 ImageReviewTime int8u & 0xe0 + 20.2 LiveViewMonitorOffTime int8u & 0x1c + 21.1 MenuMonitorOffTime int8u & 0xe0 + 21.2 ShootingInfoMonitorOffTime int8u & 0x1c + 22.1 FlashSyncSpeed int8u & 0xf0 + 22.2 FlashShutterSpeed int8u & 0x0f + 23.1 FlashControlBuilt-in int8u & 0xc0 + 23.2 ManualFlashOutput int8u & 0x1f + 24.1 RepeatingFlashOutput int8u & 0x70 + 24.2 RepeatingFlashCount int8u & 0x0f + 25.1 RepeatingFlashRate int8u & 0xf0 + 26.1 CommanderInternalTTLCompBuiltin int8u & 0x1f + 27.1 CommanderInternalTTLCompGroupA int8u & 0x1f + 28.1 CommanderInternalTTLCompGroupB int8u & 0x1f + 30.1 FlashWarning int8u & 0x80 + 30.2 ModelingFlash int8u & 0x20 + 34.1 LiveViewAFAreaMode int8u & 0x60 + 34.2 LiveViewAFMode int8u & 0x02 + 35.1 PlaybackMonitorOffTime int8u & 0xe0 + +=head3 NikonCustom SettingsD4 Tags + +Custom settings for the D4 and D4S. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 CustomSettingsBank int8u & 0x03 + 1.1 AF-CPrioritySelection int8u & 0xc0 + 1.2 AF-SPrioritySelection int8u & 0x20 + 1.3 AFPointSelection int8u & 0x10 + 1.4 FocusTrackingLockOn int8u & 0x07 + 2.1 AFActivation int8u & 0x80 + 2.2 FocusPointWrap int8u & 0x08 + 4.1 Pitch int8u & 0x40 + 4.2 NoMemoryCard int8u & 0x20 + 4.3 GridDisplay int8u & 0x02 + 5.1 ShootingInfoDisplay int8u & 0xc0 + 5.2 LCDIllumination int8u & 0x20 + 5.3 ScreenTips int8u & 0x04 + 5.4 Beep int8u & 0x03 + 6.1 ReverseIndicators int8u & 0x80 + 6.2 RearDisplay int8u & 0x40 + 6.3 ViewfinderDisplay int8u & 0x20 + 6.4 CommandDialsReverseRotation int8u & 0x18 + 6.5 EasyExposureCompensation int8u & 0x03 + 7.1 ExposureControlStepSize int8u & 0xc0 + 7.2 ISOStepSize int8u & 0x30 + 7.3 ExposureCompStepSize int8u & 0x0c + 8.1 CenterWeightedAreaSize int8u & 0xe0 + 8.2 FineTuneOptMatrixMetering int8u & 0x0f + 9.1 FineTuneOptCenterWeighted int8u & 0xf0 + 9.2 FineTuneOptSpotMetering int8u & 0x0f + 10.1 MultiSelectorShootMode int8u & 0xc0 + 10.2 MultiSelectorPlaybackMode int8u & 0x30 + 10.3 MultiSelector int8u & 0x01 + 11.1 ExposureDelayMode int8u & 0xc0 + 11.2 CHModeShootingSpeed int8u & 0x10 + 11.3 CLModeShootingSpeed int8u & 0x0f + 12 MaxContinuousRelease int8u + 13.1 AutoBracketSet int8u & 0xe0 + 13.2 AutoBracketOrder int8u & 0x10 + 13.3 AutoBracketModeM int8u & 0x0c + 14.1 FuncButton int8u & 0xf8 + 14.2 FuncButtonPlusDials int8u & 0x07 + 15.1 PreviewButton int8u & 0xf8 + 15.2 PreviewButtonPlusDials int8u & 0x07 + 16.1 AssignBktButton int8u & 0x07 + 18.1 CommandDialsChangeMainSub int8u & 0xe0 + 18.2 CommandDialsMenuAndPlayback int8u & 0x18 + 18.3 CommandDialsApertureSetting int8u & 0x04 + 18.4 ShutterReleaseButtonAE-L int8u & 0x02 + 18.5 ReleaseButtonToUseDial int8u & 0x01 + 19.1 StandbyTimer int8u & 0xf0 + 20.1 SelfTimerTime int8u & 0xc0 + 20.2 SelfTimerShotCount int8u & 0x0f + 20.3 SelfTimerShotInterval int8u & 0x30 + 21.1 ImageReviewMonitorOffTime int8u & 0xe0 + 21.2 LiveViewMonitorOffTime int8u & 0x1c + 22.1 MenuMonitorOffTime int8u & 0xe0 + 22.2 ShootingInfoMonitorOffTime int8u & 0x1c + 23.1 FlashSyncSpeed int8u & 0xf0 + 23.2 FlashShutterSpeed int8u & 0x0f + 31.1 ModelingFlash int8u & 0x20 + 36.1 PlaybackMonitorOffTime int8u & 0xe0 + 37.1 PlaybackZoom int8u & 0x01 + 38.1 ShutterSpeedLock int8u & 0x80 + 38.2 ApertureLock int8u & 0x40 + 38.3 MovieShutterButton int8u & 0x30 + 38.4 FlashExposureCompArea int8u & 0x04 + 41.1 MovieFunctionButton int8u & 0x70 + 41.2 MoviePreviewButton int8u & 0x07 + 42.1 VerticalMultiSelector int8u & 0x60 + 42.2 VerticalFuncButton int8u & 0x1f + 43.1 VerticalFuncButtonPlusDials int8u & 0xf0 + 43.2 AssignMovieRecordButton int8u & 0x07 + 46.1 DynamicAreaAFDisplay int8u & 0x80 + 46.2 AFPointIllumination int8u & 0x60 + 46.3 StoreByOrientation int8u & 0x18 + 46.4 GroupAreaAFIllumination int8u & 0x04 + 46.5 AFPointBrightness int8u & 0x03 + 47.1 AFOnButton int8u & 0x70 + 47.2 VerticalAFOnButton int8u & 0x07 + 48.1 SubSelectorAssignment int8u & 0x80 + 48.2 MovieSubSelectorAssignment int8u & 0x07 + 49.1 SubSelector int8u & 0xf8 + 49.2 SubSelectorPlusDials int8u & 0x07 + 50.1 MatrixMetering int8u & 0x80 + 50.2 LiveViewButtonOptions int8u & 0x30 + 50.3 AFModeRestrictions int8u & 0x03 + 51.1 LimitAFAreaModeSelection int8u & 0x7e + 52.1 MovieFunctionButtonPlusDials int8u & 0x10 + 52.2 MoviePreviewButtonPlusDials int8u & 0x01 + 53.1 MovieSubSelectorAssignmentPlusDials int8u & 0x10 + 54.1 AssignRemoteFnButton int8u & 0x1f + 55.1 LensFocusFunctionButtons int8u & 0x3f + +=head3 NikonCustom SettingsD5 Tags + +Custom settings for the D5. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 CustomSettingsBank int8u & 0x03 + 1.1 AF-CPrioritySelection int8u & 0xc0 + 1.2 AF-SPrioritySelection int8u & 0x20 + 1.3 NumberOfFocusPoints int8u & 0x10 + 1.4 Three-DTrackingFaceDetection int8u & 0x08 + 1.5 BlockShotAFResponse int8u & 0x07 + 2.1 FocusPointWrap int8u & 0x08 + 2.2 AFPointBrightness int8u & 0x06 + 4.1 ISODisplay int8u & 0x08 + 4.2 GridDisplay int8u & 0x02 + 5.1 LCDIllumination int8u & 0x20 + 5.2 ElectronicFront-CurtainShutter int8u & 0x08 + 6.1 ReverseIndicators int8u & 0x80 + 6.2 CommandDialsReverseRotation int8u & 0x18 + 6.3 EasyExposureCompensation int8u & 0x03 + 7.1 ExposureControlStepSize int8u & 0xc0 + 7.2 ISOStepSize int8u & 0x30 + 7.3 ExposureCompStepSize int8u & 0x0c + 8.1 CenterWeightedAreaSize int8u & 0xe0 + 8.2 FineTuneOptMatrixMetering int8u & 0x0f + 9.1 FineTuneOptCenterWeighted int8u & 0xf0 + 9.2 FineTuneOptSpotMetering int8u & 0x0f + 10.1 MultiSelectorShootMode int8u & 0xe0 + 10.3 MultiSelector int8u & 0x01 + 11.1 ExposureDelayMode int8u & 0xc0 + 11.2 CLModeShootingSpeed int8u & 0x0f + 12.1 MaxContinuousRelease int8u + 13.1 AutoBracketOrder int8u & 0x10 + 13.2 AutoBracketModeM int8u & 0x0c + 14.1 Func1Button int8u & 0x3f + 15.1 PreviewButton int8u & 0x3f + 16.1 AssignBktButton int8u & 0x07 + 18.1 CommandDialsChangeMainSub int8u & 0xe0 + 18.2 CommandDialsMenuAndPlayback int8u & 0x18 + 18.3 CommandDialsApertureSetting int8u & 0x04 + 18.4 ReleaseButtonToUseDial int8u & 0x01 + 19.1 StandbyTimer int8u & 0xf0 + 20.1 SelfTimerTime int8u & 0xc0 + 20.2 SelfTimerShotInterval int8u & 0x30 + 20.3 SelfTimerShotCount int8u & 0x0f + 21.1 ImageReviewMonitorOffTime int8u & 0xe0 + 21.2 LiveViewMonitorOffTime int8u & 0x1c + 22.1 MenuMonitorOffTime int8u & 0xe0 + 22.2 ShootingInfoMonitorOffTime int8u & 0x1c + 23.1 FlashSyncSpeed int8u & 0xf0 + 23.2 FlashShutterSpeed int8u & 0x0f + 31.1 ModelingFlash int8u & 0x20 + 36.1 PlaybackMonitorOffTime int8u & 0xe0 + 37.1 MultiSelectorLiveView int8u & 0xc0 + 38.1 ShutterSpeedLock int8u & 0x80 + 38.2 ApertureLock int8u & 0x40 + 38.3 MovieShutterButton int8u & 0x10 + 38.4 FlashExposureCompArea int8u & 0x04 + 38.5 AutoFlashISOSensitivity int8u & 0x02 + 41.1 MovieFunc1Button int8u & 0xf0 + 41.2 MoviePreviewButton int8u & 0x0f + 42.1 Func1ButtonPlusDials int8u & 0x0f + 43.1 PreviewButtonPlusDials int8u & 0x0f + 45.1 AssignMovieRecordButtonPlusDials int8u & 0x0f + 46.1 FineTuneOptHighlightWeighted int8u & 0x0f + 47.1 DynamicAreaAFDisplay int8u & 0x80 + 47.2 AFPointIllumination int8u & 0x40 + 47.3 StoreByOrientation int8u & 0x18 + 48.1 MatrixMetering int8u & 0x80 + 48.2 LiveViewButtonOptions int8u & 0x30 + 48.3 AFModeRestrictions int8u & 0x03 + 49.1 LimitAFAreaModeSelection int8u & 0x7e + 52.1 LensFocusFunctionButtons int8u & 0x3f + 66.1 VerticalMultiSelector int8u & 0xff + 67.1 VerticalFuncButton int8u & 0x3f + 68.1 VerticalFuncPlusDials int8u & 0x0f + 70.1 AF-OnButton int8u & 0x3f + 71.1 SubSelector int8u & 0x80 + 72.1 SubSelectorCenter int8u & 0x3f + 73.1 SubSelectorPlusDials int8u & 0x0f + 74.1 AssignMovieSubselector int8u & 0xf0 + 75.1 AssignMovieFunc1ButtonPlusDials int8u & 0x10 + 75.2 AssignMoviePreviewButtonPlusDials int8u & 0x01 + 76.1 AssignMovieSubselectorPlusDials int8u & 0x10 + 77.1 SyncReleaseMode int8u & 0x80 + 78.1 Three-DTrackingWatchArea int8u & 0x80 + 78.2 SubjectMotion int8u & 0x60 + 78.3 AFActivation int8u & 0x08 + 78.4 ShutterReleaseButtonAE-L int8u & 0x03 + 79.1 VerticalAFOnButton int8u & 0x7f + 80.1 Func2Button int8u & 0x3f + 81.1 Func2ButtonPlusDials int8u & 0x0f + 82.1 AssignMovieFunc2Button int8u & 0x70 + 83.1 Func3Button int8u & 0x03 + +=head3 NikonCustom SettingsD500 Tags + +Custom settings for the D500. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 CustomSettingsBank int8u & 0x03 + 1.1 AF-CPrioritySelection int8u & 0xc0 + 1.2 AF-SPrioritySelection int8u & 0x20 + 1.3 NumberOfFocusPoints int8u & 0x10 + 1.4 Three-DTrackingFaceDetection int8u & 0x08 + 1.5 BlockShotAFResponse int8u & 0x07 + 2.1 FocusPointWrap int8u & 0x08 + 2.2 AFPointBrightness int8u & 0x06 + 4.1 ISODisplay int8u & 0x08 + 4.2 GridDisplay int8u & 0x02 + 5.1 LCDIllumination int8u & 0x20 + 5.2 ElectronicFront-CurtainShutter int8u & 0x08 + 6.1 ReverseIndicators int8u & 0x80 + 6.2 CommandDialsReverseRotation int8u & 0x18 + 6.3 EasyExposureCompensation int8u & 0x03 + 7.1 ExposureControlStepSize int8u & 0xc0 + 7.2 ISOStepSize int8u & 0x30 + 7.3 ExposureCompStepSize int8u & 0x0c + 8.1 CenterWeightedAreaSize int8u & 0xe0 + 8.2 FineTuneOptMatrixMetering int8u & 0x0f + 9.1 FineTuneOptCenterWeighted int8u & 0xf0 + 9.2 FineTuneOptSpotMetering int8u & 0x0f + 10.1 MultiSelectorShootMode int8u & 0xe0 + 10.2 MultiSelectorPlaybackMode int8u & 0x0c + 10.3 MultiSelector int8u & 0x01 + 11.1 ExposureDelayMode int8u & 0xc0 + 11.2 CLModeShootingSpeed int8u & 0x0f + 12.1 MaxContinuousRelease int8u + 13.1 AutoBracketOrder int8u & 0x10 + 13.2 AutoBracketModeM int8u & 0x0c + 14.1 Func1Button int8u & 0x3f + 15.1 PreviewButton int8u & 0x3f + 16.1 AssignBktButton int8u & 0x07 + 18.1 CommandDialsChangeMainSub int8u & 0xe0 + 18.2 CommandDialsMenuAndPlayback int8u & 0x18 + 18.3 CommandDialsApertureSetting int8u & 0x04 + 18.4 ReleaseButtonToUseDial int8u & 0x01 + 19.1 StandbyTimer int8u & 0xf0 + 20.1 SelfTimerTime int8u & 0xc0 + 20.2 SelfTimerShotInterval int8u & 0x30 + 20.3 SelfTimerShotCount int8u & 0x0f + 21.1 ImageReviewMonitorOffTime int8u & 0xe0 + 21.2 LiveViewMonitorOffTime int8u & 0x1c + 22.1 MenuMonitorOffTime int8u & 0xe0 + 22.2 ShootingInfoMonitorOffTime int8u & 0x1c + 23.1 FlashSyncSpeed int8u & 0xf0 + 23.2 FlashShutterSpeed int8u & 0x0f + 31.1 ModelingFlash int8u & 0x20 + 36.1 PlaybackMonitorOffTime int8u & 0xe0 + 37.1 MultiSelectorLiveView int8u & 0xc0 + 38.1 ShutterSpeedLock int8u & 0x80 + 38.2 ApertureLock int8u & 0x40 + 38.3 MovieShutterButton int8u & 0x10 + 38.4 FlashExposureCompArea int8u & 0x04 + 38.5 AutoFlashISOSensitivity int8u & 0x02 + 41.1 MovieFunc1Button int8u & 0xf0 + 41.2 MoviePreviewButton int8u & 0x0f + 42.1 Func1ButtonPlusDials int8u & 0x0f + 43.1 PreviewButtonPlusDials int8u & 0x0f + 45.1 AssignMovieRecordButtonPlusDials int8u & 0x0f + 46.1 FineTuneOptHighlightWeighted int8u & 0x0f + 47.1 DynamicAreaAFDisplay int8u & 0x80 + 47.2 AFPointIllumination int8u & 0x40 + 47.3 StoreByOrientation int8u & 0x18 + 47.4 GroupAreaAFIllumination int8u & 0x04 + 48.1 MatrixMetering int8u & 0x80 + 48.2 LiveViewButtonOptions int8u & 0x30 + 48.3 AFModeRestrictions int8u & 0x03 + 49.1 LimitAFAreaModeSelection int8u & 0x7e + 52.1 LensFocusFunctionButtons int8u & 0x3f + 66.1 VerticalMultiSelector int8u & 0xff + 67.1 AssignMB-D17FuncButton int8u & 0x3f + 68.1 AssignMB-D17FuncButtonPlusDials int8u & 0x0f + 70.1 AF-OnButton int8u & 0x3f + 71.1 SubSelector int8u & 0x80 + 72.1 SubSelectorCenter int8u & 0x3f + 73.1 SubSelectorPlusDials int8u & 0x0f + 74.1 AssignMovieSubselector int8u & 0xf0 + 75.1 AssignMovieFunc1ButtonPlusDials int8u & 0x10 + 75.2 AssignMoviePreviewButtonPlusDials int8u & 0x01 + 76.1 AssignMovieSubselectorPlusDials int8u & 0x10 + 77.1 SyncReleaseMode int8u & 0x80 + 78.1 Three-DTrackingWatchArea int8u & 0x80 + 78.2 SubjectMotion int8u & 0x60 + 78.3 AFActivation int8u & 0x08 + 78.4 ShutterReleaseButtonAE-L int8u & 0x03 + 79.1 AssignMB-D17AF-OnButton int8u & 0x7f + 80.1 Func2Button int8u & 0x3f + 82.1 AssignMovieFunc2Button int8u & 0x70 + +=head3 NikonCustom SettingsD610 Tags + +Custom settings for the D610. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 AF-CPrioritySelection int8u & 0x80 + 0.2 AF-SPrioritySelection int8u & 0x20 + 0.3 NumberOfFocusPoints int8u & 0x10 + 0.4 FocusTrackingLockOn int8u & 0x07 + 1.1 FocusPointWrap int8u & 0x08 + 1.2 AFPointIllumination int8u & 0x06 + 1.3 AFAssist int8u & 0x01 + 5.1 EasyExposureCompensation int8u & 0x03 + 6.1 ExposureControlStep int8u & 0x40 + 6.2 ISOSensitivityStep int8u & 0x10 + 7.1 CenterWeightedAreaSize int8u & 0xe0 + 7.2 FineTuneOptMatrixMetering int8u & 0x0f + 8.1 FineTuneOptCenterWeighted int8u & 0xf0 + 8.2 FineTuneOptSpotMetering int8u & 0x0f + 17.1 ShutterReleaseButtonAE-L int8u & 0x02 + 18.1 StandbyTimer int8u & 0xf0 + 18.2 RemoteOnDuration int8u & 0x03 + 19.1 SelfTimerTime int8u & 0xc0 + 19.2 SelfTimerShotInterval int8u & 0x30 + 19.3 SelfTimerShotCount int8u & 0x0f + 20.1 ImageReviewMonitorOffTime int8u & 0xe0 + 20.2 LiveViewMonitorOffTime int8u & 0x1c + 21.1 MenuMonitorOffTime int8u & 0xe0 + 21.2 ShootingInfoMonitorOffTime int8u & 0x1c + 35.1 PlaybackMonitorOffTime int8u & 0xe0 + +=head3 NikonCustom SettingsZ9 Tags + +Custom settings for the Z9. + + Index1 Tag Name Writable + ------ -------- -------- + 1 CustomSettingsBank int8u + 3 AF-CPrioritySelection int8u + 5 AF-SPrioritySelection int8u + 7 BlockShotAFResponse int8u + 11 AFPointSel int8u + 13 StoreByOrientation int8u + 15 AFActivation int8u + 16 AF-OnOutOfFocusRelease? int8u + 17 LimitAF-AreaModeSelPinpoint? int8u + 19 LimitAF-AreaModeSelWideAF_S? int8u + 20 LimitAF-AreaModeSelWideAF_L? int8u + 21 LimitAFAreaModeSelAuto? int8u + 22 FocusPointWrap? int8u + 23 ManualFocusPointIllumination? int8u + 24 DynamicAreaAFAssist? int8u + 25 AF-AssistIlluminator int8u + 26 ManualFocusRingInAFMode int8u + 27 ExposureControlStepSize int8u + 29 EasyExposureCompensation int8u + 31 CenterWeightedAreaSize int8u + 33 FineTuneOptMatrixMetering int8s + 35 FineTuneOptCenterWeighted int8s + 37 FineTuneOptSpotMetering int8s + 39 FineTuneOptHighlightWeighted int8s + 41 ShutterReleaseButtonAE-L int8u + 43 SelfTimerTime int8u + 45 SelfTimerShotCount int8u + 49 SelfTimerShotInterval int8u + 51 PlaybackMonitorOffTime int8u + 53 MenuMonitorOffTime int8u + 55 ShootingInfoMonitorOffTime int8u + 57 ImageReviewMonitorOffTime int8u + 59 CLModeShootingSpeed int8u + 61 MaxContinuousRelease no + 65 SyncReleaseMode? int8u + 69 LimitSelectableImageAreaDX? int8u + 70 LimitSelectableImageArea1To1? int8u + 71 LimitSelectableImageArea16To9? int8u + 72 FileNumberSequence int8u + 73 FocusPeakingLevel? int8u + 75 FocusPeakingHighlightColor? int8u + 81 ContinuousModeDisplay int8u + 83 FlashSyncSpeed no + 85 HighSpeedSync int8u + 87 FlashShutterSpeed no + 89 FlashExposureCompArea int8u + 91 AutoFlashISOSensitivity int8u + 93 ModelingFlash int8u + 95 AutoBracketModeM int8u + 97 AutoBracketOrder int8u + 99 Func1Button int8u + 115 Func2Button int8u + 131 AFOnButton int8u + 143 SubSelector? int8u + 155 AssignMovieRecordButton? int8u + 159 LensFunc1Button int8u + 167 LensFunc2Button int8u + 173 LensControlRing int8u + 175 MultiSelectorShootMode int8u + 179 MultiSelectorPlaybackMode int8u + 183 ShutterSpeedLock int8u + 184 ApertureLock int8u + 186 CmdDialsReverseRotation int8u + 191 UseDialWithoutHold? int8u + 193 ReverseIndicators? int8u + 195 MovieFunc1Button int8u + 203 MovieAF-OnButton int8u + 217 MovieMultiSelector? int8u + 221 MovieAFSpeed int8u + 223 MovieAFSpeedApply int8u + 225 MovieAFTrackingSensitivity int8u + 257 LCDIllumination? int8u + 258 ExtendedShutterSpeeds int8u + 259 SubjectMotion int8u + 261 FocusPointPersistence int8u + 263 AutoFocusModeRestrictions? int8u + 267 CHModeShootingSpeed int8u + 269.1 LimitReleaseModeSelCL? int8u & 0x02 + 269.2 LimitReleaseModeSelCH? int8u & 0x04 + 269.3 LimitReleaseModeSelC30? int8u & 0x10 + 269.4 LimitReleaseModeSelC120? int8u & 0x40 + 269.5 LimitReleaseModeSelSelf? int8u & 0x80 + 273 FlashBurstPriority? int8u + 277 VerticalFuncButton int8u + 281 Func3Button int8u + 285 VerticalAFOnButton int8u + 293 VerticalMultiSelectorPlaybackMode? int8u + 295 MovieFunc3Button int8u + 335 LimitAF-AreaModeSelDynamic_S? int8u + 336 LimitAF-AreaModeSelDynamic_M? int8u + 337 LimitAF-AreaModeSelDynamic_L? int8u + 339 LimitAF-AreaModeSel3DTracking? int8u + 341 PlaybackFlickUp? int8u + 345 PlaybackFlickDown? int8u + 349 ISOStepSize int8u + 355 ReverseFocusRing int8u + 356 EVFImageFrame? int8u + 357 EVFGrid? int8u + 359 VirtualHorizonStyle? int8u + 373 Func4Button? int8u + 379 AudioButton? int8u + 381 QualityButton? int8u + 399 VerticalMultiSelector? int8u + 421 Func1ButtonPlaybackMode? int8u + 423 Func2ButtonPlaybackMode? int8u + 425 Func3ButtonPlaybackMode? int8u + 431 Func4ButtonPlaybackMode? int8u + 437 MovieRecordButtonPlaybackMode? int8u + 439 VerticalFuncButtonPlaybackMode? int8u + 441 AudioButtonPlaybackMode? int8u + 447 QualityButtonPlaybackMode? int8u + 453 WhiteBalanceButtonPlaybackMode? int8u + 459 CommandDialPlaybackMode? int8u + 463 SubCommandDialPlaybackMode? int8u + 467 FocusPointLock? int8u + 469 ControlRingResponse int8u + 481 VerticalMovieFuncButton? int8u + 505 VerticalMovieAFOnButton? int8u + 515 MovieAFAreaMode? int8u + 527 HDMIViewAssist? int8u + 529 ZebraPatternToneRange? int8u + 531 MovieZebraPattern? int8u + 533 MovieHighlightDisplayThreshold? int8u + 535 MovieMidtoneDisplayValue? int8u + 537 MovieMidtoneDisplayRange? int8u~ + 541 MovieEVFGrid? int8u + 549 MovieShutterSpeedLock? int8u + 550 MovieFocusPointLock? int8u + 563 MatrixMetering? int8u + 564 AF-CFocusDisplay int8u + 565 FocusPeakingDisplay? int8u + 567 KeepExposure int8u + 585 StarlightView? int8u + 587 EVFWarmDisplayMode? int8u + 589 EVFWarmDisplayBrightness? int8s + 591 EVFReleaseIndicator? int8u + 601 MovieApertureLock? int8u + 607 FlickAdvanceDirection? int8u + +=head2 NikonCapture Tags + +This information is written by the Nikon Capture software in tag 0x0e01 of +the maker notes of NEF images. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x8ae85e LCHEditor int8u + 0x83a1a25 HistogramXML undef + 0xc89224b ColorAberrationControl int8u + 0x116fea21 HighlightData NikonCapture HighlightData + 0x2175eb78 D-LightingHQ int8u + 0x2fc08431 StraightenAngle double + 0x374233e0 CropData NikonCapture CropData + 0x39c456ac PictureCtrl NikonCapture PictureCtrl + 0x3cfc73c6 RedEyeData NikonCapture RedEyeData + 0x3d136244 EditVersionName string + 0x416391c6 QuickFix int8u + 0x56a54260 Exposure NikonCapture Exposure + 0x5f0e7d23 ColorBooster int8u + 0x6a6e36b6 D-LightingHQSelected int8u + 0x753dcbc0 NoiseReduction int8u + 0x76a43200 UnsharpMask int8u + 0x76a43201 Curves int8u + 0x76a43202 ColorBalanceAdj int8u + 0x76a43203 AdvancedRaw int8u + 0x76a43204 WhiteBalanceAdj int8u + 0x76a43205 VignetteControl int8u + 0x76a43206 FlipHorizontal int8u + 0x76a43207 Rotation int16u + 0x84589434 BrightnessData NikonCapture Brightness + 0x890ff591 D-LightingHQData NikonCapture DLightingHQ + 0x926f13e0 NoiseReductionData NikonCapture NoiseReduction + 0x9ef5f6e0 IPTCData IPTC + 0xab5eca5e PhotoEffects int8u + 0xac6bd5c0 VignetteControlIntensity int16s + 0xb0384e1e PhotoEffectsData NikonCapture PhotoEffects + 0xb999a36f ColorBoostData NikonCapture ColorBoost + 0xbf3c6c20 WBAdjData NikonCapture WBAdjData + 0xce5554aa D-LightingHS int8u + 0xe2173c47 PictureControl int8u + 0xe37b4337 D-LightingHSData NikonCapture DLightingHS + 0xe42b5161 UnsharpData NikonCapture UnsharpData + 0xe9651831 PhotoEffectHistoryXML undef + 0xfe28a44f AutoRedEye int8u + 0xfe443a45 ImageDustOff int8u + +=head3 NikonCapture HighlightData Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ShadowProtection int8s + 1 SaturationAdj int8s + 6 HighlightProtection int8s + +=head3 NikonCapture CropData Tags + + Index1 Tag Name Writable + ------ -------- -------- + 30 CropLeft double + 38 CropTop double + 46 CropRight double + 54 CropBottom double + 142 CropOutputWidthInches double + 150 CropOutputHeightInches double + 158 CropScaledResolution double + 174 CropSourceResolution double + 182 CropOutputResolution double + 190 CropOutputScale double + 198 CropOutputWidth double + 206 CropOutputHeight double + 214 CropOutputPixels double + +=head3 NikonCapture PictureCtrl Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 PictureControlActive int8u + 19 PictureControlMode string[16] + 42 QuickAdjust int8u + 43 SharpeningAdj int8u + 44 ContrastAdj int8u + 45 BrightnessAdj int8u + 46 SaturationAdj int8u + 47 HueAdj int8u + +=head3 NikonCapture RedEyeData Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 RedEyeCorrection int8u + +=head3 NikonCapture Exposure Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ExposureAdj int16s + 18 ExposureAdj2 double + 36 ActiveD-Lighting int8u + 37 ActiveD-LightingMode int8u + +=head3 NikonCapture Brightness Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 BrightnessAdj double + 8 EnhanceDarkTones int8u + +=head3 NikonCapture DLightingHQ Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 D-LightingHQShadow int32u + 1 D-LightingHQHighlight int32u + 2 D-LightingHQColorBoost int32u + +=head3 NikonCapture NoiseReduction Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 EdgeNoiseReduction int8u + 5 ColorMoireReductionMode int8u + 9 NoiseReductionIntensity int32u + 13 NoiseReductionSharpness int32u + 17 NoiseReductionMethod int16u + 21 ColorMoireReduction int8u + 23 NoiseReduction int8u + 24 ColorNoiseReductionIntensity int32u + 28 ColorNoiseReductionSharpness int32u + +=head3 NikonCapture PhotoEffects Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 PhotoEffectsType int8u + 4 PhotoEffectsRed int16s + 6 PhotoEffectsGreen int16s + 8 PhotoEffectsBlue int16s + +=head3 NikonCapture ColorBoost Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ColorBoostType int8u + 1 ColorBoostLevel int32u + +=head3 NikonCapture WBAdjData Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 WBAdjRedBalance double + 8 WBAdjBlueBalance double + 16 WBAdjMode int8u + 20 WBAdjLighting int16u + 24 WBAdjTemperature int16u + 37 WBAdjTint int32s + +=head3 NikonCapture DLightingHS Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 D-LightingHSAdjustment int32u + 1 D-LightingHSColorBoost int32u + +=head3 NikonCapture UnsharpData Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 UnsharpCount int8u + 19 Unsharp1Color int16u + 23 Unsharp1Intensity int16u + 25 Unsharp1HaloWidth int16u + 27 Unsharp1Threshold int8u + 46 Unsharp2Color int16u + 50 Unsharp2Intensity int16u + 52 Unsharp2HaloWidth int16u + 54 Unsharp2Threshold int8u + 73 Unsharp3Color int16u + 77 Unsharp3Intensity int16u + 79 Unsharp3HaloWidth int16u + 81 Unsharp3Threshold int8u + 100 Unsharp4Color int16u + 104 Unsharp4Intensity int16u + 106 Unsharp4HaloWidth int16u + 108 Unsharp4Threshold int8u + +=head2 Nintendo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x1101 CameraInfo Nintendo CameraInfo + +=head3 Nintendo CameraInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ModelID undef[4] + 8 TimeStamp int32u + 24 InternalSerialNumber undef[4] + 40 Parallax float + 48 Category int16u + +=head2 Olympus Tags + +Tags 0x0000 through 0x0103 are used by some older Olympus cameras, and are +the same as Konica/Minolta tags. These tags are also used for some models +from other brands such as Acer, BenQ, Epson, Hitachi, HP, Maginon, Minolta, +Pentax, Ricoh, Samsung, Sanyo, SeaLife, Sony, Supra and Vivitar. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 MakerNoteVersion undef + 0x0001 MinoltaCameraSettingsOld Minolta CameraSettings + 0x0003 MinoltaCameraSettings Minolta CameraSettings + 0x0040 CompressedImageSize int32u + 0x0081 PreviewImageData no + 0x0088 PreviewImageStart no + 0x0089 PreviewImageLength no + 0x0100 ThumbnailImage undef + 0x0104 BodyFirmwareVersion string + 0x0200 SpecialMode int32u[3]~ + 0x0201 Quality int16u~ + 0x0202 Macro int16u + 0x0203 BWMode int16u + 0x0204 DigitalZoom rational64u + 0x0205 FocalPlaneDiagonal rational64u + 0x0206 LensDistortionParams int16s[6] + 0x0207 CameraType string + 0x0208 TextInfo Olympus TextInfo + 0x0209 CameraID string + 0x020b EpsonImageWidth int32u + 0x020c EpsonImageHeight int32u + 0x020d EpsonSoftware string + 0x0280 PreviewImage int8u + 0x0300 PreCaptureFrames int16u + 0x0301 WhiteBoard int16u + 0x0302 OneTouchWB int16u + 0x0303 WhiteBalanceBracket int16u + 0x0304 WhiteBalanceBias int16u + 0x0400 SensorArea undef[8] + 0x0401 BlackLevel int32u[4] + 0x0403 SceneMode int16u + 0x0404 SerialNumber string + 0x0405 Firmware string + 0x0e00 PrintIM PrintIM + 0x0f00 DataDump no + 0x0f01 DataDump2 no + 0x0f04 ZoomedPreviewStart int32u* + 0x0f05 ZoomedPreviewLength int32u* + 0x0f06 ZoomedPreviewSize int16u[2] + 0x1000 ShutterSpeedValue rational64s + 0x1001 ISOValue rational64s + 0x1002 ApertureValue rational64s + 0x1003 BrightnessValue rational64s + 0x1004 FlashMode int16u + 0x1005 FlashDevice int16u + 0x1006 ExposureCompensation rational64s + 0x1007 SensorTemperature int16s + 0x1008 LensTemperature int16s + 0x1009 LightCondition int16u + 0x100a FocusRange int16u + 0x100b FocusMode int16u + 0x100c ManualFocusDistance rational64u + 0x100d ZoomStepCount int16u + 0x100e FocusStepCount int16u + 0x100f Sharpness int16u + 0x1010 FlashChargeLevel int16u + 0x1011 ColorMatrix int16u[9] + 0x1012 BlackLevel int16u[4] + 0x1013 ColorTemperatureBG? int16u + 0x1014 ColorTemperatureRG? int16u + 0x1015 WBMode int16u[2] + 0x1017 RedBalance int16u[2] + 0x1018 BlueBalance int16u[2] + 0x1019 ColorMatrixNumber int16u + 0x101a SerialNumber string + 0x101b ExternalFlashAE1_0? int32u + 0x101c ExternalFlashAE2_0? int32u + 0x101d InternalFlashAE1_0? int32u + 0x101e InternalFlashAE2_0? int32u + 0x101f ExternalFlashAE1? int32u + 0x1020 ExternalFlashAE2? int32u + 0x1021 InternalFlashAE1? int32u + 0x1022 InternalFlashAE2? int32u + 0x1023 FlashExposureComp rational64s + 0x1024 InternalFlashTable int16u + 0x1025 ExternalFlashGValue rational64s + 0x1026 ExternalFlashBounce int16u + 0x1027 ExternalFlashZoom int16u + 0x1028 ExternalFlashMode int16u + 0x1029 Contrast int16u + 0x102a SharpnessFactor int16u + 0x102b ColorControl int16u[6] + 0x102c ValidBits int16u[2] + 0x102d CoringFilter int16u + 0x102e OlympusImageWidth int32u + 0x102f OlympusImageHeight int32u + 0x1030 SceneDetect int16u + 0x1031 SceneArea? int32u[8] + 0x1033 SceneDetectData? int32u[720] + 0x1034 CompressionRatio rational64u + 0x1035 PreviewImageValid int32u + 0x1036 PreviewImageStart int32u* + 0x1037 PreviewImageLength int32u* + 0x1038 AFResult int16u + 0x1039 CCDScanMode int16u + 0x103a NoiseReduction int16u + 0x103b FocusStepInfinity int16u + 0x103c FocusStepNear int16u + 0x103d LightValueCenter rational64s + 0x103e LightValuePeriphery rational64s + 0x103f FieldCount? int16u + 0x2010 Equipment Olympus Equipment + EquipmentIFD Olympus Equipment + 0x2020 CameraSettings Olympus CameraSettings + CameraSettingsIFD Olympus CameraSettings + 0x2030 RawDevelopment Olympus RawDevelopment + RawDevelopmentIFD Olympus RawDevelopment + 0x2031 RawDev2 Olympus RawDevelopment2 + RawDev2IFD Olympus RawDevelopment2 + 0x2040 ImageProcessing Olympus ImageProcessing + ImageProcessingIFD Olympus ImageProcessing + 0x2050 FocusInfo Olympus FocusInfo + FocusInfoIFD Olympus FocusInfo + CameraParameters undef + 0x2100 Olympus2100 Olympus FE + Olympus2100IFD Olympus FE + 0x2200 Olympus2200 Olympus FE + Olympus2200IFD Olympus FE + 0x2300 Olympus2300 Olympus FE + Olympus2300IFD Olympus FE + 0x2400 Olympus2400 Olympus FE + Olympus2400IFD Olympus FE + 0x2500 Olympus2500 Olympus FE + Olympus2500IFD Olympus FE + 0x2600 Olympus2600 Olympus FE + Olympus2600IFD Olympus FE + 0x2700 Olympus2700 Olympus FE + Olympus2700IFD Olympus FE + 0x2800 Olympus2800 Olympus FE + Olympus2800IFD Olympus FE + 0x2900 Olympus2900 Olympus FE + Olympus2900IFD Olympus FE + 0x3000 RawInfo Olympus RawInfo + RawInfoIFD Olympus RawInfo + 0x4000 MainInfo Olympus + MainInfoIFD Olympus + 0x5000 UnknownInfo Olympus UnknownInfo + UnknownInfoIFD Olympus UnknownInfo + +=head3 Olympus TextInfo Tags + +This information is in text format (similar to APP12 information, but with +spaces instead of linefeeds). Below are tags which have been observed, but +any information found here will be extracted, even if the tag is not listed. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Resolution' Resolution no + 'Type' CameraType no + +=head3 Olympus Equipment Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 EquipmentVersion undef[4] + 0x0100 CameraType2 string[6] + 0x0101 SerialNumber string[32] + 0x0102 InternalSerialNumber string[32] + 0x0103 FocalPlaneDiagonal rational64u + 0x0104 BodyFirmwareVersion int32u + 0x0201 LensType int8u[6] + 0x0202 LensSerialNumber string[32] + 0x0203 LensModel string + 0x0204 LensFirmwareVersion int32u + 0x0205 MaxApertureAtMinFocal int16u + 0x0206 MaxApertureAtMaxFocal int16u + 0x0207 MinFocalLength int16u + 0x0208 MaxFocalLength int16u + 0x020a MaxAperture int16u + 0x020b LensProperties int16u + 0x0301 Extender int8u[6] + 0x0302 ExtenderSerialNumber string[32] + 0x0303 ExtenderModel string + 0x0304 ExtenderFirmwareVersion int32u + 0x0403 ConversionLens string + 0x1000 FlashType int16u + 0x1001 FlashModel int16u + 0x1002 FlashFirmwareVersion int32u + 0x1003 FlashSerialNumber string[32] + +=head3 Olympus CameraSettings Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 CameraSettingsVersion undef[4] + 0x0100 PreviewImageValid int32u + 0x0101 PreviewImageStart int32u* + 0x0102 PreviewImageLength int32u* + 0x0200 ExposureMode int16u + 0x0201 AELock int16u + 0x0202 MeteringMode int16u + 0x0203 ExposureShift rational64s + 0x0204 NDFilter yes + 0x0300 MacroMode int16u + 0x0301 FocusMode int16u[n] + 0x0302 FocusProcess int16u[n] + 0x0303 AFSearch int16u + 0x0304 AFAreas int32u[64]~ + 0x0305 AFPointSelected rational64s[5] + 0x0306 AFFineTune int8u + 0x0307 AFFineTuneAdj int16s[3] + 0x0308 FocusBracketStepSize int8u + 0x0309 AISubjectTrackingMode int16u + 0x0400 FlashMode int16u + 0x0401 FlashExposureComp rational64s + 0x0403 FlashRemoteControl int16u + 0x0404 FlashControlMode int16u[n] + 0x0405 FlashIntensity rational64s[n] + 0x0406 ManualFlashStrength rational64s[n] + 0x0500 WhiteBalance2 int16u + 0x0501 WhiteBalanceTemperature int16u + 0x0502 WhiteBalanceBracket int16s + 0x0503 CustomSaturation int16s[3]~ + 0x0504 ModifiedSaturation int16u + 0x0505 ContrastSetting int16s[3] + 0x0506 SharpnessSetting int16s[3] + 0x0507 ColorSpace int16u + 0x0509 SceneMode int16u + 0x050a NoiseReduction int16u + 0x050b DistortionCorrection int16u + 0x050c ShadingCompensation int16u + 0x050d CompressionFactor rational64u + 0x050f Gradation int16s[n] + 0x0520 PictureMode int16u[n] + 0x0521 PictureModeSaturation int16s[3] + 0x0522 PictureModeHue? int16s + 0x0523 PictureModeContrast int16s[3] + 0x0524 PictureModeSharpness int16s[3] + 0x0525 PictureModeBWFilter int16s + 0x0526 PictureModeTone int16s + 0x0527 NoiseFilter int16s[3] + 0x0529 ArtFilter int16u[4] + 0x052c MagicFilter int16u[4] + 0x052d PictureModeEffect int16s[3] + 0x052e ToneLevel yes + 0x052f ArtFilterEffect int16u[20] + 0x0532 ColorCreatorEffect int16s[6] + 0x0537 MonochromeProfileSettings int16s[6] + 0x0538 FilmGrainEffect int16s + 0x0539 ColorProfileSettings int16s[14] + 0x053a MonochromeVignetting int16s + 0x053b MonochromeColor int16s + 0x0600 DriveMode int16u[n]~ + 0x0601 PanoramaMode int16u~ + 0x0603 ImageQuality2 int16u + 0x0604 ImageStabilization int32u + 0x0804 StackedImage int32u[2] + 0x0900 ManometerPressure int16u + 0x0901 ManometerReading int32s[2] + 0x0902 ExtendedWBDetect int16u + 0x0903 RollAngle int16s[2] + 0x0904 PitchAngle int16s[2] + 0x0908 DateTimeUTC string + +=head3 Olympus RawDevelopment Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 RawDevVersion undef[4] + 0x0100 RawDevExposureBiasValue rational64s + 0x0101 RawDevWhiteBalanceValue int16u + 0x0102 RawDevWBFineAdjustment int16s + 0x0103 RawDevGrayPoint int16u[3] + 0x0104 RawDevSaturationEmphasis int16s[3] + 0x0105 RawDevMemoryColorEmphasis int16u + 0x0106 RawDevContrastValue int16s[3] + 0x0107 RawDevSharpnessValue int16s[3] + 0x0108 RawDevColorSpace int16u + 0x0109 RawDevEngine int16u + 0x010a RawDevNoiseReduction int16u + 0x010b RawDevEditStatus int16u + 0x010c RawDevSettings int16u + +=head3 Olympus RawDevelopment2 Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 RawDevVersion undef[4] + 0x0100 RawDevExposureBiasValue rational64s + 0x0101 RawDevWhiteBalance int16u + 0x0102 RawDevWhiteBalanceValue int16u + 0x0103 RawDevWBFineAdjustment int16s + 0x0104 RawDevGrayPoint int16u[3] + 0x0105 RawDevContrastValue int16s[3] + 0x0106 RawDevSharpnessValue int16s[3] + 0x0107 RawDevSaturationEmphasis int16s[3] + 0x0108 RawDevMemoryColorEmphasis int16u + 0x0109 RawDevColorSpace int16u + 0x010a RawDevNoiseReduction int16u + 0x010b RawDevEngine int16u + 0x010c RawDevPictureMode int16u + 0x010d RawDevPMSaturation int16s[3] + 0x010e RawDevPMContrast int16s[3] + 0x010f RawDevPMSharpness int16s[3] + 0x0110 RawDevPM_BWFilter int16u + 0x0111 RawDevPMPictureTone int16u + 0x0112 RawDevGradation int16s[3] + 0x0113 RawDevSaturation3 int16s[3] + 0x0119 RawDevAutoGradation int16u + 0x0120 RawDevPMNoiseFilter int16u + 0x0121 RawDevArtFilter int16u[4] + +=head3 Olympus ImageProcessing Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 ImageProcessingVersion undef[4] + 0x0100 WB_RBLevels int16u[2] + 0x0102 WB_RBLevels3000K int16u[2] + 0x0103 WB_RBLevels3300K int16u[2] + 0x0104 WB_RBLevels3600K int16u[2] + 0x0105 WB_RBLevels3900K int16u[2] + 0x0106 WB_RBLevels4000K int16u[2] + 0x0107 WB_RBLevels4300K int16u[2] + 0x0108 WB_RBLevels4500K int16u[2] + 0x0109 WB_RBLevels4800K int16u[2] + 0x010a WB_RBLevels5300K int16u[2] + 0x010b WB_RBLevels6000K int16u[2] + 0x010c WB_RBLevels6600K int16u[2] + 0x010d WB_RBLevels7500K int16u[2] + 0x010e WB_RBLevelsCWB1 int16u[2] + 0x010f WB_RBLevelsCWB2 int16u[2] + 0x0110 WB_RBLevelsCWB3 int16u[2] + 0x0111 WB_RBLevelsCWB4 int16u[2] + 0x0113 WB_GLevel3000K int16u + 0x0114 WB_GLevel3300K int16u + 0x0115 WB_GLevel3600K int16u + 0x0116 WB_GLevel3900K int16u + 0x0117 WB_GLevel4000K int16u + 0x0118 WB_GLevel4300K int16u + 0x0119 WB_GLevel4500K int16u + 0x011a WB_GLevel4800K int16u + 0x011b WB_GLevel5300K int16u + 0x011c WB_GLevel6000K int16u + 0x011d WB_GLevel6600K int16u + 0x011e WB_GLevel7500K int16u + 0x011f WB_GLevel int16u + 0x0200 ColorMatrix int16u[9] + 0x0300 Enhancer int16u + 0x0301 EnhancerValues int16u[7] + 0x0310 CoringFilter int16u + 0x0311 CoringValues int16u[7] + 0x0600 BlackLevel2 int16u[4] + 0x0610 GainBase int16u + 0x0611 ValidBits int16u[2] + 0x0612 CropLeft int16u[2] + 0x0613 CropTop int16u[2] + 0x0614 CropWidth int32u + 0x0615 CropHeight int32u + 0x0635 UnknownBlock1? undef + 0x0636 UnknownBlock2? undef + 0x0805 SensorCalibration int16s[2] + 0x1010 NoiseReduction2 int16u + 0x1011 DistortionCorrection2 int16u + 0x1012 ShadingCompensation2 int16u + 0x101c MultipleExposureMode int16u[2] + 0x1103 UnknownBlock3? undef + 0x1104 UnknownBlock4? undef + 0x1112 AspectRatio int8u[2] + 0x1113 AspectFrame int16u[4] + 0x1200 FacesDetected int32u[n] + 0x1201 FaceDetectArea int16s[n] + 0x1202 MaxFaces int32u[3] + 0x1203 FaceDetectFrameSize int16u[6] + 0x1207 FaceDetectFrameCrop int16s[12] + 0x1306 CameraTemperature no + 0x1900 KeystoneCompensation int8u[2] + 0x1901 KeystoneDirection int8u[2] + 0x1906 KeystoneValue int16s[3] + +=head3 Olympus FocusInfo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 FocusInfoVersion undef[4] + 0x0209 AutoFocus? int16u + 0x0210 SceneDetect int16u + 0x0211 SceneArea? int32u[8] + 0x0212 SceneDetectData? int32u[720] + 0x0300 ZoomStepCount int16u + 0x0301 FocusStepCount int16u + 0x0303 FocusStepInfinity int16u + 0x0304 FocusStepNear int16u + 0x0305 FocusDistance rational64u + 0x0308 AFPoint int16u + 0x0328 AFInfo Olympus AFInfo + 0x1201 ExternalFlash int16u[2] + 0x1203 ExternalFlashGuideNumber? rational64s + 0x1204 ExternalFlashBounce int16u + 0x1205 ExternalFlashZoom rational64u + 0x1208 InternalFlash int16u[n] + 0x1209 ManualFlash int16u[2]~ + 0x120a MacroLED int16u + 0x1500 SensorTemperature int16s + 0x1600 ImageStabilization undef~ + +=head3 Olympus AFInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Olympus FE Tags + +Some FE models write a large number of tags here, but most of this +information remains unknown. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0100 BodyFirmwareVersion string + +=head3 Olympus RawInfo Tags + +These tags are found only in ORF images of some models (eg. C8080WZ). + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 RawInfoVersion undef[4] + 0x0100 WB_RBLevelsUsed int16u[2] + 0x0110 WB_RBLevelsAuto int16u[2] + 0x0120 WB_RBLevelsShade int16u[2] + 0x0121 WB_RBLevelsCloudy int16u[2] + 0x0122 WB_RBLevelsFineWeather int16u[2] + 0x0123 WB_RBLevelsTungsten int16u[2] + 0x0124 WB_RBLevelsEveningSunlight int16u[2] + 0x0130 WB_RBLevelsDaylightFluor int16u[2] + 0x0131 WB_RBLevelsDayWhiteFluor int16u[2] + 0x0132 WB_RBLevelsCoolWhiteFluor int16u[2] + 0x0133 WB_RBLevelsWhiteFluorescent int16u[2] + 0x0200 ColorMatrix2 int16u[9] + 0x0310 CoringFilter int16u + 0x0311 CoringValues int16u[11] + 0x0600 BlackLevel2 int16u[4] + 0x0601 YCbCrCoefficients no + 0x0611 ValidPixelDepth int16u[2] + 0x0612 CropLeft int16u + 0x0613 CropTop int16u + 0x0614 CropWidth int32u + 0x0615 CropHeight int32u + 0x1000 LightSource int16u + 0x1001 WhiteBalanceComp int16s[3] + 0x1010 SaturationSetting int16s[3] + 0x1011 HueSetting int16s[3] + 0x1012 ContrastSetting int16s[3] + 0x1013 SharpnessSetting int16s[3] + 0x2000 CMExposureCompensation rational64s + 0x2001 CMWhiteBalance int16u + 0x2002 CMWhiteBalanceComp int16s + 0x2010 CMWhiteBalanceGrayPoint int16u[3] + 0x2020 CMSaturation int16s[3] + 0x2021 CMHue int16s[3] + 0x2022 CMContrast int16s[3] + 0x2023 CMSharpness int16s[3] + +=head3 Olympus UnknownInfo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Olympus DSS Tags + +Information extracted from DSS/DS2 files and the ID3 XOLY frame of MP3 files +written by some Olympus voice recorders. + + Index1 Tag Name Writable + ------ -------- -------- + 12 Model no + 38 StartTime no + 50 EndTime no + 62 Duration no + 798 Comment no + +=head3 Olympus MOV1 Tags + +This information is found in MOV videos from Olympus models such as the +D540Z, D595Z, FE100, FE110, FE115, FE170 and FE200. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 24 Model no + 38 ExposureUnknown? no + 42 FNumber no + 50 ExposureCompensation no + 72 FocalLength no + +=head3 Olympus MOV2 Tags + +This information is found in MOV videos from Olympus models such as the +FE120, FE140 and FE190. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 24 Model no + 54 ExposureTime no + 58 FNumber no + 66 ExposureCompensation no + 88 FocalLength no + 193 ISO no + +=head3 Olympus MP4 Tags + +This information is found in MP4 videos from Olympus models such as the +u7040 and u9010. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 24 Model no + 40 FNumber no + 48 ExposureCompensation no + 104 MovableInfo Olympus MovableInfo + 114 MovableInfo Olympus MovableInfo + +=head3 Olympus MovableInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 ISO no + 44 EncoderVersion no + 60 DecoderVersion no + 131 Thumbnail Olympus Thumbnail + +=head3 Olympus Thumbnail Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 ThumbnailWidth no + 2 ThumbnailHeight no + 3 ThumbnailLength no + 4 ThumbnailOffset no + +=head3 Olympus MOV3 Tags + +QuickTime information found in the TAGS atom of MOV videos from the E-M5. + + Tag ID Tag Name Writable + ------ -------- -------- + 'OLYM' OlympusAtom Olympus OLYM2 + +=head3 Olympus OLYM2 Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'prms' MakerNotes Olympus prms + 'scrn' PreviewInfo Olympus scrn2 + 'thmb' ThumbInfo Olympus thmb2 + +=head3 Olympus prms Tags + +Information extracted from the "prms" atom in MOV videos from Olympus models +such as the OM E-M5. + + Index1 Tag Name Writable + ------ -------- -------- + 18 Make no + 44 Model no + 131 DateTime1 no + 157 DateTime2 no + 383 LensModel no + +=head3 Olympus scrn2 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 2 OlympusPreview Olympus scrn + +=head3 Olympus scrn Tags + +Information extracted from the "scrn" atom of Olympus MP4 videos. + + Index1 Tag Name Writable + ------ -------- -------- + 0 PreviewImageLength no + 4 PreviewImage no + +=head3 Olympus thmb2 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ThumbnailWidth no + 2 ThumbnailHeight no + 4 ThumbnailLength no + 8 ThumbnailImage no + +=head3 Olympus thmb Tags + +Information extracted from the "thmb" atom of Olympus MP4 videos. + + Index1 Tag Name Writable + ------ -------- -------- + 0 ThumbnailLength no + 4 ThumbnailImage no + +=head3 Olympus OLYM Tags + +Tags found in the OLYM atom of MP4 videos from the TG-810. + + Index1 Tag Name Writable + ------ -------- -------- + 14 Make no + 40 Model no + 90 FNumber no + 127 DateTimeOriginal no + 153 DateTime2 no + 265 ThumbnailWidth no + 267 ThumbnailHeight no + +=head3 Olympus AVI Tags + +This information is found in Olympus AVI videos. + + Index1 Tag Name Writable + ------ -------- -------- + 18 Make no + 44 Model no + 94 FNumber no + 131 DateTime1 no + 157 DateTime2 no + 297 ThumbInfo Olympus thmb2 + +=head3 Olympus WAV Tags + +This information is found in WAV files from Olympus PCM linear recorders +like the LS-5, LS-10, LS-11. + + Index1 Tag Name Writable + ------ -------- -------- + 12 Model no + 28 FileNumber no + 38 DateTimeOriginal no + 50 DateTimeEnd no + 62 RecordingTime no + 512 Duration no + 522 Index01 no + 532 Index02 no + 542 Index03 no + 552 Index04 no + 562 Index05 no + 572 Index06 no + 582 Index07 no + 592 Index08 no + 602 Index09 no + 612 Index10 no + 622 Index11 no + 632 Index12 no + 642 Index13 no + 652 Index14 no + 662 Index15 no + 672 Index16 no + +=head2 Panasonic Tags + +These tags are used in Panasonic/Leica cameras. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 ImageQuality int16u + 0x0002 FirmwareVersion undef + 0x0003 WhiteBalance int16u + 0x0007 FocusMode int16u + 0x000f AFAreaMode int8u[2] + 0x001a ImageStabilization int16u + 0x001c MacroMode int16u + 0x001f ShootingMode int16u + 0x0020 Audio int16u + 0x0021 DataDump no + 0x0023 WhiteBalanceBias int16s + 0x0024 FlashBias int16s + 0x0025 InternalSerialNumber undef[16] + 0x0026 PanasonicExifVersion undef + 0x0027 VideoFrameRate int16u + 0x0028 ColorEffect int16u + 0x0029 TimeSincePowerOn int32u + 0x002a BurstMode int16u + 0x002b SequenceNumber int32u + 0x002c ContrastMode int16u + 0x002d NoiseReduction int16u + 0x002e SelfTimer int16u + 0x0030 Rotation int16u + 0x0031 AFAssistLamp int16u + 0x0032 ColorMode int16u + 0x0033 BabyAge string + 0x0034 OpticalZoomMode int16u + 0x0035 ConversionLens int16u + 0x0036 TravelDay int16u + 0x0038 BatteryLevel int16u + 0x0039 Contrast int16u + 0x003a WorldTimeLocation int16u + 0x003b TextStamp int16u + 0x003c ProgramISO int16u + 0x003d AdvancedSceneType int16u + 0x003e TextStamp int16u + 0x003f FacesDetected int16u + 0x0040 Saturation int16u + 0x0041 Sharpness int16u + 0x0042 FilmMode int16u + 0x0043 JPEGQuality int16u + 0x0044 ColorTempKelvin int16u + 0x0045 BracketSettings int16u + 0x0046 WBShiftAB int16u + 0x0047 WBShiftGM int16u + 0x0048 FlashCurtain int16u + 0x0049 LongExposureNoiseReduction int16u + 0x004b PanasonicImageWidth int32u + 0x004c PanasonicImageHeight int32u + 0x004d AFPointPosition rational64u[2] + 0x004e FaceDetInfo Panasonic FaceDetInfo + 0x0051 LensType string + 0x0052 LensSerialNumber string + 0x0053 AccessoryType string + 0x0054 AccessorySerialNumber string + 0x0059 Transform undef[4] + 0x005d IntelligentExposure int16u + 0x0060 LensFirmwareVersion undef[4] + 0x0061 FaceRecInfo Panasonic FaceRecInfo + 0x0062 FlashWarning int16u + 0x0063 RecognizedFaceFlags? undef[4] + 0x0065 Title undef + 0x0066 BabyName undef + 0x0067 Location undef + 0x0069 Country undef + 0x006b State undef + 0x006d City undef + 0x006f Landmark undef + 0x0070 IntelligentResolution int8u + 0x0076 HDRShot int16u + 0x0077 BurstSpeed int16u + 0x0079 IntelligentD-Range int16u + 0x007c ClearRetouch int16u + 0x0080 City2 undef + 0x0086 ManometerPressure int16u + 0x0089 PhotoStyle int16u + 0x008a ShadingCompensation int16u + 0x008b WBShiftIntelligentAuto int16u + 0x008c AccelerometerZ int16u + 0x008d AccelerometerX int16u + 0x008e AccelerometerY int16u + 0x008f CameraOrientation int8u + 0x0090 RollAngle int16u + 0x0091 PitchAngle int16u + 0x0092 WBShiftCreativeControl int8u + 0x0093 SweepPanoramaDirection int8u + 0x0094 SweepPanoramaFieldOfView int16u + 0x0096 TimerRecording int8u + 0x009d InternalNDFilter rational64u + 0x009e HDR int16u + 0x009f ShutterType int16u + 0x00a1 FilterEffect rational64u[0.5] + 0x00a3 ClearRetouchValue rational64u + 0x00a7 OutputLUT yes + 0x00ab TouchAE int16u + 0x00ac MonochromeFilterEffect int16u + 0x00ad HighlightShadow int16u[2] + 0x00af TimeStamp string + 0x00b3 VideoBurstResolution int16u + 0x00b4 MultiExposure int16u + 0x00b9 RedEyeRemoval int16u + 0x00bb VideoBurstMode int32u + 0x00bc DiffractionCorrection int16u + 0x00bd FocusBracket int16u + 0x00be LongExposureNRUsed int16u + 0x00bf PostFocusMerging int32u[2] + 0x00c1 VideoPreburst int16u + 0x00c4 LensTypeMake int16u + 0x00c5 LensTypeModel int16u + 0x00ca SensorType int16u + 0x00d1 ISO int32u + 0x00d2 MonochromeGrainEffect int16u + 0x00d6 NoiseReductionStrength rational64s + 0x00e4 LensTypeModel int16u + 0x0e00 PrintIM PrintIM + 0x2003 TimeInfo Panasonic TimeInfo + 0x8000 MakerNoteVersion undef + 0x8001 SceneMode int16u + 0x8002 HighlightWarning int16u + 0x8003 DarkFocusEnvironment int16u + 0x8004 WBRedLevel int16u + 0x8005 WBGreenLevel int16u + 0x8006 WBBlueLevel int16u + 0x8008 TextStamp int16u + 0x8009 TextStamp int16u + 0x8010 BabyAge string + 0x8012 Transform undef[4] + +=head3 Panasonic FaceDetInfo Tags + +Face detection position information. + + Index2 Tag Name Writable + ------ -------- -------- + 0 NumFacePositions int16u + 1 Face1Position int16u[4] + 5 Face2Position int16u[4] + 9 Face3Position int16u[4] + 13 Face4Position int16u[4] + 17 Face5Position int16u[4] + +=head3 Panasonic FaceRecInfo Tags + +Tags written by cameras with facial recognition. These cameras not only +detect faces in an image, but also recognize specific people based a +user-supplied set of known faces. + + Index1 Tag Name Writable + ------ -------- -------- + 0 FacesRecognized int16u + 4 RecognizedFace1Name string[20] + 24 RecognizedFace1Position int16u[4] + 32 RecognizedFace1Age string[20] + 52 RecognizedFace2Name string[20] + 72 RecognizedFace2Position int16u[4] + 80 RecognizedFace2Age string[20] + 100 RecognizedFace3Name string[20] + 120 RecognizedFace3Position int16u[4] + 128 RecognizedFace3Age string[20] + +=head3 Panasonic TimeInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 PanasonicDateTime undef[8] + 16 TimeLapseShotNumber int32u + +=head3 Panasonic Leica2 Tags + +These tags are used by the Leica M8. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0300 Quality int16u + 0x0302 UserProfile int32u + 0x0303 SerialNumber int32u + 0x0304 WhiteBalance int16u + 0x0310 LensType int32u + 0x0311 ExternalSensorBrightnessValue rational64s + 0x0312 MeasuredLV rational64s + 0x0313 ApproximateFNumber rational64u + 0x0320 CameraTemperature int32s + 0x0321 ColorTemperature int32u + 0x0322 WBRedLevel rational64u + 0x0323 WBGreenLevel rational64u + 0x0324 WBBlueLevel rational64u + 0x0325 UV-IRFilterCorrection int32u + 0x0330 CCDVersion int32u + 0x0331 CCDBoardVersion int32u + 0x0332 ControllerBoardVersion int32u + 0x0333 M16CVersion int32u + 0x0340 ImageIDNumber int32u + +=head3 Panasonic Leica3 Tags + +These tags are used by the Leica R8 and R9 digital backs. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x000b SerialInfo Panasonic SerialInfo + 0x000d WB_RGBLevels int16u[3] + +=head3 Panasonic SerialInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 SerialNumber no + +=head3 Panasonic Leica4 Tags + +This information is written by the M9. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x3000 Subdir3000 Panasonic Subdir + 0x3100 Subdir3100 Panasonic Subdir + 0x3400 Subdir3400 Panasonic Subdir + 0x3900 Subdir3900 Panasonic Subdir + +=head3 Panasonic Subdir Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x300a Contrast int32u + 0x300b Sharpening int32u + 0x300d Saturation int32u + 0x3033 WhiteBalance int32u + 0x3034 JPEGQuality int32u + 0x3036 WB_RGBLevels rational64u[3] + 0x3038 UserProfile string + 0x303a JPEGSize int32u + 0x3103 SerialNumber string + 0x3109 FirmwareVersion string + 0x312a BaseISO int32u + 0x312b SensorWidth int32u + 0x312c SensorHeight int32u + 0x312d SensorBitDepth int32u + 0x3402 CameraTemperature int32s + 0x3405 LensType int32u + 0x3406 ApproximateFNumber rational64u + 0x3407 MeasuredLV int32s + 0x3408 ExternalSensorBrightnessValue int32s + 0x3901 Data1 Panasonic Data1 + 0x3902 Data2 Panasonic Data2 + +=head3 Panasonic Data1 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 22 LensType int32u + +=head3 Panasonic Data2 Tags + + Index1 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Panasonic Leica5 Tags + +This information is written by the X1, X2, X VARIO and T. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0303 LensType string + 0x0305 SerialNumber int32u + 0x0407 OriginalFileName string + 0x0408 OriginalDirectory string + 0x040a FocusInfo Panasonic FocusInfo + 0x040d ExposureMode int8u[4] + 0x0410 ShotInfo Panasonic ShotInfo + 0x0412 FilmMode string + 0x0413 WB_RGBLevels rational64u[3] + 0x0500 InternalSerialNumber undef + +=head3 Panasonic FocusInfo Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 FocusDistance int16u + 1 FocalLength int16u + +=head3 Panasonic ShotInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 FileIndex int16u + +=head3 Panasonic Leica6 Tags + +This information is written by the S2 and M (Typ 240), as a trailer in JPEG +images. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0300 PreviewImage undef + 0x0301 UnknownBlock? no + 0x0303 LensType string + 0x0304 FocusDistance int32u + 0x0311 ExternalSensorBrightnessValue rational64s + 0x0312 MeasuredLV rational64s + 0x0320 FirmwareVersion int8u[4] + 0x0321 LensSerialNumber int32u + +=head3 Panasonic Leica9 Tags + +This information is written by the Leica S (Typ 007) and M10 models. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0304 FocusDistance int32u + 0x0311 ExternalSensorBrightnessValue rational64s + 0x0312 MeasuredLV rational64s + 0x034c UserProfile string + 0x0359 ISOSelected int32s + 0x035a FNumber int32s + 0x035b CorrelatedColorTemp int16u + 0x035c ColorTint int16s + 0x035d WhitePoint rational64u[2] + +=head3 Panasonic Type2 Tags + +This type of maker notes is used by models such as the NV-DS65, PV-D2002, +PV-DC3000, PV-DV203, PV-DV401, PV-DV702, PV-L2001, PV-SD4090, PV-SD5000 and +iPalm. + + Index2 Tag Name Writable + ------ -------- -------- + 0 MakerNoteType no + 3 Gain no + +=head3 Panasonic PANA Tags + +Tags extracted from the PANA and LEIC user data found in MP4 videos from +various Panasonic and Leica models. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 4 Model no + 12 Model no + 16 JPEG-likeData EXIF + 22 Model no + 52 Version1 no + 62 Version2 no + 80 MakerNoteLeica5 Panasonic Leica5 + 88 ThumbnailWidth no + 90 ThumbnailHeight no + 92 ThumbnailImage no + 1334 ThumbnailWidth no + 1338 ThumbnailHeight no + 1342 ThumbnailLength no + 1350 ThumbnailImage no + 1358 ThumbnailWidth no + 1362 ThumbnailHeight no + 1366 ThumbnailLength no + 1374 ThumbnailImage no + 16488 ExifData EXIF + 16512 ExifData EXIF + 0x00200080 ExifData EXIF + +=head2 Pentax Tags + +These tags are used in Pentax/Asahi cameras. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 PentaxVersion int8u[4] + 0x0001 PentaxModelType int16u + 0x0002 PreviewImageSize int16u[2] + 0x0003 PreviewImageLength int32u* + 0x0004 PreviewImageStart int32u* + 0x0005 PentaxModelID int32u + 0x0006 Date undef[4] + 0x0007 Time undef[3] + 0x0008 Quality int16u + 0x0009 PentaxImageSize int16u + 0x000b PictureMode int16u[n] + 0x000c FlashMode int16u[n] + 0x000d FocusMode int16u + 0x000e AFPointSelected int16u + 0x000f AFPointsInFocus int32u + AFPointsInFocus int16u + 0x0010 FocusPosition int16u + 0x0012 ExposureTime int32u + 0x0013 FNumber int16u + 0x0014 ISO int16u + 0x0015 LightReading int16u + 0x0016 ExposureCompensation int16u + ExposureCompensation int16u[2] + 0x0017 MeteringMode int16u + 0x0018 AutoBracketing int16u[n] + 0x0019 WhiteBalance int16u + 0x001a WhiteBalanceMode int16u + 0x001b BlueBalance int16u + 0x001c RedBalance int16u + 0x001d FocalLength int32u + 0x001e DigitalZoom int16u + 0x001f Saturation int16u[n] + 0x0020 Contrast int16u[n] + 0x0021 Sharpness int16u[n] + 0x0022 WorldTimeLocation int16u + 0x0023 HometownCity int16u + 0x0024 DestinationCity int16u + 0x0025 HometownDST int16u + 0x0026 DestinationDST int16u + 0x0027 DSPFirmwareVersion undef + 0x0028 CPUFirmwareVersion undef + 0x0029 FrameNumber int32u + 0x002d EffectiveLV int16u + EffectiveLV int32u + 0x0032 ImageEditing undef[4] + 0x0033 PictureMode int8u[3] + 0x0034 DriveMode int8u[4] + 0x0035 SensorSize int16u[2] + 0x0037 ColorSpace int16u + 0x0038 ImageAreaOffset int16u[2] + 0x0039 RawImageSize int16u[2]~ + 0x003c AFPointsInFocus no + 0x003d DataScaling int16u + 0x003e PreviewImageBorders int8u[4] + 0x003f LensRec Pentax LensRec + 0x0040 SensitivityAdjust int16u + 0x0041 ImageEditCount int16u + 0x0047 CameraTemperature int8s + 0x0048 AELock int16u + 0x0049 NoiseReduction int16u + 0x004d FlashExposureComp int32s + FlashExposureComp int8s[2] + 0x004f ImageTone int16u + 0x0050 ColorTemperature int16u + 0x0053 ColorTempDaylight undef[4] + 0x0054 ColorTempShade undef[4] + 0x0055 ColorTempCloudy undef[4] + 0x0056 ColorTempTungsten undef[4] + 0x0057 ColorTempFluorescentD undef[4] + 0x0058 ColorTempFluorescentN undef[4] + 0x0059 ColorTempFluorescentW undef[4] + 0x005a ColorTempFlash undef[4] + 0x005c ShakeReductionInfo Pentax SRInfo + Pentax SRInfo2 + 0x005d ShutterCount undef[4] + 0x0060 FaceInfo Pentax FaceInfo + 0x0062 RawDevelopmentProcess int16u + 0x0067 Hue int16u + 0x0068 AWBInfo Pentax AWBInfo + 0x0069 DynamicRangeExpansion undef[4] + 0x006b TimeInfo Pentax TimeInfo + 0x006c HighLowKeyAdj int16s[2] + 0x006d ContrastHighlight int16s[2] + 0x006e ContrastShadow int16s[2] + 0x006f ContrastHighlightShadowAdj int8u + 0x0070 FineSharpness int8u[n] + 0x0071 HighISONoiseReduction int8u + 0x0072 AFAdjustment int16s + 0x0073 MonochromeFilterEffect int16u + 0x0074 MonochromeToning int16u + 0x0076 FaceDetect int8u[2] + 0x0077 FaceDetectFrameSize int16u[2] + 0x0079 ShadowCorrection int8u[n] + 0x007a ISOAutoParameters int8u[2] + 0x007b CrossProcess int8u + 0x007d LensCorr Pentax LensCorr + 0x007e WhiteLevel int32u + 0x007f BleachBypassToning int16u + 0x0080 AspectRatio yes + 0x0082 BlurControl int8u[4] + 0x0085 HDR int8u[4] + 0x0087 ShutterType int8u + 0x0088 NeutralDensityFilter int8u[n] + 0x008b ISO int32u + 0x0092 IntervalShooting int16u[2] + 0x0095 SkinToneCorrection int8s[2] + SkinToneCorrection int8s[3] + 0x0096 ClarityControl int8s[2] + 0x0200 BlackPoint int16u[4] + 0x0201 WhitePoint int16u[4] + 0x0203 ColorMatrixA int16s[9] + 0x0204 ColorMatrixB int16s[9] + 0x0205 CameraSettings Pentax CameraSettings + CameraSettingsUnknown Pentax CameraSettingsUnknown + 0x0206 AEInfo Pentax AEInfo + AEInfo2 Pentax AEInfo2 + AEInfo3 Pentax AEInfo3 + AEInfoUnknown Pentax AEInfoUnknown + 0x0207 LensInfo Pentax LensInfo + Pentax LensInfo2 + Pentax LensInfo3 + Pentax LensInfo4 + Pentax LensInfo5 + 0x0208 FlashInfo Pentax FlashInfo + FlashInfoUnknown Pentax FlashInfoUnknown + 0x0209 AEMeteringSegments int8u[n] + 0x020a FlashMeteringSegments int8u[n] + 0x020b SlaveFlashMeteringSegments int8u[n] + 0x020d WB_RGGBLevelsDaylight int16u[4] + 0x020e WB_RGGBLevelsShade int16u[4] + 0x020f WB_RGGBLevelsCloudy int16u[4] + 0x0210 WB_RGGBLevelsTungsten int16u[4] + 0x0211 WB_RGGBLevelsFluorescentD int16u[4] + 0x0212 WB_RGGBLevelsFluorescentN int16u[4] + 0x0213 WB_RGGBLevelsFluorescentW int16u[4] + 0x0214 WB_RGGBLevelsFlash int16u[4] + 0x0215 CameraInfo Pentax CameraInfo + 0x0216 BatteryInfo Pentax BatteryInfo + 0x021b SaturationInfo? no + 0x021c ColorMatrixA2 undef[18] + 0x021d ColorMatrixB2 undef[18] + 0x021f AFInfo Pentax AFInfo + 0x0220 HuffmanTable? no + 0x0221 KelvinWB Pentax KelvinWB + 0x0222 ColorInfo Pentax ColorInfo + 0x0224 EVStepInfo Pentax EVStepInfo + 0x0226 ShotInfo Pentax ShotInfo + 0x0227 FacePos Pentax FacePos + 0x0228 FaceSize Pentax FaceSize + 0x0229 SerialNumber string + 0x022a FilterInfo Pentax FilterInfo + Pentax FilterInfo + 0x022b LevelInfo Pentax LevelInfo + 0x022d WBLevels Pentax WBLevels + 0x022e Artist string + 0x022f Copyright string + 0x0230 FirmwareVersion string + 0x0231 ContrastDetectAFArea int16u[4] + 0x0235 CrossProcessParams undef[10] + 0x0239 LensInfoQ Pentax LensInfoQ + 0x023f Model string + 0x0243 PixelShiftInfo Pentax PixelShiftInfo + 0x0245 AFPointInfo Pentax AFPointInfo + 0x03fe DataDump no + 0x03ff TempInfo Pentax TempInfo + UnknownInfo Pentax UnknownInfo + 0x0402 ToneCurve yes~ + 0x0403 ToneCurves yes~ + 0x0405 UnknownBlock? undef + 0x0e00 PrintIM PrintIM + +=head3 Pentax LensRec Tags + +This record stores the LensType, plus one or two unknown bytes for some +models. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensType int8u[2] + 3 ExtenderStatus int8u + +=head3 Pentax SRInfo Tags + +Shake reduction information. + + Index1 Tag Name Writable + ------ -------- -------- + 0 SRResult int8u + 1 ShakeReduction int8u + 2 SRHalfPressTime int8u + 3 SRFocalLength int8u + +=head3 Pentax SRInfo2 Tags + +Shake reduction information for the K-3. + + Index1 Tag Name Writable + ------ -------- -------- + 0 SRResult? int8u + 1 ShakeReduction int8u + +=head3 Pentax FaceInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 FacesDetected int8u + 2 FacePosition int8u[2] + +=head3 Pentax AWBInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 WhiteBalanceAutoAdjustment int8u + 1 TungstenAWB int8u + +=head3 Pentax TimeInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 WorldTimeLocation int8u & 0x01 + 0.2 HometownDST int8u & 0x02 + 0.3 DestinationDST int8u & 0x04 + 2 HometownCity int8u + 3 DestinationCity int8u + +=head3 Pentax LensCorr Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 DistortionCorrection int8u + 1 ChromaticAberrationCorrection int8u + 2 PeripheralIlluminationCorr int8u + 3 DiffractionCorrection int8u + +=head3 Pentax CameraSettings Tags + +Camera settings information written by Pentax DSLR cameras. + + Index1 Tag Name Writable + ------ -------- -------- + 0 PictureMode2 int8u + 1.1 ProgramLine int8u & 0x03 + 1.2 EVSteps int8u & 0x20 + 1.3 E-DialInProgram int8u & 0x40 + 1.4 ApertureRingUse int8u & 0x80 + 2 FlashOptions int8u & 0xf0 + 2.1 MeteringMode2 int8u & 0x0f + 3 AFPointMode int8u & 0xf0 + 3.1 FocusMode2 int8u & 0x0f + 4 AFPointSelected2 int16u + 6 ISOFloor int8u + 7 DriveMode2 int8u + 8 ExposureBracketStepSize int8u + 9 BracketShotNumber int8u + 10 WhiteBalanceSet int8u & 0xf0 + 10.1 MultipleExposureSet int8u & 0x0f + 13 RawAndJpgRecording int8u + 14.1 JpgRecordedPixels int8u & 0x03 + 14.2 LinkAEToAFPoint int8u & 0x01 + 14.3 SensitivitySteps int8u & 0x02 + 14.4 ISOAuto int8u & 0x04 + 16 FlashOptions2 int8u & 0xf0 + 16.1 MeteringMode3 int8u & 0x0f + 17.1 SRActive int8u & 0x80 + 17.2 Rotation int8u & 0x60 + 17.3 ISOSetting int8u & 0x04 + 17.4 SensitivitySteps int8u & 0x02 + 18 TvExposureTimeSetting int8u + 19 AvApertureSetting int8u + 20 SvISOSetting int8u + 21 BaseExposureCompensation int8u + +=head3 Pentax CameraSettingsUnknown Tags + +This information has not yet been decoded for models such as the K-01. + + Index1 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Pentax AEInfo Tags + +Auto-exposure information for most Pentax models. + + Index1 Tag Name Writable + ------ -------- -------- + 0 AEExposureTime int8u + 1 AEAperture int8u + 2 AE_ISO int8u + 3 AEXv int8u + 4 AEBXv int8s + 5 AEMinExposureTime int8u + 6 AEProgramMode int8u + 7 AEFlags no + 8 AEApertureSteps int8u + 9 AEMaxAperture int8u + 10 AEMaxAperture2 int8u + 11 AEMinAperture int8u + 12 AEMeteringMode int8u + 13 AEWhiteBalance int8u & 0xf0 + 13.1 AEMeteringMode2 int8u & 0x0f + 14 FlashExposureCompSet int8s + 21 LevelIndicator int8u + +=head3 Pentax AEInfo2 Tags + +Auto-exposure information for the K-01. + + Index1 Tag Name Writable + ------ -------- -------- + 2 AEExposureTime int8u + 3 AEAperture int8u + 4 AE_ISO int8u + 5 AEXv int8u + 6 AEBXv int8s + 8 AEError int8s + 11 AEApertureSteps int8u + 15 SceneMode int8u + 16 AEMaxAperture int8u + 17 AEMaxAperture2 int8u + 18 AEMinAperture int8u + 19 AEMinExposureTime int8u + +=head3 Pentax AEInfo3 Tags + +Auto-exposure information for the K-3, K-30, K-50 and K-500. + + Index1 Tag Name Writable + ------ -------- -------- + 16 AEExposureTime int8u + 17 AEAperture int8u + 18 AE_ISO int8u + 28 AEMaxAperture int8u + 29 AEMaxAperture2 int8u + 30 AEMinAperture int8u + 31 AEMinExposureTime int8u + +=head3 Pentax AEInfoUnknown Tags + + Index1 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Pentax LensInfo Tags + +Pentax lens information structure for models such as the *istD. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensType int8u[2] + 3 LensData Pentax LensData + +=head3 Pentax LensInfo2 Tags + +Pentax lens information structure for models such as the K10D and K20D. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensType int8u[4] + 4 LensData Pentax LensData + +=head3 Pentax LensData Tags + +Pentax lens data information. Some of these tags require interesting binary +gymnastics to decode them into useful values. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 AutoAperture int8u & 0x01 + 0.2 MinAperture int8u & 0x06 + 0.3 LensFStops int8u & 0x70 + 1 LensKind? int8u + 2 LC1? int8u + 3 MinFocusDistance int8u & 0xf8 + 3.1 FocusRangeIndex int8u & 0x07 + 4 LC3? int8u + 5 LC4? int8u + 6 LC5? int8u + 7 LC6? int8u + 8 LC7? int8u + 9 LensFocalLength int8u + LC8? int8u + 10 NominalMaxAperture int8u & 0xf0 + 10.1 NominalMinAperture int8u & 0x0f + 11 LC10? int8u + 12 LC11? int8u + 13 LC12? int8u + 14.1 MaxAperture int8u & 0x7f + 15 LC14? int8u + 16 LC15? int8u + +=head3 Pentax LensInfo3 Tags + +Pentax lens information structure for 645D. + + Index1 Tag Name Writable + ------ -------- -------- + 1 LensType int8u[4] + 13 LensData Pentax LensData + +=head3 Pentax LensInfo4 Tags + +Pentax lens information structure for models such as the K-5 and K-r. + + Index1 Tag Name Writable + ------ -------- -------- + 1 LensType int8u[4] + 12 LensData Pentax LensData + +=head3 Pentax LensInfo5 Tags + +Pentax lens information structure for the K-01 and newer models. + + Index1 Tag Name Writable + ------ -------- -------- + 1 LensType int8u[5] + 15 LensData Pentax LensData + +=head3 Pentax FlashInfo Tags + +Flash information tags for the K10D, K20D and K200D. + + Index1 Tag Name Writable + ------ -------- -------- + 0 FlashStatus int8u + 1 InternalFlashMode int8u + 2 ExternalFlashMode int8u + 3 InternalFlashStrength int8u + 4 TTL_DA_AUp int8u + 5 TTL_DA_ADown int8u + 6 TTL_DA_BUp int8u + 7 TTL_DA_BDown int8u + 24.1 ExternalFlashGuideNumber int8u & 0x1f + 25 ExternalFlashExposureComp int8u + 26 ExternalFlashBounce int8u + +=head3 Pentax FlashInfoUnknown Tags + + Index1 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Pentax CameraInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 PentaxModelID int32u + 1 ManufactureDate int32u + 2 ProductionCode int32u[2] + 4 InternalSerialNumber int32u + +=head3 Pentax BatteryInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 PowerSource int8u & 0x0f + 1.1 BodyBatteryState int8u & 0xf0 + 1.2 GripBatteryState int8u & 0x0f + GripBatteryState? int8u & 0x0f + 2 BodyBatteryADNoLoad int8u + BodyBatteryVoltage1 int16u + 3 BodyBatteryADLoad int8u + 4 GripBatteryADNoLoad int8u + BodyBatteryVoltage2 int16u + 5 GripBatteryADLoad int8u + 6 BodyBatteryVoltage3 int16u + 8 BodyBatteryVoltage4 int16u + +=head3 Pentax AFInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 AFPointsUnknown1? int16u + 2 AFPointsUnknown2? int16u + 4 AFPredictor int16s + 6 AFDefocus int8u + 7 AFIntegrationTime int8u + 11 AFPointsInFocus int8u + 509 AFHold int8u + +=head3 Pentax KelvinWB Tags + +White balance Blue/Red gains as a function of color temperature. + + Index2 Tag Name Writable + ------ -------- -------- + 1 KelvinWB_Daylight int16u[4] + 5 KelvinWB_01 int16u[4] + 9 KelvinWB_02 int16u[4] + 13 KelvinWB_03 int16u[4] + 17 KelvinWB_04 int16u[4] + 21 KelvinWB_05 int16u[4] + 25 KelvinWB_06 int16u[4] + 29 KelvinWB_07 int16u[4] + 33 KelvinWB_08 int16u[4] + 37 KelvinWB_09 int16u[4] + 41 KelvinWB_10 int16u[4] + 45 KelvinWB_11 int16u[4] + 49 KelvinWB_12 int16u[4] + 53 KelvinWB_13 int16u[4] + 57 KelvinWB_14 int16u[4] + 61 KelvinWB_15 int16u[4] + 65 KelvinWB_16 int16u[4] + +=head3 Pentax ColorInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 16 WBShiftAB int8s + 17 WBShiftGM int8s + +=head3 Pentax EVStepInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 EVSteps int8u + 1 SensitivitySteps int8u + +=head3 Pentax ShotInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1 CameraOrientation int8u + +=head3 Pentax FacePos Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 Face1Position int16u[2] + 2 Face2Position int16u[2] + 4 Face3Position int16u[2] + 6 Face4Position int16u[2] + 8 Face5Position int16u[2] + 10 Face6Position int16u[2] + 12 Face7Position int16u[2] + 14 Face8Position int16u[2] + 16 Face9Position int16u[2] + 18 Face10Position int16u[2] + 20 Face11Position int16u[2] + 22 Face12Position int16u[2] + 24 Face13Position int16u[2] + 26 Face14Position int16u[2] + 28 Face15Position int16u[2] + 30 Face16Position int16u[2] + 32 Face17Position int16u[2] + 34 Face18Position int16u[2] + 36 Face19Position int16u[2] + 38 Face20Position int16u[2] + 40 Face21Position int16u[2] + 42 Face22Position int16u[2] + 44 Face23Position int16u[2] + 46 Face24Position int16u[2] + 48 Face25Position int16u[2] + 50 Face26Position int16u[2] + 52 Face27Position int16u[2] + 54 Face28Position int16u[2] + 56 Face29Position int16u[2] + 58 Face30Position int16u[2] + 60 Face31Position int16u[2] + 62 Face32Position int16u[2] + +=head3 Pentax FaceSize Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 Face1Size int16u[2] + 2 Face2Size int16u[2] + 4 Face3Size int16u[2] + 6 Face4Size int16u[2] + 8 Face5Size int16u[2] + 10 Face6Size int16u[2] + 12 Face7Size int16u[2] + 14 Face8Size int16u[2] + 16 Face9Size int16u[2] + 18 Face10Size int16u[2] + 20 Face11Size int16u[2] + 22 Face12Size int16u[2] + 24 Face13Size int16u[2] + 26 Face14Size int16u[2] + 28 Face15Size int16u[2] + 30 Face16Size int16u[2] + 32 Face17Size int16u[2] + 34 Face18Size int16u[2] + 36 Face19Size int16u[2] + 38 Face20Size int16u[2] + 40 Face21Size int16u[2] + 42 Face22Size int16u[2] + 44 Face23Size int16u[2] + 46 Face24Size int16u[2] + 48 Face25Size int16u[2] + 50 Face26Size int16u[2] + 52 Face27Size int16u[2] + 54 Face28Size int16u[2] + 56 Face29Size int16u[2] + 58 Face30Size int16u[2] + 60 Face31Size int16u[2] + 62 Face32Size int16u[2] + +=head3 Pentax FilterInfo Tags + +The parameters associated with each type of digital filter are unique, and +these settings are also extracted with the DigitalFilter tag. Information +is not extracted for filters that are "Off" unless the Unknown option is +used. + + Index1 Tag Name Writable + ------ -------- -------- + 0 SourceDirectoryIndex int16u + 2 SourceFileIndex int16u + 5 DigitalFilter01 undef[17] + 22 DigitalFilter02 undef[17] + 39 DigitalFilter03 undef[17] + 56 DigitalFilter04 undef[17] + 73 DigitalFilter05 undef[17] + 90 DigitalFilter06 undef[17] + 107 DigitalFilter07 undef[17] + 124 DigitalFilter08 undef[17] + 141 DigitalFilter09 undef[17] + 158 DigitalFilter10 undef[17] + 175 DigitalFilter11 undef[17] + 192 DigitalFilter12 undef[17] + 209 DigitalFilter13 undef[17] + 226 DigitalFilter14 undef[17] + 243 DigitalFilter15 undef[17] + 260 DigitalFilter16 undef[17] + 277 DigitalFilter17 undef[17] + 294 DigitalFilter18 undef[17] + 311 DigitalFilter19 undef[17] + 328 DigitalFilter20 undef[17] + +=head3 Pentax LevelInfo Tags + +Tags decoded from the electronic level information for the K-5. May not be +valid for other models. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LevelOrientation int8s & 0x0f + 0.1 CompositionAdjust int8s & 0xf0 + 1 RollAngle int8s + 2 PitchAngle int8s + 5 CompositionAdjustX int8s + 6 CompositionAdjustY int8s + 7 CompositionAdjustRotation int8s + +=head3 Pentax WBLevels Tags + + Index1 Tag Name Writable + ------ -------- -------- + 2 WB_RGGBLevelsDaylight int16u[4] + 11 WB_RGGBLevelsShade int16u[4] + 20 WB_RGGBLevelsCloudy int16u[4] + 29 WB_RGGBLevelsTungsten int16u[4] + 38 WB_RGGBLevelsFluorescentD int16u[4] + 47 WB_RGGBLevelsFluorescentN int16u[4] + 56 WB_RGGBLevelsFluorescentW int16u[4] + 65 WB_RGGBLevelsFlash int16u[4] + 74 WB_RGGBLevelsFluorescentL int16u[4] + 83 WB_RGGBLevelsUnknown? int16u[4] + 92 WB_RGGBLevelsUserSelected int16u[4] + +=head3 Pentax LensInfoQ Tags + +More lens information stored by the Pentax Q. + + Index1 Tag Name Writable + ------ -------- -------- + 12 LensModel string[30] + 42 LensInfo string[20] + +=head3 Pentax PixelShiftInfo Tags + +Pixel shift information stored by the K-3 II. + + Index1 Tag Name Writable + ------ -------- -------- + 0 PixelShiftResolution int8u + +=head3 Pentax AFPointInfo Tags + +AF point information written by the K-1. + + Index1 Tag Name Writable + ------ -------- -------- + 2 NumAFPoints int16u + 4 AFPointsInFocus int8u[9]~ + 4.1 AFPointsSelected int8u[9]~ + 4.2 AFPointsSpecial int8u[9]~ + +=head3 Pentax TempInfo Tags + +A number of additional temperature readings are extracted from this 256-byte +binary-data block in images from models such as the K-01, K-3, K-5, K-50 and +K-500. It is currently not known where the corresponding temperature +sensors are located in the camera. + + Index1 Tag Name Writable + ------ -------- -------- + 12 SensorTemperature int16s + 14 SensorTemperature2 int16s + 20 CameraTemperature4 int16s + 22 CameraTemperature5 int16s + +=head3 Pentax UnknownInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Pentax Type2 Tags + +These tags are used by the Pentax Optio 330 and 430, and are similar to the +tags used by Casio. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 RecordingMode int16u + 0x0002 Quality int16u + 0x0003 FocusMode int16u + 0x0004 FlashMode int16u + 0x0007 WhiteBalance int16u + 0x000a DigitalZoom int32u + 0x000b Sharpness int16u + 0x000c Contrast int16u + 0x000d Saturation int16u + 0x0014 ISO int16u + 0x0017 ColorFilter int16u + 0x0e00 PrintIM PrintIM + 0x1000 HometownCityCode undef[4] + 0x1001 DestinationCityCode undef[4] + +=head3 Pentax Type4 Tags + +The following few tags are extracted from the wealth of information +available in maker notes of the Optio E20 and E25. These maker notes are +stored as ASCII text in a format very similar to some HP models. + + Tag ID Tag Name Writable + ------ -------- -------- + 'F/W Version' FirmwareVersion no + +=head3 Pentax S1 Tags + +Tags extracted from the maker notes of AVI videos from the Optio S1. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 MakerNoteVersion no + +=head3 Pentax PENT Tags + +Tags found in the PENT atom of MOV videos from the Optio WG-2 GPS. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 26 Model no + 56 ExposureTime no + 60 FNumber no + 68 ExposureCompensation no + 84 FocalLength no + 113 DateTime1 no + 139 DateTime2 no + 167 ISO no + 199 GPSVersionID no + 207 GPSLatitudeRef no + 209 GPSLatitude no + 233 GPSLongitudeRef no + 235 GPSLongitude no + 259 GPSAltitudeRef no + 260 GPSAltitude no + 284 GPSTimeStamp no + 308 GPSSatellites no + 311 GPSStatus no + 313 GPSMeasureMode no + 315 GPSMapDatum no + 322 GPSDateStamp no + 371 AudioCodecID no + 2003 PreviewImage no + +=head3 Pentax PXTH Tags + +Tags found in the PXTH atom of MOV videos from the K-01. + + Index1 Tag Name Writable + ------ -------- -------- + 0 PreviewImageLength no + 4 PreviewImage no + +=head3 Pentax MOV Tags + +This information is found in MOV videos from cameras such as the Optio WP. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 38 ExposureTime no + 42 FNumber no + 50 ExposureCompensation no + 68 WhiteBalance no + 72 FocalLength no + 175 ISO no + +=head3 Pentax Junk Tags + +Tags found in the JUNK chunk of AVI videos from the RS1000. + + Index1 Tag Name Writable + ------ -------- -------- + 12 Model no + +=head3 Pentax Junk2 Tags + +This information is found in AVI videos from the Optio RZ18. + + Index1 Tag Name Writable + ------ -------- -------- + 18 Make no + 44 Model no + 94 FNumber no + 131 DateTime1 no + 157 DateTime2 no + 299 ThumbnailWidth no + 301 ThumbnailHeight no + 303 ThumbnailLength no + 307 ThumbnailImage no + +=head3 Pentax AVI Tags + +Pentax-specific RIFF tags found in AVI videos. + + Tag ID Tag Name Writable + ------ -------- -------- + 'hymn' MakerNotes Pentax + 'mknt' MakerNotes Pentax + +=head2 PhaseOne Tags + +These tags are extracted from the maker notes of Phase One images. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0100 CameraOrientation no + 0x0102 SerialNumber string + 0x0105 ISO int32s + 0x0106 ColorMatrix1 float[9] + 0x0107 WB_RGBLevels float[3] + 0x0108 SensorWidth int32s + 0x0109 SensorHeight int32s + 0x010a SensorLeftMargin int32s + 0x010b SensorTopMargin int32s + 0x010c ImageWidth int32s + 0x010d ImageHeight int32s + 0x010e RawFormat int32s + 0x010f RawData no + 0x0110 SensorCalibration PhaseOne SensorCalibration + 0x0112 DateTimeOriginal no + 0x0113 ImageNumber int32s + 0x0203 Software string + 0x0204 System string + 0x0210 SensorTemperature float + 0x0211 SensorTemperature2 float + 0x0212 UnknownDate? int32u + 0x021c StripOffsets no + 0x021d BlackLevel int32s + 0x0222 SplitColumn int32s + 0x0223 BlackLevelData int16u[n] + 0x0226 ColorMatrix2 float[9] + 0x0267 AFAdjustment float + 0x0301 FirmwareVersions string + 0x0400 ShutterSpeedValue float + 0x0401 ApertureValue float + 0x0402 ExposureCompensation float + 0x0403 FocalLength float + 0x0410 CameraModel string + 0x0412 LensModel string + 0x0414 MaxApertureValue float + 0x0415 MinApertureValue float + 0x0455 Viewfinder string + +=head3 PhaseOne SensorCalibration Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0400 SensorDefects no + 0x0401 AllColorFlatField1? no + 0x0407 SerialNumber string + 0x040b RedBlueFlatField? no + 0x0410 AllColorFlatField2? no + 0x0416 AllColorFlatField3? no + 0x0419 LinearizationCoefficients1 no + 0x041a LinearizationCoefficients2 no + +=head2 Reconyx Tags + +The following tags are extracted from the maker notes of Reconyx Hyperfire +cameras such as the HC500, HC600 and PC900. + + Index2 Tag Name Writable + ------ -------- -------- + 0 MakerNoteVersion no + 1 FirmwareVersion no + 4 FirmwareDate int16u[2] + 6 TriggerMode string[2] + 7 Sequence int16u[2] + 9 EventNumber int16u[2] + 11 DateTimeOriginal int16u[6] + 18 MoonPhase int16u + 19 AmbientTemperatureFahrenheit int16s + 20 AmbientTemperature int16s + 21 SerialNumber undef[30] + 36 Contrast int16u + 37 Brightness int16u + 38 Sharpness int16u + 39 Saturation int16u + 40 InfraredIlluminator int16u + 41 MotionSensitivity int16u + 42 BatteryVoltage int16u + 43 UserLabel string[22] + +=head3 Reconyx Type2 Tags + +Tags extracted from models such as the UltraFire. + + Index1 Tag Name Writable + ------ -------- -------- + 24 FirmwareVersion undef[7] + 31 Micro1Version undef[7] + 38 BootLoaderVersion undef[7] + 45 Micro2Version undef[7] + 52 TriggerMode undef[1] + 53 Sequence int8u[2] + 55 EventNumber int32u + 59 DateTimeOriginal int8u[7] + 66 DayOfWeek int8u + 67 MoonPhase int8u + 68 AmbientTemperatureFahrenheit int16s + 70 AmbientTemperature int16s + 72 Illumination int8u + 73 BatteryVoltage int16u + 75 SerialNumber string[15] + 90 UserLabel string[21] + +=head3 Reconyx Type3 Tags + +Tags extracted from models such as the HF2 PRO. + + Index1 Tag Name Writable + ------ -------- -------- + 16 FileNumber int16u + 18 DirectoryNumber int16u + 42 FirmwareVersion int16u[3] + 48 FirmwareDate int16u[2] + 52 TriggerMode string[2] + 54 Sequence int16u[2] + 58 EventNumber int16u[2] + 62 DateTimeOriginal int16u[6] + 74 DayOfWeek int16u + 76 MoonPhase int16u + 78 AmbientTemperatureFahrenheit int16s + 80 AmbientTemperature int16s + 82 Contrast int16u + 84 Brightness int16u + 86 Sharpness int16u + 88 Saturation int16u + 90 Flash int16u + 92 AmbientInfrared int16u + 94 AmbientLight int16u + 96 MotionSensitivity int16u + 98 BatteryVoltage int16u + 100 BatteryVoltageAvg int16u + 102 BatteryType int16u + 104 UserLabel string[22] + 126 SerialNumber unicode[15] + +=head2 Sanyo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x00ff MakerNoteOffset int32u + 0x0100 SanyoThumbnail undef + 0x0200 SpecialMode int32u[3] + 0x0201 SanyoQuality int16u + 0x0202 Macro int16u + 0x0204 DigitalZoom rational64u + 0x0207 SoftwareVersion yes + 0x0208 PictInfo yes + 0x0209 CameraID yes + 0x020e SequentialShot int16u + 0x020f WideRange int16u + 0x0210 ColorAdjustmentMode int16u + 0x0213 QuickShot int16u + 0x0214 SelfTimer int16u + 0x0216 VoiceMemo int16u + 0x0217 RecordShutterRelease int16u + 0x0218 FlickerReduce int16u + 0x0219 OpticalZoomOn int16u + 0x021b DigitalZoomOn int16u + 0x021d LightSourceSpecial int16u + 0x021e Resaved int16u + 0x021f SceneSelect int16u + 0x0223 ManualFocusDistance rational64u + FaceInfo - + 0x0224 SequenceShotInterval int16u + 0x0225 FlashMode int16u + 0x0e00 PrintIM PrintIM + 0x0f00 DataDump no + +=head3 Sanyo FaceInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 FacesDetected int32u + 4 FacePosition int32u[4] + +=head3 Sanyo MOV Tags + +This information is found in Sanyo MOV videos. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 24 Model no + 38 ExposureTime no + 42 FNumber no + 50 ExposureCompensation no + 68 WhiteBalance no + 72 FocalLength no + +=head3 Sanyo MP4 Tags + +This information is found in Sanyo MP4 videos. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 24 Model no + 50 FNumber no + 58 ExposureCompensation no + 106 ISO no + 209 Software no + 210 Software no + 241 Thumbnail Sanyo Thumbnail + 242 Thumbnail Sanyo Thumbnail + +=head3 Sanyo Thumbnail Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 ThumbnailWidth no + 2 ThumbnailHeight no + 3 ThumbnailLength no + 4 ThumbnailOffset no + +=head2 Samsung Tags + +Tags found in the binary "STMN" format maker notes written by a number of +Samsung models. + + Index4 Tag Name Writable + ------ -------- -------- + 0 MakerNoteVersion undef[8] + 2 PreviewImageStart int32u* + 3 PreviewImageLength int32u* + 11 SamsungIFD Samsung IFD + +=head3 Samsung IFD Tags + +This is a standard-format IFD found in the maker notes of some Samsung +models, except that the entry count is a 4-byte integer and the offsets are +relative to the end of the IFD. Currently, no tags in this IFD are known, +so the Unknown (-u) or Verbose (-v) option must be used to see this +information. + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Samsung Type2 Tags + +Tags found in the EXIF-format maker notes of newer Samsung models. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 MakerNoteVersion undef[4] + 0x0002 DeviceType int32u + 0x0003 SamsungModelID int32u + 0x0011 OrientationInfo Samsung OrientationInfo + 0x0020 SmartAlbumColor int16u[2] + 0x0021 PictureWizard Samsung PictureWizard + 0x0030 LocalLocationName string + 0x0031 LocationName string + 0x0035 PreviewIFD Nikon PreviewIFD + Nikon PreviewIFD + 0x0040 RawDataByteOrder yes + 0x0041 WhiteBalanceSetup int32u + 0x0043 CameraTemperature rational64s + 0x0050 RawDataCFAPattern yes + 0x0100 FaceDetect int16u + 0x0120 FaceRecognition int32u + 0x0123 FaceName string + 0xa001 FirmwareName string + 0xa002 SerialNumber string + 0xa003 LensType int16u[n] + 0xa004 LensFirmware string + 0xa005 InternalLensSerialNumber string + 0xa010 SensorAreas int32u[8] + 0xa011 ColorSpace int16u + 0xa012 SmartRange int16u + 0xa013 ExposureCompensation rational64s + 0xa014 ISO int32u + 0xa018 ExposureTime rational64u + 0xa019 FNumber rational64u + 0xa01a FocalLengthIn35mmFormat int32u + 0xa020 EncryptionKey int32u[11]! + 0xa021 WB_RGGBLevelsUncorrected int32u[4] + 0xa022 WB_RGGBLevelsAuto int32u[4] + 0xa023 WB_RGGBLevelsIlluminator1 int32u[4] + 0xa024 WB_RGGBLevelsIlluminator2 int32u[4] + 0xa025 HighlightLinearityLimit int32u + 0xa028 WB_RGGBLevelsBlack int32s[4] + 0xa030 ColorMatrix int32s[9] + 0xa031 ColorMatrixSRGB int32s[9] + 0xa032 ColorMatrixAdobeRGB int32s[9] + 0xa033 CbCrMatrixDefault int32s[4] + 0xa034 CbCrMatrix int32s[4] + 0xa035 CbCrGainDefault int32u[2] + 0xa036 CbCrGain int32u[2] + 0xa040 ToneCurveSRGBDefault int32u[23] + 0xa041 ToneCurveAdobeRGBDefault int32u[23] + 0xa042 ToneCurveSRGB int32u[23] + 0xa043 ToneCurveAdobeRGB int32u[23] + 0xa048 RawData? int32s[12] + 0xa050 Distortion? int32s[8] + 0xa051 ChromaticAberration? int16u[22] + 0xa052 Vignetting? int16u[15] + 0xa053 VignettingCorrection? int16u[15] + 0xa054 VignettingSetting? int16u[15] + +=head3 Samsung OrientationInfo Tags + +Camera orientation information written by the Gear 360 (SM-C200). + + Index8 Tag Name Writable + ------ -------- -------- + 0 YawAngle? rational64s + 1 PitchAngle rational64s + 2 RollAngle rational64s + +=head3 Samsung PictureWizard Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 PictureWizardMode int16u + 1 PictureWizardColor int16u + 2 PictureWizardSaturation int16u + 3 PictureWizardSharpness int16u + 4 PictureWizardContrast int16u + +=head3 Samsung APP5 Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'ssuniqueid' UniqueID no + +=head3 Samsung Trailer Tags + +Tags extracted from the trailer of JPEG images written when using certain +features (such as "Sound & Shot" or "Shot & More") from Samsung models such +as the Galaxy S4 and Tab S, and from the 'sefd' atom in HEIC images from the +Samsung S10+. + + Tag Name Writable + -------- -------- + DepthMapData no + DepthMapData2 no + DepthMapName no + DualCameraImage no + DualCameraImageName no + DualShotExtra Samsung DualShotExtra + EmbeddedAudioFile no + EmbeddedAudioFileName no + EmbeddedImage no + EmbeddedImage2 no + EmbeddedImageName no + EmbeddedVideoFile no + EmbeddedVideoType no + MCCData no + SingleShotDepthMap no + SingleShotMeta Samsung SingleShotMeta + SurroundShotVideo no + SurroundShotVideoName no + TimeStamp no + +=head3 Samsung DualShotExtra Tags + + Index4 Tag Name Writable + ------ -------- -------- + 16 DepthMapWidth no + 17 DepthMapHeight no + +=head3 Samsung SingleShotMeta Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'beautyColorLevel' BeautyColorLevel no + 'beautyRetouchLevel' BeautyRetouchLevel no + 'blurStrength' BlurStrength no + 'bokehShape' BokehShape no + 'colorpopStrength' ColorpopStrength no + 'depthHWHeight' DepthHWHeight no + 'depthHWWidth' DepthHWWidth no + 'depthSWHeight' DepthSWHeight no + 'depthSWWidth' DepthSWWidth no + 'deviceOrientation' DeviceOrientation no + 'effectStrength' EffectStrength no + 'effectType' EffectType no + 'flipStatus' FlipStatus no + 'inputHeight' InputHeight no + 'inputWidth' InputWidth no + 'isArtBokeh' IsArtBokeh no + 'lensFacing' LensFacing no + 'monoStrength' MonoStrength no + 'objectOrientation' ObjectOrientation no + 'outputHeight' OutputHeight no + 'outputWidth' OutputWidth no + 'perfMode' PerfMode no + 'segHeight' SegHeight no + 'segWidth' SegWidth no + 'sidelightStrength' SidelightStrength no + 'spinStrength' SpinStrength no + 'vintageStrength' VintageStrength no + 'zoomStrength' ZoomStrength no + +=head3 Samsung sec Tags + +This information is found in the @sec atom of Samsung MP4 videos from models +such as the WB30F. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 32 Model no + 512 ThumbnailWidth no + 516 ThumbnailHeight no + 520 ThumbnailLength no + 524 ThumbnailImage no + +=head3 Samsung INFO Tags + +This information is found in MP4 videos from Samsung models such as the +SMX-C20N. + + Tag ID Tag Name Writable + ------ -------- -------- + 'EFCT' Effect no + 'QLTY' Quality no + +=head3 Samsung MP4 Tags + +This information is found in Samsung MP4 videos from models such as the +WP10. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make no + 24 Model no + 46 ExposureTime no + 50 FNumber no + 58 ExposureCompensation no + 106 ISO no + 125 Software no + 244 Thumbnail Samsung Thumbnail + +=head3 Samsung Thumbnail Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 ThumbnailWidth no + 2 ThumbnailHeight no + 3 ThumbnailLength no + 4 ThumbnailOffset no + +=head3 Samsung smta Tags + +This information is found in the smta atom of Samsung MP4 videos from models +such as the Galaxy S4. + + Tag ID Tag Name Writable + ------ -------- -------- + 'svss' SamsungSvss Samsung svss + +=head3 Samsung svss Tags + +This information is found in the svss atom of Samsung MP4 videos from models +such as the Galaxy S4. + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head2 Ricoh Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 MakerNoteType string + 0x0002 FirmwareVersion string + 0x0005 SerialNumber undef[16] + InternalSerialNumber undef[16] + 0x0e00 PrintIM PrintIM + 0x1000 RecordingFormat int16u + 0x1001 ImageInfo Ricoh ImageInfo + ExposureProgram int16u + 0x1002 DriveMode int16u + 0x1003 Sharpness int32u + WhiteBalance int16u + 0x1004 WhiteBalanceFineTune int16u + 0x1006 FocusMode int16u + 0x1007 AutoBracketing int16u + 0x1009 MacroMode int16u + 0x100a FlashMode int16u + 0x100b FlashExposureComp rational64s + 0x100c ManualFlashOutput rational64s + 0x100d FullPressSnap int16u + 0x100e DynamicRangeExpansion int16u + 0x100f NoiseReduction int16u + 0x1010 ImageEffects int16u + 0x1011 Vignetting int16u + 0x1012 Contrast int32u + 0x1013 Saturation int32u + 0x1014 Sharpness int32u + 0x1015 ToningEffect int16u + 0x1016 HueAdjust int16u + 0x1017 WideAdapter int16u + 0x1018 CropMode int16u + 0x1019 NDFilter int16u + 0x101a WBBracketShotNumber int16u + 0x1200 AFStatus int16u + 0x1201 AFAreaXPosition1 int32u + 0x1202 AFAreaYPosition1 int32u + 0x1203 AFAreaXPosition int32u + 0x1204 AFAreaYPosition int32u + 0x1205 AFAreaMode int16u + 0x1307 ColorTempKelvin int32u + 0x1308 ColorTemperature int32u + 0x1500 FocalLength rational64u + 0x1601 SensorWidth int32u + 0x1602 SensorHeight int32u + 0x1603 CroppedImageWidth int32u + 0x1604 CroppedImageHeight int32u + 0x2001 RicohSubdir Ricoh Subdir + RicohSubdirIFD Ricoh Subdir + RicohRR1Subdir Ricoh Subdir + 0x4001 ThetaSubdir Ricoh ThetaSubdir + +=head3 Ricoh ImageInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 RicohImageWidth int16u + 2 RicohImageHeight int16u + 6 RicohDate int8u[7] + 28 PreviewImageStart int16u* + 30 PreviewImageLength int16u* + 32 FlashMode int8u + 33 Macro int8u + 34 Sharpness int8u + 38 WhiteBalance int8u + 39 ISOSetting int8u + 40 Saturation int8u + +=head3 Ricoh Subdir Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0004 ManufactureDate1 string[20] + 0x0005 ManufactureDate2 string[20] + 0x001a FaceInfo Ricoh FaceInfo + 0x0029 FirmwareInfo Ricoh FirmwareInfo + 0x002a NoiseReduction int32u + 0x002c SerialInfo Ricoh SerialInfo + +=head3 Ricoh FaceInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 181 FacesDetected int8u + 182 FaceDetectFrameSize int16u[2] + 188 Face1Position int16u[4] + 200 Face2Position int16u[4] + 212 Face3Position int16u[4] + 224 Face4Position int16u[4] + 236 Face5Position int16u[4] + 248 Face6Position int16u[4] + 260 Face7Position int16u[4] + 272 Face8Position int16u[4] + +=head3 Ricoh FirmwareInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 FirmwareRevision string[12] + 12 FirmwareRevision2 string[12] + +=head3 Ricoh SerialInfo Tags + +This information is found in images from the GXR. + + Index1 Tag Name Writable + ------ -------- -------- + 0 BodyFirmware string[16] + 16 BodySerialNumber string[16] + 32 LensFirmware string[16] + 48 LensSerialNumber string[16] + +=head3 Ricoh ThetaSubdir Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0003 Accelerometer rational64s[2] + 0x0004 Compass rational64u + 0x000a TimeZone string + +=head3 Ricoh Type2 Tags + +Tags written by models such as the Ricoh HZ15 and the Pentax XG-1. These +are not writable due to numerous formatting errors as written by these +cameras. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0207 RicohModel no + 0x0300 RicohMake no + +=head3 Ricoh Text Tags + +Some Ricoh DC and RDC models use a text-based format for their maker notes +instead of the IFD format used by the Caplio models. Below is a list of known +tags in this information. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Bg' BlueGain no + 'Gg' GreenGain no + 'Rev' FirmwareVersion no + 'Rg' RedGain no + 'Rv' FirmwareVersion no + +=head3 Ricoh RMETA Tags + +The Ricoh Caplio Pro G3 has the ability to add custom fields to the APP5 +"RMETA" segment of JPEG images. While only a few observed tags have been +defined below, ExifTool will extract any information found here. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Azimuth' Azimuth no + 'Condition' Condition no + 'Lit' Lit no + 'Location' Location no + 'Sign type' SignType no + '_audio' SoundFile no + '_barcode' Barcodes no+ + +=head3 Ricoh AVI Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'mnrt' MakerNoteRicoh Ricoh + 'rdc2' RicohRDC2? no + 'thum' ThumbnailImage no + 'ucmt' Comment no + +=head2 Sigma Tags + +These tags are written by Sigma/Foveon cameras. In the early days Sigma was +a class leader by releasing their maker note specification to the public, +but since then they have deviated from this standard and newer camera models +are less than consistent about their metadata formats. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0002 SerialNumber string + 0x0003 DriveMode string + 0x0004 ResolutionMode string + 0x0005 AFMode string + 0x0006 FocusSetting string + 0x0007 WhiteBalance string + 0x0008 ExposureMode string + 0x0009 MeteringMode string + 0x000a LensFocalRange string + 0x000b ColorSpace string + 0x000c ExposureCompensation string + ExposureAdjust? rational64s + 0x000d Contrast string + Contrast rational64s + 0x000e Shadow string + Shadow rational64s + 0x000f Highlight string + Highlight rational64s + 0x0010 Saturation string + Saturation rational64s + 0x0011 Sharpness string + Sharpness rational64s + 0x0012 X3FillLight string + X3FillLight rational64s + 0x0014 ColorAdjustment string + ColorAdjustment rational64s[3] + 0x0015 AdjustmentMode string + 0x0016 Quality string + 0x0017 Firmware string + 0x0018 Software string + 0x0019 AutoBracket string + 0x001a PreviewImageStart int32u* + ChrominanceNoiseReduction string + 0x001b PreviewImageLength int32u* + LuminanceNoiseReduction string + 0x001c PreviewImageSize int16u[2] + PreviewImageStart int32u* + 0x001d MakerNoteVersion undef + PreviewImageLength int32u* + 0x001e PreviewImageSize int16u[2] + 0x001f AFPoint string + MakerNoteVersion undef + 0x0022 FileFormat string + 0x0024 Calibration string + 0x0026 FileFormat string + 0x0027 LensType string + LensType - + Sigma LensType + 0x002a LensFocalRange rational64u[2] + 0x002b LensMaxApertureRange rational64u[2] + 0x002c ColorMode int32u + 0x0030 LensApertureRange string + Calibration string + 0x0031 FNumber rational64u + 0x0032 ExposureTime rational64u + 0x0033 ExposureTime2 string + 0x0034 BurstShot int32u + 0x0035 ExposureCompensation rational64s + 0x0039 SensorTemperature string + 0x003a FlashExposureComp rational64s + 0x003b Firmware string + 0x003c WhiteBalance string + 0x003d PictureMode string + 0x0048 LensApertureRange string + 0x0049 FNumber rational64u + 0x004a ExposureTime rational64u + 0x004b ExposureTime2 string + 0x004d ExposureCompensation rational64s + 0x0055 SensorTemperature string + 0x0056 FlashExposureComp rational64s + 0x0057 Firmware2 string + 0x0058 WhiteBalance string + 0x0059 DigitalFilter string + 0x0084 Model string + 0x0086 ISO int16u + 0x0087 ResolutionMode string + 0x0088 WhiteBalance string + 0x008c Firmware string + 0x011f CameraCalibration float[9] + 0x0120 WBSettings Sigma WBSettings + 0x0121 WBSettings2 Sigma WBSettings2 + +=head3 Sigma WBSettings Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 WB_RGBLevelsAuto float[3] + 3 WB_RGBLevelsDaylight float[3] + 6 WB_RGBLevelsShade float[3] + 9 WB_RGBLevelsOvercast float[3] + 12 WB_RGBLevelsIncandescent float[3] + 15 WB_RGBLevelsFluorescent float[3] + 18 WB_RGBLevelsFlash float[3] + 21 WB_RGBLevelsCustom1 float[3] + 24 WB_RGBLevelsCustom2 float[3] + 27 WB_RGBLevelsCustom3 float[3] + +=head3 Sigma WBSettings2 Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 WB_RGBLevelsUnknown0? float[3] + 3 WB_RGBLevelsUnknown1? float[3] + 6 WB_RGBLevelsUnknown2? float[3] + 9 WB_RGBLevelsUnknown3? float[3] + 12 WB_RGBLevelsUnknown4? float[3] + 15 WB_RGBLevelsUnknown5? float[3] + 18 WB_RGBLevelsUnknown6? float[3] + 21 WB_RGBLevelsUnknown7? float[3] + 24 WB_RGBLevelsUnknown8? float[3] + 27 WB_RGBLevelsUnknown9? float[3] + +=head2 Sony Tags + +The following information has been decoded from the MakerNotes of Sony +cameras. Some of these tags have been inherited from the Minolta +MakerNotes. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0010 CameraInfo Sony CameraInfo + CameraInfo2 Sony CameraInfo2 + CameraInfo3 Sony CameraInfo3 + CameraInfoUnknown Sony CameraInfoUnknown + 0x0020 FocusInfo Sony FocusInfo + MoreInfo Sony MoreInfo + 0x0102 Quality int32u + 0x0104 FlashExposureComp rational64s + 0x0105 Teleconverter int32u + 0x0112 WhiteBalanceFineTune int32u + 0x0114 CameraSettings Sony CameraSettings + CameraSettings2 Sony CameraSettings2 + CameraSettings3 Sony CameraSettings3 + CameraSettingsUnknown Sony CameraSettingsUnknown + 0x0115 WhiteBalance int32u + 0x0116 ExtraInfo Sony ExtraInfo + ExtraInfo2 Sony ExtraInfo2 + ExtraInfo3 Sony ExtraInfo3 + 0x0e00 PrintIM PrintIM + 0x1000 MultiBurstMode undef + 0x1001 MultiBurstImageWidth int16u + 0x1002 MultiBurstImageHeight int16u + 0x1003 Panorama Sony Panorama + 0x2001 PreviewImage undef + 0x2002 Rating int32u + 0x2004 Contrast int32s + 0x2005 Saturation int32s + 0x2006 Sharpness int32s + 0x2007 Brightness int32s + 0x2008 LongExposureNoiseReduction int32u + 0x2009 HighISONoiseReduction int16u + 0x200a HDR int32u + 0x200b MultiFrameNoiseReduction int32u + 0x200e PictureEffect int16u + 0x200f SoftSkinEffect int32u + 0x2010 Tag2010a Sony Tag2010a + Tag2010b Sony Tag2010b + Tag2010c Sony Tag2010c + Tag2010d Sony Tag2010d + Tag2010e Sony Tag2010e + Tag2010f Sony Tag2010f + Tag2010g Sony Tag2010g + Tag2010h Sony Tag2010h + Tag2010i Sony Tag2010i + 0x2011 VignettingCorrection int32u + 0x2012 LateralChromaticAberration int32u + 0x2013 DistortionCorrectionSetting int32u + 0x2014 WBShiftAB_GM int32s[2] + 0x2016 AutoPortraitFramed int16u + 0x2017 FlashAction int32u + 0x201a ElectronicFrontCurtainShutter int32u + 0x201b FocusMode int8u + 0x201c AFAreaModeSetting int8u + 0x201d FlexibleSpotPosition int16u[2] + 0x201e AFPointSelected int8u + 0x2020 AFPointsUsed no + 0x2021 AFTracking int8u + 0x2022 FocalPlaneAFPointsUsed no + 0x2023 MultiFrameNREffect int32u + 0x2026 WBShiftAB_GM_Precise int32s[2]~ + 0x2027 FocusLocation int16u[4] + 0x2028 VariableLowPassFilter int16u[2] + 0x2029 RAWFileType int16u + 0x202a Tag202a Sony Tag202a + 0x202b PrioritySetInAWB int8u + 0x202c MeteringMode2 int16u + 0x202d ExposureStandardAdjustment rational64s + 0x202e Quality int16u[2] + 0x202f PixelShiftInfo undef + 0x2031 SerialNumber string + 0x2032 Shadows int32s + 0x2033 Highlights int32s + 0x2034 Fade int32s + 0x2035 SharpnessRange int32s + 0x2036 Clarity int32s + 0x2037 FocusFrameSize no + 0x2039 JPEG-HEIFSwitch int16u + 0x3000 ShotInfo Sony ShotInfo + 0x900b Tag900b Sony Tag900b + 0x9050 Tag9050a Sony Tag9050a + Tag9050b Sony Tag9050b + Tag9050c Sony Tag9050c + 0x9400 Tag9400a Sony Tag9400a + Tag9400b Sony Tag9400b + Tag9400c Sony Tag9400c + 0x9401 Tag9401 Sony Tag9401 + 0x9402 Tag9402 Sony Tag9402 + 0x9403 Tag9403 Sony Tag9403 + 0x9404 Tag9404a Sony Tag9404a + Tag9404b Sony Tag9404b + Tag9404c Sony Tag9404c + 0x9405 Tag9405a Sony Tag9405a + Tag9405b Sony Tag9405b + 0x9406 Tag9406 Sony Tag9406 + 0x940a Tag940a Sony Tag940a + 0x940c Tag940c Sony Tag940c + 0x940e AFInfo Sony AFInfo + Tag940e Sony Tag940e + 0x9416 Sony_0x9416 Sony Tag9416 + 0xb000 FileFormat int8u[4] + 0xb001 SonyModelID int16u + 0xb020 CreativeStyle string + 0xb021 ColorTemperature int32u + 0xb022 ColorCompensationFilter int32u + 0xb023 SceneMode int32u + 0xb024 ZoneMatching int32u + 0xb025 DynamicRangeOptimizer int32u + 0xb026 ImageStabilization int32u + 0xb027 LensType int32u + 0xb028 MinoltaMakerNote Minolta + 0xb029 ColorMode int32u + 0xb02a LensSpec int8u[8] + 0xb02b FullImageSize int32u[2] + 0xb02c PreviewImageSize int32u[2] + 0xb040 Macro int16u + 0xb041 ExposureMode int16u + 0xb042 FocusMode int16u + 0xb043 AFAreaMode int16u + 0xb044 AFIlluminator int16u + 0xb047 JPEGQuality int16u + 0xb048 FlashLevel int16s + 0xb049 ReleaseMode int16u + 0xb04a SequenceNumber int16u + 0xb04b Anti-Blur int16u + 0xb04e FocusMode int16u + 0xb04f DynamicRangeOptimizer int16u + 0xb050 HighISONoiseReduction2 int16u + 0xb052 IntelligentAuto int16u + 0xb054 WhiteBalance int16u + +=head3 Sony CameraInfo Tags + +Camera information for the A700, A850 and A900. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensSpec undef[8] + 20 FocusModeSetting int8u + 21 AFPointSelected int8u + 25 AFPoint int8u + 30 AFStatusActiveSensor int16s + 32 AFStatusUpper-left int16s + 34 AFStatusLeft int16s + 36 AFStatusLower-left int16s + 38 AFStatusFarLeft int16s + 40 AFStatusBottomAssist-left int16s + 42 AFStatusBottom int16s + 44 AFStatusBottomAssist-right int16s + 46 AFStatusCenter-7 int16s + 48 AFStatusCenter-horizontal int16s + 50 AFStatusCenter-9 int16s + 52 AFStatusCenter-10 int16s + 54 AFStatusCenter-11 int16s + 56 AFStatusCenter-12 int16s + 58 AFStatusCenter-vertical int16s + 60 AFStatusCenter-14 int16s + 62 AFStatusTopAssist-left int16s + 64 AFStatusTop int16s + 66 AFStatusTopAssist-right int16s + 68 AFStatusFarRight int16s + 70 AFStatusUpper-right int16s + 72 AFStatusRight int16s + 74 AFStatusLower-right int16s + 76 AFStatusCenterF2-8 int16s + 304 AFMicroAdjValue int8u + 305 AFMicroAdjMode int8u & 0x80 + 305.1 AFMicroAdjRegisteredLenses int8u & 0x7f + +=head3 Sony CameraInfo2 Tags + +Camera information for the DSLR-A200, A230, A290, A300, A330, A350, A380 and +A390. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensSpec undef[8] + 20 AFPointSelected int8u + 21 FocusModeSetting int8u + 24 AFPoint int8u + 27 AFStatusActiveSensor int16s + 29 AFStatusTop-right int16s + 31 AFStatusBottom-right int16s + 33 AFStatusBottom int16s + 35 AFStatusMiddleHorizontal int16s + 37 AFStatusCenterVertical int16s + 39 AFStatusTop int16s + 41 AFStatusTop-left int16s + 43 AFStatusBottom-left int16s + 45 AFStatusLeft int16s + 47 AFStatusCenterHorizontal int16s + 49 AFStatusRight int16s + +=head3 Sony CameraInfo3 Tags + +Camera information stored by the A33, A35, A55, A450, A500, A550, A560, +A580, NEX-3/5/5C/C3 and VG10E. Some tags are valid only for some of these +models. + + Index1 Tag Name Writable + ------ -------- -------- + 0 LensSpec undef[8] + 14 FocalLength int16u + 16 FocalLengthTeleZoom int16u + 20 AFPointSelected int8u + 21 FocusMode int8u + 24 AFPoint int8u + 25 FocusStatus int8u + 27 AFStatusActiveSensor int16s + 28 AFPointSelected int8u + 29 FocusMode int8u + AFStatusTop-right int16s + 31 AFStatusBottom-right int16s + 32 AFPoint int8u + 33 AFStatusActiveSensor int16s + AFStatusBottom int16s + 35 AFStatus15 Sony AFStatus15 + AFStatusMiddleHorizontal int16s + 37 AFStatusCenterVertical int16s + 39 AFStatusTop int16s + 41 AFStatusTop-left int16s + 43 AFStatusBottom-left int16s + 45 AFStatusLeft int16s + 47 AFStatusCenterHorizontal int16s + 49 AFStatusRight int16s + +=head3 Sony AFStatus15 Tags + +AF Status information for models with 15-point AF. + + Index1 Tag Name Writable + ------ -------- -------- + 0 AFStatusUpper-left int16s + 2 AFStatusLeft int16s + 4 AFStatusLower-left int16s + 6 AFStatusFarLeft int16s + 8 AFStatusTopHorizontal int16s + 10 AFStatusNearRight int16s + 12 AFStatusCenterHorizontal int16s + 14 AFStatusNearLeft int16s + 16 AFStatusBottomHorizontal int16s + 18 AFStatusTopVertical int16s + 20 AFStatusCenterVertical int16s + 22 AFStatusBottomVertical int16s + 24 AFStatusFarRight int16s + 26 AFStatusUpper-right int16s + 28 AFStatusRight int16s + 30 AFStatusLower-right int16s + 32 AFStatusUpper-middle int16s + 34 AFStatusLower-middle int16s + +=head3 Sony CameraInfoUnknown Tags + + Index1 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Sony FocusInfo Tags + +More camera settings and focus information decoded for models such as the +A200, A230, A290, A300, A330, A350, A380, A390, A700, A850 and A900. + + Index1 Tag Name Writable + ------ -------- -------- + 14 DriveMode2 int8u + 16 Rotation int8u + 20 ImageStabilizationSetting int8u + 21 DynamicRangeOptimizerMode int8u + 43 BracketShotNumber int8u + 44 WhiteBalanceBracketing int8u + 45 BracketShotNumber2 int8u + 46 DynamicRangeOptimizerBracket int8u + 47 ExposureBracketShotNumber int8u + 63 ExposureProgram int8u + 65 CreativeStyle int8u + 109 ISOSetting int8u + 111 ISO int8u + 119 DynamicRangeOptimizerMode int8u + 121 DynamicRangeOptimizerLevel int8u + 2118 ShutterCount int32u + 2491 FocusPosition int8u + 4368 TiffMeteringImage no + +=head3 Sony MoreInfo Tags + +More camera settings information decoded for the A450, A500, A550, A560, +A580, A33, A35, A55, NEX-3/5/C3 and VG10E. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 MoreSettings Sony MoreSettings + 0x0002 FaceInfo Sony FaceInfo + FaceInfoA Sony FaceInfoA + 0x0107 TiffMeteringImage no + 0x0201 MoreInfo0201 Sony MoreInfo0201 + 0x0401 MoreInfo0401 Sony MoreInfo0401 + +=head3 Sony MoreSettings Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1 DriveMode2 int8u + 2 ExposureProgram int8u + 3 MeteringMode int8u + 4 DynamicRangeOptimizerSetting int8u + 5 DynamicRangeOptimizerLevel int8u + 6 ColorSpace int8u + 7 CreativeStyleSetting int8u + 8 ContrastSetting int8s + 9 SaturationSetting int8s + 10 SharpnessSetting int8s + 13 WhiteBalanceSetting int8u + 14 ColorTemperatureSetting int8u + 15 ColorCompensationFilterSet int8s + 16 FlashMode int8u + 17 LongExposureNoiseReduction int8u + 18 HighISONoiseReduction int8u + 19 FocusMode int8u + 21 MultiFrameNoiseReduction int8u + 22 HDRSetting int8u + 23 HDRLevel int8u + 24 ViewingMode int8u + 25 FaceDetection int8u + 26 CustomWB_RBLevels int16uRev[2] + 30 BrightnessValue int8u + ExposureCompensationSet int8u + 31 ISO int8u + FlashExposureCompSet int8u + 32 FNumber int8u + LiveViewAFMethod int8u + 33 ExposureTime int8u + ISO int8u + 34 FNumber int8u + 35 FocalLength2 int8u + ExposureTime int8u + 36 ExposureCompensation2 int16s + 37 FocalLength2 int8u + ISO int8u + 38 FlashExposureCompSet2 int16s + ExposureCompensation2 int16s + FNumber int8u + 39 ExposureTime int8u + 40 Orientation2 int8u + 41 FocusPosition2 int8u + FocalLength2 int8u + 42 FlashAction int8u + ExposureCompensation2 int16s + 43 FocusPosition2 int8u + 44 FocusMode2 int8u + FlashAction int8u + FlashExposureCompSet2 int16s + 46 FocusMode2 int8u + Orientation2 int8u + 47 FocusPosition2 int8u + 48 FlashAction int8u + 50 FocusMode2 int8u + 119 FlashAction2 int8u + 120 FlashActionExternal int8u + 124 FlashActionExternal int8u + 130 FlashStatus int8u + 134 FlashStatus int8u + +=head3 Sony FaceInfo Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 FacesDetected int16s + 1 Face1Position int16u[4] + 6 Face2Position int16u[4] + 11 Face3Position int16u[4] + 16 Face4Position int16u[4] + 21 Face5Position int16u[4] + 26 Face6Position int16u[4] + 31 Face7Position int16u[4] + 36 Face8Position int16u[4] + +=head3 Sony FaceInfoA Tags + + Index2 Tag Name Writable + ------ -------- -------- + 3 FacesDetected no + 11 PotentialFace1Position int16u[4] + 21 PotentialFace2Position int16u[4] + 31 PotentialFace3Position int16u[4] + 41 PotentialFace4Position int16u[4] + 51 PotentialFace5Position int16u[4] + 61 PotentialFace6Position int16u[4] + 71 PotentialFace7Position int16u[4] + 81 PotentialFace8Position int16u[4] + 91 Face1Position int16u[4] + 101 Face2Position int16u[4] + 111 Face3Position int16u[4] + 121 Face4Position int16u[4] + +=head3 Sony MoreInfo0201 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 283 ImageCount int32u + 293 ShutterCount int32u + 330 ShutterCount int32u + +=head3 Sony MoreInfo0401 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1102 ShotNumberSincePowerUp int32u + +=head3 Sony CameraSettings Tags + +Camera settings for the A200, A300, A350, A700, A850 and A900. + + Index2 Tag Name Writable + ------ -------- -------- + 0 ExposureTime int16u + 1 FNumber int16u + 2 HighSpeedSync int16u + 3 ExposureCompensationSet int16u + 4 DriveMode int16u & 0xff + 5 WhiteBalanceSetting int16u + 6 WhiteBalanceFineTune int16u + 7 ColorTemperatureSet int16u + 8 ColorCompensationFilterSet int16u + 12 ColorTemperatureCustom int16u + 13 ColorCompensationFilterCustom int16u + 15 WhiteBalance int16u + 16 FocusModeSetting int16u + 17 AFAreaMode int16u + 18 AFPointSetting int16u + 19 FlashMode int16u + 20 FlashExposureCompSet int16u + 21 MeteringMode int16u + 22 ISOSetting int16u + 24 DynamicRangeOptimizerMode int16u + 25 DynamicRangeOptimizerLevel int16u + 26 CreativeStyle int16u + 27 ColorSpace int16u + 28 Sharpness int16u + 29 Contrast int16u + 30 Saturation int16u + 31 ZoneMatchingValue int16u + 34 Brightness int16u + 35 FlashControl int16u + 40 PrioritySetupShutterRelease int16u + 41 AFIlluminator int16u + 42 AFWithShutter int16u + 43 LongExposureNoiseReduction int16u + 44 HighISONoiseReduction int16u + 45 ImageStyle int16u + 46 FocusModeSwitch int16u + 47 ShutterSpeedSetting int16u + 48 ApertureSetting int16u + 60 ExposureProgram int16u + 61 ImageStabilizationSetting int16u + 62 FlashAction int16u + 63 Rotation int16u + 64 AELock int16u + 76 FlashAction2 int16u + 77 FocusMode int16u + 80 BatteryState int16u + 81 BatteryLevel int16u + 83 FocusStatus int16u + 84 SonyImageSize int16u + 85 AspectRatio int16u + 86 Quality int16u + 88 ExposureLevelIncrements int16u + 106 RedEyeReduction int16u + 154 FolderNumber int16u & 0x3ff + 155 ImageNumber int16u & 0x3fff + +=head3 Sony CameraSettings2 Tags + +Camera settings for the A230, A290, A330, A380 and A390. + + Index2 Tag Name Writable + ------ -------- -------- + 0 ExposureTime int16u + 1 FNumber int16u + 2 HighSpeedSync int16u + 3 ExposureCompensationSet int16u + 4 WhiteBalanceSetting int16u + 5 WhiteBalanceFineTune int16u + 6 ColorTemperatureSet int16u + 7 ColorCompensationFilterSet int16u + 8 CustomWB_RGBLevels int16u[3] + 11 ColorTemperatureCustom int16u + 12 ColorCompensationFilterCustom int16u + 14 WhiteBalance int16u + 15 FocusModeSetting int16u + 16 AFAreaMode int16u + 17 AFPointSetting int16u + 18 FlashExposureCompSet int16u + 19 MeteringMode int16u + 20 ISOSetting int16u + 22 DynamicRangeOptimizerMode int16u + 23 DynamicRangeOptimizerLevel int16u + 24 CreativeStyle int16u + 25 Sharpness int16u + 26 Contrast int16u + 27 Saturation int16u + 31 FlashControl int16u + 37 LongExposureNoiseReduction int16u + 38 HighISONoiseReduction int16u + 39 ImageStyle int16u + 40 ShutterSpeedSetting int16u + 41 ApertureSetting int16u + 60 ExposureProgram int16u + 61 ImageStabilizationSetting int16u + 62 FlashAction int16u + 63 Rotation int16u + 64 AELock int16u + 76 FlashAction2 int16u + 77 FocusMode int16u + 83 FocusStatus int16u + 84 SonyImageSize int16u + 85 AspectRatio int16u + 86 Quality int16u + 88 ExposureLevelIncrements int16u + 126 DriveMode int16u & 0xff + 127 FlashMode int16u + 131 ColorSpace int16u + +=head3 Sony CameraSettings3 Tags + +Camera settings for models such as the A33, A35, A55, A450, A500, A550, +A560, A580, NEX-3, NEX-5, NEX-C3 and NEX-VG10E. + + Index1 Tag Name Writable + ------ -------- -------- + 0 ShutterSpeedSetting int8u + 1 ApertureSetting int8u + 2 ISOSetting int8u + 3 ExposureCompensationSet int8u + 4 DriveModeSetting int8u + 5 ExposureProgram int8u + 6 FocusModeSetting int8u + 7 MeteringMode int8u + 9 SonyImageSize int8u + 10 AspectRatio int8u + 11 Quality int8u + 12 DynamicRangeOptimizerSetting int8u + 13 DynamicRangeOptimizerLevel int8u + 14 ColorSpace int8u + 15 CreativeStyleSetting int8u + 16 ContrastSetting int8s + 17 SaturationSetting int8s + 18 SharpnessSetting int8s + 22 WhiteBalanceSetting int8u + 23 ColorTemperatureSetting int8u + 24 ColorCompensationFilterSet int8s + 25 CustomWB_RGBLevels int16uRev[3] + 32 FlashMode int8u + 33 FlashControl int8u + 35 FlashExposureCompSet int8u + 36 AFAreaMode int8u + 37 LongExposureNoiseReduction int8u + 38 HighISONoiseReduction int8u + 39 SmileShutterMode int8u + 40 RedEyeReduction int8u + 45 HDRSetting int8u + 46 HDRLevel int8u + 47 ViewingMode int8u + 48 FaceDetection int8u + 49 SmileShutter int8u + 50 SweepPanoramaSize int8u + 51 SweepPanoramaDirection int8u + 52 DriveMode int8u + 53 MultiFrameNoiseReduction int8u + 54 LiveViewAFSetting int8u + 56 PanoramaSize3D int8u + 131 AFButtonPressed int8u + 132 LiveViewMetering int8u + 133 ViewingMode2 int8u + 134 AELock int8u + 135 FlashStatusBuilt-in int8u + 136 FlashStatusExternal int8u + 139 LiveViewFocusMode int8u + 153 LensMount int8u + 268 SequenceNumber int8u + 276 FolderNumber int32u & 0xffc000 + 276.1 ImageNumber int32u & 0x3fff + 512 ShotNumberSincePowerUp2 int32u + 643 AFButtonPressed int8u + 644 LiveViewMetering int8u + 645 ViewingMode2 int8u + 646 AELock int8u + 647 FlashStatusBuilt-in int8u + 648 FlashStatusExternal int8u + 651 LiveViewFocusMode int8u + 780 SequenceNumber int8u + 788 ImageNumber int16u & 0x3fff + 790 FolderNumber int16u & 0x3ff + 1008 LensE-mountVersion int16u + 1011 LensFirmwareVersion int16u~ + 1015 LensType2 int16u + 1024 ImageNumber int16u & 0x3fff + 1026 FolderNumber int16u & 0x3ff + +=head3 Sony CameraSettingsUnknown Tags + + Index2 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Sony ExtraInfo Tags + +Extra hardware information for the A850 and A900. + + Index1 Tag Name Writable + ------ -------- -------- + 1 BatteryTemperature int8u + 2 BatteryUnknown? no + 8 BatteryVoltage? no + 10 ImageStabilization2? int8u + 12 BatteryLevel int8u + 26 ExtraInfoVersion int8u[4] + +=head3 Sony ExtraInfo2 Tags + +Extra hardware information for the A230/290/330/380/390. + + Index1 Tag Name Writable + ------ -------- -------- + 4 BatteryLevel int8u + 18 ImageStabilization int8u + +=head3 Sony ExtraInfo3 Tags + +Extra hardware information for the A33, A35, A55, A450, A500, A550, A560, +A580 and NEX-3/5/C3/VG10. + + Index1 Tag Name Writable + ------ -------- -------- + 0 BatteryUnknown? int16u + 2 BatteryTemperature int8u + 4 BatteryLevel int8u + 6 BatteryVoltage1 int16u + 8 BatteryVoltage2 int16u + 17 ImageStabilization int8u + 20 BatteryState int8u + ExposureProgram int8u + ModeDialPosition int8u + 22 MemoryCardConfiguration int8u & 0xc0 + CameraOrientation int8u + 24 CameraOrientation int8u & 0x30 + +=head3 Sony Panorama Tags + +Tags found in panorama images from various Sony DSC, NEX, SLT and DSLR +cameras. The width/height values of these tags are not affected by camera +rotation -- the width is always the longer dimension. + + Index4 Tag Name Writable + ------ -------- -------- + 1 PanoramaFullWidth int32u + 2 PanoramaFullHeight int32u + 3 PanoramaDirection int32u + 4 PanoramaCropLeft int32u + 5 PanoramaCropTop int32u + 6 PanoramaCropRight int32u + 7 PanoramaCropBottom int32u + 8 PanoramaFrameWidth int32u + 9 PanoramaFrameHeight int32u + 10 PanoramaSourceWidth int32u + 11 PanoramaSourceHeight int32u + +=head3 Sony Tag2010a Tags + +Valid for NEX-5N. + + Index1 Tag Name Writable + ------ -------- -------- + 1200 MeterInfo? Sony MeterInfo + 4392 ReleaseMode3 int8u + 4396 ReleaseMode2 int8u + 4404 SelfTimer int8u + 4408 FlashMode int8u + 4414 StopsAboveBaseISO int16u + 4416 BrightnessValue int16u + 4420 DynamicRangeOptimizer int8u + 4424 HDRSetting int8u + 4428 ExposureCompensation int16s + 4446 PictureProfile int8u + 4447 PictureProfile int8u + 4451 PictureEffect2 int8u + 4464 Quality2 int8u + 4468 MeteringMode int8u + 4469 ExposureProgram int8u + 4476 WB_RGBLevels int16u[3] + +=head3 Sony MeterInfo Tags + +Information possibly related to metering. Extracted only if the Unknown +option is used. + + Index1 Tag Name Writable + ------ -------- -------- + 0 MeterInfo1Row1 int32u[27] + 108 MeterInfo1Row2 int32u[27] + 216 MeterInfo1Row3 int32u[27] + 324 MeterInfo1Row4 int32u[27] + 432 MeterInfo1Row5 int32u[27] + 540 MeterInfo1Row6 int32u[27] + 648 MeterInfo1Row7 int32u[27] + 756 MeterInfo2Row1 int32u[33] + 888 MeterInfo2Row2 int32u[33] + 1020 MeterInfo2Row3 int32u[33] + 1152 MeterInfo2Row4 int32u[33] + 1284 MeterInfo2Row5 int32u[33] + 1416 MeterInfo2Row6 int32u[33] + 1548 MeterInfo2Row7 int32u[33] + 1680 MeterInfo2Row8 int32u[33] + 1812 MeterInfo2Row9 int32u[33] + +=head3 Sony Tag2010b Tags + +Valid for SLT-A65/A77, NEX-7/VG20E. + + Index1 Tag Name Writable + ------ -------- -------- + 0 SequenceImageNumber int32u + 4 SequenceFileNumber int32u + 8 ReleaseMode2 int32u + 438 SonyDateTime undef[7] + 804 DynamicRangeOptimizer int8u + 1204 MeterInfo? Sony MeterInfo + 4392 ReleaseMode3 int8u + 4396 ReleaseMode2 int8u + 4404 SelfTimer int8u + 4408 FlashMode int8u + 4414 StopsAboveBaseISO int16u + 4416 BrightnessValue int16u + 4420 DynamicRangeOptimizer int8u + 4424 HDRSetting int8u + 4428 ExposureCompensation int16s + 4450 PictureProfile int8u + 4451 PictureProfile int8u + 4455 PictureEffect2 int8u + 4468 Quality2 int8u + 4472 MeteringMode int8u + 4473 ExposureProgram int8u + 4480 WB_RGBLevels int16u[3] + 4632 SonyISO int16u + 6691 DistortionCorrParams int16s[16] + +=head3 Sony Tag2010c Tags + +Valid for SLT-A37/A57 and NEX-F3. + + Index1 Tag Name Writable + ------ -------- -------- + 0 SequenceImageNumber int32u + 4 SequenceFileNumber int32u + 8 ReleaseMode2 int32u + 512 DigitalZoomRatio int8u + 528 SonyDateTime undef[7] + 768 DynamicRangeOptimizer int8u + 1168 MeterInfo? Sony MeterInfo + 4356 ReleaseMode3 int8u + 4360 ReleaseMode2 int8u + 4368 SelfTimer int8u + 4372 FlashMode int8u + 4378 StopsAboveBaseISO int16u + 4380 BrightnessValue int16u + 4384 DynamicRangeOptimizer int8u + 4388 HDRSetting int8u + 4392 ExposureCompensation int16s + 4414 PictureProfile int8u + 4415 PictureProfile int8u + 4419 PictureEffect2 int8u + 4432 Quality2 int8u + 4436 MeteringMode int8u + 4437 ExposureProgram int8u + 4444 WB_RGBLevels int16u[3] + 4596 SonyISO int16u + +=head3 Sony Tag2010d Tags + +Valid for DSC-HX10V/HX20V/HX200V/TX66/TX200V/TX300V/WX50/WX100/WX150, but +not valid for panorama images. + + Index1 Tag Name Writable + ------ -------- -------- + 0 SequenceImageNumber int32u + 4 SequenceFileNumber int32u + 8 ReleaseMode2 int32u + 510 SonyDateTime undef[7] + 892 DynamicRangeOptimizer int8u + 1292 MeterInfo? Sony MeterInfo + 4480 ReleaseMode3 int8u + 4484 ReleaseMode2 int8u + 4492 SelfTimer int8u + 4496 FlashMode int8u + 4502 StopsAboveBaseISO int16u + 4504 BrightnessValue int16u + 4508 DynamicRangeOptimizer int8u + 4512 HDRSetting int8u + 4538 PictureProfile int8u + 4539 PictureProfile int8u + 4543 PictureEffect2 int8u + 4560 MeteringMode int8u + 4561 ExposureProgram int8u + 4568 WB_RGBLevels int16u[3] + 4720 SonyISO int16u + +=head3 Sony Tag2010e Tags + +Valid for SLT-A58/A99, ILCE-3000/3500, NEX-3N/5R/5T/6/VG30E/VG900, +DSC-RX100, DSC-RX1/RX1R. Also valid for DSC-HX300/HX50V/TX30/WX60/WX200/ +WX300, but not for panorama images. + + Index1 Tag Name Writable + ------ -------- -------- + 0 SequenceImageNumber int32u + 4 SequenceFileNumber int32u + 8 ReleaseMode2 int32u + 540 DigitalZoomRatio int8u + 556 SonyDateTime undef[7] + 808 DynamicRangeOptimizer int8u + 1208 MeterInfo? Sony MeterInfo + 4444 ReleaseMode3 int8u + 4448 ReleaseMode2 int8u + 4456 SelfTimer int8u + 4460 FlashMode int8u + 4466 StopsAboveBaseISO int16u + 4468 BrightnessValue int16u + 4472 DynamicRangeOptimizer int8u + 4476 HDRSetting int8u + 4480 ExposureCompensation int16s + 4502 PictureProfile int8u + 4503 PictureProfile int8u + 4507 PictureEffect2 int8u + 4520 Quality2 int8u + 4524 MeteringMode int8u + 4525 ExposureProgram int8u + 4532 WB_RGBLevels int16u[3] + 4692 SonyISO int16u + 4696 SonyISO int16u + 4728 FocalLength int16u + 4730 MinFocalLength int16u + 4732 MaxFocalLength int16u + 4736 SonyISO int16u + 6256 DistortionCorrParams int16s[16] + 6289 LensFormat int8u + 6290 LensMount int8u + 6291 LensType2 int16u + 6294 LensType int16u + 6296 DistortionCorrParamsPresent int8u + 6297 DistortionCorrParamsNumber int8u + +=head3 Sony Tag2010f Tags + +Valid for DSC-RX100M2, DSC-QX10/QX100. + + Index1 Tag Name Writable + ------ -------- -------- + 4 ReleaseMode2 int32u + 80 DynamicRangeOptimizer int8u + 480 MeterInfo? Sony MeterInfo + 4116 ReleaseMode3 int8u + 4120 ReleaseMode2 int8u + 4128 SelfTimer int8u + 4132 FlashMode int8u + 4138 StopsAboveBaseISO int16u + 4140 BrightnessValue int16u + 4144 DynamicRangeOptimizer int8u + 4148 HDRSetting int8u + 4152 ExposureCompensation int16s + 4174 PictureProfile int8u + 4175 PictureProfile int8u + 4179 PictureEffect2 int8u + 4192 Quality2 int8u + 4196 MeteringMode int8u + 4197 ExposureProgram int8u + 4204 WB_RGBLevels int16u[3] + 4404 FocalLength int16u + 4406 MinFocalLength int16u + 4408 MaxFocalLength int16u + 4412 SonyISO int16u + +=head3 Sony Tag2010g Tags + +Valid for DSC-HX60V/HX350/HX400V/QX30/RX10/RX100M3/WX220/WX350, +ILCE-7/7R/7S/7M2/5000/5100/6000/QX1, ILCA-68/77M2. + + Index1 Tag Name Writable + ------ -------- -------- + 4 ReleaseMode2 int32u + 80 DynamicRangeOptimizer int8u + 524 ReleaseMode3 int8u + 528 ReleaseMode2 int8u + 536 SelfTimer int8u + 540 FlashMode int8u + 546 StopsAboveBaseISO int16u + 548 BrightnessValue int16u + 552 DynamicRangeOptimizer int8u + 556 HDRSetting int8u + 560 ExposureCompensation int16s + 582 PictureProfile int8u + 583 PictureProfile int8u + 587 PictureEffect2 int8u + 600 Quality2 int8u + 604 MeteringMode int8u + 605 ExposureProgram int8u + 612 WB_RGBLevels int16u[3] + 812 FocalLength int16u + 814 MinFocalLength int16u + 816 MaxFocalLength int16u + 836 SonyISO int16u + 904 MeterInfo? Sony MeterInfo + 6300 DistortionCorrParams int16s[16] + 6333 LensFormat int8u + 6334 LensMount int8u + 6335 LensType2 int16u + 6338 LensType int16u + 6340 DistortionCorrParamsPresent int8u + 6341 DistortionCorrParamsNumber int8u + +=head3 Sony Tag2010h Tags + +Valid for DSC-HX80/HX90V/RX0/RX1RM2/RX10M2/RX10M3/RX100M4/RX100M5/WX500, +ILCE-6300/6500/7RM2/7SM2, ILCA-99M2. + + Index1 Tag Name Writable + ------ -------- -------- + 4 ReleaseMode2 int32u + 80 DynamicRangeOptimizer int8u + 524 ReleaseMode3 int8u + 528 ReleaseMode2 int8u + 536 SelfTimer int8u + 540 FlashMode int8u + 546 StopsAboveBaseISO int16u + 548 BrightnessValue int16u + 552 DynamicRangeOptimizer int8u + 556 HDRSetting int8u + 560 ExposureCompensation int16s + 582 PictureProfile int8u + 583 PictureProfile int8u + 587 PictureEffect2 int8u + 600 Quality2 int8u + 604 MeteringMode int8u + 605 ExposureProgram int8u + 612 WB_RGBLevels int16u[3] + 812 FocalLength int16u + 814 MinFocalLength int16u + 816 MaxFocalLength int16u + 838 SonyISO int16u + 904 MeterInfo? Sony MeterInfo + 920 MeterInfo? Sony MeterInfo + 6348 DistortionCorrParams int16s[16] + 6381 LensFormat int8u + 6382 LensMount int8u + 6383 LensType2 int16u + 6386 LensType int16u + 6388 DistortionCorrParamsPresent int8u + 6389 DistortionCorrParamsNumber int8u + +=head3 Sony Tag2010i Tags + +Valid for ILCE-6100/6400/6600/7C/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M6/ +RX100M5A/RX100M7/HX99. + + Index1 Tag Name Writable + ------ -------- -------- + 4 ReleaseMode2 int32u + 78 DynamicRangeOptimizer int8u + 516 ReleaseMode3 int8u + 520 ReleaseMode2 int8u + 528 SelfTimer int8u + 529 FlashMode int8u + 535 StopsAboveBaseISO int16u + 537 BrightnessValue int16u + 539 DynamicRangeOptimizer int8u + 543 HDRSetting int8u + 547 ExposureCompensation int16s + 567 PictureProfile int8u + 568 PictureProfile int8u + 572 PictureEffect2 int8u + 583 Quality2 int8u + 587 MeteringMode int8u + 588 ExposureProgram int8u + 594 WB_RGBLevels int16u[3] + 778 FocalLength int16u + 780 MinFocalLength int16u + 782 MaxFocalLength int16u + 800 SonyISO int16u + 877 MeterInfo? Sony MeterInfo9 + 6096 DistortionCorrParams int16s[16] + 6129 LensFormat int8u + 6130 LensMount int8u + 6131 LensType2 int16u + 6134 LensType int16u + 6136 DistortionCorrParamsPresent int8u + 6137 DistortionCorrParamsNumber int8u + +=head3 Sony MeterInfo9 Tags + +Information possibly related to metering. Extracted only if the Unknown +option is used. + + Index1 Tag Name Writable + ------ -------- -------- + 0 MeterInfo1Row1 no + 90 MeterInfo1Row2 no + 180 MeterInfo1Row3 no + 270 MeterInfo1Row4 no + 360 MeterInfo1Row5 no + 450 MeterInfo1Row6 no + 540 MeterInfo1Row7 no + 630 MeterInfo2Row1 no + 740 MeterInfo2Row2 no + 850 MeterInfo2Row3 no + 960 MeterInfo2Row4 no + 1070 MeterInfo2Row5 no + 1180 MeterInfo2Row6 no + 1290 MeterInfo2Row7 no + 1400 MeterInfo2Row8 no + 1510 MeterInfo2Row9 no + +=head3 Sony Tag202a Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1 FocalPlaneAFPointsUsed int8u + 2 FocalPlaneAFPointArea int16u[2] + 6 FocalPlaneAFPointLocation1 int16u[2] + 10 FocalPlaneAFPointLocation2 int16u[2] + 14 FocalPlaneAFPointLocation3 int16u[2] + 18 FocalPlaneAFPointLocation4 int16u[2] + 22 FocalPlaneAFPointLocation5 int16u[2] + 26 FocalPlaneAFPointLocation6 int16u[2] + 30 FocalPlaneAFPointLocation7 int16u[2] + 34 FocalPlaneAFPointLocation8 int16u[2] + 38 FocalPlaneAFPointLocation9 int16u[2] + 42 FocalPlaneAFPointLocation10 int16u[2] + 46 FocalPlaneAFPointLocation11 int16u[2] + 50 FocalPlaneAFPointLocation12 int16u[2] + 54 FocalPlaneAFPointLocation13 int16u[2] + 58 FocalPlaneAFPointLocation14 int16u[2] + 62 FocalPlaneAFPointLocation15 int16u[2] + +=head3 Sony ShotInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 2 FaceInfoOffset no + 6 SonyDateTime string[20] + 26 SonyImageHeight int16u + 28 SonyImageWidth int16u + 48 FacesDetected int16u + 50 FaceInfoLength no + 52 MetaVersion string[16] + 72 FaceInfo1 Sony FaceInfo1 + 94 FaceInfo2 Sony FaceInfo2 + +=head3 Sony FaceInfo1 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 Face1Position int16u[4] + 32 Face2Position int16u[4] + 64 Face3Position int16u[4] + 96 Face4Position int16u[4] + 128 Face5Position int16u[4] + 160 Face6Position int16u[4] + 192 Face7Position int16u[4] + 224 Face8Position int16u[4] + +=head3 Sony FaceInfo2 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 Face1Position int16u[4] + 37 Face2Position int16u[4] + 74 Face3Position int16u[4] + 111 Face4Position int16u[4] + 148 Face5Position int16u[4] + 185 Face6Position int16u[4] + 222 Face7Position int16u[4] + 259 Face8Position int16u[4] + +=head3 Sony Tag900b Tags + + Index1 Tag Name Writable + ------ -------- -------- + 2 FacesDetected no + 189 FaceDetection no + +=head3 Sony Tag9050a Tags + +Data for tags 0x9050, 0x94xx and 0x2010 is encrypted by a simple +substitution cipher, but the deciphered values are listed below. + + Index1 Tag Name Writable + ------ -------- -------- + 0 SonyMaxAperture int8u + 1 SonyMinAperture int8u + 32 Shutter int16u[3] + 49 FlashStatus int8u + 50 ShutterCount int32u + 58 SonyExposureTime int16u + 60 SonyFNumber int16u + 63 ReleaseMode2 int8u + 76 ShutterCount2 int32u + 81 SonyDateTime2 undef[6] + 103 ReleaseMode2 int8u + 124 InternalSerialNumber int8u[4]~ + 240 InternalSerialNumber int8u[5] + 261 LensMount int8u + 262 LensFormat int8u + 263 LensType2 int16u + 265 LensType int16u + 267 DistortionCorrParamsPresent int8u + 276 APS-CSizeCapture int8u + 277 LensSpecFeatures undef[2] + 278 LensSpecFeatures undef[2] + 416 ShutterCount3 int32u + 426 ShutterCount3 int32u + 445 ShutterCount3 int32u + +=head3 Sony Tag9050b Tags + +Valid from July 2015 for ILCE-6100/6300/6400/6500/6600/7C/7M3/7RM2/7RM3/7RM4/ +7SM2/9/9M2, ILCA-99M2. + + Index1 Tag Name Writable + ------ -------- -------- + 0 SonyMaxAperture int8u + 1 SonyMinAperture int8u + 38 Shutter int16u[3] + 57 FlashStatus int8u + 58 ShutterCount int32u + 70 SonyExposureTime int16u + 72 SonyFNumber int16u + 75 ReleaseMode2 int8u + 80 ShutterCount2 int32u + 82 ShutterCount2 int32u + 88 ShutterCount2 int32u + 97 SonyTimeMinSec no + 107 ReleaseMode2 int8u + 109 ReleaseMode2 int8u + 115 ReleaseMode2 int8u + 136 InternalSerialNumber int8u[6]~ + 261 LensMount int8u + 262 LensFormat int8u + 263 LensType2 int16u + 265 LensType int16u + 267 DistortionCorrParamsPresent int8u + 276 APS-CSizeCapture int8u + 278 LensSpecFeatures undef[2] + 415 ShutterCount3 int32u + 459 ShutterCount3 int32u + 461 ShutterCount3 int32u + 491 APS-CSizeCapture int8u + 493 LensSpecFeatures undef[2] + 494 APS-CSizeCapture int8u + 496 LensSpecFeatures undef[2] + 538 APS-CSizeCapture int8u + 540 LensSpecFeatures undef[2] + APS-CSizeCapture int8u + 542 LensSpecFeatures undef[2] + +=head3 Sony Tag9050c Tags + +Valid from July 2020 for ILCE-1/7SM3, ILME-FX3. + + Index1 Tag Name Writable + ------ -------- -------- + 38 Shutter int16u[3] + 57 FlashStatus int8u + 58 ShutterCount int32u~ + 70 SonyExposureTime int16u + 72 SonyFNumber int16u + 75 ReleaseMode2 int8u + 80 ShutterCount2 int32u + 102 SonyExposureTime int16u + 104 SonyFNumber int16u + 107 ReleaseMode2 int8u + 136 InternalSerialNumber int8u[6]~ + 138 InternalSerialNumber int8u[6]~ + +=head3 Sony Tag9400a Tags + +Valid for many DSC, NEX and SLT models + + Index1 Tag Name Writable + ------ -------- -------- + 8 SequenceImageNumber int32u + 12 SequenceFileNumber int32u + 16 ReleaseMode2 int8u + 18 DigitalZoom int8u + 26 ShotNumberSincePowerUp int32u + 34 SequenceLength int8u + 40 CameraOrientation int8u + 41 Quality2 int8u + 68 SonyImageHeight int16u~ + 82 ModelReleaseYear int8u~ + +=head3 Sony Tag9400b Tags + +Valid for NEX-3N, ILCE-3000/3500, SLT-A58, DSC-WX60, DSC-WX300, DSC-RX100M2, +DSC-HX50V, DSC-QX10/QX100. + + Index1 Tag Name Writable + ------ -------- -------- + 8 SequenceImageNumber int32u + 12 SequenceFileNumber int32u + 16 ReleaseMode2 int8u + 18 DigitalZoom int8u + 22 ShotNumberSincePowerUp int32u + 30 SequenceLength int8u + 36 CameraOrientation int8u + 37 Quality2 int8u + 63 SonyImageHeight int16u~ + 70 ModelReleaseYear int8u~ + +=head3 Sony Tag9400c Tags + +Valid for DSC-HX60V/HX80/HX90V/HX99/HX350/HX400V/QX30/RX0/RX1RM2/RX10/ +RX10M2/RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/WX220/ +WX350/WX500, ILCE-1/7/7C/7R/7S/7M2/7M3/7RM2/7RM3/7RM4/7SM2/7SM3/9/9M2/5000/ +5100/6000/6100/6300/6400/6500/6600/QX1, ILCA-68/77M2/99M2. + + Index1 Tag Name Writable + ------ -------- -------- + 9 ReleaseMode2 int8u + 10 ShotNumberSincePowerUp int32u + 18 SequenceImageNumber int32u + 22 SequenceLength int8u + 26 SequenceFileNumber int32u + 30 SequenceLength int8u + 41 CameraOrientation int8u + 42 Quality2 int8u + 71 SonyImageHeight int16u~ + 83 ModelReleaseYear int8u~ + +=head3 Sony Tag9401 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1176 ISOInfo Sony ISOInfo + 1181 ISOInfo Sony ISOInfo + 1185 ISOInfo Sony ISOInfo + 1186 ISOInfo Sony ISOInfo + 1437 ISOInfo Sony ISOInfo + 1588 ISOInfo Sony ISOInfo + 1590 ISOInfo Sony ISOInfo + 1612 ISOInfo Sony ISOInfo + 1619 ISOInfo Sony ISOInfo + 1656 ISOInfo Sony ISOInfo + 1720 ISOInfo Sony ISOInfo + 1758 ISOInfo Sony ISOInfo + 1767 ISOInfo Sony ISOInfo + +=head3 Sony ISOInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ISOSetting int8u + 2 ISOAutoMin int8u + 4 ISOAutoMax int8u + +=head3 Sony Tag9402 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 AmbientTemperature int8s + 22 FocusMode int8u & 0x7f + 23 AFAreaMode int8u + 45 FocusPosition2 int8u + +=head3 Sony Tag9403 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 5 CameraTemperature int8s + +=head3 Sony Tag9404a Tags + + Index1 Tag Name Writable + ------ -------- -------- + 11 ExposureProgram int8u + 13 IntelligentAuto int8u + 25 LensZoomPosition int16u + +=head3 Sony Tag9404b Tags + + Index1 Tag Name Writable + ------ -------- -------- + 12 ExposureProgram int8u + 14 IntelligentAuto int8u + 30 LensZoomPosition int16u + 32 FocusPosition2 int8u + +=head3 Sony Tag9404c Tags + + Index1 Tag Name Writable + ------ -------- -------- + 11 ExposureProgram int8u + 13 IntelligentAuto int8u + +=head3 Sony Tag9405a Tags + +Valid for SLT, NEX, ILCE-3000/3500 and several DSC models. + + Index1 Tag Name Writable + ------ -------- -------- + 1536 DistortionCorrParamsPresent int8u + 1537 DistortionCorrection int8u + 1539 LensFormat int8u + 1540 LensMount int8u + 1541 LensType2 int16u + 1544 LensType int16u + 1610 VignettingCorrParams int16s[16] + 1642 ChromaticAberrationCorrParams int16s[32] + 1738 DistortionCorrParams int16s[16] + +=head3 Sony Tag9405b Tags + +Valid for DSC-HX60V/HX80/HX90V/HX99/HX350/HX400V/QX30/RX0/RX10/RX10M2/ +RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/WX220/WX350, +ILCE-7/7M2/7M3/7R/7RM2/7RM3/7RM4/7S/7SM2/9/9M2/5000/5100/6000/6100/6300/ +6400/6500/6600/QX1, ILCA-68/77M2/99M2. + + Index1 Tag Name Writable + ------ -------- -------- + 4 SonyISO int16u + 6 BaseISO int16u + 10 StopsAboveBaseISO int16u + 14 SonyExposureTime2 int16u + 16 ExposureTime rational32u + 20 SonyFNumber int16u + 22 SonyMaxApertureValue int16u + 36 SequenceImageNumber int32u + 52 ReleaseMode2 int8u + 62 SonyImageWidthMax int16u + 64 SonyImageHeightMax int16u + 66 HighISONoiseReduction int8u + 68 LongExposureNoiseReduction int8u + 70 PictureEffect2 int8u + 72 ExposureProgram int8u + 74 CreativeStyle int8u + 82 Sharpness int8s + 90 DistortionCorrParamsPresent int8u + 91 DistortionCorrection int8u + 93 LensFormat int8u + 94 LensMount int8u + 96 LensType2 int16u + 98 LensType int16u + 100 DistortionCorrParams int16s[16] + 834 LensZoomPosition int16u + 842 VignettingCorrParams int16s[16] + 846 LensZoomPosition int16u + 848 VignettingCorrParams int16s[16] + 858 LensZoomPosition int16u + 860 VignettingCorrParams int16s[16] + 872 VignettingCorrParams int16s[16] + 892 ChromaticAberrationCorrParams int16s[32] + 900 ChromaticAberrationCorrParams int16s[32] + 924 ChromaticAberrationCorrParams int16s[32] + 944 ChromaticAberrationCorrParams int16s[32] + 952 ChromaticAberrationCorrParams int16s[32] + +=head3 Sony Tag9406 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 5 BatteryTemperature int8u + 6 BatteryLevelGrip1 int8u + 7 BatteryLevel int8u + 8 BatteryLevelGrip2 int8u + +=head3 Sony Tag940a Tags + +These tags are currently extracted for SLT models only. + + Index1 Tag Name Writable + ------ -------- -------- + 4 AFPointsSelected int32u + +=head3 Sony Tag940c Tags + +E-mount cameras only. + + Index1 Tag Name Writable + ------ -------- -------- + 8 LensMount2 int8u + 9 LensType3 int16u + 11 CameraE-mountVersion int16u + 13 LensE-mountVersion int16u + 20 LensFirmwareVersion int16u~ + +=head3 Sony AFInfo Tags + +These tags are currently extracted for SLT models only. + + Index1 Tag Name Writable + ------ -------- -------- + 2 AFType int8u + 4 AFStatusActiveSensor int16s + 5 FocusMode int8u + 7 AFPoint int8u + 8 AFPointInFocus int8u + 9 AFPointAtShutterRelease int8u + 10 AFAreaMode int8u + 11 FocusMode int8u + 16 AFPointsUsed int8u[10] + 17 AFStatus15 Sony AFStatus15 + AFStatus19 Sony AFStatus19 + 55 AFPoint int8u + 56 AFPointInFocus int8u + 57 AFPointAtShutterRelease int8u + 58 AFAreaMode int8u + 59 AFStatusActiveSensor int16s + 67 ExposureProgram int8u + 80 AFMicroAdj int8s + 125 AFStatus79 Sony AFStatus79 + 366 AFPointsUsed int32u + 381 AFMicroAdj int8s + 382 ExposureProgram int8u + +=head3 Sony AFStatus19 Tags + +AF Status information for models with 19-point AF. + + Index1 Tag Name Writable + ------ -------- -------- + 0 AFStatusUpperFarLeft int16s + 2 AFStatusUpper-leftHorizontal int16s + 4 AFStatusFarLeftHorizontal int16s + 6 AFStatusLeftHorizontal int16s + 8 AFStatusLowerFarLeft int16s + 10 AFStatusLower-leftHorizontal int16s + 12 AFStatusUpper-leftVertical int16s + 14 AFStatusLeftVertical int16s + 16 AFStatusLower-leftVertical int16s + 18 AFStatusFarLeftVertical int16s + 20 AFStatusTopHorizontal int16s + 22 AFStatusNearRight int16s + 24 AFStatusCenterHorizontal int16s + 26 AFStatusNearLeft int16s + 28 AFStatusBottomHorizontal int16s + 30 AFStatusTopVertical int16s + 32 AFStatusUpper-middle int16s + 34 AFStatusCenterVertical int16s + 36 AFStatusLower-middle int16s + 38 AFStatusBottomVertical int16s + 40 AFStatusUpperFarRight int16s + 42 AFStatusUpper-rightHorizontal int16s + 44 AFStatusFarRightHorizontal int16s + 46 AFStatusRightHorizontal int16s + 48 AFStatusLowerFarRight int16s + 50 AFStatusLower-rightHorizontal int16s + 52 AFStatusFarRightVertical int16s + 54 AFStatusUpper-rightVertical int16s + 56 AFStatusRightVertical int16s + 58 AFStatusLower-rightVertical int16s + +=head3 Sony AFStatus79 Tags + +AF Status information for models with 79-point AF. + + Index1 Tag Name Writable + ------ -------- -------- + 0 AFStatus_00_B4 int16s + 2 AFStatus_01_C4 int16s + 4 AFStatus_02_D4 int16s + 6 AFStatus_03_E4 int16s + 8 AFStatus_04_F4 int16s + 10 AFStatus_05_G4 int16s + 12 AFStatus_06_H4 int16s + 14 AFStatus_07_B3 int16s + 16 AFStatus_08_C3 int16s + 18 AFStatus_09_D3 int16s + 20 AFStatus_10_E3 int16s + 22 AFStatus_11_F3 int16s + 24 AFStatus_12_G3 int16s + 26 AFStatus_13_H3 int16s + 28 AFStatus_14_B2 int16s + 30 AFStatus_15_C2 int16s + 32 AFStatus_16_D2 int16s + 34 AFStatus_17_E2 int16s + 36 AFStatus_18_F2 int16s + 38 AFStatus_19_G2 int16s + 40 AFStatus_20_H2 int16s + 42 AFStatus_21_C1 int16s + 44 AFStatus_22_D1 int16s + 46 AFStatus_23_E1 int16s + 48 AFStatus_24_F1 int16s + 50 AFStatus_25_G1 int16s + 52 AFStatus_26_A7_Vertical int16s + 54 AFStatus_27_A6_Vertical int16s + 56 AFStatus_28_A5_Vertical int16s + 58 AFStatus_29_C7_Vertical int16s + 60 AFStatus_30_C6_Vertical int16s + 62 AFStatus_31_C5_Vertical int16s + 64 AFStatus_32_E7_Vertical int16s + 66 AFStatus_33_E6_Center_Vertical int16s + 68 AFStatus_34_E5_Vertical int16s + 70 AFStatus_35_G7_Vertical int16s + 72 AFStatus_36_G6_Vertical int16s + 74 AFStatus_37_G5_Vertical int16s + 76 AFStatus_38_I7_Vertical int16s + 78 AFStatus_39_I6_Vertical int16s + 80 AFStatus_40_I5_Vertical int16s + 82 AFStatus_41_A7 int16s + 84 AFStatus_42_B7 int16s + 86 AFStatus_43_C7 int16s + 88 AFStatus_44_D7 int16s + 90 AFStatus_45_E7 int16s + 92 AFStatus_46_F7 int16s + 94 AFStatus_47_G7 int16s + 96 AFStatus_48_H7 int16s + 98 AFStatus_49_I7 int16s + 100 AFStatus_50_A6 int16s + 102 AFStatus_51_B6 int16s + 104 AFStatus_52_C6 int16s + 106 AFStatus_53_D6 int16s + 108 AFStatus_54_E6_Center int16s + 110 AFStatus_55_F6 int16s + 112 AFStatus_56_G6 int16s + 114 AFStatus_57_H6 int16s + 116 AFStatus_58_I6 int16s + 118 AFStatus_59_A5 int16s + 120 AFStatus_60_B5 int16s + 122 AFStatus_61_C5 int16s + 124 AFStatus_62_D5 int16s + 126 AFStatus_63_E5 int16s + 128 AFStatus_64_F5 int16s + 130 AFStatus_65_G5 int16s + 132 AFStatus_66_H5 int16s + 134 AFStatus_67_I5 int16s + 136 AFStatus_68_C11 int16s + 138 AFStatus_69_D11 int16s + 140 AFStatus_70_E11 int16s + 142 AFStatus_71_F11 int16s + 144 AFStatus_72_G11 int16s + 146 AFStatus_73_B10 int16s + 148 AFStatus_74_C10 int16s + 150 AFStatus_75_D10 int16s + 152 AFStatus_76_E10 int16s + 154 AFStatus_77_F10 int16s + 156 AFStatus_78_G10 int16s + 158 AFStatus_79_H10 int16s + 160 AFStatus_80_B9 int16s + 162 AFStatus_81_C9 int16s + 164 AFStatus_82_D9 int16s + 166 AFStatus_83_E9 int16s + 168 AFStatus_84_F9 int16s + 170 AFStatus_85_G9 int16s + 172 AFStatus_86_H9 int16s + 174 AFStatus_87_B8 int16s + 176 AFStatus_88_C8 int16s + 178 AFStatus_89_D8 int16s + 180 AFStatus_90_E8 int16s + 182 AFStatus_91_F8 int16s + 184 AFStatus_92_G8 int16s + 186 AFStatus_93_H8 int16s + 188 AFStatus_94_E6_Center_F2-8 int16s + +=head3 Sony Tag940e Tags + +E-mount models. + + Index1 Tag Name Writable + ------ -------- -------- + 6662 TiffMeteringImageWidth no + 6663 TiffMeteringImageHeight no + 6664 TiffMeteringImage no + +=head3 Sony Tag9416 Tags + +Valid for the ILCE-1/7M4/7SM3, ILME-FX3. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Tag9416_0000 no + 4 SonyISO no + 6 StopsAboveBaseISO no + 10 SonyExposureTime2 no + 12 ExposureTime no + 16 SonyFNumber2 no + 18 SonyMaxApertureValue no + 29 SequenceImageNumber no + 53 ExposureProgram no + 72 LensMount no + 73 LensFormat no + 74 LensMount no + 75 LensType2 no + 77 LensType no + 79 DistortionCorrParams no + 112 PictureProfile no + 113 FocalLength no + 115 MinFocalLength no + 117 MaxFocalLength no + 2191 VignettingCorrParams no + 2193 VignettingCorrParams no + 2324 ChromaticAberrationCorrParams no + 2326 ChromaticAberrationCorrParams no + +=head3 Sony PIC Tags + +The TextInfo data is extracted as a block to preserve the formatting, and +some of the more interesting information is extracted as separate tags. + + Tag ID Tag Name Writable + ------ -------- -------- + 'BC:' Barcode no + 'BarCode:' Barcode no + 'Capt:' SensorTemperature no + 'FWVer:' FirmwareVersion no + 'IFD' PIC_IFD Sony + 'Temp:' CameraTemperature no + 'Temp:Clbt:' BoardTemperature no + 'TextInfo1' TextInfo1 no + 'TextInfo2' TextInfo2 no + 'VR Enable C:' VibrationReduction no + 'barcode:' Barcode no + +=head3 Sony Ericsson Tags + +Maker notes found in images from some Sony Ericsson phones. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0201 PreviewImageStart int32u* + 0x0202 PreviewImageLength int32u* + 0x2000 MakerNoteVersion undef[4] + +=head3 Sony SRF Tags + +The maker notes in SRF (Sony Raw Format) images contain 7 IFD's with family +1 group names SRF0 through SRF6. SRF0 and SRF1 use the tags in this table, +while SRF2 through SRF5 use the tags in the next table, and SRF6 uses +standard EXIF tags. All information other than SRF0 is encrypted, but +thanks to Dave Coffin the decryption algorithm is known. SRF images are +written by the Sony DSC-F828 and DSC-V3. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 SRF2Key no + 0x0001 DataKey no + +=head3 Sony SRF2 Tags + +These tags are found in the SRF2 through SRF5 IFD's. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0002 SRF6Offset no + 0x0003 SRFDataOffset? no + 0x0004 RawDataOffset no + 0x0005 RawDataLength no + 0x0043 MaxApertureAtMaxFocal no + 0x0044 MaxApertureAtMinFocal no + 0x0045 MinFocalLength no + 0x0046 MaxFocalLength no + 0x00c0 WBRedDaylight no + 0x00c1 WBGreenDaylight no + 0x00c2 WBBlueDaylight no + 0x00c3 WBRedCloudy no + 0x00c4 WBGreenCloudy no + 0x00c5 WBBlueCloudy no + 0x00c6 WBRedFluorescent no + 0x00c7 WBGreenFluorescent no + 0x00c8 WBBlueFluorescent no + 0x00c9 WBRedTungsten no + 0x00ca WBGreenTungsten no + 0x00cb WBBlueTungsten no + 0x00cc WBRedFlash no + 0x00cd WBGreenFlash no + 0x00ce WBBlueFlash no + 0x00d0 WBRedAsShot no + 0x00d1 WBGreenAsShot no + 0x00d2 WBBlueAsShot no + +=head3 Sony SR2Private Tags + +The SR2 format uses the DNGPrivateData tag to reference a private IFD +containing these tags. SR2 images are written by the Sony DSC-R1, but +this information is also written to ARW images by other models. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x7200 SR2SubIFDOffset no + 0x7201 SR2SubIFDLength no + 0x7221 SR2SubIFDKey no + 0x7240 IDC_IFD SonyIDC + 0x7241 IDC2_IFD SonyIDC + 0x7250 MRWInfo MinoltaRaw + +=head3 Sony SR2SubIFD Tags + +Tags in the encrypted SR2SubIFD + + Tag ID Tag Name Writable + ------ -------- -------- + 0x7300 BlackLevel int16u[4]! + 0x7302 WB_GRBGLevelsAuto int16s[4]! + 0x7303 WB_GRBGLevels int16s[4]! + 0x7310 BlackLevel int16u[4]! + 0x7312 WB_RGGBLevelsAuto int16s[4]! + 0x7313 WB_RGGBLevels int16s[4]! + 0x7480 WB_RGBLevelsDaylight int16s[4]! + 0x7481 WB_RGBLevelsCloudy int16s[4]! + 0x7482 WB_RGBLevelsTungsten int16s[4]! + 0x7483 WB_RGBLevelsFlash int16s[4]! + 0x7484 WB_RGBLevels4500K int16s[4]! + 0x7486 WB_RGBLevelsFluorescent int16s[4]! + 0x74a0 MaxApertureAtMaxFocal no + 0x74a1 MaxApertureAtMinFocal no + 0x74a2 MaxFocalLength no + 0x74a3 MinFocalLength no + 0x74c0 SR2DataIFD Sony SR2DataIFD + 0x7800 ColorMatrix no + 0x7820 WB_RGBLevelsDaylight int16s[3]! + 0x7821 WB_RGBLevelsCloudy int16s[3]! + 0x7822 WB_RGBLevelsTungsten int16s[3]! + 0x7823 WB_RGBLevelsFlash int16s[3]! + 0x7824 WB_RGBLevels4500K int16s[3]! + 0x7825 WB_RGBLevelsShade int16s[3]! + 0x7826 WB_RGBLevelsFluorescent int16s[3]! + 0x7827 WB_RGBLevelsFluorescentP1 int16s[3]! + 0x7828 WB_RGBLevelsFluorescentP2 int16s[3]! + 0x7829 WB_RGBLevelsFluorescentM1 int16s[3]! + 0x782a WB_RGBLevels8500K int16s[3]! + 0x782b WB_RGBLevels6000K int16s[3]! + 0x782c WB_RGBLevels3200K int16s[3]! + 0x782d WB_RGBLevels2500K int16s[3]! + 0x787f WhiteLevel int16u[3]! + 0x797d VignettingCorrParams no + 0x7980 ChromaticAberrationCorrParams no + 0x7982 DistortionCorrParams no + +=head3 Sony SR2DataIFD Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x7770 ColorMode no + +=head3 Sony PMP Tags + +These tags are written in the proprietary-format header of PMP images from +the DSC-F1. + + Index1 Tag Name Writable + ------ -------- -------- + 8 JpgFromRawStart no + 12 JpgFromRawLength no + 22 SonyImageWidth no + 24 SonyImageHeight no + 27 Orientation no + 29 ImageQuality no + 52 Comment no + 76 DateTimeOriginal no + 84 ModifyDate no + 102 ExposureTime no + 106 FNumber no + 108 ExposureCompensation no + 112 FocalLength no + 118 Flash no + +=head3 Sony rtmd Tags + +These tags are extracted from the 'rtmd' timed metadata of MP4 videos from +some models when the ExtractEmbedded option is used. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x8000 FNumber no + 0x8109 ExposureTime no + 0x810a MasterGainAdjustment no + 0x810b ISO no + 0x810c ElectricalExtenderMagnification no + 0x8500 GPSVersionID no + 0x8501 GPSLatitudeRef no + 0x8502 GPSLatitude no + 0x8503 GPSLongitudeRef no + 0x8504 GPSLongitude no + 0x8507 GPSTimeStamp no + 0x8509 GPSStatus no + 0x850a GPSMeasureMode no + 0x8512 GPSMapDatum no + 0x851d GPSDateStamp no + 0xe303 WhiteBalance no + 0xe304 DateTime no + 0xe43b PitchRollYaw no + 0xe44b Accelerometer no + +=head2 SonyIDC Tags + +Tags written by the Sony Image Data Converter utility in ARW images. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0201 IDCPreviewStart int32u* + 0x0202 IDCPreviewLength int32u* + 0x8000 IDCCreativeStyle int32u + 0x8001 CreativeStyleWasChanged int32u + 0x8002 PresetWhiteBalance int32u + 0x8013 ColorTemperatureAdj int16u + 0x8014 PresetWhiteBalanceAdj int32s + 0x8015 ColorCorrection int32s + 0x8016 SaturationAdj int32s + 0x8017 ContrastAdj int32s + 0x8018 BrightnessAdj int32s + 0x8019 HueAdj int32s + 0x801a SharpnessAdj int32s + 0x801b SharpnessOvershoot int32s + 0x801c SharpnessUndershoot int32s + 0x801d SharpnessThreshold int32s + 0x801e NoiseReductionMode int16u + 0x8021 GrayPoint int16u[4] + 0x8022 D-RangeOptimizerMode int16u + 0x8023 D-RangeOptimizerValue int32s + 0x8024 D-RangeOptimizerHighlight int32s + 0x8026 HighlightColorDistortReduct int16u + 0x8027 NoiseReductionValue int32s + 0x8028 EdgeNoiseReduction int32s + 0x8029 ColorNoiseReduction int32s + 0x802d D-RangeOptimizerShadow int32s + 0x8030 PeripheralIllumCentralRadius int32s + 0x8031 PeripheralIllumCentralValue int32s + 0x8032 PeripheralIllumPeriphValue int32s + 0x8040 DistortionCompensation int32s + 0x9000 ToneCurveBrightnessX int16u[n] + 0x9001 ToneCurveRedX int16u[n] + 0x9002 ToneCurveGreenX int16u[n] + 0x9003 ToneCurveBlueX int16u[n] + 0x9004 ToneCurveBrightnessY int16u[n] + 0x9005 ToneCurveRedY int16u[n] + 0x9006 ToneCurveGreenY int16u[n] + 0x9007 ToneCurveBlueY int16u[n] + 0x900d ChromaticAberrationCorrection int32s + 0x900e InclinationCorrection int32u + 0x900f InclinationAngle int32s + 0x9010 Cropping int32u + 0x9011 CropArea int32u[4] + 0x9012 PreviewImageSize int32u[2] + 0x9013 PxShiftPeriphEdgeNR int32s + 0x9014 PxShiftPeriphEdgeNRValue int32s + 0x9017 WhitesAdj int32s + 0x9018 BlacksAdj int32s + 0x9019 HighlightsAdj int32s + 0x901a ShadowsAdj int32s + 0xd000 CurrentVersion int32u + 0xd001 VersionIFD SonyIDC + 0xd100 VersionCreateDate string + 0xd101 VersionModifyDate string + +=head2 Unknown Tags + +The following tags are decoded in unsupported maker notes. Use the Unknown +(-u) option to display other unknown tags. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0e00 PrintIM PrintIM + +=head2 DNG Tags + +The main DNG tags are found in the EXIF table. The tables below define only +information found within structures of these main DNG tag values. See +L<http://www.adobe.com/products/dng/> for the official DNG specification. + +=head3 DNG AdobeData Tags + +This information is found in the "Adobe" DNGPrivateData. + +The maker notes ('MakN') are processed by ExifTool, but some information may +have been lost by the Adobe DNG Converter. This is because the Adobe DNG +Converter (as of version 6.3) doesn't properly handle information referenced +from inside the maker notes that lies outside the original maker notes +block. This information is lost when only the maker note block is copied to +the DNG image. While this doesn't effect all makes of cameras, it is a +problem for some major brands such as Olympus and Sony. + +Other entries in this table represent proprietary information that is +extracted from the original RAW image and restructured to a different (but +still proprietary) Adobe format. + + Tag ID Tag Name Writable + ------ -------- -------- + 'CRW ' AdobeCRW CanonRaw + 'Koda' AdobeKoda Kodak IFD + 'Leaf' AdobeLeaf Leaf SubIFD + 'MRW ' AdobeMRW MinoltaRaw + 'MakN' MakerNoteApple Apple + MakerNoteNikon Nikon + MakerNoteCanon Canon + MakerNoteCasio Casio + MakerNoteCasio2 Casio Type2 + MakerNoteDJIInfo DJI Info + MakerNoteDJI DJI + MakerNoteFLIR FLIR + MakerNoteFujiFilm FujiFilm + MakerNoteGE GE + MakerNoteGE2 FujiFilm + MakerNoteHasselblad Unknown + MakerNoteHP HP + MakerNoteHP2 HP Type2 + MakerNoteHP4 HP Type4 + MakerNoteHP6 HP Type6 + MakerNoteISL Unknown + MakerNoteJVC JVC + MakerNoteJVCText JVC Text + MakerNoteKodak1a Kodak + MakerNoteKodak1b Kodak + MakerNoteKodak2 Kodak Type2 + MakerNoteKodak3 Kodak Type3 + MakerNoteKodak4 Kodak Type4 + MakerNoteKodak5 Kodak Type5 + MakerNoteKodak6a Kodak Type6 + MakerNoteKodak6b Kodak Type6 + MakerNoteKodak7 Kodak Type7 + MakerNoteKodak8a Kodak Type8 + MakerNoteKodak8b Kodak Type8 + MakerNoteKodak8c Kodak Type8 + MakerNoteKodak9 Kodak Type9 + MakerNoteKodak10 Kodak Type10 + MakerNoteKodak11 Kodak Type11 + MakerNoteKodak12 Kodak Type11 + MakerNoteKodakUnknown Kodak Unknown + MakerNoteKyocera Unknown + MakerNoteMinolta Minolta + MakerNoteMinolta2 Olympus + MakerNoteMinolta3 undef + MakerNoteMotorola Motorola + MakerNoteNikon2 Nikon Type2 + MakerNoteNikon3 Nikon + MakerNoteNintendo Nintendo + MakerNoteOlympus Olympus + MakerNoteOlympus2 Olympus + MakerNoteOlympus3 Olympus + MakerNoteLeica Panasonic + MakerNoteLeica2 Panasonic Leica2 + MakerNoteLeica3 Panasonic Leica3 + MakerNoteLeica4 Panasonic Leica4 + MakerNoteLeica5 Panasonic Leica5 + MakerNoteLeica6 Panasonic Leica6 + MakerNoteLeica7 Panasonic Leica6 + MakerNoteLeica8 Panasonic Leica5 + MakerNoteLeica9 Panasonic Leica9 + MakerNoteLeica10 Panasonic + MakerNotePanasonic Panasonic + MakerNotePanasonic2 Panasonic Type2 + MakerNotePanasonic3 Panasonic + MakerNotePentax Pentax + MakerNotePentax2 Pentax Type2 + MakerNotePentax3 Casio Type2 + MakerNotePentax4 Pentax Type4 + MakerNotePentax5 Pentax + MakerNotePentax6 Pentax S1 + MakerNotePhaseOne PhaseOne + MakerNoteReconyx Reconyx + MakerNoteReconyx2 Reconyx Type2 + MakerNoteReconyx3 Reconyx Type3 + MakerNoteRicohPentax Pentax + MakerNoteRicoh Ricoh + MakerNoteRicoh2 Ricoh Type2 + MakerNoteRicohText Ricoh Text + MakerNoteSamsung1a undef + MakerNoteSamsung1b Samsung + MakerNoteSamsung2 Samsung Type2 + MakerNoteSanyo Sanyo + MakerNoteSanyoC4 Sanyo + MakerNoteSanyoPatch Sanyo + MakerNoteSigma Sigma + MakerNoteSony Sony + MakerNoteSony2 Olympus + MakerNoteSony3 Olympus + MakerNoteSony4 Sony PIC + MakerNoteSony5 Sony + MakerNoteSonyEricsson Sony Ericsson + MakerNoteSonySRF Sony SRF + MakerNoteUnknownText undef + MakerNoteUnknownBinary undef + MakerNoteUnknown Unknown + 'Pano' AdobePano PanasonicRaw + 'RAF ' AdobeRAF FujiFilm RAF + 'SR2 ' AdobeSR2 Sony SR2Private + +=head3 DNG OriginalRaw Tags + +This table defines tags extracted from the DNG OriginalRawFileData +information. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 OriginalRawImage no + 0x0001 OriginalRawResource no + 0x0002 OriginalRawFileType no + 0x0003 OriginalRawCreator no + 0x0004 OriginalTHMImage no + 0x0005 OriginalTHMResource no + 0x0006 OriginalTHMFileType no + 0x0007 OriginalTHMCreator no + +=head2 CanonRaw Tags + +These tags apply to CRW-format Canon RAW files and information in the APP0 +"CIFF" segment of JPEG images. When writing CanonRaw/CIFF information, the +length of the information is preserved (and the new information is truncated +or padded as required) unless B<Writable> is C<resize>. Currently, only +JpgFromRaw and ThumbnailImage are allowed to change size. See +L<https://exiftool.org/canon_raw.html> for a description of the Canon CRW +format. + +CRW images also support the addition of a CanonVRD trailer, which in turn +supports XMP. This trailer is created automatically if necessary when +ExifTool is used to write XMP to a CRW image. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 NullRecord undef + 0x0001 FreeBytes undef + 0x0032 CanonColorInfo1 no + 0x0805 CanonFileDescription string[32] + UserComment string[256] + 0x080a CanonRawMakeModel CanonRaw MakeModel + 0x080b CanonFirmwareVersion string[32] + 0x080c ComponentVersion string + 0x080d ROMOperationMode string[8] + 0x0810 OwnerName string[32] + 0x0815 CanonImageType string[32] + 0x0816 OriginalFileName string[32] + 0x0817 ThumbnailFileName string[32] + 0x100a TargetImageType int16u + 0x1010 ShutterReleaseMethod int16u + 0x1011 ShutterReleaseTiming int16u + 0x1016 ReleaseSetting int16u + 0x101c BaseISO int16u + 0x1028 CanonFlashInfo? int16u[4] + 0x1029 CanonFocalLength Canon FocalLength + 0x102a CanonShotInfo Canon ShotInfo + 0x102c CanonColorInfo2 no + 0x102d CanonCameraSettings Canon CameraSettings + 0x1030 WhiteSample CanonRaw WhiteSample + 0x1031 SensorInfo Canon SensorInfo + 0x1033 CustomFunctions10D CanonCustom Functions10D + CustomFunctionsD30 CanonCustom FunctionsD30 + CustomFunctionsD60 CanonCustom FunctionsD30 + CustomFunctionsUnknown CanonCustom FuncsUnknown + 0x1038 CanonAFInfo Canon AFInfo + 0x1093 CanonFileInfo Canon FileInfo + 0x10a9 ColorBalance Canon ColorBalance + 0x10ae ColorTemperature int16u + 0x10b4 ColorSpace int16u + 0x10b5 RawJpgInfo CanonRaw RawJpgInfo + 0x1803 ImageFormat CanonRaw ImageFormat + 0x1804 RecordID int32u + 0x1806 SelfTimerTime int32u + 0x1807 TargetDistanceSetting float + 0x180b SerialNumber int32u + UnknownNumber? yes + 0x180e TimeStamp CanonRaw TimeStamp + 0x1810 ImageInfo CanonRaw ImageInfo + 0x1813 FlashInfo CanonRaw FlashInfo + 0x1814 MeasuredEV float + 0x1817 FileNumber int32u + 0x1818 ExposureInfo CanonRaw ExposureInfo + 0x1834 CanonModelID int32u + 0x1835 DecoderTable CanonRaw DecoderTable + 0x183b SerialNumberFormat int32u + 0x2005 RawData no + 0x2007 JpgFromRaw resize^ + 0x2008 ThumbnailImage resize^ + 0x2804 ImageDescription CanonRaw + 0x2807 CameraObject CanonRaw + 0x3002 ShootingRecord CanonRaw + 0x3003 MeasuredInfo CanonRaw + 0x3004 CameraSpecification CanonRaw + 0x300a ImageProps CanonRaw + 0x300b ExifInformation CanonRaw + +=head3 CanonRaw MakeModel Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 Make string[6] + 6 Model string + +=head3 CanonRaw WhiteSample Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 WhiteSampleWidth no + 2 WhiteSampleHeight no + 3 WhiteSampleLeftBorder no + 4 WhiteSampleTopBorder no + 5 WhiteSampleBits no + +=head3 CanonRaw RawJpgInfo Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1 RawJpgQuality int16u + 2 RawJpgSize int16u + 3 RawJpgWidth int16u + 4 RawJpgHeight int16u + +=head3 CanonRaw ImageFormat Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 FileFormat int32u + 1 TargetCompressionRatio float + +=head3 CanonRaw TimeStamp Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 DateTimeOriginal int32u + 1 TimeZoneCode int32s + 2 TimeZoneInfo int32u + +=head3 CanonRaw ImageInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 ImageWidth no + 1 ImageHeight no + 2 PixelAspectRatio no + 3 Rotation int32s + 4 ComponentBitDepth no + 5 ColorBitDepth no + 6 ColorBW no + +=head3 CanonRaw FlashInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 FlashGuideNumber float + 1 FlashThreshold float + +=head3 CanonRaw ExposureInfo Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 ExposureCompensation float + 1 ShutterSpeedValue float + 2 ApertureValue float + +=head3 CanonRaw DecoderTable Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 DecoderTableNumber no + 2 CompressedDataOffset no + 3 CompressedDataLength no + +=head2 KyoceraRaw Tags + +Tags for Kyocera Contax N Digital RAW images. + + Index1 Tag Name Writable + ------ -------- -------- + 1 FirmwareVersion no + 12 Model no + 25 Make no + 33 DateTimeOriginal no + 52 ISO no + 56 ExposureTime no + 60 WB_RGGBLevels no + 88 FNumber no + 104 MaxAperture no + 112 FocalLength no + 124 Lens no + +=head2 MinoltaRaw Tags + +These tags are used in Minolta RAW format (MRW) images. + + Tag ID Tag Name Writable + ------ -------- -------- + "\0PRD" MinoltaPRD MinoltaRaw PRD + "\0RIF" MinoltaRIF MinoltaRaw RIF + "\0TTW" MinoltaTTW EXIF + "\0WBG" MinoltaWBG MinoltaRaw WBG + +=head3 MinoltaRaw PRD Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 FirmwareID string[8] + 8 SensorHeight int16u + 10 SensorWidth int16u + 12 ImageHeight int16u + 14 ImageWidth int16u + 16 RawDepth int8u + 17 BitDepth int8u + 18 StorageMethod int8u + 23 BayerPattern int8u + +=head3 MinoltaRaw RIF Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1 Saturation int8s + 2 Contrast int8s + 3 Sharpness int8s + 4 WBMode int8u~ + 5 ProgramMode int8u + 6 ISOSetting int8u + 7 ColorMode int32u[0.25] + 8 WB_RBLevelsTungsten int16u[2] + 12 WB_RBLevelsDaylight int16u[2] + 16 WB_RBLevelsCloudy int16u[2] + 20 WB_RBLevelsCoolWhiteF int16u[2] + 24 WB_RBLevelsFlash int16u[2] + 28 WB_RBLevelsCustom int16u[2] + 32 WB_RBLevelsShade int16u[2] + 36 WB_RBLevelsDaylightF int16u[2] + 40 WB_RBLevelsDayWhiteF int16u[2] + 44 WB_RBLevelsWhiteF int16u[2] + 56 ColorFilter int8s + 57 BWFilter int8u + 58 ZoneMatching int8u + 59 Hue int8s + 60 ColorTemperature int8u + 74 ZoneMatching int8u + 76 ColorTemperature int8u + 77 ColorFilter int8u + 78 ColorTemperature int8u + 79 ColorFilter int8u + 80 RawDataLength no + +=head3 MinoltaRaw WBG Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 WBScale int8u[4] + 4 WB_GBRGLevels int16u[4] + WB_RGGBLevels int16u[4] + +=head2 PanasonicRaw Tags + +These tags are found in IFD0 of Panasonic/Leica RAW, RW2 and RWL images. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 PanasonicRawVersion undef + 0x0002 SensorWidth no + 0x0003 SensorHeight no + 0x0004 SensorTopBorder no + 0x0005 SensorLeftBorder no + 0x0006 SensorBottomBorder no + 0x0007 SensorRightBorder no + 0x0008 SamplesPerPixel int16u! + 0x0009 CFAPattern int16u! + 0x000a BitsPerSample int16u! + 0x000b Compression int16u! + 0x000e LinearityLimitRed int16u + 0x000f LinearityLimitGreen int16u + 0x0010 LinearityLimitBlue int16u + 0x0011 RedBalance int16u + 0x0012 BlueBalance int16u + 0x0013 WBInfo PanasonicRaw WBInfo + 0x0017 ISO int16u + 0x0018 HighISOMultiplierRed int16u + 0x0019 HighISOMultiplierGreen int16u + 0x001a HighISOMultiplierBlue int16u + 0x001b NoiseReductionParams undef[n]! + 0x001c BlackLevelRed int16u + 0x001d BlackLevelGreen int16u + 0x001e BlackLevelBlue int16u + 0x0024 WBRedLevel int16u + 0x0025 WBGreenLevel int16u + 0x0026 WBBlueLevel int16u + 0x0027 WBInfo2 PanasonicRaw WBInfo2 + 0x002d RawFormat int16u! + 0x002e JpgFromRaw JPEG + 0x002f CropTop int16u + 0x0030 CropLeft int16u + 0x0031 CropBottom int16u + 0x0032 CropRight int16u + 0x010f Make string + 0x0110 Model string + 0x0111 StripOffsets no + 0x0112 Orientation int16u + 0x0116 RowsPerStrip no + 0x0117 StripByteCounts no + 0x0118 RawDataOffset no + 0x0119 DistortionInfo PanasonicRaw DistortionInfo + 0x011c Gamma int16u + 0x0120 CameraIFD PanasonicRaw CameraIFD + 0x0121 Multishot int32u + 0x02bc ApplicationNotes XMP + 0x83bb IPTC-NAA IPTC + 0x8769 ExifOffset EXIF + 0x8825 GPSInfo GPS + +=head3 PanasonicRaw WBInfo Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 NumWBEntries int16u + 1 WBType1 int16u + 2 WB_RBLevels1 int16u[2] + 4 WBType2 int16u + 5 WB_RBLevels2 int16u[2] + 7 WBType3 int16u + 8 WB_RBLevels3 int16u[2] + 10 WBType4 int16u + 11 WB_RBLevels4 int16u[2] + 13 WBType5 int16u + 14 WB_RBLevels5 int16u[2] + 16 WBType6 int16u + 17 WB_RBLevels6 int16u[2] + 19 WBType7 int16u + 20 WB_RBLevels7 int16u[2] + +=head3 PanasonicRaw WBInfo2 Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 NumWBEntries int16u + 1 WBType1 int16u + 2 WB_RGBLevels1 int16u[3] + 5 WBType2 int16u + 6 WB_RGBLevels2 int16u[3] + 9 WBType3 int16u + 10 WB_RGBLevels3 int16u[3] + 13 WBType4 int16u + 14 WB_RGBLevels4 int16u[3] + 17 WBType5 int16u + 18 WB_RGBLevels5 int16u[3] + 21 WBType6 int16u + 22 WB_RGBLevels6 int16u[3] + 25 WBType7 int16u + 26 WB_RGBLevels7 int16u[3] + +=head3 PanasonicRaw DistortionInfo Tags + +Lens distortion correction information. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0002 DistortionParam02 int16s + 0x0004 DistortionParam04 int16s + 0x0005 DistortionScale int16s + 7.1 DistortionCorrection int16s & 0x0f + 0x0008 DistortionParam08 int16s + 0x0009 DistortionParam09 int16s + 0x000b DistortionParam11 int16s + 0x000c DistortionN? int16s + +=head3 PanasonicRaw CameraIFD Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x1001 MultishotOn no + 0x1100 FocusStepNear no + 0x1101 FocusStepCount no + 0x1102 FlashFired no + 0x1105 ZoomPosition no + 0x1200 LensAttached no + 0x1201 LensTypeMake no + 0x1202 LensTypeModel no + 0x1203 FocalLengthIn35mmFormat no + 0x1301 ApertureValue no + 0x1302 ShutterSpeedValue no + 0x1303 SensitivityValue no + 0x1305 HighISOMode no + 0x1412 FacesDetected no + 0x3200 WB_CFA0_LevelDaylight no + 0x3201 WB_CFA1_LevelDaylight no + 0x3202 WB_CFA2_LevelDaylight no + 0x3203 WB_CFA3_LevelDaylight no + 0x3300 WhiteBalanceSet no + 0x3420 WB_RedLevelAuto no + 0x3421 WB_BlueLevelAuto no + 0x3501 Orientation no + 0x3600 WhiteBalanceDetected no + +=head2 SigmaRaw Tags + +These tags are used in Sigma and Foveon RAW (.X3F) images. Metadata is also +extracted from the JpgFromRaw image if it exists (all models but the SD9 and +SD10). Currently, metadata may only be written to the embedded JpgFromRaw. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Header' Header SigmaRaw Header + 'Header4' Header4 SigmaRaw Header4 + 'HeaderExt' HeaderExt SigmaRaw HeaderExt + 'IMA2' PreviewImage no + JpgFromRaw no + 'IMAG' PreviewImage no + 'PROP' Properties SigmaRaw Properties + +=head3 SigmaRaw Header Tags + +Information extracted from the header of an X3F file. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 FileVersion no + 0x0002 ImageUniqueID no + 0x0006 MarkBits no + 0x0007 ImageWidth no + 0x0008 ImageHeight no + 0x0009 Rotation no + 0x000a WhiteBalance no + 0x0012 SceneCaptureType no + +=head3 SigmaRaw Header4 Tags + +Header information for version 4.0 or greater X3F. + + Index4 Tag Name Writable + ------ -------- -------- + 1 FileVersion no + 10 ImageWidth no + 11 ImageHeight no + 12 Rotation no + +=head3 SigmaRaw HeaderExt Tags + +Extended header data found in version 2.1 and 2.2 files + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 Unused no + 0x0001 ExposureAdjust no + 0x0002 Contrast no + 0x0003 Shadow no + 0x0004 Highlight no + 0x0005 Saturation no + 0x0006 Sharpness no + 0x0007 RedAdjust no + 0x0008 GreenAdjust no + 0x0009 BlueAdjust no + 0x000a X3FillLight no + +=head3 SigmaRaw Properties Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'AEMODE' MeteringMode no + 'AFAREA' AFArea no + 'AFINFOCUS' AFInFocus no + 'AFMODE' FocusMode no + 'APERTURE' FNumber no + 'AP_DESC' ApertureDisplayed no + 'BRACKET' BracketShot no + 'BURST' BurstShot no + 'CAMMANUF' Make no + 'CAMMODEL' Model no + 'CAMNAME' CameraName no + 'CAMSERIAL' SerialNumber no + 'CM_DESC' SceneCaptureType no + 'COLORSPACE' ColorSpace no + 'DRIVE' DriveMode no + 'EVAL_STATE' EvalState no + 'EXPCOMP' ExposureCompensation no + 'EXPNET' NetExposureCompensation no + 'EXPTIME' IntegrationTime no + 'FIRMVERS' FirmwareVersion no + 'FLASH' FlashMode no + 'FLASHEXPCOMP' FlashExpComp no + 'FLASHPOWER' FlashPower no + 'FLASHTTLMODE' FlashTTLMode no + 'FLASHTYPE' FlashType no + 'FLENGTH' FocalLength no + 'FLEQ35MM' FocalLengthIn35mmFormat no + 'FOCUS' Focus no + 'IMAGEBOARDID' ImageBoardID no + 'IMAGERBOARDID' ImagerBoardID no + 'IMAGERTEMP' SensorTemperature no + 'ISO' ISO no + 'LENSARANGE' LensApertureRange no + 'LENSFRANGE' LensFocalRange no + 'LENSMODEL' LensType no + 'PMODE' ExposureProgram no + 'RESOLUTION' Quality no + 'SENSORID' SensorID no + 'SHUTTER' ExposureTime no + 'SH_DESC' ShutterSpeedDisplayed no + 'TIME' DateTimeOriginal no + 'VERSION_BF' VersionBF no + 'WB_DESC' WhiteBalance no + +=head2 Lytro Tags + +Tag definitions for Lytro Light Field Picture (LFP) files. ExifTool +extracts the full JSON metadata blocks, as well as breaking them down into +individual tags. All available tags are extracted from the JSON metadata, +even if they don't appear in the table below. + + Tag Name Writable + -------- -------- + AccelerometerTime no + AccelerometerX no + AccelerometerY no + AccelerometerZ no + CameraType no + DateTimeOriginal no + EmbeddedImage no + ExposureTime no + FNumber no + FirmwareVersion no + FocalLength no + FocalPlaneXResolution no + FrameExposureTime no + ISO no + ImageLimitExposureBias no + ImageModulationExposureBias no + JSONMetadata no+ + LensTemperature no + Make no + Model no + Orientation no + SensorSerialNumber no + SerialNumber no + SocTemperature no + +=head2 JFIF Tags + +The following information is extracted from the JPEG JFIF header. See +L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JFIF 1.02 +specification. + + Index1 Tag Name Writable + ------ -------- -------- + 0 JFIFVersion no: + 2 ResolutionUnit int8u: + 3 XResolution int16u: + 5 YResolution int16u: + 7 ThumbnailWidth no + 8 ThumbnailHeight no + 9 ThumbnailTIFF no + +=head3 JFIF Extension Tags + +Thumbnail images extracted from the JFXX segment. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0010 ThumbnailImage no + 0x0011 ThumbnailTIFF no + 0x0013 ThumbnailTIFF no + +=head2 FlashPix Tags + +The FlashPix file format, introduced in 1996, was developed by Kodak, +Hewlett-Packard and Microsoft. Internally the FPX file structure mimics +that of an old DOS disk with fixed-sized "sectors" (usually 512 bytes) and a +"file allocation table" (FAT). No wonder this image format never became +popular. However, some of the structures used in FlashPix streams are part +of the EXIF specification, and are still being used in the APP2 FPXR segment +of JPEG images by some digital cameras from manufacturers such as FujiFilm, +Hewlett-Packard, Kodak and Sanyo. + +ExifTool extracts FlashPix information from both FPX images and the APP2 +FPXR segment of JPEG images. As well, FlashPix information is extracted +from DOC, PPT, XLS (Microsoft Word, PowerPoint and Excel) documents, VSD +(Microsoft Visio) drawings, and FLA (Macromedia/Adobe Flash project) files +since these are based on the same file format as FlashPix (the Windows +Compound Binary File format). Note that ExifTool identifies any +unrecognized Windows Compound Binary file as a FlashPix (FPX) file. See +L<http://graphcomp.com/info/specs/livepicture/fpx.pdf> for the FlashPix +specification. + + Tag ID Tag Name Writable + ------ -------- -------- + "\x01CompObj" CompObj FlashPix CompObj + "\x05Audio Info" AudioInfo FlashPix AudioInfo + "\x05Data Object" DataObject FlashPix DataObject + "\x05DocumentSummaryInformation" DocumentInfo FlashPix DocumentInfo + "\x05Extension List" Extensions FlashPix Extensions + "\x05Global Info" GlobalInfo FlashPix GlobalInfo + "\x05Image Contents" Image FlashPix Image + "\x05Image Info" ImageInfo FlashPix ImageInfo + "\x05Operation" Operation FlashPix Operation + "\x05Screen Nail" ScreenNail no + "\x05SummaryInformation" SummaryInfo FlashPix SummaryInfo + "\x05Transform" Transform FlashPix Transform + 'Audio Stream' AudioStream no + 'BasicFileInfo' BasicFileInfo no + 'Contents' Contents XMP + 'Current User' CurrentUser no + 'ICC Profile 0001' ICC_Profile ICC_Profile + 'IeImg' EmbeddedImage no + 'Preview' PreviewImage no + 'Property' PreviewInfo FlashPix PreviewInfo + 'Subimage 0000 Header' SubimageHdr FlashPix SubimageHdr + 'WordDocument' WordDocument FlashPix WordDocument + +=head3 FlashPix CompObj Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 CompObjUserTypeLen no + 1 CompObjUserType no + +=head3 FlashPix AudioInfo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 FlashPix DataObject Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x10000 DataObjectID no + 0x10002 LockedPropertyList no + 0x10003 DataObjectTitle no + 0x10004 LastModifier no + 0x10005 RevisionNumber no + 0x10006 DataCreateDate no + 0x10007 DataModifyDate no + 0x10008 CreatingApplication no + 0x10100 DataObjectStatus no + 0x10101 CreatingTransform no + 0x10102 UsingTransforms no + 0x10000000 CachedImageHeight no + 0x10000001 CachedImageWidth no + +=head3 FlashPix DocumentInfo Tags + +The DocumentSummaryInformation property set includes a UserDefined property +set for which only the Hyperlinks and HyperlinkBase tags are pre-defined. +However, ExifTool will also extract any other information found in the +UserDefined properties. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0002 Category no + 0x0003 PresentationTarget no + 0x0004 Bytes no + 0x0005 Lines no + 0x0006 Paragraphs no + 0x0007 Slides no + 0x0008 Notes no + 0x0009 HiddenSlides no + 0x000a MMClips no + 0x000b ScaleCrop no + 0x000c HeadingPairs no + 0x000d TitleOfParts no + 0x000e Manager no + 0x000f Company no + 0x0010 LinksUpToDate no + 0x0011 CharCountWithSpaces no + 0x0013 SharedDoc no + 0x0016 HyperlinksChanged no + 0x0017 AppVersion no + '_PID_HLINKS' Hyperlinks no + '_PID_LINKBASE' HyperlinkBase no + +=head3 FlashPix Extensions Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 ExtensionName no + 0x0002 ExtensionClassID no + 0x0003 ExtensionPersistence no + 0x0004 ExtensionCreateDate no + 0x0005 ExtensionModifyDate no + 0x0006 CreatingApplication no + 0x0007 ExtensionDescription no + 0x1000 Storage-StreamPathname no + 0x2000 FlashPixStreamPathname no + 0x2001 FlashPixStreamFieldOffset no + 0x3000 PropertySetPathname no + 0x3001 PropertySetIDCodes no + 0x3002 PropertyVectorElements no + 0x4000 SubimageResolutions no + 0x10000000 UsedExtensionNumbers no + +=head3 FlashPix GlobalInfo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x10002 LockedPropertyList no + 0x10003 TransformedImageTitle no + 0x10004 LastModifier no + 0x10100 VisibleOutputs no + 0x10101 MaximumImageIndex no + 0x10102 MaximumTransformIndex no + 0x10103 MaximumOperationIndex no + +=head3 FlashPix Image Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x1000000 NumberOfResolutions no + 0x1000002 ImageWidth no + 0x1000003 ImageHeight no + 0x1000004 DefaultDisplayHeight no + 0x1000005 DefaultDisplayWidth no + 0x1000006 DisplayUnits no + 0x2000000 SubimageWidth no + 0x2000001 SubimageHeight no + 0x2000002 SubimageColor no + 0x2000003 SubimageNumericalFormat no + 0x2000004 DecimationMethod no + 0x2000005 DecimationPrefilterWidth no + 0x2000007 SubimageICC_Profile no + 0x3000001 JPEGTables no + 0x3000002 MaxJPEGTableIndex no + +=head3 FlashPix ImageInfo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x21000000 FileSource no + 0x21000001 SceneType no + 0x21000002 CreationPathVector no + 0x21000003 SoftwareRelease no + 0x21000004 UserDefinedID no + 0x21000005 SharpnessApproximation no + 0x22000000 Copyright no + 0x22000001 OriginalImageBroker no + 0x22000002 DigitalImageBroker no + 0x22000003 Authorship no + 0x22000004 IntellectualPropertyNotes no + 0x23000000 TestTarget no + 0x23000002 GroupCaption no + 0x23000003 CaptionText no + 0x23000004 People no + 0x23000007 Things no + 0x2300000a DateTimeOriginal no + 0x2300000b Events no + 0x2300000c Places no + 0x2300000f ContentDescriptionNotes no + 0x24000000 Make no + 0x24000001 Model no + 0x24000002 SerialNumber no + 0x25000000 CreateDate no + 0x25000001 ExposureTime no + 0x25000002 FNumber no + 0x25000003 ExposureProgram no + 0x25000004 BrightnessValue no + 0x25000005 ExposureCompensation no + 0x25000006 SubjectDistance no + 0x25000007 MeteringMode no + 0x25000008 LightSource no + 0x25000009 FocalLength no + 0x2500000a MaxApertureValue no + 0x2500000b Flash no + 0x2500000c FlashEnergy no + 0x2500000d FlashReturn no + 0x2500000e BackLight no + 0x2500000f SubjectLocation no + 0x25000010 ExposureIndex no + 0x25000011 SpecialEffectsOpticalFilter no + 0x25000012 PerPictureNotes no + 0x26000000 SensingMethod no + 0x26000001 FocalPlaneXResolution no + 0x26000002 FocalPlaneYResolution no + 0x26000003 FocalPlaneResolutionUnit no + 0x26000004 SpatialFrequencyResponse no + 0x26000005 CFAPattern no + 0x26000007 ISO no + 0x26000008 Opto-ElectricConvFactor no + 0x27000000 FilmBrand no + 0x27000001 FilmCategory no + 0x27000002 FilmSize no + 0x27000003 FilmRollNumber no + 0x27000004 FilmFrameNumber no + 0x28000000 ScannerMake no + 0x28000001 ScannerModel no + 0x28000002 ScannerSerialNumber no + 0x28000003 ScanSoftware no + 0x28000004 ScanSoftwareRevisionDate no + 0x28000005 ServiceOrganizationName no + 0x28000006 ScanOperatorID no + 0x28000008 ScanDate no + 0x28000009 ModifyDate no + 0x2800000a ScannerPixelSize no + 0x29000000 OriginalScannedImageSize no + 0x29000001 OriginalDocumentSize no + 0x29000002 OriginalMedium no + 0x29000003 TypeOfOriginal no + +=head3 FlashPix Operation Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x10000 OperationID no + +=head3 FlashPix SummaryInfo Tags + +The Dictionary, CodePage and LocalIndicator tags are common to all FlashPix +property tables, even though they are only listed in the SummaryInfo table. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 Dictionary no + 0x0001 CodePage no + 0x0002 Title no + 0x0003 Subject no + 0x0004 Author no + 0x0005 Keywords no + 0x0006 Comments no + 0x0007 Template no + 0x0008 LastModifiedBy no + 0x0009 RevisionNumber no + 0x000a TotalEditTime no + 0x000b LastPrinted no + 0x000c CreateDate no + 0x000d ModifyDate no + 0x000e Pages no + 0x000f Words no + 0x0010 Characters no + 0x0011 ThumbnailClip no + 0x0012 Software no + 0x0013 Security no + 0x0022 CreatedBy no + 0x0023 DocumentID no + 0x80000000 LocaleIndicator no + +=head3 FlashPix Transform Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x10000 TransformNodeID no + 0x10001 OperationClassID no + 0x10002 LockedPropertyList no + 0x10003 TransformTitle no + 0x10004 LastModifier no + 0x10005 RevisionNumber no + 0x10006 TransformCreateDate no + 0x10007 TransformModifyDate no + 0x10008 CreatingApplication no + 0x10100 InputDataObjectList no + 0x10101 OutputDataObjectList no + 0x10102 OperationNumber no + 0x10000000 ResultAspectRatio no + 0x10000001 RectangleOfInterest no + 0x10000002 Filtering no + 0x10000003 SpatialOrientation no + 0x10000004 ColorTwistMatrix no + 0x10000005 ContrastAdjustment no + +=head3 FlashPix PreviewInfo Tags + +Preview information written by some FujiFilm models. + + Index1 Tag Name Writable + ------ -------- -------- + 13 PreviewImageWidth no + 23 PreviewImageHeight no + +=head3 FlashPix SubimageHdr Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 SubimageWidth no + 2 SubimageHeight no + 3 SubimageTileCount no + 4 SubimageTileWidth no + 5 SubimageTileHeight no + 6 NumChannels no + +=head3 FlashPix WordDocument Tags + +Tags extracted from the Microsoft Word document stream. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 Identification no + 0x0003 LanguageCode no + 0x0005 DocFlags no + 9.1 System no + 9.2 Word97 no + +=head3 FlashPix DocTable Tags + +Tags extracted from the Microsoft Word document table. + + Tag Name Writable + -------- -------- + CommentBy no + DOP FlashPix DOP + LastSavedBy no + ModifyDate no + +=head3 FlashPix DOP Tags + +Microsoft office document properties. + + Index1 Tag Name Writable + ------ -------- -------- + 20 CreateDate no + 24 ModifyDate no + 28 LastPrinted no + 32 RevisionNumber no + 34 TotalEditTime no + 38 Words no + 42 Characters no + 46 Pages no + 48 Paragraphs no + 56 Lines no + +=head2 MPF Tags + +These tags are part of the CIPA Multi-Picture Format specification, and are +found in the APP2 "MPF" segment of JPEG images. MPImage data referenced +from this segment is stored as a JPEG trailer. The MPF tags are not +writable, however the MPF segment may be deleted as a group (with "MPF:All") +but then the JPEG trailer should also be deleted (with "Trailer:All"). See +L<https://web.archive.org/web/20190713230858/http://www.cipa.jp/std/documents/e/DC-007_E.pdf> +for the official specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 0xb000 MPFVersion no + 0xb001 NumberOfImages no + 0xb002 MPImageList MPF MPImage + 0xb003 ImageUIDList no + 0xb004 TotalFrames no + 0xb101 MPIndividualNum no + 0xb201 PanOrientation no + 0xb202 PanOverlapH no + 0xb203 PanOverlapV no + 0xb204 BaseViewpointNum no + 0xb205 ConvergenceAngle no + 0xb206 BaselineLength no + 0xb207 VerticalDivergence no + 0xb208 AxisDistanceX no + 0xb209 AxisDistanceY no + 0xb20a AxisDistanceZ no + 0xb20b YawAngle no + 0xb20c PitchAngle no + 0xb20d RollAngle no + +=head3 MPF MPImage Tags + +The first MPF "Large Thumbnail" image is extracted as PreviewImage, and the +rest of the embedded MPF images are extracted as MPImage#. The +ExtractEmbedded (-ee) option may be used to extract information from these +embedded images. + + Index1 Tag Name Writable + ------ -------- -------- + 0.1 MPImageFlags no + 0.2 MPImageFormat no + 0.3 MPImageType no + 4 MPImageLength no + 8 MPImageStart no + 12 DependentImage1EntryNumber no + 14 DependentImage2EntryNumber no + +=head2 Stim Tags + +These tags are part of the CIPA Stereo Still Image specification, and are +found in the APP3 "Stim" segment of JPEG images. See +L<https://web.archive.org/web/20190718152459/http://www.cipa.jp/std/documents/e/DC-006_E.pdf> +for the official specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 StimVersion no + 0x0001 ApplicationData no + 0x0002 ImageArrangement no + 0x0003 ImageRotation no + 0x0004 ScalingFactor no + 0x0005 CropXSize no + 0x0006 CropYSize no + 0x0007 CropX Stim CropX + 0x0008 CropY Stim CropY + 0x0009 ViewType no + 0x000a RepresentativeImage no + 0x000b ConvergenceBaseImage no + 0x000c AssumedDisplaySize no + 0x000d AssumedDistanceView no + 0x000e RepresentativeDisparityNear no + 0x000f RepresentativeDisparityFar no + 0x0010 InitialDisplayEffect no + 0x0011 ConvergenceDistance no + 0x0012 CameraArrangementInterval no + 0x0013 ShootingCount no + +=head3 Stim CropX Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 CropXCommonOffset no + 2 CropXViewpointNumber no + 3 CropXOffset no + 7 CropXViewpointNumber2 no + 8 CropXOffset2 no + +=head3 Stim CropY Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 CropYCommonOffset no + 2 CropYViewpointNumber no + 3 CropYOffset no + 7 CropYViewpointNumber2 no + 8 CropYOffset2 no + +=head2 Scalado Tags + +Tags extracted from the JPEG APP4 "SCALADO" segment found in images from +HTC, LG and Samsung phones. (Presumably written by Scalado mobile software, +L<http://www.scalado.com/>.) + + Tag ID Tag Name Writable + ------ -------- -------- + 'HGHT' PreviewImageHeight no + 'QUAL' PreviewQuality no + 'SPMO' DataLength? no + 'WDTH' PreviewImageWidth no + +=head2 GoPro Tags + +=head3 GoPro GPMF Tags + +Tags extracted from the GPMF box of GoPro MP4 videos, the APP6 "GoPro" +segment of JPEG files, and from the "gpmd" timed metadata if the +ExtractEmbedded (-ee) option is enabled. Many more tags exist, but are +currently unknown and extracted only with the Unknown (-u) option. Please +let me know if you discover the meaning of any of these unknown tags. See +L<https://github.com/gopro/gpmf-parser> for details about this format. + + Tag ID Tag Name Writable + ------ -------- -------- + 'ACCL' Accelerometer no + 'ALLD' AutoLowLightDuration no + 'ATTD' Attitude no + 'ATTR' AttitudeTarget no + 'AUDO' AudioSetting no + 'BPOS' Controller? no + 'CASN' CameraSerialNumber no + 'CSEN' CoyoteSense no + 'CYTS' CoyoteStatus no + 'DEVC' DeviceContainer GoPro GPMF + 'DVID' DeviceID? no + 'DVNM' DeviceName no + 'DZOM' DigitalZoom no + 'EISA' ElectronicImageStabilization no + 'EMPT' Empty? no + 'ESCS' EscapeStatus? no + 'EXPT' MaximumShutterAngle no + 'FACE' FaceDetected no + 'FCNM' FaceNumbers no + 'FMWR' FirmwareVersion no + 'FWVS' OtherFirmware no + 'GLPI' GPSPos GoPro GLPI + 'GPRI' GPSRaw? GoPro GPRI + 'GPS5' GPSInfo GoPro GPS5 + 'GPSF' GPSMeasureMode no + 'GPSP' GPSHPositioningError no + 'GPSU' GPSDateTime no + 'GYRO' Gyroscope no + 'ISOE' ISOSpeeds no + 'ISOG' ImageSensorGain no + 'KBAT' BatteryStatus GoPro KBAT + 'LNED' LocalPositionNED no + 'MAGN' Magnetometer no + 'MINF' Model no + 'MTRX' AccelerometerMatrix no + 'MUID' MediaUniqueID no + 'OREN' AutoRotation no + 'ORIN' InputOrientation no + 'ORIO' OutputOrientation no + 'PHDR' HDRSetting no + 'PIMN' AutoISOMin no + 'PIMX' AutoISOMax no + 'PRES' PhotoResolution no + 'PRTN' ProTune no + 'PTCL' ColorMode no + 'PTEV' ExposureCompensation no + 'PTSH' Sharpness no + 'PTWB' WhiteBalance no + 'RATE' Rate no + 'RMRK' Comments no + 'SCAL' ScaleFactor? no + 'SCPR' ScaledPressure no + 'SHUT' ExposureTimes no + 'SIMU' ScaledIMU no + 'SIUN' SIUnits? no + 'SROT' SensorReadoutTime no + 'STMP' TimeStamp no + 'STNM' StreamName? no + 'STRM' NestedSignalStream GoPro GPMF + 'SYST' SystemTime no + 'TMPC' CameraTemperature no + 'TSMP' TotalSamples? no + 'TYPE' StructureType? no + 'UNIF' InputUniformity no + 'UNIT' Units? no + 'VERS' MetadataVersion no + 'VFOV' FieldOfView no + 'VFRH' VisualFlightRulesHUD no + 'WBAL' ColorTemperatures no + 'WRGB' WhiteBalanceRGB no + +=head3 GoPro GLPI Tags + + Index Tag Name Writable + ----- -------- -------- + 0 GPSDateTime no + 1 GPSLatitude no + 2 GPSLongitude no + 3 GPSAltitude no + 5 GPSSpeedX no + 6 GPSSpeedY no + 7 GPSSpeedZ no + 8 GPSTrack no + +=head3 GoPro GPRI Tags + + Index Tag Name Writable + ----- -------- -------- + 0 GPSDateTimeRaw no + 1 GPSLatitudeRaw no + 2 GPSLongitudeRaw no + 3 GPSAltitudeRaw no + 6 GPSSpeedRaw no + 7 GPSTrackRaw no + +=head3 GoPro GPS5 Tags + + Index Tag Name Writable + ----- -------- -------- + 0 GPSLatitude no + 1 GPSLongitude no + 2 GPSAltitude no + 3 GPSSpeed no + 4 GPSSpeed3D no + +=head3 GoPro KBAT Tags + +Battery status information found in GoPro Karma videos. + + Index Tag Name Writable + ----- -------- -------- + 0 BatteryCurrent no + 1 BatteryCapacity no + 3 BatteryTemperature no + 4 BatteryVoltage1 no + 5 BatteryVoltage2 no + 6 BatteryVoltage3 no + 7 BatteryVoltage4 no + 8 BatteryTime no + 14 BatteryLevel no + +=head3 GoPro fdsc Tags + +Tags extracted from the MP4 "fdsc" timed metadata when the ExtractEmbedded +(-ee) option is used. + + Index1 Tag Name Writable + ------ -------- -------- + 8 FirmwareVersion no + 23 SerialNumber no + 87 OtherSerialNumber no + 102 Model no + +=head2 Qualcomm Tags + +The tags below have been observed in the JPEG APP7 "Qualcomm Camera +Attributes" segment written by some cameras such as the HP iPAQ Voice +Messenger. ExifTool will extract any information found from this segment, +even if it is not listed in this table. + + Tag Name Writable + -------- -------- + AECAggressiveness no + AECCurrentExpIndex no + AECCurrentSensorLuma no + AECEnable no + AECExposureIndexAdjStep no + AECHighLumaRegionCount no + AECHighLumaRegionThreshold no + AECIndoorIdx no + AECLumaTarget no + AECLumaTolerance no + AECMode no + AECOdoorIdx no + AECOutdoorBrightDiscarded no + AECOutdoorBrightEnable no + AECOutdoorBrightReduction no + AECOutdoorBrightThresholdHI no + AECOutdoorBrightThresholdLO no + AECOutdoorGammaIndex no + AECSnapshotDigitalGain no + AECSnapshotExposureTimeMs no + AECSnapshotLineCount no + AECSnapshotSensorGain no + AECVfeLuma no + AFBoundary no + AFCollectEndStat no + AFEnable no + AFFarEnd no + AFFineSrchPoints no + AFFineStep no + AFFocusTime no + AFGrossStep no + AFMode no + AFNearEnd no + AFPosDefMacro no + AFPosDefNorm no + AFPosition no + AFProcess no + AFREnable no + AFRFaster0ExpMod no + AFRFaster0Trigger no + AFRFaster1ExpMod no + AFRFaster1Trigger no + AFRFaster2ExpMod no + AFRFaster2Trigger no + AFRFaster3ExpMod no + AFRFaster3Trigger no + AFRFaster4ExpMod no + AFRFaster4Trigger no + AFRPossibleFrameCnt no + AFRSlower0ExpMod no + AFRSlower0Trigger no + AFRSlower1ExpMod no + AFRSlower1Trigger no + AFRSlower2ExpMod no + AFRSlower2Trigger no + AFRSlower3ExpMod no + AFRSlower3Trigger no + AFRSlower4ExpMod no + AFRSlower4Trigger no + AFResetLensAfterSnap no + AFStepsNearFar no + AFStepsNearInfinity no + AFTestMode no + AFTracePositions00 no + AFTracePositions01 no + AFTracePositions02 no + AFTracePositions03 no + AFTracePositions04 no + AFTracePositions05 no + AFTracePositions06 no + AFTracePositions07 no + AFTracePositions08 no + AFTracePositions09 no + AFTracePositions10 no + AFTracePositions11 no + AFTracePositions12 no + AFTracePositions13 no + AFTracePositions14 no + AFTracePositions15 no + AFTracePositions16 no + AFTracePositions17 no + AFTracePositions18 no + AFTracePositions19 no + AFTracePositions20 no + AFTracePositions21 no + AFTracePositions22 no + AFTracePositions23 no + AFTracePositions24 no + AFTracePositions25 no + AFTracePositions26 no + AFTracePositions27 no + AFTracePositions28 no + AFTracePositions29 no + AFTracePositions30 no + AFTracePositions31 no + AFTracePositions32 no + AFTracePositions33 no + AFTracePositions34 no + AFTracePositions35 no + AFTracePositions36 no + AFTracePositions37 no + AFTracePositions38 no + AFTracePositions39 no + AFTracePositions40 no + AFTracePositions41 no + AFTracePositions42 no + AFTracePositions43 no + AFTracePositions44 no + AFTracePositions45 no + AFTracePositions46 no + AFTracePositions47 no + AFTracePositions48 no + AFTracePositions49 no + AFTraceStats00 no + AFTraceStats01 no + AFTraceStats02 no + AFTraceStats03 no + AFTraceStats04 no + AFTraceStats05 no + AFTraceStats06 no + AFTraceStats07 no + AFTraceStats08 no + AFTraceStats09 no + AFTraceStats10 no + AFTraceStats11 no + AFTraceStats12 no + AFTraceStats13 no + AFTraceStats14 no + AFTraceStats15 no + AFTraceStats16 no + AFTraceStats17 no + AFTraceStats18 no + AFTraceStats19 no + AFTraceStats20 no + AFTraceStats21 no + AFTraceStats22 no + AFTraceStats23 no + AFTraceStats24 no + AFTraceStats25 no + AFTraceStats26 no + AFTraceStats27 no + AFTraceStats28 no + AFTraceStats29 no + AFTraceStats30 no + AFTraceStats31 no + AFTraceStats32 no + AFTraceStats33 no + AFTraceStats34 no + AFTraceStats35 no + AFTraceStats36 no + AFTraceStats37 no + AFTraceStats38 no + AFTraceStats39 no + AFTraceStats40 no + AFTraceStats41 no + AFTraceStats42 no + AFTraceStats43 no + AFTraceStats44 no + AFTraceStats45 no + AFTraceStats46 no + AFTraceStats47 no + AFTraceStats48 no + AFTraceStats49 no + AFUndershootProtect no + AFVfeHorzOffset no + AFVfeHorzWidth no + AFVfeMetricMax no + AFVfeVertHeight no + AFVfeVertOffset no + ASF3EdgeDetect no + ASF3EdgeFilterA11 no + ASF3EdgeFilterA12 no + ASF3EdgeFilterA13 no + ASF3EdgeFilterA21 no + ASF3EdgeFilterA22 no + ASF3EdgeFilterA23 no + ASF3EdgeFilterA31 no + ASF3EdgeFilterA32 no + ASF3EdgeFilterA33 no + ASF3Enable no + ASF3LowerThreshold no + ASF3NoiseFilterA11 no + ASF3NoiseFilterA12 no + ASF3NoiseFilterA13 no + ASF3NoiseFilterA21 no + ASF3NoiseFilterA22 no + ASF3NoiseFilterA23 no + ASF3NoiseFilterA31 no + ASF3NoiseFilterA32 no + ASF3NoiseFilterA33 no + ASF3UpperThreshold no + ASF5BrtLoThres no + ASF5BrtShrpDegF1 no + ASF5BrtShrpDegF2 no + ASF5BrtSmthPercent no + ASF5BrtUpThres no + ASF5Enable no + ASF5ExposureIndex1 no + ASF5ExposureIndex2 no + ASF5Filter1A11 no + ASF5Filter1A12 no + ASF5Filter1A13 no + ASF5Filter1A14 no + ASF5Filter1A15 no + ASF5Filter1A21 no + ASF5Filter1A22 no + ASF5Filter1A23 no + ASF5Filter1A24 no + ASF5Filter1A25 no + ASF5Filter1A31 no + ASF5Filter1A32 no + ASF5Filter1A33 no + ASF5Filter1A34 no + ASF5Filter1A35 no + ASF5Filter1A41 no + ASF5Filter1A42 no + ASF5Filter1A43 no + ASF5Filter1A44 no + ASF5Filter1A45 no + ASF5Filter1A51 no + ASF5Filter1A52 no + ASF5Filter1A53 no + ASF5Filter1A54 no + ASF5Filter1A55 no + ASF5Filter2A11 no + ASF5Filter2A12 no + ASF5Filter2A13 no + ASF5Filter2A14 no + ASF5Filter2A15 no + ASF5Filter2A21 no + ASF5Filter2A22 no + ASF5Filter2A23 no + ASF5Filter2A24 no + ASF5Filter2A25 no + ASF5Filter2A31 no + ASF5Filter2A32 no + ASF5Filter2A33 no + ASF5Filter2A34 no + ASF5Filter2A35 no + ASF5Filter2A41 no + ASF5Filter2A42 no + ASF5Filter2A43 no + ASF5Filter2A44 no + ASF5Filter2A45 no + ASF5Filter2A51 no + ASF5Filter2A52 no + ASF5Filter2A53 no + ASF5Filter2A54 no + ASF5Filter2A55 no + ASF5FilterMode no + ASF5LowLoThres no + ASF5LowShrpDegF1 no + ASF5LowShrpDegF2 no + ASF5LowSmthPrcnt no + ASF5LowUpThres no + ASF5LumaFilter00 no + ASF5LumaFilter01 no + ASF5LumaFilter02 no + ASF5LumaFilter03 no + ASF5LumaFilter04 no + ASF5LumaFilter05 no + ASF5LumaFilter06 no + ASF5LumaFilter07 no + ASF5LumaFilter08 no + ASF5MaxExposureIndex no + ASF5NrmLoThres no + ASF5NrmShrpDegF1 no + ASF5NrmShrpDegF2 no + ASF5NrmSmthPrcnt no + ASF5NrmUpThres no + ASF5NrmizeFactor1 no + ASF5NrmizeFactor2 no + AWBAggressiveness no + AWBAgwGridDist2Thresh no + AWBAlgorithm no + AWBAveBgRatio no + AWBAveRgRatio no + AWBBlueGainAdjRef1 no + AWBBlueGainAdjRef2 no + AWBBlueGainAdjRef3 no + AWBBlueGainAdjRef4 no + AWBBlueGainAdjRef5 no + AWBBlueGainAdjRef6 no + AWBBlueGainAdjRef7 no + AWBBlueGainAdjRef8 no + AWBBlueGainRef1 no + AWBBlueGainRef2 no + AWBBlueGainRef3 no + AWBBlueGainRef4 no + AWBBlueGainRef5 no + AWBBlueGainRef6 no + AWBBlueGainRef7 no + AWBBlueGainRef8 no + AWBCcBias no + AWBCompactClusterR2 no + AWBEnable no + AWBGreenOffsetBg no + AWBGreenOffsetRg no + AWBIndoorSampleInfluence no + AWBLoVfeC1 no + AWBLoVfeC2 no + AWBLoVfeC3 no + AWBLoVfeC4 no + AWBLoVfeM1 no + AWBLoVfeM2 no + AWBLoVfeM3 no + AWBLoVfeM4 no + AWBLoVfeMaxY no + AWBLoVfeMinY no + AWBLowLigColCorEna no + AWBMaxBGain no + AWBMaxGGain no + AWBMaxRGain no + AWBMinBGain no + AWBMinGGain no + AWBMinRGain no + AWBNormVfeC1 no + AWBNormVfeC2 no + AWBNormVfeC3 no + AWBNormVfeC4 no + AWBNormVfeM1 no + AWBNormVfeM2 no + AWBNormVfeM3 no + AWBNormVfeM4 no + AWBNormVfeMaxY no + AWBNormVfeMinY no + AWBOudorVfeC1 no + AWBOudorVfeC2 no + AWBOudorVfeC3 no + AWBOudorVfeC4 no + AWBOudorVfeM1 no + AWBOudorVfeM2 no + AWBOudorVfeM3 no + AWBOudorVfeM4 no + AWBOudorVfeMaxY no + AWBOudorVfeMinY no + AWBOutdoorSampleInfluence no + AWBPrevWbBgain no + AWBPrevWbGgain no + AWBPrevWbRgain no + AWBRedGainAdjRef1 no + AWBRedGainAdjRef2 no + AWBRedGainAdjRef3 no + AWBRedGainAdjRef4 no + AWBRedGainAdjRef5 no + AWBRedGainAdjRef6 no + AWBRedGainAdjRef7 no + AWBRedGainAdjRef8 no + AWBRedGainRef1 no + AWBRedGainRef2 no + AWBRedGainRef3 no + AWBRedGainRef4 no + AWBRedGainRef5 no + AWBRedGainRef6 no + AWBRedGainRef7 no + AWBRedGainRef8 no + AWBSampleDecision no + AWBSnapshotBGain no + AWBSnapshotRGain no + AntiBadingPixelClk no + AntiBadingPixelClkPerLine no + AntibandingEnable no + BlckLvlEvenCols no + BlckLvlOddCols no + CamMclkHz no + ChroSupChroThres1 no + ChroSupChroThres2 no + ChroSupLumaThres1 no + ChroSupLumaThres2 no + ChroSupLumaThres3 no + ChroSupLumaThres4 no + ChromSupress no + ClipToAfRato no + CurrResol no + DayltConvChrmA_M no + DayltConvChrmA_P no + DayltConvChrmB_M no + DayltConvChrmB_P no + DayltConvChrmC_M no + DayltConvChrmC_P no + DayltConvChrmD_M no + DayltConvChrmD_P no + DayltConvChrmKCb no + DayltConvChrmKCr no + DayltConvLumaK no + DayltConvLumaV0 no + DayltConvLumaV1 no + DayltConvLumaV2 no + DefConvChrmA_M no + DefConvChrmA_P no + DefConvChrmB_M no + DefConvChrmB_P no + DefConvChrmC_M no + DefConvChrmC_P no + DefConvChrmD_M no + DefConvChrmD_P no + DefConvChrmKCb no + DefConvChrmKCr no + DefConvLumaK no + DefConvLumaV0 no + DefConvLumaV1 no + DefConvLumaV2 no + DefCorC0 no + DefCorC1 no + DefCorC2 no + DefCorC3 no + DefCorC4 no + DefCorC5 no + DefCorC6 no + DefCorC7 no + DefCorC8 no + DefCorK0 no + DefCorK1 no + DefCorK2 no + DefLumaGammaMode no + DefRgbGammaMode no + DefectPixCorEnable no + DefectPixMaxThresh no + DefectPixMinThresh no + DiscardFrstFrm no + FrmSkipPttrn no + GammaEnable no + HJREnable no + HJRMaxNumFrames no + HJROneToTwoOffset no + HJRTextureThreshold no + HJR_NReductionFlat no + HJR_NReductionTexture no + IncandConvChrmA_M no + IncandConvChrmA_P no + IncandConvChrmB_M no + IncandConvChrmB_P no + IncandConvChrmC_M no + IncandConvChrmC_P no + IncandConvChrmD_M no + IncandConvChrmD_P no + IncandConvChrmKCb no + IncandConvChrmKCr no + IncandConvLumaK no + IncandConvLumaV0 no + IncandConvLumaV1 no + IncandConvLumaV2 no + LADetect no + LAEnable no + MaxPrviewFps no + MaxVideoFps no + NghtshtFps no + NightshotMode no + OutlierDistance no + PclkInvert no + PrviewFps no + PrviewResol no + R2ABlueCtbl00 no + R2ABlueCtbl01 no + R2ABlueCtbl02 no + R2ABlueCtbl03 no + R2ABlueCtbl04 no + R2ABlueCtbl05 no + R2ABlueCtbl06 no + R2ABlueCtbl07 no + R2ABlueCtbl08 no + R2ABlueCtbl09 no + R2ABlueCtbl10 no + R2ABlueCtbl11 no + R2ABlueCtbl12 no + R2ABlueCtbl13 no + R2ABlueCtbl14 no + R2ABlueCtbl15 no + R2ABlueCtbl16 no + R2ABlueCtbl17 no + R2ABlueCtbl18 no + R2ABlueCtbl19 no + R2ABlueCtbl20 no + R2ABlueCtbl21 no + R2ABlueCtbl22 no + R2ABlueCtbl23 no + R2ABlueCtbl24 no + R2ABlueCtbl25 no + R2ABlueCtbl26 no + R2ABlueCtbl27 no + R2ABlueCtbl28 no + R2ABlueCtbl29 no + R2ABlueCtbl30 no + R2ABlueCtbl31 no + R2ABlueStbl00 no + R2ABlueStbl01 no + R2ABlueStbl02 no + R2ABlueStbl03 no + R2ABlueStbl04 no + R2ABlueStbl05 no + R2ABlueStbl06 no + R2ABlueStbl07 no + R2ABlueStbl08 no + R2ABlueStbl09 no + R2ABlueStbl10 no + R2ABlueStbl11 no + R2ABlueStbl12 no + R2ABlueStbl13 no + R2ABlueStbl14 no + R2ABlueStbl15 no + R2ABlueStbl16 no + R2ABlueStbl17 no + R2ABlueStbl18 no + R2ABlueStbl19 no + R2ABlueStbl20 no + R2ABlueStbl21 no + R2ABlueStbl22 no + R2ABlueStbl23 no + R2ABlueStbl24 no + R2ABlueStbl25 no + R2ABlueStbl26 no + R2ABlueStbl27 no + R2ABlueStbl28 no + R2ABlueStbl29 no + R2ABlueStbl30 no + R2ABlueStbl31 no + R2ACx no + R2ACy no + R2AGreenCtbl00 no + R2AGreenCtbl01 no + R2AGreenCtbl02 no + R2AGreenCtbl03 no + R2AGreenCtbl04 no + R2AGreenCtbl05 no + R2AGreenCtbl06 no + R2AGreenCtbl07 no + R2AGreenCtbl08 no + R2AGreenCtbl09 no + R2AGreenCtbl10 no + R2AGreenCtbl11 no + R2AGreenCtbl12 no + R2AGreenCtbl13 no + R2AGreenCtbl14 no + R2AGreenCtbl15 no + R2AGreenCtbl16 no + R2AGreenCtbl17 no + R2AGreenCtbl18 no + R2AGreenCtbl19 no + R2AGreenCtbl20 no + R2AGreenCtbl21 no + R2AGreenCtbl22 no + R2AGreenCtbl23 no + R2AGreenCtbl24 no + R2AGreenCtbl25 no + R2AGreenCtbl26 no + R2AGreenCtbl27 no + R2AGreenCtbl28 no + R2AGreenCtbl29 no + R2AGreenCtbl30 no + R2AGreenCtbl31 no + R2AGreenStbl00 no + R2AGreenStbl01 no + R2AGreenStbl02 no + R2AGreenStbl03 no + R2AGreenStbl04 no + R2AGreenStbl05 no + R2AGreenStbl06 no + R2AGreenStbl07 no + R2AGreenStbl08 no + R2AGreenStbl09 no + R2AGreenStbl10 no + R2AGreenStbl11 no + R2AGreenStbl12 no + R2AGreenStbl13 no + R2AGreenStbl14 no + R2AGreenStbl15 no + R2AGreenStbl16 no + R2AGreenStbl17 no + R2AGreenStbl18 no + R2AGreenStbl19 no + R2AGreenStbl20 no + R2AGreenStbl21 no + R2AGreenStbl22 no + R2AGreenStbl23 no + R2AGreenStbl24 no + R2AGreenStbl25 no + R2AGreenStbl26 no + R2AGreenStbl27 no + R2AGreenStbl28 no + R2AGreenStbl29 no + R2AGreenStbl30 no + R2AGreenStbl31 no + R2AHeight no + R2AIntervals no + R2ARedCtbl00 no + R2ARedCtbl01 no + R2ARedCtbl02 no + R2ARedCtbl03 no + R2ARedCtbl04 no + R2ARedCtbl05 no + R2ARedCtbl06 no + R2ARedCtbl07 no + R2ARedCtbl08 no + R2ARedCtbl09 no + R2ARedCtbl10 no + R2ARedCtbl11 no + R2ARedCtbl12 no + R2ARedCtbl13 no + R2ARedCtbl14 no + R2ARedCtbl15 no + R2ARedCtbl16 no + R2ARedCtbl17 no + R2ARedCtbl18 no + R2ARedCtbl19 no + R2ARedCtbl20 no + R2ARedCtbl21 no + R2ARedCtbl22 no + R2ARedCtbl23 no + R2ARedCtbl24 no + R2ARedCtbl25 no + R2ARedCtbl26 no + R2ARedCtbl27 no + R2ARedCtbl28 no + R2ARedCtbl29 no + R2ARedCtbl30 no + R2ARedCtbl31 no + R2ARedStbl00 no + R2ARedStbl01 no + R2ARedStbl02 no + R2ARedStbl03 no + R2ARedStbl04 no + R2ARedStbl05 no + R2ARedStbl06 no + R2ARedStbl07 no + R2ARedStbl08 no + R2ARedStbl09 no + R2ARedStbl10 no + R2ARedStbl11 no + R2ARedStbl12 no + R2ARedStbl13 no + R2ARedStbl14 no + R2ARedStbl15 no + R2ARedStbl16 no + R2ARedStbl17 no + R2ARedStbl18 no + R2ARedStbl19 no + R2ARedStbl20 no + R2ARedStbl21 no + R2ARedStbl22 no + R2ARedStbl23 no + R2ARedStbl24 no + R2ARedStbl25 no + R2ARedStbl26 no + R2ARedStbl27 no + R2ARedStbl28 no + R2ARedStbl29 no + R2ARedStbl30 no + R2ARedStbl31 no + R2ATbl00 no + R2ATbl01 no + R2ATbl02 no + R2ATbl03 no + R2ATbl04 no + R2ATbl05 no + R2ATbl06 no + R2ATbl07 no + R2ATbl08 no + R2ATbl09 no + R2ATbl10 no + R2ATbl11 no + R2ATbl12 no + R2ATbl13 no + R2ATbl14 no + R2ATbl15 no + R2ATbl16 no + R2ATbl17 no + R2ATbl18 no + R2ATbl19 no + R2ATbl20 no + R2ATbl21 no + R2ATbl22 no + R2ATbl23 no + R2ATbl24 no + R2ATbl25 no + R2ATbl26 no + R2ATbl27 no + R2ATbl28 no + R2ATbl29 no + R2ATbl30 no + R2ATbl31 no + R2AWidth no + R2D65BlueCtbl00 no + R2D65BlueCtbl01 no + R2D65BlueCtbl02 no + R2D65BlueCtbl03 no + R2D65BlueCtbl04 no + R2D65BlueCtbl05 no + R2D65BlueCtbl06 no + R2D65BlueCtbl07 no + R2D65BlueCtbl08 no + R2D65BlueCtbl09 no + R2D65BlueCtbl10 no + R2D65BlueCtbl11 no + R2D65BlueCtbl12 no + R2D65BlueCtbl13 no + R2D65BlueCtbl14 no + R2D65BlueCtbl15 no + R2D65BlueCtbl16 no + R2D65BlueCtbl17 no + R2D65BlueCtbl18 no + R2D65BlueCtbl19 no + R2D65BlueCtbl20 no + R2D65BlueCtbl21 no + R2D65BlueCtbl22 no + R2D65BlueCtbl23 no + R2D65BlueCtbl24 no + R2D65BlueCtbl25 no + R2D65BlueCtbl26 no + R2D65BlueCtbl27 no + R2D65BlueCtbl28 no + R2D65BlueCtbl29 no + R2D65BlueCtbl30 no + R2D65BlueCtbl31 no + R2D65BlueStbl00 no + R2D65BlueStbl01 no + R2D65BlueStbl02 no + R2D65BlueStbl03 no + R2D65BlueStbl04 no + R2D65BlueStbl05 no + R2D65BlueStbl06 no + R2D65BlueStbl07 no + R2D65BlueStbl08 no + R2D65BlueStbl09 no + R2D65BlueStbl10 no + R2D65BlueStbl11 no + R2D65BlueStbl12 no + R2D65BlueStbl13 no + R2D65BlueStbl14 no + R2D65BlueStbl15 no + R2D65BlueStbl16 no + R2D65BlueStbl17 no + R2D65BlueStbl18 no + R2D65BlueStbl19 no + R2D65BlueStbl20 no + R2D65BlueStbl21 no + R2D65BlueStbl22 no + R2D65BlueStbl23 no + R2D65BlueStbl24 no + R2D65BlueStbl25 no + R2D65BlueStbl26 no + R2D65BlueStbl27 no + R2D65BlueStbl28 no + R2D65BlueStbl29 no + R2D65BlueStbl30 no + R2D65BlueStbl31 no + R2D65Cx no + R2D65Cy no + R2D65GreenCtbl00 no + R2D65GreenCtbl01 no + R2D65GreenCtbl02 no + R2D65GreenCtbl03 no + R2D65GreenCtbl04 no + R2D65GreenCtbl05 no + R2D65GreenCtbl06 no + R2D65GreenCtbl07 no + R2D65GreenCtbl08 no + R2D65GreenCtbl09 no + R2D65GreenCtbl10 no + R2D65GreenCtbl11 no + R2D65GreenCtbl12 no + R2D65GreenCtbl13 no + R2D65GreenCtbl14 no + R2D65GreenCtbl15 no + R2D65GreenCtbl16 no + R2D65GreenCtbl17 no + R2D65GreenCtbl18 no + R2D65GreenCtbl19 no + R2D65GreenCtbl20 no + R2D65GreenCtbl21 no + R2D65GreenCtbl22 no + R2D65GreenCtbl23 no + R2D65GreenCtbl24 no + R2D65GreenCtbl25 no + R2D65GreenCtbl26 no + R2D65GreenCtbl27 no + R2D65GreenCtbl28 no + R2D65GreenCtbl29 no + R2D65GreenCtbl30 no + R2D65GreenCtbl31 no + R2D65GreenStbl00 no + R2D65GreenStbl01 no + R2D65GreenStbl02 no + R2D65GreenStbl03 no + R2D65GreenStbl04 no + R2D65GreenStbl05 no + R2D65GreenStbl06 no + R2D65GreenStbl07 no + R2D65GreenStbl08 no + R2D65GreenStbl09 no + R2D65GreenStbl10 no + R2D65GreenStbl11 no + R2D65GreenStbl12 no + R2D65GreenStbl13 no + R2D65GreenStbl14 no + R2D65GreenStbl15 no + R2D65GreenStbl16 no + R2D65GreenStbl17 no + R2D65GreenStbl18 no + R2D65GreenStbl19 no + R2D65GreenStbl20 no + R2D65GreenStbl21 no + R2D65GreenStbl22 no + R2D65GreenStbl23 no + R2D65GreenStbl24 no + R2D65GreenStbl25 no + R2D65GreenStbl26 no + R2D65GreenStbl27 no + R2D65GreenStbl28 no + R2D65GreenStbl29 no + R2D65GreenStbl30 no + R2D65GreenStbl31 no + R2D65Height no + R2D65Intervals no + R2D65RedCtbl00 no + R2D65RedCtbl01 no + R2D65RedCtbl02 no + R2D65RedCtbl03 no + R2D65RedCtbl04 no + R2D65RedCtbl05 no + R2D65RedCtbl06 no + R2D65RedCtbl07 no + R2D65RedCtbl08 no + R2D65RedCtbl09 no + R2D65RedCtbl10 no + R2D65RedCtbl11 no + R2D65RedCtbl12 no + R2D65RedCtbl13 no + R2D65RedCtbl14 no + R2D65RedCtbl15 no + R2D65RedCtbl16 no + R2D65RedCtbl17 no + R2D65RedCtbl18 no + R2D65RedCtbl19 no + R2D65RedCtbl20 no + R2D65RedCtbl21 no + R2D65RedCtbl22 no + R2D65RedCtbl23 no + R2D65RedCtbl24 no + R2D65RedCtbl25 no + R2D65RedCtbl26 no + R2D65RedCtbl27 no + R2D65RedCtbl28 no + R2D65RedCtbl29 no + R2D65RedCtbl30 no + R2D65RedCtbl31 no + R2D65RedStbl00 no + R2D65RedStbl01 no + R2D65RedStbl02 no + R2D65RedStbl03 no + R2D65RedStbl04 no + R2D65RedStbl05 no + R2D65RedStbl06 no + R2D65RedStbl07 no + R2D65RedStbl08 no + R2D65RedStbl09 no + R2D65RedStbl10 no + R2D65RedStbl11 no + R2D65RedStbl12 no + R2D65RedStbl13 no + R2D65RedStbl14 no + R2D65RedStbl15 no + R2D65RedStbl16 no + R2D65RedStbl17 no + R2D65RedStbl18 no + R2D65RedStbl19 no + R2D65RedStbl20 no + R2D65RedStbl21 no + R2D65RedStbl22 no + R2D65RedStbl23 no + R2D65RedStbl24 no + R2D65RedStbl25 no + R2D65RedStbl26 no + R2D65RedStbl27 no + R2D65RedStbl28 no + R2D65RedStbl29 no + R2D65RedStbl30 no + R2D65RedStbl31 no + R2D65Tbl00 no + R2D65Tbl01 no + R2D65Tbl02 no + R2D65Tbl03 no + R2D65Tbl04 no + R2D65Tbl05 no + R2D65Tbl06 no + R2D65Tbl07 no + R2D65Tbl08 no + R2D65Tbl09 no + R2D65Tbl10 no + R2D65Tbl11 no + R2D65Tbl12 no + R2D65Tbl13 no + R2D65Tbl14 no + R2D65Tbl15 no + R2D65Tbl16 no + R2D65Tbl17 no + R2D65Tbl18 no + R2D65Tbl19 no + R2D65Tbl20 no + R2D65Tbl21 no + R2D65Tbl22 no + R2D65Tbl23 no + R2D65Tbl24 no + R2D65Tbl25 no + R2D65Tbl26 no + R2D65Tbl27 no + R2D65Tbl28 no + R2D65Tbl29 no + R2D65Tbl30 no + R2D65Tbl31 no + R2D65Width no + R2TL84BlueCtbl00 no + R2TL84BlueCtbl01 no + R2TL84BlueCtbl02 no + R2TL84BlueCtbl03 no + R2TL84BlueCtbl04 no + R2TL84BlueCtbl05 no + R2TL84BlueCtbl06 no + R2TL84BlueCtbl07 no + R2TL84BlueCtbl08 no + R2TL84BlueCtbl09 no + R2TL84BlueCtbl10 no + R2TL84BlueCtbl11 no + R2TL84BlueCtbl12 no + R2TL84BlueCtbl13 no + R2TL84BlueCtbl14 no + R2TL84BlueCtbl15 no + R2TL84BlueCtbl16 no + R2TL84BlueCtbl17 no + R2TL84BlueCtbl18 no + R2TL84BlueCtbl19 no + R2TL84BlueCtbl20 no + R2TL84BlueCtbl21 no + R2TL84BlueCtbl22 no + R2TL84BlueCtbl23 no + R2TL84BlueCtbl24 no + R2TL84BlueCtbl25 no + R2TL84BlueCtbl26 no + R2TL84BlueCtbl27 no + R2TL84BlueCtbl28 no + R2TL84BlueCtbl29 no + R2TL84BlueCtbl30 no + R2TL84BlueCtbl31 no + R2TL84BlueStbl00 no + R2TL84BlueStbl01 no + R2TL84BlueStbl02 no + R2TL84BlueStbl03 no + R2TL84BlueStbl04 no + R2TL84BlueStbl05 no + R2TL84BlueStbl06 no + R2TL84BlueStbl07 no + R2TL84BlueStbl08 no + R2TL84BlueStbl09 no + R2TL84BlueStbl10 no + R2TL84BlueStbl11 no + R2TL84BlueStbl12 no + R2TL84BlueStbl13 no + R2TL84BlueStbl14 no + R2TL84BlueStbl15 no + R2TL84BlueStbl16 no + R2TL84BlueStbl17 no + R2TL84BlueStbl18 no + R2TL84BlueStbl19 no + R2TL84BlueStbl20 no + R2TL84BlueStbl21 no + R2TL84BlueStbl22 no + R2TL84BlueStbl23 no + R2TL84BlueStbl24 no + R2TL84BlueStbl25 no + R2TL84BlueStbl26 no + R2TL84BlueStbl27 no + R2TL84BlueStbl28 no + R2TL84BlueStbl29 no + R2TL84BlueStbl30 no + R2TL84BlueStbl31 no + R2TL84Cx no + R2TL84Cy no + R2TL84GreenCtbl00 no + R2TL84GreenCtbl01 no + R2TL84GreenCtbl02 no + R2TL84GreenCtbl03 no + R2TL84GreenCtbl04 no + R2TL84GreenCtbl05 no + R2TL84GreenCtbl06 no + R2TL84GreenCtbl07 no + R2TL84GreenCtbl08 no + R2TL84GreenCtbl09 no + R2TL84GreenCtbl10 no + R2TL84GreenCtbl11 no + R2TL84GreenCtbl12 no + R2TL84GreenCtbl13 no + R2TL84GreenCtbl14 no + R2TL84GreenCtbl15 no + R2TL84GreenCtbl16 no + R2TL84GreenCtbl17 no + R2TL84GreenCtbl18 no + R2TL84GreenCtbl19 no + R2TL84GreenCtbl20 no + R2TL84GreenCtbl21 no + R2TL84GreenCtbl22 no + R2TL84GreenCtbl23 no + R2TL84GreenCtbl24 no + R2TL84GreenCtbl25 no + R2TL84GreenCtbl26 no + R2TL84GreenCtbl27 no + R2TL84GreenCtbl28 no + R2TL84GreenCtbl29 no + R2TL84GreenCtbl30 no + R2TL84GreenCtbl31 no + R2TL84GreenStbl00 no + R2TL84GreenStbl01 no + R2TL84GreenStbl02 no + R2TL84GreenStbl03 no + R2TL84GreenStbl04 no + R2TL84GreenStbl05 no + R2TL84GreenStbl06 no + R2TL84GreenStbl07 no + R2TL84GreenStbl08 no + R2TL84GreenStbl09 no + R2TL84GreenStbl10 no + R2TL84GreenStbl11 no + R2TL84GreenStbl12 no + R2TL84GreenStbl13 no + R2TL84GreenStbl14 no + R2TL84GreenStbl15 no + R2TL84GreenStbl16 no + R2TL84GreenStbl17 no + R2TL84GreenStbl18 no + R2TL84GreenStbl19 no + R2TL84GreenStbl20 no + R2TL84GreenStbl21 no + R2TL84GreenStbl22 no + R2TL84GreenStbl23 no + R2TL84GreenStbl24 no + R2TL84GreenStbl25 no + R2TL84GreenStbl26 no + R2TL84GreenStbl27 no + R2TL84GreenStbl28 no + R2TL84GreenStbl29 no + R2TL84GreenStbl30 no + R2TL84GreenStbl31 no + R2TL84Height no + R2TL84Intervals no + R2TL84RedCtbl00 no + R2TL84RedCtbl01 no + R2TL84RedCtbl02 no + R2TL84RedCtbl03 no + R2TL84RedCtbl04 no + R2TL84RedCtbl05 no + R2TL84RedCtbl06 no + R2TL84RedCtbl07 no + R2TL84RedCtbl08 no + R2TL84RedCtbl09 no + R2TL84RedCtbl10 no + R2TL84RedCtbl11 no + R2TL84RedCtbl12 no + R2TL84RedCtbl13 no + R2TL84RedCtbl14 no + R2TL84RedCtbl15 no + R2TL84RedCtbl16 no + R2TL84RedCtbl17 no + R2TL84RedCtbl18 no + R2TL84RedCtbl19 no + R2TL84RedCtbl20 no + R2TL84RedCtbl21 no + R2TL84RedCtbl22 no + R2TL84RedCtbl23 no + R2TL84RedCtbl24 no + R2TL84RedCtbl25 no + R2TL84RedCtbl26 no + R2TL84RedCtbl27 no + R2TL84RedCtbl28 no + R2TL84RedCtbl29 no + R2TL84RedCtbl30 no + R2TL84RedCtbl31 no + R2TL84RedStbl00 no + R2TL84RedStbl01 no + R2TL84RedStbl02 no + R2TL84RedStbl03 no + R2TL84RedStbl04 no + R2TL84RedStbl05 no + R2TL84RedStbl06 no + R2TL84RedStbl07 no + R2TL84RedStbl08 no + R2TL84RedStbl09 no + R2TL84RedStbl10 no + R2TL84RedStbl11 no + R2TL84RedStbl12 no + R2TL84RedStbl13 no + R2TL84RedStbl14 no + R2TL84RedStbl15 no + R2TL84RedStbl16 no + R2TL84RedStbl17 no + R2TL84RedStbl18 no + R2TL84RedStbl19 no + R2TL84RedStbl20 no + R2TL84RedStbl21 no + R2TL84RedStbl22 no + R2TL84RedStbl23 no + R2TL84RedStbl24 no + R2TL84RedStbl25 no + R2TL84RedStbl26 no + R2TL84RedStbl27 no + R2TL84RedStbl28 no + R2TL84RedStbl29 no + R2TL84RedStbl30 no + R2TL84RedStbl31 no + R2TL84Tbl00 no + R2TL84Tbl01 no + R2TL84Tbl02 no + R2TL84Tbl03 no + R2TL84Tbl04 no + R2TL84Tbl05 no + R2TL84Tbl06 no + R2TL84Tbl07 no + R2TL84Tbl08 no + R2TL84Tbl09 no + R2TL84Tbl10 no + R2TL84Tbl11 no + R2TL84Tbl12 no + R2TL84Tbl13 no + R2TL84Tbl14 no + R2TL84Tbl15 no + R2TL84Tbl16 no + R2TL84Tbl17 no + R2TL84Tbl18 no + R2TL84Tbl19 no + R2TL84Tbl20 no + R2TL84Tbl21 no + R2TL84Tbl22 no + R2TL84Tbl23 no + R2TL84Tbl24 no + R2TL84Tbl25 no + R2TL84Tbl26 no + R2TL84Tbl27 no + R2TL84Tbl28 no + R2TL84Tbl29 no + R2TL84Tbl30 no + R2TL84Tbl31 no + R2TL84Width no + RolloffEnable no + SensorFmt no + SensorType no + SensrFulHght no + SensrFulWdth no + SensrQtrHght no + SensrQtrWdth no + SnapshotResol no + TL84ConvChrmA_M no + TL84ConvChrmA_P no + TL84ConvChrmB_M no + TL84ConvChrmB_P no + TL84ConvChrmC_M no + TL84ConvChrmC_P no + TL84ConvChrmD_M no + TL84ConvChrmD_P no + TL84ConvChrmKCb no + TL84ConvChrmKCr no + TL84ConvLumaK no + TL84ConvLumaV0 no + TL84ConvLumaV1 no + TL84ConvLumaV2 no + VideoFps no + YhiYloConvChrmA_M no + YhiYloConvChrmA_P no + YhiYloConvChrmB_M no + YhiYloConvChrmB_P no + YhiYloConvChrmC_M no + YhiYloConvChrmC_P no + YhiYloConvChrmD_M no + YhiYloConvChrmD_P no + YhiYloConvChrmKCb no + YhiYloConvChrmKCr no + YhiYloConvLumaK no + YhiYloConvLumaV0 no + YhiYloConvLumaV1 no + YhiYloConvLumaV2 no + YhiYloCorC0 no + YhiYloCorC1 no + YhiYloCorC2 no + YhiYloCorC3 no + YhiYloCorC4 no + YhiYloCorC5 no + YhiYloCorC6 no + YhiYloCorC7 no + YhiYloCorC8 no + YhiYloCorK0 no + YhiYloCorK1 no + YhiYloCorK2 no + +=head2 Jpeg2000 Tags + +The tags below are found in JPEG 2000 images and the JUMBF metadata in JPEG +images, but not all of these are extracted. Note that ExifTool currently +writes only EXIF, IPTC and XMP tags in Jpeg2000 images. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Exif' EXIF EXIF + 'asoc' Association Jpeg2000 + 'bfdb' BinaryDataType no + 'bfil' BinaryFilter no + 'bidb' BinaryData no + 'bpcc' BitsPerComponent no + 'cbor' CBORData CBOR + 'cdef' ComponentDefinition no + 'cgrp' ColorGroup no + 'chck' DigitalSignature no + 'cmap' ComponentMapping no + 'colr' ColorSpecification Jpeg2000 ColorSpec + 'comp' Composition no + 'copt' CompositionOptions no + 'cref' Cross-Reference no + 'creg' CodestreamRegistration no + 'drep' DesiredReproductions no + 'dtbl' DataReference no + 'flst' FragmentList no + 'free' Free no + 'ftbl' FragmentTable no + 'ftyp' FileType Jpeg2000 FileType + 'gtso' GraphicsTechnologyStandardOutput no + 'ihdr' ImageHeader Jpeg2000 ImageHeader + 'inst' InstructionSet no + 'jP ' JP2Signature no + 'jp2c' ContiguousCodestream no + PreviewImage no + 'jp2h' JP2Header Jpeg2000 + 'jp2i' IntellectualProperty XMP + 'jpch' CodestreamHeader Jpeg2000 + 'jplh' CompositingLayerHeader Jpeg2000 + 'json' JSONData JSON + 'jumb' JUMBFBox Jpeg2000 + 'jumd' JUMBFDescr Jpeg2000 JUMD + 'jxlc' JXLCodestream no + 'lbl ' Label no + 'mdat' MediaData no + 'mp7b' MPEG7Binary no + 'nlst' NumberList no + 'opct' Opacity no + 'pclr' Palette no + 'prfl' Profile no + 'res ' Resolution Jpeg2000 + 'resc' CaptureResolution Jpeg2000 CaptureResolution + 'resd' DisplayResolution Jpeg2000 DisplayResolution + 'roid' ROIDescription no + 'rreq' ReaderRequirements no + 'uinf' UUIDInfo Jpeg2000 + 'ulst' UUIDList no + 'url ' URL no + 'uuid' UUID-EXIF EXIF + UUID-EXIF2 EXIF + UUID-EXIF_bad EXIF + UUID-IPTC IPTC + UUID-IPTC2 IPTC + UUID-XMP XMP + UUID-GeoJP2 EXIF + UUID-Photoshop Photoshop + UUID-Signature no + UUID-C2PAClaimSignature - + UUID-Unknown no + 'xml ' XML XMP XML + XMP - + XMP + +=head3 Jpeg2000 ColorSpec Tags + +The table below contains tags in the color specification (colr) box. This +box may be rewritten by writing either ICC_Profile, ColorSpace or +ColorSpecData. When writing, any existing colr boxes are replaced with the +newly created colr box. + +B<NOTE>: Care must be taken when writing this color specification because +writing a specification that is incompatible with the image data may make +the image undisplayable. + + Index1 Tag Name Writable + ------ -------- -------- + 0 ColorSpecMethod int8s! + 1 ColorSpecPrecedence int8s! + 2 ColorSpecApproximation int8s! + 3 ICC_Profile ICC_Profile + ColorSpace int32u! + ColorSpecData undef! + +=head3 Jpeg2000 FileType Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 MajorBrand no + 1 MinorVersion no + 2 CompatibleBrands no + +=head3 Jpeg2000 ImageHeader Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ImageHeight no + 4 ImageWidth no + 8 NumberOfComponents no + 10 BitsPerComponent no + 11 Compression no + +=head3 Jpeg2000 JUMD Tags + +Information extracted from the JUMBF description box. + + Tag ID Tag Name Writable + ------ -------- -------- + 'id' JUMDID no + 'label' JUMDLabel no + 'sig' JUMDSignature no + 'toggles' JUMDToggles? no + 'type' JUMDType no + +=head3 Jpeg2000 CaptureResolution Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 CaptureYResolution no + 4 CaptureXResolution no + 8 CaptureYResolutionUnit no + 9 CaptureXResolutionUnit no + +=head3 Jpeg2000 DisplayResolution Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 DisplayYResolution no + 4 DisplayXResolution no + 8 DisplayYResolutionUnit no + 9 DisplayXResolutionUnit no + +=head2 JSON Tags + +Other than a few tags in the table below, JSON tags have not been +pre-defined. However, ExifTool will read any existing tags from basic +JSON-formatted files. + + Tag Name Writable + -------- -------- + ON1_SettingsData PLIST + ON1_SettingsMetadataCreated no + ON1_SettingsMetadataModified no + ON1_SettingsMetadataName no + ON1_SettingsMetadataPluginID no + ON1_SettingsMetadataTimestamp no + ON1_SettingsMetadataUsage no + ON1_SettingsMetadataVisibleToUser no + +=head2 CBOR Tags + +The tags below are extracted from CBOR (Concise Binary Object +Representation) metadata. The C2PA specification uses this format for some +metadata. As well as these tags, ExifTool will read any existing tags. + + Tag Name Writable + -------- -------- + AuthorIdentifier no + AuthorName no + DocumentID no + Format no + InstanceID no + Relationship no + ThumbnailHash no+ + ThumbnailURL no + Title no + +=head2 PLIST Tags + +Apple Property List tags. ExifTool reads both XML and binary-format PLIST +files, and will extract any existing tags even if they aren't listed below. +These tags belong to the family 0 "PLIST" group, but family 1 group may be +either "XML" or "PLIST" depending on whether the format is XML or binary. + + Tag ID Tag Name Writable + ------ -------- -------- + 'MetaDataList//DateTimeOriginal' + DateTimeOriginal no + 'MetaDataList//Duration' Duration no + 'MetaDataList//Geolocation/Latitude' + GPSLatitude no + 'MetaDataList//Geolocation/Longitude' + GPSLongitude no + 'MetaDataList//Geolocation/MapDatum' + GPSMapDatum no + 'XMLFileType' XMLFileType no + 'cast//name' Cast no+ + 'codirectors//name' Codirectors no+ + 'directors//name' Directors no+ + 'producers//name' Producers no+ + 'screenwriters//name' Screenwriters no+ + 'studio//name' Studio no+ + +=head2 APP12 Tags + +=head3 APP12 PictureInfo Tags + +The JPEG APP12 "Picture Info" segment was used by some older cameras, and +contains ASCII-based meta information. Below are some tags which have been +observed Agfa and Polaroid images, however ExifTool will extract information +from any tags found in this segment. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Aperture' Aperture no + 'ColorMode' ColorMode no + 'ConTake' ConTake no + 'ExpBias' ExposureCompensation no + 'FNumber' FNumber no + 'FWare' FirmwareVersion no + 'Flash' Flash no + 'FocusMode' FocusMode no + 'FocusPos' FocusPos no + 'ID' ID no + 'ImageSize' ImageSize no + 'LightS' LightS no + 'Macro' Macro no + 'Protect' Protect no + 'Quality' Quality no + 'Resolution' Resolution no + 'Serial#' SerialNumber no + 'Shutter' ExposureTime no + 'StrobeTime' StrobeTime no + 'TimeDate' DateTimeOriginal no + 'Type' CameraType no + 'Version' Version no + 'Ytarget' YTarget no + 'Zoom' Zoom no + 'ZoomPos' ZoomPos no + 'shtr' ExposureTime no + 'ylevel' YLevel no + +=head3 APP12 Ducky Tags + +Photoshop uses the JPEG APP12 "Ducky" segment to store some information in +"Save for Web" images. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 Quality int32u/ + 0x0002 Comment string/ + 0x0003 Copyright string/ + +=head2 AFCP Tags + +AFCP stands for AXS File Concatenation Protocol, and is a poorly designed +protocol for appending information to the end of files. This can be used as +an auxiliary technique to store IPTC information in images, but is +incompatible with some file formats. + +ExifTool will read and write (but not create) AFCP IPTC information in JPEG +and TIFF images. + +See +L<http://web.archive.org/web/20080828211305/http://www.tocarte.com/media/axs_afcp_spec.pdf> +for the AFCP specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'IPTC' IPTC IPTC + 'Nail' ThumbnailImage no + 'PrVw' PreviewImage no + 'TEXT' Text no + +=head2 DarwinCore Tags + +Tags defined in the Darwin Core (dwc) XMP namespace. See +L<http://rs.tdwg.org/dwc/index.htm> for the official specification. + +These tags belong to the ExifTool XMP-dwc family 1 group. + + Tag Name Writable + -------- -------- + DCTermsLocation DarwinCore DCTermsLocation Struct + DCContinent string_ + DCCoordinatePrecision string_ + DCCoordinateUncertaintyInMeters string_ + DCCountry string_ + DCCountryCode string_ + DCCounty string_ + DCDecimalLatitude string_ + DCDecimalLongitude string_ + DCFootprintSpatialFit string_ + DCFootprintSRS string_ + DCFootprintWKT string_ + DCGeodeticDatum string_ + DCGeoreferencedBy string_ + DCGeoreferencedDate string_ + DCGeoreferenceProtocol string_ + DCGeoreferenceRemarks string_ + DCGeoreferenceSources string_ + DCGeoreferenceVerificationStatus string_ + DCHigherGeography string_ + DCHigherGeographyID string_ + DCIsland string_ + DCIslandGroup string_ + DCLocality string_ + DCLocationAccordingTo string_ + DCLocationID string_ + DCLocationRemarks string_ + DCMaximumDepthInMeters string_ + DCMaximumDistanceAboveSurfaceInMeters string_ + DCMaximumElevationInMeters string_ + DCMinimumDepthInMeters string_ + DCMinimumDistanceAboveSurfaceInMeters string_ + DCMinimumElevationInMeters string_ + DCMunicipality string_ + DCPointRadiusSpatialFit string_ + DCStateProvince string_ + DCVerbatimCoordinates string_ + DCVerbatimCoordinateSystem string_ + DCVerbatimDepth string_ + DCVerbatimElevation string_ + DCVerbatimLatitude string_ + DCVerbatimLocality string_ + DCVerbatimLongitude string_ + DCVerbatimSRS string_ + DCVerticalDatum string_ + DCWaterBody string_ + DCEvent DarwinCore Event Struct + EventDay integer_ + EventEarliestDate date_ + EventEndDayOfYear integer_ + EventDate date_ + EventID string/_ + EventRemarks lang-alt_ + EventTime string_ + EventFieldNotes string_ + EventFieldNumber string_ + EventHabitat string_ + EventLatestDate date_ + EventMonth integer_ + EventParentEventID string_ + EventSampleSizeUnit string_ + EventSampleSizeValue string_ + EventSamplingEffort string_ + EventSamplingProtocol string_ + EventStartDayOfYear integer_ + EventVerbatimEventDate string_ + EventYear integer_ + FossilSpecimen DarwinCore MaterialSample Struct + FossilSpecimenMaterialSampleID string_ + GeologicalContext DarwinCore GeologicalContext Struct + GeologicalContextBed string_ + EarliestAgeOrLowestStage string_ + EarliestEonOrLowestEonothem string_ + EarliestEpochOrLowestSeries string_ + EarliestEraOrLowestErathem string_ + EarliestPeriodOrLowestSystem string_ + GeologicalContextFormation string_ + GeologicalContextID string_ + GeologicalContextGroup string_ + HighestBiostratigraphicZone string_ + LatestAgeOrHighestStage string_ + LatestEonOrHighestEonothem string_ + LatestEpochOrHighestSeries string_ + LatestEraOrHighestErathem string_ + LatestPeriodOrHighestSystem string_ + LithostratigraphicTerms string_ + LowestBiostratigraphicZone string_ + GeologicalContextMember string_ + HumanObservation DarwinCore Event Struct + HumanObservationDay integer_ + HumanObservationEarliestDate date_ + HumanObservationEndDayOfYear integer_ + HumanObservationEventDate date_ + HumanObservationEventID string/_ + HumanObservationEventRemarks lang-alt_ + HumanObservationEventTime string_ + HumanObservationFieldNotes string_ + HumanObservationFieldNumber string_ + HumanObservationHabitat string_ + HumanObservationLatestDate date_ + HumanObservationMonth integer_ + HumanObservationParentEventID string_ + HumanObservationSampleSizeUnit string_ + HumanObservationSampleSizeValue string_ + HumanObservationSamplingEffort string_ + HumanObservationSamplingProtocol string_ + HumanObservationStartDayOfYear integer_ + HumanObservationVerbatimEventDate string_ + HumanObservationYear integer_ + Identification DarwinCore Identification Struct + DateIdentified date_ + IdentificationID string_ + IdentificationQualifier string_ + IdentificationReferences string_ + IdentificationRemarks string_ + IdentificationVerificationStatus string_ + IdentifiedBy string_ + IdentifiedByID string_ + TypeStatus string_ + VerbatimIdentification string_ + LivingSpecimen DarwinCore MaterialSample Struct + LivingSpecimenMaterialSampleID string_ + MachineObservation DarwinCore Event Struct + MachineObservationDay integer_ + MachineObservationEarliestDate date_ + MachineObservationEndDayOfYear integer_ + MachineObservationEventDate date_ + MachineObservationEventID string/_ + MachineObservationEventRemarks lang-alt_ + MachineObservationEventTime string_ + MachineObservationFieldNotes string_ + MachineObservationFieldNumber string_ + MachineObservationHabitat string_ + MachineObservationLatestDate date_ + MachineObservationMonth integer_ + MachineObservationParentEventID string_ + MachineObservationSampleSizeUnit string_ + MachineObservationSampleSizeValue string_ + MachineObservationSamplingEffort string_ + MachineObservationSamplingProtocol string_ + MachineObservationStartDayOfYear integer_ + MachineObservationVerbatimEventDate string_ + MachineObservationYear integer_ + MaterialSample DarwinCore MaterialSample Struct + MaterialSampleID string_ + MeasurementOrFact DarwinCore MeasurementOrFact Struct + MeasurementAccuracy string_ + MeasurementDeterminedBy string_ + MeasurementDeterminedDate date_ + MeasurementID string_ + MeasurementMethod string_ + MeasurementRemarks string_ + MeasurementType string_ + MeasurementUnit string_ + MeasurementValue string_ + Occurrence DarwinCore Occurrence Struct + OccurrenceAssociatedMedia string_ + OccurrenceAssociatedOccurrences string_ + OccurrenceAssociatedReferences string_ + OccurrenceAssociatedSequences string_ + OccurrenceAssociatedTaxa string_ + OccurrenceBehavior string_ + OccurrenceCatalogNumber string_ + OccurrenceDegreeOfEstablishment string_ + OccurrenceDisposition string_ + OccurrenceEstablishmentMeans string_ + OccurrenceGeoreferenceVerificationStatus string_ + OccurrenceIndividualCount string_ + OccurrenceIndividualID string_ + OccurrenceLifeStage string_ + OccurrenceDetails string_ + OccurrenceID string_ + OccurrenceRemarks string_ + OccurrenceStatus string_ + OccurrenceOrganismQuantity string_ + OccurrenceOrganismQuantityType string_ + OccurrenceOtherCatalogNumbers string_ + OccurrencePathway string_ + OccurrencePreparations string_ + OccurrencePreviousIdentifications string_ + OccurrenceRecordedBy string_ + OccurrenceRecordedByID string_ + OccurrenceRecordNumber string_ + OccurrenceReproductiveCondition string_ + OccurrenceSex string_ + Organism DarwinCore Organism Struct + OrganismAssociatedOccurrences string_ + OrganismAssociatedOrganisms string_ + OrganismID string_ + OrganismName string_ + OrganismRemarks string_ + OrganismScope string_ + OrganismPreviousIdentifications string_ + PreservedSpecimen DarwinCore MaterialSample Struct + PreservedSpecimenMaterialSampleID string_ + Record DarwinCore Record Struct + RecordBasisOfRecord string_ + RecordCollectionCode string_ + RecordCollectionID string_ + RecordDataGeneralizations string_ + RecordDatasetID string_ + RecordDatasetName string_ + RecordDynamicProperties string_ + RecordInformationWithheld string_ + RecordInstitutionCode string_ + RecordInstitutionID string_ + RecordOwnerInstitutionCode string_ + ResourceRelationship DarwinCore ResourceRelationship Struct + RelatedResourceID string_ + RelationshipAccordingTo string_ + RelationshipEstablishedDate date_ + RelationshipOfResource string_ + RelationshipOfResourceID string_ + RelationshipRemarks string_ + ResourceID string_ + ResourceRelationshipID string_ + Taxon DarwinCore Taxon Struct + TaxonAcceptedNameUsage string_ + TaxonAcceptedNameUsageID string_ + TaxonClass string_ + TaxonCultivarEpithet string_ + TaxonFamily string_ + TaxonGenus string_ + TaxonHigherClassification string_ + TaxonInfraspecificEpithet string_ + TaxonKingdom string_ + TaxonNameAccordingTo string_ + TaxonNameAccordingToID string_ + TaxonNamePublishedIn string_ + TaxonNamePublishedInID string_ + TaxonNamePublishedInYear string_ + TaxonNomenclaturalCode string_ + TaxonNomenclaturalStatus string_ + TaxonOrder string_ + TaxonOriginalNameUsage string_ + TaxonOriginalNameUsageID string_ + TaxonParentNameUsage string_ + TaxonParentNameUsageID string_ + TaxonPhylum string_ + TaxonScientificName string_ + TaxonScientificNameAuthorship string_ + TaxonScientificNameID string_ + TaxonSpecificEpithet string_ + TaxonSubgenus string_ + TaxonConceptID string_ + TaxonID string_ + TaxonTaxonomicStatus string_ + TaxonRank string_ + TaxonRemarks string_ + TaxonVerbatimTaxonRank string_ + TaxonVernacularName lang-alt_ + +=head3 DarwinCore DCTermsLocation Struct + + Field Name Writable + ---------- -------- + Continent string + CoordinatePrecision string + CoordinateUncertaintyInMeters string + Country string + CountryCode string + County string + DecimalLatitude string + DecimalLongitude string + FootprintSRS string + FootprintSpatialFit string + FootprintWKT string + GeodeticDatum string + GeoreferenceProtocol string + GeoreferenceRemarks string + GeoreferenceSources string + GeoreferenceVerificationStatus string + GeoreferencedBy string + GeoreferencedDate string + HigherGeography string + HigherGeographyID string + Island string + IslandGroup string + Locality string + LocationAccordingTo string + LocationID string + LocationRemarks string + MaximumDepthInMeters string + MaximumDistanceAboveSurfaceInMeters string + MaximumElevationInMeters string + MinimumDepthInMeters string + MinimumDistanceAboveSurfaceInMeters string + MinimumElevationInMeters string + Municipality string + PointRadiusSpatialFit string + StateProvince string + VerbatimCoordinateSystem string + VerbatimCoordinates string + VerbatimDepth string + VerbatimElevation string + VerbatimLatitude string + VerbatimLocality string + VerbatimLongitude string + VerbatimSRS string + VerticalDatum string + WaterBody string + +=head3 DarwinCore Event Struct + + Field Name Writable + ---------- -------- + Day integer + EarliestDate date + EndDayOfYear integer + EventDate date + EventID string + EventRemarks lang-alt + EventTime string + FieldNotes string + FieldNumber string + Habitat string + LatestDate date + Month integer + ParentEventID string + SampleSizeUnit string + SampleSizeValue string + SamplingEffort string + SamplingProtocol string + StartDayOfYear integer + VerbatimEventDate string + Year integer + +=head3 DarwinCore MaterialSample Struct + + Field Name Writable + ---------- -------- + MaterialSampleID string + +=head3 DarwinCore GeologicalContext Struct + + Field Name Writable + ---------- -------- + Bed string + EarliestAgeOrLowestStage string + EarliestEonOrLowestEonothem string + EarliestEpochOrLowestSeries string + EarliestEraOrLowestErathem string + EarliestPeriodOrLowestSystem string + Formation string + GeologicalContextID string + Group string + HighestBiostratigraphicZone string + LatestAgeOrHighestStage string + LatestEonOrHighestEonothem string + LatestEpochOrHighestSeries string + LatestEraOrHighestErathem string + LatestPeriodOrHighestSystem string + LithostratigraphicTerms string + LowestBiostratigraphicZone string + Member string + +=head3 DarwinCore Identification Struct + + Field Name Writable + ---------- -------- + DateIdentified date + IdentificationID string + IdentificationQualifier string + IdentificationReferences string + IdentificationRemarks string + IdentificationVerificationStatus string + IdentifiedBy string + IdentifiedByID string + TypeStatus string + VerbatimIdentification string + +=head3 DarwinCore MeasurementOrFact Struct + + Field Name Writable + ---------- -------- + MeasurementAccuracy string + MeasurementDeterminedBy string + MeasurementDeterminedDate date + MeasurementID string + MeasurementMethod string + MeasurementRemarks string + MeasurementType string + MeasurementUnit string + MeasurementValue string + +=head3 DarwinCore Occurrence Struct + + Field Name Writable + ---------- -------- + AssociatedMedia string + AssociatedOccurrences string + AssociatedReferences string + AssociatedSequences string + AssociatedTaxa string + Behavior string + CatalogNumber string + DegreeOfEstablishment string + Disposition string + EstablishmentMeans string + GeoreferenceVerificationStatus string + IndividualCount string + IndividualID string + LifeStage string + OccurrenceDetails string + OccurrenceID string + OccurrenceRemarks string + OccurrenceStatus string + OrganismQuantity string + OrganismQuantityType string + OtherCatalogNumbers string + Pathway string + Preparations string + PreviousIdentifications string + RecordNumber string + RecordedBy string + RecordedByID string + ReproductiveCondition string + Sex string + +=head3 DarwinCore Organism Struct + + Field Name Writable + ---------- -------- + AssociatedOccurrences string + AssociatedOrganisms string + OrganismID string + OrganismName string + OrganismRemarks string + OrganismScope string + PreviousIdentifications string + +=head3 DarwinCore Record Struct + + Field Name Writable + ---------- -------- + BasisOfRecord string + CollectionCode string + CollectionID string + DataGeneralizations string + DatasetID string + DatasetName string + DynamicProperties string + InformationWithheld string + InstitutionCode string + InstitutionID string + OwnerInstitutionCode string + +=head3 DarwinCore ResourceRelationship Struct + + Field Name Writable + ---------- -------- + RelatedResourceID string + RelationshipAccordingTo string + RelationshipEstablishedDate date + RelationshipOfResource string + RelationshipOfResourceID string + RelationshipRemarks string + ResourceID string + ResourceRelationshipID string + +=head3 DarwinCore Taxon Struct + + Field Name Writable + ---------- -------- + AcceptedNameUsage string + AcceptedNameUsageID string + Class string + CultivarEpithet string + Family string + Genus string + HigherClassification string + InfraspecificEpithet string + Kingdom string + NameAccordingTo string + NameAccordingToID string + NamePublishedIn string + NamePublishedInID string + NamePublishedInYear string + NomenclaturalCode string + NomenclaturalStatus string + Order string + OriginalNameUsage string + OriginalNameUsageID string + ParentNameUsage string + ParentNameUsageID string + Phylum string + ScientificName string + ScientificNameAuthorship string + ScientificNameID string + SpecificEpithet string + Subgenus string + TaxonConceptID string + TaxonID string + TaxonRank string + TaxonRemarks string + TaxonomicStatus string + VerbatimTaxonRank string + VernacularName lang-alt + +=head2 FotoStation Tags + +The following tables define information found in the FotoWare FotoStation +trailer. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 IPTC IPTC + 0x0002 SoftEdit FotoStation SoftEdit + 0x0003 ThumbnailImage yes + 0x0004 PreviewImage yes + +=head3 FotoStation SoftEdit Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 OriginalImageWidth int32s + 1 OriginalImageHeight int32s + 2 ColorPlanes int32s + 3 XYResolution int32s + 4 Rotation int32s + 6 CropLeft int32s + 7 CropTop int32s + 8 CropRight int32s + 9 CropBottom int32s + 11 CropRotation int32s + +=head2 PhotoMechanic Tags + +The Photo Mechanic trailer contains data in an IPTC-format structure, with +soft edit information stored under record number 2. + + Record Tag Name Writable + ------ -------- -------- + 2 SoftEdit PhotoMechanic SoftEdit + +=head3 PhotoMechanic SoftEdit Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 209 RawCropLeft int32s + 210 RawCropTop int32s + 211 RawCropRight int32s + 212 RawCropBottom int32s + 213 ConstrainedCropWidth int32s + 214 ConstrainedCropHeight int32s + 215 FrameNum int32s + 216 Rotation int32s + 217 CropLeft int32s + 218 CropTop int32s + 219 CropRight int32s + 220 CropBottom int32s + 221 Tagged int32s + 222 ColorClass int32s + 223 Rating int32s + 236 PreviewCropLeft int32s + 237 PreviewCropTop int32s + 238 PreviewCropRight int32s + 239 PreviewCropBottom int32s + +=head3 PhotoMechanic XMP Tags + +Below is a list of the observed PhotoMechanic XMP tags. The actual +namespace prefix is "photomechanic" but ExifTool shortens this in +the family 1 group name. + +These tags belong to the ExifTool XMP-photomech family 1 group. + + Tag Name Writable + -------- -------- + ColorClass integer + CountryCode string/ + EditStatus string + PMVersion string + Prefs string + Tagged boolean + TimeCreated string/ + +=head2 Microsoft Tags + +=head3 Microsoft XMP Tags + +Microsoft Photo 1.0 schema XMP tags. This is likely not a complete list, +but represents tags which have been observed in sample images. The actual +namespace prefix is "MicrosoftPhoto", but ExifTool shortens this in the +family 1 group name. + +These tags belong to the ExifTool XMP-microsoft family 1 group. + + Tag Name Writable + -------- -------- + CameraSerialNumber string + CreatorAppID string + CreatorOpenWithUIOptions string + DateAcquired date + FlashManufacturer string + FlashModel string + ItemSubType string + LastKeywordIPTC string+ + LastKeywordXMP string+ + LensManufacturer string + LensModel string/ + RatingPercent string + +=head3 Microsoft MP1 Tags + +Microsoft Photo 1.1 schema XMP tags which have been observed. + +These tags belong to the ExifTool XMP-MP1 family 1 group. + + Tag Name Writable + -------- -------- + Brightness string/ + CameraModelID string/ + Contrast string/ + ExposureCompensation string/ + PanoramicStitchCameraMotion string + PanoramicStitchMapType string + PanoramicStitchPhi0 real + PanoramicStitchPhi1 real + PanoramicStitchTheta0 real + PanoramicStitchTheta1 real + PipelineVersion string + StreamType string + WhiteBalance0 real + WhiteBalance1 real + WhiteBalance2 real + +=head3 Microsoft MP Tags + +Microsoft Photo 1.2 schema XMP tags which have been observed. + +These tags belong to the ExifTool XMP-MP family 1 group. + + Tag Name Writable + -------- -------- + RegionInfoDateRegionsValid date_ + RegionInfoMP Microsoft RegionInfo Struct + RegionInfoRegions Microsoft Regions Struct_+ + RegionPersonDisplayName string_+ + RegionPersonEmailDigest string_+ + RegionPersonLiveIdCID string_+ + RegionPersonSourceID string_+ + RegionRectangle string_+ + +=head3 Microsoft RegionInfo Struct + + Field Name Writable + ---------- -------- + DateRegionsValid date + Regions Microsoft Regions Struct+ + +=head3 Microsoft Regions Struct + +Note that PersonLiveIdCID element is called PersonLiveCID according to the +Microsoft specification, but in practice their software actually writes +PersonLiveIdCID, so ExifTool uses this too. + + Field Name Writable + ---------- -------- + PersonDisplayName string + PersonEmailDigest string + PersonLiveIdCID string + PersonSourceID string + Rectangle string + +=head3 Microsoft Stitch Tags + +Information found in the Microsoft custom EXIF tag 0x4748, as written by +Windows Live Photo Gallery. + + Index4 Tag Name Writable + ------ -------- -------- + 0 PanoramicStitchVersion int32u + 1 PanoramicStitchCameraMotion int32u + 2 PanoramicStitchMapType int32u + 3 PanoramicStitchTheta0 float + 4 PanoramicStitchTheta1 float + 5 PanoramicStitchPhi0 float + 6 PanoramicStitchPhi1 float + +=head3 Microsoft Xtra Tags + +Tags found in the Microsoft "Xtra" atom of QuickTime videos. Tag ID's are +not shown because some are unruly GUID's. Currently most of these tags are +not writable because the Microsoft documentation is poor and samples were +not available, but more tags may be made writable in the future if samples +are provided. Note that writable tags in this table are are flagged to +"Avoid", which means that other more common tags will be written instead if +possible unless the Microsoft group is specified explicitly. + + Tag Name Writable + -------- -------- + Abstract no + AccountName no + AcquisitionTime no + AcquisitionTimeDay no + AcquisitionTimeMonth no + AcquisitionTimeYear no + AcquisitionTimeYearMonth no + AcquisitionTimeYearMonthDay no + AlbumArtist Unicode/ + AlbumArtist no + AlbumArtistSortOrder no + AlbumCoverURL Unicode/ + AlbumID no + AlbumIDAlbumArtist no + AlbumTitle Unicode/ + AlbumTitle no + AlbumTitleSortOrder no + AlternateSourceURL no + Anniversary no + Artist no + AssistantsName no + AssistantsPhone no + Attachments no + Attributes no + AudioBitrate no + AudioFormat no + AudioSampleRate no + AudioSampleSize no + Author no + Author no + AuthorSortOrder no + AuthorURL Unicode/ + AutoSummary no + AverageLevel no + BccAddresses no + BccNames no + Beats-per-minute no + BeatsPerMinute no + BillingInformation no + Birthday no + BitDepth no + Bitrate no + Bitrate no + BroadcastDate no + BusinessAddress no + BusinessCity no + BusinessCountry-Region no + BusinessFax no + BusinessHomePage no + BusinessPOBox no + BusinessPhone no + BusinessPostalCode no + BusinessStateOrProvince no + BusinessStreet no + BuyNow no + BuyTickets no + CDTrackEnabled no + CallLetters no + CallbackNumber no + CameraMaker no + CameraManufacturer no + CameraModel no + CameraModel no + CarPhone no + Category Unicode/+ + Category no + CcAddresses no + CcNames no + CellPhone no + ChannelNumber no + Channels no + Channels no + ChapterNum no + Children no + City no + ClientID no + ClosedCaptioning no + Color no + Comment no + Comments no + Company no + CompanyMainPhone no + Complete no + Composer Unicode/ + Composers no + Computer no + Conductor Unicode/+ + Conductors no + ContactNames no + ContentDistributor Unicode/ + ContentDistributorDuration no + ContentDistributorType no + ContentGroupDescription no + ContentType no + Contributors no + ConversationID no + Copyright no + Copyright no + Count no + Country-Region no + Creator no + CurrentBitrate no + DLNAServerUDN no + DLNASourceURI no + DRMIndividualizedVersion no + DRMKeyID no + DTCPIPHost no + DTCPIPPort no + DVDID no + DataRate no + Date no + DateAccessed no + DateAcquired vt_filetime/ + DateArchived no + DateCompleted no + DateCreated no + DateImported no + DateLastSaved no + DateModified no + DatePictureTaken no + DateReceived no + DateReleased no + DateSent no + DateVisited no + Department no + Description no + Description no + Description no + Dimensions no + Director Unicode/+ + Directors no + DisplayArtist no + Division no + DocumentID no + DueDate no + Duration no + Duration no + Duration no + E-mail2 no + E-mail3 no + E-mailAddress no + E-mailDisplayName no + E-mailList no + EncodedBy Unicode/ + EncodedBy no + EncodingTime date/ + EndDate no + EntryType no + EpisodeName no + Event no + Event no + ExifVersion no + ExposureBias no + ExposureProgram no + ExposureTime no + F-stop no + FileAs no + FileCount no + FileSize no + FileType no + FileVersion no + FirstName no + FlagColor no + FlagStatus no + FlashMode no + FocalLength no + FocalLength35mm no + Folder no + FolderName no + FolderPath no + FormatTag no + FourCC no + FrameHeight no + FrameRate no + FrameRate no + FrameWidth no + Free-busyStatus no + Frequency no + FromAddresses no + FromNames no + FullName no + Gender no + Genre no + Genre no + GenreID no + GivenName no + HasAttachments no + HasFlag no + Hobbies no + HomeAddress no + HomeCity no + HomeCountry-Region no + HomeFax no + HomePOBox no + HomePhone no + HomePostalCode no + HomeStateOrProvince no + HomeStreet no + HorizontalResolution no + IMAddresses no + ISOSpeed no + Importance no + Incomplete no + InitialKey Unicode/ + InitialKey no + Initials no + IsAttachment no + IsCompleted no + IsDeleted no + IsNetworkFeed no + IsOnline no + IsProtected no + IsRecurring no + IsVBR no + JobTitle no + Keywords no + Kinds no + Label no + Language no + Language no + LastName no + LastPrinted no + LeadPerformer no + LegalTrademarks no + LensMaker no + LensModel no + LibraryID no + LibraryName no + LightSource no + LinkStatus no + LinkTarget no + Location no + Location no + Lyrics no + MCDI no + MailingAddress no + MaxAperture no + MediaClassPrimaryID GUID/ + MediaClassSecondaryID GUID/ + MediaContentTypes no + MediaCreated no + MediaOriginalBroadcastDateTime no + MediaOriginalChannel no + MediaStationName no + MediaType no + MeteringMode no + MiddleName no + Mileage no + ModifiedBy no + Mood Unicode/ + Mood no + MoreInfo no + Name no + Nickname no + OfficeLocation no + OfflineAvailability no + OfflineStatus no + OptionalAttendeeAddresses no + OptionalAttendees no + OrganizerAddress no + OrganizerName no + Orientation no + OriginalAlbumTitle Unicode/ + OriginalArtist Unicode/ + OriginalLyricist Unicode/ + OtherAddress no + OtherCity no + OtherCountry-Region no + OtherPOBox no + OtherPostalCode no + OtherStateOrProvince no + OtherStreet no + Owner no + POBox no + Pager no + Pages no + ParentalRating Unicode/ + ParentalRating no + ParentalRatingReason no + PartOfSet no + PartOfSet no + PartOfSet no + Participants no + Path no + PeakValue no + PerceivedType no + Period Unicode/ + Period no + PersonalTitle no + PixelAspectRatioX no + PixelAspectRatioY no + PlaylistIndex no + PostalCode no + PrimaryE-mail no + PrimaryPhone no + Priority no + Producer Unicode/+ + Producers no + ProductName no + ProductVersion no + Profession no + ProgramDescription no + ProgramMode no + ProgramName no + Project no + PromotionURL Unicode/ + Protected no + ProtectionType no + Provider no + Provider Unicode/ + ProviderLogoURL no + ProviderRating no + ProviderStyle no + ProviderURL no + Publisher Unicode/ + Publisher no + RadioBand no + RadioFormat no + Rating no + RatingOrg no + ReadStatus no + RecordingTime no + RecordingTime no + RecordingTimeDay no + RecordingTimeMonth no + RecordingTimeYear no + RecordingTimeYearMonth no + RecordingTimeYearMonthDay no + ReleaseDate no + ReleaseDateDay no + ReleaseDateMonth no + ReleaseDateYear no + ReleaseDateYearMonth no + ReleaseDateYearMonthDay no + ReminderTime no + RequestState no + RequiredAttendeeAddresses no + RequiredAttendees no + Rerun no + Resources no + SAP no + Saturation no + SearchRanking no + SenderAddress no + SenderName no + Sensitivity no + ShadowFilePath no + Shared no + SharedUserRating int64u/ + SharedWith no + Size no + Slides no + Source no + SourceURL no + SpaceFree no + SpaceUsed no + Spouse no + StartDate no + StateOrProvince no + StationCallSign no + StationName no + Status no + Status no + Store no + Street no + Subject no + Subject no + SubjectDistance no + SubscriptionContentID no + Subtitle Unicode/ + Subtitle no + SubtitleDescription no + Suffix no + Summary no + Sync01 no + Sync02 no + Sync03 no + Sync04 no + Sync05 no + Sync06 no + Sync07 no + Sync08 no + Sync09 no + Sync10 no + Sync11 no + Sync12 no + Sync13 no + Sync14 no + Sync15 no + Sync16 no + SyncOnly no + SyncState no + TTY-TTDPhone no + TaskOwner no + Telex no + Temporary no + Title no + Title no + TitleNum no + TitleSortOrder no + ToAddresses no + ToDoTitle no + ToNames no + TotalBitrate no + TotalDuration no + TotalEditingTime no + TotalFileSize no + TotalSize no + TrackNumber no + TrackNumber no + TrackingID no + Type no + Type no + URL no + UniqueFileIdentifier no + Untitled0 no + Untitled1 no + Untitled2 no + UserCustom1 no + UserCustom2 no + UserEffectiveRating no + UserLastPlayedTime no + UserPlayCount no + UserPlaycountAfternoon no + UserPlaycountEvening no + UserPlaycountMorning no + UserPlaycountNight no + UserPlaycountWeekday no + UserPlaycountWeekend no + UserRating no + UserServiceRating no + UserWebURL no + VerticalResolution no + VideoBitrate no + VideoCompression no + VideoFormat no + VideoFrameRate no + VideoHeight no + VideoWidth no + WMCollectionGroupID no + WMCollectionID no + WMContentID no + WMShadowFileSourceDRMType no + WMShadowFileSourceFileType no + Webpage no + WhiteBalance no + WindowsFileName no + WordCount no + Writer Unicode/ + Writers no + Year no + Year no + +=head2 GIMP Tags + +The GNU Image Manipulation Program (GIMP) writes these tags in its native +XCF (eXperimental Computing Facilty) images. + + Tag ID Tag Name Writable + ------ -------- -------- + 'header' Header GIMP Header + 0x0011 Compression no + 0x0013 Resolution GIMP Resolution + 0x0014 Tattoo no + 0x0015 Parasites GIMP Parasite + 0x0016 Units no + +=head3 GIMP Header Tags + + Index1 Tag Name Writable + ------ -------- -------- + 9 XCFVersion no + 14 ImageWidth no + 18 ImageHeight no + 22 ColorMode no + +=head3 GIMP Resolution Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 XResolution no + 1 YResolution no + +=head3 GIMP Parasite Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'exif-data' ExifData EXIF + 'gimp-comment' Comment no + 'gimp-image-metadata' XML XMP XML + 'gimp-metadata' XMP XMP + 'icc-profile' ICC_Profile ICC_Profile + 'icc-profile-name' ICCProfileName no + 'iptc-data' IPTCData IPTC + 'jpeg-exif-data' JPEGExifData EXIF + +=head2 MIE Tags + +MIE is a flexible format which may be used as a stand-alone meta information +format, for encapsulation of other files and information, or as a trailer +appended to other file formats. The tables below represent currently +defined MIE tags, however ExifTool will also extract any other information +present in a MIE file. + +When writing MIE information, some special features are supported: + +1) String values may be written as ASCII (ISO 8859-1) or UTF-8. ExifTool +automatically detects the presence of wide characters and treats the string +appropriately. Internally, UTF-8 text may be converted to UTF-16 or UTF-32 +and stored in this format in the file if it is more compact. + +2) All MIE string-value tags support localized text. Localized values are +written by adding a language/country code to the tag name in the form +C<TAG-xx_YY>, where C<TAG> is the tag name, C<xx> is a 2-character lower +case ISO 639-1 language code, and C<YY> is a 2-character upper case ISO +3166-1 alpha 2 country code (eg. C<Title-en_US>). But as usual, the user +interface is case-insensitive, and ExifTool will write the correct case to +the file. + +3) Some numerical MIE tags allow units of measurement to be specified. For +these tags, units may be added in brackets immediately following the value +(eg. C<55(mi/h)>). If no units are specified, the default units are +written. + +4) ExifTool writes compressed metadata to MIE files if the Compress (-z) +option is used and Compress::Zlib is available. + +See L<https://exiftool.org/MIE1.1-20070121.pdf> for the official MIE +specification. + + Tag ID Tag Name Writable + ------ -------- -------- + '0Type' SubfileType string + '0Vers' MIEVersion string + '1Directory' SubfileDirectory string + '1Name' SubfileName string + '2MIME' SubfileMIMEType string + 'Meta' Meta MIE Meta + 'data' SubfileData undef + 'rsrc' SubfileResource undef + 'zmd5' MD5Digest string + 'zmie' TrailerSignature undef + +=head3 MIE Meta Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Audio' Audio MIE Audio + 'Camera' Camera MIE Camera + 'Document' Document MIE Doc + 'EXIF' EXIF EXIF + 'Geo' Geo MIE Geo + 'ICCProfile' ICC_Profile ICC_Profile + 'ID3' ID3 ID3 + 'IPTC' IPTC IPTC + 'Image' Image MIE Image + 'MakerNotes' MakerNotes MIE MakerNotes + 'Preview' Preview MIE Preview + 'Thumbnail' Thumbnail MIE Thumbnail + 'Video' Video MIE Video + 'XMP' XMP XMP + +=head3 MIE Audio Tags + +For the Audio group (and any other group containing a 'data' element), tags +refer to the contained data if present, otherwise they refer to the main +SubfileData. The C<0Type> and C<1Name> elements should exist only if C<data> +is present. + + Tag ID Tag Name Writable + ------ -------- -------- + '0Type' RelatedAudioFileType string + '1Name' RelatedAudioFileName string + 'Channels' Channels int8u + 'Compression' AudioCompression string + 'Duration' Duration rational64u~ + 'SampleBits' SampleBits int16u + 'SampleRate' SampleRate int32u + 'data' RelatedAudioFile undef + +=head3 MIE Camera Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Brightness' Brightness int8s + 'ColorBalance' ColorBalance rational64u[3] + 'ColorTemperature' ColorTemperature int32u + 'Contrast' Contrast int8s + 'DigitalZoom' DigitalZoom rational64u + 'ExposureComp' ExposureCompensation rational64s + 'ExposureMode' ExposureMode string + 'ExposureTime' ExposureTime rational64u + 'FirmwareVersion' FirmwareVersion string + 'Flash' Flash MIE Flash + 'FocusMode' FocusMode string + 'ISO' ISO int16u + 'ISOSetting' ISOSetting int16u + 'ImageNumber' ImageNumber int32u + 'ImageQuality' ImageQuality string + 'ImageStabilization' ImageStabilization int8u + 'Lens' Lens MIE Lens + 'Make' Make string + 'MeasuredEV' MeasuredEV rational64s + 'Model' Model string + 'Orientation' Orientation MIE Orient + 'OwnerName' OwnerName string + 'Saturation' Saturation int8s + 'SensorSize' SensorSize rational64u[2] + 'SerialNumber' SerialNumber string + 'Sharpness' Sharpness int8s + 'ShootingMode' ShootingMode string + +=head3 MIE Flash Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'ExposureComp' FlashExposureComp rational64s + 'Fired' FlashFired int8u + 'GuideNumber' FlashGuideNumber string + 'Make' FlashMake string + 'Mode' FlashMode string + 'Model' FlashModel string + 'SerialNumber' FlashSerialNumber string + 'Type' FlashType string + +=head3 MIE Lens Tags + +All recorded lens parameters (focal length, aperture, etc) include the +effects of the extender if present. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Extender' Extender MIE Extender + 'FNumber' FNumber rational64u + 'FocalLength' FocalLength rational64u + 'FocusDistance' FocusDistance rational64u + 'Make' LensMake string + 'MaxAperture' MaxAperture rational64u + 'MaxApertureAtMaxFocal' MaxApertureAtMaxFocal rational64u + 'MaxFocalLength' MaxFocalLength rational64u + 'MinAperture' MinAperture rational64u + 'MinFocalLength' MinFocalLength rational64u + 'Model' LensModel string + 'OpticalZoom' OpticalZoom rational64u + 'SerialNumber' LensSerialNumber string + +=head3 MIE Extender Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Magnification' ExtenderMagnification rational64s + 'Make' ExtenderMake string + 'Model' ExtenderModel string + 'SerialNumber' ExtenderSerialNumber string + +=head3 MIE Orient Tags + +These tags describe the camera orientation. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Azimuth' Azimuth rational64s + 'Declination' Declination rational64s + 'Elevation' Elevation rational64s + 'RightAscension' RightAscension rational64s + 'Rotation' Rotation rational64s + +=head3 MIE Doc Tags + +Information describing the main document, image or file. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Author' Author string + 'Comment' Comment string + 'Contributors' Contributors string+ + 'Copyright' Copyright string + 'CreateDate' CreateDate string + 'EMail' Email string + 'Keywords' Keywords string+ + 'ModifyDate' ModifyDate string + 'OriginalDate' DateTimeOriginal string + 'Phone' PhoneNumber string + 'References' References string+ + 'Software' Software string + 'Title' Title string + 'URL' URL string + +=head3 MIE Geo Tags + +Information related to geographic location. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Address' Address string + 'City' City string + 'Country' Country string + 'GPS' GPS MIE GPS + 'PostalCode' PostalCode string + 'State' State string + 'UTM' UTM MIE UTM + +=head3 MIE GPS Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Altitude' GPSAltitude rational64s + 'Bearing' GPSDestBearing rational64s + 'DateTime' GPSDateTime string + 'Datum' GPSMapDatum string + 'Differential' GPSDifferential int8u + 'Distance' GPSDestDistance rational64s + 'Heading' GPSTrack rational64s + 'Latitude' GPSLatitude rational64s[n] + 'Longitude' GPSLongitude rational64s[n] + 'MeasureMode' GPSMeasureMode int8u + 'Satellites' GPSSatellites string + 'Speed' GPSSpeed rational64s + +=head3 MIE UTM Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Datum' UTMMapDatum string + 'Easting' UTMEasting string + 'Northing' UTMNorthing string + 'Zone' UTMZone int8s + +=head3 MIE Image Tags + + Tag ID Tag Name Writable + ------ -------- -------- + '0Type' FullSizeImageType string + '1Name' FullSizeImageName string + 'BitDepth' BitDepth int16u + 'ColorSpace' ColorSpace string + 'Components' ComponentsConfiguration string + 'Compression' CompressionRatio rational32u + 'ImageSize' ImageSize int16u[n] + 'Resolution' Resolution rational64u[n] + 'data' FullSizeImage undef + +=head3 MIE MakerNotes Tags + +MIE maker notes are contained within separate groups for each manufacturer +to avoid name conflicts. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Canon' Canon MIE Canon + 'Casio' Casio MIE Unknown + 'FujiFilm' FujiFilm MIE Unknown + 'Kodak' Kodak MIE Unknown + 'KonicaMinolta' KonicaMinolta MIE Unknown + 'Nikon' Nikon MIE Unknown + 'Olympus' Olympus MIE Unknown + 'Panasonic' Panasonic MIE Unknown + 'Pentax' Pentax MIE Unknown + 'Ricoh' Ricoh MIE Unknown + 'Sigma' Sigma MIE Unknown + 'Sony' Sony MIE Unknown + +=head3 MIE Canon Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'VRD' CanonVRD CanonVRD + +=head3 MIE Unknown Tags + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 MIE Preview Tags + + Tag ID Tag Name Writable + ------ -------- -------- + '0Type' PreviewImageType string + '1Name' PreviewImageName string + 'ImageSize' PreviewImageSize int16u[n] + 'data' PreviewImage undef + +=head3 MIE Thumbnail Tags + + Tag ID Tag Name Writable + ------ -------- -------- + '0Type' ThumbnailImageType string + '1Name' ThumbnailImageName string + 'ImageSize' ThumbnailImageSize int16u[n] + 'data' ThumbnailImage undef + +=head3 MIE Video Tags + + Tag ID Tag Name Writable + ------ -------- -------- + '0Type' RelatedVideoFileType string + '1Name' RelatedVideoFileName string + 'Codec' Codec string + 'Duration' Duration rational64u~ + 'data' RelatedVideoFile undef + +=head2 GIF Tags + +This table lists information extracted from GIF images. See +L<http://www.w3.org/Graphics/GIF/spec-gif89a.txt> for the official GIF89a +specification. + + Tag Name Writable + -------- -------- + Comment yes + Duration no + Extensions GIF Extensions + FrameCount no + GIFVersion no + ScreenDescriptor GIF Screen + Text no + TransparentColor no + +=head3 GIF Extensions Tags + +Tags extracted from GIF89a application extensions. + + Tag ID Tag Name Writable + ------ -------- -------- + 'ICCRGBG1/012' ICC_Profile ICC_Profile + 'MIDICTRL/Jon' MIDIControl GIF MIDIControl + 'MIDISONG/Dm7' MIDISong no + 'NETSCAPE/2.0' Animation GIF Animation + 'XMP Data/XMP' XMP XMP + +=head3 GIF MIDIControl Tags + +Information extracted from the MIDI control block extension. + + Index1 Tag Name Writable + ------ -------- -------- + 0 MIDIControlVersion no + 1 SequenceNumber no + 2 MelodicPolyphony no + 3 PercussivePolyphony no + 4 ChannelUsage no + 6 DelayTime no + +=head3 GIF Animation Tags + +Information extracted from the "NETSCAPE2.0" animation extension. + + Index1 Tag Name Writable + ------ -------- -------- + 1 AnimationIterations no + +=head3 GIF Screen Tags + +Information extracted from the GIF logical screen descriptor. + + Index1 Tag Name Writable + ------ -------- -------- + 0 ImageWidth no + 2 ImageHeight no + 4.1 HasColorMap no + 4.2 ColorResolutionDepth no + 4.3 BitsPerPixel no + 5 BackgroundColor no + 6 PixelAspectRatio no + +=head2 BMP Tags + +There really isn't much meta information in a BMP file as such, just a bit +of image related information. + + Index1 Tag Name Writable + ------ -------- -------- + 0 BMPVersion no + 4 ImageWidth no + 8 ImageHeight no + 12 Planes no + 14 BitDepth no + 16 Compression no + 20 ImageLength no + 24 PixelsPerMeterX no + 28 PixelsPerMeterY no + 32 NumColors no + 36 NumImportantColors no + 40 RedMask no + 44 GreenMask no + 48 BlueMask no + 52 AlphaMask no + 56 ColorSpace no + 60 RedEndpoint no + 72 GreenEndpoint no + 84 BlueEndpoint no + 96 GammaRed no + 100 GammaGreen no + 104 GammaBlue no + 108 RenderingIntent no + 112 ProfileDataOffset no + 116 ProfileSize no + +=head3 BMP OS2 Tags + +Information extracted from OS/2-format BMP images. + + Index1 Tag Name Writable + ------ -------- -------- + 0 BMPVersion no + 4 ImageWidth no + 6 ImageHeight no + 8 Planes no + 10 BitDepth no + +=head3 BMP Extra Tags + +Extra information extracted from some BMP images. + + Tag Name Writable + -------- -------- + EmbeddedJPG no + EmbeddedPNG no + ICC_Profile ICC_Profile + LinkedProfileName no + +=head2 BPG Tags + +The information listed below is extracted from BPG (Better Portable +Graphics) images. See L<http://bellard.org/bpg/> for the specification. + + Index1 Tag Name Writable + ------ -------- -------- + 4 PixelFormat no + 4.1 Alpha no + 4.2 BitDepth no + 4.3 ColorSpace no + 4.4 Flags no + 6 ImageWidth no + 7 ImageHeight no + 8 ImageLength no + +=head3 BPG Extensions Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 EXIF EXIF + 0x0002 ICC_Profile ICC_Profile + 0x0003 XMP XMP + 0x0004 ThumbnailBPG no + 0x0005 AnimationControl? no + +=head2 PICT Tags + +The PICT format contains no true meta information, except for the possible +exception of the LongComment opcode. By default, only ImageWidth, +ImageHeight and X/YResolution are extracted from a PICT image. Tags in the +following table represent image opcodes. Extraction of these tags is +experimental, and is only enabled with the Verbose or Unknown options. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 Nop no + 0x0001 ClipRgn no + 0x0002 BkPat no + 0x0003 TxFont no + 0x0004 TxFace no + 0x0005 TxMode no + 0x0006 SpExtra no + 0x0007 PnSize no + 0x0008 PnMode no + 0x0009 PnPat no + 0x000a FillPat no + 0x000b OvSize no + 0x000c Origin no + 0x000d TxSize no + 0x000e FgColor no + 0x000f BkColor no + 0x0010 TxRatio no + 0x0011 VersionOp no + 0x0012 BkPixPat no + 0x0013 PnPixPat no + 0x0014 FillPixPat no + 0x0015 PnLocHFrac no + 0x0016 ChExtra no + 0x0017 Reserved no + 0x001a RGBFgCol no + 0x001b RGBBkCol no + 0x001c HiliteMode no + 0x001d HiliteColor no + 0x001e DefHilite no + 0x001f OpColor no + 0x0020 Line no + 0x0021 LineFrom no + 0x0022 ShortLine no + 0x0023 ShortLineFrom no + 0x0024 Reserved no + 0x0028 LongText no + 0x0029 DHText no + 0x002a DVText no + 0x002b DHDVText no + 0x002c FontName no + 0x002d LineJustify no + 0x002e GlyphState no + 0x002f Reserved no + 0x0030 FrameRect no + 0x0031 PaintRect no + 0x0032 EraseRect no + 0x0033 InvertRect no + 0x0034 FillRect no + 0x0035 Reserved no + 0x0038 FrameSameRect no + 0x0039 PaintSameRect no + 0x003a EraseSameRect no + 0x003b InvertSameRect no + 0x003c FillSameRect no + 0x003d Reserved no + 0x0040 FrameRRect no + 0x0041 PaintRRect no + 0x0042 EraseRRect no + 0x0043 InvertRRect no + 0x0044 FillRRect no + 0x0045 Reserved no + 0x0048 FrameSameRRect no + 0x0049 PaintSameRRect no + 0x004a EraseSameRRect no + 0x004b InvertSameRRect no + 0x004c FillSameRRect no + 0x004d Reserved no + 0x0050 FrameOval no + 0x0051 PaintOval no + 0x0052 EraseOval no + 0x0053 InvertOval no + 0x0054 FillOval no + 0x0055 Reserved no + 0x0058 FrameSameOval no + 0x0059 PaintSameOval no + 0x005a EraseSameOval no + 0x005b InvertSameOval no + 0x005c FillSameOval no + 0x005d Reserved no + 0x0060 FrameArc no + 0x0061 PaintArc no + 0x0062 EraseArc no + 0x0063 InvertArc no + 0x0064 FillArc no + 0x0065 Reserved no + 0x0068 FrameSameArc no + 0x0069 PaintSameArc no + 0x006a EraseSameArc no + 0x006b InvertSameArc no + 0x006c FillSameArc no + 0x006d Reserved no + 0x0070 FramePoly no + 0x0071 PaintPoly no + 0x0072 ErasePoly no + 0x0073 InvertPoly no + 0x0074 FillPoly no + 0x0075 Reserved no + 0x0078 FrameSamePoly no + 0x0079 PaintSamePoly no + 0x007a EraseSamePoly no + 0x007b InvertSamePoly no + 0x007c FillSamePoly no + 0x007d Reserved no + 0x0080 FrameRgn no + 0x0081 PaintRgn no + 0x0082 EraseRgn no + 0x0083 InvertRgn no + 0x0084 FillRgn no + 0x0085 Reserved no + 0x0088 FrameSameRgn no + 0x0089 PaintSameRgn no + 0x008a EraseSameRgn no + 0x008b InvertSameRgn no + 0x008c FillSameRgn no + 0x008d Reserved no + 0x0090 BitsRect no + 0x0091 BitsRgn no + 0x0092 Reserved no + 0x0098 PackBitsRect no + 0x0099 PackBitsRgn no + 0x009a DirectBitsRect no + 0x009b DirectBitsRgn no + 0x009c Reserved no + 0x009d Reserved no + 0x009e Reserved no + 0x009f Reserved no + 0x00a0 ShortComment no + 0x00a1 LongComment Photoshop + ICC_Profile + 0x00a2 Reserved no + 0x00b0 Reserved no + 0x00d0 Reserved no + 0x00ff OpEndPic no + 0x0100 Reserved no + 0x0200 Reserved no + 0x02ff Version no + 0x0300 Reserved no + 0x0bff Reserved no + 0x0c00 HeaderOp no + 0x0c01 Reserved no + 0x7f00 Reserved no + 0x8000 Reserved no + 0x8100 Reserved no + 0x8200 CompressedQuickTime no + 0x8201 UncompressedQuickTime no + 0xffff Reserved no + +=head2 PNG Tags + +Tags extracted from PNG images. See +L<http://www.libpng.org/pub/png/spec/1.2/> for the official PNG 1.2 +specification. + +According to the specification, a PNG file should end at the IEND chunk, +however ExifTool will preserve any data found after this when writing unless +it is specifically deleted with C<-Trailer:All=>. When reading, a minor +warning is issued if this trailer exists, and ExifTool will attempt to parse +this data as additional PNG chunks. + +Also according to the PNG specification, there is no restriction on the +location of text-type chunks (tEXt, zTXt and iTXt). However, certain +utilities (including some Apple and Adobe utilities) won't read the XMP iTXt +chunk if it comes after the IDAT chunk, and at least one utility won't read +other text chunks here. For this reason, when writing, ExifTool 11.63 and +later create new text chunks (including XMP) before IDAT, and move existing +text chunks to before IDAT. + +The PNG format contains CRC checksums that are validated when reading with +either the Verbose or Validate option. When writing, these checksums are +validated by default, but the FastScan option may be used to bypass this +check if speed is more of a concern. + + Tag ID Tag Name Writable + ------ -------- -------- + 'IHDR' ImageHeader PNG ImageHeader + 'PLTE' Palette no + 'acTL' AnimationControl PNG AnimationControl + 'bKGD' BackgroundColor no + 'cHRM' PrimaryChromaticities PNG PrimaryChromaticities + 'dSIG' DigitalSignature no + 'eXIf' eXIf EXIF + 'fRAc' FractalParameters no + 'gAMA' Gamma yes! + 'gIFg' GIFGraphicControlExtension no + 'gIFt' GIFPlainTextExtension no + 'gIFx' GIFApplicationExtension no + 'hIST' PaletteHistogram no + 'iCCP' ICC_Profile ICC_Profile + 'iCCP-name' ProfileName yes + 'iDOT' AppleDataOffsets no + 'iTXt' InternationalText PNG TextualData + 'oFFs' ImageOffset no + 'pCAL' PixelCalibration no + 'pHYs' PhysicalPixel PNG PhysicalPixel + 'sBIT' SignificantBits no + 'sCAL' SubjectScale PNG SubjectScale + 'sPLT' SuggestedPalette no + 'sRGB' SRGBRendering yes! + 'sTER' StereoImage PNG StereoImage + 'tEXt' TextualData PNG TextualData + 'tIME' ModifyDate yes + 'tRNS' Transparency no + 'tXMP' XMP XMP + 'vpAg' VirtualPage PNG VirtualPage + 'zTXt' CompressedText PNG TextualData + 'zxIf' zxIf EXIF + +=head3 PNG ImageHeader Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ImageWidth no + 4 ImageHeight no + 8 BitDepth no + 9 ColorType no + 10 Compression no + 11 Filter no + 12 Interlace no + +=head3 PNG AnimationControl Tags + +Tags found in the Animation Control chunk. See +L<https://wiki.mozilla.org/APNG_Specification> for details. + + Index4 Tag Name Writable + ------ -------- -------- + 0 AnimationFrames no + 1 AnimationPlays no + +=head3 PNG PrimaryChromaticities Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 WhitePointX no + 1 WhitePointY no + 2 RedX no + 3 RedY no + 4 GreenX no + 5 GreenY no + 6 BlueX no + 7 BlueY no + +=head3 PNG TextualData Tags + +The PNG TextualData format allows arbitrary tag names to be used. The tags +listed below are the only ones that can be written (unless new user-defined +tags are added via the configuration file), however ExifTool will extract +any other TextualData tags that are found. All TextualData tags (including +tags not listed below) are removed when deleting all PNG tags. + +These tags may be stored as tEXt, zTXt or iTXt chunks in the PNG image. By +default ExifTool writes new string-value tags as as uncompressed tEXt, or +compressed zTXt if the Compress (-z) option is used and Compress::Zlib is +available. Alternate language tags and values containing special characters +(unless the Latin character set is used) are written as iTXt, and compressed +if the Compress option is used and Compress::Zlib is available. Raw profile +information is always created as compressed zTXt if Compress::Zlib is +available, or tEXt otherwise. Standard XMP is written as uncompressed iTXt. +User-defined tags may set an 'iTXt' flag in the tag definition to be written +only as iTXt. + +Alternate languages are accessed by suffixing the tag name with a '-', +followed by an RFC 3066 language code (eg. "PNG:Comment-fr", or +"Title-en-US"). See L<http://www.ietf.org/rfc/rfc3066.txt> for the RFC 3066 +specification. + +Some of the tags below are not registered as part of the PNG specification, +but are included here because they are generated by other software such as +ImageMagick. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Artist' Artist string + 'Author' Author string + 'Collection' Collection string + 'Comment' Comment string + 'Copyright' Copyright string + 'Creation Time' CreationTime string + 'Description' Description string + 'Disclaimer' Disclaimer string + 'Document' Document string + 'Label' Label string + 'Make' Make string + 'Model' Model string + 'Raw profile type 8bim' Photoshop_Profile Photoshop + 'Raw profile type APP1' APP1_Profile EXIF + XMP + 'Raw profile type exif' EXIF_Profile EXIF + 'Raw profile type icc' ICC_Profile ICC_Profile + 'Raw profile type icm' ICC_Profile ICC_Profile + 'Raw profile type iptc' IPTC_Profile Photoshop + 'Raw profile type xmp' XMP_Profile XMP + 'Software' Software string + 'Source' Source string + 'TimeStamp' TimeStamp string + 'Title' Title string + 'URL' URL string + 'Warning' PNGWarning string + 'XML:com.adobe.xmp' XMP XMP + 'create-date' CreateDate string + 'modify-date' ModDate string + +=head3 PNG PhysicalPixel Tags + +These tags are found in the PNG pHYs chunk and belong to the PNG-pHYs family +1 group. They are all created together with default values if necessary +when any of these tags is written, and may only be deleted as a group. + + Index1 Tag Name Writable + ------ -------- -------- + 0 PixelsPerUnitX int32u + 4 PixelsPerUnitY int32u + 8 PixelUnits int8u + +=head3 PNG SubjectScale Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 SubjectUnits no + 1 SubjectPixelWidth no + 2 SubjectPixelHeight no + +=head3 PNG StereoImage Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 StereoMode no + +=head3 PNG VirtualPage Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 VirtualImageWidth no + 1 VirtualImageHeight no + 2 VirtualPageUnits no + +=head2 MNG Tags + +This table contains definitions for tags found in MNG and JNG images. MNG +is a superset of PNG and JNG, so a MNG image may contain any of these tags +as well as any PNG tags. Conversely, only some of these tags are valid for +JNG images. + + Tag ID Tag Name Writable + ------ -------- -------- + 'BACK' Background MNG Background + 'BASI' BasisObject MNG BasisObject + 'CLIP' ClipObjects MNG ClipObjects + 'CLON' CloneObject MNG CloneObject + 'DBYK' DropByKeyword no + 'DEFI' DefineObject MNG DefineObject + 'DHDR' DeltaPNGHeader MNG DeltaPNGHeader + 'DISC' DiscardObjects no + 'DROP' DropChunks no + 'FRAM' Frame no + 'JHDR' JNGHeader MNG JNGHeader + 'LOOP' Loop MNG Loop + 'MAGN' MagnifyObject MNG MagnifyObject + 'MHDR' MNGHeader MNG MNGHeader + 'MOVE' MoveObjects MNG MoveObjects + 'ORDR' OrderingRestrictions no + 'PAST' PasteImage MNG PasteImage + 'PPLT' PartialPalette no + 'PROM' PromoteParent MNG PromoteParent + 'SAVE' SaveObjects no + 'SEEK' SeekPoint no + 'SHOW' ShowObjects MNG ShowObjects + 'TERM' TerminationAction MNG TerminationAction + 'eXPi' ExportImage MNG ExportImage + 'fPRI' FramePriority MNG FramePriority + 'nEED' ResourcesNeeded no + 'pHYg' GlobalPixelSize PNG PhysicalPixel + +=head3 MNG Background Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 BackgroundColor no + 6 MandatoryBackground no + 7 BackgroundImageID no + 9 BackgroundTiling no + +=head3 MNG BasisObject Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ImageWidth no + 4 ImageHeight no + 8 BitDepth no + 9 ColorType no + 10 Compression no + 11 Filter no + 12 Interlace no + 13 RedSample no + 17 GreenSample no + 21 BlueSample no + 25 AlphaSample no + 26 Viewable no + +=head3 MNG ClipObjects Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 FirstObject no + 2 LastObject no + 4 DeltaType no + 5 ClipBoundary no + +=head3 MNG CloneObject Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 SourceID no + 2 CloneID no + 4 CloneType no + 5 DoNotShow no + 6 ConcreteFlag no + 7 LocalDeltaType no + 8 DeltaXY no + +=head3 MNG DefineObject Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ObjectID no + 2 DoNotShow no + 3 ConcreteFlag no + 4 XYLocation no + 12 ClippingBoundary no + +=head3 MNG DeltaPNGHeader Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ObjectID no + 2 ImageType no + 3 DeltaType no + 4 BlockSize no + 12 BlockLocation no + +=head3 MNG JNGHeader Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ImageWidth no + 4 ImageHeight no + 8 ColorType no + 9 BitDepth no + 10 Compression no + 11 Interlace no + 12 AlphaBitDepth no + 13 AlphaCompression no + 14 AlphaFilter no + 15 AlphaInterlace no + +=head3 MNG Loop Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 NestLevel no + 1 IterationCount no + 5 TerminationCondition no + 6 IterationMinMax no + 14 SignalNumber no + +=head3 MNG MagnifyObject Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 FirstObjectID no + 2 LastObjectID no + 4 XMethod no + 5 XMag no + 7 YMag no + 9 LeftMag no + 11 RightMag no + 13 TopMag no + 15 BottomMag no + 17 YMethod no + +=head3 MNG MNGHeader Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 ImageWidth no + 1 ImageHeight no + 2 TicksPerSecond no + 3 NominalLayerCount no + 4 NominalFrameCount no + 5 NominalPlayTime no + 6 SimplicityProfile no + +=head3 MNG MoveObjects Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 FirstObject no + 2 LastObject no + 4 DeltaType no + 5 DeltaXY no + +=head3 MNG PasteImage Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 DestinationID no + 2 TargetDeltaType no + 3 TargetXY no + 11 SourceID no + 13 CompositionMode no + 14 Orientation no + 15 OffsetOrigin no + 16 OffsetXY no + 24 BoundaryOrigin no + 25 PastClippingBoundary no + +=head3 MNG PromoteParent Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 NewColorType no + 1 NewBitDepth no + 2 FillMethod no + +=head3 MNG ShowObjects Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 FirstObject no + 2 LastObject no + 4 ShowMode no + +=head3 MNG TerminationAction Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 TerminationAction no + 1 IterationEndAction no + 2 Delay no + 6 IterationMax no + +=head3 MNG ExportImage Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 SnapshotID no + 2 SnapshotName no + +=head3 MNG FramePriority Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 DeltaType no + 2 Priority no + +=head2 FLIF Tags + +Information extracted from Free Lossless Image Format files. See +L<http://flif.info/> for more information. + + Tag ID Tag Name Writable + ------ -------- -------- + 0 ImageType no + 1 BitDepth no + 2 ImageWidth no + 3 ImageHeight no + 4 AnimationFrames no + 5 Encoding no + 'eXif' EXIF EXIF + 'eXmp' XMP XMP + 'iCCP' ICC_Profile ICC_Profile + +=head2 DjVu Tags + +Information is extracted from the following chunks in DjVu images. See +L<http://www.djvu.org/> for the DjVu specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'ANTa' ANTa DjVu Ant + 'ANTz' CompressedAnnotation DjVu Ant + 'FORM' FORM DjVu Form + 'INCL' IncludedFileID no + 'INFO' INFO DjVu Info + +=head3 DjVu Ant Tags + +Information extracted from annotation chunks. + + Tag ID Tag Name Writable + ------ -------- -------- + 'metadata' Metadata DjVu Meta + 'xmp' XMP XMP + +=head3 DjVu Meta Tags + +This table lists the standard DjVu metadata tags, but ExifTool will extract +any tags that exist even if they don't appear here. The DjVu v3 +documentation endorses tags borrowed from two standards: 1) BibTeX +bibliography system tags (all lowercase Tag ID's in the table below), and 2) +PDF DocInfo tags (capitalized Tag ID's). + + Tag ID Tag Name Writable + ------ -------- -------- + 'Author' Author no + 'CreationDate' CreateDate no + 'Creator' Creator no + 'Keywords' Keywords no + 'ModDate' ModifyDate no + 'Producer' Producer no + 'Subject' Subject no + 'Title' Title no + 'Trapped' Trapped no + 'address' Address no + 'annote' Annotation no + 'author' Author no + 'booktitle' BookTitle no + 'chapter' Chapter no + 'crossref' CrossRef no + 'edition' Edition no + 'eprint' EPrint no + 'howpublished' HowPublished no + 'institution' Institution no + 'journal' Journal no + 'key' Key no + 'month' Month no + 'note' Note no + 'number' Number no + 'organization' Organization no + 'pages' Pages no + 'publisher' Publisher no + 'school' School no + 'series' Series no + 'title' Title no + 'type' Type no + 'url' URL no + 'volume' Volume no + 'year' Year no + +=head3 DjVu Form Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 SubfileType no + +=head3 DjVu Info Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ImageWidth no + 2 ImageHeight no + 4 DjVuVersion no + 6 SpatialResolution no + 8 Gamma no + 9 Orientation no + +=head2 DPX Tags + +Tags extracted from DPX (Digital Picture Exchange) images. + + Index1 Tag Name Writable + ------ -------- -------- + 0 ByteOrder no + 8 HeaderVersion no + 16 DPXFileSize no + 20 DittoKey no + 36 ImageFileName no + 136 CreateDate no + 160 Creator no + 260 Project no + 460 Copyright no + 660 EncryptionKey no + 768 Orientation no + 770 ImageElements no + 772 ImageWidth no + 776 ImageHeight no + 780 DataSign no + 800 ComponentsConfiguration no + 801 TransferCharacteristic no + 802 ColorimetricSpecification no + 803 BitDepth no + 820 ImageDescription no + 892 Image2Description no + 964 Image3Description no + 1036 Image4Description no + 1108 Image5Description no + 1180 Image6Description no + 1252 Image7Description no + 1324 Image8Description no + 1432 SourceFileName no + 1532 SourceCreateDate no + 1556 InputDeviceName no + 1588 InputDeviceSerialNumber no + 1628 AspectRatio no + 1724 OriginalFrameRate no + 1728 ShutterAngle no + 1732 FrameID no + 1764 SlateInformation no + 1920 TimeCode no + 1940 FrameRate no + 1972 Reserved5? no + 2048 UserID no + +=head2 OpenEXR Tags + +Information extracted from EXR images. See L<http://www.openexr.com/> for +the official specification. + + Tag ID Tag Name Writable + ------ -------- -------- + '_lay' Layout no + '_ver' EXRVersion no + 'adoptedNeutral' AdoptedNeutral no + 'altitude' GPSAltitude no + 'aperture' Aperture no + 'capDate' DateTimeOriginal no + 'channels' Channels no + 'chromaticities' Chromaticities no + 'comments' Comments no + 'compression' Compression no + 'dataWindow' DataWindow no + 'displayWindow' DisplayWindow no + 'envmap' EnvironmentMap no + 'expTime' ExposureTime no + 'focus' FocusDistance no + 'framesPerSecond' FramesPerSecond no + 'isoSpeed' ISO no + 'keyCode' KeyCode no + 'latitude' GPSLatitude no + 'lineOrder' LineOrder no + 'longitude' GPSLongitude no + 'lookModTransform' LookModTransform no + 'multiView' MultiView no + 'owner' Owner no + 'pixelAspectRatio' PixelAspectRatio no + 'preview' Preview no + 'renderingTransform' RenderingTransform no + 'screenWindowCenter' ScreenWindowCenter no + 'screenWindowWidth' ScreenWindowWidth no + 'tiles' Tiles no + 'timeCode' TimeCode no + 'utcOffset' TimeZone no + 'whiteLuminance' WhiteLuminance no + 'worldToCamera' WorldToCamera no + 'worldToNDC' WorldToNDC no + 'wrapmodes' WrapModes no + 'xDensity' XResolution no + +=head2 ZISRAW Tags + +As well as the header information listed below, ExifTool also extracts the +top-level XML-based metadata from Zeiss Integrated Software RAW (ZISRAW) CZI +files. + + Index1 Tag Name Writable + ------ -------- -------- + 32 ZISRAWVersion no + 48 PrimaryFileGUID no + 64 FileGUID no + +=head2 MRC Tags + +Tags extracted from Medical Research Council (MRC) format imaging files. +See L<https://www.ccpem.ac.uk/mrc_format/mrc2014.php> for the specification. + + Index4 Tag Name Writable + ------ -------- -------- + 0 ImageWidth no + 1 ImageHeight no + 2 ImageDepth no + 3 ImageMode no + 4 StartPoint no + 7 GridSize no + 10 CellWidth no + 11 CellHeight no + 12 CellDepth no + 13 CellAlpha no + 14 CellBeta no + 15 CellGamma no + 16 ImageWidthAxis no + 17 ImageHeightAxis no + 18 ImageDepthAxis no + 19 DensityMin no + 20 DensityMax no + 21 DensityMean no + 22 SpaceGroupNumber no + 23 ExtendedHeaderSize no + 26 ExtendedHeaderType no + 27 MRCVersion no + 49 Origin no + 53 MachineStamp no + 54 RMSDeviation no + 55 NumberOfLabels no + 56 Label0 no + 76 Label1 no + 96 Label2 no + 116 Label3 no + 136 Label4 no + 156 Label5 no + 176 Label6 no + 196 Label7 no + 216 Label8 no + 236 Label9 no + +=head3 MRC FEI12 Tags + +Tags extracted from FEI1 and FEI2 extended headers. + + Index1 Tag Name Writable + ------ -------- -------- + 0 MetadataSize no + 4 MetadataVersion no + 8 Bitmask1 no + 12 TimeStamp no + 20 MicroscopeType no + 36 MicroscopeID no + 52 Application no + 68 AppVersion no + 84 HighTension no + 92 Dose no + 100 AlphaTilt no + 108 BetaTilt no + 116 XStage no + 124 YStage no + 132 ZStage no + 140 TiltAxisAngle no + 148 DualAxisRot no + 156 PixelSizeX no + 164 PixelSizeY no + 220 Defocus no + 228 STEMDefocus no + 236 AppliedDefocus no + 244 InstrumentMode no + 248 ProjectionMode no + 252 ObjectiveLens no + 268 HighMagnificationMode no + 284 ProbeMode no + 288 EFTEMOn no + 289 Magnification no + 297 Bitmask2 no + 301 CameraLength no + 309 SpotIndex no + 313 IlluminationArea no + 321 Intensity no + 329 ConvergenceAngle no + 337 IlluminationMode no + 353 WideConvergenceAngleRange no + 354 SlitInserted no + 355 SlitWidth no + 363 AccelVoltOffset no + 371 DriftTubeVolt no + 379 EnergyShift no + 387 ShiftOffsetX no + 395 ShiftOffsetY no + 403 ShiftX no + 411 ShiftY no + 419 IntegrationTime no + 427 BinningWidth no + 431 BinningHeight no + 435 CameraName no + 451 ReadoutAreaLeft no + 455 ReadoutAreaTop no + 459 ReadoutAreaRight no + 463 ReadoutAreaBottom no + 467 CetaNoiseReduct no + 468 CetaFramesSummed no + 472 DirectDetElectronCounting no + 473 DirectDetAlignFrames no + 490 Bitmask3 no + 518 PhasePlate no + 519 STEMDetectorName no + 535 Gain no + 543 Offset no + 571 DwellTime no + 579 FrameTime no + 587 ScanSizeLeft no + 591 ScanSizeTop no + 595 ScanSizeRight no + 599 ScanSizeBottom no + 603 FullScanFOV_X no + 611 FullScanFOV_Y no + 619 Element no + 635 EnergyIntervalLower no + 643 EnergyIntervalHigher no + 651 Method no + 655 IsDoseFraction no + 656 FractionNumber no + 660 StartFrame no + 664 EndFrame no + 668 InputStackFilename no + 748 Bitmask4 no + 752 AlphaTiltMin no + 760 AlphaTiltMax no + 768 ScanRotation no + 776 DiffractionPatternRotation no + 784 ImageRotation no + 792 ScanModeEnumeration no + 796 AcquisitionTimeStamp no + 804 DetectorCommercialName no + 820 StartTiltAngle no + 828 EndTiltAngle no + 836 TiltPerImage no + 844 TitlSpeed no + 852 BeamCenterX no + 856 BeamCenterY no + 860 CFEGFlashTimeStamp no + 868 PhasePlatePosition no + 872 ObjectiveAperture no + +=head2 LIF Tags + +Tags extracted from Leica Image Format (LIF) imaging files. As well as the +tags listed below, all available information is extracted from the +XML-format metadata in the LIF header. + + Tag Name Writable + -------- -------- + TimeStampList no + +=head2 MIFF Tags + +The MIFF (Magick Image File Format) format allows aribrary tag names to be +used. Only the standard tag names are listed below, however ExifTool will +decode any tags found in the image. + + Tag ID Tag Name Writable + ------ -------- -------- + 'background-color' BackgroundColor no + 'blue-primary' BluePrimary no + 'border-color' BorderColor no + 'class' Class no + 'colors' Colors no + 'colorspace' ColorSpace no + 'columns' ImageWidth no + 'compression' Compression no + 'delay' Delay no + 'depth' Depth no + 'dispose' Dispose no + 'gamma' Gamma no + 'green-primary' GreenPrimary no + 'id' ID no + 'iterations' Iterations no + 'label' Label no + 'matt-color' MattColor no + 'matte' Matte no + 'montage' Montage no + 'packets' Packets no + 'page' Page no + 'profile-APP1' APP1_Profile EXIF + XMP + 'profile-exif' EXIF_Profile EXIF + 'profile-icc' ICC_Profile ICC_Profile + 'profile-iptc' IPTC_Profile Photoshop + 'profile-xmp' XMP_Profile XMP + 'red-primary' RedPrimary no + 'rendering-intent' RenderingIntent no + 'resolution' Resolution no + 'rows' ImageHeight no + 'scene' Scene no + 'signature' Signature no + 'units' Units no + 'white-point' WhitePoint no + +=head2 PCX Tags + +Tags extracted from PC Paintbrush images. + + Index1 Tag Name Writable + ------ -------- -------- + 0 Manufacturer no + 1 Software no + 2 Encoding no + 3 BitsPerPixel no + 4 LeftMargin no + 6 TopMargin no + 8 ImageWidth no + 10 ImageHeight no + 12 XResolution no + 14 YResolution no + 65 ColorPlanes no + 66 BytesPerLine no + 68 ColorMode no + 70 ScreenWidth no + 72 ScreenHeight no + +=head2 PGF Tags + +The following table lists information extracted from the header of +Progressive Graphics File (PGF) images. As well, information is extracted +from the embedded PNG metadata image if it exists. See +L<http://www.libpgf.org/> for the PGF specification. + + Index1 Tag Name Writable + ------ -------- -------- + 3 PGFVersion no + 8 ImageWidth no + 12 ImageHeight no + 16 PyramidLevels no + 17 Quality no + 18 BitsPerPixel no + 19 ColorComponents no + 20 ColorMode no + 21 BackgroundColor no + +=head2 PSP Tags + +Tags extracted from Paint Shop Pro images (PSP, PSPIMAGE, PSPFRAME, +PSPSHAPE, PSPTUBE and TUB extensions). + + Tag ID Tag Name Writable + ------ -------- -------- + 'FileVersion' FileVersion no + 0x0000 ImageInfo PSP Image + PSP Image + 0x0001 CreatorInfo PSP Creator + 0x000a ExtendedInfo PSP Ext + +=head3 PSP Image Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ImageWidth no + 4 ImageHeight no + 8 ImageResolution no + 16 ResolutionUnit no + 17 Compression no + 19 BitsPerSample no + 21 Planes no + 23 NumColors no + +=head3 PSP Creator Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 Title no + 0x0001 CreateDate no + 0x0002 ModifyDate no + 0x0003 Artist no + 0x0004 Copyright no + 0x0005 Description no + 0x0006 CreatorAppID no + 0x0007 CreatorAppVersion no + +=head3 PSP Ext Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0003 EXIFInfo EXIF + +=head2 PhotoCD Tags + +Tags extracted from Kodak Photo CD Image Pac (PCD) files. + + Index1 Tag Name Writable + ------ -------- -------- + 7 SpecificationVersion no + 9 AuthoringSoftwareRelease no + 11 ImageMagnificationDescriptor no + 13 CreateDate no + 17 ModifyDate no + 21 ImageMedium no + 22 ProductType no + 42 ScannerVendorID no + 62 ScannerProductID no + 78 ScannerFirmwareVersion no + 82 ScannerFirmwareDate no + 90 ScannerSerialNumber no + 110 ScannerPixelSize no + 112 ImageWorkstationMake no + 132 CharacterSet no + 133 CharacterEscapeSequence? no + 165 PhotoFinisherName no + 228 SceneBalanceAlgorithmRevision no + 230 SceneBalanceAlgorithmCommand no + 325 SceneBalanceAlgorithmFilmID no + 331 CopyrightStatus no + 332 CopyrightFileName no + 1538 Orientation no + 1538.1 ImageWidth no + 1538.2 ImageHeight no + 1538.3 CompressionClass no + +=head2 Radiance Tags + +Information extracted from Radiance RGBE HDR images. Tag ID's are all +uppercase as stored in the file, but converted to lowercase by when +extracting to avoid conflicts with internal ExifTool variables. See +L<http://radsite.lbl.gov/radiance/refer/filefmts.pdf> and +L<http://www.graphics.cornell.edu/online/formats/rgbe/> for the +specification. + + Tag ID Tag Name Writable + ------ -------- -------- + '_command' Command no + '_comment' Comment no + '_orient' Orientation no + 'colorcorr' ColorCorrection no + 'exposure' Exposure no + 'format' Format no + 'gamma' Gamma no + 'pixaspect' PixelAspectRatio no + 'primaries' ColorPrimaries no + 'software' Software no + 'view' View no + +=head3 Other PFM Tags + +Tags extracted from Portable FloatMap images. See +L<http://www.pauldebevec.com/Research/HDR/PFM/> for the specification. + + Tag Name Writable + -------- -------- + ByteOrder no + ColorSpace no + ImageHeight no + ImageWidth no + +=head2 PDF Tags + +The tags listed in the PDF tables below are those which are used by ExifTool +to extract meta information, but they are only a small fraction of the total +number of available PDF tags. See +L<http://www.adobe.com/devnet/pdf/pdf_reference.html> for the official PDF +specification. + +ExifTool supports reading and writing PDF documents up to version 1.7 +extension level 3, including support for RC4, AES-128 and AES-256 +encryption. A Password option is provided to allow processing of +password-protected PDF files. + +ExifTool may be used to write native PDF and XMP metadata to PDF files. It +uses an incremental update technique that has the advantages of being both +fast and reversible. If ExifTool was used to modify a PDF file, the +original may be recovered by deleting the C<PDF-update> pseudo-group (with +C<-PDF-update:all=> on the command line). However, there are two main +disadvantages to this technique: + +1) A linearized PDF file is no longer linearized after the update, so it +must be subsequently re-linearized if this is required. + +2) All metadata edits are reversible. While this would normally be +considered an advantage, it is a potential security problem because old +information is never actually deleted from the file. (However, after +running ExifTool the old information may be removed permanently using the +"qpdf" utility with this command: "qpdf --linearize in.pdf out.pdf".) + + Tag ID Tag Name Writable + ------ -------- -------- + 'Encrypt' Encrypt PDF Encrypt + 'Info' Info PDF Info + 'Root' Root PDF Root + '_linearized' Linearized no + +=head3 PDF Encrypt Tags + +Tags extracted from the document Encrypt dictionary. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Filter' Encryption no + 'P' UserAccess no + +=head3 PDF Info Tags + +As well as the tags listed below, the PDF specification allows for +user-defined tags to exist in the Info dictionary. These tags, which should +have corresponding XMP-pdfx entries in the XMP of the PDF XML Metadata +object, are also extracted by ExifTool. + +B<Writable> specifies the value format, and may be C<string>, C<date>, +C<integer>, C<real>, C<boolean> or C<name> for PDF tags. + + Tag ID Tag Name Writable + ------ -------- -------- + 'AAPL:Keywords' AppleKeywords string+ + 'Author' Author string + 'CreationDate' CreateDate date + 'Creator' Creator string + 'Keywords' Keywords string+ + 'ModDate' ModifyDate date + 'Producer' Producer string + 'Subject' Subject string + 'Title' Title string + 'Trapped' Trapped string! + +=head3 PDF Root Tags + +This is the PDF document catalog. + + Tag ID Tag Name Writable + ------ -------- -------- + 'AcroForm' AcroForm PDF AcroForm + 'Lang' Language no + 'MarkInfo' MarkInfo PDF MarkInfo + 'Metadata' Metadata PDF Metadata + 'PageLayout' PageLayout no + 'PageMode' PageMode no + 'Pages' Pages PDF Pages + 'Perms' Perms PDF Perms + 'Version' PDFVersion no + +=head3 PDF AcroForm Tags + + Tag ID Tag Name Writable + ------ -------- -------- + '_has_xfa' HasXFA no + +=head3 PDF MarkInfo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Marked' TaggedPDF no + +=head3 PDF Metadata Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'XML_stream' XMP XMP + +=head3 PDF Pages Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Count' PageCount no + 'Kids' Kids PDF Kids + +=head3 PDF Kids Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Kids' Kids PDF Kids + 'Metadata' Metadata PDF Metadata + 'PieceInfo' PieceInfo PDF PieceInfo + 'Resources' Resources PDF Resources + +=head3 PDF PieceInfo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'AdobePhotoshop' AdobePhotoshop PDF AdobePhotoshop + 'Illustrator' Illustrator PDF Illustrator + +=head3 PDF AdobePhotoshop Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Private' Private PDF Private + +=head3 PDF Private Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'ImageResources' ImageResources PDF ImageResources + +=head3 PDF ImageResources Tags + + Tag ID Tag Name Writable + ------ -------- -------- + '_stream' _stream Photoshop + +=head3 PDF Illustrator Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Private' Private PDF AIPrivate + +=head3 PDF AIPrivate Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'AIMetaData' AIMetaData PDF AIMetaData + 'AIPDFPrivateData' AIPDFPrivateData PostScript + 'AIPrivateData' AIPrivateData PostScript + 'ContainerVersion' ContainerVersion no + 'CreatorVersion' CreatorVersion no + 'RoundTripVersion' RoundTripVersion no + +=head3 PDF AIMetaData Tags + + Tag ID Tag Name Writable + ------ -------- -------- + '_stream' _stream PostScript + +=head3 PDF Resources Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'ColorSpace' ColorSpace PDF ColorSpace + 'Properties' Properties PDF Properties + 'XObject' XObject PDF XObject + +=head3 PDF ColorSpace Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'CS0' CS0 PDF DefaultRGB + 'Cs1' Cs1 PDF DefaultRGB + 'DefaultCMYK' DefaultCMYK PDF DefaultRGB + 'DefaultRGB' DefaultRGB PDF DefaultRGB + +=head3 PDF DefaultRGB Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'ICCBased' ICCBased PDF ICCBased + +=head3 PDF ICCBased Tags + + Tag ID Tag Name Writable + ------ -------- -------- + '_stream' _stream ICC_Profile + +=head3 PDF Properties Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'MC' MC PDF MC + +=head3 PDF MC Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Metadata' Metadata PDF Metadata + +=head3 PDF XObject Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Im' Im PDF Im + +=head3 PDF Im Tags + +Information extracted from embedded images with the ExtractEmbedded option. +The EmbeddedImage and its metadata are extracted only for JPEG and Jpeg2000 +image formats. + + Tag ID Tag Name Writable + ------ -------- -------- + 'ColorSpace' EmbeddedImageColorSpace no+ + 'Filter' EmbeddedImageFilter no+ + 'Height' EmbeddedImageHeight no + 'Image_stream' EmbeddedImage no + 'Width' EmbeddedImageWidth no + +=head3 PDF Perms Tags + +Additional document permissions imposed by digital signatures. + + Tag ID Tag Name Writable + ------ -------- -------- + 'DocMDP' DocMDP PDF Signature + 'FieldMDP' FieldMDP PDF Signature + 'UR3' UR3 PDF Signature + +=head3 PDF Signature Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'ContactInfo' SignerContactInfo no + 'Location' SigningLocation no + 'M' SigningDate no + 'Name' SigningAuthority no + 'Prop_AuthTime' AuthenticationTime no + 'Prop_AuthType' AuthenticationType no + 'Reason' SigningReason no + 'Reference' Reference PDF Reference + +=head3 PDF Reference Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'TransformParams' TransformParams PDF TransformParams + +=head3 PDF TransformParams Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Action' FieldPermissions no + 'Annots' AnnotationUsageRights no+ + 'Document' DocumentUsageRights no+ + 'EF' EmbeddedFileUsageRights no+ + 'Fields' FormFields no+ + 'Form' FormUsageRights no+ + 'FormEX' FormExtraUsageRights no+ + 'Msg' UsageRightsMessage no + 'P' ModificationPermissions no + 'Signature' SignatureUsageRights no+ + +=head2 PostScript Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'AI12_BuildNumber' AIBuildNumber no + 'AI3_ColorUsage' AIColorUsage no + 'AI5_FileFormat' AIFileFormat no + 'AI5_NumLayers' AINumLayers no + 'AI5_RulerUnits' AIRulerUnits no + 'AI5_TargetResolution' AITargetResolution no + 'AI8_CreatorVersion' AICreatorVersion no + 'AI9_ColorModel' AIColorModel no + 'Author' Author string + 'BeginDocument' EmbeddedFile PostScript + 'BeginICCProfile' ICC_Profile ICC_Profile + 'BeginPhotoshop' PhotoshopData Photoshop + 'BoundingBox' BoundingBox no + 'Copyright' Copyright string + 'CreationDate' CreateDate string + 'Creator' Creator string + 'EmbeddedFileName' EmbeddedFileName no + 'For' For string + 'ImageData' ImageData no + 'Keywords' Keywords string + 'ModDate' ModifyDate string + 'Pages' Pages no + 'Routing' Routing string + 'Subject' Subject string + 'TIFFPreview' TIFFPreview no + 'Title' Title string + 'Version' Version string + 'begin_xml_packet' XMP XMP + +=head2 ID3 Tags + +ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, WAV, AIFF, +OGG, FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple +languages (eg. Comment and Lyrics) are extracted by specifying the tag name, +followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg. +"Comment-spa"). See L<https://id3.org/> for the official ID3 specification +and L<http://www.loc.gov/standards/iso639-2/php/code_list.php> for a list of +ISO 639-2 language codes. + + Tag Name Writable + -------- -------- + ID3v1 ID3 v1 + ID3v1_Enh ID3 v1_Enh + ID3v2_2 ID3 v2_2 + ID3v2_3 ID3 v2_3 + ID3v2_4 ID3 v2_4 + +=head3 ID3 v1 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 3 Title no + 33 Artist no + 63 Album no + 93 Year no + 97 Comment no + 125 Track no + 127 Genre no + +=head3 ID3 v1_Enh Tags + +ID3 version 1 "Enhanced TAG" information (not part of the official spec). + + Index1 Tag Name Writable + ------ -------- -------- + 4 Title2 no + 64 Artist2 no + 124 Album2 no + 184 Speed no + 185 Genre no + 215 StartTime no + 221 EndTime no + +=head3 ID3 v2_2 Tags + +ExifTool extracts mainly text-based tags from ID3v2 information. The tags +in the tables below are those extracted by ExifTool, and don't represent a +complete list of available ID3v2 tags. + +ID3 version 2.2 tags. (These are the tags written by iTunes 5.0.) + + Tag ID Tag Name Writable + ------ -------- -------- + 'CNT' PlayCounter no + 'COM' Comment no + 'IPL' InvolvedPeople no + 'ITU' iTunesU? no + 'PCS' Podcast? no + 'PIC' Picture no + 'PIC-1' PictureFormat no + 'PIC-2' PictureType no + 'PIC-3' PictureDescription no + 'POP' Popularimeter no + 'RVA' RelativeVolumeAdjustment no + 'SLT' SynLyrics ID3 SynLyrics + 'TAL' Album no + 'TBP' BeatsPerMinute no + 'TCM' Composer no + 'TCO' Genre no + 'TCP' Compilation no + 'TCR' Copyright no + 'TDA' Date no + 'TDY' PlaylistDelay no + 'TEN' EncodedBy no + 'TFT' FileType no + 'TIM' Time no + 'TKE' InitialKey no + 'TLA' Language no + 'TLE' Length no + 'TMT' Media no + 'TOA' OriginalArtist no + 'TOF' OriginalFileName no + 'TOL' OriginalLyricist no + 'TOR' OriginalReleaseYear no + 'TOT' OriginalAlbum no + 'TP1' Artist no + 'TP2' Band no + 'TP3' Conductor no + 'TP4' InterpretedBy no + 'TPA' PartOfSet no + 'TPB' Publisher no + 'TRC' ISRC no + 'TRD' RecordingDates no + 'TRK' Track no + 'TS2' AlbumArtistSortOrder no + 'TSA' AlbumSortOrder no + 'TSC' ComposerSortOrder no + 'TSI' Size no + 'TSP' PerformerSortOrder no + 'TSS' EncoderSettings no + 'TST' TitleSortOrder no + 'TT1' Grouping no + 'TT2' Title no + 'TT3' Subtitle no + 'TXT' Lyricist no + 'TXX' UserDefinedText no + 'TYE' Year no + 'ULT' Lyrics no + 'WAF' FileURL no + 'WAR' ArtistURL no + 'WAS' SourceURL no + 'WCM' CommercialURL no + 'WCP' CopyrightURL no + 'WPB' PublisherURL no + 'WXX' UserDefinedURL no + +=head3 ID3 SynLyrics Tags + +The following tags are extracted from synchronized lyrics/text frames. + + Tag Name Writable + -------- -------- + SynchronizedLyricsDescription no + SynchronizedLyricsText no+ + SynchronizedLyricsType no + +=head3 ID3 v2_3 Tags + +ID3 version 2.3 tags. Includes some non-standard tags written by other +software. + + Tag ID Tag Name Writable + ------ -------- -------- + 'APIC' Picture no + 'APIC-1' PictureMIMEType no + 'APIC-2' PictureType no + 'APIC-3' PictureDescription no + 'COMM' Comment no + 'GRP1' Grouping no + 'IPLS' InvolvedPeople no + 'ITNU' iTunesU? no + 'MCDI' MusicCDIdentifier no + 'MVIN' MovementNumber no + 'MVNM' MovementName no + 'OWNE' Ownership no + 'PCNT' PlayCounter no + 'PCST' Podcast? no + 'POPM' Popularimeter no + 'PRIV' Private ID3 Private + 'SYLT' SynLyrics ID3 SynLyrics + 'TALB' Album no + 'TBPM' BeatsPerMinute no + 'TCAT' PodcastCategory no + 'TCMP' Compilation no + 'TCOM' Composer no + 'TCON' Genre no + 'TCOP' Copyright no + 'TDAT' Date no + 'TDES' PodcastDescription no + 'TDLY' PlaylistDelay no + 'TENC' EncodedBy no + 'TEXT' Lyricist no + 'TFLT' FileType no + 'TGID' PodcastID no + 'TIME' Time no + 'TIT1' Grouping no + 'TIT2' Title no + 'TIT3' Subtitle no + 'TKEY' InitialKey no + 'TKWD' PodcastKeywords no + 'TLAN' Language no + 'TLEN' Length no + 'TMED' Media no + 'TOAL' OriginalAlbum no + 'TOFN' OriginalFileName no + 'TOLY' OriginalLyricist no + 'TOPE' OriginalArtist no + 'TORY' OriginalReleaseYear no + 'TOWN' FileOwner no + 'TPE1' Artist no + 'TPE2' Band no + 'TPE3' Conductor no + 'TPE4' InterpretedBy no + 'TPOS' PartOfSet no + 'TPUB' Publisher no + 'TRCK' Track no + 'TRDA' RecordingDates no + 'TRSN' InternetRadioStationName no + 'TRSO' InternetRadioStationOwner no + 'TSIZ' Size no + 'TSO2' AlbumArtistSortOrder no + 'TSOC' ComposerSortOrder no + 'TSRC' ISRC no + 'TSSE' EncoderSettings no + 'TXXX' UserDefinedText no + 'TYER' Year no + 'USER' TermsOfUse no + 'USLT' Lyrics no + 'WCOM' CommercialURL no + 'WCOP' CopyrightURL no + 'WFED' PodcastURL no + 'WOAF' FileURL no + 'WOAR' ArtistURL no + 'WOAS' SourceURL no + 'WORS' InternetRadioStationURL no + 'WPAY' PaymentURL no + 'WPUB' PublisherURL no + 'WXXX' UserDefinedURL no + 'XDOR' OriginalReleaseTime no + 'XOLY' OlympusDSS Olympus DSS + 'XSOA' AlbumSortOrder no + 'XSOP' PerformerSortOrder no + 'XSOT' TitleSortOrder no + +=head3 ID3 Private Tags + +ID3 private (PRIV) tags. ExifTool will decode any private tags found, even +if they do not appear in this table. + + Tag Name Writable + -------- -------- + AverageLevel no + PeakValue no + WM_CollectionGroupID no + WM_CollectionID no + WM_ContentID no + WM_MediaClassPrimaryID no + WM_MediaClassSecondaryID no + WM_Provider no + XMP XMP + +=head3 ID3 v2_4 Tags + +ID3 version 2.4 tags. Includes some non-standard tags written by other +software. + + Tag ID Tag Name Writable + ------ -------- -------- + 'APIC' Picture no + 'APIC-1' PictureMIMEType no + 'APIC-2' PictureType no + 'APIC-3' PictureDescription no + 'COMM' Comment no + 'GRP1' Grouping no + 'ITNU' iTunesU? no + 'MCDI' MusicCDIdentifier no + 'MVIN' MovementNumber no + 'MVNM' MovementName no + 'OWNE' Ownership no + 'PCNT' PlayCounter no + 'PCST' Podcast? no + 'POPM' Popularimeter no + 'PRIV' Private ID3 Private + 'RVA2' RelativeVolumeAdjustment no + 'SYLT' SynLyrics ID3 SynLyrics + 'TALB' Album no + 'TBPM' BeatsPerMinute no + 'TCAT' PodcastCategory no + 'TCMP' Compilation no + 'TCOM' Composer no + 'TCON' Genre no + 'TCOP' Copyright no + 'TDEN' EncodingTime no + 'TDES' PodcastDescription no + 'TDLY' PlaylistDelay no + 'TDOR' OriginalReleaseTime no + 'TDRC' RecordingTime no + 'TDRL' ReleaseTime no + 'TDTG' TaggingTime no + 'TENC' EncodedBy no + 'TEXT' Lyricist no + 'TFLT' FileType no + 'TGID' PodcastID no + 'TIPL' InvolvedPeople no + 'TIT1' Grouping no + 'TIT2' Title no + 'TIT3' Subtitle no + 'TKEY' InitialKey no + 'TKWD' PodcastKeywords no + 'TLAN' Language no + 'TLEN' Length no + 'TMCL' MusicianCredits no + 'TMED' Media no + 'TMOO' Mood no + 'TOAL' OriginalAlbum no + 'TOFN' OriginalFileName no + 'TOLY' OriginalLyricist no + 'TOPE' OriginalArtist no + 'TOWN' FileOwner no + 'TPE1' Artist no + 'TPE2' Band no + 'TPE3' Conductor no + 'TPE4' InterpretedBy no + 'TPOS' PartOfSet no + 'TPRO' ProducedNotice no + 'TPUB' Publisher no + 'TRCK' Track no + 'TRSN' InternetRadioStationName no + 'TRSO' InternetRadioStationOwner no + 'TSO2' AlbumArtistSortOrder no + 'TSOA' AlbumSortOrder no + 'TSOC' ComposerSortOrder no + 'TSOP' PerformerSortOrder no + 'TSOT' TitleSortOrder no + 'TSRC' ISRC no + 'TSSE' EncoderSettings no + 'TSST' SetSubtitle no + 'TXXX' UserDefinedText no + 'USER' TermsOfUse no + 'USLT' Lyrics no + 'WCOM' CommercialURL no + 'WCOP' CopyrightURL no + 'WFED' PodcastURL no + 'WOAF' FileURL no + 'WOAR' ArtistURL no + 'WOAS' SourceURL no + 'WORS' InternetRadioStationURL no + 'WPAY' PaymentURL no + 'WPUB' PublisherURL no + 'WXXX' UserDefinedURL no + 'XDOR' OriginalReleaseTime no + 'XOLY' OlympusDSS Olympus DSS + 'XSOA' AlbumSortOrder no + 'XSOP' PerformerSortOrder no + 'XSOT' TitleSortOrder no + +=head3 ID3 Lyrics3 Tags + +ExifTool extracts Lyrics3 version 1.00 and 2.00 tags from any file that +supports ID3. See L<https://id3.org/Lyrics3> for the specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'AUT' Author no + 'CRC' CRC no + 'EAL' ExtendedAlbumName no + 'EAR' ExtendedArtistName no + 'ETT' ExtendedTrackTitle no + 'IMG' AssociatedImageFile no + 'IND' Indications no + 'INF' AdditionalInfo no + 'LYR' Lyrics no + +=head2 ITC Tags + +This information is found in iTunes Cover Flow data files. + + Tag ID Tag Name Writable + ------ -------- -------- + 'data' ImageData no + 'itch' Itch ITC Header + 'item' Item ITC Item + +=head3 ITC Header Tags + + Index1 Tag Name Writable + ------ -------- -------- + 16 DataType no + +=head3 ITC Item Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 LibraryID no + 2 TrackID no + 4 DataLocation no + 5 ImageType no + 7 ImageWidth no + 8 ImageHeight no + +=head2 FLAC Tags + +Free Lossless Audio Codec (FLAC) meta information. ExifTool also extracts +ID3 information from these files. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 StreamInfo FLAC StreamInfo + 0x0001 Padding? no + 0x0002 Application? no + 0x0003 SeekTable? no + 0x0004 VorbisComment Vorbis Comments + 0x0005 CueSheet? no + 0x0006 Picture FLAC Picture + +=head3 FLAC StreamInfo Tags + +FLAC is big-endian, so bit 0 is the high-order bit in this table. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Bit000-015' BlockSizeMin no + 'Bit016-031' BlockSizeMax no + 'Bit032-055' FrameSizeMin no + 'Bit056-079' FrameSizeMax no + 'Bit080-099' SampleRate no + 'Bit100-102' Channels no + 'Bit103-107' BitsPerSample no + 'Bit108-143' TotalSamples no + 'Bit144-271' MD5Signature no + +=head3 FLAC Picture Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 PictureType no + 1 PictureMIMEType no + 2 PictureDescription no + 3 PictureWidth no + 4 PictureHeight no + 5 PictureBitsPerPixel no + 6 PictureIndexedColors no + 7 PictureLength no + 8 Picture no + +=head2 Ogg Tags + +ExifTool extracts the following types of information from Ogg files. See +L<http://www.xiph.org/vorbis/doc/> for the Ogg specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'FLAC' FLAC FLAC + 'ID3' ID3 ID3 + 'Opus' Opus Opus + 'theora' Theora Theora + 'vorbis' Vorbis Vorbis + +=head2 Vorbis Tags + +Information extracted from Ogg Vorbis files. See +L<http://www.xiph.org/vorbis/doc/> for the Vorbis specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 Identification Vorbis Identification + 0x0003 Comments Vorbis Comments + +=head3 Vorbis Comments Tags + +The tags below are only some common tags found in the Vorbis comments of Ogg +Vorbis and Ogg FLAC audio files, however ExifTool will extract values from +any tag found, even if not listed here. + + Tag ID Tag Name Writable + ------ -------- -------- + 'ACTOR' Actor no + 'ALBUM' Album no + 'ARTIST' Artist no+ + 'COMMENT' Comment no + 'COMPOSER' Composer no + 'CONTACT' Contact no+ + 'COPYRIGHT' Copyright no + 'COVERART' CoverArt no + 'COVERARTMIME' CoverArtMIMEType no + 'DATE' Date no + 'DESCRIPTION' Description no + 'DIRECTOR' Director no + 'ENCODED_BY' EncodedBy no + 'ENCODED_USING' EncodedUsing no + 'ENCODER' Encoder no + 'ENCODER_OPTIONS' EncoderOptions no + 'GENRE' Genre no + 'ISRC' ISRCNumber no + 'LICENSE' License no + 'LOCATION' Location no + 'METADATA_BLOCK_PICTURE' Picture FLAC Picture + 'ORGANIZATION' Organization no + 'PERFORMER' Performer no+ + 'PRODUCER' Producer no + 'REPLAYGAIN_ALBUM_GAIN' ReplayGainAlbumGain no + 'REPLAYGAIN_ALBUM_PEAK' ReplayGainAlbumPeak no + 'REPLAYGAIN_TRACK_GAIN' ReplayGainTrackGain no + 'REPLAYGAIN_TRACK_PEAK' ReplayGainTrackPeak no + 'TITLE' Title no + 'TRACKNUMBER' TrackNumber no + 'VERSION' Version no + 'vendor' Vendor no + +=head3 Vorbis Identification Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 VorbisVersion no + 4 AudioChannels no + 5 SampleRate no + 9 MaximumBitrate no + 13 NominalBitrate no + 17 MinimumBitrate no + +=head2 Opus Tags + +Information extracted from Ogg Opus files. See +L<https://www.opus-codec.org/docs/> for the specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'OpusHead' Header Opus Header + 'OpusTags' Comments Vorbis Comments + +=head3 Opus Header Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 OpusVersion no + 1 AudioChannels no + 4 SampleRate no + 8 OutputGain no + +=head2 Theora Tags + +Information extracted from Ogg Theora video files. See +L<http://www.theora.org/doc/Theora.pdf> for the Theora specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0080 Identification Theora Identification + 0x0081 Comments Vorbis Comments + +=head3 Theora Identification Tags + +Tags extracted from the Theora identification header. + + Index1 Tag Name Writable + ------ -------- -------- + 0 TheoraVersion no + 7 ImageWidth no + 10 ImageHeight no + 13 XOffset no + 14 YOffset no + 15 FrameRate no + 23 PixelAspectRatio no + 29 ColorSpace no + 30 NominalVideoBitrate no + 33 Quality no + 34 PixelFormat no + +=head2 APE Tags + +Tags found in Monkey's Audio (APE) information. Only a few common tags are +listed below, but ExifTool will extract any tag found. ExifTool supports +APEv1 and APEv2 tags, as well as ID3 information in APE files, and will also +read APE metadata from MP3 and MPC files. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Album' Album no + 'Artist' Artist no + 'DURATION' Duration no + 'Genre' Genre no + 'Title' Title no + 'Tool Name' ToolName no + 'Tool Version' ToolVersion no + 'Track' Track no + 'Year' Year no + +=head3 APE NewHeader Tags + +APE MAC audio header for version 3.98 or later. + + Index2 Tag Name Writable + ------ -------- -------- + 0 CompressionLevel no + 2 BlocksPerFrame no + 4 FinalFrameBlocks no + 6 TotalFrames no + 8 BitsPerSample no + 9 Channels no + 10 SampleRate no + +=head3 APE OldHeader Tags + +APE MAC audio header for version 3.97 or earlier. + + Index2 Tag Name Writable + ------ -------- -------- + 0 APEVersion no + 1 CompressionLevel no + 3 Channels no + 4 SampleRate no + 10 TotalFrames no + 12 FinalFrameBlocks no + +=head2 Audible Tags + +ExifTool will extract any information found in the metadata dictionary of +Audible .AA files, even if not listed in the table below. + + Tag ID Tag Name Writable + ------ -------- -------- + '_chapter_count' ChapterCount no + '_cover_art' CoverArt no + 'author' Author no + 'copyright' Copyright no + 'pub_date_start' PublishDateStart no + 'pubdate' PublishDate no + +=head3 Audible tags Tags + +Information found in "tags" atom of Audible M4B audio books. + + Tag ID Tag Name Writable + ------ -------- -------- + 'cvrx' Audible_cvrx Audible cvrx + 'meta' Audible_meta Audible meta + 'tseg' Audible_tseg Audible tseg + +=head3 Audible cvrx Tags + +Audible cover art information in M4B audio books. + + Tag Name Writable + -------- -------- + CoverArt no + CoverArtType no + +=head3 Audible meta Tags + +Information found in Audible M4B "meta" atom. + + Tag ID Tag Name Writable + ------ -------- -------- + 'ALBUMARTIST' AlbumArtist no + 'Album' Album no + 'Artist' Artist no + 'Comment' Comment no + 'Genre' Genre no + 'SUBTITLE' Subtitle no + 'TOOL' CreatorTool no + 'Title' Title no + 'Year' Year no + 'itunesmediatype' iTunesMediaType no + 'track' ChapterName no + +=head3 Audible tseg Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'meta' Audible_meta2 Audible meta + 'tshd' ChapterNumber no + +=head2 MPC Tags + +Tags used in Musepack (MPC) audio files. ExifTool also extracts ID3 and APE +information from these files. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Bit032-063' TotalFrames no + 'Bit080-081' SampleRate no + 'Bit084-087' Quality no + 'Bit088-093' MaxBand no + 'Bit096-111' ReplayGainTrackPeak no + 'Bit112-127' ReplayGainTrackGain no + 'Bit128-143' ReplayGainAlbumPeak no + 'Bit144-159' ReplayGainAlbumGain no + 'Bit179' FastSeek no + 'Bit191' Gapless no + 'Bit216-223' EncoderVersion no + +=head2 MPEG Tags + +The MPEG format doesn't specify any file-level meta information. In lieu of +this, information is extracted from the first audio and video frame headers +in the file. + +=head3 MPEG Audio Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Bit11-12' MPEGAudioVersion no + 'Bit13-14' AudioLayer no + 'Bit16-19' AudioBitrate no + 'Bit20-21' SampleRate no + 'Bit24-25' ChannelMode no + 'Bit26' MSStereo no + 'Bit26-27' ModeExtension no + 'Bit27' IntensityStereo no + 'Bit28' CopyrightFlag no + 'Bit29' OriginalMedia no + 'Bit30-31' Emphasis no + +=head3 MPEG Video Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'Bit00-11' ImageWidth no + 'Bit12-23' ImageHeight no + 'Bit24-27' AspectRatio no + 'Bit28-31' FrameRate no + 'Bit32-49' VideoBitrate no + +=head3 MPEG Xing Tags + +These tags are extracted from the Xing/Info frame. + + Tag Name Writable + -------- -------- + Encoder no + LameHeader MPEG Lame + LameQuality no + LameVBRQuality no + VBRBytes no + VBRFrames no + VBRScale no + +=head3 MPEG Lame Tags + +Tags extracted from Lame 3.90 or later header. + + Index1 Tag Name Writable + ------ -------- -------- + 9 LameMethod no + 10 LameLowPassFilter no + 20 LameBitrate no + 24 LameStereoMode no + +=head2 M2TS Tags + +The MPEG-2 transport stream is used as a container for many different +audio/video formats (including AVCHD). This table lists information +extracted from M2TS files. + + Tag Name Writable + -------- -------- + AudioStreamType no + Duration no + VideoStreamType no + _AC3 M2TS AC3 + _H264 H264 + +=head3 M2TS AC3 Tags + +Tags extracted from AC-3 audio streams. + + Tag Name Writable + -------- -------- + AudioBitrate no + AudioChannels no + AudioSampleRate no + SurroundMode no + +=head2 H264 Tags + +Tags extracted from H.264 video streams. The metadata for AVCHD videos is +stored in this stream. + + Tag Name Writable + -------- -------- + ImageHeight no + ImageWidth no + MDPM H264 MDPM + +=head3 H264 MDPM Tags + +The following tags are decoded from the Modified Digital Video Pack Metadata +(MDPM) of the unregistered user data with UUID +17ee8c60f84d11d98cd60800200c9a66 in the H.264 Supplemental Enhancement +Information (SEI). I<[Yes, this description is confusing, but nothing +compared to the challenge of actually decoding the data!]> This information +may exist at regular intervals through the entire video, but only the first +occurrence is extracted unless the ExtractEmbedded (-ee) option is used (in +which case subsequent occurrences are extracted as sub-documents). + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0013 TimeCode no + 0x0018 DateTimeOriginal no + 0x0070 Camera1 H264 Camera1 + 0x0071 Camera2 H264 Camera2 + 0x007f Shutter H264 Shutter + 0x00a0 ExposureTime no + 0x00a1 FNumber no + 0x00a2 ExposureProgram no + 0x00a3 BrightnessValue no + 0x00a4 ExposureCompensation no + 0x00a5 MaxApertureValue no + 0x00a6 Flash no + 0x00a7 CustomRendered no + 0x00a8 WhiteBalance no + 0x00a9 FocalLengthIn35mmFormat no + 0x00aa SceneCaptureType no + 0x00b0 GPSVersionID no + 0x00b1 GPSLatitudeRef no + 0x00b2 GPSLatitude no + 0x00b5 GPSLongitudeRef no + 0x00b6 GPSLongitude no + 0x00b9 GPSAltitudeRef no + 0x00ba GPSAltitude no + 0x00bb GPSTimeStamp no + 0x00be GPSStatus no + 0x00bf GPSMeasureMode no + 0x00c0 GPSDOP no + 0x00c1 GPSSpeedRef no + 0x00c2 GPSSpeed no + 0x00c3 GPSTrackRef no + 0x00c4 GPSTrack no + 0x00c5 GPSImgDirectionRef no + 0x00c6 GPSImgDirection no + 0x00c7 GPSMapDatum no + 0x00ca GPSDateStamp no + 0x00e0 MakeModel H264 MakeModel + 0x00e1 RecInfo H264 RecInfo + 0x00e4 Model no + 0x00ee FrameInfo H264 FrameInfo + +=head3 H264 Camera1 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 ApertureSetting no + 1 Gain no + 1.1 ExposureProgram no + 2.1 WhiteBalance no + 3 Focus no + +=head3 H264 Camera2 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1 ImageStabilization no + +=head3 H264 Shutter Tags + + Index2 Tag Name Writable + ------ -------- -------- + 1.1 ExposureTime no + +=head3 H264 MakeModel Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 Make no + +=head3 H264 RecInfo Tags + +Recording information stored by some Canon video cameras. + + Index1 Tag Name Writable + ------ -------- -------- + 0 RecordingMode no + +=head3 H264 FrameInfo Tags + +Frame rate information stored by some Canon video cameras. + + Index1 Tag Name Writable + ------ -------- -------- + 0 CaptureFrameRate no + 1 VideoFrameRate no + +=head2 QuickTime Tags + +The QuickTime format is used for many different types of audio, video and +image files (most notably, MOV/MP4 videos and HEIC/CR3 images). ExifTool +extracts standard meta information and a variety of audio, video and image +parameters, as well as proprietary information written by many camera +models. Tags with a question mark after their name are not extracted unless +the Unknown option is set. + +When writing, ExifTool creates both QuickTime and XMP tags by default, but +the group may be specified to write one or the other separately. If no +location is specified, newly created QuickTime tags are added in the +L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> location if +possible, otherwise in +L<UserData|Image::ExifTool::TagNames/QuickTime UserData Tags>, and +finally in L<Keys|Image::ExifTool::TagNames/QuickTime Keys Tags>, +but this order may be changed by setting the PREFERRED level of the +appropriate table in the config file (see +example.config in the full distribution for an +example). Note that some tags with the same name but different ID's may +exist in the same location, but the family 7 group names may be used to +differentiate these. ExifTool currently writes only top-level metadata in +QuickTime-based files; it extracts other track-specific and timed metadata, +but can not yet edit tags in these locations (with the exception of +track-level date/time tags). + +Alternate language tags may be accessed for +L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> and +L<Keys|Image::ExifTool::TagNames/QuickTime Keys Tags> tags by adding +a 3-character ISO 639-2 language code and an optional ISO 3166-1 alpha 2 +country code to the tag name (eg. "ItemList:Artist-deu" or +"ItemList::Artist-deu-DE"). Most +L<UserData|Image::ExifTool::TagNames/QuickTime UserData Tags> tags support a +language code, but without a country code. If no language code is specified +when writing, the default language is written and alternate languages for +the tag are deleted. Use the "und" language code to write the default +language without deleting alternate languages. Note that "eng" is treated +as a default language when reading, but not when writing. + +According to the specification, integer-format QuickTime date/time tags +should be stored as UTC. Unfortunately, digital cameras often store local +time values instead (presumably because they don't know the time zone). For +this reason, by default ExifTool does not assume a time zone for these +values. However, if the API QuickTimeUTC option is set, then ExifTool will +assume these values are properly stored as UTC, and will convert them to +local time when extracting. + +When writing string-based date/time tags, the system time zone is added if +the PrintConv option is enabled and no time zone is specified. This is +because Apple software may display crazy values if the time zone is missing +for some tags. + +By default ExifTool will remove null padding from some QuickTime containers +in Canon CR3 files when writing, but the +QuickTimePad option may be used to preserve +the original size by padding with nulls if necessary. + +See +L<https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/> +for the official specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'GPS ' GPSDataList2? no + 'IDIT' DateTimeOriginal string + 'PICT' PreviewPICT no + '_htc' HTCInfo QuickTime HTCInfo + 'ardt' ARDroneFile no + 'frea' Kodak_frea Kodak frea + 'free' KodakFree Kodak Free + Pittasoft QuickTime Pittasoft + ThumbnailImage no + Free? no + 'ftyp' FileType QuickTime FileType + 'gps0' GPSTrack QuickTime Stream + 'gsen' GSensor QuickTime Stream + 'junk' Junk? no + 'mdat' MediaData? no + 'mdat-offset' MediaDataOffset no + 'mdat-size' MediaDataSize no + 'meco' OtherMeta QuickTime OtherMeta + 'meta' Meta QuickTime Meta + 'moof' MovieFragment QuickTime MovieFragment + 'moov' Movie QuickTime Movie + 'pict' PreviewPICT no + 'pnot' Preview QuickTime Preview + 'prrt' ARDroneTelemetry no + 'sefd' SamsungTrailer Samsung Trailer + 'skip' CanonSkip Canon Skip + PreviewImage no + Skip? no + 'thm ' ThumbnailImage no + 'thum' ThumbnailImage no + 'udat' GPSLog no + 'udta' UserData FLIR UserData + 'uuid' XMP XMP + UUID-PROF QuickTime Profile + UUID-Flip QuickTime Flip + UUID-Canon2 Canon uuid2 + SensorData QuickTime Tags360Fly + SensorData no + PreviewImage no + UUID-Unknown? no + 'wide' Wide? no + +=head3 QuickTime HTCInfo Tags + +Tags written by some HTC camera phones. + + Tag ID Tag Name Writable + ------ -------- -------- + 'slmt' Unknown_slmt? no + +=head3 QuickTime Pittasoft Tags + +Tags found in Pittasoft Blackvue dashcam "free" data. + + Tag ID Tag Name Writable + ------ -------- -------- + '3gf ' AccelData QuickTime Stream + 'cprt' Copyright no + 'gps ' GPSLog no + 'ptnm' OriginalFileName no + 'ptrh' Ptrh QuickTime Pittasoft + 'sttm' StartTime no + 'thum' PreviewImage no + +=head3 QuickTime Stream Tags + +The tags below are extracted from timed metadata in QuickTime and other +formats of video files when the ExtractEmbedded option is used. Although +most of these tags are combined into the single table below, ExifTool +currently reads 59 different formats of timed GPS metadata from video files. + + Tag Name Writable + -------- -------- + Accelerometer no + AccelerometerData no + AngularVelocity no + CTMD Canon CTMD + CameraDateTime no + Car no + Distance no + ExposureCompensation no + ExposureTime no + FNumber no + FrameNumber no + GPSAltitude no + GPSDOP no + GPSDateTime no + GPSLatitude no + GPSLongitude no + GPSSatellites no + GPSSpeed no + GPSSpeedRef no + GPSTimeStamp no + GPSTrack no + GPSTrackRef no + GSensor no + INSV QuickTime INSV_MakerNotes + ISO no + JpgFromRaw no + KiloCalories no + PreviewInfo QuickTime PreviewInfo + RVMI_gReV QuickTime RVMI_gReV + RVMI_sReV QuickTime RVMI_sReV + RawGSensor no + SampleDateTime no + SampleDuration no + SampleTime no + Text no + TimeCode no + Unknown00? no + Unknown01? no + Unknown02? no + Unknown03? no + UserLabel no + VerticalSpeed no + VideoTimeStamp no + camm0 QuickTime camm0 + camm1 QuickTime camm1 + camm2 QuickTime camm2 + camm3 QuickTime camm3 + camm4 QuickTime camm4 + camm5 QuickTime camm5 + camm6 QuickTime camm6 + camm7 QuickTime camm7 + fdsc GoPro fdsc + gpmd_Kingslim QuickTime Stream + gpmd_Rove QuickTime Stream + gpmd_FMAS QuickTime Stream + gpmd_GoPro GoPro GPMF + marl QuickTime marl + mebx QuickTime Keys + mett Parrot mett + rtmd Sony rtmd + tx3g QuickTime tx3g + +=head3 QuickTime INSV_MakerNotes Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x000a SerialNumber no + 0x0012 Model no + 0x001a Firmware no + 0x002a Parameters no + +=head3 QuickTime PreviewInfo Tags + +Preview stored by TomTom Bandit ActionCam. + + Index1 Tag Name Writable + ------ -------- -------- + 8 PreviewImage no + +=head3 QuickTime RVMI_gReV Tags + +GPS information extracted from the RVMI box of MOV videos. + + Index1 Tag Name Writable + ------ -------- -------- + 4 GPSLatitude no + 8 GPSLongitude no + 16 GPSSpeed no + 18 GPSTrack no + +=head3 QuickTime RVMI_sReV Tags + +G-sensor information extracted from the RVMI box of MOV videos. + + Index1 Tag Name Writable + ------ -------- -------- + 4 GSensor no + +=head3 QuickTime camm0 Tags + +The camm0 through camm7 tables define tags extracted from the Google Street +View Camera Motion Metadata of MP4 videos. See +L<https://developers.google.com/streetview/publish/camm-spec> for the +specification. + + Index1 Tag Name Writable + ------ -------- -------- + 4 AngleAxis no + +=head3 QuickTime camm1 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 PixelExposureTime no + 8 RollingShutterSkewTime no + +=head3 QuickTime camm2 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 AngularVelocity no + +=head3 QuickTime camm3 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 Acceleration no + +=head3 QuickTime camm4 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 Position no + +=head3 QuickTime camm5 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 GPSLatitude no + 12 GPSLongitude no + 20 GPSAltitude no + +=head3 QuickTime camm6 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 GPSDateTime no + 12 GPSMeasureMode no + 16 GPSLatitude no + 24 GPSLongitude no + 32 GPSAltitude no + 36 GPSHorizontalAccuracy no + 40 GPSVerticalAccuracy no + 44 GPSVelocityEast no + 48 GPSVelocityNorth no + 52 GPSVelocityUp no + 56 GPSSpeedAccuracy no + +=head3 QuickTime camm7 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 MagneticField no + +=head3 QuickTime marl Tags + +Tags extracted from the marl ctbx timed metadata of GM cars. + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 QuickTime Keys Tags + +This directory contains a list of key names which are used to decode tags +written by the "mdta" handler. Also in this table are a few tags found in +timed metadata that are not yet writable by ExifTool. The prefix of +"com.apple.quicktime." has been removed from the TagID's below. These tags +support alternate languages in the same way as the +L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> tags. Note +that by default, +L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> and +L<UserData|Image::ExifTool::TagNames/QuickTime UserData Tags> tags are +preferred when writing, so to create a tag when a same-named tag exists in +either of these tables, either the "Keys" location must be specified (eg. +C<-Keys:Author=Phil> on the command line), or the PREFERRED level must be +changed via the config file. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Encoded_With' EncodedWith yes + 'album' Album yes + 'apple.photos.variation-identifier' + ApplePhotosVariationIdentifier int64s + 'artist' Artist yes + 'artwork' Artwork yes + 'author' Author yes + 'camera.framereadouttimeinmicroseconds' + FrameReadoutTime yes + 'camera.identifier' CameraIdentifier yes + 'collection.user' UserCollection yes + 'com.android.version' AndroidVersion yes + 'com.apple.photos.captureMode' CaptureMode yes + 'comment' Comment yes + 'copyright' Copyright yes + 'creationdate' CreationDate yes + 'description' Description yes + 'detected-face' FaceInfo QuickTime FaceInfo + 'detected-face.bounds' DetectedFaceBounds no + 'detected-face.face-id' DetectedFaceID no + 'detected-face.roll-angle' + DetectedFaceRollAngle no + 'detected-face.yaw-angle' + DetectedFaceYawAngle no + 'direction.facing' CameraDirection yes + 'direction.motion' CameraMotion yes + 'director' Director yes + 'displayname' DisplayName yes + 'genre' Genre yes + 'information' Information yes + 'keywords' Keywords yes + 'live-photo-info' LivePhotoInfo no + 'live-photo.auto' LivePhotoAuto int8u + 'live-photo.vitality-score' + LivePhotoVitalityScore float + 'live-photo.vitality-scoring-version' + LivePhotoVitalityScoringVersion int64s + 'location.ISO6709' GPSCoordinates yes + 'location.accuracy.horizontal' + LocationAccuracyHorizontal yes + 'location.body' LocationBody yes + 'location.date' LocationDate yes + 'location.name' LocationName yes + 'location.note' LocationNote yes + 'location.role' LocationRole yes + 'make' Make yes + 'model' Model yes + 'player.movie.audio.balance' Balance yes + 'player.movie.audio.bass' Bass yes + 'player.movie.audio.gain' AudioGain yes + 'player.movie.audio.mute' Mute int8u + 'player.movie.audio.pitchshift' PitchShift yes + 'player.movie.audio.treble' Treble yes + 'player.movie.visual.brightness' Brightness yes + 'player.movie.visual.color' Color yes + 'player.movie.visual.contrast' Contrast yes + 'player.movie.visual.tint' Tint yes + 'player.version' PlayerVersion yes + 'producer' Producer yes + 'publisher' Publisher yes + 'rating.user' UserRating yes + 'software' Software yes + 'still-image-time' StillImageTime no + 'title' Title yes + 'version' Version yes + 'video-orientation' VideoOrientation no + 'year' Year yes + +=head3 QuickTime FaceInfo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'crec' FaceRec QuickTime FaceRec + +=head3 QuickTime FaceRec Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'cits' FaceItem QuickTime Keys + +=head3 QuickTime tx3g Tags + +Tags extracted from the tx3g sbtl timed metadata of Yuneec drones, and +subtitle text in some other videos. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Alt' GPSAltitude no + 'DateTime' DateTime no + 'GimPitch' GimbalPitch no + 'GimRoll' GimbalRoll no + 'GimYaw' GimbalYaw no + 'Lat' GPSLatitude no + 'Lon' GPSLongitude no + 'Pitch' Pitch no + 'Roll' Roll no + 'Text' Text no + 'Yaw' Yaw no + +=head3 QuickTime FileType Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 MajorBrand no + 1 MinorVersion no + 2 CompatibleBrands no + +=head3 QuickTime OtherMeta Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'mere' MetaRelation QuickTime MetaRelation + 'meta' Meta QuickTime Meta + +=head3 QuickTime MetaRelation Tags + + Index4 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 QuickTime Meta Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'bxml' BinaryXML? no + 'dinf' DataInfo QuickTime DataInfo + 'free' Free? no + 'hdlr' Handler QuickTime Handler + 'idat' MetaImageSize no + 'iinf' ItemInformation QuickTime ItemInfo + QuickTime ItemInfo + 'iloc' ItemLocation no + 'ilst' ItemList QuickTime ItemList + 'ipmc' IPMPControl? no + 'ipro' ItemProtection? no + 'iprp' ItemProperties QuickTime ItemProp + 'iref' ItemReference QuickTime ItemRef + 'keys' Keys QuickTime Keys + 'pitm' PrimaryItemReference no + 'uuid' MetaVersion no + UUID-Unknown? no + 'xml ' XML XMP XML + +=head3 QuickTime DataInfo Tags + +MP4 data information box. + + Tag ID Tag Name Writable + ------ -------- -------- + 'dref' DataRef QuickTime DataRef + +=head3 QuickTime DataRef Tags + +MP4 data reference box. + + Tag ID Tag Name Writable + ------ -------- -------- + "url\0" URL no + 'url ' URL no + 'urn ' URN no + +=head3 QuickTime Handler Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 HandlerClass no + 8 HandlerType no + 12 HandlerVendorID no + 24 HandlerDescription no + +=head3 QuickTime ItemInfo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'infe' ItemInfoEntry no + +=head3 QuickTime ItemList Tags + +This is the preferred location for creating new QuickTime tags. Tags in +this table support alternate languages which are accessed by adding a +3-character ISO 639-2 language code and an optional ISO 3166-1 alpha 2 +country code to the tag name (eg. "ItemList:Title-fra" or +"ItemList::Title-fra-FR"). When creating a new Meta box to contain the +ItemList directory, by default ExifTool adds an 'mdir' (Metadata) Handler +box because Apple software may ignore ItemList tags otherwise, but the API +QuickTimeHandler option may be set to 0 to avoid this. + + Tag ID Tag Name Writable + ------ -------- -------- + '----' iTunesInfo QuickTime iTunesInfo + '@PST' ParentShortTitle string + '@ppi' ParentProductID string + '@pti' ParentTitle string + '@sti' ShortTitle string + 'AACR' Unknown_AACR? string + 'CDEK' Unknown_CDEK? string + 'CDET' Unknown_CDET? string + 'GUID' GUID string + 'VERS' ProductVersion string + 'aART' AlbumArtist string + 'akID' AppleStoreAccountType int8s + 'albm' Album string/ + 'apID' AppleStoreAccount string + 'atID' AlbumTitleID int32s + 'auth' Author string + 'catg' Category string + 'cnID' AppleStoreCatalogID int32s + 'covr' CoverArt string + 'cpil' Compilation int8s + 'cprt' Copyright string + 'desc' Description string/ + 'disk' DiskNumber undef + 'dscp' Description string/ + 'egid' EpisodeGlobalUniqueID string + 'geID' GenreID int32s + 'gnre' Genre undef/ + 'grup' Grouping string/ + 'gshh' GoogleHostHeader string + 'gspm' GooglePingMessage string + 'gspu' GooglePingURL string + 'gssd' GoogleSourceData string + 'gsst' GoogleStartTime string + 'gstd' GoogleTrackDuration string + 'hdvd' HDVideo int8s + 'itnu' iTunesU int8s + 'keyw' Keyword string + 'ldes' LongDescription string + 'pcst' Podcast int8s + 'perf' Performer string + 'pgap' PlayGap int8s + 'plID' PlayListID int32s[0.25] + 'prID' ProductID string + 'purd' PurchaseDate string + 'purl' PodcastURL string + 'rate' RatingPercent string + 'rldt' ReleaseDate string + 'rtng' Rating int8s + 'sdes' StoreDescription string + 'sfID' AppleStoreCountry int32s + 'shwm' ShowMovement int8s + 'soaa' SortAlbumArtist string + 'soal' SortAlbum string + 'soar' SortArtist string + 'soco' SortComposer string + 'sonm' SortName string + 'sosn' SortShow string + 'stik' MediaType int8s + 'titl' Title string/ + 'tmpo' BeatsPerMinute int16s + 'trkn' TrackNumber undef + 'tven' TVEpisodeID string + 'tves' TVEpisode int32s + 'tvnn' TVNetworkName string + 'tvsh' TVShow string + 'tvsn' TVSeason int32u + 'yrrc' Year string + "\xa9ART" Artist string + "\xa9alb" Album string + "\xa9ard" ArtDirector string + "\xa9arg" Arranger string + "\xa9aut" Author string/ + "\xa9cmt" Comment string + "\xa9com" Composer string/ + "\xa9con" Conductor string + "\xa9cpy" Copyright string/ + "\xa9day" ContentCreateDate string + "\xa9des" Description string + "\xa9dir" Director string + "\xa9enc" EncodedBy string + "\xa9gen" Genre string + "\xa9grp" Grouping string + "\xa9lyr" Lyrics string + "\xa9mvc" MovementCount int16s + "\xa9mvi" MovementNumber int16s + "\xa9mvn" MovementName string + "\xa9nam" Title string + "\xa9nrt" Narrator string + "\xa9ope" OriginalArtist string + "\xa9prd" Producer string + "\xa9pub" Publisher string + "\xa9sne" SoundEngineer string + "\xa9sol" Soloist string + "\xa9st3" Subtitle string + "\xa9too" Encoder string + "\xa9trk" Track string + "\xa9wrk" Work string + "\xa9wrt" Composer string + "\xa9xpd" ExecutiveProducer string + "\xa9xyz" GPSCoordinates string + +=head3 QuickTime iTunesInfo Tags + +ExifTool will extract any iTunesInfo tags that exist, even if they are not +defined in this table. These tags belong to the family 1 "iTunes" group, +and are not currently writable. + + Tag ID Tag Name Writable + ------ -------- -------- + 'ARTISTS' Artists no + 'BARCODE' Barcode no + 'CATALOGNUMBER' CatalogNumber no + 'DISCNUMBER' DiscNumber no + 'Dynamic Range (DR)' DynamicRange no + 'Dynamic Range (R128)' DynamicRangeR128 no + 'Encoding Params' EncodingParams QuickTime EncodingParams + 'LABEL' Label no + 'MEDIA' Media no + 'MOOD' Mood no + 'Peak Level (R128)' PeakLevelR128 no + 'Peak Level (Sample)' PeakLevelSample no + 'RATING' Rating no + 'SCRIPT' Script no + 'TRACKNUMBER' TrackNumber no + 'Volume Level (R128)' VolumeLevelR128 no + 'Volume Level (ReplayGain)' ReplayVolumeLevel no + 'iTunEXTC' ContentRating no + 'iTunMOVI' iTunMOVI PLIST + 'iTunNORM' VolumeNormalization no + 'iTunSMPB' iTunSMPB no + 'iTunes_CDDB_1' CDDB1Info no + 'iTunes_CDDB_TrackNumber' CDDBTrackNumber no + 'initialkey' InitialKey no + 'originaldate' OriginalDate no + 'originalyear' OriginalYear no + 'popularimeter' Popularimeter no + 'replaygain_track_gain' ReplayTrackGain no + 'replaygain_track_peak' ReplayTrackPeak no + 'tool' iTunTool no + '~length' Length no + +=head3 QuickTime EncodingParams Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'abrt' AudioAvailableBitRateRange no + 'acbf' AudioBitRateControlMode no + 'acef' AudioExtendFrequencies no + 'brat' AudioCurrentTargetBitRate no + 'cdcv' AudioComponentVersion no + 'cmnc' AudioAvailableNumberChannels no + 'init' AudioIsInitialized no + 'lmrc' AudioDoesSampleRateConversion no + 'mdel' AudioMinimumDelayMode no + 'mnip' AudioMinimumNumberInputPackets no + 'mnop' AudioMinimumNumberOutputPackets no + 'oppr' AudioOutputPrecedence no + 'pad0' AudioZeroFramesPadded no + 'pakb' AudioMaximumPacketByteSize no + 'pakd' AudioRequiresPacketDescription no + 'pakf' AudioPacketFrameSize no + 'prmm' AudioCodecPrimeMethod no + 'srcq' AudioQualitySetting no + 'tbuf' AudioInputBufferSize no + 'ubuf' AudioUsedInputBufferSize no + 'ursr' AudioUseRecommendedSampleRate no + 'vbrq' AudioVBRQuality no + 'vers' AudioEncodingParamsVersion no + 'vpk?' AudioHasVariablePacketByteSizes no + +=head3 QuickTime ItemProp Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'ipco' ItemPropertyContainer QuickTime ItemPropCont + 'ipma' ItemPropertyAssociation no + +=head3 QuickTime ItemPropCont Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'auxC' AuxiliaryImageType no + 'av1C' AV1Configuration QuickTime AV1Config + 'clap' CleanAperture no + 'colr' ICC_Profile ICC_Profile + ColorRepresentation no + 'hvcC' HEVCConfiguration QuickTime HEVCConfig + 'irot' Rotation int8u! + 'ispe' ImageSpatialExtent no + 'pasp' PixelAspectRatio int32u! + 'pixi' ImagePixelDepth no + 'rloc' RelativeLocation no + +=head3 QuickTime AV1Config Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 AV1ConfigurationVersion no + 1 SeqProfile? no + 1.1 SeqLevelIdx0? no + 2 SeqTier0? no + 2.1 HighBitDepth? no + 2.2 TwelveBit? no + 2.3 ChromaFormat no + 2.4 ChromaSamplePosition no + 3 InitialDelaySamples? no + +=head3 QuickTime HEVCConfig Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 HEVCConfigurationVersion no + 1 GeneralProfileSpace no + 1.1 GeneralTierFlag no + 1.2 GeneralProfileIDC no + 2 GenProfileCompatibilityFlags no + 6 ConstraintIndicatorFlags no + 12 GeneralLevelIDC no + 13 MinSpatialSegmentationIDC no + 15 ParallelismType no + 16 ChromaFormat no + 17 BitDepthLuma no + 18 BitDepthChroma no + 19 AverageFrameRate no + 21 ConstantFrameRate no + 21.1 NumTemporalLayers no + 21.2 TemporalIDNested no + +=head3 QuickTime ItemRef Tags + +The Item reference entries listed in the table below contain information about +the associations between items in the file. This information is used by +ExifTool, but these entries are not extracted as tags. + + Tag ID Tag Name Writable + ------ -------- -------- + 'auxl' AuxiliaryImageRef no + 'cdsc' ContentDescribes no + 'dimg' DerivedImageRef no + 'thmb' ThumbnailRef no + +=head3 QuickTime MovieFragment Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'meta' Meta QuickTime Meta + 'mfhd' MovieFragmentHeader QuickTime MovieFragHdr + 'traf' TrackFragment QuickTime TrackFragment + +=head3 QuickTime MovieFragHdr Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 MovieFragmentSequence no + +=head3 QuickTime TrackFragment Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'meta' Meta QuickTime Meta + +=head3 QuickTime Movie Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'cmov' CompressedMovie QuickTime CMovie + 'gps ' GPSDataList? no + 'htka' HTCTrack QuickTime Track + 'iods' InitialObjectDescriptor? no + 'meco' OtherMeta QuickTime OtherMeta + 'meta' Meta QuickTime Meta + 'mvhd' MovieHeader QuickTime MovieHeader + 'trak' Track QuickTime Track + 'udta' UserData QuickTime UserData + 'uuid' UUID-USMT QuickTime UserMedia + UUID-Canon Canon uuid + UUID-Unknown? no + +=head3 QuickTime CMovie Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'dcom' Compression no + +=head3 QuickTime Track Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'mdia' Media QuickTime Media + 'meco' OtherMeta QuickTime OtherMeta + 'meta' Meta QuickTime Meta + 'tapt' TrackAperture QuickTime TrackAperture + 'tkhd' TrackHeader QuickTime TrackHeader + 'tref' TrackRef QuickTime TrackRef + 'udta' UserData QuickTime UserData + 'uuid' UUID-USMT QuickTime UserMedia + SphericalVideoXML XMP + UUID-Unknown? no + +=head3 QuickTime Media Tags + +MP4 media box. + + Tag ID Tag Name Writable + ------ -------- -------- + 'hdlr' Handler QuickTime Handler + 'mdhd' MediaHeader QuickTime MediaHeader + 'minf' MediaInfo QuickTime MediaInfo + +=head3 QuickTime MediaHeader Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 MediaHeaderVersion no + 1 MediaCreateDate int32u + 2 MediaModifyDate int32u + 3 MediaTimeScale no + 4 MediaDuration no + 5 MediaLanguageCode no + +=head3 QuickTime MediaInfo Tags + +MP4 media info box. + + Tag ID Tag Name Writable + ------ -------- -------- + 'dinf' DataInfo QuickTime DataInfo + 'gmhd' GenMediaHeader QuickTime GenMediaHeader + 'hdlr' Handler QuickTime Handler + 'hmhd' HintHeader QuickTime HintHeader + 'nmhd' NullMediaHeader? no + 'smhd' AudioHeader QuickTime AudioHeader + 'stbl' SampleTable QuickTime SampleTable + 'vmhd' VideoHeader QuickTime VideoHeader + +=head3 QuickTime GenMediaHeader Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'gmin' GenMediaInfo QuickTime GenMediaInfo + 'text' Text? no + 'tmcd' TimeCode QuickTime TimeCode + +=head3 QuickTime GenMediaInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 GenMediaVersion no + 1 GenFlags no + 4 GenGraphicsMode no + 6 GenOpColor no + 12 GenBalance no + +=head3 QuickTime TimeCode Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'tcmi' TCMediaInfo QuickTime TCMediaInfo + +=head3 QuickTime TCMediaInfo Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 TextFont no + 6 TextFace no + 8 TextSize no + 12 TextColor no + 18 BackgroundColor no + 24 FontName no + +=head3 QuickTime HintHeader Tags + +MP4 hint media header. + + Index2 Tag Name Writable + ------ -------- -------- + 2 MaxPDUSize no + 3 AvgPDUSize no + 4 MaxBitrate no + 6 AvgBitrate no + +=head3 QuickTime AudioHeader Tags + +MP4 audio media header. + + Index2 Tag Name Writable + ------ -------- -------- + 2 Balance no + +=head3 QuickTime SampleTable Tags + +MP4 sample table box. + + Tag ID Tag Name Writable + ------ -------- -------- + 'co64' ChunkOffset64? no + 'cslg' CompositionToDecodeTimelineMapping? no + 'ctts' CompositionTimeToSample? no + 'padb' SamplePaddingBits? no + 'sbgp' SampleToGroup? no + 'sdtp' IdependentAndDisposableSamples? no + 'sgpd' SampleGroupDescription? no + 'stco' ChunkOffset? no + 'stdp' SampleDegradationPriority? no + 'stps' PartialSyncSamples no + 'stsc' SampleToChunk? no + 'stsd' AudioSampleDesc QuickTime AudioSampleDesc + VideoSampleDesc QuickTime ImageDesc + HintSampleDesc QuickTime HintSampleDesc + MetaSampleDesc QuickTime MetaSampleDesc + OtherSampleDesc QuickTime OtherSampleDesc + 'stsh' ShadowSyncSampleTable? no + 'stss' SyncSampleTable? no + 'stsz' SampleSizes? no + 'stts' VideoFrameRate no + TimeToSampleTable? no + 'stz2' CompactSampleSizes? no + 'subs' Sub-sampleInformation? no + +=head3 QuickTime AudioSampleDesc Tags + +MP4 audio sample description. This hybrid atom contains both data and child +atoms. + + ID/Index Tag Name Writable + -------- -------- -------- + 4 AudioFormat no + 20 AudioVendorID no + 24 AudioChannels no + 26 AudioBitsPerSample no + 32 AudioSampleRate no + 'chan' AudioChannelLayout QuickTime ChannelLayout + 'damr' DecodeConfig QuickTime DecodeConfig + 'pinf' PurchaseInfo QuickTime ProtectionInfo + 'sinf' ProtectionInfo QuickTime ProtectionInfo + 'wave' Wave QuickTime Wave + +=head3 QuickTime ChannelLayout Tags + +Audio channel layout. + + Index1 Tag Name Writable + ------ -------- -------- + 4 LayoutFlags no + 6 AudioChannels no + 8 AudioChannelTypes no + 12 NumChannelDescriptions no + 16 Channel1Label no + 20 Channel1Flags no + 24 Channel1Coordinates no + 36 Channel2Label no + 40 Channel2Flags no + 44 Channel2Coordinates no + 56 Channel3Label no + 60 Channel3Flags no + 64 Channel3Coordinates no + 76 Channel4Label no + 80 Channel4Flags no + 84 Channel4Coordinates no + 96 Channel5Label no + 100 Channel5Flags no + 104 Channel5Coordinates no + 116 Channel6Label no + 120 Channel6Flags no + 124 Channel6Coordinates no + 136 Channel7Label no + 140 Channel7Flags no + 144 Channel7Coordinates no + 156 Channel8Label no + 160 Channel8Flags no + 164 Channel8Coordinates no + +=head3 QuickTime DecodeConfig Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 EncoderVendor no + 4 EncoderVersion no + +=head3 QuickTime ProtectionInfo Tags + +Child atoms found in "sinf" and/or "pinf" atoms. + + Tag ID Tag Name Writable + ------ -------- -------- + 'enda' Endianness no + 'frma' OriginalFormat no + 'schi' SchemeInfo QuickTime SchemeInfo + 'schm' SchemeType QuickTime SchemeType + +=head3 QuickTime SchemeInfo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'cert' Certificate no + 'iviv' InitializationVector no + 'key ' KeyID no + 'name' UserName no + 'righ' Rights QuickTime Rights + 'user' UserID no + +=head3 QuickTime Rights Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'aver' VersionRestrictions no + 'medi' MediaFlags no + 'mode' ModeFlags no + 'plat' Platform no + 'song' ItemID no + 'tool' ItemTool no + 'tran' TransactionID no + 'veID' ItemVendorID no + +=head3 QuickTime SchemeType Tags + + Index1 Tag Name Writable + ------ -------- -------- + 4 SchemeType no + 8 SchemeVersion no + 10 SchemeURL no + +=head3 QuickTime Wave Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'enda' Endianness no + 'frma' PurchaseFileFormat no + +=head3 QuickTime ImageDesc Tags + + ID/Index Tag Name Writable + -------- -------- -------- + 2 CompressorID no + 10 VendorID no + 16 SourceImageWidth no + 17 SourceImageHeight no + 18 XResolution no + 20 YResolution no + 25 CompressorName no + 41 BitDepth no + 'CDI1' CDI1 Canon CDI1 + 'CMP1' CMP1 Canon CMP1 + 'JPEG' JPEGInfo? no + 'avcC' AVCConfiguration? no + 'btrt' BitrateInfo QuickTime Bitrate + 'clap' CleanAperture QuickTime CleanAperture + 'colr' ColorRepresentation no + 'fiel' VideoFieldOrder no + 'gama' Gamma no + 'pasp' PixelAspectRatio no + 'st3d' Stereoscopic3D no + 'sv3d' SphericalVideo QuickTime sv3d + +=head3 QuickTime Bitrate Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 BufferSize no + 1 MaxBitrate no + 2 AverageBitrate no + +=head3 QuickTime CleanAperture Tags + + Index8 Tag Name Writable + ------ -------- -------- + 0 CleanApertureWidth no + 1 CleanApertureHeight no + 2 CleanApertureOffsetX no + 3 CleanApertureOffsetY no + +=head3 QuickTime sv3d Tags + +Tags defined by the Spherical Video V2 specification. See +L<https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md> +for the specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'proj' Projection QuickTime proj + 'svhd' MetadataSource no + +=head3 QuickTime proj Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'cbmp' CubemapProj QuickTime cbmp + 'equi' EquirectangularProj QuickTime equi + 'prhd' ProjectionHeader QuickTime prhd + +=head3 QuickTime cbmp Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 Layout no + 2 Padding no + +=head3 QuickTime equi Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 ProjectionBoundsTop no + 2 ProjectionBoundsBottom no + 3 ProjectionBoundsLeft no + 4 ProjectionBoundsRight no + +=head3 QuickTime prhd Tags + + Index4 Tag Name Writable + ------ -------- -------- + 1 PoseYawDegrees no + 2 PosePitchDegrees no + 3 PoseRollDegrees no + +=head3 QuickTime HintSampleDesc Tags + +MP4 hint sample description. + + ID/Index Tag Name Writable + -------- -------- -------- + 4 HintFormat no + 16 HintTrackVersion no + 20 MaxPacketSize no + 'snro' SequenceNumberRandomOffset no + 'tims' RTPTimeScale no + 'tsro' TimestampRandomOffset no + +=head3 QuickTime MetaSampleDesc Tags + +MP4 metadata sample description. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0004 MetaFormat no + 0x0008 MetaType no + 'btrt' BitrateInfo QuickTime Bitrate + 'keys' Keys QuickTime Keys + +=head3 QuickTime OtherSampleDesc Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0004 OtherFormat no + 'ftab' FontTable no + 'name' OtherName no + +=head3 QuickTime VideoHeader Tags + +MP4 video media header. + + Index2 Tag Name Writable + ------ -------- -------- + 2 GraphicsMode no + 3 OpColor no + +=head3 QuickTime TrackAperture Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'clef' CleanApertureDimensions no + 'enof' EncodedPixelsDimensions no + 'prof' ProductionApertureDimensions no + +=head3 QuickTime TrackHeader Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 TrackHeaderVersion no + 1 TrackCreateDate int32u + 2 TrackModifyDate int32u + 3 TrackID no + 5 TrackDuration no + 8 TrackLayer no + 9 TrackVolume no + 10 MatrixStructure fixed32s[9]! + 19 ImageWidth no + 20 ImageHeight no + +=head3 QuickTime TrackRef Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'cdsc' ContentDescribes no + 'chap' ChapterListTrackID no + 'mpod' ElementaryStreamTrack no + 'tmcd' TimeCode no + +=head3 QuickTime UserData Tags + +Tag ID's beginning with the copyright symbol (hex 0xa9) are multi-language +text. Alternate language tags are accessed by adding a dash followed by a +3-character ISO 639-2 language code to the tag name. ExifTool will extract +any multi-language user data tags found, even if they aren't in this table. +Note when creating new tags, +L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> tags are +preferred over these, so to create the tag when a same-named ItemList tag +exists, either "UserData" must be specified (eg. C<-UserData:Artist=Monet> +on the command line), or the PREFERRED level must be changed via +the config file. + + Tag ID Tag Name Writable + ------ -------- -------- + '@day' ContentCreateDate string/ + '@mak' Make string/ + '@mod' Model string/ + '@sec' SamsungSec Samsung sec + '@swr' SoftwareVersion string/ + '@xyz' GPSCoordinates string/ + 'AllF' PlayAllFrames int8u + 'CAME' SerialNumberHash string + 'CNCV' CompressorVersion string + 'CNFV' FirmwareVersion string + 'CNMN' Model string/ + 'CNOP' CanonCNOP Canon CNOP + 'CNTH' CanonCNTH Canon CNTH + 'DcMD' KodakDcMD Kodak DcMD + 'FFMV' FujiFilmFFMV FujiFilm FFMV + 'FIRM' FirmwareVersion string/ + "FOV\0" FieldOfView string + 'GPMF' GoProGPMF GoPro GPMF + 'GoPr' GoProType string + 'INFO' SamsungINFO Samsung INFO + 'LEIC' LeicaLEIC Panasonic PANA + 'LENS' LensSerialNumber string + 'LOOP' LoopStyle int32u + 'Lvlm' LevelMeter? rational64s + 'MMA0' MinoltaMMA0 Minolta MMA + 'MMA1' MinoltaMMA1 Minolta MMA + 'MVTG' FujiFilmMVTG EXIF + 'NCDT' NikonNCDT Nikon NCDT + 'PANA' PanasonicPANA Panasonic PANA + 'PENT' PentaxPENT Pentax PENT + 'PXMN' MakerNotePentax5b Pentax + MakerNotePentax5c Pentax + MakerNotePentaxUnknown string + 'PXTH' PentaxPreview Pentax PXTH + 'QVMI' CasioQVMI EXIF + 'RMKN' RicohRMKN EXIF + 'RTHU' PreviewImage no + 'SDLN' PlayMode string + 'SNum' SerialNumber string/ + 'SelO' PlaySelection int8u + 'TAGS' FujiFilmTags FujiFilm MOV + KodakTags Kodak MOV + KonicaMinoltaTags Minolta MOV1 + MinoltaTags Minolta MOV2 + NikonTags Nikon MOV + OlympusTags1 Olympus MOV1 + OlympusTags2 Olympus MOV2 + OlympusTags3 Olympus MP4 + OlympusTags4 Olympus MOV3 + PentaxTags Pentax MOV + SamsungTags Samsung MP4 + SanyoMOV Sanyo MOV + SanyoMP4 Sanyo MP4 + UnknownTags? string + 'TTMD' TomTomMetaData QuickTime TomTom + 'WLOC' WindowLocation int16u + 'XMP_' XMP XMP + 'Xtra' MicrosoftXtra Microsoft Xtra + '_cx_' CX? rational64s + '_cy_' CY? rational64s + '_yaw' Yaw rational64s/ + 'albm' Album string/ + 'albr' AlbumArtist string + 'angl' CameraAngle string + 'apmd' ApertureMode undef + 'auth' Author string/ + 'ccid' ContentID string + 'cdis' ContentDistributorID string + 'chpl' ChapterList no + 'clfn' ClipFileName string + 'clid' ClipID string + 'clsf' Classification undef/ + 'cmid' CameraID string + 'cmnm' Model string/ + 'coll' CollectionName string/ + 'cprt' Copyright string/ + 'cver' CodeVersion string + 'cvru' CoverURI string + 'date' DateTimeOriginal string + 'dscp' Description string/ + 'gnre' Genre string/ + 'hinf' HintTrackInfo QuickTime HintTrackInfo + 'hinv' HintVersion string + 'hnti' HintInfo QuickTime HintInfo + 'htcb' HTCBinary QuickTime HTCBinary + 'icnu' IconURI string + 'infu' InfoURL string + 'kgtt' TrackType string + 'kywd' Keywords no + 'loci' LocationInformation undef/ + 'lrcu' LyricsURI string + 'lvlm' LevelMeter? rational64s + 'manu' Make no + 'mcvr' PreviewImage string + 'meta' Meta QuickTime Meta + 'modl' Model no + 'name' Name string + 'perf' Performer string/ + 'pmcc' GarminSettings string + 'pose' pose Kodak pose + 'ptch' Pitch rational64s/ + 'ptv ' PrintToVideo QuickTime Video + 'rads' Rads? rational64s + 'reel' ReelName string + 'roll' Roll rational64s/ + 'rtng' Rating undef/ + 'scen' Scene string + 'scrn' OlympusPreview Olympus scrn + 'shot' ShotName string + 'slno' SerialNumber string + 'smta' SamsungSmta Samsung smta + 'tags' Audible_tags Audible tags + 'thmb' MakerNotePentax5a Pentax + OlympusThumbnail Olympus thmb + ThumbnailImage string + ThumbnailPNG string + UnknownThumbnail string + 'titl' Title string/ + 'urat' UserRating undef/ + 'uuid' GarminSoftware string + UUID-Unknown? no + 'vndr' Vendor string + 'vrot' AccelerometerData no + 'yrrc' Year undef/ + "\xa9ART" Artist string + "\xa9TIM" StartTimecode string + "\xa9TSC" StartTimeScale string + "\xa9TSZ" StartTimeSampleSize string + "\xa9alb" Album string + "\xa9arg" Arranger string + "\xa9ark" ArrangerKeywords string + "\xa9cmt" Comment string + "\xa9cok" ComposerKeywords string + "\xa9com" Composer string + "\xa9cpy" Copyright string + "\xa9day" ContentCreateDate string + "\xa9dir" Director string + "\xa9ed1" Edit1 string + "\xa9ed2" Edit2 string + "\xa9ed3" Edit3 string + "\xa9ed4" Edit4 string + "\xa9ed5" Edit5 string + "\xa9ed6" Edit6 string + "\xa9ed7" Edit7 string + "\xa9ed8" Edit8 string + "\xa9ed9" Edit9 string + "\xa9enc" EncoderID string + "\xa9fmt" Format string + "\xa9fpt" Pitch string + "\xa9frl" Roll string + "\xa9fyw" Yaw string + "\xa9gen" Genre string + "\xa9gpt" CameraPitch string + "\xa9grl" CameraRoll string + "\xa9grp" Grouping string + "\xa9gyw" CameraYaw string + "\xa9inf" Information string + "\xa9isr" ISRCCode string + "\xa9lab" RecordLabelName string + "\xa9lal" RecordLabelURL string + "\xa9lyr" Lyrics string + "\xa9mak" Make string + "\xa9mal" MakerURL string + "\xa9mdl" Model string/ + "\xa9mod" Model string + "\xa9nam" Title string + "\xa9pdk" ProducerKeywords string + "\xa9phg" RecordingCopyright string + "\xa9prd" Producer string + "\xa9prf" Performers string + "\xa9prk" PerformerKeywords string + "\xa9prl" PerformerURL string + "\xa9req" Requirements string + "\xa9snk" SubtitleKeywords string + "\xa9snm" Subtitle string + "\xa9src" SourceCredits string + "\xa9swf" SongWriter string + "\xa9swk" SongWriterKeywords string + "\xa9swr" SoftwareVersion string + "\xa9too" Encoder string + "\xa9trk" Track string + "\xa9wrt" Composer string/ + "\xa9xsp" SpeedX string + "\xa9xyz" GPSCoordinates string + "\xa9ysp" SpeedY string + "\xa9zsp" SpeedZ string + +=head3 QuickTime TomTom Tags + +Tags found in TomTom Bandit Action Cam MP4 videos. + + Tag ID Tag Name Writable + ------ -------- -------- + 'TTAD' TomTomAD QuickTime Stream + 'TTHL' TomTomHL? no + 'TTID' TomTomID no + 'TTVD' TomTomVD no + 'TTVI' TomTomVI? no + +=head3 QuickTime HintTrackInfo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'dimm' ImmediateDataBytes no + 'dmax' LargestPacketDuration no + 'dmed' MediaTrackBytes no + 'drep' RepeatedDataBytes no + 'maxr' MaxDataRate no + 'npck' NumPackets no + 'nump' NumPackets no + 'payt' PayloadType no + 'pmax' LargestPacketSize no + 'tmax' MaxTransmissionTime no + 'tmin' MinTransmissionTime no + 'totl' TotalBytes no + 'tpaY' TotalBytesNoRTPHeaders no + 'tpay' TotalBytesNoRTPHeaders no + 'tpyl' TotalBytesNoRTPHeaders no + 'trpY' TotalBytes no + 'trpy' TotalBytes no + +=head3 QuickTime HintInfo Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'rtp ' RealtimeStreamingProtocol no + 'sdp ' StreamingDataProtocol no + +=head3 QuickTime HTCBinary Tags + + Index4 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 QuickTime Video Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 DisplaySize no + 6 SlideShow no + +=head3 QuickTime UserMedia Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'MTDT' MetaData QuickTime MetaData + +=head3 QuickTime MetaData Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 Title no + 0x0003 ProductionDate no + 0x0004 Software no + 0x0005 Product no + 0x000a TrackProperty no + 0x000b TimeZone no + 0x000c ModifyDate no + +=head3 QuickTime MovieHeader Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 MovieHeaderVersion no + 1 CreateDate int32u + 2 ModifyDate int32u + 3 TimeScale no + 4 Duration no + 5 PreferredRate no + 6 PreferredVolume no + 9 MatrixStructure no + 18 PreviewTime no + 19 PreviewDuration no + 20 PosterTime no + 21 SelectionTime no + 22 SelectionDuration no + 23 CurrentTime no + 24 NextTrackID no + +=head3 QuickTime Preview Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 PreviewDate int32u + 2 PreviewVersion no + 3 PreviewAtomType no + 5 PreviewAtomIndex no + +=head3 QuickTime Profile Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'APRF' AudioProfile QuickTime AudioProf + 'FPRF' FileGlobalProfile QuickTime FileProf + 'OLYM' OlympusOLYM Olympus OLYM + 'VPRF' VideoProfile QuickTime VideoProf + +=head3 QuickTime AudioProf Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 AudioProfileVersion? no + 1 AudioTrackID no + 2 AudioCodec no + 3 AudioCodecInfo? no + 4 AudioAttributes no + 5 AudioAvgBitrate no + 6 AudioMaxBitrate no + 7 AudioSampleRate no + 8 AudioChannels no + +=head3 QuickTime FileProf Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 FileProfileVersion? no + 1 FileFunctionFlags no + +=head3 QuickTime VideoProf Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 VideoProfileVersion? no + 1 VideoTrackID no + 2 VideoCodec no + 3 VideoCodecInfo? no + 4 VideoAttributes no + 5 VideoAvgBitrate no + 6 VideoMaxBitrate no + 7 VideoAvgFrameRate no + 8 VideoMaxFrameRate no + 9 VideoSize no + 10 PixelAspectRatio no + +=head3 QuickTime Flip Tags + +Found in MP4 files from Flip Video cameras. + + Index4 Tag Name Writable + ------ -------- -------- + 1 PreviewImageWidth no + 2 PreviewImageHeight no + 13 PreviewImageLength no + 14 SerialNumber no + 28 PreviewImage no + +=head3 QuickTime Tags360Fly Tags + +Timed metadata found in MP4 videos from the 360Fly. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 Accel360Fly QuickTime Accel360Fly + 0x0002 Gyro360Fly QuickTime Gyro360Fly + 0x0003 Mag360Fly QuickTime Mag360Fly + 0x0005 GPS360Fly QuickTime GPS360Fly + 0x0006 Rot360Fly QuickTime Rot360Fly + 0x00fa Fusion360Fly QuickTime Fusion360Fly + +=head3 QuickTime Accel360Fly Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1 AccelMode? no + 2 SampleTime no + 10 AccelYPR no + +=head3 QuickTime Gyro360Fly Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1 GyroMode? no + 2 SampleTime no + 10 GyroYPR no + +=head3 QuickTime Mag360Fly Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1 MagMode? no + 2 SampleTime no + 10 MagnetometerXYZ no + +=head3 QuickTime GPS360Fly Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1 GPSMode? no + 2 SampleTime no + 10 GPSLatitude no + 14 GPSLongitude no + 18 GPSAltitude no + 22 GPSSpeed no + 24 GPSTrack no + 26 Acceleration no + +=head3 QuickTime Rot360Fly Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1 RotMode? no + 2 SampleTime no + 10 RotationXYZ no + +=head3 QuickTime Fusion360Fly Tags + + Index1 Tag Name Writable + ------ -------- -------- + 1 FusionMode? no + 2 SampleTime no + 10 FusionYPR no + +=head3 QuickTime ImageFile Tags + +Tags used in QTIF QuickTime Image Files. + + Tag ID Tag Name Writable + ------ -------- -------- + 'idat' ImageData no + 'idsc' ImageDescription QuickTime ImageDesc + 'iicc' ICC_Profile ICC_Profile + +=head2 Parrot Tags + +=head3 Parrot mett Tags + +Streaming metadata found in Parrot drone videos. See +L<https://developer.parrot.com/docs/pdraw/metadata.html> for the +specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'P1' ParrotV1 Parrot V1 + 'P2' ParrotV2 Parrot V2 + 'P3' ParrotV3 Parrot V3 + 'E1' ParrotTimeStamp Parrot TimeStamp + 'E2' ParrotFollowMe Parrot FollowMe + 'E3' ParrotAutomation Parrot Automation + 'application/arcore-accel' ARCoreAccel Parrot ARCoreAccel + 'application/arcore-custom-event' + ARCoreCustom Parrot ARCoreCustom + 'application/arcore-gyro' ARCoreGyro Parrot ARCoreGyro + 'application/arcore-video-0' ARCoreVideo Parrot ARCoreVideo + +=head3 Parrot V1 Tags + +Parrot version 1 streaming metadata. + + Index1 Tag Name Writable + ------ -------- -------- + 4 DroneYaw no + 6 DronePitch no + 8 DroneRoll no + 10 CameraPan no + 12 CameraTilt no + 14 FrameView no + 22 ExposureTime no + 24 ISO no + 26 WifiRSSI no + 27 Battery no + 28 GPSLatitude no + 32 GPSLongitude no + 36 GPSAltitude no + 36.1 GPSSatellites no + 40 AltitudeFromTakeOff no + 44 DistanceFromHome no + 48 SpeedX no + 50 SpeedY no + 52 SpeedZ no + 54 Binning no + 54.1 FlyingState no + 55 Animation no + 55.1 PilotingMode no + +=head3 Parrot V2 Tags + +Parrot version 2 basic streaming metadata. + + Index1 Tag Name Writable + ------ -------- -------- + 4 Elevation no + 8 GPSLatitude no + 12 GPSLongitude no + 16 GPSAltitude no + 16.1 GPSSatellites no + 20 GPSVelocityNorth no + 22 GPSVelocityEast no + 24 GPSVelocityDown no + 26 AirSpeed no + 28 DroneQuaternion no + 36 FrameView no + 44 CameraPan no + 46 CameraTilt no + 48 ExposureTime no + 50 ISO no + 52 Binning no + 52.1 FlyingState no + 53 Animation no + 53.1 PilotingMode no + 54 WifiRSSI no + 55 Battery no + 'Groups' Groups no + +=head3 Parrot V3 Tags + +Parrot version 3 basic streaming metadata. + + Index1 Tag Name Writable + ------ -------- -------- + 4 Elevation no + 8 GPSLatitude no + 12 GPSLongitude no + 16 GPSAltitude no + 16.1 GPSSatellites no + 20 GPSVelocityNorth no + 22 GPSVelocityEast no + 24 GPSVelocityDown no + 26 AirSpeed no + 28 DroneQuaternion no + 36 FrameBaseView no + 44 FrameView no + 52 ExposureTime no + 54 ISO no + 56 RedBalance no + 58 BlueBalance no + 60 FOV no + 64 LinkGoodput no + 64.1 LinkQuality no + 68 WifiRSSI no + 69 Battery no + 70 Binning no + 70.1 FlyingState no + 71 Animation no + 71.1 PilotingMode no + +=head3 Parrot TimeStamp Tags + +Parrot streaming metadata timestamp extension. + + Index1 Tag Name Writable + ------ -------- -------- + 4 TimeStamp no + +=head3 Parrot FollowMe Tags + +Parrot streaming metadata follow-me extension. + + Index1 Tag Name Writable + ------ -------- -------- + 4 GPSTargetLatitude no + 8 GPSTargetLongitude no + 12 GPSTargetAltitude no + 16 Follow-meMode no + 17 Follow-meAnimation no + +=head3 Parrot Automation Tags + +Parrot streaming metadata automation extension. + + Index1 Tag Name Writable + ------ -------- -------- + 4 GPSFramingLatitude no + 8 GPSFramingLongitude no + 12 GPSFramingAltitude no + 16 GPSDestLatitude no + 20 GPSDestLongitude no + 24 GPSDestAltitude no + 28 AutomationAnimation no + 29 AutomationFlags no + +=head3 Parrot ARCoreAccel Tags + +ARCore accelerometer data. + + Index1 Tag Name Writable + ------ -------- -------- + 4 AccelerometerUnknown? no + 5 Accelerometer no + +=head3 Parrot ARCoreCustom Tags + + Index1 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 Parrot ARCoreGyro Tags + +ARCore accelerometer data. + + Index1 Tag Name Writable + ------ -------- -------- + 4 GyroscopeUnknown? no + 5 Gyroscope no + +=head3 Parrot ARCoreVideo Tags + + Index1 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head2 Matroska Tags + +The following tags are extracted from Matroska multimedia container files. +This container format is used by file types such as MKA, MKV, MKS and WEBM. +For speed, ExifTool extracts tags only up to the first Cluster unless the +Verbose (-v) or Unknown = 2 (-U) option is used. See +L<http://www.matroska.org/technical/specs/index.html> for the official +Matroska specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 ChapterDisplay Matroska + 0x0003 TrackType no + 0x0005 ChapterString no + 0x0006 VideoCodecID no + AudioCodecID no + CodecID no + 0x0008 TrackDefault no + 0x0009 ChapterTrackNumber? no + 0x000e Slices Matroska + 0x000f ChapterTrack Matroska + 0x0011 ChapterTimeStart no + 0x0012 ChapterTimeEnd no + 0x0016 CueRefTime? no + 0x0017 CueRefCluster? no + 0x0018 ChapterFlagHidden? no + 0x001a VideoScanType no + 0x001b BlockDuration? no + 0x001c TrackLacing? no + 0x001f AudioChannels no + 0x0020 BlockGroup Matroska + 0x0021 Block? no + 0x0022 BlockVirtual? no + 0x0023 SimpleBlock? no + 0x0024 CodecState? no + 0x0025 BlockAdditional? no + 0x0026 BlockMore Matroska + 0x0027 Position no + 0x002a CodecDecodeAll no + 0x002b PrevSize no + 0x002e TrackEntry Matroska + 0x002f EncryptedBlock? no + 0x0030 ImageWidth no + 0x0033 CueTime? no + 0x0035 AudioSampleRate no + 0x0036 ChapterAtom Matroska + 0x0037 CueTrackPositions Matroska + 0x0039 TrackUsed no + 0x003a ImageHeight no + 0x003b CuePoint Matroska + 0x003f CRC-32? no + 0x004b BlockAdditionalID? no + 0x004c LaceNumber? no + 0x004d FrameNumber? no + 0x004e Delay? no + 0x004f ClusterDuration? no + 0x0057 TrackNumber no + 0x005b CueReference Matroska + 0x0060 Video Matroska + 0x0061 Audio Matroska + 0x0067 TimeCode? no + 0x0068 TimeSlice Matroska + 0x006a CueCodecState? no + 0x006b CueRefCodecState? no + 0x006c Void? no + 0x006e BlockAddID? no + 0x0071 CueClusterPosition? no + 0x0077 CueTrack? no + 0x007a ReferencePriority? no + 0x007b ReferenceBlock? no + 0x007d ReferenceVirtual? no + 0x0254 ContentCompressionAlgorithm no + 0x0255 ContentCompressionSettings? no + 0x0282 DocType no + 0x0285 DocTypeReadVersion no + 0x0286 EBMLVersion no + 0x0287 DocTypeVersion no + 0x02f2 EBMLMaxIDLength? no + 0x02f3 EBMLMaxSizeLength? no + 0x02f7 EBMLReadVersion no + 0x037c ChapterLanguage no + 0x037e ChapterCountry no + 0x0444 SegmentFamily? no + 0x0461 DateTimeOriginal no + 0x047a TagLanguage no + 0x0484 TagDefault no + 0x0485 TagBinary no + 0x0487 TagString no + 0x0489 Duration no + 0x050d ChapterProcessPrivate? no + 0x0598 ChapterFlagEnabled? no + 0x05a3 TagName no + 0x05b9 EditionEntry Matroska + 0x05bc EditionUID? no + 0x05bd EditionFlagHidden? no + 0x05db EditionFlagDefault? no + 0x05dd EditionFlagOrdered? no + 0x065c AttachedFileData no + 0x0660 AttachedFileMIMEType no + 0x066e AttachedFileName no + 0x0675 AttachedFileReferral? no + 0x067e AttachedFileDescription no + 0x06ae AttachedFileUID no + 0x07e1 ContentEncryptionAlgorithm no + 0x07e2 ContentEncryptionKeyID? no + 0x07e3 ContentSignature? no + 0x07e4 ContentSignatureKeyID? no + 0x07e5 ContentSignatureAlgorithm no + 0x07e6 ContentSignatureHashAlgorithm no + 0x0d80 MuxingApp no + 0x0dbb Seek Matroska + 0x1031 ContentEncodingOrder? no + 0x1032 ContentEncodingScope? no + 0x1033 ContentEncodingType no + 0x1034 ContentCompression Matroska + 0x1035 ContentEncryption Matroska + 0x135f CueRefNumber? no + 0x136e TrackName no + 0x1378 CueBlockNumber? no + 0x137f TrackOffset? no + 0x13ab SeekID? no + 0x13ac SeekPosition? no + 0x13b8 Stereo3DMode no + 0x14aa CropBottom no + 0x14b0 DisplayWidth no + 0x14b2 DisplayUnit no + 0x14b3 AspectRatioType no + 0x14ba DisplayHeight no + 0x14bb CropTop no + 0x14cc CropLeft no + 0x14dd CropRight no + 0x15aa TrackForced no + 0x15ee MaxBlockAdditionID? no + 0x1741 WritingApp no + 0x1854 SilentTracks Matroska + 0x18d7 SilentTrackNumber no + 0x21a7 AttachedFile Matroska + 0x2240 ContentEncoding Matroska + 0x2264 AudioBitsPerSample no + 0x23a2 CodecPrivate? no + 0x23c0 Targets Matroska + 0x23c3 ChapterPhysicalEquivalent no + 0x23c4 TagChapterUID? no + 0x23c5 TagTrackUID? no + 0x23c6 TagAttachmentUID? no + 0x23c9 TagEditionUID? no + 0x23ca TargetType no + 0x2532 SignedElement? no + 0x2624 TrackTranslate Matroska + 0x26a5 TrackTranslateTrackID? no + 0x26bf TrackTranslateCodec no + 0x26fc TrackTranslateEditionUID? no + 0x27c8 SimpleTag Matroska + 0x28ca TargetTypeValue no + 0x2911 ChapterProcessCommand Matroska + 0x2922 ChapterProcessTime? no + 0x2924 ChapterTranslate Matroska + 0x2933 ChapterProcessData? no + 0x2944 ChapterProcess Matroska + 0x2955 ChapterProcessCodecID? no + 0x29a5 ChapterTranslateID? no + 0x29bf ChapterTranslateCodec no + 0x29fc ChapterTranslateEditionUID? no + 0x2d80 ContentEncodings Matroska + 0x2de7 MinCache? no + 0x2df8 MaxCache? no + 0x2e67 ChapterSegmentUID? no + 0x2ebc ChapterSegmentEditionUID? no + 0x2fab TrackOverlay? no + 0x3373 Tag Matroska + 0x3384 SegmentFileName no + 0x33a4 SegmentUID? no + 0x33c4 ChapterUID? no + 0x33c5 TrackUID? no + 0x3446 TrackAttachmentUID no + 0x35a1 BlockAdditions Matroska + 0x38b5 OutputAudioSampleRate no + 0x3ba9 Title no + 0x3d7b ChannelPositions? no + 0x3e5b SignatureElements Matroska + 0x3e7b SignatureElementList Matroska + 0x3e8a SignatureAlgo no + 0x3e9a SignatureHash no + 0x3ea5 SignaturePublicKey? no + 0x3eb5 Signature? no + 0x7670 Projection Matroska Projection + 0x2b59c TrackLanguage no + 0x3314f TrackTimecodeScale no + 0x383e3 FrameRate no + 0x3e383 VideoFrameRate no + DefaultDuration no + 0x58688 VideoCodecName no + AudioCodecName no + CodecName no + 0x6b240 CodecDownloadURL no + 0xad7b1 TimecodeScale no + 0xeb524 ColorSpace? no + 0xfb523 Gamma no + 0x1a9697 CodecSettings no + 0x1b4040 CodecInfoURL no + 0x1c83ab PrevFileName no + 0x1cb923 PrevUID? no + 0x1e83bb NextFileName no + 0x1eb923 NextUID? no + 0x43a770 Chapters Matroska + 0x14d9b74 SeekHead Matroska + 0x254c367 Tags Matroska + 0x549a966 Info Matroska + 0x654ae6b Tracks Matroska + 0x8538067 SegmentHeader Matroska + 0x941a469 Attachments Matroska + 0xa45dfa3 EBMLHeader Matroska + 0xb538667 SignatureSlot Matroska + 0xc53bb6b Cues Matroska + 0xf43b675 Cluster Matroska + +=head3 Matroska Projection Tags + +Projection tags defined by the Spherical Video V2 specification. See +L<https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md> +for the specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x7671 ProjectionType no + 0x7672 EquirectangularProj QuickTime equi + CubemapProj QuickTime cbmp + ProjectionPrivate no + 0x7673 ProjectionPoseYaw no + 0x7674 ProjectionPosePitch no + 0x7675 ProjectionPoseRoll no + +=head2 MOI Tags + +MOI files store information about associated MOD or TOD files, and are +written by some JVC, Canon and Panasonic camcorders. + + Index1 Tag Name Writable + ------ -------- -------- + 0 MOIVersion no + 6 DateTimeOriginal no + 14 Duration no + 128 AspectRatio no + 132 AudioCodec no + 134 AudioBitrate no + 218 VideoBitrate no + +=head2 MXF Tags + +Tags extracted from Material Exchange Format files. Tag ID's are not listed +because they are bulky 16-byte binary values. + + Tag Name Writable + -------- -------- + AAFManufacturerID? no + AES3PCMDescriptor MXF + AFDAndBarData? no + AGICOAID? no + AICI? no + AIFCSummary? no + ANCPacketCount no + ANCPayloadByteArray no + ANCPayloadSampleCoding no + ANCPayloadSampleCount no + ANCWrappingType no + Abstract no + Abstract no + AccountingReferenceNumber no + ActiveFormatDescriptor no + ActiveLinesperFrame no + ActiveSamplesperLine no + ActiveState no + Ad-ID? no + Address MXF + AddressLine no + AddressLine no + AddressNameValueSets? no + AddressSets? no + AdvertisingMaterialReference no + AestheticValue no + AlphaMaximumRef no + AlphaMinimumRef no + AlphaSampleDepth no + AlphaTransparency no + AlternateName no + AlternateName no + Alternates? no + AnalogDataCodingKind no + AnalogMetadataCarrier no + AnalogMonitoringAndControlCodingKind no + AnalogSystem no + AnalogVideoSystemName no + AnalogVideoSystemName? no + AnamorphicLensCharacteristic no + AnchorOffset no + AncillaryResourceID? no + AngleToNorth no + AngularUnitKind no + Annotation? no + Annotation MXF + AnnotationCueWordsSet? no + AnnotationDescription no + AnnotationDescription no + AnnotationKind no + AnnotationKind no + AnnotationParticipantSets? no + AnnotationSets? no + AnnotationSynopsis no + AnnotationSynopsis no + ApplicationEnvironmentID no + ApplicationInformationArray? no + ApplicationName no + ApplicationName no + ApplicationPlatform no + ApplicationPlatform no + ApplicationPlug-InBatch? no + ApplicationPlug-InInstanceID? no + ApplicationProductID? no + ApplicationScheme? no + ApplicationSchemeBatch? no + ApplicationSupplierName no + ApplicationSupplierName no + ApplicationVersionNumber no + ApplicationVersionString no + ApplicationVersionString no + ApproximateImageContainerSize no + ArchiveID no + AssetValue no + AssignedCategoryName no + AssignedCategoryName no + AssignedCategoryValue no + AssignedCategoryValue no + AssociatedMetadataDefinition? no + AstronomicalBodyName no + AstronomicalBodyName no + AudienceAppreciation no + AudienceRating no + AudienceReach no + AudienceShare no + AudioAverageBitrate no + AudioCodingSchemeCode no + AudioCodingSchemeID? no + AudioCodingSchemeName no + AudioCompressionAlgorithm no + AudioDeviceKind no + AudioDeviceParameter no + AudioDeviceParameterSetting no + AudioEnhancementOrModificationDescription no + AudioFirstMix-DownProcess no + AudioFixedBitrateFlag no + AudioMonoChannelCount no + AudioNoiseReductionAlgorithm no + AudioReferenceLevel no + AudioReferenceLevel no + AudioSampleRate no + AudioSampleRate no + AudioStereoChannelCount no + AudioWatermarkKind no + AuthenticationFlag no + AuxiliaryBitsMode no + AvailableRepresentations? no + AverageBytesPerSecond no + Award MXF + AwardCategory no + AwardCategory no + AwardName no + AwardName no + AwardParticipantSets? no + AwardSets? no + BICI? no + BackgroundMusicFlag no + BankDetailsSet? no + BeginAnchor no + BeginAnchor no + BextCodingHistory no + BextCodingHistory no + Bitrate no + BitsPerAudioSample no + BitsPerPixel no + BitsPerPixel no + BitsPerSample no + BlackReferenceLevel no + BlockAlign no + BlockContinuityCount no + BlockStartOffset no + BoundingRectangle? no + BrandMainTitle no + BrandMainTitle no + BrandOriginalTitle no + BrandOriginalTitle no + Branding MXF + BrandingSets? no + BroadcastChannel no + BroadcastDate no + BroadcastMediumCode no + BroadcastMediumKind no + BroadcastOrganizationName no + BroadcastOrganizationName no + BroadcastRegion no + BroadcastRegion no + BroadcastServiceName no + BroadcastTime no + BroadcasterRightsToCopy no + BufferDelay? no + BuildingName no + BuildingName no + Bypass no + BypassOverride no + ByteOffset no + ByteOrder no + CBEStartOffset no + CDCIEssenceDescriptor MXF + CISACLegalEntityID? no + CaptionDescription MXF + CaptionDescriptionSets? no + CaptionKind no + CaptionKind no + CaptionTitles no + CaptionsDescriptionParticipantSets? no + CaptionsViaTeletext no + CaptureAspectRatio no + CaptureFilmFrameRate no + CaptureGammaEquation no + CaptureGammaEquation no + CaptureGammaEquation? no + CatalogDataStatus no + CatalogDataStatus no + CatalogPrefixNumber no + CatalogingSystemName no + CentralTelephoneNumber no + ChannelAssignment? no + ChannelCount no + ChannelHandle no + ChannelID no + ChannelIDs no + ChannelStatusMode no + CipherAlgorithm? no + CipherAlgorithmAES128CBC? no + Citizenship no + Citizenship no + CityName no + CityName no + ClassDefinitions? no + Classification MXF + ClassificationAndMarkingSystem no + ClassificationComment no + ClassificationComment no + ClassificationNameValueSets? no + ClassificationReason no + ClassificationSets? no + ClassifiedBy no + ClassifyingCountryCode no + ClipCreationDateTime no + ClipFramework MXF + ClipID no + ClipIDArray? no + ClipKind no + ClipNumber no + ClipNumber no + ClipShotSets? no + CloneCount no + ClosedBodyPartition? no + ClosedCaptionSubtitlesFlag no + ClosedCompleteBodyPartition? no + ClosedCompleteHeader MXF Header + ClosedGOPIndicator no + ClosedHeader MXF Header + CodecDefinition? no + CodecDefinition? no + CodecDefinitions? no + CodecEssenceDescriptor? no + CodecEssenceKinds? no + CodedContentScanningKind no + CodingLawKind no + CodingLawName no + CodingStyleDefault? no + CollectionName no + CollectionName no + ColorDescriptor no + ColorDescriptor no + ColorFieldCode no + ColorPrimaries no + ColorPrimaries? no + ColorRangeLevels no + ColorSiting no + ColorimetryCode no + ColorimetryCode? no + CommunicationSets? no + Communications MXF + CompleteFooter? no + ComponentAttributes? no + ComponentDataDefinition no + ComponentDepth no + ComponentKLVData? no + ComponentMaximumRef no + ComponentMinimumRef no + ComponentUserComments? no + ComponentsInSequence? no + CompositionRendering? no + ComputedKeyData no + ComputedKeyFrames no + ComputedKeySounds no + ComputedKeywords no + ComputedKeywords no + ComputedObjectKind no + ComputedObjectKind no + ComputedStratumKind no + ConstantBPictureFlag no + ConsumerRightsToCopy no + ContactDepartmentName no + ContactDepartmentName no + ContactID? no + ContactKind no + ContactKind no + ContactNameValueSets? no + ContactsList MXF + ContactsListSet? no + ContainerDefinitions? no + ContainerLastModifyDate no + ContainerVersion no + ContentClassification no + ContentClassification no + ContentCodingSystem no + ContentMaturityDescription no + ContentMaturityGraphic no + ContentMaturityRating no + ContentPackageIndexArray? no + ContentPackageMetadataLink no + ContentStorage? no + ContentStorageSet MXF + ContentValue no + ContextDescription no + ContiguousDataFlag no + Contract MXF + ContractClauseDescription no + ContractClauseDescription no + ContractDateTime no + ContractEntity no + ContractInstallmentPercentage no + ContractLineCode no + ContractLineName no + ContractLineName no + ContractParticipantSets? no + ContractSets? no + ContractTermsOfBusiness no + ContractTermsOfBusiness no + ContractType no + ContractType no + ContractTypeCode no + ContractTypeLink no + ContributionStatus no + ContributionStatus no + ControlPointList? no + ControlPointTime no + CopyCount no + CopyrightLicenseCountryCode no + CopyrightLicenseRegionCode no + CopyrightLicenseRegionName no + CopyrightOwnerName no + CopyrightOwnerName no + CopyrightStatus no + CopyrightStatus no + CornerLatitudePoint1 no + CornerLatitudePoint1 no + CornerLatitudePoint2 no + CornerLatitudePoint2 no + CornerLatitudePoint3 no + CornerLatitudePoint3 no + CornerLatitudePoint4 no + CornerLatitudePoint4 no + CornerLongitudePoint1 no + CornerLongitudePoint1 no + CornerLongitudePoint2 no + CornerLongitudePoint2 no + CornerLongitudePoint3 no + CornerLongitudePoint3 no + CornerLongitudePoint4 no + CornerLongitudePoint4 no + CountryCodeMethod no + CountryCodeMethod no + CountryName no + CountryName no + CountryName no + CountryName no + CreateDate no + CryptographicContext MXF + CryptographicContextID? no + CryptographicContextLink? no + CryptographicContextObject? no + CryptographicFramework MXF + CryptographicFrameworkLabel? no + CryptographicKeyID? no + Csiz no + Cue-InWords no + Cue-InWords no + Cue-OutWords no + Cue-OutWords no + CueWords MXF + CulturalValue no + CurrencyCode no + CurrencyName no + CurrentNumberInSequence no + CurrentNumberInSequence no + CurrentRepeatNumber no + CutPoint no + DMFramework MXF + DMSegment MXF + DMSet MXF + DMSourceClip MXF + DOI? no + DVBParentalRating no + DataDefinition? no + DataDefinitions? no + DataDeviceKind no + DataDeviceParameterName no + DataDeviceParameterSetting no + DataEnhancementOrModificationDescription no + DataEssenceCoding no + DataEssenceCodingID? no + DateTimeDropFrameFlag no + DateTimeEmbeddedFlag no + DateTimeKind? no + DateTimeRate no + DeclassificationDate no + DefaultDataValue? no + DefaultFadeDuration no + DefaultFadeEditRate no + DefaultFadeType? no + DefaultNamespaceURI no + DefaultNamespaceURI no + DefaultObject? no + DefinedName no + DefinedName no + DefinitionObjectID? no + DefinitionObjectName no + DefinitionObjectName no + DegradedEffects? no + DeltaEntryArray? no + DerivedFrom no + Description no + Description no + DescriptionKind no + DescriptionKind no + DescriptiveComment no + DescriptiveComment no + DescriptiveMetadataApplicationEnvironmentID no + DescriptiveMetadataFramework? no + DescriptiveMetadataPlug-InID? no + DescriptiveMetadataScheme? no + DescriptiveMetadataSchemes? no + DescriptiveMetadataSetReferences? no + DescriptiveMetadataSets? no + DescriptiveMetadataTrackIDs no + DeviceAbsoluteHeading no + DeviceAbsolutePositionalAccuracy no + DeviceAbsoluteSpeed no + DeviceAltitude no + DeviceAltitude no + DeviceAssetNumber no + DeviceDesignation no + DeviceIDKind no + DeviceKind no + DeviceKind no + DeviceKindCode no + DeviceLatitude no + DeviceLatitude no + DeviceLatitude no + DeviceLongitude no + DeviceLongitude no + DeviceLongitude no + DeviceManufacturerName no + DeviceManufacturerName no + DeviceModel no + DeviceParameterNameValueSets? no + DeviceParameters MXF + DeviceParametersSets? no + DeviceRelativeHeading no + DeviceRelativePositionX no + DeviceRelativePositionY no + DeviceRelativePositionZ no + DeviceRelativePositionalAccuracy no + DeviceRelativeSpeed no + DeviceSerialNumber no + DeviceUsageDescription no + DeviceUsageDescription no + DeviceXDimension no + DeviceYDimension no + DialNorm no + Dictionary? no + DictionaryDescription no + DictionaryDescription no + DictionaryIdentifier? no + DigitalEncodingBitrate no + DigitalMetadataCarrier no + DigitalOrAnalogOrigination no + DigitalVideoFileFormat no + DirectorName no + DiscPartitionCapacity no + DisplayF2Offset no + DisplayHeight no + DisplayUnits no + DisplayUnits no + DisplayWidth no + DisplayXOffset no + DisplayYOffset no + Dither no + DropFrame no + Duration no + DynamicSourcePackageID? no + DynamicSourceTrackIDs no + E-mailAddress no + E-mailAddress no + EPGProgramSynopsis no + EdgeCode no + EdgeCodeFilmGauge? no + EdgeCodeFormat? no + EdgeCodeHeader? no + EdgeCodeStart no + EditHint? no + EditRate no + EditUnitFlags no + EditUnitLength no + EditingEventComment no + EditingEventComment no + EffectRendering? no + ElectrospatialFormulation no + ElementCount no + ElementDelta no + ElementLength no + ElementNameList no + Emphasis no + EncryptedContainerLabel? no + EncryptedSourceValue? no + EncryptedTrackFileID? no + EndAnchor no + EndAnchor no + EnhancementOrModificationDescription no + EnumerationUnderlyingIntegerType? no + EpisodeEndNumber no + EpisodeNumber no + EpisodeNumber no + EpisodeStartNumber no + EpisodicItemSets? no + EssenceContainerArray? no + EssenceContainerDataSet MXF + EssenceContainerFormat? no + EssenceContainerFormat? no + EssenceContainers? no + EssenceData? no + EssenceDescription? no + EssenceIsIdentified no + EssenceLength no + EssenceLocators? no + EssenceStreamID no + Event MXF + EventAbsoluteDuration no + EventAbsoluteDuration? no + EventAbsoluteDurationFrameCount no + EventAnnotationSets? no + EventElapsedTimeToEnd no + EventElapsedTimeToStart no + EventEndTimeOffset no + EventEndTimecodeOffset? no + EventIndication no + EventIndication no + EventOrigin no + EventSets? no + EventStart no + EventStartTimeOffset no + EventStartTimecodeOffset? no + EventTrack MXF + EventTrackEditRate no + ExCCIData? no + ExposedAspectRatio no + ExtendedCaptionsLanguageCode no + ExtendedClipID no + ExtendedClipIDArray? no + ExtendedTextLanguageCode no + ExtendibleElementNameList no + FNumber no + Fade-InDuration no + Fade-InType? no + Fade-OutDuration no + Fade-OutType? no + FamilyName no + FamilyName no + FaxNumber no + FaxNumber no + FemaleLeadActressName no + FestivalName no + FestivalName no + FieldDominance no + FieldFrameTypeCode no + FieldOfViewHorizontal no + FieldOfViewHorizontal no + FieldOfViewVertical no + FieldOfViewVerticalFP no + FieldRate no + FileDescriptor MXF + FileDescriptors? no + FileSecurityReport no + FileSecurityWave no + FillerData? no + FilmBatchNumber no + FilmBatchNumber no + FilmCaptureAperture no + FilmColorProcess no + FilmFormatName no + FilmFormatName no + FilmFormatName? no + FilmGauge? no + FilmStockKind no + FilmStockKind no + FilmStockManufacturerName no + FilmStockManufacturerName no + FilmTestParameter no + FilmTestResult no + FilmTestResult? no + FilmToVideoTransferDirection? no + FilmToVideoTransferKind? no + FilmToVideoTransferPhase? no + FilteringApplied no + FilteringCode no + FirstBroadcastFlag no + FirstGivenName no + FirstGivenName no + FirstNumberInSequence no + FirstNumberInSequence no + FirstTransmissionInfo no + FixedArrayElementType? no + FixedChannelStatusData? no + FixedUserData? no + FocalLength no + FocalLength no + Footer? no + FormatDescriptor no + FormatDescriptor no + FormerFamilyName no + FormerFamilyName no + FrameCenterElevation no + FrameCenterLatitude no + FrameCenterLatitude no + FrameCenterLatitude no + FrameCenterLatitudeLongitude no + FrameCenterLongitude no + FrameCenterLongitude no + FrameCenterLongitude no + FrameCode no + FrameCount no + FrameCountOffset no + FrameLayout no + FramePositionalAccuracy no + FrameRate no + FrameworkExtendedTextLanguageCode no + FrameworkTextLanguageCode no + FrameworkThesaurusName no + FrameworkThesaurusName no + FrameworkTitle no + FrameworkTitle no + GenerationCloneNumber no + GenerationCopyNumber no + GenerationID? no + GenericDataEssenceDescriptor MXF + GenericPackage MXF + GenericPayloads? no + GenericPictureEssenceDescriptor MXF + GenericSoundEssenceDescriptor MXF + GenericTrack MXF + Genre no + Genre no + GeographicAreaNorthwest? no + GeographicAreaSourceDatum no + GeographicAreaSoutheast? no + GeographicLocation? no + GeographicPolygonCoordinates? no + GeographicPolygonSourceDatum no + GeographicalCoordinates? no + GlobalNumber no + GraphicKind no + GraphicUsageKind no + GraphicUsageKind no + GroupRelationship MXF + GroupSet? no + GroupSets? no + GroupSynopsis no + GroupSynopsis no + HMACAlgorithmSHA1128? no + HTMLDOCTYPE no + HTMLDOCTYPE no + HTMLMetaDescription no + HTMLMetaDescription no + HardwareAcceleratorFlag no + HasAudioWatermark no + HasVideoWatermark no + HeaderByteCount no + HistoricalValue no + HonorsAndQualifications no + HonorsAndQualifications no + HorizontalActionSafePercentage no + HorizontalDatum no + HorizontalGraphicsSafePercentage no + HorizontalSubsampling no + IBTN? no + IEEEDeviceID no + IEEEManufacturerID no + ISAN? no + ISBD? no + ISBN? no + ISCI? no + ISMN? no + ISO3166CountryCode no + ISO639-1LanguageCode no + ISO639-1LanguageCode no + ISO639CaptionsLanguageCode no + ISO639TextLanguageCode no + ISRC? no + ISRN? no + ISSN? no + ISTC? no + ISWC? no + IdenticalGOPIndicator no + Identification MXF + Identification MXF + IdentificationList? no + IdentificationSets? no + IdentificationUL? no + IdentifierIssuingAuthority no + IdentifierIssuingAuthority no + IdentifierKind no + IdentifierValue no + ImageAlignmentOffset no + ImageCategory no + ImageCoordinateSystem no + ImageEndOffset no + ImageFormatSet? no + ImageHeight no + ImageSourceDeviceKind no + ImageSourceDeviceKind no + ImageStartOffset no + ImageWidth no + IncludeSync no + IndexByteCount no + IndexDuration no + IndexEditRate no + IndexEntryArray? no + IndexStreamID no + IndexTableSegment? no + IndexingStartPosition no + IndividualAwardName no + InkNumber no + InputSegment? no + InputSegmentCount no + InputSegments? no + InsertMusicFlag no + InstallmentNumber no + InstanceUID? no + IntegrationIndication no + IntegrationIndication no + IntellectualPropertyDescription no + IntellectualPropertyDescription no + IntellectualPropertyLicenseCountryCode no + IntellectualPropertyLicenseRegionCode no + IntellectualPropertyLicenseRegionName no + IntellectualPropertyRights no + IntellectualPropertyRights no + IntendedAFD no + IntentDescriptor no + IntentDescriptor no + InterestedPartyName no + Interpolation? no + InterpolationDefinitions? no + IsConcrete no + IsDubbed no + IsLiveProduction no + IsLiveTransmission no + IsOptional no + IsRecording no + IsRepeat no + IsSearchable no + IsSigned no + IsUniqueIdentifier no + IsVoiceover no + ItemDesignatorID? no + ItemID no + ItemName no + ItemName no + ItemValue no + ItemValue no + JFIFMarkerDescription no + JFIFMarkerDescription no + JPEG2000PictureSubDescriptor MXF + JPEGTableID? no + JobFunctionCode no + JobFunctionName no + JobFunctionName no + JobTitle no + JobTitle no + Jurisdiction no + Jurisdiction no + KAGSize no + KLVDataDefinitions? no + KLVDataParentProperties? no + KLVDataType? no + KLVDataValue? no + KLVMetadataSequence? no + KeyCode? no + KeyData no + KeyDataOrProgram no + KeyFrame no + KeyFrameSampleCount no + KeyFrames no + KeyPoint MXF + KeyPointSets? no + KeySound no + KeySounds no + KeyText no + KeyTimePoint no + KeypointKind no + KeypointKind no + KeypointValue no + KeypointValue no + Keywords no + Keywords no + LUID no + LanguageName no + LanguageName no + LastNumberInSequence no + LastNumberInSequence no + LayerNumber no + LeadingLines no + LengthSystemName no + LengthUnitKind no + LicenseOptionsDescription no + LineNumber no + LinkedApplicationPlug-InInstanceID? no + LinkedDescriptiveFrameworkPlug-InID? no + LinkedDescriptiveObjectPlug-InID? no + LinkedGenerationID? no + LinkedPackageID? no + LinkedTimecodeTrackID? no + LinkedTrackID no + LinkingName no + LinkingName no + LocalCreationDateTime no + LocalDatumAbsolutePositionAccuracy no + LocalDatumRelativePositionAccuracy no + LocalEndDateTime no + LocalEventEndDateTime no + LocalEventEndDateTime no + LocalEventStartDateTime no + LocalEventStartDateTime no + LocalFestivalDateTime no + LocalFilePath no + LocalFilePath no + LocalID no + LocalLastModifyDate no + LocalModifyDate no + LocalStartDateTime no + LocalTagEntries? no + LocalTagUniqueID? no + LocalTagValue no + LocalTapeNumber no + LocalTargetID no + LocalTargetID no + LocalUserDateTime no + Location MXF + LocationDescription no + LocationDescription no + LocationKind no + LocationKind no + LocationSets? no + LockedIndicator no + LogoFlag no + LowDelayIndicator no + LumaEquation no + LuminanceSampleRate no + MIC? no + MICAlgorithm? no + MIMECharSet no + MIMECharSet no + MIMEEncoding no + MIMEEncoding no + MIMEMediaType no + MIMEMediaType no + MPEG2VideoDescriptor MXF + MPEG7BiMAccessUnitFrame1? no + MPEG7BiMAccessUnitFrame2? no + MPEG7BiMAccessUnitFrame3? no + MPEG7BiMAccessUnitFrame4? no + MPEG7BiMAccessUnitFrame5? no + MPEG7BiMAccessUnitFrame6? no + MPEG7BiMAccessUnitFrame7? no + MPEG7BiMAccessUnitFrame8? no + MPEG7BiMDecoderInitFrame1? no + MPEG7BiMDecoderInitFrame2? no + MPEG7BiMDecoderInitFrame3? no + MPEG7BiMDecoderInitFrame4? no + MPEG7BiMDecoderInitFrame5? no + MPEG7BiMDecoderInitFrame6? no + MPEG7BiMDecoderInitFrame7? no + MPEG7BiMDecoderInitFrame8? no + MPEGAudioBitrate no + MPEGAudioRecodingDataset? no + MPEGVideoRecodingDataset? no + MagneticDiskNumber no + MagneticTrack no + MainCatalogNumber no + MainName no + MainName no + MainSponsorName no + MainTitle no + MainTitle no + MajorVersion no + MaleLeadActorName no + ManufacturerID? no + ManufacturerInformationObject? no + MapDatumUsed no + MarkIn no + MarkOut no + MaterialAbsoluteDuration no + MaterialAbsoluteDuration? no + MaterialEndTimeOffset no + MaterialEndTimecodeOffset? no + MaterialPackage MXF + MaximumAPIVersion no + MaximumBPictureCount no + MaximumGOPSize no + MaximumSupportedEngineVersion no + MaximumSupportedPlatformVersion no + MaximumUseCount no + MediaLocation no + MemberNameList no + MemberTypes? no + MetadataEncodingSchemeCode no + MetadataItemName no + MetadataItemName no + MetadataServerLocators? no + MicrophonePlacementTechniques no + MinimumAPIVersion no + MinimumSupportedEngineVersion no + MinimumSupportedPlatformVersion no + MinorVersion no + MissionID no + MissionID no + MobileTelephoneNumber no + ModifyDate no + MonoSourceTrackIDs no + MultipleDescriptor MXF + NITFLayerTargetID no + NITFLayerTargetID no + NMEADocumentText no + NOLACode no + NameSuffix no + NameSuffix no + NameValue MXF + NamespacePrefix no + NamespacePrefix no + NamespacePrefixes no + NamespacePrefixes no + NamespaceURI no + NamespaceURI no + NamespaceURIs no + NamespaceURIs no + Nationality no + Nationality no + NatureOfPersonality no + NatureOfPersonality no + NetworkLocator MXF + NextNumberInSequence no + NextNumberInSequence no + NielsenStreamIdentifier no + NominationCategory no + NominationCategory no + Non-USClassifyingCountryCode no + ObjectAreaDimension no + ObjectClass? no + ObjectClassDefinition? no + ObjectCountryCode no + ObjectCountryCode no + ObjectCountryCodeMethod no + ObjectDescription no + ObjectDescription no + ObjectDescriptionCode no + ObjectHorizontalAverageDimension no + ObjectIdentificationConfidence no + ObjectKind no + ObjectKind no + ObjectModelVersion no + ObjectName no + ObjectRegionCode no + ObjectRegionName no + ObjectVerticalAverageDimension no + ObliquityAngle no + OffsetToIndexTable no + OffsetToIndexTable no + OffsetToMetadata no + OffsetToMetadata no + OpenBodyPartition? no + OpenCompleteBodyPartition? no + OpenCompleteHeader MXF Header + OpenHeader MXF Header + OperatingSystemInterpretations no + OperationCategory? no + OperationDataDefinition? no + OperationDefinitionID? no + OperationDefinitions? no + OperationParameters? no + OperationalPatternUL? no + OpticalDiscNumber no + OpticalTestParameterName no + OpticalTestResult no + OpticalTestResult no + OpticalTrack no + Organisation MXF + OrganizationCode no + OrganizationCode no + OrganizationID no + OrganizationID no + OrganizationIDKind no + OrganizationIDKind no + OrganizationKind no + OrganizationKind no + OrganizationMainName no + OrganizationMainName no + OrganizationSets? no + OrganizationalProgramNumber no + OrganizationalProgramNumber no + Origin no + OriginCode no + OriginalExtendedSpokenPrimaryLanguageCode no + OriginalProducerName no + OriginalProducerName no + OriginalTitle no + OriginalTitle no + OtherGivenNames no + OtherGivenNames no + OtherValues no + PII? no + POSIXMicroseconds no + PURL no + PackLength no + PackageAttributes? no + PackageID? no + PackageKLVData? no + PackageLastModifyDate no + PackageMarkInPosition no + PackageMarkOutPosition no + PackageMarker? no + PackageName no + PackageName no + PackageTimelineMarkerRef? no + PackageTracks? no + PackageUsageKind? no + PackageUserComments? no + Packages? no + PaddingBits no + Palette? no + PaletteLayout? no + PanScanInformation? no + ParameterDataType? no + ParameterDefinition? no + ParameterDefinitions? no + Parameters? no + ParentClass? no + Participant MXF + ParticipantID? no + ParticipantOrganizationSets? no + PartitionMetadata? no + Password no + Password no + PayeeAccountName no + PayeeAccountNumber no + PayeeAccountSortCode no + PayerAccountName no + PayerAccountNumber no + PayerAccountSortCode no + PaymentDueDateTime no + PaymentsSets? no + PeakChannelCount no + PeakEnvelope no + PeakEnvelopeBlockSize no + PeakEnvelopeData? no + PeakEnvelopeData? no + PeakEnvelopeFormat no + PeakEnvelopeTimestamp no + PeakEnvelopeVersion no + PeakFrameCount no + PeakOfPeaksPosition no + PerceivedDisplayFormatCode no + PerceivedDisplayFormatName no + PerforationsPerFrame no + PerforationsPerFrame no + Person MXF + PersonDescription no + PersonDescription no + PersonOrganizationSets? no + PersonSets? no + PhysicalInstanceKind no + PhysicalMediaLength? no + PhysicalMediaLocation no + PictureComponentSizing? no + PictureDisplayRate no + PictureFormat MXF + PixelLayout? no + PlaceKeyword no + PlaceKeyword no + PlaceName no + PlaceName no + PlaintextOffset no + PlatformDesignation no + PlatformDesignation no + PlatformHeadingAngle no + PlatformModel no + PlatformPitchAngle no + PlatformRollAngle no + PlatformSerialNumber no + Plug-InAPIID? no + Plug-InCategoryID? no + Plug-InDefinitions? no + Plug-InEngineID? no + Plug-InLocatorSet? no + Plug-InPlatformID? no + PointsPerPeakValue no + PolarCharacteristic no + PosTableArray? no + PositionInSequence no + PositionTable? no + PositionTableCount no + PositionTableIndexing no + PositionWithinViewportImageXCoordinate no + PositionWithinViewportImageYCoordinate no + PostCodeForPostbox no + PostalCode no + PostalCode no + PostalTown no + PostalTown no + PostboxNumber no + Preface MXF + PresentationAspectRatio no + PresentationGammaEquation no + PresentationGammaEquation? no + PresenterName no + PreviousNumberInSequence no + PreviousNumberInSequence no + PreviousRepeatNumber no + PrimaryExtendedSpokenLanguageCode no + PrimaryOriginalLanguageCode no + PrimaryPackage? no + PrimarySpokenLanguageCode no + Primer MXF + Processing MXF + ProcessingSet? no + ProducerName no + ProductFormat no + ProductFormat no + ProductionFramework MXF + ProductionOrganizationRole no + ProductionOrganizationRole no + ProductionScriptReference no + ProductionScriptReference no + ProductionSettingPeriodSets? no + ProfileAndLevel no + ProgramAwardName no + ProgramCommercialMaterialReference no + ProgramIdentifier no + ProgramIdentifierString no + ProgramKind no + ProgramMaterialClassificationCode no + ProgramNumber no + ProgramSupportMaterialReference no + ProgrammingGroupKind no + ProgrammingGroupKind no + ProgrammingGroupTitle no + ProgrammingGroupTitle no + ProjectName no + ProjectName no + ProjectNumber no + ProjectSet? no + Projects MXF + Properties? no + PropertyType? no + Publication MXF + PublicationSets? no + PublishingMediumName no + PublishingMediumName no + PublishingOrganizationName no + PublishingOrganizationName no + PublishingRegionName no + PublishingRegionName no + PublishingServiceName no + PublishingServiceName no + PulldownFieldDominance no + PulldownSequence? no + PurchaserAccountName no + PurchaserAccountName no + PurchaserAccountNumber no + PurchaserIdentificationKind no + PurchaserIdentificationValue no + PurchasingDepartment no + PurchasingOrganizationName no + Purpose no + Purpose no + QltyBasicData no + QltyBasicData no + QltyCueSheet no + QltyCueSheet no + QltyEndOfModulation no + QltyEndOfModulation no + QltyOperatorComment no + QltyOperatorComment no + QltyQualityEvent no + QltyQualityEvent no + QltyQualityParameter no + QltyQualityParameter no + QltyStartOfModulation no + QltyStartOfModulation no + QualityFlag no + QuantizationDefault? no + RGBAEssenceDescriptor MXF + RIFFChunkData? no + RIFFChunkID no + RIFFChunkLength no + RP217DataStreamPID no + RP217VideoStreamPID no + RandomIndexMetadata? no + RandomIndexMetadataV10? no + Rating no + RecordedFormat no + RecordedFormat no + RecordedTrackNumber no + RecordingLabelName no + RecordingLabelName no + ReelOrRollNumber no + RegionCode no + RegionName no + RegionName no + RegisterAction no + RegisterAdministrationArray? no + RegisterAdministrationNotes no + RegisterAdministrationObject? no + RegisterApproverName no + RegisterChildEntryArray? no + RegisterCreationTime no + RegisterEditorName no + RegisterEntryAdministrationObject? no + RegisterEntryArray? no + RegisterEntryStatus? no + RegisterItemDefiningDocumentName no + RegisterItemDefinition no + RegisterItemHierarchyLevel no + RegisterItemIntroductionVersion no + RegisterItemName no + RegisterItemNotes no + RegisterItemOriginatorName no + RegisterItemStatusChangeDateTime no + RegisterItemSymbol? no + RegisterItemUL? no + RegisterKind? no + RegisterReleaseDateTime no + RegisterStatusKind? no + RegisterUserName no + RegisterUserTime no + RegisterVersion no + RegistrantName no + RelatedMaterialDescription no + RelatedMaterialDescription no + RelatedMaterialLocators? no + RelativePositionInSequenceName no + RelativePositionInSequenceOffset no + RelativeScope no + RelativeTrack no + ReleasableCountryCode no + ReleasableCountryCode no + RenamedType? no + ResourceID? no + RestrictionsonUse no + ReversePlay no + ReversedByteOrder no + Rights MXF + RightsComment no + RightsComment no + RightsConditionDescription no + RightsConditionDescription no + RightsManagementAuthority no + RightsManagementAuthority no + RightsSets? no + RightsStartDateTime no + RightsStopDateTime no + Rightsholder no + Rightsholder no + RoleName no + RoleName no + RoomNumber no + RoomNumber no + RoomOrSuiteName no + RoomOrSuiteName no + RootFormatVersion no + RootMetaDictionary? no + RootObjectDirectory? no + RootPreface? no + RoundedCaptureFilmFrameRate no + RoundedTimecodeTimebase no + RoundingLaw no + RoundingMethodCode no + RoyaltyIncomeInformation no + RoyaltyPaymentInformation no + Rsiz no + SDKVersion no + SICI? no + SMPTE12MUserDateTime? no + SMPTE309MUserDateTime? no + SMPTE337MDataStreamNumber no + SMPTEUL? no + SalesContractNumber no + Salutation no + Salutation no + SampleIndex? no + SampleRate no + SampledHeight no + SampledWidth no + SampledXOffset no + SampledYOffset no + SamplingHierarchyCode no + SamplingStructureCode no + ScanningDirection no + SceneFramework MXF + SceneNumber no + SceneNumber no + SceneSettingPeriodSets? no + SceneShotSets? no + ScramblingKeyKind no + ScramblingKeyValue no + Scripting MXF + ScriptingKind no + ScriptingKind no + ScriptingLocators? no + ScriptingSets? no + ScriptingText no + ScriptingText no + SeasonEpisodeNumber no + SeasonEpisodeTitle no + SecondGivenName no + SecondGivenName no + SecondaryExtendedSpokenLanguageCode no + SecondaryOriginalExtendedSpokenLanguageCode no + SecondaryOriginalLanguageCode no + SecondarySpokenLanguageCode no + SecondaryTitle no + SecondaryTitle no + SectorSize no + SecurityClassification no + SecurityClassification no + SecurityClassificationCaveats no + SecurityClassificationCaveats no + Selected? no + SensorMode no + SensorRollAngle no + SensorSize no + SensorType no + SensorTypeCode no + Sequence? no + SequenceOffset no + SequenceSet MXF + SeriesNumber no + SeriesNumber no + SeriesinaSeriesGroupCount no + SetElementType? no + SettingCityName no + SettingCityName no + SettingCountryCode no + SettingCountryName no + SettingCountryName no + SettingDateTime no + SettingDescription no + SettingDescription no + SettingPeriod MXF + SettingPeriodDescription no + SettingPeriodDescription no + SettingPostalCode no + SettingPostalCode no + SettingRegionCode no + SettingRegionName no + SettingRoomNumber no + SettingRoomNumber no + SettingStateOrProvinceOrCountyName no + SettingStateOrProvinceOrCountyName no + SettingStreetName no + SettingStreetName no + SettingStreetNumberOrBuildingName no + SettingStreetNumberOrBuildingName no + SettingTownName no + SettingTownName no + ShimName no + ShootingCountryCode no + ShootingRegionCode no + ShootingRegionName no + Shot MXF + ShotComment no + ShotComment no + ShotCommentKind no + ShotCommentKind no + ShotCueWordsSet? no + ShotDescription no + ShotDescription no + ShotDuration no + ShotList no + ShotLocationSets? no + ShotParticipantRoleSets? no + ShotPersonSets? no + ShotStartPosition no + ShotTrackIDs no + SideNumber no + Signal-to-NoiseRatio no + SignalFormCode no + SignalStandard no + SignalStandard no + SignatureTuneFlag no + SimpleFlaggingCount no + SingleSequenceFlag no + Size no + SlantRange no + SlateInformation no + SlateTitle no + SliceCount no + SliceNumber no + SliceOffsetList? no + Software-OnlySupportFlag no + SourceClip? no + SourceContainerFormat? no + SourceImageCenterXCoordinate no + SourceImageCenterYCoordinate no + SourceIndex? no + SourceKey? no + SourceLength no + SourceOrganization no + SourceOrganization no + SourcePackage MXF + SourcePackageID? no + SourceSpecies? no + SourceTrackID no + SourceTrackIDs no + SourceValue? no + SpeedChangeEffectFlag no + SplicingMetadata? no + StartTimeRelativeToReference no + StartTimeRelativeToReference no + StartTimecode no + StartTimecodeRelativeToReference? no + StateOrProvinceOrCountyName no + StateOrProvinceOrCountyName no + StaticTrack MXF + StillFrame? no + StorageDeviceKind no + StorageKind no + StorageKind no + StorageKindCode no + StorageMediaID no + StorageMediaKind no + StoredANCLineNumber no + StoredF2Offset no + StoredVBILineNumber no + StratumKind no + StreamData? no + StreamElementType? no + StreamID no + StreamOffset no + StreamPositionIndicator no + StreamPositionIndicator no + StreamPositionIndicator no + StreamPositionIndicator no + StreetName no + StreetName no + StreetNumber no + StreetNumber no + StringElementType? no + StructuralComponent MXF + Sub-descriptors? no + SubDescriptor? no + SubDescriptors? no + SubjectAbsoluteHeading no + SubjectAbsoluteSpeed no + SubjectDistance no + SubjectName no + SubjectName no + SubjectRelativeHeading no + SubjectRelativePositionalAccuracy no + SubjectRelativeSpeed no + SubtitleDatafileFlag no + SubtitlesPresent no + SupplementaryName no + SupplementaryName no + SupplementaryOrganizationName no + SupplementaryOrganizationName no + SupplierAccountName no + SupplierAccountName no + SupplierAccountNumber no + SupplierIdentificationKind no + SupplierIdentificationValue no + SupplyContractNumber no + SupplyingDepartmentName no + SupportOrAdministrationStatus no + SupportOrAdministrationStatus no + SupportOrganizationRole no + SupportOrganizationRole no + SystemNameOrNumber no + TIFFSummary? no + TaggedValueDefinitions? no + TaggedValueParentProperties? no + TakeNumber no + TapeBatchNumber no + TapeBatchNumber no + TapeCapacity no + TapeFormat? no + TapeFormulation no + TapeFormulation no + TapeManufacturer no + TapeManufacturer no + TapePartitionCapacity no + TapeShellKind no + TapeShellKind no + TapeStock no + TapeStock no + TargetAudience no + TargetAudience no + TargetClassOfStrongReference? no + TargetClassOfWeakReference? no + TargetSet? no + TargetWidth no + TechnicalValue no + TelephoneNumber no + TelephoneNumber no + TeletextSubtitlesAvailable no + TeletextSubtitlesFlag no + TemporalOffset no + TerminatingFillerData no + TextLocator MXF + TextlessBlackDuration no + TextlessMaterial no + TextualDescriptionKind no + TextualDescriptionKind no + Theme no + Theme no + ThemeMusicFlag no + ThesaurusName no + ThesaurusName no + ThirdGivenName no + ThirdGivenName no + TimePeriodName no + TimePeriodName no + TimeSystemOffset no + TimeUnitKind no + TimebaseReferenceTrackID no + TimecodeArray? no + TimecodeComponent MXF + TimecodeCreationDateTime? no + TimecodeEndDateTime? no + TimecodeEventEndDateTime? no + TimecodeEventStartDateTime? no + TimecodeKind no + TimecodeLastModifyDate? no + TimecodeModifyDate? no + TimecodeSourceKind no + TimecodeStartDateTime? no + TimecodeStreamData? no + TimecodeTimebase no + TimecodeTimebase no + TimecodeUserBitsFlag no + TimepointValue? no + TimingBiasCorrection no + TimingBiasCorrectionDescription no + TitleKind no + TitleKind no + Titles MXF + TitlesSets? no + ToleranceInterpolationMethod? no + ToleranceMode? no + ToleranceWindow? no + ToolkitVersion no + TotalCurrencyAmount no + TotalEpisodeCount no + TotalIncome no + TotalLinesperFrame no + TotalNumberInSequence no + TotalPayment no + TotalSamplesperLine no + Track MXF + TrackID no + TrackName no + TrackName no + TrackNumber no + TrackNumberBatch no + Tracks? no + TrafficID no + TrailingLines no + TranscriptReference no + TranscriptReference no + TransferFilmFrameRate no + TransitionEffect? no + TransmissionID no + TransportStreamID no + TripletSequenceNumber no + TypeDefinitionElementValueList no + TypeDefinitionExtendibleElementValues? no + TypeDefinitions? no + UCSEncoding no + UPID? no + UPN? no + URL no + URL no + URL no + URL no + URN no + UTCEndDateTime no + UTCEventEndDateTime no + UTCEventEndDateTime no + UTCEventStartDateTime no + UTCEventStartDateTime no + UTCInstantDateTime no + UTCInstantDateTime no + UTCLastModifyDate no + UTCLastModifyDate no + UTCStartDateTime no + UTCStartDateTime no + UTCUserDateTime no + UniformDataFlag no + UnknownBWFChunks? no + UpstreamAudioCompressionAlgorithm no + UseDefaultValue no + UserDataMode? no + UserName no + UserName no + UserPosition no + V10IndexTableSegment? no + VBEEndOffset no + VBIDataDescriptor MXF + VBILineCount no + VBIPayloadByteArray no + VBIPayloadSampleCoding no + VBIPayloadSampleCount no + VBIWrappingType no + VC-1AverageBitrate no + VC-1BPictureCount no + VC-1CodedContentType no + VC-1IdenticalGOP no + VC-1InitializationMetadata? no + VC-1Level no + VC-1MaximumBitrate no + VC-1MaximumGOP no + VC-1Profile no + VC-1SingleSequence no + Value? no + VariableArrayElementType? no + VersionNumber no + VersionNumberString no + VersionNumberString no + VersionTitle no + VersionTitle no + VerticalActionSafePercentage no + VerticalDatum no + VerticalGraphicsSafePercentage no + VerticalSub-sampling no + VideoAndFilmFrameRelationship no + VideoAverageBitrate no + VideoClipDuration no + VideoCodingSchemeID no + VideoColorKind no + VideoCompressionAlgorithm no + VideoDeviceKind no + VideoDeviceParameterName no + VideoDeviceParameterSetting no + VideoFixedBitrate no + VideoIndexArray? no + VideoLineMap no + VideoNoiseReductionAlgorithm no + VideoOrImageCompressionAlgorithm no + VideoPayloadIdentifier no + VideoPayloadIdentifier2002 no + VideoTestParameter no + VideoTestResult no + VideoTestResult no + VideoWatermarkKind no + ViewportAspectRatio no + ViewportHeight no + ViewportImageCenterCCoordinate no + ViewportImageCenterYCoordinate no + ViewportWidth no + VoiceTalentName no + WAVESummary? no + WaveAudioDescriptor MXF + Weighting no + WhiteReferenceLevel no + Work-in-ProgressFlag no + WorkingTitle no + WorkingTitle no + XMLDocumentText? no + XMLDocumentText no + XMLDocumentText no + XMLDocumentText? no + XOsiz no + XTOsiz no + XTsiz no + Xsiz no + YOsiz no + YTOsiz no + YTsiz no + Ysiz no + +=head3 MXF Header Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 MXFVersion no + 24 FooterPosition no + 32 HeaderSize no + +=head2 DV Tags + +The following tags are extracted from DV videos. + + Tag Name Writable + -------- -------- + AspectRatio no + AudioBitsPerSample no + AudioChannels no + AudioSampleRate no + Colorimetry no + DateTimeOriginal no + Duration no + FrameRate no + ImageHeight no + ImageWidth no + TotalBitrate no + VideoFormat no + VideoScanType no + +=head2 Flash Tags + +The information below is extracted from SWF (Shockwave Flash) files. Tags +with string ID's represent information extracted from the file header. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Compressed' Compressed no + 'Duration' Duration no + 'FlashVersion' FlashVersion no + 'FrameCount' FrameCount no + 'FrameRate' FrameRate no + 'ImageHeight' ImageHeight no + 'ImageWidth' ImageWidth no + 0x0045 FlashAttributes no + 0x004d XMP XMP + +=head3 Flash FLV Tags + +Information is extracted from the following packets in FLV (Flash Video) +files. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0008 Audio Flash Audio + 0x0009 Video Flash Video + 0x0012 Meta Flash Meta + +=head3 Flash Audio Tags + +Information extracted from the Flash Audio header. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Bit0-3' AudioEncoding no + 'Bit4-5' AudioSampleRate no + 'Bit6' AudioBitsPerSample no + 'Bit7' AudioChannels no + +=head3 Flash Video Tags + +Information extracted from the Flash Video header. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Bit4-7' VideoEncoding no + +=head3 Flash Meta Tags + +Below are a few observed FLV Meta tags, but ExifTool will attempt to extract +information from any tag found. + + Tag ID Tag Name Writable + ------ -------- -------- + 'audiocodecid' AudioCodecID no + 'audiodatarate' AudioBitrate no + 'audiodelay' AudioDelay no + 'audiosamplerate' AudioSampleRate no + 'audiosamplesize' AudioSampleSize no + 'audiosize' AudioSize no + 'bytelength' ByteLength no + 'canSeekToEnd' CanSeekToEnd no + 'canseekontime' CanSeekOnTime no + 'createdby' CreatedBy no + 'creationdate' CreateDate no + 'cuePoints' CuePoint Flash CuePoint + 'datasize' DataSize no + 'duration' Duration no + 'filesize' FileSizeBytes no + 'framerate' FrameRate no + 'hasAudio' HasAudio no + 'hasCuePoints' HasCuePoints no + 'hasKeyframes' HasKeyFrames no + 'hasMetadata' HasMetadata no + 'hasVideo' HasVideo no + 'height' ImageHeight no + 'httphostheader' HTTPHostHeader no + 'keyframesFilepositions' KeyFramePositions no + 'keyframesTimes' KeyFramesTimes no + 'lastkeyframetimestamp' LastKeyFrameTime no + 'lasttimestamp' LastTimeStamp no + 'liveXML' XMP XMP + 'metadatacreator' MetadataCreator no + 'metadatadate' MetadataDate no + 'pmsg' Message no + 'purl' URL no + 'sourcedata' SourceData no + 'starttime' StartTime no + 'stereo' Stereo no + 'totaldatarate' TotalDataRate no + 'totalduration' TotalDuration no + 'videocodecid' VideoCodecID no + 'videodatarate' VideoBitrate no + 'videosize' VideoSize no + 'width' ImageWidth no + +=head3 Flash CuePoint Tags + +These tag names are added to the CuePoint name to generate complete tag +names like "CuePoint0Name". + + Tag ID Tag Name Writable + ------ -------- -------- + 'name' Name no + 'parameters' Parameter Flash Parameter + 'time' Time no + 'type' Type no + +=head3 Flash Parameter Tags + +There are no pre-defined parameter tags, but ExifTool will extract any +existing parameters, with tag names like "CuePoint0ParameterXxx". + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head2 Real Tags + +ExifTool recognizes three basic types of Real audio/video files: 1) +RealMedia (RM, RV and RMVB), 2) RealAudio (RA), and 3) Real Metafile (RAM +and RPM). + +=head3 Real Media Tags + +These B<Tag ID>'s are Chunk ID's used in RealMedia and RealVideo (RM, RV and +RMVB) files. + + Tag ID Tag Name Writable + ------ -------- -------- + 'CONT' CONT Real ContentDescr + 'MDPR' MDPR Real MediaProps + 'PROP' PROP Real Properties + 'RJMD' RJMD Real Metadata + +=head3 Real ContentDescr Tags + + Sequence Tag Name Writable + -------- -------- -------- + 0 TitleLen? no + 1 Title no + 2 AuthorLen? no + 3 Author no + 4 CopyrightLen? no + 5 Copyright no + 6 CommentLen? no + 7 Comment no + +=head3 Real MediaProps Tags + + Sequence Tag Name Writable + -------- -------- -------- + 0 StreamNumber no + 1 StreamMaxBitrate no + 2 StreamAvgBitrate no + 3 StreamMaxPacketSize no + 4 StreamAvgPacketSize no + 5 StreamStartTime no + 6 StreamPreroll no + 7 StreamDuration no + 8 StreamNameLen? no + 9 StreamName no + 10 StreamMimeLen? no + 11 StreamMimeType no + 12 FileInfoLen? no + 13 FileInfoLen2? no + 14 FileInfoVersion no + 15 PhysicalStreams? no + 16 PhysicalStreamNumbers? no + 17 DataOffsets? no + 18 NumRules? no + 19 PhysicalStreamNumberMap? no + 20 NumProperties? no + 21 FileInfoProperties Real FileInfo + +=head3 Real FileInfo Tags + +The following tags have been observed in the FileInfo properties, but any +other existing information will also be extracted. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Audiences' Audiences no + 'Audio Format' AudioFormat no + 'Content Rating' ContentRating no + 'Creation Date' CreateDate no + 'Description' Description no + 'File ID' FileID no + 'Generated By' Software no + 'Indexable' Indexable no + 'Keywords' Keywords no + 'Modification Date' ModifyDate no + 'Target Audiences' TargetAudiences no + 'Video Quality' VideoQuality no + 'audioMode' AudioMode no + 'videoMode' VideoMode no + +=head3 Real Properties Tags + + Sequence Tag Name Writable + -------- -------- -------- + 0 MaxBitrate no + 1 AvgBitrate no + 2 MaxPacketSize no + 3 AvgPacketSize no + 4 NumPackets no + 5 Duration no + 6 Preroll no + 7 IndexOffset? no + 8 DataOffset? no + 9 NumStreams no + 10 Flags no + +=head3 Real Metadata Tags + +The tags below represent information which has been observed in the Real +Metadata format, but ExifTool will extract any information it finds in this +format. (As far as I can tell from the referenced documentation, string +values should be plain text, but this is not the case for the only sample +file I have been able to obtain containing this information. These tags +could also be split into separate sub-directories, but this will wait until +I have better documentation or a more complete set of samples.) + + Tag ID Tag Name Writable + ------ -------- -------- + 'Album/Name' AlbumName no + 'Track/Category' TrackCategory no + 'Track/Comments' TrackComments no + 'Track/Lyrics' TrackLyrics no + +=head3 Real Audio Tags + +Tags in the following table reference information extracted from various +versions of RealAudio (RA) files. + + Tag ID Tag Name Writable + ------ -------- -------- + '.ra3' RA3 Real AudioV3 + '.ra4' RA4 Real AudioV4 + '.ra5' RA5 Real AudioV5 + +=head3 Real AudioV3 Tags + + Sequence Tag Name Writable + -------- -------- -------- + 0 Channels no + 1 Unknown? no + 2 BytesPerMinute no + 3 AudioBytes no + 4 TitleLen? no + 5 Title no + 6 ArtistLen? no + 7 Artist no + 8 CopyrightLen? no + 9 Copyright no + 10 CommentLen? no + 11 Comment no + +=head3 Real AudioV4 Tags + + Sequence Tag Name Writable + -------- -------- -------- + 0 FourCC1? no + 1 AudioFileSize? no + 2 Version2? no + 3 HeaderSize? no + 4 CodecFlavorID? no + 5 CodedFrameSize? no + 6 AudioBytes no + 7 BytesPerMinute no + 8 Unknown? no + 9 SubPacketH? no + 10 AudioFrameSize no + 11 SubPacketSize? no + 12 Unknown? no + 13 SampleRate no + 14 Unknown? no + 15 BitsPerSample no + 16 Channels no + 17 FourCC2Len? no + 18 FourCC2? no + 19 FourCC3Len? no + 20 FourCC3? no + 21 Unknown? no + 22 Unknown? no + 23 TitleLen? no + 24 Title no + 25 ArtistLen? no + 26 Artist no + 27 CopyrightLen? no + 28 Copyright no + 29 CommentLen? no + 30 Comment no + +=head3 Real AudioV5 Tags + + Sequence Tag Name Writable + -------- -------- -------- + 0 FourCC1? no + 1 AudioFileSize? no + 2 Version2? no + 3 HeaderSize? no + 4 CodecFlavorID? no + 5 CodedFrameSize? no + 6 AudioBytes no + 7 BytesPerMinute no + 8 Unknown? no + 9 SubPacketH? no + 10 FrameSize? no + 11 SubPacketSize? no + 12 SampleRate no + 13 SampleRate2? no + 14 BitsPerSample no + 15 Channels no + 16 Genr? no + 17 FourCC3? no + +=head3 Real Metafile Tags + +Tags representing information extracted from Real Audio Metafile and +RealMedia Plug-in Metafile (RAM and RPM) files. + + Tag ID Tag Name Writable + ------ -------- -------- + 'txt' Text no + 'url' URL no + +=head2 Red Tags + +Tags extracted from Redcode R3D video files. + + Tag ID Tag Name Writable + ------ -------- -------- + 'RED1' Red1Header Red RED1 + 'RED2' Red2Header Red RED2 + 0x1000 StartEdgeCode no + 0x1001 StartTimecode no + 0x1002 OtherDate1 no + 0x1003 OtherDate2 no + 0x1004 OtherDate3 no + 0x1005 DateTimeOriginal no + 0x1006 SerialNumber no + 0x1019 CameraType no + 0x101a ReelNumber no + 0x101b Take no + 0x1023 DateCreated no + 0x1024 TimeCreated no + 0x1025 FirmwareVersion no + 0x1029 ReelTimecode no + 0x102a StorageType no + 0x1030 StorageFormatDate no + 0x1031 StorageFormatTime no + 0x1032 StorageSerialNumber no + 0x1033 StorageModel no + 0x1036 AspectRatio no + 0x1042 Revision no + 0x1056 OriginalFileName no + 0x106e LensMake no + 0x106f LensNumber no + 0x1070 LensModel no + 0x1071 Model no + 0x107c CameraOperator no + 0x1086 VideoFormat no + 0x1096 Filter no + 0x10a0 Brain no + 0x10a1 Sensor no + 0x200d ColorTemperature no + 0x204b RGBCurves no + 0x2066 OriginalFrameRate no + 0x4037 CropArea no + 0x403b ISO no + 0x406a FNumber no + 0x406b FocalLength no + 0x606c FocusDistance no + +=head3 Red RED1 Tags + +Redcode version 1 header. + + Index1 Tag Name Writable + ------ -------- -------- + 7 RedcodeVersion no + 54 ImageWidth no + 58 ImageHeight no + 62 FrameRate no + 67 OriginalFileName no + +=head3 Red RED2 Tags + +Redcode version 2 header. + + Index1 Tag Name Writable + ------ -------- -------- + 7 RedcodeVersion no + 76 ImageWidth no + 80 ImageHeight no + 86 FrameRate no + +=head2 RIFF Tags + +The RIFF container format is used various types of fines including AVI, WAV, +WEBP, LA, OFR, PAC and WV. According to the EXIF specification, Meta +information is embedded in two types of RIFF C<LIST> chunks: C<INFO> and +C<exif>, and information about the audio content is stored in the C<fmt > +chunk. As well as this information, some video information and proprietary +manufacturer-specific information is also extracted. + +Large AVI videos may be a concatenation of two or more RIFF chunks. For +these files, information is extracted from subsequent RIFF chunks as +sub-documents, but the Duration is calculated for the full video. + + Tag ID Tag Name Writable + ------ -------- -------- + 'ALPH' ALPH RIFF ALPH + 'ANIM' ANIM RIFF ANIM + 'ANMF' ANMF RIFF ANMF + 'CSET' CharacterSet RIFF CSET + 'EXIF' EXIF EXIF + UnknownEXIF no + 'ICCP' ICC_Profile ICC_Profile + 'IDIT' DateTimeOriginal no + 'JUNK' OlympusJunk Olympus AVI + CasioJunk EXIF + RicohJunk Ricoh AVI + PentaxJunk Pentax Junk + PentaxJunk2 Pentax Junk2 + LucasJunk QuickTime Stream + TextJunk no + 'JUNQ' OldXMP no + 'LIST_INF0' Info RIFF Info + 'LIST_INFO' Info RIFF Info + 'LIST_Tdat' Tdat RIFF Tdat + 'LIST_adtl' AssociatedDataList RIFF + 'LIST_exif' Exif RIFF Exif + 'LIST_hdrl' Hdrl RIFF Hdrl + 'LIST_hydt' PentaxData Pentax AVI + 'LIST_ncdt' NikonData Nikon AVI + 'LIST_pntx' PentaxData2 Pentax AVI + 'SGLT' BikeBroAccel QuickTime Stream + 'SLLT' BikeBroGPS QuickTime Stream + 'VP8 ' VP8Bitstream RIFF VP8 + 'VP8L' VP8L RIFF VP8L + 'VP8X' VP8X RIFF VP8X + 'XMP ' XMP XMP + '_PMX' XMP XMP + 'aXML' AXML XMP XML + 'afsp' Afsp no + 'bext' BroadcastExtension RIFF BroadcastExt + 'cue ' CuePoints no + 'ds64' DataSize64 RIFF DS64 + 'fact' NumberOfSamples no + 'fmt ' AudioFormat RIFF AudioFormat + 'gps0' GPSTrack QuickTime Stream + 'gsen' GSensor QuickTime Stream + 'iXML' IXML XMP XML + 'id3 ' ID3 ID3 + 'inst' Instrument RIFF Instrument + 'labl' CuePointLabel no + 'list' ListType no + 'ltxt' LabeledText no + 'note' CuePointNote no + 'olym' Olym Olympus WAV + 'plst' Playlist no + 'smpl' Sampler RIFF Sampler + 'tx_USER' UserText RIFF UserText + 'tx_Unknown' Text no + +=head3 RIFF ALPH Tags + +WebP alpha chunk. + + Index1 Tag Name Writable + ------ -------- -------- + 0 AlphaPreprocessing no + 0.1 AlphaFiltering no + 0.2 AlphaCompression no + +=head3 RIFF ANIM Tags + +WebP animation chunk. + + Index1 Tag Name Writable + ------ -------- -------- + 0 BackgroundColor no + 4 AnimationLoopCount no + +=head3 RIFF ANMF Tags + +WebP animation frame chunk. + + Index1 Tag Name Writable + ------ -------- -------- + 12 Duration no + +=head3 RIFF CSET Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 CodePage no + 1 CountryCode no + 2 LanguageCode no + 3 Dialect no + +=head3 RIFF Info Tags + +RIFF INFO tags found in AVI video and WAV audio files. Tags which are part +of the EXIF 2.3 specification have an underlined Tag Name in the HTML +version of this documentation. Other tags are found in AVI files generated +by some software. + + Tag ID Tag Name Writable + ------ -------- -------- + 'AGES' Rated no + 'CMNT' Comment no + 'CODE' EncodedBy no + 'COMM' Comments no + 'DIRC' Directory no + 'DISP' SoundSchemeTitle no + 'DTIM' DateTimeOriginal no + 'GENR' Genre no + 'IARL' ArchivalLocation no + 'IART' Artist no + 'IAS1' FirstLanguage no + 'IAS2' SecondLanguage no + 'IAS3' ThirdLanguage no + 'IAS4' FourthLanguage no + 'IAS5' FifthLanguage no + 'IAS6' SixthLanguage no + 'IAS7' SeventhLanguage no + 'IAS8' EighthLanguage no + 'IAS9' NinthLanguage no + 'IBSU' BaseURL no + 'ICAS' DefaultAudioStream no + 'ICDS' CostumeDesigner no + 'ICMS' Commissioned no + 'ICMT' Comment no + 'ICNM' Cinematographer no + 'ICNT' Country no + 'ICOP' Copyright no + 'ICRD' DateCreated no + 'ICRP' Cropped no + 'IDIM' Dimensions no + 'IDIT' DateTimeOriginal no + 'IDPI' DotsPerInch no + 'IDST' DistributedBy no + 'IEDT' EditedBy no + 'IENC' EncodedBy no + 'IENG' Engineer no + 'IGNR' Genre no + 'IKEY' Keywords no + 'ILGT' Lightness no + 'ILGU' LogoURL no + 'ILIU' LogoIconURL no + 'ILNG' Language no + 'IMBI' MoreInfoBannerImage no + 'IMBU' MoreInfoBannerURL no + 'IMED' Medium no + 'IMIT' MoreInfoText no + 'IMIU' MoreInfoURL no + 'IMUS' MusicBy no + 'INAM' Title no + 'IPDS' ProductionDesigner no + 'IPLT' NumColors no + 'IPRD' Product no + 'IPRO' ProducedBy no + 'IRIP' RippedBy no + 'IRTD' Rating no + 'ISBJ' Subject no + 'ISFT' Software no + 'ISGN' SecondaryGenre no + 'ISHP' Sharpness no + 'ISMP' TimeCode no + 'ISRC' Source no + 'ISRF' SourceForm no + 'ISTD' ProductionStudio no + 'ISTR' Starring no + 'ITCH' Technician no + 'ITRK' TrackNumber no + 'IWMU' WatermarkURL no + 'IWRI' WrittenBy no + 'LANG' Language no + 'LOCA' Location no + 'PRT1' Part no + 'PRT2' NumberOfParts no + 'RATE' Rate no + 'STAR' Starring no + 'STAT' Statistics no + 'TAPE' TapeName no + 'TCDO' EndTimecode no + 'TCOD' StartTimecode no + 'TITL' Title no + 'TLEN' Length no + 'TORG' Organization no + 'TRCK' TrackNumber no + 'TURL' URL no + 'TVER' Version no + 'VMAJ' VegasVersionMajor no + 'VMIN' VegasVersionMinor no + 'YEAR' Year no + +=head3 RIFF Tdat Tags + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 RIFF Exif Tags + +These tags are part of the EXIF 2.3 specification for WAV audio files. + + Tag ID Tag Name Writable + ------ -------- -------- + 'ecor' Make no + 'emdl' Model no + 'emnt' MakerNotes no + 'erel' RelatedImageFile no + 'etim' TimeCreated no + 'eucm' UserComment no + 'ever' ExifVersion no + +=head3 RIFF Hdrl Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'IDIT' DateTimeOriginal no + 'ISMP' TimeCode no + 'LIST_odml' OpenDML RIFF OpenDML + 'LIST_strl' Stream RIFF Stream + 'avih' AVIHeader RIFF AVIHeader + +=head3 RIFF OpenDML Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'dmlh' ExtendedAVIHeader RIFF ExtAVIHdr + +=head3 RIFF ExtAVIHdr Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 TotalFrameCount no + +=head3 RIFF Stream Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'strd' StreamData RIFF StreamData + 'strf' AudioFormat RIFF AudioFormat + VideoFormat BMP + 'strh' StreamHeader RIFF StreamHeader + 'strn' StreamName no + +=head3 RIFF StreamData Tags + +This chunk is used to store proprietary information in AVI videos from some +cameras. The first 4 characters of the data are used as the Tag ID below. + + Tag ID Tag Name Writable + ------ -------- -------- + 'AVIF' AVIF EXIF + 'CASI' CasioData Casio AVI + 'Zora' VendorName no + 'unknown' UnknownData no + +=head3 RIFF AudioFormat Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 Encoding no + 1 NumChannels no + 2 SampleRate no + 4 AvgBytesPerSec no + 7 BitsPerSample no + +=head3 RIFF StreamHeader Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 StreamType no + 1 AudioCodec no + VideoCodec no + Codec no + 5 AudioSampleRate no + VideoFrameRate no + StreamSampleRate no + 8 AudioSampleCount no + VideoFrameCount no + StreamSampleCount no + 10 Quality no + 11 SampleSize no + +=head3 RIFF AVIHeader Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 FrameRate no + 1 MaxDataRate no + 4 FrameCount no + 6 StreamCount no + 8 ImageWidth no + 9 ImageHeight no + +=head3 RIFF VP8 Tags + +This chunk is found in simple-format (lossy) WebP files. See +L<https://developers.google.com/speed/webp/docs/riff_container> for the WebP +container specification. + + Index1 Tag Name Writable + ------ -------- -------- + 0 VP8Version no + 6 ImageWidth no + 6.1 HorizontalScale no + 8 ImageHeight no + 8.1 VerticalScale no + +=head3 RIFF VP8L Tags + +This chunk is found in lossless WebP files. + + Index1 Tag Name Writable + ------ -------- -------- + 1 ImageWidth no + 2 ImageHeight no + +=head3 RIFF VP8X Tags + +This chunk is found in extended WebP files. + + Index1 Tag Name Writable + ------ -------- -------- + 4 ImageWidth no + 6 ImageHeight no + +=head3 RIFF BroadcastExt Tags + +Information found in the Broadcast Audio Extension chunk (see +L<http://tech.ebu.ch/docs/tech/tech3285.pdf>). + + Index1 Tag Name Writable + ------ -------- -------- + 0 Description no + 256 Originator no + 288 OriginatorReference no + 320 DateTimeOriginal no + 338 TimeReference no + 346 BWFVersion no + 348 BWF_UMID no + 602 CodingHistory no + +=head3 RIFF DS64 Tags + +64-bit data sizes for MBWF/RF64 files. See +L<https://tech.ebu.ch/docs/tech/tech3306-2009.pdf> for the specification. + + Index8 Tag Name Writable + ------ -------- -------- + 0 RIFFSize64 no + 1 DataSize64 no + 2 NumberOfSamples64 no + +=head3 RIFF Instrument Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 UnshiftedNote no + 1 FineTune no + 2 Gain no + 3 LowNote no + 4 HighNote no + 5 LowVelocity no + 6 HighVelocity no + +=head3 RIFF Sampler Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 Manufacturer no + 1 Product no + 2 SamplePeriod no + 3 MIDIUnityNote no + 4 MIDIPitchFraction no + 5 SMPTEFormat no + 6 SMPTEOffset no + 7 NumSampleLoops no + 8 SamplerDataLen no + 9 SamplerData no + +=head3 RIFF UserText Tags + +Tags decoded from the USER-format txts stream written by Momento M6 dashcam. +Extracted only if the ExtractEmbedded option is used. + + Index1 Tag Name Writable + ------ -------- -------- + 28 GPSAltitude no + 40 Accelerometer no + 56 GPSSpeed no + 60 GPSLatitude no + 64 GPSLongitude no + 68 GPSDateTime no + +=head2 AIFF Tags + +Tags extracted from Audio Interchange File Format (AIFF) files. See +L<http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/AIFF.html> for +the AIFF specification. + + Tag ID Tag Name Writable + ------ -------- -------- + '(c) ' Copyright no + 'ANNO' Annotation no + 'APPL' ApplicationData no + 'AUTH' Author no + 'COMM' Common AIFF Common + 'COMT' Comment AIFF Comment + 'FVER' FormatVersion AIFF FormatVers + 'ID3 ' ID3 ID3 + 'NAME' Name no + +=head3 AIFF Common Tags + + Index2 Tag Name Writable + ------ -------- -------- + 0 NumChannels no + 1 NumSampleFrames no + 3 SampleSize no + 4 SampleRate no + 9 CompressionType no + 11 CompressorName no + +=head3 AIFF Comment Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 CommentTime no + 0x0001 MarkerID no + 0x0002 Comment no + +=head3 AIFF FormatVers Tags + + Index4 Tag Name Writable + ------ -------- -------- + 0 FormatVersionTime no + +=head2 ASF Tags + +The ASF format is used by Windows WMA and WMV files, and DIVX videos. Tag +ID's aren't listed because they are huge 128-bit GUID's that would ruin the +formatting of this table. + + Tag Name Writable + -------- -------- + SimpleIndex no + TimecodeIndex no + Header ASF Header + Data no + XMP XMP + Index no + MediaIndex no + +=head3 ASF Header Tags + + Tag Name Writable + -------- -------- + Padding no + ScriptCommand no + ContentBranding ASF ContentBranding + ContentEncryption no + DigitalSignature no + ExtendedContentEncryption no + HeaderExtension ASF HeaderExtension + ContentDescription ASF ContentDescr + ErrorCorrection no + StreamBitrateProps no + CodecList ASF CodecList + FileProperties ASF FileProperties + StreamProperties ASF StreamProperties + ExtendedContentDescr ASF ExtendedDescr + BitrateMutualExclusion no + Marker no + +=head3 ASF ContentBranding Tags + + Tag Name Writable + -------- -------- + BannerImageType no + BannerImage no + BannerImageURL no + CopyrightURL no + +=head3 ASF HeaderExtension Tags + + Tag Name Writable + -------- -------- + ExtendedStreamProps no + AdvancedContentEncryption no + MetadataLibrary ASF ExtendedDescr + TimecodeIndexParms no + Compatibility no + LanguageList no + AdvancedMutualExcl no + BandwidthSharing no + Reserved1 no + Metadata ASF ExtendedDescr + GroupMutualExclusion no + StreamPrioritization no + IndexParameters no + +=head3 ASF ExtendedDescr Tags + + Tag Name Writable + -------- -------- + ASFLeakyBucketPairs no + ASFPacketCount no + ASFSecurityObjectsSize no + AlbumArtist no + AlbumCoverURL no + AlbumTitle no + AspectRatioX no + AspectRatioY no + AudioFileURL no + AudioSourceURL no + Author no + AuthorURL no + AverageLevel no + BannerImageData no + BannerImageType no + BannerImageURL no + BeatsPerMinute no + Bitrate no + Broadcast no + BufferAverage no + Can_Skip_Backward no + Can_Skip_Forward no + Category no + Codec no + Composer no + Conductor no + ContainerFormat no + ContentDistributor no + ContentGroupDescription no + Copyright no + CopyrightURL no + CurrentBitrate no + DRM no + DRM_ContentID no + DRM_DRMHeader no + DRM_DRMHeader_ContentDistributor no + DRM_DRMHeader_ContentID no + DRM_DRMHeader_IndividualizedVersion no + DRM_DRMHeader_KeyID no + DRM_DRMHeader_LicenseAcqURL no + DRM_DRMHeader_SubscriptionContentID no + DRM_IndividualizedVersion no + DRM_KeyID no + DRM_LASignatureCert no + DRM_LASignatureLicSrvCert no + DRM_LASignaturePrivKey no + DRM_LASignatureRootCert no + DRM_LicenseAcqURL no + DRM_V1LicenseAcqURL no + DVDID no + Description no + Director no + Duration no + EncodedBy no + EncodingSettings no + EncodingTime no + FileSize no + Genre no + GenreID no + HasArbitraryDataStream no + HasAttachedImages no + HasAudio no + HasFileTransferStream no + HasImage no + HasScript no + HasVideo no + ISRC no + InitialKey no + IsVBR no + Is_Protected no + Is_Trusted no + Language no + Lyrics no + Lyrics_Synchronised no + MCDI no + MediaClassPrimaryID no + MediaClassSecondaryID no + MediaCredits no + MediaIsDelay no + MediaIsFinale no + MediaIsLive no + MediaIsPremiere no + MediaIsRepeat no + MediaIsSAP no + MediaIsStereo no + MediaIsSubtitled no + MediaIsTape no + MediaNetworkAffiliation no + MediaOriginalBroadcastDateTime no + MediaOriginalChannel no + MediaStationCallSign no + MediaStationName no + ModifiedBy no + Mood no + NSC_Address no + NSC_Description no + NSC_Email no + NSC_Name no + NSC_Phone no + NumberOfFrames no + OptimalBitrate no + OriginalAlbumTitle no + OriginalArtist no + OriginalFileName no + OriginalLyricist no + OriginalReleaseTime no + OriginalReleaseYear no + ParentalRating no + ParentalRatingReason no + PartOfSet no + PeakBitrate no + PeakValue no + Period no + Picture ASF Picture + PlaylistDelay no + Producer no + PromotionURL no + ProtectionType no + Provider no + ProviderCopyright no + ProviderRating no + ProviderStyle no + Publisher no + RadioStationName no + RadioStationOwner no + Rating no + Seekable no + SharedUserRating no + Signature_Name no + StreamTypeInfo no + Stridable no + Subtitle no + SubtitleDescription no + SubscriptionContentID no + Text no + Title no + ToolName no + ToolVersion no + Track no + TrackNumber no + UniqueFileIdentifier no + UserWebURL no + VBRPeak no + VideoClosedCaptioning no + VideoFrameRate no + VideoHeight no + VideoWidth no + WMADRCAverageReference no + WMADRCAverageTarget no + WMADRCPeakReference no + WMADRCPeakTarget no + WMCollectionGroupID no + WMCollectionID no + WMContentID no + Writer no + Year no + +=head3 ASF Picture Tags + + Tag Name Writable + -------- -------- + PictureType no + PictureMIMEType no + PictureDescription no + Picture no + +=head3 ASF ContentDescr Tags + + Tag Name Writable + -------- -------- + Title no + Author no + Copyright no + Description no + Rating no + +=head3 ASF CodecList Tags + + Tag Name Writable + -------- -------- + AudioCodecDescription no + AudioCodecName no + OtherCodecDescription no + OtherCodecName no + VideoCodecDescription no + VideoCodecName no + +=head3 ASF FileProperties Tags + + Index1 Tag Name Writable + ------ -------- -------- + 0 FileID no + 16 FileLength no + 24 CreationDate no + 32 DataPackets no + 40 Duration no + 48 SendDuration no + 56 Preroll no + 64 Flags no + 68 MinPacketSize no + 72 MaxPacketSize no + 76 MaxBitrate no + +=head3 ASF StreamProperties Tags + +Tags with index 54 and greater are conditional based on the StreamType. + + Index1 Tag Name Writable + ------ -------- -------- + 0 StreamType no + 16 ErrorCorrectionType no + 32 TimeOffset no + 48 StreamNumber no + 54 AudioCodecID no + ImageWidth no + 56 AudioChannels no + 58 AudioSampleRate no + ImageHeight no + +=head2 WTV Tags + +Tags found in Windows recorded TV (WTV) videos. + + Tag ID Tag Name Writable + ------ -------- -------- + 'table.0.entries.legacy_attrib' Metdata WTV Metadata + +=head3 WTV Metadata Tags + +ExifTool will extract any tag found, even if not in this table. + + Tag Name Writable + -------- -------- + ATSCContent no + ActualSoftPostPadding no + ActualSoftPrePadding no + Bitrate? no + BrandingImageID no + BrandingName no + ContentProtected no + ContentProtectedPercent no + DTVContent no + Duration no + EncodeTime no + EndTime no + ExpirationDate? no + ExpirationSpan? no + Genre no + HDContent no + HardPostPadding no + HardPrePadding no + InBandRatingAttributes no + InBandRatingLevel no + InBandRatingSystem no + KeepUntil no + Language no + MediaClassPrimaryID no + MediaClassSecondaryID no + MediaCredits no + MediaIsDelay no + MediaIsFinale no + MediaIsLive no + MediaIsMovie no + MediaIsPremiere no + MediaIsRepeat no + MediaIsSAP no + MediaIsSport no + MediaIsStereo no + MediaIsSubtitled no + MediaIsTape no + MediaNetworkAffiliation no + MediaOriginalBroadcastDateTime no + MediaOriginalChannel no + MediaOriginalChannelSubNumber no + MediaOriginalRunTime no + MediaStationCallSign no + MediaStationName no + MediaThumbAspectRatioX no + MediaThumbAspectRatioY no + MediaThumbHeight no + MediaThumbRatingAttributes no + MediaThumbRatingLevel no + MediaThumbRatingSystem no + MediaThumbRet no + MediaThumbStride no + MediaThumbTimeStamp? no + MediaThumbWidth no + OriginalReleaseTime no + OriginalSoftPostPadding no + OriginalSoftPrePadding no + ParentalRating no + ParentalRatingReason no + ProgramID no + Provider no + ProviderCopyright no + ProviderRating no + Quality no + RequestID no + ScheduleItemID no + SeriesUID no + ServiceID no + Subtitle no + SubtitleDescription no + Title no + VideoClosedCaptioning no + Watched no + +=head2 DICOM Tags + +The DICOM format is based on the ACR-NEMA specification, but adds a file +header and a number of new tags. ExifTool will extract information from +either type of file. The Tag ID's in the following table are the tag group +and element numbers in hexadecimal, as given in the DICOM specification (see +L<http://medical.nema.org/>). The table below contains tags from the DICOM +2009 and earlier specifications plus some vendor-specific private tags. + +Note that DICOM information may be saved in other file formats using the +L<XMP DICOM Tags|Image::ExifTool::TagNames/XMP DICOM Tags>. + + Tag ID Tag Name Writable + ------ -------- -------- + 0002,0000 FileMetaInfoGroupLength no + 0002,0001 FileMetaInfoVersion no + 0002,0002 MediaStorageSOPClassUID no + 0002,0003 MediaStorageSOPInstanceUID no + 0002,0010 TransferSyntaxUID no + 0002,0012 ImplementationClassUID no + 0002,0013 ImplementationVersionName no + 0002,0016 SourceApplicationEntityTitle no + 0002,0100 PrivateInformationCreatorUID no + 0002,0102 PrivateInformation no + 0004,1130 FileSetID no + 0004,1141 FileSetDescriptorFileID no + 0004,1142 SpecificCharacterSetOfFile no + 0004,1200 FirstDirectoryRecordOffset no + 0004,1202 LastDirectoryRecordOffset no + 0004,1212 FileSetConsistencyFlag no + 0004,1220 DirectoryRecordSequence no + 0004,1400 OffsetOfNextDirectoryRecord no + 0004,1410 RecordInUseFlag no + 0004,1420 LowerLevelDirectoryEntityOffset no + 0004,1430 DirectoryRecordType no + 0004,1432 PrivateRecordUID no + 0004,1500 ReferencedFileID no + 0004,1504 MRDRDirectoryRecordOffset no + 0004,1510 ReferencedSOPClassUIDInFile no + 0004,1511 ReferencedSOPInstanceUIDInFile no + 0004,1512 ReferencedTransferSyntaxUIDInFile no + 0004,151A ReferencedRelatedSOPClassUIDInFile no + 0004,1600 NumberOfReferences no + 0008,0000 IdentifyingGroupLength no + 0008,0001 LengthToEnd no + 0008,0005 SpecificCharacterSet no + 0008,0006 LanguageCodeSequence no + 0008,0008 ImageType no + 0008,0010 RecognitionCode no + 0008,0012 InstanceCreationDate no + 0008,0013 InstanceCreationTime no + 0008,0014 InstanceCreatorUID no + 0008,0016 SOPClassUID no + 0008,0018 SOPInstanceUID no + 0008,001A RelatedGeneralSOPClassUID no + 0008,001B OriginalSpecializedSOPClassUID no + 0008,0020 StudyDate no + 0008,0021 SeriesDate no + 0008,0022 AcquisitionDate no + 0008,0023 ContentDate no + 0008,0024 OverlayDate no + 0008,0025 CurveDate no + 0008,002A AcquisitionDateTime no + 0008,0030 StudyTime no + 0008,0031 SeriesTime no + 0008,0032 AcquisitionTime no + 0008,0033 ContentTime no + 0008,0034 OverlayTime no + 0008,0035 CurveTime no + 0008,0040 DataSetType no + 0008,0041 DataSetSubtype no + 0008,0042 NuclearMedicineSeriesType no + 0008,0050 AccessionNumber no + 0008,0052 QueryRetrieveLevel no + 0008,0054 RetrieveAETitle no + 0008,0056 InstanceAvailability no + 0008,0058 FailedSOPInstanceUIDList no + 0008,0060 Modality no + 0008,0061 ModalitiesInStudy no + 0008,0062 SOPClassesInStudy no + 0008,0064 ConversionType no + 0008,0068 PresentationIntentType no + 0008,0070 Manufacturer no + 0008,0080 InstitutionName no + 0008,0081 InstitutionAddress no + 0008,0082 InstitutionCodeSequence no + 0008,0090 ReferringPhysicianName no + 0008,0092 ReferringPhysicianAddress no + 0008,0094 ReferringPhysicianTelephoneNumber no + 0008,0096 ReferringPhysicianIDSequence no + 0008,0100 CodeValue no + 0008,0102 CodingSchemeDesignator no + 0008,0103 CodingSchemeVersion no + 0008,0104 CodeMeaning no + 0008,0105 MappingResource no + 0008,0106 ContextGroupVersion no + 0008,0107 ContextGroupLocalVersion no + 0008,010B ContextGroupExtensionFlag no + 0008,010C CodingSchemeUID no + 0008,010D ContextGroupExtensionCreatorUID no + 0008,010F ContextIdentifier no + 0008,0110 CodingSchemeIDSequence no + 0008,0112 CodingSchemeRegistry no + 0008,0114 CodingSchemeExternalID no + 0008,0115 CodingSchemeName no + 0008,0116 ResponsibleOrganization no + 0008,0117 ContextUID no + 0008,0201 TimezoneOffsetFromUTC no + 0008,1000 NetworkID no + 0008,1010 StationName no + 0008,1030 StudyDescription no + 0008,1032 ProcedureCodeSequence no + 0008,103E SeriesDescription no + 0008,1040 InstitutionalDepartmentName no + 0008,1048 PhysiciansOfRecord no + 0008,1049 PhysiciansOfRecordIDSequence no + 0008,1050 PerformingPhysicianName no + 0008,1052 PerformingPhysicianIDSequence no + 0008,1060 NameOfPhysicianReadingStudy no + 0008,1062 PhysicianReadingStudyIDSequence no + 0008,1070 OperatorsName no + 0008,1072 OperatorIDSequence no + 0008,1080 AdmittingDiagnosesDescription no + 0008,1084 AdmittingDiagnosesCodeSequence no + 0008,1090 ManufacturersModelName no + 0008,1100 ReferencedResultsSequence no + 0008,1110 ReferencedStudySequence no + 0008,1111 ReferencedProcedureStepSequence no + 0008,1115 ReferencedSeriesSequence no + 0008,1120 ReferencedPatientSequence no + 0008,1125 ReferencedVisitSequence no + 0008,1130 ReferencedOverlaySequence no + 0008,113A ReferencedWaveformSequence no + 0008,1140 ReferencedImageSequence no + 0008,1145 ReferencedCurveSequence no + 0008,114A ReferencedInstanceSequence no + 0008,1150 ReferencedSOPClassUID no + 0008,1155 ReferencedSOPInstanceUID no + 0008,115A SOPClassesSupported no + 0008,1160 ReferencedFrameNumber no + 0008,1161 SimpleFrameList no + 0008,1162 CalculatedFrameList no + 0008,1163 TimeRange no + 0008,1164 FrameExtractionSequence no + 0008,1195 TransactionUID no + 0008,1197 FailureReason no + 0008,1198 FailedSOPSequence no + 0008,1199 ReferencedSOPSequence no + 0008,1200 OtherReferencedStudiesSequence no + 0008,1250 RelatedSeriesSequence no + 0008,2110 LossyImageCompression no + 0008,2111 DerivationDescription no + 0008,2112 SourceImageSequence no + 0008,2120 StageName no + 0008,2122 StageNumber no + 0008,2124 NumberOfStages no + 0008,2127 ViewName no + 0008,2128 ViewNumber no + 0008,2129 NumberOfEventTimers no + 0008,212A NumberOfViewsInStage no + 0008,2130 EventElapsedTimes no + 0008,2132 EventTimerNames no + 0008,2133 EventTimerSequence no + 0008,2134 EventTimeOffset no + 0008,2135 EventCodeSequence no + 0008,2142 StartTrim no + 0008,2143 StopTrim no + 0008,2144 RecommendedDisplayFrameRate no + 0008,2200 TransducerPosition no + 0008,2204 TransducerOrientation no + 0008,2208 AnatomicStructure no + 0008,2218 AnatomicRegionSequence no + 0008,2220 AnatomicRegionModifierSequence no + 0008,2228 PrimaryAnatomicStructureSequence no + 0008,2229 AnatomicStructureOrRegionSequence no + 0008,2230 AnatomicStructureModifierSequence no + 0008,2240 TransducerPositionSequence no + 0008,2242 TransducerPositionModifierSequence no + 0008,2244 TransducerOrientationSequence no + 0008,2246 TransducerOrientationModifierSeq no + 0008,2253 AnatomicEntrancePortalCodeSeqTrial no + 0008,2255 AnatomicApproachDirCodeSeqTrial no + 0008,2256 AnatomicPerspectiveDescrTrial no + 0008,2257 AnatomicPerspectiveCodeSeqTrial no + 0008,3001 AlternateRepresentationSequence no + 0008,3010 IrradiationEventUID no + 0008,4000 IdentifyingComments no + 0008,9007 FrameType no + 0008,9092 ReferencedImageEvidenceSequence no + 0008,9121 ReferencedRawDataSequence no + 0008,9123 CreatorVersionUID no + 0008,9124 DerivationImageSequence no + 0008,9154 SourceImageEvidenceSequence no + 0008,9205 PixelPresentation no + 0008,9206 VolumetricProperties no + 0008,9207 VolumeBasedCalculationTechnique no + 0008,9208 ComplexImageComponent no + 0008,9209 AcquisitionContrast no + 0008,9215 DerivationCodeSequence no + 0008,9237 GrayscalePresentationStateSequence no + 0008,9410 ReferencedOtherPlaneSequence no + 0008,9458 FrameDisplaySequence no + 0008,9459 RecommendedDisplayFrameRateInFloat no + 0008,9460 SkipFrameRangeFlag no + 0009,1001 FullFidelity no + 0009,1002 SuiteID no + 0009,1004 ProductID no + 0009,1027 ImageActualDate no + 0009,1030 ServiceID no + 0009,1031 MobileLocationNumber no + 0009,10E3 EquipmentUID no + 0009,10E6 GenesisVersionNow no + 0009,10E7 ExamRecordChecksum no + 0009,10E9 ActualSeriesDataTimeStamp no + 0010,0000 PatientGroupLength no + 0010,0010 PatientName no + 0010,0020 PatientID no + 0010,0021 IssuerOfPatientID no + 0010,0022 TypeOfPatientID no + 0010,0030 PatientBirthDate no + 0010,0032 PatientBirthTime no + 0010,0040 PatientSex no + 0010,0050 PatientInsurancePlanCodeSequence no + 0010,0101 PatientPrimaryLanguageCodeSeq no + 0010,0102 PatientPrimaryLanguageCodeModSeq no + 0010,1000 OtherPatientIDs no + 0010,1001 OtherPatientNames no + 0010,1002 OtherPatientIDsSequence no + 0010,1005 PatientBirthName no + 0010,1010 PatientAge no + 0010,1020 PatientSize no + 0010,1030 PatientWeight no + 0010,1040 PatientAddress no + 0010,1050 InsurancePlanIdentification no + 0010,1060 PatientMotherBirthName no + 0010,1080 MilitaryRank no + 0010,1081 BranchOfService no + 0010,1090 MedicalRecordLocator no + 0010,2000 MedicalAlerts no + 0010,2110 Allergies no + 0010,2150 CountryOfResidence no + 0010,2152 RegionOfResidence no + 0010,2154 PatientTelephoneNumbers no + 0010,2160 EthnicGroup no + 0010,2180 Occupation no + 0010,21A0 SmokingStatus no + 0010,21B0 AdditionalPatientHistory no + 0010,21C0 PregnancyStatus no + 0010,21D0 LastMenstrualDate no + 0010,21F0 PatientReligiousPreference no + 0010,2201 PatientSpeciesDescription no + 0010,2202 PatientSpeciesCodeSequence no + 0010,2203 PatientSexNeutered no + 0010,2210 AnatomicalOrientationType no + 0010,2292 PatientBreedDescription no + 0010,2293 PatientBreedCodeSequence no + 0010,2294 BreedRegistrationSequence no + 0010,2295 BreedRegistrationNumber no + 0010,2296 BreedRegistryCodeSequence no + 0010,2297 ResponsiblePerson no + 0010,2298 ResponsiblePersonRole no + 0010,2299 ResponsibleOrganization no + 0010,4000 PatientComments no + 0010,9431 ExaminedBodyThickness no + 0011,1010 PatientStatus no + 0012,0010 ClinicalTrialSponsorName no + 0012,0020 ClinicalTrialProtocolID no + 0012,0021 ClinicalTrialProtocolName no + 0012,0030 ClinicalTrialSiteID no + 0012,0031 ClinicalTrialSiteName no + 0012,0040 ClinicalTrialSubjectID no + 0012,0042 ClinicalTrialSubjectReadingID no + 0012,0050 ClinicalTrialTimePointID no + 0012,0051 ClinicalTrialTimePointDescription no + 0012,0060 ClinicalTrialCoordinatingCenter no + 0012,0062 PatientIdentityRemoved no + 0012,0063 DeidentificationMethod no + 0012,0064 DeidentificationMethodCodeSequence no + 0012,0071 ClinicalTrialSeriesID no + 0012,0072 ClinicalTrialSeriesDescription no + 0012,0084 DistributionType no + 0012,0085 ConsentForDistributionFlag no + 0018,0000 AcquisitionGroupLength no + 0018,0010 ContrastBolusAgent no + 0018,0012 ContrastBolusAgentSequence no + 0018,0014 ContrastBolusAdministrationRoute no + 0018,0015 BodyPartExamined no + 0018,0020 ScanningSequence no + 0018,0021 SequenceVariant no + 0018,0022 ScanOptions no + 0018,0023 MRAcquisitionType no + 0018,0024 SequenceName no + 0018,0025 AngioFlag no + 0018,0026 InterventionDrugInformationSeq no + 0018,0027 InterventionDrugStopTime no + 0018,0028 InterventionDrugDose no + 0018,0029 InterventionDrugSequence no + 0018,002A AdditionalDrugSequence no + 0018,0030 Radionuclide no + 0018,0031 Radiopharmaceutical no + 0018,0032 EnergyWindowCenterline no + 0018,0033 EnergyWindowTotalWidth no + 0018,0034 InterventionDrugName no + 0018,0035 InterventionDrugStartTime no + 0018,0036 InterventionSequence no + 0018,0037 TherapyType no + 0018,0038 InterventionStatus no + 0018,0039 TherapyDescription no + 0018,003A InterventionDescription no + 0018,0040 CineRate no + 0018,0042 InitialCineRunState no + 0018,0050 SliceThickness no + 0018,0060 KVP no + 0018,0070 CountsAccumulated no + 0018,0071 AcquisitionTerminationCondition no + 0018,0072 EffectiveDuration no + 0018,0073 AcquisitionStartCondition no + 0018,0074 AcquisitionStartConditionData no + 0018,0075 AcquisitionEndConditionData no + 0018,0080 RepetitionTime no + 0018,0081 EchoTime no + 0018,0082 InversionTime no + 0018,0083 NumberOfAverages no + 0018,0084 ImagingFrequency no + 0018,0085 ImagedNucleus no + 0018,0086 EchoNumber no + 0018,0087 MagneticFieldStrength no + 0018,0088 SpacingBetweenSlices no + 0018,0089 NumberOfPhaseEncodingSteps no + 0018,0090 DataCollectionDiameter no + 0018,0091 EchoTrainLength no + 0018,0093 PercentSampling no + 0018,0094 PercentPhaseFieldOfView no + 0018,0095 PixelBandwidth no + 0018,1000 DeviceSerialNumber no + 0018,1002 DeviceUID no + 0018,1003 DeviceID no + 0018,1004 PlateID no + 0018,1005 GeneratorID no + 0018,1006 GridID no + 0018,1007 CassetteID no + 0018,1008 GantryID no + 0018,1010 SecondaryCaptureDeviceID no + 0018,1011 HardcopyCreationDeviceID no + 0018,1012 DateOfSecondaryCapture no + 0018,1014 TimeOfSecondaryCapture no + 0018,1016 SecondaryCaptureDeviceManufacturer no + 0018,1017 HardcopyDeviceManufacturer no + 0018,1018 SecondaryCaptureDeviceModelName no + 0018,1019 SecondaryCaptureDeviceSoftwareVers no + 0018,101A HardcopyDeviceSoftwareVersion no + 0018,101B HardcopyDeviceModelName no + 0018,1020 SoftwareVersion no + 0018,1022 VideoImageFormatAcquired no + 0018,1023 DigitalImageFormatAcquired no + 0018,1030 ProtocolName no + 0018,1040 ContrastBolusRoute no + 0018,1041 ContrastBolusVolume no + 0018,1042 ContrastBolusStartTime no + 0018,1043 ContrastBolusStopTime no + 0018,1044 ContrastBolusTotalDose no + 0018,1045 SyringeCounts no + 0018,1046 ContrastFlowRate no + 0018,1047 ContrastFlowDuration no + 0018,1048 ContrastBolusIngredient no + 0018,1049 ContrastBolusConcentration no + 0018,1050 SpatialResolution no + 0018,1060 TriggerTime no + 0018,1061 TriggerSourceOrType no + 0018,1062 NominalInterval no + 0018,1063 FrameTime no + 0018,1064 CardiacFramingType no + 0018,1065 FrameTimeVector no + 0018,1066 FrameDelay no + 0018,1067 ImageTriggerDelay no + 0018,1068 MultiplexGroupTimeOffset no + 0018,1069 TriggerTimeOffset no + 0018,106A SynchronizationTrigger no + 0018,106C SynchronizationChannel no + 0018,106E TriggerSamplePosition no + 0018,1070 RadiopharmaceuticalRoute no + 0018,1071 RadiopharmaceuticalVolume no + 0018,1072 RadiopharmaceuticalStartTime no + 0018,1073 RadiopharmaceuticalStopTime no + 0018,1074 RadionuclideTotalDose no + 0018,1075 RadionuclideHalfLife no + 0018,1076 RadionuclidePositronFraction no + 0018,1077 RadiopharmaceuticalSpecActivity no + 0018,1078 RadiopharmaceuticalStartDateTime no + 0018,1079 RadiopharmaceuticalStopDateTime no + 0018,1080 BeatRejectionFlag no + 0018,1081 LowRRValue no + 0018,1082 HighRRValue no + 0018,1083 IntervalsAcquired no + 0018,1084 IntervalsRejected no + 0018,1085 PVCRejection no + 0018,1086 SkipBeats no + 0018,1088 HeartRate no + 0018,1090 CardiacNumberOfImages no + 0018,1094 TriggerWindow no + 0018,1100 ReconstructionDiameter no + 0018,1110 DistanceSourceToDetector no + 0018,1111 DistanceSourceToPatient no + 0018,1114 EstimatedRadiographicMagnification no + 0018,1120 GantryDetectorTilt no + 0018,1121 GantryDetectorSlew no + 0018,1130 TableHeight no + 0018,1131 TableTraverse no + 0018,1134 TableMotion no + 0018,1135 TableVerticalIncrement no + 0018,1136 TableLateralIncrement no + 0018,1137 TableLongitudinalIncrement no + 0018,1138 TableAngle no + 0018,113A TableType no + 0018,1140 RotationDirection no + 0018,1141 AngularPosition no + 0018,1142 RadialPosition no + 0018,1143 ScanArc no + 0018,1144 AngularStep no + 0018,1145 CenterOfRotationOffset no + 0018,1146 RotationOffset no + 0018,1147 FieldOfViewShape no + 0018,1149 FieldOfViewDimensions no + 0018,1150 ExposureTime no + 0018,1151 XRayTubeCurrent no + 0018,1152 Exposure no + 0018,1153 ExposureInMicroAmpSec no + 0018,1154 AveragePulseWidth no + 0018,1155 RadiationSetting no + 0018,1156 RectificationType no + 0018,115A RadiationMode no + 0018,115E ImageAreaDoseProduct no + 0018,1160 FilterType no + 0018,1161 TypeOfFilters no + 0018,1162 IntensifierSize no + 0018,1164 ImagerPixelSpacing no + 0018,1166 Grid no + 0018,1170 GeneratorPower no + 0018,1180 CollimatorGridName no + 0018,1181 CollimatorType no + 0018,1182 FocalDistance no + 0018,1183 XFocusCenter no + 0018,1184 YFocusCenter no + 0018,1190 FocalSpots no + 0018,1191 AnodeTargetMaterial no + 0018,11A0 BodyPartThickness no + 0018,11A2 CompressionForce no + 0018,1200 DateOfLastCalibration no + 0018,1201 TimeOfLastCalibration no + 0018,1210 ConvolutionKernel no + 0018,1240 UpperLowerPixelValues no + 0018,1242 ActualFrameDuration no + 0018,1243 CountRate no + 0018,1244 PreferredPlaybackSequencing no + 0018,1250 ReceiveCoilName no + 0018,1251 TransmitCoilName no + 0018,1260 PlateType no + 0018,1261 PhosphorType no + 0018,1300 ScanVelocity no + 0018,1301 WholeBodyTechnique no + 0018,1302 ScanLength no + 0018,1310 AcquisitionMatrix no + 0018,1312 InPlanePhaseEncodingDirection no + 0018,1314 FlipAngle no + 0018,1315 VariableFlipAngleFlag no + 0018,1316 SAR no + 0018,1318 DB-Dt no + 0018,1400 AcquisitionDeviceProcessingDescr no + 0018,1401 AcquisitionDeviceProcessingCode no + 0018,1402 CassetteOrientation no + 0018,1403 CassetteSize no + 0018,1404 ExposuresOnPlate no + 0018,1405 RelativeXRayExposure no + 0018,1450 ColumnAngulation no + 0018,1460 TomoLayerHeight no + 0018,1470 TomoAngle no + 0018,1480 TomoTime no + 0018,1490 TomoType no + 0018,1491 TomoClass no + 0018,1495 NumberOfTomosynthesisSourceImages no + 0018,1500 PositionerMotion no + 0018,1508 PositionerType no + 0018,1510 PositionerPrimaryAngle no + 0018,1511 PositionerSecondaryAngle no + 0018,1520 PositionerPrimaryAngleIncrement no + 0018,1521 PositionerSecondaryAngleIncrement no + 0018,1530 DetectorPrimaryAngle no + 0018,1531 DetectorSecondaryAngle no + 0018,1600 ShutterShape no + 0018,1602 ShutterLeftVerticalEdge no + 0018,1604 ShutterRightVerticalEdge no + 0018,1606 ShutterUpperHorizontalEdge no + 0018,1608 ShutterLowerHorizontalEdge no + 0018,1610 CenterOfCircularShutter no + 0018,1612 RadiusOfCircularShutter no + 0018,1620 VerticesOfPolygonalShutter no + 0018,1622 ShutterPresentationValue no + 0018,1623 ShutterOverlayGroup no + 0018,1624 ShutterPresentationColorCIELabVal no + 0018,1700 CollimatorShape no + 0018,1702 CollimatorLeftVerticalEdge no + 0018,1704 CollimatorRightVerticalEdge no + 0018,1706 CollimatorUpperHorizontalEdge no + 0018,1708 CollimatorLowerHorizontalEdge no + 0018,1710 CenterOfCircularCollimator no + 0018,1712 RadiusOfCircularCollimator no + 0018,1720 VerticesOfPolygonalCollimator no + 0018,1800 AcquisitionTimeSynchronized no + 0018,1801 TimeSource no + 0018,1802 TimeDistributionProtocol no + 0018,1803 NTPSourceAddress no + 0018,2001 PageNumberVector no + 0018,2002 FrameLabelVector no + 0018,2003 FramePrimaryAngleVector no + 0018,2004 FrameSecondaryAngleVector no + 0018,2005 SliceLocationVector no + 0018,2006 DisplayWindowLabelVector no + 0018,2010 NominalScannedPixelSpacing no + 0018,2020 DigitizingDeviceTransportDirection no + 0018,2030 RotationOfScannedFilm no + 0018,3100 IVUSAcquisition no + 0018,3101 IVUSPullbackRate no + 0018,3102 IVUSGatedRate no + 0018,3103 IVUSPullbackStartFrameNumber no + 0018,3104 IVUSPullbackStopFrameNumber no + 0018,3105 LesionNumber no + 0018,4000 AcquisitionComments no + 0018,5000 OutputPower no + 0018,5010 TransducerData no + 0018,5012 FocusDepth no + 0018,5020 ProcessingFunction no + 0018,5021 PostprocessingFunction no + 0018,5022 MechanicalIndex no + 0018,5024 BoneThermalIndex no + 0018,5026 CranialThermalIndex no + 0018,5027 SoftTissueThermalIndex no + 0018,5028 SoftTissueFocusThermalIndex no + 0018,5029 SoftTissueSurfaceThermalIndex no + 0018,5030 DynamicRange no + 0018,5040 TotalGain no + 0018,5050 DepthOfScanField no + 0018,5100 PatientPosition no + 0018,5101 ViewPosition no + 0018,5104 ProjectionEponymousNameCodeSeq no + 0018,5210 ImageTransformationMatrix no + 0018,5212 ImageTranslationVector no + 0018,6000 Sensitivity no + 0018,6011 SequenceOfUltrasoundRegions no + 0018,6012 RegionSpatialFormat no + 0018,6014 RegionDataType no + 0018,6016 RegionFlags no + 0018,6018 RegionLocationMinX0 no + 0018,601A RegionLocationMinY0 no + 0018,601C RegionLocationMaxX1 no + 0018,601E RegionLocationMaxY1 no + 0018,6020 ReferencePixelX0 no + 0018,6022 ReferencePixelY0 no + 0018,6024 PhysicalUnitsXDirection no + 0018,6026 PhysicalUnitsYDirection no + 0018,6028 ReferencePixelPhysicalValueX no + 0018,602A ReferencePixelPhysicalValueY no + 0018,602C PhysicalDeltaX no + 0018,602E PhysicalDeltaY no + 0018,6030 TransducerFrequency no + 0018,6031 TransducerType no + 0018,6032 PulseRepetitionFrequency no + 0018,6034 DopplerCorrectionAngle no + 0018,6036 SteeringAngle no + 0018,6038 DopplerSampleVolumeXPosRetired no + 0018,6039 DopplerSampleVolumeXPosition no + 0018,603A DopplerSampleVolumeYPosRetired no + 0018,603B DopplerSampleVolumeYPosition no + 0018,603C TMLinePositionX0Retired no + 0018,603D TMLinePositionX0 no + 0018,603E TMLinePositionY0Retired no + 0018,603F TMLinePositionY0 no + 0018,6040 TMLinePositionX1Retired no + 0018,6041 TMLinePositionX1 no + 0018,6042 TMLinePositionY1Retired no + 0018,6043 TMLinePositionY1 no + 0018,6044 PixelComponentOrganization no + 0018,6046 PixelComponentMask no + 0018,6048 PixelComponentRangeStart no + 0018,604A PixelComponentRangeStop no + 0018,604C PixelComponentPhysicalUnits no + 0018,604E PixelComponentDataType no + 0018,6050 NumberOfTableBreakPoints no + 0018,6052 TableOfXBreakPoints no + 0018,6054 TableOfYBreakPoints no + 0018,6056 NumberOfTableEntries no + 0018,6058 TableOfPixelValues no + 0018,605A TableOfParameterValues no + 0018,6060 RWaveTimeVector no + 0018,7000 DetectorConditionsNominalFlag no + 0018,7001 DetectorTemperature no + 0018,7004 DetectorType no + 0018,7005 DetectorConfiguration no + 0018,7006 DetectorDescription no + 0018,7008 DetectorMode no + 0018,700A DetectorID no + 0018,700C DateOfLastDetectorCalibration no + 0018,700E TimeOfLastDetectorCalibration no + 0018,7010 DetectorExposuresSinceCalibration no + 0018,7011 DetectorExposuresSinceManufactured no + 0018,7012 DetectorTimeSinceLastExposure no + 0018,7014 DetectorActiveTime no + 0018,7016 DetectorActiveOffsetFromExposure no + 0018,701A DetectorBinning no + 0018,7020 DetectorElementPhysicalSize no + 0018,7022 DetectorElementSpacing no + 0018,7024 DetectorActiveShape no + 0018,7026 DetectorActiveDimensions no + 0018,7028 DetectorActiveOrigin no + 0018,702A DetectorManufacturerName no + 0018,702B DetectorManufacturersModelName no + 0018,7030 FieldOfViewOrigin no + 0018,7032 FieldOfViewRotation no + 0018,7034 FieldOfViewHorizontalFlip no + 0018,7040 GridAbsorbingMaterial no + 0018,7041 GridSpacingMaterial no + 0018,7042 GridThickness no + 0018,7044 GridPitch no + 0018,7046 GridAspectRatio no + 0018,7048 GridPeriod no + 0018,704C GridFocalDistance no + 0018,7050 FilterMaterial no + 0018,7052 FilterThicknessMinimum no + 0018,7054 FilterThicknessMaximum no + 0018,7060 ExposureControlMode no + 0018,7062 ExposureControlModeDescription no + 0018,7064 ExposureStatus no + 0018,7065 PhototimerSetting no + 0018,8150 ExposureTimeInMicroSec no + 0018,8151 XRayTubeCurrentInMicroAmps no + 0018,9004 ContentQualification no + 0018,9005 PulseSequenceName no + 0018,9006 MRImagingModifierSequence no + 0018,9008 EchoPulseSequence no + 0018,9009 InversionRecovery no + 0018,9010 FlowCompensation no + 0018,9011 MultipleSpinEcho no + 0018,9012 MultiPlanarExcitation no + 0018,9014 PhaseContrast no + 0018,9015 TimeOfFlightContrast no + 0018,9016 Spoiling no + 0018,9017 SteadyStatePulseSequence no + 0018,9018 EchoPlanarPulseSequence no + 0018,9019 TagAngleFirstAxis no + 0018,9020 MagnetizationTransfer no + 0018,9021 T2Preparation no + 0018,9022 BloodSignalNulling no + 0018,9024 SaturationRecovery no + 0018,9025 SpectrallySelectedSuppression no + 0018,9026 SpectrallySelectedExcitation no + 0018,9027 SpatialPresaturation no + 0018,9028 Tagging no + 0018,9029 OversamplingPhase no + 0018,9030 TagSpacingFirstDimension no + 0018,9032 GeometryOfKSpaceTraversal no + 0018,9033 SegmentedKSpaceTraversal no + 0018,9034 RectilinearPhaseEncodeReordering no + 0018,9035 TagThickness no + 0018,9036 PartialFourierDirection no + 0018,9037 CardiacSynchronizationTechnique no + 0018,9041 ReceiveCoilManufacturerName no + 0018,9042 MRReceiveCoilSequence no + 0018,9043 ReceiveCoilType no + 0018,9044 QuadratureReceiveCoil no + 0018,9045 MultiCoilDefinitionSequence no + 0018,9046 MultiCoilConfiguration no + 0018,9047 MultiCoilElementName no + 0018,9048 MultiCoilElementUsed no + 0018,9049 MRTransmitCoilSequence no + 0018,9050 TransmitCoilManufacturerName no + 0018,9051 TransmitCoilType no + 0018,9052 SpectralWidth no + 0018,9053 ChemicalShiftReference no + 0018,9054 VolumeLocalizationTechnique no + 0018,9058 MRAcquisitionFrequencyEncodeSteps no + 0018,9059 Decoupling no + 0018,9060 DecoupledNucleus no + 0018,9061 DecouplingFrequency no + 0018,9062 DecouplingMethod no + 0018,9063 DecouplingChemicalShiftReference no + 0018,9064 KSpaceFiltering no + 0018,9065 TimeDomainFiltering no + 0018,9066 NumberOfZeroFills no + 0018,9067 BaselineCorrection no + 0018,9069 ParallelReductionFactorInPlane no + 0018,9070 CardiacRRIntervalSpecified no + 0018,9073 AcquisitionDuration no + 0018,9074 FrameAcquisitionDateTime no + 0018,9075 DiffusionDirectionality no + 0018,9076 DiffusionGradientDirectionSequence no + 0018,9077 ParallelAcquisition no + 0018,9078 ParallelAcquisitionTechnique no + 0018,9079 InversionTimes no + 0018,9080 MetaboliteMapDescription no + 0018,9081 PartialFourier no + 0018,9082 EffectiveEchoTime no + 0018,9083 MetaboliteMapCodeSequence no + 0018,9084 ChemicalShiftSequence no + 0018,9085 CardiacSignalSource no + 0018,9087 DiffusionBValue no + 0018,9089 DiffusionGradientOrientation no + 0018,9090 VelocityEncodingDirection no + 0018,9091 VelocityEncodingMinimumValue no + 0018,9093 NumberOfKSpaceTrajectories no + 0018,9094 CoverageOfKSpace no + 0018,9095 SpectroscopyAcquisitionPhaseRows no + 0018,9096 ParallelReductFactorInPlaneRetired no + 0018,9098 TransmitterFrequency no + 0018,9100 ResonantNucleus no + 0018,9101 FrequencyCorrection no + 0018,9103 MRSpectroscopyFOV-GeometrySequence no + 0018,9104 SlabThickness no + 0018,9105 SlabOrientation no + 0018,9106 MidSlabPosition no + 0018,9107 MRSpatialSaturationSequence no + 0018,9112 MRTimingAndRelatedParametersSeq no + 0018,9114 MREchoSequence no + 0018,9115 MRModifierSequence no + 0018,9117 MRDiffusionSequence no + 0018,9118 CardiacTriggerSequence no + 0018,9119 MRAveragesSequence no + 0018,9125 MRFOV-GeometrySequence no + 0018,9126 VolumeLocalizationSequence no + 0018,9127 SpectroscopyAcquisitionDataColumns no + 0018,9147 DiffusionAnisotropyType no + 0018,9151 FrameReferenceDateTime no + 0018,9152 MRMetaboliteMapSequence no + 0018,9155 ParallelReductionFactorOutOfPlane no + 0018,9159 SpectroscopyOutOfPlanePhaseSteps no + 0018,9166 BulkMotionStatus no + 0018,9168 ParallelReductionFactSecondInPlane no + 0018,9169 CardiacBeatRejectionTechnique no + 0018,9170 RespiratoryMotionCompTechnique no + 0018,9171 RespiratorySignalSource no + 0018,9172 BulkMotionCompensationTechnique no + 0018,9173 BulkMotionSignalSource no + 0018,9174 ApplicableSafetyStandardAgency no + 0018,9175 ApplicableSafetyStandardDescr no + 0018,9176 OperatingModeSequence no + 0018,9177 OperatingModeType no + 0018,9178 OperatingMode no + 0018,9179 SpecificAbsorptionRateDefinition no + 0018,9180 GradientOutputType no + 0018,9181 SpecificAbsorptionRateValue no + 0018,9182 GradientOutput no + 0018,9183 FlowCompensationDirection no + 0018,9184 TaggingDelay no + 0018,9185 RespiratoryMotionCompTechDescr no + 0018,9186 RespiratorySignalSourceID no + 0018,9195 ChemicalShiftsMinIntegrateLimitHz no + 0018,9196 ChemicalShiftsMaxIntegrateLimitHz no + 0018,9197 MRVelocityEncodingSequence no + 0018,9198 FirstOrderPhaseCorrection no + 0018,9199 WaterReferencedPhaseCorrection no + 0018,9200 MRSpectroscopyAcquisitionType no + 0018,9214 RespiratoryCyclePosition no + 0018,9217 VelocityEncodingMaximumValue no + 0018,9218 TagSpacingSecondDimension no + 0018,9219 TagAngleSecondAxis no + 0018,9220 FrameAcquisitionDuration no + 0018,9226 MRImageFrameTypeSequence no + 0018,9227 MRSpectroscopyFrameTypeSequence no + 0018,9231 MRAcqPhaseEncodingStepsInPlane no + 0018,9232 MRAcqPhaseEncodingStepsOutOfPlane no + 0018,9234 SpectroscopyAcqPhaseColumns no + 0018,9236 CardiacCyclePosition no + 0018,9239 SpecificAbsorptionRateSequence no + 0018,9240 RFEchoTrainLength no + 0018,9241 GradientEchoTrainLength no + 0018,9295 ChemicalShiftsMinIntegrateLimitPPM no + 0018,9296 ChemicalShiftsMaxIntegrateLimitPPM no + 0018,9301 CTAcquisitionTypeSequence no + 0018,9302 AcquisitionType no + 0018,9303 TubeAngle no + 0018,9304 CTAcquisitionDetailsSequence no + 0018,9305 RevolutionTime no + 0018,9306 SingleCollimationWidth no + 0018,9307 TotalCollimationWidth no + 0018,9308 CTTableDynamicsSequence no + 0018,9309 TableSpeed no + 0018,9310 TableFeedPerRotation no + 0018,9311 SpiralPitchFactor no + 0018,9312 CTGeometrySequence no + 0018,9313 DataCollectionCenterPatient no + 0018,9314 CTReconstructionSequence no + 0018,9315 ReconstructionAlgorithm no + 0018,9316 ConvolutionKernelGroup no + 0018,9317 ReconstructionFieldOfView no + 0018,9318 ReconstructionTargetCenterPatient no + 0018,9319 ReconstructionAngle no + 0018,9320 ImageFilter no + 0018,9321 CTExposureSequence no + 0018,9322 ReconstructionPixelSpacing no + 0018,9323 ExposureModulationType no + 0018,9324 EstimatedDoseSaving no + 0018,9325 CTXRayDetailsSequence no + 0018,9326 CTPositionSequence no + 0018,9327 TablePosition no + 0018,9328 ExposureTimeInMilliSec no + 0018,9329 CTImageFrameTypeSequence no + 0018,9330 XRayTubeCurrentInMilliAmps no + 0018,9332 ExposureInMilliAmpSec no + 0018,9333 ConstantVolumeFlag no + 0018,9334 FluoroscopyFlag no + 0018,9335 SourceToDataCollectionCenterDist no + 0018,9337 ContrastBolusAgentNumber no + 0018,9338 ContrastBolusIngredientCodeSeq no + 0018,9340 ContrastAdministrationProfileSeq no + 0018,9341 ContrastBolusUsageSequence no + 0018,9342 ContrastBolusAgentAdministered no + 0018,9343 ContrastBolusAgentDetected no + 0018,9344 ContrastBolusAgentPhase no + 0018,9345 CTDIvol no + 0018,9346 CTDIPhantomTypeCodeSequence no + 0018,9351 CalciumScoringMassFactorPatient no + 0018,9352 CalciumScoringMassFactorDevice no + 0018,9353 EnergyWeightingFactor no + 0018,9360 CTAdditionalXRaySourceSequence no + 0018,9401 ProjectionPixelCalibrationSequence no + 0018,9402 DistanceSourceToIsocenter no + 0018,9403 DistanceObjectToTableTop no + 0018,9404 ObjectPixelSpacingInCenterOfBeam no + 0018,9405 PositionerPositionSequence no + 0018,9406 TablePositionSequence no + 0018,9407 CollimatorShapeSequence no + 0018,9412 XA-XRFFrameCharacteristicsSequence no + 0018,9417 FrameAcquisitionSequence no + 0018,9420 XRayReceptorType no + 0018,9423 AcquisitionProtocolName no + 0018,9424 AcquisitionProtocolDescription no + 0018,9425 ContrastBolusIngredientOpaque no + 0018,9426 DistanceReceptorPlaneToDetHousing no + 0018,9427 IntensifierActiveShape no + 0018,9428 IntensifierActiveDimensions no + 0018,9429 PhysicalDetectorSize no + 0018,9430 PositionOfIsocenterProjection no + 0018,9432 FieldOfViewSequence no + 0018,9433 FieldOfViewDescription no + 0018,9434 ExposureControlSensingRegionsSeq no + 0018,9435 ExposureControlSensingRegionShape no + 0018,9436 ExposureControlSensRegionLeftEdge no + 0018,9437 ExposureControlSensRegionRightEdge no + 0018,9440 CenterOfCircExposControlSensRegion no + 0018,9441 RadiusOfCircExposControlSensRegion no + 0018,9447 ColumnAngulationPatient no + 0018,9449 BeamAngle no + 0018,9451 FrameDetectorParametersSequence no + 0018,9452 CalculatedAnatomyThickness no + 0018,9455 CalibrationSequence no + 0018,9456 ObjectThicknessSequence no + 0018,9457 PlaneIdentification no + 0018,9461 FieldOfViewDimensionsInFloat no + 0018,9462 IsocenterReferenceSystemSequence no + 0018,9463 PositionerIsocenterPrimaryAngle no + 0018,9464 PositionerIsocenterSecondaryAngle no + 0018,9465 PositionerIsocenterDetRotAngle no + 0018,9466 TableXPositionToIsocenter no + 0018,9467 TableYPositionToIsocenter no + 0018,9468 TableZPositionToIsocenter no + 0018,9469 TableHorizontalRotationAngle no + 0018,9470 TableHeadTiltAngle no + 0018,9471 TableCradleTiltAngle no + 0018,9472 FrameDisplayShutterSequence no + 0018,9473 AcquiredImageAreaDoseProduct no + 0018,9474 CArmPositionerTabletopRelationship no + 0018,9476 XRayGeometrySequence no + 0018,9477 IrradiationEventIDSequence no + 0018,9504 XRay3DFrameTypeSequence no + 0018,9506 ContributingSourcesSequence no + 0018,9507 XRay3DAcquisitionSequence no + 0018,9508 PrimaryPositionerScanArc no + 0018,9509 SecondaryPositionerScanArc no + 0018,9510 PrimaryPositionerScanStartAngle no + 0018,9511 SecondaryPositionerScanStartAngle no + 0018,9514 PrimaryPositionerIncrement no + 0018,9515 SecondaryPositionerIncrement no + 0018,9516 StartAcquisitionDateTime no + 0018,9517 EndAcquisitionDateTime no + 0018,9524 ApplicationName no + 0018,9525 ApplicationVersion no + 0018,9526 ApplicationManufacturer no + 0018,9527 AlgorithmType no + 0018,9528 AlgorithmDescription no + 0018,9530 XRay3DReconstructionSequence no + 0018,9531 ReconstructionDescription no + 0018,9538 PerProjectionAcquisitionSequence no + 0018,9601 DiffusionBMatrixSequence no + 0018,9602 DiffusionBValueXX no + 0018,9603 DiffusionBValueXY no + 0018,9604 DiffusionBValueXZ no + 0018,9605 DiffusionBValueYY no + 0018,9606 DiffusionBValueYZ no + 0018,9607 DiffusionBValueZZ no + 0018,9701 DecayCorrectionDateTime no + 0018,9715 StartDensityThreshold no + 0018,9722 TerminationTimeThreshold no + 0018,9725 DetectorGeometry no + 0018,9727 AxialDetectorDimension no + 0018,9735 PETPositionSequence no + 0018,9739 NumberOfIterations no + 0018,9740 NumberOfSubsets no + 0018,9751 PETFrameTypeSequence no + 0018,9756 ReconstructionType no + 0018,9758 DecayCorrected no + 0018,9759 AttenuationCorrected no + 0018,9760 ScatterCorrected no + 0018,9761 DeadTimeCorrected no + 0018,9762 GantryMotionCorrected no + 0018,9763 PatientMotionCorrected no + 0018,9765 RandomsCorrected no + 0018,9767 SensitivityCalibrated no + 0018,9801 DepthsOfFocus no + 0018,9804 ExclusionStartDatetime no + 0018,9805 ExclusionDuration no + 0018,9807 ImageDataTypeSequence no + 0018,9808 DataType no + 0018,980B AliasedDataType no + 0018,A001 ContributingEquipmentSequence no + 0018,A002 ContributionDateTime no + 0018,A003 ContributionDescription no + 0019,1002 NumberOfCellsIInDetector no + 0019,1003 CellNumberAtTheta no + 0019,1004 CellSpacing no + 0019,100F HorizFrameOfRef no + 0019,1011 SeriesContrast no + 0019,1012 LastPseq no + 0019,1013 StartNumberForBaseline no + 0019,1014 EndNumberForBaseline no + 0019,1015 StartNumberForEnhancedScans no + 0019,1016 EndNumberForEnhancedScans no + 0019,1017 SeriesPlane no + 0019,1018 FirstScanRas no + 0019,1019 FirstScanLocation no + 0019,101A LastScanRas no + 0019,101B LastScanLoc no + 0019,101E DisplayFieldOfView no + 0019,1023 TableSpeed no + 0019,1024 MidScanTime no + 0019,1025 MidScanFlag no + 0019,1026 DegreesOfAzimuth no + 0019,1027 GantryPeriod no + 0019,102A XRayOnPosition no + 0019,102B XRayOffPosition no + 0019,102C NumberOfTriggers no + 0019,102E AngleOfFirstView no + 0019,102F TriggerFrequency no + 0019,1039 ScanFOVType no + 0019,1040 StatReconFlag no + 0019,1041 ComputeType no + 0019,1042 SegmentNumber no + 0019,1043 TotalSegmentsRequested no + 0019,1044 InterscanDelay no + 0019,1047 ViewCompressionFactor no + 0019,104A TotalNoOfRefChannels no + 0019,104B DataSizeForScanData no + 0019,1052 ReconPostProcflag no + 0019,1057 CTWaterNumber no + 0019,1058 CTBoneNumber no + 0019,105A AcquisitionDuration no + 0019,105E NumberOfChannels no + 0019,105F IncrementBetweenChannels no + 0019,1060 StartingView no + 0019,1061 NumberOfViews no + 0019,1062 IncrementBetweenViews no + 0019,106A DependantOnNoViewsProcessed no + 0019,106B FieldOfViewInDetectorCells no + 0019,1070 ValueOfBackProjectionButton no + 0019,1071 SetIfFatqEstimatesWereUsed no + 0019,1072 ZChanAvgOverViews no + 0019,1073 AvgOfLeftRefChansOverViews no + 0019,1074 MaxLeftChanOverViews no + 0019,1075 AvgOfRightRefChansOverViews no + 0019,1076 MaxRightChanOverViews no + 0019,107D SecondEcho no + 0019,107E NumberOfEchoes no + 0019,107F TableDelta no + 0019,1081 Contiguous no + 0019,1084 PeakSAR no + 0019,1085 MonitorSAR no + 0019,1087 CardiacRepetitionTime no + 0019,1088 ImagesPerCardiacCycle no + 0019,108A ActualReceiveGainAnalog no + 0019,108B ActualReceiveGainDigital no + 0019,108D DelayAfterTrigger no + 0019,108F Swappf no + 0019,1090 PauseInterval no + 0019,1091 PulseTime no + 0019,1092 SliceOffsetOnFreqAxis no + 0019,1093 CenterFrequency no + 0019,1094 TransmitGain no + 0019,1095 AnalogReceiverGain no + 0019,1096 DigitalReceiverGain no + 0019,1097 BitmapDefiningCVs no + 0019,1098 CenterFreqMethod no + 0019,109B PulseSeqMode no + 0019,109C PulseSeqName no + 0019,109D PulseSeqDate no + 0019,109E InternalPulseSeqName no + 0019,109F TransmittingCoil no + 0019,10A0 SurfaceCoilType no + 0019,10A1 ExtremityCoilFlag no + 0019,10A2 RawDataRunNumber no + 0019,10A3 CalibratedFieldStrength no + 0019,10A4 SATFatWaterBone no + 0019,10A5 ReceiveBandwidth no + 0019,10A7 UserData01 no + 0019,10A8 UserData02 no + 0019,10A9 UserData03 no + 0019,10AA UserData04 no + 0019,10AB UserData05 no + 0019,10AC UserData06 no + 0019,10AD UserData07 no + 0019,10AE UserData08 no + 0019,10AF UserData09 no + 0019,10B0 UserData10 no + 0019,10B1 UserData11 no + 0019,10B2 UserData12 no + 0019,10B3 UserData13 no + 0019,10B4 UserData14 no + 0019,10B5 UserData15 no + 0019,10B6 UserData16 no + 0019,10B7 UserData17 no + 0019,10B8 UserData18 no + 0019,10B9 UserData19 no + 0019,10BA UserData20 no + 0019,10BB UserData21 no + 0019,10BC UserData22 no + 0019,10BD UserData23 no + 0019,10BE ProjectionAngle no + 0019,10C0 SaturationPlanes no + 0019,10C1 SurfaceCoilIntensity no + 0019,10C2 SATLocationR no + 0019,10C3 SATLocationL no + 0019,10C4 SATLocationA no + 0019,10C5 SATLocationP no + 0019,10C6 SATLocationH no + 0019,10C7 SATLocationF no + 0019,10C8 SATThicknessR-L no + 0019,10C9 SATThicknessA-P no + 0019,10CA SATThicknessH-F no + 0019,10CB PrescribedFlowAxis no + 0019,10CC VelocityEncoding no + 0019,10CD ThicknessDisclaimer no + 0019,10CE PrescanType no + 0019,10CF PrescanStatus no + 0019,10D0 RawDataType no + 0019,10D2 ProjectionAlgorithm no + 0019,10D3 ProjectionAlgorithm no + 0019,10D5 FractionalEcho no + 0019,10D6 PrepPulse no + 0019,10D7 CardiacPhases no + 0019,10D8 VariableEchoflag no + 0019,10D9 ConcatenatedSAT no + 0019,10DA ReferenceChannelUsed no + 0019,10DB BackProjectorCoefficient no + 0019,10DC PrimarySpeedCorrectionUsed no + 0019,10DD OverrangeCorrectionUsed no + 0019,10DE DynamicZAlphaValue no + 0019,10DF UserData no + 0019,10E0 UserData no + 0019,10E2 VelocityEncodeScale no + 0019,10F2 FastPhases no + 0019,10F9 TransmissionGain no + 0020,0000 RelationshipGroupLength no + 0020,000D StudyInstanceUID no + 0020,000E SeriesInstanceUID no + 0020,0010 StudyID no + 0020,0011 SeriesNumber no + 0020,0012 AcquisitionNumber no + 0020,0013 InstanceNumber no + 0020,0014 IsotopeNumber no + 0020,0015 PhaseNumber no + 0020,0016 IntervalNumber no + 0020,0017 TimeSlotNumber no + 0020,0018 AngleNumber no + 0020,0019 ItemNumber no + 0020,0020 PatientOrientation no + 0020,0022 OverlayNumber no + 0020,0024 CurveNumber no + 0020,0026 LookupTableNumber no + 0020,0030 ImagePosition no + 0020,0032 ImagePositionPatient no + 0020,0035 ImageOrientation no + 0020,0037 ImageOrientationPatient no + 0020,0050 Location no + 0020,0052 FrameOfReferenceUID no + 0020,0060 Laterality no + 0020,0062 ImageLaterality no + 0020,0070 ImageGeometryType no + 0020,0080 MaskingImage no + 0020,0100 TemporalPositionIdentifier no + 0020,0105 NumberOfTemporalPositions no + 0020,0110 TemporalResolution no + 0020,0200 SynchronizationFrameOfReferenceUID no + 0020,1000 SeriesInStudy no + 0020,1001 AcquisitionsInSeries no + 0020,1002 ImagesInAcquisition no + 0020,1003 ImagesInSeries no + 0020,1004 AcquisitionsInStudy no + 0020,1005 ImagesInStudy no + 0020,1020 Reference no + 0020,1040 PositionReferenceIndicator no + 0020,1041 SliceLocation no + 0020,1070 OtherStudyNumbers no + 0020,1200 NumberOfPatientRelatedStudies no + 0020,1202 NumberOfPatientRelatedSeries no + 0020,1204 NumberOfPatientRelatedInstances no + 0020,1206 NumberOfStudyRelatedSeries no + 0020,1208 NumberOfStudyRelatedInstances no + 0020,1209 NumberOfSeriesRelatedInstances no + 0020,31xx SourceImageIDs no + 0020,3401 ModifyingDeviceID no + 0020,3402 ModifiedImageID no + 0020,3403 ModifiedImageDate no + 0020,3404 ModifyingDeviceManufacturer no + 0020,3405 ModifiedImageTime no + 0020,3406 ModifiedImageDescription no + 0020,4000 ImageComments no + 0020,5000 OriginalImageIdentification no + 0020,5002 OriginalImageIdentNomenclature no + 0020,9056 StackID no + 0020,9057 InStackPositionNumber no + 0020,9071 FrameAnatomySequence no + 0020,9072 FrameLaterality no + 0020,9111 FrameContentSequence no + 0020,9113 PlanePositionSequence no + 0020,9116 PlaneOrientationSequence no + 0020,9128 TemporalPositionIndex no + 0020,9153 TriggerDelayTime no + 0020,9156 FrameAcquisitionNumber no + 0020,9157 DimensionIndexValues no + 0020,9158 FrameComments no + 0020,9161 ConcatenationUID no + 0020,9162 InConcatenationNumber no + 0020,9163 InConcatenationTotalNumber no + 0020,9164 DimensionOrganizationUID no + 0020,9165 DimensionIndexPointer no + 0020,9167 FunctionalGroupPointer no + 0020,9213 DimensionIndexPrivateCreator no + 0020,9221 DimensionOrganizationSequence no + 0020,9222 DimensionIndexSequence no + 0020,9228 ConcatenationFrameOffsetNumber no + 0020,9238 FunctionalGroupPrivateCreator no + 0020,9241 NominalPercentageOfCardiacPhase no + 0020,9245 NominalPercentOfRespiratoryPhase no + 0020,9246 StartingRespiratoryAmplitude no + 0020,9247 StartingRespiratoryPhase no + 0020,9248 EndingRespiratoryAmplitude no + 0020,9249 EndingRespiratoryPhase no + 0020,9250 RespiratoryTriggerType no + 0020,9251 RRIntervalTimeNominal no + 0020,9252 ActualCardiacTriggerDelayTime no + 0020,9253 RespiratorySynchronizationSequence no + 0020,9254 RespiratoryIntervalTime no + 0020,9255 NominalRespiratoryTriggerDelayTime no + 0020,9256 RespiratoryTriggerDelayThreshold no + 0020,9257 ActualRespiratoryTriggerDelayTime no + 0020,9301 ImagePositionVolume no + 0020,9302 ImageOrientationVolume no + 0020,9308 ApexPosition no + 0020,9421 DimensionDescriptionLabel no + 0020,9450 PatientOrientationInFrameSequence no + 0020,9453 FrameLabel no + 0020,9518 AcquisitionIndex no + 0020,9529 ContributingSOPInstancesRefSeq no + 0020,9536 ReconstructionIndex no + 0021,1003 SeriesFromWhichPrescribed no + 0021,1005 GenesisVersionNow no + 0021,1007 SeriesRecordChecksum no + 0021,1018 GenesisVersionNow no + 0021,1019 AcqreconRecordChecksum no + 0021,1020 TableStartLocation no + 0021,1035 SeriesFromWhichPrescribed no + 0021,1036 ImageFromWhichPrescribed no + 0021,1037 ScreenFormat no + 0021,104A AnatomicalReferenceForScout no + 0021,104F LocationsInAcquisition no + 0021,1050 GraphicallyPrescribed no + 0021,1051 RotationFromSourceXRot no + 0021,1052 RotationFromSourceYRot no + 0021,1053 RotationFromSourceZRot no + 0021,1054 ImagePosition no + 0021,1055 ImageOrientation no + 0021,1056 IntegerSlop no + 0021,1057 IntegerSlop no + 0021,1058 IntegerSlop no + 0021,1059 IntegerSlop no + 0021,105A IntegerSlop no + 0021,105B FloatSlop no + 0021,105C FloatSlop no + 0021,105D FloatSlop no + 0021,105E FloatSlop no + 0021,105F FloatSlop no + 0021,1081 AutoWindowLevelAlpha no + 0021,1082 AutoWindowLevelBeta no + 0021,1083 AutoWindowLevelWindow no + 0021,1084 ToWindowLevelLevel no + 0021,1090 TubeFocalSpotPosition no + 0021,1091 BiopsyPosition no + 0021,1092 BiopsyTLocation no + 0021,1093 BiopsyRefLocation no + 0022,0001 LightPathFilterPassThroughWavelen no + 0022,0002 LightPathFilterPassBand no + 0022,0003 ImagePathFilterPassThroughWavelen no + 0022,0004 ImagePathFilterPassBand no + 0022,0005 PatientEyeMovementCommanded no + 0022,0006 PatientEyeMovementCommandCodeSeq no + 0022,0007 SphericalLensPower no + 0022,0008 CylinderLensPower no + 0022,0009 CylinderAxis no + 0022,000A EmmetropicMagnification no + 0022,000B IntraOcularPressure no + 0022,000C HorizontalFieldOfView no + 0022,000D PupilDilated no + 0022,000E DegreeOfDilation no + 0022,0010 StereoBaselineAngle no + 0022,0011 StereoBaselineDisplacement no + 0022,0012 StereoHorizontalPixelOffset no + 0022,0013 StereoVerticalPixelOffset no + 0022,0014 StereoRotation no + 0022,0015 AcquisitionDeviceTypeCodeSequence no + 0022,0016 IlluminationTypeCodeSequence no + 0022,0017 LightPathFilterTypeStackCodeSeq no + 0022,0018 ImagePathFilterTypeStackCodeSeq no + 0022,0019 LensesCodeSequence no + 0022,001A ChannelDescriptionCodeSequence no + 0022,001B RefractiveStateSequence no + 0022,001C MydriaticAgentCodeSequence no + 0022,001D RelativeImagePositionCodeSequence no + 0022,0020 StereoPairsSequence no + 0022,0021 LeftImageSequence no + 0022,0022 RightImageSequence no + 0022,0030 AxialLengthOfTheEye no + 0022,0031 OphthalmicFrameLocationSequence no + 0022,0032 ReferenceCoordinates no + 0022,0035 DepthSpatialResolution no + 0022,0036 MaximumDepthDistortion no + 0022,0037 AlongScanSpatialResolution no + 0022,0038 MaximumAlongScanDistortion no + 0022,0039 OphthalmicImageOrientation no + 0022,0041 DepthOfTransverseImage no + 0022,0042 MydriaticAgentConcUnitsSeq no + 0022,0048 AcrossScanSpatialResolution no + 0022,0049 MaximumAcrossScanDistortion no + 0022,004E MydriaticAgentConcentration no + 0022,0055 IlluminationWaveLength no + 0022,0056 IlluminationPower no + 0022,0057 IlluminationBandwidth no + 0022,0058 MydriaticAgentSequence no + 0023,1001 NumberOfSeriesInStudy no + 0023,1002 NumberOfUnarchivedSeries no + 0023,1010 ReferenceImageField no + 0023,1050 SummaryImage no + 0023,1070 StartTimeSecsInFirstAxial no + 0023,1074 NoofUpdatesToHeader no + 0023,107D IndicatesIfTheStudyHasCompleteInfo no + 0025,1006 LastPulseSequenceUsed no + 0025,1007 ImagesInSeries no + 0025,1010 LandmarkCounter no + 0025,1011 NumberOfAcquisitions no + 0025,1014 IndicatesNoofUpdatesToHeader no + 0025,1017 SeriesCompleteFlag no + 0025,1018 NumberOfImagesArchived no + 0025,1019 LastImageNumberUsed no + 0025,101A PrimaryReceiverSuiteAndHost no + 0027,1006 ImageArchiveFlag no + 0027,1010 ScoutType no + 0027,101C VmaMamp no + 0027,101D VmaPhase no + 0027,101E VmaMod no + 0027,101F VmaClip no + 0027,1020 SmartScanOnOffFlag no + 0027,1030 ForeignImageRevision no + 0027,1031 ImagingMode no + 0027,1032 PulseSequence no + 0027,1033 ImagingOptions no + 0027,1035 PlaneType no + 0027,1036 ObliquePlane no + 0027,1040 RASLetterOfImageLocation no + 0027,1041 ImageLocation no + 0027,1042 CenterRCoordOfPlaneImage no + 0027,1043 CenterACoordOfPlaneImage no + 0027,1044 CenterSCoordOfPlaneImage no + 0027,1045 NormalRCoord no + 0027,1046 NormalACoord no + 0027,1047 NormalSCoord no + 0027,1048 RCoordOfTopRightCorner no + 0027,1049 ACoordOfTopRightCorner no + 0027,104A SCoordOfTopRightCorner no + 0027,104B RCoordOfBottomRightCorner no + 0027,104C ACoordOfBottomRightCorner no + 0027,104D SCoordOfBottomRightCorner no + 0027,1050 TableStartLocation no + 0027,1051 TableEndLocation no + 0027,1052 RASLetterForSideOfImage no + 0027,1053 RASLetterForAnteriorPosterior no + 0027,1054 RASLetterForScoutStartLoc no + 0027,1055 RASLetterForScoutEndLoc no + 0027,1060 ImageDimensionX no + 0027,1061 ImageDimensionY no + 0027,1062 NumberOfExcitations no + 0028,0000 ImagePresentationGroupLength no + 0028,0002 SamplesPerPixel no + 0028,0003 SamplesPerPixelUsed no + 0028,0004 PhotometricInterpretation no + 0028,0005 ImageDimensions no + 0028,0006 PlanarConfiguration no + 0028,0008 NumberOfFrames no + 0028,0009 FrameIncrementPointer no + 0028,000A FrameDimensionPointer no + 0028,0010 Rows no + 0028,0011 Columns no + 0028,0012 Planes no + 0028,0014 UltrasoundColorDataPresent no + 0028,0030 PixelSpacing no + 0028,0031 ZoomFactor no + 0028,0032 ZoomCenter no + 0028,0034 PixelAspectRatio no + 0028,0040 ImageFormat no + 0028,0050 ManipulatedImage no + 0028,0051 CorrectedImage no + 0028,005F CompressionRecognitionCode no + 0028,0060 CompressionCode no + 0028,0061 CompressionOriginator no + 0028,0062 CompressionLabel no + 0028,0063 CompressionDescription no + 0028,0065 CompressionSequence no + 0028,0066 CompressionStepPointers no + 0028,0068 RepeatInterval no + 0028,0069 BitsGrouped no + 0028,0070 PerimeterTable no + 0028,0071 PerimeterValue no + 0028,0080 PredictorRows no + 0028,0081 PredictorColumns no + 0028,0082 PredictorConstants no + 0028,0090 BlockedPixels no + 0028,0091 BlockRows no + 0028,0092 BlockColumns no + 0028,0093 RowOverlap no + 0028,0094 ColumnOverlap no + 0028,0100 BitsAllocated no + 0028,0101 BitsStored no + 0028,0102 HighBit no + 0028,0103 PixelRepresentation no + 0028,0104 SmallestValidPixelValue no + 0028,0105 LargestValidPixelValue no + 0028,0106 SmallestImagePixelValue no + 0028,0107 LargestImagePixelValue no + 0028,0108 SmallestPixelValueInSeries no + 0028,0109 LargestPixelValueInSeries no + 0028,0110 SmallestImagePixelValueInPlane no + 0028,0111 LargestImagePixelValueInPlane no + 0028,0120 PixelPaddingValue no + 0028,0121 PixelPaddingRangeLimit no + 0028,0200 ImageLocation no + 0028,0300 QualityControlImage no + 0028,0301 BurnedInAnnotation no + 0028,0400 TransformLabel no + 0028,0401 TransformVersionNumber no + 0028,0402 NumberOfTransformSteps no + 0028,0403 SequenceOfCompressedData no + 0028,0404 DetailsOfCoefficients no + 0028,04x2 CoefficientCoding no + 0028,04x3 CoefficientCodingPointers no + 0028,0700 DCTLabel no + 0028,0701 DataBlockDescription no + 0028,0702 DataBlock no + 0028,0710 NormalizationFactorFormat no + 0028,0720 ZonalMapNumberFormat no + 0028,0721 ZonalMapLocation no + 0028,0722 ZonalMapFormat no + 0028,0730 AdaptiveMapFormat no + 0028,0740 CodeNumberFormat no + 0028,08x0 CodeLabel no + 0028,08x2 NumberOfTables no + 0028,08x3 CodeTableLocation no + 0028,08x4 BitsForCodeWord no + 0028,08x8 ImageDataLocation no + 0028,0A02 PixelSpacingCalibrationType no + 0028,0A04 PixelSpacingCalibrationDescription no + 0028,1040 PixelIntensityRelationship no + 0028,1041 PixelIntensityRelationshipSign no + 0028,1050 WindowCenter no + 0028,1051 WindowWidth no + 0028,1052 RescaleIntercept no + 0028,1053 RescaleSlope no + 0028,1054 RescaleType no + 0028,1055 WindowCenterAndWidthExplanation no + 0028,1056 VOI_LUTFunction no + 0028,1080 GrayScale no + 0028,1090 RecommendedViewingMode no + 0028,1100 GrayLookupTableDescriptor no + 0028,1101 RedPaletteColorTableDescriptor no + 0028,1102 GreenPaletteColorTableDescriptor no + 0028,1103 BluePaletteColorTableDescriptor no + 0028,1111 LargeRedPaletteColorTableDescr no + 0028,1112 LargeGreenPaletteColorTableDescr no + 0028,1113 LargeBluePaletteColorTableDescr no + 0028,1199 PaletteColorTableUID no + 0028,1200 GrayLookupTableData no + 0028,1201 RedPaletteColorTableData no + 0028,1202 GreenPaletteColorTableData no + 0028,1203 BluePaletteColorTableData no + 0028,1211 LargeRedPaletteColorTableData no + 0028,1212 LargeGreenPaletteColorTableData no + 0028,1213 LargeBluePaletteColorTableData no + 0028,1214 LargePaletteColorLookupTableUID no + 0028,1221 SegmentedRedColorTableData no + 0028,1222 SegmentedGreenColorTableData no + 0028,1223 SegmentedBlueColorTableData no + 0028,1300 BreastImplantPresent no + 0028,1350 PartialView no + 0028,1351 PartialViewDescription no + 0028,1352 PartialViewCodeSequence no + 0028,135A SpatialLocationsPreserved no + 0028,1402 DataPathAssignment no + 0028,1404 BlendingLUT1Sequence no + 0028,1406 BlendingWeightConstant no + 0028,1408 BlendingLookupTableData no + 0028,140C BlendingLUT2Sequence no + 0028,140E DataPathID no + 0028,140F RGBLUTTransferFunction no + 0028,1410 AlphaLUTTransferFunction no + 0028,2000 ICCProfile no + 0028,2110 LossyImageCompression no + 0028,2112 LossyImageCompressionRatio no + 0028,2114 LossyImageCompressionMethod no + 0028,3000 ModalityLUTSequence no + 0028,3002 LUTDescriptor no + 0028,3003 LUTExplanation no + 0028,3004 ModalityLUTType no + 0028,3006 LUTData no + 0028,3010 VOILUTSequence no + 0028,3110 SoftcopyVOILUTSequence no + 0028,4000 ImagePresentationComments no + 0028,5000 BiPlaneAcquisitionSequence no + 0028,6010 RepresentativeFrameNumber no + 0028,6020 FrameNumbersOfInterest no + 0028,6022 FrameOfInterestDescription no + 0028,6023 FrameOfInterestType no + 0028,6030 MaskPointers no + 0028,6040 RWavePointer no + 0028,6100 MaskSubtractionSequence no + 0028,6101 MaskOperation no + 0028,6102 ApplicableFrameRange no + 0028,6110 MaskFrameNumbers no + 0028,6112 ContrastFrameAveraging no + 0028,6114 MaskSubPixelShift no + 0028,6120 TIDOffset no + 0028,6190 MaskOperationExplanation no + 0028,7FE0 PixelDataProviderURL no + 0028,9001 DataPointRows no + 0028,9002 DataPointColumns no + 0028,9003 SignalDomainColumns no + 0028,9099 LargestMonochromePixelValue no + 0028,9108 DataRepresentation no + 0028,9110 PixelMeasuresSequence no + 0028,9132 FrameVOILUTSequence no + 0028,9145 PixelValueTransformationSequence no + 0028,9235 SignalDomainRows no + 0028,9411 DisplayFilterPercentage no + 0028,9415 FramePixelShiftSequence no + 0028,9416 SubtractionItemID no + 0028,9422 PixelIntensityRelationshipLUTSeq no + 0028,9443 FramePixelDataPropertiesSequence no + 0028,9444 GeometricalProperties no + 0028,9445 GeometricMaximumDistortion no + 0028,9446 ImageProcessingApplied no + 0028,9454 MaskSelectionMode no + 0028,9474 LUTFunction no + 0028,9478 MaskVisibilityPercentage no + 0028,9501 PixelShiftSequence no + 0028,9502 RegionPixelShiftSequence no + 0028,9503 VerticesOfTheRegion no + 0028,9506 PixelShiftFrameRange no + 0028,9507 LUTFrameRange no + 0028,9520 ImageToEquipmentMappingMatrix no + 0028,9537 EquipmentCoordinateSystemID no + 0029,1004 LowerRangeOfPixels1a no + 0029,1005 LowerRangeOfPixels1b no + 0029,1006 LowerRangeOfPixels1c no + 0029,1007 LowerRangeOfPixels1d no + 0029,1008 LowerRangeOfPixels1e no + 0029,1009 LowerRangeOfPixels1f no + 0029,100A LowerRangeOfPixels1g no + 0029,1015 LowerRangeOfPixels1h no + 0029,1016 LowerRangeOfPixels1i no + 0029,1017 LowerRangeOfPixels2 no + 0029,1018 UpperRangeOfPixels2 no + 0029,101A LenOfTotHdrInBytes no + 0029,1026 VersionOfTheHdrStruct no + 0029,1034 AdvantageCompOverflow no + 0029,1035 AdvantageCompUnderflow no + 0032,0000 StudyGroupLength no + 0032,000A StudyStatusID no + 0032,000C StudyPriorityID no + 0032,0012 StudyIDIssuer no + 0032,0032 StudyVerifiedDate no + 0032,0033 StudyVerifiedTime no + 0032,0034 StudyReadDate no + 0032,0035 StudyReadTime no + 0032,1000 ScheduledStudyStartDate no + 0032,1001 ScheduledStudyStartTime no + 0032,1010 ScheduledStudyStopDate no + 0032,1011 ScheduledStudyStopTime no + 0032,1020 ScheduledStudyLocation no + 0032,1021 ScheduledStudyLocationAETitle no + 0032,1030 ReasonForStudy no + 0032,1031 RequestingPhysicianIDSequence no + 0032,1032 RequestingPhysician no + 0032,1033 RequestingService no + 0032,1040 StudyArrivalDate no + 0032,1041 StudyArrivalTime no + 0032,1050 StudyCompletionDate no + 0032,1051 StudyCompletionTime no + 0032,1055 StudyComponentStatusID no + 0032,1060 RequestedProcedureDescription no + 0032,1064 RequestedProcedureCodeSequence no + 0032,1070 RequestedContrastAgent no + 0032,4000 StudyComments no + 0038,0004 ReferencedPatientAliasSequence no + 0038,0008 VisitStatusID no + 0038,0010 AdmissionID no + 0038,0011 IssuerOfAdmissionID no + 0038,0016 RouteOfAdmissions no + 0038,001A ScheduledAdmissionDate no + 0038,001B ScheduledAdmissionTime no + 0038,001C ScheduledDischargeDate no + 0038,001D ScheduledDischargeTime no + 0038,001E ScheduledPatientInstitResidence no + 0038,0020 AdmittingDate no + 0038,0021 AdmittingTime no + 0038,0030 DischargeDate no + 0038,0032 DischargeTime no + 0038,0040 DischargeDiagnosisDescription no + 0038,0044 DischargeDiagnosisCodeSequence no + 0038,0050 SpecialNeeds no + 0038,0060 ServiceEpisodeID no + 0038,0061 IssuerOfServiceEpisodeID no + 0038,0062 ServiceEpisodeDescription no + 0038,0100 PertinentDocumentsSequence no + 0038,0300 CurrentPatientLocation no + 0038,0400 PatientInstitutionResidence no + 0038,0500 PatientState no + 0038,0502 PatientClinicalTrialParticipSeq no + 0038,4000 VisitComments no + 003A,0004 WaveformOriginality no + 003A,0005 NumberOfWaveformChannels no + 003A,0010 NumberOfWaveformSamples no + 003A,001A SamplingFrequency no + 003A,0020 MultiplexGroupLabel no + 003A,0200 ChannelDefinitionSequence no + 003A,0202 WaveformChannelNumber no + 003A,0203 ChannelLabel no + 003A,0205 ChannelStatus no + 003A,0208 ChannelSourceSequence no + 003A,0209 ChannelSourceModifiersSequence no + 003A,020A SourceWaveformSequence no + 003A,020C ChannelDerivationDescription no + 003A,0210 ChannelSensitivity no + 003A,0211 ChannelSensitivityUnitsSequence no + 003A,0212 ChannelSensitivityCorrectionFactor no + 003A,0213 ChannelBaseline no + 003A,0214 ChannelTimeSkew no + 003A,0215 ChannelSampleSkew no + 003A,0218 ChannelOffset no + 003A,021A WaveformBitsStored no + 003A,0220 FilterLowFrequency no + 003A,0221 FilterHighFrequency no + 003A,0222 NotchFilterFrequency no + 003A,0223 NotchFilterBandwidth no + 003A,0230 WaveformDataDisplayScale no + 003A,0231 WaveformDisplayBkgCIELabValue no + 003A,0240 WaveformPresentationGroupSequence no + 003A,0241 PresentationGroupNumber no + 003A,0242 ChannelDisplaySequence no + 003A,0244 ChannelRecommendDisplayCIELabValue no + 003A,0245 ChannelPosition no + 003A,0246 DisplayShadingFlag no + 003A,0247 FractionalChannelDisplayScale no + 003A,0248 AbsoluteChannelDisplayScale no + 003A,0300 MultiplexAudioChannelsDescrCodeSeq no + 003A,0301 ChannelIdentificationCode no + 003A,0302 ChannelMode no + 0040,0001 ScheduledStationAETitle no + 0040,0002 ScheduledProcedureStepStartDate no + 0040,0003 ScheduledProcedureStepStartTime no + 0040,0004 ScheduledProcedureStepEndDate no + 0040,0005 ScheduledProcedureStepEndTime no + 0040,0006 ScheduledPerformingPhysiciansName no + 0040,0007 ScheduledProcedureStepDescription no + 0040,0008 ScheduledProtocolCodeSequence no + 0040,0009 ScheduledProcedureStepID no + 0040,000A StageCodeSequence no + 0040,000B ScheduledPerformingPhysicianIDSeq no + 0040,0010 ScheduledStationName no + 0040,0011 ScheduledProcedureStepLocation no + 0040,0012 PreMedication no + 0040,0020 ScheduledProcedureStepStatus no + 0040,0031 LocalNamespaceEntityID no + 0040,0032 UniversalEntityID no + 0040,0033 UniversalEntityIDType no + 0040,0035 IdentifierTypeCode no + 0040,0036 AssigningFacilitySequence no + 0040,0100 ScheduledProcedureStepSequence no + 0040,0220 ReferencedNonImageCompositeSOPSeq no + 0040,0241 PerformedStationAETitle no + 0040,0242 PerformedStationName no + 0040,0243 PerformedLocation no + 0040,0244 PerformedProcedureStepStartDate no + 0040,0245 PerformedProcedureStepStartTime no + 0040,0250 PerformedProcedureStepEndDate no + 0040,0251 PerformedProcedureStepEndTime no + 0040,0252 PerformedProcedureStepStatus no + 0040,0253 PerformedProcedureStepID no + 0040,0254 PerformedProcedureStepDescription no + 0040,0255 PerformedProcedureTypeDescription no + 0040,0260 PerformedProtocolCodeSequence no + 0040,0261 PerformedProtocolType no + 0040,0270 ScheduledStepAttributesSequence no + 0040,0275 RequestAttributesSequence no + 0040,0280 CommentsOnPerformedProcedureStep no + 0040,0281 ProcStepDiscontinueReasonCodeSeq no + 0040,0293 QuantitySequence no + 0040,0294 Quantity no + 0040,0295 MeasuringUnitsSequence no + 0040,0296 BillingItemSequence no + 0040,0300 TotalTimeOfFluoroscopy no + 0040,0301 TotalNumberOfExposures no + 0040,0302 EntranceDose no + 0040,0303 ExposedArea no + 0040,0306 DistanceSourceToEntrance no + 0040,0307 DistanceSourceToSupport no + 0040,030E ExposureDoseSequence no + 0040,0310 CommentsOnRadiationDose no + 0040,0312 XRayOutput no + 0040,0314 HalfValueLayer no + 0040,0316 OrganDose no + 0040,0318 OrganExposed no + 0040,0320 BillingProcedureStepSequence no + 0040,0321 FilmConsumptionSequence no + 0040,0324 BillingSuppliesAndDevicesSequence no + 0040,0330 ReferencedProcedureStepSequence no + 0040,0340 PerformedSeriesSequence no + 0040,0400 CommentsOnScheduledProcedureStep no + 0040,0440 ProtocolContextSequence no + 0040,0441 ContentItemModifierSequence no + 0040,050A SpecimenAccessionNumber no + 0040,0512 ContainerIdentifier no + 0040,051A ContainerDescription no + 0040,0550 SpecimenSequence no + 0040,0551 SpecimenIdentifier no + 0040,0552 SpecimenDescriptionSequenceTrial no + 0040,0553 SpecimenDescriptionTrial no + 0040,0554 SpecimenUID no + 0040,0555 AcquisitionContextSequence no + 0040,0556 AcquisitionContextDescription no + 0040,059A SpecimenTypeCodeSequence no + 0040,0600 SpecimenShortDescription no + 0040,06FA SlideIdentifier no + 0040,071A ImageCenterPointCoordinatesSeq no + 0040,072A XOffsetInSlideCoordinateSystem no + 0040,073A YOffsetInSlideCoordinateSystem no + 0040,074A ZOffsetInSlideCoordinateSystem no + 0040,08D8 PixelSpacingSequence no + 0040,08DA CoordinateSystemAxisCodeSequence no + 0040,08EA MeasurementUnitsCodeSequence no + 0040,09F8 VitalStainCodeSequenceTrial no + 0040,1001 RequestedProcedureID no + 0040,1002 ReasonForRequestedProcedure no + 0040,1003 RequestedProcedurePriority no + 0040,1004 PatientTransportArrangements no + 0040,1005 RequestedProcedureLocation no + 0040,1006 PlacerOrderNumber-Procedure no + 0040,1007 FillerOrderNumber-Procedure no + 0040,1008 ConfidentialityCode no + 0040,1009 ReportingPriority no + 0040,100A ReasonForRequestedProcedureCodeSeq no + 0040,1010 NamesOfIntendedRecipientsOfResults no + 0040,1011 IntendedRecipientsOfResultsIDSeq no + 0040,1101 PersonIdentificationCodeSequence no + 0040,1102 PersonAddress no + 0040,1103 PersonTelephoneNumbers no + 0040,1400 RequestedProcedureComments no + 0040,2001 ReasonForImagingServiceRequest no + 0040,2004 IssueDateOfImagingServiceRequest no + 0040,2005 IssueTimeOfImagingServiceRequest no + 0040,2006 PlacerOrderNum-ImagingServiceReq no + 0040,2007 FillerOrderNum-ImagingServiceReq no + 0040,2008 OrderEnteredBy no + 0040,2009 OrderEntererLocation no + 0040,2010 OrderCallbackPhoneNumber no + 0040,2016 PlacerOrderNum-ImagingServiceReq no + 0040,2017 FillerOrderNum-ImagingServiceReq no + 0040,2400 ImagingServiceRequestComments no + 0040,3001 ConfidentialityOnPatientDataDescr no + 0040,4001 GenPurposeScheduledProcStepStatus no + 0040,4002 GenPurposePerformedProcStepStatus no + 0040,4003 GenPurposeSchedProcStepPriority no + 0040,4004 SchedProcessingApplicationsCodeSeq no + 0040,4005 SchedProcedureStepStartDateAndTime no + 0040,4006 MultipleCopiesFlag no + 0040,4007 PerformedProcessingAppsCodeSeq no + 0040,4009 HumanPerformerCodeSequence no + 0040,4010 SchedProcStepModificationDateTime no + 0040,4011 ExpectedCompletionDateAndTime no + 0040,4015 ResultingGenPurposePerfProcStepSeq no + 0040,4016 RefGenPurposeSchedProcStepSeq no + 0040,4018 ScheduledWorkitemCodeSequence no + 0040,4019 PerformedWorkitemCodeSequence no + 0040,4020 InputAvailabilityFlag no + 0040,4021 InputInformationSequence no + 0040,4022 RelevantInformationSequence no + 0040,4023 RefGenPurSchedProcStepTransUID no + 0040,4025 ScheduledStationNameCodeSequence no + 0040,4026 ScheduledStationClassCodeSequence no + 0040,4027 SchedStationGeographicLocCodeSeq no + 0040,4028 PerformedStationNameCodeSequence no + 0040,4029 PerformedStationClassCodeSequence no + 0040,4030 PerformedStationGeogLocCodeSeq no + 0040,4031 RequestedSubsequentWorkItemCodeSeq no + 0040,4032 NonDICOMOutputCodeSequence no + 0040,4033 OutputInformationSequence no + 0040,4034 ScheduledHumanPerformersSequence no + 0040,4035 ActualHumanPerformersSequence no + 0040,4036 HumanPerformersOrganization no + 0040,4037 HumanPerformerName no + 0040,4040 RawDataHandling no + 0040,8302 EntranceDoseInMilliGy no + 0040,9094 RefImageRealWorldValueMappingSeq no + 0040,9096 RealWorldValueMappingSequence no + 0040,9098 PixelValueMappingCodeSequence no + 0040,9210 LUTLabel no + 0040,9211 RealWorldValueLastValueMapped no + 0040,9212 RealWorldValueLUTData no + 0040,9216 RealWorldValueFirstValueMapped no + 0040,9224 RealWorldValueIntercept no + 0040,9225 RealWorldValueSlope no + 0040,A010 RelationshipType no + 0040,A027 VerifyingOrganization no + 0040,A030 VerificationDateTime no + 0040,A032 ObservationDateTime no + 0040,A040 ValueType no + 0040,A043 ConceptNameCodeSequence no + 0040,A050 ContinuityOfContent no + 0040,A073 VerifyingObserverSequence no + 0040,A075 VerifyingObserverName no + 0040,A078 AuthorObserverSequence no + 0040,A07A ParticipantSequence no + 0040,A07C CustodialOrganizationSequence no + 0040,A080 ParticipationType no + 0040,A082 ParticipationDateTime no + 0040,A084 ObserverType no + 0040,A088 VerifyingObserverIdentCodeSequence no + 0040,A090 EquivalentCDADocumentSequence no + 0040,A0B0 ReferencedWaveformChannels no + 0040,A120 DateTime no + 0040,A121 Date no + 0040,A122 Time no + 0040,A123 PersonName no + 0040,A124 UID no + 0040,A130 TemporalRangeType no + 0040,A132 ReferencedSamplePositions no + 0040,A136 ReferencedFrameNumbers no + 0040,A138 ReferencedTimeOffsets no + 0040,A13A ReferencedDateTime no + 0040,A160 TextValue no + 0040,A168 ConceptCodeSequence no + 0040,A170 PurposeOfReferenceCodeSequence no + 0040,A180 AnnotationGroupNumber no + 0040,A195 ModifierCodeSequence no + 0040,A300 MeasuredValueSequence no + 0040,A301 NumericValueQualifierCodeSequence no + 0040,A30A NumericValue no + 0040,A353 AddressTrial no + 0040,A354 TelephoneNumberTrial no + 0040,A360 PredecessorDocumentsSequence no + 0040,A370 ReferencedRequestSequence no + 0040,A372 PerformedProcedureCodeSequence no + 0040,A375 CurrentRequestedProcEvidenceSeq no + 0040,A385 PertinentOtherEvidenceSequence no + 0040,A390 HL7StructuredDocumentRefSeq no + 0040,A491 CompletionFlag no + 0040,A492 CompletionFlagDescription no + 0040,A493 VerificationFlag no + 0040,A494 ArchiveRequested no + 0040,A496 PreliminaryFlag no + 0040,A504 ContentTemplateSequence no + 0040,A525 IdenticalDocumentsSequence no + 0040,A730 ContentSequence no + 0040,B020 AnnotationSequence no + 0040,DB00 TemplateIdentifier no + 0040,DB06 TemplateVersion no + 0040,DB07 TemplateLocalVersion no + 0040,DB0B TemplateExtensionFlag no + 0040,DB0C TemplateExtensionOrganizationUID no + 0040,DB0D TemplateExtensionCreatorUID no + 0040,DB73 ReferencedContentItemIdentifier no + 0040,E001 HL7InstanceIdentifier no + 0040,E004 HL7DocumentEffectiveTime no + 0040,E006 HL7DocumentTypeCodeSequence no + 0040,E010 RetrieveURI no + 0040,E011 RetrieveLocationUID no + 0042,0010 DocumentTitle no + 0042,0011 EncapsulatedDocument no + 0042,0012 MIMETypeOfEncapsulatedDocument no + 0042,0013 SourceInstanceSequence no + 0042,0014 ListOfMIMETypes no + 0043,1001 BitmapOfPrescanOptions no + 0043,1002 GradientOffsetInX no + 0043,1003 GradientOffsetInY no + 0043,1004 GradientOffsetInZ no + 0043,1005 ImgIsOriginalOrUnoriginal no + 0043,1006 NumberOfEPIShots no + 0043,1007 ViewsPerSegment no + 0043,1008 RespiratoryRateBpm no + 0043,1009 RespiratoryTriggerPoint no + 0043,100A TypeOfReceiverUsed no + 0043,100B PeakRateOfChangeOfGradientField no + 0043,100C LimitsInUnitsOfPercent no + 0043,100D PSDEstimatedLimit no + 0043,100E PSDEstimatedLimitInTeslaPerSecond no + 0043,100F Saravghead no + 0043,1010 WindowValue no + 0043,1011 TotalInputViews no + 0043,1012 X-RayChain no + 0043,1013 DeconKernelParameters no + 0043,1014 CalibrationParameters no + 0043,1015 TotalOutputViews no + 0043,1016 NumberOfOverranges no + 0043,1017 IBHImageScaleFactors no + 0043,1018 BBHCoefficients no + 0043,1019 NumberOfBBHChainsToBlend no + 0043,101A StartingChannelNumber no + 0043,101B PpscanParameters no + 0043,101C GEImageIntegrity no + 0043,101D LevelValue no + 0043,101E DeltaStartTime no + 0043,101F MaxOverrangesInAView no + 0043,1020 AvgOverrangesAllViews no + 0043,1021 CorrectedAfterGlowTerms no + 0043,1025 ReferenceChannels no + 0043,1026 NoViewsRefChansBlocked no + 0043,1027 ScanPitchRatio no + 0043,1028 UniqueImageIden no + 0043,1029 HistogramTables no + 0043,102A UserDefinedData no + 0043,102B PrivateScanOptions no + 0043,102C EffectiveEchoSpacing no + 0043,102D StringSlopField1 no + 0043,102E StringSlopField2 no + 0043,102F RawDataType no + 0043,1030 RawDataType no + 0043,1031 RACordOfTargetReconCenter no + 0043,1032 RawDataType no + 0043,1033 NegScanspacing no + 0043,1034 OffsetFrequency no + 0043,1035 UserUsageTag no + 0043,1036 UserFillMapMSW no + 0043,1037 UserFillMapLSW no + 0043,1038 User25-48 no + 0043,1039 SlopInt6-9 no + 0043,1040 TriggerOnPosition no + 0043,1041 DegreeOfRotation no + 0043,1042 DASTriggerSource no + 0043,1043 DASFpaGain no + 0043,1044 DASOutputSource no + 0043,1045 DASAdInput no + 0043,1046 DASCalMode no + 0043,1047 DASCalFrequency no + 0043,1048 DASRegXm no + 0043,1049 DASAutoZero no + 0043,104A StartingChannelOfView no + 0043,104B DASXmPattern no + 0043,104C TGGCTriggerMode no + 0043,104D StartScanToXrayOnDelay no + 0043,104E DurationOfXrayOn no + 0043,1060 SlopInt10-17 no + 0043,1061 ScannerStudyEntityUID no + 0043,1062 ScannerStudyID no + 0043,106f ScannerTableEntry no + 0044,0001 ProductPackageIdentifier no + 0044,0002 SubstanceAdministrationApproval no + 0044,0003 ApprovalStatusFurtherDescription no + 0044,0004 ApprovalStatusDateTime no + 0044,0007 ProductTypeCodeSequence no + 0044,0008 ProductName no + 0044,0009 ProductDescription no + 0044,000A ProductLotIdentifier no + 0044,000B ProductExpirationDateTime no + 0044,0010 SubstanceAdministrationDateTime no + 0044,0011 SubstanceAdministrationNotes no + 0044,0012 SubstanceAdministrationDeviceID no + 0044,0013 ProductParameterSequence no + 0044,0019 SubstanceAdminParameterSeq no + 0045,1001 NumberOfMacroRowsInDetector no + 0045,1002 MacroWidthAtISOCenter no + 0045,1003 DASType no + 0045,1004 DASGain no + 0045,1005 DASTemperature no + 0045,1006 TableDirectionInOrOut no + 0045,1007 ZSmoothingFactor no + 0045,1008 ViewWeightingMode no + 0045,1009 SigmaRowNumberWhichRowsWereUsed no + 0045,100A MinimumDasValueFoundInTheScanData no + 0045,100B MaximumOffsetShiftValueUsed no + 0045,100C NumberOfViewsShifted no + 0045,100D ZTrackingFlag no + 0045,100E MeanZError no + 0045,100F ZTrackingMaximumError no + 0045,1010 StartingViewForRow2a no + 0045,1011 NumberOfViewsInRow2a no + 0045,1012 StartingViewForRow1a no + 0045,1013 SigmaMode no + 0045,1014 NumberOfViewsInRow1a no + 0045,1015 StartingViewForRow2b no + 0045,1016 NumberOfViewsInRow2b no + 0045,1017 StartingViewForRow1b no + 0045,1018 NumberOfViewsInRow1b no + 0045,1019 AirFilterCalibrationDate no + 0045,101A AirFilterCalibrationTime no + 0045,101B PhantomCalibrationDate no + 0045,101C PhantomCalibrationTime no + 0045,101D ZSlopeCalibrationDate no + 0045,101E ZSlopeCalibrationTime no + 0045,101F CrosstalkCalibrationDate no + 0045,1020 CrosstalkCalibrationTime no + 0045,1021 IterboneOptionFlag no + 0045,1022 PeristalticFlagOption no + 0046,0012 LensDescription no + 0046,0014 RightLensSequence no + 0046,0015 LeftLensSequence no + 0046,0018 CylinderSequence no + 0046,0028 PrismSequence no + 0046,0030 HorizontalPrismPower no + 0046,0032 HorizontalPrismBase no + 0046,0034 VerticalPrismPower no + 0046,0036 VerticalPrismBase no + 0046,0038 LensSegmentType no + 0046,0040 OpticalTransmittance no + 0046,0042 ChannelWidth no + 0046,0044 PupilSize no + 0046,0046 CornealSize no + 0046,0060 DistancePupillaryDistance no + 0046,0062 NearPupillaryDistance no + 0046,0064 OtherPupillaryDistance no + 0046,0075 RadiusOfCurvature no + 0046,0076 KeratometricPower no + 0046,0077 KeratometricAxis no + 0046,0092 BackgroundColor no + 0046,0094 Optotype no + 0046,0095 OptotypePresentation no + 0046,0100 AddNearSequence no + 0046,0101 AddIntermediateSequence no + 0046,0102 AddOtherSequence no + 0046,0104 AddPower no + 0046,0106 ViewingDistance no + 0046,0125 ViewingDistanceType no + 0046,0135 VisualAcuityModifiers no + 0046,0137 DecimalVisualAcuity no + 0046,0139 OptotypeDetailedDefinition no + 0046,0146 SpherePower no + 0046,0147 CylinderPower no + 0050,0004 CalibrationImage no + 0050,0010 DeviceSequence no + 0050,0014 DeviceLength no + 0050,0015 ContainerComponentWidth no + 0050,0016 DeviceDiameter no + 0050,0017 DeviceDiameterUnits no + 0050,0018 DeviceVolume no + 0050,0019 InterMarkerDistance no + 0050,001B ContainerComponentID no + 0050,0020 DeviceDescription no + 0054,0010 EnergyWindowVector no + 0054,0011 NumberOfEnergyWindows no + 0054,0012 EnergyWindowInformationSequence no + 0054,0013 EnergyWindowRangeSequence no + 0054,0014 EnergyWindowLowerLimit no + 0054,0015 EnergyWindowUpperLimit no + 0054,0016 RadiopharmaceuticalInformationSeq no + 0054,0017 ResidualSyringeCounts no + 0054,0018 EnergyWindowName no + 0054,0020 DetectorVector no + 0054,0021 NumberOfDetectors no + 0054,0022 DetectorInformationSequence no + 0054,0030 PhaseVector no + 0054,0031 NumberOfPhases no + 0054,0032 PhaseInformationSequence no + 0054,0033 NumberOfFramesInPhase no + 0054,0036 PhaseDelay no + 0054,0038 PauseBetweenFrames no + 0054,0039 PhaseDescription no + 0054,0050 RotationVector no + 0054,0051 NumberOfRotations no + 0054,0052 RotationInformationSequence no + 0054,0053 NumberOfFramesInRotation no + 0054,0060 RRIntervalVector no + 0054,0061 NumberOfRRIntervals no + 0054,0062 GatedInformationSequence no + 0054,0063 DataInformationSequence no + 0054,0070 TimeSlotVector no + 0054,0071 NumberOfTimeSlots no + 0054,0072 TimeSlotInformationSequence no + 0054,0073 TimeSlotTime no + 0054,0080 SliceVector no + 0054,0081 NumberOfSlices no + 0054,0090 AngularViewVector no + 0054,0100 TimeSliceVector no + 0054,0101 NumberOfTimeSlices no + 0054,0200 StartAngle no + 0054,0202 TypeOfDetectorMotion no + 0054,0210 TriggerVector no + 0054,0211 NumberOfTriggersInPhase no + 0054,0220 ViewCodeSequence no + 0054,0222 ViewModifierCodeSequence no + 0054,0300 RadionuclideCodeSequence no + 0054,0302 AdministrationRouteCodeSequence no + 0054,0304 RadiopharmaceuticalCodeSequence no + 0054,0306 CalibrationDataSequence no + 0054,0308 EnergyWindowNumber no + 0054,0400 ImageID no + 0054,0410 PatientOrientationCodeSequence no + 0054,0412 PatientOrientationModifierCodeSeq no + 0054,0414 PatientGantryRelationshipCodeSeq no + 0054,0500 SliceProgressionDirection no + 0054,1000 SeriesType no + 0054,1001 Units no + 0054,1002 CountsSource no + 0054,1004 ReprojectionMethod no + 0054,1100 RandomsCorrectionMethod no + 0054,1101 AttenuationCorrectionMethod no + 0054,1102 DecayCorrection no + 0054,1103 ReconstructionMethod no + 0054,1104 DetectorLinesOfResponseUsed no + 0054,1105 ScatterCorrectionMethod no + 0054,1200 AxialAcceptance no + 0054,1201 AxialMash no + 0054,1202 TransverseMash no + 0054,1203 DetectorElementSize no + 0054,1210 CoincidenceWindowWidth no + 0054,1220 SecondaryCountsType no + 0054,1300 FrameReferenceTime no + 0054,1310 PrimaryCountsAccumulated no + 0054,1311 SecondaryCountsAccumulated no + 0054,1320 SliceSensitivityFactor no + 0054,1321 DecayFactor no + 0054,1322 DoseCalibrationFactor no + 0054,1323 ScatterFractionFactor no + 0054,1324 DeadTimeFactor no + 0054,1330 ImageIndex no + 0054,1400 CountsIncluded no + 0054,1401 DeadTimeCorrectionFlag no + 0060,3000 HistogramSequence no + 0060,3002 HistogramNumberOfBins no + 0060,3004 HistogramFirstBinValue no + 0060,3006 HistogramLastBinValue no + 0060,3008 HistogramBinWidth no + 0060,3010 HistogramExplanation no + 0060,3020 HistogramData no + 0062,0001 SegmentationType no + 0062,0002 SegmentSequence no + 0062,0003 SegmentedPropertyCategoryCodeSeq no + 0062,0004 SegmentNumber no + 0062,0005 SegmentLabel no + 0062,0006 SegmentDescription no + 0062,0008 SegmentAlgorithmType no + 0062,0009 SegmentAlgorithmName no + 0062,000A SegmentIdentificationSequence no + 0062,000B ReferencedSegmentNumber no + 0062,000C RecommendedDisplayGrayscaleValue no + 0062,000D RecommendedDisplayCIELabValue no + 0062,000E MaximumFractionalValue no + 0062,000F SegmentedPropertyTypeCodeSequence no + 0062,0010 SegmentationFractionalType no + 0064,0002 DeformableRegistrationSequence no + 0064,0003 SourceFrameOfReferenceUID no + 0064,0005 DeformableRegistrationGridSequence no + 0064,0007 GridDimensions no + 0064,0008 GridResolution no + 0064,0009 VectorGridData no + 0064,000F PreDeformationMatrixRegistSeq no + 0064,0010 PostDeformationMatrixRegistSeq no + 0066,0001 NumberOfSurfaces no + 0066,0002 SurfaceSequence no + 0066,0003 SurfaceNumber no + 0066,0004 SurfaceComments no + 0066,0009 SurfaceProcessing no + 0066,000A SurfaceProcessingRatio no + 0066,000E FiniteVolume no + 0066,0010 Manifold no + 0066,0011 SurfacePointsSequence no + 0066,0015 NumberOfSurfacePoints no + 0066,0016 PointCoordinatesData no + 0066,0017 PointPositionAccuracy no + 0066,0018 MeanPointDistance no + 0066,0019 MaximumPointDistance no + 0066,001B AxisOfRotation no + 0066,001C CenterOfRotation no + 0066,001E NumberOfVectors no + 0066,001F VectorDimensionality no + 0066,0020 VectorAccuracy no + 0066,0021 VectorCoordinateData no + 0066,0023 TrianglePointIndexList no + 0066,0024 EdgePointIndexList no + 0066,0025 VertexPointIndexList no + 0066,0026 TriangleStripSequence no + 0066,0027 TriangleFanSequence no + 0066,0028 LineSequence no + 0066,0029 PrimitivePointIndexList no + 0066,002A SurfaceCount no + 0066,002F AlgorithmFamilyCodeSequ no + 0066,0031 AlgorithmVersion no + 0066,0032 AlgorithmParameters no + 0066,0034 FacetSequence no + 0066,0036 AlgorithmName no + 0070,0001 GraphicAnnotationSequence no + 0070,0002 GraphicLayer no + 0070,0003 BoundingBoxAnnotationUnits no + 0070,0004 AnchorPointAnnotationUnits no + 0070,0005 GraphicAnnotationUnits no + 0070,0006 UnformattedTextValue no + 0070,0008 TextObjectSequence no + 0070,0009 GraphicObjectSequence no + 0070,0010 BoundingBoxTopLeftHandCorner no + 0070,0011 BoundingBoxBottomRightHandCorner no + 0070,0012 BoundingBoxTextHorizJustification no + 0070,0014 AnchorPoint no + 0070,0015 AnchorPointVisibility no + 0070,0020 GraphicDimensions no + 0070,0021 NumberOfGraphicPoints no + 0070,0022 GraphicData no + 0070,0023 GraphicType no + 0070,0024 GraphicFilled no + 0070,0040 ImageRotationRetired no + 0070,0041 ImageHorizontalFlip no + 0070,0042 ImageRotation no + 0070,0050 DisplayedAreaTopLeftTrial no + 0070,0051 DisplayedAreaBottomRightTrial no + 0070,0052 DisplayedAreaTopLeft no + 0070,0053 DisplayedAreaBottomRight no + 0070,005A DisplayedAreaSelectionSequence no + 0070,0060 GraphicLayerSequence no + 0070,0062 GraphicLayerOrder no + 0070,0066 GraphicLayerRecDisplayGraysclValue no + 0070,0067 GraphicLayerRecDisplayRGBValue no + 0070,0068 GraphicLayerDescription no + 0070,0080 ContentLabel no + 0070,0081 ContentDescription no + 0070,0082 PresentationCreationDate no + 0070,0083 PresentationCreationTime no + 0070,0084 ContentCreatorName no + 0070,0086 ContentCreatorIDCodeSequence no + 0070,0100 PresentationSizeMode no + 0070,0101 PresentationPixelSpacing no + 0070,0102 PresentationPixelAspectRatio no + 0070,0103 PresentationPixelMagRatio no + 0070,0306 ShapeType no + 0070,0308 RegistrationSequence no + 0070,0309 MatrixRegistrationSequence no + 0070,030A MatrixSequence no + 0070,030C FrameOfRefTransformationMatrixType no + 0070,030D RegistrationTypeCodeSequence no + 0070,030F FiducialDescription no + 0070,0310 FiducialIdentifier no + 0070,0311 FiducialIdentifierCodeSequence no + 0070,0312 ContourUncertaintyRadius no + 0070,0314 UsedFiducialsSequence no + 0070,0318 GraphicCoordinatesDataSequence no + 0070,031A FiducialUID no + 0070,031C FiducialSetSequence no + 0070,031E FiducialSequence no + 0070,0401 GraphicLayerRecomDisplayCIELabVal no + 0070,0402 BlendingSequence no + 0070,0403 RelativeOpacity no + 0070,0404 ReferencedSpatialRegistrationSeq no + 0070,0405 BlendingPosition no + 0072,0002 HangingProtocolName no + 0072,0004 HangingProtocolDescription no + 0072,0006 HangingProtocolLevel no + 0072,0008 HangingProtocolCreator no + 0072,000A HangingProtocolCreationDateTime no + 0072,000C HangingProtocolDefinitionSequence no + 0072,000E HangingProtocolUserIDCodeSequence no + 0072,0010 HangingProtocolUserGroupName no + 0072,0012 SourceHangingProtocolSequence no + 0072,0014 NumberOfPriorsReferenced no + 0072,0020 ImageSetsSequence no + 0072,0022 ImageSetSelectorSequence no + 0072,0024 ImageSetSelectorUsageFlag no + 0072,0026 SelectorAttribute no + 0072,0028 SelectorValueNumber no + 0072,0030 TimeBasedImageSetsSequence no + 0072,0032 ImageSetNumber no + 0072,0034 ImageSetSelectorCategory no + 0072,0038 RelativeTime no + 0072,003A RelativeTimeUnits no + 0072,003C AbstractPriorValue no + 0072,003E AbstractPriorCodeSequence no + 0072,0040 ImageSetLabel no + 0072,0050 SelectorAttributeVR no + 0072,0052 SelectorSequencePointer no + 0072,0054 SelectorSeqPointerPrivateCreator no + 0072,0056 SelectorAttributePrivateCreator no + 0072,0060 SelectorATValue no + 0072,0062 SelectorCSValue no + 0072,0064 SelectorISValue no + 0072,0066 SelectorLOValue no + 0072,0068 SelectorLTValue no + 0072,006A SelectorPNValue no + 0072,006C SelectorSHValue no + 0072,006E SelectorSTValue no + 0072,0070 SelectorUTValue no + 0072,0072 SelectorDSValue no + 0072,0074 SelectorFDValue no + 0072,0076 SelectorFLValue no + 0072,0078 SelectorULValue no + 0072,007A SelectorUSValue no + 0072,007C SelectorSLValue no + 0072,007E SelectorSSValue no + 0072,0080 SelectorCodeSequenceValue no + 0072,0100 NumberOfScreens no + 0072,0102 NominalScreenDefinitionSequence no + 0072,0104 NumberOfVerticalPixels no + 0072,0106 NumberOfHorizontalPixels no + 0072,0108 DisplayEnvironmentSpatialPosition no + 0072,010A ScreenMinimumGrayscaleBitDepth no + 0072,010C ScreenMinimumColorBitDepth no + 0072,010E ApplicationMaximumRepaintTime no + 0072,0200 DisplaySetsSequence no + 0072,0202 DisplaySetNumber no + 0072,0203 DisplaySetLabel no + 0072,0204 DisplaySetPresentationGroup no + 0072,0206 DisplaySetPresentationGroupDescr no + 0072,0208 PartialDataDisplayHandling no + 0072,0210 SynchronizedScrollingSequence no + 0072,0212 DisplaySetScrollingGroup no + 0072,0214 NavigationIndicatorSequence no + 0072,0216 NavigationDisplaySet no + 0072,0218 ReferenceDisplaySets no + 0072,0300 ImageBoxesSequence no + 0072,0302 ImageBoxNumber no + 0072,0304 ImageBoxLayoutType no + 0072,0306 ImageBoxTileHorizontalDimension no + 0072,0308 ImageBoxTileVerticalDimension no + 0072,0310 ImageBoxScrollDirection no + 0072,0312 ImageBoxSmallScrollType no + 0072,0314 ImageBoxSmallScrollAmount no + 0072,0316 ImageBoxLargeScrollType no + 0072,0318 ImageBoxLargeScrollAmount no + 0072,0320 ImageBoxOverlapPriority no + 0072,0330 CineRelativeToRealTime no + 0072,0400 FilterOperationsSequence no + 0072,0402 FilterByCategory no + 0072,0404 FilterByAttributePresence no + 0072,0406 FilterByOperator no + 0072,0432 SynchronizedImageBoxList no + 0072,0434 TypeOfSynchronization no + 0072,0500 BlendingOperationType no + 0072,0510 ReformattingOperationType no + 0072,0512 ReformattingThickness no + 0072,0514 ReformattingInterval no + 0072,0516 ReformattingOpInitialViewDir no + 0072,0520 RenderingType3D no + 0072,0600 SortingOperationsSequence no + 0072,0602 SortByCategory no + 0072,0604 SortingDirection no + 0072,0700 DisplaySetPatientOrientation no + 0072,0702 VOIType no + 0072,0704 PseudoColorType no + 0072,0706 ShowGrayscaleInverted no + 0072,0710 ShowImageTrueSizeFlag no + 0072,0712 ShowGraphicAnnotationFlag no + 0072,0714 ShowPatientDemographicsFlag no + 0072,0716 ShowAcquisitionTechniquesFlag no + 0072,0717 DisplaySetHorizontalJustification no + 0072,0718 DisplaySetVerticalJustification no + 0074,1000 UnifiedProcedureStepState no + 0074,1002 UPSProgressInformationSequence no + 0074,1004 UnifiedProcedureStepProgress no + 0074,1006 UnifiedProcedureStepProgressDescr no + 0074,1008 UnifiedProcedureStepComURISeq no + 0074,100a ContactURI no + 0074,100c ContactDisplayName no + 0074,1020 BeamTaskSequence no + 0074,1022 BeamTaskType no + 0074,1024 BeamOrderIndex no + 0074,1030 DeliveryVerificationImageSequence no + 0074,1032 VerificationImageTiming no + 0074,1034 DoubleExposureFlag no + 0074,1036 DoubleExposureOrdering no + 0074,1038 DoubleExposureMeterset no + 0074,103A DoubleExposureFieldDelta no + 0074,1040 RelatedReferenceRTImageSequence no + 0074,1042 GeneralMachineVerificationSequence no + 0074,1044 ConventionalMachineVerificationSeq no + 0074,1046 IonMachineVerificationSequence no + 0074,1048 FailedAttributesSequence no + 0074,104A OverriddenAttributesSequence no + 0074,104C ConventionalControlPointVerifySeq no + 0074,104E IonControlPointVerificationSeq no + 0074,1050 AttributeOccurrenceSequence no + 0074,1052 AttributeOccurrencePointer no + 0074,1054 AttributeItemSelector no + 0074,1056 AttributeOccurrencePrivateCreator no + 0074,1200 ScheduledProcedureStepPriority no + 0074,1202 WorklistLabel no + 0074,1204 ProcedureStepLabel no + 0074,1210 ScheduledProcessingParametersSeq no + 0074,1212 PerformedProcessingParametersSeq no + 0074,1216 UPSPerformedProcedureSequence no + 0074,1220 RelatedProcedureStepSequence no + 0074,1222 ProcedureStepRelationshipType no + 0074,1230 DeletionLock no + 0074,1234 ReceivingAE no + 0074,1236 RequestingAE no + 0074,1238 ReasonForCancellation no + 0074,1242 SCPStatus no + 0074,1244 SubscriptionListStatus no + 0074,1246 UPSListStatus no + 0088,0130 StorageMediaFileSetID no + 0088,0140 StorageMediaFileSetUID no + 0088,0200 IconImageSequence no + 0088,0904 TopicTitle no + 0088,0906 TopicSubject no + 0088,0910 TopicAuthor no + 0088,0912 TopicKeywords no + 0100,0410 SOPInstanceStatus no + 0100,0420 SOPAuthorizationDateAndTime no + 0100,0424 SOPAuthorizationComment no + 0100,0426 AuthorizationEquipmentCertNumber no + 0400,0005 MACIDNumber no + 0400,0010 MACCalculationTransferSyntaxUID no + 0400,0015 MACAlgorithm no + 0400,0020 DataElementsSigned no + 0400,0100 DigitalSignatureUID no + 0400,0105 DigitalSignatureDateTime no + 0400,0110 CertificateType no + 0400,0115 CertificateOfSigner no + 0400,0120 Signature no + 0400,0305 CertifiedTimestampType no + 0400,0310 CertifiedTimestamp no + 0400,0401 DigitalSignaturePurposeCodeSeq no + 0400,0402 ReferencedDigitalSignatureSeq no + 0400,0403 ReferencedSOPInstanceMACSeq no + 0400,0404 MAC no + 0400,0500 EncryptedAttributesSequence no + 0400,0510 EncryptedContentTransferSyntaxUID no + 0400,0520 EncryptedContent no + 0400,0550 ModifiedAttributesSequence no + 0400,0561 OriginalAttributesSequence no + 0400,0562 AttributeModificationDateTime no + 0400,0563 ModifyingSystem no + 0400,0564 SourceOfPreviousValues no + 0400,0565 ReasonForTheAttributeModification no + 1000,xxx0 EscapeTriplet no + 1000,xxx1 RunLengthTriplet no + 1000,xxx2 HuffmanTableSize no + 1000,xxx3 HuffmanTableTriplet no + 1000,xxx4 ShiftTableSize no + 1000,xxx5 ShiftTableTriplet no + 1010,xxxx ZonalMap no + 2000,0010 NumberOfCopies no + 2000,001E PrinterConfigurationSequence no + 2000,0020 PrintPriority no + 2000,0030 MediumType no + 2000,0040 FilmDestination no + 2000,0050 FilmSessionLabel no + 2000,0060 MemoryAllocation no + 2000,0061 MaximumMemoryAllocation no + 2000,0062 ColorImagePrintingFlag no + 2000,0063 CollationFlag no + 2000,0065 AnnotationFlag no + 2000,0067 ImageOverlayFlag no + 2000,0069 PresentationLUTFlag no + 2000,006A ImageBoxPresentationLUTFlag no + 2000,00A0 MemoryBitDepth no + 2000,00A1 PrintingBitDepth no + 2000,00A2 MediaInstalledSequence no + 2000,00A4 OtherMediaAvailableSequence no + 2000,00A8 SupportedImageDisplayFormatSeq no + 2000,0500 ReferencedFilmBoxSequence no + 2000,0510 ReferencedStoredPrintSequence no + 2010,0010 ImageDisplayFormat no + 2010,0030 AnnotationDisplayFormatID no + 2010,0040 FilmOrientation no + 2010,0050 FilmSizeID no + 2010,0052 PrinterResolutionID no + 2010,0054 DefaultPrinterResolutionID no + 2010,0060 MagnificationType no + 2010,0080 SmoothingType no + 2010,00A6 DefaultMagnificationType no + 2010,00A7 OtherMagnificationTypesAvailable no + 2010,00A8 DefaultSmoothingType no + 2010,00A9 OtherSmoothingTypesAvailable no + 2010,0100 BorderDensity no + 2010,0110 EmptyImageDensity no + 2010,0120 MinDensity no + 2010,0130 MaxDensity no + 2010,0140 Trim no + 2010,0150 ConfigurationInformation no + 2010,0152 ConfigurationInformationDescr no + 2010,0154 MaximumCollatedFilms no + 2010,015E Illumination no + 2010,0160 ReflectedAmbientLight no + 2010,0376 PrinterPixelSpacing no + 2010,0500 ReferencedFilmSessionSequence no + 2010,0510 ReferencedImageBoxSequence no + 2010,0520 ReferencedBasicAnnotationBoxSeq no + 2020,0010 ImageBoxPosition no + 2020,0020 Polarity no + 2020,0030 RequestedImageSize no + 2020,0040 RequestedDecimate-CropBehavior no + 2020,0050 RequestedResolutionID no + 2020,00A0 RequestedImageSizeFlag no + 2020,00A2 DecimateCropResult no + 2020,0110 BasicGrayscaleImageSequence no + 2020,0111 BasicColorImageSequence no + 2020,0130 ReferencedImageOverlayBoxSequence no + 2020,0140 ReferencedVOILUTBoxSequence no + 2030,0010 AnnotationPosition no + 2030,0020 TextString no + 2040,0010 ReferencedOverlayPlaneSequence no + 2040,0011 ReferencedOverlayPlaneGroups no + 2040,0020 OverlayPixelDataSequence no + 2040,0060 OverlayMagnificationType no + 2040,0070 OverlaySmoothingType no + 2040,0072 OverlayOrImageMagnification no + 2040,0074 MagnifyToNumberOfColumns no + 2040,0080 OverlayForegroundDensity no + 2040,0082 OverlayBackgroundDensity no + 2040,0090 OverlayMode no + 2040,0100 ThresholdDensity no + 2040,0500 ReferencedImageBoxSequence no + 2050,0010 PresentationLUTSequence no + 2050,0020 PresentationLUTShape no + 2050,0500 ReferencedPresentationLUTSequence no + 2100,0010 PrintJobID no + 2100,0020 ExecutionStatus no + 2100,0030 ExecutionStatusInfo no + 2100,0040 CreationDate no + 2100,0050 CreationTime no + 2100,0070 Originator no + 2100,0140 DestinationAE no + 2100,0160 OwnerID no + 2100,0170 NumberOfFilms no + 2100,0500 ReferencedPrintJobSequence no + 2110,0010 PrinterStatus no + 2110,0020 PrinterStatusInfo no + 2110,0030 PrinterName no + 2110,0099 PrintQueueID no + 2120,0010 QueueStatus no + 2120,0050 PrintJobDescriptionSequence no + 2120,0070 ReferencedPrintJobSequence no + 2130,0010 PrintManagementCapabilitiesSeq no + 2130,0015 PrinterCharacteristicsSequence no + 2130,0030 FilmBoxContentSequence no + 2130,0040 ImageBoxContentSequence no + 2130,0050 AnnotationContentSequence no + 2130,0060 ImageOverlayBoxContentSequence no + 2130,0080 PresentationLUTContentSequence no + 2130,00A0 ProposedStudySequence no + 2130,00C0 OriginalImageSequence no + 2200,0001 LabelFromInfoExtractedFromInstance no + 2200,0002 LabelText no + 2200,0003 LabelStyleSelection no + 2200,0004 MediaDisposition no + 2200,0005 BarcodeValue no + 2200,0006 BarcodeSymbology no + 2200,0007 AllowMediaSplitting no + 2200,0008 IncludeNonDICOMObjects no + 2200,0009 IncludeDisplayApplication no + 2200,000A SaveCompInstancesAfterMediaCreate no + 2200,000B TotalNumberMediaPiecesCreated no + 2200,000C RequestedMediaApplicationProfile no + 2200,000D ReferencedStorageMediaSequence no + 2200,000E FailureAttributes no + 2200,000F AllowLossyCompression no + 2200,0020 RequestPriority no + 3002,0002 RTImageLabel no + 3002,0003 RTImageName no + 3002,0004 RTImageDescription no + 3002,000A ReportedValuesOrigin no + 3002,000C RTImagePlane no + 3002,000D XRayImageReceptorTranslation no + 3002,000E XRayImageReceptorAngle no + 3002,0010 RTImageOrientation no + 3002,0011 ImagePlanePixelSpacing no + 3002,0012 RTImagePosition no + 3002,0020 RadiationMachineName no + 3002,0022 RadiationMachineSAD no + 3002,0024 RadiationMachineSSD no + 3002,0026 RTImageSID no + 3002,0028 SourceToReferenceObjectDistance no + 3002,0029 FractionNumber no + 3002,0030 ExposureSequence no + 3002,0032 MetersetExposure no + 3002,0034 DiaphragmPosition no + 3002,0040 FluenceMapSequence no + 3002,0041 FluenceDataSource no + 3002,0042 FluenceDataScale no + 3002,0051 FluenceMode no + 3002,0052 FluenceModeID no + 3004,0001 DVHType no + 3004,0002 DoseUnits no + 3004,0004 DoseType no + 3004,0006 DoseComment no + 3004,0008 NormalizationPoint no + 3004,000A DoseSummationType no + 3004,000C GridFrameOffsetVector no + 3004,000E DoseGridScaling no + 3004,0010 RTDoseROISequence no + 3004,0012 DoseValue no + 3004,0014 TissueHeterogeneityCorrection no + 3004,0040 DVHNormalizationPoint no + 3004,0042 DVHNormalizationDoseValue no + 3004,0050 DVHSequence no + 3004,0052 DVHDoseScaling no + 3004,0054 DVHVolumeUnits no + 3004,0056 DVHNumberOfBins no + 3004,0058 DVHData no + 3004,0060 DVHReferencedROISequence no + 3004,0062 DVHROIContributionType no + 3004,0070 DVHMinimumDose no + 3004,0072 DVHMaximumDose no + 3004,0074 DVHMeanDose no + 3006,0002 StructureSetLabel no + 3006,0004 StructureSetName no + 3006,0006 StructureSetDescription no + 3006,0008 StructureSetDate no + 3006,0009 StructureSetTime no + 3006,0010 ReferencedFrameOfReferenceSequence no + 3006,0012 RTReferencedStudySequence no + 3006,0014 RTReferencedSeriesSequence no + 3006,0016 ContourImageSequence no + 3006,0020 StructureSetROISequence no + 3006,0022 ROINumber no + 3006,0024 ReferencedFrameOfReferenceUID no + 3006,0026 ROIName no + 3006,0028 ROIDescription no + 3006,002A ROIDisplayColor no + 3006,002C ROIVolume no + 3006,0030 RTRelatedROISequence no + 3006,0033 RTROIRelationship no + 3006,0036 ROIGenerationAlgorithm no + 3006,0038 ROIGenerationDescription no + 3006,0039 ROIContourSequence no + 3006,0040 ContourSequence no + 3006,0042 ContourGeometricType no + 3006,0044 ContourSlabThickness no + 3006,0045 ContourOffsetVector no + 3006,0046 NumberOfContourPoints no + 3006,0048 ContourNumber no + 3006,0049 AttachedContours no + 3006,0050 ContourData no + 3006,0080 RTROIObservationsSequence no + 3006,0082 ObservationNumber no + 3006,0084 ReferencedROINumber no + 3006,0085 ROIObservationLabel no + 3006,0086 RTROIIdentificationCodeSequence no + 3006,0088 ROIObservationDescription no + 3006,00A0 RelatedRTROIObservationsSequence no + 3006,00A4 RTROIInterpretedType no + 3006,00A6 ROIInterpreter no + 3006,00B0 ROIPhysicalPropertiesSequence no + 3006,00B2 ROIPhysicalProperty no + 3006,00B4 ROIPhysicalPropertyValue no + 3006,00B6 ROIElementalCompositionSequence no + 3006,00B7 ROIElementalCompAtomicNumber no + 3006,00B8 ROIElementalCompAtomicMassFraction no + 3006,00C0 FrameOfReferenceRelationshipSeq no + 3006,00C2 RelatedFrameOfReferenceUID no + 3006,00C4 FrameOfReferenceTransformType no + 3006,00C6 FrameOfReferenceTransformMatrix no + 3006,00C8 FrameOfReferenceTransformComment no + 3008,0010 MeasuredDoseReferenceSequence no + 3008,0012 MeasuredDoseDescription no + 3008,0014 MeasuredDoseType no + 3008,0016 MeasuredDoseValue no + 3008,0020 TreatmentSessionBeamSequence no + 3008,0021 TreatmentSessionIonBeamSequence no + 3008,0022 CurrentFractionNumber no + 3008,0024 TreatmentControlPointDate no + 3008,0025 TreatmentControlPointTime no + 3008,002A TreatmentTerminationStatus no + 3008,002B TreatmentTerminationCode no + 3008,002C TreatmentVerificationStatus no + 3008,0030 ReferencedTreatmentRecordSequence no + 3008,0032 SpecifiedPrimaryMeterset no + 3008,0033 SpecifiedSecondaryMeterset no + 3008,0036 DeliveredPrimaryMeterset no + 3008,0037 DeliveredSecondaryMeterset no + 3008,003A SpecifiedTreatmentTime no + 3008,003B DeliveredTreatmentTime no + 3008,0040 ControlPointDeliverySequence no + 3008,0041 IonControlPointDeliverySequence no + 3008,0042 SpecifiedMeterset no + 3008,0044 DeliveredMeterset no + 3008,0045 MetersetRateSet no + 3008,0046 MetersetRateDelivered no + 3008,0047 ScanSpotMetersetsDelivered no + 3008,0048 DoseRateDelivered no + 3008,0050 TreatmentSummaryCalcDoseRefSeq no + 3008,0052 CumulativeDoseToDoseReference no + 3008,0054 FirstTreatmentDate no + 3008,0056 MostRecentTreatmentDate no + 3008,005A NumberOfFractionsDelivered no + 3008,0060 OverrideSequence no + 3008,0061 ParameterSequencePointer no + 3008,0062 OverrideParameterPointer no + 3008,0063 ParameterItemIndex no + 3008,0064 MeasuredDoseReferenceNumber no + 3008,0065 ParameterPointer no + 3008,0066 OverrideReason no + 3008,0068 CorrectedParameterSequence no + 3008,006A CorrectionValue no + 3008,0070 CalculatedDoseReferenceSequence no + 3008,0072 CalculatedDoseReferenceNumber no + 3008,0074 CalculatedDoseReferenceDescription no + 3008,0076 CalculatedDoseReferenceDoseValue no + 3008,0078 StartMeterset no + 3008,007A EndMeterset no + 3008,0080 ReferencedMeasuredDoseReferenceSeq no + 3008,0082 ReferencedMeasuredDoseReferenceNum no + 3008,0090 ReferencedCalculatedDoseRefSeq no + 3008,0092 ReferencedCalculatedDoseRefNumber no + 3008,00A0 BeamLimitingDeviceLeafPairsSeq no + 3008,00B0 RecordedWedgeSequence no + 3008,00C0 RecordedCompensatorSequence no + 3008,00D0 RecordedBlockSequence no + 3008,00E0 TreatmentSummaryMeasuredDoseRefSeq no + 3008,00F0 RecordedSnoutSequence no + 3008,00F2 RecordedRangeShifterSequence no + 3008,00F4 RecordedLateralSpreadingDeviceSeq no + 3008,00F6 RecordedRangeModulatorSequence no + 3008,0100 RecordedSourceSequence no + 3008,0105 SourceSerialNumber no + 3008,0110 TreatmentSessionAppSetupSeq no + 3008,0116 ApplicationSetupCheck no + 3008,0120 RecordedBrachyAccessoryDeviceSeq no + 3008,0122 ReferencedBrachyAccessoryDeviceNum no + 3008,0130 RecordedChannelSequence no + 3008,0132 SpecifiedChannelTotalTime no + 3008,0134 DeliveredChannelTotalTime no + 3008,0136 SpecifiedNumberOfPulses no + 3008,0138 DeliveredNumberOfPulses no + 3008,013A SpecifiedPulseRepetitionInterval no + 3008,013C DeliveredPulseRepetitionInterval no + 3008,0140 RecordedSourceApplicatorSequence no + 3008,0142 ReferencedSourceApplicatorNumber no + 3008,0150 RecordedChannelShieldSequence no + 3008,0152 ReferencedChannelShieldNumber no + 3008,0160 BrachyControlPointDeliveredSeq no + 3008,0162 SafePositionExitDate no + 3008,0164 SafePositionExitTime no + 3008,0166 SafePositionReturnDate no + 3008,0168 SafePositionReturnTime no + 3008,0200 CurrentTreatmentStatus no + 3008,0202 TreatmentStatusComment no + 3008,0220 FractionGroupSummarySequence no + 3008,0223 ReferencedFractionNumber no + 3008,0224 FractionGroupType no + 3008,0230 BeamStopperPosition no + 3008,0240 FractionStatusSummarySequence no + 3008,0250 TreatmentDate no + 3008,0251 TreatmentTime no + 300A,0002 RTPlanLabel no + 300A,0003 RTPlanName no + 300A,0004 RTPlanDescription no + 300A,0006 RTPlanDate no + 300A,0007 RTPlanTime no + 300A,0009 TreatmentProtocols no + 300A,000A PlanIntent no + 300A,000B TreatmentSites no + 300A,000C RTPlanGeometry no + 300A,000E PrescriptionDescription no + 300A,0010 DoseReferenceSequence no + 300A,0012 DoseReferenceNumber no + 300A,0013 DoseReferenceUID no + 300A,0014 DoseReferenceStructureType no + 300A,0015 NominalBeamEnergyUnit no + 300A,0016 DoseReferenceDescription no + 300A,0018 DoseReferencePointCoordinates no + 300A,001A NominalPriorDose no + 300A,0020 DoseReferenceType no + 300A,0021 ConstraintWeight no + 300A,0022 DeliveryWarningDose no + 300A,0023 DeliveryMaximumDose no + 300A,0025 TargetMinimumDose no + 300A,0026 TargetPrescriptionDose no + 300A,0027 TargetMaximumDose no + 300A,0028 TargetUnderdoseVolumeFraction no + 300A,002A OrganAtRiskFullVolumeDose no + 300A,002B OrganAtRiskLimitDose no + 300A,002C OrganAtRiskMaximumDose no + 300A,002D OrganAtRiskOverdoseVolumeFraction no + 300A,0040 ToleranceTableSequence no + 300A,0042 ToleranceTableNumber no + 300A,0043 ToleranceTableLabel no + 300A,0044 GantryAngleTolerance no + 300A,0046 BeamLimitingDeviceAngleTolerance no + 300A,0048 BeamLimitingDeviceToleranceSeq no + 300A,004A BeamLimitingDevicePositionTol no + 300A,004B SnoutPositionTolerance no + 300A,004C PatientSupportAngleTolerance no + 300A,004E TableTopEccentricAngleTolerance no + 300A,004F TableTopPitchAngleTolerance no + 300A,0050 TableTopRollAngleTolerance no + 300A,0051 TableTopVerticalPositionTolerance no + 300A,0052 TableTopLongitudinalPositionTol no + 300A,0053 TableTopLateralPositionTolerance no + 300A,0055 RTPlanRelationship no + 300A,0070 FractionGroupSequence no + 300A,0071 FractionGroupNumber no + 300A,0072 FractionGroupDescription no + 300A,0078 NumberOfFractionsPlanned no + 300A,0079 NumberFractionPatternDigitsPerDay no + 300A,007A RepeatFractionCycleLength no + 300A,007B FractionPattern no + 300A,0080 NumberOfBeams no + 300A,0082 BeamDoseSpecificationPoint no + 300A,0084 BeamDose no + 300A,0086 BeamMeterset no + 300A,0088 BeamDosePointDepth no + 300A,0089 BeamDosePointEquivalentDepth no + 300A,008A BeamDosePointSSD no + 300A,00A0 NumberOfBrachyApplicationSetups no + 300A,00A2 BrachyAppSetupDoseSpecPoint no + 300A,00A4 BrachyApplicationSetupDose no + 300A,00B0 BeamSequence no + 300A,00B2 TreatmentMachineName no + 300A,00B3 PrimaryDosimeterUnit no + 300A,00B4 SourceAxisDistance no + 300A,00B6 BeamLimitingDeviceSequence no + 300A,00B8 RTBeamLimitingDeviceType no + 300A,00BA SourceToBeamLimitingDeviceDistance no + 300A,00BB IsocenterToBeamLimitingDeviceDist no + 300A,00BC NumberOfLeafJawPairs no + 300A,00BE LeafPositionBoundaries no + 300A,00C0 BeamNumber no + 300A,00C2 BeamName no + 300A,00C3 BeamDescription no + 300A,00C4 BeamType no + 300A,00C6 RadiationType no + 300A,00C7 HighDoseTechniqueType no + 300A,00C8 ReferenceImageNumber no + 300A,00CA PlannedVerificationImageSequence no + 300A,00CC ImagingDeviceSpecificAcqParams no + 300A,00CE TreatmentDeliveryType no + 300A,00D0 NumberOfWedges no + 300A,00D1 WedgeSequence no + 300A,00D2 WedgeNumber no + 300A,00D3 WedgeType no + 300A,00D4 WedgeID no + 300A,00D5 WedgeAngle no + 300A,00D6 WedgeFactor no + 300A,00D7 TotalWedgeTrayWaterEquivThickness no + 300A,00D8 WedgeOrientation no + 300A,00D9 IsocenterToWedgeTrayDistance no + 300A,00DA SourceToWedgeTrayDistance no + 300A,00DB WedgeThinEdgePosition no + 300A,00DC BolusID no + 300A,00DD BolusDescription no + 300A,00E0 NumberOfCompensators no + 300A,00E1 MaterialID no + 300A,00E2 TotalCompensatorTrayFactor no + 300A,00E3 CompensatorSequence no + 300A,00E4 CompensatorNumber no + 300A,00E5 CompensatorID no + 300A,00E6 SourceToCompensatorTrayDistance no + 300A,00E7 CompensatorRows no + 300A,00E8 CompensatorColumns no + 300A,00E9 CompensatorPixelSpacing no + 300A,00EA CompensatorPosition no + 300A,00EB CompensatorTransmissionData no + 300A,00EC CompensatorThicknessData no + 300A,00ED NumberOfBoli no + 300A,00EE CompensatorType no + 300A,00F0 NumberOfBlocks no + 300A,00F2 TotalBlockTrayFactor no + 300A,00F3 TotalBlockTrayWaterEquivThickness no + 300A,00F4 BlockSequence no + 300A,00F5 BlockTrayID no + 300A,00F6 SourceToBlockTrayDistance no + 300A,00F7 IsocenterToBlockTrayDistance no + 300A,00F8 BlockType no + 300A,00F9 AccessoryCode no + 300A,00FA BlockDivergence no + 300A,00FB BlockMountingPosition no + 300A,00FC BlockNumber no + 300A,00FE BlockName no + 300A,0100 BlockThickness no + 300A,0102 BlockTransmission no + 300A,0104 BlockNumberOfPoints no + 300A,0106 BlockData no + 300A,0107 ApplicatorSequence no + 300A,0108 ApplicatorID no + 300A,0109 ApplicatorType no + 300A,010A ApplicatorDescription no + 300A,010C CumulativeDoseReferenceCoefficient no + 300A,010E FinalCumulativeMetersetWeight no + 300A,0110 NumberOfControlPoints no + 300A,0111 ControlPointSequence no + 300A,0112 ControlPointIndex no + 300A,0114 NominalBeamEnergy no + 300A,0115 DoseRateSet no + 300A,0116 WedgePositionSequence no + 300A,0118 WedgePosition no + 300A,011A BeamLimitingDevicePositionSequence no + 300A,011C LeafJawPositions no + 300A,011E GantryAngle no + 300A,011F GantryRotationDirection no + 300A,0120 BeamLimitingDeviceAngle no + 300A,0121 BeamLimitingDeviceRotateDirection no + 300A,0122 PatientSupportAngle no + 300A,0123 PatientSupportRotationDirection no + 300A,0124 TableTopEccentricAxisDistance no + 300A,0125 TableTopEccentricAngle no + 300A,0126 TableTopEccentricRotateDirection no + 300A,0128 TableTopVerticalPosition no + 300A,0129 TableTopLongitudinalPosition no + 300A,012A TableTopLateralPosition no + 300A,012C IsocenterPosition no + 300A,012E SurfaceEntryPoint no + 300A,0130 SourceToSurfaceDistance no + 300A,0134 CumulativeMetersetWeight no + 300A,0140 TableTopPitchAngle no + 300A,0142 TableTopPitchRotationDirection no + 300A,0144 TableTopRollAngle no + 300A,0146 TableTopRollRotationDirection no + 300A,0148 HeadFixationAngle no + 300A,014A GantryPitchAngle no + 300A,014C GantryPitchRotationDirection no + 300A,014E GantryPitchAngleTolerance no + 300A,0180 PatientSetupSequence no + 300A,0182 PatientSetupNumber no + 300A,0183 PatientSetupLabel no + 300A,0184 PatientAdditionalPosition no + 300A,0190 FixationDeviceSequence no + 300A,0192 FixationDeviceType no + 300A,0194 FixationDeviceLabel no + 300A,0196 FixationDeviceDescription no + 300A,0198 FixationDevicePosition no + 300A,0199 FixationDevicePitchAngle no + 300A,019A FixationDeviceRollAngle no + 300A,01A0 ShieldingDeviceSequence no + 300A,01A2 ShieldingDeviceType no + 300A,01A4 ShieldingDeviceLabel no + 300A,01A6 ShieldingDeviceDescription no + 300A,01A8 ShieldingDevicePosition no + 300A,01B0 SetupTechnique no + 300A,01B2 SetupTechniqueDescription no + 300A,01B4 SetupDeviceSequence no + 300A,01B6 SetupDeviceType no + 300A,01B8 SetupDeviceLabel no + 300A,01BA SetupDeviceDescription no + 300A,01BC SetupDeviceParameter no + 300A,01D0 SetupReferenceDescription no + 300A,01D2 TableTopVerticalSetupDisplacement no + 300A,01D4 TableTopLongitudinalSetupDisplace no + 300A,01D6 TableTopLateralSetupDisplacement no + 300A,0200 BrachyTreatmentTechnique no + 300A,0202 BrachyTreatmentType no + 300A,0206 TreatmentMachineSequence no + 300A,0210 SourceSequence no + 300A,0212 SourceNumber no + 300A,0214 SourceType no + 300A,0216 SourceManufacturer no + 300A,0218 ActiveSourceDiameter no + 300A,021A ActiveSourceLength no + 300A,0222 SourceEncapsulationNomThickness no + 300A,0224 SourceEncapsulationNomTransmission no + 300A,0226 SourceIsotopeName no + 300A,0228 SourceIsotopeHalfLife no + 300A,0229 SourceStrengthUnits no + 300A,022A ReferenceAirKermaRate no + 300A,022B SourceStrength no + 300A,022C SourceStrengthReferenceDate no + 300A,022E SourceStrengthReferenceTime no + 300A,0230 ApplicationSetupSequence no + 300A,0232 ApplicationSetupType no + 300A,0234 ApplicationSetupNumber no + 300A,0236 ApplicationSetupName no + 300A,0238 ApplicationSetupManufacturer no + 300A,0240 TemplateNumber no + 300A,0242 TemplateType no + 300A,0244 TemplateName no + 300A,0250 TotalReferenceAirKerma no + 300A,0260 BrachyAccessoryDeviceSequence no + 300A,0262 BrachyAccessoryDeviceNumber no + 300A,0263 BrachyAccessoryDeviceID no + 300A,0264 BrachyAccessoryDeviceType no + 300A,0266 BrachyAccessoryDeviceName no + 300A,026A BrachyAccessoryDeviceNomThickness no + 300A,026C BrachyAccessoryDevNomTransmission no + 300A,0280 ChannelSequence no + 300A,0282 ChannelNumber no + 300A,0284 ChannelLength no + 300A,0286 ChannelTotalTime no + 300A,0288 SourceMovementType no + 300A,028A NumberOfPulses no + 300A,028C PulseRepetitionInterval no + 300A,0290 SourceApplicatorNumber no + 300A,0291 SourceApplicatorID no + 300A,0292 SourceApplicatorType no + 300A,0294 SourceApplicatorName no + 300A,0296 SourceApplicatorLength no + 300A,0298 SourceApplicatorManufacturer no + 300A,029C SourceApplicatorWallNomThickness no + 300A,029E SourceApplicatorWallNomTrans no + 300A,02A0 SourceApplicatorStepSize no + 300A,02A2 TransferTubeNumber no + 300A,02A4 TransferTubeLength no + 300A,02B0 ChannelShieldSequence no + 300A,02B2 ChannelShieldNumber no + 300A,02B3 ChannelShieldID no + 300A,02B4 ChannelShieldName no + 300A,02B8 ChannelShieldNominalThickness no + 300A,02BA ChannelShieldNominalTransmission no + 300A,02C8 FinalCumulativeTimeWeight no + 300A,02D0 BrachyControlPointSequence no + 300A,02D2 ControlPointRelativePosition no + 300A,02D4 ControlPoint3DPosition no + 300A,02D6 CumulativeTimeWeight no + 300A,02E0 CompensatorDivergence no + 300A,02E1 CompensatorMountingPosition no + 300A,02E2 SourceToCompensatorDistance no + 300A,02E3 TotalCompTrayWaterEquivThickness no + 300A,02E4 IsocenterToCompensatorTrayDistance no + 300A,02E5 CompensatorColumnOffset no + 300A,02E6 IsocenterToCompensatorDistances no + 300A,02E7 CompensatorRelStoppingPowerRatio no + 300A,02E8 CompensatorMillingToolDiameter no + 300A,02EA IonRangeCompensatorSequence no + 300A,02EB CompensatorDescription no + 300A,0302 RadiationMassNumber no + 300A,0304 RadiationAtomicNumber no + 300A,0306 RadiationChargeState no + 300A,0308 ScanMode no + 300A,030A VirtualSourceAxisDistances no + 300A,030C SnoutSequence no + 300A,030D SnoutPosition no + 300A,030F SnoutID no + 300A,0312 NumberOfRangeShifters no + 300A,0314 RangeShifterSequence no + 300A,0316 RangeShifterNumber no + 300A,0318 RangeShifterID no + 300A,0320 RangeShifterType no + 300A,0322 RangeShifterDescription no + 300A,0330 NumberOfLateralSpreadingDevices no + 300A,0332 LateralSpreadingDeviceSequence no + 300A,0334 LateralSpreadingDeviceNumber no + 300A,0336 LateralSpreadingDeviceID no + 300A,0338 LateralSpreadingDeviceType no + 300A,033A LateralSpreadingDeviceDescription no + 300A,033C LateralSpreadingDevWaterEquivThick no + 300A,0340 NumberOfRangeModulators no + 300A,0342 RangeModulatorSequence no + 300A,0344 RangeModulatorNumber no + 300A,0346 RangeModulatorID no + 300A,0348 RangeModulatorType no + 300A,034A RangeModulatorDescription no + 300A,034C BeamCurrentModulationID no + 300A,0350 PatientSupportType no + 300A,0352 PatientSupportID no + 300A,0354 PatientSupportAccessoryCode no + 300A,0356 FixationLightAzimuthalAngle no + 300A,0358 FixationLightPolarAngle no + 300A,035A MetersetRate no + 300A,0360 RangeShifterSettingsSequence no + 300A,0362 RangeShifterSetting no + 300A,0364 IsocenterToRangeShifterDistance no + 300A,0366 RangeShifterWaterEquivThickness no + 300A,0370 LateralSpreadingDeviceSettingsSeq no + 300A,0372 LateralSpreadingDeviceSetting no + 300A,0374 IsocenterToLateralSpreadingDevDist no + 300A,0380 RangeModulatorSettingsSequence no + 300A,0382 RangeModulatorGatingStartValue no + 300A,0384 RangeModulatorGatingStopValue no + 300A,038A IsocenterToRangeModulatorDistance no + 300A,0390 ScanSpotTuneID no + 300A,0392 NumberOfScanSpotPositions no + 300A,0394 ScanSpotPositionMap no + 300A,0396 ScanSpotMetersetWeights no + 300A,0398 ScanningSpotSize no + 300A,039A NumberOfPaintings no + 300A,03A0 IonToleranceTableSequence no + 300A,03A2 IonBeamSequence no + 300A,03A4 IonBeamLimitingDeviceSequence no + 300A,03A6 IonBlockSequence no + 300A,03A8 IonControlPointSequence no + 300A,03AA IonWedgeSequence no + 300A,03AC IonWedgePositionSequence no + 300A,0401 ReferencedSetupImageSequence no + 300A,0402 SetupImageComment no + 300A,0410 MotionSynchronizationSequence no + 300A,0412 ControlPointOrientation no + 300A,0420 GeneralAccessorySequence no + 300A,0421 GeneralAccessoryID no + 300A,0422 GeneralAccessoryDescription no + 300A,0423 GeneralAccessoryType no + 300A,0424 GeneralAccessoryNumber no + 300C,0002 ReferencedRTPlanSequence no + 300C,0004 ReferencedBeamSequence no + 300C,0006 ReferencedBeamNumber no + 300C,0007 ReferencedReferenceImageNumber no + 300C,0008 StartCumulativeMetersetWeight no + 300C,0009 EndCumulativeMetersetWeight no + 300C,000A ReferencedBrachyAppSetupSeq no + 300C,000C ReferencedBrachyAppSetupNumber no + 300C,000E ReferencedSourceNumber no + 300C,0020 ReferencedFractionGroupSequence no + 300C,0022 ReferencedFractionGroupNumber no + 300C,0040 ReferencedVerificationImageSeq no + 300C,0042 ReferencedReferenceImageSequence no + 300C,0050 ReferencedDoseReferenceSequence no + 300C,0051 ReferencedDoseReferenceNumber no + 300C,0055 BrachyReferencedDoseReferenceSeq no + 300C,0060 ReferencedStructureSetSequence no + 300C,006A ReferencedPatientSetupNumber no + 300C,0080 ReferencedDoseSequence no + 300C,00A0 ReferencedToleranceTableNumber no + 300C,00B0 ReferencedBolusSequence no + 300C,00C0 ReferencedWedgeNumber no + 300C,00D0 ReferencedCompensatorNumber no + 300C,00E0 ReferencedBlockNumber no + 300C,00F0 ReferencedControlPointIndex no + 300C,00F2 ReferencedControlPointSequence no + 300C,00F4 ReferencedStartControlPointIndex no + 300C,00F6 ReferencedStopControlPointIndex no + 300C,0100 ReferencedRangeShifterNumber no + 300C,0102 ReferencedLateralSpreadingDevNum no + 300C,0104 ReferencedRangeModulatorNumber no + 300E,0002 ApprovalStatus no + 300E,0004 ReviewDate no + 300E,0005 ReviewTime no + 300E,0008 ReviewerName no + 4000,0000 TextGroupLength no + 4000,0010 Arbitrary no + 4000,4000 TextComments no + 4008,0040 ResultsID no + 4008,0042 ResultsIDIssuer no + 4008,0050 ReferencedInterpretationSequence no + 4008,0100 InterpretationRecordedDate no + 4008,0101 InterpretationRecordedTime no + 4008,0102 InterpretationRecorder no + 4008,0103 ReferenceToRecordedSound no + 4008,0108 InterpretationTranscriptionDate no + 4008,0109 InterpretationTranscriptionTime no + 4008,010A InterpretationTranscriber no + 4008,010B InterpretationText no + 4008,010C InterpretationAuthor no + 4008,0111 InterpretationApproverSequence no + 4008,0112 InterpretationApprovalDate no + 4008,0113 InterpretationApprovalTime no + 4008,0114 PhysicianApprovingInterpretation no + 4008,0115 InterpretationDiagnosisDescription no + 4008,0117 InterpretationDiagnosisCodeSeq no + 4008,0118 ResultsDistributionListSequence no + 4008,0119 DistributionName no + 4008,011A DistributionAddress no + 4008,0200 InterpretationID no + 4008,0202 InterpretationIDIssuer no + 4008,0210 InterpretationTypeID no + 4008,0212 InterpretationStatusID no + 4008,0300 Impressions no + 4008,4000 ResultsComments no + 4FFE,0001 MACParametersSequence no + 50xx,0005 CurveDimensions no + 50xx,0010 NumberOfPoints no + 50xx,0020 TypeOfData no + 50xx,0022 CurveDescription no + 50xx,0030 AxisUnits no + 50xx,0040 AxisLabels no + 50xx,0103 DataValueRepresentation no + 50xx,0104 MinimumCoordinateValue no + 50xx,0105 MaximumCoordinateValue no + 50xx,0106 CurveRange no + 50xx,0110 CurveDataDescriptor no + 50xx,0112 CoordinateStartValue no + 50xx,0114 CoordinateStepValue no + 50xx,1001 CurveActivationLayer no + 50xx,2000 AudioType no + 50xx,2002 AudioSampleFormat no + 50xx,2004 NumberOfChannels no + 50xx,2006 NumberOfSamples no + 50xx,2008 SampleRate no + 50xx,200A TotalTime no + 50xx,200C AudioSampleData no + 50xx,200E AudioComments no + 50xx,2500 CurveLabel no + 50xx,2600 ReferencedOverlaySequence no + 50xx,2610 ReferencedOverlayGroup no + 50xx,3000 CurveData no + 5200,9229 SharedFunctionalGroupsSequence no + 5200,9230 PerFrameFunctionalGroupsSequence no + 5400,0100 WaveformSequence no + 5400,0110 ChannelMinimumValue no + 5400,0112 ChannelMaximumValue no + 5400,1004 WaveformBitsAllocated no + 5400,1006 WaveformSampleInterpretation no + 5400,100A WaveformPaddingValue no + 5400,1010 WaveformData no + 5600,0010 FirstOrderPhaseCorrectionAngle no + 5600,0020 SpectroscopyData no + 6000,0000 OverlayGroupLength no + 60xx,0010 OverlayRows no + 60xx,0011 OverlayColumns no + 60xx,0012 OverlayPlanes no + 60xx,0015 NumberOfFramesInOverlay no + 60xx,0022 OverlayDescription no + 60xx,0040 OverlayType no + 60xx,0045 OverlaySubtype no + 60xx,0050 OverlayOrigin no + 60xx,0051 ImageFrameOrigin no + 60xx,0052 OverlayPlaneOrigin no + 60xx,0060 OverlayCompressionCode no + 60xx,0061 OverlayCompressionOriginator no + 60xx,0062 OverlayCompressionLabel no + 60xx,0063 OverlayCompressionDescription no + 60xx,0066 OverlayCompressionStepPointers no + 60xx,0068 OverlayRepeatInterval no + 60xx,0069 OverlayBitsGrouped no + 60xx,0100 OverlayBitsAllocated no + 60xx,0102 OverlayBitPosition no + 60xx,0110 OverlayFormat no + 60xx,0200 OverlayLocation no + 60xx,0800 OverlayCodeLabel no + 60xx,0802 OverlayNumberOfTables no + 60xx,0803 OverlayCodeTableLocation no + 60xx,0804 OverlayBitsForCodeWord no + 60xx,1001 OverlayActivationLayer no + 60xx,1100 OverlayDescriptorGray no + 60xx,1101 OverlayDescriptorRed no + 60xx,1102 OverlayDescriptorGreen no + 60xx,1103 OverlayDescriptorBlue no + 60xx,1200 OverlaysGray no + 60xx,1201 OverlaysRed no + 60xx,1202 OverlaysGreen no + 60xx,1203 OverlaysBlue no + 60xx,1301 ROIArea no + 60xx,1302 ROIMean no + 60xx,1303 ROIStandardDeviation no + 60xx,1500 OverlayLabel no + 60xx,3000 OverlayData no + 60xx,4000 OverlayComments no + 7Fxx,0000 PixelDataGroupLength no + 7Fxx,0010 PixelData no + 7Fxx,0011 VariableNextDataGroup no + 7Fxx,0020 VariableCoefficientsSDVN no + 7Fxx,0030 VariableCoefficientsSDHN no + 7Fxx,0040 VariableCoefficientsSDDN no + FFFA,FFFA DigitalSignaturesSequence no + FFFC,FFFC DataSetTrailingPadding no + FFFE,E000 StartOfItem no + FFFE,E00D EndOfItems no + FFFE,E0DD EndOfSequence no + +=head2 FITS Tags + +This table lists some standard Flexible Image Transport System (FITS) tags, +but ExifTool will extract any other tags found. See +L<https://fits.gsfc.nasa.gov/fits_standard.html> for the specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'AUTHOR' Author no + 'BACKGRND' Background no + 'COMMENT' Comment no + 'DATE' CreateDate no + 'DATE-END' ObservationDateEnd no + 'DATE-OBS' ObservationDate no + 'HISTORY' History no + 'INSTRUME' Instrument no + 'OBJECT' Object no + 'OBSERVER' Observer no + 'REFERENC' Reference no + 'TELESCOP' Telescope no + 'TIME-END' ObservationTimeEnd no + 'TIME-OBS' ObservationTime no + +=head2 HTML Tags + +Meta information extracted from the header of HTML and XHTML files. This is +a mix of information found in the C<META> elements, C<XML> element, and the +C<TITLE> element. + + Tag ID Tag Name Writable + ------ -------- -------- + 'abstract' Abstract no + 'author' Author no + 'classification' Classification no + 'content-language' ContentLanguage no + 'copyright' Copyright no + 'dc' DC HTML dc + 'description' Description no + 'distribution' Distribution no + 'doc-class' DocClass no + 'doc-rights' DocRights no + 'doc-type' DocType no + 'formatter' Formatter no + 'generator' Generator no + 'generatorversion' GeneratorVersion no + 'googlebot' GoogleBot no + 'http-equiv' HTTP-equiv HTML equiv + 'keywords' Keywords no+ + 'mssmarttagspreventparsing' NoMSSmartTags no + 'ncc' NCC HTML ncc + 'o' Office HTML Office + 'originator' Originator no + 'owner' Owner no + 'prod' Prod HTML prod + 'progid' ProgID no + 'rating' Rating no + 'refresh' Refresh no + 'resource-type' ResourceType no + 'revisit-after' RevisitAfter no + 'robots' Robots no+ + 'title' Title no + 'vw96' VW96 HTML vw96 + +=head3 HTML dc Tags + +Dublin Core schema tags (also used in XMP). + + Tag ID Tag Name Writable + ------ -------- -------- + 'contributor' Contributor no+ + 'coverage' Coverage no + 'creator' Creator no+ + 'date' Date no+ + 'description' Description no + 'format' Format no + 'identifier' Identifier no + 'language' Language no+ + 'publisher' Publisher no+ + 'relation' Relation no+ + 'rights' Rights no + 'source' Source no + 'subject' Subject no+ + 'title' Title no + 'type' Type no+ + +=head3 HTML equiv Tags + +These tags have a family 1 group name of "HTTP-equiv". + + Tag ID Tag Name Writable + ------ -------- -------- + 'cache-control' CacheControl no + 'content-disposition' ContentDisposition no + 'content-language' ContentLanguage no + 'content-script-type' ContentScriptType no + 'content-style-type' ContentStyleType no + 'content-type' ContentType no + 'default-style' DefaultStyle no + 'expires' Expires no + 'ext-cache' ExtCache no + 'imagetoolbar' ImageToolbar no + 'lotus' Lotus no + 'page-enter' PageEnter no + 'page-exit' PageExit no + 'pics-label' PicsLabel no + 'pragma' Pragma no + 'refresh' Refresh no + 'reply-to' ReplyTo no + 'set-cookie' SetCookie no + 'site-enter' SiteEnter no + 'site-exit' SiteExit no + 'vary' Vary no + 'window-target' WindowTarget no + +=head3 HTML ncc Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'charset' CharacterSet no + 'depth' Depth no + 'files' Files no + 'footnotes' Footnotes no + 'generator' Generator no + 'kbytesize' KByteSize no + 'maxpagenormal' MaxPageNormal no + 'multimediatype' MultimediaType no + 'narrator' Narrator no + 'pagefront' PageFront no + 'pagenormal' PageNormal no + 'pagespecial' PageSpecial no + 'prodnotes' ProdNotes no + 'produceddate' ProducedDate no + 'producer' Producer no + 'revision' Revision no + 'revisiondate' RevisionDate no + 'setinfo' SetInfo no + 'sidebars' Sidebars no + 'sourcedate' SourceDate no + 'sourceedition' SourceEdition no + 'sourcepublisher' SourcePublisher no + 'sourcerights' SourceRights no + 'sourcetitle' SourceTitle no + 'tocitems' TOCItems no + 'totaltime' Duration no + +=head3 HTML Office Tags + +Tags written by Microsoft Office applications. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Author' Author no + 'Category' Category no + 'Characters' Characters no + 'CharactersWithSpaces' CharactersWithSpaces no + 'Company' Company no + 'Created' CreateDate no + 'Description' Description no + 'Keywords' Keywords no + 'LastAuthor' LastAuthor no + 'LastPrinted' LastPrinted no + 'LastSaved' ModifyDate no + 'Lines' Lines no + 'Manager' Manager no + 'Pages' Pages no + 'Paragraphs' Paragraphs no + 'Revision' RevisionNumber no + 'Subject' Subject no + 'Template' Template no + 'TotalTime' TotalEditTime no + 'Version' RevisionNumber no + 'Words' Words no + +=head3 HTML prod Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'recengineer' RecEngineer no + 'reclocation' RecLocation no + +=head3 HTML vw96 Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'objecttype' ObjectType no + +=head2 Palm Tags + +Information extracted from Palm database files (PDB and PRC extensions), +Mobipocket electronic books (MOBI), and Amazon Kindle KF7 and KF8 books (AZW +and AZW3). + + Index4 Tag Name Writable + ------ -------- -------- + 0 DatabaseName no + 9 CreateDate no + 10 ModifyDate no + 11 LastBackupDate no + 12 ModificationNumber no + 15 PalmFileType no + +=head3 Palm MOBI Tags + +Information extracted from the MOBI header of Mobipocket and Amazon Kindle +KF7 and KF8 files. + + Index4 Tag Name Writable + ------ -------- -------- + 0 Compression no + 1 UncompressedTextLength no + 3 Encryption no + 6 MobiType no + 7 CodePage no + 9 MobiVersion no + 21 BookName no + 26 MinimumVersion no + +=head3 Palm EXTH Tags + +Information extracted from the MOBI extended header. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0001 DRMServerID no + 0x0002 DRMCommerceID no + 0x0003 DRM_E-BookBaseID no + 0x0064 Author no + 0x0065 Publisher no + 0x0066 Imprint no + 0x0067 Description no + 0x0068 ISBN no + 0x0069 Subject no+ + 0x006a PublishDate no + 0x006b Review no + 0x006c Contributor no + 0x006d Rights no + 0x006e SubjectCode no + 0x006f BookType no + 0x0070 Source no + 0x0071 ASIN no + 0x0072 BookVersion no + 0x0073 SampleFlag no + 0x0074 StartReading no + 0x0075 Adult no + 0x0076 RetailPrice no + 0x0077 RetailPriceCurrency no + 0x007d ResourceCount no + 0x0081 KF8CoverURI no + 0x00c8 DictionaryShortName no + 0x00cc CreatorSoftware no + 0x00cd CreatorMajorVersion no + 0x00ce CreatorMinorVersion no + 0x00cf CreatorBuildNumber no + 0x00d0 Watermark no + 0x00d1 Tamper-proofKeys no + 0x0191 ClippingLimit no + 0x0192 PublisherLimit no + 0x0194 TextToSpeech no + 0x0195 RentalFlag no + 0x0196 RentalExpirationDate no + 0x01f5 CDEType no + 0x01f6 LastUpdateTime no + 0x01f7 UpdatedTitle no + 0x01f8 ASIN2 no + 0x020c Language no + 0x020d Alignment no + 0x0217 CreatorBuildNumber2 no + +=head2 Torrent Tags + +Below are tags commonly found in BitTorrent files. As well as these tags, +any other existing tags will be extracted. For convenience, list items are +expanded into individual tags with an index in the tag name, but only the +tags with index "1" are listed in the tables below. See +L<https://wiki.theory.org/BitTorrentSpecification> for the BitTorrent +specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'announce' Announce no + 'announce-list' AnnounceList1 no + 'comment' Comment no + 'created by' Creator no + 'creation date' CreateDate no + 'encoding' Encoding no + 'info' Info Torrent Info + 'url-list' URLList1 no + +=head3 Torrent Info Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'file-duration' File1Duration no + 'file-media' File1Media no + 'files' Files Torrent Files + 'length' Length no + 'md5sum' MD5Sum no + 'name' Name no + 'name.utf-8' NameUTF-8 no + 'piece length' PieceLength no + 'pieces' Pieces no + 'private' Private no + 'profiles' Profiles Torrent Profiles + +=head3 Torrent Files Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'length' File1Length no + 'md5sum' File1MD5Sum no + 'path' File1Path no + 'path.utf-8' File1PathUTF-8 no + +=head3 Torrent Profiles Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 'acodec' Profile1AudioCodec no + 'height' Profile1Height no + 'vcodec' Profile1VideoCodec no + 'width' Profile1Width no + +=head2 EXE Tags + +This module extracts information from various types of Windows, MacOS and +Unix executable and library files. The first table below lists information +extracted from the header of Windows PE (Portable Executable) EXE files and +DLL libraries. + + Index2 Tag Name Writable + ------ -------- -------- + 0 MachineType no + 2 TimeStamp no + 9 ImageFileCharacteristics no + 10 PEType no + 11 LinkerVersion no + 12 CodeSize no + 14 InitializedDataSize no + 16 UninitializedDataSize no + 18 EntryPoint no + 30 OSVersion no + 32 ImageVersion no + 34 SubsystemVersion no + 44 Subsystem no + +=head3 EXE PEVersion Tags + +Information extracted from the VS_VERSION_INFO structure of Windows PE +files. + + Index4 Tag Name Writable + ------ -------- -------- + 2 FileVersionNumber no + 4 ProductVersionNumber no + 6 FileFlagsMask no + 7 FileFlags no + 8 FileOS no + 9 ObjectFileType no + 10 FileSubtype no + +=head3 EXE PEString Tags + +Resource strings found in Windows PE files. The B<TagID>'s are not shown +because they are the same as the B<Tag Name>. ExifTool will extract any +existing StringFileInfo tags even if not listed in this table. + + Tag Name Writable + -------- -------- + BuildDate no + BuildVersion no + CharacterSet no + Comments no + CompanyName no + Copyright no + FileDescription no + FileVersion no + InternalName no + LanguageCode no + LegalCopyright no + LegalTrademarks no + OriginalFileName no + PrivateBuild no + ProductName no + ProductVersion no + SpecialBuild no + +=head3 EXE MachO Tags + +Information extracted from Mach-O (Mac OS X) executable files and DYLIB +libraries. + + Index Tag Name Writable + ----- -------- -------- + 0 CPUArchitecture no + 1 CPUByteOrder no + 2 CPUCount no + 3 CPUType no+ + 4 CPUSubtype no+ + 5 ObjectFileType no + 6 ObjectFlags no + +=head3 EXE PEF Tags + +Information extracted from PEF (Classic MacOS) executable files and +libraries. + + Index4 Tag Name Writable + ------ -------- -------- + 2 CPUArchitecture no + 3 PEFVersion no + 4 TimeStamp no + +=head3 EXE ELF Tags + +Information extracted from ELF (Unix) executable files and SO libraries. + + Index1 Tag Name Writable + ------ -------- -------- + 4 CPUArchitecture no + 5 CPUByteOrder no + 16 ObjectFileType no + 18 CPUType no + +=head3 EXE AR Tags + +Information extracted from static libraries. + + Index1 Tag Name Writable + ------ -------- -------- + 16 CreateDate no + +=head3 EXE CHM Tags + +Tags extracted from Microsoft Compiled HTML files. + + Index4 Tag Name Writable + ------ -------- -------- + 1 CHMVersion no + 5 LanguageCode no + +=head2 LNK Tags + +Information extracted from MS Shell Link (Windows shortcut) files. + + Index1 Tag Name Writable + ------ -------- -------- + 0x0014 Flags no + 0x0018 FileAttributes no + 0x001c CreateDate no + 0x0024 AccessDate no + 0x002c ModifyDate no + 0x0034 TargetFileSize no + 0x0038 IconIndex no + 0x003c RunWindow no + 0x0040 HotKey no + 0x10000 ItemID LNK ItemID + 0x20000 LinkInfo LNK LinkInfo + 0x30004 Description no + 0x30008 RelativePath no + 0x30010 WorkingDirectory no + 0x30020 CommandLineArguments no + 0x30040 IconFileName no + 0xa0000000 UnknownData LNK UnknownData + 0xa0000001 EnvVarData LNK UnknownData + 0xa0000002 ConsoleData LNK ConsoleData + 0xa0000003 TrackerData LNK TrackerData + 0xa0000004 ConsoleFEData LNK ConsoleFEData + 0xa0000005 SpecialFolderData LNK UnknownData + 0xa0000006 DarwinData LNK UnknownData + 0xa0000007 IconEnvData LNK UnknownData + 0xa0000008 ShimData LNK UnknownData + 0xa0000009 PropertyStoreData LNK UnknownData + 0xa000000b KnownFolderData LNK UnknownData + 0xa000000c VistaIDListData LNK UnknownData + +=head3 LNK ItemID Tags + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0032 Item0032 LNK Item0032 + +=head3 LNK Item0032 Tags + + Index1 Tag Name Writable + ------ -------- -------- + 14 TargetFileDOSName no + +=head3 LNK LinkInfo Tags + + Tag Name Writable + -------- -------- + CommonNetworkRelLink no + CommonPathSuffix no + DeviceName no + DriveSerialNumber no + DriveType no + LocalBasePath no + NetName no + NetProviderType no + VolumeID no + VolumeLabel no + +=head3 LNK UnknownData Tags + + Index1 Tag Name Writable + ------ -------- -------- + [no tags known] + +=head3 LNK ConsoleData Tags + + Index1 Tag Name Writable + ------ -------- -------- + 8 FillAttributes no + 10 PopupFillAttributes no + 12 ScreenBufferSize no + 16 WindowSize no + 20 WindowOrigin no + 32 FontSize no + 36 FontFamily no + 40 FontWeight no + 44 FontName no + 108 CursorSize no + 112 FullScreen no + 116 QuickEdit no + 120 InsertMode no + 124 WindowOriginAuto no + 128 HistoryBufferSize no + 132 NumHistoryBuffers no + 136 RemoveHistoryDuplicates no + +=head3 LNK TrackerData Tags + + Index1 Tag Name Writable + ------ -------- -------- + 16 MachineID no + +=head3 LNK ConsoleFEData Tags + + Index1 Tag Name Writable + ------ -------- -------- + 8 CodePage no + +=head2 Font Tags + +This table contains a collection of tags found in font files of various +formats. ExifTool current recognizes OTF, TTF, TTC, DFONT, PFA, PFB, PFM, +AFM, ACFM and AMFM font files. + + Tag ID Tag Name Writable + ------ -------- -------- + 'AFM' AFM Font AFM + 'PFM' PFMHeader Font PFM + 'PSInfo' PSFontInfo Font PSInfo + 'fontname' FontName no + 'name' Name Font Name + 'numfonts' NumFonts no + 'postfont' PostScriptFontName no + +=head3 Font AFM Tags + +Tags extracted from Adobe Font Metrics files (AFM, ACFM and AMFM). + + Tag ID Tag Name Writable + ------ -------- -------- + 'Ascender' Ascender no + 'CapHeight' CapHeight no + 'CharacterSet' CharacterSet no + 'Characters' Characters no + 'Creation Date' CreateDate no + 'Descender' Descender no + 'EncodingScheme' EncodingScheme no + 'EscChar' EscChar no + 'FamilyName' FontFamily no + 'FontName' FontName no + 'FullName' FullName no + 'IsBaseFont' IsBaseFont no + 'IsFixedV' IsFixedV no + 'MappingScheme' MappingScheme no + 'Notice' Notice no + 'Version' Version no + 'Weight' Weight no + 'XHeight' XHeight no + +=head3 Font PFM Tags + +Tags extracted from the PFM file header. + + Index1 Tag Name Writable + ------ -------- -------- + 0 PFMVersion no + 6 Copyright no + 66 FontType no + 68 PointSize no + 70 YResolution no + 72 XResolution no + 74 Ascent no + 76 InternalLeading no + 78 ExternalLeading no + 80 Italic no + 81 Underline no + 82 Strikeout no + 83 Weight no + 85 CharacterSet no + 86 PixWidth no + 88 PixHeight no + 90 PitchAndFamily no + 91 AvgWidth no + 93 MaxWidth no + 95 FirstChar no + 96 LastChar no + 97 DefaultChar no + 98 BreakChar no + 99 WidthBytes no + +=head3 Font PSInfo Tags + +Tags extracted from PostScript font files (PFA and PFB). + + Tag ID Tag Name Writable + ------ -------- -------- + 'Copyright' Copyright no + 'FSType' FSType no + 'FamilyName' FontFamily no + 'FontName' FontName no + 'FontType' FontType no + 'FullName' FullName no + 'ItalicAngle' ItalicAngle no + 'Notice' Notice no + 'UnderlinePosition' UnderlinePosition no + 'UnderlineThickness' UnderlineThickness no + 'Weight' Weight no + 'isFixedPitch' IsFixedPitch no + 'version' Version no + +=head3 Font Name Tags + +The following tags are extracted from the TrueType font "name" table found +in OTF, TTF, TTC and DFONT files. These tags support localized languages by +adding a hyphen followed by a language code to the end of the tag name (eg. +"Copyright-fr" or "License-en-US"). Tags with no language code use the +default language of "en". + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 Copyright no + 0x0001 FontFamily no + 0x0002 FontSubfamily no + 0x0003 FontSubfamilyID no + 0x0004 FontName no + 0x0005 NameTableVersion no + 0x0006 PostScriptFontName no + 0x0007 Trademark no + 0x0008 Manufacturer no + 0x0009 Designer no + 0x000a Description no + 0x000b VendorURL no + 0x000c DesignerURL no + 0x000d License no + 0x000e LicenseInfoURL no + 0x0010 PreferredFamily no + 0x0011 PreferredSubfamily no + 0x0012 CompatibleFontName no + 0x0013 SampleText no + 0x0014 PostScriptFontName no + 0x0015 WWSFamilyName no + 0x0016 WWSSubfamilyName no + +=head2 VCard Tags + +This table lists common vCard tags, but ExifTool will also extract any other +vCard tags found. Tag names may have "Pref" added to indicate the preferred +instance of a vCard property, and other "TYPE" parameters may also added to +the tag name. VCF files may contain multiple vCard entries which are +distinguished by the ExifTool family 3 group name (document number). See +L<http://tools.ietf.org/html/rfc6350> for the vCard 4.0 specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Adr' Address no + 'Anniversary' Anniversary no + 'Bday' Birthday no + 'Email' Email no + 'Fn' FormattedName no + 'Gender' Gender no + 'Geo' Geolocation no + 'Impp' IMPP no + 'Lang' Language no + 'Logo' Logo no + 'N' Name no + 'Nickname' Nickname no + 'Note' Note no + 'Org' Organization no + 'Photo' Photo no + 'Prodid' Software no + 'Rev' Revision no + 'Sound' Sound no + 'Tel' Telephone no + 'Title' JobTitle no + 'Tz' TimeZone no + 'Uid' UID no + 'Url' URL no + 'Version' VCardVersion no + 'X-abdate' ABDate no + 'X-ablabel' ABLabel no + 'X-abrelatednames' ABRelatedNames no + 'X-abuid' AB_UID no + 'X-aim' AIM no + 'X-icq' ICQ no + 'X-socialprofile' SocialProfile no + +=head3 VCard VCalendar Tags + +The VCard module is also used to process iCalendar ICS files since they use +a format similar to vCard. The following table lists standard iCalendar +tags, but any existing tags will be extracted. Top-level iCalendar +components (eg. Event, Todo, Timezone, etc.) are used for the family 1 group +names, and embedded components (eg. Alarm) are added as a prefix to the tag +name. See L<http://tools.ietf.org/html/rfc5545> for the official iCalendar +2.0 specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'Acknowledged' Acknowledged no + 'Action' Action no + 'Attach' Attachment no + 'Attendee' Attendee no + 'Calscale' CalendarScale no + 'Categories' Categories no + 'Class' Classification no + 'Comment' Comment no + 'Completed' DateTimeCompleted no + 'Contact' Contact no + 'Created' DateCreated no + 'Description' Description no + 'Dtend' DateTimeEnd no + 'Dtstamp' DateTimeStamp no + 'Dtstart' DateTimeStart no + 'Due' DateTimeDue no + 'Duration' Duration no + 'Exdate' ExceptionDateTimes no + 'Freebusy' FreeBusyTime no + 'Geo' Geolocation no + 'Last-modified' ModifyDate no + 'Location' Location no + 'Method' Method no + 'Organizer' Organizer no + 'Percent-complete' PercentComplete no + 'Priority' Priority no + 'Prodid' Software no + 'Rdate' RecurrenceDateTimes no + 'Recurrence-id' RecurrenceID no + 'Related-to' RelatedTo no + 'Repeat' Repeat no + 'Request-status' RequestStatus no + 'Resources' Resources no + 'Rrule' RecurrenceRule no + 'Sequence' SequenceNumber no + 'Status' Status no + 'Summary' Summary no + 'Transp' TimeTransparency no + 'Trigger' Trigger no + 'Tzid' TimezoneID no + 'Tzname' TimezoneName no + 'Tzoffsetfrom' TimezoneOffsetFrom no + 'Tzoffsetto' TimezoneOffsetTo no + 'Tzurl' TimeZoneURL no + 'Uid' UID no + 'Url' URL no + 'Version' VCalendarVersion no + 'X-apple-calendar-color' CalendarColor no + 'X-apple-default-alarm' DefaultAlarm no + 'X-apple-local-default-alarm' + LocalDefaultAlarm no + 'X-microsoft-cdo-alldayevent' AllDayEvent no + 'X-microsoft-cdo-appt-sequence' + AppointmentSequence no + 'X-microsoft-cdo-busystatus' BusyStatus no + 'X-microsoft-cdo-importance' Importance no + 'X-microsoft-cdo-insttype' InstanceType no + 'X-microsoft-cdo-intendedstatus' + IntendedBusyStatus no + 'X-microsoft-cdo-ownerapptid' + OwnerAppointmentID no + 'X-microsoft-disallow-counter' + DisallowCounterProposal no + 'X-microsoft-donotforwardmeeting' + DoNotForwardMeeting no + 'X-microsoft-locations' MeetingLocations no + 'X-wr-alarmuid' AlarmUID no + 'X-wr-caldesc' CalendarDescription no + 'X-wr-calname' CalendarName no + 'X-wr-relcalid' CalendarID no + 'X-wr-timezone' TimeZone2 no + +=head2 Text Tags + +Although basic text files contain no metadata, the following tags are +determined from a simple analysis of the data in TXT and CSV files. +Statistics are generated only for 8-bit encodings, but the FastScan (-fast) +option may be used to limit processing to the first 64 kB in which case some +tags are not produced. To avoid long processing delays, ExifTool will issue +a minor warning and process only the first 64 kB of any file larger than 20 +MB unless the IgnoreMinorErrors (-m) +option is used. + + Tag Name Writable + -------- -------- + ByteOrderMark no + ColumnCount no + Delimiter no + LineCount no + MIMEEncoding no + Newlines no + Quoting no + RowCount no + WordCount no + +=head2 RSRC Tags + +Tags extracted from Mac OS resource files, DFONT files and "._" sidecar +files. These tags may also be extracted from the resource fork of any file +in OS X, either by adding "/..namedfork/rsrc" to the filename to process the +resource fork alone, or by using the ExtractEmbedded (-ee) option to process +the resource fork as a sub-document of the main file. When writing, +ExifTool preserves the Mac OS resource fork by default, but it may deleted +with C<-rsrc:all=> on the command line. + + Tag ID Tag Name Writable + ------ -------- -------- + '8BIM' PhotoshopInfo Photoshop + 'POST_0x01f5' PostscriptFont PostScript + 'STR _0xbff3' ApplicationMissingMsg no + 'STR _0xbff4' CreatorApplication no + 'STR#_0x0080' Keywords no + 'TEXT_0x0080' Description no + 'sfnt' Font Font Name + 'usro_0x0000' OpenWithApplication no + 'vers_0x0001' ApplicationVersion no + +=head2 Rawzor Tags + +Rawzor files store compressed images of other formats. As well as the +information listed below, exiftool uncompresses and extracts the meta +information from the original image. + + Tag Name Writable + -------- -------- + CompressionFactor no + OriginalFileSize no + OriginalFileType no + RawzorCreatorVersion no + RawzorRequiredVersion no + +=head2 ZIP Tags + +The following tags are extracted from ZIP archives. ExifTool also extracts +additional meta information from compressed documents inside some ZIP-based +files such Office Open XML (DOCX, PPTX and XLSX), Open Document (ODB, ODC, +ODF, ODG, ODI, ODP, ODS and ODT), iWork (KEY, PAGES, NUMBERS), Capture One +Enhanced Image Package (EIP), Adobe InDesign Markup Language (IDML), +Electronic Publication (EPUB), and Sketch design files (SKETCH). The +ExifTool family 3 groups may be used to organize ZIP tags by embedded +document number (ie. the exiftool C<-g3> option). + + Index2 Tag Name Writable + ------ -------- -------- + 2 ZipRequiredVersion no + 3 ZipBitFlag no + 4 ZipCompression no + 5 ZipModifyDate no + 7 ZipCRC no + 9 ZipCompressedSize no + 11 ZipUncompressedSize no + 15 ZipFileName no + '_com' ZipFileComment no + +=head3 ZIP GZIP Tags + +These tags are extracted from GZIP (GNU ZIP) archives, but currently only +for the first file in the archive. + + Index1 Tag Name Writable + ------ -------- -------- + 2 Compression no + 3 Flags no + 4 ModifyDate no + 8 ExtraFlags no + 9 OperatingSystem no + 10 ArchivedFileName no + 11 Comment no + +=head3 ZIP RAR Tags + +These tags are extracted from RAR archive files. + + Index1 Tag Name Writable + ------ -------- -------- + 0 CompressedSize no + 4 UncompressedSize no + 8 OperatingSystem no + 13 ModifyDate no + 18 PackingMethod no + 25 ArchivedFileName no + +=head2 RTF Tags + +This table lists standard tags of the RTF information group, but ExifTool +will also extract any non-standard tags found in this group. As well, +ExifTool will extract any custom properties that are found. See +L<http://www.microsoft.com/en-ca/download/details.aspx?id=10725> for the +specification. + + Tag ID Tag Name Writable + ------ -------- -------- + 'author' Author no + 'buptim' BackupTime no + 'category' Category no + 'comment' Comment no + 'company' Company no + 'copyright' Copyright no + 'creatim' CreateDate no + 'doccomm' Comments no + 'edmins' TotalEditTime no + 'hlinkbase' HyperlinkBase no + 'id' InternalIDNumber no + 'keywords' Keywords no + 'manager' Manager no + 'nofchars' Characters no + 'nofcharsws' CharactersWithSpaces no + 'nofpages' Pages no + 'nofwords' Words no + 'operator' LastModifiedBy no + 'printim' LastPrinted no + 'revtim' ModifyDate no + 'subject' Subject no + 'title' Title no + 'vern' InternalVersionNumber no + 'version' RevisionNumber no + +=head2 OOXML Tags + +The Office Open XML (OOXML) format was introduced with Microsoft Office 2007 +and is used by file types such as DOCX, PPTX and XLSX. These are +essentially ZIP archives containing XML files. The table below lists some +tags which have been observed in OOXML documents, but ExifTool will extract +any tags found from XML files of the OOXML document properties ("docProps") +directory. + +B<Tips:> + +1) Structural ZIP tags may be ignored (if desired) with C<--ZIP:all> on the +command line. + +2) Tags may be grouped by their document number in the ZIP archive with the +C<-g3> or C<-G3> option. + + Tag Name Writable + -------- -------- + AppVersion no + Application no + Category no + Characters no + CharactersWithSpaces no + CheckedBy no + Client no + Company no + CreateDate no + DateCompleted no + Department no + Destination no + Disposition no + Division no + DocSecurity no + DocumentNumber no + Editor no + ForwardTo no + Group no + HeadingPairs no + HiddenSlides no + HyperlinkBase no + HyperlinksChanged no + Keywords no + Language no + LastModifiedBy no + LastPrinted no + Lines no + LinksUpToDate no + MMClips no + Mailstop no + Manager no + Matter no + ModifyDate no + Notes no + Office no + Owner no + Pages no + Paragraphs no + PresentationFormat no + Project no + Publisher no + Purpose no + ReceivedFrom no + RecordedBy no + RecordedDate no + Reference no + RevisionNumber no + ScaleCrop no + SharedDoc no + Slides no + Source no + Status no + TelephoneNumber no + Template no + TitlesOfParts no + TotalEditTime no + Typist no + Words no + +=head2 iWork Tags + +The Apple iWork '09 file format is a ZIP archive containing XML files +similar to the Office Open XML (OOXML) format. Metadata tags in iWork +files are extracted even if they don't appear below. + + Tag Name Writable + -------- -------- + Author no + Comment no + Copyright no + Keywords no + Projects no+ + Title no + +=head2 ISO Tags + +Tags extracted from ISO 9660 disk images. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0000 BootRecord ISO BootRecord + 0x0001 PrimaryVolume ISO PrimaryVolume + +=head3 ISO BootRecord Tags + + Index1 Tag Name Writable + ------ -------- -------- + 7 BootSystem no + 39 BootIdentifier no + +=head3 ISO PrimaryVolume Tags + + Index1 Tag Name Writable + ------ -------- -------- + 8 System no + 40 VolumeName no + 80 VolumeBlockCount no + 120 VolumeSetDiskCount? no + 124 VolumeSetDiskNumber? no + 128 VolumeBlockSize no + 132 PathTableSize? no + 140 PathTableLocation? no + 174 RootDirectoryCreateDate no + 190 VolumeSetName no + 318 Publisher no + 446 DataPreparer no + 574 Software no + 702 CopyrightFileName no + 740 AbstractFileName no + 776 BibligraphicFileName no + 813 VolumeCreateDate no + 830 VolumeModifyDate no + 847 VolumeExpirationDate no + 864 VolumeEffectiveDate no + +=head2 MacOS Tags + +On MacOS systems, the there are additional MDItem and XAttr Finder tags that +may be extracted. These tags are not extracted by default -- they must be +specifically requested or enabled via an API option. (Except when reading +MacOS "._" files directly, see below.) + +The tables below list some of the tags that may be extracted, but ExifTool +will extract all available information even for tags not listed. + +Tags in these tables are referred to as "pseudo" tags because their +information is not stored in the file itself. As such, B<Writable> tags in +these tables may be changed without having to rewrite the file. + +Note that on some filesystems, MacOS creates sidecar files with names that +begin with "._". ExifTool will read these files if specified, and extract +the information listed in the following table without the need for extra +options, but these files are not writable directly. + + Tag ID Tag Name Writable + ------ -------- -------- + 0x0002 RSRC RSRC + 0x0009 ATTR MacOS XAttr + +=head3 MacOS XAttr Tags + +XAttr tags are extracted using the "xattr" utility. They are extracted if +any "XAttr*" tag or the MacOS group is specifically requested, or by setting +the API XAttrTags option to 1 or the API RequestAll option to 2 or higher. +And they are extracted by default from MacOS "._" files when reading +these files directly. + + Tag Name Writable + -------- -------- + XAttrAppleMailDateReceived no + XAttrAppleMailDateSent no + XAttrAppleMailIsRemoteAttachment no + XAttrFinderInfo no + XAttrLastUsedDate no + XAttrMDItemDownloadedDate no + XAttrMDItemFinderComment no + XAttrMDItemWhereFroms no + XAttrMDLabel no + XAttrQuarantine yes! + XAttrResourceFork no + +=head3 MacOS MDItem Tags + +MDItem tags are extracted using the "mdls" utility. They are extracted if +any "MDItem*" tag or the MacOS group is specifically requested, or by +setting the API MDItemTags option to 1 or the API RequestAll option to 2 or +higher. Note that these tags do not necessarily reflect the current +metadata of a file -- it may take some time for the MacOS mdworker daemon to +index the file after a metadata change. + + Tag Name Writable + -------- -------- + AppleMailDateReceived no + AppleMailDateSent no + AppleMailFlagged no + AppleMailIsRemoteAttachment no + AppleMailMessageID no + AppleMailPriority no + AppleMailRead no + AppleMailRepliedTo no + MDItemAccountHandles no + MDItemAccountIdentifier no + MDItemAcquisitionMake no + MDItemAcquisitionModel no + MDItemAltitude no + MDItemAperture no + MDItemAudioBitRate no + MDItemAudioChannelCount no + MDItemAuthorEmailAddresses no + MDItemAuthors no + MDItemBitsPerSample no + MDItemBundleIdentifier no + MDItemCity no + MDItemCodecs no + MDItemColorSpace no + MDItemComment no + MDItemContentCreationDate no + MDItemContentCreationDateRanking no + MDItemContentCreationDate_Ranking no + MDItemContentModificationDate no + MDItemContentType no + MDItemContentTypeTree no + MDItemContributors no + MDItemCopyright no + MDItemCountry no + MDItemCreator no + MDItemDateAdded no + MDItemDateAdded_Ranking no + MDItemDescription no + MDItemDisplayName no + MDItemDownloadedDate no + MDItemDurationSeconds no + MDItemEXIFGPSVersion no + MDItemEXIFVersion no + MDItemEmailConversationID no + MDItemEncodingApplications no + MDItemExposureMode no + MDItemExposureProgram no + MDItemExposureTimeSeconds no + MDItemFNumber no + MDItemFSContentChangeDate no + MDItemFSCreationDate yes! + MDItemFSCreatorCode no + MDItemFSFinderFlags no + MDItemFSHasCustomIcon no + MDItemFSInvisible no + MDItemFSIsExtensionHidden no + MDItemFSIsStationery no + MDItemFSLabel yes! + MDItemFSName no + MDItemFSNodeCount no + MDItemFSOwnerGroupID no + MDItemFSOwnerUserID no + MDItemFSSize no + MDItemFSTypeCode no + MDItemFinderComment yes! + MDItemFlashOnOff no + MDItemFocalLength no + MDItemGPSDateStamp no + MDItemGPSStatus no + MDItemGPSTrack no + MDItemHasAlphaChannel no + MDItemISOSpeed no + MDItemIdentifier no + MDItemImageDirection no + MDItemInterestingDateRanking no + MDItemInterestingDate_Ranking no + MDItemIsApplicationManaged no + MDItemIsExistingThread no + MDItemIsLikelyJunk no + MDItemKeywords no + MDItemKind no + MDItemLastUsedDate no + MDItemLastUsedDate_Ranking no + MDItemLatitude no + MDItemLensModel no + MDItemLogicalSize no + MDItemLongitude no + MDItemMailDateReceived_Ranking no + MDItemMailboxes no + MDItemMediaTypes no + MDItemNumberOfPages no + MDItemOrientation no + MDItemOriginApplicationIdentifier no + MDItemOriginMessageID no + MDItemOriginSenderDisplayName no + MDItemOriginSenderHandle no + MDItemOriginSubject no + MDItemPageHeight no + MDItemPageWidth no + MDItemPhysicalSize no + MDItemPixelCount no + MDItemPixelHeight no + MDItemPixelWidth no + MDItemPrimaryRecipientEmailAddresses no + MDItemProfileName no + MDItemRecipients no + MDItemRedEyeOnOff no + MDItemResolutionHeightDPI no + MDItemResolutionWidthDPI no + MDItemSecurityMethod no + MDItemSpeed no + MDItemStateOrProvince no + MDItemStreamable no + MDItemSubject no + MDItemTimestamp no + MDItemTitle no + MDItemTotalBitRate no + MDItemUseCount no + MDItemUsedDates no + MDItemUserDownloadedDate no + MDItemUserDownloadedUserHandle no + MDItemUserSharedReceivedDate no + MDItemUserSharedReceivedRecipient no + MDItemUserSharedReceivedRecipientHandle no + MDItemUserSharedReceivedSender no + MDItemUserSharedReceivedSenderHandle no + MDItemUserSharedReceivedTransport no + MDItemUserTags yes!+ + MDItemVersion no + MDItemVideoBitRate no + MDItemWhereFroms no + MDItemWhiteBalance no + +=head2 Extra Tags + +The extra tags provide extra features or extra information extracted or +generated by ExifTool that is not directly associated with another tag +group. The B<Group> column lists the family 1 group name when reading. +Tags with a "-" in this column are write-only. + +Tags in the family 1 "System" group are referred to as "pseudo" tags because +they don't represent real metadata in the file. Instead, this information +is stored in the directory structure of the filesystem. The B<Writable> +System "pseudo" tags in this table may be written without modifying the file +itself. The TestName tag is used for dry-run testing before writing +FileName. + + Tag Name Group Writable + -------- ----- -------- + Adobe Adobe yes! + BaseName System no + CanonDR4 CanonVRD yes!^ + CanonVRD CanonVRD yes!^ + Comment File yes + CurrentIPTCDigest File no + Directory System yes! + EXIF EXIF yes! + EmbeddedVideo File no + Error ExifTool no + ExifByteOrder File yes + ExifToolVersion ExifTool no + ExifUnicodeByteOrder - yes + FileAccessDate System no + FileAttributes System no + FileBlockCount System no + FileBlockSize System no + FileCreateDate System yes! + FileDeviceID System no + FileDeviceNumber System no + FileGroupID System yes! + FileHardLinks System no + FileInodeChangeDate System no + FileInodeNumber System no + FileModifyDate System yes! + FileName System yes! + FilePath System no + FilePermissions System yes! + FileSequence ExifTool no + FileSize System no + FileType File no + FileTypeExtension File no + FileUserID System yes! + ForceWrite - yes + Geosync - yes + Geotag - yes + Geotime - yes + HardLink - yes! + ICC_Profile ICC_Profile yes! + ID3Size File no + IPTC IPTC yes! + ImageHeight File no + ImageWidth File no + JPEGDigest File no + JPEGImageLength File no + JPEGQualityEstimate File no + MIMEType File no + MaxVal File no + NewGUID ExifTool no + Now ExifTool no + OtherImage File no + PageCount File no + PreviewImage File yes + PreviewPDF File no + PreviewPNG File no + PreviewTIFF File no + PreviewWMF File no + ProcessingTime ExifTool no + RAFVersion File no + ResourceForkSize System no + SymLink - yes! + TestName - yes! + ThumbnailImage File no + Trailer File yes! + Validate ExifTool no + Warning ExifTool no + XML XML no + XMP XMP yes! + XResolution File no + YResolution File no + ZoneIdentifier System yes! + +=head2 Composite Tags + +The values of the composite tags are B<Derived From> the values of other +tags. These are convenience tags which are calculated after all other +information is extracted. Only a few of these tags are writable directly, +the others are changed by writing the corresponding B<Derived From> tags. +User-defined Composite tags, also useful for custom-formatting of tag +values, may created via the ExifTool configuration file. + + Tag Name Derived From Writable + -------- ------------ -------- + AdvancedSceneMode Model no + SceneMode + AdvancedSceneType + Aperture FNumber no + ApertureValue + AudioBitrate MPEG:MPEGAudioVersion no + MPEG:SampleRate + MPEG:VBRBytes + MPEG:VBRFrames + AutoFocus Nikon:PhaseDetectAF no + Nikon:ContrastDetectAF + AvgBitrate QuickTime::MediaDataSize no + QuickTime::Duration + BlueBalance WB_RGGBLevels no + WB_RGBGLevels + WB_RBGGLevels + WB_GRBGLevels + WB_GRGBLevels + WB_GBRGLevels + WB_RGBLevels + WB_GRBLevels + WB_RBLevels + WBBlueLevel + WBGreenLevel + CDDBDiscPlayTime CDDB1Info no + CDDBDiscTracks CDDB1Info no + CFAPattern CFARepeatPatternDim no + CFAPattern2 + CircleOfConfusion ScaleFactor35efl no + ConditionalFEC FlashExposureComp no + FlashBits + DOF FocalLength no + Aperture + CircleOfConfusion + FocusDistance + SubjectDistance + ObjectDistance + ApproximateFocusDistance + FocusDistanceLower + FocusDistanceUpper + DateCreated Kodak:YearCreated no + Kodak:MonthDayCreated + DateTimeCreated IPTC:DateCreated no + IPTC:TimeCreated + DateTimeOriginal DateTimeCreated no + DateCreated + TimeCreated + DateTimeOriginal ID3:RecordingTime no + ID3:Year + ID3:Date + ID3:Time + DepthMapTiff DepthMapData no + DepthMapWidth + DepthMapHeight + DigitalCreationDateTime IPTC:DigitalCreationDate no + IPTC:DigitalCreationTime + DigitalZoom Canon:ZoomSourceWidth no + Canon:ZoomTargetWidth + Canon:DigitalZoom + DriveMode ContinuousDrive no + SelfTimer + Duration AIFF:SampleRate no + AIFF:NumSampleFrames + Duration APE:SampleRate no + APE:TotalFrames + APE:BlocksPerFrame + APE:FinalFrameBlocks + Duration FLAC:SampleRate no + FLAC:TotalSamples + Duration FileSize no + ID3Size + MPEG:AudioBitrate + MPEG:VideoBitrate + MPEG:VBRFrames + MPEG:SampleRate + MPEG:MPEGAudioVersion + Duration RIFF:FrameRate no + RIFF:FrameCount + VideoFrameRate + VideoFrameCount + Duration RIFF:AvgBytesPerSec no + FileSize + FrameCount + VideoFrameCount + Duration Vorbis:NominalBitrate no + FileSize + ExtenderStatus Olympus:Extender no + Olympus:LensType + MaxApertureValue + FOV FocalLength no + ScaleFactor35efl + FocusDistance + FileNumber DirectoryIndex yes + FileIndex + Flash XMP:FlashFired yes + XMP:FlashReturn + XMP:FlashMode + XMP:FlashFunction + XMP:FlashRedEyeMode + XMP:Flash + FlashType FlashBits no + FocalLength35efl FocalLength no + ScaleFactor35efl + FocusDistance Sony:FocusPosition no + FocalLength + FocusDistance2 Sony:FocusPosition2 no + FocalLengthIn35mmFormat + GPSAltitude GPS:GPSAltitude no + GPS:GPSAltitudeRef + XMP:GPSAltitude + XMP:GPSAltitudeRef + GPSAltitude QuickTime:GPSCoordinates no + GPSAltitude QuickTime:LocationInformation no + GPSAltitudeRef QuickTime:GPSCoordinates no + GPSAltitudeRef QuickTime:LocationInformation no + GPSDateTime GPS:GPSDateStamp no + GPS:GPSTimeStamp + GPSDateTime Parrot:GPSLatitude no + Main:CreateDate + SampleTime + GPSDateTime Sony:GPSDateStamp no + Sony:GPSTimeStamp + GPSDestLatitude GPS:GPSDestLatitude no + GPS:GPSDestLatitudeRef + GPSDestLatitudeRef XMP-exif:GPSDestLatitude no + GPSDestLongitude GPS:GPSDestLongitude no + GPS:GPSDestLongitudeRef + GPSDestLongitudeRef XMP-exif:GPSDestLongitude no + GPSLatitude GPS:GPSLatitude yes/ + GPS:GPSLatitudeRef + GPSLatitude QuickTime:GPSCoordinates no + GPSLatitude QuickTime:LocationInformation no + GPSLatitude Sony:GPSLatitude no + Sony:GPSLatitudeRef + GPSLatitudeRef XMP-exif:GPSLatitude no + GPSLongitude GPS:GPSLongitude yes/ + GPS:GPSLongitudeRef + GPSLongitude QuickTime:GPSCoordinates no + GPSLongitude QuickTime:LocationInformation no + GPSLongitude Sony:GPSLongitude no + Sony:GPSLongitudeRef + GPSLongitudeRef XMP-exif:GPSLongitude no + GPSPosition GPSLatitude yes! + GPSLongitude + HyperfocalDistance FocalLength no + Aperture + CircleOfConfusion + IDCPreviewImage IDCPreviewStart no + IDCPreviewLength + ISO Canon:CameraISO no + Canon:BaseISO + Canon:AutoISO + ImageHeight IFD0:SensorTopBorder no + IFD0:SensorBottomBorder + ImageHeight Main:PostScript:ImageData no + PostScript:BoundingBox + ImageSize ImageWidth no + ImageHeight + ExifImageWidth + ExifImageHeight + RawImageCroppedSize + ImageWidth IFD0:SensorLeftBorder no + IFD0:SensorRightBorder + ImageWidth Main:PostScript:ImageData no + PostScript:BoundingBox + JpgFromRaw JpgFromRawStart yes + JpgFromRawLength + Lens Canon:MinFocalLength no + Canon:MaxFocalLength + Lens35efl Canon:MinFocalLength no + Canon:MaxFocalLength + Lens + ScaleFactor35efl + LensID LensType no + FocalLength + MaxAperture + MaxApertureValue + MinFocalLength + MaxFocalLength + LensModel + LensFocalRange + LensSpec + LensType2 + LensType3 + LensFocalLength + RFLensType + LensID LensModel no + Lens + XMP-aux:LensID + Make + LensID Nikon:LensIDNumber no + LensFStops + MinFocalLength + MaxFocalLength + MaxApertureAtMinFocal + MaxApertureAtMaxFocal + MCUVersion + Nikon:LensType + LensID Ricoh:LensFirmware no + LensID XMP-aux:LensID no + Make + LensInfo + FocalLength + LensModel + MaxApertureValue + LensSpec Nikon:Lens no + Nikon:LensType + LensType LensTypeMake no + LensTypeModel + LightValue Aperture no + ShutterSpeed + ISO + MPImage MPImageStart no + MPImageLength + MPImageType + Megapixels ImageSize no + OriginalDecisionData OriginalDecisionDataOffset yes! + OtherImage OtherImageStart yes + OtherImageLength + PeakSpectralSensitivity FLIR:PlanckB no + PreviewImage PreviewImageStart yes + PreviewImageLength + PreviewImageValid + PreviewImageStart (1) + PreviewImageLength (1) + PreviewImage ScreenNail no + PreviewImageSize PreviewImageWidth no + PreviewImageHeight + RedBalance WB_RGGBLevels no + WB_RGBGLevels + WB_RBGGLevels + WB_GRBGLevels + WB_GRGBLevels + WB_GBRGLevels + WB_RGBLevels + WB_GRBLevels + WB_RBLevels + WBRedLevel + WBGreenLevel + RedEyeReduction CanonFlashMode no + FlashBits + RicohPitch Ricoh:Accelerometer no + RicohRoll Ricoh:Accelerometer no + Rotation QuickTime:MatrixStructure yes! + QuickTime:HandlerType + RunTimeSincePowerUp Apple:RunTimeValue no + Apple:RunTimeScale + ScaleFactor35efl FocalLength no + FocalLengthIn35mmFormat + Composite:DigitalZoom + FocalPlaneDiagonal + SensorSize + FocalPlaneXSize + FocalPlaneYSize + FocalPlaneResolutionUnit + FocalPlaneXResolution + FocalPlaneYResolution + ExifImageWidth + ExifImageHeight + CanonImageWidth + CanonImageHeight + ImageWidth + ImageHeight + ShootingMode CanonExposureMode no + EasyMode + BulbDuration + ShutterCurtainHack FlashBits no + ShutterCurtainSync + ShutterSpeed ExposureTime no + ShutterSpeedValue + BulbDuration + SingleShotDepthMapTiff SingleShotDepthMap no + SegWidth + SegHeight + SubSecCreateDate EXIF:CreateDate yes + SubSecTimeDigitized + OffsetTimeDigitized + SubSecDateTimeOriginal EXIF:DateTimeOriginal yes + SubSecTimeOriginal + OffsetTimeOriginal + SubSecModifyDate EXIF:ModifyDate yes + SubSecTime + OffsetTime + ThumbnailImage ThumbnailOffset yes + ThumbnailLength + ThumbnailTIFF SubfileType no + Compression + ImageWidth + ImageHeight + BitsPerSample + PhotometricInterpretation + StripOffsets + SamplesPerPixel + RowsPerStrip + StripByteCounts + PlanarConfiguration + Orientation + VolumeSize ISO:VolumeBlockCount no + ISO:VolumeBlockSize + WB_RGBLevels KDC_IFD:WhiteBalance no + WB_RGBLevelsAuto + WB_RGBLevelsFluorescent + WB_RGBLevelsTungsten + WB_RGBLevelsDaylight + WB_RGBLevels4 + WB_RGBLevels5 + WB_RGBLevelsShade + WB_RGBLevels KodakIFD:WhiteBalance no + WB_RGBMul0 + WB_RGBMul1 + WB_RGBMul2 + WB_RGBMul3 + WB_RGBCoeffs0 + WB_RGBCoeffs1 + WB_RGBCoeffs2 + WB_RGBCoeffs3 + KodakIFD:ColorTemperature + Kodak:WB_RGBLevels + WB_RGGBLevels Canon:WhiteBalance no + WB_RGGBLevelsAsShot + WB_RGGBLevelsAuto + WB_RGGBLevelsDaylight + WB_RGGBLevelsCloudy + WB_RGGBLevelsTungsten + WB_RGGBLevelsFluorescent + WB_RGGBLevelsFlash + WB_RGGBLevelsCustom + WB_RGGBLevelsShade + WB_RGGBLevelsKelvin + WB_RGGBLevels WB_RGGBLevelsUncorrected no + WB_RGGBLevelsBlack + ZoomedPreviewImage ZoomedPreviewStart no + ZoomedPreviewLength + +=head2 Shortcuts Tags + +Shortcut tags are convenience tags that represent one or more other tag +names. They are used like regular tags to read and write the information +for a specified set of tags. + +The shortcut tags below have been pre-defined, but user-defined shortcuts +may be added via the %Image::ExifTool::UserDefined::Shortcuts lookup in the +=/.ExifTool_config file. See the Image::ExifTool::Shortcuts documentation +for more details. + + Tag Name Refers To Writable + -------- --------- -------- + AllDates DateTimeOriginal yes + CreateDate + ModifyDate + Canon FileName yes + Model + DateTimeOriginal + ShootingMode + ShutterSpeed + Aperture + MeteringMode + ExposureCompensation + ISO + Lens + FocalLength + ImageSize + Quality + Flash + FlashType + ConditionalFEC + RedEyeReduction + ShutterCurtainHack + WhiteBalance + FocusMode + Contrast + Sharpness + Saturation + ColorTone + ColorSpace + LongExposureNoiseReduction + FileSize + FileNumber + DriveMode + OwnerName + SerialNumber + ColorSpaceTags ExifIFD:ColorSpace yes + ExifIFD:Gamma + InteropIFD:InteropIndex + ICC_Profile + Common FileName yes + FileSize + Model + DateTimeOriginal + ImageSize + Quality + FocalLength + ShutterSpeed + Aperture + ISO + WhiteBalance + Flash + CommonIFD0 IFD0:ImageDescription yes + IFD0:Make + IFD0:Model + IFD0:Software + IFD0:ModifyDate + IFD0:Artist + IFD0:Copyright + IFD0:Rating + IFD0:RatingPercent + IFD0:DNGLensInfo + IFD0:PanasonicTitle + IFD0:PanasonicTitle2 + IFD0:XPTitle + IFD0:XPComment + IFD0:XPAuthor + IFD0:XPKeywords + IFD0:XPSubject + LargeTags CanonVRD yes + DLOData + EXIF + ICC_Profile + IDCPreviewImage + ImageData + IPTC + JpgFromRaw + OriginalRawImage + OtherImage + PreviewImage + ThumbnailImage + TIFFPreview + XML + XMP + ZoomedPreviewImage + MakerNotes MakerNotes yes + MakerNoteApple + MakerNoteCanon + MakerNoteCasio + MakerNoteCasio2 + MakerNoteDJI + MakerNoteDJIInfo + MakerNoteFLIR + MakerNoteFujiFilm + MakerNoteGE + MakerNoteGE2 + MakerNoteHasselblad + MakerNoteHP + MakerNoteHP2 + MakerNoteHP4 + MakerNoteHP6 + MakerNoteISL + MakerNoteJVC + MakerNoteJVCText + MakerNoteKodak1a + MakerNoteKodak1b + MakerNoteKodak2 + MakerNoteKodak3 + MakerNoteKodak4 + MakerNoteKodak5 + MakerNoteKodak6a + MakerNoteKodak6b + MakerNoteKodak7 + MakerNoteKodak8a + MakerNoteKodak8b + MakerNoteKodak8c + MakerNoteKodak9 + MakerNoteKodak10 + MakerNoteKodak11 + MakerNoteKodak12 + MakerNoteKodakUnknown + MakerNoteKyocera + MakerNoteMinolta + MakerNoteMinolta2 + MakerNoteMinolta3 + MakerNoteMotorola + MakerNoteNikon + MakerNoteNikon2 + MakerNoteNikon3 + MakerNoteNintendo + MakerNoteOlympus + MakerNoteOlympus2 + MakerNoteOlympus3 + MakerNoteLeica + MakerNoteLeica2 + MakerNoteLeica3 + MakerNoteLeica4 + MakerNoteLeica5 + MakerNoteLeica6 + MakerNoteLeica7 + MakerNoteLeica8 + MakerNoteLeica9 + MakerNoteLeica10 + MakerNotePanasonic + MakerNotePanasonic2 + MakerNotePanasonic3 + MakerNotePentax + MakerNotePentax2 + MakerNotePentax3 + MakerNotePentax4 + MakerNotePentax5 + MakerNotePentax6 + MakerNotePhaseOne + MakerNoteReconyx + MakerNoteReconyx2 + MakerNoteReconyx3 + MakerNoteRicoh + MakerNoteRicoh2 + MakerNoteRicohPentax + MakerNoteRicohText + MakerNoteSamsung1a + MakerNoteSamsung1b + MakerNoteSamsung2 + MakerNoteSanyo + MakerNoteSanyoC4 + MakerNoteSanyoPatch + MakerNoteSigma + MakerNoteSony + MakerNoteSony2 + MakerNoteSony3 + MakerNoteSony4 + MakerNoteSony5 + MakerNoteSonyEricsson + MakerNoteSonySRF + MakerNoteUnknownText + MakerNoteUnknownBinary + MakerNoteUnknown + Nikon Model yes + SubSecDateTimeOriginal + ShutterCount + LensSpec + FocalLength + ImageSize + ShutterSpeed + Aperture + ISO + NoiseReduction + ExposureProgram + ExposureCompensation + WhiteBalance + WhiteBalanceFineTune + ShootingMode + Quality + MeteringMode + FocusMode + ImageOptimization + ToneComp + ColorHue + ColorSpace + HueAdjustment + Saturation + Sharpness + Flash + FlashMode + FlashExposureComp + Unsafe IFD0:YCbCrPositioning yes + IFD0:YCbCrCoefficients + IFD0:TransferFunction + ExifIFD:ComponentsConfiguration + ExifIFD:CompressedBitsPerPixel + InteropIFD:InteropIndex + InteropIFD:InteropVersion + InteropIFD:RelatedImageWidth + InteropIFD:RelatedImageHeight + ls-l FilePermissions yes + FileHardLinks + FileUserID + FileGroupID + FileSize# + FileModifyDate + FileName + +=head2 MWG Tags + +The Metadata Working Group (MWG) recommends techniques to allow certain +overlapping EXIF, IPTC and XMP tags to be reconciled when reading, and +synchronized when writing. The MWG Composite tags below are designed to aid +in the implementation of these recommendations. As well, the MWG defines +new XMP tags which are listed in the subsequent tables below. See +L<https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf> +for the official MWG specification. + +=head3 MWG Composite Tags + +The table below lists special Composite tags which are used to access other +tags based on the MWG 2.0 recommendations. These tags are only accessible +when explicitly loaded, but this is done automatically by the exiftool +application if MWG is specified as a group for any tag on the command line, +or manually with the C<-use MWG> option. Via the API, the MWG Composite +tags are loaded by calling "C<Image::ExifTool::MWG::Load()>". + +When reading, the value of each MWG tag is B<Derived From> the specified +tags based on the MWG guidelines. When writing, the appropriate associated +tags are written. The value of the IPTCDigest tag is updated automatically +when the IPTC is changed if either the IPTCDigest tag didn't exist +beforehand or its value agreed with the original IPTC digest (indicating +that the XMP is synchronized with the IPTC). IPTC information is written +only if the original file contained IPTC. + +Loading the MWG module activates "strict MWG conformance mode", which has +the effect of causing EXIF, IPTC and XMP in non-standard locations to be +ignored when reading, as per the MWG recommendations. Instead, a "Warning" +tag is generated when non-standard metadata is encountered. This feature +may be disabled by setting C<$Image::ExifTool::MWG::strict = 0> in the +ExifTool config file (or from your Perl script when using the API). Note +that the behaviour when writing is not changed: ExifTool always creates new +records only in the standard location, but writes new tags to any +EXIF/IPTC/XMP records that exist. + +Contrary to the EXIF specification, the MWG recommends that EXIF "ASCII" +string values be stored as UTF-8. To honour this, the exiftool application +sets the default internal EXIF string encoding to "UTF8" when the MWG module +is loaded, but via the API this must be done manually by setting the +CharsetEXIF option. + +A complication of the MWG specification is that although the MWG:Creator +property may consist of multiple values, the associated EXIF tag +(EXIF:Artist) is only a simple string. To resolve this discrepancy the MWG +recommends a technique which allows a list of values to be stored in a +string by using a semicolon-space separator (with quotes around values if +necessary). When the MWG module is loaded, ExifTool automatically +implements this policy and changes EXIF:Artist to a list-type tag. + + Tag Name Derived From Writable + -------- ------------ -------- + City IPTC:City yes + XMP-photoshop:City + XMP-iptcExt:LocationShownCity + CurrentIPTCDigest + IPTCDigest + Copyright EXIF:Copyright yes + IPTC:CopyrightNotice + XMP-dc:Rights + CurrentIPTCDigest + IPTCDigest + Country IPTC:Country-PrimaryLocationName yes + XMP-photoshop:Country + XMP-iptcExt:LocationShownCountryName + CurrentIPTCDigest + IPTCDigest + CreateDate Composite:SubSecCreateDate yes + EXIF:CreateDate + IPTC:DigitalCreationDate + IPTC:DigitalCreationTime + XMP-xmp:CreateDate + CurrentIPTCDigest + IPTCDigest + Creator EXIF:Artist yes+ + IPTC:By-line + XMP-dc:Creator + CurrentIPTCDigest + IPTCDigest + DateTimeOriginal Composite:SubSecDateTimeOriginal yes + EXIF:DateTimeOriginal + IPTC:DateCreated + IPTC:TimeCreated + XMP-photoshop:DateCreated + CurrentIPTCDigest + IPTCDigest + Description EXIF:ImageDescription yes + IPTC:Caption-Abstract + XMP-dc:Description + CurrentIPTCDigest + IPTCDigest + Keywords IPTC:Keywords yes+ + XMP-dc:Subject + CurrentIPTCDigest + IPTCDigest + Location IPTC:Sub-location yes + XMP-iptcCore:Location + XMP-iptcExt:LocationShownSublocation + CurrentIPTCDigest + IPTCDigest + ModifyDate Composite:SubSecModifyDate yes + EXIF:ModifyDate + XMP-xmp:ModifyDate + CurrentIPTCDigest + IPTCDigest + Orientation EXIF:Orientation yes + Rating XMP-xmp:Rating yes + State IPTC:Province-State yes + XMP-photoshop:State + XMP-iptcExt:LocationShownProvinceState + CurrentIPTCDigest + IPTCDigest + +=head3 MWG Regions Tags + +Image region metadata defined by the MWG 2.0 specification. These tags +may be accessed without the need to load the MWG Composite tags above. See +L<https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf> +for the official specification. + +These tags belong to the ExifTool XMP-mwg-rs family 1 group. + + Tag Name Writable + -------- -------- + RegionInfo MWG RegionInfo Struct + RegionAppliedToDimensions Dimensions Struct_ + RegionAppliedToDimensionsH real_ + RegionAppliedToDimensionsUnit string_ + RegionAppliedToDimensionsW real_ + RegionList MWG RegionStruct Struct_+ + RegionArea Area Struct_+ + RegionAreaD real_+ + RegionAreaH real_+ + RegionAreaUnit string_+ + RegionAreaW real_+ + RegionAreaX real_+ + RegionAreaY real_+ + RegionBarCodeValue string_+ + RegionDescription string_+ + RegionExtensions MWG Extensions Struct_+ + RegionFocusUsage string_+ + RegionName string_+ + RegionRotation real_+ + RegionSeeAlso string_+ + RegionType string_+ + +=head3 MWG RegionInfo Struct + + Field Name Writable + ---------- -------- + AppliedToDimensions Dimensions Struct + RegionList MWG RegionStruct Struct+ + +=head3 MWG RegionStruct Struct + + Field Name Writable + ---------- -------- + Area Area Struct + BarCodeValue string + Description string + Extensions MWG Extensions Struct + FocusUsage string + Name string + Rotation real + Type string + SeeAlso string + +=head3 MWG Extensions Struct + +This structure may contain any top-level XMP tags, but none have been +pre-defined in ExifTool. Since no flattened tags have been pre-defined, +RegionExtensions is writable only as a structure (eg. +C<{xmp-dc:creator=me,rating=5}>). Fields for this structure are identified +using the standard ExifTool tag name (with optional leading group name, +and/or trailing language code, and/or trailing C<#> symbol to disable print +conversion). + + Field Name Writable + ---------- -------- + [no tags known] + +=head3 MWG Keywords Tags + +Hierarchical keywords metadata defined by the MWG 2.0 specification. +ExifTool unrolls keyword structures to an arbitrary depth of 6 to allow +individual levels to be accessed with different tag names, and to avoid +infinite recursion. See +L<https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf> +for the official specification. + +These tags belong to the ExifTool XMP-mwg-kw family 1 group. + + Tag Name Writable + -------- -------- + KeywordInfo MWG KeywordInfo Struct + HierarchicalKeywords MWG KeywordStruct Struct_+ + HierarchicalKeywords1Applied boolean_+ + HierarchicalKeywords1Children MWG KeywordStruct Struct_+ + HierarchicalKeywords2Applied boolean_+ + HierarchicalKeywords2Children MWG KeywordStruct Struct_+ + HierarchicalKeywords3Applied boolean_+ + HierarchicalKeywords3Children MWG KeywordStruct Struct_+ + HierarchicalKeywords4Applied boolean_+ + HierarchicalKeywords4Children MWG KeywordStruct Struct_+ + HierarchicalKeywords5Applied boolean_+ + HierarchicalKeywords5Children MWG KeywordStruct Struct_+ + HierarchicalKeywords6Applied boolean_+ + HierarchicalKeywords6 string_+ + HierarchicalKeywords5 string_+ + HierarchicalKeywords4 string_+ + HierarchicalKeywords3 string_+ + HierarchicalKeywords2 string_+ + HierarchicalKeywords1 string_+ + +=head3 MWG KeywordInfo Struct + + Field Name Writable + ---------- -------- + Hierarchy MWG KeywordStruct Struct+ + +=head3 MWG KeywordStruct Struct + + Field Name Writable + ---------- -------- + Applied boolean + Children MWG KeywordStruct Struct+ + Keyword string + +=head3 MWG Collections Tags + +Collections metadata defined by the MWG 2.0 specification. See +L<https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf> +for the official specification. + +These tags belong to the ExifTool XMP-mwg-coll family 1 group. + + Tag Name Writable + -------- -------- + Collections MWG CollectionInfo Struct+ + CollectionName string_+ + CollectionURI string_+ + +=head3 MWG CollectionInfo Struct + + Field Name Writable + ---------- -------- + CollectionName string + CollectionURI string + +=head1 NOTES + +This document generated automatically by +L<Image::ExifTool::BuildTagLookup|Image::ExifTool::BuildTagLookup>. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Text.pm b/lib/Image/ExifTool/Text.pm new file mode 100644 index 0000000..283cc96 --- /dev/null +++ b/lib/Image/ExifTool/Text.pm @@ -0,0 +1,245 @@ +#------------------------------------------------------------------------------ +# File: Text.pm +# +# Description: Deduce characteristics of TXT and CSV files +# +# Revisions: 2019-11-01 - P. Harvey Created +# 2020-02-13 - PH Added CSV file support +# +# References: 1) https://github.com/file/file +#------------------------------------------------------------------------------ + +package Image::ExifTool::Text; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::XMP; + +$VERSION = '1.03'; + +# Text tags +%Image::ExifTool::Text::Main = ( + VARS => { NO_ID => 1 }, + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Document' }, + NOTES => q{ + Although basic text files contain no metadata, the following tags are + determined from a simple analysis of the data in TXT and CSV files. + Statistics are generated only for 8-bit encodings, but the L<FastScan|../ExifTool.html#FastScan> (-fast) + option may be used to limit processing to the first 64 kB in which case some + tags are not produced. To avoid long processing delays, ExifTool will issue + a minor warning and process only the first 64 kB of any file larger than 20 + MB unless the L<IgnoreMinorErrors|../ExifTool.html#IgnoreMinorErrors> (-m) + option is used. + }, + MIMEEncoding => { Groups => { 2 => 'Other' } }, + Newlines => { + PrintConv => { + "\r\n" => 'Windows CRLF', + "\r" => 'Macintosh CR', + "\n" => 'Unix LF', + '' => '(none)', + }, + }, + ByteOrderMark => { PrintConv => { 0 => 'No', 1 => 'Yes' } }, + LineCount => { }, + WordCount => { }, + Delimiter => { PrintConv => { '' => '(none)', ',' => 'Comma', ';' => 'Semicolon', "\t" => 'Tab' }}, + Quoting => { PrintConv => { '' => '(none)', '"' => 'Double quotes', "'" => 'Single quotes' }}, + RowCount => { }, + ColumnCount => { }, +); + +#------------------------------------------------------------------------------ +# Extract some stats from a text file +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a text file +sub ProcessTXT($$) +{ + my ($et, $dirInfo) = @_; + my $dataPt = $$dirInfo{TestBuff}; + my $raf = $$dirInfo{RAF}; + my $fast = $et->Options('FastScan') || 0; + my ($buff, $enc, $isBOM, $isUTF8); + my $nl = ''; + + return 0 unless length $$dataPt; # can't call it a text file if it has no text + + # read more from the file if necessary + if ($fast < 3 and length($$dataPt) == $Image::ExifTool::testLen) { + $raf->Read($buff, 65536) or return 0; + $dataPt = \$buff; + } +# +# make our best guess at the character encoding (EBCDIC is not supported) +# + if ($$dataPt =~ /([\0-\x06\x0e-\x1a\x1c-\x1f\x7f])/) { + # file contains weird control characters, could be multi-byte Unicode + if ($$dataPt =~ /^(\xff\xfe\0\0|\0\0\xfe\xff)/) { + if ($1 eq "\xff\xfe\0\0") { + $enc = 'utf-32le'; + $nl = $1 if $$dataPt =~ /(\r\0\0\0\n|\r|\n)\0\0\0/; + } else { + $enc = 'utf-32be'; + $nl = $1 if $$dataPt =~ /\0\0\0(\r\0\0\0\n|\r|\n)/; + } + } elsif ($$dataPt =~ /^(\xff\xfe|\xfe\xff)/) { + if ($1 eq "\xff\xfe") { + $enc = 'utf-16le'; + $nl = $1 if $$dataPt =~ /(\r\0\n|\r|\n)\0/; + } else { + $enc = 'utf-16be'; + $nl = $1 if $$dataPt =~ /\0(\r\0\n|\r|\n)/; + } + } else { + return 0; # probably not a text file + } + $nl =~ tr/\0//d; # remove nulls from newline sequence + $isBOM = 1; # (we don't recognize UTF-16/UTF-32 without one) + } else { + $isUTF8 = Image::ExifTool::XMP::IsUTF8($dataPt, 1); + if ($isUTF8 == 0) { + $enc = 'us-ascii'; + } elsif ($isUTF8 > 0) { + $enc = 'utf-8'; + $isBOM = ($$dataPt =~ /^\xef\xbb\xbf/ ? 1 : 0); + } elsif ($$dataPt !~ /[\x80-\x9f]/) { + $enc = 'iso-8859-1'; + } else { + $enc = 'unknown-8bit'; + } + $nl = $1 if $$dataPt =~ /(\r\n|\r|\n)/; + } + + my $tagTablePtr = GetTagTable('Image::ExifTool::Text::Main'); + + $et->SetFileType(); + $et->HandleTag($tagTablePtr, MIMEEncoding => $enc); + + return 1 if $fast == 3 or not $raf->Seek(0,0); + + $et->HandleTag($tagTablePtr, ByteOrderMark => $isBOM) if defined $isBOM; + $et->HandleTag($tagTablePtr, Newlines => $nl); + + return 1 if $fast or not defined $isUTF8; +# +# generate stats for CSV files +# + if ($$et{FileType} eq 'CSV') { + my ($delim, $quot, $ncols); + my $nrows = 0; + while ($raf->ReadLine($buff)) { + if (not defined $delim) { + my %count = ( ',' => 0, ';' => 0, "\t" => 0 ); + ++$count{$_} foreach $buff =~ /[,;\t]/g; + if ($count{','} > $count{';'} and $count{','} > $count{"\t"}) { + $delim = ','; + } elsif ($count{';'} > $count{"\t"}) { + $delim = ';'; + } elsif ($count{"\t"}) { + $delim = "\t"; + } else { + $delim = ''; + $ncols = 1; + } + unless ($ncols) { + # account for delimiters in quotes (simplistically) + while ($buff =~ /(^|$delim)(["'])(.*?)\2(?=$delim|$)/sg) { + $quot = $2; + my $field = $3; + $count{$delim} -= () = $field =~ /$delim/g; + } + $ncols = $count{$delim} + 1; + } + } elsif (not $quot) { + $quot = $2 if $buff =~ /(^|$delim)(["'])(.*?)\2(?=$delim|$)/sg; + } + if (++$nrows == 1000 and $et->Warn('Not counting rows past 1000', 2)) { + undef $nrows; + last; + } + } + $et->HandleTag($tagTablePtr, Delimiter => ($delim || '')); + $et->HandleTag($tagTablePtr, Quoting => ($quot || '')); + $et->HandleTag($tagTablePtr, ColumnCount => $ncols); + $et->HandleTag($tagTablePtr, RowCount => $nrows) if $nrows; + return 1; + } + return 1 if $$et{VALUE}{FileSize} and $$et{VALUE}{FileSize} > 20000000 and + $et->Warn('Not counting lines/words in text file larger than 20 MB', 2); +# +# count lines/words and check encoding of the rest of the file +# + my ($lines, $words) = (0, 0); + my $oldNL = $/; + $/ = $nl if $nl; + while ($raf->ReadLine($buff)) { + ++$lines; + ++$words while $buff =~ /\S+/g; + if (not $nl and $buff =~ /(\r\n|\r|\n)$/) { + # (the first line must have been longer than 64 kB) + $$et{VALUE}{Newlines} = $nl = $1; + } + next if $raf->Tell() < 65536; + # continue to check encoding after the first 64 kB + if ($isUTF8 >= 0) { # (if ascii or utf8) + $isUTF8 = Image::ExifTool::XMP::IsUTF8(\$buff); + if ($isUTF8 > 0) { + $enc = 'utf-8'; + } elsif ($isUTF8 < 0) { + $enc = $buff =~ /[\x80-\x9f]/ ? 'unknown-8bit' : 'iso-8859-1'; + } + } elsif ($enc eq 'iso-8859-1' and $buff =~ /[\x80-\x9f]/) { + $enc = 'unknown-8bit'; + } + } + if ($$et{VALUE}{MIMEEncoding} ne $enc) { + $$et{VALUE}{MIMEEncoding} = $enc; + $et->VPrint(0," MIMEEncoding [override] = $enc\n"); + } + $/ = $oldNL; + $et->HandleTag($tagTablePtr, LineCount => $lines); + $et->HandleTag($tagTablePtr, WordCount => $words); + return 1; +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Text - Read Text meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to deduce some +characteristics of TXT and CSV files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://github.com/file/file> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Text Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Theora.pm b/lib/Image/ExifTool/Theora.pm new file mode 100644 index 0000000..f80560d --- /dev/null +++ b/lib/Image/ExifTool/Theora.pm @@ -0,0 +1,145 @@ +#------------------------------------------------------------------------------ +# File: Theora.pm +# +# Description: Read Theora video meta information +# +# Revisions: 2011/07/13 - P. Harvey Created +# +# References: 1) http://www.theora.org/doc/Theora.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::Theora; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.00'; + +# Theora header types +%Image::ExifTool::Theora::Main = ( + NOTES => q{ + Information extracted from Ogg Theora video files. See + L<http://www.theora.org/doc/Theora.pdf> for the Theora specification. + }, + 0x80 => { + Name => 'Identification', + SubDirectory => { + TagTable => 'Image::ExifTool::Theora::Identification', + ByteOrder => 'BigEndian', + }, + }, + 0x81 => { + Name => 'Comments', + SubDirectory => { + TagTable => 'Image::ExifTool::Vorbis::Comments', + }, + }, + # 0x82 - Setup +); + +# tags extracted from Theora Idenfication header +%Image::ExifTool::Theora::Identification = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Video' }, + NOTES => 'Tags extracted from the Theora identification header.', + 0 => { + Name => 'TheoraVersion', + Format => 'int8u[3]', + PrintConv => '$val =~ tr/ /./; $val', + }, + 7 => { + Name => 'ImageWidth', + Format => 'int32u', + ValueConv => '$val >> 8', + }, + 10 => { + Name => 'ImageHeight', + Format => 'int32u', + ValueConv => '$val >> 8', + }, + 13 => 'XOffset', + 14 => 'YOffset', + 15 => { + Name => 'FrameRate', + Format => 'rational64u', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + }, + 23 => { + Name => 'PixelAspectRatio', + Format => 'int16u[3]', + ValueConv => 'my @a=split(" ",$val); (($a[0]<<8)+($a[1]>>8)) / ((($a[1]&0xff)<<8)+$a[2])', + PrintConv => 'int($val * 1000 + 0.5) / 1000', + }, + 29 => { + Name => 'ColorSpace', + PrintConv => { + 0 => 'Undefined', + 1 => 'Rec. 470M', + 2 => 'Rec. 470BG', + }, + }, + 30 => { + Name => 'NominalVideoBitrate', + Format => 'int32u', + ValueConv => '$val >> 8', + PrintConv => { + 0 => 'Unspecified', + OTHER => \&Image::ExifTool::ConvertBitrate, + }, + }, + 33 => { + Name => 'Quality', + ValueConv => '$val >> 2', + }, + 34 => { + Name => 'PixelFormat', + ValueConv => '($val >> 3) & 0x3', + PrintConv => { + 0 => '4:2:0', + 2 => '4:2:2', + 3 => '4:4:4', + }, + }, +); + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Theora - Read Theora video meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from Theora video streams. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.theora.org/doc/Theora.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Theora Tags>, +L<Image::ExifTool::TagNames/Ogg Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Torrent.pm b/lib/Image/ExifTool/Torrent.pm new file mode 100644 index 0000000..f79d89f --- /dev/null +++ b/lib/Image/ExifTool/Torrent.pm @@ -0,0 +1,332 @@ +#------------------------------------------------------------------------------ +# File: Torrent.pm +# +# Description: Read information from BitTorrent file +# +# Revisions: 2013/08/27 - P. Harvey Created +# +# References: 1) https://wiki.theory.org/BitTorrentSpecification +#------------------------------------------------------------------------------ + +package Image::ExifTool::Torrent; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::XMP; + +$VERSION = '1.05'; + +sub ReadBencode($$$); +sub ExtractTags($$$;$$@); + +# tags extracted from BitTorrent files +%Image::ExifTool::Torrent::Main = ( + GROUPS => { 2 => 'Document' }, + NOTES => q{ + Below are tags commonly found in BitTorrent files. As well as these tags, + any other existing tags will be extracted. For convenience, list items are + expanded into individual tags with an index in the tag name, but only the + tags with index "1" are listed in the tables below. See + L<https://wiki.theory.org/BitTorrentSpecification> for the BitTorrent + specification. + }, + 'announce' => { }, + 'announce-list' => { Name => 'AnnounceList1' }, + 'comment' => { }, + 'created by' => { Name => 'Creator' }, # software used to create the torrent + 'creation date' => { + Name => 'CreateDate', + Groups => { 2 => 'Time' }, + ValueConv => 'ConvertUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + 'encoding' => { }, + 'info' => { + SubDirectory => { TagTable => 'Image::ExifTool::Torrent::Info' }, + Notes => 'extracted as a structure with the Struct option', + }, + 'url-list' => { Name => 'URLList1' }, +); + +%Image::ExifTool::Torrent::Info = ( + GROUPS => { 2 => 'Document' }, + 'file-duration' => { Name => 'File1Duration' }, + 'file-media' => { Name => 'File1Media' }, + 'files' => { SubDirectory => { TagTable => 'Image::ExifTool::Torrent::Files' } }, + 'length' => { }, + 'md5sum' => { Name => 'MD5Sum' }, + 'name' => { }, + 'name.utf-8' => { Name => 'NameUTF-8' }, + 'piece length' => { Name => 'PieceLength' }, + 'pieces' => { + Name => 'Pieces', + Notes => 'concatenation of 20-byte SHA-1 digests for each piece', + }, + 'private' => { }, + 'profiles' => { SubDirectory => { TagTable => 'Image::ExifTool::Torrent::Profiles' } }, +); + +%Image::ExifTool::Torrent::Profiles = ( + GROUPS => { 2 => 'Document' }, + 'width' => { Name => 'Profile1Width' }, + 'height' => { Name => 'Profile1Height' }, + 'acodec' => { Name => 'Profile1AudioCodec' }, + 'vcodec' => { Name => 'Profile1VideoCodec' }, +); + +%Image::ExifTool::Torrent::Files = ( + GROUPS => { 2 => 'Document' }, + 'length' => { Name => 'File1Length', PrintConv => 'ConvertFileSize($val)' }, + 'md5sum' => { Name => 'File1MD5Sum' }, + 'path' => { Name => 'File1Path', JoinPath => 1 }, + 'path.utf-8' => { Name => 'File1PathUTF-8', JoinPath => 1 }, +); + +#------------------------------------------------------------------------------ +# Read 64kB more data into buffer +# Inputs: 0) RAF ref, 1) buffer ref +# Returns: number of bytes read +# Notes: Sets BencodeEOF element of RAF on end of file +sub ReadMore($$) +{ + my ($raf, $dataPt) = @_; + my $buf2; + my $n = $raf->Read($buf2, 65536); + $$raf{BencodeEOF} = 1 if $n != 65536; + $$dataPt = substr($$dataPt, pos($$dataPt)) . $buf2 if $n; + return $n; +} + +#------------------------------------------------------------------------------ +# Read bencoded value +# Inputs: 0) ExifTool ref, 1) input file, 2) buffer (pos must be set to current position) +# Returns: HASH ref, ARRAY ref, SCALAR ref, SCALAR, or undef on error or end of data +# Notes: Sets BencodeError element of RAF on any error +sub ReadBencode($$$) +{ + my ($et, $raf, $dataPt) = @_; + + # read more if necessary (keep a minimum of 64 bytes in the buffer) + my $pos = pos($$dataPt); + return undef unless defined $pos; + my $remaining = length($$dataPt) - $pos; + ReadMore($raf, $dataPt) if $remaining < 64 and not $$raf{BencodeEOF}; + + # read next token + $$dataPt =~ /(.)/sg or return undef; + + my $val; + my $tok = $1; + if ($tok eq 'i') { # integer + $$dataPt =~ /\G(-?\d+)e/g or return $val; + $val = $1; + } elsif ($tok eq 'd') { # dictionary + $val = { }; + for (;;) { + my $k = ReadBencode($et, $raf, $dataPt); + last unless defined $k; + # the key must be a byte string + if (ref $k) { + ref $k ne 'SCALAR' and $$raf{BencodeError} = 'Bad dictionary key', last; + $k = $$k; + } + my $v = ReadBencode($et, $raf, $dataPt); + last unless defined $v; + $$val{$k} = $v; + } + } elsif ($tok eq 'l') { # list + $val = [ ]; + for (;;) { + my $v = ReadBencode($et, $raf, $dataPt); + last unless defined $v; + push @$val, $v; + } + } elsif ($tok eq 'e') { # end of dictionary or list + # return undef (no error) + } elsif ($tok =~ /^\d$/ and $$dataPt =~ /\G(\d*):/g) { # byte string + my $len = $tok . $1; + my $more = $len - (length($$dataPt) - pos($$dataPt)); + my $value; + if ($more <= 0) { + $value = substr($$dataPt,pos($$dataPt),$len); + pos($$dataPt) = pos($$dataPt) + $len; + } elsif ($more > 10000000) { + # just skip over really long values + $val = \ "(Binary data $len bytes)" if $raf->Seek($more, 1); + } else { + # need to read more from file + my $buff; + my $n = $raf->Read($buff, $more); + if ($n == $more) { + $value = substr($$dataPt,pos($$dataPt)) . $buff; + $$dataPt = ''; + pos($$dataPt) = 0; + } + } + if (defined $value) { + # return as binary data unless it is a reasonable-length ASCII string + if (length($value) > 256) { + $val = \$value; + } elsif ($value =~ /[^\t\x20-\x7e]/) { + if (Image::ExifTool::XMP::IsUTF8(\$value) >= 0) { + $val = $et->Decode($value, 'UTF8'); + } else { + $val = \$value; + } + } else { + $val = $value; + } + } elsif (not defined $val) { + $$raf{BencodeError} = 'Truncated byte string'; + } + } else { + $$raf{BencodeError} = 'Bad format'; + } + return $val; +} + +#------------------------------------------------------------------------------ +# Extract tags from dictionary hash +# Inputs: 0) ExifTool ref, 1) dictionary hash reference, 2) tag table ref, +# 3) parent hash ID, 4) parent hash name, 5-N) list indices +# Returns: number of tags extracted +sub ExtractTags($$$;$$@) +{ + my ($et, $hashPtr, $tagTablePtr, $baseID, $baseName, @index) = @_; + my $count = 0; + my $tag; + foreach $tag (sort keys %$hashPtr) { + my $val = $$hashPtr{$tag}; + my ($i, $j, @more); + for (; defined $val; $val = shift @more) { + my $id = defined $baseID ? "$baseID/$tag" : $tag; + unless ($$tagTablePtr{$id}) { + my $name = ucfirst $tag; + # capitalize all words in tag name and remove illegal characters + $name =~ s/[^-_a-zA-Z0-9]+(.?)/\U$1/g; + $name = "Tag$name" if length($name) < 2 or $name !~ /^[A-Z]/; + $name = $baseName . $name if defined $baseName; # add base name if necessary + AddTagToTable($tagTablePtr, $id, { Name => $name }); + $et->VPrint(0, " [adding $id '${name}']\n"); + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $id) or next; + if (ref $val eq 'ARRAY') { + if ($$tagInfo{JoinPath}) { + $val = join '/', map { ref $_ ? '(Binary data)' : $_ } @$val; + } else { + push @more, @$val; + next if ref $more[0] eq 'ARRAY'; # continue expanding nested lists + $val = shift @more; + $i or $i = 0, push(@index, $i); + } + } + $index[-1] = ++$i if defined $i; + if (@index) { + $id .= join '_', @index; # add instance number(s) to tag ID + unless ($$tagTablePtr{$id}) { + my $name = $$tagInfo{Name}; + # embed indices at position of '1' in tag name + my $n = ($name =~ tr/1/#/); + for ($j=0; $j<$n; ++$j) { + my $idx = $index[$j] || ''; + $name =~ s/#/$idx/; + } + # put remaining indices at end of tag name + for (; $j<@index; ++$j) { + $name .= '_' if $name =~ /\d$/; + $name .= $index[$j]; + } + AddTagToTable($tagTablePtr, $id, { %$tagInfo, Name => $name }); + } + $tagInfo = $et->GetTagInfo($tagTablePtr, $id) or next; + } + if (ref $val eq 'HASH') { + if ($et->Options('Struct') and $tagInfo and $$tagInfo{Name} eq 'Info') { + $et->FoundTag($tagInfo, $val); + ++$count; + next; + } + # extract tags from this dictionary + my ($table, $rootID, $rootName); + if ($$tagInfo{SubDirectory}) { + $table = GetTagTable($$tagInfo{SubDirectory}{TagTable}); + } else { + $table = $tagTablePtr; + # use hash ID and Name as base for contained tags to avoid conflicts + $rootID = $id; + $rootName = $$tagInfo{Name}; + } + $count += ExtractTags($et, $val, $table, $rootID, $rootName, @index); + } else { + # handle this simple tag value + $et->HandleTag($tagTablePtr, $id, $val); + ++$count; + } + } + pop @index if defined $i; + } + return $count; +} + +#------------------------------------------------------------------------------ +# Process BitTorrent file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference (with RAF set) +# Returns: 1 on success, 0 if this wasn't a valid BitTorrent file +sub ProcessTorrent($$) +{ + my ($et, $dirInfo) = @_; + my $success = 0; + my $raf = $$dirInfo{RAF}; + my $buff = ''; + pos($buff) = 0; + my $dict = ReadBencode($et, $raf, \$buff); + my $err = $$raf{BencodeError}; + $et->Warn("Bencode error: $err") if $err; + if (ref $dict eq 'HASH' and ($$dict{announce} or $$dict{'created by'})) { + $et->SetFileType(); + my $tagTablePtr = GetTagTable('Image::ExifTool::Torrent::Main'); + ExtractTags($et, $dict, $tagTablePtr) and $success = 1; + } + return $success; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Torrent - Read information from BitTorrent file + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read +bencoded information from BitTorrent files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://wiki.theory.org/BitTorrentSpecification> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Torrent Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Unknown.pm b/lib/Image/ExifTool/Unknown.pm new file mode 100644 index 0000000..51370b7 --- /dev/null +++ b/lib/Image/ExifTool/Unknown.pm @@ -0,0 +1,66 @@ +#------------------------------------------------------------------------------ +# File: Unknown.pm +# +# Description: Unknown EXIF maker notes tags +# +# Revisions: 04/07/2004 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::Unknown; + +use strict; +use vars qw($VERSION); +use Image::ExifTool::Exif; + +$VERSION = '1.13'; + +# Unknown maker notes +%Image::ExifTool::Unknown::Main = ( + WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, + CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, + GROUPS => { 0 => 'MakerNotes', 1 => 'MakerUnknown', 2 => 'Camera' }, + + # this seems to be a common fixture, so look for it in unknown maker notes + 0x0e00 => { + Name => 'PrintIM', + Description => 'Print Image Matching', + SubDirectory => { + TagTable => 'Image::ExifTool::PrintIM::Main', + }, + }, +); + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Unknown - Unknown EXIF maker notes tags + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +Image::ExifTool has definitions for the maker notes from many manufacturers, +however information can sometimes be extracted from unknown manufacturers if +the maker notes are in standard IFD format. This module contains the +definitions necessary for Image::ExifTool to read the maker notes from +unknown manufacturers. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Unknown Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/VCard.pm b/lib/Image/ExifTool/VCard.pm new file mode 100644 index 0000000..55b9bd7 --- /dev/null +++ b/lib/Image/ExifTool/VCard.pm @@ -0,0 +1,443 @@ +#------------------------------------------------------------------------------ +# File: VCard.pm +# +# Description: Read vCard and iCalendar meta information +# +# Revisions: 2015/04/05 - P. Harvey Created +# 2015/05/02 - PH Added iCalendar support +# +# References: 1) http://en.m.wikipedia.org/wiki/VCard +# 2) http://tools.ietf.org/html/rfc6350 +# 3) http://tools.ietf.org/html/rfc5545 +#------------------------------------------------------------------------------ + +package Image::ExifTool::VCard; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.06'; + +my %unescapeVCard = ( '\\'=>'\\', ','=>',', 'n'=>"\n", 'N'=>"\n" ); + +# lookup for iCalendar components (used to generate family 1 group names if top level) +my %isComponent = ( Event=>1, Todo=>1, Journal=>1, Freebusy=>1, Timezone=>1, Alarm=>1 ); + +my %timeInfo = ( + # convert common date/time formats to EXIF style + ValueConv => q{ + $val =~ s/(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(Z?)/$1:$2:$3 $4:$5:$6$7/g; + $val =~ s/(\d{4})(\d{2})(\d{2})/$1:$2:$3/g; + $val =~ s/(\d{4})-(\d{2})-(\d{2})/$1:$2:$3/g; + return $val; + }, + PrintConv => '$self->ConvertDateTime($val)', +); + +# vCard tags (ref 1/2/PH) +# Note: The case of all tag ID's is normalized to lowercase with uppercase first letter +%Image::ExifTool::VCard::Main = ( + GROUPS => { 2 => 'Document' }, + VARS => { NO_LOOKUP => 1 }, # omit tags from lookup + NOTES => q{ + This table lists common vCard tags, but ExifTool will also extract any other + vCard tags found. Tag names may have "Pref" added to indicate the preferred + instance of a vCard property, and other "TYPE" parameters may also added to + the tag name. VCF files may contain multiple vCard entries which are + distinguished by the ExifTool family 3 group name (document number). See + L<http://tools.ietf.org/html/rfc6350> for the vCard 4.0 specification. + }, + Version => { Name => 'VCardVersion', Description => 'VCard Version' }, + Fn => { Name => 'FormattedName', Groups => { 2 => 'Author' } }, + N => { Name => 'Name', Groups => { 2 => 'Author' } }, + Bday => { Name => 'Birthday', Groups => { 2 => 'Time' }, %timeInfo }, + Tz => { Name => 'TimeZone', Groups => { 2 => 'Time' } }, + Adr => { Name => 'Address', Groups => { 2 => 'Location' } }, + Geo => { + Name => 'Geolocation', + Groups => { 2 => 'Location' }, + # when used as a parameter, VCard 4.0 adds a "geo:" prefix that we need to remove + ValueConv => '$val =~ s/^geo://; $val', + }, + Anniversary => { }, + Email => { }, + Gender => { }, + Impp => 'IMPP', + Lang => 'Language', + Logo => { }, + Nickname => { }, + Note => { }, + Org => 'Organization', + Photo => { Groups => { 2 => 'Preview' } }, + Prodid => 'Software', + Rev => 'Revision', + Sound => { }, + Tel => 'Telephone', + Title => 'JobTitle', + Uid => 'UID', + Url => 'URL', + 'X-ablabel' => { Name => 'ABLabel', PrintConv => '$val =~ s/^_\$!<(.*)>!\$_$/$1/; $val' }, + 'X-abdate' => { Name => 'ABDate', Groups => { 2 => 'Time' }, %timeInfo }, + 'X-aim' => 'AIM', + 'X-icq' => 'ICQ', + 'X-abuid' => 'AB_UID', + 'X-abrelatednames' => 'ABRelatedNames', + 'X-socialprofile' => 'SocialProfile', +); + +%Image::ExifTool::VCard::VCalendar = ( + GROUPS => { 1 => 'VCalendar', 2 => 'Document' }, + VARS => { + NO_LOOKUP => 1, # omit tags from lookup + LONG_TAGS => 6, # some X-microsoft tags have unavoidably long ID's + }, + NOTES => q{ + The VCard module is also used to process iCalendar ICS files since they use + a format similar to vCard. The following table lists standard iCalendar + tags, but any existing tags will be extracted. Top-level iCalendar + components (eg. Event, Todo, Timezone, etc.) are used for the family 1 group + names, and embedded components (eg. Alarm) are added as a prefix to the tag + name. See L<http://tools.ietf.org/html/rfc5545> for the official iCalendar + 2.0 specification. + }, + Version => { Name => 'VCalendarVersion', Description => 'VCalendar Version' }, + Calscale => 'CalendarScale', + Method => { }, + Prodid => 'Software', + Attach => 'Attachment', + Categories => { }, + Class => 'Classification', + Comment => { }, + Description => { }, + Geo => { + Name => 'Geolocation', + Groups => { 2 => 'Location' }, + ValueConv => '$val =~ s/^geo://; $val', + }, + Location => { Name => 'Location', Groups => { 2 => 'Location' } }, + 'Percent-complete' => 'PercentComplete', + Priority => { }, + Resources => { }, + Status => { }, + Summary => { }, + Completed => { Name => 'DateTimeCompleted', Groups => { 2 => 'Time' }, %timeInfo }, + Dtend => { Name => 'DateTimeEnd', Groups => { 2 => 'Time' }, %timeInfo }, + Due => { Name => 'DateTimeDue', Groups => { 2 => 'Time' }, %timeInfo }, + Dtstart => { Name => 'DateTimeStart', Groups => { 2 => 'Time' }, %timeInfo }, + Duration => { }, + Freebusy => 'FreeBusyTime', + Transp => 'TimeTransparency', + Tzid => { Name => 'TimezoneID', Groups => { 2 => 'Time' } }, + Tzname => { Name => 'TimezoneName', Groups => { 2 => 'Time' } }, + Tzoffsetfrom=> { Name => 'TimezoneOffsetFrom', Groups => { 2 => 'Time' } }, + Tzoffsetto => { Name => 'TimezoneOffsetTo', Groups => { 2 => 'Time' } }, + Tzurl => { Name => 'TimeZoneURL', Groups => { 2 => 'Time' } }, + Attendee => { }, + Contact => { }, + Organizer => { }, + 'Recurrence-id' => 'RecurrenceID', + 'Related-to' => 'RelatedTo', + Url => 'URL', + Uid => 'UID', + Exdate => { Name => 'ExceptionDateTimes', Groups => { 2 => 'Time' }, %timeInfo }, + Rdate => { Name => 'RecurrenceDateTimes', Groups => { 2 => 'Time' }, %timeInfo }, + Rrule => { Name => 'RecurrenceRule', Groups => { 2 => 'Time' } }, + Action => { }, + Repeat => { }, + Trigger => { }, + Created => { Name => 'DateCreated', Groups => { 2 => 'Time' }, %timeInfo }, + Dtstamp => { Name => 'DateTimeStamp', Groups => { 2 => 'Time' }, %timeInfo }, + 'Last-modified' => { Name => 'ModifyDate', Groups => { 2 => 'Time' }, %timeInfo }, + Sequence => 'SequenceNumber', + 'Request-status' => 'RequestStatus', + Acknowledged=> { Name => 'Acknowledged', Groups => { 2 => 'Time' }, %timeInfo }, +# +# Observed X-tags (not a comprehensive list): +# + 'X-apple-calendar-color'=> 'CalendarColor', + 'X-apple-default-alarm' => 'DefaultAlarm', + 'X-apple-local-default-alarm' => 'LocalDefaultAlarm', + 'X-microsoft-cdo-appt-sequence' => 'AppointmentSequence', + 'X-microsoft-cdo-ownerapptid' => 'OwnerAppointmentID', + 'X-microsoft-cdo-busystatus' => 'BusyStatus', + 'X-microsoft-cdo-intendedstatus' => 'IntendedBusyStatus', + 'X-microsoft-cdo-alldayevent' => 'AllDayEvent', + 'X-microsoft-cdo-importance' => { + Name => 'Importance', + PrintConv => { + 0 => 'Low', + 1 => 'Normal', + 2 => 'High', + }, + }, + 'X-microsoft-cdo-insttype' => { + Name => 'InstanceType', + PrintConv => { + 0 => 'Non-recurring Appointment', + 1 => 'Recurring Appointment', + 2 => 'Single Instance of Recurring Appointment', + 3 => 'Exception to Recurring Appointment', + }, + }, + 'X-microsoft-donotforwardmeeting' => 'DoNotForwardMeeting', + 'X-microsoft-disallow-counter' => 'DisallowCounterProposal', + 'X-microsoft-locations' => { Name => 'MeetingLocations', Groups => { 2 => 'Location' } }, + 'X-wr-caldesc' => 'CalendarDescription', + 'X-wr-calname' => 'CalendarName', + 'X-wr-relcalid' => 'CalendarID', + 'X-wr-timezone' => { Name => 'TimeZone2', Groups => { 2 => 'Time' } }, + 'X-wr-alarmuid' => 'AlarmUID', +); + +#------------------------------------------------------------------------------ +# Get vCard tag, creating if necessary +# Inputs: 0) ExifTool ref, 1) tag table ref, 2) tag ID, 3) tag Name, +# 4) source tagInfo ref, 5) lang code +# Returns: tagInfo ref +sub GetVCardTag($$$$;$$) +{ + my ($et, $tagTablePtr, $tag, $name, $srcInfo, $langCode) = @_; + my $tagInfo = $$tagTablePtr{$tag}; + unless ($tagInfo) { + if ($srcInfo) { + $tagInfo = { %$srcInfo }; + } else { + $tagInfo = { }; + $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n"); + } + $$tagInfo{Name} = $name; + delete $$tagInfo{Description}; # create new description + AddTagToTable($tagTablePtr, $tag, $tagInfo); + } + # handle alternate languages (the "language" parameter) + $tagInfo = Image::ExifTool::GetLangInfo($tagInfo, $langCode) if $langCode; + return $tagInfo; +} + +#------------------------------------------------------------------------------ +# Decode vCard text +# Inputs: 0) ExifTool ref, 1) vCard text, 2) encoding +# Returns: decoded text (or array ref for a list of values) +sub DecodeVCardText($$;$) +{ + my ($et, $val, $enc) = @_; + $enc = defined($enc) ? lc $enc : ''; + if ($enc eq 'b' or $enc eq 'base64') { + require Image::ExifTool::XMP; + $val = Image::ExifTool::XMP::DecodeBase64($val); + } else { + if ($enc eq 'quoted-printable') { + # convert "=HH" hex codes to characters + $val =~ s/=([0-9a-f]{2})/chr(hex($1))/ige; + } + $val = $et->Decode($val, 'UTF8'); # convert from UTF-8 + # convert unescaped commas to nulls to separate list items + $val =~ s/(\\.)|(,)/$1 || "\0"/sge; + # unescape necessary characters in value + $val =~ s/\\(.)/$unescapeVCard{$1}||$1/sge; + # split into list if necessary + my @vals = split /\0/, $val; + $val = \@vals if @vals > 1; + } + return $val; +} + +#------------------------------------------------------------------------------ +# Read information in a vCard file +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid vCard file +sub ProcessVCard($$) +{ + local $_; + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $val, $ok, $component, %compNum, @count); + + return 0 unless $raf->Read($buff, 24) and $raf->Seek(0,0) and $buff=~/^BEGIN:(VCARD|VCALENDAR)\r\n/i; + my ($type, $lbl, $tbl, $ext) = uc($1) eq 'VCARD' ? qw(VCard vCard Main VCF) : qw(ICS iCalendar VCalendar ICS); + $et->SetFileType($type, undef, $ext); + return 1 if $$et{OPTIONS}{FastScan} and $$et{OPTIONS}{FastScan} == 3; + local $/ = "\r\n"; + my $tagTablePtr = GetTagTable("Image::ExifTool::VCard::$tbl"); + my $more = $raf->ReadLine($buff); # read first line + chomp $buff if $more; + while ($more) { + # retrieve previous line from $buff + $val = $buff if defined $buff; + # read ahead to next line to see if is a continuation + $more = $raf->ReadLine($buff); + if ($more) { + chomp $buff; + # add continuation line if necessary + $buff =~ s/^[ \t]// and $val .= $buff, undef($buff), next; + } + if ($val =~ /^(BEGIN|END):(V?)(\w+)$/i) { + my ($begin, $v, $what) = ((lc($1) eq 'begin' ? 1 : 0), $2, ucfirst lc $3); + if ($what eq 'Card' or $what eq 'Calendar') { + if ($begin) { + @count = ( { } ); # reset group counters + } else { + $ok = 1; # ok if we read at least on full VCARD or VCALENDAR + } + next; + } + # absorb top-level component into family 1 group name + if ($isComponent{$what}) { + if ($begin) { + unless ($component) { + # begin a new top-level component + @count = ( { } ); + $component = $what; + $compNum{$component} = ($compNum{$component} || 0) + 1; + next; + } + } elsif ($component and $component eq $what) { + # this top-level component has ended + undef $component; + next; + } + } + # keep count of each component at this level + if ($begin) { + $count[-1]{$what} = ($count[-1]{$what} || 0) + 1 if $v; + push @count, { obj => $what }; + } elsif (@count > 1) { + pop @count; + } + next; + } elsif ($ok) { + $ok = 0; + $$et{DOC_NUM} = ++$$et{DOC_COUNT}; # read next card as a new document + } + unless ($val =~ s/^([-A-Za-z0-9.]+)//) { + $et->WarnOnce("Unrecognized line in $lbl file"); + next; + } + my $tag = $1; + # set group if it exists + if ($tag =~ s/^([-A-Za-z0-9]+)\.//) { + $$et{SET_GROUP1} = ucfirst lc $1; + } elsif ($component) { + $$et{SET_GROUP1} = $component . $compNum{$component}; + } else { + delete $$et{SET_GROUP1}; + } + my ($name, %param, $p); + # vCard tag ID's are case-insensitive, so normalize to lowercase with + # an uppercase first letter for use as a tag name + $name = ucfirst $tag if $tag =~ /[a-z]/; # preserve mixed case in name if it exists + $tag = ucfirst lc $tag; + # get source tagInfo reference + my $srcInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($srcInfo) { + $name = $$srcInfo{Name}; # use our name + } else { + $name or $name = $tag; + # remove leading "X-" from name if it exists + $name =~ s/^X-// and $name = ucfirst $name; + } + # add object name(s) to tag if necessary + if (@count > 1) { + my $i; + for ($i=$#count-1; $i>=0; --$i) { + my $pre = $count[$i-1]{obj}; # use containing object name as tag prefix + my $c = $count[$i]{$pre}; # add index for object number + $c = '' unless defined $c; + $tag = $pre . $c . $tag; + $name = $pre . $c . $name; + } + } + # parse parameters + while ($val =~ s/^;([-A-Za-z0-9]*)(=?)//) { + $p = ucfirst lc $1; + # convert old vCard 2.x parameters to the new "TYPE=" format + $2 or $val = $1 . $val, $p = 'Type'; + # read parameter value + for (;;) { + last unless $val =~ s/^"([^"]*)",?// or $val =~ s/^([^";:,]+,?)//; + my $v = $p eq 'Type' ? ucfirst lc $1 : $1; + $param{$p} = defined($param{$p}) ? $param{$p} . $v : $v; + } + if (defined $param{$p}) { + $param{$p} =~ s/\\(.)/$unescapeVCard{$1}||$1/sge; + } else { + $param{$p} = ''; + } + } + $val =~ s/^:// or $et->WarnOnce("Invalid line in $lbl file"), next; + # add 'Type' parameter to id and name if it exists + $param{Type} and $tag .= $param{Type}, $name .= $param{Type}; + # convert base64-encoded data + if ($val =~ s{^data:(\w+)/(\w+);base64,}{}) { + my $xtra = ucfirst(lc $1) . ucfirst(lc $2); + $tag .= $xtra; + $name .= $xtra; + $param{Encoding} = 'base64'; + } + $val = DecodeVCardText($et, $val, $param{Encoding}); + my $tagInfo = GetVCardTag($et, $tagTablePtr, $tag, $name, $srcInfo, $param{Language}); + $et->HandleTag($tagTablePtr, $tag, $val, TagInfo => $tagInfo); + # handle some other parameters that we care about (ignore the rest for now) + foreach $p (qw(Geo Label Tzid)) { + next unless defined $param{$p}; + # use tag attributes from our table if it exists + my $srcTag2 = $et->GetTagInfo($tagTablePtr, $p); + my $pn = $srcTag2 ? $$srcTag2{Name} : $p; + $val = DecodeVCardText($et, $param{$p}); + # add parameter to tag ID and name + my ($tg, $nm) = ($tag . $p, $name . $pn); + $tagInfo = GetVCardTag($et, $tagTablePtr, $tg, $nm, $srcTag2, $param{Language}); + $et->HandleTag($tagTablePtr, $tg, $val, TagInfo => $tagInfo); + } + } + delete $$et{SET_GROUP1}; + delete $$et{DOC_NUM}; + $ok or $et->Warn("Missing $lbl end"); + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::VCard - Read vCard and iCalendar meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read meta +information from vCard VCF and iCalendar ICS files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://en.m.wikipedia.org/wiki/VCard> + +=item L<http://tools.ietf.org/html/rfc6350> + +=item L<http://tools.ietf.org/html/rfc5545> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/VCard Tags>, +L<Image::ExifTool::TagNames/VCard VCalendar Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/Validate.pm b/lib/Image/ExifTool/Validate.pm new file mode 100644 index 0000000..0f7f4b5 --- /dev/null +++ b/lib/Image/ExifTool/Validate.pm @@ -0,0 +1,672 @@ +#------------------------------------------------------------------------------ +# File: Validate.pm +# +# Description: Additional metadata validation +# +# Created: 2017/01/18 - P. Harvey +# +# Notes: My apologies for the convoluted logic contained herein, but it +# is done this way to retro-fit the Validate feature into the +# existing ExifTool code while reducing the possibility of +# introducing bugs or slowing down processing when this feature +# is not used. +#------------------------------------------------------------------------------ + +package Image::ExifTool::Validate; + +use strict; +use vars qw($VERSION %exifSpec); + +$VERSION = '1.18'; + +use Image::ExifTool qw(:Utils); +use Image::ExifTool::Exif; + +# EXIF table tag ID's which are part of the EXIF 2.32 specification +# (with ExifVersion numbers for tags where I can determine the version) +# (also used by BuildTagLookup to add underlines in HTML version of EXIF Tag Table) +%exifSpec = ( + 0x1 => 210, + 0x100 => 1, 0x8298 => 1, 0x9207 => 1, 0xa217 => 1, + 0x101 => 1, 0x829a => 1, 0x9208 => 1, 0xa300 => 1, + 0x102 => 1, 0x829d => 1, 0x9209 => 1, 0xa301 => 1, + 0x103 => 1, 0x8769 => 1, 0x920a => 1, 0xa302 => 1, + 0x106 => 1, 0x8822 => 1, 0x9214 => 220, 0xa401 => 220, + 0x10e => 1, 0x8824 => 1, 0x927c => 1, 0xa402 => 220, + 0x10f => 1, 0x8825 => 200, 0x9286 => 1, 0xa403 => 220, + 0x110 => 1, 0x8827 => 1, 0x9290 => 1, 0xa404 => 220, + 0x111 => 1, 0x8828 => 1, 0x9291 => 1, 0xa405 => 220, + 0x112 => 1, 0x8830 => 230, 0x9292 => 1, 0xa406 => 220, + 0x115 => 1, 0x8831 => 230, 0x9400 => 231, 0xa407 => 220, + 0x116 => 1, 0x8832 => 230, 0x9401 => 231, 0xa408 => 220, + 0x117 => 1, 0x8833 => 230, 0x9402 => 231, 0xa409 => 220, + 0x11a => 1, 0x8834 => 230, 0x9403 => 231, 0xa40a => 220, + 0x11b => 1, 0x8835 => 230, 0x9404 => 231, 0xa40b => 220, + 0x11c => 1, 0x9000 => 1, 0x9405 => 231, 0xa40c => 220, + 0x128 => 1, 0x9003 => 1, 0xa000 => 1, 0xa460 => 232, + 0x12d => 1, 0x9004 => 1, 0xa001 => 1, 0xa461 => 232, + 0x131 => 1, 0x9010 => 231, 0xa002 => 1, 0xa462 => 232, + 0x132 => 1, 0x9011 => 231, 0xa003 => 1, 0xa420 => 220, + 0x13b => 1, 0x9012 => 231, 0xa004 => 1, 0xa430 => 230, + 0x13e => 1, 0x9101 => 1, 0xa005 => 210, 0xa431 => 230, + 0x13f => 1, 0x9102 => 1, 0xa20b => 1, 0xa432 => 230, + 0x201 => 1, 0x9201 => 1, 0xa20c => 1, 0xa433 => 230, + 0x202 => 1, 0x9202 => 1, 0xa20e => 1, 0xa434 => 230, + 0x211 => 1, 0x9203 => 1, 0xa20f => 1, 0xa435 => 230, + 0x212 => 1, 0x9204 => 1, 0xa210 => 1, 0xa500 => 221, + 0x213 => 1, 0x9205 => 1, 0xa214 => 1, + 0x214 => 1, 0x9206 => 1, 0xa215 => 1, +); + +# GPSVersionID numbers when each tag was introduced +my %gpsVer = ( + 0x01 => 2000, 0x09 => 2000, 0x11 => 2000, 0x19 => 2000, + 0x02 => 2000, 0x0a => 2000, 0x12 => 2000, 0x1a => 2000, + 0x03 => 2000, 0x0b => 2000, 0x13 => 2000, 0x1b => 2200, + 0x04 => 2000, 0x0c => 2000, 0x14 => 2000, 0x1c => 2200, + 0x05 => 2000, 0x0d => 2000, 0x15 => 2000, 0x1d => 2200, + 0x06 => 2000, 0x0e => 2000, 0x16 => 2000, 0x1e => 2200, + 0x07 => 2000, 0x0f => 2000, 0x17 => 2000, 0x1f => 2300, + 0x08 => 2000, 0x10 => 2000, 0x18 => 2000, +); + +# lookup to check version numbers +my %verCheck = ( + ExifIFD => { ExifVersion => \%exifSpec }, + InteropIFD => { ExifVersion => \%exifSpec }, + GPS => { GPSVersionID => \%gpsVer }, +); + +# tags standard in various RAW file formats +my %otherSpec = ( + CR2 => { 0xc5d8 => 1, 0xc5d9 => 1, 0xc5e0 => 1, 0xc640 => 1, 0xc6dc => 1, 0xc6dd => 1 }, + NEF => { 0x9216 => 1, 0x9217 => 1 }, + DNG => { 0x882a => 1, 0x9211 => 1, 0x9216 => 1 }, + ARW => { 0x7000 => 1, 0x7001 => 1, 0x7010 => 1, 0x7011 => 1, 0x7020 => 1, + 0x7031 => 1, 0x7032 => 1, 0x7034 => 1, 0x7035 => 1, 0x7036 => 1, 0x7037 => 1, + 0x7310 => 1, 0x7313 => 1, 0x7316 => 1, 0x74c7 => 1, 0x74c8 => 1, 0xa500 => 1 }, + RW2 => { All => 1 }, # ignore all unknown tags in RW2 + RWL => { All => 1 }, + RAF => { All => 1 }, # (temporary) + DCR => { All => 1 }, + KDC => { All => 1 }, + JXR => { All => 1 }, + SRW => { 0xa010 => 1, 0xa011 => 1, 0xa101 => 1, 0xa102 => 1 }, + NRW => { 0x9216 => 1, 0x9217 => 1 }, + X3F => { 0xa500 => 1 }, +); + +# standard format for tags (not necessary for exifSpec or GPS tags where Writable is defined) +my %stdFormat = ( + ExifIFD => { + 0xa002 => 'int(16|32)u', + 0xa003 => 'int(16|32)u', + }, + InteropIFD => { + 0x01 => 'string', + 0x02 => 'undef', + 0x1000 => 'string', + 0x1001 => 'int(16|32)u', + 0x1002 => 'int(16|32)u', + }, + IFD => { + # TIFF, EXIF, XMP, IPTC, ICC_Profile and PrintIM standard tags: + 0xfe => 'int32u', 0x11f => 'rational64u', 0x14a => 'int32u', 0x205 => 'int16u', + 0xff => 'int16u', 0x120 => 'int32u', 0x14c => 'int16u', 0x206 => 'int16u', + 0x100 => 'int(16|32)u', 0x121 => 'int32u', 0x14d => 'string', 0x207 => 'int32u', + 0x101 => 'int(16|32)u', 0x122 => 'int16u', 0x14e => 'int16u', 0x208 => 'int32u', + 0x107 => 'int16u', 0x123 => 'int16u', 0x150 => 'int(8|16)u', 0x209 => 'int32u', + 0x108 => 'int16u', 0x124 => 'int32u', 0x151 => 'string', 0x211 => 'rational64u', + 0x109 => 'int16u', 0x125 => 'int32u', 0x152 => 'int16u', 0x212 => 'int16u', + 0x10a => 'int16u', 0x129 => 'int16u', 0x153 => 'int16u', 0x213 => 'int16u', + 0x10d => 'string', 0x13c => 'string', 0x154 => '.*', 0x214 => 'rational64u', + 0x111 => 'int(16|32)u', 0x13d => 'int16u', 0x155 => '.*', 0x2bc => 'int8u', + 0x116 => 'int(16|32)u', 0x140 => 'int16u', 0x156 => 'int16u', 0x828d => 'int16u', + 0x117 => 'int(16|32)u', 0x141 => 'int16u', 0x15b => 'undef', 0x828e => 'int8u', + 0x118 => 'int16u', 0x142 => 'int(16|32)u', 0x200 => 'int16u', 0x83bb => 'int32u', + 0x119 => 'int16u', 0x143 => 'int(16|32)u', 0x201 => 'int32u', 0x8649 => 'int8u', + 0x11d => 'string', 0x144 => 'int32u', 0x202 => 'int32u', 0x8773 => 'undef', + 0x11e => 'rational64u', 0x145 => 'int(16|32)u', 0x203 => 'int16u', 0xc4a5 => 'undef', + # Windows Explorer tags: + 0x9c9b => 'int8u', 0x9c9d => 'int8u', 0x9c9f => 'int8u', + 0x9c9c => 'int8u', 0x9c9e => 'int8u', + # GeoTiff tags: + 0x830e => 'double', 0x8482 => 'double', 0x87af => 'int16u', 0x87b1 => 'string', + 0x8480 => 'double', 0x85d8 => 'double', 0x87b0 => 'double', + # DNG tags: + 0xc615 => '(string|int8u)', 0xc6d3 => '', + 0xc61a => '(int16u|int32u|rational64u)', 0xc6f4 => '(string|int8u)', + 0xc61d => 'int(16|32)u', 0xc6f6 => '(string|int8u)', + 0xc61f => '(int16u|int32u|rational64u)', 0xc6f8 => '(string|int8u)', + 0xc620 => '(int16u|int32u|rational64u)', 0xc6fe => '(string|int8u)', + 0xc628 => '(int16u|rational64u)', 0xc716 => '(string|int8u)', + 0xc634 => 'int8u', 0xc717 => '(string|int8u)', + 0xc640 => '', 0xc718 => '(string|int8u)', + 0xc660 => '', 0xc71e => 'int(16|32)u', + 0xc68b => '(string|int8u)', 0xc71f => 'int(16|32)u', + 0xc68d => 'int(16|32)u', 0xc791 => 'int(16|32)u', + 0xc68e => 'int(16|32)u', 0xc792 => 'int(16|32)u', + 0xc6d2 => '', 0xc793 => '(int16u|int32u|rational64u)', + }, +); + +# generate lookup for any IFD +my %stdFormatAnyIFD = map { %{$stdFormat{$_}} } keys %stdFormat; + +# tag values to validate based on file type (from EXIF specification) +# - validation code may access $val and %val, and returns 1 on success, +# or error message otherwise ('' for a generic message) +# - entry is undef if tag must not exist (same as 'not defined $val' in code) +my %validValue = ( + JPEG => { + IFD0 => { + 0x100 => undef, # ImageWidth + 0x101 => undef, # ImageLength + 0x102 => undef, # BitsPerSample + 0x103 => undef, # Compression + 0x106 => undef, # PhotometricInterpretation + 0x111 => undef, # StripOffsets + 0x115 => undef, # SamplesPerPixel + 0x116 => undef, # RowsPerStrip + 0x117 => undef, # StripByteCounts + 0x11a => 'defined $val', # XResolution + 0x11b => 'defined $val', # YResolution + 0x11c => undef, # PlanarConfiguration + 0x128 => '$val =~ /^[123]$/', # ResolutionUnit + 0x201 => undef, # JPEGInterchangeFormat + 0x202 => undef, # JPEGInterchangeFormatLength + 0x212 => undef, # YCbCrSubSampling + 0x213 => '$val =~ /^[12]$/', # YCbCrPositioning + }, + IFD1 => { + 0x100 => undef, # ImageWidth + 0x101 => undef, # ImageLength + 0x102 => undef, # BitsPerSample + 0x103 => '$val == 6', # Compression + 0x106 => undef, # PhotometricInterpretation + 0x111 => undef, # StripOffsets + 0x115 => undef, # SamplesPerPixel + 0x116 => undef, # RowsPerStrip + 0x117 => undef, # StripByteCounts + 0x11a => 'defined $val', # XResolution + 0x11b => 'defined $val', # YResolution + 0x11c => undef, # PlanarConfiguration + 0x128 => '$val =~ /^[123]$/', # ResolutionUnit + 0x201 => 'defined $val', # JPEGInterchangeFormat + 0x202 => 'defined $val', # JPEGInterchangeFormatLength + 0x212 => undef, # YCbCrSubSampling + }, + ExifIFD => { + 0x9000 => 'defined $val and $val =~ /^\d{4}$/', # ExifVersion + 0x9101 => 'defined $val', # ComponentsConfiguration + 0xa000 => 'defined $val', # FlashpixVersion + 0xa001 => '$val == 1 or $val == 0xffff', # ColorSpace + 0xa002 => 'defined $val', # PixelXDimension + 0xa003 => 'defined $val', # PixelYDimension + }, + GPS => { + 0x00 => 'defined $val and $val =~ /^\d \d \d \d$/', # GPSVersionID + 0x1b => 'not defined $val or $val =~ /^(GPS|CELLID|WLAN|MANUAL)$/', # GPSProcessingMethod + }, + InteropIFD => { }, # (needed for ExifVersion check) + }, + TIFF => { + IFD0 => { + 0x100 => 'defined $val', # ImageWidth + 0x101 => 'defined $val', # ImageLength + # (default is 1) 0x102 => 'defined $val', # BitsPerSample + 0x103 => q{ + not defined $val or $val =~ /^(1|5|6|32773)$/ or + ($val == 2 and (not defined $val{0x102} or $val{0x102} == 1)); + }, # Compression + 0x106 => '$val =~ /^[0123]$/', # PhotometricInterpretation + 0x111 => 'defined $val', # StripOffsets + # SamplesPerPixel + 0x115 => q{ + my $pi = $val{0x106} || 0; + my $xtra = ($val{0x152} ? scalar(split ' ', $val{0x152}) : 0); + if ($pi == 2 or $pi == 6) { + return $val == 3 + $xtra; + } elsif ($pi == 5) { + return $val == 4 + $xtra; + } else { + return 1; + } + }, + 0x116 => 'defined $val', # RowsPerStrip + 0x117 => 'defined $val', # StripByteCounts + 0x11a => 'defined $val', # XResolution + 0x11b => 'defined $val', # YResolution + 0x128 => 'not defined $val or $val =~ /^[123]$/', # ResolutionUnit + # ColorMap (must be palette image with correct number of colors) + 0x140 => q{ + return '' if defined $val{0x106} and $val{0x106} == 3 xor defined $val; + return 1 if not defined $val or length($val) == 6 * 2 ** ($val{0x102} || 0); + return 'Invalid count for'; + }, + 0x201 => undef, # JPEGInterchangeFormat + 0x202 => undef, # JPEGInterchangeFormatLength + }, + ExifIFD => { + 0x9000 => 'defined $val', # ExifVersion + 0x9101 => undef, # ComponentsConfiguration + 0x9102 => undef, # CompressedBitsPerPixel + 0xa000 => 'defined $val', # FlashpixVersion + 0xa001 => '$val == 1 or $val == 0xffff', # ColorSpace + 0xa002 => undef, # PixelXDimension + 0xa003 => undef, # PixelYDimension + }, + InteropIFD => { + 0x0001 => undef, # InteropIndex + }, + GPS => { + 0x00 => 'defined $val and $val =~ /^\d \d \d \d$/', # GPSVersionID + 0x1b => '$val =~ /^(GPS|CELLID|WLAN|MANUAL)$/', # GPSProcessingMethod + }, + }, +); + +# validity ranges for constrained date/time fields +my @validDateField = ( + [ 'Month', 1, 12 ], + [ 'Day', 1, 31 ], + [ 'Hour', 0, 23 ], + [ 'Minutes', 0, 59 ], + [ 'Seconds', 0, 59 ], + [ 'TZhr', 0, 14 ], + [ 'TZmin', 0, 59 ], +); + +# "Validate" tag information +my %validateInfo = ( + Groups => { 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'ExifTool' }, + Notes => q{ + generated only if specifically requested. Requesting this tag automatically + enables the API L<Validate|../ExifTool.html#Validate> option, imposing + additional validation checks when extracting metadata. Returns the number + of errors, warnings and minor warnings encountered. Note that the Validate + feature focuses mainly on validation of EXIF/TIFF metadata + }, + PrintConv => { + '0 0 0' => 'OK', + OTHER => sub { + my @val = split ' ', shift; + my @rtn; + push @rtn, sprintf('%d Error%s', $val[0], $val[0] == 1 ? '' : 's') if $val[0]; + push @rtn, sprintf('%d Warning%s', $val[1], $val[1] == 1 ? '' : 's') if $val[1]; + if ($val[2]) { + my $str = ($val[1] == $val[2] ? ($val[1] == 1 ? '' : 'all ') : "$val[2] "); + $rtn[-1] .= " (${str}minor)"; + } + return join(' and ', @rtn); + }, + }, +); + +# add "Validate" tag to Extra table +AddTagToTable(\%Image::ExifTool::Extra, Validate => \%validateInfo, 1); + +#------------------------------------------------------------------------------ +# Validate the raw value of a tag +# Inputs: 0) ExifTool ref, 1) tag key, 2) raw tag value +# Returns: nothing, but issues a minor Warning if a problem was detected +sub ValidateRaw($$$) +{ + my ($self, $tag, $val) = @_; + my $tagInfo = $$self{TAG_INFO}{$tag}; + my $wrn; + + # evaluate Validate code if specified + if ($$tagInfo{Validate}) { + local $SIG{'__WARN__'} = \&Image::ExifTool::SetWarning; + undef $Image::ExifTool::evalWarning; + #### eval Validate ($self, $val, $tagInfo) + my $wrn = eval $$tagInfo{Validate}; + my $err = $Image::ExifTool::evalWarning || $@; + if ($wrn or $err) { + my $name = $$tagInfo{Table}{GROUPS}{0} . ':' . Image::ExifTool::GetTagName($tag); + $self->Warn("Validate $name: $err", 1) if $err; + $self->Warn("$wrn for $name", 1) if $wrn; + } + } + # check for unknown values in PrintConv lookup for all standard EXIF tags + if (ref $$tagInfo{PrintConv} eq 'HASH' and ($$tagInfo{Table}{SHORT_NAME} eq 'GPS::Main' or + ($$tagInfo{Table} eq \%Image::ExifTool::Exif::Main and $exifSpec{$$tagInfo{TagID}}))) + { + my $prt = $self->GetValue($tag, 'PrintConv'); + $wrn = 'Unknown value for' if $prt and $prt =~ /^Unknown \(/; + } + $wrn = 'Undefined value for' if $val eq 'undef'; + if ($wrn) { + my $name = $$self{DIR_NAME} . ':' . Image::ExifTool::GetTagName($tag); + $self->Warn("$wrn $name", 1); + } +} + +#------------------------------------------------------------------------------ +# Validate raw EXIF date/time value +# Inputs: 0) date/time value +# Returns: error string +sub ValidateExifDate($) +{ + my $val = shift; + if ($val =~ /^\d{4}:(\d{2}):(\d{2}) (\d{2}):(\d{2}):(\d{2})$/) { + my @a = ($1,$2,$3,$4,$5); + my ($i, @bad); + for ($i=0; $i<@a; ++$i) { + next if $a[$i] eq ' ' or ($a[$i] >= $validDateField[$i][1] and $a[$i] <= $validDateField[$i][2]); + push @bad, $validDateField[$i][0]; + } + return join('+', @bad) . ' out of range' if @bad; + # the EXIF specification allows blank fields or an entire blank value + } elsif ($val ne ' : : : : ' and $val ne ' ') { + return 'Invalid date/time format'; + } + return undef; # OK! +} + +#------------------------------------------------------------------------------ +# Validate EXIF-reformatted XMP date/time value +# Inputs: 0) date/time value +# Returns: error string +sub ValidateXMPDate($) +{ + my $val = shift; + if ($val =~ /^\d{4}$/ or + $val =~ /^\d{4}:(\d{2})$/ or + $val =~ /^\d{4}:(\d{2}):(\d{2})$/ or + $val =~ /^\d{4}:(\d{2}):(\d{2}) (\d{2}):(\d{2})()(Z|[-+](\d{2}):(\d{2}))?$/ or + $val =~ /^\d{4}:(\d{2}):(\d{2}) (\d{2}):(\d{2}):(\d{2})(Z|[-+](\d{2}):(\d{2}))?$/ or + $val =~ /^\d{4}:(\d{2}):(\d{2}) (\d{2}):(\d{2}):(\d{2})\.?\d*(Z|[-+](\d{2}):(\d{2}))?$/) + { + my @a = ($1,$2,$3,$4,$5,$7,$8); + my ($i, @bad); + for ($i=0; $i<@a; ++$i) { + last unless defined $a[$i]; + next if $a[$i] eq '' or ($a[$i] >= $validDateField[$i][1] and $a[$i] <= $validDateField[$i][2]); + push @bad, $validDateField[$i][0]; + } + return join('+', @bad) . ' out of range' if @bad; + } else { + return 'Invalid date/time format'; + } + return undef; # OK! +} + +#------------------------------------------------------------------------------ +# Validate EXIF tag +# Inputs: 0) ExifTool ref, 1) tag table ref, 2) tag ID, 3) tagInfo ref, +# 4) previous tag ID, 5) IFD name, 6) number of values, 7) value format string +# Returns: Nothing, but sets Warning tags if any problems are found +sub ValidateExif($$$$$$$$) +{ + my ($et, $tagTablePtr, $tag, $tagInfo, $lastTag, $ifd, $count, $formatStr) = @_; + + $et->WarnOnce("Entries in $ifd are out of order") if $tag <= $lastTag; + + # (get tagInfo for unknown tags if Unknown option not used) + if (not defined $tagInfo and $$tagTablePtr{$tag} and ref $$tagTablePtr{$tag} eq 'HASH') { + $tagInfo = $$tagTablePtr{$tag}; + } + if (defined $tagInfo) { + my $ti = $tagInfo || $$tagTablePtr{$tag}; + $ti = $$ti[-1] if ref $ti eq 'ARRAY'; + my $stdFmt = $stdFormat{$ifd} || $stdFormat{IFD}; + if (defined $$stdFmt{All} or ($tagTablePtr eq \%Image::ExifTool::Exif::Main and + ($exifSpec{$tag} or $$stdFmt{$tag} or + ($tag >= 0xc612 and $tag <= 0xc7b5 and not defined $$stdFmt{$tag}))) or # (DNG tags) + $$tagTablePtr{SHORT_NAME} eq 'GPS::Main') + { + my $wgp = $$ti{WriteGroup} || $$tagTablePtr{WRITE_GROUP}; + if ($wgp and $wgp ne $ifd and $wgp ne 'All' and not $$ti{OffsetPair} and + ($ifd =~ /^(Sub|Profile)?IFD\d*$/ xor $wgp =~ /^(Sub)?IFD\d*$/) and + ($$ti{Writable} or $$ti{WriteGroup}) and $ifd !~ /^SRF\d+$/) + { + $et->Warn(sprintf('Wrong IFD for 0x%.4x %s (should be %s not %s)', $tag, $$ti{Name}, $wgp, $ifd)); + } + my $fmt = $$stdFmt{$tag} || $$ti{Writable}; + if ($fmt and $formatStr !~ /^$fmt$/ and (not $tagInfo or + not $$tagInfo{IsOffset} or $Image::ExifTool::Exif::intFormat{$formatStr})) + { + $et->Warn(sprintf('Non-standard format (%s) for %s 0x%.4x %s', $formatStr, $ifd, $tag, $$ti{Name})) + } + } elsif ($stdFormatAnyIFD{$tag}) { + if ($$ti{Writable} || $$ti{WriteGroup}) { + my $wgp = $$ti{WriteGroup} || $$tagTablePtr{WRITE_GROUP}; + if ($wgp and $wgp ne $ifd) { + $et->Warn(sprintf('Wrong IFD for 0x%.4x %s (should be %s not %s)', $tag, $$ti{Name}, $wgp, $ifd)); + } + } + } elsif (not $otherSpec{$$et{VALUE}{FileType}} or + (not $otherSpec{$$et{VALUE}{FileType}}{$tag} and not $otherSpec{$$et{VALUE}{FileType}}{All})) + { + if ($tagTablePtr eq \%Image::ExifTool::Exif::Main or $$tagInfo{Unknown}) { + $et->Warn(sprintf('Non-standard %s tag 0x%.4x %s', $ifd, $tag, $$ti{Name}), 1); + } + } + # change expected count from read Format to Writable size + my $tiCount = $$ti{Count}; + if ($tiCount) { + if ($$ti{Format} and $$ti{Writable} and + $Image::ExifTool::Exif::formatNumber{$$ti{Format}} and + $Image::ExifTool::Exif::formatNumber{$$ti{Writable}}) + { + my $s1 = $Image::ExifTool::Exif::formatSize[$Image::ExifTool::Exif::formatNumber{$$ti{Format}}]; + my $s2 = $Image::ExifTool::Exif::formatSize[$Image::ExifTool::Exif::formatNumber{$$ti{Writable}}]; + $tiCount = int($tiCount * $s1 / $s2); + } + if ($tiCount > 0 and $count != $tiCount) { + $et->Warn(sprintf('Non-standard count (%d) for %s 0x%.4x %s', $count, $ifd, $tag, $$ti{Name})); + } + } + } elsif (not $otherSpec{$$et{VALUE}{FileType}} or + (not $otherSpec{$$et{VALUE}{FileType}}{$tag} and not $otherSpec{$$et{VALUE}{FileType}}{All})) + { + $et->Warn(sprintf('Unknown %s tag 0x%.4x', $ifd, $tag), 1); + } +} + +#------------------------------------------------------------------------------ +# Validate image data offsets/sizes +# Inputs: 0) ExifTool ref, 1) offset info hash ref (arrays of tagInfo/value pairs, keyed by tagID) +# 2) directory name, 3) optional flag for minor warning +sub ValidateOffsetInfo($$$;$) +{ + local $_; + my ($et, $offsetInfo, $dirName, $minor) = @_; + + my $fileSize = $$et{VALUE}{FileSize} or return; + + # (don't test RWZ files and some other file types) + return if $$et{DontValidateImageData}; + # (Minolta A200 uses wrong byte order for these) + return if $$et{TIFF_TYPE} eq 'MRW' and $dirName eq 'IFD0' and $$et{Model} =~ /^DiMAGE A200/; + # (don't test 3FR, RWL or RW2 files) + return if $$et{TIFF_TYPE} =~ /^(3FR|RWL|RW2)$/; + + Image::ExifTool::Exif::ValidateImageData($et, $offsetInfo, $dirName); + + # loop through all offsets + while (%$offsetInfo) { + my ($id1) = sort keys %$offsetInfo; + my $offsets = $$offsetInfo{$id1}; + delete $$offsetInfo{$id1}; + next unless ref $offsets eq 'ARRAY'; + my $id2 = $$offsets[0]{OffsetPair}; + unless (defined $id2 and $$offsetInfo{$id2}) { + unless ($$offsets[0]{NotRealPair} or (defined $id2 and $id2 == -1)) { + my $corr = $$offsets[0]{IsOffset} ? 'size' : 'offset'; + $et->Warn("$dirName:$$offsets[0]{Name} is missing the corresponding $corr tag") unless $minor; + } + next; + } + my $sizes = $$offsetInfo{$id2}; + delete $$offsetInfo{$id2}; + ($sizes, $offsets) = ($offsets, $sizes) if $$sizes[0]{IsOffset}; + my @offsets = split ' ', $$offsets[1]; + my @sizes = split ' ', $$sizes[1]; + if (@sizes != @offsets) { + $et->Warn(sprintf('Wrong number of values in %s 0x%.4x %s', + $dirName, $$offsets[0]{TagID}, $$offsets[0]{Name}), $minor); + next; + } + while (@offsets) { + my $start = pop @offsets; + my $end = $start + pop @sizes; + $et->WarnOnce("$dirName:$$offsets[0]{Name} is zero", $minor) if $start == 0; + $et->WarnOnce("$dirName:$$sizes[0]{Name} is zero", $minor) if $start == $end; + next unless $end > $fileSize; + if ($start >= $fileSize) { + if ($start == 0xffffffff) { + $et->Warn("$dirName:$$offsets[0]{Name} is invalid (0xffffffff)", $minor); + } else { + $et->Warn("$dirName:$$offsets[0]{Name} is past end of file", $minor); + } + } else { + $et->Warn("$dirName:$$offsets[0]{Name}+$$sizes[0]{Name} runs past end of file", $minor); + } + last; + } + } +} + +#------------------------------------------------------------------------------ +# Finish Validating tags +# Inputs: 0) ExifTool ref, 1) True to generate Validate tag +sub FinishValidate($$) +{ + local $_; + my ($et, $mkTag) = @_; + + my $fileType = $$et{FILE_TYPE} || ''; + $fileType = $$et{TIFF_TYPE} if $fileType eq 'TIFF'; + + if ($validValue{$fileType}) { + my ($grp, $tag, %val); + local $SIG{'__WARN__'} = \&Image::ExifTool::SetWarning; + foreach $grp (sort keys %{$validValue{$fileType}}) { + next unless $$et{FOUND_DIR}{$grp}; + my ($key, %val, %info, $minor, $verTag, $ver, $vstr); + my $verCheck = $verCheck{$grp}; + if ($verCheck) { + ($verTag) = keys %$verCheck; + ($ver = $$et{VALUE}{$verTag}) =~ tr/0-9//dc; # (remove non-digits) + undef $ver unless $ver =~ /^\d{4}$/; # (already warned if invalid version) + } + # get all tags in this group + foreach $key (sort keys %{$$et{VALUE}}) { + next unless $et->GetGroup($key, 1) eq $grp; + next if $$et{TAG_EXTRA}{$key} and $$et{TAG_EXTRA}{$key}{G3}; # ignore sub-documents + # fill in %val lookup with values based on tag ID + my $tag = $$et{TAG_INFO}{$key}{TagID}; + $val{$tag} = $$et{VALUE}{$key}; + # save TagInfo ref for later + $info{$tag} = $$et{TAG_INFO}{$key}; + next unless defined $ver; + my $chk = $$verCheck{$verTag}; + next if not defined $$chk{$tag} or $$chk{$tag} == 1 or $ver >= $$chk{$tag}; + if ($verTag eq 'GPSVersionID') { + ($vstr = $$chk{$tag}) =~ s/^(\d)(\d)(\d)/$1.$2.$3./; + } else { + $vstr = sprintf('%.4d', $$chk{$tag}); + } + $et->Warn(sprintf('%s tag 0x%.4x %s requires %s %s or higher', + $grp, $tag, $$et{TAG_INFO}{$key}{Name}, $verTag, $vstr)); + } + # make quick lookup for values based on tag ID + my $validValue = $validValue{$fileType}{$grp}; + foreach $tag (sort { $a <=> $b } keys %$validValue) { + my $val = $val{$tag}; + my ($pre, $post); + if (defined $$validValue{$tag}) { + #### eval ($val, %val) + my $result = eval $$validValue{$tag}; + if (not defined $result) { + $pre = 'Internal error validating'; + } elsif ($result eq '') { + $pre = defined $val ? 'Invalid value for' : "Missing required $fileType"; + } else { + next if $result eq '1'; + $pre = $result; + } + } else { + next unless defined $val; + $post = "is not allowed in $fileType"; + $minor = 1; + } + my $name; + if ($info{$tag}) { + $name = $info{$tag}{Name}; + } else { + my $table = 'Image::ExifTool::'.($grp eq 'GPS' ? 'GPS' : 'Exif').'::Main'; + my $tagInfo = GetTagTable($table)->{$tag}; + $tagInfo = $$tagInfo[0] if ref $tagInfo eq 'ARRAY'; + $name = $tagInfo ? $$tagInfo{Name} : '<unknown>'; + } + next if $$et{WrongFormat} and $$et{WrongFormat}{"$grp:$name"}; + $pre ? ($pre .= ' ') : ($pre = ''); + $post ? ($post = ' '.$post) : ($post = ''); + $et->Warn(sprintf('%s%s tag 0x%.4x %s%s', $pre, $grp, $tag, $name, $post), $minor); + } + } + } + # validate file extension + if ($$et{FILENAME} ne '') { + my $fileExt = ($$et{FILENAME} =~ /^.*\.([^.]+)$/s) ? uc($1) : ''; + my $extFileType = Image::ExifTool::GetFileType($fileExt); + if ($extFileType and $extFileType ne $fileType) { + my $normExt = $$et{VALUE}{FileTypeExtension}; + if ($normExt and $normExt ne $fileExt) { + my $lkup = $Image::ExifTool::fileTypeLookup{$fileExt}; + if (ref $lkup or $lkup ne $normExt) { + $et->Warn("File has wrong extension (should be $normExt, not $fileExt)"); + } + } + } + } + # issue warning if FastScan option used + $et->Warn('Validation incomplete because FastScan option used') if $et->Options('FastScan'); + + # generate Validate tag if necessary + if ($mkTag) { + my (@num, $key); + push @num, $$et{VALUE}{Error} ? ($$et{DUPL_TAG}{Error} || 0) + 1 : 0, + $$et{VALUE}{Warning} ? ($$et{DUPL_TAG}{Warning} || 0) + 1 : 0, 0; + for ($key = 'Warning'; ; ) { + ++$num[2] if $$et{VALUE}{$key} and $$et{VALUE}{$key} =~ /^\[minor\]/i; + $key = $et->NextTagKey($key) or last; + } + $et->FoundTag(Validate => "@num"); + } +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Validate - Additional metadata validation + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains additional routines and definitions used when the +ExifTool Validate option is enabled. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<Image::ExifTool::TagNames/Extra Tags> + +=cut diff --git a/lib/Image/ExifTool/Vorbis.pm b/lib/Image/ExifTool/Vorbis.pm new file mode 100644 index 0000000..b691164 --- /dev/null +++ b/lib/Image/ExifTool/Vorbis.pm @@ -0,0 +1,255 @@ +#------------------------------------------------------------------------------ +# File: Vorbis.pm +# +# Description: Read Ogg Vorbis audio meta information +# +# Revisions: 2006/11/10 - P. Harvey Created +# 2011/07/12 - PH Moved Ogg to a separate module and added Theora +# +# References: 1) http://www.xiph.org/vorbis/doc/ +# 2) http://flac.sourceforge.net/ogg_mapping.html +# 3) http://www.theora.org/doc/Theora.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::Vorbis; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.08'; + +sub ProcessComments($$$); + +# Vorbis header types +%Image::ExifTool::Vorbis::Main = ( + NOTES => q{ + Information extracted from Ogg Vorbis files. See + L<http://www.xiph.org/vorbis/doc/> for the Vorbis specification. + }, + 1 => { + Name => 'Identification', + SubDirectory => { TagTable => 'Image::ExifTool::Vorbis::Identification' }, + }, + 3 => { + Name => 'Comments', + SubDirectory => { TagTable => 'Image::ExifTool::Vorbis::Comments' }, + }, +); + +%Image::ExifTool::Vorbis::Identification = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Audio' }, + 0 => { + Name => 'VorbisVersion', + Format => 'int32u', + }, + 4 => 'AudioChannels', + 5 => { + Name => 'SampleRate', + Format => 'int32u', + }, + 9 => { + Name => 'MaximumBitrate', + Format => 'int32u', + RawConv => '$val || undef', + PrintConv => 'ConvertBitrate($val)', + }, + 13 => { + Name => 'NominalBitrate', + Format => 'int32u', + RawConv => '$val || undef', + PrintConv => 'ConvertBitrate($val)', + }, + 17 => { + Name => 'MinimumBitrate', + Format => 'int32u', + RawConv => '$val || undef', + PrintConv => 'ConvertBitrate($val)', + }, +); + +%Image::ExifTool::Vorbis::Comments = ( + PROCESS_PROC => \&ProcessComments, + GROUPS => { 2 => 'Audio' }, + NOTES => q{ + The tags below are only some common tags found in the Vorbis comments of Ogg + Vorbis and Ogg FLAC audio files, however ExifTool will extract values from + any tag found, even if not listed here. + }, + vendor => { Notes => 'from comment header' }, + TITLE => { Name => 'Title' }, + VERSION => { Name => 'Version' }, + ALBUM => { Name => 'Album' }, + TRACKNUMBER=>{ Name => 'TrackNumber' }, + ARTIST => { Name => 'Artist', Groups => { 2 => 'Author' }, List => 1 }, + PERFORMER => { Name => 'Performer', Groups => { 2 => 'Author' }, List => 1 }, + COPYRIGHT => { Name => 'Copyright', Groups => { 2 => 'Author' } }, + LICENSE => { Name => 'License', Groups => { 2 => 'Author' } }, + ORGANIZATION=>{Name => 'Organization', Groups => { 2 => 'Author' } }, + DESCRIPTION=>{ Name => 'Description' }, + GENRE => { Name => 'Genre' }, + DATE => { Name => 'Date', Groups => { 2 => 'Time' } }, + LOCATION => { Name => 'Location', Groups => { 2 => 'Location' } }, + CONTACT => { Name => 'Contact', Groups => { 2 => 'Author' }, List => 1 }, + ISRC => { Name => 'ISRCNumber' }, + COVERARTMIME => { Name => 'CoverArtMIMEType' }, + COVERART => { + Name => 'CoverArt', + Groups => { 2 => 'Preview' }, + Notes => 'base64-encoded image', + ValueConv => q{ + require Image::ExifTool::XMP; + Image::ExifTool::XMP::DecodeBase64($val); + }, + }, + REPLAYGAIN_TRACK_PEAK => { Name => 'ReplayGainTrackPeak' }, + REPLAYGAIN_TRACK_GAIN => { Name => 'ReplayGainTrackGain' }, + REPLAYGAIN_ALBUM_PEAK => { Name => 'ReplayGainAlbumPeak' }, + REPLAYGAIN_ALBUM_GAIN => { Name => 'ReplayGainAlbumGain' }, + # observed in "Xiph.Org libVorbis I 20020717" ogg: + ENCODED_USING => { Name => 'EncodedUsing' }, + ENCODED_BY => { Name => 'EncodedBy' }, + COMMENT => { Name => 'Comment' }, + # in Theora documentation (ref 3) + DIRECTOR => { Name => 'Director' }, + PRODUCER => { Name => 'Producer' }, + COMPOSER => { Name => 'Composer' }, + ACTOR => { Name => 'Actor' }, + # Opus tags + ENCODER => { Name => 'Encoder' }, + ENCODER_OPTIONS => { Name => 'EncoderOptions' }, + METADATA_BLOCK_PICTURE => { + Name => 'Picture', + Binary => 1, + # ref https://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE + RawConv => q{ + require Image::ExifTool::XMP; + Image::ExifTool::XMP::DecodeBase64($val); + }, + SubDirectory => { + TagTable => 'Image::ExifTool::FLAC::Picture', + ByteOrder => 'BigEndian', + }, + }, +); + +# Vorbis composite tags +%Image::ExifTool::Vorbis::Composite = ( + Duration => { + Require => { + 0 => 'Vorbis:NominalBitrate', + 1 => 'FileSize', + }, + RawConv => '$val[0] ? $val[1] * 8 / $val[0] : undef', + PrintConv => 'ConvertDuration($val) . " (approx)"', # (only approximate) + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::Vorbis'); + + +#------------------------------------------------------------------------------ +# Process Vorbis Comments +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: 1 on success, otherwise returns 0 and sets a Warning +sub ProcessComments($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos}; + my $pos = $$dirInfo{DirStart} || 0; + my $end = $$dirInfo{DirLen} ? $pos + $$dirInfo{DirLen} : length $$dataPt; + my ($num, $index); + + SetByteOrder('II'); + for (;;) { + last if $pos + 4 > $end; + my $len = Get32u($dataPt, $pos); + last if $pos + 4 + $len > $end; + my $start = $pos + 4; + my $buff = substr($$dataPt, $start, $len); + $pos = $start + $len; + my ($tag, $val); + if (defined $num) { + $buff =~ /(.*?)=(.*)/s or last; + ($tag, $val) = (uc $1, $2); + # Vorbis tag ID's are all capitals, so they may conflict with our internal tags + # --> protect against this by adding a trailing underline if necessary + $tag .= '_' if $Image::ExifTool::specialTags{$tag}; + } else { + $tag = 'vendor'; + $val = $buff; + $num = ($pos + 4 < $end) ? Get32u($dataPt, $pos) : 0; + $et->VPrint(0, " + [Vorbis comments with $num entries]\n"); + $pos += 4; + } + # add tag to table unless it exists already + unless ($$tagTablePtr{$tag}) { + my $name = ucfirst(lc($tag)); + # remove invalid characters in tag name and capitalize following letters + $name =~ s/[^\w-]+(.?)/\U$1/sg; + $name =~ s/([a-z0-9])_([a-z])/$1\U$2/g; + $et->VPrint(0, " | [adding $tag]\n"); + AddTagToTable($tagTablePtr, $tag, { Name => $name }); + } + $et->HandleTag($tagTablePtr, $tag, $et->Decode($val, 'UTF8'), + Index => $index, + DataPt => $dataPt, + DataPos => $dataPos, + Start => $start, + Size => $len, + ); + # all done if this was our last tag + $num-- or return 1; + $index = (defined $index) ? $index + 1 : 0; + } + $et->Warn('Format error in Vorbis comments'); + return 0; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Vorbis - Read Ogg Vorbis audio meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from Ogg Vorbis audio headers. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.xiph.org/vorbis/doc/> + +=item L<http://flac.sourceforge.net/ogg_mapping.html> + +=item L<http://www.theora.org/doc/Theora.pdf> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/Vorbis Tags>, +L<Image::ExifTool::TagNames/Ogg Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/WTV.pm b/lib/Image/ExifTool/WTV.pm new file mode 100644 index 0000000..8fe8ac3 --- /dev/null +++ b/lib/Image/ExifTool/WTV.pm @@ -0,0 +1,319 @@ +#------------------------------------------------------------------------------ +# File: WTV.pm +# +# Description: Read WTV meta information +# +# Revisions: 2018-05-30 - P. Harvey Created +# +# References: 1) https://wiki.multimedia.cx/index.php?title=WTV +#------------------------------------------------------------------------------ + +package Image::ExifTool::WTV; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.00'; + +sub ProcessMetadata($$$); + +my %timeInfo = ( + # time looks like 100 ns intervals since 0:00 UTC Jan 1, 0001 (ref PH) + ValueConv => q{ # (719162 days from 0001:01:01 to 1970:01:01) + my $t = $val / 1e7 - 719162*24*3600; + return Image::ExifTool::ConvertUnixTime($t) . 'Z'; + }, + PrintConv => '$self->ConvertDateTime($val)', +); + +my %bool = ( PrintConv => { 0 => 'No', 1 => 'Yes' }, PrintConvColumns => 2 ); + +# WTV chunks +%Image::ExifTool::WTV::Main = ( + GROUPS => { 0 => 'WTV', 1 => 'WTV', 2 => 'Video' }, + NOTES => 'Tags found in Windows recorded TV (WTV) videos.', + # 'timeline.table.0.header.Events' (not decoded) + # 'timeline.table.0.entries.Events' (not decoded) + # 'timeline' (not decoded) + # 'table.0.header.legacy_attrib' (not decoded) + 'table.0.entries.legacy_attrib' => { + Name => 'Metdata', + SubDirectory => { TagTable => 'Image::ExifTool::WTV::Metadata' }, + }, + # 'table.0.redirector.legacy_attrib' (not decoded) + # 'table.0.header.time' (not decoded) + # 'table.0.entries.time' (not decoded) +); + +# Note: Many of these tags are similar to those found in Image::ExifTool::Microsoft::Xtra +# and Image::ExifTool::ASF::ExtendedDescr +%Image::ExifTool::WTV::Metadata = ( + GROUPS => { 0 => 'WTV', 1 => 'WTV', 2 => 'Video' }, + PROCESS_PROC => \&ProcessMetadata, + NOTES => 'ExifTool will extract any tag found, even if not in this table.', + VARS => { NO_ID => 1 }, + 'Duration' => { + Name => 'Duration', + ValueConv => '$val/1e7', + PrintConv => 'ConvertDuration($val)', + }, + 'Title' => { }, + 'WM/Genre' => 'Genre', + 'WM/Language' => 'Language', + 'WM/MediaClassPrimaryID' => 'MediaClassPrimaryID', + 'WM/MediaClassSecondaryID' => 'MediaClassSecondaryID', + 'WM/MediaCredits' => 'MediaCredits', + 'WM/MediaIsDelay' => { Name => 'MediaIsDelay', %bool }, + 'WM/MediaIsFinale' => { Name => 'MediaIsFinale', %bool }, + 'WM/MediaIsLive' => { Name => 'MediaIsLive', %bool }, + 'WM/MediaIsMovie' => { Name => 'MediaIsMovie', %bool }, + 'WM/MediaIsPremiere' => { Name => 'MediaIsPremiere', %bool }, + 'WM/MediaIsRepeat' => { Name => 'MediaIsRepeat', %bool }, + 'WM/MediaIsSAP' => { Name => 'MediaIsSAP', %bool }, + 'WM/MediaIsSport' => { Name => 'MediaIsSport', %bool }, + 'WM/MediaIsStereo' => { Name => 'MediaIsStereo', %bool, Groups => { 2 => 'Audio' } }, + 'WM/MediaIsSubtitled' => { Name => 'MediaIsSubtitled',%bool }, + 'WM/MediaIsTape' => { Name => 'MediaIsTape', %bool }, + 'WM/MediaNetworkAffiliation'=> 'MediaNetworkAffiliation', + 'WM/MediaOriginalBroadcastDateTime' => { + Name => 'MediaOriginalBroadcastDateTime', + Groups => { 2 => 'Time' }, + ValueConv => '$val =~ tr/-T/: /; $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + 'WM/MediaOriginalChannel' => { Name => 'MediaOriginalChannel' }, + 'WM/MediaOriginalChannelSubNumber' => { Name => 'MediaOriginalChannelSubNumber' }, + 'WM/MediaOriginalRunTime' => { + Name => 'MediaOriginalRunTime', + ValueConv => '$val / 1e7', + PrintConv => 'ConvertDuration($val)', + }, + 'WM/MediaStationCallSign' => 'MediaStationCallSign', + 'WM/MediaStationName' => 'MediaStationName', + 'WM/MediaThumbAspectRatioX' => 'MediaThumbAspectRatioX', + 'WM/MediaThumbAspectRatioY' => 'MediaThumbAspectRatioY', + 'WM/MediaThumbHeight' => 'MediaThumbHeight', + 'WM/MediaThumbRatingAttributes' => { Name => 'MediaThumbRatingAttributes' }, + 'WM/MediaThumbRatingLevel' => 'MediaThumbRatingLevel', + 'WM/MediaThumbRatingSystem' => 'MediaThumbRatingSystem', + 'WM/MediaThumbRet' => 'MediaThumbRet', + 'WM/MediaThumbStride' => 'MediaThumbStride', + 'WM/MediaThumbTimeStamp' => { Name => 'MediaThumbTimeStamp', Notes => 'unknown units', Unknown => 1 }, + 'WM/MediaThumbWidth' => 'MediaThumbWidth', + 'WM/OriginalReleaseTime' => { + Name => 'OriginalReleaseTime', + Groups => { 2 => 'Time' }, + ValueConv => '$val=~tr/-T/: /; $val', + PrintConv => '$self->ConvertDateTime($val)', + }, + 'WM/ParentalRating' => 'ParentalRating', + 'WM/ParentalRatingReason' => 'ParentalRatingReason', + 'WM/Provider' => 'Provider', + 'WM/ProviderCopyright' => 'ProviderCopyright', + 'WM/ProviderRating' => 'ProviderRating', + 'WM/SubTitle' => 'Subtitle', + 'WM/SubTitleDescription' => 'SubtitleDescription', + 'WM/VideoClosedCaptioning' => { Name => 'VideoClosedCaptioning', %bool }, + 'WM/WMRVATSCContent' => { Name => 'ATSCContent', %bool }, + 'WM/WMRVActualSoftPostPadding' => 'ActualSoftPostPadding', + 'WM/WMRVActualSoftPrePadding' => 'ActualSoftPrePadding', + 'WM/WMRVBitrate' => { Name => 'Bitrate', Notes => 'unknown units', Unknown => 1 }, + 'WM/WMRVBrandingImageID' => 'BrandingImageID', + 'WM/WMRVBrandingName' => 'BrandingName', + 'WM/WMRVContentProtected' => { Name => 'ContentProtected', %bool }, + 'WM/WMRVContentProtectedPercent' => 'ContentProtectedPercent', + 'WM/WMRVDTVContent' => { Name => 'DTVContent', %bool }, + 'WM/WMRVEncodeTime' => { Name => 'EncodeTime', Groups => { 2 => 'Time' }, %timeInfo }, + 'WM/WMRVEndTime' => { Name => 'EndTime', Groups => { 2 => 'Time' }, %timeInfo }, + 'WM/WMRVExpirationDate' => { Name => 'ExpirationDate', Groups => { 2 => 'Time' }, %timeInfo, Unknown => 1 }, + 'WM/WMRVExpirationSpan' => { Name => 'ExpirationSpan', Notes => 'unknown units', Unknown => 1 }, + 'WM/WMRVHDContent' => { Name => 'HDContent', %bool }, + 'WM/WMRVHardPostPadding' => 'HardPostPadding', + 'WM/WMRVHardPrePadding' => 'HardPrePadding', + 'WM/WMRVInBandRatingAttributes' => 'InBandRatingAttributes', + 'WM/WMRVInBandRatingLevel' => 'InBandRatingLevel', + 'WM/WMRVInBandRatingSystem' => 'InBandRatingSystem', + 'WM/WMRVKeepUntil' => 'KeepUntil', + 'WM/WMRVOriginalSoftPostPadding'=> 'OriginalSoftPostPadding', + 'WM/WMRVOriginalSoftPrePadding' => 'OriginalSoftPrePadding', + 'WM/WMRVProgramID' => 'ProgramID', + 'WM/WMRVQuality' => 'Quality', + 'WM/WMRVRequestID' => 'RequestID', + 'WM/WMRVScheduleItemID' => 'ScheduleItemID', + 'WM/WMRVSeriesUID' => 'SeriesUID', + 'WM/WMRVServiceID' => 'ServiceID', + 'WM/WMRVWatched' => { Name => 'Watched', %bool }, +); + +#------------------------------------------------------------------------------ +# Read specified sectors from the file +# Inputs: 0) raf ref, 1) sector table ref, 2) offset in sector table, 3) sector size +# Returns: Data or undef on error +sub ReadSectors($$$$) +{ + my ($raf, $secPt, $pos, $secSize) = @_; + my ($data, $buff); + while ($pos <= length($$secPt) - 4) { + my $sec = Get32u($secPt, $pos); + return undef if $sec == 0xffff; # (just in case) + last unless $sec; # a null marks the end of the sector table + defined($data) ? ($data .= $buff) : ($data = $buff); + return undef unless $raf->Seek($sec*$secSize,0) and $raf->Read($buff,$secSize) == $secSize; + $pos += 4; + } + return defined($data) ? $data . $buff : $buff; +} + +#------------------------------------------------------------------------------ +# Process WTV metadata +# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref +# Returns: 1 on success +sub ProcessMetadata($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my $pos = 0; + my $end = length $$dataPt; + $et->VerboseDir('WTV Metadata', undef, $end); + while ($pos + 0x18 < $end) { + last unless substr($$dataPt,$pos,16) eq "\x5a\xfe\xd7\x6d\xc8\x1d\x8f\x4a\x99\x22\xfa\xb1\x1c\x38\x14\x53"; + my $fmt = Get32u($dataPt, $pos + 0x10); + my $len = Get32u($dataPt, $pos + 0x14); + my $str = ''; + $pos += 0x18; + for (;;) { + $pos + 2 > $end and $et->Warn('Corrupt metadata directory'), last; + my $ch = substr($$dataPt, $pos, 2); + $pos += 2; + last if $ch eq "\0\0"; + $str .= $ch; + } + last if $pos + $len > $end; + my $tag = $et->Decode($str, 'UCS2', undef, 'UTF8'); + my $dat = substr($$dataPt, $pos, $len); + # add tag if not already there + unless ($$tagTablePtr{$tag}) { + my $name = $tag; + $name =~ s{^(WTV_Metadata_)?WM/(WMRV)?}{}; + AddTagToTable($tagTablePtr, $tag, $name); + $et->VPrint(0, $$et{INDENT}, "[adding WTV:$name]\n"); + } + my $val; + if ($fmt==0 or $fmt==3) { # int32u or boolean32 + $val = Get32s(\$dat, 0); + } elsif ($fmt == 1) { # string + $val = $et->Decode($dat, 'UCS2'); + } elsif ($fmt == 6) { # GUID + $val = unpack('H*', $dat); + } elsif ($fmt == 4) { # int64u (date/time values use this) + $val = Get64u(\$dat, 0); + } else { + $val = $dat; + $fmt = "Unknown($fmt)"; + } + $et->HandleTag($tagTablePtr, $tag, $val, + Format => "format $fmt", + Size => length $dat, + ); + $et->VerboseDump(\$dat); + $pos += $len; + } +} + +#------------------------------------------------------------------------------ +# Extract information from a WTV video +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid WTV file +sub ProcessWTV($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $verbose = $et->Options('Verbose'); + my ($buff, $tagTablePtr, $pos, $len); + + # verify this is a valid WTV file + return 0 unless $raf->Read($buff, 0x60) == 0x60; + return 0 unless $buff =~ /^\xb7\xd8\x00\x20\x37\x49\xda\x11\xa6\x4e\x00\x07\xe9\x5e\xad\x8d/; + $et->SetFileType(); + SetByteOrder('II'); + # 0x28 - int32u: sector size? (=0x1000) (PH NC) + # 0x38 - int32u: sector number for main WTV directory (PH assume this is a sector table, NC) + # 0x58 - int32u: total number of sectors in file + my $secSize = Get32u(\$buff, 0x28); + # in case I'm wrong about this, constrain sector size to + # either 0x1000 (standard) or 0x100 (ExifTool test file) - PH + $secSize = 0x1000 unless $secSize == 0x1000 or $secSize == 0x100; + $buff = ReadSectors($raf, \$buff, 0x38, $secSize); # read the WTV directory + return 0 unless defined $buff; + $tagTablePtr = GetTagTable('Image::ExifTool::WTV::Main'); + # parse the WTV directory + $et->VerboseDir('WTV'); + for ($pos=0; $pos<length($buff)-0x28; $pos+=$len) { + unless (substr($buff,$pos,0x10) eq "\x92\xb7\x74\x91\x59\x70\x70\x44\x88\xdf\x06\x3b\x82\xcc\x21\x3d") { + $et->Warn("WTV directory wasn't at expected location") unless $pos; + last; + } + $len = Get32u(\$buff, $pos+0x10); + last if $pos + $len > length($buff); + my $n = Get32u(\$buff, $pos + 0x20); + 0x28 + $n*2 + 8 > $len and $et->Warn('WTV directory error'), last; + my $tag = $et->Decode(substr($buff,$pos+0x28,$n*2), 'UCS2', undef, 'UTF8'); + my $ptr = $pos + 0x28 + $n * 2; + my $flg = Get32u(\$buff, $ptr + 4); + if ($verbose) { + my $s = Get32s(\$buff, $ptr); + $s = sprintf('0x%x', $s) unless $s < 0; + $et->VPrint(1,"- Tag '${tag}' (sector=$s, flag=$flg)"); + } + next unless $$tagTablePtr{$tag} and ($flg == 0 or $flg == 1); + my $sec = substr($buff, $ptr, 4); + my $data = ReadSectors($raf, \$sec, 0, $secSize); + last unless defined $data; + # read sectors from table if necessary (flag=1 indicates a sector table) + $data = ReadSectors($raf, \$data, 0, $secSize) if $flg == 1; + defined $data or $et->Warn("Error fetching data for $tag"), next; + $et->HandleTag($tagTablePtr, $tag, $data); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::WTV - Read WTV meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read WTV +(Windows recorded TV show) videos. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://wiki.multimedia.cx/index.php?title=WTV> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/WTV Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/WriteCanonRaw.pl b/lib/Image/ExifTool/WriteCanonRaw.pl new file mode 100644 index 0000000..5b8d3a2 --- /dev/null +++ b/lib/Image/ExifTool/WriteCanonRaw.pl @@ -0,0 +1,637 @@ +#------------------------------------------------------------------------------ +# File: WriteCanonRaw.pl +# +# Description: Write Canon RAW (CRW and CR2) meta information +# +# Revisions: 01/25/2005 - P. Harvey Created +# 09/16/2010 - PH Added ability to write XMP in CRW images +#------------------------------------------------------------------------------ +package Image::ExifTool::CanonRaw; + +use strict; +use vars qw($VERSION $AUTOLOAD %crwTagFormat); +use Image::ExifTool::Fixup; + +# map for adding directories to CRW +my %crwMap = ( + XMP => 'CanonVRD', + CanonVRD => 'Trailer', +); + +# mappings to from RAW tagID to MakerNotes tagID +# (Note: upper two bits of RawTagID are zero) +my %mapRawTag = ( + # RawTagID => Canon TagID + 0x080b => 0x07, # CanonFirmwareVersion + 0x0810 => 0x09, # OwnerName + 0x0815 => 0x06, # CanonImageType + 0x1028 => 0x03, # (unknown if no tag name specified) + 0x1029 => 0x02, # FocalLength + 0x102a => 0x04, # CanonShotInfo + 0x102d => 0x01, # CanonCameraSettings + 0x1033 => 0x0f, # CanonCustomFunctions (only verified for 10D) + 0x1038 => 0x12, # CanonAFInfo + 0x1039 => 0x13, + 0x1093 => 0x93, + 0x10a8 => 0xa8, + 0x10a9 => 0xa9, # WhiteBalanceTable + 0x10aa => 0xaa, + 0x10ae => 0xae, # ColorTemperature + 0x10b4 => 0xb4, # ColorSpace + 0x10b5 => 0xb5, + 0x10c0 => 0xc0, + 0x10c1 => 0xc1, + 0x180b => 0x0c, # SerialNumber + 0x1817 => 0x08, # FileNumber + 0x1834 => 0x10, + 0x183b => 0x15, +); +# translation from Rotation to Orientation values +my %mapRotation = ( + 0 => 1, + 90 => 6, + 180 => 3, + 270 => 8, +); + + +#------------------------------------------------------------------------------ +# Initialize buffers for building MakerNotes from RAW data +# Inputs: 0) ExifTool object reference +sub InitMakerNotes($) +{ + my $et = shift; + $$et{MAKER_NOTE_INFO} = { + Entries => { }, # directory entries keyed by tagID + ValBuff => "\0\0\0\0", # value data buffer (start with zero nextIFD pointer) + FixupTags => { }, # flags for tags with data in value buffer + }; +} + +#------------------------------------------------------------------------------ +# Build maker notes from CanonRaw information +# Inputs: 0) ExifTool object reference, 1) raw tag ID, 2) reference to tagInfo +# 3) reference to value, 4) format name, 5) count +# Notes: This will build the directory in the order the tags are found in the CRW +# file, which isn't sequential (but Canon's version isn't sequential either...) +sub BuildMakerNotes($$$$$$) +{ + my ($et, $rawTag, $tagInfo, $valuePt, $formName, $count) = @_; + + my $tagID = $mapRawTag{$rawTag} || return; + $formName or warn(sprintf "No format for tag 0x%x!\n",$rawTag), return; + # special case: ignore user comment because it gets saved in EXIF + # (and has the same raw tagID as CanonFileDescription) + return if $tagInfo and $$tagInfo{Name} eq 'UserComment'; + my $format = $Image::ExifTool::Exif::formatNumber{$formName}; + my $fsiz = $Image::ExifTool::Exif::formatSize[$format]; + my $size = length($$valuePt); + my $value; + if ($count and $size != $count * $fsiz) { + if ($size < $count * $fsiz) { + warn sprintf("Value too short for raw tag 0x%x\n",$rawTag); + return; + } + # shorten value appropriately + $size = $count * $fsiz; + $value = substr($$valuePt, 0, $size); + } else { + $count = $size / $fsiz; + $value = $$valuePt; + } + my $offsetVal; + my $makerInfo = $$et{MAKER_NOTE_INFO}; + if ($size > 4) { + my $len = length $makerInfo->{ValBuff}; + $offsetVal = Set32u($len); + $makerInfo->{ValBuff} .= $value; + # pad to an even number of bytes + $size & 0x01 and $makerInfo->{ValBuff} .= "\0"; + # set flag indicating that this tag needs a fixup + $makerInfo->{FixupTags}->{$tagID} = 1; + } else { + $offsetVal = $value; + $size < 4 and $offsetVal .= "\0" x (4 - $size); + } + $makerInfo->{Entries}->{$tagID} = Set16u($tagID) . Set16u($format) . + Set32u($count) . $offsetVal; +} + +#------------------------------------------------------------------------------ +# Finish building and save MakerNotes +# Inputs: 0) ExifTool object reference +sub SaveMakerNotes($) +{ + my $et = shift; + # save maker notes + my $makerInfo = $$et{MAKER_NOTE_INFO}; + delete $$et{MAKER_NOTE_INFO}; + my $dirEntries = $makerInfo->{Entries}; + my $numEntries = scalar(keys %$dirEntries); + my $fixup = new Image::ExifTool::Fixup; + return unless $numEntries; + # build the MakerNotes directory + my $makerNotes = Set16u($numEntries); + my $tagID; + # write the entries in proper tag order (even though Canon doesn't do this...) + foreach $tagID (sort { $a <=> $b } keys %$dirEntries) { + $makerNotes .= $$dirEntries{$tagID}; + next unless $makerInfo->{FixupTags}->{$tagID}; + # add fixup for this pointer + $fixup->AddFixup(length($makerNotes) - 4); + } + # save position of maker notes for pointer fixups + $fixup->{Shift} += length($makerNotes); + $$et{MAKER_NOTE_FIXUP} = $fixup; + $$et{MAKER_NOTE_BYTE_ORDER} = GetByteOrder(); + # add value data + $makerNotes .= $makerInfo->{ValBuff}; + # get MakerNotes tag info + my $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::Exif::Main'); + my $tagInfo = $et->GetTagInfo($tagTablePtr, 0x927c, \$makerNotes); + # save the MakerNotes + $et->FoundTag($tagInfo, $makerNotes); + # save the garbage collection some work later + delete $makerInfo->{Entries}; + delete $makerInfo->{ValBuff}; + delete $makerInfo->{FixupTags}; + # also generate Orientation tag since Rotation isn't transferred from RAW info + my $rotation = $et->GetValue('Rotation', 'ValueConv'); + if (defined $rotation and defined $mapRotation{$rotation}) { + $tagInfo = $et->GetTagInfo($tagTablePtr, 0x112); + $et->FoundTag($tagInfo, $mapRotation{$rotation}); + } +} + +#------------------------------------------------------------------------------ +# Check CanonRaw information +# Inputs: 0) ExifTool object reference, 1) tagInfo hash reference, +# 2) raw value reference +# Returns: error string or undef (and may change value) on success +sub CheckCanonRaw($$$) +{ + my ($et, $tagInfo, $valPtr) = @_; + my $tagName = $$tagInfo{Name}; + if ($tagName eq 'JpgFromRaw' or $tagName eq 'ThumbnailImage') { + unless ($$valPtr =~ /^\xff\xd8/ or $et->Options('IgnoreMinorErrors')) { + return '[Minor] Not a valid image'; + } + } else { + my $format = $$tagInfo{Format}; + my $count = $$tagInfo{Count}; + unless ($format) { + my $tagType = ($$tagInfo{TagID} >> 8) & 0x38; + $format = $crwTagFormat{$tagType}; + } + $format and return Image::ExifTool::CheckValue($valPtr, $format, $count); + } + return undef; +} + +#------------------------------------------------------------------------------ +# Write CR2 file +# Inputs: 0) ExifTool ref, 1) dirInfo reference (must have read first 16 bytes) +# 2) tag table reference +# Returns: true on success +sub WriteCR2($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt} or return 0; + my $outfile = $$dirInfo{OutFile} or return 0; + $$dirInfo{RAF} or return 0; + + # check CR2 signature + if ($$dataPt !~ /^.{8}CR\x02\0/s) { + my ($msg, $minor); + if ($$dataPt =~ /^.{8}CR/s) { + $msg = 'Unsupported Canon RAW file. May cause problems if rewritten'; + $minor = 1; + } elsif ($$dataPt =~ /^.{8}\xba\xb0\xac\xbb/s) { + $msg = 'Can not currently write Canon 1D RAW images'; + } else { + $msg = 'Unrecognized Canon RAW file'; + } + return 0 if $et->Error($msg, $minor); + } + + # CR2 has a 16-byte header + $$dirInfo{NewDataPos} = 16; + my $newData = $et->WriteDirectory($dirInfo, $tagTablePtr); + return 0 unless defined $newData; + unless ($$dirInfo{LastIFD}) { + $et->Error("CR2 image IFD may not be deleted"); + return 0; + } + + if (length($newData)) { + # build 16 byte header for Canon RAW file + my $header = substr($$dataPt, 0, 16); + # set IFD0 pointer (may not be 16 if edited by PhotoMechanic) + Set32u(16, \$header, 4); + # last 4 bytes of header is pointer to last IFD + Set32u($$dirInfo{LastIFD}, \$header, 12); + Write($outfile, $header, $newData) or return 0; + undef $newData; # free memory + + # copy over image data now if necessary + if (ref $$dirInfo{ImageData}) { + $et->CopyImageData($$dirInfo{ImageData}, $outfile) or return 0; + delete $$dirInfo{ImageData}; + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Write CanonRaw (CRW) information +# Inputs: 0) ExifTool object reference, 1) source dirInfo reference, +# 2) tag table reference +# Returns: true on success +# Notes: Increments ExifTool CHANGED flag for each tag changed This routine is +# different from all of the other write routines because Canon RAW files are +# designed well! So it isn't necessary to buffer the data in memory before +# writing it out. Therefore this routine doesn't return the directory data as +# the rest of the Write routines do. Instead, it writes to the dirInfo +# OutFile on the fly --> much faster, efficient, and less demanding on memory! +sub WriteCanonRaw($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to autoload this package + my $blockStart = $$dirInfo{DirStart}; + my $blockSize = $$dirInfo{DirLen}; + my $raf = $$dirInfo{RAF} or return 0; + my $outfile = $$dirInfo{OutFile} or return 0; + my $outPos = $$dirInfo{OutPos} or return 0; + my $outBase = $outPos; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my ($buff, $tagInfo); + + # 4 bytes at end of block give directory position within block + $raf->Seek($blockStart+$blockSize-4, 0) or return 0; + $raf->Read($buff, 4) == 4 or return 0; + my $dirOffset = Get32u(\$buff,0) + $blockStart; + $raf->Seek($dirOffset, 0) or return 0; + $raf->Read($buff, 2) == 2 or return 0; + my $entries = Get16u(\$buff,0); # get number of entries in directory + # read the directory (10 bytes per entry) + $raf->Read($buff, 10 * $entries) == 10 * $entries or return 0; + my $newDir = ''; + + # get hash of new information keyed by tagID + my $newTags = $et->GetNewTagInfoHash($tagTablePtr); + + # generate list of tags to add or delete (currently, we only allow JpgFromRaw + # and ThumbnailImage, to be added or deleted from the root CanonRaw directory) + my (@addTags, %delTag); + if ($$dirInfo{Nesting} == 0) { + my $tagID; + foreach $tagID (keys %$newTags) { + my $permanent = $newTags->{$tagID}->{Permanent}; + push(@addTags, $tagID) if defined($permanent) and not $permanent; + } + } + + my $index; + for ($index=0; ; ++$index) { + my ($pt, $tag, $size, $valuePtr, $ptr, $value); + if ($index<$entries) { + $pt = 10 * $index; + $tag = Get16u(\$buff, $pt); + $size = Get32u(\$buff, $pt+2); + $valuePtr = Get32u(\$buff, $pt+6); + $ptr = $valuePtr + $blockStart; # all pointers relative to block start + } + # add any required new tags + # NOTE: can't currently add tags where value is stored in directory + if (@addTags and (not defined($tag) or $tag >= $addTags[0])) { + my $addTag = shift @addTags; + $tagInfo = $$newTags{$addTag}; + my $newVal = $et->GetNewValue($tagInfo); + if (defined $newVal) { + # pad value to an even length (Canon ImageBrowser and ZoomBrowser + # version 6.1.1 have problems with odd-sized embedded JPEG images + # even if the value is padded to maintain alignment, so do this + # before calculating the size for the directory entry) + $newVal .= "\0" if length($newVal) & 0x01; + # add new directory entry + $newDir .= Set16u($addTag) . Set32u(length($newVal)) . + Set32u($outPos - $outBase); + # write new value data + Write($outfile, $newVal) or return 0; + $outPos += length($newVal); # update current position + $verbose > 1 and print $out " + CanonRaw:$$tagInfo{Name}\n"; + ++$$et{CHANGED}; + } + # set flag to delete this tag if found later + $delTag{$addTag} = 1; + } + last unless defined $tag; # all done if no more directory entries + return 0 if $tag & 0x8000; # top bit should not be set + my $tagID = $tag & 0x3fff; # get tag ID + my $tagType = ($tag >> 8) & 0x38; # get tag type + my $valueInDir = ($tag & 0x4000); # flag for value in directory + + my $tagInfo = $et->GetTagInfo($tagTablePtr,$tagID); + my $format = $crwTagFormat{$tagType}; + my ($count, $subdir); + if ($tagInfo) { + $subdir = $$tagInfo{SubDirectory}; + $format = $$tagInfo{Format} if $$tagInfo{Format}; + $count = $$tagInfo{Count}; + } + if ($valueInDir) { + $size = 8; + $value = substr($buff, $pt+2, $size); + # set count to 1 by default for normal values in directory + $count = 1 if not defined $count and $format and + $format ne 'string' and not $subdir; + } else { + if ($tagType==0x28 or $tagType==0x30) { + # this type of tag specifies a raw subdirectory + my $name; + $tagInfo and $name = $$tagInfo{Name}; + $name or $name = sprintf("CanonRaw_0x%.4x", $tagID); + my %subdirInfo = ( + DirName => $name, + DataLen => 0, + DirStart => $ptr, + DirLen => $size, + Nesting => $$dirInfo{Nesting} + 1, + RAF => $raf, + Parent => $$dirInfo{DirName}, + OutFile => $outfile, + OutPos => $outPos, + ); + my $result = $et->WriteDirectory(\%subdirInfo, $tagTablePtr); + return 0 unless $result; + # set size and pointer for this new directory + $size = $subdirInfo{OutPos} - $outPos; + $valuePtr = $outPos - $outBase; + $outPos = $subdirInfo{OutPos}; + } else { + # verify that the value data is within this block + $valuePtr + $size <= $blockSize or return 0; + # read value from file + $raf->Seek($ptr, 0) or return 0; + $raf->Read($value, $size) == $size or return 0; + } + } + # set count from tagInfo count if necessary + if ($format and not $count) { + # set count according to format and size + my $fnum = $Image::ExifTool::Exif::formatNumber{$format}; + my $fsiz = $Image::ExifTool::Exif::formatSize[$fnum]; + $count = int($size / $fsiz); + } + # edit subdirectory if necessary + if ($tagInfo) { + if ($subdir and $$subdir{TagTable}) { + my $name = $$tagInfo{Name}; + my $newTagTable = Image::ExifTool::GetTagTable($$subdir{TagTable}); + return 0 unless $newTagTable; + my $subdirStart = 0; + #### eval Start () + $subdirStart = eval $$subdir{Start} if $$subdir{Start}; + my $dirData = \$value; + my %subdirInfo = ( + Name => $name, + DataPt => $dirData, + DataLen => $size, + DirStart => $subdirStart, + DirLen => $size - $subdirStart, + Nesting => $$dirInfo{Nesting} + 1, + RAF => $raf, + Parent => $$dirInfo{DirName}, + ); + #### eval Validate ($dirData, $subdirStart, $size) + if (defined $$subdir{Validate} and not eval $$subdir{Validate}) { + $et->Warn("Invalid $name data"); + } else { + $subdir = $et->WriteDirectory(\%subdirInfo, $newTagTable); + if (defined $subdir and length $subdir) { + if ($subdirStart) { + # add header before data directory + $value = substr($value, 0, $subdirStart) . $subdir; + } else { + $value = $subdir; + } + } + } + } elsif ($$newTags{$tagID}) { + if ($delTag{$tagID}) { + $verbose > 1 and print $out " - CanonRaw:$$tagInfo{Name}\n"; + ++$$et{CHANGED}; + next; # next since we already added this tag + } + my $oldVal; + if ($format) { + $oldVal = ReadValue(\$value, 0, $format, $count, $size); + } else { + $oldVal = $value; + } + my $nvHash = $et->GetNewValueHash($tagInfo); + if ($et->IsOverwriting($nvHash, $oldVal)) { + my $newVal = $et->GetNewValue($nvHash); + my $verboseVal; + $verboseVal = $newVal if $verbose > 1; + # convert to specified format if necessary + if (defined $newVal and $format) { + $newVal = WriteValue($newVal, $format, $count); + } + if (defined $newVal) { + $value = $newVal; + ++$$et{CHANGED}; + $et->VerboseValue("- CanonRaw:$$tagInfo{Name}", $oldVal); + $et->VerboseValue("+ CanonRaw:$$tagInfo{Name}", $verboseVal); + } + } + } + } + if ($valueInDir) { + my $len = length $value; + if ($len < 8) { + # pad with original garbage in case it contained something useful + $value .= substr($buff, $pt+2+8-$len, 8-$len); + } elsif ($len > 8) { # this shouldn't happen + warn "Value too long! -- truncated\n"; + $value = substr($value, 0, 8); + } + # create new directory entry + $newDir .= Set16u($tag) . $value; + next; # all done this entry + } + if (defined $value) { + # don't allow value to change length unless Writable is 'resize' + my $writable = $$tagInfo{Writable}; + my $diff = length($value) - $size; + if ($diff) { + if ($writable and $writable eq 'resize') { + $size += $diff; # allow size to change + } elsif ($diff > 0) { + $value .= ("\0" x $diff); + } else { + $value = substr($value, 0, $size); + } + } + # pad value if necessary to align on even-byte boundary (as per CIFF spec) + $value .= "\0" if $size & 0x01; + $valuePtr = $outPos - $outBase; + # write out value data + Write($outfile, $value) or return 0; + $outPos += length($value); # update current position in outfile + } + # create new directory entry + $newDir .= Set16u($tag) . Set32u($size) . Set32u($valuePtr); + } + # add the directory counts and offset to the directory start, + $entries = length($newDir) / 10; + $newDir = Set16u($entries) . $newDir . Set32u($outPos - $outBase); + # write directory data + Write($outfile, $newDir) or return 0; + + # update current output file position in dirInfo + $$dirInfo{OutPos} = $outPos + length($newDir); + # save outfile directory start (needed for rewriting VRD trailer) + $$dirInfo{OutDirStart} = $outPos - $outBase; + + return 1; +} + +#------------------------------------------------------------------------------ +# write Canon RAW (CRW) file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid CRW file, +# or -1 if a write error occurred +sub WriteCRW($$) +{ + my ($et, $dirInfo) = @_; + my $outfile = $$dirInfo{OutFile}; + my $raf = $$dirInfo{RAF}; + my $rtnVal = 0; + my ($buff, $err, $sig); + + $raf->Read($buff,2) == 2 or return 0; + SetByteOrder($buff) or return 0; + $raf->Read($buff,4) == 4 or return 0; + $raf->Read($sig,8) == 8 or return 0; # get file signature + $sig =~ /^HEAP(CCDR|JPGM)/ or return 0; # validate signature + my $type = $1; + my $hlen = Get32u(\$buff, 0); # get header length + + if ($$et{DEL_GROUP}{MakerNotes}) { + if ($type eq 'CCDR') { + $et->Error("Can't delete MakerNotes from CRW"); + return 0; + } else { + ++$$et{CHANGED}; + return 1; + } + } + # make XMP the preferred group for CRW files + if ($$et{FILE_TYPE} eq 'CRW') { + $et->InitWriteDirs(\%crwMap, 'XMP'); + } + + # write header + $raf->Seek(0, 0) or return 0; + $raf->Read($buff, $hlen) == $hlen or return 0; + Write($outfile, $buff) or $err = 1; + + $raf->Seek(0, 2) or return 0; # seek to end of file + my $filesize = $raf->Tell() or return 0; + + # build directory information for main raw directory + my %dirInfo = ( + DataLen => 0, + DirStart => $hlen, + DirLen => $filesize - $hlen, + Nesting => 0, + RAF => $raf, + Parent => 'CRW', + OutFile => $outfile, + OutPos => $hlen, + ); + # process the raw directory + my $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::CanonRaw::Main'); + my $success = $et->WriteDirectory(\%dirInfo, $tagTablePtr); + + my $trailPt; + while ($success) { + # check to see if trailer(s) exist(s) + my $trailInfo = Image::ExifTool::IdentifyTrailer($raf) or last; + # rewrite the trailer(s) + $buff = ''; + $$trailInfo{OutFile} = \$buff; + $success = $et->ProcessTrailers($trailInfo) or last; + $trailPt = $$trailInfo{OutFile}; + # nothing to write if trailers were deleted + undef $trailPt if length($$trailPt) < 4; + last; + } + if ($success) { + # add CanonVRD trailer if writing as a block + $trailPt = $et->AddNewTrailers($trailPt,'CanonVRD'); + if (not $trailPt and $$et{ADD_DIRS}{CanonVRD}) { + # create CanonVRD from scratch if necessary + my $outbuff = ''; + my $saveOrder = GetByteOrder(); + require Image::ExifTool::CanonVRD; + if (Image::ExifTool::CanonVRD::ProcessCanonVRD($et, { OutFile => \$outbuff }) > 0) { + $trailPt = \$outbuff; + } + SetByteOrder($saveOrder); + } + # write trailer + if ($trailPt) { + # must append DirStart pointer to end of trailer + my $newDirStart = Set32u($dirInfo{OutDirStart}); + my $len = length $$trailPt; + my $pad = ($len & 0x01) ? ' ' : ''; # add pad byte if necessary + Write($outfile, $pad, substr($$trailPt,0,$len-4), $newDirStart) or $err = 1; + } + $rtnVal = $err ? -1 : 1; + } else { + $et->Error('Error rewriting CRW file'); + } + return $rtnVal; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::WriteCanonRaw.pl - Write Canon RAW (CRW and CR2) information + +=head1 SYNOPSIS + +These routines are autoloaded by Image::ExifTool::CanonRaw. + +=head1 DESCRIPTION + +This file contains routines used by ExifTool to write Canon CRW and CR2 +files and metadata. + +=head1 NOTES + +The CRW format is a pleasure to work with. All pointer offsets are relative +to the start of the data for each directory. If EXIF/TIFF had implemented +pointers in this way, it would be MUCH easier to read and write TIFF and +JPEG files, and would lead to far fewer problems with corrupted metadata. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::CanonRaw(3pm)|Image::ExifTool::CanonRaw>, +L<Image::ExifTool(3pm)|Image::ExifTool>, +L<https://exiftool.org/canon_raw.html> + +=cut diff --git a/lib/Image/ExifTool/WriteExif.pl b/lib/Image/ExifTool/WriteExif.pl new file mode 100644 index 0000000..fe18716 --- /dev/null +++ b/lib/Image/ExifTool/WriteExif.pl @@ -0,0 +1,2576 @@ +#------------------------------------------------------------------------------ +# File: WriteExif.pl +# +# Description: Write EXIF meta information +# +# Revisions: 12/13/2004 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::Exif; + +use strict; +use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber + %compression %photometricInterpretation %orientation); + +use Image::ExifTool::Fixup; + +# some information may be stored in different IFD's with the same meaning. +# Use this lookup to decide when we should delete information that is stored +# in another IFD when we write it to the preferred IFD. +my %crossDelete = ( + ExifIFD => 'IFD0', + IFD0 => 'ExifIFD', +); + +# mandatory tag default values +my %mandatory = ( + IFD0 => { + 0x011a => 72, # XResolution + 0x011b => 72, # YResolution + 0x0128 => 2, # ResolutionUnit (inches) + 0x0213 => 1, # YCbCrPositioning (centered) + # 0x8769 => ????, # ExifOffset + }, + IFD1 => { + 0x0103 => 6, # Compression (JPEG) + 0x011a => 72, # XResolution + 0x011b => 72, # YResolution + 0x0128 => 2, # ResolutionUnit (inches) + }, + ExifIFD => { + 0x9000 => '0232', # ExifVersion + 0x9101 => "1 2 3 0",# ComponentsConfiguration + 0xa000 => '0100', # FlashpixVersion + 0xa001 => 0xffff, # ColorSpace (uncalibrated) + # 0xa002 => ????, # ExifImageWidth + # 0xa003 => ????, # ExifImageHeight + }, + GPS => { + 0x0000 => '2 3 0 0',# GPSVersionID + }, + InteropIFD => { + 0x0002 => '0100', # InteropVersion + }, +); + +#------------------------------------------------------------------------------ +# Inverse print conversion for LensInfo +# Inputs: 0) lens info string +# Returns: PrintConvInv of string +sub ConvertLensInfo($) +{ + my $val = shift; + my @a = GetLensInfo($val, 1); # (allow unknown "?" values) + return @a ? join(' ', @a) : $val; +} + +#------------------------------------------------------------------------------ +# Get binary CFA Pattern from a text string +# Inputs: Print-converted CFA pattern (eg. '[Blue,Green][Green,Red]') +# Returns: CFA pattern as a string of numbers +sub GetCFAPattern($) +{ + my $val = shift; + my @rows = split /\]\s*\[/, $val; + @rows or warn("Rows not properly bracketed by '[]'\n"), return undef; + my @cols = split /,/, $rows[0]; + @cols or warn("Colors not separated by ','\n"), return undef; + my $ny = @cols; + my @a = (scalar(@rows), scalar(@cols)); + my %cfaLookup = (red=>0, green=>1, blue=>2, cyan=>3, magenta=>4, yellow=>5, white=>6); + my $row; + foreach $row (@rows) { + @cols = split /,/, $row; + @cols == $ny or warn("Inconsistent number of colors in each row\n"), return undef; + foreach (@cols) { + tr/ \]\[//d; # remove remaining brackets and any spaces + my $c = $cfaLookup{lc($_)}; + defined $c or warn("Unknown color '${_}'\n"), return undef; + push @a, $c; + } + } + return "@a"; +} + +#------------------------------------------------------------------------------ +# validate raw values for writing +# Inputs: 0) ExifTool ref, 1) tagInfo hash ref, 2) raw value ref +# Returns: error string or undef (and possibly changes value) on success +sub CheckExif($$$) +{ + my ($et, $tagInfo, $valPtr) = @_; + my $format = $$tagInfo{Format} || $$tagInfo{Writable} || $$tagInfo{Table}{WRITABLE}; + if (not $format or $format eq '1') { + if ($$tagInfo{Groups}{0} eq 'MakerNotes') { + return undef; # OK to have no format for makernotes + } else { + return 'No writable format'; + } + } + return Image::ExifTool::CheckValue($valPtr, $format, $$tagInfo{Count}); +} + +#------------------------------------------------------------------------------ +# encode exif ASCII/Unicode text from UTF8 or Latin +# Inputs: 0) ExifTool ref, 1) text string +# Returns: encoded string +# Note: MUST be called Raw conversion time so the EXIF byte order is known! +sub EncodeExifText($$) +{ + my ($et, $val) = @_; + # does the string contain special characters? + if ($val =~ /[\x80-\xff]/) { + my $order = $et->GetNewValue('ExifUnicodeByteOrder'); + return "UNICODE\0" . $et->Encode($val,'UTF16',$order); + } else { + return "ASCII\0\0\0$val"; + } +} + +#------------------------------------------------------------------------------ +# rebuild maker notes to properly contain all value data +# (some manufacturers put value data outside maker notes!!) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: new maker note data (and creates MAKER_NOTE_FIXUP), or undef on error +sub RebuildMakerNotes($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dirStart = $$dirInfo{DirStart}; + my $dirLen = $$dirInfo{DirLen}; + my $dataPt = $$dirInfo{DataPt}; + my $dataPos = $$dirInfo{DataPos} || 0; + my $rtnValue; + my %subdirInfo = %$dirInfo; + + delete $$et{MAKER_NOTE_FIXUP}; + + # don't need to rebuild text, BinaryData or PreviewImage maker notes + my $tagInfo = $$dirInfo{TagInfo}; + my $subdir = $$tagInfo{SubDirectory}; + my $proc = $$subdir{ProcessProc} || $$tagTablePtr{PROCESS_PROC} || \&ProcessExif; + if (($proc ne \&ProcessExif and $$tagInfo{Name} =~ /Text/) or + $proc eq \&Image::ExifTool::ProcessBinaryData or + ($$tagInfo{PossiblePreview} and $dirLen > 6 and + substr($$dataPt, $dirStart, 3) eq "\xff\xd8\xff")) + { + return substr($$dataPt, $dirStart, $dirLen); + } + my $saveOrder = GetByteOrder(); + my $loc = Image::ExifTool::MakerNotes::LocateIFD($et,\%subdirInfo); + if (defined $loc) { + my $makerFixup = $subdirInfo{Fixup} = new Image::ExifTool::Fixup; + # create new exiftool object to rewrite the directory without changing it + my $newTool = new Image::ExifTool; + $newTool->Options( + IgnoreMinorErrors => $$et{OPTIONS}{IgnoreMinorErrors}, + FixBase => $$et{OPTIONS}{FixBase}, + ); + $newTool->Init(); # must do this before calling WriteDirectory()! + # don't copy over preview image + $newTool->SetNewValue(PreviewImage => ''); + # copy all transient members over in case they are used for writing + # (Make, Model, etc) + foreach (grep /[a-z]/, keys %$et) { + $$newTool{$_} = $$et{$_}; + } + # fix base offsets if specified + $newTool->Options(FixBase => $et->Options('FixBase')); + # set GENERATE_PREVIEW_INFO flag so PREVIEW_INFO will be generated + $$newTool{GENERATE_PREVIEW_INFO} = 1; + # drop any large tags + $$newTool{DropTags} = 1; + # initialize other necessary data members + $$newTool{FILE_TYPE} = $$et{FILE_TYPE}; + $$newTool{TIFF_TYPE} = $$et{TIFF_TYPE}; + # rewrite maker notes + $rtnValue = $newTool->WriteDirectory(\%subdirInfo, $tagTablePtr); + if (defined $rtnValue and length $rtnValue) { + # add the dummy/empty preview image if necessary + if ($$newTool{PREVIEW_INFO}) { + $makerFixup->SetMarkerPointers(\$rtnValue, 'PreviewImage', length($rtnValue)); + $rtnValue .= $$newTool{PREVIEW_INFO}{Data}; + delete $$newTool{PREVIEW_INFO}; + } + # add makernote header + if ($loc) { + my $hdr = substr($$dataPt, $dirStart, $loc); + # special case: convert Pentax/Samsung DNG maker notes to JPEG style + # (in JPEG, Pentax makernotes are absolute and start with "AOC\0" for some + # models, but in DNG images they are stored in tag 0xc634 of IFD0 and + # start with either "PENTAX \0" or "SAMSUNG\0") + if ($$dirInfo{Parent} eq 'IFD0' and $hdr =~ /^(PENTAX |SAMSUNG)\0/) { + # convert to JPEG-style AOC maker notes if used by this model + # (Note: this expression also appears in Exif.pm) + if ($$et{Model} =~ /\b(K(-[57mrx]|(10|20|100|110|200)D|2000)|GX(10|20))\b/) { + $hdr =~ s/^(PENTAX |SAMSUNG)\0/AOC\0/; + # save fixup because AOC maker notes have absolute offsets + $$et{MAKER_NOTE_FIXUP} = $makerFixup; + } + } + $rtnValue = $hdr . $rtnValue; + # adjust fixup for shift in start position + $$makerFixup{Start} += length $hdr; + } + # shift offsets according to original position of maker notes, + # and relative to the makernotes Base + $$makerFixup{Shift} += $dataPos + $dirStart + + $$dirInfo{Base} - $subdirInfo{Base}; + # repair incorrect offsets if offsets were fixed + $$makerFixup{Shift} += $subdirInfo{FixedBy} || 0; + # fix up pointers to the specified offset + $makerFixup->ApplyFixup(\$rtnValue); + # save fixup information unless offsets were relative + unless ($subdirInfo{Relative}) { + # set shift so offsets are all relative to start of maker notes + $$makerFixup{Shift} -= $dataPos + $dirStart; + $$et{MAKER_NOTE_FIXUP} = $makerFixup; # save fixup for later + } + } + } + SetByteOrder($saveOrder); + + return $rtnValue; +} + +#------------------------------------------------------------------------------ +# Sort IFD directory entries +# Inputs: 0) data reference, 1) directory start, 2) number of entries, +# 3) flag to treat 0 as a valid tag ID (as opposed to an empty IFD entry) +sub SortIFD($$$;$) +{ + my ($dataPt, $dirStart, $numEntries, $allowZero) = @_; + my ($index, %entries); + # split the directory into separate entries + for ($index=0; $index<$numEntries; ++$index) { + my $entry = $dirStart + 2 + 12 * $index; + my $tagID = Get16u($dataPt, $entry); + my $entryData = substr($$dataPt, $entry, 12); + # silly software can pad directories with zero entries -- put these at the end + $tagID = 0x10000 unless $tagID or $index == 0 or $allowZero; + # add new entry (allow for duplicate tag ID's, which shouldn't normally happen) + if ($entries{$tagID}) { + $entries{$tagID} .= $entryData; + } else { + $entries{$tagID} = $entryData; + } + } + # sort the directory entries + my @sortedTags = sort { $a <=> $b } keys %entries; + # generate the sorted IFD + my $newDir = ''; + foreach (@sortedTags) { + $newDir .= $entries{$_}; + } + # replace original directory with new, sorted one + substr($$dataPt, $dirStart + 2, 12 * $numEntries) = $newDir; +} + +#------------------------------------------------------------------------------ +# Validate IFD entries (strict validation to test possible chained IFD's) +# Inputs: 0) dirInfo ref (must have RAF set), 1) optional DirStart +# Returns: true if IFD looks OK +sub ValidateIFD($;$) +{ + my ($dirInfo, $dirStart) = @_; + my $raf = $$dirInfo{RAF} or return 0; + my $base = $$dirInfo{Base}; + $dirStart = $$dirInfo{DirStart} || 0 unless defined $dirStart; + my $offset = $dirStart + ($$dirInfo{DataPos} || 0); + my ($buff, $index); + $raf->Seek($offset + $base, 0) and $raf->Read($buff,2) == 2 or return 0; + my $numEntries = Get16u(\$buff,0); + $numEntries > 1 and $numEntries < 64 or return 0; + my $len = 12 * $numEntries; + $raf->Read($buff, $len) == $len or return 0; + my $lastID = -1; + for ($index=0; $index<$numEntries; ++$index) { + my $entry = 12 * $index; + my $tagID = Get16u(\$buff, $entry); + $tagID > $lastID or $$dirInfo{AllowOutOfOrderTags} or return 0; + my $format = Get16u(\$buff, $entry+2); + $format > 0 and $format <= 13 or return 0; + my $count = Get32u(\$buff, $entry+4); + $count > 0 or return 0; + $lastID = $tagID; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Get sorted list of offsets used in IFD +# Inputs: 0) data ref, 1) directory start, 2) dataPos, 3) IFD entries, 4) tag table ref +# Returns: 0) sorted list of offsets (only offsets after the end of the IFD) +# 1) hash of list indices keyed by offset value +# Notes: This is used in a patch to fix the count for tags in Kodak SubIFD3 +sub GetOffList($$$$$) +{ + my ($dataPt, $dirStart, $dataPos, $numEntries, $tagTablePtr) = @_; + my $ifdEnd = $dirStart + 2 + 12 * $numEntries + $dataPos; + my ($index, $offset, %offHash); + for ($index=0; $index<$numEntries; ++$index) { + my $entry = $dirStart + 2 + 12 * $index; + my $format = Get16u($dataPt, $entry + 2); + next if $format < 1 or $format > 13; + my $count = Get16u($dataPt, $entry + 4); + my $size = $formatSize[$format] * $count; + if ($size <= 4) { + my $tagID = Get16u($dataPt, $entry); + next unless ref $$tagTablePtr{$tagID} eq 'HASH' and $$tagTablePtr{$tagID}{FixCount}; + } + my $offset = Get16u($dataPt, $entry + 8); + $offHash{$offset} = 1 if $offset >= $ifdEnd; + } + # set offset hash values to indices in list + my @offList = sort keys %offHash; + $index = 0; + foreach $offset (@offList) { + $offHash{$offset} = $index++; + } + return(\@offList, \%offHash); +} + +#------------------------------------------------------------------------------ +# Update TIFF_END member if defined +# Inputs: 0) ExifTool ref, 1) end of valid TIFF data +sub UpdateTiffEnd($$) +{ + my ($et, $end) = @_; + if (defined $$et{TIFF_END} and + $$et{TIFF_END} < $end) + { + $$et{TIFF_END} = $end; + } +} + +#------------------------------------------------------------------------------ +# Validate image data size +# Inputs: 0) ExifTool ref, 1) validate info hash ref, +# 2) flag to issue error (ie. we're writing) +# - issues warning or error if problems found +sub ValidateImageData($$$;$) +{ + local $_; + my ($et, $vInfo, $dirName, $errFlag) = @_; + + # determine the expected size of the image data for an uncompressed image + # (0x102 BitsPerSample, 0x103 Compression and 0x115 SamplesPerPixel + # all default to a value of 1 if they don't exist) + if ((not defined $$vInfo{0x103} or $$vInfo{0x103} eq '1') and + $$vInfo{0x100} and $$vInfo{0x101} and ($$vInfo{0x117} or $$vInfo{0x145})) + { + my $samplesPerPix = $$vInfo{0x115} || 1; + my @bitsPerSample = $$vInfo{0x102} ? split(' ',$$vInfo{0x102}) : (1) x $samplesPerPix; + my $byteCountInfo = $$vInfo{0x117} || $$vInfo{0x145}; + my $byteCounts = $$byteCountInfo[1]; + my $totalBytes = 0; + $totalBytes += $_ foreach split ' ', $byteCounts; + my $minor; + $minor = 1 if $$et{DOC_NUM} or $$et{FILE_TYPE} ne 'TIFF'; + unless (@bitsPerSample == $samplesPerPix) { + unless ($$et{FILE_TYPE} eq 'EPS' and @bitsPerSample == 1) { + # (just a warning for this problem) + my $s = $samplesPerPix eq '1' ? '' : 's'; + $et->Warn("$dirName BitsPerSample should have $samplesPerPix value$s", $minor); + } + push @bitsPerSample, $bitsPerSample[0] while @bitsPerSample < $samplesPerPix; + foreach (@bitsPerSample) { + $et->WarnOnce("$dirName BitsPerSample values are different", $minor) if $_ ne $bitsPerSample[0]; + $et->WarnOnce("Invalid $dirName BitsPerSample value", $minor) if $_ < 1 or $_ > 32; + } + } + my $bitsPerPixel = 0; + $bitsPerPixel += $_ foreach @bitsPerSample; + my $expectedBytes = int(($$vInfo{0x100} * $$vInfo{0x101} * $bitsPerPixel + 7) / 8); + if ($expectedBytes != $totalBytes and + # (this problem seems normal for certain types of RAW files...) + $$et{TIFF_TYPE} !~ /^(K25|KDC|MEF|ORF|SRF)$/) + { + my ($adj, $minor); + if ($expectedBytes > $totalBytes) { + $adj = 'Under'; # undersized is a bigger problem because we may lose data + $minor = 0 unless $errFlag; + } else { + $adj = 'Over'; + $minor = 1; + } + my $msg = "${adj}sized $dirName $$byteCountInfo[0]{Name} ($totalBytes bytes, but expected $expectedBytes)"; + if (not defined $minor) { + # this is a serious error if we are writing the file and there + # is a chance that we may not copy all of the image data + # (but make it minor to allow the file to be written anyway) + $et->Error($msg, 1); + } else { + $et->Warn($msg, $minor); + } + } + } +} + +#------------------------------------------------------------------------------ +# Handle error while writing EXIF +# Inputs: 0) ExifTool ref, 1) error string, 2) tag table ref +# Returns: undef on fatal error, or '' if minor error is ignored +sub ExifErr($$$) +{ + my ($et, $errStr, $tagTablePtr) = @_; + # MakerNote errors are minor by default + my $minor = ($$tagTablePtr{GROUPS}{0} eq 'MakerNotes' or $$et{FILE_TYPE} eq 'MOV'); + if ($$tagTablePtr{VARS} and $$tagTablePtr{VARS}{MINOR_ERRORS}) { + $et->Warn("$errStr. IFD dropped.") and return '' if $minor; + $minor = 1; + } + return undef if $et->Error($errStr, $minor); + return ''; +} + +#------------------------------------------------------------------------------ +# Read/Write IFD with TIFF-like header (used by DNG 1.2) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: Reading: 1 on success, otherwise returns 0 and sets a Warning +# Writing: new data block or undef on error +sub ProcessTiffIFD($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access + my $raf = $$dirInfo{RAF}; + my $base = $$dirInfo{Base} || 0; + my $dirName = $$dirInfo{DirName}; + my $magic = $$dirInfo{Subdir}{Magic} || 0x002a; + my $buff; + + # structured with a TIFF-like header and relative offsets + $raf->Seek($base, 0) and $raf->Read($buff, 8) == 8 or return 0; + unless (SetByteOrder(substr($buff,0,2)) and Get16u(\$buff, 2) == $magic) { + my $msg = "Invalid $dirName header"; + if ($$dirInfo{IsWriting}) { + $et->Error($msg); + return undef; + } else { + $et->Warn($msg); + return 0; + } + } + my $offset = Get32u(\$buff, 4); + my %dirInfo = ( + DirName => $$dirInfo{DirName}, + Parent => $$dirInfo{Parent}, + Base => $base, + DataPt => \$buff, + DataLen => length $buff, + DataPos => 0, + DirStart => $offset, + DirLen => length($buff) - $offset, + RAF => $raf, + NewDataPos => 8, + ); + if ($$dirInfo{IsWriting}) { + # rewrite the Camera Profile IFD + my $newDir = WriteExif($et, \%dirInfo, $tagTablePtr); + # don't add header if error writing directory ($newDir is undef) + # or if directory is being deleted ($newDir is empty) + return $newDir unless $newDir; + # return directory with TIFF-like header + return GetByteOrder() . Set16u($magic) . Set32u(8) . $newDir; + } + if ($$et{HTML_DUMP}) { + my $tip = sprintf("Byte order: %s endian\nIdentifier: 0x%.4x\n%s offset: 0x%.4x", + (GetByteOrder() eq 'II') ? 'Little' : 'Big', $magic, $dirName, $offset); + $et->HDump($base, 8, "$dirName header", $tip, 0); + } + return ProcessExif($et, \%dirInfo, $tagTablePtr); +} + +#------------------------------------------------------------------------------ +# Write EXIF directory +# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref +# Returns: Exif data block (may be empty if no Exif data) or undef on error +# Notes: Increments ExifTool CHANGED flag for each tag changed. Also updates +# TIFF_END if defined with location of end of original TIFF image. +# Returns IFD data in the following order: +# 1. IFD0 directory followed by its data +# 2. SubIFD directory followed by its data, thumbnail and image +# 3. GlobalParameters, EXIF, GPS, Interop IFD's each with their data +# 4. IFD1,IFD2,... directories each followed by their data +# 5. Thumbnail and/or image data for each IFD, with IFD0 image last +sub WriteExif($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to autoload this package + my $origDirInfo = $dirInfo; # save original dirInfo + my $dataPt = $$dirInfo{DataPt}; + unless ($dataPt) { + my $emptyData = ''; + $dataPt = \$emptyData; + } + my $dataPos = $$dirInfo{DataPos} || 0; + my $dirStart = $$dirInfo{DirStart} || 0; + my $dataLen = $$dirInfo{DataLen} || length($$dataPt); + my $dirLen = $$dirInfo{DirLen} || ($dataLen - $dirStart); + my $base = $$dirInfo{Base} || 0; + my $firstBase = $base; + my $raf = $$dirInfo{RAF}; + my $dirName = $$dirInfo{DirName} || 'unknown'; + my $fixup = $$dirInfo{Fixup} || new Image::ExifTool::Fixup; + my $imageDataFlag = $$dirInfo{ImageData} || ''; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my ($nextIfdPos, %offsetData, $inMakerNotes); + my (@offsetInfo, %validateInfo, %xDelete, $strEnc); + my $deleteAll = 0; + my $newData = ''; # initialize buffer to receive new directory data + my @imageData; # image data blocks to copy later if requested + my $name = $$dirInfo{Name}; + $name = $dirName unless $name and $dirName eq 'MakerNotes' and $name !~ /^MakerNote/; + + # save byte order of existing EXIF + $$et{SaveExifByteOrder} = GetByteOrder() if $dirName eq 'IFD0' or $dirName eq 'ExifIFD'; + + # set encoding for strings + $strEnc = $et->Options('CharsetEXIF') if $$tagTablePtr{GROUPS}{0} eq 'EXIF'; + + # allow multiple IFD's in IFD0-IFD1-IFD2... chain + $$dirInfo{Multi} = 1 if $dirName =~ /^(IFD0|SubIFD)$/ and not defined $$dirInfo{Multi}; + $inMakerNotes = 1 if $$tagTablePtr{GROUPS}{0} eq 'MakerNotes'; + my $ifd; + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# loop through each IFD +# + for ($ifd=0; ; ++$ifd) { # loop through multiple IFD's + + # make sure that Compression and SubfileType are defined for this IFD (for Condition's) + $$et{Compression} = $$et{SubfileType} = ''; + + # save pointer to start of this IFD within the newData + my $newStart = length($newData); + my @subdirs; # list of subdirectory data and tag table pointers + # determine if directory is contained within our data + my $mustRead; + if ($dirStart < 0 or $dirStart > $dataLen-2) { + $mustRead = 1; + } elsif ($dirLen >= 2) { + my $len = 2 + 12 * Get16u($dataPt, $dirStart); + $mustRead = 1 if $dirStart + $len > $dataLen; + } + # read IFD from file if necessary + if ($mustRead) { + if ($raf) { + # read the count of entries in this IFD + my $offset = $dirStart + $dataPos; + my ($buff, $buf2); + unless ($raf->Seek($offset + $base, 0) and $raf->Read($buff,2) == 2) { + return ExifErr($et, "Bad IFD or truncated file in $name", $tagTablePtr); + } + my $len = 12 * Get16u(\$buff,0); + # (also read next IFD pointer if available) + unless ($raf->Read($buf2, $len+4) >= $len) { + return ExifErr($et, "Error reading $name", $tagTablePtr); + } + $buff .= $buf2; + # make copy of dirInfo since we're going to modify it + my %newDirInfo = %$dirInfo; + $dirInfo = \%newDirInfo; + # update directory parameters for the newly loaded IFD + $dataPt = $$dirInfo{DataPt} = \$buff; + $dirStart = $$dirInfo{DirStart} = 0; + $dataPos = $$dirInfo{DataPos} = $offset; + $dataLen = $$dirInfo{DataLen} = length $buff; + $dirLen = $$dirInfo{DirLen} = $dataLen; + # only account for nextIFD pointer if we are going to use it + $len += 4 if $dataLen==$len+6 and ($$dirInfo{Multi} or $buff =~ /\0{4}$/); + UpdateTiffEnd($et, $offset+$base+2+$len); + } elsif ($dirLen and $dirStart + 4 >= $dataLen) { + # error if we can't load IFD (unless we are creating + # from scratch, in which case dirLen will be zero) + my $str = $et->Options('IgnoreMinorErrors') ? 'Deleted bad' : 'Bad'; + $et->Error("$str $name directory", 1); + } + } + my ($index, $dirEnd, $numEntries); + if ($dirStart + 4 < $dataLen) { + $numEntries = Get16u($dataPt, $dirStart); + $dirEnd = $dirStart + 2 + 12 * $numEntries; + if ($dirEnd > $dataLen) { + my $n = int(($dataLen - $dirStart - 2) / 12); + my $rtn = ExifErr($et, "Truncated $name directory", $tagTablePtr); + return undef unless $n and defined $rtn; + $numEntries = $n; # continue processing the entries we have + } + # sort entries if necessary (but not in maker notes IFDs) + unless ($inMakerNotes) { + my $lastID = -1; + for ($index=0; $index<$numEntries; ++$index) { + my $tagID = Get16u($dataPt, $dirStart + 2 + 12 * $index); + # check for proper sequence (but ignore null entries at end) + if ($tagID < $lastID and ($tagID or $$tagTablePtr{0})) { + SortIFD($dataPt, $dirStart, $numEntries, $$tagTablePtr{0}); + $et->Warn("Entries in $name were out of sequence. Fixed.",1); + last; + } + $lastID = $tagID; + } + } + } else { + $numEntries = 0; + $dirEnd = $dirStart; + } + + # loop through new values and accumulate all information for this IFD + my (%set, %mayDelete, $tagInfo); + my $wrongDir = $crossDelete{$dirName}; + my @newTagInfo = $et->GetNewTagInfoList($tagTablePtr); + foreach $tagInfo (@newTagInfo) { + my $tagID = $$tagInfo{TagID}; + # must evaluate Condition later when we have all DataMember's available + $set{$tagID} = (ref $$tagTablePtr{$tagID} eq 'ARRAY' or $$tagInfo{Condition}) ? '' : $tagInfo; + } + + # fix base offsets (some cameras incorrectly write maker notes in IFD0) + if ($dirName eq 'MakerNotes' and $$dirInfo{Parent} =~ /^(ExifIFD|IFD0)$/ and + $$et{TIFF_TYPE} !~ /^(ARW|SR2)$/ and not $$et{LeicaTrailerPos} and + Image::ExifTool::MakerNotes::FixBase($et, $dirInfo)) + { + # update local variables from fixed values + $base = $$dirInfo{Base}; + $dataPos = $$dirInfo{DataPos}; + # changed if ForceWrite tag was was set to "FixBase" + ++$$et{CHANGED} if $$et{FORCE_WRITE}{FixBase}; + if ($$et{TIFF_TYPE} eq 'SRW' and $$et{Make} eq 'SAMSUNG' and $$et{Model} eq 'EK-GN120') { + $et->Error("EK-GN120 SRW files are too buggy to write"); + } + } + + # initialize variables to handle mandatory tags + my $mandatory = $mandatory{$dirName}; + my ($allMandatory, $addMandatory); + if ($mandatory) { + # use X/Y resolution values from JFIF if available + if ($dirName eq 'IFD0' and defined $$et{JFIFYResolution}) { + my %ifd0Vals = %$mandatory; + $ifd0Vals{0x011a} = $$et{JFIFXResolution}; + $ifd0Vals{0x011b} = $$et{JFIFYResolution}; + $ifd0Vals{0x0128} = $$et{JFIFResolutionUnit} + 1; + $mandatory = \%ifd0Vals; + } + $allMandatory = $addMandatory = 0; # initialize to zero + # add mandatory tags if creating a new directory + unless ($numEntries) { + foreach (keys %$mandatory) { + defined $set{$_} or $set{$_} = $$tagTablePtr{$_}; + } + } + } else { + undef $deleteAll; # don't remove directory (no mandatory entries) + } + my ($addDirs, @newTags); + if ($inMakerNotes) { + $addDirs = { }; # can't currently add new directories in MakerNotes + # allow non-permanent makernotes tags to be added + # (note: we may get into trouble if there are too many of these + # because we allow out-of-order tags in MakerNote IFD's but our + # logic to add new tags relies on ordered entries) + foreach (keys %set) { + next unless $set{$_}; + my $perm = $set{$_}{Permanent}; + push @newTags, $_ if defined $perm and not $perm; + } + @newTags = sort { $a <=> $b } @newTags if @newTags > 1; + } else { + # get a hash of directories we will be writing in this one + $addDirs = $et->GetAddDirHash($tagTablePtr, $dirName); + # make a union of tags & dirs (can set whole dirs, like MakerNotes) + my %allTags = ( %set, %$addDirs ); + # make sorted list of new tags to be added + @newTags = sort { $a <=> $b } keys(%allTags); + } + my $dirBuff = ''; # buffer for directory data + my $valBuff = ''; # buffer for value data + my @valFixups; # list of fixups for offsets in valBuff + # fixup for offsets in dirBuff + my $dirFixup = new Image::ExifTool::Fixup; + my $entryBasedFixup; + my $lastTagID = -1; + my ($oldInfo, $oldFormat, $oldFormName, $oldCount, $oldSize, $oldValue, $oldImageData); + my ($readFormat, $readFormName, $readCount); # format for reading old value(s) + my ($entry, $valueDataPt, $valueDataPos, $valueDataLen, $valuePtr, $valEnd); + my ($offList, $offHash, $ignoreCount, $fixCount); + my $oldID = -1; + my $newID = -1; + + # patch for Canon EOS 40D firmware 1.0.4 bug (incorrect directory counts) + if ($inMakerNotes and $$et{Model} eq 'Canon EOS 40D') { + my $fmt = Get16u($dataPt, $dirStart + 2 + 12 * ($numEntries - 1) + 2); + if ($fmt < 1 or $fmt > 13) { + # adjust the number of directory entries + --$numEntries; + $dirEnd -= 12; + $ignoreCount = 1; + } + } +#.............................................................................. +# loop through entries in new directory +# + $index = 0; +Entry: for (;;) { + + if (defined $oldID and $oldID == $newID) { +# +# read next entry from existing directory +# + if ($index < $numEntries) { + $entry = $dirStart + 2 + 12 * $index; + $oldID = Get16u($dataPt, $entry); + $readFormat = $oldFormat = Get16u($dataPt, $entry+2); + $readCount = $oldCount = Get32u($dataPt, $entry+4); + undef $oldImageData; + if ($oldFormat < 1 or $oldFormat > 13) { + my $msg = "Bad format ($oldFormat) for $name entry $index"; + # patch to preserve invalid directory entries in SubIFD3 of + # various Kodak Z-series cameras (Z812, Z1085IS, Z1275) + # and some Sony cameras such as the DSC-P10 + if ($dirName eq 'MakerNotes' and (($$et{Make}=~/KODAK/i and + $$dirInfo{Name} and $$dirInfo{Name} eq 'SubIFD3') or + ($numEntries == 12 and $$et{Make} eq 'SONY' and $index >= 8))) + { + $dirBuff .= substr($$dataPt, $entry, 12); + ++$index; + $newID = $oldID; # we wrote this + $et->Warn($msg, 1); + next; + } + # don't write out null directory entry + if ($oldFormat==0 and $index and $oldCount==0) { + $ignoreCount = ($ignoreCount || 0) + 1; + # must keep same directory size to avoid messing up our fixed offsets + $dirBuff .= ("\0" x 12) if $$dirInfo{FixBase}; + ++$index; + $newID = $oldID; # pretend we wrote this + next; + } + return ExifErr($et, $msg, $tagTablePtr); + } + $readFormName = $oldFormName = $formatName[$oldFormat]; + $valueDataPt = $dataPt; + $valueDataPos = $dataPos; + $valueDataLen = $dataLen; + $valuePtr = $entry + 8; + # try direct method first for speed + $oldInfo = $$tagTablePtr{$oldID}; + if (ref $oldInfo ne 'HASH' or $$oldInfo{Condition}) { + # must get unknown tags too + # (necessary so we don't miss a tag we want to Drop) + my $unk = $et->Options(Unknown => 1); + $oldInfo = $et->GetTagInfo($tagTablePtr, $oldID); + $et->Options(Unknown => $unk); + } + # patch incorrect count in Kodak SubIFD3 tags + if ($oldCount < 2 and $oldInfo and $$oldInfo{FixCount}) { + $offList or ($offList, $offHash) = GetOffList($dataPt, $dirStart, $dataPos, + $numEntries, $tagTablePtr); + my $i = $$offHash{Get32u($dataPt, $valuePtr)}; + if (defined $i and $i < $#$offList) { + $oldCount = int(($$offList[$i+1] - $$offList[$i]) / $formatSize[$oldFormat]); + $fixCount = ($fixCount || 0) + 1 if $oldCount != $readCount; + } + } + $oldSize = $oldCount * $formatSize[$oldFormat]; + my $readFromFile; + if ($oldSize > 4) { + $valuePtr = Get32u($dataPt, $valuePtr); + # fix valuePtr if necessary + if ($$dirInfo{FixOffsets}) { + $valEnd or $valEnd = $dataPos + $dirStart + 2 + 12 * $numEntries + 4; + my ($tagID, $size, $wFlag) = ($oldID, $oldSize, 1); + #### eval FixOffsets ($valuePtr, $valEnd, $size, $tagID, $wFlag) + eval $$dirInfo{FixOffsets}; + unless (defined $valuePtr) { + unless ($$et{DropTags}) { + my $tagStr = $oldInfo ? $$oldInfo{Name} : sprintf("tag 0x%.4x",$oldID); + return undef if $et->Error("Bad $name offset for $tagStr", $inMakerNotes); + } + ++$index; $oldID = $newID; next; # drop this tag + } + } + # offset shouldn't point into TIFF or IFD header + my $suspect = ($valuePtr < 8); + # convert offset to pointer in $$dataPt + if ($$dirInfo{EntryBased} or (ref $$tagTablePtr{$oldID} eq 'HASH' and + $$tagTablePtr{$oldID}{EntryBased})) + { + $valuePtr += $entry; + } else { + $valuePtr -= $dataPos; + } + # value shouldn't overlap our directory + $suspect = 1 if $valuePtr < $dirEnd and $valuePtr+$oldSize > $dirStart; + # get value by seeking in file if we are allowed + if ($valuePtr < 0 or $valuePtr+$oldSize > $dataLen) { + my ($pos, $tagStr, $invalidPreview, $tmpInfo, $leicaTrailer); + if ($oldInfo) { + $tagStr = $$oldInfo{Name}; + $leicaTrailer = $$oldInfo{LeicaTrailer}; + } elsif (defined $oldInfo) { + $tmpInfo = $et->GetTagInfo($tagTablePtr, $oldID, \ '', $oldFormName, $oldCount); + if ($tmpInfo) { + $tagStr = $$tmpInfo{Name}; + $leicaTrailer = $$tmpInfo{LeicaTrailer}; + } + } + $tagStr or $tagStr = sprintf("tag 0x%.4x",$oldID); + # allow PreviewImage to run outside EXIF segment in JPEG images + if (not $raf) { + if ($tagStr eq 'PreviewImage') { + $raf = $$et{RAF}; + if ($raf) { + $pos = $raf->Tell(); + if ($oldInfo and $$oldInfo{ChangeBase}) { + # adjust base offset for this tag only + #### eval ChangeBase ($dirStart,$dataPos) + my $newBase = eval $$oldInfo{ChangeBase}; + $valuePtr += $newBase; + } + } else { + $invalidPreview = 1; + } + } elsif ($leicaTrailer) { + # save information about Leica makernote trailer + $$et{LeicaTrailer} = { + TagInfo => $oldInfo || $tmpInfo, + Offset => $base + $valuePtr + $dataPos, + Size => $oldSize, + Fixup => new Image::ExifTool::Fixup, + }, + $invalidPreview = 2; + # remove SubDirectory to prevent processing (for now) + my %copy = %{$oldInfo || $tmpInfo}; + delete $copy{SubDirectory}; + delete $copy{MakerNotes}; + $oldInfo = \%copy; + } + } + if ($oldSize > BINARY_DATA_LIMIT and $$origDirInfo{ImageData} and + (not defined $oldInfo or ($oldInfo and + (not $$oldInfo{SubDirectory} or $$oldInfo{ReadFromRAF})))) + { + # copy huge data blocks later instead of loading into memory + $oldValue = ''; # dummy empty value + # copy this value later unless writing a new value + unless (defined $set{$oldID}) { + my $pad = $oldSize & 0x01 ? 1 : 0; + # save block information to copy later (set directory offset later) + $oldImageData = [$base+$valuePtr+$dataPos, $oldSize, $pad]; + } + } elsif ($raf) { + my $success = ($raf->Seek($base+$valuePtr+$dataPos, 0) and + $raf->Read($oldValue, $oldSize) == $oldSize); + if (defined $pos) { + $raf->Seek($pos, 0); + undef $raf; + # (sony A700 has 32-byte header on PreviewImage) + unless ($success and $oldValue =~ /^(\xff\xd8\xff|(.|.{33})\xd8\xff\xdb)/s) { + $invalidPreview = 1; + $success = 1; # continue writing directory anyway + } + } + unless ($success) { + return undef if $et->Error("Error reading value for $name entry $index", $inMakerNotes); + ++$index; $oldID = $newID; next; # drop this tag + } + } elsif (not $invalidPreview) { + return undef if $et->Error("Bad $name offset for $tagStr", $inMakerNotes); + ++$index; $oldID = $newID; next; # drop this tag + } + if ($invalidPreview) { + # set value for invalid preview + if ($$et{FILE_TYPE} eq 'JPEG') { + # define dummy value for preview (or Leica MakerNote) to write later + # (value must be larger than 4 bytes to generate PREVIEW_INFO, + # and an even number of bytes so it won't be padded) + $oldValue = 'LOAD_PREVIEW'; + } else { + $oldValue = 'none'; + $oldSize = length $oldValue; + } + $valuePtr = 0; + } else { + UpdateTiffEnd($et, $base+$valuePtr+$dataPos+$oldSize); + } + # update pointers for value just read from file + $valueDataPt = \$oldValue; + $valueDataPos = $valuePtr + $dataPos; + $valueDataLen = $oldSize; + $valuePtr = 0; + $readFromFile = 1; + } + if ($suspect) { + my $tagStr = $oldInfo ? $$oldInfo{Name} : sprintf('tag 0x%.4x', $oldID); + my $str = "Suspicious $name offset for $tagStr"; + if ($inMakerNotes) { + $et->Warn($str, 1); + } else { + return undef if $et->Error($str, 1); + } + } + } + # read value if we haven't already + $oldValue = substr($$valueDataPt, $valuePtr, $oldSize) unless $readFromFile; + # get tagInfo using value if necessary + if (defined $oldInfo and not $oldInfo) { + my $unk = $et->Options(Unknown => 1); + $oldInfo = $et->GetTagInfo($tagTablePtr, $oldID, \$oldValue, $oldFormName, $oldCount); + $et->Options(Unknown => $unk); + # now that we have the value, we can resolve the Condition to finally + # determine whether we want to delete this tag or not + if ($mayDelete{$oldID} and $oldInfo and (not @newTags or $newTags[0] != $oldID)) { + my $nvHash = $et->GetNewValueHash($oldInfo, $dirName); + if (not $nvHash and $wrongDir) { + # delete from wrong directory if necessary + $nvHash = $et->GetNewValueHash($oldInfo, $wrongDir); + $nvHash and $xDelete{$oldID} = 1; + } + if ($nvHash) { + # we want to delete this tag after all, so insert it into our list + $set{$oldID} = $oldInfo; + unshift @newTags, $oldID; + } + } + } + # make sure we are handling the 'ifd' format properly + if (($oldFormat == 13 or $oldFormat == 18) and + (not $oldInfo or not $$oldInfo{SubIFD})) + { + my $str = sprintf('%s tag 0x%.4x IFD format not handled', $name, $oldID); + $et->Error($str, $inMakerNotes); + } + # override format we use to read the value if specified + if ($oldInfo) { + # check for tags which must be integers + if (($$oldInfo{IsOffset} or $$oldInfo{SubIFD}) and + not $intFormat{$oldFormName}) + { + $et->Error("Invalid format ($oldFormName) for $name $$oldInfo{Name}", $inMakerNotes); + ++$index; $oldID = $newID; next; # drop this tag + } + if ($$oldInfo{Drop} and $$et{DropTags} and + ($$oldInfo{Drop} == 1 or $$oldInfo{Drop} < $oldSize)) + { + ++$index; $oldID = $newID; next; # drop this tag + } + if ($$oldInfo{Format}) { + $readFormName = $$oldInfo{Format}; + $readFormat = $formatNumber{$readFormName}; + unless ($readFormat) { + # we aren't reading in a standard EXIF format, so rewrite in old format + $readFormName = $oldFormName; + $readFormat = $oldFormat; + } + if ($$oldInfo{FixedSize}) { + $oldSize = $$oldInfo{FixedSize} if $$oldInfo{FixedSize}; + $oldValue = substr($$valueDataPt, $valuePtr, $oldSize); + } + # adjust number of items to read if format size changed + $readCount = $oldSize / $formatSize[$readFormat]; + } + } + if ($oldID <= $lastTagID and not $inMakerNotes) { + my $str = $oldInfo ? "$$oldInfo{Name} tag" : sprintf('tag 0x%x',$oldID); + if ($oldID == $lastTagID) { + $et->Warn("Duplicate $str in $name"); + # put this tag back into the newTags list if necessary + unshift @newTags, $oldID if defined $set{$oldID}; + } else { + $et->Warn("\u$str out of sequence in $name"); + } + } + $lastTagID = $oldID; + ++$index; # increment index for next time + } else { + undef $oldID; # no more existing entries + } + } +# +# write out all new tags, up to and including this one +# + $newID = $newTags[0]; + my $isNew; # -1=tag is old, 0=tag same as existing, 1=tag is new + if (not defined $oldID) { + last unless defined $newID; + $isNew = 1; + } elsif (not defined $newID) { + # maker notes will have no new tags defined + if (defined $set{$oldID}) { + $newID = $oldID; + $isNew = 0; + } else { + $isNew = -1; + } + } else { + $isNew = $oldID <=> $newID; + } + my $newInfo = $oldInfo; + my $newFormat = $oldFormat; + my $newFormName = $oldFormName; + my $newCount = $oldCount; + my $ifdFormName; + my $newValue; + my $newValuePt = $isNew >= 0 ? \$newValue : \$oldValue; + my $isOverwriting; + + if ($isNew >= 0) { + # add, edit or delete this tag + shift @newTags; # remove from list + my $curInfo = $set{$newID}; + unless ($curInfo or $$addDirs{$newID}) { + # we can finally get the specific tagInfo reference for this tag + # (because we can now evaluate the Condition statement since all + # DataMember's have been obtained for tags up to this one) + $curInfo = $et->GetTagInfo($tagTablePtr, $newID); + if (defined $curInfo and not $curInfo) { + # need value to evaluate the condition + # (tricky because we need the tagInfo ref to get the value, + # so we must loop through all new tagInfo's...) + foreach $tagInfo (@newTagInfo) { + next unless $$tagInfo{TagID} == $newID; + my $val = $et->GetNewValue($tagInfo); + defined $val or $mayDelete{$newID} = 1, next; + # must convert to binary for evaluating in Condition + my $fmt = $$tagInfo{Format} || $$tagInfo{Writable}; + if ($fmt) { + $val = WriteValue($val, $fmt, $$tagInfo{Count}); + defined $val or $mayDelete{$newID} = 1, next; + } + $curInfo = $et->GetTagInfo($tagTablePtr, $newID, \$val, $oldFormName, $oldCount); + if ($curInfo) { + last if $curInfo eq $tagInfo; + undef $curInfo; + } + } + # may want to delete this, but we need to see the old value first + $mayDelete{$newID} = 1 unless $curInfo; + } + # don't set this tag unless valid for the current condition + if ($curInfo and $$et{NEW_VALUE}{$curInfo}) { + $set{$newID} = $curInfo; + } else { + next if $isNew > 0; + $isNew = -1; + undef $curInfo; + } + } + if ($curInfo) { + if ($$curInfo{WriteCondition}) { + my $self = $et; # set $self to be used in eval + #### eval WriteCondition ($self) + unless (eval $$curInfo{WriteCondition}) { + $@ and warn $@; + goto NoWrite; # GOTO ! + } + } + my $nvHash; + $nvHash = $et->GetNewValueHash($curInfo, $dirName) if $isNew >= 0; + unless ($nvHash or defined $$mandatory{$newID}) { + goto NoWrite unless $wrongDir; # GOTO ! + # delete stuff from the wrong directory if setting somewhere else + $nvHash = $et->GetNewValueHash($curInfo, $wrongDir); + # don't cross delete if not overwriting + goto NoWrite unless $et->IsOverwriting($nvHash); # GOTO ! + # don't cross delete if specifically deleting from the other directory + # (Note: don't call GetValue() here because it shouldn't be called + # if IsOverwriting returns < 0 -- eg. when shifting) + if (not defined $$nvHash{Value} and $$nvHash{WantGroup} and + lc($$nvHash{WantGroup}) eq lc($wrongDir)) + { + goto NoWrite; # GOTO ! + } else { + # remove this tag if found in this IFD + $xDelete{$newID} = 1; + } + } + } elsif (not $$addDirs{$newID}) { +NoWrite: next if $isNew > 0; + delete $set{$newID}; + $isNew = -1; + } + if ($set{$newID}) { +# +# set the new tag value (or 'next' if deleting tag) +# + $newInfo = $set{$newID}; + $newCount = $$newInfo{Count}; + my ($val, $newVal, $n); + my $nvHash = $et->GetNewValueHash($newInfo, $dirName); + if ($isNew > 0) { + # don't create new entry unless requested + if ($nvHash) { + next unless $$nvHash{IsCreating}; + if ($$newInfo{IsOverwriting}) { + my $proc = $$newInfo{IsOverwriting}; + $isOverwriting = &$proc($et, $nvHash, $val, \$newVal); + } else { + $isOverwriting = $et->IsOverwriting($nvHash); + } + } else { + next if $xDelete{$newID}; # don't create if cross deleting + $newVal = $$mandatory{$newID}; # get value for mandatory tag + $isOverwriting = 1; + } + # convert using new format + if ($$newInfo{Format}) { + $newFormName = $$newInfo{Format}; + # use Writable flag to specify IFD format code + $ifdFormName = $$newInfo{Writable}; + } else { + $newFormName = $$newInfo{Writable}; + unless ($newFormName) { + warn("No format for $name $$newInfo{Name}\n"); + next; + } + } + $newFormat = $formatNumber{$newFormName}; + } elsif ($nvHash or $xDelete{$newID}) { + unless ($nvHash) { + $nvHash = $et->GetNewValueHash($newInfo, $wrongDir); + } + # read value + if (length $oldValue >= $oldSize) { + $val = ReadValue(\$oldValue, 0, $readFormName, $readCount, $oldSize); + } else { + $val = ''; + } + # determine write format (by default, use 'Writable' format) + my $writable = $$newInfo{Writable}; + # (or use existing format if 'Writable' not specified) + $writable = $oldFormName unless $writable and $writable ne '1'; + # (and override write format with 'Format' if specified) + my $writeForm = $$newInfo{Format} || $writable; + if ($writeForm ne $newFormName) { + # write in specified format + $newFormName = $writeForm; + $newFormat = $formatNumber{$newFormName}; + # use different IFD format code if necessary + if ($inMakerNotes) { + # always preserve IFD format in maker notes + $ifdFormName = $oldFormName; + } elsif ($writable ne $newFormName) { + # use specified IFD format + $ifdFormName = $writable; + } + } + if ($inMakerNotes and $readFormName ne 'string' and $readFormName ne 'undef') { + # keep same size in maker notes unless string or binary + $newCount = $oldCount * $formatSize[$oldFormat] / $formatSize[$newFormat]; + } + if ($$newInfo{IsOverwriting}) { + my $proc = $$newInfo{IsOverwriting}; + $isOverwriting = &$proc($et, $nvHash, $val, \$newVal); + } else { + $isOverwriting = $et->IsOverwriting($nvHash, $val); + } + } + if ($isOverwriting) { + $newVal = $et->GetNewValue($nvHash) unless defined $newVal; + # value undefined if deleting this tag + # (also delete tag if cross-deleting and this isn't a date/time shift) + if (not defined $newVal or ($xDelete{$newID} and not defined $$nvHash{Shift})) { + if (not defined $newVal and $$newInfo{RawConvInv} and defined $$nvHash{Value}) { + # error in RawConvInv, so rewrite existing tag + goto NoOverwrite; # GOTO! + } + unless ($isNew) { + ++$$et{CHANGED}; + $et->VerboseValue("- $dirName:$$newInfo{Name}", $val); + } + next; + } + if ($newCount and $newCount < 0) { + # set count to number of values if variable + my @vals = split ' ',$newVal; + $newCount = @vals; + } + # convert to binary format + $newValue = WriteValue($newVal, $newFormName, $newCount); + unless (defined $newValue) { + $et->Warn("Invalid value for $dirName:$$newInfo{Name}"); + goto NoOverwrite; # GOTO! + } + if (length $newValue) { + # limit maximum value length in JPEG images + # (max segment size is 65533 bytes and the min EXIF size is 96 incl an additional IFD entry) + if ($$et{FILE_TYPE} eq 'JPEG' and length($newValue) > 65436 and + $$newInfo{Name} ne 'PreviewImage') + { + my $name = $$newInfo{MakerNotes} ? 'MakerNotes' : $$newInfo{Name}; + $et->Warn("Writing large value for $name",1); + } + # re-code if necessary + if ($strEnc and $newFormName eq 'string') { + $newValue = $et->Encode($newValue, $strEnc); + } + } else { + $et->Warn("Can't write zero length $$newInfo{Name} in $$tagTablePtr{GROUPS}{1}"); + goto NoOverwrite; # GOTO! + } + if ($isNew >= 0) { + $newCount = length($newValue) / $formatSize[$newFormat]; + ++$$et{CHANGED}; + if (defined $allMandatory) { + # not all mandatory if we are writing any tag specifically + if ($nvHash) { + undef $allMandatory; + undef $deleteAll; + } else { + ++$addMandatory; # count mandatory tags that we added + } + } + if ($verbose > 1) { + $et->VerboseValue("- $dirName:$$newInfo{Name}", $val) unless $isNew; + if ($$newInfo{OffsetPair} and $newVal eq '4277010157') { # (0xfeedfeed) + print { $$et{OPTIONS}{TextOut} } " + $dirName:$$newInfo{Name} = <tbd>\n"; + } else { + my $str = $nvHash ? '' : ' (mandatory)'; + $et->VerboseValue("+ $dirName:$$newInfo{Name}", $newVal, $str); + } + } + } + } else { +NoOverwrite: next if $isNew > 0; + $isNew = -1; # rewrite existing tag + } + # set format for EXIF IFD if different than conversion format + if ($ifdFormName) { + $newFormName = $ifdFormName; + $newFormat = $formatNumber{$newFormName}; + } + + } elsif ($isNew > 0) { +# +# create new subdirectory +# + # newInfo may not be defined if we try to add a mandatory tag + # to a directory that doesn't support it (eg. IFD1 in RW2 images) + $newInfo = $$addDirs{$newID} or next; + # make sure we don't try to generate a new MakerNotes directory + # or a SubIFD + next if $$newInfo{MakerNotes} or $$newInfo{Name} eq 'SubIFD'; + my $subTable; + if ($$newInfo{SubDirectory}{TagTable}) { + $subTable = Image::ExifTool::GetTagTable($$newInfo{SubDirectory}{TagTable}); + } else { + $subTable = $tagTablePtr; + } + # create empty source directory + my %sourceDir = ( + Parent => $dirName, + Fixup => new Image::ExifTool::Fixup, + ); + $sourceDir{DirName} = $$newInfo{Groups}{1} if $$newInfo{SubIFD}; + $newValue = $et->WriteDirectory(\%sourceDir, $subTable); + # only add new directory if it isn't empty + next unless defined $newValue and length($newValue); + # set the fixup start location + if ($$newInfo{SubIFD}) { + # subdirectory is referenced by an offset in value buffer + my $subdir = $newValue; + $newValue = Set32u(0xfeedf00d); + push @subdirs, { + DataPt => \$subdir, + Table => $subTable, + Fixup => $sourceDir{Fixup}, + Offset => length($dirBuff) + 8, + Where => 'dirBuff', + }; + $newFormName = 'int32u'; + $newFormat = $formatNumber{$newFormName}; + } else { + # subdirectory goes directly into value buffer + $sourceDir{Fixup}{Start} += length($valBuff); + # use Writable to set format, otherwise 'undef' + $newFormName = $$newInfo{Writable}; + unless ($newFormName and $formatNumber{$newFormName}) { + $newFormName = 'undef'; + } + $newFormat = $formatNumber{$newFormName}; + push @valFixups, $sourceDir{Fixup}; + } + } elsif ($$newInfo{Format} and $$newInfo{Writable} and $$newInfo{Writable} ne '1') { + # use specified write format + $newFormName = $$newInfo{Writable}; + $newFormat = $formatNumber{$newFormName}; + } elsif ($$addDirs{$newID} and $newInfo ne $$addDirs{$newID}) { + # this can happen if we are trying to add a directory that doesn't exist + # in this type of file (eg. try adding a SubIFD tag to an A100 image) + $isNew = -1; + } + } + if ($isNew < 0) { + # just rewrite existing tag + $newID = $oldID; + $newValue = $oldValue; + $newFormat = $oldFormat; # (just in case it changed) + $newFormName = $oldFormName; + # set offset of this entry in the directory so we can update the pointer + # and save block information to copy this large block later + if ($oldImageData) { + $$oldImageData[3] = $newStart + length($dirBuff) + 2; + push @imageData, $oldImageData; + $$origDirInfo{ImageData} = \@imageData; + } + } + if ($newInfo) { +# +# load necessary data for this tag (thumbnail image, etc) +# + if ($$newInfo{DataTag} and $isNew >= 0) { + my $dataTag = $$newInfo{DataTag}; + # load data for this tag + unless (defined $offsetData{$dataTag} or $dataTag eq 'LeicaTrailer') { + # prefer tag from Composite table if it exists (otherwise + # PreviewImage data would be taken from Extra tag) + my $compInfo = Image::ExifTool::GetCompositeTagInfo($dataTag); + $offsetData{$dataTag} = $et->GetNewValue($compInfo || $dataTag); + my $err; + if (defined $offsetData{$dataTag}) { + my $len = length $offsetData{$dataTag}; + if ($dataTag eq 'PreviewImage') { + # must set DEL_PREVIEW flag now if preview fit into IFD + $$et{DEL_PREVIEW} = 1 if $len <= 4; + } + } else { + $err = "$dataTag not found"; + } + if ($err) { + $et->Warn($err) if $$newInfo{IsOffset}; + delete $set{$newID}; # remove from list of tags we are setting + next; + } + } + } +# +# write maker notes +# + if ($$newInfo{MakerNotes}) { + # don't write new makernotes if we are deleting this group + if ($$et{DEL_GROUP}{MakerNotes} and + ($$et{DEL_GROUP}{MakerNotes} != 2 or $isNew <= 0)) + { + if ($et->IsRawType()) { + $et->WarnOnce("Can't delete MakerNotes from $$et{FileType}",1); + } else { + if ($isNew <= 0) { + ++$$et{CHANGED}; + $verbose and print $out " Deleting MakerNotes\n"; + } + next; + } + } + my $saveOrder = GetByteOrder(); + if ($isNew >= 0 and defined $set{$newID}) { + # we are writing a whole new maker note block + # --> add fixup information if necessary + my $nvHash = $et->GetNewValueHash($newInfo, $dirName); + if ($nvHash and $$nvHash{MAKER_NOTE_FIXUP}) { + # must clone fixup because we will be shifting it + my $makerFixup = $$nvHash{MAKER_NOTE_FIXUP}->Clone(); + my $valLen = length($valBuff); + $$makerFixup{Start} += $valLen; + push @valFixups, $makerFixup; + } + } else { + # update maker notes if possible + my %subdirInfo = ( + Base => $base, + DataPt => $valueDataPt, + DataPos => $valueDataPos, + DataLen => $valueDataLen, + DirStart => $valuePtr, + DirLen => $oldSize, + DirName => 'MakerNotes', + Name => $$newInfo{Name}, + Parent => $dirName, + TagInfo => $newInfo, + RAF => $raf, + ); + my ($subTable, $subdir, $loc, $writeProc, $notIFD); + if ($$newInfo{SubDirectory}) { + my $sub = $$newInfo{SubDirectory}; + $subdirInfo{FixBase} = 1 if $$sub{FixBase}; + $subdirInfo{FixOffsets} = $$sub{FixOffsets}; + $subdirInfo{EntryBased} = $$sub{EntryBased}; + $subdirInfo{NoFixBase} = 1 if defined $$sub{Base}; + $subdirInfo{AutoFix} = $$sub{AutoFix}; + SetByteOrder($$sub{ByteOrder}) if $$sub{ByteOrder}; + } + # get the proper tag table for these maker notes + if ($oldInfo and $$oldInfo{SubDirectory}) { + $subTable = $$oldInfo{SubDirectory}{TagTable}; + $subTable and $subTable = Image::ExifTool::GetTagTable($subTable); + $writeProc = $$oldInfo{SubDirectory}{WriteProc}; + $notIFD = $$oldInfo{NotIFD}; + } else { + $et->Warn('Internal problem getting maker notes tag table'); + } + $writeProc or $writeProc = $$subTable{WRITE_PROC} if $subTable; + $subTable or $subTable = $tagTablePtr; + if ($writeProc and + $writeProc eq \&Image::ExifTool::MakerNotes::WriteUnknownOrPreview and + $oldValue =~ /^\xff\xd8\xff/) + { + $loc = 0; + } elsif (not $notIFD) { + # look for IFD-style maker notes + $loc = Image::ExifTool::MakerNotes::LocateIFD($et,\%subdirInfo); + } + if (defined $loc) { + # we need fixup data for this subdirectory + $subdirInfo{Fixup} = new Image::ExifTool::Fixup; + # rewrite maker notes + my $changed = $$et{CHANGED}; + $subdir = $et->WriteDirectory(\%subdirInfo, $subTable, $writeProc); + if ($changed == $$et{CHANGED} and $subdirInfo{Fixup}->IsEmpty()) { + # return original data if nothing changed and no fixups + undef $subdir; + } + } elsif ($$subTable{PROCESS_PROC} and + $$subTable{PROCESS_PROC} eq \&Image::ExifTool::ProcessBinaryData) + { + my $sub = $$oldInfo{SubDirectory}; + if (defined $$sub{Start}) { + #### eval Start ($valuePtr) + my $start = eval $$sub{Start}; + $loc = $start - $valuePtr; + $subdirInfo{DirStart} = $start; + $subdirInfo{DirLen} -= $loc; + } else { + $loc = 0; + } + # rewrite maker notes + $subdir = $et->WriteDirectory(\%subdirInfo, $subTable); + } elsif ($notIFD) { + if ($writeProc) { + $loc = 0; + $subdir = $et->WriteDirectory(\%subdirInfo, $subTable); + } + } else { + my $msg = 'Maker notes could not be parsed'; + if ($$et{FILE_TYPE} eq 'JPEG') { + $et->Warn($msg, 1); + } else { + $et->Error($msg, 1); + } + } + if (defined $subdir) { + length $subdir or SetByteOrder($saveOrder), next; + my $valLen = length($valBuff); + # restore existing header and substitute the new + # maker notes for the old value + $newValue = substr($oldValue, 0, $loc) . $subdir; + my $makerFixup = $subdirInfo{Fixup}; + my $previewInfo = $$et{PREVIEW_INFO}; + if ($subdirInfo{Relative}) { + # apply a one-time fixup to $loc since offsets are relative + $$makerFixup{Start} += $loc; + # shift all offsets to be relative to new base + my $baseShift = $valueDataPos + $valuePtr + $base - $subdirInfo{Base}; + $$makerFixup{Shift} += $baseShift; + $makerFixup->ApplyFixup(\$newValue); + if ($previewInfo) { + # remove all but PreviewImage fixup (since others shouldn't change) + foreach (keys %{$$makerFixup{Pointers}}) { + /_PreviewImage$/ or delete $$makerFixup{Pointers}{$_}; + } + # zero pointer so we can see how it gets shifted later + $makerFixup->SetMarkerPointers(\$newValue, 'PreviewImage', 0); + # set the pointer to the start of the EXIF information + # add preview image fixup to list of value fixups + $$makerFixup{Start} += $valLen; + push @valFixups, $makerFixup; + $$previewInfo{BaseShift} = $baseShift; + $$previewInfo{Relative} = 1; + } + # don't shift anything if relative flag set to zero (Pentax patch) + } elsif (not defined $subdirInfo{Relative}) { + # shift offset base if shifted in the original image or if FixBase + # was used, but be careful of automatic FixBase with negative shifts + # since they may lead to negative (invalid) offsets (casio_edit_problem.jpg) + my $baseShift = $base - $subdirInfo{Base}; + if ($subdirInfo{AutoFix}) { + $baseShift = 0; + } elsif ($subdirInfo{FixBase} and $baseShift < 0 and + # allow negative base shift if offsets are bigger (PentaxOptioWP.jpg) + (not $subdirInfo{MinOffset} or $subdirInfo{MinOffset} + $baseShift < 0)) + { + my $fixBase = $et->Options('FixBase'); + if (not defined $fixBase) { + my $str = $et->Options('IgnoreMinorErrors') ? 'ignored' : 'fix or ignore?'; + $et->Error("MakerNotes offsets may be incorrect ($str)", 1); + } elsif ($fixBase eq '') { + $et->Warn('Fixed incorrect MakerNotes offsets'); + $baseShift = 0; + } + } + $$makerFixup{Start} += $valLen + $loc; + $$makerFixup{Shift} += $baseShift; + # permanently fix makernote offset errors + $$makerFixup{Shift} += $subdirInfo{FixedBy} || 0; + push @valFixups, $makerFixup; + if ($previewInfo and not $$previewInfo{NoBaseShift}) { + $$previewInfo{BaseShift} = $baseShift; + } + } + $newValuePt = \$newValue; # write new value + } + } + SetByteOrder($saveOrder); + + # process existing subdirectory unless we are overwriting it entirely + } elsif ($$newInfo{SubDirectory} and $isNew <= 0 and not $isOverwriting + # don't edit directory if Writable is set to 0 + and (not defined $$newInfo{Writable} or $$newInfo{Writable}) and + not $$newInfo{ReadFromRAF}) + { + + my $subdir = $$newInfo{SubDirectory}; + if ($$newInfo{SubIFD}) { +# +# rewrite existing sub IFD's +# + my $subTable = $tagTablePtr; + if ($$subdir{TagTable}) { + $subTable = Image::ExifTool::GetTagTable($$subdir{TagTable}); + } + # determine directory name for this IFD + my $subdirName = $$newInfo{Groups}{1} || $$newInfo{Name}; + # all makernotes directory names must be 'MakerNotes' + $subdirName = 'MakerNotes' if $$subTable{GROUPS}{0} eq 'MakerNotes'; + # must handle sub-IFD's specially since the values + # are actually offsets to subdirectories + unless ($readCount) { # can't have zero count + return undef if $et->Error("$name entry $index has zero count", 2); + next; + } + my $writeCount = 0; + my $i; + $newValue = ''; # reset value because we regenerate it below + for ($i=0; $i<$readCount; ++$i) { + my $off = $i * $formatSize[$readFormat]; + my $val = ReadValue($valueDataPt, $valuePtr + $off, + $readFormName, 1, $oldSize - $off); + my $subdirStart = $val - $dataPos; + my $subdirBase = $base; + my $hdrLen; + if (defined $$subdir{Start}) { + #### eval Start ($val) + my $newStart = eval $$subdir{Start}; + unless (Image::ExifTool::IsInt($newStart)) { + $et->Error("Bad subdirectory start for $$newInfo{Name}"); + next; + } + $newStart -= $dataPos; + $hdrLen = $newStart - $subdirStart; + $subdirStart = $newStart; + } + if ($$subdir{Base}) { + my $start = $subdirStart + $dataPos; + #### eval Base ($start,$base) + $subdirBase += eval $$subdir{Base}; + } + # add IFD number if more than one + $subdirName =~ s/\d*$/$i/ if $i; + my %subdirInfo = ( + Base => $subdirBase, + DataPt => $dataPt, + DataPos => $dataPos - $subdirBase + $base, + DataLen => $dataLen, + DirStart => $subdirStart, + DirName => $subdirName, + Name => $$newInfo{Name}, + TagInfo => $newInfo, + Parent => $dirName, + Fixup => new Image::ExifTool::Fixup, + RAF => $raf, + Subdir => $subdir, + # set ImageData only for 1st level SubIFD's + ImageData=> $imageDataFlag eq 'Main' ? 'SubIFD' : undef, + ); + # pass on header pointer only for certain sub IFD's + $subdirInfo{HeaderPtr} = $$dirInfo{HeaderPtr} if $$newInfo{SubIFD} == 2; + if ($$subdir{RelativeBase}) { + # apply one-time fixup if offsets are relative (Sony IDC hack) + delete $subdirInfo{Fixup}; + delete $subdirInfo{ImageData}; + } + # is the subdirectory outside our current data? + if ($subdirStart < 0 or $subdirStart + 2 > $dataLen) { + if ($raf) { + # reset SubDirectory buffer (we will load it later) + my $buff = ''; + $subdirInfo{DataPt} = \$buff; + $subdirInfo{DataLen} = 0; + } else { + my @err = ("Can't read $subdirName data", $inMakerNotes); + if ($$subTable{VARS} and $$subTable{VARS}{MINOR_ERRORS}) { + $et->Warn($err[0] . '. Ignored.'); + } elsif ($et->Error(@err)) { + return undef; + } + next Entry; # don't write this directory + } + } + my $subdirData = $et->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc}); + unless (defined $subdirData) { + # WriteDirectory should have issued an error, but check just in case + $et->Error("Error writing $subdirName") unless $$et{VALUE}{Error}; + return undef; + } + # add back original header if necessary (eg. Ricoh GR) + if ($hdrLen and $hdrLen > 0 and $subdirStart <= $dataLen) { + $subdirData = substr($$dataPt, $subdirStart - $hdrLen, $hdrLen) . $subdirData; + $subdirInfo{Fixup}{Start} += $hdrLen; + } + unless (length $subdirData) { + next unless $inMakerNotes; + # don't delete MakerNote Sub-IFD's, write empty IFD instead + $subdirData = "\0" x 6; + # reset SubIFD ImageData and Fixup just to be safe + delete $subdirInfo{ImageData}; + delete $subdirInfo{Fixup}; + } + # handle data blocks that we will transfer later + if (ref $subdirInfo{ImageData}) { + push @imageData, @{$subdirInfo{ImageData}}; + $$origDirInfo{ImageData} = \@imageData; + } + # temporarily set value to subdirectory index + # (will set to actual offset later when we know what it is) + $newValue .= Set32u(0xfeedf00d); + my ($offset, $where); + if ($readCount > 1) { + $offset = length($valBuff) + $i * 4; + $where = 'valBuff'; + } else { + $offset = length($dirBuff) + 8; + $where = 'dirBuff'; + } + # add to list of subdirectories we will append later + push @subdirs, { + DataPt => \$subdirData, + Table => $subTable, + Fixup => $subdirInfo{Fixup}, + Offset => $offset, + Where => $where, + ImageData => $subdirInfo{ImageData}, + }; + ++$writeCount; # count number of subdirs written + } + next unless length $newValue; + # must change location of subdir offset if we deleted + # a directory and only one remains + if ($writeCount < $readCount and $writeCount == 1) { + $subdirs[-1]{Where} = 'dirBuff'; + $subdirs[-1]{Offset} = length($dirBuff) + 8; + } + # set new format to int32u for IFD + $newFormName = $$newInfo{FixFormat} || 'int32u'; + $newFormat = $formatNumber{$newFormName}; + $newValuePt = \$newValue; + + } elsif ((not defined $$subdir{Start} or + $$subdir{Start} =~ /\$valuePtr/) and + $$subdir{TagTable}) + { +# +# rewrite other existing subdirectories ('$valuePtr' type only) +# + # set subdirectory Start and Base + my $subdirStart = $valuePtr; + if ($$subdir{Start}) { + #### eval Start ($valuePtr) + $subdirStart = eval $$subdir{Start}; + # must adjust directory size if start changed + $oldSize -= $subdirStart - $valuePtr; + } + my $subdirBase = $base; + if ($$subdir{Base}) { + my $start = $subdirStart + $valueDataPos; + #### eval Base ($start,$base) + $subdirBase += eval $$subdir{Base}; + } + my $subFixup = new Image::ExifTool::Fixup; + my %subdirInfo = ( + Base => $subdirBase, + DataPt => $valueDataPt, + DataPos => $valueDataPos - $subdirBase + $base, + DataLen => $valueDataLen, + DirStart => $subdirStart, + DirName => $$subdir{DirName}, + DirLen => $oldSize, + Parent => $dirName, + Fixup => $subFixup, + RAF => $raf, + TagInfo => $newInfo, + ); + unless ($oldSize) { + # replace with dummy data if empty to prevent WriteDirectory + # routines from accessing data they shouldn't + my $tmp = ''; + $subdirInfo{DataPt} = \$tmp; + $subdirInfo{DataLen} = 0; + $subdirInfo{DirStart} = 0; + $subdirInfo{DataPos} += $subdirStart; + } + my $subTable = Image::ExifTool::GetTagTable($$subdir{TagTable}); + my $oldOrder = GetByteOrder(); + SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder}; + $newValue = $et->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc}); + SetByteOrder($oldOrder); + if (defined $newValue) { + my $hdrLen = $subdirStart - $valuePtr; + if ($hdrLen) { + $newValue = substr($$valueDataPt, $valuePtr, $hdrLen) . $newValue; + $$subFixup{Start} += $hdrLen; + } + $newValuePt = \$newValue; + } else { + $newValuePt = \$oldValue; + } + unless (length $$newValuePt) { + # don't delete a previously empty makernote directory + next if $oldSize or not $inMakerNotes; + } + if ($$subFixup{Pointers} and $subdirInfo{Base} == $base) { + $$subFixup{Start} += length $valBuff; + push @valFixups, $subFixup; + } else { + # apply fixup in case we added a header ($hdrLen above) + $subFixup->ApplyFixup(\$newValue); + } + } + + } elsif ($$newInfo{OffsetPair}) { +# +# keep track of offsets +# + my $dataTag = $$newInfo{DataTag} || ''; + if ($dataTag eq 'CanonVRD') { + # must decide now if we will write CanonVRD information + my $hasVRD; + if ($$et{NEW_VALUE}{$Image::ExifTool::Extra{CanonVRD}}) { + # adding or deleting as a block + $hasVRD = $et->GetNewValue('CanonVRD') ? 1 : 0; + } elsif ($$et{DEL_GROUP}{CanonVRD} or + $$et{DEL_GROUP}{Trailer}) + { + $hasVRD = 0; # deleting as a group + } else { + $hasVRD = ($$newValuePt ne "\0\0\0\0"); + } + if ($hasVRD) { + # add a fixup, and set this offset later + $dirFixup->AddFixup(length($dirBuff) + 8, $dataTag); + } else { + # there is (or will soon be) no VRD information, so set pointer to zero + $newValue = "\0" x length($$newValuePt); + $newValuePt = \$newValue; + } + } elsif ($dataTag eq 'OriginalDecisionData') { + # handle Canon OriginalDecisionData (no associated length tag) + # - I'm going out of my way here to preserve data which is + # invalidated anyway by our edits + my $odd; + my $oddInfo = Image::ExifTool::GetCompositeTagInfo('OriginalDecisionData'); + if ($oddInfo and $$et{NEW_VALUE}{$oddInfo}) { + $odd = $et->GetNewValue($dataTag); + if ($verbose > 1) { + print $out " - $dirName:$dataTag\n" if $$newValuePt ne "\0\0\0\0"; + print $out " + $dirName:$dataTag\n" if $odd; + } + ++$$et{CHANGED}; + } elsif ($$newValuePt ne "\0\0\0\0") { + if (length($$newValuePt) == 4) { + require Image::ExifTool::Canon; + my $offset = Get32u($newValuePt,0); + # absolute offset in JPEG images only + $offset += $base unless $$et{FILE_TYPE} eq 'JPEG'; + $odd = Image::ExifTool::Canon::ReadODD($et, $offset); + $odd = $$odd if ref $odd; + } else { + $et->Error("Invalid $$newInfo{Name}",1); + } + } + if ($odd) { + my $newOffset = length($valBuff); + # (ODD offset is absolute in JPEG, so add base offset!) + $newOffset += $base if $$et{FILE_TYPE} eq 'JPEG'; + $newValue = Set32u($newOffset); + $dirFixup->AddFixup(length($dirBuff) + 8, $dataTag); + $valBuff .= $odd; # add original decision data + } else { + $newValue = "\0\0\0\0"; + } + $newValuePt = \$newValue; + } else { + my $offsetInfo = $offsetInfo[$ifd]; + # save original values (for updating TIFF_END later) + my @vals; + if ($isNew <= 0) { + my $oldOrder = GetByteOrder(); + # Minolta A200 stores these in the wrong byte order! + SetByteOrder($$newInfo{ByteOrder}) if $$newInfo{ByteOrder}; + @vals = ReadValue(\$oldValue, 0, $readFormName, $readCount, $oldSize); + SetByteOrder($oldOrder); + $validateInfo{$newID} = [$newInfo, join(' ',@vals)] unless $$newInfo{IsOffset}; + } + # only support int32 pointers (for now) + if ($formatSize[$newFormat] != 4 and $$newInfo{IsOffset}) { + $isNew > 0 and warn("Internal error (Offset not int32)"), return undef; + $newCount != $readCount and warn("Wrong count!"), return undef; + # change to int32 + $newFormName = 'int32u'; + $newFormat = $formatNumber{$newFormName}; + $newValue = WriteValue(join(' ',@vals), $newFormName, $newCount); + unless (defined $newValue) { + warn "Internal error writing offsets for $$newInfo{Name}\n"; + return undef; + } + $newValuePt = \$newValue; + } + $offsetInfo or $offsetInfo = $offsetInfo[$ifd] = { }; + # save location of valuePtr in new directory + # (notice we add 10 instead of 8 for valuePtr because + # we will put a 2-byte count at start of directory later) + my $ptr = $newStart + length($dirBuff) + 10; + $newCount or $newCount = 1; # make sure count is set for offsetInfo + # save value pointer and value count for each tag + $$offsetInfo{$newID} = [$newInfo, $ptr, $newCount, \@vals, $newFormat]; + } + + } elsif ($$newInfo{DataMember}) { + + # save any necessary data members (Make, Model, etc) + my $formatStr = $newFormName; + my $count = $newCount; + # change to specified format if necessary + if ($$newInfo{Format} and $$newInfo{Format} ne $formatStr) { + $formatStr = $$newInfo{Format}; + my $format = $formatNumber{$formatStr}; + # adjust number of items for new format size + $count = int(length($$newValuePt) / $formatSize[$format]) if $format; + } + my $val = ReadValue($newValuePt,0,$formatStr,$count,length($$newValuePt)); + my $conv = $$newInfo{RawConv}; + if ($conv) { + # let the RawConv store the (possibly converted) data member + if (ref $conv eq 'CODE') { + &$conv($val, $et); + } else { + my ($priority, @grps); + my ($self, $tag, $tagInfo) = ($et, $$newInfo{Name}, $newInfo); + #### eval RawConv ($self, $val, $tag, $tagInfo, $priority, @grps) + eval $conv; + } + } else { + $$et{$$newInfo{DataMember}} = $val; + } + } + } +# +# write out the directory entry +# + my $newSize = length($$newValuePt); + my $fsize = $formatSize[$newFormat]; + my $offsetVal; + # set proper count + $newCount = int(($newSize + $fsize - 1) / $fsize) unless $oldInfo and $$oldInfo{FixedSize}; + if ($saveForValidate{$newID} and $tagTablePtr eq \%Image::ExifTool::Exif::Main) { + my @vals = ReadValue(\$newValue, 0, $newFormName, $newCount, $newSize); + $validateInfo{$newID} = join ' ',@vals; + } + if ($newSize > 4) { + # zero-pad to an even number of bytes (required by EXIF standard) + # and make sure we are a multiple of the format size + while ($newSize & 0x01 or $newSize < $newCount * $fsize) { + $$newValuePt .= "\0"; + ++$newSize; + } + my $entryBased; + if ($$dirInfo{EntryBased} or ($newInfo and $$newInfo{EntryBased})) { + $entryBased = 1; + $offsetVal = Set32u(length($valBuff) - length($dirBuff)); + } else { + $offsetVal = Set32u(length $valBuff); + } + my ($dataTag, $putFirst); + ($dataTag, $putFirst) = @$newInfo{'DataTag','PutFirst'} if $newInfo; + if ($dataTag) { + if ($dataTag eq 'PreviewImage' and ($$et{FILE_TYPE} eq 'JPEG' or + $$et{GENERATE_PREVIEW_INFO})) + { + # hold onto the PreviewImage until we can determine if it fits + $$et{PREVIEW_INFO} or $$et{PREVIEW_INFO} = { + Data => $$newValuePt, + Fixup => new Image::ExifTool::Fixup, + }; + $$et{PREVIEW_INFO}{ChangeBase} = 1 if $$newInfo{ChangeBase}; + if ($$newInfo{IsOffset} and $$newInfo{IsOffset} eq '2') { + $$et{PREVIEW_INFO}{NoBaseShift} = 1; + } + # use original preview size if we will attempt to load it later + $newCount = $oldCount if $$newValuePt eq 'LOAD_PREVIEW'; + $$newValuePt = ''; + } elsif ($dataTag eq 'LeicaTrailer' and $$et{LeicaTrailer}) { + $$newValuePt = ''; + } + } + if ($putFirst and $$dirInfo{HeaderPtr}) { + my $hdrPtr = $$dirInfo{HeaderPtr}; + # place this value immediately after the TIFF header (eg. IIQ maker notes) + $offsetVal = Set32u(length $$hdrPtr); + $$hdrPtr .= $$newValuePt; + } else { + $valBuff .= $$newValuePt; # add value data to buffer + # must save a fixup pointer for every pointer in the directory + if ($entryBased) { + $entryBasedFixup or $entryBasedFixup = new Image::ExifTool::Fixup; + $entryBasedFixup->AddFixup(length($dirBuff) + 8, $dataTag); + } else { + $dirFixup->AddFixup(length($dirBuff) + 8, $dataTag); + } + } + } else { + $offsetVal = $$newValuePt; # save value in offset if 4 bytes or less + # must pad value with zeros if less than 4 bytes + $newSize < 4 and $offsetVal .= "\0" x (4 - $newSize); + } + # write the directory entry + $dirBuff .= Set16u($newID) . Set16u($newFormat) . + Set32u($newCount) . $offsetVal; + # update flag to keep track of mandatory tags + while (defined $allMandatory) { + if (defined $$mandatory{$newID}) { + # values must correspond to mandatory values + my $form = $$newInfo{Format} || $newFormName; + my $mandVal = WriteValue($$mandatory{$newID}, $form, $newCount); + if (defined $mandVal and $mandVal eq $$newValuePt) { + ++$allMandatory; # count mandatory tags + last; + } + } + undef $deleteAll; + undef $allMandatory; + } + } + if (%validateInfo) { + ValidateImageData($et, \%validateInfo, $dirName, 1); + undef %validateInfo; + } + if ($ignoreCount) { + my $y = $ignoreCount > 1 ? 'ies' : 'y'; + my $verb = $$dirInfo{FixBase} ? 'Ignored' : 'Removed'; + $et->Warn("$verb $ignoreCount invalid entr$y from $name", 1); + } + if ($fixCount) { + my $s = $fixCount > 1 ? 's' : ''; + $et->Warn("Fixed invalid count$s for $fixCount $name tag$s", 1); + } +#.............................................................................. +# write directory counts and nextIFD pointer and add value data to end of IFD +# + # determine now if there is or will be another IFD after this one + my $nextIfdOffset; + if ($dirEnd + 4 <= $dataLen) { + $nextIfdOffset = Get32u($dataPt, $dirEnd); + } else { + $nextIfdOffset = 0; + } + my $isNextIFD = ($$dirInfo{Multi} and ($nextIfdOffset or + # account for the case where we will create the next IFD + # (IFD1 only, but not in TIFF-format images) + ($dirName eq 'IFD0' and $$et{ADD_DIRS}{'IFD1'} and + $$et{FILE_TYPE} ne 'TIFF'))); + # calculate number of entries in new directory + my $newEntries = length($dirBuff) / 12; + # delete entire directory if we deleted a tag and only mandatory tags remain or we + # attempted to create a directory with only mandatory tags and there is no nextIFD + if ($allMandatory and not $isNextIFD and ($newEntries < $numEntries or $numEntries == 0)) { + $newEntries = 0; + $dirBuff = ''; + $valBuff = ''; + undef $dirFixup; # no fixups in this directory + ++$deleteAll if defined $deleteAll; + $verbose > 1 and print $out " - $allMandatory mandatory tag(s)\n"; + $$et{CHANGED} -= $addMandatory; # didn't change these after all + } + if ($ifd and not $newEntries) { + $verbose and print $out " Deleting IFD1\n"; + last; # don't write IFD1 if empty + } + # apply one-time fixup for entry-based offsets + if ($entryBasedFixup) { + $$entryBasedFixup{Shift} = length($dirBuff) + 4; + $entryBasedFixup->ApplyFixup(\$dirBuff); + undef $entryBasedFixup; + } + # initialize next IFD pointer to zero + my $nextIFD = Set32u(0); + # some cameras use a different amount of padding after the makernote IFD + if ($dirName eq 'MakerNotes' and $$dirInfo{Parent} =~ /^(ExifIFD|IFD0)$/) { + my ($rel, $pad) = Image::ExifTool::MakerNotes::GetMakerNoteOffset($et); + $nextIFD = "\0" x $pad if defined $pad and ($pad==0 or ($pad>4 and $pad<=32)); + } + # add directory entry count to start of IFD and next IFD pointer to end + $newData .= Set16u($newEntries) . $dirBuff . $nextIFD; + # get position of value data in newData + my $valPos = length($newData); + # go back now and set next IFD pointer if this isn't the first IFD + if ($nextIfdPos) { + # set offset to next IFD + Set32u($newStart, \$newData, $nextIfdPos); + $fixup->AddFixup($nextIfdPos,'NextIFD'); # add fixup for this offset in newData + } + # remember position of 'next IFD' pointer so we can set it next time around + $nextIfdPos = length($nextIFD) ? $valPos - length($nextIFD) : undef; + # add value data after IFD + $newData .= $valBuff; +# +# add any subdirectories, adding fixup information +# + if (@subdirs) { + my $subdir; + foreach $subdir (@subdirs) { + my $len = length($newData); # position of subdirectory in data + my $subdirFixup = $$subdir{Fixup}; + if ($subdirFixup) { + $$subdirFixup{Start} += $len; + $fixup->AddFixup($subdirFixup); + } + my $imageData = $$subdir{ImageData}; + my $blockSize = 0; + # must also update start position for ImageData fixups + if (ref $imageData) { + my $blockInfo; + foreach $blockInfo (@$imageData) { + my ($pos, $size, $pad, $entry, $subFix) = @$blockInfo; + if ($subFix) { + $$subFix{Start} += $len; + # save expected image data offset for calculating shift later + $$subFix{BlockLen} = length(${$$subdir{DataPt}}) + $blockSize; + } + $blockSize += $size + $pad; + } + } + $newData .= ${$$subdir{DataPt}}; # add subdirectory to our data + undef ${$$subdir{DataPt}}; # free memory now + # set the pointer + my $offset = $$subdir{Offset}; + # if offset is in valBuff, it was added to the end of dirBuff + # (plus 4 bytes for nextIFD pointer) + $offset += length($dirBuff) + 4 if $$subdir{Where} eq 'valBuff'; + $offset += $newStart + 2; # get offset in newData + # check to be sure we got the right offset + unless (Get32u(\$newData, $offset) == 0xfeedf00d) { + $et->Error("Internal error while rewriting $name"); + return undef; + } + # set the offset to the subdirectory data + Set32u($len, \$newData, $offset); + $fixup->AddFixup($offset); # add fixup for this offset in newData + } + } + # add fixup for all offsets in directory according to value data position + # (which is at the end of this directory) + if ($dirFixup) { + $$dirFixup{Start} = $newStart + 2; + $$dirFixup{Shift} = $valPos - $$dirFixup{Start}; + $fixup->AddFixup($dirFixup); + } + # add valueData fixups, adjusting for position of value data + my $valFixup; + foreach $valFixup (@valFixups) { + $$valFixup{Start} += $valPos; + $fixup->AddFixup($valFixup); + } + # stop if no next IFD pointer + last unless $isNextIFD; # stop unless scanning for multiple IFD's + if ($nextIfdOffset) { + # continue with next IFD + $dirStart = $nextIfdOffset - $dataPos; + } else { + # create IFD1 if necessary + $verbose and print $out " Creating IFD1\n"; + my $ifd1 = "\0" x 2; # empty IFD1 data (zero entry count) + $dataPt = \$ifd1; + $dirStart = 0; + $dirLen = $dataLen = 2; + } + # increment IFD name + my $ifdNum = $dirName =~ s/(\d+)$// ? $1 : 0; + $dirName .= $ifdNum + 1; + $name =~ s/\d+$//; + $name .= $ifdNum + 1; + $$et{DIR_NAME} = $$et{PATH}[-1] = $dirName; + next unless $nextIfdOffset; + + # guard against writing the same directory twice + my $addr = $nextIfdOffset + $base; + if ($$et{PROCESSED}{$addr}) { + $et->Error("$name pointer references previous $$et{PROCESSED}{$addr} directory", 1); + last; + } + $$et{PROCESSED}{$addr} = $name; + + if ($dirName eq 'SubIFD1' and not ValidateIFD($dirInfo, $dirStart)) { + if ($$et{TIFF_TYPE} eq 'TIFF') { + $et->Error('Ignored bad IFD linked from SubIFD', 1); + } elsif ($verbose) { + $et->Warn('Ignored bad IFD linked from SubIFD'); + } + last; # don't write bad IFD + } + if ($$et{DEL_GROUP}{$dirName}) { + $verbose and print $out " Deleting $dirName\n"; + $raf and $et->Error("Deleting $dirName also deletes subsequent" . + " IFD's and possibly image data", 1); + ++$$et{CHANGED}; + if ($$et{DEL_GROUP}{$dirName} == 2 and + $$et{ADD_DIRS}{$dirName}) + { + my $emptyIFD = "\0" x 2; # start with empty IFD + $dataPt = \$emptyIFD; + $dirStart = 0; + $dirLen = $dataLen = 2; + } else { + last; # don't write this IFD (or any subsequent IFD) + } + } else { + $verbose and print $out " Rewriting $name\n"; + } + } +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + # do our fixups now so we can more easily calculate offsets below + $fixup->ApplyFixup(\$newData); +# +# determine total block size for deferred data +# + my $numBlocks = scalar @imageData; # save this so we scan only existing blocks later + my $blockSize = 0; # total size of blocks to copy later + my $blockInfo; + foreach $blockInfo (@imageData) { + my ($pos, $size, $pad) = @$blockInfo; + $blockSize += $size + $pad; + } +# +# copy over image data for IFD's, starting with the last IFD first +# + if (@offsetInfo) { + my $ttwLen; # length of MRW TTW segment + my @writeLater; # write image data last + for ($ifd=$#offsetInfo; $ifd>=-1; --$ifd) { + # build list of offsets to process + my @offsetList; + if ($ifd >= 0) { + my $offsetInfo = $offsetInfo[$ifd] or next; + # patch Panasonic RAW/RW2 StripOffsets/StripByteCounts if necessary + my $stripOffsets = $$offsetInfo{0x111}; + if ($stripOffsets and $$stripOffsets[0]{PanasonicHack}) { + require Image::ExifTool::PanasonicRaw; + my $err = Image::ExifTool::PanasonicRaw::PatchRawDataOffset($offsetInfo, $raf, $ifd); + $err and $et->Error($err); + } + my $tagID; + # loop through all tags in reverse order so we save thumbnail + # data before main image data if both exist in the same IFD + foreach $tagID (reverse sort keys %$offsetInfo) { + my $tagInfo = $$offsetInfo{$tagID}[0]; + next unless $$tagInfo{IsOffset}; # handle byte counts with offsets + my $sizeInfo = $$offsetInfo{$$tagInfo{OffsetPair}}; + $sizeInfo or $et->Error("No size tag for $dirName:$$tagInfo{Name}"), next; + my $dataTag = $$tagInfo{DataTag}; + # write TIFF image data (strips or tiles) later if requested + if ($raf and defined $$origDirInfo{ImageData} and + ($tagID == 0x111 or $tagID == 0x144 or + # also defer writing of other big data such as JpgFromRaw in NEF + ($$sizeInfo[3][0] and + # (calculate approximate combined size of all blocks) + $$sizeInfo[3][0] * scalar(@{$$sizeInfo[3]}) > 1000000)) and + # but don't defer writing if replacing with new value + (not defined $dataTag or not defined $offsetData{$dataTag})) + { + push @writeLater, [ $$offsetInfo{$tagID}, $sizeInfo ]; + } else { + push @offsetList, [ $$offsetInfo{$tagID}, $sizeInfo ]; + } + } + } else { + last unless @writeLater; + @offsetList = @writeLater; + } + my $offsetPair; + foreach $offsetPair (@offsetList) { + my ($tagInfo, $offsets, $count, $oldOffset) = @{$$offsetPair[0]}; + my ($cntInfo, $byteCounts, $count2, $oldSize, $format) = @{$$offsetPair[1]}; + # must be the same number of offset and byte count values + unless ($count == $count2) { + $et->Error("Offsets/ByteCounts disagree on count for $$tagInfo{Name}"); + return undef; + } + my $formatStr = $formatName[$format]; + # follow pointer to value data if necessary + $count > 1 and $offsets = Get32u(\$newData, $offsets); + my $n = $count * $formatSize[$format]; + $n > 4 and $byteCounts = Get32u(\$newData, $byteCounts); + if ($byteCounts < 0 or $byteCounts + $n > length($newData)) { + $et->Error("Error reading $$tagInfo{Name} byte counts"); + return undef; + } + # get offset base and data pos (abnormal for some preview images) + my ($dbase, $dpos, $wrongBase, $subIfdDataFixup); + if ($$tagInfo{IsOffset} eq '2') { + $dbase = $firstBase; + $dpos = $dataPos + $base - $firstBase; + } else { + $dbase = $base; + $dpos = $dataPos; + } + # use different base if necessary for some offsets (Minolta A200) + if ($$tagInfo{WrongBase}) { + my $self = $et; + #### eval WrongBase ($self) + $wrongBase = eval $$tagInfo{WrongBase} || 0; + $dbase += $wrongBase; + $dpos -= $wrongBase; + } else { + $wrongBase = 0; + } + my $oldOrder = GetByteOrder(); + my $dataTag = $$tagInfo{DataTag}; + # use different byte order for values of this offset pair if required (Minolta A200) + SetByteOrder($$tagInfo{ByteOrder}) if $$tagInfo{ByteOrder}; + # transfer the data referenced by all offsets of this tag + for ($n=0; $n<$count; ++$n) { + my ($oldEnd, $size); + if (@$oldOffset and @$oldSize) { + # calculate end offset of this block + $oldEnd = $$oldOffset[$n] + $$oldSize[$n]; + # update TIFF_END as if we read this data from file + UpdateTiffEnd($et, $oldEnd + $dbase); + } + my $offsetPos = $offsets + $n * 4; + my $byteCountPos = $byteCounts + $n * $formatSize[$format]; + if ($$tagInfo{PanasonicHack}) { + # use actual raw data length (may be different than StripByteCounts!) + $size = $$oldSize[$n]; + } else { + # use size of new data + $size = ReadValue(\$newData, $byteCountPos, $formatStr, 1, 4); + } + my $offset = $$oldOffset[$n]; + if (defined $offset) { + $offset -= $dpos; + } elsif ($size != 0xfeedfeed) { + $et->Error('Internal error (no offset)'); + return undef; + } + my $newOffset = length($newData) - $wrongBase; + my $buff; + # look for 'feed' code to use our new data + if ($size == 0xfeedfeed) { + unless (defined $dataTag) { + $et->Error("No DataTag defined for $$tagInfo{Name}"); + return undef; + } + unless (defined $offsetData{$dataTag}) { + $et->Error("Internal error (no $dataTag)"); + return undef; + } + if ($count > 1) { + $et->Error("Can't modify $$tagInfo{Name} with count $count"); + return undef; + } + $buff = $offsetData{$dataTag}; + if ($formatSize[$format] != 4) { + $et->Error("$$cntInfo{Name} is not int32"); + return undef; + } + # set the data size + $size = length($buff); + Set32u($size, \$newData, $byteCountPos); + } elsif ($ifd < 0) { + # pad if necessary (but don't pad contiguous image blocks) + my $pad = 0; + ++$pad if ($blockSize + $size) & 0x01 and ($n+1 >= $count or + not $oldEnd or $oldEnd != $$oldOffset[$n+1]); + # preserve original image padding if specified + if ($$origDirInfo{PreserveImagePadding} and $n+1 < $count and + $oldEnd and $$oldOffset[$n+1] > $oldEnd) + { + $pad = $$oldOffset[$n+1] - $oldEnd; + } + # copy data later + push @imageData, [$offset+$dbase+$dpos, $size, $pad]; + $newOffset += $blockSize; # data comes after other deferred data + # create fixup for SubIFD ImageData + if ($imageDataFlag eq 'SubIFD' and not $subIfdDataFixup) { + $subIfdDataFixup = new Image::ExifTool::Fixup; + $imageData[-1][4] = $subIfdDataFixup; + } + $size += $pad; # account for pad byte if necessary + # return ImageData list + $$origDirInfo{ImageData} = \@imageData; + } elsif ($offset >= 0 and $offset+$size <= $dataLen) { + # take data from old dir data buffer + $buff = substr($$dataPt, $offset, $size); + } elsif ($$et{TIFF_TYPE} eq 'MRW') { + # TTW segment must be an even 4 bytes long, so pad now if necessary + my $n = length $newData; + $buff = ($n & 0x03) ? "\0" x (4 - ($n & 0x03)) : ''; + $size = length($buff); + # data exists after MRW TTW segment + $ttwLen = length($newData) + $size unless defined $ttwLen; + $newOffset = $offset + $dpos + $ttwLen - $dataLen; + } elsif ($raf and $raf->Seek($offset+$dbase+$dpos,0) and + $raf->Read($buff,$size) == $size) + { + # (data was read OK) + # patch incorrect ThumbnailOffset in Sony A100 1.00 ARW images + if ($$et{TIFF_TYPE} eq 'ARW' and $$tagInfo{Name} eq 'ThumbnailOffset' and + $$et{Model} eq 'DSLR-A100' and $buff !~ /^\xff\xd8\xff/) + { + my $pos = $offset + $dbase + $dpos; + my $try; + if ($pos < 0x10000 and $raf->Seek($pos+0x10000,0) and + $raf->Read($try,$size) == $size and $try =~ /^\xff\xd8\xff/) + { + $buff = $try; + $et->Warn('Adjusted incorrect A100 ThumbnailOffset', 1); + } else { + $et->Error('Invalid ThumbnailImage'); + } + } + } elsif ($$tagInfo{Name} eq 'ThumbnailOffset' and $offset>=0 and $offset<$dataLen) { + # Grrr. The Canon 350D writes the thumbnail with an incorrect byte count + my $diff = $offset + $size - $dataLen; + $et->Warn("ThumbnailImage runs outside EXIF data by $diff bytes (truncated)",1); + # set the size to the available data + $size -= $diff; + unless (WriteValue($size, $formatStr, 1, \$newData, $byteCountPos)) { + warn 'Internal error writing thumbnail size'; + } + # get the truncated image + $buff = substr($$dataPt, $offset, $size); + } elsif ($$tagInfo{Name} eq 'PreviewImageStart' and $$et{FILE_TYPE} eq 'JPEG') { + # try to load the preview image using the specified offset + undef $buff; + my $r = $$et{RAF}; + if ($r and not $raf) { + my $tell = $r->Tell(); + # read and validate + undef $buff unless $r->Seek($offset+$base+$dataPos,0) and + $r->Read($buff,$size) == $size and + $buff =~ /^.\xd8\xff[\xc4\xdb\xe0-\xef]/s; + $r->Seek($tell, 0) or $et->Error('Seek error'), return undef; + } + # set flag if we must load PreviewImage + $buff = 'LOAD_PREVIEW' unless defined $buff; + } else { + my $dataName = $dataTag || $$tagInfo{Name}; + return undef if $et->Error("Error reading $dataName data in $name", $inMakerNotes); + $buff = ''; + } + if ($$tagInfo{Name} eq 'PreviewImageStart') { + if ($$et{FILE_TYPE} eq 'JPEG' and not $$tagInfo{MakerPreview}) { + # hold onto the PreviewImage until we can determine if it fits + $$et{PREVIEW_INFO} or $$et{PREVIEW_INFO} = { + Data => $buff, + Fixup => new Image::ExifTool::Fixup, + }; + if ($$tagInfo{IsOffset} and $$tagInfo{IsOffset} eq '2') { + $$et{PREVIEW_INFO}{NoBaseShift} = 1; + } + if ($offset >= 0 and $offset+$size <= $dataLen) { + # set flag indicating this preview wasn't in a trailer + $$et{PREVIEW_INFO}{WasContained} = 1; + } + $buff = ''; + } elsif ($$et{TIFF_TYPE} eq 'ARW' and $$et{Model} eq 'DSLR-A100') { + # the A100 double-references the same preview, so ignore the + # second one (the offset and size will be patched later) + next if $$et{A100PreviewLength}; + $$et{A100PreviewLength} = length $buff if defined $buff; + } + } + # update offset accordingly and add to end of new data + Set32u($newOffset, \$newData, $offsetPos); + # add a pointer to fix up this offset value (marked with DataTag name) + $fixup->AddFixup($offsetPos, $dataTag); + # also add to subIfdDataFixup if necessary + $subIfdDataFixup->AddFixup($offsetPos, $dataTag) if $subIfdDataFixup; + # must also (sometimes) update StripOffsets in Panasonic RW2 images + my $otherPos = $$offsetPair[0][5]; + if ($otherPos and $$tagInfo{PanasonicHack}) { + Set32u($newOffset, \$newData, $otherPos); + $fixup->AddFixup($otherPos, $dataTag); + } + if ($ifd >= 0) { + # buff length must be even (Note: may have changed since $size was set) + $buff .= "\0" if length($buff) & 0x01; + $newData .= $buff; # add this strip to the data + } else { + $blockSize += $size; # keep track of total size + } + } + SetByteOrder($oldOrder); + } + } + # verify that nothing else got written after determining TTW length + if (defined $ttwLen and $ttwLen != length($newData)) { + $et->Error('Internal error writing MRW TTW'); + } + } +# +# set offsets and generate fixups for tag values which were too large for memory +# + $blockSize = 0; + foreach $blockInfo (@imageData) { + my ($pos, $size, $pad, $entry, $subFix) = @$blockInfo; + if (defined $entry) { + my $format = Get16u(\$newData, $entry + 2); + if ($format < 1 or $format > 13) { + $et->Error('Internal error copying huge value'); + last; + } else { + # set count and offset in directory entry + Set32u($size / $formatSize[$format], \$newData, $entry + 4); + Set32u(length($newData)+$blockSize, \$newData, $entry + 8); + $fixup->AddFixup($entry + 8); + # create special fixup for SubIFD data + if ($imageDataFlag eq 'SubIFD') { + my $subIfdDataFixup = new Image::ExifTool::Fixup; + $subIfdDataFixup->AddFixup($entry + 8); + # save fixup in imageData list + $$blockInfo[4] = $subIfdDataFixup; + } + # must reset entry pointer so we don't use it again in a parent IFD! + $$blockInfo[3] = undef; + } + } + # apply additional shift required for contained SubIFD image data offsets + if ($subFix and defined $$subFix{BlockLen} and $numBlocks > 0) { + # our offset expects the data at the end of the SubIFD block (BlockLen + Start), + # but it will actually be at length($newData) + $blockSize. So adjust + # accordingly (and subtract an extra Start because this shift is applied later) + $$subFix{Shift} += length($newData) - $$subFix{BlockLen} - 2 * $$subFix{Start} + $blockSize; + $subFix->ApplyFixup(\$newData); + } + $blockSize += $size + $pad; + --$numBlocks; + } +# +# apply final shift to new data position if this is the top level IFD +# + unless ($$dirInfo{Fixup}) { + my $hdrPtr = $$dirInfo{HeaderPtr}; + my $newDataPos = $hdrPtr ? length $$hdrPtr : $$dirInfo{NewDataPos} || 0; + # adjust CanonVRD offset to point to end of regular TIFF if necessary + # (NOTE: This will be incorrect if multiple trailers exist, + # but it is unlikely that it could ever be correct in this case anyway. + # Also, this doesn't work for JPEG images (but CanonDPP doesn't set + # this when editing JPEG images anyway)) + $fixup->SetMarkerPointers(\$newData, 'CanonVRD', length($newData) + $blockSize); + if ($newDataPos) { + $$fixup{Shift} += $newDataPos; + $fixup->ApplyFixup(\$newData); + } + # save fixup for adjusting Leica trailer offset if necessary + $$et{LeicaTrailer}{Fixup}->AddFixup($fixup) if $$et{LeicaTrailer}; + # save fixup for PreviewImage in JPEG file if necessary + my $previewInfo = $$et{PREVIEW_INFO}; + if ($previewInfo) { + my $pt = \$$previewInfo{Data}; # image data or 'LOAD_PREVIEW' flag + # now that we know the size of the EXIF data, first test to see if our new image fits + # inside the EXIF segment (remember about the TIFF and EXIF headers: 8+6 bytes) + if (($$pt ne 'LOAD_PREVIEW' and length($$pt) + length($newData) + 14 <= 0xfffd and + not $$previewInfo{IsTrailer}) or + $$previewInfo{IsShort}) # must fit in this segment if using short pointers + { + # It fits! (or must exist in EXIF segment), so fixup the + # PreviewImage pointers and stuff the preview image in here + my $newPos = length($newData) + $newDataPos; + $newPos += ($$previewInfo{BaseShift} || 0); + if ($$previewInfo{Relative}) { + # calculate our base by looking at how far the pointer got shifted + $newPos -= ($fixup->GetMarkerPointers(\$newData, 'PreviewImage') || 0); + } + $fixup->SetMarkerPointers(\$newData, 'PreviewImage', $newPos); + $newData .= $$pt; + # set flag to delete old preview unless it was contained in the EXIF + $$et{DEL_PREVIEW} = 1 unless $$et{PREVIEW_INFO}{WasContained}; + delete $$et{PREVIEW_INFO}; # done with our preview data + } else { + # Doesn't fit, or we still don't know, so save fixup information + # and put the preview at the end of the file + $$previewInfo{Fixup} or $$previewInfo{Fixup} = new Image::ExifTool::Fixup; + $$previewInfo{Fixup}->AddFixup($fixup); + } + } elsif (defined $newData and $deleteAll) { + $newData = ''; # delete both IFD0 and IFD1 since only mandatory tags remain + } elsif ($$et{A100PreviewLength}) { + # save preview image start for patching A100 quirks later + $$et{A100PreviewStart} = $fixup->GetMarkerPointers(\$newData, 'PreviewImage'); + } + # save location of last IFD for use in Canon RAW header + if ($newDataPos == 16) { + my @ifdPos = $fixup->GetMarkerPointers(\$newData,'NextIFD'); + $$origDirInfo{LastIFD} = pop @ifdPos; + } + # recrypt SR2 SubIFD data if necessary + my $key = $$et{SR2SubIFDKey}; + if ($key) { + my $start = $fixup->GetMarkerPointers(\$newData, 'SR2SubIFDOffset'); + my $len = $$et{SR2SubIFDLength}; + # (must subtract 8 for size of TIFF header) + if ($start and $start - 8 + $len <= length $newData) { + require Image::ExifTool::Sony; + Image::ExifTool::Sony::Decrypt(\$newData, $start - 8, $len, $key); + } + } + } + # return empty string if no entries in directory + # (could be up to 10 bytes and still be empty) + $newData = '' if defined $newData and length($newData) < 12; + + # set changed if ForceWrite tag was set to "EXIF" + ++$$et{CHANGED} if defined $newData and length $newData and $$et{FORCE_WRITE}{EXIF}; + + return $newData; # return our directory data +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::WriteExif.pl - Write EXIF meta information + +=head1 SYNOPSIS + +This file is autoloaded by Image::ExifTool::Exif. + +=head1 DESCRIPTION + +This file contains routines to write EXIF metadata. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::Exif(3pm)|Image::ExifTool::Exif>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/WriteIPTC.pl b/lib/Image/ExifTool/WriteIPTC.pl new file mode 100644 index 0000000..d223950 --- /dev/null +++ b/lib/Image/ExifTool/WriteIPTC.pl @@ -0,0 +1,728 @@ +#------------------------------------------------------------------------------ +# File: WriteIPTC.pl +# +# Description: Write IPTC meta information +# +# Revisions: 12/15/2004 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::IPTC; + +use strict; + +# mandatory IPTC tags for each record +my %mandatory = ( + 1 => { + 0 => 4, # EnvelopeRecordVersion + }, + 2 => { + 0 => 4, # ApplicationRecordVersion + }, + 3 => { + 0 => 4, # NewsPhotoVersion + }, +); + +# manufacturer strings for IPTCPictureNumber +my %manufacturer = ( + 1 => 'Associated Press, USA', + 2 => 'Eastman Kodak Co, USA', + 3 => 'Hasselblad Electronic Imaging, Sweden', + 4 => 'Tecnavia SA, Switzerland', + 5 => 'Nikon Corporation, Japan', + 6 => 'Coatsworth Communications Inc, Canada', + 7 => 'Agence France Presse, France', + 8 => 'T/One Inc, USA', + 9 => 'Associated Newspapers, UK', + 10 => 'Reuters London', + 11 => 'Sandia Imaging Systems Inc, USA', + 12 => 'Visualize, Spain', +); + +my %iptcCharsetInv = ( 'UTF8' => "\x1b%G", 'UTF-8' => "\x1b%G" ); + +# ISO 2022 Character Coding Notes +# ------------------------------- +# Character set designation: (0x1b I F, or 0x1b I I F) +# Initial character 0x1b (ESC) +# Intermediate character I: +# 0x28 ('(') - G0, 94 chars +# 0x29 (')') - G1, 94 chars +# 0x2a ('*') - G2, 94 chars +# 0x2b ('+') - G3, 94 chars +# 0x2c (',') - G1, 96 chars +# 0x2d ('-') - G2, 96 chars +# 0x2e ('.') - G3, 96 chars +# 0x24 I ('$I') - multiple byte graphic sets (I from above) +# I 0x20 ('I ') - dynamically redefinable character sets +# Final character: +# 0x30 - 0x3f = private character set +# 0x40 - 0x7f = standardized character set +# Character set invocation: +# G0 : SI = 0x15 +# G1 : SO = 0x14, LS1R = 0x1b 0x7e ('~') +# G2 : LS2 = 0x1b 0x6e ('n'), LS2R = 0x1b 0x7d ('}') +# G3 : LS3 = 0x1b 0x6f ('o'), LS3R = 0x1b 0x7c ('|') +# (the locking shift "R" codes shift into 0x80-0xff space) +# Single character invocation: +# G2 : SS2 = 0x1b 0x8e (or 0x4e in 7-bit) +# G3 : SS3 = 0x1b 0x8f (or 0x4f in 7-bit) +# Control chars (designated and invoked) +# C0 : 0x1b 0x21 F (0x21 = '!') +# C1 : 0x1b 0x22 F (0x22 = '"') +# Complete codes (control+graphics, designated and invoked) +# 0x1b 0x25 F (0x25 = '%') +# 0x1b 0x25 I F +# 0x1b 0x25 0x47 ("\x1b%G") - UTF-8 +# 0x1b 0x25 0x40 ("\x1b%@") - return to ISO 2022 +# ------------------------------- + +#------------------------------------------------------------------------------ +# Inverse print conversion for CodedCharacterSet +# Inputs: 0) value +sub PrintInvCodedCharset($) +{ + my $val = shift; + my $code = $iptcCharsetInv{uc($val)}; + unless ($code) { + if (($code = $val) =~ s/ESC */\x1b/ig) { # translate ESC chars + $code =~ s/, \x1b/\x1b/g; # remove comma separators + $code =~ tr/ //d; # remove spaces + } else { + warn "Bad syntax (use 'UTF8' or 'ESC X Y[, ...]')\n"; + } + } + return $code; +} + +#------------------------------------------------------------------------------ +# validate raw values for writing +# Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref +# Returns: error string or undef (and possibly changes value) on success +sub CheckIPTC($$$) +{ + my ($et, $tagInfo, $valPtr) = @_; + my $format = $$tagInfo{Format} || $$tagInfo{Table}{FORMAT} || ''; + if ($format =~ /^int(\d+)/) { + my $bytes = int(($1 || 0) / 8); + if ($bytes != 1 and $bytes != 2 and $bytes != 4) { + return "Can't write $bytes-byte integer"; + } + my $val = $$valPtr; + unless (Image::ExifTool::IsInt($val)) { + return 'Not an integer' unless Image::ExifTool::IsHex($val); + $val = $$valPtr = hex($val); + } + my $n; + for ($n=0; $n<$bytes; ++$n) { $val >>= 8; } + return "Value too large for $bytes-byte format" if $val; + } elsif ($format =~ /^(string|digits|undef)\[?(\d+),?(\d*)\]?$/) { + my ($fmt, $minlen, $maxlen) = ($1, $2, $3); + my $len = length $$valPtr; + if ($fmt eq 'digits') { + return 'Non-numeric characters in value' unless $$valPtr =~ /^\d*$/; + if ($len < $minlen and $len) { + # left pad with zeros if necessary + $$valPtr = ('0' x ($minlen - $len)) . $$valPtr; + $len = $minlen; + } + } + if (defined $minlen and $fmt ne 'string') { # (must truncate strings later, after recoding) + $maxlen or $maxlen = $minlen; + if ($len < $minlen) { + unless ($$et{OPTIONS}{IgnoreMinorErrors}) { + return "[Minor] String too short (minlen is $minlen)"; + } + $$et{CHECK_WARN} = "String too short for IPTC:$$tagInfo{Name} (written anyway)"; + } elsif ($len > $maxlen and not $$et{OPTIONS}{IgnoreMinorErrors}) { + $$et{CHECK_WARN} = "[Minor] IPTC:$$tagInfo{Name} exceeds length limit (truncated)"; + $$valPtr = substr($$valPtr, 0, $maxlen); + } + } + } else { + return "Bad IPTC Format ($format)"; + } + return undef; +} + +#------------------------------------------------------------------------------ +# format IPTC data for writing +# Inputs: 0) ExifTool object ref, 1) tagInfo pointer, +# 2) value reference (changed if necessary), +# 3) reference to character set for translation (changed if necessary) +# 4) record number, 5) flag set to read value (instead of write) +sub FormatIPTC($$$$$;$) +{ + my ($et, $tagInfo, $valPtr, $xlatPtr, $rec, $read) = @_; + my $format = $$tagInfo{Format} || $$tagInfo{Table}{FORMAT}; + return unless $format; + if ($format =~ /^int(\d+)/) { + if ($read) { + my $len = length($$valPtr); + if ($len <= 8) { # limit integer conversion to 8 bytes long + my $val = 0; + my $i; + for ($i=0; $i<$len; ++$i) { + $val = $val * 256 + ord(substr($$valPtr, $i, 1)); + } + $$valPtr = $val; + } + } else { + my $len = int(($1 || 0) / 8); + if ($len == 1) { # 1 byte + $$valPtr = chr($$valPtr & 0xff); + } elsif ($len == 2) { # 2-byte integer + $$valPtr = pack('n', $$valPtr); + } else { # 4-byte integer + $$valPtr = pack('N', $$valPtr); + } + } + } elsif ($format =~ /^string/) { + if ($rec == 1) { + if ($$tagInfo{Name} eq 'CodedCharacterSet') { + $$xlatPtr = HandleCodedCharset($et, $$valPtr); + } + } elsif ($$xlatPtr and $rec < 7 and $$valPtr =~ /[\x80-\xff]/) { + TranslateCodedString($et, $valPtr, $xlatPtr, $read); + } + # must check length now (after any string recoding) + if (not $read and $format =~ /^string\[(\d+),?(\d*)\]$/) { + my ($minlen, $maxlen) = ($1, $2); + my $len = length $$valPtr; + $maxlen or $maxlen = $minlen; + if ($len < $minlen) { + if ($et->Warn("String too short for IPTC:$$tagInfo{Name} (padded)", 2)) { + $$valPtr .= ' ' x ($minlen - $len); + } + } elsif ($len > $maxlen) { + if ($et->Warn("IPTC:$$tagInfo{Name} exceeds length limit (truncated)", 2)) { + $$valPtr = substr($$valPtr, 0, $maxlen); + # make sure UTF-8 is still valid + if (($$xlatPtr || $et->Options('Charset')) eq 'UTF8') { + require Image::ExifTool::XMP; + Image::ExifTool::XMP::FixUTF8($valPtr,'.'); + } + } + } + } + } +} + +#------------------------------------------------------------------------------ +# generate IPTC-format date +# Inputs: 0) EXIF-format date string (YYYY:mm:dd) or date/time string +# Returns: IPTC-format date string (YYYYmmdd), or undef and issue warning on error +sub IptcDate($) +{ + my $val = shift; + unless ($val =~ s{^.*(\d{4})[-:/.]?(\d{2})[-:/.]?(\d{2}).*}{$1$2$3}s) { + warn "Invalid date format (use YYYY:mm:dd)\n"; + undef $val; + } + return $val; +} + +#------------------------------------------------------------------------------ +# generate IPTC-format time +# Inputs: 0) EXIF-format time string (HH:MM:SS[+/-HH:MM]) or date/time string +# Returns: IPTC-format time string (HHMMSS+HHMM), or undef and issue warning on error +sub IptcTime($) +{ + my $val = shift; + if ($val =~ /(.*?)\b(\d{1,2})(:?)(\d{2})(:?)(\d{2})(\S*)\s*$/s and ($3 or not $5)) { + $val = sprintf("%.2d%.2d%.2d",$2,$4,$6); + my ($date, $tz) = ($1, $7); + if ($tz =~ /([+-]\d{1,2}):?(\d{2})/) { + $tz = sprintf("%+.2d%.2d",$1,$2); + } elsif ($tz =~ /Z/i) { + $tz = '+0000'; # UTC + } else { + # use local system timezone by default + my (@tm, $time); + if ($date and $date =~ /^(\d{4}):(\d{2}):(\d{2})\s*$/ and eval { require Time::Local }) { + # we were given a date too, so determine the local timezone + # offset at the specified date/time + my @d = ($3,$2-1,$1); + $val =~ /(\d{2})(\d{2})(\d{2})/; + @tm = ($3,$2,$1,@d); + $time = Image::ExifTool::TimeLocal(@tm); + } else { + # it is difficult to get the proper local timezone offset for this + # time because the date tag is written separately. (The offset may be + # different on a different date due to daylight savings time.) In this + # case the best we can do easily is to use the current timezone offset. + $time = time; + @tm = localtime($time); + } + ($tz = Image::ExifTool::TimeZoneString(\@tm, $time)) =~ tr/://d; + } + $val .= $tz; + } else { + warn "Invalid time format (use HH:MM:SS[+/-HH:MM])\n"; + undef $val; # time format error + } + return $val; +} + +#------------------------------------------------------------------------------ +# Inverse print conversion for IPTC date or time value +# Inputs: 0) ExifTool ref, 1) IPTC date or 'now' +# Returns: IPTC date +sub InverseDateOrTime($$) +{ + my ($et, $val) = @_; + return $et->TimeNow() if lc($val) eq 'now'; + return $val; +} + +#------------------------------------------------------------------------------ +# Convert picture number +# Inputs: 0) value +# Returns: Converted value +sub ConvertPictureNumber($) +{ + my $val = shift; + if ($val eq "\0" x 16) { + $val = 'Unknown'; + } elsif (length $val >= 16) { + my @vals = unpack('nNA8n', $val); + $val = $vals[0]; + my $manu = $manufacturer{$val}; + $val .= " ($manu)" if $manu; + $val .= ', equip ' . $vals[1]; + $vals[2] =~ s/(\d{4})(\d{2})(\d{2})/$1:$2:$3/; + $val .= ", $vals[2], no. $vals[3]"; + } else { + $val = '<format error>' + } + return $val; +} + +#------------------------------------------------------------------------------ +# Inverse picture number conversion +# Inputs: 0) value +# Returns: Converted value (or undef on error) +sub InvConvertPictureNumber($) +{ + my $val = shift; + $val =~ s/\(.*\)//g; # remove manufacturer description + $val =~ tr/://d; # remove date separators + $val =~ tr/0-9/ /c; # turn remaining non-numbers to spaces + my @vals = split ' ', $val; + if (@vals >= 4) { + $val = pack('nNA8n', @vals); + } elsif ($val =~ /unknown/i) { + $val = "\0" x 16; + } else { + undef $val; + } + return $val; +} + +#------------------------------------------------------------------------------ +# Write IPTC data record +# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref +# Returns: IPTC data block (may be empty if no IPTC data) +# Notes: Increments ExifTool CHANGED flag for each tag changed +sub DoWriteIPTC($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + + # avoid editing IPTC directory unless necessary: + # - improves speed + # - avoids changing current MD5 digest unnecessarily + # - avoids adding mandatory tags unless some other IPTC is changed + unless (exists $$et{EDIT_DIRS}{$$dirInfo{DirName}} or + # standard IPTC tags in other locations should be edited too (eg. AFCP_IPTC) + ($tagTablePtr eq \%Image::ExifTool::IPTC::Main and exists $$et{EDIT_DIRS}{IPTC})) + { + print $out "$$et{INDENT} [nothing changed]\n" if $verbose; + return undef; + } + my $dataPt = $$dirInfo{DataPt}; + unless ($dataPt) { + my $emptyData = ''; + $dataPt = \$emptyData; + } + my $start = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen}; + my ($tagInfo, %iptcInfo, $tag); + + # start by assuming default IPTC encoding + my $xlat = $et->Options('CharsetIPTC'); + undef $xlat if $xlat eq $et->Options('Charset'); + + # make sure our dataLen is defined (note: allow zero length directory) + unless (defined $dirLen) { + my $dataLen = $$dirInfo{DataLen}; + $dataLen = length($$dataPt) unless defined $dataLen; + $dirLen = $dataLen - $start; + } + # quick check for improperly byte-swapped IPTC + if ($dirLen >= 4 and substr($$dataPt, $start, 1) ne "\x1c" and + substr($$dataPt, $start + 3, 1) eq "\x1c") + { + $et->Warn('IPTC data was improperly byte-swapped'); + my $newData = pack('N*', unpack('V*', substr($$dataPt, $start, $dirLen) . "\0\0\0")); + $dataPt = \$newData; + $start = 0; + # NOTE: MUST NOT access $dirInfo DataPt, DirStart or DataLen after this! + } + # generate lookup so we can find the record numbers + my %recordNum; + foreach $tag (Image::ExifTool::TagTableKeys($tagTablePtr)) { + $tagInfo = $$tagTablePtr{$tag}; + $$tagInfo{SubDirectory} or next; + my $table = $$tagInfo{SubDirectory}{TagTable} or next; + my $subTablePtr = Image::ExifTool::GetTagTable($table); + $recordNum{$subTablePtr} = $tag; + } + + # loop through new values and accumulate all IPTC information + # into lists based on their IPTC record type + foreach $tagInfo ($et->GetNewTagInfoList()) { + my $table = $$tagInfo{Table}; + my $record = $recordNum{$table}; + # ignore tags we aren't writing to this directory + next unless defined $record; + $iptcInfo{$record} = [] unless defined $iptcInfo{$record}; + push @{$iptcInfo{$record}}, $tagInfo; + } + + # get sorted list of records used. Might as well be organized and + # write our records in order of record number first, then tag number + my @recordList = sort { $a <=> $b } keys %iptcInfo; + my ($record, %set); + foreach $record (@recordList) { + # sort tagInfo lists by tagID + @{$iptcInfo{$record}} = sort { $$a{TagID} <=> $$b{TagID} } @{$iptcInfo{$record}}; + # build hash of all tagIDs to set + foreach $tagInfo (@{$iptcInfo{$record}}) { + $set{$record}->{$$tagInfo{TagID}} = $tagInfo; + } + } + # run through the old IPTC data, inserting our records in + # sequence and deleting existing records where necessary + # (the IPTC specification states that records must occur in + # numerical order, but tags within records need not be ordered) + my $pos = $start; + my $tail = $pos; # old data written up to this point + my $dirEnd = $start + $dirLen; + my $newData = ''; + my $lastRec = -1; + my $lastRecPos = 0; + my $allMandatory = 0; + my %foundRec; # found flags: 0x01-existed before, 0x02-deleted, 0x04-created + my $addNow; + + for (;;$tail=$pos) { + # get next IPTC record from input directory + my ($id, $rec, $tag, $len, $valuePtr); + if ($pos + 5 <= $dirEnd) { + my $buff = substr($$dataPt, $pos, 5); + ($id, $rec, $tag, $len) = unpack("CCCn", $buff); + if ($id == 0x1c) { + if ($rec < $lastRec) { + if ($rec == 0) { + return undef if $et->Warn("IPTC record 0 encountered, subsequent records ignored", 2); + undef $rec; + $pos = $dirEnd; + $len = 0; + } else { + return undef if $et->Warn("IPTC doesn't conform to spec: Records out of sequence", 2); + } + } + # handle extended IPTC entry if necessary + $pos += 5; # step to after field header + if ($len & 0x8000) { + my $n = $len & 0x7fff; # get num bytes in length field + if ($pos + $n <= $dirEnd and $n <= 8) { + # determine length (a big-endian, variable sized int) + for ($len = 0; $n; ++$pos, --$n) { + $len = $len * 256 + ord(substr($$dataPt, $pos, 1)); + } + } else { + $len = $dirEnd; # invalid length + } + } + $valuePtr = $pos; + $pos += $len; # step $pos to next entry + # make sure we don't go past the end of data + # (this can only happen if original data is bad) + $pos = $dirEnd if $pos > $dirEnd; + } else { + undef $rec; + } + } + # write out all our records that come before this one + my $writeRec = (not defined $rec or $rec != $lastRec); + if ($writeRec or $addNow) { + for (;;) { + my $newRec = $recordList[0]; + if ($addNow) { + $tagInfo = $addNow; + } elsif (not defined $newRec or $newRec != $lastRec) { + # handle mandatory tags in last record unless it was empty + if (length $newData > $lastRecPos) { + if ($allMandatory > 1) { + # entire lastRec contained mandatory tags, and at least one tag + # was deleted, so delete entire record unless we specifically + # added a mandatory tag + my $num = 0; + foreach (keys %{$foundRec{$lastRec}}) { + my $code = $foundRec{$lastRec}->{$_}; + $num = 0, last if $code & 0x04; + ++$num if ($code & 0x03) == 0x01; + } + if ($num) { + $newData = substr($newData, 0, $lastRecPos); + $verbose > 1 and print $out " - $num mandatory tags\n"; + } + } elsif ($mandatory{$lastRec} and + $tagTablePtr eq \%Image::ExifTool::IPTC::Main) + { + # add required mandatory tags + my $mandatory = $mandatory{$lastRec}; + my ($mandTag, $subTablePtr); + foreach $mandTag (sort { $a <=> $b } keys %$mandatory) { + next if $foundRec{$lastRec}->{$mandTag}; + unless ($subTablePtr) { + $tagInfo = $$tagTablePtr{$lastRec}; + $tagInfo and $$tagInfo{SubDirectory} or warn("WriteIPTC: Internal error 1\n"), next; + $$tagInfo{SubDirectory}{TagTable} or next; + $subTablePtr = Image::ExifTool::GetTagTable($$tagInfo{SubDirectory}{TagTable}); + } + $tagInfo = $$subTablePtr{$mandTag} or warn("WriteIPTC: Internal error 2\n"), next; + my $value = $$mandatory{$mandTag}; + $et->VerboseValue("+ IPTC:$$tagInfo{Name}", $value, ' (mandatory)'); + # apply necessary format conversions + FormatIPTC($et, $tagInfo, \$value, \$xlat, $lastRec); + $len = length $value; + # generate our new entry + my $entry = pack("CCCn", 0x1c, $lastRec, $mandTag, length($value)); + $newData .= $entry . $value; # add entry to new IPTC data + # (don't mark as changed if just mandatory tags changed) + # ++$$et{CHANGED}; + } + } + } + last unless defined $newRec; + $lastRec = $newRec; + $lastRecPos = length $newData; + $allMandatory = 1; + } + unless ($addNow) { + # compare current entry with entry next in line to write out + # (write out our tags in numerical order even though + # this isn't required by the IPTC spec) + last if defined $rec and $rec <= $newRec; + $tagInfo = ${$iptcInfo{$newRec}}[0]; + } + my $newTag = $$tagInfo{TagID}; + my $nvHash = $et->GetNewValueHash($tagInfo); + # only add new values if... + my ($doSet, @values); + my $found = $foundRec{$newRec}->{$newTag} || 0; + if ($found & 0x02) { + # ...tag existed before and was deleted (unless we already added it) + $doSet = 1 unless $found & 0x04; + } elsif ($$tagInfo{List}) { + # ...tag is List and it existed before or we are creating it + $doSet = 1 if $found ? not $$nvHash{CreateOnly} : $$nvHash{IsCreating}; + } else { + # ...tag didn't exist before and we are creating it + $doSet = 1 if not $found and $$nvHash{IsCreating}; + } + if ($doSet) { + @values = $et->GetNewValue($nvHash); + @values and $foundRec{$newRec}->{$newTag} = $found | 0x04; + # write tags for each value in list + my $value; + foreach $value (@values) { + $et->VerboseValue("+ $$dirInfo{DirName}:$$tagInfo{Name}", $value); + # reset allMandatory flag if a non-mandatory tag is written + if ($allMandatory) { + my $mandatory = $mandatory{$newRec}; + $allMandatory = 0 unless $mandatory and $$mandatory{$newTag}; + } + # apply necessary format conversions + FormatIPTC($et, $tagInfo, \$value, \$xlat, $newRec); + # (note: IPTC string values are NOT null terminated) + $len = length $value; + # generate our new entry + my $entry = pack("CCC", 0x1c, $newRec, $newTag); + if ($len <= 0x7fff) { + $entry .= pack("n", $len); + } else { + # extended dataset tag + $entry .= pack("nN", 0x8004, $len); + } + $newData .= $entry . $value; # add entry to new IPTC data + ++$$et{CHANGED}; + } + } + # continue on with regular programming if done adding tag now + if ($addNow) { + undef $addNow; + next if $writeRec; + last; + } + # remove this tagID from the sorted write list + shift @{$iptcInfo{$newRec}}; + shift @recordList unless @{$iptcInfo{$newRec}}; + } + if ($writeRec) { + # all done if no more records to write + last unless defined $rec; + # update last record variables + $lastRec = $rec; + $lastRecPos = length $newData; + $allMandatory = 1; + } + } + # set flag indicating we found this tag + $foundRec{$rec}->{$tag} = ($foundRec{$rec}->{$tag} || 0) || 0x01; + # write out this record unless we are setting it with a new value + $tagInfo = $set{$rec}->{$tag}; + if ($tagInfo) { + my $nvHash = $et->GetNewValueHash($tagInfo); + $len = $pos - $valuePtr; + my $val = substr($$dataPt, $valuePtr, $len); + # remove null terminator if it exists (written by braindead software like Picasa 2.0) + $val =~ s/\0+$// if $$tagInfo{Format} and $$tagInfo{Format} =~ /^string/; + my $oldXlat = $xlat; + FormatIPTC($et, $tagInfo, \$val, \$xlat, $rec, 1); + if ($et->IsOverwriting($nvHash, $val)) { + $xlat = $oldXlat; # don't change translation (not writing this value) + $et->VerboseValue("- $$dirInfo{DirName}:$$tagInfo{Name}", $val); + ++$$et{CHANGED}; + # set deleted flag to indicate we found and deleted this tag + $foundRec{$rec}->{$tag} |= 0x02; + # increment allMandatory flag to indicate a tag was removed + $allMandatory and ++$allMandatory; + # write this tag now if overwriting an existing value + if ($$nvHash{Value} and @{$$nvHash{Value}} and @recordList and + $recordList[0] == $rec and not $foundRec{$rec}->{$tag} & 0x04) + { + $addNow = $tagInfo; + } + next; + } + } elsif ($rec == 1 and $tag == 90) { + # handle CodedCharacterSet tag + my $val = substr($$dataPt, $valuePtr, $pos - $valuePtr); + $xlat = HandleCodedCharset($et, $val); + } + # reset allMandatory flag if a non-mandatory tag is written + if ($allMandatory) { + my $mandatory = $mandatory{$rec}; + unless ($mandatory and $$mandatory{$tag}) { + $allMandatory = 0; + } + } + # write out the record + $newData .= substr($$dataPt, $tail, $pos-$tail); + } + # make sure the rest of the data is zero + if ($tail < $dirEnd) { + my $pad = substr($$dataPt, $tail, $dirEnd-$tail); + if ($pad =~ /[^\0]/) { + return undef if $et->Warn('Unrecognized data in IPTC padding', 2); + } + } + return $newData; +} + +#------------------------------------------------------------------------------ +# Write IPTC data record and calculate NewIPTCDigest +# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref +# Returns: IPTC data block (may be empty if no IPTC data) +# Notes: Increments ExifTool CHANGED flag for each tag changed +sub WriteIPTC($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to autoload this package + + my $newData = DoWriteIPTC($et, $dirInfo, $tagTablePtr); + + # calculate standard IPTC digests only if we are writing or deleting + # Photoshop:IPTCDigest with a value of 'new' or 'old' + while ($Image::ExifTool::Photoshop::iptcDigestInfo) { + my $nvHash = $$et{NEW_VALUE}{$Image::ExifTool::Photoshop::iptcDigestInfo}; + last unless defined $nvHash; + last unless IsStandardIPTC($et->MetadataPath()); + my @values = $et->GetNewValue($nvHash); + push @values, @{$$nvHash{DelValue}} if $$nvHash{DelValue}; + my $new = grep /^new$/, @values; + my $old = grep /^old$/, @values; + last unless $new or $old; + unless (eval { require Digest::MD5 }) { + $et->Warn('Digest::MD5 must be installed to calculate IPTC digest'); + last; + } + my $dataPt; + if ($new) { + if (defined $newData) { + $dataPt = \$newData; + } else { + $dataPt = $$dirInfo{DataPt}; + if ($$dirInfo{DirStart} or length($$dataPt) != $$dirInfo{DirLen}) { + my $buff = substr($$dataPt, $$dirInfo{DirStart}, $$dirInfo{DirLen}); + $dataPt = \$buff; + } + } + # set NewIPTCDigest data member unless IPTC is being deleted + $$et{NewIPTCDigest} = Digest::MD5::md5($$dataPt) if length $$dataPt; + } + if ($old) { + if ($new and not defined $newData) { + $$et{OldIPTCDigest} = $$et{NewIPTCDigest}; + } elsif ($$dirInfo{DataPt}) { #(may be undef if creating new IPTC) + $dataPt = $$dirInfo{DataPt}; + if ($$dirInfo{DirStart} or length($$dataPt) != $$dirInfo{DirLen}) { + my $buff = substr($$dataPt, $$dirInfo{DirStart}, $$dirInfo{DirLen}); + $dataPt = \$buff; + } + $$et{OldIPTCDigest} = Digest::MD5::md5($$dataPt) if length $$dataPt; + } + } + last; + } + # set changed if ForceWrite tag was set to "IPTC" + ++$$et{CHANGED} if defined $newData and length $newData and $$et{FORCE_WRITE}{IPTC}; + return $newData; +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::WriteIPTC.pl - Write IPTC meta information + +=head1 SYNOPSIS + +This file is autoloaded by Image::ExifTool::IPTC. + +=head1 DESCRIPTION + +This file contains routines to write IPTC metadata, plus a few other +seldom-used routines. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::IPTC(3pm)|Image::ExifTool::IPTC>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/WritePDF.pl b/lib/Image/ExifTool/WritePDF.pl new file mode 100644 index 0000000..9820736 --- /dev/null +++ b/lib/Image/ExifTool/WritePDF.pl @@ -0,0 +1,771 @@ +#------------------------------------------------------------------------------ +# File: WritePDF.pl +# +# Description: Write PDF meta information +# +# Revisions: 12/08/2007 - P. Harvey Created +# +# References: 1) http://partners.adobe.com/public/developer/pdf/index_reference.html +# +# Notes: The special "PDF-update" group can be deleted to revert exiftool updates +#------------------------------------------------------------------------------ +package Image::ExifTool::PDF; + +use strict; +use vars qw($lastFetched); + +sub WriteObject($$); +sub EncodeString($); +sub CryptObject($); + +# comments to mark beginning and end of ExifTool incremental update +my $beginComment = '%BeginExifToolUpdate'; +my $endComment = '%EndExifToolUpdate '; + +my $keyExt; # crypt key extension +my $pdfVer; # version of PDF file we are currently writing + +# internal tags used in dictionary objects +my %myDictTags = ( + _tags => 1, _stream => 1, _decrypted => 1, _needCrypt => 1, + _filtered => 1, _entry_size => 1, _table => 1, +); + +# map for directories that we can add +my %pdfMap = ( + XMP => 'PDF', +); + +#------------------------------------------------------------------------------ +# Validate raw PDF values for writing (string date integer real boolean name) +# Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref +# Returns: error string or undef (and possibly changes value) on success +sub CheckPDF($$$) +{ + my ($et, $tagInfo, $valPtr) = @_; + my $format = $$tagInfo{Writable} || $tagInfo->{Table}->{WRITABLE}; + if (not $format) { + return 'No writable format'; + } elsif ($format eq 'string') { + # (encode later because list-type string tags need to be encoded as a unit) + } elsif ($format eq 'date') { + # be flexible about this for now + return 'Bad date format' unless $$valPtr =~ /^\d{4}/; + } elsif ($format eq 'integer') { + return 'Not an integer' unless Image::ExifTool::IsInt($$valPtr); + } elsif ($format eq 'real') { + return 'Not a real number' unless $$valPtr =~ /^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/; + } elsif ($format eq 'boolean') { + $$valPtr = ($$valPtr and $$valPtr !~ /^f/i) ? 'true' : 'false'; + } elsif ($format eq 'name') { + return 'Invalid PDF name' if $$valPtr =~ /\0/; + } else { + return "Invalid PDF format '${format}'"; + } + return undef; # value is OK +} + +#------------------------------------------------------------------------------ +# Format value for writing to PDF file +# Inputs: 0) ExifTool ref, 1) value, 2) format string (string,date,integer,real,boolean,name) +# Returns: formatted value or undef on error +# Notes: Called at write time, so $pdfVer may be checked +sub WritePDFValue($$$) +{ + my ($et, $val, $format) = @_; + if (not $format) { + return undef; + } elsif ($format eq 'string') { + # encode as UCS2 if it contains any special characters + $val = "\xfe\xff" . $et->Encode($val,'UCS2','MM') if $val =~ /[\x80-\xff]/; + EncodeString(\$val); + } elsif ($format eq 'date') { + # convert date to "D:YYYYmmddHHMMSS+-HH'MM'" format + $val =~ s/([-+]\d{2}):(\d{2})/${1}'${2}'/; # change timezone delimiters if necessary + $val =~ tr/ ://d; # remove spaces and colons + $val = "D:$val"; # add leading "D:" + EncodeString(\$val); + } elsif ($format =~ /^(integer|real|boolean)$/) { + # no reformatting necessary + } elsif ($format eq 'name') { + return undef if $val =~ /\0/; + if ($pdfVer >= 1.2) { + $val =~ s/([\t\n\f\r ()<>[\]{}\/%#])/sprintf('#%.2x',ord $1)/sge; + } else { + return undef if $val =~ /[\t\n\f\r ()<>[\]{}\/%]/; + } + $val = "/$val"; # add leading '/' + } else { + return undef; + } + return $val; +} + +#------------------------------------------------------------------------------ +# Encode PDF string +# Inputs: 0) reference to PDF string +# Returns: (updates string with encoded data) +sub EncodeString($) +{ + my $strPt = shift; + if (ref $$strPt eq 'ARRAY') { + my $str; + foreach $str (@{$$strPt}) { + EncodeString(\$str); + } + return; + } + Crypt($strPt, $keyExt, 1); # encrypt if necessary + # encode as hex if we have any control characters (except tab) + if ($$strPt=~/[\x00-\x08\x0a-\x1f\x7f\xff]/) { + # encode as hex + my $str=''; + my $len = length $$strPt; + my $i = 0; + for (;;) { + my $n = $len - $i or last; + $n = 40 if $n > 40; # break into reasonable-length lines + $str .= $/ if $i; + $str .= unpack('H*', substr($$strPt, $i, $n)); + $i += $n; + } + $$strPt = "<$str>"; + } else { + $$strPt =~ s/([()\\])/\\$1/g; # must escape round brackets and backslashes + $$strPt = "($$strPt)"; + } +} + +#------------------------------------------------------------------------------ +# Encrypt an object +# Inputs: 0) PDF object (encrypts in place) +# Notes: Encrypts according to "_needCrypt" dictionary entry, +# then deletes "_needCrypt" when done +sub CryptObject($) +{ + my $obj = $_[0]; + if (not ref $obj) { + # only literal strings and hex strings are encrypted + if ($obj =~ /^[(<]/) { + undef $lastFetched; # (reset this just in case) + my $val = ReadPDFValue($obj); + EncodeString(\$val); + $_[0] = $val; + } + } elsif (ref $obj eq 'HASH') { + my $tag; + my $needCrypt = $$obj{_needCrypt}; + foreach $tag (keys %$obj) { + next if $myDictTags{$tag}; + # re-encrypt necessary objects only (others are still encrypted) + # (this is really annoying, but is necessary because objects stored + # in encrypted streams are decrypted when extracting, but strings stored + # as direct objects are decrypted later since they must be decoded + # before being decrypted) + if ($needCrypt) { + next unless defined $$needCrypt{$tag} ? $$needCrypt{$tag} : $$needCrypt{'*'}; + } + CryptObject($$obj{$tag}); + } + delete $$obj{_needCrypt}; # avoid re-re-crypting + } elsif (ref $obj eq 'ARRAY') { + my $val; + foreach $val (@$obj) { + CryptObject($val); + } + } +} + +#------------------------------------------------------------------------------ +# Get free entries from xref stream dictionary that we wrote previously +# Inputs: 0) xref dictionary reference +# Returns: free entry hash (keys are object numbers, values are xref entry list refs) +sub GetFreeEntries($) +{ + my $dict = shift; + my %xrefFree; + # from the start we have only written xref stream entries in 'CNn' format, + # so we can simplify things for now and only support this type of entry + my $w = $$dict{W}; + if (ref $w eq 'ARRAY' and "@$w" eq '1 4 2') { + my $size = $$dict{_entry_size}; # this will be 7 for 'CNn' + my $index = $$dict{Index}; + my $len = length $$dict{_stream}; + # scan the table for free objects + my $num = scalar(@$index) / 2; + my $pos = 0; + my ($i, $j); + for ($i=0; $i<$num; ++$i) { + my $start = $$index[$i*2]; + my $count = $$index[$i*2+1]; + for ($j=0; $j<$count; ++$j) { + last if $pos + $size > $len; + my @t = unpack("x$pos CNn", $$dict{_stream}); + # add entry if object was free + $xrefFree{$start+$j} = [ $t[1], $t[2], 'f' ] if $t[0] == 0; + $pos += $size; # step to next entry + } + } + } + return \%xrefFree; +} + +#------------------------------------------------------------------------------ +# Write PDF object +# Inputs: 0) output file or scalar ref, 1) PDF object +# Returns: true on success +# Notes: inserts white space before object, but none afterward +sub WriteObject($$) +{ + my ($outfile, $obj) = @_; + if (ref $obj eq 'SCALAR') { + Write($outfile, ' ', $$obj) or return 0; + } elsif (ref $obj eq 'ARRAY') { + # write array + Write($outfile, @$obj > 10 ? $/ : ' ', '[') or return 0; + my $item; + foreach $item (@$obj) { + WriteObject($outfile, $item) or return 0; + } + Write($outfile, ' ]') or return 0; + } elsif (ref $obj eq 'HASH') { + # write dictionary + my $tag; + Write($outfile, $/, '<<') or return 0; + # prepare object as required if it has a stream + if ($$obj{_stream}) { + # encrypt stream if necessary (must be done before determining Length) + CryptStream($obj, $keyExt) if $$obj{_decrypted}; + # write "Length" entry in dictionary + $$obj{Length} = length $$obj{_stream}; + push @{$$obj{_tags}}, 'Length'; + # delete Filter-related entries since we don't yet write filtered streams + delete $$obj{Filter}; + delete $$obj{DecodeParms}; + delete $$obj{DL}; + } + # don't write my internal entries + my %wrote = %myDictTags; + # write tags in original order, adding new ones later alphabetically + foreach $tag (@{$$obj{_tags}}, sort keys %$obj) { + # ignore already-written or missing entries + next if $wrote{$tag} or not defined $$obj{$tag}; + Write($outfile, $/, "/$tag") or return 0; + WriteObject($outfile, $$obj{$tag}) or return 0; + $wrote{$tag} = 1; + } + Write($outfile, $/, '>>') or return 0; + if ($$obj{_stream}) { + # write object stream + # (a single 0x0d may not follow 'stream', so use 0x0d+0x0a here to be sure) + Write($outfile, $/, "stream\x0d\x0a") or return 0; + Write($outfile, $$obj{_stream}, $/, 'endstream') or return 0; + } + } else { + # write string, number, name or object reference + Write($outfile, ' ', $obj); + } + return 1; +} + +#------------------------------------------------------------------------------ +# Write PDF File +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if not valid PDF file, -1 on write error +# Notes: dictionary structure: Main --+--> Info +# +--> Root --> Metadata +sub WritePDF($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $outfile = $$dirInfo{OutFile}; + my ($buff, %capture, %newXRef, %newObj, $objRef); + my ($out, $id, $gen, $obj); + + # make sure this is a PDF file + my $pos = $raf->Tell(); + $raf->Read($buff, 1024) >= 8 or return 0; + $buff =~ /^(\s*)%PDF-(\d+\.\d+)/ or return 0; + $$et{PDFBase} = length $1; + $raf->Seek($pos, 0); + + # create a new ExifTool object and use it to read PDF and XMP information + my $newTool = new Image::ExifTool; + $newTool->Options(List => 1); + $newTool->Options(Password => $et->Options('Password')); + $newTool->Options(NoPDFList => $et->Options('NoPDFList')); + $$newTool{PDF_CAPTURE} = \%capture; + my $info = $newTool->ImageInfo($raf, 'XMP', 'PDF:*', 'Error', 'Warning'); + # not a valid PDF file unless we got a version number + # (note: can't just check $$info{PDFVersion} due to possibility of XMP-pdf:PDFVersion) + my $vers = $newTool->GetInfo('PDF:PDFVersion'); + # take highest version number if multiple versions in an incremental save + ($pdfVer) = sort { $b <=> $a } values %$vers; + $pdfVer or $et->Error('Missing PDF:PDFVersion'), return 0; + # check version number + if ($pdfVer > 1.7) { + $et->Warn("The PDF $pdfVer specification is not freely available", 1); + # (so writing by ExifTool is based on trial and error) + } + # fail if we had any serious errors while extracting information + if ($capture{Error} or $$info{Error}) { + $et->Error($capture{Error} || $$info{Error}); + return 1; + } + # make sure we have everything we need to rewrite this file + foreach $obj (qw(Main Root xref)) { + next if $capture{$obj}; + # any warning we received may give a clue about why this object is missing + $et->Error($$info{Warning}) if $$info{Warning}; + $et->Error("Can't find $obj object"); + return 1; + } + $et->InitWriteDirs(\%pdfMap, 'XMP'); + + # copy file up to start of previous exiftool update or end of file + # (comment, startxref & EOF with 11-digit offsets and 2-byte newlines is 63 bytes) + $raf->Seek(-64,2) and $raf->Read($buff,64) and $raf->Seek(0,0) or return -1; + my $rtn = 1; + my $prevUpdate; + # (now $endComment is before "startxref", but pre-7.41 we wrote it after the EOF) + if ($buff =~ /$endComment(\d+)\s+(startxref\s+\d+\s+%%EOF\s+)?$/s) { + $prevUpdate = $1; + # rewrite the file up to the original EOF + Image::ExifTool::CopyBlock($raf, $outfile, $prevUpdate + $$et{PDFBase}) or $rtn = -1; + # verify that we are now at the start of an ExifTool update + unless ($raf->Read($buff, length $beginComment) and $buff eq $beginComment) { + $et->Error('Previous ExifTool update is corrupted'); + return $rtn; + } + $raf->Seek($prevUpdate+$$et{PDFBase}, 0) or $rtn = -1; + if ($$et{DEL_GROUP}{'PDF-update'}) { + $et->VPrint(0, " Reverted previous ExifTool updates\n"); + ++$$et{CHANGED}; + return $rtn; + } + } elsif ($$et{DEL_GROUP}{'PDF-update'}) { + $et->Error('File contains no previous ExifTool update'); + return $rtn; + } else { + # rewrite the whole file + while ($raf->Read($buff, 65536)) { + Write($outfile, $buff) or $rtn = -1; + } + } + $out = $et->Options('TextOut') if $et->Options('Verbose'); +# +# create our new PDF objects to write +# + my $xref = $capture{xref}; + my $mainDict = $capture{Main}; + my $metaRef = $capture{Root}->{Metadata}; + my $nextObject; + + # start by finding reference for info object in case it was deleted + # in a previous edit so we can re-use it here if adding PDF Info + my $prevInfoRef; + if ($prevUpdate) { + unless ($capture{Prev}) { + $et->Error("Can't locate trailer dictionary prior to last edit"); + return $rtn; + } + $prevInfoRef = $capture{Prev}->{Info}; + # start from previous size so the xref table doesn't continue + # to grow if we repeatedly add and delete the Metadata object + $nextObject = $capture{Prev}->{Size}; + # don't re-use Meta reference if object was added in a previous update + undef $metaRef if $metaRef and $$metaRef=~/^(\d+)/ and $1 >= $nextObject; + } else { + $prevInfoRef = $$mainDict{Info}; + $nextObject = $$mainDict{Size}; + } + + # delete entire PDF group if specified + my $infoChanged = 0; + if ($$et{DEL_GROUP}{PDF} and $capture{Info}) { + delete $capture{Info}; + $info = { XMP => $$info{XMP} }; # remove extracted PDF tags + print $out " Deleting PDF Info dictionary\n" if $out; + ++$infoChanged; + } + + # create new Info dictionary if necessary + $capture{Info} = { _tags => [ ] } unless $capture{Info}; + my $infoDict = $capture{Info}; + + # must pre-determine Info reference to be used in encryption + my $infoRef = $prevInfoRef || \ "$nextObject 0 R"; + $keyExt = $$infoRef; + + # must encrypt all values in dictionary if they came from an encrypted stream + CryptObject($infoDict) if $$infoDict{_needCrypt}; + + # must set line separator before calling WritePDFValue() + local $/ = $capture{newline}; + + # rewrite PDF Info tags + my $newTags = $et->GetNewTagInfoHash(\%Image::ExifTool::PDF::Info); + my $tagID; + foreach $tagID (sort keys %$newTags) { + my $tagInfo = $$newTags{$tagID}; + my $nvHash = $et->GetNewValueHash($tagInfo); + my (@vals, $deleted); + my $tag = $$tagInfo{Name}; + my $val = $$info{$tag}; + my $tagKey = $tag; + unless (defined $val) { + # must check for tag key with copy number + ($tagKey) = grep /^$tag/, keys %$info; + $val = $$info{$tagKey} if $tagKey; + } + if (defined $val) { + my @oldVals; + if (ref $val eq 'ARRAY') { + @oldVals = @$val; + $val = shift @oldVals; + } + for (;;) { + if ($et->IsOverwriting($nvHash, $val) > 0) { + $deleted = 1; + $et->VerboseValue("- PDF:$tag", $val); + ++$infoChanged; + } else { + push @vals, $val; + } + last unless @oldVals; + $val = shift @oldVals; + } + # don't write this out if we deleted all values + delete $$infoDict{$tagID} unless @vals; + } elsif ($$nvHash{EditOnly}) { + next; + } + # decide whether we want to write this tag + # (native PDF information is always preferred, so don't check IsCreating) + next unless $deleted or $$tagInfo{List} or not exists $$infoDict{$tagID}; + + # add new values to existing ones + my @newVals = $et->GetNewValue($nvHash); + if (@newVals) { + push @vals, @newVals; + ++$infoChanged; + if ($out) { + foreach $val (@newVals) { + $et->VerboseValue("+ PDF:$tag", $val); + } + } + } + unless (@vals) { + # remove this entry from the Info dictionary if no values remain + delete $$infoDict{$tagID}; + next; + } + # format value(s) for writing to PDF file + my $writable = $$tagInfo{Writable} || $Image::ExifTool::PDF::Info{WRITABLE}; + if (not $$tagInfo{List}) { + $val = WritePDFValue($et, shift(@vals), $writable); + } elsif ($$tagInfo{List} eq 'array') { + foreach $val (@vals) { + $val = WritePDFValue($et, $val, $writable); + defined $val or undef(@vals), last; + } + $val = @vals ? \@vals : undef; + } else { + $val = WritePDFValue($et, join($et->Options('ListSep'), @vals), $writable); + } + if (defined $val) { + $$infoDict{$tagID} = $val; + ++$infoChanged; + } else { + $et->Warn("Error converting $$tagInfo{Name} value"); + } + } + if ($infoChanged) { + $$et{CHANGED} += $infoChanged; + } elsif ($prevUpdate) { + # must still write Info dictionary if it was previously updated + my $oldPos = LocateObject($xref, $$infoRef); + $infoChanged = 1 if $oldPos and $oldPos > $prevUpdate; + } + + # create new Info dictionary if necessary + if ($infoChanged) { + # increment object count if we used a new object here + if (scalar(keys %{$capture{Info}}) > 1) { + $newObj{$$infoRef} = $capture{Info};# save to write later + $$mainDict{Info} = $infoRef; # add reference to trailer dictionary + ++$nextObject unless $prevInfoRef; + } else { + # remove Info from Main (trailer) dictionary + delete $$mainDict{Info}; + # write free entry in xref table if Info existed prior to all edits + $newObj{$$infoRef} = '' if $prevInfoRef; + } + } + + # rewrite XMP + my %xmpInfo = ( + DataPt => $$info{XMP}, + Parent => 'PDF', + ); + my $xmpTable = Image::ExifTool::GetTagTable('Image::ExifTool::XMP::Main'); + my $oldChanged = $$et{CHANGED}; + my $newXMP = $et->WriteDirectory(\%xmpInfo, $xmpTable); + $newXMP = $$info{XMP} ? ${$$info{XMP}} : '' unless defined $newXMP; + + # WriteDirectory() will increment CHANGED erroneously if non-existent + # XMP is deleted as a block -- so check for this + unless ($newXMP or $$info{XMP}) { + $$et{CHANGED} = $oldChanged; + $et->VPrint(0, " (XMP not changed -- still empty)\n"); + } + my ($metaChanged, $rootChanged); + + if ($$et{CHANGED} != $oldChanged and defined $newXMP) { + $metaChanged = 1; + } elsif ($prevUpdate and $capture{Root}->{Metadata}) { + # must still write Metadata dictionary if it was previously updated + my $oldPos = LocateObject($xref, ${$capture{Root}->{Metadata}}); + $metaChanged = 1 if $oldPos and $oldPos > $prevUpdate; + } + if ($metaChanged) { + if ($newXMP) { + unless ($metaRef) { + # allocate new PDF object + $metaRef = \ "$nextObject 0 R"; + ++$nextObject; + $capture{Root}->{Metadata} = $metaRef; + $rootChanged = 1; # set flag to replace Root dictionary + } + # create the new metadata dictionary to write later + $newObj{$$metaRef} = { + Type => '/Metadata', + Subtype => '/XML', + # Length => length $newXMP, (set by WriteObject) + _tags => [ qw(Type Subtype) ], + _stream => $newXMP, + _decrypted => 1, # (this will be ignored if EncryptMetadata is false) + }; + } elsif ($capture{Root}->{Metadata}) { + # free existing metadata object + $newObj{${$capture{Root}->{Metadata}}} = ''; + delete $capture{Root}->{Metadata}; + $rootChanged = 1; # set flag to replace Root dictionary + } + } + # add new Root dictionary if necessary + my $rootRef = $$mainDict{Root}; + unless ($rootRef) { + $et->Error("Can't find Root dictionary"); + return $rtn; + } + if (not $rootChanged and $prevUpdate) { + # must still write Root dictionary if it was previously updated + my $oldPos = LocateObject($xref, $$rootRef); + $rootChanged = 1 if $oldPos and $oldPos > $prevUpdate; + } + $newObj{$$rootRef} = $capture{Root} if $rootChanged; +# +# write incremental update if anything was changed +# + if ($$et{CHANGED}) { + # remember position of original EOF + my $oldEOF = Tell($outfile) - $$et{PDFBase}; + Write($outfile, $beginComment) or $rtn = -1; + + # write new objects + foreach $objRef (sort keys %newObj) { + $objRef =~ /^(\d+) (\d+)/ or $rtn = -1, last; + ($id, $gen) = ($1, $2); + if (not $newObj{$objRef}) { + ++$gen if $gen < 65535; + # write free entry in xref table + $newXRef{$id} = [ 0, $gen, 'f' ]; + next; + } + # create new entry for xref table + $newXRef{$id} = [ Tell($outfile) - $$et{PDFBase} + length($/), $gen, 'n' ]; + $keyExt = "$id $gen obj"; # (must set for stream encryption) + Write($outfile, $/, $keyExt) or $rtn = -1; + WriteObject($outfile, $newObj{$objRef}) or $rtn = -1; + Write($outfile, $/, 'endobj') or $rtn = -1; + } + + # Prev points to old xref table + $$mainDict{Prev} = $capture{startxref} unless $prevUpdate; + + # add xref entry for head of free-object list + $newXRef{0} = [ 0, 65535, 'f' ]; + + # must insert free xref entries from previous exiftool update if applicable + if ($prevUpdate) { + my $mainFree; + # extract free entries from our previous Main xref stream + if ($$mainDict{Type} and $$mainDict{Type} eq '/XRef') { + $mainFree = GetFreeEntries($xref->{dicts}->[0]); + } else { + # free entries from Main xref table already captured for us + $mainFree = $capture{mainFree}; + } + foreach $id (sort { $a <=> $b } keys %$mainFree) { + $newXRef{$id} = $$mainFree{$id} unless $newXRef{$id}; + } + } + + # connect linked list of free object in our xref table + my $prevFree = 0; + foreach $id (sort { $b <=> $a } keys %newXRef) { # (reverse sort) + next unless $newXRef{$id}->[2] eq 'f'; # skip if not free + # no need to add free entry for objects added by us + # in previous edits then freed again + if ($id >= $nextObject) { + delete $newXRef{$id}; # Note: deleting newXRef entry! + next; + } + $newXRef{$id}->[0] = $prevFree; + $prevFree = $id; + } + + # prepare our main dictionary for writing + $$mainDict{Size} = $nextObject; # update number of objects + # must change the ID if it exists + if (ref $$mainDict{ID} eq 'ARRAY' and @{$$mainDict{ID}} > 1) { + # increment first byte since this is an easy change to make + $id = $mainDict->{ID}->[1]; + if ($id =~ /^<([0-9a-f]{2})/i) { + my $byte = unpack('H2',chr((hex($1) + 1) & 0xff)); + substr($id, 1, 2) = $byte; + } elsif ($id =~ /^\((.)/s and $1 ne '\\' and $1 ne ')' and $1 ne '(') { + my $ch = chr((ord($1) + 1) & 0xff); + # avoid generating characters that could cause problems + $ch = 'a' if $ch =~ /[()\\\x00-\x08\x0a-\x1f\x7f\xff]/; + substr($id, 1, 1) = $ch; + } + $mainDict->{ID}->[1] = $id; + } + + # remember position of xref table in file (we will write this next) + my $startxref = Tell($outfile) - $$et{PDFBase} + length($/); + + # must write xref as a stream in xref-stream-only files + if ($$mainDict{Type} and $$mainDict{Type} eq '/XRef') { + + # create entry for the xref stream object itself + $newXRef{$nextObject++} = [ Tell($outfile) - $$et{PDFBase} + length($/), 0, 'n' ]; + $$mainDict{Size} = $nextObject; + # create xref stream and Index entry + $$mainDict{W} = [ 1, 4, 2 ]; # int8u, int32u, int16u ('CNn') + $$mainDict{Index} = [ ]; + $$mainDict{_stream} = ''; + my @ids = sort { $a <=> $b } keys %newXRef; + while (@ids) { + my $startID = $ids[0]; + for (;;) { + $id = shift @ids; + my ($pos, $gen, $type) = @{$newXRef{$id}}; + if ($pos > 0xffffffff) { + $et->Error('Huge files not yet supported'); + last; + } + $$mainDict{_stream} .= pack('CNn', $type eq 'f' ? 0 : 1, $pos, $gen); + last if not @ids or $ids[0] != $id + 1; + } + # add Index entries for this section of the xref stream + push @{$$mainDict{Index}}, $startID, $id - $startID + 1; + } + # write the xref stream object + $keyExt = "$id 0 obj"; # (set anyway, but xref stream should NOT be encrypted) + Write($outfile, $/, $keyExt) or $rtn = -1; + WriteObject($outfile, $mainDict) or $rtn = -1; + Write($outfile, $/, 'endobj') or $rtn = -1; + + } else { + + # write new xref table + Write($outfile, $/, 'xref', $/) or $rtn = -1; + # lines must be exactly 20 bytes, so pad newline if necessary + my $endl = (length($/) == 1 ? ' ' : '') . $/; + my @ids = sort { $a <=> $b } keys %newXRef; + while (@ids) { + my $startID = $ids[0]; + $buff = ''; + for (;;) { + $id = shift @ids; + $buff .= sprintf("%.10d %.5d %s%s", @{$newXRef{$id}}, $endl); + last if not @ids or $ids[0] != $id + 1; + } + # write this (contiguous-numbered object) section of the xref table + Write($outfile, $startID, ' ', $id - $startID + 1, $/, $buff) or $rtn = -1; + } + + # write main (trailer) dictionary + Write($outfile, 'trailer') or $rtn = -1; + WriteObject($outfile, $mainDict) or $rtn = -1; + } + # write trailing comment (marker to allow edits to be reverted) + Write($outfile, $/, $endComment, $oldEOF, $/) or $rtn = -1; + + # write pointer to main xref table and EOF marker + Write($outfile, 'startxref', $/, $startxref, $/, '%%EOF', $/) or $rtn = -1; + + } elsif ($prevUpdate) { + + # nothing new changed, so copy over previous incremental update + $raf->Seek($prevUpdate+$$et{PDFBase}, 0) or $rtn = -1; + while ($raf->Read($buff, 65536)) { + Write($outfile, $buff) or $rtn = -1; + } + } + if ($rtn > 0 and $$et{CHANGED} and ($$et{DEL_GROUP}{PDF} or $$et{DEL_GROUP}{XMP})) { + $et->Warn('ExifTool PDF edits are reversible. Deleted tags may be recovered!', 1); + } + undef $newTool; + undef %capture; + return $rtn; +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::WritePDF.pl - Write PDF meta information + +=head1 SYNOPSIS + +These routines are autoloaded by Image::ExifTool::PDF. + +=head1 DESCRIPTION + +This file contains routines to write PDF metadata. + +=head1 NOTES + +When writing a PDF, exiftool does not modify the existing data. Instead, +the PDF file is appended with an incremental update which can easily be +removed to revert the file (by using ExifTool to delete the special +C<PDF-update> pseudo group). + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://partners.adobe.com/public/developer/pdf/index_reference.html> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::PDF(3pm)|Image::ExifTool::PDF>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/WritePNG.pl b/lib/Image/ExifTool/WritePNG.pl new file mode 100644 index 0000000..9fbb5d5 --- /dev/null +++ b/lib/Image/ExifTool/WritePNG.pl @@ -0,0 +1,414 @@ +#------------------------------------------------------------------------------ +# File: WritePNG.pl +# +# Description: Write PNG meta information +# +# Revisions: 09/16/2005 - P. Harvey Created +# +# References: 1) http://www.libpng.org/pub/png/spec/1.2/ +#------------------------------------------------------------------------------ +package Image::ExifTool::PNG; + +use strict; + +#------------------------------------------------------------------------------ +# Calculate CRC or update running CRC (ref 1) +# Inputs: 0) data reference, 1) running crc to update (undef initially) +# 2) data position (undef for 0), 3) data length (undef for all data), +# Returns: updated CRC +my @crcTable; +sub CalculateCRC($;$$$) +{ + my ($dataPt, $crc, $pos, $len) = @_; + $crc = 0 unless defined $crc; + $pos = 0 unless defined $pos; + $len = length($$dataPt) - $pos unless defined $len; + $crc ^= 0xffffffff; # undo 1's complement + # build lookup table unless done already + unless (@crcTable) { + my ($c, $n, $k); + for ($n=0; $n<256; ++$n) { + for ($k=0, $c=$n; $k<8; ++$k) { + $c = ($c & 1) ? 0xedb88320 ^ ($c >> 1) : $c >> 1; + } + $crcTable[$n] = $c; + } + } + # calculate the CRC + foreach (unpack("x${pos}C$len", $$dataPt)) { + $crc = $crcTable[($crc^$_) & 0xff] ^ ($crc >> 8); + } + return $crc ^ 0xffffffff; # return 1's complement +} + +#------------------------------------------------------------------------------ +# Encode data in ASCII Hex +# Inputs: 0) input data reference +# Returns: Hex-encoded data (max 72 chars per line) +sub HexEncode($) +{ + my $dataPt = shift; + my $len = length($$dataPt); + my $hex = ''; + my $pos; + for ($pos = 0; $pos < $len; $pos += 36) { + my $n = $len - $pos; + $n > 36 and $n = 36; + $hex .= unpack('H*',substr($$dataPt,$pos,$n)) . "\n"; + } + return $hex; +} + +#------------------------------------------------------------------------------ +# Write profile chunk (possibly compressed if Zlib is available) +# Inputs: 0) outfile, 1) Raw profile type (SCALAR ref for iCCP name), 2) data ref +# 3) profile header type (undef if not a text profile) +# Returns: 1 on success +sub WriteProfile($$$;$) +{ + my ($outfile, $rawType, $dataPt, $profile) = @_; + my ($buff, $prefix, $chunk, $deflate); + if ($rawType ne $stdCase{exif} and eval { require Compress::Zlib }) { + $deflate = Compress::Zlib::deflateInit(); + } + if (not defined $profile) { + # write ICC profile as compressed iCCP chunk if possible + if (ref $rawType) { + return 0 unless $deflate; + $chunk = 'iCCP'; + $prefix = "$$rawType\0\0"; + } else { + $chunk = $rawType; + if ($rawType eq $stdCase{zxif}) { + $prefix = "\0" . pack('N', length $$dataPt); # (proposed compressed EXIF) + } else { + $prefix = ''; # standard EXIF + } + } + if ($deflate) { + $buff = $deflate->deflate($$dataPt); + return 0 unless defined $buff; + $buff .= $deflate->flush(); + $dataPt = \$buff; + } + } else { + # write as ASCII-hex encoded profile in tEXt or zTXt chunk + my $txtHdr = sprintf("\n$profile profile\n%8d\n", length($$dataPt)); + $buff = $txtHdr . HexEncode($dataPt); + $chunk = 'tEXt'; # write as tEXt if deflate not available + $prefix = "Raw profile type $rawType\0"; + $dataPt = \$buff; + # write profile as zTXt chunk if possible + if ($deflate) { + my $buf2 = $deflate->deflate($buff); + if (defined $buf2) { + $dataPt = \$buf2; + $buf2 .= $deflate->flush(); + $chunk = 'zTXt'; + $prefix .= "\0"; # compression type byte (0=deflate) + } + } + } + my $hdr = pack('Na4', length($prefix) + length($$dataPt), $chunk) . $prefix; + my $crc = CalculateCRC(\$hdr, undef, 4); + $crc = CalculateCRC($dataPt, $crc); + return Write($outfile, $hdr, $$dataPt, pack('N',$crc)); +} + +#------------------------------------------------------------------------------ +# Add iCCP-related chunks to the PNG image if necessary (must come before PLTE and IDAT) +# Inputs: 0) ExifTool object ref, 1) output file or scalar ref +# Returns: true on success +sub Add_iCCP($$) +{ + my ($et, $outfile) = @_; + if ($$et{ADD_DIRS}{ICC_Profile}) { + # write new ICC data + my $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::ICC_Profile::Main'); + my %dirInfo = ( Parent => 'PNG', DirName => 'ICC_Profile' ); + my $buff = $et->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $buff and length $buff) { + my $profileName = $et->GetNewValue($Image::ExifTool::PNG::Main{'iCCP-name'}); + $profileName = 'icm' unless defined $profileName; + if (WriteProfile($outfile, \$profileName, \$buff)) { + $et->VPrint(0, "Created ICC profile with name '${profileName}'\n"); + delete $$et{ADD_DIRS}{ICC_Profile}; # don't add it again + } + } + } + # must also add sRGB and gAMA before PLTE and IDAT + if ($$et{ADD_PNG}) { + my ($tag, %addBeforePLTE); + foreach $tag (qw(sRGB gAMA)) { + next unless $$et{ADD_PNG}{$tag}; + $addBeforePLTE{$tag} = $$et{ADD_PNG}{$tag}; + delete $$et{ADD_PNG}{$tag}; + } + if (%addBeforePLTE) { + my $save = $$et{ADD_PNG}; + $$et{ADD_PNG} = \%addBeforePLTE; + AddChunks($et, $outfile); + $$et{ADD_PNG} = $save; + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# This routine is called after we edit an existing directory +# Inputs: 0) ExifTool ref, 1) dir name, 2) output data ref +# 3) flag set if location is non-standard (to update, but not create from scratch) +# - on return, $$outBuff is set to '' if the directory is to be deleted +sub DoneDir($$$;$) +{ + my ($et, $dir, $outBuff, $nonStandard) = @_; + my $saveDir = $dir; + $dir = 'EXIF' if $dir eq 'IFD0'; + # don't add this directory again unless this is in a non-standard location + if (not $nonStandard) { + delete $$et{ADD_DIRS}{$dir}; + delete $$et{ADD_DIRS}{IFD0} if $dir eq 'EXIF'; + } elsif ($$et{DEL_GROUP}{$dir} or $$et{DEL_GROUP}{$saveDir}) { + $et->VPrint(0," Deleting non-standard $dir\n"); + $$outBuff = ''; + } +} + +#------------------------------------------------------------------------------ +# Generate tEXt, zTXt or iTXt data for writing +# Inputs: 0) ExifTool ref, 1) tagID, 2) tagInfo ref, 3) value string, 4) language code +# Returns: chunk data (not including 8-byte chunk header) +# Notes: Sets ExifTool TextChunkType member to the type of chunk written +sub BuildTextChunk($$$$$) +{ + my ($et, $tag, $tagInfo, $val, $lang) = @_; + my ($xtra, $compVal, $iTXt, $comp); + if ($$tagInfo{SubDirectory}) { + if ($$tagInfo{Name} eq 'XMP') { + $iTXt = 2; # write as iTXt but flag to avoid encoding + # (never compress XMP) + } else { + $comp = 2; # compress raw profile if possible + } + } else { + # compress if specified + $comp = 1 if $et->Options('Compress'); + if ($lang) { + $iTXt = 1; # write as iTXt if it has a language code + $tag =~ s/-$lang$//; # remove language code from tagID + } elsif ($$et{OPTIONS}{Charset} ne 'Latin' and $val =~ /[\x80-\xff]/) { + $iTXt = 1; # write as iTXt if it contains non-Latin special characters + } elsif ($$tagInfo{iTXt}) { + $iTXt = 1; # write as iTXt if specified in user-defined tag + } + } + if ($comp) { + my $warn; + if (eval { require Compress::Zlib }) { + my $deflate = Compress::Zlib::deflateInit(); + $compVal = $deflate->deflate($val) if $deflate; + if (defined $compVal) { + $compVal .= $deflate->flush(); + # only compress if it actually saves space + unless (length($compVal) < length($val)) { + undef $compVal; + $warn = 'uncompressed data is smaller'; + } + } else { + $warn = 'deflate error'; + } + } else { + $warn = 'Compress::Zlib not available'; + } + # warn if any user-specified compression fails + if ($warn and $comp == 1) { + $et->Warn("PNG:$$tagInfo{Name} not compressed ($warn)", 1); + } + } + # decide whether to write as iTXt, zTXt or tEXt + if ($iTXt) { + $$et{TextChunkType} = 'iTXt'; + $xtra = (defined $compVal ? "\x01\0" : "\0\0") . ($lang || '') . "\0\0"; + # iTXt is encoded as UTF-8 (but note that XMP is already UTF-8) + $val = $et->Encode($val, 'UTF8') if $iTXt == 1; + } elsif (defined $compVal) { + $$et{TextChunkType} = 'zTXt'; + $xtra = "\0"; + } else { + $$et{TextChunkType} = 'tEXt'; + $xtra = ''; + } + return $tag . "\0" . $xtra . (defined $compVal ? $compVal : $val); +} + +#------------------------------------------------------------------------------ +# Add any outstanding new chunks to the PNG image +# Inputs: 0) ExifTool object ref, 1) output file or scalar ref +# 2-N) dirs to add (empty to add all except EXIF 'IFD0', including PNG tags) +# Returns: true on success +sub AddChunks($$;@) +{ + my ($et, $outfile, @add) = @_; + my ($addTags, $tag, $dir, $err, $tagTablePtr, $specified); + + if (@add) { + $addTags = { }; # don't add any PNG tags + $specified = 1; + } else { + $addTags = $$et{ADD_PNG}; # add all PNG tags... + delete $$et{ADD_PNG}; # ...once + # add all directories + @add = sort keys %{$$et{ADD_DIRS}}; + } + # write any outstanding PNG tags + foreach $tag (sort keys %$addTags) { + my $tagInfo = $$addTags{$tag}; + next if $$tagInfo{FakeTag}; # (iCCP-name) + my $nvHash = $et->GetNewValueHash($tagInfo); + # (native PNG information is always preferred, so don't rely on just IsCreating) + next unless $$nvHash{IsCreating} or $et->IsOverwriting($nvHash) > 0; + my $val = $et->GetNewValue($nvHash); + if (defined $val) { + next if $$nvHash{EditOnly}; + my $data; + if ($$tagInfo{Table} eq \%Image::ExifTool::PNG::TextualData) { + $data = BuildTextChunk($et, $tag, $tagInfo, $val, $$tagInfo{LangCode}); + $data = $$et{TextChunkType} . $data; + delete $$et{TextChunkType}; + } else { + $data = "$tag$val"; + } + my $hdr = pack('N', length($data) - 4); + my $cbuf = pack('N', CalculateCRC(\$data, undef)); + Write($outfile, $hdr, $data, $cbuf) or $err = 1; + $et->VerboseValue("+ PNG:$$tagInfo{Name}", $val); + ++$$et{CHANGED}; + } + } + # create any necessary directories + foreach $dir (@add) { + next unless $$et{ADD_DIRS}{$dir}; # make sure we want to add it first + my $buff; + my %dirInfo = ( + Parent => 'PNG', + DirName => $dir, + ); + if ($dir eq 'IFD0') { + next unless $specified; # wait until specifically asked to write EXIF 'IFD0' + my $chunk = $stdCase{exif}; + # (zxIf was not adopted) + #if ($et->Options('Compress')) { + # if (eval { require Compress::Zlib }) { + # $chunk = $stdCase{zxif}; + # } else { + # $et->Warn("Creating uncompressed $stdCase{exif} chunk (Compress::Zlib not available)"); + # } + #} + $et->VPrint(0, "Creating $chunk chunk:\n"); + $$et{TIFF_TYPE} = 'APP1'; + $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::Exif::Main'); + $buff = $et->WriteDirectory(\%dirInfo, $tagTablePtr, \&Image::ExifTool::WriteTIFF); + if (defined $buff and length $buff) { + WriteProfile($outfile, $chunk, \$buff) or $err = 1; + } + } elsif ($dir eq 'XMP') { + $et->VPrint(0, "Creating XMP iTXt chunk:\n"); + $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::XMP::Main'); + $dirInfo{ReadOnly} = 1; + $buff = $et->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $buff and length $buff and + # the packet is read-only (because of CRC) + Image::ExifTool::XMP::ValidateXMP(\$buff, 'r')) + { + # (previously, XMP was created as a non-standard XMP profile chunk) + # $buff = $Image::ExifTool::xmpAPP1hdr . $buff; + # WriteProfile($outfile, 'APP1', \$buff, 'generic') or $err = 1; + # (but now write XMP iTXt chunk according to XMP specification) + $buff = "iTXtXML:com.adobe.xmp\0\0\0\0\0" . $buff; + my $hdr = pack('N', length($buff) - 4); + my $cbuf = pack('N', CalculateCRC(\$buff, undef)); + Write($outfile, $hdr, $buff, $cbuf) or $err = 1; + } + } elsif ($dir eq 'IPTC') { + $et->Warn('Creating non-standard IPTC in PNG', 1); + $et->VPrint(0, "Creating IPTC profile:\n"); + # write new IPTC data (stored in a Photoshop directory) + $dirInfo{DirName} = 'Photoshop'; + $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::Photoshop::Main'); + $buff = $et->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $buff and length $buff) { + WriteProfile($outfile, 'iptc', \$buff, 'IPTC') or $err = 1; + } + } elsif ($dir eq 'ICC_Profile') { + $et->VPrint(0, "Creating ICC profile:\n"); + # write new ICC data (only done if we couldn't create iCCP chunk) + $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::ICC_Profile::Main'); + $buff = $et->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $buff and length $buff) { + WriteProfile($outfile, 'icm', \$buff, 'ICC') or $err = 1; + $et->Warn('Wrote ICC as a raw profile (no Compress::Zlib)'); + } + } elsif ($dir eq 'PNG-pHYs') { + $et->VPrint(0, "Creating pHYs chunk (default 2834 pixels per meter):\n"); + $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::PNG::PhysicalPixel'); + my $blank = "\0\0\x0b\x12\0\0\x0b\x12\x01"; # 2834 pixels per meter (72 dpi) + $dirInfo{DataPt} = \$blank; + $buff = $et->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $buff and length $buff) { + $buff = 'pHYs' . $buff; # CRC includes chunk name + my $hdr = pack('N', length($buff) - 4); + my $cbuf = pack('N', CalculateCRC(\$buff, undef)); + Write($outfile, $hdr, $buff, $cbuf) or $err = 1; + } + } else { + next; + } + delete $$et{ADD_DIRS}{$dir}; # don't add again + } + return not $err; +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::WritePNG.pl - Write PNG meta information + +=head1 SYNOPSIS + +These routines are autoloaded by Image::ExifTool::PNG. + +=head1 DESCRIPTION + +This file contains routines to write PNG metadata. + +=head1 NOTES + +Compress::Zlib is required to write compressed text. + +Existing text tags are always rewritten in their original form (compressed +zTXt, uncompressed tEXt or international iTXt), so pre-existing compressed +information can only be modified if Compress::Zlib is available. + +Newly created textual information is written in uncompressed tEXt form by +default, or as compressed zTXt if the Compress option is used and +Compress::Zlib is available (but only if the resulting compressed data is +smaller than the original text, which isn't always the case for short text +strings). + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::PNG(3pm)|Image::ExifTool::PNG>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/WritePhotoshop.pl b/lib/Image/ExifTool/WritePhotoshop.pl new file mode 100644 index 0000000..07f60c8 --- /dev/null +++ b/lib/Image/ExifTool/WritePhotoshop.pl @@ -0,0 +1,270 @@ +#------------------------------------------------------------------------------ +# File: WritePhotoshop.pl +# +# Description: Write Photoshop IRB meta information +# +# Revisions: 12/17/2004 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::Photoshop; + +use strict; + +#------------------------------------------------------------------------------ +# Strip resource name from value prepare resource name for writing into IRB +# Inputs: 0) tagInfo ref, 1) resource name (padded pascal string), 2) new value ref +# Returns: none (updates name and value if necessary) +sub SetResourceName($$$) +{ + my ($tagInfo, $name, $valPt) = @_; + my $setName = $$tagInfo{SetResourceName}; + if (defined $setName) { + # extract resource name from value + if ($$valPt =~ m{.*/#(.{0,255})#/$}s) { + $name = $1; + # strip name from value + $$valPt = substr($$valPt, 0, -4 - length($name)); + } elsif ($setName eq '1') { + return; # use old name + } else { + $name = $setName; + } + # convert to padded pascal string + $name = chr(length $name) . $name; + $name .= "\0" if length($name) & 0x01; + $_[1] = $name; # return new name + } +} + +#------------------------------------------------------------------------------ +# Write Photoshop IRB resource +# Inputs: 0) ExifTool object reference, 1) source dirInfo reference, +# 2) tag table reference +# Returns: IRB resource data (may be empty if no Photoshop data) +# Notes: Increments ExifTool CHANGED flag for each tag changed +sub WritePhotoshop($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to autoload this package + my $dataPt = $$dirInfo{DataPt}; + unless ($dataPt) { + my $emptyData = ''; + $dataPt = \$emptyData; + } + my $start = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $start); + my $dirEnd = $start + $dirLen; + my $newData = ''; + + # make a hash of new tag info, keyed on tagID + my $newTags = $et->GetNewTagInfoHash($tagTablePtr); + + my ($addDirs, $editDirs) = $et->GetAddDirHash($tagTablePtr); + + SetByteOrder('MM'); # Photoshop is always big-endian +# +# rewrite existing tags in the old directory, deleting ones as necessary +# (the Photoshop directory entries aren't in any particular order) +# + # Format: 0) Type, 4 bytes - '8BIM' (or the rare 'PHUT', 'DCSR', 'AgHg' or 'MeSa') + # 1) TagID,2 bytes + # 2) Name, pascal string padded to even no. bytes + # 3) Size, 4 bytes - N + # 4) Data, N bytes + my ($pos, $value, $size, $tagInfo, $tagID); + for ($pos=$start; $pos+8<$dirEnd; $pos+=$size) { + # each entry must be on same even byte boundary as directory start + ++$pos if ($pos ^ $start) & 0x01; + my $type = substr($$dataPt, $pos, 4); + if ($type !~ /^(8BIM|PHUT|DCSR|AgHg|MeSa)$/) { + $et->Error("Bad Photoshop IRB resource"); + undef $newData; + last; + } + $tagID = Get16u($dataPt, $pos + 4); + # get resource block name (pascal string padded to an even # of bytes) + my $namelen = 1 + Get8u($dataPt, $pos + 6); + ++$namelen if $namelen & 0x01; + if ($pos + $namelen + 10 > $dirEnd) { + $et->Error("Bad APP13 resource block"); + undef $newData; + last; + } + my $name = substr($$dataPt, $pos + 6, $namelen); + $size = Get32u($dataPt, $pos + 6 + $namelen); + $pos += $namelen + 10; + if ($size + $pos > $dirEnd) { + $et->Error("Bad APP13 resource data size $size"); + undef $newData; + last; + } + if ($$newTags{$tagID} and $type eq '8BIM') { + $tagInfo = $$newTags{$tagID}; + delete $$newTags{$tagID}; + my $nvHash = $et->GetNewValueHash($tagInfo); + # check to see if we are overwriting this tag + $value = substr($$dataPt, $pos, $size); + my $isOverwriting = $et->IsOverwriting($nvHash, $value); + # handle special 'new' and 'old' values for IPTCDigest + if (not $isOverwriting and $tagInfo eq $iptcDigestInfo) { + if (grep /^new$/, @{$$nvHash{DelValue}}) { + $isOverwriting = 1 if $$et{NewIPTCDigest} and + $$et{NewIPTCDigest} eq $value; + } + if (grep /^old$/, @{$$nvHash{DelValue}}) { + $isOverwriting = 1 if $$et{OldIPTCDigest} and + $$et{OldIPTCDigest} eq $value; + } + } + if ($isOverwriting) { + $et->VerboseValue("- Photoshop:$$tagInfo{Name}", $value); + # handle IPTCDigest specially because we want to write it last + # so the new IPTC digest will be known + if ($tagInfo eq $iptcDigestInfo) { + $$newTags{$tagID} = $tagInfo; # add later + $value = undef; + } else { + $value = $et->GetNewValue($nvHash); + } + ++$$et{CHANGED}; + next unless defined $value; # next if tag is being deleted + # set resource name if necessary + SetResourceName($tagInfo, $name, \$value); + $et->VerboseValue("+ Photoshop:$$tagInfo{Name}", $value); + } + } else { + if ($type eq '8BIM') { + $tagInfo = $$editDirs{$tagID}; + unless ($tagInfo) { + # process subdirectory anyway if writable (except EXIF to avoid recursion) + # --> this allows IPTC to be processed if found here in TIFF images + # (but allow EXIF to be written in PSD files if XMP or IPTC tags are + # being written because I have seen cases of XMP in PSD-EXIFInfo-IFD0 + # and IPTC in PSD-EXIFInfo-IFD0-IPTC, see forum10768 and forum13198) + my $tmpInfo = $et->GetTagInfo($tagTablePtr, $tagID); + if ($tmpInfo and $$tmpInfo{SubDirectory} and + ($tmpInfo->{SubDirectory}->{TagTable} ne 'Image::ExifTool::Exif::Main' or + ($$et{FILE_TYPE} eq 'PSD' and ($$editDirs{0x0404} or $$editDirs{0x0424})))) + { + my $table = Image::ExifTool::GetTagTable($tmpInfo->{SubDirectory}->{TagTable}); + $tagInfo = $tmpInfo if $$table{WRITE_PROC}; + } + } + } + if ($tagInfo) { + $$addDirs{$tagID} and delete $$addDirs{$tagID}; + my %subdirInfo = ( + DataPt => $dataPt, + DirStart => $pos, + DataLen => $dirLen, + DirLen => $size, + Parent => $$dirInfo{DirName}, + ); + my $subTable = Image::ExifTool::GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + my $writeProc = $tagInfo->{SubDirectory}->{WriteProc}; + my $newValue = $et->WriteDirectory(\%subdirInfo, $subTable, $writeProc); + if (defined $newValue) { + next unless length $newValue; # remove subdirectory entry + $value = $newValue; + SetResourceName($tagInfo, $name, \$value); + } else { + $value = substr($$dataPt, $pos, $size); # rewrite old directory + } + } else { + $value = substr($$dataPt, $pos, $size); + } + } + my $newSize = length $value; + # write this directory entry + $newData .= $type . Set16u($tagID) . $name . Set32u($newSize) . $value; + $newData .= "\0" if $newSize & 0x01; # must null pad to even byte + } +# +# write any remaining entries we didn't find in the old directory +# (might as well write them in numerical tag order) +# + my @tagsLeft = sort { $a <=> $b } keys(%$newTags), keys(%$addDirs); + foreach $tagID (@tagsLeft) { + my $name = "\0\0"; + if ($$newTags{$tagID}) { + $tagInfo = $$newTags{$tagID}; + my $nvHash = $et->GetNewValueHash($tagInfo); + $value = $et->GetNewValue($nvHash); + # handle new IPTCDigest value specially + if ($tagInfo eq $iptcDigestInfo and defined $value) { + if ($value eq 'new') { + $value = $$et{NewIPTCDigest}; + } elsif ($value eq 'old') { + $value = $$et{OldIPTCDigest}; + } + # (we already know we want to create this tag) + } else { + # don't add this tag unless specified + next unless $$nvHash{IsCreating}; + } + next unless defined $value; # next if tag is being deleted + $et->VerboseValue("+ Photoshop:$$tagInfo{Name}", $value); + ++$$et{CHANGED}; + } else { + $tagInfo = $$addDirs{$tagID}; + # create new directory + my %subdirInfo = ( + Parent => $$dirInfo{DirName}, + ); + my $subTable = Image::ExifTool::GetTagTable($tagInfo->{SubDirectory}->{TagTable}); + my $writeProc = $tagInfo->{SubDirectory}->{WriteProc}; + $value = $et->WriteDirectory(\%subdirInfo, $subTable, $writeProc); + next unless $value; + } + # set resource name if necessary + SetResourceName($tagInfo, $name, \$value); + $size = length($value); + # write the new directory entry + $newData .= '8BIM' . Set16u($tagID) . $name . Set32u($size) . $value; + $newData .= "\0" if $size & 0x01; # must null pad to even numbered byte + ++$$et{CHANGED}; + } + return $newData; +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::WritePhotoshop.pl - Write Photoshop IRB meta information + +=head1 SYNOPSIS + +This file is autoloaded by Image::ExifTool::Photoshop. + +=head1 DESCRIPTION + +This file contains routines to write Photoshop metadata. + +=head1 NOTES + +Photoshop IRB blocks may have an associated resource name. By default, the +existing name is preserved when rewriting a resource, and an empty name is +used when creating a new resource. However, a different resource name may +be specified by defining a C<SetResourceName> entry in the tag information +hash. With this defined, a new resource name may be appended to the value +in the form "VALUE/#NAME#/" (the slashes and hashes are literal). If +C<SetResourceName> is anything other than '1', the value is used as a +default resource name, and applied if no appended name is provided. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::Photoshop(3pm)|Image::ExifTool::Photoshop>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/WritePostScript.pl b/lib/Image/ExifTool/WritePostScript.pl new file mode 100644 index 0000000..d78fa9a --- /dev/null +++ b/lib/Image/ExifTool/WritePostScript.pl @@ -0,0 +1,700 @@ +#------------------------------------------------------------------------------ +# File: WritePostScript.pl +# +# Description: Write PostScript meta information +# +# Revisions: 03/03/2006 - P. Harvey Created +# +# References: (see references in PostScript.pm, plus:) +# 1) http://www.adobe.com/products/postscript/pdfs/PLRM.pdf +# 2) http://www-cdf.fnal.gov/offline/PostScript/PLRM2.pdf +# 3) http://partners.adobe.com/public/developer/en/acrobat/sdk/pdf/pdf_creation_apis_and_specs/pdfmarkReference.pdf +# 4) http://www.npes.org/standards/Tools/DCS20Spec.pdf +# +# Notes: (see NOTES in POD doc below) +#------------------------------------------------------------------------------ + +package Image::ExifTool::PostScript; + +use strict; + +# Structure of a DSC PS/EPS document: +# +# %!PS-Adobe-3.0 [plus " EPSF-3.0" for EPS] +# <comments> +# %%EndComments [optional] +# %%BeginXxxx +# <stuff to ignore> +# %%EndXxxx +# %%BeginProlog +# <prolog stuff> +# %%EndProlog +# %%BeginSetup +# <setup stuff> +# %%EndSetup +# %ImageData x x x x [written by Photoshop] +# %BeginPhotoshop: xxxx +# <ascii-hex IRB information> +# %EndPhotosop +# %%BeginICCProfile: (name) <num> <type> +# <ICC Profile info> +# %%EndICCProfile +# %begin_xml_code +# <postscript code to define and read the XMP stream object> +# %begin_xml_packet: xxxx +# <XMP data> +# %end_xml_packet +# <postscript code to add XMP stream to dictionary> +# %end_xml_code +# %%Page: x x [PS only (optional?)] +# <graphics commands> +# %%PageTrailer +# %%Trailer +# <a bit more code to bracket EPS content for distiller> +# %%EOF + +# map of where information is stored in PS image +my %psMap = ( + XMP => 'PostScript', + Photoshop => 'PostScript', + IPTC => 'Photoshop', + EXIFInfo => 'Photoshop', + EXIF => 'EXIFInfo', + IFD0 => 'EXIFInfo', + IFD1 => 'IFD0', + ICC_Profile => 'PostScript', + ExifIFD => 'IFD0', + GPS => 'IFD0', + SubIFD => 'IFD0', + GlobParamIFD => 'IFD0', + PrintIM => 'IFD0', + InteropIFD => 'ExifIFD', + MakerNotes => 'ExifIFD', +); + + +#------------------------------------------------------------------------------ +# Write XMP directory to file, with begin/end tokens if necessary +# Inputs: 0) outfile ref, 1) flags hash ref, 2-N) data to write +# Returns: true on success +sub WriteXMPDir($$@) +{ + my $outfile = shift; + my $flags = shift; + my $success = 1; + Write($outfile, "%begin_xml_code$/") or $success = 0 unless $$flags{WROTE_BEGIN}; + Write($outfile, @_) or $success = 0; + Write($outfile, "%end_xml_code$/") or $success = 0 unless $$flags{WROTE_BEGIN}; + return $success; +} + +#------------------------------------------------------------------------------ +# Write a directory inside a PS document +# Inputs: 0) ExifTool object ref, 1) output file reference, +# 2) Directory name, 3) data reference, 4) flags hash ref +# Returns: 0=error, 1=nothing written, 2=dir written ok +sub WritePSDirectory($$$$$) +{ + my ($et, $outfile, $dirName, $dataPt, $flags) = @_; + my $success = 2; + my $len = $dataPt ? length($$dataPt) : 0; + my $create = $len ? 0 : 1; + my %dirInfo = ( + DataPt => $dataPt, + DataLen => $len, + DirStart => 0, + DirLen => $len, + DirName => $dirName, + Parent => 'PostScript', + ); + # Note: $$flags{WROTE_BEGIN} may be 1 for XMP (it is always 0 for + # other dirs, but if 1, the begin/end markers were already written) +# +# prepare necessary postscript code to support embedded XMP +# + my ($beforeXMP, $afterXMP, $reportedLen); + if ($dirName eq 'XMP' and $len) { + # isolate the XMP + pos($$dataPt) = 0; + unless ($$dataPt =~ /(.*)(<\?xpacket begin=.{7,13}W5M0MpCehiHzreSzNTczkc9d)/sg) { + $et->Warn('No XMP packet start'); + return WriteXMPDir($outfile, $flags, $$dataPt); + } + $beforeXMP = $1; + my $xmp = $2; + my $p1 = pos($$dataPt); + unless ($$dataPt =~ m{<\?xpacket end=.(w|r).\?>}sg) { + $et->Warn('No XMP packet end'); + return WriteXMPDir($outfile, $flags, $$dataPt); + } + my $p2 = pos($$dataPt); + $xmp .= substr($$dataPt, $p1, $p2-$p1); + $afterXMP = substr($$dataPt, $p2); + # determine if we can adjust the XMP size + if ($beforeXMP =~ /%begin_xml_packet: (\d+)/s) { + $reportedLen = $1; + my @matches= ($beforeXMP =~ /\b$reportedLen\b/sg); + undef $reportedLen unless @matches == 2; + } + # must edit in place if we can't reliably change the XMP length + $dirInfo{InPlace} = 1 unless $reportedLen; + # process XMP only + $dirInfo{DataLen} = $dirInfo{DirLen} = length $xmp; + $dirInfo{DataPt} = \$xmp; + } + my $tagTablePtr = Image::ExifTool::GetTagTable("Image::ExifTool::${dirName}::Main"); + my $val = $et->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $val) { + $dataPt = \$val; # use modified directory + $len = length $val; + } elsif ($dirName eq 'XMP') { + return 1 unless $len; + # just write the original XMP + return WriteXMPDir($outfile, $flags, $$dataPt); + } + unless ($len) { + return 1 if $create or $dirName ne 'XMP'; # nothing to create + # it would be really difficult to delete the XMP, + # so instead we write a blank XMP record + $val = <<EMPTY_XMP; +<?xpacket begin='\xef\xbb\xbf' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool $Image::ExifTool::VERSION'> +</x:xmpmeta> +EMPTY_XMP + $val .= ((' ' x 100) . "\n") x 24 unless $$et{OPTIONS}{Compact}{NoPadding}; + $val .= q{<?xpacket end='w'?>}; + $dataPt = \$val; + $len = length $val; + } +# +# write XMP directory +# + if ($dirName eq 'XMP') { + if ($create) { + # create necessary PS/EPS code to support XMP + $beforeXMP = <<HDR_END; +/pdfmark where {pop true} {false} ifelse +/currentdistillerparams where {pop currentdistillerparams +/CoreDistVersion get 5000 ge } {false} ifelse +and not {userdict /pdfmark /cleartomark load put} if +[/NamespacePush pdfmark +[/_objdef {exiftool_metadata_stream} /type /stream /OBJ pdfmark +[{exiftool_metadata_stream} 2 dict begin /Type /Metadata def + /Subtype /XML def currentdict end /PUT pdfmark +/MetadataString $len string def % exact length of metadata +/TempString 100 string def +/ConsumeMetadata { +currentfile TempString readline pop pop +currentfile MetadataString readstring pop pop +} bind def +ConsumeMetadata +%begin_xml_packet: $len +HDR_END + # note: use q() to get necessary linefeed before %end_xml_packet + $afterXMP = q( +%end_xml_packet +[{exiftool_metadata_stream} MetadataString /PUT pdfmark +); + if ($$flags{EPS}) { + $afterXMP .= <<EPS_AFTER; +[/Document 1 dict begin + /Metadata {exiftool_metadata_stream} def currentdict end /BDC pdfmark +[/NamespacePop pdfmark +EPS_AFTER + # write this at end of file + $$flags{TRAILER} = "[/EMC pdfmark$/"; + } else { # PS + $afterXMP .= <<PS_AFTER; +[{Catalog} {exiftool_metadata_stream} /Metadata pdfmark +[/NamespacePop pdfmark +PS_AFTER + } + $beforeXMP =~ s{\n}{$/}sg; # use proper newline characters + $afterXMP =~ s{\n}{$/}sg; + } else { + # replace xmp size in PS code + $reportedLen and $beforeXMP =~ s/\b$reportedLen\b/$len/sg; + } + WriteXMPDir($outfile, $flags, $beforeXMP, $$dataPt, $afterXMP) or $success = 0; +# +# Write Photoshop or ICC_Profile directory +# + } elsif ($dirName eq 'Photoshop' or $dirName eq 'ICC_Profile') { + my ($startToken, $endToken); + if ($dirName eq 'Photoshop') { + $startToken = "%BeginPhotoshop: $len"; + $endToken = '%EndPhotoshop'; + } else { + $startToken = '%%BeginICCProfile: (Photoshop Profile) -1 Hex'; + $endToken = '%%EndICCProfile'; + } + Write($outfile, $startToken, $/) or $success = 0; + # write as an ASCII-hex comment + my $i; + my $wid = 32; + for ($i=0; $i<$len; $i+=$wid) { + $wid > $len-$i and $wid = $len-$i; + my $dat = substr($$dataPt, $i, $wid); + Write($outfile, "% ", uc(unpack('H*',$dat)), $/) or $success = 0; + } + Write($outfile, $endToken, $/) or $success = 0; + } else { + $et->Warn("Can't write PS directory $dirName"); + } + undef $val; + return $success; +} + +#------------------------------------------------------------------------------ +# Encode postscript tag/value +# Inputs: 0) tag ID, 1) value +# Returns: postscript comment +# - adds brackets, escapes special characters, and limits line length +sub EncodeTag($$) +{ + my ($tag, $val) = @_; + unless ($val =~ /^\d+$/) { + $val =~ s/([()\\])/\\$1/g; # escape brackets and backslashes + $val =~ s/\n/\\n/g; # escape newlines + $val =~ s/\r/\\r/g; # escape carriage returns + $val =~ s/\t/\\t/g; # escape tabs + # use octal escape codes for other control characters + $val =~ s/([\x00-\x1f\x7f\xff])/sprintf("\\%.3o",ord($1))/ge; + $val = "($val)"; + } + my $line = "%%$tag: $val"; + # postscript line limit is 255 characters (but it seems that + # the limit may be 254 characters if the DOS CR/LF is used) + # --> split if necessary using continuation comment "%%+" + my $n; + for ($n=254; length($line)>$n; $n+=254+length($/)) { + substr($line, $n, 0) = "$/%%+"; + } + return $line . $/; +} + +#------------------------------------------------------------------------------ +# Write new tags information in comments section +# Inputs: 0) ExifTool object ref, 1) output file ref, 2) reference to new tag hash +# Returns: true on success +sub WriteNewTags($$$) +{ + my ($et, $outfile, $newTags) = @_; + my $success = 1; + my $tag; + + # get XMP hint and remove from tags hash + my $xmpHint = $$newTags{XMP_HINT}; + delete $$newTags{XMP_HINT}; + + foreach $tag (sort keys %$newTags) { + my $tagInfo = $$newTags{$tag}; + my $nvHash = $et->GetNewValueHash($tagInfo); + next unless $$nvHash{IsCreating}; + my $val = $et->GetNewValue($nvHash); + $et->VerboseValue("+ PostScript:$$tagInfo{Name}", $val); + Write($outfile, EncodeTag($tag, $val)) or $success = 0; + ++$$et{CHANGED}; + } + # write XMP hint if necessary + Write($outfile, "%ADO_ContainsXMP: MainFirst$/") or $success = 0 if $xmpHint; + + %$newTags = (); # all done with new tags + return $success; +} + +#------------------------------------------------------------------------------ +# Write PS file +# Inputs: 0) ExifTool object reference, 1) source dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid PS file, +# or -1 if a write error occurred +sub WritePS($$) +{ + my ($et, $dirInfo) = @_; + $et or return 1; # allow dummy access to autoload this package + my $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::PostScript::Main'); + my $raf = $$dirInfo{RAF}; + my $outfile = $$dirInfo{OutFile}; + my $verbose = $et->Options('Verbose'); + my $out = $et->Options('TextOut'); + my ($data, $buff, %flags, $err, $mode, $endToken); + my ($dos, $psStart, $psNewStart, $xmpHint, @lines); + + $raf->Read($data, 4) == 4 or return 0; + return 0 unless $data =~ /^(%!PS|%!Ad|\xc5\xd0\xd3\xc6)/; + + if ($data =~ /^%!Ad/) { + # I've seen PS files start with "%!Adobe-PS"... + return 0 unless $raf->Read($buff, 6) == 6 and $buff eq "obe-PS"; + $data .= $buff; + + } elsif ($data =~ /^\xc5\xd0\xd3\xc6/) { +# +# process DOS binary PS files +# + # save DOS header then seek ahead and check PS header + $raf->Read($dos, 26) == 26 or return 0; + $dos = $data . $dos; + SetByteOrder('II'); + $psStart = Get32u(\$dos, 4); + unless ($raf->Seek($psStart, 0) and + $raf->Read($data, 4) == 4 and $data eq '%!PS') + { + $et->Error('Invalid PS header'); + return 1; + } + $$raf{PSEnd} = $psStart + Get32u(\$dos, 8); + my $base = Get32u(\$dos, 20); + Set16u(0xffff, \$dos, 28); # ignore checksum + if ($base) { + my %dirInfo = ( + Parent => 'PS', + RAF => $raf, + Base => $base, + NoTiffEnd => 1, # no end-of-TIFF check + ); + $buff = $et->WriteTIFF(\%dirInfo); + SetByteOrder('II'); # (WriteTIFF may change this) + if ($buff) { + $buff = substr($buff, $base); # remove header written by WriteTIFF() + } else { + # error rewriting TIFF, so just copy over original data + my $len = Get32u(\$dos, 24); + unless ($raf->Seek($base, 0) and $raf->Read($buff, $len) == $len) { + $et->Error('Error reading embedded TIFF'); + return 1; + } + $et->Warn('Bad embedded TIFF'); + } + Set32u(0, \$dos, 12); # zero metafile pointer + Set32u(0, \$dos, 16); # zero metafile length + Set32u(length($dos), \$dos, 20); # set TIFF pointer + Set32u(length($buff), \$dos, 24); # set TIFF length + } elsif (($base = Get32u(\$dos, 12)) != 0) { + # copy over metafile section + my $len = Get32u(\$dos, 16); + unless ($raf->Seek($base, 0) and $raf->Read($buff, $len) == $len) { + $et->Error('Error reading metafile section'); + return 1; + } + Set32u(length($dos), \$dos, 12); # set metafile pointer + } else { + $buff = ''; + } + $psNewStart = length($dos) + length($buff); + Set32u($psNewStart, \$dos, 4); # set pointer to start of PS + Write($outfile, $dos, $buff) or $err = 1; + $raf->Seek($psStart + 4, 0); # seek back to where we were + } +# +# rewrite PostScript data +# + local $/ = GetInputRecordSeparator($raf); + unless ($/ and $raf->ReadLine($buff)) { + $et->Error('Invalid PostScript data'); + return 1; + } + $data .= $buff; + unless ($data =~ /^%!PS-Adobe-3\.(\d+)\b/ and $1 < 2) { + if ($et->Error("Document does not conform to DSC spec. Metadata may be unreadable by other apps", 2)) { + return 1; + } + } + my $psRev = $1; # save PS revision number (3.x) + Write($outfile, $data) or $err = 1; + $flags{EPS} = 1 if $data =~ /EPSF/; + + # get hash of new information keyed by tagID and directories to add/edit + my $newTags = $et->GetNewTagInfoHash($tagTablePtr); + + # figure out which directories we need to write (PostScript takes priority) + $et->InitWriteDirs(\%psMap, 'PostScript'); + my $addDirs = $$et{ADD_DIRS}; + my $editDirs = $$et{EDIT_DIRS}; + my %doneDir; + + # set XMP hint flag (1 for adding, 0 for deleting, undef for no change) + $xmpHint = 1 if $$addDirs{XMP}; + $xmpHint = 0 if $$et{DEL_GROUP}{XMP}; + $$newTags{XMP_HINT} = $xmpHint if $xmpHint; # add special tag to newTags list + + for (;;) { + @lines or GetNextLine($raf, \@lines) or last; + $data = shift @lines; + if ($endToken) { + # look for end token + if ($data =~ m/^$endToken\s*$/is) { + undef $endToken; + # found end: process this information + if ($mode) { + $doneDir{$mode} and $et->Error("Multiple $mode directories", 1); + $doneDir{$mode} = 1; + WritePSDirectory($et, $outfile, $mode, \$buff, \%flags) or $err = 1; + # write end token if we wrote the begin token + Write($outfile, $data) or $err = 1 if $flags{WROTE_BEGIN}; + undef $buff; + } else { + Write($outfile, $data) or $err = 1; + } + } else { + # buffer data in current begin/end block + if (not defined $mode) { + # pick up XMP in unrecognized blocks for editing in place + if ($data =~ /^<\?xpacket begin=.{7,13}W5M0MpCehiHzreSzNTczkc9d/ and + $$editDirs{XMP}) + { + $buff = $data; + $mode = 'XMP'; + } else { + Write($outfile, $data) or $err = 1; + } + } elsif ($mode eq 'XMP') { + $buff .= $data; + } else { + # data is ASCII-hex encoded + $data =~ tr/0-9A-Fa-f//dc; # remove all but hex characters + $buff .= pack('H*', $data); # translate from hex + } + } + next; + } elsif ($data =~ m{^(%{1,2})(Begin)(?!Object:)(.*?)[:\x0d\x0a]}i) { + # comments section is over... write any new tags now + WriteNewTags($et, $outfile, $newTags) or $err = 1 if %$newTags; + undef $xmpHint; + # the beginning of a data block (can only write XMP and Photoshop) + my %modeLookup = ( + _xml_code => 'XMP', + photoshop => 'Photoshop', + iccprofile => 'ICC_Profile', + ); + $verbose > 1 and print $out "$2$3\n"; + $endToken = $1 . ($2 eq 'begin' ? 'end' : 'End') . $3; + $mode = $modeLookup{lc($3)}; + if ($mode and $$editDirs{$mode}) { + $buff = ''; # initialize buffer for this block + $flags{WROTE_BEGIN} = 0; + } else { + undef $mode; # not editing this directory + Write($outfile, $data) or $err = 1; + $flags{WROTE_BEGIN} = 1; + } + next; + } elsif ($data =~ /^%%(?!Page:|PlateFile:|BeginObject:)(\w+): ?(.*)/s) { + # rewrite information from PostScript tags in comments + my ($tag, $val) = ($1, $2); + # handle Adobe Illustrator files specially + # - EVENTUALLY IT WOULD BE BETTER TO FIND ANOTHER IDENTIFICATION METHOD + # (because Illustrator doesn't care if the Creator is changed) + if ($tag eq 'Creator' and $val =~ /^Adobe Illustrator/) { + # disable writing XMP to PostScript-format Adobe Illustrator files + # because it confuses Illustrator + if ($$editDirs{XMP}) { + $et->Warn("Can't write XMP to PostScript-format Illustrator files"); + # pretend like we wrote it already so we won't try to add it later + $doneDir{XMP} = 1; + } + # don't allow "Creator" to be changed in Illustrator files + # (we need it to be able to recognize these files) + # --> find a better way to do this! + if ($$newTags{$tag}) { + $et->Warn("Can't change Postscript:Creator of Illustrator files"); + delete $$newTags{$tag}; + } + } + if ($$newTags{$tag}) { + my $tagInfo = $$newTags{$tag}; + delete $$newTags{$tag}; # write it then forget it + next unless ref $tagInfo; + # decode comment string (reading continuation lines if necessary) + $val = DecodeComment($val, $raf, \@lines, \$data); + $val = join $et->Options('ListSep'), @$val if ref $val eq 'ARRAY'; + my $nvHash = $et->GetNewValueHash($tagInfo); + if ($et->IsOverwriting($nvHash, $val)) { + $et->VerboseValue("- PostScript:$$tagInfo{Name}", $val); + $val = $et->GetNewValue($nvHash); + ++$$et{CHANGED}; + next unless defined $val; # next if tag is being deleted + $et->VerboseValue("+ PostScript:$$tagInfo{Name}", $val); + $data = EncodeTag($tag, $val); + } + } + # (note: Adobe InDesign doesn't put colon after %ADO_ContainsXMP -- doh!) + } elsif (defined $xmpHint and $data =~ m{^%ADO_ContainsXMP:? ?(.+?)[\x0d\x0a]*$}s) { + # change the XMP hint if necessary + if ($xmpHint) { + $data = "%ADO_ContainsXMP: MainFirst$/" if $1 eq 'NoMain'; + } else { + $data = "%ADO_ContainsXMP: NoMain$/"; + } + # delete XMP hint flags + delete $$newTags{XMP_HINT}; + undef $xmpHint; + } else { + # look for end of comments section + if (%$newTags and ($data !~ /^%\S/ or + $data =~ /^%(%EndComments|%Page:|%PlateFile:|%BeginObject:|.*BeginLayer)/)) + { + # write new tags at end of comments section + WriteNewTags($et, $outfile, $newTags) or $err = 1; + undef $xmpHint; + } + # look for start of drawing commands (AI uses "%AI5_BeginLayer", + # and Helios uses "%%BeginObject:") + if ($data =~ /^%(%Page:|%PlateFile:|%BeginObject:|.*BeginLayer)/ or + $data !~ m{^(%.*|\s*)$}s) + { + # we have reached the first page or drawing command, so create necessary + # directories and copy the rest of the file, then all done + my $dir; + my $plateFile = ($data =~ /^%%PlateFile:/); + # create Photoshop first, then XMP if necessary + foreach $dir (qw{Photoshop ICC_Profile XMP}) { + next unless $$editDirs{$dir} and not $doneDir{$dir}; + if ($plateFile) { + # PlateFile comments may contain offsets so we can't edit these files! + $et->Warn("Can only edit PostScript information DCS Plate files"); + last; + } + next unless $$addDirs{$dir} or $dir eq 'XMP'; + $flags{WROTE_BEGIN} = 0; + WritePSDirectory($et, $outfile, $dir, undef, \%flags) or $err = 1; + $doneDir{$dir} = 1; + } + # copy rest of file + if ($flags{TRAILER}) { + # write trailer before %%EOF + for (;;) { + Write($outfile, $data) or $err = 1; + if (@lines) { + $data = shift @lines; + } else { + $raf->ReadLine($data) or undef($data), last; + $dos and CheckPSEnd($raf, \$data); + if ($data =~ /[\x0d\x0a]%%EOF\b/g) { + # split data before "%%EOF" + # (necessary if data contains other newline sequences) + my $pos = pos($data) - 5; + push @lines, substr($data, $pos); + $data = substr($data, 0, $pos); + } + } + last if $data =~ /^%%EOF\b/; + } + Write($outfile, $flags{TRAILER}) or $err = 1; + } + # simply copy the rest of the file if any data is left + if (defined $data) { + Write($outfile, $data) or $err = 1; + Write($outfile, @lines) or $err = 1 if @lines; + while ($raf->Read($data, 65536)) { + $dos and CheckPSEnd($raf, \$data); + Write($outfile, $data) or $err = 1; + } + } + last; # all done! + } + } + # write new information or copy existing line + Write($outfile, $data) or $err = 1; + } + if ($dos and not $err) { + # must go back and set length of PS section in DOS header (very dumb design) + if (ref $outfile eq 'SCALAR') { + Set32u(length($$outfile) - $psNewStart, $outfile, 8); + } else { + my $pos = tell $outfile; + unless (seek($outfile, 8, 0) and + print $outfile Set32u($pos - $psNewStart) and + seek($outfile, $pos, 0)) + { + $et->Error("Can't write DOS-style PS files in non-seekable stream"); + $err = 1; + } + } + } + # issue warning if we couldn't write any information + unless ($err) { + my (@notDone, $dir); + delete $$newTags{XMP_HINT}; + push @notDone, 'PostScript' if %$newTags; + foreach $dir (qw{Photoshop ICC_Profile XMP}) { + push @notDone, $dir if $$editDirs{$dir} and not $doneDir{$dir} and + not $$et{DEL_GROUP}{$dir}; + } + @notDone and $et->Warn("Couldn't write ".join('/',@notDone).' information'); + } + $endToken and $et->Error("File missing $endToken"); + return $err ? -1 : 1; +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::WritePostScript.pl - Write PostScript meta information + +=head1 SYNOPSIS + +This file is autoloaded by Image::ExifTool::PostScript. + +=head1 DESCRIPTION + +This file contains routines to write meta information in PostScript +documents. Six forms of meta information may be written: + + 1) PostScript comments (Adobe DSC specification) + 2) XMP information embedded in a document-level XMP stream + 3) EXIF information embedded in a Photoshop record + 4) IPTC information embedded in a PhotoShop record + 5) ICC_Profile information embedded in an ICCProfile record + 6) TIFF information embedded in DOS-style binary header + +=head1 NOTES + +Currently, information is written only in the outer-level document. + +Photoshop will discard meta information in a PostScript document if it has +to rasterize the image, and it will rasterize anything that doesn't contain +the Photoshop-specific 'ImageData' tag. So don't expect Photoshop to read +any meta information added to EPS images that it didn't create. + +The following two acronyms may be confusing since they are so similar and +have different meanings with respect to PostScript documents: + + DSC = Document Structuring Conventions + DCS = Desktop Color Separation + +=head1 REFERENCES + +See references in L<PostScript.pm|Image::ExifTool::PostScript>, plus: + +=over 4 + +=item L<http://www.adobe.com/products/postscript/pdfs/PLRM.pdf> + +=item L<http://www-cdf.fnal.gov/offline/PostScript/PLRM2.pdf> + +=item L<http://partners.adobe.com/public/developer/en/acrobat/sdk/pdf/pdf_creation_apis_and_specs/pdfmarkReference.pdf> + +=back + +=head1 ACKNOWLEDGEMENTS + +Thanks to Tim Kordick for his help testing the EPS writer. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::PostScript(3pm)|Image::ExifTool::PostScript>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/WriteQuickTime.pl b/lib/Image/ExifTool/WriteQuickTime.pl new file mode 100644 index 0000000..fbfa0d3 --- /dev/null +++ b/lib/Image/ExifTool/WriteQuickTime.pl @@ -0,0 +1,1940 @@ +#------------------------------------------------------------------------------ +# File: WriteQuickTime.pl +# +# Description: Write XMP to QuickTime (MOV and MP4) files +# +# Revisions: 2013-10-29 - P. Harvey Created +#------------------------------------------------------------------------------ +package Image::ExifTool::QuickTime; + +use strict; + +# maps for adding metadata to various QuickTime-based file types +my %movMap = ( + # MOV (no 'ftyp', or 'ftyp'='qt ') -> XMP in 'moov'-'udta'-'XMP_' + QuickTime => 'ItemList', # (default location for QuickTime tags) + ItemList => 'Meta', # MOV-Movie-UserData-Meta-ItemList + Keys => 'Movie', # MOV-Movie-Meta-Keys !! (hack due to different Meta location) + Meta => 'UserData', + XMP => 'UserData', # MOV-Movie-UserData-XMP + Microsoft => 'UserData', # MOV-Movie-UserData-Microsoft + UserData => 'Movie', # MOV-Movie-UserData + Movie => 'MOV', + GSpherical => 'SphericalVideoXML', # MOV-Movie-Track-SphericalVideoXML + SphericalVideoXML => 'Track', # (video track specifically, don't create if it doesn't exist) + Track => 'Movie', +); +my %mp4Map = ( + # MP4 ('ftyp' compatible brand 'mp41', 'mp42' or 'f4v ') -> XMP at top level + QuickTime => 'ItemList', # (default location for QuickTime tags) + ItemList => 'Meta', # MOV-Movie-UserData-Meta-ItemList + Keys => 'Movie', # MOV-Movie-Meta-Keys !! (hack due to different Meta location) + Meta => 'UserData', + UserData => 'Movie', # MOV-Movie-UserData + Microsoft => 'UserData', # MOV-Movie-UserData-Microsoft + Movie => 'MOV', + XMP => 'MOV', # MOV-XMP + GSpherical => 'SphericalVideoXML', # MOV-Movie-Track-SphericalVideoXML + SphericalVideoXML => 'Track', # (video track specifically, don't create if it doesn't exist) + Track => 'Movie', +); +my %heicMap = ( + # HEIC/HEIF/AVIF ('ftyp' compatible brand 'heic','mif1','avif') -> XMP/EXIF in top level 'meta' + Meta => 'MOV', + ItemInformation => 'Meta', + ItemPropertyContainer => 'Meta', + XMP => 'ItemInformation', + EXIF => 'ItemInformation', + ICC_Profile => 'ItemPropertyContainer', + IFD0 => 'EXIF', + IFD1 => 'IFD0', + ExifIFD => 'IFD0', + GPS => 'IFD0', + SubIFD => 'IFD0', + GlobParamIFD => 'IFD0', + PrintIM => 'IFD0', + InteropIFD => 'ExifIFD', + MakerNotes => 'ExifIFD', +); +my %cr3Map = ( + # CR3 ('ftyp' compatible brand 'crx ') -> XMP at top level + Movie => 'MOV', + XMP => 'MOV', + 'UUID-Canon'=>'Movie', + ExifIFD => 'UUID-Canon', + IFD0 => 'UUID-Canon', + GPS => 'UUID-Canon', + #MakerNoteCanon => 'UUID-Canon', # (doesn't yet work -- goes into ExifIFD instead) + 'UUID-Canon2' => 'MOV', + CanonVRD => 'UUID-Canon2', +); +my %dirMap = ( + MOV => \%movMap, + MP4 => \%mp4Map, + CR3 => \%cr3Map, + HEIC => \%heicMap, +); + +# convert ExifTool Format to QuickTime type +my %qtFormat = ( + 'undef' => 0x00, string => 0x01, + int8s => 0x15, int16s => 0x15, int32s => 0x15, int64s => 0x15, + int8u => 0x16, int16u => 0x16, int32u => 0x16, int64u => 0x16, + float => 0x17, double => 0x18, +); +my $undLang = 0x55c4; # numeric code for default ('und') language + +my $maxReadLen = 100000000; # maximum size of atom to read into memory (100 MB) + +# boxes that may exist in an "empty" Meta box: +my %emptyMeta = ( + hdlr => 'Handler', 'keys' => 'Keys', lang => 'Language', ctry => 'Country', free => 'Free', +); + +# lookup for CTBO ID number based on uuid for Canon CR3 files +my %ctboID = ( + "\xbe\x7a\xcf\xcb\x97\xa9\x42\xe8\x9c\x71\x99\x94\x91\xe3\xaf\xac" => 1, # XMP + "\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16" => 2, # PreviewImage + # ID 3 is used for 'mdat' atom (not a uuid) +); + +# mark UserData tags that don't have ItemList counterparts as Preferred +# - and set Preferred to 0 for any Avoid-ed tag +# - also, for now, set Writable to 0 for any tag with a RawConv and no RawConvInv +{ + my $itemList = \%Image::ExifTool::QuickTime::ItemList; + my $userData = \%Image::ExifTool::QuickTime::UserData; + my (%pref, $tag); + foreach $tag (TagTableKeys($itemList)) { + my $tagInfo = $$itemList{$tag}; + if (ref $tagInfo ne 'HASH') { + next if ref $tagInfo; + $tagInfo = $$itemList{$tag} = { Name => $tagInfo }; + } else { + $$tagInfo{Writable} = 0 if $$tagInfo{RawConv} and not $$tagInfo{RawConvInv}; + $$tagInfo{Avoid} and $$tagInfo{Preferred} = 0, next; + next if defined $$tagInfo{Preferred} and not $$tagInfo{Preferred}; + } + $pref{$$tagInfo{Name}} = 1; + } + foreach $tag (TagTableKeys($userData)) { + my $tagInfo = $$userData{$tag}; + if (ref $tagInfo ne 'HASH') { + next if ref $tagInfo; + $tagInfo = $$userData{$tag} = { Name => $tagInfo }; + } else { + $$tagInfo{Writable} = 0 if $$tagInfo{RawConv} and not $$tagInfo{RawConvInv}; + $$tagInfo{Avoid} and $$tagInfo{Preferred} = 0, next; + next if defined $$tagInfo{Preferred} or $pref{$$tagInfo{Name}}; + } + $$tagInfo{Preferred} = 1; + } +} + +#------------------------------------------------------------------------------ +# Format GPSCoordinates for writing +# Inputs: 0) PrintConv value +# Returns: ValueConv value +sub PrintInvGPSCoordinates($) +{ + my ($val, $et) = @_; + my @v = split /, */, $val; + if (@v == 2 or @v == 3) { + my $below = ($v[2] and $v[2] =~ /below/i); + $v[0] = Image::ExifTool::GPS::ToDegrees($v[0], 1); + $v[1] = Image::ExifTool::GPS::ToDegrees($v[1], 1); + $v[2] = Image::ExifTool::ToFloat($v[2]) * ($below ? -1 : 1) if @v == 3; + return "@v"; + } + return $val if $val =~ /^([-+]\d+(\.\d*)?){2,3}(CRS.*)?\/?$/; # already in ISO6709 format? + return undef; +} + +#------------------------------------------------------------------------------ +# Convert GPS coordinates back to ISO6709 format +# Inputs: 0) ValueConv value +# Returns: ISO6709 coordinates +sub ConvInvISO6709($) +{ + local $_; + my $val = shift; + my @a = split ' ', $val; + if (@a == 2 or @a == 3) { + # latitude must have 2 digits before the decimal, and longitude 3, + # and all values must start with a "+" or "-", and Google Photos + # requires at least 3 digits after the decimal point + # (and as of Apr 2021, Google Photos doesn't accept coordinats + # with more than 5 digits after the decimal place: + # https://exiftool.org/forum/index.php?topic=11055.msg67171#msg67171 ) + my @fmt = ('%s%02d.%s%s','%s%03d.%s%s','%s%d.%s%s'); + foreach (@a) { + return undef unless Image::ExifTool::IsFloat($_); + $_ =~ s/^([-+]?)(\d+)\.?(\d*)/sprintf(shift(@fmt),$1||'+',$2,$3,length($3)<3 ? '0'x(3-length($3)) : '')/e; + } + return join '', @a, '/'; + } + return $val if $val =~ /^([-+]\d+(\.\d*)?){2,3}(CRS.*)?\/?$/; # already in ISO6709 format? + return undef; +} + +#------------------------------------------------------------------------------ +# Handle offsets in iloc (ItemLocation) atom when writing (ref ISO 14496-12:2015 pg.79) +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) data ref, 3) output buffer ref +# Returns: true on success +# Notes: see also ParseItemLocation() in QuickTime.pm +# (variable names with underlines correspond to names in ISO 14496-12) +sub Handle_iloc($$$$) +{ + my ($et, $dirInfo, $dataPt, $outfile) = @_; + my ($i, $j, $num, $pos, $id); + + my $off = $$dirInfo{ChunkOffset}; + my $len = length $$dataPt; + return 0 if $len < 8; + my $ver = Get8u($dataPt, 0); + my $siz = Get16u($dataPt, 4); + my $noff = ($siz >> 12); + my $nlen = ($siz >> 8) & 0x0f; + my $nbas = ($siz >> 4) & 0x0f; + my $nind = $siz & 0x0f; + my %ok = ( 0 => 1, 4 => 1, 8 => 8 ); + return 0 unless $ok{$noff} and $ok{$nlen} and $ok{$nbas} and $ok{$nind}; + # piggy-back on existing code to fix up stco/co64 4/8-byte offsets + my $tag = $noff == 4 ? 'stco_iloc' : 'co64_iloc'; + if ($ver < 2) { + $num = Get16u($dataPt, 6); + $pos = 8; + } else { + return 0 if $len < 10; + $num = Get32u($dataPt, 6); + $pos = 10; + } + for ($i=0; $i<$num; ++$i) { + if ($ver < 2) { + return 0 if $pos + 2 > $len; + $id = Get16u($dataPt, $pos); + $pos += 2; + } else { + return 0 if $pos + 4 > $len; + $id = Get32u($dataPt, $pos); + $pos += 4; + } + my ($constOff, @offBase, @offItem, $minOffset); + if ($ver == 1 or $ver == 2) { + return 0 if $pos + 2 > $len; + # offsets are absolute only if ConstructionMethod is 0, otherwise + # the relative offsets are constant as far as we are concerned + $constOff = Get16u($dataPt, $pos) & 0x0f; + $pos += 2; + } + return 0 if $pos + 2 > $len; + my $drefIdx = Get16u($dataPt, $pos); + if ($drefIdx) { + if ($$et{QtDataRef} and $$et{QtDataRef}[$drefIdx - 1]) { + my $dref = $$et{QtDataRef}[$drefIdx - 1]; + # these offsets are constant unless the data is in this file + $constOff = 1 unless $$dref[1] == 1 and $$dref[0] ne 'rsrc'; + } else { + $et->Error("No data reference for iloc entry $i"); + return 0; + } + } + $pos += 2; + # get base offset and save its location if in this file + my $base_offset = GetVarInt($dataPt, $pos, $nbas); + if ($base_offset and not $constOff) { + my $tg = ($nbas == 4 ? 'stco' : 'co64') . '_iloc'; + push @offBase, [ $tg, length($$outfile) + 8 + $pos - $nbas, $nbas, 0, $id ]; + } + return 0 if $pos + 2 > $len; + my $ext_num = Get16u($dataPt, $pos); + $pos += 2; + my $listStartPos = $pos; + # run through the item list to get offset locations and the minimum offset in this file + for ($j=0; $j<$ext_num; ++$j) { + $pos += $nind if $ver == 1 or $ver == 2; + my $extent_offset = GetVarInt($dataPt, $pos, $noff); + return 0 unless defined $extent_offset; + unless ($constOff) { + push @offItem, [ $tag, length($$outfile) + 8 + $pos - $noff, $noff, 0, $id ] if $noff; + $minOffset = $extent_offset if not defined $minOffset or $minOffset > $extent_offset; + } + return 0 if $pos + $nlen > length $$dataPt; + $pos += $nlen; + } + # decide whether to fix up the base offset or individual item offsets + # (adjust the one that is larger) + if (defined $minOffset and $minOffset > $base_offset) { + $$_[3] = $base_offset foreach @offItem; + push @$off, @offItem; + } else { + $$_[3] = $minOffset foreach @offBase; + push @$off, @offBase; + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Get localized version of tagInfo hash +# Inputs: 0) tagInfo hash ref, 1) language code (eg. "fra-FR") +# Returns: new tagInfo hash ref, or undef if invalid or no language code +sub GetLangInfo($$) +{ + my ($tagInfo, $langCode) = @_; + return undef unless $langCode; + # only allow alternate language tags in lang-alt lists + my $writable = $$tagInfo{Writable}; + $writable = $$tagInfo{Table}{WRITABLE} unless defined $writable; + return undef unless $writable; + $langCode =~ tr/_/-/; # RFC 3066 specifies '-' as a separator + my $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $langCode); + return $langInfo; +} + +#------------------------------------------------------------------------------ +# validate raw values for writing +# Inputs: 0) ExifTool ref, 1) tagInfo hash ref, 2) raw value ref +# Returns: error string or undef (and possibly changes value) on success +sub CheckQTValue($$$) +{ + my ($et, $tagInfo, $valPtr) = @_; + my $format = $$tagInfo{Format} || $$tagInfo{Writable} || $$tagInfo{Table}{FORMAT}; + return undef unless $format; + return Image::ExifTool::CheckValue($valPtr, $format, $$tagInfo{Count}); +} + +#------------------------------------------------------------------------------ +# Format QuickTime value for writing +# Inputs: 0) ExifTool ref, 1) value ref, 2) Format (or undef), 3) Writable (or undef) +# Returns: Flags for QT data type, and reformats value as required +sub FormatQTValue($$;$$) +{ + my ($et, $valPt, $format, $writable) = @_; + my $flags; + if ($format and $format ne 'string' or not $format and $writable and $writable ne 'string') { + $$valPt = WriteValue($$valPt, $format || $writable); + if ($writable and $qtFormat{$writable}) { + $flags = $qtFormat{$writable}; + } else { + $flags = $qtFormat{$format || 0} || 0; + } + } elsif ($$valPt =~ /^\xff\xd8\xff/) { + $flags = 0x0d; # JPG + } elsif ($$valPt =~ /^(\x89P|\x8aM|\x8bJ)NG\r\n\x1a\n/) { + $flags = 0x0e; # PNG + } elsif ($$valPt =~ /^BM.{15}\0/s) { + $flags = 0x1b; # BMP + } else { + $flags = 0x01; # UTF8 + $$valPt = $et->Encode($$valPt, 'UTF8'); + } + return $flags; +} + +#------------------------------------------------------------------------------ +# Set variable-length integer (used by WriteItemInfo) +# Inputs: 0) value, 1) integer size in bytes (0, 4 or 8), +# Returns: packed integer +sub SetVarInt($$) +{ + my ($val, $n) = @_; + if ($n == 4) { + return Set32u($val); + } elsif ($n == 8) { + return Set64u($val); + } + return ''; +} + +#------------------------------------------------------------------------------ +# Write Meta Keys to add/delete entries as necessary ('mdta' handler) (ref PH) +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: updated keys box data +sub WriteKeys($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to autoload this package + my $dataPt = $$dirInfo{DataPt}; + my $dirLen = length $$dataPt; + my $outfile = $$dirInfo{OutFile}; + my ($tag, %done, %remap, %info, %add, $i); + + $dirLen < 8 and $et->Warn('Short Keys box'), $dirLen = 8, $$dataPt = "\0" x 8; + if ($$et{DEL_GROUP}{Keys}) { + $dirLen = 8; # delete all existing keys + # deleted keys are identified by a zero entry in the Remap lookup + my $n = Get32u($dataPt, 4); + for ($i=1; $i<=$n; ++$i) { $remap{$i} = 0; } + $et->VPrint(0, " [deleting $n Keys entr".($n==1 ? 'y' : 'ies')."]\n"); + ++$$et{CHANGED}; + } + my $pos = 8; + my $newTags = $et->GetNewTagInfoHash($tagTablePtr); + my $newData = substr($$dataPt, 0, $pos); + + my $newIndex = 1; + my $index = 1; + while ($pos < $dirLen - 4) { + my $len = unpack("x${pos}N", $$dataPt); + last if $len < 8 or $pos + $len > $dirLen; + my $ns = substr($$dataPt, $pos + 4, 4); + $tag = substr($$dataPt, $pos + 8, $len - 8); + $tag =~ s/\0.*//s; # truncate at null + $tag =~ s/^com\.apple\.quicktime\.// if $ns eq 'mdta'; # remove apple quicktime domain + $tag = "Tag_$ns" unless $tag; + $done{$tag} = 1; # set flag to avoid creating this tag + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); + if ($tagInfo) { + $info{$index} = $tagInfo; + if ($$newTags{$tag}) { + my $nvHash = $et->GetNewValueHash($tagInfo); + # drop this tag if it is being deleted + if ($nvHash and $et->IsOverwriting($nvHash) > 0 and not defined $et->GetNewValue($nvHash)) { + # don't delete this key if we could be writing any alternate-language version of this tag + my ($t, $dontDelete); + foreach $t (keys %$newTags) { + next unless $$newTags{$t}{SrcTagInfo} and $$newTags{$t}{SrcTagInfo} eq $tagInfo; + my $nv = $et->GetNewValueHash($$newTags{$t}); + next unless $et->IsOverwriting($nv) and defined $et->GetNewValue($nv); + $dontDelete = 1; + last; + } + unless ($dontDelete) { + # delete this key + $et->VPrint(1, "$$et{INDENT}\[deleting Keys entry $index '${tag}']\n"); + $pos += $len; + $remap{$index++} = 0; + ++$$et{CHANGED}; + next; + } + } + } + } + # add to the Keys box data + $newData .= substr($$dataPt, $pos, $len); + $remap{$index++} = $newIndex++; + $pos += $len; + } + # add keys for any tags we need to create + foreach $tag (sort keys %$newTags) { + my $tagInfo = $$newTags{$tag}; + my $id; + if ($$tagInfo{LangCode} and $$tagInfo{SrcTagInfo}) { + $id = $$tagInfo{SrcTagInfo}{TagID}; + } else { + $id = $tag; + } + next if $done{$id}; + my $nvHash = $et->GetNewValueHash($tagInfo); + next unless $$nvHash{IsCreating} and $et->IsOverwriting($nvHash) and + defined $et->GetNewValue($nvHash); + # add new entry to 'keys' data + my $val = $id =~ /^com\./ ? $id : "com.apple.quicktime.$id"; + $newData .= Set32u(8 + length($val)) . 'mdta' . $val; + $et->VPrint(1, "$$et{INDENT}\[adding Keys entry $newIndex '${id}']\n"); + $add{$newIndex++} = $tagInfo; + ++$$et{CHANGED}; + } + my $num = $newIndex - 1; + if ($num) { + Set32u($num, \$newData, 4); # update count in header + } else { + $newData = ''; # delete empty Keys box + } + # save temporary variables for use when writing ItemList: + # Remap - lookup for remapping Keys ID numbers (0 if item is deleted) + # Info - Keys tag information, based on old index value + # Add - Keys items deleted, based on old index value + # Num - Number of items in edited Keys box + $$et{Keys} = { Remap => \%remap, Info => \%info, Add => \%add, Num => $num }; + + return $newData; # return updated Keys box +} + +#------------------------------------------------------------------------------ +# Write ItemInformation in HEIC files +# Inputs: 0) ExifTool ref, 1) dirInfo ref (with BoxPos entry), 2) output buffer ref +# Returns: mdat edit list ref (empty if nothing changed) +sub WriteItemInfo($$$) +{ + my ($et, $dirInfo, $outfile) = @_; + my $boxPos = $$dirInfo{BoxPos}; # hash of [length,position] for each box + my $raf = $$et{RAF}; + my $items = $$et{ItemInfo}; + my (%did, @mdatEdit, $name); + + return () unless $items and $raf; + + # extract information from EXIF/XMP metadata items + my $primary = $$et{PrimaryItem}; + my $curPos = $raf->Tell(); + my $id; + foreach $id (sort { $a <=> $b } keys %$items) { + $primary = $id unless defined $primary; # assume primary is lowest-number item if pitm missing + my $item = $$items{$id}; + # only edit primary EXIF/XMP metadata + next unless $$item{RefersTo} and $$item{RefersTo}{$primary}; + my $type = $$item{ContentType} || $$item{Type} || next; + # get ExifTool name for this item + $name = { Exif => 'EXIF', 'application/rdf+xml' => 'XMP' }->{$type}; + next unless $name; # only care about EXIF and XMP + next unless $$et{EDIT_DIRS}{$name}; + $did{$name} = 1; # set flag to prevent creating this metadata + my ($warn, $extent, $buff, @edit); + $warn = 'Missing iloc box' unless $$boxPos{iloc}; + $warn = "No Extents for $type item" unless $$item{Extents} and @{$$item{Extents}}; + $warn = "Can't currently decode encoded $type metadata" if $$item{ContentEncoding}; + $warn = "Can't currently decode protected $type metadata" if $$item{ProtectionIndex}; + $warn = "Can't currently extract $type with construction method $$item{ConstructionMethod}" if $$item{ConstructionMethod}; + $warn = "$type metadata is not this file" if $$item{DataReferenceIndex}; + $warn and $et->Warn($warn), next; + my $base = $$item{BaseOffset} || 0; + my $val = ''; + foreach $extent (@{$$item{Extents}}) { + $val .= $buff if defined $buff; + my $pos = $$extent[1] + $base; + if ($$extent[2]) { + $raf->Seek($pos, 0) or last; + $raf->Read($buff, $$extent[2]) or last; + } else { + $buff = ''; + } + push @edit, [ $pos, $pos + $$extent[2] ]; # replace or delete this if changed + } + next unless defined $buff; + $buff = $val . $buff if length $val; + my ($hdr, $subTable, $proc); + if ($name eq 'EXIF') { + if (not length $buff) { + # create EXIF from scratch + $hdr = "\0\0\0\x06Exif\0\0"; + } elsif ($buff =~ /^(MM\0\x2a|II\x2a\0)/) { + $et->Warn('Missing Exif header'); + $hdr = ''; + } elsif (length($buff) >= 4 and length($buff) >= 4 + unpack('N',$buff)) { + $hdr = substr($buff, 0, 4 + unpack('N',$buff)); + } else { + $et->Warn('Invalid Exif header'); + next; + } + $subTable = GetTagTable('Image::ExifTool::Exif::Main'); + $proc = \&Image::ExifTool::WriteTIFF; + } else { + $hdr = ''; + $subTable = GetTagTable('Image::ExifTool::XMP::Main'); + } + my %dirInfo = ( + DataPt => \$buff, + DataLen => length $buff, + DirStart => length $hdr, + DirLen => length($buff) - length $hdr, + ); + my $changed = $$et{CHANGED}; + my $newVal = $et->WriteDirectory(\%dirInfo, $subTable, $proc); + if (defined $newVal and $changed ne $$et{CHANGED} and + # nothing changed if deleting an empty directory + ($dirInfo{DirLen} or length $newVal)) + { + $newVal = $hdr . $newVal if length $hdr and length $newVal; + $edit[0][2] = \$newVal; # replace the old chunk with the new data + $edit[0][3] = $id; # mark this chunk with the item ID + push @mdatEdit, @edit; + # update item extent_length + my $n = length $newVal; + foreach $extent (@{$$item{Extents}}) { + my ($nlen, $lenPt) = @$extent[3,4]; + if ($nlen == 8) { + Set64u($n, $outfile, $$boxPos{iloc}[0] + 8 + $lenPt); + } elsif ($n <= 0xffffffff) { + Set32u($n, $outfile, $$boxPos{iloc}[0] + 8 + $lenPt); + } else { + $et->Error("Can't yet promote iloc length to 64 bits"); + return (); + } + $n = 0; + } + if (@{$$item{Extents}} != 1) { + $et->Error("Can't yet handle $name in multiple parts. Please submit sample for testing"); + } + } + $$et{CHANGED} = $changed; # (will set this later if successful in editing mdat) + } + $raf->Seek($curPos, 0); # seek back to original position + + # add necessary metadata types if they didn't already exist + my ($countNew, %add, %usedID); + foreach $name ('EXIF','XMP') { + next if $did{$name} or not $$et{ADD_DIRS}{$name}; + my @missing; + $$boxPos{$_} or push @missing, $_ foreach qw(iinf iloc); + if (@missing) { + my $str = @missing > 1 ? join(' and ', @missing) . ' boxes' : "@missing box"; + $et->Warn("Can't create $name. Missing expected $str"); + last; + } + unless (defined $$et{PrimaryItem}) { + unless (defined $primary) { + $et->Warn("Can't create $name. No items to reference"); + last; + } + # add new primary item reference box after hdrl box + if ($primary < 0x10000) { + $add{hdlr} = pack('Na4Nn', 14, 'pitm', 0, $primary); + } else { + $add{hdlr} = pack('Na4CCCCN', 16, 'pitm', 1, 0, 0, 0, $primary); + } + $et->Warn("Added missing PrimaryItemReference (for item $primary)", 1); + } + my $buff = ''; + my ($hdr, $subTable, $proc); + if ($name eq 'EXIF') { + $hdr = "\0\0\0\x06Exif\0\0"; + $subTable = GetTagTable('Image::ExifTool::Exif::Main'); + $proc = \&Image::ExifTool::WriteTIFF; + } else { + $hdr = ''; + $subTable = GetTagTable('Image::ExifTool::XMP::Main'); + } + my %dirInfo = ( + DataPt => \$buff, + DataLen => 0, + DirStart => 0, + DirLen => 0, + ); + my $changed = $$et{CHANGED}; + my $newVal = $et->WriteDirectory(\%dirInfo, $subTable, $proc); + if (defined $newVal and $changed ne $$et{CHANGED}) { + my $irefVer; + if ($$boxPos{iref}) { + $irefVer = Get8u($outfile, $$boxPos{iref}[0] + 8); + } else { + # create iref box after end of iinf box (and save version in boxPos list) + $irefVer = ($primary < 0x10000 ? 0 : 1); + $$boxPos{iref} = [ $$boxPos{iinf}[0] + $$boxPos{iinf}[1], 0, $irefVer ]; + } + $newVal = $hdr . $newVal if length $hdr; + # add new infe to iinf + $add{iinf} = $add{iref} = $add{iloc} = '' unless defined $add{iinf}; + my ($type, $mime); + if ($name eq 'XMP') { + $type = "mime\0"; + $mime = "application/rdf+xml\0"; + } else { + $type = "Exif\0"; + $mime = ''; + } + my $id = 1; + ++$id while $$items{$id} or $usedID{$id}; # find next unused item ID + my $n = length($type) + length($mime) + 16; + if ($id < 0x10000) { + $add{iinf} .= pack('Na4CCCCnn', $n, 'infe', 2, 0, 0, 1, $id, 0) . $type . $mime; + } else { + $n += 2; + $add{iinf} .= pack('Na4CCCCNn', $n, 'infe', 3, 0, 0, 1, $id, 0) . $type . $mime; + } + # add new cdsc to iref + if ($irefVer) { + $add{iref} .= pack('Na4NnN', 18, 'cdsc', $id, 1, $primary); + } else { + $add{iref} .= pack('Na4nnn', 14, 'cdsc', $id, 1, $primary); + } + # add new entry to iloc table (see ISO14496-12:2015 pg.79) + my $ilocVer = Get8u($outfile, $$boxPos{iloc}[0] + 8); + my $siz = Get16u($outfile, $$boxPos{iloc}[0] + 12); # get size information + my $noff = ($siz >> 12); + my $nlen = ($siz >> 8) & 0x0f; + my $nbas = ($siz >> 4) & 0x0f; + my $nind = $siz & 0x0f; + my ($pbas, $poff); + if ($ilocVer == 0) { + # set offset to 0 as flag that this is a new idat chunk being added + $pbas = length($add{iloc}) + 4; + $poff = $pbas + $nbas + 2; + $add{iloc} .= pack('nn',$id,0) . SetVarInt(0,$nbas) . Set16u(1) . + SetVarInt(0,$noff) . SetVarInt(length($newVal),$nlen); + } elsif ($ilocVer == 1) { + $pbas = length($add{iloc}) + 6; + $poff = $pbas + $nbas + 2 + $nind; + $add{iloc} .= pack('nnn',$id,0,0) . SetVarInt(0,$nbas) . Set16u(1) . SetVarInt(0,$nind) . + SetVarInt(0,$noff) . SetVarInt(length($newVal),$nlen); + } elsif ($ilocVer == 2) { + $pbas = length($add{iloc}) + 8; + $poff = $pbas + $nbas + 2 + $nind; + $add{iloc} .= pack('Nnn',$id,0,0) . SetVarInt(0,$nbas) . Set16u(1) . SetVarInt(0,$nind) . + SetVarInt(0,$noff) . SetVarInt(length($newVal),$nlen); + } else { + $et->Warn("Can't create $name. Unsupported iloc version $ilocVer"); + last; + } + # add new ChunkOffset entry to update this new offset + my $off = $$dirInfo{ChunkOffset} or $et->Warn('Internal error. Missing ChunkOffset'), last; + my $newOff; + if ($noff == 4) { + $newOff = [ 'stco_iloc', $$boxPos{iloc}[0] + $$boxPos{iloc}[1] + $poff, $noff, 0, $id ]; + } elsif ($noff == 8) { + $newOff = [ 'co64_iloc', $$boxPos{iloc}[0] + $$boxPos{iloc}[1] + $poff, $noff, 0, $id ]; + } elsif ($noff == 0) { + # offset_size is zero, so store the offset in base_offset instead + if ($nbas == 4) { + $newOff = [ 'stco_iloc', $$boxPos{iloc}[0] + $$boxPos{iloc}[1] + $pbas, $nbas, 0, $id ]; + } elsif ($nbas == 8) { + $newOff = [ 'co64_iloc', $$boxPos{iloc}[0] + $$boxPos{iloc}[1] + $pbas, $nbas, 0, $id ]; + } else { + $et->Warn("Can't create $name. Invalid iloc offset+base size"); + last; + } + } else { + $et->Warn("Can't create $name. Invalid iloc offset size"); + last; + } + # add directory as a new mdat chunk + push @$off, $newOff; + push @mdatEdit, [ 0, 0, \$newVal, $id ]; + $usedID{$id} = 1; + $countNew = ($countNew || 0) + 1; + $$et{CHANGED} = $changed; # set this later if successful in editing mdat + } + } + if ($countNew) { + # insert new entries into iinf, iref and iloc boxes, + # and add new pitm box after hdlr if necessary + my $added = 0; + my $tag; + foreach $tag (sort { $$boxPos{$a}[0] <=> $$boxPos{$b}[0] } keys %$boxPos) { + next unless $add{$tag}; + my $pos = $$boxPos{$tag}[0] + $added; + unless ($$boxPos{$tag}[1]) { + $tag eq 'iref' or $et->Error('Internal error adding iref box'), last; + # create new iref box + $add{$tag} = Set32u(12 + length $add{$tag}) . $tag . + Set8u($$boxPos{$tag}[2]) . "\0\0\0" . $add{$tag}; + } elsif ($tag ne 'hdlr') { + my $n = Get32u($outfile, $pos); + Set32u($n + length($add{$tag}), $outfile, $pos); # increase box size + } + if ($tag eq 'iinf') { + my $iinfVer = Get8u($outfile, $pos + 8); + if ($iinfVer == 0) { + my $n = Get16u($outfile, $pos + 12); + Set16u($n + $countNew, $outfile, $pos + 12); # incr count + } else { + my $n = Get32u($outfile, $pos + 12); + Set32u($n + $countNew, $outfile, $pos + 12); # incr count + } + } elsif ($tag eq 'iref') { + # nothing more to do + } elsif ($tag eq 'iloc') { + my $ilocVer = Get8u($outfile, $pos + 8); + if ($ilocVer < 2) { + my $n = Get16u($outfile, $pos + 14); + Set16u($n + $countNew, $outfile, $pos + 14); # incr count + } else { + my $n = Get32u($outfile, $pos + 14); + Set32u($n + $countNew, $outfile, $pos + 14); # incr count + } + # must also update pointer locations in this box + if ($added) { + $$_[1] += $added foreach @{$$dirInfo{ChunkOffset}}; + } + } elsif ($tag ne 'hdlr') { + next; + } + # add new entries to this box (or add pitm after hdlr) + substr($$outfile, $pos + $$boxPos{$tag}[1], 0) = $add{$tag}; + $added += length $add{$tag}; # positions are shifted by length of new entries + } + } + delete $$et{ItemInfo}; + return @mdatEdit ? \@mdatEdit : undef; +} + +#------------------------------------------------------------------------------ +# Write a series of QuickTime atoms from file or in memory +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: A) if dirInfo contains DataPt: new directory data +# B) otherwise: true on success, 0 if a write error occurred +# (true but sets an Error on a file format error) +# Notes: Yes, this is a real mess. Just like the QuickTime metadata situation. +sub WriteQuickTime($$$) +{ + local $_; + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to autoload this package + my ($mdat, @mdat, @mdatEdit, $edit, $track, $outBuff, $co, $term, $delCount); + my (%langTags, $canCreate, $delGrp, %boxPos, %didDir, $writeLast, $err, $atomCount); + my $outfile = $$dirInfo{OutFile} || return 0; + my $raf = $$dirInfo{RAF}; # (will be null for lower-level atoms) + my $dataPt = $$dirInfo{DataPt}; # (will be null for top-level atoms) + my $dirName = $$dirInfo{DirName}; + my $dirStart = $$dirInfo{DirStart} || 0; + my $parent = $$dirInfo{Parent}; + my $addDirs = $$et{ADD_DIRS}; + my $didTag = $$et{DidTag}; + my $newTags = { }; + my $createKeys = 0; + my ($rtnVal, $rtnErr) = $dataPt ? (undef, undef) : (1, 0); + + if ($dataPt) { + $raf = new File::RandomAccess($dataPt); + } else { + return 0 unless $raf; + } + # use buffered output for everything but 'mdat' atoms + $outBuff = ''; + $outfile = \$outBuff; + + $raf->Seek($dirStart, 1) if $dirStart; # skip header if it exists + + my $curPath = join '-', @{$$et{PATH}}; + my ($dir, $writePath) = ($dirName, $dirName); + $writePath = "$dir-$writePath" while defined($dir = $$et{DirMap}{$dir}); + # hack to create Keys directories if necessary (its containing Meta is in a different location) + if ($$addDirs{Keys} and $curPath =~ /^MOV-Movie(-Meta)?$/) { + $createKeys = 1; # create new Keys directories + } elsif ($curPath eq 'MOV-Movie-Meta-ItemList') { + $createKeys = 2; # create new Keys tags + my $keys = $$et{Keys}; + if ($keys) { + # add new tag entries for existing Keys tags, now that we know their ID's + # - first make lookup to convert Keys tagInfo ref to index number + my ($index, %keysInfo); + foreach $index (keys %{$$keys{Info}}) { + $keysInfo{$$keys{Info}{$index}} = $index if $$keys{Remap}{$index}; + } + my $keysTable = GetTagTable('Image::ExifTool::QuickTime::Keys'); + my $newKeysTags = $et->GetNewTagInfoHash($keysTable); + foreach (keys %$newKeysTags) { + my $tagInfo = $$newKeysTags{$_}; + $index = $keysInfo{$tagInfo} || ($$tagInfo{SrcTagInfo} and $keysInfo{$$tagInfo{SrcTagInfo}}); + next unless $index; + my $id = Set32u($index); + if ($$tagInfo{LangCode}) { + # add to lookup of language tags we are writing with this ID + $langTags{$id} = { } unless $langTags{$id}; + $langTags{$id}{$_} = $tagInfo; + $id .= '-' . $$tagInfo{LangCode}; + } + $$newTags{$id} = $tagInfo; + } + } + } else { + # get hash of new tags to edit/create in this directory + $newTags = $et->GetNewTagInfoHash($tagTablePtr); + # make lookup of language tags for each ID + foreach (keys %$newTags) { + next unless $$newTags{$_}{LangCode} and $$newTags{$_}{SrcTagInfo}; + my $id = $$newTags{$_}{SrcTagInfo}{TagID}; + $langTags{$id} = { } unless $langTags{$id}; + $langTags{$id}{$_} = $$newTags{$_}; + } + } + if ($curPath eq $writePath or $createKeys) { + $canCreate = 1; + $delGrp = $$et{DEL_GROUP}{$dirName}; + } + $atomCount = $$tagTablePtr{VARS}{ATOM_COUNT} if $$tagTablePtr{VARS}; + + for (;;) { # loop through all atoms at this level + if (defined $atomCount and --$atomCount < 0 and $dataPt) { + # stop processing now and just copy the rest of the atom + Write($outfile, substr($$dataPt, $raf->Tell())) or $rtnVal=$rtnErr, $err=1; + last; + } + my ($hdr, $buff, $keysIndex); + my $n = $raf->Read($hdr, 8); + unless ($n == 8) { + if ($n == 4 and $hdr eq "\0\0\0\0") { + # "for historical reasons" the udta is optionally terminated by 4 zeros (ref 1) + # --> hold this terminator to the end + $term = $hdr; + } elsif ($n != 0) { + $et->Error("Unknown $n bytes at end of file", 1); + } + last; + } + my $size = Get32u(\$hdr, 0) - 8; # (atom size without 8-byte header) + my $tag = substr($hdr, 4, 4); + if ($size == -7) { + # read the extended size + $raf->Read($buff, 8) == 8 or $et->Error('Truncated extended atom'), last; + $hdr .= $buff; + my ($hi, $lo) = unpack('NN', $buff); + if ($hi or $lo > 0x7fffffff) { + if ($hi > 0x7fffffff) { + $et->Error('Invalid atom size'); + last; + } elsif (not $et->Options('LargeFileSupport')) { + $et->Error('End of processing at large atom (LargeFileSupport not enabled)'); + last; + } + } + $size = $hi * 4294967296 + $lo - 16; + $size < 0 and $et->Error('Invalid extended atom size'), last; + } elsif ($size == -8) { + if ($dataPt) { + last if $$dirInfo{DirName} eq 'CanonCNTH'; # (this is normal for Canon CNTH atom) + my $pos = $raf->Tell() - 4; + $raf->Seek(0,2); + my $str = $$dirInfo{DirName} . ' with ' . ($raf->Tell() - $pos) . ' bytes'; + $et->Error("Terminator found in $str remaining", 1); + } else { + # size of zero is only valid for top-level atom, and + # indicates the atom extends to the end of file + # (save in mdat list to write later; with zero end position to copy rest of file) + push @mdat, [ $raf->Tell(), 0, $hdr ]; + } + last; + } elsif ($size < 0) { + $et->Error('Invalid atom size'); + last; + } + + # keep track of 'mdat' atom locations for writing later + if ($tag eq 'mdat') { + if ($dataPt) { + $et->Error("'mdat' not at top level"); + last; + } + push @mdat, [ $raf->Tell(), $raf->Tell() + $size, $hdr ]; + $raf->Seek($size, 1) or $et->Error("Seek error in mdat atom"), return $rtnVal; + next; + } elsif ($tag eq 'cmov') { + $et->Error("Can't yet write compressed movie metadata"); + return $rtnVal; + } elsif ($tag eq 'wide') { + next; # drop 'wide' tag + } + + # read the atom data + my $got; + if (not $size) { + $buff = ''; + $got = 0; + } else { + # read the atom data (but only first 64kB if data is huge) + $got = $raf->Read($buff, $size > $maxReadLen ? 0x10000 : $size); + } + if ($got != $size) { + # ignore up to 256 bytes of garbage at end of file + if ($got <= 256 and $size >= 1024 and $tag ne 'mdat') { + my $bytes = $got + length $hdr; + if ($$et{OPTIONS}{IgnoreMinorErrors}) { + $et->Warn("Deleted garbage at end of file ($bytes bytes)"); + $buff = $hdr = ''; + } else { + $et->Error("Possible garbage at end of file ($bytes bytes)", 1); + return $rtnVal; + } + } else { + $tag = PrintableTagID($tag,3); + if ($size > $maxReadLen and $got == 0x10000) { + my $mb = int($size / 0x100000 + 0.5); + $et->Error("'${tag}' atom is too large for rewriting ($mb MB)"); + } else { + $et->Error("Truncated '${tag}' atom"); + } + return $rtnVal; + } + } + # save the handler type for this track + if ($tag eq 'hdlr' and length $buff >= 12) { + my $hdlr = substr($buff,8,4); + $$et{HandlerType} = $hdlr if $hdlr =~ /^(vide|soun)$/; + } + + # if this atom stores offsets, save its location so we can fix up offsets later + # (are there any other atoms that may store absolute file offsets?) + if ($tag =~ /^(stco|co64|iloc|mfra|moof|sidx|saio|gps |CTBO|uuid)$/) { + # (note that we only need to do this if the media data is stored in this file) + my $flg = $$et{QtDataFlg}; + if ($tag eq 'mfra' or $tag eq 'moof') { + $et->Error("Can't yet handle movie fragments when writing"); + return $rtnVal; + } elsif ($tag eq 'sidx' or $tag eq 'saio') { + $et->Error("Can't yet handle $tag box when writing"); + return $rtnVal; + } elsif ($tag eq 'iloc') { + Handle_iloc($et, $dirInfo, \$buff, $outfile) or $et->Error('Error parsing iloc atom'); + } elsif ($tag eq 'gps ') { + # (only care about the 'gps ' box in 'moov') + if ($$dirInfo{DirID} and $$dirInfo{DirID} eq 'moov' and length $buff > 8) { + my $off = $$dirInfo{ChunkOffset}; + my $num = Get32u(\$buff, 4); + $num = int((length($buff) - 8) / 8) if $num * 8 + 8 > length($buff); + my $i; + for ($i=0; $i<$num; ++$i) { + push @$off, [ 'stco_gps ', length($$outfile) + length($hdr) + 8 + $i * 8, 4 ]; + } + } + } elsif ($tag eq 'CTBO' or $tag eq 'uuid') { # hack for updating CR3 CTBO offsets + push @{$$dirInfo{ChunkOffset}}, [ $tag, length($$outfile), length($hdr) + $size ]; + } elsif (not $flg) { + my $grp = $$et{CUR_WRITE_GROUP} || $parent; + $et->Error("Can't locate data reference to update offsets for $grp"); + return $rtnVal; + } elsif ($flg == 3) { + $et->Error("Can't write files with mixed internal/external media data"); + return $rtnVal; + } elsif ($flg == 1) { + # must update offsets since the data is in this file + push @{$$dirInfo{ChunkOffset}}, [ $tag, length($$outfile) + length($hdr), $size ]; + } + } + + # rewrite this atom + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag, \$buff); + + # call write hook if it exists + &{$$tagInfo{WriteHook}}($buff,$et) if $tagInfo and $$tagInfo{WriteHook}; + + # allow numerical tag ID's (ItemList entries defined by Keys) + if (not $tagInfo and $dirName eq 'ItemList' and $$et{Keys}) { + $keysIndex = unpack('N', $tag); + my $newIndex = $$et{Keys}{Remap}{$keysIndex}; + if (defined $newIndex) { + $tagInfo = $$et{Keys}{Info}{$keysIndex}; + unless ($newIndex) { + if ($tagInfo) { + $et->VPrint(1," - Keys:$$tagInfo{Name}"); + } else { + $delCount = ($delCount || 0) + 1; + } + ++$$et{CHANGED}; + next; + } + # use the new Keys index of this item if it changed + unless ($keysIndex == $newIndex) { + $tag = Set32u($newIndex); + substr($hdr, 4, 4) = $tag; + } + } else { + undef $keysIndex; + } + } + # delete all ItemList tags when deleting group, but take care not to delete UserData Meta + if ($delGrp) { + if ($dirName eq 'ItemList') { + $delCount = ($delCount || 0) + 1; + ++$$et{CHANGED}; + next; + } elsif ($dirName eq 'UserData' and (not $tagInfo or not $$tagInfo{SubDirectory})) { + $delCount = ($delCount || 0) + 1; + ++$$et{CHANGED}; + next; + } + } + undef $tagInfo if $tagInfo and $$tagInfo{Unknown}; + + if ($tagInfo and (not defined $$tagInfo{Writable} or $$tagInfo{Writable})) { + my $subdir = $$tagInfo{SubDirectory}; + my ($newData, @chunkOffset); + + if ($subdir) { # process atoms in this container from a buffer in memory + + undef $$et{HandlerType} if $tag eq 'trak'; # init handler type for this track + + my $subName = $$subdir{DirName} || $$tagInfo{Name}; + my $start = $$subdir{Start} || 0; + my $base = ($$dirInfo{Base} || 0) + $raf->Tell() - $size; + my $dPos = 0; + my $hdrLen = $start; + if ($$subdir{Base}) { + my $localBase = eval $$subdir{Base}; + $dPos -= $localBase; + $base -= $dPos; + # get length of header before base offset + $hdrLen -= $localBase if $localBase <= $hdrLen; + } + my %subdirInfo = ( + Parent => $dirName, + DirName => $subName, + Name => $$tagInfo{Name}, + DirID => $tag, + DataPt => \$buff, + DataLen => $size, + DataPos => $dPos, + DirStart => $start, + DirLen => $size - $start, + Base => $base, + HasData => $$subdir{HasData}, + Multi => $$subdir{Multi}, # necessary? + OutFile => $outfile, + NoRefTest=> 1, # don't check directory references + WriteGroup => $$tagInfo{WriteGroup}, + # initialize array to hold details about chunk offset table + # (each entry has 3-5 items: 0=atom type, 1=table offset, 2=table size, + # 3=optional base offset, 4=optional item ID) + ChunkOffset => \@chunkOffset, + ); + # set InPlace flag so XMP will be padded properly when + # QuickTimePad is used if this is an XMP directory + $subdirInfo{InPlace} = 2 if $et->Options('QuickTimePad'); + # pass the header pointer if necessary (for EXIF IFD's + # where the Base offset is at the end of the header) + if ($hdrLen and $hdrLen < $size) { + my $header = substr($buff,0,$hdrLen); + $subdirInfo{HeaderPtr} = \$header; + } + SetByteOrder('II') if $$subdir{ByteOrder} and $$subdir{ByteOrder} =~ /^Little/; + my $oldWriteGroup = $$et{CUR_WRITE_GROUP}; + if ($subName eq 'Track') { + $track or $track = 0; + $$et{CUR_WRITE_GROUP} = 'Track' . (++$track); + } + my $subTable = GetTagTable($$subdir{TagTable}); + # demote non-QuickTime errors to warnings + $$et{DemoteErrors} = 1 unless $$subTable{GROUPS}{0} eq 'QuickTime'; + my $oldChanged = $$et{CHANGED}; + $newData = $et->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc}); + if ($$et{DemoteErrors}) { + # just copy existing subdirectory if a non-quicktime error occurred + $$et{CHANGED} = $oldChanged if $$et{DemoteErrors} > 1; + delete $$et{DemoteErrors}; + } + if (defined $newData and not length $newData and ($$tagInfo{Permanent} or + ($$tagTablePtr{PERMANENT} and not defined $$tagInfo{Permanent}))) + { + # do nothing if trying to delete tag from a PERMANENT table + $$et{CHANGED} = $oldChanged; + undef $newData; + } + $$et{CUR_WRITE_GROUP} = $oldWriteGroup; + SetByteOrder('MM'); + # add back header if necessary + if ($start and defined $newData and (length $newData or + (defined $$tagInfo{Permanent} and not $$tagInfo{Permanent}))) + { + $newData = substr($buff,0,$start) . $newData; + $$_[1] += $start foreach @chunkOffset; + } + # the directory exists, so we don't need to add it + if ($curPath eq $writePath and $$addDirs{$subName} and $$addDirs{$subName} eq $dirName) { + delete $$addDirs{$subName}; + } + $didDir{$tag} = 1; # (note: keyed by tag ID) + + } else { # modify existing QuickTime tags in various formats + + my $nvHash = $et->GetNewValueHash($tagInfo); + if ($nvHash or $langTags{$tag} or $delGrp) { + my $nvHashNoLang = $nvHash; + my ($val, $len, $lang, $type, $flags, $ctry, $charsetQuickTime); + my $format = $$tagInfo{Format}; + my $hasData = ($$dirInfo{HasData} and $buff =~ /\0...data\0/s); + my $langInfo = $tagInfo; + if ($hasData) { + my $pos = 0; + for (;;$pos+=$len) { + if ($pos + 16 > $size) { + # add any new alternate language tags now + if ($langTags{$tag}) { + my $tg; + foreach $tg ('', sort keys %{$langTags{$tag}}) { + my $ti = $tg ? $langTags{$tag}{$tg} : $nvHashNoLang; + $nvHash = $et->GetNewValueHash($ti); + next unless $nvHash and not $$didTag{$nvHash}; + $$didTag{$nvHash} = 1; + next unless $$nvHash{IsCreating} and $et->IsOverwriting($nvHash); + my $newVal = $et->GetNewValue($nvHash); + next unless defined $newVal; + my $prVal = $newVal; + my $flags = FormatQTValue($et, \$newVal, $format, $$tagInfo{Writable}); + next unless defined $newVal; + my ($ctry, $lang) = (0, 0); + if ($$ti{LangCode}) { + unless ($$ti{LangCode} =~ /^([A-Z]{3})?[-_]?([A-Z]{2})?$/i) { + $et->Warn("Invalid language code for $$ti{Name}"); + next; + } + # pack language and country codes + if ($1 and $1 ne 'und') { + $lang = ($lang << 5) | ($_ - 0x60) foreach unpack 'C*', lc($1); + } + $ctry = unpack('n', pack('a2',uc($2))) if $2 and $2 ne 'ZZ'; + } + $newData = substr($buff, 0, $pos) unless defined $newData; + $newData .= pack('Na4Nnn',16+length($newVal),'data',$flags,$ctry,$lang).$newVal; + my $grp = $et->GetGroup($ti, 1); + $et->VerboseValue("+ $grp:$$ti{Name}", $prVal); + ++$$et{CHANGED}; + } + } + last; + } + ($len, $type, $flags, $ctry, $lang) = unpack("x${pos}Na4Nnn", $buff); + $lang or $lang = $undLang; # treat both 0 and 'und' as 'und' + $langInfo = $tagInfo; + my $delTag = $delGrp; + my $newVal; + my $langCode = GetLangCode($lang, $ctry, 1); + for (;;) { + $langInfo = GetLangInfo($tagInfo, $langCode); + $nvHash = $et->GetNewValueHash($langInfo); + last if $nvHash or not $ctry or $lang ne $undLang or length($langCode)==2; + # check to see if tag was written with a 2-char country code only + $langCode = lc unpack('a2',pack('n',$ctry)); + } + # set flag to delete language tag when writing default + # (except for a default-language Keys entry) + if (not $nvHash and $nvHashNoLang) { + if ($lang eq $undLang and not $ctry and not $$didTag{$nvHashNoLang}) { + $nvHash = $nvHashNoLang; # write existing default + } else { + $delTag = 1; # delete tag + } + } + last if $pos + $len > $size; + if ($type eq 'data' and $len >= 16) { + $pos += 16; + $len -= 16; + $val = substr($buff, $pos, $len); + # decode value (see QuickTime.pm for an explanation) + if ($stringEncoding{$flags}) { + $val = $et->Decode($val, $stringEncoding{$flags}); + $val =~ s/\0$// unless $$tagInfo{Binary}; + $flags = 0x01; # write all strings as UTF-8 + } else { + if ($format) { + # update flags for the format we are writing + if ($$tagInfo{Writable} and $qtFormat{$$tagInfo{Writable}}) { + $flags = $qtFormat{$$tagInfo{Writable}}; + } elsif ($qtFormat{$format}) { + $flags = $qtFormat{$format}; + } + } else { + $format = QuickTimeFormat($flags, $len); + } + $val = ReadValue(\$val, 0, $format, $$tagInfo{Count}, $len) if $format; + } + if (($nvHash and $et->IsOverwriting($nvHash, $val)) or $delTag) { + $newVal = $et->GetNewValue($nvHash) if defined $nvHash; + if ($delTag or not defined $newVal or $$didTag{$nvHash}) { + # delete the tag + my $grp = $et->GetGroup($langInfo, 1); + $et->VerboseValue("- $grp:$$langInfo{Name}", $val); + # copy data up to start of this tag to delete this value + $newData = substr($buff, 0, $pos-16) unless defined $newData; + ++$$et{CHANGED}; + next; + } + my $prVal = $newVal; + # format new value for writing (and get new flags) + $flags = FormatQTValue($et, \$newVal, $format, $$tagInfo{Writable}); + my $grp = $et->GetGroup($langInfo, 1); + $et->VerboseValue("- $grp:$$langInfo{Name}", $val); + $et->VerboseValue("+ $grp:$$langInfo{Name}", $prVal); + $newData = substr($buff, 0, $pos-16) unless defined $newData; + my $wLang = $lang eq $undLang ? 0 : $lang; + $newData .= pack('Na4Nnn', length($newVal)+16, $type, $flags, $ctry, $wLang); + $newData .= $newVal; + ++$$et{CHANGED}; + } elsif (defined $newData) { + $newData .= substr($buff, $pos-16, $len+16); + } + } elsif (defined $newData) { + $newData .= substr($buff, $pos, $len); + } + $$didTag{$nvHash} = 1 if $nvHash; + } + $newData .= substr($buff, $pos) if defined $newData and $pos < $size; + undef $val; # (already constructed $newData) + } elsif ($format) { + $val = ReadValue(\$buff, 0, $format, undef, $size); + } elsif (($tag =~ /^\xa9/ or $$tagInfo{IText}) and $size >= ($$tagInfo{IText} || 4)) { + my $hdr; + if ($$tagInfo{IText} and $$tagInfo{IText} >= 6) { + my $iText = $$tagInfo{IText}; + my $pos = $iText - 2; + $lang = unpack("x${pos}n", $buff); + $hdr = substr($buff,4,$iText-6); + $len = $size - $iText; + $val = substr($buff, $iText, $len); + } else { + ($len, $lang) = unpack('nn', $buff); + $len -= 4 if 4 + $len > $size; # (see QuickTime.pm for explanation) + $len = $size - 4 if $len > $size - 4 or $len < 0; + $val = substr($buff, 4, $len); + } + $lang or $lang = $undLang; # treat both 0 and 'und' as 'und' + my $enc; + if ($lang < 0x400 and $val !~ /^\xfe\xff/) { + $charsetQuickTime = $et->Options('CharsetQuickTime'); + $enc = $charsetQuickTime; + } else { + $enc = $val=~s/^\xfe\xff// ? 'UTF16' : 'UTF8'; + } + unless ($$tagInfo{NoDecode}) { + $val = $et->Decode($val, $enc); + $val =~ s/\0+$//; # remove trailing nulls if they exist + } + $val = $hdr . $val if defined $hdr; + my $langCode = UnpackLang($lang, 1); + $langInfo = GetLangInfo($tagInfo, $langCode); + $nvHash = $et->GetNewValueHash($langInfo); + if (not $nvHash and $nvHashNoLang) { + if ($lang eq $undLang and not $$didTag{$nvHashNoLang}) { + $nvHash = $nvHashNoLang; + } elsif ($canCreate) { + # delete other languages when writing default + my $grp = $et->GetGroup($langInfo, 1); + $et->VerboseValue("- $grp:$$langInfo{Name}", $val); + ++$$et{CHANGED}; + next; + } + } + } else { + $val = $buff; + if ($tag =~ /^\xa9/ or $$tagInfo{IText}) { + $et->Warn("Corrupted $$tagInfo{Name} value"); + } + } + if ($nvHash and defined $val) { + if ($et->IsOverwriting($nvHash, $val)) { + $newData = $et->GetNewValue($nvHash); + $newData = '' unless defined $newData or $canCreate; + ++$$et{CHANGED}; + my $grp = $et->GetGroup($langInfo, 1); + $et->VerboseValue("- $grp:$$langInfo{Name}", $val); + next unless defined $newData and not $$didTag{$nvHash}; + $et->VerboseValue("+ $grp:$$langInfo{Name}", $newData); + # add back necessary header and encode as necessary + if (defined $lang) { + my $iText = $$tagInfo{IText} || 0; + my $hdr; + if ($iText > 6) { + $newData .= ' 'x($iText-6) if length($newData) < $iText-6; + $hdr = substr($newData, 0, $iText-6); + $newData = substr($newData, $iText-6); + } + unless ($$tagInfo{NoDecode}) { + $newData = $et->Encode($newData, $lang < 0x400 ? $charsetQuickTime : 'UTF8'); + } + my $wLang = $lang eq $undLang ? 0 : $lang; + if ($iText < 6) { + $newData = pack('nn', length($newData), $wLang) . $newData; + } elsif ($iText == 6) { + $newData = pack('Nn', 0, $wLang) . $newData . "\0"; + } else { + $newData = "\0\0\0\0" . $hdr . pack('n', $wLang) . $newData . "\0"; + } + } elsif (not $format or $format =~ /^string/ and + not $$tagInfo{Binary} and not $$tagInfo{ValueConv}) + { + # write all strings as UTF-8 + $newData = $et->Encode($newData, 'UTF8'); + } elsif ($format and not $$tagInfo{Binary}) { + # format new value for writing + $newData = WriteValue($newData, $format); + } + } + $$didTag{$nvHash} = 1; # set flag so we don't add this tag again + } + } + } + # write the new atom if it was modified + if (defined $newData) { + my $sizeDiff = length($buff) - length($newData); + # pad to original size if specified, otherwise give verbose message about the changed size + if ($sizeDiff > 0 and $$tagInfo{PreservePadding} and $et->Options('QuickTimePad')) { + $newData .= "\0" x $sizeDiff; + $et->VPrint(1, " ($$tagInfo{Name} padded to original size)"); + } elsif ($sizeDiff) { + $et->VPrint(1, " ($$tagInfo{Name} changed size)"); + } + my $len = length($newData) + 8; + $len > 0x7fffffff and $et->Error("$$tagInfo{Name} to large to write"), last; + # update size in ChunkOffset list for modified 'uuid' atom + $$dirInfo{ChunkOffset}[-1][2] = $len if $tag eq 'uuid'; + next unless $len > 8; # don't write empty atom header + # maintain pointer to chunk offsets if necessary + if (@chunkOffset) { + $$_[1] += 8 + length $$outfile foreach @chunkOffset; + push @{$$dirInfo{ChunkOffset}}, @chunkOffset; + } + if ($$tagInfo{WriteLast}) { + $writeLast = ($writeLast || '') . Set32u($len) . $tag . $newData; + } else { + $boxPos{$tag} = [ length($$outfile), length($newData) + 8 ]; + # write the updated directory with its atom header + Write($outfile, Set32u($len), $tag, $newData) or $rtnVal=$rtnErr, $err=1, last; + } + next; + } + } + # keep track of data references in this track + if ($tag eq 'dinf') { + $$et{QtDataRef} = [ ]; # initialize list of data references + } elsif ($parent eq 'DataInfo' and length($buff) >= 4) { + # save data reference type and version/flags + push @{$$et{QtDataRef}}, [ $tag, Get32u(\$buff,0) ]; + } elsif ($tag eq 'stsd' and length($buff) >= 8) { + my $n = Get32u(\$buff, 4); # get number of sample descriptions in table + my ($pos, $flg) = (8, 0); + my ($i, $msg); + for ($i=0; $i<$n; ++$i) { # loop through sample descriptions + $pos + 16 <= length($buff) or $msg = 'Truncated sample table', last; + my $siz = Get32u(\$buff, $pos); + $pos + $siz <= length($buff) or $msg = 'Truncated sample table', last; + my $drefIdx = Get16u(\$buff, $pos + 14); + my $drefTbl = $$et{QtDataRef}; + if (not $drefIdx) { + $flg |= 0x01; # in this file if data reference index is 0 (if like iloc) + } elsif ($drefTbl and $$drefTbl[$drefIdx-1]) { + my $dref = $$drefTbl[$drefIdx-1]; + # $flg = 0x01-in this file, 0x02-in some other file + $flg |= ($$dref[1] == 1 and $$dref[0] ne 'rsrc') ? 0x01 : 0x02; + } else { + $msg = "No data reference for sample description $i"; + last; + } + $pos += $siz; + } + if ($msg) { + # (allow empty sample description for non-audio/video handler types, eg. 'url ', 'meta') + if ($$et{HandlerType}) { + my $grp = $$et{CUR_WRITE_GROUP} || $parent; + $et->Error("$msg for $grp"); + return $rtnErr; + } + $flg = 1; # (this seems to be the case) + } + $$et{QtDataFlg} = $flg; + } + if ($tagInfo and $$tagInfo{WriteLast}) { + $writeLast = ($writeLast || '') . $hdr . $buff; + } else { + # save position of this box in the output buffer + $boxPos{$tag} = [ length($$outfile), length($hdr) + length($buff) ]; + # copy the existing atom + Write($outfile, $hdr, $buff) or $rtnVal=$rtnErr, $err=1, last; + } + } + $et->VPrint(0, " [deleting $delCount $dirName tag".($delCount==1 ? '' : 's')."]\n") if $delCount; + + $createKeys &= ~0x01 unless $$addDirs{Keys}; # (Keys may have been written) + + # add new directories/tags at this level if necessary + if ($canCreate and (exists $$et{EDIT_DIRS}{$dirName} or $createKeys)) { + # get a hash of tagInfo references to add to this directory + my $dirs = $et->GetAddDirHash($tagTablePtr, $dirName); + # make sorted list of new tags to be added + my @addTags = sort(keys(%$dirs), keys %$newTags); + my ($tag, $index); + # add Keys tags if necessary + if ($createKeys) { + if ($curPath eq 'MOV-Movie') { + # add Meta for Keys if necessary + unless ($didDir{meta}) { + $$dirs{meta} = $Image::ExifTool::QuickTime::Movie{meta}; + push @addTags, 'meta'; + } + } elsif ($curPath eq 'MOV-Movie-Meta') { + # special case for Keys Meta -- reset directories and start again + undef @addTags; + $dirs = { }; + foreach ('keys','ilst') { + next if $didDir{$_}; # don't add again + $$dirs{$_} = $Image::ExifTool::QuickTime::Meta{$_}; + push @addTags, $_; + } + } elsif ($curPath eq 'MOV-Movie-Meta-ItemList' and $$et{Keys}) { + foreach $index (sort { $a <=> $b } keys %{$$et{Keys}{Add}}) { + my $id = Set32u($index); + $$newTags{$id} = $$et{Keys}{Add}{$index}; + push @addTags, $id; + } + } else { + $dirs = $et->GetAddDirHash($tagTablePtr, $dirName); + push @addTags, sort keys %$dirs; + } + } + # (note that $tag may be a binary Keys index here) + foreach $tag (@addTags) { + my $tagInfo = $$dirs{$tag} || $$newTags{$tag}; + next if defined $$tagInfo{CanCreate} and not $$tagInfo{CanCreate}; + next if defined $$tagInfo{HandlerType} and + (not $$et{HandlerType} or $$et{HandlerType} ne $$tagInfo{HandlerType}); + my $subdir = $$tagInfo{SubDirectory}; + unless ($subdir) { + my $nvHash = $et->GetNewValueHash($tagInfo); + next unless $nvHash and not $$didTag{$nvHash}; + next unless $$nvHash{IsCreating} and $et->IsOverwriting($nvHash); + my $newVal = $et->GetNewValue($nvHash); + next unless defined $newVal; + my $prVal = $newVal; + my $flags = FormatQTValue($et, \$newVal, $$tagInfo{Format}, $$tagInfo{Writable}); + next unless defined $newVal; + my ($ctry, $lang) = (0, 0); + # handle alternate languages + if ($$tagInfo{LangCode}) { + $tag = substr($tag, 0, 4); # strip language code from tag ID + unless ($$tagInfo{LangCode} =~ /^([A-Z]{3})?[-_]?([A-Z]{2})?$/i) { + $et->Warn("Invalid language code for $$tagInfo{Name}"); + next; + } + # pack language and country codes + if ($1 and $1 ne 'und') { + $lang = ($lang << 5) | ($_ - 0x60) foreach unpack 'C*', lc($1); + } + $ctry = unpack('n', pack('a2',uc($2))) if $2 and $2 ne 'ZZ'; + } + if ($$dirInfo{HasData}) { + # add 'data' header + $newVal = pack('Na4Nnn',16+length($newVal),'data',$flags,$ctry,$lang).$newVal; + } elsif ($tag =~ /^\xa9/ or $$tagInfo{IText}) { + if ($ctry) { + my $grp = $et->GetGroup($tagInfo,1); + $et->Warn("Can't use country code for $grp:$$tagInfo{Name}"); + next; + } elsif ($$tagInfo{IText} and $$tagInfo{IText} >= 6) { + # add 6-byte langText header and trailing null + # (with extra junk before language code if IText > 6) + my $n = $$tagInfo{IText} - 6; + $newVal .= ' ' x $n if length($newVal) < $n; + $newVal = "\0\0\0\0" . substr($newVal,0,$n) . pack('n',0,$lang) . substr($newVal,$n) . "\0"; + } else { + # add IText header + $newVal = pack('nn',length($newVal),$lang) . $newVal; + } + } elsif ($ctry or $lang) { + my $grp = $et->GetGroup($tagInfo,1); + $et->Warn("Can't use language code for $grp:$$tagInfo{Name}"); + next; + } + if ($$tagInfo{WriteLast}) { + $writeLast = ($writeLast || '') . Set32u(8+length($newVal)) . $tag . $newVal; + } else { + $boxPos{$tag} = [ length($$outfile), 8 + length($newVal) ]; + Write($outfile, Set32u(8+length($newVal)), $tag, $newVal) or $rtnVal=$rtnErr, $err=1; + } + my $grp = $et->GetGroup($tagInfo, 1); + $et->VerboseValue("+ $grp:$$tagInfo{Name}", $prVal); + $$didTag{$nvHash} = 1; + ++$$et{CHANGED}; + next; + } + my $subName = $$subdir{DirName} || $$tagInfo{Name}; + # QuickTime hierarchy is complex, so check full directory path before adding + my $buff; + if ($createKeys and $curPath eq 'MOV-Movie' and $subName eq 'Meta') { + $et->VPrint(0, " Creating Meta with mdta Handler and Keys\n"); + # init Meta box for Keys tags with mdta Handler and empty Keys+ItemList + $buff = "\0\0\0\x20hdlr\0\0\0\0\0\0\0\0mdta\0\0\0\0\0\0\0\0\0\0\0\0" . + "\0\0\0\x10keys\0\0\0\0\0\0\0\0" . + "\0\0\0\x08ilst"; + } elsif ($createKeys and $curPath eq 'MOV-Movie-Meta') { + $buff = ($subName eq 'Keys' ? "\0\0\0\0\0\0\0\0" : ''); + } elsif ($subName eq 'Meta' and $$et{OPTIONS}{QuickTimeHandler}) { + $et->VPrint(0, " Creating Meta with mdir Handler\n"); + # init Meta box for ItemList tags with mdir Handler + $buff = "\0\0\0\x20hdlr\0\0\0\0\0\0\0\0mdir\0\0\0\0\0\0\0\0\0\0\0\0"; + } else { + next unless $curPath eq $writePath and $$addDirs{$subName} and $$addDirs{$subName} eq $dirName; + $buff = ''; # write from scratch + } + my %subdirInfo = ( + Parent => $dirName, + DirName => $subName, + DataPt => \$buff, + DirStart => 0, + HasData => $$subdir{HasData}, + OutFile => $outfile, + ChunkOffset => [ ], # (just to be safe) + WriteGroup => $$tagInfo{WriteGroup}, + ); + my $subTable = GetTagTable($$subdir{TagTable}); + my $newData = $et->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc}); + if ($newData and length($newData) <= 0x7ffffff7) { + my $prefix = ''; + # add atom version or ID if necessary + if ($$subdir{Start}) { + if ($$subdir{Start} == 4) { + $prefix = "\0\0\0\0"; # a simple version number + } else { + # get UUID from Condition expression + my $cond = $$tagInfo{Condition}; + $prefix = eval qq("$1") if $cond and $cond =~ m{=~\s*\/\^(.*)/}; + length($prefix) == $$subdir{Start} or $et->Error('Internal UUID error'); + } + } + my $newHdr = Set32u(8+length($newData)+length($prefix)) . $tag . $prefix; + if ($$tagInfo{WriteLast}) { + $writeLast = ($writeLast || '') . $newHdr . $newData; + } else { + if ($tag eq 'uuid') { + # add offset for new uuid (needed for CR3 CTBO offsets) + my $off = $$dirInfo{ChunkOffset}; + push @$off, [ $tag, length($$outfile), length($newHdr) + length($newData) ]; + } + $boxPos{$tag} = [ length($$outfile), length($newHdr) + length($newData) ]; + Write($outfile, $newHdr, $newData) or $rtnVal=$rtnErr, $err=1; + } + } + # add only once (must delete _after_ call to WriteDirectory()) + # (Keys is a special case, and will be removed after Meta is processed) + delete $$addDirs{$subName} unless $subName eq 'Keys'; + } + } + # write HEIC metadata after top-level 'meta' box has been processed if editing this information + if ($curPath eq 'MOV-Meta' and $$et{EDIT_DIRS}{ItemInformation}) { + $$dirInfo{BoxPos} = \%boxPos; + my $mdatEdit = WriteItemInfo($et, $dirInfo, $outfile); + if ($mdatEdit) { + $et->Error('Multiple top-level Meta containers') if $$et{mdatEdit}; + $$et{mdatEdit} = $mdatEdit; + } + } + # write out any necessary terminator + Write($outfile, $term) or $rtnVal=$rtnErr, $err=1 if $term and length $$outfile; + + # delete temporary Keys variables after Meta is processed + if ($dirName eq 'Meta') { + # delete any Meta box with no useful information (ie. only 'hdlr','keys','lang','ctry') + my $isEmpty = 1; + $emptyMeta{$_} or $isEmpty = 0, last foreach keys %boxPos; + if ($isEmpty) { + $et->VPrint(0,' Deleting ' . join('+', sort map { $emptyMeta{$_} } keys %boxPos)) if %boxPos; + $$outfile = ''; + ++$$et{CHANGED}; + } + if ($curPath eq 'MOV-Movie-Meta') { + delete $$addDirs{Keys}; # prevent creation of another Meta for Keys tags + delete $$et{Keys}; + } + } + + # return now if writing subdirectory + if ($dataPt) { + $et->Error("Internal error: WriteLast not on top-level atom!\n") if $writeLast; + return $err ? undef : $$outfile; + } + + # issue minor error if we didn't find an 'mdat' atom + my $off = $$dirInfo{ChunkOffset}; + if (not @mdat) { + foreach $co (@$off) { + next if $$co[0] eq 'uuid'; + $et->Error('Media data referenced but not found'); + return $rtnVal; + } + $et->Warn('No media data', 1); + } + + # edit mdat blocks as required + # (0=old pos [0 if creating], 1=old end [0 if creating], 2=new data ref or undef to delete, + # 3=new data item id) + if ($$et{mdatEdit}) { + @mdatEdit = @{$$et{mdatEdit}}; + delete $$et{mdatEdit}; + } + foreach $edit (@mdatEdit) { + my (@thisMdat, @newMdat, $changed); + foreach $mdat (@mdat) { + # keep track of all chunks for the mdat with this header + if (length $$mdat[2]) { + push @newMdat, @thisMdat; + undef @thisMdat; + } + push @thisMdat, $mdat; + # is this edit inside this mdat chunk? + # - $$edit[0] and $$edit[1] will both be zero if we are creating a new chunk + # - $$mdat[1] is zero if mdat runs to end of file + # - $$edit[0] == $$edit[1] == $$mdat[0] if reviving a deleted chunk + # - $$mdat[5] is defined if this was a newly added/edited chunk + next if defined $$mdat[5] or $changed; # don't replace a newly added chunk + if (not $$edit[0] or # (newly created chunk) + # (edit is inside chunk) + ((($$edit[0] < $$mdat[1] or not $$mdat[1]) and $$edit[1] > $$mdat[0]) or + # (edit inserted at start or end of chunk) + ($$edit[0] == $$edit[1] and ($$edit[0] == $$mdat[0] or $$edit[0] == $$mdat[1])))) + { + if (not $$edit[0]) { + $$edit[0] = $$edit[1] = $$mdat[0]; # insert at start of this mdat + } elsif ($$edit[0] < $$mdat[0] or ($$edit[1] > $$mdat[1] and $$mdat[1])) { + $et->Error('ItemInfo runs across mdat boundary'); + return $rtnVal; + } + my $hdrChunk = $thisMdat[0]; + $hdrChunk or $et->Error('Internal error finding mdat header'), return $rtnVal; + # calculate difference in mdat size + my $diff = ($$edit[2] ? length(${$$edit[2]}) : 0) - ($$edit[1] - $$edit[0]); + # edit size of mdat in header if necessary + if ($diff) { + if (length($$hdrChunk[2]) == 8) { + my $size = Get32u(\$$hdrChunk[2], 0) + $diff; + $size > 0xffffffff and $et->Error("Can't yet grow mdat across 4GB boundary"), return $rtnVal; + Set32u($size, \$$hdrChunk[2], 0); + } elsif (length($$hdrChunk[2]) == 16) { + my $size = Get64u(\$$hdrChunk[2], 8) + $diff; + Set64u($size, \$$hdrChunk[2], 8); + } else { + $et->Error('Internal error. Invalid mdat header'); + return $rtnVal; + } + } + $changed = 1; + # remove the edited section of this chunk (if any) and replace with new data (if any) + if ($$edit[0] > $$mdat[0]) { + push @thisMdat, [ $$edit[0], $$edit[1], '', 0, $$edit[2], $$edit[3] ] if $$edit[2]; + # add remaining data after edit (or empty stub in case it is referenced by an offset) + push @thisMdat, [ $$edit[1], $$mdat[1], '' ]; + $$mdat[1] = $$edit[0]; # now ends at start of edit + } else { + if ($$edit[2]) { + # insert the new chunk before this chunk, moving the header to the new chunk + splice @thisMdat, -1, 0, [ $$edit[0],$$edit[1],$$mdat[2],0,$$edit[2],$$edit[3] ]; + $$mdat[2] = ''; # (header was moved to new chunk) + # initialize ChunkOffset pointer if necessary + if ($$edit[3]) { + my $n = 0; + foreach $co (@$off) { + next unless defined $$co[4] and $$co[4] == $$edit[3]; + ++$n; + if ($$co[0] eq 'stco_iloc') { + Set32u($$mdat[0], $outfile, $$co[1]); + } else { + Set64u($$mdat[0], $outfile, $$co[1]); + } + } + $n == 1 or $et->Error('Internal error updating chunk offsets'); + } + } + $$mdat[0] = $$edit[1]; # remove old data + } + } + } + if ($changed) { + @mdat = ( @newMdat, @thisMdat ); + ++$$et{CHANGED}; + } else { + $et->Error('Internal error modifying mdat'); + } + } + + # determine our new mdat positions + # (0=old pos, 1=old end, 2=mdat header, 3=new pos, 4=new data ref if changed, 5=new item ID) + my $pos = length $$outfile; + foreach $mdat (@mdat) { + $pos += length $$mdat[2]; + $$mdat[3] = $pos; + $pos += $$mdat[4] ? length(${$$mdat[4]}) : $$mdat[1] - $$mdat[0]; + } + + # fix up offsets for new mdat position(s) (and uuid positions in CR3 images) + foreach $co (@$off) { + my ($type, $ptr, $len, $base, $id) = @$co; + $base = 0 unless $base; + unless ($type =~ /^(stco|co64)_?(.*)$/) { + next if $type eq 'uuid'; + $type eq 'CTBO' or $et->Error('Internal error fixing offsets'), last; + # update 'CTBO' item offsets/sizes in Canon CR3 images + $$co[2] > 12 or $et->Error('Invalid CTBO atom'), last; + @mdat or $et->Error('Missing CR3 image data'), last; + my $n = Get32u($outfile, $$co[1] + 8); + $$co[2] < $n * 20 + 12 and $et->Error('Truncated CTBO atom'), last; + my (%ctboOff, $i); + # determine uuid types, and build an offset lookup based on CTBO ID number + foreach (@$off) { + next unless $$_[0] eq 'uuid' and $$_[2] >= 24; # (ignore undersized and deleted uuid boxes) + my $pos = $$_[1]; + next if $pos + 24 > length $$outfile; # (will happen for WriteLast uuid tags) + my $siz = Get32u($outfile, $pos); # get size of uuid atom + if ($siz == 1) { # check for extended (8-byte) size + next unless $$_[2] >= 32; + $pos += 8; + } + # get CTBO entry ID based on 16-byte UUID identifier + my $id = $ctboID{substr($$outfile, $pos+8, 16)}; + $ctboOff{$id} = $_ if defined $id; + } + # calculate new offset for the first mdat (size of -1 indicates it didn't change) + $ctboOff{3} = [ 'mdat', $mdat[0][3] - length $mdat[0][2], -1 ]; + for ($i=0; $i<$n; ++$i) { + my $pos = $$co[1] + 12 + $i * 20; + my $id = Get32u($outfile, $pos); + # ignore if size is zero unless we can add this entry + # (note: can't yet add/delete PreviewImage, but leave this possibility open) + next unless Get64u($outfile, $pos + 12) or $id == 1 or $id == 2; + if (not defined $ctboOff{$id}) { + $id==1 or $id==2 or $et->Error("Can't handle CR3 CTBO ID number $id"), last; + # XMP or PreviewImage was deleted -- set offset and size to zero + $ctboOff{$id} = [ 'uuid', 0, 0 ]; + } + # update the new offset and size of this entry + Set64u($ctboOff{$id}[1], $outfile, $pos + 4); + Set64u($ctboOff{$id}[2], $outfile, $pos + 12) unless $ctboOff{$id}[2] < 0; + } + next; + } + my $siz = $1 eq 'co64' ? 8 : 4; + my ($n, $tag); + if ($2) { # is this an offset in an iloc or 'gps ' atom? + $n = 1; + $type = $1; + $tag = $2; + } else { # this is an stco or co84 atom + next if $len < 8; + $n = Get32u($outfile, $ptr + 4); # get number of entries in table + $ptr += 8; + $len -= 8; + $tag = $1; + } + my $end = $ptr + $n * $siz; + $end > $ptr + $len and $et->Error("Invalid $tag table"), return $rtnVal; + for (; $ptr<$end; $ptr+=$siz) { + my ($ok, $i); + my $val = $type eq 'co64' ? Get64u($outfile, $ptr) : Get32u($outfile, $ptr); + for ($i=0; $i<@mdat; ++$i) { + $mdat = $mdat[$i]; + my $pos = $val + $base; + if (defined $$mdat[5]) { # is this chunk associated with an item we edited? + # set offset only for the corresponding new chunk + unless (defined $id and $id == $$mdat[5]) { + # could have pointed to empty chunk before inserted chunk + next unless $pos == $$mdat[0] and $$mdat[0] != $$mdat[1]; + } + } else { + # (have seen $pos == $$mdat[1], which is a real PITA) + next unless $pos >= $$mdat[0] and ($pos <= $$mdat[1] or not $$mdat[1]); + # step to next chunk if contiguous and at the end of this one + next if $pos == $$mdat[1] and $i+1 < @mdat and $pos == $mdat[$i+1][0]; + } + $val += $$mdat[3] - $$mdat[0]; + if ($val < 0) { + $et->Error("Error fixing up $tag offset"); + return $rtnVal; + } + if ($type eq 'co64') { + Set64u($val, $outfile, $ptr); + } elsif ($val <= 0xffffffff) { + Set32u($val, $outfile, $ptr); + } else { + $et->Error("Can't yet promote $tag offset to 64 bits"); + return $rtnVal; + } + $ok = 1; + last; + } + unless ($ok) { + $et->Error("Chunk offset in $tag atom is outside media data"); + return $rtnVal; + } + } + } + + # switch back to actual output file + $outfile = $$dirInfo{OutFile}; + + # write the metadata + Write($outfile, $outBuff) or $rtnVal = 0; + + # write the media data + foreach $mdat (@mdat) { + Write($outfile, $$mdat[2]) or $rtnVal = 0; # write mdat header + if ($$mdat[4]) { + Write($outfile, ${$$mdat[4]}) or $rtnVal = 0; + } else { + $raf->Seek($$mdat[0], 0) or $et->Error('Seek error'), last; + if ($$mdat[1]) { + my $result = Image::ExifTool::CopyBlock($raf, $outfile, $$mdat[1] - $$mdat[0]); + defined $result or $rtnVal = 0, last; + $result or $et->Error("Truncated mdat atom"), last; + } else { + # mdat continues to end of file + my $buff; + while ($raf->Read($buff, 65536)) { + Write($outfile, $buff) or $rtnVal = 0, last; + } + } + } + } + + # write the stuff that must come last + Write($outfile, $writeLast) or $rtnVal = 0 if $writeLast; + + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Write QuickTime-format MOV/MP4 file +# Inputs: 0) ExifTool ref, 1) dirInfo ref +# Returns: 1 on success, 0 if this wasn't a valid QuickTime file, +# or -1 if a write error occurred +sub WriteMOV($$) +{ + my ($et, $dirInfo) = @_; + $et or return 1; # allow dummy access to autoload this package + my $raf = $$dirInfo{RAF} or return 0; + my ($buff, $ftype); + + # read the first atom header + return 0 unless $raf->Read($buff, 8) == 8; + my ($size, $tag) = unpack('Na4', $buff); + return 0 if $size < 8 and $size != 1; + + # validate the file format + my $tagTablePtr = GetTagTable('Image::ExifTool::QuickTime::Main'); + return 0 unless $$tagTablePtr{$tag}; + + # determine the file type (by default, assume MP4 if 'ftyp' exists + # without 'qt ' as a compatible brand, but HEIC is an exception) + if ($tag eq 'ftyp' and $size >= 12 and $size < 100000 and + $raf->Read($buff, $size-8) == $size-8 and + $buff !~ /^(....)+(qt )/s) + { + if ($buff =~ /^crx /) { + $ftype = 'CR3', + } elsif ($buff =~ /^(heic|mif1|msf1|heix|hevc|hevx|avif)/) { + $ftype = 'HEIC'; + } else { + $ftype = 'MP4'; + } + } else { + $ftype = 'MOV'; + } + $et->SetFileType($ftype); # need to set "FileType" tag for a Condition + $et->InitWriteDirs($dirMap{$ftype}, 'XMP', 'QuickTime'); + $$et{DirMap} = $dirMap{$ftype}; # need access to directory map when writing + # track tags globally to avoid creating multiple tags in the case of duplicate directories + $$et{DidTag} = { }; + SetByteOrder('MM'); + $raf->Seek(0,0); + + # write the file + $$dirInfo{Parent} = ''; + $$dirInfo{DirName} = 'MOV'; + $$dirInfo{ChunkOffset} = [ ]; # (just to be safe) + return WriteQuickTime($et, $dirInfo, $tagTablePtr) ? 1 : -1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::WriteQuickTime.pl - Write XMP to QuickTime (MOV and MP4) files + +=head1 SYNOPSIS + +These routines are autoloaded by Image::ExifTool::QuickTime. + +=head1 DESCRIPTION + +This file contains routines used by ExifTool to write XMP metadata to +QuickTime-based file formats like MOV and MP4. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::QuickTime(3pm)|Image::ExifTool::QuickTime>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/WriteXMP.pl b/lib/Image/ExifTool/WriteXMP.pl new file mode 100644 index 0000000..9ff5adc --- /dev/null +++ b/lib/Image/ExifTool/WriteXMP.pl @@ -0,0 +1,1634 @@ +#------------------------------------------------------------------------------ +# File: WriteXMP.pl +# +# Description: Write XMP meta information +# +# Revisions: 12/19/2004 - P. Harvey Created +#------------------------------------------------------------------------------ +package Image::ExifTool::XMP; + +use strict; +use vars qw(%specialStruct %dateTimeInfo %stdXlatNS); + +use Image::ExifTool qw(:DataAccess :Utils); + +sub CheckXMP($$$;$); +sub CaptureXMP($$$;$); +sub SetPropertyPath($$;$$$$); + +my $debug = 0; +my $numPadLines = 24; # number of blank padding lines + +# when writing extended XMP, resources bigger than this get placed in their own +# rdf:Description so they can be moved to the extended segments if necessary +my $newDescThresh = 10240; # 10 kB + +# individual resources and namespaces to place last in separate rdf:Description's +# so they can be moved to extended XMP segments if required (see Oct. 2008 XMP spec) +my %extendedRes = ( + 'photoshop:History' => 1, + 'xap:Thumbnails' => 1, + 'xmp:Thumbnails' => 1, + 'crs' => 1, + 'crss' => 1, +); + +my $rdfDesc = 'rdf:Description'; +# +# packet/xmp/rdf headers and trailers +# +my $pktOpen = "<?xpacket begin='\xef\xbb\xbf' id='W5M0MpCehiHzreSzNTczkc9d'?>\n"; +my $xmlOpen = "<?xml version='1.0' encoding='UTF-8'?>\n"; +my $xmpOpenPrefix = "<x:xmpmeta xmlns:x='$nsURI{x}'"; +my $rdfOpen = "<rdf:RDF xmlns:rdf='$nsURI{rdf}'>\n"; +my $rdfClose = "</rdf:RDF>\n"; +my $xmpClose = "</x:xmpmeta>\n"; +my $pktCloseW = "<?xpacket end='w'?>"; # writable by default +my $pktCloseR = "<?xpacket end='r'?>"; +my ($sp, $nl); + +#------------------------------------------------------------------------------ +# Get XMP opening tag (and set x:xmptk appropriately) +# Inputs: 0) ExifTool object ref +# Returns: x:xmpmeta opening tag +sub XMPOpen($) +{ + my $et = shift; + my $nv = $$et{NEW_VALUE}{$Image::ExifTool::XMP::x{xmptk}}; + my $tk; + if (defined $nv) { + $tk = $et->GetNewValue($nv); + $et->VerboseValue(($tk ? '+' : '-') . ' XMP-x:XMPToolkit', $tk); + ++$$et{CHANGED}; + } else { + $tk = "Image::ExifTool $Image::ExifTool::VERSION"; + } + my $str = $tk ? (" x:xmptk='" . EscapeXML($tk) . "'") : ''; + return "$xmpOpenPrefix$str>\n"; +} + +#------------------------------------------------------------------------------ +# Validate XMP packet and set read or read/write mode +# Inputs: 0) XMP data reference, 1) 'r' = read only, 'w' or undef = read/write +# Returns: true if XMP is good (and adds packet header/trailer if necessary) +sub ValidateXMP($;$) +{ + my ($xmpPt, $mode) = @_; + $$xmpPt =~ s/^\s*<!--.*?-->\s*//s; # remove leading comment if it exists + unless ($$xmpPt =~ /^\0*<\0*\?\0*x\0*p\0*a\0*c\0*k\0*e\0*t/) { + return '' unless $$xmpPt =~ /^<x(mp)?:x[ma]pmeta/; + # add required xpacket header/trailer + $$xmpPt = $pktOpen . $$xmpPt . $pktCloseW; + } + $mode = 'w' unless $mode; + my $end = substr($$xmpPt, -32, 32); + # check for proper xpacket trailer and set r/w mode if necessary + return '' unless $end =~ s/(e\0*n\0*d\0*=\0*['"]\0*)([rw])(\0*['"]\0*\?\0*>)/$1$mode$3/; + substr($$xmpPt, -32, 32) = $end if $2 ne $mode; + return 1; +} + +#------------------------------------------------------------------------------ +# Validate XMP property +# Inputs: 0) ExifTool ref, 1) validate hash ref, 2) attribute hash ref +# - issues warnings if problems detected +sub ValidateProperty($$;$) +{ + my ($et, $propList, $attr) = @_; + + if ($$et{XmpValidate} and @$propList > 2) { + if ($$propList[0] =~ /^x:x[ma]pmeta$/ and + $$propList[1] eq 'rdf:RDF' and + $$propList[2] =~ /rdf:Description( |$)/) + { + if (@$propList > 3) { + if ($$propList[-1] =~ /^rdf:(Bag|Seq|Alt)$/) { + $et->Warn("Ignored empty $$propList[-1] list for $$propList[-2]", 1); + } else { + if ($$propList[-2] eq 'rdf:Alt' and $attr) { + my $lang = $$attr{'xml:lang'}; + if ($lang and @$propList >= 5) { + my $langPath = join('/', @$propList[3..($#$propList-2)]); + my $valLang = $$et{XmpValidateLangAlt} || ($$et{XmpValidateLangAlt} = { }); + $$valLang{$langPath} or $$valLang{$langPath} = { }; + if ($$valLang{$langPath}{$lang}) { + $et->WarnOnce("Duplicate language ($lang) in lang-alt list: $langPath"); + } else { + $$valLang{$langPath}{$lang} = 1; + } + } + } + my $xmpValidate = $$et{XmpValidate}; + my $path = join('/', @$propList[3..$#$propList]); + if (defined $$xmpValidate{$path}) { + $et->Warn("Duplicate XMP property: $path"); + } else { + $$xmpValidate{$path} = 1; + } + } + } + } elsif ($$propList[0] ne 'rdf:RDF' or + $$propList[1] !~ /rdf:Description( |$)/) + { + $et->Warn('Improperly enclosed XMP property: ' . join('/',@$propList)); + } + } +} + +#------------------------------------------------------------------------------ +# Check XMP date values for validity and format accordingly +# Inputs: 1) EXIF-format date string +# Returns: XMP date/time string (or undef on error) +sub FormatXMPDate($) +{ + my $val = shift; + my ($y, $m, $d, $t, $tz); + if ($val =~ /(\d{4}):(\d{2}):(\d{2}) (\d{2}:\d{2}(?::\d{2}(?:\.\d*)?)?)(.*)/) { + ($y, $m, $d, $t, $tz) = ($1, $2, $3, $4, $5); + $val = "$y-$m-${d}T$t"; + } elsif ($val =~ /^\s*\d{4}(:\d{2}){0,2}\s*$/) { + # this is just a date (YYYY, YYYY-mm or YYYY-mm-dd) + $val =~ tr/:/-/; + } elsif ($val =~ /^\s*(\d{2}:\d{2}(?::\d{2}(?:\.\d*)?)?)(.*)\s*$/) { + # this is just a time + ($t, $tz) = ($1, $2); + $val = $t; + } else { + return undef; + } + if ($tz) { + $tz =~ /^(Z|[+-]\d{2}:\d{2})$/ or return undef; + $val .= $tz; + } + return $val; +} + +#------------------------------------------------------------------------------ +# Check XMP values for validity and format accordingly +# Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref, 3) conversion type +# Returns: error string or undef (and may change value) on success +# Note: copies structured information to avoid conflicts with calling code +sub CheckXMP($$$;$) +{ + my ($et, $tagInfo, $valPtr, $convType) = @_; + + if ($$tagInfo{Struct}) { + require 'Image/ExifTool/XMPStruct.pl'; + my ($item, $err, $w, $warn); + unless (ref $$valPtr) { + ($$valPtr, $warn) = InflateStruct($valPtr); + # expect a structure HASH ref or ARRAY of structures + unless (ref $$valPtr) { + $$valPtr eq '' and $$valPtr = { }, return undef; # allow empty structures + return 'Improperly formed structure'; + } + } + if (ref $$valPtr eq 'ARRAY') { + return 'Not a list tag' unless $$tagInfo{List}; + my @copy = ( @{$$valPtr} ); # copy the list for ExifTool to use + $$valPtr = \@copy; # return the copy + foreach $item (@copy) { + unless (ref $item eq 'HASH') { + ($item, $w) = InflateStruct(\$item); # deserialize structure + $w and $warn = $w; + next if ref $item eq 'HASH'; + $err = 'Improperly formed structure'; + last; + } + ($item, $err) = CheckStruct($et, $item, $$tagInfo{Struct}); + last if $err; + } + } else { + ($$valPtr, $err) = CheckStruct($et, $$valPtr, $$tagInfo{Struct}); + } + $warn and $$et{CHECK_WARN} = $warn; + return $err; + } + my $format = $$tagInfo{Writable}; + # (if no format specified, value is a simple string) + if (not $format or $format eq 'string' or $format eq 'lang-alt') { + # convert value to UTF8 if necessary + if ($$et{OPTIONS}{Charset} ne 'UTF8') { + if ($$valPtr =~ /[\x80-\xff]/) { + # convert from Charset to UTF-8 + $$valPtr = $et->Encode($$valPtr,'UTF8'); + } + } else { + # translate invalid XML characters to "." + $$valPtr =~ tr/\0-\x08\x0b\x0c\x0e-\x1f/./; + # fix any malformed UTF-8 characters + if (FixUTF8($valPtr) and not $$et{WarnBadUTF8}) { + $et->Warn('Malformed UTF-8 character(s)'); + $$et{WarnBadUTF8} = 1; + } + } + return undef; # success + } + if ($format eq 'rational' or $format eq 'real') { + # make sure the value is a valid floating point number + unless (Image::ExifTool::IsFloat($$valPtr) or + # allow 'inf' and 'undef' rational values + ($format eq 'rational' and ($$valPtr eq 'inf' or + $$valPtr eq 'undef' or Image::ExifTool::IsRational($$valPtr)))) + { + return 'Not a floating point number'; + } + if ($format eq 'rational') { + $$valPtr = join('/', Image::ExifTool::Rationalize($$valPtr)); + } + } elsif ($format eq 'integer') { + # make sure the value is integer + if (Image::ExifTool::IsInt($$valPtr)) { + # no conversion required (converting to 'int' would remove leading '+') + } elsif (Image::ExifTool::IsHex($$valPtr)) { + $$valPtr = hex($$valPtr); + } else { + return 'Not an integer'; + } + } elsif ($format eq 'date') { + my $newDate = FormatXMPDate($$valPtr); + return "Invalid date/time (use YYYY:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z])" unless $newDate; + $$valPtr = $newDate; + } elsif ($format eq 'boolean') { + # (allow lower-case 'true' and 'false' if not setting PrintConv value) + if (not $$valPtr or $$valPtr =~ /false/i or $$valPtr =~ /^no$/i) { + if (not $$valPtr or $$valPtr ne 'false' or not $convType or $convType eq 'PrintConv') { + $$valPtr = 'False'; + } + } elsif ($$valPtr ne 'true' or not $convType or $convType eq 'PrintConv') { + $$valPtr = 'True'; + } + } elsif ($format eq '1') { + # this is the entire XMP data block + return 'Invalid XMP data' unless ValidateXMP($valPtr); + } else { + return "Unknown XMP format: $format"; + } + return undef; # success! +} + +#------------------------------------------------------------------------------ +# Get PropertyPath for specified tagInfo +# Inputs: 0) tagInfo reference +# Returns: PropertyPath string +sub GetPropertyPath($) +{ + my $tagInfo = shift; + SetPropertyPath($$tagInfo{Table}, $$tagInfo{TagID}) unless $$tagInfo{PropertyPath}; + return $$tagInfo{PropertyPath}; +} + +#------------------------------------------------------------------------------ +# Set PropertyPath for specified tag (also for associated flattened tags and structure elements) +# Inputs: 0) tagTable reference, 1) tagID, 2) tagID of parent structure, +# 3) structure definition ref (or undef), 4) property list up to this point (or undef), +# 5) flag set if any containing structure has a TYPE +# Notes: also generates flattened tags if they don't already exist +sub SetPropertyPath($$;$$$$) +{ + my ($tagTablePtr, $tagID, $parentID, $structPtr, $propList, $isType) = @_; + my $table = $structPtr || $tagTablePtr; + my $tagInfo = $$table{$tagID}; + my $flatInfo; + + return if ref($tagInfo) ne 'HASH'; # (shouldn't happen) + + if ($structPtr) { + my $flatID = $parentID . ucfirst($tagID); + $flatInfo = $$tagTablePtr{$flatID}; + if ($flatInfo) { + return if $$flatInfo{PropertyPath}; + } elsif (@$propList > 50) { + return; # avoid deep recursion + } else { + # flattened tag doesn't exist, so create it now + # (could happen if we were just writing a structure) + $flatInfo = { Name => ucfirst($flatID), Flat => 1 }; + AddTagToTable($tagTablePtr, $flatID, $flatInfo); + } + $isType = 1 if $$structPtr{TYPE}; + } else { + # don't override existing main table entry if already set by a Struct + return if $$tagInfo{PropertyPath}; + # use property path from original tagInfo if this is an alternate-language tag + my $srcInfo = $$tagInfo{SrcTagInfo}; + $$tagInfo{PropertyPath} = GetPropertyPath($srcInfo) if $srcInfo; + return if $$tagInfo{PropertyPath}; + # set property path for all flattened tags in structure if necessary + if ($$tagInfo{RootTagInfo}) { + SetPropertyPath($tagTablePtr, $$tagInfo{RootTagInfo}{TagID}); + return if $$tagInfo{PropertyPath}; + warn "Internal Error: Didn't set path from root for $tagID\n"; + warn "(Is the Struct NAMESPACE defined?)\n"; + } + } + my $ns = $$tagInfo{Namespace} || $$table{NAMESPACE}; + $ns or warn("No namespace for $tagID\n"), return; + my (@propList, $listType); + $propList and @propList = @$propList; + push @propList, "$ns:$tagID"; + # lang-alt lists are handled specially, signified by Writable='lang-alt' + if ($$tagInfo{Writable} and $$tagInfo{Writable} eq 'lang-alt') { + $listType = 'Alt'; + # remove language code from property path if it exists + $propList[-1] =~ s/-$$tagInfo{LangCode}$// if $$tagInfo{LangCode}; + # handle lists of lang-alt lists (eg. XMP-plus:Custom tags) + if ($$tagInfo{List} and $$tagInfo{List} ne '1') { + push @propList, "rdf:$$tagInfo{List}", 'rdf:li 10'; + } + } else { + $listType = $$tagInfo{List}; + } + # add required properties if this is a list + push @propList, "rdf:$listType", 'rdf:li 10' if $listType and $listType ne '1'; + # set PropertyPath for all flattened tags of this structure if necessary + my $strTable = $$tagInfo{Struct}; + if ($strTable and not ($parentID and + # must test NoSubStruct flag to avoid infinite recursion + (($$tagTablePtr{$parentID} and $$tagTablePtr{$parentID}{NoSubStruct}) or + length $parentID > 500))) # avoid deep recursion + { + # make sure the structure namespace has been registered + # (user-defined namespaces may not have been) + RegisterNamespace($strTable) if ref $$strTable{NAMESPACE}; + my $tag; + foreach $tag (keys %$strTable) { + # ignore special fields and any lang-alt fields we may have added + next if $specialStruct{$tag} or $$strTable{$tag}{LangCode}; + my $fullID = $parentID ? $parentID . ucfirst($tagID) : $tagID; + SetPropertyPath($tagTablePtr, $tag, $fullID, $strTable, \@propList, $isType); + } + } + # if this was a structure field and not a normal tag, + # we set PropertyPath in the corresponding flattened tag + if ($structPtr) { + $tagInfo = $flatInfo; + # set StructType flag if any containing structure has a TYPE + $$tagInfo{StructType} = 1 if $isType; + } + # set property path for tagInfo in main table + $$tagInfo{PropertyPath} = join '/', @propList; +} + +#------------------------------------------------------------------------------ +# Save XMP property name/value for rewriting +# Inputs: 0) ExifTool object reference +# 1) reference to array of XMP property path (last is current property) +# 2) property value, 3) optional reference to hash of property attributes +sub CaptureXMP($$$;$) +{ + my ($et, $propList, $val, $attrs) = @_; + return unless defined $val and @$propList > 2; + if ($$propList[0] =~ /^x:x[ma]pmeta$/ and + $$propList[1] eq 'rdf:RDF' and + $$propList[2] =~ /$rdfDesc( |$)/) + { + # no properties to save yet if this is just the description + return unless @$propList > 3; + # ignore empty list properties + if ($$propList[-1] =~ /^rdf:(Bag|Seq|Alt)$/) { + $et->Warn("Ignored empty $$propList[-1] list for $$propList[-2]", 1); + return; + } + # save information about this property + my $capture = $$et{XMP_CAPTURE}; + my $path = join('/', @$propList[3..$#$propList]); + if (defined $$capture{$path}) { + $$et{XMP_ERROR} = "Duplicate XMP property: $path"; + } else { + $$capture{$path} = [$val, $attrs || { }]; + } + } elsif ($$propList[0] eq 'rdf:RDF' and + $$propList[1] =~ /$rdfDesc( |$)/) + { + # set flag so we don't write x:xmpmeta element + $$et{XMP_NO_XMPMETA} = 1; + # add missing x:xmpmeta element and try again + unshift @$propList, 'x:xmpmeta'; + CaptureXMP($et, $propList, $val, $attrs); + } else { + $$et{XMP_ERROR} = 'Improperly enclosed XMP property: ' . join('/',@$propList); + } +} + +#------------------------------------------------------------------------------ +# Save information about resource containing blank node with nodeID +# Inputs: 0) reference to blank node information hash +# 1) reference to property list +# 2) property value +# 3) [optional] reference to attribute hash +# Notes: This routine and ProcessBlankInfo() are also used for reading information, but +# are uncommon so are put in this file to reduce compile time for the common case +sub SaveBlankInfo($$$;$) +{ + my ($blankInfo, $propListPt, $val, $attrs) = @_; + + my $propPath = join '/', @$propListPt; + my @ids = ($propPath =~ m{ #([^ /]*)}g); + my $id; + # split the property path at each nodeID + foreach $id (@ids) { + my ($pre, $prop, $post) = ($propPath =~ m{^(.*?)/([^/]*) #$id((/.*)?)$}); + defined $pre or warn("internal error parsing nodeID's"), next; + # the element with the nodeID should be in the path prefix for subject + # nodes and the path suffix for object nodes + unless ($prop eq $rdfDesc) { + if ($post) { + $post = "/$prop$post"; + } else { + $pre = "$pre/$prop"; + } + } + $$blankInfo{Prop}{$id}{Pre}{$pre} = 1; + if ((defined $post and length $post) or (defined $val and length $val)) { + # save the property value and attributes for each unique path suffix + $$blankInfo{Prop}{$id}{Post}{$post} = [ $val, $attrs, $propPath ]; + } + } +} + +#------------------------------------------------------------------------------ +# Process blank-node information +# Inputs: 0) ExifTool object ref, 1) tag table ref, +# 2) blank node information hash ref, 3) flag set for writing +sub ProcessBlankInfo($$$;$) +{ + my ($et, $tagTablePtr, $blankInfo, $isWriting) = @_; + $et->VPrint(1, " [Elements with nodeID set:]\n") unless $isWriting; + my ($id, $pre, $post); + # handle each nodeID separately + foreach $id (sort keys %{$$blankInfo{Prop}}) { + my $path = $$blankInfo{Prop}{$id}; + # flag all resource names so we can warn later if some are unused + my %unused; + foreach $post (keys %{$$path{Post}}) { + $unused{$post} = 1; + } + # combine property paths for all possible paths through this node + foreach $pre (sort keys %{$$path{Pre}}) { + # there will be no description for the object of a blank node + next unless $pre =~ m{/$rdfDesc/}; + foreach $post (sort keys %{$$path{Post}}) { + my @propList = split m{/}, "$pre$post"; + my ($val, $attrs) = @{$$path{Post}{$post}}; + if ($isWriting) { + CaptureXMP($et, \@propList, $val, $attrs); + } else { + FoundXMP($et, $tagTablePtr, \@propList, $val); + } + delete $unused{$post}; + } + } + # save information from unused properties (if RDF is malformed like f-spot output) + if (%unused) { + $et->Options('Verbose') and $et->Warn('An XMP resource is about nothing'); + foreach $post (sort keys %unused) { + my ($val, $attrs, $propPath) = @{$$path{Post}{$post}}; + my @propList = split m{/}, $propPath; + if ($isWriting) { + CaptureXMP($et, \@propList, $val, $attrs); + } else { + FoundXMP($et, $tagTablePtr, \@propList, $val); + } + } + } + } +} + +#------------------------------------------------------------------------------ +# Convert path to namespace used in file (this is a pain, but the XMP +# spec only suggests 'preferred' namespace prefixes...) +# Inputs: 0) ExifTool object reference, 1) property path +# Returns: conforming property path +sub ConformPathToNamespace($$) +{ + my ($et, $path) = @_; + my @propList = split('/',$path); + my $nsUsed = $$et{XMP_NS}; + my $prop; + foreach $prop (@propList) { + my ($ns, $tag) = $prop =~ /(.+?):(.*)/; + next if not defined $ns or $$nsUsed{$ns}; + my $uri = $nsURI{$ns}; + unless ($uri) { + warn "No URI for namespace prefix $ns!\n"; + next; + } + my $ns2; + foreach $ns2 (keys %$nsUsed) { + next unless $$nsUsed{$ns2} eq $uri; + # use the existing namespace prefix instead of ours + $prop = "$ns2:$tag"; + last; + } + } + return join('/',@propList); +} + +#------------------------------------------------------------------------------ +# Add necessary rdf:type element when writing structure +# Inputs: 0) ExifTool ref, 1) tag table ref, 2) capture hash ref, 3) path string +# 4) optional base path (already conformed to namespace) for elements in +# variable-namespace structures +sub AddStructType($$$$;$) +{ + my ($et, $tagTablePtr, $capture, $path, $basePath) = @_; + my @props = split '/', $path; + my %doneID; + for (;;) { + pop @props; + last unless @props; + my $tagID = GetXMPTagID(\@props); + next if $doneID{$tagID}; + $doneID{$tagID} = 1; + my $tagInfo = $$tagTablePtr{$tagID}; + last unless ref $tagInfo eq 'HASH'; + if ($$tagInfo{Struct}) { + my $type = $$tagInfo{Struct}{TYPE}; + if ($type) { + my $pat = $$tagInfo{PropertyPath}; + $pat or warn("Missing PropertyPath in AddStructType\n"), last; + $pat = ConformPathToNamespace($et, $pat); + $pat =~ s/ \d+/ \\d\+/g; + $path =~ /^($pat)/ or warn("Wrong path in AddStructType\n"), last; + my $p = $1 . '/rdf:type'; + $p = "$basePath/$p" if $basePath; + $$capture{$p} = [ '', { 'rdf:resource' => $type } ] unless $$capture{$p}; + } + } + last unless $$tagInfo{StructType}; + } +} + +#------------------------------------------------------------------------------ +# Hack to use XMP writer for SphericalVideoXML +# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref +# Returns: SphericalVideoXML data +sub WriteGSpherical($$$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $$dirInfo{Compact} = 1, + my $dataPt = $$dirInfo{DataPt}; + if ($dataPt and $$dataPt) { + # make it look like XMP for writing + my $buff = $$dataPt; + $buff =~ s/<rdf:SphericalVideo/<?xpacket begin='.*?' id='W5M0MpCehiHzreSzNTczkc9d'?>\n<x:xmpmeta xmlns:x='adobe:ns:meta\/'><rdf:RDF/; + $buff =~ s/\s*xmlns:GSpherical/>\n<rdf:Description xmlns:GSpherical/s; + $buff =~ s/<\/rdf:SphericalVideo>/<\/rdf:Description>/; + $buff .= "</rdf:RDF></x:xmpmeta><?xpacket end='w'?>"; + $$dirInfo{DataPt} = \$buff; + $$dirInfo{DirLen} = length($buff) - ($$dirInfo{DirStart} || 0); + } + my $xmp = Image::ExifTool::XMP::WriteXMP($et, $dirInfo, $tagTablePtr); + if ($xmp) { + # change back to rdf:SphericalVideo structure + $xmp =~ s/^<\?xpacket begin.*?<rdf:RDF/<rdf:SphericalVideo\n/s; + $xmp =~ s/>\s*<rdf:Description rdf:about=''\s*/\n /; + $xmp =~ s/\s*<\/rdf:Description>\s*(<\/rdf:RDF>)/\n<\/rdf:SphericalVideo>$1/s; + $xmp =~ s/\s*<\/rdf:RDF>\s*<\/x:xmpmeta>.*//s; + } + return $xmp; +} + +#------------------------------------------------------------------------------ +# Utility routine to encode data in base64 +# Inputs: 0) binary data string, 1) flag to avoid inserting newlines +# Returns: base64-encoded string +sub EncodeBase64($;$) +{ + # encode the data in 45-byte chunks + my $chunkSize = 45; + my $len = length $_[0]; + my $str = ''; + my $i; + for ($i=0; $i<$len; $i+=$chunkSize) { + my $n = $len - $i; + $n = $chunkSize if $n > $chunkSize; + # add uuencoded data to output (minus size byte, but including trailing newline) + $str .= substr(pack('u', substr($_[0], $i, $n)), 1); + } + # convert to base64 (remember that "\0" may be encoded as ' ' or '`') + $str =~ tr/` -_/AA-Za-z0-9+\//; + # convert pad characters at the end (remember to account for trailing newline) + my $pad = 3 - ($len % 3); + substr($str, -$pad-1, $pad) = ('=' x $pad) if $pad < 3; + $str =~ tr/\n//d if $_[1]; # remove newlines if specified + return $str; +} + +#------------------------------------------------------------------------------ +# sort tagInfo hash references by tag name +sub ByTagName +{ + return $$a{Name} cmp $$b{Name}; +} + +#------------------------------------------------------------------------------ +# sort alphabetically, but with rdf:type first in the structure +sub TypeFirst +{ + if ($a =~ /rdf:type$/) { + return substr($a, 0, -8) cmp $b unless $b =~ /rdf:type$/; + } elsif ($b =~ /rdf:type$/) { + return $a cmp substr($b, 0, -8); + } + return $a cmp $b; +} + +#------------------------------------------------------------------------------ +# Limit size of XMP +# Inputs: 0) ExifTool object ref, 1) XMP data ref (written up to start of $rdfClose), +# 2) max XMP len, 3) rdf:about string, 4) list ref for description start offsets +# 5) start offset of first description recommended for extended XMP +# Returns: 0) extended XMP ref, 1) GUID and updates $$dataPt (or undef if no extended XMP) +sub LimitXMPSize($$$$$$) +{ + my ($et, $dataPt, $maxLen, $about, $startPt, $extStart) = @_; + + # return straight away if it isn't too big + return undef if length($$dataPt) < $maxLen; + + push @$startPt, length($$dataPt); # add end offset to list + my $newData = substr($$dataPt, 0, $$startPt[0]); + my $guid = '0' x 32; + # write the required xmpNote:HasExtendedXMP property + $newData .= "$nl$sp<$rdfDesc rdf:about='${about}'\n$sp${sp}xmlns:xmpNote='$nsURI{xmpNote}'"; + if ($$et{OPTIONS}{Compact}{Shorthand}) { + $newData .= "\n$sp${sp}xmpNote:HasExtendedXMP='${guid}'/>\n"; + } else { + $newData .= ">$nl$sp$sp<xmpNote:HasExtendedXMP>$guid</xmpNote:HasExtendedXMP>$nl$sp</$rdfDesc>\n"; + } + + my ($i, %descSize, $start); + # calculate all description block sizes + for ($i=1; $i<@$startPt; ++$i) { + $descSize{$$startPt[$i-1]} = $$startPt[$i] - $$startPt[$i-1]; + } + pop @$startPt; # remove end offset + # write the descriptions from smallest to largest, as many in main XMP as possible + my @descStart = sort { $descSize{$a} <=> $descSize{$b} } @$startPt; + my $extData = XMPOpen($et) . $rdfOpen; + for ($i=0; $i<2; ++$i) { + foreach $start (@descStart) { + # write main XMP first (in order of size), then extended XMP afterwards (in order) + next if $i xor $start >= $extStart; + my $pt = (length($newData) + $descSize{$start} > $maxLen) ? \$extData : \$newData; + $$pt .= substr($$dataPt, $start, $descSize{$start}); + } + } + $extData .= $rdfClose . $xmpClose; # close rdf:RDF and x:xmpmeta + # calculate GUID from MD5 of extended XMP data + if (eval { require Digest::MD5 }) { + $guid = uc unpack('H*', Digest::MD5::md5($extData)); + $newData =~ s/0{32}/$guid/; # update GUID in main XMP segment + } + $et->VerboseValue('+ XMP-xmpNote:HasExtendedXMP', $guid); + $$dataPt = $newData; # return main XMP block + return (\$extData, $guid); # return extended XMP and its GUID +} + +#------------------------------------------------------------------------------ +# Close out bottom-level property +# Inputs: 0) current property path list ref, 1) longhand properties at each resource +# level, 2) shorthand properties at each resource level, 3) resource flag for +# each property path level (set only if Shorthand is enabled) +sub CloseProperty($$$$) +{ + my ($curPropList, $long, $short, $resFlag) = @_; + + my $prop = pop @$curPropList; + $prop =~ s/ .*//; # remove list index if it exists + my $pad = $sp x (scalar(@$curPropList) + 1); + if ($$resFlag[@$curPropList]) { + # close this XMP structure with possible shorthand properties + if (length $$short[-1]) { + if (length $$long[-1]) { + # require a new Description if both longhand and shorthand properties + $$long[-2] .= ">$nl$pad<$rdfDesc"; + $$short[-1] .= ">$nl"; + $$long[-1] .= "$pad</$rdfDesc>$nl"; + } else { + # simply close empty property if all shorthand + $$short[-1] .= "/>$nl"; + } + } else { + # use "parseType" instead of opening a new Description + $$long[-2] .= ' rdf:parseType="Resource"'; + $$short[-1] = length $$long[-1] ? ">$nl" : "/>$nl"; + } + $$long[-1] .= "$pad</$prop>$nl" if length $$long[-1]; + $$long[-2] .= $$short[-1] . $$long[-1]; + pop @$short; + pop @$long; + } elsif (defined $$resFlag[@$curPropList]) { + # close this top level Description with possible shorthand values + if (length $$long[-1]) { + $$long[-2] .= $$short[-1] . ">$nl" . $$long[-1] . "$pad</$prop>$nl"; + } else { + $$long[-2] .= $$short[-1] . "/>$nl"; # empty element (ie. all shorthand) + } + $$short[-1] = $$long[-1] = ''; + } else { + # close this property (no chance of shorthand) + $$long[-1] .= "$pad</$prop>$nl"; + unless (@$curPropList) { + # add properties now that this top-level Description is complete + $$long[-2] .= ">$nl" . $$long[-1]; + $$long[-1] = ''; + } + } + $#$resFlag = $#$curPropList; # remove expired resource flags +} + +#------------------------------------------------------------------------------ +# Write XMP information +# Inputs: 0) ExifTool ref, 1) source dirInfo ref (with optional WriteGroup), +# 2) [optional] tag table ref +# Returns: with tag table: new XMP data (may be empty if no XMP data) or undef on error +# without tag table: 1 on success, 0 if not valid XMP file, -1 on write error +# Notes: May set dirInfo InPlace flag to rewrite with specified DirLen (=2 to allow larger) +# May set dirInfo ReadOnly flag to write as read-only XMP ('r' mode and no padding) +# May set dirInfo Compact flag to force compact (drops 2kB of padding) +# May set dirInfo MaxDataLen to limit output data length -- this causes ExtendedXMP +# and ExtendedGUID to be returned in dirInfo if extended XMP was required +sub WriteXMP($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + $et or return 1; # allow dummy access to autoload this package + my $dataPt = $$dirInfo{DataPt}; + my (%capture, %nsUsed, $xmpErr, $about); + my $changed = 0; + my $xmpFile = (not $tagTablePtr); # this is an XMP data file if no $tagTablePtr + # prefer XMP over other metadata formats in some types of files + my $preferred = $xmpFile || ($$et{PreferredGroup} and $$et{PreferredGroup} eq 'XMP'); + my $verbose = $$et{OPTIONS}{Verbose}; + my %compact = ( %{$$et{OPTIONS}{Compact}} ); # (make a copy so we can change settings) + my $dirLen = $$dirInfo{DirLen}; + $dirLen = length($$dataPt) if not defined $dirLen and $dataPt; +# +# extract existing XMP information into %capture hash +# + # define hash in ExifTool object to capture XMP information (also causes + # CaptureXMP() instead of FoundXMP() to be called from ParseXMPElement()) + # + # The %capture hash is keyed on the complete property path beginning after + # rdf:RDF/rdf:Description/. The values are array references with the + # following entries: 0) value, 1) attribute hash reference. + $$et{XMP_CAPTURE} = \%capture; + $$et{XMP_NS} = \%nsUsed; + delete $$et{XMP_NO_XMPMETA}; + delete $$et{XMP_NO_XPACKET}; + delete $$et{XMP_IS_XML}; + delete $$et{XMP_IS_SVG}; + + # set current padding characters + ($sp, $nl) = ($compact{NoIndent} ? '' : ' ', $compact{NoNewline} ? '' : "\n"); + + # get value for new rdf:about + my $tagInfo = $Image::ExifTool::XMP::rdf{about}; + if (defined $$et{NEW_VALUE}{$tagInfo}) { + $about = $et->GetNewValue($$et{NEW_VALUE}{$tagInfo}) || ''; + } + + if ($xmpFile or $dirLen) { + delete $$et{XMP_ERROR}; + # extract all existing XMP information (to the XMP_CAPTURE hash) + my $success = ProcessXMP($et, $dirInfo, $tagTablePtr); + # don't continue if there is nothing to parse or if we had a parsing error + unless ($success and not $$et{XMP_ERROR}) { + my $err = $$et{XMP_ERROR} || 'Error parsing XMP'; + # may ignore this error only if we were successful + if ($xmpFile) { + my $raf = $$dirInfo{RAF}; + # allow empty XMP data so we can create something from nothing + if ($success or not $raf->Seek(0,2) or $raf->Tell()) { + # no error message if not an XMP file + return 0 unless $$et{XMP_ERROR}; + if ($et->Error($err, $success)) { + delete $$et{XMP_CAPTURE}; + return 0; + } + } + } else { + $success = 2 if $success and $success eq '1'; + if ($et->Warn($err, $success)) { + delete $$et{XMP_CAPTURE}; + return undef; + } + } + } + if (defined $about) { + if ($verbose > 1) { + my $wasAbout = $$et{XmpAbout}; + $et->VerboseValue('- XMP-rdf:About', UnescapeXML($wasAbout)) if defined $wasAbout; + $et->VerboseValue('+ XMP-rdf:About', $about); + } + $about = EscapeXML($about); # must escape for XML + ++$changed; + } else { + $about = $$et{XmpAbout} || ''; + } + delete $$et{XMP_ERROR}; + + # call InitWriteDirs to initialize FORCE_WRITE flags if necessary + $et->InitWriteDirs({}, 'XMP') if $xmpFile and $et->GetNewValue('ForceWrite'); + # set changed if we are ForceWrite tag was set to "XMP" + ++$changed if $$et{FORCE_WRITE}{XMP}; + + } elsif (defined $about) { + $et->VerboseValue('+ XMP-rdf:About', $about); + $about = EscapeXML($about); # must escape for XML + # (don't increment $changed here because we need another tag to be written) + } else { + $about = ''; + } +# +# handle writing XMP as a block to XMP file +# + if ($xmpFile) { + $tagInfo = $Image::ExifTool::Extra{XMP}; + if ($tagInfo and $$et{NEW_VALUE}{$tagInfo}) { + my $rtnVal = 1; + my $newVal = $et->GetNewValue($$et{NEW_VALUE}{$tagInfo}); + if (defined $newVal and length $newVal) { + $et->VPrint(0, " Writing XMP as a block\n"); + ++$$et{CHANGED}; + Write($$dirInfo{OutFile}, $newVal) or $rtnVal = -1; + } + delete $$et{XMP_CAPTURE}; + return $rtnVal; + } + } +# +# delete groups in family 1 if requested +# + if (%{$$et{DEL_GROUP}} and (grep /^XMP-.+$/, keys %{$$et{DEL_GROUP}} or + # (logic is a bit more complex for group names in exiftool XML files) + grep m{^http://ns.exiftool.(?:ca|org)/}, values %nsUsed)) + { + my $del = $$et{DEL_GROUP}; + my $path; + foreach $path (keys %capture) { + my @propList = split('/',$path); # get property list + my ($tag, $ns) = GetXMPTagID(\@propList); + # translate namespace if necessary + $ns = $stdXlatNS{$ns} if $stdXlatNS{$ns}; + my ($grp, @g); + # no "XMP-" added to most groups in exiftool RDF/XML output file + if ($nsUsed{$ns} and (@g = ($nsUsed{$ns} =~ m{^http://ns.exiftool.(?:ca|org)/(.*?)/(.*?)/}))) { + if ($g[1] =~ /^\d/) { + $grp = "XML-$g[0]"; + #(all XML-* groups stored as uppercase DEL_GROUP key) + my $ucg = uc $grp; + next unless $$del{$ucg} or ($$del{'XML-*'} and not $$del{"-$ucg"}); + } else { + $grp = $g[1]; + next unless $$del{$grp} or ($$del{$g[0]} and not $$del{"-$grp"}); + } + } else { + $grp = "XMP-$ns"; + my $ucg = uc $grp; + next unless $$del{$ucg} or ($$del{'XMP-*'} and not $$del{"-$ucg"}); + } + $et->VerboseValue("- $grp:$tag", $capture{$path}->[0]); + delete $capture{$path}; + ++$changed; + } + } + # delete HasExtendedXMP tag (we create it as needed) + my $hasExtTag = 'xmpNote:HasExtendedXMP'; + if ($capture{$hasExtTag}) { + $et->VerboseValue("- XMP-$hasExtTag", $capture{$hasExtTag}->[0]); + delete $capture{$hasExtTag}; + } + # set $xmpOpen now to to handle xmptk tag first + my $xmpOpen = $$et{XMP_NO_XMPMETA} ? '' : XMPOpen($et); +# +# add, delete or change information as specified +# + # get hash of all information we want to change + # (sorted by tag name so alternate languages come last, but with structures + # first so flattened tags may be used to override individual structure elements) + my (@tagInfoList, $delLangPath, %delLangPaths, %delAllLang, $firstNewPath); + my $writeGroup = $$dirInfo{WriteGroup}; + foreach $tagInfo (sort ByTagName $et->GetNewTagInfoList()) { + next unless $et->GetGroup($tagInfo, 0) eq 'XMP'; + next if $$tagInfo{Name} eq 'XMP'; # (ignore full XMP block if we didn't write it already) + next if $writeGroup and $writeGroup ne $$et{NEW_VALUE}{$tagInfo}{WriteGroup}; + if ($$tagInfo{Struct}) { + unshift @tagInfoList, $tagInfo; + } else { + push @tagInfoList, $tagInfo; + } + } + foreach $tagInfo (@tagInfoList) { + my @delPaths; # list of deleted paths + my $tag = $$tagInfo{TagID}; + my $path = GetPropertyPath($tagInfo); + unless ($path) { + $et->Warn("Can't write XMP:$tag (namespace unknown)"); + next; + } + # skip tags that were handled specially + if ($path eq 'rdf:about' or $path eq 'x:xmptk') { + ++$changed; + next; + } + my $isStruct = $$tagInfo{Struct}; + # change our property path namespace prefixes to conform + # to the ones used in this file + $path = ConformPathToNamespace($et, $path); + # find existing property + my $cap = $capture{$path}; + # MicrosoftPhoto screws up the case of some tags, and some other software, + # including Adobe software, has been known to write the wrong list type or + # not properly enclose properties in a list, so we check for this + until ($cap) { + # find and fix all incorrect property names if this is a structure or a flattened tag + my @fixInfo; + if ($isStruct or defined $$tagInfo{Flat}) { + # get tagInfo for all containing (possibly nested) structures + my @props = split '/', $path; + my $tbl = $$tagInfo{Table}; + while (@props) { + my $info = $$tbl{GetXMPTagID(\@props)}; + unshift @fixInfo, $info if ref $info eq 'HASH' and $$info{Struct} and + (not @fixInfo or $fixInfo[0] ne $info); + pop @props; + } + $et->WarnOnce("Error finding parent structure for $$tagInfo{Name}") unless @fixInfo; + } + # fix property path for this tag (last in the @fixInfo list) + push @fixInfo, $tagInfo unless @fixInfo and $isStruct; + # start from outermost containing structure, fixing incorrect list types, etc, + # finally fixing the actual tag properties after all containing structures + my $err; + while (@fixInfo) { + my $fixInfo = shift @fixInfo; + my $fixPath = ConformPathToNamespace($et, GetPropertyPath($fixInfo)); + my $regex = quotemeta($fixPath); + $regex =~ s/ \d+/ \\d\+/g; # match any list index + my $ok = $regex; + my ($ok2, $match, $i, @fixed, %fixed, $fixed); + # check for incorrect list types + if ($regex =~ s{\\/rdf\\:(Bag|Seq|Alt)\\/}{/rdf:(Bag|Seq|Alt)/}g) { + # also look for missing bottom-level list + if ($regex =~ s{/rdf:\(Bag\|Seq\|Alt\)\/rdf\\:li\\ \\d\+$}{}) { + $regex .= '(/.*)?' unless @fixInfo; + } + } elsif (not @fixInfo) { + $ok2 = $regex; + # check for properties in lists that shouldn't be (ref forum4325) + $regex .= '(/rdf:(Bag|Seq|Alt)/rdf:li \d+)?'; + } + if (@fixInfo) { + $regex .= '(/.*)?'; + $ok .= '(/.*)?'; + } + my @matches = sort grep m{^$regex$}i, keys %capture; + last unless @matches; + if ($matches[0] =~ m{^$ok$}) { + unless (@fixInfo) { + $path = $matches[0]; + $cap = $capture{$path}; + } + next; + } + # needs fixing... + my @fixProps = split '/', $fixPath; + foreach $match (@matches) { + my @matchProps = split '/', $match; + # remove superfluous list properties if necessary + $#matchProps = $#fixProps if $ok2 and $#matchProps > $#fixProps; + for ($i=0; $i<@fixProps; ++$i) { + defined $matchProps[$i] or $matchProps[$i] = $fixProps[$i], next; + next if $matchProps[$i] =~ / \d+$/ or $matchProps[$i] eq $fixProps[$i]; + $matchProps[$i] = $fixProps[$i]; + } + $fixed = join '/', @matchProps; + $err = 1 if $fixed{$fixed} or ($capture{$fixed} and $match ne $fixed); + push @fixed, $fixed; + $fixed{$fixed} = 1; + } + my $tg = $et->GetGroup($fixInfo, 1) . ':' . $$fixInfo{Name}; + my $wrn = lc($fixed[0]) eq lc($matches[0]) ? 'tag ID case' : 'list type'; + if ($err) { + $et->Warn("Incorrect $wrn for existing $tg (not changed)"); + } else { + # fix the incorrect property paths for all values of this tag + my $didFix; + foreach $fixed (@fixed) { + my $match = shift @matches; + next if $fixed eq $match; + $capture{$fixed} = $capture{$match}; + delete $capture{$match}; + # remove xml:lang attribute from incorrect lang-alt list if necessary + delete $capture{$fixed}[1]{'xml:lang'} if $ok2 and $match !~ /^$ok2$/; + $didFix = 1; + } + $cap = $capture{$path} || $capture{$fixed[0]} unless @fixInfo; + if ($didFix) { + $et->Warn("Fixed incorrect $wrn for $tg", 1); + ++$changed; + } + } + } + last; + } + my $nvHash = $et->GetNewValueHash($tagInfo); + my $overwrite = $et->IsOverwriting($nvHash); + my $writable = $$tagInfo{Writable} || ''; + my (%attrs, $deleted, $added, $existed, $newLang); + # set up variables to save/restore paths of deleted lang-alt tags + if ($writable eq 'lang-alt') { + $newLang = lc($$tagInfo{LangCode} || 'x-default'); + if ($delLangPath and $delLangPath eq $path) { + # restore paths of deleted entries for this language + @delPaths = @{$delLangPaths{$newLang}} if $delLangPaths{$newLang}; + } else { + undef %delLangPaths; + $delLangPath = $path; # base path for deleted lang-alt tags + undef %delAllLang; + undef $firstNewPath; # reset first path for new lang-alt tag + } + if (%delAllLang) { + # add missing paths to delete list for entries where all languages were deleted + my ($prefix, $reSort); + foreach $prefix (keys %delAllLang) { + next if grep /^$prefix/, @delPaths; + push @delPaths, "${prefix}10"; + $reSort = 1; + } + @delPaths = sort @delPaths if $reSort; + } + } + # delete existing entry if necessary + if ($isStruct) { + # delete all structure (or pseudo-structure) elements + require 'Image/ExifTool/XMPStruct.pl'; + ($deleted, $added, $existed) = DeleteStruct($et, \%capture, \$path, $nvHash, \$changed); + next unless $deleted or $added or $et->IsOverwriting($nvHash); + next if $existed and $$nvHash{CreateOnly}; + } elsif ($cap) { + next if $$nvHash{CreateOnly}; # (necessary for List-type tags) + # take attributes from old values if they exist + %attrs = %{$$cap[1]}; + if ($overwrite) { + my ($oldLang, $delLang, $addLang, @matchingPaths, $langPathPat, %langsHere); + # check to see if this is an indexed list item + if ($path =~ / /) { + my $pp; + ($pp = $path) =~ s/ \d+/ \\d\+/g; + @matchingPaths = sort grep(/^$pp$/, keys %capture); + } else { + push @matchingPaths, $path; + } + my $oldOverwrite = $overwrite; + foreach $path (@matchingPaths) { + my ($val, $attrs) = @{$capture{$path}}; + if ($writable eq 'lang-alt') { + # get original language code (lc for comparisons) + $oldLang = lc($$attrs{'xml:lang'} || 'x-default'); + # revert to original overwrite flag if this is in a different structure + if (not $langPathPat or $path !~ /^$langPathPat$/) { + $overwrite = $oldOverwrite; + ($langPathPat = $path) =~ s/\d+$/\\d+/; + } + # remember languages in this lang-alt list + $langsHere{$langPathPat}{$oldLang} = 1; + unless (defined $addLang) { + # add to lang-alt list by default if creating this tag from scratch + $addLang = $$nvHash{IsCreating} ? 1 : 0; + } + if ($overwrite < 0) { + next unless $oldLang eq $newLang; + # only add new tag if we are overwriting this one + # (note: this won't match if original XML contains CDATA!) + $addLang = $et->IsOverwriting($nvHash, UnescapeXML($val)); + next unless $addLang; + } + # delete all if deleting "x-default" and writing with no LangCode + # (XMP spec requires x-default language exist and be first in list) + if ($oldLang eq 'x-default' and not $$tagInfo{LangCode}) { + $delLang = 1; # delete all languages + $overwrite = 1; # force overwrite + } elsif ($$tagInfo{LangCode} and not $delLang) { + # only overwrite specified language + next unless lc($$tagInfo{LangCode}) eq $oldLang; + } + } elsif ($overwrite < 0) { + # only overwrite specific values + if ($$nvHash{Shift}) { + # values to be shifted are checked (hence re-formatted) late, + # so we must un-format the to-be-shifted value for IsOverwriting() + my $fmt = $$tagInfo{Writable} || ''; + if ($fmt eq 'rational') { + ConvertRational($val); + } elsif ($fmt eq 'date') { + $val = ConvertXMPDate($val); + } + } + # (note: this won't match if original XML contains CDATA!) + next unless $et->IsOverwriting($nvHash, UnescapeXML($val)); + } + if ($verbose > 1) { + my $grp = $et->GetGroup($tagInfo, 1); + my $tagName = $$tagInfo{Name}; + $tagName =~ s/-$$tagInfo{LangCode}$// if $$tagInfo{LangCode}; + $tagName .= '-' . $$attrs{'xml:lang'} if $$attrs{'xml:lang'}; + $et->VerboseValue("- $grp:$tagName", $val); + } + # save attributes and path from first deleted property + # so we can replace it exactly + %attrs = %$attrs unless @delPaths; + if ($writable eq 'lang-alt') { + $langsHere{$langPathPat}{$oldLang} = 0; # (lang was deleted) + } + # save deleted paths so we can replace the same elements + # (separately for each language of a lang-alt list) + if ($writable ne 'lang-alt' or $oldLang eq $newLang) { + push @delPaths, $path; + } else { + $delLangPaths{$oldLang} or $delLangPaths{$oldLang} = [ ]; + push @{$delLangPaths{$oldLang}}, $path; + } + # keep track of paths where we deleted all languages of a lang-alt tag + if ($delLang) { + my $p; + ($p = $path) =~ s/\d+$//; + $delAllLang{$p} = 1; + } + # delete this tag + delete $capture{$path}; + ++$changed; + # delete rdf:type tag if it is the only thing left in this structure + if ($path =~ /^(.*)\// and $capture{"$1/rdf:type"}) { + my $pp = $1; + my @a = grep /^\Q$pp\E\/[^\/]+/, keys %capture; + delete $capture{"$pp/rdf:type"} if @a == 1; + } + } + next unless @delPaths or $$tagInfo{List} or $addLang; + if (@delPaths) { + $path = shift @delPaths; + # make sure new path is unique + while ($capture{$path}) { + last unless $path =~ s/ \d(\d+)$/' '.length($1+1).($1+1)/e; + } + $deleted = 1; + } else { + # don't change tag if we couldn't delete old copy + # unless this is a list or an lang-alt tag + next unless $$tagInfo{List} or $oldLang; + # avoid adding duplicate entry to lang-alt in a list + if ($writable eq 'lang-alt' and %langsHere) { + foreach (sort keys %langsHere) { + next unless $path =~ /^$_$/; + last unless $langsHere{$_}{$newLang}; + $path =~ /(.* )\d(\d+)(.*? \d+)$/ or $et->Error('Internal error writing lang-alt list'), last; + my $nxt = $2 + 1; + $path = $1 . length($nxt) . ($nxt) . $3; # step to next index + } + } + # (match last index to put in same lang-alt list for Bag of lang-alt items) + $path =~ m/.* (\d+)/g or warn "Internal error: no list index!\n", next; + $added = $1; + } + } else { + # we are never overwriting, so we must be adding to a list + # match the last index unless this is a list of lang-alt lists + my $pat = '.* (\d+)'; + if ($writable eq 'lang-alt') { + if ($firstNewPath) { + $path = $firstNewPath; + $overwrite = 1; # necessary to put x-default entry first below + } else { + $pat = '.* (\d+)(.*? \d+)'; + } + } + if ($path =~ m/$pat/g) { + $added = $1; + # set position to end of matching index number + pos($path) = pos($path) - length($2) if $2; + } + } + if (defined $added) { + my $len = length $added; + my $pos = pos($path) - $len; + my $nxt = substr($added, 1) + 1; + # always insert x-default lang-alt entry first (as per XMP spec) + # (need to test $overwrite because this will be a new lang-alt entry otherwise) + if ($overwrite and $writable eq 'lang-alt' and (not $$tagInfo{LangCode} or + $$tagInfo{LangCode} eq 'x-default')) + { + my $saveCap = $capture{$path}; + while ($saveCap) { + my $p = $path; + substr($p, $pos, $len) = length($nxt) . $nxt; + # increment index in the path of the existing item + my $nextCap = $capture{$p}; + $capture{$p} = $saveCap; + last unless $nextCap; + $saveCap = $nextCap; + ++$nxt; + } + } else { + # add to end of list + while ($capture{$path}) { + my $try = length($nxt) . $nxt; + substr($path, $pos, $len) = $try; + $len = length $try; + ++$nxt; + } + } + } + } + # check to see if we want to create this tag + # (create non-avoided tags in XMP data files by default) + my $isCreating = ($$nvHash{IsCreating} or (($isStruct or + ($preferred and not $$tagInfo{Avoid} and + not defined $$nvHash{Shift})) and not $$nvHash{EditOnly})); + + # don't add new values unless... + # ...tag existed before and was deleted, or we added it to a list + next unless $deleted or defined $added or + # ...tag didn't exist before and we are creating it + (not $cap and $isCreating); + + # get list of new values (all done if no new values specified) + my @newValues = $et->GetNewValue($nvHash) or next; + + # set language attribute for lang-alt lists + if ($writable eq 'lang-alt') { + $attrs{'xml:lang'} = $$tagInfo{LangCode} || 'x-default'; + $firstNewPath = $path if defined $added; # save path of first lang-alt tag added + } + # add new value(s) to %capture hash + my $subIdx; + for (;;) { + my $newValue = shift @newValues; + if ($isStruct) { + ++$changed if AddNewStruct($et, $tagInfo, \%capture, + $path, $newValue, $$tagInfo{Struct}); + } else { + $newValue = EscapeXML($newValue); + for (;;) { # (a cheap 'goto') + if ($$tagInfo{Resource}) { + # only store as a resource if it doesn't contain any illegal characters + if ($newValue !~ /[^a-z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\.\-\_\~]/i) { + $capture{$path} = [ '', { %attrs, 'rdf:resource' => $newValue } ]; + last; + } + my $grp = $et->GetGroup($tagInfo, 1); + $et->Warn("$grp:$$tagInfo{Name} written as a literal because value is not a valid URI", 1); + # fall through to write as a string literal + } + # remove existing value and/or resource attribute if they exist + delete $attrs{'rdf:value'}; + delete $attrs{'rdf:resource'}; + $capture{$path} = [ $newValue, \%attrs ]; + last; + } + if ($verbose > 1) { + my $grp = $et->GetGroup($tagInfo, 1); + $et->VerboseValue("+ $grp:$$tagInfo{Name}", $newValue); + } + ++$changed; + # add rdf:type if necessary + if ($$tagInfo{StructType}) { + AddStructType($et, $$tagInfo{Table}, \%capture, $path); + } + } + last unless @newValues; + # match last index except for lang-alt items where we want to put each + # item in a different lang-alt list (so match the 2nd-last for these) + my $pat = $writable eq 'lang-alt' ? '.* (\d+)(.*? \d+)' : '.* (\d+)'; + pos($path) = 0; + $path =~ m/$pat/g or warn("Internal error: no list index for $tag ($path) ($pat)!\n"), next; + my $idx = $1; + my $len = length $1; + my $pos = pos($path) - $len - ($2 ? length $2 : 0); + # use sub-indices if necessary to store additional values in sequence + if ($subIdx) { + $idx = substr($idx, 0, -length($subIdx)); # remove old sub-index + $subIdx = substr($subIdx, 1) + 1; + $subIdx = length($subIdx) . $subIdx; + } elsif (@delPaths) { + $path = shift @delPaths; + # make sure new path is unique + while ($capture{$path}) { + last unless $path =~ s/ \d(\d+)$/' '.length($1+1).($1+1)/e; + } + next; + } else { + $subIdx = '10'; + } + substr($path, $pos, $len) = $idx . $subIdx; + } + # make sure any empty structures are deleted + # (ExifTool shouldn't write these, but other software may) + if (defined $$tagInfo{Flat}) { + my $p = $path; + while ($p =~ s/\/[^\/]+$//) { + next unless $capture{$p}; + # it is an error if this property has a value + $et->Error("Improperly structured XMP ($p)",1) if $capture{$p}[0] =~ /\S/; + delete $capture{$p}; # delete the (hopefully) empty structure + } + } + } + # remove the ExifTool members we created + delete $$et{XMP_CAPTURE}; + delete $$et{XMP_NS}; + + my $maxDataLen = $$dirInfo{MaxDataLen}; + # get DataPt again because it may have been set by ProcessXMP + $dataPt = $$dirInfo{DataPt}; + + # return now if we didn't change anything + unless ($changed or ($maxDataLen and $dataPt and defined $$dataPt and + length($$dataPt) > $maxDataLen)) + { + return undef unless $xmpFile; # just rewrite original XMP + Write($$dirInfo{OutFile}, $$dataPt) or return -1 if $dataPt and defined $$dataPt; + return 1; + } +# +# write out the new XMP information (serialize it) +# + # start writing the XMP data + my (@long, @short, @resFlag); + $long[0] = $long[1] = $short[0] = ''; + if ($$et{XMP_NO_XPACKET}) { + # write BOM if flag is set + $long[-2] .= "\xef\xbb\xbf" if $$et{XMP_NO_XPACKET} == 2; + } else { + $long[-2] .= $pktOpen; + } + $long[-2] .= $xmlOpen if $$et{XMP_IS_XML}; + $long[-2] .= $xmpOpen . $rdfOpen; + + # initialize current property path list + my (@curPropList, @writeLast, @descStart, $extStart); + my (%nsCur, $prop, $n, $path); + my @pathList = sort TypeFirst keys %capture; + # order properties to write large values last if we have a MaxDataLen limit + if ($maxDataLen and @pathList) { + my @pathTmp; + my ($lastProp, $lastNS, $propSize) = ('', '', 0); + my @pathLoop = (@pathList, ''); # add empty path to end of list for loop + undef @pathList; + foreach $path (@pathLoop) { + $path =~ /^((\w*)[^\/]*)/; # get path element ($1) and ns ($2) + if ($1 eq $lastProp) { + push @pathTmp, $path; # accumulate all paths with same root + } else { + # put in list to write last if recommended or values are too large + if ($extendedRes{$lastProp} or $extendedRes{$lastNS} or + $propSize > $newDescThresh) + { + push @writeLast, @pathTmp; + } else { + push @pathList, @pathTmp; + } + last unless $path; # all done if we hit empty path + @pathTmp = ( $path ); + ($lastProp, $lastNS, $propSize) = ($1, $2, 0); + } + $propSize += length $capture{$path}->[0]; + } + } + + # write out all properties + for (;;) { + my (%nsNew, $newDesc); + unless (@pathList) { + last unless @writeLast; + @pathList = @writeLast; + undef @writeLast; + $newDesc = 2; # start with a new description for the extended data + } + $path = shift @pathList; + my @propList = split('/',$path); # get property list + # must open/close rdf:Description too + unshift @propList, $rdfDesc; + # make sure we have defined all necessary namespaces + foreach $prop (@propList) { + $prop =~ /(.*):/ or next; + $1 eq 'rdf' and next; # rdf namespace already defined + my $uri = $nsUsed{$1}; + unless ($uri) { + $uri = $nsURI{$1}; # we must have added a namespace + unless ($uri) { + # (namespace prefix may be empty if trying to write empty XMP structure, forum12384) + if (length $1) { + my $err = "Undefined XMP namespace: $1"; + if (not $xmpErr or $err ne $xmpErr) { + $xmpFile ? $et->Error($err) : $et->Warn($err); + $xmpErr = $err; + } + } + next; + } + } + $nsNew{$1} = $uri; + # need a new description if any new namespaces + $newDesc = 1 unless $nsCur{$1}; + } + my $closeTo = 0; + if ($newDesc) { + # look forward to see if we will want to also open other namespaces + # at this level (this is necessary to keep lists and structures from + # being broken if a property introduces a new namespace; plus it + # improves formatting) + my ($path2, $ns2); + foreach $path2 (@pathList) { + my @ns2s = ($path2 =~ m{(?:^|/)([^/]+?):}g); + my $opening = $compact{OneDesc} ? 1 : 0; + foreach $ns2 (@ns2s) { + next if $ns2 eq 'rdf'; + $nsNew{$ns2} and ++$opening, next; + last unless $opening; + # get URI for this existing or new namespace + my $uri = $nsUsed{$ns2} || $nsURI{$ns2} or last; + $nsNew{$ns2} = $uri; # also open this namespace + } + last unless $opening; + } + } else { + # find first property where the current path differs from the new path + for ($closeTo=0; $closeTo<@curPropList; ++$closeTo) { + last unless $closeTo < @propList; + last unless $propList[$closeTo] eq $curPropList[$closeTo]; + } + } + # close out properties down to the common base path + CloseProperty(\@curPropList, \@long, \@short, \@resFlag) while @curPropList > $closeTo; + + # open new description if necessary + if ($newDesc) { + $extStart = length($long[-2]) if $newDesc == 2; # extended data starts after this + # save rdf:Description start positions so we can reorder them if necessary + push @descStart, length($long[-2]) if $maxDataLen; + # open the new description + $prop = $rdfDesc; + %nsCur = %nsNew; # save current namespaces + my @ns = sort keys %nsCur; + $long[-2] .= "$nl$sp<$prop rdf:about='${about}'"; + # generate et:toolkit attribute if this is an exiftool RDF/XML output file + if (@ns and $nsCur{$ns[0]} =~ m{^http://ns.exiftool.(?:ca|org)/}) { + $long[-2] .= "\n$sp${sp}xmlns:et='http://ns.exiftool.org/1.0/'" . + " et:toolkit='Image::ExifTool $Image::ExifTool::VERSION'"; + } + $long[-2] .= "\n$sp${sp}xmlns:$_='$nsCur{$_}'" foreach @ns; + push @curPropList, $prop; + # set resFlag to 0 to indicate base description when Shorthand enabled + $resFlag[0] = 0 if $compact{Shorthand}; + } + my ($val, $attrs) = @{$capture{$path}}; + $debug and print "$path = $val\n"; + # open new properties if necessary + my ($attr, $dummy); + for ($n=@curPropList; $n<$#propList; ++$n) { + $prop = $propList[$n]; + push @curPropList, $prop; + $prop =~ s/ .*//; # remove list index if it exists + # (we may add parseType and shorthand properties later, + # so leave off the trailing ">" for now) + $long[-1] .= ($compact{NoIndent} ? '' : ' ' x scalar(@curPropList)) . "<$prop"; + if ($prop ne $rdfDesc and ($propList[$n+1] !~ /^rdf:/ or + ($propList[$n+1] eq 'rdf:type' and $n+1 == $#propList))) + { + # check for empty structure + if ($propList[$n+1] =~ /:~dummy~$/) { + $long[-1] .= " rdf:parseType='Resource'/>$nl"; + pop @curPropList; + $dummy = 1; + last; + } + if ($compact{Shorthand}) { + $resFlag[$#curPropList] = 1; + push @long, ''; + push @short, ''; + } else { + # use rdf:parseType='Resource' to avoid new 'rdf:Description' + $long[-1] .= " rdf:parseType='Resource'>$nl"; + } + } else { + $long[-1] .= ">$nl"; # (will be no shorthand properties) + } + } + my $prop2 = pop @propList; # get new property name + # add element unless it was a dummy structure field + unless ($dummy or ($val eq '' and $prop2 =~ /:~dummy~$/)) { + $prop2 =~ s/ .*//; # remove list index if it exists + my $pad = $compact{NoIndent} ? '' : ' ' x (scalar(@curPropList) + 1); + # (can't write as shortcut if it has attributes or CDATA) + if (defined $resFlag[$#curPropList] and not %$attrs and $val !~ /<!\[CDATA\[/) { + $short[-1] .= "\n$pad$prop2='${val}'"; + } else { + $long[-1] .= "$pad<$prop2"; + # write out attributes + foreach $attr (sort keys %$attrs) { + my $attrVal = $$attrs{$attr}; + my $quot = ($attrVal =~ /'/) ? '"' : "'"; + $long[-1] .= " $attr=$quot$attrVal$quot"; + } + $long[-1] .= length $val ? ">$val</$prop2>$nl" : "/>$nl"; + } + } + } + # close out all open properties + CloseProperty(\@curPropList, \@long, \@short, \@resFlag) while @curPropList; + + # limit XMP length and re-arrange if necessary to fit inside specified size + if ($maxDataLen) { + # adjust maxDataLen to allow room for closing elements + $maxDataLen -= length($rdfClose) + length($xmpClose) + length($pktCloseW); + $extStart or $extStart = length $long[-2]; + my @rtn = LimitXMPSize($et, \$long[-2], $maxDataLen, $about, \@descStart, $extStart); + # return extended XMP information in $dirInfo + $$dirInfo{ExtendedXMP} = $rtn[0]; + $$dirInfo{ExtendedGUID} = $rtn[1]; + # compact if necessary to fit + $compact{NoPadding} = 1 if length($long[-2]) + 101 * $numPadLines > $maxDataLen; + } + $compact{NoPadding} = 1 if $$dirInfo{Compact}; +# +# close out the XMP, clean up, and return our data +# + $long[-2] .= $rdfClose; + $long[-2] .= $xmpClose unless $$et{XMP_NO_XMPMETA}; + + # remove the ExifTool members we created + delete $$et{XMP_CAPTURE}; + delete $$et{XMP_NS}; + delete $$et{XMP_NO_XMPMETA}; + + # (the XMP standard recommends writing 2k-4k of white space before the + # packet trailer, with a newline every 100 characters) + unless ($$et{XMP_NO_XPACKET}) { + my $pad = (' ' x 100) . "\n"; + # get current XMP length without padding + my $len = length($long[-2]) + length($pktCloseW); + if ($$dirInfo{InPlace} and not ($$dirInfo{InPlace} == 2 and $len > $dirLen)) { + # pad to specified DirLen + if ($len > $dirLen) { + my $str = 'Not enough room to edit XMP in place'; + $str .= '. Try Shorthand feature' unless $compact{Shorthand}; + $et->Warn($str); + return undef; + } + my $num = int(($dirLen - $len) / length($pad)); + if ($num) { + $long[-2] .= $pad x $num; + $len += length($pad) * $num; + } + $len < $dirLen and $long[-2] .= (' ' x ($dirLen - $len - 1)) . "\n"; + } elsif (not $compact{NoPadding} and not $xmpFile and not $$dirInfo{ReadOnly}) { + $long[-2] .= $pad x $numPadLines; + } + $long[-2] .= ($$dirInfo{ReadOnly} ? $pktCloseR : $pktCloseW); + } + # return empty data if no properties exist and this is allowed + unless (%capture or $xmpFile or $$dirInfo{InPlace} or $$dirInfo{NoDelete}) { + $long[-2] = ''; + } + return($xmpFile ? -1 : undef) if $xmpErr; + $$et{CHANGED} += $changed; + $debug > 1 and $long[-2] and print $long[-2],"\n"; + return $long[-2] unless $xmpFile; + Write($$dirInfo{OutFile}, $long[-2]) or return -1; + return 1; +} + + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::WriteXMP.pl - Write XMP meta information + +=head1 SYNOPSIS + +These routines are autoloaded by Image::ExifTool::XMP. + +=head1 DESCRIPTION + +This file contains routines to write XMP metadata. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::XMP(3pm)|Image::ExifTool::XMP>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/Writer.pl b/lib/Image/ExifTool/Writer.pl new file mode 100644 index 0000000..c59faca --- /dev/null +++ b/lib/Image/ExifTool/Writer.pl @@ -0,0 +1,7050 @@ +#------------------------------------------------------------------------------ +# File: Writer.pl +# +# Description: ExifTool write routines +# +# Notes: Also contains some less used ExifTool functions +# +# URL: https://exiftool.org/ +# +# Revisions: 12/16/2004 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool; + +use strict; + +use Image::ExifTool::TagLookup qw(FindTagInfo TagExists); +use Image::ExifTool::Fixup; + +sub AssembleRational($$@); +sub LastInList($); +sub CreateDirectory($$); +sub NextFreeTagKey($$); +sub RemoveNewValueHash($$$); +sub RemoveNewValuesForGroup($$); +sub GetWriteGroup1($$); +sub Sanitize($$); +sub ConvInv($$$$$;$$); + +my $loadedAllTables; # flag indicating we loaded all tables +my $advFmtSelf; # ExifTool object during evaluation of advanced formatting expr + +# the following is a road map of where we write each directory +# in the different types of files. +my %tiffMap = ( + IFD0 => 'TIFF', + IFD1 => 'IFD0', + XMP => 'IFD0', + ICC_Profile => 'IFD0', + ExifIFD => 'IFD0', + GPS => 'IFD0', + SubIFD => 'IFD0', + GlobParamIFD => 'IFD0', + PrintIM => 'IFD0', + IPTC => 'IFD0', + Photoshop => 'IFD0', + InteropIFD => 'ExifIFD', + MakerNotes => 'ExifIFD', + CanonVRD => 'MakerNotes', # (so VRDOffset will get updated) + NikonCapture => 'MakerNotes', # (to allow delete by group) + PhaseOne => 'MakerNotes', # (for editing PhaseOne SensorCalibration tags) +); +my %exifMap = ( + IFD1 => 'IFD0', + EXIF => 'IFD0', # to write EXIF as a block + ExifIFD => 'IFD0', + GPS => 'IFD0', + SubIFD => 'IFD0', + GlobParamIFD => 'IFD0', + PrintIM => 'IFD0', + InteropIFD => 'ExifIFD', + MakerNotes => 'ExifIFD', + NikonCapture => 'MakerNotes', # (to allow delete by group) + # (no CanonVRD trailer allowed) +); +my %jpegMap = ( + %exifMap, # covers all JPEG EXIF mappings + JFIF => 'APP0', + CIFF => 'APP0', + IFD0 => 'APP1', + XMP => 'APP1', + ICC_Profile => 'APP2', + FlashPix => 'APP2', + MPF => 'APP2', + Meta => 'APP3', + MetaIFD => 'Meta', + RMETA => 'APP5', + Ducky => 'APP12', + Photoshop => 'APP13', + Adobe => 'APP14', + IPTC => 'Photoshop', + MakerNotes => ['ExifIFD', 'CIFF'], # (first parent is the default) + CanonVRD => 'MakerNotes', # (so VRDOffset will get updated) + NikonCapture => 'MakerNotes', # (to allow delete by group) + Comment => 'COM', +); +my %dirMap = ( + JPEG => \%jpegMap, + EXV => \%jpegMap, + TIFF => \%tiffMap, + ORF => \%tiffMap, + RAW => \%tiffMap, + EXIF => \%exifMap, +); + +# module names and write functions for each writable file type +# (defaults to "$type" and "Process$type" if not defined) +# - types that are handled specially will not appear in this list +my %writableType = ( + CRW => [ 'CanonRaw', 'WriteCRW' ], + DR4 => 'CanonVRD', + EPS => [ 'PostScript', 'WritePS' ], + FLIF=> [ undef, 'WriteFLIF'], + GIF => undef, + ICC => [ 'ICC_Profile', 'WriteICC' ], + IND => 'InDesign', + JP2 => 'Jpeg2000', + JXL => 'Jpeg2000', + MIE => undef, + MOV => [ 'QuickTime', 'WriteMOV' ], + MRW => 'MinoltaRaw', + PDF => [ undef, 'WritePDF' ], + PNG => undef, + PPM => undef, + PS => [ 'PostScript', 'WritePS' ], + PSD => 'Photoshop', + RAF => [ 'FujiFilm', 'WriteRAF' ], + VRD => 'CanonVRD', + X3F => 'SigmaRaw', + XMP => [ undef, 'WriteXMP' ], +); + +# RAW file types +my %rawType = ( + '3FR'=> 1, CR3 => 1, IIQ => 1, NEF => 1, RW2 => 1, + ARQ => 1, CRW => 1, K25 => 1, NRW => 1, RWL => 1, + ARW => 1, DCR => 1, KDC => 1, ORF => 1, SR2 => 1, + ARW => 1, ERF => 1, MEF => 1, PEF => 1, SRF => 1, + CR2 => 1, FFF => 1, MOS => 1, RAW => 1, SRW => 1, +); + +# groups we are allowed to delete +# Notes: +# 1) these names must either exist in %dirMap, or be translated in InitWriteDirs()) +# 2) any dependencies must be added to %excludeGroups +my @delGroups = qw( + Adobe AFCP APP0 APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9 APP10 APP11 + APP12 APP13 APP14 APP15 CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix + FotoStation GlobParamIFD GPS ICC_Profile IFD0 IFD1 Insta360 InteropIFD IPTC + ItemList JFIF Jpeg2000 Keys MakerNotes Meta MetaIFD Microsoft MIE MPF + NikonApp NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG PNG-pHYs + PrintIM QuickTime RMETA RSRC SubIFD Trailer UserData XML XML-* XMP XMP-* +); +# family 2 group names that we can delete +my @delGroup2 = qw( + Audio Author Camera Document ExifTool Image Location Other Preview Printing + Time Video +); +# Extra groups to delete when deleting another group +my %delMore = ( + QuickTime => [ qw(ItemList UserData Keys) ], + XMP => [ 'XMP-*' ], + XML => [ 'XML-*' ], +); + +# family 0 groups where directories should never be deleted +my %permanentDir = ( QuickTime => 1, Jpeg2000 => 1 ); + +# lookup for all valid family 2 groups (lower case) +my %family2groups = map { lc $_ => 1 } @delGroup2, 'Unknown'; + +# groups we don't delete when deleting all information +my $protectedGroups = '(IFD1|SubIFD|InteropIFD|GlobParamIFD|PDF-update|Adobe)'; + +# other group names of new tag values to remove when deleting an entire group +my %removeGroups = ( + IFD0 => [ 'EXIF', 'MakerNotes' ], + EXIF => [ 'MakerNotes' ], + ExifIFD => [ 'MakerNotes', 'InteropIFD' ], + Trailer => [ 'CanonVRD' ], #(because we can add back CanonVRD as a block) +); +# related family 0/1 groups in @delGroups (and not already in %jpegMap) +# that must be removed from delete list when excluding a group +my %excludeGroups = ( + EXIF => [ qw(IFD0 IFD1 ExifIFD GPS MakerNotes GlobParamIFD InteropIFD PrintIM SubIFD) ], + IFD0 => [ 'EXIF' ], + IFD1 => [ 'EXIF' ], + ExifIFD => [ 'EXIF' ], + GPS => [ 'EXIF' ], + MakerNotes => [ 'EXIF' ], + InteropIFD => [ 'EXIF' ], + GlobParamIFD => [ 'EXIF' ], + PrintIM => [ 'EXIF' ], + CIFF => [ 'MakerNotes' ], + # technically correct, but very uncommon and not a good reason to avoid deleting trailer + # IPTC => [ qw(AFCP FotoStation Trailer) ], + AFCP => [ 'Trailer' ], + FotoStation => [ 'Trailer' ], + CanonVRD => [ 'Trailer' ], + PhotoMechanic=> [ 'Trailer' ], + MIE => [ 'Trailer' ], + QuickTime => [ qw(ItemList UserData Keys) ], +); +# translate (lower case) wanted group when writing for tags where group name may change +my %translateWantGroup = ( + ciff => 'canonraw', +); +# group names to translate for writing +my %translateWriteGroup = ( + EXIF => 'ExifIFD', + Meta => 'MetaIFD', + File => 'Comment', + # any entry in this table causes the write group to be set from the + # tag information instead of whatever the user specified... + MIE => 'MIE', + APP14 => 'APP14', +); +# names of valid EXIF and Meta directories (lower case keys): +my %exifDirs = ( + gps => 'GPS', + exififd => 'ExifIFD', + subifd => 'SubIFD', + globparamifd => 'GlobParamIFD', + interopifd => 'InteropIFD', + previewifd => 'PreviewIFD', # (in MakerNotes) + metaifd => 'MetaIFD', # Kodak APP3 Meta + makernotes => 'MakerNotes', +); +# valid family 0 groups when WriteGroup is set to "All" +my %allFam0 = ( + exif => 1, + makernotes => 1, +); + +my @writableMacOSTags = qw( + FileCreateDate MDItemFinderComment MDItemFSCreationDate MDItemFSLabel MDItemUserTags + XAttrQuarantine +); + +# min/max values for integer formats +my %intRange = ( + 'int8u' => [0, 0xff], + 'int8s' => [-0x80, 0x7f], + 'int16u' => [0, 0xffff], + 'int16uRev' => [0, 0xffff], + 'int16s' => [-0x8000, 0x7fff], + 'int32u' => [0, 0xffffffff], + 'int32s' => [-0x80000000, 0x7fffffff], + 'int64u' => [0, 18446744073709551615], + 'int64s' => [-9223372036854775808, 9223372036854775807], +); +# lookup for file types with block-writable EXIF +my %blockExifTypes = map { $_ => 1 } qw(JPEG PNG JP2 MIE EXIF FLIF MOV MP4); + +my $maxSegmentLen = 0xfffd; # maximum length of data in a JPEG segment +my $maxXMPLen = $maxSegmentLen; # maximum length of XMP data in JPEG + +# value separators when conversion list is used (in SetNewValue) +my %listSep = ( PrintConv => '; ?', ValueConv => ' ' ); + +# printConv hash keys to ignore when doing reverse lookup +my %ignorePrintConv = map { $_ => 1 } qw(OTHER BITMASK Notes); + +#------------------------------------------------------------------------------ +# Set tag value +# Inputs: 0) ExifTool object reference +# 1) tag key, tag name, or '*' (optionally prefixed by group name), +# or undef to reset all previous SetNewValue() calls +# 2) new value (scalar, scalar ref or list ref), or undef to delete tag +# 3-N) Options: +# Type => PrintConv, ValueConv or Raw - specifies value type +# AddValue => true to add to list of existing values instead of overwriting +# DelValue => true to delete this existing value value from a list, or +# or doing a conditional delete, or to shift a time value +# Group => family 0 or 1 group name (case insensitive) +# Replace => 0, 1 or 2 - overwrite previous new values (2=reset) +# Protected => bitmask to write tags with specified protections +# EditOnly => true to only edit existing tags (don't create new tag) +# EditGroup => true to only edit existing groups (don't create new group) +# Shift => undef, 0, +1 or -1 - shift value if possible +# NoFlat => treat flattened tags as 'unsafe' +# NoShortcut => true to prevent looking up shortcut tags +# ProtectSaved => protect existing new values with a save count greater than this +# IgnorePermanent => ignore attempts to delete a permanent tag +# CreateGroups => [internal use] createGroups hash ref from related tags +# ListOnly => [internal use] set only list or non-list tags +# SetTags => [internal use] hash ref to return tagInfo refs of set tags +# Sanitized => [internal use] set to avoid double-sanitizing the value +# Returns: number of tags set (plus error string in list context) +# Notes: For tag lists (like Keywords), call repeatedly with the same tag name for +# each value in the list. Internally, the new information is stored in +# the following members of the $$self{NEW_VALUE}{$tagInfo} hash: +# TagInfo - tag info ref +# DelValue - list ref for raw values to delete +# Value - list ref for raw values to add (not defined if deleting the tag) +# IsCreating - must be set for the tag to be added for the standard file types, +# otherwise just changed if it already exists. This may be +# overridden for file types with a PREFERRED metadata type. +# Set to 2 to create individual tags but not new groups +# EditOnly - flag set if tag should never be created (regardless of file type). +# If this is set, then IsCreating must be false +# CreateOnly - flag set if creating only (never edit existing tag) +# CreateGroups - hash of all family 0 group names where tag may be created +# WriteGroup - group name where information is being written (correct case) +# WantGroup - group name as specified in call to function (case insensitive) +# Next - pointer to next new value hash (if more than one) +# NoReplace - set if value was created with Replace=0 +# AddBefore - number of list items added by a subsequent Replace=0 call +# IsNVH - Flag indicating this is a new value hash +# Shift - shift value +# Save - counter used by SaveNewValues()/RestoreNewValues() +# MAKER_NOTE_FIXUP - pointer to fixup if necessary for a maker note value +sub SetNewValue($;$$%) +{ + local $_; + my ($self, $tag, $value, %options) = @_; + my ($err, $tagInfo, $family); + my $verbose = $$self{OPTIONS}{Verbose}; + my $out = $$self{OPTIONS}{TextOut}; + my $protected = $options{Protected} || 0; + my $listOnly = $options{ListOnly}; + my $setTags = $options{SetTags}; + my $noFlat = $options{NoFlat}; + my $numSet = 0; + + unless (defined $tag) { + delete $$self{NEW_VALUE}; + $$self{SAVE_COUNT} = 0; + $$self{DEL_GROUP} = { }; + return 1; + } + # allow value to be scalar or list reference + if (ref $value) { + if (ref $value eq 'ARRAY') { + # value is an ARRAY so it may have more than one entry + # - set values both separately and as a combined string if there are more than one + if (@$value > 1) { + # set all list-type tags first + my $replace = $options{Replace}; + my $noJoin; + foreach (@$value) { + $noJoin = 1 if ref $_; + my ($n, $e) = SetNewValue($self, $tag, $_, %options, ListOnly => 1); + $err = $e if $e; + $numSet += $n; + delete $options{Replace}; # don't replace earlier values in list + } + return $numSet if $noJoin; # don't join if list contains objects + # and now set only non-list tags + $value = join $$self{OPTIONS}{ListSep}, @$value; + $options{Replace} = $replace; + $listOnly = $options{ListOnly} = 0; + } else { + $value = $$value[0]; + $value = $$value if ref $value eq 'SCALAR'; # (handle single scalar ref in a list) + } + } elsif (ref $value eq 'SCALAR') { + $value = $$value; + } + } + # un-escape as necessary and make sure the Perl UTF-8 flag is OFF for the value + # if perl is 5.6 or greater (otherwise our byte manipulations get corrupted!!) + $self->Sanitize(\$value) if defined $value and not ref $value and not $options{Sanitized}; + + # set group name in options if specified + ($options{Group}, $tag) = ($1, $2) if $tag =~ /(.*):(.+)/; + + # allow trailing '#' for ValueConv value + $options{Type} = 'ValueConv' if $tag =~ s/#$//; + my $convType = $options{Type} || ($$self{OPTIONS}{PrintConv} ? 'PrintConv' : 'ValueConv'); + + # filter value if necessary + $self->Filter($$self{OPTIONS}{FilterW}, \$value) or return 0 if $convType eq 'PrintConv'; + + my (@wantGroup, $family2); + my $wantGroup = $options{Group}; + if ($wantGroup) { + foreach (split /:/, $wantGroup) { + next unless length($_) and /^(\d+)?(.*)/; # separate family number and group name + my ($f, $g) = ($1, $2); + my $lcg = lc $g; + # save group/family unless '*' or 'all' + push @wantGroup, [ $f, $lcg ] unless $lcg eq '*' or $lcg eq 'all'; + if ($g =~ s/^ID-//i) { # family 7 is a tag ID + return 0 if defined $f and $f ne 7; + $wantGroup[-1] = [ 7, $g ]; # group name with 'ID-' removed and case preserved + } elsif (defined $f) { + $f > 2 and return 0; # only allow family 0, 1 or 2 + $family2 = 1 if $f == 2; # set flag indicating family 2 was used + } else { + $family2 = 1 if $family2groups{$lcg}; + } + } + undef $wantGroup unless @wantGroup; + } + + $tag =~ s/ .*//; # convert from tag key to tag name if necessary + $tag = '*' if lc($tag) eq 'all'; # use '*' instead of 'all' +# +# handle group delete +# + while ($tag eq '*' and not defined $value and not $family2 and @wantGroup < 2) { + # set groups to delete + my (@del, $grp); + my $remove = ($options{Replace} and $options{Replace} > 1); + if ($wantGroup) { + @del = grep /^$wantGroup$/i, @delGroups unless $wantGroup =~ /^XM[LP]-\*$/i; + # remove associated groups when excluding from mass delete + if (@del and $remove) { + # remove associated groups in other family + push @del, @{$excludeGroups{$del[0]}} if $excludeGroups{$del[0]}; + # remove upstream groups according to JPEG map + my $dirName = $del[0]; + my @dirNames; + for (;;) { + my $parent = $jpegMap{$dirName}; + if (ref $parent) { + push @dirNames, @$parent; + $parent = pop @dirNames; + } + $dirName = $parent || shift @dirNames or last; + push @del, $dirName; # exclude this too + } + } + # allow MIE groups to be deleted by number, + # and allow any XMP family 1 group to be deleted + push @del, uc($wantGroup) if $wantGroup =~ /^(MIE\d+|XM[LP]-[-\w]*\w)$/i; + } else { + # push all groups plus '*', except the protected groups + push @del, (grep !/^$protectedGroups$/, @delGroups), '*'; + } + if (@del) { + ++$numSet; + my @donegrps; + my $delGroup = $$self{DEL_GROUP}; + foreach $grp (@del) { + if ($remove) { + my $didExcl; + if ($grp =~ /^(XM[LP])(-.*)?$/) { + my $x = $1; + if ($grp eq $x) { + # exclude all related family 1 groups too + foreach (keys %$delGroup) { + next unless /^(-?)$x-/; + push @donegrps, $_ unless $1; + delete $$delGroup{$_}; + } + } elsif ($$delGroup{"$x-*"} and not $$delGroup{"-$grp"}) { + # must also exclude XMP or XML to prevent bulk delete + if ($$delGroup{$x}) { + push @donegrps, $x; + delete $$delGroup{$x}; + } + # flag XMP/XML family 1 group for exclusion with leading '-' + $$delGroup{"-$grp"} = 1; + $didExcl = 1; + } + } + if (exists $$delGroup{$grp}) { + delete $$delGroup{$grp}; + } else { + next unless $didExcl; + } + } else { + $$delGroup{$grp} = 1; + # add extra groups to delete if necessary + if ($delMore{$grp}) { + $$delGroup{$_} = 1, push @donegrps, $_ foreach @{$delMore{$grp}}; + } + # remove all of this group from previous new values + $self->RemoveNewValuesForGroup($grp); + } + push @donegrps, $grp; + } + if ($verbose > 1 and @donegrps) { + @donegrps = sort @donegrps; + my $msg = $remove ? 'Excluding from deletion' : 'Deleting tags in'; + print $out " $msg: @donegrps\n"; + } + } elsif (grep /^$wantGroup$/i, @delGroup2) { + last; # allow tags to be deleted by group2 name + } else { + $err = "Not a deletable group: $wantGroup"; + } + # all done + return ($numSet, $err) if wantarray; + $err and warn "$err\n"; + return $numSet; + } + + # initialize write/create flags + my $createOnly; + my $editOnly = $options{EditOnly}; + my $editGroup = $options{EditGroup}; + my $writeMode = $$self{OPTIONS}{WriteMode}; + if ($writeMode ne 'wcg') { + $createOnly = 1 if $writeMode !~ /w/i; # don't write existing tags + if ($writeMode !~ /c/i) { + return 0 if $createOnly; # nothing to do unless writing existing tags + $editOnly = 1; # don't create new tags + } elsif ($writeMode !~ /g/i) { + $editGroup = 1; # don't create new groups + } + } + my ($ifdName, $mieGroup, $movGroup, $fg); + # set family 1 group names + foreach $fg (@wantGroup) { + next if defined $$fg[0] and $$fg[0] != 1; + $_ = $$fg[1]; + # set $ifdName if this group is a valid IFD or SubIFD name + my $grpName; + if (/^IFD(\d+)$/i) { + $grpName = $ifdName = "IFD$1"; + } elsif (/^SubIFD(\d+)$/i) { + $grpName = $ifdName = "SubIFD$1"; + } elsif (/^Version(\d+)$/i) { + $grpName = $ifdName = "Version$1"; # Sony IDC VersionIFD + } elsif ($exifDirs{$_}) { + $grpName = $exifDirs{$_}; + $ifdName = $grpName unless $ifdName and $allFam0{$_}; + } elsif ($allFam0{$_}) { + $grpName = $allFam0{$_}; + } elsif (/^Track(\d+)$/i) { + $grpName = $movGroup = "Track$1"; # QuickTime track + } elsif (/^MIE(\d*-?)(\w+)$/i) { + $grpName = $mieGroup = "MIE$1" . ucfirst(lc($2)); + } elsif (not $ifdName and /^XMP\b/i) { + # must load XMP table to set group1 names + my $table = GetTagTable('Image::ExifTool::XMP::Main'); + my $writeProc = $$table{WRITE_PROC}; + if ($writeProc) { + no strict 'refs'; + &$writeProc(); + } + } + # fix case for known groups + $wantGroup =~ s/$grpName/$grpName/i if $grpName and $grpName ne $_; + } +# +# get list of tags we want to set +# + my $origTag = $tag; + my @matchingTags = FindTagInfo($tag); + until (@matchingTags) { + my $langCode; + # allow language suffix of form "-en_CA" or "-<rfc3066>" on tag name + if ($tag =~ /^([?*\w]+)-([a-z]{2})(_[a-z]{2})$/i or # MIE + $tag =~ /^([?*\w]+)-([a-z]{2,3}|[xi])(-[a-z\d]{2,8}(-[a-z\d]{1,8})*)?$/i) # XMP/PNG/QuickTime + { + $tag = $1; + # normalize case of language codes + $langCode = lc($2); + $langCode .= (length($3) == 3 ? uc($3) : lc($3)) if $3; + my @newMatches = FindTagInfo($tag); + foreach $tagInfo (@newMatches) { + # only allow language codes in tables which support them + next unless $$tagInfo{Table}; + my $langInfoProc = $$tagInfo{Table}{LANG_INFO} or next; + my $langInfo = &$langInfoProc($tagInfo, $langCode); + push @matchingTags, $langInfo if $langInfo; + } + last if @matchingTags; + } elsif (not $options{NoShortcut}) { + # look for a shortcut or alias + require Image::ExifTool::Shortcuts; + my ($match) = grep /^\Q$tag\E$/i, keys %Image::ExifTool::Shortcuts::Main; + undef $err; + if ($match) { + $options{NoShortcut} = $options{Sanitized} = 1; + foreach $tag (@{$Image::ExifTool::Shortcuts::Main{$match}}) { + my ($n, $e) = $self->SetNewValue($tag, $value, %options); + $numSet += $n; + $e and $err = $e; + } + undef $err if $numSet; # no error if any set successfully + return ($numSet, $err) if wantarray; + $err and warn "$err\n"; + return $numSet; + } + } + unless ($listOnly) { + if (not TagExists($tag)) { + if ($tag =~ /^[-\w*?]+$/) { + my $pre = $wantGroup ? $wantGroup . ':' : ''; + $err = "Tag '$pre${origTag}' is not defined"; + $err .= ' or has a bad language code' if $origTag =~ /-/; + if (not $pre and uc($origTag) eq 'TAG') { + $err .= " (specify a writable tag name, not '${origTag}' literally)" + } + } else { + $err = "Invalid tag name '${tag}'"; + $err .= " (remove the leading '\$')" if $tag =~ /^\$/; + } + } elsif ($langCode) { + $err = "Tag '${tag}' does not support alternate languages"; + } elsif ($wantGroup) { + $err = "Sorry, $wantGroup:$origTag doesn't exist or isn't writable"; + } else { + $err = "Sorry, $origTag is not writable"; + } + $verbose > 2 and print $out "$err\n"; + } + # all done + return ($numSet, $err) if wantarray; + $err and warn "$err\n"; + return $numSet; + } + # get group name that we're looking for + my $foundMatch = 0; +# +# determine the groups for all tags found, and the tag with +# the highest priority group +# + my (@tagInfoList, @writeAlsoList, %writeGroup, %preferred, %tagPriority); + my (%avoid, $wasProtected, $noCreate, %highestPriority, %highestQT); + +TAG: foreach $tagInfo (@matchingTags) { + $tag = $$tagInfo{Name}; # get tag name for warnings + my $lcTag = lc $tag; # get lower-case tag name for use in variables + # initialize highest priority if we are starting a new tag + $highestPriority{$lcTag} = -999 unless defined $highestPriority{$lcTag}; + my ($priority, $writeGroup); + my $prfTag = defined $$tagInfo{Preferred} ? $$tagInfo{Preferred} : $$tagInfo{Table}{PREFERRED}; + if ($wantGroup) { + # a WriteGroup of All is special + my $wgAll = ($$tagInfo{WriteGroup} and $$tagInfo{WriteGroup} eq 'All'); + my @grp = $self->GetGroup($tagInfo); + my $hiPri = 1000; + foreach $fg (@wantGroup) { + my ($fam, $lcWant) = @$fg; + $lcWant = $translateWantGroup{$lcWant} if $translateWantGroup{$lcWant}; + # only set tag in specified group + # bump priority of preferred tag + $hiPri += $prfTag if $prfTag; + if (not defined $fam) { + if ($lcWant eq lc $grp[0]) { + # don't go to more general write group of "All" + # if something more specific was wanted + $writeGroup = $grp[0] if $wgAll and not $writeGroup; + next; + } + next if $lcWant eq lc $grp[2]; + } elsif ($fam == 7) { + next if IsSameID($$tagInfo{TagID}, $lcWant); + } elsif ($fam != 1 and not $$tagInfo{AllowGroup}) { + next if $lcWant eq lc $grp[$fam]; + if ($wgAll and not $fam and $allFam0{$lcWant}) { + $writeGroup or $writeGroup = $allFam0{$lcWant}; + next; + } + next TAG; # wrong group + } + # handle family 1 groups specially + if ($grp[0] eq 'EXIF' or $grp[0] eq 'SonyIDC' or $wgAll) { + unless ($ifdName and $lcWant eq lc $ifdName) { + next TAG unless $wgAll and not $fam and $allFam0{$lcWant}; + $writeGroup = $allFam0{$lcWant} unless $writeGroup; + next; + } + next TAG if $wgAll and $allFam0{$lcWant} and $fam; + # can't yet write PreviewIFD tags (except for image) + $lcWant eq 'PreviewIFD' and ++$foundMatch, next TAG; + $writeGroup = $ifdName; # write to the specified IFD + } elsif ($grp[0] eq 'QuickTime') { + if ($grp[1] eq 'Track#') { + next TAG unless $movGroup and $lcWant eq lc($movGroup); + $writeGroup = $movGroup; + } else { + my $grp = $$tagInfo{Table}{WRITE_GROUP}; + next TAG unless $grp and $lcWant eq lc $grp; + $writeGroup = $grp; + } + } elsif ($grp[0] eq 'MIE') { + next TAG unless $mieGroup and $lcWant eq lc($mieGroup); + $writeGroup = $mieGroup; # write to specific MIE group + # set specific write group with document number if specified + if ($writeGroup =~ /^MIE\d+$/ and $$tagInfo{Table}{WRITE_GROUP}) { + $writeGroup = $$tagInfo{Table}{WRITE_GROUP}; + $writeGroup =~ s/^MIE/$mieGroup/; + } + } elsif (not $$tagInfo{AllowGroup} or $lcWant !~ /^$$tagInfo{AllowGroup}$/i) { + # allow group1 name to be specified + next TAG unless $lcWant eq lc $grp[1]; + } + } + $writeGroup or $writeGroup = ($$tagInfo{WriteGroup} || $$tagInfo{Table}{WRITE_GROUP} || $grp[0]); + $priority = $hiPri; # highest priority since group was specified + } + ++$foundMatch; + # must do a dummy call to the write proc to autoload write package + # before checking Writable flag + my $table = $$tagInfo{Table}; + my $writeProc = $$table{WRITE_PROC}; + # load source table if this was a user-defined table + if ($$table{SRC_TABLE}) { + my $src = GetTagTable($$table{SRC_TABLE}); + $writeProc = $$src{WRITE_PROC} unless $writeProc; + } + { + no strict 'refs'; + next unless $writeProc and &$writeProc(); + } + # must still check writable flags in case of UserDefined tags + my $writable = $$tagInfo{Writable}; + next unless $writable or ($$table{WRITABLE} and + not defined $writable and not $$tagInfo{SubDirectory}); + # set specific write group (if we didn't already) + if (not $writeGroup or ($translateWriteGroup{$writeGroup} and + (not $$tagInfo{WriteGroup} or $$tagInfo{WriteGroup} ne 'All'))) + { + # use default write group + $writeGroup = $$tagInfo{WriteGroup} || $$tagInfo{Table}{WRITE_GROUP}; + # use group 0 name if no WriteGroup specified + my $group0 = $self->GetGroup($tagInfo, 0); + $writeGroup or $writeGroup = $group0; + # get priority for this group + unless ($priority) { + $priority = $$self{WRITE_PRIORITY}{lc($writeGroup)}; + unless ($priority) { + $priority = $$self{WRITE_PRIORITY}{lc($group0)} || 0; + } + } + # adjust priority based on Preferred level for this tag + $priority += $prfTag if $prfTag; + } + # don't write tag if protected + my $prot = $$tagInfo{Protected}; + $prot = 1 if $noFlat and defined $$tagInfo{Flat}; + if ($prot) { + $prot &= ~$protected; + if ($prot) { + my %lkup = ( 1=>'unsafe', 2=>'protected', 3=>'unsafe and protected'); + $wasProtected = $lkup{$prot}; + if ($verbose > 1) { + my $wgrp1 = $self->GetWriteGroup1($tagInfo, $writeGroup); + print $out "Sorry, $wgrp1:$tag is $wasProtected for writing\n"; + } + next; + } + } + # set priority for this tag + $tagPriority{$tagInfo} = $priority; + # keep track of highest priority QuickTime tag + $highestQT{$lcTag} = $priority if $$table{GROUPS}{0} eq 'QuickTime' and + (not defined $highestQT{$lcTag} or $highestQT{$lcTag} < $priority); + if ($priority > $highestPriority{$lcTag}) { + $highestPriority{$lcTag} = $priority; + $preferred{$lcTag} = { $tagInfo => 1 }; + $avoid{$lcTag} = $$tagInfo{Avoid} ? 1 : 0; + } elsif ($priority == $highestPriority{$lcTag}) { + # create all tags with highest priority + $preferred{$lcTag}{$tagInfo} = 1; + ++$avoid{$lcTag} if $$tagInfo{Avoid}; + } + if ($$tagInfo{WriteAlso}) { + # store WriteAlso tags separately so we can set them first + push @writeAlsoList, $tagInfo; + } else { + push @tagInfoList, $tagInfo; + } + # special case to allow override of XMP WriteGroup + if ($writeGroup eq 'XMP') { + my $wg = $$tagInfo{WriteGroup} || $$table{WRITE_GROUP}; + $writeGroup = $wg if $wg; + } + $writeGroup{$tagInfo} = $writeGroup; + } + # sort tag info list in reverse order of priority (highest number last) + # so we get the highest priority error message in the end + @tagInfoList = sort { $tagPriority{$a} <=> $tagPriority{$b} } @tagInfoList; + # must write any tags which also write other tags first + unshift @tagInfoList, @writeAlsoList if @writeAlsoList; + + # check priorities for each set of tags we are writing + my $lcTag; + foreach $lcTag (keys %preferred) { + # don't create tags with priority 0 if group priorities are set + if ($preferred{$lcTag} and $highestPriority{$lcTag} == 0 and + %{$$self{WRITE_PRIORITY}}) + { + delete $preferred{$lcTag} + } + # avoid creating tags with 'Avoid' flag set if there are other alternatives + if ($avoid{$lcTag} and $preferred{$lcTag}) { + if ($avoid{$lcTag} < scalar(keys %{$preferred{$lcTag}})) { + # just remove the 'Avoid' tags since there are other preferred tags + foreach $tagInfo (@tagInfoList) { + next unless $lcTag eq lc $$tagInfo{Name}; + delete $preferred{$lcTag}{$tagInfo} if $$tagInfo{Avoid}; + } + } elsif ($highestPriority{$lcTag} < 1000) { + # look for another priority tag to create instead + my $nextHighest = 0; + my @nextBestTags; + foreach $tagInfo (@tagInfoList) { + next unless $lcTag eq lc $$tagInfo{Name}; + my $priority = $tagPriority{$tagInfo} or next; + next if $priority == $highestPriority{$lcTag}; + next if $priority < $nextHighest; + my $permanent = $$tagInfo{Permanent}; + $permanent = $$tagInfo{Table}{PERMANENT} unless defined $permanent; + next if $$tagInfo{Avoid} or $permanent; + next if $writeGroup{$tagInfo} eq 'MakerNotes'; + if ($nextHighest < $priority) { + $nextHighest = $priority; + undef @nextBestTags; + } + push @nextBestTags, $tagInfo; + } + if (@nextBestTags) { + # change our preferred tags to the next best tags + delete $preferred{$lcTag}; + foreach $tagInfo (@nextBestTags) { + $preferred{$lcTag}{$tagInfo} = 1; + } + } + } + } + } +# +# generate new value hash for each tag +# + my ($prioritySet, $createGroups, %alsoWrote); + + delete $$self{CHECK_WARN}; # reset CHECK_PROC warnings + + # loop through all valid tags to find the one(s) to write + foreach $tagInfo (@tagInfoList) { + next if $alsoWrote{$tagInfo}; # don't rewrite tags we already wrote + # only process List or non-List tags if specified + next if defined $listOnly and ($listOnly xor $$tagInfo{List}); + my $noConv; + my $writeGroup = $writeGroup{$tagInfo}; + my $permanent = $$tagInfo{Permanent}; + $permanent = $$tagInfo{Table}{PERMANENT} unless defined $permanent; + $writeGroup eq 'MakerNotes' and $permanent = 1 unless defined $permanent; + my $wgrp1 = $self->GetWriteGroup1($tagInfo, $writeGroup); + $tag = $$tagInfo{Name}; # get tag name for warnings + my $lcTag = lc $tag; + my $pref = $preferred{$lcTag} || { }; + my $shift = $options{Shift}; + my $addValue = $options{AddValue}; + if (defined $shift) { + # (can't currently shift list-type tags) + my $shiftable; + if ($$tagInfo{List}) { + $shiftable = ''; # can add/delete but not shift + } else { + $shiftable = $$tagInfo{Shift}; + unless ($shift) { + # set shift according to AddValue/DelValue + $shift = 1 if $addValue; + # can shift a date/time with -=, but this is + # a conditional delete operation for other tags + $shift = -1 if $options{DelValue} and defined $shiftable and $shiftable eq 'Time'; + } + if ($shift and (not defined $value or not length $value)) { + # (now allow -= to be used for shiftable tag - v8.05) + #$err = "No value for time shift of $wgrp1:$tag"; + #$verbose > 2 and print $out "$err\n"; + #next; + undef $shift; + } + } + # can't shift List-type tag + if ((defined $shiftable and not $shiftable) and + # and don't try to conditionally delete if Shift is "0" + ($shift or ($shiftable eq '0' and $options{DelValue}))) + { + $err = "$wgrp1:$tag is not shiftable"; + $verbose and print $out "$err\n"; + next; + } + } + my $val = $value; + if (defined $val) { + # check to make sure this is a List or Shift tag if adding + if ($addValue and not ($shift or $$tagInfo{List})) { + if ($addValue eq '2') { + undef $addValue; # quietly reset this option + } else { + $err = "Can't add $wgrp1:$tag (not a List type)"; + $verbose > 2 and print $out "$err\n"; + next; + } + } + if ($shift) { + if ($$tagInfo{Shift} and $$tagInfo{Shift} eq 'Time') { + # add '+' or '-' prefix to indicate shift direction + $val = ($shift > 0 ? '+' : '-') . $val; + # check the shift for validity + require 'Image/ExifTool/Shift.pl'; + my $err2 = CheckShift($$tagInfo{Shift}, $val); + if ($err2) { + $err = "$err2 for $wgrp1:$tag"; + $verbose > 2 and print $out "$err\n"; + next; + } + } elsif (IsFloat($val)) { + $val *= $shift; + } else { + $err = "Shift value for $wgrp1:$tag is not a number"; + $verbose > 2 and print $out "$err\n"; + next; + } + $noConv = 1; # no conversions if shifting tag + } elsif (not length $val and $options{DelValue}) { + $noConv = 1; # no conversions for deleting empty value + } elsif (ref $val eq 'HASH' and not $$tagInfo{Struct}) { + $err = "Can't write a structure to $wgrp1:$tag"; + $verbose > 2 and print $out "$err\n"; + next; + } + } elsif ($permanent) { + return 0 if $options{IgnorePermanent}; + # can't delete permanent tags, so set them to DelValue or empty string instead + if (defined $$tagInfo{DelValue}) { + $val = $$tagInfo{DelValue}; + $noConv = 1; # DelValue is the raw value, so no conversion necessary + } else { + $val = ''; + } + } elsif ($addValue or $options{DelValue}) { + $err = "No value to add or delete in $wgrp1:$tag"; + $verbose > 2 and print $out "$err\n"; + next; + } else { + if ($$tagInfo{DelCheck}) { + #### eval DelCheck ($self, $tagInfo, $wantGroup) + my $err2 = eval $$tagInfo{DelCheck}; + $@ and warn($@), $err2 = 'Error evaluating DelCheck'; + if (defined $err2) { + # (allow other tags to be set using DelCheck as a hook) + $err2 or goto WriteAlso; # GOTO! + $err2 .= ' for' unless $err2 =~ /delete$/; + $err = "$err2 $wgrp1:$tag"; + $verbose > 2 and print $out "$err\n"; + next; + } + } + # set group delete flag if this tag represents an entire group + if ($$tagInfo{DelGroup} and not $options{DelValue}) { + my @del = ( $tag ); + $$self{DEL_GROUP}{$tag} = 1; + # delete extra groups if necessary + if ($delMore{$tag}) { + $$self{DEL_GROUP}{$_} = 1, push(@del,$_) foreach @{$delMore{$tag}}; + } + # remove all of this group from previous new values + $self->RemoveNewValuesForGroup($tag); + $verbose and print $out " Deleting tags in: @del\n"; + ++$numSet; + next; + } + $noConv = 1; # value is not defined, so don't do conversion + } + # apply inverse PrintConv and ValueConv conversions + # save ValueConv setting for use in ConvInv() + unless ($noConv) { + # set default conversion type used by ConvInv() and CHECK_PROC routines + $$self{ConvType} = $convType; + my $e; + ($val,$e) = $self->ConvInv($val,$tagInfo,$tag,$wgrp1,$$self{ConvType},$wantGroup); + if (defined $e) { + # empty error string causes error to be ignored without setting the value + $e or goto WriteAlso; # GOTO! + $err = $e; + } + } + if (not defined $val and defined $value) { + # if value conversion failed, we must still add a NEW_VALUE + # entry for this tag it it was a DelValue + next unless $options{DelValue}; + $val = 'xxx never delete xxx'; + } + $$self{NEW_VALUE} or $$self{NEW_VALUE} = { }; + if ($options{Replace}) { + # delete the previous new value + $self->GetNewValueHash($tagInfo, $writeGroup, 'delete', $options{ProtectSaved}); + # also delete related tag previous new values + if ($$tagInfo{WriteAlso}) { + my ($wgrp, $wtag); + if ($$tagInfo{WriteGroup} and $$tagInfo{WriteGroup} eq 'All' and $writeGroup) { + $wgrp = $writeGroup . ':'; + } else { + $wgrp = ''; + } + foreach $wtag (sort keys %{$$tagInfo{WriteAlso}}) { + my ($n,$e) = $self->SetNewValue($wgrp . $wtag, undef, Replace=>2); + $numSet += $n; + } + } + $options{Replace} == 2 and ++$numSet, next; + } + + if (defined $val) { + # we are editing this tag, so create a NEW_VALUE hash entry + my $nvHash = $self->GetNewValueHash($tagInfo, $writeGroup, 'create', + $options{ProtectSaved}, ($options{DelValue} and not $shift)); + # ignore new values protected with ProtectSaved + $nvHash or ++$numSet, next; # (increment $numSet to avoid warning) + $$nvHash{NoReplace} = 1 if $$tagInfo{List} and not $options{Replace}; + $$nvHash{WantGroup} = $wantGroup; + $$nvHash{EditOnly} = 1 if $editOnly; + # save maker note information if writing maker notes + if ($$tagInfo{MakerNotes}) { + $$nvHash{MAKER_NOTE_FIXUP} = $$self{MAKER_NOTE_FIXUP}; + } + if ($createOnly) { # create only (never edit) + # empty item in DelValue list to never edit existing value + $$nvHash{DelValue} = [ '' ]; + $$nvHash{CreateOnly} = 1; + } elsif ($options{DelValue} or $addValue or $shift) { + # flag any AddValue or DelValue by creating the DelValue list + $$nvHash{DelValue} or $$nvHash{DelValue} = [ ]; + if ($shift) { + # add shift value to list + $$nvHash{Shift} = $val; + } elsif ($options{DelValue}) { + # don't create if we are replacing a specific value + $$nvHash{IsCreating} = 0 unless $val eq '' or $$tagInfo{List}; + # add delete value to list + push @{$$nvHash{DelValue}}, ref $val eq 'ARRAY' ? @$val : $val; + if ($verbose > 1) { + my $verb = $permanent ? 'Replacing' : 'Deleting'; + my $fromList = $$tagInfo{List} ? ' from list' : ''; + my @vals = (ref $val eq 'ARRAY' ? @$val : $val); + foreach (@vals) { + if (ref $_ eq 'HASH') { + require 'Image/ExifTool/XMPStruct.pl'; + $_ = Image::ExifTool::XMP::SerializeStruct($_); + } + print $out "$verb $wgrp1:$tag$fromList if value is '${_}'\n"; + } + } + } + } + # set priority flag to add only the high priority info + # (will only create the priority tag if it doesn't exist, + # others get changed only if they already exist) + my $prf = defined $$tagInfo{Preferred} ? $$tagInfo{Preferred} : $$tagInfo{Table}{PREFERRED}; + # hack to prefer only a single tag in the QuickTime group + if ($$tagInfo{Table}{GROUPS}{0} eq 'QuickTime') { + $prf = 0 if $tagPriority{$tagInfo} < $highestQT{$lcTag}; + } + if ($$pref{$tagInfo} or $prf) { + if ($permanent or $shift) { + # don't create permanent or Shift-ed tag but define IsCreating + # so we know that it is the preferred tag + $$nvHash{IsCreating} = 0; + } elsif (($$tagInfo{List} and not $options{DelValue}) or + not ($$nvHash{DelValue} and @{$$nvHash{DelValue}}) or + # also create tag if any DelValue value is empty ('') + grep(/^$/,@{$$nvHash{DelValue}})) + { + $$nvHash{IsCreating} = $editOnly ? 0 : ($editGroup ? 2 : 1); + # add to hash of groups where this tag is being created + $createGroups or $createGroups = $options{CreateGroups} || { }; + $$createGroups{$self->GetGroup($tagInfo, 0)} = 1; + $$nvHash{CreateGroups} = $createGroups; + } + } + if ($$nvHash{IsCreating}) { + if (%{$$self{DEL_GROUP}}) { + my ($grp, @grps); + foreach $grp (keys %{$$self{DEL_GROUP}}) { + next if $$self{DEL_GROUP}{$grp} == 2; + # set flag indicating tags were written after this group was deleted + $$self{DEL_GROUP}{$grp} = 2; + push @grps, $grp; + } + if ($verbose > 1 and @grps) { + @grps = sort @grps; + print $out " Writing new tags after deleting groups: @grps\n"; + } + } + } elsif ($createOnly) { + $noCreate = $permanent ? 'permanent' : ($$tagInfo{Avoid} ? 'avoided' : ''); + $noCreate or $noCreate = $shift ? 'shifting' : 'not preferred'; + $verbose > 2 and print $out "Not creating $wgrp1:$tag ($noCreate)\n"; + next; # nothing to do (not creating and not editing) + } + if ($shift or not $options{DelValue}) { + $$nvHash{Value} or $$nvHash{Value} = [ ]; + if (not $$tagInfo{List}) { + # not a List tag -- overwrite existing value + $$nvHash{Value}[0] = $val; + } elsif (defined $$nvHash{AddBefore} and @{$$nvHash{Value}} >= $$nvHash{AddBefore}) { + # values from a later argument have been added (ie. Replace=0) + # to this list, so the new values should come before these + splice @{$$nvHash{Value}}, -$$nvHash{AddBefore}, 0, ref $val eq 'ARRAY' ? @$val : $val; + } else { + # add at end of existing list + push @{$$nvHash{Value}}, ref $val eq 'ARRAY' ? @$val : $val; + } + if ($verbose > 1) { + my $ifExists = $$nvHash{IsCreating} ? ( $createOnly ? + ($$nvHash{IsCreating} == 2 ? + " if $writeGroup exists and tag doesn't" : + " if tag doesn't exist") : + ($$nvHash{IsCreating} == 2 ? " if $writeGroup exists" : '')) : + (($$nvHash{DelValue} and @{$$nvHash{DelValue}}) ? + ' if tag was deleted' : ' if tag exists'); + my $verb = ($shift ? 'Shifting' : ($addValue ? 'Adding' : 'Writing')); + print $out "$verb $wgrp1:$tag$ifExists\n"; + } + } + } elsif ($permanent) { + $err = "Can't delete Permanent tag $wgrp1:$tag"; + $verbose > 1 and print $out "$err\n"; + next; + } elsif ($addValue or $options{DelValue}) { + $verbose > 1 and print $out "Adding/Deleting nothing does nothing\n"; + next; + } else { + # create empty new value hash entry to delete this tag + $self->GetNewValueHash($tagInfo, $writeGroup, 'delete'); + my $nvHash = $self->GetNewValueHash($tagInfo, $writeGroup, 'create'); + $$nvHash{WantGroup} = $wantGroup; + $verbose > 1 and print $out "Deleting $wgrp1:$tag\n"; + } + $$setTags{$tagInfo} = 1 if $setTags; + $prioritySet = 1 if $$pref{$tagInfo}; +WriteAlso: + ++$numSet; + # also write related tags + my $writeAlso = $$tagInfo{WriteAlso}; + if ($writeAlso) { + my ($wgrp, $wtag, $n); + if ($$tagInfo{WriteGroup} and $$tagInfo{WriteGroup} eq 'All' and $writeGroup) { + $wgrp = $writeGroup . ':'; + } else { + $wgrp = ''; + } + local $SIG{'__WARN__'} = \&SetWarning; + foreach $wtag (sort keys %$writeAlso) { + my %opts = ( + Type => 'ValueConv', + Protected => $protected | 0x02, + AddValue => $addValue, + DelValue => $options{DelValue}, + Shift => $options{Shift}, + Replace => $options{Replace}, # handle lists properly + CreateGroups=> $createGroups, + SetTags => \%alsoWrote, # remember tags already written + ); + undef $evalWarning; + #### eval WriteAlso ($val) + my $v = eval $$writeAlso{$wtag}; + # we wanted to do the eval in case there are side effect, but we + # don't want to write a value for a tag that is being deleted: + undef $v unless defined $val; + $@ and $evalWarning = $@; + unless ($evalWarning) { + ($n,$evalWarning) = $self->SetNewValue($wgrp . $wtag, $v, %opts); + $numSet += $n; + # count this as being set if any related tag is set + $prioritySet = 1 if $n and $$pref{$tagInfo}; + } + if ($evalWarning and (not $err or $verbose > 2)) { + my $str = CleanWarning(); + if ($str) { + $str .= " for $wtag" unless $str =~ / for [-\w:]+$/; + $str .= " in $wgrp1:$tag (WriteAlso)"; + $err or $err = $str; + print $out "$str\n" if $verbose > 2; + } + } + } + } + } + # print warning if we couldn't set our priority tag + if (defined $err and not $prioritySet) { + warn "$err\n" if $err and not wantarray; + } elsif (not $numSet) { + my $pre = $wantGroup ? $wantGroup . ':' : ''; + if ($wasProtected) { + $verbose = 0; # we already printed this verbose message + unless ($options{Replace} and $options{Replace} == 2) { + $err = "Sorry, $pre$tag is $wasProtected for writing"; + } + } elsif (not $listOnly) { + if ($origTag =~ /[?*]/) { + if ($noCreate) { + $err = "No tags matching 'pre${origTag}' will be created"; + $verbose = 0; # (already printed) + } elsif ($foundMatch) { + $err = "Sorry, no writable tags matching '$pre${origTag}'"; + } else { + $err = "No matching tags for '$pre${origTag}'"; + } + } elsif ($noCreate) { + $err = "Not creating $pre$tag"; + $verbose = 0; # (already printed) + } elsif ($foundMatch) { + $err = "Sorry, $pre$tag is not writable"; + } elsif ($wantGroup and @matchingTags) { + $err = "Sorry, $pre$tag doesn't exist or isn't writable"; + } else { + $err = "Tag '$pre${tag}' is not defined"; + } + } + if ($err) { + $verbose > 2 and print $out "$err\n"; + warn "$err\n" unless wantarray; + } + } elsif ($$self{CHECK_WARN}) { + $err = $$self{CHECK_WARN}; + $verbose > 2 and print $out "$err\n"; + } elsif ($err and not $verbose) { + undef $err; + } + return ($numSet, $err) if wantarray; + return $numSet; +} + +#------------------------------------------------------------------------------ +# set new values from information in specified file +# Inputs: 0) ExifTool object reference, 1) source file name or reference, etc +# 2-N) List of tags to set (or all if none specified), or reference(s) to +# hash for options to pass to SetNewValue. The Replace option defaults +# to 1 for SetNewValuesFromFile -- set this to 0 to allow multiple tags +# to be copied to a list +# Returns: Hash of information set successfully (includes Warning or Error messages) +# Notes: Tag names may contain a group prefix, a leading '-' to exclude from copy, +# and/or a trailing '#' to copy the ValueConv value. The tag name '*' may +# be used to represent all tags in a group. An optional destination tag +# may be specified with '>DSTTAG' ('DSTTAG<TAG' also works, but in this +# case the source tag may also be an expression involving tag names). +sub SetNewValuesFromFile($$;@) +{ + local $_; + my ($self, $srcFile, @setTags) = @_; + my ($key, $tag, @exclude, @reqTags); + + # get initial SetNewValuesFromFile options + my %opts = ( Replace => 1 ); # replace existing list items by default + while (ref $setTags[0] eq 'HASH') { + $_ = shift @setTags; + foreach $key (keys %$_) { + $opts{$key} = $$_{$key}; + } + } + # expand shortcuts + @setTags and ExpandShortcuts(\@setTags); + my $srcExifTool = new Image::ExifTool; + # set flag to indicate we are being called from inside SetNewValuesFromFile() + $$srcExifTool{TAGS_FROM_FILE} = 1; + # synchronize and increment the file sequence number + $$srcExifTool{FILE_SEQUENCE} = $$self{FILE_SEQUENCE}++; + # set options for our extraction tool + my $options = $$self{OPTIONS}; + # copy both structured and flattened tags by default (but flattened tags are "unsafe") + my $structOpt = defined $$options{Struct} ? $$options{Struct} : 2; + # copy structures only if no tags specified (since flattened tags are "unsafe") + $structOpt = 1 if $structOpt eq '2' and not @setTags; + # +------------------------------------------+ + # ! DON'T FORGET!! Must consider each new ! + # ! option to decide how it is handled here. ! + # +------------------------------------------+ + $srcExifTool->Options( + Binary => 1, + Charset => $$options{Charset}, + CharsetEXIF => $$options{CharsetEXIF}, + CharsetFileName => $$options{CharsetFileName}, + CharsetID3 => $$options{CharsetID3}, + CharsetIPTC => $$options{CharsetIPTC}, + CharsetPhotoshop=> $$options{CharsetPhotoshop}, + Composite => $$options{Composite}, + CoordFormat => $$options{CoordFormat} || '%d %d %.8f', # copy coordinates at high resolution unless otherwise specified + DateFormat => $$options{DateFormat}, + Duplicates => 1, + Escape => $$options{Escape}, + # Exclude (set below) + ExtendedXMP => $$options{ExtendedXMP}, + ExtractEmbedded => $$options{ExtractEmbedded}, + FastScan => $$options{FastScan}, + Filter => $$options{Filter}, + FixBase => $$options{FixBase}, + GlobalTimeShift => $$options{GlobalTimeShift}, + HexTagIDs => $$options{HexTagIDs}, + IgnoreMinorErrors=>$$options{IgnoreMinorErrors}, + IgnoreTags => $$options{IgnoreTags}, + Lang => $$options{Lang}, + LargeFileSupport=> $$options{LargeFileSupport}, + List => 1, + ListItem => $$options{ListItem}, + ListSep => $$options{ListSep}, + MakerNotes => $$options{FastScan} && $$options{FastScan} > 1 ? undef : 1, + MDItemTags => $$options{MDItemTags}, + MissingTagValue => $$options{MissingTagValue}, + NoPDFList => $$options{NoPDFList}, + Password => $$options{Password}, + PrintConv => $$options{PrintConv}, + QuickTimeUTC => $$options{QuickTimeUTC}, + RequestAll => $$options{RequestAll} || 1, # (is this still necessary now that RequestTags are being set?) + RequestTags => $$options{RequestTags}, + SaveFormat => $$options{SaveFormat}, + SavePath => $$options{SavePath}, + ScanForXMP => $$options{ScanForXMP}, + StrictDate => defined $$options{StrictDate} ? $$options{StrictDate} : 1, + Struct => $structOpt, + SystemTags => $$options{SystemTags}, + TimeZone => $$options{TimeZone}, + Unknown => $$options{Unknown}, + UserParam => $$options{UserParam}, + Validate => $$options{Validate}, + XAttrTags => $$options{XAttrTags}, + XMPAutoConv => $$options{XMPAutoConv}, + ); + $$srcExifTool{GLOBAL_TIME_OFFSET} = $$self{GLOBAL_TIME_OFFSET}; + foreach $tag (@setTags) { + next if ref $tag; + if ($tag =~ /^-(.*)/) { + # avoid extracting tags that are excluded + push @exclude, $1; + next; + } + # add specified tags to list of requested tags + $_ = $tag; + if (/(.+?)\s*(>|<)\s*(.+)/) { + if ($2 eq '>') { + $_ = $1; + } else { + $_ = $3; + /\$/ and push(@reqTags, /\$\{?(?:[-\w]+:)*([-\w?*]+)/g), next; + } + } + push @reqTags, $2 if /(^|:)([-\w?*]+)#?$/; + } + if (@exclude) { + ExpandShortcuts(\@exclude, 1); + $srcExifTool->Options(Exclude => \@exclude); + } + $srcExifTool->Options(RequestTags => \@reqTags) if @reqTags; + my $printConv = $$options{PrintConv}; + if ($opts{Type}) { + # save source type separately because it may be different than dst Type + $opts{SrcType} = $opts{Type}; + # override PrintConv option with initial Type if given + $printConv = ($opts{Type} eq 'PrintConv' ? 1 : 0); + $srcExifTool->Options(PrintConv => $printConv); + } + my $srcType = $printConv ? 'PrintConv' : 'ValueConv'; + + # get all tags from source file (including MakerNotes block) + my $info = $srcExifTool->ImageInfo($srcFile); + return $info if $$info{Error} and $$info{Error} eq 'Error opening file'; + delete $$srcExifTool{VALUE}{Error}; # delete so we can check this later + + # sort tags in reverse order so we get priority tag last + my @tags = reverse sort keys %$info; +# +# simply transfer all tags from source image if no tags specified +# + unless (@setTags) { + # transfer maker note information to this object + $$self{MAKER_NOTE_FIXUP} = $$srcExifTool{MAKER_NOTE_FIXUP}; + $$self{MAKER_NOTE_BYTE_ORDER} = $$srcExifTool{MAKER_NOTE_BYTE_ORDER}; + foreach $tag (@tags) { + # don't try to set errors or warnings + next if $tag =~ /^(Error|Warning)\b/; + # get appropriate value type if necessary + if ($opts{SrcType} and $opts{SrcType} ne $srcType) { + $$info{$tag} = $srcExifTool->GetValue($tag, $opts{SrcType}); + } + # set value for this tag + my ($n, $e) = $self->SetNewValue($tag, $$info{$tag}, %opts); + # delete this tag if we couldn't set it + $n or delete $$info{$tag}; + } + return $info; + } +# +# transfer specified tags in the proper order +# + # 1) loop through input list of tags to set, and build @setList + my (@setList, $set, %setMatches, $t); + foreach $t (@setTags) { + if (ref $t eq 'HASH') { + # update current options + foreach $key (keys %$t) { + $opts{$key} = $$t{$key}; + } + next; + } + # make a copy of the current options for this setTag + # (also use this hash to store expression and wildcard flags, EXPR and WILD) + my $opts = { %opts }; + $tag = lc $t; # change tag/group names to all lower case + my (@fg, $grp, $dst, $dstGrp, $dstTag, $isExclude); + # handle redirection to another tag + if ($tag =~ /(.+?)\s*(>|<)\s*(.+)/) { + $dstGrp = ''; + my $opt; + if ($2 eq '>') { + ($tag, $dstTag) = ($1, $3); + # flag add and delete (eg. '+<' and '-<') redirections + $opt = $1 if $tag =~ s/\s*([-+])$// or $dstTag =~ s/^([-+])\s*//; + } else { + ($tag, $dstTag) = ($3, $1); + $opt = $1 if $dstTag =~ s/\s*([-+])$//; + # handle expressions + if ($tag =~ /\$/) { + $tag = $t; # restore original case + # recover leading whitespace (except for initial single space) + $tag =~ s/(.+?)\s*(>|<) ?//; + $$opts{EXPR} = 1; # flag this expression + } else { + $opt = $1 if $tag =~ s/^([-+])\s*//; + } + } + # validate tag name(s) + unless ($$opts{EXPR} or ValidTagName($tag)) { + $self->Warn("Invalid tag name '${tag}'. Use '=' not '<' to assign a tag value"); + next; + } + ValidTagName($dstTag) or $self->Warn("Invalid tag name '${dstTag}'"), next; + # translate '+' and '-' to appropriate SetNewValue option + if ($opt) { + $$opts{{ '+' => 'AddValue', '-' => 'DelValue' }->{$opt}} = 1; + $$opts{Shift} = 0; # shift if shiftable + } + ($dstGrp, $dstTag) = ($1, $2) if $dstTag =~ /(.*):(.+)/; + # ValueConv may be specified separately on the destination with '#' + $$opts{Type} = 'ValueConv' if $dstTag =~ s/#$//; + # replace tag name of 'all' with '*' + $dstTag = '*' if $dstTag eq 'all'; + } + unless ($$opts{EXPR}) { + $isExclude = ($tag =~ s/^-//); + if ($tag =~ /(.*):(.+)/) { + ($grp, $tag) = ($1, $2); + foreach (split /:/, $grp) { + # save family/groups in list (ignoring 'all' and '*') + next unless length($_) and /^(\d+)?(.*)/; + my ($f, $g) = ($1, $2); + $f = 7 if $g =~ s/^ID-//i; + push @fg, [ $f, $g ] unless $g eq '*' or $g eq 'all'; + } + } + # allow ValueConv to be specified by a '#' on the tag name + if ($tag =~ s/#$//) { + $$opts{SrcType} = 'ValueConv'; + $$opts{Type} = 'ValueConv' unless $dstTag; + } + # replace 'all' with '*' in tag and group names + $tag = '*' if $tag eq 'all'; + # allow wildcards in tag names (handle differently from all tags: '*') + if ($tag =~ /[?*]/ and $tag ne '*') { + $$opts{WILD} = 1; # set flag indicating wildcards were used in source tag + $tag =~ s/\*/[-\\w]*/g; + $tag =~ s/\?/[-\\w]/g; + } + } + # redirect, exclude or set this tag (Note: @fg is empty if we don't care about the group) + if ($dstTag) { + # redirect this tag + $isExclude and return { Error => "Can't redirect excluded tag" }; + # set destination group the same as source if necessary + # (removed in 7.72 so '-*:*<xmp:*' will preserve XMP family 1 groups) + # $dstGrp = $grp if $dstGrp eq '*' and $grp; + # write to specified destination group/tag + $dst = [ $dstGrp, $dstTag ]; + } elsif ($isExclude) { + # implicitly assume '*' if first entry is an exclusion + unshift @setList, [ [ ], '*', [ '', '*' ], $opts ] unless @setList; + # exclude this tag by leaving $dst undefined + } else { + $dst = [ $grp || '', $$opts{WILD} ? '*' : $tag ]; # use same group name for dest + } + # save in reverse order so we don't set tags before an exclude + unshift @setList, [ \@fg, $tag, $dst, $opts ]; + } + # 2) initialize lists of matching tags for each setTag + foreach $set (@setList) { + $$set[2] and $setMatches{$set} = [ ]; + } + # 3) loop through all tags in source image and save tags matching each setTag + my %rtnInfo; + foreach $tag (@tags) { + # don't try to set errors or warnings + if ($tag =~ /^(Error|Warning)( |$)/) { + $rtnInfo{$tag} = $$info{$tag}; + next; + } + # only set specified tags + my $lcTag = lc(GetTagName($tag)); + my (@grp, %grp); +SET: foreach $set (@setList) { + # check first for matching tag + unless ($$set[1] eq $lcTag or $$set[1] eq '*') { + # handle wildcards + next unless $$set[3]{WILD} and $lcTag =~ /^$$set[1]$/; + } + # then check for matching group + if (@{$$set[0]}) { + # get lower case group names if not done already + unless (@grp) { + @grp = map(lc, $srcExifTool->GetGroup($tag)); + $grp{$_} = 1 foreach @grp; + } + foreach (@{$$set[0]}) { + my ($f, $g) = @$_; + if (not defined $f) { + next SET unless $grp{$g}; + } elsif ($f == 7) { + next SET unless IsSameID($srcExifTool->GetTagID($tag), $g); + } else { + next SET unless defined $grp[$f] and $g eq $grp[$f]; + } + } + } + last unless $$set[2]; # all done if we hit an exclude + # add to the list of tags matching this setTag + push @{$setMatches{$set}}, $tag; + } + } + # 4) loop through each setTag in original order, setting new tag values + foreach $set (reverse @setList) { + # get options for SetNewValue + my $opts = $$set[3]; + # handle expressions + if ($$opts{EXPR}) { + my $val = $srcExifTool->InsertTagValues(\@tags, $$set[1], 'Error'); + if ($$srcExifTool{VALUE}{Error}) { + # pass on any error as a warning + $tag = NextFreeTagKey(\%rtnInfo, 'Warning'); + $rtnInfo{$tag} = $$srcExifTool{VALUE}{Error}; + delete $$srcExifTool{VALUE}{Error}; + next unless defined $val; + } + my ($dstGrp, $dstTag) = @{$$set[2]}; + $$opts{Protected} = 1 unless $dstTag =~ /[?*]/ and $dstTag ne '*'; + $$opts{Group} = $dstGrp if $dstGrp; + my @rtnVals = $self->SetNewValue($dstTag, $val, %$opts); + $rtnInfo{$dstTag} = $val if $rtnVals[0]; # tag was set successfully + next; + } + foreach $tag (@{$setMatches{$set}}) { + my ($val, $noWarn); + if ($$opts{SrcType} and $$opts{SrcType} ne $srcType) { + $val = $srcExifTool->GetValue($tag, $$opts{SrcType}); + } else { + $val = $$info{$tag}; + } + my ($dstGrp, $dstTag) = @{$$set[2]}; + if ($dstGrp) { + my @dstGrp = split /:/, $dstGrp; + # destination group of '*' writes to same group as source tag + # (family 1 unless otherwise specified) + foreach (@dstGrp) { + next unless /^(\d*)(all|\*)$/i; + $_ = $1 . $srcExifTool->GetGroup($tag, length $1 ? $1 : 1); + $noWarn = 1; # don't warn on wildcard destinations + } + $$opts{Group} = join ':', @dstGrp; + } else { + delete $$opts{Group}; + } + # transfer maker note information if setting this tag + if ($$srcExifTool{TAG_INFO}{$tag}{MakerNotes}) { + $$self{MAKER_NOTE_FIXUP} = $$srcExifTool{MAKER_NOTE_FIXUP}; + $$self{MAKER_NOTE_BYTE_ORDER} = $$srcExifTool{MAKER_NOTE_BYTE_ORDER}; + } + if ($dstTag eq '*') { + $dstTag = $tag; + $noWarn = 1; + } + if ($$set[1] eq '*' or $$set[3]{WILD}) { + # don't copy from protected binary tags when using wildcards + next if $$srcExifTool{TAG_INFO}{$tag}{Protected} and + $$srcExifTool{TAG_INFO}{$tag}{Binary}; + # don't copy to protected tags when using wildcards + delete $$opts{Protected}; + # don't copy flattened tags if copying structures too when copying all + $$opts{NoFlat} = $structOpt eq '2' ? 1 : 0; + } else { + # allow protected tags to be copied if specified explicitly + $$opts{Protected} = 1 unless $dstTag =~ /[?*]/; + delete $$opts{NoFlat}; + } + # set value(s) for this tag + my ($rtn, $wrn) = $self->SetNewValue($dstTag, $val, %$opts); + # this was added in version 9.14, and allowed actions like "-subject<all" to + # write values of multiple tags into a list, but it had the side effect of + # duplicating items if there were multiple list tags with the same name + # (eg. -use mwg "-creator<creator"), so disable this as of ExifTool 9.36: + # $$opts{Replace} = 0; # accumulate values from tags matching a single argument + if ($wrn and not $noWarn) { + # return this warning + $rtnInfo{NextFreeTagKey(\%rtnInfo, 'Warning')} = $wrn; + $noWarn = 1; + } + $rtnInfo{$tag} = $val if $rtn; # tag was set successfully + } + } + return \%rtnInfo; # return information that we set +} + +#------------------------------------------------------------------------------ +# Get new value(s) for tag +# Inputs: 0) ExifTool object reference, 1) tag name (or tagInfo or nvHash ref, not public) +# 2) optional pointer to return new value hash reference (not part of public API) +# Returns: List of new Raw values (list may be empty if tag is being deleted) +# Notes: 1) Preferentially returns new value from Extra table if writable Extra tag exists +# 2) Must call AFTER IsOverwriting() returns 1 to get proper value for shifted times +# 3) Tag name is case sensitive and may be prefixed by family 0 or 1 group name +# 4) Value may have been modified by CHECK_PROC routine after ValueConv +sub GetNewValue($$;$) +{ + local $_; + my $self = shift; + my $tag = shift; + my $nvHash; + if ((ref $tag eq 'HASH' and $$tag{IsNVH}) or not defined $tag) { + $nvHash = $tag; + } else { + my $newValueHashPt = shift; + if ($$self{NEW_VALUE}) { + my ($group, $tagInfo); + if (ref $tag) { + $nvHash = $self->GetNewValueHash($tag); + } elsif (defined($tagInfo = $Image::ExifTool::Extra{$tag}) and + $$tagInfo{Writable}) + { + $nvHash = $self->GetNewValueHash($tagInfo); + } else { + # separate group from tag name + my @groups; + @groups = split ':', $1 if $tag =~ s/(.*)://; + my @tagInfoList = FindTagInfo($tag); + # decide which tag we want +GNV_TagInfo: foreach $tagInfo (@tagInfoList) { + my $nvh = $self->GetNewValueHash($tagInfo) or next; + # select tag in specified group(s) if necessary + foreach (@groups) { + next if $_ eq $$nvh{WriteGroup}; + my @grps = $self->GetGroup($tagInfo); + if ($grps[0] eq $$nvh{WriteGroup}) { + # check family 1 group only if WriteGroup is not specific + next if $_ eq $grps[1]; + } else { + # otherwise check family 0 group + next if $_ eq $grps[0]; + } + # also check family 7 + next if /^ID-(.*)/i and IsSameID($$tagInfo{TagID}, $1); + # step to next entry in list + $nvh = $$nvh{Next} or next GNV_TagInfo; + } + $nvHash = $nvh; + # give priority to the one we are creating + last if defined $$nvHash{IsCreating}; + } + } + } + # return new value hash if requested + $newValueHashPt and $$newValueHashPt = $nvHash; + } + unless ($nvHash and $$nvHash{Value}) { + return () if wantarray; # return empty list + return undef; + } + my $vals = $$nvHash{Value}; + # do inverse raw conversion if necessary + # - must also check after doing a Shift + if ($$nvHash{TagInfo}{RawConvInv} or $$nvHash{Shift}) { + my @copyVals = @$vals; # modify a copy of the values + $vals = \@copyVals; + my $tagInfo = $$nvHash{TagInfo}; + my $conv = $$tagInfo{RawConvInv}; + my $table = $$tagInfo{Table}; + my ($val, $checkProc); + $checkProc = $$table{CHECK_PROC} if $$nvHash{Shift} and $table; + local $SIG{'__WARN__'} = \&SetWarning; + undef $evalWarning; + foreach $val (@$vals) { + # must check value now if it was shifted + if ($checkProc) { + my $err = &$checkProc($self, $tagInfo, \$val); + if ($err or not defined $val) { + $err or $err = 'Error generating raw value'; + $self->WarnOnce("$err for $$tagInfo{Name}"); + @$vals = (); + last; + } + next unless $conv; + } else { + last unless $conv; + } + # do inverse raw conversion + if (ref($conv) eq 'CODE') { + $val = &$conv($val, $self); + } else { + #### eval RawConvInv ($self, $val, $tagInfo) + $val = eval $conv; + $@ and $evalWarning = $@; + } + if ($evalWarning) { + # an empty warning ("\n") ignores tag with no error + if ($evalWarning ne "\n") { + my $err = CleanWarning() . " in $$tagInfo{Name} (RawConvInv)"; + $self->WarnOnce($err); + } + @$vals = (); + last; + } + } + } + # return our value(s) + return @$vals if wantarray; + return $$vals[0]; +} + +#------------------------------------------------------------------------------ +# Return the total number of new values set +# Inputs: 0) ExifTool object reference +# Returns: Scalar context) Number of new values that have been set (incl pseudo) +# List context) Number of new values (incl pseudo), number of "pseudo" values +# ("pseudo" values are those which don't require rewriting the file to change) +sub CountNewValues($) +{ + my $self = shift; + my $newVal = $$self{NEW_VALUE}; + my ($num, $pseudo) = (0, 0); + if ($newVal) { + $num = scalar keys %$newVal; + my $nv; + foreach $nv (values %$newVal) { + my $tagInfo = $$nv{TagInfo}; + # don't count tags that don't write anything + $$tagInfo{WriteNothing} and --$num, next; + # count the number of pseudo tags included + $$tagInfo{WritePseudo} and ++$pseudo; + } + } + $num += scalar keys %{$$self{DEL_GROUP}}; + return $num unless wantarray; + return ($num, $pseudo); +} + +#------------------------------------------------------------------------------ +# Save new values for subsequent restore +# Inputs: 0) ExifTool object reference +# Returns: Number of times new values have been saved +# Notes: increments SAVE_COUNT flag each time routine is called +sub SaveNewValues($) +{ + my $self = shift; + my $newValues = $$self{NEW_VALUE}; + my $saveCount = ++$$self{SAVE_COUNT}; + my $key; + foreach $key (keys %$newValues) { + my $nvHash = $$newValues{$key}; + while ($nvHash) { + # set Save count if not done already + $$nvHash{Save} or $$nvHash{Save} = $saveCount; + $nvHash = $$nvHash{Next}; + } + } + # initialize hash for saving overwritten new values + $$self{SAVE_NEW_VALUE} = { }; + # make a copy of the delete group hash + my %delGrp = %{$$self{DEL_GROUP}}; + $$self{SAVE_DEL_GROUP} = \%delGrp; + return $saveCount; +} + +#------------------------------------------------------------------------------ +# Restore new values to last saved state +# Inputs: 0) ExifTool object reference +# Notes: Restores saved new values, but currently doesn't restore them in the +# original order, so there may be some minor side-effects when restoring tags +# with overlapping groups. eg) XMP:Identifier, XMP-dc:Identifier +# Also, this doesn't do the right thing for list-type tags which accumulate +# values across a save point +sub RestoreNewValues($) +{ + my $self = shift; + my $newValues = $$self{NEW_VALUE}; + my $savedValues = $$self{SAVE_NEW_VALUE}; + my $key; + # 1) remove any new values which don't have the Save flag set + if ($newValues) { + my @keys = keys %$newValues; + foreach $key (@keys) { + my $lastHash; + my $nvHash = $$newValues{$key}; + while ($nvHash) { + if ($$nvHash{Save}) { + $lastHash = $nvHash; + } else { + # remove this entry from the list + if ($lastHash) { + $$lastHash{Next} = $$nvHash{Next}; + } elsif ($$nvHash{Next}) { + $$newValues{$key} = $$nvHash{Next}; + } else { + delete $$newValues{$key}; + } + } + $nvHash = $$nvHash{Next}; + } + } + } + # 2) restore saved new values + if ($savedValues) { + $newValues or $newValues = $$self{NEW_VALUE} = { }; + foreach $key (keys %$savedValues) { + if ($$newValues{$key}) { + # add saved values to end of list + my $nvHash = LastInList($$newValues{$key}); + $$nvHash{Next} = $$savedValues{$key}; + } else { + $$newValues{$key} = $$savedValues{$key}; + } + } + $$self{SAVE_NEW_VALUE} = { }; # reset saved new values + } + # 3) restore delete groups + my %delGrp = %{$$self{SAVE_DEL_GROUP}}; + $$self{DEL_GROUP} = \%delGrp; +} + +#------------------------------------------------------------------------------ +# Set filesystem time from from FileModifyDate or FileCreateDate tag +# Inputs: 0) ExifTool object reference, 1) file name or file ref +# 2) time (-M or -C) of original file (used for shift; obtained from file if not given) +# 3) tag name to write (undef for 'FileModifyDate') +# 4) flag set if argument 2 has already been converted to Unix seconds +# Returns: 1=time changed OK, 0=nothing done, -1=error setting time +# (increments CHANGED flag and sets corresponding WRITTEN tag) +sub SetFileModifyDate($$;$$$) +{ + my ($self, $file, $originalTime, $tag, $isUnixTime) = @_; + my $nvHash; + $tag = 'FileModifyDate' unless defined $tag; + my $val = $self->GetNewValue($tag, \$nvHash); + return 0 unless defined $val; + my $isOverwriting = $self->IsOverwriting($nvHash); + return 0 unless $isOverwriting; + # can currently only set creation date on Windows systems + # (and Mac now too, but that is handled with the MacOS tags) + return 0 if $tag eq 'FileCreateDate' and $^O ne 'MSWin32'; + if ($isOverwriting < 0) { # are we shifting time? + # use original time of this file if not specified + unless (defined $originalTime) { + my ($aTime, $mTime, $cTime) = $self->GetFileTime($file); + $originalTime = ($tag eq 'FileCreateDate') ? $cTime : $mTime; + return 0 unless defined $originalTime; + $isUnixTime = 1; + } + $originalTime = int($^T - $originalTime*(24*3600) + 0.5) unless $isUnixTime; + return 0 unless $self->IsOverwriting($nvHash, $originalTime); + $val = $$nvHash{Value}[0]; # get shifted value + } + my ($aTime, $mTime, $cTime); + if ($tag eq 'FileCreateDate') { + eval { require Win32::API } or $self->WarnOnce("Install Win32::API to set $tag"), return -1; + eval { require Win32API::File } or $self->WarnOnce("Install Win32API::File to set $tag"), return -1; + $cTime = $val; + } else { + $aTime = $mTime = $val; + } + $self->SetFileTime($file, $aTime, $mTime, $cTime, 1) or $self->Warn("Error setting $tag"), return -1; + ++$$self{CHANGED}; + $$self{WRITTEN}{$tag} = $val; # remember that we wrote this tag + $self->VerboseValue("+ $tag", $val); + return 1; +} + +#------------------------------------------------------------------------------ +# Change file name and/or directory from FileName and Directory tags +# Inputs: 0) ExifTool object reference, 1) current file name (including path) +# 2) new name (or undef to build from FileName and Directory tags) +# 3) option: 'HardLink'/'SymLink' to create hard/symbolic link instead of renaming +# 'Test' to only print new file name +# 4) 0 to indicate that a file will no longer exist (used for 'Test' only) +# Returns: 1=name changed OK, 0=nothing changed, -1=error changing name +# (and increments CHANGED flag if filename changed) +# Notes: Will not overwrite existing file. Creates directories as necessary. +sub SetFileName($$;$$$) +{ + my ($self, $file, $newName, $opt, $usedFlag) = @_; + my ($nvHash, $doName, $doDir); + + $opt or $opt = ''; + # determine the new file name + unless (defined $newName) { + if ($opt) { + if ($opt eq 'HardLink' or $opt eq 'Link') { + $newName = $self->GetNewValue('HardLink'); + } elsif ($opt eq 'SymLink') { + $newName = $self->GetNewValue('SymLink'); + } elsif ($opt eq 'Test') { + $newName = $self->GetNewValue('TestName'); + } + return 0 unless defined $newName; + } else { + my $filename = $self->GetNewValue('FileName', \$nvHash); + $doName = 1 if defined $filename and $self->IsOverwriting($nvHash, $file); + my $dir = $self->GetNewValue('Directory', \$nvHash); + $doDir = 1 if defined $dir and $self->IsOverwriting($nvHash, $file); + return 0 unless $doName or $doDir; # nothing to do + if ($doName) { + $newName = GetNewFileName($file, $filename); + $newName = GetNewFileName($newName, $dir) if $doDir; + } else { + $newName = GetNewFileName($file, $dir); + } + } + } + # validate new file name in Windows + if ($^O eq 'MSWin32') { + if ($newName =~ /[\0-\x1f<>"|*]/) { + $self->Warn('New file name not allowed in Windows (contains reserved characters)'); + return -1; + } + if ($newName =~ /:/ and $newName !~ /^[A-Z]:[^:]*$/i) { + $self->Warn("New file name not allowed in Windows (contains ':')"); + return -1; + } + if ($newName =~ /\?/ and $newName !~ m{^[\\/]{2}\?[\\/][^?]*$}) { + $self->Warn("New file name not allowed in Windows (contains '?')"); + return -1; + } + if ($newName =~ m{(^|[\\/])(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(\.[^.]*)?$}i) { + $self->Warn('New file name not allowed in Windows (reserved device name)'); + return -1; + } + if ($newName =~ /([. ])$/) { + $self->Warn("New file name not recommended for Windows (ends with '${1}')", 2) and return -1; + } + if (length $newName > 259 and $newName !~ /\?/) { + $self->Warn('New file name not recommended for Windows (exceeds 260 chars)', 2) and return -1; + } + } else { + $newName =~ tr/\0//d; # make sure name doesn't contain nulls + } + # protect against empty file name + length $newName or $self->Warn('New file name is empty'), return -1; + # don't replace existing file + if ($self->Exists($newName) and (not defined $usedFlag or $usedFlag)) { + if ($file ne $newName or $opt =~ /Link$/) { + # allow for case-insensitive filesystem + if ($opt =~ /Link$/ or not $self->IsSameFile($file, $newName)) { + $self->Warn("File '${newName}' already exists"); + return -1; + } + } else { + $self->Warn('File name is unchanged'); + return 0; + } + } + if ($opt eq 'Test') { + my $out = $$self{OPTIONS}{TextOut}; + print $out "'${file}' --> '${newName}'\n"; + return 1; + } + # create directory for new file if necessary + my $result; + if (($result = $self->CreateDirectory($newName)) != 0) { + if ($result < 0) { + $self->Warn("Error creating directory for '${newName}'"); + return -1; + } + $self->VPrint(0, "Created directory for '${newName}'\n"); + } + if ($opt eq 'HardLink' or $opt eq 'Link') { + unless (link $file, $newName) { + $self->Warn("Error creating hard link '${newName}'"); + return -1; + } + ++$$self{CHANGED}; + $self->VerboseValue('+ HardLink', $newName); + return 1; + } elsif ($opt eq 'SymLink') { + $^O eq 'MSWin32' and $self->Warn('SymLink not supported in Windows'), return -1; + $newName =~ s(^\./)(); # remove leading "./" from link name if it exists + # path to linked file must be relative to the $newName directory, but $file + # is relative to the current directory, so convert it to an absolute path + # if using a relative directory and $newName isn't in the current directory + if ($file !~ m(^/) and $newName =~ m(/)) { + unless (eval { require Cwd }) { + $self->Warn('Install Cwd to make symlinks to other directories'); + return -1; + } + $file = eval { Cwd::abs_path($file) }; + unless (defined $file) { + $self->Warn('Error in Cwd::abs_path when creating symlink'); + return -1; + } + } + unless (eval { symlink $file, $newName } ) { + $self->Warn("Error creating symbolic link '${newName}'"); + return -1; + } + ++$$self{CHANGED}; + $self->VerboseValue('+ SymLink', $newName); + return 1; + } + # attempt to rename the file + unless ($self->Rename($file, $newName)) { + local (*EXIFTOOL_SFN_IN, *EXIFTOOL_SFN_OUT); + # renaming didn't work, so copy the file instead + unless ($self->Open(\*EXIFTOOL_SFN_IN, $file)) { + $self->Error("Error opening '${file}'"); + return -1; + } + unless ($self->Open(\*EXIFTOOL_SFN_OUT, $newName, '>')) { + close EXIFTOOL_SFN_IN; + $self->Error("Error creating '${newName}'"); + return -1; + } + binmode EXIFTOOL_SFN_IN; + binmode EXIFTOOL_SFN_OUT; + my ($buff, $err); + while (read EXIFTOOL_SFN_IN, $buff, 65536) { + print EXIFTOOL_SFN_OUT $buff or $err = 1; + } + close EXIFTOOL_SFN_OUT or $err = 1; + close EXIFTOOL_SFN_IN; + if ($err) { + $self->Unlink($newName); # erase bad output file + $self->Error("Error writing '${newName}'"); + return -1; + } + # preserve modification time + my ($aTime, $mTime, $cTime) = $self->GetFileTime($file); + $self->SetFileTime($newName, $aTime, $mTime, $cTime); + # remove the original file + $self->Unlink($file) or $self->Warn('Error removing old file'); + } + $$self{NewName} = $newName; # remember new file name + ++$$self{CHANGED}; + $self->VerboseValue('+ FileName', $newName); + return 1; +} + +#------------------------------------------------------------------------------ +# Set file permissions, group/user id and various MDItem tags from new tag values +# Inputs: 0) ExifTool ref, 1) file name or glob (must be a name for MDItem tags) +# Returns: 1=something was set OK, 0=didn't try, -1=error (and warning set) +# Notes: There may be errors even if 1 is returned +sub SetSystemTags($$) +{ + my ($self, $file) = @_; + my $result = 0; + + my $perm = $self->GetNewValue('FilePermissions'); + if (defined $perm) { + if (eval { chmod($perm & 07777, $file) }) { + $self->VerboseValue('+ FilePermissions', $perm); + $result = 1; + } else { + $self->WarnOnce('Error setting FilePermissions'); + $result = -1; + } + } + my $uid = $self->GetNewValue('FileUserID'); + my $gid = $self->GetNewValue('FileGroupID'); + if (defined $uid or defined $gid) { + defined $uid or $uid = -1; + defined $gid or $gid = -1; + if (eval { chown($uid, $gid, $file) }) { + $self->VerboseValue('+ FileUserID', $uid) if $uid >= 0; + $self->VerboseValue('+ FileGroupID', $gid) if $gid >= 0; + $result = 1; + } else { + $self->WarnOnce('Error setting FileGroup/UserID'); + $result = -1 unless $result; + } + } + my $tag; + foreach $tag (@writableMacOSTags) { + my $nvHash; + my $val = $self->GetNewValue($tag, \$nvHash); + next unless $nvHash; + if ($^O eq 'darwin') { + ref $file and $self->Warn('Setting MDItem tags requires a file name'), last; + require Image::ExifTool::MacOS; + my $res = Image::ExifTool::MacOS::SetMacOSTags($self, $file, \@writableMacOSTags); + $result = $res if $res == 1 or not $result; + last; + } elsif ($tag ne 'FileCreateDate') { + $self->WarnOnce('Can only set MDItem tags on OS X'); + last; + } + } + # delete Windows Zone.Identifier if specified + my $zhash = $self->GetNewValueHash($Image::ExifTool::Extra{ZoneIdentifier}); + if ($zhash) { + my $res = -1; + if ($^O ne 'MSWin32') { + $self->Warn('ZoneIdentifer is a Windows-only tag'); + } elsif (ref $file) { + $self->Warn('Writing ZoneIdentifer requires a file name'); + } elsif (defined $self->GetNewValue('ZoneIdentifier', \$zhash)) { + $self->Warn('ZoneIndentifier may only be delted'); + } elsif (not eval { require Win32API::File }) { + $self->Warn('Install Win32API::File to write ZoneIdentifier'); + } else { + my ($wattr, $wide); + my $zfile = "${file}:Zone.Identifier"; + if ($self->EncodeFileName($zfile)) { + $wide = 1; + $wattr = eval { Win32API::File::GetFileAttributesW($zfile) }; + } else { + $wattr = eval { Win32API::File::GetFileAttributes($zfile) }; + } + if ($wattr == Win32API::File::INVALID_FILE_ATTRIBUTES()) { + $res = 0; # file doesn't exist, nothing to do + } elsif ($wattr & Win32API::File::FILE_ATTRIBUTE_READONLY()) { + $self->Warn('Zone.Identifier stream is read-only'); + } else { + if ($wide) { + $res = 1 if eval { Win32API::File::DeleteFileW($zfile) }; + } else { + $res = 1 if eval { Win32API::File::DeleteFile($zfile) }; + } + if ($res > 0) { + $self->VPrint(0, " Deleting Zone.Identifier stream\n"); + } else { + $self->Warn('Error deleting Zone.Identifier stream'); + } + } + } + $result = $res if $res == 1 or not $result; + } + return $result; +} + +#------------------------------------------------------------------------------ +# Write information back to file +# Inputs: 0) ExifTool object reference, +# 1) input filename, file ref, RAF ref, or scalar ref (or '' or undef to create from scratch) +# 2) output filename, file ref, or scalar ref (or undef to overwrite) +# 3) optional output file type (required only if input file is not specified +# and output file is a reference) +# Returns: 1=file written OK, 2=file written but no changes made, 0=file write error +sub WriteInfo($$;$$) +{ + local ($_, *EXIFTOOL_FILE2, *EXIFTOOL_OUTFILE); + my ($self, $infile, $outfile, $outType) = @_; + my (@fileTypeList, $fileType, $tiffType, $hdr, $seekErr, $type, $tmpfile); + my ($inRef, $outRef, $closeIn, $closeOut, $outPos, $outBuff, $eraseIn, $raf, $fileExt); + my ($hardLink, $symLink, $testName); + my $oldRaf = $$self{RAF}; + my $rtnVal = 0; + + # initialize member variables + $self->Init(); + $$self{IsWriting} = 1; + + # first, save original file modify date if necessary + # (do this now in case we are modifying file in place and shifting date) + my ($nvHash, $nvHash2, $originalTime, $createTime); + my $setModDate = defined $self->GetNewValue('FileModifyDate', \$nvHash); + my $setCreateDate = defined $self->GetNewValue('FileCreateDate', \$nvHash2); + my ($aTime, $mTime, $cTime); + if ($setModDate and $self->IsOverwriting($nvHash) < 0 and + defined $infile and ref $infile ne 'SCALAR') + { + ($aTime, $mTime, $cTime) = $self->GetFileTime($infile); + $originalTime = $mTime; + } + if ($setCreateDate and $self->IsOverwriting($nvHash2) < 0 and + defined $infile and ref $infile ne 'SCALAR') + { + ($aTime, $mTime, $cTime) = $self->GetFileTime($infile) unless defined $cTime; + $createTime = $cTime; + } +# +# do quick in-place change of file dir/name or date if that is all we are doing +# + my ($numNew, $numPseudo) = $self->CountNewValues(); + if (not defined $outfile and defined $infile) { + $hardLink = $self->GetNewValue('HardLink'); + $symLink = $self->GetNewValue('SymLink'); + $testName = $self->GetNewValue('TestName'); + undef $hardLink if defined $hardLink and not length $hardLink; + undef $symLink if defined $symLink and not length $symLink; + undef $testName if defined $testName and not length $testName; + my $newFileName = $self->GetNewValue('FileName', \$nvHash); + my $newDir = $self->GetNewValue('Directory'); + if (defined $newDir and length $newDir) { + $newDir .= '/' unless $newDir =~ m{/$}; + } else { + undef $newDir; + } + if ($numNew == $numPseudo) { + $rtnVal = 2; + if ((defined $newFileName or defined $newDir) and not ref $infile) { + my $result = $self->SetFileName($infile); + if ($result > 0) { + $infile = $$self{NewName}; # file name changed + $rtnVal = 1; + } elsif ($result < 0) { + return 0; # don't try to do anything else + } + } + if (not ref $infile or UNIVERSAL::isa($infile,'GLOB')) { + $self->SetFileModifyDate($infile) > 0 and $rtnVal = 1 if $setModDate; + $self->SetFileModifyDate($infile, undef, 'FileCreateDate') > 0 and $rtnVal = 1 if $setCreateDate; + $self->SetSystemTags($infile) > 0 and $rtnVal = 1; + } + if (defined $hardLink or defined $symLink or defined $testName) { + $hardLink and $self->SetFileName($infile, $hardLink, 'HardLink') and $rtnVal = 1; + $symLink and $self->SetFileName($infile, $symLink, 'SymLink') and $rtnVal = 1; + $testName and $self->SetFileName($infile, $testName, 'Test') and $rtnVal = 1; + } + return $rtnVal; + } elsif (defined $newFileName and length $newFileName) { + # can't simply rename file, so just set the output name if new FileName + # --> in this case, must erase original copy + if (ref $infile) { + $outfile = $newFileName; + # can't delete original + } elsif ($self->IsOverwriting($nvHash, $infile)) { + $outfile = GetNewFileName($infile, $newFileName); + $eraseIn = 1; # delete original + } + } + # set new directory if specified + if (defined $newDir) { + $outfile = $infile unless defined $outfile or ref $infile; + if (defined $outfile) { + $outfile = GetNewFileName($outfile, $newDir); + $eraseIn = 1 unless ref $infile; + } + } + } +# +# set up input file +# + if (ref $infile) { + $inRef = $infile; + if (UNIVERSAL::isa($inRef,'GLOB')) { + seek($inRef, 0, 0); # make sure we are at the start of the file + } elsif (UNIVERSAL::isa($inRef,'File::RandomAccess')) { + $inRef->Seek(0); + $raf = $inRef; + } elsif ($] >= 5.006 and (eval { require Encode; Encode::is_utf8($$inRef) } or $@)) { + # convert image data from UTF-8 to character stream if necessary + my $buff = $@ ? pack('C*',unpack($] < 5.010000 ? 'U0C*' : 'C0C*',$$inRef)) : Encode::encode('utf8',$$inRef); + if (defined $outfile) { + $inRef = \$buff; + } else { + $$inRef = $buff; + } + } + } elsif (defined $infile and $infile ne '') { + # write to a temporary file if no output file given + $outfile = $tmpfile = "${infile}_exiftool_tmp" unless defined $outfile; + if ($self->Open(\*EXIFTOOL_FILE2, $infile)) { + $fileExt = GetFileExtension($infile); + $fileType = GetFileType($infile); + @fileTypeList = GetFileType($infile); + $tiffType = $$self{FILE_EXT} = GetFileExtension($infile); + $self->VPrint(0, "Rewriting $infile...\n"); + $inRef = \*EXIFTOOL_FILE2; + $closeIn = 1; # we must close the file since we opened it + } else { + $self->Error('Error opening file'); + return 0; + } + } elsif (not defined $outfile) { + $self->Error("WriteInfo(): Must specify infile or outfile\n"); + return 0; + } else { + # create file from scratch + $outType = GetFileExtension($outfile) unless $outType or ref $outfile; + if (CanCreate($outType)) { + if ($$self{OPTIONS}{WriteMode} =~ /g/i) { + $fileType = $tiffType = $outType; # use output file type if no input file + $infile = "$fileType file"; # make bogus file name + $self->VPrint(0, "Creating $infile...\n"); + $inRef = \ ''; # set $inRef to reference to empty data + } else { + $self->Error("Not creating new $outType file (disallowed by WriteMode)"); + return 0; + } + } elsif ($outType) { + $self->Error("Can't create $outType files"); + return 0; + } else { + $self->Error("Can't create file (unknown type)"); + return 0; + } + } + unless (@fileTypeList) { + if ($fileType) { + @fileTypeList = ( $fileType ); + } else { + @fileTypeList = @fileTypes; + $tiffType = 'TIFF'; + } + } +# +# set up output file +# + if (ref $outfile) { + $outRef = $outfile; + if (UNIVERSAL::isa($outRef,'GLOB')) { + binmode($outRef); + $outPos = tell($outRef); + } else { + # initialize our output buffer if necessary + defined $$outRef or $$outRef = ''; + $outPos = length($$outRef); + } + } elsif (not defined $outfile) { + # editing in place, so write to memory first + # (only when infile is a file ref or scalar ref) + if ($raf) { + $self->Error("Can't edit File::RandomAccess object in place"); + return 0; + } + $outBuff = ''; + $outRef = \$outBuff; + $outPos = 0; + } elsif ($self->Exists($outfile)) { + $self->Error("File already exists: $outfile"); + } elsif ($self->Open(\*EXIFTOOL_OUTFILE, $outfile, '>')) { + $outRef = \*EXIFTOOL_OUTFILE; + $closeOut = 1; # we must close $outRef + binmode($outRef); + $outPos = 0; + } else { + my $tmp = $tmpfile ? ' temporary' : ''; + $self->Error("Error creating$tmp file: $outfile"); + } +# +# write the file +# + until ($$self{VALUE}{Error}) { + # create random access file object (disable seek test in case of straight copy) + $raf or $raf = new File::RandomAccess($inRef, 1); + $raf->BinMode(); + if ($numNew == $numPseudo) { + $rtnVal = 1; + # just do a straight copy of the file (no "real" tags are being changed) + my $buff; + while ($raf->Read($buff, 65536)) { + Write($outRef, $buff) or $rtnVal = -1, last; + } + last; + } elsif (not ref $infile and ($infile eq '-' or $infile =~ /\|$/)) { + # patch for Windows command shell pipe + $$raf{TESTED} = -1; # force buffering + } else { + $raf->SeekTest(); + } + # $raf->Debug() and warn " RAF debugging enabled!\n"; + my $inPos = $raf->Tell(); + $$self{RAF} = $raf; + my %dirInfo = ( + RAF => $raf, + OutFile => $outRef, + ); + $raf->Read($hdr, 1024) or $hdr = ''; + $raf->Seek($inPos, 0) or $seekErr = 1; + my $wrongType; + until ($seekErr) { + $type = shift @fileTypeList; + # do quick test to see if this is the right file type + if ($magicNumber{$type} and length($hdr) and $hdr !~ /^$magicNumber{$type}/s) { + next if @fileTypeList; + $wrongType = 1; + last; + } + # save file type in member variable + $dirInfo{Parent} = $$self{FILE_TYPE} = $$self{PATH}[0] = $type; + # determine which directories we must write for this file type + $self->InitWriteDirs($type); + if ($type eq 'JPEG' or $type eq 'EXV') { + $rtnVal = $self->WriteJPEG(\%dirInfo); + } elsif ($type eq 'TIFF') { + # disallow writing of some TIFF-based RAW images: + if (grep /^$tiffType$/, @{$noWriteFile{TIFF}}) { + $fileType = $tiffType; + undef $rtnVal; + } else { + if ($tiffType eq 'FFF') { + # (see https://exiftool.org/forum/index.php?topic=10848.0) + $self->Error('Phocus may not properly update previews of edited FFF images', 1); + } + $dirInfo{Parent} = $tiffType; + $rtnVal = $self->ProcessTIFF(\%dirInfo); + } + } elsif (exists $writableType{$type}) { + my ($module, $func); + if (ref $writableType{$type} eq 'ARRAY') { + $module = $writableType{$type}[0] || $type; + $func = $writableType{$type}[1]; + } else { + $module = $writableType{$type} || $type; + } + require "Image/ExifTool/$module.pm"; + $func = "Image::ExifTool::${module}::" . ($func || "Process$type"); + no strict 'refs'; + $rtnVal = &$func($self, \%dirInfo); + use strict 'refs'; + } elsif ($type eq 'ORF' or $type eq 'RAW') { + $rtnVal = $self->ProcessTIFF(\%dirInfo); + } elsif ($type eq 'EXIF') { + # go through WriteDirectory so block writes, etc are handled + my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main'); + my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr, \&WriteTIFF); + if (defined $buff) { + $rtnVal = Write($outRef, $buff) ? 1 : -1; + } else { + $rtnVal = 0; + } + } else { + undef $rtnVal; # flag that we don't write this type of file + } + # all done unless we got the wrong type + last if $rtnVal; + last unless @fileTypeList; + # seek back to original position in files for next try + $raf->Seek($inPos, 0) or $seekErr = 1, last; + if (UNIVERSAL::isa($outRef,'GLOB')) { + seek($outRef, 0, $outPos); + } else { + $$outRef = substr($$outRef, 0, $outPos); + } + } + # print file format errors + unless ($rtnVal) { + my $err; + if ($seekErr) { + $err = 'Error seeking in file'; + } elsif ($fileType and defined $rtnVal) { + if ($$self{VALUE}{Error}) { + # existing error message will do + } elsif ($fileType eq 'RAW') { + $err = 'Writing this type of RAW file is not supported'; + } else { + if ($wrongType) { + my $type = $fileExt || ($fileType eq 'TIFF' ? $tiffType : $fileType); + $err = "Not a valid $type"; + # do a quick check to see what this file looks like + foreach $type (@fileTypes) { + next unless $magicNumber{$type}; + next unless $hdr =~ /^$magicNumber{$type}/s; + $err .= " (looks more like a $type)"; + last; + } + } else { + $err = 'Format error in file'; + } + } + } elsif ($fileType) { + # get specific type of file from extension + $fileType = GetFileExtension($infile) if $infile and GetFileType($infile); + $err = "Writing of $fileType files is not yet supported"; + } else { + $err = 'Writing of this type of file is not supported'; + } + $self->Error($err) if $err; + $rtnVal = 0; # (in case it was undef) + } + # $raf->Close(); # only used to force debug output + last; # (didn't really want to loop) + } + # don't return success code if any error occurred + if ($rtnVal > 0) { + if ($outType and $type and $outType ne $type) { + my @types = GetFileType($outType); + unless (grep /^$type$/, @types) { + $self->Error("Can't create $outType file from $type"); + $rtnVal = 0; + } + } + if ($rtnVal > 0 and not Tell($outRef) and not $$self{VALUE}{Error}) { + # don't write a file with zero length + if (defined $hdr and length $hdr) { + $type = '<unk>' unless defined $type; + $self->Error("Can't delete all meta information from $type file"); + } else { + $self->Error('Nothing to write'); + } + } + $rtnVal = 0 if $$self{VALUE}{Error}; + } + + # rewrite original file in place if required + if (defined $outBuff) { + if ($rtnVal <= 0 or not $$self{CHANGED}) { + # nothing changed, so no need to write $outBuff + } elsif (UNIVERSAL::isa($inRef,'GLOB')) { + my $len = length($outBuff); + my $size; + $rtnVal = -1 unless + seek($inRef, 0, 2) and # seek to the end of file + ($size = tell $inRef) >= 0 and # get the file size + seek($inRef, 0, 0) and # seek back to the start + print $inRef $outBuff and # write the new data + ($len >= $size or # if necessary: + eval { truncate($inRef, $len) }); # shorten output file + } else { + $$inRef = $outBuff; # replace original data + } + $outBuff = ''; # free memory but leave $outBuff defined + } + # close input file if we opened it + if ($closeIn) { + # errors on input file are significant if we edited the file in place + $rtnVal and $rtnVal = -1 unless close($inRef) or not defined $outBuff; + if ($rtnVal > 0) { + # copy Mac OS resource fork if it exists + if ($^O eq 'darwin' and -s "$infile/..namedfork/rsrc") { + if ($$self{DEL_GROUP}{RSRC}) { + $self->VPrint(0,"Deleting Mac OS resource fork\n"); + ++$$self{CHANGED}; + } else { + $self->VPrint(0,"Copying Mac OS resource fork\n"); + my ($buf, $err); + local (*SRC, *DST); + if ($self->Open(\*SRC, "$infile/..namedfork/rsrc")) { + if ($self->Open(\*DST, "$outfile/..namedfork/rsrc", '>')) { + binmode SRC; # (not necessary for Darwin, but let's be thorough) + binmode DST; + while (read SRC, $buf, 65536) { + print DST $buf or $err = 'copying', last; + } + close DST or $err or $err = 'closing'; + } else { + # (this is normal if the destination filesystem isn't Mac OS) + $self->Warn('Error creating Mac OS resource fork'); + } + close SRC; + } else { + $err = 'opening'; + } + $rtnVal = 0 if $err and $self->Error("Error $err Mac OS resource fork", 2); + } + } + # erase input file if renaming while editing information in place + $self->Unlink($infile) or $self->Warn('Error erasing original file') if $eraseIn; + } + } + # close output file if we created it + if ($closeOut) { + # close file and set $rtnVal to -1 if there was an error + $rtnVal and $rtnVal = -1 unless close($outRef); + # erase the output file if we weren't successful + if ($rtnVal <= 0) { + $self->Unlink($outfile); + # else rename temporary file if necessary + } elsif ($tmpfile) { + $self->CopyFileAttrs($infile, $tmpfile); # copy attributes to new file + unless ($self->Rename($tmpfile, $infile)) { + # some filesystems won't overwrite with 'rename', so try erasing original + if (not $self->Unlink($infile)) { + $self->Unlink($tmpfile); + $self->Error('Error renaming temporary file'); + $rtnVal = 0; + } elsif (not $self->Rename($tmpfile, $infile)) { + $self->Error('Error renaming temporary file after deleting original'); + $rtnVal = 0; + } + } + # the output file should now have the name of the original infile + $outfile = $infile if $rtnVal > 0; + } + } + # set filesystem attributes if requested (and if possible!) + if ($rtnVal > 0 and ($closeOut or (defined $outBuff and ($closeIn or UNIVERSAL::isa($infile,'GLOB'))))) { + my $target = $closeOut ? $outfile : $infile; + # set file permissions if requested + ++$$self{CHANGED} if $self->SetSystemTags($target) > 0; + if ($closeIn) { # (no use setting file times unless the input file is closed) + ++$$self{CHANGED} if $setModDate and $self->SetFileModifyDate($target, $originalTime, undef, 1) > 0; + # set FileCreateDate if requested (and if possible!) + ++$$self{CHANGED} if $setCreateDate and $self->SetFileModifyDate($target, $createTime, 'FileCreateDate', 1) > 0; + # create hard link if requested and no output filename specified (and if possible!) + ++$$self{CHANGED} if defined $hardLink and $self->SetFileName($target, $hardLink, 'HardLink'); + ++$$self{CHANGED} if defined $symLink and $self->SetFileName($target, $symLink, 'SymLink'); + defined $testName and $self->SetFileName($target, $testName, 'Test'); + } + } + # check for write error and set appropriate error message and return value + if ($rtnVal < 0) { + $self->Error('Error writing output file') unless $$self{VALUE}{Error}; + $rtnVal = 0; # return 0 on failure + } elsif ($rtnVal > 0) { + ++$rtnVal unless $$self{CHANGED}; + } + # set things back to the way they were + $$self{RAF} = $oldRaf; + + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Get list of all available tags for specified group +# Inputs: 0) optional group name (or string of names separated by colons) +# Returns: tag list (sorted alphabetically) +# Notes: Can't get tags for specific IFD +sub GetAllTags(;$) +{ + local $_; + my $group = shift; + my (%allTags, @groups); + @groups = split ':', $group if $group; + + my $et = new Image::ExifTool; + LoadAllTables(); # first load all our tables + my @tableNames = keys %allTables; + + # loop through all tables and save tag names to %allTags hash + while (@tableNames) { + my $table = GetTagTable(pop @tableNames); + # generate flattened tag names for structure fields if this is an XMP table + if ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP') { + Image::ExifTool::XMP::AddFlattenedTags($table); + } + my $tagID; + foreach $tagID (TagTableKeys($table)) { + my @infoArray = GetTagInfoList($table,$tagID); + my $tagInfo; +GATInfo: foreach $tagInfo (@infoArray) { + my $tag = $$tagInfo{Name}; + $tag or warn("no name for tag!\n"), next; + # don't list subdirectories unless they are writable + next if $$tagInfo{SubDirectory} and not $$tagInfo{Writable}; + next if $$tagInfo{Hidden}; # ignore hidden tags + if (@groups) { + my @tg = $et->GetGroup($tagInfo); + foreach $group (@groups) { + next GATInfo unless grep /^$group$/i, @tg; + } + } + $allTags{$tag} = 1; + } + } + } + return sort keys %allTags; +} + +#------------------------------------------------------------------------------ +# Get list of all writable tags +# Inputs: 0) optional group name (or names separated by colons) +# Returns: tag list (sorted alphabetically) +sub GetWritableTags(;$) +{ + local $_; + my $group = shift; + my (%writableTags, @groups); + @groups = split ':', $group if $group; + + my $et = new Image::ExifTool; + LoadAllTables(); + my @tableNames = keys %allTables; + + while (@tableNames) { + my $tableName = pop @tableNames; + my $table = GetTagTable($tableName); + # generate flattened tag names for structure fields if this is an XMP table + if ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP') { + Image::ExifTool::XMP::AddFlattenedTags($table); + } + # attempt to load Write tables if autoloaded + my @parts = split(/::/,$tableName); + if (@parts > 3) { + my $i = $#parts - 1; + $parts[$i] = "Write$parts[$i]"; # add 'Write' before class name + my $module = join('::',@parts[0..$i]); + eval { require $module }; # (fails silently if nothing loaded) + } + my $tagID; + foreach $tagID (TagTableKeys($table)) { + my @infoArray = GetTagInfoList($table,$tagID); + my $tagInfo; +GWTInfo: foreach $tagInfo (@infoArray) { + my $tag = $$tagInfo{Name}; + $tag or warn("no name for tag!\n"), next; + my $writable = $$tagInfo{Writable}; + next unless $writable or ($$table{WRITABLE} and + not defined $writable and not $$tagInfo{SubDirectory}); + next if $$tagInfo{Hidden}; # ignore hidden tags + if (@groups) { + my @tg = $et->GetGroup($tagInfo); + foreach $group (@groups) { + next GWTInfo unless grep /^$group$/i, @tg; + } + } + $writableTags{$tag} = 1; + } + } + } + return sort keys %writableTags; +} + +#------------------------------------------------------------------------------ +# Get list of all group names +# Inputs: 0) [optional] ExifTool ref, 1) Group family number +# Returns: List of group names (sorted alphabetically) +sub GetAllGroups($;$) +{ + local $_; + my $family = shift || 0; + my $self; + ref $family and $self = $family, $family = shift || 0; + + $family == 3 and return('Doc#', 'Main'); + $family == 4 and return('Copy#'); + $family == 5 and return('[too many possibilities to list]'); + $family == 6 and return(@Image::ExifTool::Exif::formatName[1..$#Image::ExifTool::Exif::formatName]); + + LoadAllTables(); # first load all our tables + + my @tableNames = keys %allTables; + + # loop through all tag tables and get all group names + my %allGroups; + while (@tableNames) { + my $table = GetTagTable(pop @tableNames); + my ($grps, $grp, $tag, $tagInfo); + $allGroups{$grp} = 1 if ($grps = $$table{GROUPS}) and ($grp = $$grps{$family}); + foreach $tag (TagTableKeys($table)) { + my @infoArray = GetTagInfoList($table, $tag); + if ($family == 7) { + foreach $tagInfo (@infoArray) { + my $id = $$tagInfo{TagID}; + if (not defined $id) { + $id = ''; # (just to be safe) + } elsif ($id =~ /^\d+$/) { + $id = sprintf('0x%x', $id) if $self and $$self{OPTIONS}{HexTagIDs}; + } else { + $id =~ s/([^-_A-Za-z0-9])/sprintf('%.2x',ord $1)/ge; + } + $allGroups{'ID-' . $id} = 1; + } + } else { + foreach $tagInfo (@infoArray) { + next unless ($grps = $$tagInfo{Groups}) and ($grp = $$grps{$family}); + $allGroups{$grp} = 1; + } + } + } + } + delete $allGroups{'*'}; # (not a real group) + return sort keys %allGroups; +} + +#------------------------------------------------------------------------------ +# get priority group list for new values +# Inputs: 0) ExifTool object reference +# Returns: List of group names +sub GetNewGroups($) +{ + my $self = shift; + return @{$$self{WRITE_GROUPS}}; +} + +#------------------------------------------------------------------------------ +# Get list of all deletable group names +# Returns: List of group names (sorted alphabetically) +sub GetDeleteGroups() +{ + return sort @delGroups, @delGroup2; +} + +#------------------------------------------------------------------------------ +# Add user-defined tags at run time +# Inputs: 0) destination table name, 1) tagID/tagInfo pairs for tags to add +# Returns: number of tags added +# Notes: will replace existing tags +sub AddUserDefinedTags($%) +{ + local $_; + my ($tableName, %addTags) = @_; + my $table = GetTagTable($tableName) or return 0; + # add tags to writer lookup + Image::ExifTool::TagLookup::AddTags(\%addTags, $tableName); + my $tagID; + my $num = 0; + foreach $tagID (keys %addTags) { + next if $specialTags{$tagID}; + delete $$table{$tagID}; # delete old entry if it existed + AddTagToTable($table, $tagID, $addTags{$tagID}, 1); + ++$num; + } + return $num; +} + +#============================================================================== +# Functions below this are not part of the public API + +#------------------------------------------------------------------------------ +# Maintain backward compatibility for old GetNewValues function name +sub GetNewValues($$;$) +{ + my ($self, $tag, $nvHashPt) = @_; + return $self->GetNewValue($tag, $nvHashPt); +} + +#------------------------------------------------------------------------------ +# Un-escape string according to options settings and clear UTF-8 flag +# Inputs: 0) ExifTool ref, 1) string ref or string ref ref +# Notes: also de-references SCALAR values +sub Sanitize($$) +{ + my ($self, $valPt) = @_; + # de-reference SCALAR references + $$valPt = $$$valPt if ref $$valPt eq 'SCALAR'; + # make sure the Perl UTF-8 flag is OFF for the value if perl 5.6 or greater + # (otherwise our byte manipulations get corrupted!!) + if ($] >= 5.006 and (eval { require Encode; Encode::is_utf8($$valPt) } or $@)) { + local $SIG{'__WARN__'} = \&SetWarning; + # repack by hand if Encode isn't available + $$valPt = $@ ? pack('C*',unpack($] < 5.010000 ? 'U0C*' : 'C0C*',$$valPt)) : Encode::encode('utf8',$$valPt); + } + # un-escape value if necessary + if ($$self{OPTIONS}{Escape}) { + # (XMP.pm and HTML.pm were require'd as necessary when option was set) + if ($$self{OPTIONS}{Escape} eq 'XML') { + $$valPt = Image::ExifTool::XMP::UnescapeXML($$valPt); + } elsif ($$self{OPTIONS}{Escape} eq 'HTML') { + $$valPt = Image::ExifTool::HTML::UnescapeHTML($$valPt, $$self{OPTIONS}{Charset}); + } + } +} + +#------------------------------------------------------------------------------ +# Apply inverse conversions +# Inputs: 0) ExifTool ref, 1) value, 2) tagInfo (or Struct item) ref, +# 3) tag name, 4) group 1 name, 5) conversion type (or undef), +# 6) [optional] want group ("" for structure field) +# Returns: 0) converted value, 1) error string (or undef on success) +# Notes: +# - uses ExifTool "ConvType" member when conversion type is undef +# - conversion types other than 'ValueConv' and 'PrintConv' are treated as 'Raw' +sub ConvInv($$$$$;$$) +{ + my ($self, $val, $tagInfo, $tag, $wgrp1, $convType, $wantGroup) = @_; + my ($err, $type); + + $convType or $convType = $$self{ConvType} || 'PrintConv'; + +Conv: for (;;) { + if (not defined $type) { + # split value into list if necessary + if ($$tagInfo{List}) { + my $listSplit = $$tagInfo{AutoSplit} || $$self{OPTIONS}{ListSplit}; + if (defined $listSplit and not $$tagInfo{Struct} and + ($wantGroup or not defined $wantGroup)) + { + $listSplit = ',?\s+' if $listSplit eq '1' and $$tagInfo{AutoSplit}; + my @splitVal = split /$listSplit/, $val, -1; + $val = @splitVal > 1 ? \@splitVal : @splitVal ? $splitVal[0] : ''; + } + } + $type = $convType; + } elsif ($type eq 'PrintConv') { + $type = 'ValueConv'; + } else { + # split raw value if necessary + if ($$tagInfo{RawJoin} and $$tagInfo{List} and not ref $val) { + my @splitVal = split ' ', $val; + $val = \@splitVal if @splitVal > 1; + } + # finally, do our value check + my ($err2, $v); + if ($$tagInfo{WriteCheck}) { + #### eval WriteCheck ($self, $tagInfo, $val) + $err2 = eval $$tagInfo{WriteCheck}; + $@ and warn($@), $err2 = 'Error evaluating WriteCheck'; + } + unless ($err2) { + my $table = $$tagInfo{Table}; + if ($table and $$table{CHECK_PROC} and not $$tagInfo{RawConvInv}) { + my $checkProc = $$table{CHECK_PROC}; + if (ref $val eq 'ARRAY') { + # loop through array values + foreach $v (@$val) { + $err2 = &$checkProc($self, $tagInfo, \$v, $convType); + last if $err2; + } + } else { + $err2 = &$checkProc($self, $tagInfo, \$val, $convType); + } + } + } + if (defined $err2) { + if ($err2) { + $err = "$err2 for $wgrp1:$tag"; + $self->VPrint(2, "$err\n"); + undef $val; # value was invalid + } else { + $err = $err2; # empty error (quietly don't write tag) + } + } + last; + } + my $conv = $$tagInfo{$type}; + my $convInv = $$tagInfo{"${type}Inv"}; + # nothing to do at this level if no conversion defined + next unless defined $conv or defined $convInv; + + my (@valList, $index, $convList, $convInvList); + if (ref $val eq 'ARRAY') { + # handle ValueConv of ListSplit and AutoSplit values + @valList = @$val; + $val = $valList[$index = 0]; + } elsif (ref $conv eq 'ARRAY' or ref $convInv eq 'ARRAY') { + # handle conversion lists + @valList = split /$listSep{$type}/, $val; + $val = $valList[$index = 0]; + if (ref $conv eq 'ARRAY') { + $convList = $conv; + $conv = $$conv[0]; + } + if (ref $convInv eq 'ARRAY') { + $convInvList = $convInv; + $convInv = $$convInv[0]; + } + } + # loop through multiple values if necessary + for (;;) { + if ($convInv) { + # capture eval warnings too + local $SIG{'__WARN__'} = \&SetWarning; + undef $evalWarning; + if (ref($convInv) eq 'CODE') { + $val = &$convInv($val, $self); + } else { + #### eval PrintConvInv/ValueConvInv ($val, $self, $wantGroup) + $val = eval $convInv; + $@ and $evalWarning = $@; + } + if ($evalWarning) { + # an empty warning ("\n") ignores tag with no error + if ($evalWarning eq "\n") { + $err = '' unless defined $err; + } else { + $err = CleanWarning() . " in $wgrp1:$tag (${type}Inv)"; + $self->VPrint(2, "$err\n"); + } + undef $val; + last Conv; + } elsif (not defined $val) { + $err = "Error converting value for $wgrp1:$tag (${type}Inv)"; + $self->VPrint(2, "$err\n"); + last Conv; + } + } elsif ($conv) { + if (ref $conv eq 'HASH' and (not exists $$tagInfo{"${type}Inv"} or $convInvList)) { + my ($multi, $lc); + # insert alternate language print conversions if required + if ($$self{CUR_LANG} and $type eq 'PrintConv' and + ref($lc = $$self{CUR_LANG}{$tag}) eq 'HASH' and + ($lc = $$lc{PrintConv})) + { + my %newConv; + foreach (keys %$conv) { + my $val = $$conv{$_}; + defined $$lc{$val} or $newConv{$_} = $val, next; + $newConv{$_} = $self->Decode($$lc{$val}, 'UTF8'); + } + if ($$conv{BITMASK}) { + foreach (keys %{$$conv{BITMASK}}) { + my $val = $$conv{BITMASK}{$_}; + defined $$lc{$val} or $newConv{BITMASK}{$_} = $val, next; + $newConv{BITMASK}{$_} = $self->Decode($$lc{$val}, 'UTF8'); + } + } + $conv = \%newConv; + } + undef $evalWarning; + if ($$conv{BITMASK}) { + my $lookupBits = $$conv{BITMASK}; + my ($wbits, $tbits) = @$tagInfo{'BitsPerWord','BitsTotal'}; + my ($val2, $err2) = EncodeBits($val, $lookupBits, $wbits, $tbits); + if ($err2) { + # ok, try matching a straight value + ($val, $multi) = ReverseLookup($val, $conv); + unless (defined $val) { + $err = "Can't encode $wgrp1:$tag ($err2)"; + $self->VPrint(2, "$err\n"); + last Conv; + } + } elsif (defined $val2) { + $val = $val2; + } else { + delete $$conv{BITMASK}; + ($val, $multi) = ReverseLookup($val, $conv); + $$conv{BITMASK} = $lookupBits; + } + } else { + ($val, $multi) = ReverseLookup($val, $conv); + } + if (not defined $val) { + my $prob = $evalWarning ? lcfirst CleanWarning() : ($multi ? 'matches more than one ' : 'not in ') . $type; + $err = "Can't convert $wgrp1:$tag ($prob)"; + $self->VPrint(2, "$err\n"); + last Conv; + } elsif ($evalWarning) { + $self->VPrint(2, CleanWarning() . " for $wgrp1:$tag\n"); + } + } elsif (not $$tagInfo{WriteAlso}) { + $err = "Can't convert value for $wgrp1:$tag (no ${type}Inv)"; + $self->VPrint(2, "$err\n"); + undef $val; + last Conv; + } + } + last unless @valList; + $valList[$index] = $val; + if (++$index >= @valList) { + # leave AutoSplit lists in ARRAY form, or join conversion lists + $val = $$tagInfo{List} ? \@valList : join ' ', @valList; + last; + } + $conv = $$convList[$index] if $convList; + $convInv = $$convInvList[$index] if $convInvList; + $val = $valList[$index]; + } + } # end ValueConv/PrintConv loop + + return($val, $err); +} + +#------------------------------------------------------------------------------ +# Convert tag names to values or variables in a string +# (eg. '${EXIF:ISO}x $$' --> '100x $' without hash ref, or "$info{'EXIF:ISO'}x $" with) +# Inputs: 0) ExifTool object ref, 1) reference to list of found tags +# 2) string with embedded tag names, 3) Options: +# undef - set missing tags to '' +# 'Error' - issue minor error on missing tag (and return undef) +# 'Warn' - issue minor warning on missing tag (and return undef) +# 'Silent' - just return undef on missing tag (no errors/warnings) +# Hash ref - defined to interpolate as variables in string instead of values +# --> receives tag/value pairs for interpolation of the variables +# 4) document group name if extracting from a specific document +# 5) hash ref to cache tag keys for subsequent calls in document loop +# Returns: string with embedded tag values (or '$info{TAGNAME}' entries with Hash ref option) +# Notes: +# - tag names are not case sensitive and may end with '#' for ValueConv value +# - uses MissingTagValue option if set +# - '$GROUP:all' evaluates to 1 if any tag from GROUP exists, or 0 otherwise +# - advanced feature allows Perl expressions inside braces (eg. '${model;tr/ //d}') +# - an error/warning in an advanced expression ("${TAG;EXPR}") generates an error +# if option set to 'Error', or a warning otherwise +sub InsertTagValues($$$;$$$) +{ + local $_; + my ($self, $foundTags, $line, $opt, $docGrp, $cache) = @_; + my $rtnStr = ''; + my ($docNum, $tag); + if ($docGrp) { + $docNum = $docGrp =~ /(\d+)$/ ? $1 : 0; + } else { + undef $cache; # no cache if no document groups + } + while ($line =~ s/(.*?)\$(\{\s*)?([-\w]*\w|\$|\/)//s) { + my ($pre, $bra, $var) = ($1, $2, $3); + my (@tags, $val, $tg, @val, $type, $expr, $didExpr, $level, $asList); + # "$$" represents a "$" symbol, and "$/" is a newline + if ($var eq '$' or $var eq '/') { + $line =~ s/^\s*\}// if $bra; + if ($var eq '/') { + $var = "\n"; + } elsif ($line =~ /^self\b/ and not $rtnStr =~ /\$$/) { + $var = '$$'; # ("$$self{var}" in string) + } + $rtnStr .= "$pre$var"; + next; + } + # allow multiple group names + while ($line =~ /^:([-\w]*\w)(.*)/s) { + my $group = $var; + ($var, $line) = ($1, $2); + $var = "$group:$var"; + } + # allow trailing '#' to indicate ValueConv value + $type = 'ValueConv' if $line =~ s/^#//; + # special advanced formatting '@' feature to evaluate list values separately + if ($bra and $line =~ s/^\@(#)?//) { + $asList = 1; + $type = 'ValueConv' if $1; + } + # remove trailing bracket if there was a leading one + # and extract Perl expression from inside brackets if it exists + if ($bra and $line !~ s/^\s*\}// and $line =~ s/^\s*;\s*(.*?)\s*\}//s) { + my $part = $1; + $expr = ''; + for ($level=0; ; --$level) { + # increase nesting level for each opening brace + ++$level while $part =~ /\{/g; + $expr .= $part; + last unless $level and $line =~ s/^(.*?)\s*\}//s; # get next part + $part = $1; + $expr .= '}'; # this brace was part of the expression + } + # use default Windows filename filter if expression is empty + $expr = 'tr(/\\\\?*:|"<>\\0)()d' unless length $expr; + } + push @tags, $var; + ExpandShortcuts(\@tags); + @tags or $rtnStr .= $pre, next; + # save advanced formatting expression to allow access by user-defined ValueConv + $$self{FMT_EXPR} = $expr; + + for (;;) { + # temporarily reset ListJoin option if evaluating list values separately + my $oldListJoin; + $oldListJoin = $self->Options(ListJoin => undef) if $asList; + $tag = shift @tags; + my $lcTag = lc $tag; + if ($cache and $lcTag !~ /(^|:)all$/) { + # remove group from tag name (but not lower-case version) + my $group; + $tag =~ s/^(.*):// and $group = $1; + # cache tag keys to speed processing for a large number of sub-documents + # (similar to code in BuildCompositeTags(), but this is case-insensitive) + my $cacheTag = $$cache{$lcTag}; + unless ($cacheTag) { + $cacheTag = $$cache{$lcTag} = [ ]; + # find all matching keys, organize into groups, and store in cache + my $ex = $$self{TAG_EXTRA}; + my @matches = grep /^$tag(\s|$)/i, @$foundTags; + @matches = $self->GroupMatches($group, \@matches) if defined $group; + foreach (@matches) { + my $doc = $$ex{$_} ? $$ex{$_}{G3} || 0 : 0; + if (defined $$cacheTag[$doc]) { + next unless $$cacheTag[$doc] =~ / \((\d+)\)$/; + my $cur = $1; + # keep the most recently extracted tag + next if / \((\d+)\)$/ and $1 < $cur; + } + $$cacheTag[$doc] = $_; + } + } + my $doc = $lcTag =~ /\b(main|doc(\d+)):/ ? ($2 || 0) : $docNum; + if ($$cacheTag[$doc]) { + $tag = $$cacheTag[$doc]; + $val = $self->GetValue($tag, $type); + } + } else { + # add document number to tag if specified and it doesn't already exist + if ($docGrp and $lcTag !~ /\b(main|doc\d+):/) { + $tag = $docGrp . ':' . $tag; + $lcTag = lc $tag; + } + if ($lcTag eq 'all') { + $val = 1; # always some tag available + } elsif (defined $$self{OPTIONS}{UserParam}{$lcTag}) { + $val = $$self{OPTIONS}{UserParam}{$lcTag}; + } elsif ($tag =~ /(.*):(.+)/) { + my $group; + ($group, $tag) = ($1, $2); + if (lc $tag eq 'all') { + # see if any tag from the specified group exists + my $match = $self->GroupMatches($group, $foundTags); + $val = $match ? 1 : 0; + } else { + # find the specified tag + my @matches = grep /^$tag(\s|$)/i, @$foundTags; + @matches = $self->GroupMatches($group, \@matches); + foreach $tg (@matches) { + if (defined $val and $tg =~ / \((\d+)\)$/) { + # take the most recently extracted tag + my $tagNum = $1; + next if $tag !~ / \((\d+)\)$/ or $1 > $tagNum; + } + $val = $self->GetValue($tg, $type); + $tag = $tg; + last unless $tag =~ / /; # all done if we got our best match + } + } + } elsif ($tag eq 'self') { + $val = $self; # ("$self{var}" or "$self->{var}" in string) + } else { + # get the tag value + $val = $self->GetValue($tag, $type); + unless (defined $val) { + # check for tag name with different case + ($tg) = grep /^$tag$/i, @$foundTags; + if (defined $tg) { + $val = $self->GetValue($tg, $type); + $tag = $tg; + } + } + } + } + $self->Options(ListJoin => $oldListJoin) if $asList; + if (ref $val eq 'ARRAY') { + push @val, @$val; + undef $val; + last unless @tags; + } elsif (ref $val eq 'SCALAR') { + if ($$self{OPTIONS}{Binary} or $$val =~ /^Binary data/) { + $val = $$val; + } else { + $val = 'Binary data ' . length($$val) . ' bytes'; + } + } elsif (ref $val eq 'HASH') { + require 'Image/ExifTool/XMPStruct.pl'; + $val = Image::ExifTool::XMP::SerializeStruct($val); + } elsif (not defined $val) { + $val = $$self{OPTIONS}{MissingTagValue} if $asList; + } + last unless @tags; + push @val, $val if defined $val; + undef $val; + } + if (@val) { + push @val, $val if defined $val; + $val = join $$self{OPTIONS}{ListSep}, @val; + } else { + push @val, $val if defined $val; # (so the eval has access to @val if required) + } + # evaluate advanced formatting expression if given (eg. "${TAG;EXPR}") + if (defined $expr and defined $val) { + local $SIG{'__WARN__'} = \&SetWarning; + undef $evalWarning; + $advFmtSelf = $self; + if ($asList) { + foreach (@val) { + #### eval advanced formatting expression ($_, $self, @val, $advFmtSelf) + eval $expr; + $@ and $evalWarning = $@; + } + # join back together if any values are still defined + @val = grep defined, @val; + $val = @val ? join $$self{OPTIONS}{ListSep}, @val : undef; + } else { + $_ = $val; + #### eval advanced formatting expression ($_, $self, @val, $advFmtSelf) + eval $expr; + $@ and $evalWarning = $@; + $val = ref $_ eq 'ARRAY' ? join($$self{OPTIONS}{ListSep}, @$_): $_; + } + if ($evalWarning) { + my $g3 = ($docGrp and $var !~ /\b(main|doc\d+):/i) ? $docGrp . ':' : ''; + my $str = CleanWarning() . " for '$g3${var}'"; + if ($opt) { + if ($opt eq 'Error') { + $self->Error($str); + } elsif ($opt ne 'Silent') { + $self->Warn($str); + } + } + } + undef $advFmtSelf; + $didExpr = 1; # set flag indicating an expression was evaluated + } + unless (defined $val or ref $opt) { + $val = $$self{OPTIONS}{MissingTagValue}; + unless (defined $val) { + my $g3 = ($docGrp and $var !~ /\b(main|doc\d+):/i) ? $docGrp . ':' : ''; + my $msg = $didExpr ? "Advanced formatting expression returned undef for '$g3${var}'" : + "Tag '$g3${var}' not defined"; + no strict 'refs'; + $opt and ($opt eq 'Silent' or &$opt($self, $msg, 2)) and return $$self{FMT_EXPR} = undef; + $val = ''; + } + } + if (ref $opt eq 'HASH') { + $var .= '#' if $type; + if (defined $expr) { + # generate unique variable name for this modified tag value + my $i = 1; + ++$i while exists $$opt{"$var.expr$i"}; + $var .= '.expr' . $i; + } + $rtnStr .= "$pre\$info{'${var}'}"; + $$opt{$var} = $val; + } else { + $rtnStr .= "$pre$val"; + } + } + $$self{FMT_EXPR} = undef; + return $rtnStr . $line; +} + +#------------------------------------------------------------------------------ +# Reformat date/time value in $_ based on specified format string +# Inputs: 0) date/time format string +sub DateFmt($) +{ + my $et = bless { OPTIONS => { DateFormat => shift, StrictDate => 1 } }; + my $shift; + if ($advFmtSelf and defined($shift = $$advFmtSelf{OPTIONS}{GlobalTimeShift})) { + $$et{OPTIONS}{GlobalTimeShift} = $shift; + $$et{GLOBAL_TIME_OFFSET} = $$advFmtSelf{GLOBAL_TIME_OFFSET}; + } + $_ = $et->ConvertDateTime($_); + defined $_ or warn "Error converting date/time\n"; + $$advFmtSelf{GLOBAL_TIME_OFFSET} = $$et{GLOBAL_TIME_OFFSET} if $shift; +} + +#------------------------------------------------------------------------------ +# Utility routine to remove duplicate items from default input string +# Inputs: 0) true to set $_ to undef if not changed +# Notes: - for use only in advanced formatting expressions +sub NoDups +{ + my %seen; + my $sep = $advFmtSelf ? $$advFmtSelf{OPTIONS}{ListSep} : ', '; + my $new = join $sep, grep { !$seen{$_}++ } split /\Q$sep\E/, $_; + $_ = ($_[0] and $new eq $_) ? undef : $new; +} + +#------------------------------------------------------------------------------ +# Is specified tag writable +# Inputs: 0) tag name, case insensitive (optional group name currently ignored) +# Returns: 0=exists but not writable, 1=writable, undef=doesn't exist +sub IsWritable($) +{ + my $tag = shift; + $tag =~ s/^(.*)://; # ignore group name + my @tagInfo = FindTagInfo($tag); + unless (@tagInfo) { + return 0 if TagExists($tag); + return undef; + } + my $tagInfo; + foreach $tagInfo (@tagInfo) { + return $$tagInfo{Writable} ? 1 : 0 if defined $$tagInfo{Writable}; + return 1 if $$tagInfo{Table}{WRITABLE}; + # must call WRITE_PROC to autoload writer because this may set the writable tag + my $writeProc = $$tagInfo{Table}{WRITE_PROC}; + if ($writeProc) { + no strict 'refs'; + &$writeProc(); # dummy call to autoload writer + return 1 if $$tagInfo{Writable}; + } + } + return 0; +} + +#------------------------------------------------------------------------------ +# Check to see if these are the same file +# Inputs: 0) ExifTool ref, 1) first file name, 2) second file name +# Returns: true if file names reference the same file +sub IsSameFile($$$) +{ + my ($self, $file, $file2) = @_; + return 0 unless lc $file eq lc $file2; # (only looking for differences in case) + my ($isSame, $interrupted); + my $tmp1 = "${file}_ExifTool_tmp_$$"; + my $tmp2 = "${file2}_ExifTool_tmp_$$"; + { + local *TMP1; + local $SIG{INT} = sub { $interrupted = 1 }; + if ($self->Open(\*TMP1, $tmp1, '>')) { + close TMP1; + $isSame = 1 if $self->Exists($tmp2); + $self->Unlink($tmp1); + } + } + if ($interrupted and $SIG{INT}) { + no strict 'refs'; + &{$SIG{INT}}(); + } + return $isSame; +} + +#------------------------------------------------------------------------------ +# Is this a raw file type? +# Inputs: 0) ExifTool ref +# Returns: true if FileType is a type of RAW image +sub IsRawType($) +{ + my $self = shift; + return $rawType{$$self{FileType}}; +} + +#------------------------------------------------------------------------------ +# Create directory for specified file +# Inputs: 0) ExifTool ref, 1) complete file name including path +# Returns: 1 = directory created, 0 = nothing done, -1 = error +my $k32CreateDir; +sub CreateDirectory($$) +{ + local $_; + my ($self, $file) = @_; + my $rtnVal = 0; + my $enc = $$self{OPTIONS}{CharsetFileName}; + my $dir; + ($dir = $file) =~ s/[^\/]*$//; # remove filename from path specification + # recode as UTF-8 if necessary + if ($dir and not $self->IsDirectory($dir)) { + my @parts = split /\//, $dir; + $dir = ''; + foreach (@parts) { + $dir .= $_; + if (length $dir and not $self->IsDirectory($dir)) { + # create directory since it doesn't exist + my $d2 = $dir; # (must make a copy in case EncodeFileName recodes it) + if ($self->EncodeFileName($d2)) { + # handle Windows Unicode directory names + unless (eval { require Win32::API }) { + $self->Warn('Install Win32::API to create directories with Unicode names'); + return -1; + } + unless ($k32CreateDir) { + return -1 if defined $k32CreateDir; + $k32CreateDir = new Win32::API('KERNEL32', 'CreateDirectoryW', 'PP', 'I'); + unless ($k32CreateDir) { + $self->Warn('Error calling Win32::API::CreateDirectoryW'); + $k32CreateDir = 0; + return -1; + } + } + $k32CreateDir->Call($d2, 0) or return -1; + } else { + mkdir($d2, 0777) or return -1; + } + $rtnVal = 1; + } + $dir .= '/'; + } + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Copy file attributes from one file to another +# Inputs: 0) ExifTool ref, 1) source file name, 2) destination file name +# Notes: eventually add support for extended attributes? +sub CopyFileAttrs($$$) +{ + my ($self, $src, $dst) = @_; + my ($mode, $uid, $gid) = (stat($src))[2, 4, 5]; + # copy file attributes unless we already set them + if (defined $mode and not defined $self->GetNewValue('FilePermissions')) { + eval { chmod($mode & 07777, $dst) }; + } + my $newUid = $self->GetNewValue('FileUserID'); + my $newGid = $self->GetNewValue('FileGroupID'); + if (defined $uid and defined $gid and (not defined $newUid or not defined $newGid)) { + defined $newGid and $gid = $newGid; + defined $newUid and $uid = $newUid; + eval { chown($uid, $gid, $dst) }; + } +} + +#------------------------------------------------------------------------------ +# Get new file path name +# Inputs: 0) existing name (may contain directory), +# 1) new file name, new directory, or new path (dir+name) +# Returns: new file path name +sub GetNewFileName($$) +{ + my ($oldName, $newName) = @_; + my ($dir, $name) = ($oldName =~ m{(.*/)(.*)}); + ($dir, $name) = ('', $oldName) unless defined $dir; + if ($newName =~ m{/$}) { + $newName = "$newName$name"; # change dir only + } elsif ($newName !~ m{/}) { + $newName = "$dir$newName"; # change name only if newname doesn't specify dir + } # else change dir and name + return $newName; +} + +#------------------------------------------------------------------------------ +# Get next available tag key +# Inputs: 0) hash reference (keys are tag keys), 1) tag name +# Returns: next available tag key +sub NextFreeTagKey($$) +{ + my ($info, $tag) = @_; + return $tag unless exists $$info{$tag}; + my $i; + for ($i=1; ; ++$i) { + my $key = "$tag ($i)"; + return $key unless exists $$info{$key}; + } +} + +#------------------------------------------------------------------------------ +# Reverse hash lookup +# Inputs: 0) value, 1) hash reference +# Returns: Hash key or undef if not found (plus flag for multiple matches in list context) +sub ReverseLookup($$) +{ + my ($val, $conv) = @_; + return undef unless defined $val; + my $multi; + if ($val =~ /^Unknown\s*\((.*)\)$/i) { + $val = $1; # was unknown + if ($val =~ /^0x([\da-fA-F]+)$/) { + # disable "Hexadecimal number > 0xffffffff non-portable" warning + local $SIG{'__WARN__'} = sub { }; + $val = hex($val); # convert hex value + } + } else { + my $qval = $val; + $qval =~ s/\s+$//; # remove trailing whitespace + $qval = quotemeta $qval; + my @patterns = ( + "^$qval\$", # exact match + "^(?i)$qval\$", # case-insensitive + "^(?i)$qval", # beginning of string + "(?i)$qval", # substring + ); + # hash entries to ignore in reverse lookup + my ($pattern, $found, $matches); +PAT: foreach $pattern (@patterns) { + $matches = scalar grep /$pattern/, values(%$conv); + next unless $matches; + # multiple matches are bad unless they were exact + if ($matches > 1 and $pattern !~ /\$$/) { + # don't match entries that we should ignore + foreach (keys %ignorePrintConv) { + --$matches if defined $$conv{$_} and $$conv{$_} =~ /$pattern/; + } + last if $matches > 1; + } + foreach (sort keys %$conv) { + next if $$conv{$_} !~ /$pattern/ or $ignorePrintConv{$_}; + $val = $_; + $found = 1; + last PAT; + } + } + unless ($found) { + # call OTHER conversion routine if available + if ($$conv{OTHER}) { + local $SIG{'__WARN__'} = \&SetWarning; + undef $evalWarning; + $val = &{$$conv{OTHER}}($val,1,$conv); + } else { + $val = undef; + } + $multi = 1 if $matches > 1; + } + } + return ($val, $multi) if wantarray; + return $val; +} + +#------------------------------------------------------------------------------ +# Return true if we are deleting or overwriting the specified tag +# Inputs: 0) ExifTool object ref, 1) new value hash reference +# 2) optional tag value (before RawConv) if deleting specific values +# Returns: >0 - tag should be overwritten +# =0 - the tag should be preserved +# <0 - not sure, we need the old value to tell (if there is no old value +# then the tag should be written if $$nvHash{IsCreating} is true) +# Notes: $$nvHash{Value} is updated with the new value when shifting a value +sub IsOverwriting($$;$) +{ + my ($self, $nvHash, $val) = @_; + return 0 unless $nvHash; + # overwrite regardless if no DelValues specified + return 1 unless $$nvHash{DelValue}; + # never overwrite if DelValue list exists but is empty + my $shift = $$nvHash{Shift}; + return 0 unless @{$$nvHash{DelValue}} or defined $shift; + # return "don't know" if we don't have a value to test + return -1 unless defined $val; + # apply raw conversion if necessary + my $tagInfo = $$nvHash{TagInfo}; + my $conv = $$tagInfo{RawConv}; + if ($conv) { + local $SIG{'__WARN__'} = \&SetWarning; + undef $evalWarning; + if (ref $conv eq 'CODE') { + $val = &$conv($val, $self); + } else { + my ($priority, @grps); + my $tag = $$tagInfo{Name}; + #### eval RawConv ($self, $val, $tag, $tagInfo, $priority, @grps) + $val = eval $conv; + $@ and $evalWarning = $@; + } + return -1 unless defined $val; + } + # do not overwrite if only creating + return 0 if $$nvHash{CreateOnly}; + # apply time/number shift if necessary + if (defined $shift) { + my $shiftType = $$tagInfo{Shift}; + unless ($shiftType and $shiftType eq 'Time') { + unless (IsFloat($val)) { + # do the ValueConv to try to get a number + my $conv = $$tagInfo{ValueConv}; + if (defined $conv) { + local $SIG{'__WARN__'} = \&SetWarning; + undef $evalWarning; + if (ref $conv eq 'CODE') { + $val = &$conv($val, $self); + } elsif (not ref $conv) { + #### eval ValueConv ($val, $self) + $val = eval $conv; + $@ and $evalWarning = $@; + } + if ($evalWarning) { + $self->Warn("ValueConv $$tagInfo{Name}: " . CleanWarning()); + return 0; + } + } + unless (defined $val and IsFloat($val)) { + $self->Warn("Can't shift $$tagInfo{Name} (not a number)"); + return 0; + } + } + $shiftType = 'Number'; # allow any number to be shifted + } + require 'Image/ExifTool/Shift.pl'; + my $err = $self->ApplyShift($shiftType, $shift, $val, $nvHash); + if ($err) { + $self->Warn("$err when shifting $$tagInfo{Name}"); + return 0; + } + # ensure that the shifted value is valid and reformat if necessary + my $checkVal = $self->GetNewValue($nvHash); + return 0 unless defined $checkVal; + # don't bother overwriting if value is the same + return 0 if $val eq $$nvHash{Value}[0]; + return 1; + } + # return 1 if value matches a DelValue + my $delVal; + foreach $delVal (@{$$nvHash{DelValue}}) { + return 1 if $val eq $delVal; + } + return 0; +} + +#------------------------------------------------------------------------------ +# Get write group for specified tag +# Inputs: 0) new value hash reference +# Returns: Write group name +sub GetWriteGroup($) +{ + return $_[0]{WriteGroup}; +} + +#------------------------------------------------------------------------------ +# Get name of write group or family 1 group +# Inputs: 0) ExifTool ref, 1) tagInfo ref, 2) write group name +# Returns: Name of group for verbose message +sub GetWriteGroup1($$) +{ + my ($self, $tagInfo, $writeGroup) = @_; + return $writeGroup unless $writeGroup =~ /^(MakerNotes|XMP|Composite|QuickTime)$/; + return $self->GetGroup($tagInfo, 1); +} + +#------------------------------------------------------------------------------ +# Get new value hash for specified tagInfo/writeGroup +# Inputs: 0) ExifTool object reference, 1) reference to tag info hash +# 2) Write group name, 3) Options: 'delete' or 'create' new value hash +# 4) optional ProtectSaved value, 5) true if we are deleting a value +# Returns: new value hash reference for specified write group +# (or first new value hash in linked list if write group not specified) +# Notes: May return undef when 'create' is used with ProtectSaved +sub GetNewValueHash($$;$$$$) +{ + my ($self, $tagInfo, $writeGroup, $opts) = @_; + return undef unless $tagInfo; + my $nvHash = $$self{NEW_VALUE}{$tagInfo}; + + my %opts; # quick lookup for options + $opts and $opts{$opts} = 1; + $writeGroup = '' unless defined $writeGroup; + + if ($writeGroup) { + # find the new value in the list with the specified write group + while ($nvHash and $$nvHash{WriteGroup} ne $writeGroup) { + # QuickTime and All are special cases because all group1 tags may be updated at once + last if $$nvHash{WriteGroup} =~ /^(QuickTime|All)$/; + # replace existing entry if WriteGroup is 'All' (avoids confusion of forum10349) + last if $$tagInfo{WriteGroup} and $$tagInfo{WriteGroup} eq 'All'; + $nvHash = $$nvHash{Next}; + } + } + # remove this entry if deleting, or if creating a new entry and + # this entry is marked with "Save" flag + if (defined $nvHash and ($opts{'delete'} or ($opts{'create'} and $$nvHash{Save}))) { + my $protect = (defined $_[4] and defined $$nvHash{Save} and $$nvHash{Save} > $_[4]); + # this is a bit tricky: we want to add to a protected nvHash only if we + # are adding a conditional delete ($_[5] true or DelValue with no Shift) + # or accumulating List items (NoReplace true) + if ($protect and not ($opts{create} and ($$nvHash{NoReplace} or $_[5] or + ($$nvHash{DelValue} and not defined $$nvHash{Shift})))) + { + return undef; # honour ProtectSaved value by not writing this tag + } elsif ($opts{'delete'}) { + $self->RemoveNewValueHash($nvHash, $tagInfo); + undef $nvHash; + } else { + # save a copy of this new value hash + my %copy = %$nvHash; + # make copy of Value and DelValue lists + my $key; + foreach $key (keys %copy) { + next unless ref $copy{$key} eq 'ARRAY'; + $copy{$key} = [ @{$copy{$key}} ]; + } + my $saveHash = $$self{SAVE_NEW_VALUE}; + # add to linked list of saved new value hashes + $copy{Next} = $$saveHash{$tagInfo}; + $$saveHash{$tagInfo} = \%copy; + delete $$nvHash{Save}; # don't save it again + $$nvHash{AddBefore} = scalar @{$$nvHash{Value}} if $protect and $$nvHash{Value}; + } + } + if (not defined $nvHash and $opts{'create'}) { + # create a new entry + $nvHash = { + TagInfo => $tagInfo, + WriteGroup => $writeGroup, + IsNVH => 1, # set flag so we can recognize a new value hash + }; + # add entry to our NEW_VALUE hash + if ($$self{NEW_VALUE}{$tagInfo}) { + # add to end of linked list + my $lastHash = LastInList($$self{NEW_VALUE}{$tagInfo}); + $$lastHash{Next} = $nvHash; + } else { + $$self{NEW_VALUE}{$tagInfo} = $nvHash; + } + } + return $nvHash; +} + +#------------------------------------------------------------------------------ +# Load all tag tables +sub LoadAllTables() +{ + return if $loadedAllTables; + + # load all of our non-referenced tables (first our modules) + my $table; + foreach $table (@loadAllTables) { + my $tableName = "Image::ExifTool::$table"; + $tableName .= '::Main' unless $table =~ /:/; + GetTagTable($tableName); + } + # (then our special tables) + GetTagTable('Image::ExifTool::Extra'); + GetTagTable('Image::ExifTool::Composite'); + # recursively load all tables referenced by the current tables + my @tableNames = keys %allTables; + my %pushedTables; + while (@tableNames) { + $table = GetTagTable(shift @tableNames); + # call write proc if it exists in case it adds tags to the table + my $writeProc = $$table{WRITE_PROC}; + if ($writeProc) { + no strict 'refs'; + &$writeProc(); + } + # recursively scan through tables in subdirectories + foreach (TagTableKeys($table)) { + my @infoArray = GetTagInfoList($table,$_); + my $tagInfo; + foreach $tagInfo (@infoArray) { + my $subdir = $$tagInfo{SubDirectory} or next; + my $tableName = $$subdir{TagTable} or next; + # next if table already loaded or queued for loading + next if $allTables{$tableName} or $pushedTables{$tableName}; + push @tableNames, $tableName; # must scan this one too + $pushedTables{$tableName} = 1; + } + } + } + $loadedAllTables = 1; +} + +#------------------------------------------------------------------------------ +# Remove new value hash from linked list (and save if necessary) +# Inputs: 0) ExifTool object reference, 1) new value hash ref, 2) tagInfo ref +sub RemoveNewValueHash($$$) +{ + my ($self, $nvHash, $tagInfo) = @_; + my $firstHash = $$self{NEW_VALUE}{$tagInfo}; + if ($nvHash eq $firstHash) { + # remove first entry from linked list + if ($$nvHash{Next}) { + $$self{NEW_VALUE}{$tagInfo} = $$nvHash{Next}; + } else { + delete $$self{NEW_VALUE}{$tagInfo}; + } + } else { + # find the list element pointing to this hash + $firstHash = $$firstHash{Next} while $$firstHash{Next} ne $nvHash; + # remove from linked list + $$firstHash{Next} = $$nvHash{Next}; + } + # save the existing entry if necessary + if ($$nvHash{Save}) { + my $saveHash = $$self{SAVE_NEW_VALUE}; + # add to linked list of saved new value hashes + $$nvHash{Next} = $$saveHash{$tagInfo}; + $$saveHash{$tagInfo} = $nvHash; + } +} + +#------------------------------------------------------------------------------ +# Remove all new value entries for specified group +# Inputs: 0) ExifTool object reference, 1) group name +sub RemoveNewValuesForGroup($$) +{ + my ($self, $group) = @_; + + return unless $$self{NEW_VALUE}; + + # make list of all groups we must remove + my @groups = ( $group ); + push @groups, @{$removeGroups{$group}} if $removeGroups{$group}; + + my ($out, @keys, $hashKey); + $out = $$self{OPTIONS}{TextOut} if $$self{OPTIONS}{Verbose} > 1; + + # loop though all new values, and remove any in this group + @keys = keys %{$$self{NEW_VALUE}}; + foreach $hashKey (@keys) { + my $nvHash = $$self{NEW_VALUE}{$hashKey}; + # loop through each entry in linked list + for (;;) { + my $nextHash = $$nvHash{Next}; + my $tagInfo = $$nvHash{TagInfo}; + my ($grp0,$grp1) = $self->GetGroup($tagInfo); + my $wgrp = $$nvHash{WriteGroup}; + # use group1 if write group is not specific + $wgrp = $grp1 if $wgrp eq $grp0; + if (grep /^($grp0|$wgrp)$/i, @groups) { + $out and print $out "Removed new value for $wgrp:$$tagInfo{Name}\n"; + # remove from linked list + $self->RemoveNewValueHash($nvHash, $tagInfo); + } + $nvHash = $nextHash or last; + } + } +} + +#------------------------------------------------------------------------------ +# Get list of tagInfo hashes for all new data +# Inputs: 0) ExifTool object reference, 1) optional tag table pointer +# Returns: list of tagInfo hashes +sub GetNewTagInfoList($;$) +{ + my ($self, $tagTablePtr) = @_; + my @tagInfoList; + my $nv = $$self{NEW_VALUE}; + if ($nv) { + my $hashKey; + foreach $hashKey (keys %$nv) { + my $tagInfo = $$nv{$hashKey}{TagInfo}; + next if $tagTablePtr and $tagTablePtr ne $$tagInfo{Table}; + push @tagInfoList, $tagInfo; + } + } + return @tagInfoList; +} + +#------------------------------------------------------------------------------ +# Get hash of tagInfo references keyed on tagID for a specific table +# Inputs: 0) ExifTool object reference, 1-N) tag table pointers +# Returns: hash reference +# Notes: returns only one tagInfo ref for each conditional list +sub GetNewTagInfoHash($@) +{ + my $self = shift; + my (%tagInfoHash, $hashKey); + my $nv = $$self{NEW_VALUE}; + while ($nv) { + my $tagTablePtr = shift || last; + foreach $hashKey (keys %$nv) { + my $tagInfo = $$nv{$hashKey}{TagInfo}; + next if $tagTablePtr and $tagTablePtr ne $$tagInfo{Table}; + $tagInfoHash{$$tagInfo{TagID}} = $tagInfo; + } + } + return \%tagInfoHash; +} + +#------------------------------------------------------------------------------ +# Get a tagInfo/tagID hash for subdirectories we need to add +# Inputs: 0) ExifTool object reference, 1) parent tag table reference +# 2) parent directory name (taken from GROUP0 of tag table if not defined) +# Returns: Reference to Hash of subdirectory tagInfo references keyed by tagID +# (plus Reference to edit directory hash in list context) +sub GetAddDirHash($$;$) +{ + my ($self, $tagTablePtr, $parent) = @_; + $parent or $parent = $$tagTablePtr{GROUPS}{0}; + my $tagID; + my %addDirHash; + my %editDirHash; + my $addDirs = $$self{ADD_DIRS}; + my $editDirs = $$self{EDIT_DIRS}; + foreach $tagID (TagTableKeys($tagTablePtr)) { + my @infoArray = GetTagInfoList($tagTablePtr,$tagID); + my $tagInfo; + foreach $tagInfo (@infoArray) { + next unless $$tagInfo{SubDirectory}; + # get name for this sub directory + # (take directory name from SubDirectory DirName if it exists, + # otherwise Group0 name of SubDirectory TagTable or tag Group1 name) + my $dirName = $$tagInfo{SubDirectory}{DirName}; + unless ($dirName) { + # use tag name for directory name and save for next time + $dirName = $$tagInfo{Name}; + $$tagInfo{SubDirectory}{DirName} = $dirName; + } + # save this directory information if we are writing it + if ($$editDirs{$dirName} and $$editDirs{$dirName} eq $parent) { + $editDirHash{$tagID} = $tagInfo; + $addDirHash{$tagID} = $tagInfo if $$addDirs{$dirName}; + } + } + } + return (\%addDirHash, \%editDirHash) if wantarray; + return \%addDirHash; +} + +#------------------------------------------------------------------------------ +# Get localized version of tagInfo hash (used by MIE, XMP, PNG and QuickTime) +# Inputs: 0) tagInfo hash ref, 1) locale code (eg. "en_CA" for MIE) +# Returns: new tagInfo hash ref, or undef if invalid +# - sets LangCode member in new tagInfo +sub GetLangInfo($$) +{ + my ($tagInfo, $langCode) = @_; + # make a new tagInfo hash for this locale + my $table = $$tagInfo{Table}; + my $tagID = $$tagInfo{TagID} . '-' . $langCode; + my $langInfo = $$table{$tagID}; + unless ($langInfo) { + # make a new tagInfo entry for this locale + $langInfo = { + %$tagInfo, + Name => $$tagInfo{Name} . '-' . $langCode, + Description => Image::ExifTool::MakeDescription($$tagInfo{Name}) . + " ($langCode)", + LangCode => $langCode, + SrcTagInfo => $tagInfo, # save reference to original tagInfo + }; + AddTagToTable($table, $tagID, $langInfo); + } + return $langInfo; +} + +#------------------------------------------------------------------------------ +# initialize ADD_DIRS and EDIT_DIRS hashes for all directories that need +# to be created or will have tags changed in them +# Inputs: 0) ExifTool object reference, 1) file type string (or map hash ref) +# 2) preferred family 0 group for creating tags, 3) alternate preferred group +# Notes: +# - the ADD_DIRS and EDIT_DIRS keys are the directory names, and the values +# are the names of the parent directories (undefined for a top-level directory) +# - also initializes FORCE_WRITE lookup +sub InitWriteDirs($$;$$) +{ + my ($self, $fileType, $preferredGroup, $altGroup) = @_; + my $editDirs = $$self{EDIT_DIRS} = { }; + my $addDirs = $$self{ADD_DIRS} = { }; + my $fileDirs = $dirMap{$fileType}; + unless ($fileDirs) { + return unless ref $fileType eq 'HASH'; + $fileDirs = $fileType; + } + my @tagInfoList = $self->GetNewTagInfoList(); + my ($tagInfo, $nvHash); + + # save the preferred group + $$self{PreferredGroup} = $preferredGroup; + + foreach $tagInfo (@tagInfoList) { + # cycle through all hashes in linked list + for ($nvHash=$self->GetNewValueHash($tagInfo); $nvHash; $nvHash=$$nvHash{Next}) { + # are we creating this tag? (otherwise just deleting or editing it) + my $isCreating = $$nvHash{IsCreating}; + if ($preferredGroup) { + my $g0 = $self->GetGroup($tagInfo, 0); + if ($isCreating) { + # if another group is taking priority, only create + # directory if specifically adding tags to this group + # or if this tag isn't being added to the priority group + $isCreating = 0 if $preferredGroup ne $g0 and + $$nvHash{CreateGroups}{$preferredGroup} and + (not $altGroup or $altGroup ne $g0); + } else { + # create this directory if any tag is preferred and has a value + # (unless group creation is disabled via the WriteMode option) + $isCreating = 1 if $$nvHash{Value} and $preferredGroup eq $g0 and + not $$nvHash{EditOnly} and $$self{OPTIONS}{WriteMode} =~ /g/; + } + } + # tag belongs to directory specified by WriteGroup, or by + # the Group0 name if WriteGroup not defined + my $dirName = $$nvHash{WriteGroup}; + # remove MIE copy number(s) if they exist + if ($dirName =~ /^MIE\d*(-[a-z]+)?\d*$/i) { + $dirName = 'MIE' . ($1 || ''); + } + my @dirNames; + # allow a group name of '*' to force writing EXIF/IPTC/XMP/PNG (ForceWrite tag) + if ($dirName eq '*' and $$nvHash{Value}) { + my $val = $$nvHash{Value}[0]; + if ($val) { + foreach (qw(EXIF IPTC XMP PNG FixBase)) { + next unless $val =~ /\b($_|All)\b/i; + push @dirNames, $_; + push @dirNames, 'EXIF' if $_ eq 'FixBase'; + $$self{FORCE_WRITE}{$_} = 1; + } + } + $dirName = shift @dirNames; + } elsif ($dirName eq 'QuickTime') { + # write to specific QuickTime group + $dirName = $self->GetGroup($tagInfo, 1); + } + while ($dirName) { + my $parent = $$fileDirs{$dirName}; + if (ref $parent) { + push @dirNames, reverse @$parent; + $parent = pop @dirNames; + } + $$editDirs{$dirName} = $parent; + $$addDirs{$dirName} = $parent if $isCreating and $isCreating != 2; + $dirName = $parent || shift @dirNames + } + } + } + if (%{$$self{DEL_GROUP}}) { + # add delete groups to list of edited groups + foreach (keys %{$$self{DEL_GROUP}}) { + next if /^-/; # ignore excluded groups + my $dirName = $_; + # translate necessary group 0 names + $dirName = $translateWriteGroup{$dirName} if $translateWriteGroup{$dirName}; + # convert XMP group 1 names + $dirName = 'XMP' if $dirName =~ /^XMP-/; + my @dirNames; + while ($dirName) { + my $parent = $$fileDirs{$dirName}; + if (ref $parent) { + push @dirNames, reverse @$parent; + $parent = pop @dirNames; + } + $$editDirs{$dirName} = $parent; + $dirName = $parent || shift @dirNames + } + } + } + # special case to edit JFIF to get resolutions if editing EXIF information + if ($$editDirs{IFD0} and $$fileDirs{JFIF}) { + $$editDirs{JFIF} = 'IFD1'; + $$editDirs{APP0} = undef; + } + + if ($$self{OPTIONS}{Verbose}) { + my $out = $$self{OPTIONS}{TextOut}; + print $out " Editing tags in: "; + foreach (sort keys %$editDirs) { print $out "$_ "; } + print $out "\n"; + return unless $$self{OPTIONS}{Verbose} > 1; + print $out " Creating tags in: "; + foreach (sort keys %$addDirs) { print $out "$_ "; } + print $out "\n"; + } +} + +#------------------------------------------------------------------------------ +# Write an image directory +# Inputs: 0) ExifTool object reference, 1) source directory information reference +# 2) tag table reference, 3) optional reference to writing procedure +# Returns: New directory data or undefined on error (or empty string to delete directory) +sub WriteDirectory($$$;$) +{ + my ($self, $dirInfo, $tagTablePtr, $writeProc) = @_; + my ($out, $nvHash, $delFlag); + + $tagTablePtr or return undef; + $out = $$self{OPTIONS}{TextOut} if $$self{OPTIONS}{Verbose}; + # set directory name from default group0 name if not done already + my $dirName = $$dirInfo{DirName}; + my $dataPt = $$dirInfo{DataPt}; + my $grp0 = $$tagTablePtr{GROUPS}{0}; + $dirName or $dirName = $$dirInfo{DirName} = $grp0; + if (%{$$self{DEL_GROUP}}) { + my $delGroup = $$self{DEL_GROUP}; + # delete entire directory if specified + my $grp1 = $dirName; + $delFlag = ($$delGroup{$grp0} or $$delGroup{$grp1}) unless $permanentDir{$grp0}; + # (never delete an entire QuickTime group) + if ($delFlag) { + if (($grp0 =~ /^(MakerNotes)$/ or $grp1 =~ /^(IFD0|ExifIFD|MakerNotes)$/) and + $self->IsRawType() and + # allow non-permanent MakerNote directories to be deleted (ie. NikonCapture) + (not $$dirInfo{TagInfo} or not defined $$dirInfo{TagInfo}{Permanent} or + $$dirInfo{TagInfo}{Permanent})) + { + $self->WarnOnce("Can't delete $1 from $$self{FileType}",1); + undef $grp1; + } elsif (not $blockExifTypes{$$self{FILE_TYPE}}) { + # restrict delete logic to prevent entire tiff image from being killed + # (don't allow IFD0 to be deleted, and delete only ExifIFD if EXIF specified) + if ($$self{FILE_TYPE} eq 'PSD') { + # don't delete Photoshop directories from PSD image + undef $grp1 if $grp0 eq 'Photoshop'; + } elsif ($$self{FILE_TYPE} =~ /^(EPS|PS)$/) { + # allow anything to be deleted from PostScript files + } elsif ($grp1 eq 'IFD0') { + my $type = $$self{TIFF_TYPE} || $$self{FILE_TYPE}; + $$delGroup{IFD0} and $self->Warn("Can't delete IFD0 from $type",1); + undef $grp1; + } elsif ($grp0 eq 'EXIF' and $$delGroup{$grp0}) { + undef $grp1 unless $$delGroup{$grp1} or $grp1 eq 'ExifIFD'; + } + } + if ($grp1) { + if ($dataPt or $$dirInfo{RAF}) { + ++$$self{CHANGED}; + $out and print $out " Deleting $grp1\n"; + $self->Warn('ICC_Profile deleted. Image colors may be affected') if $grp1 eq 'ICC_Profile'; + # can no longer validate TIFF_END if deleting an entire IFD + delete $$self{TIFF_END} if $dirName =~ /IFD/; + } + # don't add back into the wrong location + my $right = $$self{ADD_DIRS}{$grp1}; + # (take care because EXIF directory name may be either EXIF or IFD0, + # but IFD0 will be the one that appears in the directory map) + $right = $$self{ADD_DIRS}{IFD0} if not $right and $grp1 eq 'EXIF'; + if ($delFlag == 2 and $right) { + # also check grandparent because some routines create 2 levels in 1 + my $right2 = $$self{ADD_DIRS}{$right} || ''; + my $parent = $$dirInfo{Parent}; + if (not $parent or $parent eq $right or $parent eq $right2) { + # prevent duplicate directories from being recreated at the same path + my $path = join '-', @{$$self{PATH}}, $dirName; + $$self{Recreated} or $$self{Recreated} = { }; + if ($$self{Recreated}{$path}) { + my $p = $parent ? " in $parent" : ''; + $self->Warn("Not recreating duplicate $grp1$p",1); + return ''; + } + $$self{Recreated}{$path} = 1; + # empty the directory + my $data = ''; + $$dirInfo{DataPt} = \$data; + $$dirInfo{DataLen} = 0; + $$dirInfo{DirStart} = 0; + $$dirInfo{DirLen} = 0; + delete $$dirInfo{RAF}; + delete $$dirInfo{Base}; + delete $$dirInfo{DataPos}; + } else { + $self->Warn("Not recreating $grp1 in $parent (should be in $right)",1); + return ''; + } + } else { + return '' unless $$dirInfo{NoDelete}; + } + } + } + } + # use default proc from tag table if no proc specified + $writeProc or $writeProc = $$tagTablePtr{WRITE_PROC} or return undef; + + # are we rewriting a pre-existing directory? + my $isRewriting = ($$dirInfo{DirLen} or (defined $dataPt and length $$dataPt) or $$dirInfo{RAF}); + + # copy or delete new directory as a block if specified + my $blockName = $dirName; + $blockName = 'EXIF' if $blockName eq 'IFD0'; + my $tagInfo = $Image::ExifTool::Extra{$blockName} || $$dirInfo{TagInfo}; + while ($tagInfo and ($nvHash = $$self{NEW_VALUE}{$tagInfo}) and + $self->IsOverwriting($nvHash) and not ($$nvHash{CreateOnly} and $isRewriting)) + { + # protect against writing EXIF to wrong file types, etc + if ($blockName eq 'EXIF') { + unless ($blockExifTypes{$$self{FILE_TYPE}}) { + $self->Warn("Can't write EXIF as a block to $$self{FILE_TYPE} file"); + last; + } + # this can happen if we call WriteDirectory for an EXIF directory without going + # through WriteTIFF as the WriteProc (which happens if conditionally replacing + # the EXIF block and the condition fails), but we never want to do a block write + # in this case because the EXIF block would end up with two TIFF headers + last unless $writeProc eq \&Image::ExifTool::WriteTIFF; + } + last unless $self->IsOverwriting($nvHash, $dataPt ? $$dataPt : ''); + my $verb = 'Writing'; + my $newVal = $self->GetNewValue($nvHash); + unless (defined $newVal and length $newVal) { + return '' unless $dataPt or $$dirInfo{RAF}; # nothing to do if block never existed + # don't allow MakerNotes to be removed from RAW files + if ($blockName eq 'MakerNotes' and $rawType{$$self{FileType}}) { + $self->Warn("Can't delete MakerNotes from $$self{VALUE}{FileType}",1); + return undef; + } + $verb = 'Deleting'; + $newVal = ''; + } + $$dirInfo{BlockWrite} = 1; # set flag indicating we did a block write + $out and print $out " $verb $blockName as a block\n"; + ++$$self{CHANGED}; + return $newVal; + } + # guard against writing the same directory twice + if (defined $dataPt and defined $$dirInfo{DirStart} and defined $$dirInfo{DataPos} and + not $$dirInfo{NoRefTest}) + { + my $addr = $$dirInfo{DirStart} + $$dirInfo{DataPos} + ($$dirInfo{Base}||0) + $$self{BASE}; + # (Phase One P25 IIQ files have ICC_Profile duplicated in IFD0 and IFD1) + if ($$self{PROCESSED}{$addr} and ($dirName ne 'ICC_Profile' or $$self{TIFF_TYPE} ne 'IIQ')) { + if (defined $$dirInfo{DirLen} and not $$dirInfo{DirLen} and $dirName ne $$self{PROCESSED}{$addr}) { + # it is hypothetically possible to have 2 different directories + # with the same address if one has a length of zero + } elsif ($self->Error("$dirName pointer references previous $$self{PROCESSED}{$addr} directory", 2)) { + return undef; + } else { + $self->Warn("Deleting duplicate $dirName directory"); + $out and print $out " Deleting $dirName\n"; + # delete the duplicate directory (don't recreate it when writing new + # tags to prevent propagating a duplicate IFD in cases like when the + # same ExifIFD exists in both IFD0 and IFD1) + return ''; + } + } else { + $$self{PROCESSED}{$addr} = $dirName; + } + } + my $oldDir = $$self{DIR_NAME}; + my @save = @$self{'Compression','SubfileType'}; + my $name; + if ($out) { + $name = ($dirName eq 'MakerNotes' and $$dirInfo{TagInfo}) ? + $$dirInfo{TagInfo}{Name} : $dirName; + if (not defined $oldDir or $oldDir ne $name) { + my $verb = $isRewriting ? 'Rewriting' : 'Creating'; + print $out " $verb $name\n"; + } + } + my $saveOrder = GetByteOrder(); + my $oldChanged = $$self{CHANGED}; + $$self{DIR_NAME} = $dirName; + push @{$$self{PATH}}, $dirName; + $$dirInfo{IsWriting} = 1; + my $newData; + { + no strict 'refs'; + $newData = &$writeProc($self, $dirInfo, $tagTablePtr); + } + pop @{$$self{PATH}}; + # nothing changed if error occurred or nothing was created + $$self{CHANGED} = $oldChanged unless defined $newData and (length($newData) or $isRewriting); + $$self{DIR_NAME} = $oldDir; + @$self{'Compression','SubfileType'} = @save; + SetByteOrder($saveOrder); + print $out " Deleting $name\n" if $out and defined $newData and not length $newData; + return $newData; +} + +#------------------------------------------------------------------------------ +# Uncommon utility routines to for reading binary data values +# Inputs: 0) data reference, 1) offset into data +sub Get64s($$) +{ + my ($dataPt, $pos) = @_; + my $pt = GetByteOrder() eq 'MM' ? 0 : 4; # get position of high word + my $hi = Get32s($dataPt, $pos + $pt); # preserve sign bit of high word + my $lo = Get32u($dataPt, $pos + 4 - $pt); + return $hi * 4294967296 + $lo; +} +sub Get64u($$) +{ + my ($dataPt, $pos) = @_; + my $pt = GetByteOrder() eq 'MM' ? 0 : 4; # get position of high word + my $hi = Get32u($dataPt, $pos + $pt); # (unsigned this time) + my $lo = Get32u($dataPt, $pos + 4 - $pt); + return $hi * 4294967296 + $lo; +} +sub GetFixed64s($$) +{ + my ($dataPt, $pos) = @_; + my $val = Get64s($dataPt, $pos) / 4294967296; + # remove insignificant digits + return int($val * 1e10 + ($val>0 ? 0.5 : -0.5)) / 1e10; +} +# Decode extended 80-bit float used by Apple SANE and Intel 8087 +# (note: different than the IEEE standard 80-bit float) +sub GetExtended($$) +{ + my ($dataPt, $pos) = @_; + my $pt = GetByteOrder() eq 'MM' ? 0 : 2; # get position of exponent + my $exp = Get16u($dataPt, $pos + $pt); + my $sig = Get64u($dataPt, $pos + 2 - $pt); # get significand as int64u + my $sign = $exp & 0x8000 ? -1 : 1; + $exp = ($exp & 0x7fff) - 16383 - 63; # (-63 to fractionalize significand) + return $sign * $sig * 2 ** $exp; +} + +#------------------------------------------------------------------------------ +# Dump data in hex and ASCII to console +# Inputs: 0) data reference, 1) length or undef, 2-N) Options: +# Options: Start => offset to start of data (default=0) +# Addr => address to print for data start (default=DataPos+Base+Start) +# DataPos => position of data within block (relative to Base) +# Base => base offset for pointers from start of file +# Width => width of printout (bytes, default=16) +# Prefix => prefix to print at start of line (default='') +# MaxLen => maximum length to dump +# Out => output file reference +# Len => data length +sub HexDump($;$%) +{ + my $dataPt = shift; + my $len = shift; + my %opts = @_; + my $start = $opts{Start} || 0; + my $addr = $opts{Addr}; + my $wid = $opts{Width} || 16; + my $prefix = $opts{Prefix} || ''; + my $out = $opts{Out} || \*STDOUT; + my $maxLen = $opts{MaxLen}; + my $datLen = length($$dataPt) - $start; + my $more; + $len = $opts{Len} if defined $opts{Len}; + + $addr = $start + ($opts{DataPos} || 0) + ($opts{Base} || 0) unless defined $addr; + $len = $datLen unless defined $len; + if ($maxLen and $len > $maxLen) { + # print one line less to allow for $more line below + $maxLen = int(($maxLen - 1) / $wid) * $wid; + $more = $len - $maxLen; + $len = $maxLen; + } + if ($len > $datLen) { + print $out "$prefix Warning: Attempted dump outside data\n"; + print $out "$prefix ($len bytes specified, but only $datLen available)\n"; + $len = $datLen; + } + my $format = sprintf("%%-%ds", $wid * 3); + my $tmpl = 'H2' x $wid; # ('(H2)*' would have been nice, but older perl versions don't support it) + my $i; + for ($i=0; $i<$len; $i+=$wid) { + $wid > $len-$i and $wid = $len-$i, $tmpl = 'H2' x $wid; + printf $out "$prefix%8.4x: ", $addr+$i; + my $dat = substr($$dataPt, $i+$start, $wid); + my $s = join(' ', unpack($tmpl, $dat)); + printf $out $format, $s; + $dat =~ tr /\x00-\x1f\x7f-\xff/./; + print $out "[$dat]\n"; + } + $more and print $out "$prefix [snip $more bytes]\n"; +} + +#------------------------------------------------------------------------------ +# Print verbose tag information +# Inputs: 0) ExifTool object reference, 1) tag ID +# 2) tag info reference (or undef) +# 3-N) extra parms: +# Parms: Index => Index of tag in menu (starting at 0) +# Value => Tag value +# DataPt => reference to value data block +# DataPos => location of data block in file +# Base => base added to all offsets +# Size => length of value data within block +# Format => value format string +# Count => number of values +# Extra => Extra Verbose=2 information to put after tag number +# Table => Reference to tag table +# --> plus any of these HexDump() options: Start, Addr, Width +sub VerboseInfo($$$%) +{ + my ($self, $tagID, $tagInfo, %parms) = @_; + my $verbose = $$self{OPTIONS}{Verbose}; + my $out = $$self{OPTIONS}{TextOut}; + my ($tag, $line, $hexID); + + # generate hex number if tagID is numerical + if (defined $tagID) { + $tagID =~ /^\d+$/ and $hexID = sprintf("0x%.4x", $tagID); + } else { + $tagID = 'Unknown'; + } + # get tag name + if ($tagInfo and $$tagInfo{Name}) { + $tag = $$tagInfo{Name}; + } else { + my $prefix; + $prefix = $parms{Table}{TAG_PREFIX} if $parms{Table}; + if ($prefix or $hexID) { + $prefix = 'Unknown' unless $prefix; + $tag = $prefix . '_' . ($hexID ? $hexID : $tagID); + } else { + $tag = $tagID; + } + } + my $dataPt = $parms{DataPt}; + my $size = $parms{Size}; + $size = length $$dataPt unless defined $size or not $dataPt; + my $indent = $$self{INDENT}; + + # Level 1: print tag/value information + $line = $indent; + my $index = $parms{Index}; + if (defined $index) { + $line .= $index . ') '; + $line .= ' ' if length($index) < 2; + $indent .= ' '; # indent everything else to align with tag name + } + $line .= $tag; + if ($tagInfo and $$tagInfo{SubDirectory}) { + $line .= ' (SubDirectory) -->'; + } else { + my $maxLen = 90 - length($line); + my $val = $parms{Value}; + if (defined $val) { + $val = '[' . join(',',@$val) . ']' if ref $val eq 'ARRAY'; + $line .= ' = ' . $self->Printable($val, $maxLen); + } elsif ($dataPt) { + my $start = $parms{Start} || 0; + $line .= ' = ' . $self->Printable(substr($$dataPt,$start,$size), $maxLen); + } + } + print $out "$line\n"; + + # Level 2: print detailed information about the tag + if ($verbose > 1 and ($parms{Extra} or $parms{Format} or + $parms{DataPt} or defined $size or $tagID =~ /\//)) + { + $line = $indent . '- Tag '; + if ($hexID) { + $line .= $hexID; + } else { + $tagID =~ s/([\0-\x1f\x7f-\xff])/sprintf('\\x%.2x',ord $1)/ge; + $line .= "'${tagID}'"; + } + $line .= $parms{Extra} if defined $parms{Extra}; + my $format = $parms{Format}; + if ($format or defined $size) { + $line .= ' ('; + if (defined $size) { + $line .= "$size bytes"; + $line .= ', ' if $format; + } + if ($format) { + $line .= $format; + $line .= '['.$parms{Count}.']' if $parms{Count}; + } + $line .= ')'; + } + $line .= ':' if $verbose > 2 and $parms{DataPt}; + print $out "$line\n"; + } + + # Level 3: do hex dump of value + if ($verbose > 2 and $parms{DataPt} and (not $tagInfo or not $$tagInfo{ReadFromRAF})) { + $parms{Out} = $out; + $parms{Prefix} = $indent; + # limit dump length if Verbose < 5 + $parms{MaxLen} = $verbose == 3 ? 96 : 2048 if $verbose < 5; + HexDump($dataPt, $size, %parms); + } +} + +#------------------------------------------------------------------------------ +# Dump trailer information +# Inputs: 0) ExifTool object ref, 1) dirInfo hash (RAF, DirName, DataPos, DirLen) +# Notes: Restores current file position before returning +sub DumpTrailer($$) +{ + my ($self, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my $curPos = $raf->Tell(); + my $trailer = $$dirInfo{DirName} || 'Unknown'; + my $pos = $$dirInfo{DataPos}; + my $verbose = $$self{OPTIONS}{Verbose}; + my $htmlDump = $$self{HTML_DUMP}; + my ($buff, $buf2); + my $size = $$dirInfo{DirLen}; + $pos = $curPos unless defined $pos; + + # get full trailer size if not specified + for (;;) { + unless ($size) { + $raf->Seek(0, 2) or last; + $size = $raf->Tell() - $pos; + last unless $size; + } + $raf->Seek($pos, 0) or last; + if ($htmlDump) { + my $num = $raf->Read($buff, $size) or return; + my $desc = "$trailer trailer"; + $desc = "[$desc]" if $trailer eq 'Unknown'; + $self->HDump($pos, $num, $desc, undef, 0x08); + last; + } + my $out = $$self{OPTIONS}{TextOut}; + printf $out "$trailer trailer (%d bytes at offset 0x%.4x):\n", $size, $pos; + last unless $verbose > 2; + my $num = $size; # number of bytes to read + # limit size if not very verbose + if ($verbose < 5) { + my $limit = $verbose < 4 ? 96 : 512; + $num = $limit if $num > $limit; + } + $raf->Read($buff, $num) == $num or return; + # read the end of the trailer too if not done already + if ($size > 2 * $num) { + $raf->Seek($pos + $size - $num, 0); + $raf->Read($buf2, $num); + } elsif ($size > $num) { + $raf->Seek($pos + $num, 0); + $raf->Read($buf2, $size - $num); + $buff .= $buf2; + undef $buf2; + } + HexDump(\$buff, undef, Addr => $pos, Out => $out); + if (defined $buf2) { + print $out " [snip ", $size - $num * 2, " bytes]\n"; + HexDump(\$buf2, undef, Addr => $pos + $size - $num, Out => $out); + } + last; + } + $raf->Seek($curPos, 0); +} + +#------------------------------------------------------------------------------ +# Dump unknown trailer information +# Inputs: 0) ExifTool ref, 1) dirInfo ref (with RAF, DataPos and DirLen defined) +# Notes: changes dirInfo elements +sub DumpUnknownTrailer($$) +{ + my ($self, $dirInfo) = @_; + my $pos = $$dirInfo{DataPos}; + my $endPos = $pos + $$dirInfo{DirLen}; + # account for preview/MPF image trailer + my $prePos = $$self{VALUE}{PreviewImageStart} || $$self{PreviewImageStart}; + my $preLen = $$self{VALUE}{PreviewImageLength} || $$self{PreviewImageLength}; + my $tag = 'PreviewImage'; + my $mpImageNum = 0; + my (%image, $lastOne); + for (;;) { + # add to Preview block list if valid and in the trailer + $image{$prePos} = [$tag, $preLen] if $prePos and $preLen and $prePos+$preLen > $pos; + last if $lastOne; # checked all images + # look for MPF images (in the the proper order) + ++$mpImageNum; + $prePos = $$self{VALUE}{"MPImageStart ($mpImageNum)"}; + if (defined $prePos) { + $preLen = $$self{VALUE}{"MPImageLength ($mpImageNum)"}; + } else { + $prePos = $$self{VALUE}{'MPImageStart'}; + $preLen = $$self{VALUE}{'MPImageLength'}; + $lastOne = 1; + } + $tag = "MPImage$mpImageNum"; + } + # dump trailer sections in order + $image{$endPos} = [ '', 0 ]; # add terminator "image" + foreach $prePos (sort { $a <=> $b } keys %image) { + if ($pos < $prePos) { + # dump unknown trailer data + $$dirInfo{DirName} = 'Unknown'; + $$dirInfo{DataPos} = $pos; + $$dirInfo{DirLen} = $prePos - $pos; + $self->DumpTrailer($dirInfo); + } + ($tag, $preLen) = @{$image{$prePos}}; + last unless $preLen; + # dump image if verbose (it is htmlDump'd by ExtractImage) + if ($$self{OPTIONS}{Verbose}) { + $$dirInfo{DirName} = $tag; + $$dirInfo{DataPos} = $prePos; + $$dirInfo{DirLen} = $preLen; + $self->DumpTrailer($dirInfo); + } + $pos = $prePos + $preLen; + } +} + +#------------------------------------------------------------------------------ +# Find last element in linked list +# Inputs: 0) element in list +# Returns: Last element in list +sub LastInList($) +{ + my $element = shift; + while ($$element{Next}) { + $element = $$element{Next}; + } + return $element; +} + +#------------------------------------------------------------------------------ +# Print verbose value while writing +# Inputs: 0) ExifTool object ref, 1) heading "eg. '+ IPTC:Keywords', +# 2) value, 3) [optional] extra text after value +sub VerboseValue($$$;$) +{ + return unless $_[0]{OPTIONS}{Verbose} > 1; + my ($self, $str, $val, $xtra) = @_; + my $out = $$self{OPTIONS}{TextOut}; + $xtra or $xtra = ''; + my $maxLen = 81 - length($str) - length($xtra); + $val = $self->Printable($val, $maxLen); + print $out " $str = '${val}'$xtra\n"; +} + +#------------------------------------------------------------------------------ +# Pack Unicode numbers into UTF8 string +# Inputs: 0-N) list of Unicode numbers +# Returns: Packed UTF-8 string +sub PackUTF8(@) +{ + my @out; + while (@_) { + my $ch = pop; + unshift(@out, $ch), next if $ch < 0x80; + unshift(@out, 0x80 | ($ch & 0x3f)); + $ch >>= 6; + unshift(@out, 0xc0 | $ch), next if $ch < 0x20; + unshift(@out, 0x80 | ($ch & 0x3f)); + $ch >>= 6; + unshift(@out, 0xe0 | $ch), next if $ch < 0x10; + unshift(@out, 0x80 | ($ch & 0x3f)); + $ch >>= 6; + unshift(@out, 0xf0 | ($ch & 0x07)); + } + return pack('C*', @out); +} + +#------------------------------------------------------------------------------ +# Unpack numbers from UTF8 string +# Inputs: 0) UTF-8 string +# Returns: List of Unicode numbers (sets $evalWarning on error) +sub UnpackUTF8($) +{ + my (@out, $pos); + pos($_[0]) = $pos = 0; # start at beginning of string + for (;;) { + my ($ch, $newPos, $val, $byte); + if ($_[0] =~ /([\x80-\xff])/g) { + $ch = ord($1); + $newPos = pos($_[0]) - 1; + } else { + $newPos = length $_[0]; + } + # unpack 7-bit characters + my $len = $newPos - $pos; + push @out, unpack("x${pos}C$len",$_[0]) if $len; + last unless defined $ch; + $pos = $newPos + 1; + # minimum lead byte for 2-byte sequence is 0xc2 (overlong sequences + # not allowed), 0xf8-0xfd are restricted by RFC 3629 (no 5 or 6 byte + # sequences), and 0xfe and 0xff are not valid in UTF-8 strings + if ($ch < 0xc2 or $ch >= 0xf8) { + push @out, ord('?'); # invalid UTF-8 + $evalWarning = 'Bad UTF-8'; + next; + } + # decode 2, 3 and 4-byte sequences + my $n = 1; + if ($ch < 0xe0) { + $val = $ch & 0x1f; # 2-byte sequence + } elsif ($ch < 0xf0) { + $val = $ch & 0x0f; # 3-byte sequence + ++$n; + } else { + $val = $ch & 0x07; # 4-byte sequence + $n += 2; + } + unless ($_[0] =~ /\G([\x80-\xbf]{$n})/g) { + pos($_[0]) = $pos; # restore position + push @out, ord('?'); # invalid UTF-8 + $evalWarning = 'Bad UTF-8'; + next; + } + foreach $byte (unpack 'C*', $1) { + $val = ($val << 6) | ($byte & 0x3f); + } + push @out, $val; # save Unicode character value + $pos += $n; # position at end of UTF-8 character + } + return @out; +} + +#------------------------------------------------------------------------------ +# Generate a new, random GUID +# Inputs: <none> +# Returns: GUID string +my $guidCount; +sub NewGUID() +{ + my @tm = localtime time; + $guidCount = 0 unless defined $guidCount and ++$guidCount < 0x100; + return sprintf('%.4d%.2d%.2d%.2d%.2d%.2d%.2X%.4X%.4X%.4X%.4X', + $tm[5]+1900, $tm[4]+1, $tm[3], $tm[2], $tm[1], $tm[0], $guidCount, + $$ & 0xffff, rand(0x10000), rand(0x10000), rand(0x10000)); +} + +#------------------------------------------------------------------------------ +# Make TIFF header for raw data +# Inputs: 0) width, 1) height, 2) num colour components, 3) bits, 4) resolution +# 5) color-map data for palette-color image (8 or 16 bit) +# Returns: TIFF header +# Notes: Multi-byte data must be little-endian +sub MakeTiffHeader($$$$;$$) +{ + my ($w, $h, $cols, $bits, $res, $cmap) = @_; + $res or $res = 72; + my $saveOrder = GetByteOrder(); + SetByteOrder('II'); + if (not $cmap) { + $cmap = ''; + } elsif (length $cmap == 3 * 2**$bits) { + # convert to short + $cmap = pack 'v*', map { $_ | ($_<<8) } unpack 'C*', $cmap; + } elsif (length $cmap != 6 * 2**$bits) { + $cmap = ''; + } + my $cmo = $cmap ? 12 : 0; # offset due to ColorMap IFD entry + my $hdr = + "\x49\x49\x2a\0\x08\0\0\0\x0e\0" . # 0x00 14 menu entries: + "\xfe\x00\x04\0\x01\0\0\0\x00\0\0\0" . # 0x0a SubfileType = 0 + "\x00\x01\x04\0\x01\0\0\0" . Set32u($w) . # 0x16 ImageWidth + "\x01\x01\x04\0\x01\0\0\0" . Set32u($h) . # 0x22 ImageHeight + "\x02\x01\x03\0" . Set32u($cols) . # 0x2e BitsPerSample + Set32u($cols == 1 ? $bits : 0xb6 + $cmo) . + "\x03\x01\x03\0\x01\0\0\0\x01\0\0\0" . # 0x3a Compression = 1 + "\x06\x01\x03\0\x01\0\0\0" . # 0x46 PhotometricInterpretation + Set32u($cmap ? 3 : $cols == 1 ? 1 : 2) . + "\x11\x01\x04\0\x01\0\0\0" . # 0x52 StripOffsets + Set32u(0xcc + $cmo + length($cmap)) . + "\x15\x01\x03\0\x01\0\0\0" . Set32u($cols) . # 0x5e SamplesPerPixel + "\x16\x01\x04\0\x01\0\0\0" . Set32u($h) . # 0x6a RowsPerStrip + "\x17\x01\x04\0\x01\0\0\0" . # 0x76 StripByteCounts + Set32u($w * $h * $cols * int(($bits+7)/8)) . + "\x1a\x01\x05\0\x01\0\0\0" . Set32u(0xbc + $cmo) . # 0x82 XResolution + "\x1b\x01\x05\0\x01\0\0\0" . Set32u(0xc4 + $cmo) . # 0x8e YResolution + "\x1c\x01\x03\0\x01\0\0\0\x01\0\0\0" . # 0x9a PlanarConfiguration = 1 + "\x28\x01\x03\0\x01\0\0\0\x02\0\0\0" . # 0xa6 ResolutionUnit = 2 + ($cmap ? # 0xb2 ColorMap [optional] + "\x40\x01\x03\0" . Set32u(3 * 2**$bits) . "\xd8\0\0\0" : '') . + "\0\0\0\0" . # 0xb2+$cmo (no IFD1) + (Set16u($bits) x 3) . # 0xb6+$cmo BitsPerSample value + Set32u($res) . "\x01\0\0\0" . # 0xbc+$cmo XResolution = 72 + Set32u($res) . "\x01\0\0\0" . # 0xc4+$cmo YResolution = 72 + $cmap; # 0xcc or 0xd8 (cmap and data go here) + SetByteOrder($saveOrder); + return $hdr; +} + +#------------------------------------------------------------------------------ +# Return current time in EXIF format +# Inputs: 0) [optional] ExifTool ref, 1) flag to include timezone (0 to disable, +# undef or 1 to include) +# Returns: time string +# - a consistent value is returned for each processed file +sub TimeNow(;$$) +{ + my ($self, $tzFlag) = @_; + my $timeNow; + ref $self or $tzFlag = $self, $self = { }; + if ($$self{Now}) { + $timeNow = $$self{Now}[0]; + } else { + my $time = time(); + my @tm = localtime $time; + my $tz = TimeZoneString(\@tm, $time); + $timeNow = sprintf("%4d:%.2d:%.2d %.2d:%.2d:%.2d", + $tm[5]+1900, $tm[4]+1, $tm[3], + $tm[2], $tm[1], $tm[0]); + $$self{Now} = [ $timeNow, $tz ]; + } + $timeNow .= $$self{Now}[1] if $tzFlag or not defined $tzFlag; + return $timeNow; +} + +#------------------------------------------------------------------------------ +# Inverse date/time print conversion (reformat to YYYY:mm:dd HH:MM:SS[.ss][+-HH:MM|Z]) +# Inputs: 0) ExifTool object ref, 1) Date/Time string, 2) timezone flag: +# 0 - remove timezone and sub-seconds if they exist +# 1 - add timezone if it doesn't exist +# undef - leave timezone alone +# 3) flag to allow date-only (YYYY, YYYY:mm or YYYY:mm:dd) or time without seconds +# Returns: formatted date/time string (or undef and issues warning on error) +# Notes: currently accepts different separators, but doesn't use DateFormat yet +my $strptimeLib; # strptime library name if available +sub InverseDateTime($$;$$) +{ + my ($self, $val, $tzFlag, $dateOnly) = @_; + my ($rtnVal, $tz); + my $fmt = $$self{OPTIONS}{DateFormat}; + # strip off timezone first if it exists + if (not $fmt and $val =~ s/([-+])(\d{1,2}):?(\d{2})\s*(DST)?$//i) { + $tz = sprintf("$1%.2d:$3", $2); + } elsif (not $fmt and $val =~ s/Z$//i) { + $tz = 'Z'; + } else { + $tz = ''; + # allow special value of 'now' + return $self->TimeNow($tzFlag) if lc($val) eq 'now'; + } + # only convert date if a format was specified and the date is recognizable + if ($fmt) { + unless (defined $strptimeLib) { + if (eval { require POSIX::strptime }) { + $strptimeLib = 'POSIX::strptime'; + } elsif (eval { require Time::Piece }) { + $strptimeLib = 'Time::Piece'; + # (call use_locale() to convert localized date/time, + # only available in Time::Piece 1.32 and later) + eval { Time::Piece->use_locale() }; + } else { + $strptimeLib = ''; + } + } + # handle factional seconds (%f), but only at the end of the string + my $fs = ($fmt =~ s/%f$// and $val =~ s/(\.\d+)\s*$//) ? $1 : ''; + my ($lib, $wrn, @a); +TryLib: for ($lib=$strptimeLib; ; $lib='') { + if (not $lib) { + last unless $$self{OPTIONS}{StrictDate}; + warn $wrn || "Install POSIX::strptime or Time::Piece for inverse date/time conversions\n"; + return undef; + } elsif ($lib eq 'POSIX::strptime') { + @a = eval { POSIX::strptime($val, $fmt) }; + } else { + # protect against a negative epoch time, it can cause a hard crash in Windows + if ($^O eq 'MSWin32' and $fmt =~ /%s/ and $val =~ /-\d/) { + warn "Can't convert negative epoch time\n"; + return undef; + } + @a = eval { + my $t = Time::Piece->strptime($val, $fmt); + return ($t->sec, $t->min, $t->hour, $t->mday, $t->_mon, $t->_year); + }; + } + if (defined $a[5] and length $a[5]) { + $a[5] += 1900; # add 1900 to year + } else { + $wrn = "Invalid date/time (no year) using $lib\n"; + next; + } + ++$a[4] if defined $a[4] and length $a[4]; # add 1 to month + my $i; + foreach $i (0..4) { + if (not defined $a[$i] or not length $a[$i]) { + if ($i < 2 or $dateOnly) { # (allow missing minutes/seconds) + $a[$i] = ' '; + } else { + $wrn = "Incomplete date/time specification using $lib\n"; + next TryLib; + } + } elsif (length($a[$i]) < 2) { + $a[$i] = "0$a[$i]"; # pad to 2 digits if necessary + } + } + $val = join(':', @a[5,4,3]) . ' ' . join(':', @a[2,1,0]) . $fs; + last; + } + } + if ($val =~ /(\d{4})/g) { # get YYYY + my $yr = $1; + my @a = ($val =~ /\d{1,2}/g); # get mm, dd, HH, and maybe MM, SS + length($_) < 2 and $_ = "0$_" foreach @a; # pad to 2 digits if necessary + if (@a >= 3) { + my $ss = $a[4]; # get SS + push @a, '00' while @a < 5; # add MM, SS if not given + # get sub-seconds if they exist (must be after SS, and have leading ".") + my $fs = (@a > 5 and $val =~ /(\.\d+)\s*$/) ? $1 : ''; + # add/remove timezone if necessary + if ($tzFlag) { + if (not $tz) { + if (eval { require Time::Local }) { + # determine timezone offset for this time + my @args = ($a[4],$a[3],$a[2],$a[1],$a[0]-1,$yr); + my $diff = Time::Local::timegm(@args) - TimeLocal(@args); + $tz = TimeZoneString($diff / 60); + } else { + $tz = 'Z'; # don't know time zone + } + } + } elsif (defined $tzFlag) { + $tz = $fs = ''; # remove timezone and sub-seconds + } + if (defined $ss and $ss < 60) { + $ss = ":$ss"; + } elsif ($dateOnly) { + $ss = ''; + } else { + $ss = ':00'; + } + # construct properly formatted date/time string + if ($a[0] < 1 or $a[0] > 12) { + warn "Month '$a[0]' out of range 1..12\n"; + return undef; + } + if ($a[1] < 1 or $a[1] > 31) { + warn "Day '$a[1]' out of range 1..31\n"; + return undef; + } + $a[2] > 24 and warn("Hour '$a[2]' out of range 0..24\n"), return undef; + $a[3] > 59 and warn("Minutes '$a[3]' out of range 0..59\n"), return undef; + $rtnVal = "$yr:$a[0]:$a[1] $a[2]:$a[3]$ss$fs$tz"; + } elsif ($dateOnly) { + $rtnVal = join ':', $yr, @a; + } + } + $rtnVal or warn "Invalid date/time (use YYYY:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z])\n"; + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Set byte order according to our current preferences +# Inputs: 0) ExifTool object ref, 1) default byte order +# Returns: new byte order ('II' or 'MM') and sets current byte order +# Notes: takes the first of the following that is valid: +# 1) ByteOrder option +# 2) new value for ExifByteOrder +# 3) default byte order passed to this routine +# 4) makenote byte order from last file read +# 5) big endian +sub SetPreferredByteOrder($;$) +{ + my ($self, $default) = @_; + my $byteOrder = $self->Options('ByteOrder') || + $self->GetNewValue('ExifByteOrder') || + $default || $$self{MAKER_NOTE_BYTE_ORDER} || 'MM'; + unless (SetByteOrder($byteOrder)) { + warn "Invalid byte order '${byteOrder}'\n" if $self->Options('Verbose'); + $byteOrder = $$self{MAKER_NOTE_BYTE_ORDER} || 'MM'; + SetByteOrder($byteOrder); + } + return GetByteOrder(); +} + +#------------------------------------------------------------------------------ +# Assemble a continuing fraction into a rational value +# Inputs: 0) numerator, 1) denominator +# 2-N) list of fraction denominators, deepest first +# Returns: numerator, denominator (in list context) +sub AssembleRational($$@) +{ + @_ < 3 and return @_; + my ($num, $denom, $frac) = splice(@_, 0, 3); + return AssembleRational($frac*$num+$denom, $num, @_); +} + +#------------------------------------------------------------------------------ +# Convert a floating point number (or 'inf' or 'undef' or a fraction) into a rational +# Inputs: 0) floating point number, 1) optional maximum value (defaults to 0x7fffffff) +# Returns: numerator, denominator (in list context) +# Notes: +# - the returned rational will be accurate to at least 8 significant figures if possible +# - eg. an input of 3.14159265358979 returns a rational of 104348/33215, +# which equals 3.14159265392142 and is accurate to 10 significant figures +# - the returned rational will be reduced to the lowest common denominator except when +# the input is a fraction in which case the input is returned unchanged +# - these routines were a bit tricky, but fun to write! +sub Rationalize($;$) +{ + my $val = shift; + return (1, 0) if $val eq 'inf'; + return (0, 0) if $val eq 'undef'; + return ($1,$2) if $val =~ m{^([-+]?\d+)/(\d+)$}; # accept fractional values + # Note: Just testing "if $val" doesn't work because '0.0' is true! (ugghh!) + return (0, 1) if $val == 0; + my $sign = $val < 0 ? ($val = -$val, -1) : 1; + my ($num, $denom, @fracs); + my $frac = $val; + my $maxInt = shift || 0x7fffffff; + for (;;) { + my ($n, $d) = AssembleRational(int($frac + 0.5), 1, @fracs); + if ($n > $maxInt or $d > $maxInt) { + last if defined $num; + return ($sign, $maxInt) if $val < 1; + return ($sign * $maxInt, 1); + } + ($num, $denom) = ($n, $d); # save last good values + my $err = ($n/$d-$val) / $val; # get error of this rational + last if abs($err) < 1e-8; # all done if error is small + my $int = int($frac); + unshift @fracs, $int; + last unless $frac -= $int; + $frac = 1 / $frac; + } + return ($num * $sign, $denom); +} + +#------------------------------------------------------------------------------ +# Utility routines to for writing binary data values +# Inputs: 0) value, 1) data ref, 2) offset +# Notes: prototype is (@) so values can be passed from list if desired +sub Set16s(@) +{ + my $val = shift; + $val < 0 and $val += 0x10000; + return Set16u($val, @_); +} +sub Set32s(@) +{ + my $val = shift; + $val < 0 and $val += 0xffffffff, ++$val; + return Set32u($val, @_); +} +sub Set64u(@) +{ + my $val = $_[0]; + my $hi = int($val / 4294967296); + my $lo = Set32u($val - $hi * 4294967296); + $hi = Set32u($hi); + $val = GetByteOrder() eq 'MM' ? $hi . $lo : $lo . $hi; + $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val; + return $val; +} +sub Set64s(@) +{ + my $val = shift; + $val < 0 and $val += 4294967296 * 4294967296; # (temporary hack won't really work due to round-off errors) + return Set64u($val, @_); +} +sub SetRational64u(@) { + my ($numer,$denom) = Rationalize($_[0],0xffffffff); + my $val = Set32u($numer) . Set32u($denom); + $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val; + return $val; +} +sub SetRational64s(@) { + my ($numer,$denom) = Rationalize($_[0]); + my $val = Set32s($numer) . Set32u($denom); + $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val; + return $val; +} +sub SetRational32u(@) { + my ($numer,$denom) = Rationalize($_[0],0xffff); + my $val = Set16u($numer) . Set16u($denom); + $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val; + return $val; +} +sub SetRational32s(@) { + my ($numer,$denom) = Rationalize($_[0],0x7fff); + my $val = Set16s($numer) . Set16u($denom); + $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val; + return $val; +} +sub SetFixed16u(@) { + my $val = int(shift() * 0x100 + 0.5); + return Set16u($val, @_); +} +sub SetFixed16s(@) { + my $val = shift; + return Set16s(int($val * 0x100 + ($val < 0 ? -0.5 : 0.5)), @_); +} +sub SetFixed32u(@) { + my $val = int(shift() * 0x10000 + 0.5); + return Set32u($val, @_); +} +sub SetFixed32s(@) { + my $val = shift; + return Set32s(int($val * 0x10000 + ($val < 0 ? -0.5 : 0.5)), @_); +} +sub SetFloat(@) { + my $val = SwapBytes(pack('f',$_[0]), 4); + $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val; + return $val; +} +sub SetDouble(@) { + # swap 32-bit words (ARM quirk) and bytes if necessary + my $val = SwapBytes(SwapWords(pack('d',$_[0])), 8); + $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val; + return $val; +} +#------------------------------------------------------------------------------ +# hash lookups for writing binary data values +my %writeValueProc = ( + int8s => \&Set8s, + int8u => \&Set8u, + int16s => \&Set16s, + int16u => \&Set16u, + int16uRev => \&Set16uRev, + int32s => \&Set32s, + int32u => \&Set32u, + int64s => \&Set64s, + int64u => \&Set64u, + rational32s => \&SetRational32s, + rational32u => \&SetRational32u, + rational64s => \&SetRational64s, + rational64u => \&SetRational64u, + fixed16u => \&SetFixed16u, + fixed16s => \&SetFixed16s, + fixed32u => \&SetFixed32u, + fixed32s => \&SetFixed32s, + float => \&SetFloat, + double => \&SetDouble, + ifd => \&Set32u, +); +# verify that we can write floats on this platform +{ + my %writeTest = ( + float => [ -3.14159, 'c0490fd0' ], + double => [ -3.14159, 'c00921f9f01b866e' ], + ); + my $format; + my $oldOrder = GetByteOrder(); + SetByteOrder('MM'); + foreach $format (keys %writeTest) { + my ($val, $hex) = @{$writeTest{$format}}; + # add floating point entries if we can write them + next if unpack('H*', &{$writeValueProc{$format}}($val)) eq $hex; + delete $writeValueProc{$format}; # we can't write them + } + SetByteOrder($oldOrder); +} + +#------------------------------------------------------------------------------ +# write binary data value (with current byte ordering) +# Inputs: 0) value, 1) format string +# 2) number of values: +# undef = 1 for numerical types, or data length for string/undef types +# -1 = number of space-delimited values in the input string +# 3) optional data reference, 4) value offset (may be negative for bytes from end) +# Returns: packed value (and sets value in data) or undef on error +# Notes: May modify input value to round for integer formats +sub WriteValue($$;$$$$) +{ + my ($val, $format, $count, $dataPt, $offset) = @_; + my $proc = $writeValueProc{$format}; + my $packed; + + if ($proc) { + my @vals = split(' ',$val); + if ($count) { + $count = @vals if $count < 0; + } else { + $count = 1; # assume 1 if count not specified + } + $packed = ''; + while ($count--) { + $val = shift @vals; + return undef unless defined $val; + # validate numerical formats + if ($format =~ /^int/) { + unless (IsInt($val) or IsHex($val)) { + return undef unless IsFloat($val); + # round to nearest integer + $val = int($val + ($val < 0 ? -0.5 : 0.5)); + $_[0] = $val; + } + } elsif (not IsFloat($val)) { + return undef unless $format =~ /^rational/ and ($val eq 'inf' or + $val eq 'undef' or IsRational($val)); + } + $packed .= &$proc($val); + } + } elsif ($format eq 'string' or $format eq 'undef') { + $format eq 'string' and $val .= "\0"; # null-terminate strings + if ($count and $count > 0) { + my $diff = $count - length($val); + if ($diff) { + #warn "wrong string length!\n"; + # adjust length of string to match specified count + if ($diff < 0) { + if ($format eq 'string') { + return undef unless $count; + $val = substr($val, 0, $count - 1) . "\0"; + } else { + $val = substr($val, 0, $count); + } + } else { + $val .= "\0" x $diff; + } + } + } else { + $count = length($val); + } + $dataPt and substr($$dataPt, $offset, $count) = $val; + return $val; + } else { + warn "Sorry, Can't write $format values on this platform\n"; + return undef; + } + $dataPt and substr($$dataPt, $offset, length($packed)) = $packed; + return $packed; +} + +#------------------------------------------------------------------------------ +# Encode bit mask (the inverse of DecodeBits()) +# Inputs: 0) value to encode, 1) Reference to hash for encoding (or undef) +# 2) optional number of bits per word (defaults to 32), 3) total bits +# Returns: bit mask or undef on error (plus error string in list context) +sub EncodeBits($$;$$) +{ + my ($val, $lookup, $bits, $num) = @_; + $bits or $bits = 32; + $num or $num = $bits; + my $words = int(($num + $bits - 1) / $bits); + my @outVal = (0) x $words; + if ($val ne '(none)') { + my @vals = split /\s*,\s*/, $val; + foreach $val (@vals) { + my $bit; + if ($lookup) { + $bit = ReverseLookup($val, $lookup); + # (Note: may get non-numerical $bit values from Unknown() tags) + unless (defined $bit) { + if ($val =~ /\[(\d+)\]/) { # numerical bit specification + $bit = $1; + } else { + # don't return error string unless more than one value + return undef unless @vals > 1 and wantarray; + return (undef, "no match for '${val}'"); + } + } + } else { + $bit = $val; + } + unless (IsInt($bit) and $bit < $num) { + return undef unless wantarray; + return (undef, IsInt($bit) ? 'bit number too high' : 'not an integer'); + } + my $word = int($bit / $bits); + $outVal[$word] |= (1 << ($bit - $word * $bits)); + } + } + return "@outVal"; +} + +#------------------------------------------------------------------------------ +# get current position in output file (or end of file if a scalar reference) +# Inputs: 0) file or scalar reference +# Returns: Current position or -1 on error +sub Tell($) +{ + my $outfile = shift; + if (UNIVERSAL::isa($outfile,'GLOB')) { + return tell($outfile); + } else { + return length($$outfile); + } +} + +#------------------------------------------------------------------------------ +# write to file or memory +# Inputs: 0) file or scalar reference, 1-N) list of stuff to write +# Returns: true on success +sub Write($@) +{ + my $outfile = shift; + if (UNIVERSAL::isa($outfile,'GLOB')) { + return print $outfile @_; + } elsif (ref $outfile eq 'SCALAR') { + $$outfile .= join('', @_); + return 1; + } + return 0; +} + +#------------------------------------------------------------------------------ +# Write trailer buffer to file (applying fixups if necessary) +# Inputs: 0) ExifTool object ref, 1) trailer dirInfo ref, 2) output file ref +# Returns: 1 on success +sub WriteTrailerBuffer($$$) +{ + my ($self, $trailInfo, $outfile) = @_; + if ($$self{DEL_GROUP}{Trailer}) { + $self->VPrint(0, " Deleting trailer ($$trailInfo{Offset} bytes)\n"); + ++$$self{CHANGED}; + return 1; + } + my $pos = Tell($outfile); + my $trailPt = $$trailInfo{OutFile}; + # apply fixup if necessary (AFCP requires this) + if ($$trailInfo{Fixup}) { + if ($pos > 0) { + # shift offsets to final AFCP location and write it out + $$trailInfo{Fixup}{Shift} += $pos; + $$trailInfo{Fixup}->ApplyFixup($trailPt); + } else { + $self->Error("Can't get file position for trailer offset fixup",1); + } + } + return Write($outfile, $$trailPt); +} + +#------------------------------------------------------------------------------ +# Add trailers as a block +# Inputs: 0) ExifTool object ref, 1) [optional] trailer data raf, +# 1 or 2-N) trailer types to add (or none to add all) +# Returns: new trailer ref, or undef +# - increments CHANGED if trailer was added +sub AddNewTrailers($;@) +{ + my ($self, @types) = @_; + my $trailPt; + ref $types[0] and $trailPt = shift @types; + $types[0] or shift @types; # (in case undef data ref is passed) + # add all possible trailers if none specified (currently only CanonVRD) + @types or @types = qw(CanonVRD CanonDR4); + # add trailers as a block (if not done already) + my $type; + foreach $type (@types) { + next unless $$self{NEW_VALUE}{$Image::ExifTool::Extra{$type}}; + next if $$self{"Did$type"}; + my $val = $self->GetNewValue($type) or next; + # DR4 record must be wrapped in VRD trailer package + if ($type eq 'CanonDR4') { + next if $$self{DidCanonVRD}; # (only allow one VRD trailer) + require Image::ExifTool::CanonVRD; + $val = Image::ExifTool::CanonVRD::WrapDR4($val); + $$self{DidCanonVRD} = 1; + } + my $verb = $trailPt ? 'Writing' : 'Adding'; + $self->VPrint(0, " $verb $type as a block\n"); + if ($trailPt) { + $$trailPt .= $val; + } else { + $trailPt = \$val; + } + $$self{"Did$type"} = 1; + ++$$self{CHANGED}; + } + return $trailPt; +} + +#------------------------------------------------------------------------------ +# Write segment, splitting up into multiple segments if necessary +# Inputs: 0) file or scalar reference, 1) segment marker +# 2) segment header, 3) segment data ref, 4) segment type +# Returns: number of segments written, or 0 on error +# Notes: Writes a single empty segment if data is empty +sub WriteMultiSegment($$$$;$) +{ + my ($outfile, $marker, $header, $dataPt, $type) = @_; + $type or $type = ''; + my $len = length($$dataPt); + my $hdr = "\xff" . chr($marker); + my $count = 0; + my $maxLen = $maxSegmentLen - length($header); + $maxLen -= 2 if $type eq 'ICC'; # leave room for segment counters + my $num = int(($len + $maxLen - 1) / $maxLen); # number of segments to write + my $n = 0; + # write data, splitting into multiple segments if necessary + # (each segment gets its own header) + for (;;) { + ++$count; + my $size = $len - $n; + if ($size > $maxLen) { + $size = $maxLen; + # avoid starting an Extended EXIF segment with a valid TIFF header + # (because we would interpret that as a separate EXIF segment) + --$size if $type eq 'EXIF' and $n+$maxLen <= $len-4 and + substr($$dataPt, $n+$maxLen, 4) =~ /^(MM\0\x2a|II\x2a\0)/; + } + my $buff = substr($$dataPt,$n,$size); + $n += $size; + $size += length($header); + if ($type eq 'ICC') { + $buff = pack('CC', $count, $num) . $buff; + $size += 2; + } + # write the new segment with appropriate header + my $segHdr = $hdr . pack('n', $size + 2); + Write($outfile, $segHdr, $header, $buff) or return 0; + last if $n >= $len; + } + return $count; +} + +#------------------------------------------------------------------------------ +# Write XMP segment(s) to JPEG file +# Inputs: 0) ExifTool object ref, 1) outfile ref, 2) XMP data ref, +# 3) extended XMP data ref, 4) 32-char extended XMP GUID (or undef if no extended data) +# Returns: true on success, false on write error +sub WriteMultiXMP($$$$$) +{ + my ($self, $outfile, $dataPt, $extPt, $guid) = @_; + my $success = 1; + + # write main XMP segment + my $size = length($$dataPt) + length($xmpAPP1hdr); + if ($size > $maxXMPLen) { + $self->Error("XMP block too large for JPEG segment! ($size bytes)", 1); + return 1; + } + my $app1hdr = "\xff\xe1" . pack('n', $size + 2); + Write($outfile, $app1hdr, $xmpAPP1hdr, $$dataPt) or $success = 0; + # write extended XMP segment(s) if necessary + if (defined $guid) { + $size = length($$extPt); + my $maxLen = $maxXMPLen - 75; # maximum size without 75-byte header + my $off; + for ($off=0; $off<$size; $off+=$maxLen) { + # header(75) = signature(35) + guid(32) + size(4) + offset(4) + my $len = $size - $off; + $len = $maxLen if $len > $maxLen; + $app1hdr = "\xff\xe1" . pack('n', $len + 75 + 2); + $self->VPrint(0, "Writing extended XMP segment ($len bytes)\n"); + Write($outfile, $app1hdr, $xmpExtAPP1hdr, $guid, pack('N2', $size, $off), + substr($$extPt, $off, $len)) or $success = 0; + } + } + return $success; +} + +#------------------------------------------------------------------------------ +# WriteJPEG : Write JPEG image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid JPEG file, or -1 if +# an output file was specified and a write error occurred +sub WriteJPEG($$) +{ + my ($self, $dirInfo) = @_; + my $outfile = $$dirInfo{OutFile}; + my $raf = $$dirInfo{RAF}; + my ($ch, $s, $length,$err, %doneDir, $isEXV, $creatingEXV); + my $verbose = $$self{OPTIONS}{Verbose}; + my $out = $$self{OPTIONS}{TextOut}; + my $rtnVal = 0; + my %dumpParms = ( Out => $out ); + my ($writeBuffer, $oldOutfile); # used to buffer writing until PreviewImage position is known + + # check to be sure this is a valid JPG or EXV file + unless ($raf->Read($s,2) == 2 and $s eq "\xff\xd8") { + if (defined $s and length $s) { + return 0 unless $s eq "\xff\x01" and $raf->Read($s,5) == 5 and $s eq 'Exiv2'; + } else { + return 0 unless $$self{FILE_TYPE} eq 'EXV'; + $s = 'Exiv2'; + $creatingEXV = 1; + } + Write($outfile,"\xff\x01") or $err = 1; + $isEXV = 1; + } + $dumpParms{MaxLen} = 128 unless $verbose > 3; + + delete $$self{PREVIEW_INFO}; # reset preview information + delete $$self{DEL_PREVIEW}; # reset flag to delete preview + + Write($outfile, $s) or $err = 1; + # figure out what segments we need to write for the tags we have set + my $addDirs = $$self{ADD_DIRS}; + my $editDirs = $$self{EDIT_DIRS}; + my $delGroup = $$self{DEL_GROUP}; + my $path = $$self{PATH}; + my $pn = scalar @$path; + + # set input record separator to 0xff (the JPEG marker) to make reading quicker + local $/ = "\xff"; +# +# pre-scan image to determine if any create-able segment already exists +# + my $pos = $raf->Tell(); + my ($marker, @dirOrder, %dirCount); + Prescan: for (;;) { + # read up to next marker (JPEG markers begin with 0xff) + $raf->ReadLine($s) or last; + # JPEG markers can be padded with unlimited 0xff's + for (;;) { + $raf->Read($ch, 1) or last Prescan; + $marker = ord($ch); + last unless $marker == 0xff; + } + my $dirName; + # stop pre-scan at SOS (end of meta information) or EOI (end of image) + if ($marker == 0xda or $marker == 0xd9) { + $dirName = $jpegMarker{$marker}; + push(@dirOrder, $dirName); + $dirCount{$dirName} = 1; + last; + } + # handle SOF markers: SOF0-SOF15, except DHT(0xc4), JPGA(0xc8) and DAC(0xcc) + if (($marker & 0xf0) == 0xc0 and ($marker == 0xc0 or $marker & 0x03)) { + last unless $raf->Seek(7, 1); + # read data for all markers except stand-alone + # markers 0x00, 0x01 and 0xd0-0xd7 (NULL, TEM, RST0-RST7) + } elsif ($marker!=0x00 and $marker!=0x01 and ($marker<0xd0 or $marker>0xd7)) { + # read record length word + last unless $raf->Read($s, 2) == 2; + my $len = unpack('n',$s); # get data length + last unless defined($len) and $len >= 2; + $len -= 2; # subtract size of length word + if (($marker & 0xf0) == 0xe0) { # is this an APP segment? + my $n = $len < 64 ? $len : 64; + $raf->Read($s, $n) == $n or last; + $len -= $n; + # Note: only necessary to recognize APP segments that we can create, + # or delete as a group (and the names below should match @delGroups) + if ($marker == 0xe0) { + $s =~ /^JFIF\0/ and $dirName = 'JFIF'; + $s =~ /^JFXX\0\x10/ and $dirName = 'JFXX'; + $s =~ /^(II|MM).{4}HEAPJPGM/s and $dirName = 'CIFF'; + } elsif ($marker == 0xe1) { + if ($s =~ /^(.{0,4})$exifAPP1hdr(.{1,4})/is) { + $dirName = 'IFD0'; + my ($junk, $bytes) = ($1, $2); + # support multi-segment EXIF + if (@dirOrder and $dirOrder[-1] =~ /^(IFD0|ExtendedEXIF)$/ and + not length $junk and $bytes !~ /^(MM\0\x2a|II\x2a\0)/) + { + $dirName = 'ExtendedEXIF'; + } + } + $s =~ /^$xmpAPP1hdr/ and $dirName = 'XMP'; + $s =~ /^$xmpExtAPP1hdr/ and $dirName = 'XMP'; + } elsif ($marker == 0xe2) { + $s =~ /^ICC_PROFILE\0/ and $dirName = 'ICC_Profile'; + $s =~ /^FPXR\0/ and $dirName = 'FlashPix'; + $s =~ /^MPF\0/ and $dirName = 'MPF'; + } elsif ($marker == 0xe3) { + $s =~ /^(Meta|META|Exif)\0\0/ and $dirName = 'Meta'; + } elsif ($marker == 0xe5) { + $s =~ /^RMETA\0/ and $dirName = 'RMETA'; + } elsif ($marker == 0xec) { + $s =~ /^Ducky/ and $dirName = 'Ducky'; + } elsif ($marker == 0xed) { + $s =~ /^$psAPP13hdr/ and $dirName = 'Photoshop'; + } elsif ($marker == 0xee) { + $s =~ /^Adobe/ and $dirName = 'Adobe'; + } + # initialize doneDir as a flag that the directory exists + # (unless we are deleting it anyway) + $doneDir{$dirName} = 0 if defined $dirName and not $$delGroup{$dirName}; + } + $raf->Seek($len, 1) or last; + } + $dirName or $dirName = JpegMarkerName($marker); + $dirCount{$dirName} = ($dirCount{$dirName} || 0) + 1; + push @dirOrder, $dirName; + } + unless ($marker and $marker == 0xda) { + $isEXV or $self->Error('Corrupted JPEG image'), return 1; + $marker and $marker != 0xd9 and $self->Error('Corrupted EXV file'), return 1; + } + $raf->Seek($pos, 0) or $self->Error('Seek error'), return 1; +# +# re-write the image +# + my ($combinedSegData, $segPos, $firstSegPos, %extendedXMP); + my (@iccChunk, $iccChunkCount, $iccChunksTotal); + # read through each segment in the JPEG file + Marker: for (;;) { + + # read up to next marker (JPEG markers begin with 0xff) + my $segJunk; + $raf->ReadLine($segJunk) or $segJunk = ''; + # remove the 0xff but write the rest of the junk up to this point + # (this will handle the data after the first 7 bytes of SOF segments) + chomp($segJunk); + Write($outfile, $segJunk) if length $segJunk; + # JPEG markers can be padded with unlimited 0xff's + for (;;) { + if ($raf->Read($ch, 1)) { + $marker = ord($ch); + last unless $marker == 0xff; + } elsif ($creatingEXV) { + # create EXV from scratch + $marker = 0xd9; # EOI + push @dirOrder, 'EOI'; + $dirCount{EOI} = 1; + last; + } else { + $self->Error('Format error'); + return 1; + } + } + # read the segment data + my $segData; + # handle SOF markers: SOF0-SOF15, except DHT(0xc4), JPGA(0xc8) and DAC(0xcc) + if (($marker & 0xf0) == 0xc0 and ($marker == 0xc0 or $marker & 0x03)) { + last unless $raf->Read($segData, 7) == 7; + # read data for all markers except stand-alone + # markers 0x00, 0x01 and 0xd0-0xd7 (NULL, TEM, EOI, RST0-RST7) + } elsif ($marker!=0x00 and $marker!=0x01 and $marker!=0xd9 and + ($marker<0xd0 or $marker>0xd7)) + { + # read record length word + last unless $raf->Read($s, 2) == 2; + my $len = unpack('n',$s); # get data length + last unless defined($len) and $len >= 2; + $segPos = $raf->Tell(); + $len -= 2; # subtract size of length word + last unless $raf->Read($segData, $len) == $len; + } + # initialize variables for this segment + my $hdr = "\xff" . chr($marker); # segment header + my $markerName = JpegMarkerName($marker); + my $dirName = shift @dirOrder; # get directory name +# +# create all segments that must come before this one +# (nothing comes before SOI or after SOS) +# + while ($markerName ne 'SOI') { + if (exists $$addDirs{JFIF} and not defined $doneDir{JFIF}) { + $doneDir{JFIF} = 1; + if (defined $doneDir{Adobe}) { + # JFIF overrides Adobe APP14 colour components, so don't allow this + # (ref https://docs.oracle.com/javase/8/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html) + $self->Warn('Not creating JFIF in JPEG with Adobe APP14'); + } else { + if ($verbose) { + print $out "Creating APP0:\n"; + print $out " Creating JFIF with default values\n"; + } + my $jfif = "\x01\x02\x01\0\x48\0\x48\0\0"; + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::JFIF::Main'); + my %dirInfo = ( + DataPt => \$jfif, + DirStart => 0, + DirLen => length $jfif, + Parent => 'JFIF', + ); + # must temporarily remove JFIF from DEL_GROUP so we can + # delete JFIF and add it back again in a single step + my $delJFIF = $$delGroup{JFIF}; + delete $$delGroup{JFIF}; + $$path[$pn] = 'JFIF'; + my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr); + $$delGroup{JFIF} = $delJFIF if defined $delJFIF; + if (defined $newData and length $newData) { + my $app0hdr = "\xff\xe0" . pack('n', length($newData) + 7); + Write($outfile,$app0hdr,"JFIF\0",$newData) or $err = 1; + } + } + } + # don't create anything before APP0 or APP1 EXIF (containing IFD0) + last if $markerName eq 'APP0' or $dirCount{IFD0} or $dirCount{ExtendedEXIF}; + # EXIF information must come immediately after APP0 + if (exists $$addDirs{IFD0} and not defined $doneDir{IFD0}) { + $doneDir{IFD0} = 1; + $verbose and print $out "Creating APP1:\n"; + # write new EXIF data + $$self{TIFF_TYPE} = 'APP1'; + my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main'); + my %dirInfo = ( + DirName => 'IFD0', + Parent => 'APP1', + ); + $$path[$pn] = 'APP1'; + my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr, \&WriteTIFF); + if (defined $buff and length $buff) { + if (length($buff) + length($exifAPP1hdr) > $maxSegmentLen) { + if ($self->Options('NoMultiExif')) { + $self->Error('EXIF is too large for JPEG segment'); + } else { + $self->Warn('Creating multi-segment EXIF',1); + } + } + # switch to buffered output if required + if (($$self{PREVIEW_INFO} or $$self{LeicaTrailer}) and not $oldOutfile) { + $writeBuffer = ''; + $oldOutfile = $outfile; + $outfile = \$writeBuffer; + # account for segment, EXIF and TIFF headers + $$self{PREVIEW_INFO}{Fixup}{Start} += 18 if $$self{PREVIEW_INFO}; + $$self{LeicaTrailer}{Fixup}{Start} += 18 if $$self{LeicaTrailer}; + } + # write as multi-segment + my $n = WriteMultiSegment($outfile, 0xe1, $exifAPP1hdr, \$buff, 'EXIF'); + if (not $n) { + $err = 1; + } elsif ($n > 1 and $oldOutfile) { + # (punt on this because updating the pointers would be a real pain) + $self->Error("Can't write multi-segment EXIF with external pointers"); + } + ++$$self{CHANGED}; + } + } + # APP13 Photoshop segment next + last if $dirCount{Photoshop}; + if (exists $$addDirs{Photoshop} and not defined $doneDir{Photoshop}) { + $doneDir{Photoshop} = 1; + $verbose and print $out "Creating APP13:\n"; + # write new APP13 Photoshop record to memory + my $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Main'); + my %dirInfo = ( + Parent => 'APP13', + ); + $$path[$pn] = 'APP13'; + my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $buff and length $buff) { + WriteMultiSegment($outfile, 0xed, $psAPP13hdr, \$buff) or $err = 1; + ++$$self{CHANGED}; + } + } + # then APP1 XMP segment + last if $dirCount{XMP}; + if (exists $$addDirs{XMP} and not defined $doneDir{XMP}) { + $doneDir{XMP} = 1; + $verbose and print $out "Creating APP1:\n"; + # write new XMP data + my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main'); + my %dirInfo = ( + Parent => 'APP1', + # specify MaxDataLen so XMP is split if required + MaxDataLen => $maxXMPLen - length($xmpAPP1hdr), + ); + $$path[$pn] = 'APP1'; + my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $buff and length $buff) { + WriteMultiXMP($self, $outfile, \$buff, $dirInfo{ExtendedXMP}, + $dirInfo{ExtendedGUID}) or $err = 1; + } + } + # then APP2 ICC_Profile segment + last if $dirCount{ICC_Profile}; + if (exists $$addDirs{ICC_Profile} and not defined $doneDir{ICC_Profile}) { + $doneDir{ICC_Profile} = 1; + next if $$delGroup{ICC_Profile} and $$delGroup{ICC_Profile} != 2; + $verbose and print $out "Creating APP2:\n"; + # write new ICC_Profile data + my $tagTablePtr = GetTagTable('Image::ExifTool::ICC_Profile::Main'); + my %dirInfo = ( + Parent => 'APP2', + ); + $$path[$pn] = 'APP2'; + my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $buff and length $buff) { + WriteMultiSegment($outfile, 0xe2, "ICC_PROFILE\0", \$buff, 'ICC') or $err = 1; + ++$$self{CHANGED}; + } + } + # then APP12 Ducky segment + last if $dirCount{Ducky}; + if (exists $$addDirs{Ducky} and not defined $doneDir{Ducky}) { + $doneDir{Ducky} = 1; + $verbose and print $out "Creating APP12 Ducky:\n"; + # write new Ducky segment data + my $tagTablePtr = GetTagTable('Image::ExifTool::APP12::Ducky'); + my %dirInfo = ( + Parent => 'APP12', + ); + $$path[$pn] = 'APP12'; + my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $buff and length $buff) { + my $size = length($buff) + 5; + if ($size <= $maxSegmentLen) { + # write the new segment with appropriate header + my $app12hdr = "\xff\xec" . pack('n', $size + 2); + Write($outfile, $app12hdr, 'Ducky', $buff) or $err = 1; + } else { + $self->Warn("APP12 Ducky segment too large! ($size bytes)"); + } + } + } + # then APP14 Adobe segment + last if $dirCount{Adobe}; + if (exists $$addDirs{Adobe} and not defined $doneDir{Adobe}) { + $doneDir{Adobe} = 1; + my $buff = $self->GetNewValue('Adobe'); + if ($buff) { + $verbose and print $out "Creating APP14:\n Creating Adobe segment\n"; + my $size = length($buff); + if ($size <= $maxSegmentLen) { + # write the new segment with appropriate header + my $app14hdr = "\xff\xee" . pack('n', $size + 2); + Write($outfile, $app14hdr, $buff) or $err = 1; + ++$$self{CHANGED}; + } else { + $self->Warn("APP14 Adobe segment too large! ($size bytes)"); + } + } + } + # finally, COM segment + last if $dirCount{COM}; + if (exists $$addDirs{COM} and not defined $doneDir{COM}) { + $doneDir{COM} = 1; + next if $$delGroup{File} and $$delGroup{File} != 2; + my $newComment = $self->GetNewValue('Comment'); + if (defined $newComment) { + if ($verbose) { + print $out "Creating COM:\n"; + $self->VerboseValue('+ Comment', $newComment); + } + WriteMultiSegment($outfile, 0xfe, '', \$newComment) or $err = 1; + ++$$self{CHANGED}; + } + } + last; # didn't want to loop anyway + } + $$path[$pn] = $markerName; + # decrement counter for this directory since we are about to process it + --$dirCount{$dirName}; +# +# rewrite existing segments +# + # handle SOF markers: SOF0-SOF15, except DHT(0xc4), JPGA(0xc8) and DAC(0xcc) + if (($marker & 0xf0) == 0xc0 and ($marker == 0xc0 or $marker & 0x03)) { + $verbose and print $out "JPEG $markerName:\n"; + Write($outfile, $hdr, $segData) or $err = 1; + next; + } elsif ($marker == 0xda) { # SOS + pop @$path; + $verbose and print $out "JPEG SOS\n"; + # write SOS segment + $s = pack('n', length($segData) + 2); + Write($outfile, $hdr, $s, $segData) or $err = 1; + my ($buff, $endPos, $trailInfo); + my $delPreview = $$self{DEL_PREVIEW}; + $trailInfo = IdentifyTrailer($raf) unless $$delGroup{Trailer}; + my $nvTrail = $self->GetNewValueHash($Image::ExifTool::Extra{Trailer}); + unless ($oldOutfile or $delPreview or $trailInfo or $$delGroup{Trailer} or $nvTrail) { + # blindly copy the rest of the file + while ($raf->Read($buff, 65536)) { + Write($outfile, $buff) or $err = 1, last; + } + $rtnVal = 1; # success unless we have a file write error + last; # all done + } + # write the rest of the image (as quickly as possible) up to the EOI + my $endedWithFF; + for (;;) { + my $n = $raf->Read($buff, 65536) or last Marker; + if (($endedWithFF and $buff =~ m/^\xd9/sg) or + $buff =~ m/\xff\xd9/sg) + { + $rtnVal = 1; # the JPEG is OK + # write up to the EOI + my $pos = pos($buff); + Write($outfile, substr($buff, 0, $pos)) or $err = 1; + $buff = substr($buff, $pos); + last; + } + unless ($n == 65536) { + $self->Error('JPEG EOI marker not found'); + last Marker; + } + Write($outfile, $buff) or $err = 1; + $endedWithFF = substr($buff, 65535, 1) eq "\xff" ? 1 : 0; + } + # remember position of last data copied + $endPos = $raf->Tell() - length($buff); + # write new trailer if specified + if ($nvTrail) { + # access new value directly to avoid copying a potentially very large data block + if ($$nvTrail{Value} and $$nvTrail{Value}[0]) { # (note: "0" will also delete the trailer) + $self->VPrint(0, ' Writing new trailer'); + Write($outfile, $$nvTrail{Value}[0]) or $err = 1; + ++$$self{CHANGED}; + } elsif ($raf->Seek(0, 2) and $raf->Tell() != $endPos) { + $self->VPrint(0, ' Deleting trailer (', $raf->Tell() - $endPos, ' bytes)'); + ++$$self{CHANGED}; # changed if there was previously a trailer + } + last; # all done + } + # rewrite existing trailers + if ($trailInfo) { + my $tbuf = ''; + $raf->Seek(-length($buff), 1); # seek back to just after EOI + $$trailInfo{OutFile} = \$tbuf; # rewrite the trailer + $$trailInfo{ScanForAFCP} = 1; # scan if necessary + $self->ProcessTrailers($trailInfo) or undef $trailInfo; + } + if (not $oldOutfile) { + # do nothing special + } elsif ($$self{LeicaTrailer}) { + my $trailLen; + if ($trailInfo) { + $trailLen = $$trailInfo{DataPos} - $endPos; + } else { + $raf->Seek(0, 2) or $err = 1; + $trailLen = $raf->Tell() - $endPos; + } + my $fixup = $$self{LeicaTrailer}{Fixup}; + $$self{LeicaTrailer}{TrailPos} = $endPos; + $$self{LeicaTrailer}{TrailLen} = $trailLen; + # get _absolute_ position of new Leica trailer + my $absPos = Tell($oldOutfile) + length($$outfile); + require Image::ExifTool::Panasonic; + my $dat = Image::ExifTool::Panasonic::ProcessLeicaTrailer($self, $absPos); + # allow some junk before Leica trailer (just in case) + my $junk = $$self{LeicaTrailerPos} - $endPos; + # set MakerNote pointer and size (subtract 10 for segment and EXIF headers) + $fixup->SetMarkerPointers($outfile, 'LeicaTrailer', length($$outfile) - 10 + $junk); + # use this fixup to set the size too (sneaky) + my $trailSize = defined($dat) ? length($dat) - $junk : $$self{LeicaTrailer}{Size}; + $$fixup{Start} -= 4; $$fixup{Shift} += 4; + $fixup->SetMarkerPointers($outfile, 'LeicaTrailer', $trailSize) if defined $trailSize; + $$fixup{Start} += 4; $$fixup{Shift} -= 4; + # clean up and write the buffered data + $outfile = $oldOutfile; + undef $oldOutfile; + Write($outfile, $writeBuffer) or $err = 1; + undef $writeBuffer; + if (defined $dat) { + Write($outfile, $dat) or $err = 1; # write new Leica trailer + $delPreview = 1; # delete existing Leica trailer + } + } else { + # locate preview image and fix up preview offsets + my $scanLen = $$self{Make} =~ /^SONY/i ? 65536 : 1024; + if (length($buff) < $scanLen) { # make sure we have enough trailer to scan + my $buf2; + $buff .= $buf2 if $raf->Read($buf2, $scanLen - length($buff)); + } + # get new preview image position, relative to EXIF base + my $newPos = length($$outfile) - 10; # (subtract 10 for segment and EXIF headers) + my $junkLen; + # adjust position if image isn't at the start (eg. Olympus E-1/E-300) + if ($buff =~ /(\xff\xd8\xff.|.\xd8\xff\xdb)(..)/sg) { + my ($jpegHdr, $segLen) = ($1, $2); + $junkLen = pos($buff) - 6; + # Sony previewimage trailer has a 32 byte header + if ($$self{Make} =~ /^SONY/i and $junkLen > 32) { + # with some newer Sony models, the makernotes preview pointer + # points to JPEG at end of EXIF inside MPImage preview (what a pain!) + if ($jpegHdr eq "\xff\xd8\xff\xe1") { # is the first segment EXIF? + $segLen = unpack('n', $segLen); # the EXIF segment length + # Sony PreviewImage starts with last 2 bytes of EXIF segment + # (and first byte is usually "\0", not "\xff", so don't check this) + if (length($buff) > $junkLen + $segLen + 6 and + substr($buff, $junkLen + $segLen + 3, 3) eq "\xd8\xff\xdb") + { + $junkLen += $segLen + 2; + # (note: this will not copy the trailer after PreviewImage, + # which is a 14kB block full of zeros for the A77) + } + } + $junkLen -= 32; + } + $newPos += $junkLen; + } + # fix up the preview offsets to point to the start of the new image + my $previewInfo = $$self{PREVIEW_INFO}; + delete $$self{PREVIEW_INFO}; + my $fixup = $$previewInfo{Fixup}; + $newPos += ($$previewInfo{BaseShift} || 0); + # adjust to absolute file offset if necessary (Samsung STMN) + $newPos += Tell($oldOutfile) + 10 if $$previewInfo{Absolute}; + if ($$previewInfo{Relative}) { + # adjust for our base by looking at how far the pointer got shifted + $newPos -= ($fixup->GetMarkerPointers($outfile, 'PreviewImage') || 0); + } elsif ($$previewInfo{ChangeBase}) { + # Leica S2 uses relative offsets for the preview only (leica sucks) + my $makerOffset = $fixup->GetMarkerPointers($outfile, 'LeicaTrailer'); + $newPos -= $makerOffset if $makerOffset; + } + $fixup->SetMarkerPointers($outfile, 'PreviewImage', $newPos); + # clean up and write the buffered data + $outfile = $oldOutfile; + undef $oldOutfile; + Write($outfile, $writeBuffer) or $err = 1; + undef $writeBuffer; + # write preview image + if ($$previewInfo{Data} ne 'LOAD_PREVIEW') { + # write any junk that existed before the preview image + Write($outfile, substr($buff,0,$junkLen)) or $err = 1 if $junkLen; + # write the saved preview image + Write($outfile, $$previewInfo{Data}) or $err = 1; + delete $$previewInfo{Data}; + # (don't increment CHANGED because we could be rewriting existing preview) + $delPreview = 1; # remove old preview + } + } + # copy over preview image if necessary + unless ($delPreview) { + my $extra; + if ($trailInfo) { + # copy everything up to start of first processed trailer + $extra = $$trailInfo{DataPos} - $endPos; + } else { + # copy everything up to end of file + $raf->Seek(0, 2) or $err = 1; + $extra = $raf->Tell() - $endPos; + } + if ($extra > 0) { + if ($$delGroup{Trailer}) { + $verbose and print $out " Deleting unknown trailer ($extra bytes)\n"; + ++$$self{CHANGED}; + } else { + # copy over unknown trailer + $verbose and print $out " Preserving unknown trailer ($extra bytes)\n"; + $raf->Seek($endPos, 0) or $err = 1; + CopyBlock($raf, $outfile, $extra) or $err = 1; + } + } + } + # write trailer if necessary + if ($trailInfo) { + $self->WriteTrailerBuffer($trailInfo, $outfile) or $err = 1; + undef $trailInfo; + } + last; # all done parsing file + + } elsif ($marker==0xd9 and $isEXV) { + # write EXV EOI (any trailer will be lost) + Write($outfile, "\xff\xd9") or $err = 1; + $rtnVal = 1; + last; + + } elsif ($marker==0x00 or $marker==0x01 or ($marker>=0xd0 and $marker<=0xd7)) { + $verbose and $marker and print $out "JPEG $markerName:\n"; + # handle stand-alone markers 0x00, 0x01 and 0xd0-0xd7 (NULL, TEM, RST0-RST7) + Write($outfile, $hdr) or $err = 1; + next; + } + # + # NOTE: A 'next' statement after this point will cause $$segDataPt + # not to be written if there is an output file, so in this case + # the $$self{CHANGED} flags must be updated + # + my $segDataPt = \$segData; + $length = length($segData); + if ($verbose) { + print $out "JPEG $markerName ($length bytes):\n"; + if ($verbose > 2 and $markerName =~ /^APP/) { + HexDump($segDataPt, undef, %dumpParms); + } + } + # group delete of APP segments + if ($$delGroup{$dirName}) { + $verbose and print $out " Deleting $dirName segment\n"; + $self->Warn('ICC_Profile deleted. Image colors may be affected') if $dirName eq 'ICC_Profile'; + ++$$self{CHANGED}; + next Marker; + } + my ($segType, $del); + # rewrite this segment only if we are changing a tag which is contained in its + # directory (or deleting '*', in which case we need to identify the segment type) + while (exists $$editDirs{$markerName} or $$delGroup{'*'}) { + if ($marker == 0xe0) { # APP0 (JFIF, CIFF) + if ($$segDataPt =~ /^JFIF\0/) { + $segType = 'JFIF'; + $$delGroup{JFIF} and $del = 1, last; + last unless $$editDirs{JFIF}; + SetByteOrder('MM'); + my $tagTablePtr = GetTagTable('Image::ExifTool::JFIF::Main'); + my %dirInfo = ( + DataPt => $segDataPt, + DataPos => $segPos, + DataLen => $length, + DirStart => 5, # directory starts after identifier + DirLen => $length-5, + Parent => $markerName, + ); + my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $newData and length $newData) { + $$segDataPt = "JFIF\0" . $newData; + } + } elsif ($$segDataPt =~ /^JFXX\0\x10/) { + $segType = 'JFXX'; + $$delGroup{JFIF} and $del = 1; + } elsif ($$segDataPt =~ /^(II|MM).{4}HEAPJPGM/s) { + $segType = 'CIFF'; + $$delGroup{CIFF} and $del = 1, last; + last unless $$editDirs{CIFF}; + my $newData = ''; + my %dirInfo = ( + RAF => new File::RandomAccess($segDataPt), + OutFile => \$newData, + ); + require Image::ExifTool::CanonRaw; + if (Image::ExifTool::CanonRaw::WriteCRW($self, \%dirInfo) > 0) { + if (length $newData) { + $$segDataPt = $newData; + } else { + undef $segDataPt; + $del = 1; # delete this segment + } + } + } + } elsif ($marker == 0xe1) { # APP1 (EXIF, XMP) + # check for EXIF data + if ($$segDataPt =~ /^(.{0,4})$exifAPP1hdr/is) { + my $hdrLen = length $exifAPP1hdr; + if (length $1) { + $hdrLen += length $1; + $self->Error('Unknown garbage at start of EXIF segment',1); + } elsif ($$segDataPt !~ /^Exif\0/) { + $self->Error('Incorrect EXIF segment identifier',1); + } + $segType = 'EXIF'; + last unless $$editDirs{IFD0}; + # add this data to the combined data if it exists + if (defined $combinedSegData) { + $combinedSegData .= substr($$segDataPt,$hdrLen); + $segDataPt = \$combinedSegData; + $segPos = $firstSegPos; + $length = length $combinedSegData; # update length + } + # peek ahead to see if the next segment is extended EXIF + if ($dirOrder[0] eq 'ExtendedEXIF') { + # initialize combined data if necessary + unless (defined $combinedSegData) { + $combinedSegData = $$segDataPt; + $firstSegPos = $segPos; + $self->Warn('File contains multi-segment EXIF',1); + } + next Marker; # get the next segment to combine + } + $doneDir{IFD0} and $self->Warn('Multiple APP1 EXIF records'); + $doneDir{IFD0} = 1; + # check del groups now so we can change byte order in one step + if ($$delGroup{IFD0} or $$delGroup{EXIF}) { + delete $doneDir{IFD0}; # delete so we will create a new one + $del = 1; + last; + } + # rewrite EXIF as if this were a TIFF file in memory + my %dirInfo = ( + DataPt => $segDataPt, + DataPos => -$hdrLen, # (remember: relative to Base!) + DirStart => $hdrLen, + Base => $segPos + $hdrLen, + Parent => $markerName, + DirName => 'IFD0', + ); + # write new EXIF data to memory + my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main'); + my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr, \&WriteTIFF); + if (defined $buff) { + undef $$segDataPt; # free the old buffer + $segDataPt = \$buff; + } else { + last Marker unless $self->Options('IgnoreMinorErrors'); + } + # delete segment if IFD contains no entries + length $$segDataPt or $del = 1, last; + if (length($$segDataPt) + length($exifAPP1hdr) > $maxSegmentLen) { + if ($self->Options('NoMultiExif')) { + $self->Error('EXIF is too large for JPEG segment'); + } else { + $self->Warn('Writing multi-segment EXIF',1); + } + } + # switch to buffered output if required + if (($$self{PREVIEW_INFO} or $$self{LeicaTrailer}) and not $oldOutfile) { + $writeBuffer = ''; + $oldOutfile = $outfile; + $outfile = \$writeBuffer; + # must account for segment, EXIF and TIFF headers + $$self{PREVIEW_INFO}{Fixup}{Start} += 18 if $$self{PREVIEW_INFO}; + $$self{LeicaTrailer}{Fixup}{Start} += 18 if $$self{LeicaTrailer}; + } + # write as multi-segment + my $n = WriteMultiSegment($outfile, $marker, $exifAPP1hdr, $segDataPt, 'EXIF'); + if (not $n) { + $err = 1; + } elsif ($n > 1 and $oldOutfile) { + # (punt on this because updating the pointers would be a real pain) + $self->Error("Can't write multi-segment EXIF with external pointers"); + } + undef $combinedSegData; + undef $$segDataPt; + next Marker; + # check for XMP data + } elsif ($$segDataPt =~ /^($xmpAPP1hdr|$xmpExtAPP1hdr)/) { + $segType = 'XMP'; + $$delGroup{XMP} and $del = 1, last; + $doneDir{XMP} = ($doneDir{XMP} || 0) + 1; + last unless $$editDirs{XMP}; + if ($doneDir{XMP} + $dirCount{XMP} > 1) { + # must assemble all XMP segments before writing + my ($guid, $extXMP); + if ($$segDataPt =~ /^$xmpExtAPP1hdr/) { + # save extended XMP data + if (length $$segDataPt < 75) { + $extendedXMP{Error} = 'Truncated data'; + } else { + my ($size, $off) = unpack('x67N2', $$segDataPt); + $guid = substr($$segDataPt, 35, 32); + if ($guid =~ /[^A-Za-z0-9]/) { # (technically, should be uppercase) + $extendedXMP{Error} = 'Invalid GUID'; + } else { + # remember extended data for each GUID + $extXMP = $extendedXMP{$guid}; + if ($extXMP) { + $size == $$extXMP{Size} or $extendedXMP{Error} = 'Inconsistent size'; + } else { + $extXMP = $extendedXMP{$guid} = { }; + } + $$extXMP{Size} = $size; + $$extXMP{$off} = substr($$segDataPt, 75); + } + } + } else { + # save all main XMP segments (should normally be only one) + $extendedXMP{Main} = [] unless $extendedXMP{Main}; + push @{$extendedXMP{Main}}, substr($$segDataPt, length $xmpAPP1hdr); + } + # continue processing only if we have read all the segments + next Marker if $dirCount{XMP}; + # reconstruct an XMP super-segment + $$segDataPt = $xmpAPP1hdr; + my $goodGuid = ''; + foreach (@{$extendedXMP{Main}}) { + # get the HasExtendedXMP GUID if it exists + if (/:HasExtendedXMP\s*(=\s*['"]|>)(\w{32})/) { + # warn of subsequent XMP blocks specifying a different + # HasExtendedXMP (have never seen this) + if ($goodGuid and $goodGuid ne $2) { + $self->WarnOnce('Multiple XMP segments specifying different extended XMP GUID'); + } + $goodGuid = $2; # GUID for the standard extended XMP + } + $$segDataPt .= $_; + } + # GUID of the extended XMP that we want to read + my $readGuid = $$self{OPTIONS}{ExtendedXMP} || 0; + $readGuid = $goodGuid if $readGuid eq '1'; + foreach $guid (sort keys %extendedXMP) { + next unless length $guid == 32; # ignore other (internal) keys + if ($guid ne $readGuid and $readGuid ne '2') { + my $non = $guid eq $goodGuid ? '' : 'non-'; + $self->Warn("Ignored ${non}standard extended XMP (GUID $guid)"); + next; + } + if ($guid ne $goodGuid) { + $self->Warn("Reading non-standard extended XMP (GUID $guid)"); + } + $extXMP = $extendedXMP{$guid}; + next unless ref $extXMP eq 'HASH'; # (just to be safe) + my $size = $$extXMP{Size}; + my (@offsets, $off); + for ($off=0; $off<$size; ) { + last unless defined $$extXMP{$off}; + push @offsets, $off; + $off += length $$extXMP{$off}; + } + if ($off == $size) { + # add all XMP to super-segment + $$segDataPt .= $$extXMP{$_} foreach @offsets; + } else { + $self->Error("Incomplete extended XMP (GUID $guid)", 1); + } + } + $self->Error("$extendedXMP{Error} in extended XMP", 1) if $extendedXMP{Error}; + } + my $start = length $xmpAPP1hdr; + my $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main'); + my %dirInfo = ( + DataPt => $segDataPt, + DirStart => $start, + Parent => $markerName, + # limit XMP size and create extended XMP if necessary + MaxDataLen => $maxXMPLen - length($xmpAPP1hdr), + ); + my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $newData) { + undef %extendedXMP; + if (length $newData) { + # write multi-segment XMP (XMP plus extended XMP if necessary) + WriteMultiXMP($self, $outfile, \$newData, $dirInfo{ExtendedXMP}, + $dirInfo{ExtendedGUID}) or $err = 1; + undef $$segDataPt; # free the old buffer + next Marker; + } else { + $$segDataPt = ''; # delete the XMP + } + } else { + $verbose and print $out " [XMP rewritten with no changes]\n"; + if ($doneDir{XMP} > 1) { + # re-write original multi-segment XMP + my ($dat, $guid, $extXMP, $off); + foreach $dat (@{$extendedXMP{Main}}) { # main XMP + next unless length $dat; + $s = pack('n', length($xmpAPP1hdr) + length($dat) + 2); + Write($outfile, $hdr, $s, $xmpAPP1hdr, $dat) or $err = 1; + } + foreach $guid (sort keys %extendedXMP) { # extended XMP + next unless length $guid == 32; + $extXMP = $extendedXMP{$guid}; + next unless ref $extXMP eq 'HASH'; + my $size = $$extXMP{Size} or next; + for ($off=0; defined $$extXMP{$off}; $off += length $$extXMP{$off}) { + $s = pack('n', length($xmpExtAPP1hdr) + length($$extXMP{$off}) + 42); + Write($outfile, $hdr, $s, $xmpExtAPP1hdr, $guid, + pack('N2', $size, $off), $$extXMP{$off}) or $err = 1; + } + } + undef $$segDataPt; # free the old buffer + undef %extendedXMP; + next Marker; + } + # continue on to re-write original single-segment XMP + } + $del = 1 unless length $$segDataPt; + } elsif ($$segDataPt =~ /^http/ or $$segDataPt =~ /<exif:/) { + $self->Warn('Ignored APP1 XMP segment with non-standard header', 1); + } + } elsif ($marker == 0xe2) { # APP2 (ICC Profile, FPXR, MPF) + if ($$segDataPt =~ /^ICC_PROFILE\0/ and $length >= 14) { + $segType = 'ICC_Profile'; + $$delGroup{ICC_Profile} and $del = 1, last; + # must concatenate blocks of profile + my $chunkNum = Get8u($segDataPt, 12); + my $chunksTot = Get8u($segDataPt, 13); + if (defined $iccChunksTotal) { + # abort parsing ICC_Profile if the total chunk count is inconsistent + if ($chunksTot != $iccChunksTotal and defined $iccChunkCount) { + # an error because the accumulated profile data will be lost + $self->Error('Inconsistent ICC_Profile chunk count', 1); + undef $iccChunkCount; # abort ICC_Profile parsing + undef $chunkNum; # avoid 2nd warning below + ++$$self{CHANGED}; # we are deleting the bad chunks before this one + } + } else { + $iccChunkCount = 0; + $iccChunksTotal = $chunksTot; + $self->Warn('ICC_Profile chunk count is zero') if !$chunksTot; + } + if (defined $iccChunkCount) { + # save this chunk + if (defined $iccChunk[$chunkNum]) { + $self->Warn("Duplicate ICC_Profile chunk number $chunkNum"); + $iccChunk[$chunkNum] .= substr($$segDataPt, 14); + } else { + $iccChunk[$chunkNum] = substr($$segDataPt, 14); + } + # continue accumulating chunks unless we have all of them + next Marker unless ++$iccChunkCount >= $iccChunksTotal; + undef $iccChunkCount; # prevent reprocessing + $doneDir{ICC_Profile} = 1; + # combine the ICC_Profile chunks + my $icc_profile = ''; + defined $_ and $icc_profile .= $_ foreach @iccChunk; + undef @iccChunk; # free memory + $segDataPt = \$icc_profile; + $length = length $icc_profile; + my $tagTablePtr = GetTagTable('Image::ExifTool::ICC_Profile::Main'); + my %dirInfo = ( + DataPt => $segDataPt, + DataPos => $segPos + 14, + DataLen => $length, + DirStart => 0, + DirLen => $length, + Parent => $markerName, + ); + my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $newData) { + undef $$segDataPt; # free the old buffer + $segDataPt = \$newData; + } + length $$segDataPt or $del = 1, last; + # write as ICC multi-segment + WriteMultiSegment($outfile, $marker, "ICC_PROFILE\0", $segDataPt, 'ICC') or $err = 1; + undef $$segDataPt; + next Marker; + } elsif (defined $chunkNum) { + $self->WarnOnce('Invalid or extraneous ICC_Profile chunk(s)'); + # fall through to preserve this extra profile... + } + } elsif ($$segDataPt =~ /^FPXR\0/) { + $segType = 'FPXR'; + $$delGroup{FlashPix} and $del = 1; + } elsif ($$segDataPt =~ /^MPF\0/) { + $segType = 'MPF'; + $$delGroup{MPF} and $del = 1; + } + } elsif ($marker == 0xe3) { # APP3 (Kodak Meta) + if ($$segDataPt =~ /^(Meta|META|Exif)\0\0/) { + $segType = 'Kodak Meta'; + $$delGroup{Meta} and $del = 1, last; + $doneDir{Meta} and $self->Warn('Multiple APP3 Meta segments'); + $doneDir{Meta} = 1; + last unless $$editDirs{Meta}; + # rewrite Meta IFD as if this were a TIFF file in memory + my %dirInfo = ( + DataPt => $segDataPt, + DataPos => -6, # (remember: relative to Base!) + DirStart => 6, + Base => $segPos + 6, + Parent => $markerName, + DirName => 'Meta', + ); + # write new data to memory + my $tagTablePtr = GetTagTable('Image::ExifTool::Kodak::Meta'); + my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr, \&WriteTIFF); + if (defined $buff) { + # update segment with new data + $$segDataPt = substr($$segDataPt,0,6) . $buff; + } else { + last Marker unless $self->Options('IgnoreMinorErrors'); + } + # delete segment if IFD contains no entries + $del = 1 unless length($$segDataPt) > 6; + } + } elsif ($marker == 0xe5) { # APP5 (Ricoh RMETA) + if ($$segDataPt =~ /^RMETA\0/) { + $segType = 'Ricoh RMETA'; + $$delGroup{RMETA} and $del = 1; + } + } elsif ($marker == 0xec) { # APP12 (Ducky) + if ($$segDataPt =~ /^Ducky/) { + $segType = 'Ducky'; + $$delGroup{Ducky} and $del = 1, last; + $doneDir{Ducky} and $self->Warn('Multiple APP12 Ducky segments'); + $doneDir{Ducky} = 1; + last unless $$editDirs{Ducky}; + my $tagTablePtr = GetTagTable('Image::ExifTool::APP12::Ducky'); + my %dirInfo = ( + DataPt => $segDataPt, + DataPos => $segPos, + DataLen => $length, + DirStart => 5, # directory starts after identifier + DirLen => $length-5, + Parent => $markerName, + ); + my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $newData) { + undef $$segDataPt; # free the old buffer + # add header to new segment unless empty + $newData = 'Ducky' . $newData if length $newData; + $segDataPt = \$newData; + } + $del = 1 unless length $$segDataPt; + } + } elsif ($marker == 0xed) { # APP13 (Photoshop) + if ($$segDataPt =~ /^$psAPP13hdr/) { + $segType = 'Photoshop'; + # add this data to the combined data if it exists + if (defined $combinedSegData) { + $combinedSegData .= substr($$segDataPt,length($psAPP13hdr)); + $segDataPt = \$combinedSegData; + $length = length $combinedSegData; # update length + } + # peek ahead to see if the next segment is photoshop data too + if ($dirOrder[0] eq 'Photoshop') { + # initialize combined data if necessary + $combinedSegData = $$segDataPt unless defined $combinedSegData; + next Marker; # get the next segment to combine + } + if ($doneDir{Photoshop}) { + $self->Warn('Multiple Photoshop records'); + # only rewrite the first Photoshop segment when deleting this group + # (to remove multiples when deleting and adding back in one step) + $$delGroup{Photoshop} and $del = 1, last; + } + $doneDir{Photoshop} = 1; + # process APP13 Photoshop record + my $tagTablePtr = GetTagTable('Image::ExifTool::Photoshop::Main'); + my %dirInfo = ( + DataPt => $segDataPt, + DataPos => $segPos, + DataLen => $length, + DirStart => 14, # directory starts after identifier + DirLen => $length-14, + Parent => $markerName, + ); + my $newData = $self->WriteDirectory(\%dirInfo, $tagTablePtr); + if (defined $newData) { + undef $$segDataPt; # free the old buffer + $segDataPt = \$newData; + } + length $$segDataPt or $del = 1, last; + # write as multi-segment + WriteMultiSegment($outfile, $marker, $psAPP13hdr, $segDataPt) or $err = 1; + undef $combinedSegData; + undef $$segDataPt; + next Marker; + } + } elsif ($marker == 0xee) { # APP14 (Adobe) + if ($$segDataPt =~ /^Adobe/) { + $segType = 'Adobe'; + # delete it and replace it later if editing + if ($$delGroup{Adobe} or $$editDirs{Adobe}) { + $del = 1; + undef $doneDir{Adobe}; # so we can add it back again above + } + } + } elsif ($marker == 0xfe) { # COM (JPEG comment) + my $newComment; + unless ($doneDir{COM}) { + $doneDir{COM} = 1; + unless ($$delGroup{File} and $$delGroup{File} != 2) { + my $tagInfo = $Image::ExifTool::Extra{Comment}; + my $nvHash = $self->GetNewValueHash($tagInfo); + my $val = $segData; + $val =~ s/\0+$//; # allow for stupid software that adds NULL terminator + if ($self->IsOverwriting($nvHash, $val) or $$delGroup{File}) { + $newComment = $self->GetNewValue($nvHash); + } else { + delete $$editDirs{COM}; # we aren't editing COM after all + last; + } + } + } + $self->VerboseValue('- Comment', $$segDataPt); + if (defined $newComment) { + # write out the comments + $self->VerboseValue('+ Comment', $newComment); + WriteMultiSegment($outfile, 0xfe, '', \$newComment) or $err = 1; + } else { + $verbose and print $out " Deleting COM segment\n"; + } + ++$$self{CHANGED}; # increment the changed flag + undef $segDataPt; # don't write existing comment + } + last; # didn't want to loop anyway + } + + # delete necessary segments (including unknown segments if deleting all) + if ($del or ($$delGroup{'*'} and not $segType and $marker>=0xe0 and $marker<=0xef)) { + $segType = 'unknown' unless $segType; + $verbose and print $out " Deleting $markerName $segType segment\n"; + ++$$self{CHANGED}; + next Marker; + } + # write out this segment if $segDataPt is still defined + if (defined $segDataPt and defined $$segDataPt) { + # write the data for this record (the data could have been + # modified, so recalculate the length word) + my $size = length($$segDataPt); + if ($size > $maxSegmentLen) { + $segType or $segType = 'Unknown'; + $self->Error("$segType $markerName segment too large! ($size bytes)"); + $err = 1; + } else { + $s = pack('n', length($$segDataPt) + 2); + Write($outfile, $hdr, $s, $$segDataPt) or $err = 1; + } + undef $$segDataPt; # free the buffer + undef $segDataPt; + } + } + # make sure the ICC_Profile was complete + $self->Error('Incomplete ICC_Profile record', 1) if defined $iccChunkCount; + pop @$path if @$path > $pn; + # if oldOutfile is still set, there was an error copying the JPEG + $oldOutfile and return 0; + if ($rtnVal) { + # add any new trailers we are creating + my $trailPt = $self->AddNewTrailers(); + Write($outfile, $$trailPt) or $err = 1 if $trailPt; + } + # set return value to -1 if we only had a write error + $rtnVal = -1 if $rtnVal and $err; + if ($creatingEXV and $rtnVal > 0 and not $$self{CHANGED}) { + $self->Error('Nothing written'); + $rtnVal = -1; + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Validate an image for writing +# Inputs: 0) ExifTool object reference, 1) raw value reference +# Returns: error string or undef on success +sub CheckImage($$) +{ + my ($self, $valPtr) = @_; + if (length($$valPtr) and $$valPtr!~/^\xff\xd8/ and not + $self->Options('IgnoreMinorErrors')) + { + return '[Minor] Not a valid image'; + } + return undef; +} + +#------------------------------------------------------------------------------ +# check a value for validity +# Inputs: 0) value reference, 1) format string, 2) optional count +# Returns: error string, or undef on success +# Notes: May modify value (if a count is specified for a string, it is null-padded +# to the specified length, and floating point values are rounded to integer if required) +sub CheckValue($$;$) +{ + my ($valPtr, $format, $count) = @_; + my (@vals, $val, $n); + + if ($format eq 'string' or $format eq 'undef') { + return undef unless $count and $count > 0; + my $len = length($$valPtr); + if ($format eq 'string') { + $len >= $count and return 'String too long'; + } else { + $len > $count and return 'Data too long'; + } + if ($len < $count) { + $$valPtr .= "\0" x ($count - $len); + } + return undef; + } + if ($count and $count != 1) { + @vals = split(' ',$$valPtr); + $count < 0 and ($count = @vals or return undef); + } else { + $count = 1; + @vals = ( $$valPtr ); + } + if (@vals != $count) { + my $str = @vals > $count ? 'Too many' : 'Not enough'; + return "$str values specified ($count required)"; + } + for ($n=0; $n<$count; ++$n) { + $val = shift @vals; + if ($format =~ /^int/) { + # make sure the value is integer + unless (IsInt($val)) { + if (IsHex($val)) { + $val = $$valPtr = hex($val); + } else { + # round single floating point values to the nearest integer + return 'Not an integer' unless IsFloat($val) and $count == 1; + $val = $$valPtr = int($val + ($val < 0 ? -0.5 : 0.5)); + } + } + my $rng = $intRange{$format} or return "Bad int format: $format"; + return "Value below $format minimum" if $val < $$rng[0]; + # (allow 0xfeedfeed code as value for 16-bit pointers) + return "Value above $format maximum" if $val > $$rng[1] and $val != 0xfeedfeed; + } elsif ($format =~ /^rational/ or $format eq 'float' or $format eq 'double') { + # make sure the value is a valid floating point number + unless (IsFloat($val)) { + # allow 'inf', 'undef' and fractional rational values + if ($format =~ /^rational/) { + next if $val eq 'inf' or $val eq 'undef'; + if ($val =~ m{^([-+]?\d+)/(\d+)$}) { + next unless $1 < 0 and $format =~ /u$/; + return 'Must be an unsigned rational'; + } + } + return 'Not a floating point number'; + } + if ($format =~ /^rational\d+u$/ and $val < 0) { + return 'Must be a positive number'; + } + } + } + return undef; # success! +} + +#------------------------------------------------------------------------------ +# check new value for binary data block +# Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref +# Returns: error string or undef (and may modify value) on success +sub CheckBinaryData($$$) +{ + my ($self, $tagInfo, $valPtr) = @_; + my $format = $$tagInfo{Format}; + unless ($format) { + my $table = $$tagInfo{Table}; + if ($table and $$table{FORMAT}) { + $format = $$table{FORMAT}; + } else { + # use default 'int8u' unless specified + $format = 'int8u'; + } + } + my $count; + if ($format =~ /(.*)\[(.*)\]/) { + $format = $1; + $count = $2; + # can't evaluate $count now because we don't know $size yet + undef $count if $count =~ /\$size/; + } + return CheckValue($valPtr, $format, $count); +} + +#------------------------------------------------------------------------------ +# Rename a file (with patch for Windows Unicode file names, and other problem) +# Inputs: 0) ExifTool ref, 1) old name, 2) new name +# Returns: true on success +sub Rename($$$) +{ + my ($self, $old, $new) = @_; + my ($result, $try, $winUni); + + if ($self->EncodeFileName($old)) { + $self->EncodeFileName($new, 1); + $winUni = 1; + } elsif ($self->EncodeFileName($new)) { + $old = $_[1]; + $self->EncodeFileName($old, 1); + $winUni = 1; + } + for (;;) { + if ($winUni) { + $result = eval { Win32API::File::MoveFileExW($old, $new, + Win32API::File::MOVEFILE_REPLACE_EXISTING() | + Win32API::File::MOVEFILE_COPY_ALLOWED()) }; + } else { + $result = rename($old, $new); + } + last if $result or $^O ne 'MSWin32'; + # keep trying for up to 0.5 seconds + # (patch for Windows denial-of-service susceptibility) + $try = ($try || 1) + 1; + last if $try > 50; + select(undef,undef,undef,0.01); # sleep for 0.01 sec + } + return $result; +} + +#------------------------------------------------------------------------------ +# Delete a file (with patch for Windows Unicode file names) +# Inputs: 0) ExifTool ref, 1-N) names of files to delete +# Returns: number of files deleted +sub Unlink($@) +{ + my $self = shift; + my $result = 0; + while (@_) { + my $file = shift; + if ($self->EncodeFileName($file)) { + ++$result if eval { Win32API::File::DeleteFileW($file) }; + } else { + ++$result if unlink $file; + } + } + return $result; +} + +#------------------------------------------------------------------------------ +# Set file times (Unix seconds since the epoch) +# Inputs: 0) ExifTool ref, 1) file name or ref, 2) access time, 3) modification time, +# 4) inode change or creation time (or undef for any time to avoid setting) +# 5) flag to suppress warning +# Returns: 1 on success, 0 on error +my $k32SetFileTime; +sub SetFileTime($$;$$$$) +{ + my ($self, $file, $atime, $mtime, $ctime, $noWarn) = @_; + my $saveFile; + local *FH; + + # open file by name if necessary + unless (ref $file) { + # (file will be automatically closed when *FH goes out of scope) + unless ($self->Open(\*FH, $file, '+<')) { + my $success; + if (defined $atime or defined $mtime) { + my ($a, $m, $c) = $self->GetFileTime($file); + $atime = $a unless defined $atime; + $mtime = $m unless defined $mtime; + $success = eval { utime($atime, $mtime, $file) } if defined $atime and defined $mtime; + } + $self->Warn('Error opening file for update') unless $success; + return $success; + } + $saveFile = $file; + $file = \*FH; + } + # on Windows, try to work around incorrect file times when daylight saving time is in effect + if ($^O eq 'MSWin32') { + if (not eval { require Win32::API }) { + $self->WarnOnce('Install Win32::API for proper handling of Windows file times'); + } elsif (not eval { require Win32API::File }) { + $self->WarnOnce('Install Win32API::File for proper handling of Windows file times'); + } else { + # get Win32 handle, needed for SetFileTime + my $win32Handle = eval { Win32API::File::GetOsFHandle($file) }; + unless ($win32Handle) { + $self->Warn('Win32API::File::GetOsFHandle returned invalid handle'); + return 0; + } + # convert Unix seconds to FILETIME structs + my $time; + foreach $time ($atime, $mtime, $ctime) { + # set to NULL if not defined (i.e. do not change) + defined $time or $time = 0, next; + # convert to 100 ns intervals since 0:00 UTC Jan 1, 1601 + # (89 leap years between 1601 and 1970) + my $wt = ($time + (((1970-1601)*365+89)*24*3600)) * 1e7; + my $hi = int($wt / 4294967296); + $time = pack 'LL', int($wt - $hi * 4294967296), $hi; # pack FILETIME struct + } + unless ($k32SetFileTime) { + return 0 if defined $k32SetFileTime; + $k32SetFileTime = new Win32::API('KERNEL32', 'SetFileTime', 'NPPP', 'I'); + unless ($k32SetFileTime) { + $self->Warn('Error calling Win32::API::SetFileTime'); + $k32SetFileTime = 0; + return 0; + } + } + unless ($k32SetFileTime->Call($win32Handle, $ctime, $atime, $mtime)) { + $self->Warn('Win32::API::SetFileTime returned ' . Win32::GetLastError()); + return 0; + } + return 1; + } + } + # other OS (or Windows fallback) + if (defined $atime and defined $mtime) { + my $success; + local $SIG{'__WARN__'} = \&SetWarning; # (this may not be necessary) + for (;;) { + undef $evalWarning; + # (this may fail on the first try if futimes is not implemented) + $success = eval { utime($atime, $mtime, $file) }; + last if $success or not defined $saveFile; + close $file; + $file = $saveFile; + undef $saveFile; + } + unless ($noWarn) { + if ($@ or $evalWarning) { + $self->Warn(CleanWarning($@ || $evalWarning)); + } elsif (not $success) { + $self->Warn('Error setting file time'); + } + } + return $success; + } + return 1; # (nothing to do) +} + +#------------------------------------------------------------------------------ +# Copy data block from RAF to output file in max 64kB chunks +# Inputs: 0) RAF ref, 1) outfile ref, 2) block size +# Returns: 1 on success, 0 on read error, undef on write error +sub CopyBlock($$$) +{ + my ($raf, $outfile, $size) = @_; + my $buff; + for (;;) { + last unless $size > 0; + my $n = $size > 65536 ? 65536 : $size; + $raf->Read($buff, $n) == $n or return 0; + Write($outfile, $buff) or return undef; + $size -= $n; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Copy image data from one file to another +# Inputs: 0) ExifTool object reference +# 1) reference to list of image data [ position, size, pad bytes ] +# 2) output file ref +# Returns: true on success +sub CopyImageData($$$) +{ + my ($self, $imageDataBlocks, $outfile) = @_; + my $raf = $$self{RAF}; + my ($dataBlock, $err); + my $num = @$imageDataBlocks; + $self->VPrint(0, " Copying $num image data blocks\n") if $num; + foreach $dataBlock (@$imageDataBlocks) { + my ($pos, $size, $pad) = @$dataBlock; + $raf->Seek($pos, 0) or $err = 'read', last; + my $result = CopyBlock($raf, $outfile, $size); + $result or $err = defined $result ? 'read' : 'writ'; + # pad if necessary + Write($outfile, "\0" x $pad) or $err = 'writ' if $pad; + last if $err; + } + if ($err) { + $self->Error("Error ${err}ing image data"); + return 0; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Write to binary data block +# Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref +# Returns: Binary data block or undefined on error +sub WriteBinaryData($$$) +{ + my ($self, $dirInfo, $tagTablePtr) = @_; + $self or return 1; # allow dummy access to autoload this package + + # get default format ('int8u' unless specified) + my $dataPt = $$dirInfo{DataPt} or return undef; + my $defaultFormat = $$tagTablePtr{FORMAT} || 'int8u'; + my $increment = FormatSize($defaultFormat); + unless ($increment) { + warn "Unknown format $defaultFormat\n"; + return undef; + } + # extract data members first if necessary + my @varOffsets; + if ($$tagTablePtr{DATAMEMBER}) { + $$dirInfo{DataMember} = $$tagTablePtr{DATAMEMBER}; + $$dirInfo{VarFormatData} = \@varOffsets; + $self->ProcessBinaryData($dirInfo, $tagTablePtr); + delete $$dirInfo{DataMember}; + delete $$dirInfo{VarFormatData}; + } + my $dirStart = $$dirInfo{DirStart} || 0; + my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $dirStart; + my $newData = substr($$dataPt, $dirStart, $dirLen) or return undef; + my $dirName = $$dirInfo{DirName}; + my $varSize = 0; + my @varInfo = @varOffsets; + my $tagInfo; + $dataPt = \$newData; + foreach $tagInfo (sort { $$a{TagID} <=> $$b{TagID} } $self->GetNewTagInfoList($tagTablePtr)) { + my $tagID = $$tagInfo{TagID}; + # evaluate conditional tags now if necessary + if (ref $$tagTablePtr{$tagID} eq 'ARRAY' or $$tagInfo{Condition}) { + my $writeInfo = $self->GetTagInfo($tagTablePtr, $tagID); + next unless $writeInfo and $writeInfo eq $tagInfo; + } + # add offsets for variable-sized tags if necessary + while (@varInfo and $varInfo[0][0] < $tagID) { + $varSize = $varInfo[0][1]; # get accumulated variable size + shift @varInfo; + } + my $count = 1; + my $format = $$tagInfo{Format}; + my $entry = int($tagID) * $increment + $varSize; # relative offset of this entry + if ($format) { + if ($format =~ /(.*)\[(.*)\]/) { + $format = $1; + $count = $2; + my $size = $dirLen; # used in eval + # evaluate count to allow count to be based on previous values + #### eval Format size ($size, $self) - NOTE: %val not supported for writing + $count = eval $count; + $@ and warn($@), next; + } elsif ($format eq 'string') { + # string with no specified count runs to end of block + $count = ($dirLen > $entry) ? $dirLen - $entry : 0; + } + } else { + $format = $defaultFormat; + } + # read/write using variable format if changed in Hook + $format = $varInfo[0][2] if @varInfo and $varInfo[0][0] == $tagID; + my $val = ReadValue($dataPt, $entry, $format, $count, $dirLen-$entry); + next unless defined $val; + my $nvHash = $self->GetNewValueHash($tagInfo, $$self{CUR_WRITE_GROUP}); + next unless $self->IsOverwriting($nvHash, $val) > 0; + my $newVal = $self->GetNewValue($nvHash); + next unless defined $newVal; # can't delete from a binary table + # update DataMember with new value if necessary + $$self{$$tagInfo{DataMember}} = $newVal if $$tagInfo{DataMember}; + # only write masked bits if specified + my $mask = $$tagInfo{Mask}; + $newVal = (($newVal << $$tagInfo{BitShift}) & $mask) | ($val & ~$mask) if $mask; + # set the size + if ($$tagInfo{DataTag} and not $$tagInfo{IsOffset}) { + warn 'Internal error' unless $newVal == 0xfeedfeed; + my $data = $self->GetNewValue($$tagInfo{DataTag}); + $newVal = length($data) if defined $data; + my $format = $$tagInfo{Format} || $$tagTablePtr{FORMAT} || 'int32u'; + if ($format =~ /^int16/ and $newVal > 0xffff) { + $self->Error("$$tagInfo{DataTag} is too large (64 kB max. for this file)"); + } + } + my $rtnVal = WriteValue($newVal, $format, $count, $dataPt, $entry); + if (defined $rtnVal) { + $self->VerboseValue("- $dirName:$$tagInfo{Name}", $val); + $self->VerboseValue("+ $dirName:$$tagInfo{Name}", $newVal); + ++$$self{CHANGED}; + } + } + # add necessary fixups for any offsets + if ($$tagTablePtr{IS_OFFSET} and $$dirInfo{Fixup}) { + $varSize = 0; + @varInfo = @varOffsets; + my $fixup = $$dirInfo{Fixup}; + my $tagID; + foreach $tagID (@{$$tagTablePtr{IS_OFFSET}}) { + $tagInfo = $self->GetTagInfo($tagTablePtr, $tagID) or next; + while (@varInfo and $varInfo[0][0] < $tagID) { + $varSize = $varInfo[0][1]; + shift @varInfo; + } + my $entry = $tagID * $increment + $varSize; # (no offset to dirStart for new dir data) + next unless $entry <= $dirLen - 4; + # (Ricoh has 16-bit preview image offsets, so can't just assume int32u) + my $format = $$tagInfo{Format} || $$tagTablePtr{FORMAT} || 'int32u'; + my $offset = ReadValue($dataPt, $entry, $format, 1, $dirLen-$entry); + # ignore if offset is zero (eg. Ricoh DNG uses this to indicate no preview) + next unless $offset; + $fixup->AddFixup($entry, $$tagInfo{DataTag}, $format); + # handle the preview image now if this is a JPEG file + next unless $$self{FILE_TYPE} eq 'JPEG' and $$tagInfo{DataTag} and + $$tagInfo{DataTag} eq 'PreviewImage' and defined $$tagInfo{OffsetPair}; + # NOTE: here we assume there are no var-sized tags between the + # OffsetPair tags. If this ever becomes possible we must recalculate + # $varSize for the OffsetPair tag here! + $entry = $$tagInfo{OffsetPair} * $increment + $varSize; + my $size = ReadValue($dataPt, $entry, $format, 1, $dirLen-$entry); + my $previewInfo = $$self{PREVIEW_INFO}; + $previewInfo or $previewInfo = $$self{PREVIEW_INFO} = { + Fixup => new Image::ExifTool::Fixup, + }; + # set flag indicating we are using short pointers + $$previewInfo{IsShort} = 1 unless $format eq 'int32u'; + $$previewInfo{Absolute} = 1 if $$tagInfo{IsOffset} and $$tagInfo{IsOffset} eq '3'; + # get the value of the Composite::PreviewImage tag + $$previewInfo{Data} = $self->GetNewValue(GetCompositeTagInfo('PreviewImage')); + unless (defined $$previewInfo{Data}) { + if ($offset >= 0 and $offset + $size <= $$dirInfo{DataLen}) { + $$previewInfo{Data} = substr(${$$dirInfo{DataPt}},$offset,$size); + } else { + $$previewInfo{Data} = 'LOAD_PREVIEW'; # flag to load preview later + } + } + } + } + # write any necessary SubDirectories + if ($$tagTablePtr{IS_SUBDIR}) { + $varSize = 0; + @varInfo = @varOffsets; + my $tagID; + foreach $tagID (@{$$tagTablePtr{IS_SUBDIR}}) { + my $tagInfo = $self->GetTagInfo($tagTablePtr, $tagID); + next unless defined $tagInfo; + while (@varInfo and $varInfo[0][0] < $tagID) { + $varSize = $varInfo[0][1]; + shift @varInfo; + } + my $entry = int($tagID) * $increment + $varSize; + last if $entry >= $dirLen; + # get value for Condition if necessary + unless ($tagInfo) { + my $more = $dirLen - $entry; + $more = 128 if $more > 128; + my $v = substr($newData, $entry, $more); + $tagInfo = $self->GetTagInfo($tagTablePtr, $tagID, \$v); + next unless $tagInfo; + } + next unless $$tagInfo{SubDirectory}; # (just to be safe) + my %subdirInfo = ( DataPt => \$newData, DirStart => $entry ); + my $subTablePtr = GetTagTable($$tagInfo{SubDirectory}{TagTable}); + my $dat = $self->WriteDirectory(\%subdirInfo, $subTablePtr); + substr($newData, $entry) = $dat if defined $dat and length $dat; + } + } + return $newData; +} + +#------------------------------------------------------------------------------ +# Write TIFF as a directory +# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref +# Returns: New directory data or undefined on error +sub WriteTIFF($$$) +{ + my ($self, $dirInfo, $tagTablePtr) = @_; + $self or return 1; # allow dummy access + my $buff = ''; + $$dirInfo{OutFile} = \$buff; + return $buff if $self->ProcessTIFF($dirInfo, $tagTablePtr) > 0; + return undef; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::Writer.pl - ExifTool routines for writing meta information + +=head1 SYNOPSIS + +These routines are autoloaded by Image::ExifTool when required. + +=head1 DESCRIPTION + +This module contains ExifTool write routines and other infrequently +used routines. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/XMP.pm b/lib/Image/ExifTool/XMP.pm new file mode 100644 index 0000000..bd25898 --- /dev/null +++ b/lib/Image/ExifTool/XMP.pm @@ -0,0 +1,4398 @@ +#------------------------------------------------------------------------------ +# File: XMP.pm +# +# Description: Read XMP meta information +# +# Revisions: 11/25/2003 - P. Harvey Created +# 10/28/2004 - P. Harvey Major overhaul to conform with XMP spec +# 02/27/2005 - P. Harvey Also read UTF-16 and UTF-32 XMP +# 08/30/2005 - P. Harvey Split tag tables into separate namespaces +# 10/24/2005 - P. Harvey Added ability to parse .XMP files +# 08/25/2006 - P. Harvey Added ability to handle blank nodes +# 08/22/2007 - P. Harvey Added ability to handle alternate language tags +# 09/26/2008 - P. Harvey Added Iptc4xmpExt tags (version 1.0 rev 2) +# +# References: 1) http://www.adobe.com/products/xmp/pdfs/xmpspec.pdf +# 2) http://www.w3.org/TR/rdf-syntax-grammar/ (20040210) +# 3) http://www.portfoliofaq.com/pfaq/v7mappings.htm +# 4) http://www.iptc.org/IPTC4XMP/ +# 5) http://creativecommons.org/technology/xmp +# --> changed to http://wiki.creativecommons.org/Companion_File_metadata_specification (2007/12/21) +# 6) http://www.optimasc.com/products/fileid/xmp-extensions.pdf +# 7) Lou Salkind private communication +# 8) http://partners.adobe.com/public/developer/en/xmp/sdk/XMPspecification.pdf +# 9) http://www.w3.org/TR/SVG11/ +# 10) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf (Oct 2008) +# 11) http://www.extensis.com/en/support/kb_article.jsp?articleNumber=6102211 +# 12) http://www.cipa.jp/std/documents/e/DC-010-2012_E.pdf +# 13) http://www.cipa.jp/std/documents/e/DC-010-2017_E.pdf (changed to +# http://www.cipa.jp/std/documents/e/DC-X010-2017.pdf) +# +# Notes: - Property qualifiers are handled as if they were separate +# properties (with no associated namespace). +# +# - Currently, there is no special treatment of the following +# properties which could potentially affect the extracted +# information: xml:base, rdf:parseType (note that parseType +# Literal isn't allowed by the XMP spec). +# +# - The family 2 group names will be set to 'Unknown' for any XMP +# tags not found in the XMP or Exif tag tables. +#------------------------------------------------------------------------------ + +package Image::ExifTool::XMP; + +use strict; +use vars qw($VERSION $AUTOLOAD @ISA @EXPORT_OK %stdXlatNS %nsURI %latConv %longConv + %dateTimeInfo %xmpTableDefaults %specialStruct %sDimensions %sArea %sColorant); +use Image::ExifTool qw(:Utils); +use Image::ExifTool::Exif; +use Image::ExifTool::GPS; +require Exporter; + +$VERSION = '3.51'; +@ISA = qw(Exporter); +@EXPORT_OK = qw(EscapeXML UnescapeXML); + +sub ProcessXMP($$;$); +sub WriteXMP($$;$); +sub CheckXMP($$$;$); +sub ParseXMPElement($$$;$$$$); +sub DecodeBase64($); +sub EncodeBase64($;$); +sub SaveBlankInfo($$$;$); +sub ProcessBlankInfo($$$;$); +sub ValidateXMP($;$); +sub ValidateProperty($$;$); +sub UnescapeChar($$;$); +sub AddFlattenedTags($;$$); +sub FormatXMPDate($); +sub ConvertRational($); +sub ConvertRationalList($); +sub WriteGSpherical($$$); + +# standard path locations for XMP in major file types +my %stdPath = ( + JPEG => 'JPEG-APP1-XMP', + TIFF => 'TIFF-IFD0-XMP', + PSD => 'PSD-XMP', +); + +# lookup for translating to ExifTool namespaces (and family 1 group names) +%stdXlatNS = ( + # shorten ugly namespace prefixes + 'Iptc4xmpCore' => 'iptcCore', + 'Iptc4xmpExt' => 'iptcExt', + 'photomechanic'=> 'photomech', + 'MicrosoftPhoto' => 'microsoft', + 'prismusagerights' => 'pur', + 'GettyImagesGIFT' => 'getty', +); + +# translate ExifTool XMP family 1 group names back to standard XMP namespace prefixes +my %xmpNS = ( + 'iptcCore' => 'Iptc4xmpCore', + 'iptcExt' => 'Iptc4xmpExt', + 'photomech'=> 'photomechanic', + 'microsoft' => 'MicrosoftPhoto', + 'getty' => 'GettyImagesGIFT', + # (prism changed their spec to now use 'pur') + # 'pur' => 'prismusagerights', +); + +# Lookup to translate standard XMP namespace prefixes into URI's. This list +# need not be complete, but it must contain an entry for each namespace prefix +# (NAMESPACE) for writable tags in the XMP tables or in structures that doesn't +# define a URI. Also, the namespace must be defined here for non-standard +# namespace prefixes to be recognized. +%nsURI = ( + aux => 'http://ns.adobe.com/exif/1.0/aux/', + album => 'http://ns.adobe.com/album/1.0/', + cc => 'http://creativecommons.org/ns#', # changed 2007/12/21 - PH + crd => 'http://ns.adobe.com/camera-raw-defaults/1.0/', + crs => 'http://ns.adobe.com/camera-raw-settings/1.0/', + crss => 'http://ns.adobe.com/camera-raw-saved-settings/1.0/', + dc => 'http://purl.org/dc/elements/1.1/', + exif => 'http://ns.adobe.com/exif/1.0/', + exifEX => 'http://cipa.jp/exif/1.0/', + iX => 'http://ns.adobe.com/iX/1.0/', + pdf => 'http://ns.adobe.com/pdf/1.3/', + pdfx => 'http://ns.adobe.com/pdfx/1.3/', + photoshop => 'http://ns.adobe.com/photoshop/1.0/', + rdf => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', + rdfs => 'http://www.w3.org/2000/01/rdf-schema#', + stDim => 'http://ns.adobe.com/xap/1.0/sType/Dimensions#', + stEvt => 'http://ns.adobe.com/xap/1.0/sType/ResourceEvent#', + stFnt => 'http://ns.adobe.com/xap/1.0/sType/Font#', + stJob => 'http://ns.adobe.com/xap/1.0/sType/Job#', + stRef => 'http://ns.adobe.com/xap/1.0/sType/ResourceRef#', + stVer => 'http://ns.adobe.com/xap/1.0/sType/Version#', + stMfs => 'http://ns.adobe.com/xap/1.0/sType/ManifestItem#', + tiff => 'http://ns.adobe.com/tiff/1.0/', + 'x' => 'adobe:ns:meta/', + xmpG => 'http://ns.adobe.com/xap/1.0/g/', + xmpGImg => 'http://ns.adobe.com/xap/1.0/g/img/', + xmp => 'http://ns.adobe.com/xap/1.0/', + xmpBJ => 'http://ns.adobe.com/xap/1.0/bj/', + xmpDM => 'http://ns.adobe.com/xmp/1.0/DynamicMedia/', + xmpMM => 'http://ns.adobe.com/xap/1.0/mm/', + xmpRights => 'http://ns.adobe.com/xap/1.0/rights/', + xmpNote => 'http://ns.adobe.com/xmp/note/', + xmpTPg => 'http://ns.adobe.com/xap/1.0/t/pg/', + xmpidq => 'http://ns.adobe.com/xmp/Identifier/qual/1.0/', + xmpPLUS => 'http://ns.adobe.com/xap/1.0/PLUS/', + dex => 'http://ns.optimasc.com/dex/1.0/', + mediapro => 'http://ns.iview-multimedia.com/mediapro/1.0/', + expressionmedia => 'http://ns.microsoft.com/expressionmedia/1.0/', + Iptc4xmpCore => 'http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/', + Iptc4xmpExt => 'http://iptc.org/std/Iptc4xmpExt/2008-02-29/', + MicrosoftPhoto => 'http://ns.microsoft.com/photo/1.0', + MP1 => 'http://ns.microsoft.com/photo/1.1', #PH (MP1 is fabricated) + MP => 'http://ns.microsoft.com/photo/1.2/', + MPRI => 'http://ns.microsoft.com/photo/1.2/t/RegionInfo#', + MPReg => 'http://ns.microsoft.com/photo/1.2/t/Region#', + lr => 'http://ns.adobe.com/lightroom/1.0/', + DICOM => 'http://ns.adobe.com/DICOM/', + 'drone-dji'=> 'http://www.dji.com/drone-dji/1.0/', + svg => 'http://www.w3.org/2000/svg', + et => 'http://ns.exiftool.org/1.0/', +# +# namespaces defined in XMP2.pl: +# + plus => 'http://ns.useplus.org/ldf/xmp/1.0/', + # (prism recommendations from http://www.prismstandard.org/specifications/3.0/Image_Guide_3.0.htm) + prism => 'http://prismstandard.org/namespaces/basic/2.0/', + prl => 'http://prismstandard.org/namespaces/prl/2.1/', + pur => 'http://prismstandard.org/namespaces/prismusagerights/2.1/', + pmi => 'http://prismstandard.org/namespaces/pmi/2.2/', + prm => 'http://prismstandard.org/namespaces/prm/3.0/', + acdsee => 'http://ns.acdsee.com/iptc/1.0/', + digiKam => 'http://www.digikam.org/ns/1.0/', + swf => 'http://ns.adobe.com/swf/1.0/', + cell => 'http://developer.sonyericsson.com/cell/1.0/', + aas => 'http://ns.apple.com/adjustment-settings/1.0/', + 'mwg-rs' => 'http://www.metadataworkinggroup.com/schemas/regions/', + 'mwg-kw' => 'http://www.metadataworkinggroup.com/schemas/keywords/', + 'mwg-coll' => 'http://www.metadataworkinggroup.com/schemas/collections/', + stArea => 'http://ns.adobe.com/xmp/sType/Area#', + extensis => 'http://ns.extensis.com/extensis/1.0/', + ics => 'http://ns.idimager.com/ics/1.0/', + fpv => 'http://ns.fastpictureviewer.com/fpv/1.0/', + creatorAtom=>'http://ns.adobe.com/creatorAtom/1.0/', + 'apple-fi' => 'http://ns.apple.com/faceinfo/1.0/', + GAudio => 'http://ns.google.com/photos/1.0/audio/', + GImage => 'http://ns.google.com/photos/1.0/image/', + GPano => 'http://ns.google.com/photos/1.0/panorama/', + GSpherical=> 'http://ns.google.com/videos/1.0/spherical/', + GDepth => 'http://ns.google.com/photos/1.0/depthmap/', + GFocus => 'http://ns.google.com/photos/1.0/focus/', + GCamera => 'http://ns.google.com/photos/1.0/camera/', + GCreations=> 'http://ns.google.com/photos/1.0/creations/', + dwc => 'http://rs.tdwg.org/dwc/index.htm', + GettyImagesGIFT => 'http://xmp.gettyimages.com/gift/1.0/', + LImage => 'http://ns.leiainc.com/photos/1.0/image/', + Profile => 'http://ns.google.com/photos/dd/1.0/profile/', + sdc => 'http://ns.nikon.com/sdc/1.0/', + ast => 'http://ns.nikon.com/asteroid/1.0/', + nine => 'http://ns.nikon.com/nine/1.0/', +); + +# build reverse namespace lookup +my %uri2ns = ( 'http://ns.exiftool.ca/1.0/' => 'et' ); # (allow exiftool.ca as well as exiftool.org) +{ + my $ns; + foreach $ns (keys %nsURI) { + $uri2ns{$nsURI{$ns}} = $ns; + } +} + +# conversions for GPS coordinates +%latConv = ( + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)', + ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 2, "N")', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")', +); +%longConv = ( + ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)', + ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 2, "E")', + PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")', + PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")', +); +%dateTimeInfo = ( + # NOTE: Do NOT put "Groups" here because Groups hash must not be common! + Writable => 'date', + Shift => 'Time', + Validate => 'ValidateXMPDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', +); + +# this conversion allows alternate language support for designated boolean tags +my %boolConv = ( + PrintConv => { + OTHER => sub { # (inverse conversion is the same) + my $val = shift; + return 'False' if lc $val eq 'false'; + return 'True' if lc $val eq 'true'; + return $val; + }, + True => 'True', + False => 'False', + }, +); + +# XMP namespaces which we don't want to contribute to generated EXIF tag names +# (Note: namespaces with non-standard prefixes aren't currently ignored) +my %ignoreNamespace = ( 'x'=>1, rdf=>1, xmlns=>1, xml=>1, svg=>1, et=>1, office=>1 ); + +# XMP properties to ignore (set dynamically via dirInfo IgnoreProp) +my %ignoreProp; + +# these are the attributes that we handle for properties that contain +# sub-properties. Attributes for simple properties are easy, and we +# just copy them over. These are harder since we don't store attributes +# for properties without simple values. (maybe this will change...) +# (special attributes are indicated by a list reference of tag information) +my %recognizedAttrs = ( + 'rdf:about' => [ 'Image::ExifTool::XMP::rdf', 'about', 'About' ], + 'x:xmptk' => [ 'Image::ExifTool::XMP::x', 'xmptk', 'XMPToolkit' ], + 'x:xaptk' => [ 'Image::ExifTool::XMP::x', 'xmptk', 'XMPToolkit' ], + 'rdf:parseType' => 1, + 'rdf:nodeID' => 1, + 'et:toolkit' => 1, + 'rdf:xmlns' => 1, # this is presumably the default namespace, which we currently ignore + 'lastUpdate' => [ 'Image::ExifTool::XMP::XML', 'lastUpdate', 'LastUpdate' ], # found in XML from Sony ILCE-7S MP4 +); + +# special tags in structures below +# NOTE: this lookup is duplicated in TagLookup.pm!! +%specialStruct = ( + STRUCT_NAME => 1, # [optional] name of structure + NAMESPACE => 1, # [mandatory] namespace prefix used for fields of this structure + NOTES => 1, # [optional] notes for documentation about this structure + TYPE => 1, # [optional] rdf:type resource for struct (if used, the StructType flag + # will be set automatically for all derived flattened tags when writing) + GROUPS => 1, # [optional] specifies family group 2 name for the structure +); +# XMP structures (each structure is similar to a tag table so we can +# recurse through them in SetPropertyPath() as if they were tag tables) +# The main differences between structure field information and tagInfo hashes are: +# 1) Field information hashes do not contain Name, Groups or Table entries, and +# 2) The TagID entry is optional, and is used only if the key in the structure hash +# is different from the TagID (currently only true for alternate language fields) +# 3) Field information hashes support a additional "Namespace" property. +my %sResourceRef = ( + STRUCT_NAME => 'ResourceRef', + NAMESPACE => 'stRef', + documentID => { }, + instanceID => { }, + manager => { }, + managerVariant => { }, + manageTo => { }, + manageUI => { }, + renditionClass => { }, + renditionParams => { }, + versionID => { }, + # added Oct 2008 + alternatePaths => { List => 'Seq' }, + filePath => { }, + fromPart => { }, + lastModifyDate => { %dateTimeInfo, Groups => { 2 => 'Time' } }, + maskMarkers => { PrintConv => { All => 'All', None => 'None' } }, + partMapping => { }, + toPart => { }, + # added May 2010 + originalDocumentID => { }, # (undocumented property written by Adobe InDesign) + # added Aug 2016 (INDD again) + lastURL => { }, + linkForm => { }, + linkCategory => { }, + placedXResolution => { }, + placedYResolution => { }, + placedResolutionUnit => { }, +); +my %sResourceEvent = ( + STRUCT_NAME => 'ResourceEvent', + NAMESPACE => 'stEvt', + action => { }, + instanceID => { }, + parameters => { }, + softwareAgent => { }, + when => { %dateTimeInfo, Groups => { 2 => 'Time' } }, + # added Oct 2008 + changed => { }, +); +my %sJobRef = ( + STRUCT_NAME => 'JobRef', + NAMESPACE => 'stJob', + id => { }, + name => { }, + url => { }, +); +my %sVersion = ( + STRUCT_NAME => 'Version', + NAMESPACE => 'stVer', + comments => { }, + event => { Struct => \%sResourceEvent }, + modifier => { }, + modifyDate => { %dateTimeInfo, Groups => { 2 => 'Time' } }, + version => { }, +); +my %sThumbnail = ( + STRUCT_NAME => 'Thumbnail', + NAMESPACE => 'xmpGImg', + height => { Writable => 'integer' }, + width => { Writable => 'integer' }, + 'format' => { }, + image => { + Avoid => 1, + Groups => { 2 => 'Preview' }, + ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)', + ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)', + }, +); +my %sPageInfo = ( + STRUCT_NAME => 'PageInfo', + NAMESPACE => 'xmpGImg', + PageNumber => { Writable => 'integer', Namespace => 'xmpTPg' }, # override default namespace + height => { Writable => 'integer' }, + width => { Writable => 'integer' }, + 'format' => { }, + image => { + Groups => { 2 => 'Preview' }, + ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)', + ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)', + }, +); +#my %sIdentifierScheme = ( +# NAMESPACE => 'xmpidq', +# Scheme => { }, # qualifier for xmp:Identifier only +#); +%sDimensions = ( + STRUCT_NAME => 'Dimensions', + NAMESPACE => 'stDim', + w => { Writable => 'real' }, + h => { Writable => 'real' }, + unit => { }, +); +%sArea = ( + STRUCT_NAME => 'Area', + NAMESPACE => 'stArea', + 'x' => { Writable => 'real' }, + 'y' => { Writable => 'real' }, + w => { Writable => 'real' }, + h => { Writable => 'real' }, + d => { Writable => 'real' }, + unit => { }, +); +%sColorant = ( + STRUCT_NAME => 'Colorant', + NAMESPACE => 'xmpG', + swatchName => { }, + mode => { PrintConv => { CMYK=>'CMYK', RGB=>'RGB', LAB=>'Lab' } }, + # note: do not implement closed choice for "type" because Adobe can't + # get the case right: spec. says "PROCESS" but Indesign writes "Process" + type => { }, + cyan => { Writable => 'real' }, + magenta => { Writable => 'real' }, + yellow => { Writable => 'real' }, + black => { Writable => 'real' }, + red => { Writable => 'integer' }, + green => { Writable => 'integer' }, + blue => { Writable => 'integer' }, + gray => { Writable => 'integer' }, + L => { Writable => 'real' }, + A => { Writable => 'integer' }, + B => { Writable => 'integer' }, + # 'tint' observed in INDD sample - PH + tint => { Writable => 'integer', Notes => 'not part of 2010 XMP specification' }, +); +my %sSwatchGroup = ( + STRUCT_NAME => 'SwatchGroup', + NAMESPACE => 'xmpG', + groupName => { }, + groupType => { Writable => 'integer' }, + Colorants => { + FlatName => 'SwatchColorant', + Struct => \%sColorant, + List => 'Seq', + }, +); +my %sFont = ( + STRUCT_NAME => 'Font', + NAMESPACE => 'stFnt', + fontName => { }, + fontFamily => { }, + fontFace => { }, + fontType => { }, + versionString => { }, + composite => { Writable => 'boolean' }, + fontFileName=> { }, + childFontFiles => { List => 'Seq' }, +); +my %sOECF = ( + STRUCT_NAME => 'OECF', + NAMESPACE => 'exif', + Columns => { Writable => 'integer' }, + Rows => { Writable => 'integer' }, + Names => { List => 'Seq' }, + Values => { List => 'Seq', Writable => 'rational' }, +); +my %sAreaModels = ( + STRUCT_NAME => 'AreaModels', + NAMESPACE => 'crs', + ColorRangeMaskAreaSampleInfo => { FlatName => 'ColorSampleInfo' }, + AreaComponents => { FlatName => 'Components', List => 'Seq' }, +); +my %sCorrRangeMask = ( + STRUCT_NAME => 'CorrRangeMask', + NAMESPACE => 'crs', + NOTES => 'Called CorrectionRangeMask by the spec.', + Version => { }, + Type => { }, + ColorAmount => { Writable => 'real' }, + LumMin => { Writable => 'real' }, + LumMax => { Writable => 'real' }, + LumFeather => { Writable => 'real' }, + DepthMin => { Writable => 'real' }, + DepthMax => { Writable => 'real' }, + DepthFeather=> { Writable => 'real' }, + # new in LR 11.0 + Invert => { Writable => 'boolean' }, + SampleType => { Writable => 'integer' }, + AreaModels => { + List => 'Seq', + Struct => \%sAreaModels, + }, + LumRange => { }, + LuminanceDepthSampleInfo => { }, +); +# new LR2 crs structures (PH) +my %sCorrectionMask; +%sCorrectionMask = ( + STRUCT_NAME => 'CorrectionMask', + NAMESPACE => 'crs', + # disable List behaviour of flattened Gradient/PaintBasedCorrections + # because these are nested in lists and the flattened tags can't + # do justice to this complex structure + What => { List => 0 }, + MaskValue => { Writable => 'real', List => 0, FlatName => 'Value' }, + Radius => { Writable => 'real', List => 0 }, + Flow => { Writable => 'real', List => 0 }, + CenterWeight => { Writable => 'real', List => 0 }, + Dabs => { List => 'Seq' }, + ZeroX => { Writable => 'real', List => 0 }, + ZeroY => { Writable => 'real', List => 0 }, + FullX => { Writable => 'real', List => 0 }, + FullY => { Writable => 'real', List => 0 }, + # new elements used in CircularGradientBasedCorrections CorrectionMasks + # and RetouchAreas Masks + Top => { Writable => 'real', List => 0 }, + Left => { Writable => 'real', List => 0 }, + Bottom => { Writable => 'real', List => 0 }, + Right => { Writable => 'real', List => 0 }, + Angle => { Writable => 'real', List => 0 }, + Midpoint => { Writable => 'real', List => 0 }, + Roundness => { Writable => 'real', List => 0 }, + Feather => { Writable => 'real', List => 0 }, + Flipped => { Writable => 'boolean', List => 0 }, + Version => { Writable => 'integer', List => 0 }, + SizeX => { Writable => 'real', List => 0 }, + SizeY => { Writable => 'real', List => 0 }, + X => { Writable => 'real', List => 0 }, + Y => { Writable => 'real', List => 0 }, + Alpha => { Writable => 'real', List => 0 }, + CenterValue => { Writable => 'real', List => 0 }, + PerimeterValue=>{ Writable => 'real', List => 0 }, + # new in LR 11.0 MaskGroupBasedCorrections + MaskActive => { Writable => 'boolean', List => 0 }, + MaskName => { List => 0 }, + MaskBlendMode=> { Writable => 'integer', List => 0 }, + MaskInverted => { Writable => 'boolean', List => 0 }, + MaskSyncID => { List => 0 }, + MaskVersion => { List => 0 }, + MaskSubType => { List => 0 }, + ReferencePoint => { List => 0 }, + InputDigest => { List => 0 }, + MaskDigest => { List => 0 }, + WholeImageArea => { List => 0 }, + Origin => { List => 0 }, + Masks => { Struct => \%sCorrectionMask, NoSubStruct => 1 }, + CorrectionRangeMask => { + Name => 'CorrRangeMask', + Notes => 'called CorrectionRangeMask by the spec', + FlatName => 'Range', + Struct => \%sCorrRangeMask, + }, +); +my %sCorrection = ( + STRUCT_NAME => 'Correction', + NAMESPACE => 'crs', + What => { List => 0 }, + CorrectionAmount => { FlatName => 'Amount', Writable => 'real', List => 0 }, + CorrectionActive => { FlatName => 'Active', Writable => 'boolean', List => 0 }, + LocalExposure => { FlatName => 'Exposure', Writable => 'real', List => 0 }, + LocalSaturation => { FlatName => 'Saturation', Writable => 'real', List => 0 }, + LocalContrast => { FlatName => 'Contrast', Writable => 'real', List => 0 }, + LocalClarity => { FlatName => 'Clarity', Writable => 'real', List => 0 }, + LocalSharpness => { FlatName => 'Sharpness', Writable => 'real', List => 0 }, + LocalBrightness => { FlatName => 'Brightness', Writable => 'real', List => 0 }, + LocalToningHue => { FlatName => 'ToningHue', Writable => 'real', List => 0 }, + LocalToningSaturation => { FlatName => 'ToningSaturation', Writable => 'real', List => 0 }, + LocalExposure2012 => { FlatName => 'Exposure2012', Writable => 'real', List => 0 }, + LocalContrast2012 => { FlatName => 'Contrast2012', Writable => 'real', List => 0 }, + LocalHighlights2012 => { FlatName => 'Highlights2012', Writable => 'real', List => 0 }, + LocalShadows2012 => { FlatName => 'Shadows2012', Writable => 'real', List => 0 }, + LocalClarity2012 => { FlatName => 'Clarity2012', Writable => 'real', List => 0 }, + LocalLuminanceNoise => { FlatName => 'LuminanceNoise', Writable => 'real', List => 0 }, + LocalMoire => { FlatName => 'Moire', Writable => 'real', List => 0 }, + LocalDefringe => { FlatName => 'Defringe', Writable => 'real', List => 0 }, + LocalTemperature => { FlatName => 'Temperature',Writable => 'real', List => 0 }, + LocalTint => { FlatName => 'Tint', Writable => 'real', List => 0 }, + LocalHue => { FlatName => 'Hue', Writable => 'real', List => 0 }, + LocalWhites2012 => { FlatName => 'Whites2012', Writable => 'real', List => 0 }, + LocalBlacks2012 => { FlatName => 'Blacks2012', Writable => 'real', List => 0 }, + LocalDehaze => { FlatName => 'Dehaze', Writable => 'real', List => 0 }, + LocalTexture => { FlatName => 'Texture', Writable => 'real', List => 0 }, + # new in LR 11.0 + CorrectionRangeMask => { + Name => 'CorrRangeMask', + Notes => 'called CorrectionRangeMask by the spec', + FlatName => 'RangeMask', + Struct => \%sCorrRangeMask, + }, + CorrectionMasks => { + FlatName => 'Mask', + Struct => \%sCorrectionMask, + List => 'Seq', + }, + CorrectionName => { }, + CorrectionSyncID => { }, +); +my %sRetouchArea = ( + STRUCT_NAME => 'RetouchArea', + NAMESPACE => 'crs', + SpotType => { List => 0 }, + SourceState => { List => 0 }, + Method => { List => 0 }, + SourceX => { Writable => 'real', List => 0 }, + OffsetY => { Writable => 'real', List => 0 }, + Opacity => { Writable => 'real', List => 0 }, + Feather => { Writable => 'real', List => 0 }, + Seed => { Writable => 'integer', List => 0 }, + Masks => { + FlatName => 'Mask', + Struct => \%sCorrectionMask, + List => 'Seq', + }, +); +my %sMapInfo = ( + STRUCT_NAME => 'MapInfo', + NAMESPACE => 'crs', + NOTES => q{ + Called RangeMaskMapInfo by the specification, the same as the containing + structure. + }, + RGBMin => { }, + RGBMax => { }, + LabMin => { }, + LabMax => { }, + LumEq => { List => 'Seq' }, +); +my %sRangeMask = ( + STRUCT_NAME => 'RangeMask', + NAMESPACE => 'crs', + NOTES => q{ + This structure is actually called RangeMaskMapInfo, but it only contains one + element which is a RangeMaskMapInfo structure (Yes, really!). So these are + renamed to RangeMask and MapInfo respectively to avoid confusion and + redundancy in the tag names. + }, + RangeMaskMapInfo => { FlatName => 'MapInfo', Struct => \%sMapInfo }, +); + +# main XMP tag table (tag ID's are used for the family 1 group names) +%Image::ExifTool::XMP::Main = ( + GROUPS => { 2 => 'Unknown' }, + PROCESS_PROC => \&ProcessXMP, + WRITE_PROC => \&WriteXMP, + dc => { + Name => 'dc', # (otherwise generated name would be 'Dc') + SubDirectory => { TagTable => 'Image::ExifTool::XMP::dc' }, + }, + xmp => { + Name => 'xmp', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmp' }, + }, + xmpDM => { + Name => 'xmpDM', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpDM' }, + }, + xmpRights => { + Name => 'xmpRights', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpRights' }, + }, + xmpNote => { + Name => 'xmpNote', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpNote' }, + }, + xmpMM => { + Name => 'xmpMM', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpMM' }, + }, + xmpBJ => { + Name => 'xmpBJ', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpBJ' }, + }, + xmpTPg => { + Name => 'xmpTPg', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpTPg' }, + }, + pdf => { + Name => 'pdf', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::pdf' }, + }, + pdfx => { + Name => 'pdfx', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::pdfx' }, + }, + photoshop => { + Name => 'photoshop', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::photoshop' }, + }, + crd => { + Name => 'crd', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::crd' }, + }, + crs => { + Name => 'crs', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::crs' }, + }, + # crss - it would be tedious to add the ability to write this + aux => { + Name => 'aux', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::aux' }, + }, + tiff => { + Name => 'tiff', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::tiff' }, + }, + exif => { + Name => 'exif', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::exif' }, + }, + exifEX => { + Name => 'exifEX', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::exifEX' }, + }, + iptcCore => { + Name => 'iptcCore', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::iptcCore' }, + }, + iptcExt => { + Name => 'iptcExt', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::iptcExt' }, + }, + PixelLive => { + SubDirectory => { TagTable => 'Image::ExifTool::XMP::PixelLive' }, + }, + xmpPLUS => { + Name => 'xmpPLUS', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::xmpPLUS' }, + }, + plus => { + Name => 'plus', + SubDirectory => { TagTable => 'Image::ExifTool::PLUS::XMP' }, + }, + cc => { + Name => 'cc', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::cc' }, + }, + dex => { + Name => 'dex', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::dex' }, + }, + photomech => { + Name => 'photomech', + SubDirectory => { TagTable => 'Image::ExifTool::PhotoMechanic::XMP' }, + }, + mediapro => { + Name => 'mediapro', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::MediaPro' }, + }, + expressionmedia => { + Name => 'expressionmedia', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::ExpressionMedia' }, + }, + microsoft => { + Name => 'microsoft', + SubDirectory => { TagTable => 'Image::ExifTool::Microsoft::XMP' }, + }, + MP => { + Name => 'MP', + SubDirectory => { TagTable => 'Image::ExifTool::Microsoft::MP' }, + }, + MP1 => { + Name => 'MP1', + SubDirectory => { TagTable => 'Image::ExifTool::Microsoft::MP1' }, + }, + lr => { + Name => 'lr', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Lightroom' }, + }, + DICOM => { + Name => 'DICOM', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::DICOM' }, + }, + album => { + Name => 'album', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Album' }, + }, + prism => { + Name => 'prism', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::prism' }, + }, + prl => { + Name => 'prl', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::prl' }, + }, + pur => { + Name => 'pur', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::pur' }, + }, + pmi => { + Name => 'pmi', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::pmi' }, + }, + prm => { + Name => 'prm', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::prm' }, + }, + rdf => { + Name => 'rdf', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::rdf' }, + }, + 'x' => { + Name => 'x', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::x' }, + }, + acdsee => { + Name => 'acdsee', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::acdsee' }, + }, + digiKam => { + Name => 'digiKam', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::digiKam' }, + }, + swf => { + Name => 'swf', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::swf' }, + }, + cell => { + Name => 'cell', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::cell' }, + }, + aas => { + Name => 'aas', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::aas' }, + }, + 'mwg-rs' => { + Name => 'mwg-rs', + SubDirectory => { TagTable => 'Image::ExifTool::MWG::Regions' }, + }, + 'mwg-kw' => { + Name => 'mwg-kw', + SubDirectory => { TagTable => 'Image::ExifTool::MWG::Keywords' }, + }, + 'mwg-coll' => { + Name => 'mwg-coll', + SubDirectory => { TagTable => 'Image::ExifTool::MWG::Collections' }, + }, + extensis => { + Name => 'extensis', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::extensis' }, + }, + ics => { + Name => 'ics', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::ics' }, + }, + fpv => { + Name => 'fpv', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::fpv' }, + }, + creatorAtom => { + Name => 'creatorAtom', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::creatorAtom' }, + }, + 'apple-fi' => { + Name => 'apple-fi', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::apple_fi' }, + }, + GAudio => { + Name => 'GAudio', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::GAudio' }, + }, + GImage => { + Name => 'GImage', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::GImage' }, + }, + GPano => { + Name => 'GPano', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::GPano' }, + }, + GSpherical => { + Name => 'GSpherical', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::GSpherical' }, + }, + GDepth => { + Name => 'GDepth', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::GDepth' }, + }, + GFocus => { + Name => 'GFocus', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::GFocus' }, + }, + GCamera => { + Name => 'GCamera', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::GCamera' }, + }, + GCreations => { + Name => 'GCreations', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::GCreations' }, + }, + dwc => { + Name => 'dwc', + SubDirectory => { TagTable => 'Image::ExifTool::DarwinCore::Main' }, + }, + getty => { + Name => 'getty', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::GettyImages' }, + }, + 'drone-dji' => { + Name => 'drone-dji', + SubDirectory => { TagTable => 'Image::ExifTool::DJI::XMP' }, + }, + LImage => { + Name => 'LImage', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::LImage' }, + }, + Device => { + Name => 'Device', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::Device' }, + }, + sdc => { + Name => 'sdc', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::sdc' }, + }, + ast => { + Name => 'ast', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::ast' }, + }, + nine => { + Name => 'nine', + SubDirectory => { TagTable => 'Image::ExifTool::Nikon::nine' }, + }, +); + +# hack to allow XML containing Dublin Core metadata to be handled like XMP (eg. EPUB - see ZIP.pm) +%Image::ExifTool::XMP::XML = ( + GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Unknown' }, + PROCESS_PROC => \&ProcessXMP, + dc => { + Name => 'dc', + SubDirectory => { TagTable => 'Image::ExifTool::XMP::dc' }, + }, + lastUpdate => { + Groups => { 2 => 'Time' }, + ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)', + PrintConv => '$self->ConvertDateTime($val)', + }, +); + +# +# Tag tables for all XMP namespaces: +# +# Writable - only need to define this for writable tags if not plain text +# (boolean, integer, rational, real, date or lang-alt) +# List - XMP list type (Bag, Seq or Alt, or set to 1 for elements in Struct lists -- +# this is necessary to obtain proper list behaviour when reading/writing) +# +# (Note that family 1 group names are generated from the property namespace, not +# the group1 names below which exist so the groups will appear in the list.) +# +%xmpTableDefaults = ( + WRITE_PROC => \&WriteXMP, + CHECK_PROC => \&CheckXMP, + WRITABLE => 'string', + LANG_INFO => \&GetLangInfo, +); + +# rdf attributes extracted +%Image::ExifTool::XMP::rdf = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-rdf', 2 => 'Document' }, + NAMESPACE => 'rdf', + NOTES => q{ + Most RDF attributes are handled internally, but the "about" attribute is + treated specially to allow it to be set to a specific value if required. + }, + about => { Protected => 1 }, +); + +# x attributes extracted +%Image::ExifTool::XMP::x = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-x', 2 => 'Document' }, + NAMESPACE => 'x', + NOTES => qq{ + The "x" namespace is used for the "xmpmeta" wrapper, and may contain an + "xmptk" attribute that is extracted as the XMPToolkit tag. When writing, + the XMPToolkit tag is generated automatically by ExifTool unless + specifically set to another value. + }, + xmptk => { Name => 'XMPToolkit', Protected => 1 }, +); + +# Dublin Core namespace properties (dc) +%Image::ExifTool::XMP::dc = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-dc', 2 => 'Other' }, + NAMESPACE => 'dc', + TABLE_DESC => 'XMP Dublin Core', + NOTES => 'Dublin Core namespace tags.', + contributor => { Groups => { 2 => 'Author' }, List => 'Bag' }, + coverage => { }, + creator => { Groups => { 2 => 'Author' }, List => 'Seq' }, + date => { Groups => { 2 => 'Time' }, List => 'Seq', %dateTimeInfo }, + description => { Groups => { 2 => 'Image' }, Writable => 'lang-alt' }, + 'format' => { Groups => { 2 => 'Image' } }, + identifier => { Groups => { 2 => 'Image' } }, + language => { List => 'Bag' }, + publisher => { Groups => { 2 => 'Author' }, List => 'Bag' }, + relation => { List => 'Bag' }, + rights => { Groups => { 2 => 'Author' }, Writable => 'lang-alt' }, + source => { Groups => { 2 => 'Author' }, Avoid => 1 }, + subject => { Groups => { 2 => 'Image' }, List => 'Bag' }, + title => { Groups => { 2 => 'Image' }, Writable => 'lang-alt' }, + type => { Groups => { 2 => 'Image' }, List => 'Bag' }, +); + +# XMP namespace properties (xmp, xap) +%Image::ExifTool::XMP::xmp = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-xmp', 2 => 'Image' }, + NAMESPACE => 'xmp', + NOTES => q{ + XMP namespace tags. If the older "xap", "xapBJ", "xapMM" or "xapRights" + namespace prefixes are found, they are translated to the newer "xmp", + "xmpBJ", "xmpMM" and "xmpRights" prefixes for use in family 1 group names. + }, + Advisory => { List => 'Bag', Notes => 'deprecated' }, + BaseURL => { }, + # (date/time tags not as reliable as EXIF) + CreateDate => { Groups => { 2 => 'Time' }, %dateTimeInfo, Priority => 0 }, + CreatorTool => { }, + Identifier => { Avoid => 1, List => 'Bag' }, + Label => { }, + MetadataDate=> { Groups => { 2 => 'Time' }, %dateTimeInfo }, + ModifyDate => { Groups => { 2 => 'Time' }, %dateTimeInfo, Priority => 0 }, + Nickname => { }, + Rating => { Writable => 'real', Notes => 'a value from 0 to 5, or -1 for "rejected"' }, + RatingPercent=>{ Writable => 'real', Avoid => 1, Notes => 'non-standard' }, + Thumbnails => { + FlatName => 'Thumbnail', + Struct => \%sThumbnail, + List => 'Alt', + }, + # the following written by Adobe InDesign, not part of XMP spec: + PageInfo => { + FlatName => 'PageImage', + Struct => \%sPageInfo, + List => 'Seq', + }, + PageInfoImage => { Name => 'PageImage', Flat => 1 }, + Title => { Avoid => 1, Notes => 'non-standard', Writable => 'lang-alt' }, #11 + Author => { Avoid => 1, Notes => 'non-standard', Groups => { 2 => 'Author' } }, #11 + Keywords => { Avoid => 1, Notes => 'non-standard' }, #11 + Description => { Avoid => 1, Notes => 'non-standard', Writable => 'lang-alt' }, #11 + Format => { Avoid => 1, Notes => 'non-standard' }, #11 +); + +# XMP Rights Management namespace properties (xmpRights, xapRights) +%Image::ExifTool::XMP::xmpRights = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-xmpRights', 2 => 'Author' }, + NAMESPACE => 'xmpRights', + NOTES => 'XMP Rights Management namespace tags.', + Certificate => { }, + Marked => { Writable => 'boolean' }, + Owner => { List => 'Bag' }, + UsageTerms => { Writable => 'lang-alt' }, + WebStatement => { }, +); + +# XMP Note namespace properties (xmpNote) +%Image::ExifTool::XMP::xmpNote = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-xmpNote' }, + NAMESPACE => 'xmpNote', + NOTES => 'XMP Note namespace tags.', + HasExtendedXMP => { + Notes => q{ + this tag is protected so it is not writable directly. Instead, it is set + automatically to the GUID of the extended XMP when writing extended XMP to a + JPEG image + }, + Protected => 2, + }, +); + +# XMP xmpMM ManifestItem struct (ref PH, written by Adobe PDF library 8.0) +my %sManifestItem = ( + STRUCT_NAME => 'ManifestItem', + NAMESPACE => 'stMfs', + linkForm => { }, + placedXResolution => { Namespace => 'xmpMM', Writable => 'real' }, + placedYResolution => { Namespace => 'xmpMM', Writable => 'real' }, + placedResolutionUnit=> { Namespace => 'xmpMM' }, + reference => { Struct => \%sResourceRef }, +); + +# the xmpMM Pantry +my %sPantryItem = ( + STRUCT_NAME => 'PantryItem', + NAMESPACE => undef, # stores any top-level XMP tags + NOTES => q{ + This structure must have an InstanceID field, but may also contain any other + XMP properties. + }, + InstanceID => { Namespace => 'xmpMM', List => 0 }, +); + +# XMP Media Management namespace properties (xmpMM, xapMM) +%Image::ExifTool::XMP::xmpMM = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-xmpMM', 2 => 'Other' }, + NAMESPACE => 'xmpMM', + TABLE_DESC => 'XMP Media Management', + NOTES => 'XMP Media Management namespace tags.', + DerivedFrom => { Struct => \%sResourceRef }, + DocumentID => { }, + History => { Struct => \%sResourceEvent, List => 'Seq' }, + # we treat these like list items since History is a list + Ingredients => { Struct => \%sResourceRef, List => 'Bag' }, + InstanceID => { }, #PH (CS3) + ManagedFrom => { Struct => \%sResourceRef }, + Manager => { Groups => { 2 => 'Author' } }, + ManageTo => { Groups => { 2 => 'Author' } }, + ManageUI => { }, + ManagerVariant => { }, + Manifest => { Struct => \%sManifestItem, List => 'Bag' }, + OriginalDocumentID=> { }, + Pantry => { Struct => \%sPantryItem, List => 'Bag' }, + PreservedFileName => { }, # undocumented + RenditionClass => { }, + RenditionParams => { }, + VersionID => { }, + Versions => { Struct => \%sVersion, List => 'Seq' }, + LastURL => { }, # (deprecated) + RenditionOf => { Struct => \%sResourceRef }, # (deprecated) + SaveID => { Writable => 'integer' }, # (deprecated) + subject => { List => 'Seq', Avoid => 1, Notes => 'undocumented' }, +); + +# XMP Basic Job Ticket namespace properties (xmpBJ, xapBJ) +%Image::ExifTool::XMP::xmpBJ = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-xmpBJ', 2 => 'Other' }, + NAMESPACE => 'xmpBJ', + TABLE_DESC => 'XMP Basic Job Ticket', + NOTES => 'XMP Basic Job Ticket namespace tags.', + # Note: JobRef is a List of structures. To accomplish this, we set the XMP + # List=>'Bag', but since SubDirectory is defined, this tag isn't writable + # directly. Then we need to set List=>1 for the members so the Writer logic + # will allow us to add list items. + JobRef => { Struct => \%sJobRef, List => 'Bag' }, +); + +# XMP Paged-Text namespace properties (xmpTPg) +%Image::ExifTool::XMP::xmpTPg = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-xmpTPg', 2 => 'Image' }, + NAMESPACE => 'xmpTPg', + TABLE_DESC => 'XMP Paged-Text', + NOTES => 'XMP Paged-Text namespace tags.', + MaxPageSize => { Struct => \%sDimensions }, + NPages => { Writable => 'integer' }, + Fonts => { + FlatName => '', + Struct => \%sFont, + List => 'Bag', + }, + FontsVersionString => { Name => 'FontVersion', Flat => 1 }, + FontsComposite => { Name => 'FontComposite', Flat => 1 }, + Colorants => { + FlatName => 'Colorant', + Struct => \%sColorant, + List => 'Seq', + }, + PlateNames => { List => 'Seq' }, + # the following found in an AI file: + HasVisibleTransparency => { Writable => 'boolean' }, + HasVisibleOverprint => { Writable => 'boolean' }, + SwatchGroups => { + Struct => \%sSwatchGroup, + List => 'Seq', + }, + SwatchGroupsColorants => { Name => 'SwatchGroupsColorants', Flat => 1 }, + SwatchGroupsGroupName => { Name => 'SwatchGroupName', Flat => 1 }, + SwatchGroupsGroupType => { Name => 'SwatchGroupType', Flat => 1 }, +); + +# PDF namespace properties (pdf) +%Image::ExifTool::XMP::pdf = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-pdf', 2 => 'Image' }, + NAMESPACE => 'pdf', + TABLE_DESC => 'XMP PDF', + NOTES => q{ + Adobe PDF namespace tags. The official XMP specification defines only + Keywords, PDFVersion, Producer and Trapped. The other tags are included + because they have been observed in PDF files, but some are avoided when + writing due to name conflicts with other XMP namespaces. + }, + Author => { Groups => { 2 => 'Author' } }, #PH + ModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo }, #PH + CreationDate=> { Groups => { 2 => 'Time' }, %dateTimeInfo }, #PH + Creator => { Groups => { 2 => 'Author' }, Avoid => 1 }, + Copyright => { Groups => { 2 => 'Author' }, Avoid => 1 }, #PH + Marked => { Avoid => 1, Writable => 'boolean' }, #PH + Subject => { Avoid => 1 }, + Title => { Avoid => 1 }, + Trapped => { #PH + # remove leading '/' from '/True' or '/False' + ValueConv => '$val=~s{^/}{}; $val', + ValueConvInv => '"/$val"', + PrintConv => { True => 'True', False => 'False', Unknown => 'Unknown' }, + }, + Keywords => { Priority => -1 }, # (-1 to get below Priority 0 PDF:Keywords) + PDFVersion => { }, + Producer => { Groups => { 2 => 'Author' } }, +); + +# PDF extension namespace properties (pdfx) +%Image::ExifTool::XMP::pdfx = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-pdfx', 2 => 'Document' }, + NAMESPACE => 'pdfx', + NOTES => q{ + PDF extension tags. This namespace is used to store application-defined PDF + information, so there are no pre-defined tags. User-defined tags must be + created to enable writing of XMP-pdfx information. + }, +); + +# Photoshop namespace properties (photoshop) +%Image::ExifTool::XMP::photoshop = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-photoshop', 2 => 'Image' }, + NAMESPACE => 'photoshop', + TABLE_DESC => 'XMP Photoshop', + NOTES => 'Adobe Photoshop namespace tags.', + AuthorsPosition => { Groups => { 2 => 'Author' } }, + CaptionWriter => { Groups => { 2 => 'Author' } }, + Category => { }, + City => { Groups => { 2 => 'Location' } }, + ColorMode => { + Writable => 'integer', # (as of July 2010 spec, courtesy of yours truly) + PrintConvColumns => 2, + PrintConv => { + 0 => 'Bitmap', + 1 => 'Grayscale', + 2 => 'Indexed', + 3 => 'RGB', + 4 => 'CMYK', + 7 => 'Multichannel', + 8 => 'Duotone', + 9 => 'Lab', + }, + }, + Country => { Groups => { 2 => 'Location' } }, + Credit => { Groups => { 2 => 'Author' } }, + DateCreated => { Groups => { 2 => 'Time' }, %dateTimeInfo }, + DocumentAncestors => { + List => 'Bag', + # Contrary to their own XMP specification, Adobe writes this as a simple Bag + # of strings instead of structures, so comment out the structure definition... + # FlatName => 'Document', + # Struct => { + # STRUCT_NAME => 'Ancestor', + # NAMESPACE => 'photoshop', + # AncestorID => { }, + # }, + }, + Headline => { }, + History => { }, #PH (CS3) + ICCProfile => { Name => 'ICCProfileName' }, #PH + Instructions => { }, + LegacyIPTCDigest=> { }, #PH + SidecarForExtension => { }, #PH (CS3) + Source => { Groups => { 2 => 'Author' } }, + State => { Groups => { 2 => 'Location' } }, + # the XMP spec doesn't show SupplementalCategories as a 'Bag', but + # that's the way Photoshop writes it [fixed in the June 2005 XMP spec]. + # Also, it is incorrectly listed as "SupplementalCategory" in the + # IPTC Standard Photo Metadata docs (2008rev2 and July 2009rev1) - PH + SupplementalCategories => { List => 'Bag' }, + TextLayers => { + FlatName => 'Text', + List => 'Seq', + Struct => { + STRUCT_NAME => 'Layer', + NAMESPACE => 'photoshop', + LayerName => { }, + LayerText => { }, + }, + }, + TransmissionReference => { Notes => 'Now used as a job identifier' }, + Urgency => { + Writable => 'integer', + Notes => 'should be in the range 1-8 to conform with the XMP spec', + PrintConv => { # (same values as IPTC:Urgency) + 0 => '0 (reserved)', # (not standard XMP) + 1 => '1 (most urgent)', + 2 => 2, + 3 => 3, + 4 => 4, + 5 => '5 (normal urgency)', + 6 => 6, + 7 => 7, + 8 => '8 (least urgent)', + 9 => '9 (user-defined priority)', # (not standard XMP) + }, + }, + EmbeddedXMPDigest => { }, #PH (LR5) +); + +# Photoshop Camera Raw namespace properties (crs) - (ref 8,PH) +%Image::ExifTool::XMP::crs = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-crs', 2 => 'Image' }, + NAMESPACE => 'crs', + TABLE_DESC => 'Photoshop Camera Raw namespace', + NOTES => q{ + Photoshop Camera Raw namespace tags. It is a shame that Adobe pollutes the + metadata space with these incredibly bulky image editing parameters. + }, + AlreadyApplied => { Writable => 'boolean' }, #PH (written by LightRoom beta 4.1) + AutoBrightness => { Writable => 'boolean' }, + AutoContrast => { Writable => 'boolean' }, + AutoExposure => { Writable => 'boolean' }, + AutoShadows => { Writable => 'boolean' }, + BlueHue => { Writable => 'integer' }, + BlueSaturation => { Writable => 'integer' }, + Brightness => { Writable => 'integer' }, + CameraProfile => { }, + ChromaticAberrationB=> { Writable => 'integer' }, + ChromaticAberrationR=> { Writable => 'integer' }, + ColorNoiseReduction => { Writable => 'integer' }, + Contrast => { Writable => 'integer', Avoid => 1 }, + Converter => { }, #PH guess (found in EXIF) + CropTop => { Writable => 'real' }, + CropLeft => { Writable => 'real' }, + CropBottom => { Writable => 'real' }, + CropRight => { Writable => 'real' }, + CropAngle => { Writable => 'real' }, + CropWidth => { Writable => 'real' }, + CropHeight => { Writable => 'real' }, + CropUnits => { + Writable => 'integer', + PrintConv => { + 0 => 'pixels', + 1 => 'inches', + 2 => 'cm', + }, + }, + Exposure => { Writable => 'real' }, + GreenHue => { Writable => 'integer' }, + GreenSaturation => { Writable => 'integer' }, + HasCrop => { Writable => 'boolean' }, + HasSettings => { Writable => 'boolean' }, + LuminanceSmoothing => { Writable => 'integer' }, + MoireFilter => { PrintConv => { Off=>'Off', On=>'On' } }, + RawFileName => { }, + RedHue => { Writable => 'integer' }, + RedSaturation => { Writable => 'integer' }, + Saturation => { Writable => 'integer', Avoid => 1 }, + Shadows => { Writable => 'integer' }, + ShadowTint => { Writable => 'integer' }, + Sharpness => { Writable => 'integer', Avoid => 1 }, + Smoothness => { Writable => 'integer' }, + Temperature => { Writable => 'integer', Name => 'ColorTemperature' }, + Tint => { Writable => 'integer' }, + ToneCurve => { List => 'Seq' }, + ToneCurveName => { + PrintConv => { + Linear => 'Linear', + 'Medium Contrast' => 'Medium Contrast', + 'Strong Contrast' => 'Strong Contrast', + Custom => 'Custom', + }, + }, + Version => { }, + VignetteAmount => { Writable => 'integer' }, + VignetteMidpoint=> { Writable => 'integer' }, + WhiteBalance => { + Avoid => 1, + PrintConv => { + 'As Shot' => 'As Shot', + Auto => 'Auto', + Daylight => 'Daylight', + Cloudy => 'Cloudy', + Shade => 'Shade', + Tungsten => 'Tungsten', + Fluorescent => 'Fluorescent', + Flash => 'Flash', + Custom => 'Custom', + }, + }, + # new tags observed in Adobe Lightroom output - PH + CameraProfileDigest => { }, + Clarity => { Writable => 'integer' }, + ConvertToGrayscale => { Writable => 'boolean' }, + Defringe => { Writable => 'integer' }, + FillLight => { Writable => 'integer' }, + HighlightRecovery => { Writable => 'integer' }, + HueAdjustmentAqua => { Writable => 'integer' }, + HueAdjustmentBlue => { Writable => 'integer' }, + HueAdjustmentGreen => { Writable => 'integer' }, + HueAdjustmentMagenta => { Writable => 'integer' }, + HueAdjustmentOrange => { Writable => 'integer' }, + HueAdjustmentPurple => { Writable => 'integer' }, + HueAdjustmentRed => { Writable => 'integer' }, + HueAdjustmentYellow => { Writable => 'integer' }, + IncrementalTemperature => { Writable => 'integer' }, + IncrementalTint => { Writable => 'integer' }, + LuminanceAdjustmentAqua => { Writable => 'integer' }, + LuminanceAdjustmentBlue => { Writable => 'integer' }, + LuminanceAdjustmentGreen => { Writable => 'integer' }, + LuminanceAdjustmentMagenta => { Writable => 'integer' }, + LuminanceAdjustmentOrange => { Writable => 'integer' }, + LuminanceAdjustmentPurple => { Writable => 'integer' }, + LuminanceAdjustmentRed => { Writable => 'integer' }, + LuminanceAdjustmentYellow => { Writable => 'integer' }, + ParametricDarks => { Writable => 'integer' }, + ParametricHighlights => { Writable => 'integer' }, + ParametricHighlightSplit => { Writable => 'integer' }, + ParametricLights => { Writable => 'integer' }, + ParametricMidtoneSplit => { Writable => 'integer' }, + ParametricShadows => { Writable => 'integer' }, + ParametricShadowSplit => { Writable => 'integer' }, + SaturationAdjustmentAqua => { Writable => 'integer' }, + SaturationAdjustmentBlue => { Writable => 'integer' }, + SaturationAdjustmentGreen => { Writable => 'integer' }, + SaturationAdjustmentMagenta => { Writable => 'integer' }, + SaturationAdjustmentOrange => { Writable => 'integer' }, + SaturationAdjustmentPurple => { Writable => 'integer' }, + SaturationAdjustmentRed => { Writable => 'integer' }, + SaturationAdjustmentYellow => { Writable => 'integer' }, + SharpenDetail => { Writable => 'integer' }, + SharpenEdgeMasking => { Writable => 'integer' }, + SharpenRadius => { Writable => 'real' }, + SplitToningBalance => { Writable => 'integer', Notes => 'also used for newer ColorGrade settings' }, + SplitToningHighlightHue => { Writable => 'integer', Notes => 'also used for newer ColorGrade settings' }, + SplitToningHighlightSaturation => { Writable => 'integer', Notes => 'also used for newer ColorGrade settings' }, + SplitToningShadowHue => { Writable => 'integer', Notes => 'also used for newer ColorGrade settings' }, + SplitToningShadowSaturation => { Writable => 'integer', Notes => 'also used for newer ColorGrade settings' }, + Vibrance => { Writable => 'integer' }, + # new tags written by LR 1.4 (not sure in what version they first appeared) + GrayMixerRed => { Writable => 'integer' }, + GrayMixerOrange => { Writable => 'integer' }, + GrayMixerYellow => { Writable => 'integer' }, + GrayMixerGreen => { Writable => 'integer' }, + GrayMixerAqua => { Writable => 'integer' }, + GrayMixerBlue => { Writable => 'integer' }, + GrayMixerPurple => { Writable => 'integer' }, + GrayMixerMagenta => { Writable => 'integer' }, + RetouchInfo => { List => 'Seq' }, + RedEyeInfo => { List => 'Seq' }, + # new tags written by LR 2.0 (ref PH) + CropUnit => { # was the XMP documentation wrong with "CropUnits"?? + Writable => 'integer', + PrintConv => { + 0 => 'pixels', + 1 => 'inches', + 2 => 'cm', + # have seen a value of 3 here! - PH + }, + }, + PostCropVignetteAmount => { Writable => 'integer' }, + PostCropVignetteMidpoint => { Writable => 'integer' }, + PostCropVignetteFeather => { Writable => 'integer' }, + PostCropVignetteRoundness => { Writable => 'integer' }, + PostCropVignetteStyle => { Writable => 'integer' }, + # disable List behaviour of flattened Gradient/PaintBasedCorrections + # because these are nested in lists and the flattened tags can't + # do justice to this complex structure + GradientBasedCorrections => { + FlatName => 'GradientBasedCorr', + Struct => \%sCorrection, + List => 'Seq', + }, + GradientBasedCorrectionsCorrectionMasks => { + Name => 'GradientBasedCorrMasks', + FlatName => 'GradientBasedCorrMask', + Flat => 1 + }, + GradientBasedCorrectionsCorrectionMasksDabs => { + Name => 'GradientBasedCorrMaskDabs', + Flat => 1, List => 0, + }, + PaintBasedCorrections => { + FlatName => 'PaintCorrection', + Struct => \%sCorrection, + List => 'Seq', + }, + PaintBasedCorrectionsCorrectionMasks => { + Name => 'PaintBasedCorrectionMasks', + FlatName => 'PaintCorrectionMask', + Flat => 1, + }, + PaintBasedCorrectionsCorrectionMasksDabs => { + Name => 'PaintCorrectionMaskDabs', + Flat => 1, List => 0, + }, + # new tags written by LR 3 (thanks Wolfgang Guelcker) + ProcessVersion => { }, + LensProfileEnable => { Writable => 'integer' }, + LensProfileSetup => { }, + LensProfileName => { }, + LensProfileFilename => { }, + LensProfileDigest => { }, + LensProfileDistortionScale => { Writable => 'integer' }, + LensProfileChromaticAberrationScale => { Writable => 'integer' }, + LensProfileVignettingScale => { Writable => 'integer' }, + LensManualDistortionAmount => { Writable => 'integer' }, + PerspectiveVertical => { Writable => 'integer' }, + PerspectiveHorizontal => { Writable => 'integer' }, + PerspectiveRotate => { Writable => 'real' }, + PerspectiveScale => { Writable => 'integer' }, + CropConstrainToWarp => { Writable => 'integer' }, + LuminanceNoiseReductionDetail => { Writable => 'integer' }, + LuminanceNoiseReductionContrast => { Writable => 'integer' }, + ColorNoiseReductionDetail => { Writable => 'integer' }, + GrainAmount => { Writable => 'integer' }, + GrainSize => { Writable => 'integer' }, + GrainFrequency => { Writable => 'integer' }, + # new tags written by LR4 + AutoLateralCA => { Writable => 'integer' }, + Exposure2012 => { Writable => 'real' }, + Contrast2012 => { Writable => 'integer' }, + Highlights2012 => { Writable => 'integer' }, + Highlight2012 => { Writable => 'integer' }, # (written by Nikon software) + Shadows2012 => { Writable => 'integer' }, + Whites2012 => { Writable => 'integer' }, + Blacks2012 => { Writable => 'integer' }, + Clarity2012 => { Writable => 'integer' }, + PostCropVignetteHighlightContrast => { Writable => 'integer' }, + ToneCurveName2012 => { }, + ToneCurveRed => { List => 'Seq' }, + ToneCurveGreen => { List => 'Seq' }, + ToneCurveBlue => { List => 'Seq' }, + ToneCurvePV2012 => { List => 'Seq' }, + ToneCurvePV2012Red => { List => 'Seq' }, + ToneCurvePV2012Green => { List => 'Seq' }, + ToneCurvePV2012Blue => { List => 'Seq' }, + DefringePurpleAmount => { Writable => 'integer' }, + DefringePurpleHueLo => { Writable => 'integer' }, + DefringePurpleHueHi => { Writable => 'integer' }, + DefringeGreenAmount => { Writable => 'integer' }, + DefringeGreenHueLo => { Writable => 'integer' }, + DefringeGreenHueHi => { Writable => 'integer' }, + # new tags written by LR5 + AutoWhiteVersion => { Writable => 'integer' }, + CircularGradientBasedCorrections => { + FlatName => 'CircGradBasedCorr', + Struct => \%sCorrection, + List => 'Seq', + }, + CircularGradientBasedCorrectionsCorrectionMasks => { + Name => 'CircGradBasedCorrMasks', + FlatName => 'CircGradBasedCorrMask', + Flat => 1 + }, + CircularGradientBasedCorrectionsCorrectionMasksDabs => { + Name => 'CircGradBasedCorrMaskDabs', + Flat => 1, List => 0, + }, + ColorNoiseReductionSmoothness => { Writable => 'integer' }, + PerspectiveAspect => { Writable => 'integer' }, + PerspectiveUpright => { Writable => 'integer' }, + RetouchAreas => { + FlatName => 'RetouchArea', + Struct => \%sRetouchArea, + List => 'Seq', + }, + RetouchAreasMasks => { + Name => 'RetouchAreaMasks', + FlatName => 'RetouchAreaMask', + Flat => 1 + }, + RetouchAreasMasksDabs => { + Name => 'RetouchAreaMaskDabs', + Flat => 1, List => 0, + }, + UprightVersion => { Writable => 'integer' }, + UprightCenterMode => { Writable => 'integer' }, + UprightCenterNormX => { Writable => 'real' }, + UprightCenterNormY => { Writable => 'real' }, + UprightFocalMode => { Writable => 'integer' }, + UprightFocalLength35mm => { Writable => 'real' }, + UprightPreview => { Writable => 'boolean' }, + UprightTransformCount => { Writable => 'integer' }, + UprightDependentDigest => { }, + UprightTransform_0 => { }, + UprightTransform_1 => { }, + UprightTransform_2 => { }, + UprightTransform_3 => { }, + UprightTransform_4 => { }, + UprightTransform_5 => { }, + # more stuff seen in lens profile file (unknown source) + What => { }, # (with value "LensProfileDefaultSettings") + LensProfileMatchKeyExifMake => { }, + LensProfileMatchKeyExifModel => { }, + LensProfileMatchKeyCameraModelName => { }, + LensProfileMatchKeyLensInfo => { }, + LensProfileMatchKeyLensID => { }, + LensProfileMatchKeyLensName => { }, + LensProfileMatchKeyIsRaw => { Writable => 'boolean' }, + LensProfileMatchKeySensorFormatFactor=>{ Writable => 'real' }, + # more stuff (ref forum6993) + DefaultAutoTone => { Writable => 'boolean' }, + DefaultAutoGray => { Writable => 'boolean' }, + DefaultsSpecificToSerial => { Writable => 'boolean' }, + DefaultsSpecificToISO => { Writable => 'boolean' }, + DNGIgnoreSidecars => { Writable => 'boolean' }, + NegativeCachePath => { }, + NegativeCacheMaximumSize => { Writable => 'real' }, + NegativeCacheLargePreviewSize => { Writable => 'integer' }, + JPEGHandling => { }, + TIFFHandling => { }, + Dehaze => { Writable => 'real' }, + ToneMapStrength => { Writable => 'real' }, + # yet more + PerspectiveX => { Writable => 'real' }, + PerspectiveY => { Writable => 'real' }, + UprightFourSegmentsCount => { Writable => 'integer' }, + AutoTone => { Writable => 'boolean' }, + Texture => { Writable => 'integer' }, + # more stuff (ref forum10721) + OverrideLookVignette => { Writable => 'boolean' }, + Look => { + Struct => { + STRUCT_NAME => 'Look', + NAMESPACE => 'crs', + Name => { }, + Amount => { }, + Cluster => { }, + UUID => { }, + SupportsMonochrome => { }, + SupportsAmount => { }, + SupportsOutputReferred => { }, + Copyright => { }, + Group => { Writable => 'lang-alt' }, + Parameters => { + Struct => { + STRUCT_NAME => 'LookParms', + NAMESPACE => 'crs', + Version => { }, + ProcessVersion => { }, + Clarity2012 => { }, + ConvertToGrayscale => { }, + CameraProfile => { }, + LookTable => { }, + ToneCurvePV2012 => { List => 'Seq' }, + ToneCurvePV2012Red => { List => 'Seq' }, + ToneCurvePV2012Green => { List => 'Seq' }, + ToneCurvePV2012Blue => { List => 'Seq' }, + }, + }, + } + }, + # more again (ref forum11258) + GrainSeed => { }, + ClipboardOrientation => { Writable => 'integer' }, + ClipboardAspectRatio => { Writable => 'integer' }, + PresetType => { }, + Cluster => { }, + UUID => { Avoid => 1 }, + SupportsAmount => { Writable => 'boolean' }, + SupportsColor => { Writable => 'boolean' }, + SupportsMonochrome => { Writable => 'boolean' }, + SupportsHighDynamicRange=> { Writable => 'boolean' }, + SupportsNormalDynamicRange=> { Writable => 'boolean' }, + SupportsSceneReferred => { Writable => 'boolean' }, + SupportsOutputReferred => { Writable => 'boolean' }, + CameraModelRestriction => { }, + Copyright => { Avoid => 1 }, + ContactInfo => { }, + GrainSeed => { Writable => 'integer' }, + Name => { Writable => 'lang-alt', Avoid => 1 }, + ShortName => { Writable => 'lang-alt' }, + SortName => { Writable => 'lang-alt' }, + Group => { Writable => 'lang-alt', Avoid => 1 }, + Description => { Writable => 'lang-alt', Avoid => 1 }, + # new for DNG converter 13.0 + LookName => { NotFlat => 1 }, # (grr... conflicts with "Name" element of "Look" struct!) + # new for Lightroom CC 2021 (ref forum11745) + ColorGradeMidtoneHue => { Writable => 'integer' }, + ColorGradeMidtoneSat => { Writable => 'integer' }, + ColorGradeShadowLum => { Writable => 'integer' }, + ColorGradeMidtoneLum => { Writable => 'integer' }, + ColorGradeHighlightLum => { Writable => 'integer' }, + ColorGradeBlending => { Writable => 'integer' }, + ColorGradeGlobalHue => { Writable => 'integer' }, + ColorGradeGlobalSat => { Writable => 'integer' }, + ColorGradeGlobalLum => { Writable => 'integer' }, + # new for Adobe Camera Raw 13 (ref forum11745) + LensProfileIsEmbedded => { Writable => 'boolean'}, + AutoToneDigest => { }, + AutoToneDigestNoSat => { }, + ToggleStyleDigest => { }, + ToggleStyleAmount => { Writable => 'integer' }, + # new for LightRoom 11.0 + CompatibleVersion => { }, + MaskGroupBasedCorrections => { + FlatName => 'MaskGroupBasedCorr', + Struct => \%sCorrection, + List => 'Seq', + }, + RangeMaskMapInfo => { Name => 'RangeMask', Struct => \%sRangeMask, FlatName => 'RangeMask' }, +); + +# Tiff namespace properties (tiff) +%Image::ExifTool::XMP::tiff = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-tiff', 2 => 'Image' }, + NAMESPACE => 'tiff', + PRIORITY => 0, # not as reliable as actual TIFF tags + TABLE_DESC => 'XMP TIFF', + NOTES => q{ + EXIF namespace for TIFF tags. See + L<https://web.archive.org/web/20180921145139if_/http://www.cipa.jp:80/std/documents/e/DC-010-2017_E.pdf> + for the specification. + }, + ImageWidth => { Writable => 'integer' }, + ImageLength => { Writable => 'integer', Name => 'ImageHeight' }, + BitsPerSample => { Writable => 'integer', List => 'Seq', AutoSplit => 1 }, + Compression => { + Writable => 'integer', + SeparateTable => 'EXIF Compression', + PrintConv => \%Image::ExifTool::Exif::compression, + }, + PhotometricInterpretation => { + Writable => 'integer', + PrintConv => \%Image::ExifTool::Exif::photometricInterpretation, + }, + Orientation => { + Writable => 'integer', + PrintConv => \%Image::ExifTool::Exif::orientation, + }, + SamplesPerPixel => { Writable => 'integer' }, + PlanarConfiguration => { + Writable => 'integer', + PrintConv => { + 1 => 'Chunky', + 2 => 'Planar', + }, + }, + YCbCrSubSampling => { + Writable => 'integer', + List => 'Seq', + # join the raw values before conversion to allow PrintConv to operate on + # the combined string as it does for the corresponding EXIF tag + RawJoin => 1, + Notes => q{ + while technically this is a list-type tag, for compatibility with its EXIF + counterpart it is written and read as a simple string + }, + PrintConv => \%Image::ExifTool::JPEG::yCbCrSubSampling, + }, + YCbCrPositioning => { + Writable => 'integer', + PrintConv => { + 1 => 'Centered', + 2 => 'Co-sited', + }, + }, + XResolution => { Writable => 'rational' }, + YResolution => { Writable => 'rational' }, + ResolutionUnit => { + Writable => 'integer', + Notes => 'the value 1 is not standard EXIF', + PrintConv => { + 1 => 'None', + 2 => 'inches', + 3 => 'cm', + }, + }, + TransferFunction => { Writable => 'integer', List => 'Seq', AutoSplit => 1 }, + WhitePoint => { Writable => 'rational', List => 'Seq', AutoSplit => 1 }, + PrimaryChromaticities => { Writable => 'rational', List => 'Seq', AutoSplit => 1 }, + YCbCrCoefficients => { Writable => 'rational', List => 'Seq', AutoSplit => 1 }, + ReferenceBlackWhite => { Writable => 'rational', List => 'Seq', AutoSplit => 1 }, + DateTime => { # (EXIF tag named ModifyDate, but this exists in XMP-xmp) + Description => 'Date/Time Modified', + Groups => { 2 => 'Time' }, + %dateTimeInfo, + }, + ImageDescription => { Writable => 'lang-alt' }, + Make => { + Groups => { 2 => 'Camera' }, + RawConv => '$$self{Make} ? $val : $$self{Make} = $val', + }, + Model => { + Groups => { 2 => 'Camera' }, + Description => 'Camera Model Name', + RawConv => '$$self{Model} ? $val : $$self{Model} = $val', + }, + Software => { }, + Artist => { Groups => { 2 => 'Author' } }, + Copyright => { Groups => { 2 => 'Author' }, Writable => 'lang-alt' }, + NativeDigest => { Avoid => 1 }, #PH +); + +# Exif namespace properties (exif) +%Image::ExifTool::XMP::exif = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-exif', 2 => 'Image' }, + NAMESPACE => 'exif', + PRIORITY => 0, # not as reliable as actual EXIF tags + NOTES => q{ + EXIF namespace for EXIF tags. See + L<https://web.archive.org/web/20180921145139if_/http://www.cipa.jp:80/std/documents/e/DC-010-2017_E.pdf> + for the specification. + }, + ExifVersion => { }, + FlashpixVersion => { }, + ColorSpace => { + Writable => 'integer', + # (some applications incorrectly write -1 as a long integer) + ValueConv => '$val == 0xffffffff ? 0xffff : $val', + ValueConvInv => '$val', + PrintConv => { + 1 => 'sRGB', + 2 => 'Adobe RGB', + 0xffff => 'Uncalibrated', + }, + }, + ComponentsConfiguration => { + Writable => 'integer', + List => 'Seq', + AutoSplit => 1, + PrintConvColumns => 2, + PrintConv => { + 0 => '-', + 1 => 'Y', + 2 => 'Cb', + 3 => 'Cr', + 4 => 'R', + 5 => 'G', + 6 => 'B', + }, + }, + CompressedBitsPerPixel => { Writable => 'rational' }, + PixelXDimension => { Name => 'ExifImageWidth', Writable => 'integer' }, + PixelYDimension => { Name => 'ExifImageHeight', Writable => 'integer' }, + MakerNote => { }, + UserComment => { Writable => 'lang-alt' }, + RelatedSoundFile => { }, + DateTimeOriginal => { + Description => 'Date/Time Original', + Groups => { 2 => 'Time' }, + %dateTimeInfo, + }, + DateTimeDigitized => { # (EXIF tag named CreateDate, but this exists in XMP-xmp) + Description => 'Date/Time Digitized', + Groups => { 2 => 'Time' }, + %dateTimeInfo, + }, + ExposureTime => { + Writable => 'rational', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + PrintConvInv => '$val', + }, + FNumber => { + Writable => 'rational', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', + }, + ExposureProgram => { + Groups => { 2 => 'Camera' }, + Writable => 'integer', + PrintConv => { + 0 => 'Not Defined', + 1 => 'Manual', + 2 => 'Program AE', + 3 => 'Aperture-priority AE', + 4 => 'Shutter speed priority AE', + 5 => 'Creative (Slow speed)', + 6 => 'Action (High speed)', + 7 => 'Portrait', + 8 => 'Landscape', + }, + }, + SpectralSensitivity => { Groups => { 2 => 'Camera' } }, + ISOSpeedRatings => { + Name => 'ISO', + Writable => 'integer', + List => 'Seq', + AutoSplit => 1, + }, + OECF => { + Name => 'Opto-ElectricConvFactor', + FlatName => 'OECF', + Groups => { 2 => 'Camera' }, + Struct => \%sOECF, + }, + ShutterSpeedValue => { + Writable => 'rational', + ValueConv => 'abs($val)<100 ? 1/(2**$val) : 0', + PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)', + ValueConvInv => '$val>0 ? -log($val)/log(2) : 0', + PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', + }, + ApertureValue => { + Writable => 'rational', + ValueConv => 'sqrt(2) ** $val', + PrintConv => 'sprintf("%.1f",$val)', + ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0', + PrintConvInv => '$val', + }, + BrightnessValue => { Writable => 'rational' }, + ExposureBiasValue => { + Name => 'ExposureCompensation', + Writable => 'rational', + PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', + PrintConvInv => '$val', + }, + MaxApertureValue => { + Groups => { 2 => 'Camera' }, + Writable => 'rational', + ValueConv => 'sqrt(2) ** $val', + PrintConv => 'sprintf("%.1f",$val)', + ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0', + PrintConvInv => '$val', + }, + SubjectDistance => { + Groups => { 2 => 'Camera' }, + Writable => 'rational', + PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "$val m"', + PrintConvInv => '$val=~s/\s*m$//;$val', + }, + MeteringMode => { + Groups => { 2 => 'Camera' }, + Writable => 'integer', + PrintConv => { + 1 => 'Average', + 2 => 'Center-weighted average', + 3 => 'Spot', + 4 => 'Multi-spot', + 5 => 'Multi-segment', + 6 => 'Partial', + 255 => 'Other', + }, + }, + LightSource => { + Groups => { 2 => 'Camera' }, + SeparateTable => 'EXIF LightSource', + PrintConv => \%Image::ExifTool::Exif::lightSource, + }, + Flash => { + Groups => { 2 => 'Camera' }, + Struct => { + STRUCT_NAME => 'Flash', + NAMESPACE => 'exif', + Fired => { Writable => 'boolean', %boolConv }, + Return => { + Writable => 'integer', + PrintConv => { + 0 => 'No return detection', + 2 => 'Return not detected', + 3 => 'Return detected', + }, + }, + Mode => { + Writable => 'integer', + PrintConv => { + 0 => 'Unknown', + 1 => 'On', + 2 => 'Off', + 3 => 'Auto', + }, + }, + Function => { Writable => 'boolean', %boolConv }, + RedEyeMode => { Writable => 'boolean', %boolConv }, + }, + }, + FocalLength=> { + Groups => { 2 => 'Camera' }, + Writable => 'rational', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + SubjectArea => { Writable => 'integer', List => 'Seq', AutoSplit => 1 }, + FlashEnergy => { Groups => { 2 => 'Camera' }, Writable => 'rational' }, + SpatialFrequencyResponse => { + Groups => { 2 => 'Camera' }, + Struct => \%sOECF, + }, + FocalPlaneXResolution => { Groups => { 2 => 'Camera' }, Writable => 'rational' }, + FocalPlaneYResolution => { Groups => { 2 => 'Camera' }, Writable => 'rational' }, + FocalPlaneResolutionUnit => { + Groups => { 2 => 'Camera' }, + Writable => 'integer', + Notes => 'values 1, 4 and 5 are not standard EXIF', + PrintConv => { + 1 => 'None', # (not standard EXIF) + 2 => 'inches', + 3 => 'cm', + 4 => 'mm', # (not standard EXIF) + 5 => 'um', # (not standard EXIF) + }, + }, + SubjectLocation => { Writable => 'integer', List => 'Seq', AutoSplit => 1 }, + ExposureIndex => { Writable => 'rational' }, + SensingMethod => { + Groups => { 2 => 'Camera' }, + Writable => 'integer', + Notes => 'values 1 and 6 are not standard EXIF', + PrintConv => { + 1 => 'Monochrome area', # (not standard EXIF) + 2 => 'One-chip color area', + 3 => 'Two-chip color area', + 4 => 'Three-chip color area', + 5 => 'Color sequential area', + 6 => 'Monochrome linear', # (not standard EXIF) + 7 => 'Trilinear', + 8 => 'Color sequential linear', + }, + }, + FileSource => { + Writable => 'integer', + PrintConv => { + 1 => 'Film Scanner', + 2 => 'Reflection Print Scanner', + 3 => 'Digital Camera', + } + }, + SceneType => { Writable => 'integer', PrintConv => { 1 => 'Directly photographed' } }, + CFAPattern => { + Struct => { + STRUCT_NAME => 'CFAPattern', + NAMESPACE => 'exif', + Columns => { Writable => 'integer' }, + Rows => { Writable => 'integer' }, + Values => { Writable => 'integer', List => 'Seq' }, + }, + }, + CustomRendered => { + Writable => 'integer', + PrintConv => { + 0 => 'Normal', + 1 => 'Custom', + }, + }, + ExposureMode => { + Groups => { 2 => 'Camera' }, + Writable => 'integer', + PrintConv => { + 0 => 'Auto', + 1 => 'Manual', + 2 => 'Auto bracket', + }, + }, + WhiteBalance => { + Groups => { 2 => 'Camera' }, + Writable => 'integer', + PrintConv => { + 0 => 'Auto', + 1 => 'Manual', + }, + }, + DigitalZoomRatio => { Writable => 'rational' }, + FocalLengthIn35mmFilm => { + Name => 'FocalLengthIn35mmFormat', + Writable => 'integer', + Groups => { 2 => 'Camera' }, + PrintConv => '"$val mm"', + PrintConvInv => '$val=~s/\s*mm$//;$val', + }, + SceneCaptureType => { + Groups => { 2 => 'Camera' }, + Writable => 'integer', + PrintConv => { + 0 => 'Standard', + 1 => 'Landscape', + 2 => 'Portrait', + 3 => 'Night', + }, + }, + GainControl => { + Groups => { 2 => 'Camera' }, + Writable => 'integer', + PrintConv => { + 0 => 'None', + 1 => 'Low gain up', + 2 => 'High gain up', + 3 => 'Low gain down', + 4 => 'High gain down', + }, + }, + Contrast => { + Groups => { 2 => 'Camera' }, + Writable => 'integer', + PrintConv => { + 0 => 'Normal', + 1 => 'Low', + 2 => 'High', + }, + PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)', + }, + Saturation => { + Groups => { 2 => 'Camera' }, + Writable => 'integer', + PrintConv => { + 0 => 'Normal', + 1 => 'Low', + 2 => 'High', + }, + PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)', + }, + Sharpness => { + Groups => { 2 => 'Camera' }, + Writable => 'integer', + PrintConv => { + 0 => 'Normal', + 1 => 'Soft', + 2 => 'Hard', + }, + PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)', + }, + DeviceSettingDescription => { + Groups => { 2 => 'Camera' }, + Struct => { + STRUCT_NAME => 'DeviceSettings', + NAMESPACE => 'exif', + Columns => { Writable => 'integer' }, + Rows => { Writable => 'integer' }, + Settings => { List => 'Seq' }, + }, + }, + SubjectDistanceRange => { + Groups => { 2 => 'Camera' }, + Writable => 'integer', + PrintConv => { + 0 => 'Unknown', + 1 => 'Macro', + 2 => 'Close', + 3 => 'Distant', + }, + }, + ImageUniqueID => { }, + GPSVersionID => { Groups => { 2 => 'Location' } }, + GPSLatitude => { Groups => { 2 => 'Location' }, %latConv }, + GPSLongitude => { Groups => { 2 => 'Location' }, %longConv }, + GPSAltitudeRef => { + Groups => { 2 => 'Location' }, + Writable => 'integer', + PrintConv => { + OTHER => sub { + my ($val, $inv) = @_; + return undef unless $inv and $val =~ /^([-+0-9])/; + return($1 eq '-' ? 1 : 0); + }, + 0 => 'Above Sea Level', + 1 => 'Below Sea Level', + }, + }, + GPSAltitude => { + Groups => { 2 => 'Location' }, + Writable => 'rational', + # extricate unsigned decimal number from string + ValueConvInv => '$val=~/((?=\d|\.\d)\d*(?:\.\d*)?)/ ? $1 : undef', + PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "$val m"', + PrintConvInv => '$val=~s/\s*m$//;$val', + }, + GPSTimeStamp => { + Name => 'GPSDateTime', + Description => 'GPS Date/Time', + Groups => { 2 => 'Time' }, + Notes => q{ + a date/time tag called GPSTimeStamp by the XMP specification. This tag is + renamed here to prevent direct copy from EXIF:GPSTimeStamp which is a + time-only tag. Instead, the value of this tag should be taken from + Composite:GPSDateTime when copying from EXIF + }, + %dateTimeInfo, + }, + GPSSatellites => { Groups => { 2 => 'Location' } }, + GPSStatus => { + Groups => { 2 => 'Location' }, + PrintConv => { + A => 'Measurement Active', + V => 'Measurement Void', + }, + }, + GPSMeasureMode => { + Groups => { 2 => 'Location' }, + Writable => 'integer', + PrintConv => { + 2 => '2-Dimensional Measurement', + 3 => '3-Dimensional Measurement', + }, + }, + GPSDOP => { Groups => { 2 => 'Location' }, Writable => 'rational' }, + GPSSpeedRef => { + Groups => { 2 => 'Location' }, + PrintConv => { + K => 'km/h', + M => 'mph', + N => 'knots', + }, + }, + GPSSpeed => { Groups => { 2 => 'Location' }, Writable => 'rational' }, + GPSTrackRef => { + Groups => { 2 => 'Location' }, + PrintConv => { + M => 'Magnetic North', + T => 'True North', + }, + }, + GPSTrack => { Groups => { 2 => 'Location' }, Writable => 'rational' }, + GPSImgDirectionRef => { + Groups => { 2 => 'Location' }, + PrintConv => { + M => 'Magnetic North', + T => 'True North', + }, + }, + GPSImgDirection => { Groups => { 2 => 'Location' }, Writable => 'rational' }, + GPSMapDatum => { Groups => { 2 => 'Location' } }, + GPSDestLatitude => { Groups => { 2 => 'Location' }, %latConv }, + GPSDestLongitude=> { Groups => { 2 => 'Location' }, %longConv }, + GPSDestBearingRef => { + Groups => { 2 => 'Location' }, + PrintConv => { + M => 'Magnetic North', + T => 'True North', + }, + }, + GPSDestBearing => { Groups => { 2 => 'Location' }, Writable => 'rational' }, + GPSDestDistanceRef => { + Groups => { 2 => 'Location' }, + PrintConv => { + K => 'Kilometers', + M => 'Miles', + N => 'Nautical Miles', + }, + }, + GPSDestDistance => { + Groups => { 2 => 'Location' }, + Writable => 'rational', + }, + GPSProcessingMethod => { Groups => { 2 => 'Location' } }, + GPSAreaInformation => { Groups => { 2 => 'Location' } }, + GPSDifferential => { + Groups => { 2 => 'Location' }, + Writable => 'integer', + PrintConv => { + 0 => 'No Correction', + 1 => 'Differential Corrected', + }, + }, + GPSHPositioningError => { #12 + Description => 'GPS Horizontal Positioning Error', + Groups => { 2 => 'Location' }, + Writable => 'rational', + PrintConv => '"$val m"', + PrintConvInv => '$val=~s/\s*m$//; $val', + }, + NativeDigest => { }, #PH + # new Exif +); + +# Exif extended properties (exifEX, ref 12) +%Image::ExifTool::XMP::exifEX = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-exifEX', 2 => 'Image' }, + NAMESPACE => 'exifEX', + PRIORITY => 0, # not as reliable as actual EXIF tags + NOTES => q{ + EXIF tags added by the EXIF 2.32 for XMP specification (see + L<https://cipa.jp/std/documents/download_e.html?DC-010-2020_E>). + }, + Gamma => { Writable => 'rational' }, + PhotographicSensitivity => { Writable => 'integer' }, + SensitivityType => { + Writable => 'integer', + PrintConv => { + 0 => 'Unknown', + 1 => 'Standard Output Sensitivity', + 2 => 'Recommended Exposure Index', + 3 => 'ISO Speed', + 4 => 'Standard Output Sensitivity and Recommended Exposure Index', + 5 => 'Standard Output Sensitivity and ISO Speed', + 6 => 'Recommended Exposure Index and ISO Speed', + 7 => 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed', + }, + }, + StandardOutputSensitivity => { Writable => 'integer' }, + RecommendedExposureIndex => { Writable => 'integer' }, + ISOSpeed => { Writable => 'integer' }, + ISOSpeedLatitudeyyy => { + Description => 'ISO Speed Latitude yyy', + Writable => 'integer', + }, + ISOSpeedLatitudezzz => { + Description => 'ISO Speed Latitude zzz', + Writable => 'integer', + }, + CameraOwnerName => { Name => 'OwnerName' }, + BodySerialNumber => { Name => 'SerialNumber', Groups => { 2 => 'Camera' } }, + LensSpecification => { + Name => 'LensInfo', + Writable => 'rational', + Groups => { 2 => 'Camera' }, + List => 'Seq', + RawJoin => 1, # join list into a string before ValueConv + ValueConv => \&ConvertRationalList, + ValueConvInv => sub { + my $val = shift; + my @vals = split ' ', $val; + return $val unless @vals == 4; + foreach (@vals) { + $_ eq 'inf' and $_ = '1/0', next; + $_ eq 'undef' and $_ = '0/0', next; + Image::ExifTool::IsFloat($_) or return $val; + my @a = Image::ExifTool::Rationalize($_); + $_ = join '/', @a; + } + return \@vals; # return list reference (List-type tag) + }, + PrintConv => \&Image::ExifTool::Exif::PrintLensInfo, + PrintConvInv => \&Image::ExifTool::Exif::ConvertLensInfo, + Notes => q{ + unfortunately the EXIF 2.3 for XMP specification defined this new tag + instead of using the existing XMP-aux:LensInfo + }, + }, + LensMake => { Groups => { 2 => 'Camera' } }, + LensModel => { Groups => { 2 => 'Camera' } }, + LensSerialNumber => { Groups => { 2 => 'Camera' } }, + InteroperabilityIndex => { + Name => 'InteropIndex', + Description => 'Interoperability Index', + PrintConv => { + R98 => 'R98 - DCF basic file (sRGB)', + R03 => 'R03 - DCF option file (Adobe RGB)', + THM => 'THM - DCF thumbnail file', + }, + }, + # new in Exif 2.31 + Temperature => { Writable => 'rational', Name => 'AmbientTemperature' }, + Humidity => { Writable => 'rational' }, + Pressure => { Writable => 'rational' }, + WaterDepth => { Writable => 'rational' }, + Acceleration => { Writable => 'rational' }, + CameraElevationAngle=> { Writable => 'rational' }, + # new in Exif 2.32 (according to the spec, these should use a different namespace + # URI, but the same namespace prefix... Exactly how is that supposed to work?!! + # -- I'll just stick with the same URI) + CompositeImage => { Writable => 'integer', + PrintConv => { + 0 => 'Unknown', + 1 => 'Not a Composite Image', + 2 => 'General Composite Image', + 3 => 'Composite Image Captured While Shooting', + }, + }, + CompositeImageCount => { List => 'Seq', Writable => 'integer' }, + CompositeImageExposureTimes => { + FlatName => 'CompImage', + Struct => { + STRUCT_NAME => 'CompImageExp', + NAMESPACE => 'exifEX', + TotalExposurePeriod => { Writable => 'rational' }, + SumOfExposureTimesOfAll => { Writable => 'rational', FlatName => 'SumExposureAll' }, + SumOfExposureTimesOfUsed=> { Writable => 'rational', FlatName => 'SumExposureUsed' }, + MaxExposureTimesOfAll => { Writable => 'rational', FlatName => 'MaxExposureAll' }, + MaxExposureTimesOfUsed => { Writable => 'rational', FlatName => 'MaxExposureUsed' }, + MinExposureTimesOfAll => { Writable => 'rational', FlatName => 'MinExposureAll' }, + MinExposureTimesOfUsed => { Writable => 'rational', FlatName => 'MinExposureUsed' }, + NumberOfSequences => { Writable => 'integer', FlatName => 'NumSequences' }, + NumberOfImagesInSequences=>{ Writable => 'integer', FlatName => 'ImagesPerSequence' }, + Values => { List => 'Seq', Writable => 'rational' }, + }, + }, +); + +# Auxiliary namespace properties (aux) - not fully documented (ref PH) +%Image::ExifTool::XMP::aux = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-aux', 2 => 'Camera' }, + NAMESPACE => 'aux', + NOTES => q{ + Adobe-defined auxiliary EXIF tags. This namespace existed in the XMP + specification until it was dropped in 2012, presumably due to the + introduction of the EXIF 2.3 for XMP specification and the exifEX namespace + at this time. For this reason, tags below with equivalents in the + L<exifEX namespace|/XMP exifEX Tags> are avoided when writing. + }, + Firmware => { }, #7 + FlashCompensation => { Writable => 'rational' }, #7 + ImageNumber => { }, #7 + LensInfo => { #7 + Notes => '4 rational values giving focal and aperture ranges', + Avoid => 1, + # convert to floating point values (or 'inf' or 'undef') + ValueConv => \&ConvertRationalList, + ValueConvInv => sub { + my $val = shift; + my @vals = split ' ', $val; + return $val unless @vals == 4; + foreach (@vals) { + $_ eq 'inf' and $_ = '1/0', next; + $_ eq 'undef' and $_ = '0/0', next; + Image::ExifTool::IsFloat($_) or return $val; + my @a = Image::ExifTool::Rationalize($_); + $_ = join '/', @a; + } + return join ' ', @vals; # return string (string tag) + }, + # convert to the form "12-20mm f/3.8-4.5" or "50mm f/1.4" + PrintConv => \&Image::ExifTool::Exif::PrintLensInfo, + PrintConvInv => \&Image::ExifTool::Exif::ConvertLensInfo, + }, + Lens => { }, + OwnerName => { Avoid => 1 }, #7 + SerialNumber => { Avoid => 1 }, + LensSerialNumber=> { Avoid => 1 }, + LensID => { + Priority => 0, + # prevent this from getting set from a LensID that has been converted + ValueConvInv => q{ + warn "Expected one or more integer values" if $val =~ /[^-\d ]/; + return $val; + }, + }, + ApproximateFocusDistance => { Writable => 'rational' }, #PH (LR3) + # the following new in LR6 (ref forum6497) + IsMergedPanorama => { Writable => 'boolean' }, + IsMergedHDR => { Writable => 'boolean' }, + DistortionCorrectionAlreadyApplied => { Writable => 'boolean' }, + VignetteCorrectionAlreadyApplied => { Writable => 'boolean' }, + LateralChromaticAberrationCorrectionAlreadyApplied => { Writable => 'boolean' }, + LensDistortInfo => { }, # (LR 7.5.1, 4 signed rational values) + NeutralDensityFactor => { }, # (LR 11.0 - rational value, but denominator seems significant) +); + +# IPTC Core namespace properties (Iptc4xmpCore) (ref 4) +%Image::ExifTool::XMP::iptcCore = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-iptcCore', 2 => 'Author' }, + NAMESPACE => 'Iptc4xmpCore', + TABLE_DESC => 'XMP IPTC Core', + NOTES => q{ + IPTC Core namespace tags. The actual IPTC Core namespace prefix is + "Iptc4xmpCore", which is the prefix recorded in the file, but ExifTool + shortens this for the family 1 group name. (see + L<http://www.iptc.org/IPTC4XMP/>) + }, + CountryCode => { Groups => { 2 => 'Location' } }, + CreatorContactInfo => { + Struct => { + STRUCT_NAME => 'ContactInfo', + NAMESPACE => 'Iptc4xmpCore', + CiAdrCity => { }, + CiAdrCtry => { }, + CiAdrExtadr => { }, + CiAdrPcode => { }, + CiAdrRegion => { }, + CiEmailWork => { }, + CiTelWork => { }, + CiUrlWork => { }, + }, + }, + CreatorContactInfoCiAdrCity => { Flat => 1, Name => 'CreatorCity' }, + CreatorContactInfoCiAdrCtry => { Flat => 1, Name => 'CreatorCountry' }, + CreatorContactInfoCiAdrExtadr => { Flat => 1, Name => 'CreatorAddress' }, + CreatorContactInfoCiAdrPcode => { Flat => 1, Name => 'CreatorPostalCode' }, + CreatorContactInfoCiAdrRegion => { Flat => 1, Name => 'CreatorRegion' }, + CreatorContactInfoCiEmailWork => { Flat => 1, Name => 'CreatorWorkEmail' }, + CreatorContactInfoCiTelWork => { Flat => 1, Name => 'CreatorWorkTelephone' }, + CreatorContactInfoCiUrlWork => { Flat => 1, Name => 'CreatorWorkURL' }, + IntellectualGenre => { Groups => { 2 => 'Other' } }, + Location => { Groups => { 2 => 'Location' } }, + Scene => { Groups => { 2 => 'Other' }, List => 'Bag' }, + SubjectCode => { Groups => { 2 => 'Other' }, List => 'Bag' }, + # Copyright - have seen this in a sample (Jan 2021), but I think it is non-standard + # new IPTC Core 1.3 properties + AltTextAccessibility => { Groups => { 2 => 'Other' }, Writable => 'lang-alt' }, + ExtDescrAccessibility => { Groups => { 2 => 'Other' }, Writable => 'lang-alt' }, +); + +# Adobe Lightroom namespace properties (lr) (ref PH) +%Image::ExifTool::XMP::Lightroom = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-lr', 2 => 'Image' }, + NAMESPACE => 'lr', + TABLE_DESC => 'XMP Adobe Lightroom', + NOTES => 'Adobe Lightroom "lr" namespace tags.', + privateRTKInfo => { }, + hierarchicalSubject => { List => 'Bag' }, + weightedFlatSubject => { List => 'Bag' }, +); + +# Adobe Album namespace properties (album) (ref PH) +%Image::ExifTool::XMP::Album = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-album', 2 => 'Image' }, + NAMESPACE => 'album', + TABLE_DESC => 'XMP Adobe Album', + NOTES => 'Adobe Album namespace tags.', + Notes => { }, +); + +# table to add tags in other namespaces +%Image::ExifTool::XMP::other = ( + GROUPS => { 2 => 'Unknown' }, + LANG_INFO => \&GetLangInfo, +); + +# Composite XMP tags +%Image::ExifTool::XMP::Composite = ( + # get latitude/longitude reference from XMP lat/long tags + # (used to set EXIF GPS position from XMP tags) + GPSLatitudeRef => { + Require => 'XMP-exif:GPSLatitude', + Groups => { 2 => 'Location' }, + # Note: Do not Inihibit based on EXIF:GPSLatitudeRef (see forum10192) + ValueConv => q{ + IsFloat($val[0]) and return $val[0] < 0 ? "S" : "N"; + $val[0] =~ /^.*([NS])/; + return $1; + }, + PrintConv => { N => 'North', S => 'South' }, + }, + GPSLongitudeRef => { + Require => 'XMP-exif:GPSLongitude', + Groups => { 2 => 'Location' }, + ValueConv => q{ + IsFloat($val[0]) and return $val[0] < 0 ? "W" : "E"; + $val[0] =~ /^.*([EW])/; + return $1; + }, + PrintConv => { E => 'East', W => 'West' }, + }, + GPSDestLatitudeRef => { + Require => 'XMP-exif:GPSDestLatitude', + Groups => { 2 => 'Location' }, + ValueConv => q{ + IsFloat($val[0]) and return $val[0] < 0 ? "S" : "N"; + $val[0] =~ /^.*([NS])/; + return $1; + }, + PrintConv => { N => 'North', S => 'South' }, + }, + GPSDestLongitudeRef => { + Require => 'XMP-exif:GPSDestLongitude', + Groups => { 2 => 'Location' }, + ValueConv => q{ + IsFloat($val[0]) and return $val[0] < 0 ? "W" : "E"; + $val[0] =~ /^.*([EW])/; + return $1; + }, + PrintConv => { E => 'East', W => 'West' }, + }, + LensID => { + Notes => 'attempt to convert numerical XMP-aux:LensID stored by Adobe applications', + Require => { + 0 => 'XMP-aux:LensID', + 1 => 'Make', + }, + Desire => { + 2 => 'LensInfo', + 3 => 'FocalLength', + 4 => 'LensModel', + 5 => 'MaxApertureValue', + }, + Inhibit => { + 6 => 'Composite:LensID', # don't override existing Composite:LensID + }, + Groups => { 2 => 'Camera' }, + ValueConv => '$val', + PrintConv => 'Image::ExifTool::XMP::PrintLensID($self, @val)', + }, + Flash => { + Notes => 'facilitates copying camera flash information between XMP and EXIF', + Desire => { + 0 => 'XMP:FlashFired', + 1 => 'XMP:FlashReturn', + 2 => 'XMP:FlashMode', + 3 => 'XMP:FlashFunction', + 4 => 'XMP:FlashRedEyeMode', + 5 => 'XMP:Flash', # handle structured flash information too + }, + Groups => { 2 => 'Camera' }, + Writable => 1, + PrintHex => 1, + SeparateTable => 'EXIF Flash', + ValueConv => q{ + if (ref $val[5] eq 'HASH') { + # copy structure fields into value array + my $i = 0; + $val[$i++] = $val[5]{$_} foreach qw(Fired Return Mode Function RedEyeMode); + } + return((($val[0] and lc($val[0]) eq 'true') ? 0x01 : 0) | + (($val[1] || 0) << 1) | + (($val[2] || 0) << 3) | + (($val[3] and lc($val[3]) eq 'true') ? 0x20 : 0) | + (($val[4] and lc($val[4]) eq 'true') ? 0x40 : 0)); + }, + PrintConv => \%Image::ExifTool::Exif::flash, + WriteAlso => { + 'XMP:FlashFired' => '$val & 0x01 ? "True" : "False"', + 'XMP:FlashReturn' => '($val & 0x06) >> 1', + 'XMP:FlashMode' => '($val & 0x18) >> 3', + 'XMP:FlashFunction' => '$val & 0x20 ? "True" : "False"', + 'XMP:FlashRedEyeMode' => '$val & 0x40 ? "True" : "False"', + }, + }, +); + +# add our composite tags +Image::ExifTool::AddCompositeTags('Image::ExifTool::XMP'); + +#------------------------------------------------------------------------------ +# AutoLoad our writer routines when necessary +# +sub AUTOLOAD +{ + return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_); +} + +#------------------------------------------------------------------------------ +# Escape necessary XML characters in UTF-8 string +# Inputs: 0) string to be escaped +# Returns: escaped string +my %charName = ('"'=>'quot', '&'=>'amp', "'"=>'#39', '<'=>'lt', '>'=>'gt'); +sub EscapeXML($) +{ + my $str = shift; + $str =~ s/([&><'"])/&$charName{$1};/sg; # escape necessary XML characters + return $str; +} + +#------------------------------------------------------------------------------ +# Unescape XML character references (entities and numerical) +# Inputs: 0) string to be unescaped +# 1) optional hash reference to convert entity names to numbers +# 2) optional character encoding +# Returns: unescaped string +my %charNum = ('quot'=>34, 'amp'=>38, 'apos'=>39, 'lt'=>60, 'gt'=>62); +sub UnescapeXML($;$$) +{ + my ($str, $conv, $enc) = @_; + $conv = \%charNum unless $conv; + $str =~ s/&(#?\w+);/UnescapeChar($1,$conv,$enc)/sge; + return $str; +} + +#------------------------------------------------------------------------------ +# Escape string for XML, ensuring valid XML and UTF-8 +# Inputs: 0) string +# Returns: escaped string +sub FullEscapeXML($) +{ + my $str = shift; + $str =~ s/([&><'"])/&$charName{$1};/sg; # escape necessary XML characters + $str =~ s/\\/&#92;/sg; # escape backslashes too + # then use C-escape sequences for invalid characters + if ($str =~ /[\0-\x1f]/ or IsUTF8(\$str) < 0) { + $str =~ s/([\0-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/sge; + } + return $str; +} + +#------------------------------------------------------------------------------ +# Unescape XML/C escaped string +# Inputs: 0) string +# Returns: unescaped string +sub FullUnescapeXML($) +{ + my $str = shift; + # unescape C escape sequences first + $str =~ s/\\x([\da-f]{2})/chr(hex($1))/sge; + my $conv = \%charNum; + $str =~ s/&(#?\w+);/UnescapeChar($1,$conv)/sge; + return $str; +} + +#------------------------------------------------------------------------------ +# Convert XML character reference to UTF-8 +# Inputs: 0) XML character reference stripped of the '&' and ';' (eg. 'quot', '#34', '#x22') +# 1) hash reference for looking up character numbers by name +# 2) optional character encoding (default 'UTF8') +# Returns: UTF-8 equivalent (or original character on conversion error) +sub UnescapeChar($$;$) +{ + my ($ch, $conv, $enc) = @_; + my $val = $$conv{$ch}; + unless (defined $val) { + if ($ch =~ /^#x([0-9a-fA-F]+)$/) { + $val = hex($1); + } elsif ($ch =~ /^#(\d+)$/) { + $val = $1; + } else { + return "&$ch;"; # should issue a warning here? [no] + } + } + return chr($val) if $val < 0x80; # simple ASCII + $val = $] >= 5.006001 ? pack('C0U', $val) : Image::ExifTool::PackUTF8($val); + $val = Image::ExifTool::Decode(undef, $val, 'UTF8', undef, $enc) if $enc and $enc ne 'UTF8'; + return $val; +} + +#------------------------------------------------------------------------------ +# Does a string contain valid UTF-8 characters? +# Inputs: 0) string reference, 1) true to allow last character to be truncated +# Returns: 0=regular ASCII, -1=invalid UTF-8, 1=valid UTF-8 with maximum 16-bit +# wide characters, 2=valid UTF-8 requiring 32-bit wide characters +# Notes: Changes current string position +# (see http://www.fileformat.info/info/unicode/utf8.htm for help understanding this) +sub IsUTF8($;$) +{ + my ($strPt, $trunc) = @_; + pos($$strPt) = 0; # start at beginning of string + return 0 unless $$strPt =~ /([\x80-\xff])/g; + my $rtnVal = 1; + for (;;) { + my $ch = ord($1); + # minimum lead byte for 2-byte sequence is 0xc2 (overlong sequences + # not allowed), 0xf8-0xfd are restricted by RFC 3629 (no 5 or 6 byte + # sequences), and 0xfe and 0xff are not valid in UTF-8 strings + return -1 if $ch < 0xc2 or $ch >= 0xf8; + # determine number of bytes remaining in sequence + my $n; + if ($ch < 0xe0) { + $n = 1; + } elsif ($ch < 0xf0) { + $n = 2; + } else { + $n = 3; + # character code is greater than 0xffff if more than 2 extra bytes + # were required in the UTF-8 character + $rtnVal = 2; + } + my $pos = pos $$strPt; + unless ($$strPt =~ /\G([\x80-\xbf]{$n})/g) { + return $rtnVal if $trunc and $pos + $n > length $$strPt; + return -1; + } + # the following is ref https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c + if ($n == 2) { + return -1 if ($ch == 0xe0 and (ord($1) & 0xe0) == 0x80) or + ($ch == 0xed and (ord($1) & 0xe0) == 0xa0) or + ($ch == 0xef and ord($1) == 0xbf and + (ord(substr $1, 1) & 0xfe) == 0xbe); + } else { + return -1 if ($ch == 0xf0 and (ord($1) & 0xf0) == 0x80) or + ($ch == 0xf4 and ord($1) > 0x8f) or $ch > 0xf4; + } + last unless $$strPt =~ /([\x80-\xff])/g; + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Fix malformed UTF8 (by replacing bad bytes with specified character) +# Inputs: 0) string reference, 1) string to replace each bad byte, +# may be '' to delete bad bytes, or undef to use '?' +# Returns: true if string was fixed, and updates string +sub FixUTF8($;$) +{ + my ($strPt, $bad) = @_; + my $fixed; + pos($$strPt) = 0; # start at beginning of string + for (;;) { + last unless $$strPt =~ /([\x80-\xff])/g; + my $ch = ord($1); + my $pos = pos($$strPt); + # (see comments in IsUTF8() above) + if ($ch >= 0xc2 and $ch < 0xf8) { + my $n = $ch < 0xe0 ? 1 : ($ch < 0xf0 ? 2 : 3); + if ($$strPt =~ /\G([\x80-\xbf]{$n})/g) { + next if $n == 1; + if ($n == 2) { + next unless ($ch == 0xe0 and (ord($1) & 0xe0) == 0x80) or + ($ch == 0xed and (ord($1) & 0xe0) == 0xa0) or + ($ch == 0xef and ord($1) == 0xbf and + (ord(substr $1, 1) & 0xfe) == 0xbe); + } else { + next unless ($ch == 0xf0 and (ord($1) & 0xf0) == 0x80) or + ($ch == 0xf4 and ord($1) > 0x8f) or $ch > 0xf4; + } + } + } + # replace bad character + $bad = '?' unless defined $bad; + substr($$strPt, $pos-1, 1) = $bad; + pos($$strPt) = $pos-1 + length $bad; + $fixed = 1; + } + return $fixed; +} + +#------------------------------------------------------------------------------ +# Utility routine to decode a base64 string +# Inputs: 0) base64 string +# Returns: reference to decoded data +sub DecodeBase64($) +{ + local($^W) = 0; # unpack('u',...) gives bogus warning in 5.00[123] + my $str = shift; + + # truncate at first unrecognized character (base 64 data + # may only contain A-Z, a-z, 0-9, +, /, =, or white space) + $str =~ s/[^A-Za-z0-9+\/= \t\n\r\f].*//s; + # translate to uucoded and remove padding and white space + $str =~ tr/A-Za-z0-9+\/= \t\n\r\f/ -_/d; + + # convert the data to binary in chunks + my $chunkSize = 60; + my $uuLen = pack('c', 32 + $chunkSize * 3 / 4); # calculate length byte + my $dat = ''; + my ($i, $substr); + # loop through the whole chunks + my $len = length($str) - $chunkSize; + for ($i=0; $i<=$len; $i+=$chunkSize) { + $substr = substr($str, $i, $chunkSize); # get a chunk of the data + $dat .= unpack('u', $uuLen . $substr); # decode it + } + $len += $chunkSize; + # handle last partial chunk if necessary + if ($i < $len) { + $uuLen = pack('c', 32 + ($len-$i) * 3 / 4); # recalculate length + $substr = substr($str, $i, $len-$i); # get the last partial chunk + $dat .= unpack('u', $uuLen . $substr); # decode it + } + return \$dat; +} + +#------------------------------------------------------------------------------ +# Generate a tag ID for this XMP tag +# Inputs: 0) tag property name list ref, 1) array ref for receiving structure property list +# 2) array for receiving namespace list +# Returns: tagID and outtermost interesting namespace (or '' if no namespace) +sub GetXMPTagID($;$$) +{ + my ($props, $structProps, $nsList) = @_; + my ($tag, $prop, $namespace); + foreach $prop (@$props) { + # split name into namespace and property name + # (Note: namespace can be '' for property qualifiers) + my ($ns, $nm) = ($prop =~ /(.*?):(.*)/) ? ($1, $2) : ('', $prop); + if ($ignoreNamespace{$ns} or $ignoreProp{$prop}) { + # special case: don't ignore rdf numbered items + # (not technically allowed in XMP, but used in RDF/XML) + unless ($prop =~ /^rdf:(_\d+)$/) { + # save list index if necessary for structures + if ($structProps and @$structProps and $prop =~ /^rdf:li (\d+)$/) { + push @{$$structProps[-1]}, $1; + } + next; + } + $tag .= $1 if defined $tag; + } else { + $nm =~ s/ .*//; # remove nodeID if it exists + # all uppercase is ugly, so convert it + if ($nm !~ /[a-z]/) { + my $xlat = $stdXlatNS{$ns} || $ns; + my $info = $Image::ExifTool::XMP::Main{$xlat}; + my $table; + if (ref $info eq 'HASH' and $$info{SubDirectory}) { + $table = GetTagTable($$info{SubDirectory}{TagTable}); + } + unless ($table and $$table{$nm}) { + $nm = lc($nm); + $nm =~ s/_([a-z])/\u$1/g; + } + } + if (defined $tag) { + $tag .= ucfirst($nm); # add to tag name + } else { + $tag = $nm; + } + # save structure information if necessary + if ($structProps) { + push @$structProps, [ $nm ]; + push @$nsList, $ns if $nsList; + } + } + # save namespace of first property to contribute to tag name + $namespace = $ns unless $namespace; + } + if (wantarray) { + return ($tag, $namespace || ''); + } else { + return $tag; + } +} + +#------------------------------------------------------------------------------ +# Register namespace for specified user-defined table +# Inputs: 0) tag/structure table ref +# Returns: namespace prefix +sub RegisterNamespace($) +{ + my $table = shift; + return $$table{NAMESPACE} unless ref $$table{NAMESPACE}; + my $nsRef = $$table{NAMESPACE}; + # recognize as either a list or hash + my $ns; + if (ref $nsRef eq 'ARRAY') { + $ns = $$nsRef[0]; + $nsURI{$ns} = $$nsRef[1]; + $uri2ns{$$nsRef[1]} = $ns; + } else { # must be a hash + my @ns = sort keys %$nsRef; # allow multiple namespace definitions + while (@ns) { + $ns = pop @ns; + if ($nsURI{$ns} and $nsURI{$ns} ne $$nsRef{$ns}) { + warn "User-defined namespace prefix '${ns}' conflicts with existing namespace\n"; + } + $nsURI{$ns} = $$nsRef{$ns}; + $uri2ns{$$nsRef{$ns}} = $ns; + } + } + return $$table{NAMESPACE} = $ns; +} + +#------------------------------------------------------------------------------ +# Generate flattened tags and add to table +# Inputs: 0) tag table ref, 1) tag ID for Struct tag (if not defined, whole table is done), +# 2) flag to not expand sub-structures +# Returns: number of tags added (not counting those just initialized) +# Notes: Must have verified that $$tagTablePtr{$tagID}{Struct} exists before calling this routine +# - makes sure that the tagInfo Struct is a HASH reference +sub AddFlattenedTags($;$$) +{ + local $_; + my ($tagTablePtr, $tagID, $noSubStruct) = @_; + my $count = 0; + my @tagIDs; + + if (defined $tagID) { + push @tagIDs, $tagID; + } else { + foreach $tagID (TagTableKeys($tagTablePtr)) { + my $tagInfo = $$tagTablePtr{$tagID}; + next unless ref $tagInfo eq 'HASH' and $$tagInfo{Struct}; + push @tagIDs, $tagID; + } + } + + # loop through specified tags + foreach $tagID (@tagIDs) { + + my $tagInfo = $$tagTablePtr{$tagID}; + + $$tagInfo{Flattened} and next; # only generate flattened tags once + $$tagInfo{Flattened} = 1; + + my $strTable = $$tagInfo{Struct}; + unless (ref $strTable) { # (allow a structure name for backward compatibility only) + my $strName = $strTable; + $strTable = $Image::ExifTool::UserDefined::xmpStruct{$strTable} or next; + $$strTable{STRUCT_NAME} or $$strTable{STRUCT_NAME} = "XMP $strName"; + $$tagInfo{Struct} = $strTable; # replace old-style name with HASH ref + delete $$tagInfo{SubDirectory}; # deprecated use of SubDirectory in Struct tags + } + + # get prefix for flattened tag names + my $flat = (defined $$tagInfo{FlatName} ? $$tagInfo{FlatName} : $$tagInfo{Name}); + + # get family 2 group name for this structure tag + my ($tagG2, $field); + $tagG2 = $$tagInfo{Groups}{2} if $$tagInfo{Groups}; + $tagG2 or $tagG2 = $$tagTablePtr{GROUPS}{2}; + + foreach $field (keys %$strTable) { + next if $specialStruct{$field}; + my $fieldInfo = $$strTable{$field}; + next if $$fieldInfo{LangCode}; # don't flatten lang-alt tags + next if $$fieldInfo{Struct} and $noSubStruct; # don't expand sub-structures if specified + # build a tag ID for the corresponding flattened tag + my $fieldName = ucfirst($field); + my $flatField = $$fieldInfo{FlatName} || $fieldName; + my $flatID = $tagID . $fieldName; + my $flatInfo = $$tagTablePtr{$flatID}; + if ($flatInfo) { + ref $flatInfo eq 'HASH' or warn("$flatInfo is not a HASH!\n"), next; # (to be safe) + # pre-defined flattened tags should have Flat flag set + if (not defined $$flatInfo{Flat}) { + next if $$flatInfo{NotFlat}; + warn "Missing Flat flag for $$flatInfo{Name}\n" if $Image::ExifTool::debug; + } + $$flatInfo{Flat} = 0; + # copy all missing entries from field information + foreach (keys %$fieldInfo) { + # must not copy PropertyPath (but can't delete it afterwards + # because the flat tag may already have this set) + next if $_ eq 'PropertyPath' or defined $$flatInfo{$_}; + # copy the property (making a copy of the Groups hash) + $$flatInfo{$_} = $_ eq 'Groups' ? { %{$$fieldInfo{$_}} } : $$fieldInfo{$_}; + } + # (NOTE: Can NOT delete Groups because we need them if GotGroups was done) + # re-generate List flag unless it is set to 0 + delete $$flatInfo{List} if $$flatInfo{List}; + } else { + # generate new flattened tag information based on structure field + my $flatName = $flat . $flatField; + $flatInfo = { %$fieldInfo, Name => $flatName, Flat => 0 }; + $$flatInfo{FlatName} = $flatName if $$fieldInfo{FlatName}; + # make a copy of the Groups hash if necessary + $$flatInfo{Groups} = { %{$$fieldInfo{Groups}} } if $$fieldInfo{Groups}; + # add new flattened tag to table + AddTagToTable($tagTablePtr, $flatID, $flatInfo); + ++$count; + } + # propagate List flag (unless set to 0 in pre-defined flattened tag) + unless (defined $$flatInfo{List}) { + $$flatInfo{List} = $$fieldInfo{List} || 1 if $$fieldInfo{List} or $$tagInfo{List}; + } + # set group 2 name from the first existing family 2 group in the: + # 1) structure field Groups, 2) structure table GROUPS, 3) structure tag Groups + if ($$fieldInfo{Groups} and $$fieldInfo{Groups}{2}) { + $$flatInfo{Groups}{2} = $$fieldInfo{Groups}{2}; + } elsif ($$strTable{GROUPS} and $$strTable{GROUPS}{2}) { + $$flatInfo{Groups}{2} = $$strTable{GROUPS}{2}; + } else { + $$flatInfo{Groups}{2} = $tagG2; + } + # save reference to top-level structure + $$flatInfo{RootTagInfo} = $$tagInfo{RootTagInfo} || $tagInfo; + # recursively generate flattened tags for sub-structures + next unless $$flatInfo{Struct}; + length($flatID) > 250 and warn("Possible deep recursion for tag $flatID\n"), last; + # reset flattened tag just in case we flattened hierarchy in the wrong order + # because we must start from the outtermost structure to get the List flags right + # (this should only happen when building tag tables) + delete $$flatInfo{Flattened}; + $count += AddFlattenedTags($tagTablePtr, $flatID, $$flatInfo{NoSubStruct}); + } + } + return $count; +} + +#------------------------------------------------------------------------------ +# Get localized version of tagInfo hash +# Inputs: 0) tagInfo hash ref, 1) language code (eg. "x-default") +# Returns: new tagInfo hash ref, or undef if invalid +sub GetLangInfo($$) +{ + my ($tagInfo, $langCode) = @_; + # only allow alternate language tags in lang-alt lists + return undef unless $$tagInfo{Writable} and $$tagInfo{Writable} eq 'lang-alt'; + $langCode =~ tr/_/-/; # RFC 3066 specifies '-' as a separator + my $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $langCode); + return $langInfo; +} + +#------------------------------------------------------------------------------ +# Get standard case for language code +# Inputs: 0) Language code +# Returns: Language code in standard case +sub StandardLangCase($) +{ + my $lang = shift; + # make 2nd subtag uppercase only if it is 2 letters + return lc($1) . uc($2) . lc($3) if $lang =~ /^([a-z]{2,3}|[xi])(-[a-z]{2})\b(.*)/i; + return lc($lang); +} + +#------------------------------------------------------------------------------ +# Scan for XMP in a file +# Inputs: 0) ExifTool object ref, 1) RAF reference +# Returns: 1 if xmp was found, 0 otherwise +# Notes: Currently only recognizes UTF8-encoded XMP +sub ScanForXMP($$) +{ + my ($et, $raf) = @_; + my ($buff, $xmp); + my $lastBuff = ''; + + $et->VPrint(0,"Scanning for XMP\n"); + for (;;) { + defined $buff or $raf->Read($buff, 65536) or return 0; + unless (defined $xmp) { + $lastBuff .= $buff; + unless ($lastBuff =~ /(<\?xpacket begin=)/g) { + # must keep last 15 bytes to match 16-byte "xpacket begin" string + $lastBuff = length($buff) <= 15 ? $buff : substr($buff, -15); + undef $buff; + next; + } + $xmp = $1; + $buff = substr($lastBuff, pos($lastBuff)); + } + my $pos = length($xmp) - 18; # (18 = length("<?xpacket end...") - 1) + $xmp .= $buff; # add new data to our XMP + pos($xmp) = $pos if $pos > 0; # set start for "xpacket end" scan + if ($xmp =~ /<\?xpacket end=['"][wr]['"]\?>/g) { + $buff = substr($xmp, pos($xmp)); # save data after end of XMP + $xmp = substr($xmp, 0, pos($xmp)); # isolate XMP + # check XMP for validity (not valid if it contains null bytes) + $pos = rindex($xmp, "\0") + 1 or last; + $lastBuff = substr($xmp, $pos); # re-parse beginning after last null byte + undef $xmp; + } else { + undef $buff; + } + } + unless ($$et{VALUE}{FileType}) { + $$et{FILE_TYPE} = $$et{FILE_EXT}; + $et->SetFileType('<unknown file containing XMP>', undef, ''); + } + my %dirInfo = ( + DataPt => \$xmp, + DirLen => length $xmp, + DataLen => length $xmp, + ); + ProcessXMP($et, \%dirInfo); + return 1; +} + +#------------------------------------------------------------------------------ +# Print conversion for XMP-aux:LensID +# Inputs: 0) ExifTool ref, 1) LensID, 2) Make, 3) LensInfo, 4) FocalLength, +# 5) LensModel, 6) MaxApertureValue +# (yes, this is ugly -- blame Adobe) +sub PrintLensID(@) +{ + local $_; + my ($et, $id, $make, $info, $focalLength, $lensModel, $maxAv) = @_; + my ($mk, $printConv); + my %alt = ( Pentax => 'Ricoh' ); # Pentax changed its name to Ricoh + # missing: Olympus (no XMP:LensID written by Adobe) + foreach $mk (qw(Canon Nikon Pentax Sony Sigma Samsung Leica)) { + next unless $make =~ /$mk/i or ($alt{$mk} and $make =~ /$alt{$mk}/i); + # get name of module containing the lens lookup (default "Make.pm") + my $mod = { Sigma => 'SigmaRaw', Leica => 'Panasonic' }->{$mk} || $mk; + require "Image/ExifTool/$mod.pm"; + # get the name of the lens name lookup (default "makeLensTypes") + # (canonLensTypes, pentaxLensTypes, nikonLensIDs, etc) + my $convName = "Image::ExifTool::${mod}::" . + ({ Nikon => 'nikonLensIDs' }->{$mk} || lc($mk) . 'LensTypes'); + no strict 'refs'; + %$convName or last; + my $printConv = \%$convName; + use strict 'refs'; + # sf = short focal + # lf = long focal + # sa = max aperture at short focal + # la = max aperture at long focal + my ($sf, $lf, $sa, $la); + if ($info) { + my @a = split ' ', $info; + $_ eq 'undef' and $_ = undef foreach @a; + ($sf, $lf, $sa, $la) = @a; + # for Sony and ambiguous LensID, $info data may be incorrect: + # use only if it agrees with $focalLength and $maxAv (ref JR) + if ($mk eq 'Sony' and + (($focalLength and (($sf and $focalLength < $sf - 0.5) or + ($lf and $focalLength > $lf + 0.5))) or + ($maxAv and (($sa and $maxAv < $sa - 0.15) or + ($la and $maxAv > $la + 0.15))))) + { + undef $sf; + undef $lf; + undef $sa; + undef $la; + } elsif ($maxAv) { + # (using the short-focal-length max aperture in place of MaxAperture + # is a bad approximation, so don't do this if MaxApertureValue exists) + undef $sa; + } + } + if ($mk eq 'Pentax' and $id =~ /^\d+$/) { + # for Pentax, CS4 stores an int16u, but we use 2 x int8u + $id = join(' ', unpack('C*', pack('n', $id))); + } + # Nikon is a special case because Adobe doesn't store the full LensID + # (Apple Photos does, but we have to convert back to hex) + if ($mk eq 'Nikon') { + $id = sprintf('%X', $id); + $id = "0$id" if length($id) & 0x01; # pad with leading 0 if necessary + $id =~ s/(..)/$1 /g and $id =~ s/ $//; # put spaces between bytes + my (%newConv, %used); + my $i = 0; + foreach (grep /^$id/, keys %$printConv) { + my $lens = $$printConv{$_}; + next if $used{$lens}; # avoid duplicates + $used{$lens} = 1; + $newConv{$i ? "$id.$i" : $id} = $lens; + ++$i; + } + $printConv = \%newConv; + } + my $str = $$printConv{$id} || "Unknown ($id)"; + return Image::ExifTool::Exif::PrintLensID($et, $str, $printConv, + undef, $id, $focalLength, $sa, $maxAv, $sf, $lf, $lensModel); + } + return "Unknown ($id)"; +} + +#------------------------------------------------------------------------------ +# Convert XMP date/time to EXIF format +# Inputs: 0) XMP date/time string, 1) set if we aren't sure this is a date +# Returns: EXIF date/time +sub ConvertXMPDate($;$) +{ + my ($val, $unsure) = @_; + if ($val =~ /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}:\d{2})(:\d{2})?\s*(\S*)$/) { + my $s = $5 || ''; # seconds may be missing + $val = "$1:$2:$3 $4$s$6"; # convert back to EXIF time format + } elsif (not $unsure and $val =~ /^(\d{4})(-\d{2}){0,2}/) { + $val =~ tr/-/:/; + } + return $val; +} + +#------------------------------------------------------------------------------ +# Convert rational string value +# Inputs: 0) string (converted to number, 'inf' or 'undef' on return if rational) +# Returns: true if value was converted +sub ConvertRational($) +{ + my $val = $_[0]; + $val =~ m{^(-?\d+)/(-?\d+)$} or return undef; + if ($2 != 0) { + $_[0] = $1 / $2; # calculate quotient + } elsif ($1) { + $_[0] = 'inf'; + } else { + $_[0] = 'undef'; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Convert a string of floating point values to rationals +# Inputs: 0) string of floating point numbers separated by spaces +# Returns: string of rational numbers separated by spaces +sub ConvertRationalList($) +{ + my $val = shift; + my @vals = split ' ', $val; + return $val unless @vals == 4; + foreach (@vals) { + ConvertRational($_) or return $val; + } + return join ' ', @vals; +} + +#------------------------------------------------------------------------------ +# We found an XMP property name/value +# Inputs: 0) ExifTool object ref, 1) Pointer to tag table +# 2) reference to array of XMP property names (last is current property) +# 3) property value, 4) attribute hash ref (for 'xml:lang' or 'rdf:datatype') +# Returns: 1 if valid tag was found +sub FoundXMP($$$$;$) +{ + local $_; + my ($et, $tagTablePtr, $props, $val, $attrs) = @_; + my ($lang, @structProps, $rawVal, $rational); + my ($tag, $ns) = GetXMPTagID($props, $$et{OPTIONS}{Struct} ? \@structProps : undef); + return 0 unless $tag; # ignore things that aren't valid tags + + # translate namespace if necessary + $ns = $stdXlatNS{$ns} if $stdXlatNS{$ns}; + my $info = $$tagTablePtr{$ns}; + my ($table, $added, $xns, $tagID); + if ($info) { + $table = $$info{SubDirectory}{TagTable} or warn "Missing TagTable for $tag!\n"; + } elsif ($$props[0] eq 'svg:svg') { + if (not $ns) { + # disambiguate MetadataID by adding back the 'metadata' we ignored + $tag = 'metadataId' if $tag eq 'id' and $$props[1] eq 'svg:metadata'; + # use SVG namespace in SVG files if nothing better to use + $table = 'Image::ExifTool::XMP::SVG'; + } elsif (not grep /^rdf:/, @$props) { + # only other SVG information if not inside RDF (call it XMP if in RDF) + $table = 'Image::ExifTool::XMP::otherSVG'; + } + } + + my $xmlGroups; + my $grp0 = $$tagTablePtr{GROUPS}{0}; + if (not $ns and $grp0 ne 'XMP') { + $tagID = $tag; + } elsif ($grp0 eq 'XML' and not $table) { + # this is an XML table (no namespace lookup) + $tagID = "$ns:$tag"; + } else { + $xmlGroups = 1 if $grp0 eq 'XML'; + # look up this tag in the appropriate table + $table or $table = 'Image::ExifTool::XMP::other'; + $tagTablePtr = GetTagTable($table); + if ($$tagTablePtr{NAMESPACE}) { + $tagID = $tag; + } else { + $xns = $xmpNS{$ns}; + unless (defined $xns) { + $xns = $ns; + # validate namespace prefix + unless ($ns =~ /^[A-Z_a-z\x80-\xff][-.0-9A-Z_a-z\x80-\xff]*$/ or $ns eq '') { + $et->Warn("Invalid XMP namespace prefix '${ns}'"); + # clean up prefix for use as an ExifTool group name + $ns =~ tr/-.0-9A-Z_a-z\x80-\xff//dc; + $ns =~ /^[A-Z_a-z\x80-\xff]/ or $ns = "ns_$ns"; + $stdXlatNS{$xns} = $ns; + $xmpNS{$ns} = $xns; + } + } + # add XMP namespace prefix to avoid collisions in variable-namespace tables + $tagID = "$xns:$tag"; + # add namespace to top-level structure property + $structProps[0][0] = "$xns:" . $structProps[0][0] if @structProps; + } + } + my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID); + + $lang = $$attrs{'xml:lang'} if $attrs; + + # must add a new tag table entry if this tag isn't pre-defined + # (or initialize from structure field if this is a pre-defined flattened tag) +NoLoop: + while (not $tagInfo or $$tagInfo{Flat}) { + my (@tagList, @nsList); + GetXMPTagID($props, \@tagList, \@nsList); + my ($ta, $t, $ti, $addedFlat, $i, $j); + # build tag ID strings for each level in the property path + foreach $ta (@tagList) { + # insert tag ID in index 1 of tagList list + $t = $$ta[1] = $t ? $t . ucfirst($$ta[0]) : $$ta[0]; + # generate flattened tags for top-level structure if necessary + next if defined $addedFlat; + $ti = $$tagTablePtr{$t} or next; + next unless ref $ti eq 'HASH' and $$ti{Struct}; + $addedFlat = AddFlattenedTags($tagTablePtr, $t); + # all done if we generated the tag we are looking for + $tagInfo = $$tagTablePtr{$tagID} and last NoLoop if $addedFlat; + } + my $name = ucfirst($tag); + + # search for the innermost containing structure + # (in case tag is an unknown field in a known structure) + # (only necessary if we found a structure above) + if (defined $addedFlat) { + my $t2 = ''; + for ($i=$#tagList-1; $i>=0; --$i) { + $t = $tagList[$i][1]; + $t2 = $tagList[$i+1][0] . ucfirst($t2); # build relative tag id + $ti = $$tagTablePtr{$t} or next; + next unless ref $ti eq 'HASH'; + my $strTable = $$ti{Struct} or next; + my $flat = (defined $$ti{FlatName} ? $$ti{FlatName} : $$ti{Name}); + $name = $flat . ucfirst($t2); + # don't continue if structure is known but field is not + last if $$strTable{NAMESPACE} or not exists $$strTable{NAMESPACE}; + # this is a variable-namespace structure, so we must: + # 1) get tagInfo from corresponding top-level XMP tag if it exists + # 2) add new entry in this tag table, but with namespace prefix on tag ID + my $n = $nsList[$i+1]; # namespace of structure field + # translate to standard ExifTool namespace + $n = $stdXlatNS{$n} if $stdXlatNS{$n}; + my $xn = $xmpNS{$n} || $n; # standard XMP namespace + # no need to continue with variable-namespace logic if + # we are in our own namespace (right?) + last if $xn eq ($$tagTablePtr{NAMESPACE} || ''); + $tagID = "$xn:$tag"; # add namespace to avoid collisions + # change structure properties to add the standard XMP namespace + # prefix for this field (needed for variable-namespace fields) + if (@structProps) { + $structProps[$i+1][0] = "$xn:" . $structProps[$i+1][0]; + } + # copy tagInfo entries from the existing top-level XMP tag + my $tg = $Image::ExifTool::XMP::Main{$n}; + last unless ref $tg eq 'HASH' and $$tg{SubDirectory}; + my $tbl = GetTagTable($$tg{SubDirectory}{TagTable}) or last; + my $sti = $et->GetTagInfo($tbl, $t2); + if (not $sti or $$sti{Flat}) { + # again, we must initialize flattened tags if necessary + # (but don't bother to recursively apply full logic to + # allow nested variable-namespace strucures until someone + # actually wants to do such a silly thing) + my $t3 = ''; + for ($j=$i+1; $j<@tagList; ++$j) { + $t3 = $tagList[$j][0] . ucfirst($t3); + my $ti3 = $$tbl{$t3} or next; + next unless ref $ti3 eq 'HASH' and $$ti3{Struct}; + last unless AddFlattenedTags($tbl, $t3); + $sti = $$tbl{$t2}; + last; + } + last unless $sti; + } + # generate new tagInfo hash based on existing top-level tag + $tagInfo = { %$sti, Name => $flat . $$sti{Name} }; + # be careful not to copy elements we shouldn't... + delete $$tagInfo{Description}; # Description will be different + # can't copy group hash because group 1 will be different and + # we need to check this when writing tag to a specific group + delete $$tagInfo{Groups}; + $$tagInfo{Groups}{2} = $$sti{Groups}{2} if $$sti{Groups}; + last; + } + } + # generate a default tagInfo hash if necessary + unless ($tagInfo) { + # shorten tag name if necessary + if ($$et{ShortenXmpTags}) { + my $shorten = $$et{ShortenXmpTags}; + $name = &$shorten($name); + } + $tagInfo = { Name => $name, IsDefault => 1, Priority => 0 }; + } + # add tag Namespace entry for tags in variable-namespace tables + $$tagInfo{Namespace} = $xns if $xns; + if ($$et{curURI}{$ns} and $$et{curURI}{$ns} =~ m{^http://ns.exiftool.(?:ca|org)/(.*?)/(.*?)/}) { + my %grps = ( 0 => $1, 1 => $2 ); + # apply a little magic to recover original group names + # from this exiftool-written RDF/XML file + if ($grps{1} =~ /^\d/) { + # URI's with only family 0 are internal tags from the source file, + # so change the group name to avoid confusion with tags from this file + $grps{1} = "XML-$grps{0}"; + $grps{0} = 'XML'; + } + $$tagInfo{Groups} = \%grps; + # flag to avoid setting group 1 later + $$tagInfo{StaticGroup1} = 1; + } + # construct tag information for this unknown tag + # -> make this a List or lang-alt tag if necessary + if (@$props > 2 and $$props[-1] =~ /^rdf:li \d+$/ and + $$props[-2] =~ /^rdf:(Bag|Seq|Alt)$/) + { + if ($lang and $1 eq 'Alt') { + $$tagInfo{Writable} = 'lang-alt'; + } else { + $$tagInfo{List} = $1; + } + # tried this, but maybe not a good idea for complex structures: + #} elsif (grep / /, @$props) { + # $$tagInfo{List} = 1; + } + # save property list for verbose "adding" message unless this tag already exists + $added = \@tagList unless $$tagTablePtr{$tagID}; + # if this is an empty structure, we must add a Struct field + if (not length $val and $$attrs{'rdf:parseType'} and $$attrs{'rdf:parseType'} eq 'Resource') { + $$tagInfo{Struct} = { STRUCT_NAME => 'XMP Unknown' }; + } + AddTagToTable($tagTablePtr, $tagID, $tagInfo); + last; + } + # decode value if necessary (et:encoding was used before exiftool 7.71) + if ($attrs) { + my $enc = $$attrs{'rdf:datatype'} || $$attrs{'et:encoding'}; + if ($enc and $enc =~ /base64/) { + $val = DecodeBase64($val); # (now a value ref) + $val = $$val unless length $$val > 100 or $$val =~ /[\0-\x08\x0b\0x0c\x0e-\x1f]/; + } + } + if (defined $lang and lc($lang) ne 'x-default') { + $lang = StandardLangCase($lang); + my $langInfo = GetLangInfo($tagInfo, $lang); + $tagInfo = $langInfo if $langInfo; + } + # un-escape XML character entities (handling CDATA) + pos($val) = 0; + if ($val =~ /<!\[CDATA\[(.*?)\]\]>/sg) { + my $p = pos $val; + # unescape everything up to the start of the CDATA section + # (the length of "<[[CDATA[]]>" is 12 characters) + my $v = UnescapeXML(substr($val, 0, $p - length($1) - 12)) . $1; + while ($val =~ /<!\[CDATA\[(.*?)\]\]>/sg) { + my $p1 = pos $val; + $v .= UnescapeXML(substr($val, $p, $p1 - length($1) - 12)) . $1; + $p = $p1; + } + $val = $v . UnescapeXML(substr($val, $p)); + } else { + $val = UnescapeXML($val); + } + # decode from UTF8 + $val = $et->Decode($val, 'UTF8'); + # convert rational and date values to a more sensible format + my $fmt = $$tagInfo{Writable}; + my $new = $$tagInfo{IsDefault} && $$et{OPTIONS}{XMPAutoConv}; + if ($fmt or $new) { + $rawVal = $val; # save raw value for verbose output + if (($new or $fmt eq 'rational') and ConvertRational($val)) { + $rational = $rawVal; + } else { + $val = ConvertXMPDate($val, $new) if $new or $fmt eq 'date'; + } + if ($$et{XmpValidate} and $fmt and $fmt eq 'boolean') { + $et->WarnOnce("Boolean value for XMP-$ns:$$tagInfo{Name} should be capitalized",1); + } + # protect against large binary data in unknown tags + $$tagInfo{Binary} = 1 if $new and length($val) > 65536; + } + # store the value for this tag + my $key = $et->FoundTag($tagInfo, $val) or return 0; + # save original components of rational numbers (used when copying) + $$et{RATIONAL}{$key} = $rational if defined $rational; + # save structure/list information if necessary + if (@structProps and (@structProps > 1 or defined $structProps[0][1]) and + not $$et{NO_STRUCT}) + { + $$et{TAG_EXTRA}{$key}{Struct} = \@structProps; + $$et{IsStruct} = 1; + } + if ($xmlGroups) { + $et->SetGroup($key, 'XML', 0); + $et->SetGroup($key, "XML-$ns", 1); + } elsif ($ns and not $$tagInfo{StaticGroup1}) { + # set group1 dynamically according to the namespace + $et->SetGroup($key, "$$tagTablePtr{GROUPS}{0}-$ns"); + } + if ($$et{OPTIONS}{Verbose}) { + if ($added) { + my $props; + if (@$added > 1) { + $$tagInfo{Flat} = 0; # this is a flattened tag + my @props = map { $$_[0] } @$added; + $props = ' (' . join('/',@props) . ')'; + } else { + $props = ''; + } + my $g1 = $et->GetGroup($key, 1); + $et->VPrint(0, $$et{INDENT}, "[adding $g1:$tag]$props\n"); + } + my $tagID = join('/',@$props); + $et->VerboseInfo($tagID, $tagInfo, Value => $rawVal || $val); + } + # allow read-only subdirectories (eg. embedded base64 XMP/IPTC in NKSC files) + if ($$tagInfo{SubDirectory} and not $$et{IsWriting}) { + my $subdir = $$tagInfo{SubDirectory}; + my $dataPt = ref $$et{VALUE}{$key} ? $$et{VALUE}{$key} : \$$et{VALUE}{$key}; + # decode if necessary (eg. Nikon XMP-ast:XMLPackets) + $dataPt = DecodeBase64($$dataPt) if $$tagInfo{Encoding} and $$tagInfo{Encoding} eq 'Base64'; + # process subdirectory information + my %dirInfo = ( + DirName => $$subdir{DirName} || $$tagInfo{Name}, + DataPt => $dataPt, + DirLen => length $$dataPt, + IgnoreProp => $$subdir{IgnoreProp}, # (allow XML to ignore specified properties) + IsExtended => 1, # (hack to avoid Duplicate warning for embedded XMP) + ); + my $oldOrder = GetByteOrder(); + SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder}; + my $oldNS = $$et{definedNS}; + delete $$et{definedNS}; + my $subTablePtr = GetTagTable($$subdir{TagTable}) || $tagTablePtr; + $et->ProcessDirectory(\%dirInfo, $subTablePtr, $$subdir{ProcessProc}); + SetByteOrder($oldOrder); + $$et{definedNS} = $oldNS; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Recursively parse nested XMP data element +# Inputs: 0) ExifTool ref, 1) tag table ref, 2) XMP data ref +# 3) offset to start of XMP element, 4) offset to end of XMP element +# 5) reference to array of enclosing XMP property names (undef if none) +# 6) reference to blank node information hash +# Returns: Number of contained XMP elements +sub ParseXMPElement($$$;$$$$) +{ + local $_; + my ($et, $tagTablePtr, $dataPt, $start, $end, $propList, $blankInfo) = @_; + my ($count, $nItems) = (0, 0); + my $isWriting = $$et{XMP_CAPTURE}; + my $isSVG = $$et{XMP_IS_SVG}; + my $saveNS; # save xlatNS lookup if changed for the scope of this element + my (%definedNS, %usedNS); # namespaces defined and used in this scope + + # get our parse procs + my ($attrProc, $foundProc); + if ($$et{XMPParseOpts}) { + $attrProc = $$et{XMPParseOpts}{AttrProc}; + $foundProc = $$et{XMPParseOpts}{FoundProc} || \&FoundXMP; + } else { + $foundProc = \&FoundXMP; + } + $start or $start = 0; + $end or $end = length $$dataPt; + $propList or $propList = [ ]; + + my $processBlankInfo; + # create empty blank node information hash if necessary + $blankInfo or $blankInfo = $processBlankInfo = { Prop => { } }; + # keep track of current nodeID at this nesting level + my $oldNodeID = $$blankInfo{NodeID}; + pos($$dataPt) = $start; + + # lookup for translating namespace prefixes + my $xlatNS = $$et{xlatNS}; + + Element: for (;;) { + # all done if there isn't enough data for another element + # (the smallest possible element is 4 bytes, eg. "<a/>") + last if pos($$dataPt) > $end - 4; + # reset nodeID before processing each element + my $nodeID = $$blankInfo{NodeID} = $oldNodeID; + # get next element + last if $$dataPt !~ m{<([?/]?)([-\w:.\x80-\xff]+|!--)([^>]*)>}sg or pos($$dataPt) > $end; + # (the only reason we match '<[?/]' is to keep from scanning past the + # "<?xpacket end..." terminator or other closing token, so + next if $1; + my ($prop, $attrs) = ($2, $3); + # skip comments + if ($prop eq '!--') { + next if $attrs =~ /--$/ or $$dataPt =~ /-->/sg; + last; + } + my $valStart = pos($$dataPt); + my $valEnd; + # only look for closing token if this is not an empty element + # (empty elements end with '/', eg. <a:b/>) + if ($attrs !~ s/\/$//) { + my $nesting = 1; + for (;;) { +# this match fails with perl 5.6.2 (perl bug!), but it works without +# the '(.*?)', so we must do it differently... +# $$dataPt =~ m/(.*?)<\/$prop>/sg or last Element; +# my $val2 = $1; + # find next matching closing token, or the next opening token + # of a nested same-named element + if ($$dataPt !~ m{<(/?)$prop([-\w:.\x80-\xff]*)(.*?(/?))>}sg or + pos($$dataPt) > $end) + { + $et->Warn("XMP format error (no closing tag for $prop)"); + last Element; + } + next if $2; # ignore opening properties with different names + if ($1) { + next if --$nesting; + $valEnd = pos($$dataPt) - length($prop) - length($3) - 3; + last; # this element is complete + } + # this is a nested opening token (or empty element) + ++$nesting unless $4; + } + } else { + $valEnd = $valStart; + } + $start = pos($$dataPt); # start from here the next time around + + # ignore specified XMP namespaces/properties + if ($$et{EXCL_XMP_LOOKUP} and not $isWriting and $prop =~ /^(.+):(.*)/) { + my ($ns, $nm) = (lc($stdXlatNS{$1} || $1), lc($2)); + if ($$et{EXCL_XMP_LOOKUP}{"xmp-$ns:all"} or $$et{EXCL_XMP_LOOKUP}{"xmp-$ns:$nm"} or + $$et{EXCL_XMP_LOOKUP}{"xmp-all:$nm"}) + { + ++$count; # (pretend we found something so we don't store as a tag value) + next; + } + } + + # extract property attributes + my ($parseResource, %attrs, @attrs); + while ($attrs =~ m/(\S+?)\s*=\s*(['"])(.*?)\2/sg) { + my ($attr, $val) = ($1, $3); + # handle namespace prefixes (defined by xmlns:PREFIX, or used with PREFIX:tag) + if ($attr =~ /(.*?):/) { + if ($1 eq 'xmlns') { + my $ns = substr($attr, 6); + my $stdNS = $uri2ns{$val}; + # keep track of namespace prefixes defined in this scope (for Validate) + $$et{definedNS}{$ns} = $definedNS{$ns} = 1 unless $$et{definedNS}{$ns}; + unless ($stdNS) { + my $try = $val; + # patch for Nikon NX2 URI bug for Microsoft PhotoInfo namespace + $try =~ s{/$}{} or $try .= '/'; + $stdNS = $uri2ns{$try}; + if ($stdNS) { + $val = $try; + $et->WarnOnce("Fixed incorrect URI for xmlns:$ns", 1); + } else { + # look for same namespace with different version number + $try = quotemeta $val; # (note: escapes slashes too) + $try =~ s{\\/\d+\\\.\d+(\\/|$)}{\\/\\d+\\\.\\d+$1}; + my ($good) = grep /^$try$/, keys %uri2ns; + if ($good) { + $stdNS = $uri2ns{$good}; + $et->VPrint(0, $$et{INDENT}, "[different $stdNS version: $val]\n"); + } + } + } + # tame wild namespace prefixes (patches Microsoft stupidity) + my $newNS; + if ($stdNS) { + # use standard namespace prefix if pre-defined + if ($stdNS ne $ns) { + $newNS = $stdNS; + } elsif ($$xlatNS{$ns}) { + # this prefix is re-defined to the standard prefix in this scope + $newNS = ''; + } + } elsif ($$et{curNS}{$val}) { + # use a consistent prefix over the entire XMP for a given namespace URI + $newNS = $$et{curNS}{$val} if $$et{curNS}{$val} ne $ns; + } else { + my $curURI = $$et{curURI}; + my $curNS = $$et{curNS}; + my $usedNS = $ns; + # use unique prefixes for all namespaces across the entire XMP + if ($$curURI{$ns} or $nsURI{$ns}) { + # generate a temporary namespace prefix to resolve any conflict + my $i = 0; + ++$i while $$curURI{"tmp$i"}; + $newNS = $usedNS = "tmp$i"; + } + # keep track of the namespace prefixes and URI's used in this XMP + $$curNS{$val} = $usedNS; + $$curURI{$usedNS} = $val; + } + if (defined $newNS) { + # save translation used in containing scope if necessary + # create new namespace translation for the scope of this element + $saveNS or $saveNS = $xlatNS, $xlatNS = $$et{xlatNS} = { %$xlatNS }; + if (length $newNS) { + # use the new namespace prefix + $$xlatNS{$ns} = $newNS; + $attr = 'xmlns:' . $newNS; + # must go through previous attributes and change prefixes if necessary + foreach (@attrs) { + next unless /(.*?):/ and $1 eq $ns and $1 ne $newNS; + my $newAttr = $newNS . substr($_, length($ns)); + $attrs{$newAttr} = $attrs{$_}; + delete $attrs{$_}; + $_ = $newAttr; + } + } else { + delete $$xlatNS{$ns}; + } + } + } else { + $attr = $$xlatNS{$1} . substr($attr, length($1)) if $$xlatNS{$1}; + $usedNS{$1} = 1; + } + } + push @attrs, $attr; # preserve order + $attrs{$attr} = $val; + } + if ($prop =~ /(.*?):/) { + $usedNS{$1} = 1; + # tame wild namespace prefixes (patch for Microsoft stupidity) + $prop = $$xlatNS{$1} . substr($prop, length($1)) if $$xlatNS{$1}; + } + + if ($prop eq 'rdf:li') { + # impose a reasonable maximum on the number of items in a list + if ($nItems == 1000) { + my ($tg,$ns) = GetXMPTagID($propList); + if ($isWriting) { + $et->WarnOnce("Excessive number of items for $ns:$tg. Processing may be slow", 1); + } elsif (not $$et{OPTIONS}{IgnoreMinorErrors}) { + $et->WarnOnce("Extracted only 1000 $ns:$tg items. Ignore minor errors to extract all", 2); + last; + } + } + # add index to list items so we can keep them in order + # (this also enables us to keep structure elements grouped properly + # for lists of structures, like JobRef) + # Note: the list index is prefixed by the number of digits so sorting + # alphabetically gives the correct order while still allowing a flexible + # number of digits -- this scheme allows up to 9 digits in the index, + # with index numbers ranging from 0 to 999999999. The sequence is: + # 10,11,12-19,210,211-299,3100,3101-3999,41000...9999999999. + $prop .= ' ' . length($nItems) . $nItems; + # reset LIST_TAGS at the start of the outtermost list + # (avoids accumulating incorrectly-written elements in a correctly-written list) + if (not $nItems and not grep /^rdf:li /, @$propList) { + $$et{LIST_TAGS} = { }; + } + ++$nItems; + } elsif ($prop eq 'rdf:Description') { + # remove unnecessary rdf:Description elements since parseType='Resource' + # is more efficient (also necessary to make property path consistent) + if (grep /^rdf:Description$/, @$propList) { + $parseResource = 1; + # set parseType so we know this is a structure + $attrs{'rdf:parseType'} = 'Resource'; + } + } elsif ($prop eq 'xmp:xmpmeta') { + # patch MicrosoftPhoto unconformity + $prop = 'x:xmpmeta'; + $et->Warn('Wrong namespace for xmpmeta') if $$et{XmpValidate}; + } + + # hook for special parsing of attributes + my $val; + if ($attrProc) { + $val = substr($$dataPt, $valStart, $valEnd - $valStart); + if (&$attrProc(\@attrs, \%attrs, \$prop, \$val)) { + # the value was changed, so reset $valStart/$valEnd to use $val instead + $valStart = $valEnd; + } + } + + # add nodeID to property path (with leading ' #') if it exists + if (defined $attrs{'rdf:nodeID'}) { + $nodeID = $$blankInfo{NodeID} = $attrs{'rdf:nodeID'}; + delete $attrs{'rdf:nodeID'}; + $prop .= ' #' . $nodeID; + undef $parseResource; # can't ignore if this is a node + } + + # push this property name onto our hierarchy list + push @$propList, $prop unless $parseResource; + + if ($isSVG) { + # ignore everything but top level SVG tags and metadata unless Unknown set + unless ($$et{OPTIONS}{Unknown} > 1 or $$et{OPTIONS}{Verbose}) { + if (@$propList > 1 and $$propList[1] !~ /\b(metadata|desc|title)$/) { + pop @$propList; + next; + } + } + if ($prop eq 'svg' or $prop eq 'metadata') { + # add svg namespace prefix if missing to ignore these entries in the tag name + $$propList[-1] = "svg:$prop"; + } + } elsif ($$et{XmpIgnoreProps}) { # ignore specified properties for tag name + foreach (@{$$et{XmpIgnoreProps}}) { + last unless @$propList; + pop @$propList if $_ eq $$propList[0]; + } + } + + # handle properties inside element attributes (RDF shorthand format): + # (attributes take the form a:b='c' or a:b="c") + my ($shortName, $shorthand, $ignored); + foreach $shortName (@attrs) { + next unless defined $attrs{$shortName}; + my $propName = $shortName; + my ($ns, $name); + if ($propName =~ /(.*?):(.*)/) { + $ns = $1; # specified namespace + $name = $2; + } elsif ($prop =~ /(\S*?):/) { + $ns = $1; # assume same namespace as parent + $name = $propName; + $propName = "$ns:$name"; # generate full property name + } else { + # a property qualifier is the only property name that may not + # have a namespace, and a qualifier shouldn't have attributes, + # but what the heck, let's allow this anyway + $ns = ''; + $name = $propName; + } + if ($propName eq 'rdf:about') { + if (not $$et{XmpAbout}) { + $$et{XmpAbout} = $attrs{$shortName}; + } elsif ($$et{XmpAbout} ne $attrs{$shortName}) { + if ($isWriting) { + my $str = "Different 'rdf:about' attributes not handled"; + unless ($$et{WARNED_ONCE}{$str}) { + $et->Error($str, 1); + $$et{WARNED_ONCE}{$str} = 1; + } + } elsif ($$et{XmpValidate}) { + $et->WarnOnce("Different 'rdf:about' attributes"); + } + } + } + if ($isWriting) { + # keep track of our namespaces when writing + if ($ns eq 'xmlns') { + my $stdNS = $uri2ns{$attrs{$shortName}}; + unless ($stdNS and ($stdNS eq 'x' or $stdNS eq 'iX')) { + my $nsUsed = $$et{XMP_NS}; + $$nsUsed{$name} = $attrs{$shortName} unless defined $$nsUsed{$name}; + } + delete $attrs{$shortName}; # (handled by namespace logic) + next; + } elsif ($recognizedAttrs{$propName}) { + next; + } + } + my $shortVal = $attrs{$shortName}; + if ($ignoreNamespace{$ns} or $ignoreProp{$prop}) { + $ignored = $propName; + # handle special attributes (extract as tags only once if not empty) + if (ref $recognizedAttrs{$propName} and $shortVal) { + my ($tbl, $id, $name) = @{$recognizedAttrs{$propName}}; + my $tval = UnescapeXML($shortVal); + unless (defined $$et{VALUE}{$name} and $$et{VALUE}{$name} eq $tval) { + $et->HandleTag(GetTagTable($tbl), $id, $tval); + } + } + next; + } + delete $attrs{$shortName}; # don't re-use this attribute + push @$propList, $propName; + # save this shorthand XMP property + if (defined $nodeID) { + SaveBlankInfo($blankInfo, $propList, $shortVal); + } elsif ($isWriting) { + CaptureXMP($et, $propList, $shortVal); + } else { + ValidateProperty($et, $propList) if $$et{XmpValidate}; + &$foundProc($et, $tagTablePtr, $propList, $shortVal); + } + pop @$propList; + $shorthand = 1; + } + if ($isWriting) { + if (ParseXMPElement($et, $tagTablePtr, $dataPt, $valStart, $valEnd, + $propList, $blankInfo)) + { + # (no value since we found more properties within this one) + # set an error on any ignored attributes here, because they will be lost + $$et{XMP_ERROR} = "Can't handle XMP attribute '${ignored}'" if $ignored; + } elsif (not $shorthand or $valEnd != $valStart) { + $val = substr($$dataPt, $valStart, $valEnd - $valStart); + # remove comments and whitespace from rdf:Description only + if ($prop eq 'rdf:Description') { + $val =~ s/<!--.*?-->//g; $val =~ s/^\s+//; $val =~ s/\s+$//; + } + if (defined $nodeID) { + SaveBlankInfo($blankInfo, $propList, $val, \%attrs); + } else { + CaptureXMP($et, $propList, $val, \%attrs); + } + } + } else { + # look for additional elements contained within this one + if ($valStart == $valEnd or + !ParseXMPElement($et, $tagTablePtr, $dataPt, $valStart, $valEnd, + $propList, $blankInfo)) + { + my $wasEmpty; + unless (defined $val) { + $val = substr($$dataPt, $valStart, $valEnd - $valStart); + # remove comments and whitespace from rdf:Description only + if ($prop eq 'rdf:Description' and $val) { + $val =~ s/<!--.*?-->//g; $val =~ s/^\s+//; $val =~ s/\s+$//; + } + # if element value is empty, take value from RDF 'value' or 'resource' attribute + # (preferentially) or 'about' attribute (if no 'value' or 'resource') + if ($val eq '' and ($attrs =~ /\brdf:(?:value|resource)=(['"])(.*?)\1/ or + $attrs =~ /\brdf:about=(['"])(.*?)\1/)) + { + $val = $2; + $wasEmpty = 1; + } + } + # there are no contained elements, so this must be a simple property value + # (unless we already extracted shorthand values from this element) + if (length $val or not $shorthand) { + my $lastProp = $$propList[-1]; + $lastProp = '' unless defined $lastProp; + if (defined $nodeID) { + SaveBlankInfo($blankInfo, $propList, $val); + } elsif ($lastProp eq 'rdf:type' and $wasEmpty) { + # do not extract empty structure types (for now) + } elsif ($lastProp =~ /^et:(desc|prt|val)$/ and ($count or $1 eq 'desc')) { + # ignore et:desc, and et:val if preceded by et:prt + --$count; + } else { + ValidateProperty($et, $propList, \%attrs) if $$et{XmpValidate}; + &$foundProc($et, $tagTablePtr, $propList, $val, \%attrs); + } + } + } + } + pop @$propList unless $parseResource; + ++$count; + + # validate namespace prefixes used at this level if necessary + if ($$et{XmpValidate}) { + foreach (sort keys %usedNS) { + next if $$et{definedNS}{$_} or $_ eq 'xml'; + if (defined $$et{definedNS}{$_}) { + $et->Warn("XMP namespace $_ is used out of scope"); + } else { + $et->Warn("Undefined XMP namespace: $_"); + } + $$et{definedNS}{$_} = -1; # (don't warn again for this namespace) + } + # reset namespaces that went out of scope + $$et{definedNS}{$_} = 0 foreach keys %definedNS; + undef %usedNS; + undef %definedNS; + } + + last if $start >= $end; + pos($$dataPt) = $start; + $$dataPt =~ /\G\s+/gc; # skip white space after closing token + } +# +# process resources referenced by blank nodeID's +# + if ($processBlankInfo and %{$$blankInfo{Prop}}) { + ProcessBlankInfo($et, $tagTablePtr, $blankInfo, $isWriting); + %$blankInfo = (); # free some memory + } + # restore namespace lookup from the containing scope + $$et{xlatNS} = $saveNS if $saveNS; + + return $count; # return the number of elements found at this level +} + +#------------------------------------------------------------------------------ +# Process XMP data +# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table +# Returns: 1 on success +# Notes: The following flavours of XMP files are currently recognized: +# - standard XMP with xpacket, x:xmpmeta and rdf:RDF elements +# - XMP that is missing the xpacket and/or x:xmpmeta elements +# - mutant Microsoft XMP with xmp:xmpmeta element +# - XML files beginning with "<xml" +# - SVG files that begin with "<svg" or "<!DOCTYPE svg" +# - XMP and XML files beginning with a UTF-8 byte order mark +# - UTF-8, UTF-16 and UTF-32 encoded XMP +# - erroneously double-UTF8 encoded XMP +# - otherwise valid files with leading XML comment +sub ProcessXMP($$;$) +{ + my ($et, $dirInfo, $tagTablePtr) = @_; + my $dataPt = $$dirInfo{DataPt}; + my ($dirStart, $dirLen, $dataLen, $double); + my ($buff, $fmt, $hasXMP, $isXML, $isRDF, $isSVG); + my $rtnVal = 0; + my $bom = 0; + my $path = $et->MetadataPath(); + + # namespaces and prefixes currently in effect while parsing the file, + # and lookup to translate brain-dead-Microsoft-Photo-software prefixes + $$et{curURI} = { }; + $$et{curNS} = { }; + $$et{xlatNS} = { }; + $$et{definedNS} = { }; + delete $$et{XmpAbout}; + delete $$et{XmpValidate}; # don't validate by default + delete $$et{XmpValidateLangAlt}; + + # ignore non-standard XMP while in strict MWG compatibility mode + if (($Image::ExifTool::MWG::strict or $$et{OPTIONS}{Validate}) and + not ($$et{XMP_CAPTURE} or $$et{DOC_NUM}) and + (($$dirInfo{DirName} || '') eq 'XMP' or $$et{FILE_TYPE} eq 'XMP')) + { + $$et{XmpValidate} = { } if $$et{OPTIONS}{Validate}; + my $nonStd = ($stdPath{$$et{FILE_TYPE}} and $path ne $stdPath{$$et{FILE_TYPE}}); + if ($nonStd and $Image::ExifTool::MWG::strict) { + $et->Warn("Ignored non-standard XMP at $path"); + return 1; + } + if ($nonStd) { + $et->Warn("Non-standard XMP at $path", 1); + } elsif (not $$dirInfo{IsExtended}) { + $et->Warn("Duplicate XMP at $path") if $$et{DIR_COUNT}{XMP}; + $$et{DIR_COUNT}{XMP} = ($$et{DIR_COUNT}{XMP} || 0) + 1; # count standard XMP + } + } + if ($dataPt) { + $dirStart = $$dirInfo{DirStart} || 0; + $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart); + $dataLen = $$dirInfo{DataLen} || length($$dataPt); + # check leading BOM (may indicate double-encoded UTF) + pos($$dataPt) = $dirStart; + $double = $1 if $$dataPt =~ /\G((\0\0)?\xfe\xff|\xff\xfe(\0\0)?|\xef\xbb\xbf)\0*<\0*\?\0*x\0*p\0*a\0*c\0*k\0*e\0*t/g; + } else { + my ($type, $mime, $buf2, $buf3); + # read information from XMP file + my $raf = $$dirInfo{RAF} or return 0; + $raf->Read($buff, 256) or return 0; + ($buf2 = $buff) =~ tr/\0//d; # cheap conversion to UTF-8 + # remove leading comments if they exist (eg. ImageIngester) + while ($buf2 =~ /^\s*<!--/) { + # remove the comment if it is complete + if ($buf2 =~ s/^\s*<!--.*?-->\s+//s) { + # continue with parsing if we have more than 128 bytes remaining + next if length $buf2 > 128; + } else { + # don't read more than 10k when looking for the end of comment + return 0 if length($buf2) > 10000; + } + $raf->Read($buf3, 256) or last; # read more data if available + $buff .= $buf3; + $buf3 =~ tr/\0//d; + $buf2 .= $buf3; + } + # check to see if this is XMP format + # (CS2 writes .XMP files without the "xpacket begin") + if ($buf2 =~ /^\s*(<\?xpacket begin=|<x(mp)?:x[ma]pmeta)/) { + $hasXMP = 1; + } else { + # also recognize XML files and .XMP files with BOM and without x:xmpmeta + if ($buf2 =~ /^(\xfe\xff)(<\?xml|<rdf:RDF|<x(mp)?:x[ma]pmeta)/g) { + $fmt = 'n'; # UTF-16 or 32 MM with BOM + } elsif ($buf2 =~ /^(\xff\xfe)(<\?xml|<rdf:RDF|<x(mp)?:x[ma]pmeta)/g) { + $fmt = 'v'; # UTF-16 or 32 II with BOM + } elsif ($buf2 =~ /^(\xef\xbb\xbf)?(<\?xml|<rdf:RDF|<x(mp)?:x[ma]pmeta|<svg\b)/g) { + $fmt = 0; # UTF-8 with BOM or unknown encoding without BOM + } elsif ($buf2 =~ /^(\xfe\xff|\xff\xfe|\xef\xbb\xbf)(<\?xpacket begin=)/g) { + $double = $1; # double-encoded UTF + } else { + return 0; # not recognized XMP or XML + } + $bom = 1 if $1; + if ($2 eq '<?xml') { + if (defined $fmt and not $fmt and $buf2 =~ /^[^\n\r]*[\n\r]+<\?aid /s) { + undef $$et{XmpValidate}; # don't validate INX + if ($$et{XMP_CAPTURE}) { + $et->Error("ExifTool does not yet support writing of INX files"); + return 0; + } + $type = 'INX'; + } elsif ($buf2 =~ /<x(mp)?:x[ma]pmeta/) { + $hasXMP = 1; + } else { + undef $$et{XmpValidate}; # don't validate XML + # identify SVG images and PLIST files by DOCTYPE if available + if ($buf2 =~ /<!DOCTYPE\s+(\w+)/) { + if ($1 eq 'svg') { + $isSVG = 1; + } elsif ($1 eq 'plist') { + $type = 'PLIST'; + } elsif ($1 eq 'REDXIF') { + $type = 'RMD'; + $mime = 'application/xml'; + } elsif ($1 ne 'fcpxml') { # Final Cut Pro XML + return 0; + } + } elsif ($buf2 =~ /<svg[\s>]/) { + $isSVG = 1; + } elsif ($buf2 =~ /<rdf:RDF/) { + $isRDF = 1; + } elsif ($buf2 =~ /<plist[\s>]/) { + $type = 'PLIST'; + } + } + $isXML = 1; + } elsif ($2 eq '<rdf:RDF') { + $isRDF = 1; # recognize XMP without x:xmpmeta element + } elsif ($2 eq '<svg') { + $isSVG = $isXML = 1; + } + if ($isSVG and $$et{XMP_CAPTURE}) { + $et->Error("ExifTool does not yet support writing of SVG images"); + return 0; + } + if ($buff =~ /^\0\0/) { + $fmt = 'N'; # UTF-32 MM with or without BOM + } elsif ($buff =~ /^..\0\0/s) { + $fmt = 'V'; # UTF-32 II with or without BOM + } elsif (not $fmt) { + if ($buff =~ /^\0/) { + $fmt = 'n'; # UTF-16 MM without BOM + } elsif ($buff =~ /^.\0/s) { + $fmt = 'v'; # UTF-16 II without BOM + } + } + } + my $size; + if ($type) { + if ($type eq 'PLIST') { + my $ext = $$et{FILE_EXT}; + $type = $ext if $ext and $ext eq 'MODD'; + $tagTablePtr = GetTagTable('Image::ExifTool::PLIST::Main'); + $$dirInfo{XMPParseOpts}{FoundProc} = \&Image::ExifTool::PLIST::FoundTag; + } + } else { + if ($isSVG) { + $type = 'SVG'; + } elsif ($isXML and not $hasXMP and not $isRDF) { + $type = 'XML'; + my $ext = $$et{FILE_EXT}; + $type = $ext if $ext and $ext eq 'COS'; # recognize COS by extension + } + } + $et->SetFileType($type, $mime); + + my $fast = $et->Options('FastScan'); + return 1 if $fast and $fast == 3; + + if ($type and $type eq 'INX') { + # brute force search for first XMP packet in INX file + # start: '<![CDATA[<?xpacket begin' (24 bytes) + # end: '<?xpacket end="r"?>]]>' (22 bytes) + $raf->Seek(0, 0) or return 0; + $raf->Read($buff, 65536) or return 1; + for (;;) { + last if $buff =~ /<!\[CDATA\[<\?xpacket begin/g; + $raf->Read($buf2, 65536) or return 1; + $buff = substr($buff, -24) . $buf2; + } + $buff = substr($buff, pos($buff) - 15); # (discard '<![CDATA[' and before) + for (;;) { + last if $buff =~ /<\?xpacket end="[rw]"\?>\]\]>/g; + my $n = length $buff; + $raf->Read($buf2, 65536) or $et->Warn('Missing xpacket end'), return 1; + $buff .= $buf2; + pos($buff) = $n - 22; # don't miss end pattern if it was split + } + $size = pos($buff) - 3; # (discard ']]>' and after) + $buff = substr($buff, 0, $size); + } else { + # read the entire file + $raf->Seek(0, 2) or return 0; + $size = $raf->Tell() or return 0; + $raf->Seek(0, 0) or return 0; + $raf->Read($buff, $size) == $size or return 0; + } + $dataPt = \$buff; + $dirStart = 0; + $dirLen = $dataLen = $size; + } + + # decode the first layer of double-encoded UTF text (if necessary) + if ($double) { + my ($buf2, $fmt); + $buff = substr($$dataPt, $dirStart + length $double); # remove leading BOM + Image::ExifTool::SetWarning(undef); # clear old warning + local $SIG{'__WARN__'} = \&Image::ExifTool::SetWarning; + # assume that character data has been re-encoded in UTF, so re-pack + # as characters and look for warnings indicating a false assumption + if ($double eq "\xef\xbb\xbf") { + require Image::ExifTool::Charset; + my $uni = Image::ExifTool::Charset::Decompose(undef,$buff,'UTF8'); + $buf2 = pack('C*', @$uni); + } else { + if (length($double) == 2) { + $fmt = ($double eq "\xfe\xff") ? 'n' : 'v'; + } else { + $fmt = ($double eq "\0\0\xfe\xff") ? 'N' : 'V'; + } + $buf2 = pack('C*', unpack("$fmt*",$buff)); + } + if (Image::ExifTool::GetWarning()) { + $et->Warn('Superfluous BOM at start of XMP'); + $dataPt = \$buff; # use XMP with the BOM removed + } else { + $et->Warn('XMP is double UTF-encoded'); + $dataPt = \$buf2; # use the decoded XMP + } + $dirStart = 0; + $dirLen = $dataLen = length $$dataPt; + } + + # extract XMP/XML as a block if specified + my $blockName = $$dirInfo{BlockInfo} ? $$dirInfo{BlockInfo}{Name} : 'XMP'; + my $blockExtract = $et->Options('BlockExtract'); + if (($$et{REQ_TAG_LOOKUP}{lc $blockName} or ($$et{TAGS_FROM_FILE} and + not $$et{EXCL_TAG_LOOKUP}{lc $blockName}) or $blockExtract) and + (($$et{FileType} eq 'XMP' and $blockName eq 'XMP') or + ($$dirInfo{DirName} and $$dirInfo{DirName} eq $blockName))) + { + $et->FoundTag($$dirInfo{BlockInfo} || 'XMP', substr($$dataPt, $dirStart, $dirLen)); + return 1 if $blockExtract and $blockExtract > 1; + } + + $tagTablePtr or $tagTablePtr = GetTagTable('Image::ExifTool::XMP::Main'); + if ($et->Options('Verbose') and not $$et{XMP_CAPTURE}) { + my $dirType = $isSVG ? 'SVG' : $$tagTablePtr{GROUPS}{1}; + $et->VerboseDir($dirType, 0, $dirLen); + } +# +# convert UTF-16 or UTF-32 encoded XMP to UTF-8 if necessary +# + my $begin = '<?xpacket begin='; + my $dirEnd = $dirStart + $dirLen; + pos($$dataPt) = $dirStart; + delete $$et{XMP_IS_XML}; + delete $$et{XMP_IS_SVG}; + if ($isXML or $isRDF) { + $$et{XMP_IS_XML} = $isXML; + $$et{XMP_IS_SVG} = $isSVG; + $$et{XMP_NO_XPACKET} = 1 + $bom; + } elsif ($$dataPt =~ /\G\Q$begin\E/gc) { + delete $$et{XMP_NO_XPACKET}; + } elsif ($$dataPt =~ /<x(mp)?:x[ma]pmeta/gc and + pos($$dataPt) > $dirStart and pos($$dataPt) < $dirEnd) + { + $$et{XMP_NO_XPACKET} = 1 + $bom; + } else { + delete $$et{XMP_NO_XPACKET}; + # check for UTF-16 encoding (insert one \0 between characters) + $begin = join "\0", split //, $begin; + # must reset pos because it was killed by previous unsuccessful //g match + pos($$dataPt) = $dirStart; + if ($$dataPt =~ /\G(\0)?\Q$begin\E\0./sg) { + # validate byte ordering by checking for U+FEFF character + if ($1) { + # should be big-endian since we had a leading \0 + $fmt = 'n' if $$dataPt =~ /\G\xfe\xff/g; + } else { + $fmt = 'v' if $$dataPt =~ /\G\0\xff\xfe/g; + } + } else { + # check for UTF-32 encoding (with three \0's between characters) + $begin =~ s/\0/\0\0\0/g; + pos($$dataPt) = $dirStart; + if ($$dataPt !~ /\G(\0\0\0)?\Q$begin\E\0\0\0./sg) { + $fmt = 0; # set format to zero as indication we didn't find encoded XMP + } elsif ($1) { + # should be big-endian + $fmt = 'N' if $$dataPt =~ /\G\0\0\xfe\xff/g; + } else { + $fmt = 'V' if $$dataPt =~ /\G\0\0\0\xff\xfe\0\0/g; + } + } + defined $fmt or $et->Warn('XMP character encoding error'); + } + # warn if standard XMP is missing xpacket wrapper + if ($$et{XMP_NO_XPACKET} and $$et{OPTIONS}{Validate} and + $stdPath{$$et{FILE_TYPE}} and $path eq $stdPath{$$et{FILE_TYPE}} and + not $$dirInfo{IsExtended} and not $$et{DOC_NUM}) + { + $et->Warn('XMP is missing xpacket wrapper', 1); + } + if ($fmt) { + # trim if necessary to avoid converting non-UTF data + if ($dirStart or $dirEnd != length($$dataPt)) { + $buff = substr($$dataPt, $dirStart, $dirLen); + $dataPt = \$buff; + } + # convert into UTF-8 + if ($] >= 5.006001) { + $buff = pack('C0U*', unpack("$fmt*",$$dataPt)); + } else { + $buff = Image::ExifTool::PackUTF8(unpack("$fmt*",$$dataPt)); + } + $dataPt = \$buff; + $dirStart = 0; + $dirLen = length $$dataPt; + $dirEnd = $dirStart + $dirLen; + } + # avoid scanning for XMP later in case ScanForXMP is set + $$et{FoundXMP} = 1 if $tagTablePtr eq \%Image::ExifTool::XMP::Main; + + # set XMP parsing options + $$et{XMPParseOpts} = $$dirInfo{XMPParseOpts}; + + # ignore any specified properties (XML hack) + if ($$dirInfo{IgnoreProp}) { + %ignoreProp = %{$$dirInfo{IgnoreProp}}; + } else { + undef %ignoreProp; + } + + # need to preserve list indices to be able to handle multi-dimensional lists + my $keepFlat; + if ($$et{OPTIONS}{Struct}) { + if ($$et{OPTIONS}{Struct} eq '2') { + $keepFlat = 1; # preserve flattened tags + # setting NO_LIST to 0 combines list items in a TAG_EXTRA "NoList" element + # to allow them to be re-listed later if necessary. A "NoListDel" element + # is also created for tags that wouldn't have existed. + $$et{NO_LIST} = 0; + } else { + $$et{NO_LIST} = 1; + } + } + + # don't generate structures if this isn't real XMP + $$et{NO_STRUCT} = 1 if $$dirInfo{BlockInfo} or $$dirInfo{NoStruct}; + + # parse the XMP + if (ParseXMPElement($et, $tagTablePtr, $dataPt, $dirStart, $dirEnd)) { + $rtnVal = 1; + } elsif ($$dirInfo{DirName} and $$dirInfo{DirName} eq 'XMP') { + # if DirName was 'XMP' we expect well-formed XMP, so set Warning since it wasn't + # (but allow empty XMP as written by some PhaseOne cameras) + my $xmp = substr($$dataPt, $dirStart, $dirLen); + if ($xmp =~ /^ *\0*$/) { + $et->Warn('Invalid XMP'); + } else { + $et->Warn('Empty XMP',1); + $rtnVal = 1; + } + } + delete $$et{NO_STRUCT}; + + # return DataPt if successful in case we want it for writing + $$dirInfo{DataPt} = $dataPt if $rtnVal and $$dirInfo{RAF}; + + # restore structures if necessary + if ($$et{IsStruct}) { + require 'Image/ExifTool/XMPStruct.pl'; + RestoreStruct($et, $keepFlat); + delete $$et{IsStruct}; + } + # reset NO_LIST flag (must do this _after_ RestoreStruct() above) + delete $$et{NO_LIST}; + delete $$et{XMPParseOpts}; + delete $$et{curURI}; + delete $$et{curNS}; + delete $$et{xlatNS}; + delete $$et{definedNS}; + + return $rtnVal; +} + + +1; #end + +__END__ + +=head1 NAME + +Image::ExifTool::XMP - Read XMP meta information + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +XMP stands for Extensible Metadata Platform. It is a format based on XML +that Adobe developed for embedding metadata information in image files. +This module contains the definitions required by Image::ExifTool to read XMP +information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.adobe.com/devnet/xmp/> + +=item L<http://www.w3.org/TR/rdf-syntax-grammar/> + +=item L<http://www.iptc.org/IPTC4XMP/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/XMP Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/XMP2.pl b/lib/Image/ExifTool/XMP2.pl new file mode 100644 index 0000000..604a6f4 --- /dev/null +++ b/lib/Image/ExifTool/XMP2.pl @@ -0,0 +1,2159 @@ +#------------------------------------------------------------------------------ +# File: XMP2.pl +# +# Description: Additional XMP namespace definitions +# +# Revisions: 10/12/2008 - P. Harvey Created +# +# References: 1) PLUS - http://ns.useplus.org/ +# 2) PRISM - http://www.prismstandard.org/ +# 3) http://www.portfoliofaq.com/pfaq/v7mappings.htm +# 4) http://www.iptc.org/IPTC4XMP/ +# 5) http://creativecommons.org/technology/xmp +# --> changed to http://wiki.creativecommons.org/Companion_File_metadata_specification (2007/12/21) +# 6) http://www.optimasc.com/products/fileid/xmp-extensions.pdf +# 9) http://www.w3.org/TR/SVG11/ +# 11) http://www.extensis.com/en/support/kb_article.jsp?articleNumber=6102211 +# 12) XMPSpecificationPart3_May2013, page 58 +# 13) https://developer.android.com/training/camera2/Dynamic-depth-v1.0.pdf +# 14) http://www.iptc.org/standards/photo-metadata/iptc-standard/ +#------------------------------------------------------------------------------ + +package Image::ExifTool::XMP; + +use strict; +use Image::ExifTool qw(:Utils); +use Image::ExifTool::XMP; + +sub Init_crd($); + +#------------------------------------------------------------------------------ + +# xmpDM structure definitions +my %sCuePointParam = ( + STRUCT_NAME => 'CuePointParam', + NAMESPACE => 'xmpDM', + key => { }, + value => { }, +); +my %sMarker = ( + STRUCT_NAME => 'Marker', + NAMESPACE => 'xmpDM', + comment => { }, + duration => { }, + location => { }, + name => { }, + startTime => { }, + target => { }, + type => { }, + # added Oct 2008 + cuePointParams => { Struct => \%sCuePointParam, List => 'Seq' }, + cuePointType=> { }, + probability => { Writable => 'real' }, + speaker => { }, +); +my %sTime = ( + STRUCT_NAME => 'Time', + NAMESPACE => 'xmpDM', + scale => { Writable => 'rational' }, + value => { Writable => 'integer' }, +); +my %sTimecode = ( + STRUCT_NAME => 'Timecode', + NAMESPACE => 'xmpDM', + timeFormat => { + PrintConv => { + '24Timecode' => '24 fps', + '25Timecode' => '25 fps', + '2997DropTimecode' => '29.97 fps (drop)', + '2997NonDropTimecode' => '29.97 fps (non-drop)', + '30Timecode' => '30 fps', + '50Timecode' => '50 fps', + '5994DropTimecode' => '59.94 fps (drop)', + '5994NonDropTimecode' => '59.94 fps (non-drop)', + '60Timecode' => '60 fps', + '23976Timecode' => '23.976 fps', + }, + }, + timeValue => { }, + value => { Writable => 'integer', Notes => 'only in XMP 2008 spec; an error?' }, +); +my %sPose = ( + STRUCT_NAME => 'Pose', + NAMESPACE => { Pose => 'http://ns.google.com/photos/dd/1.0/pose/' }, + PositionX => { Writable => 'real', Groups => { 2 => 'Location' } }, + PositionY => { Writable => 'real', Groups => { 2 => 'Location' } }, + PositionZ => { Writable => 'real', Groups => { 2 => 'Location' } }, + RotationX => { Writable => 'real', Groups => { 2 => 'Location' } }, + RotationY => { Writable => 'real', Groups => { 2 => 'Location' } }, + RotationZ => { Writable => 'real', Groups => { 2 => 'Location' } }, + RotationW => { Writable => 'real', Groups => { 2 => 'Location' } }, + Timestamp => { + Writable => 'integer', + Shift => 'Time', + Groups => { 2 => 'Time' }, + ValueConv => 'ConvertUnixTime($val / 1000, 1, 3)', + ValueConvInv => 'int(GetUnixTime($val, 1) * 1000)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', + }, +); +my %sEarthPose = ( + STRUCT_NAME => 'EarthPose', + NAMESPACE => { EarthPose => 'http://ns.google.com/photos/dd/1.0/earthpose/' }, + Latitude => { Writable => 'real', Groups => { 2 => 'Location' }, %latConv }, + Longitude => { Writable => 'real', Groups => { 2 => 'Location' }, %longConv }, + Altitude => { + Writable => 'real', + Groups => { 2 => 'Location' }, + PrintConv => '"$val m"', + PrintConvInv => '$val=~s/\s*m$//;$val', + }, + RotationX => { Writable => 'real', Groups => { 2 => 'Location' } }, + RotationY => { Writable => 'real', Groups => { 2 => 'Location' } }, + RotationZ => { Writable => 'real', Groups => { 2 => 'Location' } }, + RotationW => { Writable => 'real', Groups => { 2 => 'Location' } }, + Timestamp => { + Writable => 'integer', + Shift => 'Time', + Groups => { 2 => 'Time' }, + ValueConv => 'ConvertUnixTime($val / 1000, 1, 3)', + ValueConvInv => 'int(GetUnixTime($val, 1) * 1000)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val,undef,1)', + }, +); +my %sVendorInfo = ( + STRUCT_NAME => 'VendorInfo', + NAMESPACE => { VendorInfo => 'http://ns.google.com/photos/dd/1.0/vendorinfo/' }, + Model => { }, + Manufacturer => { }, + Notes => { }, +); +my %sAppInfo = ( + STRUCT_NAME => 'AppInfo', + NAMESPACE => { AppInfo => 'http://ns.google.com/photos/dd/1.0/appinfo/' }, + Application => { }, + Version => { }, + ItemURI => { }, +); + +# camera-raw defaults +%Image::ExifTool::XMP::crd = ( + %xmpTableDefaults, + INIT_TABLE => \&Init_crd, + GROUPS => { 1 => 'XMP-crd', 2 => 'Image' }, + NAMESPACE => 'crd', + AVOID => 1, + TABLE_DESC => 'Photoshop Camera Defaults namespace', + NOTES => 'Adobe Camera Raw Defaults tags.', + # (tags added dynamically when WRITE_PROC is called) +); + +# XMP Dynamic Media namespace properties (xmpDM) +%Image::ExifTool::XMP::xmpDM = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-xmpDM', 2 => 'Image' }, + NAMESPACE => 'xmpDM', + NOTES => 'XMP Dynamic Media namespace tags.', + absPeakAudioFilePath=> { }, + album => { }, + altTapeName => { }, + altTimecode => { Struct => \%sTimecode }, + artist => { Avoid => 1, Groups => { 2 => 'Author' } }, + audioModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo }, + audioSampleRate => { Writable => 'integer' }, + audioSampleType => { + PrintConv => { + '8Int' => '8-bit integer', + '16Int' => '16-bit integer', + '24Int' => '24-bit integer', + '32Int' => '32-bit integer', + '32Float' => '32-bit float', + 'Compressed' => 'Compressed', + 'Packed' => 'Packed', + 'Other' => 'Other', + }, + }, + audioChannelType => { + PrintConv => { + 'Mono' => 'Mono', + 'Stereo' => 'Stereo', + '5.1' => '5.1', + '7.1' => '7.1', + '16 Channel' => '16 Channel', + 'Other' => 'Other', + }, + }, + audioCompressor => { }, + beatSpliceParams => { + Struct => { + STRUCT_NAME => 'BeatSpliceStretch', + NAMESPACE => 'xmpDM', + riseInDecibel => { Writable => 'real' }, + riseInTimeDuration => { Struct => \%sTime }, + useFileBeatsMarker => { Writable => 'boolean' }, + }, + }, + cameraAngle => { }, + cameraLabel => { }, + cameraModel => { }, + cameraMove => { }, + client => { }, + comment => { Name => 'DMComment' }, + composer => { Groups => { 2 => 'Author' } }, + contributedMedia => { + Struct => { + STRUCT_NAME => 'Media', + NAMESPACE => 'xmpDM', + duration => { Struct => \%sTime }, + managed => { Writable => 'boolean' }, + path => { }, + startTime => { Struct => \%sTime }, + track => { }, + webStatement=> { }, + }, + List => 'Bag', + }, + copyright => { Avoid => 1, Groups => { 2 => 'Author' } }, # (deprecated) + director => { }, + directorPhotography => { }, + discNumber => { }, #12 + duration => { Struct => \%sTime }, + engineer => { }, + fileDataRate => { Writable => 'rational' }, + genre => { }, + good => { Writable => 'boolean' }, + instrument => { }, + introTime => { Struct => \%sTime }, + key => { + PrintConvColumns => 3, + PrintConv => { + 'C' => 'C', 'C#' => 'C#', 'D' => 'D', 'D#' => 'D#', + 'E' => 'E', 'F' => 'F', 'F#' => 'F#', 'G' => 'G', + 'G#' => 'G#', 'A' => 'A', 'A#' => 'A#', 'B' => 'B', + }, + }, + logComment => { }, + loop => { Writable => 'boolean' }, + lyrics => { }, #12 + numberOfBeats => { Writable => 'real' }, + markers => { Struct => \%sMarker, List => 'Seq' }, + metadataModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo }, + outCue => { Struct => \%sTime }, + partOfCompilation=>{ Writable => 'boolean' }, #12 + projectName => { }, + projectRef => { + Struct => { + STRUCT_NAME => 'ProjectLink', + NAMESPACE => 'xmpDM', + path => { }, + type => { + PrintConv => { + movie => 'Movie', + still => 'Still Image', + audio => 'Audio', + custom => 'Custom', + }, + }, + }, + }, + pullDown => { + PrintConvColumns => 2, + PrintConv => { + 'WSSWW' => 'WSSWW', 'SSWWW' => 'SSWWW', + 'SWWWS' => 'SWWWS', 'WWWSS' => 'WWWSS', + 'WWSSW' => 'WWSSW', 'WWWSW' => 'WWWSW', + 'WWSWW' => 'WWSWW', 'WSWWW' => 'WSWWW', + 'SWWWW' => 'SWWWW', 'WWWWS' => 'WWWWS', + }, + }, + relativePeakAudioFilePath => { }, + relativeTimestamp => { Struct => \%sTime }, + releaseDate => { Groups => { 2 => 'Time' }, %dateTimeInfo }, + resampleParams => { + Struct => { + STRUCT_NAME => 'ResampleStretch', + NAMESPACE => 'xmpDM', + quality => { PrintConv => { Low => 'Low', Medium => 'Medium', High => 'High' } }, + }, + }, + scaleType => { + PrintConv => { + Major => 'Major', + Minor => 'Minor', + Both => 'Both', + Neither => 'Neither', + }, + }, + scene => { Avoid => 1 }, + shotDate => { Groups => { 2 => 'Time' }, %dateTimeInfo }, + shotDay => { }, + shotLocation => { }, + shotName => { }, + shotNumber => { }, + shotSize => { }, + speakerPlacement=> { }, + startTimecode => { Struct => \%sTimecode }, + startTimeSampleSize => { Writable => 'integer' }, #PH + startTimeScale => { }, #PH (real?) + stretchMode => { + PrintConv => { + 'Fixed length' => 'Fixed length', + 'Time-Scale' => 'Time-Scale', + 'Resample' => 'Resample', + 'Beat Splice' => 'Beat Splice', + 'Hybrid' => 'Hybrid', + }, + }, + takeNumber => { Writable => 'integer' }, + tapeName => { }, + tempo => { Writable => 'real' }, + timeScaleParams => { + Struct => { + STRUCT_NAME => 'TimeScaleStretch', + NAMESPACE => 'xmpDM', + frameOverlappingPercentage => { Writable => 'real' }, + frameSize => { Writable => 'real' }, + quality => { PrintConv => { Low => 'Low', Medium => 'Medium', High => 'High' } }, + }, + }, + timeSignature => { + PrintConvColumns => 3, + PrintConv => { + '2/4' => '2/4', '3/4' => '3/4', '4/4' => '4/4', + '5/4' => '5/4', '7/4' => '7/4', '6/8' => '6/8', + '9/8' => '9/8', '12/8'=> '12/8', 'other' => 'other', + }, + }, + trackNumber => { Writable => 'integer' }, + Tracks => { + Struct => { + STRUCT_NAME => 'Track', + NAMESPACE => 'xmpDM', + frameRate => { }, + markers => { Struct => \%sMarker, List => 'Seq' }, + trackName => { }, + trackType => { }, + }, + List => 'Bag', + }, + videoAlphaMode => { + PrintConv => { + 'straight' => 'Straight', + 'pre-multiplied', => 'Pre-multiplied', + 'none' => 'None', + }, + }, + videoAlphaPremultipleColor => { Struct => \%sColorant }, + videoAlphaUnityIsTransparent => { Writable => 'boolean' }, + videoColorSpace => { + PrintConv => { + 'sRGB' => 'sRGB', + 'CCIR-601' => 'CCIR-601', + 'CCIR-709' => 'CCIR-709', + }, + }, + videoCompressor => { }, + videoFieldOrder => { + PrintConv => { + Upper => 'Upper', + Lower => 'Lower', + Progressive => 'Progressive', + }, + }, + videoFrameRate => { Writable => 'real' }, + videoFrameSize => { Struct => \%sDimensions }, + videoModDate => { Groups => { 2 => 'Time' }, %dateTimeInfo }, + videoPixelAspectRatio => { Writable => 'rational' }, + videoPixelDepth => { + PrintConv => { + '8Int' => '8-bit integer', + '16Int' => '16-bit integer', + '24Int' => '24-bit integer', + '32Int' => '32-bit integer', + '32Float' => '32-bit float', + 'Other' => 'Other', + }, + }, +); + +#------------------------------------------------------------------------------ +# IPTC Extensions version 1.3 (+ proposed video extensions) + +# IPTC Extension 1.0 structures +my %sLocationDetails = ( + STRUCT_NAME => 'LocationDetails', + NAMESPACE => 'Iptc4xmpExt', + GROUPS => { 2 => 'Location' }, + Identifier => { List => 'Bag', Namespace => 'xmp' }, + City => { }, + CountryCode => { }, + CountryName => { }, + ProvinceState => { }, + Sublocation => { }, + WorldRegion => { }, + LocationId => { List => 'Bag' }, + LocationName => { Writable => 'lang-alt' }, + GPSLatitude => { Namespace => 'exif', %latConv }, + GPSLongitude => { Namespace => 'exif', %longConv }, + GPSAltitude => { + Namespace => 'exif', + Writable => 'rational', + PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "$val m"', + PrintConvInv => '$val=~s/\s*m$//;$val', + }, +); +my %sCVTermDetails = ( + STRUCT_NAME => 'CVTermDetails', + NAMESPACE => 'Iptc4xmpExt', + CvTermId => { }, + CvTermName => { Writable => 'lang-alt' }, + CvId => { }, + CvTermRefinedAbout => { }, +); + +# IPTC video extensions +my %sPublicationEvent = ( + STRUCT_NAME => 'PublicationEvent', + NAMESPACE => 'Iptc4xmpExt', + Date => { Groups => { 2 => 'Time' }, %dateTimeInfo }, + Name => { }, + Identifier => { }, +); +my %sEntity = ( + STRUCT_NAME => 'Entity', + NAMESPACE => 'Iptc4xmpExt', + Identifier => { List => 'Bag', Namespace => 'xmp' }, + Name => { Writable => 'lang-alt' }, +); +my %sEntityWithRole = ( + STRUCT_NAME => 'EntityWithRole', + NAMESPACE => 'Iptc4xmpExt', + Identifier => { List => 'Bag', Namespace => 'xmp' }, + Name => { Writable => 'lang-alt' }, + Role => { List => 'Bag' }, +); +# (no longer used) +#my %sFrameSize = ( +# STRUCT_NAME => 'FrameSize', +# NAMESPACE => 'Iptc4xmpExt', +# WidthPixels => { Writable => 'integer' }, +# HeightPixels => { Writable => 'integer' }, +#); +my %sRating = ( + STRUCT_NAME => 'Rating', + NAMESPACE => 'Iptc4xmpExt', + RatingValue => { FlatName => 'Value' }, + RatingSourceLink => { FlatName => 'SourceLink' }, + RatingScaleMinValue => { FlatName => 'ScaleMinValue' }, + RatingScaleMaxValue => { FlatName => 'ScaleMaxValue' }, + RatingValueLogoLink => { FlatName => 'ValueLogoLink' }, + RatingRegion => { + FlatName => 'Region', + Struct => \%sLocationDetails, + List => 'Bag', + }, +); +my %sEpisode = ( + STRUCT_NAME => 'EpisodeOrSeason', + NAMESPACE => 'Iptc4xmpExt', + Name => { }, + Number => { }, + Identifier => { }, +); +my %sSeries = ( + STRUCT_NAME => 'Series', + NAMESPACE => 'Iptc4xmpExt', + Name => { }, + Identifier => { }, +); +my %sTemporalCoverage = ( + STRUCT_NAME => 'TemporalCoverage', + NAMESPACE => 'Iptc4xmpExt', + tempCoverageFrom => { FlatName => 'From', %dateTimeInfo, Groups => { 2 => 'Time' } }, + tempCoverageTo => { FlatName => 'To', %dateTimeInfo, Groups => { 2 => 'Time' } }, +); +my %sQualifiedLink = ( + STRUCT_NAME => 'QualifiedLink', + NAMESPACE => 'Iptc4xmpExt', + Link => { }, + LinkQualifier => { }, +); +my %sTextRegion = ( + STRUCT_NAME => 'TextRegion', + NAMESPACE => 'Iptc4xmpExt', + RegionText => { }, + Region => { Struct => \%Image::ExifTool::XMP::sArea }, +); +my %sLinkedImage = ( + STRUCT_NAME => 'LinkedImage', + NAMESPACE => 'Iptc4xmpExt', + Link => { }, + LinkQualifier => { List => 'Bag' }, + ImageRole => { }, + 'format' => { Namespace => 'dc' }, + WidthPixels => { Writable => 'integer' }, + HeightPixels=> { Writable => 'integer' }, + UsedVideoFrame => { Struct => \%sTimecode }, +); +my %sBoundaryPoint = ( # new in 1.5 + STRUCT_NAME => 'BoundaryPoint', + NAMESPACE => 'Iptc4xmpExt', + rbX => { FlatName => 'X', Writable => 'real' }, + rbY => { FlatName => 'Y', Writable => 'real' }, +); +my %sRegionBoundary = ( # new in 1.5 + STRUCT_NAME => 'RegionBoundary', + NAMESPACE => 'Iptc4xmpExt', + rbShape => { FlatName => 'Shape', PrintConv => { rectangle => 'Rectangle', circle => 'Circle', polygon => 'Polygon' } }, + rbUnit => { FlatName => 'Unit', PrintConv => { pixel => 'Pixel', relative => 'Relative' } }, + rbX => { FlatName => 'X', Writable => 'real' }, + rbY => { FlatName => 'Y', Writable => 'real' }, + rbW => { FlatName => 'W', Writable => 'real' }, + rbH => { FlatName => 'H', Writable => 'real' }, + rbRx => { FlatName => 'Rx', Writable => 'real' }, + rbVertices => { FlatName => 'Vertices', List => 'Seq', Struct => \%sBoundaryPoint }, +); +my %sImageRegion = ( # new in 1.5 + STRUCT_NAME => 'ImageRegion', + NAMESPACE => undef, # undefined to allow variable-namespace extensions + NOTES => q{ + This structure is new in the IPTC Extension version 1.5 specification. As + well as the fields defined below, this structure may contain any top-level + XMP tags, but since they aren't pre-defined the only way to add these tags + is to write ImageRegion as a structure with these tags as new fields. + }, + RegionBoundary => { Namespace => 'Iptc4xmpExt', FlatName => 'Boundary', Struct => \%sRegionBoundary }, + rId => { Namespace => 'Iptc4xmpExt', FlatName => 'ID' }, + Name => { Namespace => 'Iptc4xmpExt', Writable => 'lang-alt' }, + rCtype => { Namespace => 'Iptc4xmpExt', FlatName => 'Ctype', List => 'Bag', Struct => \%sEntity }, + rRole => { Namespace => 'Iptc4xmpExt', FlatName => 'Role', List => 'Bag', Struct => \%sEntity }, +); + +# IPTC Extension namespace properties (Iptc4xmpExt) (ref 4, 14) +%Image::ExifTool::XMP::iptcExt = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-iptcExt', 2 => 'Author' }, + NAMESPACE => 'Iptc4xmpExt', + TABLE_DESC => 'XMP IPTC Extension', + NOTES => q{ + This table contains tags defined by the IPTC Extension schema version 1.6. + The actual namespace prefix is "Iptc4xmpExt", but ExifTool shortens this for + the family 1 group name. (see + L<http://www.iptc.org/standards/photo-metadata/iptc-standard/>) + }, + AboutCvTerm => { + Struct => \%sCVTermDetails, + List => 'Bag', + }, + AboutCvTermCvId => { Flat => 1, Name => 'AboutCvTermCvId' }, + AboutCvTermCvTermId => { Flat => 1, Name => 'AboutCvTermId' }, + AboutCvTermCvTermName => { Flat => 1, Name => 'AboutCvTermName' }, + AboutCvTermCvTermRefinedAbout => { Flat => 1, Name => 'AboutCvTermRefinedAbout' }, + AddlModelInfo => { Name => 'AdditionalModelInformation' }, + ArtworkOrObject => { + Struct => { + STRUCT_NAME => 'ArtworkOrObjectDetails', + NAMESPACE => 'Iptc4xmpExt', + AOCopyrightNotice => { }, + AOCreator => { List => 'Seq' }, + AODateCreated=> { Groups => { 2 => 'Time' }, %dateTimeInfo }, + AOSource => { }, + AOSourceInvNo=> { }, + AOTitle => { Writable => 'lang-alt' }, + AOCurrentCopyrightOwnerName => { }, + AOCurrentCopyrightOwnerId => { }, + AOCurrentLicensorName => { }, + AOCurrentLicensorId => { }, + AOCreatorId => { List => 'Seq' }, + AOCircaDateCreated => { Groups => { 2 => 'Time' }, Protected => 1 }, + AOStylePeriod => { List => 'Bag' }, + AOSourceInvURL => { }, + AOContentDescription => { Writable => 'lang-alt' }, + AOContributionDescription => { Writable => 'lang-alt' }, + AOPhysicalDescription => { Writable => 'lang-alt' }, + }, + List => 'Bag', + }, + ArtworkOrObjectAOCopyrightNotice => { Flat => 1, Name => 'ArtworkCopyrightNotice' }, + ArtworkOrObjectAOCreator => { Flat => 1, Name => 'ArtworkCreator' }, + ArtworkOrObjectAODateCreated => { Flat => 1, Name => 'ArtworkDateCreated' }, + ArtworkOrObjectAOSource => { Flat => 1, Name => 'ArtworkSource' }, + ArtworkOrObjectAOSourceInvNo => { Flat => 1, Name => 'ArtworkSourceInventoryNo' }, + ArtworkOrObjectAOTitle => { Flat => 1, Name => 'ArtworkTitle' }, + ArtworkOrObjectAOCurrentCopyrightOwnerName => { Flat => 1, Name => 'ArtworkCopyrightOwnerName' }, + ArtworkOrObjectAOCurrentCopyrightOwnerId => { Flat => 1, Name => 'ArtworkCopyrightOwnerID' }, + ArtworkOrObjectAOCurrentLicensorName => { Flat => 1, Name => 'ArtworkLicensorName' }, + ArtworkOrObjectAOCurrentLicensorId => { Flat => 1, Name => 'ArtworkLicensorID' }, + ArtworkOrObjectAOCreatorId => { Flat => 1, Name => 'ArtworkCreatorID' }, + ArtworkOrObjectAOCircaDateCreated => { Flat => 1, Name => 'ArtworkCircaDateCreated' }, + ArtworkOrObjectAOStylePeriod => { Flat => 1, Name => 'ArtworkStylePeriod' }, + ArtworkOrObjectAOSourceInvURL => { Flat => 1, Name => 'ArtworkSourceInvURL' }, + ArtworkOrObjectAOContentDescription => { Flat => 1, Name => 'ArtworkContentDescription' }, + ArtworkOrObjectAOContributionDescription => { Flat => 1, Name => 'ArtworkContributionDescription' }, + ArtworkOrObjectAOPhysicalDescription => { Flat => 1, Name => 'ArtworkPhysicalDescription' }, + CVterm => { + Name => 'ControlledVocabularyTerm', + List => 'Bag', + Notes => 'deprecated by version 1.2', + }, + DigImageGUID => { Groups => { 2 => 'Image' }, Name => 'DigitalImageGUID' }, + DigitalSourcefileType => { + Name => 'DigitalSourceFileType', + Notes => 'now deprecated -- replaced by DigitalSourceType', + Groups => { 2 => 'Image' }, + }, + DigitalSourceType => { Name => 'DigitalSourceType', Groups => { 2 => 'Image' } }, + EmbdEncRightsExpr => { + Struct => { + STRUCT_NAME => 'EEREDetails', + NAMESPACE => 'Iptc4xmpExt', + EncRightsExpr => { }, + RightsExprEncType => { }, + RightsExprLangId => { }, + }, + List => 'Bag', + }, + EmbdEncRightsExprEncRightsExpr => { Flat => 1, Name => 'EmbeddedEncodedRightsExpr' }, + EmbdEncRightsExprRightsExprEncType => { Flat => 1, Name => 'EmbeddedEncodedRightsExprType' }, + EmbdEncRightsExprRightsExprLangId => { Flat => 1, Name => 'EmbeddedEncodedRightsExprLangID' }, + Event => { Writable => 'lang-alt' }, + IptcLastEdited => { + Name => 'IPTCLastEdited', + Groups => { 2 => 'Time' }, + %dateTimeInfo, + }, + LinkedEncRightsExpr => { + Struct => { + STRUCT_NAME => 'LEREDetails', + NAMESPACE => 'Iptc4xmpExt', + LinkedRightsExpr => { }, + RightsExprEncType => { }, + RightsExprLangId => { }, + }, + List => 'Bag', + }, + LinkedEncRightsExprLinkedRightsExpr => { Flat => 1, Name => 'LinkedEncodedRightsExpr' }, + LinkedEncRightsExprRightsExprEncType => { Flat => 1, Name => 'LinkedEncodedRightsExprType' }, + LinkedEncRightsExprRightsExprLangId => { Flat => 1, Name => 'LinkedEncodedRightsExprLangID' }, + LocationCreated => { + Struct => \%sLocationDetails, + Groups => { 2 => 'Location' }, + List => 'Bag', + }, + LocationShown => { + Struct => \%sLocationDetails, + Groups => { 2 => 'Location' }, + List => 'Bag', + }, + MaxAvailHeight => { Groups => { 2 => 'Image' }, Writable => 'integer' }, + MaxAvailWidth => { Groups => { 2 => 'Image' }, Writable => 'integer' }, + ModelAge => { List => 'Bag', Writable => 'integer' }, + OrganisationInImageCode => { List => 'Bag' }, + OrganisationInImageName => { List => 'Bag' }, + PersonInImage => { List => 'Bag' }, + PersonInImageWDetails => { + Struct => { + STRUCT_NAME => 'PersonDetails', + NAMESPACE => 'Iptc4xmpExt', + PersonId => { List => 'Bag' }, + PersonName => { Writable => 'lang-alt' }, + PersonCharacteristic => { + Struct => \%sCVTermDetails, + List => 'Bag', + }, + PersonDescription => { Writable => 'lang-alt' }, + }, + List => 'Bag', + }, + PersonInImageWDetailsPersonId => { Flat => 1, Name => 'PersonInImageId' }, + PersonInImageWDetailsPersonName => { Flat => 1, Name => 'PersonInImageName' }, + PersonInImageWDetailsPersonCharacteristic => { Flat => 1, Name => 'PersonInImageCharacteristic' }, + PersonInImageWDetailsPersonCharacteristicCvId => { Flat => 1, Name => 'PersonInImageCvTermCvId' }, + PersonInImageWDetailsPersonCharacteristicCvTermId => { Flat => 1, Name => 'PersonInImageCvTermId' }, + PersonInImageWDetailsPersonCharacteristicCvTermName => { Flat => 1, Name => 'PersonInImageCvTermName' }, + PersonInImageWDetailsPersonCharacteristicCvTermRefinedAbout => { Flat => 1, Name => 'PersonInImageCvTermRefinedAbout' }, + PersonInImageWDetailsPersonDescription => { Flat => 1, Name => 'PersonInImageDescription' }, + ProductInImage => { + Struct => { + STRUCT_NAME => 'ProductDetails', + NAMESPACE => 'Iptc4xmpExt', + ProductName => { Writable => 'lang-alt' }, + ProductGTIN => { }, + ProductDescription => { Writable => 'lang-alt' }, + }, + List => 'Bag', + }, + ProductInImageProductName => { Flat => 1, Name => 'ProductInImageName' }, + ProductInImageProductGTIN => { Flat => 1, Name => 'ProductInImageGTIN' }, + ProductInImageProductDescription => { Flat => 1, Name => 'ProductInImageDescription' }, + RegistryId => { + Name => 'RegistryID', + Struct => { + STRUCT_NAME => 'RegistryEntryDetails', + NAMESPACE => 'Iptc4xmpExt', + RegItemId => { }, + RegOrgId => { }, + RegEntryRole=> { }, # (new in 1.3) + }, + List => 'Bag', + }, + RegistryIdRegItemId => { Flat => 1, Name => 'RegistryItemID' }, + RegistryIdRegOrgId => { Flat => 1, Name => 'RegistryOrganisationID' }, + RegistryIdRegEntryRole => { Flat => 1, Name => 'RegistryEntryRole' }, + + # new Extension 1.3 properties + Genre => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sCVTermDetails }, + + # new video properties (Oct 2016, ref Michael Steidl) + # (see http://www.iptc.org/std/videometadatahub/recommendation/IPTC-VideoMetadataHub-props-Rec_1.0.html) + CircaDateCreated=> { Groups => { 2 => 'Time' } }, + Episode => { Groups => { 2 => 'Video' }, Struct => \%sEpisode }, + ExternalMetadataLink => { Groups => { 2 => 'Other' }, List => 'Bag' }, + FeedIdentifier => { Groups => { 2 => 'Video' } }, + PublicationEvent=> { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sPublicationEvent }, + Rating => { + Groups => { 2 => 'Other' }, + Struct => \%sRating, + List => 'Bag', + }, + ReleaseReady => { Groups => { 2 => 'Other' }, Writable => 'boolean' }, + Season => { Groups => { 2 => 'Video' }, Struct => \%sEpisode }, + Series => { Groups => { 2 => 'Video' }, Struct => \%sSeries }, + StorylineIdentifier => { Groups => { 2 => 'Video' }, List => 'Bag' }, + StylePeriod => { Groups => { 2 => 'Video' } }, + TemporalCoverage=> { Groups => { 2 => 'Video' }, Struct => \%sTemporalCoverage }, + WorkflowTag => { Groups => { 2 => 'Video' }, Struct => \%sCVTermDetails }, + DataOnScreen => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sTextRegion }, + Dopesheet => { Groups => { 2 => 'Video' }, Writable => 'lang-alt' }, + DopesheetLink => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sQualifiedLink }, + Headline => { Groups => { 2 => 'Video' }, Writable => 'lang-alt', Avoid => 1 }, + PersonHeard => { Groups => { 2 => 'Audio' }, List => 'Bag', Struct => \%sEntity }, + VideoShotType => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sEntity }, + EventExt => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sEntity, Name => 'ShownEvent' }, + Transcript => { Groups => { 2 => 'Video' }, Writable => 'lang-alt' }, + TranscriptLink => { Groups => { 2 => 'Video' }, List => 'Bag', Struct => \%sQualifiedLink }, + VisualColour => { + Name => 'VisualColor', + Groups => { 2 => 'Video' }, + PrintConv => { + 'bw-monochrome' => 'Monochrome', + 'colour' => 'Color', + }, + }, + Contributor => { List => 'Bag', Struct => \%sEntityWithRole }, + CopyrightYear => { Groups => { 2 => 'Time' }, Writable => 'integer' }, + Creator => { List => 'Bag', Struct => \%sEntityWithRole }, + SupplyChainSource => { Groups => { 2 => 'Other' }, List => 'Bag', Struct => \%sEntity }, + audioBitRate => { Groups => { 2 => 'Audio' }, Writable => 'integer', Name => 'AudioBitrate' }, + audioBitRateMode=> { + Name => 'AudioBitrateMode', + Groups => { 2 => 'Audio' }, + PrintConv => { + fixed => 'Fixed', + variable => 'Variable', + }, + }, + audioChannelCount => { Groups => { 2 => 'Audio' }, Writable => 'integer' }, + videoDisplayAspectRatio => { Groups => { 2 => 'Audio' }, Writable => 'rational' }, + ContainerFormat => { Groups => { 2 => 'Video' }, Struct => \%sEntity }, + StreamReady => { + Groups => { 2 => 'Video' }, + PrintConv => { + true => 'True', + false => 'False', + unknown => 'Unknown', + }, + }, + videoBitRate => { Groups => { 2 => 'Video' }, Writable => 'integer', Name => 'VideoBitrate' }, + videoBitRateMode => { + Name => 'VideoBitrateMode', + Groups => { 2 => 'Video' }, + PrintConv => { + fixed => 'Fixed', + variable => 'Variable', + }, + }, + videoEncodingProfile => { Groups => { 2 => 'Video' } }, + videoStreamsCount => { Groups => { 2 => 'Video' }, Writable => 'integer' }, + # new IPTC video metadata 1.1 properties + # (ref https://www.iptc.org/std/videometadatahub/recommendation/IPTC-VideoMetadataHub-props-Rec_1.1.html) + SnapshotLink => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sLinkedImage, Name => 'Snapshot' }, + # new IPTC video metadata 1.2 properties + # (ref http://www.iptc.org/std/videometadatahub/recommendation/IPTC-VideoMetadataHub-props-Rec_1.2.html) + RecDevice => { + Groups => { 2 => 'Device' }, + Struct => { + STRUCT_NAME => 'Device', + NAMESPACE => 'Iptc4xmpExt', + Manufacturer => { }, + ModelName => { }, + SerialNumber => { }, + AttLensDescription => { }, + OwnersDeviceId => { }, + }, + }, + PlanningRef => { List => 'Bag', Struct => \%sEntityWithRole }, + audioBitsPerSample => { Groups => { 2 => 'Audio' }, Writable => 'integer' }, + # new IPTC Extension schema 1.5 property + ImageRegion => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sImageRegion }, + # new Extension 1.6 property + EventId => { Name => 'EventID', List => 'Bag' }, +); + +#------------------------------------------------------------------------------ +# PRISM +# +# NOTE: The "Avoid" flag is set for all PRISM tags (via tag table AVOID flag) + +# my %obsolete = ( +# Notes => 'obsolete in 2.0', +# ValueConvInv => sub { +# my ($val, $self) = @_; +# unless ($self->Options('IgnoreMinorErrors')) { +# warn "Warning: [minor] Attempt to write obsolete tag\n"; +# return undef; +# } +# return $val; +# } +# ); + +# PRISM structure definitions +my %prismPublicationDate = ( + STRUCT_NAME => 'prismPublicationDate', + NAMESPACE => 'prism', + date => { %dateTimeInfo, Groups => { 2 => 'Time'} }, + 'a-platform'=> { }, +); + +# Publishing Requirements for Industry Standard Metadata (prism) (ref 2) +%Image::ExifTool::XMP::prism = ( + %xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-prism', 2 => 'Document' }, + NAMESPACE => 'prism', + AVOID => 1, + NOTES => q{ + Publishing Requirements for Industry Standard Metadata 3.0 namespace + tags. (see L<http://www.prismstandard.org/>) + }, + academicField => { }, # (3.0) + aggregateIssueNumber => { Writable => 'integer' }, # (3.0) + aggregationType => { List => 'Bag' }, + alternateTitle => { + List => 'Bag', + Struct => { # (becomes a structure in 3.0) + STRUCT_NAME => 'prismAlternateTitle', + NAMESPACE => 'prism', + text => { }, + 'a-platform'=> { }, + 'a-lang' => { }, + }, + }, + blogTitle => { }, # (3.0) + blogURL => { }, # (3.0) + bookEdition => { }, # (3.0) + byteCount => { Writable => 'integer' }, + channel => { + List => 'Bag', + Struct => { # (becomes a structure in 3.0) + STRUCT_NAME => 'prismChannel', + NAMESPACE => 'prism', + channel => { }, + subchannel1 => { }, + subchannel2 => { }, + subchannel3 => { }, + subchannel4 => { }, + 'a-lang' => { }, + }, + }, + complianceProfile=>{ PrintConv => { three => 'Three' } }, + contentType => { }, # (3.0) + copyrightYear => { }, # (3.0) + # copyright => { Groups => { 2 => 'Author' } }, # (deprecated in 3.0) + corporateEntity => { List => 'Bag' }, + coverDate => { %dateTimeInfo, Groups => { 2 => 'Time'} }, + coverDisplayDate=> { }, + creationDate => { %dateTimeInfo, Groups => { 2 => 'Time'} }, + dateRecieved => { %dateTimeInfo, Groups => { 2 => 'Time'} }, + device => { }, # (3.0) + distributor => { }, + doi => { Name => 'DOI', Description => 'Digital Object Identifier' }, + edition => { }, + eIssn => { }, + #embargoDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, # (deprecated in 3.0) + endingPage => { }, + event => { List => 'Bag' }, + #expirationDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, # (deprecated in 3.0) + genre => { List => 'Bag' }, + hasAlternative => { List => 'Bag' }, + hasCorrection => { + Struct => { # (becomes a structure in 3.0) + STRUCT_NAME => 'prismHasCorrection', + NAMESPACE => 'prism', + text => { }, + 'a-platform'=> { }, + 'a-lang' => { }, + }, + }, + # hasPreviousVersion => { }, # (not in 3.0) + hasTranslation => { List => 'Bag' }, + industry => { List => 'Bag' }, + isAlternativeOf => { List => 'Bag' }, # (3.0) + isbn => { Name => 'ISBN', List => 'Bag' }, # 2.1 (becomes a list in 3.0) + isCorrectionOf => { List => 'Bag' }, + issn => { Name => 'ISSN' }, + issueIdentifier => { }, + issueName => { }, + issueTeaser => { }, # (3.0) + issueType => { }, # (3.0) + isTranslationOf => { }, + keyword => { List => 'Bag' }, + killDate => { + Struct => { # (becomes a structure in 3.0) + STRUCT_NAME => 'prismKillDate', + NAMESPACE => 'prism', + date => { %dateTimeInfo, Groups => { 2 => 'Time'} }, + 'a-platform'=> { }, #PH (missed in spec?) + }, + }, + 'link' => { List => 'Bag' }, # (3.0) + location => { List => 'Bag' }, + # metadataContainer => { }, (not valid for PRISM XMP) + modificationDate=> { %dateTimeInfo, Groups => { 2 => 'Time'} }, + nationalCatalogNumber => { }, # (3.0) + number => { }, + object => { List => 'Bag' }, + onSaleDate => { # (3.0) + List => 'Bag', + Struct => { + STRUCT_NAME => 'prismOnSaleDate', + NAMESPACE => 'prism', + date => { %dateTimeInfo, Groups => { 2 => 'Time'} }, + 'a-platform'=> { }, + }, + }, + onSaleDay => { # (3.0) + List => 'Bag', + Struct => { + STRUCT_NAME => 'prismOnSaleDay', + NAMESPACE => 'prism', + day => { }, #PH (not named in spec) + 'a-platform'=> { }, + }, + }, + offSaleDate => { # (3.0) + List => 'Bag', + Struct => { + STRUCT_NAME => 'prismOffSaleDate', + NAMESPACE => 'prism', + date => { %dateTimeInfo, Groups => { 2 => 'Time'} }, + 'a-platform'=> { }, + }, + }, + organization => { List => 'Bag' }, + originPlatform => { + List => 'Bag', + PrintConv => { + email => 'E-Mail', + mobile => 'Mobile', + broadcast => 'Broadcast', + web => 'Web', + 'print' => 'Print', + recordableMedia => 'Recordable Media', + other => 'Other', + }, + }, + pageCount => { Writable => 'integer' }, # (3.0) + pageProgressionDirection => { # (3.0) + PrintConv => { LTR => 'Left to Right', RTL => 'Right to Left' }, + }, + pageRange => { List => 'Bag' }, + person => { }, + platform => { }, # (3.0) + productCode => { }, # (3.0) + profession => { }, # (3.0) + publicationDate => { + List => 'Bag', + Struct => \%prismPublicationDate, # (becomes a structure in 3.0) + }, + publicationDisplayDate => { # (3.0) + List => 'Bag', + Struct => \%prismPublicationDate, + }, + publicationName => { }, + publishingFrequency => { }, # (3.0) + rating => { }, + # rightsAgent => { }, # (deprecated in 3.0) + samplePageRange => { }, # (3.0) + section => { }, + sellingAgency => { }, # (3.0) + seriesNumber => { Writable => 'integer' }, # (3.0) + seriesTitle => { }, # (3.0) + sport => { }, # (3.0) + startingPage => { }, + subsection1 => { }, + subsection2 => { }, + subsection3 => { }, + subsection4 => { }, + subtitle => { }, # (3.0) + supplementDisplayID => { }, # (3.0) + supplementStartingPage => { }, # (3.0) + supplementTitle => { }, # (3.0) + teaser => { List => 'Bag' }, + ticker => { List => 'Bag' }, + timePeriod => { }, + url => { + Name => 'URL', + List => 'Bag', + Struct => { # (becomes a structure in 3.0) + STRUCT_NAME => 'prismUrl', + NAMESPACE => 'prism', + url => { }, + 'a-platform'=> { }, + }, + }, + uspsNumber => { }, # (3.0) + versionIdentifier => { }, + volume => { }, + wordCount => { Writable => 'integer' }, +# tags that existed in version 1.3 +# category => { %obsolete, List => 'Bag' }, +# hasFormat => { %obsolete, List => 'Bag' }, +# hasPart => { %obsolete, List => 'Bag' }, +# isFormatOf => { %obsolete, List => 'Bag' }, +# isPartOf => { %obsolete }, +# isReferencedBy => { %obsolete, List => 'Bag' }, +# isRequiredBy => { %obsolete, List => 'Bag' }, +# isVersionOf => { %obsolete }, +# objectTitle => { %obsolete, List => 'Bag' }, +# receptionDate => { %obsolete }, +# references => { %obsolete, List => 'Bag' }, +# requires => { %obsolete, List => 'Bag' }, +# tags in older versions +# page +# contentLength +# creationTime +# expirationTime +# hasVersion +# isAlternativeFor +# isBasedOn +# isBasisFor +# modificationTime +# publicationTime +# receptionTime +# releaseTime +); + +# PRISM Rights Language namespace (prl) (ref 2) +%Image::ExifTool::XMP::prl = ( + %xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-prl', 2 => 'Document' }, + NAMESPACE => 'prl', + AVOID => 1, + NOTES => q{ + PRISM Rights Language 2.1 namespace tags. These tags have been deprecated + since the release of the PRISM Usage Rights 3.0. (see + L<http://www.prismstandard.org/>) + }, + geography => { List => 'Bag' }, + industry => { List => 'Bag' }, + usage => { List => 'Bag' }, +); + +# PRISM Usage Rights namespace (prismusagerights) (ref 2) +%Image::ExifTool::XMP::pur = ( + %xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-pur', 2 => 'Document' }, + NAMESPACE => 'pur', + AVOID => 1, + NOTES => q{ + PRISM Usage Rights 3.0 namespace tags. (see + L<http://www.prismstandard.org/>) + }, + adultContentWarning => { List => 'Bag' }, + agreement => { List => 'Bag' }, + copyright => { + # (not clear in 3.0 spec, which lists only "bag Text", and called + # "copyrightDate" instead of "copyright" the PRISM basic 3.0 spec) + Writable => 'lang-alt', + Groups => { 2 => 'Author' }, + }, + creditLine => { List => 'Bag' }, + embargoDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, + exclusivityEndDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, + expirationDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, + imageSizeRestriction=> { }, + optionEndDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, + permissions => { List => 'Bag' }, + restrictions => { List => 'Bag' }, + reuseProhibited => { Writable => 'boolean' }, + rightsAgent => { }, + rightsOwner => { }, + # usageFee => { List => 'Bag' }, # (not in 3.0) +); + +# PRISM Metadata for Images namespace (pmi) (ref 2) +%Image::ExifTool::XMP::pmi = ( + %xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-pmi', 2 => 'Image' }, + NAMESPACE => 'pmi', + AVOID => 1, + NOTES => q{ + PRISM Metadata for Images 3.0 namespace tags. (see + L<http://www.prismstandard.org/>) + }, + color => { + PrintConv => { + bw => 'BW', + color => 'Color', + sepia => 'Sepia', + duotone => 'Duotone', + tritone => 'Tritone', + quadtone => 'Quadtone', + }, + }, + contactInfo => { }, + displayName => { }, + distributorProductID => { }, + eventAlias => { }, + eventEnd => { }, + eventStart => { }, + eventSubtype => { }, + eventType => { }, + field => { }, + framing => { }, + location => { }, + make => { }, + manufacturer => { }, + model => { }, + modelYear => { }, + objectDescription=>{ }, + objectSubtype => { }, + objectType => { }, + orientation => { + PrintConv => { + horizontal => 'Horizontal', + vertical => 'Vertical', + } + }, + positionDescriptor => { }, + productID => { }, + productIDType => { }, + season => { + PrintConv => { + spring => 'Spring', + summer => 'Summer', + fall => 'Fall', + winter => 'Winter', + }, + }, + sequenceName => { }, + sequenceNumber => { }, + sequenceTotalNumber => { }, + setting => { }, + shootID => { }, + slideshowName => { }, + slideshowNumber => { Writable => 'integer' }, + slideshowTotalNumber => { Writable => 'integer' }, + viewpoint => { }, + visualTechnique => { }, +); + +# PRISM Recipe Metadata (prm) (ref 2) +%Image::ExifTool::XMP::prm = ( + %xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-prm', 2 => 'Document' }, + NAMESPACE => 'prm', + AVOID => 1, + NOTES => q{ + PRISM Recipe Metadata 3.0 namespace tags. (see + L<http://www.prismstandard.org/>) + }, + cookingEquipment => { }, + cookingMethod => { }, + course => { }, + cuisine => { }, + dietaryNeeds => { }, + dishType => { }, + duration => { }, + ingredientExclusion => { }, + mainIngredient => { }, + meal => { }, + recipeEndingPage => { }, + recipePageRange => { }, + recipeSource => { }, + recipeStartingPage => { }, + recipeTitle => { }, + servingSize => { }, + skillLevel => { }, + specialOccasion => { }, + yield => { }, +); + +#------------------------------------------------------------------------------ + +# DICOM namespace properties (DICOM) (ref PH, written by CS3) +%Image::ExifTool::XMP::DICOM = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-DICOM', 2 => 'Image' }, + NAMESPACE => 'DICOM', + NOTES => q{ + DICOM namespace tags. These XMP tags allow some DICOM information to be + stored in files of other than DICOM format. See the + L<DICOM Tags documentation|Image::ExifTool::TagNames/DICOM Tags> for a list + of tags available in DICOM-format files. + }, + # change some tag names to correspond with DICOM tags + PatientName => { }, + PatientID => { }, + PatientSex => { }, + PatientDOB => { + Name => 'PatientBirthDate', + Groups => { 2 => 'Time' }, + %dateTimeInfo, + }, + StudyID => { }, + StudyPhysician => { }, + StudyDateTime => { Groups => { 2 => 'Time' }, %dateTimeInfo }, + StudyDescription => { }, + SeriesNumber => { }, + SeriesModality => { }, + SeriesDateTime => { Groups => { 2 => 'Time' }, %dateTimeInfo }, + SeriesDescription => { }, + EquipmentInstitution => { }, + EquipmentManufacturer => { }, +); + +# PixelLive namespace properties (PixelLive) (ref 3) +%Image::ExifTool::XMP::PixelLive = ( + GROUPS => { 1 => 'XMP-PixelLive', 2 => 'Image' }, + NAMESPACE => 'PixelLive', + AVOID => 1, + NOTES => q{ + PixelLive namespace tags. These tags are not writable because they are very + uncommon and I haven't been able to locate a reference which gives the + namespace URI. + }, + AUTHOR => { Name => 'Author', Groups => { 2 => 'Author' } }, + COMMENTS => { Name => 'Comments' }, + COPYRIGHT => { Name => 'Copyright', Groups => { 2 => 'Author' } }, + DATE => { Name => 'Date', Groups => { 2 => 'Time' } }, + GENRE => { Name => 'Genre' }, + TITLE => { Name => 'Title' }, +); + +# Extensis Portfolio tags (extensis) (ref 11) +%Image::ExifTool::XMP::extensis = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-extensis', 2 => 'Image' }, + NAMESPACE => 'extensis', + NOTES => 'Tags used by Extensis Portfolio.', + Approved => { Writable => 'boolean' }, + ApprovedBy => { }, + ClientName => { }, + JobName => { }, + JobStatus => { }, + RoutedTo => { }, + RoutingNotes => { }, + WorkToDo => { }, +); + +# IDimager structures (ref PH) +my %sTagStruct; +%sTagStruct = ( + STRUCT_NAME => 'TagStructure', + NAMESPACE => 'ics', + LabelName => { }, + Reference => { }, + ParentReference => { }, + SubLabels => { Struct => \%sTagStruct, List => 'Bag' }, +); +my %sSubVersion = ( + STRUCT_NAME => 'SubVersion', + NAMESPACE => 'ics', + VersRef => { }, + FileName => { }, +); + +# IDimager namespace (ics) (ref PH) +%Image::ExifTool::XMP::ics = ( + %xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-ics', 2 => 'Image' }, + NAMESPACE => 'ics', + NOTES => q{ + Tags used by IDimager. Nested TagStructure structures are unrolled to an + arbitrary depth of 6 to avoid infinite recursion. + }, + ImageRef => { }, + TagStructure => { Struct => \%sTagStruct, List => 'Bag' }, + TagStructureLabelName => { Name => 'LabelName1', Flat => 1 }, + TagStructureReference => { Name => 'Reference1', Flat => 1 }, + TagStructureSubLabels => { Name => 'SubLabels1', Flat => 1 }, + TagStructureParentReference => { Name => 'ParentReference1', Flat => 1 }, + TagStructureSubLabelsLabelName => { Name => 'LabelName2', Flat => 1 }, + TagStructureSubLabelsReference => { Name => 'Reference2', Flat => 1 }, + TagStructureSubLabelsSubLabels => { Name => 'SubLabels2', Flat => 1 }, + TagStructureSubLabelsParentReference => { Name => 'ParentReference2', Flat => 1 }, + TagStructureSubLabelsSubLabelsLabelName => { Name => 'LabelName3', Flat => 1 }, + TagStructureSubLabelsSubLabelsReference => { Name => 'Reference3', Flat => 1 }, + TagStructureSubLabelsSubLabelsSubLabels => { Name => 'SubLabels3', Flat => 1 }, + TagStructureSubLabelsSubLabelsParentReference => { Name => 'ParentReference3', Flat => 1 }, + TagStructureSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName4', Flat => 1 }, + TagStructureSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference4', Flat => 1 }, + TagStructureSubLabelsSubLabelsSubLabelsSubLabels => { Name => 'SubLabels4', Flat => 1 }, + TagStructureSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference4', Flat => 1 }, + TagStructureSubLabelsSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName5', Flat => 1 }, + TagStructureSubLabelsSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference5', Flat => 1 }, + TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabels => { Name => 'SubLabels5', Flat => 1, NoSubStruct => 1 }, # break infinite recursion + TagStructureSubLabelsSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference5', Flat => 1 }, + TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsLabelName => { Name => 'LabelName6', Flat => 1 }, + TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsReference => { Name => 'Reference6', Flat => 1 }, + TagStructureSubLabelsSubLabelsSubLabelsSubLabelsSubLabelsParentReference => { Name => 'ParentReference6', Flat => 1 }, + SubVersions => { Struct => \%sSubVersion, List => 'Bag' }, + SubVersionsVersRef => { Name => 'SubVersionReference', Flat => 1 }, + SubVersionsFileName => { Name => 'SubVersionFileName', Flat => 1 }, + TimeStamp => { Avoid => 1, Groups => { 2 => 'Time' }, %dateTimeInfo }, + AppVersion => { Avoid => 1 }, +); + +# ACDSee namespace (acdsee) (ref PH) +%Image::ExifTool::XMP::acdsee = ( + %xmpTableDefaults, + GROUPS => { 0 => 'XMP', 1 => 'XMP-acdsee', 2 => 'Image' }, + NAMESPACE => 'acdsee', + AVOID => 1, + NOTES => q{ + ACD Systems ACDSee namespace tags. + + (A note to software developers: Re-inventing your own private tags instead + of using the equivalent tags in standard XMP namespaces defeats one of the + most valuable features of metadata: interoperability. Your applications + mumble to themselves instead of speaking out for the rest of the world to + hear.) + }, + author => { Groups => { 2 => 'Author' } }, + caption => { }, + categories => { }, + collections=> { }, + datetime => { Name => 'DateTime', Groups => { 2 => 'Time' }, %dateTimeInfo }, + keywords => { List => 'Bag' }, + notes => { }, + rating => { Writable => 'real' }, # integer? + tagged => { Writable => 'boolean' }, + rawrppused => { Writable => 'boolean' }, + rpp => { + Name => 'RPP', + Writable => 'lang-alt', + Notes => 'raw processing settings in XML format', + Binary => 1, + }, + dpp => { + Name => 'DPP', + Writable => 'lang-alt', + Notes => 'newer version of XML raw processing settings', + Binary => 1, + }, + # more tags (ref forum6840) + FixtureIdentifier => { }, + EditStatus => { }, + ReleaseDate => { }, + ReleaseTime => { }, + OriginatingProgram => { }, + ObjectCycle => { }, + Snapshots => { List => 'Bag', Binary => 1 }, +); + +# Picture Licensing Universal System namespace properties (xmpPLUS) +%Image::ExifTool::XMP::xmpPLUS = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-xmpPLUS', 2 => 'Author' }, + NAMESPACE => 'xmpPLUS', + AVOID => 1, + NOTES => q{ + XMP Picture Licensing Universal System (PLUS) tags as written by some older + Adobe applications. See L<PLUS XMP Tags|Image::ExifTool::TagNames/PLUS XMP Tags> + for the current PLUS tags. + }, + CreditLineReq => { Writable => 'boolean' }, + ReuseAllowed => { Writable => 'boolean' }, +); + +# Creative Commons namespace properties (cc) (ref 5) +%Image::ExifTool::XMP::cc = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-cc', 2 => 'Author' }, + NAMESPACE => 'cc', + NOTES => q{ + Creative Commons namespace tags. Note that the CC specification for XMP is + non-existent, so ExifTool must make some assumptions about the format of the + specific properties in XMP (see L<http://creativecommons.org/ns>). + }, + # Work properties + license => { Resource => 1 }, + attributionName => { }, + attributionURL => { Resource => 1 }, + morePermissions => { Resource => 1 }, + useGuidelines => { Resource => 1 }, + # License properties + permits => { + List => 'Bag', + Resource => 1, + PrintConv => { + 'cc:Sharing' => 'Sharing', + 'cc:DerivativeWorks' => 'Derivative Works', + 'cc:Reproduction' => 'Reproduction', + 'cc:Distribution' => 'Distribution', + }, + }, + requires => { + List => 'Bag', + Resource => 1, + PrintConv => { + 'cc:Copyleft' => 'Copyleft', + 'cc:LesserCopyleft' => 'Lesser Copyleft', + 'cc:SourceCode' => 'Source Code', + 'cc:ShareAlike' => 'Share Alike', + 'cc:Notice' => 'Notice', + 'cc:Attribution' => 'Attribution', + }, + }, + prohibits => { + List => 'Bag', + Resource => 1, + PrintConv => { + 'cc:HighIncomeNationUse' => 'High Income Nation Use', + 'cc:CommercialUse' => 'Commercial Use', + }, + }, + jurisdiction => { Resource => 1 }, + legalcode => { Name => 'LegalCode', Resource => 1 }, + deprecatedOn => { %dateTimeInfo, Groups => { 2 => 'Time' } }, +); + +# Description Explorer namespace properties (dex) (ref 6) +%Image::ExifTool::XMP::dex = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-dex', 2 => 'Image' }, + NAMESPACE => 'dex', + NOTES => q{ + Description Explorer namespace tags. These tags are not very common. The + Source and Rating tags are avoided when writing due to name conflicts with + other XMP tags. (see L<http://www.optimasc.com/products/fileid/>) + }, + crc32 => { Name => 'CRC32', Writable => 'integer' }, + source => { Avoid => 1 }, + shortdescription => { + Name => 'ShortDescription', + Writable => 'lang-alt', + }, + licensetype => { + Name => 'LicenseType', + PrintConv => { + unknown => 'Unknown', + shareware => 'Shareware', + freeware => 'Freeware', + adware => 'Adware', + demo => 'Demo', + commercial => 'Commercial', + 'public domain' => 'Public Domain', + 'open source' => 'Open Source', + }, + }, + revision => { }, + rating => { Avoid => 1 }, + os => { Name => 'OS', Writable => 'integer' }, + ffid => { Name => 'FFID' }, +); + +# iView MediaPro namespace properties (mediapro) (ref PH) +%Image::ExifTool::XMP::MediaPro = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-mediapro', 2 => 'Image' }, + NAMESPACE => 'mediapro', + NOTES => 'iView MediaPro namespace tags.', + Event => { + Avoid => 1, + Notes => 'avoided due to conflict with XMP-iptcExt:Event', + }, + Location => { + Avoid => 1, + Groups => { 2 => 'Location' }, + Notes => 'avoided due to conflict with XMP-iptcCore:Location', + }, + Status => { }, + People => { List => 'Bag' }, + UserFields => { List => 'Bag' }, + CatalogSets => { List => 'Bag' }, +); + +# Microsoft ExpressionMedia namespace properties (expressionmedia) +# (ref https://exiftool.org/forum/index.php/topic,4235.0.html) +%Image::ExifTool::XMP::ExpressionMedia = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-expressionmedia', 2 => 'Image' }, + NAMESPACE => 'expressionmedia', + AVOID => 1, + NOTES => q{ + Microsoft Expression Media namespace tags. These tags are avoided when + writing due to name conflicts with tags in other schemas. + }, + Event => { }, + Status => { }, + People => { List => 'Bag' }, + CatalogSets => { List => 'Bag' }, +); + +# DigiKam namespace tags (ref PH) +%Image::ExifTool::XMP::digiKam = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-digiKam', 2 => 'Image' }, + NAMESPACE => 'digiKam', + NOTES => 'DigiKam namespace tags.', + CaptionsAuthorNames => { Writable => 'lang-alt' }, + CaptionsDateTimeStamps => { Writable => 'lang-alt', Groups => { 2 => 'Time' } }, + TagsList => { List => 'Seq' }, + ColorLabel => { }, + PickLabel => { }, + ImageHistory => { Avoid => 1, Notes => 'different format from EXIF:ImageHistory' }, + LensCorrectionSettings => { }, + ImageUniqueID => { Avoid => 1 }, +); + +# SWF namespace tags (ref PH) +%Image::ExifTool::XMP::swf = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-swf', 2 => 'Image' }, + NAMESPACE => 'swf', + NOTES => 'Adobe SWF namespace tags.', + type => { Avoid => 1 }, + bgalpha => { Name => 'BackgroundAlpha', Writable => 'integer' }, + forwardlock => { Name => 'ForwardLock', Writable => 'boolean' }, + maxstorage => { Name => 'MaxStorage', Writable => 'integer' }, # (CS5) +); + +# Sony Ericsson cell phone location tags +# refs: http://www.opencellid.org/api +# http://zonetag.research.yahoo.com/faq_location.php +# http://www.cs.columbia.edu/sip/drafts/LIF%20TS%20101%20v2.0.0.pdf +%Image::ExifTool::XMP::cell = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-cell', 2 => 'Location' }, + NAMESPACE => 'cell', + NOTES => 'Location tags written by some Sony Ericsson phones.', + mcc => { Name => 'MobileCountryCode' }, + mnc => { Name => 'MobileNetworkCode' }, + lac => { Name => 'LocationAreaCode' }, + cellid => { Name => 'CellTowerID' }, + cgi => { Name => 'CellGlobalID' }, + r => { Name => 'CellR' }, # (what is this? Radius?) +); + +# Apple adjustment settings (ref PH) +%Image::ExifTool::XMP::aas = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-aas', 2 => 'Image' }, + NAMESPACE => 'aas', + NOTES => 'Apple Adjustment Settings used by iPhone/iPad.', + CropX => { Writable => 'integer', Avoid => 1 }, + CropY => { Writable => 'integer', Avoid => 1 }, + CropW => { Writable => 'integer', Avoid => 1 }, + CropH => { Writable => 'integer', Avoid => 1 }, + AffineA => { Writable => 'real' }, + AffineB => { Writable => 'real' }, + AffineC => { Writable => 'real' }, + AffineD => { Writable => 'real' }, + AffineX => { Writable => 'real' }, + AffineY => { Writable => 'real' }, + Vibrance => { Writable => 'real', Avoid => 1 }, + Curve0x => { Writable => 'real' }, + Curve0y => { Writable => 'real' }, + Curve1x => { Writable => 'real' }, + Curve1y => { Writable => 'real' }, + Curve2x => { Writable => 'real' }, + Curve2y => { Writable => 'real' }, + Curve3x => { Writable => 'real' }, + Curve3y => { Writable => 'real' }, + Curve4x => { Writable => 'real' }, + Curve4y => { Writable => 'real' }, + Shadows => { Writable => 'real', Avoid => 1 }, + Highlights => { Writable => 'real', Avoid => 1 }, + # the following from StarGeek + FaceBalanceOrigI => { Writable => 'real' }, + FaceBalanceOrigQ => { Writable => 'real' }, + FaceBalanceStrength => { Writable => 'real' }, + FaceBalanceWarmth => { Writable => 'real' }, +); + +# Adobe creatorAtom properties (ref PH) +%Image::ExifTool::XMP::creatorAtom = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-creatorAtom', 2 => 'Image' }, + NAMESPACE => 'creatorAtom', + NOTES => 'Adobe creatorAtom tags, written by After Effects.', + macAtom => { + Struct => { + STRUCT_NAME => 'MacAtom', + NAMESPACE => 'creatorAtom', + applicationCode => { }, + invocationAppleEvent => { }, + posixProjectPath => { }, + }, + }, + windowsAtom => { + Struct => { + STRUCT_NAME => 'WindowsAtom', + NAMESPACE => 'creatorAtom', + extension => { }, + invocationFlags => { }, + uncProjectPath => { }, + }, + }, + aeProjectLink => { # (After Effects Project Link) + Struct => { + STRUCT_NAME => 'AEProjectLink', + NAMESPACE => 'creatorAtom', + renderTimeStamp => { Writable => 'integer' }, + compositionID => { }, + renderQueueItemID => { }, + renderOutputModuleIndex => { }, + fullPath => { }, + }, + }, +); + +# FastPictureViewer namespace properties (http://www.fastpictureviewer.com/help/#rtfcomments) +%Image::ExifTool::XMP::fpv = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-fpv', 2 => 'Image' }, + NAMESPACE => 'fpv', + NOTES => q{ + Fast Picture Viewer tags (see + L<http://www.fastpictureviewer.com/help/#rtfcomments>). + }, + RichTextComment => { }, +); + +# Apple FaceInfo namespace properties (ref PH) +%Image::ExifTool::XMP::apple_fi = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-apple-fi', 2 => 'Image' }, + NAMESPACE => 'apple-fi', + NOTES => q{ + Face information tags written by the Apple iPhone 5 inside the mwg-rs + RegionExtensions. + }, + Timestamp => { + Name => 'TimeStamp', + Writable => 'integer', + # (don't know how to convert this) + }, + FaceID => { Writable => 'integer' }, + AngleInfoRoll => { Writable => 'integer' }, + AngleInfoYaw => { Writable => 'integer' }, + ConfidenceLevel => { Writable => 'integer' }, +); + +# Google audio namespace +%Image::ExifTool::XMP::GAudio = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-GAudio', 2 => 'Audio' }, + NAMESPACE => 'GAudio', + Data => { + Name => 'AudioData', + ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)', + ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)', + }, + Mime => { Name => 'AudioMimeType' }, +); + +# Google image namespace +%Image::ExifTool::XMP::GImage = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-GImage', 2 => 'Image' }, + NAMESPACE => 'GImage', + Data => { + Name => 'ImageData', + ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)', + ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)', + }, + Mime => { Name => 'ImageMimeType' }, +); + +# Google panorama namespace properties +# (ref https://exiftool.org/forum/index.php/topic,4569.0.html) +%Image::ExifTool::XMP::GPano = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-GPano', 2 => 'Image' }, + NAMESPACE => 'GPano', + NOTES => q{ + Panorama tags written by Google Photosphere. See + L<https://developers.google.com/panorama/metadata/> for the specification. + }, + UsePanoramaViewer => { Writable => 'boolean' }, + CaptureSoftware => { }, + StitchingSoftware => { }, + ProjectionType => { }, + PoseHeadingDegrees => { Writable => 'real' }, + PosePitchDegrees => { Writable => 'real' }, + PoseRollDegrees => { Writable => 'real' }, + InitialViewHeadingDegrees => { Writable => 'real' }, + InitialViewPitchDegrees => { Writable => 'real' }, + InitialViewRollDegrees => { Writable => 'real' }, + InitialHorizontalFOVDegrees => { Writable => 'real' }, + InitialVerticalFOVDegrees => { Writable => 'real' }, + FirstPhotoDate => { %dateTimeInfo, Groups => { 2 => 'Time' } }, + LastPhotoDate => { %dateTimeInfo, Groups => { 2 => 'Time' } }, + SourcePhotosCount => { Writable => 'integer' }, + ExposureLockUsed => { Writable => 'boolean' }, + CroppedAreaImageWidthPixels => { Writable => 'real' }, + CroppedAreaImageHeightPixels => { Writable => 'real' }, + FullPanoWidthPixels => { Writable => 'real' }, + FullPanoHeightPixels => { Writable => 'real' }, + CroppedAreaLeftPixels => { Writable => 'real' }, + CroppedAreaTopPixels => { Writable => 'real' }, + InitialCameraDolly => { Writable => 'real' }, + # (the following have been observed, but are not in the specification) + LargestValidInteriorRectLeft => { Writable => 'real' }, + LargestValidInteriorRectTop => { Writable => 'real' }, + LargestValidInteriorRectWidth => { Writable => 'real' }, + LargestValidInteriorRectHeight => { Writable => 'real' }, +); + +# Google Spherical Images namespace (ref https://github.com/google/spatial-media/blob/master/docs/spherical-video-rfc.md) +%Image::ExifTool::XMP::GSpherical = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-GSpherical', 2 => 'Image' }, + WRITE_GROUP => 'GSpherical', # write in special location for video files + NAMESPACE => 'GSpherical', + AVOID => 1, + NOTES => q{ + Not actually XMP. These RDF/XML tags are used in Google spherical MP4 + videos. These tags are written into the video track of MOV/MP4 files, and + not at the top level like other XMP tags. See + L<https://github.com/google/spatial-media/blob/master/docs/spherical-video-rfc.md> + for the specification. + }, + # (avoid due to conflicts with XMP-GPano tags) + Spherical => { Writable => 'boolean' }, + Stitched => { Writable => 'boolean' }, + StitchingSoftware => { }, + ProjectionType => { }, + StereoMode => { }, + SourceCount => { Writable => 'integer' }, + InitialViewHeadingDegrees => { Writable => 'real' }, + InitialViewPitchDegrees => { Writable => 'real' }, + InitialViewRollDegrees => { Writable => 'real' }, + Timestamp => { + Name => 'TimeStamp', + Groups => { 2 => 'Time' }, + Writable => 'integer', + Shift => 'Time', + ValueConv => 'ConvertUnixTime($val)', #(NC) + ValueConvInv => 'GetUnixTime($val)', + PrintConv => '$self->ConvertDateTime($val)', + PrintConvInv => '$self->InverseDateTime($val)', + }, + FullPanoWidthPixels => { Writable => 'integer' }, + FullPanoHeightPixels => { Writable => 'integer' }, + CroppedAreaImageWidthPixels => { Writable => 'integer' }, + CroppedAreaImageHeightPixels=> { Writable => 'integer' }, + CroppedAreaLeftPixels => { Writable => 'integer' }, + CroppedAreaTopPixels => { Writable => 'integer' }, +); + +# Google depthmap information (ref https://developers.google.com/depthmap-metadata/reference) +%Image::ExifTool::XMP::GDepth = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-GDepth', 2 => 'Image' }, + NAMESPACE => 'GDepth', + AVOID => 1, # (too many potential tag name conflicts) + NOTES => q{ + Google depthmap information. See + L<https://developers.google.com/depthmap-metadata/> for the specification. + }, + WRITABLE => 'string', # (default to string-type tags) + PRIORITY => 0, + Format => { + PrintConv => { + RangeInverse => 'RangeInverse', + RangeLinear => 'RangeLinear', + }, + }, + Near => { Writable => 'real' }, + Far => { Writable => 'real' }, + Mime => { }, + Data => { + Name => 'DepthImage', + ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)', + ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)', + }, + Units => { }, + MeasureType => { + PrintConv => { + OpticalAxis => 'OpticalAxis', + OpticalRay => 'OpticalRay', + }, + }, + ConfidenceMime => { }, + Confidence => { + ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)', + ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)', + }, + Manufacturer=> { }, + Model => { }, + Software => { }, + ImageWidth => { Writable => 'real' }, + ImageHeight => { Writable => 'real' }, +); + +# Google focus namespace +%Image::ExifTool::XMP::GFocus = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-GFocus', 2 => 'Image' }, + NAMESPACE => 'GFocus', + NOTES => 'Focus information found in Google depthmap images.', + BlurAtInfinity => { Writable => 'real' }, + FocalDistance => { Writable => 'real' }, + FocalPointX => { Writable => 'real' }, + FocalPointY => { Writable => 'real' }, +); + +# Google camera namespace (ref PH) +%Image::ExifTool::XMP::GCamera = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-GCamera', 2 => 'Camera' }, + NAMESPACE => 'GCamera', + NOTES => 'Camera information found in Google panorama images.', + BurstID => { }, + BurstPrimary => { }, + PortraitNote => { }, + PortraitRequest => { + Notes => 'High Definition Render Pipeline (HDRP) data', #PH (guess) + ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)', + ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)', + }, + PortraitVersion => { }, + SpecialTypeID => { List => 'Bag' }, + PortraitNote => { }, + DisableAutoCreation => { List => 'Bag' }, + hdrp_makernote => { + Name => 'HDRPMakerNote', + # decoded data starts with the following bytes, but nothing yet is known about its contents: + # 48 44 52 50 02 ef 64 35 6d 5e 70 1e 2c ea e3 4c [HDRP..d5m^p.,..L] + ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)', + ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)', + }, + MicroVideo => { Writable => 'integer' }, + MicroVideoVersion => { Writable => 'integer' }, + MicroVideoOffset => { Writable => 'integer' }, + MicroVideoPresentationTimestampUs => { Writable => 'integer' }, +); + +# Google creations namespace (ref PH) +%Image::ExifTool::XMP::GCreations = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-GCreations', 2 => 'Camera' }, + NAMESPACE => 'GCreations', + NOTES => 'Google creations tags.', + CameraBurstID => { }, +); + +# Google depth-map Device namespace (ref 13) +%Image::ExifTool::XMP::Device = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-Device', 2 => 'Camera' }, + NAMESPACE => { Device => 'http://ns.google.com/photos/dd/1.0/device/' }, + NOTES => q{ + Google depth-map Device tags. See + L<https://developer.android.com/training/camera2/Dynamic-depth-v1.0.pdf> for + the specification. + }, + Container => { + Struct => { + STRUCT_NAME => 'DeviceContainer', + NAMESPACE => { Container => 'http://ns.google.com/photos/dd/1.0/container/' }, + Directory => { + List => 'Seq', + Struct => { + STRUCT_NAME => 'DeviceDirectory', + NAMESPACE => { Container => 'http://ns.google.com/photos/dd/1.0/container/' }, + Item => { + Struct => { + STRUCT_NAME => 'DeviceItem', + NAMESPACE => { Item => 'http://ns.google.com/photos/dd/1.0/item/' }, + Mime => { }, + Length => { Writable => 'integer' }, + Padding => { Writable => 'integer' }, + DataURI => { }, + }, + }, + }, + } + }, + }, + Profiles => { + List => 'Seq', + FlatName => '', + Struct => { + STRUCT_NAME => 'DeviceProfiles', + NAMESPACE => { Device => 'http://ns.google.com/photos/dd/1.0/device/' }, + Profile => { + Struct => { + STRUCT_NAME => 'DeviceProfile', + NAMESPACE => { Profile => 'http://ns.google.com/photos/dd/1.0/profile/' }, + CameraIndices => { List => 'Seq', Writable => 'integer' }, + Type => { }, + }, + }, + }, + }, + Cameras => { + List => 'Seq', + FlatName => '', + Struct => { + STRUCT_NAME => 'DeviceCameras', + NAMESPACE => { Device => 'http://ns.google.com/photos/dd/1.0/device/' }, + Camera => { + Struct => { + STRUCT_NAME => 'DeviceCamera', + NAMESPACE => { Camera => 'http://ns.google.com/photos/dd/1.0/camera/' }, + DepthMap => { + Struct => { + STRUCT_NAME => 'DeviceDepthMap', + NAMESPACE => { DepthMap => 'http://ns.google.com/photos/dd/1.0/depthmap/' }, + ConfidenceURI => { }, + DepthURI => { }, + Far => { Writable => 'real' }, + Format => { }, + ItemSemantic=> { }, + MeasureType => { }, + Near => { Writable => 'real' }, + Units => { }, + Software => { }, + FocalTableEntryCount => { Writable => 'integer' }, + FocalTable => { }, # (base64) + }, + }, + Image => { + Struct => { + STRUCT_NAME => 'DeviceImage', + NAMESPACE => { Image => 'http://ns.google.com/photos/dd/1.0/image/' }, + ItemSemantic=> { }, + ItemURI => { }, + }, + }, + ImagingModel => { + Struct => { + STRUCT_NAME => 'DeviceImagingModel', + NAMESPACE => { ImagingModel => 'http://ns.google.com/photos/dd/1.0/imagingmodel/' }, + Distortion => { }, # (base64) + DistortionCount => { Writable => 'integer' }, + FocalLengthX => { Writable => 'real' }, + FocalLengthY => { Writable => 'real' }, + ImageHeight => { Writable => 'integer' }, + ImageWidth => { Writable => 'integer' }, + PixelAspectRatio=> { Writable => 'real' }, + PrincipalPointX => { Writable => 'real' }, + PrincipalPointY => { Writable => 'real' }, + Skew => { Writable => 'real' }, + }, + }, + PointCloud => { + Struct => { + STRUCT_NAME => 'DevicePointCloud', + NAMESPACE => { PointCloud => 'http://ns.google.com/photos/dd/1.0/pointcloud/' }, + PointCloud => { Writable => 'integer' }, + Points => { }, + Metric => { Writable => 'boolean' }, + }, + }, + Pose => { Struct => \%sPose }, + LightEstimate => { + Struct => { + STRUCT_NAME => 'DeviceLightEstimate', + NAMESPACE => { LightEstimate => 'http://ns.google.com/photos/dd/1.0/lightestimate/' }, + ColorCorrectionR => { Writable => 'real' }, + ColorCorrectionG => { Writable => 'real' }, + ColorCorrectionB => { Writable => 'real' }, + PixelIntensity => { Writable => 'real' }, + }, + }, + VendorInfo => { Struct => \%sVendorInfo }, + AppInfo => { Struct => \%sAppInfo }, + Trait => { }, + }, + }, + }, + }, + VendorInfo => { Struct => \%sVendorInfo }, + AppInfo => { Struct => \%sAppInfo }, + EarthPos => { Struct => \%sEarthPose }, + Pose => { Struct => \%sPose }, + Planes => { + List => 'Seq', + FlatName => '', + Struct => { + STRUCT_NAME => 'DevicePlanes', + NAMESPACE => { Device => 'http://ns.google.com/photos/dd/1.0/device/' }, + Plane => { + Struct => { + STRUCT_NAME => 'DevicePlane', + NAMESPACE => { Plane => 'http://ns.google.com/photos/dd/1.0/plane/' }, + Pose => { Struct => \%sPose }, + ExtentX => { Writable => 'real' }, + ExtentZ => { Writable => 'real' }, + BoundaryVertexCount => { Writable => 'integer' }, + Boundary => { }, + }, + }, + }, + }, +); + +# Getty Images namespace (ref PH) +%Image::ExifTool::XMP::GettyImages = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-getty', 2 => 'Image' }, + NAMESPACE => 'GettyImagesGIFT', + NOTES => q{ + The actual Getty Images namespace prefix is "GettyImagesGIFT", which is the + prefix recorded in the file, but ExifTool shortens this for the family 1 + group name. + }, + Personality => { List => 'Bag' }, + OriginalFilename => { Name => 'OriginalFileName' }, + ParentMEID => { }, + # the following from StarGeek + AssetID => { }, + CallForImage => { }, + CameraFilename => { }, + CameraMakeModel => { Avoid => 1 }, + Composition => { }, + CameraSerialNumber => { Avoid => 1 }, + ExclusiveCoverage => { }, + GIFTFtpPriority => { }, + ImageRank => { }, + MediaEventIdDate => { }, + OriginalCreateDateTime => { %dateTimeInfo, Groups => { 2 => 'Time' }, Avoid => 1 }, + ParentMediaEventID => { }, + PrimaryFTP => { List => 'Bag' }, + RoutingDestinations => { List => 'Bag' }, + RoutingExclusions => { List => 'Bag' }, + SecondaryFTP => { List => 'Bag' }, + TimeShot => { }, +); + +# RED smartphone images (ref PH) +%Image::ExifTool::XMP::LImage = ( + %xmpTableDefaults, + GROUPS => { 1 => 'XMP-LImage', 2 => 'Image' }, + NAMESPACE => 'LImage', + NOTES => 'Tags written by RED smartphones.', + MajorVersion => { }, + MinorVersion => { }, + RightAlbedo => { + Notes => 'Right stereoscopic image', + Groups => { 2 => 'Preview' }, + ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)', + ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)', + }, +); + +# SVG namespace properties (ref 9) +%Image::ExifTool::XMP::SVG = ( + GROUPS => { 0 => 'SVG', 1 => 'SVG', 2 => 'Image' }, + NAMESPACE => 'svg', + LANG_INFO => \&GetLangInfo, + NOTES => q{ + SVG (Scalable Vector Graphics) image tags. By default, only the top-level + SVG and Metadata tags are extracted from these images, but all graphics tags + may be extracted by setting the Unknown option to 2 (-U on the command + line). The SVG tags are not part of XMP as such, but are included with the + XMP module for convenience. (see L<http://www.w3.org/TR/SVG11/>) + }, + version => 'SVGVersion', + id => 'ID', + metadataId => 'MetadataID', + width => { + Name => 'ImageWidth', + ValueConv => '$val =~ s/px$//; $val', + }, + height => { + Name => 'ImageHeight', + ValueConv => '$val =~ s/px$//; $val', + }, +); + +# table to add tags in other namespaces +%Image::ExifTool::XMP::otherSVG = ( + GROUPS => { 0 => 'SVG', 2 => 'Unknown' }, + LANG_INFO => \&GetLangInfo, + NAMESPACE => undef, # variable namespace +); + +#------------------------------------------------------------------------------ +# Generate crd tags +# Inputs: 0) tag table ref +sub Init_crd($) +{ + my $tagTablePtr = shift; + # import tags from CRS namespace + my $crsTable = GetTagTable('Image::ExifTool::XMP::crs'); + my $tag; + foreach $tag (Image::ExifTool::TagTableKeys($crsTable)) { + my $crsInfo = $$crsTable{$tag}; + my $tagInfo = $$tagTablePtr{$tag} = { %$crsInfo }; + $$tagInfo{Groups} = { 0 => 'XMP', 1 => 'XMP-crd' , 2 => $$crsInfo{Groups}{2} } if $$crsInfo{Groups}; + } +} + + +1; #end + +__END__ + +=head1 NAME + +Image::ExifTool::XMP2.pl - Additional XMP namespace definitions + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This file contains definitions for less common XMP namespaces. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://ns.useplus.org/> + +=item L<http://www.prismstandard.org/> + +=item L<http://www.portfoliofaq.com/pfaq/v7mappings.htm> + +=item L<http://www.iptc.org/IPTC4XMP/> + +=item L<http://creativecommons.org/technology/xmp> + +=item L<http://www.optimasc.com/products/fileid/xmp-extensions.pdf> + +=item L<http://www.w3.org/TR/SVG11/> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/XMP Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/XMPStruct.pl b/lib/Image/ExifTool/XMPStruct.pl new file mode 100644 index 0000000..edb4654 --- /dev/null +++ b/lib/Image/ExifTool/XMPStruct.pl @@ -0,0 +1,882 @@ +#------------------------------------------------------------------------------ +# File: XMPStruct.pl +# +# Description: XMP structure support +# +# Revisions: 01/01/2011 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::XMP; + +use strict; +use vars qw(%specialStruct %stdXlatNS); + +use Image::ExifTool qw(:Utils); +use Image::ExifTool::XMP; + +sub SerializeStruct($;$); +sub InflateStruct($;$); +sub DumpStruct($;$); +sub CheckStruct($$$); +sub AddNewStruct($$$$$$); +sub ConvertStruct($$$$;$); + +#------------------------------------------------------------------------------ +# Serialize a structure (or other object) into a simple string +# Inputs: 0) HASH ref, ARRAY ref, or SCALAR, 1) closing bracket (or undef) +# Returns: serialized structure string +# eg) "{field=text with {braces|}|, and a comma, field2=val2,field3={field4=[a,b]}}" +sub SerializeStruct($;$) +{ + my ($obj, $ket) = @_; + my ($key, $val, @vals, $rtnVal); + + if (ref $obj eq 'HASH') { + # support hashes with ordered keys + my @keys = $$obj{_ordered_keys_} ? @{$$obj{_ordered_keys_}} : sort keys %$obj; + foreach $key (@keys) { + push @vals, $key . '=' . SerializeStruct($$obj{$key}, '}'); + } + $rtnVal = '{' . join(',', @vals) . '}'; + } elsif (ref $obj eq 'ARRAY') { + foreach $val (@$obj) { + push @vals, SerializeStruct($val, ']'); + } + $rtnVal = '[' . join(',', @vals) . ']'; + } elsif (defined $obj) { + $obj = $$obj if ref $obj eq 'SCALAR'; + # escape necessary characters in string (closing bracket plus "," and "|") + my $pat = $ket ? "\\$ket|,|\\|" : ',|\\|'; + ($rtnVal = $obj) =~ s/($pat)/|$1/g; + # also must escape opening bracket or whitespace at start of string + $rtnVal =~ s/^([\s\[\{])/|$1/; + } else { + $rtnVal = ''; # allow undefined list items + } + return $rtnVal; +} + +#------------------------------------------------------------------------------ +# Inflate structure (or other object) from a serialized string +# Inputs: 0) reference to object in string form (serialized using the '|' escape) +# 1) extra delimiter for scalar values delimiters +# Returns: 0) object as a SCALAR, HASH ref, or ARRAY ref (or undef on error), +# 1) warning string (or undef) +# Notes: modifies input string to remove parsed objects +sub InflateStruct($;$) +{ + my ($obj, $delim) = @_; + my ($val, $warn, $part); + + if ($$obj =~ s/^\s*\{//) { + my %struct; + while ($$obj =~ s/^\s*([-\w:]+#?)\s*=//s) { + my $tag = $1; + my ($v, $w) = InflateStruct($obj, '}'); + $warn = $w if $w and not $warn; + return(undef, $warn) unless defined $v; + $struct{$tag} = $v; + # eat comma separator, or all done if there wasn't one + last unless $$obj =~ s/^\s*,//s; + } + # eat closing brace and warn if we didn't find one + unless ($$obj =~ s/^\s*\}//s or $warn) { + if (length $$obj) { + ($part = $$obj) =~ s/^\s*//s; + $part =~ s/[\x0d\x0a].*//s; + $part = substr($part,0,27) . '...' if length($part) > 30; + $warn = "Invalid structure field at '${part}'"; + } else { + $warn = 'Missing closing brace for structure'; + } + } + $val = \%struct; + } elsif ($$obj =~ s/^\s*\[//) { + my @list; + for (;;) { + my ($v, $w) = InflateStruct($obj, ']'); + $warn = $w if $w and not $warn; + return(undef, $warn) unless defined $v; + push @list, $v; + last unless $$obj =~ s/^\s*,//s; + } + # eat closing bracket and warn if we didn't find one + $$obj =~ s/^\s*\]//s or $warn or $warn = 'Missing closing bracket for list'; + $val = \@list; + } else { + $$obj =~ s/^\s+//s; # remove leading whitespace + # read scalar up to specified delimiter (or "," if not defined) + $val = ''; + $delim = $delim ? "\\$delim|,|\\||\$" : ',|\\||$'; + for (;;) { + $$obj =~ s/^(.*?)($delim)//s or last; + $val .= $1; + last unless $2; + $2 eq '|' or $$obj = $2 . $$obj, last; + $$obj =~ s/^(.)//s and $val .= $1; # add escaped character + } + } + return($val, $warn); +} + +#------------------------------------------------------------------------------ +# Get XMP language code from tag name string +# Inputs: 0) tag name string +# Returns: 0) separated tag name, 1) language code (in standard case), or '' if +# language code was 'x-default', or undef if the tag had no language code +sub GetLangCode($) +{ + my $tag = shift; + if ($tag =~ /^(\w+)[-_]([a-z]{2,3}|[xi])([-_][a-z\d]{2,8}([-_][a-z\d]{1,8})*)?$/i) { + # normalize case of language codes + my ($tg, $langCode) = ($1, lc($2)); + $langCode .= (length($3) == 3 ? uc($3) : lc($3)) if $3; + $langCode =~ tr/_/-/; # RFC 3066 specifies '-' as a separator + $langCode = '' if lc($langCode) eq 'x-default'; + return($tg, $langCode); + } else { + return($tag, undef); + } +} + +#------------------------------------------------------------------------------ +# Debugging routine to dump a structure, list or scalar +# Inputs: 0) scalar, ARRAY ref or HASH ref, 1) indent (or undef) +sub DumpStruct($;$) +{ + local $_; + my ($obj, $indent) = @_; + + $indent or $indent = ''; + if (ref $obj eq 'HASH') { + print "{\n"; + foreach (sort keys %$obj) { + print "$indent $_ = "; + DumpStruct($$obj{$_}, "$indent "); + } + print $indent, "},\n"; + } elsif (ref $obj eq 'ARRAY') { + print "[\n"; + foreach (@$obj) { + print "$indent "; + DumpStruct($_, "$indent "); + } + print $indent, "],\n", + } else { + print "\"$obj\",\n"; + } +} + +#------------------------------------------------------------------------------ +# Recursively validate structure fields (tags) +# Inputs: 0) ExifTool ref, 1) Structure ref, 2) structure table definition ref +# Returns: 0) validated structure ref, 1) error string, or undef on success +# Notes: +# - fixes field names in structure and applies inverse conversions to values +# - copies structure to avoid interdependencies with calling code on referenced values +# - handles lang-alt tags, and '#' on field names +# - resets UTF-8 flag of SCALAR values +# - un-escapes for XML or HTML as per Escape option setting +sub CheckStruct($$$) +{ + my ($et, $struct, $strTable) = @_; + + my $strName = $$strTable{STRUCT_NAME} || ('XMP ' . RegisterNamespace($strTable)); + ref $struct eq 'HASH' or return wantarray ? (undef, "Expecting $strName structure") : undef; + + my ($key, $err, $warn, %copy, $rtnVal, $val); +Key: + foreach $key (keys %$struct) { + my $tag = $key; + # allow trailing '#' to disable print conversion on a per-field basis + my ($type, $fieldInfo); + $type = 'ValueConv' if $tag =~ s/#$//; + $fieldInfo = $$strTable{$tag} unless $specialStruct{$tag}; + # fix case of field name if necessary + unless ($fieldInfo) { + # (sort in reverse to get lower case (not special) tags first) + my ($fix) = reverse sort grep /^$tag$/i, keys %$strTable; + $fieldInfo = $$strTable{$tag = $fix} if $fix and not $specialStruct{$fix}; + } + until (ref $fieldInfo eq 'HASH') { + # generate wildcard fields on the fly (eg. mwg-rs:Extensions) + unless ($$strTable{NAMESPACE}) { + my ($grp, $tg, $langCode); + ($grp, $tg) = $tag =~ /^(.+):(.+)/ ? (lc $1, $2) : ('', $tag); + undef $grp if $grp eq 'XMP'; # (a group of 'XMP' is implied) + require Image::ExifTool::TagLookup; + my @matches = Image::ExifTool::TagLookup::FindTagInfo($tg); + # also look for lang-alt tags + unless (@matches) { + ($tg, $langCode) = GetLangCode($tg); + @matches = Image::ExifTool::TagLookup::FindTagInfo($tg) if defined $langCode; + } + my ($tagInfo, $priority, $ti, $g1); + # find best matching tag + foreach $ti (@matches) { + my @grps = $et->GetGroup($ti); + next unless $grps[0] eq 'XMP'; + next if $grp and $grp ne lc $grps[1]; + # must be lang-alt tag if we are writing an alternate language + next if defined $langCode and not ($$ti{Writable} and $$ti{Writable} eq 'lang-alt'); + my $pri = $$ti{Priority} || 1; + $pri -= 10 if $$ti{Avoid}; + next if defined $priority and $priority >= $pri; + $priority = $pri; + $tagInfo = $ti; + $g1 = $grps[1]; + } + $tagInfo or $warn = "'${tag}' is not a writable XMP tag", next Key; + GetPropertyPath($tagInfo); # make sure property path is generated for this tag + $tag = $$tagInfo{Name}; + $tag = "$g1:$tag" if $grp; + $tag .= "-$langCode" if $langCode; + $fieldInfo = $$strTable{$tag}; + # create new structure field if necessary + $fieldInfo or $fieldInfo = $$strTable{$tag} = { + %$tagInfo, # (also copies the necessary TagID and PropertyPath) + Namespace => $$tagInfo{Namespace} || $$tagInfo{Table}{NAMESPACE}, + LangCode => $langCode, + }; + # delete stuff we don't need (shouldn't cause harm, but better safe than sorry) + # - need to keep StructType and Table in case we need to call AddStructType later + delete $$fieldInfo{Description}; + delete $$fieldInfo{Groups}; + last; # write this dynamically-generated field + } + # generate lang-alt fields on the fly (eg. Iptc4xmpExt:AOTitle) + my ($tg, $langCode) = GetLangCode($tag); + if (defined $langCode) { + $fieldInfo = $$strTable{$tg} unless $specialStruct{$tg}; + unless ($fieldInfo) { + my ($fix) = reverse sort grep /^$tg$/i, keys %$strTable; + $fieldInfo = $$strTable{$tg = $fix} if $fix and not $specialStruct{$fix}; + } + if (ref $fieldInfo eq 'HASH' and $$fieldInfo{Writable} and + $$fieldInfo{Writable} eq 'lang-alt') + { + my $srcInfo = $fieldInfo; + $tag = $tg . '-' . $langCode if $langCode; + $fieldInfo = $$strTable{$tag}; + # create new structure field if necessary + $fieldInfo or $fieldInfo = $$strTable{$tag} = { + %$srcInfo, + TagID => $tg, + LangCode => $langCode, + }; + last; # write this lang-alt field + } + } + $warn = "'${tag}' is not a field of $strName"; + next Key; + } + if (ref $$struct{$key} eq 'HASH') { + $$fieldInfo{Struct} or $warn = "$tag is not a structure in $strName", next Key; + # recursively check this structure + ($val, $err) = CheckStruct($et, $$struct{$key}, $$fieldInfo{Struct}); + $err and $warn = $err, next Key; + $copy{$tag} = $val; + } elsif (ref $$struct{$key} eq 'ARRAY') { + $$fieldInfo{List} or $warn = "$tag is not a list in $strName", next Key; + # check all items in the list + my ($item, @copy); + my $i = 0; + foreach $item (@{$$struct{$key}}) { + if (not ref $item) { + $item = '' unless defined $item; # use empty string for missing items + if ($$fieldInfo{Struct}) { + # (allow empty structures) + $item =~ /^\s*$/ or $warn = "$tag items are not valid structures", next Key; + $copy[$i] = { }; # create hash for empty structure + } else { + $et->Sanitize(\$item); + ($copy[$i],$err) = $et->ConvInv($item,$fieldInfo,$tag,$strName,$type,''); + $copy[$i] = '' unless defined $copy[$i]; # avoid undefined item + $err and $warn = $err, next Key; + $err = CheckXMP($et, $fieldInfo, \$copy[$i]); + $err and $warn = "$err in $strName $tag", next Key; + } + } elsif (ref $item eq 'HASH') { + $$fieldInfo{Struct} or $warn = "$tag is not a structure in $strName", next Key; + ($copy[$i], $err) = CheckStruct($et, $item, $$fieldInfo{Struct}); + $err and $warn = $err, next Key; + } else { + $warn = "Invalid value for $tag in $strName"; + next Key; + } + ++$i; + } + $copy{$tag} = \@copy; + } elsif ($$fieldInfo{Struct}) { + $warn = "Improperly formed structure in $strName $tag"; + } else { + $et->Sanitize(\$$struct{$key}); + ($val,$err) = $et->ConvInv($$struct{$key},$fieldInfo,$tag,$strName,$type,''); + $err and $warn = $err, next Key; + next Key unless defined $val; # check for undefined + $err = CheckXMP($et, $fieldInfo, \$val); + $err and $warn = "$err in $strName $tag", next Key; + # turn this into a list if necessary + $copy{$tag} = $$fieldInfo{List} ? [ $val ] : $val; + } + } + if (%copy or not $warn) { + $rtnVal = \%copy; + undef $err; + $$et{CHECK_WARN} = $warn if $warn; + } else { + $err = $warn; + } + return wantarray ? ($rtnVal, $err) : $rtnVal; +} + +#------------------------------------------------------------------------------ +# Delete matching structures from existing linearized XMP +# Inputs: 0) ExifTool ref, 1) capture hash ref, 2) structure path ref, +# 3) new value hash ref, 4) reference to change counter +# Returns: 0) delete flag, 1) list index of deleted structure if adding to list +# 2) flag set if structure existed +# Notes: updates path to new base path for structure to be added +sub DeleteStruct($$$$$) +{ + my ($et, $capture, $pathPt, $nvHash, $changed) = @_; + my ($deleted, $added, $existed, $p, $pp, $val, $delPath); + my (@structPaths, @matchingPaths, @delPaths); + + # find all existing elements belonging to this structure + ($pp = $$pathPt) =~ s/ \d+/ \\d\+/g; + @structPaths = sort grep(/^$pp(\/|$)/, keys %$capture); + $existed = 1 if @structPaths; + # delete only structures with matching fields if necessary + if ($$nvHash{DelValue}) { + if (@{$$nvHash{DelValue}}) { + my $strTable = $$nvHash{TagInfo}{Struct}; + # all fields must match corresponding elements in the same + # root structure for it to be deleted + foreach $val (@{$$nvHash{DelValue}}) { + next unless ref $val eq 'HASH'; + my (%cap, $p2, %match); + next unless AddNewStruct(undef, undef, \%cap, $$pathPt, $val, $strTable); + foreach $p (keys %cap) { + if ($p =~ / /) { + ($p2 = $p) =~ s/ \d+/ \\d\+/g; + @matchingPaths = sort grep(/^$p2$/, @structPaths); + } else { + push @matchingPaths, $p; + } + foreach $p2 (@matchingPaths) { + $p2 =~ /^($pp)/ or next; + # language attribute must also match if it exists + my $attr = $cap{$p}[1]; + if ($$attr{'xml:lang'}) { + my $a2 = $$capture{$p2}[1]; + next unless $$a2{'xml:lang'} and $$a2{'xml:lang'} eq $$attr{'xml:lang'}; + } + if ($$capture{$p2} and $$capture{$p2}[0] eq $cap{$p}[0]) { + # ($1 contains root path for this structure) + $match{$1} = ($match{$1} || 0) + 1; + } + } + } + my $num = scalar(keys %cap); + foreach $p (keys %match) { + # do nothing unless all fields matched the same structure + next unless $match{$p} == $num; + # delete all elements of this structure + foreach $p2 (@structPaths) { + push @delPaths, $p2 if $p2 =~ /^$p/; + } + # remember path of first deleted structure + $delPath = $p if not $delPath or $delPath gt $p; + } + } + } # (else don't delete anything) + } elsif (@structPaths) { + @delPaths = @structPaths; # delete all + $structPaths[0] =~ /^($pp)/; + $delPath = $1; + } + if (@delPaths) { + my $verbose = $et->Options('Verbose'); + @delPaths = sort @delPaths if $verbose > 1; + foreach $p (@delPaths) { + if ($verbose > 1) { + my $p2 = $p; + $p2 =~ s/^(\w+)/$stdXlatNS{$1} || $1/e; + $et->VerboseValue("- XMP-$p2", $$capture{$p}[0]); + } + delete $$capture{$p}; + $deleted = 1; + ++$$changed; + } + $delPath or warn("Internal error 1 in DeleteStruct\n"), return(undef,undef,$existed); + $$pathPt = $delPath; # return path of first element deleted + } elsif ($$nvHash{TagInfo}{List}) { + # NOTE: we don't yet properly handle lang-alt elements!!!! + if (@structPaths) { + $structPaths[-1] =~ /^($pp)/ or warn("Internal error 2 in DeleteStruct\n"), return(undef,undef,$existed); + my $path = $1; + # delete any improperly formatted xmp + if ($$capture{$path}) { + my $cap = $$capture{$path}; + # an error unless this was an empty structure + $et->Error("Improperly structured XMP ($path)",1) if ref $cap ne 'ARRAY' or $$cap[0]; + delete $$capture{$path}; + } + # (match last index to put in same lang-alt list for Bag of lang-alt items) + $path =~ m/.* (\d+)/g or warn("Internal error 3 in DeleteStruct\n"), return(undef,undef,$existed); + $added = $1; + # add after last item in list + my $len = length $added; + my $pos = pos($path) - $len; + my $nxt = substr($added, 1) + 1; + substr($path, $pos, $len) = length($nxt) . $nxt; + $$pathPt = $path; + } else { + $added = '10'; + } + } + return($deleted, $added, $existed); +} + +#------------------------------------------------------------------------------ +# Add new element to XMP capture hash +# Inputs: 0) ExifTool ref, 1) TagInfo ref, 2) capture hash ref, +# 3) resource path, 4) value ref, 5) hash ref for last used index numbers +sub AddNewTag($$$$$$) +{ + my ($et, $tagInfo, $capture, $path, $valPtr, $langIdx) = @_; + my $val = EscapeXML($$valPtr); + my %attrs; + # support writing RDF "resource" values + if ($$tagInfo{Resource}) { + $attrs{'rdf:resource'} = $val; + $val = ''; + } + if ($$tagInfo{Writable} and $$tagInfo{Writable} eq 'lang-alt') { + # write the lang-alt tag + my $langCode = $$tagInfo{LangCode}; + # add indexed lang-alt list properties + my $i = $$langIdx{$path} || 0; + $$langIdx{$path} = $i + 1; # save next list index + if ($i) { + my $idx = length($i) . $i; + $path =~ s/(.*) \d+/$1 $idx/; # set list index + } + $attrs{'xml:lang'} = $langCode || 'x-default'; + } + $$capture{$path} = [ $val, \%attrs ]; + # print verbose message + if ($et and $et->Options('Verbose') > 1) { + my $p = $path; + $p =~ s/^(\w+)/$stdXlatNS{$1} || $1/e; + $et->VerboseValue("+ XMP-$p", $val); + } +} + +#------------------------------------------------------------------------------ +# Add new structure to capture hash for writing +# Inputs: 0) ExifTool object ref (or undef for no warnings), +# 1) tagInfo ref (or undef if no ExifTool), 2) capture hash ref, +# 3) base path, 4) struct ref, 5) struct hash ref +# Returns: number of tags changed +# Notes: Escapes values for XML +sub AddNewStruct($$$$$$) +{ + my ($et, $tagInfo, $capture, $basePath, $struct, $strTable) = @_; + my $verbose = $et ? $et->Options('Verbose') : 0; + my ($tag, %langIdx); + + my $ns = $$strTable{NAMESPACE} || ''; + my $changed = 0; + + # add dummy field to allow empty structures (name starts with '~' so it will come + # after all valid structure fields, which is necessary when serializing the XMP later) + %$struct or $$struct{'~dummy~'} = ''; + + foreach $tag (sort keys %$struct) { + my $fieldInfo = $$strTable{$tag}; + unless ($fieldInfo) { + next unless $tag eq '~dummy~'; # check for dummy field + $fieldInfo = { }; # create dummy field info for dummy structure + } + my $val = $$struct{$tag}; + my $propPath = $$fieldInfo{PropertyPath}; + unless ($propPath) { + $propPath = ($$fieldInfo{Namespace} || $ns) . ':' . ($$fieldInfo{TagID} || $tag); + if ($$fieldInfo{List}) { + $propPath .= "/rdf:$$fieldInfo{List}/rdf:li 10"; + } + if ($$fieldInfo{Writable} and $$fieldInfo{Writable} eq 'lang-alt') { + $propPath .= "/rdf:Alt/rdf:li 10"; + } + $$fieldInfo{PropertyPath} = $propPath; # save for next time + } + my $path = $basePath . '/' . ConformPathToNamespace($et, $propPath); + my $addedTag; + if (ref $val eq 'HASH') { + my $subStruct = $$fieldInfo{Struct} or next; + $changed += AddNewStruct($et, $tagInfo, $capture, $path, $val, $subStruct); + } elsif (ref $val eq 'ARRAY') { + next unless $$fieldInfo{List}; + my $i = 0; + my ($item, $p); + my $level = scalar(() = ($propPath =~ / \d+/g)); + # loop through all list items (note: can't yet write multi-dimensional lists) + foreach $item (@{$val}) { + if ($i) { + # update first index in field property (may be list of lang-alt lists) + $p = ConformPathToNamespace($et, $propPath); + my $idx = length($i) . $i; + $p =~ s/ \d+/ $idx/; + $p = "$basePath/$p"; + } else { + $p = $path; + } + if (ref $item eq 'HASH') { + my $subStruct = $$fieldInfo{Struct} or next; + AddNewStruct($et, $tagInfo, $capture, $p, $item, $subStruct) or next; + # don't write empty items in upper-level list + } elsif (length $item or (defined $item and $level == 1)) { + AddNewTag($et, $fieldInfo, $capture, $p, \$item, \%langIdx); + $addedTag = 1; + } + ++$changed; + ++$i; + } + } else { + AddNewTag($et, $fieldInfo, $capture, $path, \$val, \%langIdx); + $addedTag = 1; + ++$changed; + } + # this is tricky, but we must add the rdf:type for contained structures + # in the case that a whole hierarchy was added at once by writing a + # flattened tag inside a variable-namespace structure + if ($addedTag and $$fieldInfo{StructType} and $$fieldInfo{Table}) { + AddStructType($et, $$fieldInfo{Table}, $capture, $propPath, $basePath); + } + } + # add 'rdf:type' property if necessary + if ($$strTable{TYPE} and $changed) { + my $path = $basePath . '/' . ConformPathToNamespace($et, "rdf:type"); + unless ($$capture{$path}) { + $$capture{$path} = [ '', { 'rdf:resource' => $$strTable{TYPE} } ]; + if ($verbose > 1) { + my $p = $path; + $p =~ s/^(\w+)/$stdXlatNS{$1} || $1/e; + $et->VerboseValue("+ XMP-$p", $$strTable{TYPE}); + } + } + } + return $changed; +} + +#------------------------------------------------------------------------------ +# Convert structure field values for printing +# Inputs: 0) ExifTool ref, 1) tagInfo ref for structure tag, 2) value, +# 3) conversion type: PrintConv, ValueConv or Raw (Both not allowed) +# 4) tagID of parent structure (needed only if there was no flattened tag) +# Notes: Makes a copy of the hash so any applied escapes won't affect raw values +sub ConvertStruct($$$$;$) +{ + my ($et, $tagInfo, $value, $type, $parentID) = @_; + if (ref $value eq 'HASH') { + my (%struct, $key); + my $table = $$tagInfo{Table}; + $parentID = $$tagInfo{TagID} unless $parentID; + foreach $key (keys %$value) { + my $tagID = $parentID . ucfirst($key); + my $flatInfo = $$table{$tagID}; + unless ($flatInfo) { + # handle variable-namespace structures + if ($key =~ /^XMP-(.*?:)(.*)/) { + $tagID = $1 . $parentID . ucfirst($2); + $flatInfo = $$table{$tagID}; + } + $flatInfo or $flatInfo = $tagInfo; + } + my $v = $$value{$key}; + if (ref $v) { + $v = ConvertStruct($et, $flatInfo, $v, $type, $tagID); + } else { + $v = $et->GetValue($flatInfo, $type, $v); + } + $struct{$key} = $v if defined $v; # save the converted value + } + return \%struct; + } elsif (ref $value eq 'ARRAY') { + if (defined $$et{OPTIONS}{ListItem}) { + my $li = $$et{OPTIONS}{ListItem}; + return undef unless defined $$value[$li]; + undef $$et{OPTIONS}{ListItem}; # only do top-level list + my $val = ConvertStruct($et, $tagInfo, $$value[$li], $type, $parentID); + $$et{OPTIONS}{ListItem} = $li; + return $val; + } else { + my (@list, $val); + foreach $val (@$value) { + my $v = ConvertStruct($et, $tagInfo, $val, $type, $parentID); + push @list, $v if defined $v; + } + return \@list; + } + } else { + return $et->GetValue($tagInfo, $type, $value); + } +} + +#------------------------------------------------------------------------------ +# Restore XMP structures in extracted information +# Inputs: 0) ExifTool object ref, 1) flag to keep original flattened tags +# Notes: also restores lists (including multi-dimensional) +sub RestoreStruct($;$) +{ + local $_; + my ($et, $keepFlat) = @_; + my ($key, %structs, %var, %lists, $si, %listKeys, @siList); + my $valueHash = $$et{VALUE}; + my $fileOrder = $$et{FILE_ORDER}; + my $tagExtra = $$et{TAG_EXTRA}; + foreach $key (keys %{$$et{TAG_INFO}}) { + $$tagExtra{$key} or next; + my $structProps = $$tagExtra{$key}{Struct} or next; + delete $$tagExtra{$key}{Struct}; # (don't re-use) + my $tagInfo = $$et{TAG_INFO}{$key}; # tagInfo for flattened tag + my $table = $$tagInfo{Table}; + my $prop = shift @$structProps; + my $tag = $$prop[0]; + # get reference to structure tag (or normal list tag if not a structure) + my $strInfo = @$structProps ? $$table{$tag} : $tagInfo; + if ($strInfo) { + ref $strInfo eq 'HASH' or next; # (just to be safe) + if (@$structProps and not $$strInfo{Struct}) { + # this could happen for invalid XMP containing mixed lists + # (or for something like this -- what should we do here?: + # <meta:user-defined meta:name="License">test</meta:user-defined>) + $et->Warn("$$strInfo{Name} is not a structure!") unless $$et{NO_STRUCT_WARN}; + next; + } + } else { + # create new entry in tag table for this structure + my $g1 = $$table{GROUPS}{0} || 'XMP'; + my $name = $tag; + # tag keys will have a group 1 prefix when coming from import of XML from -X option + if ($tag =~ /(.+):(.+)/) { + my $ns; + ($ns, $name) = ($1, $2); + $ns =~ s/^XMP-//; # remove leading "XMP-" if it exists because we add it later + $ns = $stdXlatNS{$ns} if $stdXlatNS{$ns}; + $g1 .= "-$ns"; + } + $strInfo = { + Name => ucfirst $name, + Groups => { 1 => $g1 }, + Struct => 'Unknown', + }; + # add Struct entry if this is a structure + if (@$structProps) { + # this is a structure + $$strInfo{Struct} = { STRUCT_NAME => 'XMP Unknown' } if @$structProps; + } elsif ($$tagInfo{LangCode}) { + # this is lang-alt list + $tag = $tag . '-' . $$tagInfo{LangCode}; + $$strInfo{LangCode} = $$tagInfo{LangCode}; + } + AddTagToTable($table, $tag, $strInfo); + } + # use strInfo ref for base key to avoid collisions + $tag = $strInfo; + my $struct = \%structs; + my $oldStruct = $structs{$strInfo}; + # (fyi: 'lang-alt' Writable type will be valid even if tag is not pre-defined) + my $writable = $$tagInfo{Writable} || ''; + # walk through the stored structure property information + # to rebuild this structure + my ($err, $i); + for (;;) { + my $index = $$prop[1]; + if ($index and not @$structProps) { + # ignore this list if it is a simple lang-alt tag + if ($writable eq 'lang-alt') { + pop @$prop; # remove lang-alt index + undef $index if @$prop < 2; + } + # add language code if necessary + if ($$tagInfo{LangCode} and not ref $tag) { + $tag = $tag . '-' . $$tagInfo{LangCode}; + } + } + my $nextStruct = $$struct{$tag}; + if (defined $index) { + # the field is a list + $index = substr $index, 1; # remove digit count + if ($nextStruct) { + ref $nextStruct eq 'ARRAY' or $err = 2, last; + $struct = $nextStruct; + } else { + $struct = $$struct{$tag} = [ ]; + } + $nextStruct = $$struct[$index]; + # descend into multi-dimensional lists + for ($i=2; $$prop[$i]; ++$i) { + if ($nextStruct) { + ref $nextStruct eq 'ARRAY' or last; + $struct = $nextStruct; + } else { + $lists{$struct} = $struct; + $struct = $$struct[$index] = [ ]; + } + $nextStruct = $$struct[$index]; + $index = substr $$prop[$i], 1; + } + if (ref $nextStruct eq 'HASH') { + $struct = $nextStruct; # continue building sub-structure + } elsif (@$structProps) { + $lists{$struct} = $struct; + $struct = $$struct[$index] = { }; + } else { + $lists{$struct} = $struct; + $$struct[$index] = $$valueHash{$key}; + last; + } + } else { + if ($nextStruct) { + ref $nextStruct eq 'HASH' or $err = 3, last; + $struct = $nextStruct; + } elsif (@$structProps) { + $struct = $$struct{$tag} = { }; + } else { + $$struct{$tag} = $$valueHash{$key}; + last; + } + } + $prop = shift @$structProps or last; + $tag = $$prop[0]; + if ($tag =~ /(.+):(.+)/) { + # tag in variable-namespace tables will have a leading + # XMP namespace on the tag name. In this case, add + # the corresponding group1 name to the tag ID. + my ($ns, $name) = ($1, $2); + $ns = $stdXlatNS{$ns} if $stdXlatNS{$ns}; + $tag = "XMP-$ns:" . ucfirst $name; + } else { + $tag = ucfirst $tag; + } + } + if ($err) { + # this may happen if we have a structural error in the XMP + # (like an improperly contained list for example) + unless ($$et{NO_STRUCT_WARN}) { + my $ns = $$tagInfo{Namespace} || $$tagInfo{Table}{NAMESPACE} || ''; + $et->Warn("Error $err placing $ns:$$tagInfo{TagID} in structure or list", 1); + } + delete $structs{$strInfo} unless $oldStruct; + } elsif ($tagInfo eq $strInfo) { + # just a regular list tag (or an empty structure) + if ($oldStruct) { + # keep tag with lowest numbered key (well, not exactly, since + # "Tag (10)" is lt "Tag (2)", but at least "Tag" is lt + # everything else, and this is really what we care about) + my $k = $listKeys{$oldStruct}; + if ($k) { # ($k will be undef for an empty structure) + if ($k lt $key) { + # keep lowest file order + $$fileOrder{$k} = $$fileOrder{$key} if $$fileOrder{$k} > $$fileOrder{$key}; + $et->DeleteTag($key); + next; + } + $$fileOrder{$key} = $$fileOrder{$k} if $$fileOrder{$key} > $$fileOrder{$k}; + $et->DeleteTag($k); # remove tag with greater copy number + } + } + # replace existing value with new list + $$valueHash{$key} = $structs{$strInfo}; + $listKeys{$structs{$strInfo}} = $key; # save key for this list tag + } else { + # save strInfo ref and file order + if ($var{$strInfo}) { + # set file order to just before the first associated flattened tag + if ($var{$strInfo}[1] > $$fileOrder{$key}) { + $var{$strInfo}[1] = $$fileOrder{$key} - 0.5; + } + } else { + $var{$strInfo} = [ $strInfo, $$fileOrder{$key} - 0.5 ]; + } + # preserve original flattened tags if requested + if ($keepFlat) { + my $extra = $$tagExtra{$key} or next; + # restore list behaviour of this flattened tag + if ($$extra{NoList}) { + $$valueHash{$key} = $$extra{NoList}; + delete $$extra{NoList}; + } elsif ($$extra{NoListDel}) { + # delete this tag since its value was included another list + $et->DeleteTag($key); + } + } else { + $et->DeleteTag($key); # delete the flattened tag + } + } + } + # fill in undefined items in lists. In theory, undefined list items should + # be fine, but in practice the calling code may not check for this (and + # historically this wasn't necessary, so do this for backward compatibility) + foreach $si (keys %lists) { + defined $_ or $_ = '' foreach @{$lists{$si}}; + } + # make a list of all new structures we generated + $var{$_} and push @siList, $_ foreach keys %structs; + # save new structures in the same order they were read from file + foreach $si (sort { $var{$a}[1] <=> $var{$b}[1] } @siList) { + # test to see if a tag for this structure has already been generated + # (this could happen only if one of the structures in a list was empty) + $key = $var{$si}[0]{Name}; + my $found; + if ($$valueHash{$key}) { + my @keys = grep /^$key( \(\d+\))?$/, keys %$valueHash; + foreach $key (@keys) { + next unless $$valueHash{$key} eq $structs{$si}; + $found = 1; + last; + } + } + unless ($found) { + # otherwise, generate a new tag for this structure + $key = $et->FoundTag($var{$si}[0], ''); + $$valueHash{$key} = $structs{$si}; + } + $$fileOrder{$key} = $var{$si}[1]; + } +} + + +1; #end + +__END__ + +=head1 NAME + +Image::ExifTool::XMPStruct.pl - XMP structure support + +=head1 SYNOPSIS + +This module is loaded automatically by Image::ExifTool when required. + +=head1 DESCRIPTION + +This file contains routines to provide read/write support of structured XMP +information. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/XMP Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut diff --git a/lib/Image/ExifTool/ZIP.pm b/lib/Image/ExifTool/ZIP.pm new file mode 100644 index 0000000..e6ecab5 --- /dev/null +++ b/lib/Image/ExifTool/ZIP.pm @@ -0,0 +1,735 @@ +#------------------------------------------------------------------------------ +# File: ZIP.pm +# +# Description: Read ZIP archive meta information +# +# Revisions: 10/28/2007 - P. Harvey Created +# +# References: 1) http://www.pkware.com/documents/casestudies/APPNOTE.TXT +# 2) http://www.cpanforum.com/threads/9046 +# 3) http://www.gzip.org/zlib/rfc-gzip.html +# 4) http://DataCompression.info/ArchiveFormats/RAR202.txt +# 5) https://jira.atlassian.com/browse/CONF-21706 +# 6) http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/indesign/cs55-docs/IDML/idml-specification.pdf +#------------------------------------------------------------------------------ + +package Image::ExifTool::ZIP; + +use strict; +use vars qw($VERSION $warnString); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.27'; + +sub WarnProc($) { $warnString = $_[0]; } + +# file types for recognized Open Document "mimetype" values +my %openDocType = ( + 'application/vnd.oasis.opendocument.database' => 'ODB', #5 + 'application/vnd.oasis.opendocument.chart' => 'ODC', #5 + 'application/vnd.oasis.opendocument.formula' => 'ODF', #5 + 'application/vnd.oasis.opendocument.graphics' => 'ODG', #5 + 'application/vnd.oasis.opendocument.image' => 'ODI', #5 + 'application/vnd.oasis.opendocument.presentation' => 'ODP', + 'application/vnd.oasis.opendocument.spreadsheet' => 'ODS', + 'application/vnd.oasis.opendocument.text' => 'ODT', + 'application/vnd.adobe.indesign-idml-package' => 'IDML', #6 (not open doc) + 'application/epub+zip' => 'EPUB', #PH (not open doc) +); + +# iWork file types based on names of files found in the zip archive +my %iWorkFile = ( + 'Index/Slide.iwa' => 'KEY', + 'Index/Tables/DataList.iwa' => 'NUMBERS', +); + +my %iWorkType = ( + NUMBERS => 'NUMBERS', + PAGES => 'PAGES', + KEY => 'KEY', + KTH => 'KTH', + NMBTEMPLATE => 'NMBTEMPLATE', +); + +# ZIP metadata blocks +%Image::ExifTool::ZIP::Main = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + FORMAT => 'int16u', + NOTES => q{ + The following tags are extracted from ZIP archives. ExifTool also extracts + additional meta information from compressed documents inside some ZIP-based + files such Office Open XML (DOCX, PPTX and XLSX), Open Document (ODB, ODC, + ODF, ODG, ODI, ODP, ODS and ODT), iWork (KEY, PAGES, NUMBERS), Capture One + Enhanced Image Package (EIP), Adobe InDesign Markup Language (IDML), + Electronic Publication (EPUB), and Sketch design files (SKETCH). The + ExifTool family 3 groups may be used to organize ZIP tags by embedded + document number (ie. the exiftool C<-g3> option). + }, + 2 => 'ZipRequiredVersion', + 3 => { + Name => 'ZipBitFlag', + PrintConv => '$val ? sprintf("0x%.4x",$val) : $val', + }, + 4 => { + Name => 'ZipCompression', + PrintConv => { + 0 => 'None', + 1 => 'Shrunk', + 2 => 'Reduced with compression factor 1', + 3 => 'Reduced with compression factor 2', + 4 => 'Reduced with compression factor 3', + 5 => 'Reduced with compression factor 4', + 6 => 'Imploded', + 7 => 'Tokenized', + 8 => 'Deflated', + 9 => 'Enhanced Deflate using Deflate64(tm)', + 10 => 'Imploded (old IBM TERSE)', + 12 => 'BZIP2', + 14 => 'LZMA (EFS)', + 18 => 'IBM TERSE (new)', + 19 => 'IBM LZ77 z Architecture (PFS)', + 96 => 'JPEG recompressed', #2 + 97 => 'WavPack compressed', #2 + 98 => 'PPMd version I, Rev 1', + }, + }, + 5 => { + Name => 'ZipModifyDate', + Format => 'int32u', + Groups => { 2 => 'Time' }, + ValueConv => sub { + my $val = shift; + return sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', + ($val >> 25) + 1980, # year + ($val >> 21) & 0x0f, # month + ($val >> 16) & 0x1f, # day + ($val >> 11) & 0x1f, # hour + ($val >> 5) & 0x3f, # minute + ($val & 0x1f) * 2 # second + ); + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 7 => { Name => 'ZipCRC', Format => 'int32u', PrintConv => 'sprintf("0x%.8x",$val)' }, + 9 => { Name => 'ZipCompressedSize', Format => 'int32u' }, + 11 => { Name => 'ZipUncompressedSize', Format => 'int32u' }, + 13 => { + Name => 'ZipFileNameLength', + # don't store a tag -- just extract the value for use with ZipFileName + Hidden => 1, + RawConv => '$$self{ZipFileNameLength} = $val; undef', + }, + # 14 => 'ZipExtraFieldLength', + 15 => { + Name => 'ZipFileName', + Format => 'string[$$self{ZipFileNameLength}]', + }, + _com => 'ZipFileComment', +); + +# GNU ZIP tags (ref 3) +%Image::ExifTool::ZIP::GZIP = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + NOTES => q{ + These tags are extracted from GZIP (GNU ZIP) archives, but currently only + for the first file in the archive. + }, + 2 => { + Name => 'Compression', + PrintConv => { + 8 => 'Deflated', + }, + }, + 3 => { + Name => 'Flags', + PrintConv => { BITMASK => { + 0 => 'Text', + 1 => 'CRC16', + 2 => 'ExtraFields', + 3 => 'FileName', + 4 => 'Comment', + }}, + }, + 4 => { + Name => 'ModifyDate', + Format => 'int32u', + Groups => { 2 => 'Time' }, + ValueConv => 'ConvertUnixTime($val,1)', + PrintConv => '$self->ConvertDateTime($val)', + }, + 8 => { + Name => 'ExtraFlags', + PrintConv => { + 0 => '(none)', + 2 => 'Maximum Compression', + 4 => 'Fastest Algorithm', + }, + }, + 9 => { + Name => 'OperatingSystem', + PrintConv => { + 0 => 'FAT filesystem (MS-DOS, OS/2, NT/Win32)', + 1 => 'Amiga', + 2 => 'VMS (or OpenVMS)', + 3 => 'Unix', + 4 => 'VM/CMS', + 5 => 'Atari TOS', + 6 => 'HPFS filesystem (OS/2, NT)', + 7 => 'Macintosh', + 8 => 'Z-System', + 9 => 'CP/M', + 10 => 'TOPS-20', + 11 => 'NTFS filesystem (NT)', + 12 => 'QDOS', + 13 => 'Acorn RISCOS', + 255 => 'unknown', + }, + }, + 10 => 'ArchivedFileName', + 11 => 'Comment', +); + +# RAR tags (ref 4) +%Image::ExifTool::ZIP::RAR = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 2 => 'Other' }, + NOTES => 'These tags are extracted from RAR archive files.', + 0 => { + Name => 'CompressedSize', + Format => 'int32u', + }, + 4 => { + Name => 'UncompressedSize', + Format => 'int32u', + }, + 8 => { + Name => 'OperatingSystem', + PrintConv => { + 0 => 'MS-DOS', + 1 => 'OS/2', + 2 => 'Win32', + 3 => 'Unix', + }, + }, + 13 => { + Name => 'ModifyDate', + Format => 'int32u', + Groups => { 2 => 'Time' }, + ValueConv => sub { + my $val = shift; + return sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', + ($val >> 25) + 1980, # year + ($val >> 21) & 0x0f, # month + ($val >> 16) & 0x1f, # day + ($val >> 11) & 0x1f, # hour + ($val >> 5) & 0x3f, # minute + ($val & 0x1f) * 2 # second + ); + }, + PrintConv => '$self->ConvertDateTime($val)', + }, + 18 => { + Name => 'PackingMethod', + PrintHex => 1, + PrintConv => { + 0x30 => 'Stored', + 0x31 => 'Fastest', + 0x32 => 'Fast', + 0x33 => 'Normal', + 0x34 => 'Good Compression', + 0x35 => 'Best Compression', + }, + }, + 19 => { + Name => 'FileNameLength', + Format => 'int16u', + Hidden => 1, + RawConv => '$$self{FileNameLength} = $val; undef', + }, + 25 => { + Name => 'ArchivedFileName', + Format => 'string[$$self{FileNameLength}]', + }, +); + +#------------------------------------------------------------------------------ +# Extract information from a RAR file (ref 4) +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid RAR file +sub ProcessRAR($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($flags, $buff); + + return 0 unless $raf->Read($buff, 7) and $buff eq "Rar!\x1a\x07\0"; + + $et->SetFileType(); + SetByteOrder('II'); + my $tagTablePtr = GetTagTable('Image::ExifTool::ZIP::RAR'); + my $docNum = 0; + + for (;;) { + # read block header + $raf->Read($buff, 7) == 7 or last; + my ($type, $flags, $size) = unpack('xxCvv', $buff); + $size -= 7; + if ($flags & 0x8000) { + $raf->Read($buff, 4) == 4 or last; + $size += unpack('V',$buff) - 4; + } + last if $size < 0; + next unless $size; # ignore blocks with no data + # don't try to read very large blocks unless LargeFileSupport is enabled + if ($size >= 0x80000000 and not $et->Options('LargeFileSupport')) { + $et->Warn('Large block encountered. Aborting.'); + last; + } + # process the block + if ($type == 0x74) { # file block + # read maximum 4 KB from a file block + my $n = $size > 4096 ? 4096 : $size; + $raf->Read($buff, $n) == $n or last; + # add compressed size to start of data so we can extract it with the other tags + $buff = pack('V',$size) . $buff; + $$et{DOC_NUM} = ++$docNum; + $et->ProcessDirectory({ DataPt => \$buff }, $tagTablePtr); + $size -= $n; + } elsif ($type == 0x75 and $size > 6) { # comment block + $raf->Read($buff, $size) == $size or last; + # save comment, only if "Stored" (this is untested) + if (Get8u(\$buff, 3) == 0x30) { + $et->FoundTag('Comment', substr($buff, 6)); + } + next; + } + # seek to the start of the next block + $raf->Seek($size, 1) or last if $size; + } + $$et{DOC_NUM} = 0; + if ($docNum > 1 and not $et->Options('Duplicates')) { + $et->Warn("Use the Duplicates option to extract tags for all $docNum files", 1); + } + + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from a GNU ZIP file (ref 3) +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid GZIP file +sub ProcessGZIP($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($flags, $buff); + + return 0 unless $raf->Read($buff, 10) and $buff =~ /^\x1f\x8b\x08/; + + $et->SetFileType(); + SetByteOrder('II'); + + my $tagTablePtr = GetTagTable('Image::ExifTool::ZIP::GZIP'); + $et->HandleTag($tagTablePtr, 2, Get8u(\$buff, 2)); + $et->HandleTag($tagTablePtr, 3, $flags = Get8u(\$buff, 3)); + $et->HandleTag($tagTablePtr, 4, Get32u(\$buff, 4)); + $et->HandleTag($tagTablePtr, 8, Get8u(\$buff, 8)); + $et->HandleTag($tagTablePtr, 9, Get8u(\$buff, 9)); + + # extract file name and comment if they exist + if ($flags & 0x18) { + if ($flags & 0x04) { + # skip extra field + $raf->Read($buff, 2) == 2 or return 1; + my $len = Get16u(\$buff, 0); + $raf->Read($buff, $len) == $len or return 1; + } + $raf->Read($buff, 4096) or return 1; + my $pos = 0; + my $tagID; + # loop for ArchivedFileName (10) and Comment (11) tags + foreach $tagID (10, 11) { + my $mask = $tagID == 10 ? 0x08 : 0x10; + next unless $flags & $mask; + my $end = $buff =~ /\0/g ? pos($buff) - 1 : length($buff); + # (the doc specifies the string should be ISO 8859-1, + # but in OS X it seems to be UTF-8, so don't translate + # it because I could just as easily screw it up) + my $str = substr($buff, $pos, $end - $pos); + $et->HandleTag($tagTablePtr, $tagID, $str); + last if $end >= length $buff; + $pos = $end + 1; + } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Call HandleTags for attributes of an Archive::Zip member +# Inputs: 0) ExifTool object ref, 1) member ref, 2) optional tag table ref +sub HandleMember($$;$) +{ + my ($et, $member, $tagTablePtr) = @_; + $tagTablePtr or $tagTablePtr = GetTagTable('Image::ExifTool::ZIP::Main'); + $et->HandleTag($tagTablePtr, 2, $member->versionNeededToExtract()); + $et->HandleTag($tagTablePtr, 3, $member->bitFlag()); + $et->HandleTag($tagTablePtr, 4, $member->compressionMethod()); + $et->HandleTag($tagTablePtr, 5, $member->lastModFileDateTime()); + $et->HandleTag($tagTablePtr, 7, $member->crc32()); + $et->HandleTag($tagTablePtr, 9, $member->compressedSize()); + $et->HandleTag($tagTablePtr, 11, $member->uncompressedSize()); + $et->HandleTag($tagTablePtr, 15, $member->fileName()); + my $com = $member->fileComment(); + $et->HandleTag($tagTablePtr, '_com', $com) if defined $com and length $com; +} + +#------------------------------------------------------------------------------ +# Extract information from a ZIP file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid ZIP file +sub ProcessZIP($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $buf2, $zip); + + return 0 unless $raf->Read($buff, 30) == 30 and $buff =~ /^PK\x03\x04/; + + my $tagTablePtr = GetTagTable('Image::ExifTool::ZIP::Main'); + my $docNum = 0; + + # use Archive::Zip if available + for (;;) { + unless (eval { require Archive::Zip } and eval { require IO::File }) { + if ($$et{FILE_EXT} and $$et{FILE_EXT} ne 'ZIP') { + $et->Warn("Install Archive::Zip to decode compressed ZIP information"); + } + last; + } + # Archive::Zip requires a seekable IO::File object + my $fh; + if ($raf->{TESTED} >= 0) { + unless (eval { require IO::File }) { + # (this shouldn't happen because IO::File is a prerequisite of Archive::Zip) + $et->Warn("Install IO::File to decode compressed ZIP information"); + last; + } + $raf->Seek(0,0); + $fh = $raf->{FILE_PT}; + bless $fh, 'IO::File'; # Archive::Zip expects an IO::File object + } elsif (eval { require IO::String }) { + # read the whole file into memory (what else can I do?) + $raf->Slurp(); + $fh = new IO::String ${$raf->{BUFF_PT}}; + } else { + my $type = $raf->{FILE_PT} ? 'pipe or socket' : 'scalar reference'; + $et->Warn("Install IO::String to decode compressed ZIP information from a $type"); + last; + } + $et->VPrint(1, " --- using Archive::Zip ---\n"); + $zip = new Archive::Zip; + # catch all warnings! (Archive::Zip is bad for this) + local $SIG{'__WARN__'} = \&WarnProc; + my $status = $zip->readFromFileHandle($fh); + if ($status eq '4' and $raf->{TESTED} >= 0 and eval { require IO::String } and + $raf->Seek(0,2) and $raf->Tell() < 100000000) + { + # try again, reading it ourself this time in an attempt to avoid + # a failed test with Perl 5.6.2 GNU/Linux 2.6.32-5-686 i686-linux-64int-ld + $raf->Seek(0,0); + $raf->Slurp(); + $fh = new IO::String ${$raf->{BUFF_PT}}; + $zip = new Archive::Zip; + $status = $zip->readFromFileHandle($fh); + } + if ($status) { + undef $zip; + my %err = ( 1=>'Stream end error', 3=>'Format error', 4=>'IO error' ); + my $err = $err{$status} || "Error $status"; + $et->Warn("$err reading ZIP file"); + last; + } + # extract zip file comment + my $comment = $zip->zipfileComment(); + $et->FoundTag(Comment => $comment) if defined $comment and length $comment; + + $$dirInfo{ZIP} = $zip; + + # check for an Office Open file (DOCX, etc) + # --> read '[Content_Types].xml' to determine the file type + my ($mime, @members); + my $cType = $zip->memberNamed('[Content_Types].xml'); + if ($cType) { + ($buff, $status) = $zip->contents($cType); + if (not $status and ( + # first look for the main document with the expected name + $buff =~ m{\sPartName\s*=\s*['"](?:/ppt/presentation.xml|/word/document.xml|/xl/workbook.xml)['"][^>]*\sContentType\s*=\s*(['"])([^"']+)\.main(\+xml)?\1} or + # then look for the main part + $buff =~ /<Override[^>]*\sPartName[^<]+\sContentType\s*=\s*(['"])([^"']+)\.main(\+xml)?\1/ or + # and if all else fails, use the default main + $buff =~ /ContentType\s*=\s*(['"])([^"']+)\.main(\+xml)?\1/)) + { + $mime = $2; + } + } + # check for docProps if we couldn't find a MIME type + $mime or @members = $zip->membersMatching('^docProps/.*\.(xml|XML)$'); + if ($mime or @members) { + $$dirInfo{MIME} = $mime; + require Image::ExifTool::OOXML; + Image::ExifTool::OOXML::ProcessDOCX($et, $dirInfo); + delete $$dirInfo{MIME}; + last; + } + + # check for an EIP file + @members = $zip->membersMatching('^CaptureOne/.*\.(cos|COS)$'); + if (@members) { + require Image::ExifTool::CaptureOne; + Image::ExifTool::CaptureOne::ProcessEIP($et, $dirInfo); + last; + } + + # check for an iWork file + @members = $zip->membersMatching('(?i)^(index\.(xml|apxl)|QuickLook/Thumbnail\.jpg|[^/]+\.(pages|numbers|key)/Index.(zip|xml|apxl))$'); + if (@members) { + require Image::ExifTool::iWork; + Image::ExifTool::iWork::Process_iWork($et, $dirInfo); + last; + } + + # check for an Open Document, IDML or EPUB file + my $mType = $zip->memberNamed('mimetype'); + if ($mType) { + ($mime, $status) = $zip->contents($mType); + if (not $status and $mime =~ /([\x21-\xfe]+)/s) { + # clean up MIME type just in case (note that MIME is case insensitive) + $mime = lc $1; + $et->SetFileType($openDocType{$mime} || 'ZIP', $mime); + $et->Warn("Unrecognized MIMEType $mime") unless $openDocType{$mime}; + # extract Open Document metadata from "meta.xml" + my $meta = $zip->memberNamed('meta.xml'); + # IDML files have metadata in a different place (ref 6) + $meta or $meta = $zip->memberNamed('META-INF/metadata.xml'); + if ($meta) { + ($buff, $status) = $zip->contents($meta); + unless ($status) { + my %dirInfo = ( + DirName => 'XML', + DataPt => \$buff, + DirLen => length $buff, + DataLen => length $buff, + ); + # (avoid structure warnings when copying from XML) + my $oldWarn = $$et{NO_STRUCT_WARN}; + $$et{NO_STRUCT_WARN} = 1; + $et->ProcessDirectory(\%dirInfo, GetTagTable('Image::ExifTool::XMP::Main')); + $$et{NO_STRUCT_WARN} = $oldWarn; + } + } + # process rootfile of EPUB container if applicable + for (;;) { + last if $meta and $mime ne 'application/epub+zip'; + my $container = $zip->memberNamed('META-INF/container.xml'); + ($buff, $status) = $zip->contents($container); + last if $status; + $buff =~ /<rootfile\s+[^>]*?\bfull-path=(['"])(.*?)\1/s or last; + # load the rootfile data (OPF extension; contains XML metadata) + my $meta2 = $zip->memberNamed($2) or last; + $meta = $meta2; + ($buff, $status) = $zip->contents($meta); + last if $status; + # use opf:event to generate more meaningful tag names for dc:date + while ($buff =~ s{<dc:date opf:event="(\w+)">([^<]+)</dc:date>}{<dc:${1}Date>$2</dc:${1}Date>}s) { + my $dcTable = GetTagTable('Image::ExifTool::XMP::dc'); + my $tag = "${1}Date"; + AddTagToTable($dcTable, $tag, { + Name => ucfirst $tag, + Groups => { 2 => 'Time' }, + List => 'Seq', + %Image::ExifTool::XMP::dateTimeInfo + }) unless $$dcTable{$tag}; + } + my %dirInfo = ( + DataPt => \$buff, + DirLen => length $buff, + DataLen => length $buff, + IgnoreProp => { 'package' => 1, metadata => 1 }, + ); + # (avoid structure warnings when copying from XML) + my $oldWarn = $$et{NO_STRUCT_WARN}; + $$et{NO_STRUCT_WARN} = 1; + $et->ProcessDirectory(\%dirInfo, GetTagTable('Image::ExifTool::XMP::XML')); + $$et{NO_STRUCT_WARN} = $oldWarn; + last; + } + if ($openDocType{$mime} or $meta) { + # extract preview image(s) from "Thumbnails" directory if they exist + my $type; + my %tag = ( jpg => 'PreviewImage', png => 'PreviewPNG' ); + foreach $type ('jpg', 'png') { + my $thumb = $zip->memberNamed("Thumbnails/thumbnail.$type"); + next unless $thumb; + ($buff, $status) = $zip->contents($thumb); + $et->FoundTag($tag{$type}, $buff) unless $status; + } + last; # all done since we recognized the MIME type or found metadata + } + # continue on to list ZIP contents... + } + } + + # otherwise just extract general ZIP information + $et->SetFileType(); + @members = $zip->members(); + my ($member, $iWorkType); + # special files to extract + my %extract = ( + 'meta.json' => 1, + 'previews/preview.png' => 'PreviewPNG', + 'preview.jpg' => 'PreviewImage', # (iWork 2013 files) + 'preview-web.jpg' => 'OtherImage', # (iWork 2013 files) + 'preview-micro.jpg' => 'ThumbnailImage', # (iWork 2013 files) + 'QuickLook/Thumbnail.jpg' => 'ThumbnailImage', # (iWork 2009 files) + 'QuickLook/Preview.pdf' => 'PreviewPDF', # (iWork 2009 files) + ); + foreach $member (@members) { + $$et{DOC_NUM} = ++$docNum; + HandleMember($et, $member, $tagTablePtr); + my $file = $member->fileName(); + # extract things from Sketch files + if ($extract{$file}) { + ($buff, $status) = $zip->contents($member); + $status and $et->Warn("Error extracting $file"), next; + if ($file eq 'meta.json') { + $et->ExtractInfo(\$buff, { ReEntry => 1 }); + if ($$et{VALUE}{App} and $$et{VALUE}{App} =~ /sketch/i) { + $et->OverrideFileType('SKETCH'); + } + } else { + $et->FoundTag($extract{$file} => $buff); + } + } elsif ($file eq 'Index/Document.iwa' and not $iWorkType) { + my $type = $iWorkType{$$et{FILE_EXT} || ''}; + $iWorkType = $type || 'PAGES'; + } elsif ($iWorkFile{$file}) { + $iWorkType = $iWorkFile{$file}; + } + } + $et->OverrideFileType($iWorkType) if $iWorkType; + last; + } + # all done if we processed this using Archive::Zip + if ($zip) { + delete $$dirInfo{ZIP}; + delete $$et{DOC_NUM}; + if ($docNum > 1 and not $et->Options('Duplicates')) { + $et->Warn("Use the Duplicates option to extract tags for all $docNum files", 1); + } + return 1; + } +# +# process the ZIP file by hand (funny, but this seems easier than using Archive::Zip) +# + $et->VPrint(1, " -- processing as binary data --\n"); + $raf->Seek(30, 0); + $et->SetFileType(); + SetByteOrder('II'); + + # A. Local file header: + # local file header signature 0) 4 bytes (0x04034b50) + # version needed to extract 4) 2 bytes + # general purpose bit flag 6) 2 bytes + # compression method 8) 2 bytes + # last mod file time 10) 2 bytes + # last mod file date 12) 2 bytes + # crc-32 14) 4 bytes + # compressed size 18) 4 bytes + # uncompressed size 22) 4 bytes + # file name length 26) 2 bytes + # extra field length 28) 2 bytes + for (;;) { + my $len = Get16u(\$buff, 26) + Get16u(\$buff, 28); + $raf->Read($buf2, $len) == $len or last; + + $$et{DOC_NUM} = ++$docNum; + $buff .= $buf2; + my %dirInfo = ( + DataPt => \$buff, + DataPos => $raf->Tell() - 30 - $len, + DataLen => 30 + $len, + DirStart => 0, + DirLen => 30 + $len, + MixedTags => 1, # (to ignore FileComment tag) + ); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + my $flags = Get16u(\$buff, 6); + if ($flags & 0x08) { + # we don't yet support skipping stream mode data + # (when this happens, the CRC, compressed size and uncompressed + # sizes are set to 0 in the header. Instead, they are stored + # after the compressed data with an optional header of 0x08074b50) + $et->Warn('Stream mode data encountered, file list may be incomplete'); + last; + } + $len = Get32u(\$buff, 18); # file data length + $raf->Seek($len, 1) or last; # skip file data + $raf->Read($buff, 30) == 30 and $buff =~ /^PK\x03\x04/ or last; + } + delete $$et{DOC_NUM}; + if ($docNum > 1 and not $et->Options('Duplicates')) { + $et->Warn("Use the Duplicates option to extract tags for all $docNum files", 1); + } + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::ZIP - Read ZIP archive meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from ZIP, GZIP and RAR archives. This includes ZIP-based file +types like Office Open XML (DOCX, PPTX and XLSX), Open Document (ODB, ODC, +ODF, ODG, ODI, ODP, ODS and ODT), iWork (KEY, PAGES, NUMBERS), Capture One +Enhanced Image Package (EIP), Adobe InDesign Markup Language (IDML), +Electronic Publication (EPUB), and Sketch design files (SKETCH). + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<http://www.pkware.com/documents/casestudies/APPNOTE.TXT> + +=item L<http://www.gzip.org/zlib/rfc-gzip.html> + +=item L<http://DataCompression.info/ArchiveFormats/RAR202.txt> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/ZIP Tags>, +L<Image::ExifTool::TagNames/OOXML Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/ZISRAW.pm b/lib/Image/ExifTool/ZISRAW.pm new file mode 100644 index 0000000..1939782 --- /dev/null +++ b/lib/Image/ExifTool/ZISRAW.pm @@ -0,0 +1,242 @@ +#------------------------------------------------------------------------------ +# File: ZISRAW.pm +# +# Description: Read ZISRAW (CZI) meta information +# +# Revisions: 2020-08-07 - P. Harvey Created +# +# References: 1) https://www.zeiss.com/microscopy/us/products/microscope-software/zen/czi.html +#------------------------------------------------------------------------------ + +package Image::ExifTool::ZISRAW; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); + +$VERSION = '1.01'; + +%Image::ExifTool::ZISRAW::Main = ( + PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, + GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' }, + NOTES => q{ + As well as the header information listed below, ExifTool also extracts the + top-level XML-based metadata from Zeiss Integrated Software RAW (ZISRAW) CZI + files. + }, + 0x20 => { + Name => 'ZISRAWVersion', + Format => 'int32u[2]', + PrintConv => '$val =~ tr/ /./; $val', + }, + 0x30 => { + Name => 'PrimaryFileGUID', + Format => 'undef[16]', + ValueConv => 'unpack("H*",$val)', + }, + 0x40 => { + Name => 'FileGUID', + Format => 'undef[16]', + ValueConv => 'unpack("H*",$val)', + }, +); + +#------------------------------------------------------------------------------ +# Shorten obscenely long CZI tag names +# Inputs: Tag name +# Returns: Shortened tag name +sub ShortenTagNames($) +{ + local $_; + $_ = shift; + s/^HardwareSetting//; + s/^DevicesDevice/Device/; + s/LightPathNode//g; + s/Successors//g; + s/ExperimentExperiment/Experiment/g; + s/ObjectivesObjective/Objective/; + s/ChannelsChannel/Channel/; + s/TubeLensesTubeLens/TubeLens/; + s/^ExperimentHardwareSettingsPoolHardwareSetting/HardwareSetting/; + s/SharpnessMeasureSetSharpnessMeasure/Sharpness/; + s/FocusSetupAutofocusSetup/Autofocus/; + s/TracksTrack/Track/; + s/ChannelRefsChannelRef/ChannelRef/; + s/ChangerChanger/Changer/; + s/ElementsChangerElement/Changer/; + s/ChangerElements/Changer/; + s/ContrastChangerContrast/Contrast/; + s/KeyFunctionsKeyFunction/KeyFunction/; + s/ManagerContrastManager(Contrast)?/ManagerContrast/; + s/ObjectiveChangerObjective/ObjectiveChanger/; + s/ManagerLightManager/ManagerLight/; + s/WavelengthAreasWavelengthArea/WavelengthArea/; + s/ReflectorChangerReflector/ReflectorChanger/; + s/^StageStageAxesStageAxis/StageAxis/; + s/ShutterChangerShutter/ShutterChanger/; + s/OnOffChangerOnOff/OnOffChanger/; + s/UnsharpMaskStateUnsharpMask/UnsharpMask/; + s/Acquisition/Acq/; + s/Continuous/Cont/; + s/Resolution/Res/; + s/Experiment/Expt/g; + s/Threshold/Thresh/; + s/Reference/Ref/; + s/Magnification/Mag/; + s/Original/Orig/; + s/FocusSetupFocusStrategySetup/Focus/; + s/ParametersParameter/Parameter/; + s/IntervalInfo/Interval/; + s/ExptBlocksAcqBlock/AcqBlock/; + s/MicroscopesMicroscope/Microscope/; + s/TimeSeriesInterval/TimeSeries/; + s/Interval(.*Interval)/$1/; + s/SingleTileRegionsSingleTileRegion/SingleTileRegion/; + s/AcquisitionMode//; + s/DetectorsDetector/Detector/; + s/Setup//; + s/Setting//; + s/TrackTrack/Track/; + s/AnalogOutMaximumsAnalogOutMaximum/AnalogOutMaximum/; + s/AnalogOutMinimumsAnalogOutMinimum/AnalogOutMinimum/; + s/DigitalOutLabelsDigitalOutLabelLabel/DigitalOutLabelLabel/; + s/(VivaTomeOpticalSectionInformation)+VivaTomeOpticalSectionInformation/VivaTomeOpticalSectionInformation/; + s/FocusDefiniteFocus/FocusDefinite/; + s/ChangerChanger/Changer/; + s/Calibration/Cal/; + s/LightSwitchChangerRLTLSwitch/LightSwitchChangerRLTL/; + s/Parameters//; + s/Fluorescence/Fluor/; + s/CameraGeometryCameraGeometry/CameraGeometry/; + s/CameraCamera/Camera/; + s/DetectorsCamera/Camera/; + s/FilterChangerLeftChangerEmissionFilter/LeftChangerEmissionFilter/; + s/SwitchingStatesSwitchingState/SwitchingState/; + s/Information/Info/; + s/SubDimensions?//g; + s/Setups?//; + s/Parameters?//; + s/Calculate/Calc/; + s/Visibility/Vis/; + s/Orientation/Orient/; + s/ListItems/Items/; + s/Increment/Incr/; + s/Parameter/Param/; + s/(ParfocalParcentralValues)+ParfocalParcentralValue/Parcentral/; + s/ParcentralParcentral/Parcentral/; + s/CorrFocusCorrection/FocusCorr/; + s/(ApoTomeDepthInfo)+Element/ApoTomeDepth/; + s/(ApoTomeClickStopInfo)+Element/ApoTomeClickStop/; + s/DepthDepth/Depth/; + s/(Devices?)+Device/Device/; + s/(BeamPathNode)+/BeamPathNode/; + s/BeamPathsBeamPath/BeamPath/g; + s/BeamPathBeamPath/BeamPath/g; + s/Configuration/Config/; + s/StageAxesStageAxis/StageAxis/; + s/RangesRange/Range/; + s/DataGridDatasGridData(Grid)?/DataGrid/; + s/DataMicroscopeDatasMicroscopeData(Microscope)?/DataMicroscope/; + s/DataWegaDatasWegaData/DataWega/; + s/ClickStopPositionsClickStopPosition/ClickStopPosition/; + s/LightSourcess?LightSource(Settings)?(LightSource)?/LightSource/; + s/FilterSetsFilterSet/FilterSet/; + s/EmissionFiltersEmissionFilter/EmissionFilter/; + s/ExcitationFiltersExcitationFilter/ExcitationFilter/; + s/FiltersFilter/Filter/; + s/DichroicsDichroic/Dichronic/; + s/WavelengthsWavelength/Wavelength/; + s/MultiTrackSetup/MultiTrack/; + s/TrackTrack/Track/; + s/DataGrabberSetup/DataGrabber/; + s/CameraFrameSetup/CameraFrame/; + s/TimeSeries(TimeSeries|Setups)/TimeSeries/; + s/FocusFocus/Focus/; + s/FocusAutofocus/Autofocus/; + s/Focus(Hardware|Software)(Autofocus)+/Autofocus$1/; + s/AutofocusAutofocus/Autofocus/; + return $_; +} + +#------------------------------------------------------------------------------ +# Extract metadata from a ZISRAW (CZI) image +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 on success, 0 if this wasn't a valid CZI file +sub ProcessCZI($$) +{ + my ($et, $dirInfo) = @_; + my $raf = $$dirInfo{RAF}; + my ($buff, $tagTablePtr); + + # verify this is a valid CZI file + return 0 unless $raf->Read($buff, 100) == 100; + return 0 unless $buff =~ /^ZISRAWFILE\0{6}/; + $et->SetFileType(); + SetByteOrder('II'); + my %dirInfo = ( + DataPt => \$buff, + DirStart => 0, + DirLen => length($buff), + ); + $tagTablePtr = GetTagTable('Image::ExifTool::ZISRAW::Main'); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + + # read the metadata section + my $pos = Get64u(\$buff, 92) or return 1; + $raf->Seek($pos, 0) or $et->Warn('Error seeking to metadata'), return 0; + $raf->Read($buff, 288) == 288 or $et->Warn('Error reading metadata header'), return 0; + $buff =~ /^ZISRAWMETADATA\0\0/ or $et->Warn('Invalid metadata header'), return 0; + my $len = Get32u(\$buff, 32); + $len < 200000000 or $et->Warn('Metadata section too large. Ignoring'), return 0; + $raf->Read($buff, $len) or $et->Warn('Error reading XML metadata'), return 0; + $et->FoundTag('XML', $buff); # extract as a block + $tagTablePtr = GetTagTable('Image::ExifTool::XMP::XML'); + $dirInfo{DirLen} = length $buff; + # shorten tag names somewhat by removing 'ImageDocumentMetadata' prefix from all + $$et{XmpIgnoreProps} = [ 'ImageDocument', 'Metadata', 'Information' ]; + $$et{ShortenXmpTags} = \&ShortenTagNames; + + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::ZISRAW - Read ZISRAW (CZI) meta information + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to read +metadata from Zeiss Integrated Software RAW (ZISRAW) CZI files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 REFERENCES + +=over 4 + +=item L<https://www.zeiss.com/microscopy/us/products/microscope-software/zen/czi.html> + +=back + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/ZISRAW Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/lib/Image/ExifTool/iWork.pm b/lib/Image/ExifTool/iWork.pm new file mode 100644 index 0000000..74d2fdb --- /dev/null +++ b/lib/Image/ExifTool/iWork.pm @@ -0,0 +1,230 @@ +#------------------------------------------------------------------------------ +# File: iWork.pm +# +# Description: Read Apple iWork '09 XML+ZIP files +# +# Revisions: 2009/11/11 - P. Harvey Created +#------------------------------------------------------------------------------ + +package Image::ExifTool::iWork; + +use strict; +use vars qw($VERSION); +use Image::ExifTool qw(:DataAccess :Utils); +use Image::ExifTool::XMP; +use Image::ExifTool::ZIP; + +$VERSION = '1.06'; + +# test for recognized iWork document extensions and outer XML elements +my %iWorkType = ( + # file extensions + NUMBERS => 'NUMBERS', + PAGES => 'PAGES', + KEY => 'KEY', + KTH => 'KTH', + NMBTEMPLATE => 'NMBTEMPLATE', + # we don't support double extensions -- + # "PAGES.TEMPLATE" => 'Apple Pages Template', + # outer XML elements + 'ls:document' => 'NUMBERS', + 'sl:document' => 'PAGES', + 'key:presentation' => 'KEY', +); + +# MIME types for iWork files (Apple has not registered these yet, but these +# are my best guess after doing some googling. I'm not 100% sure what "sff" +# indicates, but I think it refers to the new "flattened" package format) +my %mimeType = ( + 'NUMBERS' => 'application/x-iwork-numbers-sffnumbers', + 'PAGES' => 'application/x-iwork-pages-sffpages', + 'KEY' => 'application/x-iWork-keynote-sffkey', + 'NMBTEMPLATE' => 'application/x-iwork-numbers-sfftemplate', + 'PAGES.TEMPLATE'=> 'application/x-iwork-pages-sfftemplate', + 'KTH' => 'application/x-iWork-keynote-sffkth', +); + +# iWork tags +%Image::ExifTool::iWork::Main = ( + GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Document' }, + PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP, + VARS => { NO_ID => 1 }, + NOTES => q{ + The Apple iWork '09 file format is a ZIP archive containing XML files + similar to the Office Open XML (OOXML) format. Metadata tags in iWork + files are extracted even if they don't appear below. + }, + authors => { Name => 'Author', Groups => { 2 => 'Author' } }, + comment => { }, + copyright => { Groups => { 2 => 'Author' } }, + keywords => { }, + projects => { List => 1 }, + title => { }, +); + +#------------------------------------------------------------------------------ +# Generate a tag ID for this XML tag +# Inputs: 0) tag property name list ref +# Returns: tagID +sub GetTagID($) +{ + my $props = shift; + return 0 if $$props[-1] =~ /^\w+:ID$/; # ignore ID tags + return $$props[0] =~ /^.*?:(.*)/ ? $1 : $$props[0]; +} + +#------------------------------------------------------------------------------ +# We found an XMP property name/value +# Inputs: 0) ExifTool object ref, 1) tag table ref +# 2) reference to array of XMP property names (last is current property) +# 3) property value, 4) attribute hash ref (not used here) +# Returns: 1 if valid tag was found +sub FoundTag($$$$;$) +{ + my ($et, $tagTablePtr, $props, $val, $attrs) = @_; + return 0 unless @$props; + my $verbose = $et->Options('Verbose'); + + $et->VPrint(0, " | - Tag '", join('/',@$props), "'\n") if $verbose > 1; + + # un-escape XML character entities + $val = Image::ExifTool::XMP::UnescapeXML($val); + # convert from UTF8 to ExifTool Charset + $val = $et->Decode($val, 'UTF8'); + my $tag = GetTagID($props) or return 0; + + # add any unknown tags to table + unless ($$tagTablePtr{$tag}) { + $et->VPrint(0, " [adding $tag]\n") if $verbose; + AddTagToTable($tagTablePtr, $tag, { Name => ucfirst $tag }); + } + # save the tag + $et->HandleTag($tagTablePtr, $tag, $val); + + return 1; +} + +#------------------------------------------------------------------------------ +# Extract information from an iWork file +# Inputs: 0) ExifTool object reference, 1) dirInfo reference +# Returns: 1 +# Notes: Upon entry to this routine, the file type has already been verified +# as ZIP and the dirInfo hash contains a 'ZIP' Archive::Zip object reference +sub Process_iWork($$) +{ + my ($et, $dirInfo) = @_; + my $zip = $$dirInfo{ZIP}; + my ($type, $index, $indexFile, $status); + + # try to determine the file type + local $SIG{'__WARN__'} = \&Image::ExifTool::ZIP::WarnProc; + # trust type given by file extension if available + $type = $iWorkType{$$et{FILE_EXT}} if $$et{FILE_EXT}; + unless ($type) { + # read the index file + my @members = $zip->membersMatching('^index\.(xml|apxl)$'); + if (@members) { + ($index, $status) = $zip->contents($members[0]); + unless ($status) { + $indexFile = $members[0]->fileName(); + if ($index =~ /^\s*<\?xml version=[^<]+<(\w+:\w+)/s) { + $type = $iWorkType{$1} if $iWorkType{$1}; + } + } + } else { + @members = $zip->membersMatching('(?i)^.*\.(pages|numbers|key)/Index.*'); + if (@members) { + my $tmp = $members[0]->fileName(); + $type = $iWorkType{uc $1} if $tmp =~ /\.(pages|numbers|key)/i; + } + } + $type or $type = 'ZIP'; # assume ZIP by default + } + $et->SetFileType($type, $mimeType{$type}); + + my @members = $zip->members(); + my $docNum = 0; + my $member; + foreach $member (@members) { + # get filename of this ZIP member + my $file = $member->fileName(); + next unless defined $file; + $et->VPrint(0, "File: $file\n"); + # set the document number and extract ZIP tags + $$et{DOC_NUM} = ++$docNum; + Image::ExifTool::ZIP::HandleMember($et, $member); + + # process only the index XML and JPEG thumbnail/preview files + next unless $file =~ m{^(index\.(xml|apxl)|QuickLook/Thumbnail\.jpg|[^/]+/preview(-micro|-web)?.jpg)$}i; + # get the file contents if necessary + # (CAREFUL! $buff MUST be local since we hand off a value ref to PreviewImage) + my ($buff, $buffPt); + if ($indexFile and $indexFile eq $file) { + # use the index file we already loaded + $buffPt = \$index; + } else { + ($buff, $status) = $zip->contents($member); + $status and $et->Warn("Error extracting $file"), next; + $buffPt = \$buff; + } + # extract JPEG as PreviewImage (should only be QuickLook/Thumbnail.jpg) + if ($file =~ /\.jpg$/) { + my $type = ($file =~ /preview-(\w+)/) ? ($1 eq 'web' ? 'Other' : 'Thumbnail') : 'Preview'; + $et->FoundTag($type . 'Image', $buffPt); + next; + } + # process "metadata" section of XML index file + next unless $$buffPt =~ /<(\w+):metadata>/g; + my $ns = $1; + my $p1 = pos $$buffPt; + next unless $$buffPt =~ m{</${ns}:metadata>}g; + # construct XML data from "metadata" section only + $$buffPt = '<?xml version="1.0"?>' . substr($$buffPt, $p1, pos($$buffPt)-$p1); + my %dirInfo = ( + DataPt => $buffPt, + DirLen => length $$buffPt, + DataLen => length $$buffPt, + XMPParseOpts => { + FoundProc => \&FoundTag, + }, + ); + my $tagTablePtr = GetTagTable('Image::ExifTool::iWork::Main'); + $et->ProcessDirectory(\%dirInfo, $tagTablePtr); + undef $$buffPt; # (free memory now) + } + delete $$et{DOC_NUM}; + return 1; +} + +1; # end + +__END__ + +=head1 NAME + +Image::ExifTool::iWork - Read Apple iWork '09 XML+ZIP files + +=head1 SYNOPSIS + +This module is used by Image::ExifTool + +=head1 DESCRIPTION + +This module contains definitions required by Image::ExifTool to extract meta +information from Apple iWork '09 XML+ZIP files. + +=head1 AUTHOR + +Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L<Image::ExifTool::TagNames/iWork Tags>, +L<Image::ExifTool::TagNames/OOXML Tags>, +L<Image::ExifTool(3pm)|Image::ExifTool> + +=cut + diff --git a/perl-Image-ExifTool.spec b/perl-Image-ExifTool.spec new file mode 100644 index 0000000..adb7df1 --- /dev/null +++ b/perl-Image-ExifTool.spec @@ -0,0 +1,119 @@ +Summary: perl module for image data extraction +Name: perl-Image-ExifTool +Version: 12.44 +Release: 1 +License: Artistic/GPL +Group: Development/Libraries/Perl +URL: https://exiftool.org/ +Source0: Image-ExifTool-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root + +%description +ExifTool is a customizable set of Perl modules plus a full-featured +command-line application for reading and writing meta information in a wide +variety of files, including the maker note information of many digital +cameras by various manufacturers such as Canon, Casio, DJI, FLIR, FujiFilm, +GE, GoPro, HP, JVC/Victor, Kodak, Leaf, Minolta/Konica-Minolta, Nikon, +Nintendo, Olympus/Epson, Panasonic/Leica, Pentax/Asahi, Phase One, Reconyx, +Ricoh, Samsung, Sanyo, Sigma/Foveon and Sony. + +Below is a list of file types and meta information formats currently +supported by ExifTool (r = read, w = write, c = create): + + File Types + ------------+-------------+-------------+-------------+------------ + 360 r/w | DR4 r/w/c | JNG r/w | O r | RAW r/w + 3FR r | DSS r | JP2 r/w | ODP r | RIFF r + 3G2 r/w | DV r | JPEG r/w | ODS r | RSRC r + 3GP r/w | DVB r/w | JSON r | ODT r | RTF r + A r | DVR-MS r | JXL r | OFR r | RW2 r/w + AA r | DYLIB r | K25 r | OGG r | RWL r/w + AAE r | EIP r | KDC r | OGV r | RWZ r + AAX r/w | EPS r/w | KEY r | ONP r | RM r + ACR r | EPUB r | LA r | OPUS r | SEQ r + AFM r | ERF r/w | LFP r | ORF r/w | SKETCH r + AI r/w | EXE r | LIF r | ORI r/w | SO r + AIFF r | EXIF r/w/c | LNK r | OTF r | SR2 r/w + APE r | EXR r | LRV r/w | PAC r | SRF r + ARQ r/w | EXV r/w/c | M2TS r | PAGES r | SRW r/w + ARW r/w | F4A/V r/w | M4A/V r/w | PBM r/w | SVG r + ASF r | FFF r/w | MACOS r | PCD r | SWF r + AVI r | FITS r | MAX r | PCX r | THM r/w + AVIF r/w | FLA r | MEF r/w | PDB r | TIFF r/w + AZW r | FLAC r | MIE r/w/ | PDF r/w | TORRENT r + BMP r | FLIF r/w | MIFF r c | PEF r/w | TTC r + BPG r | FLV r | MKA r | PFA r | TTF r + BTF r | FPF r | MKS r | PFB r | TXT r + CHM r | FPX r | MKV r | PFM r | VCF r + COS r | GIF r/w | MNG r/w | PGF r | VRD r/w/c + CR2 r/w | GPR r/w | MOBI r | PGM r/w | VSD r + CR3 r/w | GZ r | MODD r | PLIST r | WAV r + CRM r/w | HDP r/w | MOI r | PICT r | WDP r/w + CRW r/w | HDR r | MOS r/w | PMP r | WEBP r + CS1 r/w | HEIC r/w | MOV r/w | PNG r/w | WEBM r + CSV r | HEIF r/w | MP3 r | PPM r/w | WMA r + CZI r | HTML r | MP4 r/w | PPT r | WMV r + DCM r | ICC r/w/c | MPC r | PPTX r | WTV r + DCP r/w | ICS r | MPG r | PS r/w | WV r + DCR r | IDML r | MPO r/w | PSB r/w | X3F r/w + DFONT r | IIQ r/w | MQV r/w | PSD r/w | XCF r + DIVX r | IND r/w | MRC r | PSP r | XLS r + DJVU r | INSP r/w | MRW r/w | QTIF r/w | XLSX r + DLL r | INSV r | MXF r | R3D r | XMP r/w/c + DNG r/w | INX r | NEF r/w | RA r | ZIP r + DOC r | ISO r | NKSC r/w | RAF r/w | + DOCX r | ITC r | NRW r/w | RAM r | + DPX r | J2C r | NUMBERS r | RAR r | + + Meta Information + ----------------------+----------------------+--------------------- + EXIF r/w/c | CIFF r/w | Ricoh RMETA r + GPS r/w/c | AFCP r/w | Picture Info r + IPTC r/w/c | Kodak Meta r/w | Adobe APP14 r + XMP r/w/c | FotoStation r/w | MPF r + MakerNotes r/w/c | PhotoMechanic r/w | Stim r + Photoshop IRB r/w/c | JPEG 2000 r | DPX r + ICC Profile r/w/c | DICOM r | APE r + MIE r/w/c | Flash r | Vorbis r + JFIF r/w/c | FlashPix r | SPIFF r + Ducky APP12 r/w/c | QuickTime r | DjVu r + PDF r/w/c | Matroska r | M2TS r + PNG r/w/c | MXF r | PE/COFF r + Canon VRD r/w/c | PrintIM r | AVCHD r + Nikon Capture r/w/c | FLAC r | ZIP r + GeoTIFF r/w/c | ID3 r | (and more) + +See html/index.html for more details about ExifTool features. + +%prep +%setup -n Image-ExifTool-%{version} + +%build +perl Makefile.PL INSTALLDIRS=vendor + +%install +rm -rf $RPM_BUILD_ROOT +%makeinstall DESTDIR=%{?buildroot:%{buildroot}} +find $RPM_BUILD_ROOT -name perllocal.pod | xargs rm + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root,-) +%doc Changes html +%{_libdir}/perl5/* +/usr/share/*/* +%{_mandir}/*/* +%{_bindir}/* + +%changelog +* Tue May 06 2014 - Norbert de Rooy <nsrderooy@gmail.com> +- Spec file fixed for Redhat 6 +* Tue May 09 2006 - Niels Kristian Bech Jensen <nkbj@mail.tele.dk> +- Spec file fixed for Mandriva Linux 2006. +* Mon May 08 2006 - Volker Kuhlmann <VolkerKuhlmann@gmx.de> +- Spec file fixed for SUSE. +- Package available from: http://volker.dnsalias.net/soft/ +* Sat Jun 19 2004 Kayvan Sylvan <kayvan@sylvan.com> - Image-ExifTool +- Initial build. diff --git a/t/AFCP.t b/t/AFCP.t new file mode 100644 index 0000000..1d02a73 --- /dev/null +++ b/t/AFCP.t @@ -0,0 +1,45 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/AFCP.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::AFCP; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'AFCP'; +my $testnum = 1; + +# test 2: Extract information from AFCP.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/AFCP.jpg', {Duplicates => 1}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Test writing a bunch of information +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/IPTC.jpg'); + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->WriteInfo('t/images/AFCP.jpg',$testfile); + my $info = $exifTool->ImageInfo($testfile, {Group1 => 'IPTC2'}); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# end diff --git a/t/AFCP_2.out b/t/AFCP_2.out new file mode 100644 index 0000000..13f34f8 --- /dev/null +++ b/t/AFCP_2.out @@ -0,0 +1,39 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: AFCP.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1110 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:03:59-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[IPTC, IPTC2, Other] 0 - Application Record Version: 2 +[IPTC, IPTC2, Other] 15 - Category: p +[IPTC, IPTC2, Time] 55 - Date Created: 2005:12:23 +[IPTC, IPTC2, Other] 5 - Object Name: object name +[IPTC, IPTC2, Other] 10 - Urgency: 2 +[IPTC, IPTC2, Other] 20 - Supplemental Categories: supp cat +[IPTC, IPTC2, Other] 25 - Keywords: keyword +[IPTC, IPTC2, Other] 40 - Special Instructions: special instructions +[IPTC, IPTC2, Author] 80 - By-line: byline +[IPTC, IPTC2, Author] 85 - By-line Title: byline title +[IPTC, IPTC2, Location] 90 - City: city +[IPTC, IPTC2, Location] 101 - Country-Primary Location Name: country name +[IPTC, IPTC2, Other] 103 - Original Transmission Reference: otr +[IPTC, IPTC2, Other] 105 - Headline: headline +[IPTC, IPTC2, Author] 110 - Credit: credit +[IPTC, IPTC2, Author] 115 - Source: source +[IPTC, IPTC2, Author] 116 - Copyright Notice: copy freely +[IPTC, IPTC2, Other] 120 - Caption-Abstract: ExifTool AFCP test +[IPTC, IPTC2, Author] 122 - Writer-Editor: caption writer +[IPTC, IPTC2, Location] 95 - Province-State: state +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/AFCP_3.out b/t/AFCP_3.out new file mode 100644 index 0000000..7f2911a --- /dev/null +++ b/t/AFCP_3.out @@ -0,0 +1,20 @@ +[IPTC, IPTC2, Other] 0 - Application Record Version: 2 +[IPTC, IPTC2, Other] 15 - Category: 1 +[IPTC, IPTC2, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC2, Other] 5 - Object Name: Test IPTC picture +[IPTC, IPTC2, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC2, Other] 20 - Supplemental Categories: amazing, image, utilities +[IPTC, IPTC2, Other] 25 - Keywords: ExifTool, Test, IPTC +[IPTC, IPTC2, Other] 40 - Special Instructions: What instructions +[IPTC, IPTC2, Author] 80 - By-line: Phil Harvey +[IPTC, IPTC2, Author] 85 - By-line Title: My Position +[IPTC, IPTC2, Location] 90 - City: Kingston +[IPTC, IPTC2, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC2, Other] 103 - Original Transmission Reference: What is a transmission reference +[IPTC, IPTC2, Other] 105 - Headline: No headline +[IPTC, IPTC2, Author] 110 - Credit: My Credit +[IPTC, IPTC2, Author] 115 - Source: I'm the source +[IPTC, IPTC2, Author] 116 - Copyright Notice: Copyright 2004 Phil Harvey +[IPTC, IPTC2, Other] 120 - Caption-Abstract: A witty caption +[IPTC, IPTC2, Author] 122 - Writer-Editor: I wrote it +[IPTC, IPTC2, Location] 95 - Province-State: Ont diff --git a/t/AIFF.t b/t/AIFF.t new file mode 100644 index 0000000..9d5653a --- /dev/null +++ b/t/AIFF.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/AIFF.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::AIFF; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'AIFF'; +my $testnum = 1; + +# test 2: Extract information from AIFF.aif +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/AIFF.aif'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/AIFF_2.out b/t/AIFF_2.out new file mode 100644 index 0000000..6e05057 --- /dev/null +++ b/t/AIFF_2.out @@ -0,0 +1,33 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: AIFF.aif +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 290 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:06 15:05:23-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:03:59-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: AIFF +[File, File, Other] FileTypeExtension - File Type Extension: aiff +[File, File, Other] MIMEType - MIME Type: audio/x-aiff +[File, File, Image] ID3Size - ID3 Size: 172 +[AIFF, AIFF, Time] 0 - Comment Time: 2004:03:08 05:28:46 +[AIFF, AIFF, Audio] 2 - Comment: ding.wav +[AIFF, AIFF, Audio] 0 - Num Channels: 1 +[AIFF, AIFF, Audio] 1 - Num Sample Frames: 11554 +[AIFF, AIFF, Audio] 3 - Sample Size: 8 +[AIFF, AIFF, Audio] 4 - Sample Rate: 22050 +[AIFF, AIFF, Audio] NAME - Name: ExifTool test AIFF +[AIFF, AIFF, Author] AUTH - Author: Phil Harvey +[ID3, ID3v2_2, Audio] ULT - Lyrics: my lyrics +[ID3, ID3v2_2, Audio] TCM - Composer: Composer +[ID3, ID3v2_2, Audio] COM - Comment: comments +[ID3, ID3v2_2, Author] TP1 - Artist: the artist +[ID3, ID3v2_2, Audio] TAL - Album: the album +[ID3, ID3v2_2, Audio] TT1 - Grouping: grouping +[ID3, ID3v2_2, Audio] TRK - Track: 1 +[ID3, ID3v2_2, Audio] TPA - Part Of Set: 1/1 +[ID3, ID3v2_2, Time] TYE - Year: 2006 +[ID3, ID3v2_2, Audio] TCO - Genre: Techno +[ID3, ID3v2_2, Audio] TCP - Compilation: Yes +[Composite, Composite, Other] AIFF-Duration - Duration: 0.52 s +[Composite, Composite, Time] ID3-DateTimeOriginal - Date/Time Original: 2006 diff --git a/t/APE.t b/t/APE.t new file mode 100644 index 0000000..ebae462 --- /dev/null +++ b/t/APE.t @@ -0,0 +1,39 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/APE.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::APE; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'APE'; +my $testnum = 1; + +# test 2: Extract information from APE test file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/APE.ape'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Extract information from MCP test file containing 3 different +# types of meta information: ID3v1, ID3v2 and APE +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/APE.mpc'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/APE_2.out b/t/APE_2.out new file mode 100644 index 0000000..933438e --- /dev/null +++ b/t/APE_2.out @@ -0,0 +1,30 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: APE.ape +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 2.2 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:11:14 11:04:22-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:30-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: APE +[File, File, Other] FileTypeExtension - File Type Extension: ape +[File, File, Other] MIMEType - MIME Type: audio/x-monkeys-audio +[APE, MAC, Audio] 0 - Compression Level: 3000 +[APE, MAC, Audio] 2 - Blocks Per Frame: 73728 +[APE, MAC, Audio] 4 - Final Frame Blocks: 42662 +[APE, MAC, Audio] 6 - Total Frames: 2 +[APE, MAC, Audio] 8 - Bits Per Sample: 16 +[APE, MAC, Audio] 9 - Channels: 2 +[APE, MAC, Audio] 10 - Sample Rate: 44100 +[APE, APE, Audio] Track - Track: 4 +[APE, APE, Audio] Year - Year: 2005 +[APE, APE, Audio] Genre - Genre: Electronic +[APE, APE, Audio] Artist - Artist: Kraftwerk +[APE, APE, Audio] Album - Album: Cover Art Test +[APE, APE, Audio] Tool Version - Tool Version: 11.1.102 +[APE, APE, Audio] Tool Name - Tool Name: Media Center +[APE, APE, Audio] Title - Title: Men Machine Live +[APE, APE, Audio] Media Jukebox: Date - Media Jukebox Date: 38353 +[APE, APE, Audio] Cover Art (front) Desc - Cover Art Front Desc: X:\_kuvat\Kraftwerk - Cover Art Test.jpg +[APE, APE, Preview] Cover Art (front) - Cover Art Front: (Binary data 1761 bytes) +[Composite, Composite, Audio] APE-Duration - Duration: 2.64 s diff --git a/t/APE_3.out b/t/APE_3.out new file mode 100644 index 0000000..95eb274 --- /dev/null +++ b/t/APE_3.out @@ -0,0 +1,58 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: APE.mpc +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 2.5 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:11:14 15:06:40-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:30-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: MPC +[File, File, Other] FileTypeExtension - File Type Extension: mpc +[File, File, Other] MIMEType - MIME Type: audio/x-musepack +[File, File, Image] ID3Size - ID3 Size: 391 +[MPC, MPC, Audio] Bit032-063 - Total Frames: 102 +[MPC, MPC, Audio] Bit080-081 - Sample Rate: 44100 +[MPC, MPC, Audio] Bit084-087 - Quality: 5 (Standard) +[MPC, MPC, Audio] Bit088-093 - Max Band: 28 +[MPC, MPC, Audio] Bit096-111 - Replay Gain Track Peak: 0 +[MPC, MPC, Audio] Bit112-127 - Replay Gain Track Gain: 0 +[MPC, MPC, Audio] Bit128-143 - Replay Gain Album Peak: 0 +[MPC, MPC, Audio] Bit144-159 - Replay Gain Album Gain: 0 +[MPC, MPC, Audio] Bit179 - Fast Seek: No +[MPC, MPC, Audio] Bit191 - Gapless: Yes +[MPC, MPC, Audio] Bit216-223 - Encoder Version: 1.1.5 +[APE, APE, Audio] Track - Track: 4 +[APE, APE, Audio] Year - Year: 2005 +[APE, APE, Audio] Genre - Genre: Electronic +[APE, APE, Audio] Artist - Artist: Kraftwerk +[APE, APE, Audio] Album - Album: Cover Art Test +[APE, APE, Audio] Tool Version - Tool Version: 11.1.102 +[APE, APE, Audio] Tool Name - Tool Name: Media Center +[APE, APE, Audio] Title - Title: Men Machine Live +[APE, APE, Audio] Media Jukebox: Date - Media Jukebox Date: 38353 +[APE, APE, Audio] Cover Art (front) Desc - Cover Art Front Desc: X:\_kuvat\Kraftwerk - Cover Art Test.jpg +[APE, APE, Preview] Cover Art (front) - Cover Art Front: (Binary data 1761 bytes) +[ID3, ID3v2_2, Audio] TRK - Track: 1/5 +[ID3, ID3v2_2, Audio] TPA - Part Of Set: 1/2 +[ID3, ID3v2_2, Audio] RVA - Relative Volume Adjustment: +18.0% Right, +18.0% Left +[ID3, ID3v2_2, Audio] ULT - Lyrics: Do-wap she-bang +[ID3, ID3v2_2, Image] PIC-1 - Picture Format: JPG +[ID3, ID3v2_2, Image] PIC-2 - Picture Type: Other +[ID3, ID3v2_2, Image] PIC-3 - Picture Description: comment +[ID3, ID3v2_2, Preview] PIC - Picture: (Binary data 15 bytes) +[ID3, ID3v2_2, Audio] TT2 - Title: ExifTool Test +[ID3, ID3v2_2, Author] TP1 - Artist: Phil Harvey +[ID3, ID3v2_2, Audio] TCM - Composer: A Composer +[ID3, ID3v2_2, Audio] TAL - Album: Phil's Greatest Hits +[ID3, ID3v2_2, Audio] TT1 - Grouping: This group +[ID3, ID3v2_2, Time] TYE - Year: 2005 +[ID3, ID3v2_2, Audio] TCO - Genre: Testing +[ID3, ID3v2_2, Audio] COM - Comment: My Comments +[ID3, ID3v1, Audio] 3 - Title: A 4s sample for testing embedd +[ID3, ID3v1, Author] 33 - Artist: Who Knows +[ID3, ID3v1, Audio] 63 - Album: The Test Album +[ID3, ID3v1, Time] 93 - Year: 2006 +[ID3, ID3v1, Audio] 97 - Comment: a nice comment +[ID3, ID3v1, Audio] 125 - Track: 1 +[ID3, ID3v1, Audio] 127 - Genre: Funk +[Composite, Composite, Time] ID3-DateTimeOriginal - Date/Time Original: 2005 diff --git a/t/ASF.t b/t/ASF.t new file mode 100644 index 0000000..6b24813 --- /dev/null +++ b/t/ASF.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/ASF.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::ASF; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'ASF'; +my $testnum = 1; + +# test 2: Extract information from ASF.wmv +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/ASF.wmv'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/ASF_2.out b/t/ASF_2.out new file mode 100644 index 0000000..3761187 --- /dev/null +++ b/t/ASF_2.out @@ -0,0 +1,56 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: ASF.wmv +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 12 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2005:12:27 07:29:29-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:30-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: WMV +[File, File, Other] FileTypeExtension - File Type Extension: wmv +[File, File, Other] MIMEType - MIME Type: video/x-ms-wmv +[ASF, ASF, Video] ToolName - Tool Name: Photo Story 3 for Windows +[ASF, ASF, Video] Publisher - Publisher: Photo Story 3 for Windows +[ASF, ASF, Video] ToolVersion - Tool Version: 3.0.1115.0 +[ASF, ASF, Video] Genre - Genre: Photo Story +[ASF, ASF, Image] 0 - Picture Type: Front Cover +[ASF, ASF, Image] 1 - Picture MIME Type: image/jpeg +[ASF, ASF, Preview] 3 - Picture: (Binary data 6587 bytes) +[ASF, ASF, Video] IsVBR - Is VBR: True +[ASF, ASF, Video] ASFLeakyBucketPairs - ASF Leaky Bucket Pairs: (Binary data 114 bytes) +[ASF, ASF, Video] 0 - File ID: 5F69B0C4-04F7-4B21-9842-46CCA542D8D3 +[ASF, ASF, Video] 16 - File Length: 414891 +[ASF, ASF, Time] 24 - Creation Date: 2004:10:28 17:23:34Z +[ASF, ASF, Video] 32 - Data Packets: 287 +[ASF, ASF, Video] 40 - Duration: 0:01:39 +[ASF, ASF, Video] 48 - Send Duration: 0:01:37 +[ASF, ASF, Video] 56 - Preroll: 5000 +[ASF, ASF, Video] 64 - Flags: 2 +[ASF, ASF, Video] 68 - Min Packet Size: 1400 +[ASF, ASF, Video] 72 - Max Packet Size: 1400 +[ASF, ASF, Video] 76 - Max Bitrate: 30.6 kbps +[ASF, ASF, Video] MediaClassPrimaryID - Media Class Primary ID: DB9830BD-3AB3-4FAB-8A37-1A995F7FF74B +[ASF, ASF, Video] MediaClassSecondaryID - Media Class Secondary ID: 0B710218-8C0C-475E-AF73-4C41C0C8F8CE +[ASF, ASF, Video] IsVBR - Is VBR: False +[ASF, ASF, Video] IsVBR - Is VBR: False +[ASF, ASF, Video] WMADRCPeakReference - WMADRC Peak Reference: 23311 +[ASF, ASF, Video] WMADRCAverageReference - WMADRC Average Reference: 5966 +[ASF, ASF, Other] AudioCodecName - Audio Codec Name: Windows Media Audio 9.1 +[ASF, ASF, Other] AudioCodecDescription - Audio Codec Description: 20 kbps, 22 kHz, stereo 1-pass CBR +[ASF, ASF, Other] VideoCodecName - Video Codec Name: Windows Media Video 9 Image v2 +[ASF, ASF, Other] VideoCodecDescription - Video Codec Description: +[ASF, ASF, Video] 0 - Stream Type: Audio +[ASF, ASF, Video] 16 - Error Correction Type: Audio Spread +[ASF, ASF, Video] 32 - Time Offset: 0 s +[ASF, ASF, Video] 48 - Stream Number: 1 +[ASF, ASF, Video] 54 - Audio Codec ID: Windows Media Audio V2 V7 V8 V9 / DivX audio (WMA) / Alex AC3 Audio +[ASF, ASF, Video] 56 - Audio Channels: 2 +[ASF, ASF, Video] 58 - Audio Sample Rate: 22050 +[ASF, ASF, Video] 0 - Stream Type: Video +[ASF, ASF, Video] 16 - Error Correction Type: No Error Correction +[ASF, ASF, Video] 32 - Time Offset: 0 s +[ASF, ASF, Video] 48 - Stream Number: 2 +[ASF, ASF, Video] 54 - Image Width: 160 +[ASF, ASF, Video] 58 - Image Height: 120 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 160x120 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.019 diff --git a/t/Apple.t b/t/Apple.t new file mode 100644 index 0000000..497666d --- /dev/null +++ b/t/Apple.t @@ -0,0 +1,30 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Apple.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Apple; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Apple'; +my $testnum = 1; + +# test 2: Extract information from Apple.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Unknown => 1, Composite => 0); + my $info = $exifTool->ImageInfo('t/images/Apple.jpg', '-file:all'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Apple_2.out b/t/Apple_2.out new file mode 100644 index 0000000..4fb729f --- /dev/null +++ b/t/Apple_2.out @@ -0,0 +1,79 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.43 +[EXIF, IFD0, Camera] 271 - Make: Apple +[EXIF, IFD0, Camera] 272 - Camera Model Name: iPhone 7 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: 10.0.2 +[EXIF, IFD0, Time] 306 - Modify Date: 2016:09:28 18:18:05 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/20 +[EXIF, ExifIFD, Image] 33437 - F Number: 1.8 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 40 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2016:09:28 18:18:05 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2016:09:28 18:18:05 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/20 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 1.8 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2.846551724 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 4.0 mm +[EXIF, ExifIFD, Camera] 37396 - Subject Area: 2015 1511 2217 1330 +[EXIF, ExifIFD, Time] 37521 - Sub Sec Time Original: 813 +[EXIF, ExifIFD, Time] 37522 - Sub Sec Time Digitized: 813 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: Uncalibrated +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 4032 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 3024 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 28 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Image] 42034 - Lens Info: 3.99mm f/1.8 +[EXIF, ExifIFD, Image] 42035 - Lens Make: Apple +[EXIF, ExifIFD, Image] 42036 - Lens Model: iPhone 7 back camera 3.99mm f/1.8 +[EXIF, GPS, Location] 1 - GPS Latitude Ref: North +[EXIF, GPS, Location] 2 - GPS Latitude: 53 deg 22' 58.25" +[EXIF, GPS, Location] 3 - GPS Longitude Ref: West +[EXIF, GPS, Location] 4 - GPS Longitude: 1 deg 27' 24.04" +[EXIF, GPS, Location] 5 - GPS Altitude Ref: Above Sea Level +[EXIF, GPS, Location] 6 - GPS Altitude: 72.36649215 m +[EXIF, GPS, Time] 7 - GPS Time Stamp: 17:17:58.65 +[EXIF, GPS, Location] 12 - GPS Speed Ref: km/h +[EXIF, GPS, Location] 13 - GPS Speed: 0 +[EXIF, GPS, Location] 16 - GPS Img Direction Ref: True North +[EXIF, GPS, Location] 17 - GPS Img Direction: 342.0498753 +[EXIF, GPS, Location] 23 - GPS Dest Bearing Ref: True North +[EXIF, GPS, Location] 24 - GPS Dest Bearing: 342.0498753 +[EXIF, GPS, Time] 29 - GPS Date Stamp: 2016:09:28 +[EXIF, GPS, Location] 31 - GPS Horizontal Positioning Error: 165 m +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 2078 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[MakerNotes, Apple, Image] 1 - Apple 0x0001: 4 +[MakerNotes, Apple, Image] 2 - Apple 0x0002: bplist00O..Z.R.†DN:&H<2y-|..ˆ5½.¬iTeœ[...] +[MakerNotes, Apple, Image] flags - Run Time Flags: Valid +[MakerNotes, Apple, Image] value - Run Time Value: 39772089846958 +[MakerNotes, Apple, Image] epoch - Run Time Epoch: 0 +[MakerNotes, Apple, Image] timescale - Run Time Scale: 1000000000 +[MakerNotes, Apple, Image] 4 - Apple 0x0004: 1 +[MakerNotes, Apple, Image] 5 - Apple 0x0005: 177 +[MakerNotes, Apple, Image] 6 - Apple 0x0006: 185 +[MakerNotes, Apple, Image] 7 - Apple 0x0007: 1 +[MakerNotes, Apple, Camera] 8 - Acceleration Vector: -0.6483164083 0.002264119004 -0.7500767578 +[MakerNotes, Apple, Image] 12 - Focus Distance Range: 0.54 - 0.68 m +[MakerNotes, Apple, Image] 13 - Apple 0x000d: 20 +[MakerNotes, Apple, Image] 14 - Apple 0x000e: 0 +[MakerNotes, Apple, Image] 15 - Apple 0x000f: 2 +[MakerNotes, Apple, Image] 16 - Apple 0x0010: 1 +[MakerNotes, Apple, Image] 20 - Apple 0x0014: 5 diff --git a/t/Audible.t b/t/Audible.t new file mode 100644 index 0000000..5166581 --- /dev/null +++ b/t/Audible.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Audible.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Audible; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Audible'; +my $testnum = 1; + +# test 2: Extract information from test file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Audible.aa'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Audible_2.out b/t/Audible_2.out new file mode 100644 index 0000000..029420a --- /dev/null +++ b/t/Audible_2.out @@ -0,0 +1,40 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: Audible.aa +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1322 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2015:04:10 06:46:11-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:11:01 10:11:40-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: AA +[File, File, Other] FileTypeExtension - File Type Extension: aa +[File, File, Other] MIMEType - MIME Type: audio/audible +[Audible, Audible, Audio] product_id - Product Id: BK_ADBL_123456a_mp332 +[Audible, Audible, Audio] parent_id - Parent Id: BK_ADBL_123456 +[Audible, Audible, Audio] title - Title: Test: This is the title of the big book (Unabridged) +[Audible, Audible, Author] author - Author: Philip J Harvey +[Audible, Audible, Audio] provider - Provider: ExifTool Test Lib +[Audible, Audible, Audio] narrator - Narrator: Nobody that I know +[Audible, Audible, Audio] price - Price: 98.95 +[Audible, Audible, Time] pubdate - Publish Date: 08-APR-2015 +[Audible, Audible, Audio] description - Description: This is the book description +[Audible, Audible, Audio] long_description - Long Description: This is the long book description +[Audible, Audible, Author] copyright - Copyright: ©2015, Philip J Harvey; (P)2015 ExifTool Publisher +[Audible, Audible, Audio] short_title - Short Title: Short Titley (Unabridged) +[Audible, Audible, Audio] is_aggregation - Is Aggregation: collection +[Audible, Audible, Audio] title_id - Title Id: BK_ADBL_123456a +[Audible, Audible, Audio] codec - Codec: mp332 +[Audible, Audible, Audio] HeaderSeed - Header Seed: 1234567890 +[Audible, Audible, Audio] EncryptedBlocks - Encrypted Blocks: 23421 +[Audible, Audible, Audio] HeaderKey - Header Key: 1234569717 192057361 0712658018 4878930500 +[Audible, Audible, Audio] license_list - License List: 12345678 +[Audible, Audible, Audio] CPUType - CPU Type: 1 +[Audible, Audible, Audio] license_count - License Count: 1 +[Audible, Audible, Audio] 7eb298ac1328 - Tag 7eb 298ac 1328: 64863450EA7B67906FE619AC697E60D13630E760 +[Audible, Audible, Audio] parent_short_title - Parent Short Title: Test2 (Unabridged) +[Audible, Audible, Audio] parent_title - Parent Title: This is the title of the parent (Unabridged) +[Audible, Audible, Audio] aggregation_id - Aggregation Id: BK_ADBL_123456 +[Audible, Audible, Time] pub_date_start - Publish Date Start: 08-APR-2015 +[Audible, Audible, Audio] short_description - Short Description: This is the short description +[Audible, Audible, Audio] user_alias - User Alias: LKJ4HDY872HSVJ +[Audible, Audible, Preview] _cover_art - Cover Art: (Binary data 18 bytes) diff --git a/t/BMP.t b/t/BMP.t new file mode 100644 index 0000000..0d08acc --- /dev/null +++ b/t/BMP.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/BMP.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::BMP; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'BMP'; +my $testnum = 1; + +# test 2: Extract information from BMP.bmp +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/BMP.bmp'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/BMP_2.out b/t/BMP_2.out new file mode 100644 index 0000000..e6a7687 --- /dev/null +++ b/t/BMP_2.out @@ -0,0 +1,24 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: BMP.bmp +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1142 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2005:11:14 14:47:21-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:00-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: BMP +[File, File, Other] FileTypeExtension - File Type Extension: bmp +[File, File, Other] MIMEType - MIME Type: image/bmp +[File, File, Image] 0 - BMP Version: Windows V3 +[File, File, Image] 4 - Image Width: 8 +[File, File, Image] 8 - Image Height: 8 +[File, File, Image] 12 - Planes: 1 +[File, File, Image] 14 - Bit Depth: 8 +[File, File, Image] 16 - Compression: None +[File, File, Image] 20 - Image Length: 64 +[File, File, Image] 24 - Pixels Per Meter X: 2835 +[File, File, Image] 28 - Pixels Per Meter Y: 2835 +[File, File, Image] 32 - Num Colors: 256 +[File, File, Image] 36 - Num Important Colors: 256 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/BPG.t b/t/BPG.t new file mode 100644 index 0000000..efdc2fe --- /dev/null +++ b/t/BPG.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/BPG.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::BPG; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'BPG'; +my $testnum = 1; + +# test 2: Extract information from BPG.bpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/BPG.bpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/BPG_2.out b/t/BPG_2.out new file mode 100644 index 0000000..bc4fed9 --- /dev/null +++ b/t/BPG_2.out @@ -0,0 +1,92 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[ExifTool, ExifTool, ExifTool] Warning - Warning: [minor] Ignored extra byte at start of EXIF extension +[File, System, Other] FileName - File Name: BPG.bpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1863 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2016:07:07 11:21:11-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:00-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: BPG +[File, File, Other] FileTypeExtension - File Type Extension: bpg +[File, File, Other] MIMEType - MIME Type: image/bpg +[File, File, Image] 4 - Pixel Format: 4:2:2 (chroma at 0.5, 0) +[File, File, Image] 4.1 - Alpha: No Alpha Plane +[File, File, Image] 4.2 - Bit Depth: 8 +[File, File, Image] 4.3 - Color Space: YCbCr (BT 601) +[File, File, Image] 4.4 - Flags: Extension Present +[File, File, Image] 6 - Image Width: 16 +[File, File, Image] 7 - Image Height: 16 +[File, File, Image] 8 - Image Length: 0 +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS DIGITAL REBEL +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2003:10:31 15:44:19 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/60 +[EXIF, ExifIFD, Image] 33437 - F Number: 5.6 +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:10:31 15:44:19 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:10:31 15:44:19 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/60 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 5.6 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37385 - Flash: On, Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 55.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2048 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 3072 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3442.016807 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3443.946154 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 10.22 +[XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: Y, Cb, Cr, - +[XMP, XMP-tiff, Image] YCbCrPositioning - Y Cb Cr Positioning: Centered +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Adobe Systems Inc. +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.1.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1999:06:03 00:00:00 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Apple Computer Inc. +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: none +[ICC_Profile, ICC-header, Image] 52 - Device Model: +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: Adobe Systems Inc. +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Copyright 1999 Adobe Systems Incorporated +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: Adobe RGB (1998) +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.95045 1 1.08905 +[ICC_Profile, ICC_Profile, Image] bkpt - Media Black Point: 0 0 0 +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.60974 0.31111 0.01947 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.20528 0.62567 0.06087 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.14919 0.06322 0.74457 +[Composite, Composite, Image] Exif-Aperture - Aperture: 5.6 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 16x16 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000256 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.6 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/60 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.019 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 23.3 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 55.0 mm (35 mm equivalent: 87.4 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 28.56 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 10.9 diff --git a/t/BigTIFF.t b/t/BigTIFF.t new file mode 100644 index 0000000..bcc9bb7 --- /dev/null +++ b/t/BigTIFF.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/BigTIFF.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::BigTIFF; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'BigTIFF'; +my $testnum = 1; + +# test 2: Extract information from BigTIFF.btf +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/BigTIFF.btf'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/BigTIFF_2.out b/t/BigTIFF_2.out new file mode 100644 index 0000000..2ad5a81 --- /dev/null +++ b/t/BigTIFF_2.out @@ -0,0 +1,21 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: BigTIFF.btf +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 384 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:03:16 13:49:45-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:00-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: BTF +[File, File, Other] FileTypeExtension - File Type Extension: btf +[File, File, Other] MIMEType - MIME Type: image/x-tiff-big +[EXIF, IFD0, Image] 256 - Image Width: 8 +[EXIF, IFD0, Image] 257 - Image Height: 8 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD0, Image] 262 - Photometric Interpretation: RGB +[EXIF, IFD0, Image] 273 - Strip Offsets: 192 +[EXIF, IFD0, Image] 277 - Samples Per Pixel: 3 +[EXIF, IFD0, Image] 278 - Rows Per Strip: 8 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 192 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/Canon.t b/t/Canon.t new file mode 100644 index 0000000..9445dba --- /dev/null +++ b/t/Canon.t @@ -0,0 +1,42 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Canon.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Canon; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Canon'; +my $testnum = 1; + +# test 2: Extract information from Canon1DmkIII.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Canon1DmkIII.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write CanonCustom2 information +{ + ++$testnum; + my @writeInfo = ( + [ISOSpeedRange => 'Enable; 1600; 200'], + [TimerLength => 'Enable; 6 sec: 5; 16 sec: 20; After release: 6'], + ); + my @check = qw(ISOSpeedRange TimerLength OriginalDecisionData Warning); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, + 't/images/Canon1DmkIII.jpg', \@check); + print "ok $testnum\n"; +} + + +# end diff --git a/t/CanonRaw.t b/t/CanonRaw.t new file mode 100644 index 0000000..d45b9ef --- /dev/null +++ b/t/CanonRaw.t @@ -0,0 +1,164 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/CanonRaw.t". + +BEGIN { + $| = 1; print "1..9\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::CanonRaw; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'CanonRaw'; +my $testnum = 1; + +# test 2: Extract information from CRW +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/CanonRaw.crw'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Extract JpgFromRaw from CRW +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(PrintConv => 0, IgnoreMinorErrors => 1); + my $info = $exifTool->ImageInfo('t/images/CanonRaw.crw','JpgFromRaw'); + print 'not ' unless ${$info->{JpgFromRaw}} eq '<Dummy JpgFromRaw image data>'; + print "ok $testnum\n"; +} + +# test 4: Write a whole pile of tags to a CRW +{ + ++$testnum; + if (eval { require Time::Local }) { + my $exifTool = new Image::ExifTool; + # set IgnoreMinorErrors option to allow invalid JpgFromRaw to be written + $exifTool->Options(IgnoreMinorErrors => 1); + $exifTool->SetNewValuesFromFile('t/images/Canon.jpg'); + $exifTool->SetNewValue(SerialNumber => 1234); + $exifTool->SetNewValue(OwnerName => 'Phil Harvey'); + $exifTool->SetNewValue(JpgFromRaw => 'not a real image'); + $exifTool->SetNewValue(ROMOperationMode => 'CDN'); + $exifTool->SetNewValue(FocalPlaneXSize => '35 mm'); + $exifTool->SetNewValue(FocalPlaneYSize => '24 mm'); + my $testfile = "t/${testname}_${testnum}_failed.crw"; + unlink $testfile; + $exifTool->WriteInfo('t/images/CanonRaw.crw', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + } else { + print "ok $testnum # skip Requires Time::Local\n"; + } +} + +# test 5: Test verbose output +{ + ++$testnum; + print 'not ' unless testVerbose($testname, $testnum, 't/images/CanonRaw.crw', 1); + print "ok $testnum\n"; +} + +# test 6: Write to CR2 file +{ + ++$testnum; + if (eval { require Time::Local }) { + my $exifTool = new Image::ExifTool; + # set IgnoreMinorErrors option to allow invalid JpgFromRaw to be written + $exifTool->SetNewValue(Keywords => 'CR2 test'); + $exifTool->SetNewValue(OwnerName => 'Phil Harvey'); + $exifTool->SetNewValue(FocalPlaneXSize => '35mm'); + my $testfile = "t/${testname}_${testnum}_failed.cr2"; + unlink $testfile; + $exifTool->WriteInfo('t/images/CanonRaw.cr2', $testfile); + my $info = $exifTool->ImageInfo($testfile); + my $success = check($exifTool, $info, $testname, $testnum); + # make sure file suffix was copied properly + while ($success) { + open(TESTFILE, $testfile) or last; + binmode(TESTFILE); + my $endStr = '<Dummy preview image data>Non-TIFF data test'; + my $len = length $endStr; + seek(TESTFILE, -$len, 2) or last; + my $buff; + read(TESTFILE, $buff, $len) == $len or last; + close(TESTFILE); + if ($buff eq $endStr) { + unlink $testfile; + $success = 2; + } else { + warn "\n Test $testnum failed to copy file suffix:\n"; + warn " Test gave: '$buff'\n"; + warn " Should be: '$endStr'\n"; + $success = 0; + } + last; + } + warn "\n Test $testnum: Error reading file suffix\n" if $success == 1; + print 'not ' unless $success == 2; + print "ok $testnum\n"; + } else { + print "ok $testnum # skip Requires Time::Local\n"; + } +} + +# test 7: Test copying all information from a CR2 image to a JPEG +{ + ++$testnum; + if (eval { require Time::Local }) { + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/CanonRaw.cr2'); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->WriteInfo('t/images/Writer.jpg', $testfile); + $exifTool->Options(Unknown => 1); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + } else { + print "ok $testnum # skip Requires Time::Local\n"; + } +} + +# test 8: Extract information from a CR3 image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/CanonRaw.cr3'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 9: Write to CR3 file +{ + ++$testnum; + if (eval { require Time::Local }) { + my @writeInfo = ( + [Subject => 'CR3 test'], + [ExposureCompensation => -1.3], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/CanonRaw.cr3'); + print "ok $testnum\n"; + } else { + print "ok $testnum # skip Requires Time::Local\n"; + } +} + + +# end diff --git a/t/CanonRaw_2.out b/t/CanonRaw_2.out new file mode 100644 index 0000000..ff4d719 --- /dev/null +++ b/t/CanonRaw_2.out @@ -0,0 +1,169 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: CanonRaw.crw +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 6.8 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2012:01:22 13:31:59-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:31-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: CRW +[File, File, Other] FileTypeExtension - File Type Extension: crw +[File, File, Other] MIMEType - MIME Type: image/x-canon-crw +[MakerNotes, CanonRaw, Camera] 8197 - Raw Data: (Binary data 22 bytes) +[MakerNotes, CanonRaw, Preview] 8199 - Jpg From Raw: (Binary data 29 bytes) +[MakerNotes, CanonRaw, Image] 0 - File Format: CRW +[MakerNotes, CanonRaw, Image] 1 - Target Compression Ratio: 10 +[MakerNotes, CanonRaw, Image] 0 - Image Width: 3072 +[MakerNotes, CanonRaw, Image] 1 - Image Height: 2048 +[MakerNotes, CanonRaw, Image] 2 - Pixel Aspect Ratio: 1 +[MakerNotes, CanonRaw, Image] 3 - Rotation: 0 +[MakerNotes, CanonRaw, Image] 4 - Component Bit Depth: 8 +[MakerNotes, CanonRaw, Image] 5 - Color Bit Depth: 24 +[MakerNotes, CanonRaw, Image] 6 - Color BW: 257 +[MakerNotes, CanonRaw, Camera] 4106 - Target Image Type: Real-world Subject +[MakerNotes, CanonRaw, Camera] 6148 - Record ID: 0 +[MakerNotes, CanonRaw, Image] 6167 - File Number: 116-1602 +[MakerNotes, CanonRaw, Time] 0 - Date/Time Original: 2003:11:10 17:39:26 +[MakerNotes, CanonRaw, Time] 1 - Time Zone Code: 0 +[MakerNotes, CanonRaw, Time] 2 - Time Zone Info: 0 +[MakerNotes, CanonRaw, Camera] 2070 - Original File Name: CRW_1602.CRW +[MakerNotes, CanonRaw, Camera] 2071 - Thumbnail File Name: CRW_1602.THM +[MakerNotes, CanonRaw, Camera] 2053 - User Comment: +[MakerNotes, CanonRaw, Camera] 6164 - Measured EV: 4.625 +[MakerNotes, CanonRaw, Camera] 2053 - Canon File Description: EOS DIGITAL REBEL CMOS RAW +[MakerNotes, CanonRaw, Camera] 2069 - Canon Image Type: CRW:EOS DIGITAL REBEL CMOS RAW +[MakerNotes, CanonRaw, Camera] 2064 - Owner Name: Phil Harvey +[MakerNotes, CanonRaw, Camera] 0 - Make: Canon +[MakerNotes, CanonRaw, Camera] 6 - Camera Model Name: Canon EOS DIGITAL REBEL +[MakerNotes, CanonRaw, Camera] 6155 - Serial Number: 0560018150 +[MakerNotes, CanonRaw, Camera] 4124 - Base ISO: 100 +[MakerNotes, CanonRaw, Camera] 2061 - ROM Operation Mode: USA +[MakerNotes, CanonRaw, Camera] 2059 - Canon Firmware Version: Firmware Version 1.1.1 +[MakerNotes, Canon, Image] 1 - Focal Length: 24 mm +[MakerNotes, Canon, Image] 2 - Focal Plane X Size: 23.22 mm +[MakerNotes, Canon, Image] 3 - Focal Plane Y Size: 15.49 mm +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 100 +[MakerNotes, Canon, Image] 3 - Measured EV: 0.00 +[MakerNotes, Canon, Image] 4 - Target Aperture: 3.6 +[MakerNotes, Canon, Image] 5 - Target Exposure Time: 1/60 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: +2/3 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 19 - Focus Distance Upper: 1.42 m +[MakerNotes, Canon, Image] 20 - Focus Distance Lower: 1.19 m +[MakerNotes, Canon, Image] 21 - F Number: 3.6 +[MakerNotes, Canon, Image] 22 - Exposure Time: 1/64 +[MakerNotes, Canon, Image] 23 - Measured EV 2: -0.125 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 0 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS Mid-range +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 29 - Self Timer 2: 0 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Camera] 1 - Macro Mode: Unknown (0) +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: On +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Continuous +[MakerNotes, Canon, Camera] 7 - Focus Mode: AI Focus AF +[MakerNotes, Canon, Camera] 9 - Record Mode: CRW+THM +[MakerNotes, Canon, Camera] 10 - Canon Image Size: Large +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: Unknown (-1) +[MakerNotes, Canon, Camera] 13 - Contrast: +1 +[MakerNotes, Canon, Camera] 14 - Saturation: +1 +[MakerNotes, Canon, Camera] 15 - Sharpness: +1 +[MakerNotes, Canon, Camera] 16 - Camera ISO: n/a +[MakerNotes, Canon, Camera] 17 - Metering Mode: Evaluative +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 19 - AF Point: Manual AF point selection +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Program AE +[MakerNotes, Canon, Camera] 22 - Lens Type: n/a +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 55 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 18 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 3.6 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 22 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: E-TTL, Built-in +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 3072 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 3072 +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, CanonRaw, Camera] 6196 - Canon Model ID: EOS Digital Rebel / 300D / Kiss Digital +[MakerNotes, Canon, Image] 1 - Sensor Width: 3152 +[MakerNotes, Canon, Image] 2 - Sensor Height: 2068 +[MakerNotes, Canon, Image] 5 - Sensor Left Border: 72 +[MakerNotes, Canon, Image] 6 - Sensor Top Border: 16 +[MakerNotes, Canon, Image] 7 - Sensor Right Border: 3143 +[MakerNotes, Canon, Image] 8 - Sensor Bottom Border: 2063 +[MakerNotes, Canon, Image] 9 - Black Mask Left Border: 24 +[MakerNotes, Canon, Image] 10 - Black Mask Top Border: 224 +[MakerNotes, Canon, Image] 11 - Black Mask Right Border: 40 +[MakerNotes, Canon, Image] 12 - Black Mask Bottom Border: 1856 +[MakerNotes, CanonRaw, Camera] 0 - Decoder Table Number: 1 +[MakerNotes, CanonRaw, Camera] 2 - Compressed Data Offset: 514 +[MakerNotes, CanonRaw, Camera] 3 - Compressed Data Length: 4120111 +[MakerNotes, Canon, Camera] 0 - Num AF Points: 7 +[MakerNotes, Canon, Camera] 1 - Valid AF Points: 7 +[MakerNotes, Canon, Image] 2 - Canon Image Width: 3072 +[MakerNotes, Canon, Image] 3 - Canon Image Height: 2048 +[MakerNotes, Canon, Camera] 4 - AF Image Width: 3072 +[MakerNotes, Canon, Camera] 5 - AF Image Height: 2048 +[MakerNotes, Canon, Camera] 6 - AF Area Width: 151 +[MakerNotes, Canon, Camera] 7 - AF Area Height: 151 +[MakerNotes, Canon, Camera] 8 - AF Area X Positions: 1014 608 0 0 0 -608 -1014 +[MakerNotes, Canon, Camera] 9 - AF Area Y Positions: 0 0 -506 0 506 0 0 +[MakerNotes, Canon, Camera] 10 - AF Points In Focus: 3 +[MakerNotes, CanonRaw, Camera] 4270 - Color Temperature: 5200 +[MakerNotes, Canon, Camera] 1 - WB RGGB Levels Auto: 1740 832 831 931 +[MakerNotes, Canon, Camera] 5 - WB RGGB Levels Daylight: 1722 832 831 989 +[MakerNotes, Canon, Camera] 9 - WB RGGB Levels Shade: 2035 832 831 839 +[MakerNotes, Canon, Camera] 13 - WB RGGB Levels Cloudy: 1878 832 831 903 +[MakerNotes, Canon, Camera] 17 - WB RGGB Levels Tungsten: 1228 913 912 1668 +[MakerNotes, Canon, Camera] 21 - WB RGGB Levels Fluorescent: 1506 842 841 1381 +[MakerNotes, Canon, Camera] 25 - WB RGGB Levels Flash: 1964 832 831 877 +[MakerNotes, Canon, Camera] 29 - WB RGGB Levels Custom: 1722 832 831 989 +[MakerNotes, Canon, Camera] 33 - WB RGGB Levels Kelvin: 1722 832 831 988 +[MakerNotes, Canon, Camera] 37 - WB RGGB Black Levels: 125 124 125 124 +[MakerNotes, CanonRaw, Camera] 4276 - Color Space: sRGB +[MakerNotes, CanonRaw, Image] 1 - Raw Jpg Quality: Fine +[MakerNotes, CanonRaw, Image] 2 - Raw Jpg Size: Medium +[MakerNotes, CanonRaw, Image] 3 - Raw Jpg Width: 2048 +[MakerNotes, CanonRaw, Image] 4 - Raw Jpg Height: 1360 +[MakerNotes, CanonRaw, Camera] 6203 - Serial Number Format: Format 1 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 8.31 +[XMP, XMP-dc, Image] description - Description: CRW with embedded XMP +[Composite, Composite, Camera] Canon-ConditionalFEC - Flash Exposure Compensation: +2/3 +[Composite, Composite, Camera] Canon-DriveMode - Drive Mode: Continuous Shooting +[Composite, Composite, Camera] Canon-FlashType - Flash Type: Built-In Flash +[Composite, Composite, Camera] Canon-ISO - ISO: 100 +[Composite, Composite, Camera] Canon-Lens - Lens: 18.0 - 55.0 mm +[Composite, Composite, Camera] Canon-RedEyeReduction - Red Eye Reduction: Off +[Composite, Composite, Camera] Canon-ShootingMode - Shooting Mode: Program AE +[Composite, Composite, Camera] Canon-ShutterCurtainHack - Shutter Curtain Sync: 1st-curtain sync +[Composite, Composite, Camera] Canon-WB_RGGBLevels - WB RGGB Levels: 1740 832 831 931 +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.6 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.119663 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 3072x2048 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Unknown 18-55mm +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 6.3 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 2.092604 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.6 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/64 +[Composite, Composite, Camera] Canon-Lens35efl - Lens: 18.0 - 55.0 mm (35 mm equivalent: 27.9 - 85.3 mm) +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.019 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: 0.41 m (1.13 - 1.54 m) +[Composite, Composite, Image] Exif-FOV - Field Of View: 51.6 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 24.0 mm (35 mm equivalent: 37.2 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 8.34 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.7 diff --git a/t/CanonRaw_4.out b/t/CanonRaw_4.out new file mode 100644 index 0000000..b004292 --- /dev/null +++ b/t/CanonRaw_4.out @@ -0,0 +1,221 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: CanonRaw_4_failed.crw +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 13 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:31-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:31-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:31-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: CRW +[File, File, Other] FileTypeExtension - File Type Extension: crw +[File, File, Other] MIMEType - MIME Type: image/x-canon-crw +[MakerNotes, CanonRaw, Camera] 8197 - Raw Data: (Binary data 22 bytes) +[MakerNotes, CanonRaw, Preview] 8199 - Jpg From Raw: (Binary data 16 bytes) +[MakerNotes, CanonRaw, Image] 0 - File Format: CRW +[MakerNotes, CanonRaw, Image] 1 - Target Compression Ratio: 10 +[MakerNotes, CanonRaw, Image] 0 - Image Width: 3072 +[MakerNotes, CanonRaw, Image] 1 - Image Height: 2048 +[MakerNotes, CanonRaw, Image] 2 - Pixel Aspect Ratio: 1 +[MakerNotes, CanonRaw, Image] 3 - Rotation: 0 +[MakerNotes, CanonRaw, Image] 4 - Component Bit Depth: 8 +[MakerNotes, CanonRaw, Image] 5 - Color Bit Depth: 24 +[MakerNotes, CanonRaw, Image] 6 - Color BW: 257 +[MakerNotes, CanonRaw, Camera] 4106 - Target Image Type: Real-world Subject +[MakerNotes, CanonRaw, Camera] 6148 - Record ID: 0 +[MakerNotes, CanonRaw, Image] 6167 - File Number: 118-1861 +[MakerNotes, CanonRaw, Time] 0 - Date/Time Original: 2003:12:04 06:46:52 +[MakerNotes, CanonRaw, Time] 1 - Time Zone Code: 0 +[MakerNotes, CanonRaw, Time] 2 - Time Zone Info: 0 +[MakerNotes, CanonRaw, Camera] 2070 - Original File Name: CRW_1602.CRW +[MakerNotes, CanonRaw, Camera] 2071 - Thumbnail File Name: CRW_1602.THM +[MakerNotes, CanonRaw, Camera] 2053 - User Comment: +[MakerNotes, CanonRaw, Camera] 6164 - Measured EV: -1.25 +[MakerNotes, CanonRaw, Camera] 2053 - Canon File Description: EOS DIGITAL REBEL CMOS RAW +[MakerNotes, CanonRaw, Camera] 2069 - Canon Image Type: CRW:EOS DIGITAL REBEL CMOS RAW +[MakerNotes, CanonRaw, Camera] 2064 - Owner Name: Phil Harvey +[MakerNotes, CanonRaw, Camera] 0 - Make: Canon +[MakerNotes, CanonRaw, Camera] 6 - Camera Model Name: Canon EOS DIGITAL REBEL +[MakerNotes, CanonRaw, Camera] 6155 - Serial Number: 0000001234 +[MakerNotes, CanonRaw, Camera] 4124 - Base ISO: 100 +[MakerNotes, CanonRaw, Camera] 2061 - ROM Operation Mode: CDN +[MakerNotes, CanonRaw, Camera] 2059 - Canon Firmware Version: Firmware Version 1.1.1 +[MakerNotes, Canon, Image] 1 - Focal Length: 34 mm +[MakerNotes, Canon, Image] 2 - Focal Plane X Size: 35.00 mm +[MakerNotes, Canon, Image] 3 - Focal Plane Y Size: 24.00 mm +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 100 +[MakerNotes, Canon, Image] 3 - Measured EV: -1.25 +[MakerNotes, Canon, Image] 4 - Target Aperture: 14 +[MakerNotes, Canon, Image] 5 - Target Exposure Time: 1/60 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 19 - Focus Distance Upper: inf +[MakerNotes, Canon, Image] 20 - Focus Distance Lower: 5.46 m +[MakerNotes, Canon, Image] 21 - F Number: 14 +[MakerNotes, Canon, Image] 22 - Exposure Time: 4 +[MakerNotes, Canon, Image] 23 - Measured EV 2: -1.25 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 4 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS Mid-range +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 29 - Self Timer 2: 0 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Camera] 1 - Macro Mode: Unknown (0) +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Continuous +[MakerNotes, Canon, Camera] 7 - Focus Mode: Manual Focus (3) +[MakerNotes, Canon, Camera] 9 - Record Mode: CRW+THM +[MakerNotes, Canon, Camera] 10 - Canon Image Size: Large +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: Unknown (-1) +[MakerNotes, Canon, Camera] 13 - Contrast: +1 +[MakerNotes, Canon, Camera] 14 - Saturation: +1 +[MakerNotes, Canon, Camera] 15 - Sharpness: +1 +[MakerNotes, Canon, Camera] 16 - Camera ISO: n/a +[MakerNotes, Canon, Camera] 17 - Metering Mode: Center-weighted average +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 19 - AF Point: Manual AF point selection +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Manual +[MakerNotes, Canon, Camera] 22 - Lens Type: n/a +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 55 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 18 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 4 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 27 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: (none) +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 3072 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 3072 +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, CanonRaw, Camera] 6196 - Canon Model ID: EOS Digital Rebel / 300D / Kiss Digital +[MakerNotes, Canon, Image] 1 - Sensor Width: 3152 +[MakerNotes, Canon, Image] 2 - Sensor Height: 2068 +[MakerNotes, Canon, Image] 5 - Sensor Left Border: 72 +[MakerNotes, Canon, Image] 6 - Sensor Top Border: 16 +[MakerNotes, Canon, Image] 7 - Sensor Right Border: 3143 +[MakerNotes, Canon, Image] 8 - Sensor Bottom Border: 2063 +[MakerNotes, Canon, Image] 9 - Black Mask Left Border: 24 +[MakerNotes, Canon, Image] 10 - Black Mask Top Border: 224 +[MakerNotes, Canon, Image] 11 - Black Mask Right Border: 40 +[MakerNotes, Canon, Image] 12 - Black Mask Bottom Border: 1856 +[MakerNotes, CanonRaw, Camera] 0 - Decoder Table Number: 1 +[MakerNotes, CanonRaw, Camera] 2 - Compressed Data Offset: 514 +[MakerNotes, CanonRaw, Camera] 3 - Compressed Data Length: 4120111 +[MakerNotes, Canon, Camera] 0 - Num AF Points: 7 +[MakerNotes, Canon, Camera] 1 - Valid AF Points: 7 +[MakerNotes, Canon, Image] 2 - Canon Image Width: 3072 +[MakerNotes, Canon, Image] 3 - Canon Image Height: 2048 +[MakerNotes, Canon, Camera] 4 - AF Image Width: 3072 +[MakerNotes, Canon, Camera] 5 - AF Image Height: 2048 +[MakerNotes, Canon, Camera] 6 - AF Area Width: 151 +[MakerNotes, Canon, Camera] 7 - AF Area Height: 151 +[MakerNotes, Canon, Camera] 8 - AF Area X Positions: 1014 608 0 0 0 -608 -1014 +[MakerNotes, Canon, Camera] 9 - AF Area Y Positions: 0 0 -506 0 506 0 0 +[MakerNotes, Canon, Camera] 10 - AF Points In Focus: 3 +[MakerNotes, CanonRaw, Camera] 4270 - Color Temperature: 5200 +[MakerNotes, Canon, Camera] 1 - WB RGGB Levels Auto: 1719 832 831 990 +[MakerNotes, Canon, Camera] 5 - WB RGGB Levels Daylight: 1722 832 831 989 +[MakerNotes, Canon, Camera] 9 - WB RGGB Levels Shade: 2035 832 831 839 +[MakerNotes, Canon, Camera] 13 - WB RGGB Levels Cloudy: 1878 832 831 903 +[MakerNotes, Canon, Camera] 17 - WB RGGB Levels Tungsten: 1228 913 912 1668 +[MakerNotes, Canon, Camera] 21 - WB RGGB Levels Fluorescent: 1506 842 841 1381 +[MakerNotes, Canon, Camera] 25 - WB RGGB Levels Flash: 1933 832 831 895 +[MakerNotes, Canon, Camera] 29 - WB RGGB Levels Custom: 1722 832 831 989 +[MakerNotes, Canon, Camera] 33 - WB RGGB Levels Kelvin: 1722 832 831 988 +[MakerNotes, Canon, Camera] 37 - WB RGGB Black Levels: 124 123 124 123 +[MakerNotes, CanonRaw, Camera] 4276 - Color Space: sRGB +[MakerNotes, CanonRaw, Image] 1 - Raw Jpg Quality: Fine +[MakerNotes, CanonRaw, Image] 2 - Raw Jpg Size: Medium +[MakerNotes, CanonRaw, Image] 3 - Raw Jpg Width: 2048 +[MakerNotes, CanonRaw, Image] 4 - Raw Jpg Height: 1360 +[MakerNotes, CanonRaw, Camera] 6203 - Serial Number Format: Format 1 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-aux, Camera] Lens - Lens: 18.0 - 55.0 mm +[XMP, XMP-crs, Image] Temperature - Color Temperature: 5200 +[XMP, XMP-dc, Image] description - Description: CRW with embedded XMP +[XMP, XMP-exif, Image] ApertureValue - Aperture Value: 14.0 +[XMP, XMP-exif, Image] ColorSpace - Color Space: sRGB +[XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: Y, Cb, Cr, - +[XMP, XMP-exif, Image] CompressedBitsPerPixel - Compressed Bits Per Pixel: 9 +[XMP, XMP-exif, Camera] Contrast - Contrast: High +[XMP, XMP-exif, Image] CustomRendered - Custom Rendered: Normal +[XMP, XMP-exif, Time] DateTimeOriginal - Date/Time Original: 2003:12:04 06:46:52 +[XMP, XMP-exif, Image] ExifVersion - Exif Version: 0221 +[XMP, XMP-exif, Image] ExposureBiasValue - Exposure Compensation: 0 +[XMP, XMP-exif, Camera] ExposureMode - Exposure Mode: Manual +[XMP, XMP-exif, Image] ExposureTime - Exposure Time: 4 +[XMP, XMP-exif, Image] FNumber - F Number: 14.0 +[XMP, XMP-exif, Image] FileSource - File Source: Digital Camera +[XMP, XMP-exif, Camera] FlashFired - Flash Fired: False +[XMP, XMP-exif, Camera] FlashFunction - Flash Function: False +[XMP, XMP-exif, Camera] FlashMode - Flash Mode: Unknown +[XMP, XMP-exif, Camera] FlashRedEyeMode - Flash Red Eye Mode: False +[XMP, XMP-exif, Camera] FlashReturn - Flash Return: No return detection +[XMP, XMP-exif, Image] FlashpixVersion - Flashpix Version: 0100 +[XMP, XMP-exif, Camera] FocalLength - Focal Length: 34.0 mm +[XMP, XMP-exif, Camera] FocalPlaneResolutionUnit - Focal Plane Resolution Unit: inches +[XMP, XMP-exif, Camera] FocalPlaneXResolution - Focal Plane X Resolution: 3443.94615384615 +[XMP, XMP-exif, Camera] FocalPlaneYResolution - Focal Plane Y Resolution: 3442.01680672269 +[XMP, XMP-exif, Image] ISOSpeedRatings - ISO: 100 +[XMP, XMP-exif, Camera] MaxApertureValue - Max Aperture Value: 4.5 +[XMP, XMP-exif, Camera] MeteringMode - Metering Mode: Center-weighted average +[XMP, XMP-exif, Image] PixelXDimension - Exif Image Width: 160 +[XMP, XMP-exif, Image] PixelYDimension - Exif Image Height: 120 +[XMP, XMP-exif, Camera] Saturation - Saturation: High +[XMP, XMP-exif, Camera] SceneCaptureType - Scene Capture Type: Standard +[XMP, XMP-exif, Camera] SensingMethod - Sensing Method: One-chip color area +[XMP, XMP-exif, Camera] Sharpness - Sharpness: Hard +[XMP, XMP-exif, Image] ShutterSpeedValue - Shutter Speed Value: 1 +[XMP, XMP-exif, Image] UserComment - User Comment: +[XMP, XMP-exif, Camera] WhiteBalance - White Balance: Auto +[XMP, XMP-exifEX, Camera] BodySerialNumber - Serial Number: 1234 +[XMP, XMP-exifEX, Image] CameraOwnerName - Owner Name: Phil Harvey +[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: THM - DCF thumbnail file +[XMP, XMP-pmi, Image] sequenceNumber - Sequence Number: 0 +[XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8 +[XMP, XMP-tiff, Image] ImageLength - Image Height: 8 +[XMP, XMP-tiff, Image] ImageWidth - Image Width: 8 +[XMP, XMP-tiff, Camera] Make - Make: Canon +[XMP, XMP-tiff, Camera] Model - Camera Model Name: Canon EOS DIGITAL REBEL +[XMP, XMP-tiff, Image] Orientation - Orientation: Horizontal (normal) +[XMP, XMP-tiff, Image] ResolutionUnit - Resolution Unit: inches +[XMP, XMP-tiff, Image] XResolution - X Resolution: 180 +[XMP, XMP-tiff, Image] YCbCrPositioning - Y Cb Cr Positioning: Centered +[XMP, XMP-tiff, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[XMP, XMP-tiff, Image] YResolution - Y Resolution: 180 +[XMP, XMP-xmp, Time] CreateDate - Create Date: 2003:12:04 06:46:52 +[XMP, XMP-xmp, Time] ModifyDate - Modify Date: 2003:12:04 06:46:52 +[Composite, Composite, Camera] Canon-DriveMode - Drive Mode: Continuous Shooting +[Composite, Composite, Camera] Canon-ISO - ISO: 100 +[Composite, Composite, Camera] Canon-Lens - Lens: 18.0 - 55.0 mm +[Composite, Composite, Camera] Canon-ShootingMode - Shooting Mode: Bulb +[Composite, Composite, Camera] Canon-WB_RGGBLevels - WB RGGB Levels: 1719 832 831 990 +[Composite, Composite, Image] Exif-Aperture - Aperture: 14.3 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 4 +[Composite, Composite, Camera] XMP-Flash - Flash: No Flash +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.190619 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 3072x2048 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Unknown 18-55mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 5.7 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 6.3 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 2.067348 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.0 +[Composite, Composite, Camera] Canon-Lens35efl - Lens: 18.0 - 55.0 mm (35 mm equivalent: 18.4 - 56.1 mm) +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.029 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: inf (2.73 m - inf) +[Composite, Composite, Image] Exif-FOV - Field Of View: 54.9 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 34.0 mm (35 mm equivalent: 34.7 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 2.75 m diff --git a/t/CanonRaw_5.out b/t/CanonRaw_5.out new file mode 100644 index 0000000..49a3673 --- /dev/null +++ b/t/CanonRaw_5.out @@ -0,0 +1,209 @@ + ExifToolVersion = 10.12 + FileName = CanonRaw.crw + Directory = t/images + FileSize = 6816 + FileModifyDate = 1327257119 + FileAccessDate = 1457094142 + FileInodeChangeDate = 1455728654 + FilePermissions = 33188 + FileType = CRW + FileTypeExtension = CRW + MIMEType = image/x-canon-crw + + [CIFF directory with 3 entries] + | 0) RawData = <Dummy raw image data> + | 1) JpgFromRaw = <Dummy JpgFromRaw image data> + | 2) ImageProps (SubDirectory) --> + | + [CIFF directory with 13 entries] + | | 0) ImageFormat (SubDirectory) --> + | | + [BinaryData directory, 8 bytes] + | | | FileFormat = 131073 + | | | TargetCompressionRatio = 10 + | | 1) ImageInfo (SubDirectory) --> + | | + [BinaryData directory, 28 bytes] + | | | ImageWidth = 3072 + | | | ImageHeight = 2048 + | | | PixelAspectRatio = 1 + | | | Rotation = 0 + | | | ComponentBitDepth = 8 + | | | ColorBitDepth = 24 + | | | ColorBW = 257 + | | 2) TargetImageType = 0 + | | 3) RecordID = 0 + | | 4) FileNumber = 1161602 + | | 5) TimeStamp (SubDirectory) --> + | | + [BinaryData directory, 12 bytes] + | | | DateTimeOriginal = 1068485966 + | | | TimeZoneCode = 0 + | | | TimeZoneInfo = 0 + | | 6) OriginalFileName = CRW_1602.CRW + | | 7) ThumbnailFileName = CRW_1602.THM + | | 8) UserComment = + | | 9) MeasuredInfo (SubDirectory) --> + | | + [CIFF directory with 1 entries] + | | | 0) MeasuredEV = -0.375 + | | 10) ImageDescription (SubDirectory) --> + | | + [CIFF directory with 2 entries] + | | | 0) CanonFileDescription = EOS DIGITAL REBEL CMOS RAW + | | | 1) CanonImageType = CRW:EOS DIGITAL REBEL CMOS RAW + | | 11) CameraObject (SubDirectory) --> + | | + [CIFF directory with 3 entries] + | | | 0) OwnerName = Phil Harvey + | | | 1) CanonRawMakeModel (SubDirectory) --> + | | | + [BinaryData directory, 32 bytes] + | | | | Make = Canon + | | | | Model = Canon EOS DIGITAL REBEL + | | | 2) CameraSpecification (SubDirectory) --> + | | | + [CIFF directory with 4 entries] + | | | | 0) SerialNumber = 560018150 + | | | | 1) BaseISO = 100 + | | | | 2) ROMOperationMode = USA + | | | | 3) CanonFirmwareVersion = Firmware Version 1.1.1 + | | 12) ExifInformation (SubDirectory) --> + | | + [CIFF directory with 23 entries] + | | | 0) CanonFlashInfo = 0 100 0 0 + | | | 1) CanonFocalLength (SubDirectory) --> + | | | + [BinaryData directory, 8 bytes] + | | | | FocalType = 0 + | | | | FocalLength = 24 + | | | | FocalPlaneXSize = 914 + | | | | FocalPlaneYSize = 610 + | | | 2) CanonShotInfo (SubDirectory) --> + | | | + [BinaryData directory, 66 bytes] + | | | | AutoISO = 0 + | | | | BaseISO = 160 + | | | | MeasuredEV = -160 + | | | | TargetAperture = 116 + | | | | TargetExposureTime = 189 + | | | | ExposureCompensation = 0 + | | | | WhiteBalance = 0 + | | | | SlowShutter = 3 + | | | | SequenceNumber = 0 + | | | | OpticalZoomCode = 8 + | | | | CameraTemperature = 0 + | | | | FlashGuideNumber = -1 + | | | | AFPointsInFocus = 0 + | | | | FlashExposureComp = 20 + | | | | AutoExposureBracketing = 0 + | | | | AEBBracketValue = 0 + | | | | ControlMode = 1 + | | | | FocusDistanceUpper = 142 + | | | | FocusDistanceLower = 119 + | | | | FNumber = 116 + | | | | ExposureTime = 192 + | | | | MeasuredEV2 = 47 + | | | | BulbDuration = 0 + | | | | CameraType = 252 + | | | | AutoRotate = 0 + | | | | NDFilter = -1 + | | | | SelfTimer2 = 0 + | | | 3) CanonFileInfo (SubDirectory) --> + | | | + [BinaryData directory, 18 bytes] + | | | | BracketMode = 0 + | | | | BracketValue = 0 + | | | | BracketShotNumber = 0 + | | | | RawJpgQuality = -1 + | | | | RawJpgSize = -1 + | | | | LongExposureNoiseReduction2 = -1 + | | | 4) CanonCameraSettings (SubDirectory) --> + | | | + [BinaryData directory, 92 bytes] + | | | | MacroMode = 0 + | | | | SelfTimer = 0 + | | | | Quality = 4 + | | | | CanonFlashMode = 2 + | | | | ContinuousDrive = 1 + | | | | FocusMode = 2 + | | | | RecordMode = 2 + | | | | CanonImageSize = 0 + | | | | EasyMode = 1 + | | | | DigitalZoom = -1 + | | | | Contrast = 1 + | | | | Saturation = 1 + | | | | Sharpness = 1 + | | | | CameraISO = 0 + | | | | MeteringMode = 3 + | | | | FocusRange = 2 + | | | | AFPoint = 8197 + | | | | CanonExposureMode = 1 + | | | | LensType = 65535 + | | | | MaxFocalLength = 55 + | | | | MinFocalLength = 18 + | | | | FocalUnits = 1 + | | | | MaxAperture = 116 + | | | | MinAperture = 285 + | | | | FlashActivity = 0 + | | | | FlashBits = 8200 + | | | | FocusContinuous = -1 + | | | | AESetting = -1 + | | | | ImageStabilization = -1 + | | | | DisplayAperture = 0 + | | | | ZoomSourceWidth = 3072 + | | | | ZoomTargetWidth = 3072 + | | | | SpotMeteringMode = -1 + | | | | PhotoEffect = -1 + | | | | ManualFlashOutput = 0 + | | | | ColorTone = 0 + | | | 5) CanonRaw_0x0036 = ...........................1..:..........1..:.........1..[snip] + | | | 6) CanonModelID = 2147484016 + | | | 7) SensorInfo (SubDirectory) --> + | | | + [BinaryData directory, 34 bytes] + | | | | SensorWidth = 3152 + | | | | SensorHeight = 2068 + | | | | SensorLeftBorder = 72 + | | | | SensorTopBorder = 16 + | | | | SensorRightBorder = 3143 + | | | | SensorBottomBorder = 2063 + | | | | BlackMaskLeftBorder = 24 + | | | | BlackMaskTopBorder = 224 + | | | | BlackMaskRightBorder = 40 + | | | | BlackMaskBottomBorder = 1856 + | | | 8) DecoderTable (SubDirectory) --> + | | | + [BinaryData directory, 16 bytes] + | | | | DecoderTableNumber = 1 + | | | | CompressedDataOffset = 514 + | | | | CompressedDataLength = 4120111 + | | | 9) CanonAFInfo (SubDirectory) --> + | | | + [SerialData directory, 48 bytes] + | | | | 0) NumAFPoints = 7 + | | | | 1) ValidAFPoints = 7 + | | | | 2) CanonImageWidth = 3072 + | | | | 3) CanonImageHeight = 2048 + | | | | 4) AFImageWidth = 3072 + | | | | 5) AFImageHeight = 2048 + | | | | 6) AFAreaWidth = 151 + | | | | 7) AFAreaHeight = 151 + | | | | 8) AFAreaXPositions = 1014 608 0 0 0 -608 -1014 + | | | | 9) AFAreaYPositions = 0 0 -506 0 506 0 0 + | | | | 10) AFPointsInFocus = 8 + | | | 10) CanonRaw_0x10c0 = 26 331 372 372 177 240 428 429 277 186 510 511 442 + | | | 11) CanonRaw_0x10c1 = 26 299 375 375 170 202 394 395 240 153 453 454 375 + | | | 12) CanonRaw_0x10c2 = t......a.................c...............c.X.............[snip] + | | | 13) CanonRaw_0x10aa = 10 554 1022 1026 754 + | | | 14) CanonRaw_0x10a8 = 20 5528 5190 7000 5987 3214 3897 6457 5190 5200 + | | | 15) CanonRaw_0x10ad = 62 20127 8480 7000 6000 5600 5200 4724 4200 3266 1446 648[snip] + | | | 16) ColorTemperature = 5200 + | | | 17) CanonRaw_0x10af = 1024 + | | | 18) ColorBalance (SubDirectory) --> + | | | + [BinaryData directory, 82 bytes] + | | | | WB_RGGBLevelsAuto = 1740 832 831 931 + | | | | WB_RGGBLevelsDaylight = 1722 832 831 989 + | | | | WB_RGGBLevelsShade = 2035 832 831 839 + | | | | WB_RGGBLevelsCloudy = 1878 832 831 903 + | | | | WB_RGGBLevelsTungsten = 1228 913 912 1668 + | | | | WB_RGGBLevelsFluorescent = 1506 842 841 1381 + | | | | WB_RGGBLevelsFlash = 1964 832 831 877 + | | | | WB_RGGBLevelsCustom = 1722 832 831 989 + | | | | WB_RGGBLevelsKelvin = 1722 832 831 988 + | | | | WB_RGGBBlackLevels = 125 124 125 124 + | | | 19) ColorSpace = 1 + | | | 20) RawJpgInfo (SubDirectory) --> + | | | + [BinaryData directory, 10 bytes] + | | | | RawJpgQuality = 3 + | | | | RawJpgSize = 1 + | | | | RawJpgWidth = 2048 + | | | | RawJpgHeight = 1360 + | | | 21) CanonRaw_0x1039 = 0 159 7 112 + | | | 22) SerialNumberFormat = 2415919104 +CanonVRD trailer (560 bytes at offset 0x1870): + + [XMP directory, 460 bytes] + | XMPToolkit = Image::ExifTool 8.31 + | Description = CRW with embedded XMP diff --git a/t/CanonRaw_6.out b/t/CanonRaw_6.out new file mode 100644 index 0000000..ef39a6b --- /dev/null +++ b/t/CanonRaw_6.out @@ -0,0 +1,234 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: CanonRaw_6_failed.cr2 +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 8.8 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:31-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:31-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:31-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: CR2 +[File, File, Other] FileTypeExtension - File Type Extension: cr2 +[File, File, Other] MIMEType - MIME Type: image/x-canon-cr2 +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 74386a2844191f61317ffa999148834a +[EXIF, IFD0, Image] 256 - Image Width: 1536 +[EXIF, IFD0, Image] 257 - Image Height: 1024 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD0, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS 350D DIGITAL +[EXIF, IFD0, Image] 273 - Preview Image Start: 8738 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 279 - Preview Image Length: 26 +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2005:08:03 18:59:18 +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/15 +[EXIF, ExifIFD, Image] 33437 - F Number: 8.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 400 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2005:08:03 18:59:18 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2005:08:03 18:59:18 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: -, -, -, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/15 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 8.0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Average +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 55.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 3456 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 2304 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3954.23341 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3958.762887 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Image] 42032 - Owner Name: Phil Harvey +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 8678 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD2, Image] 256 - Image Width: 384 +[EXIF, IFD2, Image] 257 - Image Height: 256 +[EXIF, IFD2, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD2, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD2, Image] 262 - Photometric Interpretation: RGB +[EXIF, IFD2, Image] 273 - Strip Offsets: 8722 +[EXIF, IFD2, Image] 277 - Samples Per Pixel: 3 +[EXIF, IFD2, Image] 278 - Rows Per Strip: 256 +[EXIF, IFD2, Image] 279 - Strip Byte Counts: 16 +[EXIF, IFD2, Image] 284 - Planar Configuration: Chunky +[EXIF, IFD3, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD3, Image] 273 - Strip Offsets: 8706 +[EXIF, IFD3, Image] 279 - Strip Byte Counts: 16 +[EXIF, IFD3, Image] 50656 - CR2 CFA Pattern: [Red,Green][Green,Blue] +[EXIF, IFD3, Image] 50752 - Raw Image Segmentation: 1 1758 1758 +[EXIF, IFD0, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[IPTC, IPTC, Other] 25 - Keywords: CR2 test +[IPTC, IPTC, Other] 0 - Application Record Version: 4 +[MakerNotes, Canon, Camera] 1 - Macro Mode: Normal +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Single +[MakerNotes, Canon, Camera] 7 - Focus Mode: One-shot AF +[MakerNotes, Canon, Camera] 9 - Record Mode: CR2 +[MakerNotes, Canon, Camera] 10 - Canon Image Size: n/a +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: None +[MakerNotes, Canon, Camera] 13 - Contrast: Normal +[MakerNotes, Canon, Camera] 14 - Saturation: Normal +[MakerNotes, Canon, Camera] 15 - Sharpness: 0 +[MakerNotes, Canon, Camera] 17 - Metering Mode: Center-weighted average +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Aperture-priority AE +[MakerNotes, Canon, Camera] 22 - Lens Type: n/a +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 55 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 18 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 4 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 27 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: (none) +[MakerNotes, Canon, Camera] 32 - Focus Continuous: Single +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 0 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 0 +[MakerNotes, Canon, Camera] 40 - Photo Effect: Off +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, Canon, Image] 0 - Focal Type: Zoom +[MakerNotes, Canon, Image] 1 - Focal Length: 55 mm +[MakerNotes, Canon, Image] 2 - Focal Plane X Size: 35.00 mm +[MakerNotes, Canon, Image] 3 - Focal Plane Y Size: 15.37 mm +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 400 +[MakerNotes, Canon, Image] 3 - Measured EV: 8.00 +[MakerNotes, Canon, Image] 4 - Target Aperture: 8 +[MakerNotes, Canon, Image] 5 - Target Exposure Time: 1/15 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 21 - F Number: 8 +[MakerNotes, Canon, Image] 22 - Exposure Time: 1/16 +[MakerNotes, Canon, Image] 23 - Measured EV 2: 8.125 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 0 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS Mid-range +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 29 - Self Timer 2: 0 +[MakerNotes, Canon, Image] 6 - Canon Image Type: Canon EOS 350D DIGITAL +[MakerNotes, Canon, Camera] 7 - Canon Firmware Version: Firmware 1.0.2 +[MakerNotes, Canon, Camera] 9 - Owner Name: Phil Harvey +[MakerNotes, Canon, Camera] 12 - Serial Number: 0123456789 +[MakerNotes, CanonCustom, Camera] 0 - Set Button Cross Keys Func: Normal +[MakerNotes, CanonCustom, Camera] 1 - Long Exposure Noise Reduction: Off +[MakerNotes, CanonCustom, Camera] 2 - Flash Sync Speed Av: Auto +[MakerNotes, CanonCustom, Camera] 3 - Shutter-AE Lock: AF/AE lock +[MakerNotes, CanonCustom, Camera] 4 - AF Assist Beam: Emits +[MakerNotes, CanonCustom, Camera] 5 - Exposure Level Increments: 1/3 Stop +[MakerNotes, CanonCustom, Camera] 6 - Mirror Lockup: Disable +[MakerNotes, CanonCustom, Camera] 7 - E-TTL II: Evaluative +[MakerNotes, CanonCustom, Camera] 8 - Shutter Curtain Sync: 1st-curtain sync +[MakerNotes, Canon, Camera] 16 - Canon Model ID: EOS Digital Rebel XT / 350D / Kiss Digital N +[MakerNotes, Canon, Camera] 0 - Num AF Points: 7 +[MakerNotes, Canon, Camera] 1 - Valid AF Points: 7 +[MakerNotes, Canon, Image] 2 - Canon Image Width: 3456 +[MakerNotes, Canon, Image] 3 - Canon Image Height: 2304 +[MakerNotes, Canon, Camera] 4 - AF Image Width: 3456 +[MakerNotes, Canon, Camera] 5 - AF Image Height: 2304 +[MakerNotes, Canon, Camera] 6 - AF Area Width: 189 +[MakerNotes, Canon, Camera] 7 - AF Area Height: 188 +[MakerNotes, Canon, Camera] 8 - AF Area X Positions: 0 -1237 -742 0 742 1237 0 +[MakerNotes, Canon, Camera] 9 - AF Area Y Positions: -617 0 0 0 0 0 617 +[MakerNotes, Canon, Camera] 10 - AF Points In Focus: 3 +[MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 7 112 +[MakerNotes, Canon, Camera] 21 - Serial Number Format: Format 2 +[MakerNotes, Canon, Camera] 131 - Original Decision Data Offset: 0 +[MakerNotes, Canon, Image] 1 - File Number: 100-0024 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Image] 8 - Long Exposure Noise Reduction 2: Off +[MakerNotes, Canon, Image] 9 - WB Bracket Mode: Off +[MakerNotes, Canon, Image] 12 - WB Bracket Value AB: 0 +[MakerNotes, Canon, Image] 13 - WB Bracket Value GM: 0 +[MakerNotes, Canon, Image] 14 - Filter Effect: None +[MakerNotes, Canon, Image] 15 - Toning Effect: None +[MakerNotes, Canon, Image] 1 - Tone Curve: Standard +[MakerNotes, Canon, Image] 3 - Sharpness Frequency: n/a +[MakerNotes, Canon, Image] 4 - Sensor Red Level: 0 +[MakerNotes, Canon, Image] 5 - Sensor Blue Level: 0 +[MakerNotes, Canon, Image] 6 - White Balance Red: 0 +[MakerNotes, Canon, Image] 7 - White Balance Blue: 0 +[MakerNotes, Canon, Image] 9 - Color Temperature: 5200 +[MakerNotes, Canon, Image] 10 - Picture Style: None +[MakerNotes, Canon, Image] 11 - Digital Gain: 0 +[MakerNotes, Canon, Image] 12 - WB Shift AB: 0 +[MakerNotes, Canon, Image] 13 - WB Shift GM: 0 +[MakerNotes, Canon, Camera] 1 - Measured RGGB: 580 1024 1024 500 +[MakerNotes, Canon, Camera] 208 - VRD Offset: 0 +[MakerNotes, Canon, Image] 1 - Sensor Width: 3516 +[MakerNotes, Canon, Image] 2 - Sensor Height: 2328 +[MakerNotes, Canon, Image] 5 - Sensor Left Border: 52 +[MakerNotes, Canon, Image] 6 - Sensor Top Border: 19 +[MakerNotes, Canon, Image] 7 - Sensor Right Border: 3507 +[MakerNotes, Canon, Image] 8 - Sensor Bottom Border: 2322 +[MakerNotes, Canon, Image] 9 - Black Mask Left Border: 0 +[MakerNotes, Canon, Image] 10 - Black Mask Top Border: 0 +[MakerNotes, Canon, Image] 11 - Black Mask Right Border: 0 +[MakerNotes, Canon, Image] 12 - Black Mask Bottom Border: 0 +[MakerNotes, Canon, Camera] 25 - WB RGGB Levels As Shot: 2002 1185 1187 2364 +[MakerNotes, Canon, Camera] 29 - Color Temp As Shot: 3064 +[MakerNotes, Canon, Camera] 30 - WB RGGB Levels Auto: 1720 1022 1024 2031 +[MakerNotes, Canon, Camera] 34 - Color Temp Auto: 3064 +[MakerNotes, Canon, Camera] 35 - WB RGGB Levels Daylight: 2312 1022 1024 1501 +[MakerNotes, Canon, Camera] 39 - Color Temp Daylight: 5200 +[MakerNotes, Canon, Camera] 40 - WB RGGB Levels Shade: 2714 1022 1024 1246 +[MakerNotes, Canon, Camera] 44 - Color Temp Shade: 7000 +[MakerNotes, Canon, Camera] 45 - WB RGGB Levels Cloudy: 2512 1022 1024 1355 +[MakerNotes, Canon, Camera] 49 - Color Temp Cloudy: 6000 +[MakerNotes, Canon, Camera] 50 - WB RGGB Levels Tungsten: 1523 1022 1024 2397 +[MakerNotes, Canon, Camera] 54 - Color Temp Tungsten: 3201 +[MakerNotes, Canon, Camera] 55 - WB RGGB Levels Fluorescent: 1944 1022 1024 2015 +[MakerNotes, Canon, Camera] 59 - Color Temp Fluorescent: 3905 +[MakerNotes, Canon, Camera] 60 - WB RGGB Levels Flash: 2606 1022 1024 1308 +[MakerNotes, Canon, Camera] 64 - Color Temp Flash: 6440 +[MakerNotes, Canon, Camera] 65 - WB RGGB Levels Custom 1: 2312 1022 1024 1501 +[MakerNotes, Canon, Camera] 69 - Color Temp Custom 1: 5200 +[MakerNotes, Canon, Camera] 70 - WB RGGB Levels Custom 2: 2312 1022 1024 1501 +[MakerNotes, Canon, Camera] 74 - Color Temp Custom 2: 5200 +[MakerNotes, Canon, Camera] 2 - Color Tone: Normal +[Composite, Composite, Camera] Canon-DriveMode - Drive Mode: Single-frame Shooting +[Composite, Composite, Camera] Canon-ISO - ISO: 400 +[Composite, Composite, Camera] Canon-Lens - Lens: 18.0 - 55.0 mm +[Composite, Composite, Camera] Canon-ShootingMode - Shooting Mode: Aperture-priority AE +[Composite, Composite, Camera] Canon-WB_RGGBLevels - WB RGGB Levels: 2002 1185 1187 2364 +[Composite, Composite, Image] Exif-Aperture - Aperture: 8.0 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/15 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.993255 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 3456x2304 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Unknown 18-55mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 7.9 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 8.0 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 1.688027 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.6 +[Composite, Composite, Camera] Canon-Lens35efl - Lens: 18.0 - 55.0 mm (35 mm equivalent: 29.2 - 89.2 mm) +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.019 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 22.8 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 55.0 mm (35 mm equivalent: 89.2 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 20.42 m diff --git a/t/CanonRaw_7.out b/t/CanonRaw_7.out new file mode 100644 index 0000000..7a8b29b --- /dev/null +++ b/t/CanonRaw_7.out @@ -0,0 +1,251 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: CanonRaw_7_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 7.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:32-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:32-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:32-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS 350D DIGITAL +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2005:08:03 18:59:18 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/15 +[EXIF, ExifIFD, Image] 33437 - F Number: 8.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 400 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2005:08:03 18:59:18 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2005:08:03 18:59:18 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/15 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 8.0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Center-weighted average +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 55.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 3456 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 2304 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3954.23341 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3958.762887 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, ExifIFD, Image] 42032 - Owner Name: unknown +[EXIF, ExifIFD, Image] 42033 - Serial Number: 0123456789 +[MakerNotes, Canon, Camera] 1 - Macro Mode: Normal +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Single +[MakerNotes, Canon, Camera] 7 - Focus Mode: One-shot AF +[MakerNotes, Canon, Camera] 9 - Record Mode: CR2 +[MakerNotes, Canon, Camera] 10 - Canon Image Size: n/a +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: None +[MakerNotes, Canon, Camera] 13 - Contrast: Normal +[MakerNotes, Canon, Camera] 14 - Saturation: Normal +[MakerNotes, Canon, Camera] 15 - Sharpness: 0 +[MakerNotes, Canon, Camera] 17 - Metering Mode: Center-weighted average +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Aperture-priority AE +[MakerNotes, Canon, Camera] 22 - Lens Type: n/a +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 55 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 18 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 4 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 27 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: (none) +[MakerNotes, Canon, Camera] 32 - Focus Continuous: Single +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 0 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 0 +[MakerNotes, Canon, Camera] 40 - Photo Effect: Off +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, Canon, Image] 0 - Focal Type: Zoom +[MakerNotes, Canon, Image] 1 - Focal Length: 55 mm +[MakerNotes, Canon, Image] 2 - Focal Plane X Size: 23.04 mm +[MakerNotes, Canon, Image] 3 - Focal Plane Y Size: 15.37 mm +[MakerNotes, Canon, Camera] 3 - Canon Flash Info: 100 0 0 0 +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 400 +[MakerNotes, Canon, Image] 3 - Measured EV: 8.00 +[MakerNotes, Canon, Image] 4 - Target Aperture: 8 +[MakerNotes, Canon, Image] 5 - Target Exposure Time: 1/15 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 21 - F Number: 8 +[MakerNotes, Canon, Image] 22 - Exposure Time: 1/16 +[MakerNotes, Canon, Image] 23 - Measured EV 2: 8.125 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 0 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS Mid-range +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 29 - Self Timer 2: 0 +[MakerNotes, Canon, Image] 6 - Canon Image Type: Canon EOS 350D DIGITAL +[MakerNotes, Canon, Camera] 7 - Canon Firmware Version: Firmware 1.0.2 +[MakerNotes, Canon, Camera] 9 - Owner Name: unknown +[MakerNotes, Canon, Camera] 12 - Serial Number: 0123456789 +[MakerNotes, CanonCustom, Camera] 0 - Set Button Cross Keys Func: Normal +[MakerNotes, CanonCustom, Camera] 1 - Long Exposure Noise Reduction: Off +[MakerNotes, CanonCustom, Camera] 2 - Flash Sync Speed Av: Auto +[MakerNotes, CanonCustom, Camera] 3 - Shutter-AE Lock: AF/AE lock +[MakerNotes, CanonCustom, Camera] 4 - AF Assist Beam: Emits +[MakerNotes, CanonCustom, Camera] 5 - Exposure Level Increments: 1/3 Stop +[MakerNotes, CanonCustom, Camera] 6 - Mirror Lockup: Disable +[MakerNotes, CanonCustom, Camera] 7 - E-TTL II: Evaluative +[MakerNotes, CanonCustom, Camera] 8 - Shutter Curtain Sync: 1st-curtain sync +[MakerNotes, Canon, Camera] 16 - Canon Model ID: EOS Digital Rebel XT / 350D / Kiss Digital N +[MakerNotes, Canon, Camera] 0 - Num AF Points: 7 +[MakerNotes, Canon, Camera] 1 - Valid AF Points: 7 +[MakerNotes, Canon, Image] 2 - Canon Image Width: 3456 +[MakerNotes, Canon, Image] 3 - Canon Image Height: 2304 +[MakerNotes, Canon, Camera] 4 - AF Image Width: 3456 +[MakerNotes, Canon, Camera] 5 - AF Image Height: 2304 +[MakerNotes, Canon, Camera] 6 - AF Area Width: 189 +[MakerNotes, Canon, Camera] 7 - AF Area Height: 188 +[MakerNotes, Canon, Camera] 8 - AF Area X Positions: 0 -1237 -742 0 742 1237 0 +[MakerNotes, Canon, Camera] 9 - AF Area Y Positions: -617 0 0 0 0 0 617 +[MakerNotes, Canon, Camera] 10 - AF Points In Focus: 3 +[MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 7 112 +[MakerNotes, Canon, Camera] 21 - Serial Number Format: Format 2 +[MakerNotes, Canon, Camera] 25 - Canon 0x0019: 1 +[MakerNotes, Canon, Camera] 131 - Original Decision Data Offset: 0 +[MakerNotes, Canon, Image] 1 - File Number: 100-0024 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Image] 8 - Long Exposure Noise Reduction 2: Off +[MakerNotes, Canon, Image] 9 - WB Bracket Mode: Off +[MakerNotes, Canon, Image] 12 - WB Bracket Value AB: 0 +[MakerNotes, Canon, Image] 13 - WB Bracket Value GM: 0 +[MakerNotes, Canon, Image] 14 - Filter Effect: None +[MakerNotes, Canon, Image] 15 - Toning Effect: None +[MakerNotes, Canon, Image] 1 - Tone Curve: Standard +[MakerNotes, Canon, Image] 3 - Sharpness Frequency: n/a +[MakerNotes, Canon, Image] 4 - Sensor Red Level: 0 +[MakerNotes, Canon, Image] 5 - Sensor Blue Level: 0 +[MakerNotes, Canon, Image] 6 - White Balance Red: 0 +[MakerNotes, Canon, Image] 7 - White Balance Blue: 0 +[MakerNotes, Canon, Image] 9 - Color Temperature: 5200 +[MakerNotes, Canon, Image] 10 - Picture Style: None +[MakerNotes, Canon, Image] 11 - Digital Gain: 0 +[MakerNotes, Canon, Image] 12 - WB Shift AB: 0 +[MakerNotes, Canon, Image] 13 - WB Shift GM: 0 +[MakerNotes, Canon, Camera] 1 - Measured RGGB: 580 1024 1024 500 +[MakerNotes, Canon, Camera] 208 - VRD Offset: 0 +[MakerNotes, Canon, Image] 1 - Sensor Width: 3516 +[MakerNotes, Canon, Image] 2 - Sensor Height: 2328 +[MakerNotes, Canon, Image] 5 - Sensor Left Border: 52 +[MakerNotes, Canon, Image] 6 - Sensor Top Border: 19 +[MakerNotes, Canon, Image] 7 - Sensor Right Border: 3507 +[MakerNotes, Canon, Image] 8 - Sensor Bottom Border: 2322 +[MakerNotes, Canon, Image] 9 - Black Mask Left Border: 0 +[MakerNotes, Canon, Image] 10 - Black Mask Top Border: 0 +[MakerNotes, Canon, Image] 11 - Black Mask Right Border: 0 +[MakerNotes, Canon, Image] 12 - Black Mask Bottom Border: 0 +[MakerNotes, Canon, Camera] 25 - WB RGGB Levels As Shot: 2002 1185 1187 2364 +[MakerNotes, Canon, Camera] 29 - Color Temp As Shot: 3064 +[MakerNotes, Canon, Camera] 30 - WB RGGB Levels Auto: 1720 1022 1024 2031 +[MakerNotes, Canon, Camera] 34 - Color Temp Auto: 3064 +[MakerNotes, Canon, Camera] 35 - WB RGGB Levels Daylight: 2312 1022 1024 1501 +[MakerNotes, Canon, Camera] 39 - Color Temp Daylight: 5200 +[MakerNotes, Canon, Camera] 40 - WB RGGB Levels Shade: 2714 1022 1024 1246 +[MakerNotes, Canon, Camera] 44 - Color Temp Shade: 7000 +[MakerNotes, Canon, Camera] 45 - WB RGGB Levels Cloudy: 2512 1022 1024 1355 +[MakerNotes, Canon, Camera] 49 - Color Temp Cloudy: 6000 +[MakerNotes, Canon, Camera] 50 - WB RGGB Levels Tungsten: 1523 1022 1024 2397 +[MakerNotes, Canon, Camera] 54 - Color Temp Tungsten: 3201 +[MakerNotes, Canon, Camera] 55 - WB RGGB Levels Fluorescent: 1944 1022 1024 2015 +[MakerNotes, Canon, Camera] 59 - Color Temp Fluorescent: 3905 +[MakerNotes, Canon, Camera] 60 - WB RGGB Levels Flash: 2606 1022 1024 1308 +[MakerNotes, Canon, Camera] 64 - Color Temp Flash: 6440 +[MakerNotes, Canon, Camera] 65 - WB RGGB Levels Custom 1: 2312 1022 1024 1501 +[MakerNotes, Canon, Camera] 69 - Color Temp Custom 1: 5200 +[MakerNotes, Canon, Camera] 70 - WB RGGB Levels Custom 2: 2312 1022 1024 1501 +[MakerNotes, Canon, Camera] 74 - Color Temp Custom 2: 5200 +[MakerNotes, Canon, Camera] 0 - Camera Color Calibration 01: 333 1013 -410 (11109K) +[MakerNotes, Canon, Camera] 4 - Camera Color Calibration 02: 346 963 -376 (9523K) +[MakerNotes, Canon, Camera] 8 - Camera Color Calibration 03: 364 897 -329 (8000K) +[MakerNotes, Canon, Camera] 12 - Camera Color Calibration 04: 386 841 -284 (7000K) +[MakerNotes, Canon, Camera] 16 - Camera Color Calibration 05: 417 773 -225 (6000K) +[MakerNotes, Canon, Camera] 20 - Camera Color Calibration 06: 433 738 -194 (5600K) +[MakerNotes, Canon, Camera] 24 - Camera Color Calibration 07: 453 698 -156 (5200K) +[MakerNotes, Canon, Camera] 28 - Camera Color Calibration 08: 482 650 -108 (4749K) +[MakerNotes, Canon, Camera] 32 - Camera Color Calibration 09: 518 600 -53 (4312K) +[MakerNotes, Canon, Camera] 36 - Camera Color Calibration 10: 549 565 -10 (4023K) +[MakerNotes, Canon, Camera] 40 - Camera Color Calibration 11: 596 516 51 (3696K) +[MakerNotes, Canon, Camera] 44 - Camera Color Calibration 12: 677 443 151 (3250K) +[MakerNotes, Canon, Camera] 48 - Camera Color Calibration 13: 720 415 196 (3051K) +[MakerNotes, Canon, Camera] 52 - Camera Color Calibration 14: 770 382 248 (2871K) +[MakerNotes, Canon, Camera] 56 - Camera Color Calibration 15: 949 307 397 (2413K) +[MakerNotes, Canon, Camera] 2 - Color Tone: Normal +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-aux, Camera] Lens - Lens: 18.0 - 55.0 mm +[XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: -, -, -, - +[XMP, XMP-exif, Camera] FlashFired - Flash Fired: False +[XMP, XMP-exif, Camera] FlashFunction - Flash Function: False +[XMP, XMP-exif, Camera] FlashMode - Flash Mode: Off +[XMP, XMP-exif, Camera] FlashRedEyeMode - Flash Red Eye Mode: False +[XMP, XMP-exif, Camera] FlashReturn - Flash Return: No return detection +[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: R98 - DCF basic file (sRGB) +[XMP, XMP-pmi, Image] sequenceNumber - Sequence Number: 0 +[XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8, 8, 8 +[XMP, XMP-tiff, Image] Compression - Compression: JPEG (old-style) +[XMP, XMP-tiff, Image] ImageLength - Image Height: 1024 +[XMP, XMP-tiff, Image] ImageWidth - Image Width: 1536 +[XMP, XMP-tiff, Image] PhotometricInterpretation - Photometric Interpretation: RGB +[XMP, XMP-tiff, Image] PlanarConfiguration - Planar Configuration: Chunky +[XMP, XMP-tiff, Image] SamplesPerPixel - Samples Per Pixel: 3 +[XMP, XMP-crs, Image] Temperature - Color Temperature: 5200 +[XMP, XMP-crs, Image] ToneCurve - Tone Curve: Standard +[Composite, Composite, Camera] Canon-DriveMode - Drive Mode: Single-frame Shooting +[Composite, Composite, Camera] Canon-ISO - ISO: 400 +[Composite, Composite, Camera] Canon-Lens - Lens: 18.0 - 55.0 mm +[Composite, Composite, Camera] Canon-ShootingMode - Shooting Mode: Aperture-priority AE +[Composite, Composite, Camera] Canon-WB_RGGBLevels - WB RGGB Levels: 2002 1185 1187 2364 +[Composite, Composite, Image] Exif-Aperture - Aperture: 8.0 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/15 +[Composite, Composite, Camera] XMP-Flash - Flash: Off, Did not fire +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.993255 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Unknown 18-55mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 7.9 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 1.688027 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.6 +[Composite, Composite, Camera] Canon-Lens35efl - Lens: 18.0 - 55.0 mm (35 mm equivalent: 28.1 - 85.9 mm) +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.019 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 23.7 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 55.0 mm (35 mm equivalent: 85.9 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 19.66 m diff --git a/t/CanonRaw_8.out b/t/CanonRaw_8.out new file mode 100644 index 0000000..b854e99 --- /dev/null +++ b/t/CanonRaw_8.out @@ -0,0 +1,507 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: CanonRaw.cr3 +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 53 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:03:26 22:05:16-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:32-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: CR3 +[File, File, Other] FileTypeExtension - File Type Extension: cr3 +[File, File, Other] MIMEType - MIME Type: image/x-canon-cr3 +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, Track4, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[QuickTime, QuickTime, Video] 0 - Major Brand: Canon Raw (.CRX) +[QuickTime, QuickTime, Video] 1 - Minor Version: 0.0.1 +[QuickTime, QuickTime, Video] 2 - Compatible Brands: crx , isom +[QuickTime, QuickTime, Video] 0 - Movie Header Version: 0 +[QuickTime, QuickTime, Time] 1 - Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, QuickTime, Time] 2 - Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, QuickTime, Video] 3 - Time Scale: 1 +[QuickTime, QuickTime, Video] 4 - Duration: 1.00 s +[QuickTime, QuickTime, Video] 5 - Preferred Rate: 1 +[QuickTime, QuickTime, Video] 6 - Preferred Volume: 100.00% +[QuickTime, QuickTime, Video] 9 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, QuickTime, Video] 18 - Preview Time: 0 s +[QuickTime, QuickTime, Video] 19 - Preview Duration: 0 s +[QuickTime, QuickTime, Video] 20 - Poster Time: 0 s +[QuickTime, QuickTime, Video] 21 - Selection Time: 0 s +[QuickTime, QuickTime, Video] 22 - Selection Duration: 0 s +[QuickTime, QuickTime, Video] 23 - Current Time: 0 s +[QuickTime, QuickTime, Video] 24 - Next Track ID: 5 +[QuickTime, Track1, Video] 0 - Track Header Version: 0 +[QuickTime, Track1, Time] 1 - Track Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track1, Time] 2 - Track Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track1, Video] 3 - Track ID: 1 +[QuickTime, Track1, Video] 5 - Track Duration: 1.00 s +[QuickTime, Track1, Video] 8 - Track Layer: 0 +[QuickTime, Track1, Video] 9 - Track Volume: 0.00% +[QuickTime, Track1, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track1, Video] 19 - Image Width: 6000 +[QuickTime, Track1, Video] 20 - Image Height: 4000 +[QuickTime, Track1, Video] 0 - Media Header Version: 0 +[QuickTime, Track1, Time] 1 - Media Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track1, Time] 2 - Media Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track1, Video] 3 - Media Time Scale: 1 +[QuickTime, Track1, Video] 4 - Media Duration: 1.00 s +[QuickTime, Track1, Video] 5 - Media Language Code: eng +[QuickTime, Track1, Video] 8 - Handler Type: Video Track +[QuickTime, Track1, Video] 2 - Graphics Mode: srcCopy +[QuickTime, Track1, Video] 3 - Op Color: 0 0 0 +[QuickTime, Track1, Image] 2 - Compressor ID: CRAW +[QuickTime, Track1, Image] 16 - Source Image Width: 6000 +[QuickTime, Track1, Image] 17 - Source Image Height: 4000 +[QuickTime, Track1, Image] 18 - X Resolution: 72 +[QuickTime, Track1, Image] 20 - Y Resolution: 72 +[QuickTime, Track1, Image] 41 - Bit Depth: 24 +[QuickTime, Track1, Video] stts - Video Frame Rate: 1 +[QuickTime, Track1, Video] SampleTime - Sample Time: 0 s +[QuickTime, Track1, Video] SampleDuration - Sample Duration: 1.00 s +[QuickTime, Track1, Preview] JPEG - Jpg From Raw: (Binary data 29 bytes) +[QuickTime, Track2, Video] 0 - Track Header Version: 0 +[QuickTime, Track2, Time] 1 - Track Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track2, Time] 2 - Track Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track2, Video] 3 - Track ID: 2 +[QuickTime, Track2, Video] 5 - Track Duration: 1.00 s +[QuickTime, Track2, Video] 8 - Track Layer: 0 +[QuickTime, Track2, Video] 9 - Track Volume: 0.00% +[QuickTime, Track2, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track2, Video] 19 - Image Width: 1624 +[QuickTime, Track2, Video] 20 - Image Height: 1080 +[QuickTime, Track2, Video] 0 - Media Header Version: 0 +[QuickTime, Track2, Time] 1 - Media Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track2, Time] 2 - Media Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track2, Video] 3 - Media Time Scale: 1 +[QuickTime, Track2, Video] 4 - Media Duration: 1.00 s +[QuickTime, Track2, Video] 5 - Media Language Code: eng +[QuickTime, Track2, Video] 8 - Handler Type: Video Track +[QuickTime, Track2, Video] 2 - Graphics Mode: srcCopy +[QuickTime, Track2, Video] 3 - Op Color: 0 0 0 +[QuickTime, Track2, Image] 2 - Compressor ID: CRAW +[QuickTime, Track2, Image] 16 - Source Image Width: 1624 +[QuickTime, Track2, Image] 17 - Source Image Height: 1080 +[QuickTime, Track2, Image] 18 - X Resolution: 72 +[QuickTime, Track2, Image] 20 - Y Resolution: 72 +[QuickTime, Track2, Image] 41 - Bit Depth: 24 +[QuickTime, Track2, Video] stts - Video Frame Rate: 1 +[QuickTime, Track3, Video] 0 - Track Header Version: 0 +[QuickTime, Track3, Time] 1 - Track Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track3, Time] 2 - Track Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track3, Video] 3 - Track ID: 3 +[QuickTime, Track3, Video] 5 - Track Duration: 1.00 s +[QuickTime, Track3, Video] 8 - Track Layer: 0 +[QuickTime, Track3, Video] 9 - Track Volume: 0.00% +[QuickTime, Track3, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track3, Video] 19 - Image Width: 6288 +[QuickTime, Track3, Video] 20 - Image Height: 4056 +[QuickTime, Track3, Video] 0 - Media Header Version: 0 +[QuickTime, Track3, Time] 1 - Media Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track3, Time] 2 - Media Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track3, Video] 3 - Media Time Scale: 1 +[QuickTime, Track3, Video] 4 - Media Duration: 1.00 s +[QuickTime, Track3, Video] 5 - Media Language Code: eng +[QuickTime, Track3, Video] 8 - Handler Type: Video Track +[QuickTime, Track3, Video] 2 - Graphics Mode: srcCopy +[QuickTime, Track3, Video] 3 - Op Color: 0 0 0 +[QuickTime, Track3, Image] 2 - Compressor ID: CRAW +[QuickTime, Track3, Image] 16 - Source Image Width: 6288 +[QuickTime, Track3, Image] 17 - Source Image Height: 4056 +[QuickTime, Track3, Image] 18 - X Resolution: 72 +[QuickTime, Track3, Image] 20 - Y Resolution: 72 +[QuickTime, Track3, Image] 41 - Bit Depth: 24 +[QuickTime, Track3, Video] stts - Video Frame Rate: 1 +[QuickTime, Track4, Video] 0 - Track Header Version: 0 +[QuickTime, Track4, Time] 1 - Track Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track4, Time] 2 - Track Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track4, Video] 3 - Track ID: 4 +[QuickTime, Track4, Video] 5 - Track Duration: 1.00 s +[QuickTime, Track4, Video] 8 - Track Layer: 0 +[QuickTime, Track4, Video] 9 - Track Volume: 0.00% +[QuickTime, Track4, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track4, Video] 0 - Media Header Version: 0 +[QuickTime, Track4, Time] 1 - Media Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track4, Time] 2 - Media Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track4, Video] 3 - Media Time Scale: 1 +[QuickTime, Track4, Video] 4 - Media Duration: 1.00 s +[QuickTime, Track4, Video] 5 - Media Language Code: eng +[QuickTime, Track4, Video] 8 - Handler Type: NRT Metadata +[QuickTime, Track4, Other] 4 - Meta Format: CTMD +[QuickTime, Track4, Video] SampleTime - Sample Time: 0 s +[QuickTime, Track4, Video] SampleDuration - Sample Duration: 1.00 s +[QuickTime, QuickTime, Preview] uuid - Preview Image: (Binary data 26 bytes) +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 41065 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 11437 +[MakerNotes, Canon, Video] CNCV - Compressor Version: CanonCR3_001/00.09.00/00.00.00 +[MakerNotes, Canon, Camera] 1 - Macro Mode: Normal +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Single +[MakerNotes, Canon, Camera] 7 - Focus Mode: AF + MF +[MakerNotes, Canon, Camera] 9 - Record Mode: CR3+JPEG +[MakerNotes, Canon, Camera] 10 - Canon Image Size: Large +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: None +[MakerNotes, Canon, Camera] 13 - Contrast: Normal +[MakerNotes, Canon, Camera] 14 - Saturation: Normal +[MakerNotes, Canon, Camera] 16 - Camera ISO: Auto +[MakerNotes, Canon, Camera] 17 - Metering Mode: Evaluative +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Aperture-priority AE +[MakerNotes, Canon, Camera] 22 - Lens Type: Canon EF-M 15-45mm f/3.5-6.3 IS STM +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 45 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 15 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 3.6 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 23 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: E-TTL +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 0 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 0 +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, Canon, Camera] 46 - SRAW Quality: n/a +[MakerNotes, Canon, Image] 1 - Focal Length: 15 mm +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 12800 +[MakerNotes, Canon, Image] 3 - Measured EV: 2.75 +[MakerNotes, Canon, Image] 4 - Target Aperture: 3.6 +[MakerNotes, Canon, Image] 5 - Target Exposure Time: 1/81 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Camera] 12 - Camera Temperature: 38 C +[MakerNotes, Canon, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 21 - F Number: 3.6 +[MakerNotes, Canon, Image] 22 - Exposure Time: 1/70 +[MakerNotes, Canon, Image] 23 - Measured EV 2: 1.625 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 0 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS High-end +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 6 - Canon Image Type: Canon EOS M50 +[MakerNotes, Canon, Camera] 7 - Canon Firmware Version: Firmware Version 1.0.0 +[MakerNotes, Canon, Camera] 9 - Owner Name: +[MakerNotes, Canon, Camera] 16 - Canon Model ID: EOS M50 / Kiss M +[MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 6 113 +[MakerNotes, Canon, Camera] 1 - AF Area Mode: Face + Tracking +[MakerNotes, Canon, Camera] 2 - Num AF Points: 143 +[MakerNotes, Canon, Camera] 3 - Valid AF Points: 1 +[MakerNotes, Canon, Image] 4 - Canon Image Width: 6000 +[MakerNotes, Canon, Image] 5 - Canon Image Height: 4000 +[MakerNotes, Canon, Camera] 6 - AF Image Width: 6000 +[MakerNotes, Canon, Camera] 7 - AF Image Height: 4000 +[MakerNotes, Canon, Camera] 8 - AF Area Widths: 337 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Canon, Camera] 9 - AF Area Heights: 299 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Canon, Camera] 10 - AF Area X Positions: 392 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Canon, Camera] 11 - AF Area Y Positions: -327 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Canon, Camera] 12 - AF Points In Focus: 0 +[MakerNotes, Canon, Camera] 13 - AF Points Selected: 0 +[MakerNotes, Canon, Image] 40 - Image Unique ID: 3b7f679f6bf5d5e1b60ca2b2f051a029 +[MakerNotes, Canon, Time] 1 - Time Zone: +00:00 +[MakerNotes, Canon, Time] 2 - Time Zone City: London +[MakerNotes, Canon, Time] 3 - Daylight Savings: Off +[MakerNotes, Canon, Camera] 56 - Battery Type: LP-E12 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Image] 7 - Raw Jpg Size: Large +[MakerNotes, Canon, Image] 9 - WB Bracket Mode: Off +[MakerNotes, Canon, Image] 12 - WB Bracket Value AB: 0 +[MakerNotes, Canon, Image] 13 - WB Bracket Value GM: 0 +[MakerNotes, Canon, Image] 19 - Live View Shooting: On +[MakerNotes, Canon, Image] 20 - Focus Distance Upper: 0.24 m +[MakerNotes, Canon, Image] 21 - Focus Distance Lower: 0.22 m +[MakerNotes, Canon, Image] 23 - Shutter Mode: Electronic First Curtain +[MakerNotes, Canon, Image] 25 - Flash Exposure Lock: Off +[MakerNotes, Canon, Image] 61 - RF Lens Type: n/a +[MakerNotes, Canon, Camera] 149 - Lens Model: EF-M15-45mm f/3.5-6.3 IS STM +[MakerNotes, Canon, Camera] 150 - Internal Serial Number: CG0156580 +[MakerNotes, Canon, Camera] 151 - Dust Removal Data: (Binary data 1024 bytes) +[MakerNotes, Canon, Camera] 0 - Crop Left Margin: 0 +[MakerNotes, Canon, Camera] 1 - Crop Right Margin: 0 +[MakerNotes, Canon, Camera] 2 - Crop Top Margin: 0 +[MakerNotes, Canon, Camera] 3 - Crop Bottom Margin: 0 +[MakerNotes, CanonCustom, Camera] 259 - ISO Expansion: Off +[MakerNotes, CanonCustom, Camera] 264 - Safety Shift: Disable +[MakerNotes, CanonCustom, Camera] 1809 - Shutter Release Without Lens: Disable +[MakerNotes, CanonCustom, Camera] 2068 - Retract Lens On Power Off: Enable +[MakerNotes, CanonCustom, Camera] 1804 - Custom Controls: 0 19 3 10 23 73 71 61 29 0 7 3 4 +[MakerNotes, Canon, Camera] 0 - Aspect Ratio: 3:2 +[MakerNotes, Canon, Camera] 1 - Cropped Image Width: 6000 +[MakerNotes, Canon, Camera] 2 - Cropped Image Height: 4000 +[MakerNotes, Canon, Camera] 3 - Cropped Image Left: 0 +[MakerNotes, Canon, Camera] 4 - Cropped Image Top: 0 +[MakerNotes, Canon, Image] 1 - Tone Curve: Standard +[MakerNotes, Canon, Image] 2 - Sharpness: 4 +[MakerNotes, Canon, Image] 3 - Sharpness Frequency: n/a +[MakerNotes, Canon, Image] 4 - Sensor Red Level: 0 +[MakerNotes, Canon, Image] 5 - Sensor Blue Level: 0 +[MakerNotes, Canon, Image] 6 - White Balance Red: 0 +[MakerNotes, Canon, Image] 7 - White Balance Blue: 0 +[MakerNotes, Canon, Image] 9 - Color Temperature: 5200 +[MakerNotes, Canon, Image] 10 - Picture Style: Auto +[MakerNotes, Canon, Image] 11 - Digital Gain: 0 +[MakerNotes, Canon, Image] 12 - WB Shift AB: 0 +[MakerNotes, Canon, Image] 13 - WB Shift GM: 0 +[MakerNotes, Canon, Camera] 1 - Measured RGGB: 1183 1024 1024 461 +[MakerNotes, Canon, Camera] 180 - Color Space: sRGB +[MakerNotes, Canon, Camera] 208 - VRD Offset: 0 +[MakerNotes, Canon, Image] 1 - Sensor Width: 6288 +[MakerNotes, Canon, Image] 2 - Sensor Height: 4056 +[MakerNotes, Canon, Image] 5 - Sensor Left Border: 276 +[MakerNotes, Canon, Image] 6 - Sensor Top Border: 48 +[MakerNotes, Canon, Image] 7 - Sensor Right Border: 6275 +[MakerNotes, Canon, Image] 8 - Sensor Bottom Border: 4047 +[MakerNotes, Canon, Image] 9 - Black Mask Left Border: 0 +[MakerNotes, Canon, Image] 10 - Black Mask Top Border: 0 +[MakerNotes, Canon, Image] 11 - Black Mask Right Border: 0 +[MakerNotes, Canon, Image] 12 - Black Mask Bottom Border: 0 +[MakerNotes, Canon, Camera] 16392 - Picture Style User Def: Auto; Auto; Auto +[MakerNotes, Canon, Camera] 16393 - Picture Style PC: None; None; None +[MakerNotes, Canon, Camera] 16400 - Custom Picture Style File Name: +[MakerNotes, Canon, Camera] 1 - AF Micro Adj Mode: Disable +[MakerNotes, Canon, Camera] 2 - AF Micro Adj Value: 0 +[MakerNotes, Canon, Camera] 5 - Peripheral Lighting Setting: On +[MakerNotes, Canon, Camera] 6 - Chromatic Aberration Setting: On +[MakerNotes, Canon, Camera] 7 - Distortion Correction Setting: Off +[MakerNotes, Canon, Camera] 1 - Peripheral Illumination Corr: Off +[MakerNotes, Canon, Camera] 2 - Auto Lighting Optimizer: Standard +[MakerNotes, Canon, Camera] 3 - Highlight Tone Priority: Off +[MakerNotes, Canon, Camera] 4 - Long Exposure Noise Reduction: Off +[MakerNotes, Canon, Camera] 5 - High ISO Noise Reduction: Standard +[MakerNotes, Canon, Camera] 1 - Ambience Selection: Standard +[MakerNotes, Canon, Camera] 257 - Grainy B/W Filter: Off +[MakerNotes, Canon, Camera] 513 - Soft Focus Filter: Off +[MakerNotes, Canon, Camera] 769 - Toy Camera Filter: Off +[MakerNotes, Canon, Camera] 1025 - Miniature Filter: Off +[MakerNotes, Canon, Camera] 1026 - Miniature Filter Orientation: Horizontal +[MakerNotes, Canon, Camera] 1027 - Miniature Filter Position: 0 +[MakerNotes, Canon, Camera] 1028 - Miniature Filter Parameter: 0 +[MakerNotes, Canon, Camera] 1281 - Fisheye Filter: Off +[MakerNotes, Canon, Camera] 1537 - Painting Filter: Off +[MakerNotes, Canon, Camera] 1793 - Watercolor Filter: Off +[MakerNotes, Canon, Image] 1 - HDR: Off +[MakerNotes, Canon, Image] 2 - HDR Effect: Natural +[MakerNotes, Canon, Preview] THMB - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Track2, Image] 8 - Image Width: 1624 +[MakerNotes, Track2, Image] 10 - Image Height: 1080 +[MakerNotes, Track3, Image] 8 - Image Width: 3144 +[MakerNotes, Track3, Image] 10 - Image Height: 4056 +[MakerNotes, Track4, Time] 1 - Time Stamp: 2018:02:21 12:08:56.21 +[MakerNotes, Track4, Image] 0 - Focal Length: 15.0 mm +[MakerNotes, Track4, Image] 0 - F Number: 3.5 +[MakerNotes, Track4, Image] 1 - Exposure Time: 1/80 +[MakerNotes, Track4, Image] 2 - ISO: 12800 +[MakerNotes, Track4, Camera] 1 - Macro Mode: Normal +[MakerNotes, Track4, Camera] 2 - Self Timer: Off +[MakerNotes, Track4, Camera] 3 - Quality: RAW +[MakerNotes, Track4, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Track4, Camera] 5 - Continuous Drive: Single +[MakerNotes, Track4, Camera] 7 - Focus Mode: AF + MF +[MakerNotes, Track4, Camera] 9 - Record Mode: CR3+JPEG +[MakerNotes, Track4, Camera] 10 - Canon Image Size: Large +[MakerNotes, Track4, Camera] 11 - Easy Mode: Manual +[MakerNotes, Track4, Camera] 12 - Digital Zoom: None +[MakerNotes, Track4, Camera] 13 - Contrast: Normal +[MakerNotes, Track4, Camera] 14 - Saturation: Normal +[MakerNotes, Track4, Camera] 16 - Camera ISO: Auto +[MakerNotes, Track4, Camera] 17 - Metering Mode: Evaluative +[MakerNotes, Track4, Camera] 18 - Focus Range: Not Known +[MakerNotes, Track4, Camera] 20 - Canon Exposure Mode: Aperture-priority AE +[MakerNotes, Track4, Camera] 22 - Lens Type: Canon EF-M 15-45mm f/3.5-6.3 IS STM +[MakerNotes, Track4, Camera] 23 - Max Focal Length: 45 mm +[MakerNotes, Track4, Camera] 24 - Min Focal Length: 15 mm +[MakerNotes, Track4, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Track4, Camera] 26 - Max Aperture: 3.6 +[MakerNotes, Track4, Camera] 27 - Min Aperture: 23 +[MakerNotes, Track4, Camera] 28 - Flash Activity: 0 +[MakerNotes, Track4, Camera] 29 - Flash Bits: E-TTL +[MakerNotes, Track4, Camera] 36 - Zoom Source Width: 0 +[MakerNotes, Track4, Camera] 37 - Zoom Target Width: 0 +[MakerNotes, Track4, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Track4, Camera] 42 - Color Tone: Normal +[MakerNotes, Track4, Camera] 46 - SRAW Quality: n/a +[MakerNotes, Track4, Image] 1 - Auto ISO: 100 +[MakerNotes, Track4, Image] 2 - Base ISO: 12800 +[MakerNotes, Track4, Image] 3 - Measured EV: 2.75 +[MakerNotes, Track4, Image] 4 - Target Aperture: 3.6 +[MakerNotes, Track4, Image] 5 - Target Exposure Time: 1/81 +[MakerNotes, Track4, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Track4, Image] 7 - White Balance: Auto +[MakerNotes, Track4, Image] 8 - Slow Shutter: None +[MakerNotes, Track4, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Track4, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Track4, Camera] 12 - Camera Temperature: 38 C +[MakerNotes, Track4, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Track4, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Track4, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Track4, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Track4, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Track4, Image] 21 - F Number: 3.6 +[MakerNotes, Track4, Image] 22 - Exposure Time: 1/70 +[MakerNotes, Track4, Image] 23 - Measured EV 2: 1.625 +[MakerNotes, Track4, Image] 24 - Bulb Duration: 0 +[MakerNotes, Track4, Camera] 26 - Camera Type: EOS High-end +[MakerNotes, Track4, Image] 27 - Auto Rotate: None +[MakerNotes, Track4, Image] 28 - ND Filter: n/a +[MakerNotes, Track4, Camera] 1 - AF Area Mode: Face + Tracking +[MakerNotes, Track4, Camera] 2 - Num AF Points: 143 +[MakerNotes, Track4, Camera] 3 - Valid AF Points: 1 +[MakerNotes, Track4, Image] 4 - Canon Image Width: 6000 +[MakerNotes, Track4, Image] 5 - Canon Image Height: 4000 +[MakerNotes, Track4, Camera] 6 - AF Image Width: 6000 +[MakerNotes, Track4, Camera] 7 - AF Image Height: 4000 +[MakerNotes, Track4, Camera] 8 - AF Area Widths: 337 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Track4, Camera] 9 - AF Area Heights: 299 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Track4, Camera] 10 - AF Area X Positions: 392 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Track4, Camera] 11 - AF Area Y Positions: -327 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Track4, Camera] 12 - AF Points In Focus: 0 +[MakerNotes, Track4, Camera] 13 - AF Points Selected: 0 +[MakerNotes, Track4, Image] 3 - Bracket Mode: Off +[MakerNotes, Track4, Image] 4 - Bracket Value: 0 +[MakerNotes, Track4, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Track4, Image] 7 - Raw Jpg Size: Large +[MakerNotes, Track4, Image] 9 - WB Bracket Mode: Off +[MakerNotes, Track4, Image] 12 - WB Bracket Value AB: 0 +[MakerNotes, Track4, Image] 13 - WB Bracket Value GM: 0 +[MakerNotes, Track4, Image] 19 - Live View Shooting: On +[MakerNotes, Track4, Image] 20 - Focus Distance Upper: 0.24 m +[MakerNotes, Track4, Image] 21 - Focus Distance Lower: 0.22 m +[MakerNotes, Track4, Image] 23 - Shutter Mode: Electronic First Curtain +[MakerNotes, Track4, Image] 25 - Flash Exposure Lock: Off +[MakerNotes, Track4, Image] 61 - RF Lens Type: n/a +[MakerNotes, Track4, Image] 1 - Tone Curve: Standard +[MakerNotes, Track4, Image] 2 - Sharpness: 4 +[MakerNotes, Track4, Image] 3 - Sharpness Frequency: n/a +[MakerNotes, Track4, Image] 4 - Sensor Red Level: 0 +[MakerNotes, Track4, Image] 5 - Sensor Blue Level: 0 +[MakerNotes, Track4, Image] 6 - White Balance Red: 0 +[MakerNotes, Track4, Image] 7 - White Balance Blue: 0 +[MakerNotes, Track4, Image] 9 - Color Temperature: 5200 +[MakerNotes, Track4, Image] 10 - Picture Style: Auto +[MakerNotes, Track4, Image] 11 - Digital Gain: 0 +[MakerNotes, Track4, Image] 12 - WB Shift AB: 0 +[MakerNotes, Track4, Image] 13 - WB Shift GM: 0 +[MakerNotes, Track4, Camera] 5 - Peripheral Lighting Setting: On +[MakerNotes, Track4, Camera] 6 - Chromatic Aberration Setting: On +[MakerNotes, Track4, Camera] 7 - Distortion Correction Setting: Off +[MakerNotes, Track4, Camera] 0 - Color Data Version: 16 (M50) +[MakerNotes, Track4, Camera] 71 - WB RGGB Levels As Shot: 1104 1024 1024 1789 +[MakerNotes, Track4, Camera] 75 - Color Temp As Shot: 3284 +[MakerNotes, Track4, Camera] 76 - WB RGGB Levels Auto: 1104 1024 1024 1789 +[MakerNotes, Track4, Camera] 80 - Color Temp Auto: 3284 +[MakerNotes, Track4, Camera] 81 - WB RGGB Levels Measured: 1104 1024 1024 1789 +[MakerNotes, Track4, Camera] 85 - Color Temp Measured: 3284 +[MakerNotes, Track4, Camera] 136 - WB RGGB Levels Daylight: 1549 1024 1024 1316 +[MakerNotes, Track4, Camera] 140 - Color Temp Daylight: 5200 +[MakerNotes, Track4, Camera] 141 - WB RGGB Levels Shade: 1792 1024 1024 1147 +[MakerNotes, Track4, Camera] 145 - Color Temp Shade: 7000 +[MakerNotes, Track4, Camera] 146 - WB RGGB Levels Cloudy: 1670 1024 1024 1229 +[MakerNotes, Track4, Camera] 150 - Color Temp Cloudy: 6000 +[MakerNotes, Track4, Camera] 151 - WB RGGB Levels Tungsten: 1104 1024 1024 1879 +[MakerNotes, Track4, Camera] 155 - Color Temp Tungsten: 3200 +[MakerNotes, Track4, Camera] 156 - WB RGGB Levels Fluorescent: 1303 1024 1024 1771 +[MakerNotes, Track4, Camera] 160 - Color Temp Fluorescent: 3687 +[MakerNotes, Track4, Camera] 161 - WB RGGB Levels Kelvin: 1549 1024 1024 1316 +[MakerNotes, Track4, Camera] 165 - Color Temp Kelvin: 5200 +[MakerNotes, Track4, Camera] 166 - WB RGGB Levels Flash: 1697 1024 1024 1218 +[MakerNotes, Track4, Camera] 170 - Color Temp Flash: 6166 +[MakerNotes, Track4, Camera] 329 - Per Channel Black Level: 2049 2045 2045 2050 +[MakerNotes, Track4, Camera] 796 - Normal White Level: 13035 +[MakerNotes, Track4, Camera] 797 - Specular White Level: 14338 +[MakerNotes, Track4, Camera] 798 - Linearity Upper Margin: 10025 +[MakerNotes, Track4, Camera] 1473 - Firmware Version: 1.0.0 +[MakerNotes, Track4, Camera] 0 - Vignetting Corr Version: 32 +[EXIF, IFD0, Image] 256 - Image Width: 6000 +[EXIF, IFD0, Image] 257 - Image Height: 4000 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD0, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS M50 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2018:02:21 12:08:56 +[EXIF, IFD0, Author] 315 - Artist: +[EXIF, IFD0, Author] 33432 - Copyright: +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/80 +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 12800 +[EXIF, ExifIFD, Image] 34864 - Sensitivity Type: Recommended Exposure Index +[EXIF, ExifIFD, Image] 34866 - Recommended Exposure Index: 12800 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0231 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2018:02:21 12:08:56 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2018:02:21 12:08:56 +[EXIF, ExifIFD, Time] 36880 - Offset Time: +00:00 +[EXIF, ExifIFD, Time] 36881 - Offset Time Original: +00:00 +[EXIF, ExifIFD, Time] 36882 - Offset Time Digitized: +00:00 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/83 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 15.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Time] 37520 - Sub Sec Time: 21 +[EXIF, ExifIFD, Time] 37521 - Sub Sec Time Original: 21 +[EXIF, ExifIFD, Time] 37522 - Sub Sec Time Digitized: 21 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 6000 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 4000 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 6514.65798 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 6734.006734 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Image] 42032 - Owner Name: +[EXIF, ExifIFD, Image] 42033 - Serial Number: 613040000565 +[EXIF, ExifIFD, Image] 42034 - Lens Info: 15-45mm f/0 +[EXIF, ExifIFD, Image] 42036 - Lens Model: EF-M15-45mm f/3.5-6.3 IS STM +[EXIF, ExifIFD, Image] 42037 - Lens Serial Number: 0000000000 +[EXIF, GPS, Location] 0 - GPS Version ID: 2.3.0.0 +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[XMP, XMP-xmp, Image] Rating - Rating: 0 +[Composite, Composite, Camera] Canon-ConditionalFEC - Flash Exposure Compensation: 0 +[Composite, Composite, Camera] Canon-DriveMode - Drive Mode: Single-frame Shooting +[Composite, Composite, Camera] Canon-FlashType - Flash Type: Built-In Flash +[Composite, Composite, Camera] Canon-ISO - ISO: 12800 +[Composite, Composite, Camera] Canon-Lens - Lens: 15.0 - 45.0 mm +[Composite, Composite, Camera] Canon-RedEyeReduction - Red Eye Reduction: Off +[Composite, Composite, Camera] Canon-ShootingMode - Shooting Mode: Aperture-priority AE +[Composite, Composite, Camera] Canon-ShutterCurtainHack - Shutter Curtain Sync: 1st-curtain sync +[Composite, Composite, Camera] Canon-WB_RGGBLevels - WB RGGB Levels: 1104 1024 1024 1789 +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/80 +[Composite, Composite, Time] Exif-SubSecCreateDate - Create Date: 2018:02:21 12:08:56.21+00:00 +[Composite, Composite, Time] Exif-SubSecDateTimeOriginal - Date/Time Original: 2018:02:21 12:08:56.21+00:00 +[Composite, Composite, Time] Exif-SubSecModifyDate - Modify Date: 2018:02:21 12:08:56.21+00:00 +[Composite, Composite, Video] QuickTime-AvgBitrate - Avg Bitrate: 329 kbps +[Composite, Composite, Video] QuickTime-Rotation - Rotation: 0 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.74707 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 6000x4000 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Canon EF-M 15-45mm f/3.5-6.3 IS STM +[Composite, Composite, Image] Exif-LightValue - Light Value: 2.9 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 24.0 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 1.078125 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.6 +[Composite, Composite, Camera] Canon-Lens35efl - Lens: 15.0 - 45.0 mm (35 mm equivalent: 23.3 - 69.9 mm) +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.019 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: 0.03 m (0.22 - 0.25 m) +[Composite, Composite, Image] Exif-FOV - Field Of View: 75.3 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 15.0 mm (35 mm equivalent: 23.3 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 3.33 m diff --git a/t/CanonRaw_9.out b/t/CanonRaw_9.out new file mode 100644 index 0000000..10ba904 --- /dev/null +++ b/t/CanonRaw_9.out @@ -0,0 +1,631 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: CanonRaw_9_failed.cr3 +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 53 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:32-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:32-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:32-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: CR3 +[File, File, Other] FileTypeExtension - File Type Extension: cr3 +[File, File, Other] MIMEType - MIME Type: image/x-canon-cr3 +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, Track4, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[QuickTime, QuickTime, Video] 0 - Major Brand: Canon Raw (.CRX) +[QuickTime, QuickTime, Video] 1 - Minor Version: 0.0.1 +[QuickTime, QuickTime, Video] 2 - Compatible Brands: crx , isom +[QuickTime, QuickTime, Video] 0 - Movie Header Version: 0 +[QuickTime, QuickTime, Time] 1 - Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, QuickTime, Time] 2 - Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, QuickTime, Video] 3 - Time Scale: 1 +[QuickTime, QuickTime, Video] 4 - Duration: 1.00 s +[QuickTime, QuickTime, Video] 5 - Preferred Rate: 1 +[QuickTime, QuickTime, Video] 6 - Preferred Volume: 100.00% +[QuickTime, QuickTime, Video] 9 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, QuickTime, Video] 18 - Preview Time: 0 s +[QuickTime, QuickTime, Video] 19 - Preview Duration: 0 s +[QuickTime, QuickTime, Video] 20 - Poster Time: 0 s +[QuickTime, QuickTime, Video] 21 - Selection Time: 0 s +[QuickTime, QuickTime, Video] 22 - Selection Duration: 0 s +[QuickTime, QuickTime, Video] 23 - Current Time: 0 s +[QuickTime, QuickTime, Video] 24 - Next Track ID: 5 +[QuickTime, Track1, Video] 0 - Track Header Version: 0 +[QuickTime, Track1, Time] 1 - Track Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track1, Time] 2 - Track Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track1, Video] 3 - Track ID: 1 +[QuickTime, Track1, Video] 5 - Track Duration: 1.00 s +[QuickTime, Track1, Video] 8 - Track Layer: 0 +[QuickTime, Track1, Video] 9 - Track Volume: 0.00% +[QuickTime, Track1, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track1, Video] 19 - Image Width: 6000 +[QuickTime, Track1, Video] 20 - Image Height: 4000 +[QuickTime, Track1, Video] 0 - Media Header Version: 0 +[QuickTime, Track1, Time] 1 - Media Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track1, Time] 2 - Media Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track1, Video] 3 - Media Time Scale: 1 +[QuickTime, Track1, Video] 4 - Media Duration: 1.00 s +[QuickTime, Track1, Video] 5 - Media Language Code: eng +[QuickTime, Track1, Video] 8 - Handler Type: Video Track +[QuickTime, Track1, Video] 2 - Graphics Mode: srcCopy +[QuickTime, Track1, Video] 3 - Op Color: 0 0 0 +[QuickTime, Track1, Image] 2 - Compressor ID: CRAW +[QuickTime, Track1, Image] 16 - Source Image Width: 6000 +[QuickTime, Track1, Image] 17 - Source Image Height: 4000 +[QuickTime, Track1, Image] 18 - X Resolution: 72 +[QuickTime, Track1, Image] 20 - Y Resolution: 72 +[QuickTime, Track1, Image] 41 - Bit Depth: 24 +[QuickTime, Track1, Image] JPEG - JPEG Info: (Binary data 4 bytes) +[QuickTime, Track1, Image] free - Unknown free: +[QuickTime, Track1, Video] stts - Video Frame Rate: 1 +[QuickTime, Track1, Video] stsc - Sample To Chunk: (Binary data 20 bytes) +[QuickTime, Track1, Video] stsz - Sample Sizes: (Binary data 12 bytes) +[QuickTime, Track1, Video] free - Unknown free: +[QuickTime, Track1, Video] co64 - Chunk Offset 64: (Binary data 16 bytes) +[QuickTime, Track1, Video] SampleTime - Sample Time: 0 s +[QuickTime, Track1, Video] SampleDuration - Sample Duration: 1.00 s +[QuickTime, Track1, Preview] JPEG - Jpg From Raw: (Binary data 29 bytes) +[QuickTime, Track2, Video] 0 - Track Header Version: 0 +[QuickTime, Track2, Time] 1 - Track Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track2, Time] 2 - Track Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track2, Video] 3 - Track ID: 2 +[QuickTime, Track2, Video] 5 - Track Duration: 1.00 s +[QuickTime, Track2, Video] 8 - Track Layer: 0 +[QuickTime, Track2, Video] 9 - Track Volume: 0.00% +[QuickTime, Track2, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track2, Video] 19 - Image Width: 1624 +[QuickTime, Track2, Video] 20 - Image Height: 1080 +[QuickTime, Track2, Video] 0 - Media Header Version: 0 +[QuickTime, Track2, Time] 1 - Media Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track2, Time] 2 - Media Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track2, Video] 3 - Media Time Scale: 1 +[QuickTime, Track2, Video] 4 - Media Duration: 1.00 s +[QuickTime, Track2, Video] 5 - Media Language Code: eng +[QuickTime, Track2, Video] 8 - Handler Type: Video Track +[QuickTime, Track2, Video] 2 - Graphics Mode: srcCopy +[QuickTime, Track2, Video] 3 - Op Color: 0 0 0 +[QuickTime, Track2, Image] 2 - Compressor ID: CRAW +[QuickTime, Track2, Image] 16 - Source Image Width: 1624 +[QuickTime, Track2, Image] 17 - Source Image Height: 1080 +[QuickTime, Track2, Image] 18 - X Resolution: 72 +[QuickTime, Track2, Image] 20 - Y Resolution: 72 +[QuickTime, Track2, Image] 41 - Bit Depth: 24 +[QuickTime, Track2, Image] free - Unknown free: +[QuickTime, Track2, Video] stts - Video Frame Rate: 1 +[QuickTime, Track2, Video] stsc - Sample To Chunk: (Binary data 20 bytes) +[QuickTime, Track2, Video] stsz - Sample Sizes: (Binary data 12 bytes) +[QuickTime, Track2, Video] free - Unknown free: +[QuickTime, Track2, Video] co64 - Chunk Offset 64: (Binary data 16 bytes) +[QuickTime, Track3, Video] 0 - Track Header Version: 0 +[QuickTime, Track3, Time] 1 - Track Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track3, Time] 2 - Track Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track3, Video] 3 - Track ID: 3 +[QuickTime, Track3, Video] 5 - Track Duration: 1.00 s +[QuickTime, Track3, Video] 8 - Track Layer: 0 +[QuickTime, Track3, Video] 9 - Track Volume: 0.00% +[QuickTime, Track3, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track3, Video] 19 - Image Width: 6288 +[QuickTime, Track3, Video] 20 - Image Height: 4056 +[QuickTime, Track3, Video] 0 - Media Header Version: 0 +[QuickTime, Track3, Time] 1 - Media Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track3, Time] 2 - Media Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track3, Video] 3 - Media Time Scale: 1 +[QuickTime, Track3, Video] 4 - Media Duration: 1.00 s +[QuickTime, Track3, Video] 5 - Media Language Code: eng +[QuickTime, Track3, Video] 8 - Handler Type: Video Track +[QuickTime, Track3, Video] 2 - Graphics Mode: srcCopy +[QuickTime, Track3, Video] 3 - Op Color: 0 0 0 +[QuickTime, Track3, Image] 2 - Compressor ID: CRAW +[QuickTime, Track3, Image] 16 - Source Image Width: 6288 +[QuickTime, Track3, Image] 17 - Source Image Height: 4056 +[QuickTime, Track3, Image] 18 - X Resolution: 72 +[QuickTime, Track3, Image] 20 - Y Resolution: 72 +[QuickTime, Track3, Image] 41 - Bit Depth: 24 +[QuickTime, Track3, Image] free - Unknown free: +[QuickTime, Track3, Video] stts - Video Frame Rate: 1 +[QuickTime, Track3, Video] stsc - Sample To Chunk: (Binary data 20 bytes) +[QuickTime, Track3, Video] stsz - Sample Sizes: (Binary data 12 bytes) +[QuickTime, Track3, Video] free - Unknown free: +[QuickTime, Track3, Video] co64 - Chunk Offset 64: (Binary data 16 bytes) +[QuickTime, Track4, Video] 0 - Track Header Version: 0 +[QuickTime, Track4, Time] 1 - Track Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track4, Time] 2 - Track Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track4, Video] 3 - Track ID: 4 +[QuickTime, Track4, Video] 5 - Track Duration: 1.00 s +[QuickTime, Track4, Video] 8 - Track Layer: 0 +[QuickTime, Track4, Video] 9 - Track Volume: 0.00% +[QuickTime, Track4, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track4, Video] 0 - Media Header Version: 0 +[QuickTime, Track4, Time] 1 - Media Create Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track4, Time] 2 - Media Modify Date: 2018:02:21 07:08:56-05:00 +[QuickTime, Track4, Video] 3 - Media Time Scale: 1 +[QuickTime, Track4, Video] 4 - Media Duration: 1.00 s +[QuickTime, Track4, Video] 5 - Media Language Code: eng +[QuickTime, Track4, Video] 8 - Handler Type: NRT Metadata +[QuickTime, Track4, Video] nmhd - Null Media Header: (Binary data 4 bytes) +[QuickTime, Track4, Other] 4 - Meta Format: CTMD +[QuickTime, Track4, Video] stts - Time To Sample Table: (Binary data 16 bytes) +[QuickTime, Track4, Video] stsc - Sample To Chunk: (Binary data 20 bytes) +[QuickTime, Track4, Video] stsz - Sample Sizes: (Binary data 12 bytes) +[QuickTime, Track4, Video] free - Unknown free: +[QuickTime, Track4, Video] co64 - Chunk Offset 64: (Binary data 16 bytes) +[QuickTime, Track4, Video] SampleTime - Sample Time: 0 s +[QuickTime, Track4, Video] SampleDuration - Sample Duration: 1.00 s +[QuickTime, QuickTime, Preview] uuid - Preview Image: (Binary data 26 bytes) +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 41065 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 12190 +[QuickTime, QuickTime, Video] mdat - Media Data: (Binary data 41065 bytes) +[MakerNotes, Canon, Video] CNCV - Compressor Version: CanonCR3_001/00.09.00/00.00.00 +[MakerNotes, Canon, Video] CCDT - Unknown CCDT: (Binary data 16 bytes) +[MakerNotes, Canon, Video] CCDT - Unknown CCDT: (Binary data 16 bytes) +[MakerNotes, Canon, Video] CCDT - Unknown CCDT: (Binary data 16 bytes) +[MakerNotes, Canon, Video] CTBO - Unknown CTBO: (Binary data 84 bytes) +[MakerNotes, Canon, Video] free - Unknown free: +[MakerNotes, Canon, Camera] 1 - Macro Mode: Normal +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Single +[MakerNotes, Canon, Camera] 7 - Focus Mode: AF + MF +[MakerNotes, Canon, Camera] 9 - Record Mode: CR3+JPEG +[MakerNotes, Canon, Camera] 10 - Canon Image Size: Large +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: None +[MakerNotes, Canon, Camera] 13 - Contrast: Normal +[MakerNotes, Canon, Camera] 14 - Saturation: Normal +[MakerNotes, Canon, Camera] 16 - Camera ISO: Auto +[MakerNotes, Canon, Camera] 17 - Metering Mode: Evaluative +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Aperture-priority AE +[MakerNotes, Canon, Camera] 22 - Lens Type: Canon EF-M 15-45mm f/3.5-6.3 IS STM +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 45 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 15 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 3.6 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 23 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: E-TTL +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 0 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 0 +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, Canon, Camera] 46 - SRAW Quality: n/a +[MakerNotes, Canon, Image] 1 - Focal Length: 15 mm +[MakerNotes, Canon, Image] 2 - Focal Plane X Unknown: 25518 +[MakerNotes, Canon, Image] 3 - Focal Plane Y Unknown: 18461 +[MakerNotes, Canon, Camera] 3 - Canon Flash Info: 100 0 0 0 +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 12800 +[MakerNotes, Canon, Image] 3 - Measured EV: 2.75 +[MakerNotes, Canon, Image] 4 - Target Aperture: 3.6 +[MakerNotes, Canon, Image] 5 - Target Exposure Time: 1/81 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: -4/3 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Camera] 12 - Camera Temperature: 38 C +[MakerNotes, Canon, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 21 - F Number: 3.6 +[MakerNotes, Canon, Image] 22 - Exposure Time: 1/70 +[MakerNotes, Canon, Image] 23 - Measured EV 2: 1.625 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 0 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS High-end +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 6 - Canon Image Type: Canon EOS M50 +[MakerNotes, Canon, Camera] 7 - Canon Firmware Version: Firmware Version 1.0.0 +[MakerNotes, Canon, Camera] 9 - Owner Name: +[MakerNotes, Canon, Camera] 16 - Canon Model ID: EOS M50 / Kiss M +[MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 6 113 +[MakerNotes, Canon, Camera] 25 - Canon 0x0019: 1 +[MakerNotes, Canon, Camera] 0 - AF Info Size: 1216 +[MakerNotes, Canon, Camera] 1 - AF Area Mode: Face + Tracking +[MakerNotes, Canon, Camera] 2 - Num AF Points: 143 +[MakerNotes, Canon, Camera] 3 - Valid AF Points: 1 +[MakerNotes, Canon, Image] 4 - Canon Image Width: 6000 +[MakerNotes, Canon, Image] 5 - Canon Image Height: 4000 +[MakerNotes, Canon, Camera] 6 - AF Image Width: 6000 +[MakerNotes, Canon, Camera] 7 - AF Image Height: 4000 +[MakerNotes, Canon, Camera] 8 - AF Area Widths: 337 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Canon, Camera] 9 - AF Area Heights: 299 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Canon, Camera] 10 - AF Area X Positions: 392 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Canon, Camera] 11 - AF Area Y Positions: -327 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Canon, Camera] 12 - AF Points In Focus: 0 +[MakerNotes, Canon, Camera] 13 - AF Points Selected: 0 +[MakerNotes, Canon, Image] 40 - Image Unique ID: 3b7f679f6bf5d5e1b60ca2b2f051a029 +[MakerNotes, Canon, Camera] 51 - Canon 0x0033: 1574403960 3788849265 2996964534 698372592 +[MakerNotes, Canon, Time] 1 - Time Zone: +00:00 +[MakerNotes, Canon, Time] 2 - Time Zone City: London +[MakerNotes, Canon, Time] 3 - Daylight Savings: Off +[MakerNotes, Canon, Camera] 56 - Battery Type: LP-E12 +[MakerNotes, Canon, Camera] 61 - Canon 0x003d: 48 1 1 0 0 0 0 0 0 0 0 1 +[MakerNotes, Canon, Camera] 63 - Canon 0x003f: 17 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Image] 7 - Raw Jpg Size: Large +[MakerNotes, Canon, Image] 9 - WB Bracket Mode: Off +[MakerNotes, Canon, Image] 12 - WB Bracket Value AB: 0 +[MakerNotes, Canon, Image] 13 - WB Bracket Value GM: 0 +[MakerNotes, Canon, Image] 19 - Live View Shooting: On +[MakerNotes, Canon, Image] 20 - Focus Distance Upper: 0.24 m +[MakerNotes, Canon, Image] 21 - Focus Distance Lower: 0.22 m +[MakerNotes, Canon, Image] 23 - Shutter Mode: Electronic First Curtain +[MakerNotes, Canon, Image] 25 - Flash Exposure Lock: Off +[MakerNotes, Canon, Image] 61 - RF Lens Type: n/a +[MakerNotes, Canon, Camera] 149 - Lens Model: EF-M15-45mm f/3.5-6.3 IS STM +[MakerNotes, Canon, Camera] 150 - Internal Serial Number: CG0156580 +[MakerNotes, Canon, Camera] 151 - Dust Removal Data: (Binary data 1024 bytes) +[MakerNotes, Canon, Camera] 0 - Crop Left Margin: 0 +[MakerNotes, Canon, Camera] 1 - Crop Right Margin: 0 +[MakerNotes, Canon, Camera] 2 - Crop Top Margin: 0 +[MakerNotes, Canon, Camera] 3 - Crop Bottom Margin: 0 +[MakerNotes, CanonCustom, Camera] 259 - ISO Expansion: Off +[MakerNotes, CanonCustom, Camera] 264 - Safety Shift: Disable +[MakerNotes, CanonCustom, Camera] 1809 - Shutter Release Without Lens: Disable +[MakerNotes, CanonCustom, Camera] 2068 - Retract Lens On Power Off: Enable +[MakerNotes, CanonCustom, Camera] 1804 - Custom Controls: 0 19 3 10 23 73 71 61 29 0 7 3 4 +[MakerNotes, Canon, Camera] 0 - Aspect Ratio: 3:2 +[MakerNotes, Canon, Camera] 1 - Cropped Image Width: 6000 +[MakerNotes, Canon, Camera] 2 - Cropped Image Height: 4000 +[MakerNotes, Canon, Camera] 3 - Cropped Image Left: 0 +[MakerNotes, Canon, Camera] 4 - Cropped Image Top: 0 +[MakerNotes, Canon, Image] 1 - Tone Curve: Standard +[MakerNotes, Canon, Image] 2 - Sharpness: 4 +[MakerNotes, Canon, Image] 3 - Sharpness Frequency: n/a +[MakerNotes, Canon, Image] 4 - Sensor Red Level: 0 +[MakerNotes, Canon, Image] 5 - Sensor Blue Level: 0 +[MakerNotes, Canon, Image] 6 - White Balance Red: 0 +[MakerNotes, Canon, Image] 7 - White Balance Blue: 0 +[MakerNotes, Canon, Image] 9 - Color Temperature: 5200 +[MakerNotes, Canon, Image] 10 - Picture Style: Auto +[MakerNotes, Canon, Image] 11 - Digital Gain: 0 +[MakerNotes, Canon, Image] 12 - WB Shift AB: 0 +[MakerNotes, Canon, Image] 13 - WB Shift GM: 0 +[MakerNotes, Canon, Camera] 1 - Measured RGGB: 1183 1024 1024 461 +[MakerNotes, Canon, Camera] 180 - Color Space: sRGB +[MakerNotes, Canon, Camera] 208 - VRD Offset: 0 +[MakerNotes, Canon, Image] 1 - Sensor Width: 6288 +[MakerNotes, Canon, Image] 2 - Sensor Height: 4056 +[MakerNotes, Canon, Image] 5 - Sensor Left Border: 276 +[MakerNotes, Canon, Image] 6 - Sensor Top Border: 48 +[MakerNotes, Canon, Image] 7 - Sensor Right Border: 6275 +[MakerNotes, Canon, Image] 8 - Sensor Bottom Border: 4047 +[MakerNotes, Canon, Image] 9 - Black Mask Left Border: 0 +[MakerNotes, Canon, Image] 10 - Black Mask Top Border: 0 +[MakerNotes, Canon, Image] 11 - Black Mask Right Border: 0 +[MakerNotes, Canon, Image] 12 - Black Mask Bottom Border: 0 +[MakerNotes, Canon, Camera] 16392 - Picture Style User Def: Auto; Auto; Auto +[MakerNotes, Canon, Camera] 16393 - Picture Style PC: None; None; None +[MakerNotes, Canon, Camera] 16400 - Custom Picture Style File Name: +[MakerNotes, Canon, Camera] 16401 - Canon 0x4011: [...] +[MakerNotes, Canon, Camera] 16402 - Canon 0x4012: +[MakerNotes, Canon, Camera] 1 - AF Micro Adj Mode: Disable +[MakerNotes, Canon, Camera] 2 - AF Micro Adj Value: 0 +[MakerNotes, Canon, Camera] 5 - Peripheral Lighting Setting: On +[MakerNotes, Canon, Camera] 6 - Chromatic Aberration Setting: On +[MakerNotes, Canon, Camera] 7 - Distortion Correction Setting: Off +[MakerNotes, Canon, Camera] 1 - Peripheral Illumination Corr: Off +[MakerNotes, Canon, Camera] 2 - Auto Lighting Optimizer: Standard +[MakerNotes, Canon, Camera] 3 - Highlight Tone Priority: Off +[MakerNotes, Canon, Camera] 4 - Long Exposure Noise Reduction: Off +[MakerNotes, Canon, Camera] 5 - High ISO Noise Reduction: Standard +[MakerNotes, Canon, Camera] 1 - Ambience Selection: Standard +[MakerNotes, Canon, Camera] 257 - Grainy B/W Filter: Off +[MakerNotes, Canon, Camera] 513 - Soft Focus Filter: Off +[MakerNotes, Canon, Camera] 769 - Toy Camera Filter: Off +[MakerNotes, Canon, Camera] 1025 - Miniature Filter: Off +[MakerNotes, Canon, Camera] 1026 - Miniature Filter Orientation: Horizontal +[MakerNotes, Canon, Camera] 1027 - Miniature Filter Position: 0 +[MakerNotes, Canon, Camera] 1028 - Miniature Filter Parameter: 0 +[MakerNotes, Canon, Camera] 1281 - Fisheye Filter: Off +[MakerNotes, Canon, Camera] 1537 - Painting Filter: Off +[MakerNotes, Canon, Camera] 1793 - Watercolor Filter: Off +[MakerNotes, Canon, Image] 1 - HDR: Off +[MakerNotes, Canon, Image] 2 - HDR Effect: Natural +[MakerNotes, Canon, Camera] 16423 - Canon 0x4027: 24 393984 872415232 0 13684944 131072 +[MakerNotes, Canon, Camera] 16428 - Canon 0x402c: 8 0 +[MakerNotes, Canon, Camera] 16437 - Canon 0x4035: -.‘.;.¥.¨...ådŸÂ"´.0.G.A.Í_7,;¤ N.é;À.:.w9$[...] +[MakerNotes, Canon, Camera] 16439 - Canon 0x4037: €.ª...ô..); +[MakerNotes, Canon, Camera] 16441 - Canon 0x4039: 59 127 103 159 107 245 213 225 182 12 162 178 240 81 160 41 +[MakerNotes, Canon, Camera] 16444 - Canon 0x403c: 12 1 24 +[MakerNotes, Canon, Preview] THMB - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Track2, Image] 8 - Image Width: 1624 +[MakerNotes, Track2, Image] 10 - Image Height: 1080 +[MakerNotes, Track3, Image] 8 - Image Width: 3144 +[MakerNotes, Track3, Image] 10 - Image Height: 4056 +[MakerNotes, Track4, Time] 1 - Time Stamp: 2018:02:21 12:08:56.21 +[MakerNotes, Track4, Image] 0 - Focal Length: 15.0 mm +[MakerNotes, Track4, Image] 0 - F Number: 3.5 +[MakerNotes, Track4, Image] 1 - Exposure Time: 1/80 +[MakerNotes, Track4, Image] 2 - ISO: 12800 +[MakerNotes, Track4, Camera] 1 - Macro Mode: Normal +[MakerNotes, Track4, Camera] 2 - Self Timer: Off +[MakerNotes, Track4, Camera] 3 - Quality: RAW +[MakerNotes, Track4, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Track4, Camera] 5 - Continuous Drive: Single +[MakerNotes, Track4, Camera] 7 - Focus Mode: AF + MF +[MakerNotes, Track4, Camera] 9 - Record Mode: CR3+JPEG +[MakerNotes, Track4, Camera] 10 - Canon Image Size: Large +[MakerNotes, Track4, Camera] 11 - Easy Mode: Manual +[MakerNotes, Track4, Camera] 12 - Digital Zoom: None +[MakerNotes, Track4, Camera] 13 - Contrast: Normal +[MakerNotes, Track4, Camera] 14 - Saturation: Normal +[MakerNotes, Track4, Camera] 16 - Camera ISO: Auto +[MakerNotes, Track4, Camera] 17 - Metering Mode: Evaluative +[MakerNotes, Track4, Camera] 18 - Focus Range: Not Known +[MakerNotes, Track4, Camera] 20 - Canon Exposure Mode: Aperture-priority AE +[MakerNotes, Track4, Camera] 22 - Lens Type: Canon EF-M 15-45mm f/3.5-6.3 IS STM +[MakerNotes, Track4, Camera] 23 - Max Focal Length: 45 mm +[MakerNotes, Track4, Camera] 24 - Min Focal Length: 15 mm +[MakerNotes, Track4, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Track4, Camera] 26 - Max Aperture: 3.6 +[MakerNotes, Track4, Camera] 27 - Min Aperture: 23 +[MakerNotes, Track4, Camera] 28 - Flash Activity: 0 +[MakerNotes, Track4, Camera] 29 - Flash Bits: E-TTL +[MakerNotes, Track4, Camera] 36 - Zoom Source Width: 0 +[MakerNotes, Track4, Camera] 37 - Zoom Target Width: 0 +[MakerNotes, Track4, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Track4, Camera] 42 - Color Tone: Normal +[MakerNotes, Track4, Camera] 46 - SRAW Quality: n/a +[MakerNotes, Track4, Image] 1 - Auto ISO: 100 +[MakerNotes, Track4, Image] 2 - Base ISO: 12800 +[MakerNotes, Track4, Image] 3 - Measured EV: 2.75 +[MakerNotes, Track4, Image] 4 - Target Aperture: 3.6 +[MakerNotes, Track4, Image] 5 - Target Exposure Time: 1/81 +[MakerNotes, Track4, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Track4, Image] 7 - White Balance: Auto +[MakerNotes, Track4, Image] 8 - Slow Shutter: None +[MakerNotes, Track4, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Track4, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Track4, Camera] 12 - Camera Temperature: 38 C +[MakerNotes, Track4, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Track4, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Track4, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Track4, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Track4, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Track4, Image] 21 - F Number: 3.6 +[MakerNotes, Track4, Image] 22 - Exposure Time: 1/70 +[MakerNotes, Track4, Image] 23 - Measured EV 2: 1.625 +[MakerNotes, Track4, Image] 24 - Bulb Duration: 0 +[MakerNotes, Track4, Camera] 26 - Camera Type: EOS High-end +[MakerNotes, Track4, Image] 27 - Auto Rotate: None +[MakerNotes, Track4, Image] 28 - ND Filter: n/a +[MakerNotes, Track4, Camera] 0 - AF Info Size: 1216 +[MakerNotes, Track4, Camera] 1 - AF Area Mode: Face + Tracking +[MakerNotes, Track4, Camera] 2 - Num AF Points: 143 +[MakerNotes, Track4, Camera] 3 - Valid AF Points: 1 +[MakerNotes, Track4, Image] 4 - Canon Image Width: 6000 +[MakerNotes, Track4, Image] 5 - Canon Image Height: 4000 +[MakerNotes, Track4, Camera] 6 - AF Image Width: 6000 +[MakerNotes, Track4, Camera] 7 - AF Image Height: 4000 +[MakerNotes, Track4, Camera] 8 - AF Area Widths: 337 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Track4, Camera] 9 - AF Area Heights: 299 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Track4, Camera] 10 - AF Area X Positions: 392 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Track4, Camera] 11 - AF Area Y Positions: -327 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Track4, Camera] 12 - AF Points In Focus: 0 +[MakerNotes, Track4, Camera] 13 - AF Points Selected: 0 +[MakerNotes, Track4, Image] 3 - Bracket Mode: Off +[MakerNotes, Track4, Image] 4 - Bracket Value: 0 +[MakerNotes, Track4, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Track4, Image] 7 - Raw Jpg Size: Large +[MakerNotes, Track4, Image] 9 - WB Bracket Mode: Off +[MakerNotes, Track4, Image] 12 - WB Bracket Value AB: 0 +[MakerNotes, Track4, Image] 13 - WB Bracket Value GM: 0 +[MakerNotes, Track4, Image] 19 - Live View Shooting: On +[MakerNotes, Track4, Image] 20 - Focus Distance Upper: 0.24 m +[MakerNotes, Track4, Image] 21 - Focus Distance Lower: 0.22 m +[MakerNotes, Track4, Image] 23 - Shutter Mode: Electronic First Curtain +[MakerNotes, Track4, Image] 25 - Flash Exposure Lock: Off +[MakerNotes, Track4, Image] 61 - RF Lens Type: n/a +[MakerNotes, Track4, Image] 1 - Tone Curve: Standard +[MakerNotes, Track4, Image] 2 - Sharpness: 4 +[MakerNotes, Track4, Image] 3 - Sharpness Frequency: n/a +[MakerNotes, Track4, Image] 4 - Sensor Red Level: 0 +[MakerNotes, Track4, Image] 5 - Sensor Blue Level: 0 +[MakerNotes, Track4, Image] 6 - White Balance Red: 0 +[MakerNotes, Track4, Image] 7 - White Balance Blue: 0 +[MakerNotes, Track4, Image] 9 - Color Temperature: 5200 +[MakerNotes, Track4, Image] 10 - Picture Style: Auto +[MakerNotes, Track4, Image] 11 - Digital Gain: 0 +[MakerNotes, Track4, Image] 12 - WB Shift AB: 0 +[MakerNotes, Track4, Image] 13 - WB Shift GM: 0 +[MakerNotes, Track4, Camera] 5 - Peripheral Lighting Setting: On +[MakerNotes, Track4, Camera] 6 - Chromatic Aberration Setting: On +[MakerNotes, Track4, Camera] 7 - Distortion Correction Setting: Off +[MakerNotes, Track4, Camera] 0 - Color Data Version: 16 (M50) +[MakerNotes, Track4, Camera] 71 - WB RGGB Levels As Shot: 1104 1024 1024 1789 +[MakerNotes, Track4, Camera] 75 - Color Temp As Shot: 3284 +[MakerNotes, Track4, Camera] 76 - WB RGGB Levels Auto: 1104 1024 1024 1789 +[MakerNotes, Track4, Camera] 80 - Color Temp Auto: 3284 +[MakerNotes, Track4, Camera] 81 - WB RGGB Levels Measured: 1104 1024 1024 1789 +[MakerNotes, Track4, Camera] 85 - Color Temp Measured: 3284 +[MakerNotes, Track4, Camera] 86 - WB RGGB Levels Unknown: 1104 1024 1024 1789 +[MakerNotes, Track4, Camera] 90 - Color Temp Unknown: 3284 +[MakerNotes, Track4, Camera] 91 - WB RGGB Levels Unknown 2: 1111 1024 1024 1786 +[MakerNotes, Track4, Camera] 95 - Color Temp Unknown 2: 3303 +[MakerNotes, Track4, Camera] 96 - WB RGGB Levels Unknown 3: 1111 1024 1024 1780 +[MakerNotes, Track4, Camera] 100 - Color Temp Unknown 3: 3307 +[MakerNotes, Track4, Camera] 101 - WB RGGB Levels Unknown 4: 1104 1024 1024 1789 +[MakerNotes, Track4, Camera] 105 - Color Temp Unknown 4: 3284 +[MakerNotes, Track4, Camera] 106 - WB RGGB Levels Unknown 5: 1104 1024 1024 1789 +[MakerNotes, Track4, Camera] 110 - Color Temp Unknown 5: 3284 +[MakerNotes, Track4, Camera] 111 - WB RGGB Levels Unknown 6: 1104 1024 1024 1789 +[MakerNotes, Track4, Camera] 115 - Color Temp Unknown 6: 3284 +[MakerNotes, Track4, Camera] 116 - WB RGGB Levels Unknown 7: 1104 1024 1024 1789 +[MakerNotes, Track4, Camera] 120 - Color Temp Unknown 7: 3284 +[MakerNotes, Track4, Camera] 121 - WB RGGB Levels Unknown 8: 1104 1024 1024 1789 +[MakerNotes, Track4, Camera] 125 - Color Temp Unknown 8: 3284 +[MakerNotes, Track4, Camera] 126 - WB RGGB Levels Unknown 9: 962 1024 1022 2009 +[MakerNotes, Track4, Camera] 130 - Color Temp Unknown 9: 2831 +[MakerNotes, Track4, Camera] 131 - WB RGGB Levels Unknown 10: 962 1024 1022 2009 +[MakerNotes, Track4, Camera] 135 - Color Temp Unknown 10: 2831 +[MakerNotes, Track4, Camera] 136 - WB RGGB Levels Daylight: 1549 1024 1024 1316 +[MakerNotes, Track4, Camera] 140 - Color Temp Daylight: 5200 +[MakerNotes, Track4, Camera] 141 - WB RGGB Levels Shade: 1792 1024 1024 1147 +[MakerNotes, Track4, Camera] 145 - Color Temp Shade: 7000 +[MakerNotes, Track4, Camera] 146 - WB RGGB Levels Cloudy: 1670 1024 1024 1229 +[MakerNotes, Track4, Camera] 150 - Color Temp Cloudy: 6000 +[MakerNotes, Track4, Camera] 151 - WB RGGB Levels Tungsten: 1104 1024 1024 1879 +[MakerNotes, Track4, Camera] 155 - Color Temp Tungsten: 3200 +[MakerNotes, Track4, Camera] 156 - WB RGGB Levels Fluorescent: 1303 1024 1024 1771 +[MakerNotes, Track4, Camera] 160 - Color Temp Fluorescent: 3687 +[MakerNotes, Track4, Camera] 161 - WB RGGB Levels Kelvin: 1549 1024 1024 1316 +[MakerNotes, Track4, Camera] 165 - Color Temp Kelvin: 5200 +[MakerNotes, Track4, Camera] 166 - WB RGGB Levels Flash: 1697 1024 1024 1218 +[MakerNotes, Track4, Camera] 170 - Color Temp Flash: 6166 +[MakerNotes, Track4, Camera] 171 - WB RGGB Levels Unknown 11: 1547 1024 1024 1316 +[MakerNotes, Track4, Camera] 175 - Color Temp Unknown 11: 5190 +[MakerNotes, Track4, Camera] 176 - WB RGGB Levels Unknown 12: 8191 1024 1024 8191 +[MakerNotes, Track4, Camera] 180 - Color Temp Unknown 12: 4441 +[MakerNotes, Track4, Camera] 181 - WB RGGB Levels Unknown 13: 8191 1024 1024 8191 +[MakerNotes, Track4, Camera] 185 - Color Temp Unknown 13: 4441 +[MakerNotes, Track4, Camera] 186 - WB RGGB Levels Unknown 14: 8191 1024 1024 8191 +[MakerNotes, Track4, Camera] 190 - Color Temp Unknown 14: 4441 +[MakerNotes, Track4, Camera] 191 - WB RGGB Levels Unknown 15: 8191 1024 1024 8191 +[MakerNotes, Track4, Camera] 195 - Color Temp Unknown 15: 4441 +[MakerNotes, Track4, Camera] 196 - WB RGGB Levels Unknown 16: 1547 1024 1024 1316 +[MakerNotes, Track4, Camera] 200 - Color Temp Unknown 16: 5190 +[MakerNotes, Track4, Camera] 201 - WB RGGB Levels Unknown 17: 8191 1024 1024 8191 +[MakerNotes, Track4, Camera] 205 - Color Temp Unknown 17: 4441 +[MakerNotes, Track4, Camera] 206 - WB RGGB Levels Unknown 18: 8191 1024 1024 8191 +[MakerNotes, Track4, Camera] 210 - Color Temp Unknown 18: 4441 +[MakerNotes, Track4, Camera] 211 - WB RGGB Levels Unknown 19: 8191 1024 1024 8191 +[MakerNotes, Track4, Camera] 215 - Color Temp Unknown 19: 4441 +[MakerNotes, Track4, Camera] 216 - WB RGGB Levels Unknown 20: 8191 1024 1024 8191 +[MakerNotes, Track4, Camera] 220 - Color Temp Unknown 20: 4441 +[MakerNotes, Track4, Camera] 221 - WB RGGB Levels Unknown 21: 967 1024 1024 2081 +[MakerNotes, Track4, Camera] 225 - Color Temp Unknown 21: 2792 +[MakerNotes, Track4, Camera] 226 - WB RGGB Levels Unknown 22: 967 1024 1024 2081 +[MakerNotes, Track4, Camera] 230 - Color Temp Unknown 22: 2792 +[MakerNotes, Track4, Camera] 231 - WB RGGB Levels Unknown 23: 967 1024 1024 2081 +[MakerNotes, Track4, Camera] 235 - Color Temp Unknown 23: 2792 +[MakerNotes, Track4, Camera] 236 - WB RGGB Levels Unknown 24: 968 1024 1024 2048 +[MakerNotes, Track4, Camera] 240 - Color Temp Unknown 24: 2815 +[MakerNotes, Track4, Camera] 241 - WB RGGB Levels Unknown 25: 967 1024 1024 2044 +[MakerNotes, Track4, Camera] 245 - Color Temp Unknown 25: 2815 +[MakerNotes, Track4, Camera] 246 - WB RGGB Levels Unknown 26: 967 1024 1024 2081 +[MakerNotes, Track4, Camera] 250 - Color Temp Unknown 26: 2792 +[MakerNotes, Track4, Camera] 251 - WB RGGB Levels Unknown 27: 967 1024 1024 2081 +[MakerNotes, Track4, Camera] 255 - Color Temp Unknown 27: 2792 +[MakerNotes, Track4, Camera] 256 - WB RGGB Levels Unknown 28: 958 1024 1024 2106 +[MakerNotes, Track4, Camera] 260 - Color Temp Unknown 28: 2759 +[MakerNotes, Track4, Camera] 261 - WB RGGB Levels Unknown 29: 906 1024 1022 2180 +[MakerNotes, Track4, Camera] 265 - Color Temp Unknown 29: 2618 +[MakerNotes, Track4, Camera] 0 - Camera Color Calibration 01: -311 513 1064 (10900K) +[MakerNotes, Track4, Camera] 4 - Camera Color Calibration 02: -292 525 1039 (10000K) +[MakerNotes, Track4, Camera] 8 - Camera Color Calibration 03: -245 551 978 (8300K) +[MakerNotes, Track4, Camera] 12 - Camera Color Calibration 04: -191 585 914 (7000K) +[MakerNotes, Track4, Camera] 16 - Camera Color Calibration 05: -131 628 853 (6000K) +[MakerNotes, Track4, Camera] 20 - Camera Color Calibration 06: -102 649 825 (5600K) +[MakerNotes, Track4, Camera] 24 - Camera Color Calibration 07: -70 677 797 (5200K) +[MakerNotes, Track4, Camera] 28 - Camera Color Calibration 08: -18 717 747 (4700K) +[MakerNotes, Track4, Camera] 32 - Camera Color Calibration 09: 44 766 691 (4200K) +[MakerNotes, Track4, Camera] 36 - Camera Color Calibration 10: 105 821 640 (3800K) +[MakerNotes, Track4, Camera] 40 - Camera Color Calibration 11: 162 879 601 (3500K) +[MakerNotes, Track4, Camera] 44 - Camera Color Calibration 12: 226 950 558 (3200K) +[MakerNotes, Track4, Camera] 48 - Camera Color Calibration 13: 275 1007 526 (3000K) +[MakerNotes, Track4, Camera] 52 - Camera Color Calibration 14: 325 1075 499 (2800K) +[MakerNotes, Track4, Camera] 56 - Camera Color Calibration 15: 435 1251 453 (2400K) +[MakerNotes, Track4, Camera] 329 - Per Channel Black Level: 2049 2045 2045 2050 +[MakerNotes, Track4, Camera] 796 - Normal White Level: 13035 +[MakerNotes, Track4, Camera] 797 - Specular White Level: 14338 +[MakerNotes, Track4, Camera] 798 - Linearity Upper Margin: 10025 +[MakerNotes, Track4, Camera] 16389 - Flavor: (Binary data 32476 bytes) +[MakerNotes, Track4, Camera] 1473 - Firmware Version: 1.0.0 +[MakerNotes, Track4, Camera] 0 - Vignetting Corr Version: 32 +[MakerNotes, Track4, Camera] 16435 - Canon 0x4033: [...] +[MakerNotes, Track4, Camera] 16430 - Canon 0x402e: ."..@.þÿ.þñ?...,I“À[...] +[EXIF, IFD0, Image] 256 - Image Width: 6000 +[EXIF, IFD0, Image] 257 - Image Height: 4000 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD0, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS M50 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2018:02:21 12:08:56 +[EXIF, IFD0, Author] 315 - Artist: +[EXIF, IFD0, Author] 33432 - Copyright: +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/80 +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 12800 +[EXIF, ExifIFD, Image] 34864 - Sensitivity Type: Recommended Exposure Index +[EXIF, ExifIFD, Image] 34866 - Recommended Exposure Index: 12800 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0231 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2018:02:21 12:08:56 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2018:02:21 12:08:56 +[EXIF, ExifIFD, Time] 36880 - Offset Time: +00:00 +[EXIF, ExifIFD, Time] 36881 - Offset Time Original: +00:00 +[EXIF, ExifIFD, Time] 36882 - Offset Time Digitized: +00:00 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/83 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: -1.3 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 15.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Time] 37520 - Sub Sec Time: 21 +[EXIF, ExifIFD, Time] 37521 - Sub Sec Time Original: 21 +[EXIF, ExifIFD, Time] 37522 - Sub Sec Time Digitized: 21 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 6000 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 4000 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 6514.65798 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 6734.006734 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Image] 42032 - Owner Name: +[EXIF, ExifIFD, Image] 42033 - Serial Number: 613040000565 +[EXIF, ExifIFD, Image] 42034 - Lens Info: 15-45mm f/0 +[EXIF, ExifIFD, Image] 42036 - Lens Model: EF-M15-45mm f/3.5-6.3 IS STM +[EXIF, ExifIFD, Image] 42037 - Lens Serial Number: 0000000000 +[EXIF, GPS, Location] 0 - GPS Version ID: 2.3.0.0 +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-dc, Image] subject - Subject: CR3 test +[XMP, XMP-exif, Image] ExposureBiasValue - Exposure Compensation: -1.3 +[XMP, XMP-xmp, Image] Rating - Rating: 0 +[Composite, Composite, Camera] Canon-ConditionalFEC - Flash Exposure Compensation: 0 +[Composite, Composite, Camera] Canon-DriveMode - Drive Mode: Single-frame Shooting +[Composite, Composite, Camera] Canon-FlashType - Flash Type: Built-In Flash +[Composite, Composite, Camera] Canon-ISO - ISO: 12800 +[Composite, Composite, Camera] Canon-Lens - Lens: 15.0 - 45.0 mm +[Composite, Composite, Camera] Canon-RedEyeReduction - Red Eye Reduction: Off +[Composite, Composite, Camera] Canon-ShootingMode - Shooting Mode: Aperture-priority AE +[Composite, Composite, Camera] Canon-ShutterCurtainHack - Shutter Curtain Sync: 1st-curtain sync +[Composite, Composite, Camera] Canon-WB_RGGBLevels - WB RGGB Levels: 1104 1024 1024 1789 +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/80 +[Composite, Composite, Time] Exif-SubSecCreateDate - Create Date: 2018:02:21 12:08:56.21+00:00 +[Composite, Composite, Time] Exif-SubSecDateTimeOriginal - Date/Time Original: 2018:02:21 12:08:56.21+00:00 +[Composite, Composite, Time] Exif-SubSecModifyDate - Modify Date: 2018:02:21 12:08:56.21+00:00 +[Composite, Composite, Video] QuickTime-AvgBitrate - Avg Bitrate: 329 kbps +[Composite, Composite, Video] QuickTime-Rotation - Rotation: 0 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.74707 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 6000x4000 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Canon EF-M 15-45mm f/3.5-6.3 IS STM +[Composite, Composite, Image] Exif-LightValue - Light Value: 2.9 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 24.0 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 1.078125 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.6 +[Composite, Composite, Camera] Canon-Lens35efl - Lens: 15.0 - 45.0 mm (35 mm equivalent: 23.3 - 69.9 mm) +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.019 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: 0.03 m (0.22 - 0.25 m) +[Composite, Composite, Image] Exif-FOV - Field Of View: 75.3 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 15.0 mm (35 mm equivalent: 23.3 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 3.33 m diff --git a/t/CanonVRD.t b/t/CanonVRD.t new file mode 100644 index 0000000..4a1eff9 --- /dev/null +++ b/t/CanonVRD.t @@ -0,0 +1,232 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/CanonVRD.t". + +BEGIN { + $| = 1; print "1..24\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::CanonVRD; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'CanonVRD'; +my $testnum = 1; + +# short list of tags to check in tests +my @checkTags = qw(FileSize Warning VRDVersion VRDOffset); +my @checkDR4 = qw(FileSize Warning GammaBlackPoint RedHSL GreenHSL SharpnessAdjOn); + +# test 2: Extract information from CanonVRD.vrd +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/CanonVRD.vrd'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Test writing some information +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/ExifTool.jpg'); + $exifTool->SetNewValue('xmp:*'); + my $testfile = "t/${testname}_${testnum}_failed.vrd"; + unlink $testfile; + $exifTool->WriteInfo('t/images/CanonVRD.vrd', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# tests 4-8: Write CanonVRD as a block to various images +{ + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/CanonVRD.vrd', 'CanonVRD'); + $exifTool->Options(PrintConv => 0); + my ($file, $ext); + foreach $file (qw(Writer.jpg ExifTool.jpg CanonRaw.cr2 CanonRaw.crw CanonVRD.vrd)) { + ++$testnum; + if ($file eq 'CanonVRD.vrd') { + $exifTool->SetNewValuesFromFile('t/images/ExifTool.jpg', 'CanonVRD'); + } + ($ext = $file) =~ s/^\w+//; + my $testfile = "t/${testname}_${testnum}_failed$ext"; + unlink $testfile; + $exifTool->WriteInfo("t/images/$file", $testfile); + my $info = $exifTool->ImageInfo($testfile, @checkTags); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + } +} + +# test 9: Delete VRD as a block +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue(CanonVRD => undef, Protected => 1); + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->WriteInfo('t/images/ExifTool.jpg', $testfile); + $exifTool->Options(PrintConv => 0); + my $info = $exifTool->ImageInfo($testfile, @checkTags); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 10: Create a VRD file from scratch +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/ExifTool.jpg', 'CanonVRD'); + $exifTool->Options(PrintConv => 0); + my $testfile = "t/${testname}_${testnum}_failed.vrd"; + unlink $testfile; + $exifTool->WriteInfo(undef, $testfile); + my $info = $exifTool->ImageInfo($testfile, @checkTags); + if (check($exifTool, $info, $testname, $testnum, 8)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 11-12: Add XMP to a VRD file +{ + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue('XMP:Title', 'XMP in VRD test'); + my $srcfile; + foreach $srcfile ('t/images/CanonVRD.vrd', undef) { + ++$testnum; + my $testfile = "t/${testname}_${testnum}_failed.vrd"; + unlink $testfile; + $exifTool->WriteInfo($srcfile, $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + } +} + +# test 13: Extract information from CanonVRD.dr4 +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/CanonVRD.dr4'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 14: Test writing to DR4 +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(PrintConv => 0); + $exifTool->SetNewValue(CropX => 123); + $exifTool->SetNewValue(SharpnessAdjOn => 0); + $exifTool->SetNewValue(RedHSL => '-4.3 1.2 3.8'); + $exifTool->SetNewValue('CanonVRD:GammaBlackPoint' => '1.234'); + my $testfile = "t/${testname}_${testnum}_failed.dr4"; + unlink $testfile; + $exifTool->WriteInfo('t/images/CanonVRD.dr4', $testfile); + my $info = $exifTool->ImageInfo($testfile, '-filename'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# tests 15-21: Write CanonDR4 as a block to various images +{ + my $exifTool = new Image::ExifTool; + my $srcfile = "t/${testname}_14_failed.dr4"; + $exifTool->SetNewValuesFromFile($srcfile, 'CanonDR4'); + $exifTool->Options(PrintConv => 0); + my ($file, $ext); + foreach $file (qw(Writer.jpg ExifTool.jpg CanonRaw.cr2 CanonRaw.crw CanonVRD.vrd CanonVRD.dr4 CanonRaw.cr3)) { + ++$testnum; + ($ext = $file) =~ s/^\w+//; + my $testfile = "t/${testname}_${testnum}_failed$ext"; + unlink $testfile; + $exifTool->WriteInfo("t/images/$file", $testfile); + my $info = $exifTool->ImageInfo($testfile, @checkDR4); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile unless $testnum == 15 or $testnum == 17 or $testnum == 21; + unlink $srcfile if $testnum == 20; + } else { + print 'not '; + } + print "ok $testnum\n"; + } +} + +# test 22: Delete DR4(VRD) as a block +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $srcfile = "t/${testname}_15_failed.jpg"; + $exifTool->SetNewValue(CanonDR4 => undef, Protected => 1); + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->WriteInfo($srcfile, $testfile); + $exifTool->Options(PrintConv => 0); + my $info = $exifTool->ImageInfo($testfile, @checkDR4); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + unlink $srcfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 23: Create a DR4 file from scratch +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(PrintConv => 0); + my $srcfile = "t/${testname}_17_failed.cr2"; + $exifTool->SetNewValuesFromFile($srcfile, 'CanonDR4'); + my $testfile = "t/${testname}_${testnum}_failed.dr4"; + unlink $testfile; + $exifTool->WriteInfo(undef, $testfile); + my $info = $exifTool->ImageInfo($testfile, '-filename'); + if (check($exifTool, $info, $testname, $testnum, 14)) { + unlink $testfile; + unlink $srcfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 24: Edit DR4 information in CR3 image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my @writeInfo = ( ['CanonVRD:GammaBlackPoint' => 1.5] ); + my $srcfile = "t/${testname}_21_failed.cr3"; + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, $srcfile, \@checkDR4); + print "ok $testnum\n"; + unlink $srcfile; +} + +# end diff --git a/t/CanonVRD_11.out b/t/CanonVRD_11.out new file mode 100644 index 0000000..b802164 --- /dev/null +++ b/t/CanonVRD_11.out @@ -0,0 +1,121 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: CanonVRD_11_failed.vrd +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 4.6 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:33-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:33-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:33-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: VRD +[File, File, Other] FileTypeExtension - File Type Extension: vrd +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[CanonVRD, CanonVRD, Image] 2 - VRD Version: 2.0.0 +[CanonVRD, CanonVRD, Image] 6 - WB Adj RGGB Levels: 1856 832 832 928 +[CanonVRD, CanonVRD, Image] 24 - White Balance Adj: Manual (Click) +[CanonVRD, CanonVRD, Image] 26 - WB Adj Color Temp: 5600 +[CanonVRD, CanonVRD, Image] 36 - WB Fine Tune Active: Yes +[CanonVRD, CanonVRD, Image] 40 - WB Fine Tune Saturation: 0 +[CanonVRD, CanonVRD, Image] 44 - WB Fine Tune Tone: 358 +[CanonVRD, CanonVRD, Image] 46 - Raw Color Adj: Shot Settings +[CanonVRD, CanonVRD, Image] 48 - Raw Custom Saturation: 0 +[CanonVRD, CanonVRD, Image] 52 - Raw Custom Tone: 0 +[CanonVRD, CanonVRD, Image] 56 - Raw Brightness Adj: -0.83 +[CanonVRD, CanonVRD, Image] 60 - Tone Curve Property: Shot Settings +[CanonVRD, CanonVRD, Image] 122 - Dynamic Range Min: 0 +[CanonVRD, CanonVRD, Image] 124 - Dynamic Range Max: 4095 +[CanonVRD, CanonVRD, Image] 272 - Tone Curve Active: Yes +[CanonVRD, CanonVRD, Image] 275 - Tone Curve Mode: RGB +[CanonVRD, CanonVRD, Image] 276 - Brightness Adj: 0 +[CanonVRD, CanonVRD, Image] 277 - Contrast Adj: 0 +[CanonVRD, CanonVRD, Image] 278 - Saturation Adj: 119 +[CanonVRD, CanonVRD, Image] 286 - Color Tone Adj: 0 +[CanonVRD, CanonVRD, Image] 294 - Luminance Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 336 - Luminance Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 345 - Tone Curve Interpolation: Curve +[CanonVRD, CanonVRD, Image] 352 - Red Curve Points: (0,0) (5,16) (11,30) (58,101) (106,154) (154,198) (202,233) (228,246) (255,255) +[CanonVRD, CanonVRD, Image] 394 - Red Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 410 - Green Curve Points: (7,4) (11,23) (16,34) (59,100) (104,147) (149,187) (196,219) (221,232) (248,240) +[CanonVRD, CanonVRD, Image] 452 - Green Curve Limits: 248 7 240 4 +[CanonVRD, CanonVRD, Image] 468 - Blue Curve Points: (0,0) (5,19) (10,32) (57,104) (104,156) (152,199) (200,233) (227,247) (255,255) +[CanonVRD, CanonVRD, Image] 510 - Blue Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 526 - RGB Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 568 - RGB Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 580 - Crop Active: Yes +[CanonVRD, CanonVRD, Image] 582 - Crop Left: 1164 +[CanonVRD, CanonVRD, Image] 584 - Crop Top: 608 +[CanonVRD, CanonVRD, Image] 586 - Crop Width: 564 +[CanonVRD, CanonVRD, Image] 588 - Crop Height: 123 +[CanonVRD, CanonVRD, Image] 602 - Sharpness Adj: 0 +[CanonVRD, CanonVRD, Image] 608 - Crop Aspect Ratio: Free +[CanonVRD, CanonVRD, Image] 610 - Constrained Crop Width: 5.5 +[CanonVRD, CanonVRD, Image] 614 - Constrained Crop Height: 1.2 +[CanonVRD, CanonVRD, Image] 618 - Check Mark: 3 +[CanonVRD, CanonVRD, Image] 622 - Rotation: 0 +[CanonVRD, CanonVRD, Image] 624 - Work Color Space: ColorMatch RGB +[CanonVRD, CanonVRD, Image] 2 - Picture Style: Standard +[CanonVRD, CanonVRD, Image] 3 - Is Custom Picture Style: No +[CanonVRD, CanonVRD, Image] 13 - Standard Raw Color Tone: -4 +[CanonVRD, CanonVRD, Image] 14 - Standard Raw Saturation: 0 +[CanonVRD, CanonVRD, Image] 15 - Standard Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 16 - Standard Raw Linear: No +[CanonVRD, CanonVRD, Image] 17 - Standard Raw Sharpness: 1 +[CanonVRD, CanonVRD, Image] 18 - Standard Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 19 - Standard Raw Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 20 - Standard Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 21 - Standard Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 22 - Portrait Raw Color Tone: 4 +[CanonVRD, CanonVRD, Image] 23 - Portrait Raw Saturation: 2 +[CanonVRD, CanonVRD, Image] 24 - Portrait Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 25 - Portrait Raw Linear: No +[CanonVRD, CanonVRD, Image] 26 - Portrait Raw Sharpness: 7 +[CanonVRD, CanonVRD, Image] 27 - Portrait Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 28 - Portrait Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 29 - Portrait Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 30 - Portrait Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 31 - Landscape Raw Color Tone: 4 +[CanonVRD, CanonVRD, Image] 32 - Landscape Raw Saturation: 2 +[CanonVRD, CanonVRD, Image] 33 - Landscape Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 34 - Landscape Raw Linear: No +[CanonVRD, CanonVRD, Image] 35 - Landscape Raw Sharpness: 7 +[CanonVRD, CanonVRD, Image] 36 - Landscape Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 37 - Landscape Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 38 - Landscape Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 39 - Landscape Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 40 - Neutral Raw Color Tone: 4 +[CanonVRD, CanonVRD, Image] 41 - Neutral Raw Saturation: 2 +[CanonVRD, CanonVRD, Image] 42 - Neutral Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 43 - Neutral Raw Linear: No +[CanonVRD, CanonVRD, Image] 44 - Neutral Raw Sharpness: 7 +[CanonVRD, CanonVRD, Image] 45 - Neutral Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 46 - Neutral Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 47 - Neutral Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 48 - Neutral Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 49 - Faithful Raw Color Tone: 4 +[CanonVRD, CanonVRD, Image] 50 - Faithful Raw Saturation: 2 +[CanonVRD, CanonVRD, Image] 51 - Faithful Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 52 - Faithful Raw Linear: No +[CanonVRD, CanonVRD, Image] 53 - Faithful Raw Sharpness: 7 +[CanonVRD, CanonVRD, Image] 54 - Faithful Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 55 - Faithful Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 56 - Faithful Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 57 - Faithful Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 58 - Monochrome Filter Effect: Yellow +[CanonVRD, CanonVRD, Image] 59 - Monochrome Toning Effect: Purple +[CanonVRD, CanonVRD, Image] 60 - Monochrome Contrast: 3 +[CanonVRD, CanonVRD, Image] 61 - Monochrome Linear: No +[CanonVRD, CanonVRD, Image] 62 - Monochrome Sharpness: 4 +[CanonVRD, CanonVRD, Image] 63 - Monochrome Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 64 - Monochrome Raw Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 65 - Monochrome Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 66 - Monochrome Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 76 - Custom Color Tone: 4 +[CanonVRD, CanonVRD, Image] 77 - Custom Saturation: 2 +[CanonVRD, CanonVRD, Image] 78 - Custom Contrast: 0 +[CanonVRD, CanonVRD, Image] 79 - Custom Linear: No +[CanonVRD, CanonVRD, Image] 80 - Custom Sharpness: 7 +[CanonVRD, CanonVRD, Image] 81 - Custom Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 82 - Custom Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 83 - Custom Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 84 - Custom Output Shadow Point: 0 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-dc, Image] title - Title: XMP in VRD test diff --git a/t/CanonVRD_12.out b/t/CanonVRD_12.out new file mode 100644 index 0000000..fed3bd7 --- /dev/null +++ b/t/CanonVRD_12.out @@ -0,0 +1,13 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: CanonVRD_12_failed.vrd +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 3.0 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:33-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:33-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:33-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: VRD +[File, File, Other] FileTypeExtension - File Type Extension: vrd +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-dc, Image] title - Title: XMP in VRD test diff --git a/t/CanonVRD_13.out b/t/CanonVRD_13.out new file mode 100644 index 0000000..4c358ff --- /dev/null +++ b/t/CanonVRD_13.out @@ -0,0 +1,102 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: CanonVRD.dr4 +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 5.5 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2015:05:18 15:43:16-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:33-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: DR4 +[File, File, Other] FileTypeExtension - File Type Extension: dr4 +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[CanonVRD, CanonVRD, Image] 3 - DR4 Camera Model: EOS 7D Mark II +[CanonVRD, CanonVRD, Image] 65538 - Rotation: 0 +[CanonVRD, CanonVRD, Image] 65539 - Angle Adj: 13.08 +[CanonVRD, CanonVRD, Image] 65793 - Check Mark: Clear +[CanonVRD, CanonVRD, Image] 66048 - Work Color Space: Wide Gamut RGB +[CanonVRD, CanonVRD, Image] 131073 - Raw Brightness Adj: 0 +[CanonVRD, CanonVRD, Image] 131329 - White Balance Adj: Cloudy +[CanonVRD, CanonVRD, Image] 131330 - WB Adj Color Temp: 5200 +[CanonVRD, CanonVRD, Image] 131333 - WB Adj Magenta Green: -5 +[CanonVRD, CanonVRD, Image] 131334 - WB Adj Blue Amber: 3 +[CanonVRD, CanonVRD, Image] 131584 - Gamma Linear: No +[CanonVRD, CanonVRD, Image] 131841 - Picture Style: Neutral +[CanonVRD, CanonVRD, Image] 131843 - Contrast Adj: -1 +[CanonVRD, CanonVRD, Image] 131844 - Color Tone Adj: 0.7 +[CanonVRD, CanonVRD, Image] 131845 - Color Saturation Adj: 1.6 +[CanonVRD, CanonVRD, Image] 131846 - Monochrome Toning Effect: None +[CanonVRD, CanonVRD, Image] 131847 - Monochrome Filter Effect: None +[CanonVRD, CanonVRD, Image] 131848 - Unsharp Mask Strength: 3 +[CanonVRD, CanonVRD, Image] 131849 - Unsharp Mask Fineness: 2 +[CanonVRD, CanonVRD, Image] 131850 - Unsharp Mask Threshold: 7.2 +[CanonVRD, CanonVRD, Image] 131851 - Shadow Adj: -0.1 +[CanonVRD, CanonVRD, Image] 131852 - Highlight Adj: 0.5 +[CanonVRD, CanonVRD, Image] 0 - Tone Curve Color Space: Luminance +[CanonVRD, CanonVRD, Image] 1 - Tone Curve Shape: Straight +[CanonVRD, CanonVRD, Image] 3 - Tone Curve Input Range: 0 242 +[CanonVRD, CanonVRD, Image] 5 - Tone Curve Output Range: 79 255 +[CanonVRD, CanonVRD, Image] 7 - RGB Curve Points: (0,79) (117,172) (242,255) +[CanonVRD, CanonVRD, Image] 10 - Tone Curve X: 117 +[CanonVRD, CanonVRD, Image] 11 - Tone Curve Y: 172 +[CanonVRD, CanonVRD, Image] 45 - Red Curve Points: (2,3) (126,116) (254,253) +[CanonVRD, CanonVRD, Image] 83 - Green Curve Points: (1,2) (125,139) (254,253) +[CanonVRD, CanonVRD, Image] 121 - Blue Curve Points: (3,4) (132,113) (255,255) +[CanonVRD, CanonVRD, Image] 0x20400.1 - Tone Curve Original: No +[CanonVRD, CanonVRD, Image] 132112 - Tone Curve Brightness: 34 +[CanonVRD, CanonVRD, Image] 132113 - Tone Curve Contrast: -20 +[CanonVRD, CanonVRD, Image] 132352 - Auto Lighting Optimizer: Strong +[CanonVRD, CanonVRD, Image] 0x20500.0 - Auto Lighting Optimizer On: Yes +[CanonVRD, CanonVRD, Image] 131856 - Sharpness Adj: Unsharp Mask +[CanonVRD, CanonVRD, Image] 0x20310.0 - Sharpness Adj On: Yes +[CanonVRD, CanonVRD, Image] 131857 - Sharpness Strength: 0 +[CanonVRD, CanonVRD, Image] 133376 - Color Hue: -10 +[CanonVRD, CanonVRD, Image] 133377 - Saturation Adj: 98 +[CanonVRD, CanonVRD, Image] 133392 - Red HSL: -1 -0.9 -0.8 +[CanonVRD, CanonVRD, Image] 133393 - Orange HSL: -0.7 -0.6 -0.5 +[CanonVRD, CanonVRD, Image] 133394 - Yellow HSL: -0.4 -0.3 -0.2 +[CanonVRD, CanonVRD, Image] 133395 - Green HSL: -0.1 0 0.1 +[CanonVRD, CanonVRD, Image] 133396 - Aqua HSL: 0.2 0.3 0.4 +[CanonVRD, CanonVRD, Image] 133397 - Blue HSL: 0.5 0.6 0.7 +[CanonVRD, CanonVRD, Image] 133398 - Purple HSL: 0.8 0.9 1 +[CanonVRD, CanonVRD, Image] 133399 - Magenta HSL: 1.1 1.2 1.3 +[CanonVRD, CanonVRD, Image] 132608 - Luminance Noise Reduction: 4.4 +[CanonVRD, CanonVRD, Image] 132609 - Chrominance Noise Reduction: 2.7 +[CanonVRD, CanonVRD, Image] 132865 - Shooting Distance: 100% +[CanonVRD, CanonVRD, Image] 132866 - Peripheral Illumination: 34 +[CanonVRD, CanonVRD, Image] 0x20702.0 - Peripheral Illumination On: Yes +[CanonVRD, CanonVRD, Image] 132867 - Chromatic Aberration: 121 +[CanonVRD, CanonVRD, Image] 0x20703.0 - Chromatic Aberration On: Yes +[CanonVRD, CanonVRD, Image] 132868 - Color Blur On: Yes +[CanonVRD, CanonVRD, Image] 132869 - Distortion Correction: 48 +[CanonVRD, CanonVRD, Image] 0x20705.0 - Distortion Correction On: Yes +[CanonVRD, CanonVRD, Image] 132870 - DLO Setting: 50 +[CanonVRD, CanonVRD, Image] 0x20706.0 - DLO On: No +[CanonVRD, CanonVRD, Image] 132871 - Chromatic Aberration Red: -0.1 +[CanonVRD, CanonVRD, Image] 132872 - Chromatic Aberration Blue: -0.5 +[CanonVRD, CanonVRD, Image] 2 - Gamma Contrast: 0 +[CanonVRD, CanonVRD, Image] 3 - Gamma Color Tone: 0 +[CanonVRD, CanonVRD, Image] 4 - Gamma Saturation: 0 +[CanonVRD, CanonVRD, Image] 5 - Gamma Unsharp Mask Strength: 3 +[CanonVRD, CanonVRD, Image] 6 - Gamma Unsharp Mask Fineness: 4 +[CanonVRD, CanonVRD, Image] 7 - Gamma Unsharp Mask Threshold: 4 +[CanonVRD, CanonVRD, Image] 8 - Gamma Sharpness Strength: 3 +[CanonVRD, CanonVRD, Image] 9 - Gamma Shadow: 0 +[CanonVRD, CanonVRD, Image] 10 - Gamma Highlight: 0 +[CanonVRD, CanonVRD, Image] 12 - Gamma Black Point: +0.000 +[CanonVRD, CanonVRD, Image] 13 - Gamma White Point: +0.000 +[CanonVRD, CanonVRD, Image] 14 - Gamma Mid Point: +0.000 +[CanonVRD, CanonVRD, Image] 15 - Gamma Curve Output Range: 0 16383 +[CanonVRD, CanonVRD, Image] 0 - Crop Active: Yes +[CanonVRD, CanonVRD, Image] 1 - Crop Rotated Original Width: 6089 +[CanonVRD, CanonVRD, Image] 2 - Crop Rotated Original Height: 4740 +[CanonVRD, CanonVRD, Image] 3 - Crop X: 2060 +[CanonVRD, CanonVRD, Image] 4 - Crop Y: 1291 +[CanonVRD, CanonVRD, Image] 5 - Crop Width: 2952 +[CanonVRD, CanonVRD, Image] 6 - Crop Height: 1476 +[CanonVRD, CanonVRD, Image] 8 - Crop Rotation: 13.08 +[CanonVRD, CanonVRD, Image] 10 - Crop Original Width: 5472 +[CanonVRD, CanonVRD, Image] 11 - Crop Original Height: 3648 +[CanonVRD, CanonVRD, Image] 2 - Stamp Tool Count: 0 +[CanonVRD, CanonVRD, Image] 196865 - Crop Aspect Ratio: Custom +[CanonVRD, CanonVRD, Image] 196866 - Crop Aspect Ratio Custom: 2 1 +[CanonVRD, CanonVRD, Image] 984338 - Lens Focal Length: 135 diff --git a/t/CanonVRD_14.out b/t/CanonVRD_14.out new file mode 100644 index 0000000..46116fe --- /dev/null +++ b/t/CanonVRD_14.out @@ -0,0 +1,101 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.76 +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 5472 +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:11:07 08:40:23-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:11:07 08:40:23-05:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:11:07 08:40:23-05:00 +[File, System, Other] FilePermissions - File Permissions: 644 +[File, File, Other] FileType - File Type: DR4 +[File, File, Other] FileTypeExtension - File Type Extension: DR4 +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[CanonVRD, CanonVRD, Image] 3 - DR4 Camera Model: 2147484297 +[CanonVRD, CanonVRD, Image] 65538 - Rotation: 0 +[CanonVRD, CanonVRD, Image] 65539 - Angle Adj: 13.08 +[CanonVRD, CanonVRD, Image] 65793 - Check Mark: 0 +[CanonVRD, CanonVRD, Image] 66048 - Work Color Space: 3 +[CanonVRD, CanonVRD, Image] 131073 - Raw Brightness Adj: 0 +[CanonVRD, CanonVRD, Image] 131329 - White Balance Adj: 2 +[CanonVRD, CanonVRD, Image] 131330 - WB Adj Color Temp: 5200 +[CanonVRD, CanonVRD, Image] 131333 - WB Adj Magenta Green: -5 +[CanonVRD, CanonVRD, Image] 131334 - WB Adj Blue Amber: 3 +[CanonVRD, CanonVRD, Image] 131584 - Gamma Linear: 0 +[CanonVRD, CanonVRD, Image] 131841 - Picture Style: 132 +[CanonVRD, CanonVRD, Image] 131843 - Contrast Adj: -1 +[CanonVRD, CanonVRD, Image] 131844 - Color Tone Adj: 0.7 +[CanonVRD, CanonVRD, Image] 131845 - Color Saturation Adj: 1.6 +[CanonVRD, CanonVRD, Image] 131846 - Monochrome Toning Effect: 0 +[CanonVRD, CanonVRD, Image] 131847 - Monochrome Filter Effect: 0 +[CanonVRD, CanonVRD, Image] 131848 - Unsharp Mask Strength: 3 +[CanonVRD, CanonVRD, Image] 131849 - Unsharp Mask Fineness: 2 +[CanonVRD, CanonVRD, Image] 131850 - Unsharp Mask Threshold: 7.2 +[CanonVRD, CanonVRD, Image] 131851 - Shadow Adj: -0.1 +[CanonVRD, CanonVRD, Image] 131852 - Highlight Adj: 0.5 +[CanonVRD, CanonVRD, Image] 0 - Tone Curve Color Space: 1 +[CanonVRD, CanonVRD, Image] 1 - Tone Curve Shape: 1 +[CanonVRD, CanonVRD, Image] 3 - Tone Curve Input Range: 0 242 +[CanonVRD, CanonVRD, Image] 5 - Tone Curve Output Range: 79 255 +[CanonVRD, CanonVRD, Image] 7 - RGB Curve Points: 3 0 79 117 172 242 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[CanonVRD, CanonVRD, Image] 10 - Tone Curve X: 117 +[CanonVRD, CanonVRD, Image] 11 - Tone Curve Y: 172 +[CanonVRD, CanonVRD, Image] 45 - Red Curve Points: 3 2 3 126 116 254 253 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[CanonVRD, CanonVRD, Image] 83 - Green Curve Points: 3 1 2 125 139 254 253 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[CanonVRD, CanonVRD, Image] 121 - Blue Curve Points: 3 3 4 132 113 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[CanonVRD, CanonVRD, Image] 0x20400.1 - Tone Curve Original: 0 +[CanonVRD, CanonVRD, Image] 132112 - Tone Curve Brightness: 34 +[CanonVRD, CanonVRD, Image] 132113 - Tone Curve Contrast: -20 +[CanonVRD, CanonVRD, Image] 132352 - Auto Lighting Optimizer: 2 +[CanonVRD, CanonVRD, Image] 0x20500.0 - Auto Lighting Optimizer On: 1 +[CanonVRD, CanonVRD, Image] 131856 - Sharpness Adj: 1 +[CanonVRD, CanonVRD, Image] 0x20310.0 - Sharpness Adj On: 0 +[CanonVRD, CanonVRD, Image] 131857 - Sharpness Strength: 0 +[CanonVRD, CanonVRD, Image] 133376 - Color Hue: -10 +[CanonVRD, CanonVRD, Image] 133377 - Saturation Adj: 98 +[CanonVRD, CanonVRD, Image] 133392 - Red HSL: -4.3 1.2 3.8 +[CanonVRD, CanonVRD, Image] 133393 - Orange HSL: -0.7 -0.6 -0.5 +[CanonVRD, CanonVRD, Image] 133394 - Yellow HSL: -0.4 -0.3 -0.2 +[CanonVRD, CanonVRD, Image] 133395 - Green HSL: -0.1 0 0.1 +[CanonVRD, CanonVRD, Image] 133396 - Aqua HSL: 0.2 0.3 0.4 +[CanonVRD, CanonVRD, Image] 133397 - Blue HSL: 0.5 0.6 0.7 +[CanonVRD, CanonVRD, Image] 133398 - Purple HSL: 0.8 0.9 1 +[CanonVRD, CanonVRD, Image] 133399 - Magenta HSL: 1.1 1.2 1.3 +[CanonVRD, CanonVRD, Image] 132608 - Luminance Noise Reduction: 4.4 +[CanonVRD, CanonVRD, Image] 132609 - Chrominance Noise Reduction: 2.7 +[CanonVRD, CanonVRD, Image] 132865 - Shooting Distance: 1 +[CanonVRD, CanonVRD, Image] 132866 - Peripheral Illumination: 34 +[CanonVRD, CanonVRD, Image] 0x20702.0 - Peripheral Illumination On: 1 +[CanonVRD, CanonVRD, Image] 132867 - Chromatic Aberration: 121 +[CanonVRD, CanonVRD, Image] 0x20703.0 - Chromatic Aberration On: 1 +[CanonVRD, CanonVRD, Image] 132868 - Color Blur On: 1 +[CanonVRD, CanonVRD, Image] 132869 - Distortion Correction: 48 +[CanonVRD, CanonVRD, Image] 0x20705.0 - Distortion Correction On: 1 +[CanonVRD, CanonVRD, Image] 132870 - DLO Setting: 50 +[CanonVRD, CanonVRD, Image] 0x20706.0 - DLO On: 0 +[CanonVRD, CanonVRD, Image] 132871 - Chromatic Aberration Red: -0.1 +[CanonVRD, CanonVRD, Image] 132872 - Chromatic Aberration Blue: -0.5 +[CanonVRD, CanonVRD, Image] 2 - Gamma Contrast: 0 +[CanonVRD, CanonVRD, Image] 3 - Gamma Color Tone: 0 +[CanonVRD, CanonVRD, Image] 4 - Gamma Saturation: 0 +[CanonVRD, CanonVRD, Image] 5 - Gamma Unsharp Mask Strength: 3 +[CanonVRD, CanonVRD, Image] 6 - Gamma Unsharp Mask Fineness: 4 +[CanonVRD, CanonVRD, Image] 7 - Gamma Unsharp Mask Threshold: 4 +[CanonVRD, CanonVRD, Image] 8 - Gamma Sharpness Strength: 3 +[CanonVRD, CanonVRD, Image] 9 - Gamma Shadow: 0 +[CanonVRD, CanonVRD, Image] 10 - Gamma Highlight: 0 +[CanonVRD, CanonVRD, Image] 12 - Gamma Black Point: 1.23403077716592 +[CanonVRD, CanonVRD, Image] 13 - Gamma White Point: 0 +[CanonVRD, CanonVRD, Image] 14 - Gamma Mid Point: 0 +[CanonVRD, CanonVRD, Image] 15 - Gamma Curve Output Range: 0 16383 +[CanonVRD, CanonVRD, Image] 0 - Crop Active: 1 +[CanonVRD, CanonVRD, Image] 1 - Crop Rotated Original Width: 6089 +[CanonVRD, CanonVRD, Image] 2 - Crop Rotated Original Height: 4740 +[CanonVRD, CanonVRD, Image] 3 - Crop X: 123 +[CanonVRD, CanonVRD, Image] 4 - Crop Y: 1291 +[CanonVRD, CanonVRD, Image] 5 - Crop Width: 2952 +[CanonVRD, CanonVRD, Image] 6 - Crop Height: 1476 +[CanonVRD, CanonVRD, Image] 8 - Crop Rotation: 13.08 +[CanonVRD, CanonVRD, Image] 10 - Crop Original Width: 5472 +[CanonVRD, CanonVRD, Image] 11 - Crop Original Height: 3648 +[CanonVRD, CanonVRD, Image] 2 - Stamp Tool Count: 0 +[CanonVRD, CanonVRD, Image] 196865 - Crop Aspect Ratio: 1 +[CanonVRD, CanonVRD, Image] 196866 - Crop Aspect Ratio Custom: 2 1 +[CanonVRD, CanonVRD, Image] 984338 - Lens Focal Length: 135 diff --git a/t/CanonVRD_15.out b/t/CanonVRD_15.out new file mode 100644 index 0000000..a332c42 --- /dev/null +++ b/t/CanonVRD_15.out @@ -0,0 +1,5 @@ +[File, System, Other] FileSize - File Size: 5831 +[CanonVRD, CanonVRD, Image] 0x20310.0 - Sharpness Adj On: 0 +[CanonVRD, CanonVRD, Image] 133392 - Red HSL: -4.3 1.2 3.8 +[CanonVRD, CanonVRD, Image] 133395 - Green HSL: -0.1 0 0.1 +[CanonVRD, CanonVRD, Image] 12 - Gamma Black Point: 1.23403077716592 diff --git a/t/CanonVRD_16.out b/t/CanonVRD_16.out new file mode 100644 index 0000000..8e61282 --- /dev/null +++ b/t/CanonVRD_16.out @@ -0,0 +1,6 @@ +[File, System, Other] FileSize - File Size: 34630 +[ExifTool, ExifTool, ExifTool] Warning - Warning: IPTCDigest is not current. XMP may be out of sync +[CanonVRD, CanonVRD, Image] 0x20310.0 - Sharpness Adj On: 0 +[CanonVRD, CanonVRD, Image] 133392 - Red HSL: -4.3 1.2 3.8 +[CanonVRD, CanonVRD, Image] 133395 - Green HSL: -0.1 0 0.1 +[CanonVRD, CanonVRD, Image] 12 - Gamma Black Point: 1.23403077716592 diff --git a/t/CanonVRD_17.out b/t/CanonVRD_17.out new file mode 100644 index 0000000..34c75d3 --- /dev/null +++ b/t/CanonVRD_17.out @@ -0,0 +1,5 @@ +[File, System, Other] FileSize - File Size: 14306 +[CanonVRD, CanonVRD, Image] 0x20310.0 - Sharpness Adj On: 0 +[CanonVRD, CanonVRD, Image] 133392 - Red HSL: -4.3 1.2 3.8 +[CanonVRD, CanonVRD, Image] 133395 - Green HSL: -0.1 0 0.1 +[CanonVRD, CanonVRD, Image] 12 - Gamma Black Point: 1.23403077716592 diff --git a/t/CanonVRD_18.out b/t/CanonVRD_18.out new file mode 100644 index 0000000..4b1b539 --- /dev/null +++ b/t/CanonVRD_18.out @@ -0,0 +1,5 @@ +[File, System, Other] FileSize - File Size: 11836 +[CanonVRD, CanonVRD, Image] 0x20310.0 - Sharpness Adj On: 0 +[CanonVRD, CanonVRD, Image] 133392 - Red HSL: -4.3 1.2 3.8 +[CanonVRD, CanonVRD, Image] 133395 - Green HSL: -0.1 0 0.1 +[CanonVRD, CanonVRD, Image] 12 - Gamma Black Point: 1.23403077716592 diff --git a/t/CanonVRD_19.out b/t/CanonVRD_19.out new file mode 100644 index 0000000..5a588cc --- /dev/null +++ b/t/CanonVRD_19.out @@ -0,0 +1,5 @@ +[File, System, Other] FileSize - File Size: 5580 +[CanonVRD, CanonVRD, Image] 0x20310.0 - Sharpness Adj On: 0 +[CanonVRD, CanonVRD, Image] 133392 - Red HSL: -4.3 1.2 3.8 +[CanonVRD, CanonVRD, Image] 133395 - Green HSL: -0.1 0 0.1 +[CanonVRD, CanonVRD, Image] 12 - Gamma Black Point: 1.23403077716592 diff --git a/t/CanonVRD_2.out b/t/CanonVRD_2.out new file mode 100644 index 0000000..12c15c1 --- /dev/null +++ b/t/CanonVRD_2.out @@ -0,0 +1,119 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.76 +[File, System, Other] FileName - File Name: CanonVRD.vrd +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1768 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:11:07 22:13:23-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:11:07 08:35:50-05:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:11:04 10:47:12-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: VRD +[File, File, Other] FileTypeExtension - File Type Extension: vrd +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[CanonVRD, CanonVRD, Image] 2 - VRD Version: 2.0.0 +[CanonVRD, CanonVRD, Image] 6 - WB Adj RGGB Levels: 1856 832 832 928 +[CanonVRD, CanonVRD, Image] 24 - White Balance Adj: Manual (Click) +[CanonVRD, CanonVRD, Image] 26 - WB Adj Color Temp: 5600 +[CanonVRD, CanonVRD, Image] 36 - WB Fine Tune Active: Yes +[CanonVRD, CanonVRD, Image] 40 - WB Fine Tune Saturation: 0 +[CanonVRD, CanonVRD, Image] 44 - WB Fine Tune Tone: 358 +[CanonVRD, CanonVRD, Image] 46 - Raw Color Adj: Shot Settings +[CanonVRD, CanonVRD, Image] 48 - Raw Custom Saturation: 0 +[CanonVRD, CanonVRD, Image] 52 - Raw Custom Tone: 0 +[CanonVRD, CanonVRD, Image] 56 - Raw Brightness Adj: -0.83 +[CanonVRD, CanonVRD, Image] 60 - Tone Curve Property: Shot Settings +[CanonVRD, CanonVRD, Image] 122 - Dynamic Range Min: 0 +[CanonVRD, CanonVRD, Image] 124 - Dynamic Range Max: 4095 +[CanonVRD, CanonVRD, Image] 272 - Tone Curve Active: Yes +[CanonVRD, CanonVRD, Image] 275 - Tone Curve Mode: RGB +[CanonVRD, CanonVRD, Image] 276 - Brightness Adj: 0 +[CanonVRD, CanonVRD, Image] 277 - Contrast Adj: 0 +[CanonVRD, CanonVRD, Image] 278 - Saturation Adj: 119 +[CanonVRD, CanonVRD, Image] 286 - Color Tone Adj: 0 +[CanonVRD, CanonVRD, Image] 294 - Luminance Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 336 - Luminance Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 345 - Tone Curve Interpolation: Curve +[CanonVRD, CanonVRD, Image] 352 - Red Curve Points: (0,0) (5,16) (11,30) (58,101) (106,154) (154,198) (202,233) (228,246) (255,255) +[CanonVRD, CanonVRD, Image] 394 - Red Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 410 - Green Curve Points: (7,4) (11,23) (16,34) (59,100) (104,147) (149,187) (196,219) (221,232) (248,240) +[CanonVRD, CanonVRD, Image] 452 - Green Curve Limits: 248 7 240 4 +[CanonVRD, CanonVRD, Image] 468 - Blue Curve Points: (0,0) (5,19) (10,32) (57,104) (104,156) (152,199) (200,233) (227,247) (255,255) +[CanonVRD, CanonVRD, Image] 510 - Blue Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 526 - RGB Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 568 - RGB Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 580 - Crop Active: Yes +[CanonVRD, CanonVRD, Image] 582 - Crop Left: 1164 +[CanonVRD, CanonVRD, Image] 584 - Crop Top: 608 +[CanonVRD, CanonVRD, Image] 586 - Crop Width: 564 +[CanonVRD, CanonVRD, Image] 588 - Crop Height: 123 +[CanonVRD, CanonVRD, Image] 602 - Sharpness Adj: 0 +[CanonVRD, CanonVRD, Image] 608 - Crop Aspect Ratio: Free +[CanonVRD, CanonVRD, Image] 610 - Constrained Crop Width: 5.5 +[CanonVRD, CanonVRD, Image] 614 - Constrained Crop Height: 1.2 +[CanonVRD, CanonVRD, Image] 618 - Check Mark: 3 +[CanonVRD, CanonVRD, Image] 622 - Rotation: 0 +[CanonVRD, CanonVRD, Image] 624 - Work Color Space: ColorMatch RGB +[CanonVRD, CanonVRD, Image] 2 - Picture Style: Standard +[CanonVRD, CanonVRD, Image] 3 - Is Custom Picture Style: No +[CanonVRD, CanonVRD, Image] 13 - Standard Raw Color Tone: -4 +[CanonVRD, CanonVRD, Image] 14 - Standard Raw Saturation: 0 +[CanonVRD, CanonVRD, Image] 15 - Standard Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 16 - Standard Raw Linear: No +[CanonVRD, CanonVRD, Image] 17 - Standard Raw Sharpness: 1 +[CanonVRD, CanonVRD, Image] 18 - Standard Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 19 - Standard Raw Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 20 - Standard Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 21 - Standard Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 22 - Portrait Raw Color Tone: 4 +[CanonVRD, CanonVRD, Image] 23 - Portrait Raw Saturation: 2 +[CanonVRD, CanonVRD, Image] 24 - Portrait Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 25 - Portrait Raw Linear: No +[CanonVRD, CanonVRD, Image] 26 - Portrait Raw Sharpness: 7 +[CanonVRD, CanonVRD, Image] 27 - Portrait Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 28 - Portrait Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 29 - Portrait Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 30 - Portrait Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 31 - Landscape Raw Color Tone: 4 +[CanonVRD, CanonVRD, Image] 32 - Landscape Raw Saturation: 2 +[CanonVRD, CanonVRD, Image] 33 - Landscape Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 34 - Landscape Raw Linear: No +[CanonVRD, CanonVRD, Image] 35 - Landscape Raw Sharpness: 7 +[CanonVRD, CanonVRD, Image] 36 - Landscape Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 37 - Landscape Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 38 - Landscape Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 39 - Landscape Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 40 - Neutral Raw Color Tone: 4 +[CanonVRD, CanonVRD, Image] 41 - Neutral Raw Saturation: 2 +[CanonVRD, CanonVRD, Image] 42 - Neutral Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 43 - Neutral Raw Linear: No +[CanonVRD, CanonVRD, Image] 44 - Neutral Raw Sharpness: 7 +[CanonVRD, CanonVRD, Image] 45 - Neutral Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 46 - Neutral Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 47 - Neutral Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 48 - Neutral Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 49 - Faithful Raw Color Tone: 4 +[CanonVRD, CanonVRD, Image] 50 - Faithful Raw Saturation: 2 +[CanonVRD, CanonVRD, Image] 51 - Faithful Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 52 - Faithful Raw Linear: No +[CanonVRD, CanonVRD, Image] 53 - Faithful Raw Sharpness: 7 +[CanonVRD, CanonVRD, Image] 54 - Faithful Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 55 - Faithful Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 56 - Faithful Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 57 - Faithful Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 58 - Monochrome Filter Effect: Yellow +[CanonVRD, CanonVRD, Image] 59 - Monochrome Toning Effect: Purple +[CanonVRD, CanonVRD, Image] 60 - Monochrome Contrast: 3 +[CanonVRD, CanonVRD, Image] 61 - Monochrome Linear: No +[CanonVRD, CanonVRD, Image] 62 - Monochrome Sharpness: 4 +[CanonVRD, CanonVRD, Image] 63 - Monochrome Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 64 - Monochrome Raw Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 65 - Monochrome Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 66 - Monochrome Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 76 - Custom Color Tone: 4 +[CanonVRD, CanonVRD, Image] 77 - Custom Saturation: 2 +[CanonVRD, CanonVRD, Image] 78 - Custom Contrast: 0 +[CanonVRD, CanonVRD, Image] 79 - Custom Linear: No +[CanonVRD, CanonVRD, Image] 80 - Custom Sharpness: 7 +[CanonVRD, CanonVRD, Image] 81 - Custom Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 82 - Custom Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 83 - Custom Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 84 - Custom Output Shadow Point: 0 diff --git a/t/CanonVRD_20.out b/t/CanonVRD_20.out new file mode 100644 index 0000000..67480d0 --- /dev/null +++ b/t/CanonVRD_20.out @@ -0,0 +1,5 @@ +[File, System, Other] FileSize - File Size: 5472 +[CanonVRD, CanonVRD, Image] 0x20310.0 - Sharpness Adj On: 0 +[CanonVRD, CanonVRD, Image] 133392 - Red HSL: -4.3 1.2 3.8 +[CanonVRD, CanonVRD, Image] 133395 - Green HSL: -0.1 0 0.1 +[CanonVRD, CanonVRD, Image] 12 - Gamma Black Point: 1.23403077716592 diff --git a/t/CanonVRD_21.out b/t/CanonVRD_21.out new file mode 100644 index 0000000..19b1afb --- /dev/null +++ b/t/CanonVRD_21.out @@ -0,0 +1,5 @@ +[File, System, Other] FileSize - File Size: 56054 +[CanonVRD, CanonVRD, Image] 0x20310.0 - Sharpness Adj On: 0 +[CanonVRD, CanonVRD, Image] 133392 - Red HSL: -4.3 1.2 3.8 +[CanonVRD, CanonVRD, Image] 133395 - Green HSL: -0.1 0 0.1 +[CanonVRD, CanonVRD, Image] 12 - Gamma Black Point: 1.23403077716592 diff --git a/t/CanonVRD_22.out b/t/CanonVRD_22.out new file mode 100644 index 0000000..d6740e6 --- /dev/null +++ b/t/CanonVRD_22.out @@ -0,0 +1 @@ +[File, System, Other] FileSize - File Size: 251 diff --git a/t/CanonVRD_24.out b/t/CanonVRD_24.out new file mode 100644 index 0000000..951a82c --- /dev/null +++ b/t/CanonVRD_24.out @@ -0,0 +1,5 @@ +[File, System, Other] FileSize - File Size: 56 kB +[CanonVRD, CanonVRD, Image] 0x20310.0 - Sharpness Adj On: No +[CanonVRD, CanonVRD, Image] 133392 - Red HSL: -4.3 1.2 3.8 +[CanonVRD, CanonVRD, Image] 133395 - Green HSL: -0.1 0 0.1 +[CanonVRD, CanonVRD, Image] 12 - Gamma Black Point: +1.500 diff --git a/t/CanonVRD_3.out b/t/CanonVRD_3.out new file mode 100644 index 0000000..ee94b2b --- /dev/null +++ b/t/CanonVRD_3.out @@ -0,0 +1,119 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.76 +[File, System, Other] FileName - File Name: CanonVRD_3_failed.vrd +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 1768 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:11:07 08:40:23-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:11:07 08:40:23-05:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:11:07 08:40:23-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: VRD +[File, File, Other] FileTypeExtension - File Type Extension: vrd +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[CanonVRD, CanonVRD, Image] 2 - VRD Version: 2.0.0 +[CanonVRD, CanonVRD, Image] 6 - WB Adj RGGB Levels: 0 0 0 0 +[CanonVRD, CanonVRD, Image] 24 - White Balance Adj: Shot Settings +[CanonVRD, CanonVRD, Image] 26 - WB Adj Color Temp: 5600 +[CanonVRD, CanonVRD, Image] 36 - WB Fine Tune Active: No +[CanonVRD, CanonVRD, Image] 40 - WB Fine Tune Saturation: 0 +[CanonVRD, CanonVRD, Image] 44 - WB Fine Tune Tone: 0 +[CanonVRD, CanonVRD, Image] 46 - Raw Color Adj: Shot Settings +[CanonVRD, CanonVRD, Image] 48 - Raw Custom Saturation: 0 +[CanonVRD, CanonVRD, Image] 52 - Raw Custom Tone: 0 +[CanonVRD, CanonVRD, Image] 56 - Raw Brightness Adj: 0.00 +[CanonVRD, CanonVRD, Image] 60 - Tone Curve Property: Shot Settings +[CanonVRD, CanonVRD, Image] 122 - Dynamic Range Min: 0 +[CanonVRD, CanonVRD, Image] 124 - Dynamic Range Max: 4095 +[CanonVRD, CanonVRD, Image] 272 - Tone Curve Active: No +[CanonVRD, CanonVRD, Image] 275 - Tone Curve Mode: RGB +[CanonVRD, CanonVRD, Image] 276 - Brightness Adj: 0 +[CanonVRD, CanonVRD, Image] 277 - Contrast Adj: 0 +[CanonVRD, CanonVRD, Image] 278 - Saturation Adj: 100 +[CanonVRD, CanonVRD, Image] 286 - Color Tone Adj: 0 +[CanonVRD, CanonVRD, Image] 294 - Luminance Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 336 - Luminance Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 345 - Tone Curve Interpolation: Curve +[CanonVRD, CanonVRD, Image] 352 - Red Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 394 - Red Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 410 - Green Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 452 - Green Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 468 - Blue Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 510 - Blue Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 526 - RGB Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 568 - RGB Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 580 - Crop Active: No +[CanonVRD, CanonVRD, Image] 582 - Crop Left: 438 +[CanonVRD, CanonVRD, Image] 584 - Crop Top: 618 +[CanonVRD, CanonVRD, Image] 586 - Crop Width: 0 +[CanonVRD, CanonVRD, Image] 588 - Crop Height: 0 +[CanonVRD, CanonVRD, Image] 602 - Sharpness Adj: 0 +[CanonVRD, CanonVRD, Image] 608 - Crop Aspect Ratio: Free +[CanonVRD, CanonVRD, Image] 610 - Constrained Crop Width: 0 +[CanonVRD, CanonVRD, Image] 614 - Constrained Crop Height: 0 +[CanonVRD, CanonVRD, Image] 618 - Check Mark: Clear +[CanonVRD, CanonVRD, Image] 622 - Rotation: 0 +[CanonVRD, CanonVRD, Image] 624 - Work Color Space: sRGB +[CanonVRD, CanonVRD, Image] 2 - Picture Style: Standard +[CanonVRD, CanonVRD, Image] 3 - Is Custom Picture Style: No +[CanonVRD, CanonVRD, Image] 13 - Standard Raw Color Tone: -4 +[CanonVRD, CanonVRD, Image] 14 - Standard Raw Saturation: 0 +[CanonVRD, CanonVRD, Image] 15 - Standard Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 16 - Standard Raw Linear: No +[CanonVRD, CanonVRD, Image] 17 - Standard Raw Sharpness: 1 +[CanonVRD, CanonVRD, Image] 18 - Standard Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 19 - Standard Raw Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 20 - Standard Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 21 - Standard Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 22 - Portrait Raw Color Tone: 4 +[CanonVRD, CanonVRD, Image] 23 - Portrait Raw Saturation: 2 +[CanonVRD, CanonVRD, Image] 24 - Portrait Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 25 - Portrait Raw Linear: No +[CanonVRD, CanonVRD, Image] 26 - Portrait Raw Sharpness: 7 +[CanonVRD, CanonVRD, Image] 27 - Portrait Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 28 - Portrait Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 29 - Portrait Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 30 - Portrait Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 31 - Landscape Raw Color Tone: 4 +[CanonVRD, CanonVRD, Image] 32 - Landscape Raw Saturation: 2 +[CanonVRD, CanonVRD, Image] 33 - Landscape Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 34 - Landscape Raw Linear: No +[CanonVRD, CanonVRD, Image] 35 - Landscape Raw Sharpness: 7 +[CanonVRD, CanonVRD, Image] 36 - Landscape Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 37 - Landscape Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 38 - Landscape Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 39 - Landscape Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 40 - Neutral Raw Color Tone: 4 +[CanonVRD, CanonVRD, Image] 41 - Neutral Raw Saturation: 2 +[CanonVRD, CanonVRD, Image] 42 - Neutral Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 43 - Neutral Raw Linear: No +[CanonVRD, CanonVRD, Image] 44 - Neutral Raw Sharpness: 7 +[CanonVRD, CanonVRD, Image] 45 - Neutral Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 46 - Neutral Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 47 - Neutral Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 48 - Neutral Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 49 - Faithful Raw Color Tone: 4 +[CanonVRD, CanonVRD, Image] 50 - Faithful Raw Saturation: 2 +[CanonVRD, CanonVRD, Image] 51 - Faithful Raw Contrast: 0 +[CanonVRD, CanonVRD, Image] 52 - Faithful Raw Linear: No +[CanonVRD, CanonVRD, Image] 53 - Faithful Raw Sharpness: 7 +[CanonVRD, CanonVRD, Image] 54 - Faithful Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 55 - Faithful Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 56 - Faithful Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 57 - Faithful Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 58 - Monochrome Filter Effect: Yellow +[CanonVRD, CanonVRD, Image] 59 - Monochrome Toning Effect: Purple +[CanonVRD, CanonVRD, Image] 60 - Monochrome Contrast: 3 +[CanonVRD, CanonVRD, Image] 61 - Monochrome Linear: No +[CanonVRD, CanonVRD, Image] 62 - Monochrome Sharpness: 4 +[CanonVRD, CanonVRD, Image] 63 - Monochrome Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 64 - Monochrome Raw Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 65 - Monochrome Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 66 - Monochrome Output Shadow Point: 0 +[CanonVRD, CanonVRD, Image] 76 - Custom Color Tone: 4 +[CanonVRD, CanonVRD, Image] 77 - Custom Saturation: 2 +[CanonVRD, CanonVRD, Image] 78 - Custom Contrast: 0 +[CanonVRD, CanonVRD, Image] 79 - Custom Linear: No +[CanonVRD, CanonVRD, Image] 80 - Custom Sharpness: 7 +[CanonVRD, CanonVRD, Image] 81 - Custom Raw Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 82 - Custom Raw Shadow Point: 6 +[CanonVRD, CanonVRD, Image] 83 - Custom Output Highlight Point: 4095 +[CanonVRD, CanonVRD, Image] 84 - Custom Output Shadow Point: 0 diff --git a/t/CanonVRD_4.out b/t/CanonVRD_4.out new file mode 100644 index 0000000..495ad48 --- /dev/null +++ b/t/CanonVRD_4.out @@ -0,0 +1,2 @@ +[File, System, Other] FileSize - File Size: 2019 +[CanonVRD, CanonVRD, Image] 2 - VRD Version: 200 diff --git a/t/CanonVRD_5.out b/t/CanonVRD_5.out new file mode 100644 index 0000000..7cdea37 --- /dev/null +++ b/t/CanonVRD_5.out @@ -0,0 +1,3 @@ +[File, System, Other] FileSize - File Size: 27046 +[ExifTool, ExifTool, ExifTool] Warning - Warning: IPTCDigest is not current. XMP may be out of sync +[CanonVRD, CanonVRD, Image] 2 - VRD Version: 200 diff --git a/t/CanonVRD_6.out b/t/CanonVRD_6.out new file mode 100644 index 0000000..de398ea --- /dev/null +++ b/t/CanonVRD_6.out @@ -0,0 +1,3 @@ +[File, System, Other] FileSize - File Size: 10494 +[MakerNotes, Canon, Camera] 208 - VRD Offset: 8708 +[CanonVRD, CanonVRD, Image] 2 - VRD Version: 200 diff --git a/t/CanonVRD_7.out b/t/CanonVRD_7.out new file mode 100644 index 0000000..0fbfc7d --- /dev/null +++ b/t/CanonVRD_7.out @@ -0,0 +1,2 @@ +[File, System, Other] FileSize - File Size: 8024 +[CanonVRD, CanonVRD, Image] 2 - VRD Version: 200 diff --git a/t/CanonVRD_8.out b/t/CanonVRD_8.out new file mode 100644 index 0000000..0892cae --- /dev/null +++ b/t/CanonVRD_8.out @@ -0,0 +1,2 @@ +[File, System, Other] FileSize - File Size: 2296 +[CanonVRD, CanonVRD, Image] 2 - VRD Version: 100 diff --git a/t/CanonVRD_9.out b/t/CanonVRD_9.out new file mode 100644 index 0000000..d3c4ae7 --- /dev/null +++ b/t/CanonVRD_9.out @@ -0,0 +1,2 @@ +[File, System, Other] FileSize - File Size: 23470 +[ExifTool, ExifTool, ExifTool] Warning - Warning: IPTCDigest is not current. XMP may be out of sync diff --git a/t/Canon_2.out b/t/Canon_2.out new file mode 100644 index 0000000..177fb20 --- /dev/null +++ b/t/Canon_2.out @@ -0,0 +1,358 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Canon1DmkIII.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 8.3 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2008:01:18 14:10:05-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:30-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS-1D Mark III +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2007:02:22 17:02:42 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/125 +[EXIF, ExifIFD, Image] 33437 - F Number: 5.6 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 3200 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2007:02:22 17:02:42 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2007:02:22 17:02:42 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/128 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 5.7 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: On, Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 35.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Time] 37520 - Sub Sec Time: 81 +[EXIF, ExifIFD, Time] 37521 - Sub Sec Time Original: 81 +[EXIF, ExifIFD, Time] 37522 - Sub Sec Time Digitized: 81 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 3888 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 2592 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3512.195122 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3521.73913 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, GPS, Location] 0 - GPS Version ID: 2.2.0.0 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 8060 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Canon, Camera] 1 - Macro Mode: Normal +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: Fine +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: External flash +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Continuous, High +[MakerNotes, Canon, Camera] 7 - Focus Mode: AI Servo AF +[MakerNotes, Canon, Camera] 9 - Record Mode: CR2+JPEG +[MakerNotes, Canon, Camera] 10 - Canon Image Size: Large +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: None +[MakerNotes, Canon, Camera] 13 - Contrast: Normal +[MakerNotes, Canon, Camera] 14 - Saturation: Normal +[MakerNotes, Canon, Camera] 17 - Metering Mode: Evaluative +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Program AE +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 35 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 16 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 2.8 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 23 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 145 +[MakerNotes, Canon, Camera] 29 - Flash Bits: (none) +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 0 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 0 +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, Canon, Camera] 46 - SRAW Quality: n/a +[MakerNotes, Canon, Image] 1 - Focal Length: 35 mm +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 3200 +[MakerNotes, Canon, Image] 3 - Measured EV: 3.62 +[MakerNotes, Canon, Image] 4 - Target Aperture: 5.7 +[MakerNotes, Canon, Image] 5 - Target Exposure Time: 1/128 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Camera] 12 - Camera Temperature: 26 C +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 21 - F Number: 5.7 +[MakerNotes, Canon, Image] 22 - Exposure Time: 1/128 +[MakerNotes, Canon, Image] 23 - Measured EV 2: 3.75 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 0 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS High-end +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 6 - Canon Image Type: Canon EOS-1D Mark III +[MakerNotes, Canon, Camera] 7 - Canon Firmware Version: Firmware Version 5.3.1 +[MakerNotes, Canon, Camera] 9 - Owner Name: +[MakerNotes, Canon, Camera] 12 - Serial Number: 500292 +[MakerNotes, Canon, Image] 3 - F Number: 5.7 +[MakerNotes, Canon, Image] 4 - Exposure Time: 1/128 +[MakerNotes, Canon, Image] 6 - ISO: 3200 +[MakerNotes, Canon, Camera] 24 - Camera Temperature: 26 C +[MakerNotes, Canon, Camera] 29 - Focal Length: 35 mm +[MakerNotes, Canon, Camera] 48 - Camera Orientation: Horizontal (normal) +[MakerNotes, Canon, Camera] 67 - Focus Distance Upper: 2.19 m +[MakerNotes, Canon, Camera] 69 - Focus Distance Lower: 1.13 m +[MakerNotes, Canon, Camera] 94 - White Balance: Auto +[MakerNotes, Canon, Camera] 98 - Color Temperature: 5200 +[MakerNotes, Canon, Camera] 134 - Picture Style: Neutral +[MakerNotes, Canon, Camera] 273 - Lens Type: Canon EF 16-35mm f/2.8L II USM +[MakerNotes, Canon, Camera] 275 - Min Focal Length: 16 mm +[MakerNotes, Canon, Camera] 277 - Max Focal Length: 35 mm +[MakerNotes, Canon, Camera] 310 - Firmware Version: 5.3.1 +[MakerNotes, Canon, Image] 370 - File Index: 232 +[MakerNotes, Canon, Camera] 374 - Shutter Count: 1 +[MakerNotes, Canon, Image] 382 - Directory Index: 108 +[MakerNotes, Canon, Camera] 0 - Contrast Standard: 0 +[MakerNotes, Canon, Camera] 4 - Sharpness Standard: 3 +[MakerNotes, Canon, Camera] 8 - Saturation Standard: 0 +[MakerNotes, Canon, Camera] 12 - Color Tone Standard: 0 +[MakerNotes, Canon, Camera] 24 - Contrast Portrait: 0 +[MakerNotes, Canon, Camera] 28 - Sharpness Portrait: 2 +[MakerNotes, Canon, Camera] 32 - Saturation Portrait: 0 +[MakerNotes, Canon, Camera] 36 - Color Tone Portrait: 0 +[MakerNotes, Canon, Camera] 48 - Contrast Landscape: 0 +[MakerNotes, Canon, Camera] 52 - Sharpness Landscape: 4 +[MakerNotes, Canon, Camera] 56 - Saturation Landscape: 0 +[MakerNotes, Canon, Camera] 60 - Color Tone Landscape: 0 +[MakerNotes, Canon, Camera] 72 - Contrast Neutral: 0 +[MakerNotes, Canon, Camera] 76 - Sharpness Neutral: 0 +[MakerNotes, Canon, Camera] 80 - Saturation Neutral: 0 +[MakerNotes, Canon, Camera] 84 - Color Tone Neutral: 0 +[MakerNotes, Canon, Camera] 96 - Contrast Faithful: 0 +[MakerNotes, Canon, Camera] 100 - Sharpness Faithful: 0 +[MakerNotes, Canon, Camera] 104 - Saturation Faithful: 0 +[MakerNotes, Canon, Camera] 108 - Color Tone Faithful: 0 +[MakerNotes, Canon, Camera] 120 - Contrast Monochrome: 0 +[MakerNotes, Canon, Camera] 124 - Sharpness Monochrome: 3 +[MakerNotes, Canon, Camera] 136 - Filter Effect Monochrome: None +[MakerNotes, Canon, Camera] 140 - Toning Effect Monochrome: None +[MakerNotes, Canon, Camera] 144 - Contrast User Def 1: 0 +[MakerNotes, Canon, Camera] 148 - Sharpness User Def 1: 3 +[MakerNotes, Canon, Camera] 152 - Saturation User Def 1: 0 +[MakerNotes, Canon, Camera] 156 - Color Tone User Def 1: 0 +[MakerNotes, Canon, Camera] 160 - Filter Effect User Def 1: None +[MakerNotes, Canon, Camera] 164 - Toning Effect User Def 1: None +[MakerNotes, Canon, Camera] 168 - Contrast User Def 2: 0 +[MakerNotes, Canon, Camera] 172 - Sharpness User Def 2: 3 +[MakerNotes, Canon, Camera] 176 - Saturation User Def 2: 0 +[MakerNotes, Canon, Camera] 180 - Color Tone User Def 2: 0 +[MakerNotes, Canon, Camera] 184 - Filter Effect User Def 2: None +[MakerNotes, Canon, Camera] 188 - Toning Effect User Def 2: None +[MakerNotes, Canon, Camera] 192 - Contrast User Def 3: 0 +[MakerNotes, Canon, Camera] 196 - Sharpness User Def 3: 3 +[MakerNotes, Canon, Camera] 200 - Saturation User Def 3: 0 +[MakerNotes, Canon, Camera] 204 - Color Tone User Def 3: 0 +[MakerNotes, Canon, Camera] 208 - Filter Effect User Def 3: None +[MakerNotes, Canon, Camera] 212 - Toning Effect User Def 3: None +[MakerNotes, Canon, Camera] 216 - User Def 1 Picture Style: Standard +[MakerNotes, Canon, Camera] 218 - User Def 2 Picture Style: Standard +[MakerNotes, Canon, Camera] 220 - User Def 3 Picture Style: Standard +[MakerNotes, Canon, Time] 1114 - Time Stamp 1: 2007:02:22 17:02:42 +[MakerNotes, Canon, Time] 1118 - Time Stamp: 1970:01:02 01:30:10 +[MakerNotes, Canon, Camera] 16 - Canon Model ID: EOS-1D Mark III +[MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 7 112 +[MakerNotes, Canon, Camera] 21 - Serial Number Format: Format 2 +[MakerNotes, Canon, Camera] 1 - AF Area Mode: Single-point AF +[MakerNotes, Canon, Camera] 2 - Num AF Points: 45 +[MakerNotes, Canon, Camera] 3 - Valid AF Points: 45 +[MakerNotes, Canon, Image] 4 - Canon Image Width: 3888 +[MakerNotes, Canon, Image] 5 - Canon Image Height: 2592 +[MakerNotes, Canon, Camera] 6 - AF Image Width: 3888 +[MakerNotes, Canon, Camera] 7 - AF Image Height: 2592 +[MakerNotes, Canon, Camera] 8 - AF Area Widths: 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 +[MakerNotes, Canon, Camera] 9 - AF Area Heights: 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 +[MakerNotes, Canon, Camera] 10 - AF Area X Positions: -625 -416 -209 0 209 416 625 -917 -723 -520 -311 -104 104 311 520 723 917 -1041 -832 -625 -416 -206 0 206 416 625 832 1041 -917 -723 -520 -311 -104 104 311 520 723 917 -625 -416 -209 0 209 416 625 +[MakerNotes, Canon, Camera] 11 - AF Area Y Positions: -554 -554 -554 -554 -554 -554 -554 -277 -277 -277 -277 -277 -277 -277 -277 -277 -277 0 0 0 0 0 0 0 0 0 0 0 277 277 277 277 277 277 277 277 277 277 554 554 554 554 554 554 554 +[MakerNotes, Canon, Camera] 12 - AF Points In Focus: 13 +[MakerNotes, Canon, Camera] 13 - AF Points Selected: 13 +[MakerNotes, Canon, Camera] 131 - Original Decision Data Offset: 3326 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Image] 7 - Raw Jpg Size: Large +[MakerNotes, Canon, Image] 8 - Long Exposure Noise Reduction 2: Off +[MakerNotes, Canon, Image] 9 - WB Bracket Mode: Off +[MakerNotes, Canon, Image] 12 - WB Bracket Value AB: 0 +[MakerNotes, Canon, Image] 13 - WB Bracket Value GM: 0 +[MakerNotes, Canon, Image] 19 - Live View Shooting: Off +[MakerNotes, Canon, Image] 20 - Focus Distance Upper: 2.19 m +[MakerNotes, Canon, Image] 21 - Focus Distance Lower: 1.13 m +[MakerNotes, Canon, Camera] 149 - Lens Model: EF16-35mm f/2.8L II USM +[MakerNotes, Canon, Camera] 150 - Internal Serial Number: G002669 +[MakerNotes, Canon, Camera] 151 - Dust Removal Data: (Binary data 1024 bytes) +[MakerNotes, Canon, Camera] 0 - Crop Left Margin: 0 +[MakerNotes, Canon, Camera] 1 - Crop Right Margin: 0 +[MakerNotes, Canon, Camera] 2 - Crop Top Margin: 0 +[MakerNotes, Canon, Camera] 3 - Crop Bottom Margin: 0 +[MakerNotes, CanonCustom, Camera] 257 - Exposure Level Increments: 1/3-stop set, 1/3-stop comp. +[MakerNotes, CanonCustom, Camera] 258 - ISO Speed Increments: 1/3 Stop +[MakerNotes, CanonCustom, Camera] 259 - ISO Speed Range: Disable; Max 3200; Min 100 +[MakerNotes, CanonCustom, Camera] 260 - AEB Auto Cancel: On +[MakerNotes, CanonCustom, Camera] 261 - AEB Sequence: 0,-,+ +[MakerNotes, CanonCustom, Camera] 262 - AEB Shot Count: 7 shots +[MakerNotes, CanonCustom, Camera] 263 - Spot Meter Link To AF Point: Disable (use center AF point) +[MakerNotes, CanonCustom, Camera] 264 - Safety Shift: Disable +[MakerNotes, CanonCustom, Camera] 265 - Usable Shooting Modes: Disable; Flags 0xfc +[MakerNotes, CanonCustom, Camera] 266 - Usable Metering Modes: Disable; Flags 0xf0 +[MakerNotes, CanonCustom, Camera] 267 - Exposure Mode In Manual: Specified metering mode +[MakerNotes, CanonCustom, Camera] 268 - Shutter Speed Range: Disable; Hi 1/8192; Lo 32 +[MakerNotes, CanonCustom, Camera] 269 - Aperture Range: Disable; Closed 91; Open 1 +[MakerNotes, CanonCustom, Camera] 270 - Apply Shooting Metering Mode: Disable; 0; 0; 3; 112; 48; 0; 0 +[MakerNotes, CanonCustom, Camera] 271 - Flash Sync Speed Av: Auto +[MakerNotes, CanonCustom, Camera] 513 - Long Exposure Noise Reduction: Off +[MakerNotes, CanonCustom, Camera] 514 - High ISO Noise Reduction: Off +[MakerNotes, CanonCustom, Camera] 515 - Highlight Tone Priority: Disable +[MakerNotes, CanonCustom, Camera] 772 - E-TTL II: Evaluative +[MakerNotes, CanonCustom, Camera] 773 - Shutter Curtain Sync: 1st-curtain sync +[MakerNotes, CanonCustom, Camera] 774 - Flash Firing: Fires +[MakerNotes, CanonCustom, Camera] 1031 - View Info During Exposure: Disable +[MakerNotes, CanonCustom, Camera] 1032 - LCD Illumination During Bulb: Off +[MakerNotes, CanonCustom, Camera] 1033 - Info Button When Shooting: Displays camera settings +[MakerNotes, CanonCustom, Camera] 1281 - USM Lens Electronic MF: Enable after one-shot AF +[MakerNotes, CanonCustom, Camera] 1282 - AI Servo Tracking Sensitivity: Standard +[MakerNotes, CanonCustom, Camera] 1283 - AI Servo Image Priority: 1: AF, 2: Tracking +[MakerNotes, CanonCustom, Camera] 1284 - AI Servo Tracking Method: Main focus point priority +[MakerNotes, CanonCustom, Camera] 1285 - Lens Drive No AF: Focus search on +[MakerNotes, CanonCustom, Camera] 1286 - Lens AF Stop Button: AF stop +[MakerNotes, CanonCustom, Camera] 1287 - AF Microadjustment: Disable; 0; 0; 0; 0 +[MakerNotes, CanonCustom, Camera] 1288 - AF Point Area Expansion: Disable +[MakerNotes, CanonCustom, Camera] 1289 - Selectable AF Point: 19 points +[MakerNotes, CanonCustom, Camera] 1290 - Switch To Registered AF Point: Disable +[MakerNotes, CanonCustom, Camera] 1291 - AF Point Auto Selection: Control-direct:disable/Main:enable +[MakerNotes, CanonCustom, Camera] 1292 - AF Point Display During Focus: On +[MakerNotes, CanonCustom, Camera] 1293 - AF Point Brightness: Normal +[MakerNotes, CanonCustom, Camera] 1294 - AF Assist Beam: Emits +[MakerNotes, CanonCustom, Camera] 1551 - Mirror Lockup: Disable +[MakerNotes, CanonCustom, Camera] 1552 - Continuous Shooting Speed: Disable; Hi 10; Lo 3 +[MakerNotes, CanonCustom, Camera] 1553 - Continuous Shot Limit: Disable; 99 shots +[MakerNotes, CanonCustom, Camera] 1793 - Shutter Button AF On Button: Metering + AF start +[MakerNotes, CanonCustom, Camera] 1794 - AF On AE Lock Button Switch: Disable +[MakerNotes, CanonCustom, Camera] 1795 - Quick Control Dial In Meter: Exposure comp/Aperture +[MakerNotes, CanonCustom, Camera] 1796 - Set Button When Shooting: Normal (disabled) +[MakerNotes, CanonCustom, Camera] 1797 - Manual Tv/Av For M: Tv=Main/Av=Control +[MakerNotes, CanonCustom, Camera] 1798 - Dial Direction Tv Av: Normal +[MakerNotes, CanonCustom, Camera] 1799 - Av Setting Without Lens: Disable +[MakerNotes, CanonCustom, Camera] 1800 - WB Media Image Size Setting: Rear LCD panel +[MakerNotes, CanonCustom, Camera] 1801 - Lock Microphone Button: Protect (hold:record memo) +[MakerNotes, CanonCustom, Camera] 1802 - Button Function Control Off: Normal (enable) +[MakerNotes, CanonCustom, Camera] 2059 - Focusing Screen: Ec-CIV +[MakerNotes, CanonCustom, Camera] 2060 - Timer Length: Disable; 6 s: 6; 16 s: 16; After release: 2 +[MakerNotes, CanonCustom, Camera] 2061 - Short Release Time Lag: Disable +[MakerNotes, CanonCustom, Camera] 2062 - Add Aspect Ratio Info: Off +[MakerNotes, CanonCustom, Camera] 2063 - Add Original Decision Data: Off +[MakerNotes, CanonCustom, Camera] 2064 - Live View Exposure Simulation: Disable (LCD auto adjust) +[MakerNotes, Canon, Camera] 0 - Aspect Ratio: 3:2 +[MakerNotes, Canon, Camera] 1 - Cropped Image Width: 3888 +[MakerNotes, Canon, Camera] 2 - Cropped Image Height: 2592 +[MakerNotes, Canon, Camera] 3 - Cropped Image Left: 0 +[MakerNotes, Canon, Camera] 4 - Cropped Image Top: 0 +[MakerNotes, Canon, Image] 1 - Tone Curve: Standard +[MakerNotes, Canon, Image] 2 - Sharpness: 0 +[MakerNotes, Canon, Image] 3 - Sharpness Frequency: n/a +[MakerNotes, Canon, Image] 4 - Sensor Red Level: 0 +[MakerNotes, Canon, Image] 5 - Sensor Blue Level: 0 +[MakerNotes, Canon, Image] 6 - White Balance Red: 0 +[MakerNotes, Canon, Image] 7 - White Balance Blue: 0 +[MakerNotes, Canon, Image] 9 - Color Temperature: 5200 +[MakerNotes, Canon, Image] 10 - Picture Style: Neutral +[MakerNotes, Canon, Image] 11 - Digital Gain: 0 +[MakerNotes, Canon, Image] 12 - WB Shift AB: 0 +[MakerNotes, Canon, Image] 13 - WB Shift GM: 0 +[MakerNotes, Canon, Camera] 1 - Measured RGGB: 663 1024 1024 611 +[MakerNotes, Canon, Camera] 180 - Color Space: sRGB +[MakerNotes, Canon, Camera] 208 - VRD Offset: 0 +[MakerNotes, Canon, Image] 1 - Sensor Width: 3984 +[MakerNotes, Canon, Image] 2 - Sensor Height: 2622 +[MakerNotes, Canon, Image] 5 - Sensor Left Border: 88 +[MakerNotes, Canon, Image] 6 - Sensor Top Border: 25 +[MakerNotes, Canon, Image] 7 - Sensor Right Border: 3975 +[MakerNotes, Canon, Image] 8 - Sensor Bottom Border: 2616 +[MakerNotes, Canon, Image] 9 - Black Mask Left Border: 0 +[MakerNotes, Canon, Image] 10 - Black Mask Top Border: 0 +[MakerNotes, Canon, Image] 11 - Black Mask Right Border: 0 +[MakerNotes, Canon, Image] 12 - Black Mask Bottom Border: 0 +[MakerNotes, Canon, Camera] 0 - Color Data Version: 2 (1DmkIII) +[MakerNotes, Canon, Camera] 0 - WB RGGB Levels As Shot: 2275 1024 1024 1357 +[MakerNotes, Canon, Camera] 4 - Color Temp As Shot: 6142 +[MakerNotes, Canon, Camera] 5 - WB RGGB Levels Auto: 2275 1024 1024 1357 +[MakerNotes, Canon, Camera] 9 - Color Temp Auto: 6142 +[MakerNotes, Canon, Camera] 10 - WB RGGB Levels Measured: 2272 1026 1021 1355 +[MakerNotes, Canon, Camera] 14 - Color Temp Measured: 6142 +[MakerNotes, Canon, Camera] 20 - WB RGGB Levels Daylight: 2101 1024 1024 1535 +[MakerNotes, Canon, Camera] 24 - Color Temp Daylight: 5200 +[MakerNotes, Canon, Camera] 25 - WB RGGB Levels Shade: 2433 1024 1024 1259 +[MakerNotes, Canon, Camera] 29 - Color Temp Shade: 7000 +[MakerNotes, Canon, Camera] 30 - WB RGGB Levels Cloudy: 2270 1024 1024 1382 +[MakerNotes, Canon, Camera] 34 - Color Temp Cloudy: 6000 +[MakerNotes, Canon, Camera] 35 - WB RGGB Levels Tungsten: 1603 1134 1134 2760 +[MakerNotes, Canon, Camera] 39 - Color Temp Tungsten: 3200 +[MakerNotes, Canon, Camera] 40 - WB RGGB Levels Fluorescent: 1938 1073 1073 2419 +[MakerNotes, Canon, Camera] 44 - Color Temp Fluorescent: 3768 +[MakerNotes, Canon, Camera] 45 - WB RGGB Levels Kelvin: 2101 1024 1024 1535 +[MakerNotes, Canon, Camera] 49 - Color Temp Kelvin: 5210 +[MakerNotes, Canon, Camera] 50 - WB RGGB Levels Flash: 2422 1024 1024 1295 +[MakerNotes, Canon, Camera] 54 - Color Temp Flash: 6777 +[MakerNotes, Canon, Camera] 231 - Average Black Level: 1024 1024 1024 1024 +[MakerNotes, Canon, Camera] 640 - Raw Measured RGGB: 294111 455756 464315 279659 +[MakerNotes, Canon, Camera] 16392 - Picture Style User Def: Standard; Standard; Standard +[MakerNotes, Canon, Camera] 16393 - Picture Style PC: n/a; n/a; n/a +[MakerNotes, Canon, Camera] 16400 - Custom Picture Style File Name: +[MakerNotes, Canon, Camera] 1 - AF Micro Adj Mode: Disable +[MakerNotes, Canon, Camera] 2 - AF Micro Adj Value: 0 +[Composite, Composite, Camera] Canon-DriveMode - Drive Mode: Continuous Shooting +[Composite, Composite, Image] Canon-FileNumber - File Number: 108-0232 +[Composite, Composite, Camera] Canon-ISO - ISO: 3200 +[Composite, Composite, Camera] Canon-Lens - Lens: 16.0 - 35.0 mm +[Composite, Composite, Camera] Canon-OriginalDecisionData - Original Decision Data: (Binary data 512 bytes) +[Composite, Composite, Camera] Canon-ShootingMode - Shooting Mode: Program AE +[Composite, Composite, Camera] Canon-WB_RGGBLevels - WB RGGB Levels: 2275 1024 1024 1357 +[Composite, Composite, Image] Exif-Aperture - Aperture: 5.6 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.325195 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Canon EF 16-35mm f/2.8L II USM +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 2.22168 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.3 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/125 +[Composite, Composite, Time] Exif-SubSecCreateDate - Create Date: 2007:02:22 17:02:42.81 +[Composite, Composite, Time] Exif-SubSecDateTimeOriginal - Date/Time Original: 2007:02:22 17:02:42.81 +[Composite, Composite, Time] Exif-SubSecModifyDate - Modify Date: 2007:02:22 17:02:42.81 +[Composite, Composite, Camera] Canon-Lens35efl - Lens: 16.0 - 35.0 mm (35 mm equivalent: 20.5 - 44.8 mm) +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.023 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: 0.60 m (1.41 - 2.01 m) +[Composite, Composite, Image] Exif-FOV - Field Of View: 43.7 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 35.0 mm (35 mm equivalent: 44.8 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 9.33 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 6.9 diff --git a/t/Canon_3.out b/t/Canon_3.out new file mode 100644 index 0000000..dbec15d --- /dev/null +++ b/t/Canon_3.out @@ -0,0 +1,3 @@ +[MakerNotes, CanonCustom, Camera] 259 - ISO Speed Range: Enable; Max 1600; Min 200 +[MakerNotes, CanonCustom, Camera] 2060 - Timer Length: Enable; 6 s: 5; 16 s: 20; After release: 6 +[Composite, Composite, Camera] Canon-OriginalDecisionData - Original Decision Data: (Binary data 512 bytes) diff --git a/t/Casio.t b/t/Casio.t new file mode 100644 index 0000000..fe048fc --- /dev/null +++ b/t/Casio.t @@ -0,0 +1,55 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Casio.t". + +BEGIN { + $| = 1; print "1..6\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Casio; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Casio'; +my $testnum = 1; + +# test 2-4: Extract information from Casio images +{ + my $file; + my $exifTool = new Image::ExifTool; + foreach $file ('Casio.jpg', 'Casio2.jpg', 'CasioQVCI.jpg') { + ++$testnum; + my $info = $exifTool->ImageInfo("t/images/$file"); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + } +} + +# test 5: Write some new information +{ + ++$testnum; + my @writeInfo = ( + [MaxApertureValue => 4], + [FocusMode => 'Macro'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 6: Write some new information in type 2 file +{ + ++$testnum; + my @writeInfo = ( + ['XResolution',300], + ['YResolution',300], + ['ObjectDistance','3.5'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/Casio2.jpg'); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Casio_2.out b/t/Casio_2.out new file mode 100644 index 0000000..0b9b75c --- /dev/null +++ b/t/Casio_2.out @@ -0,0 +1,72 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Casio.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1203 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:03-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: CASIO +[EXIF, IFD0, Camera] 272 - Camera Model Name: QV-3000EX +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Ver1.000 +[EXIF, IFD0, Time] 306 - Modify Date: 2000:03:31 10:44:15 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/114 +[EXIF, ExifIFD, Image] 33437 - F Number: 2.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2000:03:31 10:44:15 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2000:03:31 10:44:15 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 3.645833333 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 13.3 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2048 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1536 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 926 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Casio, Camera] 1 - Recording Mode: Single Shutter +[MakerNotes, Casio, Camera] 2 - Quality: Fine +[MakerNotes, Casio, Camera] 3 - Focus Mode: Auto +[MakerNotes, Casio, Camera] 4 - Flash Mode: Red-eye Reduction +[MakerNotes, Casio, Camera] 5 - Flash Intensity: Normal +[MakerNotes, Casio, Camera] 6 - Object Distance: 2.5 m +[MakerNotes, Casio, Camera] 7 - White Balance: Auto +[MakerNotes, Casio, Camera] 10 - Digital Zoom: Off +[MakerNotes, Casio, Camera] 11 - Sharpness: Normal +[MakerNotes, Casio, Camera] 12 - Contrast: Normal +[MakerNotes, Casio, Camera] 13 - Saturation: Normal +[MakerNotes, Casio, Camera] 20 - ISO: 64 +[Composite, Composite, Image] Exif-Aperture - Aperture: 2.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/114 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 13.3 mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.5 diff --git a/t/Casio_3.out b/t/Casio_3.out new file mode 100644 index 0000000..87f69d1 --- /dev/null +++ b/t/Casio_3.out @@ -0,0 +1,102 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Casio2.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1699 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:03-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: CASIO COMPUTER CO.,LTD +[EXIF, IFD0, Camera] 272 - Camera Model Name: EX-Z3 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: 1.00 +[EXIF, IFD0, Time] 306 - Modify Date: 2003:06:18 16:54:37 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/80 +[EXIF, ExifIFD, Image] 33437 - F Number: 3.9 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:06:18 16:54:37 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:06:18 16:54:37 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 0.533203125 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.6 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 12.2 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2048 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1536 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Manual +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: undef +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 74 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: None +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1396 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Casio, Image] 2 - Preview Image Size: 320x240 +[MakerNotes, Casio, Image] 3 - Preview Image Length: 26 +[MakerNotes, Casio, Image] 4 - Preview Image Start: 1424 +[MakerNotes, Casio, Preview] 8192 - Preview Image: (Binary data 26 bytes) +[MakerNotes, Casio, Camera] 8193 - Firmware Date: 2003:02:28 09:45 +[MakerNotes, Casio, Camera] 8209 - White Balance Bias: 87 93 +[MakerNotes, Casio, Camera] 8210 - White Balance: Unknown (13) +[MakerNotes, Casio, Camera] 8225 - AF Point Position: 0.5 0.5 +[MakerNotes, Casio, Camera] 8226 - Object Distance: 1 m +[MakerNotes, Casio, Camera] 8244 - Flash Distance: 0 +[MakerNotes, Casio, Camera] 12288 - Record Mode: Program AE +[MakerNotes, Casio, Camera] 12289 - Release Mode: Normal +[MakerNotes, Casio, Camera] 12290 - Quality: Fine +[MakerNotes, Casio, Camera] 12291 - Focus Mode: Single-Area Auto Focus +[MakerNotes, Casio, Camera] 12294 - Hometown City: New York +[MakerNotes, Casio, Camera] 12295 - Best Shot Mode: Off +[MakerNotes, Casio, Camera] 12305 - Sharpness: 0 +[MakerNotes, Casio, Camera] 12306 - Contrast: 0 +[MakerNotes, Casio, Camera] 12307 - Saturation: 0 +[MakerNotes, Casio, Camera] 12308 - ISO: 50 +[MakerNotes, Casio, Camera] 12309 - Color Mode: Off +[MakerNotes, Casio, Camera] 12310 - Enhancement: Off +[MakerNotes, Casio, Camera] 12311 - Color Filter: Off +[MakerNotes, Casio, Camera] 12315 - Art Mode: Normal +[MakerNotes, Casio, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.9 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 6.1 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/80 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.005 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: 0.26 m (0.89 - 1.15 m) +[Composite, Composite, Image] Exif-FOV - Field Of View: 27.3 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 12.2 mm (35 mm equivalent: 74.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 7.70 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 11.2 diff --git a/t/Casio_4.out b/t/Casio_4.out new file mode 100644 index 0000000..5d40964 --- /dev/null +++ b/t/Casio_4.out @@ -0,0 +1,28 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: CasioQVCI.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 407 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:05:31 09:18:08-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:03-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[JFIF, JFIF, Image] 0 - JFIF Version: 1.02 +[JFIF, JFIF, Image] 2 - Resolution Unit: None +[JFIF, JFIF, Image] 3 - X Resolution: 1 +[JFIF, JFIF, Image] 5 - Y Resolution: 1 +[MakerNotes, Casio, Camera] 44 - Casio Quality: Economy +[MakerNotes, Casio, Time] 77 - Date/Time Original: 1998:10:24 12:08:57 +[MakerNotes, Casio, Camera] 98 - Model Type: KX-778 +[MakerNotes, Casio, Camera] 114 - Manufacture Index: 98082901 +[MakerNotes, Casio, Camera] 124 - Manufacture Code: 98000829 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/Casio_5.out b/t/Casio_5.out new file mode 100644 index 0000000..7139a0d --- /dev/null +++ b/t/Casio_5.out @@ -0,0 +1,80 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Casio_5_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 1203 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:07:29 09:04:03-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:03-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2020:07:29 09:04:03-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: CASIO +[EXIF, IFD0, Camera] 272 - Camera Model Name: QV-3000EX +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Ver1.000 +[EXIF, IFD0, Time] 306 - Modify Date: 2000:03:31 10:44:15 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/114 +[EXIF, ExifIFD, Image] 33437 - F Number: 2.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2000:03:31 10:44:15 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2000:03:31 10:44:15 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 3.645833333 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 4.0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 13.3 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2048 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1536 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 926 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Casio, Camera] 1 - Recording Mode: Single Shutter +[MakerNotes, Casio, Camera] 2 - Quality: Fine +[MakerNotes, Casio, Camera] 3 - Focus Mode: Macro +[MakerNotes, Casio, Camera] 4 - Flash Mode: Red-eye Reduction +[MakerNotes, Casio, Camera] 5 - Flash Intensity: Normal +[MakerNotes, Casio, Camera] 6 - Object Distance: 2.5 m +[MakerNotes, Casio, Camera] 7 - White Balance: Auto +[MakerNotes, Casio, Camera] 8 - Casio 0x0008: 1 +[MakerNotes, Casio, Camera] 9 - Casio 0x0009: 1 +[MakerNotes, Casio, Camera] 10 - Digital Zoom: Off +[MakerNotes, Casio, Camera] 11 - Sharpness: Normal +[MakerNotes, Casio, Camera] 12 - Contrast: Normal +[MakerNotes, Casio, Camera] 13 - Saturation: Normal +[MakerNotes, Casio, Camera] 14 - Casio 0x000e: 0 +[MakerNotes, Casio, Camera] 15 - Casio 0x000f: 0 +[MakerNotes, Casio, Camera] 16 - Casio 0x0010: 0 +[MakerNotes, Casio, Camera] 17 - Casio 0x0011: 8126553 +[MakerNotes, Casio, Camera] 18 - Casio 0x0012: 16 +[MakerNotes, Casio, Camera] 19 - Casio 0x0013: 16 +[MakerNotes, Casio, Camera] 20 - ISO: 64 +[Composite, Composite, Image] Exif-Aperture - Aperture: 2.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/114 +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.5 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 13.3 mm diff --git a/t/Casio_6.out b/t/Casio_6.out new file mode 100644 index 0000000..3a09156 --- /dev/null +++ b/t/Casio_6.out @@ -0,0 +1,117 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Casio_6_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 1699 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:07:29 09:04:03-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:03-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2020:07:29 09:04:03-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: CASIO COMPUTER CO.,LTD +[EXIF, IFD0, Camera] 272 - Camera Model Name: EX-Z3 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 300 +[EXIF, IFD0, Image] 283 - Y Resolution: 300 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: 1.00 +[EXIF, IFD0, Time] 306 - Modify Date: 2003:06:18 16:54:37 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/80 +[EXIF, ExifIFD, Image] 33437 - F Number: 3.9 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:06:18 16:54:37 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:06:18 16:54:37 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 0.533203125 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.6 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 12.2 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2048 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1536 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Manual +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: undef +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 74 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: None +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1396 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Casio, Image] 2 - Preview Image Size: 320x240 +[MakerNotes, Casio, Image] 3 - Preview Image Length: 26 +[MakerNotes, Casio, Image] 4 - Preview Image Start: 1424 +[MakerNotes, Casio, Preview] 8192 - Preview Image: (Binary data 26 bytes) +[MakerNotes, Casio, Camera] 8193 - Firmware Date: 2003:02:28 09:45 +[MakerNotes, Casio, Camera] 8194 - Casio Type 2 0x2002: +[MakerNotes, Casio, Camera] 8195 - Casio Type 2 0x2003: +[MakerNotes, Casio, Camera] 8209 - White Balance Bias: 87 93 +[MakerNotes, Casio, Camera] 8210 - White Balance: Unknown (13) +[MakerNotes, Casio, Camera] 8211 - Casio Type 2 0x2013: 2 +[MakerNotes, Casio, Camera] 8225 - AF Point Position: 0.5 0.5 +[MakerNotes, Casio, Camera] 8226 - Object Distance: 3.5 m +[MakerNotes, Casio, Camera] 8227 - Casio Type 2 0x2023: 1 +[MakerNotes, Casio, Camera] 8241 - Casio Type 2 0x2031: +[MakerNotes, Casio, Camera] 8242 - Casio Type 2 0x2032: d +[MakerNotes, Casio, Camera] 8243 - Casio Type 2 0x2033: 1 +[MakerNotes, Casio, Camera] 8244 - Flash Distance: 0 +[MakerNotes, Casio, Camera] 12288 - Record Mode: Program AE +[MakerNotes, Casio, Camera] 12289 - Release Mode: Normal +[MakerNotes, Casio, Camera] 12290 - Quality: Fine +[MakerNotes, Casio, Camera] 12291 - Focus Mode: Single-Area Auto Focus +[MakerNotes, Casio, Camera] 12293 - Casio Type 2 0x3005: 0 1 +[MakerNotes, Casio, Camera] 12294 - Hometown City: New York +[MakerNotes, Casio, Camera] 12295 - Best Shot Mode: Off +[MakerNotes, Casio, Camera] 12305 - Sharpness: 0 +[MakerNotes, Casio, Camera] 12306 - Contrast: 0 +[MakerNotes, Casio, Camera] 12307 - Saturation: 0 +[MakerNotes, Casio, Camera] 12308 - ISO: 50 +[MakerNotes, Casio, Camera] 12309 - Color Mode: Off +[MakerNotes, Casio, Camera] 12310 - Enhancement: Off +[MakerNotes, Casio, Camera] 12311 - Color Filter: Off +[MakerNotes, Casio, Camera] 12312 - Casio Type 2 0x3018: 0 +[MakerNotes, Casio, Camera] 12313 - Casio Type 2 0x3019: 1 +[MakerNotes, Casio, Camera] 12314 - Casio Type 2 0x301a: 0 +[MakerNotes, Casio, Camera] 12315 - Art Mode: Normal +[MakerNotes, Casio, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[PrintIM, PrintIM, Printing] 1 - Print IM 0x0001: 0x00140014 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x01000000 +[PrintIM, PrintIM, Printing] 256 - Print IM 0x0100: 0x05000000 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x01000000 +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.9 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/80 +[Composite, Composite, Image] Exif-LightValue - Light Value: 11.2 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 6.1 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.005 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: 3.99 m (2.41 - 6.40 m) +[Composite, Composite, Image] Exif-FOV - Field Of View: 27.3 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 12.2 mm (35 mm equivalent: 74.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 7.70 m diff --git a/t/DICOM.t b/t/DICOM.t new file mode 100644 index 0000000..2d51138 --- /dev/null +++ b/t/DICOM.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/DICOM.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::DICOM; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'DICOM'; +my $testnum = 1; + +# test 2: Extract information from DICOM.dcm +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/DICOM.dcm'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/DICOM_2.out b/t/DICOM_2.out new file mode 100644 index 0000000..20bde76 --- /dev/null +++ b/t/DICOM_2.out @@ -0,0 +1,109 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: DICOM.dcm +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1860 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2005:11:14 14:47:21-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:16-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: DICOM +[File, File, Other] FileTypeExtension - File Type Extension: dcm +[File, File, Other] MIMEType - MIME Type: application/dicom +[DICOM, DICOM, Image] 0002,0000 - File Meta Info Group Length: 180 +[DICOM, DICOM, Image] 0002,0001 - File Meta Info Version: 0 1 +[DICOM, DICOM, Image] 0002,0002 - Media Storage SOP Class UID: MR Image Storage +[DICOM, DICOM, Image] 0002,0003 - Media Storage SOP Instance UID: 0.0.0.0.1.8811.2.20.20010413115754.12432 +[DICOM, DICOM, Image] 0002,0010 - Transfer Syntax UID: Explicit VR Little Endian +[DICOM, DICOM, Image] 0002,0012 - Implementation Class UID: 0.0.0.0 +[DICOM, DICOM, Image] 0002,0013 - Implementation Version Name: NOTSPECIFIED +[DICOM, DICOM, Image] 0002,0016 - Source Application Entity Title: NOTSPECIFIED +[DICOM, DICOM, Image] 0008,0008 - Image Type: ORIGINAL\PRIMARY\MPR +[DICOM, DICOM, Image] 0008,0016 - SOP Class UID: MR Image Storage +[DICOM, DICOM, Image] 0008,0018 - SOP Instance UID: 0.0.0.0.1.8811.2.20.20010413115754.12432 +[DICOM, DICOM, Image] 0008,0020 - Study Date: 2001:03:16 +[DICOM, DICOM, Image] 0008,0021 - Series Date: 2001:03:16 +[DICOM, DICOM, Image] 0008,0022 - Acquisition Date: 2001:03:16 +[DICOM, DICOM, Image] 0008,0023 - Content Date: 2001:03:23 +[DICOM, DICOM, Image] 0008,0030 - Study Time: 14:30:08 +[DICOM, DICOM, Image] 0008,0031 - Series Time: 14:34:14 +[DICOM, DICOM, Image] 0008,0032 - Acquisition Time: 14:34:15 +[DICOM, DICOM, Image] 0008,0033 - Content Time: 14:30:22 +[DICOM, DICOM, Image] 0008,0050 - Accession Number: +[DICOM, DICOM, Image] 0008,0060 - Modality: MR +[DICOM, DICOM, Image] 0008,0070 - Manufacturer: GE Medical Systems +[DICOM, DICOM, Image] 0008,0080 - Institution Name: +[DICOM, DICOM, Image] 0008,0090 - Referring Physician Name: +[DICOM, DICOM, Image] 0008,1010 - Station Name: MRS1 +[DICOM, DICOM, Image] 0008,1030 - Study Description: BRAIN +[DICOM, DICOM, Image] 0008,103E - Series Description: FSE PD AXIAL OBL +[DICOM, DICOM, Image] 0008,1050 - Performing Physician Name: +[DICOM, DICOM, Image] 0008,1070 - Operators Name: EC +[DICOM, DICOM, Image] 0008,1090 - Manufacturers Model Name: SIGNA +[DICOM, DICOM, Image] 0010,0010 - Patient Name: +[DICOM, DICOM, Image] 0010,0020 - Patient ID: 123456 +[DICOM, DICOM, Image] 0010,0030 - Patient Birth Date: +[DICOM, DICOM, Image] 0010,0040 - Patient Sex: F +[DICOM, DICOM, Image] 0010,1010 - Patient Age: 028Y +[DICOM, DICOM, Image] 0010,1030 - Patient Weight: 61.2350 +[DICOM, DICOM, Image] 0010,21B0 - Additional Patient History: +[DICOM, DICOM, Image] 0018,0020 - Scanning Sequence: SE +[DICOM, DICOM, Image] 0018,0021 - Sequence Variant: SK +[DICOM, DICOM, Image] 0018,0022 - Scan Options: SP +[DICOM, DICOM, Image] 0018,0023 - MR Acquisition Type: 2D +[DICOM, DICOM, Image] 0018,0024 - Sequence Name: fse +[DICOM, DICOM, Image] 0018,0050 - Slice Thickness: 5.00000 +[DICOM, DICOM, Image] 0018,0080 - Repetition Time: 2300.00 +[DICOM, DICOM, Image] 0018,0081 - Echo Time: 22.0000 +[DICOM, DICOM, Image] 0018,0083 - Number Of Averages: 1.00000 +[DICOM, DICOM, Image] 0018,0084 - Imaging Frequency: 63.8615 +[DICOM, DICOM, Image] 0018,0086 - Echo Number: 1 +[DICOM, DICOM, Image] 0018,0087 - Magnetic Field Strength: 1.50000 +[DICOM, DICOM, Image] 0018,0088 - Spacing Between Slices: 2.00000 +[DICOM, DICOM, Image] 0018,0089 - Number Of Phase Encoding Steps: 256 +[DICOM, DICOM, Image] 0018,0091 - Echo Train Length: 8 +[DICOM, DICOM, Image] 0018,0095 - Pixel Bandwidth: 31.2500 +[DICOM, DICOM, Image] 0018,1020 - Software Version: 3 +[DICOM, DICOM, Image] 0018,1030 - Protocol Name: CLINICAL BRAIN +[DICOM, DICOM, Image] 0018,1088 - Heart Rate: 0 +[DICOM, DICOM, Image] 0018,1090 - Cardiac Number Of Images: 0 +[DICOM, DICOM, Image] 0018,1094 - Trigger Window: 0 +[DICOM, DICOM, Image] 0018,1100 - Reconstruction Diameter: 220.000 +[DICOM, DICOM, Image] 0018,1250 - Receive Coil Name: HEAD +[DICOM, DICOM, Image] 0018,1310 - Acquisition Matrix: 0 256 256 0 +[DICOM, DICOM, Image] 0018,1312 - In Plane Phase Encoding Direction: ROW +[DICOM, DICOM, Image] 0018,1314 - Flip Angle: 90 +[DICOM, DICOM, Image] 0018,1316 - SAR: 0.0313309 +[DICOM, DICOM, Image] 0018,5100 - Patient Position: HFS +[DICOM, DICOM, Image] 0020,000D - Study Instance UID: 0.0.0.0.2.8811.20010413115754.12432 +[DICOM, DICOM, Image] 0020,000E - Series Instance UID: 0.0.0.0.3.8811.2.20010413115754.12432 +[DICOM, DICOM, Image] 0020,0010 - Study ID: 8811 +[DICOM, DICOM, Image] 0020,0011 - Series Number: 2 +[DICOM, DICOM, Image] 0020,0012 - Acquisition Number: 31763 +[DICOM, DICOM, Image] 0020,0013 - Instance Number: 20 +[DICOM, DICOM, Image] 0020,0020 - Patient Orientation: L\PH +[DICOM, DICOM, Image] 0020,0030 - Image Position: -110.500\-96.2063\59.0425 +[DICOM, DICOM, Image] 0020,0032 - Image Position Patient: -110.500\-96.2063\59.0425 +[DICOM, DICOM, Image] 0020,0035 - Image Orientation: 1.00000\0.00000\0.00000\0.00000\0.990960\0.134158 +[DICOM, DICOM, Image] 0020,0037 - Image Orientation Patient: 1.00000\0.00000\0.00000\0.00000\0.990960\0.134158 +[DICOM, DICOM, Image] 0020,0052 - Frame Of Reference UID: 0.0.0.0.4.8811.2.20010413115754.12432 +[DICOM, DICOM, Image] 0020,1002 - Images In Acquisition: 1 +[DICOM, DICOM, Image] 0020,1040 - Position Reference Indicator: NA +[DICOM, DICOM, Image] 0020,1041 - Slice Location: 73.8000 +[DICOM, DICOM, Image] 0028,0002 - Samples Per Pixel: 1 +[DICOM, DICOM, Image] 0028,0004 - Photometric Interpretation: MONOCHROME2 +[DICOM, DICOM, Image] 0028,0010 - Rows: 256 +[DICOM, DICOM, Image] 0028,0011 - Columns: 256 +[DICOM, DICOM, Image] 0028,0030 - Pixel Spacing: 0.859375\0.859375 +[DICOM, DICOM, Image] 0028,0100 - Bits Allocated: 16 +[DICOM, DICOM, Image] 0028,0101 - Bits Stored: 16 +[DICOM, DICOM, Image] 0028,0102 - High Bit: 15 +[DICOM, DICOM, Image] 0028,0103 - Pixel Representation: Signed +[DICOM, DICOM, Image] 0028,0106 - Smallest Image Pixel Value: 0 +[DICOM, DICOM, Image] 0028,0107 - Largest Image Pixel Value: 784 +[DICOM, DICOM, Image] 0028,0120 - Pixel Padding Value: 0 +[DICOM, DICOM, Image] 0028,1050 - Window Center: 0 +[DICOM, DICOM, Image] 0028,1051 - Window Width: 0 +[DICOM, DICOM, Image] 0028,1052 - Rescale Intercept: 0 +[DICOM, DICOM, Image] 0028,1053 - Rescale Slope: 1 +[DICOM, DICOM, Image] 0028,1054 - Rescale Type: SIGNAL INTENSITY (UNITLESS) +[DICOM, DICOM, Image] 7Fxx,0010 - Pixel Data: (Binary data 53 bytes) diff --git a/t/DNG.t b/t/DNG.t new file mode 100644 index 0000000..85d3083 --- /dev/null +++ b/t/DNG.t @@ -0,0 +1,40 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/DNG.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::DNG; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'DNG'; +my $testnum = 1; + +# test 2: Extract information from DNG.dng +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/DNG.dng'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Test writing maker notes information +{ + ++$testnum; + my @writeInfo = ( + [ OwnerName => 'Just Me' ], + [ OriginalDecisionData => "\xff\xff\xff\xff\x03\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0Test", Protected => 1 ], + ); + my @tags = qw(OwnerName OriginalDecisionData Warning Error); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/DNG.dng', \@tags); + print "ok $testnum\n"; +} + +# end diff --git a/t/DNG_2.out b/t/DNG_2.out new file mode 100644 index 0000000..d93e2dc --- /dev/null +++ b/t/DNG_2.out @@ -0,0 +1,329 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: DNG.dng +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 14 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:02:26 09:30:53-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:34-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: DNG +[File, File, Other] FileTypeExtension - File Type Extension: dng +[File, File, Other] MIMEType - MIME Type: image/x-adobe-dng +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[EXIF, IFD0, Image] 254 - Subfile Type: Reduced-resolution image +[EXIF, IFD0, Image] 256 - Image Width: 8 +[EXIF, IFD0, Image] 257 - Image Height: 8 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD0, Image] 259 - Compression: Uncompressed +[EXIF, IFD0, Image] 262 - Photometric Interpretation: RGB +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS 350D DIGITAL +[EXIF, IFD0, Image] 273 - Strip Offsets: 13470 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 277 - Samples Per Pixel: 3 +[EXIF, IFD0, Image] 278 - Rows Per Strip: 8 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 192 +[EXIF, IFD0, Image] 284 - Planar Configuration: Chunky +[EXIF, IFD0, Time] 306 - Modify Date: 2005:08:03 18:59:18 +[EXIF, IFD0, Author] 315 - Artist: unknown +[EXIF, SubIFD, Image] 254 - Subfile Type: Full-resolution image +[EXIF, SubIFD, Image] 256 - Image Width: 3516 +[EXIF, SubIFD, Image] 257 - Image Height: 2328 +[EXIF, SubIFD, Image] 258 - Bits Per Sample: 16 +[EXIF, SubIFD, Image] 259 - Compression: JPEG +[EXIF, SubIFD, Image] 262 - Photometric Interpretation: Color Filter Array +[EXIF, SubIFD, Image] 277 - Samples Per Pixel: 1 +[EXIF, SubIFD, Image] 284 - Planar Configuration: Chunky +[EXIF, SubIFD, Image] 322 - Tile Width: 256 +[EXIF, SubIFD, Image] 323 - Tile Length: 240 +[EXIF, SubIFD, Image] 324 - Tile Offsets: 12494 +[EXIF, SubIFD, Image] 325 - Tile Byte Counts: 22 +[EXIF, SubIFD, Image] 33421 - CFA Repeat Pattern Dim: 2 2 +[EXIF, SubIFD, Image] 33422 - CFA Pattern 2: 0 1 1 2 +[EXIF, SubIFD, Image] 50710 - CFA Plane Color: Red,Green,Blue +[EXIF, SubIFD, Image] 50711 - CFA Layout: Rectangular +[EXIF, SubIFD, Image] 50713 - Black Level Repeat Dim: 1 1 +[EXIF, SubIFD, Image] 50714 - Black Level: 0 +[EXIF, SubIFD, Image] 50717 - White Level: 4095 +[EXIF, SubIFD, Image] 50718 - Default Scale: 1 1 +[EXIF, SubIFD, Image] 50719 - Default Crop Origin: 10 5 +[EXIF, SubIFD, Image] 50720 - Default Crop Size: 3456 2304 +[EXIF, SubIFD, Image] 50733 - Bayer Green Split: 0 +[EXIF, SubIFD, Image] 50738 - Anti Alias Strength: 1 +[EXIF, SubIFD, Image] 50780 - Best Quality Scale: 1 +[EXIF, SubIFD, Image] 50829 - Active Area: 14 42 2328 3516 +[EXIF, SubIFD, Image] 50830 - Masked Areas: 14 0 2328 40 +[EXIF, SubIFD1, Image] 254 - Subfile Type: Reduced-resolution image +[EXIF, SubIFD1, Image] 256 - Image Width: 1024 +[EXIF, SubIFD1, Image] 257 - Image Height: 683 +[EXIF, SubIFD1, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, SubIFD1, Image] 259 - Compression: JPEG +[EXIF, SubIFD1, Image] 262 - Photometric Interpretation: YCbCr +[EXIF, SubIFD1, Image] 273 - Preview Image Start: 12780 +[EXIF, SubIFD1, Image] 277 - Samples Per Pixel: 3 +[EXIF, SubIFD1, Image] 278 - Rows Per Strip: 683 +[EXIF, SubIFD1, Image] 279 - Preview Image Length: 26 +[EXIF, SubIFD1, Image] 284 - Planar Configuration: Chunky +[EXIF, SubIFD1, Image] 529 - Y Cb Cr Coefficients: 0.299 0.587 0.114 +[EXIF, SubIFD1, Image] 530 - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, SubIFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, SubIFD1, Image] 532 - Reference Black White: 0 255 128 255 128 255 +[EXIF, SubIFD2, Image] 254 - Subfile Type: Reduced-resolution image +[EXIF, SubIFD2, Image] 256 - Image Width: 3456 +[EXIF, SubIFD2, Image] 257 - Image Height: 2304 +[EXIF, SubIFD2, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, SubIFD2, Image] 259 - Compression: JPEG +[EXIF, SubIFD2, Image] 262 - Photometric Interpretation: YCbCr +[EXIF, SubIFD2, Image] 273 - Jpg From Raw Start: 13070 +[EXIF, SubIFD2, Image] 277 - Samples Per Pixel: 3 +[EXIF, SubIFD2, Image] 278 - Rows Per Strip: 2304 +[EXIF, SubIFD2, Image] 279 - Jpg From Raw Length: 29 +[EXIF, SubIFD2, Image] 284 - Planar Configuration: Chunky +[EXIF, SubIFD2, Image] 529 - Y Cb Cr Coefficients: 0.299 0.587 0.114 +[EXIF, SubIFD2, Image] 530 - Y Cb Cr Sub Sampling: YCbCr4:4:4 (1 1) +[EXIF, SubIFD2, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, SubIFD2, Image] 532 - Reference Black White: 0 255 128 255 128 255 +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/15 +[EXIF, ExifIFD, Image] 33437 - F Number: 8.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 400 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2005:08:03 18:59:18 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2005:08:03 18:59:18 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/15 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 8.0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 4.0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Average +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 55.0 mm +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3954.23341 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3958.762887 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, IFD0, Image] 37393 - Image Number: 24 +[EXIF, IFD0, Image] 50706 - DNG Version: 1.1.0.0 +[EXIF, IFD0, Image] 50707 - DNG Backward Version: 1.1.0.0 +[EXIF, IFD0, Image] 50708 - Unique Camera Model: Canon EOS 350D +[EXIF, IFD0, Image] 50709 - Localized Camera Model: Canon EOS 350D Digital +[EXIF, IFD0, Image] 50721 - Color Matrix 1: 0.6159 -0.0945 -0.0745 -0.6846 1.3563 0.3684 -0.0802 0.1086 0.7555 +[EXIF, IFD0, Image] 50722 - Color Matrix 2: 0.6018 -0.0617 -0.0965 -0.8645 1.5881 0.2975 -0.153 0.1719 0.7642 +[EXIF, IFD0, Image] 50723 - Camera Calibration 1: 1.0069 0 0 0 1 0 0 0 1.0027 +[EXIF, IFD0, Image] 50724 - Camera Calibration 2: 1.0069 0 0 0 1 0 0 0 1.0027 +[EXIF, IFD0, Image] 50727 - Analog Balance: 1 1 1 +[EXIF, IFD0, Image] 50728 - As Shot Neutral: 0.592408 1 0.501692 +[EXIF, IFD0, Image] 50730 - Baseline Exposure: 0.25 +[EXIF, IFD0, Image] 50731 - Baseline Noise: 1.33 +[EXIF, IFD0, Image] 50732 - Baseline Sharpness: 1.5 +[EXIF, IFD0, Image] 50734 - Linear Response Limit: 1 +[EXIF, IFD0, Camera] 50735 - Camera Serial Number: 012345678 +[EXIF, IFD0, Camera] 50736 - DNG Lens Info: 18-55mm f/? +[EXIF, IFD0, Image] 50739 - Shadow Scale: 1 +[EXIF, IFD0, Image] 50778 - Calibration Illuminant 1: Standard Light A +[EXIF, IFD0, Image] 50779 - Calibration Illuminant 2: D65 +[EXIF, IFD0, Image] 50781 - Raw Data Unique ID: 0358DB4E08632D90925171A6BB8848A2 +[EXIF, IFD0, Image] 50827 - Original Raw File Name: Canon350D.CR2 +[EXIF, SubIFD2, Preview] Exif-JpgFromRaw - Jpg From Raw: (Binary data 29 bytes) +[EXIF, SubIFD1, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[EXIF, IFD0, Preview] Exif-ThumbnailTIFF - Thumbnail TIFF: (Binary data 408 bytes) +[XMP, XMP-x, Document] xmptk - XMP Toolkit: XMP toolkit 3.0-28, framework 1.6 +[XMP, XMP-exif, Image] ExifVersion - Exif Version: 0221 +[XMP, XMP-exif, Image] ExposureTime - Exposure Time: 1/15 +[XMP, XMP-exif, Image] ShutterSpeedValue - Shutter Speed Value: 1/15 +[XMP, XMP-exif, Image] FNumber - F Number: 8.0 +[XMP, XMP-exif, Image] ApertureValue - Aperture Value: 8.0 +[XMP, XMP-exif, Camera] ExposureProgram - Exposure Program: Aperture-priority AE +[XMP, XMP-exif, Image] ISOSpeedRatings - ISO: 400 +[XMP, XMP-exif, Time] DateTimeOriginal - Date/Time Original: 2005:08:03 18:59:18-04:00 +[XMP, XMP-exif, Time] DateTimeDigitized - Date/Time Digitized: 2005:08:03 18:59:18-04:00 +[XMP, XMP-exif, Image] ExposureBiasValue - Exposure Compensation: 0 +[XMP, XMP-exif, Camera] MaxApertureValue - Max Aperture Value: 4.0 +[XMP, XMP-exif, Camera] MeteringMode - Metering Mode: Average +[XMP, XMP-exif, Camera] FlashFired - Flash Fired: False +[XMP, XMP-exif, Camera] FlashReturn - Flash Return: No return detection +[XMP, XMP-exif, Camera] FlashMode - Flash Mode: Off +[XMP, XMP-exif, Camera] FlashFunction - Flash Function: False +[XMP, XMP-exif, Camera] FlashRedEyeMode - Flash Red Eye Mode: False +[XMP, XMP-exif, Camera] FocalLength - Focal Length: 55.0 mm +[XMP, XMP-exif, Image] CustomRendered - Custom Rendered: Normal +[XMP, XMP-exif, Camera] ExposureMode - Exposure Mode: Auto +[XMP, XMP-exif, Camera] WhiteBalance - White Balance: Auto +[XMP, XMP-exif, Camera] SceneCaptureType - Scene Capture Type: Standard +[XMP, XMP-exif, Camera] FocalPlaneXResolution - Focal Plane X Resolution: 3954.23340961098 +[XMP, XMP-exif, Camera] FocalPlaneYResolution - Focal Plane Y Resolution: 3958.76288659794 +[XMP, XMP-exif, Camera] FocalPlaneResolutionUnit - Focal Plane Resolution Unit: inches +[XMP, XMP-aux, Camera] SerialNumber - Serial Number: 012345678 +[XMP, XMP-aux, Camera] LensInfo - Lens Info: 18-55mm f/? +[XMP, XMP-aux, Camera] Lens - Lens: 18.0-55.0 mm +[XMP, XMP-aux, Camera] ImageNumber - Image Number: 24 +[XMP, XMP-aux, Camera] FlashCompensation - Flash Compensation: 0 +[XMP, XMP-aux, Camera] OwnerName - Owner Name: unknown +[XMP, XMP-aux, Camera] Firmware - Firmware: 1.0.2 +[XMP, XMP-tiff, Camera] Make - Make: Canon +[XMP, XMP-tiff, Camera] Model - Camera Model Name: Canon EOS 350D DIGITAL +[XMP, XMP-tiff, Time] DateTime - Date/Time Modified: 2005:08:03 18:59:18-04:00 +[XMP, XMP-tiff, Image] Orientation - Orientation: Horizontal (normal) +[XMP, XMP-dc, Other] Creator - Creator: unknown +[MakerNotes, Canon, Camera] 1 - Macro Mode: Normal +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Single +[MakerNotes, Canon, Camera] 7 - Focus Mode: One-shot AF +[MakerNotes, Canon, Camera] 9 - Record Mode: CR2 +[MakerNotes, Canon, Camera] 10 - Canon Image Size: n/a +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: None +[MakerNotes, Canon, Camera] 13 - Contrast: Normal +[MakerNotes, Canon, Camera] 14 - Saturation: Normal +[MakerNotes, Canon, Camera] 15 - Sharpness: 0 +[MakerNotes, Canon, Camera] 17 - Metering Mode: Center-weighted average +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Aperture-priority AE +[MakerNotes, Canon, Camera] 22 - Lens Type: n/a +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 55 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 18 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 4 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 27 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: (none) +[MakerNotes, Canon, Camera] 32 - Focus Continuous: Single +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 0 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 0 +[MakerNotes, Canon, Camera] 40 - Photo Effect: Off +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, Canon, Image] 0 - Focal Type: Zoom +[MakerNotes, Canon, Image] 1 - Focal Length: 55 mm +[MakerNotes, Canon, Image] 2 - Focal Plane X Size: 23.04 mm +[MakerNotes, Canon, Image] 3 - Focal Plane Y Size: 15.37 mm +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 400 +[MakerNotes, Canon, Image] 3 - Measured EV: 8.00 +[MakerNotes, Canon, Image] 4 - Target Aperture: 8 +[MakerNotes, Canon, Image] 5 - Target Exposure Time: 1/15 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 21 - F Number: 8 +[MakerNotes, Canon, Image] 22 - Exposure Time: 1/16 +[MakerNotes, Canon, Image] 23 - Measured EV 2: 8.125 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 0 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS Mid-range +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 29 - Self Timer 2: 0 +[MakerNotes, Canon, Image] 6 - Canon Image Type: Canon EOS 350D DIGITAL +[MakerNotes, Canon, Camera] 7 - Canon Firmware Version: Firmware 1.0.2 +[MakerNotes, Canon, Camera] 9 - Owner Name: unknown +[MakerNotes, Canon, Camera] 12 - Serial Number: 0012345678 +[MakerNotes, CanonCustom, Camera] 0 - Set Button Cross Keys Func: Normal +[MakerNotes, CanonCustom, Camera] 1 - Long Exposure Noise Reduction: Off +[MakerNotes, CanonCustom, Camera] 2 - Flash Sync Speed Av: Auto +[MakerNotes, CanonCustom, Camera] 3 - Shutter-AE Lock: AF/AE lock +[MakerNotes, CanonCustom, Camera] 4 - AF Assist Beam: Emits +[MakerNotes, CanonCustom, Camera] 5 - Exposure Level Increments: 1/3 Stop +[MakerNotes, CanonCustom, Camera] 6 - Mirror Lockup: Disable +[MakerNotes, CanonCustom, Camera] 7 - E-TTL II: Evaluative +[MakerNotes, CanonCustom, Camera] 8 - Shutter Curtain Sync: 1st-curtain sync +[MakerNotes, Canon, Camera] 16 - Canon Model ID: EOS Digital Rebel XT / 350D / Kiss Digital N +[MakerNotes, Canon, Camera] 0 - Num AF Points: 7 +[MakerNotes, Canon, Camera] 1 - Valid AF Points: 7 +[MakerNotes, Canon, Image] 2 - Canon Image Width: 3456 +[MakerNotes, Canon, Image] 3 - Canon Image Height: 2304 +[MakerNotes, Canon, Camera] 4 - AF Image Width: 3456 +[MakerNotes, Canon, Camera] 5 - AF Image Height: 2304 +[MakerNotes, Canon, Camera] 6 - AF Area Width: 189 +[MakerNotes, Canon, Camera] 7 - AF Area Height: 188 +[MakerNotes, Canon, Camera] 8 - AF Area X Positions: 0 -1237 -742 0 742 1237 0 +[MakerNotes, Canon, Camera] 9 - AF Area Y Positions: -617 0 0 0 0 0 617 +[MakerNotes, Canon, Camera] 10 - AF Points In Focus: 3 +[MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 7 112 +[MakerNotes, Canon, Camera] 21 - Serial Number Format: Format 2 +[MakerNotes, Canon, Camera] 131 - Original Decision Data Offset: 0 +[MakerNotes, Canon, Image] 1 - File Number: 100-0024 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Image] 8 - Long Exposure Noise Reduction 2: Off +[MakerNotes, Canon, Image] 9 - WB Bracket Mode: Off +[MakerNotes, Canon, Image] 12 - WB Bracket Value AB: 0 +[MakerNotes, Canon, Image] 13 - WB Bracket Value GM: 0 +[MakerNotes, Canon, Image] 14 - Filter Effect: None +[MakerNotes, Canon, Image] 15 - Toning Effect: None +[MakerNotes, Canon, Image] 1 - Tone Curve: Standard +[MakerNotes, Canon, Image] 3 - Sharpness Frequency: n/a +[MakerNotes, Canon, Image] 4 - Sensor Red Level: 0 +[MakerNotes, Canon, Image] 5 - Sensor Blue Level: 0 +[MakerNotes, Canon, Image] 6 - White Balance Red: 0 +[MakerNotes, Canon, Image] 7 - White Balance Blue: 0 +[MakerNotes, Canon, Image] 9 - Color Temperature: 5200 +[MakerNotes, Canon, Image] 10 - Picture Style: None +[MakerNotes, Canon, Image] 11 - Digital Gain: 0 +[MakerNotes, Canon, Image] 12 - WB Shift AB: 0 +[MakerNotes, Canon, Image] 13 - WB Shift GM: 0 +[MakerNotes, Canon, Camera] 1 - Measured RGGB: 580 1024 1024 500 +[MakerNotes, Canon, Camera] 208 - VRD Offset: 0 +[MakerNotes, Canon, Image] 1 - Sensor Width: 3516 +[MakerNotes, Canon, Image] 2 - Sensor Height: 2328 +[MakerNotes, Canon, Image] 5 - Sensor Left Border: 52 +[MakerNotes, Canon, Image] 6 - Sensor Top Border: 19 +[MakerNotes, Canon, Image] 7 - Sensor Right Border: 3507 +[MakerNotes, Canon, Image] 8 - Sensor Bottom Border: 2322 +[MakerNotes, Canon, Image] 9 - Black Mask Left Border: 0 +[MakerNotes, Canon, Image] 10 - Black Mask Top Border: 0 +[MakerNotes, Canon, Image] 11 - Black Mask Right Border: 0 +[MakerNotes, Canon, Image] 12 - Black Mask Bottom Border: 0 +[MakerNotes, Canon, Camera] 25 - WB RGGB Levels As Shot: 2002 1185 1187 2364 +[MakerNotes, Canon, Camera] 29 - Color Temp As Shot: 3064 +[MakerNotes, Canon, Camera] 30 - WB RGGB Levels Auto: 1720 1022 1024 2031 +[MakerNotes, Canon, Camera] 34 - Color Temp Auto: 3064 +[MakerNotes, Canon, Camera] 35 - WB RGGB Levels Daylight: 2312 1022 1024 1501 +[MakerNotes, Canon, Camera] 39 - Color Temp Daylight: 5200 +[MakerNotes, Canon, Camera] 40 - WB RGGB Levels Shade: 2714 1022 1024 1246 +[MakerNotes, Canon, Camera] 44 - Color Temp Shade: 7000 +[MakerNotes, Canon, Camera] 45 - WB RGGB Levels Cloudy: 2512 1022 1024 1355 +[MakerNotes, Canon, Camera] 49 - Color Temp Cloudy: 6000 +[MakerNotes, Canon, Camera] 50 - WB RGGB Levels Tungsten: 1523 1022 1024 2397 +[MakerNotes, Canon, Camera] 54 - Color Temp Tungsten: 3201 +[MakerNotes, Canon, Camera] 55 - WB RGGB Levels Fluorescent: 1944 1022 1024 2015 +[MakerNotes, Canon, Camera] 59 - Color Temp Fluorescent: 3905 +[MakerNotes, Canon, Camera] 60 - WB RGGB Levels Flash: 2606 1022 1024 1308 +[MakerNotes, Canon, Camera] 64 - Color Temp Flash: 6440 +[MakerNotes, Canon, Camera] 65 - WB RGGB Levels Custom 1: 2312 1022 1024 1501 +[MakerNotes, Canon, Camera] 69 - Color Temp Custom 1: 5200 +[MakerNotes, Canon, Camera] 70 - WB RGGB Levels Custom 2: 2312 1022 1024 1501 +[MakerNotes, Canon, Camera] 74 - Color Temp Custom 2: 5200 +[MakerNotes, Canon, Camera] 2 - Color Tone: Normal +[Composite, Composite, Camera] Canon-DriveMode - Drive Mode: Single-frame Shooting +[Composite, Composite, Camera] Canon-ISO - ISO: 400 +[Composite, Composite, Camera] Canon-Lens - Lens: 18.0 - 55.0 mm +[Composite, Composite, Camera] Canon-ShootingMode - Shooting Mode: Aperture-priority AE +[Composite, Composite, Camera] Canon-WB_RGGBLevels - WB RGGB Levels: 2002 1185 1187 2364 +[Composite, Composite, Image] Exif-Aperture - Aperture: 8.0 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.993255 +[Composite, Composite, Image] Exif-CFAPattern - CFA Pattern: [Red,Green][Green,Blue] +[Composite, Composite, Image] Exif-ImageSize - Image Size: 3516x2328 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Unknown 18-55mm +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 8.2 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 1.688027 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.6 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/15 +[Composite, Composite, Camera] XMP-Flash - Flash: Off, Did not fire +[Composite, Composite, Camera] Canon-Lens35efl - Lens: 18.0 - 55.0 mm (35 mm equivalent: 29.2 - 89.2 mm) +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.019 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 22.8 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 55.0 mm (35 mm equivalent: 89.2 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 20.42 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 7.9 diff --git a/t/DNG_3.out b/t/DNG_3.out new file mode 100644 index 0000000..b01e01e --- /dev/null +++ b/t/DNG_3.out @@ -0,0 +1,4 @@ +[XMP, XMP-aux, Camera] OwnerName - Owner Name: Just Me +[EXIF, ExifIFD, Image] 42032 - Owner Name: Just Me +[MakerNotes, Canon, Camera] 9 - Owner Name: Just Me +[Composite, Composite, Camera] Canon-OriginalDecisionData - Original Decision Data: (Binary data 24 bytes) diff --git a/t/DPX.t b/t/DPX.t new file mode 100644 index 0000000..e455c27 --- /dev/null +++ b/t/DPX.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/DPX.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::DPX; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'DPX'; +my $testnum = 1; + +# test 2: Extract information from DPX.dpx +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/DPX.dpx'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/DPX_2.out b/t/DPX_2.out new file mode 100644 index 0000000..a2a0f52 --- /dev/null +++ b/t/DPX_2.out @@ -0,0 +1,42 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: DPX.dpx +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 2.1 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:09:20 08:49:38-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:34-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: DPX +[File, File, Other] FileTypeExtension - File Type Extension: dpx +[File, File, Other] MIMEType - MIME Type: image/x-dpx +[File, File, Image] 0 - Byte Order: Big-endian +[File, File, Image] 8 - Header Version: V1.0 +[File, File, Image] 16 - DPX File Size: 12812288 +[File, File, Image] 20 - Ditto Key: New +[File, File, Image] 36 - Image File Name: Image filename +[File, File, Time] 136 - Create Date: 2010:08:03 08:38:16 +[File, File, Author] 160 - Creator: Creator +[File, File, Image] 260 - Project: Project name +[File, File, Author] 460 - Copyright: Copyright info +[File, File, Image] 660 - Encryption Key: ffffffff +[File, File, Image] 768 - Orientation: Horizontal (normal) +[File, File, Image] 770 - Image Elements: 1 +[File, File, Image] 772 - Image Width: 2048 +[File, File, Image] 776 - Image Height: 1556 +[File, File, Image] 780 - Data Sign: Unsigned +[File, File, Image] 800 - Components Configuration: R, G, B +[File, File, Image] 801 - Transfer Characteristic: Printing density +[File, File, Image] 802 - Colorimetric Specification: Printing density +[File, File, Image] 803 - Bit Depth: 10 +[File, File, Image] 820 - Image Description: CPD +[File, File, Image] 1432 - Source File Name: +[File, File, Image] 1532 - Source Create Date: +[File, File, Image] 1556 - Input Device Name: SPIRIT-4K DATACINE +[File, File, Image] 1588 - Input Device Serial Number: 01018 +[File, File, Image] 1724 - Original Frame Rate: 0 +[File, File, Image] 1732 - Frame ID: +[File, File, Image] 1764 - Slate Information: +[File, File, Image] 1920 - Time Code: 4117 +[File, File, Image] 2048 - User ID: Thomson BTS +[Composite, Composite, Image] Exif-ImageSize - Image Size: 2048x1556 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 3.2 diff --git a/t/DV.t b/t/DV.t new file mode 100644 index 0000000..c0457d2 --- /dev/null +++ b/t/DV.t @@ -0,0 +1,28 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/DV.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::DV; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'DV'; +my $testnum = 1; + +# test 2: Extract information from an DV file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/DV.dv'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/DV_2.out b/t/DV_2.out new file mode 100644 index 0000000..0929d30 --- /dev/null +++ b/t/DV_2.out @@ -0,0 +1,26 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: DV.dv +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 4.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:12:25 08:53:20-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:34-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: DV +[File, File, Other] FileTypeExtension - File Type Extension: dv +[File, File, Other] MIMEType - MIME Type: video/x-dv +[DV, DV, Time] DateTimeOriginal - Date/Time Original: 2010:02:16 21:36:28 +[DV, DV, Video] ImageWidth - Image Width: 720 +[DV, DV, Video] ImageHeight - Image Height: 576 +[DV, DV, Video] Duration - Duration: 0.00 s +[DV, DV, Video] TotalBitrate - Total Bitrate: 28.8 Mbps +[DV, DV, Video] VideoFormat - Video Format: IEC 61834 - 625/50 (PAL) +[DV, DV, Video] VideoScanType - Video Scan Type: Interlaced +[DV, DV, Video] FrameRate - Frame Rate: 25 +[DV, DV, Video] AspectRatio - Aspect Ratio: 16:9 +[DV, DV, Video] Colorimetry - Colorimetry: 4:2:0 +[DV, DV, Audio] AudioChannels - Audio Channels: 4 +[DV, DV, Audio] AudioSampleRate - Audio Sample Rate: 32000 +[DV, DV, Audio] AudioBitsPerSample - Audio Bits Per Sample: 12 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 720x576 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.415 diff --git a/t/DjVu.t b/t/DjVu.t new file mode 100644 index 0000000..16cbcbb --- /dev/null +++ b/t/DjVu.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/DjVu.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::DjVu; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'DjVu'; +my $testnum = 1; + +# test 2: Extract information from DjVu.djvu +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/DjVu.djvu'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/DjVu_2.out b/t/DjVu_2.out new file mode 100644 index 0000000..9f6765e --- /dev/null +++ b/t/DjVu_2.out @@ -0,0 +1,46 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: DjVu.djvu +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 930 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:12:04 21:22:58-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:03-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:12:04 21:22:58-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: DJVU (multi-page) +[File, File, Other] FileTypeExtension - File Type Extension: djvu +[File, File, Other] MIMEType - MIME Type: image/vnd.djvu +[DjVu, DjVu, Image] 0 - Subfile Type: Single-page image +[DjVu, DjVu, Image] 0 - Image Width: 8 +[DjVu, DjVu, Image] 2 - Image Height: 8 +[DjVu, DjVu, Image] 4 - DjVu Version: 0.24 +[DjVu, DjVu, Image] 6 - Spatial Resolution: 100 +[DjVu, DjVu, Image] 8 - Gamma: 2.2 +[DjVu, DjVu, Image] 9 - Orientation: Unknown (0) +[DjVu, DjVu, Image] INCL - Included File ID: shared_anno.iff +[DjVu, DjVu, Image] 0 - Subfile Type: Shared component +[DjVu, DjVu-Meta, Author] Author - Author: Phil Harvey +[DjVu, DjVu-Meta, Image] Title - Title: DjVu Metadata Sample +[DjVu, DjVu-Meta, Image] Subject - Subject: ExifTool DjVu test image +[DjVu, DjVu-Meta, Image] Creator - Creator: ExifTool +[DjVu, DjVu-Meta, Time] CreationDate - Create Date: 2008:09:23 12:31:34-04:00 +[DjVu, DjVu-Meta, Time] ModDate - Modify Date: 2008:11:11 09:17:10-05:00 +[DjVu, DjVu-Meta, Image] Keywords - Keywords: ExifTool, Test, DjVu, XMP +[DjVu, DjVu-Meta, Image] Producer - Producer: djvused +[DjVu, DjVu-Meta, Image] note - Note: Must escape double quotes (") and backslashes (\) +[DjVu, DjVu-Meta, Image] Trapped - Trapped: Unknown +[DjVu, DjVu-Meta, Image] annote - Annotation: Did you get this? +[DjVu, DjVu-Meta, Image] url - URL: https://exiftool.org/ +[XMP, XMP-album, Image] Notes - Notes: Must escape double quotes (") and backslashes (\) +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: ExifTool DjVu test image +[XMP, XMP-dc, Author] rights - Rights: Copyright 2008 Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, DjVu, XMP +[XMP, XMP-dc, Image] title - Title: DjVu Metadata Sample +[XMP, XMP-pdf, Image] Keywords - Keywords: ExifTool, Test, DjVu, XMP +[XMP, XMP-pdf, Author] Producer - Producer: djvused +[XMP, XMP-pdf, Image] Trapped - Trapped: Unknown +[XMP, XMP-xmp, Time] CreateDate - Create Date: 2008:09:23 12:31:34-04:00 +[XMP, XMP-xmp, Image] CreatorTool - Creator Tool: ExifTool +[XMP, XMP-xmp, Time] ModifyDate - Modify Date: 2008:11:11 09:17:10-05:00 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/EXE.t b/t/EXE.t new file mode 100644 index 0000000..95d6373 --- /dev/null +++ b/t/EXE.t @@ -0,0 +1,32 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/EXE.t". + +BEGIN { + $| = 1; print "1..7\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::EXE; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'EXE'; +my $testnum = 1; + +# tests 2-7: Extract information from various types of executable files and libraries +{ + my $exifTool = new Image::ExifTool; + my $ext; + foreach $ext ('exe', 'macho', 'elf', 'a', 'so', 'dylib') { + ++$testnum; + my $info = $exifTool->ImageInfo("t/images/EXE.$ext", '-system:all'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + } +} + + +# end diff --git a/t/EXE_2.out b/t/EXE_2.out new file mode 100644 index 0000000..b52b6c1 --- /dev/null +++ b/t/EXE_2.out @@ -0,0 +1,35 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, File, Other] FileType - File Type: Win32 EXE +[File, File, Other] FileTypeExtension - File Type Extension: exe +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[EXE, EXE, Other] 0 - Machine Type: Intel 386 or later, and compatibles +[EXE, EXE, Time] 2 - Time Stamp: 2008:09:08 08:01:24-04:00 +[EXE, EXE, Other] 9 - Image File Characteristics: No relocs, Executable, No line numbers, No symbols, 32-bit, No debug +[EXE, EXE, Other] 10 - PE Type: PE32 +[EXE, EXE, Other] 11 - Linker Version: 2.56 +[EXE, EXE, Other] 12 - Code Size: 2048 +[EXE, EXE, Other] 14 - Initialized Data Size: 4096 +[EXE, EXE, Other] 16 - Uninitialized Data Size: 512 +[EXE, EXE, Other] 18 - Entry Point: 0x1000 +[EXE, EXE, Other] 30 - OS Version: 4.0 +[EXE, EXE, Other] 32 - Image Version: 1.0 +[EXE, EXE, Other] 34 - Subsystem Version: 4.0 +[EXE, EXE, Other] 44 - Subsystem: Windows command line +[EXE, EXE, Other] 2 - File Version Number: 1.2.3.4 +[EXE, EXE, Other] 4 - Product Version Number: 5.6.7.8 +[EXE, EXE, Other] 6 - File Flags Mask: 0x003f +[EXE, EXE, Other] 7 - File Flags: Debug +[EXE, EXE, Other] 8 - File OS: Win32 +[EXE, EXE, Other] 9 - Object File Type: Executable application +[EXE, EXE, Other] 10 - File Subtype: 0 +[EXE, EXE, Other] LanguageCode - Language Code: English (U.S.) +[EXE, EXE, Other] CharacterSet - Character Set: Unicode +[EXE, EXE, Other] CompanyName - Company Name: Phil Harvey +[EXE, EXE, Other] FileDescription - File Description: ExifTool EXE Test File +[EXE, EXE, Other] FileVersion - File Version: 1.2.3.4b +[EXE, EXE, Other] InternalName - Internal Name: Skippy the wonder cow +[EXE, EXE, Other] LegalCopyright - Legal Copyright: Copyright (c) 2008 +[EXE, EXE, Other] LegalTrademarks - Legal Trademarks: none +[EXE, EXE, Other] OriginalFilename - Original File Name: EXE.exe +[EXE, EXE, Other] ProductName - Product Name: This is not a product +[EXE, EXE, Other] ProductVersion - Product Version: 5.6.7.8b diff --git a/t/EXE_3.out b/t/EXE_3.out new file mode 100644 index 0000000..bea2d5f --- /dev/null +++ b/t/EXE_3.out @@ -0,0 +1,10 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, File, Other] FileType - File Type: Mach-O executable +[File, File, Other] FileTypeExtension - File Type Extension: +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[EXE, EXE, Other] 0 - CPU Architecture: 32 bit +[EXE, EXE, Other] 1 - CPU Byte Order: Big endian +[EXE, EXE, Other] 3 - CPU Type: PowerPC +[EXE, EXE, Other] 4 - CPU Subtype: PowerPC (all) +[EXE, EXE, Other] 5 - Object File Type: Demand paged executable +[EXE, EXE, Other] 6 - Object Flags: No undefs, Dyld link, Two level diff --git a/t/EXE_4.out b/t/EXE_4.out new file mode 100644 index 0000000..7c67d9e --- /dev/null +++ b/t/EXE_4.out @@ -0,0 +1,8 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, File, Other] FileType - File Type: ELF executable +[File, File, Other] FileTypeExtension - File Type Extension: +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[EXE, EXE, Other] 4 - CPU Architecture: 32 bit +[EXE, EXE, Other] 5 - CPU Byte Order: Little endian +[EXE, EXE, Other] 16 - Object File Type: Executable file +[EXE, EXE, Other] 18 - CPU Type: i386 diff --git a/t/EXE_5.out b/t/EXE_5.out new file mode 100644 index 0000000..844b8bb --- /dev/null +++ b/t/EXE_5.out @@ -0,0 +1,9 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, File, Other] FileType - File Type: Mach-O static library +[File, File, Other] FileTypeExtension - File Type Extension: a +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[EXE, EXE, Time] 16 - Create Date: 2016:04:13 07:19:19-04:00 +[EXE, EXE, Other] 0 - CPU Architecture: 64 bit +[EXE, EXE, Other] 1 - CPU Byte Order: Little endian +[EXE, EXE, Other] 3 - CPU Type: x86 64-bit +[EXE, EXE, Other] 4 - CPU Subtype: i386 (all) 64-bit diff --git a/t/EXE_6.out b/t/EXE_6.out new file mode 100644 index 0000000..83c8d89 --- /dev/null +++ b/t/EXE_6.out @@ -0,0 +1,8 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, File, Other] FileType - File Type: ELF shared library +[File, File, Other] FileTypeExtension - File Type Extension: so +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[EXE, EXE, Other] 4 - CPU Architecture: 64 bit +[EXE, EXE, Other] 5 - CPU Byte Order: Little endian +[EXE, EXE, Other] 16 - Object File Type: Shared object file +[EXE, EXE, Other] 18 - CPU Type: AMD x86-64 diff --git a/t/EXE_7.out b/t/EXE_7.out new file mode 100644 index 0000000..5165f94 --- /dev/null +++ b/t/EXE_7.out @@ -0,0 +1,10 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, File, Other] FileType - File Type: Mach-O dynamic link library +[File, File, Other] FileTypeExtension - File Type Extension: dylib +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[EXE, EXE, Other] 0 - CPU Architecture: 64 bit +[EXE, EXE, Other] 1 - CPU Byte Order: Little endian +[EXE, EXE, Other] 3 - CPU Type: x86 64-bit +[EXE, EXE, Other] 4 - CPU Subtype: i386 (all) 64-bit +[EXE, EXE, Other] 5 - Object File Type: Dynamically bound shared library +[EXE, EXE, Other] 6 - Object Flags: No undefs, Dyld link, Two level, No reexported dylibs diff --git a/t/ExifTool.t b/t/ExifTool.t new file mode 100644 index 0000000..9c9b240 --- /dev/null +++ b/t/ExifTool.t @@ -0,0 +1,355 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/ExifTool.t". + +BEGIN { + $| = 1; print "1..32\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'ExifTool'; +my $testnum = 1; + +# test 2: extract information from JPG file using name +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/ExifTool.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: TIFF file using file reference and ExifTool object with options +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Duplicates => 1, Unknown => 1); + open(TESTFILE, 't/images/ExifTool.tif'); + my $info = $exifTool->ImageInfo(\*TESTFILE); + close(TESTFILE); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 4: test the Group option to extract EXIF info only +{ + ++$testnum; + my $info = ImageInfo('t/images/Canon.jpg', {Group0 => 'EXIF'}); + print 'not ' unless check($info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 5: extract specified tags only +{ + ++$testnum; + my $exifTool = new Image::ExifTool; +# don't test DateFormat because strftime output varies with locale +# $exifTool->Options(DateFormat => '%H:%M:%S %a. %b. %e, %Y'); + my @tags = ('CreateDate', 'DateTimeOriginal', 'ModifyDate', 'Orientation#', '?Resolution'); + my $info = $exifTool->ImageInfo('t/images/Canon.jpg', \@tags); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 6: test the 5 different ways to exclude tags... +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Exclude => 'ImageWidth'); + my @tagList = ( '-ImageHeight', '-Make' ); + my $info = $exifTool->ImageInfo('t/images/Canon.jpg', '-FileSize', '-*resolution', + \@tagList, {Group0 => '-MakerNotes'}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# tests 7/8: test ExtractInfo(), GetInfo(), CombineInfo() +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Duplicates => 0); # don't allow duplicates + $exifTool->ExtractInfo('t/images/Canon.jpg'); + my $info1 = $exifTool->GetInfo({Group0 => 'MakerNotes'}); + my $info2 = $exifTool->GetInfo({Group0 => 'EXIF'}); + my $info = $exifTool->CombineInfo($info1, $info2); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + + # combine information in different order + ++$testnum; + $info = $exifTool->CombineInfo($info2, $info1); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 9: test group options across different families +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Canon.jpg', + { Group1 => 'Canon', Group2 => '-Camera' }); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# tests 10/11: test ExtractInfo() and GetInfo() +# (uses output from test 5 for comparison) +{ + ++$testnum; + my $exifTool = new Image::ExifTool; +# don't test DateFormat because strftime output is system dependent +# $exifTool->Options(DateFormat => '%H:%M:%S %a. %b. %e, %Y'); + $exifTool->ExtractInfo('t/images/Canon.jpg'); + my @tags = ('createdate', 'datetimeoriginal', 'modifydate', 'orientation#', '?resolution'); + my $info = $exifTool->GetInfo(\@tags); + my $good = 1; + my @expectedTags = ('CreateDate', 'DateTimeOriginal', 'ModifyDate', 'Orientation', + 'XResolution', 'YResolution'); + for (my $i=0; $i<scalar(@tags); ++$i) { + $tags[$i] = $expectedTags[$i] or $good = 0; + } + print 'not ' unless $good; + print "ok $testnum\n"; + + ++$testnum; + print 'not ' unless check($exifTool, $info, $testname, $testnum, 5); + print "ok $testnum\n"; +} + +# tests 12/13: check precedence of tags extracted from groups +# (Note: these tests should produce the same output as 7/8, +# so the .out files from tests 7/8 are used) +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Duplicates => 0); # don't allow duplicates + my $info = $exifTool->ImageInfo('t/images/Canon.jpg',{Group0=>['MakerNotes','EXIF']}); + print 'not ' unless check($exifTool, $info, $testname, $testnum, 7); + print "ok $testnum\n"; + + # combine information in different order + ++$testnum; + $info = $exifTool->ImageInfo('t/images/Canon.jpg',{Group0=>['EXIF','MakerNotes']}); + print 'not ' unless check($exifTool, $info, $testname, $testnum, 8); + print "ok $testnum\n"; +} + +# tests 14/15/16: test GetGroups() +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->ExtractInfo('t/images/Canon.jpg'); + my @groups = $exifTool->GetGroups(2); + my $not; + foreach ('Camera','ExifTool','Image','Other','Time') { + my $g = shift @groups || ''; + $_ eq $g or warn("\nWrong group: $_ ne $g\n"), $not = 1; + } + @groups and $not = 1; + print 'not ' if $not; + print "ok $testnum\n"; + + ++$testnum; + my $info = $exifTool->GetInfo({Group0 => 'EXIF'}); + @groups = $exifTool->GetGroups($info,0); + print 'not ' unless @groups==1 and $groups[0] eq 'EXIF'; + print "ok $testnum\n"; + + ++$testnum; + my $testfile = "t/ExifTool_$testnum"; + open(TESTFILE,">$testfile.failed"); + my $oldSep = $/; + $/ = "\x0a"; # set input line separator + $exifTool->ExtractInfo('t/images/Canon.jpg'); + my $family = '1:2'; + @groups = $exifTool->GetGroups($family); + my $group; + foreach $group (@groups) { + next if $group eq 'ExifTool'; + print TESTFILE "---- $group ----\n"; + my $info = $exifTool->GetInfo({"Group$family" => $group}); + foreach (sort $exifTool->GetTagList($info)) { + print TESTFILE "$_ : $$info{$_}\n"; + } + } + $/ = $oldSep; # restore input line separator + close(TESTFILE); + print 'not ' unless testCompare("$testfile.out","$testfile.failed",$testnum); + print "ok $testnum\n"; +} + +# test 17: Test verbose output +{ + ++$testnum; + print 'not ' unless testVerbose($testname, $testnum, 't/images/Canon.jpg', 3); + print "ok $testnum\n"; +} + +# tests 18/19: Test Group# option with multiple groups and no duplicates +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Duplicates => 0); # don't allow duplicates + my $info = $exifTool->ImageInfo('t/images/Canon.jpg', + { Group0 => ['MakerNotes','EXIF'] }); + print 'not ' unless check($exifTool, $info, $testname, $testnum, 7); + print "ok $testnum\n"; + + ++$testnum; + $info = $exifTool->ImageInfo('t/images/Canon.jpg', + { Group0 => ['EXIF','MakerNotes'] }); + print 'not ' unless check($exifTool, $info, $testname, $testnum, 8); + print "ok $testnum\n"; +} + +# test 20: Test extracting a single, non-priority tag with duplicates set to 0 +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Duplicates => 0); + my $info = $exifTool->ImageInfo('t/images/Canon.jpg', 'EXIF:WhiteBalance'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 21: Test extracting ICC_Profile as a block +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/ExifTool.tif', 'ICC_Profile'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 22: Test InsertTagValues +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my @foundTags; + $exifTool->ImageInfo('t/images/ExifTool.jpg', \@foundTags); + my $str = $exifTool->InsertTagValues(\@foundTags, '${ifd0:model;tr/i/_/} - $1ciff:3main:model'); + my $testfile = "t/ExifTool_$testnum"; + open(TESTFILE,">$testfile.failed"); + my $oldSep = $/; + $/ = "\x0a"; # set input line separator + print TESTFILE $str, "\n"; + $/ = $oldSep; # restore input line separator + close(TESTFILE); + print 'not ' unless testCompare("$testfile.out","$testfile.failed",$testnum); + print "ok $testnum\n"; +} + +# test 23: Test the multi-group feature in a tag name +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/ExifTool.jpg', 'main:Author:IPTC3:all'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 24: Test a shortcut with multiple group names and a ValueConv suffix +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Canon.jpg', 'exififd:camera:common#'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 25: Test GlobalTimeShift option +{ + ++$testnum; + if (eval { require Time::Local }) { + my $exifTool = new Image::ExifTool; + $exifTool->Options(GlobalTimeShift => '-0:1:0 0:0:0'); + # Note: can't extract system times because this could result in a different + # calculated global time offset (since I am shifting by 1 month) + my $info = $exifTool->ImageInfo('t/images/ExifTool.jpg', 'time:all', '-system:all'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + } else { + print "ok $testnum # skip Requires Time::Local\n"; + } +} + +# test 26: Test wildcards using '#' suffix with duplicate PrintConv tags and exclusions +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + # (hack to avoid sorting in TestLib.pm because order of duplicate tags would be indeterminate) + $$exifTool{NO_SORT} = 1; + my $info = $exifTool->ImageInfo('t/images/Canon.jpg', 'encodingprocess', 'E*#', 'exposureMode', + '-ExifVersion'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 27: Test ListItem option +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(ListItem => -3); + my $info = $exifTool->ImageInfo('t/images/ExifTool.jpg', 'Subject', 'SupplementalCategories'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 28: Test FastScan = 3 +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(FastScan => 3); + my $info = $exifTool->ImageInfo('t/images/ExifTool.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 29: Test Filter +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Filter => 'tr/ /_/;tr/0-9/#/'); + my $info = $exifTool->ImageInfo('t/images/ExifTool.jpg', '-ExifToolVersion'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 30: Calculate JPEGDigest and JPEGQualityEstimate +{ + ++$testnum; + my $skip = ''; + if (eval 'require Digest::MD5') { + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Writer.jpg', 'JPEGDigest', 'JPEGQualityEstimate'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + } else { + $skip = ' # skip Requires Digest::MD5'; + } + print "ok $testnum$skip\n"; +} + +# test 31: Test Validate feature +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/CanonRaw.cr2', 'Validate', 'Warning', 'Error'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 32: Read JPS file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/ExifTool.jps', 'jps:all'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/ExifTool_16.out b/t/ExifTool_16.out new file mode 100644 index 0000000..bfb1f27 --- /dev/null +++ b/t/ExifTool_16.out @@ -0,0 +1,185 @@ +---- Canon:Camera ---- +AFAreaHeight : 151 +AFAreaWidth : 151 +AFAreaXPositions : 1014 608 0 0 0 -608 -1014 +AFAreaYPositions : 0 0 -506 0 506 0 0 +AFImageHeight : 2048 +AFImageWidth : 3072 +AFPointsInFocus : (none) +CameraISO : n/a +CameraType : EOS Mid-range +CanonExposureMode : Manual +CanonFirmwareVersion : Firmware Version 1.1.1 +CanonFlashMode : Off +CanonImageSize : Large +CanonModelID : EOS Digital Rebel / 300D / Kiss Digital +ColorSpace (1) : sRGB +ColorTemperature : 5200 +ColorTone : Normal +ContinuousDrive : Continuous +Contrast : +1 +DigitalZoom : Unknown (-1) +EasyMode : Manual +FlashActivity : 0 +FlashBits : (none) +FocalUnits : 1/mm +FocusMode : Manual Focus (3) +FocusRange : Not Known +LensType : n/a +MacroMode : Unknown (0) +ManualFlashOutput : n/a +MaxAperture : 4 +MaxFocalLength : 55 mm +MeasuredRGGB : 998 1022 1026 808 +MeteringMode : Center-weighted average +MinAperture : 27 +MinFocalLength : 18 mm +NumAFPoints : 7 +OpticalZoomCode : n/a +OwnerName : Phil Harvey +Quality : RAW +RecordMode : CRW+THM +Saturation : +1 +SelfTimer : Off +SerialNumber : 0560018150 +SerialNumberFormat : Format 1 +Sharpness : +1 +ThumbnailImageValidArea : 0 159 7 112 +ValidAFPoints : 7 +WB_RGGBBlackLevels : 124 123 124 123 +WB_RGGBLevelsAuto : 1719 832 831 990 +WB_RGGBLevelsCloudy : 1878 832 831 903 +WB_RGGBLevelsCustom : 1722 832 831 989 +WB_RGGBLevelsDaylight : 1722 832 831 989 +WB_RGGBLevelsFlash : 1933 832 831 895 +WB_RGGBLevelsFluorescent : 1506 842 841 1381 +WB_RGGBLevelsKelvin : 1722 832 831 988 +WB_RGGBLevelsShade : 2035 832 831 839 +WB_RGGBLevelsTungsten : 1228 913 912 1668 +ZoomSourceWidth : 3072 +ZoomTargetWidth : 3072 +---- Canon:Image ---- +AEBBracketValue : 0 +AutoExposureBracketing : Off +AutoISO : 100 +AutoRotate : None +BaseISO : 100 +BracketMode : Off +BracketShotNumber : 0 +BracketValue : 0 +BulbDuration : 4 +CanonFileLength : 4480822 +CanonImageHeight : 2048 +CanonImageType : CRW:EOS DIGITAL REBEL CMOS RAW +CanonImageWidth : 3072 +ControlMode : Camera Local Control +ExposureCompensation : 0 +ExposureTime (1) : 128 +FNumber (1) : 14 +FileNumber : 118-1861 +FlashExposureComp : 0 +FlashGuideNumber : 0 +FocalLength (1) : 34 mm +FocalPlaneXSize : 23.22 mm +FocalPlaneYSize : 15.49 mm +FocusDistanceLower : 5.46 m +FocusDistanceUpper : inf +MeasuredEV : -1.25 +MeasuredEV2 : -1.25 +NDFilter : n/a +SelfTimer2 : 0 +SequenceNumber : 0 +SlowShutter : None +TargetAperture : 14 +WhiteBalance : Auto +---- Composite:Camera ---- +BlueBalance : 1.190619 +CircleOfConfusion : 0.019 mm +DriveMode : Continuous Shooting +FocalLength35efl : 34.0 mm (35 mm equivalent: 54.0 mm) +HyperfocalDistance : 4.37 m +ISO (1) : 100 +Lens : 18.0 - 55.0 mm +Lens35efl : 18.0 - 55.0 mm (35 mm equivalent: 28.6 - 87.4 mm) +LensID : Unknown 18-55mm +RedBalance : 2.067348 +ScaleFactor35efl : 1.6 +ShootingMode : Bulb +WB_RGGBLevels : 1719 832 831 990 +---- Composite:Image ---- +Aperture : 14.0 +DOF : inf (4.31 m - inf) +FOV : 36.9 deg +ImageSize : 8x8 +LightValue : 5.6 +Megapixels : 0.000064 +ShutterSpeed : 4 +---- ExifIFD:Camera ---- +ExposureMode : Manual +Flash : No Flash +FocalLength : 34.0 mm +FocalPlaneResolutionUnit : inches +FocalPlaneXResolution : 3443.946188 +FocalPlaneYResolution : 3442.016807 +MaxApertureValue : 4.5 +MeteringMode (1) : Average +SceneCaptureType : Standard +SensingMethod : One-chip color area +WhiteBalance (1) : Auto +---- ExifIFD:Image ---- +ApertureValue : 14.0 +ColorSpace : sRGB +ComponentsConfiguration : Y, Cb, Cr, - +CompressedBitsPerPixel : 9 +CustomRendered : Normal +ExifImageHeight : 120 +ExifImageWidth : 160 +ExifVersion : 0221 +ExposureCompensation (1) : 0 +ExposureTime : 4 +FNumber : 14.0 +FileSource : Digital Camera +FlashpixVersion : 0100 +ISO : 100 +ShutterSpeedValue : 0 +UserComment : +---- ExifIFD:Time ---- +CreateDate : 2003:12:04 06:46:52 +DateTimeOriginal : 2003:12:04 06:46:52 +---- File:Image ---- +BitsPerSample : 8 +ColorComponents : 3 +EncodingProcess : Baseline DCT, Huffman coding +ExifByteOrder : Little-endian (Intel, II) +ImageHeight : 8 +ImageWidth : 8 +YCbCrSubSampling : YCbCr4:2:0 (2 2) +---- File:Other ---- +FileType : JPEG +FileTypeExtension : jpg +MIMEType : image/jpeg +---- IFD0:Camera ---- +Make : Canon +Model : Canon EOS DIGITAL REBEL +---- IFD0:Image ---- +Orientation : Horizontal (normal) +ResolutionUnit : inches +XResolution : 180 +YCbCrPositioning : Centered +YResolution : 180 +---- IFD0:Time ---- +ModifyDate : 2003:12:04 06:46:52 +---- InteropIFD:Image ---- +InteropIndex : THM - DCF thumbnail file +InteropVersion : 0100 +RelatedImageHeight : 2048 +RelatedImageWidth : 3072 +---- System:Other ---- +Directory : t/images +FileName : Canon.jpg +FilePermissions : -rw-r--r-- +FileSize : 2.7 kB +---- System:Time ---- +FileAccessDate : 2022:06:01 14:16:34-04:00 +FileInodeChangeDate : 2021:10:31 20:34:50-04:00 +FileModifyDate : 2006:10:03 15:10:31-04:00 diff --git a/t/ExifTool_17.out b/t/ExifTool_17.out new file mode 100644 index 0000000..001dff8 --- /dev/null +++ b/t/ExifTool_17.out @@ -0,0 +1,599 @@ + ExifToolVersion = 11.70 + FileName = Canon.jpg + Directory = t/images + FileSize = 2697 + FileModifyDate = 1159902631 + FileAccessDate = 1570452438 + FileInodeChangeDate = 1570016457 + FilePermissions = 33188 + FileType = JPEG + FileTypeExtension = JPG + MIMEType = image/jpeg +JPEG APP1 (2442 bytes): + 0006: 45 78 69 66 00 00 49 49 2a 00 08 00 00 00 09 00 [Exif..II*.......] + 0016: 0f 01 02 00 06 00 00 00 7a 00 00 00 10 01 02 00 [........z.......] + 0026: 18 00 00 00 80 00 00 00 12 01 03 00 01 00 00 00 [................] + 0036: 01 00 00 00 1a 01 05 00 01 00 00 00 98 00 00 00 [................] + 0046: 1b 01 05 00 01 00 00 00 a0 00 00 00 28 01 03 00 [............(...] + 0056: 01 00 00 00 02 00 00 00 32 01 02 00 14 00 00 00 [........2.......] + 0066: a8 00 00 00 13 02 03 00 01 00 00 00 01 00 00 00 [................] + [snip 2330 bytes] + ExifByteOrder = II + + [IFD0 directory with 9 entries] + | 0) Make = Canon + | - Tag 0x010f (6 bytes, string[6]): + | 0086: 43 61 6e 6f 6e 00 [Canon.] + | 1) Model = Canon EOS DIGITAL REBEL + | - Tag 0x0110 (24 bytes, string[24]): + | 008c: 43 61 6e 6f 6e 20 45 4f 53 20 44 49 47 49 54 41 [Canon EOS DIGITA] + | 009c: 4c 20 52 45 42 45 4c 00 [L REBEL.] + | 2) Orientation = 1 + | - Tag 0x0112 (2 bytes, int16u[1]): + | 0036: 01 00 [..] + | 3) XResolution = 180 (180/1) + | - Tag 0x011a (8 bytes, rational64u[1]): + | 00a4: b4 00 00 00 01 00 00 00 [........] + | 4) YResolution = 180 (180/1) + | - Tag 0x011b (8 bytes, rational64u[1]): + | 00ac: b4 00 00 00 01 00 00 00 [........] + | 5) ResolutionUnit = 2 + | - Tag 0x0128 (2 bytes, int16u[1]): + | 005a: 02 00 [..] + | 6) ModifyDate = 2003:12:04 06:46:52 + | - Tag 0x0132 (20 bytes, string[20]): + | 00b4: 32 30 30 33 3a 31 32 3a 30 34 20 30 36 3a 34 36 [2003:12:04 06:46] + | 00c4: 3a 35 32 00 [:52.] + | 7) YCbCrPositioning = 1 + | - Tag 0x0213 (2 bytes, int16u[1]): + | 0072: 01 00 [..] + | 8) ExifOffset (SubDirectory) --> + | - Tag 0x8769 (4 bytes, int32u[1]): + | 007e: bc 00 00 00 [....] + | + [ExifIFD directory with 31 entries] + | | 0) ExposureTime = 4 (4/1) + | | - Tag 0x829a (8 bytes, rational64u[1]): + | | 0242: 04 00 00 00 01 00 00 00 [........] + | | 1) FNumber = 14 (14/1) + | | - Tag 0x829d (8 bytes, rational64u[1]): + | | 024a: 0e 00 00 00 01 00 00 00 [........] + | | 2) ISO = 100 + | | - Tag 0x8827 (2 bytes, int16u[1]): + | | 00ea: 64 00 [d.] + | | 3) ExifVersion = 0221 + | | - Tag 0x9000 (4 bytes, undef[4]): + | | 00f6: 30 32 32 31 [0221] + | | 4) DateTimeOriginal = 2003:12:04 06:46:52 + | | - Tag 0x9003 (20 bytes, string[20]): + | | 0252: 32 30 30 33 3a 31 32 3a 30 34 20 30 36 3a 34 36 [2003:12:04 06:46] + | | 0262: 3a 35 32 00 [:52.] + | | 5) CreateDate = 2003:12:04 06:46:52 + | | - Tag 0x9004 (20 bytes, string[20]): + | | 0266: 32 30 30 33 3a 31 32 3a 30 34 20 30 36 3a 34 36 [2003:12:04 06:46] + | | 0276: 3a 35 32 00 [:52.] + | | 6) ComponentsConfiguration = 1 2 3 0 + | | - Tag 0x9101 (4 bytes, undef[4] read as int8u[4]): + | | 011a: 01 02 03 00 [....] + | | 7) CompressedBitsPerPixel = 9 (9/1) + | | - Tag 0x9102 (8 bytes, rational64u[1]): + | | 027a: 09 00 00 00 01 00 00 00 [........] + | | 8) ShutterSpeedValue = -2147483648 (-2147483648/1) + | | - Tag 0x9201 (8 bytes, rational64s[1]): + | | 0282: 00 00 00 80 01 00 00 00 [........] + | | 9) ApertureValue = 7.614715576 (499038/65536) + | | - Tag 0x9202 (8 bytes, rational64u[1]): + | | 028a: 5e 9d 07 00 00 00 01 00 [^.......] + | | 10) ExposureCompensation = 0 (0/3) + | | - Tag 0x9204 (8 bytes, rational64s[1]): + | | 0292: 00 00 00 00 03 00 00 00 [........] + | | 11) MaxApertureValue = 4.33984375 (284416/65536) + | | - Tag 0x9205 (8 bytes, rational64u[1]): + | | 029a: 00 57 04 00 00 00 01 00 [.W......] + | | 12) MeteringMode = 1 + | | - Tag 0x9207 (2 bytes, int16u[1]): + | | 0162: 01 00 [..] + | | 13) Flash = 0 + | | - Tag 0x9209 (2 bytes, int16u[1]): + | | 016e: 00 00 [..] + | | 14) FocalLength = 34 (34/1) + | | - Tag 0x920a (8 bytes, rational64u[1]): + | | 02a2: 22 00 00 00 01 00 00 00 [".......] + | | 15) MakerNoteCanon (SubDirectory) --> + | | - Tag 0x927c (1432 bytes, undef[1432]): + | | 02aa: 1a 00 01 00 03 00 2e 00 00 00 dc 03 00 00 02 00 [................] + | | 02ba: 03 00 04 00 00 00 38 04 00 00 03 00 03 00 04 00 [......8.........] + | | 02ca: 00 00 40 04 00 00 04 00 03 00 21 00 00 00 48 04 [..@.......!...H.] + | | 02da: 00 00 93 00 03 00 09 00 00 00 8a 04 00 00 06 00 [................] + | | 02ea: 02 00 20 00 00 00 9c 04 00 00 07 00 02 00 20 00 [.. ........... .] + | | [snip 1352 bytes] + | | + [MakerNotes directory with 26 entries] + | | | 0) CanonCameraSettings (SubDirectory) --> + | | | - Tag 0x0001 (92 bytes, int16u[46] read as undef[92]): + | | | 03e8: 5c 00 00 00 00 00 04 00 00 00 01 00 00 00 03 00 [\...............] + | | | 03f8: 00 00 02 00 00 00 01 00 ff ff 01 00 01 00 01 00 [................] + | | | 0408: 00 00 05 00 02 00 00 00 04 00 ff 7f ff ff 37 00 [..............7.] + | | | 0418: 12 00 01 00 80 00 30 01 00 00 00 00 00 00 00 00 [......0.........] + | | | 0428: ff ff ff ff ff ff 00 00 00 0c 00 0c 00 00 ff ff [................] + | | | 0438: ff ff 00 00 00 00 ff 7f ff ff ff ff [............] + | | | + [BinaryData directory, 92 bytes] + | | | | MacroMode = 0 + | | | | - Tag 0x0001 (2 bytes, int16s[1]): + | | | | 03ea: 00 00 [..] + | | | | SelfTimer = 0 + | | | | - Tag 0x0002 (2 bytes, int16s[1]): + | | | | 03ec: 00 00 [..] + | | | | Quality = 4 + | | | | - Tag 0x0003 (2 bytes, int16s[1]): + | | | | 03ee: 04 00 [..] + | | | | CanonFlashMode = 0 + | | | | - Tag 0x0004 (2 bytes, int16s[1]): + | | | | 03f0: 00 00 [..] + | | | | ContinuousDrive = 1 + | | | | - Tag 0x0005 (2 bytes, int16s[1]): + | | | | 03f2: 01 00 [..] + | | | | FocusMode = 3 + | | | | - Tag 0x0007 (2 bytes, int16s[1]): + | | | | 03f6: 03 00 [..] + | | | | RecordMode = 2 + | | | | - Tag 0x0009 (2 bytes, int16s[1]): + | | | | 03fa: 02 00 [..] + | | | | CanonImageSize = 0 + | | | | - Tag 0x000a (2 bytes, int16s[1]): + | | | | 03fc: 00 00 [..] + | | | | EasyMode = 1 + | | | | - Tag 0x000b (2 bytes, int16s[1]): + | | | | 03fe: 01 00 [..] + | | | | DigitalZoom = -1 + | | | | - Tag 0x000c (2 bytes, int16s[1]): + | | | | 0400: ff ff [..] + | | | | Contrast = 1 + | | | | - Tag 0x000d (2 bytes, int16s[1]): + | | | | 0402: 01 00 [..] + | | | | Saturation = 1 + | | | | - Tag 0x000e (2 bytes, int16s[1]): + | | | | 0404: 01 00 [..] + | | | | Sharpness = 1 + | | | | - Tag 0x000f (2 bytes, int16s[1]): + | | | | 0406: 01 00 [..] + | | | | CameraISO = 0 + | | | | - Tag 0x0010 (2 bytes, int16s[1]): + | | | | 0408: 00 00 [..] + | | | | MeteringMode = 5 + | | | | - Tag 0x0011 (2 bytes, int16s[1]): + | | | | 040a: 05 00 [..] + | | | | FocusRange = 2 + | | | | - Tag 0x0012 (2 bytes, int16s[1]): + | | | | 040c: 02 00 [..] + | | | | AFPoint = 0 + | | | | - Tag 0x0013 (2 bytes, int16s[1]): + | | | | 040e: 00 00 [..] + | | | | CanonExposureMode = 4 + | | | | - Tag 0x0014 (2 bytes, int16s[1]): + | | | | 0410: 04 00 [..] + | | | | LensType = 65535 + | | | | - Tag 0x0016 (2 bytes, int16u[1]): + | | | | 0414: ff ff [..] + | | | | MaxFocalLength = 55 + | | | | - Tag 0x0017 (2 bytes, int16u[1]): + | | | | 0416: 37 00 [7.] + | | | | MinFocalLength = 18 + | | | | - Tag 0x0018 (2 bytes, int16u[1]): + | | | | 0418: 12 00 [..] + | | | | FocalUnits = 1 + | | | | - Tag 0x0019 (2 bytes, int16s[1]): + | | | | 041a: 01 00 [..] + | | | | MaxAperture = 128 + | | | | - Tag 0x001a (2 bytes, int16s[1]): + | | | | 041c: 80 00 [..] + | | | | MinAperture = 304 + | | | | - Tag 0x001b (2 bytes, int16s[1]): + | | | | 041e: 30 01 [0.] + | | | | FlashActivity = 0 + | | | | - Tag 0x001c (2 bytes, int16s[1]): + | | | | 0420: 00 00 [..] + | | | | FlashBits = 0 + | | | | - Tag 0x001d (2 bytes, int16s[1]): + | | | | 0422: 00 00 [..] + | | | | FocusContinuous = -1 + | | | | - Tag 0x0020 (2 bytes, int16s[1]): + | | | | 0428: ff ff [..] + | | | | AESetting = -1 + | | | | - Tag 0x0021 (2 bytes, int16s[1]): + | | | | 042a: ff ff [..] + | | | | ImageStabilization = -1 + | | | | - Tag 0x0022 (2 bytes, int16s[1]): + | | | | 042c: ff ff [..] + | | | | DisplayAperture = 0 + | | | | - Tag 0x0023 (2 bytes, int16s[1]): + | | | | 042e: 00 00 [..] + | | | | ZoomSourceWidth = 3072 + | | | | - Tag 0x0024 (2 bytes, int16s[1]): + | | | | 0430: 00 0c [..] + | | | | ZoomTargetWidth = 3072 + | | | | - Tag 0x0025 (2 bytes, int16s[1]): + | | | | 0432: 00 0c [..] + | | | | SpotMeteringMode = -1 + | | | | - Tag 0x0027 (2 bytes, int16s[1]): + | | | | 0436: ff ff [..] + | | | | PhotoEffect = -1 + | | | | - Tag 0x0028 (2 bytes, int16s[1]): + | | | | 0438: ff ff [..] + | | | | ManualFlashOutput = 0 + | | | | - Tag 0x0029 (2 bytes, int16s[1]): + | | | | 043a: 00 00 [..] + | | | | ColorTone = 0 + | | | | - Tag 0x002a (2 bytes, int16s[1]): + | | | | 043c: 00 00 [..] + | | | 1) CanonFocalLength (SubDirectory) --> + | | | - Tag 0x0002 (8 bytes, int16u[4] read as undef[8]): + | | | 0444: 00 00 22 00 92 03 62 02 [.."...b.] + | | | + [BinaryData directory, 8 bytes] + | | | | FocalType = 0 + | | | | - Tag 0x0000 (2 bytes, int16u[1]): + | | | | 0444: 00 00 [..] + | | | | FocalLength = 34 + | | | | - Tag 0x0001 (2 bytes, int16u[1]): + | | | | 0446: 22 00 [".] + | | | | FocalPlaneXSize = 914 + | | | | - Tag 0x0002 (2 bytes, int16u[1]): + | | | | 0448: 92 03 [..] + | | | | FocalPlaneYSize = 610 + | | | | - Tag 0x0003 (2 bytes, int16u[1]): + | | | | 044a: 62 02 [b.] + | | | 2) CanonFlashInfo = 100 0 0 0 + | | | - Tag 0x0003 (8 bytes, int16u[4]): + | | | 044c: 64 00 00 00 00 00 00 00 [d.......] + | | | 3) CanonShotInfo (SubDirectory) --> + | | | - Tag 0x0004 (66 bytes, int16u[33] read as undef[66]): + | | | 0454: 42 00 00 00 a0 00 38 ff f4 00 00 80 00 00 00 00 [B.....8.........] + | | | 0464: 03 00 00 00 08 00 08 00 00 00 00 00 00 00 00 00 [................] + | | | 0474: 00 00 00 00 01 00 ff ff 22 02 f4 00 20 ff 26 00 [........"... .&.] + | | | 0484: 28 00 00 00 fc 00 00 00 ff ff 00 00 00 00 00 00 [(...............] + | | | 0494: 00 00 [..] + | | | + [BinaryData directory, 66 bytes] + | | | | AutoISO = 0 + | | | | - Tag 0x0001 (2 bytes, int16s[1]): + | | | | 0456: 00 00 [..] + | | | | BaseISO = 160 + | | | | - Tag 0x0002 (2 bytes, int16s[1]): + | | | | 0458: a0 00 [..] + | | | | MeasuredEV = -200 + | | | | - Tag 0x0003 (2 bytes, int16s[1]): + | | | | 045a: 38 ff [8.] + | | | | TargetAperture = 244 + | | | | - Tag 0x0004 (2 bytes, int16s[1]): + | | | | 045c: f4 00 [..] + | | | | TargetExposureTime = -32768 + | | | | - Tag 0x0005 (2 bytes, int16s[1]): + | | | | 045e: 00 80 [..] + | | | | ExposureCompensation = 0 + | | | | - Tag 0x0006 (2 bytes, int16s[1]): + | | | | 0460: 00 00 [..] + | | | | WhiteBalance = 0 + | | | | - Tag 0x0007 (2 bytes, int16s[1]): + | | | | 0462: 00 00 [..] + | | | | SlowShutter = 3 + | | | | - Tag 0x0008 (2 bytes, int16s[1]): + | | | | 0464: 03 00 [..] + | | | | SequenceNumber = 0 + | | | | - Tag 0x0009 (2 bytes, int16s[1]): + | | | | 0466: 00 00 [..] + | | | | OpticalZoomCode = 8 + | | | | - Tag 0x000a (2 bytes, int16s[1]): + | | | | 0468: 08 00 [..] + | | | | CameraTemperature = 0 + | | | | - Tag 0x000c (2 bytes, int16s[1]): + | | | | 046c: 00 00 [..] + | | | | FlashGuideNumber = 0 + | | | | - Tag 0x000d (2 bytes, int16s[1]): + | | | | 046e: 00 00 [..] + | | | | AFPointsInFocus = 0 + | | | | - Tag 0x000e (2 bytes, int16s[1]): + | | | | 0470: 00 00 [..] + | | | | FlashExposureComp = 0 + | | | | - Tag 0x000f (2 bytes, int16s[1]): + | | | | 0472: 00 00 [..] + | | | | AutoExposureBracketing = 0 + | | | | - Tag 0x0010 (2 bytes, int16s[1]): + | | | | 0474: 00 00 [..] + | | | | AEBBracketValue = 0 + | | | | - Tag 0x0011 (2 bytes, int16s[1]): + | | | | 0476: 00 00 [..] + | | | | ControlMode = 1 + | | | | - Tag 0x0012 (2 bytes, int16s[1]): + | | | | 0478: 01 00 [..] + | | | | FocusDistanceUpper = 65535 + | | | | - Tag 0x0013 (2 bytes, int16u[1]): + | | | | 047a: ff ff [..] + | | | | FocusDistanceLower = 546 + | | | | - Tag 0x0014 (2 bytes, int16u[1]): + | | | | 047c: 22 02 [".] + | | | | FNumber = 244 + | | | | - Tag 0x0015 (2 bytes, int16s[1]): + | | | | 047e: f4 00 [..] + | | | | ExposureTime = -224 + | | | | - Tag 0x0016 (2 bytes, int16s[1]): + | | | | 0480: 20 ff [ .] + | | | | MeasuredEV2 = 38 + | | | | - Tag 0x0017 (2 bytes, int16s[1]): + | | | | 0482: 26 00 [&.] + | | | | BulbDuration = 40 + | | | | - Tag 0x0018 (2 bytes, int16s[1]): + | | | | 0484: 28 00 [(.] + | | | | CameraType = 252 + | | | | - Tag 0x001a (2 bytes, int16s[1]): + | | | | 0488: fc 00 [..] + | | | | AutoRotate = 0 + | | | | - Tag 0x001b (2 bytes, int16s[1]): + | | | | 048a: 00 00 [..] + | | | | NDFilter = -1 + | | | | - Tag 0x001c (2 bytes, int16s[1]): + | | | | 048c: ff ff [..] + | | | | SelfTimer2 = 0 + | | | | - Tag 0x001d (2 bytes, int16s[1]): + | | | | 048e: 00 00 [..] + | | | 4) CanonFileInfo (SubDirectory) --> + | | | - Tag 0x0093 (18 bytes, int16u[9] read as undef[18]): + | | | 0496: 12 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff [................] + | | | 04a6: ff ff [..] + | | | + [BinaryData directory, 18 bytes] + | | | | BracketMode = 0 + | | | | - Tag 0x0003 (2 bytes, int16s[1]): + | | | | 049c: 00 00 [..] + | | | | BracketValue = 0 + | | | | - Tag 0x0004 (2 bytes, int16s[1]): + | | | | 049e: 00 00 [..] + | | | | BracketShotNumber = 0 + | | | | - Tag 0x0005 (2 bytes, int16s[1]): + | | | | 04a0: 00 00 [..] + | | | | RawJpgQuality = -1 + | | | | - Tag 0x0006 (2 bytes, int16s[1]): + | | | | 04a2: ff ff [..] + | | | | RawJpgSize = -1 + | | | | - Tag 0x0007 (2 bytes, int16s[1]): + | | | | 04a4: ff ff [..] + | | | | LongExposureNoiseReduction2 = -1 + | | | | - Tag 0x0008 (2 bytes, int16s[1]): + | | | | 04a6: ff ff [..] + | | | 5) CanonImageType = CRW:EOS DIGITAL REBEL CMOS RAW + | | | - Tag 0x0006 (32 bytes, string[32]): + | | | 04a8: 43 52 57 3a 45 4f 53 20 44 49 47 49 54 41 4c 20 [CRW:EOS DIGITAL ] + | | | 04b8: 52 45 42 45 4c 20 43 4d 4f 53 20 52 41 57 00 00 [REBEL CMOS RAW..] + | | | 6) CanonFirmwareVersion = Firmware Version 1.1.1 + | | | - Tag 0x0007 (32 bytes, string[32]): + | | | 04c8: 46 69 72 6d 77 61 72 65 20 56 65 72 73 69 6f 6e [Firmware Version] + | | | 04d8: 20 31 2e 31 2e 31 00 00 00 00 00 00 00 00 00 00 [ 1.1.1..........] + | | | 7) SerialNumber = 560018150 + | | | - Tag 0x000c (4 bytes, int32u[1]): + | | | 0308: e6 32 61 21 [.2a!] + | | | 8) SerialNumberFormat = 2415919104 + | | | - Tag 0x0015 (4 bytes, int32u[1]): + | | | 0314: 00 00 00 90 [....] + | | | 9) FileNumber = 1181861 + | | | - Tag 0x0008 (4 bytes, int32u[1]): + | | | 0320: a5 08 12 00 [....] + | | | 10) OwnerName = Phil Harvey + | | | - Tag 0x0009 (32 bytes, string[32]): + | | | 04e8: 50 68 69 6c 20 48 61 72 76 65 79 00 00 00 00 00 [Phil Harvey.....] + | | | 04f8: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | | 11) CanonModelID = 2147484016 + | | | - Tag 0x0010 (4 bytes, int32u[1]): + | | | 0338: 70 01 00 80 [p...] + | | | 12) CanonFileLength = 4480822 + | | | - Tag 0x000e (4 bytes, int32u[1]): + | | | 0344: 36 5f 44 00 [6_D.] + | | | 13) CanonCameraInfoUnknown (SubDirectory) --> + | | | - Tag 0x000d (512 bytes, int8u[512] read as undef[512]): + | | | 0508: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | | 0518: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | | 0528: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | | 0538: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | | 0548: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | | [snip 432 bytes] + | | | + [BinaryData directory, 512 bytes] + | | | 14) Canon_0x0000 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + | | | - Tag 0x0000 (36 bytes, int16u[18]): + | | | 0708: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | | 0718: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | | 0728: 00 00 00 00 [....] + | | | 15) Canon_0x00c0 = 26 331 372 372 177 240 428 429 277 186 510 511 442 + | | | - Tag 0x00c0 (26 bytes, int16u[13]): + | | | 072c: 1a 00 4b 01 74 01 74 01 b1 00 f0 00 ac 01 ad 01 [..K.t.t.........] + | | | 073c: 15 01 ba 00 fe 01 ff 01 ba 01 [..........] + | | | 16) Canon_0x00c1 = 26 299 375 375 170 202 394 395 240 153 453 454 375 + | | | - Tag 0x00c1 (26 bytes, int16u[13]): + | | | 0746: 1a 00 2b 01 77 01 77 01 aa 00 ca 00 8a 01 8b 01 [..+.w.w.........] + | | | 0756: f0 00 99 00 c5 01 c6 01 77 01 [........w.] + | | | 17) MeasuredColor (SubDirectory) --> + | | | - Tag 0x00aa (10 bytes, int16u[5] read as undef[10]): + | | | 0760: 0a 00 e6 03 fe 03 02 04 28 03 [........(.] + | | | + [BinaryData directory, 10 bytes] + | | | | MeasuredRGGB = 998 1022 1026 808 + | | | | - Tag 0x0001 (8 bytes, int16u[4]): + | | | | 0762: e6 03 fe 03 02 04 28 03 [......(.] + | | | 18) Canon_0x00a8 = 20 5190 5190 7000 5987 3214 3897 6203 5190 5200 + | | | - Tag 0x00a8 (20 bytes, int16u[10]): + | | | 076a: 14 00 46 14 46 14 58 1b 63 17 8e 0c 39 0f 3b 18 [..F.F.X.c...9.;.] + | | | 077a: 46 14 50 14 [F.P.] + | | | 19) ColorBalance (SubDirectory) --> + | | | - Tag 0x00a9 (82 bytes, int16u[41] read as undef[82]): + | | | 077e: 52 00 b7 06 40 03 3f 03 de 03 ba 06 40 03 3f 03 [R...@.?.....@.?.] + | | | 078e: dd 03 f3 07 40 03 3f 03 47 03 56 07 40 03 3f 03 [....@.?.G.V.@.?.] + | | | 079e: 87 03 cc 04 91 03 90 03 84 06 e2 05 4a 03 49 03 [............J.I.] + | | | 07ae: 65 05 8d 07 40 03 3f 03 7f 03 ba 06 40 03 3f 03 [e...@.?.....@.?.] + | | | 07be: dd 03 ba 06 40 03 3f 03 dc 03 7c 00 7b 00 7c 00 [....@.?...|.{.|.] + | | | 07ce: 7b 00 [{.] + | | | + [BinaryData directory, 82 bytes] + | | | | WB_RGGBLevelsAuto = 1719 832 831 990 + | | | | - Tag 0x0001 (8 bytes, int16s[4]): + | | | | 0780: b7 06 40 03 3f 03 de 03 [..@.?...] + | | | | WB_RGGBLevelsDaylight = 1722 832 831 989 + | | | | - Tag 0x0005 (8 bytes, int16s[4]): + | | | | 0788: ba 06 40 03 3f 03 dd 03 [..@.?...] + | | | | WB_RGGBLevelsShade = 2035 832 831 839 + | | | | - Tag 0x0009 (8 bytes, int16s[4]): + | | | | 0790: f3 07 40 03 3f 03 47 03 [..@.?.G.] + | | | | WB_RGGBLevelsCloudy = 1878 832 831 903 + | | | | - Tag 0x000d (8 bytes, int16s[4]): + | | | | 0798: 56 07 40 03 3f 03 87 03 [V.@.?...] + | | | | WB_RGGBLevelsTungsten = 1228 913 912 1668 + | | | | - Tag 0x0011 (8 bytes, int16s[4]): + | | | | 07a0: cc 04 91 03 90 03 84 06 [........] + | | | | WB_RGGBLevelsFluorescent = 1506 842 841 1381 + | | | | - Tag 0x0015 (8 bytes, int16s[4]): + | | | | 07a8: e2 05 4a 03 49 03 65 05 [..J.I.e.] + | | | | WB_RGGBLevelsFlash = 1933 832 831 895 + | | | | - Tag 0x0019 (8 bytes, int16s[4]): + | | | | 07b0: 8d 07 40 03 3f 03 7f 03 [..@.?...] + | | | | WB_RGGBLevelsCustom = 1722 832 831 989 + | | | | - Tag 0x001d (8 bytes, int16s[4]): + | | | | 07b8: ba 06 40 03 3f 03 dd 03 [..@.?...] + | | | | WB_RGGBLevelsKelvin = 1722 832 831 988 + | | | | - Tag 0x0021 (8 bytes, int16s[4]): + | | | | 07c0: ba 06 40 03 3f 03 dc 03 [..@.?...] + | | | | WB_RGGBBlackLevels = 124 123 124 123 + | | | | - Tag 0x0025 (8 bytes, int16s[4]): + | | | | 07c8: 7c 00 7b 00 7c 00 7b 00 [|.{.|.{.] + | | | 20) ColorTemperature = 5200 + | | | - Tag 0x00ae (2 bytes, int16u[1]): + | | | 03a4: 50 14 [P.] + | | | 21) ColorSpace = 1 + | | | - Tag 0x00b4 (2 bytes, int16u[1]): + | | | 03b0: 01 00 [..] + | | | 22) CanonAFInfo (SubDirectory) --> + | | | - Tag 0x0012 (48 bytes, int16u[24] read as undef[48]): + | | | 07d0: 07 00 07 00 00 0c 00 08 00 0c 00 08 97 00 97 00 [................] + | | | 07e0: f6 03 60 02 00 00 00 00 00 00 a0 fd 0a fc 00 00 [..`.............] + | | | 07f0: 00 00 06 fe 00 00 fa 01 00 00 00 00 00 00 ff ff [................] + | | | + [SerialData directory, 48 bytes] + | | | | 0) NumAFPoints = 7 + | | | | - Tag 0x0000 (2 bytes, int16u[1]): + | | | | 07d0: 07 00 [..] + | | | | 1) ValidAFPoints = 7 + | | | | - Tag 0x0001 (2 bytes, int16u[1]): + | | | | 07d2: 07 00 [..] + | | | | 2) CanonImageWidth = 3072 + | | | | - Tag 0x0002 (2 bytes, int16u[1]): + | | | | 07d4: 00 0c [..] + | | | | 3) CanonImageHeight = 2048 + | | | | - Tag 0x0003 (2 bytes, int16u[1]): + | | | | 07d6: 00 08 [..] + | | | | 4) AFImageWidth = 3072 + | | | | - Tag 0x0004 (2 bytes, int16u[1]): + | | | | 07d8: 00 0c [..] + | | | | 5) AFImageHeight = 2048 + | | | | - Tag 0x0005 (2 bytes, int16u[1]): + | | | | 07da: 00 08 [..] + | | | | 6) AFAreaWidth = 151 + | | | | - Tag 0x0006 (2 bytes, int16u[1]): + | | | | 07dc: 97 00 [..] + | | | | 7) AFAreaHeight = 151 + | | | | - Tag 0x0007 (2 bytes, int16u[1]): + | | | | 07de: 97 00 [..] + | | | | 8) AFAreaXPositions = 1014 608 0 0 0 -608 -1014 + | | | | - Tag 0x0008 (14 bytes, int16s[7]): + | | | | 07e0: f6 03 60 02 00 00 00 00 00 00 a0 fd 0a fc [..`...........] + | | | | 9) AFAreaYPositions = 0 0 -506 0 506 0 0 + | | | | - Tag 0x0009 (14 bytes, int16s[7]): + | | | | 07ee: 00 00 00 00 06 fe 00 00 fa 01 00 00 00 00 [..............] + | | | | 10) AFPointsInFocus = 0 + | | | | - Tag 0x000a (2 bytes, int16s[1]): + | | | | 07fc: 00 00 [..] + | | | 23) ThumbnailImageValidArea = 0 159 7 112 + | | | - Tag 0x0013 (8 bytes, int16u[4]): + | | | 0800: 00 00 9f 00 07 00 70 00 [......p.] + | | | 24) Canon_0x00b5 = 10 3 1 2048 1360 + | | | - Tag 0x00b5 (10 bytes, int16u[5]): + | | | 0808: 0a 00 03 00 01 00 00 08 50 05 [........P.] + | | | 25) Canon_0x0000 = 0 0 0 0 0 0 3072000 892 2048000 595 65540 262146 + | | | - Tag 0x0000 (48 bytes, int32u[12]): + | | | 0812: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | | 0822: 00 00 00 00 00 00 00 00 00 e0 2e 00 7c 03 00 00 [............|...] + | | | 0832: 00 40 1f 00 53 02 00 00 04 00 01 00 02 00 04 00 [.@..S...........] + | | 16) UserComment = + | | - Tag 0x9286 (264 bytes, undef[264]): + | | 0842: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | 0852: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | 0862: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | 0872: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | 0882: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + | | [snip 184 bytes] + | | 17) FlashpixVersion = 0100 + | | - Tag 0xa000 (4 bytes, undef[4]): + | | 019e: 30 31 30 30 [0100] + | | 18) ColorSpace = 1 + | | - Tag 0xa001 (2 bytes, int16u[1]): + | | 01aa: 01 00 [..] + | | 19) ExifImageWidth = 160 + | | - Tag 0xa002 (2 bytes, int16u[1]): + | | 01b6: a0 00 [..] + | | 20) ExifImageHeight = 120 + | | - Tag 0xa003 (2 bytes, int16u[1]): + | | 01c2: 78 00 [x.] + | | 21) InteropOffset (SubDirectory) --> + | | - Tag 0xa005 (4 bytes, int32u[1]): + | | 01ce: 4e 09 00 00 [N...] + | | + [InteropIFD directory with 4 entries] + | | | 0) InteropIndex = THM + | | | - Tag 0x0001 (4 bytes, string[4]): + | | | 0964: 54 48 4d 00 [THM.] + | | | 1) InteropVersion = 0100 + | | | - Tag 0x0002 (4 bytes, undef[4]): + | | | 0970: 30 31 30 30 [0100] + | | | 2) RelatedImageWidth = 3072 + | | | - Tag 0x1001 (2 bytes, int16u[1]): + | | | 097c: 00 0c [..] + | | | 3) RelatedImageHeight = 2048 + | | | - Tag 0x1002 (2 bytes, int16u[1]): + | | | 0988: 00 08 [..] + | | 22) FocalPlaneXResolution = 3443.946188 (3072000/892) + | | - Tag 0xa20e (8 bytes, rational64u[1]): + | | 094a: 00 e0 2e 00 7c 03 00 00 [....|...] + | | 23) FocalPlaneYResolution = 3442.016807 (2048000/595) + | | - Tag 0xa20f (8 bytes, rational64u[1]): + | | 0952: 00 40 1f 00 53 02 00 00 [.@..S...] + | | 24) FocalPlaneResolutionUnit = 2 + | | - Tag 0xa210 (2 bytes, int16u[1]): + | | 01f2: 02 00 [..] + | | 25) SensingMethod = 2 + | | - Tag 0xa217 (2 bytes, int16u[1]): + | | 01fe: 02 00 [..] + | | 26) FileSource = 3 + | | - Tag 0xa300 (1 bytes, undef[1]): + | | 020a: 03 [.] + | | 27) CustomRendered = 0 + | | - Tag 0xa401 (2 bytes, int16u[1]): + | | 0216: 00 00 [..] + | | 28) ExposureMode = 1 + | | - Tag 0xa402 (2 bytes, int16u[1]): + | | 0222: 01 00 [..] + | | 29) WhiteBalance = 0 + | | - Tag 0xa403 (2 bytes, int16u[1]): + | | 022e: 00 00 [..] + | | 30) SceneCaptureType = 0 + | | - Tag 0xa406 (2 bytes, int16u[1]): + | | 023a: 00 00 [..] +JPEG DQT (130 bytes): + 0994: 00 14 10 10 19 12 19 27 17 17 27 32 26 1f 26 32 [.......'..'2&.&2] + 09a4: 2e 26 26 26 26 2e 3e 35 35 35 35 35 3e 44 41 41 [.&&&&.>55555>DAA] + 09b4: 41 41 41 41 44 44 44 44 44 44 44 44 44 44 44 44 [AAAADDDDDDDDDDDD] + 09c4: 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 [DDDDDDDDDDDDDDDD] + 09d4: 44 01 15 19 19 20 1c 20 26 18 18 26 36 26 20 26 [D.... . &..&6& &] + 09e4: 36 44 36 2b 2b 36 44 44 44 42 35 42 44 44 44 44 [6D6++6DDDB5BDDDD] + 09f4: 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 [DDDDDDDDDDDDDDDD] + [snip 18 bytes] +JPEG SOF0 (15 bytes): + 0a1a: 08 00 08 00 08 03 01 22 00 02 11 01 03 11 01 [.......".......] + ImageWidth = 8 + ImageHeight = 8 + EncodingProcess = 0 + BitsPerSample = 8 + ColorComponents = 3 + YCbCrSubSampling = 2 2 +JPEG DHT (73 bytes): + 0a2d: 00 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 [................] + 0a3d: 00 00 06 01 01 00 00 00 00 00 00 00 00 00 00 00 [................] + 0a4d: 00 00 00 00 00 10 01 00 00 00 00 00 00 00 00 00 [................] + 0a5d: 00 00 00 00 00 00 00 11 01 00 00 00 00 00 00 00 [................] + 0a6d: 00 00 00 00 00 00 00 00 00 [.........] +JPEG SOS +JPEG EOI diff --git a/t/ExifTool_2.out b/t/ExifTool_2.out new file mode 100644 index 0000000..92bd297 --- /dev/null +++ b/t/ExifTool_2.out @@ -0,0 +1,443 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[ExifTool, ExifTool, ExifTool] Warning - Warning: IPTCDigest is not current. XMP may be out of sync +[File, System, Other] FileName - File Name: ExifTool.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 26 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2021:03:19 14:14:12-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:34-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] Comment - Comment: © PhotoStudio Unicode comment;; +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 6895be53ef9a287520f400aa17242c09 +[File, File, Image] Comment - Comment: a comment +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: A witty caption +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2004:02:26 09:36:46 +[EXIF, IFD0, Author] 315 - Artist: Phil Harvey +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: Copyright 2004 Phil Harvey +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1.6 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 100 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 80 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 852 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 0 +[JFIF, JFIF, Image] 0 - JFIF Version: 1.01 +[JFIF, JFIF, Image] 2 - Resolution Unit: inches +[JFIF, JFIF, Image] 3 - X Resolution: 144 +[JFIF, JFIF, Image] 5 - Y Resolution: 144 +[JFIF, JFXX, Preview] 16 - Thumbnail Image: (Binary data 1558 bytes) +[APP8, SPIFF, Image] 0 - SPIFF Version: 1.2 +[APP8, SPIFF, Image] 2 - Profile ID: Continuous-tone Base +[APP8, SPIFF, Image] 3 - Color Components: 3 +[APP8, SPIFF, Image] 6 - Image Height: 4500 +[APP8, SPIFF, Image] 10 - Image Width: 3000 +[APP8, SPIFF, Image] 14 - Color Space: YCbCr, ITU-R BT 709, video +[APP8, SPIFF, Image] 15 - Bits Per Sample: 8 +[APP8, SPIFF, Image] 16 - Compression: JPEG +[APP8, SPIFF, Image] 17 - Resolution Unit: inches +[APP8, SPIFF, Image] 18 - Y Resolution: 300 +[APP8, SPIFF, Image] 22 - X Resolution: 300 +[MakerNotes, CIFF, Image] 0 - File Format: JPEG (lossy) +[MakerNotes, CIFF, Image] 1 - Target Compression Ratio: 2 +[MakerNotes, CIFF, Image] 0 - Image Width: 512 +[MakerNotes, CIFF, Image] 1 - Image Height: 384 +[MakerNotes, CIFF, Image] 2 - Pixel Aspect Ratio: 1 +[MakerNotes, CIFF, Image] 3 - Rotation: 0 +[MakerNotes, CIFF, Image] 4 - Component Bit Depth: 8 +[MakerNotes, CIFF, Image] 5 - Color Bit Depth: 24 +[MakerNotes, CIFF, Image] 6 - Color BW: 1 +[MakerNotes, CIFF, Camera] 4106 - Target Image Type: Real-world Subject +[MakerNotes, CIFF, Camera] 6148 - Record ID: 0 +[MakerNotes, CIFF, Image] 6167 - File Number: 45 +[MakerNotes, CIFF, Time] 0 - Date/Time Original: 1998:05:01 21:33:18 +[MakerNotes, CIFF, Time] 1 - Time Zone Code: 0 +[MakerNotes, CIFF, Time] 2 - Time Zone Info: 0 +[MakerNotes, CIFF, Camera] 2070 - Original File Name: C:\DC97\CTG_0000\AUT_0045.JPG +[MakerNotes, CIFF, Camera] 2071 - Thumbnail File Name: C:\DC97\CTG_0000\THM_0045.JPG +[MakerNotes, CIFF, Camera] 4112 - Shutter Release Method: Single Shot +[MakerNotes, CIFF, Camera] 4113 - Shutter Release Timing: Priority on focus +[MakerNotes, CIFF, Image] 0 - Flash Guide Number: 0 +[MakerNotes, CIFF, Image] 1 - Flash Threshold: 0 +[MakerNotes, CIFF, Image] 0 - Exposure Compensation: 1 +[MakerNotes, CIFF, Image] 1 - Shutter Speed Value: 1/83 +[MakerNotes, CIFF, Image] 2 - Aperture Value: 6.2 +[MakerNotes, CIFF, Camera] 6151 - Target Distance Setting: 476 mm +[MakerNotes, CIFF, Camera] 6164 - Measured EV: 16.25 +[MakerNotes, CIFF, Camera] 2053 - Canon File Description: +[MakerNotes, CIFF, Camera] 2069 - Canon Image Type: AUT:Full automatic mode +[MakerNotes, CIFF, Camera] 2064 - Owner Name: +[MakerNotes, CIFF, Camera] 0 - Make: Canon +[MakerNotes, CIFF, Camera] 6 - Camera Model Name: Canon PowerShot A5 +[MakerNotes, CIFF, Camera] 4124 - Base ISO: 100 +[MakerNotes, CIFF, Camera] 2061 - ROM Operation Mode: USA +[MakerNotes, CIFF, Camera] 2059 - Canon Firmware Version: Firmware Version 01.00 +[MakerNotes, CIFF, Camera] 1 - Free Bytes: (Binary data 12 bytes) +[MakerNotes, CIFF, Image] 0 - Focal Type: Fixed +[MakerNotes, CIFF, Image] 1 - Focal Length: 5 mm +[MakerNotes, CIFF, Image] 2 - Focal Plane X Size: 5.05 mm +[MakerNotes, CIFF, Image] 3 - Focal Plane Y Size: 3.71 mm +[MakerNotes, Qualcomm, Camera] aec_current_sensor_luma - AEC Current Sensor Luma: 22 +[MakerNotes, Qualcomm, Camera] af_position - AF Position: 26 +[MakerNotes, Qualcomm, Camera] aec_current_exp_index - AEC Current Exp Index: 308 +[MakerNotes, Qualcomm, Camera] awb_sample_decision - AWB Sample Decision: 7 +[MakerNotes, Qualcomm, Camera] asf5_enable - ASF5 Enable: 1 +[MakerNotes, Qualcomm, Camera] asf5_filter_mode - ASF5 Filter Mode: 0 +[MakerNotes, Qualcomm, Camera] asf5_exposure_index_1 - ASF5 Exposure Index 1: 180 +[MakerNotes, Qualcomm, Camera] asf5_exposure_index_2 - ASF5 Exposure Index 2: 270 +[MakerNotes, Qualcomm, Camera] asf5_max_exposure_index - ASF5 Max Exposure Index: 290 +[MakerNotes, Samsung, Other] 0x0100-name - Embedded Audio File Name: SoundShot_000 +[MakerNotes, Samsung, Audio] 0x0100 - Embedded Audio File: (Binary data 16 bytes) +[APP0, AVI1, Image] 0 - Interleaved Field: Not Interleaved +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 4.73 +[XMP, XMP-rdf, Document] about - About: uuid:80056b68-1045-fa97-3401-6f4ed84cd53d +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: UTF-16 (big-endian) encoded XMP +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP +[XMP, XMP-dc, Image] title - Title: Test IPTC picture +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: My Position +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: I wrote it +[XMP, XMP-photoshop, Image] Category - Category: 1 +[XMP, XMP-photoshop, Location] City - City: Kingston +[XMP, XMP-photoshop, Location] Country - Country: Canada +[XMP, XMP-photoshop, Author] Credit - Credit: My Credit +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2004:02:26 +[XMP, XMP-photoshop, Image] Headline - Headline: No headline +[XMP, XMP-photoshop, Image] Instructions - Instructions: What instructions +[XMP, XMP-photoshop, Author] Source - Source: I'm the source +[XMP, XMP-photoshop, Location] State - State: Ont +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: amazing, image, utilities +[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: What is a transmission reference? +[XMP, XMP-photoshop, Image] Urgency - Urgency: 8 (least urgent) +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:4cc7b857-69d0-11d8-8ac4-bb59c92f0d9a +[XMP, XMP-xmpRights, Author] Marked - Marked: False +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Adobe Systems Inc. +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.1.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1999:06:03 00:00:00 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Apple Computer Inc. +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: none +[ICC_Profile, ICC-header, Image] 52 - Device Model: +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: Adobe Systems Inc. +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Copyright 1999 Adobe Systems Incorporated +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: Adobe RGB (1998) +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.95045 1 1.08905 +[ICC_Profile, ICC_Profile, Image] bkpt - Media Black Point: 0 0 0 +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.60974 0.31111 0.01947 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.20528 0.62567 0.06087 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.14919 0.06322 0.74457 +[FlashPix, FlashPix, Other] 1 - Code Page: Unicode UTF-16, little endian +[FlashPix, FlashPix, Other] 268435456 - Used Extension Numbers: 1 +[FlashPix, FlashPix, Other] 1 - Extension Name: Screen nail +[FlashPix, FlashPix, Other] 2 - Extension Class ID: 10000230-6FC0-11D0-BD01-00609719A180 +[FlashPix, FlashPix, Other] 3 - Extension Persistence: Invalidated By Modification +[FlashPix, FlashPix, Time] 4 - Extension Create Date: 1999:05:14 21:47:25 +[FlashPix, FlashPix, Time] 5 - Extension Modify Date: 1999:05:14 21:47:25 +[FlashPix, FlashPix, Other] 6 - Creating Application: Digita +[FlashPix, FlashPix, Other] 7 - Extension Description: Presized image for LCD display +[FlashPix, FlashPix, Other] 4096 - Storage-Stream Pathname: /.Screen Nail_bd0100609719a180 +[FlashPix, FlashPix, Other] Screen Nail - Screen Nail: (Binary data 5917 bytes) +[FlashPix, FlashPix, Preview] FlashPix-PreviewImage - Preview Image: (Binary data 5777 bytes) +[MPF, MPF0, Image] 45056 - MPF Version: 0100 +[MPF, MPF0, Image] 45057 - Number Of Images: 2 +[MPF, MPImage1, Image] 0.1 - MP Image Flags: Dependent parent image +[MPF, MPImage1, Image] 0.2 - MP Image Format: JPEG +[MPF, MPImage1, Image] 0.3 - MP Image Type: Baseline MP Primary Image +[MPF, MPImage1, Image] 4 - MP Image Length: 5959981 +[MPF, MPImage1, Image] 8 - MP Image Start: 0 +[MPF, MPImage1, Image] 12 - Dependent Image 1 Entry Number: 2 +[MPF, MPImage1, Image] 14 - Dependent Image 2 Entry Number: 0 +[MPF, MPImage2, Image] 0.1 - MP Image Flags: Dependent child image +[MPF, MPImage2, Image] 0.2 - MP Image Format: JPEG +[MPF, MPImage2, Image] 0.3 - MP Image Type: Large Thumbnail (full HD equivalent) +[MPF, MPImage2, Image] 4 - MP Image Length: 1039273 +[MPF, MPImage2, Image] 8 - MP Image Start: 5945405 +[MPF, MPImage2, Image] 12 - Dependent Image 1 Entry Number: 0 +[MPF, MPImage2, Image] 14 - Dependent Image 2 Entry Number: 0 +[MPF, MPImage2, Preview] PreviewImage - Preview Image: (Binary data 1039273 bytes) +[Meta, MetaIFD, Image] 50000 - Film Product Code: 37 +[Meta, MetaIFD, Image] 50001 - Image Source EK: 1 +[Meta, MetaIFD, Image] 50002 - Capture Conditions PAR: 1 +[Meta, MetaIFD, Image] 50009 - Frame Number: 0 +[Meta, MetaIFD, Image] 50010 - Film Category: 2 +[Meta, MetaIFD, Image] 50011 - Film Gencode: 2 +[Meta, MetaIFD, Image] 50012 - Model And Version: Version 9 +[Meta, MetaIFD, Image] 50013 - Film Size: 1 +[Meta, MetaIFD, Image] 50014 - SBA RGB Shifts: 0 0 0 +[Meta, MetaIFD, Image] 50015 - SBA Input Image Colorspace: 3 +[Meta, MetaIFD, Image] 50016 - SBA Input Image Bit Depth: 12 12 12 +[Meta, MetaIFD, Image] 50017 - SBA Exposure Record: (Binary data 368 bytes) +[Meta, MetaIFD, Image] 50018 - User Adj SBA RGB Shifts: (Binary data 5 bytes) +[Meta, MetaIFD, Image] 50019 - Image Rotation Status: 0 +[Meta, MetaIFD, Image] 50020 - Roll Guid Elements: 00000000000000000000000000000000 +[Meta, MetaIFD, Image] 50021 - Metadata Number: 0100 +[APP5, RMETA, Image] Sign type - Sign Type: Information +[APP5, RMETA, Image] Location - Location: Roundabout +[APP5, RMETA, Image] Lit - Lit: No +[APP5, RMETA, Image] Condition - Condition: Good +[APP5, RMETA, Image] Azimuth - Azimuth: E +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[APP6, NITF, Image] 0 - NITF Version: 2.00 +[APP6, NITF, Image] 2 - Image Format: IMode B +[APP6, NITF, Image] 3 - Blocks Per Row: 1 +[APP6, NITF, Image] 5 - Blocks Per Column: 1 +[APP6, NITF, Image] 7 - Image Color: Monochrome +[APP6, NITF, Image] 8 - Bit Depth: 8 +[APP6, NITF, Image] 9 - Image Class: General Purpose +[APP6, NITF, Image] 10 - JPEG Process: Baseline sequential DCT, Huffman coding, 8-bit samples +[APP6, NITF, Image] 11 - Quality: 1 +[APP6, NITF, Image] 12 - Stream Color: Monochrome +[APP6, NITF, Image] 13 - Stream Bit Depth: 8 +[APP6, NITF, Image] 14 - Flags: 0x1010000 +[XML, MediaJukebox, Image] Tool_Name - Tool Name: Media Center +[XML, MediaJukebox, Image] Tool_Version - Tool Version: 19.0.67 +[XML, MediaJukebox, Image] People - People: Santa +[XML, MediaJukebox, Image] Places - Places: Jamaica +[XML, MediaJukebox, Time] Date - Date: 2013:09:01 20:12:19 +[XML, MediaJukebox, Image] Album - Album: 2013-09-01 +[XML, MediaJukebox, Image] Name - Name: Glass home at night +[APP11, JPEG-HDR, Image] ver - JPEG-HDR Version: 11 +[APP11, JPEG-HDR, Image] ln0 - Ln0: 0.122262 +[APP11, JPEG-HDR, Image] ln1 - Ln1: 2.634655 +[APP11, JPEG-HDR, Image] s2n - S2n: 2.269635e+03 +[APP11, JPEG-HDR, Image] alp - Alpha: 1.000000 +[APP11, JPEG-HDR, Image] bet - Beta: 1.000000 +[APP11, JPEG-HDR, Image] cor - Correction Method: 0 +[APP11, JPEG-HDR, Preview] RatioImage - Ratio Image: (Binary data 19 bytes) +[JUMBF, JUMBF, Image] type - JUMD Type: (cacb)-0011-0010-800000aa00389b71 +[JUMBF, JUMBF, Image] label - JUMD Label: cai +[JUMBF, JUMBF, Image] type - JUMD Type: (cast)-0011-0010-800000aa00389b71 +[JUMBF, JUMBF, Image] label - JUMD Label: cb.reuters_1 +[JUMBF, JUMBF, Image] type - JUMD Type: (caas)-0011-0010-800000aa00389b71 +[JUMBF, JUMBF, Image] label - JUMD Label: cai.assertions +[JUMBF, JUMBF, Image] type - JUMD Type: (json)-0011-0010-800000aa00389b71 +[JUMBF, JUMBF, Image] label - JUMD Label: adobe.asset.info +[JUMBF, JSON, Other] title - Title: HEALTHCORONAVIRUSUSAOREGON_SALEM_08.jpg +[JUMBF, JUMBF, Image] type - JUMD Type: (json)-0011-0010-800000aa00389b71 +[JUMBF, JUMBF, Image] label - JUMD Label: cai.location.broad +[JUMBF, JSON, Other] location - Location: Salem, Oregon +[JUMBF, JUMBF, Image] type - JUMD Type: (json)-0011-0010-800000aa00389b71 +[JUMBF, JUMBF, Image] label - JUMD Label: cai.rights +[JUMBF, JSON, Other] copyright - Copyright: Alisha Jucevic +[APP12, PictureInfo, Time] TimeDate - Date/Time Original: 1998:12:31 15:17:20 +[APP12, PictureInfo, Image] Shutter - Exposure Time: 1/155 +[APP12, PictureInfo, Image] Flash - Flash: Off +[APP12, PictureInfo, Image] Resolution - Resolution: 5 +[APP12, PictureInfo, Image] Protect - Protect: 0 +[APP12, PictureInfo, Image] ContTake - Cont Take: 0 +[APP12, PictureInfo, Image] ImageSize - Image Size: 1280x960 +[APP12, PictureInfo, Image] ColorMode - Color Mode: 1 +[APP12, PictureInfo, Image] FNumber - F Number: 11.0 +[APP12, PictureInfo, Image] Zoom - Zoom: 2.1 +[APP12, PictureInfo, Image] Macro - Macro: Off +[APP12, PictureInfo, Image] LightS - Light S: 0 +[APP12, PictureInfo, Image] ExpBias - Exposure Compensation: +2.0 +[APP12, PictureInfo, Camera] Type - Camera Type: SR84 +[APP12, PictureInfo, Camera] Serial# - Serial Number: #00000001 +[APP12, PictureInfo, Camera] Version - Version: v84-71 +[APP12, PictureInfo, Camera] ID - ID: AGFA DIGITAL CAMERA +[APP12, PictureInfo, Image] PicLen - Pic Len: 561039 +[APP12, PictureInfo, Image] ThmLen - Thm Len: 3802 +[APP12, PictureInfo, Image] Q - Tag Q: 96 +[APP12, PictureInfo, Image] R - Tag R: 293 +[APP12, PictureInfo, Image] B - Tag B: 332 +[APP12, PictureInfo, Image] s0 - S0: 1e8,0,11b0,6f72,15cf,4225,4225,1050000,a1e0004,0,2f0030d,2f102c5,2880090,0,0 +[APP12, PictureInfo, Image] T0 - T0: 11b15600,1290000,e00c0f,2,0,0 +[Ducky, Ducky, Image] 1 - Quality: 84% +[Ducky, Ducky, Author] 3 - Copyright: Copyright 2004 Phil Harvey +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: A witty caption +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it +[IPTC, IPTC, Other] 105 - Headline: No headline +[IPTC, IPTC, Other] 40 - Special Instructions: What instructions +[IPTC, IPTC, Author] 80 - By-line: Phil Harvey +[IPTC, IPTC, Author] 85 - By-line Title: My Position +[IPTC, IPTC, Author] 110 - Credit: My Credit +[IPTC, IPTC, Other] 5 - Object Name: Test IPTC picture +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ont +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 103 - Original Transmission Reference: What is a transmission reference +[IPTC, IPTC, Other] 15 - Category: 1 +[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing, image, utilities +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright 2004 Phil Harvey +[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Author] 115 - Source: I'm the source +[IPTC, IPTC, Other] 25 - Keywords: jambalaya +[IPTC, IPTC2, Other] 0 - Application Record Version: 2 +[IPTC, IPTC3, Other] 0 - Application Record Version: 2 +[IPTC, IPTC3, Other] 15 - Category: p +[IPTC, IPTC3, Time] 55 - Date Created: 2005:12:23 +[IPTC, IPTC3, Other] 5 - Object Name: object name +[IPTC, IPTC3, Other] 10 - Urgency: 2 +[IPTC, IPTC3, Other] 20 - Supplemental Categories: supp cat +[IPTC, IPTC3, Other] 40 - Special Instructions: special instructions +[IPTC, IPTC3, Author] 80 - By-line: byline +[IPTC, IPTC3, Author] 85 - By-line Title: byline title +[IPTC, IPTC3, Location] 90 - City: city +[IPTC, IPTC3, Location] 101 - Country-Primary Location Name: country name +[IPTC, IPTC3, Other] 103 - Original Transmission Reference: otr +[IPTC, IPTC3, Other] 105 - Headline: headline +[IPTC, IPTC3, Author] 110 - Credit: credit +[IPTC, IPTC3, Author] 115 - Source: source +[IPTC, IPTC3, Author] 116 - Copyright Notice: copy freely +[IPTC, IPTC3, Other] 120 - Caption-Abstract: ExifTool AFCP test +[IPTC, IPTC3, Author] 122 - Writer-Editor: caption writer +[IPTC, IPTC3, Location] 95 - Province-State: state +[IPTC, IPTC3, Other] 25 - Keywords: jambalaya +[Photoshop, Photoshop, Image] 1061 - IPTC Digest: 05ad1770b1a95f1f9788ac995fa647da +[Photoshop, Photoshop, Image] 0 - X Resolution: 72 +[Photoshop, Photoshop, Image] 2 - Displayed Units X: inches +[Photoshop, Photoshop, Image] 4 - Y Resolution: 72 +[Photoshop, Photoshop, Image] 6 - Displayed Units Y: inches +[Photoshop, Photoshop, Image] 0 - Print Style: Centered +[Photoshop, Photoshop, Image] 2 - Print Position: 0 0 +[Photoshop, Photoshop, Image] 10 - Print Scale: 1 +[Photoshop, Photoshop, Image] 1037 - Global Angle: 30 +[Photoshop, Photoshop, Image] 1049 - Global Altitude: 30 +[Photoshop, Photoshop, Author] 1034 - Copyright Flag: False +[Photoshop, Photoshop, Author] 1035 - URL: https://exiftool.org/ +[Photoshop, Photoshop, Image] 1054 - URL List: +[Photoshop, Photoshop, Other] 20 - Slices Group Name: IPTC +[Photoshop, Photoshop, Other] 24 - Num Slices: 1 +[Photoshop, Photoshop, Image] 4 - Has Real Merged Data: Yes +[Photoshop, Photoshop, Image] 5 - Writer Name: Adobe Photoshop +[Photoshop, Photoshop, Image] 9 - Reader Name: Adobe Photoshop 7.0 +[Photoshop, Photoshop, Image] 0 - Photoshop Quality: 7 +[Photoshop, Photoshop, Image] 1 - Photoshop Format: Standard +[Photoshop, Photoshop, Image] 2 - Progressive Scans: 3 Scans +[APP13, AdobeCM, Image] 0 - Adobe CM Type: 3 +[APP14, Adobe, Image] 0 - DCT Encode Version: 100 +[APP14, Adobe, Image] 1 - APP14 Flags 0: (none) +[APP14, Adobe, Image] 2 - APP14 Flags 1: (none) +[APP14, Adobe, Image] 3 - Color Transform: YCbCr +[APP15, GraphConv, Image] Q - Quality: 70 +[MIE, MIE-Doc, Author] Copyright - Copyright: © 2006 Phil Harvey +[MIE, MIE-Main, Other] zmie - Trailer Signature: +[PhotoMechanic, PhotoMechanic, Image] 221 - Tagged: Yes +[PhotoMechanic, PhotoMechanic, Image] 222 - Color Class: 6 (Typical alt) +[PhotoMechanic, PhotoMechanic, Image] 216 - Rotation: 180 +[PhotoMechanic, PhotoMechanic, Image] 217 - Crop Left: 438 +[PhotoMechanic, PhotoMechanic, Image] 218 - Crop Top: 618 +[PhotoMechanic, PhotoMechanic, Image] 219 - Crop Right: 890 +[PhotoMechanic, PhotoMechanic, Image] 220 - Crop Bottom: 1072 +[CanonVRD, CanonVRD, Image] 2 - VRD Version: 1.0.0 +[CanonVRD, CanonVRD, Image] 6 - WB Adj RGGB Levels: 0 0 0 0 +[CanonVRD, CanonVRD, Image] 24 - White Balance Adj: Shot Settings +[CanonVRD, CanonVRD, Image] 26 - WB Adj Color Temp: 5600 +[CanonVRD, CanonVRD, Image] 36 - WB Fine Tune Active: No +[CanonVRD, CanonVRD, Image] 40 - WB Fine Tune Saturation: 0 +[CanonVRD, CanonVRD, Image] 44 - WB Fine Tune Tone: 0 +[CanonVRD, CanonVRD, Image] 46 - Raw Color Adj: Shot Settings +[CanonVRD, CanonVRD, Image] 48 - Raw Custom Saturation: 0 +[CanonVRD, CanonVRD, Image] 52 - Raw Custom Tone: 0 +[CanonVRD, CanonVRD, Image] 56 - Raw Brightness Adj: 0.00 +[CanonVRD, CanonVRD, Image] 60 - Tone Curve Property: Shot Settings +[CanonVRD, CanonVRD, Image] 122 - Dynamic Range Min: 0 +[CanonVRD, CanonVRD, Image] 124 - Dynamic Range Max: 4095 +[CanonVRD, CanonVRD, Image] 272 - Tone Curve Active: No +[CanonVRD, CanonVRD, Image] 275 - Tone Curve Mode: RGB +[CanonVRD, CanonVRD, Image] 276 - Brightness Adj: 0 +[CanonVRD, CanonVRD, Image] 277 - Contrast Adj: 0 +[CanonVRD, CanonVRD, Image] 278 - Saturation Adj: 100 +[CanonVRD, CanonVRD, Image] 286 - Color Tone Adj: 0 +[CanonVRD, CanonVRD, Image] 294 - Luminance Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 336 - Luminance Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 345 - Tone Curve Interpolation: Curve +[CanonVRD, CanonVRD, Image] 352 - Red Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 394 - Red Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 410 - Green Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 452 - Green Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 468 - Blue Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 510 - Blue Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 526 - RGB Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 568 - RGB Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 580 - Crop Active: No +[CanonVRD, CanonVRD, Image] 582 - Crop Left: 0 +[CanonVRD, CanonVRD, Image] 584 - Crop Top: 0 +[CanonVRD, CanonVRD, Image] 586 - Crop Width: 0 +[CanonVRD, CanonVRD, Image] 588 - Crop Height: 0 +[CanonVRD, CanonVRD, Image] 602 - Sharpness Adj: 0 +[CanonVRD, CanonVRD, Image] 608 - Crop Aspect Ratio: Free +[CanonVRD, CanonVRD, Image] 610 - Constrained Crop Width: 0 +[CanonVRD, CanonVRD, Image] 614 - Constrained Crop Height: 0 +[CanonVRD, CanonVRD, Image] 618 - Check Mark: Clear +[CanonVRD, CanonVRD, Image] 622 - Rotation: 90 +[CanonVRD, CanonVRD, Image] 624 - Work Color Space: sRGB +[FotoStation, FotoStation, Image] 0 - Original Image Width: 16 +[FotoStation, FotoStation, Image] 1 - Original Image Height: 16 +[FotoStation, FotoStation, Image] 2 - Color Planes: 3 +[FotoStation, FotoStation, Image] 3 - XY Resolution: 9 +[FotoStation, FotoStation, Image] 4 - Rotation: 0 +[FotoStation, FotoStation, Image] 6 - Crop Left: 24.557% +[FotoStation, FotoStation, Image] 7 - Crop Top: 21.25% +[FotoStation, FotoStation, Image] 8 - Crop Right: 30.676% +[FotoStation, FotoStation, Image] 9 - Crop Bottom: 86.25% +[FotoStation, FotoStation, Image] 11 - Crop Rotation: 0 +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/155 +[Composite, Composite, Image] Exif-LightValue - Light Value: 10.9 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 6.9 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.004 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 47.0 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 6.0 mm (35 mm equivalent: 41.4 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 2.36 m diff --git a/t/ExifTool_20.out b/t/ExifTool_20.out new file mode 100644 index 0000000..914f324 --- /dev/null +++ b/t/ExifTool_20.out @@ -0,0 +1 @@ +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto diff --git a/t/ExifTool_21.out b/t/ExifTool_21.out new file mode 100644 index 0000000..0c18e97 --- /dev/null +++ b/t/ExifTool_21.out @@ -0,0 +1 @@ +[ICC_Profile, ICC_Profile, Image] ICC_Profile - ICC Profile: (Binary data 3144 bytes) diff --git a/t/ExifTool_22.out b/t/ExifTool_22.out new file mode 100644 index 0000000..514629e --- /dev/null +++ b/t/ExifTool_22.out @@ -0,0 +1 @@ +F_neP_x2400Zoom - Canon PowerShot A5 diff --git a/t/ExifTool_23.out b/t/ExifTool_23.out new file mode 100644 index 0000000..cefa4c7 --- /dev/null +++ b/t/ExifTool_23.out @@ -0,0 +1,6 @@ +[IPTC, IPTC3, Author] 80 - By-line: byline +[IPTC, IPTC3, Author] 85 - By-line Title: byline title +[IPTC, IPTC3, Author] 110 - Credit: credit +[IPTC, IPTC3, Author] 115 - Source: source +[IPTC, IPTC3, Author] 116 - Copyright Notice: copy freely +[IPTC, IPTC3, Author] 122 - Writer-Editor: caption writer diff --git a/t/ExifTool_24.out b/t/ExifTool_24.out new file mode 100644 index 0000000..e49a205 --- /dev/null +++ b/t/ExifTool_24.out @@ -0,0 +1,3 @@ +[EXIF, ExifIFD, Camera] 37385 - Flash: 0 +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 34 +[EXIF, ExifIFD, Camera] 41987 - White Balance: 0 diff --git a/t/ExifTool_25.out b/t/ExifTool_25.out new file mode 100644 index 0000000..41dcd3b --- /dev/null +++ b/t/ExifTool_25.out @@ -0,0 +1,14 @@ +[EXIF, IFD0, Time] 306 - Modify Date: 2004:01:26 09:36:46 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:04:18 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:04:18 18:36:41 +[MakerNotes, CIFF, Time] 0 - Date/Time Original: 1998:03:31 21:33:18 +[MakerNotes, CIFF, Time] 1 - Time Zone Code: 0 +[MakerNotes, CIFF, Time] 2 - Time Zone Info: 0 +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2004:01:26 +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1999:05:03 00:00:00 +[FlashPix, FlashPix, Time] 4 - Extension Create Date: 1999:05:14 21:47:25 +[FlashPix, FlashPix, Time] 5 - Extension Modify Date: 1999:05:14 21:47:25 +[XML, MediaJukebox, Time] Date - Date: 2013:08:01 20:12:19 +[APP12, PictureInfo, Time] TimeDate - Date/Time Original: 1998:11:30 15:17:20 +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC3, Time] 55 - Date Created: 2005:12:23 diff --git a/t/ExifTool_26.out b/t/ExifTool_26.out new file mode 100644 index 0000000..9f23dc3 --- /dev/null +++ b/t/ExifTool_26.out @@ -0,0 +1,13 @@ +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 10.66 +[File, File, Image] ExifByteOrder - Exif Byte Order: II +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 4 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[MakerNotes, Canon, Camera] 11 - Easy Mode: 1 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 22 - Exposure Time: 128 +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 160 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 120 +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: 1 +[File, File, Image] EncodingProcess - Encoding Process: 0 +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual diff --git a/t/ExifTool_27.out b/t/ExifTool_27.out new file mode 100644 index 0000000..61674f5 --- /dev/null +++ b/t/ExifTool_27.out @@ -0,0 +1,4 @@ +[XMP, XMP-dc, Image] subject - Subject: ExifTool +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: amazing +[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing +[IPTC, IPTC3, Other] 20 - Supplemental Categories: supp cat diff --git a/t/ExifTool_28.out b/t/ExifTool_28.out new file mode 100644 index 0000000..ed8ae58 --- /dev/null +++ b/t/ExifTool_28.out @@ -0,0 +1,11 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: ExifTool.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 26 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2021:03:19 14:14:12-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:35-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg diff --git a/t/ExifTool_29.out b/t/ExifTool_29.out new file mode 100644 index 0000000..658f724 --- /dev/null +++ b/t/ExifTool_29.out @@ -0,0 +1,442 @@ +[File, System, Other] FileName - File Name: ExifTool.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: ##_kB +[File, System, Time] FileModifyDate - File Modification Date/Time: ####:##:##_##:##:##-##:## +[File, System, Time] FileAccessDate - File Access Date/Time: ####:##:##_##:##:##-##:## +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: ####:##:##_##:##:##-##:## +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian_(Intel,_II) +[File, File, Image] Comment - Comment: ©_PhotoStudio_Unicode_comment;; +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: ####be##ef#a######f###aa#####c## +[File, File, Image] Comment - Comment: a_comment +[File, File, Image] ImageWidth - Image Width: # +[File, File, Image] ImageHeight - Image Height: # +[File, File, Image] EncodingProcess - Encoding Process: Baseline_DCT,_Huffman_coding +[File, File, Image] BitsPerSample - Bits Per Sample: # +[File, File, Image] ColorComponents - Color Components: # +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr#:#:#_(#_#) +[EXIF, IFD0, Image] 270 - Image Description: A_witty_caption +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix####Zoom +[EXIF, IFD0, Image] 274 - Orientation: Horizontal_(normal) +[EXIF, IFD0, Image] 282 - X Resolution: ## +[EXIF, IFD0, Image] 283 - Y Resolution: ## +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe_Photoshop_#.# +[EXIF, IFD0, Time] 306 - Modify Date: ####:##:##_##:##:## +[EXIF, IFD0, Author] 315 - Artist: Phil_Harvey +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: Copyright_####_Phil_Harvey +[EXIF, ExifIFD, Image] 33437 - F Number: #.# +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program_AE +[EXIF, ExifIFD, Image] 34855 - ISO: ### +[EXIF, ExifIFD, Image] 36864 - Exif Version: #### +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: ####:##:##_##:##:## +[EXIF, ExifIFD, Time] 36868 - Create Date: ####:##:##_##:##:## +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y,_Cb,_Cr,_- +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: #.# +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: #/## +[EXIF, ExifIFD, Image] 37378 - Aperture Value: #.# +[EXIF, ExifIFD, Image] 37379 - Brightness Value: # +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: # +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: #.# +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: #.#_mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: #### +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: ### +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: ## +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: #### +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: #### +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip_color_area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital_Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly_photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG_(old-style) +[EXIF, IFD1, Image] 282 - X Resolution: ## +[EXIF, IFD1, Image] 283 - Y Resolution: ## +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: ### +[EXIF, IFD1, Image] 514 - Thumbnail Length: # +[JFIF, JFIF, Image] 0 - JFIF Version: #.## +[JFIF, JFIF, Image] 2 - Resolution Unit: inches +[JFIF, JFIF, Image] 3 - X Resolution: ### +[JFIF, JFIF, Image] 5 - Y Resolution: ### +[JFIF, JFXX, Preview] 16 - Thumbnail Image: (Binary data 1558 bytes) +[APP8, SPIFF, Image] 0 - SPIFF Version: #.# +[APP8, SPIFF, Image] 2 - Profile ID: Continuous-tone_Base +[APP8, SPIFF, Image] 3 - Color Components: # +[APP8, SPIFF, Image] 6 - Image Height: #### +[APP8, SPIFF, Image] 10 - Image Width: #### +[APP8, SPIFF, Image] 14 - Color Space: YCbCr,_ITU-R_BT_###,_video +[APP8, SPIFF, Image] 15 - Bits Per Sample: # +[APP8, SPIFF, Image] 16 - Compression: JPEG +[APP8, SPIFF, Image] 17 - Resolution Unit: inches +[APP8, SPIFF, Image] 18 - Y Resolution: ### +[APP8, SPIFF, Image] 22 - X Resolution: ### +[MakerNotes, CIFF, Image] 0 - File Format: JPEG_(lossy) +[MakerNotes, CIFF, Image] 1 - Target Compression Ratio: # +[MakerNotes, CIFF, Image] 0 - Image Width: ### +[MakerNotes, CIFF, Image] 1 - Image Height: ### +[MakerNotes, CIFF, Image] 2 - Pixel Aspect Ratio: # +[MakerNotes, CIFF, Image] 3 - Rotation: # +[MakerNotes, CIFF, Image] 4 - Component Bit Depth: # +[MakerNotes, CIFF, Image] 5 - Color Bit Depth: ## +[MakerNotes, CIFF, Image] 6 - Color BW: # +[MakerNotes, CIFF, Camera] 4106 - Target Image Type: Real-world_Subject +[MakerNotes, CIFF, Camera] 6148 - Record ID: # +[MakerNotes, CIFF, Image] 6167 - File Number: ## +[MakerNotes, CIFF, Time] 0 - Date/Time Original: ####:##:##_##:##:## +[MakerNotes, CIFF, Time] 1 - Time Zone Code: # +[MakerNotes, CIFF, Time] 2 - Time Zone Info: # +[MakerNotes, CIFF, Camera] 2070 - Original File Name: C:\DC##\CTG_####\AUT_####.JPG +[MakerNotes, CIFF, Camera] 2071 - Thumbnail File Name: C:\DC##\CTG_####\THM_####.JPG +[MakerNotes, CIFF, Camera] 4112 - Shutter Release Method: Single_Shot +[MakerNotes, CIFF, Camera] 4113 - Shutter Release Timing: Priority_on_focus +[MakerNotes, CIFF, Image] 0 - Flash Guide Number: # +[MakerNotes, CIFF, Image] 1 - Flash Threshold: # +[MakerNotes, CIFF, Image] 0 - Exposure Compensation: # +[MakerNotes, CIFF, Image] 1 - Shutter Speed Value: #/## +[MakerNotes, CIFF, Image] 2 - Aperture Value: #.# +[MakerNotes, CIFF, Camera] 6151 - Target Distance Setting: ###_mm +[MakerNotes, CIFF, Camera] 6164 - Measured EV: ##.## +[MakerNotes, CIFF, Camera] 2053 - Canon File Description: +[MakerNotes, CIFF, Camera] 2069 - Canon Image Type: AUT:Full_automatic_mode +[MakerNotes, CIFF, Camera] 2064 - Owner Name: +[MakerNotes, CIFF, Camera] 0 - Make: Canon +[MakerNotes, CIFF, Camera] 6 - Camera Model Name: Canon_PowerShot_A# +[MakerNotes, CIFF, Camera] 4124 - Base ISO: ### +[MakerNotes, CIFF, Camera] 2061 - ROM Operation Mode: USA +[MakerNotes, CIFF, Camera] 2059 - Canon Firmware Version: Firmware_Version_##.## +[MakerNotes, CIFF, Camera] 1 - Free Bytes: (Binary data 12 bytes) +[MakerNotes, CIFF, Image] 0 - Focal Type: Fixed +[MakerNotes, CIFF, Image] 1 - Focal Length: #_mm +[MakerNotes, CIFF, Image] 2 - Focal Plane X Size: #.##_mm +[MakerNotes, CIFF, Image] 3 - Focal Plane Y Size: #.##_mm +[MakerNotes, Qualcomm, Camera] aec_current_sensor_luma - AEC Current Sensor Luma: ## +[MakerNotes, Qualcomm, Camera] af_position - AF Position: ## +[MakerNotes, Qualcomm, Camera] aec_current_exp_index - AEC Current Exp Index: ### +[MakerNotes, Qualcomm, Camera] awb_sample_decision - AWB Sample Decision: # +[MakerNotes, Qualcomm, Camera] asf5_enable - ASF5 Enable: # +[MakerNotes, Qualcomm, Camera] asf5_filter_mode - ASF5 Filter Mode: # +[MakerNotes, Qualcomm, Camera] asf5_exposure_index_1 - ASF5 Exposure Index 1: ### +[MakerNotes, Qualcomm, Camera] asf5_exposure_index_2 - ASF5 Exposure Index 2: ### +[MakerNotes, Qualcomm, Camera] asf5_max_exposure_index - ASF5 Max Exposure Index: ### +[MakerNotes, Samsung, Other] 0x0100-name - Embedded Audio File Name: SoundShot_### +[MakerNotes, Samsung, Audio] 0x0100 - Embedded Audio File: (Binary data 16 bytes) +[APP0, AVI1, Image] 0 - Interleaved Field: Not_Interleaved +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool_#.## +[XMP, XMP-rdf, Document] about - About: uuid:#####b##-####-fa##-####-#f#ed##cd##d +[XMP, XMP-dc, Author] creator - Creator: Phil_Harvey +[XMP, XMP-dc, Image] description - Description: UTF-##_(big-endian)_encoded_XMP +[XMP, XMP-dc, Author] rights - Rights: Copyright_####_Phil_Harvey +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP +[XMP, XMP-dc, Image] title - Title: Test_IPTC_picture +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: My_Position +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: I_wrote_it +[XMP, XMP-photoshop, Image] Category - Category: # +[XMP, XMP-photoshop, Location] City - City: Kingston +[XMP, XMP-photoshop, Location] Country - Country: Canada +[XMP, XMP-photoshop, Author] Credit - Credit: My_Credit +[XMP, XMP-photoshop, Time] DateCreated - Date Created: ####:##:## +[XMP, XMP-photoshop, Image] Headline - Headline: No_headline +[XMP, XMP-photoshop, Image] Instructions - Instructions: What_instructions +[XMP, XMP-photoshop, Author] Source - Source: I'm_the_source +[XMP, XMP-photoshop, Location] State - State: Ont +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: amazing, image, utilities +[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: What_is_a_transmission_reference? +[XMP, XMP-photoshop, Image] Urgency - Urgency: #_(least_urgent) +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My_Job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:#cc#b###-##d#-##d#-#ac#-bb##c##f#d#a +[XMP, XMP-xmpRights, Author] Marked - Marked: False +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Adobe_Systems_Inc. +[ICC_Profile, ICC-header, Image] 8 - Profile Version: #.#.# +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display_Device_Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB_ +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ_ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: ####:##:##_##:##:## +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Apple_Computer_Inc. +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not_Embedded,_Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: none +[ICC_Profile, ICC-header, Image] 52 - Device Model: +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective,_Glossy,_Positive,_Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: #.####_#_#.##### +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: Adobe_Systems_Inc. +[ICC_Profile, ICC-header, Image] 84 - Profile ID: # +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Copyright_####_Adobe_Systems_Incorporated +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: Adobe_RGB_(####) +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: #.#####_#_#.##### +[ICC_Profile, ICC_Profile, Image] bkpt - Media Black Point: #_#_# +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: #.#####_#.#####_#.##### +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: #.#####_#.#####_#.##### +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: #.#####_#.#####_#.##### +[FlashPix, FlashPix, Other] 1 - Code Page: Unicode_UTF-##,_little_endian +[FlashPix, FlashPix, Other] 268435456 - Used Extension Numbers: # +[FlashPix, FlashPix, Other] 1 - Extension Name: Screen_nail +[FlashPix, FlashPix, Other] 2 - Extension Class ID: ########-#FC#-##D#-BD##-########A### +[FlashPix, FlashPix, Other] 3 - Extension Persistence: Invalidated_By_Modification +[FlashPix, FlashPix, Time] 4 - Extension Create Date: ####:##:##_##:##:## +[FlashPix, FlashPix, Time] 5 - Extension Modify Date: ####:##:##_##:##:## +[FlashPix, FlashPix, Other] 6 - Creating Application: Digita +[FlashPix, FlashPix, Other] 7 - Extension Description: Presized_image_for_LCD_display +[FlashPix, FlashPix, Other] 4096 - Storage-Stream Pathname: /.Screen_Nail_bd##########a### +[FlashPix, FlashPix, Other] Screen Nail - Screen Nail: (Binary data 5917 bytes) +[FlashPix, FlashPix, Preview] FlashPix-PreviewImage - Preview Image: (Binary data 5777 bytes) +[MPF, MPF0, Image] 45056 - MPF Version: #### +[MPF, MPF0, Image] 45057 - Number Of Images: # +[MPF, MPImage1, Image] 0.1 - MP Image Flags: Dependent_parent_image +[MPF, MPImage1, Image] 0.2 - MP Image Format: JPEG +[MPF, MPImage1, Image] 0.3 - MP Image Type: Baseline_MP_Primary_Image +[MPF, MPImage1, Image] 4 - MP Image Length: ####### +[MPF, MPImage1, Image] 8 - MP Image Start: # +[MPF, MPImage1, Image] 12 - Dependent Image 1 Entry Number: # +[MPF, MPImage1, Image] 14 - Dependent Image 2 Entry Number: # +[MPF, MPImage2, Image] 0.1 - MP Image Flags: Dependent_child_image +[MPF, MPImage2, Image] 0.2 - MP Image Format: JPEG +[MPF, MPImage2, Image] 0.3 - MP Image Type: Large_Thumbnail_(full_HD_equivalent) +[MPF, MPImage2, Image] 4 - MP Image Length: ####### +[MPF, MPImage2, Image] 8 - MP Image Start: ####### +[MPF, MPImage2, Image] 12 - Dependent Image 1 Entry Number: # +[MPF, MPImage2, Image] 14 - Dependent Image 2 Entry Number: # +[MPF, MPImage2, Preview] PreviewImage - Preview Image: (Binary data 25 bytes) +[Meta, MetaIFD, Image] 50000 - Film Product Code: ## +[Meta, MetaIFD, Image] 50001 - Image Source EK: # +[Meta, MetaIFD, Image] 50002 - Capture Conditions PAR: # +[Meta, MetaIFD, Image] 50009 - Frame Number: # +[Meta, MetaIFD, Image] 50010 - Film Category: # +[Meta, MetaIFD, Image] 50011 - Film Gencode: # +[Meta, MetaIFD, Image] 50012 - Model And Version: Version_# +[Meta, MetaIFD, Image] 50013 - Film Size: # +[Meta, MetaIFD, Image] 50014 - SBA RGB Shifts: #_#_# +[Meta, MetaIFD, Image] 50015 - SBA Input Image Colorspace: # +[Meta, MetaIFD, Image] 50016 - SBA Input Image Bit Depth: ##_##_## +[Meta, MetaIFD, Image] 50017 - SBA Exposure Record: (Binary data 368 bytes) +[Meta, MetaIFD, Image] 50018 - User Adj SBA RGB Shifts: (Binary data 5 bytes) +[Meta, MetaIFD, Image] 50019 - Image Rotation Status: # +[Meta, MetaIFD, Image] 50020 - Roll Guid Elements: ################################ +[Meta, MetaIFD, Image] 50021 - Metadata Number: #### +[APP5, RMETA, Image] Sign type - Sign Type: Information +[APP5, RMETA, Image] Location - Location: Roundabout +[APP5, RMETA, Image] Lit - Lit: No +[APP5, RMETA, Image] Condition - Condition: Good +[APP5, RMETA, Image] Azimuth - Azimuth: E +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: #### +[APP6, NITF, Image] 0 - NITF Version: #.## +[APP6, NITF, Image] 2 - Image Format: IMode_B +[APP6, NITF, Image] 3 - Blocks Per Row: # +[APP6, NITF, Image] 5 - Blocks Per Column: # +[APP6, NITF, Image] 7 - Image Color: Monochrome +[APP6, NITF, Image] 8 - Bit Depth: # +[APP6, NITF, Image] 9 - Image Class: General_Purpose +[APP6, NITF, Image] 10 - JPEG Process: Baseline_sequential_DCT,_Huffman_coding,_#-bit_samples +[APP6, NITF, Image] 11 - Quality: # +[APP6, NITF, Image] 12 - Stream Color: Monochrome +[APP6, NITF, Image] 13 - Stream Bit Depth: # +[APP6, NITF, Image] 14 - Flags: #x####### +[XML, MediaJukebox, Image] Tool_Name - Tool Name: Media_Center +[XML, MediaJukebox, Image] Tool_Version - Tool Version: ##.#.## +[XML, MediaJukebox, Image] People - People: Santa +[XML, MediaJukebox, Image] Places - Places: Jamaica +[XML, MediaJukebox, Time] Date - Date: ####:##:##_##:##:## +[XML, MediaJukebox, Image] Album - Album: ####-##-## +[XML, MediaJukebox, Image] Name - Name: Glass_home_at_night +[APP11, JPEG-HDR, Image] ver - JPEG-HDR Version: ## +[APP11, JPEG-HDR, Image] ln0 - Ln0: #.###### +[APP11, JPEG-HDR, Image] ln1 - Ln1: #.###### +[APP11, JPEG-HDR, Image] s2n - S2n: #.######e+## +[APP11, JPEG-HDR, Image] alp - Alpha: #.###### +[APP11, JPEG-HDR, Image] bet - Beta: #.###### +[APP11, JPEG-HDR, Image] cor - Correction Method: # +[APP11, JPEG-HDR, Preview] RatioImage - Ratio Image: (Binary data 19 bytes) +[JUMBF, JUMBF, Image] type - JUMD Type: (cacb)-####-####-######aa#####b## +[JUMBF, JUMBF, Image] label - JUMD Label: cai +[JUMBF, JUMBF, Image] type - JUMD Type: (cast)-####-####-######aa#####b## +[JUMBF, JUMBF, Image] label - JUMD Label: cb.reuters_# +[JUMBF, JUMBF, Image] type - JUMD Type: (caas)-####-####-######aa#####b## +[JUMBF, JUMBF, Image] label - JUMD Label: cai.assertions +[JUMBF, JUMBF, Image] type - JUMD Type: (json)-####-####-######aa#####b## +[JUMBF, JUMBF, Image] label - JUMD Label: adobe.asset.info +[JUMBF, JSON, Other] title - Title: HEALTHCORONAVIRUSUSAOREGON_SALEM_##.jpg +[JUMBF, JUMBF, Image] type - JUMD Type: (json)-####-####-######aa#####b## +[JUMBF, JUMBF, Image] label - JUMD Label: cai.location.broad +[JUMBF, JSON, Other] location - Location: Salem,_Oregon +[JUMBF, JUMBF, Image] type - JUMD Type: (json)-####-####-######aa#####b## +[JUMBF, JUMBF, Image] label - JUMD Label: cai.rights +[JUMBF, JSON, Other] copyright - Copyright: Alisha_Jucevic +[APP12, PictureInfo, Time] TimeDate - Date/Time Original: ####:##:##_##:##:## +[APP12, PictureInfo, Image] Shutter - Exposure Time: #/### +[APP12, PictureInfo, Image] Flash - Flash: Off +[APP12, PictureInfo, Image] Resolution - Resolution: # +[APP12, PictureInfo, Image] Protect - Protect: # +[APP12, PictureInfo, Image] ContTake - Cont Take: # +[APP12, PictureInfo, Image] ImageSize - Image Size: ####x### +[APP12, PictureInfo, Image] ColorMode - Color Mode: # +[APP12, PictureInfo, Image] FNumber - F Number: ##.# +[APP12, PictureInfo, Image] Zoom - Zoom: #.# +[APP12, PictureInfo, Image] Macro - Macro: Off +[APP12, PictureInfo, Image] LightS - Light S: # +[APP12, PictureInfo, Image] ExpBias - Exposure Compensation: +#.# +[APP12, PictureInfo, Camera] Type - Camera Type: SR## +[APP12, PictureInfo, Camera] Serial# - Serial Number: ######### +[APP12, PictureInfo, Camera] Version - Version: v##-## +[APP12, PictureInfo, Camera] ID - ID: AGFA_DIGITAL_CAMERA +[APP12, PictureInfo, Image] PicLen - Pic Len: ###### +[APP12, PictureInfo, Image] ThmLen - Thm Len: #### +[APP12, PictureInfo, Image] Q - Tag Q: ## +[APP12, PictureInfo, Image] R - Tag R: ### +[APP12, PictureInfo, Image] B - Tag B: ### +[APP12, PictureInfo, Image] s0 - S0: #e#,#,##b#,#f##,##cf,####,####,#######,a#e####,#,#f####d,#f###c#,#######,#,# +[APP12, PictureInfo, Image] T0 - T0: ##b#####,#######,e##c#f,#,#,# +[Ducky, Ducky, Image] 1 - Quality: ##% +[Ducky, Ducky, Author] 3 - Copyright: Copyright_####_Phil_Harvey +[IPTC, IPTC, Other] 0 - Application Record Version: # +[IPTC, IPTC, Other] 120 - Caption-Abstract: A_witty_caption +[IPTC, IPTC, Author] 122 - Writer-Editor: I_wrote_it +[IPTC, IPTC, Other] 105 - Headline: No_headline +[IPTC, IPTC, Other] 40 - Special Instructions: What_instructions +[IPTC, IPTC, Author] 80 - By-line: Phil_Harvey +[IPTC, IPTC, Author] 85 - By-line Title: My_Position +[IPTC, IPTC, Author] 110 - Credit: My_Credit +[IPTC, IPTC, Other] 5 - Object Name: Test_IPTC_picture +[IPTC, IPTC, Time] 55 - Date Created: ####:##:## +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ont +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 103 - Original Transmission Reference: What_is_a_transmission_reference +[IPTC, IPTC, Other] 15 - Category: # +[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing, image, utilities +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright_####_Phil_Harvey +[IPTC, IPTC, Other] 10 - Urgency: #_(least_urgent) +[IPTC, IPTC, Author] 115 - Source: I'm_the_source +[IPTC, IPTC, Other] 25 - Keywords: jambalaya +[IPTC, IPTC2, Other] 0 - Application Record Version: # +[IPTC, IPTC3, Other] 0 - Application Record Version: # +[IPTC, IPTC3, Other] 15 - Category: p +[IPTC, IPTC3, Time] 55 - Date Created: ####:##:## +[IPTC, IPTC3, Other] 5 - Object Name: object_name +[IPTC, IPTC3, Other] 10 - Urgency: # +[IPTC, IPTC3, Other] 20 - Supplemental Categories: supp_cat +[IPTC, IPTC3, Other] 40 - Special Instructions: special_instructions +[IPTC, IPTC3, Author] 80 - By-line: byline +[IPTC, IPTC3, Author] 85 - By-line Title: byline_title +[IPTC, IPTC3, Location] 90 - City: city +[IPTC, IPTC3, Location] 101 - Country-Primary Location Name: country_name +[IPTC, IPTC3, Other] 103 - Original Transmission Reference: otr +[IPTC, IPTC3, Other] 105 - Headline: headline +[IPTC, IPTC3, Author] 110 - Credit: credit +[IPTC, IPTC3, Author] 115 - Source: source +[IPTC, IPTC3, Author] 116 - Copyright Notice: copy_freely +[IPTC, IPTC3, Other] 120 - Caption-Abstract: ExifTool_AFCP_test +[IPTC, IPTC3, Author] 122 - Writer-Editor: caption_writer +[IPTC, IPTC3, Location] 95 - Province-State: state +[IPTC, IPTC3, Other] 25 - Keywords: jambalaya +[Photoshop, Photoshop, Image] 1061 - IPTC Digest: ##ad####b#a##f#f####ac###fa###da +[Photoshop, Photoshop, Image] 0 - X Resolution: ## +[Photoshop, Photoshop, Image] 2 - Displayed Units X: inches +[Photoshop, Photoshop, Image] 4 - Y Resolution: ## +[Photoshop, Photoshop, Image] 6 - Displayed Units Y: inches +[Photoshop, Photoshop, Image] 0 - Print Style: Centered +[Photoshop, Photoshop, Image] 2 - Print Position: #_# +[Photoshop, Photoshop, Image] 10 - Print Scale: # +[Photoshop, Photoshop, Image] 1037 - Global Angle: ## +[Photoshop, Photoshop, Image] 1049 - Global Altitude: ## +[Photoshop, Photoshop, Author] 1034 - Copyright Flag: False +[Photoshop, Photoshop, Author] 1035 - URL: https://exiftool.org/____________________ +[Photoshop, Photoshop, Image] 1054 - URL List: +[Photoshop, Photoshop, Other] 20 - Slices Group Name: IPTC +[Photoshop, Photoshop, Other] 24 - Num Slices: # +[Photoshop, Photoshop, Image] 4 - Has Real Merged Data: Yes +[Photoshop, Photoshop, Image] 5 - Writer Name: Adobe_Photoshop +[Photoshop, Photoshop, Image] 9 - Reader Name: Adobe_Photoshop_#.# +[Photoshop, Photoshop, Image] 0 - Photoshop Quality: # +[Photoshop, Photoshop, Image] 1 - Photoshop Format: Standard +[Photoshop, Photoshop, Image] 2 - Progressive Scans: #_Scans +[ExifTool, ExifTool, ExifTool] Warning - Warning: IPTCDigest_is_not_current._XMP_may_be_out_of_sync +[APP13, AdobeCM, Image] 0 - Adobe CM Type: # +[APP14, Adobe, Image] 0 - DCT Encode Version: ### +[APP14, Adobe, Image] 1 - APP14 Flags 0: (none) +[APP14, Adobe, Image] 2 - APP14 Flags 1: (none) +[APP14, Adobe, Image] 3 - Color Transform: YCbCr +[APP15, GraphConv, Image] Q - Quality: ## +[MIE, MIE-Doc, Author] Copyright - Copyright: ©_####_Phil_Harvey +[MIE, MIE-Main, Other] zmie - Trailer Signature: +[PhotoMechanic, PhotoMechanic, Image] 221 - Tagged: Yes +[PhotoMechanic, PhotoMechanic, Image] 222 - Color Class: #_(Typical_alt) +[PhotoMechanic, PhotoMechanic, Image] 216 - Rotation: ### +[PhotoMechanic, PhotoMechanic, Image] 217 - Crop Left: ### +[PhotoMechanic, PhotoMechanic, Image] 218 - Crop Top: ### +[PhotoMechanic, PhotoMechanic, Image] 219 - Crop Right: ### +[PhotoMechanic, PhotoMechanic, Image] 220 - Crop Bottom: #### +[CanonVRD, CanonVRD, Image] 2 - VRD Version: #.#.# +[CanonVRD, CanonVRD, Image] 6 - WB Adj RGGB Levels: #_#_#_# +[CanonVRD, CanonVRD, Image] 24 - White Balance Adj: Shot_Settings +[CanonVRD, CanonVRD, Image] 26 - WB Adj Color Temp: #### +[CanonVRD, CanonVRD, Image] 36 - WB Fine Tune Active: No +[CanonVRD, CanonVRD, Image] 40 - WB Fine Tune Saturation: # +[CanonVRD, CanonVRD, Image] 44 - WB Fine Tune Tone: # +[CanonVRD, CanonVRD, Image] 46 - Raw Color Adj: Shot_Settings +[CanonVRD, CanonVRD, Image] 48 - Raw Custom Saturation: # +[CanonVRD, CanonVRD, Image] 52 - Raw Custom Tone: # +[CanonVRD, CanonVRD, Image] 56 - Raw Brightness Adj: #.## +[CanonVRD, CanonVRD, Image] 60 - Tone Curve Property: Shot_Settings +[CanonVRD, CanonVRD, Image] 122 - Dynamic Range Min: # +[CanonVRD, CanonVRD, Image] 124 - Dynamic Range Max: #### +[CanonVRD, CanonVRD, Image] 272 - Tone Curve Active: No +[CanonVRD, CanonVRD, Image] 275 - Tone Curve Mode: RGB +[CanonVRD, CanonVRD, Image] 276 - Brightness Adj: # +[CanonVRD, CanonVRD, Image] 277 - Contrast Adj: # +[CanonVRD, CanonVRD, Image] 278 - Saturation Adj: ### +[CanonVRD, CanonVRD, Image] 286 - Color Tone Adj: # +[CanonVRD, CanonVRD, Image] 294 - Luminance Curve Points: (#,#)_(###,###) +[CanonVRD, CanonVRD, Image] 336 - Luminance Curve Limits: ###_#_###_# +[CanonVRD, CanonVRD, Image] 345 - Tone Curve Interpolation: Curve +[CanonVRD, CanonVRD, Image] 352 - Red Curve Points: (#,#)_(###,###) +[CanonVRD, CanonVRD, Image] 394 - Red Curve Limits: ###_#_###_# +[CanonVRD, CanonVRD, Image] 410 - Green Curve Points: (#,#)_(###,###) +[CanonVRD, CanonVRD, Image] 452 - Green Curve Limits: ###_#_###_# +[CanonVRD, CanonVRD, Image] 468 - Blue Curve Points: (#,#)_(###,###) +[CanonVRD, CanonVRD, Image] 510 - Blue Curve Limits: ###_#_###_# +[CanonVRD, CanonVRD, Image] 526 - RGB Curve Points: (#,#)_(###,###) +[CanonVRD, CanonVRD, Image] 568 - RGB Curve Limits: ###_#_###_# +[CanonVRD, CanonVRD, Image] 580 - Crop Active: No +[CanonVRD, CanonVRD, Image] 582 - Crop Left: # +[CanonVRD, CanonVRD, Image] 584 - Crop Top: # +[CanonVRD, CanonVRD, Image] 586 - Crop Width: # +[CanonVRD, CanonVRD, Image] 588 - Crop Height: # +[CanonVRD, CanonVRD, Image] 602 - Sharpness Adj: # +[CanonVRD, CanonVRD, Image] 608 - Crop Aspect Ratio: Free +[CanonVRD, CanonVRD, Image] 610 - Constrained Crop Width: # +[CanonVRD, CanonVRD, Image] 614 - Constrained Crop Height: # +[CanonVRD, CanonVRD, Image] 618 - Check Mark: Clear +[CanonVRD, CanonVRD, Image] 622 - Rotation: ## +[CanonVRD, CanonVRD, Image] 624 - Work Color Space: sRGB +[FotoStation, FotoStation, Image] 0 - Original Image Width: ## +[FotoStation, FotoStation, Image] 1 - Original Image Height: ## +[FotoStation, FotoStation, Image] 2 - Color Planes: # +[FotoStation, FotoStation, Image] 3 - XY Resolution: # +[FotoStation, FotoStation, Image] 4 - Rotation: # +[FotoStation, FotoStation, Image] 6 - Crop Left: ##.###% +[FotoStation, FotoStation, Image] 7 - Crop Top: ##.##% +[FotoStation, FotoStation, Image] 8 - Crop Right: ##.###% +[FotoStation, FotoStation, Image] 9 - Crop Bottom: ##.##% +[FotoStation, FotoStation, Image] 11 - Crop Rotation: # +[Composite, Composite, Image] Exif-Aperture - Aperture: #.# +[Composite, Composite, Image] Exif-ImageSize - Image Size: #x# +[Composite, Composite, Image] Exif-Megapixels - Megapixels: #.###### +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: #/### +[Composite, Composite, Image] Exif-LightValue - Light Value: ##.# +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: #.# +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: #.###_mm +[Composite, Composite, Image] Exif-FOV - Field Of View: ##.#_deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: #.#_mm_(##_mm_equivalent:_##.#_mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: #.##_m diff --git a/t/ExifTool_3.out b/t/ExifTool_3.out new file mode 100644 index 0000000..ce37561 --- /dev/null +++ b/t/ExifTool_3.out @@ -0,0 +1,89 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileSize - File Size: 4.9 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2005:11:23 15:49:37-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:34-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: TIFF +[File, File, Other] FileTypeExtension - File Type Extension: tif +[File, File, Other] MIMEType - MIME Type: image/tiff +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 82a5301def77e837ceb56158abd65512 +[EXIF, IFD0, Image] 254 - Subfile Type: Full-resolution image +[EXIF, IFD0, Image] 256 - Image Width: 160 +[EXIF, IFD0, Image] 257 - Image Height: 120 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD0, Image] 259 - Compression: LZW +[EXIF, IFD0, Image] 262 - Photometric Interpretation: RGB +[EXIF, IFD0, Image] 270 - Image Description: The picture caption +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS DIGITAL REBEL +[EXIF, IFD0, Image] 273 - Strip Offsets: 3816 +[EXIF, IFD0, Image] 277 - Samples Per Pixel: 3 +[EXIF, IFD0, Image] 278 - Rows Per Strip: 120 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 1048 +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 284 - Planar Configuration: Chunky +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: GraphicConverter +[EXIF, IFD0, Time] 306 - Modify Date: 2004:02:20 08:07:49 +[EXIF, IFD0, Image] 317 - Predictor: None +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: The picture caption +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it +[IPTC, IPTC, Other] 40 - Special Instructions: no instructions +[IPTC, IPTC, Author] 80 - By-line: I'm the author +[IPTC, IPTC, Author] 85 - By-line Title: On top +[IPTC, IPTC, Author] 110 - Credit: Phil Harvey +[IPTC, IPTC, Author] 115 - Source: My camera +[IPTC, IPTC, Other] 5 - Object Name: This is the title +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:20 +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ontario +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 103 - Original Transmission Reference: no reference +[IPTC, IPTC, Other] 25 - Keywords: exiftool, test, picture +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright notice +[IPTC, IPTC, Other] 105 - Headline: headline +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Linotronic +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.1.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1998:02:09 06:49:00 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Microsoft Corporation +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: Hewlett-Packard +[ICC_Profile, ICC-header, Image] 52 - Device Model: sRGB +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: Hewlett-Packard +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Copyright (c) 1998 Hewlett-Packard Company +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: sRGB IEC61966-2.1 +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.95045 1 1.08905 +[ICC_Profile, ICC_Profile, Image] bkpt - Media Black Point: 0 0 0 +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.43607 0.22249 0.01392 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.38515 0.71687 0.09708 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.14307 0.06061 0.7141 +[ICC_Profile, ICC_Profile, Camera] dmnd - Device Mfg Desc: IEC http://www.iec.ch +[ICC_Profile, ICC_Profile, Camera] dmdd - Device Model Desc: IEC 61966-2.1 Default RGB colour space - sRGB +[ICC_Profile, ICC_Profile, Image] vued - Viewing Cond Desc: Reference Viewing Condition in IEC61966-2.1 +[ICC_Profile, ICC-view, Image] 8 - Viewing Cond Illuminant: 19.6445 20.3718 16.8089 +[ICC_Profile, ICC-view, Image] 20 - Viewing Cond Surround: 3.92889 4.07439 3.36179 +[ICC_Profile, ICC-view, Image] 32 - Viewing Cond Illuminant Type: D50 +[ICC_Profile, ICC_Profile, Image] lumi - Luminance: 76.03647 80 87.12462 +[ICC_Profile, ICC-meas, Image] 8 - Measurement Observer: CIE 1931 +[ICC_Profile, ICC-meas, Image] 12 - Measurement Backing: 0 0 0 +[ICC_Profile, ICC-meas, Image] 24 - Measurement Geometry: Unknown +[ICC_Profile, ICC-meas, Image] 28 - Measurement Flare: 0.999% +[ICC_Profile, ICC-meas, Image] 32 - Measurement Illuminant: D65 +[ICC_Profile, ICC_Profile, Image] tech - Technology: Cathode Ray Tube Display +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 2060 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 2060 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 2060 bytes) +[Composite, Composite, Image] Exif-ImageSize - Image Size: 160x120 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.019 diff --git a/t/ExifTool_30.out b/t/ExifTool_30.out new file mode 100644 index 0000000..5460f10 --- /dev/null +++ b/t/ExifTool_30.out @@ -0,0 +1,2 @@ +[File, File, Image] JPEGQualityEstimate - JPEG Quality Estimate: 61 +[File, File, Image] JPEGDigest - JPEG Digest: Adobe Photoshop, Save for web, Quality 10 diff --git a/t/ExifTool_31.out b/t/ExifTool_31.out new file mode 100644 index 0000000..c64c67a --- /dev/null +++ b/t/ExifTool_31.out @@ -0,0 +1 @@ +[ExifTool, ExifTool, ExifTool] Validate - Validate: OK diff --git a/t/ExifTool_32.out b/t/ExifTool_32.out new file mode 100644 index 0000000..8fdf640 --- /dev/null +++ b/t/ExifTool_32.out @@ -0,0 +1,5 @@ +[APP3, JPS, Image] 10 - JPS Separation: 0 +[APP3, JPS, Image] 11 - JPS Flags: Left field first +[APP3, JPS, Image] 12 - JPS Layout: Over Under +[APP3, JPS, Image] 13 - JPS Type: Stereo +[APP3, JPS, Image] 16 - JPS Comment: test comment diff --git a/t/ExifTool_4.out b/t/ExifTool_4.out new file mode 100644 index 0000000..aa65ad6 --- /dev/null +++ b/t/ExifTool_4.out @@ -0,0 +1,41 @@ +ApertureValue: 14.0 +ColorSpace: sRGB +ComponentsConfiguration: Y, Cb, Cr, - +CompressedBitsPerPixel: 9 +CreateDate: 2003:12:04 06:46:52 +CustomRendered: Normal +DateTimeOriginal: 2003:12:04 06:46:52 +ExifImageHeight: 120 +ExifImageWidth: 160 +ExifVersion: 0221 +ExposureCompensation (1): 0 +ExposureMode: Manual +ExposureTime: 4 +FNumber: 14.0 +FileSource: Digital Camera +Flash: No Flash +FlashpixVersion: 0100 +FocalLength: 34.0 mm +FocalPlaneResolutionUnit: inches +FocalPlaneXResolution: 3443.946188 +FocalPlaneYResolution: 3442.016807 +ISO: 100 +InteropIndex: THM - DCF thumbnail file +InteropVersion: 0100 +Make: Canon +MaxApertureValue: 4.5 +MeteringMode (1): Average +Model: Canon EOS DIGITAL REBEL +ModifyDate: 2003:12:04 06:46:52 +Orientation: Horizontal (normal) +RelatedImageHeight: 2048 +RelatedImageWidth: 3072 +ResolutionUnit: inches +SceneCaptureType: Standard +SensingMethod: One-chip color area +ShutterSpeedValue: 0 +UserComment: +WhiteBalance (1): Auto +XResolution: 180 +YCbCrPositioning: Centered +YResolution: 180 diff --git a/t/ExifTool_5.out b/t/ExifTool_5.out new file mode 100644 index 0000000..8d70973 --- /dev/null +++ b/t/ExifTool_5.out @@ -0,0 +1,6 @@ +[EXIF, IFD0, Image] 274 - Orientation: 1 +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:12:04 06:46:52 diff --git a/t/ExifTool_6.out b/t/ExifTool_6.out new file mode 100644 index 0000000..91a58e3 --- /dev/null +++ b/t/ExifTool_6.out @@ -0,0 +1,71 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Canon.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:10:03 15:10:31-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:04-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS DIGITAL REBEL +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:04 06:46:52 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 4 +[EXIF, ExifIFD, Image] 33437 - F Number: 14.0 +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 9 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 0 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 14.0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 4.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Average +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 34.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 160 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 120 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: THM - DCF thumbnail file +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, InteropIFD, Image] 4097 - Related Image Width: 3072 +[EXIF, InteropIFD, Image] 4098 - Related Image Height: 2048 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[Composite, Composite, Camera] Canon-DriveMode - Drive Mode: Continuous Shooting +[Composite, Composite, Camera] Canon-ISO - ISO: 100 +[Composite, Composite, Camera] Canon-Lens - Lens: 18.0 - 55.0 mm +[Composite, Composite, Camera] Canon-ShootingMode - Shooting Mode: Bulb +[Composite, Composite, Camera] Canon-WB_RGGBLevels - WB RGGB Levels: 1719 832 831 990 +[Composite, Composite, Image] Exif-Aperture - Aperture: 14.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Unknown 18-55mm +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.6 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 4 +[Composite, Composite, Camera] Canon-Lens35efl - Lens: 18.0 - 55.0 mm (35 mm equivalent: 28.6 - 87.4 mm) +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.190619 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.019 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: inf (4.31 m - inf) +[Composite, Composite, Image] Exif-FOV - Field Of View: 36.9 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 34.0 mm (35 mm equivalent: 54.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 4.37 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 5.6 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 2.067348 diff --git a/t/ExifTool_7.out b/t/ExifTool_7.out new file mode 100644 index 0000000..83f17b5 --- /dev/null +++ b/t/ExifTool_7.out @@ -0,0 +1,126 @@ +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS DIGITAL REBEL +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:04 06:46:52 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 9 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 0 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 14.0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 4.5 +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 160 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 120 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: THM - DCF thumbnail file +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, InteropIFD, Image] 4097 - Related Image Width: 3072 +[EXIF, InteropIFD, Image] 4098 - Related Image Height: 2048 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3443.946188 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3442.016807 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[MakerNotes, Canon, Camera] 1 - Macro Mode: Unknown (0) +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Continuous +[MakerNotes, Canon, Camera] 7 - Focus Mode: Manual Focus (3) +[MakerNotes, Canon, Camera] 9 - Record Mode: CRW+THM +[MakerNotes, Canon, Camera] 10 - Canon Image Size: Large +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: Unknown (-1) +[MakerNotes, Canon, Camera] 13 - Contrast: +1 +[MakerNotes, Canon, Camera] 14 - Saturation: +1 +[MakerNotes, Canon, Camera] 15 - Sharpness: +1 +[MakerNotes, Canon, Camera] 16 - Camera ISO: n/a +[MakerNotes, Canon, Camera] 17 - Metering Mode: Center-weighted average +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Manual +[MakerNotes, Canon, Camera] 22 - Lens Type: n/a +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 55 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 18 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 4 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 27 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: (none) +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 3072 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 3072 +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, Canon, Image] 1 - Focal Length: 34 mm +[MakerNotes, Canon, Image] 2 - Focal Plane X Size: 23.22 mm +[MakerNotes, Canon, Image] 3 - Focal Plane Y Size: 15.49 mm +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 100 +[MakerNotes, Canon, Image] 3 - Measured EV: -1.25 +[MakerNotes, Canon, Image] 4 - Target Aperture: 14 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 19 - Focus Distance Upper: inf +[MakerNotes, Canon, Image] 20 - Focus Distance Lower: 5.46 m +[MakerNotes, Canon, Image] 21 - F Number: 14 +[MakerNotes, Canon, Image] 22 - Exposure Time: 128 +[MakerNotes, Canon, Image] 23 - Measured EV 2: -1.25 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 4 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS Mid-range +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 29 - Self Timer 2: 0 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Image] 6 - Canon Image Type: CRW:EOS DIGITAL REBEL CMOS RAW +[MakerNotes, Canon, Camera] 7 - Canon Firmware Version: Firmware Version 1.1.1 +[MakerNotes, Canon, Camera] 12 - Serial Number: 0560018150 +[MakerNotes, Canon, Camera] 21 - Serial Number Format: Format 1 +[MakerNotes, Canon, Image] 8 - File Number: 118-1861 +[MakerNotes, Canon, Camera] 9 - Owner Name: Phil Harvey +[MakerNotes, Canon, Camera] 16 - Canon Model ID: EOS Digital Rebel / 300D / Kiss Digital +[MakerNotes, Canon, Image] 14 - Canon File Length: 4480822 +[MakerNotes, Canon, Camera] 1 - Measured RGGB: 998 1022 1026 808 +[MakerNotes, Canon, Camera] 1 - WB RGGB Levels Auto: 1719 832 831 990 +[MakerNotes, Canon, Camera] 5 - WB RGGB Levels Daylight: 1722 832 831 989 +[MakerNotes, Canon, Camera] 9 - WB RGGB Levels Shade: 2035 832 831 839 +[MakerNotes, Canon, Camera] 13 - WB RGGB Levels Cloudy: 1878 832 831 903 +[MakerNotes, Canon, Camera] 17 - WB RGGB Levels Tungsten: 1228 913 912 1668 +[MakerNotes, Canon, Camera] 21 - WB RGGB Levels Fluorescent: 1506 842 841 1381 +[MakerNotes, Canon, Camera] 25 - WB RGGB Levels Flash: 1933 832 831 895 +[MakerNotes, Canon, Camera] 29 - WB RGGB Levels Custom: 1722 832 831 989 +[MakerNotes, Canon, Camera] 33 - WB RGGB Levels Kelvin: 1722 832 831 988 +[MakerNotes, Canon, Camera] 37 - WB RGGB Black Levels: 124 123 124 123 +[MakerNotes, Canon, Camera] 174 - Color Temperature: 5200 +[MakerNotes, Canon, Camera] 180 - Color Space: sRGB +[MakerNotes, Canon, Camera] 0 - Num AF Points: 7 +[MakerNotes, Canon, Camera] 1 - Valid AF Points: 7 +[MakerNotes, Canon, Image] 2 - Canon Image Width: 3072 +[MakerNotes, Canon, Image] 3 - Canon Image Height: 2048 +[MakerNotes, Canon, Camera] 4 - AF Image Width: 3072 +[MakerNotes, Canon, Camera] 5 - AF Image Height: 2048 +[MakerNotes, Canon, Camera] 6 - AF Area Width: 151 +[MakerNotes, Canon, Camera] 7 - AF Area Height: 151 +[MakerNotes, Canon, Camera] 8 - AF Area X Positions: 1014 608 0 0 0 -608 -1014 +[MakerNotes, Canon, Camera] 9 - AF Area Y Positions: 0 0 -506 0 506 0 0 +[MakerNotes, Canon, Camera] 10 - AF Points In Focus: (none) +[MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 7 112 diff --git a/t/ExifTool_8.out b/t/ExifTool_8.out new file mode 100644 index 0000000..4b9ac7c --- /dev/null +++ b/t/ExifTool_8.out @@ -0,0 +1,126 @@ +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS DIGITAL REBEL +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:04 06:46:52 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 4 +[EXIF, ExifIFD, Image] 33437 - F Number: 14.0 +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 9 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 0 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 14.0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 4.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Average +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 34.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 160 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 120 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: THM - DCF thumbnail file +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, InteropIFD, Image] 4097 - Related Image Width: 3072 +[EXIF, InteropIFD, Image] 4098 - Related Image Height: 2048 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3443.946188 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3442.016807 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[MakerNotes, Canon, Camera] 1 - Macro Mode: Unknown (0) +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Continuous +[MakerNotes, Canon, Camera] 7 - Focus Mode: Manual Focus (3) +[MakerNotes, Canon, Camera] 9 - Record Mode: CRW+THM +[MakerNotes, Canon, Camera] 10 - Canon Image Size: Large +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: Unknown (-1) +[MakerNotes, Canon, Camera] 13 - Contrast: +1 +[MakerNotes, Canon, Camera] 14 - Saturation: +1 +[MakerNotes, Canon, Camera] 15 - Sharpness: +1 +[MakerNotes, Canon, Camera] 16 - Camera ISO: n/a +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Manual +[MakerNotes, Canon, Camera] 22 - Lens Type: n/a +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 55 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 18 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 4 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 27 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: (none) +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 3072 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 3072 +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, Canon, Image] 2 - Focal Plane X Size: 23.22 mm +[MakerNotes, Canon, Image] 3 - Focal Plane Y Size: 15.49 mm +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 100 +[MakerNotes, Canon, Image] 3 - Measured EV: -1.25 +[MakerNotes, Canon, Image] 4 - Target Aperture: 14 +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 19 - Focus Distance Upper: inf +[MakerNotes, Canon, Image] 20 - Focus Distance Lower: 5.46 m +[MakerNotes, Canon, Image] 23 - Measured EV 2: -1.25 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 4 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS Mid-range +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 29 - Self Timer 2: 0 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Image] 6 - Canon Image Type: CRW:EOS DIGITAL REBEL CMOS RAW +[MakerNotes, Canon, Camera] 7 - Canon Firmware Version: Firmware Version 1.1.1 +[MakerNotes, Canon, Camera] 12 - Serial Number: 0560018150 +[MakerNotes, Canon, Camera] 21 - Serial Number Format: Format 1 +[MakerNotes, Canon, Image] 8 - File Number: 118-1861 +[MakerNotes, Canon, Camera] 9 - Owner Name: Phil Harvey +[MakerNotes, Canon, Camera] 16 - Canon Model ID: EOS Digital Rebel / 300D / Kiss Digital +[MakerNotes, Canon, Image] 14 - Canon File Length: 4480822 +[MakerNotes, Canon, Camera] 1 - Measured RGGB: 998 1022 1026 808 +[MakerNotes, Canon, Camera] 1 - WB RGGB Levels Auto: 1719 832 831 990 +[MakerNotes, Canon, Camera] 5 - WB RGGB Levels Daylight: 1722 832 831 989 +[MakerNotes, Canon, Camera] 9 - WB RGGB Levels Shade: 2035 832 831 839 +[MakerNotes, Canon, Camera] 13 - WB RGGB Levels Cloudy: 1878 832 831 903 +[MakerNotes, Canon, Camera] 17 - WB RGGB Levels Tungsten: 1228 913 912 1668 +[MakerNotes, Canon, Camera] 21 - WB RGGB Levels Fluorescent: 1506 842 841 1381 +[MakerNotes, Canon, Camera] 25 - WB RGGB Levels Flash: 1933 832 831 895 +[MakerNotes, Canon, Camera] 29 - WB RGGB Levels Custom: 1722 832 831 989 +[MakerNotes, Canon, Camera] 33 - WB RGGB Levels Kelvin: 1722 832 831 988 +[MakerNotes, Canon, Camera] 37 - WB RGGB Black Levels: 124 123 124 123 +[MakerNotes, Canon, Camera] 174 - Color Temperature: 5200 +[MakerNotes, Canon, Camera] 0 - Num AF Points: 7 +[MakerNotes, Canon, Camera] 1 - Valid AF Points: 7 +[MakerNotes, Canon, Image] 2 - Canon Image Width: 3072 +[MakerNotes, Canon, Image] 3 - Canon Image Height: 2048 +[MakerNotes, Canon, Camera] 4 - AF Image Width: 3072 +[MakerNotes, Canon, Camera] 5 - AF Image Height: 2048 +[MakerNotes, Canon, Camera] 6 - AF Area Width: 151 +[MakerNotes, Canon, Camera] 7 - AF Area Height: 151 +[MakerNotes, Canon, Camera] 8 - AF Area X Positions: 1014 608 0 0 0 -608 -1014 +[MakerNotes, Canon, Camera] 9 - AF Area Y Positions: 0 0 -506 0 506 0 0 +[MakerNotes, Canon, Camera] 10 - AF Points In Focus: (none) +[MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 7 112 diff --git a/t/ExifTool_9.out b/t/ExifTool_9.out new file mode 100644 index 0000000..848690e --- /dev/null +++ b/t/ExifTool_9.out @@ -0,0 +1,33 @@ +[MakerNotes, Canon, Image] 1 - Focal Length: 34 mm +[MakerNotes, Canon, Image] 2 - Focal Plane X Size: 23.22 mm +[MakerNotes, Canon, Image] 3 - Focal Plane Y Size: 15.49 mm +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 100 +[MakerNotes, Canon, Image] 3 - Measured EV: -1.25 +[MakerNotes, Canon, Image] 4 - Target Aperture: 14 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 19 - Focus Distance Upper: inf +[MakerNotes, Canon, Image] 20 - Focus Distance Lower: 5.46 m +[MakerNotes, Canon, Image] 21 - F Number: 14 +[MakerNotes, Canon, Image] 22 - Exposure Time: 128 +[MakerNotes, Canon, Image] 23 - Measured EV 2: -1.25 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 4 +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 29 - Self Timer 2: 0 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Image] 6 - Canon Image Type: CRW:EOS DIGITAL REBEL CMOS RAW +[MakerNotes, Canon, Image] 8 - File Number: 118-1861 +[MakerNotes, Canon, Image] 14 - Canon File Length: 4480822 +[MakerNotes, Canon, Image] 2 - Canon Image Width: 3072 +[MakerNotes, Canon, Image] 3 - Canon Image Height: 2048 diff --git a/t/FITS.t b/t/FITS.t new file mode 100644 index 0000000..75d667d --- /dev/null +++ b/t/FITS.t @@ -0,0 +1,28 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/FITS.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::FITS; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'FITS'; +my $testnum = 1; + +# test 2: Extract information from an FITS file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/FITS.fits'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/FITS_2.out b/t/FITS_2.out new file mode 100644 index 0000000..6b1ded9 --- /dev/null +++ b/t/FITS_2.out @@ -0,0 +1,47 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: FITS.fits +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 3.0 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:03:07 12:31:28-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:35-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: FITS +[File, File, Other] FileTypeExtension - File Type Extension: fits +[File, File, Other] MIMEType - MIME Type: image/fits +[FITS, FITS, Image] BITPIX - Bitpix: 8 +[FITS, FITS, Image] NAXIS - Naxis: 0 +[FITS, FITS, Image] EXTEND - Extend: T +[FITS, FITS, Image] COMMENT - Comment: +------------------+ +[FITS, FITS, Image] COMMENT - Comment: | HEXTE INDEX | +[FITS, FITS, Image] COMMENT - Comment: | XTE - FITS File | +[FITS, FITS, Image] COMMENT - Comment: | Generated by XFF | +[FITS, FITS, Image] COMMENT - Comment: +------------------+ +[FITS, FITS, Image] ORIGIN - Origin: XTE-SOC +[FITS, FITS, Image] CREATOR - Creator: XFF - Revision: 5.3.2 +[FITS, FITS, Time] DATE - Create Date: 28/01/97 +[FITS, FITS, Time] DATE-OBS - Observation Date: 09/12/96 +[FITS, FITS, Time] TIME-OBS - Observation Time: 11:56:26 +[FITS, FITS, Time] DATE-END - Observation Date End: 09/12/96 +[FITS, FITS, Time] TIME-END - Observation Time End: 12:01:40 +[FITS, FITS, Image] TIMESYS - Timesys: TT +[FITS, FITS, Image] MJDREFI - Mjdrefi: 49353 +[FITS, FITS, Image] MJDREFF - Mjdreff: 6.965740740000e-04 +[FITS, FITS, Image] COMMENT - Comment: MJD = JD - 2400000.5 +[FITS, FITS, Image] TIMEZERO - Timezero: 3.37843167e+00 +[FITS, FITS, Image] TIMEUNIT - Timeunit: s +[FITS, FITS, Image] TIMEREF - Timeref: LOCAL +[FITS, FITS, Image] TASSIGN - Tassign: SATELLITE +[FITS, FITS, Image] TIERRELA - Tierrela: 1.000e-06 +[FITS, FITS, Image] TIERABSO - Tierabso: 1.000e+00 +[FITS, FITS, Image] CLOCKAPP - Clockapp: T +[FITS, FITS, Image] TIMVERSN - Timversn: XFF/95-004 +[FITS, FITS, Image] OBJECT - Object: 47_TUCANAE_Slew +[FITS, FITS, Image] RA_OBJ - Ra Obj: 6.02170000e+00 +[FITS, FITS, Image] DEC_OBJ - Dec Obj: -7.20808030e+01 +[FITS, FITS, Image] EQUINOX - Equinox: 2000.0 +[FITS, FITS, Image] RADECSYS - Radecsys: FK5 +[FITS, FITS, Image] OBSERVER - Observer: FAN LEI +[FITS, FITS, Image] OBS_ID - Obs Id: 10080-01-02-00A +[FITS, FITS, Image] CHECKSUM - Checksum: mB6cn96ZmA6bm96Z +[FITS, FITS, Image] DATASUM - Datasum: 0 diff --git a/t/FLAC.t b/t/FLAC.t new file mode 100644 index 0000000..e068c8e --- /dev/null +++ b/t/FLAC.t @@ -0,0 +1,38 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/FLAC.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::FLAC; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'FLAC'; +my $testnum = 1; + +# test 2: Extract information from FLAC test file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/FLAC.flac'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Extract information from Ogg test file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/FLAC.ogg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/FLAC_2.out b/t/FLAC_2.out new file mode 100644 index 0000000..2387071 --- /dev/null +++ b/t/FLAC_2.out @@ -0,0 +1,27 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: FLAC.flac +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 282 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:11:13 15:12:26-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:16-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: FLAC +[File, File, Other] FileTypeExtension - File Type Extension: flac +[File, File, Other] MIMEType - MIME Type: audio/flac +[FLAC, FLAC, Audio] Bit000-015 - Block Size Min: 4608 +[FLAC, FLAC, Audio] Bit016-031 - Block Size Max: 4608 +[FLAC, FLAC, Audio] Bit032-055 - Frame Size Min: 16777215 +[FLAC, FLAC, Audio] Bit056-079 - Frame Size Max: 0 +[FLAC, FLAC, Audio] Bit080-099 - Sample Rate: 8000 +[FLAC, FLAC, Audio] Bit100-102 - Channels: 2 +[FLAC, FLAC, Audio] Bit103-107 - Bits Per Sample: 8 +[FLAC, FLAC, Audio] Bit108-143 - Total Samples: 0 +[FLAC, FLAC, Audio] Bit144-271 - MD5 Signature: d41d8cd98f00b204e9800998ecf8427e +[Vorbis, Vorbis, Audio] vendor - Vendor: reference libFLAC 1.1.2 20050205 +[Vorbis, Vorbis, Audio] REPLAYGAIN_TRACK_PEAK - Replay Gain Track Peak: 0.00000000 +[Vorbis, Vorbis, Audio] REPLAYGAIN_TRACK_GAIN - Replay Gain Track Gain: -24601.00 dB +[Vorbis, Vorbis, Audio] REPLAYGAIN_ALBUM_PEAK - Replay Gain Album Peak: 0.00000000 +[Vorbis, Vorbis, Audio] REPLAYGAIN_ALBUM_GAIN - Replay Gain Album Gain: -24601.00 dB +[Vorbis, Vorbis, Audio] TITLE - Title: ExifTool test +[Vorbis, Vorbis, Author] COPYRIGHT - Copyright: Phil Harvey diff --git a/t/FLAC_3.out b/t/FLAC_3.out new file mode 100644 index 0000000..1675e8d --- /dev/null +++ b/t/FLAC_3.out @@ -0,0 +1,21 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: FLAC.ogg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 151 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:11:13 16:10:54-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:16-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: OGG +[File, File, Other] FileTypeExtension - File Type Extension: ogg +[File, File, Other] MIMEType - MIME Type: audio/ogg +[FLAC, FLAC, Audio] Bit000-015 - Block Size Min: 4608 +[FLAC, FLAC, Audio] Bit016-031 - Block Size Max: 4608 +[FLAC, FLAC, Audio] Bit032-055 - Frame Size Min: 0 +[FLAC, FLAC, Audio] Bit056-079 - Frame Size Max: 0 +[FLAC, FLAC, Audio] Bit080-099 - Sample Rate: 8000 +[FLAC, FLAC, Audio] Bit100-102 - Channels: 2 +[FLAC, FLAC, Audio] Bit103-107 - Bits Per Sample: 8 +[FLAC, FLAC, Audio] Bit108-143 - Total Samples: 0 +[FLAC, FLAC, Audio] Bit144-271 - MD5 Signature: 00000000000000000000000000000000 +[Vorbis, Vorbis, Audio] vendor - Vendor: reference libFLAC 1.1.2 20050205 diff --git a/t/FLIF.t b/t/FLIF.t new file mode 100644 index 0000000..0cfe5d4 --- /dev/null +++ b/t/FLIF.t @@ -0,0 +1,133 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/ZIP.t". + +BEGIN { + $| = 1; print "1..6\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::FLIF; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'FLIF'; +my $testnum = 1; + +my @checkTags = qw(Artist Creator XResolution ProfileCMMType XMP); + +# test 2: Extract information from FLIF.flif +{ + ++$testnum; + my $skip = ''; + if (eval { require IO::Uncompress::RawInflate }) { + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/FLIF.flif'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + } else { + $skip = ' # skip Requires IO::Uncompress::RawInflate'; + } + print "ok $testnum$skip\n"; +} + +# test 3: Edit FLIF information +{ + ++$testnum; + my $skip = ''; + if (eval { require IO::Uncompress::RawInflate and require IO::Compress::RawDeflate }) { + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/XMP.jpg','ICC_Profile'); + $exifTool->SetNewValue('EXIF:XResolution' => 234); + $exifTool->SetNewValue('XMP:Creator' => 'just me'); + my $testfile = "t/${testname}_${testnum}_failed.flif"; + unlink $testfile; + $exifTool->WriteInfo('t/images/FLIF.flif', $testfile); + my $info = $exifTool->ImageInfo($testfile, @checkTags); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + } else { + $skip = ' # skip Requires IO::Compress::RawDeflate'; + } + print "ok $testnum$skip\n"; +} + +# test 4: Delete FLIF information +my $testfile; +{ + ++$testnum; + my $skip = ''; + if (eval { require IO::Uncompress::RawInflate and require IO::Compress::RawDeflate }) { + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue(ICC_Profile => undef, Protected => 1); + $exifTool->SetNewValue(EXIF => undef, Protected => 1); + $exifTool->SetNewValue('XMP:all' => undef); + $testfile = "t/${testname}_${testnum}_failed.flif"; + unlink $testfile; + $exifTool->WriteInfo('t/images/FLIF.flif', $testfile); + my $info = $exifTool->ImageInfo($testfile); + unless (check($exifTool, $info, $testname, $testnum)) { + print 'not '; + undef $testfile; + } + } else { + $skip = ' # skip Requires IO::Compress::RawDeflate'; + } + print "ok $testnum$skip\n"; +} + +# test 5: Add back FLIF information +{ + ++$testnum; + my $skip = ''; + if (defined $testfile) { + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/Photoshop.psd','ICC_Profile'); + $exifTool->SetNewValue('EXIF:XResolution' => 123); + $exifTool->SetNewValue('XMP:Creator' => 'me again'); + my $testfile2 = "t/${testname}_${testnum}_failed.flif"; + unlink $testfile2; + $exifTool->WriteInfo($testfile, $testfile2); + my $info = $exifTool->ImageInfo($testfile2, @checkTags); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + unlink $testfile2; + } else { + print 'not '; + } + } else { + $skip = ' # skip Requires test 4 pass'; + } + print "ok $testnum$skip\n"; +} + +# test 6: Delete all then add back in one step +{ + ++$testnum; + my $skip = ''; + if (eval { require IO::Uncompress::RawInflate and require IO::Compress::RawDeflate }) { + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue(all => undef); + $exifTool->SetNewValuesFromFile('t/images/Photoshop.psd','ICC_Profile'); + $exifTool->SetNewValue('EXIF:XResolution' => 456); + $exifTool->SetNewValue('XMP:Creator' => 'me too'); + $testfile = "t/${testname}_${testnum}_failed.flif"; + unlink $testfile; + $exifTool->WriteInfo('t/images/FLIF.flif', $testfile); + my $info = $exifTool->ImageInfo($testfile, @checkTags); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + } else { + $skip = ' # skip Requires IO::Compress::RawDeflate'; + } + print "ok $testnum$skip\n"; +} + +# end diff --git a/t/FLIF_2.out b/t/FLIF_2.out new file mode 100644 index 0000000..b970503 --- /dev/null +++ b/t/FLIF_2.out @@ -0,0 +1,51 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: FLIF.flif +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 674 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2016:10:27 14:56:15-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:05-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rwxr-xr-x +[File, File, Other] FileType - File Type: FLIF +[File, File, Other] FileTypeExtension - File Type Extension: flif +[File, File, Other] MIMEType - MIME Type: image/flif +[File, File, Image] 0 - Image Type: RGB (non-interlaced) +[File, File, Image] 1 - Bit Depth: 8 +[File, File, Image] 2 - Image Width: 16 +[File, File, Image] 3 - Image Height: 16 +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] 5 - Encoding: FLIF16 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 6.51 +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Author] 315 - Artist: Phil +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Nikon Corporation +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.2.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1999:12:07 18:59:22 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Apple Computer Inc. +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: none +[ICC_Profile, ICC-header, Image] 52 - Device Model: +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: Nikon Adobe RGB 4.0.0.3000 +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.60976 0.31113 0.01947 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.20525 0.62566 0.06087 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.1492 0.06322 0.74463 +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.9505 1 1.0891 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Nikon Inc. & Nikon Corporation 2001 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 16x16 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000256 diff --git a/t/FLIF_3.out b/t/FLIF_3.out new file mode 100644 index 0000000..1e56a04 --- /dev/null +++ b/t/FLIF_3.out @@ -0,0 +1,5 @@ +[XMP, XMP, Image] XMP - XMP: (Binary data 418 bytes) +[XMP, XMP-dc, Author] creator - Creator: just me +[EXIF, IFD0, Image] 282 - X Resolution: 234 +[EXIF, IFD0, Author] 315 - Artist: Phil +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Linotronic diff --git a/t/FLIF_4.out b/t/FLIF_4.out new file mode 100644 index 0000000..29ada51 --- /dev/null +++ b/t/FLIF_4.out @@ -0,0 +1,18 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: FLIF_4_failed.flif +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 23 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:07:29 09:04:05-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:05-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2020:07:29 09:04:05-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: FLIF +[File, File, Other] FileTypeExtension - File Type Extension: flif +[File, File, Other] MIMEType - MIME Type: image/flif +[File, File, Image] 0 - Image Type: RGB (non-interlaced) +[File, File, Image] 1 - Bit Depth: 8 +[File, File, Image] 2 - Image Width: 16 +[File, File, Image] 3 - Image Height: 16 +[File, File, Image] 5 - Encoding: FLIF16 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 16x16 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000256 diff --git a/t/FLIF_5.out b/t/FLIF_5.out new file mode 100644 index 0000000..277759b --- /dev/null +++ b/t/FLIF_5.out @@ -0,0 +1,4 @@ +[EXIF, IFD0, Image] 282 - X Resolution: 123 +[XMP, XMP, Image] XMP - XMP: (Binary data 419 bytes) +[XMP, XMP-dc, Author] creator - Creator: me again +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Adobe Systems Inc. diff --git a/t/FLIF_6.out b/t/FLIF_6.out new file mode 100644 index 0000000..a4fa98f --- /dev/null +++ b/t/FLIF_6.out @@ -0,0 +1,4 @@ +[XMP, XMP, Image] XMP - XMP: (Binary data 417 bytes) +[XMP, XMP-dc, Author] creator - Creator: me too +[EXIF, IFD0, Image] 282 - X Resolution: 456 +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Adobe Systems Inc. diff --git a/t/FLIR.t b/t/FLIR.t new file mode 100644 index 0000000..5ecd3d3 --- /dev/null +++ b/t/FLIR.t @@ -0,0 +1,31 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/FLIR.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::FLIR; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'FLIR'; +my $testnum = 1; + +# test 2: Extract information from FLIR JPG and FPF files +{ + my $file; + foreach $file ('FLIR.jpg', 'FLIR.fpf') { + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo("t/images/$file"); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + } +} + +# end diff --git a/t/FLIR_2.out b/t/FLIR_2.out new file mode 100644 index 0000000..197cd0c --- /dev/null +++ b/t/FLIR_2.out @@ -0,0 +1,121 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: FLIR.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 7.3 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:04:02 13:11:16-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:36-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[JFIF, JFIF, Image] 0 - JFIF Version: 1.01 +[JFIF, JFIF, Image] 2 - Resolution Unit: None +[JFIF, JFIF, Image] 3 - X Resolution: 1 +[JFIF, JFIF, Image] 5 - Y Resolution: 1 +[EXIF, IFD0, Camera] 271 - Make: FLIR Systems AB +[EXIF, IFD0, Camera] 272 - Camera Model Name: FLIR_i7 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Common_dll v8.0.6b1 +[EXIF, IFD0, Time] 306 - Modify Date: 2012:02:11 14:17:08 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/32 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2012:02:11 14:17:08 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2012:02:11 14:17:08 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: -, Cr, Cb, Y +[EXIF, ExifIFD, Camera] 37382 - Subject Distance: 1 m +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.7 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 240 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 240 +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 1 +[EXIF, ExifIFD, Image] 42016 - Image Unique ID: 72AE2CD63D6C4AE1678418BE48230029 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 872 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 2314 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 2314 bytes) +[MakerNotes, FLIR, Camera] 1 - Image Temperature Max: 308 +[MakerNotes, FLIR, Camera] 2 - Image Temperature Min: 281 +[MakerNotes, FLIR, Camera] 3 - Emissivity: 0.80 +[APP1, FLIR, Image] 4 - Creator Software: +[APP1, FLIR, Image] 0 - Palette Colors: 224 +[APP1, FLIR, Image] 6 - Above Color: 170 128 128 +[APP1, FLIR, Image] 9 - Below Color: 50 128 128 +[APP1, FLIR, Image] 12 - Overflow Color: 67 216 98 +[APP1, FLIR, Image] 15 - Underflow Color: 41 110 240 +[APP1, FLIR, Image] 18 - Isotherm 1 Color: 100 128 128 +[APP1, FLIR, Image] 21 - Isotherm 2 Color: 100 110 240 +[APP1, FLIR, Image] 26 - Palette Method: 0 +[APP1, FLIR, Image] 27 - Palette Stretch: 2 +[APP1, FLIR, Image] 48 - Palette File Name: \FlashFS\system\iron.pal +[APP1, FLIR, Image] 80 - Palette Name: Iron +[APP1, FLIR, Image] 112 - Palette: (Binary data 672 bytes) +[APP1, FLIR, Camera] 32 - Emissivity: 0.80 +[APP1, FLIR, Camera] 36 - Object Distance: 1.00 m +[APP1, FLIR, Camera] 40 - Reflected Apparent Temperature: 20.0 C +[APP1, FLIR, Camera] 44 - Atmospheric Temperature: 20.0 C +[APP1, FLIR, Camera] 48 - IR Window Temperature: 20.0 C +[APP1, FLIR, Camera] 52 - IR Window Transmission: 1.00 +[APP1, FLIR, Camera] 60 - Relative Humidity: 50.0 % +[APP1, FLIR, Camera] 88 - Planck R1: 13799.269 +[APP1, FLIR, Camera] 92 - Planck B: 1374.5 +[APP1, FLIR, Camera] 96 - Planck F: 1.35 +[APP1, FLIR, Camera] 112 - Atmospheric Trans Alpha 1: 0.006569 +[APP1, FLIR, Camera] 116 - Atmospheric Trans Alpha 2: 0.012620 +[APP1, FLIR, Camera] 120 - Atmospheric Trans Beta 1: -0.002276 +[APP1, FLIR, Camera] 124 - Atmospheric Trans Beta 2: -0.006670 +[APP1, FLIR, Camera] 128 - Atmospheric Trans X: 1.900000 +[APP1, FLIR, Camera] 144 - Camera Temperature Range Max: 250.0 C +[APP1, FLIR, Camera] 148 - Camera Temperature Range Min: -0.0 C +[APP1, FLIR, Camera] 152 - Camera Temperature Max Clip: 270.0 C +[APP1, FLIR, Camera] 156 - Camera Temperature Min Clip: -40.0 C +[APP1, FLIR, Camera] 160 - Camera Temperature Max Warn: 250.0 C +[APP1, FLIR, Camera] 164 - Camera Temperature Min Warn: -0.0 C +[APP1, FLIR, Camera] 168 - Camera Temperature Max Saturated: 270.0 C +[APP1, FLIR, Camera] 172 - Camera Temperature Min Saturated: -60.0 C +[APP1, FLIR, Camera] 212 - Camera Model: FLIR_i7 +[APP1, FLIR, Camera] 244 - Camera Part Number: T197600 +[APP1, FLIR, Camera] 260 - Camera Serial Number: 470023842 +[APP1, FLIR, Camera] 276 - Camera Software: 8.1.1 +[APP1, FLIR, Camera] 368 - Lens Model: FOL7 +[APP1, FLIR, Camera] 400 - Lens Part Number: +[APP1, FLIR, Camera] 416 - Lens Serial Number: +[APP1, FLIR, Camera] 436 - Field Of View: 25.0 deg +[APP1, FLIR, Camera] 492 - Filter Model: +[APP1, FLIR, Camera] 508 - Filter Part Number: +[APP1, FLIR, Camera] 540 - Filter Serial Number: +[APP1, FLIR, Camera] 776 - Planck O: -6646 +[APP1, FLIR, Camera] 780 - Planck R2: 0.022241818 +[APP1, FLIR, Image] 784 - Raw Value Range Min: 7630 +[APP1, FLIR, Image] 786 - Raw Value Range Max: 61986 +[APP1, FLIR, Image] 824 - Raw Value Median: 12582 +[APP1, FLIR, Image] 828 - Raw Value Range: 1980 +[APP1, FLIR, Time] 900 - Date/Time Original: 2012:02:11 14:17:08.253+01:00 +[APP1, FLIR, Camera] 912 - Focus Step Count: 0 +[APP1, FLIR, Camera] 1116 - Focus Distance: 2.0 m +[APP1, FLIR, Camera] 1124 - Frame Rate: 9 +[APP1, FLIR, Image] 1 - Raw Thermal Image Width: 120 +[APP1, FLIR, Image] 2 - Raw Thermal Image Height: 120 +[APP1, FLIR, Image] 16 - Raw Thermal Image Type: PNG +[APP1, FLIR, Preview] 16.1 - Raw Thermal Image: (Binary data 79 bytes) +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/32 +[Composite, FLIR, Camera] FLIR-PeakSpectralSensitivity - Peak Spectral Sensitivity: 10.5 um +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 6.7 mm diff --git a/t/FLIR_3.out b/t/FLIR_3.out new file mode 100644 index 0000000..9f1aea1 --- /dev/null +++ b/t/FLIR_3.out @@ -0,0 +1,49 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: FLIR.fpf +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 914 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:04:11 15:17:20-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:05-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: FPF +[File, File, Other] FileTypeExtension - File Type Extension: fpf +[File, File, Other] MIMEType - MIME Type: image/x-flir-fpf +[FLIR, FLIR, Image] 32 - FPF Version: 2 +[FLIR, FLIR, Image] 36 - Image Data Offset: 892 +[FLIR, FLIR, Image] 40 - Image Type: Temperature +[FLIR, FLIR, Image] 42 - Image Pixel Format: 4-byte float +[FLIR, FLIR, Image] 44 - Image Width: 160 +[FLIR, FLIR, Image] 46 - Image Height: 120 +[FLIR, FLIR, Image] 48 - External Trigger Count: 0 +[FLIR, FLIR, Image] 52 - Sequence Frame Number: 1 +[FLIR, FLIR, Camera] 120 - Camera Model: FLIR E40 +[FLIR, FLIR, Camera] 152 - Camera Part Number: 49001-2001 +[FLIR, FLIR, Camera] 184 - Camera Serial Number: 49033333 +[FLIR, FLIR, Camera] 216 - Camera Temperature Range Min: -20.0 C +[FLIR, FLIR, Camera] 220 - Camera Temperature Range Max: 120.0 C +[FLIR, FLIR, Camera] 224 - Lens Model: FOL18 +[FLIR, FLIR, Camera] 256 - Lens Part Number: +[FLIR, FLIR, Camera] 288 - Lens Serial Number: +[FLIR, FLIR, Camera] 320 - Filter Model: +[FLIR, FLIR, Camera] 336 - Filter Part Number: +[FLIR, FLIR, Camera] 384 - Filter Serial Number: +[FLIR, FLIR, Image] 480 - Emissivity: 0.95 +[FLIR, FLIR, Image] 484 - Object Distance: 1.00 m +[FLIR, FLIR, Image] 488 - Reflected Apparent Temperature: 20.0 C +[FLIR, FLIR, Image] 492 - Atmospheric Temperature: 20.0 C +[FLIR, FLIR, Image] 496 - Relative Humidity: 50.0 % +[FLIR, FLIR, Image] 500 - Computed Atmospheric Trans: 0.99 +[FLIR, FLIR, Image] 504 - Estimated Atmospheric Trans: 0.00 +[FLIR, FLIR, Image] 508 - Reference Temperature: 20.0 C +[FLIR, FLIR, Camera] 512 - IR Window Temperature: 20.0 C +[FLIR, FLIR, Camera] 516 - IR Window Transmission: 1.00 +[FLIR, FLIR, Time] 584 - Date/Time Original: 2013:02:22 11:19:20.891 +[FLIR, FLIR, Image] 676 - Camera Scale Min: 267.3 +[FLIR, FLIR, Image] 680 - Camera Scale Max: 277.1 +[FLIR, FLIR, Image] 684 - Calculated Scale Min: 260.0 +[FLIR, FLIR, Image] 688 - Calculated Scale Max: 279.6 +[FLIR, FLIR, Image] 692 - Actual Scale Min: 267.3 +[FLIR, FLIR, Image] 696 - Actual Scale Max: 277.1 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 160x120 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.019 diff --git a/t/Flash.t b/t/Flash.t new file mode 100644 index 0000000..77c23ad --- /dev/null +++ b/t/Flash.t @@ -0,0 +1,38 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Flash.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Flash; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Flash'; +my $testnum = 1; + +# test 2: Extract information from Flash.swf +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Flash.swf'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Extract information from Flash.flv +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Flash.flv'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/FlashPix.t b/t/FlashPix.t new file mode 100644 index 0000000..f1f5db1 --- /dev/null +++ b/t/FlashPix.t @@ -0,0 +1,31 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/FlashPix.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::FlashPix; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'FlashPix'; +my $testnum = 1; + +# test 2: Extract information from FlashPix.ppt +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + # omit FileSize since file is 9.5kB exactly and rounding errors + # in Windows Cygwin Perl 5.8.2 round this down to 9kB in printout + my $info = $exifTool->ImageInfo('t/images/FlashPix.ppt','-filesize'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/FlashPix_2.out b/t/FlashPix_2.out new file mode 100644 index 0000000..98adb51 --- /dev/null +++ b/t/FlashPix_2.out @@ -0,0 +1,49 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.78 +[File, System, Other] FileName - File Name: FlashPix.ppt +[File, System, Other] Directory - Directory: t/images +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:12:04 10:59:23-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:12:04 10:59:39-05:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:12:04 10:59:23-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: PPT +[File, File, Other] FileTypeExtension - File Type Extension: ppt +[File, File, Other] MIMEType - MIME Type: application/vnd.ms-powerpoint +[FlashPix, FlashPix, Other] 1 - Code Page: Mac Roman (Western European) +[FlashPix, FlashPix, Document] 2 - Title: title +[FlashPix, FlashPix, Document] 3 - Subject: subject +[FlashPix, FlashPix, Author] 4 - Author: author +[FlashPix, FlashPix, Document] 5 - Keywords: keywords +[FlashPix, FlashPix, Document] 6 - Comments: comments +[FlashPix, FlashPix, Author] 8 - Last Modified By: user name +[FlashPix, FlashPix, Document] 9 - Revision Number: 1 +[FlashPix, FlashPix, Document] 18 - Software: Microsoft PowerPoint +[FlashPix, FlashPix, Document] 10 - Total Edit Time: 4.4 minutes +[FlashPix, FlashPix, Time] 12 - Create Date: 2007:02:09 16:23:23 +[FlashPix, FlashPix, Time] 13 - Modify Date: 2007:02:09 16:27:49 +[FlashPix, FlashPix, Document] 15 - Words: 4 +[FlashPix, FlashPix, Other] 1 - Code Page: Mac Roman (Western European) +[FlashPix, FlashPix, Document] 2 - Category: category +[FlashPix, FlashPix, Document] 3 - Presentation Target: On-screen Show +[FlashPix, FlashPix, Document] 14 - Manager: manager +[FlashPix, FlashPix, Document] 15 - Company: company +[FlashPix, FlashPix, Document] 4 - Bytes: 4610 +[FlashPix, FlashPix, Document] 6 - Paragraphs: 4 +[FlashPix, FlashPix, Document] 7 - Slides: 1 +[FlashPix, FlashPix, Document] 8 - Notes: 0 +[FlashPix, FlashPix, Document] 9 - Hidden Slides: 0 +[FlashPix, FlashPix, Document] 10 - MM Clips: 0 +[FlashPix, FlashPix, Document] 23 - App Version: 10.2418 +[FlashPix, FlashPix, Document] 11 - Scale Crop: No +[FlashPix, FlashPix, Document] 16 - Links Up To Date: No +[FlashPix, FlashPix, Document] 19 - Shared Doc: No +[FlashPix, FlashPix, Document] 22 - Hyperlinks Changed: No +[FlashPix, FlashPix, Document] 13 - Title Of Parts: Times, Blank Presentation, Title +[FlashPix, FlashPix, Document] 12 - Heading Pairs: Fonts Used, 1, Design Template, 1, Slide Titles, 1 +[FlashPix, FlashPix, Other] 1 - Code Page: Mac Roman (Western European) +[FlashPix, FlashPix, Document] _PID_LINKBASE - Hyperlink Base: hyperlink base +[FlashPix, FlashPix, Document] _PID_HLINKS - Hyperlinks: https://exiftool.org/ , http://www.microsoft.com/mac/#test, mailto:phil?subject=subject +[FlashPix, FlashPix, Document] Custom Text - Custom Text: customtext +[FlashPix, FlashPix, Document] Custom Number - Custom Number: 42 +[FlashPix, FlashPix, Document] Custom Date - Custom Date: 2007:01:09 05:00:00 +[FlashPix, FlashPix, Document] Custom Boolean - Custom Boolean: 1 +[FlashPix, FlashPix, Image] Current User - Current User: user name diff --git a/t/Flash_2.out b/t/Flash_2.out new file mode 100644 index 0000000..8b66130 --- /dev/null +++ b/t/Flash_2.out @@ -0,0 +1,22 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Flash.swf +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 384 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2008:10:23 16:27:45-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:05-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: SWF +[File, File, Other] FileTypeExtension - File Type Extension: swf +[File, File, Other] MIMEType - MIME Type: application/x-shockwave-flash +[Flash, Flash, Video] FlashVersion - Flash Version: 6 +[Flash, Flash, Video] Compressed - Compressed: False +[Flash, Flash, Video] ImageWidth - Image Width: 50 +[Flash, Flash, Video] ImageHeight - Image Height: 50 +[Flash, Flash, Video] FrameRate - Frame Rate: 12 +[Flash, Flash, Video] FrameCount - Frame Count: 1 +[Flash, Flash, Video] Duration - Duration: 0.08 s +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 7.50 +[XMP, XMP-pdf, Author] Author - Author: Phil +[Composite, Composite, Image] Exif-ImageSize - Image Size: 50x50 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.003 diff --git a/t/Flash_3.out b/t/Flash_3.out new file mode 100644 index 0000000..376aa45 --- /dev/null +++ b/t/Flash_3.out @@ -0,0 +1,55 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Flash.flv +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1358 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2007:06:12 12:15:04-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:05-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: FLV +[File, File, Other] FileTypeExtension - File Type Extension: flv +[File, File, Other] MIMEType - MIME Type: video/x-flv +[Flash, Flash, Video] hasKeyframes - Has Key Frames: Yes +[Flash, Flash, Video] CuePoint0Name - Cue Point 0 Name: Cue1 +[Flash, Flash, Video] CuePoint0Time - Cue Point 0 Time: 0 +[Flash, Flash, Video] CuePoint0Type - Cue Point 0 Type: event +[Flash, Flash, Video] CuePoint1Name - Cue Point 1 Name: Cue2 +[Flash, Flash, Video] CuePoint1Time - Cue Point 1 Time: 0.324 +[Flash, Flash, Video] CuePoint1ParameterParam1 - Cue Point 1 Parameter Param 1: value1 +[Flash, Flash, Video] CuePoint1ParameterParam2 - Cue Point 1 Parameter Param 2: value2 +[Flash, Flash, Video] CuePoint1Type - Cue Point 1 Type: navigation +[Flash, Flash, Audio] audiodatarate - Audio Bitrate: 65.8 kbps +[Flash, Flash, Video] hasVideo - Has Video: Yes +[Flash, Flash, Audio] stereo - Stereo: No +[Flash, Flash, Video] canSeekToEnd - Can Seek To End: Yes +[Flash, Flash, Video] framerate - Frame Rate: 20 +[Flash, Flash, Audio] audiosamplerate - Audio Sample Rate: 44000 +[Flash, Flash, Video] videocodecid - Video Codec ID: 4 +[Flash, Flash, Video] datasize - Data Size: 187002 +[Flash, Flash, Video] lasttimestamp - Last Time Stamp: 3.039 +[Flash, Flash, Audio] audiosamplesize - Audio Sample Size: 16 +[Flash, Flash, Audio] audiosize - Audio Size: 26299 +[Flash, Flash, Audio] hasAudio - Has Audio: Yes +[Flash, Flash, Audio] audiodelay - Audio Delay: 0.039 +[Flash, Flash, Video] videosize - Video Size: 159544 +[Flash, Flash, Time] metadatadate - Metadata Date: 2007:06:12 15:03:11.528553-04:00 +[Flash, Flash, Video] metadatacreator - Metadata Creator: inlet media FLVTool2 v1.0.6 - http://www.inlet-media.de/flvtool2 +[Flash, Flash, Video] test - Test: this +[Flash, Flash, Video] lastkeyframetimestamp - Last Key Frame Time: 3.039 +[Flash, Flash, Video] height - Image Height: 240 +[Flash, Flash, Video] filesize - File Size Bytes: 187691 +[Flash, Flash, Video] hasMetadata - Has Metadata: Yes +[Flash, Flash, Video] keyframesTimes - Key Frames Times: 0.039, 0.363, 1.839, 3.039 +[Flash, Flash, Video] keyframesFilepositions - Key Frame Positions: 1463, 32674, 143320, 181650 +[Flash, Flash, Audio] audiocodecid - Audio Codec ID: 2 +[Flash, Flash, Video] videodatarate - Video Bitrate: 419 kbps +[Flash, Flash, Video] duration - Duration: 3.09 s +[Flash, Flash, Video] hasCuePoints - Has Cue Points: Yes +[Flash, Flash, Video] width - Image Width: 320 +[Flash, Flash, Audio] Bit0-3 - Audio Encoding: MP3 +[Flash, Flash, Audio] Bit4-5 - Audio Sample Rate: 11025 +[Flash, Flash, Audio] Bit6 - Audio Bits Per Sample: 16 +[Flash, Flash, Audio] Bit7 - Audio Channels: 1 (mono) +[Flash, Flash, Video] Bit4-7 - Video Encoding: On2 VP6 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 320x240 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.077 diff --git a/t/Font.t b/t/Font.t new file mode 100644 index 0000000..eed7487 --- /dev/null +++ b/t/Font.t @@ -0,0 +1,31 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Font.t". + +BEGIN { + $| = 1; print "1..7\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Font; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Font'; +my $testnum = 1; + +# tests 2-7: Extract information from test Font files +{ + my $exifTool = new Image::ExifTool; + my $type; + foreach $type (qw(afm dfont pfa pfb pfm ttf)) { + ++$testnum; + my $info = $exifTool->ImageInfo("t/images/Font.$type"); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + } +} + +# end diff --git a/t/Font_2.out b/t/Font_2.out new file mode 100644 index 0000000..f0de6b5 --- /dev/null +++ b/t/Font_2.out @@ -0,0 +1,24 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: Font.afm +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 735 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:01:18 14:13:19-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:16-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: AFM +[File, File, Other] FileTypeExtension - File Type Extension: afm +[File, File, Other] MIMEType - MIME Type: application/x-font-afm +[File, File, Image] Comment - Comment: Generated by pfaedit +[Font, Font, Time] Creation Date - Create Date: Sat Sep 4 16:12:41 2004 +[Font, Font, Document] FontName - Font Name: NimbusSanL-ReguCondItal +[Font, Font, Document] FullName - Full Name: Nimbus Sans L Condensed Regular Italic +[Font, Font, Document] FamilyName - Font Family: Nimbus Sans L Condensed +[Font, Font, Document] Weight - Weight: Regular +[Font, Font, Author] Notice - Notice: Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development; Cyrillic glyphs added by Valek Filippov (C) 2001-2004 +[Font, Font, Document] Version - Version: 1.06 +[Font, Font, Document] EncodingScheme - Encoding Scheme: AdobeStandardEncoding +[Font, Font, Document] CapHeight - Cap Height: 718 +[Font, Font, Document] XHeight - X Height: 523 +[Font, Font, Document] Ascender - Ascender: 718 +[Font, Font, Document] Descender - Descender: -207 diff --git a/t/Font_3.out b/t/Font_3.out new file mode 100644 index 0000000..5b82e1b --- /dev/null +++ b/t/Font_3.out @@ -0,0 +1,36 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: Font.dfont +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1744 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:01:18 19:08:47-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:16-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: DFONT +[File, File, Other] FileTypeExtension - File Type Extension: dfont +[File, File, Other] MIMEType - MIME Type: application/x-dfont +[Font, Font, Author] 0 - Copyright: © 1987, 1990, 1994, 2001, 2002 Adobe Systems Incorporated. All rights reserved. +[Font, Font, Document] 1 - Font Family: Stencil Std +[Font, Font, Document] 2 - Font Subfamily: Bold +[Font, Font, Document] 3 - Font Subfamily ID: 2.025;ADBE;StencilStd +[Font, Font, Document] 4 - Font Name: Stencil Std Bold +[Font, Font, Document] 5 - Name Table Version: Version 2.025;PS 002.000;hotconv 1.0.50;makeotf.lib2.0.16970 +[Font, Font, Document] 6 - PostScript Font Name: StencilStd +[Font, Font, Document] 7 - Trademark: Please refer to the Copyright section for the font trademark attribution notices. +[Font, Font, Document] 9 - Designer: Gerry Powell +[Font, Font, Document] 11 - Vendor URL: http://www.adobe.com/type +[Font, Font, Document] 14 - License Info URL: http://www.adobe.com/type/legal.html +[Font, Font, Document] 18 - Compatible Font Name: Stencil Std +[Font, Font, Author] 0-en-US - Copyright (en-US): © 1987, 1990, 1994, 2001, 2002 Adobe Systems Incorporated. All rights reserved. +[Font, Font, Document] 1-en-US - Font Family (en-US): Stencil Std +[Font, Font, Document] 2-en-US - Font Subfamily (en-US): Regular +[Font, Font, Document] 3-en-US - Font Subfamily ID (en-US): 2.025;ADBE;StencilStd +[Font, Font, Document] 4-en-US - Font Name (en-US): StencilStd +[Font, Font, Document] 5-en-US - Name Table Version (en-US): Version 2.025;PS 002.000;hotconv 1.0.50;makeotf.lib2.0.16970 +[Font, Font, Document] 6-en-US - Post Script Font Name (en-US): StencilStd +[Font, Font, Document] 7-en-US - Trademark (en-US): Please refer to the Copyright section for the font trademark attribution notices. +[Font, Font, Document] 9-en-US - Designer (en-US): Gerry Powell +[Font, Font, Document] 11-en-US - Vendor URL (en-US): http://www.adobe.com/type +[Font, Font, Document] 14-en-US - License Info URL (en-US): http://www.adobe.com/type/legal.html +[Font, Font, Document] 17-en-US - Preferred Subfamily (en-US): Bold +[RSRC, RSRC, Document] vers_0x0001 - Application Version: ExifTool 8.0.7 DFONT Test diff --git a/t/Font_4.out b/t/Font_4.out new file mode 100644 index 0000000..60a5ea7 --- /dev/null +++ b/t/Font_4.out @@ -0,0 +1,27 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: Font.pfa +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1559 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:01:18 14:10:30-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:16-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: PFA +[File, File, Other] FileTypeExtension - File Type Extension: pfa +[File, File, Other] MIMEType - MIME Type: application/x-font-type1 +[File, File, Image] Comment - Comment: 1;% 2004-2-16: Created.;Generated by FontForge 20040531 (http://fontforge.sf.net/) +[PostScript, PostScript, Image] Title - Title: YehudaCLM-Bold +[PostScript, PostScript, Time] CreationDate - Create Date: Sat Jun 12 19:16:03 2004 +[PostScript, PostScript, Image] Creator - Creator: Maxim Iorsh +[Font, Font, Document] FontType - Font Type: 1 +[Font, Font, Document] FontName - Font Name: YehudaCLM-Bold +[Font, Font, Document] version - Version: 0.100 +[Font, Font, Author] Notice - Notice: Copyright .51 2004 by Maxim Iorsh (iorsh@math.technion.ac.il). Distributed under the terms of GNU General Public License version 2(http://www.gnu.org/licenses/gpl.html). ;All rights reserved. +[Font, Font, Document] FullName - Full Name: Yehuda CLM Bold +[Font, Font, Document] FamilyName - Font Family: Yehuda CLM +[Font, Font, Document] Weight - Weight: Bold +[Font, Font, Document] FSType - FS Type: 0 +[Font, Font, Document] ItalicAngle - Italic Angle: 0 +[Font, Font, Document] isFixedPitch - Is Fixed Pitch: false +[Font, Font, Document] UnderlinePosition - Underline Position: -100 +[Font, Font, Document] UnderlineThickness - Underline Thickness: 50 diff --git a/t/Font_5.out b/t/Font_5.out new file mode 100644 index 0000000..a628cbd --- /dev/null +++ b/t/Font_5.out @@ -0,0 +1,27 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: Font.pfb +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1423 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:01:18 14:10:30-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:16-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: PFB +[File, File, Other] FileTypeExtension - File Type Extension: pfb +[File, File, Other] MIMEType - MIME Type: application/x-font-type1 +[File, File, Image] Comment - Comment: 1;Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development; Cyri;Generated by FontForge 20040824 (http://fontforge.sf.net/) +[PostScript, PostScript, Image] Title - Title: NimbusSanL-ReguCondItal +[PostScript, PostScript, Time] CreationDate - Create Date: Sat Sep 4 16:12:41 2004 +[PostScript, PostScript, Image] Creator - Creator: frob +[Font, Font, Document] FontType - Font Type: 1 +[Font, Font, Document] FontName - Font Name: NimbusSanL-ReguCondItal +[Font, Font, Document] version - Version: 1.06 +[Font, Font, Author] Notice - Notice: Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development; Cyrillic glyphs added by Valek Filippov (C) 2001-2004 +[Font, Font, Document] FullName - Full Name: Nimbus Sans L Condensed Regular Italic +[Font, Font, Document] FamilyName - Font Family: Nimbus Sans L Condensed +[Font, Font, Document] Weight - Weight: Regular +[Font, Font, Document] FSType - FS Type: 12 +[Font, Font, Document] ItalicAngle - Italic Angle: -9.9 +[Font, Font, Document] isFixedPitch - Is Fixed Pitch: false +[Font, Font, Document] UnderlinePosition - Underline Position: -100 +[Font, Font, Document] UnderlineThickness - Underline Thickness: 50 diff --git a/t/Font_6.out b/t/Font_6.out new file mode 100644 index 0000000..60631fc --- /dev/null +++ b/t/Font_6.out @@ -0,0 +1,37 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: Font.pfm +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 240 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:01:18 14:10:30-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:16-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: PFM +[File, File, Other] FileTypeExtension - File Type Extension: pfm +[File, File, Other] MIMEType - MIME Type: application/x-font-type1 +[Font, Font, Document] 0 - PFM Version: 1.00 +[Font, Font, Author] 6 - Copyright: Copyright URW Software, Copyright 1992 by URW +[Font, Font, Document] 66 - Font Type: 129 +[Font, Font, Document] 68 - Point Size: 10 +[Font, Font, Document] 70 - Y Resolution: 300 +[Font, Font, Document] 72 - X Resolution: 300 +[Font, Font, Document] 74 - Ascent: 700 +[Font, Font, Document] 76 - Internal Leading: 0 +[Font, Font, Document] 78 - External Leading: 0 +[Font, Font, Document] 80 - Italic: 0 +[Font, Font, Document] 81 - Underline: 0 +[Font, Font, Document] 82 - Strikeout: 0 +[Font, Font, Document] 83 - Weight: 600 +[Font, Font, Document] 85 - Character Set: 0 +[Font, Font, Document] 86 - Pix Width: 0 +[Font, Font, Document] 88 - Pix Height: 0 +[Font, Font, Document] 90 - Pitch And Family: 1 +[Font, Font, Document] 91 - Avg Width: 578 +[Font, Font, Document] 93 - Max Width: 1092 +[Font, Font, Document] 95 - First Char: 32 +[Font, Font, Document] 96 - Last Char: 255 +[Font, Font, Document] 97 - Default Char: 32 +[Font, Font, Document] 98 - Break Char: 0 +[Font, Font, Document] 99 - Width Bytes: 0 +[Font, Font, Document] fontname - Font Name: URWGroT +[Font, Font, Document] postfont - PostScript Font Name: URWGroteskT-Bold diff --git a/t/Font_7.out b/t/Font_7.out new file mode 100644 index 0000000..2c9b431 --- /dev/null +++ b/t/Font_7.out @@ -0,0 +1,37 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: Font.ttf +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1252 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:01:21 09:37:50-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:16-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: TTF +[File, File, Other] FileTypeExtension - File Type Extension: ttf +[File, File, Other] MIMEType - MIME Type: application/x-font-ttf +[Font, Font, Author] 0 - Copyright: © Apple Computer, Inc. 1991-1995 +[Font, Font, Document] 1 - Font Family: Raanana +[Font, Font, Document] 2 - Font Subfamily: Regular +[Font, Font, Document] 3 - Font Subfamily ID: Raanana; 5.0d2e1; Wed, May 26, 2004 +[Font, Font, Document] 4 - Font Name: Raanana +[Font, Font, Document] 5 - Name Table Version: 5.0d2e1 +[Font, Font, Document] 6 - PostScript Font Name: Raanana +[Font, Font, Document] 8 - Manufacturer: Apple Computer, Inc. +[Font, Font, Document] 2-fr - Font Subfamily (fr): Régulier +[Font, Font, Document] 2-de - Font Subfamily (de): Normal +[Font, Font, Document] 2-it - Font Subfamily (it): Regolare +[Font, Font, Document] 2-nl-NL - Font Subfamily (nl-NL): Regelmatig +[Font, Font, Document] 2-sv - Font Subfamily (sv): Normalt +[Font, Font, Document] 2-es - Font Subfamily (es): Normal +[Font, Font, Document] 2-da - Font Subfamily (da): Almindelig +[Font, Font, Document] 2-pt - Font Subfamily (pt): Normal +[Font, Font, Document] 2-no - Font Subfamily (no): Vanlig +[Font, Font, Document] 2-fi - Font Subfamily (fi): Normaali +[Font, Font, Document] 2-ja - Font Subfamily (ja): レギュラー +[Font, Font, Document] 2-zh-TW - Font Subfamily (zh-TW): 標準體 +[Font, Font, Document] 2-ko - Font Subfamily (ko): ì¼ë°˜ +[Font, Font, Author] 0-he - Copyright (he): (c) Apple Computer, Inc. 1991-1995 +[Font, Font, Document] 1-he - Font Family (he): רעננה +[Font, Font, Document] 2-he - Font Subfamily (he): Regular +[Font, Font, Document] 4-he - Font Name (he): רעננה +[Font, Font, Document] 2-zh-CN - Font Subfamily (zh-CN): 常规 diff --git a/t/FotoStation.t b/t/FotoStation.t new file mode 100644 index 0000000..83d4043 --- /dev/null +++ b/t/FotoStation.t @@ -0,0 +1,39 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/FotoStation.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::FotoStation; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'FotoStation'; +my $testnum = 1; + +# test 2: Extract information from FotoStation.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/FotoStation.jpg', {Duplicates => 1}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Test writing some information +{ + ++$testnum; + my @writeInfo = ( + ['Rotation' => 0 ], + ['Keywords' => 'FotoStation' ], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, undef, 1); + print "ok $testnum\n"; +} + +# end diff --git a/t/FotoStation_2.out b/t/FotoStation_2.out new file mode 100644 index 0000000..5f09c9b --- /dev/null +++ b/t/FotoStation_2.out @@ -0,0 +1,41 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: FotoStation.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 4.3 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:10:28 14:44:59-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:36-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[FotoStation, FotoStation, Image] 0 - Original Image Width: 1536 +[FotoStation, FotoStation, Image] 1 - Original Image Height: 1024 +[FotoStation, FotoStation, Image] 2 - Color Planes: 3 +[FotoStation, FotoStation, Image] 3 - XY Resolution: 38.626 +[FotoStation, FotoStation, Image] 4 - Rotation: 90 +[FotoStation, FotoStation, Image] 6 - Crop Left: 18.422% +[FotoStation, FotoStation, Image] 7 - Crop Top: 24.458% +[FotoStation, FotoStation, Image] 8 - Crop Right: 83.035% +[FotoStation, FotoStation, Image] 9 - Crop Bottom: 77.817% +[FotoStation, FotoStation, Image] 11 - Crop Rotation: 0 +[IPTC, IPTC2, Other] 0 - Application Record Version: 2 +[IPTC, IPTC2, Other] 7 - Edit Status: Edit Status +[IPTC, IPTC2, Other] 10 - Urgency: 1 (most urgent) +[IPTC, IPTC2, Other] 15 - Category: Cat +[IPTC, IPTC2, Other] 120 - Caption-Abstract: Caption *** Local Caption *** Local Caption +[IPTC, IPTC2, Other] 40 - Special Instructions: Special Instructions +[IPTC, IPTC2, Other] 75 - Object Cycle: Unknown (Afternoon) +[IPTC, IPTC2, Other] 103 - Original Transmission Reference: OTR +[IPTC, IPTC2, Image] 200 - Object Preview File Format: Unknown (Custom Field 01) +[IPTC, IPTC2, Image] 201 - Object Preview File Version: Custom Field 02 +[IPTC, IPTC2, Preview] 202 - Object Preview Data: (Binary data 15 bytes) +[IPTC, IPTC2, Other] 230 - Document Notes: Document Notes +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/FotoStation_3.out b/t/FotoStation_3.out new file mode 100644 index 0000000..7c1552b --- /dev/null +++ b/t/FotoStation_3.out @@ -0,0 +1,3 @@ +[IPTC, IPTC, Other] 25 - Keywords: FotoStation +[IPTC, IPTC2, Other] 25 - Keywords: FotoStation +[FotoStation, FotoStation, Image] 4 - Rotation: 0 diff --git a/t/FujiFilm.t b/t/FujiFilm.t new file mode 100644 index 0000000..9223464 --- /dev/null +++ b/t/FujiFilm.t @@ -0,0 +1,79 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/FujiFilm.t". + +BEGIN { + $| = 1; print "1..6\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::FujiFilm; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'FujiFilm'; +my $testnum = 1; + +# test 2: Extract information from FujiFilm.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/FujiFilm.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + ['CreateDate','2005:01:06 11:51:09'], + ['WhiteBalance', 'day white', 'Group', 'MakerNotes'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 4: Extract information from FujiFilm.raf +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my @tags = qw(-filename -directory -filemodifydate -fileaccessdate + -filecreatedate -fileinodechangedate -filepermissions); + my $info = $exifTool->ImageInfo('t/images/FujiFilm.raf', @tags, {Duplicates=>1}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# tests 5-6: Write writing a RAF and changing it back again in memory +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + # set IgnoreMinorErrors option to allow invalid JpgFromRaw to be written + $exifTool->SetNewValue(UserComment => 'test comment'); + my $testfile = "t/${testname}_${testnum}_failed.raf"; + unlink $testfile; + $exifTool->WriteInfo('t/images/FujiFilm.raf', $testfile); + my $info = $exifTool->ImageInfo($testfile, 'UserComment'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + + ++$testnum; + my $outfile; + # pad out comment to make image the same size as the original + $exifTool->SetNewValue(UserComment => ' ' x 248); + $exifTool->WriteInfo($testfile, \$outfile); + $info = $exifTool->ImageInfo(\$outfile, {Duplicates=>1}); + if (check($exifTool, $info, $testname, $testnum, 4)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + + + +# end diff --git a/t/FujiFilm_2.out b/t/FujiFilm_2.out new file mode 100644 index 0000000..b8278a7 --- /dev/null +++ b/t/FujiFilm_2.out @@ -0,0 +1,89 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: FujiFilm.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1373 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:06-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Modify Date: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1.6 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 1600 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1200 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, FujiFilm, Camera] 0 - Version: 0130 +[MakerNotes, FujiFilm, Camera] 4096 - Quality: NORMAL +[MakerNotes, FujiFilm, Camera] 4097 - Sharpness: 0 (normal) +[MakerNotes, FujiFilm, Camera] 4098 - White Balance: Auto +[MakerNotes, FujiFilm, Camera] 4112 - Fuji Flash Mode: Red-eye reduction +[MakerNotes, FujiFilm, Camera] 4113 - Flash Exposure Comp: 0 +[MakerNotes, FujiFilm, Camera] 4128 - Macro: Off +[MakerNotes, FujiFilm, Camera] 4129 - Focus Mode: Auto +[MakerNotes, FujiFilm, Camera] 4144 - Slow Sync: Off +[MakerNotes, FujiFilm, Camera] 4145 - Picture Mode: Auto +[MakerNotes, FujiFilm, Camera] 4352 - Auto Bracketing: Off +[MakerNotes, FujiFilm, Camera] 4864 - Blur Warning: None +[MakerNotes, FujiFilm, Camera] 4865 - Focus Warning: Good +[MakerNotes, FujiFilm, Camera] 4866 - Exposure Warning: Good +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 6.6 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/64 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.005 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 48.9 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 6.0 mm (35 mm equivalent: 39.6 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 2.26 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.6 diff --git a/t/FujiFilm_3.out b/t/FujiFilm_3.out new file mode 100644 index 0000000..91f6745 --- /dev/null +++ b/t/FujiFilm_3.out @@ -0,0 +1,90 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: FujiFilm_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 1373 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:07:29 09:04:06-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:06-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2020:07:29 09:04:06-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Modify Date: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2005:01:06 11:51:09 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1.6 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 1600 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1200 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, FujiFilm, Camera] 0 - Version: 0130 +[MakerNotes, FujiFilm, Camera] 4096 - Quality: NORMAL +[MakerNotes, FujiFilm, Camera] 4097 - Sharpness: 0 (normal) +[MakerNotes, FujiFilm, Camera] 4098 - White Balance: Day White Fluorescent +[MakerNotes, FujiFilm, Camera] 4112 - Fuji Flash Mode: Red-eye reduction +[MakerNotes, FujiFilm, Camera] 4113 - Flash Exposure Comp: 0 +[MakerNotes, FujiFilm, Camera] 4128 - Macro: Off +[MakerNotes, FujiFilm, Camera] 4129 - Focus Mode: Auto +[MakerNotes, FujiFilm, Camera] 4144 - Slow Sync: Off +[MakerNotes, FujiFilm, Camera] 4145 - Picture Mode: Auto +[MakerNotes, FujiFilm, Camera] 4352 - Auto Bracketing: Off +[MakerNotes, FujiFilm, Camera] 4608 - Fuji Film 0x1200: 0 +[MakerNotes, FujiFilm, Camera] 4864 - Blur Warning: None +[MakerNotes, FujiFilm, Camera] 4865 - Focus Warning: Good +[MakerNotes, FujiFilm, Camera] 4866 - Exposure Warning: Good +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/64 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.6 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 6.6 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.005 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 48.9 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 6.0 mm (35 mm equivalent: 39.6 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 2.26 m diff --git a/t/FujiFilm_4.out b/t/FujiFilm_4.out new file mode 100644 index 0000000..0415892 --- /dev/null +++ b/t/FujiFilm_4.out @@ -0,0 +1,147 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileSize - File Size: 38 kB +[File, File, Other] FileType - File Type: RAF +[File, File, Other] FileTypeExtension - File Type Extension: raf +[File, File, Other] MIMEType - MIME Type: image/x-fujifilm-raf +[File, File, Image] RAFVersion - RAF Version: 0106 +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[File, File, Preview] PreviewImage - Preview Image: (Binary data 12167 bytes) +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix S5Pro +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Digital Camera FinePix S5Pro Ver1.06 +[EXIF, IFD0, Time] 306 - Modify Date: 2007:05:22 13:58:30 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/250 +[EXIF, ExifIFD, Image] 33437 - F Number: 8.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Manual +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2007:05:22 13:58:30 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2007:05:22 13:58:30 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 3 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/256 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 8.0 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 8.41 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 70.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 1440 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 960 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 630 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 630 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 105 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, ExifIFD, Camera] 41996 - Subject Distance Range: Unknown +[EXIF, GPS, Location] 0 - GPS Version ID: 2.2.0.0 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 2704 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 9362 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 9362 bytes) +[MakerNotes, FujiFilm, Camera] 0 - Version: 0130 +[MakerNotes, FujiFilm, Camera] 16 - Internal Serial Number: FPX20582698 Y-1146 2007:02:19 8C0020100A84 +[MakerNotes, FujiFilm, Camera] 4096 - Quality: NORMAL +[MakerNotes, FujiFilm, Camera] 4097 - Sharpness: 0 (normal) +[MakerNotes, FujiFilm, Camera] 4098 - White Balance: Auto +[MakerNotes, FujiFilm, Camera] 4099 - Saturation: 0 (normal) +[MakerNotes, FujiFilm, Camera] 4100 - Contrast: Normal +[MakerNotes, FujiFilm, Camera] 4106 - White Balance Fine Tune: Red +0, Blue +0 +[MakerNotes, FujiFilm, Camera] 4107 - Noise Reduction: Normal +[MakerNotes, FujiFilm, Camera] 4112 - Fuji Flash Mode: Off +[MakerNotes, FujiFilm, Camera] 4113 - Flash Exposure Comp: 0 +[MakerNotes, FujiFilm, Camera] 4129 - Focus Mode: Auto +[MakerNotes, FujiFilm, Camera] 4130 - AF Mode: Single Point +[MakerNotes, FujiFilm, Camera] 4144 - Slow Sync: Off +[MakerNotes, FujiFilm, Camera] 4145 - Picture Mode: Manual +[MakerNotes, FujiFilm, Camera] 4146 - Exposure Count: 1 +[MakerNotes, FujiFilm, Camera] 4352 - Auto Bracketing: Off +[MakerNotes, FujiFilm, Camera] 4353 - Sequence Number: 0 +[MakerNotes, FujiFilm, Camera] 5120 - Dynamic Range: Wide +[MakerNotes, FujiFilm, Camera] 5121 - Film Mode: F0/Standard (Provia) +[MakerNotes, FujiFilm, Camera] 5122 - Dynamic Range Setting: Auto +[MakerNotes, FujiFilm, Camera] 5124 - Min Focal Length: 28 +[MakerNotes, FujiFilm, Camera] 5125 - Max Focal Length: 70 +[MakerNotes, FujiFilm, Camera] 5126 - Max Aperture At Min Focal: 2.8 +[MakerNotes, FujiFilm, Camera] 5127 - Max Aperture At Max Focal: 2.8 +[MakerNotes, FujiFilm, Camera] 16640 - Faces Detected: 0 +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[RAF, RAF, Image] 256 - Raw Image Full Size: 4352x1444 +[RAF, RAF, Image] 272 - Raw Image Crop Top Left: 10 48 +[RAF, RAF, Image] 273 - Raw Image Cropped Size: 4256x1424 +[RAF, RAF, Image] 289 - Raw Image Size: 4288x1440 +[RAF, RAF, Image] 304 - Fuji Layout: 1 2 1 0 +[RAF, RAF, Image] 8192 - WB GRGB Levels Auto: 384 601 384 515 +[RAF, RAF, Image] 8448 - WB GRGB Levels Daylight: 384 601 384 515 +[RAF, RAF, Image] 8704 - WB GRGB Levels Cloudy: 384 679 384 438 +[RAF, RAF, Image] 8960 - WB GRGB Levels Daylight Fluor: 384 775 384 460 +[RAF, RAF, Image] 8961 - WB GRGB Levels Day White Fluor: 384 648 384 573 +[RAF, RAF, Image] 8962 - WB GRGB Levels White Fluorescent: 384 644 384 711 +[RAF, RAF, Image] 8976 - WB GRGB Levels Warm White Fluor: 384 509 384 878 +[RAF, RAF, Image] 8977 - WB GRGB Levels Living Room Warm White Fluor: 384 419 384 920 +[RAF, RAF, Image] 9216 - WB GRGB Levels Tungsten: 384 384 384 832 +[RAF, RAF, Image] 12272 - WB GRGB Levels: 384 601 384 515 +[RAF, RAF, Image] 37376 - Relative Exposure: 0 +[RAF, RAF, Image] 38480 - Raw Exposure Bias: 0 +[RAF, RAF2, Image] 256 - Raw Image Full Size: 4352x1444 +[RAF, RAF2, Image] 272 - Raw Image Crop Top Left: 10 48 +[RAF, RAF2, Image] 273 - Raw Image Cropped Size: 4256x1424 +[RAF, RAF2, Image] 289 - Raw Image Size: 4284x1440 +[RAF, RAF2, Image] 304 - Fuji Layout: 1 2 1 0 +[RAF, RAF2, Image] 8192 - WB GRGB Levels Auto: 384 685 384 603 +[RAF, RAF2, Image] 8448 - WB GRGB Levels Daylight: 384 685 384 603 +[RAF, RAF2, Image] 8704 - WB GRGB Levels Cloudy: 384 774 384 513 +[RAF, RAF2, Image] 8960 - WB GRGB Levels Daylight Fluor: 384 883 384 539 +[RAF, RAF2, Image] 8961 - WB GRGB Levels Day White Fluor: 384 739 384 671 +[RAF, RAF2, Image] 8962 - WB GRGB Levels White Fluorescent: 384 734 384 833 +[RAF, RAF2, Image] 8976 - WB GRGB Levels Warm White Fluor: 384 580 384 1028 +[RAF, RAF2, Image] 8977 - WB GRGB Levels Living Room Warm White Fluor: 384 477 384 1078 +[RAF, RAF2, Image] 9216 - WB GRGB Levels Tungsten: 384 438 384 975 +[RAF, RAF2, Image] 12272 - WB GRGB Levels: 384 685 384 603 +[RAF, RAF2, Image] 37376 - Relative Exposure: -4.0 +[RAF, RAF2, Image] 38480 - Raw Exposure Bias: 0 +[Composite, Composite, Image] Exif-Aperture - Aperture: 8.0 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/250 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.341146 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 4256x1424 +[Composite, Composite, Image] Exif-LightValue - Light Value: 14.0 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 6.1 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 1.565104 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.5 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.020 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 19.5 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 70.0 mm (35 mm equivalent: 105.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 30.58 m diff --git a/t/FujiFilm_5.out b/t/FujiFilm_5.out new file mode 100644 index 0000000..6abb011 --- /dev/null +++ b/t/FujiFilm_5.out @@ -0,0 +1 @@ +[EXIF, ExifIFD, Image] 37510 - User Comment: test comment diff --git a/t/GE.t b/t/GE.t new file mode 100644 index 0000000..9d2729e --- /dev/null +++ b/t/GE.t @@ -0,0 +1,47 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/GE.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::GE; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'GE'; +my $testnum = 1; + +# test 2: Extract information from GE.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Unknown => 1); + my $info = $exifTool->ImageInfo('t/images/GE.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue(GEModel => 'test model'); + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->WriteInfo('t/images/GE.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile,{Duplicates=>1,Unknown=>1}); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + + +# end diff --git a/t/GE_2.out b/t/GE_2.out new file mode 100644 index 0000000..2e9a3be --- /dev/null +++ b/t/GE_2.out @@ -0,0 +1,86 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[ExifTool, ExifTool, ExifTool] Warning - Warning: [minor] Suspicious MakerNotes offset for GE_0x0200 +[ExifTool, ExifTool, ExifTool] Warning - Warning: [minor] Suspicious MakerNotes offset for GE_0x0206 +[File, System, Other] FileName - File Name: GE.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1467 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:12:14 19:15:30-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:06-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[JFIF, JFIF, Image] 0 - JFIF Version: 1.01 +[JFIF, JFIF, Image] 2 - Resolution Unit: inches +[JFIF, JFIF, Image] 3 - X Resolution: 96 +[JFIF, JFIF, Image] 5 - Y Resolution: 96 +[EXIF, IFD0, Image] 270 - Image Description: GE DIGITAL CAMERA +[EXIF, IFD0, Camera] 271 - Make: General Imaging Co. +[EXIF, IFD0, Camera] 272 - Camera Model Name: E1035 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 96 +[EXIF, IFD0, Image] 283 - Y Resolution: 96 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: GIMP 2.6.3 +[EXIF, IFD0, Time] 306 - Modify Date: 2009:07:05 23:58:52 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/77 +[EXIF, ExifIFD, Image] 33437 - F Number: 5.1 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 64 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2008:09:17 04:18:57 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2008:09:17 04:18:57 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/77 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 5.1 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 5.1 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Average +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Auto, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 22.5 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: R: 139 G: 255 B: 189 X:39852 Y: 0 S: 0 Zs: 6 Zp: 115 F: 531 I: 1 ImgVer:08.01.09.10 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 0 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 0 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 1 +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: None +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 0.01041666667 +[EXIF, IFD1, Image] 283 - Y Resolution: 0.01041666667 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1190 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, GE, Camera] 260 - GE 0x0104: 1694568960 +[MakerNotes, GE, Camera] 514 - Macro: Off +[MakerNotes, GE, Camera] 515 - GE 0x0203: 0 +[MakerNotes, GE, Camera] 516 - GE 0x0204: 1 +[MakerNotes, GE, Camera] 517 - GE 0x0205: 9.47 +[MakerNotes, GE, Camera] 519 - GE Model: E1035 +[MakerNotes, GE, Camera] 768 - GE Make: GE DIGITAL CAMERA +[MakerNotes, GE, Camera] 1280 - GE 0x0500: 0 +[MakerNotes, GE, Camera] 1536 - GE 0x0600: 0 +[Composite, Composite, Image] Exif-Aperture - Aperture: 5.1 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/77 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 22.5 mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 11.6 diff --git a/t/GE_3.out b/t/GE_3.out new file mode 100644 index 0000000..86644c9 --- /dev/null +++ b/t/GE_3.out @@ -0,0 +1,86 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: GE_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 1483 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:07:29 09:04:07-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:07-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2020:07:29 09:04:07-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[JFIF, JFIF, Image] 0 - JFIF Version: 1.01 +[JFIF, JFIF, Image] 2 - Resolution Unit: inches +[JFIF, JFIF, Image] 3 - X Resolution: 96 +[JFIF, JFIF, Image] 5 - Y Resolution: 96 +[EXIF, IFD0, Image] 270 - Image Description: GE DIGITAL CAMERA +[EXIF, IFD0, Camera] 271 - Make: General Imaging Co. +[EXIF, IFD0, Camera] 272 - Camera Model Name: E1035 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 96 +[EXIF, IFD0, Image] 283 - Y Resolution: 96 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: GIMP 2.6.3 +[EXIF, IFD0, Time] 306 - Modify Date: 2009:07:05 23:58:52 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/77 +[EXIF, ExifIFD, Image] 33437 - F Number: 5.1 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 64 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2008:09:17 04:18:57 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2008:09:17 04:18:57 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/77 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 5.1 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 5.1 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Average +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Auto, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 22.5 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: R: 139 G: 255 B: 189 X:39852 Y: 0 S: 0 Zs: 6 Zp: 115 F: 531 I: 1 ImgVer:08.01.09.10 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 0 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 0 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 1 +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: None +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 0.01041666667 +[EXIF, IFD1, Image] 283 - Y Resolution: 0.01041666667 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1206 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, GE, Camera] 260 - GE 0x0104: 1694568960 +[MakerNotes, GE, Camera] 512 - GE 0x0200: 673605 0 16777216 +[MakerNotes, GE, Camera] 514 - Macro: Off +[MakerNotes, GE, Camera] 515 - GE 0x0203: 0 +[MakerNotes, GE, Camera] 516 - GE 0x0204: 1 +[MakerNotes, GE, Camera] 517 - GE 0x0205: 9.47 +[MakerNotes, GE, Camera] 518 - GE 0x0206: 10 18245 0 0 256 0 +[MakerNotes, GE, Camera] 519 - GE Model: test model +[MakerNotes, GE, Camera] 768 - GE Make: GE DIGITAL CAMERA +[MakerNotes, GE, Camera] 1280 - GE 0x0500: 0 +[MakerNotes, GE, Camera] 1536 - GE 0x0600: 0 +[Composite, Composite, Image] Exif-Aperture - Aperture: 5.1 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/77 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 22.5 mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 11.6 diff --git a/t/GIF.t b/t/GIF.t new file mode 100644 index 0000000..5c458c6 --- /dev/null +++ b/t/GIF.t @@ -0,0 +1,84 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/GIF.t". + +BEGIN { + $| = 1; print "1..5\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::GIF; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'GIF'; +my $testnum = 1; + +# test 2: GIF file using data in memory +{ + ++$testnum; + open(TESTFILE, 't/images/GIF.gif'); + binmode(TESTFILE); + my $gifImage; + read(TESTFILE, $gifImage, 100000); + close(TESTFILE); + my $info = ImageInfo(\$gifImage); + print 'not ' unless check($info, $testname, $testnum); + print "ok $testnum\n"; +} + +# tests 3-5: Test adding/editing/deleting various types of metadata for GIF images in memory +{ + ++$testnum; + open(TESTFILE, 't/images/GIF.gif'); + binmode(TESTFILE); + my $gifImage; + read(TESTFILE, $gifImage, 100000); + close(TESTFILE); + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue(Comment => 'a new comment'); + $exifTool->SetNewValue(City => 'Kingston'); + my $image1; + $exifTool->WriteInfo(\$gifImage, \$image1); + $info = ImageInfo(\$image1); + print 'not ' unless check($info, $testname, $testnum); + print "ok $testnum\n"; + + ++$testnum; + $exifTool->SetNewValue(); # clear previous new values + $exifTool->SetNewValue('all'); # delete everything... + # add back some XMP tags + $exifTool->SetNewValue(Comment => 'x'); + $exifTool->SetNewValue(Subject => ['one','two','three']); + $exifTool->SetNewValue(Country => 'Canada'); + my $image2; + $exifTool->WriteInfo(\$image1, \$image2); + $info = ImageInfo(\$image2); + print 'not ' unless check($info, $testname, $testnum); + print "ok $testnum\n"; + + ++$testnum; + $info = ImageInfo(\$gifImage, 'Comment', 'XMP', 'ICC_Profile'); + $exifTool->SetNewValue(); # clear previous new values + $exifTool->SetNewValue(Comment => $$info{Comment}); + $exifTool->SetNewValue(XMP => $$info{XMP}, Protected => 1); + $exifTool->SetNewValue(ICC_Profile => $$info{ICC_Profile}, Protected => 1); + my $image3; + $exifTool->WriteInfo(\$image2, \$image3); + my $testfile = "t/${testname}_${testnum}_failed.gif"; + if ($image3 eq $gifImage) { + unlink $testfile; + } else { + # save the bad image + open(TESTFILE,">$testfile"); + binmode(TESTFILE); + print TESTFILE $image3; + close(TESTFILE); + print 'not '; + } + print "ok $testnum\n"; +} + +# end diff --git a/t/GIF_2.out b/t/GIF_2.out new file mode 100644 index 0000000..17ed71a --- /dev/null +++ b/t/GIF_2.out @@ -0,0 +1,43 @@ +BackgroundColor: 0 +BitsPerPixel: 8 +BlueMatrixColumn: 0.1492 0.06322 0.74463 +BlueTRC: (Binary data 14 bytes) +CMMFlags: Not Embedded, Independent +ColorResolutionDepth: 8 +ColorSpaceData: RGB +Comment: SCANNERMAKER: Canon;;SCANNER: Canon EOS DIGITAL REBEL;;SOFTWARE: GraphicConverter;;DATE: 2004:02:20 08:07:49;;DESCRIPTION: The picture caption;;;;Ignored Tags: $02BC, $9000, $9004, $9101, $9286, $A000, $A001, $A002, $A003, $A20E, $A20F, $A210, $A217, $A300, $A401, $A402, $A403, $A406;; +ConnectionSpaceIlluminant: 0.9642 1 0.82491 +DeviceAttributes: Reflective, Glossy, Positive, Color +DeviceManufacturer: none +DeviceModel: +ExifToolVersion: 12.42 +FileSize: 2.3 kB +FileType: GIF +FileTypeExtension: gif +GIFVersion: 89a +GreenMatrixColumn: 0.20525 0.62566 0.06087 +GreenTRC: (Binary data 14 bytes) +HasColorMap: Yes +ImageHeight: 8 +ImageSize: 8x8 +ImageWidth: 8 +MIMEType: image/gif +MediaWhitePoint: 0.9505 1 1.0891 +Megapixels: 0.000064 +PixelAspectRatio: 1 +PrimaryPlatform: Apple Computer Inc. +ProfileCMMType: Nikon Corporation +ProfileClass: Display Device Profile +ProfileConnectionSpace: XYZ +ProfileCopyright: Nikon Inc. & Nikon Corporation 2001 +ProfileCreator: +ProfileDateTime: 1999:12:07 18:59:22 +ProfileDescription: Nikon Adobe RGB 4.0.0.3000 +ProfileFileSignature: acsp +ProfileID: 0 +ProfileVersion: 2.2.0 +RedMatrixColumn: 0.60976 0.31113 0.01947 +RedTRC: (Binary data 14 bytes) +RenderingIntent: Perceptual +Title: GIF with XMP +XMPToolkit: Image::ExifTool 7.27 diff --git a/t/GIF_3.out b/t/GIF_3.out new file mode 100644 index 0000000..278496f --- /dev/null +++ b/t/GIF_3.out @@ -0,0 +1,44 @@ +BackgroundColor: 0 +BitsPerPixel: 8 +BlueMatrixColumn: 0.1492 0.06322 0.74463 +BlueTRC: (Binary data 14 bytes) +CMMFlags: Not Embedded, Independent +City: Kingston +ColorResolutionDepth: 8 +ColorSpaceData: RGB +Comment: a new comment +ConnectionSpaceIlluminant: 0.9642 1 0.82491 +DeviceAttributes: Reflective, Glossy, Positive, Color +DeviceManufacturer: none +DeviceModel: +ExifToolVersion: 12.42 +FileSize: 4.6 kB +FileType: GIF +FileTypeExtension: gif +GIFVersion: 89a +GreenMatrixColumn: 0.20525 0.62566 0.06087 +GreenTRC: (Binary data 14 bytes) +HasColorMap: Yes +ImageHeight: 8 +ImageSize: 8x8 +ImageWidth: 8 +MIMEType: image/gif +MediaWhitePoint: 0.9505 1 1.0891 +Megapixels: 0.000064 +PixelAspectRatio: 1 +PrimaryPlatform: Apple Computer Inc. +ProfileCMMType: Nikon Corporation +ProfileClass: Display Device Profile +ProfileConnectionSpace: XYZ +ProfileCopyright: Nikon Inc. & Nikon Corporation 2001 +ProfileCreator: +ProfileDateTime: 1999:12:07 18:59:22 +ProfileDescription: Nikon Adobe RGB 4.0.0.3000 +ProfileFileSignature: acsp +ProfileID: 0 +ProfileVersion: 2.2.0 +RedMatrixColumn: 0.60976 0.31113 0.01947 +RedTRC: (Binary data 14 bytes) +RenderingIntent: Perceptual +Title: GIF with XMP +XMPToolkit: Image::ExifTool 12.42 diff --git a/t/GIF_4.out b/t/GIF_4.out new file mode 100644 index 0000000..34166af --- /dev/null +++ b/t/GIF_4.out @@ -0,0 +1,19 @@ +BackgroundColor: 0 +BitsPerPixel: 8 +ColorResolutionDepth: 8 +Comment: x +Country: Canada +ExifToolVersion: 12.42 +FileSize: 4.1 kB +FileType: GIF +FileTypeExtension: gif +GIFVersion: 89a +HasColorMap: Yes +ImageHeight: 8 +ImageSize: 8x8 +ImageWidth: 8 +MIMEType: image/gif +Megapixels: 0.000064 +PixelAspectRatio: 1 +Subject: one, two, three +XMPToolkit: Image::ExifTool 12.42 diff --git a/t/GIMP.t b/t/GIMP.t new file mode 100644 index 0000000..f043bbc --- /dev/null +++ b/t/GIMP.t @@ -0,0 +1,28 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/GIMP.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::GIMP; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'GIMP'; +my $testnum = 1; + +# test 2: Extract information from GIMP.xcf +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/GIMP.xcf'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/GIMP_2.out b/t/GIMP_2.out new file mode 100644 index 0000000..6883aa1 --- /dev/null +++ b/t/GIMP_2.out @@ -0,0 +1,67 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: GIMP.xcf +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 2.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:12:04 21:22:58-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:38-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: XCF +[File, File, Other] FileTypeExtension - File Type Extension: xcf +[File, File, Other] MIMEType - MIME Type: image/x-xcf +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[GIMP, GIMP, Image] 9 - XCF Version: 0 +[GIMP, GIMP, Image] 14 - Image Width: 8 +[GIMP, GIMP, Image] 18 - Image Height: 8 +[GIMP, GIMP, Image] 22 - Color Mode: RGB Color +[GIMP, GIMP, Image] 17 - Compression: RLE Encoding +[GIMP, GIMP, Image] 0 - X Resolution: 72 +[GIMP, GIMP, Image] 1 - Y Resolution: 72 +[GIMP, GIMP, Image] 20 - Tattoo: 2 +[GIMP, GIMP, Image] 22 - Units: Inches +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: ExifTool XCF test +[XMP, XMP-dc, Author] rights - Rights: Free for all +[XMP, XMP-dc, Image] title - Title: Test Picture +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[EXIF, IFD0, Image] 270 - Image Description: This is a teeny weeny white square +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:18 08:27:14 +[EXIF, IFD0, Author] 315 - Artist: Phil Harvey +[EXIF, IFD0, Author] 33432 - Copyright: Free for all +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: Uncalibrated +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 8 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 8 +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Nikon Corporation +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.2.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1999:12:07 18:59:22 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Apple Computer Inc. +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: none +[ICC_Profile, ICC-header, Image] 52 - Device Model: +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: Nikon Adobe RGB 4.0.0.3000 +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.60976 0.31113 0.01947 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.20525 0.62566 0.06087 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.1492 0.06322 0.74463 +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.9505 1 1.0891 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Nikon Inc. & Nikon Corporation 2001 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/GPS.t b/t/GPS.t new file mode 100644 index 0000000..f64fe7e --- /dev/null +++ b/t/GPS.t @@ -0,0 +1,47 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/GPS.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::GPS; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'GPS'; +my $testnum = 1; + +# test 2: Extract information from GPS.jpg with specified coordinate format +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(CoordFormat => '%d degrees %.2f minutes'); + my $info = $exifTool->ImageInfo('t/images/GPS.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + if (eval { require Time::Local }) { + my @writeInfo = ( + ['GPSLatitude' => "12 deg 21' 23.345"], + ['GPSLatitudeRef' => 'south' ], + ['GPSTimeStamp' => '2007:03:02 18:46:10.55-05:30' ], + ['GPSDateStamp' => '2007:03:02 18:46:10.55-05:30' ], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; + } else { + print "ok $testnum # skip Requires Time::Local\n"; + } +} + + +# end diff --git a/t/GPS_2.out b/t/GPS_2.out new file mode 100644 index 0000000..478dea1 --- /dev/null +++ b/t/GPS_2.out @@ -0,0 +1,96 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: GPS.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 2.1 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2008:10:14 11:39:46-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:38-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 09f7f522cf163e96cf778a81de1a9c2b +[File, File, Image] ImageWidth - Image Width: 120 +[File, File, Image] ImageHeight - Image Height: 80 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: Communications +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePixS1Pro +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 300 +[EXIF, IFD0, Image] 283 - Y Resolution: 300 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2002:07:19 13:28:10 +[EXIF, IFD0, Author] 315 - Artist: Ian Britton +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Image] 532 - Reference Black White: 0 255 128 255 128 255 +[EXIF, IFD0, Author] 33432 - Copyright: ian Britton - FreeFoto.com +[EXIF, ExifIFD, Image] 33437 - F Number: 0.64 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Shutter speed priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 0 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0200 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2002:07:13 15:58:28 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2002:07:13 15:58:28 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/724 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 16.0 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 0.26015625 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: -0.65 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 0.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2400 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1600 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 12.05078125 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 12.05078125 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Unknown (0) +[EXIF, ExifIFD, Image] 41729 - Scene Type: Unknown (0) +[EXIF, GPS, Location] 0 - GPS Version ID: 2.0.0.0 +[EXIF, GPS, Location] 1 - GPS Latitude Ref: North +[EXIF, GPS, Location] 2 - GPS Latitude: 54 degrees 59.38 minutes +[EXIF, GPS, Location] 3 - GPS Longitude Ref: West +[EXIF, GPS, Location] 4 - GPS Longitude: 1 degrees 54.85 minutes +[EXIF, GPS, Time] 7 - GPS Time Stamp: 14:58:24 +[EXIF, GPS, Location] 18 - GPS Map Datum: WGS84 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1050 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: Communications +[IPTC, IPTC, Author] 122 - Writer-Editor: Ian Britton +[IPTC, IPTC, Other] 105 - Headline: Communications +[IPTC, IPTC, Author] 80 - By-line: Ian Britton +[IPTC, IPTC, Author] 85 - By-line Title: Photographer +[IPTC, IPTC, Author] 110 - Credit: Ian Britton +[IPTC, IPTC, Author] 115 - Source: FreeFoto.com +[IPTC, IPTC, Other] 5 - Object Name: Communications +[IPTC, IPTC, Time] 55 - Date Created: 2002:06:20 +[IPTC, IPTC, Location] 90 - City: +[IPTC, IPTC, Location] 95 - Province-State: +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: United Kingdom +[IPTC, IPTC, Other] 15 - Category: BUS +[IPTC, IPTC, Other] 20 - Supplemental Categories: Communications +[IPTC, IPTC, Other] 10 - Urgency: 5 (normal urgency) +[IPTC, IPTC, Other] 25 - Keywords: Communications +[IPTC, IPTC, Author] 116 - Copyright Notice: ian Britton - FreeFoto.com +[Composite, Composite, Image] Exif-Aperture - Aperture: 0.64 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 120x80 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.010 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/724 +[Composite, Composite, Location] GPS-GPSLatitude - GPS Latitude: 54 degrees 59.38 minutes N +[Composite, Composite, Location] GPS-GPSLongitude - GPS Longitude: 1 degrees 54.85 minutes W +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 0.0 mm +[Composite, Composite, Location] Exif-GPSPosition - GPS Position: 54 degrees 59.38 minutes N, 1 degrees 54.85 minutes W diff --git a/t/GPS_3.out b/t/GPS_3.out new file mode 100644 index 0000000..a13e83a --- /dev/null +++ b/t/GPS_3.out @@ -0,0 +1,98 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: GPS_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 2.2 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:38-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:38-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:38-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 09f7f522cf163e96cf778a81de1a9c2b +[File, File, Image] ImageWidth - Image Width: 120 +[File, File, Image] ImageHeight - Image Height: 80 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: Communications +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePixS1Pro +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 300 +[EXIF, IFD0, Image] 283 - Y Resolution: 300 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2002:07:19 13:28:10 +[EXIF, IFD0, Author] 315 - Artist: Ian Britton +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Image] 532 - Reference Black White: 0 255 128 255 128 255 +[EXIF, IFD0, Author] 33432 - Copyright: ian Britton - FreeFoto.com +[EXIF, ExifIFD, Image] 33437 - F Number: 0.64 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Shutter speed priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 0 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0200 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2002:07:13 15:58:28 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2002:07:13 15:58:28 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/724 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 16.0 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 0.26015625 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: -0.65 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 0.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2400 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1600 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 12.05078125 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 12.05078125 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Unknown (0) +[EXIF, ExifIFD, Image] 41729 - Scene Type: Unknown (0) +[EXIF, GPS, Location] 0 - GPS Version ID: 2.0.0.0 +[EXIF, GPS, Location] 1 - GPS Latitude Ref: South +[EXIF, GPS, Location] 2 - GPS Latitude: 12 deg 21' 23.34" +[EXIF, GPS, Location] 3 - GPS Longitude Ref: West +[EXIF, GPS, Location] 4 - GPS Longitude: 1 deg 54' 51.00" +[EXIF, GPS, Time] 7 - GPS Time Stamp: 00:16:10.55 +[EXIF, GPS, Location] 18 - GPS Map Datum: WGS84 +[EXIF, GPS, Time] 29 - GPS Date Stamp: 2007:03:03 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1074 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: Communications +[IPTC, IPTC, Author] 122 - Writer-Editor: Ian Britton +[IPTC, IPTC, Other] 105 - Headline: Communications +[IPTC, IPTC, Author] 80 - By-line: Ian Britton +[IPTC, IPTC, Author] 85 - By-line Title: Photographer +[IPTC, IPTC, Author] 110 - Credit: Ian Britton +[IPTC, IPTC, Author] 115 - Source: FreeFoto.com +[IPTC, IPTC, Other] 5 - Object Name: Communications +[IPTC, IPTC, Time] 55 - Date Created: 2002:06:20 +[IPTC, IPTC, Location] 90 - City: +[IPTC, IPTC, Location] 95 - Province-State: +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: United Kingdom +[IPTC, IPTC, Other] 15 - Category: BUS +[IPTC, IPTC, Other] 20 - Supplemental Categories: Communications +[IPTC, IPTC, Other] 10 - Urgency: 5 (normal urgency) +[IPTC, IPTC, Other] 25 - Keywords: Communications +[IPTC, IPTC, Author] 116 - Copyright Notice: ian Britton - FreeFoto.com +[Composite, Composite, Image] Exif-Aperture - Aperture: 0.64 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 120x80 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.010 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/724 +[Composite, Composite, Time] GPS-GPSDateTime - GPS Date/Time: 2007:03:03 00:16:10.55Z +[Composite, Composite, Location] GPS-GPSLatitude - GPS Latitude: 12 deg 21' 23.34" S +[Composite, Composite, Location] GPS-GPSLongitude - GPS Longitude: 1 deg 54' 51.00" W +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 0.0 mm +[Composite, Composite, Location] Exif-GPSPosition - GPS Position: 12 deg 21' 23.34" S, 1 deg 54' 51.00" W diff --git a/t/GeoTiff.t b/t/GeoTiff.t new file mode 100644 index 0000000..6ee2c13 --- /dev/null +++ b/t/GeoTiff.t @@ -0,0 +1,54 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/GeoTiff.t". + +BEGIN { + $| = 1; print "1..4\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::GeoTiff; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'GeoTiff'; +my $testnum = 1; + +# test 2: Extract information from GeoTiff.tif +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/GeoTiff.tif'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = (['ResolutionUnit','cm']); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/GeoTiff.tif'); + print "ok $testnum\n"; +} + +# test 4: Copy GeoTiff information +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.out"; + unlink $testfile; + $exifTool->SetNewValuesFromFile('t/images/GeoTiff.tif', 'GeoTiff*'); + my $ok = writeInfo($exifTool,'t/images/ExifTool.tif',$testfile); + my $info = $exifTool->ImageInfo($testfile, 'GeoTiff:*'); + if (check($exifTool, $info, $testname, $testnum) and $ok) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + + +# end diff --git a/t/GeoTiff_2.out b/t/GeoTiff_2.out new file mode 100644 index 0000000..eb19e3f --- /dev/null +++ b/t/GeoTiff_2.out @@ -0,0 +1,38 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: GeoTiff.tif +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 2.7 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2005:11:14 14:47:21-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:37-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: TIFF +[File, File, Other] FileTypeExtension - File Type Extension: tif +[File, File, Other] MIMEType - MIME Type: image/tiff +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[EXIF, IFD0, Image] 256 - Image Width: 25 +[EXIF, IFD0, Image] 257 - Image Height: 24 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 +[EXIF, IFD0, Image] 259 - Compression: Uncompressed +[EXIF, IFD0, Image] 262 - Photometric Interpretation: RGB Palette +[EXIF, IFD0, Image] 273 - Strip Offsets: 2060 +[EXIF, IFD0, Image] 278 - Rows Per Strip: 24 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 600 +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 320 - Color Map: (Binary data 1536 bytes) +[EXIF, IFD0, Location] 34264 - Model Transform: 33.4179196429669 35.8363313794284 0 691955.165684031 35.8363313794284 -33.4179196429669 0 2791710.99012603 0 0 0 0 0 0 0 1 +[GeoTiff, GeoTiff, Location] 1 - Geo Tiff Version: 1.1.0 +[GeoTiff, GeoTiff, Location] 1024 - GT Model Type: Projected +[GeoTiff, GeoTiff, Location] 1025 - GT Raster Type: Pixel Is Area +[GeoTiff, GeoTiff, Location] 2048 - Geographic Type: User Defined +[GeoTiff, GeoTiff, Location] 2049 - Geog Citation: Hough UTM zone 17N +[GeoTiff, GeoTiff, Location] 2050 - Geog Geodetic Datum: User Defined +[GeoTiff, GeoTiff, Location] 2057 - Geog Semi Major Axis: 6378270 +[GeoTiff, GeoTiff, Location] 2058 - Geog Semi Minor Axis: 6356794.343479 +[GeoTiff, GeoTiff, Location] 3072 - Projected CS Type: User Defined +[GeoTiff, GeoTiff, Location] 3073 - PCS Citation: Hough UTM zone 17N +[GeoTiff, GeoTiff, Location] 3074 - Projection: UTM zone 17N +[Composite, Composite, Image] Exif-ImageSize - Image Size: 25x24 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000600 diff --git a/t/GeoTiff_3.out b/t/GeoTiff_3.out new file mode 100644 index 0000000..2a5cc59 --- /dev/null +++ b/t/GeoTiff_3.out @@ -0,0 +1,38 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: GeoTiff_3_failed.tif +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 2.7 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:38-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:38-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:38-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: TIFF +[File, File, Other] FileTypeExtension - File Type Extension: tif +[File, File, Other] MIMEType - MIME Type: image/tiff +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[EXIF, IFD0, Image] 256 - Image Width: 25 +[EXIF, IFD0, Image] 257 - Image Height: 24 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 +[EXIF, IFD0, Image] 259 - Compression: Uncompressed +[EXIF, IFD0, Image] 262 - Photometric Interpretation: RGB Palette +[EXIF, IFD0, Image] 273 - Strip Offsets: 2054 +[EXIF, IFD0, Image] 278 - Rows Per Strip: 24 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 600 +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: cm +[EXIF, IFD0, Image] 320 - Color Map: (Binary data 1536 bytes) +[EXIF, IFD0, Location] 34264 - Model Transform: 33.4179196429669 35.8363313794284 0 691955.165684031 35.8363313794284 -33.4179196429669 0 2791710.99012603 0 0 0 0 0 0 0 1 +[GeoTiff, GeoTiff, Location] 1 - Geo Tiff Version: 1.1.0 +[GeoTiff, GeoTiff, Location] 1024 - GT Model Type: Projected +[GeoTiff, GeoTiff, Location] 1025 - GT Raster Type: Pixel Is Area +[GeoTiff, GeoTiff, Location] 2048 - Geographic Type: User Defined +[GeoTiff, GeoTiff, Location] 2049 - Geog Citation: Hough UTM zone 17N +[GeoTiff, GeoTiff, Location] 2050 - Geog Geodetic Datum: User Defined +[GeoTiff, GeoTiff, Location] 2057 - Geog Semi Major Axis: 6378270 +[GeoTiff, GeoTiff, Location] 2058 - Geog Semi Minor Axis: 6356794.343479 +[GeoTiff, GeoTiff, Location] 3072 - Projected CS Type: User Defined +[GeoTiff, GeoTiff, Location] 3073 - PCS Citation: Hough UTM zone 17N +[GeoTiff, GeoTiff, Location] 3074 - Projection: UTM zone 17N +[Composite, Composite, Image] Exif-ImageSize - Image Size: 25x24 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000600 diff --git a/t/GeoTiff_4.out b/t/GeoTiff_4.out new file mode 100644 index 0000000..f4aa7dc --- /dev/null +++ b/t/GeoTiff_4.out @@ -0,0 +1,11 @@ +[GeoTiff, GeoTiff, Location] 1 - Geo Tiff Version: 1.1.0 +[GeoTiff, GeoTiff, Location] 1024 - GT Model Type: Projected +[GeoTiff, GeoTiff, Location] 1025 - GT Raster Type: Pixel Is Area +[GeoTiff, GeoTiff, Location] 2048 - Geographic Type: User Defined +[GeoTiff, GeoTiff, Location] 2049 - Geog Citation: Hough UTM zone 17N +[GeoTiff, GeoTiff, Location] 2050 - Geog Geodetic Datum: User Defined +[GeoTiff, GeoTiff, Location] 2057 - Geog Semi Major Axis: 6378270 +[GeoTiff, GeoTiff, Location] 2058 - Geog Semi Minor Axis: 6356794.343479 +[GeoTiff, GeoTiff, Location] 3072 - Projected CS Type: User Defined +[GeoTiff, GeoTiff, Location] 3073 - PCS Citation: Hough UTM zone 17N +[GeoTiff, GeoTiff, Location] 3074 - Projection: UTM zone 17N diff --git a/t/Geotag.t b/t/Geotag.t new file mode 100644 index 0000000..7e4ccf3 --- /dev/null +++ b/t/Geotag.t @@ -0,0 +1,223 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Geotag.t". + +my $numTests; + +BEGIN { + $numTests = 12; + $| = 1; print "1..$numTests\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); + # must create user-defined tags before loading ExifTool (used in test 8) + %Image::ExifTool::UserDefined = ( + 'Image::ExifTool::GPS::Main' => { + 0xd000 => { + Name => 'GPSPitch', + Writable => 'rational64s', + }, + 0xd001 => { + Name => 'GPSRoll', + Writable => 'rational64s', + }, + }, + ); +} +END {print "not ok 1\n" unless $loaded;} +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Geotag; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Geotag'; +my $testnum = 1; +my @testTags = ('Error', 'Warning', 'GPS:*', 'XMP:*'); +my $testfile2; + +unless (eval { require Time::Local }) { + warn "Install Time::Local to use the Geotag feature\n"; + while (++$testnum <= $numTests) { + print "ok $testnum # skip Requires Time::Local\n"; + } + goto IgnoreAll; +} + +# test 2: Geotag from GPX track log +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $testfile2 = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile2; + $exifTool->SetNewValue(Geotag => 't/images/Geotag.gpx'); + $exifTool->SetNewValue(Geotime => '2003:05:24 17:09:31Z'); + $exifTool->WriteInfo('t/images/Writer.jpg', $testfile2); + my $info = $exifTool->ImageInfo($testfile2, @testTags); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# tests 3-5: Geotag tests using Magellan track log +{ + # geotag to XMP + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->SetNewValue(Geotag => 't/images/Geotag.log'); + $exifTool->SetNewValue('XMP:Geotime' => '2009:04:03 06:11:30-05:00'); + $exifTool->WriteInfo('t/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile, @testTags); + if (check($exifTool, $info, $testname, $testnum, 3)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + + # point too far outside track + ++$testnum; + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + my ($num, $err) = $exifTool->SetNewValue(Geotime => '2009:04:03 08:00:00-05:00'); + $exifTool->WriteInfo($testfile2, $testfile); + $info = $exifTool->ImageInfo($testfile, @testTags); + if (check($exifTool, $info, $testname, $testnum, 2)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + + # delete geotags + ++$testnum; + my $testfile5 = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile5; + ($num, $err) = $exifTool->SetNewValue(Geotime => undef); + $exifTool->WriteInfo($testfile2, $testfile5); + $info = $exifTool->ImageInfo($testfile5, 'Filename', @testTags); + if (check($exifTool, $info, $testname, $testnum) and not $err) { + unlink $testfile2; + unlink $testfile5; + } else { + warn "\n $err\n" if $err; + print 'not '; + } + print "ok $testnum\n"; +} + +# test 6: Geotag from Garmin XML track log and test Geosync too +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->SetNewValue(Geosync => '1:30'); + $exifTool->SetNewValue(Geotag => 't/images/Geotag.xml'); + $exifTool->SetNewValuesFromFile('t/images/Panasonic.jpg', + 'Geotime<${DateTimeOriginal}+02:00' + ); + $exifTool->WriteInfo('t/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile, @testTags); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 7: Geotag from IGC log with time drift correction +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + my $txtfile = "t/${testname}_${testnum}.failed"; + unlink $testfile; + open GEOTAG_TEST_7, ">$txtfile" or warn "Error opening $txtfile\n"; + $exifTool->Options(Verbose => 2); + $exifTool->Options(TextOut => \*GEOTAG_TEST_7); + $exifTool->SetNewValue(Geosync => '2010:01:05 07:00:00Z@2001:08:01 12:00:00-02:00'); + $exifTool->SetNewValue(Geosync => '2010:01:05 09:01:00Z@2001:08:01 14:00:00-02:00'); + $exifTool->SetNewValue(Geotag => 't/images/Geotag.igc'); + $exifTool->SetNewValuesFromFile('t/images/Nikon.jpg', + 'Geotime<${DateTimeOriginal}-02:00' + ); + $exifTool->WriteInfo('t/images/Writer.jpg', $testfile); + close GEOTAG_TEST_7; + if (testCompare('t/Geotag_7.out', $txtfile, $testnum)) { + unlink $testfile; + unlink $txtfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 8: Geotag with attitude information from PTNTHPR sentence +# test 9: Geotag from KML track log (obtained from Google Location), +# test 10: Geotag from Bramor gEO log +{ + my %dat = ( + 8 => { file => 'Geotag2.log', geotime => '2010:04:24 06:27:30-05:00' }, + 9 => { file => 'Geotag.kml', geotime => '2013:11:13 09:04:31Z' }, + 10 => { file => 'Geotag3.log', geotime => '2014:04:21 07:06:42Z' }, + ); + my $exifTool = new Image::ExifTool; + while ($testnum < 10) { + ++$testnum; + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->SetNewValue(Geotag => 't/images/' . $dat{$testnum}{file}); + $exifTool->SetNewValue(Geotime => $dat{$testnum}{geotime}); + $exifTool->WriteInfo('t/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile, @testTags); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + } +} + +# test 11: Geotag date/time only with drift correction +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->SetNewValue(Geotag => 'DATETIMEONLY'); + $exifTool->SetNewValue(Geosync => '2009:01:01 01:00:00Z@2009:01:01 01:00:00Z'); + $exifTool->SetNewValue(Geosync => '2011:01:01 02:00:00Z@2011:01:01 01:00:00Z'); + $exifTool->SetNewValue(Geotime => '2010:01:01 01:00:00Z'); + $exifTool->WriteInfo('t/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile, @testTags); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 12: Geotag from DJI CSV log file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->SetNewValue(Geotag => 't/images/Geotag_DJI_2020-12-02_[07-50-31].csv'); + $exifTool->SetNewValue(Geotime => '2020:12:02 07:50:35.3'); + $exifTool->WriteInfo('t/images/Writer.jpg', $testfile); + # (ignore GPSDate/TimeStamp because they will depend on the system time zone) + my $info = $exifTool->ImageInfo($testfile, 'gps:all', '-gpstimestamp', '-gpsdatestamp'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +IgnoreAll: + +# end diff --git a/t/Geotag_10.out b/t/Geotag_10.out new file mode 100644 index 0000000..432b24b --- /dev/null +++ b/t/Geotag_10.out @@ -0,0 +1,15 @@ +[EXIF, GPS, Location] 0 - GPS Version ID: 2.3.0.0 +[EXIF, GPS, Location] 1 - GPS Latitude Ref: North +[EXIF, GPS, Location] 2 - GPS Latitude: 42 deg 43' 17.99" +[EXIF, GPS, Location] 3 - GPS Longitude Ref: East +[EXIF, GPS, Location] 4 - GPS Longitude: 61 deg 40' 19.30" +[EXIF, GPS, Location] 5 - GPS Altitude Ref: Above Sea Level +[EXIF, GPS, Location] 6 - GPS Altitude: 250 m +[EXIF, GPS, Time] 7 - GPS Time Stamp: 07:06:42 +[EXIF, GPS, Location] 14 - GPS Track Ref: True North +[EXIF, GPS, Location] 15 - GPS Track: 21.94 +[EXIF, GPS, Location] 16 - GPS Img Direction Ref: True North +[EXIF, GPS, Location] 17 - GPS Img Direction: 21.94 +[EXIF, GPS, Time] 29 - GPS Date Stamp: 2014:04:21 +[EXIF, GPS, Location] 53248 - GPS Pitch: 7.33 +[EXIF, GPS, Location] 53249 - GPS Roll: 1.26 diff --git a/t/Geotag_11.out b/t/Geotag_11.out new file mode 100644 index 0000000..6c4ce32 --- /dev/null +++ b/t/Geotag_11.out @@ -0,0 +1,3 @@ +[EXIF, GPS, Location] 0 - GPS Version ID: 2.3.0.0 +[EXIF, GPS, Time] 7 - GPS Time Stamp: 01:30:00 +[EXIF, GPS, Time] 29 - GPS Date Stamp: 2010:01:01 diff --git a/t/Geotag_12.out b/t/Geotag_12.out new file mode 100644 index 0000000..394594d --- /dev/null +++ b/t/Geotag_12.out @@ -0,0 +1,5 @@ +[EXIF, GPS, Location] 0 - GPS Version ID: 2.3.0.0 +[EXIF, GPS, Location] 1 - GPS Latitude Ref: South +[EXIF, GPS, Location] 2 - GPS Latitude: 44 deg 41' 24.32" +[EXIF, GPS, Location] 3 - GPS Longitude Ref: East +[EXIF, GPS, Location] 4 - GPS Longitude: 170 deg 25' 28.45" diff --git a/t/Geotag_2.out b/t/Geotag_2.out new file mode 100644 index 0000000..d3d7354 --- /dev/null +++ b/t/Geotag_2.out @@ -0,0 +1,9 @@ +[EXIF, GPS, Location] 0 - GPS Version ID: 2.3.0.0 +[EXIF, GPS, Location] 1 - GPS Latitude Ref: North +[EXIF, GPS, Location] 2 - GPS Latitude: 43 deg 38' 30.66" +[EXIF, GPS, Location] 3 - GPS Longitude Ref: West +[EXIF, GPS, Location] 4 - GPS Longitude: 116 deg 3' 44.05" +[EXIF, GPS, Location] 5 - GPS Altitude Ref: Above Sea Level +[EXIF, GPS, Location] 6 - GPS Altitude: 1485.648936 m +[EXIF, GPS, Time] 7 - GPS Time Stamp: 17:09:31 +[EXIF, GPS, Time] 29 - GPS Date Stamp: 2003:05:24 diff --git a/t/Geotag_3.out b/t/Geotag_3.out new file mode 100644 index 0000000..e502f6e --- /dev/null +++ b/t/Geotag_3.out @@ -0,0 +1,6 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 7.77 +[XMP, XMP-exif, Location] GPSAltitude - GPS Altitude: 103.647 m +[XMP, XMP-exif, Location] GPSAltitudeRef - GPS Altitude Ref: Above Sea Level +[XMP, XMP-exif, Location] GPSLatitude - GPS Latitude: 44 deg 14' 10.30" N +[XMP, XMP-exif, Location] GPSLongitude - GPS Longitude: 76 deg 30' 56.52" W +[XMP, XMP-exif, Time] GPSTimeStamp - GPS Date/Time: 2009:04:03 11:11:30 diff --git a/t/Geotag_5.out b/t/Geotag_5.out new file mode 100644 index 0000000..aef72a4 --- /dev/null +++ b/t/Geotag_5.out @@ -0,0 +1 @@ +[File, System, Other] FileName - File Name: Geotag_5_failed.jpg diff --git a/t/Geotag_6.out b/t/Geotag_6.out new file mode 100644 index 0000000..d8a2b25 --- /dev/null +++ b/t/Geotag_6.out @@ -0,0 +1,9 @@ +[EXIF, GPS, Location] 0 - GPS Version ID: 2.3.0.0 +[EXIF, GPS, Location] 1 - GPS Latitude Ref: North +[EXIF, GPS, Location] 2 - GPS Latitude: 43 deg 38' 59.51" +[EXIF, GPS, Location] 3 - GPS Longitude Ref: West +[EXIF, GPS, Location] 4 - GPS Longitude: 79 deg 34' 59.54" +[EXIF, GPS, Location] 5 - GPS Altitude Ref: Above Sea Level +[EXIF, GPS, Location] 6 - GPS Altitude: 145.9518987 m +[EXIF, GPS, Time] 7 - GPS Time Stamp: 13:57:16 +[EXIF, GPS, Time] 29 - GPS Date Stamp: 2004:08:28 diff --git a/t/Geotag_7.out b/t/Geotag_7.out new file mode 100644 index 0000000..1b72abd --- /dev/null +++ b/t/Geotag_7.out @@ -0,0 +1,58 @@ +Added Geosync point: + GPS time stamp: 2010:01:05 07:00:00.000 UTC + Image date/time: 2001:08:01 14:00:00.000 UTC +Writing File:Geosync +Added Geosync point: + GPS time stamp: 2010:01:05 09:01:00.000 UTC + Image date/time: 2001:08:01 16:00:00.000 UTC +Writing File:Geosync +Loaded 10 points from IGC-format GPS track log file 't/images/Geotag.igc' + GPS track start: 2010:01:05 07:23:15.000 UTC + GPS track end: 2010:01:05 08:52:56.000 UTC +Writing File:Geotag + Geotime value: 2010:01:05 07:57:51.692 UTC (incl. Geosync offset of +266000428.692 sec) +Writing Composite:GPSLatitude if tag exists +Writing GPS:GPSLatitude +Writing GPS:GPSLatitudeRef +Writing MIE-GPS:GPSLatitude +Writing XMP-drone-dji:GPSLatitude if tag exists +Writing XMP-exif:GPSLatitude if tag exists +Writing Composite:GPSLongitude if tag exists +Writing GPS:GPSLongitude +Writing GPS:GPSLongitudeRef +Writing MIE-GPS:GPSLongitude +Writing XMP-drone-dji:GPSLongitude if tag exists +Writing XMP-exif:GPSLongitude if tag exists +Writing MIE-GPS:GPSAltitude +Writing XMP-exif:GPSAltitude if tag exists +Writing GPS:GPSAltitude +Writing XMP-exif:GPSAltitudeRef if tag exists +Writing GPS:GPSAltitudeRef +Writing GPS:GPSLatitudeRef +Writing GPS:GPSLongitudeRef +Writing GPS:GPSDateStamp +Writing GPS:GPSTimeStamp +Writing XMP-exif:GPSDateTime if tag exists +Rewriting t/images/Writer.jpg... + Editing tags in: APP0 APP1 Composite File GPS IFD0 JFIF MIE-GPS XMP + Creating tags in: APP1 File GPS IFD0 MIE-GPS +Creating APP1: + Creating IFD0 + + IFD0:XResolution = '72' (mandatory) + + IFD0:YResolution = '72' (mandatory) + + IFD0:ResolutionUnit = '2' (mandatory) + + IFD0:YCbCrPositioning = '1' (mandatory) + Creating GPS + + GPS:GPSVersionID = '2 3 0 0' (mandatory) + + GPS:GPSLatitudeRef = 'N' + + GPS:GPSLatitude = '49 10 45.9657779460145' + + GPS:GPSLongitudeRef = 'E' + + GPS:GPSLongitude = '6 51 35.6260862642929' + + GPS:GPSAltitudeRef = '0' + + GPS:GPSAltitude = '848.896982535614' + + GPS:GPSTimeStamp = '07 57 51.69167' + + GPS:GPSDateStamp = '2010:01:05' +JPEG DQT (130 bytes): +JPEG SOF0: +JPEG DHT (73 bytes): +JPEG SOS diff --git a/t/Geotag_8.out b/t/Geotag_8.out new file mode 100644 index 0000000..322c7e3 --- /dev/null +++ b/t/Geotag_8.out @@ -0,0 +1,15 @@ +[EXIF, GPS, Location] 0 - GPS Version ID: 2.3.0.0 +[EXIF, GPS, Location] 1 - GPS Latitude Ref: North +[EXIF, GPS, Location] 2 - GPS Latitude: 50 deg 40' 16.53" +[EXIF, GPS, Location] 3 - GPS Longitude Ref: East +[EXIF, GPS, Location] 4 - GPS Longitude: 5 deg 6' 0.43" +[EXIF, GPS, Time] 7 - GPS Time Stamp: 11:27:30 +[EXIF, GPS, Location] 12 - GPS Speed Ref: knots +[EXIF, GPS, Location] 13 - GPS Speed: 28.37631579 +[EXIF, GPS, Location] 14 - GPS Track Ref: True North +[EXIF, GPS, Location] 15 - GPS Track: 138.8394737 +[EXIF, GPS, Location] 16 - GPS Img Direction Ref: True North +[EXIF, GPS, Location] 17 - GPS Img Direction: 256.3315789 +[EXIF, GPS, Time] 29 - GPS Date Stamp: 2010:04:24 +[EXIF, GPS, Location] 53248 - GPS Pitch: -4.152631579 +[EXIF, GPS, Location] 53249 - GPS Roll: -10.18421053 diff --git a/t/Geotag_9.out b/t/Geotag_9.out new file mode 100644 index 0000000..53c1d20 --- /dev/null +++ b/t/Geotag_9.out @@ -0,0 +1,7 @@ +[EXIF, GPS, Location] 0 - GPS Version ID: 2.3.0.0 +[EXIF, GPS, Location] 1 - GPS Latitude Ref: North +[EXIF, GPS, Location] 2 - GPS Latitude: 34 deg 9' 55.90" +[EXIF, GPS, Location] 3 - GPS Longitude Ref: West +[EXIF, GPS, Location] 4 - GPS Longitude: 106 deg 1' 37.01" +[EXIF, GPS, Time] 7 - GPS Time Stamp: 09:04:31 +[EXIF, GPS, Time] 29 - GPS Date Stamp: 2013:11:13 diff --git a/t/GoPro.t b/t/GoPro.t new file mode 100644 index 0000000..4068dbe --- /dev/null +++ b/t/GoPro.t @@ -0,0 +1,30 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/GoPro.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::GoPro; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'GoPro'; +my $testnum = 1; + +# test 2: Extract information from GoPro.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Unknown => 1); + my $info = $exifTool->ImageInfo('t/images/GoPro.jpg', 'GoPro:all'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/GoPro_2.out b/t/GoPro_2.out new file mode 100644 index 0000000..ea72725 --- /dev/null +++ b/t/GoPro_2.out @@ -0,0 +1,30 @@ +[APP6, GoPro, Camera] DVID - Device ID: 1 +[APP6, GoPro, Camera] DVNM - Device Name: Photo Global Settings +[APP6, GoPro, Camera] TICK - GoPro TICK: 85473 +[APP6, GoPro, Camera] TSMP - Total Samples: 192 +[APP6, GoPro, Camera] TICK - GoPro TICK: 85473 +[APP6, GoPro, Camera] FMWR - Firmware Version: HD6.01.01.51.00 +[APP6, GoPro, Camera] LINF - GoPro LINF: LAJ7061317601275 +[APP6, GoPro, Camera] CINF - GoPro CINF: 60 49 27 73 22 20 157 168 225 252 86 165 90 126 204 208 +[APP6, GoPro, Camera] CASN - Camera Serial Number: C3221324657219 +[APP6, GoPro, Camera] MINF - Camera Model Name: HERO6 Black +[APP6, GoPro, Camera] MUID - Media Unique ID: 491b313ca89d1416a556fce1d0cc7e5a00000000000000000000000000000000 +[APP6, GoPro, Camera] CMOD - GoPro CMOD: 17 +[APP6, GoPro, Camera] MTYP - GoPro MTYP: 11 +[APP6, GoPro, Camera] OREN - Auto Rotation: Up +[APP6, GoPro, Camera] DZOM - Digital Zoom: Yes +[APP6, GoPro, Camera] DZST - GoPro DZST: 0 +[APP6, GoPro, Camera] SMTR - GoPro SMTR: N +[APP6, GoPro, Camera] PRTN - Pro Tune: On +[APP6, GoPro, Camera] PTWB - White Balance: AUTO +[APP6, GoPro, Camera] PTSH - Sharpness: HIGH +[APP6, GoPro, Camera] PTCL - Color Mode: FLAT +[APP6, GoPro, Camera] EXPT - Maximum Shutter Angle: +[APP6, GoPro, Camera] PIMX - Auto ISO Max: 3200 +[APP6, GoPro, Camera] PIMN - Auto ISO Min: 3200 +[APP6, GoPro, Camera] PTEV - Exposure Compensation: 0.0 +[APP6, GoPro, Camera] RATE - Rate: 4_1SEC +[APP6, GoPro, Camera] PRES - Photo Resolution: 12MP_W +[APP6, GoPro, Camera] PHDR - HDR Setting: 0 +[APP6, GoPro, Camera] PRAW - GoPro PRAW: 0 +[APP6, GoPro, Camera] HFLG - GoPro HFLG: 0 diff --git a/t/HTML.t b/t/HTML.t new file mode 100644 index 0000000..3773868 --- /dev/null +++ b/t/HTML.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/HTML.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::HTML; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'HTML'; +my $testnum = 1; + +# test 2: Extract information from HTML.html +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/HTML.html'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/HTML_2.out b/t/HTML_2.out new file mode 100644 index 0000000..1631fd5 --- /dev/null +++ b/t/HTML_2.out @@ -0,0 +1,69 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: HTML.html +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 3.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:06:28 20:35:26-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:38-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: HTML +[File, File, Other] FileTypeExtension - File Type Extension: html +[File, File, Other] MIMEType - MIME Type: text/html +[HTML, HTML, Document] title - Title: ExifTool HTML Test +[HTML, HTTP-equiv, Document] content-type - Content Type: text/html; charset="iso-8859-1" +[HTML, HTML-dc, Document] title - Title: ExifTool HTML Test +[HTML, HTML-dc, Author] creator - Creator: Phil Harvey, Another Creator +[HTML, HTML-dc, Time] date - Date: 2007-30-01 +[HTML, HTML-dc, Document] format - Format: Daisy 2.02 +[HTML, HTML-dc, Document] identifier - Identifier: DTB00345 +[HTML, HTML-dc, Document] language - Language: EN +[HTML, HTML-dc, Author] publisher - Publisher: TPB +[HTML, HTML-dc, Author] source - Source: 0-065-01022-1 +[HTML, HTML-dc, Document] subject - Subject: Greek: α β γ +[HTML, HTML-ncc, Time] sourcedate - Source Date: 1993 +[HTML, HTML-ncc, Document] sourceedition - Source Edition: 1 +[HTML, HTML-ncc, Document] sourcepublisher - Source Publisher: Phil's Desktop +[HTML, HTML-ncc, Document] charset - Character Set: iso-8859-1 +[HTML, HTML-ncc, Document] generator - Generator: ExifTool 6.73 +[HTML, HTML-ncc, Document] narrator - Narrator: a narrator +[HTML, HTML-ncc, Document] tocitems - TOC Items: 1024 +[HTML, HTML-ncc, Document] totaltime - Duration: 91:27:21 +[HTML, HTML-ncc, Document] pagenormal - Page Normal: 881 +[HTML, HTML-ncc, Document] maxpagenormal - Max Page Normal: 881 +[HTML, HTML-ncc, Document] pagefront - Page Front: 27 +[HTML, HTML-ncc, Document] pagespecial - Page Special: 45 +[HTML, HTML-ncc, Document] prodnotes - Prod Notes: 0 +[HTML, HTML-ncc, Document] footnotes - Footnotes: 0 +[HTML, HTML-ncc, Document] sidebars - Sidebars: 0 +[HTML, HTML-ncc, Document] setinfo - Set Info: 1 of 3 +[HTML, HTML-ncc, Document] depth - Depth: 4 +[HTML, HTML-ncc, Document] kbytesize - K Byte Size: 1530000 +[HTML, HTML-ncc, Document] multimediatype - Multimedia Type: audioNCC +[HTML, HTML-ncc, Document] files - Files: 97 +[HTML, HTML-prod, Document] reclocation - Rec Location: Studio 2 +[HTML, HTML-prod, Document] recengineer - Rec Engineer: P Harvey +[HTML, HTML-office, Document] Subject - Subject: a subject +[HTML, HTML-office, Author] Author - Author: an author +[HTML, HTML-office, Document] Keywords - Keywords: keyword1, keyword2 +[HTML, HTML-office, Document] Description - Description: a comments;a new line +[HTML, HTML-office, Document] Template - Template: Normal.dotm +[HTML, HTML-office, Author] LastAuthor - Last Author: Phil Harvey +[HTML, HTML-office, Document] Revision - Revision Number: 2 +[HTML, HTML-office, Document] TotalTime - Total Edit Time: 1 minute +[HTML, HTML-office, Time] Created - Create Date: 2010:06:28 23:52:00Z +[HTML, HTML-office, Time] LastSaved - Modify Date: 2010:06:28 23:52:00Z +[HTML, HTML-office, Document] Pages - Pages: 1 +[HTML, HTML-office, Document] Words - Words: 84 +[HTML, HTML-office, Document] Characters - Characters: 324 +[HTML, HTML-office, Document] Category - Category: a catégory +[HTML, HTML-office, Document] Manager - Manager: a manager +[HTML, HTML-office, Document] Company - Company: a company +[HTML, HTML-office, Document] Lines - Lines: 26 +[HTML, HTML-office, Document] Paragraphs - Paragraphs: 26 +[HTML, HTML-office, Document] CharactersWithSpaces - Characters With Spaces: 382 +[HTML, HTML-office, Document] Version - Revision Number: 12.0 +[HTML, HTML-office, Document] Checked_x0020_by - Checked By: Phil +[HTML, HTML-office, Document] test1 - Test 1: 1 +[HTML, HTML-office, Document] test2 - Test 2: 15 +[HTML, HTML-office, Document] test3 - Test 3: 2010-02-05T05:00:00Z +[HTML, HTML-office, Document] test4 - Test 4: text diff --git a/t/IPTC.t b/t/IPTC.t new file mode 100644 index 0000000..9c14632 --- /dev/null +++ b/t/IPTC.t @@ -0,0 +1,158 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/IPTC.t". + +BEGIN { + $| = 1; print "1..8\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::IPTC; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'IPTC'; +my $testnum = 1; + +# test 2: Extract information from IPTC.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/IPTC.jpg', {Duplicates => 1}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Test GetValue() in list context +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->ExtractInfo('t/images/IPTC.jpg', {JoinLists => 0}); + my @values = $exifTool->GetValue('Keywords','ValueConv'); + my $values = join '-', @values; + my $expected = 'ExifTool-Test-IPTC'; + unless ($values eq $expected) { + warn "\n Test $testnum differs with \"$values\"\n"; + print 'not '; + } + print "ok $testnum\n"; +} + +# test 4: Test rewriting everything with slightly different values +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Duplicates => 1, Binary => 1, ListJoin => undef); + my $info = $exifTool->ImageInfo('t/images/IPTC.jpg'); + my $tag; + foreach $tag (keys %$info) { + my $group = $exifTool->GetGroup($tag); + my $val = $$info{$tag}; + if (ref $val eq 'ARRAY') { + push @$val, 'v2'; + } elsif (ref $val eq 'SCALAR') { + $val = 'v2'; + } elsif ($val =~ /^\d+(\.\d*)?$/) { + # (add extra .001 to avoid problem with aperture of 4.85 + # getting rounded to 4.8 or 4.9 and causing failed tests) + $val += ($val / 10) + 1.001; + $1 or $val = int($val); + } else { + $val .= '-v2'; + } + # eat return values so warnings don't get printed + my @x = $exifTool->SetNewValue($tag, $val, Group=>$group, Replace=>1); + } + # also try writing a few specific tags + $exifTool->SetNewValue(CreatorCountry => 'Canada'); + $exifTool->SetNewValue(CodedCharacterSet => 'UTF8', Protected => 1); + undef $info; + my $image; + my $ok = writeInfo($exifTool, 't/images/IPTC.jpg', \$image, undef, 1); + # this is effectively what the RHEL 3 UTF8 LANG problem does: + # $image = pack("U*", unpack("C*", $image)); + + my $exifTool2 = new Image::ExifTool; + $exifTool2->Options(Duplicates => 1); + $info = $exifTool2->ImageInfo(\$image); + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + if (check($exifTool2, $info, $testname, $testnum) and $ok) { + unlink $testfile; + } else { + # save bad file + open(TESTFILE,">$testfile"); + binmode(TESTFILE); + print TESTFILE $image; + close(TESTFILE); + print 'not '; + } + print "ok $testnum\n"; +} + +# test 5: Test IPTC special characters +{ + ++$testnum; + my @writeInfo = ( + # (don't put special character hex codes in string in an attempt to patch failed + # test by dcollins on Perl 5.95 and i686-linux-thread-multi 2.6.28-11-generic) + # ['IPTC:CopyrightNotice' => chr(0xc2) . chr(0xa9) . " 2008 Phil Harvey"], + # - didn't fix it, so change it back again: + # (dcollins is the only tester with this problem) + ['IPTC:CopyrightNotice' => "\xc2\xa9 2008 Phil Harvey"], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/Writer.jpg', 1); + print "ok $testnum\n"; +} + +# test 6: Write and read using different default IPTC encoding +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->Options(Charset => 'Cyrillic'); + $exifTool->SetNewValuesFromFile('t/images/MIE.mie', 'Comment-ru_RU>Caption-Abstract'); + $exifTool->Options(IPTCCharset => 'Cyrillic'); + my $ok = writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + $exifTool->Options(Charset => 'UTF8'); + my $info = $exifTool->ImageInfo($testfile, 'IPTC:*'); + if (check($exifTool, $info, $testname, $testnum) and $ok) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 7: Replace an entry in a list +{ + ++$testnum; + my @writeInfo = ( + ['IPTC:Keywords' => 'Test', DelValue => 1], + ['IPTC:Keywords' => 'One'], + ['IPTC:Keywords' => 'Two'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/IPTC.jpg', 1); + print "ok $testnum\n"; +} + +# test 8: Write IPTC as a block +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->SetNewValuesFromFile('t/images/IPTC.jpg', 'IPTC'); + my $ok = writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile, 'IPTC:*'); + if (check($exifTool, $info, $testname, $testnum) and $ok) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# end diff --git a/t/IPTC_2.out b/t/IPTC_2.out new file mode 100644 index 0000000..d713822 --- /dev/null +++ b/t/IPTC_2.out @@ -0,0 +1,70 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[ExifTool, ExifTool, ExifTool] Warning - Warning: IPTCDigest is not current. XMP may be out of sync +[File, System, Other] FileName - File Name: IPTC.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 9.9 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:12:04 21:22:58-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:39-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 3ab612778f9944a999853a0cf0cf6b37 +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[JFIF, JFIF, Image] 0 - JFIF Version: 1.02 +[JFIF, JFIF, Image] 2 - Resolution Unit: inches +[JFIF, JFIF, Image] 3 - X Resolution: 72 +[JFIF, JFIF, Image] 5 - Y Resolution: 72 +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: A witty caption +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it +[IPTC, IPTC, Other] 105 - Headline: No headline +[IPTC, IPTC, Other] 40 - Special Instructions: What instructions +[IPTC, IPTC, Author] 80 - By-line: Phil Harvey +[IPTC, IPTC, Author] 85 - By-line Title: My Position +[IPTC, IPTC, Author] 110 - Credit: My Credit +[IPTC, IPTC, Other] 5 - Object Name: Test IPTC picture +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ont +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 103 - Original Transmission Reference: What is a transmission reference +[IPTC, IPTC, Other] 15 - Category: 1 +[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing, image, utilities +[IPTC, IPTC, Other] 25 - Keywords: ExifTool, Test, IPTC +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright 2004 Phil Harvey +[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Author] 115 - Source: I'm the source +[Photoshop, Photoshop, Image] 1061 - IPTC Digest: 05ad1770b1a95f1f9788ac995fa647da +[Photoshop, Photoshop, Image] 0 - X Resolution: 72 +[Photoshop, Photoshop, Image] 2 - Displayed Units X: inches +[Photoshop, Photoshop, Image] 4 - Y Resolution: 72 +[Photoshop, Photoshop, Image] 6 - Displayed Units Y: inches +[Photoshop, Photoshop, Image] 0 - Print Style: Centered +[Photoshop, Photoshop, Image] 2 - Print Position: 0 0 +[Photoshop, Photoshop, Image] 10 - Print Scale: 1 +[Photoshop, Photoshop, Image] 1037 - Global Angle: 30 +[Photoshop, Photoshop, Image] 1049 - Global Altitude: 30 +[Photoshop, Photoshop, Author] 1034 - Copyright Flag: False +[Photoshop, Photoshop, Author] 1035 - URL: https://exiftool.org/ +[Photoshop, Photoshop, Image] 1054 - URL List: +[Photoshop, Photoshop, Other] 20 - Slices Group Name: IPTC +[Photoshop, Photoshop, Other] 24 - Num Slices: 1 +[Photoshop, Photoshop, Image] 4 - Has Real Merged Data: Yes +[Photoshop, Photoshop, Image] 5 - Writer Name: Adobe Photoshop +[Photoshop, Photoshop, Image] 9 - Reader Name: Adobe Photoshop 7.0 +[Photoshop, Photoshop, Image] 0 - Photoshop Quality: 7 +[Photoshop, Photoshop, Image] 1 - Photoshop Format: Standard +[Photoshop, Photoshop, Image] 2 - Progressive Scans: 3 Scans +[APP14, Adobe, Image] 0 - DCT Encode Version: 100 +[APP14, Adobe, Image] 1 - APP14 Flags 0: (none) +[APP14, Adobe, Image] 2 - APP14 Flags 1: (none) +[APP14, Adobe, Image] 3 - Color Transform: YCbCr +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/IPTC_4.out b/t/IPTC_4.out new file mode 100644 index 0000000..dec0143 --- /dev/null +++ b/t/IPTC_4.out @@ -0,0 +1,68 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[ExifTool, ExifTool, ExifTool] Warning - Warning: IPTCDigest is not current. XMP may be out of sync +[File, System, Other] FileSize - File Size: 13 kB +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 6d8db9a8e51a489368148270c914e73d +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[JFIF, JFIF, Image] 0 - JFIF Version: 1.02 +[JFIF, JFIF, Image] 2 - Resolution Unit: inches +[JFIF, JFIF, Image] 3 - X Resolution: 80 +[JFIF, JFIF, Image] 5 - Y Resolution: 80 +[IPTC, IPTC, Other] 90 - Coded Character Set: UTF8 +[IPTC, IPTC, Other] 0 - Envelope Record Version: 4 +[IPTC, IPTC, Other] 0 - Application Record Version: 3 +[IPTC, IPTC, Other] 120 - Caption-Abstract: A witty caption-v2 +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it-v2 +[IPTC, IPTC, Other] 105 - Headline: No headline-v2 +[IPTC, IPTC, Other] 40 - Special Instructions: What instructions-v2 +[IPTC, IPTC, Author] 80 - By-line: Phil Harvey-v2 +[IPTC, IPTC, Author] 85 - By-line Title: My Position-v2 +[IPTC, IPTC, Author] 110 - Credit: My Credit-v2 +[IPTC, IPTC, Other] 5 - Object Name: Test IPTC picture-v2 +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC, Location] 90 - City: Kingston-v2 +[IPTC, IPTC, Location] 95 - Province-State: Ont-v2 +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada-v2 +[IPTC, IPTC, Other] 103 - Original Transmission Reference: What is a transmission reference +[IPTC, IPTC, Other] 15 - Category: 2 +[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing, image, utilities, v2 +[IPTC, IPTC, Other] 25 - Keywords: ExifTool, Test, IPTC, v2 +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright 2004 Phil Harvey-v2 +[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Author] 115 - Source: I'm the source-v2 +[Photoshop, Photoshop, Image] 1061 - IPTC Digest: 05ad1770b1a95f1f9788ac995fa647da +[Photoshop, Photoshop, Image] 0 - X Resolution: 80 +[Photoshop, Photoshop, Image] 2 - Displayed Units X: inches +[Photoshop, Photoshop, Image] 4 - Y Resolution: 80 +[Photoshop, Photoshop, Image] 6 - Displayed Units Y: inches +[Photoshop, Photoshop, Image] 0 - Print Style: Centered +[Photoshop, Photoshop, Image] 2 - Print Position: 0 0 +[Photoshop, Photoshop, Image] 10 - Print Scale: 1 +[Photoshop, Photoshop, Image] 1037 - Global Angle: 34 +[Photoshop, Photoshop, Image] 1049 - Global Altitude: 34 +[Photoshop, Photoshop, Author] 1034 - Copyright Flag: False +[Photoshop, Photoshop, Author] 1035 - URL: https://exiftool.org/-v2 +[Photoshop, Photoshop, Image] 1054 - URL List: +[Photoshop, Photoshop, Other] 20 - Slices Group Name: IPTC +[Photoshop, Photoshop, Other] 24 - Num Slices: 1 +[Photoshop, Photoshop, Image] 4 - Has Real Merged Data: Yes +[Photoshop, Photoshop, Image] 5 - Writer Name: Adobe Photoshop +[Photoshop, Photoshop, Image] 9 - Reader Name: Adobe Photoshop 7.0 +[Photoshop, Photoshop, Image] 0 - Photoshop Quality: 8 +[Photoshop, Photoshop, Image] 1 - Photoshop Format: Standard +[Photoshop, Photoshop, Image] 2 - Progressive Scans: 3 Scans +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-iptcCore, Author] CreatorContactInfoCiAdrCtry - Creator Country: Canada +[APP14, Adobe, Image] 0 - DCT Encode Version: 100 +[APP14, Adobe, Image] 1 - APP14 Flags 0: (none) +[APP14, Adobe, Image] 2 - APP14 Flags 1: (none) +[APP14, Adobe, Image] 3 - Color Transform: YCbCr +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/IPTC_5.out b/t/IPTC_5.out new file mode 100644 index 0000000..7c4700e --- /dev/null +++ b/t/IPTC_5.out @@ -0,0 +1 @@ +[IPTC, IPTC, Author] 116 - Copyright Notice: © 2008 Phil Harvey diff --git a/t/IPTC_6.out b/t/IPTC_6.out new file mode 100644 index 0000000..12627d4 --- /dev/null +++ b/t/IPTC_6.out @@ -0,0 +1,2 @@ +[IPTC, IPTC, Other] 120 - Caption-Abstract: Я могу еÑÑ‚ÑŒ Ñтекло, оно мне не вредит. +[IPTC, IPTC, Other] 0 - Application Record Version: 4 diff --git a/t/IPTC_7.out b/t/IPTC_7.out new file mode 100644 index 0000000..399c846 --- /dev/null +++ b/t/IPTC_7.out @@ -0,0 +1 @@ +[IPTC, IPTC, Other] 25 - Keywords: ExifTool, One, Two, IPTC diff --git a/t/IPTC_8.out b/t/IPTC_8.out new file mode 100644 index 0000000..0c4fbf5 --- /dev/null +++ b/t/IPTC_8.out @@ -0,0 +1,20 @@ +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: A witty caption +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it +[IPTC, IPTC, Other] 105 - Headline: No headline +[IPTC, IPTC, Other] 40 - Special Instructions: What instructions +[IPTC, IPTC, Author] 80 - By-line: Phil Harvey +[IPTC, IPTC, Author] 85 - By-line Title: My Position +[IPTC, IPTC, Author] 110 - Credit: My Credit +[IPTC, IPTC, Other] 5 - Object Name: Test IPTC picture +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ont +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 103 - Original Transmission Reference: What is a transmission reference +[IPTC, IPTC, Other] 15 - Category: 1 +[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing, image, utilities +[IPTC, IPTC, Other] 25 - Keywords: ExifTool, Test, IPTC +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright 2004 Phil Harvey +[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Author] 115 - Source: I'm the source diff --git a/t/ISO.t b/t/ISO.t new file mode 100644 index 0000000..3a63472 --- /dev/null +++ b/t/ISO.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/ISO.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::ISO; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'ISO'; +my $testnum = 1; + +# test 2: Extract information from ISO.iso +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/ISO.iso', '-system:all'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/ISO_2.out b/t/ISO_2.out new file mode 100644 index 0000000..6d2949c --- /dev/null +++ b/t/ISO_2.out @@ -0,0 +1,19 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, File, Other] FileType - File Type: ISO +[File, File, Other] FileTypeExtension - File Type Extension: iso +[File, File, Other] MIMEType - MIME Type: application/x-iso9660-image +[ISO, ISO, Other] 40 - Volume Name: ExifTool Test Vol. 1 +[ISO, ISO, Other] 80 - Volume Block Count: 190976 +[ISO, ISO, Other] 128 - Volume Block Size: 2048 +[ISO, ISO, Time] 174 - Root Directory Create Date: 2016:01:08 10:00:26+00:00 +[ISO, ISO, Other] 190 - Volume Set Name: ExifTool Test Set +[ISO, ISO, Other] 318 - Publisher: PH Publishing +[ISO, ISO, Other] 446 - Data Preparer: Phil Harvey +[ISO, ISO, Other] 574 - Software: hdiutil 10.10v398 +[ISO, ISO, Other] 702 - Copyright File Name: copyright.txt +[ISO, ISO, Other] 740 - Abstract File Name: abstract.txt +[ISO, ISO, Other] 776 - Bibligraphic File Name: index.txt +[ISO, ISO, Time] 813 - Volume Create Date: 2016:01:08 10:00:26.00+00:00 +[ISO, ISO, Time] 830 - Volume Modify Date: 2016:01:08 10:00:26.00+00:00 +[ISO, ISO, Other] 7 - Boot System: EL TORITO SPECIFICATION +[Composite, Composite, Other] ISO-VolumeSize - Volume Size: 391 MB diff --git a/t/ITC.t b/t/ITC.t new file mode 100644 index 0000000..c835c74 --- /dev/null +++ b/t/ITC.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/ITC.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::ITC; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'ITC'; +my $testnum = 1; + +# test 2: Extract information from ITC.itc +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/ITC.itc'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/ITC_2.out b/t/ITC_2.out new file mode 100644 index 0000000..69636eb --- /dev/null +++ b/t/ITC_2.out @@ -0,0 +1,21 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: ITC.itc +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 672 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2008:01:12 21:30:37-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:09-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: ITC +[File, File, Other] FileTypeExtension - File Type Extension: itc +[File, File, Other] MIMEType - MIME Type: application/itunes +[ITC, ITC, Image] 16 - Data Type: Artwork +[ITC, ITC, Image] 0 - Library ID: 914A6DE01A279611 +[ITC, ITC, Image] 2 - Track ID: 195770115E4BA2B6 +[ITC, ITC, Image] 4 - Data Location: Local Music File +[ITC, ITC, Image] 5 - Image Type: PNG +[ITC, ITC, Image] 7 - Image Width: 8 +[ITC, ITC, Image] 8 - Image Height: 8 +[ITC, ITC, Other] data - Image Data: (Binary data 180 bytes) +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/InDesign.t b/t/InDesign.t new file mode 100644 index 0000000..5ae5858 --- /dev/null +++ b/t/InDesign.t @@ -0,0 +1,62 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/InDesign.t". + +BEGIN { + $| = 1; print "1..4\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::InDesign; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'InDesign'; +my $testnum = 1; + +# test 2: Extract information from InDesign.indd +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/InDesign.indd'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# tests 3-4: Write some XMP tags then delete all XMP (writes empty XMP record) +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue(Author => 'Phil Harvey'); + $exifTool->SetNewValue(ImageDescription => 'A description'); + my $testfile = "t/${testname}_${testnum}_failed.indd"; + unlink $testfile; + $exifTool->WriteInfo('t/images/InDesign.indd', $testfile); + my $info = $exifTool->ImageInfo($testfile); + my $not; + unless (check($exifTool, $info, $testname, $testnum)) { + print 'not '; + $not = 1; + } + print "ok $testnum\n"; + + ++$testnum; + $exifTool->Options(PrintConv => 0); + $exifTool->SetNewValue(); + $exifTool->SetNewValue('XMP:*'); + my $testfile2 = "t/${testname}_${testnum}_failed.indd"; + unlink $testfile2; + $exifTool->WriteInfo($testfile, $testfile2); + $info = $exifTool->ImageInfo($testfile2); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile unless $not; + unlink $testfile2; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# end diff --git a/t/InDesign_2.out b/t/InDesign_2.out new file mode 100644 index 0000000..4dc3eb9 --- /dev/null +++ b/t/InDesign_2.out @@ -0,0 +1,20 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: InDesign.indd +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 12 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2009:06:19 13:09:44-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:39-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: INDD +[File, File, Other] FileTypeExtension - File Type Extension: indd +[File, File, Other] MIMEType - MIME Type: application/x-indesign +[XMP, XMP-x, Document] xmptk - XMP Toolkit: XMP toolkit 3.0-29, framework 1.6 +[XMP, XMP-rdf, Document] about - About: d5d09d4b-2831-11dc-bfa2-d89eae7bab84 +[XMP, XMP-xmp, Time] CreateDate - Create Date: 2007:06:30 00:19:02Z +[XMP, XMP-xmp, Image] CreatorTool - Creator Tool: Adobe InDesign 3.0 +[XMP, XMP-xmp, Time] MetadataDate - Metadata Date: 2007:06:30 00:19:17Z +[XMP, XMP-xmp, Time] ModifyDate - Modify Date: 2007:06:30 00:19:17Z +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:indd:d5d09d4a-2831-11dc-bfa2-d89eae7bab84 +[XMP, XMP-xmpMM, Other] RenditionClass - Rendition Class: default +[XMP, XMP-dc, Image] format - Format: application/x-indesign diff --git a/t/InDesign_3.out b/t/InDesign_3.out new file mode 100644 index 0000000..3b02581 --- /dev/null +++ b/t/InDesign_3.out @@ -0,0 +1,22 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: InDesign_3_failed.indd +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 12 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:39-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:39-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:39-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: INDD +[File, File, Other] FileTypeExtension - File Type Extension: indd +[File, File, Other] MIMEType - MIME Type: application/x-indesign +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-rdf, Document] about - About: d5d09d4b-2831-11dc-bfa2-d89eae7bab84 +[XMP, XMP-dc, Image] format - Format: application/x-indesign +[XMP, XMP-pdf, Author] Author - Author: Phil Harvey +[XMP, XMP-tiff, Image] ImageDescription - Image Description: A description +[XMP, XMP-xmp, Time] CreateDate - Create Date: 2007:06:30 00:19:02Z +[XMP, XMP-xmp, Image] CreatorTool - Creator Tool: Adobe InDesign 3.0 +[XMP, XMP-xmp, Time] MetadataDate - Metadata Date: 2007:06:30 00:19:17Z +[XMP, XMP-xmp, Time] ModifyDate - Modify Date: 2007:06:30 00:19:17Z +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:indd:d5d09d4a-2831-11dc-bfa2-d89eae7bab84 +[XMP, XMP-xmpMM, Other] RenditionClass - Rendition Class: default diff --git a/t/InDesign_4.out b/t/InDesign_4.out new file mode 100644 index 0000000..a76f31c --- /dev/null +++ b/t/InDesign_4.out @@ -0,0 +1,12 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: InDesign_4_failed.indd +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 12288 +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:11:01 10:15:27-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:11:01 10:15:27-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:11:01 10:15:27-04:00 +[File, System, Other] FilePermissions - File Permissions: 644 +[File, File, Other] FileType - File Type: INDD +[File, File, Other] FileTypeExtension - File Type Extension: INDD +[File, File, Other] MIMEType - MIME Type: application/x-indesign +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 11.75 diff --git a/t/JSON.t b/t/JSON.t new file mode 100644 index 0000000..83ebf34 --- /dev/null +++ b/t/JSON.t @@ -0,0 +1,31 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/JSON.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::JSON; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'JSON'; +my $testnum = 1; + +# test 2: Extract information from JSON.json +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Struct => 2); + $exifTool->Options(MissingTagValue => 'null'); + my $info = $exifTool->ImageInfo('t/images/JSON.json'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/JSON_2.out b/t/JSON_2.out new file mode 100644 index 0000000..552c7c1 --- /dev/null +++ b/t/JSON_2.out @@ -0,0 +1,19 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: JSON.json +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 344 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2017:03:14 09:08:39-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:16-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JSON +[File, File, Other] FileTypeExtension - File Type Extension: json +[File, File, Other] MIMEType - MIME Type: application/json +[JSON, JSON, Other] description - Description: test description +[JSON, JSON, Other] imageViews - Image Views: 0 +[JSON, JSON, Other] people - People: one, two, three +[JSON, JSON, Other] test - Test: [{thing=[3,4],this=[1,2]},{thing=[7,8],this=[5,6]}] +[JSON, JSON, Other] testThing - Test Thing: 3, 4, 7, 8 +[JSON, JSON, Other] testThis - Test This: 1, 2, 5, 6 +[JSON, JSON, Other] title - Title: 2013-02-02 +[JSON, JSON, Other] url - Url: https://(removed) diff --git a/t/JVC.t b/t/JVC.t new file mode 100644 index 0000000..641082e --- /dev/null +++ b/t/JVC.t @@ -0,0 +1,37 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/JVC.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::JVC; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'JVC'; +my $testnum = 1; + +# test 2: Extract information from EXIF-based JVC maker notes +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/JVC.jpg', { Group1 => 'JVC', Unknown => 1 }); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Extract information from text-based JVC maker notes +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/JVC.jpg', { Group1 => 'JVC', Unknown => 1 }); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/JVC_2.out b/t/JVC_2.out new file mode 100644 index 0000000..873daeb --- /dev/null +++ b/t/JVC_2.out @@ -0,0 +1,3 @@ +[MakerNotes, JVC, Camera] 1 - JVC 0x0001: 2 +[MakerNotes, JVC, Camera] 2 - CPU Versions: CPU1 2.00, 0, CPU2 0496, 0 +[MakerNotes, JVC, Camera] 3 - Quality: Normal diff --git a/t/JVC_3.out b/t/JVC_3.out new file mode 100644 index 0000000..873daeb --- /dev/null +++ b/t/JVC_3.out @@ -0,0 +1,3 @@ +[MakerNotes, JVC, Camera] 1 - JVC 0x0001: 2 +[MakerNotes, JVC, Camera] 2 - CPU Versions: CPU1 2.00, 0, CPU2 0496, 0 +[MakerNotes, JVC, Camera] 3 - Quality: Normal diff --git a/t/JXL.t b/t/JXL.t new file mode 100644 index 0000000..1ab3ad6 --- /dev/null +++ b/t/JXL.t @@ -0,0 +1,50 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Jpeg2000.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Jpeg2000; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'JXL'; +my $testnum = 1; + +# test 2: Extract information from JXL.jxl +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/JXL.jxl', '-system:all'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.jxl"; + unlink $testfile; + my @writeInfo = ( + [ 'XMP:Subject' => 'test subject' ], + [ 'EXIF:Artist' => 'test artist' ], + ); + $exifTool->Options(IgnoreMinorErrors => 1); + $exifTool->SetNewValue(@$_) foreach @writeInfo; + my $ok = writeInfo($exifTool, 't/images/JXL.jxl', $testfile, undef, 1); + my $info = $exifTool->ImageInfo($testfile, '-system:all'); + if (check($exifTool, $info, $testname, $testnum) and $ok) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# end diff --git a/t/JXL_2.out b/t/JXL_2.out new file mode 100644 index 0000000..130a997 --- /dev/null +++ b/t/JXL_2.out @@ -0,0 +1,8 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.25 +[File, File, Other] FileType - File Type: JXL Codestream +[File, File, Other] FileTypeExtension - File Type Extension: jxl +[File, File, Other] MIMEType - MIME Type: image/jxl +[File, File, Image] ImageWidth - Image Width: 200 +[File, File, Image] ImageHeight - Image Height: 130 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 200x130 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.026 diff --git a/t/JXL_3.out b/t/JXL_3.out new file mode 100644 index 0000000..6b905fc --- /dev/null +++ b/t/JXL_3.out @@ -0,0 +1,19 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.25 +[File, File, Other] FileType - File Type: JXL +[File, File, Other] FileTypeExtension - File Type Extension: jxl +[File, File, Other] MIMEType - MIME Type: image/jxl +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 200 +[File, File, Image] ImageHeight - Image Height: 130 +[Jpeg2000, Jpeg2000, Video] 0 - Major Brand: JPEG XL Image (.JXL) +[Jpeg2000, Jpeg2000, Video] 1 - Minor Version: 0.0.0 +[Jpeg2000, Jpeg2000, Video] 2 - Compatible Brands: jxl +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Author] 315 - Artist: test artist +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.25 +[XMP, XMP-dc, Image] subject - Subject: test subject +[Composite, Composite, Image] Exif-ImageSize - Image Size: 200x130 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.026 diff --git a/t/Jpeg2000.t b/t/Jpeg2000.t new file mode 100644 index 0000000..266ccba --- /dev/null +++ b/t/Jpeg2000.t @@ -0,0 +1,61 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Jpeg2000.t". + +BEGIN { + $| = 1; print "1..5\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Jpeg2000; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Jpeg2000'; +my $testnum = 1; + +# test 2: Extract information from Jpeg2000.jp2 +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Jpeg2000.jp2'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + ['IPTC:Keywords' => 'test keyword'], + ['XMP:City' => 'a city'], + ['EXIF:ImageDescription' => 'a description'], + ['XML' => '<test>Yippee</test>', Protected => 1 ], + ['Jpeg2000:ColorSpace' => 'Grayscale', Protected => 1 ], + ['ColorSpecPrecedence' => 1, Protected => 1 ], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/Jpeg2000.jp2'); + print "ok $testnum\n"; +} + +# test 4: Extract information from Jpeg2000.j2c +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Jpeg2000.j2c'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 5: Extract XML as a block from JP2 image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Jpeg2000.jp2','xml'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/Jpeg2000_2.out b/t/Jpeg2000_2.out new file mode 100644 index 0000000..0ee4ab0 --- /dev/null +++ b/t/Jpeg2000_2.out @@ -0,0 +1,71 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Jpeg2000.jp2 +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 2.0 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2016:10:10 15:46:32-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:39-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JP2 +[File, File, Other] FileTypeExtension - File Type Extension: jp2 +[File, File, Other] MIMEType - MIME Type: image/jp2 +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[Jpeg2000, Jpeg2000, Video] 0 - Major Brand: JPEG 2000 Image (.JP2) +[Jpeg2000, Jpeg2000, Video] 1 - Minor Version: 0.0.0 +[Jpeg2000, Jpeg2000, Video] 2 - Compatible Brands: jp2 +[Jpeg2000, Jpeg2000, Image] 0 - Image Height: 16 +[Jpeg2000, Jpeg2000, Image] 4 - Image Width: 16 +[Jpeg2000, Jpeg2000, Image] 8 - Number Of Components: 3 +[Jpeg2000, Jpeg2000, Image] 10 - Bits Per Component: 8 Bits, Unsigned +[Jpeg2000, Jpeg2000, Image] 11 - Compression: JPEG 2000 +[Jpeg2000, Jpeg2000, Image] 0 - Color Spec Method: Enumerated +[Jpeg2000, Jpeg2000, Image] 1 - Color Spec Precedence: 0 +[Jpeg2000, Jpeg2000, Image] 2 - Color Spec Approximation: Not Specified +[Jpeg2000, Jpeg2000, Image] 3 - Color Space: sRGB +[EXIF, IFD0, Image] 256 - Image Width: 1 +[EXIF, IFD0, Image] 257 - Image Height: 1 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 +[EXIF, IFD0, Image] 259 - Compression: Uncompressed +[EXIF, IFD0, Image] 273 - Strip Offsets: 101 +[EXIF, IFD0, Image] 277 - Samples Per Pixel: 1 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 0 +[EXIF, IFD0, Image] 284 - Planar Configuration: Chunky +[EXIF, IFD0, Image] 33550 - Pixel Scale: 1 1 0 +[EXIF, IFD0, Location] 33922 - Model Tie Point: 0 0 0 334159.28 4429865.18 0 +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Author] 315 - Artist: me +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[GeoTiff, GeoTiff, Location] 1 - Geo Tiff Version: 1.1.0 +[GeoTiff, GeoTiff, Location] 1024 - GT Model Type: Projected +[GeoTiff, GeoTiff, Location] 1025 - GT Raster Type: Pixel Is Area +[GeoTiff, GeoTiff, Location] 1026 - GT Citation: NAD83 / UTM zone 18N +[GeoTiff, GeoTiff, Location] 3072 - Projected CS Type: NAD83 UTM zone 18N +[GeoTiff, GeoTiff, Location] 3076 - Proj Linear Units: Linear Meter +[XML, XML, Unknown] imageCreationXmlns - Image Creation Xmlns: http://www.jpeg.org/jpx/1.0/xml +[XML, XML-xsi, Unknown] xsi:imageCreationSchemaLocation - Image Creation Schema Location: http://www.jpeg.org/jpx/1.0/xml;http://www.jpeg.org/metadata/15444-2.xsd +[XML, XML, Unknown] imageCreationGeneralCreationInfoCreationTime - Image Creation General Creation Info Creation Time: 2001:08:01 15:40:00.000-06:00 +[XML, XML, Unknown] contentDescriptionXmlns - Content Description Xmlns: http://www.jpeg.org/jpx/1.0/xml +[XML, XML-xsi, Unknown] xsi:contentDescriptionSchemaLocation - Content Description Schema Location: http://www.jpeg.org/jpx/1.0/xml;http://www.jpeg.org/metadata/15444-2.xsd +[XML, XML, Unknown] contentDescriptionCaption - Content Description Caption: Wide Dynamic Range Scene +[XML, XML, Unknown] contentDescriptionLocationAddressType - Content Description Location Address Type: Test Scene Location +[XML, XML, Unknown] contentDescriptionLocationAddressAddrCompType - Content Description Location Address Addr Comp Type: Street +[XML, XML, Unknown] contentDescriptionLocationAddressAddrComp - Content Description Location Address Addr Comp: 70 Lighthouse St +[XML, XML, Unknown] contentDescriptionLocationAddressAddrCompType - Content Description Location Address Addr Comp Type: City +[XML, XML, Unknown] contentDescriptionLocationAddressAddrComp - Content Description Location Address Addr Comp: Charlotte +[XML, XML, Unknown] contentDescriptionLocationAddressAddrCompType - Content Description Location Address Addr Comp Type: State +[XML, XML, Unknown] contentDescriptionLocationAddressAddrComp - Content Description Location Address Addr Comp: New York +[XML, XML, Unknown] contentDescriptionLocationAddressZipcode - Content Description Location Address Zipcode: 14612 +[XML, XML, Unknown] contentDescriptionLocationAddressCountry - Content Description Location Address Country: US +[XML, XML, Unknown] contentDescriptionThingId - Content Description Thing Id: 5431 +[XML, XML, Unknown] contentDescriptionThingName - Content Description Thing Name: Macbeth chart +[XML, XML, Unknown] contentDescriptionThingPositionRectX - Content Description Thing Position Rect X: 562 +[XML, XML, Unknown] contentDescriptionThingPositionRectY - Content Description Thing Position Rect Y: 286 +[XML, XML, Unknown] contentDescriptionThingPositionRectWidth - Content Description Thing Position Rect Width: 59 +[XML, XML, Unknown] contentDescriptionThingPositionRectHeight - Content Description Thing Position Rect Height: 39 +[XML, XML, Unknown] contentDescriptionEventEventType - Content Description Event Event Type: Capture Device Test 1234 +[XML, XML, Unknown] contentDescriptionEventDescription - Content Description Event Description: Project Prototype +[Composite, Composite, Image] Exif-ImageSize - Image Size: 16x16 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000256 diff --git a/t/Jpeg2000_3.out b/t/Jpeg2000_3.out new file mode 100644 index 0000000..407ba3e --- /dev/null +++ b/t/Jpeg2000_3.out @@ -0,0 +1,54 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Jpeg2000_3_failed.jp2 +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 3.7 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:40-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:40-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:40-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JP2 +[File, File, Other] FileTypeExtension - File Type Extension: jp2 +[File, File, Other] MIMEType - MIME Type: image/jp2 +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[Jpeg2000, Jpeg2000, Video] 0 - Major Brand: JPEG 2000 Image (.JP2) +[Jpeg2000, Jpeg2000, Video] 1 - Minor Version: 0.0.0 +[Jpeg2000, Jpeg2000, Video] 2 - Compatible Brands: jp2 +[Jpeg2000, Jpeg2000, Image] 0 - Image Height: 16 +[Jpeg2000, Jpeg2000, Image] 4 - Image Width: 16 +[Jpeg2000, Jpeg2000, Image] 8 - Number Of Components: 3 +[Jpeg2000, Jpeg2000, Image] 10 - Bits Per Component: 8 Bits, Unsigned +[Jpeg2000, Jpeg2000, Image] 11 - Compression: JPEG 2000 +[Jpeg2000, Jpeg2000, Image] 0 - Color Spec Method: Enumerated +[Jpeg2000, Jpeg2000, Image] 1 - Color Spec Precedence: 1 +[Jpeg2000, Jpeg2000, Image] 2 - Color Spec Approximation: Not Specified +[Jpeg2000, Jpeg2000, Image] 3 - Color Space: Grayscale +[EXIF, IFD0, Image] 256 - Image Width: 1 +[EXIF, IFD0, Image] 257 - Image Height: 1 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 +[EXIF, IFD0, Image] 259 - Compression: Uncompressed +[EXIF, IFD0, Image] 273 - Strip Offsets: 101 +[EXIF, IFD0, Image] 277 - Samples Per Pixel: 1 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 0 +[EXIF, IFD0, Image] 284 - Planar Configuration: Chunky +[EXIF, IFD0, Image] 33550 - Pixel Scale: 1 1 0 +[EXIF, IFD0, Location] 33922 - Model Tie Point: 0 0 0 334159.28 4429865.18 0 +[EXIF, IFD0, Image] 270 - Image Description: a description +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Author] 315 - Artist: me +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[GeoTiff, GeoTiff, Location] 1 - Geo Tiff Version: 1.1.0 +[GeoTiff, GeoTiff, Location] 1024 - GT Model Type: Projected +[GeoTiff, GeoTiff, Location] 1025 - GT Raster Type: Pixel Is Area +[GeoTiff, GeoTiff, Location] 1026 - GT Citation: NAD83 / UTM zone 18N +[GeoTiff, GeoTiff, Location] 3072 - Projected CS Type: NAD83 UTM zone 18N +[GeoTiff, GeoTiff, Location] 3076 - Proj Linear Units: Linear Meter +[XML, XML, Unknown] test - Test: Yippee +[IPTC, IPTC, Other] 25 - Keywords: test keyword +[IPTC, IPTC, Other] 0 - Application Record Version: 4 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-photoshop, Location] City - City: a city +[Composite, Composite, Image] Exif-ImageSize - Image Size: 16x16 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000256 diff --git a/t/Jpeg2000_4.out b/t/Jpeg2000_4.out new file mode 100644 index 0000000..f843edb --- /dev/null +++ b/t/Jpeg2000_4.out @@ -0,0 +1,17 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Jpeg2000.j2c +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 618 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2011:08:15 11:40:57-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:09-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: J2C +[File, File, Other] FileTypeExtension - File Type Extension: j2c +[File, File, Other] MIMEType - MIME Type: image/x-j2c +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] Comment - Comment: Kakadu-v4.2.1 +[File, File, Image] Comment - Comment: Kdu-Layer-Info: log_2{Delta-D(MSE)/[2^16*Delta-L(bytes)]}, L(bytes); -0.0, 4.2e+02; -0.0, 4.3e+02; -0.0, 4.5e+02; -0.0, 4.7e+02; -0.0, 4.9e+02; -0.0, 5.0e+02; -0.0, 5.2e+02; -0.0, 5.4e+02; -0.0, 5.6e+02; -0.0, 5.8e+02; -0.0, 6.0e+02;-256.0, 6.2e+02; +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/Jpeg2000_5.out b/t/Jpeg2000_5.out new file mode 100644 index 0000000..98478f2 --- /dev/null +++ b/t/Jpeg2000_5.out @@ -0,0 +1,2 @@ +[Jpeg2000, Jpeg2000, Image] xml - XML: (Binary data 377 bytes) +[Jpeg2000, Jpeg2000, Image] xml - XML: (Binary data 902 bytes) diff --git a/t/Kodak.t b/t/Kodak.t new file mode 100644 index 0000000..3c9608e --- /dev/null +++ b/t/Kodak.t @@ -0,0 +1,41 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Kodak.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Kodak; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Kodak'; +my $testnum = 1; + +# test 2: Extract information from Kodak.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Kodak.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + [YearCreated => '2005', Group => 'Kodak'], + [MonthDayCreated => '03:31', Group => 'Kodak'], + [DigitalZoom => '2'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Kodak_2.out b/t/Kodak_2.out new file mode 100644 index 0000000..f65fa34 --- /dev/null +++ b/t/Kodak_2.out @@ -0,0 +1,111 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Kodak.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 3.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:06:05 13:12:56-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:40-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: EASTMAN KODAK COMPANY +[EXIF, IFD0, Camera] 272 - Camera Model Name: KODAK DX4900 ZOOM DIGITAL CAMERA +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 230 +[EXIF, IFD0, Image] 283 - Y Resolution: 230 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/180 +[EXIF, ExifIFD, Image] 33437 - F Number: 6.7 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2002:05:01 10:22:28 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2002:05:01 10:22:28 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/181 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 6.7 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.1 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Average +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 10.2 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2448 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1632 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41493 - Exposure Index: 100 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1664 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Kodak, Camera] 0 - Kodak Model: DX4900 +[MakerNotes, Kodak, Camera] 9 - Quality: Fine +[MakerNotes, Kodak, Camera] 10 - Burst Mode: Off +[MakerNotes, Kodak, Camera] 12 - Kodak Image Width: 2448 +[MakerNotes, Kodak, Camera] 14 - Kodak Image Height: 1632 +[MakerNotes, Kodak, Time] 16 - Year Created: 2002 +[MakerNotes, Kodak, Time] 18 - Month Day Created: 05:01 +[MakerNotes, Kodak, Time] 20 - Time Created: 10:22:28.62 +[MakerNotes, Kodak, Camera] 27 - Shutter Mode: Auto +[MakerNotes, Kodak, Camera] 28 - Metering Mode: Multi-segment +[MakerNotes, Kodak, Camera] 29 - Sequence Number: 0 +[MakerNotes, Kodak, Camera] 30 - F Number: 6.73 +[MakerNotes, Kodak, Camera] 32 - Exposure Time: 1/216 +[MakerNotes, Kodak, Camera] 36 - Exposure Compensation: 0 +[MakerNotes, Kodak, Camera] 56 - Focus Mode: Normal +[MakerNotes, Kodak, Camera] 64 - White Balance: Auto +[MakerNotes, Kodak, Camera] 92 - Flash Mode: Auto +[MakerNotes, Kodak, Camera] 93 - Flash Fired: No +[MakerNotes, Kodak, Camera] 94 - ISO Setting: Auto +[MakerNotes, Kodak, Camera] 96 - ISO: 108 +[MakerNotes, Kodak, Camera] 98 - Total Zoom: 1.4 +[MakerNotes, Kodak, Camera] 100 - Date Time Stamp: Off +[MakerNotes, Kodak, Camera] 102 - Color Mode: Saturated Color +[MakerNotes, Kodak, Camera] 104 - Digital Zoom: 1 +[MakerNotes, Kodak, Camera] 107 - Sharpness: Normal +[FlashPix, FlashPix, Other] 1 - Code Page: Unicode UTF-16, little endian +[FlashPix, FlashPix, Other] 268435456 - Used Extension Numbers: 1, 2 +[FlashPix, FlashPix, Other] 1 - Extension Name: Screen nail +[FlashPix, FlashPix, Other] 2 - Extension Class ID: 10000230-6FC0-11D0-BD01-00609719A180 +[FlashPix, FlashPix, Other] 3 - Extension Persistence: Invalidated By Modification +[FlashPix, FlashPix, Time] 4 - Extension Create Date: 1998:01:08 08:28:54 +[FlashPix, FlashPix, Time] 5 - Extension Modify Date: 1998:01:08 08:28:54 +[FlashPix, FlashPix, Other] 6 - Creating Application: Digita +[FlashPix, FlashPix, Other] 7 - Extension Description: Presized image for LCD display +[FlashPix, FlashPix, Other] 4096 - Storage-Stream Pathname: /.Screen Nail_bd0100609719a180 +[FlashPix, FlashPix, Other] 1 - Extension Name: Audio +[FlashPix, FlashPix, Other] 2 - Extension Class ID: 10000100-6FC0-11D0-BD01-00609719A180 +[FlashPix, FlashPix, Other] 3 - Extension Persistence: Always Valid +[FlashPix, FlashPix, Time] 4 - Extension Create Date: 1998:12:17 22:04:36 +[FlashPix, FlashPix, Time] 5 - Extension Modify Date: 1998:12:17 22:04:36 +[FlashPix, FlashPix, Other] 6 - Creating Application: KIES_Toolkit +[FlashPix, FlashPix, Other] 7 - Extension Description: Audio storage +[FlashPix, FlashPix, Other] 4096 - Storage-Stream Pathname: /Audio_bd0100609719a180 +[FlashPix, FlashPix, Audio] Audio Stream - Audio Stream: (Binary data 18 bytes) +[FlashPix, FlashPix, Other] 1 - Code Page: Unicode UTF-16, little endian +[FlashPix, FlashPix, Other] Screen Nail - Screen Nail: (Binary data 166 bytes) +[Composite, Composite, Image] Exif-Aperture - Aperture: 6.7 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/216 +[Composite, Composite, Time] Kodak-DateCreated - Date Created: 2002:05:01 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 10.2 mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 13.1 diff --git a/t/Kodak_3.out b/t/Kodak_3.out new file mode 100644 index 0000000..855e3a0 --- /dev/null +++ b/t/Kodak_3.out @@ -0,0 +1,121 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Kodak_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 3.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:40-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:40-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:40-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: EASTMAN KODAK COMPANY +[EXIF, IFD0, Camera] 272 - Camera Model Name: KODAK DX4900 ZOOM DIGITAL CAMERA +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 230 +[EXIF, IFD0, Image] 283 - Y Resolution: 230 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/180 +[EXIF, ExifIFD, Image] 33437 - F Number: 6.7 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2002:05:01 10:22:28 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2002:05:01 10:22:28 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/181 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 6.7 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.1 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Average +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 10.2 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2448 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1632 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41493 - Exposure Index: 100 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1664 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Kodak, Camera] 0 - Kodak Model: DX4900 +[MakerNotes, Kodak, Camera] 9 - Quality: Fine +[MakerNotes, Kodak, Camera] 10 - Burst Mode: Off +[MakerNotes, Kodak, Camera] 12 - Kodak Image Width: 2448 +[MakerNotes, Kodak, Camera] 14 - Kodak Image Height: 1632 +[MakerNotes, Kodak, Time] 16 - Year Created: 2005 +[MakerNotes, Kodak, Time] 18 - Month Day Created: 03:31 +[MakerNotes, Kodak, Time] 20 - Time Created: 10:22:28.62 +[MakerNotes, Kodak, Camera] 24 - Burst Mode 2: 0 +[MakerNotes, Kodak, Camera] 27 - Shutter Mode: Auto +[MakerNotes, Kodak, Camera] 28 - Metering Mode: Multi-segment +[MakerNotes, Kodak, Camera] 29 - Sequence Number: 0 +[MakerNotes, Kodak, Camera] 30 - F Number: 6.73 +[MakerNotes, Kodak, Camera] 32 - Exposure Time: 1/216 +[MakerNotes, Kodak, Camera] 36 - Exposure Compensation: 0 +[MakerNotes, Kodak, Camera] 38 - Various Modes: 65535 +[MakerNotes, Kodak, Camera] 40 - Distance 1: 13125 +[MakerNotes, Kodak, Camera] 44 - Distance 2: 13125 +[MakerNotes, Kodak, Camera] 48 - Distance 3: 12125 +[MakerNotes, Kodak, Camera] 52 - Distance 4: 12250 +[MakerNotes, Kodak, Camera] 56 - Focus Mode: Normal +[MakerNotes, Kodak, Camera] 58 - Various Modes 2: 65535 +[MakerNotes, Kodak, Camera] 60 - Panorama Mode: 0 +[MakerNotes, Kodak, Camera] 62 - Subject Distance: 0 +[MakerNotes, Kodak, Camera] 64 - White Balance: Auto +[MakerNotes, Kodak, Camera] 92 - Flash Mode: Auto +[MakerNotes, Kodak, Camera] 93 - Flash Fired: No +[MakerNotes, Kodak, Camera] 94 - ISO Setting: Auto +[MakerNotes, Kodak, Camera] 96 - ISO: 108 +[MakerNotes, Kodak, Camera] 98 - Total Zoom: 1.4 +[MakerNotes, Kodak, Camera] 100 - Date Time Stamp: Off +[MakerNotes, Kodak, Camera] 102 - Color Mode: Saturated Color +[MakerNotes, Kodak, Camera] 104 - Digital Zoom: 2 +[MakerNotes, Kodak, Camera] 107 - Sharpness: Normal +[FlashPix, FlashPix, Other] 1 - Code Page: Unicode UTF-16, little endian +[FlashPix, FlashPix, Other] 268435456 - Used Extension Numbers: 1, 2 +[FlashPix, FlashPix, Other] 1 - Extension Name: Screen nail +[FlashPix, FlashPix, Other] 2 - Extension Class ID: 10000230-6FC0-11D0-BD01-00609719A180 +[FlashPix, FlashPix, Other] 3 - Extension Persistence: Invalidated By Modification +[FlashPix, FlashPix, Time] 4 - Extension Create Date: 1998:01:08 08:28:54 +[FlashPix, FlashPix, Time] 5 - Extension Modify Date: 1998:01:08 08:28:54 +[FlashPix, FlashPix, Other] 6 - Creating Application: Digita +[FlashPix, FlashPix, Other] 7 - Extension Description: Presized image for LCD display +[FlashPix, FlashPix, Other] 4096 - Storage-Stream Pathname: /.Screen Nail_bd0100609719a180 +[FlashPix, FlashPix, Other] 1 - Extension Name: Audio +[FlashPix, FlashPix, Other] 2 - Extension Class ID: 10000100-6FC0-11D0-BD01-00609719A180 +[FlashPix, FlashPix, Other] 3 - Extension Persistence: Always Valid +[FlashPix, FlashPix, Time] 4 - Extension Create Date: 1998:12:17 22:04:36 +[FlashPix, FlashPix, Time] 5 - Extension Modify Date: 1998:12:17 22:04:36 +[FlashPix, FlashPix, Other] 6 - Creating Application: KIES_Toolkit +[FlashPix, FlashPix, Other] 7 - Extension Description: Audio storage +[FlashPix, FlashPix, Other] 4096 - Storage-Stream Pathname: /Audio_bd0100609719a180 +[FlashPix, FlashPix, Audio] Audio Stream - Audio Stream: (Binary data 18 bytes) +[FlashPix, FlashPix, Other] 1 - Code Page: Unicode UTF-16, little endian +[FlashPix, FlashPix, Audio] 2 - Flash Pix Audio Info 0x0002: 0 +[FlashPix, FlashPix, Other] Screen Nail - Screen Nail: (Binary data 166 bytes) +[Composite, Composite, Image] Exif-Aperture - Aperture: 6.7 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/216 +[Composite, Composite, Time] Kodak-DateCreated - Date Created: 2005:03:31 +[Composite, Composite, Image] Exif-LightValue - Light Value: 13.1 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 10.2 mm diff --git a/t/KyoceraRaw.t b/t/KyoceraRaw.t new file mode 100644 index 0000000..cd94bd8 --- /dev/null +++ b/t/KyoceraRaw.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/KyoceraRaw.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::KyoceraRaw; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'KyoceraRaw'; +my $testnum = 1; + +# test 2: Extract information from KyoceraRaw.raw +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/KyoceraRaw.raw'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/KyoceraRaw_2.out b/t/KyoceraRaw_2.out new file mode 100644 index 0000000..2fc9b50 --- /dev/null +++ b/t/KyoceraRaw_2.out @@ -0,0 +1,28 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: KyoceraRaw.raw +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 166 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:02:17 11:59:53-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:10-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: RAW +[File, File, Other] FileTypeExtension - File Type Extension: raw +[File, File, Other] MIMEType - MIME Type: image/x-raw +[MakerNotes, KyoceraRaw, Camera] 1 - Firmware Version: Ver. 1.07 +[MakerNotes, KyoceraRaw, Camera] 12 - Model: N DIGITAL +[MakerNotes, KyoceraRaw, Camera] 25 - Make: KYOCERA +[MakerNotes, KyoceraRaw, Time] 33 - Date/Time Original: 2005:07:16 18:14:30 +[MakerNotes, KyoceraRaw, Image] 52 - ISO: 100 +[MakerNotes, KyoceraRaw, Image] 56 - Exposure Time: 1/125 +[MakerNotes, KyoceraRaw, Image] 60 - WB RGGB Levels: 84 64 64 86 +[MakerNotes, KyoceraRaw, Image] 88 - F Number: 11 +[MakerNotes, KyoceraRaw, Camera] 104 - Max Aperture: 5.2 +[MakerNotes, KyoceraRaw, Camera] 112 - Focal Length: 55 mm +[MakerNotes, KyoceraRaw, Camera] 124 - Lens: VS28-80/3.5 +[Composite, Composite, Image] Exif-Aperture - Aperture: 11.3 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.34375 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 1.3125 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/125 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 55.0 mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 14.0 diff --git a/t/LNK.t b/t/LNK.t new file mode 100644 index 0000000..6cf1ecc --- /dev/null +++ b/t/LNK.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/LNK.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::LNK; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'LNK'; +my $testnum = 1; + +# test 2: Extract information from LNK file +{ + my $exifTool = new Image::ExifTool; + ++$testnum; + my $info = $exifTool->ImageInfo('t/images/LNK.lnk'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/LNK_2.out b/t/LNK_2.out new file mode 100644 index 0000000..9a602c8 --- /dev/null +++ b/t/LNK_2.out @@ -0,0 +1,47 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.43 +[File, System, Other] FileName - File Name: LNK.lnk +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 876 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2009:09:19 23:38:35-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:21 16:17:22-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rwxr-xr-x +[File, File, Other] FileType - File Type: LNK +[File, File, Other] FileTypeExtension - File Type Extension: lnk +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[LNK, LNK, Other] 20 - Flags: IDList, LinkInfo, Description, RelativePath, WorkingDir, CommandArgs, Unicode +[LNK, LNK, Other] 24 - File Attributes: Normal +[LNK, LNK, Time] 28 - Create Date: 2009:09:05 06:18:49-04:00 +[LNK, LNK, Time] 36 - Access Date: 2009:09:19 22:42:55-04:00 +[LNK, LNK, Time] 44 - Modify Date: 2009:09:11 06:38:00-04:00 +[LNK, LNK, Other] 52 - Target File Size: 3988946 +[LNK, LNK, Other] 56 - Icon Index: (none) +[LNK, LNK, Other] 60 - Run Window: Normal +[LNK, LNK, Other] 64 - Hot Key: (none) +[LNK, LNK, Other] 14 - Target File DOS Name: EXIFTO~2.EXE +[LNK, LNK, Other] DriveType - Drive Type: Fixed Disk +[LNK, LNK, Other] DriveSerialNumber - Drive Serial Number: C8F0-D326 +[LNK, LNK, Other] VolumeLabel - Volume Label: +[LNK, LNK, Other] LocalBasePath - Local Base Path: C:\Documents and Settings\Phil\Desktop\exiftool(-k).exe +[LNK, LNK, Other] 196612 - Description: Rename file name with image date and time +[LNK, LNK, Other] 196616 - Relative Path: .\exiftool(-k).exe +[LNK, LNK, Other] 196624 - Working Directory: C:\Documents and Settings\Phil\Desktop +[LNK, LNK, Other] 196640 - Command Line Arguments: -d %Y%m%d-%H%M%S.%%e "-filename<datetimeoriginal" -v +[LNK, LNK, Other] 16 - Machine ID: yukkypc +[LNK, LNK, Other] 8 - Fill Attributes: 0x07 +[LNK, LNK, Other] 10 - Popup Fill Attributes: 0xf5 +[LNK, LNK, Other] 12 - Screen Buffer Size: 80 x 500 +[LNK, LNK, Other] 16 - Window Size: 80 x 25 +[LNK, LNK, Other] 20 - Window Origin: 135 x 80 +[LNK, LNK, Other] 32 - Font Size: 10 x 20 +[LNK, LNK, Other] 36 - Font Family: Modern +[LNK, LNK, Other] 40 - Font Weight: 400 +[LNK, LNK, Other] 44 - Font Name: 8514oem +[LNK, LNK, Other] 108 - Cursor Size: 25 +[LNK, LNK, Other] 112 - Full Screen: No +[LNK, LNK, Other] 116 - Quick Edit: No +[LNK, LNK, Other] 120 - Insert Mode: Yes +[LNK, LNK, Other] 124 - Window Origin Auto: Yes +[LNK, LNK, Other] 128 - History Buffer Size: 50 +[LNK, LNK, Other] 132 - Num History Buffers: 4 +[LNK, LNK, Other] 136 - Remove History Duplicates: No diff --git a/t/Lang.t b/t/Lang.t new file mode 100644 index 0000000..74c5271 --- /dev/null +++ b/t/Lang.t @@ -0,0 +1,43 @@ +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl t/Lang.t' + +BEGIN { + $| = 1; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} + +use Image::ExifTool; + +print "1..", scalar(@Image::ExifTool::langs), "\n"; + +my $testname = 'Lang'; +my $testnum = 0; + +# test 1: Test localized language description for a lang-alt tag +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Lang => 'de'); + my $info = $exifTool->ImageInfo('t/images/MIE.mie', 'Comment-fr_FR'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# tests 2-N: Test all languages +my $exifTool = new Image::ExifTool; +my $lang; +foreach $lang (@Image::ExifTool::langs) { + next if $lang eq 'en'; # skip english + ++$testnum; + my $not = 'not '; + $exifTool->Options(Lang => $lang); + if ($exifTool->Options('Lang') eq $lang) { + my $info = $exifTool->ImageInfo('t/images/FujiFilm.jpg', 'Exif:All'); + $not = '' if check($exifTool, $info, $testname, $testnum); + } else { + warn "\n Error loading language $lang\n"; + } + print "${not}ok $testnum\n"; +} + +# end diff --git a/t/Lang_1.out b/t/Lang_1.out new file mode 100644 index 0000000..74d1b53 --- /dev/null +++ b/t/Lang_1.out @@ -0,0 +1 @@ +[MIE, MIE-Doc, Document] Comment-fr_FR - Kommentar (fr_FR): Je peux manger du verre, ça ne me fait pas de mal. diff --git a/t/Lang_10.out b/t/Lang_10.out new file mode 100644 index 0000000..0386eb2 --- /dev/null +++ b/t/Lang_10.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - メーカー: FUJIFILM +[EXIF, IFD0, Camera] 272 - ç”»åƒå…¥åŠ›æ©Ÿå™¨ãƒ¢ãƒ‡ãƒ«: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - ç”»åƒã®å‘ã: 水平(標準) +[EXIF, IFD0, Image] 282 - ç”»åƒå¹…ã®è§£åƒåº¦: 72 +[EXIF, IFD0, Image] 283 - ç”»åƒé«˜ã•ã®è§£åƒåº¦: 72 +[EXIF, IFD0, Image] 296 - Xã¨Y解åƒåº¦å˜ä½: インム+[EXIF, IFD0, Image] 305 - ソフトウェア: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - ファイル作æˆæ—¥æ™‚: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Yã¨Cã®ä½ç½®: 相互é…ç½® +[EXIF, IFD0, Author] 33432 - 版権所有者: +[EXIF, ExifIFD, Image] 33437 - F値: 3.5 +[EXIF, ExifIFD, Camera] 34850 - 露出プログラム: ノーマルプログラム +[EXIF, ExifIFD, Image] 34855 - ISOスピードレート: 100 +[EXIF, ExifIFD, Image] 36864 - Exifãƒãƒ¼ã‚¸ãƒ§ãƒ³: 0210 +[EXIF, ExifIFD, Time] 36867 - オリジナルデータ作æˆæ—¥æ™‚: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - デジタルデータ作æˆæ—¥æ™‚: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - å„構æˆè¦ç´ ã®æ„味: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - ç”»åƒåœ§ç¸®ãƒ¢ãƒ¼ãƒ‰: 1.6 +[EXIF, ExifIFD, Image] 37377 - シャッタースピード: 1/64 +[EXIF, ExifIFD, Image] 37378 - 絞り: 3.5 +[EXIF, ExifIFD, Image] 37379 - ブライトãƒã‚¹: 2 +[EXIF, ExifIFD, Image] 37380 - 露出補正値: 0 +[EXIF, ExifIFD, Camera] 37381 - 最大レンズå£å¾„: 3.5 +[EXIF, ExifIFD, Camera] 37383 - 測光モード: パターン +[EXIF, ExifIFD, Camera] 37385 - ストロボ: フラッシュ発光 +[EXIF, ExifIFD, Camera] 37386 - レンズ焦点è·é›¢: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - サãƒãƒ¼ãƒˆãƒ•ãƒ©ãƒƒã‚·ãƒ¥ãƒ”ックスãƒãƒ¼ã‚¸ãƒ§ãƒ³: 0100 +[EXIF, ExifIFD, Image] 40961 - 色空間: sRGB +[EXIF, ExifIFD, Image] 40962 - ç”»åƒå¹…: 1600 +[EXIF, ExifIFD, Image] 40963 - ç”»åƒé«˜ã•: 1200 +[EXIF, InteropIFD, Image] 1 - インターオペラビリティID: R98: DCF基本ファイル(sRGB) +[EXIF, InteropIFD, Image] 2 - インターオペラビリティãƒãƒ¼ã‚¸ãƒ§ãƒ³: 0100 +[EXIF, ExifIFD, Camera] 41486 - 焦点é¢X解åƒåº¦: 3053 +[EXIF, ExifIFD, Camera] 41487 - 焦点é¢Y解åƒåº¦: 3053 +[EXIF, ExifIFD, Camera] 41488 - 焦点é¢è§£åƒåº¦å˜ä½: cm +[EXIF, ExifIFD, Camera] 41495 - センサー方å¼: å˜æ¿å¼ã‚«ãƒ©ãƒ¼ã‚»ãƒ³ã‚µãƒ¼ +[EXIF, ExifIFD, Image] 41728 - ファイルソース: デジタルカメラ +[EXIF, ExifIFD, Image] 41729 - シーンタイプ: ç›´æŽ¥æ’®å½±ç”»åƒ +[EXIF, IFD1, Image] 259 - 圧縮計画: JPEG (å¤ã„å½¢å¼) +[EXIF, IFD1, Image] 274 - ç”»åƒã®å‘ã: 水平(標準) +[EXIF, IFD1, Image] 282 - ç”»åƒå¹…ã®è§£åƒåº¦: 72 +[EXIF, IFD1, Image] 283 - ç”»åƒé«˜ã•ã®è§£åƒåº¦: 72 +[EXIF, IFD1, Image] 296 - Xã¨Y解åƒåº¦å˜ä½: インム+[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Yã¨Cã®ä½ç½®: 相互é…ç½® +[EXIF, IFD1, Preview] Exif-ThumbnailImage - サムãƒã‚¤ãƒ«ç”»åƒ: (Binary data 28 bytes) diff --git a/t/Lang_11.out b/t/Lang_11.out new file mode 100644 index 0000000..30b0dfa --- /dev/null +++ b/t/Lang_11.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - ë©”ì´ì»¤: FUJIFILM +[EXIF, IFD0, Camera] 272 - ì¹´ë©”ë¼ ëª¨ë¸: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - ì´ë¯¸ì§€ 위치: 0° (위쪽/좌측) +[EXIF, IFD0, Image] 282 - ìˆ˜í‰ í•´ìƒë„: 72 +[EXIF, IFD0, Image] 283 - ìˆ˜ì§ í•´ìƒë„: 72 +[EXIF, IFD0, Image] 296 - X 와 Y í•´ìƒë„ 단위: ì¸ì¹˜ +[EXIF, IFD0, Image] 305 - 소프트웨어: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - íŒŒì¼ ë³€ê²½ 날짜 ë° ì‹œê°„: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Y and C 위치: 주변 +[EXIF, IFD0, Author] 33432 - 저작권 소유ìž: +[EXIF, ExifIFD, Image] 33437 - F 숫ìž: 3.5 +[EXIF, ExifIFD, Camera] 34850 - 노출 프로그램: 보통 프로그램 +[EXIF, ExifIFD, Image] 34855 - ISO ì†ë„: 100 +[EXIF, ExifIFD, Image] 36864 - Exif 버전: 0210 +[EXIF, ExifIFD, Time] 36867 - ì›ë³¸ ë°ì´í„° ìƒì„± ì¼ì‹œ: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - 디지털 ë°ì´í„° ìƒì„± ì¼ì‹œ: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - ê° êµ¬ì„± ìš”ì†Œì˜ ì˜ë¯¸: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - ì´ë¯¸ì§€ 압축 모드: 1.6 +[EXIF, ExifIFD, Image] 37377 - 셔터 ì†ë„: 1/64 +[EXIF, ExifIFD, Image] 37378 - 조리개: 3.5 +[EXIF, ExifIFD, Image] 37379 - ë°ê¸°: 2 +[EXIF, ExifIFD, Image] 37380 - 노출 ë³´ì •: 0 +[EXIF, ExifIFD, Camera] 37381 - 최대 렌즈 조리개: 3.5 +[EXIF, ExifIFD, Camera] 37383 - 측광 모드: 멀티 패턴 +[EXIF, ExifIFD, Camera] 37385 - 플래시: 플래시 발광 +[EXIF, ExifIFD, Camera] 37386 - ì´ˆì  ê¸¸ì´: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - 지ì›ë˜ëŠ” Flashpix 버전: 0100 +[EXIF, ExifIFD, Image] 40961 - 색공간: sRGB +[EXIF, ExifIFD, Image] 40962 - ì´ë¯¸ì§€ ë„“ì´: 1600 +[EXIF, ExifIFD, Image] 40963 - ì´ë¯¸ì§€ 높ì´: 1200 +[EXIF, InteropIFD, Image] 1 - ìƒí˜¸ìš´ìš©ì„± ì¦ëª…: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - ìƒí˜¸ 운용성 버전: 0100 +[EXIF, ExifIFD, Camera] 41486 - ìˆ˜í‰ í•´ìƒë„ ì´ˆì ë©´: 3053 +[EXIF, ExifIFD, Camera] 41487 - ìˆ˜ì§ í•´ìƒë„ ì´ˆì ë©´: 3053 +[EXIF, ExifIFD, Camera] 41488 - ì´ˆì ë©´ í•´ìƒë„ 단위: cm +[EXIF, ExifIFD, Camera] 41495 - 검출 ë°©ì‹: One-chip ìƒ‰ìƒ ì˜ì—­ 센서 +[EXIF, ExifIFD, Image] 41728 - íŒŒì¼ ì¶œì²˜: 디지털 ì¹´ë©”ë¼ +[EXIF, ExifIFD, Image] 41729 - 장면 형ì‹: ì§ì ‘ ì´¬ì˜ëœ ì´ë¯¸ì§€ +[EXIF, IFD1, Image] 259 - 압축 설계: JPEG (예전 스타ì¼) +[EXIF, IFD1, Image] 274 - ì´ë¯¸ì§€ 위치: 0° (위쪽/좌측) +[EXIF, IFD1, Image] 282 - ìˆ˜í‰ í•´ìƒë„: 72 +[EXIF, IFD1, Image] 283 - ìˆ˜ì§ í•´ìƒë„: 72 +[EXIF, IFD1, Image] 296 - X 와 Y í•´ìƒë„ 단위: ì¸ì¹˜ +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y and C 위치: 주변 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - 축소 그림: (Binary data 28 bytes) diff --git a/t/Lang_12.out b/t/Lang_12.out new file mode 100644 index 0000000..a079d05 --- /dev/null +++ b/t/Lang_12.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - Fabrikant: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera model: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Oriëntatie van de afbeelding: 0° (boven/links) +[EXIF, IFD0, Image] 282 - Horizontale afbeelding resolutie: 72 +[EXIF, IFD0, Image] 283 - Vertikale afbeelding resolutie: 72 +[EXIF, IFD0, Image] 296 - Eenheid van de X und Y resolutie: inches +[EXIF, IFD0, Image] 305 - Gebruikte software: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Datum bestand wijziging: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Y en C positie: Naast liggend +[EXIF, IFD0, Author] 33432 - Copyright houder: +[EXIF, ExifIFD, Image] 33437 - F waarde: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Belichtingsprogramma: Normaal programma +[EXIF, ExifIFD, Image] 34855 - ISO gevoeligheid: 100 +[EXIF, ExifIFD, Image] 36864 - Exif versie: 0210 +[EXIF, ExifIFD, Time] 36867 - Datum van de originele data generatie: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Datum van de originele data generatie: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Betekenis van elke component: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Afbeelding compressie modus: 1.6 +[EXIF, ExifIFD, Image] 37377 - Belichtingstijd: 1/64 +[EXIF, ExifIFD, Image] 37378 - Diafragma: 3.5 +[EXIF, ExifIFD, Image] 37379 - Helderheid: 2 +[EXIF, ExifIFD, Image] 37380 - Belichtingscorrectie: 0 +[EXIF, ExifIFD, Camera] 37381 - Grootste diafragma: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Belichting meet methode: Multi segment +[EXIF, ExifIFD, Camera] 37385 - Flits: Flits afgevuurd +[EXIF, ExifIFD, Camera] 37386 - Brandpuntafstand: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Ondersteunde Flashpix versie: 0100 +[EXIF, ExifIFD, Image] 40961 - Kleur ruimte: sRGB +[EXIF, ExifIFD, Image] 40962 - Afbeelding breedte: 1600 +[EXIF, ExifIFD, Image] 40963 - Afbeelding hoogte: 1200 +[EXIF, InteropIFD, Image] 1 - Interoperabiliteits Identificatie: R98: DCF Basis formaat (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperabiliteits versie: 0100 +[EXIF, ExifIFD, Camera] 41486 - Horizontale sensor resolutie: 3053 +[EXIF, ExifIFD, Camera] 41487 - Verticale sensor resolutie: 3053 +[EXIF, ExifIFD, Camera] 41488 - Sensor resolutie eenheid: cm +[EXIF, ExifIFD, Camera] 41495 - Meet methode: Één chip kleur sensor +[EXIF, ExifIFD, Image] 41728 - Bestand bron: Digitale camera +[EXIF, ExifIFD, Image] 41729 - Scene type: Direkt opgenomen afbeelding +[EXIF, IFD1, Image] 259 - Compressie schema: JPEG (oude versie) +[EXIF, IFD1, Image] 274 - Oriëntatie van de afbeelding: 0° (boven/links) +[EXIF, IFD1, Image] 282 - Horizontale afbeelding resolutie: 72 +[EXIF, IFD1, Image] 283 - Vertikale afbeelding resolutie: 72 +[EXIF, IFD1, Image] 296 - Eenheid van de X und Y resolutie: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y en C positie: Naast liggend +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Miniatuur: (Binary data 28 bytes) diff --git a/t/Lang_13.out b/t/Lang_13.out new file mode 100644 index 0000000..a964898 --- /dev/null +++ b/t/Lang_13.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - Producent: FUJIFILM +[EXIF, IFD0, Camera] 272 - Aparat: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientacja obrazu: 0° (góra/lewo) +[EXIF, IFD0, Image] 282 - Rozdzielczość obrazu w poziomie: 72 +[EXIF, IFD0, Image] 283 - Rozdzielczość obrazu w pionie: 72 +[EXIF, IFD0, Image] 296 - Jednostka rozdzielczoÅ›ci X i Y: Cal +[EXIF, IFD0, Image] 305 - Oprogramowanie: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Data i godzina zmiany pliku: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Pozycje Y i C: Obok siebie (?) +[EXIF, IFD0, Author] 33432 - Posiadacz praw autorskich: +[EXIF, ExifIFD, Image] 33437 - PrzysÅ‚ona: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Program ekspozycji: Normalny program +[EXIF, ExifIFD, Image] 34855 - CzuÅ‚ość ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Wersja Exif: 0210 +[EXIF, ExifIFD, Time] 36867 - Pierwotna data i godzina: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Data utworzenia: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Znaczenie każdego komponentu: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Tryb kompresji obrazu: 1.6 +[EXIF, ExifIFD, Image] 37377 - PrÄ™dkość migawki: 1/64 +[EXIF, ExifIFD, Image] 37378 - PrzysÅ‚ona: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Różnica ekspozycji: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Tryb pomiaru: Wzór +[EXIF, ExifIFD, Camera] 37385 - Lampa: NastÄ…piÅ‚ bÅ‚ysk lampy +[EXIF, ExifIFD, Camera] 37386 - Ogniskowa: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - ObsÅ‚ugiwana wersja Flashpix: 0100 +[EXIF, ExifIFD, Image] 40961 - Informacja o przestrzeni barwowej: sRGB +[EXIF, ExifIFD, Image] 40962 - Szerokość obrazu: 1600 +[EXIF, ExifIFD, Image] 40963 - Wysokość obrazu: 1200 +[EXIF, InteropIFD, Image] 1 - Identyfikacja wzajemnej zgodnoÅ›ci: R98: Plik zasadniczy DCF (sRGB) +[EXIF, InteropIFD, Image] 2 - Wersja wzajemnej zgodnoÅ›ci: 0100 +[EXIF, ExifIFD, Camera] 41486 - Rozdzielczość w pÅ‚aszczyźnie ogniskowej - oÅ› x: 3053 +[EXIF, ExifIFD, Camera] 41487 - Rozdzielczość w pÅ‚aszczyźnie ogniskowej - oÅ› y: 3053 +[EXIF, ExifIFD, Camera] 41488 - Jednostka rozdzielczoÅ›ci w pÅ‚aszczyźnie ogniskowej: cm +[EXIF, ExifIFD, Camera] 41495 - Metoda pomiaru: Jednoprocesorowy sensor obszaru koloru +[EXIF, ExifIFD, Image] 41728 - ŹródÅ‚o pliku: DSC +[EXIF, ExifIFD, Image] 41729 - Rodzaj sceny: ZdjÄ™cie uzyskane bezpoÅ›rednio +[EXIF, IFD1, Image] 259 - Algorytm kompresji: JPEG (w starym stylu) +[EXIF, IFD1, Image] 274 - Orientacja obrazu: 0° (góra/lewo) +[EXIF, IFD1, Image] 282 - Rozdzielczość obrazu w poziomie: 72 +[EXIF, IFD1, Image] 283 - Rozdzielczość obrazu w pionie: 72 +[EXIF, IFD1, Image] 296 - Jednostka rozdzielczoÅ›ci X i Y: Cal +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Pozycje Y i C: Obok siebie (?) +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Miniatura: (Binary data 28 bytes) diff --git a/t/Lang_14.out b/t/Lang_14.out new file mode 100644 index 0000000..d5d0648 --- /dev/null +++ b/t/Lang_14.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - Производитель: FUJIFILM +[EXIF, IFD0, Camera] 272 - Модель камеры: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - ОриентациÑ: Ð“Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ +[EXIF, IFD0, Image] 282 - Разрешение по X: 72 +[EXIF, IFD0, Image] 283 - Разрешение по Y: 72 +[EXIF, IFD0, Image] 296 - Единицы Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾ X и Y: дюймы +[EXIF, IFD0, Image] 305 - Приложение: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Дата редактированиÑ: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Положение точки, определÑющей цвет в Y Cb Cr: СовмеÑтимый +[EXIF, IFD0, Author] 33432 - ÐвторÑкое право: +[EXIF, ExifIFD, Image] 33437 - Диафрагменное чиÑло: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Программа ÑкÑпозиции: ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð½Ð°Ñ Ð°Ð²Ñ‚Ð¾ÑкÑÐ¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - ВерÑÐ¸Ñ Exif: 0210 +[EXIF, ExifIFD, Time] 36867 - Дата Ñъёмки: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Дата оцифровки: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð¾Ð²: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Сжатых бит на пикÑель: 1.6 +[EXIF, ExifIFD, Image] 37377 - СкороÑÑ‚ÑŒ ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ñ‚Ð²Ð¾Ñ€Ð°: 1/64 +[EXIF, ExifIFD, Image] 37378 - Диафрагма: 3.5 +[EXIF, ExifIFD, Image] 37379 - Значение ÑркоÑти: 2 +[EXIF, ExifIFD, Image] 37380 - КомпенÑÐ°Ñ†Ð¸Ñ ÑкÑпозиции: 0 +[EXIF, ExifIFD, Camera] 37381 - МакÑимальное значение диафрагмы: 3.5 +[EXIF, ExifIFD, Camera] 37383 - ЭкÑпозамер: Оценочный/Многозонный +[EXIF, ExifIFD, Camera] 37385 - СоÑтоÑние вÑпышки при Ñъёмке: Ð’Ñпышка Ñработала +[EXIF, ExifIFD, Camera] 37386 - ФокуÑное раÑÑтоÑние: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - ВерÑÐ¸Ñ Flashpix: 0100 +[EXIF, ExifIFD, Image] 40961 - Цветовое проÑтранÑтво: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif – Ширина изображениÑ: 1600 +[EXIF, ExifIFD, Image] 40963 - Exif – Ð’Ñ‹Ñота изображениÑ: 1200 +[EXIF, InteropIFD, Image] 1 - Ð˜Ð½Ð´ÐµÐºÑ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¾Ð¹ ÑовмеÑтимоÑти: R98 – ОÑновной файл DCF (sRGB) +[EXIF, InteropIFD, Image] 2 - ВерÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¾Ð¹ ÑовмеÑтимоÑти: 0100 +[EXIF, ExifIFD, Camera] 41486 - Разрешение в фокальной плоÑкоÑти по X: 3053 +[EXIF, ExifIFD, Camera] 41487 - Разрешение в фокальной плоÑкоÑти по Y: 3053 +[EXIF, ExifIFD, Camera] 41488 - Единицы Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð² фокальной плоÑкоÑти: Ñм +[EXIF, ExifIFD, Camera] 41495 - Тип датчика: Одночиповый цветной ÑенÑор +[EXIF, ExifIFD, Image] 41728 - ИÑточник файла: Ð¦Ð¸Ñ„Ñ€Ð¾Ð²Ð°Ñ Ñ„Ð¾Ñ‚Ð¾ÐºÐ°Ð¼ÐµÑ€Ð° +[EXIF, ExifIFD, Image] 41729 - Тип Ñцены: Сфотографировано цифровой камерой +[EXIF, IFD1, Image] 259 - Метод ÑжатиÑ: JPEG (Ñтарый Ñтиль) +[EXIF, IFD1, Image] 274 - ОриентациÑ: Ð“Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ +[EXIF, IFD1, Image] 282 - Разрешение по X: 72 +[EXIF, IFD1, Image] 283 - Разрешение по Y: 72 +[EXIF, IFD1, Image] 296 - Единицы Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾ X и Y: дюймы +[EXIF, IFD1, Image] 513 - Смещение миниатюры: 1096 +[EXIF, IFD1, Image] 514 - Строк в миниатюре: 28 +[EXIF, IFD1, Image] 531 - Положение точки, определÑющей цвет в Y Cb Cr: СовмеÑтимый +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Миниатюра изображениÑ: (Binary data 28 bytes) diff --git a/t/Lang_15.out b/t/Lang_15.out new file mode 100644 index 0000000..3eff3e6 --- /dev/null +++ b/t/Lang_15.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - Tillverkare: FUJIFILM +[EXIF, IFD0, Camera] 272 - Kamera: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientering: Positiv riktning +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Enhet för X- och Y-upplösning: tum +[EXIF, IFD0, Image] 305 - Programvara: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Filändringsdatum och -tid: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Y- och C-placering: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright-innehavare: +[EXIF, ExifIFD, Image] 33437 - Bländare: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exponeringsprogram: Normalt program +[EXIF, ExifIFD, Image] 34855 - ISO värde: 100 +[EXIF, ExifIFD, Image] 36864 - Exif-version: 0210 +[EXIF, ExifIFD, Time] 36867 - Ursprungligt datum & tid: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Skapat datum: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Enskilda komponenters betydelse: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Bildkomprimeringsläge: 1.6 +[EXIF, ExifIFD, Image] 37377 - Slutartid: 1/64 +[EXIF, ExifIFD, Image] 37378 - Bländare: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Exponeringsförskjutning: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Mätningstyp: Mönster +[EXIF, ExifIFD, Camera] 37385 - Blixt: Blixten utlöstes +[EXIF, ExifIFD, Camera] 37386 - Brännvidd: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix-version som stöds: 0100 +[EXIF, ExifIFD, Image] 40961 - FärgomrÃ¥desinformation: sRGB +[EXIF, ExifIFD, Image] 40962 - Giltig bildbredd: 1600 +[EXIF, ExifIFD, Image] 40963 - Giltig bildhöjd: 1200 +[EXIF, InteropIFD, Image] 1 - Interoperability Identification: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Avkänningsmetod: One-chip color area sensor +[EXIF, ExifIFD, Image] 41728 - Filkälla: DSC +[EXIF, ExifIFD, Image] 41729 - Motivtyp: En direktfotograferad bild +[EXIF, IFD1, Image] 259 - Komprimeringsschema: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientering: Positiv riktning +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Enhet för X- och Y-upplösning: tum +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y- och C-placering: Co-sited +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Miniatyr: (Binary data 28 bytes) diff --git a/t/Lang_16.out b/t/Lang_16.out new file mode 100644 index 0000000..940d993 --- /dev/null +++ b/t/Lang_16.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - Ãœretici: FUJIFILM +[EXIF, IFD0, Camera] 272 - Kamera: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Yönelim: Pozitif yön +[EXIF, IFD0, Image] 282 - X çözünürlüğü: 72 +[EXIF, IFD0, Image] 283 - Y çözünürlüğü: 72 +[EXIF, IFD0, Image] 296 - X ve Y birim çözünürlüğü: inç +[EXIF, IFD0, Image] 305 - Kullanılan yazılım: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Dosya deÄŸiÅŸim tarih ve zamanı: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Y ve C konumlama: Birlikte-konumlanmış +[EXIF, IFD0, Author] 33432 - Telif hakkı sahibi: +[EXIF, ExifIFD, Image] 33437 - Açıklık: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Pozlama program: Normal program +[EXIF, ExifIFD, Image] 34855 - ISO deÄŸeri: 100 +[EXIF, ExifIFD, Image] 36864 - Exif sürüm: 0210 +[EXIF, ExifIFD, Time] 36867 - Orjinal Tarih & Zaman: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - OluÅŸturma Tarihi: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Her komponentin anlamı: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Ä°maj sıkıştıma modu: 1.6 +[EXIF, ExifIFD, Image] 37377 - Deklanşör hızı: 1/64 +[EXIF, ExifIFD, Image] 37378 - Açıklık: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Pozlama Sapması: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Ölçü modu: Desen +[EXIF, ExifIFD, Camera] 37385 - FlaÅŸ: FlaÅŸ patladı +[EXIF, ExifIFD, Camera] 37386 - Odak uzunluÄŸu: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Desteklenen Flashpix sürümü: 0100 +[EXIF, ExifIFD, Image] 40961 - Renk alanı bilgisi: sRGB +[EXIF, ExifIFD, Image] 40962 - Geçerli imaj eni: 1600 +[EXIF, ExifIFD, Image] 40963 - Geçerli imaj yüksekliÄŸi: 1200 +[EXIF, InteropIFD, Image] 1 - Interoperabilite Tanımı: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperabilite Sürümü: 0100 +[EXIF, ExifIFD, Camera] 41486 - Odak düzlemi X çözünürlüğü: 3053 +[EXIF, ExifIFD, Camera] 41487 - Odak düzlemi Y çözünürlüğü: 3053 +[EXIF, ExifIFD, Camera] 41488 - Odak düzlemi çözünürlük birimi: cm +[EXIF, ExifIFD, Camera] 41495 - Alıcı metodu: Tek-çip renk alanı alıcı +[EXIF, ExifIFD, Image] 41728 - Dosya kaynağı: DSC +[EXIF, ExifIFD, Image] 41729 - Senaryo tipi: DoÄŸrudan fotograflanmış imaj +[EXIF, IFD1, Image] 259 - Sıkıştırma planı: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Yönelim: Pozitif yön +[EXIF, IFD1, Image] 282 - X çözünürlüğü: 72 +[EXIF, IFD1, Image] 283 - Y çözünürlüğü: 72 +[EXIF, IFD1, Image] 296 - X ve Y birim çözünürlüğü: inç +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y ve C konumlama: Birlikte-konumlanmış +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Küçük Resim: (Binary data 28 bytes) diff --git a/t/Lang_17.out b/t/Lang_17.out new file mode 100644 index 0000000..27ecf29 --- /dev/null +++ b/t/Lang_17.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - 厂商: FUJIFILM +[EXIF, IFD0, Camera] 272 - åž‹å·: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - 图åƒå–å‘: 0° (上/å·¦) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - 图åƒé«˜å®½åˆ†è¾¨çŽ‡å•ä½: 英寸 +[EXIF, IFD0, Image] 305 - 使用软件: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - 文件改å˜çš„日期和时间: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - YCC åƒç´ ç»“æž„(Y å’Œ C çš„ä½ç½®): 一致 +[EXIF, IFD0, Author] 33432 - 专利拥有者: +[EXIF, ExifIFD, Image] 33437 - 光圈数: 3.5 +[EXIF, ExifIFD, Camera] 34850 - æ›å…‰ç¨‹åº: ä¸€èˆ¬ç¨‹åº +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif 版本: 0210 +[EXIF, ExifIFD, Time] 36867 - 原始数æ®äº§ç”Ÿçš„日期和时间: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - æ•°å­—æ•°æ®äº§ç”Ÿçš„日期和时间: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - å„分组的å«ä¹‰: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - 图åƒåŽ‹ç¼©æ¨¡å¼: 1.6 +[EXIF, ExifIFD, Image] 37377 - 快门速度: 1/64 +[EXIF, ExifIFD, Image] 37378 - 光圈: 3.5 +[EXIF, ExifIFD, Image] 37379 - 亮度: 2 +[EXIF, ExifIFD, Image] 37380 - æ›å…‰åå·®: 0 +[EXIF, ExifIFD, Camera] 37381 - 最大镜头光圈: 3.5 +[EXIF, ExifIFD, Camera] 37383 - 测é‡æ–¹å¼: 分割测光 +[EXIF, ExifIFD, Camera] 37385 - 闪光: 闪光ç¯äº® +[EXIF, ExifIFD, Camera] 37386 - 焦è·: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - 支æŒçš„ Flashpix 版本: 0100 +[EXIF, ExifIFD, Image] 40961 - 色彩空间信æ¯: sRGB +[EXIF, ExifIFD, Image] 40962 - åƒå®½: 1600 +[EXIF, ExifIFD, Image] 40963 - åƒé«˜: 1200 +[EXIF, InteropIFD, Image] 1 - 互用标识: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - 互用版本: 0100 +[EXIF, ExifIFD, Camera] 41486 - ç„¦å¹³é¢ X 分辨率: 3053 +[EXIF, ExifIFD, Camera] 41487 - ç„¦å¹³é¢ Y 分辨率: 3053 +[EXIF, ExifIFD, Camera] 41488 - 焦平é¢åˆ†è¾¨çŽ‡å•ä½: cm +[EXIF, ExifIFD, Camera] 41495 - 感应方法: å•ç‰‡è‰²å½©åŒºæ„Ÿåº”器 +[EXIF, ExifIFD, Image] 41728 - 文件æ¥æº: æ•°ç ç›¸æœº +[EXIF, ExifIFD, Image] 41729 - 场景类型: 直接æ‹æ‘„çš„å›¾åƒ +[EXIF, IFD1, Image] 259 - 压缩方案: JPEG (旧样å¼) +[EXIF, IFD1, Image] 274 - 图åƒå–å‘: 0° (上/å·¦) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - 图åƒé«˜å®½åˆ†è¾¨çŽ‡å•ä½: 英寸 +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - YCC åƒç´ ç»“æž„(Y å’Œ C çš„ä½ç½®): 一致 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - 缩略图: (Binary data 28 bytes) diff --git a/t/Lang_18.out b/t/Lang_18.out new file mode 100644 index 0000000..28ddd09 --- /dev/null +++ b/t/Lang_18.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - 製造商: FUJIFILM +[EXIF, IFD0, Camera] 272 - 相機型號: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - å½±åƒçš„æ–¹å‘: 0° (頂端/左邊) +[EXIF, IFD0, Image] 282 - 水平解æžåº¦: 72 +[EXIF, IFD0, Image] 283 - 垂直解æžåº¦: 72 +[EXIF, IFD0, Image] 296 - 寬與高的單ä½: è‹±å‹ +[EXIF, IFD0, Image] 305 - 軟體: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - 檔案建立日期åŠæ™‚é–“: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Y åŠ C 的設定: 一致 +[EXIF, IFD0, Author] 33432 - 版權æ“有人: +[EXIF, ExifIFD, Image] 33437 - 光圈: 3.5 +[EXIF, ExifIFD, Camera] 34850 - æ‹æ”模å¼: 正常 +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif 版本: 0210 +[EXIF, ExifIFD, Time] 36867 - 原始影åƒæ—¥æœŸæ™‚é–“: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - 數ä½åŒ–的日期時間: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - æ¯å€‹çµ„æˆéƒ¨åˆ†çš„æ„義: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - å½±åƒå£“縮模å¼: 1.6 +[EXIF, ExifIFD, Image] 37377 - å¿«é–€: 1/64 +[EXIF, ExifIFD, Image] 37378 - 光圈: 3.5 +[EXIF, ExifIFD, Image] 37379 - 亮度: 2 +[EXIF, ExifIFD, Image] 37380 - æ›å…‰è£œå„Ÿ: 0 +[EXIF, ExifIFD, Camera] 37381 - é¡é ­æœ€å¤§å…‰åœˆ: 3.5 +[EXIF, ExifIFD, Camera] 37383 - 測光模å¼: 評價測光 +[EXIF, ExifIFD, Camera] 37385 - 閃光燈: 閃光燈擊發 +[EXIF, ExifIFD, Camera] 37386 - 焦è·: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - æ”¯æ´ Flashpix 版本: 0100 +[EXIF, ExifIFD, Image] 40961 - 色彩空間: sRGB +[EXIF, ExifIFD, Image] 40962 - å½±åƒå¯¬åº¦: 1600 +[EXIF, ExifIFD, Image] 40963 - å½±åƒé«˜åº¦: 1200 +[EXIF, InteropIFD, Image] 1 - 互通性鑑定: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - 互通性版本: 0100 +[EXIF, ExifIFD, Camera] 41486 - X軸焦平é¢åˆ†è¾¨çŽ‡: 3053 +[EXIF, ExifIFD, Camera] 41487 - Y軸焦平é¢åˆ†è¾¨çŽ‡: 3053 +[EXIF, ExifIFD, Camera] 41488 - 焦平é¢åˆ†è¾¨çŽ‡å–®ä½: cm +[EXIF, ExifIFD, Camera] 41495 - 感測器類型: 單晶片彩色感測器 +[EXIF, ExifIFD, Image] 41728 - 檔案來æº: 數ä½ç›¸æ©Ÿ +[EXIF, ExifIFD, Image] 41729 - 場景類型: 直接æ‹æ”çš„å½±åƒ +[EXIF, IFD1, Image] 259 - 壓縮方å¼: JPEG (舊å¼) +[EXIF, IFD1, Image] 274 - å½±åƒçš„æ–¹å‘: 0° (頂端/左邊) +[EXIF, IFD1, Image] 282 - 水平解æžåº¦: 72 +[EXIF, IFD1, Image] 283 - 垂直解æžåº¦: 72 +[EXIF, IFD1, Image] 296 - 寬與高的單ä½: è‹±å‹ +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y åŠ C 的設定: 一致 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - 縮略圖: (Binary data 28 bytes) diff --git a/t/Lang_2.out b/t/Lang_2.out new file mode 100644 index 0000000..47d643a --- /dev/null +++ b/t/Lang_2.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - Výrobce: FUJIFILM +[EXIF, IFD0, Camera] 272 - Typ fotoaparátu: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientace: 0° (nahoru/vlevo) +[EXIF, IFD0, Image] 282 - RozliÅ¡ení obrázku na šířku: 72 +[EXIF, IFD0, Image] 283 - RozliÅ¡ení obrázku na výšku: 72 +[EXIF, IFD0, Image] 296 - Jednotka X a Y rozliÅ¡ení: Palce +[EXIF, IFD0, Image] 305 - Použitý software: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Datum a Äas zmÄ›ny souboru: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Y a C pozice: Po stranách +[EXIF, IFD0, Author] 33432 - Držitel práv: +[EXIF, ExifIFD, Image] 33437 - F hodnota: 3.5 +[EXIF, ExifIFD, Camera] 34850 - ExpoziÄní mod: Normální program +[EXIF, ExifIFD, Image] 34855 - Citlivost ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif verze: 0210 +[EXIF, ExifIFD, Time] 36867 - Datum a Äas vzniku originálních dat: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Datum a Äas generování digitálních dat: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - UrÄení složek: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - KomprimaÄní mod: 1.6 +[EXIF, ExifIFD, Image] 37377 - ÄŒas závÄ›rky: 1/64 +[EXIF, ExifIFD, Image] 37378 - Clona: 3.5 +[EXIF, ExifIFD, Image] 37379 - Jas: 2 +[EXIF, ExifIFD, Image] 37380 - Korekce expozice: 0 +[EXIF, ExifIFD, Camera] 37381 - Max clona objektivu: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Režim měření expozice: Multi segment +[EXIF, ExifIFD, Camera] 37385 - Blesk: Blesk ano +[EXIF, ExifIFD, Camera] 37386 - Ohnisková vzdálenost: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Podporovaná verze Flashpix: 0100 +[EXIF, ExifIFD, Image] 40961 - Barevný prostor: sRGB +[EXIF, ExifIFD, Image] 40962 - Šířka: 1600 +[EXIF, ExifIFD, Image] 40963 - Výška: 1200 +[EXIF, InteropIFD, Image] 1 - Identifikace: R98: DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Verze kompatibility: 0100 +[EXIF, ExifIFD, Camera] 41486 - Horizontální rozliÅ¡ení senzoru: 3053 +[EXIF, ExifIFD, Camera] 41487 - Vertikální rozliÅ¡ení senzoru: 3053 +[EXIF, ExifIFD, Camera] 41488 - Jednotka rozliÅ¡ení senzoru: cm +[EXIF, ExifIFD, Camera] 41495 - Metoda měření: JednoÄipový barevný senzor +[EXIF, ExifIFD, Image] 41728 - Zdroj dat: Digitální fotoaparát +[EXIF, ExifIFD, Image] 41729 - Typ scény: Přímo pořízený snímek +[EXIF, IFD1, Image] 259 - Kompresní algoritmus: JPEG (pův. verze) +[EXIF, IFD1, Image] 274 - Orientace: 0° (nahoru/vlevo) +[EXIF, IFD1, Image] 282 - RozliÅ¡ení obrázku na šířku: 72 +[EXIF, IFD1, Image] 283 - RozliÅ¡ení obrázku na výšku: 72 +[EXIF, IFD1, Image] 296 - Jednotka X a Y rozliÅ¡ení: Palce +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y a C pozice: Po stranách +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Náhled: (Binary data 28 bytes) diff --git a/t/Lang_3.out b/t/Lang_3.out new file mode 100644 index 0000000..c811d8c --- /dev/null +++ b/t/Lang_3.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - Gerätehersteller: FUJIFILM +[EXIF, IFD0, Camera] 272 - Kameramodell: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Ausrichtung: Horizontal (normal) +[EXIF, IFD0, Image] 282 - Horizontale Bildauflösung: 72 +[EXIF, IFD0, Image] 283 - Vertikale Bildauflösung: 72 +[EXIF, IFD0, Image] 296 - Einheit der X- und Y-Auflösung: Zoll +[EXIF, IFD0, Image] 305 - Software: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Änderungsdatum: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Y und C Ausrichtung: Benachbart +[EXIF, IFD0, Author] 33432 - Urheberrechtsvermerk: +[EXIF, ExifIFD, Image] 33437 - F-Wert: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Belichtungsprogramm: Programmautomatik +[EXIF, ExifIFD, Image] 34855 - ISO-Empfindlichkeit: 100 +[EXIF, ExifIFD, Image] 36864 - Exif-Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Erstellungsdatum/-uhrzeit: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Digitalisierungsdatum/-uhrzeit: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Bedeutung jeder Komponente: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Bildkomprimierungsmodus: 1.6 +[EXIF, ExifIFD, Image] 37377 - Belichtungszeit: 1/64 +[EXIF, ExifIFD, Image] 37378 - Blende: 3.5 +[EXIF, ExifIFD, Image] 37379 - Helligkeit: 2 +[EXIF, ExifIFD, Image] 37380 - Belichtungskorrektur: 0 +[EXIF, ExifIFD, Camera] 37381 - Größtmögliche Blende: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Belichtungsmessmethode: Multi-Segment +[EXIF, ExifIFD, Camera] 37385 - Blitzmodus: Blitz wurde ausgelöst +[EXIF, ExifIFD, Camera] 37386 - Brennweite: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Unterstützte Flashpix-Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Farbraum: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif-Bildbreite: 1600 +[EXIF, ExifIFD, Image] 40963 - Exif-Bildhöhe: 1200 +[EXIF, InteropIFD, Image] 1 - Interoperabilität Identifikation: R98: DCF Basic-Format (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperabilitäts-Version: 0100 +[EXIF, ExifIFD, Camera] 41486 - Sensorauflösung horizontal: 3053 +[EXIF, ExifIFD, Camera] 41487 - Sensorauflösung vertikal: 3053 +[EXIF, ExifIFD, Camera] 41488 - Einheit der Sensorauflösung: cm +[EXIF, ExifIFD, Camera] 41495 - Messmethode: Ein-Chip-Farbsensor +[EXIF, ExifIFD, Image] 41728 - Dateiquelle: Digital-Kamera +[EXIF, ExifIFD, Image] 41729 - Szenentyp: Direkt aufgenommenes Bild +[EXIF, IFD1, Image] 259 - Komprimierungsschema: JPEG (alte Version) +[EXIF, IFD1, Image] 274 - Ausrichtung: Horizontal (normal) +[EXIF, IFD1, Image] 282 - Horizontale Bildauflösung: 72 +[EXIF, IFD1, Image] 283 - Vertikale Bildauflösung: 72 +[EXIF, IFD1, Image] 296 - Einheit der X- und Y-Auflösung: Zoll +[EXIF, IFD1, Image] 513 - Miniaturbild-Datenposition: 1096 +[EXIF, IFD1, Image] 514 - Miniaturbild-Datenlänge: 28 +[EXIF, IFD1, Image] 531 - Y und C Ausrichtung: Benachbart +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Miniaturbild: (Binary data 28 bytes) diff --git a/t/Lang_4.out b/t/Lang_4.out new file mode 100644 index 0000000..b8b05f2 --- /dev/null +++ b/t/Lang_4.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Modify Date: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1.6 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Colour Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 1600 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1200 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip colour area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) diff --git a/t/Lang_5.out b/t/Lang_5.out new file mode 100644 index 0000000..b8b05f2 --- /dev/null +++ b/t/Lang_5.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Modify Date: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1.6 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Colour Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 1600 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1200 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip colour area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) diff --git a/t/Lang_6.out b/t/Lang_6.out new file mode 100644 index 0000000..446f4ae --- /dev/null +++ b/t/Lang_6.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - Marca: FUJIFILM +[EXIF, IFD0, Camera] 272 - Modelo: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientación de Imagen: 0° (arriba/izquierda) +[EXIF, IFD0, Image] 282 - Resolución Imagen Horizontal: 72 +[EXIF, IFD0, Image] 283 - Resolución Imagen Vertical: 72 +[EXIF, IFD0, Image] 296 - Unidad de Resolución de X e Y: Pulgada +[EXIF, IFD0, Image] 305 - Programa Utilizado: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Fecha y Hora de Cambio del Archivo: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Posicionamiento Y y C: Vecino +[EXIF, IFD0, Author] 33432 - Copyright Perfil: +[EXIF, ExifIFD, Image] 33437 - Número F: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Programa Exposición: Programa normal +[EXIF, ExifIFD, Image] 34855 - Ratio Velocidad ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Versión Exif: 0210 +[EXIF, ExifIFD, Time] 36867 - Fecha y Hora de Datos Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Fecha y Hora de Datos Digital: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Configuración de Componentes: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Modo Compresión Imagen: 1.6 +[EXIF, ExifIFD, Image] 37377 - Velocidad Obturación: 1/64 +[EXIF, ExifIFD, Image] 37378 - Apertura: 3.5 +[EXIF, ExifIFD, Image] 37379 - Luminosidad: 2 +[EXIF, ExifIFD, Image] 37380 - Compensación Exposición: 0 +[EXIF, ExifIFD, Camera] 37381 - Apertura Lente Máxima: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Modo Medición: Multi-segmento +[EXIF, ExifIFD, Camera] 37385 - Flash: Flash disparado +[EXIF, ExifIFD, Camera] 37386 - Distancia Focal Objetivo: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Versión Flashpix Soportado: 0100 +[EXIF, ExifIFD, Image] 40961 - Espacio Color: sRGB +[EXIF, ExifIFD, Image] 40962 - Ancho Imagen: 1600 +[EXIF, ExifIFD, Image] 40963 - Alto Imagen: 1200 +[EXIF, InteropIFD, Image] 1 - Identificación Interoperabilidad: R98: Archivo básico DCF (sRGB) +[EXIF, InteropIFD, Image] 2 - Versión Interoperabilidad: 0100 +[EXIF, ExifIFD, Camera] 41486 - Resolución X Plano Focal: 3053 +[EXIF, ExifIFD, Camera] 41487 - Resolución Y Plano Focal: 3053 +[EXIF, ExifIFD, Camera] 41488 - Unidad Resolución Plano Focal: cm +[EXIF, ExifIFD, Camera] 41495 - Método Sensor: Sensor monochip de color +[EXIF, ExifIFD, Image] 41728 - Fuente Archivo: Cámara Digital +[EXIF, ExifIFD, Image] 41729 - Tipo Escena: Imagen fotografiada directamente +[EXIF, IFD1, Image] 259 - Compresión: JPEG (estilo antiguo) +[EXIF, IFD1, Image] 274 - Orientación de Imagen: 0° (arriba/izquierda) +[EXIF, IFD1, Image] 282 - Resolución Imagen Horizontal: 72 +[EXIF, IFD1, Image] 283 - Resolución Imagen Vertical: 72 +[EXIF, IFD1, Image] 296 - Unidad de Resolución de X e Y: Pulgada +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Posicionamiento Y y C: Vecino +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Miniatura: (Binary data 28 bytes) diff --git a/t/Lang_7.out b/t/Lang_7.out new file mode 100644 index 0000000..385c296 --- /dev/null +++ b/t/Lang_7.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - Valmistaja: FUJIFILM +[EXIF, IFD0, Camera] 272 - Malli: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Kuvan suunta: 0° (ylä/vasen) +[EXIF, IFD0, Image] 282 - Kuvan vaakaresoluutio: 72 +[EXIF, IFD0, Image] 283 - Kuvan pystyresoluutio: 72 +[EXIF, IFD0, Image] 296 - X- ja Y-resoluution yksikkö: Tuuma +[EXIF, IFD0, Image] 305 - Ohjelmisto: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Tiedostomuutoksen päiväys ja aika: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Y:n ja C:n sijoitus: Vierekkäin +[EXIF, IFD0, Author] 33432 - Profiilin copyright: +[EXIF, ExifIFD, Image] 33437 - Aukkoarvo: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Valotusohjelma: Normaali ohjelma +[EXIF, ExifIFD, Image] 34855 - ISO-herkkyys: 100 +[EXIF, ExifIFD, Image] 36864 - Exif-versio: 0210 +[EXIF, ExifIFD, Time] 36867 - Alkuperäisen datan luonnin päiväys ja aika: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Digitaalisen datan luonnin päiväys ja aika: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Kunkin komponentin tarkoitus: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Kuvan pakkausmuoto: 1.6 +[EXIF, ExifIFD, Image] 37377 - Suljinnopeuden arvo: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aukkoarvo: 3.5 +[EXIF, ExifIFD, Image] 37379 - Kirkkausarvo: 2 +[EXIF, ExifIFD, Image] 37380 - Valotuksen korjaus: 0 +[EXIF, ExifIFD, Camera] 37381 - Objektiivin maksimiaukko: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Valonmittaustapa: Monisegmenttimittaus +[EXIF, ExifIFD, Camera] 37385 - Salama: Salama lauennut +[EXIF, ExifIFD, Camera] 37386 - Polttoväli: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Tuettu Flashpix-versio: 0100 +[EXIF, ExifIFD, Image] 40961 - Väriavaruus: sRGB +[EXIF, ExifIFD, Image] 40962 - Kuvan leveys: 1600 +[EXIF, ExifIFD, Image] 40963 - Kuvan korkeus: 1200 +[EXIF, InteropIFD, Image] 1 - Interoperabiliteetin identifiointi: R98: DCF-perustiedosto (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperabiliteetin versio: 0100 +[EXIF, ExifIFD, Camera] 41486 - Polttopistetason vaakaresoluutio: 3053 +[EXIF, ExifIFD, Camera] 41487 - Polttopistetason pystyresoluutio: 3053 +[EXIF, ExifIFD, Camera] 41488 - Polttopistetason resoluutioyksikkö: cm +[EXIF, ExifIFD, Camera] 41495 - Mittausmetodi: Yhden chipin värialueen anturi +[EXIF, ExifIFD, Image] 41728 - Tiedoston lähde: Digitaalikamera +[EXIF, ExifIFD, Image] 41729 - Näkymätyyppi: Suoraan otettu valokuva +[EXIF, IFD1, Image] 259 - Pakkausskeema: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Kuvan suunta: 0° (ylä/vasen) +[EXIF, IFD1, Image] 282 - Kuvan vaakaresoluutio: 72 +[EXIF, IFD1, Image] 283 - Kuvan pystyresoluutio: 72 +[EXIF, IFD1, Image] 296 - X- ja Y-resoluution yksikkö: Tuuma +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y:n ja C:n sijoitus: Vierekkäin +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Näytekuva: (Binary data 28 bytes) diff --git a/t/Lang_8.out b/t/Lang_8.out new file mode 100644 index 0000000..3f99d5a --- /dev/null +++ b/t/Lang_8.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - Fabricant: FUJIFILM +[EXIF, IFD0, Camera] 272 - Modèle d'appareil photo: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientation de l'image: 0° (haut/gauche) +[EXIF, IFD0, Image] 282 - Résolution d'image horizontale: 72 +[EXIF, IFD0, Image] 283 - Résolution d'image verticale: 72 +[EXIF, IFD0, Image] 296 - Unité de résolution en X et Y: Pouce +[EXIF, IFD0, Image] 305 - Logiciel: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Date de modification de fichier: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Positionnement Y et C: Côte à côte +[EXIF, IFD0, Author] 33432 - Propriétaire du copyright: +[EXIF, ExifIFD, Image] 33437 - Nombre F: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Programme d'exposition: Programme normal +[EXIF, ExifIFD, Image] 34855 - Sensibilité ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Version Exif: 0210 +[EXIF, ExifIFD, Time] 36867 - Date de la création des données originales: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Date de la création des données numériques: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Signification de chaque composante: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Mode de compression d'image: 1.6 +[EXIF, ExifIFD, Image] 37377 - Vitesse d'obturation: 1/64 +[EXIF, ExifIFD, Image] 37378 - Ouverture: 3.5 +[EXIF, ExifIFD, Image] 37379 - Luminosité: 2 +[EXIF, ExifIFD, Image] 37380 - Décalage d'exposition: 0 +[EXIF, ExifIFD, Camera] 37381 - Ouverture maximale de l'objectif: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Mode de mesure: Multizone +[EXIF, ExifIFD, Camera] 37385 - Flash : Flash déclenché +[EXIF, ExifIFD, Camera] 37386 - Focale de l'objectif: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Version Flashpix supportée: 0100 +[EXIF, ExifIFD, Image] 40961 - Espace colorimétrique: sRVB +[EXIF, ExifIFD, Image] 40962 - Largeur d'image: 1600 +[EXIF, ExifIFD, Image] 40963 - Hauteur d'image: 1200 +[EXIF, InteropIFD, Image] 1 - Identification d'interopérabilité: R98: fichier de base DCF (sRGB) +[EXIF, InteropIFD, Image] 2 - Version d'interopérabilité: 0100 +[EXIF, ExifIFD, Camera] 41486 - Résolution X du plan focal: 3053 +[EXIF, ExifIFD, Camera] 41487 - Résolution Y du plan focal: 3053 +[EXIF, ExifIFD, Camera] 41488 - Unité de résolution de plan focal: cm +[EXIF, ExifIFD, Camera] 41495 - Méthode de capture: Capteur monochip couleur +[EXIF, ExifIFD, Image] 41728 - Source du fichier: Appareil photo numérique +[EXIF, ExifIFD, Image] 41729 - Type de scène: Image photographiée directement +[EXIF, IFD1, Image] 259 - Schéma de compression: JPEG (ancien style) +[EXIF, IFD1, Image] 274 - Orientation de l'image: 0° (haut/gauche) +[EXIF, IFD1, Image] 282 - Résolution d'image horizontale: 72 +[EXIF, IFD1, Image] 283 - Résolution d'image verticale: 72 +[EXIF, IFD1, Image] 296 - Unité de résolution en X et Y: Pouce +[EXIF, IFD1, Image] 513 - Décalage de la vignette: 1096 +[EXIF, IFD1, Image] 514 - Longueur de la vignette: 28 +[EXIF, IFD1, Image] 531 - Positionnement Y et C: Côte à côte +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Vignette: (Binary data 28 bytes) diff --git a/t/Lang_9.out b/t/Lang_9.out new file mode 100644 index 0000000..1f23653 --- /dev/null +++ b/t/Lang_9.out @@ -0,0 +1,47 @@ +[EXIF, IFD0, Camera] 271 - Costruttore: FUJIFILM +[EXIF, IFD0, Camera] 272 - Nome modello fotocamera: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientamento: Orizzontale (normale) +[EXIF, IFD0, Image] 282 - Risoluzione orizzontale immagine: 72 +[EXIF, IFD0, Image] 283 - Risoluzione verticale immagine: 72 +[EXIF, IFD0, Image] 296 - Unità risoluzione: Pollici +[EXIF, IFD0, Image] 305 - Software utilizzato: Digital Camera FinePix2400Zoom Ver1.70 +[EXIF, IFD0, Time] 306 - Data modifica: 2001:05:19 18:36:41 +[EXIF, IFD0, Image] 531 - Posizionamento Y e C: Affiancato +[EXIF, IFD0, Author] 33432 - Titolare del copyright: +[EXIF, ExifIFD, Image] 33437 - Numero F: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Programma esposizione: Programma AE +[EXIF, ExifIFD, Image] 34855 - Sensibilità ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Versione Exif: 0210 +[EXIF, ExifIFD, Time] 36867 - Data/ora originale di creazione: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Data di creazione: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Configurazione componenti: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Bit per pixel compressi: 1.6 +[EXIF, ExifIFD, Image] 37377 - Velocità otturatore: 1/64 +[EXIF, ExifIFD, Image] 37378 - Apertura diaframma: 3.5 +[EXIF, ExifIFD, Image] 37379 - Valore di luminosità: 2 +[EXIF, ExifIFD, Image] 37380 - Compensazione esposizione: 0 +[EXIF, ExifIFD, Camera] 37381 - Diaframma massimo obiettivo: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Modalità misurazione: Multi-zona +[EXIF, ExifIFD, Camera] 37385 - Flash: Emesso +[EXIF, ExifIFD, Camera] 37386 - Lunghezza focale: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Versione Flashpix: 0100 +[EXIF, ExifIFD, Image] 40961 - Spazio colore: sRGB +[EXIF, ExifIFD, Image] 40962 - Larghezza immagine Exif: 1600 +[EXIF, ExifIFD, Image] 40963 - Altezza immagine Exif: 1200 +[EXIF, InteropIFD, Image] 1 - Identificazione interoperatività: R98 - file base DCF (sRGB) +[EXIF, InteropIFD, Image] 2 - Versione interoperatività: 0100 +[EXIF, ExifIFD, Camera] 41486 - Risoluzione X del piano focale: 3053 +[EXIF, ExifIFD, Camera] 41487 - Risoluzione Y del piano focale: 3053 +[EXIF, ExifIFD, Camera] 41488 - Unità risoluzione piano focale: cm +[EXIF, ExifIFD, Camera] 41495 - Metodo misurazione esposimetrica: Sensore area a colori a un chip +[EXIF, ExifIFD, Image] 41728 - Origine file: Fotocamera digitale +[EXIF, ExifIFD, Image] 41729 - Tipo scena: Immagine fotografata direttamente +[EXIF, IFD1, Image] 259 - Compressione: JPEG (vecchio stile) +[EXIF, IFD1, Image] 274 - Orientamento: Orizzontale (normale) +[EXIF, IFD1, Image] 282 - Risoluzione orizzontale immagine: 72 +[EXIF, IFD1, Image] 283 - Risoluzione verticale immagine: 72 +[EXIF, IFD1, Image] 296 - Unità risoluzione: Pollici +[EXIF, IFD1, Image] 513 - Offset miniatura: 1096 +[EXIF, IFD1, Image] 514 - Dimensioni miniatura: 28 +[EXIF, IFD1, Image] 531 - Posizionamento Y e C: Affiancato +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Miniatura: (Binary data 28 bytes) diff --git a/t/Lytro.t b/t/Lytro.t new file mode 100644 index 0000000..2d3d849 --- /dev/null +++ b/t/Lytro.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Lytro.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Lytro; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Lytro'; +my $testnum = 1; + +# test 2: Extract information from Lytro.lfp +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Lytro.lfp'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Lytro_2.out b/t/Lytro_2.out new file mode 100644 index 0000000..4c6c982 --- /dev/null +++ b/t/Lytro_2.out @@ -0,0 +1,109 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Lytro.lfp +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 4.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2014:07:17 11:22:05-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:41-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: LFP +[File, File, Other] FileTypeExtension - File Type Extension: lfp +[File, File, Other] MIMEType - MIME Type: image/x-lytro-lfp +[Lytro, Lytro, Camera] JSONMetadata - JSON Metadata: [(Binary data 778 bytes),(Binary data 3155 bytes),(Binary data 131 bytes)] +[Lytro, Lytro, Image] PictureDerivationArray - Picture Derivation Array: sha1-f58530c3902263bfc1d411cac2b965d635fb6287 +[Lytro, Lytro, Image] PictureFrameArrayFrameImageRef - Picture Frame Array Frame Image Ref: sha1-0360f825e6eed3c7c470fb79a755a54df07fae84 +[Lytro, Lytro, Image] PictureFrameArrayFrameMetadataRef - Picture Frame Array Frame Metadata Ref: sha1-031d1e1d0e65efcd6ea74c811a0bc170498d8574 +[Lytro, Lytro, Image] PictureFrameArrayFramePrivateMetadataRef - Picture Frame Array Frame Private Metadata Ref: sha1-990a1858fe077fa0601df485704fc1d674a5e6b0 +[Lytro, Lytro, Image] PictureFrameArrayParametersVendorContentCom.lytro.tagsDarkFrame - Picture Frame Array Dark Frame: false +[Lytro, Lytro, Image] PictureFrameArrayParametersVendorContentCom.lytro.tagsModulationFrame - Picture Frame Array Modulation Frame: false +[Lytro, Lytro, Image] PictureViewArrayType - Picture View Array Type: com.lytro.stars +[Lytro, Lytro, Image] PictureViewArrayVendorContentStarred - Picture View Array Vendor Content Starred: true +[Lytro, Lytro, Image] VersionMajor - Version Major: 1 +[Lytro, Lytro, Image] VersionMinor - Version Minor: 0 +[Lytro, Lytro, Image] VersionProvisionalDate - Version Provisional Date: 2011-08-03 +[Lytro, Lytro, Camera] CameraFirmware - Firmware Version: v1.0a60, vv1.0.0, Thu Feb 23 15:02:57 PST 2012, e10fcca0668db3dbf94ae347248db3da070d21e9, mods=0, ofw=0 +[Lytro, Lytro, Camera] CameraMake - Make: Lytro, Inc. +[Lytro, Lytro, Camera] CameraModel - Camera Model Name: F01 +[Lytro, Lytro, Camera] DevicesAccelerometerSampleArrayTime - Accelerometer Time: 0 +[Lytro, Lytro, Camera] DevicesAccelerometerSampleArrayX - Accelerometer X: -0.039215687662363052368 +[Lytro, Lytro, Camera] DevicesAccelerometerSampleArrayY - Accelerometer Y: 0.94117647409439086914 +[Lytro, Lytro, Camera] DevicesAccelerometerSampleArrayZ - Accelerometer Z: 0.2509804069995880127 +[Lytro, Lytro, Time] DevicesClockZuluTime - Date/Time Original: 2012:04:12 14:10:55.000Z +[Lytro, Lytro, Camera] DevicesLensExitPupilOffsetZ - Lens Exit Pupil Offset Z: 0.11637913513183592573 +[Lytro, Lytro, Camera] DevicesLensFNumber - F Number: 1.9 +[Lytro, Lytro, Camera] DevicesLensFocalLength - Focal Length: 6.4 mm +[Lytro, Lytro, Camera] DevicesLensFocusStep - Lens Focus Step: 721 +[Lytro, Lytro, Camera] DevicesLensFocusStepperOffset - Lens Focus Stepper Offset: -13 +[Lytro, Lytro, Camera] DevicesLensInfinityLambda - Lens Infinity Lambda: 43.904331207275390625 +[Lytro, Lytro, Camera] DevicesLensTemperature - Lens Temperature: 34.1 C +[Lytro, Lytro, Camera] DevicesLensTemperatureAdc - Lens Temperature Adc: 2633 +[Lytro, Lytro, Camera] DevicesLensZoomStep - Lens Zoom Step: 981 +[Lytro, Lytro, Camera] DevicesLensZoomStepperOffset - Lens Zoom Stepper Offset: -1 +[Lytro, Lytro, Camera] DevicesMlaLensPitch - Mla Lens Pitch: 1.3898614883422850808e-05 +[Lytro, Lytro, Camera] DevicesMlaRotation - Mla Rotation: -0.00028155732434242963791 +[Lytro, Lytro, Camera] DevicesMlaScaleFactorX - Mla Scale Factor X: 1 +[Lytro, Lytro, Camera] DevicesMlaScaleFactorY - Mla Scale Factor Y: 1.0004389286041259766 +[Lytro, Lytro, Camera] DevicesMlaSensorOffsetX - Mla Sensor Offset X: -3.5040323734283452459e-06 +[Lytro, Lytro, Camera] DevicesMlaSensorOffsetY - Mla Sensor Offset Y: -1.6298500299453736302e-06 +[Lytro, Lytro, Camera] DevicesMlaSensorOffsetZ - Mla Sensor Offset Z: 2.5000000000000001198e-05 +[Lytro, Lytro, Camera] DevicesMlaTiling - Mla Tiling: hexUniformRowMajor +[Lytro, Lytro, Camera] DevicesNdfilterExposureBias - Ndfilter Exposure Bias: 3.8281672000885009766 +[Lytro, Lytro, Camera] DevicesSensorAnalogGainB - Sensor Analog Gain B: 2.03125 +[Lytro, Lytro, Camera] DevicesSensorAnalogGainGb - Sensor Analog Gain Gb: 1.75 +[Lytro, Lytro, Camera] DevicesSensorAnalogGainGr - Sensor Analog Gain Gr: 1.75 +[Lytro, Lytro, Camera] DevicesSensorAnalogGainR - Sensor Analog Gain R: 2.375 +[Lytro, Lytro, Camera] DevicesSensorBitsPerPixel - Sensor Bits Per Pixel: 12 +[Lytro, Lytro, Camera] DevicesSensorIso - ISO: 87 +[Lytro, Lytro, Camera] DevicesSensorMosaicTile - Sensor Mosaic Tile: r,gr:gb,b +[Lytro, Lytro, Camera] DevicesSensorMosaicUpperLeftPixel - Sensor Mosaic Upper Left Pixel: b +[Lytro, Lytro, Camera] DevicesSensorPixelPitch - Focal Plane X Resolution: 18142.8574518282 +[Lytro, Lytro, Camera] DevicesShutterFrameExposureDuration - Frame Exposure Time: 1/250 +[Lytro, Lytro, Camera] DevicesShutterMechanism - Shutter Mechanism: sensorOpenApertureClose +[Lytro, Lytro, Camera] DevicesShutterPixelExposureDuration - Exposure Time: 1/250 +[Lytro, Lytro, Camera] DevicesSocTemperature - Soc Temperature: 43.5 C +[Lytro, Lytro, Camera] DevicesSocTemperatureAdc - Soc Temperature Adc: 2776 +[Lytro, Lytro, Image] ImageColorCcmRgbToSrgbArray - Image Color Ccm Rgb To Srgb Array: 3.1115827560424804688, -1.9393929243087768555, -0.17218986153602600098, -0.36290559172630310059, 1.6408803462982177734, -0.27797481417655944824, 0.078967012465000152588, -1.1558042764663696289, 2.0768373012542724609 +[Lytro, Lytro, Image] ImageColorGamma - Image Color Gamma: 0.41666001081466674805 +[Lytro, Lytro, Image] ImageColorWhiteBalanceGainB - Image Color White Balance Gain B: 1.48046875 +[Lytro, Lytro, Image] ImageColorWhiteBalanceGainGb - Image Color White Balance Gain Gb: 1 +[Lytro, Lytro, Image] ImageColorWhiteBalanceGainGr - Image Color White Balance Gain Gr: 1 +[Lytro, Lytro, Image] ImageColorWhiteBalanceGainR - Image Color White Balance Gain R: 1.01171875 +[Lytro, Lytro, Image] ImageHeight - Image Height: 3280 +[Lytro, Lytro, Image] ImageLimitExposureBias - Image Limit Exposure Bias: +0.0 +[Lytro, Lytro, Image] ImageModulationExposureBias - Image Modulation Exposure Bias: -1.2 +[Lytro, Lytro, Image] ImageOrientation - Orientation: Horizontal (normal) +[Lytro, Lytro, Image] ImageRawDetailsMosaicTile - Image Raw Details Mosaic Tile: r,gr:gb,b +[Lytro, Lytro, Image] ImageRawDetailsMosaicUpperLeftPixel - Image Raw Details Mosaic Upper Left Pixel: b +[Lytro, Lytro, Image] ImageRawDetailsPixelFormatBlackB - Image Raw Details Pixel Format Black B: 168 +[Lytro, Lytro, Image] ImageRawDetailsPixelFormatBlackGb - Image Raw Details Pixel Format Black Gb: 168 +[Lytro, Lytro, Image] ImageRawDetailsPixelFormatBlackGr - Image Raw Details Pixel Format Black Gr: 168 +[Lytro, Lytro, Image] ImageRawDetailsPixelFormatBlackR - Image Raw Details Pixel Format Black R: 168 +[Lytro, Lytro, Image] ImageRawDetailsPixelFormatRightShift - Image Raw Details Pixel Format Right Shift: 0 +[Lytro, Lytro, Image] ImageRawDetailsPixelFormatWhiteB - Image Raw Details Pixel Format White B: 4095 +[Lytro, Lytro, Image] ImageRawDetailsPixelFormatWhiteGb - Image Raw Details Pixel Format White Gb: 4095 +[Lytro, Lytro, Image] ImageRawDetailsPixelFormatWhiteGr - Image Raw Details Pixel Format White Gr: 4095 +[Lytro, Lytro, Image] ImageRawDetailsPixelFormatWhiteR - Image Raw Details Pixel Format White R: 4095 +[Lytro, Lytro, Image] ImageRawDetailsPixelPackingBitsPerPixel - Image Raw Details Pixel Packing Bits Per Pixel: 12 +[Lytro, Lytro, Image] ImageRawDetailsPixelPackingEndianness - Image Raw Details Pixel Packing Endianness: big +[Lytro, Lytro, Image] ImageRepresentation - Image Representation: rawPacked +[Lytro, Lytro, Image] ImageWidth - Image Width: 3280 +[Lytro, Lytro, Image] ModesCreative - Modes Creative: tap +[Lytro, Lytro, Image] ModesRegionOfInterestArrayType - Modes Region Of Interest Array Type: exposure +[Lytro, Lytro, Image] ModesRegionOfInterestArrayX - Modes Region Of Interest Array X: 0.26874190568923950195 +[Lytro, Lytro, Image] ModesRegionOfInterestArrayY - Modes Region Of Interest Array Y: 0.55208665132522583008 +[Lytro, Lytro, Image] ModesRegionOfInterestArrayType - Modes Region Of Interest Array Type: creative +[Lytro, Lytro, Image] ModesRegionOfInterestArrayX - Modes Region Of Interest Array X: 0.26874190568923950195 +[Lytro, Lytro, Image] ModesRegionOfInterestArrayY - Modes Region Of Interest Array Y: 0.55208665132522583008 +[Lytro, Lytro, Camera] Type - Camera Type: lightField +[Lytro, Lytro, Camera] CameraSerialNumber - Serial Number: A202110453 +[Lytro, Lytro, Camera] DevicesSensorSensorSerial - Sensor Serial Number: 0x7096E34F554BDE10 +[Composite, Composite, Image] Exif-Aperture - Aperture: 1.9 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 3280x3280 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 10.8 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 6.7 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/250 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.005 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 45.5 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 6.4 mm (35 mm equivalent: 43.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 4.83 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 10.0 diff --git a/t/M2TS.t b/t/M2TS.t new file mode 100644 index 0000000..9fca005 --- /dev/null +++ b/t/M2TS.t @@ -0,0 +1,30 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/M2TS.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::M2TS; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'M2TS'; +my $testnum = 1; + +# test 2: Extract information from test image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Unknown => 1); + my $info = $exifTool->ImageInfo('t/images/M2TS.mts'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/M2TS_2.out b/t/M2TS_2.out new file mode 100644 index 0000000..f95ee8e --- /dev/null +++ b/t/M2TS_2.out @@ -0,0 +1,31 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.22 +[ExifTool, ExifTool, ExifTool] Warning - Warning: [minor] The ExtractEmbedded option may find more tags in the video data +[File, System, Other] FileName - File Name: M2TS.mts +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1344 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2009:07:08 13:57:28-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2021:01:25 10:41:15-05:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: M2TS +[File, File, Other] FileTypeExtension - File Type Extension: mts +[File, File, Other] MIMEType - MIME Type: video/m2ts +[M2TS, M2TS, Video] VideoStreamType - Video Stream Type: H.264 (AVC) Video +[M2TS, M2TS, Video] AudioStreamType - Audio Stream Type: A52/AC-3 Audio +[M2TS, AC3, Audio] AudioBitrate - Audio Bitrate: 256 kbps +[M2TS, AC3, Audio] SurroundMode - Surround Mode: Not indicated +[M2TS, AC3, Audio] AudioChannels - Audio Channels: 2 +[M2TS, M2TS, Video] Duration - Duration: 0 s +[M2TS, AC3, Audio] AudioSampleRate - Audio Sample Rate: 48000 +[H264, H264, Video] ImageWidth - Image Width: 1920 +[H264, H264, Video] ImageHeight - Image Height: 1080 +[H264, H264, Time] 24 - Date/Time Original: 2008:12:31 23:16:24+01:00 +[H264, H264, Camera] 0 - Aperture Setting: 2.4 +[H264, H264, Camera] 1 - Gain: 9 dB +[H264, H264, Camera] 1 - Image Stabilization: n/a +[H264, H264, Image] 1.1 - Exposure Time: 1/25 +[H264, H264, Camera] 0 - Make: Canon +[H264, H264, Camera] 0 - Recording Mode: FXP +[Composite, Composite, Image] Exif-ImageSize - Image Size: 1920x1080 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 2.1 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/25 diff --git a/t/MIE.t b/t/MIE.t new file mode 100644 index 0000000..d4dd85c --- /dev/null +++ b/t/MIE.t @@ -0,0 +1,83 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/MIE.t". + +BEGIN { + $| = 1; print "1..6\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::MIE; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'MIE'; +my $testnum = 1; + +# test 2: Extract information from MIE.mie +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/MIE.mie', '-filename', '-directory'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write MIE information (also test Escape option when writing) +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(IgnoreMinorErrors => 1); # to copy invalid thumbnail + $exifTool->SetNewValuesFromFile('t/images/Nikon.jpg','*:*'); + $exifTool->SetNewValue('EXIF:XResolution' => 200); + $exifTool->SetNewValue('MIE:FNumber' => 11); + $exifTool->SetNewValue('XMP:Creator' => 'phil'); + $exifTool->SetNewValue('IPTC:Keywords' => 'cool'); + $exifTool->Options(Escape => 'HTML'); + $exifTool->SetNewValue('MIE:PhoneNumber' => 'k&uuml;hl'); + $exifTool->Options(Escape => undef); + my $testfile = "t/${testname}_${testnum}_failed.mie"; + unlink $testfile; + $exifTool->WriteInfo('t/images/MIE.mie', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 4: Create a MIE file from scratch (also test Escape option when copying) +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(IgnoreMinorErrors => 1); # to copy invalid thumbnail + $exifTool->Options(Escape => 'HTML'); + $exifTool->SetNewValuesFromFile('t/images/MIE.mie'); + my $testfile = "t/${testname}_${testnum}_failed.mie"; + unlink $testfile; + $exifTool->WriteInfo(undef, $testfile); + $exifTool->Options(Escape => undef); # reset Escape option + my $info = $exifTool->ImageInfo($testfile, '-filename', '-directory'); + if (check($exifTool, $info, $testname, $testnum, 2)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# tests 5-6: Test reading different Charsets +foreach (qw(Latin Cyrillic)) { + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Charset => $_); + my $info = $exifTool->ImageInfo('t/images/MIE.mie', 'comment-ru_ru'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/MIE_2.out b/t/MIE_2.out new file mode 100644 index 0000000..a3c71ab --- /dev/null +++ b/t/MIE_2.out @@ -0,0 +1,69 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileSize - File Size: 2.1 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:12:04 21:22:58-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:42-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: MIE +[File, File, Other] FileTypeExtension - File Type Extension: mie +[File, File, Other] MIMEType - MIME Type: image/x-mie-jpeg +[MIE, MIE-Main, Other] 0Type - Subfile Type: JPEG +[MIE, MIE-Main, Other] 0Vers - MIE Version: 1.1 +[MIE, MIE-Main, Other] 1Name - Subfile Name: dummy.jpg +[MIE, MIE-Main, Other] 2MIME - Subfile MIME Type: image/jpeg +[MIE, MIE-Camera, Camera] ColorTemperature - Color Temperature: 5200 +[MIE, MIE-Camera, Camera] Contrast - Contrast: 1 +[MIE, MIE-Camera, Camera] ExposureComp - Exposure Compensation: 0 +[MIE, MIE-Camera, Camera] ExposureMode - Exposure Mode: Manual +[MIE, MIE-Camera, Camera] ExposureTime - Exposure Time: 4 +[MIE, MIE-Flash, Camera] ExposureComp - Flash Exposure Comp: 0 +[MIE, MIE-Flash, Camera] GuideNumber - Flash Guide Number: 0 +[MIE, MIE-Camera, Camera] FocusMode - Focus Mode: Manual Focus +[MIE, MIE-Camera, Camera] ISO - ISO: 100 +[MIE, MIE-Lens, Camera] FNumber - F Number: 3.5 +[MIE, MIE-Lens, Camera] MaxAperture - Max Aperture: 4 +[MIE, MIE-Lens, Camera] MinAperture - Min Aperture: 27 +[MIE, MIE-Camera, Camera] Make - Make: FUJIFILM +[MIE, MIE-Camera, Camera] Model - Model: FinePix2400Zoom +[MIE, MIE-Orient, Camera] Rotation - Rotation: 90 +[MIE, MIE-Camera, Camera] OwnerName - Owner Name: Phil Harvey +[MIE, MIE-Camera, Camera] Saturation - Saturation: 1 +[MIE, MIE-Camera, Camera] SerialNumber - Serial Number: 0560012345 +[MIE, MIE-Camera, Camera] Sharpness - Sharpness: 1 +[MIE, MIE-Camera, Camera] ShootingMode - Shooting Mode: Manual +[MIE, MIE-Doc, Document] Comment - Comment: I can eat glass and it doesn't hurt me. +[MIE, MIE-Doc, Document] Comment-cn_ZH - Comment (cn_ZH): 我能åžä¸‹çŽ»ç’ƒè€Œä¸ä¼¤èº«ä½“。 +[MIE, MIE-Doc, Document] Comment-de_DE - Comment (de_DE): Ich kann Glas essen, ohne mir weh zu tun. +[MIE, MIE-Doc, Document] Comment-el_GR - Comment (el_GR): ΜποÏÏŽ να φάω σπασμένα γυαλιά χωÏίς να πάθω τίποτα. +[MIE, MIE-Doc, Document] Comment-en_CA - Comment (en_CA): I can eat glass and it doesn't hurt me, eh. +[MIE, MIE-Doc, Document] Comment-en_GB - Comment (en_GB): I say, I can eat glass and it doesn't hurt me old boy. +[MIE, MIE-Doc, Document] Comment-en_US - Comment (en_US): Dude! Munching glass don't bust my chops. +[MIE, MIE-Doc, Document] Comment-es_ES - Comment (es_ES): Puedo comer vidrio, no me hace daño. +[MIE, MIE-Doc, Document] Comment-fr_FR - Comment (fr_FR): Je peux manger du verre, ça ne me fait pas de mal. +[MIE, MIE-Doc, Document] Comment-hi_IN - Comment (hi_IN): मैं काà¤à¤š खा सकता हूà¤, मà¥à¤à¥‡ उस से कोई पीडा नहीं होती. +[MIE, MIE-Doc, Document] Comment-it_IT - Comment (it_IT): Posso mangiare il vetro e non mi fa male. +[MIE, MIE-Doc, Document] Comment-ja_JP - Comment (ja_JP): ç§ã¯ã‚¬ãƒ©ã‚¹ã‚’食ã¹ã‚‰ã‚Œã¾ã™ã€‚ãã‚Œã¯ç§ã‚’å‚·ã¤ã‘ã¾ã›ã‚“。 +[MIE, MIE-Doc, Document] Comment-ru_RU - Comment (ru_RU): Я могу еÑÑ‚ÑŒ Ñтекло, оно мне не вредит. +[MIE, MIE-Doc, Author] Copyright - Copyright: © Copyright Phil Harvey +[MIE, MIE-Doc, Time] CreateDate - Create Date: 2001:05:19 18:36:41 +[MIE, MIE-Doc, Document] Keywords - Keywords: ExifTool, Test, MIE +[MIE, MIE-Doc, Time] ModifyDate - Modify Date: 2004:02:26 09:36:46 +[MIE, MIE-Doc, Time] OriginalDate - Date/Time Original: 2001:05:19 18:36:41 +[MIE, MIE-Doc, Document] References - References: http://www.columbia.edu/kermit/utf8.html (Comment strings) +[MIE, MIE-Doc, Document] Software - Software: Adobe Photoshop 7.0 +[MIE, MIE-Doc, Document] Title - Title: Test IPTC picture +[MIE, MIE-Doc, Document] URL - URL: https://exiftool.org/ +[MIE, MIE-Geo, Location] City - City: Kingston +[MIE, MIE-Geo, Location] Country - Country: Canada +[MIE, MIE-Geo, Location] State - State: Ont +[MIE, MIE-Image, Image] ColorSpace - Color Space: sRGB +[MIE, MIE-Image, Image] Components - Components Configuration: YCbCr +[MIE, MIE-Image, Image] ImageSize - Image Size: 100x80 +[MIE, MIE-Image, Image] Resolution - Resolution: 118x118(/cm) +[MIE, MIE-Thumbnail, Image] ImageSize - Thumbnail Image Size: 160x120 +[MIE, MIE-Thumbnail, Preview] data - Thumbnail Image: (Binary data 28 bytes) +[MIE, MIE-Main, Other] data - Subfile Data: (Binary data 20 bytes) +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 4 +[Composite, Composite, Image] Exif-LightValue - Light Value: 1.6 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.008 diff --git a/t/MIE_3.out b/t/MIE_3.out new file mode 100644 index 0000000..4f0e789 --- /dev/null +++ b/t/MIE_3.out @@ -0,0 +1,136 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: MIE_3_failed.mie +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 6.2 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:42-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:42-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:42-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: MIE +[File, File, Other] FileTypeExtension - File Type Extension: mie +[File, File, Other] MIMEType - MIME Type: image/x-mie-jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: ff6b1fa510bbe0d2c2323752af38a86b +[MIE, MIE-Main, Other] 0Type - Subfile Type: JPEG +[MIE, MIE-Main, Other] 0Vers - MIE Version: 1.1 +[MIE, MIE-Main, Other] 1Name - Subfile Name: dummy.jpg +[MIE, MIE-Main, Other] 2MIME - Subfile MIME Type: image/jpeg +[MIE, MIE-Camera, Camera] ColorTemperature - Color Temperature: 5200 +[MIE, MIE-Camera, Camera] Contrast - Contrast: 1 +[MIE, MIE-Camera, Camera] ExposureComp - Exposure Compensation: 0 +[MIE, MIE-Camera, Camera] ExposureMode - Exposure Mode: Manual +[MIE, MIE-Camera, Camera] ExposureTime - Exposure Time: 4 +[MIE, MIE-Flash, Camera] ExposureComp - Flash Exposure Comp: 0 +[MIE, MIE-Flash, Camera] GuideNumber - Flash Guide Number: 0 +[MIE, MIE-Camera, Camera] FocusMode - Focus Mode: Manual Focus +[MIE, MIE-Camera, Camera] ISO - ISO: 100 +[MIE, MIE-Lens, Camera] FNumber - F Number: 11 +[MIE, MIE-Lens, Camera] MaxAperture - Max Aperture: 4 +[MIE, MIE-Lens, Camera] MinAperture - Min Aperture: 27 +[MIE, MIE-Camera, Camera] Make - Make: FUJIFILM +[MIE, MIE-Camera, Camera] Model - Model: FinePix2400Zoom +[MIE, MIE-Orient, Camera] Rotation - Rotation: 90 +[MIE, MIE-Camera, Camera] OwnerName - Owner Name: Phil Harvey +[MIE, MIE-Camera, Camera] Saturation - Saturation: 1 +[MIE, MIE-Camera, Camera] SerialNumber - Serial Number: 0560012345 +[MIE, MIE-Camera, Camera] Sharpness - Sharpness: 1 +[MIE, MIE-Camera, Camera] ShootingMode - Shooting Mode: Manual +[MIE, MIE-Doc, Document] Comment - Comment: I can eat glass and it doesn't hurt me. +[MIE, MIE-Doc, Document] Comment-cn_ZH - Comment (cn_ZH): 我能åžä¸‹çŽ»ç’ƒè€Œä¸ä¼¤èº«ä½“。 +[MIE, MIE-Doc, Document] Comment-de_DE - Comment (de_DE): Ich kann Glas essen, ohne mir weh zu tun. +[MIE, MIE-Doc, Document] Comment-el_GR - Comment (el_GR): ΜποÏÏŽ να φάω σπασμένα γυαλιά χωÏίς να πάθω τίποτα. +[MIE, MIE-Doc, Document] Comment-en_CA - Comment (en_CA): I can eat glass and it doesn't hurt me, eh. +[MIE, MIE-Doc, Document] Comment-en_GB - Comment (en_GB): I say, I can eat glass and it doesn't hurt me old boy. +[MIE, MIE-Doc, Document] Comment-en_US - Comment (en_US): Dude! Munching glass don't bust my chops. +[MIE, MIE-Doc, Document] Comment-es_ES - Comment (es_ES): Puedo comer vidrio, no me hace daño. +[MIE, MIE-Doc, Document] Comment-fr_FR - Comment (fr_FR): Je peux manger du verre, ça ne me fait pas de mal. +[MIE, MIE-Doc, Document] Comment-hi_IN - Comment (hi_IN): मैं काà¤à¤š खा सकता हूà¤, मà¥à¤à¥‡ उस से कोई पीडा नहीं होती. +[MIE, MIE-Doc, Document] Comment-it_IT - Comment (it_IT): Posso mangiare il vetro e non mi fa male. +[MIE, MIE-Doc, Document] Comment-ja_JP - Comment (ja_JP): ç§ã¯ã‚¬ãƒ©ã‚¹ã‚’食ã¹ã‚‰ã‚Œã¾ã™ã€‚ãã‚Œã¯ç§ã‚’å‚·ã¤ã‘ã¾ã›ã‚“。 +[MIE, MIE-Doc, Document] Comment-ru_RU - Comment (ru_RU): Я могу еÑÑ‚ÑŒ Ñтекло, оно мне не вредит. +[MIE, MIE-Doc, Author] Copyright - Copyright: © Copyright Phil Harvey +[MIE, MIE-Doc, Time] CreateDate - Create Date: 2001:05:19 18:36:41 +[MIE, MIE-Doc, Document] Keywords - Keywords: ExifTool, Test, MIE +[MIE, MIE-Doc, Time] ModifyDate - Modify Date: 2004:02:26 09:36:46 +[MIE, MIE-Doc, Time] OriginalDate - Date/Time Original: 2001:05:19 18:36:41 +[MIE, MIE-Doc, Author] Phone - Phone Number: kühl +[MIE, MIE-Doc, Document] References - References: http://www.columbia.edu/kermit/utf8.html (Comment strings) +[MIE, MIE-Doc, Document] Software - Software: Adobe Photoshop 7.0 +[MIE, MIE-Doc, Document] Title - Title: Test IPTC picture +[MIE, MIE-Doc, Document] URL - URL: https://exiftool.org/ +[MIE, MIE-Geo, Location] City - City: Kingston +[MIE, MIE-Geo, Location] Country - Country: Canada +[MIE, MIE-Geo, Location] State - State: Ont +[MIE, MIE-Image, Image] ColorSpace - Color Space: sRGB +[MIE, MIE-Image, Image] Components - Components Configuration: YCbCr +[MIE, MIE-Image, Image] ImageSize - Image Size: 100x80 +[MIE, MIE-Image, Image] Resolution - Resolution: 118x118(/cm) +[MIE, MIE-Thumbnail, Image] ImageSize - Thumbnail Image Size: 160x120 +[MIE, MIE-Thumbnail, Preview] data - Thumbnail Image: (Binary data 28 bytes) +[MIE, MIE-Main, Other] data - Subfile Data: (Binary data 20 bytes) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: NIKON +[EXIF, IFD0, Camera] 272 - Camera Model Name: E775 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 200 +[EXIF, IFD0, Image] 283 - Y Resolution: 300 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: E775v1.3u +[EXIF, IFD0, Time] 306 - Modify Date: 2001:08:01 12:57:23 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/213 +[EXIF, ExifIFD, Image] 33437 - F Number: 9.4 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:08:01 12:57:23 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:08:01 12:57:23 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.4 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 8.6 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 1600 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1200 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 300 +[EXIF, IFD1, Image] 283 - Y Resolution: 300 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 3043 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Nikon, Camera] 1 - Maker Note Version: 1.00 +[MakerNotes, Nikon, Image] 2 - ISO: 0 +[MakerNotes, Nikon, Camera] 3 - Color Mode: Color +[MakerNotes, Nikon, Camera] 4 - Quality: Fine +[MakerNotes, Nikon, Camera] 5 - White Balance: Auto +[MakerNotes, Nikon, Camera] 6 - Sharpness: Auto +[MakerNotes, Nikon, Camera] 7 - Focus Mode: AF-C +[MakerNotes, Nikon, Camera] 8 - Flash Setting: +[MakerNotes, Nikon, Camera] 15 - ISO Selection: Auto +[MakerNotes, Nikon, Camera] 128 - Image Adjustment: Normal +[MakerNotes, Nikon, Camera] 130 - Auxiliary Lens: Off +[MakerNotes, Nikon, Camera] 133 - Manual Focus Distance: undef +[MakerNotes, Nikon, Camera] 134 - Digital Zoom: 1 +[MakerNotes, Nikon, Camera] 0 - AF Area Mode: Single Area +[MakerNotes, Nikon, Camera] 1 - AF Point: Center +[MakerNotes, Nikon, Camera] 2 - AF Points In Focus: (none) +[MakerNotes, Nikon, Camera] 143 - Scene Mode: +[MakerNotes, Nikon, Camera] 16 - Data Dump: (Binary data 122 bytes) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0100 +[IPTC, IPTC, Other] 25 - Keywords: cool +[IPTC, IPTC, Other] 0 - Application Record Version: 4 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-dc, Author] creator - Creator: phil +[Composite, Composite, Image] Exif-Aperture - Aperture: 9.4 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/213 +[Composite, Composite, Image] Exif-LightValue - Light Value: 14.2 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 8.6 mm +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.008 diff --git a/t/MIE_5.out b/t/MIE_5.out new file mode 100644 index 0000000..9552277 --- /dev/null +++ b/t/MIE_5.out @@ -0,0 +1 @@ +[MIE, MIE-Doc, Document] Comment-ru_RU - Comment (ru_RU): ? ???? ???? ??????, ??? ??? ?? ??????. diff --git a/t/MIE_6.out b/t/MIE_6.out new file mode 100644 index 0000000..0059a94 --- /dev/null +++ b/t/MIE_6.out @@ -0,0 +1 @@ +[MIE, MIE-Doc, Document] Comment-ru_RU - Comment (ru_RU): ß ìîãó åñòü ñòåêëî, îíî ìíå íå âðåäèò. diff --git a/t/MIFF.t b/t/MIFF.t new file mode 100644 index 0000000..afd87da --- /dev/null +++ b/t/MIFF.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/MIFF.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::MIFF; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'MIFF'; +my $testnum = 1; + +# test 2: Extract information from MIFF.miff +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/MIFF.miff'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/MIFF_2.out b/t/MIFF_2.out new file mode 100644 index 0000000..31ae11f --- /dev/null +++ b/t/MIFF_2.out @@ -0,0 +1,114 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: MIFF.miff +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 3.8 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:12:04 21:22:58-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:42-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: MIFF +[File, File, Other] FileTypeExtension - File Type Extension: miff +[File, File, Other] MIMEType - MIME Type: application/x-magick-image +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[MIFF, MIFF, Image] id - ID: ImageMagick +[MIFF, MIFF, Image] class - Class: DirectClass +[MIFF, MIFF, Image] matte - Matte: False +[MIFF, MIFF, Image] columns - Image Width: 8 +[MIFF, MIFF, Image] rows - Image Height: 8 +[MIFF, MIFF, Image] depth - Depth: 8 +[MIFF, MIFF, Image] Resolution - Resolution: 72x72 +[MIFF, MIFF, Image] units - Units: pixels-per-inch +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it +[IPTC, IPTC, Author] 80 - By-line: Phil Harvey +[IPTC, IPTC, Author] 110 - Credit: My Credit +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ont +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 15 - Category: 1 +[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Other] 25 - Keywords: ExifTool, Test, MIFF +[IPTC, IPTC, Other] 120 - Caption-Abstract: MIFF test +[Photoshop, Photoshop, Image] 1061 - IPTC Digest: 9e02efbd9bdc1dc192279e30a0e27323 +[Photoshop, Photoshop, Image] 0 - X Resolution: 72 +[Photoshop, Photoshop, Image] 2 - Displayed Units X: inches +[Photoshop, Photoshop, Image] 4 - Y Resolution: 72 +[Photoshop, Photoshop, Image] 6 - Displayed Units Y: inches +[Photoshop, Photoshop, Image] 0 - Print Style: Centered +[Photoshop, Photoshop, Image] 2 - Print Position: 0 0 +[Photoshop, Photoshop, Image] 10 - Print Scale: 1 +[Photoshop, Photoshop, Image] 1037 - Global Angle: 30 +[Photoshop, Photoshop, Image] 1049 - Global Altitude: 30 +[Photoshop, Photoshop, Author] 1034 - Copyright Flag: False +[Photoshop, Photoshop, Author] 1035 - URL: https://exiftool.org/ +[Photoshop, Photoshop, Image] 1054 - URL List: +[Photoshop, Photoshop, Image] 0 - Photoshop Quality: 2 +[Photoshop, Photoshop, Image] 1 - Photoshop Format: Standard +[Photoshop, Photoshop, Image] 2 - Progressive Scans: 3 Scans +[EXIF, IFD0, Image] 270 - Image Description: A witty caption +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:21 07:47:01 +[EXIF, IFD0, Author] 315 - Artist: Phil Harvey +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: Copyright 2004 Phil Harvey +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1.6 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 8 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 8 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 854 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 0 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 5.47 +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: UTF-16 (big-endian) encoded XMP +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: MIFF, Test +[XMP, XMP-dc, Image] title - Title: Test IPTC picture +[XMP, XMP-photoshop, Image] Category - Category: 1 +[XMP, XMP-photoshop, Location] City - City: Kingston +[XMP, XMP-photoshop, Location] Country - Country: Canada +[XMP, XMP-photoshop, Author] Credit - Credit: My Credit +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2004:02:26 +[XMP, XMP-photoshop, Image] Urgency - Urgency: 8 (least urgent) +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:4cc7b857-69d0-11d8-8ac4-bb59c92f0d9a +[XMP, XMP-xmpRights, Author] Marked - Marked: False +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/64 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 6.0 mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.6 diff --git a/t/MOI.t b/t/MOI.t new file mode 100644 index 0000000..6db33e8 --- /dev/null +++ b/t/MOI.t @@ -0,0 +1,28 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/MOI.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::MOI; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'MOI'; +my $testnum = 1; + +# test 2: Extract information from a MOI file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/MOI.moi', '-system:*'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/MOI_2.out b/t/MOI_2.out new file mode 100644 index 0000000..ff0a702 --- /dev/null +++ b/t/MOI_2.out @@ -0,0 +1,11 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.76 +[File, File, Other] FileType - File Type: MOI +[File, File, Other] FileTypeExtension - File Type Extension: moi +[File, File, Other] MIMEType - MIME Type: application/octet-stream +[MOI, MOI, Video] 0 - MOI Version: V6 +[MOI, MOI, Time] 6 - Date/Time Original: 2011:05:15 17:58:48.000 +[MOI, MOI, Video] 14 - Duration: 8.16 s +[MOI, MOI, Video] 128 - Aspect Ratio: 4:3 PAL +[MOI, MOI, Audio] 132 - Audio Codec: AC3 +[MOI, MOI, Audio] 134 - Audio Bitrate: 224 kbps +[MOI, MOI, Video] 218 - Video Bitrate: 8.5 Mbps diff --git a/t/MP3.t b/t/MP3.t new file mode 100644 index 0000000..87c1295 --- /dev/null +++ b/t/MP3.t @@ -0,0 +1,30 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/MP3.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::ID3; +use Image::ExifTool::MPEG; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'MP3'; +my $testnum = 1; + +# test 2: Extract information from test image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/MP3.mp3'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/MP3_2.out b/t/MP3_2.out new file mode 100644 index 0000000..d7c15cd --- /dev/null +++ b/t/MP3_2.out @@ -0,0 +1,46 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: MP3.mp3 +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 395 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:05:13 07:46:22-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:12-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rwxr-xr-x +[File, File, Other] FileType - File Type: MP3 +[File, File, Other] FileTypeExtension - File Type Extension: mp3 +[File, File, Other] MIMEType - MIME Type: audio/mpeg +[File, File, Image] ID3Size - ID3 Size: 391 +[MPEG, MPEG, Audio] Bit11-12 - MPEG Audio Version: 1 +[MPEG, MPEG, Audio] Bit13-14 - Audio Layer: 3 +[MPEG, MPEG, Audio] Bit16-19 - Audio Bitrate: 128 kbps +[MPEG, MPEG, Audio] Bit20-21 - Sample Rate: 44100 +[MPEG, MPEG, Audio] Bit24-25 - Channel Mode: Joint Stereo +[MPEG, MPEG, Audio] Bit26 - MS Stereo: On +[MPEG, MPEG, Audio] Bit27 - Intensity Stereo: Off +[MPEG, MPEG, Audio] Bit28 - Copyright Flag: True +[MPEG, MPEG, Audio] Bit29 - Original Media: True +[MPEG, MPEG, Audio] Bit30-31 - Emphasis: None +[ID3, ID3v2_2, Audio] TRK - Track: 1/5 +[ID3, ID3v2_2, Audio] TPA - Part Of Set: 1/2 +[ID3, ID3v2_2, Audio] RVA - Relative Volume Adjustment: +18.0% Right, +18.0% Left +[ID3, ID3v2_2, Audio] ULT - Lyrics: Do-wap she-bang +[ID3, ID3v2_2, Image] PIC-1 - Picture Format: JPG +[ID3, ID3v2_2, Image] PIC-2 - Picture Type: Other +[ID3, ID3v2_2, Image] PIC-3 - Picture Description: comment +[ID3, ID3v2_2, Preview] PIC - Picture: (Binary data 15 bytes) +[ID3, ID3v2_2, Audio] TT2 - Title: ExifTool Test +[ID3, ID3v2_2, Author] TP1 - Artist: Phil Harvey +[ID3, ID3v2_2, Audio] TCM - Composer: A Composer +[ID3, ID3v2_2, Audio] TAL - Album: Phil's Greatest Hits +[ID3, ID3v2_2, Audio] TT1 - Grouping: This group +[ID3, ID3v2_2, Time] TYE - Year: 2005 +[ID3, ID3v2_2, Audio] TCO - Genre: Testing +[ID3, ID3v2_2, Audio] COM - Comment: My Comments +[ID3, ID3v1, Audio] 3 - Title: Title +[ID3, ID3v1, Author] 33 - Artist: Artist +[ID3, ID3v1, Audio] 63 - Album: Album +[ID3, ID3v1, Time] 93 - Year: 2003 +[ID3, ID3v1, Audio] 97 - Comment: Comment +[ID3, ID3v1, Audio] 127 - Genre: Hip-Hop +[Composite, Composite, Time] ID3-DateTimeOriginal - Date/Time Original: 2005 +[Composite, Composite, Video] MPEG-Duration - Duration: 0.00 s (approx) diff --git a/t/MRC.t b/t/MRC.t new file mode 100644 index 0000000..330c70f --- /dev/null +++ b/t/MRC.t @@ -0,0 +1,30 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/MRC.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::MRC; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'MRC'; +my $testnum = 1; + +# test 2: Extract information from MRC.mrc +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(ExtractEmbedded => 1); + my $info = $exifTool->ImageInfo('t/images/MRC.mrc'); + print 'not ' unless check($exifTool, $info, $testname, $testnum, undef, 3); + print "ok $testnum\n"; +} + + +# end diff --git a/t/MRC_2.out b/t/MRC_2.out new file mode 100644 index 0000000..ca635e7 --- /dev/null +++ b/t/MRC_2.out @@ -0,0 +1,157 @@ +[ExifTool, ExifTool, ExifTool, Main] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other, Main] FileName - File Name: MRC.mrc +[File, System, Other, Main] Directory - Directory: t/images +[File, System, Other, Main] FileSize - File Size: 2.6 kB +[File, System, Time, Main] FileModifyDate - File Modification Date/Time: 2021:04:22 09:31:39-04:00 +[File, System, Time, Main] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:43-04:00 +[File, System, Time, Main] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other, Main] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other, Main] FileType - File Type: MRC +[File, File, Other, Main] FileTypeExtension - File Type Extension: mrc +[File, File, Other, Main] MIMEType - MIME Type: image/x-mrc +[File, File, Image, Main] 0 - Image Width: 4096 +[File, File, Image, Main] 1 - Image Height: 4096 +[File, File, Image, Main] 2 - Image Depth: 2 +[File, File, Image, Main] 3 - Image Mode: 16-bit unsigned integer +[File, File, Image, Main] 4 - Start Point: 0 0 0 +[File, File, Image, Main] 7 - Grid Size: 4096 4096 2 +[File, File, Image, Main] 10 - Cell Width: 15289.4248046875 +[File, File, Image, Main] 11 - Cell Height: 15289.4248046875 +[File, File, Image, Main] 12 - Cell Depth: 0 +[File, File, Image, Main] 13 - Cell Alpha: 90 +[File, File, Image, Main] 14 - Cell Beta: 90 +[File, File, Image, Main] 15 - Cell Gamma: 90 +[File, File, Image, Main] 16 - Image Width Axis: X +[File, File, Image, Main] 17 - Image Height Axis: Y +[File, File, Image, Main] 18 - Image Depth Axis: Z +[File, File, Image, Main] 19 - Density Min: 1958 +[File, File, Image, Main] 20 - Density Max: 5662 +[File, File, Image, Main] 21 - Density Mean: 3155.2578125 +[File, File, Image, Main] 22 - Space Group Number: 0 +[File, File, Image, Main] 23 - Extended Header Size: 1536 +[File, File, Image, Main] 26 - Extended Header Type: FEI1 +[File, File, Image, Main] 27 - MRC Version: 20140 +[File, File, Image, Main] 49 - Origin: 0 0 0 +[File, File, Image, Main] 53 - Machine Stamp: 0x44 0x44 0x00 0x00 +[File, File, Image, Main] 54 - RMS Deviation: -1 +[File, File, Image, Main] 55 - Number Of Labels: 0 +[File, File, Image, Main] 0 - Metadata Size: 768 +[File, File, Image, Main] 4 - Metadata Version: 0 +[File, File, Image, Main] 8 - Bitmask 1: 0xffffffff +[File, File, Time, Main] 12 - Time Stamp: 2020:10:21 13:54:27 +[File, File, Image, Main] 20 - Microscope Type: TALOS-D5197 +[File, File, Image, Main] 36 - Microscope ID: 6419 +[File, File, Image, Main] 52 - Application: Tomography +[File, File, Image, Main] 68 - App Version: 4.10.0.65 +[File, File, Image, Main] 84 - High Tension: 200000 +[File, File, Image, Main] 92 - Dose: 3.51360899930879e+20 +[File, File, Image, Main] 100 - Alpha Tilt: -64.0024700625157 +[File, File, Image, Main] 108 - Beta Tilt: 0 +[File, File, Image, Main] 116 - X Stage: -8.8173405e-05 +[File, File, Image, Main] 124 - Y Stage: -2.8139594e-05 +[File, File, Image, Main] 132 - Z Stage: 3.536763e-05 +[File, File, Image, Main] 140 - Tilt Axis Angle: -0.847676487969243 +[File, File, Image, Main] 148 - Dual Axis Rot: 0 +[File, File, Image, Main] 156 - Pixel Size X: 3.73276964893421e-10 +[File, File, Image, Main] 164 - Pixel Size Y: 3.73276964893421e-10 +[File, File, Image, Main] 220 - Defocus: -1.5e-06 +[File, File, Image, Main] 228 - STEM Defocus: -1.5e-06 +[File, File, Image, Main] 236 - Applied Defocus: -1.5e-06 +[File, File, Image, Main] 244 - Instrument Mode: TEM +[File, File, Image, Main] 248 - Projection Mode: Imaging +[File, File, Image, Main] 252 - Objective Lens: HM +[File, File, Image, Main] 268 - High Magnification Mode: SA +[File, File, Image, Main] 284 - Probe Mode: Nano +[File, File, Image, Main] 288 - EFTEM On: No +[File, File, Image, Main] 289 - Magnification: 28000 +[File, File, Image, Main] 297 - Bitmask 2: 0x0cfff01f +[File, File, Image, Main] 301 - Camera Length: 0 +[File, File, Image, Main] 309 - Spot Index: 7 +[File, File, Image, Main] 313 - Illumination Area: 0.473917752802174 +[File, File, Image, Main] 321 - Intensity: 0.473917752802174 +[File, File, Image, Main] 329 - Convergence Angle: 0 +[File, File, Image, Main] 387 - Shift Offset X: 0 +[File, File, Image, Main] 395 - Shift Offset Y: 0 +[File, File, Image, Main] 403 - Shift X: -0.00204008771106601 +[File, File, Image, Main] 411 - Shift Y: 0.009031618013978 +[File, File, Image, Main] 419 - Integration Time: 0.299076 +[File, File, Image, Main] 427 - Binning Width: 1 +[File, File, Image, Main] 431 - Binning Height: 1 +[File, File, Image, Main] 435 - Camera Name: BM-Falcon +[File, File, Image, Main] 451 - Readout Area Left: 0 +[File, File, Image, Main] 455 - Readout Area Top: 0 +[File, File, Image, Main] 459 - Readout Area Right: 4096 +[File, File, Image, Main] 463 - Readout Area Bottom: 4096 +[File, File, Image, Main] 472 - Direct Det Electron Counting: No +[File, File, Image, Main] 473 - Direct Det Align Frames: No +[File, File, Image, Main] 490 - Bitmask 3: 0x007e8040 +[File, File, Image, Main] 518 - Phase Plate: Yes +[File, File, Image, Main] 571 - Dwell Time: 0 +[File, File, Image, Main] 587 - Scan Size Left: 0 +[File, File, Image, Main] 591 - Scan Size Top: 0 +[File, File, Image, Main] 595 - Scan Size Right: 0 +[File, File, Image, Main] 599 - Scan Size Bottom: 0 +[File, File, Image, Main] 603 - Full Scan FOV X: 0.473917752802174 +[File, File, Image, Main] 611 - Full Scan FOV Y: 0.473917752802174 +[File, File, Image, Main] 748 - Bitmask 4: 0x00000000 +[File, File, Image, Doc1] 0 - Metadata Size: 768 +[File, File, Image, Doc1] 4 - Metadata Version: 0 +[File, File, Image, Doc1] 8 - Bitmask 1: 0xffffffff +[File, File, Time, Doc1] 12 - Time Stamp: 2020:10:21 13:55:19 +[File, File, Image, Doc1] 20 - Microscope Type: TALOS-D5197 +[File, File, Image, Doc1] 36 - Microscope ID: 6419 +[File, File, Image, Doc1] 52 - Application: Tomography +[File, File, Image, Doc1] 68 - App Version: 4.10.0.65 +[File, File, Image, Doc1] 84 - High Tension: 200000 +[File, File, Image, Doc1] 92 - Dose: 3.56817464869021e+20 +[File, File, Image, Doc1] 100 - Alpha Tilt: -62.0036705832692 +[File, File, Image, Doc1] 108 - Beta Tilt: 0 +[File, File, Image, Doc1] 116 - X Stage: -8.8182495e-05 +[File, File, Image, Doc1] 124 - Y Stage: -2.8140608e-05 +[File, File, Image, Doc1] 132 - Z Stage: 3.536763e-05 +[File, File, Image, Doc1] 140 - Tilt Axis Angle: -0.847676487969243 +[File, File, Image, Doc1] 148 - Dual Axis Rot: 0 +[File, File, Image, Doc1] 156 - Pixel Size X: 3.73276964893421e-10 +[File, File, Image, Doc1] 164 - Pixel Size Y: 3.73276964893421e-10 +[File, File, Image, Doc1] 220 - Defocus: -2.81146426624101e-06 +[File, File, Image, Doc1] 228 - STEM Defocus: -2.81146426624101e-06 +[File, File, Image, Doc1] 236 - Applied Defocus: -1.5e-06 +[File, File, Image, Doc1] 244 - Instrument Mode: TEM +[File, File, Image, Doc1] 248 - Projection Mode: Imaging +[File, File, Image, Doc1] 252 - Objective Lens: HM +[File, File, Image, Doc1] 268 - High Magnification Mode: SA +[File, File, Image, Doc1] 284 - Probe Mode: Nano +[File, File, Image, Doc1] 288 - EFTEM On: No +[File, File, Image, Doc1] 289 - Magnification: 28000 +[File, File, Image, Doc1] 297 - Bitmask 2: 0x0cfff01f +[File, File, Image, Doc1] 301 - Camera Length: 0 +[File, File, Image, Doc1] 309 - Spot Index: 7 +[File, File, Image, Doc1] 313 - Illumination Area: 0.473917752802174 +[File, File, Image, Doc1] 321 - Intensity: 0.473917752802174 +[File, File, Image, Doc1] 329 - Convergence Angle: 0 +[File, File, Image, Doc1] 387 - Shift Offset X: 0 +[File, File, Image, Doc1] 395 - Shift Offset Y: 0 +[File, File, Image, Doc1] 403 - Shift X: -0.00886260531842709 +[File, File, Image, Doc1] 411 - Shift Y: 0.00178224826231599 +[File, File, Image, Doc1] 419 - Integration Time: 0.299076 +[File, File, Image, Doc1] 427 - Binning Width: 1 +[File, File, Image, Doc1] 431 - Binning Height: 1 +[File, File, Image, Doc1] 435 - Camera Name: BM-Falcon +[File, File, Image, Doc1] 451 - Readout Area Left: 0 +[File, File, Image, Doc1] 455 - Readout Area Top: 0 +[File, File, Image, Doc1] 459 - Readout Area Right: 4096 +[File, File, Image, Doc1] 463 - Readout Area Bottom: 4096 +[File, File, Image, Doc1] 472 - Direct Det Electron Counting: No +[File, File, Image, Doc1] 473 - Direct Det Align Frames: No +[File, File, Image, Doc1] 490 - Bitmask 3: 0x007e8040 +[File, File, Image, Doc1] 518 - Phase Plate: Yes +[File, File, Image, Doc1] 571 - Dwell Time: 0 +[File, File, Image, Doc1] 587 - Scan Size Left: 0 +[File, File, Image, Doc1] 591 - Scan Size Top: 0 +[File, File, Image, Doc1] 595 - Scan Size Right: 0 +[File, File, Image, Doc1] 599 - Scan Size Bottom: 0 +[File, File, Image, Doc1] 603 - Full Scan FOV X: 0.473917752802174 +[File, File, Image, Doc1] 611 - Full Scan FOV Y: 0.473917752802174 +[File, File, Image, Doc1] 748 - Bitmask 4: 0x00000000 +[Composite, Composite, Image, Main] Exif-ImageSize - Image Size: 4096x4096 +[Composite, Composite, Image, Main] Exif-Megapixels - Megapixels: 16.8 diff --git a/t/MWG.t b/t/MWG.t new file mode 100644 index 0000000..2021092 --- /dev/null +++ b/t/MWG.t @@ -0,0 +1,100 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/MWG.t". + +BEGIN { + $| = 1; print "1..7\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::MWG; +Image::ExifTool::MWG::Load(); +$loaded = 1; +print "ok 1\n"; + +my $testname = 'MWG'; +my $testnum = 1; + +# test 2: Extract MWG information from test image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Duplicates => 0); + my $info = $exifTool->ImageInfo('t/images/MWG.jpg', 'MWG:*'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# tests 3-4: Write some MWG tags +{ + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue('MWG:DateTimeOriginal' => '2009:10:25 15:13:44.567-04:00'); + $exifTool->SetNewValue('MWG:Creator' => 'Creator One'); + $exifTool->SetNewValue('MWG:Creator' => 'Creator Two'); + $exifTool->SetNewValue('MWG:City' => 'Some city'); + my @tags = qw( + EXIF:DateTimeOriginal EXIF:SubSecTimeOriginal + IPTC:DateCreated IPTC:TimeCreated XMP-photoshop:DateCreated + EXIF:Artist IPTC:By-line XMP-dc:Creator IPTC:City + XMP-photoshop:City XMP-iptcExt:LocationShownCity + ); + my $src; + foreach $src('MWG.jpg', 'Writer.jpg') { + ++$testnum; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->WriteInfo("t/images/$src", $testfile); + my $info = $exifTool->GetInfo('Warning'); + if ($$info{Warning}) { + warn "\n Warning: $$info{Warning}\n"; + print 'not '; + } else { + $info = $exifTool->ImageInfo($testfile, @tags); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + } + print "ok $testnum\n"; + } +} + +# test 5: Extract IPTC information from non-standard image while in strict MWG mode +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/ExifTool.jpg', 'IPTC:*', 'Warning'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 6: Copy a tag with MWG feature active +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/MWG.jpg', 'Creator'); + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + $exifTool->WriteInfo(undef, $testfile); + my $info = $exifTool->ImageInfo($testfile, 'Creator'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 7: Extract MWG information from ExifTool.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/ExifTool.jpg', 'MWG:*'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/MWG_2.out b/t/MWG_2.out new file mode 100644 index 0000000..42251d7 --- /dev/null +++ b/t/MWG_2.out @@ -0,0 +1,13 @@ +[Composite, MWG, Location] MWG-City - City: RIGHT-XMP-City +[Composite, MWG, Author] MWG-Copyright - Copyright: RIGHT-XMP-Copyright +[Composite, MWG, Location] MWG-Country - Country: RIGHT-IPTC-Country +[Composite, MWG, Author] MWG-Creator - Creator: RIGHT1of2-EXIF-Creator, RIGHT2of2-EXIF-Creator +[Composite, MWG, Time] MWG-DateTimeOriginal - Date/Time Original: 2001:01:01 01:11:11.111 +[Composite, MWG, Image] MWG-Description - Description: RIGHT-EXIF-Description +[Composite, MWG, Image] MWG-Keywords - Keywords: RIGHT1of2-XMP-Keywords, RIGHT2of2-XMP-Keywords +[Composite, MWG, Location] MWG-Location - Location: RIGHT-IPTC-Location +[Composite, MWG, Image] MWG-Orientation - Orientation: Rotate 90 CW +[Composite, MWG, Image] MWG-Rating - Rating: 3 +[Composite, MWG, Location] MWG-State - State: RIGHT-IPTC-State +[Composite, MWG, Time] MWG-CreateDate - Create Date: 2002:02:02 02:22:22+02:00 +[Composite, MWG, Time] MWG-ModifyDate - Modify Date: 2003:03:03 03:33:33.333+03:00 diff --git a/t/MWG_3.out b/t/MWG_3.out new file mode 100644 index 0000000..c6b280b --- /dev/null +++ b/t/MWG_3.out @@ -0,0 +1,11 @@ +[EXIF, IFD0, Author] 315 - Artist: Creator One, Creator Two +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2009:10:25 15:13:44 +[EXIF, ExifIFD, Time] 37521 - Sub Sec Time Original: 567 +[IPTC, IPTC, Time] 55 - Date Created: 2009:10:25 +[IPTC, IPTC, Time] 60 - Time Created: 15:13:44-04:00 +[IPTC, IPTC, Author] 80 - By-line: Creator One, Creator Two +[IPTC, IPTC, Location] 90 - City: Some city +[XMP, XMP-iptcExt, Location] LocationShownCity - Location Shown City: Some city +[XMP, XMP-dc, Author] creator - Creator: Creator One, Creator Two +[XMP, XMP-photoshop, Location] City - City: Some city +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2009:10:25 15:13:44.567-04:00 diff --git a/t/MWG_4.out b/t/MWG_4.out new file mode 100644 index 0000000..fcf1a5e --- /dev/null +++ b/t/MWG_4.out @@ -0,0 +1,7 @@ +[EXIF, IFD0, Author] 315 - Artist: Creator One, Creator Two +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2009:10:25 15:13:44 +[EXIF, ExifIFD, Time] 37521 - Sub Sec Time Original: 567 +[XMP, XMP-iptcExt, Location] LocationShownCity - Location Shown City: Some city +[XMP, XMP-dc, Author] creator - Creator: Creator One, Creator Two +[XMP, XMP-photoshop, Location] City - City: Some city +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2009:10:25 15:13:44.567-04:00 diff --git a/t/MWG_5.out b/t/MWG_5.out new file mode 100644 index 0000000..5f29fab --- /dev/null +++ b/t/MWG_5.out @@ -0,0 +1,23 @@ +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: A witty caption +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it +[IPTC, IPTC, Other] 105 - Headline: No headline +[IPTC, IPTC, Other] 40 - Special Instructions: What instructions +[IPTC, IPTC, Author] 80 - By-line: Phil Harvey +[IPTC, IPTC, Author] 85 - By-line Title: My Position +[IPTC, IPTC, Author] 110 - Credit: My Credit +[IPTC, IPTC, Other] 5 - Object Name: Test IPTC picture +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ont +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 103 - Original Transmission Reference: What is a transmission reference +[IPTC, IPTC, Other] 15 - Category: 1 +[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing, image, utilities +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright 2004 Phil Harvey +[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Author] 115 - Source: I'm the source +[IPTC, IPTC, Other] 25 - Keywords: jambalaya +[ExifTool, ExifTool, ExifTool] Warning - Warning: IPTCDigest is not current. XMP may be out of sync +[ExifTool, ExifTool, ExifTool] Warning - Warning: Ignored non-standard IPTC at JPEG-Trailer-FotoStation-IPTC +[ExifTool, ExifTool, ExifTool] Warning - Warning: Ignored non-standard IPTC at JPEG-Trailer-AFCP-IPTC diff --git a/t/MWG_6.out b/t/MWG_6.out new file mode 100644 index 0000000..d3227eb --- /dev/null +++ b/t/MWG_6.out @@ -0,0 +1,2 @@ +[XMP, XMP-dc, Author] creator - Creator: RIGHT1of2-EXIF-Creator, RIGHT2of2-EXIF-Creator +[Composite, MWG, Author] MWG-Creator - Creator: RIGHT1of2-EXIF-Creator, RIGHT2of2-EXIF-Creator diff --git a/t/MWG_7.out b/t/MWG_7.out new file mode 100644 index 0000000..bfc2890 --- /dev/null +++ b/t/MWG_7.out @@ -0,0 +1,11 @@ +[Composite, MWG, Location] MWG-City - City: Kingston +[Composite, MWG, Author] MWG-Copyright - Copyright: Copyright 2004 Phil Harvey +[Composite, MWG, Location] MWG-Country - Country: Canada +[Composite, MWG, Time] MWG-CreateDate - Create Date: 2001:05:19 18:36:41 +[Composite, MWG, Author] MWG-Creator - Creator: Phil Harvey +[Composite, MWG, Time] MWG-DateTimeOriginal - Date/Time Original: 2001:05:19 18:36:41 +[Composite, MWG, Image] MWG-Description - Description: A witty caption +[Composite, MWG, Image] MWG-Keywords - Keywords: jambalaya +[Composite, MWG, Time] MWG-ModifyDate - Modify Date: 2004:02:26 09:36:46 +[Composite, MWG, Image] MWG-Orientation - Orientation: Horizontal (normal) +[Composite, MWG, Location] MWG-State - State: Ont diff --git a/t/MXF.t b/t/MXF.t new file mode 100644 index 0000000..9f3e806 --- /dev/null +++ b/t/MXF.t @@ -0,0 +1,28 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/MXF.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::MXF; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'MXF'; +my $testnum = 1; + +# test 2: Extract information from an MXF file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/MXF.mxf'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/MXF_2.out b/t/MXF_2.out new file mode 100644 index 0000000..e7149c3 --- /dev/null +++ b/t/MXF_2.out @@ -0,0 +1,79 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: MXF.mxf +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 7.5 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:12:19 19:21:47-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:43-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: MXF +[File, File, Other] FileTypeExtension - File Type Extension: mxf +[File, File, Other] MIMEType - MIME Type: application/mxf +[MXF, MXF, Video] 0 - MXF Version: 1.2 +[MXF, MXF, Time] 060e2b34.0101.0102.07020110.02040000 - Container Last Modify Date: 2010:12:20 00:14:40.228 +[MXF, MXF, Video] 060e2b34.0101.0102.03010201.05000000 - SDK Version: 1.2 +[MXF, MXF, Video] 060e2b34.0101.0102.05200701.02010000 - Application Supplier Name: Phil Harvey +[MXF, MXF, Video] 060e2b34.0101.0102.05200701.03010000 - Application Name: ExifTool +[MXF, MXF, Video] 060e2b34.0101.0102.05200701.05010000 - Application Version String: Based on MXFLib 1.0.1(16)-Release +[MXF, MXF, Video] 060e2b34.0101.0102.05200701.0a000000 - Toolkit Version: 1.0.1.16 released +[MXF, MXF, Video] 060e2b34.0101.0102.05200701.06010000 - Application Platform: MXFLib (darwin on x86_64) +[MXF, MXF, Time] 060e2b34.0101.0102.07020110.02030000 - Modify Date: 2010:12:20 00:14:40.224 +[MXF, MXF, Video] 060e2b34.0101.0102.05200701.02010000 - Application Supplier Name: Phil Harvey +[MXF, MXF, Video] 060e2b34.0101.0102.05200701.03010000 - Application Name: ExifTool +[MXF, MXF, Video] 060e2b34.0101.0102.05200701.05010000 - Application Version String: Based on MXFLib 1.0.1(16)-Release +[MXF, MXF, Video] 060e2b34.0101.0102.05200701.0a000000 - Toolkit Version: 1.0.1.16 released +[MXF, MXF, Video] 060e2b34.0101.0102.05200701.06010000 - Application Platform: MXFLib (darwin on x86_64) +[MXF, MXF, Time] 060e2b34.0101.0102.07020110.02030000 - Modify Date: 2010:12:20 00:14:40.228 +[MXF, MXF, Time] 060e2b34.0101.0102.07020110.01030000 - Create Date: 2010:12:20 00:14:40.224 +[MXF, MXF, Time] 060e2b34.0101.0102.07020110.02050000 - Package Last Modify Date: 2010:12:20 00:14:40.224 +[MXF, Track1, Video] 060e2b34.0101.0102.01070102.01000000 - Track Name: Timecode Track +[MXF, Track1, Video] 060e2b34.0101.0102.01040103.00000000 - Track Number: 0 +[MXF, Track1, Video] 060e2b34.0101.0102.07020103.01030000 - Origin: 0 s +[MXF, Track1, Video] 060e2b34.0101.0102.05300405.00000000 - Edit Rate: 1 +[MXF, Track1, Video] 060e2b34.0101.0102.01070101.00000000 - Track ID: 1 +[MXF, Track1, Video] 060e2b34.0101.0102.04070100.00000000 - Component Data Definition: SMPTE 12M Timecode Track +[MXF, Track1, Video] 060e2b34.0101.0102.07020201.01030000 - Duration: 0 s +[MXF, Track1, Video] 060e2b34.0101.0102.04040101.02060000 - Rounded Timecode Timebase: 1 +[MXF, Track1, Video] 060e2b34.0101.0101.04040101.05000000 - Drop Frame: False +[MXF, Track1, Video] 060e2b34.0101.0102.07020103.01050000 - Start Timecode: 0 s +[MXF, Track1, Video] 060e2b34.0101.0102.07020201.01030000 - Duration: 0 s +[MXF, Track1, Video] 060e2b34.0101.0102.04070100.00000000 - Component Data Definition: SMPTE 12M Timecode Track +[MXF, Track2, Video] 060e2b34.0101.0102.01070102.01000000 - Track Name: Sound Track +[MXF, Track2, Video] 060e2b34.0101.0102.01040103.00000000 - Track Number: 0 +[MXF, Track2, Video] 060e2b34.0101.0102.07020103.01030000 - Origin: 0 s +[MXF, Track2, Video] 060e2b34.0101.0102.05300405.00000000 - Edit Rate: 1 +[MXF, Track2, Video] 060e2b34.0101.0102.01070101.00000000 - Track ID: 2 +[MXF, Track2, Video] 060e2b34.0101.0102.04070100.00000000 - Component Data Definition: Sound Essence Track +[MXF, Track2, Video] 060e2b34.0101.0102.07020201.01030000 - Duration: 0 s +[MXF, MXF, Time] 060e2b34.0101.0102.07020110.01030000 - Create Date: 2010:12:20 00:14:40.224 +[MXF, MXF, Time] 060e2b34.0101.0102.07020110.02050000 - Package Last Modify Date: 2010:12:20 00:14:40.224 +[MXF, Track1, Video] 060e2b34.0101.0102.01070102.01000000 - Track Name: Timecode Track +[MXF, Track1, Video] 060e2b34.0101.0102.01040103.00000000 - Track Number: 0 +[MXF, Track1, Video] 060e2b34.0101.0102.07020103.01030000 - Origin: 0 s +[MXF, Track1, Video] 060e2b34.0101.0102.05300405.00000000 - Edit Rate: 1 +[MXF, Track1, Video] 060e2b34.0101.0102.01070101.00000000 - Track ID: 1 +[MXF, Track1, Video] 060e2b34.0101.0102.04070100.00000000 - Component Data Definition: SMPTE 12M Timecode Track +[MXF, Track1, Video] 060e2b34.0101.0102.07020201.01030000 - Duration: 0 s +[MXF, Track1, Video] 060e2b34.0101.0102.04040101.02060000 - Rounded Timecode Timebase: 1 +[MXF, Track1, Video] 060e2b34.0101.0101.04040101.05000000 - Drop Frame: False +[MXF, Track1, Video] 060e2b34.0101.0102.07020103.01050000 - Start Timecode: 0 s +[MXF, Track1, Video] 060e2b34.0101.0102.07020201.01030000 - Duration: 0 s +[MXF, Track1, Video] 060e2b34.0101.0102.04070100.00000000 - Component Data Definition: SMPTE 12M Timecode Track +[MXF, Track2, Video] 060e2b34.0101.0102.01070102.01000000 - Track Name: Sound Track +[MXF, Track2, Video] 060e2b34.0101.0102.01040103.00000000 - Track Number: 369164801 +[MXF, Track2, Video] 060e2b34.0101.0102.07020103.01030000 - Origin: 0 s +[MXF, Track2, Video] 060e2b34.0101.0102.05300405.00000000 - Edit Rate: 1 +[MXF, Track2, Video] 060e2b34.0101.0102.01070101.00000000 - Track ID: 2 +[MXF, Track2, Video] 060e2b34.0101.0102.04070100.00000000 - Component Data Definition: Sound Essence Track +[MXF, Track2, Video] 060e2b34.0101.0102.07020201.01030000 - Duration: 0 s +[MXF, Track2, Video] 060e2b34.0101.0101.04060101.00000000 - Sample Rate: 1 +[MXF, Track2, Audio] 060e2b34.0101.0105.04020301.01010000 - Audio Sample Rate: 7872 +[MXF, Track2, Video] 060e2b34.0101.0104.04020301.04000000 - Locked Indicator: False +[MXF, Track2, Audio] 060e2b34.0101.0105.04020101.04000000 - Channel Count: 1 +[MXF, Track2, Audio] 060e2b34.0101.0104.04020303.04000000 - Bits Per Audio Sample: 8 +[MXF, Track2, Video] 060e2b34.0101.0105.04020302.01000000 - Block Align: 1 +[MXF, Track2, Audio] 060e2b34.0101.0105.04020303.05000000 - Average Bytes Per Second: 7872 +[MXF, Track2, Video] 060e2b34.0101.0105.06010103.05000000 - Linked Track ID: 2 +[MXF, Track2, Video] 060e2b34.0101.0101.04060102.00000000 - Essence Length: 0 s +[MXF, MXF, Video] 060e2b34.0101.0104.01030404.00000000 - Essence Stream ID: 1 +[MXF, MXF, Video] 060e2b34.0101.0102.07020201.01030000 - Duration: 0 s diff --git a/t/MacOS.t b/t/MacOS.t new file mode 100644 index 0000000..bc2835c --- /dev/null +++ b/t/MacOS.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/MacOS.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::MacOS; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'MacOS'; +my $testnum = 1; + +# test 2: Extract information from MacOS.macos (MacOS "._" sidecar file) +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/MacOS.macos'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/MacOS_2.out b/t/MacOS_2.out new file mode 100644 index 0000000..e6b90b3 --- /dev/null +++ b/t/MacOS_2.out @@ -0,0 +1,19 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: MacOS.macos +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 4.1 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:11:12 07:42:35-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:41-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rwxr-xr-x +[File, File, Other] FileType - File Type: MacOS +[File, File, Other] FileTypeExtension - File Type Extension: macos +[File, File, Other] MIMEType - MIME Type: application/unknown +[File, MacOS, Other] com.apple.quarantine - X Attr Quarantine: Flags=0082 set at 2020:11:12 12:27:26 by Safari +[File, MacOS, Time] com.apple.lastuseddate#PS - X Attr Last Used Date: 2020:11:12 12:27:26 +[File, MacOS, Time] com.apple.metadata:kMDItemDownloadedDate - X Attr MD Item Downloaded Date: 2020:11:12 07:27:26-05:00 +[File, MacOS, Other] com.apple.metadata:kMDItemWhereFroms - X Attr MD Item Where Froms: https://exiftool.org/test/sample.jpg +[File, MacOS, Other] com.apple.metadata:kMDLabel - X Attr MD Label: (Binary data 89 bytes) +[File, MacOS, Other] org.exiftool.metadata:TestTag - X Attr Org Exiftool Metadata Test Tag: this is a test tag +[File, MacOS, Other] com.apple.metadata:kMDItemFinderComment - X Attr MD Item Finder Comment: A Finder comment +[File, MacOS, Other] com.apple.metadata:_kMDItemUserTags - X Attr MD Item User Tags: Red;6, Custom1, Yellow;5, Custom2 diff --git a/t/Matroska.t b/t/Matroska.t new file mode 100644 index 0000000..18cf78a --- /dev/null +++ b/t/Matroska.t @@ -0,0 +1,30 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Matroska.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Matroska; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Matroska'; +my $testnum = 1; + +# test 2: Extract information from test image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Unknown => 1); + my $info = $exifTool->ImageInfo('t/images/Matroska.mkv'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Matroska_2.out b/t/Matroska_2.out new file mode 100644 index 0000000..0348734 --- /dev/null +++ b/t/Matroska_2.out @@ -0,0 +1,66 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Matroska.mkv +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 507 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:05:28 18:24:56-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:11-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: MKV +[File, File, Other] FileTypeExtension - File Type Extension: mkv +[File, File, Other] MIMEType - MIME Type: video/x-matroska +[Matroska, Matroska, Video] 642 - Doc Type: matroska +[Matroska, Matroska, Video] 647 - Doc Type Version: 1 +[Matroska, Matroska, Video] 645 - Doc Type Read Version: 1 +[Matroska, Matroska, Video] 5035 - Seek ID: (Binary data 4 bytes) +[Matroska, Matroska, Video] 5036 - Seek Position: 4099 +[Matroska, Matroska, Video] 5035 - Seek ID: (Binary data 4 bytes) +[Matroska, Matroska, Video] 5036 - Seek Position: 4264 +[Matroska, Matroska, Video] 5035 - Seek ID: (Binary data 4 bytes) +[Matroska, Matroska, Video] 5036 - Seek Position: 17889670 +[Matroska, Matroska, Video] 5035 - Seek ID: (Binary data 4 bytes) +[Matroska, Matroska, Video] 5036 - Seek Position: 17889269 +[Matroska, Matroska, Video] 710577 - Timecode Scale: 1 ms +[Matroska, Matroska, Video] 3456 - Muxing App: libebml v0.7.8 + libmatroska v0.8.1 +[Matroska, Matroska, Video] 5953 - Writing App: mkvmerge v2.4.0 ('Fumbling Towards Ecstasy') built on Dec 3 2008 16:22:41 +[Matroska, Matroska, Video] 1161 - Duration: 0:02:29 +[Matroska, Matroska, Time] 1121 - Date/Time Original: 2010:02:03 21:17:48Z +[Matroska, Matroska, Video] 13220 - Segment UID: (Binary data 16 bytes) +[Matroska, Track1, Video] 87 - Track Number: 1 +[Matroska, Track1, Video] 13253 - Track UID: 2708023567 +[Matroska, Track1, Video] 3 - Track Type: Video +[Matroska, Track1, Video] 57 - Track Used: Yes +[Matroska, Track1, Video] 8 - Track Default: Yes +[Matroska, Track1, Video] 5546 - Track Forced: No +[Matroska, Track1, Video] 28 - Track Lacing: No +[Matroska, Track1, Video] 11751 - Min Cache: 1 +[Matroska, Track1, Video] 209231 - Track Timecode Scale: 1 +[Matroska, Track1, Video] 5614 - Max Block Addition ID: 0 +[Matroska, Track1, Video] 6 - Video Codec ID: V_MPEG4/ISO/AVC +[Matroska, Track1, Video] 42 - Codec Decode All: Yes +[Matroska, Track1, Video] 9122 - Codec Private: (Binary data 41 bytes) +[Matroska, Track1, Video] 254851 - Video Frame Rate: 25 +[Matroska, Track1, Video] 177564 - Track Language: und +[Matroska, Track1, Video] 48 - Image Width: 704 +[Matroska, Track1, Video] 58 - Image Height: 576 +[Matroska, Track1, Video] 26 - Video Scan Type: Progressive +[Matroska, Track1, Video] 5296 - Display Width: 768 +[Matroska, Track1, Video] 5306 - Display Height: 576 +[Matroska, Track2, Video] 87 - Track Number: 2 +[Matroska, Track2, Video] 13253 - Track UID: 3776461812 +[Matroska, Track2, Video] 3 - Track Type: Audio +[Matroska, Track2, Video] 57 - Track Used: Yes +[Matroska, Track2, Video] 8 - Track Default: Yes +[Matroska, Track2, Video] 5546 - Track Forced: No +[Matroska, Track2, Video] 28 - Track Lacing: Yes +[Matroska, Track2, Video] 11751 - Min Cache: 0 +[Matroska, Track2, Video] 209231 - Track Timecode Scale: 1 +[Matroska, Track2, Video] 5614 - Max Block Addition ID: 0 +[Matroska, Track2, Video] 6 - Audio Codec ID: A_MPEG/L3 +[Matroska, Track2, Video] 42 - Codec Decode All: Yes +[Matroska, Track2, Video] 254851 - Default Duration: 24 ms +[Matroska, Track2, Video] 177564 - Track Language: und +[Matroska, Track2, Audio] 53 - Audio Sample Rate: 48000 +[Matroska, Track2, Audio] 31 - Audio Channels: 2 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 704x576 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.406 diff --git a/t/Minolta.t b/t/Minolta.t new file mode 100644 index 0000000..aa004b3 --- /dev/null +++ b/t/Minolta.t @@ -0,0 +1,51 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Minolta.t". + +BEGIN { + $| = 1; print "1..4\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Minolta; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Minolta'; +my $testnum = 1; + +# test 2: Extract information from Minolta.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Minolta.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + ['Caption-Abstract' => 'A new caption/abstract'], + ['MinoltaDate' => '2005:01:16'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 4: Write rewriting MRW image +{ + ++$testnum; + my @writeInfo = ( + ['FocusMode' => 'MF'], + ['LastFileNumber' => '123'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/Minolta.mrw'); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Minolta_2.out b/t/Minolta_2.out new file mode 100644 index 0000000..6010eea --- /dev/null +++ b/t/Minolta_2.out @@ -0,0 +1,135 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Minolta.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 14 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:42-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: DCF 1.0 +[EXIF, IFD0, Camera] 271 - Make: Minolta Co., Ltd. +[EXIF, IFD0, Camera] 272 - Camera Model Name: DiMAGE 7i +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Ver.1.00u +[EXIF, IFD0, Time] 306 - Modify Date: 2002:06:01 12:37:27 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/180 +[EXIF, ExifIFD, Image] 33437 - F Number: 5.6 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2002:06:01 12:37:27 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2002:06:01 12:37:27 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 7.5 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.4 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 42.3 mm +[EXIF, ExifIFD, Camera] 37396 - Subject Area: 960 960 320 192 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2560 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1920 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Custom +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 0 +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 167 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: None +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, ExifIFD, Camera] 41996 - Subject Distance Range: Close +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 13224 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Minolta, Camera] 0 - Maker Note Version: MLT0 +[MakerNotes, Minolta, Camera] 1 - Exposure Mode: Program +[MakerNotes, Minolta, Camera] 2 - Flash Mode: Fill flash +[MakerNotes, Minolta, Camera] 3 - White Balance: Auto +[MakerNotes, Minolta, Camera] 4 - Minolta Image Size: Full +[MakerNotes, Minolta, Camera] 5 - Minolta Quality: Fine +[MakerNotes, Minolta, Camera] 6 - Drive Mode: Single +[MakerNotes, Minolta, Camera] 7 - Metering Mode: Multi-segment +[MakerNotes, Minolta, Camera] 8 - ISO: 100 +[MakerNotes, Minolta, Camera] 9 - Exposure Time: 1/181 +[MakerNotes, Minolta, Camera] 10 - F Number: 5.7 +[MakerNotes, Minolta, Camera] 11 - Macro Mode: Off +[MakerNotes, Minolta, Camera] 12 - Digital Zoom: Off +[MakerNotes, Minolta, Camera] 13 - Exposure Compensation: 0 +[MakerNotes, Minolta, Camera] 14 - Bracket Step: 1/3 EV +[MakerNotes, Minolta, Camera] 16 - Interval Length: 0 +[MakerNotes, Minolta, Camera] 17 - Interval Number: 2 +[MakerNotes, Minolta, Camera] 18 - Focal Length: 41.4 mm +[MakerNotes, Minolta, Camera] 19 - Focus Distance: 2 m +[MakerNotes, Minolta, Camera] 20 - Flash Fired: No +[MakerNotes, Minolta, Time] 21 - Minolta Date: 2002:06:01 +[MakerNotes, Minolta, Time] 22 - Minolta Time: 12:37:27 +[MakerNotes, Minolta, Camera] 23 - Max Aperture: 3.4 +[MakerNotes, Minolta, Camera] 26 - File Number Memory: On +[MakerNotes, Minolta, Camera] 27 - Last File Number: 32 +[MakerNotes, Minolta, Camera] 28 - Color Balance Red: 1.49609375 +[MakerNotes, Minolta, Camera] 29 - Color Balance Green: 1 +[MakerNotes, Minolta, Camera] 30 - Color Balance Blue: 1.375 +[MakerNotes, Minolta, Camera] 31 - Saturation: Normal +[MakerNotes, Minolta, Camera] 32 - Contrast: Normal +[MakerNotes, Minolta, Camera] 33 - Sharpness: Normal +[MakerNotes, Minolta, Camera] 34 - Subject Program: None +[MakerNotes, Minolta, Camera] 35 - Flash Exposure Compensation: 0 +[MakerNotes, Minolta, Camera] 36 - ISO Setting: 100 +[MakerNotes, Minolta, Camera] 37 - Minolta Model ID: DiMAGE 7i +[MakerNotes, Minolta, Camera] 38 - Interval Mode: Still Image +[MakerNotes, Minolta, Camera] 39 - Folder Name: Standard Form +[MakerNotes, Minolta, Camera] 40 - Color Mode: Natural color +[MakerNotes, Minolta, Camera] 41 - Color Filter: 0 +[MakerNotes, Minolta, Camera] 42 - BW Filter: 0 +[MakerNotes, Minolta, Camera] 43 - Internal Flash: No +[MakerNotes, Minolta, Camera] 44 - Brightness: 7.5 +[MakerNotes, Minolta, Camera] 45 - Spot Focus Point X: 1280 +[MakerNotes, Minolta, Camera] 46 - Spot Focus Point Y: 960 +[MakerNotes, Minolta, Camera] 47 - Wide Focus Zone: Left zone +[MakerNotes, Minolta, Camera] 48 - Focus Mode: AF +[MakerNotes, Minolta, Camera] 49 - Focus Area: Wide Focus (normal) +[MakerNotes, Minolta, Camera] 50 - DEC Position: Exposure +[MakerNotes, Minolta, Camera] 64 - Compressed Image Size: 2396300 +[MakerNotes, Minolta, Camera] 136 - Preview Image Start: 13042 +[MakerNotes, Minolta, Camera] 137 - Preview Image Length: 26 +[MakerNotes, Minolta, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0100 +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[Composite, Composite, Image] Exif-Aperture - Aperture: 5.6 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 3.9 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/180 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.008 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: 0.19 m (1.91 - 2.10 m) +[Composite, Composite, Image] Exif-FOV - Field Of View: 12.0 deg (0.42 m) +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 42.3 mm (35 mm equivalent: 167.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 42.01 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 12.5 diff --git a/t/Minolta_3.out b/t/Minolta_3.out new file mode 100644 index 0000000..e483fc0 --- /dev/null +++ b/t/Minolta_3.out @@ -0,0 +1,148 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Minolta_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 14 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:42-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:42-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:42-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 55a74ece68e6b31776ae6870c7a02dd6 +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: DCF 1.0 +[EXIF, IFD0, Camera] 271 - Make: Minolta Co., Ltd. +[EXIF, IFD0, Camera] 272 - Camera Model Name: DiMAGE 7i +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Ver.1.00u +[EXIF, IFD0, Time] 306 - Modify Date: 2002:06:01 12:37:27 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/180 +[EXIF, ExifIFD, Image] 33437 - F Number: 5.6 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2002:06:01 12:37:27 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2002:06:01 12:37:27 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 7.5 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.4 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 42.3 mm +[EXIF, ExifIFD, Camera] 37396 - Subject Area: 960 960 320 192 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2560 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1920 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Custom +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 0 +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 167 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: None +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, ExifIFD, Camera] 41996 - Subject Distance Range: Close +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 13198 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Minolta, Camera] 0 - Maker Note Version: MLT0 +[MakerNotes, Minolta, Camera] 1 - Exposure Mode: Program +[MakerNotes, Minolta, Camera] 2 - Flash Mode: Fill flash +[MakerNotes, Minolta, Camera] 3 - White Balance: Auto +[MakerNotes, Minolta, Camera] 4 - Minolta Image Size: Full +[MakerNotes, Minolta, Camera] 5 - Minolta Quality: Fine +[MakerNotes, Minolta, Camera] 6 - Drive Mode: Single +[MakerNotes, Minolta, Camera] 7 - Metering Mode: Multi-segment +[MakerNotes, Minolta, Camera] 8 - ISO: 100 +[MakerNotes, Minolta, Camera] 9 - Exposure Time: 1/181 +[MakerNotes, Minolta, Camera] 10 - F Number: 5.7 +[MakerNotes, Minolta, Camera] 11 - Macro Mode: Off +[MakerNotes, Minolta, Camera] 12 - Digital Zoom: Off +[MakerNotes, Minolta, Camera] 13 - Exposure Compensation: 0 +[MakerNotes, Minolta, Camera] 14 - Bracket Step: 1/3 EV +[MakerNotes, Minolta, Camera] 16 - Interval Length: 0 +[MakerNotes, Minolta, Camera] 17 - Interval Number: 2 +[MakerNotes, Minolta, Camera] 18 - Focal Length: 41.4 mm +[MakerNotes, Minolta, Camera] 19 - Focus Distance: 2 m +[MakerNotes, Minolta, Camera] 20 - Flash Fired: No +[MakerNotes, Minolta, Time] 21 - Minolta Date: 2005:01:16 +[MakerNotes, Minolta, Time] 22 - Minolta Time: 12:37:27 +[MakerNotes, Minolta, Camera] 23 - Max Aperture: 3.4 +[MakerNotes, Minolta, Camera] 26 - File Number Memory: On +[MakerNotes, Minolta, Camera] 27 - Last File Number: 32 +[MakerNotes, Minolta, Camera] 28 - Color Balance Red: 1.49609375 +[MakerNotes, Minolta, Camera] 29 - Color Balance Green: 1 +[MakerNotes, Minolta, Camera] 30 - Color Balance Blue: 1.375 +[MakerNotes, Minolta, Camera] 31 - Saturation: Normal +[MakerNotes, Minolta, Camera] 32 - Contrast: Normal +[MakerNotes, Minolta, Camera] 33 - Sharpness: Normal +[MakerNotes, Minolta, Camera] 34 - Subject Program: None +[MakerNotes, Minolta, Camera] 35 - Flash Exposure Compensation: 0 +[MakerNotes, Minolta, Camera] 36 - ISO Setting: 100 +[MakerNotes, Minolta, Camera] 37 - Minolta Model ID: DiMAGE 7i +[MakerNotes, Minolta, Camera] 38 - Interval Mode: Still Image +[MakerNotes, Minolta, Camera] 39 - Folder Name: Standard Form +[MakerNotes, Minolta, Camera] 40 - Color Mode: Natural color +[MakerNotes, Minolta, Camera] 41 - Color Filter: 0 +[MakerNotes, Minolta, Camera] 42 - BW Filter: 0 +[MakerNotes, Minolta, Camera] 43 - Internal Flash: No +[MakerNotes, Minolta, Camera] 44 - Brightness: 7.5 +[MakerNotes, Minolta, Camera] 45 - Spot Focus Point X: 1280 +[MakerNotes, Minolta, Camera] 46 - Spot Focus Point Y: 960 +[MakerNotes, Minolta, Camera] 47 - Wide Focus Zone: Left zone +[MakerNotes, Minolta, Camera] 48 - Focus Mode: AF +[MakerNotes, Minolta, Camera] 49 - Focus Area: Wide Focus (normal) +[MakerNotes, Minolta, Camera] 50 - DEC Position: Exposure +[MakerNotes, Minolta, Camera] 16 - Minolta 0x0010: ¯¯¯¯ÿ...’.–Œ.P…þÿ~½ÿßßÓÿÿÿïýÿÿ[...] +[MakerNotes, Minolta, Camera] 32 - Minolta 0x0020: øøøm.n.nn..¤/&#¡......(,;...k(S.[...] +[MakerNotes, Minolta, Camera] 64 - Compressed Image Size: 2396300 +[MakerNotes, Minolta, Camera] 136 - Preview Image Start: 13226 +[MakerNotes, Minolta, Camera] 137 - Preview Image Length: 26 +[MakerNotes, Minolta, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0100 +[PrintIM, PrintIM, Printing] 1 - Print IM 0x0001: 0x00160016 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x01000000 +[PrintIM, PrintIM, Printing] 256 - Print IM 0x0100: 0x01000000 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x00000000 +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[PrintIM, PrintIM, Printing] 1 - Print IM 0x0001: 0x00160016 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x01000000 +[PrintIM, PrintIM, Printing] 256 - Print IM 0x0100: 0x01000000 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x00000000 +[IPTC, IPTC, Other] 120 - Caption-Abstract: A new caption/abstract +[IPTC, IPTC, Other] 0 - Application Record Version: 4 +[Composite, Composite, Image] Exif-Aperture - Aperture: 5.6 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 3.9 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/180 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.008 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: 0.19 m (1.91 - 2.10 m) +[Composite, Composite, Image] Exif-FOV - Field Of View: 12.0 deg (0.42 m) +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 42.3 mm (35 mm equivalent: 167.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 42.01 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 12.5 diff --git a/t/Minolta_4.out b/t/Minolta_4.out new file mode 100644 index 0000000..5a0c0f2 --- /dev/null +++ b/t/Minolta_4.out @@ -0,0 +1,156 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Minolta_4_failed.mrw +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 2.6 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:42-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:42-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:42-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: MRW +[File, File, Other] FileTypeExtension - File Type Extension: mrw +[File, File, Other] MIMEType - MIME Type: image/x-minolta-mrw +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[MakerNotes, MinoltaRaw, Camera] 0 - Firmware ID: 27200001 +[MakerNotes, MinoltaRaw, Camera] 8 - Sensor Height: 2456 +[MakerNotes, MinoltaRaw, Camera] 10 - Sensor Width: 3272 +[MakerNotes, MinoltaRaw, Camera] 12 - Image Height: 2448 +[MakerNotes, MinoltaRaw, Camera] 14 - Image Width: 3264 +[MakerNotes, MinoltaRaw, Camera] 16 - Raw Depth: 12 +[MakerNotes, MinoltaRaw, Camera] 17 - Bit Depth: 12 +[MakerNotes, MinoltaRaw, Camera] 18 - Storage Method: Linear +[MakerNotes, MinoltaRaw, Camera] 23 - Bayer Pattern: RGGB +[MakerNotes, Minolta, Camera] 0 - Maker Note Version: MLT0 +[MakerNotes, Minolta, Camera] 1 - Exposure Mode: Manual +[MakerNotes, Minolta, Camera] 2 - Flash Mode: Fill flash +[MakerNotes, Minolta, Camera] 3 - White Balance: Auto +[MakerNotes, Minolta, Camera] 4 - Minolta Image Size: 640x480 +[MakerNotes, Minolta, Camera] 5 - Minolta Quality: Raw +[MakerNotes, Minolta, Camera] 6 - Drive Mode: Single +[MakerNotes, Minolta, Camera] 7 - Metering Mode: Multi-segment +[MakerNotes, Minolta, Camera] 8 - ISO: 71 +[MakerNotes, Minolta, Camera] 9 - Exposure Time: 1/5 +[MakerNotes, Minolta, Camera] 10 - F Number: 2.7 +[MakerNotes, Minolta, Camera] 11 - Macro Mode: Off +[MakerNotes, Minolta, Camera] 12 - Digital Zoom: Off +[MakerNotes, Minolta, Camera] 13 - Exposure Compensation: 0 +[MakerNotes, Minolta, Camera] 14 - Bracket Step: 2/3 EV +[MakerNotes, Minolta, Camera] 16 - Interval Length: 60 +[MakerNotes, Minolta, Camera] 17 - Interval Number: 2 +[MakerNotes, Minolta, Camera] 18 - Focal Length: 7.4 mm +[MakerNotes, Minolta, Camera] 19 - Focus Distance: inf +[MakerNotes, Minolta, Camera] 20 - Flash Fired: No +[MakerNotes, Minolta, Time] 21 - Minolta Date: 2004:11:18 +[MakerNotes, Minolta, Time] 22 - Minolta Time: 23:14:58 +[MakerNotes, Minolta, Camera] 23 - Max Aperture: 2.7 +[MakerNotes, Minolta, Camera] 26 - File Number Memory: On +[MakerNotes, Minolta, Camera] 27 - Last File Number: 123 +[MakerNotes, Minolta, Camera] 28 - Color Balance Red: 1.7109375 +[MakerNotes, Minolta, Camera] 29 - Color Balance Green: 1 +[MakerNotes, Minolta, Camera] 30 - Color Balance Blue: 1.98828125 +[MakerNotes, Minolta, Camera] 31 - Saturation: Normal +[MakerNotes, Minolta, Camera] 32 - Contrast: Normal +[MakerNotes, Minolta, Camera] 33 - Sharpness: Normal +[MakerNotes, Minolta, Camera] 34 - Subject Program: None +[MakerNotes, Minolta, Camera] 35 - Flash Exposure Compensation: 0 +[MakerNotes, Minolta, Camera] 36 - ISO Setting: 64 +[MakerNotes, Minolta, Camera] 37 - Minolta Model ID: DiMAGE A2 or S414 +[MakerNotes, Minolta, Camera] 38 - Interval Mode: Still Image +[MakerNotes, Minolta, Camera] 39 - Folder Name: Standard Form +[MakerNotes, Minolta, Camera] 40 - Color Mode: Natural color +[MakerNotes, Minolta, Camera] 41 - Color Filter: 0 +[MakerNotes, Minolta, Camera] 42 - BW Filter: 0 +[MakerNotes, Minolta, Camera] 43 - Internal Flash: No +[MakerNotes, Minolta, Camera] 44 - Brightness: 0.75 +[MakerNotes, Minolta, Camera] 45 - Spot Focus Point X: 1632 +[MakerNotes, Minolta, Camera] 46 - Spot Focus Point Y: 1224 +[MakerNotes, Minolta, Camera] 47 - Wide Focus Zone: Unknown (7) +[MakerNotes, Minolta, Camera] 48 - Focus Mode: MF +[MakerNotes, Minolta, Camera] 49 - Focus Area: Spot Focus +[MakerNotes, Minolta, Camera] 50 - DEC Position: Filter +[MakerNotes, Minolta, Camera] 63 - Flash Metering: ADI (Advanced Distance Integration) +[MakerNotes, Minolta, Camera] 16 - Minolta 0x0010: ¯¯¯¯.vÿð......#.....[...] +[MakerNotes, Minolta, Camera] 24 - Image Stabilization: On +[MakerNotes, Minolta, Camera] 32 - Minolta 0x0020: ®®® .ÿ....ü.........`..I[...] +[MakerNotes, Minolta, Camera] 64 - Compressed Image Size: 16072064 +[MakerNotes, Minolta, Camera] 136 - Preview Image Start: 2082 +[MakerNotes, Minolta, Camera] 137 - Preview Image Length: 26 +[MakerNotes, Minolta, Camera] 256 - Scene Mode: Standard +[MakerNotes, Minolta, Camera] 257 - Color Mode: Natural +[MakerNotes, Minolta, Camera] 258 - Minolta Quality: Raw +[MakerNotes, Minolta, Camera] 260 - Flash Exposure Compensation: 0 +[MakerNotes, MinoltaRaw, Camera] 0 - WB Scale: 2 2 2 2 +[MakerNotes, MinoltaRaw, Camera] 4 - WB RGGB Levels: 438 256 256 509 +[MakerNotes, MinoltaRaw, Image] 1 - Saturation: 0 +[MakerNotes, MinoltaRaw, Image] 2 - Contrast: 0 +[MakerNotes, MinoltaRaw, Image] 3 - Sharpness: 0 +[MakerNotes, MinoltaRaw, Image] 4 - WB Mode: Auto (0) +[MakerNotes, MinoltaRaw, Image] 5 - Program Mode: None +[MakerNotes, MinoltaRaw, Image] 6 - ISO Setting: 65 +[MakerNotes, MinoltaRaw, Image] 7 - Color Mode: Natural color +[MakerNotes, MinoltaRaw, Image] 8 - WB RB Levels Tungsten: 278 738 +[MakerNotes, MinoltaRaw, Image] 12 - WB RB Levels Daylight: 503 357 +[MakerNotes, MinoltaRaw, Image] 16 - WB RB Levels Cloudy: 565 330 +[MakerNotes, MinoltaRaw, Image] 20 - WB RB Levels Cool White F: 441 545 +[MakerNotes, MinoltaRaw, Image] 24 - WB RB Levels Flash: 523 339 +[MakerNotes, MinoltaRaw, Image] 28 - WB RB Levels Custom: 565 330 +[MakerNotes, MinoltaRaw, Image] 56 - Color Filter: 0 +[MakerNotes, MinoltaRaw, Image] 57 - BW Filter: 0 +[MakerNotes, MinoltaRaw, Image] 58 - Zone Matching: ISO Setting Used +[MakerNotes, MinoltaRaw, Image] 59 - Hue: 0 +[MakerNotes, Minolta, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[EXIF, IFD0, Image] 256 - Image Width: 3264 +[EXIF, IFD0, Image] 257 - Image Height: 2448 +[EXIF, IFD0, Image] 259 - Compression: Uncompressed +[EXIF, IFD0, Image] 270 - Image Description: KONICA MINOLTA DIGITAL CAMERA +[EXIF, IFD0, Camera] 271 - Make: Konica Minolta Camera, Inc. +[EXIF, IFD0, Camera] 272 - Camera Model Name: DiMAGE A2 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 305 - Software: DiMAGE A2 Ver.1.12 +[EXIF, IFD0, Time] 306 - Modify Date: 2004:11:18 23:14:58 +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/5 +[EXIF, ExifIFD, Image] 33437 - F Number: 2.8 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Manual +[EXIF, ExifIFD, Image] 34855 - ISO: 64 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2004:11:18 23:14:58 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2004:11:18 23:14:58 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 0.7 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Unknown +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 7.2 mm +[EXIF, ExifIFD, Camera] 37396 - Subject Area: 1632 1224 320 384 +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 0 +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 28 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: None +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, ExifIFD, Camera] 41996 - Subject Distance Range: Distant +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[PrintIM, PrintIM, Printing] 1 - Print IM 0x0001: 0x00160016 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x01000000 +[PrintIM, PrintIM, Printing] 3 - Print IM 0x0003: 0x0000002e +[PrintIM, PrintIM, Printing] 256 - Print IM 0x0100: 0x01000000 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x00000000 +[Composite, Composite, Image] Exif-Aperture - Aperture: 2.8 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 3264x2448 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 8.0 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/5 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.988281 +[Composite, Composite, Image] Exif-LightValue - Light Value: 5.9 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 1.710938 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 3.9 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.008 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: inf (2.40 m - inf) +[Composite, Composite, Image] Exif-FOV - Field Of View: 65.5 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 7.2 mm (35 mm equivalent: 28.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 2.40 m diff --git a/t/Motorola.t b/t/Motorola.t new file mode 100644 index 0000000..e0fe866 --- /dev/null +++ b/t/Motorola.t @@ -0,0 +1,30 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Motorola.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Motorola; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Motorola'; +my $testnum = 1; + +# test 2: Extract information from Motorola.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Unknown => 1); + my $info = $exifTool->ImageInfo('t/images/Motorola.jpg', 'MakerNotes:*'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Motorola_2.out b/t/Motorola_2.out new file mode 100644 index 0000000..15d9da4 --- /dev/null +++ b/t/Motorola_2.out @@ -0,0 +1,97 @@ +[MakerNotes, Motorola, Camera] 21760 - Build Number: LPH23.116-18 +[MakerNotes, Motorola, Camera] 21761 - Serial Number: NX0A3S0075 +[MakerNotes, Motorola, Camera] 21762 - Motorola 0x5502: 96 +[MakerNotes, Motorola, Camera] 21763 - Motorola 0x5503: 30 +[MakerNotes, Motorola, Camera] 21728 - Motorola 0x54e0: 1 +[MakerNotes, Motorola, Camera] 21776 - Motorola 0x5510: 1 +[MakerNotes, Motorola, Camera] 21888 - Motorola 0x5580: 15000 +[MakerNotes, Motorola, Camera] 21904 - Motorola 0x5590: 30000 +[MakerNotes, Motorola, Camera] 21920 - Motorola 0x55a0: 1440 +[MakerNotes, Motorola, Camera] 21936 - Motorola 0x55b0: 1080 +[MakerNotes, Motorola, Camera] 21952 - Motorola 0x55c0: 30 +[MakerNotes, Motorola, Camera] 21968 - Motorola 0x55d0: yuv420sp +[MakerNotes, Motorola, Camera] 21744 - Motorola 0x54f0: 92.9883575439453 +[MakerNotes, Motorola, Camera] 25600 - Motorola 0x6400: OFF +[MakerNotes, Motorola, Camera] 21777 - Motorola 0x5511: 926 +[MakerNotes, Motorola, Camera] 25616 - Motorola 0x6410: NO +[MakerNotes, Motorola, Camera] 25648 - Motorola 0x6430: 0 +[MakerNotes, Motorola, Camera] 25679 - Motorola 0x644f: 0 +[MakerNotes, Motorola, Camera] 25792 - Motorola 0x64c0: 2 +[MakerNotes, Motorola, Camera] 25793 - Motorola 0x64c1: 1 +[MakerNotes, Motorola, Camera] 25794 - Motorola 0x64c2: 1 +[MakerNotes, Motorola, Camera] 25795 - Motorola 0x64c3: 0 +[MakerNotes, Motorola, Camera] 25796 - Motorola 0x64c4: 583 +[MakerNotes, Motorola, Camera] 25797 - Motorola 0x64c5: 912 +[MakerNotes, Motorola, Camera] 25904 - Motorola 0x6530: 494 +[MakerNotes, Motorola, Camera] 25905 - Motorola 0x6531: 11 +[MakerNotes, Motorola, Camera] 25906 - Motorola 0x6532: 0 +[MakerNotes, Motorola, Camera] 25907 - Motorola 0x6533: 0 +[MakerNotes, Motorola, Camera] 25908 - Motorola 0x6534: 372423 +[MakerNotes, Motorola, Camera] 25909 - Motorola 0x6535: 372822 +[MakerNotes, Motorola, Camera] 28672 - Motorola 0x7000: 0 +[MakerNotes, Motorola, Camera] 28673 - Motorola 0x7001: -479 +[MakerNotes, Motorola, Camera] 28674 - Motorola 0x7002: -637 +[MakerNotes, Motorola, Camera] 28675 - Motorola 0x7003: 958 +[MakerNotes, Motorola, Camera] 28676 - Motorola 0x7004: 1274 +[MakerNotes, Motorola, Camera] 28677 - Motorola 0x7005: 0 +[MakerNotes, Motorola, Camera] 21778 - Motorola 0x5512: 0 +[MakerNotes, Motorola, Camera] 21792 - Motorola 0x5520: 1 +[MakerNotes, Motorola, Camera] 21808 - Motorola 0x5530: continuous-picture +[MakerNotes, Motorola, Camera] 21824 - Motorola 0x5540: 95 +[MakerNotes, Motorola, Camera] 21840 - Motorola 0x5550: 85 +[MakerNotes, Motorola, Camera] 21856 - Motorola 0x5560: auto +[MakerNotes, Motorola, Camera] 21872 - Motorola 0x5570: auto +[MakerNotes, Motorola, Camera] 25856 - Motorola 0x6500: 1 +[MakerNotes, Motorola, Camera] 26177 - Motorola 0x6641: 1 +[MakerNotes, Motorola, Camera] 21991 - Motorola 0x55e7: 51392 +[MakerNotes, Motorola, Camera] 21992 - Motorola 0x55e8: 13376 +[MakerNotes, Motorola, Camera] 21989 - Motorola 0x55e5: 47264 +[MakerNotes, Motorola, Camera] 21990 - Motorola 0x55e6: 17504 +[MakerNotes, Motorola, Camera] 26112 - Motorola 0x6600: 0 +[MakerNotes, Motorola, Camera] 26113 - Motorola 0x6601: 1 +[MakerNotes, Motorola, Camera] 26114 - Motorola 0x6602: 1 +[MakerNotes, Motorola, Camera] 26176 - Motorola 0x6640: 0 +[MakerNotes, Motorola, Camera] 26116 - Motorola 0x6604: 0 +[MakerNotes, Motorola, Camera] 26206 - Sensor: BACK,IMX230 +[MakerNotes, Motorola, Camera] 26118 - Motorola 0x6606: 5000 +[MakerNotes, Motorola, Camera] 26130 - Motorola 0x6612: 461 +[MakerNotes, Motorola, Camera] 26131 - Motorola 0x6613: 817 +[MakerNotes, Motorola, Camera] 26132 - Motorola 0x6614: 817 +[MakerNotes, Motorola, Camera] 26133 - Motorola 0x6615: 527 +[MakerNotes, Motorola, Camera] 26178 - Motorola 0x6642: 471 +[MakerNotes, Motorola, Camera] 26179 - Motorola 0x6643: 818 +[MakerNotes, Motorola, Camera] 26180 - Motorola 0x6644: 817 +[MakerNotes, Motorola, Camera] 26181 - Motorola 0x6645: 526 +[MakerNotes, Motorola, Camera] 26119 - Motorola 0x6607: 3000 +[MakerNotes, Motorola, Camera] 26134 - Motorola 0x6616: 660 +[MakerNotes, Motorola, Camera] 26135 - Motorola 0x6617: 819 +[MakerNotes, Motorola, Camera] 26136 - Motorola 0x6618: 818 +[MakerNotes, Motorola, Camera] 26137 - Motorola 0x6619: 374 +[MakerNotes, Motorola, Camera] 26182 - Motorola 0x6646: 673 +[MakerNotes, Motorola, Camera] 26183 - Motorola 0x6647: 820 +[MakerNotes, Motorola, Camera] 26184 - Motorola 0x6648: 820 +[MakerNotes, Motorola, Camera] 26185 - Motorola 0x6649: 374 +[MakerNotes, Motorola, Camera] 26190 - Motorola 0x664e: 10 +[MakerNotes, Motorola, Camera] 26191 - Motorola 0x664f: 64 +[MakerNotes, Motorola, Camera] 26192 - Motorola 0x6650: 64 +[MakerNotes, Motorola, Camera] 26193 - Motorola 0x6651: 64 +[MakerNotes, Motorola, Camera] 26194 - Motorola 0x6652: 64 +[MakerNotes, Motorola, Camera] 26196 - Motorola 0x6654: 0 +[MakerNotes, Motorola, Camera] 26197 - Motorola 0x6655: 0 +[MakerNotes, Motorola, Camera] 26198 - Motorola 0x6656: 0 +[MakerNotes, Motorola, Camera] 26205 - Motorola 0x665d: 1 +[MakerNotes, Motorola, Camera] 26195 - Motorola 0x6653: AL +[MakerNotes, Motorola, Camera] 26368 - Motorola 0x6700: 00000000904c2ca2 +[MakerNotes, Motorola, Camera] 26369 - Motorola 0x6701: 94014037 +[MakerNotes, Motorola, Camera] 26370 - Motorola 0x6702: 32 +[MakerNotes, Motorola, Camera] 26371 - Motorola 0x6703: SO +[MakerNotes, Motorola, Camera] 26372 - Motorola 0x6704: GU +[MakerNotes, Motorola, Camera] 26373 - Manufacture Date: 03Jun2015 +[MakerNotes, Motorola, Camera] 26374 - Motorola 0x6706: 904c2ca2 +[MakerNotes, Motorola, Camera] 26375 - Motorola 0x6707: 69 +[MakerNotes, Motorola, Camera] 26376 - Motorola 0x6708: 47264 +[MakerNotes, Motorola, Camera] 26377 - Motorola 0x6709: 17504 +[MakerNotes, Motorola, Camera] 26378 - Motorola 0x670a: 47264 +[MakerNotes, Motorola, Camera] 26380 - Motorola 0x670c: 0 +[MakerNotes, Motorola, Camera] 25888 - Motorola 0x6520: 1 +[MakerNotes, Motorola, Camera] 25889 - Motorola 0x6521: 46 diff --git a/t/Nikon.t b/t/Nikon.t new file mode 100644 index 0000000..6dc7fcf --- /dev/null +++ b/t/Nikon.t @@ -0,0 +1,123 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Nikon.t". + +BEGIN { + $| = 1; print "1..9\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Nikon; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Nikon'; +my $testnum = 1; + +# test 2: Extract information from Nikon.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Nikon.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + [ Creator => 'Phil' ], + [ ImageAdjustment => 'Yes, lots of it' ], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 4: Test writing all D70 image information +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/NikonD70.jpg'); + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->WriteInfo('t/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 5: Extract information from a D2Hs image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/NikonD2Hs.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 6: Test Nikon decryption +{ + ++$testnum; + my $data = pack('N', 0x34a290d3); + $data = Image::ExifTool::Nikon::Decrypt(\$data, 0x12345678, 0x00000123); + my $expected = 0xcae17d2f; + my $got = unpack('N', $data); + unless ($got == $expected) { + warn "\n Test $testnum (decryption) returned wrong value:\n"; + warn sprintf(" Expected 0x%x but got 0x%x\n", $expected, $got); + print 'not '; + } + print "ok $testnum\n"; +} + +# test 7: Test reading NEF image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Duplicates => 1); + my $info = $exifTool->ImageInfo('t/images/Nikon.nef'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 8: Test writing Nikon Capture information in NEF image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(IgnoreMinorErrors => 1); + $exifTool->SetNewValue('PhotoEffects' => 'Off'); + $exifTool->SetNewValue('Caption-abstract' => 'A new caption'); + $exifTool->SetNewValue('VignetteControlIntensity' => '70'); + my $testfile = "t/${testname}_${testnum}_failed.nef"; + unlink $testfile; + $exifTool->WriteInfo('t/images/Nikon.nef', $testfile); + my $info = $exifTool->ImageInfo($testfile, qw(PhotoEffects Caption-abstract VignetteControlIntensity)); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 9: Validate Nikon LensID values (internal check) +{ + ++$testnum; + my $lensIDs = $Image::ExifTool::Nikon::Composite{LensID}->{PrintConv}; + foreach (sort keys %$lensIDs) { + next if /^(([0-9A-F]{2} ){7}[0-9A-F]{2}(\.\d+)?|Notes|OTHER)$/; + warn "\n Bad LensID '$_' in test $testnum\n"; + print 'not '; + last; + } + print "ok $testnum\n"; +} + +# end diff --git a/t/Nikon_2.out b/t/Nikon_2.out new file mode 100644 index 0000000..14f69d5 --- /dev/null +++ b/t/Nikon_2.out @@ -0,0 +1,84 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Nikon.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1703 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:13-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: NIKON +[EXIF, IFD0, Camera] 272 - Camera Model Name: E775 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 300 +[EXIF, IFD0, Image] 283 - Y Resolution: 300 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: E775v1.3u +[EXIF, IFD0, Time] 306 - Modify Date: 2001:08:01 12:57:23 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/213 +[EXIF, ExifIFD, Image] 33437 - F Number: 9.4 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:08:01 12:57:23 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:08:01 12:57:23 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 3 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.4 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 8.6 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 1600 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1200 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 300 +[EXIF, IFD1, Image] 283 - Y Resolution: 300 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1426 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Nikon, Camera] 1 - Maker Note Version: 1.00 +[MakerNotes, Nikon, Image] 2 - ISO: 0 +[MakerNotes, Nikon, Camera] 3 - Color Mode: Color +[MakerNotes, Nikon, Camera] 4 - Quality: Fine +[MakerNotes, Nikon, Camera] 5 - White Balance: Auto +[MakerNotes, Nikon, Camera] 6 - Sharpness: Auto +[MakerNotes, Nikon, Camera] 7 - Focus Mode: AF-C +[MakerNotes, Nikon, Camera] 8 - Flash Setting: +[MakerNotes, Nikon, Camera] 15 - ISO Selection: Auto +[MakerNotes, Nikon, Camera] 128 - Image Adjustment: Normal +[MakerNotes, Nikon, Camera] 130 - Auxiliary Lens: Off +[MakerNotes, Nikon, Camera] 133 - Manual Focus Distance: undef +[MakerNotes, Nikon, Camera] 134 - Digital Zoom: 1 +[MakerNotes, Nikon, Camera] 0 - AF Area Mode: Single Area +[MakerNotes, Nikon, Camera] 1 - AF Point: Center +[MakerNotes, Nikon, Camera] 2 - AF Points In Focus: (none) +[MakerNotes, Nikon, Camera] 143 - Scene Mode: +[MakerNotes, Nikon, Camera] 16 - Data Dump: (Binary data 122 bytes) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0100 +[Composite, Composite, Image] Exif-Aperture - Aperture: 9.4 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/213 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 8.6 mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 14.2 diff --git a/t/Nikon_3.out b/t/Nikon_3.out new file mode 100644 index 0000000..fa59489 --- /dev/null +++ b/t/Nikon_3.out @@ -0,0 +1,100 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Nikon_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 4.6 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:44-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:44-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:44-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: NIKON +[EXIF, IFD0, Camera] 272 - Camera Model Name: E775 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 300 +[EXIF, IFD0, Image] 283 - Y Resolution: 300 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: E775v1.3u +[EXIF, IFD0, Time] 306 - Modify Date: 2001:08:01 12:57:23 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/213 +[EXIF, ExifIFD, Image] 33437 - F Number: 9.4 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:08:01 12:57:23 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:08:01 12:57:23 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 3 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.4 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 8.6 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 1600 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1200 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 300 +[EXIF, IFD1, Image] 283 - Y Resolution: 300 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1428 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Nikon, Camera] 1 - Maker Note Version: 1.00 +[MakerNotes, Nikon, Image] 2 - ISO: 0 +[MakerNotes, Nikon, Camera] 3 - Color Mode: Color +[MakerNotes, Nikon, Camera] 4 - Quality: Fine +[MakerNotes, Nikon, Camera] 5 - White Balance: Auto +[MakerNotes, Nikon, Camera] 6 - Sharpness: Auto +[MakerNotes, Nikon, Camera] 7 - Focus Mode: AF-C +[MakerNotes, Nikon, Camera] 8 - Flash Setting: +[MakerNotes, Nikon, Camera] 10 - Nikon 0x000a: 8.832 +[MakerNotes, Nikon, Camera] 15 - ISO Selection: Auto +[MakerNotes, Nikon, Camera] 128 - Image Adjustment: Yes, lots of it +[MakerNotes, Nikon, Camera] 130 - Auxiliary Lens: Off +[MakerNotes, Nikon, Camera] 133 - Manual Focus Distance: undef +[MakerNotes, Nikon, Camera] 134 - Digital Zoom: 1 +[MakerNotes, Nikon, Camera] 0 - AF Area Mode: Single Area +[MakerNotes, Nikon, Camera] 1 - AF Point: Center +[MakerNotes, Nikon, Camera] 2 - AF Points In Focus: (none) +[MakerNotes, Nikon, Camera] 143 - Scene Mode: +[MakerNotes, Nikon, Camera] 16 - Data Dump: (Binary data 122 bytes) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0100 +[PrintIM, PrintIM, Printing] 1 - Print IM 0x0001: 0x00160016 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x00000001 +[PrintIM, PrintIM, Printing] 3 - Print IM 0x0003: 0x0000005e +[PrintIM, PrintIM, Printing] 7 - Print IM 0x0007: 0x00000000 +[PrintIM, PrintIM, Printing] 8 - Print IM 0x0008: 0x00000000 +[PrintIM, PrintIM, Printing] 9 - Print IM 0x0009: 0x00000000 +[PrintIM, PrintIM, Printing] 10 - Print IM 0x000a: 0x00000000 +[PrintIM, PrintIM, Printing] 11 - Print IM 0x000b: 0x000000a6 +[PrintIM, PrintIM, Printing] 12 - Print IM 0x000c: 0x00000000 +[PrintIM, PrintIM, Printing] 13 - Print IM 0x000d: 0x00000000 +[PrintIM, PrintIM, Printing] 14 - Print IM 0x000e: 0x000000be +[PrintIM, PrintIM, Printing] 256 - Print IM 0x0100: 0x00000005 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x00000001 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-dc, Author] creator - Creator: Phil +[Composite, Composite, Image] Exif-Aperture - Aperture: 9.4 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/213 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-LightValue - Light Value: 14.2 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 8.6 mm diff --git a/t/Nikon_4.out b/t/Nikon_4.out new file mode 100644 index 0000000..9609e01 --- /dev/null +++ b/t/Nikon_4.out @@ -0,0 +1,176 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Nikon_4_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 7.0 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:44-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:44-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:44-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: NIKON CORPORATION +[EXIF, IFD0, Camera] 272 - Camera Model Name: NIKON D70 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 300 +[EXIF, IFD0, Image] 283 - Y Resolution: 300 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Ver.1.02 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:01:14 08:57:59 +[EXIF, IFD0, Camera] 318 - White Point: 0.313 0.329 +[EXIF, IFD0, Image] 319 - Primary Chromaticities: 0.64 0.33 0.21 0.71 0.15 0.06 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/60 +[EXIF, ExifIFD, Image] 33437 - F Number: 5.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 200 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2005:01:14 08:57:59 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2005:01:14 08:57:59 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 4.4 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 56.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: curve: fotogenics point and shoot +[EXIF, ExifIFD, Time] 37520 - Sub Sec Time: 20 +[EXIF, ExifIFD, Time] 37521 - Sub Sec Time Original: 20 +[EXIF, ExifIFD, Time] 37522 - Sub Sec Time Digitized: 20 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: Uncalibrated +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 3008 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 2000 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41730 - CFA Pattern: [Blue,Green][Green,Red] +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Custom +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 1 +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 84 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: None +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: High +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Hard +[EXIF, ExifIFD, Camera] 41996 - Subject Distance Range: Unknown +[EXIF, ExifIFD, Image] 42033 - Serial Number: No= 20025585 +[EXIF, ExifIFD, Image] 42240 - Gamma: 2.2 +[MakerNotes, Nikon, Camera] 1 - Maker Note Version: 2.10 +[MakerNotes, Nikon, Image] 2 - ISO: 200 +[MakerNotes, Nikon, Camera] 4 - Quality: Fine +[MakerNotes, Nikon, Camera] 5 - White Balance: Auto +[MakerNotes, Nikon, Camera] 6 - Sharpness: Med.H +[MakerNotes, Nikon, Camera] 7 - Focus Mode: AF-S +[MakerNotes, Nikon, Camera] 8 - Flash Setting: Normal +[MakerNotes, Nikon, Camera] 9 - Flash Type: Built-in,TTL +[MakerNotes, Nikon, Camera] 11 - White Balance Fine Tune: 0 +[MakerNotes, Nikon, Camera] 13 - Program Shift: 0 +[MakerNotes, Nikon, Camera] 14 - Exposure Difference: -4.9 +[MakerNotes, PreviewIFD, Image] 259 - Compression: JPEG (old-style) +[MakerNotes, PreviewIFD, Image] 282 - X Resolution: 300 +[MakerNotes, PreviewIFD, Image] 283 - Y Resolution: 300 +[MakerNotes, PreviewIFD, Image] 296 - Resolution Unit: inches +[MakerNotes, PreviewIFD, Image] 513 - Preview Image Start: 2392 +[MakerNotes, PreviewIFD, Image] 514 - Preview Image Length: 0 +[MakerNotes, PreviewIFD, Image] 531 - Y Cb Cr Positioning: Co-sited +[MakerNotes, Nikon, Camera] 18 - Flash Exposure Compensation: -5/3 +[MakerNotes, Nikon, Camera] 19 - ISO Setting: 200 +[MakerNotes, Nikon, Camera] 22 - Image Boundary: 0 0 3008 2000 +[MakerNotes, Nikon, Camera] 23 - External Flash Exposure Comp: 0 +[MakerNotes, Nikon, Camera] 24 - Flash Exposure Bracket Value: 0.0 +[MakerNotes, Nikon, Camera] 25 - Exposure Bracket Value: 0 +[MakerNotes, Nikon, Camera] 129 - Tone Comp: CS +[MakerNotes, Nikon, Camera] 131 - Lens Type: G +[MakerNotes, Nikon, Camera] 132 - Lens: 18-70mm f/3.5-4.5 +[MakerNotes, Nikon, Camera] 135 - Flash Mode: Fired, TTL Mode +[MakerNotes, Nikon, Camera] 0 - AF Area Mode: Single Area +[MakerNotes, Nikon, Camera] 1 - AF Point: Center +[MakerNotes, Nikon, Camera] 2 - AF Points In Focus: Center +[MakerNotes, Nikon, Camera] 137 - Shooting Mode: Continuous +[MakerNotes, Nikon, Camera] 139 - Lens F Stops: 5.33 +[MakerNotes, Nikon, Camera] 141 - Color Hue: Mode2 +[MakerNotes, Nikon, Camera] 144 - Light Source: Speedlight +[MakerNotes, Nikon, Camera] 0 - Shot Info Version: 0103 +[MakerNotes, Nikon, Camera] 146 - Hue Adjustment: 0 +[MakerNotes, Nikon, Camera] 149 - Noise Reduction: Off +[MakerNotes, Nikon, Camera] 0 - WB RGBG Levels: 597 256 361 256 +[MakerNotes, Nikon, Camera] 0 - Lens Data Version: 0101 +[MakerNotes, Nikon, Camera] 4 - Exit Pupil Position: 89.0 mm +[MakerNotes, Nikon, Camera] 5 - AF Aperture: 4.6 +[MakerNotes, Nikon, Camera] 8 - Focus Position: 0x21 +[MakerNotes, Nikon, Camera] 9 - Focus Distance: 0.63 m +[MakerNotes, Nikon, Camera] 10 - Focal Length: 56.6 mm +[MakerNotes, Nikon, Camera] 11 - Lens ID Number: 127 +[MakerNotes, Nikon, Camera] 12 - Lens F Stops: 5.33 +[MakerNotes, Nikon, Camera] 13 - Min Focal Length: 18.3 mm +[MakerNotes, Nikon, Camera] 14 - Max Focal Length: 71.3 mm +[MakerNotes, Nikon, Camera] 15 - Max Aperture At Min Focal: 3.6 +[MakerNotes, Nikon, Camera] 16 - Max Aperture At Max Focal: 4.5 +[MakerNotes, Nikon, Camera] 17 - MCU Version: 132 +[MakerNotes, Nikon, Camera] 18 - Effective Max Aperture: 4.5 +[MakerNotes, Nikon, Camera] 154 - Sensor Pixel Size: 7.8 x 7.8 um +[MakerNotes, Nikon, Camera] 160 - Serial Number: No= 20025585 +[MakerNotes, Nikon, Camera] 162 - Image Data Size: 2361498 +[MakerNotes, Nikon, Camera] 167 - Shutter Count: 526 +[MakerNotes, Nikon, Camera] 0 - Flash Info Version: 0100 +[MakerNotes, Nikon, Camera] 4 - Flash Source: None +[MakerNotes, Nikon, Camera] 6 - External Flash Firmware: n/a +[MakerNotes, Nikon, Camera] 8 - External Flash Flags: (none) +[MakerNotes, Nikon, Camera] 9.1 - Flash Commander Mode: Off +[MakerNotes, Nikon, Camera] 9.2 - Flash Control Mode: Off +[MakerNotes, Nikon, Camera] 10 - Flash Compensation: 0 +[MakerNotes, Nikon, Camera] 14 - Flash GN Distance: 0 +[MakerNotes, Nikon, Camera] 15 - Flash Group A Control Mode: Off +[MakerNotes, Nikon, Camera] 16 - Flash Group B Control Mode: Off +[MakerNotes, Nikon, Camera] 17 - Flash Group A Compensation: 0 +[MakerNotes, Nikon, Camera] 18 - Flash Group B Compensation: 0 +[MakerNotes, Nikon, Camera] 169 - Image Optimization: Custom +[MakerNotes, Nikon, Camera] 170 - Saturation: Enhanced +[MakerNotes, Nikon, Camera] 171 - Vari Program: +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-aux, Camera] FlashCompensation - Flash Compensation: 0 +[XMP, XMP-aux, Camera] Lens - Lens: 18-70mm f/3.5-4.5 +[XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: Y, Cb, Cr, - +[XMP, XMP-exif, Image] CompressedBitsPerPixel - Compressed Bits Per Pixel: 4 +[XMP, XMP-exif, Camera] FlashFired - Flash Fired: True +[XMP, XMP-exif, Camera] FlashFunction - Flash Function: False +[XMP, XMP-exif, Camera] FlashMode - Flash Mode: Auto +[XMP, XMP-exif, Camera] FlashRedEyeMode - Flash Red Eye Mode: False +[XMP, XMP-exif, Camera] FlashReturn - Flash Return: Return detected +[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: R03 - DCF option file (Adobe RGB) +[XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8 +[XMP, XMP-tiff, Image] Compression - Compression: JPEG (old-style) +[XMP, XMP-tiff, Image] ImageLength - Image Height: 47 +[XMP, XMP-tiff, Image] ImageWidth - Image Width: 71 +[XMP, XMP-tiff, Image] YCbCrCoefficients - Y Cb Cr Coefficients: 0.299, 0.587, 0.114 +[XMP, XMP-tiff, Image] YCbCrPositioning - Y Cb Cr Positioning: Co-sited +[XMP, XMP-tiff, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[Composite, Composite, Image] Exif-Aperture - Aperture: 5.0 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/60 +[Composite, Composite, Time] Exif-SubSecCreateDate - Create Date: 2005:01:14 08:57:59.20 +[Composite, Composite, Time] Exif-SubSecDateTimeOriginal - Date/Time Original: 2005:01:14 08:57:59.20 +[Composite, Composite, Time] Exif-SubSecModifyDate - Modify Date: 2005:01:14 08:57:59.20 +[Composite, Composite, Camera] Nikon-LensID - Lens ID: AF-S DX Zoom-Nikkor 18-70mm f/3.5-4.5G IF-ED +[Composite, Composite, Camera] Nikon-LensSpec - Lens Spec: 18-70mm f/3.5-4.5 G +[Composite, Composite, Camera] XMP-Flash - Flash: Auto, Fired, Return detected +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.410156 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.6 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 2.332031 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.5 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.020 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: 0.02 m (0.62 - 0.64 m) +[Composite, Composite, Image] Exif-FOV - Field Of View: 22.1 deg (0.25 m) +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 56.0 mm (35 mm equivalent: 84.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 31.31 m diff --git a/t/Nikon_5.out b/t/Nikon_5.out new file mode 100644 index 0000000..6348c8e --- /dev/null +++ b/t/Nikon_5.out @@ -0,0 +1,169 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: NikonD2Hs.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 3.5 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:44-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: NIKON CORPORATION +[EXIF, IFD0, Camera] 272 - Camera Model Name: NIKON D2Hs +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 300 +[EXIF, IFD0, Image] 283 - Y Resolution: 300 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Ver.1.00 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:03:18 02:55:18 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/125 +[EXIF, ExifIFD, Image] 33437 - F Number: 4.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 800 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2005:03:18 02:55:18 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2005:03:18 02:55:18 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 4 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 1.7 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 50.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Time] 37520 - Sub Sec Time: 16 +[EXIF, ExifIFD, Time] 37521 - Sub Sec Time Original: 16 +[EXIF, ExifIFD, Time] 37522 - Sub Sec Time Digitized: 16 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2464 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1632 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41730 - CFA Pattern: [Green,Blue][Red,Green] +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Manual +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 1 +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 75 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: Low gain up +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, ExifIFD, Camera] 41996 - Subject Distance Range: Unknown +[EXIF, GPS, Location] 0 - GPS Version ID: 2.2.0.0 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 300 +[EXIF, IFD1, Image] 283 - Y Resolution: 300 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 3202 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Nikon, Camera] 1 - Maker Note Version: 2.10 +[MakerNotes, Nikon, Image] 2 - ISO: 800 +[MakerNotes, Nikon, Camera] 4 - Quality: Fine +[MakerNotes, Nikon, Camera] 5 - White Balance: Preset0 +[MakerNotes, Nikon, Camera] 6 - Sharpness: Auto +[MakerNotes, Nikon, Camera] 7 - Focus Mode: AF-C +[MakerNotes, Nikon, Camera] 8 - Flash Setting: Normal +[MakerNotes, Nikon, Camera] 9 - Flash Type: +[MakerNotes, Nikon, Camera] 11 - White Balance Fine Tune: 0 +[MakerNotes, Nikon, Camera] 13 - Program Shift: 0 +[MakerNotes, Nikon, Camera] 14 - Exposure Difference: 0 +[MakerNotes, PreviewIFD, Image] 259 - Compression: JPEG (old-style) +[MakerNotes, PreviewIFD, Image] 282 - X Resolution: 300 +[MakerNotes, PreviewIFD, Image] 283 - Y Resolution: 300 +[MakerNotes, PreviewIFD, Image] 296 - Resolution Unit: inches +[MakerNotes, PreviewIFD, Image] 513 - Preview Image Start: 3230 +[MakerNotes, PreviewIFD, Image] 514 - Preview Image Length: 26 +[MakerNotes, PreviewIFD, Image] 531 - Y Cb Cr Positioning: Co-sited +[MakerNotes, Nikon, Camera] 19 - ISO Setting: 800 +[MakerNotes, Nikon, Camera] 22 - Image Boundary: 0 0 2464 1632 +[MakerNotes, Nikon, Camera] 23 - External Flash Exposure Comp: 0 +[MakerNotes, Nikon, Camera] 24 - Flash Exposure Bracket Value: 0.0 +[MakerNotes, Nikon, Camera] 25 - Exposure Bracket Value: 0 +[MakerNotes, Nikon, Camera] 28 - Exposure Tuning: 0 +[MakerNotes, Nikon, Camera] 29 - Serial Number: 3001006 +[MakerNotes, Nikon, Camera] 30 - Color Space: sRGB +[MakerNotes, Nikon, Camera] 129 - Tone Comp: Auto +[MakerNotes, Nikon, Camera] 131 - Lens Type: D +[MakerNotes, Nikon, Camera] 132 - Lens: 50mm f/1.8 +[MakerNotes, Nikon, Camera] 135 - Flash Mode: Did Not Fire +[MakerNotes, Nikon, Camera] 0 - AF Area Mode: Single Area +[MakerNotes, Nikon, Camera] 1 - AF Point: Center +[MakerNotes, Nikon, Camera] 2 - AF Points In Focus: Center +[MakerNotes, Nikon, Camera] 137 - Shooting Mode: Delay +[MakerNotes, Nikon, Camera] 139 - Lens F Stops: 7.33 +[MakerNotes, Nikon, Camera] 141 - Color Hue: Mode3 +[MakerNotes, Nikon, Camera] 144 - Light Source: Colored +[MakerNotes, Nikon, Camera] 0 - Shot Info Version: 0206 +[MakerNotes, Nikon, Camera] 146 - Hue Adjustment: 0 +[MakerNotes, Nikon, Camera] 149 - Noise Reduction: Off +[MakerNotes, Nikon, Camera] 0 - WB RGGB Levels: 562 256 256 537 +[MakerNotes, Nikon, Camera] 0 - Lens Data Version: 0201 +[MakerNotes, Nikon, Camera] 4 - Exit Pupil Position: 60.2 mm +[MakerNotes, Nikon, Camera] 5 - AF Aperture: 1.9 +[MakerNotes, Nikon, Camera] 8 - Focus Position: 0x11 +[MakerNotes, Nikon, Camera] 9 - Focus Distance: 0.71 m +[MakerNotes, Nikon, Camera] 10 - Focal Length: 50.4 mm +[MakerNotes, Nikon, Camera] 11 - Lens ID Number: 118 +[MakerNotes, Nikon, Camera] 12 - Lens F Stops: 7.33 +[MakerNotes, Nikon, Camera] 13 - Min Focal Length: 50.4 mm +[MakerNotes, Nikon, Camera] 14 - Max Focal Length: 50.4 mm +[MakerNotes, Nikon, Camera] 15 - Max Aperture At Min Focal: 1.8 +[MakerNotes, Nikon, Camera] 16 - Max Aperture At Max Focal: 1.8 +[MakerNotes, Nikon, Camera] 17 - MCU Version: 122 +[MakerNotes, Nikon, Camera] 18 - Effective Max Aperture: 1.8 +[MakerNotes, Nikon, Camera] 154 - Sensor Pixel Size: 9.4 x 9.4 um +[MakerNotes, Nikon, Camera] 162 - Image Data Size: 1369271 +[MakerNotes, Nikon, Camera] 165 - Image Count: 2 +[MakerNotes, Nikon, Camera] 166 - Deleted Image Count: 0 +[MakerNotes, Nikon, Camera] 167 - Shutter Count: 2 +[MakerNotes, Nikon, Camera] 0 - Flash Info Version: 0100 +[MakerNotes, Nikon, Camera] 4 - Flash Source: None +[MakerNotes, Nikon, Camera] 6 - External Flash Firmware: n/a +[MakerNotes, Nikon, Camera] 8 - External Flash Flags: (none) +[MakerNotes, Nikon, Camera] 9.1 - Flash Commander Mode: Off +[MakerNotes, Nikon, Camera] 9.2 - Flash Control Mode: Off +[MakerNotes, Nikon, Camera] 10 - Flash Compensation: 0 +[MakerNotes, Nikon, Camera] 14 - Flash GN Distance: 0 +[MakerNotes, Nikon, Camera] 15 - Flash Group A Control Mode: Off +[MakerNotes, Nikon, Camera] 16 - Flash Group B Control Mode: Off +[MakerNotes, Nikon, Camera] 17 - Flash Group A Compensation: 0 +[MakerNotes, Nikon, Camera] 18 - Flash Group B Compensation: 0 +[MakerNotes, Nikon, Camera] 170 - Saturation: Normal +[MakerNotes, Nikon, Camera] 177 - High ISO Noise Reduction: Normal +[MakerNotes, PreviewIFD, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[Composite, Composite, Image] Exif-Aperture - Aperture: 4.0 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/125 +[Composite, Composite, Time] Exif-SubSecCreateDate - Create Date: 2005:03:18 02:55:18.16 +[Composite, Composite, Time] Exif-SubSecDateTimeOriginal - Date/Time Original: 2005:03:18 02:55:18.16 +[Composite, Composite, Time] Exif-SubSecModifyDate - Modify Date: 2005:03:18 02:55:18.16 +[Composite, Composite, Camera] Nikon-LensID - Lens ID: AF Nikkor 50mm f/1.8D +[Composite, Composite, Camera] Nikon-LensSpec - Lens Spec: 50mm f/1.8 D +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 2.097656 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-LightValue - Light Value: 8.0 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 2.195313 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.5 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.020 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: 0.03 m (0.69 - 0.72 m) +[Composite, Composite, Image] Exif-FOV - Field Of View: 25.1 deg (0.32 m) +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 50.0 mm (35 mm equivalent: 75.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 31.20 m diff --git a/t/Nikon_7.out b/t/Nikon_7.out new file mode 100644 index 0000000..bd29b4f --- /dev/null +++ b/t/Nikon_7.out @@ -0,0 +1,261 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Nikon.nef +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 6.2 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2007:01:05 13:00:46-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:44-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: NEF +[File, File, Other] FileTypeExtension - File Type Extension: nef +[File, File, Other] MIMEType - MIME Type: image/x-nikon-nef +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 4996c61239acf3d1d9fa08228a6f6825 +[EXIF, IFD0, Image] 254 - Subfile Type: Reduced-resolution image +[EXIF, IFD0, Image] 256 - Image Width: 160 +[EXIF, IFD0, Image] 257 - Image Height: 106 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD0, Image] 259 - Compression: Uncompressed +[EXIF, IFD0, Image] 262 - Photometric Interpretation: RGB +[EXIF, IFD0, Camera] 271 - Make: NIKON CORPORATION +[EXIF, IFD0, Camera] 272 - Camera Model Name: NIKON D70 +[EXIF, IFD0, Image] 273 - Strip Offsets: 6170 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 277 - Samples Per Pixel: 3 +[EXIF, IFD0, Image] 278 - Rows Per Strip: 106 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 18 +[EXIF, IFD0, Image] 282 - X Resolution: 300 +[EXIF, IFD0, Image] 283 - Y Resolution: 300 +[EXIF, IFD0, Image] 284 - Planar Configuration: Chunky +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Nikon Capture Editor 4.3.1 W +[EXIF, IFD0, Time] 306 - Modify Date: 2005:08:25 13:09:05 +[EXIF, SubIFD, Image] 254 - Subfile Type: Reduced-resolution image +[EXIF, SubIFD, Image] 259 - Compression: JPEG (old-style) +[EXIF, SubIFD, Image] 274 - Orientation: Horizontal (normal) +[EXIF, SubIFD, Image] 282 - X Resolution: 1 +[EXIF, SubIFD, Image] 283 - Y Resolution: 0 +[EXIF, SubIFD, Image] 296 - Resolution Unit: inches +[EXIF, SubIFD, Image] 513 - Jpg From Raw Start: 1120 +[EXIF, SubIFD, Image] 514 - Jpg From Raw Length: 29 +[EXIF, SubIFD1, Image] 254 - Subfile Type: Full-resolution image +[EXIF, SubIFD1, Image] 256 - Image Width: 3040 +[EXIF, SubIFD1, Image] 257 - Image Height: 2014 +[EXIF, SubIFD1, Image] 258 - Bits Per Sample: 12 +[EXIF, SubIFD1, Image] 259 - Compression: Nikon NEF Compressed +[EXIF, SubIFD1, Image] 262 - Photometric Interpretation: Color Filter Array +[EXIF, SubIFD1, Image] 273 - Strip Offsets: 1376 +[EXIF, SubIFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, SubIFD1, Image] 277 - Samples Per Pixel: 1 +[EXIF, SubIFD1, Image] 278 - Rows Per Strip: 2014 +[EXIF, SubIFD1, Image] 279 - Strip Byte Counts: 18 +[EXIF, SubIFD1, Image] 282 - X Resolution: 300 +[EXIF, SubIFD1, Image] 283 - Y Resolution: 300 +[EXIF, SubIFD1, Image] 284 - Planar Configuration: Chunky +[EXIF, SubIFD1, Image] 296 - Resolution Unit: inches +[EXIF, SubIFD1, Image] 33421 - CFA Repeat Pattern Dim: 2 2 +[EXIF, SubIFD1, Image] 33422 - CFA Pattern 2: 2 1 1 0 +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/20 +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 200 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2004:06:09 16:02:35 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2004:06:09 16:02:35 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 18.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Time] 37520 - Sub Sec Time: 00 +[EXIF, ExifIFD, Time] 37521 - Sub Sec Time Original: 00 +[EXIF, ExifIFD, Time] 37522 - Sub Sec Time Digitized: 00 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41730 - CFA Pattern: [Blue,Green][Green,Red] +[EXIF, IFD0, Time] 36867 - Date/Time Original: 2004:06:09 16:02:35 +[EXIF, IFD0, Image] 37398 - TIFF-EP Standard ID: 1 0 0 0 +[EXIF, SubIFD, Preview] Exif-JpgFromRaw - Jpg From Raw: (Binary data 29 bytes) +[IPTC, IPTC, Other] 0 - Application Record Version: 4 +[IPTC, IPTC, Other] 120 - Caption-Abstract: A caption +[IPTC, IPTC, Other] 40 - Special Instructions: none +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ontario +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC2, Other] 0 - Application Record Version: 4 +[IPTC, IPTC2, Other] 120 - Caption-Abstract: A caption +[IPTC, IPTC2, Other] 40 - Special Instructions: none +[IPTC, IPTC2, Location] 90 - City: Kingston +[IPTC, IPTC2, Location] 95 - Province-State: Ontario +[IPTC, IPTC2, Location] 101 - Country-Primary Location Name: Canada +[MakerNotes, Nikon, Camera] 1 - Maker Note Version: 2.10 +[MakerNotes, Nikon, Image] 2 - ISO: 200 +[MakerNotes, Nikon, Camera] 4 - Quality: RAW +[MakerNotes, Nikon, Camera] 5 - White Balance: Auto +[MakerNotes, Nikon, Camera] 6 - Sharpness: None +[MakerNotes, Nikon, Camera] 7 - Focus Mode: AF-S +[MakerNotes, Nikon, Camera] 11 - White Balance Fine Tune: 0 +[MakerNotes, Nikon, Camera] 13 - Program Shift: 0 +[MakerNotes, Nikon, Camera] 14 - Exposure Difference: 0 +[MakerNotes, PreviewIFD, Image] 259 - Compression: JPEG (old-style) +[MakerNotes, PreviewIFD, Image] 282 - X Resolution: 72 +[MakerNotes, PreviewIFD, Image] 283 - Y Resolution: 72 +[MakerNotes, PreviewIFD, Image] 296 - Resolution Unit: inches +[MakerNotes, PreviewIFD, Image] 513 - Preview Image Start: 5958 +[MakerNotes, PreviewIFD, Image] 514 - Preview Image Length: 26 +[MakerNotes, Nikon, Camera] 19 - ISO Setting: 200 +[MakerNotes, Nikon, Camera] 25 - Exposure Bracket Value: 0 +[MakerNotes, Nikon, Camera] 129 - Tone Comp: CS +[MakerNotes, Nikon, Camera] 131 - Lens Type: G +[MakerNotes, Nikon, Camera] 132 - Lens: 18-70mm f/3.5-4.5 +[MakerNotes, Nikon, Camera] 135 - Flash Mode: Did Not Fire +[MakerNotes, Nikon, Camera] 0 - AF Area Mode: Single Area +[MakerNotes, Nikon, Camera] 1 - AF Point: Center +[MakerNotes, Nikon, Camera] 2 - AF Points In Focus: Center +[MakerNotes, Nikon, Camera] 137 - Shooting Mode: Single-Frame +[MakerNotes, Nikon, Camera] 139 - Lens F Stops: 5.33 +[MakerNotes, Nikon, Camera] 140 - Contrast Curve: (Binary data 17 bytes) +[MakerNotes, Nikon, Camera] 141 - Color Hue: Mode2 +[MakerNotes, Nikon, Camera] 144 - Light Source: Natural +[MakerNotes, Nikon, Camera] 146 - Hue Adjustment: 0 +[MakerNotes, Nikon, Camera] 147 - NEF Compression: Lossy (type 1) +[MakerNotes, Nikon, Camera] 149 - Noise Reduction: Off +[MakerNotes, Nikon, Camera] 150 - NEF Linearization Table: (Binary data 17 bytes) +[MakerNotes, Nikon, Camera] 0 - WB RGBG Levels: 478 265 493 265 +[MakerNotes, Nikon, Camera] 0 - Lens Data Version: 0101 +[MakerNotes, Nikon, Camera] 4 - Exit Pupil Position: 102.4 mm +[MakerNotes, Nikon, Camera] 5 - AF Aperture: 3.6 +[MakerNotes, Nikon, Camera] 8 - Focus Position: 0xf1 +[MakerNotes, Nikon, Camera] 9 - Focus Distance: 2.37 m +[MakerNotes, Nikon, Camera] 10 - Focal Length: 18.3 mm +[MakerNotes, Nikon, Camera] 11 - Lens ID Number: 127 +[MakerNotes, Nikon, Camera] 12 - Lens F Stops: 5.33 +[MakerNotes, Nikon, Camera] 13 - Min Focal Length: 18.3 mm +[MakerNotes, Nikon, Camera] 14 - Max Focal Length: 71.3 mm +[MakerNotes, Nikon, Camera] 15 - Max Aperture At Min Focal: 3.6 +[MakerNotes, Nikon, Camera] 16 - Max Aperture At Max Focal: 4.5 +[MakerNotes, Nikon, Camera] 17 - MCU Version: 132 +[MakerNotes, Nikon, Camera] 18 - Effective Max Aperture: 3.6 +[MakerNotes, Nikon, Camera] 153 - Raw Image Center: 1520 1008 +[MakerNotes, Nikon, Camera] 154 - Sensor Pixel Size: 7.8 x 7.8 um +[MakerNotes, Nikon, Camera] 160 - Serial Number: 12345678 +[MakerNotes, Nikon, Camera] 167 - Shutter Count: 3619 +[MakerNotes, Nikon, Camera] 169 - Image Optimization: Custom +[MakerNotes, Nikon, Camera] 170 - Saturation: Normal +[MakerNotes, Nikon, Camera] 171 - Vari Program: +[MakerNotes, NikonCapture, Image] 1990472192 - Unsharp Mask: Off +[MakerNotes, NikonCapture, Image] 0 - Unsharp Count: 1 +[MakerNotes, NikonCapture, Image] 19 - Unsharp 1 Color: RGB +[MakerNotes, NikonCapture, Image] 23 - Unsharp 1 Intensity: 100 +[MakerNotes, NikonCapture, Image] 25 - Unsharp 1 Halo Width: 4 +[MakerNotes, NikonCapture, Image] 27 - Unsharp 1 Threshold: 6 +[MakerNotes, NikonCapture, Image] 1990472193 - Curves: On +[MakerNotes, NikonCapture, Image] 1990472194 - Color Balance Adj: On +[MakerNotes, NikonCapture, Image] 9103454 - LCH Editor: On +[MakerNotes, NikonCapture, Image] 1990472198 - Flip Horizontal: No +[MakerNotes, NikonCapture, Image] 1990472199 - Rotation: 0 +[MakerNotes, NikonCapture, Image] 4265884229 - Image Dust Off: On +[MakerNotes, NikonCapture, Image] 30 - Crop Left: 0 +[MakerNotes, NikonCapture, Image] 38 - Crop Top: 0 +[MakerNotes, NikonCapture, Image] 46 - Crop Right: 3008 +[MakerNotes, NikonCapture, Image] 54 - Crop Bottom: 2000 +[MakerNotes, NikonCapture, Image] 142 - Crop Output Width Inches: 10.0266666666667 +[MakerNotes, NikonCapture, Image] 150 - Crop Output Height Inches: 6.66666666666667 +[MakerNotes, NikonCapture, Image] 158 - Crop Scaled Resolution: 300 +[MakerNotes, NikonCapture, Image] 174 - Crop Source Resolution: 300 +[MakerNotes, NikonCapture, Image] 182 - Crop Output Resolution: 300 +[MakerNotes, NikonCapture, Image] 190 - Crop Output Scale: 1 +[MakerNotes, NikonCapture, Image] 198 - Crop Output Width: 3008 +[MakerNotes, NikonCapture, Image] 206 - Crop Output Height: 2000 +[MakerNotes, NikonCapture, Image] 214 - Crop Output Pixels: 6016000 +[MakerNotes, NikonCapture, Image] 1990472195 - Advanced Raw: On +[MakerNotes, NikonCapture, Image] 0 - Exposure Adj: 0.3 +[MakerNotes, NikonCapture, Image] 18 - Exposure Adj 2: 0.3000 +[MakerNotes, NikonCapture, Image] 1990472196 - White Balance Adj: On +[MakerNotes, NikonCapture, Image] 0 - WB Adj Red Balance: 2.015162472363 +[MakerNotes, NikonCapture, Image] 8 - WB Adj Blue Balance: 1.6951313394899 +[MakerNotes, NikonCapture, Image] 16 - WB Adj Mode: Use Temperature +[MakerNotes, NikonCapture, Image] 20 - WB Adj Lighting: High Color Rendering Fluorescent (5000K) +[MakerNotes, NikonCapture, Image] 24 - WB Adj Temperature: 5000 +[MakerNotes, NikonCapture, Image] 1966984128 - Noise Reduction: On +[MakerNotes, NikonCapture, Image] 4 - Edge Noise Reduction: Off +[MakerNotes, NikonCapture, Image] 5 - Color Moire Reduction Mode: Off +[MakerNotes, NikonCapture, Image] 9 - Noise Reduction Intensity: 0 +[MakerNotes, NikonCapture, Image] 13 - Noise Reduction Sharpness: 5 +[MakerNotes, NikonCapture, Image] 17 - Noise Reduction Method: Faster +[MakerNotes, NikonCapture, Image] 1594785059 - Color Booster: Off +[MakerNotes, NikonCapture, Image] 0 - Color Boost Type: People +[MakerNotes, NikonCapture, Image] 1 - Color Boost Level: 10 +[MakerNotes, NikonCapture, Image] 1990472197 - Vignette Control: Off +[MakerNotes, NikonCapture, Image] 2892748224 - Vignette Control Intensity: 80 +[MakerNotes, NikonCapture, Image] 4264076367 - Auto Red Eye: On +[MakerNotes, NikonCapture, Image] 0 - Red Eye Correction: Off +[MakerNotes, NikonCapture, Image] 2875116126 - Photo Effects: On +[MakerNotes, NikonCapture, Image] 0 - Brightness Adj: 0 +[MakerNotes, NikonCapture, Image] 8 - Enhance Dark Tones: Off +[MakerNotes, NikonCapture, Image] 0 - Photo Effects Type: None +[MakerNotes, NikonCapture, Image] 4 - Photo Effects Red: 0 +[MakerNotes, NikonCapture, Image] 6 - Photo Effects Green: 0 +[MakerNotes, NikonCapture, Image] 8 - Photo Effects Blue: 0 +[MakerNotes, NikonCapture, Image] 801145905 - Straighten Angle: 0 +[MakerNotes, NikonCapture, Image] 1785607862 - D-Lighting HQ Selected: No +[MakerNotes, NikonCapture, Image] 210313803 - Color Aberration Control: Off +[MakerNotes, NikonCapture, Image] 3461698730 - D-Lighting HS: Off +[MakerNotes, NikonCapture, Image] 0 - D-Lighting HS Adjustment: 25 +[MakerNotes, NikonCapture, Image] 1 - D-Lighting HS Color Boost: 60 +[MakerNotes, NikonCapture, Image] 561376120 - D-Lighting HQ: Off +[MakerNotes, NikonCapture, Image] 0 - D-Lighting HQ Shadow: 50 +[MakerNotes, NikonCapture, Image] 1 - D-Lighting HQ Highlight: 1 +[MakerNotes, NikonCapture, Image] 2 - D-Lighting HQ Color Boost: 60 +[MakerNotes, Nikon, Camera] 1 - IFD0 Offset: 8 +[MakerNotes, Nikon, Camera] 2 - Preview IFD Offset: 11362 +[MakerNotes, Nikon, Camera] 3 - Sub IFD Offset: 1440 +[MakerNotes, NikonScan, Image] 2 - Film Type: POSITIVE +[MakerNotes, NikonScan, Image] 65 - Bit Depth: 8 +[MakerNotes, NikonScan, Image] 80 - Master Gain: 0.00 +[MakerNotes, NikonScan, Image] 81 - Color Gain: 0.00 0.00 0.00 +[MakerNotes, NikonScan, Image] 96 - Scan Image Enhancer: Off +[MakerNotes, NikonScan, Image] 256 - Digital ICE: Normal +[MakerNotes, PreviewIFD, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Nikon Corporation +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.2.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1999:12:07 18:59:22 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Apple Computer Inc. +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: none +[ICC_Profile, ICC-header, Image] 52 - Device Model: +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: Nikon Adobe RGB 4.0.0.3000 +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.60976 0.31113 0.01947 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.20525 0.62566 0.06087 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.1492 0.06322 0.74463 +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.9505 1 1.0891 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Nikon Inc. & Nikon Corporation 2001 +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-CFAPattern - CFA Pattern: [Blue,Green][Green,Red] +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/20 +[Composite, Composite, Time] Exif-SubSecCreateDate - Create Date: 2004:06:09 16:02:35.00 +[Composite, Composite, Time] Exif-SubSecDateTimeOriginal - Date/Time Original: 2004:06:09 16:02:35.00 +[Composite, Composite, Time] Exif-SubSecModifyDate - Modify Date: 2005:08:25 13:09:05.00 +[Composite, Composite, Camera] Nikon-LensID - Lens ID: AF-S DX Zoom-Nikkor 18-70mm f/3.5-4.5G IF-ED +[Composite, Composite, Camera] Nikon-LensSpec - Lens Spec: 18-70mm f/3.5-4.5 G +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.860377 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 3040x2014 +[Composite, Composite, Image] Exif-LightValue - Light Value: 6.9 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 6.1 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 1.803774 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 18.0 mm diff --git a/t/Nikon_8.out b/t/Nikon_8.out new file mode 100644 index 0000000..88c4445 --- /dev/null +++ b/t/Nikon_8.out @@ -0,0 +1,4 @@ +[IPTC, IPTC, Other] 120 - Caption-Abstract: A new caption +[IPTC, IPTC2, Other] 120 - Caption-Abstract: A new caption +[MakerNotes, NikonCapture, Image] 2892748224 - Vignette Control Intensity: 70 +[MakerNotes, NikonCapture, Image] 2875116126 - Photo Effects: Off diff --git a/t/Olympus.t b/t/Olympus.t new file mode 100644 index 0000000..aa7e96f --- /dev/null +++ b/t/Olympus.t @@ -0,0 +1,95 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Olympus.t". + +BEGIN { + $| = 1; print "1..8\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Olympus; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Olympus'; +my $testnum = 1; + +# test 2: Extract information from Olympus.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Olympus.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + [Software => 'ExifTool', Group => 'XMP'], + [Macro => 'On'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 4: Extract information from OlympusE1.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/OlympusE1.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 5: Rewrite Olympus E1 image +{ + ++$testnum; + my @writeInfo = ( + [LensSerialNumber => '012345678'], + [CoringFilter => 0], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/OlympusE1.jpg'); + print "ok $testnum\n"; +} + +# test 6: Test reading Olympus type 2 maker notes +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Olympus2.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 7: Rewrite type 2 maker notes +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->SetNewValue(FocusDistance => 100); + $exifTool->SetNewValue(Macro => 'On'); + $exifTool->WriteInfo('t/images/Olympus2.jpg', $testfile); + if (testVerbose($testname, $testnum, $testfile, 2)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 8: Extract information from Olympus.dss +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Olympus.dss'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Olympus_2.out b/t/Olympus_2.out new file mode 100644 index 0000000..1b84bc3 --- /dev/null +++ b/t/Olympus_2.out @@ -0,0 +1,81 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Olympus.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1573 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:13-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: OLYMPUS DIGITAL CAMERA +[EXIF, IFD0, Camera] 271 - Make: OLYMPUS OPTICAL CO.,LTD +[EXIF, IFD0, Camera] 272 - Camera Model Name: C2000Z +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: v951p-80 +[EXIF, IFD0, Time] 306 - Modify Date: 1999:12:06 16:38:40 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/30 +[EXIF, ExifIFD, Image] 33437 - F Number: 2.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 1999:12:06 16:38:40 +[EXIF, ExifIFD, Time] 36868 - Create Date: 1999:12:06 16:38:40 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 7.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 640 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 480 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1296 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Olympus, Camera] 512 - Special Mode: Normal, Sequence: 0, Panorama: (none) +[MakerNotes, Olympus, Camera] 513 - Quality: SQ (Low) +[MakerNotes, Olympus, Camera] 514 - Macro: Off +[MakerNotes, Olympus, Camera] 515 - Black And White Mode: Off +[MakerNotes, Olympus, Camera] 516 - Digital Zoom: 0.0 +[MakerNotes, Olympus, Camera] 517 - Focal Plane Diagonal: 7.8 mm +[MakerNotes, Olympus, Camera] 518 - Lens Distortion Params: -215 -388 -418 -185 -310 -314 +[MakerNotes, Olympus, Camera] 519 - Camera Type: C2000Z +[MakerNotes, Olympus, Image] Resolution - Resolution: 1 +[MakerNotes, Olympus, Camera] Type - Camera Type: C2000Z +[MakerNotes, Olympus, Camera] 521 - Camera ID: OLYMPUS DIGITAL CAMERA +[MakerNotes, Olympus, Camera] 3840 - Data Dump: (Binary data 186 bytes) +[Composite, Composite, Image] Exif-Aperture - Aperture: 2.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 5.5 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/30 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.005 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 49.7 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 7.0 mm (35 mm equivalent: 38.8 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 4.52 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 6.9 diff --git a/t/Olympus_3.out b/t/Olympus_3.out new file mode 100644 index 0000000..9ac8798 --- /dev/null +++ b/t/Olympus_3.out @@ -0,0 +1,83 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Olympus_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 4.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:44-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: OLYMPUS DIGITAL CAMERA +[EXIF, IFD0, Camera] 271 - Make: OLYMPUS OPTICAL CO.,LTD +[EXIF, IFD0, Camera] 272 - Camera Model Name: C2000Z +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: v951p-80 +[EXIF, IFD0, Time] 306 - Modify Date: 1999:12:06 16:38:40 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/30 +[EXIF, ExifIFD, Image] 33437 - F Number: 2.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 1999:12:06 16:38:40 +[EXIF, ExifIFD, Time] 36868 - Create Date: 1999:12:06 16:38:40 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 7.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 640 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 480 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1296 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Olympus, Camera] 512 - Special Mode: Normal, Sequence: 0, Panorama: (none) +[MakerNotes, Olympus, Camera] 513 - Quality: SQ (Low) +[MakerNotes, Olympus, Camera] 514 - Macro: On +[MakerNotes, Olympus, Camera] 515 - Black And White Mode: Off +[MakerNotes, Olympus, Camera] 516 - Digital Zoom: 0.0 +[MakerNotes, Olympus, Camera] 517 - Focal Plane Diagonal: 7.8 mm +[MakerNotes, Olympus, Camera] 518 - Lens Distortion Params: -215 -388 -418 -185 -310 -314 +[MakerNotes, Olympus, Camera] 519 - Camera Type: C2000Z +[MakerNotes, Olympus, Image] Resolution - Resolution: 1 +[MakerNotes, Olympus, Camera] Type - Camera Type: C2000Z +[MakerNotes, Olympus, Camera] 521 - Camera ID: OLYMPUS DIGITAL CAMERA +[MakerNotes, Olympus, Camera] 3840 - Data Dump: (Binary data 186 bytes) +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-tiff, Image] Software - Software: ExifTool +[Composite, Composite, Image] Exif-Aperture - Aperture: 2.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 5.5 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/30 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.005 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 49.7 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 7.0 mm (35 mm equivalent: 38.8 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 4.52 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 6.9 diff --git a/t/Olympus_4.out b/t/Olympus_4.out new file mode 100644 index 0000000..d4d78a2 --- /dev/null +++ b/t/Olympus_4.out @@ -0,0 +1,194 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: OlympusE1.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 7.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: OLYMPUS DIGITAL CAMERA +[EXIF, IFD0, Camera] 271 - Make: OLYMPUS CORPORATION +[EXIF, IFD0, Camera] 272 - Camera Model Name: E-1 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 314 +[EXIF, IFD0, Image] 283 - Y Resolution: 314 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Version 1.3 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:01:05 10:53:41 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/100 +[EXIF, ExifIFD, Image] 33437 - F Number: 4.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 400 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2005:01:05 10:53:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2005:01:05 10:53:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 20.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2560 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1920 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 0 +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: High gain up +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Hard +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 7088 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Olympus, Camera] 512 - Special Mode: Fast, Sequence: 2, Panorama: (none) +[MakerNotes, Olympus, Camera] 513 - Quality: SHQ (Fine) +[MakerNotes, Olympus, Camera] 514 - Macro: Off +[MakerNotes, Olympus, Camera] 515 - Black And White Mode: Off +[MakerNotes, Olympus, Camera] 516 - Digital Zoom: 0.0 +[MakerNotes, Olympus, Camera] 517 - Focal Plane Diagonal: 21.6 mm +[MakerNotes, Olympus, Camera] 518 - Lens Distortion Params: 0 0 0 0 0 0 +[MakerNotes, Olympus, Camera] 519 - Camera Type: E-1 +[MakerNotes, Olympus, Camera] 521 - Camera ID: OLYMPUS DIGITAL CAMERA +[MakerNotes, Olympus, Camera] 4111 - Sharpness: Hard +[MakerNotes, Olympus, Camera] 4113 - Color Matrix: 356 -34 -66 -22 308 -30 6 -126 376 +[MakerNotes, Olympus, Camera] 4114 - Black Level: 69 69 69 68 +[MakerNotes, Olympus, Camera] 4119 - Red Balance: 1.609375 +[MakerNotes, Olympus, Camera] 4120 - Blue Balance: 1.1328125 +[MakerNotes, Olympus, Camera] 4137 - Contrast: Normal +[MakerNotes, Olympus, Camera] 4138 - Sharpness Factor: 576 +[MakerNotes, Olympus, Camera] 4139 - Color Control: 96 4096 2944 4096 16 128 +[MakerNotes, Olympus, Camera] 4140 - Valid Bits: 12 0 +[MakerNotes, Olympus, Camera] 4141 - Coring Filter: 1536 +[MakerNotes, Olympus, Camera] 4142 - Olympus Image Width: 2560 +[MakerNotes, Olympus, Camera] 4143 - Olympus Image Height: 1920 +[MakerNotes, Olympus, Camera] 0 - Equipment Version: 010 +[MakerNotes, Olympus, Camera] 256 - Camera Type 2: E-1 +[MakerNotes, Olympus, Camera] 257 - Serial Number: 143008611 +[MakerNotes, Olympus, Camera] 258 - Internal Serial Number: 4001310004375102 +[MakerNotes, Olympus, Camera] 259 - Focal Plane Diagonal: 21.6 mm +[MakerNotes, Olympus, Camera] 260 - Body Firmware Version: 1.300 +[MakerNotes, Olympus, Camera] 513 - Lens Type: Olympus Zuiko Digital 14-54mm F2.8-3.5 +[MakerNotes, Olympus, Camera] 514 - Lens Serial Number: 050105886 +[MakerNotes, Olympus, Camera] 516 - Lens Firmware Version: 1.100 +[MakerNotes, Olympus, Camera] 518 - Max Aperture At Max Focal: 3.5 +[MakerNotes, Olympus, Camera] 519 - Min Focal Length: 14 +[MakerNotes, Olympus, Camera] 520 - Max Focal Length: 54 +[MakerNotes, Olympus, Camera] 522 - Max Aperture: 2.8 +[MakerNotes, Olympus, Camera] 523 - Lens Properties: 0xc043 +[MakerNotes, Olympus, Camera] 769 - Extender: None +[MakerNotes, Olympus, Camera] 770 - Extender Serial Number: +[MakerNotes, Olympus, Camera] 772 - Extender Firmware Version: 0 +[MakerNotes, Olympus, Camera] 4096 - Flash Type: None +[MakerNotes, Olympus, Camera] 4097 - Flash Model: None +[MakerNotes, Olympus, Camera] 4098 - Flash Firmware Version: 0 +[MakerNotes, Olympus, Camera] 4099 - Flash Serial Number: +[MakerNotes, Olympus, Camera] 0 - Camera Settings Version: 010 +[MakerNotes, Olympus, Camera] 256 - Preview Image Valid: Yes +[MakerNotes, Olympus, Camera] 257 - Preview Image Start: 2568 +[MakerNotes, Olympus, Camera] 258 - Preview Image Length: 26 +[MakerNotes, Olympus, Camera] 512 - Exposure Mode: Program +[MakerNotes, Olympus, Camera] 513 - AE Lock: Off +[MakerNotes, Olympus, Camera] 514 - Metering Mode: ESP +[MakerNotes, Olympus, Camera] 768 - Macro Mode: Off +[MakerNotes, Olympus, Camera] 769 - Focus Mode: Single AF +[MakerNotes, Olympus, Camera] 770 - Focus Process: AF Used +[MakerNotes, Olympus, Camera] 771 - AF Search: Ready +[MakerNotes, Olympus, Camera] 772 - AF Areas: Center (121,121)-(133,133) +[MakerNotes, Olympus, Camera] 1024 - Flash Mode: Off +[MakerNotes, Olympus, Camera] 1025 - Flash Exposure Comp: 0 +[MakerNotes, Olympus, Camera] 1280 - White Balance 2: Auto +[MakerNotes, Olympus, Camera] 1281 - White Balance Temperature: Auto +[MakerNotes, Olympus, Camera] 1282 - White Balance Bracket: 0 +[MakerNotes, Olympus, Camera] 1283 - Custom Saturation: CS2 (min CS0, max CS4) +[MakerNotes, Olympus, Camera] 1284 - Modified Saturation: Off +[MakerNotes, Olympus, Camera] 1285 - Contrast Setting: 0 (min -2, max 2) +[MakerNotes, Olympus, Camera] 1286 - Sharpness Setting: 1 (min -3, max 5) +[MakerNotes, Olympus, Camera] 1287 - Color Space: sRGB +[MakerNotes, Olympus, Camera] 1290 - Noise Reduction: (none) +[MakerNotes, Olympus, Camera] 1291 - Distortion Correction: Off +[MakerNotes, Olympus, Camera] 1292 - Shading Compensation: Off +[MakerNotes, Olympus, Camera] 1293 - Compression Factor: 2.7 +[MakerNotes, Olympus, Camera] 1536 - Drive Mode: Continuous Shooting, Shot 2 +[MakerNotes, Olympus, Camera] 1539 - Image Quality 2: SHQ +[MakerNotes, Olympus, Camera] 0 - Raw Dev Version: 010 +[MakerNotes, Olympus, Camera] 256 - Raw Dev Exposure Bias Value: 0 +[MakerNotes, Olympus, Camera] 257 - Raw Dev White Balance Value: 0 +[MakerNotes, Olympus, Camera] 258 - Raw Dev WB Fine Adjustment: 0 +[MakerNotes, Olympus, Camera] 259 - Raw Dev Gray Point: 0 0 0 +[MakerNotes, Olympus, Camera] 260 - Raw Dev Saturation Emphasis: 0 0 0 +[MakerNotes, Olympus, Camera] 261 - Raw Dev Memory Color Emphasis: 0 +[MakerNotes, Olympus, Camera] 262 - Raw Dev Contrast Value: 0 0 0 +[MakerNotes, Olympus, Camera] 263 - Raw Dev Sharpness Value: 0 0 0 +[MakerNotes, Olympus, Camera] 264 - Raw Dev Color Space: sRGB +[MakerNotes, Olympus, Camera] 265 - Raw Dev Engine: High Speed +[MakerNotes, Olympus, Camera] 266 - Raw Dev Noise Reduction: (none) +[MakerNotes, Olympus, Camera] 267 - Raw Dev Edit Status: Original +[MakerNotes, Olympus, Camera] 268 - Raw Dev Settings: (none) +[MakerNotes, Olympus, Camera] 0 - Image Processing Version: 010 +[MakerNotes, Olympus, Camera] 256 - WB RB Levels: 412 290 +[MakerNotes, Olympus, Camera] 287 - WB G Level: 256 +[MakerNotes, Olympus, Camera] 512 - Color Matrix: 356 -34 -66 -22 308 -30 6 -126 376 +[MakerNotes, Olympus, Camera] 768 - Enhancer: 576 +[MakerNotes, Olympus, Camera] 784 - Coring Filter: 1536 +[MakerNotes, Olympus, Camera] 1536 - Black Level 2: 69 69 69 68 +[MakerNotes, Olympus, Camera] 1552 - Gain Base: 256 +[MakerNotes, Olympus, Camera] 1553 - Valid Bits: 12 0 +[MakerNotes, Olympus, Camera] 1554 - Crop Left: 0 0 +[MakerNotes, Olympus, Camera] 1555 - Crop Top: 0 0 +[MakerNotes, Olympus, Camera] 1556 - Crop Width: 2560 +[MakerNotes, Olympus, Camera] 1557 - Crop Height: 1920 +[MakerNotes, Olympus, Camera] 4112 - Noise Reduction 2: (none) +[MakerNotes, Olympus, Camera] 4113 - Distortion Correction 2: Off +[MakerNotes, Olympus, Camera] 4114 - Shading Compensation 2: Off +[MakerNotes, Olympus, Camera] 0 - Focus Info Version: 010 +[MakerNotes, Olympus, Camera] 528 - Scene Detect: 0 +[MakerNotes, Olympus, Camera] 768 - Zoom Step Count: 3 +[MakerNotes, Olympus, Camera] 769 - Focus Step Count: 332 +[MakerNotes, Olympus, Camera] 773 - Focus Distance: 0.705 m +[MakerNotes, Olympus, Camera] 776 - AF Point: Center (horizontal) +[MakerNotes, Olympus, Camera] 4609 - External Flash: Off +[MakerNotes, Olympus, Camera] 4612 - External Flash Bounce: Bounce or Off +[MakerNotes, Olympus, Camera] 4613 - External Flash Zoom: 0 +[MakerNotes, Olympus, Camera] 4616 - Internal Flash: Off +[MakerNotes, Olympus, Camera] 5376 - Sensor Temperature: 20 C +[MakerNotes, Olympus, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[Composite, Composite, Image] Exif-Aperture - Aperture: 4.5 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 2.0 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/100 +[Composite, Composite, Camera] Olympus-ExtenderStatus - Extender Status: Not attached +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.132813 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.015 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: 0.17 m (0.63 - 0.80 m) +[Composite, Composite, Image] Exif-FOV - Field Of View: 47.2 deg (0.62 m) +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 20.0 mm (35 mm equivalent: 40.1 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 5.93 m +[Composite, Composite, Camera] Exif-LensID - Lens ID: Olympus Zuiko Digital 14-54mm F2.8-3.5 +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.0 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 1.609375 diff --git a/t/Olympus_5.out b/t/Olympus_5.out new file mode 100644 index 0000000..f3f7bad --- /dev/null +++ b/t/Olympus_5.out @@ -0,0 +1,266 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Olympus_5_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 7.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: OLYMPUS DIGITAL CAMERA +[EXIF, IFD0, Camera] 271 - Make: OLYMPUS CORPORATION +[EXIF, IFD0, Camera] 272 - Camera Model Name: E-1 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 314 +[EXIF, IFD0, Image] 283 - Y Resolution: 314 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Version 1.3 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:01:05 10:53:41 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/100 +[EXIF, ExifIFD, Image] 33437 - F Number: 4.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 400 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2005:01:05 10:53:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2005:01:05 10:53:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 20.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2560 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1920 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 0 +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: High gain up +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Hard +[EXIF, ExifIFD, Image] 42037 - Lens Serial Number: 012345678 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 7096 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Olympus, Camera] 512 - Special Mode: Fast, Sequence: 2, Panorama: (none) +[MakerNotes, Olympus, Camera] 513 - Quality: SHQ (Fine) +[MakerNotes, Olympus, Camera] 514 - Macro: Off +[MakerNotes, Olympus, Camera] 515 - Black And White Mode: Off +[MakerNotes, Olympus, Camera] 516 - Digital Zoom: 0.0 +[MakerNotes, Olympus, Camera] 517 - Focal Plane Diagonal: 21.6 mm +[MakerNotes, Olympus, Camera] 518 - Lens Distortion Params: 0 0 0 0 0 0 +[MakerNotes, Olympus, Camera] 519 - Camera Type: E-1 +[MakerNotes, Olympus, Camera] 521 - Camera ID: OLYMPUS DIGITAL CAMERA +[MakerNotes, Olympus, Camera] 4111 - Sharpness: Hard +[MakerNotes, Olympus, Camera] 4113 - Color Matrix: 356 -34 -66 -22 308 -30 6 -126 376 +[MakerNotes, Olympus, Camera] 4114 - Black Level: 69 69 69 68 +[MakerNotes, Olympus, Camera] 4119 - Red Balance: 1.609375 +[MakerNotes, Olympus, Camera] 4120 - Blue Balance: 1.1328125 +[MakerNotes, Olympus, Camera] 4137 - Contrast: Normal +[MakerNotes, Olympus, Camera] 4138 - Sharpness Factor: 576 +[MakerNotes, Olympus, Camera] 4139 - Color Control: 96 4096 2944 4096 16 128 +[MakerNotes, Olympus, Camera] 4140 - Valid Bits: 12 0 +[MakerNotes, Olympus, Camera] 4141 - Coring Filter: 0 +[MakerNotes, Olympus, Camera] 4142 - Olympus Image Width: 2560 +[MakerNotes, Olympus, Camera] 4143 - Olympus Image Height: 1920 +[MakerNotes, Olympus, Camera] 0 - Equipment Version: 010 +[MakerNotes, Olympus, Camera] 256 - Camera Type 2: E-1 +[MakerNotes, Olympus, Camera] 257 - Serial Number: 143008611 +[MakerNotes, Olympus, Camera] 258 - Internal Serial Number: 4001310004375102 +[MakerNotes, Olympus, Camera] 259 - Focal Plane Diagonal: 21.6 mm +[MakerNotes, Olympus, Camera] 260 - Body Firmware Version: 1.300 +[MakerNotes, Olympus, Camera] 513 - Lens Type: Olympus Zuiko Digital 14-54mm F2.8-3.5 +[MakerNotes, Olympus, Camera] 514 - Lens Serial Number: 012345678 +[MakerNotes, Olympus, Camera] 516 - Lens Firmware Version: 1.100 +[MakerNotes, Olympus, Camera] 518 - Max Aperture At Max Focal: 3.5 +[MakerNotes, Olympus, Camera] 519 - Min Focal Length: 14 +[MakerNotes, Olympus, Camera] 520 - Max Focal Length: 54 +[MakerNotes, Olympus, Camera] 522 - Max Aperture: 2.8 +[MakerNotes, Olympus, Camera] 523 - Lens Properties: 0xc043 +[MakerNotes, Olympus, Camera] 769 - Extender: None +[MakerNotes, Olympus, Camera] 770 - Extender Serial Number: +[MakerNotes, Olympus, Camera] 772 - Extender Firmware Version: 0 +[MakerNotes, Olympus, Camera] 4096 - Flash Type: None +[MakerNotes, Olympus, Camera] 4097 - Flash Model: None +[MakerNotes, Olympus, Camera] 4098 - Flash Firmware Version: 0 +[MakerNotes, Olympus, Camera] 4099 - Flash Serial Number: +[MakerNotes, Olympus, Camera] 0 - Camera Settings Version: 010 +[MakerNotes, Olympus, Camera] 256 - Preview Image Valid: Yes +[MakerNotes, Olympus, Camera] 257 - Preview Image Start: 7124 +[MakerNotes, Olympus, Camera] 258 - Preview Image Length: 26 +[MakerNotes, Olympus, Camera] 512 - Exposure Mode: Program +[MakerNotes, Olympus, Camera] 513 - AE Lock: Off +[MakerNotes, Olympus, Camera] 514 - Metering Mode: ESP +[MakerNotes, Olympus, Camera] 768 - Macro Mode: Off +[MakerNotes, Olympus, Camera] 769 - Focus Mode: Single AF +[MakerNotes, Olympus, Camera] 770 - Focus Process: AF Used +[MakerNotes, Olympus, Camera] 771 - AF Search: Ready +[MakerNotes, Olympus, Camera] 772 - AF Areas: Center (121,121)-(133,133) +[MakerNotes, Olympus, Camera] 1024 - Flash Mode: Off +[MakerNotes, Olympus, Camera] 1025 - Flash Exposure Comp: 0 +[MakerNotes, Olympus, Camera] 1026 - Olympus Camera Settings 0x0402: 0 +[MakerNotes, Olympus, Camera] 1280 - White Balance 2: Auto +[MakerNotes, Olympus, Camera] 1281 - White Balance Temperature: Auto +[MakerNotes, Olympus, Camera] 1282 - White Balance Bracket: 0 +[MakerNotes, Olympus, Camera] 1283 - Custom Saturation: CS2 (min CS0, max CS4) +[MakerNotes, Olympus, Camera] 1284 - Modified Saturation: Off +[MakerNotes, Olympus, Camera] 1285 - Contrast Setting: 0 (min -2, max 2) +[MakerNotes, Olympus, Camera] 1286 - Sharpness Setting: 1 (min -3, max 5) +[MakerNotes, Olympus, Camera] 1287 - Color Space: sRGB +[MakerNotes, Olympus, Camera] 1288 - Olympus Camera Settings 0x0508: 0 +[MakerNotes, Olympus, Camera] 1290 - Noise Reduction: (none) +[MakerNotes, Olympus, Camera] 1291 - Distortion Correction: Off +[MakerNotes, Olympus, Camera] 1292 - Shading Compensation: Off +[MakerNotes, Olympus, Camera] 1293 - Compression Factor: 2.7 +[MakerNotes, Olympus, Camera] 1294 - Olympus Camera Settings 0x050e: 1 +[MakerNotes, Olympus, Camera] 1536 - Drive Mode: Continuous Shooting, Shot 2 +[MakerNotes, Olympus, Camera] 1539 - Image Quality 2: SHQ +[MakerNotes, Olympus, Camera] 0 - Raw Dev Version: 010 +[MakerNotes, Olympus, Camera] 256 - Raw Dev Exposure Bias Value: 0 +[MakerNotes, Olympus, Camera] 257 - Raw Dev White Balance Value: 0 +[MakerNotes, Olympus, Camera] 258 - Raw Dev WB Fine Adjustment: 0 +[MakerNotes, Olympus, Camera] 259 - Raw Dev Gray Point: 0 0 0 +[MakerNotes, Olympus, Camera] 260 - Raw Dev Saturation Emphasis: 0 0 0 +[MakerNotes, Olympus, Camera] 261 - Raw Dev Memory Color Emphasis: 0 +[MakerNotes, Olympus, Camera] 262 - Raw Dev Contrast Value: 0 0 0 +[MakerNotes, Olympus, Camera] 263 - Raw Dev Sharpness Value: 0 0 0 +[MakerNotes, Olympus, Camera] 264 - Raw Dev Color Space: sRGB +[MakerNotes, Olympus, Camera] 265 - Raw Dev Engine: High Speed +[MakerNotes, Olympus, Camera] 266 - Raw Dev Noise Reduction: (none) +[MakerNotes, Olympus, Camera] 267 - Raw Dev Edit Status: Original +[MakerNotes, Olympus, Camera] 268 - Raw Dev Settings: (none) +[MakerNotes, Olympus, Camera] 0 - Image Processing Version: 010 +[MakerNotes, Olympus, Camera] 256 - WB RB Levels: 412 290 +[MakerNotes, Olympus, Camera] 287 - WB G Level: 256 +[MakerNotes, Olympus, Camera] 512 - Color Matrix: 356 -34 -66 -22 308 -30 6 -126 376 +[MakerNotes, Olympus, Camera] 768 - Enhancer: 576 +[MakerNotes, Olympus, Camera] 784 - Coring Filter: 0 +[MakerNotes, Olympus, Camera] 1536 - Black Level 2: 69 69 69 68 +[MakerNotes, Olympus, Camera] 1552 - Gain Base: 256 +[MakerNotes, Olympus, Camera] 1553 - Valid Bits: 12 0 +[MakerNotes, Olympus, Camera] 1554 - Crop Left: 0 0 +[MakerNotes, Olympus, Camera] 1555 - Crop Top: 0 0 +[MakerNotes, Olympus, Camera] 1556 - Crop Width: 2560 +[MakerNotes, Olympus, Camera] 1557 - Crop Height: 1920 +[MakerNotes, Olympus, Camera] 1559 - Olympus Image Processing 0x0617: 1 +[MakerNotes, Olympus, Camera] 2048 - Olympus Image Processing 0x0800: -0.0549249015748501 0.0199025515466928 -0.0028715955559[...] +[MakerNotes, Olympus, Camera] 2049 - Olympus Image Processing 0x0801: 8194 8208 8250 8292 8352 8393 8469 8521 8587 8668 8725 [...] +[MakerNotes, Olympus, Camera] 2050 - Olympus Image Processing 0x0802: 102.3897059 +[MakerNotes, Olympus, Camera] 4096 - Olympus Image Processing 0x1000: 1770 +[MakerNotes, Olympus, Camera] 4097 - Olympus Image Processing 0x1001: 233 +[MakerNotes, Olympus, Camera] 4098 - Olympus Image Processing 0x1002: 164 +[MakerNotes, Olympus, Camera] 4099 - Olympus Image Processing 0x1003: 1 +[MakerNotes, Olympus, Camera] 4100 - Olympus Image Processing 0x1004: 5 +[MakerNotes, Olympus, Camera] 4112 - Noise Reduction 2: (none) +[MakerNotes, Olympus, Camera] 4113 - Distortion Correction 2: Off +[MakerNotes, Olympus, Camera] 4114 - Shading Compensation 2: Off +[MakerNotes, Olympus, Camera] 0 - Focus Info Version: 010 +[MakerNotes, Olympus, Camera] 512 - Olympus Focus Info 0x0200: 1711 1646 +[MakerNotes, Olympus, Camera] 513 - Olympus Focus Info 0x0201: 1792 1825 +[MakerNotes, Olympus, Camera] 514 - Olympus Focus Info 0x0202: 1146 1210 +[MakerNotes, Olympus, Camera] 515 - Olympus Focus Info 0x0203: 1063 +[MakerNotes, Olympus, Camera] 516 - Olympus Focus Info 0x0204: 1028 1137 +[MakerNotes, Olympus, Camera] 517 - Olympus Focus Info 0x0205: 1334 +[MakerNotes, Olympus, Camera] 518 - Olympus Focus Info 0x0206: 917 +[MakerNotes, Olympus, Camera] 519 - Olympus Focus Info 0x0207: 0 +[MakerNotes, Olympus, Camera] 521 - Auto Focus: Off +[MakerNotes, Olympus, Camera] 522 - Olympus Focus Info 0x020a: 0 +[MakerNotes, Olympus, Camera] 523 - Olympus Focus Info 0x020b: 256 +[MakerNotes, Olympus, Camera] 524 - Olympus Focus Info 0x020c: -494 -538 +[MakerNotes, Olympus, Camera] 525 - Olympus Focus Info 0x020d: 0 +[MakerNotes, Olympus, Camera] 526 - Olympus Focus Info 0x020e: 0 0 0 0 0 +[MakerNotes, Olympus, Camera] 527 - Olympus Focus Info 0x020f: 0 0 0 0 0 +[MakerNotes, Olympus, Camera] 528 - Scene Detect: 0 +[MakerNotes, Olympus, Camera] 529 - Scene Area: 0 0 0 0 0 0 0 0 +[MakerNotes, Olympus, Camera] 530 - Scene Detect Data: (Binary data 1439 bytes) +[MakerNotes, Olympus, Camera] 531 - Olympus Focus Info 0x0213: 0 +[MakerNotes, Olympus, Camera] 532 - Olympus Focus Info 0x0214: 0 +[MakerNotes, Olympus, Camera] 533 - Olympus Focus Info 0x0215: 27641 +[MakerNotes, Olympus, Camera] 768 - Zoom Step Count: 3 +[MakerNotes, Olympus, Camera] 769 - Focus Step Count: 332 +[MakerNotes, Olympus, Camera] 770 - Olympus Focus Info 0x0302: 0 +[MakerNotes, Olympus, Camera] 773 - Focus Distance: 0.705 m +[MakerNotes, Olympus, Camera] 775 - Olympus Focus Info 0x0307: 0 +[MakerNotes, Olympus, Camera] 776 - AF Point: Center (horizontal) +[MakerNotes, Olympus, Camera] 777 - Olympus Focus Info 0x0309: 0 +[MakerNotes, Olympus, Camera] 778 - Olympus Focus Info 0x030a: -62 +[MakerNotes, Olympus, Camera] 779 - Olympus Focus Info 0x030b: 57 +[MakerNotes, Olympus, Camera] 780 - Olympus Focus Info 0x030c: 1 674 +[MakerNotes, Olympus, Camera] 781 - Olympus Focus Info 0x030d: 1747 2847 4883 16470 +[MakerNotes, Olympus, Camera] 782 - Olympus Focus Info 0x030e: 0 +[MakerNotes, Olympus, Camera] 783 - Olympus Focus Info 0x030f: 288 +[MakerNotes, Olympus, Camera] 792 - Olympus Focus Info 0x0318: 3 +[MakerNotes, Olympus, Camera] 793 - Olympus Focus Info 0x0319: 4 +[MakerNotes, Olympus, Camera] 794 - Olympus Focus Info 0x031a: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Olympus, Camera] 795 - Olympus Focus Info 0x031b: 0 +[MakerNotes, Olympus, Camera] 1026 - Olympus Focus Info 0x0402: 0 +[MakerNotes, Olympus, Camera] 4608 - Olympus Focus Info 0x1200: 0 +[MakerNotes, Olympus, Camera] 4609 - External Flash: Off +[MakerNotes, Olympus, Camera] 4610 - Olympus Focus Info 0x1202: 0 +[MakerNotes, Olympus, Camera] 4611 - External Flash Guide Number: 0 +[MakerNotes, Olympus, Camera] 4612 - External Flash Bounce: Bounce or Off +[MakerNotes, Olympus, Camera] 4613 - External Flash Zoom: 0 +[MakerNotes, Olympus, Camera] 4614 - Olympus Focus Info 0x1206: 0 +[MakerNotes, Olympus, Camera] 4615 - Olympus Focus Info 0x1207: 0 +[MakerNotes, Olympus, Camera] 4616 - Internal Flash: Off +[MakerNotes, Olympus, Camera] 5376 - Sensor Temperature: 20 C +[MakerNotes, Olympus, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[PrintIM, PrintIM, Printing] 1 - Print IM 0x0001: 0x00140014 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x00000001 +[PrintIM, PrintIM, Printing] 3 - Print IM 0x0003: 0x00000088 +[PrintIM, PrintIM, Printing] 7 - Print IM 0x0007: 0x00000000 +[PrintIM, PrintIM, Printing] 8 - Print IM 0x0008: 0x00000000 +[PrintIM, PrintIM, Printing] 9 - Print IM 0x0009: 0x00000000 +[PrintIM, PrintIM, Printing] 10 - Print IM 0x000a: 0x00000000 +[PrintIM, PrintIM, Printing] 11 - Print IM 0x000b: 0x000000d0 +[PrintIM, PrintIM, Printing] 12 - Print IM 0x000c: 0x00000000 +[PrintIM, PrintIM, Printing] 13 - Print IM 0x000d: 0x00000000 +[PrintIM, PrintIM, Printing] 14 - Print IM 0x000e: 0x000000e8 +[PrintIM, PrintIM, Printing] 256 - Print IM 0x0100: 0x00000001 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x000000ff +[PrintIM, PrintIM, Printing] 258 - Print IM 0x0102: 0x00000083 +[PrintIM, PrintIM, Printing] 259 - Print IM 0x0103: 0x00000083 +[PrintIM, PrintIM, Printing] 260 - Print IM 0x0104: 0x00000083 +[PrintIM, PrintIM, Printing] 261 - Print IM 0x0105: 0x00000083 +[PrintIM, PrintIM, Printing] 262 - Print IM 0x0106: 0x00000083 +[PrintIM, PrintIM, Printing] 263 - Print IM 0x0107: 0x00808080 +[PrintIM, PrintIM, Printing] 272 - Print IM 0x0110: 0x00000082 +[Composite, Composite, Image] Exif-Aperture - Aperture: 4.5 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/100 +[Composite, Composite, Camera] Olympus-ExtenderStatus - Extender Status: Not attached +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.132813 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Olympus Zuiko Digital 14-54mm F2.8-3.5 +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.0 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 1.609375 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 2.0 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.015 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: 0.17 m (0.63 - 0.80 m) +[Composite, Composite, Image] Exif-FOV - Field Of View: 47.2 deg (0.62 m) +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 20.0 mm (35 mm equivalent: 40.1 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 5.93 m diff --git a/t/Olympus_6.out b/t/Olympus_6.out new file mode 100644 index 0000000..1a0a2f0 --- /dev/null +++ b/t/Olympus_6.out @@ -0,0 +1,153 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Olympus2.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 7.7 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2007:02:27 20:01:26-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: OLYMPUS DIGITAL CAMERA +[EXIF, IFD0, Camera] 271 - Make: OLYMPUS IMAGING CORP. +[EXIF, IFD0, Camera] 272 - Camera Model Name: u760,S760 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 314 +[EXIF, IFD0, Image] 283 - Y Resolution: 314 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Version 1.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2007:02:16 15:09:13 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/250 +[EXIF, ExifIFD, Image] 33437 - F Number: 16.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 80 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2007:02:16 15:09:13 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2007:02:16 15:09:13 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: -0.7 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.4 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 19.5 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 3072 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 2304 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 1 +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: None +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 7424 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Olympus, Camera] 512 - Special Mode: Normal, Sequence: 0, Panorama: (none) +[MakerNotes, Olympus, Camera] 513 - Quality: SHQ (Fine) +[MakerNotes, Olympus, Camera] 514 - Macro: Off +[MakerNotes, Olympus, Camera] 515 - Black And White Mode: Off +[MakerNotes, Olympus, Camera] 516 - Digital Zoom: 1.0 +[MakerNotes, Olympus, Camera] 517 - Focal Plane Diagonal: 7.58 mm +[MakerNotes, Olympus, Camera] 518 - Lens Distortion Params: 0 0 0 0 0 0 +[MakerNotes, Olympus, Camera] 519 - Camera Type: u760,S760 +[MakerNotes, Olympus, Camera] 521 - Camera ID: OLYMPUS DIGITAL CAMERA +[MakerNotes, Olympus, Camera] 0 - Equipment Version: 0100 +[MakerNotes, Olympus, Camera] 256 - Camera Type 2: u760,S760 +[MakerNotes, Olympus, Camera] 257 - Serial Number: C90500055 +[MakerNotes, Olympus, Camera] 258 - Internal Serial Number: 0171612001128001 +[MakerNotes, Olympus, Camera] 259 - Focal Plane Diagonal: 7.58 mm +[MakerNotes, Olympus, Camera] 260 - Body Firmware Version: 1.001 +[MakerNotes, Olympus, Camera] 0 - Camera Settings Version: 0100 +[MakerNotes, Olympus, Camera] 256 - Preview Image Valid: No +[MakerNotes, Olympus, Camera] 257 - Preview Image Start: 4294966614 +[MakerNotes, Olympus, Camera] 258 - Preview Image Length: 0 +[MakerNotes, Olympus, Camera] 512 - Exposure Mode: Program +[MakerNotes, Olympus, Camera] 513 - AE Lock: Off +[MakerNotes, Olympus, Camera] 514 - Metering Mode: ESP +[MakerNotes, Olympus, Camera] 768 - Macro Mode: Off +[MakerNotes, Olympus, Camera] 769 - Focus Mode: Single AF +[MakerNotes, Olympus, Camera] 770 - Focus Process: AF Not Used +[MakerNotes, Olympus, Camera] 771 - AF Search: Not Ready +[MakerNotes, Olympus, Camera] 772 - AF Areas: none +[MakerNotes, Olympus, Camera] 1024 - Flash Mode: Off +[MakerNotes, Olympus, Camera] 1025 - Flash Exposure Comp: 0 +[MakerNotes, Olympus, Camera] 1280 - White Balance 2: Auto +[MakerNotes, Olympus, Camera] 1281 - White Balance Temperature: Auto +[MakerNotes, Olympus, Camera] 1282 - White Balance Bracket: 0 0 +[MakerNotes, Olympus, Camera] 1283 - Custom Saturation: 0 (min -2, max 2) +[MakerNotes, Olympus, Camera] 1284 - Modified Saturation: Off +[MakerNotes, Olympus, Camera] 1285 - Contrast Setting: 0 (min -2, max 2) +[MakerNotes, Olympus, Camera] 1286 - Sharpness Setting: 0 (min -2, max 2) +[MakerNotes, Olympus, Camera] 1287 - Color Space: sRGB +[MakerNotes, Olympus, Camera] 1289 - Scene Mode: Standard +[MakerNotes, Olympus, Camera] 1290 - Noise Reduction: (none) +[MakerNotes, Olympus, Camera] 1291 - Distortion Correction: Off +[MakerNotes, Olympus, Camera] 1292 - Shading Compensation: Off +[MakerNotes, Olympus, Camera] 1293 - Compression Factor: 4 +[MakerNotes, Olympus, Camera] 1295 - Gradation: Normal +[MakerNotes, Olympus, Camera] 1536 - Drive Mode: Single Shot +[MakerNotes, Olympus, Camera] 1537 - Panorama Mode: Off +[MakerNotes, Olympus, Camera] 1539 - Image Quality 2: SHQ +[MakerNotes, Olympus, Camera] 2304 - Manometer Pressure: 0 kPa +[MakerNotes, Olympus, Camera] 2305 - Manometer Reading: 0 m, 0 ft +[MakerNotes, Olympus, Camera] 0 - Raw Dev Version: 0100 +[MakerNotes, Olympus, Camera] 267 - Raw Dev Edit Status: Original +[MakerNotes, Olympus, Camera] 0 - Image Processing Version: 0111 +[MakerNotes, Olympus, Camera] 256 - WB RB Levels: 536 390 +[MakerNotes, Olympus, Camera] 287 - WB G Level: 0 +[MakerNotes, Olympus, Camera] 512 - Color Matrix: 348 -54 -42 -56 422 -114 -2 -132 388 +[MakerNotes, Olympus, Camera] 768 - Enhancer: 38 +[MakerNotes, Olympus, Camera] 784 - Coring Filter: 15 +[MakerNotes, Olympus, Camera] 1536 - Black Level 2: 63 63 63 63 +[MakerNotes, Olympus, Camera] 4112 - Noise Reduction 2: (none) +[MakerNotes, Olympus, Camera] 4113 - Distortion Correction 2: Off +[MakerNotes, Olympus, Camera] 4114 - Shading Compensation 2: On +[MakerNotes, Olympus, Camera] 0 - Focus Info Version: 0100 +[MakerNotes, Olympus, Camera] 528 - Scene Detect: 0 +[MakerNotes, Olympus, Camera] 768 - Zoom Step Count: 13 +[MakerNotes, Olympus, Camera] 769 - Focus Step Count: 321 +[MakerNotes, Olympus, Camera] 771 - Focus Step Infinity: 320 +[MakerNotes, Olympus, Camera] 772 - Focus Step Near: 375 +[MakerNotes, Olympus, Camera] 773 - Focus Distance: 385.8 m +[MakerNotes, Olympus, Camera] 776 - AF Point: Left (or n/a) +[MakerNotes, Olympus, Camera] 4609 - External Flash: Off +[MakerNotes, Olympus, Camera] 4612 - External Flash Bounce: Bounce or Off +[MakerNotes, Olympus, Camera] 4613 - External Flash Zoom: 0 +[MakerNotes, Olympus, Camera] 4616 - Internal Flash: Off +[MakerNotes, Olympus, Camera] 5632 - Image Stabilization: On, Mode 2 +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0300 +[Composite, Composite, Image] Exif-Aperture - Aperture: 16.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/250 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.523438 +[Composite, Composite, Image] Exif-LightValue - Light Value: 16.3 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 2.09375 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 5.7 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.005 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: inf (4.46 m - inf) +[Composite, Composite, Image] Exif-FOV - Field Of View: 18.4 deg (124.77 m) +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 19.5 mm (35 mm equivalent: 111.3 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 4.51 m diff --git a/t/Olympus_7.out b/t/Olympus_7.out new file mode 100644 index 0000000..55d794a --- /dev/null +++ b/t/Olympus_7.out @@ -0,0 +1,484 @@ + ExifToolVersion = 11.70 + FileName = Olympus_7_failed.jpg + Directory = t + FileSize = 7335 + FileModifyDate = 1570452448 + FileAccessDate = 1570452448 + FileInodeChangeDate = 1570452448 + FilePermissions = 33188 + FileType = JPEG + FileTypeExtension = JPG + MIMEType = image/jpeg +JPEG APP1 (7080 bytes): + ExifByteOrder = II + + [IFD0 directory with 12 entries] + | 0) ImageDescription = OLYMPUS DIGITAL CAMERA + | - Tag 0x010e (32 bytes, string[32]) + | 1) Make = OLYMPUS IMAGING CORP. + | - Tag 0x010f (24 bytes, string[24]) + | 2) Model = u760,S760 + | - Tag 0x0110 (17 bytes, string[17]) + | 3) Orientation = 1 + | - Tag 0x0112 (2 bytes, int16u[1]) + | 4) XResolution = 314 (314/1) + | - Tag 0x011a (8 bytes, rational64u[1]) + | 5) YResolution = 314 (314/1) + | - Tag 0x011b (8 bytes, rational64u[1]) + | 6) ResolutionUnit = 2 + | - Tag 0x0128 (2 bytes, int16u[1]) + | 7) Software = Version 1.0 + | - Tag 0x0131 (32 bytes, string[32]) + | 8) ModifyDate = 2007:02:16 15:09:13 + | - Tag 0x0132 (20 bytes, string[20]) + | 9) YCbCrPositioning = 2 + | - Tag 0x0213 (2 bytes, int16u[1]) + | 10) ExifOffset (SubDirectory) --> + | - Tag 0x8769 (4 bytes, int32u[1]) + | + [ExifIFD directory with 31 entries] + | | 0) ExposureTime = 0.004 (1/250) + | | - Tag 0x829a (8 bytes, rational64u[1]) + | | 1) FNumber = 16 (160/10) + | | - Tag 0x829d (8 bytes, rational64u[1]) + | | 2) ExposureProgram = 2 + | | - Tag 0x8822 (2 bytes, int16u[1]) + | | 3) ISO = 80 + | | - Tag 0x8827 (2 bytes, int16u[1]) + | | 4) ExifVersion = 0221 + | | - Tag 0x9000 (4 bytes, undef[4]) + | | 5) DateTimeOriginal = 2007:02:16 15:09:13 + | | - Tag 0x9003 (20 bytes, string[20]) + | | 6) CreateDate = 2007:02:16 15:09:13 + | | - Tag 0x9004 (20 bytes, string[20]) + | | 7) ComponentsConfiguration = 1 2 3 0 + | | - Tag 0x9101 (4 bytes, undef[4] read as int8u[4]) + | | 8) ExposureCompensation = -0.7 (-7/10) + | | - Tag 0x9204 (8 bytes, rational64s[1]) + | | 9) MaxApertureValue = 3.53 (353/100) + | | - Tag 0x9205 (8 bytes, rational64u[1]) + | | 10) MeteringMode = 5 + | | - Tag 0x9207 (2 bytes, int16u[1]) + | | 11) LightSource = 0 + | | - Tag 0x9208 (2 bytes, int16u[1]) + | | 12) Flash = 16 + | | - Tag 0x9209 (2 bytes, int16u[1]) + | | 13) FocalLength = 19.5 (1950/100) + | | - Tag 0x920a (8 bytes, rational64u[1]) + | | 14) MakerNoteOlympus2 (SubDirectory) --> + | | - Tag 0x927c (5502 bytes, undef[5502]) + | | + [MakerNoteOlympus2 directory with 14 entries] + | | | 0) SpecialMode = 0 0 0 + | | | - Tag 0x0200 (12 bytes, int32u[3]) + | | | 1) Quality = 3 + | | | - Tag 0x0201 (2 bytes, int16u[1]) + | | | 2) Macro = 1 + | | | - Tag 0x0202 (2 bytes, int16u[1]) + | | | 3) BWMode = 0 + | | | - Tag 0x0203 (2 bytes, int16u[1]) + | | | 4) DigitalZoom = 1 (100/100) + | | | - Tag 0x0204 (8 bytes, rational64u[1]) + | | | 5) FocalPlaneDiagonal = 7.58 (758/100) + | | | - Tag 0x0205 (8 bytes, rational64u[1]) + | | | 6) LensDistortionParams = 0 0 0 0 0 0 + | | | - Tag 0x0206 (12 bytes, int16s[6]) + | | | 7) CameraType = D4328 + | | | - Tag 0x0207 (6 bytes, string[6]) + | | | 8) CameraID = OLYMPUS DIGITAL CAMERA + | | | - Tag 0x0209 (32 bytes, undef[32] read as string[32]) + | | | 9) EquipmentIFD (SubDirectory) --> + | | | - Tag 0x2010 (4 bytes, ifd[1]) + | | | + [MakerNotes directory with 6 entries] + | | | | 0) EquipmentVersion = 0100 + | | | | - Tag 0x0000 (4 bytes, undef[4]) + | | | | 1) CameraType2 = D4328 + | | | | - Tag 0x0100 (6 bytes, string[6]) + | | | | 2) SerialNumber = C90500055 + | | | | - Tag 0x0101 (32 bytes, string[32]) + | | | | 3) InternalSerialNumber = 0171612001128001 + | | | | - Tag 0x0102 (32 bytes, string[32]) + | | | | 4) FocalPlaneDiagonal = 7.58 (758/100) + | | | | - Tag 0x0103 (8 bytes, rational64u[1]) + | | | | 5) BodyFirmwareVersion = 4097 + | | | | - Tag 0x0104 (4 bytes, int32u[1]) + | | | 10) CameraSettingsIFD (SubDirectory) --> + | | | - Tag 0x2020 (4 bytes, ifd[1]) + | | | + [MakerNotes directory with 36 entries] + | | | | 0) CameraSettingsVersion = 0100 + | | | | - Tag 0x0000 (4 bytes, undef[4]) + | | | | 1) PreviewImageValid = 0 + | | | | - Tag 0x0100 (4 bytes, int32u[1]) + | | | | 2) PreviewImageStart = 6037 + | | | | - Tag 0x0101 (4 bytes, int32u[1]) + | | | | 3) PreviewImageLength = 0 + | | | | - Tag 0x0102 (4 bytes, int32u[1]) + | | | | 4) ExposureMode = 2 + | | | | - Tag 0x0200 (2 bytes, int16u[1]) + | | | | 5) AELock = 0 + | | | | - Tag 0x0201 (2 bytes, int16u[1]) + | | | | 6) MeteringMode = 5 + | | | | - Tag 0x0202 (2 bytes, int16u[1]) + | | | | 7) MacroMode = 0 + | | | | - Tag 0x0300 (2 bytes, int16u[1]) + | | | | 8) FocusMode = 0 + | | | | - Tag 0x0301 (2 bytes, int16u[1]) + | | | | 9) FocusProcess = 0 + | | | | - Tag 0x0302 (2 bytes, int16u[1]) + | | | | 10) AFSearch = 0 + | | | | - Tag 0x0303 (2 bytes, int16u[1]) + | | | | 11) AFAreas = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0[snip] + | | | | - Tag 0x0304 (256 bytes, int32u[64]) + | | | | 12) FlashMode = 0 + | | | | - Tag 0x0400 (2 bytes, int16u[1]) + | | | | 13) FlashExposureComp = 0 (0/1) + | | | | - Tag 0x0401 (8 bytes, rational64s[1]) + | | | | 14) Olympus_CameraSettings_0x0402 = 0 + | | | | - Tag 0x0402 (2 bytes, int16u[1]) + | | | | 15) WhiteBalance2 = 0 + | | | | - Tag 0x0500 (2 bytes, int16u[1]) + | | | | 16) WhiteBalanceTemperature = 0 + | | | | - Tag 0x0501 (2 bytes, int16u[1]) + | | | | 17) WhiteBalanceBracket = 0 0 + | | | | - Tag 0x0502 (4 bytes, int16s[2]) + | | | | 18) CustomSaturation = 0 -2 2 + | | | | - Tag 0x0503 (6 bytes, int16s[3]) + | | | | 19) ModifiedSaturation = 0 + | | | | - Tag 0x0504 (2 bytes, int16u[1]) + | | | | 20) ContrastSetting = 0 -2 2 + | | | | - Tag 0x0505 (6 bytes, int16s[3]) + | | | | 21) SharpnessSetting = 0 -2 2 + | | | | - Tag 0x0506 (6 bytes, int16s[3]) + | | | | 22) ColorSpace = 0 + | | | | - Tag 0x0507 (2 bytes, int16u[1]) + | | | | 23) SceneMode = 0 + | | | | - Tag 0x0509 (2 bytes, int16u[1]) + | | | | 24) NoiseReduction = 0 + | | | | - Tag 0x050a (2 bytes, int16u[1]) + | | | | 25) DistortionCorrection = 0 + | | | | - Tag 0x050b (2 bytes, int16u[1]) + | | | | 26) ShadingCompensation = 0 + | | | | - Tag 0x050c (2 bytes, int16u[1]) + | | | | 27) CompressionFactor = 4 (4/1) + | | | | - Tag 0x050d (8 bytes, rational64u[1]) + | | | | 28) Olympus_CameraSettings_0x050e = 0 + | | | | - Tag 0x050e (2 bytes, int16u[1]) + | | | | 29) Gradation = 0 -1 1 + | | | | - Tag 0x050f (6 bytes, int16s[3]) + | | | | 30) DriveMode = 0 0 0 + | | | | - Tag 0x0600 (6 bytes, int16u[3]) + | | | | 31) PanoramaMode = 0 0 + | | | | - Tag 0x0601 (4 bytes, int16u[2]) + | | | | 32) ImageQuality2 = 3 + | | | | - Tag 0x0603 (2 bytes, int16u[1]) + | | | | 33) Olympus_CameraSettings_0x0800 = 1 + | | | | - Tag 0x0800 (2 bytes, int16u[1]) + | | | | 34) ManometerPressure = 0 + | | | | - Tag 0x0900 (2 bytes, int16u[1]) + | | | | 35) ManometerReading = 0 0 + | | | | - Tag 0x0901 (8 bytes, int32s[2]) + | | | 11) RawDevelopmentIFD (SubDirectory) --> + | | | - Tag 0x2030 (4 bytes, ifd[1]) + | | | + [MakerNotes directory with 2 entries] + | | | | 0) RawDevVersion = 0100 + | | | | - Tag 0x0000 (4 bytes, undef[4]) + | | | | 1) RawDevEditStatus = 0 + | | | | - Tag 0x010b (2 bytes, int16u[1]) + | | | 12) ImageProcessingIFD (SubDirectory) --> + | | | - Tag 0x2040 (4 bytes, ifd[1]) + | | | + [MakerNotes directory with 24 entries] + | | | | 0) ImageProcessingVersion = 0111 + | | | | - Tag 0x0000 (4 bytes, undef[4]) + | | | | 1) WB_RBLevels = 536 390 + | | | | - Tag 0x0100 (4 bytes, int16u[2]) + | | | | 2) WB_GLevel = 0 + | | | | - Tag 0x011f (2 bytes, int16u[1]) + | | | | 3) ColorMatrix = 348 -54 -42 -56 422 -114 -2 -132 388 + | | | | - Tag 0x0200 (18 bytes, int16u[9] read as int16s[9]) + | | | | 4) Enhancer = 38 + | | | | - Tag 0x0300 (2 bytes, int16u[1]) + | | | | 5) CoringFilter = 15 + | | | | - Tag 0x0310 (2 bytes, int16u[1]) + | | | | 6) BlackLevel2 = 63 63 63 63 + | | | | - Tag 0x0600 (8 bytes, int16u[4]) + | | | | 7) Olympus_ImageProcessing_0x0800 = -0.00417476473376155 -0.0002546840696595[snip] + | | | | - Tag 0x0800 (36 bytes, float[9]) + | | | | 8) Olympus_ImageProcessing_0x0801 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + | | | | - Tag 0x0801 (32 bytes, int16u[16]) + | | | | 9) Olympus_ImageProcessing_0x0802 = undef (0/0) + | | | | - Tag 0x0802 (8 bytes, rational64u[1]) + | | | | 10) Olympus_ImageProcessing_0x1000 = 0 0 + | | | | - Tag 0x1000 (4 bytes, int16u[2]) + | | | | 11) Olympus_ImageProcessing_0x1001 = 0 0 + | | | | - Tag 0x1001 (4 bytes, int16u[2]) + | | | | 12) Olympus_ImageProcessing_0x1002 = 0 0 + | | | | - Tag 0x1002 (4 bytes, int16u[2]) + | | | | 13) Olympus_ImageProcessing_0x1003 = 8 + | | | | - Tag 0x1003 (2 bytes, int16u[1]) + | | | | 14) Olympus_ImageProcessing_0x1004 = 1809 + | | | | - Tag 0x1004 (2 bytes, int16u[1]) + | | | | 15) Olympus_ImageProcessing_0x1005 = 7 7 + | | | | - Tag 0x1005 (4 bytes, int16u[2]) + | | | | 16) Olympus_ImageProcessing_0x1006 = 101 197 101 197 101 196 102 196 + | | | | - Tag 0x1006 (16 bytes, int16u[8]) + | | | | 17) Olympus_ImageProcessing_0x1007 = 909 3 0 0 0 + | | | | - Tag 0x1007 (10 bytes, int16u[5]) + | | | | 18) Olympus_ImageProcessing_0x1008 = 1 + | | | | - Tag 0x1008 (2 bytes, int16u[1]) + | | | | 19) Olympus_ImageProcessing_0x1009 = 0 0 0 + | | | | - Tag 0x1009 (6 bytes, int16u[3]) + | | | | 20) Olympus_ImageProcessing_0x100a = 0 0 439 + | | | | - Tag 0x100a (6 bytes, int16u[3]) + | | | | 21) NoiseReduction2 = 0 + | | | | - Tag 0x1010 (2 bytes, int16u[1]) + | | | | 22) DistortionCorrection2 = 0 + | | | | - Tag 0x1011 (2 bytes, int16u[1]) + | | | | 23) ShadingCompensation2 = 1 + | | | | - Tag 0x1012 (2 bytes, int16u[1]) + | | | 13) FocusInfoIFD (SubDirectory) --> + | | | - Tag 0x2050 (4 bytes, ifd[1]) + | | | + [MakerNotes directory with 54 entries] + | | | | 0) FocusInfoVersion = 0100 + | | | | - Tag 0x0000 (4 bytes, undef[4]) + | | | | 1) Olympus_FocusInfo_0x0200 = 2041 0 + | | | | - Tag 0x0200 (4 bytes, int16s[2]) + | | | | 2) Olympus_FocusInfo_0x0201 = 1109 0 + | | | | - Tag 0x0201 (4 bytes, int16s[2]) + | | | | 3) Olympus_FocusInfo_0x0202 = 2065 0 + | | | | - Tag 0x0202 (4 bytes, int16s[2]) + | | | | 4) Olympus_FocusInfo_0x0203 = 2826 + | | | | - Tag 0x0203 (2 bytes, int16s[1]) + | | | | 5) Olympus_FocusInfo_0x0204 = 3086 3072 2897 2928 2957 2987 3011 3034 3051 3[snip] + | | | | - Tag 0x0204 (166 bytes, int16s[83]) + | | | | 6) AutoFocus = 255 + | | | | - Tag 0x0209 (2 bytes, int16u[1]) + | | | | 7) Olympus_FocusInfo_0x020a = 0 + | | | | - Tag 0x020a (2 bytes, int16u[1]) + | | | | 8) Olympus_FocusInfo_0x020b = 0 + | | | | - Tag 0x020b (2 bytes, int16u[1]) + | | | | 9) Olympus_FocusInfo_0x020d = 0 + | | | | - Tag 0x020d (4 bytes, int32u[1]) + | | | | 10) Olympus_FocusInfo_0x020e = 0 0 0 0 0 + | | | | - Tag 0x020e (20 bytes, int32u[5]) + | | | | 11) Olympus_FocusInfo_0x020f = 0 0 0 0 0 + | | | | - Tag 0x020f (20 bytes, int32u[5]) + | | | | 12) SceneDetect = 0 + | | | | - Tag 0x0210 (2 bytes, int16u[1]) + | | | | 13) SceneArea = 0 0 0 0 0 0 0 0 + | | | | - Tag 0x0211 (32 bytes, int32u[8]) + | | | | 14) SceneDetectData = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0[snip] + | | | | - Tag 0x0212 (2880 bytes, int32u[720]) + | | | | 15) Olympus_FocusInfo_0x0213 = 0 + | | | | - Tag 0x0213 (2 bytes, int16u[1]) + | | | | 16) Olympus_FocusInfo_0x0214 = 0 + | | | | - Tag 0x0214 (2 bytes, int16u[1]) + | | | | 17) Olympus_FocusInfo_0x0216 = 3951 + | | | | - Tag 0x0216 (4 bytes, int32u[1]) + | | | | 18) Olympus_FocusInfo_0x0217 = 288 + | | | | - Tag 0x0217 (2 bytes, int16u[1]) + | | | | 19) Olympus_FocusInfo_0x0218 = 167 + | | | | - Tag 0x0218 (2 bytes, int16u[1]) + | | | | 20) ZoomStepCount = 13 + | | | | - Tag 0x0300 (2 bytes, int16u[1]) + | | | | 21) FocusStepCount = 321 + | | | | - Tag 0x0301 (2 bytes, int16u[1]) + | | | | 22) Olympus_FocusInfo_0x0302 = 0 + | | | | - Tag 0x0302 (2 bytes, int16u[1]) + | | | | 23) FocusStepInfinity = 320 + | | | | - Tag 0x0303 (2 bytes, int16u[1]) + | | | | 24) FocusStepNear = 375 + | | | | - Tag 0x0304 (2 bytes, int16u[1]) + | | | | 25) FocusDistance = 100000 1 + | | | | - Tag 0x0305 (8 bytes, rational64u[1] read as int32u[2]) + | | | | 26) Olympus_FocusInfo_0x0307 = 0 + | | | | - Tag 0x0307 (2 bytes, int16u[1]) + | | | | 27) AFPoint = 0 + | | | | - Tag 0x0308 (2 bytes, int16u[1]) + | | | | 28) Olympus_FocusInfo_0x030c = 0 0 + | | | | - Tag 0x030c (4 bytes, int16u[2]) + | | | | 29) Olympus_FocusInfo_0x030f = 400 + | | | | - Tag 0x030f (2 bytes, int16s[1]) + | | | | 30) Olympus_FocusInfo_0x0310 = 0 + | | | | - Tag 0x0310 (2 bytes, int16u[1]) + | | | | 31) Olympus_FocusInfo_0x0311 = 0 + | | | | - Tag 0x0311 (2 bytes, int16u[1]) + | | | | 32) Olympus_FocusInfo_0x0312 = 76 906 + | | | | - Tag 0x0312 (4 bytes, int16u[2]) + | | | | 33) Olympus_FocusInfo_0x0313 = 302 + | | | | - Tag 0x0313 (2 bytes, int16s[1]) + | | | | 34) Olympus_FocusInfo_0x0314 = 10 + | | | | - Tag 0x0314 (2 bytes, int16u[1]) + | | | | 35) Olympus_FocusInfo_0x0315 = 0 + | | | | - Tag 0x0315 (2 bytes, int16s[1]) + | | | | 36) Olympus_FocusInfo_0x0316 = 3086 0 0 0 0 0 0 0 0 0 + | | | | - Tag 0x0316 (20 bytes, int16s[10]) + | | | | 37) Olympus_FocusInfo_0x031c = 0 + | | | | - Tag 0x031c (2 bytes, int16s[1]) + | | | | 38) Olympus_FocusInfo_0x031d = 319 + | | | | - Tag 0x031d (2 bytes, int16s[1]) + | | | | 39) Olympus_FocusInfo_0x031e = 321 + | | | | - Tag 0x031e (2 bytes, int16s[1]) + | | | | 40) Olympus_FocusInfo_0x0321 = 321 + | | | | - Tag 0x0321 (2 bytes, int16s[1]) + | | | | 41) Olympus_FocusInfo_0x0322 = 0 + | | | | - Tag 0x0322 (2 bytes, int16s[1]) + | | | | 42) Olympus_FocusInfo_0x0323 = 0 + | | | | - Tag 0x0323 (2 bytes, int16s[1]) + | | | | 43) Olympus_FocusInfo_0x0324 = 366 + | | | | - Tag 0x0324 (2 bytes, int16s[1]) + | | | | 44) Olympus_FocusInfo_0x1200 = 0 + | | | | - Tag 0x1200 (2 bytes, int16u[1]) + | | | | 45) ExternalFlash = 0 0 + | | | | - Tag 0x1201 (4 bytes, int16u[2]) + | | | | 46) Olympus_FocusInfo_0x1202 = 0 + | | | | - Tag 0x1202 (2 bytes, int16u[1]) + | | | | 47) ExternalFlashGuideNumber = 0 (0/1) + | | | | - Tag 0x1203 (8 bytes, rational64s[1]) + | | | | 48) ExternalFlashBounce = 0 + | | | | - Tag 0x1204 (2 bytes, int16u[1]) + | | | | 49) ExternalFlashZoom = 0 (0/1) + | | | | - Tag 0x1205 (8 bytes, rational64u[1]) + | | | | 50) Olympus_FocusInfo_0x1206 = 0 + | | | | - Tag 0x1206 (2 bytes, int16u[1]) + | | | | 51) Olympus_FocusInfo_0x1207 = 0 + | | | | - Tag 0x1207 (2 bytes, int16u[1]) + | | | | 52) InternalFlash = 0 + | | | | - Tag 0x1208 (2 bytes, int16u[1]) + | | | | 53) ImageStabilization = .00d.x.K.......T......T...O...... + | | | | - Tag 0x1600 (53 bytes, undef[53]) + | | 15) UserComment = [snip] + | | - Tag 0x9286 (125 bytes, undef[125]) + | | 16) FlashpixVersion = 0100 + | | - Tag 0xa000 (4 bytes, undef[4]) + | | 17) ColorSpace = 1 + | | - Tag 0xa001 (2 bytes, int16u[1]) + | | 18) ExifImageWidth = 3072 + | | - Tag 0xa002 (4 bytes, int32u[1]) + | | 19) ExifImageHeight = 2304 + | | - Tag 0xa003 (4 bytes, int32u[1]) + | | 20) InteropOffset (SubDirectory) --> + | | - Tag 0xa005 (4 bytes, int32u[1]) + | | + [InteropIFD directory with 2 entries] + | | | 0) InteropIndex = R98 + | | | - Tag 0x0001 (4 bytes, string[4]) + | | | 1) InteropVersion = 0100 + | | | - Tag 0x0002 (4 bytes, undef[4]) + | | 21) FileSource = 3 + | | - Tag 0xa300 (1 bytes, undef[1]) + | | 22) CustomRendered = 0 + | | - Tag 0xa401 (2 bytes, int16u[1]) + | | 23) ExposureMode = 1 + | | - Tag 0xa402 (2 bytes, int16u[1]) + | | 24) WhiteBalance = 0 + | | - Tag 0xa403 (2 bytes, int16u[1]) + | | 25) DigitalZoomRatio = 1 (100/100) + | | - Tag 0xa404 (8 bytes, rational64u[1]) + | | 26) SceneCaptureType = 0 + | | - Tag 0xa406 (2 bytes, int16u[1]) + | | 27) GainControl = 0 + | | - Tag 0xa407 (2 bytes, int16u[1]) + | | 28) Contrast = 0 + | | - Tag 0xa408 (2 bytes, int16u[1]) + | | 29) Saturation = 0 + | | - Tag 0xa409 (2 bytes, int16u[1]) + | | 30) Sharpness = 0 + | | - Tag 0xa40a (2 bytes, int16u[1]) + | 11) PrintIM (SubDirectory) --> + | - Tag 0xc4a5 (528 bytes, undef[528]) + | + [PrintIM directory with 37 entries] + | | PrintIMVersion = 0300 + | | - Tag 'PrintIMVersion' (4 bytes) + | | 0) PrintIM_0x0001 = 1310740 + | | - Tag 0x0001 (4 bytes) + | | 1) PrintIM_0x0002 = 1 + | | - Tag 0x0002 (4 bytes) + | | 2) PrintIM_0x0003 = 240 + | | - Tag 0x0003 (4 bytes) + | | 3) PrintIM_0x0007 = 0 + | | - Tag 0x0007 (4 bytes) + | | 4) PrintIM_0x0008 = 0 + | | - Tag 0x0008 (4 bytes) + | | 5) PrintIM_0x0009 = 0 + | | - Tag 0x0009 (4 bytes) + | | 6) PrintIM_0x000a = 0 + | | - Tag 0x000a (4 bytes) + | | 7) PrintIM_0x000b = 312 + | | - Tag 0x000b (4 bytes) + | | 8) PrintIM_0x000c = 0 + | | - Tag 0x000c (4 bytes) + | | 9) PrintIM_0x000d = 0 + | | - Tag 0x000d (4 bytes) + | | 10) PrintIM_0x000e = 336 + | | - Tag 0x000e (4 bytes) + | | 11) PrintIM_0x0010 = 352 + | | - Tag 0x0010 (4 bytes) + | | 12) PrintIM_0x0020 = 436 + | | - Tag 0x0020 (4 bytes) + | | 13) PrintIM_0x0100 = 3 + | | - Tag 0x0100 (4 bytes) + | | 14) PrintIM_0x0101 = 255 + | | - Tag 0x0101 (4 bytes) + | | 15) PrintIM_0x0102 = 131 + | | - Tag 0x0102 (4 bytes) + | | 16) PrintIM_0x0103 = 128 + | | - Tag 0x0103 (4 bytes) + | | 17) PrintIM_0x0104 = 131 + | | - Tag 0x0104 (4 bytes) + | | 18) PrintIM_0x0105 = 131 + | | - Tag 0x0105 (4 bytes) + | | 19) PrintIM_0x0106 = 131 + | | - Tag 0x0106 (4 bytes) + | | 20) PrintIM_0x0107 = 8421504 + | | - Tag 0x0107 (4 bytes) + | | 21) PrintIM_0x0110 = 128 + | | - Tag 0x0110 (4 bytes) + | | 22) PrintIM_0x0200 = 0 + | | - Tag 0x0200 (4 bytes) + | | 23) PrintIM_0x0207 = 0 + | | - Tag 0x0207 (4 bytes) + | | 24) PrintIM_0x0208 = 0 + | | - Tag 0x0208 (4 bytes) + | | 25) PrintIM_0x0209 = 0 + | | - Tag 0x0209 (4 bytes) + | | 26) PrintIM_0x020a = 0 + | | - Tag 0x020a (4 bytes) + | | 27) PrintIM_0x020b = 504 + | | - Tag 0x020b (4 bytes) + | | 28) PrintIM_0x020d = 0 + | | - Tag 0x020d (4 bytes) + | | 29) PrintIM_0x0220 = 470 + | | - Tag 0x0220 (4 bytes) + | | 30) PrintIM_0x0300 = 3 + | | - Tag 0x0300 (4 bytes) + | | 31) PrintIM_0x0301 = 255 + | | - Tag 0x0301 (4 bytes) + | | 32) PrintIM_0x0302 = 131 + | | - Tag 0x0302 (4 bytes) + | | 33) PrintIM_0x0303 = 131 + | | - Tag 0x0303 (4 bytes) + | | 34) PrintIM_0x0306 = 131 + | | - Tag 0x0306 (4 bytes) + | | 35) PrintIM_0x0310 = 128 + | | - Tag 0x0310 (4 bytes) + | | 36) PrintIM_0x0400 = 0 + | | - Tag 0x0400 (4 bytes) + + [IFD1 directory with 6 entries] + | 0) Compression = 6 + | - Tag 0x0103 (2 bytes, int16u[1]) + | 1) XResolution = 72 (72/1) + | - Tag 0x011a (8 bytes, rational64u[1]) + | 2) YResolution = 72 (72/1) + | - Tag 0x011b (8 bytes, rational64u[1]) + | 3) ResolutionUnit = 2 + | - Tag 0x0128 (2 bytes, int16u[1]) + | 4) ThumbnailOffset = 7046 + | - Tag 0x0201 (4 bytes, int32u[1]) + | 5) ThumbnailLength = 28 + | - Tag 0x0202 (4 bytes, int32u[1]) +JPEG DQT (130 bytes): +JPEG SOF0 (15 bytes): + ImageWidth = 8 + ImageHeight = 8 + EncodingProcess = 0 + BitsPerSample = 8 + ColorComponents = 3 + YCbCrSubSampling = 2 2 +JPEG DHT (73 bytes): +JPEG SOS diff --git a/t/Olympus_8.out b/t/Olympus_8.out new file mode 100644 index 0000000..1159ce6 --- /dev/null +++ b/t/Olympus_8.out @@ -0,0 +1,15 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: Olympus.dss +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 80 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2015:06:24 09:57:14-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:16-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: DSS +[File, File, Other] FileTypeExtension - File Type Extension: dss +[File, File, Other] MIMEType - MIME Type: audio/x-dss +[MakerNotes, Olympus, Audio] 12 - Model: DS2300 +[MakerNotes, Olympus, Time] 38 - Start Time: 2005:11:16 13:52:42 +[MakerNotes, Olympus, Time] 50 - End Time: 2005:11:16 13:52:53 +[MakerNotes, Olympus, Audio] 62 - Duration: 10.00 s diff --git a/t/OpenEXR.t b/t/OpenEXR.t new file mode 100644 index 0000000..256e1ae --- /dev/null +++ b/t/OpenEXR.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/OpenEXR.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::OpenEXR; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'OpenEXR'; +my $testnum = 1; + +# test 2: Extract information from OpenEXR file +{ + my $exifTool = new Image::ExifTool; + ++$testnum; + my $info = $exifTool->ImageInfo('t/images/OpenEXR.exr'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/OpenEXR_2.out b/t/OpenEXR_2.out new file mode 100644 index 0000000..b6913ec --- /dev/null +++ b/t/OpenEXR_2.out @@ -0,0 +1,25 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: OpenEXR.exr +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 395 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2011:12:10 14:34:35-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:14-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: EXR +[File, File, Other] FileTypeExtension - File Type Extension: exr +[File, File, Other] MIMEType - MIME Type: image/x-exr +[File, File, Image] ImageWidth - Image Width: 3 +[File, File, Image] ImageHeight - Image Height: 2 +[OpenEXR, OpenEXR, Image] _ver - EXR Version: 2 +[OpenEXR, OpenEXR, Image] _lay - Layout: Scan Lines +[OpenEXR, OpenEXR, Image] channels - Channels: A half 1 1, B half 1 1, G half 1 1, R half 1 1 +[OpenEXR, OpenEXR, Image] compression - Compression: PIZ +[OpenEXR, OpenEXR, Image] dataWindow - Data Window: 0 0 2 1 +[OpenEXR, OpenEXR, Image] displayWindow - Display Window: 0 0 2 1 +[OpenEXR, OpenEXR, Image] lineOrder - Line Order: Increasing Y +[OpenEXR, OpenEXR, Image] pixelAspectRatio - Pixel Aspect Ratio: 1 +[OpenEXR, OpenEXR, Image] screenWindowCenter - Screen Window Center: 0 0 +[OpenEXR, OpenEXR, Image] screenWindowWidth - Screen Window Width: 1 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 3x2 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000006 diff --git a/t/Opus.t b/t/Opus.t new file mode 100644 index 0000000..056d7c4 --- /dev/null +++ b/t/Opus.t @@ -0,0 +1,28 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Opus.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Opus; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Opus'; +my $testnum = 1; + +# test 2: Extract information from test file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Opus.opus'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/Opus_2.out b/t/Opus_2.out new file mode 100644 index 0000000..8ff5fac --- /dev/null +++ b/t/Opus_2.out @@ -0,0 +1,26 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: Opus.opus +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1128 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2016:07:14 08:20:19-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:16-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: OPUS +[File, File, Other] FileTypeExtension - File Type Extension: opus +[File, File, Other] MIMEType - MIME Type: audio/ogg +[Opus, Opus, Audio] 0 - Opus Version: 1 +[Opus, Opus, Audio] 1 - Audio Channels: 1 +[Opus, Opus, Audio] 4 - Sample Rate: 7872 +[Opus, Opus, Audio] 8 - Output Gain: 1 +[Vorbis, Vorbis, Audio] vendor - Vendor: libopus 1.1 +[Vorbis, Vorbis, Audio] ENCODER - Encoder: opusenc from opus-tools 0.1.9 +[FLAC, FLAC, Image] 0 - Picture Type: Front Cover +[FLAC, FLAC, Image] 1 - Picture MIME Type: image/png +[FLAC, FLAC, Image] 2 - Picture Description: cover pic +[FLAC, FLAC, Image] 3 - Picture Width: 16 +[FLAC, FLAC, Image] 4 - Picture Height: 16 +[FLAC, FLAC, Image] 5 - Picture Bits Per Pixel: 1 +[FLAC, FLAC, Image] 6 - Picture Indexed Colors: 0 +[FLAC, FLAC, Image] 7 - Picture Length: 85 +[FLAC, FLAC, Preview] 8 - Picture: (Binary data 85 bytes) diff --git a/t/PCX.t b/t/PCX.t new file mode 100644 index 0000000..b92b3cf --- /dev/null +++ b/t/PCX.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PCX.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::PCX; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PCX'; +my $testnum = 1; + +# test 2: Extract information from PCX file +{ + my $exifTool = new Image::ExifTool; + ++$testnum; + my $info = $exifTool->ImageInfo('t/images/PCX.pcx'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/PCX_2.out b/t/PCX_2.out new file mode 100644 index 0000000..ae05590 --- /dev/null +++ b/t/PCX_2.out @@ -0,0 +1,26 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: PCX.pcx +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 160 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2018:12:12 09:01:43-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:14-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2018:12:12 13:16:32-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: PCX +[File, File, Other] FileTypeExtension - File Type Extension: pcx +[File, File, Other] MIMEType - MIME Type: image/pcx +[File, File, Image] 0 - Manufacturer: ZSoft +[File, File, Image] 1 - Software: PC Paintbrush 3.0+ +[File, File, Image] 2 - Encoding: RLE +[File, File, Image] 3 - Bits Per Pixel: 8 +[File, File, Image] 4 - Left Margin: 0 +[File, File, Image] 6 - Top Margin: 0 +[File, File, Image] 8 - Image Width: 8 +[File, File, Image] 10 - Image Height: 8 +[File, File, Image] 12 - X Resolution: 72 +[File, File, Image] 14 - Y Resolution: 72 +[File, File, Image] 65 - Color Planes: 3 +[File, File, Image] 66 - Bytes Per Line: 8 +[File, File, Image] 68 - Color Mode: Color Palette +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/PDF.t b/t/PDF.t new file mode 100644 index 0000000..dad82dd --- /dev/null +++ b/t/PDF.t @@ -0,0 +1,304 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PDF.t". + +BEGIN { + $| = 1; print "1..26\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::PDF; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PDF'; +my $testnum = 1; + +#------------------------------------------------------------------------------ +# PDF decryption test +# Inputs: 0) Encrypt object reference, plus additional entries (see below), +# 1) Test number, 2) encrypt flag (false for decryption) +# Returns: nothing, but prints test result +# Additional encrypt hash entries used by this routine: +# _id - PDF file ID +# _ref - PDF object reference string +# _req - other module required for this test +# _ciphertext - encrypted data +# _plaintext - expected decryption result +# _password - password for decryption (if used) +sub CryptTest($$;$) +{ + my ($cryptInfo, $testNum, $encrypt) = @_; + my $skip = ''; + if (eval "require $$cryptInfo{_req}") { + my $exifTool = new Image::ExifTool; + $exifTool->Options('Password', $$cryptInfo{_password}); + my $err = Image::ExifTool::PDF::DecryptInit($exifTool, $cryptInfo, $$cryptInfo{_id}); + unless ($err) { + my $data = $$cryptInfo{$encrypt ? '_plaintext' : '_ciphertext'}; + Image::ExifTool::PDF::Crypt(\$data, $$cryptInfo{_ref} || '1 0 R', $encrypt); + $err = $$cryptInfo{_error}; + if (not $err and $data ne $$cryptInfo{$encrypt ? '_ciphertext' : '_plaintext'}) { + $err = "Test $testnum (decryption) returned wrong value:\n " . unpack('H*',$data); + } + } + if ($err) { + warn "\n $err\n"; + print 'not '; + } + } else { + $skip = " # skip Requires $$cryptInfo{_req}"; + } + print "ok $testnum$skip\n"; +} + +# test 2: Extract information from PDF.pdf +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/PDF.pdf'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Test Standard PDF decryption +{ + ++$testnum; + my %cryptInfo = ( + Filter => '/Standard', + P => -60, + V => 1, + R => 0, + O => '<2055c756c72e1ad702608e8196acad447ad32d17cff583235f6dd15fed7dab67>', + U => '<7150bd1da9d292af3627fca6a8dde1d696e25312041aed09059f9daee04353ae>', + _id => pack('H*','12116a1a124ae4cd8179e8978f6ac88b'), + _req => 'Digest::MD5', + _ref => '4 0 R', + _ciphertext => pack('N', 0x34a290d3), + _plaintext => pack('N', 0x5924d335), + ); + CryptTest(\%cryptInfo, $testNum); +} + +# tests 4-21: Test writing, deleting and reverting two different files +{ + # do a bunch of edits + my @edits = ([ # (on file containing both PDF Info and XMP) + [ # test 4: write PDF and XMP information + [ 'PDF:Creator' => 'me'], + [ 'XMP:Creator' => 'you' ], + [ 'AllDates' => '2:30', Shift => -1 ], + ],[ # test 5: delete all PDF + [ 'PDF:all' ], + ],[ # test 6: write some XMP + [ 'XMP:Author' => 'them' ], + ],[ # test 7: create new PDF + [ 'PDF:Keywords' => 'one' ], + [ 'PDF:Keywords' => 'two' ], + [ 'AppleKeywords' => 'three' ], + [ 'AppleKeywords' => 'four' ], + ],[ # test 8: delete all XMP + [ 'XMP:all' ], + ],[ # test 9: write some PDF + [ 'PDF:Keywords' => 'another one', AddValue => 1 ], + [ 'AppleKeywords' => 'three', DelValue => 1 ], + ],[ # test 10: create new XMP + [ 'XMP:Author' => 'us' ], + ],[ # test 11: write some PDF + [ 'PDF:Keywords' => 'two', DelValue => 1 ], + [ 'AppleKeywords' => 'five', AddValue => 1 ], + ],[ # test 12: delete re-added XMP + [ 'XMP:all' ], + ], + ],[ # (on file without PDF Info or XMP) + [ # test 14: create new XMP + [ 'XMP:Author' => 'him' ], + ],[ # test 15: create new PDF + [ 'PDF:Author' => 'her' ], + ],[ # test 16: delete XMP and PDF + [ 'XMP:all' ], + [ 'PDF:all' ], + ],[ # test 17: delete XMP and PDF again + [ 'XMP:all' ], + [ 'PDF:all' ], + ],[ # test 18: create new PDF + [ 'PDF:Author' => 'it' ], + ],[ # test 19: create new XMP + [ 'XMP:Author' => 'thing' ], + ],[ # test 20: delete all + [ 'all' ], + ], + ]); + my $testSet; + foreach $testSet (0,1) { + my ($edit, $testfile2, $lastOK); + my $testfile = 't/images/' . ($testSet ? 'PDF2.pdf' : 'PDF.pdf'); + my $testfile1 = $testfile; + my $exifTool = new Image::ExifTool; + $exifTool->Options(PrintConv => 0); + foreach $edit (@{$edits[$testSet]}) { + ++$testnum; + $exifTool->SetNewValue(); + $exifTool->SetNewValue(@$_) foreach @$edit; + $testfile2 = "t/${testname}_${testnum}_failed.pdf"; + unlink $testfile2; + $exifTool->WriteInfo($testfile1, $testfile2); + my $info = $exifTool->ImageInfo($testfile2, + qw{Filesize PDF:all XMP:Creator XMP:Author AllDates}); + my $ok = check($exifTool, $info, $testname, $testnum); + print 'not ' unless $ok; + print "ok $testnum\n"; + # erase source file if previous test was OK + unlink $testfile1 if $lastOK; + $lastOK = $ok; + $testfile1 = $testfile2; # use this file for the next test + } + # revert all edits and compare with original file + ++$testnum; + $exifTool->SetNewValue('PDF-update:all'); + $testfile2 = "t/${testname}_${testnum}_failed.pdf"; + unlink $testfile2; + $exifTool->WriteInfo($testfile1, $testfile2); + if (binaryCompare($testfile2, $testfile)) { + unlink $testfile2; + } else { + print 'not '; + } + print "ok $testnum\n"; + unlink $testfile1 if $lastOK; + } +} + +# test 22: Delete all tags +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.pdf"; + unlink $testfile; + $exifTool->Options(IgnoreMinorErrors => 1); + $exifTool->SetNewValue(all => undef); + my $ok = writeInfo($exifTool, 't/images/PDF.pdf', $testfile); + $exifTool->Options(IgnoreMinorErrors => 0); + my $info = $exifTool->ImageInfo($testfile,'pdf:all','xmp:all',{Duplicates=>1,Unknown=>1}); + if ($ok and check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 23: Test AES decryption alone (tests 24-26 require Digest::MD5 or Digest::SHA) +{ + ++$testnum; + require Image::ExifTool::AES; + my $data = pack('H*','6fdc3ca684348bc8f31379aa46455d7b60c0989e027c1d82e746f136d6e95b7485735793ff64310e5b9e367dcc26f564'); + my $err = Image::ExifTool::AES::Crypt(\$data, '11223344556677889900112233445566'); + if ($err) { + warn "\n $err\n"; + print 'not '; + } elsif ($data ne 'ExifTool AES Test') { + my $hex = unpack 'H*', $data; + warn "\n Incorrect result from AES decryption:\n"; + warn " $hex\n"; + print 'not '; + } + print "ok $testnum\n"; +} + +# test 24-26: Test AESV2 and AESV3 decryption +{ + my @encrypt = ( + # AESV2 without password + { + Filter => '/Standard', + V => 4, + R => 4, + P => -1340, + Length => 128, + StmF => '/StdCF', + StrF => '/StdCF', + CF => { + StdCF => { + AuthEvent => '/DocOpen', + CFM => '/AESV2', + Length => 16, + }, + }, + EncryptMetadata => 'false', + O => '<181ee8e93a99fa1c2a534dd68a5ab07c54268cfe8fbf28c468316b6f732674c1>', + U => '<a3525aef4143f4419c78b109317f0e5200000000000000000000000000000000>', + _req => 'Digest::MD5', + _ref => '4 0 R', + _id => pack('H*','d0a736f05faf64c6b52dea82a2ad53e0'), + _plaintext => 'This was a test', + _ciphertext => pack('H*', 'a86b5e00d9c7e4455cf5d8cedf195c2060e1467ea6d698876a77e9a66cb7867c'), + }, + # AESV3 without password + { + Filter => '/Standard', + V => 5, + R => 5, + P => -1028, + Length => 256, + StmF => '/StdCF', + StrF => '/StdCF', + CF => { + StdCF => { + AuthEvent => '/DocOpen', + CFM => '/AESV3', + Length => 32, + }, + }, + Perms => '<014ee28fe2b91e2198a593b7c3b22f50>', + O => '<83e5edfcdecbe2ebe6d519dbafe80fd453028dda119eb76d0216e1344392320d60e1467ea6d698876a77e9a66cb7867c>', + U => '<e5e7ade8aebdc9413a0fd176efc4081bdbad3b16a67ece7a01fadb24010a003ea86b5e00d9c7e4455cf5d8cedf195c20>', + OE => '<a29f37f1f085b575d9016daad05ca466dd073ba5d067cc7ffa8ef7d1605e460e>', + UE => '<47ea891b25af77aaceccf8f2fdeff0c09e9d0f67275f059dbfabbb18fcbf848d>', + _req => 'Digest::SHA', + _ref => 'dummy', + _id => pack('H*','618cb5be1d82fceea9a501b62d408296'), + _plaintext => 'This was a test', + _ciphertext => pack('H*', 'e90756e8fd60fb7390c34d931e3e3d61898cd133e613e8cf86cd40f7b207a62d'), + }, + # AESV3 with a password + { + Filter => '/Standard', + V => 5, + R => 5, + P => -1028, + Length => 256, + StmF => '/StdCF', + StrF => '/StdCF', + CF => { + StdCF => { + AuthEvent => '/DocOpen', + CFM => '/AESV3', + Length => 32, + }, + }, + Perms => '<014ee28fe2b91e2198a593b7c3b22f50>', + O => '<31eefe924a298d8bf19eafc9be6abdfa65a97478f94e907dccff5ac000b83fa521167b86cf70bf77d4a054bc9a59573d>', + U => '<6525a788c2ebf27baa45f526bcdb9d2f96c3c67ae1c62324135cac0b823451ba9ad8edb68d167d2d8370d799c41d17d7>', + OE => '<ea58e3c731999cdc0f8a395c7391836c2b2db0b4ac86439b3fe5692ddc71671a>', + UE => '<f6818f43e176dfe8912f62717032169cf48854f540f7b7641be363ef50371f07>', + _req => 'Digest::SHA', + _ref => 'dummy', + _id => pack('H*','b5f9d17b07152a45bc0a939727c389ad'), + _plaintext => 'This was a test', + _password => 'ExifTool', + _ciphertext => pack('H*', '8bb3565d8c4b9df8cc350954d9f91a46aa47e40eeb5a0cff559acd5ec3e94244'), + }); + my $exifTool = new Image::ExifTool; + my $cryptInfo; + foreach $cryptInfo (@encrypt) { + ++$testnum; + my $encrypt = 0; # (set to 1 to generate ciphertext strings) + CryptTest($cryptInfo, $testNum, $encrypt); + } +} + + +# end diff --git a/t/PDF_10.out b/t/PDF_10.out new file mode 100644 index 0000000..da2471f --- /dev/null +++ b/t/PDF_10.out @@ -0,0 +1,10 @@ +[File, System, Other] FileSize - File Size: 12163 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 +[PDF, PDF, Document] AAPL:Keywords - Apple Keywords: four +[PDF, PDF, Document] Keywords - Keywords: [one,two,another one] +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:18 14:30:45 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[XMP, XMP-pdf, Author] Author - Author: us diff --git a/t/PDF_11.out b/t/PDF_11.out new file mode 100644 index 0000000..1428428 --- /dev/null +++ b/t/PDF_11.out @@ -0,0 +1,10 @@ +[File, System, Other] FileSize - File Size: 12165 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 +[PDF, PDF, Document] AAPL:Keywords - Apple Keywords: [four,five] +[PDF, PDF, Document] Keywords - Keywords: [one,another one] +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:18 14:30:45 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[XMP, XMP-pdf, Author] Author - Author: us diff --git a/t/PDF_12.out b/t/PDF_12.out new file mode 100644 index 0000000..c36164d --- /dev/null +++ b/t/PDF_12.out @@ -0,0 +1,9 @@ +[File, System, Other] FileSize - File Size: 9256 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 +[PDF, PDF, Document] AAPL:Keywords - Apple Keywords: [four,five] +[PDF, PDF, Document] Keywords - Keywords: [one,another one] +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:18 14:30:45 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 diff --git a/t/PDF_14.out b/t/PDF_14.out new file mode 100644 index 0000000..7045662 --- /dev/null +++ b/t/PDF_14.out @@ -0,0 +1,5 @@ +[File, System, Other] FileSize - File Size: 5412 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 +[XMP, XMP-pdf, Author] Author - Author: him diff --git a/t/PDF_15.out b/t/PDF_15.out new file mode 100644 index 0000000..63b8613 --- /dev/null +++ b/t/PDF_15.out @@ -0,0 +1,6 @@ +[File, System, Other] FileSize - File Size: 5481 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 +[PDF, PDF, Author] Author - Author: her +[XMP, XMP-pdf, Author] Author - Author: him diff --git a/t/PDF_16.out b/t/PDF_16.out new file mode 100644 index 0000000..7e11953 --- /dev/null +++ b/t/PDF_16.out @@ -0,0 +1,4 @@ +[File, System, Other] FileSize - File Size: 2508 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 diff --git a/t/PDF_17.out b/t/PDF_17.out new file mode 100644 index 0000000..7e11953 --- /dev/null +++ b/t/PDF_17.out @@ -0,0 +1,4 @@ +[File, System, Other] FileSize - File Size: 2508 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 diff --git a/t/PDF_18.out b/t/PDF_18.out new file mode 100644 index 0000000..d69918f --- /dev/null +++ b/t/PDF_18.out @@ -0,0 +1,5 @@ +[File, System, Other] FileSize - File Size: 2576 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 +[PDF, PDF, Author] Author - Author: it diff --git a/t/PDF_19.out b/t/PDF_19.out new file mode 100644 index 0000000..5abed26 --- /dev/null +++ b/t/PDF_19.out @@ -0,0 +1,6 @@ +[File, System, Other] FileSize - File Size: 5482 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 +[PDF, PDF, Author] Author - Author: it +[XMP, XMP-pdf, Author] Author - Author: thing diff --git a/t/PDF_2.out b/t/PDF_2.out new file mode 100644 index 0000000..5926dae --- /dev/null +++ b/t/PDF_2.out @@ -0,0 +1,127 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: PDF.pdf +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 8.9 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:12:04 21:22:58-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: PDF +[File, File, Other] FileTypeExtension - File Type Extension: pdf +[File, File, Other] MIMEType - MIME Type: application/pdf +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: No +[PDF, PDF, Document] Creator - Creator: Adobe Photoshop 7.0 +[PDF, PDF, Time] CreationDate - Create Date: 2005:07:18 14:30:45-04:00 +[PDF, PDF, Time] ModDate - Modify Date: 2005:07:18 14:30:45-04:00 +[PDF, PDF, Document] Producer - Producer: Adobe Photoshop for Macintosh +[PDF, PDF, Document] Count - Page Count: 1 +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: A witty caption +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it +[IPTC, IPTC, Other] 105 - Headline: No headline +[IPTC, IPTC, Other] 40 - Special Instructions: What instructions +[IPTC, IPTC, Author] 80 - By-line: Phil Harvey +[IPTC, IPTC, Author] 85 - By-line Title: My Position +[IPTC, IPTC, Author] 110 - Credit: My Credit +[IPTC, IPTC, Author] 115 - Source: I'm the source +[IPTC, IPTC, Other] 5 - Object Name: Test IPTC picture +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ont +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 103 - Original Transmission Reference: What is a transmission reference +[IPTC, IPTC, Other] 15 - Category: 1 +[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing, image, utilities +[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Other] 25 - Keywords: ExifTool, Test, XMP +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright 2004 Phil Harvey +[Photoshop, Photoshop, Image] 1061 - IPTC Digest: 9e02efbd9bdc1dc192279e30a0e27323 +[Photoshop, Photoshop, Image] 0 - X Resolution: 72 +[Photoshop, Photoshop, Image] 2 - Displayed Units X: inches +[Photoshop, Photoshop, Image] 4 - Y Resolution: 72 +[Photoshop, Photoshop, Image] 6 - Displayed Units Y: inches +[Photoshop, Photoshop, Image] 0 - Print Style: Centered +[Photoshop, Photoshop, Image] 2 - Print Position: 0 0 +[Photoshop, Photoshop, Image] 10 - Print Scale: 1 +[Photoshop, Photoshop, Image] 1037 - Global Angle: 30 +[Photoshop, Photoshop, Image] 1049 - Global Altitude: 30 +[Photoshop, Photoshop, Author] 1035 - URL: https://exiftool.org/ +[Photoshop, Photoshop, Image] 1054 - URL List: +[Photoshop, Photoshop, Other] 20 - Slices Group Name: a +[Photoshop, Photoshop, Other] 24 - Num Slices: 1 +[Photoshop, Photoshop, Image] 4 - Has Real Merged Data: Yes +[Photoshop, Photoshop, Image] 5 - Writer Name: Adobe Photoshop +[Photoshop, Photoshop, Image] 9 - Reader Name: Adobe Photoshop 7.0 +[EXIF, IFD0, Image] 270 - Image Description: A witty caption +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:18 14:30:45 +[EXIF, IFD0, Author] 315 - Artist: Phil Harvey +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: Copyright 2004 Phil Harvey +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1.230769231 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Image] 37389 - Noise: 6 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 8 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 8 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 842 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 0 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: XMP toolkit 2.8.2-33, framework 1.5 +[XMP, XMP-rdf, Document] about - About: uuid:b691db33-f92a-11d9-99a4-8c8e8269c120 +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: My Position +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: I wrote it +[XMP, XMP-photoshop, Image] Category - Category: 1 +[XMP, XMP-photoshop, Location] City - City: Kingston +[XMP, XMP-photoshop, Location] Country - Country: Canada +[XMP, XMP-photoshop, Author] Credit - Credit: My Credit +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2004:02:26 +[XMP, XMP-photoshop, Image] Headline - Headline: No headline +[XMP, XMP-photoshop, Image] Instructions - Instructions: What instructions +[XMP, XMP-photoshop, Author] Source - Source: I'm the source +[XMP, XMP-photoshop, Location] State - State: Ont +[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: What is a transmission reference +[XMP, XMP-photoshop, Image] Urgency - Urgency: 8 (least urgent) +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: amazing, image, utilities +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:cbcc2a62-f127-11d9-ac4d-e8be6f73552e +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: A witty caption +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image] title - Title: Test IPTC picture +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/64 +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.6 diff --git a/t/PDF_20.out b/t/PDF_20.out new file mode 100644 index 0000000..7e11953 --- /dev/null +++ b/t/PDF_20.out @@ -0,0 +1,4 @@ +[File, System, Other] FileSize - File Size: 2508 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 diff --git a/t/PDF_22.out b/t/PDF_22.out new file mode 100644 index 0000000..00270ce --- /dev/null +++ b/t/PDF_22.out @@ -0,0 +1,3 @@ +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: No +[PDF, PDF, Document] Count - Page Count: 1 diff --git a/t/PDF_4.out b/t/PDF_4.out new file mode 100644 index 0000000..cc8eb7a --- /dev/null +++ b/t/PDF_4.out @@ -0,0 +1,12 @@ +[File, System, Other] FileSize - File Size: 14618 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Creator - Creator: me +[PDF, PDF, Time] CreationDate - Create Date: 2005:07:18 12:00:45-04:00 +[PDF, PDF, Time] ModDate - Modify Date: 2005:07:18 12:00:45-04:00 +[PDF, PDF, Document] Producer - Producer: Adobe Photoshop for Macintosh +[PDF, PDF, Document] Count - Page Count: 1 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:18 14:30:45 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[XMP, XMP-dc, Author] creator - Creator: you diff --git a/t/PDF_5.out b/t/PDF_5.out new file mode 100644 index 0000000..e575295 --- /dev/null +++ b/t/PDF_5.out @@ -0,0 +1,8 @@ +[File, System, Other] FileSize - File Size: 14454 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:18 14:30:45 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[XMP, XMP-dc, Author] creator - Creator: you diff --git a/t/PDF_6.out b/t/PDF_6.out new file mode 100644 index 0000000..60dae46 --- /dev/null +++ b/t/PDF_6.out @@ -0,0 +1,9 @@ +[File, System, Other] FileSize - File Size: 14623 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:18 14:30:45 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[XMP, XMP-dc, Author] creator - Creator: you +[XMP, XMP-pdf, Author] Author - Author: them diff --git a/t/PDF_7.out b/t/PDF_7.out new file mode 100644 index 0000000..b7320b5 --- /dev/null +++ b/t/PDF_7.out @@ -0,0 +1,11 @@ +[File, System, Other] FileSize - File Size: 14711 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 +[PDF, PDF, Document] AAPL:Keywords - Apple Keywords: [three,four] +[PDF, PDF, Document] Keywords - Keywords: [one,two] +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:18 14:30:45 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[XMP, XMP-dc, Author] creator - Creator: you +[XMP, XMP-pdf, Author] Author - Author: them diff --git a/t/PDF_8.out b/t/PDF_8.out new file mode 100644 index 0000000..0470bdf --- /dev/null +++ b/t/PDF_8.out @@ -0,0 +1,9 @@ +[File, System, Other] FileSize - File Size: 9249 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 +[PDF, PDF, Document] AAPL:Keywords - Apple Keywords: [three,four] +[PDF, PDF, Document] Keywords - Keywords: [one,two] +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:18 14:30:45 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 diff --git a/t/PDF_9.out b/t/PDF_9.out new file mode 100644 index 0000000..f4ad000 --- /dev/null +++ b/t/PDF_9.out @@ -0,0 +1,9 @@ +[File, System, Other] FileSize - File Size: 9254 +[PDF, PDF, Document] Version - PDF Version: 1.3 +[PDF, PDF, Document] _linearized - Linearized: false +[PDF, PDF, Document] Count - Page Count: 1 +[PDF, PDF, Document] AAPL:Keywords - Apple Keywords: four +[PDF, PDF, Document] Keywords - Keywords: [one,two,another one] +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:18 14:30:45 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 diff --git a/t/PFM.t b/t/PFM.t new file mode 100644 index 0000000..c34bd6a --- /dev/null +++ b/t/PFM.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PFM.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Other; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PFM'; +my $testnum = 1; + +# test 2: Extract information from PFM.pfm +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/PFM.pfm'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/PFM_2.out b/t/PFM_2.out new file mode 100644 index 0000000..02abb99 --- /dev/null +++ b/t/PFM_2.out @@ -0,0 +1,17 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.29 +[File, System, Other] FileName - File Name: PFM.pfm +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 39 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2021:07:16 08:36:07-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2021:07:16 08:36:08-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:07:16 08:36:07-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: PFM +[File, File, Other] FileTypeExtension - File Type Extension: pfm +[File, File, Other] MIMEType - MIME Type: image/x-pfm +[File, File, Image] ColorSpace - Color Space: RGB +[File, File, Image] ImageWidth - Image Width: 512 +[File, File, Image] ImageHeight - Image Height: 768 +[File, File, Image] ByteOrder - Byte Order: Little-endian +[Composite, Composite, Image] Exif-ImageSize - Image Size: 512x768 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.393 diff --git a/t/PGF.t b/t/PGF.t new file mode 100644 index 0000000..aeb60b9 --- /dev/null +++ b/t/PGF.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PGF.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::PGF; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PGF'; +my $testnum = 1; + +# test 2: Extract information from PGF.pgf +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/PGF.pgf'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/PGF_2.out b/t/PGF_2.out new file mode 100644 index 0000000..6e16654 --- /dev/null +++ b/t/PGF_2.out @@ -0,0 +1,35 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.29 +[ExifTool, ExifTool, ExifTool] Warning - Warning: [minor] Text/EXIF chunk(s) found after PGF IDAT (may be ignored by some readers) +[File, System, Other] FileName - File Name: PGF.pgf +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 286 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2011:01:26 07:32:42-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2021:07:08 07:09:24-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: PGF +[File, File, Other] FileTypeExtension - File Type Extension: pgf +[File, File, Other] MIMEType - MIME Type: image/pgf +[File, File, Image] 3 - PGF Version: 0x36 +[File, File, Image] 8 - Image Width: 8 +[File, File, Image] 12 - Image Height: 8 +[File, File, Image] 16 - Pyramid Levels: 0 +[File, File, Image] 17 - Quality: 0 +[File, File, Image] 18 - Bits Per Pixel: 24 +[File, File, Image] 19 - Color Components: 3 +[File, File, Image] 20 - Color Mode: RGB +[File, File, Image] 21 - Background Color: 0 0 0 +[PNG, PNG, Image] 0 - Image Width: 1 +[PNG, PNG, Image] 4 - Image Height: 1 +[PNG, PNG, Image] 8 - Bit Depth: 8 +[PNG, PNG, Image] 9 - Color Type: RGB +[PNG, PNG, Image] 10 - Compression: Deflate/Inflate +[PNG, PNG, Image] 11 - Filter: Adaptive +[PNG, PNG, Image] 12 - Interlace: Noninterlaced +[PNG, PNG, Image] sRGB - SRGB Rendering: Perceptual +[PNG, PNG-pHYs, Image] 0 - Pixels Per Unit X: 2835 +[PNG, PNG-pHYs, Image] 4 - Pixels Per Unit Y: 2835 +[PNG, PNG-pHYs, Image] 8 - Pixel Units: meters +[PNG, PNG, Image] Comment - Comment: ExifTool PGF Test +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/PICT.t b/t/PICT.t new file mode 100644 index 0000000..4719acd --- /dev/null +++ b/t/PICT.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PICT.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::PICT; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PICT'; +my $testnum = 1; + +# test 2: Extract information from PICT.pict +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/PICT.pict'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/PICT_2.out b/t/PICT_2.out new file mode 100644 index 0000000..c4ab929 --- /dev/null +++ b/t/PICT_2.out @@ -0,0 +1,17 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: PICT.pict +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 150 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2005:11:14 14:47:21-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:17-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: PICT +[File, File, Other] FileTypeExtension - File Type Extension: pict +[File, File, Other] MIMEType - MIME Type: image/pict +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] XResolution - X Resolution: 72 +[File, File, Image] YResolution - Y Resolution: 72 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/PLIST.t b/t/PLIST.t new file mode 100644 index 0000000..27a6c32 --- /dev/null +++ b/t/PLIST.t @@ -0,0 +1,32 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PLIST.t". + +BEGIN { + $| = 1; print "1..4\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::PLIST; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PLIST'; +my $testnum = 1; + +# tests 2-4: Extract information from PLIST files +{ + my $file; + my $exifTool = new Image::ExifTool; + foreach $file ('PLIST-xml.plist', 'PLIST-bin.plist', 'PLIST.aae') { + ++$testnum; + my $info = $exifTool->ImageInfo("t/images/$file"); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + } +} + + +# end diff --git a/t/PLIST_2.out b/t/PLIST_2.out new file mode 100644 index 0000000..9b24006 --- /dev/null +++ b/t/PLIST_2.out @@ -0,0 +1,21 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: PLIST-xml.plist +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 795 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:02:22 08:21:12-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:46-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: PLIST +[File, File, Other] FileTypeExtension - File Type Extension: plist +[File, File, Other] MIMEType - MIME Type: application/xml +[PLIST, XML, Document] TestArray - Test Array: one, two, three +[PLIST, XML, Document] TestBoolean - Test Boolean: True +[PLIST, XML, Document] TestData - Test Data: (Binary data 12 bytes) +[PLIST, XML, Time] TestDate - Test Date: 2013:02:22 12:49:10Z +[PLIST, XML, Document] TestDict/Author - Test Dict Author: Phil +[PLIST, XML, Time] TestDict/When - Test Dict When: 2000:01:02 08:04:05Z +[PLIST, XML, Document] TestInteger - Test Integer: 256 +[PLIST, XML, Document] TestReal - Test Real: 1.4 +[PLIST, XML, Document] TestString - Test String: ExifTool PLIST test +[PLIST, XML, Document] TestUnicode - Test Unicode: ExîfTöøl PLIST tést diff --git a/t/PLIST_3.out b/t/PLIST_3.out new file mode 100644 index 0000000..c2a0a93 --- /dev/null +++ b/t/PLIST_3.out @@ -0,0 +1,21 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: PLIST-bin.plist +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 351 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:02:22 08:20:16-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:46-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: PLIST +[File, File, Other] FileTypeExtension - File Type Extension: plist +[File, File, Other] MIMEType - MIME Type: application/x-plist +[PLIST, PLIST, Document] TestReal - Test Real: 1.4 +[PLIST, PLIST, Time] TestDict/When - Test Dict When: 2000:01:02 03:04:05-05:00 +[PLIST, PLIST, Document] TestDict/Author - Test Dict Author: Phil +[PLIST, PLIST, Document] TestString - Test String: ExifTool PLIST test +[PLIST, PLIST, Document] TestArray - Test Array: one, two, three +[PLIST, PLIST, Document] TestInteger - Test Integer: 256 +[PLIST, PLIST, Document] TestUnicode - Test Unicode: ExîfTöøl PLIST tést +[PLIST, PLIST, Time] TestDate - Test Date: 2013:02:22 07:49:10-05:00 +[PLIST, PLIST, Document] TestData - Test Data: (Binary data 12 bytes) +[PLIST, PLIST, Document] TestBoolean - Test Boolean: False diff --git a/t/PLIST_4.out b/t/PLIST_4.out new file mode 100644 index 0000000..9e09871 --- /dev/null +++ b/t/PLIST_4.out @@ -0,0 +1,17 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: PLIST.aae +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 827 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2018:09:07 08:00:15-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:46-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: AAE +[File, File, Other] FileTypeExtension - File Type Extension: aae +[File, File, Other] MIMEType - MIME Type: application/vnd.apple.photos +[PLIST, XML, Document] adjustmentBaseVersion - Adjustment Base Version: 0 +[PLIST, XML, Document] adjustmentData - Adjustment Data: (Binary data 208 bytes) +[PLIST, XML, Document] adjustmentEditorBundleID - Adjustment Editor Bundle ID: +[PLIST, XML, Document] adjustmentFormatIdentifier - Adjustment Format Identifier: com.apple.video.slomo +[PLIST, XML, Document] adjustmentFormatVersion - Adjustment Format Version: 1.1 +[PLIST, XML, Document] adjustmentRenderTypes - Adjustment Render Types: 0 diff --git a/t/PLUS.t b/t/PLUS.t new file mode 100644 index 0000000..0d54caf --- /dev/null +++ b/t/PLUS.t @@ -0,0 +1,46 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PLUS.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::PLUS; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PLUS'; +my $testnum = 1; + +# test 2: Extract information from PLUS.xmp +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/PLUS.xmp', 'xmp:all'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Copy PLUS information to a new file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/PLUS.xmp','all:all'); + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + my $ok = writeInfo($exifTool,undef,$testfile); + my $info = $exifTool->ImageInfo($testfile, 'xmp:all'); + if (check($exifTool, $info, $testname, $testnum, 2) and $ok) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + + +# end diff --git a/t/PLUS_2.out b/t/PLUS_2.out new file mode 100644 index 0000000..71ab96e --- /dev/null +++ b/t/PLUS_2.out @@ -0,0 +1,31 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 10.15 +[XMP, XMP-iptcExt, Image] DigitalSourceType - Digital Source Type: https://exiftool.org +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] format - Format: image/tiff +[XMP, XMP-dc, Author] rights - Rights: Copyright © 2016 Phil Harvey +[XMP, XMP-photoshop, Image] ColorMode - Color Mode: RGB +[XMP, XMP-photoshop, Image] ICCProfile - ICC Profile Name: Adobe RGB (1998) +[XMP, XMP-plus, Author] CopyrightOwnerCopyrightOwnerName - Copyright Owner Name: Phil Harvey +[XMP, XMP-plus, Author] CopyrightStatus - Copyright Status: Protected +[XMP, XMP-plus, Author] CreditLineRequired - Credit Line Required: Credit Adjacent To Image +[XMP, XMP-plus, Author] ImageAlterationConstraints - Image Alteration Constraints: No Cropping, No Flipping, No Retouching, No Colorization, No De-Colorization, No Merging +[XMP, XMP-plus, Author] ImageCreatorImageCreatorName - Image Creator Name: Phil Harvey +[XMP, XMP-plus, Author] ImageDuplicationConstraints - Image Duplication Constraints: No Duplication +[XMP, XMP-plus, Author] ImageFileConstraints - Image File Constraints: Maintain File Name, Maintain ID in File Name, Maintain Metadata, Maintain File Type +[XMP, XMP-plus, Author] ImageFileFormatAsDelivered - Image File Format As Delivered: JPEG Interchange Formats (JPG, JIF, JFIF) +[XMP, XMP-plus, Author] ImageFileSizeAsDelivered - Image File Size As Delivered: Up to 50 MB +[XMP, XMP-plus, Author] ImageSupplierImageSupplierName - Image Supplier Name: Phil Harvey +[XMP, XMP-plus, Author] LicensorLicensorName - Licensor Name: Phil Harvey +[XMP, XMP-plus, Author] MediaSummaryCode - Media Summary Code: PLUS V0121 (LDF Version 1.21) U004 (4 Media Usages:); 1IBB (28 Usage Items:) 1UNA (Usage Number A) 2EMA (Advertising|Email|All Email Types|Internet Email) 3PTZ (Multiple Placements on Any Pages) 4SBG (Any Size Image|Up To Full Screen Ad) 5VUP (Single Version) 6QUL (Any Quantity) 7DWM (In Perpetuity) 8RAU (Oceania|Australia) 8IAD (Advertising and Marketing) 8IAG (Agriculture, Farming and Horticulture) 8IAR (Architecture and Engineering) 8IAE (Arts and Entertainment) 8IBR (Broadcast Media) 8IEC (Ecology, Environmental and Conservation) 8IEN (Energy, Utilities and Fuel) 8IEV (Events and Conventions) 8IFO (Forestry and Wood Products) 8IGL (Gardening and Landscaping) 8IGR (Graphic Design) 8IHH (Hotels and Hospitality) 8IIM (Industry and Manufacturing) 8INP (Not For Profit, Social, Charitable) 8IPR (Public Relations) 8IPM (Publishing Media) 8ISM (Retail Sales and Marketing) 8ITR (Travel and Tourism) 8LEN (English) 9EXC (All Exclusive); 1IBB (28 Usage Items:) 1UNB (Usage Number B) 2BFT (Personal Use|Website|Web Page, All Types|All Electronic Distribution Formats) 3PTZ (Multiple Placements on Any Pages) 4SKG (Any Size Image|Any Size Screen) 5VUP (Single Version) 6QUL (Any Quantity) 7DWM (In Perpetuity) 8RAU (Oceania|Australia) 8IAD (Advertising and Marketing) 8IAG (Agriculture, Farming and Horticulture) 8IAR (Architecture and Engineering) 8IAE (Arts and Entertainment) 8IBR (Broadcast Media) 8IEC (Ecology, Environmental and Conservation) 8IEN (Energy, Utilities and Fuel) 8IEV (Events and Conventions) 8IFO (Forestry and Wood Products) 8IGL (Gardening and Landscaping) 8IGR (Graphic Design) 8IHH (Hotels and Hospitality) 8IIM (Industry and Manufacturing) 8INP (Not For Profit, Social, Charitable) 8IPO (Personal Use Only) 8IPR (Public Relations) 8IPM (Publishing Media) 8ITR (Travel and Tourism) 8LEN (English) 9EXC (All Exclusive); 1IBA (27 Usage Items:) 1UNC (Usage Number C) 2BOS (Advertising|Art|Art Display, All Art Types|Electronic Display) 3PSD (Multiple Placements on Screen) 4SDL (Up To Full Screen Image|Any Size Screen) 5VUP (Single Version) 6QCX (One|Display) 7DWM (In Perpetuity) 8RAU (Oceania|Australia) 8IAD (Advertising and Marketing) 8IAG (Agriculture, Farming and Horticulture) 8IAR (Architecture and Engineering) 8IAE (Arts and Entertainment) 8IBR (Broadcast Media) 8IEC (Ecology, Environmental and Conservation) 8IEN (Energy, Utilities and Fuel) 8IEV (Events and Conventions) 8IFO (Forestry and Wood Products) 8IGL (Gardening and Landscaping) 8IGR (Graphic Design) 8IHH (Hotels and Hospitality) 8IIM (Industry and Manufacturing) 8INP (Not For Profit, Social, Charitable) 8IPR (Public Relations) 8IPM (Publishing Media) 8ITR (Travel and Tourism) 8LEN (English) 9EXC (All Exclusive); 1IBA (27 Usage Items:) 1UND (Usage Number D) 2FET (Advertising|Marketing Materials|Promotional E-card|Internet Email) 3PRV (Multiple Placements on Both Sides) 4SLA (Any Size Image|Any Size Pages) 5VUP (Single Version) 6QCH (One|Copy) 7DWM (In Perpetuity) 8RAU (Oceania|Australia) 8IAD (Advertising and Marketing) 8IAG (Agriculture, Farming and Horticulture) 8IAR (Architecture and Engineering) 8IAE (Arts and Entertainment) 8IBR (Broadcast Media) 8IEC (Ecology, Environmental and Conservation) 8IEN (Energy, Utilities and Fuel) 8IEV (Events and Conventions) 8IFO (Forestry and Wood Products) 8IGL (Gardening and Landscaping) 8IGR (Graphic Design) 8IHH (Hotels and Hospitality) 8IIM (Industry and Manufacturing) 8INP (Not For Profit, Social, Charitable) 8IPR (Public Relations) 8IPM (Publishing Media) 8ITR (Travel and Tourism) 8LEN (English) 9EXC (All Exclusive) +[XMP, XMP-plus, Author] Reuse - Reuse: Not Applicable +[XMP, XMP-plus, Author] Version - PLUS Version: 1.2.0 +[XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8, 8, 8 +[XMP, XMP-tiff, Image] ImageLength - Image Height: 1 +[XMP, XMP-tiff, Image] ImageWidth - Image Width: 1 +[XMP, XMP-tiff, Image] PhotometricInterpretation - Photometric Interpretation: RGB +[XMP, XMP-tiff, Image] SamplesPerPixel - Samples Per Pixel: 3 +[XMP, XMP-xmp, Image] CreatorTool - Creator Tool: Adobe Photoshop CS5 Windows +[XMP, XMP-xmp, Time] MetadataDate - Metadata Date: 2016:05:18 12:54:01-05:00 +[XMP, XMP-xmp, Image] Rating - Rating: 0 +[XMP, XMP-xmpRights, Author] Marked - Marked: True +[XMP, XMP-xmpRights, Author] UsageTerms - Usage Terms: Phil Harvey diff --git a/t/PNG.t b/t/PNG.t new file mode 100644 index 0000000..08fc7d8 --- /dev/null +++ b/t/PNG.t @@ -0,0 +1,141 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PNG.t". + +BEGIN { + $| = 1; print "1..7\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::PNG; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PNG'; +my $testnum = 1; + +# test 2: Extract information from PNG.png +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/PNG.png'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write a bunch of new information to a PNG in memory +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/IPTC.jpg'); + $exifTool->SetNewValuesFromFile('t/images/XMP.jpg'); + $exifTool->SetNewValue('PNG:Comment'); # and delete a tag + $exifTool->SetNewValue('PixelsPerUnitX', 1234); + my $image; + my $rtnVal = $exifTool->WriteInfo('t/images/PNG.png', \$image); + # must ignore FileSize because size is variable (depends on Zlib availability) + my $info = $exifTool->ImageInfo(\$image, '-filesize'); + my $testfile = "t/${testname}_${testnum}_failed.png"; + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; # erase results of any bad test + } else { + # save the bad image + open(TESTFILE,">$testfile"); + binmode(TESTFILE); + print TESTFILE $image; + close(TESTFILE); + print 'not '; + } + print "ok $testnum\n"; +} + +# test 4: Test group delete, alternate languages and special characters +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Charset => 'Latin'); + $exifTool->SetNewValue('PNG:*'); + $exifTool->SetNewValue('XMP:*'); + $exifTool->SetNewValue('PNG:Comment-fr', "Commentaire fran\xe7aise"); + $exifTool->SetNewValue('PNG:Copyright', "\xa9 2010 Phil Harvey"); + $exifTool->SetNewValue('XMP:Description-bar' => "A Br\xfcn is a Gst\xf6"); + my $testfile = "t/${testname}_${testnum}_failed.png"; + unlink $testfile; + my $rtnVal = $exifTool->WriteInfo('t/images/PNG.png', $testfile); + $exifTool->Options(Charset => 'UTF8'); + my $info = $exifTool->ImageInfo($testfile, 'PNG:*', 'XMP:*'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; # erase results of any bad test + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 5: Try moving XMP from after IDAT to before +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $image; + # delete all XMP then copy back again (should move to before IDAT) + $exifTool->SetNewValue(); + my $txtfile = "t/${testname}_${testnum}.failed"; + open PNG_TEST_5, ">$txtfile" or warn "Error opening $txtfile\n"; + $exifTool->Options(Verbose => 2); + $exifTool->Options(TextOut => \*PNG_TEST_5); + $exifTool->SetNewValue('xmp:all'); + $exifTool->SetNewValuesFromFile('t/images/PNG.png', 'all:all<xmp:all'); + my $rtnVal = $exifTool->WriteInfo('t/images/PNG.png', \$image); + close PNG_TEST_5; + if (testCompare('t/PNG_5.out', $txtfile, $testnum)) { + unlink $txtfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 6: Write EXIF +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue('EXIF:Artist' => 'me'); + my $testfile = "t/${testname}_${testnum}_failed.png"; + unlink $testfile; + my $rtnVal = $exifTool->WriteInfo('t/images/PNG.png', $testfile); + $exifTool->Options(Charset => 'UTF8'); + my $info = $exifTool->ImageInfo($testfile, 'EXIF:*'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 7: Write ICC_Profile with a name +{ + ++$testnum; + my $skip = ''; + if (eval 'require Compress::Zlib') { + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/ICC_Profile.icc', 'ICC_Profile'); + $exifTool->SetNewValue('PNG:ProfileName' => 'Adobe RGB (1998)'); + my $testfile = "t/${testname}_${testnum}_failed.png"; + unlink $testfile; + my $rtnVal = $exifTool->WriteInfo('t/images/PNG.png', $testfile); + my $info = $exifTool->ImageInfo($testfile, 'ProfileName', 'ProfileCMMType'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + } else { + $skip = ' # skip Requires Compress::Zlib'; + } + print "ok $testnum$skip\n"; +} + +# end diff --git a/t/PNG_2.out b/t/PNG_2.out new file mode 100644 index 0000000..ba04cf2 --- /dev/null +++ b/t/PNG_2.out @@ -0,0 +1,25 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.29 +[ExifTool, ExifTool, ExifTool] Warning - Warning: [minor] Text/EXIF chunk(s) found after PNG IDAT (may be ignored by some readers) +[File, System, Other] FileName - File Name: PNG.png +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 572 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2014:07:23 09:04:15-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2021:07:08 07:19:03-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: PNG +[File, File, Other] FileTypeExtension - File Type Extension: png +[File, File, Other] MIMEType - MIME Type: image/png +[PNG, PNG, Image] 0 - Image Width: 16 +[PNG, PNG, Image] 4 - Image Height: 16 +[PNG, PNG, Image] 8 - Bit Depth: 1 +[PNG, PNG, Image] 9 - Color Type: Grayscale +[PNG, PNG, Image] 10 - Compression: Deflate/Inflate +[PNG, PNG, Image] 11 - Filter: Adaptive +[PNG, PNG, Image] 12 - Interlace: Noninterlaced +[PNG, PNG, Image] bKGD - Background Color: 0 +[PNG, PNG, Image] Comment - Comment: test comment +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 6.51 +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[Composite, Composite, Image] Exif-ImageSize - Image Size: 16x16 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000256 diff --git a/t/PNG_3.out b/t/PNG_3.out new file mode 100644 index 0000000..709eb70 --- /dev/null +++ b/t/PNG_3.out @@ -0,0 +1,123 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, File, Other] FileType - File Type: PNG +[File, File, Other] FileTypeExtension - File Type Extension: png +[File, File, Other] MIMEType - MIME Type: image/png +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[PNG, PNG, Image] 0 - Image Width: 16 +[PNG, PNG, Image] 4 - Image Height: 16 +[PNG, PNG, Image] 8 - Bit Depth: 1 +[PNG, PNG, Image] 9 - Color Type: Grayscale +[PNG, PNG, Image] 10 - Compression: Deflate/Inflate +[PNG, PNG, Image] 11 - Filter: Adaptive +[PNG, PNG, Image] 12 - Interlace: Noninterlaced +[PNG, PNG, Image] bKGD - Background Color: 0 +[PNG, PNG, Author] Artist - Artist: Phil Harvey +[PNG, PNG, Author] Copyright - Copyright: Copyright 2004 Phil Harvey +[PNG, PNG, Image] Description - Description: UTF-16 (big-endian) encoded XMP +[PNG, PNG, Camera] Make - Make: FUJIFILM +[PNG, PNG, Camera] Model - Model: FinePix2400Zoom +[PNG, PNG, Image] Software - Software: Adobe Photoshop 7.0 +[PNG, PNG, Image] Source - Source: I'm the source +[PNG, PNG, Image] Title - Title: Test IPTC picture +[PNG, PNG, Image] URL - URL: https://exiftool.org/ +[PNG, PNG, Time] create-date - Create Date: 2001:05:19 18:36:41 +[PNG, PNG, Time] tIME - Modify Date: 2004:02:26 09:36:46 +[PNG, PNG-pHYs, Image] 0 - Pixels Per Unit X: 1234 +[PNG, PNG-pHYs, Image] 4 - Pixels Per Unit Y: 2834 +[PNG, PNG-pHYs, Image] 8 - Pixel Units: meters +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.03 +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: UTF-16 (big-endian) encoded XMP +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP +[XMP, XMP-dc, Image] title - Title: Test IPTC picture +[XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: Y, Cb, Cr, - +[XMP, XMP-exif, Image] CompressedBitsPerPixel - Compressed Bits Per Pixel: 1.6 +[XMP, XMP-exif, Camera] FlashFired - Flash Fired: True +[XMP, XMP-exif, Camera] FlashFunction - Flash Function: False +[XMP, XMP-exif, Camera] FlashMode - Flash Mode: Unknown +[XMP, XMP-exif, Camera] FlashRedEyeMode - Flash Red Eye Mode: False +[XMP, XMP-exif, Camera] FlashReturn - Flash Return: No return detection +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: My Position +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: I wrote it +[XMP, XMP-photoshop, Location] Country - Country: Canada +[XMP, XMP-photoshop, Image] Instructions - Instructions: What instructions +[XMP, XMP-photoshop, Location] State - State: Ont +[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: What is a transmission reference? +[XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8 +[XMP, XMP-tiff, Image] Compression - Compression: JPEG (old-style) +[XMP, XMP-tiff, Image] ImageLength - Image Height: 8 +[XMP, XMP-tiff, Image] ImageWidth - Image Width: 8 +[XMP, XMP-tiff, Image] YCbCrPositioning - Y Cb Cr Positioning: Co-sited +[XMP, XMP-tiff, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:4cc7b857-69d0-11d8-8ac4-bb59c92f0d9a +[XMP, XMP-xmpRights, Author] Marked - Marked: False +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 5 - Object Name: Test IPTC picture +[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Other] 15 - Category: 1 +[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing, image, utilities +[IPTC, IPTC, Other] 25 - Keywords: ExifTool, Test, IPTC +[IPTC, IPTC, Other] 40 - Special Instructions: What instructions +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC, Author] 80 - By-line: Phil Harvey +[IPTC, IPTC, Author] 85 - By-line Title: My Position +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ont +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 103 - Original Transmission Reference: What is a transmission reference +[IPTC, IPTC, Other] 105 - Headline: No headline +[IPTC, IPTC, Author] 110 - Credit: My Credit +[IPTC, IPTC, Author] 115 - Source: I'm the source +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright 2004 Phil Harvey +[IPTC, IPTC, Other] 120 - Caption-Abstract: A witty caption +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it +[Photoshop, Photoshop, Author] 1034 - Copyright Flag: False +[Photoshop, Photoshop, Author] 1035 - URL: https://exiftool.org/ +[Photoshop, Photoshop, Image] 1037 - Global Angle: 30 +[Photoshop, Photoshop, Image] 1049 - Global Altitude: 30 +[EXIF, IFD0, Image] 270 - Image Description: A witty caption +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2004:02:26 09:36:46 +[EXIF, IFD0, Author] 315 - Artist: Phil Harvey +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, IFD0, Author] 33432 - Copyright: Copyright 2004 Phil Harvey +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 100 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 80 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/64 +[Composite, Composite, Camera] XMP-Flash - Flash: Fired +[Composite, Composite, Image] Exif-ImageSize - Image Size: 16x16 +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.6 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000256 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 6.0 mm diff --git a/t/PNG_4.out b/t/PNG_4.out new file mode 100644 index 0000000..859df5d --- /dev/null +++ b/t/PNG_4.out @@ -0,0 +1,12 @@ +[PNG, PNG, Image] 0 - Image Width: 16 +[PNG, PNG, Image] 4 - Image Height: 16 +[PNG, PNG, Image] 8 - Bit Depth: 1 +[PNG, PNG, Image] 9 - Color Type: Grayscale +[PNG, PNG, Image] 10 - Compression: Deflate/Inflate +[PNG, PNG, Image] 11 - Filter: Adaptive +[PNG, PNG, Image] 12 - Interlace: Noninterlaced +[PNG, PNG, Image] bKGD - Background Color: 0 +[PNG, PNG, Image] Comment-fr - Comment (fr): Commentaire française +[PNG, PNG, Author] Copyright - Copyright: © 2010 Phil Harvey +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 8.44 +[XMP, XMP-dc, Image] description-bar - Description (bar): A Brün is a Gstö diff --git a/t/PNG_5.out b/t/PNG_5.out new file mode 100644 index 0000000..69bd342 --- /dev/null +++ b/t/PNG_5.out @@ -0,0 +1,24 @@ + Deleting tags in: XMP XMP-* +Sorry, XMP-x:XMPToolkit is unsafe for writing + Writing new tags after deleting groups: XMP XMP-* +Writing XMP-dc:Creator +Rewriting t/images/PNG.png... + Editing tags in: PNG XMP + Creating tags in: PNG XMP + FileType = PNG + FileTypeExtension = PNG + MIMEType = image/png +PNG IHDR (13 bytes): +PNG bKGD (2 bytes): + Moving tEXt from after IDAT (20 bytes) +PNG tEXt (20 bytes): + Moving iTXt from after IDAT (443 bytes) +PNG iTXt (443 bytes): + Deleting XMP + Rewriting XMP + + XMP-dc:Creator = 'Phil Harvey' +PNG IDAT (1 chunk, total 14 bytes) + Warning = [minor] Text/EXIF chunk(s) found after PNG IDAT (fixed) + Deleting tEXt that was moved (20 bytes) + Deleting iTXt that was moved (443 bytes) +PNG IEND (end of image) diff --git a/t/PNG_6.out b/t/PNG_6.out new file mode 100644 index 0000000..48c53de --- /dev/null +++ b/t/PNG_6.out @@ -0,0 +1,5 @@ +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Author] 315 - Artist: me +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered diff --git a/t/PNG_7.out b/t/PNG_7.out new file mode 100644 index 0000000..0e8bba3 --- /dev/null +++ b/t/PNG_7.out @@ -0,0 +1,2 @@ +[PNG, PNG, Image] iCCP-name - Profile Name: Adobe RGB (1998) +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Nikon Corporation diff --git a/t/PPM.t b/t/PPM.t new file mode 100644 index 0000000..9ff0c77 --- /dev/null +++ b/t/PPM.t @@ -0,0 +1,41 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PPM.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::PPM; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PPM'; +my $testnum = 1; + +# test 2: Extract information from PPM.bmp +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/PPM.ppm'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write new comments to PPM in memory +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue('Comment', 'A new comment'); + my $image; + $exifTool->WriteInfo('t/images/PPM.ppm', \$image); + $exifTool->Options(Unknown => 1, Binary => 0, ListJoin => ', '); + my $info = $exifTool->ImageInfo(\$image); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/PPM_2.out b/t/PPM_2.out new file mode 100644 index 0000000..988d42c --- /dev/null +++ b/t/PPM_2.out @@ -0,0 +1,17 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: PPM.ppm +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 223 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2005:11:14 14:47:21-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:18-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: PPM +[File, File, Other] FileTypeExtension - File Type Extension: ppm +[File, File, Other] MIMEType - MIME Type: image/x-portable-pixmap +[File, File, Image] Comment - Comment: ExifTool PPM test +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] MaxVal - Max Val: 255 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/PPM_3.out b/t/PPM_3.out new file mode 100644 index 0000000..34b1a84 --- /dev/null +++ b/t/PPM_3.out @@ -0,0 +1,11 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileSize - File Size: 219 bytes +[File, File, Other] FileType - File Type: PPM +[File, File, Other] FileTypeExtension - File Type Extension: ppm +[File, File, Other] MIMEType - MIME Type: image/x-portable-pixmap +[File, File, Image] Comment - Comment: A new comment +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] MaxVal - Max Val: 255 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/PSP.t b/t/PSP.t new file mode 100644 index 0000000..121ce1d --- /dev/null +++ b/t/PSP.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PSP.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::PSP; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PSP'; +my $testnum = 1; + +# test 2: Extract information from PSP file +{ + my $exifTool = new Image::ExifTool; + ++$testnum; + my $info = $exifTool->ImageInfo('t/images/PSP.psp'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/PSP_2.out b/t/PSP_2.out new file mode 100644 index 0000000..cb9a3c9 --- /dev/null +++ b/t/PSP_2.out @@ -0,0 +1,34 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: PSP.psp +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1703 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:01:28 11:15:22-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:19-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: PSP +[File, File, Other] FileTypeExtension - File Type Extension: psp +[File, File, Other] MIMEType - MIME Type: image/x-paintshoppro +[PSP, PSP, Image] FileVersion - File Version: 10.0 +[PSP, PSP, Image] 0 - Image Width: 8 +[PSP, PSP, Image] 4 - Image Height: 8 +[PSP, PSP, Image] 8 - Image Resolution: 200 +[PSP, PSP, Image] 16 - Resolution Unit: inches +[PSP, PSP, Image] 17 - Compression: LZ77 +[PSP, PSP, Image] 19 - Bits Per Sample: 24 +[PSP, PSP, Image] 21 - Planes: 1 +[PSP, PSP, Image] 23 - Num Colors: 16777216 +[PSP, PSP, Image] 0 - Title: Test Image +[PSP, PSP, Time] 1 - Create Date: 2010:01:28 09:23:21-05:00 +[PSP, PSP, Time] 2 - Modify Date: 2010:01:28 09:30:26-05:00 +[PSP, PSP, Author] 3 - Artist: Phil Harvey +[PSP, PSP, Author] 4 - Copyright: © 2010 Phil Harvey +[PSP, PSP, Image] 5 - Description: A description +[PSP, PSP, Image] 6 - Creator App ID: Paint Shop Pro +[PSP, PSP, Image] 7 - Creator App Version: 13.0.0.0 +[EXIF, IFD0, Author] 33432 - Copyright: © 2010 Phil Harvey +[EXIF, IFD0, Image] 282 - X Resolution: 200 +[EXIF, IFD0, Image] 283 - Y Resolution: 200 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/Palm.t b/t/Palm.t new file mode 100644 index 0000000..13ada80 --- /dev/null +++ b/t/Palm.t @@ -0,0 +1,28 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Palm.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Palm; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Palm'; +my $testnum = 1; + +# test 2: Extract information from MOBI book +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Palm.mobi'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/Palm_2.out b/t/Palm_2.out new file mode 100644 index 0000000..56931a2 --- /dev/null +++ b/t/Palm_2.out @@ -0,0 +1,32 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Palm.mobi +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1382 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2014:05:29 12:42:41-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: MOBI +[File, File, Other] FileTypeExtension - File Type Extension: mobi +[File, File, Other] MIMEType - MIME Type: application/x-mobipocket-ebook +[Palm, Palm, Document] 0 - Database Name: El_Diezmo_Continua_Vigente +[Palm, Palm, Time] 9 - Create Date: 2014:05:27 20:00:51-04:00 +[Palm, Palm, Time] 10 - Modify Date: 2014:05:27 20:00:51-04:00 +[Palm, Palm, Time] 11 - Last Backup Date: 0000:00:00 00:00:00 +[Palm, Palm, Document] 12 - Modification Number: 0 +[Palm, Palm, Document] 15 - Palm File Type: Mobipocket +[Palm, MOBI, Document] 0 - Compression: PalmDOC +[Palm, MOBI, Document] 1 - Uncompressed Text Length: 172 kB +[Palm, MOBI, Document] 3 - Encryption: None +[Palm, MOBI, Document] 6 - Mobi Type: Mobipocket Book +[Palm, MOBI, Document] 7 - Code Page: Windows Latin 1 (Western European) +[Palm, MOBI, Document] 9 - Mobi Version: 6 +[Palm, MOBI, Document] 21 - Book Name: El Diezmo Continua Vigente +[Palm, MOBI, Document] 26 - Minimum Version: 6 +[Palm, MOBI, Author] 100 - Author: Mike Peralta +[Palm, MOBI, Document] 108 - Contributor: Smashwords, Inc. +[Palm, MOBI, Document] 103 - Description: Hebreos 7:8 “Y aquí ciertamente reciben los diezmos hombres mortales; pero allí, uno [Jesucristo] de quien se da testimonio de que [Jesucristo] vive.†Basado en Hebreos 7:8, Jesús ahora recibe nuestros diezmos y esta en el Nuevo Testamento. Aquellos que dicen que el diezmo ya no se aplica están hablando falsamente y directamente opuestos al evangelio del Nuevo Testamento de Jesucristo. +[Palm, MOBI, Document] 204 - Creator Software: Kindlegen (Linux) +[Palm, MOBI, Document] 205 - Creator Major Version: 1 +[Palm, MOBI, Document] 206 - Creator Minor Version: 1 +[Palm, MOBI, Document] 207 - Creator Build Number: 98 diff --git a/t/Panasonic.t b/t/Panasonic.t new file mode 100644 index 0000000..2120988 --- /dev/null +++ b/t/Panasonic.t @@ -0,0 +1,61 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Panasonic.t". + +BEGIN { + $| = 1; print "1..5\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Panasonic; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Panasonic'; +my $testnum = 1; + +# test 2: Extract information from Panasonic.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Panasonic.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + ['Keywords' => 'cool'], + ['ShootingMode' => 'Panning'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 4: Extract information from RW2 image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Panasonic.rw2'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 5: Write to RW2 image +{ + ++$testnum; + my @writeInfo = ( + ['XMP:Title' => 'new title'], + ['IPTC:Keywords' => 'a keyword'], + ['ModifyDate' => '2009:03:25 12:11:46'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, "t/images/$testname.rw2"); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Panasonic_2.out b/t/Panasonic_2.out new file mode 100644 index 0000000..979990b --- /dev/null +++ b/t/Panasonic_2.out @@ -0,0 +1,102 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Panasonic.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 7.1 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: Panasonic +[EXIF, IFD0, Camera] 272 - Camera Model Name: DMC-FZ3 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2004:08:28 15:55:46 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/400 +[EXIF, ExifIFD, Image] 33437 - F Number: 4.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 80 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2004:08:28 15:55:46 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2004:08:28 15:55:46 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 4 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 4.6 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2016 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1512 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 0 +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 35 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: None +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 6822 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Panasonic, Camera] 1 - Image Quality: High +[MakerNotes, Panasonic, Camera] 2 - Firmware Version: 0.1.0.8 +[MakerNotes, Panasonic, Camera] 3 - White Balance: Auto +[MakerNotes, Panasonic, Camera] 7 - Focus Mode: Auto +[MakerNotes, Panasonic, Camera] 15 - AF Area Mode: 9-area +[MakerNotes, Panasonic, Camera] 26 - Image Stabilization: On, Mode 2 +[MakerNotes, Panasonic, Camera] 28 - Macro Mode: Off +[MakerNotes, Panasonic, Camera] 31 - Shooting Mode: Program +[MakerNotes, Panasonic, Camera] 32 - Audio: No +[MakerNotes, Panasonic, Camera] 33 - Data Dump: (Binary data 5428 bytes) +[MakerNotes, Panasonic, Camera] 35 - White Balance Bias: 0 +[MakerNotes, Panasonic, Camera] 36 - Flash Bias: 0 +[MakerNotes, Panasonic, Camera] 37 - Internal Serial Number: (S00) 2004:07:19 no. 0102 +[MakerNotes, Panasonic, Camera] 38 - Panasonic Exif Version: 0100 +[MakerNotes, Panasonic, Camera] 39 - Video Frame Rate: n/a +[MakerNotes, Panasonic, Camera] 40 - Color Effect: Off +[MakerNotes, Panasonic, Camera] 41 - Time Since Power On: 00:00:06.96 +[MakerNotes, Panasonic, Camera] 42 - Burst Mode: Off +[MakerNotes, Panasonic, Camera] 43 - Sequence Number: 0 +[MakerNotes, Panasonic, Camera] 44 - Contrast Mode: Normal +[MakerNotes, Panasonic, Camera] 45 - Noise Reduction: Standard +[MakerNotes, Panasonic, Camera] 46 - Self Timer: Off +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[Composite, Composite, Image] Exif-Aperture - Aperture: 4.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 7.6 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/400 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.004 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 54.4 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 4.6 mm (35 mm equivalent: 35.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 1.34 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 13.0 diff --git a/t/Panasonic_3.out b/t/Panasonic_3.out new file mode 100644 index 0000000..af1edd9 --- /dev/null +++ b/t/Panasonic_3.out @@ -0,0 +1,121 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Panasonic_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 7.1 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: ff6b1fa510bbe0d2c2323752af38a86b +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: Panasonic +[EXIF, IFD0, Camera] 272 - Camera Model Name: DMC-FZ3 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2004:08:28 15:55:46 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/400 +[EXIF, ExifIFD, Image] 33437 - F Number: 4.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 80 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2004:08:28 15:55:46 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2004:08:28 15:55:46 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 4 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 4.6 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2016 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1512 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 0 +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 35 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: None +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 6812 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Panasonic, Camera] 1 - Image Quality: High +[MakerNotes, Panasonic, Camera] 2 - Firmware Version: 0.1.0.8 +[MakerNotes, Panasonic, Camera] 3 - White Balance: Auto +[MakerNotes, Panasonic, Camera] 7 - Focus Mode: Auto +[MakerNotes, Panasonic, Camera] 15 - AF Area Mode: 9-area +[MakerNotes, Panasonic, Camera] 26 - Image Stabilization: On, Mode 2 +[MakerNotes, Panasonic, Camera] 28 - Macro Mode: Off +[MakerNotes, Panasonic, Camera] 31 - Shooting Mode: Panning +[MakerNotes, Panasonic, Camera] 32 - Audio: No +[MakerNotes, Panasonic, Camera] 33 - Data Dump: (Binary data 5428 bytes) +[MakerNotes, Panasonic, Camera] 34 - Panasonic 0x0022: 0 +[MakerNotes, Panasonic, Camera] 35 - White Balance Bias: 0 +[MakerNotes, Panasonic, Camera] 36 - Flash Bias: 0 +[MakerNotes, Panasonic, Camera] 37 - Internal Serial Number: (S00) 2004:07:19 no. 0102 +[MakerNotes, Panasonic, Camera] 38 - Panasonic Exif Version: 0100 +[MakerNotes, Panasonic, Camera] 39 - Video Frame Rate: n/a +[MakerNotes, Panasonic, Camera] 40 - Color Effect: Off +[MakerNotes, Panasonic, Camera] 41 - Time Since Power On: 00:00:06.96 +[MakerNotes, Panasonic, Camera] 42 - Burst Mode: Off +[MakerNotes, Panasonic, Camera] 43 - Sequence Number: 0 +[MakerNotes, Panasonic, Camera] 44 - Contrast Mode: Normal +[MakerNotes, Panasonic, Camera] 45 - Noise Reduction: Standard +[MakerNotes, Panasonic, Camera] 46 - Self Timer: Off +[MakerNotes, Panasonic, Camera] 47 - Panasonic 0x002f: 4 +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[PrintIM, PrintIM, Printing] 1 - Print IM 0x0001: 0x00160016 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x00000000 +[PrintIM, PrintIM, Printing] 3 - Print IM 0x0003: 0x00000064 +[PrintIM, PrintIM, Printing] 7 - Print IM 0x0007: 0x00000000 +[PrintIM, PrintIM, Printing] 8 - Print IM 0x0008: 0x00000000 +[PrintIM, PrintIM, Printing] 9 - Print IM 0x0009: 0x00000000 +[PrintIM, PrintIM, Printing] 10 - Print IM 0x000a: 0x00000000 +[PrintIM, PrintIM, Printing] 11 - Print IM 0x000b: 0x000000ac +[PrintIM, PrintIM, Printing] 12 - Print IM 0x000c: 0x00000000 +[PrintIM, PrintIM, Printing] 13 - Print IM 0x000d: 0x00000000 +[PrintIM, PrintIM, Printing] 14 - Print IM 0x000e: 0x000000c4 +[PrintIM, PrintIM, Printing] 256 - Print IM 0x0100: 0x00000005 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x00000001 +[PrintIM, PrintIM, Printing] 272 - Print IM 0x0110: 0x00000080 +[IPTC, IPTC, Other] 25 - Keywords: cool +[IPTC, IPTC, Other] 0 - Application Record Version: 4 +[Composite, Composite, Image] Exif-Aperture - Aperture: 4.0 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/400 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-LightValue - Light Value: 13.0 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 7.6 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.004 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 54.4 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 4.6 mm (35 mm equivalent: 35.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 1.34 m diff --git a/t/Panasonic_4.out b/t/Panasonic_4.out new file mode 100644 index 0000000..e32b3c0 --- /dev/null +++ b/t/Panasonic_4.out @@ -0,0 +1,213 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Panasonic.rw2 +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 12 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2009:03:25 12:10:29-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: RW2 +[File, File, Other] FileTypeExtension - File Type Extension: rw2 +[File, File, Other] MIMEType - MIME Type: image/x-panasonic-rw2 +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 1 - Panasonic Raw Version: 0300 +[EXIF, IFD0, Image] 2 - Sensor Width: 3724 +[EXIF, IFD0, Image] 3 - Sensor Height: 2754 +[EXIF, IFD0, Image] 4 - Sensor Top Border: 6 +[EXIF, IFD0, Image] 5 - Sensor Left Border: 8 +[EXIF, IFD0, Image] 6 - Sensor Bottom Border: 2742 +[EXIF, IFD0, Image] 7 - Sensor Right Border: 3656 +[EXIF, IFD0, Image] 8 - Samples Per Pixel: 1 +[EXIF, IFD0, Image] 9 - CFA Pattern: [Blue,Green][Green,Red] +[EXIF, IFD0, Image] 10 - Bits Per Sample: 12 +[EXIF, IFD0, Image] 11 - Compression: Panasonic RAW 1 +[EXIF, IFD0, Image] 14 - Linearity Limit Red: 4095 +[EXIF, IFD0, Image] 15 - Linearity Limit Green: 4095 +[EXIF, IFD0, Image] 16 - Linearity Limit Blue: 4095 +[EXIF, IFD0, Image] 23 - ISO: 80 +[EXIF, IFD0, Image] 24 - High ISO Multiplier Red: 0 +[EXIF, IFD0, Image] 25 - High ISO Multiplier Green: 0 +[EXIF, IFD0, Image] 26 - High ISO Multiplier Blue: 0 +[EXIF, IFD0, Image] 27 - Noise Reduction Params: 3 100 1 1 1 200 2 2 2 400 4 4 4 +[EXIF, IFD0, Image] 28 - Black Level Red: 0 +[EXIF, IFD0, Image] 29 - Black Level Green: 0 +[EXIF, IFD0, Image] 30 - Black Level Blue: 0 +[EXIF, IFD0, Image] 36 - WB Red Level: 570 +[EXIF, IFD0, Image] 37 - WB Green Level: 263 +[EXIF, IFD0, Image] 38 - WB Blue Level: 438 +[EXIF, IFD0, Image] 45 - Raw Format: 4 +[EXIF, IFD0, Camera] 271 - Make: Panasonic +[EXIF, IFD0, Camera] 272 - Camera Model Name: DMC-LX3 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Ver.1.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2008:08:06 15:21:56 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/250 +[EXIF, ExifIFD, Image] 33437 - F Number: 4.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 80 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2008:08:06 15:21:56 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2008:08:06 15:21:56 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 5.1 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 1920 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1440 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 0 +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 24 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: None +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 180 +[EXIF, IFD1, Image] 283 - Y Resolution: 180 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 11976 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Preview] 46 - Jpg From Raw: (Binary data 10785 bytes) +[EXIF, IFD0, Camera] 271 - Make: Panasonic +[EXIF, IFD0, Camera] 272 - Camera Model Name: DMC-LX3 +[EXIF, IFD0, Image] 273 - Strip Offsets: 4294967295 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 278 - Rows Per Strip: 2754 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 20511792 +[EXIF, IFD0, Image] 280 - Raw Data Offset: 12322 +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/250 +[EXIF, ExifIFD, Image] 33437 - F Number: 4.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2008:08:06 15:21:56 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2008:08:06 15:21:56 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 5.1 mm +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[PanasonicRaw, PanasonicRaw, Other] 0 - Num WB Entries: 7 +[PanasonicRaw, PanasonicRaw, Other] 1 - WB Type 1: Fine Weather +[PanasonicRaw, PanasonicRaw, Other] 2 - WB RGB Levels 1: 573 256 416 +[PanasonicRaw, PanasonicRaw, Other] 5 - WB Type 2: Cloudy +[PanasonicRaw, PanasonicRaw, Other] 6 - WB RGB Levels 2: 630 256 387 +[PanasonicRaw, PanasonicRaw, Other] 9 - WB Type 3: Shade +[PanasonicRaw, PanasonicRaw, Other] 10 - WB RGB Levels 3: 702 256 355 +[PanasonicRaw, PanasonicRaw, Other] 13 - WB Type 4: Tungsten (Incandescent) +[PanasonicRaw, PanasonicRaw, Other] 14 - WB RGB Levels 4: 378 256 592 +[PanasonicRaw, PanasonicRaw, Other] 17 - WB Type 5: Flash +[PanasonicRaw, PanasonicRaw, Other] 18 - WB RGB Levels 5: 651 256 377 +[PanasonicRaw, PanasonicRaw, Other] 21 - WB Type 6: D55 +[PanasonicRaw, PanasonicRaw, Other] 22 - WB RGB Levels 6: 590 256 421 +[PanasonicRaw, PanasonicRaw, Other] 25 - WB Type 7: ISO Studio Tungsten +[PanasonicRaw, PanasonicRaw, Other] 26 - WB RGB Levels 7: 378 256 592 +[PanasonicRaw, PanasonicRaw, Image] 2 - Distortion Param 02: 0.010772705078125 +[PanasonicRaw, PanasonicRaw, Image] 4 - Distortion Param 04: 0.02056884765625 +[PanasonicRaw, PanasonicRaw, Image] 5 - Distortion Scale: 1 +[PanasonicRaw, PanasonicRaw, Image] 7.1 - Distortion Correction: On +[PanasonicRaw, PanasonicRaw, Image] 8 - Distortion Param 08: 0.12359619140625 +[PanasonicRaw, PanasonicRaw, Image] 9 - Distortion Param 09: 0.00579833984375 +[PanasonicRaw, PanasonicRaw, Image] 11 - Distortion Param 11: -0.02374267578125 +[MakerNotes, Panasonic, Camera] 1 - Image Quality: RAW +[MakerNotes, Panasonic, Camera] 2 - Firmware Version: 0.1.0.0 +[MakerNotes, Panasonic, Camera] 3 - White Balance: Auto +[MakerNotes, Panasonic, Camera] 7 - Focus Mode: Auto +[MakerNotes, Panasonic, Camera] 15 - AF Area Mode: 1-area +[MakerNotes, Panasonic, Camera] 26 - Image Stabilization: On, Mode 2 +[MakerNotes, Panasonic, Camera] 28 - Macro Mode: Off +[MakerNotes, Panasonic, Camera] 31 - Shooting Mode: Aperture Priority +[MakerNotes, Panasonic, Camera] 32 - Audio: No +[MakerNotes, Panasonic, Camera] 33 - Data Dump: (Binary data 8200 bytes) +[MakerNotes, Panasonic, Camera] 36 - Flash Bias: 0 +[MakerNotes, Panasonic, Camera] 37 - Internal Serial Number: (F35) 2008:07:01 no. 0058 +[MakerNotes, Panasonic, Camera] 38 - Panasonic Exif Version: 0270 +[MakerNotes, Panasonic, Camera] 39 - Video Frame Rate: n/a +[MakerNotes, Panasonic, Camera] 40 - Color Effect: Off +[MakerNotes, Panasonic, Camera] 41 - Time Since Power On: 00:10:33.08 +[MakerNotes, Panasonic, Camera] 42 - Burst Mode: Off +[MakerNotes, Panasonic, Camera] 43 - Sequence Number: 0 +[MakerNotes, Panasonic, Camera] 44 - Contrast Mode: Normal +[MakerNotes, Panasonic, Camera] 45 - Noise Reduction: Standard +[MakerNotes, Panasonic, Camera] 46 - Self Timer: Off +[MakerNotes, Panasonic, Camera] 48 - Rotation: Horizontal (normal) +[MakerNotes, Panasonic, Camera] 49 - AF Assist Lamp: Enabled but Not Used +[MakerNotes, Panasonic, Camera] 50 - Color Mode: Normal +[MakerNotes, Panasonic, Camera] 51 - Baby Age: (not set) +[MakerNotes, Panasonic, Camera] 52 - Optical Zoom Mode: Standard +[MakerNotes, Panasonic, Camera] 53 - Conversion Lens: Off +[MakerNotes, Panasonic, Camera] 54 - Travel Day: n/a +[MakerNotes, Panasonic, Camera] 56 - Battery Level: Full +[MakerNotes, Panasonic, Camera] 57 - Contrast: Normal +[MakerNotes, Panasonic, Camera] 58 - World Time Location: Home +[MakerNotes, Panasonic, Camera] 59 - Text Stamp: Off +[MakerNotes, Panasonic, Camera] 60 - Program ISO: 80 +[MakerNotes, Panasonic, Camera] 61 - Advanced Scene Type: 1 +[MakerNotes, Panasonic, Camera] 62 - Text Stamp: Off +[MakerNotes, Panasonic, Camera] 63 - Faces Detected: 0 +[MakerNotes, Panasonic, Camera] 64 - Saturation: Normal +[MakerNotes, Panasonic, Camera] 65 - Sharpness: Normal +[MakerNotes, Panasonic, Camera] 66 - Film Mode: Standard (color) +[MakerNotes, Panasonic, Camera] 67 - JPEG Quality: High +[MakerNotes, Panasonic, Camera] 68 - Color Temp Kelvin: 0 +[MakerNotes, Panasonic, Camera] 70 - WB Shift AB: 0 +[MakerNotes, Panasonic, Camera] 71 - WB Shift GM: 0 +[MakerNotes, Panasonic, Camera] 72 - Flash Curtain: n/a +[MakerNotes, Panasonic, Camera] 75 - Panasonic Image Width: 3648 +[MakerNotes, Panasonic, Camera] 76 - Panasonic Image Height: 2736 +[MakerNotes, Panasonic, Camera] 77 - AF Point Position: 0.5 0.5 +[MakerNotes, Panasonic, Image] 0 - Num Face Positions: 0 +[MakerNotes, Panasonic, Camera] 32768 - Maker Note Version: 0130 +[MakerNotes, Panasonic, Camera] 32769 - Scene Mode: Off +[MakerNotes, Panasonic, Camera] 32770 - Highlight Warning: Yes +[MakerNotes, Panasonic, Camera] 32771 - Dark Focus Environment: No +[MakerNotes, Panasonic, Camera] 32772 - WB Red Level: 2283 +[MakerNotes, Panasonic, Camera] 32773 - WB Green Level: 1054 +[MakerNotes, Panasonic, Camera] 32774 - WB Blue Level: 1752 +[MakerNotes, Panasonic, Camera] 32776 - Text Stamp: Off +[MakerNotes, Panasonic, Camera] 32777 - Text Stamp: Off +[MakerNotes, Panasonic, Camera] 32784 - Baby Age: (not set) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[Composite, Composite, Image] Exif-Aperture - Aperture: 4.0 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.665399 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 2.1673 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/250 +[Composite, Composite, Camera] Panasonic-AdvancedSceneMode - Advanced Scene Mode: Off +[Composite, Composite, Other] PanasonicRaw-ImageHeight - Image Height: 2736 +[Composite, Composite, Other] PanasonicRaw-ImageWidth - Image Width: 3648 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 3648x2736 +[Composite, Composite, Image] Exif-LightValue - Light Value: 12.3 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 10.0 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 4.7 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.006 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 73.7 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 5.1 mm (35 mm equivalent: 24.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 1.02 m diff --git a/t/Panasonic_5.out b/t/Panasonic_5.out new file mode 100644 index 0000000..962a7a7 --- /dev/null +++ b/t/Panasonic_5.out @@ -0,0 +1,244 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Panasonic_5_failed.rw2 +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 15 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:45-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: RW2 +[File, File, Other] FileTypeExtension - File Type Extension: rw2 +[File, File, Other] MIMEType - MIME Type: image/x-panasonic-rw2 +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 85c7e966b2683711ba91f562579e3d76 +[EXIF, IFD0, Image] 1 - Panasonic Raw Version: 0300 +[EXIF, IFD0, Image] 2 - Sensor Width: 3724 +[EXIF, IFD0, Image] 3 - Sensor Height: 2754 +[EXIF, IFD0, Image] 4 - Sensor Top Border: 6 +[EXIF, IFD0, Image] 5 - Sensor Left Border: 8 +[EXIF, IFD0, Image] 6 - Sensor Bottom Border: 2742 +[EXIF, IFD0, Image] 7 - Sensor Right Border: 3656 +[EXIF, IFD0, Image] 8 - Samples Per Pixel: 1 +[EXIF, IFD0, Image] 9 - CFA Pattern: [Blue,Green][Green,Red] +[EXIF, IFD0, Image] 10 - Bits Per Sample: 12 +[EXIF, IFD0, Image] 11 - Compression: Panasonic RAW 1 +[EXIF, IFD0, Image] 13 - Panasonic Raw 0x000d: 1 +[EXIF, IFD0, Image] 14 - Linearity Limit Red: 4095 +[EXIF, IFD0, Image] 15 - Linearity Limit Green: 4095 +[EXIF, IFD0, Image] 16 - Linearity Limit Blue: 4095 +[EXIF, IFD0, Image] 23 - ISO: 80 +[EXIF, IFD0, Image] 24 - High ISO Multiplier Red: 0 +[EXIF, IFD0, Image] 25 - High ISO Multiplier Green: 0 +[EXIF, IFD0, Image] 26 - High ISO Multiplier Blue: 0 +[EXIF, IFD0, Image] 27 - Noise Reduction Params: 3 100 1 1 1 200 2 2 2 400 4 4 4 +[EXIF, IFD0, Image] 28 - Black Level Red: 0 +[EXIF, IFD0, Image] 29 - Black Level Green: 0 +[EXIF, IFD0, Image] 30 - Black Level Blue: 0 +[EXIF, IFD0, Image] 36 - WB Red Level: 570 +[EXIF, IFD0, Image] 37 - WB Green Level: 263 +[EXIF, IFD0, Image] 38 - WB Blue Level: 438 +[EXIF, IFD0, Image] 45 - Raw Format: 4 +[EXIF, IFD0, Camera] 271 - Make: Panasonic +[EXIF, IFD0, Camera] 272 - Camera Model Name: DMC-LX3 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Ver.1.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2009:03:25 12:11:46 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/250 +[EXIF, ExifIFD, Image] 33437 - F Number: 4.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 80 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2008:08:06 15:21:56 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2008:08:06 15:21:56 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 5.1 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 1920 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1440 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 0 +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 24 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: None +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 180 +[EXIF, IFD1, Image] 283 - Y Resolution: 180 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 11042 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Preview] 46 - Jpg From Raw: (Binary data 10781 bytes) +[EXIF, IFD0, Camera] 271 - Make: Panasonic +[EXIF, IFD0, Camera] 272 - Camera Model Name: DMC-LX3 +[EXIF, IFD0, Image] 273 - Strip Offsets: 4294967295 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 278 - Rows Per Strip: 2754 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 20511792 +[EXIF, IFD0, Image] 280 - Raw Data Offset: 14554 +[EXIF, IFD0, Image] 282 - Panasonic Raw 0x011a: 1 +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/250 +[EXIF, ExifIFD, Image] 33437 - F Number: 4.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2008:08:06 15:21:56 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2008:08:06 15:21:56 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 5.1 mm +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[PanasonicRaw, PanasonicRaw, Other] 0 - Num WB Entries: 7 +[PanasonicRaw, PanasonicRaw, Other] 1 - WB Type 1: Fine Weather +[PanasonicRaw, PanasonicRaw, Other] 2 - WB RGB Levels 1: 573 256 416 +[PanasonicRaw, PanasonicRaw, Other] 5 - WB Type 2: Cloudy +[PanasonicRaw, PanasonicRaw, Other] 6 - WB RGB Levels 2: 630 256 387 +[PanasonicRaw, PanasonicRaw, Other] 9 - WB Type 3: Shade +[PanasonicRaw, PanasonicRaw, Other] 10 - WB RGB Levels 3: 702 256 355 +[PanasonicRaw, PanasonicRaw, Other] 13 - WB Type 4: Tungsten (Incandescent) +[PanasonicRaw, PanasonicRaw, Other] 14 - WB RGB Levels 4: 378 256 592 +[PanasonicRaw, PanasonicRaw, Other] 17 - WB Type 5: Flash +[PanasonicRaw, PanasonicRaw, Other] 18 - WB RGB Levels 5: 651 256 377 +[PanasonicRaw, PanasonicRaw, Other] 21 - WB Type 6: D55 +[PanasonicRaw, PanasonicRaw, Other] 22 - WB RGB Levels 6: 590 256 421 +[PanasonicRaw, PanasonicRaw, Other] 25 - WB Type 7: ISO Studio Tungsten +[PanasonicRaw, PanasonicRaw, Other] 26 - WB RGB Levels 7: 378 256 592 +[PanasonicRaw, PanasonicRaw, Image] 2 - Distortion Param 02: 0.010772705078125 +[PanasonicRaw, PanasonicRaw, Image] 4 - Distortion Param 04: 0.02056884765625 +[PanasonicRaw, PanasonicRaw, Image] 5 - Distortion Scale: 1 +[PanasonicRaw, PanasonicRaw, Image] 7.1 - Distortion Correction: On +[PanasonicRaw, PanasonicRaw, Image] 8 - Distortion Param 08: 0.12359619140625 +[PanasonicRaw, PanasonicRaw, Image] 9 - Distortion Param 09: 0.00579833984375 +[PanasonicRaw, PanasonicRaw, Image] 11 - Distortion Param 11: -0.02374267578125 +[PanasonicRaw, PanasonicRaw, Image] 12 - Distortion N: 2280 +[MakerNotes, Panasonic, Camera] 1 - Image Quality: RAW +[MakerNotes, Panasonic, Camera] 2 - Firmware Version: 0.1.0.0 +[MakerNotes, Panasonic, Camera] 3 - White Balance: Auto +[MakerNotes, Panasonic, Camera] 7 - Focus Mode: Auto +[MakerNotes, Panasonic, Camera] 15 - AF Area Mode: 1-area +[MakerNotes, Panasonic, Camera] 26 - Image Stabilization: On, Mode 2 +[MakerNotes, Panasonic, Camera] 28 - Macro Mode: Off +[MakerNotes, Panasonic, Camera] 31 - Shooting Mode: Aperture Priority +[MakerNotes, Panasonic, Camera] 32 - Audio: No +[MakerNotes, Panasonic, Camera] 33 - Data Dump: (Binary data 8200 bytes) +[MakerNotes, Panasonic, Camera] 34 - Panasonic 0x0022: 0 +[MakerNotes, Panasonic, Camera] 36 - Flash Bias: 0 +[MakerNotes, Panasonic, Camera] 37 - Internal Serial Number: (F35) 2008:07:01 no. 0058 +[MakerNotes, Panasonic, Camera] 38 - Panasonic Exif Version: 0270 +[MakerNotes, Panasonic, Camera] 39 - Video Frame Rate: n/a +[MakerNotes, Panasonic, Camera] 40 - Color Effect: Off +[MakerNotes, Panasonic, Camera] 41 - Time Since Power On: 00:10:33.08 +[MakerNotes, Panasonic, Camera] 42 - Burst Mode: Off +[MakerNotes, Panasonic, Camera] 43 - Sequence Number: 0 +[MakerNotes, Panasonic, Camera] 44 - Contrast Mode: Normal +[MakerNotes, Panasonic, Camera] 45 - Noise Reduction: Standard +[MakerNotes, Panasonic, Camera] 46 - Self Timer: Off +[MakerNotes, Panasonic, Camera] 47 - Panasonic 0x002f: 1 +[MakerNotes, Panasonic, Camera] 48 - Rotation: Horizontal (normal) +[MakerNotes, Panasonic, Camera] 49 - AF Assist Lamp: Enabled but Not Used +[MakerNotes, Panasonic, Camera] 50 - Color Mode: Normal +[MakerNotes, Panasonic, Camera] 51 - Baby Age: (not set) +[MakerNotes, Panasonic, Camera] 52 - Optical Zoom Mode: Standard +[MakerNotes, Panasonic, Camera] 53 - Conversion Lens: Off +[MakerNotes, Panasonic, Camera] 54 - Travel Day: n/a +[MakerNotes, Panasonic, Camera] 55 - Panasonic 0x0037: 257 +[MakerNotes, Panasonic, Camera] 56 - Battery Level: Full +[MakerNotes, Panasonic, Camera] 57 - Contrast: Normal +[MakerNotes, Panasonic, Camera] 58 - World Time Location: Home +[MakerNotes, Panasonic, Camera] 59 - Text Stamp: Off +[MakerNotes, Panasonic, Camera] 60 - Program ISO: 80 +[MakerNotes, Panasonic, Camera] 61 - Advanced Scene Type: 1 +[MakerNotes, Panasonic, Camera] 62 - Text Stamp: Off +[MakerNotes, Panasonic, Camera] 63 - Faces Detected: 0 +[MakerNotes, Panasonic, Camera] 64 - Saturation: Normal +[MakerNotes, Panasonic, Camera] 65 - Sharpness: Normal +[MakerNotes, Panasonic, Camera] 66 - Film Mode: Standard (color) +[MakerNotes, Panasonic, Camera] 67 - JPEG Quality: High +[MakerNotes, Panasonic, Camera] 68 - Color Temp Kelvin: 0 +[MakerNotes, Panasonic, Camera] 70 - WB Shift AB: 0 +[MakerNotes, Panasonic, Camera] 71 - WB Shift GM: 0 +[MakerNotes, Panasonic, Camera] 72 - Flash Curtain: n/a +[MakerNotes, Panasonic, Camera] 74 - Panasonic 0x004a: 0 +[MakerNotes, Panasonic, Camera] 75 - Panasonic Image Width: 3648 +[MakerNotes, Panasonic, Camera] 76 - Panasonic Image Height: 2736 +[MakerNotes, Panasonic, Camera] 77 - AF Point Position: 0.5 0.5 +[MakerNotes, Panasonic, Image] 0 - Num Face Positions: 0 +[MakerNotes, Panasonic, Camera] 79 - Panasonic 0x004f: 0 +[MakerNotes, Panasonic, Camera] 85 - Panasonic 0x0055: 1 +[MakerNotes, Panasonic, Camera] 87 - Panasonic 0x0057: 0 +[MakerNotes, Panasonic, Camera] 94 - Panasonic 0x005e: . +[MakerNotes, Panasonic, Camera] 32768 - Maker Note Version: 0130 +[MakerNotes, Panasonic, Camera] 32769 - Scene Mode: Off +[MakerNotes, Panasonic, Camera] 32770 - Highlight Warning: Yes +[MakerNotes, Panasonic, Camera] 32771 - Dark Focus Environment: No +[MakerNotes, Panasonic, Camera] 32772 - WB Red Level: 2283 +[MakerNotes, Panasonic, Camera] 32773 - WB Green Level: 1054 +[MakerNotes, Panasonic, Camera] 32774 - WB Blue Level: 1752 +[MakerNotes, Panasonic, Camera] 32775 - Panasonic 0x8007: 1 +[MakerNotes, Panasonic, Camera] 32776 - Text Stamp: Off +[MakerNotes, Panasonic, Camera] 32777 - Text Stamp: Off +[MakerNotes, Panasonic, Camera] 32784 - Baby Age: (not set) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[PrintIM, PrintIM, Printing] 1 - Print IM 0x0001: 0x00160016 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x00000000 +[PrintIM, PrintIM, Printing] 3 - Print IM 0x0003: 0x00000064 +[PrintIM, PrintIM, Printing] 7 - Print IM 0x0007: 0x00000000 +[PrintIM, PrintIM, Printing] 8 - Print IM 0x0008: 0x00000000 +[PrintIM, PrintIM, Printing] 9 - Print IM 0x0009: 0x00000000 +[PrintIM, PrintIM, Printing] 10 - Print IM 0x000a: 0x00000000 +[PrintIM, PrintIM, Printing] 11 - Print IM 0x000b: 0x000000ac +[PrintIM, PrintIM, Printing] 12 - Print IM 0x000c: 0x00000000 +[PrintIM, PrintIM, Printing] 13 - Print IM 0x000d: 0x00000000 +[PrintIM, PrintIM, Printing] 14 - Print IM 0x000e: 0x000000c4 +[PrintIM, PrintIM, Printing] 256 - Print IM 0x0100: 0x00000005 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x00000001 +[PrintIM, PrintIM, Printing] 272 - Print IM 0x0110: 0x00000080 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-dc, Image] title - Title: new title +[IPTC, IPTC, Other] 25 - Keywords: a keyword +[IPTC, IPTC, Other] 0 - Application Record Version: 4 +[Composite, Composite, Image] Exif-Aperture - Aperture: 4.0 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.665399 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 2.1673 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/250 +[Composite, Composite, Camera] Panasonic-AdvancedSceneMode - Advanced Scene Mode: Off +[Composite, Composite, Other] PanasonicRaw-ImageHeight - Image Height: 2736 +[Composite, Composite, Other] PanasonicRaw-ImageWidth - Image Width: 3648 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 3648x2736 +[Composite, Composite, Image] Exif-LightValue - Light Value: 12.3 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 10.0 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 4.7 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.006 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 73.7 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 5.1 mm (35 mm equivalent: 24.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 1.02 m diff --git a/t/Pentax.t b/t/Pentax.t new file mode 100644 index 0000000..a85bfca --- /dev/null +++ b/t/Pentax.t @@ -0,0 +1,51 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Pentax.t". + +BEGIN { + $| = 1; print "1..4\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Pentax; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Pentax'; +my $testnum = 1; + +# test 2: Extract information from Pentax.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Pentax.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + ['ThumbnailImage'], # delete thumbnail image + ['WhiteBalance' => 'Tungsten', 'Group' => 'MakerNotes'], + ['FocalLength' => 22 ], + ['MaxAperture' => 2.0 ], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 4: Extract information from a Pentax AVI video +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Pentax.avi'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Pentax_2.out b/t/Pentax_2.out new file mode 100644 index 0000000..7f6d251 --- /dev/null +++ b/t/Pentax_2.out @@ -0,0 +1,225 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Pentax.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 2.7 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2008:03:28 13:40:33-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:46-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[JFIF, JFIF, Image] 0 - JFIF Version: 1.01 +[JFIF, JFIF, Image] 2 - Resolution Unit: None +[JFIF, JFIF, Image] 3 - X Resolution: 1 +[JFIF, JFIF, Image] 5 - Y Resolution: 1 +[EXIF, IFD0, Camera] 271 - Make: PENTAX Corporation +[EXIF, IFD0, Camera] 272 - Camera Model Name: PENTAX K10D +[EXIF, IFD0, Image] 274 - Orientation: Rotate 270 CW +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: K10D Ver 1.30 +[EXIF, IFD0, Time] 306 - Modify Date: 2008:03:02 12:01:23 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/100 +[EXIF, ExifIFD, Image] 33437 - F Number: 13.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2008:03:02 12:01:23 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2008:03:02 12:01:23 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: +0.7 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 10.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 3008 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 2000 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 15 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, ExifIFD, Camera] 41996 - Subject Distance Range: Distant +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 2418 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Pentax, Camera] 0 - Pentax Version: 3.0.0.0 +[MakerNotes, Pentax, Camera] 1 - Pentax Model Type: 0 +[MakerNotes, Pentax, Image] 2 - Preview Image Size: 640x480 +[MakerNotes, Pentax, Image] 3 - Preview Image Length: 26 +[MakerNotes, Pentax, Image] 4 - Preview Image Start: 2446 +[MakerNotes, Pentax, Camera] 5 - Pentax Model ID: K10D +[MakerNotes, Pentax, Time] 6 - Date: 2008:03:02 +[MakerNotes, Pentax, Time] 7 - Time: 12:01:23 +[MakerNotes, Pentax, Camera] 8 - Quality: Better +[MakerNotes, Pentax, Camera] 12 - Flash Mode: Off, Did not fire; Internal +[MakerNotes, Pentax, Camera] 13 - Focus Mode: AF-S (Focus-priority) +[MakerNotes, Pentax, Camera] 14 - AF Point Selected: Center +[MakerNotes, Pentax, Camera] 18 - Exposure Time: 1/100 +[MakerNotes, Pentax, Camera] 19 - F Number: 13.0 +[MakerNotes, Pentax, Camera] 20 - ISO: 100 +[MakerNotes, Pentax, Camera] 22 - Exposure Compensation: +0.7 +[MakerNotes, Pentax, Camera] 23 - Metering Mode: Multi-segment +[MakerNotes, Pentax, Camera] 24 - Auto Bracketing: 0 EV, No Extended Bracket +[MakerNotes, Pentax, Camera] 25 - White Balance: Auto +[MakerNotes, Pentax, Camera] 26 - White Balance Mode: Auto (Daylight) +[MakerNotes, Pentax, Camera] 29 - Focal Length: 10.0 mm +[MakerNotes, Pentax, Camera] 31 - Saturation: 0 (normal) +[MakerNotes, Pentax, Camera] 32 - Contrast: 0 (normal) +[MakerNotes, Pentax, Camera] 33 - Sharpness: 0 (normal) +[MakerNotes, Pentax, Time] 34 - World Time Location: Hometown +[MakerNotes, Pentax, Time] 35 - Hometown City: Toronto +[MakerNotes, Pentax, Time] 36 - Destination City: New York +[MakerNotes, Pentax, Time] 37 - Hometown DST: No +[MakerNotes, Pentax, Time] 38 - Destination DST: No +[MakerNotes, Pentax, Camera] 39 - DSP Firmware Version: 1.30.00.18 +[MakerNotes, Pentax, Camera] 40 - CPU Firmware Version: 1.30.00.18 +[MakerNotes, Pentax, Camera] 45 - Effective LV: 14.8 +[MakerNotes, Pentax, Camera] 50 - Image Editing: None +[MakerNotes, Pentax, Camera] 51 - Picture Mode: Aperture Priority; 1/3 EV steps +[MakerNotes, Pentax, Camera] 52 - Drive Mode: Single-frame; No Timer; Shutter Button; Single Exposure +[MakerNotes, Pentax, Camera] 55 - Color Space: sRGB +[MakerNotes, Pentax, Camera] 61 - Data Scaling: 8192 +[MakerNotes, Pentax, Camera] 62 - Preview Image Borders: 28 28 0 0 +[MakerNotes, Pentax, Camera] 0 - Lens Type: Sigma or Tamron Lens (3 44) +[MakerNotes, Pentax, Camera] 64 - Sensitivity Adjust: 0 +[MakerNotes, Pentax, Camera] 65 - Image Edit Count: 0 +[MakerNotes, Pentax, Camera] 71 - Camera Temperature: 12 C +[MakerNotes, Pentax, Camera] 72 - AE Lock: Off +[MakerNotes, Pentax, Camera] 73 - Noise Reduction: Off +[MakerNotes, Pentax, Camera] 77 - Flash Exposure Comp: 0 +[MakerNotes, Pentax, Camera] 79 - Image Tone: Natural +[MakerNotes, Pentax, Camera] 0 - SR Result: Stabilized +[MakerNotes, Pentax, Camera] 1 - Shake Reduction: On +[MakerNotes, Pentax, Camera] 2 - SR Half Press Time: 1.53 s +[MakerNotes, Pentax, Camera] 3 - SR Focal Length: 10 mm +[MakerNotes, Pentax, Camera] 93 - Shutter Count: 1648 +[MakerNotes, Pentax, Camera] 98 - Raw Development Process: 1 (K10D,K200D,K2000,K-m) +[MakerNotes, Pentax, Camera] 512 - Black Point: 0 0 0 0 +[MakerNotes, Pentax, Camera] 513 - White Point: 13568 8192 8192 9088 +[MakerNotes, Pentax, Camera] 0 - Picture Mode 2: Aperture Priority +[MakerNotes, Pentax, Camera] 1.1 - Program Line: Normal +[MakerNotes, Pentax, Camera] 1.2 - EV Steps: 1/3 EV Steps +[MakerNotes, Pentax, Camera] 1.3 - E-Dial In Program: Tv or Av +[MakerNotes, Pentax, Camera] 1.4 - Aperture Ring Use: Permitted +[MakerNotes, Pentax, Camera] 2 - Flash Options: Wireless (Master) +[MakerNotes, Pentax, Camera] 2.1 - Metering Mode 2: Multi-segment +[MakerNotes, Pentax, Camera] 3 - AF Point Mode: Select +[MakerNotes, Pentax, Camera] 3.1 - Focus Mode 2: AF-S +[MakerNotes, Pentax, Camera] 4 - AF Point Selected 2: Center +[MakerNotes, Pentax, Camera] 6 - ISO Floor: 100 +[MakerNotes, Pentax, Camera] 7 - Drive Mode 2: Single-frame +[MakerNotes, Pentax, Camera] 8 - Exposure Bracket Step Size: 0.3 +[MakerNotes, Pentax, Camera] 9 - Bracket Shot Number: n/a +[MakerNotes, Pentax, Camera] 10 - White Balance Set: Auto +[MakerNotes, Pentax, Camera] 10.1 - Multiple Exposure Set: Off +[MakerNotes, Pentax, Camera] 13 - Raw And Jpg Recording: RAW+JPEG (PEF, Better) +[MakerNotes, Pentax, Camera] 14.1 - Jpg Recorded Pixels: 6 MP +[MakerNotes, Pentax, Camera] 16 - Flash Options 2: Wireless (Master) +[MakerNotes, Pentax, Camera] 16.1 - Metering Mode 3: Multi-segment +[MakerNotes, Pentax, Camera] 17.1 - SR Active: Yes +[MakerNotes, Pentax, Camera] 17.2 - Rotation: Rotate 270 CW +[MakerNotes, Pentax, Camera] 17.3 - ISO Setting: Manual +[MakerNotes, Pentax, Camera] 17.4 - Sensitivity Steps: 1 EV Steps +[MakerNotes, Pentax, Camera] 18 - Tv Exposure Time Setting: 1/203 +[MakerNotes, Pentax, Camera] 19 - Av Aperture Setting: 12.7 +[MakerNotes, Pentax, Camera] 20 - Sv ISO Setting: 100 +[MakerNotes, Pentax, Camera] 21 - Base Exposure Compensation: +0.7 +[MakerNotes, Pentax, Camera] 0 - AE Exposure Time: 1/101 +[MakerNotes, Pentax, Camera] 1 - AE Aperture: 12.9 +[MakerNotes, Pentax, Camera] 2 - AE ISO: 100 +[MakerNotes, Pentax, Camera] 3 - AE Xv: -0.625 +[MakerNotes, Pentax, Camera] 4 - AEB Xv: 0 +[MakerNotes, Pentax, Camera] 5 - AE Min Exposure Time: 1/3862 +[MakerNotes, Pentax, Camera] 6 - AE Program Mode: Av, B or X +[MakerNotes, Pentax, Camera] 8 - AE Aperture Steps: 28 +[MakerNotes, Pentax, Camera] 9 - AE Max Aperture: 4.0 +[MakerNotes, Pentax, Camera] 10 - AE Max Aperture 2: 4.0 +[MakerNotes, Pentax, Camera] 11 - AE Min Aperture: 23 +[MakerNotes, Pentax, Camera] 12 - AE Metering Mode: Multi-segment +[MakerNotes, Pentax, Camera] 14 - Flash Exposure Comp. Setting: 0 +[MakerNotes, Pentax, Camera] 0 - Lens Type: Sigma or Tamron Lens (3 44) +[MakerNotes, Pentax, Camera] 0.1 - Auto Aperture: On +[MakerNotes, Pentax, Camera] 0.2 - Min Aperture: 22 +[MakerNotes, Pentax, Camera] 0.3 - Lens F Stops: 8.5 +[MakerNotes, Pentax, Camera] 3 - Min Focus Distance: 0.49-0.50 m +[MakerNotes, Pentax, Camera] 3.1 - Focus Range Index: 7 (very far) +[MakerNotes, Pentax, Camera] 9 - Lens Focal Length: 10.0 mm +[MakerNotes, Pentax, Camera] 10 - Nominal Max Aperture: 4.0 +[MakerNotes, Pentax, Camera] 10.1 - Nominal Min Aperture: 23 +[MakerNotes, Pentax, Camera] 14.1 - Max Aperture: 3.9 +[MakerNotes, Pentax, Camera] 0 - Flash Status: Off +[MakerNotes, Pentax, Camera] 1 - Internal Flash Mode: Did not fire, Wireless (Master) +[MakerNotes, Pentax, Camera] 2 - External Flash Mode: Off +[MakerNotes, Pentax, Camera] 3 - Internal Flash Strength: 18 +[MakerNotes, Pentax, Camera] 4 - TTL DA A Up: 0 +[MakerNotes, Pentax, Camera] 5 - TTL DA A Down: 0 +[MakerNotes, Pentax, Camera] 6 - TTL DA B Up: 0 +[MakerNotes, Pentax, Camera] 7 - TTL DA B Down: 0 +[MakerNotes, Pentax, Camera] 24.1 - External Flash Guide Number: n/a +[MakerNotes, Pentax, Camera] 25 - External Flash Exposure Comp: n/a +[MakerNotes, Pentax, Camera] 26 - External Flash Bounce: n/a +[MakerNotes, Pentax, Camera] 521 - AE Metering Segments: 13.5 13.6 13.5 13.2 13.6 15.0 13.8 12.9 13.8 16.4 14.4 13.9 14.4 15.8 14.0 16.0 +[MakerNotes, Pentax, Camera] 522 - Flash Metering Segments: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Pentax, Camera] 523 - Slave Flash Metering Segments: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Pentax, Camera] 525 - WB RGGB Levels Daylight: 13600 8192 8192 8765 +[MakerNotes, Pentax, Camera] 526 - WB RGGB Levels Shade: 16128 8192 8192 6635 +[MakerNotes, Pentax, Camera] 527 - WB RGGB Levels Cloudy: 14560 8192 8192 7782 +[MakerNotes, Pentax, Camera] 528 - WB RGGB Levels Tungsten: 8192 8192 8192 20971 +[MakerNotes, Pentax, Camera] 529 - WB RGGB Levels Fluorescent D: 17376 8192 8192 8847 +[MakerNotes, Pentax, Camera] 530 - WB RGGB Levels Fluorescent N: 14528 8192 8192 10076 +[MakerNotes, Pentax, Camera] 531 - WB RGGB Levels Fluorescent W: 13088 8192 8192 12206 +[MakerNotes, Pentax, Camera] 532 - WB RGGB Levels Flash: 13632 8192 8192 8601 +[MakerNotes, Pentax, Camera] 0 - Pentax Model ID: K10D +[MakerNotes, Pentax, Time] 1 - Manufacture Date: 2007:09:13 +[MakerNotes, Pentax, Camera] 2 - Production Code: 2.1 +[MakerNotes, Pentax, Camera] 4 - Internal Serial Number: 132352 +[MakerNotes, Pentax, Camera] 0.1 - Power Source: Body Battery +[MakerNotes, Pentax, Camera] 1.1 - Body Battery State: Full +[MakerNotes, Pentax, Camera] 1.2 - Grip Battery State: Empty or Missing +[MakerNotes, Pentax, Camera] 2 - Body Battery A/D No Load: 173 (7.6V, 51%) +[MakerNotes, Pentax, Camera] 3 - Body Battery A/D Load: 168 (7.4V, 47%) +[MakerNotes, Pentax, Camera] 4 - Grip Battery A/D No Load: 5 +[MakerNotes, Pentax, Camera] 5 - Grip Battery A/D Load: 1 +[MakerNotes, Pentax, Camera] 4 - AF Predictor: 4 +[MakerNotes, Pentax, Camera] 6 - AF Defocus: 2 +[MakerNotes, Pentax, Camera] 7 - AF Integration Time: 0 ms +[MakerNotes, Pentax, Camera] 11 - AF Points In Focus: Center (horizontal) +[MakerNotes, Pentax, Image] 16 - WB Shift AB: 0 +[MakerNotes, Pentax, Image] 17 - WB Shift GM: 0 +[MakerNotes, Pentax, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0300 +[Composite, Composite, Image] Exif-Aperture - Aperture: 13.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Sigma AF 10-20mm F4-5.6 EX DC +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.5 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/100 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.020 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 100.4 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 10.0 mm (35 mm equivalent: 15.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 0.38 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 14.0 diff --git a/t/Pentax_3.out b/t/Pentax_3.out new file mode 100644 index 0000000..34f0ab9 --- /dev/null +++ b/t/Pentax_3.out @@ -0,0 +1,266 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Pentax_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 2.6 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:46-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:46-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:46-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[JFIF, JFIF, Image] 0 - JFIF Version: 1.01 +[JFIF, JFIF, Image] 2 - Resolution Unit: None +[JFIF, JFIF, Image] 3 - X Resolution: 1 +[JFIF, JFIF, Image] 5 - Y Resolution: 1 +[EXIF, IFD0, Camera] 271 - Make: PENTAX Corporation +[EXIF, IFD0, Camera] 272 - Camera Model Name: PENTAX K10D +[EXIF, IFD0, Image] 274 - Orientation: Rotate 270 CW +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: K10D Ver 1.30 +[EXIF, IFD0, Time] 306 - Modify Date: 2008:03:02 12:01:23 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/100 +[EXIF, ExifIFD, Image] 33437 - F Number: 13.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2008:03:02 12:01:23 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2008:03:02 12:01:23 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: +0.7 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 22.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 3008 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 2000 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 15 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, ExifIFD, Camera] 41996 - Subject Distance Range: Distant +[MakerNotes, Pentax, Camera] 0 - Pentax Version: 3.0.0.0 +[MakerNotes, Pentax, Camera] 1 - Pentax Model Type: 0 +[MakerNotes, Pentax, Image] 2 - Preview Image Size: 640x480 +[MakerNotes, Pentax, Image] 3 - Preview Image Length: 26 +[MakerNotes, Pentax, Image] 4 - Preview Image Start: 2324 +[MakerNotes, Pentax, Camera] 5 - Pentax Model ID: K10D +[MakerNotes, Pentax, Time] 6 - Date: 2008:03:02 +[MakerNotes, Pentax, Time] 7 - Time: 12:01:23 +[MakerNotes, Pentax, Camera] 8 - Quality: Better +[MakerNotes, Pentax, Camera] 12 - Flash Mode: Off, Did not fire; Internal +[MakerNotes, Pentax, Camera] 13 - Focus Mode: AF-S (Focus-priority) +[MakerNotes, Pentax, Camera] 14 - AF Point Selected: Center +[MakerNotes, Pentax, Camera] 18 - Exposure Time: 1/100 +[MakerNotes, Pentax, Camera] 19 - F Number: 13.0 +[MakerNotes, Pentax, Camera] 20 - ISO: 100 +[MakerNotes, Pentax, Camera] 22 - Exposure Compensation: +0.7 +[MakerNotes, Pentax, Camera] 23 - Metering Mode: Multi-segment +[MakerNotes, Pentax, Camera] 24 - Auto Bracketing: 0 EV, No Extended Bracket +[MakerNotes, Pentax, Camera] 25 - White Balance: Tungsten +[MakerNotes, Pentax, Camera] 26 - White Balance Mode: Auto (Daylight) +[MakerNotes, Pentax, Camera] 29 - Focal Length: 22.0 mm +[MakerNotes, Pentax, Camera] 31 - Saturation: 0 (normal) +[MakerNotes, Pentax, Camera] 32 - Contrast: 0 (normal) +[MakerNotes, Pentax, Camera] 33 - Sharpness: 0 (normal) +[MakerNotes, Pentax, Time] 34 - World Time Location: Hometown +[MakerNotes, Pentax, Time] 35 - Hometown City: Toronto +[MakerNotes, Pentax, Time] 36 - Destination City: New York +[MakerNotes, Pentax, Time] 37 - Hometown DST: No +[MakerNotes, Pentax, Time] 38 - Destination DST: No +[MakerNotes, Pentax, Camera] 39 - DSP Firmware Version: 1.30.00.18 +[MakerNotes, Pentax, Camera] 40 - CPU Firmware Version: 1.30.00.18 +[MakerNotes, Pentax, Camera] 45 - Effective LV: 14.8 +[MakerNotes, Pentax, Camera] 50 - Image Editing: None +[MakerNotes, Pentax, Camera] 51 - Picture Mode: Aperture Priority; 1/3 EV steps +[MakerNotes, Pentax, Camera] 52 - Drive Mode: Single-frame; No Timer; Shutter Button; Single Exposure +[MakerNotes, Pentax, Camera] 55 - Color Space: sRGB +[MakerNotes, Pentax, Camera] 61 - Data Scaling: 8192 +[MakerNotes, Pentax, Camera] 62 - Preview Image Borders: 28 28 0 0 +[MakerNotes, Pentax, Camera] 0 - Lens Type: Sigma or Tamron Lens (3 44) +[MakerNotes, Pentax, Camera] 64 - Sensitivity Adjust: 0 +[MakerNotes, Pentax, Camera] 65 - Image Edit Count: 0 +[MakerNotes, Pentax, Camera] 71 - Camera Temperature: 12 C +[MakerNotes, Pentax, Camera] 72 - AE Lock: Off +[MakerNotes, Pentax, Camera] 73 - Noise Reduction: Off +[MakerNotes, Pentax, Camera] 77 - Flash Exposure Comp: 0 +[MakerNotes, Pentax, Camera] 79 - Image Tone: Natural +[MakerNotes, Pentax, Camera] 0 - SR Result: Stabilized +[MakerNotes, Pentax, Camera] 1 - Shake Reduction: On +[MakerNotes, Pentax, Camera] 2 - SR Half Press Time: 1.53 s +[MakerNotes, Pentax, Camera] 3 - SR Focal Length: 10 mm +[MakerNotes, Pentax, Camera] 93 - Shutter Count: 1648 +[MakerNotes, Pentax, Camera] 98 - Raw Development Process: 1 (K10D,K200D,K2000,K-m) +[MakerNotes, Pentax, Camera] 512 - Black Point: 0 0 0 0 +[MakerNotes, Pentax, Camera] 513 - White Point: 13568 8192 8192 9088 +[MakerNotes, Pentax, Camera] 0 - Picture Mode 2: Aperture Priority +[MakerNotes, Pentax, Camera] 1.1 - Program Line: Normal +[MakerNotes, Pentax, Camera] 1.2 - EV Steps: 1/3 EV Steps +[MakerNotes, Pentax, Camera] 1.3 - E-Dial In Program: Tv or Av +[MakerNotes, Pentax, Camera] 1.4 - Aperture Ring Use: Permitted +[MakerNotes, Pentax, Camera] 2 - Flash Options: Wireless (Master) +[MakerNotes, Pentax, Camera] 2.1 - Metering Mode 2: Multi-segment +[MakerNotes, Pentax, Camera] 3 - AF Point Mode: Select +[MakerNotes, Pentax, Camera] 3.1 - Focus Mode 2: AF-S +[MakerNotes, Pentax, Camera] 4 - AF Point Selected 2: Center +[MakerNotes, Pentax, Camera] 6 - ISO Floor: 100 +[MakerNotes, Pentax, Camera] 7 - Drive Mode 2: Single-frame +[MakerNotes, Pentax, Camera] 8 - Exposure Bracket Step Size: 0.3 +[MakerNotes, Pentax, Camera] 9 - Bracket Shot Number: n/a +[MakerNotes, Pentax, Camera] 10 - White Balance Set: Auto +[MakerNotes, Pentax, Camera] 10.1 - Multiple Exposure Set: Off +[MakerNotes, Pentax, Camera] 13 - Raw And Jpg Recording: RAW+JPEG (PEF, Better) +[MakerNotes, Pentax, Camera] 14.1 - Jpg Recorded Pixels: 6 MP +[MakerNotes, Pentax, Camera] 16 - Flash Options 2: Wireless (Master) +[MakerNotes, Pentax, Camera] 16.1 - Metering Mode 3: Multi-segment +[MakerNotes, Pentax, Camera] 17.1 - SR Active: Yes +[MakerNotes, Pentax, Camera] 17.2 - Rotation: Rotate 270 CW +[MakerNotes, Pentax, Camera] 17.3 - ISO Setting: Manual +[MakerNotes, Pentax, Camera] 17.4 - Sensitivity Steps: 1 EV Steps +[MakerNotes, Pentax, Camera] 18 - Tv Exposure Time Setting: 1/203 +[MakerNotes, Pentax, Camera] 19 - Av Aperture Setting: 12.7 +[MakerNotes, Pentax, Camera] 20 - Sv ISO Setting: 100 +[MakerNotes, Pentax, Camera] 21 - Base Exposure Compensation: +0.7 +[MakerNotes, Pentax, Camera] 0 - AE Exposure Time: 1/101 +[MakerNotes, Pentax, Camera] 1 - AE Aperture: 12.9 +[MakerNotes, Pentax, Camera] 2 - AE ISO: 100 +[MakerNotes, Pentax, Camera] 3 - AE Xv: -0.625 +[MakerNotes, Pentax, Camera] 4 - AEB Xv: 0 +[MakerNotes, Pentax, Camera] 5 - AE Min Exposure Time: 1/3862 +[MakerNotes, Pentax, Camera] 6 - AE Program Mode: Av, B or X +[MakerNotes, Pentax, Camera] 7 - AE Flags: (none) +[MakerNotes, Pentax, Camera] 8 - AE Aperture Steps: 28 +[MakerNotes, Pentax, Camera] 9 - AE Max Aperture: 4.0 +[MakerNotes, Pentax, Camera] 10 - AE Max Aperture 2: 4.0 +[MakerNotes, Pentax, Camera] 11 - AE Min Aperture: 23 +[MakerNotes, Pentax, Camera] 12 - AE Metering Mode: Multi-segment +[MakerNotes, Pentax, Camera] 14 - Flash Exposure Comp. Setting: 0 +[MakerNotes, Pentax, Camera] 0 - Lens Type: Sigma or Tamron Lens (3 44) +[MakerNotes, Pentax, Camera] 0.1 - Auto Aperture: On +[MakerNotes, Pentax, Camera] 0.2 - Min Aperture: 22 +[MakerNotes, Pentax, Camera] 0.3 - Lens F Stops: 8.5 +[MakerNotes, Pentax, Camera] 1 - Lens Kind: 0x28 +[MakerNotes, Pentax, Camera] 2 - LC1: 0x94 +[MakerNotes, Pentax, Camera] 3 - Min Focus Distance: 0.49-0.50 m +[MakerNotes, Pentax, Camera] 3.1 - Focus Range Index: 7 (very far) +[MakerNotes, Pentax, Camera] 4 - LC3: 0x5b +[MakerNotes, Pentax, Camera] 5 - LC4: 0x53 +[MakerNotes, Pentax, Camera] 6 - LC5: 0x86 +[MakerNotes, Pentax, Camera] 7 - LC6: 0xea +[MakerNotes, Pentax, Camera] 8 - LC7: 0x41 +[MakerNotes, Pentax, Camera] 9 - Lens Focal Length: 10.0 mm +[MakerNotes, Pentax, Camera] 10 - Nominal Max Aperture: 4.0 +[MakerNotes, Pentax, Camera] 10.1 - Nominal Min Aperture: 23 +[MakerNotes, Pentax, Camera] 11 - LC10: 0x50 +[MakerNotes, Pentax, Camera] 12 - LC11: 0x38 +[MakerNotes, Pentax, Camera] 13 - LC12: 0x01 +[MakerNotes, Pentax, Camera] 14.1 - Max Aperture: 2.0 +[MakerNotes, Pentax, Camera] 15 - LC14: 0x6c +[MakerNotes, Pentax, Camera] 16 - LC15: 0x03 +[MakerNotes, Pentax, Camera] 0 - Flash Status: Off +[MakerNotes, Pentax, Camera] 1 - Internal Flash Mode: Did not fire, Wireless (Master) +[MakerNotes, Pentax, Camera] 2 - External Flash Mode: Off +[MakerNotes, Pentax, Camera] 3 - Internal Flash Strength: 18 +[MakerNotes, Pentax, Camera] 4 - TTL DA A Up: 0 +[MakerNotes, Pentax, Camera] 5 - TTL DA A Down: 0 +[MakerNotes, Pentax, Camera] 6 - TTL DA B Up: 0 +[MakerNotes, Pentax, Camera] 7 - TTL DA B Down: 0 +[MakerNotes, Pentax, Camera] 24.1 - External Flash Guide Number: n/a +[MakerNotes, Pentax, Camera] 25 - External Flash Exposure Comp: n/a +[MakerNotes, Pentax, Camera] 26 - External Flash Bounce: n/a +[MakerNotes, Pentax, Camera] 521 - AE Metering Segments: 13.5 13.6 13.5 13.2 13.6 15.0 13.8 12.9 13.8 16.4 14.4 13.9 14.4 15.8 14.0 16.0 +[MakerNotes, Pentax, Camera] 522 - Flash Metering Segments: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Pentax, Camera] 523 - Slave Flash Metering Segments: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Pentax, Camera] 525 - WB RGGB Levels Daylight: 13600 8192 8192 8765 +[MakerNotes, Pentax, Camera] 526 - WB RGGB Levels Shade: 16128 8192 8192 6635 +[MakerNotes, Pentax, Camera] 527 - WB RGGB Levels Cloudy: 14560 8192 8192 7782 +[MakerNotes, Pentax, Camera] 528 - WB RGGB Levels Tungsten: 8192 8192 8192 20971 +[MakerNotes, Pentax, Camera] 529 - WB RGGB Levels Fluorescent D: 17376 8192 8192 8847 +[MakerNotes, Pentax, Camera] 530 - WB RGGB Levels Fluorescent N: 14528 8192 8192 10076 +[MakerNotes, Pentax, Camera] 531 - WB RGGB Levels Fluorescent W: 13088 8192 8192 12206 +[MakerNotes, Pentax, Camera] 532 - WB RGGB Levels Flash: 13632 8192 8192 8601 +[MakerNotes, Pentax, Camera] 0 - Pentax Model ID: K10D +[MakerNotes, Pentax, Time] 1 - Manufacture Date: 2007:09:13 +[MakerNotes, Pentax, Camera] 2 - Production Code: 2.1 +[MakerNotes, Pentax, Camera] 4 - Internal Serial Number: 132352 +[MakerNotes, Pentax, Camera] 0.1 - Power Source: Body Battery +[MakerNotes, Pentax, Camera] 1.1 - Body Battery State: Full +[MakerNotes, Pentax, Camera] 1.2 - Grip Battery State: Empty or Missing +[MakerNotes, Pentax, Camera] 2 - Body Battery A/D No Load: 173 (7.6V, 51%) +[MakerNotes, Pentax, Camera] 3 - Body Battery A/D Load: 168 (7.4V, 47%) +[MakerNotes, Pentax, Camera] 4 - Grip Battery A/D No Load: 5 +[MakerNotes, Pentax, Camera] 5 - Grip Battery A/D Load: 1 +[MakerNotes, Pentax, Camera] 0 - AF Points Unknown 1: Center +[MakerNotes, Pentax, Camera] 2 - AF Points Unknown 2: Center, [13], [14] +[MakerNotes, Pentax, Camera] 4 - AF Predictor: 4 +[MakerNotes, Pentax, Camera] 6 - AF Defocus: 2 +[MakerNotes, Pentax, Camera] 7 - AF Integration Time: 0 ms +[MakerNotes, Pentax, Camera] 11 - AF Points In Focus: Center (horizontal) +[MakerNotes, Pentax, Image] 16 - WB Shift AB: 0 +[MakerNotes, Pentax, Image] 17 - WB Shift GM: 0 +[MakerNotes, Pentax, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0300 +[PrintIM, PrintIM, Printing] 1 - Print IM 0x0001: 0x00160016 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x01000000 +[PrintIM, PrintIM, Printing] 3 - Print IM 0x0003: 0x000000d6 +[PrintIM, PrintIM, Printing] 7 - Print IM 0x0007: 0x00000000 +[PrintIM, PrintIM, Printing] 8 - Print IM 0x0008: 0x00000000 +[PrintIM, PrintIM, Printing] 9 - Print IM 0x0009: 0x00000000 +[PrintIM, PrintIM, Printing] 10 - Print IM 0x000a: 0x00000000 +[PrintIM, PrintIM, Printing] 11 - Print IM 0x000b: 0x0000011e +[PrintIM, PrintIM, Printing] 12 - Print IM 0x000c: 0x00000000 +[PrintIM, PrintIM, Printing] 13 - Print IM 0x000d: 0x00000000 +[PrintIM, PrintIM, Printing] 14 - Print IM 0x000e: 0x00000134 +[PrintIM, PrintIM, Printing] 256 - Print IM 0x0100: 0x05000000 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0xff000000 +[PrintIM, PrintIM, Printing] 258 - Print IM 0x0102: 0x83000000 +[PrintIM, PrintIM, Printing] 259 - Print IM 0x0103: 0x83000000 +[PrintIM, PrintIM, Printing] 260 - Print IM 0x0104: 0x83000000 +[PrintIM, PrintIM, Printing] 261 - Print IM 0x0105: 0x83000000 +[PrintIM, PrintIM, Printing] 262 - Print IM 0x0106: 0x83000000 +[PrintIM, PrintIM, Printing] 263 - Print IM 0x0107: 0x80808000 +[PrintIM, PrintIM, Printing] 272 - Print IM 0x0110: 0x80000000 +[PrintIM, PrintIM, Printing] 512 - Print IM 0x0200: 0x00000000 +[PrintIM, PrintIM, Printing] 519 - Print IM 0x0207: 0x00000000 +[PrintIM, PrintIM, Printing] 520 - Print IM 0x0208: 0x00000000 +[PrintIM, PrintIM, Printing] 521 - Print IM 0x0209: 0x00000000 +[PrintIM, PrintIM, Printing] 522 - Print IM 0x020a: 0x00000000 +[PrintIM, PrintIM, Printing] 523 - Print IM 0x020b: 0x00000144 +[PrintIM, PrintIM, Printing] 525 - Print IM 0x020d: 0x00000000 +[PrintIM, PrintIM, Printing] 768 - Print IM 0x0300: 0x05000000 +[PrintIM, PrintIM, Printing] 769 - Print IM 0x0301: 0xff000000 +[PrintIM, PrintIM, Printing] 770 - Print IM 0x0302: 0x83000000 +[PrintIM, PrintIM, Printing] 771 - Print IM 0x0303: 0x83000000 +[PrintIM, PrintIM, Printing] 774 - Print IM 0x0306: 0x83000000 +[PrintIM, PrintIM, Printing] 784 - Print IM 0x0310: 0x80000000 +[Composite, Composite, Image] Exif-Aperture - Aperture: 13.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/100 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Sigma or Tamron Lens (3 44) + 2.2x converter +[Composite, Composite, Image] Exif-LightValue - Light Value: 14.0 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 0.7 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.044 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 100.4 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 22.0 mm (35 mm equivalent: 15.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 0.84 m diff --git a/t/Pentax_4.out b/t/Pentax_4.out new file mode 100644 index 0000000..767b875 --- /dev/null +++ b/t/Pentax_4.out @@ -0,0 +1,132 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Pentax.avi +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1672 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2009:10:30 08:10:17-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:15-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:01:05 09:05:38-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: AVI +[File, File, Other] FileTypeExtension - File Type Extension: avi +[File, File, Other] MIMEType - MIME Type: video/x-msvideo +[File, File, Image] 0 - BMP Version: Windows V3 +[File, File, Image] 4 - Image Width: 1280 +[File, File, Image] 8 - Image Height: 720 +[File, File, Image] 12 - Planes: 1 +[File, File, Image] 14 - Bit Depth: 24 +[File, File, Image] 16 - Compression: MJPG +[File, File, Image] 20 - Image Length: 2764800 +[File, File, Image] 24 - Pixels Per Meter X: 0 +[File, File, Image] 28 - Pixels Per Meter Y: 0 +[File, File, Image] 32 - Num Colors: Use BitDepth +[File, File, Image] 36 - Num Important Colors: All +[RIFF, RIFF, Video] 0 - Frame Rate: 24 +[RIFF, RIFF, Video] 1 - Max Data Rate: 0 kB/s +[RIFF, RIFF, Video] 4 - Frame Count: 600 +[RIFF, RIFF, Video] 6 - Stream Count: 2 +[RIFF, RIFF, Video] 8 - Image Width: 1280 +[RIFF, RIFF, Video] 9 - Image Height: 720 +[RIFF, RIFF, Video] 0 - Stream Type: Video +[RIFF, RIFF, Video] 1 - Video Codec: mjpg +[RIFF, RIFF, Video] 5 - Video Frame Rate: 24 +[RIFF, RIFF, Video] 8 - Video Frame Count: 600 +[RIFF, RIFF, Video] 10 - Quality: 10000 +[RIFF, RIFF, Video] 11 - Sample Size: Variable +[RIFF, RIFF, Video] 0 - Stream Type: Audio +[RIFF, RIFF, Video] 1 - Audio Codec: +[RIFF, RIFF, Video] 5 - Audio Sample Rate: 32000 +[RIFF, RIFF, Video] 8 - Audio Sample Count: 800000 +[RIFF, RIFF, Video] 10 - Quality: 10000 +[RIFF, RIFF, Video] 11 - Sample Size: 2 bytes +[RIFF, RIFF, Audio] 0 - Encoding: Microsoft PCM +[RIFF, RIFF, Audio] 1 - Num Channels: 1 +[RIFF, RIFF, Audio] 2 - Sample Rate: 32000 +[RIFF, RIFF, Audio] 4 - Avg Bytes Per Sec: 64000 +[RIFF, RIFF, Audio] 7 - Bits Per Sample: 16 +[RIFF, RIFF, Video] 0 - Total Frame Count: 600 +[RIFF, RIFF, Time] IDIT - Date/Time Original: 2009:10:27 12:14:00 +[RIFF, RIFF, Audio] ISFT - Software: PENTAX K-x +[MakerNotes, Pentax, Camera] 0 - Pentax Version: 5.1.0.0 +[MakerNotes, Pentax, Camera] 1 - Pentax Model Type: 0 +[MakerNotes, Pentax, Camera] 5 - Pentax Model ID: K-x +[MakerNotes, Pentax, Time] 6 - Date: 2009:10:27 +[MakerNotes, Pentax, Time] 7 - Time: 12:14:34 +[MakerNotes, Pentax, Camera] 8 - Quality: Best +[MakerNotes, Pentax, Camera] 19 - F Number: 0.0 +[MakerNotes, Pentax, Camera] 22 - Exposure Compensation: 0 +[MakerNotes, Pentax, Camera] 25 - White Balance: Flash +[MakerNotes, Pentax, Camera] 31 - Saturation: 0 (normal) +[MakerNotes, Pentax, Camera] 32 - Contrast: 0 (normal) +[MakerNotes, Pentax, Camera] 33 - Sharpness: -1 (medium soft) +[MakerNotes, Pentax, Camera] 39 - DSP Firmware Version: 1.00.00.01 +[MakerNotes, Pentax, Camera] 40 - CPU Firmware Version: 1.00.00.01 +[MakerNotes, Pentax, Camera] 51 - Picture Mode: Video (4); 1/3 EV steps +[MakerNotes, Pentax, Camera] 52 - Drive Mode: Video; n/a; Shutter Button; Video +[MakerNotes, Pentax, Camera] 0 - Lens Type: smc PENTAX-DA L 18-55mm F3.5-5.6 +[MakerNotes, Pentax, Camera] 3 - Extender Status: Not attached +[MakerNotes, Pentax, Camera] 79 - Image Tone: Natural +[MakerNotes, Pentax, Camera] 0 - SR Result: Stabilized, [1], [2], [3], [4] +[MakerNotes, Pentax, Camera] 1 - Shake Reduction: On (7) +[MakerNotes, Pentax, Camera] 2 - SR Half Press Time: 0.00 s +[MakerNotes, Pentax, Camera] 3 - SR Focal Length: 23 mm +[MakerNotes, Pentax, Camera] 103 - Hue: Normal +[MakerNotes, Pentax, Camera] 108 - High/Low Key Adj: 0 +[MakerNotes, Pentax, Camera] 115 - Monochrome Filter Effect: None +[MakerNotes, Pentax, Camera] 116 - Monochrome Toning: None +[MakerNotes, Pentax, Camera] 123 - Cross Process: Off +[MakerNotes, Pentax, Camera] 0 - Picture Mode 2: Scene Mode +[MakerNotes, Pentax, Camera] 1.1 - Program Line: Normal +[MakerNotes, Pentax, Camera] 1.2 - EV Steps: 1/3 EV Steps +[MakerNotes, Pentax, Camera] 1.3 - E-Dial In Program: P Shift +[MakerNotes, Pentax, Camera] 1.4 - Aperture Ring Use: Prohibited +[MakerNotes, Pentax, Camera] 2 - Flash Options: Normal +[MakerNotes, Pentax, Camera] 2.1 - Metering Mode 2: Multi-segment +[MakerNotes, Pentax, Camera] 3 - AF Point Mode: Fixed Center +[MakerNotes, Pentax, Camera] 3.1 - Focus Mode 2: AF-S +[MakerNotes, Pentax, Camera] 4 - AF Point Selected 2: Center +[MakerNotes, Pentax, Camera] 6 - ISO Floor: 100 +[MakerNotes, Pentax, Camera] 7 - Drive Mode 2: Single-frame +[MakerNotes, Pentax, Camera] 8 - Exposure Bracket Step Size: 0.3 +[MakerNotes, Pentax, Camera] 9 - Bracket Shot Number: n/a +[MakerNotes, Pentax, Camera] 10 - White Balance Set: Auto +[MakerNotes, Pentax, Camera] 10.1 - Multiple Exposure Set: Off +[MakerNotes, Pentax, Camera] 0 - AE Exposure Time: 1/55 +[MakerNotes, Pentax, Camera] 1 - AE Aperture: 3.8 +[MakerNotes, Pentax, Camera] 2 - AE ISO: 519 +[MakerNotes, Pentax, Camera] 3 - AE Xv: 0 +[MakerNotes, Pentax, Camera] 4 - AEB Xv: 0 +[MakerNotes, Pentax, Camera] 5 - AE Min Exposure Time: 1/5461 +[MakerNotes, Pentax, Camera] 6 - AE Program Mode: Standard +[MakerNotes, Pentax, Camera] 8 - AE Aperture Steps: 0 +[MakerNotes, Pentax, Camera] 9 - AE Max Aperture: 4.0 +[MakerNotes, Pentax, Camera] 10 - AE Max Aperture 2: 3.8 +[MakerNotes, Pentax, Camera] 11 - AE Min Aperture: 27 +[MakerNotes, Pentax, Camera] 12 - AE Metering Mode: Multi-segment +[MakerNotes, Pentax, Camera] 13 - AE White Balance: Daylight Fluorescent +[MakerNotes, Pentax, Camera] 13.1 - AE Metering Mode 2: Multi-segment +[MakerNotes, Pentax, Camera] 14 - Flash Exposure Comp. Setting: -1.0 +[MakerNotes, Pentax, Camera] 21 - Level Indicator: n/a +[MakerNotes, Pentax, Camera] 0 - Lens Type: smc PENTAX-DA L 18-55mm F3.5-5.6 +[MakerNotes, Pentax, Camera] 0.1 - Auto Aperture: On +[MakerNotes, Pentax, Camera] 0.2 - Min Aperture: 32 +[MakerNotes, Pentax, Camera] 0.3 - Lens F Stops: 6 +[MakerNotes, Pentax, Camera] 3 - Min Focus Distance: 0.25-0.28 m +[MakerNotes, Pentax, Camera] 3.1 - Focus Range Index: 6 (far) +[MakerNotes, Pentax, Camera] 9 - Lens Focal Length: 23.1 mm +[MakerNotes, Pentax, Camera] 10 - Nominal Max Aperture: 4.0 +[MakerNotes, Pentax, Camera] 10.1 - Nominal Min Aperture: 27 +[MakerNotes, Pentax, Camera] 14.1 - Max Aperture: 3.7 +[MakerNotes, Pentax, Camera] 0 - Pentax Model ID: K-x +[MakerNotes, Pentax, Time] 1 - Manufacture Date: 2009:09:04 +[MakerNotes, Pentax, Camera] 2 - Production Code: 2.3 +[MakerNotes, Pentax, Camera] 4 - Internal Serial Number: 8007725 +[MakerNotes, Pentax, Image] 16 - WB Shift AB: 0 +[MakerNotes, Pentax, Image] 17 - WB Shift GM: 0 +[MakerNotes, Pentax, Camera] 553 - Serial Number: 3430417 +[MakerNotes, Pentax, Author] 558 - Artist: +[MakerNotes, Pentax, Author] 559 - Copyright: +[MakerNotes, Pentax, Camera] 560 - Firmware Version: K-x Ver 1.00 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 1280x720 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.922 +[Composite, Composite, Other] RIFF-Duration - Duration: 25.00 s +[Composite, Composite, Camera] Exif-LensID - Lens ID: smc PENTAX-DA L 18-55mm F3.5-5.6 diff --git a/t/PhaseOne.t b/t/PhaseOne.t new file mode 100644 index 0000000..0c3416c --- /dev/null +++ b/t/PhaseOne.t @@ -0,0 +1,39 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PhaseOne.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::PhaseOne; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PhaseOne'; +my $testnum = 1; + +# test 2: Extract information from PhaseOne.iiq +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/PhaseOne.iiq'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + ['SerialNumber' => '1234'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/PhaseOne.iiq'); + print "ok $testnum\n"; +} + + +# end diff --git a/t/PhaseOne_2.out b/t/PhaseOne_2.out new file mode 100644 index 0000000..9b2d61c --- /dev/null +++ b/t/PhaseOne_2.out @@ -0,0 +1,100 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: PhaseOne.iiq +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 3.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2015:12:17 14:25:00-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:47-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: IIQ +[File, File, Other] FileTypeExtension - File Type Extension: iiq +[File, File, Other] MIMEType - MIME Type: image/x-raw +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[EXIF, IFD0, Image] 254 - Subfile Type: Full-resolution image +[EXIF, IFD0, Image] 256 - Image Width: 1 +[EXIF, IFD0, Image] 257 - Image Height: 1 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD0, Image] 259 - Compression: Uncompressed +[EXIF, IFD0, Image] 262 - Photometric Interpretation: RGB +[EXIF, IFD0, Camera] 271 - Make: Leaf +[EXIF, IFD0, Camera] 272 - Camera Model Name: Credo 40 +[EXIF, IFD0, Image] 273 - Strip Offsets: 3360 +[EXIF, IFD0, Image] 277 - Samples Per Pixel: 3 +[EXIF, IFD0, Image] 278 - Rows Per Strip: 1 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 3 +[EXIF, IFD0, Image] 282 - X Resolution: 341.3333333 +[EXIF, IFD0, Image] 283 - Y Resolution: 341.3333333 +[EXIF, IFD0, Image] 284 - Planar Configuration: Chunky +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, ExifIFD, Image] 18246 - Rating: 0 +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/1250 +[EXIF, ExifIFD, Image] 33437 - F Number: 5.6 +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2013:06:19 15:44:21 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2013:06:19 15:44:21 +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 3 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/1250 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 5.6 +[EXIF, ExifIFD, Camera] 37384 - Light Source: Daylight +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 80.0 mm +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 7320 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 5484 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Camera] 41987 - White Balance: Manual +[EXIF, ExifIFD, Image] 42016 - Image Unique ID: 00004C20007000000400E05800000508 +[EXIF, IFD1, Image] 254 - Subfile Type: Reduced-resolution image +[EXIF, IFD1, Image] 256 - Image Width: 1 +[EXIF, IFD1, Image] 257 - Image Height: 1 +[EXIF, IFD1, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD1, Image] 259 - Compression: Uncompressed +[EXIF, IFD1, Image] 262 - Photometric Interpretation: RGB +[EXIF, IFD1, Image] 273 - Strip Offsets: 3356 +[EXIF, IFD1, Image] 277 - Samples Per Pixel: 3 +[EXIF, IFD1, Image] 278 - Rows Per Strip: 1 +[EXIF, IFD1, Image] 279 - Strip Byte Counts: 3 +[EXIF, IFD1, Image] 282 - X Resolution: 341.3333333 +[EXIF, IFD1, Image] 283 - Y Resolution: 341.3333333 +[EXIF, IFD1, Image] 284 - Planar Configuration: Chunky +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Preview] Exif-ThumbnailTIFF - Thumbnail TIFF: (Binary data 219 bytes) +[MakerNotes, PhaseOne, Camera] 271 - Raw Data: (Binary data 15 bytes) +[MakerNotes, PhaseOne, Camera] 256 - Camera Orientation: Horizontal (normal) +[MakerNotes, PhaseOne, Camera] 264 - Sensor Width: 7372 +[MakerNotes, PhaseOne, Camera] 265 - Sensor Height: 5536 +[MakerNotes, PhaseOne, Camera] 266 - Sensor Left Margin: 36 +[MakerNotes, PhaseOne, Camera] 267 - Sensor Top Margin: 6 +[MakerNotes, PhaseOne, Camera] 268 - Image Width: 7320 +[MakerNotes, PhaseOne, Camera] 269 - Image Height: 5484 +[MakerNotes, PhaseOne, Camera] 270 - Raw Format: IIQ L +[MakerNotes, PhaseOne, Camera] 275 - Image Number: 1288 +[MakerNotes, PhaseOne, Camera] 261 - ISO: 100 +[MakerNotes, PhaseOne, Camera] 528 - Sensor Temperature: 37.00 C +[MakerNotes, PhaseOne, Camera] 529 - Sensor Temperature 2: 37.00 C +[MakerNotes, PhaseOne, Time] 274 - Date/Time Original: 2013:06:19 15:44:21 +[MakerNotes, PhaseOne, Camera] 541 - Black Level: 1024 +[MakerNotes, PhaseOne, Camera] 263 - WB RGB Levels: 1.30548012256622 1 1.41912007331848 +[MakerNotes, PhaseOne, Camera] 262 - Color Matrix 1: 1.280 -0.280 0.000 -0.050 1.180 -0.130 0.000 -0.250 1.250 +[MakerNotes, PhaseOne, Camera] 550 - Color Matrix 2: 1.950 -0.950 0.000 -0.250 1.750 -0.500 0.000 -0.950 1.950 +[MakerNotes, PhaseOne, Camera] 1042 - Lens Model: Mamiya LS 80mm f/2.8 D +[MakerNotes, PhaseOne, Camera] 540 - Strip Offsets: (Binary data 54 bytes) +[MakerNotes, PhaseOne, Camera] 547 - Black Level Data: (Binary data 65 bytes) +[MakerNotes, PhaseOne, Camera] 546 - Split Column: 3696 +[MakerNotes, PhaseOne, Camera] 769 - Firmware Versions: Credo 40, Factory Firmware: 1.01.4 +[MakerNotes, PhaseOne, Camera] 515 - Software: Camera back, Firmware: 1.01.4 +[MakerNotes, PhaseOne, Camera] 516 - System: Digital Camera Back +[MakerNotes, PhaseOne, Camera] 258 - Serial Number: LD001055 +[MakerNotes, PhaseOne, Camera] 1024 - Shutter Speed Value: 1/1250 +[MakerNotes, PhaseOne, Camera] 1025 - Aperture Value: 5.6 +[MakerNotes, PhaseOne, Camera] 1027 - Focal Length: 80.0 mm +[MakerNotes, PhaseOne, Camera] 1031 - Serial Number: LD001055 +[MakerNotes, PhaseOne, Camera] 1024 - Sensor Defects: (Binary data 12 bytes) +[Composite, Composite, Image] Exif-Aperture - Aperture: 5.6 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.41912 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 7320x5484 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 40.1 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 1.30548 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/1250 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 80.0 mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 15.3 +[Composite, Composite, Camera] Exif-LensID-2 - Lens ID: Mamiya LS 80mm f/2.8 D diff --git a/t/PhaseOne_3.out b/t/PhaseOne_3.out new file mode 100644 index 0000000..159123a --- /dev/null +++ b/t/PhaseOne_3.out @@ -0,0 +1,171 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: PhaseOne_3_failed.iiq +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 3.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:47-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:47-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:47-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: IIQ +[File, File, Other] FileTypeExtension - File Type Extension: iiq +[File, File, Other] MIMEType - MIME Type: image/x-raw +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[EXIF, IFD0, Image] 254 - Subfile Type: Full-resolution image +[EXIF, IFD0, Image] 256 - Image Width: 1 +[EXIF, IFD0, Image] 257 - Image Height: 1 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD0, Image] 259 - Compression: Uncompressed +[EXIF, IFD0, Image] 262 - Photometric Interpretation: RGB +[EXIF, IFD0, Camera] 271 - Make: Leaf +[EXIF, IFD0, Camera] 272 - Camera Model Name: Credo 40 +[EXIF, IFD0, Image] 273 - Strip Offsets: 3370 +[EXIF, IFD0, Image] 277 - Samples Per Pixel: 3 +[EXIF, IFD0, Image] 278 - Rows Per Strip: 1 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 3 +[EXIF, IFD0, Image] 282 - X Resolution: 341.3333333 +[EXIF, IFD0, Image] 283 - Y Resolution: 341.3333333 +[EXIF, IFD0, Image] 284 - Planar Configuration: Chunky +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, ExifIFD, Image] 18246 - Rating: 0 +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/1250 +[EXIF, ExifIFD, Image] 33437 - F Number: 5.6 +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2013:06:19 15:44:21 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2013:06:19 15:44:21 +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 3 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/1250 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 5.6 +[EXIF, ExifIFD, Camera] 37384 - Light Source: Daylight +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 80.0 mm +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 7320 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 5484 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Camera] 41987 - White Balance: Manual +[EXIF, ExifIFD, Image] 42016 - Image Unique ID: 00004C20007000000400E05800000508 +[EXIF, ExifIFD, Image] 42033 - Serial Number: 1234 +[EXIF, IFD1, Image] 254 - Subfile Type: Reduced-resolution image +[EXIF, IFD1, Image] 256 - Image Width: 1 +[EXIF, IFD1, Image] 257 - Image Height: 1 +[EXIF, IFD1, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD1, Image] 259 - Compression: Uncompressed +[EXIF, IFD1, Image] 262 - Photometric Interpretation: RGB +[EXIF, IFD1, Image] 273 - Strip Offsets: 3366 +[EXIF, IFD1, Image] 277 - Samples Per Pixel: 3 +[EXIF, IFD1, Image] 278 - Rows Per Strip: 1 +[EXIF, IFD1, Image] 279 - Strip Byte Counts: 3 +[EXIF, IFD1, Image] 282 - X Resolution: 341.3333333 +[EXIF, IFD1, Image] 283 - Y Resolution: 341.3333333 +[EXIF, IFD1, Image] 284 - Planar Configuration: Chunky +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Preview] Exif-ThumbnailTIFF - Thumbnail TIFF: (Binary data 219 bytes) +[MakerNotes, PhaseOne, Camera] 271 - Raw Data: (Binary data 15 bytes) +[MakerNotes, PhaseOne, Camera] 256 - Camera Orientation: Horizontal (normal) +[MakerNotes, PhaseOne, Camera] 533 - Phase One 0x0215: 2 +[MakerNotes, PhaseOne, Camera] 264 - Sensor Width: 7372 +[MakerNotes, PhaseOne, Camera] 265 - Sensor Height: 5536 +[MakerNotes, PhaseOne, Camera] 266 - Sensor Left Margin: 36 +[MakerNotes, PhaseOne, Camera] 267 - Sensor Top Margin: 6 +[MakerNotes, PhaseOne, Camera] 268 - Image Width: 7320 +[MakerNotes, PhaseOne, Camera] 269 - Image Height: 5484 +[MakerNotes, PhaseOne, Camera] 270 - Raw Format: IIQ L +[MakerNotes, PhaseOne, Camera] 259 - Phase One 0x0103: 19 +[MakerNotes, PhaseOne, Camera] 275 - Image Number: 1288 +[MakerNotes, PhaseOne, Camera] 257 - Phase One 0x0101: 32 +[MakerNotes, PhaseOne, Camera] 260 - Phase One 0x0104: 50 +[MakerNotes, PhaseOne, Camera] 261 - ISO: 100 +[MakerNotes, PhaseOne, Camera] 523 - Phase One 0x020b: 0 +[MakerNotes, PhaseOne, Camera] 524 - Phase One 0x020c: 2 +[MakerNotes, PhaseOne, Camera] 581 - Phase One 0x0245: 1.20000004768372 +[MakerNotes, PhaseOne, Camera] 526 - Phase One 0x020e: 3 +[MakerNotes, PhaseOne, Camera] 528 - Sensor Temperature: 37.00 C +[MakerNotes, PhaseOne, Camera] 529 - Sensor Temperature 2: 37.00 C +[MakerNotes, PhaseOne, Time] 530 - Unknown Date: 2013:06:19 15:44:22 +[MakerNotes, PhaseOne, Camera] 531 - Phase One 0x0213: 32 +[MakerNotes, PhaseOne, Time] 274 - Date/Time Original: 2013:06:19 15:44:21 +[MakerNotes, PhaseOne, Camera] 542 - Phase One 0x021e: 1 +[MakerNotes, PhaseOne, Camera] 544 - Phase One 0x0220: 32 +[MakerNotes, PhaseOne, Camera] 545 - Phase One 0x0221: 0 +[MakerNotes, PhaseOne, Camera] 580 - Phase One 0x0244: 0 +[MakerNotes, PhaseOne, Camera] 554 - Phase One 0x022a: 0 +[MakerNotes, PhaseOne, Camera] 555 - Phase One 0x022b: 0 +[MakerNotes, PhaseOne, Camera] 556 - Phase One 0x022c: 0 +[MakerNotes, PhaseOne, Camera] 551 - Phase One 0x0227: 0 +[MakerNotes, PhaseOne, Camera] 553 - Phase One 0x0229: 0 +[MakerNotes, PhaseOne, Camera] 768 - Phase One 0x0300: 2097264 +[MakerNotes, PhaseOne, Camera] 772 - Phase One 0x0304: 4 +[MakerNotes, PhaseOne, Camera] 541 - Black Level: 1024 +[MakerNotes, PhaseOne, Camera] 263 - WB RGB Levels: 1.30548012256622 1 1.41912007331848 +[MakerNotes, PhaseOne, Camera] 262 - Color Matrix 1: 1.280 -0.280 0.000 -0.050 1.180 -0.130 0.000 -0.250 1.250 +[MakerNotes, PhaseOne, Camera] 550 - Color Matrix 2: 1.950 -0.950 0.000 -0.250 1.750 -0.500 0.000 -0.950 1.950 +[MakerNotes, PhaseOne, Camera] 1042 - Lens Model: Mamiya LS 80mm f/2.8 D +[MakerNotes, PhaseOne, Camera] 540 - Strip Offsets: (Binary data 54 bytes) +[MakerNotes, PhaseOne, Camera] 547 - Black Level Data: (Binary data 65 bytes) +[MakerNotes, PhaseOne, Camera] 546 - Split Column: 3696 +[MakerNotes, PhaseOne, Camera] 549 - Phase One 0x0225: 25660 28021 31085 25632 29793 15969 +[MakerNotes, PhaseOne, Camera] 548 - Phase One 0x0224: 2748 +[MakerNotes, PhaseOne, Camera] 769 - Firmware Versions: Credo 40, Factory Firmware: 1.01.4 +[MakerNotes, PhaseOne, Camera] 515 - Software: Camera back, Firmware: 1.01.4 +[MakerNotes, PhaseOne, Camera] 516 - System: Digital Camera Back +[MakerNotes, PhaseOne, Camera] 258 - Serial Number: 1234 +[MakerNotes, PhaseOne, Camera] 1024 - Shutter Speed Value: 1/1250 +[MakerNotes, PhaseOne, Camera] 1025 - Aperture Value: 5.6 +[MakerNotes, PhaseOne, Camera] 1027 - Focal Length: 80.0 mm +[MakerNotes, PhaseOne, Camera] 578 - Phase One 0x0242: 1 +[MakerNotes, PhaseOne, Camera] 579 - Phase One 0x0243: 27 +[MakerNotes, PhaseOne, Camera] 1041 - Phase One 0x0411: 33556736 +[MakerNotes, PhaseOne, Camera] 1043 - Phase One 0x0413: 16909056 +[MakerNotes, PhaseOne, Camera] 1028 - Sensor Calibration 0x0404: IGNORE +[MakerNotes, PhaseOne, Camera] 1029 - Sensor Calibration 0x0405: IGNORE +[MakerNotes, PhaseOne, Camera] 1030 - Sensor Calibration 0x0406: IGNORE +[MakerNotes, PhaseOne, Camera] 1031 - Serial Number: 1234 +[MakerNotes, PhaseOne, Camera] 1026 - Sensor Calibration 0x0402: +[MakerNotes, PhaseOne, Camera] 1032 - Sensor Calibration 0x0408: -71.6800003051758 1.93874990940094 +[MakerNotes, PhaseOne, Camera] 1043 - Sensor Calibration 0x0413: 10 +[MakerNotes, PhaseOne, Camera] 1065 - Sensor Calibration 0x0429: 1836409916 1679849837 1046574177 +[MakerNotes, PhaseOne, Camera] 1066 - Sensor Calibration 0x042a: 1836409916 1679849837 1046574177 +[MakerNotes, PhaseOne, Camera] 1067 - Sensor Calibration 0x042b: 1836409916 1679849837 1046574177 +[MakerNotes, PhaseOne, Camera] 1068 - Sensor Calibration 0x042c: 1836409916 1679849837 1046574177 +[MakerNotes, PhaseOne, Camera] 1073 - Sensor Calibration 0x0431: 2834 5641 11238 18190 25062 31884 37951 10032 10042 100[...] +[MakerNotes, PhaseOne, Camera] 1074 - Sensor Calibration 0x0432: 4914 10023 20046 40093 10026 10030 10032 10031 10000 10[...] +[MakerNotes, PhaseOne, Camera] 1069 - Sensor Calibration 0x042d: 1836409916 1679849837 1046574177 +[MakerNotes, PhaseOne, Camera] 1070 - Sensor Calibration 0x042e: 1836409916 1679849837 1046574177 +[MakerNotes, PhaseOne, Camera] 1071 - Sensor Calibration 0x042f: 1836409916 1679849837 1046574177 +[MakerNotes, PhaseOne, Camera] 1072 - Sensor Calibration 0x0430: 1836409916 1679849837 1046574177 +[MakerNotes, PhaseOne, Camera] 1076 - Sensor Calibration 0x0434: 1836409916 1679849837 1046574177 +[MakerNotes, PhaseOne, Camera] 1077 - Sensor Calibration 0x0435: 1836409916 1679849837 1046574177 +[MakerNotes, PhaseOne, Camera] 1078 - Sensor Calibration 0x0436: 1836409916 1679849837 1046574177 +[MakerNotes, PhaseOne, Camera] 1079 - Sensor Calibration 0x0437: 1836409916 1679849837 1046574177 +[MakerNotes, PhaseOne, Camera] 1052 - Sensor Calibration 0x041c: 0.989000022411346 0.972000002861023 +[MakerNotes, PhaseOne, Camera] 1044 - Sensor Calibration 0x0414: 4 1.06456995010376 -0.060589998960495 -0.00398000003769994 0.00316999992355704 1.00963997840881 -0.012810000218451 0.00692000007256866 0.0190500002354383 0.974020004272461 0.939149975776672 0.0562799982726574 0.00457999994978309 -0.00303000002168119 0.990019977092743 0.0130099998787045 -0.00662000011652708 -0.0197700001299381 1.02637994289398 0.988960027694702 0.971849977970123 0.89521998167038 +[MakerNotes, PhaseOne, Camera] 1075 - Sensor Calibration 0x0433: 1836409916 1679849837 1046574177 +[MakerNotes, PhaseOne, Camera] 1024 - Sensor Defects: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1040 - All Color Flat Field 2: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1040 - All Color Flat Field 2: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1040 - All Color Flat Field 2: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1040 - All Color Flat Field 2: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1040 - All Color Flat Field 2: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1040 - All Color Flat Field 2: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1040 - All Color Flat Field 2: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1040 - All Color Flat Field 2: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1040 - All Color Flat Field 2: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1040 - All Color Flat Field 2: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1040 - All Color Flat Field 2: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1035 - Red Blue Flat Field: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1035 - Red Blue Flat Field: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1035 - Red Blue Flat Field: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1035 - Red Blue Flat Field: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1035 - Red Blue Flat Field: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1035 - Red Blue Flat Field: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1035 - Red Blue Flat Field: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 1035 - Red Blue Flat Field: (Binary data 12 bytes) +[MakerNotes, PhaseOne, Camera] 586 - Phase One 0x024a: 1363265759 +[Composite, Composite, Image] Exif-Aperture - Aperture: 5.6 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 7320x5484 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 40.1 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/1250 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.41912 +[Composite, Composite, Image] Exif-LightValue - Light Value: 15.3 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 1.30548 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 80.0 mm +[Composite, Composite, Camera] Exif-LensID-2 - Lens ID: Mamiya LS 80mm f/2.8 D diff --git a/t/PhotoCD.t b/t/PhotoCD.t new file mode 100644 index 0000000..62ac4c3 --- /dev/null +++ b/t/PhotoCD.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PhotoCD.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::PhotoCD; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PhotoCD'; +my $testnum = 1; + +# test 2: Extract information from PhotoCD file +{ + my $exifTool = new Image::ExifTool; + ++$testnum; + my $info = $exifTool->ImageInfo('t/images/PhotoCD.pcd'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/PhotoCD_2.out b/t/PhotoCD_2.out new file mode 100644 index 0000000..c21709d --- /dev/null +++ b/t/PhotoCD_2.out @@ -0,0 +1,37 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: PhotoCD.pcd +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 4.1 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2012:05:07 13:11:08-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:47-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: PCD +[File, File, Other] FileTypeExtension - File Type Extension: pcd +[File, File, Other] MIMEType - MIME Type: image/x-photo-cd +[PhotoCD, PhotoCD, Image] 7 - Specification Version: 0.6 +[PhotoCD, PhotoCD, Image] 9 - Authoring Software Release: 7.61 +[PhotoCD, PhotoCD, Image] 11 - Image Magnification Descriptor: 1.0 +[PhotoCD, PhotoCD, Time] 13 - Create Date: 2001:06:27 01:29:36-04:00 +[PhotoCD, PhotoCD, Time] 17 - Modify Date: 2001:06:27 01:29:36-04:00 +[PhotoCD, PhotoCD, Image] 21 - Image Medium: Color negative +[PhotoCD, PhotoCD, Image] 22 - Product Type: 080/11 SPD 0100 +[PhotoCD, PhotoCD, Image] 42 - Scanner Vendor ID: KODAK /4220 +[PhotoCD, PhotoCD, Image] 62 - Scanner Product ID: FilmScanner 2000 +[PhotoCD, PhotoCD, Image] 78 - Scanner Firmware Version: 4.17 +[PhotoCD, PhotoCD, Image] 82 - Scanner Firmware Date: +[PhotoCD, PhotoCD, Image] 90 - Scanner Serial Number: 436 +[PhotoCD, PhotoCD, Image] 110 - Scanner Pixel Size: 11.48 micrometers +[PhotoCD, PhotoCD, Image] 112 - Image Workstation Make: Eastman Kodak +[PhotoCD, PhotoCD, Image] 132 - Character Set: 95 characters ISO 646 +[PhotoCD, PhotoCD, Image] 165 - Photo Finisher Name: Prolab, Inc. 206-547-5447 +[PhotoCD, PhotoCD, Image] 228 - Scene Balance Algorithm Revision: 6.7 +[PhotoCD, PhotoCD, Image] 230 - Scene Balance Algorithm Command: Neutral SBA On, Color SBA On +[PhotoCD, PhotoCD, Image] 325 - Scene Balance Algorithm Film ID: Kodak Gold 100 Gen 2 +[PhotoCD, PhotoCD, Image] 331 - Copyright Status: Not specified +[PhotoCD, PhotoCD, Image] 1538 - Orientation: Rotate 270 CW +[PhotoCD, PhotoCD, Image] 1538.1 - Image Width: 2048 +[PhotoCD, PhotoCD, Image] 1538.2 - Image Height: 3072 +[PhotoCD, PhotoCD, Image] 1538.3 - Compression Class: Class 1 - 35mm film; Pictoral hard copy +[Composite, Composite, Image] Exif-ImageSize - Image Size: 2048x3072 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 6.3 diff --git a/t/PhotoMechanic.t b/t/PhotoMechanic.t new file mode 100644 index 0000000..1ca83c8 --- /dev/null +++ b/t/PhotoMechanic.t @@ -0,0 +1,39 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PhotoMechanic.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::PhotoMechanic; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PhotoMechanic'; +my $testnum = 1; + +# test 2: Extract information from PhotoMechanic.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/PhotoMechanic.jpg', {Duplicates => 1}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Test writing some information +{ + ++$testnum; + my @writeInfo = ( + ['Rotation' => 90 ], + ['Keywords' => 'PhotoMechanic' ], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, undef, 1); + print "ok $testnum\n"; +} + +# end diff --git a/t/PhotoMechanic_2.out b/t/PhotoMechanic_2.out new file mode 100644 index 0000000..b7f555c --- /dev/null +++ b/t/PhotoMechanic_2.out @@ -0,0 +1,83 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: PhotoMechanic.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 3.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:10:31 12:53:49-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:47-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 2c19015ea7e2d138576e147a3f093c1a +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[IPTC, IPTC, Other] 0 - Application Record Version: 3 +[IPTC, IPTC, Time] 55 - Date Created: 2006:10:29 +[IPTC, IPTC, Time] 60 - Time Created: 06:27:51-05:00 +[IPTC, IPTC, Location] 90 - City: kingston +[IPTC, IPTC, Location] 95 - Province-State: State +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Country +[IPTC, IPTC, Location] 100 - Country-Primary Location Code: COD +[IPTC, IPTC, Other] 5 - Object Name: Object Name +[IPTC, IPTC, Other] 15 - Category: Category +[IPTC, IPTC, Other] 20 - Supplemental Categories: Supp Cat 1, Supp Cat 2 +[IPTC, IPTC, Other] 25 - Keywords: Keywords, one, three, two +[IPTC, IPTC, Other] 7 - Edit Status: Edit Status +[IPTC, IPTC, Author] 80 - By-line: Photographer +[IPTC, IPTC, Author] 85 - By-line Title: Title +[IPTC, IPTC, Author] 110 - Credit: Credit +[IPTC, IPTC, Author] 115 - Source: Source +[IPTC, IPTC, Author] 122 - Writer-Editor: Writers +[IPTC, IPTC, Other] 120 - Caption-Abstract: Caption +[IPTC, IPTC, Other] 105 - Headline: Headline +[IPTC, IPTC, Other] 40 - Special Instructions: Special ins +[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright +[IPTC, IPTC, Image] 221 - Prefs: Tagged:0, ColorClass:0, Rating:0, FrameNum:-00001 +[Photoshop, Photoshop, Image] 0 - X Resolution: 200 +[Photoshop, Photoshop, Image] 2 - Displayed Units X: inches +[Photoshop, Photoshop, Image] 4 - Y Resolution: 200 +[Photoshop, Photoshop, Image] 6 - Displayed Units Y: inches +[Photoshop, Photoshop, Author] 1034 - Copyright Flag: True +[XMP, XMP-x, Document] xmptk - XMP Toolkit: XMP toolkit 2.9-9, framework 1.6 +[XMP, XMP-iptcCore, Location] CountryCode - Country Code: COD +[XMP, XMP-photoshop, Location] City - City: kingston +[XMP, XMP-photoshop, Location] State - State: State +[XMP, XMP-photoshop, Location] Country - Country: Country +[XMP, XMP-photoshop, Image] Category - Category: Category +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: Title +[XMP, XMP-photoshop, Author] Credit - Credit: Credit +[XMP, XMP-photoshop, Author] Source - Source: Source +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: Writers +[XMP, XMP-photoshop, Image] Headline - Headline: Headline +[XMP, XMP-photoshop, Image] Instructions - Instructions: Special ins +[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: Trans ref +[XMP, XMP-photoshop, Image] Urgency - Urgency: 8 (least urgent) +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: Supp Cat 1, Supp Cat 2 +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2006:10:29 +[XMP, XMP-xmpRights, Author] Marked - Marked: True +[XMP, XMP-photomech, Image] Prefs - Prefs: Tagged:0, ColorClass:0, Rating:0, FrameNum:-00001 +[XMP, XMP-photomech, Image] EditStatus - Edit Status: Edit Status +[XMP, XMP-photomech, Location] CountryCode - Country Code: COD +[XMP, XMP-photomech, Time] TimeCreated - Time Created: 06:27:51-05:00 +[XMP, XMP-dc, Image] subject - Subject: Keywords, one, three, two +[XMP, XMP-dc, Image] description - Description: Caption +[XMP, XMP-dc, Author] creator - Creator: Photographer +[XMP, XMP-dc, Image] title - Title: Object Name +[XMP, XMP-dc, Author] rights - Rights: Copyright +[PhotoMechanic, PhotoMechanic, Image] 221 - Tagged: Yes +[PhotoMechanic, PhotoMechanic, Image] 222 - Color Class: 6 (Typical alt) +[PhotoMechanic, PhotoMechanic, Image] 216 - Rotation: 180 +[PhotoMechanic, PhotoMechanic, Image] 217 - Crop Left: 438 +[PhotoMechanic, PhotoMechanic, Image] 218 - Crop Top: 618 +[PhotoMechanic, PhotoMechanic, Image] 219 - Crop Right: 890 +[PhotoMechanic, PhotoMechanic, Image] 220 - Crop Bottom: 1072 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Time] IPTC-DateTimeCreated - Date/Time Created: 2006:10:29 06:27:51-05:00 +[Composite, Composite, Time] Exif-DateTimeOriginal - Date/Time Original: 2006:10:29 06:27:51-05:00 diff --git a/t/PhotoMechanic_3.out b/t/PhotoMechanic_3.out new file mode 100644 index 0000000..cd7ec2f --- /dev/null +++ b/t/PhotoMechanic_3.out @@ -0,0 +1,2 @@ +[IPTC, IPTC, Other] 25 - Keywords: PhotoMechanic +[PhotoMechanic, PhotoMechanic, Image] 216 - Rotation: 90 diff --git a/t/Photoshop.t b/t/Photoshop.t new file mode 100644 index 0000000..674627d --- /dev/null +++ b/t/Photoshop.t @@ -0,0 +1,43 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Photoshop.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Photoshop; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Photoshop'; +my $testnum = 1; + +# test 2: Extract information from Photoshop.psd +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Photoshop.psd'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + [XResolution => '120'], + [YResolution => '120'], + [Creator => 'Phil Harvey'], + ['By-Line' => 'Phil Again'], + ['PhotoMechanic:Tagged' => No], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/Photoshop.psd'); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Photoshop_2.out b/t/Photoshop_2.out new file mode 100644 index 0000000..6d0a077 --- /dev/null +++ b/t/Photoshop_2.out @@ -0,0 +1,109 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Photoshop.psd +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 17 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:12:04 21:22:58-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:48-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: PSD +[File, File, Other] FileTypeExtension - File Type Extension: psd +[File, File, Other] MIMEType - MIME Type: application/vnd.adobe.photoshop +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: b765e54396f2885e9a76ff4ad665b190 +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[Photoshop, Photoshop, Image] 6 - Num Channels: 3 +[Photoshop, Photoshop, Image] 7 - Image Height: 8 +[Photoshop, Photoshop, Image] 9 - Image Width: 8 +[Photoshop, Photoshop, Image] 11 - Bit Depth: 8 +[Photoshop, Photoshop, Image] 12 - Color Mode: RGB +[Photoshop, Photoshop, Image] 1061 - IPTC Digest: b765e54396f2885e9a76ff4ad665b190 +[Photoshop, Photoshop, Image] 0 - X Resolution: 72 +[Photoshop, Photoshop, Image] 2 - Displayed Units X: inches +[Photoshop, Photoshop, Image] 4 - Y Resolution: 72 +[Photoshop, Photoshop, Image] 6 - Displayed Units Y: inches +[Photoshop, Photoshop, Image] 0 - Print Style: Centered +[Photoshop, Photoshop, Image] 2 - Print Position: 0 0 +[Photoshop, Photoshop, Image] 10 - Print Scale: 1 +[Photoshop, Photoshop, Image] 1037 - Global Angle: 120 +[Photoshop, Photoshop, Image] 1049 - Global Altitude: 30 +[Photoshop, Photoshop, Author] 1034 - Copyright Flag: False +[Photoshop, Photoshop, Author] 1035 - URL: https://exiftool.org/ +[Photoshop, Photoshop, Image] 1054 - URL List: +[Photoshop, Photoshop, Other] 20 - Slices Group Name: b +[Photoshop, Photoshop, Other] 24 - Num Slices: 1 +[Photoshop, Photoshop, Image] 4 - Has Real Merged Data: Yes +[Photoshop, Photoshop, Image] 5 - Writer Name: Adobe Photoshop +[Photoshop, Photoshop, Image] 9 - Reader Name: Adobe Photoshop 7.0 +[Photoshop, Photoshop, Image] _xcnt - Layer Count: 0 +[Photoshop, Photoshop, Image] 0 - Compression: RLE +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: This is a teeny weeny white square +[IPTC, IPTC, Author] 122 - Writer-Editor: Me too +[IPTC, IPTC, Author] 80 - By-line: Phil Harvey +[IPTC, IPTC, Author] 85 - By-line Title: Supreme leader +[IPTC, IPTC, Other] 5 - Object Name: Test Picture +[IPTC, IPTC, Author] 116 - Copyright Notice: Free for all +[XMP, XMP-x, Document] xmptk - XMP Toolkit: XMP toolkit 2.8.2-33, framework 1.5 +[XMP, XMP-rdf, Document] about - About: uuid:c197d41e-f8f7-11d9-b03e-c023c3939af5 +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: Me too +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: Supreme leader +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: This isn't a job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:c197d41a-f8f7-11d9-b03e-c023c3939af5 +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[XMP, XMP-dc, Image] description - Description: This is a teeny weeny white square +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] title - Title: Test Picture +[XMP, XMP-dc, Author] rights - Rights: Free for all +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Adobe Systems Inc. +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.1.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1999:06:03 00:00:00 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Apple Computer Inc. +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: none +[ICC_Profile, ICC-header, Image] 52 - Device Model: +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Media-Relative Colorimetric +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: Adobe Systems Inc. +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Copyright 1999 Adobe Systems Incorporated +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: Apple RGB +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.95045 1 1.08905 +[ICC_Profile, ICC_Profile, Image] bkpt - Media Black Point: 0 0 0 +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.47554 0.25516 0.01845 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.33972 0.67259 0.11333 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.14896 0.07225 0.69312 +[EXIF, IFD0, Image] 270 - Image Description: This is a teeny weeny white square +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:18 08:27:14 +[EXIF, IFD0, Author] 315 - Artist: Phil Harvey +[EXIF, IFD0, Author] 33432 - Copyright: Free for all +[EXIF, ExifIFD, Image] 40961 - Color Space: Uncalibrated +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 8 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 8 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 390 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 0 +[PhotoMechanic, PhotoMechanic, Image] 221 - Tagged: Yes +[PhotoMechanic, PhotoMechanic, Image] 222 - Color Class: 6 (Typical alt) +[PhotoMechanic, PhotoMechanic, Image] 216 - Rotation: 180 +[PhotoMechanic, PhotoMechanic, Image] 217 - Crop Left: 438 +[PhotoMechanic, PhotoMechanic, Image] 218 - Crop Top: 618 +[PhotoMechanic, PhotoMechanic, Image] 219 - Crop Right: 890 +[PhotoMechanic, PhotoMechanic, Image] 220 - Crop Bottom: 1072 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/Photoshop_3.out b/t/Photoshop_3.out new file mode 100644 index 0000000..a57a034 --- /dev/null +++ b/t/Photoshop_3.out @@ -0,0 +1,118 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[ExifTool, ExifTool, ExifTool] Warning - Warning: IPTCDigest is not current. XMP may be out of sync +[File, System, Other] FileName - File Name: Photoshop_3_failed.psd +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 17 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:48-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:48-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:48-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: PSD +[File, File, Other] FileTypeExtension - File Type Extension: psd +[File, File, Other] MIMEType - MIME Type: application/vnd.adobe.photoshop +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 01c26dbee9b75ddbe23315cf1b5e1486 +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[Photoshop, Photoshop, Image] 6 - Num Channels: 3 +[Photoshop, Photoshop, Image] 7 - Image Height: 8 +[Photoshop, Photoshop, Image] 9 - Image Width: 8 +[Photoshop, Photoshop, Image] 11 - Bit Depth: 8 +[Photoshop, Photoshop, Image] 12 - Color Mode: RGB +[Photoshop, Photoshop, Image] 1061 - IPTC Digest: b765e54396f2885e9a76ff4ad665b190 +[Photoshop, Photoshop, Image] 1002 - XML Data: (Binary data 7600 bytes) +[Photoshop, Photoshop, Image] 1001 - Macintosh Print Info: .HH.Þ.@ÿîÿî...R.g.(.ü.HH.Ø.(.d......ÿ..h... +[Photoshop, Photoshop, Image] 0 - X Resolution: 120 +[Photoshop, Photoshop, Image] 2 - Displayed Units X: inches +[Photoshop, Photoshop, Image] 4 - Y Resolution: 120 +[Photoshop, Photoshop, Image] 6 - Displayed Units Y: inches +[Photoshop, Photoshop, Image] 0 - Print Style: Centered +[Photoshop, Photoshop, Image] 2 - Print Position: 0 0 +[Photoshop, Photoshop, Image] 10 - Print Scale: 1 +[Photoshop, Photoshop, Image] 1037 - Global Angle: 120 +[Photoshop, Photoshop, Image] 1049 - Global Altitude: 30 +[Photoshop, Photoshop, Image] 1011 - Print Flags: 0 0 0 0 0 0 0 0 1 +[Photoshop, Photoshop, Author] 1034 - Copyright Flag: False +[Photoshop, Photoshop, Author] 1035 - URL: https://exiftool.org/ +[Photoshop, Photoshop, Image] 10000 - Print Flags Info: .. +[Photoshop, Photoshop, Image] 1013 - Color Halftoning Info: /ff.lff../ff.¡™š..2.Z..5.-.. +[Photoshop, Photoshop, Image] 1016 - Color Transfer Funcs: ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ.è +[Photoshop, Photoshop, Image] 1032 - Grid Guides Info: ..@.@ +[Photoshop, Photoshop, Image] 1054 - URL List: +[Photoshop, Photoshop, Other] 20 - Slices Group Name: b +[Photoshop, Photoshop, Other] 24 - Num Slices: 1 +[Photoshop, Photoshop, Image] 1044 - IDs Base Value: 1 +[Photoshop, Photoshop, Image] 4 - Has Real Merged Data: Yes +[Photoshop, Photoshop, Image] 5 - Writer Name: Adobe Photoshop +[Photoshop, Photoshop, Image] 9 - Reader Name: Adobe Photoshop 7.0 +[Photoshop, Photoshop, Image] _xcnt - Layer Count: 0 +[Photoshop, Photoshop, Image] 0 - Compression: RLE +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: This is a teeny weeny white square +[IPTC, IPTC, Author] 122 - Writer-Editor: Me too +[IPTC, IPTC, Author] 80 - By-line: Phil Again +[IPTC, IPTC, Author] 85 - By-line Title: Supreme leader +[IPTC, IPTC, Other] 5 - Object Name: Test Picture +[IPTC, IPTC, Author] 116 - Copyright Notice: Free for all +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-rdf, Document] about - About: uuid:c197d41e-f8f7-11d9-b03e-c023c3939af5 +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: This is a teeny weeny white square +[XMP, XMP-dc, Author] rights - Rights: Free for all +[XMP, XMP-dc, Image] title - Title: Test Picture +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: Supreme leader +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: Me too +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: This isn't a job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:c197d41a-f8f7-11d9-b03e-c023c3939af5 +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Adobe Systems Inc. +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.1.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1999:06:03 00:00:00 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Apple Computer Inc. +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: none +[ICC_Profile, ICC-header, Image] 52 - Device Model: +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Media-Relative Colorimetric +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: Adobe Systems Inc. +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Copyright 1999 Adobe Systems Incorporated +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: Apple RGB +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.95045 1 1.08905 +[ICC_Profile, ICC_Profile, Image] bkpt - Media Black Point: 0 0 0 +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.47554 0.25516 0.01845 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.33972 0.67259 0.11333 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.14896 0.07225 0.69312 +[EXIF, IFD0, Image] 270 - Image Description: This is a teeny weeny white square +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 120 +[EXIF, IFD0, Image] 283 - Y Resolution: 120 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:07:18 08:27:14 +[EXIF, IFD0, Author] 315 - Artist: Phil Harvey +[EXIF, IFD0, Author] 33432 - Copyright: Free for all +[EXIF, ExifIFD, Image] 40961 - Color Space: Uncalibrated +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 8 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 8 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 388 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 0 +[PhotoMechanic, PhotoMechanic, Image] 221 - Tagged: No +[PhotoMechanic, PhotoMechanic, Image] 222 - Color Class: 6 (Typical alt) +[PhotoMechanic, PhotoMechanic, Image] 216 - Rotation: 180 +[PhotoMechanic, PhotoMechanic, Image] 217 - Crop Left: 438 +[PhotoMechanic, PhotoMechanic, Image] 218 - Crop Top: 618 +[PhotoMechanic, PhotoMechanic, Image] 219 - Crop Right: 890 +[PhotoMechanic, PhotoMechanic, Image] 220 - Crop Bottom: 1072 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/PostScript.t b/t/PostScript.t new file mode 100644 index 0000000..d275333 --- /dev/null +++ b/t/PostScript.t @@ -0,0 +1,50 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/PostScript.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::PostScript; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'PostScript'; +my $testnum = 1; + +# test 2: Extract information from PostScript.eps +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/PostScript.eps'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write EPS information (and test ExtractEmbedded option) +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/IPTC.jpg','*:*'); + $exifTool->SetNewValuesFromFile('t/images/XMP.jpg','*:*'); + $exifTool->SetNewValue(Title => 'new title'); + $exifTool->SetNewValue(Copyright => 'my copyright'); + $exifTool->SetNewValue(Creator => 'phil made it', Replace => 1); + my $testfile = "t/${testname}_${testnum}_failed.eps"; + unlink $testfile; + $exifTool->WriteInfo('t/images/PostScript.eps', $testfile); + my $info = $exifTool->ImageInfo($testfile, {ExtractEmbedded => 1}); + if (check($exifTool, $info, $testname, $testnum, $testnum, 3)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + + +# end diff --git a/t/PostScript_2.out b/t/PostScript_2.out new file mode 100644 index 0000000..5711c42 --- /dev/null +++ b/t/PostScript_2.out @@ -0,0 +1,66 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: PostScript.eps +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 11 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:12:04 21:22:58-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:49-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:01:12 18:02:53-05:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: EPS +[File, File, Other] FileTypeExtension - File Type Extension: eps +[File, File, Other] MIMEType - MIME Type: application/postscript +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 9e02efbd9bdc1dc192279e30a0e27323 +[PostScript, PostScript, Image] Creator - Creator: Adobe Photoshop Version 7.0.1 +[PostScript, PostScript, Image] Title - Title: c.eps +[PostScript, PostScript, Time] CreationDate - Create Date: 7/18/05 2:33 PM +[PostScript, PostScript, Image] BoundingBox - Bounding Box: 0 0 8 8 +[PostScript, PostScript, Image] ImageData - Image Data: 8 8 8 3 1 8 2 "beginimage" +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: A witty caption +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it +[IPTC, IPTC, Other] 105 - Headline: No headline +[IPTC, IPTC, Other] 40 - Special Instructions: What instructions +[IPTC, IPTC, Author] 80 - By-line: Phil Harvey +[IPTC, IPTC, Author] 85 - By-line Title: My Position +[IPTC, IPTC, Author] 110 - Credit: My Credit +[IPTC, IPTC, Author] 115 - Source: I'm the source +[IPTC, IPTC, Other] 5 - Object Name: Test IPTC picture +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ont +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 103 - Original Transmission Reference: What is a transmission reference +[IPTC, IPTC, Other] 15 - Category: 1 +[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing, image, utilities +[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Other] 25 - Keywords: ExifTool, Test, XMP +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright 2004 Phil Harvey +[Photoshop, Photoshop, Image] 1061 - IPTC Digest: 9e02efbd9bdc1dc192279e30a0e27323 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: XMP toolkit 2.8.2-33, framework 1.5 +[XMP, XMP-rdf, Document] about - About: uuid:b691db36-f92a-11d9-99a4-8c8e8269c120 +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: My Position +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: I wrote it +[XMP, XMP-photoshop, Image] Category - Category: 1 +[XMP, XMP-photoshop, Location] City - City: Kingston +[XMP, XMP-photoshop, Location] Country - Country: Canada +[XMP, XMP-photoshop, Author] Credit - Credit: My Credit +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2004:02:26 +[XMP, XMP-photoshop, Image] Headline - Headline: No headline +[XMP, XMP-photoshop, Image] Instructions - Instructions: What instructions +[XMP, XMP-photoshop, Author] Source - Source: I'm the source +[XMP, XMP-photoshop, Location] State - State: Ont +[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: What is a transmission reference +[XMP, XMP-photoshop, Image] Urgency - Urgency: 8 (least urgent) +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: amazing, image, utilities +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:cbcc2a62-f127-11d9-ac4d-e8be6f73552e +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: A witty caption +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image] title - Title: Test IPTC picture +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP +[Composite, Composite, Image] PostScript-ImageHeight - Image Height: 8 +[Composite, Composite, Image] PostScript-ImageWidth - Image Width: 8 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/PostScript_3.out b/t/PostScript_3.out new file mode 100644 index 0000000..73031ef --- /dev/null +++ b/t/PostScript_3.out @@ -0,0 +1,135 @@ +[ExifTool, ExifTool, ExifTool, Main] ExifToolVersion - ExifTool Version Number: 12.42 +[ExifTool, ExifTool, ExifTool, Main] Warning - Warning: IPTCDigest is not current. XMP may be out of sync +[File, System, Other, Main] FileName - File Name: PostScript_3_failed.eps +[File, System, Other, Main] Directory - Directory: t +[File, System, Other, Main] FileSize - File Size: 14 kB +[File, System, Time, Main] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:49-04:00 +[File, System, Time, Main] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:49-04:00 +[File, System, Time, Main] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:49-04:00 +[File, System, Other, Main] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other, Main] FileType - File Type: EPS +[File, File, Other, Main] FileTypeExtension - File Type Extension: eps +[File, File, Other, Main] MIMEType - MIME Type: application/postscript +[File, File, Image, Main] CurrentIPTCDigest - Current IPTC Digest: 04d104a94abbcadb3742516c01f6568b +[File, File, Image, Main] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[PostScript, PostScript, Image, Main] Creator - Creator: phil made it +[PostScript, PostScript, Image, Main] Title - Title: new title +[PostScript, PostScript, Time, Main] CreationDate - Create Date: 7/18/05 2:33 PM +[PostScript, PostScript, Image, Main] BoundingBox - Bounding Box: 0 0 8 8 +[PostScript, PostScript, Image, Main] Copyright - Copyright: my copyright +[PostScript, PostScript, Image, Doc1] EmbeddedFileName - Embedded File Name: Test-Doc1.eps +[PostScript, PostScript, Image, Doc1] Creator - Creator: Adobe Photoshop Version 9.0x211 +[PostScript, PostScript, Image, Doc1] Title - Title: 12a.eps +[PostScript, PostScript, Image, Doc1] BoundingBox - Bounding Box: 0 0 435 283 +[PostScript, PostScript, Image, Doc2] EmbeddedFileName - Embedded File Name: Test-Doc2.eps +[PostScript, PostScript, Image, Doc2] Creator - Creator: Adobe Photoshop Version 9.0x211 +[PostScript, PostScript, Image, Doc2] Title - Title: 12b.eps +[PostScript, PostScript, Image, Doc2] BoundingBox - Bounding Box: 0 0 435 283 +[PostScript, PostScript, Image, Doc2-1] EmbeddedFileName - Embedded File Name: Test-Doc2-1.eps +[PostScript, PostScript, Image, Doc2-1] Creator - Creator: Adobe Photoshop Version 9.0x211 +[PostScript, PostScript, Image, Doc2-1] Title - Title: 12c.eps +[PostScript, PostScript, Image, Doc2-1] BoundingBox - Bounding Box: 0 0 435 283 +[PostScript, PostScript, Image, Doc3] EmbeddedFileName - Embedded File Name: Test-Doc3.eps +[PostScript, PostScript, Image, Doc3] Creator - Creator: Adobe Photoshop Version 9.0x211 +[PostScript, PostScript, Image, Doc3] Title - Title: 12d.eps +[PostScript, PostScript, Image, Doc3] BoundingBox - Bounding Box: 0 0 435 283 +[PostScript, PostScript, Image, Main] ImageData - Image Data: 8 8 8 3 1 8 2 "beginimage" +[IPTC, IPTC, Other, Main] 0 - Application Record Version: 2 +[IPTC, IPTC, Other, Main] 120 - Caption-Abstract: A witty caption +[IPTC, IPTC, Author, Main] 122 - Writer-Editor: I wrote it +[IPTC, IPTC, Other, Main] 105 - Headline: No headline +[IPTC, IPTC, Other, Main] 40 - Special Instructions: What instructions +[IPTC, IPTC, Author, Main] 80 - By-line: Phil Harvey +[IPTC, IPTC, Author, Main] 85 - By-line Title: My Position +[IPTC, IPTC, Author, Main] 110 - Credit: My Credit +[IPTC, IPTC, Author, Main] 115 - Source: I'm the source +[IPTC, IPTC, Other, Main] 5 - Object Name: Test IPTC picture +[IPTC, IPTC, Time, Main] 55 - Date Created: 2004:02:26 +[IPTC, IPTC, Location, Main] 90 - City: Kingston +[IPTC, IPTC, Location, Main] 95 - Province-State: Ont +[IPTC, IPTC, Location, Main] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other, Main] 103 - Original Transmission Reference: What is a transmission reference +[IPTC, IPTC, Other, Main] 15 - Category: 1 +[IPTC, IPTC, Other, Main] 20 - Supplemental Categories: amazing, image, utilities +[IPTC, IPTC, Other, Main] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Other, Main] 25 - Keywords: ExifTool, Test, IPTC +[IPTC, IPTC, Author, Main] 116 - Copyright Notice: Copyright 2004 Phil Harvey +[Photoshop, Photoshop, Image, Main] 1061 - IPTC Digest: 9e02efbd9bdc1dc192279e30a0e27323 +[Photoshop, Photoshop, Author, Main] 1034 - Copyright Flag: False +[Photoshop, Photoshop, Author, Main] 1035 - URL: https://exiftool.org/ +[Photoshop, Photoshop, Image, Main] 1037 - Global Angle: 30 +[Photoshop, Photoshop, Image, Main] 1049 - Global Altitude: 30 +[EXIF, IFD0, Image, Main] 270 - Image Description: A witty caption +[EXIF, IFD0, Camera, Main] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera, Main] 272 - Camera Model Name: FinePix2400Zoom +[EXIF, IFD0, Image, Main] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image, Main] 282 - X Resolution: 72 +[EXIF, IFD0, Image, Main] 283 - Y Resolution: 72 +[EXIF, IFD0, Image, Main] 296 - Resolution Unit: inches +[EXIF, IFD0, Image, Main] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time, Main] 306 - Modify Date: 2004:02:26 09:36:46 +[EXIF, IFD0, Author, Main] 315 - Artist: Phil Harvey +[EXIF, IFD0, Image, Main] 531 - Y Cb Cr Positioning: Centered +[EXIF, IFD0, Author, Main] 33432 - Copyright: my copyright +[EXIF, ExifIFD, Image, Main] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera, Main] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image, Main] 34855 - ISO: 100 +[EXIF, ExifIFD, Image, Main] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time, Main] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time, Main] 36868 - Create Date: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image, Main] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image, Main] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image, Main] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image, Main] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image, Main] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera, Main] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera, Main] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera, Main] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera, Main] 37386 - Focal Length: 6.0 mm +[EXIF, ExifIFD, Image, Main] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image, Main] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image, Main] 40962 - Exif Image Width: 100 +[EXIF, ExifIFD, Image, Main] 40963 - Exif Image Height: 80 +[EXIF, ExifIFD, Camera, Main] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera, Main] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera, Main] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera, Main] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image, Main] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image, Main] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image, Main] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image, Main] 282 - X Resolution: 72 +[EXIF, IFD1, Image, Main] 283 - Y Resolution: 72 +[EXIF, IFD1, Image, Main] 296 - Resolution Unit: inches +[XMP, XMP-x, Document, Main] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-rdf, Document, Main] about - About: uuid:b691db36-f92a-11d9-99a4-8c8e8269c120 +[XMP, XMP-dc, Author, Main] creator - Creator: phil made it +[XMP, XMP-dc, Image, Main] description - Description: UTF-16 (big-endian) encoded XMP +[XMP, XMP-dc, Author, Main] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image, Main] subject - Subject: ExifTool, Test, XMP +[XMP, XMP-dc, Image, Main] title - Title: new title +[XMP, XMP-photoshop, Author, Main] AuthorsPosition - Authors Position: My Position +[XMP, XMP-photoshop, Author, Main] CaptionWriter - Caption Writer: I wrote it +[XMP, XMP-photoshop, Image, Main] Category - Category: 1 +[XMP, XMP-photoshop, Location, Main] City - City: Kingston +[XMP, XMP-photoshop, Location, Main] Country - Country: Canada +[XMP, XMP-photoshop, Author, Main] Credit - Credit: My Credit +[XMP, XMP-photoshop, Time, Main] DateCreated - Date Created: 2004:02:26 +[XMP, XMP-photoshop, Image, Main] Headline - Headline: No headline +[XMP, XMP-photoshop, Image, Main] Instructions - Instructions: What instructions +[XMP, XMP-photoshop, Author, Main] Source - Source: I'm the source +[XMP, XMP-photoshop, Location, Main] State - State: Ont +[XMP, XMP-photoshop, Image, Main] SupplementalCategories - Supplemental Categories: amazing, image, utilities +[XMP, XMP-photoshop, Image, Main] TransmissionReference - Transmission Reference: What is a transmission reference? +[XMP, XMP-photoshop, Image, Main] Urgency - Urgency: 8 (least urgent) +[XMP, XMP-xmpBJ, Other, Main] JobRefName - Job Ref Name: My Job +[XMP, XMP-xmpMM, Other, Main] DocumentID - Document ID: adobe:docid:photoshop:4cc7b857-69d0-11d8-8ac4-bb59c92f0d9a +[XMP, XMP-xmpRights, Author, Main] Marked - Marked: False +[XMP, XMP-xmpRights, Author, Main] WebStatement - Web Statement: https://exiftool.org/ +[Composite, Composite, Image, Main] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image, Main] Exif-ShutterSpeed - Shutter Speed: 1/64 +[Composite, Composite, Image, Main] PostScript-ImageHeight - Image Height: 8 +[Composite, Composite, Image, Main] PostScript-ImageWidth - Image Width: 8 +[Composite, Composite, Image, Main] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image, Main] Exif-LightValue - Light Value: 9.6 +[Composite, Composite, Image, Main] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera, Main] Exif-FocalLength35efl - Focal Length: 6.0 mm diff --git a/t/QuickTime.t b/t/QuickTime.t new file mode 100644 index 0000000..a23e1d9 --- /dev/null +++ b/t/QuickTime.t @@ -0,0 +1,241 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/QuickTime.t". + +BEGIN { + $| = 1; print "1..17\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::QuickTime; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'QuickTime'; +my $testnum = 1; + +# tests 2-3: Extract information from QuickTime.mov and QuickTime.m4a +{ + my $ext; + foreach $ext (qw(mov m4a)) { + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo("t/images/QuickTime.$ext"); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + } +} + +# tests 4-5: Try writing XMP to the different file formats +{ + my $ext; + my $exifTool = new Image::ExifTool; + $exifTool->Options(SavePath => 1); # to save group 5 names + $exifTool->SetNewValue('XMP:Title' => 'x'); + $exifTool->SetNewValue('TrackCreateDate' => '2000:01:02 03:04:05'); + $exifTool->SetNewValue('Track1:TrackModifyDate' => '2013:11:04 10:32:15'); + foreach $ext (qw(mov m4a)) { + ++$testnum; + unless (eval { require Time::Local }) { + print "ok $testnum # skip Requires Time::Local\n"; + next; + } + my $testfile = "t/${testname}_${testnum}_failed.$ext"; + unlink $testfile; + my $rtnVal = $exifTool->WriteInfo("t/images/QuickTime.$ext", $testfile); + my $info = $exifTool->ImageInfo($testfile, 'title', 'time:all'); + if (check($exifTool, $info, $testname, $testnum, undef, 5)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + } +} + +# test 6: Write video rotation +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue('Rotation' => '270', Protected => 1); + my $testfile = "t/${testname}_${testnum}_failed.mov"; + unlink $testfile; + my $rtnVal = $exifTool->WriteInfo('t/images/QuickTime.mov', $testfile); + my $info = $exifTool->ImageInfo($testfile, 'Rotation', 'MatrixStructure'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 7: Add a bunch of new tags and delete one +{ + ++$testnum; + my @writeInfo = ( + ['QuickTime:Artist' => 'me'], + ['QuickTime:Model' => 'model'], + ['UserData:Genre' => 'rock'], + ['UserData:Album' => 'albumA'], + ['ItemList:Album' => 'albumB'], + ['ItemList:ID-albm:Album' => 'albumC'], + ['QuickTime:Comment-fra-FR' => 'fr comment'], + ['Keys:Director' => 'director'], + ['Keys:CameraDirection' => '90'], + ['Keys:Album' => undef ], + ); + my @extract = ('ItemList:all', 'UserData:all', 'Keys:all'); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/QuickTime.mov', \@extract); + print "ok $testnum\n"; +} + +# test 8-9: Delete everything then add back some tags in one step +{ + my $ext; + my $exifTool = new Image::ExifTool; + my @writeInfo = ( + ['all' => undef], + ['artist' => 'me'], + ['keys:director' => 'dir'], + ['userdata:arranger' => 'arr'], + ); + my @extract = ('QuickTime:all', 'XMP:all'); + foreach $ext (qw(mov m4a)) { + ++$testnum; + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, "t/images/QuickTime.$ext", \@extract); + print "ok $testnum\n"; + } +} + +# test 10: Delete everything then add back some tags in two steps +{ + ++$testnum; + my $testfile = "t/${testname}_${testnum}a_failed.mov"; + unlink $testfile; + my $exifTool = new Image::ExifTool; + $exifTool->Options(QuickTimeHandler => 1); + $exifTool->SetNewValue('all' => undef); + writeInfo($exifTool, 't/images/QuickTime.mov', $testfile); + my @writeInfo = ( + ['quicktime:artist' => 'me'], + ['keys:director' => 'dir'], + ['userdata:arranger' => 'arr'], + ); + my @extract = ('QuickTime:all', 'XMP:all', '-Track1:all', '-Track2:all'); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, $testfile, \@extract); + print "ok $testnum\n"; +} + +# tests 11-13: HEIC write tests +{ + ++$testnum; + my $testfile = "t/${testname}_${testnum}_failed.heic"; + unlink $testfile; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Composite => 0); + $exifTool->SetNewValue('XMP-dc:Title' => 'a title'); + writeInfo($exifTool, 't/images/QuickTime.heic', $testfile); + my $info = $exifTool->ImageInfo($testfile, '-file:all'); + unless (check($exifTool, $info, $testname, $testnum)) { + print 'not '; + } + print "ok $testnum\n"; + + ++$testnum; + my $testfile2 = "t/${testname}_${testnum}_failed.heic"; + unlink $testfile2; + $exifTool->SetNewValue(); + $exifTool->SetNewValue('XMP:all' => undef); + $exifTool->SetNewValue('EXIF:Artist' => 'an artist'); + writeInfo($exifTool, $testfile, $testfile2); + $info = $exifTool->ImageInfo($testfile2, '-file:all'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + + ++$testnum; + $testfile = "t/${testname}_${testnum}_failed.heic"; + unlink $testfile; + $exifTool->SetNewValue(); + $exifTool->SetNewValue('EXIF:all' => undef); + $exifTool->SetNewValue('EXIF:UserComment' => 'a comment'); + $exifTool->SetNewValue('XMP:Subject' => 'a subject'); + $exifTool->SetNewValue('XMP:Subject' => 'another subject'); + writeInfo($exifTool, $testfile2, $testfile); + $info = $exifTool->ImageInfo($testfile, '-file:all'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + unlink $testfile2; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 14: Delete everything then add back a tag without specifying the group +{ + ++$testnum; + my $testfile = "t/${testname}_10a_failed.mov"; # use source file from test 10 + my @writeInfo = ( ['publisher' => 'pub'] ); + my @extract = ('QuickTime:all', 'XMP:all', '-Track1:all', '-Track2:all'); + if (writeCheck(\@writeInfo, $testname, $testnum, $testfile, \@extract)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 15: Test WriteMode option with QuickTime tags +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(WriteMode => 'c'); + $exifTool->SetNewValue('ItemList:Composer' => 'WRONG'); + $exifTool->SetNewValue('ItemList:Author' => 'aut'); + $exifTool->SetNewValue('Keys:Artist' => 'WRONG'); + $exifTool->SetNewValue('UserData:Artist' => 'art'); + my $testfile = "t/${testname}_${testnum}_failed.m4a"; + unlink $testfile; + my $rtnVal = $exifTool->WriteInfo('t/images/QuickTime.m4a', $testfile); + my $info = $exifTool->ImageInfo($testfile, 'ItemList:all', 'Keys:all', 'UserData:all'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 16: Write some Microsoft Xtra tags +{ + ++$testnum; + my @writeInfo = ( + ['Microsoft:Director' => 'dir1'], + ['Microsoft:Director' => 'dir2'], + ['Microsoft:SharedUserRating' => 75], + ); + my @extract = ('Microsoft:all'); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/QuickTime.mov', \@extract); + print "ok $testnum\n"; +} + +# test 17: Write some 3gp tags +{ + ++$testnum; + my @writeInfo = ( + ['UserData:LocationInformation' => 'test comment role=Shooting lat=1.2 lon=-2.3 alt=100 body=earth notes=a note'], + ['UserData:Rating' => 'entity=ABCD criteria=1234 a rating'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/QuickTime.mov', 1); + print "ok $testnum\n"; +} + + +# end diff --git a/t/QuickTime_10.out b/t/QuickTime_10.out new file mode 100644 index 0000000..ae5af48 --- /dev/null +++ b/t/QuickTime_10.out @@ -0,0 +1,23 @@ +[QuickTime, QuickTime, Video] 0 - Movie Header Version: 0 +[QuickTime, QuickTime, Time] 1 - Create Date: 2005:08:11 14:03:54 +[QuickTime, QuickTime, Time] 2 - Modify Date: 2010:07:30 15:43:59 +[QuickTime, QuickTime, Video] 3 - Time Scale: 600 +[QuickTime, QuickTime, Video] 4 - Duration: 4.97 s +[QuickTime, QuickTime, Video] 5 - Preferred Rate: 1 +[QuickTime, QuickTime, Video] 6 - Preferred Volume: 99.61% +[QuickTime, QuickTime, Video] 9 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, QuickTime, Video] 18 - Preview Time: 0 s +[QuickTime, QuickTime, Video] 19 - Preview Duration: 0 s +[QuickTime, QuickTime, Video] 20 - Poster Time: 0 s +[QuickTime, QuickTime, Video] 21 - Selection Time: 0 s +[QuickTime, QuickTime, Video] 22 - Selection Duration: 0 s +[QuickTime, QuickTime, Video] 23 - Current Time: 0 s +[QuickTime, QuickTime, Video] 24 - Next Track ID: 3 +[QuickTime, QuickTime, Video] 8 - Handler Type: Metadata +[QuickTime, ItemList, Audio] ©ART - Artist: me +[QuickTime, UserData, Video] ©arg - Arranger: arr +[QuickTime, QuickTime, Video] 8 - Handler Type: Metadata Tags +[QuickTime, Keys, Other] director - Director: dir +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 0 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 2034 +[QuickTime, QuickTime, Video] mdat - Media Data: (Binary data 0 bytes) diff --git a/t/QuickTime_11.out b/t/QuickTime_11.out new file mode 100644 index 0000000..2db8b6b --- /dev/null +++ b/t/QuickTime_11.out @@ -0,0 +1,46 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.90 +[QuickTime, QuickTime, Video] 0 - Major Brand: High Efficiency Image Format still image (.HEIF) +[QuickTime, QuickTime, Video] 1 - Minor Version: 0.0.0 +[QuickTime, QuickTime, Video] 2 - Compatible Brands: mif1, heic, hevc +[QuickTime, QuickTime, Video] 8 - Handler Type: Picture +[QuickTime, Meta, Video] pitm - Primary Item Reference: 20002 +[QuickTime, QuickTime, Video] 0 - HEVC Configuration Version: 1 +[QuickTime, QuickTime, Video] 1 - General Profile Space: Conforming +[QuickTime, QuickTime, Video] 1.1 - General Tier Flag: Main Tier +[QuickTime, QuickTime, Video] 1.2 - General Profile IDC: Main +[QuickTime, QuickTime, Video] 2 - Gen Profile Compatibility Flags: Main 10, Main +[QuickTime, QuickTime, Video] 6 - Constraint Indicator Flags: 144 0 0 0 0 0 +[QuickTime, QuickTime, Video] 12 - General Level IDC: 120 (level 4.0) +[QuickTime, QuickTime, Video] 13 - Min Spatial Segmentation IDC: 0 +[QuickTime, QuickTime, Video] 15 - Parallelism Type: 0 +[QuickTime, QuickTime, Video] 16 - Chroma Format: 4:2:0 +[QuickTime, QuickTime, Video] 17 - Bit Depth Luma: 8 +[QuickTime, QuickTime, Video] 18 - Bit Depth Chroma: 8 +[QuickTime, QuickTime, Video] 19 - Average Frame Rate: 0 +[QuickTime, QuickTime, Video] 21 - Constant Frame Rate: Unknown +[QuickTime, QuickTime, Video] 21.1 - Num Temporal Layers: 1 +[QuickTime, QuickTime, Video] 21.2 - Temporal ID Nested: Yes +[QuickTime, QuickTime, Image] ispe - Image Spatial Extent: 1596x1064 +[QuickTime, QuickTime, Video] 0 - HEVC Configuration Version: 1 +[QuickTime, QuickTime, Video] 1 - General Profile Space: Conforming +[QuickTime, QuickTime, Video] 1.1 - General Tier Flag: Main Tier +[QuickTime, QuickTime, Video] 1.2 - General Profile IDC: Main +[QuickTime, QuickTime, Video] 2 - Gen Profile Compatibility Flags: Main 10, Main +[QuickTime, QuickTime, Video] 6 - Constraint Indicator Flags: 144 0 0 0 0 0 +[QuickTime, QuickTime, Video] 12 - General Level IDC: 60 (level 2.0) +[QuickTime, QuickTime, Video] 13 - Min Spatial Segmentation IDC: 0 +[QuickTime, QuickTime, Video] 15 - Parallelism Type: 0 +[QuickTime, QuickTime, Video] 16 - Chroma Format: 4:2:0 +[QuickTime, QuickTime, Video] 17 - Bit Depth Luma: 8 +[QuickTime, QuickTime, Video] 18 - Bit Depth Chroma: 8 +[QuickTime, QuickTime, Video] 19 - Average Frame Rate: 0 +[QuickTime, QuickTime, Video] 21 - Constant Frame Rate: Unknown +[QuickTime, QuickTime, Video] 21.1 - Num Temporal Layers: 1 +[QuickTime, QuickTime, Video] 21.2 - Temporal ID Nested: Yes +[QuickTime, QuickTime, Image] ispe - Image Spatial Extent: 320x240 +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 2877 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 652 +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 18 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 3537 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 11.90 +[XMP, XMP-dc, Image] title - Title: a title diff --git a/t/QuickTime_12.out b/t/QuickTime_12.out new file mode 100644 index 0000000..c63db69 --- /dev/null +++ b/t/QuickTime_12.out @@ -0,0 +1,49 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.90 +[QuickTime, QuickTime, Video] 0 - Major Brand: High Efficiency Image Format still image (.HEIF) +[QuickTime, QuickTime, Video] 1 - Minor Version: 0.0.0 +[QuickTime, QuickTime, Video] 2 - Compatible Brands: mif1, heic, hevc +[QuickTime, QuickTime, Video] 8 - Handler Type: Picture +[QuickTime, Meta, Video] pitm - Primary Item Reference: 20002 +[QuickTime, QuickTime, Video] 0 - HEVC Configuration Version: 1 +[QuickTime, QuickTime, Video] 1 - General Profile Space: Conforming +[QuickTime, QuickTime, Video] 1.1 - General Tier Flag: Main Tier +[QuickTime, QuickTime, Video] 1.2 - General Profile IDC: Main +[QuickTime, QuickTime, Video] 2 - Gen Profile Compatibility Flags: Main 10, Main +[QuickTime, QuickTime, Video] 6 - Constraint Indicator Flags: 144 0 0 0 0 0 +[QuickTime, QuickTime, Video] 12 - General Level IDC: 120 (level 4.0) +[QuickTime, QuickTime, Video] 13 - Min Spatial Segmentation IDC: 0 +[QuickTime, QuickTime, Video] 15 - Parallelism Type: 0 +[QuickTime, QuickTime, Video] 16 - Chroma Format: 4:2:0 +[QuickTime, QuickTime, Video] 17 - Bit Depth Luma: 8 +[QuickTime, QuickTime, Video] 18 - Bit Depth Chroma: 8 +[QuickTime, QuickTime, Video] 19 - Average Frame Rate: 0 +[QuickTime, QuickTime, Video] 21 - Constant Frame Rate: Unknown +[QuickTime, QuickTime, Video] 21.1 - Num Temporal Layers: 1 +[QuickTime, QuickTime, Video] 21.2 - Temporal ID Nested: Yes +[QuickTime, QuickTime, Image] ispe - Image Spatial Extent: 1596x1064 +[QuickTime, QuickTime, Video] 0 - HEVC Configuration Version: 1 +[QuickTime, QuickTime, Video] 1 - General Profile Space: Conforming +[QuickTime, QuickTime, Video] 1.1 - General Tier Flag: Main Tier +[QuickTime, QuickTime, Video] 1.2 - General Profile IDC: Main +[QuickTime, QuickTime, Video] 2 - Gen Profile Compatibility Flags: Main 10, Main +[QuickTime, QuickTime, Video] 6 - Constraint Indicator Flags: 144 0 0 0 0 0 +[QuickTime, QuickTime, Video] 12 - General Level IDC: 60 (level 2.0) +[QuickTime, QuickTime, Video] 13 - Min Spatial Segmentation IDC: 0 +[QuickTime, QuickTime, Video] 15 - Parallelism Type: 0 +[QuickTime, QuickTime, Video] 16 - Chroma Format: 4:2:0 +[QuickTime, QuickTime, Video] 17 - Bit Depth Luma: 8 +[QuickTime, QuickTime, Video] 18 - Bit Depth Chroma: 8 +[QuickTime, QuickTime, Video] 19 - Average Frame Rate: 0 +[QuickTime, QuickTime, Video] 21 - Constant Frame Rate: Unknown +[QuickTime, QuickTime, Video] 21.1 - Num Temporal Layers: 1 +[QuickTime, QuickTime, Video] 21.2 - Temporal ID Nested: Yes +[QuickTime, QuickTime, Image] ispe - Image Spatial Extent: 320x240 +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 128 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 705 +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 18 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 841 +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Author] 315 - Artist: an artist +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered diff --git a/t/QuickTime_13.out b/t/QuickTime_13.out new file mode 100644 index 0000000..fd9fdaf --- /dev/null +++ b/t/QuickTime_13.out @@ -0,0 +1,55 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.90 +[QuickTime, QuickTime, Video] 0 - Major Brand: High Efficiency Image Format still image (.HEIF) +[QuickTime, QuickTime, Video] 1 - Minor Version: 0.0.0 +[QuickTime, QuickTime, Video] 2 - Compatible Brands: mif1, heic, hevc +[QuickTime, QuickTime, Video] 8 - Handler Type: Picture +[QuickTime, Meta, Video] pitm - Primary Item Reference: 20002 +[QuickTime, QuickTime, Video] 0 - HEVC Configuration Version: 1 +[QuickTime, QuickTime, Video] 1 - General Profile Space: Conforming +[QuickTime, QuickTime, Video] 1.1 - General Tier Flag: Main Tier +[QuickTime, QuickTime, Video] 1.2 - General Profile IDC: Main +[QuickTime, QuickTime, Video] 2 - Gen Profile Compatibility Flags: Main 10, Main +[QuickTime, QuickTime, Video] 6 - Constraint Indicator Flags: 144 0 0 0 0 0 +[QuickTime, QuickTime, Video] 12 - General Level IDC: 120 (level 4.0) +[QuickTime, QuickTime, Video] 13 - Min Spatial Segmentation IDC: 0 +[QuickTime, QuickTime, Video] 15 - Parallelism Type: 0 +[QuickTime, QuickTime, Video] 16 - Chroma Format: 4:2:0 +[QuickTime, QuickTime, Video] 17 - Bit Depth Luma: 8 +[QuickTime, QuickTime, Video] 18 - Bit Depth Chroma: 8 +[QuickTime, QuickTime, Video] 19 - Average Frame Rate: 0 +[QuickTime, QuickTime, Video] 21 - Constant Frame Rate: Unknown +[QuickTime, QuickTime, Video] 21.1 - Num Temporal Layers: 1 +[QuickTime, QuickTime, Video] 21.2 - Temporal ID Nested: Yes +[QuickTime, QuickTime, Image] ispe - Image Spatial Extent: 1596x1064 +[QuickTime, QuickTime, Video] 0 - HEVC Configuration Version: 1 +[QuickTime, QuickTime, Video] 1 - General Profile Space: Conforming +[QuickTime, QuickTime, Video] 1.1 - General Tier Flag: Main Tier +[QuickTime, QuickTime, Video] 1.2 - General Profile IDC: Main +[QuickTime, QuickTime, Video] 2 - Gen Profile Compatibility Flags: Main 10, Main +[QuickTime, QuickTime, Video] 6 - Constraint Indicator Flags: 144 0 0 0 0 0 +[QuickTime, QuickTime, Video] 12 - General Level IDC: 60 (level 2.0) +[QuickTime, QuickTime, Video] 13 - Min Spatial Segmentation IDC: 0 +[QuickTime, QuickTime, Video] 15 - Parallelism Type: 0 +[QuickTime, QuickTime, Video] 16 - Chroma Format: 4:2:0 +[QuickTime, QuickTime, Video] 17 - Bit Depth Luma: 8 +[QuickTime, QuickTime, Video] 18 - Bit Depth Chroma: 8 +[QuickTime, QuickTime, Video] 19 - Average Frame Rate: 0 +[QuickTime, QuickTime, Video] 21 - Constant Frame Rate: Unknown +[QuickTime, QuickTime, Video] 21.1 - Num Temporal Layers: 1 +[QuickTime, QuickTime, Video] 21.2 - Temporal ID Nested: Yes +[QuickTime, QuickTime, Image] ispe - Image Spatial Extent: 320x240 +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 3083 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 705 +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 18 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 3796 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 11.90 +[XMP, XMP-dc, Image] subject - Subject: a subject, another subject +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0232 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37510 - User Comment: a comment +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: Uncalibrated diff --git a/t/QuickTime_14.out b/t/QuickTime_14.out new file mode 100644 index 0000000..ee5de54 --- /dev/null +++ b/t/QuickTime_14.out @@ -0,0 +1,22 @@ +[QuickTime, QuickTime, Video] 0 - Movie Header Version: 0 +[QuickTime, QuickTime, Time] 1 - Create Date: 2005:08:11 14:03:54 +[QuickTime, QuickTime, Time] 2 - Modify Date: 2010:07:30 15:43:59 +[QuickTime, QuickTime, Video] 3 - Time Scale: 600 +[QuickTime, QuickTime, Video] 4 - Duration: 4.97 s +[QuickTime, QuickTime, Video] 5 - Preferred Rate: 1 +[QuickTime, QuickTime, Video] 6 - Preferred Volume: 99.61% +[QuickTime, QuickTime, Video] 9 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, QuickTime, Video] 18 - Preview Time: 0 s +[QuickTime, QuickTime, Video] 19 - Preview Duration: 0 s +[QuickTime, QuickTime, Video] 20 - Poster Time: 0 s +[QuickTime, QuickTime, Video] 21 - Selection Time: 0 s +[QuickTime, QuickTime, Video] 22 - Selection Duration: 0 s +[QuickTime, QuickTime, Video] 23 - Current Time: 0 s +[QuickTime, QuickTime, Video] 24 - Next Track ID: 3 +[QuickTime, QuickTime, Video] 8 - Handler Type: Metadata +[QuickTime, ItemList, Audio] ©pub - Publisher: pub +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 0 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 4743 +[QuickTime, QuickTime, Video] mdat - Media Data: (Binary data 0 bytes) +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.19 +[XMP, XMP-dc, Author] publisher - Publisher: pub diff --git a/t/QuickTime_15.out b/t/QuickTime_15.out new file mode 100644 index 0000000..a940f7c --- /dev/null +++ b/t/QuickTime_15.out @@ -0,0 +1,20 @@ +[QuickTime, ItemList, Audio] ©nam - Title: Sample +[QuickTime, ItemList, Audio] cpil - Compilation: No +[QuickTime, ItemList, Audio] tmpo - Beats Per Minute: 120 +[QuickTime, ItemList, Audio] ©too - Encoder: iTunes v4.9, QuickTime 7.0.1 +[QuickTime, ItemList, Audio] ©lyr - Lyrics: these are lyrics +[QuickTime, ItemList, Audio] ©ART - Artist: Phil Harvey +[QuickTime, ItemList, Author] aART - Album Artist: album artist +[QuickTime, ItemList, Audio] ©wrt - Composer: Composer +[QuickTime, ItemList, Audio] ©alb - Album: album +[QuickTime, ItemList, Audio] ©grp - Grouping: grouping +[QuickTime, ItemList, Audio] ©gen - Genre: Children’s Music +[QuickTime, ItemList, Audio] trkn - Track Number: 1 of 2 +[QuickTime, ItemList, Audio] disk - Disk Number: 1 of 3 +[QuickTime, ItemList, Time] ©day - Content Create Date: 2006 +[QuickTime, ItemList, Audio] ©cmt - Comment: comments +[QuickTime, ItemList, Audio] pgap - Play Gap: No Gap +[QuickTime, ItemList, Preview] covr - Cover Art: (Binary data 19 bytes) +[QuickTime, ItemList, Preview] covr - Cover Art: (Binary data 19 bytes) +[QuickTime, ItemList, Author] auth - Author: aut +[QuickTime, UserData, Video] ©ART - Artist: art diff --git a/t/QuickTime_16.out b/t/QuickTime_16.out new file mode 100644 index 0000000..4db7d6a --- /dev/null +++ b/t/QuickTime_16.out @@ -0,0 +1,2 @@ +[QuickTime, Microsoft, Video] WM/Director - Director: dir1, dir2 +[QuickTime, Microsoft, Video] WM/SharedUserRating - Shared User Rating: 75 diff --git a/t/QuickTime_17.out b/t/QuickTime_17.out new file mode 100644 index 0000000..064587c --- /dev/null +++ b/t/QuickTime_17.out @@ -0,0 +1,2 @@ +[QuickTime, UserData, Location] loci - Location Information: test comment Role=shooting Lat=1.20000 Lon=-2.30000 Alt=100.00 Body=earth Notes=a note +[QuickTime, UserData, Video] rtng - Rating: Entity=ABCD Criteria=1234 a rating diff --git a/t/QuickTime_2.out b/t/QuickTime_2.out new file mode 100644 index 0000000..81db4bc --- /dev/null +++ b/t/QuickTime_2.out @@ -0,0 +1,133 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: QuickTime.mov +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 3.9 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:03:22 19:58:22-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:50-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: MOV +[File, File, Other] FileTypeExtension - File Type Extension: mov +[File, File, Other] MIMEType - MIME Type: video/quicktime +[QuickTime, QuickTime, Video] 0 - Movie Header Version: 0 +[QuickTime, QuickTime, Time] 1 - Create Date: 2005:08:11 14:03:54 +[QuickTime, QuickTime, Time] 2 - Modify Date: 2010:07:30 15:43:59 +[QuickTime, QuickTime, Video] 3 - Time Scale: 600 +[QuickTime, QuickTime, Video] 4 - Duration: 4.97 s +[QuickTime, QuickTime, Video] 5 - Preferred Rate: 1 +[QuickTime, QuickTime, Video] 6 - Preferred Volume: 99.61% +[QuickTime, QuickTime, Video] 9 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, QuickTime, Video] 18 - Preview Time: 0 s +[QuickTime, QuickTime, Video] 19 - Preview Duration: 0 s +[QuickTime, QuickTime, Video] 20 - Poster Time: 0 s +[QuickTime, QuickTime, Video] 21 - Selection Time: 0 s +[QuickTime, QuickTime, Video] 22 - Selection Duration: 0 s +[QuickTime, QuickTime, Video] 23 - Current Time: 0 s +[QuickTime, QuickTime, Video] 24 - Next Track ID: 3 +[QuickTime, Track1, Video] 0 - Track Header Version: 0 +[QuickTime, Track1, Time] 1 - Track Create Date: 2005:08:11 14:03:54 +[QuickTime, Track1, Time] 2 - Track Modify Date: 2005:08:11 14:03:54 +[QuickTime, Track1, Video] 3 - Track ID: 1 +[QuickTime, Track1, Video] 5 - Track Duration: 4.97 s +[QuickTime, Track1, Video] 8 - Track Layer: 0 +[QuickTime, Track1, Video] 9 - Track Volume: 0.00% +[QuickTime, Track1, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track1, Video] 19 - Image Width: 320 +[QuickTime, Track1, Video] 20 - Image Height: 240 +[QuickTime, Track1, Video] clef - Clean Aperture Dimensions: 320x240 +[QuickTime, Track1, Video] prof - Production Aperture Dimensions: 320x240 +[QuickTime, Track1, Video] enof - Encoded Pixels Dimensions: 320x240 +[QuickTime, Track1, Video] 0 - Media Header Version: 0 +[QuickTime, Track1, Time] 1 - Media Create Date: 2005:08:11 14:03:54 +[QuickTime, Track1, Time] 2 - Media Modify Date: 2005:08:11 14:03:54 +[QuickTime, Track1, Video] 3 - Media Time Scale: 600 +[QuickTime, Track1, Video] 4 - Media Duration: 4.97 s +[QuickTime, Track1, Video] 4 - Handler Class: Media Handler +[QuickTime, Track1, Video] 8 - Handler Type: Video Track +[QuickTime, Track1, Video] 12 - Handler Vendor ID: Pentax +[QuickTime, Track1, Video] 2 - Graphics Mode: ditherCopy +[QuickTime, Track1, Video] 3 - Op Color: 32768 32768 32768 +[QuickTime, Track1, Video] 4 - Handler Class: Data Handler +[QuickTime, Track1, Video] 8 - Handler Type: Alias Data +[QuickTime, Track1, Video] 12 - Handler Vendor ID: Pentax +[QuickTime, Track1, Image] 2 - Compressor ID: jpeg +[QuickTime, Track1, Image] 10 - Vendor ID: Pentax +[QuickTime, Track1, Image] 16 - Source Image Width: 320 +[QuickTime, Track1, Image] 17 - Source Image Height: 240 +[QuickTime, Track1, Image] 18 - X Resolution: 72 +[QuickTime, Track1, Image] 20 - Y Resolution: 72 +[QuickTime, Track1, Image] 25 - Compressor Name: Photo - JPEG +[QuickTime, Track1, Image] 41 - Bit Depth: 24 +[QuickTime, Track1, Video] stts - Video Frame Rate: 30 +[QuickTime, Track2, Video] 0 - Track Header Version: 0 +[QuickTime, Track2, Time] 1 - Track Create Date: 2005:08:11 14:03:54 +[QuickTime, Track2, Time] 2 - Track Modify Date: 2005:08:11 14:03:54 +[QuickTime, Track2, Video] 3 - Track ID: 2 +[QuickTime, Track2, Video] 5 - Track Duration: 4.96 s +[QuickTime, Track2, Video] 8 - Track Layer: 0 +[QuickTime, Track2, Video] 9 - Track Volume: 100.00% +[QuickTime, Track2, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track2, Video] 0 - Media Header Version: 0 +[QuickTime, Track2, Time] 1 - Media Create Date: 2005:08:11 14:03:54 +[QuickTime, Track2, Time] 2 - Media Modify Date: 2005:08:11 14:03:54 +[QuickTime, Track2, Video] 3 - Media Time Scale: 7875 +[QuickTime, Track2, Video] 4 - Media Duration: 4.97 s +[QuickTime, Track2, Video] 4 - Handler Class: Media Handler +[QuickTime, Track2, Video] 8 - Handler Type: Audio Track +[QuickTime, Track2, Video] 12 - Handler Vendor ID: Pentax +[QuickTime, Track2, Audio] 2 - Balance: 0 +[QuickTime, Track2, Video] 4 - Handler Class: Data Handler +[QuickTime, Track2, Video] 8 - Handler Type: Alias Data +[QuickTime, Track2, Video] 12 - Handler Vendor ID: Pentax +[QuickTime, Track2, Audio] 4 - Audio Format: raw +[QuickTime, Track2, Audio] 24 - Audio Channels: 1 +[QuickTime, Track2, Audio] 26 - Audio Bits Per Sample: 8 +[QuickTime, Track2, Audio] 32 - Audio Sample Rate: 7875 +[QuickTime, QuickTime, Video] 8 - Handler Type: Metadata Tags +[QuickTime, Keys, Other] album - Album: Ã¥lbum +[QuickTime, Keys, Other] artist - Artist: Ã¥rtist +[QuickTime, Keys, Other] comment - Comment: çømménts +[QuickTime, UserData, Video] ©fmt - Format: Digital Camera +[QuickTime, UserData, Video] ©inf - Information: PENTAX DIGITAL CAMERA +[QuickTime, UserData, Video] ©alb - Album: Ã¥lbum +[QuickTime, UserData, Video] ©ART - Artist: Ã¥rtist +[QuickTime, UserData, Video] ©cmt - Comment: çømménts +[QuickTime, UserData, Video] ©com - Composer: cømpøsér +[QuickTime, UserData, Video] ©gen - Genre: Genré +[QuickTime, QuickTime, Video] 8 - Handler Type: Metadata +[QuickTime, QuickTime, Video] 12 - Handler Vendor ID: Apple +[QuickTime, ItemList, Audio] ©lyr - Lyrics: These are lyrics +[QuickTime, ItemList, Preview] covr - Cover Art: (Binary data 251 bytes) +[QuickTime, ItemList, Audio] ©ART - Artist: Ã¥rtist +[QuickTime, ItemList, Author] aART - Album Artist: Ã¥lbüm Ã¥rtîst +[QuickTime, ItemList, Audio] ©wrt - Composer: cømpøsér +[QuickTime, ItemList, Audio] ©alb - Album: Ã¥lbum +[QuickTime, ItemList, Audio] ©grp - Grouping: grøuping +[QuickTime, ItemList, Audio] ©gen - Genre: Genré +[QuickTime, ItemList, Audio] trkn - Track Number: 1 of 2 +[QuickTime, ItemList, Audio] disk - Disk Number: 3 of 4 +[QuickTime, ItemList, Time] ©day - Content Create Date: 2010 +[QuickTime, ItemList, Audio] ©cmt - Comment: çømménts +[QuickTime, ItemList, Audio] tmpo - Beats Per Minute: 128 +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 0 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 3871 +[MakerNotes, Pentax, Camera] 0 - Make: PENTAX DIGITAL CAMERA +[MakerNotes, Pentax, Camera] 38 - Exposure Time: 1/38 +[MakerNotes, Pentax, Camera] 42 - F Number: 4.0 +[MakerNotes, Pentax, Camera] 50 - Exposure Compensation: 0 +[MakerNotes, Pentax, Camera] 68 - White Balance: Auto +[MakerNotes, Pentax, Camera] 72 - Focal Length: 18.9 mm +[MakerNotes, Pentax, Camera] 175 - ISO: 50 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Adobe XMP Core 4.1-c036 46.277092, Fri Feb 23 2007 14:16:18 +[XMP, XMP-xmpDM, Image] altTapeName - Alt Tape Name: An Alternate Scene Name +[XMP, XMP-xmpDM, Image] album - Album: No Album +[XMP, XMP-xmp, Time] MetadataDate - Metadata Date: 2008:09:12 11:17:39-04:00 +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[Composite, Composite, Image] Exif-Aperture - Aperture: 4.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 320x240 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.077 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/38 +[Composite, Composite, Video] QuickTime-AvgBitrate - Avg Bitrate: 0 bps +[Composite, Composite, Video] QuickTime-Rotation - Rotation: 0 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 18.9 mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 10.3 diff --git a/t/QuickTime_3.out b/t/QuickTime_3.out new file mode 100644 index 0000000..db0a2e1 --- /dev/null +++ b/t/QuickTime_3.out @@ -0,0 +1,73 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: QuickTime.m4a +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 5.2 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:03:22 19:58:22-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:50-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: M4A +[File, File, Other] FileTypeExtension - File Type Extension: m4a +[File, File, Other] MIMEType - MIME Type: audio/mp4 +[QuickTime, QuickTime, Video] 0 - Major Brand: Apple iTunes AAC-LC (.M4A) Audio +[QuickTime, QuickTime, Video] 1 - Minor Version: 0.0.0 +[QuickTime, QuickTime, Video] 2 - Compatible Brands: M4A , mp42, isom +[QuickTime, QuickTime, Video] 0 - Movie Header Version: 0 +[QuickTime, QuickTime, Time] 1 - Create Date: 2005:06:29 19:02:19 +[QuickTime, QuickTime, Time] 2 - Modify Date: 2006:09:22 11:06:45 +[QuickTime, QuickTime, Video] 3 - Time Scale: 600 +[QuickTime, QuickTime, Video] 4 - Duration: 29.05 s +[QuickTime, QuickTime, Video] 5 - Preferred Rate: 1 +[QuickTime, QuickTime, Video] 6 - Preferred Volume: 100.00% +[QuickTime, QuickTime, Video] 9 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, QuickTime, Video] 18 - Preview Time: 0 s +[QuickTime, QuickTime, Video] 19 - Preview Duration: 0 s +[QuickTime, QuickTime, Video] 20 - Poster Time: 0 s +[QuickTime, QuickTime, Video] 21 - Selection Time: 0 s +[QuickTime, QuickTime, Video] 22 - Selection Duration: 0 s +[QuickTime, QuickTime, Video] 23 - Current Time: 0 s +[QuickTime, QuickTime, Video] 24 - Next Track ID: 2 +[QuickTime, Track1, Video] 0 - Track Header Version: 0 +[QuickTime, Track1, Time] 1 - Track Create Date: 2005:06:29 19:02:19 +[QuickTime, Track1, Time] 2 - Track Modify Date: 2006:09:22 11:06:45 +[QuickTime, Track1, Video] 3 - Track ID: 1 +[QuickTime, Track1, Video] 5 - Track Duration: 29.05 s +[QuickTime, Track1, Video] 8 - Track Layer: 0 +[QuickTime, Track1, Video] 9 - Track Volume: 100.00% +[QuickTime, Track1, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track1, Video] 0 - Media Header Version: 0 +[QuickTime, Track1, Time] 1 - Media Create Date: 2005:06:29 19:02:19 +[QuickTime, Track1, Time] 2 - Media Modify Date: 2006:09:22 11:06:45 +[QuickTime, Track1, Video] 3 - Media Time Scale: 32000 +[QuickTime, Track1, Video] 4 - Media Duration: 29.06 s +[QuickTime, Track1, Video] 5 - Media Language Code: und +[QuickTime, Track1, Video] 8 - Handler Type: Audio Track +[QuickTime, Track1, Audio] 2 - Balance: 0 +[QuickTime, Track1, Audio] 4 - Audio Format: mp4a +[QuickTime, Track1, Audio] 24 - Audio Channels: 2 +[QuickTime, Track1, Audio] 26 - Audio Bits Per Sample: 16 +[QuickTime, Track1, Audio] 32 - Audio Sample Rate: 44100 +[QuickTime, QuickTime, Video] 8 - Handler Type: Metadata +[QuickTime, QuickTime, Video] 12 - Handler Vendor ID: Apple +[QuickTime, ItemList, Audio] ©nam - Title: Sample +[QuickTime, ItemList, Audio] cpil - Compilation: No +[QuickTime, ItemList, Audio] tmpo - Beats Per Minute: 120 +[QuickTime, ItemList, Audio] ©too - Encoder: iTunes v4.9, QuickTime 7.0.1 +[QuickTime, iTunes, Audio] iTunNORM - Volume Normalization: 80 0 610 0 289C 0 0 0 0 0 +[QuickTime, ItemList, Audio] ©lyr - Lyrics: these are lyrics +[QuickTime, ItemList, Audio] ©ART - Artist: Phil Harvey +[QuickTime, ItemList, Author] aART - Album Artist: album artist +[QuickTime, ItemList, Audio] ©wrt - Composer: Composer +[QuickTime, ItemList, Audio] ©alb - Album: album +[QuickTime, ItemList, Audio] ©grp - Grouping: grouping +[QuickTime, ItemList, Audio] ©gen - Genre: Children’s Music +[QuickTime, ItemList, Audio] trkn - Track Number: 1 of 2 +[QuickTime, ItemList, Audio] disk - Disk Number: 1 of 3 +[QuickTime, ItemList, Time] ©day - Content Create Date: 2006 +[QuickTime, ItemList, Audio] ©cmt - Comment: comments +[QuickTime, ItemList, Audio] pgap - Play Gap: No Gap +[QuickTime, ItemList, Preview] covr - Cover Art: (Binary data 19 bytes) +[QuickTime, ItemList, Preview] covr - Cover Art: (Binary data 19 bytes) +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 0 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 5237 +[Composite, Composite, Video] QuickTime-AvgBitrate - Avg Bitrate: 0 bps diff --git a/t/QuickTime_4.out b/t/QuickTime_4.out new file mode 100644 index 0000000..3ff263c --- /dev/null +++ b/t/QuickTime_4.out @@ -0,0 +1,16 @@ +[File, System, Time, Main, , System] FileModifyDate - File Modification Date/Time: 2019:05:03 08:54:44-04:00 +[File, System, Time, Main, , System] FileAccessDate - File Access Date/Time: 2019:05:03 08:54:44-04:00 +[File, System, Time, Main, , System] FileInodeChangeDate - File Inode Change Date/Time: 2019:05:03 08:54:44-04:00 +[QuickTime, QuickTime, Time, Main, , MOV-Movie-MovieHeader] 1 - Create Date: 2005:08:11 14:03:54 +[QuickTime, QuickTime, Time, Main, , MOV-Movie-MovieHeader] 2 - Modify Date: 2010:07:30 15:43:59 +[QuickTime, Track1, Time, Main, , MOV-Movie-Track-TrackHeader] 1 - Track Create Date: 2000:01:02 03:04:05 +[QuickTime, Track1, Time, Main, , MOV-Movie-Track-TrackHeader] 2 - Track Modify Date: 2013:11:04 10:32:15 +[QuickTime, Track1, Time, Main, Copy1, MOV-Movie-Track-Media-MediaHeader] 1 - Media Create Date: 2005:08:11 14:03:54 +[QuickTime, Track1, Time, Main, Copy1, MOV-Movie-Track-Media-MediaHeader] 2 - Media Modify Date: 2005:08:11 14:03:54 +[QuickTime, Track2, Time, Main, Copy1, MOV-Movie-Track-TrackHeader] 1 - Track Create Date: 2000:01:02 03:04:05 +[QuickTime, Track2, Time, Main, Copy1, MOV-Movie-Track-TrackHeader] 2 - Track Modify Date: 2005:08:11 14:03:54 +[QuickTime, Track2, Time, Main, , MOV-Movie-Track-Media-MediaHeader] 1 - Media Create Date: 2005:08:11 14:03:54 +[QuickTime, Track2, Time, Main, , MOV-Movie-Track-Media-MediaHeader] 2 - Media Modify Date: 2005:08:11 14:03:54 +[QuickTime, ItemList, Time, Main, , MOV-Movie-UserData-Meta-ItemList] ©day - Content Create Date: 2010 +[XMP, XMP-dc, Image, Main, , MOV-Movie-UserData-XMP] title - Title: x +[XMP, XMP-xmp, Time, Main, , MOV-Movie-UserData-XMP] MetadataDate - Metadata Date: 2008:09:12 11:17:39-04:00 diff --git a/t/QuickTime_5.out b/t/QuickTime_5.out new file mode 100644 index 0000000..7e5c967 --- /dev/null +++ b/t/QuickTime_5.out @@ -0,0 +1,12 @@ +[File, System, Time, Main, , System] FileModifyDate - File Modification Date/Time: 2019:05:03 08:54:44-04:00 +[File, System, Time, Main, , System] FileAccessDate - File Access Date/Time: 2019:05:03 08:54:44-04:00 +[File, System, Time, Main, , System] FileInodeChangeDate - File Inode Change Date/Time: 2019:05:03 08:54:44-04:00 +[QuickTime, QuickTime, Time, Main, , MOV-Movie-MovieHeader] 1 - Create Date: 2005:06:29 19:02:19 +[QuickTime, QuickTime, Time, Main, , MOV-Movie-MovieHeader] 2 - Modify Date: 2006:09:22 11:06:45 +[QuickTime, Track1, Time, Main, , MOV-Movie-Track-TrackHeader] 1 - Track Create Date: 2000:01:02 03:04:05 +[QuickTime, Track1, Time, Main, , MOV-Movie-Track-TrackHeader] 2 - Track Modify Date: 2013:11:04 10:32:15 +[QuickTime, Track1, Time, Main, , MOV-Movie-Track-Media-MediaHeader] 1 - Media Create Date: 2005:06:29 19:02:19 +[QuickTime, Track1, Time, Main, , MOV-Movie-Track-Media-MediaHeader] 2 - Media Modify Date: 2006:09:22 11:06:45 +[QuickTime, ItemList, Audio, Main, Copy1, MOV-Movie-UserData-Meta-ItemList] ©nam - Title: Sample +[QuickTime, ItemList, Time, Main, , MOV-Movie-UserData-Meta-ItemList] ©day - Content Create Date: 2006 +[XMP, XMP-dc, Image, Main, , MOV-XMP] title - Title: x diff --git a/t/QuickTime_6.out b/t/QuickTime_6.out new file mode 100644 index 0000000..fabc93c --- /dev/null +++ b/t/QuickTime_6.out @@ -0,0 +1,4 @@ +[QuickTime, QuickTime, Video] 9 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track1, Video] 10 - Matrix Structure: 0 -1 0 1 0 0 0 320 1 +[QuickTime, Track2, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[Composite, Composite, Video] QuickTime-Rotation - Rotation: 270 diff --git a/t/QuickTime_7.out b/t/QuickTime_7.out new file mode 100644 index 0000000..1880bdb --- /dev/null +++ b/t/QuickTime_7.out @@ -0,0 +1,27 @@ +[QuickTime, Keys, Other] artist - Artist: me +[QuickTime, Keys, Other] comment - Comment: çømménts +[QuickTime, Keys, Location] direction.facing - Camera Direction: 90 +[QuickTime, Keys, Other] director - Director: director +[QuickTime, UserData, Video] ©fmt - Format: Digital Camera +[QuickTime, UserData, Video] ©inf - Information: PENTAX DIGITAL CAMERA +[QuickTime, UserData, Video] ©alb - Album: albumA +[QuickTime, UserData, Video] ©ART - Artist: me +[QuickTime, UserData, Video] ©cmt - Comment: çømménts +[QuickTime, UserData, Video] ©com - Composer: cømpøsér +[QuickTime, UserData, Video] ©gen - Genre: rock +[QuickTime, ItemList, Audio] ©lyr - Lyrics: These are lyrics +[QuickTime, ItemList, Preview] covr - Cover Art: (Binary data 251 bytes) +[QuickTime, ItemList, Audio] ©ART - Artist: me +[QuickTime, ItemList, Author] aART - Album Artist: Ã¥lbüm Ã¥rtîst +[QuickTime, ItemList, Audio] ©wrt - Composer: cømpøsér +[QuickTime, ItemList, Audio] ©alb - Album: albumB +[QuickTime, ItemList, Audio] ©grp - Grouping: grøuping +[QuickTime, ItemList, Audio] ©gen - Genre: Genré +[QuickTime, ItemList, Audio] trkn - Track Number: 1 of 2 +[QuickTime, ItemList, Audio] disk - Disk Number: 3 of 4 +[QuickTime, ItemList, Time] ©day - Content Create Date: 2010 +[QuickTime, ItemList, Audio] ©cmt - Comment: çømménts +[QuickTime, ItemList, Audio] ©cmt-fra-FR - Comment (fra-FR): fr comment +[QuickTime, ItemList, Audio] tmpo - Beats Per Minute: 128 +[QuickTime, ItemList, Audio] albm - Album: albumC +[QuickTime, UserData, Video] ©mod - Model: model diff --git a/t/QuickTime_8.out b/t/QuickTime_8.out new file mode 100644 index 0000000..f75f13c --- /dev/null +++ b/t/QuickTime_8.out @@ -0,0 +1,96 @@ +[QuickTime, QuickTime, Video] 0 - Movie Header Version: 0 +[QuickTime, QuickTime, Time] 1 - Create Date: 2005:08:11 14:03:54 +[QuickTime, QuickTime, Time] 2 - Modify Date: 2010:07:30 15:43:59 +[QuickTime, QuickTime, Video] 3 - Time Scale: 600 +[QuickTime, QuickTime, Video] 4 - Duration: 4.97 s +[QuickTime, QuickTime, Video] 5 - Preferred Rate: 1 +[QuickTime, QuickTime, Video] 6 - Preferred Volume: 99.61% +[QuickTime, QuickTime, Video] 9 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, QuickTime, Video] 18 - Preview Time: 0 s +[QuickTime, QuickTime, Video] 19 - Preview Duration: 0 s +[QuickTime, QuickTime, Video] 20 - Poster Time: 0 s +[QuickTime, QuickTime, Video] 21 - Selection Time: 0 s +[QuickTime, QuickTime, Video] 22 - Selection Duration: 0 s +[QuickTime, QuickTime, Video] 23 - Current Time: 0 s +[QuickTime, QuickTime, Video] 24 - Next Track ID: 3 +[QuickTime, Track1, Video] 0 - Track Header Version: 0 +[QuickTime, Track1, Time] 1 - Track Create Date: 2005:08:11 14:03:54 +[QuickTime, Track1, Time] 2 - Track Modify Date: 2005:08:11 14:03:54 +[QuickTime, Track1, Video] 3 - Track ID: 1 +[QuickTime, Track1, Video] 5 - Track Duration: 4.97 s +[QuickTime, Track1, Video] 8 - Track Layer: 0 +[QuickTime, Track1, Video] 9 - Track Volume: 0.00% +[QuickTime, Track1, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track1, Video] 19 - Image Width: 320 +[QuickTime, Track1, Video] 20 - Image Height: 240 +[QuickTime, Track1, Video] clef - Clean Aperture Dimensions: 320x240 +[QuickTime, Track1, Video] prof - Production Aperture Dimensions: 320x240 +[QuickTime, Track1, Video] enof - Encoded Pixels Dimensions: 320x240 +[QuickTime, Track1, Video] edts - Unknown edts: (Binary data 28 bytes) +[QuickTime, Track1, Video] 0 - Media Header Version: 0 +[QuickTime, Track1, Time] 1 - Media Create Date: 2005:08:11 14:03:54 +[QuickTime, Track1, Time] 2 - Media Modify Date: 2005:08:11 14:03:54 +[QuickTime, Track1, Video] 3 - Media Time Scale: 600 +[QuickTime, Track1, Video] 4 - Media Duration: 4.97 s +[QuickTime, Track1, Video] 4 - Handler Class: Media Handler +[QuickTime, Track1, Video] 8 - Handler Type: Video Track +[QuickTime, Track1, Video] 12 - Handler Vendor ID: Pentax +[QuickTime, Track1, Video] 2 - Graphics Mode: ditherCopy +[QuickTime, Track1, Video] 3 - Op Color: 32768 32768 32768 +[QuickTime, Track1, Video] 4 - Handler Class: Data Handler +[QuickTime, Track1, Video] 8 - Handler Type: Alias Data +[QuickTime, Track1, Video] 12 - Handler Vendor ID: Pentax +[QuickTime, Track1, Other] alis - Unknown alis: (Binary data 4 bytes) +[QuickTime, Track1, Image] 2 - Compressor ID: jpeg +[QuickTime, Track1, Image] 10 - Vendor ID: Pentax +[QuickTime, Track1, Image] 16 - Source Image Width: 320 +[QuickTime, Track1, Image] 17 - Source Image Height: 240 +[QuickTime, Track1, Image] 18 - X Resolution: 72 +[QuickTime, Track1, Image] 20 - Y Resolution: 72 +[QuickTime, Track1, Image] 25 - Compressor Name: Photo - JPEG +[QuickTime, Track1, Image] 41 - Bit Depth: 24 +[QuickTime, Track1, Video] stts - Video Frame Rate: 30 +[QuickTime, Track1, Video] stsc - Sample To Chunk: (Binary data 32 bytes) +[QuickTime, Track1, Video] stsz - Sample Sizes: (Binary data 608 bytes) +[QuickTime, Track1, Video] stco - Chunk Offset: (Binary data 28 bytes) +[QuickTime, Track2, Video] 0 - Track Header Version: 0 +[QuickTime, Track2, Time] 1 - Track Create Date: 2005:08:11 14:03:54 +[QuickTime, Track2, Time] 2 - Track Modify Date: 2005:08:11 14:03:54 +[QuickTime, Track2, Video] 3 - Track ID: 2 +[QuickTime, Track2, Video] 5 - Track Duration: 4.96 s +[QuickTime, Track2, Video] 8 - Track Layer: 0 +[QuickTime, Track2, Video] 9 - Track Volume: 100.00% +[QuickTime, Track2, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track2, Video] edts - Unknown edts: (Binary data 28 bytes) +[QuickTime, Track2, Video] 0 - Media Header Version: 0 +[QuickTime, Track2, Time] 1 - Media Create Date: 2005:08:11 14:03:54 +[QuickTime, Track2, Time] 2 - Media Modify Date: 2005:08:11 14:03:54 +[QuickTime, Track2, Video] 3 - Media Time Scale: 7875 +[QuickTime, Track2, Video] 4 - Media Duration: 4.97 s +[QuickTime, Track2, Video] 4 - Handler Class: Media Handler +[QuickTime, Track2, Video] 8 - Handler Type: Audio Track +[QuickTime, Track2, Video] 12 - Handler Vendor ID: Pentax +[QuickTime, Track2, Audio] 2 - Balance: 0 +[QuickTime, Track2, Video] 4 - Handler Class: Data Handler +[QuickTime, Track2, Video] 8 - Handler Type: Alias Data +[QuickTime, Track2, Video] 12 - Handler Vendor ID: Pentax +[QuickTime, Track2, Other] alis - Unknown alis: (Binary data 4 bytes) +[QuickTime, Track2, Audio] 4 - Audio Format: raw +[QuickTime, Track2, Audio] 24 - Audio Channels: 1 +[QuickTime, Track2, Audio] 26 - Audio Bits Per Sample: 8 +[QuickTime, Track2, Audio] 32 - Audio Sample Rate: 7875 +[QuickTime, Track2, Video] stts - Time To Sample Table: (Binary data 16 bytes) +[QuickTime, Track2, Video] stsc - Sample To Chunk: (Binary data 32 bytes) +[QuickTime, Track2, Video] stsz - Sample Sizes: (Binary data 12 bytes) +[QuickTime, Track2, Video] stco - Chunk Offset: (Binary data 28 bytes) +[QuickTime, QuickTime, Video] 8 - Handler Type: Metadata Tags +[QuickTime, Keys, Other] director - Director: dir +[QuickTime, QuickTime, Video] 8 - Handler Type: Metadata +[QuickTime, QuickTime, Video] 12 - Handler Vendor ID: Apple +[QuickTime, ItemList, Audio] ©ART - Artist: me +[QuickTime, UserData, Video] ©arg - Arranger: arr +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 0 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 4830 +[QuickTime, QuickTime, Video] mdat - Media Data: (Binary data 0 bytes) +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.27 +[XMP, XMP-tiff, Author] Artist - Artist: me diff --git a/t/QuickTime_9.out b/t/QuickTime_9.out new file mode 100644 index 0000000..0fc529b --- /dev/null +++ b/t/QuickTime_9.out @@ -0,0 +1,54 @@ +[QuickTime, QuickTime, Video] 0 - Major Brand: Apple iTunes AAC-LC (.M4A) Audio +[QuickTime, QuickTime, Video] 1 - Minor Version: 0.0.0 +[QuickTime, QuickTime, Video] 2 - Compatible Brands: M4A , mp42, isom +[QuickTime, QuickTime, Video] 0 - Movie Header Version: 0 +[QuickTime, QuickTime, Time] 1 - Create Date: 2005:06:29 19:02:19 +[QuickTime, QuickTime, Time] 2 - Modify Date: 2006:09:22 11:06:45 +[QuickTime, QuickTime, Video] 3 - Time Scale: 600 +[QuickTime, QuickTime, Video] 4 - Duration: 29.05 s +[QuickTime, QuickTime, Video] 5 - Preferred Rate: 1 +[QuickTime, QuickTime, Video] 6 - Preferred Volume: 100.00% +[QuickTime, QuickTime, Video] 9 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, QuickTime, Video] 18 - Preview Time: 0 s +[QuickTime, QuickTime, Video] 19 - Preview Duration: 0 s +[QuickTime, QuickTime, Video] 20 - Poster Time: 0 s +[QuickTime, QuickTime, Video] 21 - Selection Time: 0 s +[QuickTime, QuickTime, Video] 22 - Selection Duration: 0 s +[QuickTime, QuickTime, Video] 23 - Current Time: 0 s +[QuickTime, QuickTime, Video] 24 - Next Track ID: 2 +[QuickTime, Track1, Video] 0 - Track Header Version: 0 +[QuickTime, Track1, Time] 1 - Track Create Date: 2005:06:29 19:02:19 +[QuickTime, Track1, Time] 2 - Track Modify Date: 2006:09:22 11:06:45 +[QuickTime, Track1, Video] 3 - Track ID: 1 +[QuickTime, Track1, Video] 5 - Track Duration: 29.05 s +[QuickTime, Track1, Video] 8 - Track Layer: 0 +[QuickTime, Track1, Video] 9 - Track Volume: 100.00% +[QuickTime, Track1, Video] 10 - Matrix Structure: 1 0 0 0 1 0 0 0 1 +[QuickTime, Track1, Video] 0 - Media Header Version: 0 +[QuickTime, Track1, Time] 1 - Media Create Date: 2005:06:29 19:02:19 +[QuickTime, Track1, Time] 2 - Media Modify Date: 2006:09:22 11:06:45 +[QuickTime, Track1, Video] 3 - Media Time Scale: 32000 +[QuickTime, Track1, Video] 4 - Media Duration: 29.06 s +[QuickTime, Track1, Video] 5 - Media Language Code: und +[QuickTime, Track1, Video] 8 - Handler Type: Audio Track +[QuickTime, Track1, Audio] 2 - Balance: 0 +[QuickTime, Track1, Audio] 4 - Audio Format: mp4a +[QuickTime, Track1, Audio] 24 - Audio Channels: 2 +[QuickTime, Track1, Audio] 26 - Audio Bits Per Sample: 16 +[QuickTime, Track1, Audio] 32 - Audio Sample Rate: 44100 +[QuickTime, Track1, Audio] esds - Unknown esds: (Binary data 43 bytes) +[QuickTime, Track1, Video] stts - Time To Sample Table: (Binary data 16 bytes) +[QuickTime, Track1, Video] stsc - Sample To Chunk: (Binary data 32 bytes) +[QuickTime, Track1, Video] stsz - Sample Sizes: (Binary data 3644 bytes) +[QuickTime, Track1, Video] stco - Chunk Offset: (Binary data 184 bytes) +[QuickTime, QuickTime, Video] 8 - Handler Type: Metadata +[QuickTime, QuickTime, Video] 12 - Handler Vendor ID: Apple +[QuickTime, ItemList, Audio] ©ART - Artist: me +[QuickTime, UserData, Video] ©arg - Arranger: arr +[QuickTime, QuickTime, Video] 8 - Handler Type: Metadata Tags +[QuickTime, Keys, Other] director - Director: dir +[QuickTime, QuickTime, Video] mdat-size - Media Data Size: 0 +[QuickTime, QuickTime, Video] mdat-offset - Media Data Offset: 7449 +[QuickTime, QuickTime, Video] mdat - Media Data: (Binary data 0 bytes) +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.27 +[XMP, XMP-tiff, Author] Artist - Artist: me diff --git a/t/RIFF.t b/t/RIFF.t new file mode 100644 index 0000000..9b46d5b --- /dev/null +++ b/t/RIFF.t @@ -0,0 +1,32 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/RIFF.t". + +BEGIN { + $| = 1; print "1..4\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::RIFF; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'RIFF'; +my $testnum = 1; + +# tests 2-4: Extract information from RIFF.wav, RIFF.avi and RIFF.webp +{ + my $ext; + foreach $ext (qw(wav avi webp)) { + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo("t/images/RIFF.$ext"); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + } +} + + +# end diff --git a/t/RIFF_2.out b/t/RIFF_2.out new file mode 100644 index 0000000..3691cd9 --- /dev/null +++ b/t/RIFF_2.out @@ -0,0 +1,25 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: RIFF.wav +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 224 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:01 09:26:57-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:20-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rwxr-xr-x +[File, File, Other] FileType - File Type: WAV +[File, File, Other] FileTypeExtension - File Type Extension: wav +[File, File, Other] MIMEType - MIME Type: audio/x-wav +[RIFF, RIFF, Audio] 0 - Encoding: Microsoft PCM +[RIFF, RIFF, Audio] 1 - Num Channels: 1 +[RIFF, RIFF, Audio] 2 - Sample Rate: 7872 +[RIFF, RIFF, Audio] 4 - Avg Bytes Per Sec: 7872 +[RIFF, RIFF, Audio] 7 - Bits Per Sample: 8 +[RIFF, RIFF, Time] ICRD - Date Created: 2005:08:08 +[RIFF, RIFF, Audio] ever - Exif Version: 0220 +[RIFF, RIFF, Audio] erel - Related Image File: IMGP1149.JPG +[RIFF, RIFF, Time] etim - Time Created: 16:23:35 +[RIFF, RIFF, Camera] ecor - Make: PENTAX Corporation +[RIFF, RIFF, Camera] emdl - Camera Model Name: PENTAX Optio WP +[RIFF, RIFF, Audio] emnt - Maker Notes: (Binary data 16 bytes) +[Composite, Composite, Time] Exif-DateTimeOriginal - Date/Time Original: 2005:08:08 16:23:35 +[Composite, Composite, Other] RIFF-Duration2 - Duration: 0.03 s diff --git a/t/RIFF_3.out b/t/RIFF_3.out new file mode 100644 index 0000000..339489f --- /dev/null +++ b/t/RIFF_3.out @@ -0,0 +1,55 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: RIFF.avi +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1262 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2008:09:12 12:04:10-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:20-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:01:05 09:06:26-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: AVI +[File, File, Other] FileTypeExtension - File Type Extension: avi +[File, File, Other] MIMEType - MIME Type: video/x-msvideo +[File, File, Image] 0 - BMP Version: Windows V3 +[File, File, Image] 4 - Image Width: 320 +[File, File, Image] 8 - Image Height: 240 +[File, File, Image] 12 - Planes: 1 +[File, File, Image] 14 - Bit Depth: 24 +[File, File, Image] 16 - Compression: MJPG +[File, File, Image] 20 - Image Length: 230400 +[File, File, Image] 24 - Pixels Per Meter X: 0 +[File, File, Image] 28 - Pixels Per Meter Y: 0 +[File, File, Image] 32 - Num Colors: Use BitDepth +[File, File, Image] 36 - Num Important Colors: All +[RIFF, RIFF, Video] 0 - Frame Rate: 15 +[RIFF, RIFF, Video] 1 - Max Data Rate: 201.2 kB/s +[RIFF, RIFF, Video] 4 - Frame Count: 233 +[RIFF, RIFF, Video] 6 - Stream Count: 2 +[RIFF, RIFF, Video] 8 - Image Width: 320 +[RIFF, RIFF, Video] 9 - Image Height: 240 +[RIFF, RIFF, Video] 0 - Stream Type: Video +[RIFF, RIFF, Video] 1 - Video Codec: mjpg +[RIFF, RIFF, Video] 5 - Video Frame Rate: 15 +[RIFF, RIFF, Video] 8 - Video Frame Count: 233 +[RIFF, RIFF, Video] 10 - Quality: 10000 +[RIFF, RIFF, Video] 11 - Sample Size: Variable +[RIFF, RIFF, Video] 0 - Stream Type: Audio +[RIFF, RIFF, Video] 1 - Audio Codec: +[RIFF, RIFF, Video] 5 - Audio Sample Rate: 11024 +[RIFF, RIFF, Video] 8 - Audio Sample Count: 171240 +[RIFF, RIFF, Video] 10 - Quality: 10000 +[RIFF, RIFF, Video] 11 - Sample Size: 1 byte +[RIFF, RIFF, Audio] 0 - Encoding: Microsoft PCM +[RIFF, RIFF, Audio] 1 - Num Channels: 1 +[RIFF, RIFF, Audio] 2 - Sample Rate: 11024 +[RIFF, RIFF, Audio] 4 - Avg Bytes Per Sec: 11024 +[RIFF, RIFF, Audio] 7 - Bits Per Sample: 8 +[RIFF, RIFF, Time] IDIT - Date/Time Original: 2003:03:10 15:04:43 +[RIFF, RIFF, Audio] ISFT - Software: CanonMVI01 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Adobe XMP Core 4.1-c036 46.277092, Fri Feb 23 2007 14:16:18 +[XMP, XMP-xmpDM, Image] altTapeName - Alt Tape Name: An Alternate Scene Name +[XMP, XMP-xmpDM, Image] album - Album: No Album +[XMP, XMP-xmp, Time] MetadataDate - Metadata Date: 2008:09:12 11:17:39-04:00 +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[Composite, Composite, Image] Exif-ImageSize - Image Size: 320x240 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.077 +[Composite, Composite, Other] RIFF-Duration - Duration: 15.53 s diff --git a/t/RIFF_4.out b/t/RIFF_4.out new file mode 100644 index 0000000..67f5c40 --- /dev/null +++ b/t/RIFF_4.out @@ -0,0 +1,18 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: RIFF.webp +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 58 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2012:08:03 09:30:24-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:20-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: WEBP +[File, File, Other] FileTypeExtension - File Type Extension: webp +[File, File, Other] MIMEType - MIME Type: image/webp +[RIFF, RIFF, Image] 0 - VP8 Version: 1 (bilinear reconstruction, simple loop) +[RIFF, RIFF, Image] 6 - Image Width: 16 +[RIFF, RIFF, Image] 6.1 - Horizontal Scale: 0 +[RIFF, RIFF, Image] 8 - Image Height: 16 +[RIFF, RIFF, Image] 8.1 - Vertical Scale: 0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 16x16 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000256 diff --git a/t/RTF.t b/t/RTF.t new file mode 100644 index 0000000..333f479 --- /dev/null +++ b/t/RTF.t @@ -0,0 +1,28 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/RTF.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::RTF; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'RTF'; +my $testnum = 1; + +# test 2: Extract information from an RTF file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/RTF.rtf'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/RTF_2.out b/t/RTF_2.out new file mode 100644 index 0000000..fdf9544 --- /dev/null +++ b/t/RTF_2.out @@ -0,0 +1,21 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: RTF.rtf +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 990 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:06:20 06:28:27-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:46-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: RTF +[File, File, Other] FileTypeExtension - File Type Extension: rtf +[File, File, Other] MIMEType - MIME Type: text/rtf +[RTF, RTF, Document] title - Title: ExifTool RTF test (with spécîål çhars) +[RTF, RTF, Time] revtim - Modify Date: 2010:06:19 20:00:00 +[RTF, RTF, Document] subject - Subject: a “subject†in funny quotes +[RTF, RTF, Document] doccomm - Comments: ストロボ.フラッシュ未発光ã€å¼·åˆ¶ç™ºå…‰ãƒ¢ãƒ¼ãƒ‰(end);another line +[RTF, RTF, Author] author - Author: an author {with braces} +[RTF, RTF, Document] company - Company: a company \with backslashes and leading space\ +[RTF, RTF, Author] copyright - Copyright: © 2010 Phil Harvey +[RTF, RTF, Document] keywords - Keywords: keyword1, keyword2 +[RTF, RTF, Document] CustomString - Custom String: ABCDEF +[RTF, RTF, Document] CustomNumber - Custom Number: 123456 diff --git a/t/Radiance.t b/t/Radiance.t new file mode 100644 index 0000000..75da6fe --- /dev/null +++ b/t/Radiance.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Radiance.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Radiance; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Radiance'; +my $testnum = 1; + +# test 2: Extract information from RGBE file +{ + my $exifTool = new Image::ExifTool; + ++$testnum; + my $info = $exifTool->ImageInfo('t/images/Radiance.hdr'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Radiance_2.out b/t/Radiance_2.out new file mode 100644 index 0000000..01d61ea --- /dev/null +++ b/t/Radiance_2.out @@ -0,0 +1,24 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Radiance.hdr +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 587 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2011:12:10 14:16:13-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:19-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: HDR +[File, File, Other] FileTypeExtension - File Type Extension: hdr +[File, File, Other] MIMEType - MIME Type: image/vnd.radiance +[File, File, Image] ImageHeight - Image Height: 1 +[File, File, Image] ImageWidth - Image Width: 1 +[Radiance, Radiance, Image] _command - Command: oconv mat.rad sky.rad surfaces.rad +[Radiance, Radiance, Image] _command - Command: oconv -f -i test4.oct ila01728 +[Radiance, Radiance, Image] _command - Command: rpict -t 30 -vf test4.vf -x 1536 -y 1536 -ps 3 -pt .04 -dp 4096 -ar 68 -ms 0.029 -ds .2 -dt .05 -dc .75 -dr 3 -sj 1 -st .01 -ab 3 -af test4.amb -aa .08 -ad 1024 -as 512 -av 0.5 0.5 0.5 -lr 12 -lw .0005 -st .001 -dj .02 +[Radiance, Radiance, Image] software - Software: RADIANCE 3.1.8 lastmod Thu Sep 17 20:49:56 PDT 1998 by droberts on escher +[Radiance, Radiance, Image] view - View: -vtv -vp 0.832108 2.26053 1.8 -vd 0.984193 0.177099 0 -vu 0 0 1 -vh 100 -vv 100 -vo 0 -va 0 -vs 0 -vl 0 +[Radiance, Radiance, Image] format - Format: 32-bit_rle_rgbe +[Radiance, Radiance, Image] _command - Command: pfilt -1 -e 1 -m .25 -2 -x /3 -y /3 +[Radiance, Radiance, Image] exposure - Exposure: 3.512179e-001 +[Radiance, Radiance, Image] _orient - Orientation: Horizontal (normal) +[Composite, Composite, Image] Exif-ImageSize - Image Size: 1x1 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000001 diff --git a/t/Real.t b/t/Real.t new file mode 100644 index 0000000..110bf25 --- /dev/null +++ b/t/Real.t @@ -0,0 +1,47 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Real.t". + +BEGIN { + $| = 1; print "1..4\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Real; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Real'; +my $testnum = 1; + +# test 2: Extract information from a RealMedia file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Real.rm'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Extract information from a RealAudio file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Real.ra'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 4: Extract information from a RealAudio Metafile +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Real.ram'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Real_2.out b/t/Real_2.out new file mode 100644 index 0000000..c0124c0 --- /dev/null +++ b/t/Real_2.out @@ -0,0 +1,69 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Real.rm +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1915 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:05:24 08:37:37-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:19-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: RM +[File, File, Other] FileTypeExtension - File Type Extension: rm +[File, File, Other] MIMEType - MIME Type: audio/x-pn-realaudio +[Real, Real-PROP, Video] 0 - Max Bitrate: 32 kbps +[Real, Real-PROP, Video] 1 - Avg Bitrate: 32 kbps +[Real, Real-PROP, Video] 2 - Max Packet Size: 465 +[Real, Real-PROP, Video] 3 - Avg Packet Size: 465 +[Real, Real-PROP, Video] 4 - Num Packets: 16 +[Real, Real-PROP, Video] 5 - Duration: 0.10 s +[Real, Real-PROP, Video] 6 - Preroll: 1.86 s +[Real, Real-PROP, Video] 9 - Num Streams: 2 +[Real, Real-PROP, Video] 10 - Flags: Allow Recording, Allow Download +[Real, Real-MDPR, Video] 0 - Stream Number: 0 +[Real, Real-MDPR, Video] 1 - Stream Max Bitrate: 32 kbps +[Real, Real-MDPR, Video] 2 - Stream Avg Bitrate: 32 kbps +[Real, Real-MDPR, Video] 3 - Stream Max Packet Size: 465 +[Real, Real-MDPR, Video] 4 - Stream Avg Packet Size: 465 +[Real, Real-MDPR, Video] 5 - Stream Start Time: 0 +[Real, Real-MDPR, Video] 6 - Stream Preroll: 1.86 s +[Real, Real-MDPR, Video] 7 - Stream Duration: 1.86 s +[Real, Real-MDPR, Video] 9 - Stream Name: Audio Stream +[Real, Real-MDPR, Video] 11 - Stream Mime Type: audio/x-pn-realaudio +[Real, Real-MDPR2, Video] 0 - Stream Number: 1 +[Real, Real-MDPR2, Video] 1 - Stream Max Bitrate: 0 bps +[Real, Real-MDPR2, Video] 2 - Stream Avg Bitrate: 0 bps +[Real, Real-MDPR2, Video] 3 - Stream Max Packet Size: 0 +[Real, Real-MDPR2, Video] 4 - Stream Avg Packet Size: 0 +[Real, Real-MDPR2, Video] 5 - Stream Start Time: 0 +[Real, Real-MDPR2, Video] 6 - Stream Preroll: 0 s +[Real, Real-MDPR2, Video] 7 - Stream Duration: 0 s +[Real, Real-MDPR2, Video] 11 - Stream Mime Type: logical-fileinfo +[Real, Real-MDPR2, Video] 14 - File Info Version: 0 +[Real, Real-MDPR2, Video] Content Rating - Content Rating: All Ages +[Real, Real-MDPR2, Video] Audiences - Audiences: 56k Dial-up; +[Real, Real-MDPR2, Video] audioMode - Audio Mode: music +[Real, Real-MDPR2, Time] Creation Date - Create Date: 2004:12:05 09:54:03 +[Real, Real-MDPR2, Video] Generated By - Software: Helix Producer SDK from RealNetworks.9.1.0.24 Windows +[Real, Real-MDPR2, Time] Modification Date - Modify Date: 2004:12:05 09:54:03 +[Real, Real-MDPR2, Video] videoMode - Video Mode: normal +[Real, Real-MDPR2, Video] Description - Description: Test RM file +[Real, Real-MDPR2, Video] Keywords - Keywords: these are keywords +[Real, Real-CONT, Video] 1 - Title: A title +[Real, Real-CONT, Author] 3 - Author: Phil Harvey +[Real, Real-CONT, Author] 5 - Copyright: Copyright 2006 Phil Harvey +[Real, Real-CONT, Video] 7 - Comment: A comment +[Real, Real-RJMD, Video] Album/Name - Album Name: The Real album name +[Real, Real-RJMD, Video] Statistics/CDInfo Source - Statistics CD Info Source: +[Real, Real-RJMD, Video] Track/Category - Track Category: The Real track category +[Real, Real-RJMD, Video] Track/Comments - Track Comments: The Real track comments +[Real, Real-RJMD, Video] Track/Comments/DataSize - Track Comments Data Size: 4294967295 +[Real, Real-RJMD, Video] Track/Comments/MimeType - Track Comments Mime Type: text/plain +[Real, Real-RJMD, Video] Track/Lyrics/DataSize - Track Lyrics Data Size: 1224736768 +[Real, Real-RJMD, Video] Track/Lyrics/Extension - Track Lyrics Extension: .txt +[Real, Real-RJMD, Video] Track/Lyrics/MimeType - Track Lyrics Mime Type: text/plain +[ID3, ID3v1, Audio] 3 - Title: This is a title +[ID3, ID3v1, Author] 33 - Artist: An artist +[ID3, ID3v1, Audio] 63 - Album: The album +[ID3, ID3v1, Time] 93 - Year: 2003 +[ID3, ID3v1, Audio] 97 - Comment: This is a comment +[ID3, ID3v1, Audio] 127 - Genre: Rock & Roll +[Composite, Composite, Time] ID3-DateTimeOriginal - Date/Time Original: 2003 diff --git a/t/Real_3.out b/t/Real_3.out new file mode 100644 index 0000000..51c7156 --- /dev/null +++ b/t/Real_3.out @@ -0,0 +1,19 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: Real.ra +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 130 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:05:17 14:28:16-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:46-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: RA +[File, File, Other] FileTypeExtension - File Type Extension: ra +[File, File, Other] MIMEType - MIME Type: audio/x-pn-realaudio +[Real, Real-RA4, Audio] 6 - Audio Bytes: 704352 +[Real, Real-RA4, Audio] 7 - Bytes Per Minute: 299743 +[Real, Real-RA4, Audio] 10 - Audio Frame Size: 348 +[Real, Real-RA4, Audio] 13 - Sample Rate: 22050 +[Real, Real-RA4, Audio] 15 - Bits Per Sample: 16 +[Real, Real-RA4, Audio] 16 - Channels: 1 +[Real, Real-RA4, Audio] 24 - Title: The Sewing Girls +[Real, Real-RA4, Author] 28 - Copyright: ** institut für universelle zusammenhänge diff --git a/t/Real_4.out b/t/Real_4.out new file mode 100644 index 0000000..0807660 --- /dev/null +++ b/t/Real_4.out @@ -0,0 +1,12 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: Real.ram +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 69 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:05:19 12:55:34-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:46-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: RAM +[File, File, Other] FileTypeExtension - File Type Extension: ram +[File, File, Other] MIMEType - MIME Type: audio/x-pn-realaudio +[Real, Real, Video] url - URL: rtsp://media.real.com/showcase/service/samples/rob_h_realvideo9_28.rm diff --git a/t/Red.t b/t/Red.t new file mode 100644 index 0000000..de07908 --- /dev/null +++ b/t/Red.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Red.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Red; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Red'; +my $testnum = 1; + +# test 2: Extract information from Red.r3d +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Red.r3d'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Red_2.out b/t/Red_2.out new file mode 100644 index 0000000..ec3e072 --- /dev/null +++ b/t/Red_2.out @@ -0,0 +1,45 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Red.r3d +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1160 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2018:01:26 14:40:32-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:19-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2018:01:26 14:40:32-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: R3D +[File, File, Other] FileTypeExtension - File Type Extension: r3d +[File, File, Other] MIMEType - MIME Type: video/x-red-r3d +[Red, Red, Video] 7 - Redcode Version: 2 +[Red, Red, Video] 76 - Image Width: 5120 +[Red, Red, Video] 80 - Image Height: 2560 +[Red, Red, Video] 86 - Frame Rate: 23.976 +[Red, Red, Camera] 4096 - Start Edge Code: 01:49:54:11 +[Red, Red, Time] 4097 - Start Timecode: 21:36:16:18 +[Red, Red, Camera] 4102 - Serial Number: 130-246-CE5 +[Red, Red, Camera] 8205 - Color Temperature: 4800 +[Red, Red, Camera] 4121 - Camera Type: A +[Red, Red, Video] 4122 - Reel Number: 106 +[Red, Red, Video] 4123 - Take: 037 +[Red, Red, Time] 4131 - Date Created: 2016:01:18 +[Red, Red, Time] 4132 - Time Created: 21:35:55 +[Red, Red, Camera] 4133 - Firmware Version: 6.2.34 +[Red, Red, Camera] 4138 - Storage Type: RED 512GB V4 +[Red, Red, Camera] 4146 - Storage Serial Number: 15240FC80DE7 +[Red, Red, Time] 4144 - Storage Format Date: 2016:01:18 +[Red, Red, Time] 4145 - Storage Format Time: 21:35:55 +[Red, Red, Camera] 16439 - Crop Area: 0 0 5120 2560 +[Red, Red, Camera] 16443 - ISO: 1280 +[Red, Red, Video] 4230 - Video Format: 5K 2:1 +[Red, Red, Camera] 8267 - RGB Curves: 0 0 0.25 0.25 0.5 0.5 0.75 0.75 1 1 0 0 0.25 0.25 0.5 0.5 0.75 0.75 1 1 0 0 0.25 0.25 0.5 0.5 0.75 0.75 1 1 +[Red, Red, Camera] 4182 - Original File Name: A106_C037_0118G5_002.R3D +[Red, Red, Video] 8294 - Original Frame Rate: 23.976 +[Red, Red, Camera] 16490 - F Number: 4.9 +[Red, Red, Camera] 16491 - Focal Length: 24 +[Red, Red, Camera] 24684 - Focus Distance: -0.001 m +[Red, Red, Camera] 4209 - Camera Model Name: S-WEAPON +[Red, Red, Camera] 4246 - Filter: STANDARD +[Composite, Composite, Image] Exif-Aperture - Aperture: 4.9 +[Composite, Composite, Time] Exif-DateTimeOriginal - Date/Time Original: 2016:01:18 21:35:55 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 5120x2560 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 13.1 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 24.0 mm diff --git a/t/Ricoh.t b/t/Ricoh.t new file mode 100644 index 0000000..6e6012f --- /dev/null +++ b/t/Ricoh.t @@ -0,0 +1,48 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Ricoh.t". + +BEGIN { + $| = 1; print "1..4\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Ricoh; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Ricoh'; +my $testnum = 1; + +# test 2: Extract information from Ricoh.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Ricoh.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + ['Ricoh:Sharpness' => 'Soft'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 4: Test extracting Ricoh APP5 RMETA information +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Ricoh2.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Ricoh_2.out b/t/Ricoh_2.out new file mode 100644 index 0000000..40d64ab --- /dev/null +++ b/t/Ricoh_2.out @@ -0,0 +1,72 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Ricoh.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1903 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:20-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: RICOH +[EXIF, IFD0, Camera] 272 - Camera Model Name: Caplio RR1 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2001:11:07 13:08:41 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: (C) by Caplio RR1 User +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 150 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:11:07 13:08:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:11:07 13:08:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 3 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/274 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 2.6 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 5.3 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Other +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 7.5 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2272 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1704 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1626 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Ricoh, Camera] 1 - Maker Note Type: RDC +[MakerNotes, Ricoh, Camera] 2 - Firmware Version: 1.04 +[MakerNotes, Ricoh, Image] 0 - Ricoh Image Width: 2272 +[MakerNotes, Ricoh, Image] 2 - Ricoh Image Height: 1704 +[MakerNotes, Ricoh, Camera] 4099 - Sharpness: Sharp +[MakerNotes, Ricoh, Time] 4 - Manufacture Date 1: 2001:10:23 00:00:00 +[MakerNotes, Ricoh, Time] 5 - Manufacture Date 2: 0000:00:00 00:00:00 +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0100 +[Composite, Composite, Image] Exif-Aperture - Aperture: 2.6 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/274 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 7.5 mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 10.3 diff --git a/t/Ricoh_3.out b/t/Ricoh_3.out new file mode 100644 index 0000000..3a19246 --- /dev/null +++ b/t/Ricoh_3.out @@ -0,0 +1,100 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Ricoh_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 1907 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:07:29 09:04:20-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:20-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2020:07:29 09:04:20-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: RICOH +[EXIF, IFD0, Camera] 272 - Camera Model Name: Caplio RR1 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2001:11:07 13:08:41 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: (C) by Caplio RR1 User +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 150 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:11:07 13:08:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:11:07 13:08:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 3 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/274 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 2.6 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 5.3 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Other +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 7.5 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2272 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1704 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1630 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Ricoh, Camera] 1 - Maker Note Type: RDC +[MakerNotes, Ricoh, Camera] 2 - Firmware Version: 1.04 +[MakerNotes, Ricoh, Camera] 3 - Ricoh 0x0003: 3 +[MakerNotes, Ricoh, Camera] 4 - Ricoh 0x0004: 13104 12853 +[MakerNotes, Ricoh, Image] 0 - Ricoh Image Width: 2272 +[MakerNotes, Ricoh, Image] 2 - Ricoh Image Height: 1704 +[MakerNotes, Ricoh, Camera] 4098 - Ricoh 0x1002: 0 +[MakerNotes, Ricoh, Camera] 4099 - Sharpness: Soft +[MakerNotes, Ricoh, Camera] 4100 - Ricoh 0x1004: 0 +[MakerNotes, Ricoh, Camera] 4101 - Ricoh 0x1005: 1 +[MakerNotes, Ricoh, Camera] 1 - Ricoh Subdir 0x0001: 532 314 +[MakerNotes, Ricoh, Camera] 2 - Ricoh Subdir 0x0002: 42 +[MakerNotes, Ricoh, Camera] 3 - Ricoh Subdir 0x0003: 314572848 +[MakerNotes, Ricoh, Time] 4 - Manufacture Date 1: 2001:10:23 00:00:00 +[MakerNotes, Ricoh, Time] 5 - Manufacture Date 2: 0000:00:00 00:00:00 +[MakerNotes, Ricoh, Camera] 6 - Ricoh Subdir 0x0006: 12 0 +[MakerNotes, Ricoh, Camera] 7 - Ricoh Subdir 0x0007: 0 +[MakerNotes, Ricoh, Camera] 8 - Ricoh Subdir 0x0008: 32 +[MakerNotes, Ricoh, Camera] 9 - Ricoh Subdir 0x0009: 65535 1024 +[MakerNotes, Ricoh, Camera] 10 - Ricoh Subdir 0x000a: 0.07485380117 +[MakerNotes, Ricoh, Camera] 11 - Ricoh Subdir 0x000b: 0.3939393939 +[MakerNotes, Ricoh, Camera] 12 - Ricoh Subdir 0x000c: 136 12 +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0100 +[PrintIM, PrintIM, Printing] 1 - Print IM 0x0001: 0x00160016 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x00000000 +[PrintIM, PrintIM, Printing] 3 - Print IM 0x0003: 0x0000005e +[PrintIM, PrintIM, Printing] 7 - Print IM 0x0007: 0x00000000 +[PrintIM, PrintIM, Printing] 8 - Print IM 0x0008: 0x00000000 +[PrintIM, PrintIM, Printing] 9 - Print IM 0x0009: 0x00000000 +[PrintIM, PrintIM, Printing] 10 - Print IM 0x000a: 0x00000000 +[PrintIM, PrintIM, Printing] 11 - Print IM 0x000b: 0x000000a6 +[PrintIM, PrintIM, Printing] 12 - Print IM 0x000c: 0x00000000 +[PrintIM, PrintIM, Printing] 13 - Print IM 0x000d: 0x00000000 +[PrintIM, PrintIM, Printing] 14 - Print IM 0x000e: 0x000000be +[PrintIM, PrintIM, Printing] 256 - Print IM 0x0100: 0x05000000 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x00000000 +[Composite, Composite, Image] Exif-Aperture - Aperture: 2.6 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/274 +[Composite, Composite, Image] Exif-LightValue - Light Value: 10.3 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 7.5 mm diff --git a/t/Ricoh_4.out b/t/Ricoh_4.out new file mode 100644 index 0000000..6a74536 --- /dev/null +++ b/t/Ricoh_4.out @@ -0,0 +1,114 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Ricoh2.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 3.2 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:09:29 19:47:55-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:51-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: RICOH +[EXIF, IFD0, Camera] 272 - Camera Model Name: Caplio Pro G3 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2006:05:26 11:48:48 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: (C) by Caplio Pro G3 User +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/1740 +[EXIF, ExifIFD, Image] 33437 - F Number: 5.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 125 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2006:05:26 11:48:48 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2006:05:26 11:48:48 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 3.2 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 5.7 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 9.6 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: -1 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Spot +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Auto, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 5.7 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: GCM_TAG +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2048 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1536 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Hard +[EXIF, GPS, Location] 0 - GPS Version ID: 2.2.0.0 +[EXIF, GPS, Location] 1 - GPS Latitude Ref: North +[EXIF, GPS, Location] 2 - GPS Latitude: 42 deg 2' 4.47" +[EXIF, GPS, Location] 3 - GPS Longitude Ref: West +[EXIF, GPS, Location] 4 - GPS Longitude: 0 deg 30' 27.01" +[EXIF, GPS, Location] 5 - GPS Altitude Ref: Above Sea Level +[EXIF, GPS, Location] 6 - GPS Altitude: 117 m +[EXIF, GPS, Time] 7 - GPS Time Stamp: 10:47:24 +[EXIF, GPS, Location] 8 - GPS Satellites: 24,23,20,17,13,11,04 +[EXIF, GPS, Location] 9 - GPS Status: Measurement Active +[EXIF, GPS, Location] 10 - GPS Measure Mode: 3-Dimensional Measurement +[EXIF, GPS, Location] 11 - GPS Dilution Of Precision: 2.6 +[EXIF, GPS, Location] 12 - GPS Speed Ref: knots +[EXIF, GPS, Location] 13 - GPS Speed: 0 +[EXIF, GPS, Location] 14 - GPS Track Ref: True North +[EXIF, GPS, Location] 15 - GPS Track: 20 +[EXIF, GPS, Location] 16 - GPS Img Direction Ref: True North +[EXIF, GPS, Location] 17 - GPS Img Direction: 20 +[EXIF, GPS, Location] 18 - GPS Map Datum: WGS-84 +[EXIF, GPS, Location] 23 - GPS Dest Bearing Ref: Unknown () +[EXIF, GPS, Location] 24 - GPS Dest Bearing: undef +[EXIF, GPS, Location] 25 - GPS Dest Distance Ref: Unknown () +[EXIF, GPS, Location] 26 - GPS Dest Distance: undef +[EXIF, GPS, Time] 29 - GPS Date Stamp: 2006:05:26 +[EXIF, GPS, Location] 30 - GPS Differential: No Correction +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 2492 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Ricoh, Camera] 1 - Maker Note Type: Rdc +[MakerNotes, Ricoh, Camera] 2 - Firmware Version: 22.19 +[MakerNotes, Ricoh, Camera] 5 - Internal Serial Number: 00000000000000012207000003100957 +[MakerNotes, Ricoh, Image] 0 - Ricoh Image Width: 2048 +[MakerNotes, Ricoh, Image] 2 - Ricoh Image Height: 1536 +[MakerNotes, Ricoh, Time] 6 - Ricoh Date: 2006:05:26 11:48:48 +[MakerNotes, Ricoh, Camera] 4099 - Sharpness: Sharp +[MakerNotes, Ricoh, Time] 4 - Manufacture Date 1: 2005:06:06 +[MakerNotes, Ricoh, Time] 5 - Manufacture Date 2: 2003:08:19 +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[APP5, RMETA, Image] Sign type - Sign Type: Information +[APP5, RMETA, Image] Location - Location: Roundabout +[APP5, RMETA, Image] Lit - Lit: No +[APP5, RMETA, Image] Condition - Condition: Good +[APP5, RMETA, Image] Azimuth - Azimuth: E +[Composite, Composite, Image] Exif-Aperture - Aperture: 5.5 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/1740 +[Composite, Composite, Location] GPS-GPSAltitude - GPS Altitude: 117 m Above Sea Level +[Composite, Composite, Time] GPS-GPSDateTime - GPS Date/Time: 2006:05:26 10:47:24Z +[Composite, Composite, Location] GPS-GPSLatitude - GPS Latitude: 42 deg 2' 4.47" N +[Composite, Composite, Location] GPS-GPSLongitude - GPS Longitude: 0 deg 30' 27.01" W +[Composite, Composite, Location] Exif-GPSPosition - GPS Position: 42 deg 2' 4.47" N, 0 deg 30' 27.01" W +[Composite, Composite, Image] Exif-LightValue - Light Value: 15.4 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 5.7 mm diff --git a/t/Sanyo.t b/t/Sanyo.t new file mode 100644 index 0000000..72cc5b1 --- /dev/null +++ b/t/Sanyo.t @@ -0,0 +1,40 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Sanyo.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Sanyo; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Sanyo'; +my $testnum = 1; + +# test 2: Extract information from Sanyo.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Sanyo.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + [SceneCaptureType => 'night'], + [FlashMode => 'force', Group => 'MakerNotes'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Sanyo_2.out b/t/Sanyo_2.out new file mode 100644 index 0000000..3ce1081 --- /dev/null +++ b/t/Sanyo_2.out @@ -0,0 +1,103 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Sanyo.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 2.2 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:51-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: SANYO DIGITAL CAMERA +[EXIF, IFD0, Camera] 271 - Make: SANYO Electric Co.,Ltd. +[EXIF, IFD0, Camera] 272 - Camera Model Name: VPC-MZ3 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: V612P-75 +[EXIF, IFD0, Time] 306 - Modify Date: 2003:10:11 12:43:05 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/185 +[EXIF, ExifIFD, Image] 33437 - F Number: 6.9 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 400 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:10:11 12:43:05 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:10:11 12:43:05 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 2.9 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-spot +[EXIF, ExifIFD, Camera] 37384 - Light Source: Fine Weather +[EXIF, ExifIFD, Camera] 37385 - Flash: Auto, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 23.1 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2000 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1496 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Manual +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 0 +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 11113 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: High gain up +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, ExifIFD, Camera] 41996 - Subject Distance Range: Close +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1888 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Sanyo, Camera] 255 - Maker Note Offset: 1076 +[MakerNotes, Sanyo, Camera] 512 - Special Mode: 0 0 0 +[MakerNotes, Sanyo, Camera] 513 - Sanyo Quality: Fine/Very High +[MakerNotes, Sanyo, Camera] 514 - Macro: Normal +[MakerNotes, Sanyo, Camera] 516 - Digital Zoom: 0 +[MakerNotes, Sanyo, Camera] 526 - Sequential Shot: None +[MakerNotes, Sanyo, Camera] 527 - Wide Range: Off +[MakerNotes, Sanyo, Camera] 528 - Color Adjustment Mode: Off +[MakerNotes, Sanyo, Camera] 531 - Quick Shot: Off +[MakerNotes, Sanyo, Camera] 532 - Self Timer: Off +[MakerNotes, Sanyo, Camera] 534 - Voice Memo: Off +[MakerNotes, Sanyo, Camera] 535 - Record Shutter Release: Record while down +[MakerNotes, Sanyo, Camera] 536 - Flicker Reduce: Off +[MakerNotes, Sanyo, Camera] 537 - Optical Zoom On: On +[MakerNotes, Sanyo, Camera] 539 - Digital Zoom On: Off +[MakerNotes, Sanyo, Camera] 541 - Light Source Special: Off +[MakerNotes, Sanyo, Camera] 542 - Resaved: No +[MakerNotes, Sanyo, Camera] 543 - Scene Select: Off +[MakerNotes, Sanyo, Camera] 547 - Manual Focus Distance: 1 +[MakerNotes, Sanyo, Camera] 548 - Sequence Shot Interval: 5 frames/s +[MakerNotes, Sanyo, Camera] 549 - Flash Mode: Red eye +[MakerNotes, Sanyo, Camera] 3840 - Data Dump: (Binary data 260 bytes) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0100 +[Composite, Composite, Image] Exif-Aperture - Aperture: 6.9 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 481.1 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/185 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.000 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 0.2 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 23.1 mm (35 mm equivalent: 11113.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 1238.24 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 11.1 diff --git a/t/Sanyo_3.out b/t/Sanyo_3.out new file mode 100644 index 0000000..29ab61c --- /dev/null +++ b/t/Sanyo_3.out @@ -0,0 +1,113 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Sanyo_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 2.2 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:51-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:51-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:51-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: SANYO DIGITAL CAMERA +[EXIF, IFD0, Camera] 271 - Make: SANYO Electric Co.,Ltd. +[EXIF, IFD0, Camera] 272 - Camera Model Name: VPC-MZ3 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: V612P-75 +[EXIF, IFD0, Time] 306 - Modify Date: 2003:10:11 12:43:05 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/185 +[EXIF, ExifIFD, Image] 33437 - F Number: 6.9 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 400 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:10:11 12:43:05 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:10:11 12:43:05 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 2.9 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-spot +[EXIF, ExifIFD, Camera] 37384 - Light Source: Fine Weather +[EXIF, ExifIFD, Camera] 37385 - Flash: Auto, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 23.1 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2000 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1496 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Manual +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 0 +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 11113 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Night +[EXIF, ExifIFD, Camera] 41991 - Gain Control: High gain up +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, ExifIFD, Camera] 41996 - Subject Distance Range: Close +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1882 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Sanyo, Camera] 255 - Maker Note Offset: 1076 +[MakerNotes, Sanyo, Camera] 512 - Special Mode: 0 0 0 +[MakerNotes, Sanyo, Camera] 513 - Sanyo Quality: Fine/Very High +[MakerNotes, Sanyo, Camera] 514 - Macro: Normal +[MakerNotes, Sanyo, Camera] 515 - Sanyo 0x0203: 0 +[MakerNotes, Sanyo, Camera] 516 - Digital Zoom: 0 +[MakerNotes, Sanyo, Camera] 526 - Sequential Shot: None +[MakerNotes, Sanyo, Camera] 527 - Wide Range: Off +[MakerNotes, Sanyo, Camera] 528 - Color Adjustment Mode: Off +[MakerNotes, Sanyo, Camera] 529 - Sanyo 0x0211: 0 +[MakerNotes, Sanyo, Camera] 530 - Sanyo 0x0212: 0 +[MakerNotes, Sanyo, Camera] 531 - Quick Shot: Off +[MakerNotes, Sanyo, Camera] 532 - Self Timer: Off +[MakerNotes, Sanyo, Camera] 533 - Sanyo 0x0215: 0 +[MakerNotes, Sanyo, Camera] 534 - Voice Memo: Off +[MakerNotes, Sanyo, Camera] 535 - Record Shutter Release: Record while down +[MakerNotes, Sanyo, Camera] 536 - Flicker Reduce: Off +[MakerNotes, Sanyo, Camera] 537 - Optical Zoom On: On +[MakerNotes, Sanyo, Camera] 538 - Sanyo 0x021a: 3 +[MakerNotes, Sanyo, Camera] 539 - Digital Zoom On: Off +[MakerNotes, Sanyo, Camera] 540 - Sanyo 0x021c: 0 +[MakerNotes, Sanyo, Camera] 541 - Light Source Special: Off +[MakerNotes, Sanyo, Camera] 542 - Resaved: No +[MakerNotes, Sanyo, Camera] 543 - Scene Select: Off +[MakerNotes, Sanyo, Camera] 544 - Sanyo 0x0220: 9 +[MakerNotes, Sanyo, Camera] 545 - Sanyo 0x0221: 0 +[MakerNotes, Sanyo, Camera] 546 - Sanyo 0x0222: 3 1820 800 103 8963 800 211 13726 800 187 19210 800 153[...] +[MakerNotes, Sanyo, Camera] 547 - Manual Focus Distance: 1 +[MakerNotes, Sanyo, Camera] 548 - Sequence Shot Interval: 5 frames/s +[MakerNotes, Sanyo, Camera] 549 - Flash Mode: Force +[MakerNotes, Sanyo, Camera] 3840 - Data Dump: (Binary data 260 bytes) +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0100 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x00000001 +[Composite, Composite, Image] Exif-Aperture - Aperture: 6.9 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 481.1 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/185 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.000 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 0.2 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 23.1 mm (35 mm equivalent: 11113.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 1238.24 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 11.1 diff --git a/t/Sigma.t b/t/Sigma.t new file mode 100644 index 0000000..b7a856a --- /dev/null +++ b/t/Sigma.t @@ -0,0 +1,61 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Sigma.t". + +BEGIN { + $| = 1; print "1..5\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Sigma; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Sigma'; +my $testnum = 1; + +# test 2: Extract information from Sigma.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Sigma.jpg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + ['IPTCPixelWidth' => 200], + ['Sharpness' => 2, 'Group' => 'MakerNotes'], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 4: Test reading X3F image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Sigma.x3f'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 5: Test writing X3F image +{ + ++$testnum; + my @writeInfo = ( + ['Artist' => 'Phil Harvey'], + ['XMP:Title' => 'A title'], + ['Keywords' => ['one','two']], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/SigmaDP2.x3f'); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Sigma_2.out b/t/Sigma_2.out new file mode 100644 index 0000000..0c05987 --- /dev/null +++ b/t/Sigma_2.out @@ -0,0 +1,93 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Sigma.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1531 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:20-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: SIGMA +[EXIF, IFD0, Camera] 272 - Camera Model Name: SIGMA SD10 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: SIGMA PhotoPro 2.0.0.1586 +[EXIF, IFD0, Time] 306 - Modify Date: 2004:03:19 17:48:51 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/320 +[EXIF, ExifIFD, Image] 33437 - F Number: 8.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:11:27 10:31:34 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2004:03:19 17:48:51 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 60.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2268 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1512 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Sigma Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Custom +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Manual +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 102 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Image] 42016 - Image Unique ID: 303230303030313986D2C53F8ABDA2A6 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 180 +[EXIF, IFD1, Image] 283 - Y Resolution: 180 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1254 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Sigma, Camera] 2 - Serial Number: 02000019 +[MakerNotes, Sigma, Camera] 3 - Drive Mode: SINGLE +[MakerNotes, Sigma, Camera] 4 - Resolution Mode: HI +[MakerNotes, Sigma, Camera] 5 - AF Mode: AF-S +[MakerNotes, Sigma, Camera] 6 - Focus Setting: AF +[MakerNotes, Sigma, Camera] 7 - White Balance: Sunlight +[MakerNotes, Sigma, Camera] 8 - Exposure Mode: Program AE +[MakerNotes, Sigma, Camera] 9 - Metering Mode: Multi-segment +[MakerNotes, Sigma, Camera] 10 - Lens Focal Range: 24 to 70 +[MakerNotes, Sigma, Camera] 11 - Color Space: sRGB +[MakerNotes, Sigma, Camera] 12 - Exposure Compensation: +0.8 +[MakerNotes, Sigma, Camera] 13 - Contrast: +0.0 +[MakerNotes, Sigma, Camera] 14 - Shadow: +0.0 +[MakerNotes, Sigma, Camera] 15 - Highlight: +0.0 +[MakerNotes, Sigma, Camera] 16 - Saturation: +0.4 +[MakerNotes, Sigma, Camera] 17 - Sharpness: +1.0 +[MakerNotes, Sigma, Camera] 18 - X3 Fill Light: +0.0 +[MakerNotes, Sigma, Camera] 20 - Color Adjustment: 0 +[MakerNotes, Sigma, Camera] 21 - Adjustment Mode: X3F Setting Mode +[MakerNotes, Sigma, Camera] 22 - Quality: 12 +[MakerNotes, Sigma, Camera] 23 - Firmware: 2.0.4.1642 Release +[MakerNotes, Sigma, Camera] 24 - Software: SIGMA PhotoPro 2.0.0.1586 +[MakerNotes, Sigma, Camera] 25 - Auto Bracket: +[Composite, Composite, Image] Exif-Aperture - Aperture: 8.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.7 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/320 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.018 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 20.0 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 60.0 mm (35 mm equivalent: 102.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 25.46 m +[Composite, Composite, Image] Exif-LightValue - Light Value: 14.3 diff --git a/t/Sigma_3.out b/t/Sigma_3.out new file mode 100644 index 0000000..21e57c3 --- /dev/null +++ b/t/Sigma_3.out @@ -0,0 +1,96 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Sigma_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 1575 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:07:29 09:04:21-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:21-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2020:07:29 09:04:21-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: d29df24ca5b6b8d1ac85670c7041b071 +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: SIGMA +[EXIF, IFD0, Camera] 272 - Camera Model Name: SIGMA SD10 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: SIGMA PhotoPro 2.0.0.1586 +[EXIF, IFD0, Time] 306 - Modify Date: 2004:03:19 17:48:51 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/320 +[EXIF, ExifIFD, Image] 33437 - F Number: 8.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:11:27 10:31:34 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2004:03:19 17:48:51 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 60.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2268 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1512 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Sigma Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Custom +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Manual +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 102 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Image] 42016 - Image Unique ID: 303230303030313986D2C53F8ABDA2A6 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 180 +[EXIF, IFD1, Image] 283 - Y Resolution: 180 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 1254 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Sigma, Camera] 2 - Serial Number: 02000019 +[MakerNotes, Sigma, Camera] 3 - Drive Mode: SINGLE +[MakerNotes, Sigma, Camera] 4 - Resolution Mode: HI +[MakerNotes, Sigma, Camera] 5 - AF Mode: AF-S +[MakerNotes, Sigma, Camera] 6 - Focus Setting: AF +[MakerNotes, Sigma, Camera] 7 - White Balance: Sunlight +[MakerNotes, Sigma, Camera] 8 - Exposure Mode: Program AE +[MakerNotes, Sigma, Camera] 9 - Metering Mode: Multi-segment +[MakerNotes, Sigma, Camera] 10 - Lens Focal Range: 24 to 70 +[MakerNotes, Sigma, Camera] 11 - Color Space: sRGB +[MakerNotes, Sigma, Camera] 12 - Exposure Compensation: +0.8 +[MakerNotes, Sigma, Camera] 13 - Contrast: +0.0 +[MakerNotes, Sigma, Camera] 14 - Shadow: +0.0 +[MakerNotes, Sigma, Camera] 15 - Highlight: +0.0 +[MakerNotes, Sigma, Camera] 16 - Saturation: +0.4 +[MakerNotes, Sigma, Camera] 17 - Sharpness: +2.0 +[MakerNotes, Sigma, Camera] 18 - X3 Fill Light: +0.0 +[MakerNotes, Sigma, Camera] 20 - Color Adjustment: 0 +[MakerNotes, Sigma, Camera] 21 - Adjustment Mode: X3F Setting Mode +[MakerNotes, Sigma, Camera] 22 - Quality: 12 +[MakerNotes, Sigma, Camera] 23 - Firmware: 2.0.4.1642 Release +[MakerNotes, Sigma, Camera] 24 - Software: SIGMA PhotoPro 2.0.0.1586 +[MakerNotes, Sigma, Camera] 25 - Auto Bracket: +[IPTC, IPTC, Image] 40 - IPTC Pixel Width: 200 +[IPTC, IPTC, Image] 0 - News Photo Version: 4 +[Composite, Composite, Image] Exif-Aperture - Aperture: 8.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/320 +[Composite, Composite, Image] Exif-LightValue - Light Value: 14.3 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.7 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.018 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 20.0 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 60.0 mm (35 mm equivalent: 102.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 25.46 m diff --git a/t/Sigma_4.out b/t/Sigma_4.out new file mode 100644 index 0000000..fe9f60e --- /dev/null +++ b/t/Sigma_4.out @@ -0,0 +1,65 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Sigma.x3f +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1464 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2005:11:14 14:47:22-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:21-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: X3F +[File, File, Other] FileTypeExtension - File Type Extension: x3f +[File, File, Other] MIMEType - MIME Type: image/x-sigma-x3f +[SigmaRaw, SigmaRaw, Other] 1 - File Version: 2.2 +[SigmaRaw, SigmaRaw, Other] 2 - Image Unique ID: 303230303132333413d14f3a3b2aa914 +[SigmaRaw, SigmaRaw, Other] 6 - Mark Bits: (none) +[SigmaRaw, SigmaRaw, Other] 7 - Image Width: 2268 +[SigmaRaw, SigmaRaw, Other] 8 - Image Height: 1512 +[SigmaRaw, SigmaRaw, Other] 9 - Rotation: 90 +[SigmaRaw, SigmaRaw, Other] 10 - White Balance: Sunlight +[SigmaRaw, SigmaRaw, Camera] 1 - Exposure Adjust: 0.5 +[SigmaRaw, SigmaRaw, Camera] 2 - Contrast: -1.1 +[SigmaRaw, SigmaRaw, Camera] 3 - Shadow: -0.1 +[SigmaRaw, SigmaRaw, Camera] 4 - Highlight: -2.0 +[SigmaRaw, SigmaRaw, Camera] 5 - Saturation: -0.1 +[SigmaRaw, SigmaRaw, Camera] 6 - Sharpness: -1.9 +[SigmaRaw, SigmaRaw, Camera] 10 - X3 Fill Light: -1.7 +[SigmaRaw, SigmaRaw, Camera] 7 - Red Adjust: 1.0 +[SigmaRaw, SigmaRaw, Camera] 8 - Green Adjust: 0.9 +[SigmaRaw, SigmaRaw, Camera] 9 - Blue Adjust: 0.9 +[SigmaRaw, SigmaRaw, Camera] ISO - ISO: 100 +[SigmaRaw, SigmaRaw, Camera] RESOLUTION - Quality: High +[SigmaRaw, SigmaRaw, Camera] WB_DESC - White Balance: Sunlight +[SigmaRaw, SigmaRaw, Camera] CAMMANUF - Make: SIGMA +[SigmaRaw, SigmaRaw, Camera] CAMMODEL - Model: SIGMA SD10 +[SigmaRaw, SigmaRaw, Camera] CAMSERIAL - Serial Number: 02001234 +[SigmaRaw, SigmaRaw, Camera] FIRMVERS - Firmware Version: 2.0.4.1586 Release +[SigmaRaw, SigmaRaw, Time] TIME - Date/Time Original: 2001:01:01 00:36:35 +[SigmaRaw, SigmaRaw, Image] EXPTIME - Integration Time: 1/41 +[SigmaRaw, SigmaRaw, Camera] FOCUS - Focus: Auto-focus Locked +[SigmaRaw, SigmaRaw, Camera] AFMODE - Focus Mode: AF-S +[SigmaRaw, SigmaRaw, Image] SHUTTER - Exposure Time: 1/108 +[SigmaRaw, SigmaRaw, Camera] SH_DESC - Shutter Speed Displayed: 1/100 +[SigmaRaw, SigmaRaw, Camera] FLASH - Flash Mode: Off +[SigmaRaw, SigmaRaw, Camera] PMODE - Exposure Program: Program +[SigmaRaw, SigmaRaw, Image] EXPCOMP - Exposure Compensation: 0 +[SigmaRaw, SigmaRaw, Image] EXPNET - Net Exposure Compensation: 0 +[SigmaRaw, SigmaRaw, Camera] AEMODE - Metering Mode: 8-segment +[SigmaRaw, SigmaRaw, Camera] DRIVE - Drive Mode: Single Shot +[SigmaRaw, SigmaRaw, Camera] LENSMODEL - Lens Type: Sigma Lens (0x145) +[SigmaRaw, SigmaRaw, Image] APERTURE - F Number: 8.4 +[SigmaRaw, SigmaRaw, Camera] AP_DESC - Aperture Displayed: 8 +[SigmaRaw, SigmaRaw, Camera] LENSARANGE - Lens Aperture Range: 29 to 4.5 +[SigmaRaw, SigmaRaw, Camera] LENSFRANGE - Lens Focal Range: 15 to 30 +[SigmaRaw, SigmaRaw, Camera] FLENGTH - Focal Length: 30.0 mm +[SigmaRaw, SigmaRaw, Camera] FLEQ35MM - Focal Length In 35mm Format: 51.0 mm +[Composite, Composite, Image] Exif-Aperture - Aperture: 8.4 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 2268x1512 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 3.4 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/108 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Sigma 15-30mm F3.5-4.5 EX DG Aspherical +[Composite, Composite, Image] Exif-LightValue - Light Value: 12.9 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.7 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.018 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 38.9 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 30.0 mm (35 mm equivalent: 51.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 6.10 m diff --git a/t/Sigma_5.out b/t/Sigma_5.out new file mode 100644 index 0000000..4cb7262 --- /dev/null +++ b/t/Sigma_5.out @@ -0,0 +1,194 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Sigma_5_failed.x3f +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 7.3 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:52-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:52-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:52-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: X3F +[File, File, Other] FileTypeExtension - File Type Extension: x3f +[File, File, Other] MIMEType - MIME Type: image/x-sigma-x3f +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[SigmaRaw, SigmaRaw, Other] 1 - File Version: 2.3 +[SigmaRaw, SigmaRaw, Other] 2 - Image Unique ID: 30313030383338321020114b31646638 +[SigmaRaw, SigmaRaw, Other] 6 - Mark Bits: (none) +[SigmaRaw, SigmaRaw, Other] 7 - Image Width: 2640 +[SigmaRaw, SigmaRaw, Other] 8 - Image Height: 1760 +[SigmaRaw, SigmaRaw, Other] 9 - Rotation: 0 +[SigmaRaw, SigmaRaw, Other] 10 - White Balance: Auto +[SigmaRaw, SigmaRaw, Other] 18 - Scene Capture Type: Standard +[SigmaRaw, SigmaRaw, Camera] 1 - Exposure Adjust: 0.0 +[SigmaRaw, SigmaRaw, Camera] 2 - Contrast: 0.0 +[SigmaRaw, SigmaRaw, Camera] 3 - Shadow: 0.0 +[SigmaRaw, SigmaRaw, Camera] 4 - Highlight: 0.0 +[SigmaRaw, SigmaRaw, Camera] 5 - Saturation: 0.0 +[SigmaRaw, SigmaRaw, Camera] 6 - Sharpness: 0.0 +[SigmaRaw, SigmaRaw, Camera] 10 - X3 Fill Light: 0.0 +[SigmaRaw, SigmaRaw, Camera] 7 - Red Adjust: 0.0 +[SigmaRaw, SigmaRaw, Camera] 8 - Green Adjust: 0.0 +[SigmaRaw, SigmaRaw, Camera] 9 - Blue Adjust: 0.0 +[SigmaRaw, SigmaRaw, Preview] IMA2 - Jpg From Raw: (Binary data 5637 bytes) +[SigmaRaw, SigmaRaw, Camera] AEMODE - Metering Mode: 8-segment +[SigmaRaw, SigmaRaw, Camera] AFMODE - Focus Mode: AF-S +[SigmaRaw, SigmaRaw, Camera] AP_DESC - Aperture Displayed: 2.8 +[SigmaRaw, SigmaRaw, Image] APERTURE - F Number: 2.8 +[SigmaRaw, SigmaRaw, Camera] BRACKET - Bracket Shot: +[SigmaRaw, SigmaRaw, Camera] BURST - Burst Shot: 0 +[SigmaRaw, SigmaRaw, Camera] CAMMANUF - Make: SIGMA +[SigmaRaw, SigmaRaw, Camera] CAMMODEL - Model: SIGMA DP2 +[SigmaRaw, SigmaRaw, Camera] CAMNAME - Camera Name: +[SigmaRaw, SigmaRaw, Camera] CAMSERIAL - Serial Number: 1008382 +[SigmaRaw, SigmaRaw, Camera] DRIVE - Drive Mode: Single Shot +[SigmaRaw, SigmaRaw, Image] EXPCOMP - Exposure Compensation: 0 +[SigmaRaw, SigmaRaw, Image] EXPNET - Net Exposure Compensation: 0 +[SigmaRaw, SigmaRaw, Image] EXPTIME - Integration Time: 1/10 +[SigmaRaw, SigmaRaw, Camera] FIRMVERS - Firmware Version: 1.03.0.000 +[SigmaRaw, SigmaRaw, Camera] FLASH - Flash Mode: Off +[SigmaRaw, SigmaRaw, Camera] FLENGTH - Focal Length: 24.2 mm +[SigmaRaw, SigmaRaw, Camera] FLEQ35MM - Focal Length In 35mm Format: 41.0 mm +[SigmaRaw, SigmaRaw, Camera] FOCUS - Focus: Auto-focus Locked +[SigmaRaw, SigmaRaw, Camera] IMAGEBOARDID - Image Board ID: +[SigmaRaw, SigmaRaw, Camera] IMAGERTEMP - Sensor Temperature: 20 C +[SigmaRaw, SigmaRaw, Camera] ISO - ISO: 100 +[SigmaRaw, SigmaRaw, Camera] LENSARANGE - Lens Aperture Range: 2.8 to 14 +[SigmaRaw, SigmaRaw, Camera] LENSFRANGE - Lens Focal Range: 24.2 +[SigmaRaw, SigmaRaw, Camera] LENSMODEL - Lens Type: Unknown ( ) +[SigmaRaw, SigmaRaw, Camera] PMODE - Exposure Program: Program +[SigmaRaw, SigmaRaw, Camera] RESOLUTION - Quality: High +[SigmaRaw, SigmaRaw, Camera] SENSORID - Sensor ID: +[SigmaRaw, SigmaRaw, Camera] SH_DESC - Shutter Speed Displayed: 1/10 +[SigmaRaw, SigmaRaw, Image] SHUTTER - Exposure Time: 1/10 +[SigmaRaw, SigmaRaw, Time] TIME - Date/Time Original: 2009:11:28 13:05:20 +[SigmaRaw, SigmaRaw, Camera] WB_DESC - White Balance: Auto +[SigmaRaw, SigmaRaw, Camera] CM_DESC - Scene Capture Type: Standard +[SigmaRaw, SigmaRaw, Preview] IMA2 - Preview Image: (Binary data 18 bytes) +[EXIF, IFD0, Camera] 271 - Make: SIGMA +[EXIF, IFD0, Camera] 272 - Camera Model Name: SIGMA DP2 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: 1.03.0.000000000 +[EXIF, IFD0, Time] 306 - Modify Date: 2009:11:28 13:05:20 +[EXIF, IFD0, Author] 315 - Artist: Phil Harvey +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/10 +[EXIF, ExifIFD, Image] 33437 - F Number: 2.8 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2009:11:28 13:05:20 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2009:11:28 13:05:20 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 24.2 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2640 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1760 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 41 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Image] 42016 - Image Unique ID: 30313030383338321020110031646638 +[EXIF, ExifIFD, Image] 42240 - Gamma: undef +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 180 +[EXIF, IFD1, Image] 283 - Y Resolution: 180 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 2680 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Sigma, Camera] 2 - Serial Number: 1008382 +[MakerNotes, Sigma, Camera] 3 - Drive Mode: SINGLE +[MakerNotes, Sigma, Camera] 4 - Resolution Mode: HI +[MakerNotes, Sigma, Camera] 5 - AF Mode: AF-S +[MakerNotes, Sigma, Camera] 6 - Focus Setting: AF +[MakerNotes, Sigma, Camera] 7 - White Balance: Auto +[MakerNotes, Sigma, Camera] 8 - Exposure Mode: Program AE +[MakerNotes, Sigma, Camera] 9 - Metering Mode: Multi-segment +[MakerNotes, Sigma, Camera] 10 - Lens Focal Range: 24.2 +[MakerNotes, Sigma, Camera] 11 - Color Space: sRGB +[MakerNotes, Sigma, Camera] 12 - Exposure Adjust: 0 +[MakerNotes, Sigma, Camera] 13 - Contrast: 0 +[MakerNotes, Sigma, Camera] 14 - Shadow: 0 +[MakerNotes, Sigma, Camera] 15 - Highlight: 0 +[MakerNotes, Sigma, Camera] 16 - Saturation: 0 +[MakerNotes, Sigma, Camera] 17 - Sharpness: 0 +[MakerNotes, Sigma, Camera] 18 - X3 Fill Light: 0 +[MakerNotes, Sigma, Camera] 20 - Color Adjustment: 0 0 0 +[MakerNotes, Sigma, Camera] 21 - Adjustment Mode: +[MakerNotes, Sigma, Camera] 22 - Quality: BASIC +[MakerNotes, Sigma, Camera] 23 - Firmware: 1.03.0.000 +[MakerNotes, Sigma, Camera] 24 - Software: +[MakerNotes, Sigma, Camera] 25 - Auto Bracket: +[MakerNotes, Sigma, Camera] 26 - Preview Image Start: 2708 +[MakerNotes, Sigma, Camera] 27 - Preview Image Length: 26 +[MakerNotes, Sigma, Camera] 28 - Preview Image Size: 640x480 +[MakerNotes, Sigma, Camera] 29 - Maker Note Version: 0100 +[MakerNotes, Sigma, Camera] 30 - Sigma 0x001e: 4 +[MakerNotes, Sigma, Camera] 31 - AF Point: Center +[MakerNotes, Sigma, Camera] 32 - Sigma 0x0020: +[MakerNotes, Sigma, Camera] 33 - Sigma 0x0021: +[MakerNotes, Sigma, Camera] 34 - File Format: X3F-S +[MakerNotes, Sigma, Camera] 35 - Sigma 0x0023: +[MakerNotes, Sigma, Camera] 36 - Calibration: C72_CalibrationSoft Version 1.00;RunID:C72Cal-001;Runtime:2009-05-29-14:15:38 +[MakerNotes, Sigma, Camera] 37 - Sigma 0x0025: 0.90 +[MakerNotes, Sigma, Camera] 38 - Sigma 0x0026: 0 +[MakerNotes, Sigma, Camera] 39 - Sigma 0x0027: 0 +[MakerNotes, Sigma, Camera] 40 - Sigma 0x0028: 0 +[MakerNotes, Sigma, Camera] 41 - Sigma 0x0029: 0 +[MakerNotes, Sigma, Camera] 42 - Sigma 0x002a: 0 +[MakerNotes, Sigma, Camera] 43 - Sigma 0x002b: 0 +[MakerNotes, Sigma, Camera] 44 - Color Mode: Standard +[MakerNotes, Sigma, Camera] 45 - Sigma 0x002d: 0 +[MakerNotes, Sigma, Camera] 46 - Sigma 0x002e: 0 +[MakerNotes, Sigma, Camera] 47 - Sigma 0x002f: 0 +[MakerNotes, Sigma, Camera] 48 - Lens Aperture Range: 2.8 to 14 +[MakerNotes, Sigma, Camera] 49 - F Number: 2.8 +[MakerNotes, Sigma, Camera] 50 - Exposure Time: 1/10 +[MakerNotes, Sigma, Camera] 51 - Exposure Time 2: 1/10 +[MakerNotes, Sigma, Camera] 52 - Burst Shot: 0 +[MakerNotes, Sigma, Camera] 53 - Exposure Compensation: 0 +[MakerNotes, Sigma, Camera] 54 - Sigma 0x0036: +[MakerNotes, Sigma, Camera] 55 - Sigma 0x0037: +[MakerNotes, Sigma, Camera] 56 - Sigma 0x0038: +[MakerNotes, Sigma, Camera] 57 - Sensor Temperature: 20 C +[MakerNotes, Sigma, Camera] 58 - Flash Exposure Comp: 0 +[MakerNotes, Sigma, Camera] 59 - Firmware: 1.03.0.000 +[MakerNotes, Sigma, Camera] 60 - White Balance: Auto +[MakerNotes, Sigma, Preview] Exif-PreviewImage - Preview Image: (Binary data 26 bytes) +[IPTC, IPTC, Other] 25 - Keywords: one, two +[IPTC, IPTC, Other] 0 - Application Record Version: 4 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-dc, Image] title - Title: A title +[Composite, Composite, Image] Exif-Aperture - Aperture: 2.8 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/10 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Unknown ( ) +[Composite, Composite, Image] Exif-LightValue - Light Value: 6.3 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.7 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.018 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 47.4 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 24.2 mm (35 mm equivalent: 41.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 11.79 m diff --git a/t/Sony.t b/t/Sony.t new file mode 100644 index 0000000..cae2c61 --- /dev/null +++ b/t/Sony.t @@ -0,0 +1,63 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Sony.t". + +BEGIN { + $| = 1; print "1..5\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Sony; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Sony'; +my $testnum = 1; + +# test 2: Extract information from Sony.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Sony.jpg',{Unknown=>1}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( + [FlashFired => 'true'], + [ISO => undef], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 4: Test Sony decryption +{ + ++$testnum; + my $data = pack('N', 0x34a290d3); + Image::ExifTool::Sony::Decrypt(\$data, 0, 4, 0x12345678); + my $expected = 0x20677968; + my $got = unpack('N', $data); + unless ($got == $expected) { + warn "\n Test $testnum (decryption) returned wrong value:\n"; + warn sprintf(" Expected 0x%x but got 0x%x\n", $expected, $got); + print 'not '; + } + print "ok $testnum\n"; +} + +# test 5: Extract information from a PMP image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Sony.pmp'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# end diff --git a/t/Sony_2.out b/t/Sony_2.out new file mode 100644 index 0000000..a1da5be --- /dev/null +++ b/t/Sony_2.out @@ -0,0 +1,86 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Sony.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 2.8 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:01:04 14:02:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:52-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: SONY +[EXIF, IFD0, Camera] 272 - Camera Model Name: DSC-F828 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:18 13:51:33 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/250 +[EXIF, ExifIFD, Image] 33437 - F Number: 7.1 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 64 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:12:18 13:51:33 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:12:18 13:51:33 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 8 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 12.5 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 3264 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 2448 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto bracket +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Camera] 271 - Make: SONY +[EXIF, IFD1, Camera] 272 - Camera Model Name: DSC-F828 +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Time] 306 - Modify Date: 2003:12:18 13:51:33 +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 2502 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Sony, Camera] 8192 - Sony 0x2000: 0 +[MakerNotes, Sony, Camera] 36865 - Sony 0x9001: ..­mQV„ûV„û.³9°9ŠJuÿ.Ŭ]è^Ž¸.[...] +[MakerNotes, Sony, Camera] 36866 - Sony 0x9002: .JÚ`.p.V!.!¾ê¾ê0ÿ0ÿV!ˆPp,×.0c[...] +[MakerNotes, Sony, Camera] 36867 - Sony 0x9003: .ÜsF®&.¡ÒB.¯.....È..ûÙ;›Õ.utN½½½½½½(¶^w’[...] +[MakerNotes, Sony, Camera] 36868 - Sony 0x9004: ..,.,.,.,.ô.ô.ô.ô.ô.ô.ô.ôlêoÄ@.o”.,‚.,Ï.o‰3úM[...] +[MakerNotes, Sony, Camera] 36869 - Sony 0x9005: ..@o........}[...] +[MakerNotes, Sony, Camera] 36870 - Sony 0x9006: .ð™ârï‘.{.•ân‡öGeG‘š‘`zâ[...] +[MakerNotes, Sony, Camera] 36871 - Sony 0x9007: .ç;.|.cçf.VØÌ£.üêbêØ.ßç¶^O[...] +[MakerNotes, Sony, Camera] 36872 - Sony 0x9008: ..ªø..¼·’.³ôi.Þ.Ð@÷.]:þïó•±ö;Žî;ä‚.ÕH[...] +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x00000001 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x00000000 +[Composite, Composite, Image] Exif-Aperture - Aperture: 7.1 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/250 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 12.5 mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 14.3 diff --git a/t/Sony_3.out b/t/Sony_3.out new file mode 100644 index 0000000..d3b76ce --- /dev/null +++ b/t/Sony_3.out @@ -0,0 +1,87 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Sony_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 5.6 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:52-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:52-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:52-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: SONY +[EXIF, IFD0, Camera] 272 - Camera Model Name: DSC-F828 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:18 13:51:33 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/250 +[EXIF, ExifIFD, Image] 33437 - F Number: 7.1 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:12:18 13:51:33 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:12:18 13:51:33 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 8 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 12.5 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 3264 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 2448 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto bracket +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Camera] 271 - Make: SONY +[EXIF, IFD1, Camera] 272 - Camera Model Name: DSC-F828 +[EXIF, IFD1, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Time] 306 - Modify Date: 2003:12:18 13:51:33 +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 2486 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Sony, Camera] 8192 - Sony 0x2000: 0 +[MakerNotes, Sony, Camera] 36865 - Sony 0x9001: ..­mQV„ûV„û.³9°9ŠJuÿ.Ŭ]è^Ž¸.[...] +[MakerNotes, Sony, Camera] 36866 - Sony 0x9002: .JÚ`.p.V!.!¾ê¾ê0ÿ0ÿV!ˆPp,×.0c[...] +[MakerNotes, Sony, Camera] 36867 - Sony 0x9003: .ÜsF®&.¡ÒB.¯.....È..ûÙ;›Õ.utN½½½½½½(¶^w’[...] +[MakerNotes, Sony, Camera] 36868 - Sony 0x9004: ..,.,.,.,.ô.ô.ô.ô.ô.ô.ô.ôlêoÄ@.o”.,‚.,Ï.o‰3úM[...] +[MakerNotes, Sony, Camera] 36869 - Sony 0x9005: ..@o........}[...] +[MakerNotes, Sony, Camera] 36870 - Sony 0x9006: .ð™ârï‘.{.•ân‡öGeG‘š‘`zâ[...] +[MakerNotes, Sony, Camera] 36871 - Sony 0x9007: .ç;.|.cçf.VØÌ£.üêbêØ.ßç¶^O[...] +[MakerNotes, Sony, Camera] 36872 - Sony 0x9008: ..ªø..¼·’.³ôi.Þ.Ð@÷.]:þïó•±ö;Žî;ä‚.ÕH[...] +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x00000001 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x00000000 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-exif, Camera] FlashFired - Flash Fired: True +[Composite, Composite, Image] Exif-Aperture - Aperture: 7.1 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/250 +[Composite, Composite, Camera] XMP-Flash - Flash: Fired +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 12.5 mm diff --git a/t/Sony_5.out b/t/Sony_5.out new file mode 100644 index 0000000..8cbe9d6 --- /dev/null +++ b/t/Sony_5.out @@ -0,0 +1,34 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[ExifTool, ExifTool, ExifTool] - Make: Sony +[ExifTool, ExifTool, ExifTool] - Model: DSC-F1 +[File, System, Other] FileName - File Name: Sony.pmp +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 375 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:04:13 18:42:12-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:21-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: PMP +[File, File, Other] FileTypeExtension - File Type Extension: pmp +[File, File, Other] MIMEType - MIME Type: image/x-sony-pmp +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[MakerNotes, Sony, Image] 8 - Jpg From Raw Start: 124 +[MakerNotes, Sony, Image] 12 - Jpg From Raw Length: 251 +[MakerNotes, Sony, Image] 22 - Sony Image Width: 640 +[MakerNotes, Sony, Image] 24 - Sony Image Height: 480 +[MakerNotes, Sony, Image] 27 - Orientation: Horizontal (normal) +[MakerNotes, Sony, Image] 29 - Image Quality: Standard +[MakerNotes, Sony, Image] 52 - Comment: +[MakerNotes, Sony, Time] 76 - Date/Time Original: 1998:09:01 20:19:57 +[MakerNotes, Sony, Time] 84 - Modify Date: 1998:09:01 20:19:57 +[MakerNotes, Sony, Image] 102 - Exposure Time: 1/100 +[MakerNotes, Sony, Camera] 118 - Flash: No Flash +[MakerNotes, Sony, Preview] Exif-JpgFromRaw - Jpg From Raw: (Binary data 251 bytes) +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/100 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/TestLib.pm b/t/TestLib.pm new file mode 100644 index 0000000..e2a0c34 --- /dev/null +++ b/t/TestLib.pm @@ -0,0 +1,453 @@ +#------------------------------------------------------------------------------ +# File: TestLib.pm +# +# Description: Utility routines for testing ExifTool modules +# +# Revisions: Feb. 19/04 - P. Harvey Created +# Feb. 26/04 - P. Harvey Name temporary file ".failed" and erase +# it if the test passes +# Feb. 27/04 - P. Harvey Change print format and allow ExifTool +# object to be passed instead of tags hash ref. +# Oct. 30/04 - P. Harvey Split testCompare() into separate sub. +# May 18/05 - P. Harvey Tolerate round-off errors in floats. +# Feb. 02/08 - P. Harvey Allow different timezones in time values +# Sep. 16/08 - P. Harvey Improve timezone testing +# Jul. 14/10 - P. Harvey Added writeInfo() +# Jan. 06/12 - P. Harvey Patched MirBSD leap second "feature" +# Jun. 08/21 - PH Patched float compare to fix quadmath test failure +#------------------------------------------------------------------------------ + +package t::TestLib; + +use strict; +require 5.002; +require Exporter; +use Image::ExifTool qw(ImageInfo); + +use vars qw($VERSION @ISA @EXPORT); +$VERSION = '1.23'; +@ISA = qw(Exporter); +@EXPORT = qw(check writeCheck writeInfo testCompare binaryCompare testVerbose); + +my $noTimeLocal; + +sub nearEnough($$); +sub nearTime($$$$); +sub formatValue($); +sub writeInfo($$;$$$); + +#------------------------------------------------------------------------------ +# Compare 2 binary files +# Inputs: 0) file name 1, 1) file name 2 +# Returns: 1 if files are identical +sub binaryCompare($$) +{ + my ($file1, $file2) = @_; + my $success = 1; + open(TESTFILE1, $file1) or return 0; + unless (open(TESTFILE2, $file2)) { + close(TESTFILE1); + return 0; + } + binmode(TESTFILE1); + binmode(TESTFILE2); + my ($buf1, $buf2); + while (read(TESTFILE1, $buf1, 65536)) { + read(TESTFILE2, $buf2, 65536) or $success = 0, last; + $buf1 eq $buf2 or $success = 0, last; + } + read(TESTFILE2, $buf2, 65536) and $success = 0; + close(TESTFILE1); + close(TESTFILE2); + return $success +} + +#------------------------------------------------------------------------------ +# Compare 2 files and return true and erase the 2nd file if they are the same +# Inputs: 0) file1, 1) file2, 2) test number, 3) flag to not erase test file +# Returns: true if files are the same +sub testCompare($$$;$) +{ + my ($stdfile, $testfile, $testnum, $keep) = @_; + my $success = 0; + my $linenum; + + my $oldSep = $/; + $/ = "\x0a"; # set input line separator + if (open(FILE1, $stdfile)) { + if (open(FILE2, $testfile)) { + $success = 1; + my ($line1, $line2); + my $linenum = 0; + my $skip = 0; + for (;;) { + $line1 = <FILE1> unless $skip == 1; + last unless defined $line1; + ++$linenum; + $line2 = <FILE2> unless $skip == 2; + $skip = 0; + if (defined $line2) { + next if $line1 eq $line2; + next if nearEnough($line1, $line2); + # ignore IPTCDigest warning if Digest::MD5 isn't available + if ($line1 =~ /Warning: IPTCDigest is not current/ and + not eval 'require Digest::MD5') + { + $skip = 2; + next; + } elsif ($line2 =~ /Warning: IPTCDigest is not current/ and + not eval 'require Digest::MD5') + { + $skip = 1; + next; + } + } + $success = 0; + last; + } + if ($success) { + # make sure there is nothing left in file2 + $line2 = <FILE2>; + if ($line2) { + ++$linenum; + $success = 0; + } + } + unless ($success) { + warn "\n Test $testnum differs beginning at line $linenum:\n"; + defined $line1 or $line1 = '(null)'; + defined $line2 or $line2 = '(null)'; + chomp($line1,$line2); + warn qq{ Test gave: "$line2"\n}; + warn qq{ Should be: "$line1"\n}; + } + close(FILE2); + } + close(FILE1); + } + $/ = $oldSep; # restore input line separator + + # erase .failed file if test was successful + $success and not $keep and unlink $testfile; + + return $success +} + +#------------------------------------------------------------------------------ +# Return true if two test lines are close enough +# Inputs: 0) line1, 1) line2 +# Returns: true if lines are similar enough to pass test +sub nearEnough($$) +{ + my ($line1, $line2) = @_; + + # of course, the version number will change... + return 1 if $line1 =~ /^(.*ExifTool.*)\b\d{1,2}\.\d{2}\b(.*)/s and + ($line2 eq "$1$Image::ExifTool::VERSION$Image::ExifTool::RELEASE$2" or + $line2 eq "$1$Image::ExifTool::VERSION$2"); + + # allow different FileModifyDate, FileAccessDate, FileCreateDate/FileInodeChangeDate and FilePermissions + return 1 if $line1 =~ /(File\s?(Modif.*Date|Access\s?Date|Inode\s?Change\s?Date|Permissions))/ and + ($line2 =~ /$1/ or $line2 =~ /File\s?Creat.*Date/); + + # allow CurrentIPTCDigest to be zero if Digest::MD5 isn't installed + return 1 if $line1 =~ /Current IPTC Digest/ and + $line2 =~ /Current IPTC Digest: (0|#){32}/ and + not eval 'require Digest::MD5'; + + # analyze every token in the line, and allow rounding + # or format differences in floating point numbers + my @toks1 = split /\s+/, $line1; + my @toks2 = split /\s+/, $line2; + my $lenChanged = 0; + my $i; + for ($i=0; ; ++$i) { + return 1 if $i >= @toks1 and $i >= @toks2; # all tokens were OK + my $tok1 = $toks1[$i]; + my $tok2 = $toks2[$i]; + last unless defined $tok1 and defined $tok2; + next if $tok1 eq $tok2; + # can't compare any more if either line was truncated (ie. ends with '[...]' or '[snip]') + if ($tok1 =~ /\[(\.{3}|snip)\]$/ or $tok2 =~ /\[(\.{3}|snip)\]$/) { + return 1 if $tok1=~ /^[-+]?\d+\./ or $tok2=~/^[-+]?\d+\./; # check for float + return $lenChanged + } + if ($tok1 =~ /^(\d{2}|\d{4}):\d{2}:\d{2}/ and $tok2 =~ /^(\d{2}|\d{4}):\d{2}:\d{2}/ and + not eval { require Time::Local }) + { + unless ($noTimeLocal) { + warn "Ignored time difference(s) because Time::Local is not installed\n"; + $noTimeLocal = 1; + } + next; # ignore times if Time::Local not available + # account for different timezones + } elsif ($tok1 =~ /^(\d{2}:\d{2}:\d{2})(Z|[-+]\d{2}:\d{2})$/i) { + my $time = $1; # remove timezone + # timezone may be wrong if writing date/time value in a different timezone + next if $tok2 =~ /^(\d{2}:\d{2}:\d{2})(Z|[-+]\d{2}:\d{2})$/i and $time eq $1; + # date/time may be wrong to if converting GMT value to local time + last unless $i and $toks1[$i-1] =~ /^\d{4}:\d{2}:\d{2}$/ and + $toks2[$i-1] =~ /^\d{4}:\d{2}:\d{2}$/; + $tok1 = $toks1[$i-1] . ' ' . $tok1; # add date to give date/time value + $tok2 = $toks2[$i-1] . ' ' . $tok2; + last unless nearTime($tok1, $tok2, $line1, $line2); + # date may be different if timezone shifted into next day + } elsif ($tok1 =~ /^\d{4}:\d{2}:\d{2}$/ and $tok2 =~ /^\d{4}:\d{2}:\d{2}$/ and + defined $toks1[$i+1] and defined $toks2[$i+1] and + $toks1[$i+1] =~ /^(\d{2}:\d{2}:\d{2})(Z|[-+]\d{2}:\d{2})$/i and + $toks2[$i+1] =~ /^(\d{2}:\d{2}:\d{2})(Z|[-+]\d{2}:\d{2})$/i) + { + ++$i; + $tok1 .= ' ' . $toks1[$i]; # add time to give date/time value + $tok2 .= ' ' . $toks2[$i]; + last unless nearTime($tok1, $tok2, $line1, $line2); + # handle floating point numbers filtered by ExifTool test 29 + } elsif ($tok1 =~ s/(\.#)#*(e[-+]\#+)?/$1/g or $tok2 =~ s/(\.#)#*(e[-+]\#+)?/$1/g) { + $tok2 =~ s/(\.#)#*(e[-+]\#+)?/$1/g; + last if $tok1 ne $tok2; + } else { + # check to see if both tokens are floating point numbers (with decimal points!) + if ($tok1 =~ s/([^\d.]+)$//) { # remove trailing units + my $a = $1; + last unless $tok2 =~ s/\Q$a\E$//; + } + if ($tok1 =~ s/^(\d+:\d+:)//) { # remove leading HH:MM: + my $a = $1; + last unless $tok2 =~ s/^\Q$a//; + } + if ($tok1 =~ s/^'//) { # remove leading quote + last unless $tok2 =~ s/^'//; + } + last unless Image::ExifTool::IsFloat($tok1) and + Image::ExifTool::IsFloat($tok2); + last if $tok1 == 0 or $tok2 == 0; + # numbers are bad if not the same to 5 significant figures + if (abs(($tok1-$tok2)/($tok1+$tok2)) > 1e-5) { + # (but allow last digit to be different due to round-off errors) + my ($int1, $int2); + ($int1 = $tok1) =~ tr/0-9//dc; + ($int2 = $tok2) =~ tr/0-9//dc; + my $dlen = length($int1) - length($int2); + if ($dlen > 0) { + $int2 .= '0' x $dlen; + } elsif ($dlen < 0) { + $int1 .= '0' x (-$dlen); + } + last if abs($int1-$int2) > 1.00001; + } + } + # set flag if length changed + $lenChanged = 1 if length($tok1) ne length($tok2); + } + return 0; +} + +#------------------------------------------------------------------------------ +# Check two time strings to see if they are the same +# Inputs: 0) time1, 1) time2, 2) line1, 3) line2 +# Returns: true on success +sub nearTime($$$$) +{ + my ($tok1, $tok2, $line1, $line2) = @_; + my $t1 = Image::ExifTool::GetUnixTime($tok1, 'local') or return 0; + my $t2 = Image::ExifTool::GetUnixTime($tok2, 'local') or return 0; + my $td = $t2 - $t1; + if ($td) { + # patch for the MirBSD leap-second unconformity + # (120 leap seconds should cover us until _well_ into the future) + return 0 unless $^O eq 'mirbsd' and $td < 0 and $td > -120; + warn "\n Ignoring $td second error due to MirBSD leap-second \"feature\":\n"; + chomp($line1,$line2); + warn qq{ Test gave: "$line2"\n}; + warn qq{ Should be: "$line1"\n}; + } + return 1; +} + +#------------------------------------------------------------------------------ +# Format value for printing +# Inputs: 0) value +# Returns: string for printing +sub formatValue($) +{ + local $_; + my $val = shift; + my ($str, @a); + if (ref $val eq 'SCALAR') { + if ($$val =~ /^Binary data/) { + $str = "($$val)"; + } else { + $str = '(Binary data ' . length($$val) . ' bytes)'; + } + } elsif (ref $val eq 'ARRAY') { + foreach (@$val) { + push @a, formatValue($_); + } + $str = '[' . join(',', @a) . ']'; + } elsif (ref $val eq 'HASH') { + my $key; + foreach $key (sort keys %$val) { + push @a, $key . '=' . formatValue($$val{$key}); + } + $str = '{' . join(',', @a) . '}'; + } elsif (defined $val) { + # make sure there are no linefeeds in output + ($str = $val) =~ tr/\x0a\x0d/;/; + # translate unknown characters + # $str =~ tr/\x01-\x1f\x80-\xff/\./; + $str =~ tr/\x01-\x1f\x7f/./; + # remove NULL chars + $str =~ s/\x00//g; + } else { + $str = ''; + } + return $str; +} + +#------------------------------------------------------------------------------ +# Compare extracted information against a standard output file +# Inputs: 0) [optional] ExifTool object reference +# 1) tag hash reference, 2) test name, 3) test number +# 4) test number for comparison file (if different than this test) +# 5) top group number to test (2 by default) +# Returns: 1 if check passed +sub check($$$;$$$) +{ + my $exifTool = shift if ref $_[0] ne 'HASH'; + my ($info, $testname, $testnum, $stdnum, $topGroup) = @_; + return 0 unless $info; + $stdnum = $testnum unless defined $stdnum; + my $testfile = "t/${testname}_$testnum.failed"; + my $stdfile = "t/${testname}_$stdnum.out"; + open(FILE, ">$testfile") or return 0; + + # use one type of linefeed so this test works across platforms + my $oldSep = $\; + $\ = "\x0a"; # set output line separator + + # get a list of found tags + my @tags; + if ($exifTool) { + if ($$exifTool{NO_SORT}) { + @tags = $exifTool->GetFoundTags(); + } else { + # sort tags by group to make it a bit prettier + @tags = $exifTool->GetTagList($info, 'Group0'); + } + } else { + @tags = sort keys %$info; + } +# +# Write information to file (with filename "TESTNAME_#.failed") +# + foreach (@tags) { + my $val = formatValue($$info{$_}); + # (no "\n" needed since we set the output line separator above) + if ($exifTool) { + my @groups = $exifTool->GetGroup($_); + my $groups = join ', ', @groups[0..($topGroup||2)]; + my $tagID = $exifTool->GetTagID($_); + my $desc = $exifTool->GetDescription($_); + print FILE "[$groups] $tagID - $desc: $val"; + } else { + print FILE "$_: $val"; + } + } + close(FILE); + + $\ = $oldSep; # restore output line separator +# +# Compare the output file to the output from the standard test (TESTNAME_#.out) +# + return testCompare($stdfile, $testfile, $testnum); +} + +#------------------------------------------------------------------------------ +# Test writing feature by writing specified information to JPEG file +# Inputs: 0) list reference to lists of SetNewValue arguments +# 1) test name, 2) test number, 3) optional source file name, +# 4) true to only check tags which were written (or list ref for tags to check) +# 5) flag set if nothing is expected to change in the output file +# 6) true to ignore warnings +# Returns: 1 if check passed +sub writeCheck($$$;$$$$) +{ + my ($writeInfo, $testname, $testnum, $srcfile, $onlyWritten, $same, $ignore) = @_; + $srcfile or $srcfile = "t/images/$testname.jpg"; + my ($ext) = ($srcfile =~ /\.(.+?)$/); + my $testfile = "t/${testname}_${testnum}_failed.$ext"; + my $exifTool = new Image::ExifTool; + my @tags; + if (ref $onlyWritten eq 'ARRAY') { + @tags = @$onlyWritten; + undef $onlyWritten; + } + foreach (@$writeInfo) { + $exifTool->SetNewValue(@$_); + push @tags, $$_[0] if $onlyWritten; + } + unlink $testfile; + my $ok = writeInfo($exifTool, $srcfile, $testfile, $same, $ignore); + my $info = $exifTool->ImageInfo($testfile,{Duplicates=>1,Unknown=>1},@tags); + my $rtnVal = check($exifTool, $info, $testname, $testnum); + return 0 unless $ok and $rtnVal; + unlink $testfile; + return 1; +} + +#------------------------------------------------------------------------------ +# Call Image::ExifTool::WriteInfo with error checking +# Inputs: 0) ExifTool ref, 1) src file, 2) dst file, 3) true if nothing should change +# 4) true to ignore warnings +# Return: true on success +sub writeInfo($$;$$$) +{ + my ($exifTool, $src, $dst, $same, $ignore) = @_; + # erase temporary file created by WriteInfo() if no destination file is given + # (may be left over from previous crashed tests) + unlink "${src}_exiftool_tmp" if not defined $dst and not ref $src; + my $result = $exifTool->WriteInfo($src, $dst); + my $err = ''; + $err .= " Error: WriteInfo() returned $result\n" if $result != ($same ? 2 : 1); + my $info = $exifTool->GetInfo('Warning', 'Error'); + foreach (sort keys %$info) { + next if $ignore and $_ =~ /^Warning/; + my $tag = Image::ExifTool::GetTagName($_); + $err .= " $tag: $$info{$_}\n"; + } + return 1 unless $err; + warn "\n$err"; + return 0; +} + +#------------------------------------------------------------------------------ +# Test verbose output +# Inputs: 0) test name, 1) test number, 2) Input file, 3) verbose level +# Returns: true if test passed +sub testVerbose($$$$) +{ + my ($testname, $testnum, $infile, $verbose) = @_; + my $testfile = "t/${testname}_$testnum"; + # capture verbose output by redirecting STDOUT + return 0 unless open(TMPFILE,">$testfile.tmp"); + ImageInfo($infile, { Verbose => $verbose, TextOut => \*TMPFILE }); + close(TMPFILE); + # re-write output file to change newlines to be same as standard test file + # (if I was a Perl guru, maybe I would know a better way to do this) + open(TMPFILE,"$testfile.tmp"); + open(TESTFILE,">$testfile.failed"); + my $oldSep = $\; + $\ = "\x0a"; # set output line separator + while (<TMPFILE>) { + chomp; # remove existing newline + print TESTFILE $_; # re-write line using \x0a for newlines + } + $\ = $oldSep; # restore output line separator + close(TESTFILE); + close(TMPFILE); + unlink("$testfile.tmp"); + return testCompare("$testfile.out","$testfile.failed",$testnum); +} + + +1; #end diff --git a/t/Text.t b/t/Text.t new file mode 100644 index 0000000..370c460 --- /dev/null +++ b/t/Text.t @@ -0,0 +1,32 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Text.t". + +BEGIN { + $| = 1; print "1..7\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Text; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Text'; +my $testnum = 1; + +# tests 2-7: Test various types of text files +{ + my $exifTool = new Image::ExifTool; + my $i; + for (my $i=1; $i<=6; ++$i) { + ++$testnum; + my $fname = 't/images/' . ($i < 6 ? "Text$i.txt" : 'Text.csv'); + my $info = $exifTool->ImageInfo($fname, '-system:all'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + } +} + +# end diff --git a/t/Text_2.out b/t/Text_2.out new file mode 100644 index 0000000..4f749d3 --- /dev/null +++ b/t/Text_2.out @@ -0,0 +1,8 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, File, Other] FileType - File Type: TXT +[File, File, Other] FileTypeExtension - File Type Extension: txt +[File, File, Other] MIMEType - MIME Type: text/plain +[File, File, Other] MIMEEncoding - MIME Encoding: us-ascii +[File, File, Document] Newlines - Newlines: Unix LF +[File, File, Document] LineCount - Line Count: 1 +[File, File, Document] WordCount - Word Count: 4 diff --git a/t/Text_3.out b/t/Text_3.out new file mode 100644 index 0000000..0570fb2 --- /dev/null +++ b/t/Text_3.out @@ -0,0 +1,8 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, File, Other] FileType - File Type: TXT +[File, File, Other] FileTypeExtension - File Type Extension: txt +[File, File, Other] MIMEType - MIME Type: text/plain +[File, File, Other] MIMEEncoding - MIME Encoding: iso-8859-1 +[File, File, Document] Newlines - Newlines: Windows CRLF +[File, File, Document] LineCount - Line Count: 1 +[File, File, Document] WordCount - Word Count: 4 diff --git a/t/Text_4.out b/t/Text_4.out new file mode 100644 index 0000000..d15d22e --- /dev/null +++ b/t/Text_4.out @@ -0,0 +1,9 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, File, Other] FileType - File Type: TXT +[File, File, Other] FileTypeExtension - File Type Extension: txt +[File, File, Other] MIMEType - MIME Type: text/plain +[File, File, Other] MIMEEncoding - MIME Encoding: utf-8 +[File, File, Document] ByteOrderMark - Byte Order Mark: Yes +[File, File, Document] Newlines - Newlines: Unix LF +[File, File, Document] LineCount - Line Count: 1 +[File, File, Document] WordCount - Word Count: 4 diff --git a/t/Text_5.out b/t/Text_5.out new file mode 100644 index 0000000..37a579f --- /dev/null +++ b/t/Text_5.out @@ -0,0 +1,8 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, File, Other] FileType - File Type: TXT +[File, File, Other] FileTypeExtension - File Type Extension: txt +[File, File, Other] MIMEType - MIME Type: text/plain +[File, File, Other] MIMEEncoding - MIME Encoding: unknown-8bit +[File, File, Document] Newlines - Newlines: Macintosh CR +[File, File, Document] LineCount - Line Count: 1 +[File, File, Document] WordCount - Word Count: 4 diff --git a/t/Text_6.out b/t/Text_6.out new file mode 100644 index 0000000..bf427e7 --- /dev/null +++ b/t/Text_6.out @@ -0,0 +1,7 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, File, Other] FileType - File Type: TXT +[File, File, Other] FileTypeExtension - File Type Extension: txt +[File, File, Other] MIMEType - MIME Type: text/plain +[File, File, Other] MIMEEncoding - MIME Encoding: utf-16be +[File, File, Document] ByteOrderMark - Byte Order Mark: Yes +[File, File, Document] Newlines - Newlines: Unix LF diff --git a/t/Text_7.out b/t/Text_7.out new file mode 100644 index 0000000..cee5e4a --- /dev/null +++ b/t/Text_7.out @@ -0,0 +1,10 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.88 +[File, File, Other] FileType - File Type: CSV +[File, File, Other] FileTypeExtension - File Type Extension: csv +[File, File, Other] MIMEType - MIME Type: text/csv +[File, File, Other] MIMEEncoding - MIME Encoding: us-ascii +[File, File, Document] Newlines - Newlines: Unix LF +[File, File, Document] Delimiter - Delimiter: Comma +[File, File, Document] Quoting - Quoting: (none) +[File, File, Document] ColumnCount - Column Count: 6 +[File, File, Document] RowCount - Row Count: 3 diff --git a/t/Torrent.t b/t/Torrent.t new file mode 100644 index 0000000..38dda61 --- /dev/null +++ b/t/Torrent.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Torrent.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Torrent; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Torrent'; +my $testnum = 1; + +# test 2: Extract information from a BitTorrent file +{ + my $exifTool = new Image::ExifTool; + ++$testnum; + my $info = $exifTool->ImageInfo('t/images/Torrent.torrent'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Torrent_2.out b/t/Torrent_2.out new file mode 100644 index 0000000..0205df6 --- /dev/null +++ b/t/Torrent_2.out @@ -0,0 +1,32 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Torrent.torrent +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 837 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2013:09:06 11:36:26-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:52-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: Torrent +[File, File, Other] FileTypeExtension - File Type Extension: torrent +[File, File, Other] MIMEType - MIME Type: application/x-bittorrent +[Torrent, Torrent, Document] announce - Announce: udp://tracker.bogus.com:80/announce +[Torrent, Torrent, Document] announce-list1 - Announce List 1: udp://tracker.bogus.com:80/announce +[Torrent, Torrent, Document] announce-list2 - Announce List 2: udp://tracker.bogus2.com:80/announce +[Torrent, Torrent, Document] announce-list3 - Announce List 3: udp://tracker.bogus3.com:80/announce +[Torrent, Torrent, Document] comment - Comment: Test BitTorrent description file +[Torrent, Torrent, Document] created by - Creator: uTorrent/1840 +[Torrent, Torrent, Time] creation date - Create Date: 2013:09:06 11:33:59-04:00 +[Torrent, Torrent, Document] encoding - Encoding: UTF-8 +[Torrent, Torrent, Document] length1 - File 1 Length: 3.7 MB +[Torrent, Torrent, Document] path1 - File 1 Path: exiftool-9.35.zip +[Torrent, Torrent, Document] length2 - File 2 Length: 3.7 MB +[Torrent, Torrent, Document] path2 - File 2 Path: Image-ExifTool-9.35.tar.gz +[Torrent, Torrent, Document] length3 - File 3 Length: 2.4 MB +[Torrent, Torrent, Document] path3 - File 3 Path: ExifTool-9.35.dmg +[Torrent, Torrent, Document] length4 - File 4 Length: 11 kB +[Torrent, Torrent, Document] path4 - File 4 Path: docs/README +[Torrent, Torrent, Document] name - Name: Image-ExifTool-9.35 +[Torrent, Torrent, Document] piece length - Piece Length: 1048576 +[Torrent, Torrent, Document] pieces - Pieces: (Binary data 200 bytes) +[Torrent, Torrent, Document] url-list1 - URL List 1: http://seed.bogus.com/ +[Torrent, Torrent, Document] url-list2 - URL List 2: http://seed.bogus2.com/ diff --git a/t/Unknown.t b/t/Unknown.t new file mode 100644 index 0000000..38935da --- /dev/null +++ b/t/Unknown.t @@ -0,0 +1,37 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Unknown.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Unknown; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Unknown'; +my $testnum = 1; + +# test 2: Extract information from Unknown.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Unknown.jpg', {Unknown => 1}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Write some new information +{ + ++$testnum; + my @writeInfo = ( ['FocalLength',200] ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Unknown_2.out b/t/Unknown_2.out new file mode 100644 index 0000000..533e6b7 --- /dev/null +++ b/t/Unknown_2.out @@ -0,0 +1,92 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Unknown.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 7.2 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:06:16 10:57:05-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:53-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: Rollei +[EXIF, IFD0, Camera] 272 - Camera Model Name: dk4010 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: RO-dk4010 Ver 1.00 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:08:10 06:24:38 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/180 +[EXIF, ExifIFD, Image] 33437 - F Number: 2.8 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 125 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2005:08:10 06:24:38 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2005:08:10 06:24:38 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 4 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/208 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.1 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 57.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Time] 37520 - Sub Sec Time: 331 +[EXIF, ExifIFD, Time] 37521 - Sub Sec Time Original: 331 +[EXIF, ExifIFD, Time] 37522 - Sub Sec Time Digitized: 331 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2272 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1704 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 1.3 +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: Low gain up +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 6922 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, MakerUnknown, Camera] 1 - Unknown 0x0001: ADM0000037036 +[MakerNotes, MakerUnknown, Camera] 4 - Unknown 0x0004: AE.. ^;k...MULTIoo/..................;[...] +[MakerNotes, MakerUnknown, Camera] 6 - Unknown 0x0006: AFÿÿ...Û.ÿÿgò.rá.ýHî;ŸÍ.~4.". †.ˆ.Û.Û.Û.÷[...] +[MakerNotes, MakerUnknown, Camera] 8 - Unknown 0x0008: WB.|ãÿÿÿ<.dCÿÿÿÄ.­..„.(.„.;n[...] +[MakerNotes, MakerUnknown, Camera] 10 - Unknown 0x000a: ..;..SDSD512€...[...] +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[PrintIM, PrintIM, Printing] 1 - Print IM 0x0001: 0x00160016 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x00000001 +[PrintIM, PrintIM, Printing] 256 - Print IM 0x0100: 0x00000005 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x000000ff +[PrintIM, PrintIM, Printing] 258 - Print IM 0x0102: 0x00000083 +[PrintIM, PrintIM, Printing] 261 - Print IM 0x0105: 0x00000083 +[PrintIM, PrintIM, Printing] 262 - Print IM 0x0106: 0x00000083 +[Composite, Composite, Image] Exif-Aperture - Aperture: 2.8 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/180 +[Composite, Composite, Time] Exif-SubSecCreateDate - Create Date: 2005:08:10 06:24:38.331 +[Composite, Composite, Time] Exif-SubSecDateTimeOriginal - Date/Time Original: 2005:08:10 06:24:38.331 +[Composite, Composite, Time] Exif-SubSecModifyDate - Modify Date: 2005:08:10 06:24:38.331 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 57.0 mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 10.1 diff --git a/t/Unknown_3.out b/t/Unknown_3.out new file mode 100644 index 0000000..a8188f3 --- /dev/null +++ b/t/Unknown_3.out @@ -0,0 +1,92 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Unknown_3_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 7.2 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:53-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:53-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:53-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: Rollei +[EXIF, IFD0, Camera] 272 - Camera Model Name: dk4010 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: RO-dk4010 Ver 1.00 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:08:10 06:24:38 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/180 +[EXIF, ExifIFD, Image] 33437 - F Number: 2.8 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 125 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2005:08:10 06:24:38 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2005:08:10 06:24:38 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 4 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/208 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.1 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 200.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Time] 37520 - Sub Sec Time: 331 +[EXIF, ExifIFD, Time] 37521 - Sub Sec Time Original: 331 +[EXIF, ExifIFD, Time] 37522 - Sub Sec Time Digitized: 331 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 2272 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 1704 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 1.3 +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41991 - Gain Control: Low gain up +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 6922 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, MakerUnknown, Camera] 1 - Unknown 0x0001: ADM0000037036 +[MakerNotes, MakerUnknown, Camera] 4 - Unknown 0x0004: AE.. ^;k...MULTIoo/..................;[...] +[MakerNotes, MakerUnknown, Camera] 6 - Unknown 0x0006: AFÿÿ...Û.ÿÿgò.rá.ýHî;ŸÍ.~4.". †.ˆ.Û.Û.Û.÷[...] +[MakerNotes, MakerUnknown, Camera] 8 - Unknown 0x0008: WB.|ãÿÿÿ<.dCÿÿÿÄ.­..„.(.„.;n[...] +[MakerNotes, MakerUnknown, Camera] 10 - Unknown 0x000a: ..;..SDSD512€...[...] +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[PrintIM, PrintIM, Printing] 1 - Print IM 0x0001: 0x00160016 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x00000001 +[PrintIM, PrintIM, Printing] 256 - Print IM 0x0100: 0x00000005 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x000000ff +[PrintIM, PrintIM, Printing] 258 - Print IM 0x0102: 0x00000083 +[PrintIM, PrintIM, Printing] 261 - Print IM 0x0105: 0x00000083 +[PrintIM, PrintIM, Printing] 262 - Print IM 0x0106: 0x00000083 +[Composite, Composite, Image] Exif-Aperture - Aperture: 2.8 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/180 +[Composite, Composite, Time] Exif-SubSecCreateDate - Create Date: 2005:08:10 06:24:38.331 +[Composite, Composite, Time] Exif-SubSecDateTimeOriginal - Date/Time Original: 2005:08:10 06:24:38.331 +[Composite, Composite, Time] Exif-SubSecModifyDate - Modify Date: 2005:08:10 06:24:38.331 +[Composite, Composite, Image] Exif-LightValue - Light Value: 10.1 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 200.0 mm diff --git a/t/VCard.t b/t/VCard.t new file mode 100644 index 0000000..ece595b --- /dev/null +++ b/t/VCard.t @@ -0,0 +1,32 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/VCard.t". + +BEGIN { + $| = 1; print "1..3\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::VCard; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'VCard'; +my $testnum = 1; + +# tests 2-3: Extract information from test files +{ + my $exifTool = new Image::ExifTool; + my $ext; + foreach $ext (qw(vcf ics)) { + ++$testnum; + my $info = $exifTool->ImageInfo("t/images/VCard.$ext"); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + } +} + + +# end diff --git a/t/VCard_2.out b/t/VCard_2.out new file mode 100644 index 0000000..dfca1f8 --- /dev/null +++ b/t/VCard_2.out @@ -0,0 +1,54 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.78 +[File, System, Other] FileName - File Name: VCard.vcf +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1691 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:12:04 11:06:35-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:12:04 11:06:39-05:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:12:04 11:06:35-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: VCard +[File, File, Other] FileTypeExtension - File Type Extension: vcf +[File, File, Other] MIMEType - MIME Type: text/vcard +[VCard, VCard, Document] Version - VCard Version: 3.0 +[VCard, VCard, Document] Prodid - Software: -//Apple Inc.//Mac OS X 10.10.2//EN +[VCard, VCard, Author] N - Name: Harvey;Phil;;; +[VCard, VCard, Author] Fn - Formatted Name: Phil Harvey +[VCard, VCard, Document] Org - Organization: ExifTool; +[VCard, VCard, Document] EmailInternetHomePref - Email Internet Home Pref: someone@home.email +[VCard, VCard, Document] EmailInternetWork - Email Internet Work: someone@work.email +[VCard, Item1, Document] EmailInternet - Email Internet: someone@other.email +[VCard, Item1, Document] X-ablabel - AB Label: Other +[VCard, VCard, Document] TelCellVoicePref - Telephone Cell Voice Pref: 555-0000 +[VCard, VCard, Document] TelIphoneCellVoice - Telephone Iphone Cell Voice: 555-1111 +[VCard, VCard, Document] TelHomeVoice - Telephone Home Voice: 555-2222 +[VCard, VCard, Document] TelWorkVoice - Telephone Work Voice: 555-3333 +[VCard, VCard, Document] TelMain - Telephone Main: 555-4444 +[VCard, VCard, Document] TelWorkFax - Telephone Work Fax: 555-5555 +[VCard, VCard, Document] TelPager - Telephone Pager: 555-6666 +[VCard, VCard, Document] TelOtherVoice - Telephone Other Voice: 555-7777 +[VCard, VCard, Document] TelOtherVoice - Telephone Other Voice: 555-8888 +[VCard, VCard, Location] AdrHomePref - Address Home Pref: ;;Home St.;City;ON;K0K0K0;Canada +[VCard, VCard, Location] AdrWork - Address Work: ;;Work St.;City;ON;K0K0K0;Canada +[VCard, VCard, Location] AdrOther - Address Other: ;;Other Rd.;City;ON;K0K0K0;Canada +[VCard, VCard, Location] AdrOtherGeo - Address Other Geolocation: 12.3457, 78.910 +[VCard, VCard, Document] AdrOtherLabel - Address Other Label: Test;Label +[VCard, VCard, Document] Note - Note: This is "a", comma, \backslash;newline;note! +[VCard, VCard, Document] Note-fr - Note (fr): Oui! +[VCard, Item2, Document] UrlPref - URL Pref: https://exiftool.org/ +[VCard, Item2, Document] X-ablabel - AB Label: HomePage +[VCard, VCard, Time] Bday - Birthday: 1900:01:02 +[VCard, VCard, Document] X-aimHomePref - AIM Home Pref: AIMName +[VCard, Item3, Document] X-icqPref - ICQ Pref: ICQName +[VCard, Item3, Document] X-ablabel - AB Label: Other +[VCard, VCard, Document] ImppHomePref - IMPP Home Pref: aim:AIMName +[VCard, VCard, Document] ImppWork - IMPP Work: xmpp:FacebookName +[VCard, Item4, Document] Impp - IMPP: aim:ICQName +[VCard, Item4, Document] X-ablabel - AB Label: Other +[VCard, VCard, Preview] PhotoJpeg - Photo Jpeg: (Binary data 18 bytes) +[VCard, VCard, Document] X-abuid - AB UID: EBAC8BE8-E695-457F-AE4D-E076ECEEA002:ABPerson +[VCard, VCard, Document] Version - VCard Version: 3.0 +[VCard, VCard, Author] Fn - Formatted Name: VCard Test +[VCard, VCard, Document] LabelWork - Label Work: 12 Cucumber St.;;SaladVille ON;;Canada +[VCard, VCard, Document] LogoImageJpeg - Logo Image Jpeg: (Binary data 18 bytes) +[VCard, VCard, Document] SoundOgg - Sound Ogg: http://example.com/sound.ogg +[VCard, VCard, Document] Note - Note: This sample mixes formats from various vCard versions diff --git a/t/VCard_3.out b/t/VCard_3.out new file mode 100644 index 0000000..40ab18a --- /dev/null +++ b/t/VCard_3.out @@ -0,0 +1,88 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: VCard.ics +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 2.3 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2015:05:03 12:36:08-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:53-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: ICS +[File, File, Other] FileTypeExtension - File Type Extension: ics +[File, File, Other] MIMEType - MIME Type: text/calendar +[VCard, VCalendar, Document] Calscale - Calendar Scale: GREGORIAN +[VCard, VCalendar, Document] Version - VCalendar Version: 2.0 +[VCard, VCalendar, Document] Method - Method: PUBLISH +[VCard, VCalendar, Document] X-wr-calname - Calendar Name: Calendar +[VCard, VCalendar, Time] X-wr-timezone - Time Zone 2: America/Toronto +[VCard, VCalendar, Document] X-apple-calendar-color - Calendar Color: #CC73E1 +[VCard, Timezone1, Time] Tzid - Timezone ID: Canada/Eastern +[VCard, Timezone1, Time] DaylightTzoffsetfrom - Daylight Timezone Offset From: -0500 +[VCard, Timezone1, Time] DaylightRrule - Daylight Recurrence Rule: FREQ=YEARLY;BYMONTH=3;BYDAY=2SU +[VCard, Timezone1, Time] DaylightDtstart - Daylight Date Time Start: 2007:03:11 02:00:00 +[VCard, Timezone1, Time] DaylightTzname - Daylight Timezone Name: EDT +[VCard, Timezone1, Time] DaylightTzoffsetto - Daylight Timezone Offset To: -0400 +[VCard, Timezone1, Time] StandardTzoffsetfrom - Standard Timezone Offset From: -0400 +[VCard, Timezone1, Time] StandardRrule - Standard Recurrence Rule: FREQ=YEARLY;BYMONTH=11;BYDAY=1SU +[VCard, Timezone1, Time] StandardDtstart - Standard Date Time Start: 2007:11:04 02:00:00 +[VCard, Timezone1, Time] StandardTzname - Standard Timezone Name: EST +[VCard, Timezone1, Time] StandardTzoffsetto - Standard Timezone Offset To: -0500 +[VCard, Timezone2, Time] Tzid - Timezone ID: America/Toronto +[VCard, Timezone2, Time] DaylightTzoffsetfrom - Daylight Timezone Offset From: -0500 +[VCard, Timezone2, Time] DaylightRrule - Daylight Recurrence Rule: FREQ=YEARLY;BYMONTH=3;BYDAY=2SU +[VCard, Timezone2, Time] DaylightDtstart - Daylight Date Time Start: 2007:03:11 02:00:00 +[VCard, Timezone2, Time] DaylightTzname - Daylight Timezone Name: EDT +[VCard, Timezone2, Time] DaylightTzoffsetto - Daylight Timezone Offset To: -0400 +[VCard, Timezone2, Time] StandardTzoffsetfrom - Standard Timezone Offset From: -0400 +[VCard, Timezone2, Time] StandardRrule - Standard Recurrence Rule: FREQ=YEARLY;BYMONTH=11;BYDAY=1SU +[VCard, Timezone2, Time] StandardDtstart - Standard Date Time Start: 2007:11:04 02:00:00 +[VCard, Timezone2, Time] StandardTzname - Standard Timezone Name: EST +[VCard, Timezone2, Time] StandardTzoffsetto - Standard Timezone Offset To: -0500 +[VCard, Event1, Time] Created - Date Created: 2012:08:07 15:27:46Z +[VCard, Event1, Document] Uid - UID: 5E9B5BEF-C3D9-452C-AB1A-613510B5BA52 +[VCard, Event1, Time] Rrule - Recurrence Rule: FREQ=WEEKLY;INTERVAL=1;BYDAY=MO;WKST=SU +[VCard, Event1, Time] Dtend - Date Time End: 2013:09:16 13:30:00 +[VCard, Event1, Time] DtendTzid - Date Time End Timezone ID: Canada/Eastern +[VCard, Event1, Time] Exdate - Exception Date Times: 2014:12:01 12:30:00 +[VCard, Event1, Time] ExdateTzid - Exception Date Times Timezone ID: Canada/Eastern +[VCard, Event1, Time] Exdate - Exception Date Times: 2015:04:27 12:30:00 +[VCard, Event1, Time] ExdateTzid - Exception Date Times Timezone ID: Canada/Eastern +[VCard, Event1, Document] Transp - Time Transparency: OPAQUE +[VCard, Event1, Document] Summary - Summary: Group meeting +[VCard, Event1, Time] Dtstart - Date Time Start: 2013:09:16 12:30:00 +[VCard, Event1, Time] DtstartTzid - Date Time Start Timezone ID: Canada/Eastern +[VCard, Event1, Time] Dtstamp - Date Time Stamp: 2015:04:20 15:55:18Z +[VCard, Event1, Location] Location - Location: 261 +[VCard, Event1, Document] Sequence - Sequence Number: 0 +[VCard, Event1, Document] Alarm1X-wr-alarmuid - Alarm 1 Alarm UID: C41775A2-C98F-456C-BB8F-8E6FB15A554F +[VCard, Event1, Document] Alarm1Uid - Alarm 1 UID: C41775A2-C98F-456C-BB8F-8E6FB15A554F +[VCard, Event1, Document] Alarm1Trigger - Alarm 1 Trigger: -PT5M +[VCard, Event1, Document] Alarm1Attach - Alarm 1 Attachment: Basso +[VCard, Event1, Document] Alarm1X-apple-local-default-alarm - Alarm 1 Local Default Alarm: TRUE +[VCard, Event1, Document] Alarm1Action - Alarm 1 Action: AUDIO +[VCard, Event1, Document] Alarm1X-apple-default-alarm - Alarm 1 Default Alarm: TRUE +[VCard, Event1, Document] Alarm2X-wr-alarmuid - Alarm 2 Alarm UID: 70894F68-E6F8-4C00-A737-73D4CDCF0525 +[VCard, Event1, Document] Alarm2Uid - Alarm 2 UID: 70894F68-E6F8-4C00-A737-73D4CDCF0525 +[VCard, Event1, Document] Alarm2Trigger - Alarm 2 Trigger: -PT5M +[VCard, Event1, Document] Alarm2X-apple-default-alarm - Alarm 2 Default Alarm: TRUE +[VCard, Event1, Document] Alarm2Attach - Alarm 2 Attachment: Basso +[VCard, Event1, Document] Alarm2Action - Alarm 2 Action: AUDIO +[VCard, Event2, Time] Created - Date Created: 2012:08:07 15:27:46Z +[VCard, Event2, Document] Uid - UID: 5E9B5BEF-C3D9-452C-AB1A-613510B5BA52 +[VCard, Event2, Time] Dtend - Date Time End: 2013:11:25 13:30:00 +[VCard, Event2, Time] DtendTzid - Date Time End Timezone ID: Canada/Eastern +[VCard, Event2, Document] Transp - Time Transparency: OPAQUE +[VCard, Event2, Document] Summary - Summary: Group meeting +[VCard, Event2, Time] Dtstart - Date Time Start: 2013:11:25 12:30:00 +[VCard, Event2, Time] DtstartTzid - Date Time Start Timezone ID: Canada/Eastern +[VCard, Event2, Time] Dtstamp - Date Time Stamp: 2015:04:08 14:29:41Z +[VCard, Event2, Location] Location - Location: 501 +[VCard, Event2, Document] Sequence - Sequence Number: 0 +[VCard, Event2, Document] Recurrence-id - Recurrence ID: 20131125T123000 +[VCard, Event2, Time] Recurrence-idTzid - Recurrence ID Timezone ID: Canada/Eastern +[VCard, Event2, Document] Alarm1X-wr-alarmuid - Alarm 1 Alarm UID: C514D9BB-BDB3-4A5F-B580-9287459DA35C +[VCard, Event2, Document] Alarm1Uid - Alarm 1 UID: C514D9BB-BDB3-4A5F-B580-9287459DA35C +[VCard, Event2, Document] Alarm1Trigger - Alarm 1 Trigger: -PT5M +[VCard, Event2, Document] Alarm1Attach - Alarm 1 Attachment: Basso +[VCard, Event2, Document] Alarm1X-apple-local-default-alarm - Alarm 1 Local Default Alarm: TRUE +[VCard, Event2, Document] Alarm1Action - Alarm 1 Action: AUDIO +[VCard, Event2, Document] Alarm1X-apple-default-alarm - Alarm 1 Default Alarm: TRUE diff --git a/t/Vorbis.t b/t/Vorbis.t new file mode 100644 index 0000000..f211d41 --- /dev/null +++ b/t/Vorbis.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Vorbis.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::Vorbis; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'Vorbis'; +my $testnum = 1; + +# test 2: Extract information from test file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/Vorbis.ogg'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/Vorbis_2.out b/t/Vorbis_2.out new file mode 100644 index 0000000..22b3a8e --- /dev/null +++ b/t/Vorbis_2.out @@ -0,0 +1,29 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Vorbis.ogg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 5.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:11:10 21:57:27-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:53-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: OGG +[File, File, Other] FileTypeExtension - File Type Extension: ogg +[File, File, Other] MIMEType - MIME Type: audio/ogg +[Vorbis, Vorbis, Audio] 0 - Vorbis Version: 0 +[Vorbis, Vorbis, Audio] 4 - Audio Channels: 2 +[Vorbis, Vorbis, Audio] 5 - Sample Rate: 22050 +[Vorbis, Vorbis, Audio] 13 - Nominal Bitrate: 32 kbps +[Vorbis, Vorbis, Audio] vendor - Vendor: AO; aoTuV b4b [20051117] (based on Xiph.Org's libVorbis) +[Vorbis, Vorbis, Audio] COVERARTMIME - Cover Art MIME Type: image/jpeg +[Vorbis, Vorbis, Preview] COVERART - Cover Art: (Binary data 1351 bytes) +[Vorbis, Vorbis, Audio] MEDIAJUKEBOX:TOOL NAME - Mediajukebox Tool Name: Media Center +[Vorbis, Vorbis, Audio] MEDIAJUKEBOX:TOOL VERSION - Mediajukebox Tool Version: 11.1.197 +[Vorbis, Vorbis, Audio] GENRE - Genre: Funk +[Vorbis, Vorbis, Audio] MEDIAJUKEBOX:DATE - Mediajukebox Date: 38718 +[Vorbis, Vorbis, Time] DATE - Date: 2006 +[Vorbis, Vorbis, Audio] TITLE - Title: A 4s sample for testing embedded cover art +[Vorbis, Vorbis, Audio] TRACKNUMBER - Track Number: 1 +[Vorbis, Vorbis, Audio] COMMENT - Comment: a nice comment +[Vorbis, Vorbis, Author] ARTIST - Artist: Who Knows +[Vorbis, Vorbis, Audio] ALBUM - Album: The Test Album +[Composite, Composite, Other] Vorbis-Duration - Duration: 1.34 s (approx) diff --git a/t/WTV.t b/t/WTV.t new file mode 100644 index 0000000..57cb9b9 --- /dev/null +++ b/t/WTV.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/WTV.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::WTV; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'WTV'; +my $testnum = 1; + +# test 2: Extract information from WTV.wtv +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/WTV.wtv'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/WTV_2.out b/t/WTV_2.out new file mode 100644 index 0000000..6b5c544 --- /dev/null +++ b/t/WTV_2.out @@ -0,0 +1,80 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: WTV.wtv +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 7.7 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2018:06:04 16:11:36-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:58-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: WTV +[File, File, Other] FileTypeExtension - File Type Extension: wtv +[File, File, Other] MIMEType - MIME Type: video/x-ms-wtv +[WTV, WTV, Video] WM/MediaClassPrimaryID - Media Class Primary ID: bd3098dbb33aab4f8a371a995f7ff74b +[WTV, WTV, Video] WM/MediaClassSecondaryID - Media Class Secondary ID: 8a257fbaf762a947b21f4651c42a000e +[WTV, WTV, Video] Title - Title: Stargate SG-1 +[WTV, WTV, Video] WM/SubTitle - Subtitle: +[WTV, WTV, Video] WM/SubTitleDescription - Subtitle Description: Company Of Thieves: A power struggle in the deadly Lucian Alliance's ranks spells danger for SG-1. With Carter, Vala and Daniel held captive, Mitchell may be their only hope... (S10, ep 9) [S] +[WTV, WTV, Video] WM/Genre - Genre: Shows;Other Shows +[WTV, WTV, Time] WM/OriginalReleaseTime - Original Release Time: 0 +[WTV, WTV, Video] WM/Language - Language: +[WTV, WTV, Video] WM/MediaCredits - Media Credits: ;;; +[WTV, WTV, Video] WM/MediaStationCallSign - Media Station Call Sign: Pick +[WTV, WTV, Video] WM/MediaStationName - Media Station Name: Pick +[WTV, WTV, Video] WM/MediaNetworkAffiliation - Media Network Affiliation: Pick +[WTV, WTV, Video] WM/MediaOriginalChannel - Media Original Channel: 11 +[WTV, WTV, Video] WM/MediaOriginalChannelSubNumber - Media Original Channel Sub Number: 0 +[WTV, WTV, Time] WM/MediaOriginalBroadcastDateTime - Media Original Broadcast Date Time: 0001:01:01 00:00:00Z +[WTV, WTV, Video] WM/MediaOriginalRunTime - Media Original Run Time: 0:18:16 +[WTV, WTV, Audio] WM/MediaIsStereo - Media Is Stereo: No +[WTV, WTV, Video] WM/MediaIsRepeat - Media Is Repeat: No +[WTV, WTV, Video] WM/MediaIsLive - Media Is Live: No +[WTV, WTV, Video] WM/MediaIsTape - Media Is Tape: No +[WTV, WTV, Video] WM/MediaIsDelay - Media Is Delay: No +[WTV, WTV, Video] WM/MediaIsSubtitled - Media Is Subtitled: No +[WTV, WTV, Video] WM/MediaIsMovie - Media Is Movie: No +[WTV, WTV, Video] WM/MediaIsPremiere - Media Is Premiere: No +[WTV, WTV, Video] WM/MediaIsFinale - Media Is Finale: No +[WTV, WTV, Video] WM/MediaIsSAP - Media Is SAP: No +[WTV, WTV, Video] WM/MediaIsSport - Media Is Sport: No +[WTV, WTV, Video] WM/ParentalRating - Parental Rating: +[WTV, WTV, Video] WM/ParentalRatingReason - Parental Rating Reason: +[WTV, WTV, Video] WM/Provider - Provider: MediaCenterDefault +[WTV, WTV, Video] WM/ProviderCopyright - Provider Copyright: +[WTV, WTV, Video] WM/ProviderRating - Provider Rating: +[WTV, WTV, Video] WM/VideoClosedCaptioning - Video Closed Captioning: No +[WTV, WTV, Time] WM/WMRVEncodeTime - Encode Time: 2018:05:25 18:44:43Z +[WTV, WTV, Video] WM/WMRVSeriesUID - Series UID: !GenericSeries!Stargate SG-1 +[WTV, WTV, Video] WM/WMRVServiceID - Service ID: !Generated!428e25b3f1244190851ef9311cd5aea0 +[WTV, WTV, Video] WM/WMRVProgramID - Program ID: !Loaders!Glid!Programs!9018:20544:22208!6518 +[WTV, WTV, Video] WM/WMRVRequestID - Request ID: 0 +[WTV, WTV, Video] WM/WMRVScheduleItemID - Schedule Item ID: 0 +[WTV, WTV, Video] WM/WMRVQuality - Quality: 3 +[WTV, WTV, Video] WM/WMRVOriginalSoftPrePadding - Original Soft Pre Padding: 2794 +[WTV, WTV, Video] WM/WMRVOriginalSoftPostPadding - Original Soft Post Padding: 180 +[WTV, WTV, Video] WM/WMRVHardPrePadding - Hard Pre Padding: -2674 +[WTV, WTV, Video] WM/WMRVHardPostPadding - Hard Post Padding: 0 +[WTV, WTV, Video] WM/WMRVBrandingName - Branding Name: +[WTV, WTV, Video] WM/WMRVBrandingImageID - Branding Image ID: +[WTV, WTV, Video] WM/WMRVATSCContent - ATSC Content: No +[WTV, WTV, Video] WM/WMRVDTVContent - DTV Content: Yes +[WTV, WTV, Video] WM/WMRVHDContent - HD Content: No +[WTV, WTV, Video] Duration - Duration: 27.38 s +[WTV, WTV, Time] WM/WMRVEndTime - End Time: 2018:05:25 18:45:11Z +[WTV, WTV, Video] WM/WMRVKeepUntil - Keep Until: -1 +[WTV, WTV, Video] WM/WMRVActualSoftPrePadding - Actual Soft Pre Padding: -8 +[WTV, WTV, Video] WM/WMRVActualSoftPostPadding - Actual Soft Post Padding: -888 +[WTV, WTV, Video] WM/WMRVContentProtected - Content Protected: No +[WTV, WTV, Video] WM/WMRVContentProtectedPercent - Content Protected Percent: 0 +[WTV, WTV, Video] WM/WMRVInBandRatingSystem - In Band Rating System: 255 +[WTV, WTV, Video] WM/WMRVInBandRatingLevel - In Band Rating Level: 255 +[WTV, WTV, Video] WM/WMRVInBandRatingAttributes - In Band Rating Attributes: 0 +[WTV, WTV, Video] WM/WMRVWatched - Watched: No +[WTV, WTV, Video] WM/MediaThumbWidth - Media Thumb Width: 352 +[WTV, WTV, Video] WM/MediaThumbHeight - Media Thumb Height: 372 +[WTV, WTV, Video] WM/MediaThumbStride - Media Thumb Stride: 1056 +[WTV, WTV, Video] WM/MediaThumbRet - Media Thumb Ret: 0 +[WTV, WTV, Video] WM/MediaThumbRatingSystem - Media Thumb Rating System: 255 +[WTV, WTV, Video] WM/MediaThumbRatingLevel - Media Thumb Rating Level: 255 +[WTV, WTV, Video] WM/MediaThumbRatingAttributes - Media Thumb Rating Attributes: 0 +[WTV, WTV, Video] WM/MediaThumbAspectRatioX - Media Thumb Aspect Ratio X: 16 +[WTV, WTV, Video] WM/MediaThumbAspectRatioY - Media Thumb Aspect Ratio Y: 9 diff --git a/t/Writer.t b/t/Writer.t new file mode 100644 index 0000000..31c5476 --- /dev/null +++ b/t/Writer.t @@ -0,0 +1,1091 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/Writer.t". + +BEGIN { + $| = 1; print "1..59\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +$loaded = 1; +print "ok 1\n"; + +######################### End of black magic. + +my $testname = 'Writer'; +my $testnum = 1; +my $testfile; + +# tests 2/3: Test writing new comment to JPEG file and removing it again +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile1 = "t/${testname}_${testnum}_failed.jpg"; + -e $testfile1 and unlink $testfile1; + $exifTool->SetNewValue('Comment','New comment in JPG file'); + writeInfo($exifTool, 't/images/Canon.jpg', $testfile1); + my $info = ImageInfo($testfile1); + print 'not ' unless check($info, $testname, $testnum); + print "ok $testnum\n"; + + ++$testnum; + my $testfile2 = "t/${testname}_${testnum}_failed.jpg"; + -e $testfile2 and unlink $testfile2; + $exifTool->SetNewValue('Comment'); + writeInfo($exifTool, $testfile1, $testfile2); + if (binaryCompare($testfile2, 't/images/Canon.jpg')) { + unlink $testfile1; + unlink $testfile2; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# tests 4/5: Test editing a TIFF in memory then changing it back again +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Duplicates => 1, Unknown => 1); + my $newtiff; + $exifTool->SetNewValue(Headline => 'A different headline'); + $exifTool->SetNewValue(ImageDescription => 'Modified TIFF'); + $exifTool->SetNewValue(Keywords => 'another keyword', AddValue => 1); + $exifTool->SetNewValue('xmp:SupplementalCategories' => 'new XMP info'); + writeInfo($exifTool, 't/images/ExifTool.tif', \$newtiff); + my $info = $exifTool->ImageInfo(\$newtiff); + unless (check($exifTool, $info, $testname, $testnum)) { + $testfile = "t/${testname}_${testnum}_failed.tif"; + open(TESTFILE,">$testfile"); + binmode(TESTFILE); + print TESTFILE $newtiff; + close(TESTFILE); + print 'not '; + } + print "ok $testnum\n"; + + ++$testnum; + my $newtiff2; + $exifTool->SetNewValue(); # clear all the changes + $exifTool->SetNewValue(Headline => 'headline'); + $exifTool->SetNewValue(ImageDescription => 'The picture caption'); + $exifTool->SetNewValue(Keywords => 'another keyword', DelValue => 1); + $exifTool->SetNewValue(SupplementalCategories); + writeInfo($exifTool, \$newtiff, \$newtiff2); + $testfile = "t/${testname}_${testnum}_failed.tif"; + open(TESTFILE,">$testfile"); + binmode(TESTFILE); + print TESTFILE $newtiff2; + close(TESTFILE); + if (binaryCompare($testfile,'t/images/ExifTool.tif')) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 6/7: Test rewriting a JPEG file then changing it back again +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Duplicates => 1, Unknown => 1); + my $testfile1 = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile1; + $exifTool->SetNewValue(DateTimeOriginal => '2005:01:01 00:00:00', Group => 'IFD0'); + $exifTool->SetNewValue(Contrast => '+2', Group => 'XMP'); + $exifTool->SetNewValue(ExposureCompensation => 999, Group => 'EXIF'); + $exifTool->SetNewValue(LightSource => 'cloud'); + $exifTool->SetNewValue('EXIF:Flash' => '0x1', Type => 'ValueConv'); + $exifTool->SetNewValue('Orientation#' => 3); + $exifTool->SetNewValue(FocalPlaneResolutionUnit => 'mm'); + $exifTool->SetNewValue(Category => 'IPTC test'); + $exifTool->SetNewValue(Description => 'New description'); + $exifTool->SetNewValue(TimeCodes => '02:53:49:07 2009-11-19T12:38:35:21-03:00'); + writeInfo($exifTool, 't/images/Canon.jpg', $testfile1, undef, 1); + my $info = $exifTool->ImageInfo($testfile1); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + + ++$testnum; + $exifTool->SetNewValue(); + $exifTool->SetNewValue(DateTimeOriginal => '2003:12:04 06:46:52'); + $exifTool->SetNewValue(Contrast => undef, Group => 'XMP'); + $exifTool->SetNewValue(ExposureCompensation => 0, Group => 'EXIF'); + $exifTool->SetNewValue('LightSource'); + $exifTool->SetNewValue('EXIF:Flash' => '0x0', Type => 'ValueConv'); + $exifTool->SetNewValue('Orientation#' => 1); + $exifTool->SetNewValue(FocalPlaneResolutionUnit => 'in'); + $exifTool->SetNewValue('Category'); + $exifTool->SetNewValue('Description'); + $exifTool->SetNewValue('TimeCodes'); + my $image; + writeInfo($exifTool, $testfile1, \$image); + $exifTool->Options(Composite => 0); + $info = $exifTool->ImageInfo(\$image, '-filesize'); + my $testfile2 = "t/${testname}_${testnum}_failed.jpg"; + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile1; + unlink $testfile2; + } else { + # save bad file + open(TESTFILE,">$testfile2"); + binmode(TESTFILE); + print TESTFILE $image; + close(TESTFILE); + print 'not '; + } + print "ok $testnum\n"; +} + +# test 8: Test rewriting everything in a JPEG file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Duplicates => 1, Binary => 1, ListJoin => undef); + my $info = $exifTool->ImageInfo('t/images/Canon.jpg'); + my $tag; + foreach $tag (keys %$info) { + my $group = $exifTool->GetGroup($tag); + # eat return values so warnings don't get printed + my @rtns = $exifTool->SetNewValue($tag,$info->{$tag},Group=>$group); + } + undef $info; + my $image; + writeInfo($exifTool, 't/images/Canon.jpg', \$image); + # (must drop Composite tags because their order may change) + $exifTool->Options(Unknown => 1, Binary => 0, ListJoin => ', ', Composite => 0); + # (must ignore filesize because it changes as null padding is discarded) + $info = $exifTool->ImageInfo(\$image, '-filesize'); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + if (check($exifTool, $info, $testname, $testnum, 7)) { + unlink $testfile; + } else { + # save bad file + open(TESTFILE,">$testfile"); + binmode(TESTFILE); + print TESTFILE $image; + close(TESTFILE); + print 'not '; + } + print "ok $testnum\n"; +} + +# test 9: Test copying over information with SetNewValuesFromFile() +# (including a transfer of the ICC_Profile record) +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/Canon.jpg'); + $exifTool->SetNewValuesFromFile('t/images/ExifTool.tif', 'ICC_Profile'); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/Nikon.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 10: Another SetNewValuesFromFile() test +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(IgnoreMinorErrors => 1); + $exifTool->SetNewValuesFromFile('t/images/Pentax.jpg'); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/Canon.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# tests 11/12: Try creating something from nothing and removing it again +# (also test ListSplit and ListJoin options) +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(ListSplit => ';\\s*'); + $exifTool->Options(ListJoin => ' <<separator>> '); + $exifTool->SetNewValue(DateTimeOriginal => '2005:01:19 13:37:22', Group => 'EXIF'); + $exifTool->SetNewValue(FileVersion => 12, Group => 'IPTC'); + $exifTool->SetNewValue(Contributor => 'Guess who', Group => 'XMP'); + $exifTool->SetNewValue(GPSLatitude => q{44 deg 14' 12.25"}, Group => 'GPS'); + $exifTool->SetNewValue('Ducky:Quality' => 50); + $exifTool->SetNewValue(Keywords => 'this; that'); + my $testfile1 = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile1; + writeInfo($exifTool, 't/images/Writer.jpg', $testfile1); + my $info = $exifTool->ImageInfo($testfile1); + my $success = check($exifTool, $info, $testname, $testnum); + print 'not ' unless $success; + print "ok $testnum\n"; + + ++$testnum; + $exifTool->SetNewValue('DateTimeOriginal'); + $exifTool->SetNewValue('FileVersion'); + $exifTool->SetNewValue('Contributor'); + $exifTool->SetNewValue('GPSLatitude'); + $exifTool->SetNewValue('Ducky:Quality'); + $exifTool->SetNewValue('Keywords'); + my $testfile2 = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile2; + writeInfo($exifTool, $testfile1, $testfile2); + if (binaryCompare('t/images/Writer.jpg', $testfile2)) { + unlink $testfile1 if $success; + unlink $testfile2; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 13: Copy tags from CRW file to JPG +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/CanonRaw.crw'); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 14: Delete all information in a group +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue('All' => undef, Group => 'MakerNotes'); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/Canon.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 15: Copy a specific set of tags +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my @copyTags = qw(exififd:all -lightSource ifd0:software); + # also test new regular expression feature (ExifTool 9.15) + push @copyTags, 'comment<${ make ; tr{ ,.}{_}; s{__}{_} } {cool, huh?}'; + $exifTool->SetNewValuesFromFile('t/images/Olympus.jpg', @copyTags); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/Canon.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# tests 16-18: Test SetNewValuesFromFile() order of operations +{ + my @argsList = ( + [ 'ifd0:xresolution>xmp:*', 'ifd1:xresolution>xmp:*' ], + [ 'ifd1:xresolution>xmp:*', 'ifd0:xresolution>xmp:*' ], + [ '*:xresolution', '-ifd0:xresolution', 'xresolution>xmp:*' ], + ); + my $args; + foreach $args (@argsList) { + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/GPS.jpg', @$args); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile, 'xresolution'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + } +} + +# test 19: Test SaveNewValues()/RestoreNewValues() +my $testOK; +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue(ISO => 25); + $exifTool->SetNewValue(Sharpness => '+1'); + $exifTool->SetNewValue(Artist => 'Phil', Group => 'IFD0'); + $exifTool->SetNewValue(Artist => 'Harvey', Group => 'ExifIFD'); + $exifTool->SetNewValue(DateTimeOriginal => '2006:03:27 16:25:00'); + $exifTool->SetNewValue(Keywords => ['one','two']); + $exifTool->SaveNewValues(); + $exifTool->SetNewValue(Artist => 'nobody'); + $exifTool->SetNewValue(Keywords => 'three'); + $exifTool->SetNewValuesFromFile('t/images/FujiFilm.jpg'); + $exifTool->RestoreNewValues(); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + $testOK = 1; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 20/21: Test edit in place (using the file from the last test) +{ + my ($skip, $size); + ++$testnum; + $skip = ''; + if ($testOK) { + my $exifTool = new Image::ExifTool; + my $newComment = 'This is a new test comment'; + $exifTool->SetNewValue(Comment => $newComment); + my $ok = writeInfo($exifTool, $testfile); + my $info = $exifTool->ImageInfo($testfile, 'Comment'); + if ($$info{Comment} and $$info{Comment} eq $newComment and $ok) { + $size = -s $testfile; + } else { + $testOK = 0; + print 'not '; + } + } else { + $skip = ' # skip Relies on previous test'; + } + print "ok $testnum$skip\n"; + + # test in-place edit of file passed by handle + ++$testnum; + $skip = ''; + if ($testOK) { + my $exifTool = new Image::ExifTool; + my $shortComment = 'short comment'; + $exifTool->SetNewValue(Comment => $shortComment); + open FILE, "+<$testfile"; # open test file for update + writeInfo($exifTool, \*FILE); + close FILE; + my $info = $exifTool->ImageInfo($testfile, 'Comment'); + if ($$info{Comment} and $$info{Comment} eq $shortComment) { + my $newSize = -s $testfile; + unless ($newSize < $size) { + # test to see if the file got shorter as it should have + $testOK = 0; + $skip = ' # skip truncate() not supported on this system'; + } + } else { + $testOK = 0; + print 'not '; + } + } else { + $skip = ' # skip Relies on previous test'; + } + print "ok $testnum$skip\n"; +} + +# test 22: Test time shift feature +{ + ++$testnum; + my @writeInfo = ( + ['DateTimeOriginal' => '1:2', 'Shift' => 1], + ['ModifyDate' => '2:1: 3:4', 'Shift' => 1], + ['CreateDate' => '200 0', 'Shift' => -1], + ['DateCreated' => '20:', 'Shift' => -1], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/XMP.jpg', 1); + print "ok $testnum\n"; +} + +# test 23: Test renaming a file from the value of DateTimeOriginal +{ + ++$testnum; + my $skip = ''; + if (not eval { require POSIX }) { + $skip = ' # skip Requires POSIX'; + } elsif ($testOK) { + my $newfile = "t/${testname}_${testnum}_20060327_failed.jpg"; + unlink $newfile; + my $exifTool = new Image::ExifTool; + $exifTool->Options(DateFormat => "${testname}_${testnum}_%Y%m%d_failed.jpg"); + $exifTool->SetNewValuesFromFile($testfile, 'FileName<DateTimeOriginal'); + writeInfo($exifTool, $testfile); + if (-e $newfile and not -e $testfile) { + $testfile = $newfile; + } else { + $testOK = 0; + print 'not '; + } + } else { + $skip = ' # skip Relies on test 21'; + } + print "ok $testnum$skip\n"; + + $testOK and unlink $testfile; # erase test file if all tests passed +} + +# test 24: Test redirection with expressions +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/FujiFilm.jpg', + 'Comment<ISO=$ISO Aperture=${EXIF:fnumber} Exposure=${shutterspeed}' + ); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile, 'Comment'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 25/26: Test order of delete operations +{ + my $i; + for ($i=0; $i<2; ++$i) { + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/Nikon.jpg', 'all:all', '-makernotes:all'); + $exifTool->SetNewValue(fnumber => 26) if $i == 1; + $exifTool->SetNewValue('exififd:all'); # delete all exifIFD + $exifTool->SetNewValue(fnumber => 25) if $i == 0; + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/Canon.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + } +} + +# test 27: Check that mandatory EXIF resolution tags get taken from JFIF +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue('exif:all'); # delete all EXIF + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/ExifTool.jpg', $testfile); + $exifTool->SetNewValue(); + $exifTool->SetNewValue('exif:datetimeoriginal', '2000:01:02 03:04:05'); + my $ok = writeInfo($exifTool, $testfile); + $info = $exifTool->ImageInfo($testfile, 'XResolution', 'YResolution', 'DateTimeOriginal'); + if (check($exifTool, $info, $testname, $testnum) and $ok) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# tests 28-30: Check cross delete behaviour when deleting tags +{ + my $group; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue('IFD0:ISO',100); + $exifTool->SetNewValue('ExifIFD:ISO',200); + writeInfo($exifTool, 't/images/Writer.jpg', 't/tmp.jpg'); + foreach $group ('EXIF', 'IFD0', 'ExifIFD') { + ++$testnum; + $exifTool->SetNewValue(); # reset values + $exifTool->SetNewValue("$group:ISO"); # delete ISO from specific group + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/tmp.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile, 'FileName', 'ISO'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + } + unlink 't/tmp.jpg'; +} + +# test 31: Delete all but EXIF (excluding IFD1) and IPTC information +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue('*'); + $exifTool->SetNewValue('EXIF:*', undef, Replace => 2); + $exifTool->SetNewValue('ifd1:all'); + $exifTool->SetNewValue('IPTC:*', undef, Replace => 2); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/ExifTool.jpg', $testfile, undef, 1); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# tests 32-33: Read/Write ICC Profile tags +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(IgnoreMinorErrors => 1); + my $hdr = "\0\0\0\x18ADBE\x02\x10\0\0mntrRGB XYZ "; + $exifTool->SetNewValue(AsShotICCProfile => $hdr . '<dummy>', Protected => 1); + $exifTool->SetNewValue(CurrentICCProfile => $hdr . '<dummy 2>', Protected => 1); + $testfile = "t/${testname}_${testnum}_failed.tif"; + unlink $testfile; + my @tags = qw(ICC_Profile AsShotICCProfile CurrentICCProfile); + writeInfo($exifTool, 't/images/ExifTool.tif', $testfile); + my $info = $exifTool->ImageInfo($testfile, @tags); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + + ++$testnum; + my $srcfile = $testfile; + $exifTool->SetNewValue(); + $exifTool->SetNewValue(ICC_Profile => $hdr . '<another dummy>', Protected => 1); + $testfile = "t/${testname}_${testnum}_failed.tif"; + unlink $testfile; + writeInfo($exifTool, $srcfile, $testfile); + $info = $exifTool->ImageInfo($testfile, @tags); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $srcfile; + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 34: copy list tag to list and non-list tags with different options +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(ListJoin => undef); + $exifTool->SetNewValuesFromFile('t/images/IPTC.jpg', + { Replace => 1 }, + 'xmp:subject<filename', + 'xmp:subject<iptc:keywords', + 'comment<iptc:keywords', + { Replace => 0 }, + 'xmp:HierarchicalSubject<filename', + 'xmp:HierarchicalSubject<iptc:keywords', + ); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + $info = $exifTool->ImageInfo($testfile, 'xmp:subject', 'comment', 'HierarchicalSubject'); + my $err; + if (check($exifTool, $info, $testname, $testnum)) { + # make sure it was an array reference + my $val = $$info{Subject} || ''; + my $err; + if (ref $val ne 'ARRAY') { + $err = "Subject is not an ARRAY: '$val'"; + } elsif (@$val != 3) { + $err = "Subject does not contain 3 values: '" . join(', ', @$val) . "'"; + } + if ($err) { + warn "\n $err\n"; + } else { + unlink $testfile; + } + } else { + $err = 1; + } + print 'not ' if $err; + print "ok $testnum\n"; +} + +# test 35: Add back all information after deleting everything +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue('*'); + $exifTool->SetNewValuesFromFile('t/images/ExifTool.jpg', 'all:all', + 'icc_profile', 'canonvrd'); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/ExifTool.jpg', $testfile, undef, 1); + $exifTool->Options(Composite => 0); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 36: Test adding and deleting from the same list +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue('IPTC:Keywords', 'out', DelValue => 1); + $exifTool->SetNewValue('IPTC:Keywords', 'in', AddValue => 1); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile, 'IPTC:all'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# tests 37-38: Create EXIF file from EXIF block and individual tags +{ + my $i; + for ($i=0; $i<2; ++$i) { + ++$testnum; + my $exifTool = new Image::ExifTool; + my @tags; + if ($i == 0) { + $exifTool->SetNewValuesFromFile('t/images/Sony.jpg', 'EXIF'); + $exifTool->Options(PrintConv => 0); + @tags = qw(FileSize Compression); + } else { + $exifTool->SetNewValuesFromFile('t/images/Sony.jpg'); + $exifTool->Options(PrintConv => 1, Unknown => 1); + } + $testfile = "t/${testname}_${testnum}_failed.exif"; + unlink $testfile; + writeInfo($exifTool, undef, $testfile); + my $info = $exifTool->ImageInfo($testfile, @tags); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + } +} + +# tests 39-40: Test writing only if the tag didn't already exist +{ + ++$testnum; + my @writeInfo = ( + [DateTimeOriginal => '', DelValue => 1], + ['DateTimeOriginal#' => '1999:99:99 99:99:99'], + [XResolution => '', DelValue => 1], + [XResolution => '123'], + [ResolutionUnit => '', DelValue => 1], + [ResolutionUnit => 'cm'], + ); + my @check = qw(FileName DateTimeOriginal XResolution ResolutionUnit); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, + 't/images/Writer.jpg', \@check); + print "ok $testnum\n"; + + ++$testnum; + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, + 't/images/Canon.jpg', \@check, 1); + print "ok $testnum\n"; +} + +# test 41: Test writing Kodak APP3 and Canon CIFF Meta information +{ + ++$testnum; + my @writeInfo = ( + ['Meta:SerialNumber' => '12345'], + ['CIFF:OwnerName' => 'CIFF Write Test'], + ); + my @check = qw(SerialNumber OwnerName); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, + 't/images/ExifTool.jpg', \@check); + print "ok $testnum\n"; +} + +# test 42: Test SetNewValuesFromFile with wildcards +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/ExifTool.jpg', 'ifd0:*<jfif:?resolution'); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + $exifTool->Options(Composite => 0); + my $info = $exifTool->ImageInfo($testfile, '-file:all'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 43: Test increment feature EXIF +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + my @writeInfo = ( + [ExposureTime => '1.5', Shift => 1], + [SerialNumber => '-9', Shift => -1], # (two negatives make a positive) + [MeteringMode => '1', Shift => 0, AddValue => 1], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/Canon.jpg', 1); + print "ok $testnum\n"; +} + +# test 44: Test increment feature with XMP +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my @writeInfo = ( + ['XMP:ApertureValue' => '-0.1', Shift => 1], # increment + ['XMP:FNumber' => '28/10', DelValue => 1], # conditional delete + ['XMP:DateTimeOriginal' => '3', Shift => 0, AddValue => 1], # shift + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/XMP.xmp', 1); + print "ok $testnum\n"; +} + +# test 45: Test writing different EXIF string encoding +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(CharsetEXIF => 'Latin'); + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->SetNewValue(Artist => "P\xc3\xaaro", Group => 'EXIF'); + writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + $exifTool->Options(CharsetEXIF => undef); + my $info = $exifTool->ImageInfo($testfile, 'artist'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 46: Test writing with wildcards +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->SetNewValue('A*' => '7'); + writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 47: Test various WriteMode settings +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; # Should the tag be written? + $exifTool->Options(WriteMode => 'w'); # --- write existing tags only: + $exifTool->SetNewValue(ISO => 150); # yes (already exists) + $exifTool->SetNewValue(ImageDescription => 'N');# no (doesn't already exist) + $exifTool->Options(WriteMode => 'c'); # --- create new tags only: + $exifTool->SetNewValue(ApertureValue => 8.0); # no (already exists) + $exifTool->SetNewValue(UserComment => 'No'); # no (exists, albeit empty) + $exifTool->SetNewValue(Artist => 'Phil'); # yes (doesn't already exist) + $exifTool->SetNewValue('XMP:Subject' => 'No'); # no (shouldn't create new group) + $exifTool->Options(WriteMode => 'cg'); # --- also create new groups: + $exifTool->SetNewValue('IPTC:Keywords' => 'Y'); # yes (should create new group) + $exifTool->Options(Composite => 0, FastScan => 2); + writeInfo($exifTool, 't/images/Canon.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile, '-time:all'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# tests 48-50: More WriteMode 'cg' tests, and test AddUserDefinedTags() +{ + ++$testnum; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + my $exifTool = new Image::ExifTool; + $exifTool->Options(WriteMode => 'cg'); + $exifTool->SetNewValue('XMP-dc:Title' => 'A'); + $exifTool->SetNewValue('XMP:Subject' => 'A'); + $exifTool->SetNewValue('XMP:LocationCreated' => '{city=A}'); + $exifTool->SetNewValue('XMP:Flash' => '{fired=true}'); + $exifTool->SetNewValue('IPTC:Keywords' => 'A'); + $exifTool->SetNewValue('IPTC:City' => 'A'); + $exifTool->SetNewValue('EXIF:Artist' => 'A'); + writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile, '-time:all', '-filename'); + unless (check($exifTool, $info, $testname, $testnum)) { + print 'not '; + } + print "ok $testnum\n"; + + ++$testnum; + my $testfile2 = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile2; + $exifTool->SetNewValue(); + $exifTool->SetNewValue('XMP-dc:Title' => 'B'); + $exifTool->SetNewValue('XMP:Subject' => 'B'); + $exifTool->SetNewValue('XMP:LocationCreated' => '{city=B}'); + $exifTool->SetNewValue('XMP:Flash' => '{fired=false}'); + $exifTool->SetNewValue('IPTC:Keywords' => 'B'); + $exifTool->SetNewValue('IPTC:City' => 'B'); + $exifTool->SetNewValue('EXIF:Artist' => 'B'); + if (writeInfo($exifTool, $testfile, $testfile2, 1)) { + unlink $testfile; + unlink $testfile2; + } else { + $info = $exifTool->ImageInfo($testfile2, '-time:all', '-filename'); + check($exifTool, $info, $testname, $testnum, $testnum-1); + print 'not '; + } + print "ok $testnum\n"; + + ++$testnum; + $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + Image::ExifTool::AddUserDefinedTags('Image::ExifTool::XMP::dc', test => {} ); + $exifTool->SetNewValue(); + $exifTool->SetNewValue('XMP-dc:Title' => 'A'); + $exifTool->SetNewValue('XMP-dc:Test' => 'B'); + writeInfo($exifTool, undef, $testfile); + $info = $exifTool->ImageInfo($testfile, 'xmp:all'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 51: Delete a unknown JPEG APP segment +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue('APP6:*' => undef); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/ExifTool.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 52: Delete groups by family 2 group name +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue('Image:*'); + $exifTool->SetNewValue('Camera:*'); + $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + writeInfo($exifTool, 't/images/XMP.xmp', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 53: Exclude groups when copying +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/Canon.jpg', '-Exif:All', '-Canon:All'); + $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 54: Specify multiple groups when copying, excluding a single tag +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/Canon.jpg', 'Exif:Time:All', '-createdate'); + $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile, 'exif:*', '-image:all'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# tests 55-56: Create and edit EXV file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue(Artist => 'me'); + $exifTool->SetNewValue(Keywords => ['one','two']); + $testfile = "t/${testname}_${testnum}_failed.exv"; + unlink $testfile; + writeInfo($exifTool, undef, $testfile); + my $info = $exifTool->ImageInfo($testfile, 'exif:*', 'iptc:*', 'xmp:*'); + unless (check($exifTool, $info, $testname, $testnum)) { + print 'not '; + } + print "ok $testnum\n"; + + ++$testnum; + $exifTool->SetNewValue(); + $exifTool->SetNewValue(Artist); + $exifTool->SetNewValue(Title => 'Test'); + my $testfile2 = "t/${testname}_${testnum}_failed.exv"; + unlink $testfile2; + writeInfo($exifTool, $testfile, $testfile2); + $info = $exifTool->ImageInfo($testfile2, 'exif:*', 'iptc:*', 'xmp:*'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + unlink $testfile2; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 57: Test setting Composite PreviewImage using various groups +{ + ++$testnum; + my $ok = 1; + my $exifTool = new Image::ExifTool; + $exifTool->Options(IgnoreMinorErrors => 1); + my %try = ( + 'previewimage' => 1, + 'composite:previewimage' => 0, # (shouldn't be in the Composite group) + 'composite:thumbnailimage' => 0, + 'composite:jpgfromraw' => 0, + 'composite:otherimage' => 0, + 'ifd0:previewimage' => 1, + '0ifd0:previewimage' => 0, + '1ifd0:previewimage' => 1, + '2ifd0:previewimage' => 0, + 'exif:previewimage' => 1, + '0exif:previewimage' => 1, + '1exif:previewimage' => 0, + '2exif:previewimage' => 0, + 'preview:previewimage' => 1, + '0preview:previewimage' => 0, + '1preview:previewimage' => 0, + '2preview:previewimage' => 1, + 'makernotes:previewimage' => 1, + '0makernotes:previewimage' => 1, + '1makernotes:previewimage' => 0, + '2makernotes:previewimage' => 0, + 'xxx:previewimage' => 0, + '0xxx:previewimage' => 0, + '1xxx:previewimage' => 0, + '2xxx:previewimage' => 0, + 'ifd0:exif:preview:previewimage' => 1, + '0ifd0:exif:preview:previewimage' => 0, + '1ifd0:exif:preview:previewimage' => 1, + '2ifd0:exif:preview:previewimage' => 0, + 'ifd0:0exif:preview:previewimage' => 1, + 'ifd0:1exif:preview:previewimage' => 0, + 'ifd0:2exif:preview:previewimage' => 0, + 'ifd0:exif:0preview:previewimage' => 0, + 'ifd0:exif:1preview:previewimage' => 0, + 'ifd0:exif:2preview:previewimage' => 1, + '1ifd0:0exif:2preview:previewimage' => 1, + 'exif:makernotes:previewimage' => 1, # (but wouldn't write anything) + ); + my $tag; + foreach $tag (sort keys %try) { + my ($num, $err) = $exifTool->SetNewValue($tag => 'test'); + next unless $num xor $try{$tag}; + warn "\nError setting $tag\n"; + $ok = 0; + } + print 'not ' unless $ok; + print "ok $testnum\n"; +} + +# test 58: Set ICC_Profile from an external file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + open IN, 't/images/ICC_Profile.icc' or die; + binmode IN; + my $buff; + read IN, $buff, 1000; + close IN; + my @writeInfo = ( + [ICC_Profile => \$buff, Protected => 1], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 59: Test writing empty list elements +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(ListSplit => ','); + $exifTool->Options(ListJoin => ';'); + $exifTool->SetNewValue('XMP-dc:Subject' => ',a,,'); + $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + writeInfo($exifTool, 't/images/Writer.jpg', $testfile); + my $info = $exifTool->ImageInfo($testfile, 'xmp:all'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# end diff --git a/t/Writer_10.out b/t/Writer_10.out new file mode 100644 index 0000000..95f02ce --- /dev/null +++ b/t/Writer_10.out @@ -0,0 +1,246 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Writer_10_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 7.1 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: PENTAX Corporation +[EXIF, IFD0, Camera] 272 - Camera Model Name: PENTAX K10D +[EXIF, IFD0, Image] 274 - Orientation: Rotate 270 CW +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: K10D Ver 1.30 +[EXIF, IFD0, Time] 306 - Modify Date: 2008:03:02 12:01:23 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/100 +[EXIF, ExifIFD, Image] 33437 - F Number: 13.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Aperture-priority AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2008:03:02 12:01:23 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2008:03:02 12:01:23 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 9 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 0 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 14.0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: +0.7 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 4.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Off, Did not fire +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 10.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 3008 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 2000 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: THM - DCF thumbnail file +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, InteropIFD, Image] 4097 - Related Image Width: 3072 +[EXIF, InteropIFD, Image] 4098 - Related Image Height: 2048 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3443.946188 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3442.016807 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41989 - Focal Length In 35mm Format: 15 mm +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[EXIF, ExifIFD, Camera] 41996 - Subject Distance Range: Distant +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 2814 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Pentax, Camera] 0 - Pentax Version: 3.0.0.0 +[MakerNotes, Pentax, Camera] 1 - Pentax Model Type: 0 +[MakerNotes, Pentax, Image] 2 - Preview Image Size: 640x480 +[MakerNotes, Pentax, Image] 3 - Preview Image Length: 0 +[MakerNotes, Pentax, Image] 4 - Preview Image Start: 2386 +[MakerNotes, Pentax, Camera] 5 - Pentax Model ID: K10D +[MakerNotes, Pentax, Time] 6 - Date: 2008:03:02 +[MakerNotes, Pentax, Time] 7 - Time: 12:01:23 +[MakerNotes, Pentax, Camera] 8 - Quality: Better +[MakerNotes, Pentax, Camera] 12 - Flash Mode: Off, Did not fire; Internal +[MakerNotes, Pentax, Camera] 13 - Focus Mode: AF-S (Focus-priority) +[MakerNotes, Pentax, Camera] 14 - AF Point Selected: Center +[MakerNotes, Pentax, Camera] 18 - Exposure Time: 1/100 +[MakerNotes, Pentax, Camera] 19 - F Number: 13.0 +[MakerNotes, Pentax, Camera] 20 - ISO: 100 +[MakerNotes, Pentax, Camera] 22 - Exposure Compensation: +0.7 +[MakerNotes, Pentax, Camera] 23 - Metering Mode: Multi-segment +[MakerNotes, Pentax, Camera] 24 - Auto Bracketing: 0 EV, No Extended Bracket +[MakerNotes, Pentax, Camera] 25 - White Balance: Auto +[MakerNotes, Pentax, Camera] 26 - White Balance Mode: Auto (Daylight) +[MakerNotes, Pentax, Camera] 29 - Focal Length: 10.0 mm +[MakerNotes, Pentax, Camera] 31 - Saturation: 0 (normal) +[MakerNotes, Pentax, Camera] 32 - Contrast: 0 (normal) +[MakerNotes, Pentax, Camera] 33 - Sharpness: 0 (normal) +[MakerNotes, Pentax, Time] 34 - World Time Location: Hometown +[MakerNotes, Pentax, Time] 35 - Hometown City: Toronto +[MakerNotes, Pentax, Time] 36 - Destination City: New York +[MakerNotes, Pentax, Time] 37 - Hometown DST: No +[MakerNotes, Pentax, Time] 38 - Destination DST: No +[MakerNotes, Pentax, Camera] 39 - DSP Firmware Version: 1.30.00.18 +[MakerNotes, Pentax, Camera] 40 - CPU Firmware Version: 1.30.00.18 +[MakerNotes, Pentax, Camera] 45 - Effective LV: 14.8 +[MakerNotes, Pentax, Camera] 50 - Image Editing: None +[MakerNotes, Pentax, Camera] 51 - Picture Mode: Aperture Priority; 1/3 EV steps +[MakerNotes, Pentax, Camera] 52 - Drive Mode: Single-frame; No Timer; Shutter Button; Single Exposure +[MakerNotes, Pentax, Camera] 55 - Color Space: sRGB +[MakerNotes, Pentax, Camera] 61 - Data Scaling: 8192 +[MakerNotes, Pentax, Camera] 62 - Preview Image Borders: 28 28 0 0 +[MakerNotes, Pentax, Camera] 0 - Lens Type: Sigma or Tamron Lens (3 44) +[MakerNotes, Pentax, Camera] 64 - Sensitivity Adjust: 0 +[MakerNotes, Pentax, Camera] 65 - Image Edit Count: 0 +[MakerNotes, Pentax, Camera] 71 - Camera Temperature: 12 C +[MakerNotes, Pentax, Camera] 72 - AE Lock: Off +[MakerNotes, Pentax, Camera] 73 - Noise Reduction: Off +[MakerNotes, Pentax, Camera] 77 - Flash Exposure Comp: 0 +[MakerNotes, Pentax, Camera] 79 - Image Tone: Natural +[MakerNotes, Pentax, Camera] 0 - SR Result: Stabilized +[MakerNotes, Pentax, Camera] 1 - Shake Reduction: On +[MakerNotes, Pentax, Camera] 2 - SR Half Press Time: 1.53 s +[MakerNotes, Pentax, Camera] 3 - SR Focal Length: 10 mm +[MakerNotes, Pentax, Camera] 93 - Shutter Count: 1648 +[MakerNotes, Pentax, Camera] 98 - Raw Development Process: 1 (K10D,K200D,K2000,K-m) +[MakerNotes, Pentax, Camera] 512 - Black Point: 0 0 0 0 +[MakerNotes, Pentax, Camera] 513 - White Point: 13568 8192 8192 9088 +[MakerNotes, Pentax, Camera] 0 - Picture Mode 2: Aperture Priority +[MakerNotes, Pentax, Camera] 1.1 - Program Line: Normal +[MakerNotes, Pentax, Camera] 1.2 - EV Steps: 1/3 EV Steps +[MakerNotes, Pentax, Camera] 1.3 - E-Dial In Program: Tv or Av +[MakerNotes, Pentax, Camera] 1.4 - Aperture Ring Use: Permitted +[MakerNotes, Pentax, Camera] 2 - Flash Options: Wireless (Master) +[MakerNotes, Pentax, Camera] 2.1 - Metering Mode 2: Multi-segment +[MakerNotes, Pentax, Camera] 3 - AF Point Mode: Select +[MakerNotes, Pentax, Camera] 3.1 - Focus Mode 2: AF-S +[MakerNotes, Pentax, Camera] 4 - AF Point Selected 2: Center +[MakerNotes, Pentax, Camera] 6 - ISO Floor: 100 +[MakerNotes, Pentax, Camera] 7 - Drive Mode 2: Single-frame +[MakerNotes, Pentax, Camera] 8 - Exposure Bracket Step Size: 0.3 +[MakerNotes, Pentax, Camera] 9 - Bracket Shot Number: n/a +[MakerNotes, Pentax, Camera] 10 - White Balance Set: Auto +[MakerNotes, Pentax, Camera] 10.1 - Multiple Exposure Set: Off +[MakerNotes, Pentax, Camera] 13 - Raw And Jpg Recording: RAW+JPEG (PEF, Better) +[MakerNotes, Pentax, Camera] 14.1 - Jpg Recorded Pixels: 6 MP +[MakerNotes, Pentax, Camera] 16 - Flash Options 2: Wireless (Master) +[MakerNotes, Pentax, Camera] 16.1 - Metering Mode 3: Multi-segment +[MakerNotes, Pentax, Camera] 17.1 - SR Active: Yes +[MakerNotes, Pentax, Camera] 17.2 - Rotation: Rotate 270 CW +[MakerNotes, Pentax, Camera] 17.3 - ISO Setting: Manual +[MakerNotes, Pentax, Camera] 17.4 - Sensitivity Steps: 1 EV Steps +[MakerNotes, Pentax, Camera] 18 - Tv Exposure Time Setting: 1/203 +[MakerNotes, Pentax, Camera] 19 - Av Aperture Setting: 12.7 +[MakerNotes, Pentax, Camera] 20 - Sv ISO Setting: 100 +[MakerNotes, Pentax, Camera] 21 - Base Exposure Compensation: +0.7 +[MakerNotes, Pentax, Camera] 0 - AE Exposure Time: 1/101 +[MakerNotes, Pentax, Camera] 1 - AE Aperture: 12.9 +[MakerNotes, Pentax, Camera] 2 - AE ISO: 100 +[MakerNotes, Pentax, Camera] 3 - AE Xv: -0.625 +[MakerNotes, Pentax, Camera] 4 - AEB Xv: 0 +[MakerNotes, Pentax, Camera] 5 - AE Min Exposure Time: 1/3862 +[MakerNotes, Pentax, Camera] 6 - AE Program Mode: Av, B or X +[MakerNotes, Pentax, Camera] 8 - AE Aperture Steps: 28 +[MakerNotes, Pentax, Camera] 9 - AE Max Aperture: 4.0 +[MakerNotes, Pentax, Camera] 10 - AE Max Aperture 2: 4.0 +[MakerNotes, Pentax, Camera] 11 - AE Min Aperture: 23 +[MakerNotes, Pentax, Camera] 12 - AE Metering Mode: Multi-segment +[MakerNotes, Pentax, Camera] 14 - Flash Exposure Comp. Setting: 0 +[MakerNotes, Pentax, Camera] 0 - Lens Type: Sigma or Tamron Lens (3 44) +[MakerNotes, Pentax, Camera] 0.1 - Auto Aperture: On +[MakerNotes, Pentax, Camera] 0.2 - Min Aperture: 22 +[MakerNotes, Pentax, Camera] 0.3 - Lens F Stops: 8.5 +[MakerNotes, Pentax, Camera] 3 - Min Focus Distance: 0.49-0.50 m +[MakerNotes, Pentax, Camera] 3.1 - Focus Range Index: 7 (very far) +[MakerNotes, Pentax, Camera] 9 - Lens Focal Length: 10.0 mm +[MakerNotes, Pentax, Camera] 10 - Nominal Max Aperture: 4.0 +[MakerNotes, Pentax, Camera] 10.1 - Nominal Min Aperture: 23 +[MakerNotes, Pentax, Camera] 14.1 - Max Aperture: 3.9 +[MakerNotes, Pentax, Camera] 0 - Flash Status: Off +[MakerNotes, Pentax, Camera] 1 - Internal Flash Mode: Did not fire, Wireless (Master) +[MakerNotes, Pentax, Camera] 2 - External Flash Mode: Off +[MakerNotes, Pentax, Camera] 3 - Internal Flash Strength: 18 +[MakerNotes, Pentax, Camera] 4 - TTL DA A Up: 0 +[MakerNotes, Pentax, Camera] 5 - TTL DA A Down: 0 +[MakerNotes, Pentax, Camera] 6 - TTL DA B Up: 0 +[MakerNotes, Pentax, Camera] 7 - TTL DA B Down: 0 +[MakerNotes, Pentax, Camera] 24.1 - External Flash Guide Number: n/a +[MakerNotes, Pentax, Camera] 25 - External Flash Exposure Comp: n/a +[MakerNotes, Pentax, Camera] 26 - External Flash Bounce: n/a +[MakerNotes, Pentax, Camera] 521 - AE Metering Segments: 13.5 13.6 13.5 13.2 13.6 15.0 13.8 12.9 13.8 16.4 14.4 13.9 14.4 15.8 14.0 16.0 +[MakerNotes, Pentax, Camera] 522 - Flash Metering Segments: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Pentax, Camera] 523 - Slave Flash Metering Segments: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Pentax, Camera] 525 - WB RGGB Levels Daylight: 13600 8192 8192 8765 +[MakerNotes, Pentax, Camera] 526 - WB RGGB Levels Shade: 16128 8192 8192 6635 +[MakerNotes, Pentax, Camera] 527 - WB RGGB Levels Cloudy: 14560 8192 8192 7782 +[MakerNotes, Pentax, Camera] 528 - WB RGGB Levels Tungsten: 8192 8192 8192 20971 +[MakerNotes, Pentax, Camera] 529 - WB RGGB Levels Fluorescent D: 17376 8192 8192 8847 +[MakerNotes, Pentax, Camera] 530 - WB RGGB Levels Fluorescent N: 14528 8192 8192 10076 +[MakerNotes, Pentax, Camera] 531 - WB RGGB Levels Fluorescent W: 13088 8192 8192 12206 +[MakerNotes, Pentax, Camera] 532 - WB RGGB Levels Flash: 13632 8192 8192 8601 +[MakerNotes, Pentax, Camera] 0 - Pentax Model ID: K10D +[MakerNotes, Pentax, Time] 1 - Manufacture Date: 2007:09:13 +[MakerNotes, Pentax, Camera] 2 - Production Code: 2.1 +[MakerNotes, Pentax, Camera] 4 - Internal Serial Number: 132352 +[MakerNotes, Pentax, Camera] 0.1 - Power Source: Body Battery +[MakerNotes, Pentax, Camera] 1.1 - Body Battery State: Full +[MakerNotes, Pentax, Camera] 1.2 - Grip Battery State: Empty or Missing +[MakerNotes, Pentax, Camera] 2 - Body Battery A/D No Load: 173 (7.6V, 51%) +[MakerNotes, Pentax, Camera] 3 - Body Battery A/D Load: 168 (7.4V, 47%) +[MakerNotes, Pentax, Camera] 4 - Grip Battery A/D No Load: 5 +[MakerNotes, Pentax, Camera] 5 - Grip Battery A/D Load: 1 +[MakerNotes, Pentax, Camera] 4 - AF Predictor: 4 +[MakerNotes, Pentax, Camera] 6 - AF Defocus: 2 +[MakerNotes, Pentax, Camera] 7 - AF Integration Time: 0 ms +[MakerNotes, Pentax, Camera] 11 - AF Points In Focus: Center (horizontal) +[MakerNotes, Pentax, Image] 16 - WB Shift AB: 0 +[MakerNotes, Pentax, Image] 17 - WB Shift GM: 0 +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0300 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-dc, Time] date - Date: 2008:03:02 +[XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: Y, Cb, Cr, - +[XMP, XMP-exif, Camera] FlashFired - Flash Fired: False +[XMP, XMP-exif, Camera] FlashFunction - Flash Function: False +[XMP, XMP-exif, Camera] FlashMode - Flash Mode: Off +[XMP, XMP-exif, Camera] FlashRedEyeMode - Flash Red Eye Mode: False +[XMP, XMP-exif, Camera] FlashReturn - Flash Return: No return detection +[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: R98 - DCF basic file (sRGB) +[XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8 +[XMP, XMP-tiff, Image] Compression - Compression: JPEG (old-style) +[XMP, XMP-tiff, Image] ImageLength - Image Height: 8 +[XMP, XMP-tiff, Image] ImageWidth - Image Width: 8 +[XMP, XMP-tiff, Image] YCbCrPositioning - Y Cb Cr Positioning: Co-sited +[XMP, XMP-tiff, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[Composite, Composite, Image] Exif-Aperture - Aperture: 13.0 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/100 +[Composite, Composite, Camera] XMP-Flash - Flash: Off, Did not fire +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Sigma AF 10-20mm F4-5.6 EX DC +[Composite, Composite, Image] Exif-LightValue - Light Value: 14.0 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.5 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.020 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 100.4 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 10.0 mm (35 mm equivalent: 15.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 0.38 m diff --git a/t/Writer_11.out b/t/Writer_11.out new file mode 100644 index 0000000..f376c97 --- /dev/null +++ b/t/Writer_11.out @@ -0,0 +1,39 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Writer_11_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 3.5 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: a22376bee9f94185aa8b4c238763315f +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0232 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2005:01:19 13:37:22 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: Uncalibrated +[EXIF, GPS, Location] 0 - GPS Version ID: 2.3.0.0 +[EXIF, GPS, Location] 2 - GPS Latitude: 44 deg 14' 12.25" +[IPTC, IPTC, Image] 22 - File Version: 12 +[IPTC, IPTC, Other] 0 - Envelope Record Version: 4 +[IPTC, IPTC, Other] 25 - Keywords: this <<separator>> that +[IPTC, IPTC, Other] 0 - Application Record Version: 4 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-dc, Author] contributor - Contributor: Guess who +[Ducky, Ducky, Image] 1 - Quality: 50% +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/Writer_13.out b/t/Writer_13.out new file mode 100644 index 0000000..3bb394a --- /dev/null +++ b/t/Writer_13.out @@ -0,0 +1,166 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Writer_13_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 5.3 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS DIGITAL REBEL +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/64 +[EXIF, ExifIFD, Image] 33437 - F Number: 3.6 +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0232 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:11:10 17:39:26 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 24.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41992 - Contrast: High +[EXIF, ExifIFD, Camera] 41993 - Saturation: High +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Hard +[EXIF, ExifIFD, Image] 42032 - Owner Name: Phil Harvey +[EXIF, ExifIFD, Image] 42033 - Serial Number: 0560018150 +[MakerNotes, Canon, Camera] 1 - Macro Mode: Unknown (0) +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: On +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Continuous +[MakerNotes, Canon, Camera] 7 - Focus Mode: AI Focus AF +[MakerNotes, Canon, Camera] 9 - Record Mode: CRW+THM +[MakerNotes, Canon, Camera] 10 - Canon Image Size: Large +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: Unknown (-1) +[MakerNotes, Canon, Camera] 13 - Contrast: +1 +[MakerNotes, Canon, Camera] 14 - Saturation: +1 +[MakerNotes, Canon, Camera] 15 - Sharpness: +1 +[MakerNotes, Canon, Camera] 16 - Camera ISO: n/a +[MakerNotes, Canon, Camera] 17 - Metering Mode: Evaluative +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 19 - AF Point: Manual AF point selection +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Program AE +[MakerNotes, Canon, Camera] 22 - Lens Type: n/a +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 55 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 18 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 3.6 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 22 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: E-TTL, Built-in +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 3072 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 3072 +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, Canon, Image] 1 - Focal Length: 24 mm +[MakerNotes, Canon, Image] 2 - Focal Plane X Size: 23.22 mm +[MakerNotes, Canon, Image] 3 - Focal Plane Y Size: 15.49 mm +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 100 +[MakerNotes, Canon, Image] 3 - Measured EV: 0.00 +[MakerNotes, Canon, Image] 4 - Target Aperture: 3.6 +[MakerNotes, Canon, Image] 5 - Target Exposure Time: 1/60 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: +2/3 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 19 - Focus Distance Upper: 1.42 m +[MakerNotes, Canon, Image] 20 - Focus Distance Lower: 1.19 m +[MakerNotes, Canon, Image] 21 - F Number: 3.6 +[MakerNotes, Canon, Image] 22 - Exposure Time: 1/64 +[MakerNotes, Canon, Image] 23 - Measured EV 2: -0.125 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 0 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS Mid-range +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 29 - Self Timer 2: 0 +[MakerNotes, Canon, Image] 6 - Canon Image Type: CRW:EOS DIGITAL REBEL CMOS RAW +[MakerNotes, Canon, Camera] 7 - Canon Firmware Version: Firmware Version 1.1.1 +[MakerNotes, Canon, Image] 8 - File Number: 116-1602 +[MakerNotes, Canon, Camera] 9 - Owner Name: Phil Harvey +[MakerNotes, Canon, Camera] 12 - Serial Number: 0560018150 +[MakerNotes, Canon, Camera] 16 - Canon Model ID: EOS Digital Rebel / 300D / Kiss Digital +[MakerNotes, Canon, Camera] 0 - Num AF Points: 7 +[MakerNotes, Canon, Camera] 1 - Valid AF Points: 7 +[MakerNotes, Canon, Image] 2 - Canon Image Width: 3072 +[MakerNotes, Canon, Image] 3 - Canon Image Height: 2048 +[MakerNotes, Canon, Camera] 4 - AF Image Width: 3072 +[MakerNotes, Canon, Camera] 5 - AF Image Height: 2048 +[MakerNotes, Canon, Camera] 6 - AF Area Width: 151 +[MakerNotes, Canon, Camera] 7 - AF Area Height: 151 +[MakerNotes, Canon, Camera] 8 - AF Area X Positions: 1014 608 0 0 0 -608 -1014 +[MakerNotes, Canon, Camera] 9 - AF Area Y Positions: 0 0 -506 0 506 0 0 +[MakerNotes, Canon, Camera] 10 - AF Points In Focus: 3 +[MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 7 112 +[MakerNotes, Canon, Camera] 21 - Serial Number Format: Format 1 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Camera] 1 - WB RGGB Levels Auto: 1740 832 831 931 +[MakerNotes, Canon, Camera] 5 - WB RGGB Levels Daylight: 1722 832 831 989 +[MakerNotes, Canon, Camera] 9 - WB RGGB Levels Shade: 2035 832 831 839 +[MakerNotes, Canon, Camera] 13 - WB RGGB Levels Cloudy: 1878 832 831 903 +[MakerNotes, Canon, Camera] 17 - WB RGGB Levels Tungsten: 1228 913 912 1668 +[MakerNotes, Canon, Camera] 21 - WB RGGB Levels Fluorescent: 1506 842 841 1381 +[MakerNotes, Canon, Camera] 25 - WB RGGB Levels Flash: 1964 832 831 877 +[MakerNotes, Canon, Camera] 29 - WB RGGB Levels Custom: 1722 832 831 989 +[MakerNotes, Canon, Camera] 33 - WB RGGB Levels Kelvin: 1722 832 831 988 +[MakerNotes, Canon, Camera] 37 - WB RGGB Black Levels: 125 124 125 124 +[MakerNotes, Canon, Camera] 1 - Measured RGGB: 554 1022 1026 754 +[MakerNotes, Canon, Camera] 174 - Color Temperature: 5200 +[MakerNotes, Canon, Camera] 180 - Color Space: sRGB +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-getty, Image] OriginalFilename - Original File Name: CRW_1602.CRW +[XMP, XMP-aux, Camera] Lens - Lens: 18.0 - 55.0 mm +[XMP, XMP-dc, Image] description - Description: CRW with embedded XMP +[XMP, XMP-pmi, Image] sequenceNumber - Sequence Number: 0 +[XMP, XMP-tiff, Image] ImageLength - Image Height: 2048 +[XMP, XMP-tiff, Image] ImageWidth - Image Width: 3072 +[XMP, XMP-crs, Image] Temperature - Color Temperature: 5200 +[Composite, Composite, Camera] Canon-ConditionalFEC - Flash Exposure Compensation: +2/3 +[Composite, Composite, Camera] Canon-DriveMode - Drive Mode: Continuous Shooting +[Composite, Composite, Camera] Canon-FlashType - Flash Type: Built-In Flash +[Composite, Composite, Camera] Canon-ISO - ISO: 100 +[Composite, Composite, Camera] Canon-Lens - Lens: 18.0 - 55.0 mm +[Composite, Composite, Camera] Canon-RedEyeReduction - Red Eye Reduction: Off +[Composite, Composite, Camera] Canon-ShootingMode - Shooting Mode: Program AE +[Composite, Composite, Camera] Canon-ShutterCurtainHack - Shutter Curtain Sync: 1st-curtain sync +[Composite, Composite, Camera] Canon-WB_RGGBLevels - WB RGGB Levels: 1740 832 831 931 +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.6 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/64 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.119663 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Unknown 18-55mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.7 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 2.092604 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.6 +[Composite, Composite, Camera] Canon-Lens35efl - Lens: 18.0 - 55.0 mm (35 mm equivalent: 27.9 - 85.3 mm) +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.019 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: 0.42 m (1.13 - 1.54 m) +[Composite, Composite, Image] Exif-FOV - Field Of View: 51.6 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 24.0 mm (35 mm equivalent: 37.2 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 8.25 m diff --git a/t/Writer_14.out b/t/Writer_14.out new file mode 100644 index 0000000..b064808 --- /dev/null +++ b/t/Writer_14.out @@ -0,0 +1,69 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Writer_14_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 1253 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:07:29 09:04:23-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:23-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2020:07:29 09:04:23-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS DIGITAL REBEL +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:04 06:46:52 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 4 +[EXIF, ExifIFD, Image] 33437 - F Number: 14.0 +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 9 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 0 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 14.0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 4.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Average +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 34.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 160 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 120 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: THM - DCF thumbnail file +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, InteropIFD, Image] 4097 - Related Image Width: 3072 +[EXIF, InteropIFD, Image] 4098 - Related Image Height: 2048 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3443.946188 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3442.016807 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[Composite, Composite, Image] Exif-Aperture - Aperture: 14.0 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 4 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-LightValue - Light Value: 5.6 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.6 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.019 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 36.9 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 34.0 mm (35 mm equivalent: 54.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 4.37 m diff --git a/t/Writer_15.out b/t/Writer_15.out new file mode 100644 index 0000000..00c9dcf --- /dev/null +++ b/t/Writer_15.out @@ -0,0 +1,175 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Writer_15_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 2.5 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] Comment - Comment: OLYMPUS_OPTICAL_CO_LTD {cool, huh?} +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS DIGITAL REBEL +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: v951p-80 +[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:04 06:46:52 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/30 +[EXIF, ExifIFD, Image] 33437 - F Number: 2.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 1999:12:06 16:38:40 +[EXIF, ExifIFD, Time] 36868 - Create Date: 1999:12:06 16:38:40 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 9 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 0 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 14.0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 7.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 640 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 480 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: THM - DCF thumbnail file +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, InteropIFD, Image] 4097 - Related Image Width: 3072 +[EXIF, InteropIFD, Image] 4098 - Related Image Height: 2048 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3443.946188 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3442.016807 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[MakerNotes, Canon, Camera] 1 - Macro Mode: Unknown (0) +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Continuous +[MakerNotes, Canon, Camera] 7 - Focus Mode: Manual Focus (3) +[MakerNotes, Canon, Camera] 9 - Record Mode: CRW+THM +[MakerNotes, Canon, Camera] 10 - Canon Image Size: Large +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: Unknown (-1) +[MakerNotes, Canon, Camera] 13 - Contrast: +1 +[MakerNotes, Canon, Camera] 14 - Saturation: +1 +[MakerNotes, Canon, Camera] 15 - Sharpness: +1 +[MakerNotes, Canon, Camera] 16 - Camera ISO: n/a +[MakerNotes, Canon, Camera] 17 - Metering Mode: Center-weighted average +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Manual +[MakerNotes, Canon, Camera] 22 - Lens Type: n/a +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 55 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 18 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 4 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 27 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: (none) +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 3072 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 3072 +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, Canon, Image] 1 - Focal Length: 34 mm +[MakerNotes, Canon, Image] 2 - Focal Plane X Size: 23.22 mm +[MakerNotes, Canon, Image] 3 - Focal Plane Y Size: 15.49 mm +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 100 +[MakerNotes, Canon, Image] 3 - Measured EV: -1.25 +[MakerNotes, Canon, Image] 4 - Target Aperture: 14 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 19 - Focus Distance Upper: inf +[MakerNotes, Canon, Image] 20 - Focus Distance Lower: 5.46 m +[MakerNotes, Canon, Image] 21 - F Number: 14 +[MakerNotes, Canon, Image] 22 - Exposure Time: 128 +[MakerNotes, Canon, Image] 23 - Measured EV 2: -1.25 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 4 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS Mid-range +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 29 - Self Timer 2: 0 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Image] 6 - Canon Image Type: CRW:EOS DIGITAL REBEL CMOS RAW +[MakerNotes, Canon, Camera] 7 - Canon Firmware Version: Firmware Version 1.1.1 +[MakerNotes, Canon, Camera] 12 - Serial Number: 0560018150 +[MakerNotes, Canon, Camera] 21 - Serial Number Format: Format 1 +[MakerNotes, Canon, Image] 8 - File Number: 118-1861 +[MakerNotes, Canon, Camera] 9 - Owner Name: Phil Harvey +[MakerNotes, Canon, Camera] 16 - Canon Model ID: EOS Digital Rebel / 300D / Kiss Digital +[MakerNotes, Canon, Image] 14 - Canon File Length: 4480822 +[MakerNotes, Canon, Camera] 1 - Measured RGGB: 998 1022 1026 808 +[MakerNotes, Canon, Camera] 1 - WB RGGB Levels Auto: 1719 832 831 990 +[MakerNotes, Canon, Camera] 5 - WB RGGB Levels Daylight: 1722 832 831 989 +[MakerNotes, Canon, Camera] 9 - WB RGGB Levels Shade: 2035 832 831 839 +[MakerNotes, Canon, Camera] 13 - WB RGGB Levels Cloudy: 1878 832 831 903 +[MakerNotes, Canon, Camera] 17 - WB RGGB Levels Tungsten: 1228 913 912 1668 +[MakerNotes, Canon, Camera] 21 - WB RGGB Levels Fluorescent: 1506 842 841 1381 +[MakerNotes, Canon, Camera] 25 - WB RGGB Levels Flash: 1933 832 831 895 +[MakerNotes, Canon, Camera] 29 - WB RGGB Levels Custom: 1722 832 831 989 +[MakerNotes, Canon, Camera] 33 - WB RGGB Levels Kelvin: 1722 832 831 988 +[MakerNotes, Canon, Camera] 37 - WB RGGB Black Levels: 124 123 124 123 +[MakerNotes, Canon, Camera] 174 - Color Temperature: 5200 +[MakerNotes, Canon, Camera] 180 - Color Space: sRGB +[MakerNotes, Canon, Camera] 0 - Num AF Points: 7 +[MakerNotes, Canon, Camera] 1 - Valid AF Points: 7 +[MakerNotes, Canon, Image] 2 - Canon Image Width: 3072 +[MakerNotes, Canon, Image] 3 - Canon Image Height: 2048 +[MakerNotes, Canon, Camera] 4 - AF Image Width: 3072 +[MakerNotes, Canon, Camera] 5 - AF Image Height: 2048 +[MakerNotes, Canon, Camera] 6 - AF Area Width: 151 +[MakerNotes, Canon, Camera] 7 - AF Area Height: 151 +[MakerNotes, Canon, Camera] 8 - AF Area X Positions: 1014 608 0 0 0 -608 -1014 +[MakerNotes, Canon, Camera] 9 - AF Area Y Positions: 0 0 -506 0 506 0 0 +[MakerNotes, Canon, Camera] 10 - AF Points In Focus: (none) +[MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 7 112 +[Composite, Composite, Camera] Canon-DriveMode - Drive Mode: Continuous Shooting +[Composite, Composite, Camera] Canon-ISO - ISO: 100 +[Composite, Composite, Camera] Canon-Lens - Lens: 18.0 - 55.0 mm +[Composite, Composite, Camera] Canon-ShootingMode - Shooting Mode: Bulb +[Composite, Composite, Camera] Canon-WB_RGGBLevels - WB RGGB Levels: 1719 832 831 990 +[Composite, Composite, Image] Exif-Aperture - Aperture: 2.0 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 4 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.190619 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Unknown 18-55mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 0.0 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 2.067348 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.6 +[Composite, Composite, Camera] Canon-Lens35efl - Lens: 18.0 - 55.0 mm (35 mm equivalent: 28.6 - 87.4 mm) +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.019 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: inf (1.29 m - inf) +[Composite, Composite, Image] Exif-FOV - Field Of View: 116.6 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 7.0 mm (35 mm equivalent: 11.1 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 1.30 m diff --git a/t/Writer_16.out b/t/Writer_16.out new file mode 100644 index 0000000..fd4c8a8 --- /dev/null +++ b/t/Writer_16.out @@ -0,0 +1 @@ +[XMP, XMP-tiff, Image] XResolution - X Resolution: 72 diff --git a/t/Writer_17.out b/t/Writer_17.out new file mode 100644 index 0000000..8543981 --- /dev/null +++ b/t/Writer_17.out @@ -0,0 +1 @@ +[XMP, XMP-tiff, Image] XResolution - X Resolution: 300 diff --git a/t/Writer_18.out b/t/Writer_18.out new file mode 100644 index 0000000..09a0094 --- /dev/null +++ b/t/Writer_18.out @@ -0,0 +1,3 @@ +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[XMP, XMP-tiff, Image] XResolution - X Resolution: 300 diff --git a/t/Writer_19.out b/t/Writer_19.out new file mode 100644 index 0000000..edfe80d --- /dev/null +++ b/t/Writer_19.out @@ -0,0 +1,36 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Writer_19_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 553 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:07:29 09:04:23-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:23-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2020:07:29 09:04:23-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 780195eb135f878e7864b2564f1dfc9a +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Author] 315 - Artist: Phil +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Author] 315 - Artist: Harvey +[EXIF, ExifIFD, Image] 34855 - ISO: 25 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0232 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2006:03:27 16:25:00 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: Uncalibrated +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Hard +[IPTC, IPTC, Other] 25 - Keywords: one, two +[IPTC, IPTC, Other] 0 - Application Record Version: 4 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/Writer_2.out b/t/Writer_2.out new file mode 100644 index 0000000..72b795d --- /dev/null +++ b/t/Writer_2.out @@ -0,0 +1,172 @@ +AEBBracketValue: 0 +AFAreaHeight: 151 +AFAreaWidth: 151 +AFAreaXPositions: 1014 608 0 0 0 -608 -1014 +AFAreaYPositions: 0 0 -506 0 506 0 0 +AFImageHeight: 2048 +AFImageWidth: 3072 +AFPointsInFocus: (none) +Aperture: 14.0 +ApertureValue: 14.0 +AutoExposureBracketing: Off +AutoISO: 100 +AutoRotate: None +BaseISO: 100 +BitsPerSample: 8 +BlueBalance: 1.190619 +BracketMode: Off +BracketShotNumber: 0 +BracketValue: 0 +BulbDuration: 4 +CameraISO: n/a +CameraType: EOS Mid-range +CanonExposureMode: Manual +CanonFileLength: 4480822 +CanonFirmwareVersion: Firmware Version 1.1.1 +CanonFlashMode: Off +CanonImageHeight: 2048 +CanonImageSize: Large +CanonImageType: CRW:EOS DIGITAL REBEL CMOS RAW +CanonImageWidth: 3072 +CanonModelID: EOS Digital Rebel / 300D / Kiss Digital +CircleOfConfusion: 0.019 mm +ColorComponents: 3 +ColorSpace: sRGB +ColorSpace (1): sRGB +ColorTemperature: 5200 +ColorTone: Normal +Comment: New comment in JPG file +ComponentsConfiguration: Y, Cb, Cr, - +CompressedBitsPerPixel: 9 +ContinuousDrive: Continuous +Contrast: +1 +ControlMode: Camera Local Control +CreateDate: 2003:12:04 06:46:52 +CustomRendered: Normal +DOF: inf (4.31 m - inf) +DateTimeOriginal: 2003:12:04 06:46:52 +DigitalZoom: Unknown (-1) +Directory: t +DriveMode: Continuous Shooting +EasyMode: Manual +EncodingProcess: Baseline DCT, Huffman coding +ExifByteOrder: Little-endian (Intel, II) +ExifImageHeight: 120 +ExifImageWidth: 160 +ExifToolVersion: 12.42 +ExifVersion: 0221 +ExposureCompensation: 0 +ExposureCompensation (1): 0 +ExposureMode: Manual +ExposureTime: 4 +ExposureTime (1): 128 +FNumber: 14.0 +FNumber (1): 14 +FOV: 36.9 deg +FileAccessDate: 2022:06:01 14:16:53-04:00 +FileInodeChangeDate: 2022:06:01 14:16:53-04:00 +FileModifyDate: 2022:06:01 14:16:53-04:00 +FileName: Writer_2_failed.jpg +FileNumber: 118-1861 +FilePermissions: -rw-r--r-- +FileSize: 2.7 kB +FileSource: Digital Camera +FileType: JPEG +FileTypeExtension: jpg +Flash: No Flash +FlashActivity: 0 +FlashBits: (none) +FlashExposureComp: 0 +FlashGuideNumber: 0 +FlashpixVersion: 0100 +FocalLength: 34.0 mm +FocalLength (1): 34 mm +FocalLength35efl: 34.0 mm (35 mm equivalent: 54.0 mm) +FocalPlaneResolutionUnit: inches +FocalPlaneXResolution: 3443.946188 +FocalPlaneXSize: 23.22 mm +FocalPlaneYResolution: 3442.016807 +FocalPlaneYSize: 15.49 mm +FocalUnits: 1/mm +FocusDistanceLower: 5.46 m +FocusDistanceUpper: inf +FocusMode: Manual Focus (3) +FocusRange: Not Known +HyperfocalDistance: 4.37 m +ISO: 100 +ISO (1): 100 +ImageHeight: 8 +ImageSize: 8x8 +ImageWidth: 8 +InteropIndex: THM - DCF thumbnail file +InteropVersion: 0100 +Lens: 18.0 - 55.0 mm +Lens35efl: 18.0 - 55.0 mm (35 mm equivalent: 28.6 - 87.4 mm) +LensID: Unknown 18-55mm +LensType: n/a +LightValue: 5.6 +MIMEType: image/jpeg +MacroMode: Unknown (0) +Make: Canon +ManualFlashOutput: n/a +MaxAperture: 4 +MaxApertureValue: 4.5 +MaxFocalLength: 55 mm +MeasuredEV: -1.25 +MeasuredEV2: -1.25 +MeasuredRGGB: 998 1022 1026 808 +Megapixels: 0.000064 +MeteringMode: Center-weighted average +MeteringMode (1): Average +MinAperture: 27 +MinFocalLength: 18 mm +Model: Canon EOS DIGITAL REBEL +ModifyDate: 2003:12:04 06:46:52 +NDFilter: n/a +NumAFPoints: 7 +OpticalZoomCode: n/a +Orientation: Horizontal (normal) +OwnerName: Phil Harvey +Quality: RAW +RecordMode: CRW+THM +RedBalance: 2.067348 +RelatedImageHeight: 2048 +RelatedImageWidth: 3072 +ResolutionUnit: inches +Saturation: +1 +ScaleFactor35efl: 1.6 +SceneCaptureType: Standard +SelfTimer: Off +SelfTimer2: 0 +SensingMethod: One-chip color area +SequenceNumber: 0 +SerialNumber: 0560018150 +SerialNumberFormat: Format 1 +Sharpness: +1 +ShootingMode: Bulb +ShutterSpeed: 4 +ShutterSpeedValue: 0 +SlowShutter: None +TargetAperture: 14 +ThumbnailImageValidArea: 0 159 7 112 +UserComment: +ValidAFPoints: 7 +WB_RGGBBlackLevels: 124 123 124 123 +WB_RGGBLevels: 1719 832 831 990 +WB_RGGBLevelsAuto: 1719 832 831 990 +WB_RGGBLevelsCloudy: 1878 832 831 903 +WB_RGGBLevelsCustom: 1722 832 831 989 +WB_RGGBLevelsDaylight: 1722 832 831 989 +WB_RGGBLevelsFlash: 1933 832 831 895 +WB_RGGBLevelsFluorescent: 1506 842 841 1381 +WB_RGGBLevelsKelvin: 1722 832 831 988 +WB_RGGBLevelsShade: 2035 832 831 839 +WB_RGGBLevelsTungsten: 1228 913 912 1668 +WhiteBalance: Auto +WhiteBalance (1): Auto +XResolution: 180 +YCbCrPositioning: Centered +YCbCrSubSampling: YCbCr4:2:0 (2 2) +YResolution: 180 +ZoomSourceWidth: 3072 +ZoomTargetWidth: 3072 diff --git a/t/Writer_22.out b/t/Writer_22.out new file mode 100644 index 0000000..4febb8e --- /dev/null +++ b/t/Writer_22.out @@ -0,0 +1,4 @@ +[EXIF, IFD0, Time] 306 - Modify Date: 2006:03:26 12:40:46 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 19:38:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2000:10:31 18:36:41 +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2002:06:26 diff --git a/t/Writer_24.out b/t/Writer_24.out new file mode 100644 index 0000000..74fc7dd --- /dev/null +++ b/t/Writer_24.out @@ -0,0 +1 @@ +[File, File, Image] Comment - Comment: ISO=100 Aperture=3.5 Exposure=1/64 diff --git a/t/Writer_25.out b/t/Writer_25.out new file mode 100644 index 0000000..8ee8a06 --- /dev/null +++ b/t/Writer_25.out @@ -0,0 +1,40 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Writer_25_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 621 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:07:29 09:04:24-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:23-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2020:07:29 09:04:24-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: NIKON +[EXIF, IFD0, Camera] 272 - Camera Model Name: E775 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 300 +[EXIF, IFD0, Image] 283 - Y Resolution: 300 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: E775v1.3u +[EXIF, IFD0, Time] 306 - Modify Date: 2001:08:01 12:57:23 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33437 - F Number: 25.0 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0232 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: Uncalibrated +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 300 +[EXIF, IFD1, Image] 283 - Y Resolution: 300 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[Composite, Composite, Image] Exif-Aperture - Aperture: 25.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/Writer_26.out b/t/Writer_26.out new file mode 100644 index 0000000..ce94374 --- /dev/null +++ b/t/Writer_26.out @@ -0,0 +1,34 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Writer_26_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 535 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:07:29 09:04:24-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:24-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2020:07:29 09:04:24-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: NIKON +[EXIF, IFD0, Camera] 272 - Camera Model Name: E775 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 300 +[EXIF, IFD0, Image] 283 - Y Resolution: 300 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: E775v1.3u +[EXIF, IFD0, Time] 306 - Modify Date: 2001:08:01 12:57:23 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 300 +[EXIF, IFD1, Image] 283 - Y Resolution: 300 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/Writer_27.out b/t/Writer_27.out new file mode 100644 index 0000000..ce7237d --- /dev/null +++ b/t/Writer_27.out @@ -0,0 +1,14 @@ +[JFIF, JFIF, Image] 3 - X Resolution: 144 +[JFIF, JFIF, Image] 5 - Y Resolution: 144 +[EXIF, IFD0, Image] 282 - X Resolution: 144 +[EXIF, IFD0, Image] 283 - Y Resolution: 144 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2000:01:02 03:04:05 +[EXIF, IFD0, Image] 282 - X Resolution: 144 +[EXIF, IFD0, Image] 283 - Y Resolution: 144 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2000:01:02 03:04:05 +[APP8, SPIFF, Image] 18 - Y Resolution: 300 +[APP8, SPIFF, Image] 22 - X Resolution: 300 +[MakerNotes, CIFF, Time] 0 - Date/Time Original: 1998:05:01 21:33:18 +[APP12, PictureInfo, Time] TimeDate - Date/Time Original: 1998:12:31 15:17:20 +[Photoshop, Photoshop, Image] 0 - X Resolution: 72 +[Photoshop, Photoshop, Image] 4 - Y Resolution: 72 diff --git a/t/Writer_28.out b/t/Writer_28.out new file mode 100644 index 0000000..0b13f28 --- /dev/null +++ b/t/Writer_28.out @@ -0,0 +1 @@ +[File, System, Other] FileName - File Name: Writer_28_failed.jpg diff --git a/t/Writer_29.out b/t/Writer_29.out new file mode 100644 index 0000000..b5cf7d5 --- /dev/null +++ b/t/Writer_29.out @@ -0,0 +1,2 @@ +[File, System, Other] FileName - File Name: Writer_29_failed.jpg +[EXIF, ExifIFD, Image] 34855 - ISO: 200 diff --git a/t/Writer_30.out b/t/Writer_30.out new file mode 100644 index 0000000..7493b72 --- /dev/null +++ b/t/Writer_30.out @@ -0,0 +1,2 @@ +[File, System, Other] FileName - File Name: Writer_30_failed.jpg +[EXIF, IFD0, Image] 34855 - ISO: 100 diff --git a/t/Writer_31.out b/t/Writer_31.out new file mode 100644 index 0000000..fab652f --- /dev/null +++ b/t/Writer_31.out @@ -0,0 +1,109 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[ExifTool, ExifTool, ExifTool] Warning - Warning: IPTCDigest is not current. XMP may be out of sync +[File, System, Other] FileName - File Name: Writer_31_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 3.0 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 6895be53ef9a287520f400aa17242c09 +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: A witty caption +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2004:02:26 09:36:46 +[EXIF, IFD0, Author] 315 - Artist: Phil Harvey +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: Copyright 2004 Phil Harvey +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1.6 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 100 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 80 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: A witty caption +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it +[IPTC, IPTC, Other] 105 - Headline: No headline +[IPTC, IPTC, Other] 40 - Special Instructions: What instructions +[IPTC, IPTC, Author] 80 - By-line: Phil Harvey +[IPTC, IPTC, Author] 85 - By-line Title: My Position +[IPTC, IPTC, Author] 110 - Credit: My Credit +[IPTC, IPTC, Other] 5 - Object Name: Test IPTC picture +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ont +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 103 - Original Transmission Reference: What is a transmission reference +[IPTC, IPTC, Other] 15 - Category: 1 +[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing, image, utilities +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright 2004 Phil Harvey +[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Author] 115 - Source: I'm the source +[IPTC, IPTC, Other] 25 - Keywords: jambalaya +[Photoshop, Photoshop, Image] 1061 - IPTC Digest: 05ad1770b1a95f1f9788ac995fa647da +[Photoshop, Photoshop, Image] 0 - X Resolution: 72 +[Photoshop, Photoshop, Image] 2 - Displayed Units X: inches +[Photoshop, Photoshop, Image] 4 - Y Resolution: 72 +[Photoshop, Photoshop, Image] 6 - Displayed Units Y: inches +[Photoshop, Photoshop, Image] 0 - Print Style: Centered +[Photoshop, Photoshop, Image] 2 - Print Position: 0 0 +[Photoshop, Photoshop, Image] 10 - Print Scale: 1 +[Photoshop, Photoshop, Image] 1037 - Global Angle: 30 +[Photoshop, Photoshop, Image] 1049 - Global Altitude: 30 +[Photoshop, Photoshop, Author] 1034 - Copyright Flag: False +[Photoshop, Photoshop, Author] 1035 - URL: https://exiftool.org/ +[Photoshop, Photoshop, Image] 1054 - URL List: +[Photoshop, Photoshop, Other] 20 - Slices Group Name: IPTC +[Photoshop, Photoshop, Other] 24 - Num Slices: 1 +[Photoshop, Photoshop, Image] 4 - Has Real Merged Data: Yes +[Photoshop, Photoshop, Image] 5 - Writer Name: Adobe Photoshop +[Photoshop, Photoshop, Image] 9 - Reader Name: Adobe Photoshop 7.0 +[Photoshop, Photoshop, Image] 0 - Photoshop Quality: 7 +[Photoshop, Photoshop, Image] 1 - Photoshop Format: Standard +[Photoshop, Photoshop, Image] 2 - Progressive Scans: 3 Scans +[APP14, Adobe, Image] 0 - DCT Encode Version: 100 +[APP14, Adobe, Image] 1 - APP14 Flags 0: (none) +[APP14, Adobe, Image] 2 - APP14 Flags 1: (none) +[APP14, Adobe, Image] 3 - Color Transform: YCbCr +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/64 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.6 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 6.0 mm diff --git a/t/Writer_32.out b/t/Writer_32.out new file mode 100644 index 0000000..3178224 --- /dev/null +++ b/t/Writer_32.out @@ -0,0 +1,3 @@ +[ICC_Profile, ICC_Profile, Image] ICC_Profile - ICC Profile: (Binary data 3144 bytes) +[EXIF, IFD0, Image] 50831 - As Shot ICC Profile: (Binary data 31 bytes) +[EXIF, IFD0, Image] 50833 - Current ICC Profile: (Binary data 33 bytes) diff --git a/t/Writer_33.out b/t/Writer_33.out new file mode 100644 index 0000000..89a0d12 --- /dev/null +++ b/t/Writer_33.out @@ -0,0 +1,3 @@ +[ICC_Profile, ICC_Profile, Image] ICC_Profile - ICC Profile: (Binary data 39 bytes) +[EXIF, IFD0, Image] 50831 - As Shot ICC Profile: (Binary data 31 bytes) +[EXIF, IFD0, Image] 50833 - Current ICC Profile: (Binary data 33 bytes) diff --git a/t/Writer_34.out b/t/Writer_34.out new file mode 100644 index 0000000..c3c9b56 --- /dev/null +++ b/t/Writer_34.out @@ -0,0 +1,3 @@ +[XMP, XMP-dc, Image] subject - Subject: [ExifTool,Test,IPTC] +[XMP, XMP-lr, Image] hierarchicalSubject - Hierarchical Subject: [IPTC.jpg,ExifTool,Test,IPTC] +[File, File, Image] Comment - Comment: ExifTool, Test, IPTC diff --git a/t/Writer_35.out b/t/Writer_35.out new file mode 100644 index 0000000..e45e1d6 --- /dev/null +++ b/t/Writer_35.out @@ -0,0 +1,184 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Writer_35_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 9.7 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: d624fa41e4169333a86729e3c275f95a +[File, File, Image] Comment - Comment: © PhotoStudio Unicode comment;; +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: A witty caption +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2004:02:26 09:36:46 +[EXIF, IFD0, Author] 315 - Artist: Phil Harvey +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, IFD0, Author] 33432 - Copyright: Copyright 2004 Phil Harvey +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 100 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 80 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 5 - Object Name: Test IPTC picture +[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Other] 15 - Category: 1 +[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing, image, utilities +[IPTC, IPTC, Other] 25 - Keywords: jambalaya +[IPTC, IPTC, Other] 40 - Special Instructions: What instructions +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC, Author] 80 - By-line: Phil Harvey +[IPTC, IPTC, Author] 85 - By-line Title: My Position +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ont +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 103 - Original Transmission Reference: What is a transmission reference +[IPTC, IPTC, Other] 105 - Headline: No headline +[IPTC, IPTC, Author] 110 - Credit: My Credit +[IPTC, IPTC, Author] 115 - Source: I'm the source +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright 2004 Phil Harvey +[IPTC, IPTC, Other] 120 - Caption-Abstract: A witty caption +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it +[Photoshop, Photoshop, Author] 1034 - Copyright Flag: False +[Photoshop, Photoshop, Author] 1035 - URL: https://exiftool.org/ +[Photoshop, Photoshop, Image] 1037 - Global Angle: 30 +[Photoshop, Photoshop, Image] 1049 - Global Altitude: 30 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: UTF-16 (big-endian) encoded XMP +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP +[XMP, XMP-dc, Image] title - Title: Test IPTC picture +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: My Position +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: I wrote it +[XMP, XMP-photoshop, Image] Category - Category: 1 +[XMP, XMP-photoshop, Location] City - City: Kingston +[XMP, XMP-photoshop, Location] Country - Country: Canada +[XMP, XMP-photoshop, Author] Credit - Credit: My Credit +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2004:02:26 +[XMP, XMP-photoshop, Image] Headline - Headline: No headline +[XMP, XMP-photoshop, Image] Instructions - Instructions: What instructions +[XMP, XMP-photoshop, Author] Source - Source: I'm the source +[XMP, XMP-photoshop, Location] State - State: Ont +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: amazing, image, utilities +[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: What is a transmission reference? +[XMP, XMP-photoshop, Image] Urgency - Urgency: 8 (least urgent) +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:4cc7b857-69d0-11d8-8ac4-bb59c92f0d9a +[XMP, XMP-xmpRights, Author] Marked - Marked: False +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Adobe Systems Inc. +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.1.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1999:06:03 00:00:00 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Apple Computer Inc. +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: none +[ICC_Profile, ICC-header, Image] 52 - Device Model: +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: Adobe Systems Inc. +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Copyright 1999 Adobe Systems Incorporated +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: Adobe RGB (1998) +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.95045 1 1.08905 +[ICC_Profile, ICC_Profile, Image] bkpt - Media Black Point: 0 0 0 +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.60974 0.31111 0.01947 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.20528 0.62567 0.06087 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.14919 0.06322 0.74457 +[Ducky, Ducky, Author] 3 - Copyright: Copyright 2004 Phil Harvey +[Ducky, Ducky, Image] 1 - Quality: 84% +[APP14, Adobe, Image] 0 - DCT Encode Version: 100 +[APP14, Adobe, Image] 1 - APP14 Flags 0: (none) +[APP14, Adobe, Image] 2 - APP14 Flags 1: (none) +[APP14, Adobe, Image] 3 - Color Transform: YCbCr +[CanonVRD, CanonVRD, Image] 2 - VRD Version: 1.0.0 +[CanonVRD, CanonVRD, Image] 6 - WB Adj RGGB Levels: 0 0 0 0 +[CanonVRD, CanonVRD, Image] 24 - White Balance Adj: Shot Settings +[CanonVRD, CanonVRD, Image] 26 - WB Adj Color Temp: 5600 +[CanonVRD, CanonVRD, Image] 36 - WB Fine Tune Active: No +[CanonVRD, CanonVRD, Image] 40 - WB Fine Tune Saturation: 0 +[CanonVRD, CanonVRD, Image] 44 - WB Fine Tune Tone: 0 +[CanonVRD, CanonVRD, Image] 46 - Raw Color Adj: Shot Settings +[CanonVRD, CanonVRD, Image] 48 - Raw Custom Saturation: 0 +[CanonVRD, CanonVRD, Image] 52 - Raw Custom Tone: 0 +[CanonVRD, CanonVRD, Image] 56 - Raw Brightness Adj: 0.00 +[CanonVRD, CanonVRD, Image] 60 - Tone Curve Property: Shot Settings +[CanonVRD, CanonVRD, Image] 122 - Dynamic Range Min: 0 +[CanonVRD, CanonVRD, Image] 124 - Dynamic Range Max: 4095 +[CanonVRD, CanonVRD, Image] 272 - Tone Curve Active: No +[CanonVRD, CanonVRD, Image] 275 - Tone Curve Mode: RGB +[CanonVRD, CanonVRD, Image] 276 - Brightness Adj: 0 +[CanonVRD, CanonVRD, Image] 277 - Contrast Adj: 0 +[CanonVRD, CanonVRD, Image] 278 - Saturation Adj: 100 +[CanonVRD, CanonVRD, Image] 286 - Color Tone Adj: 0 +[CanonVRD, CanonVRD, Image] 294 - Luminance Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 336 - Luminance Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 345 - Tone Curve Interpolation: Curve +[CanonVRD, CanonVRD, Image] 352 - Red Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 394 - Red Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 410 - Green Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 452 - Green Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 468 - Blue Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 510 - Blue Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 526 - RGB Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 568 - RGB Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 580 - Crop Active: No +[CanonVRD, CanonVRD, Image] 582 - Crop Left: 0 +[CanonVRD, CanonVRD, Image] 584 - Crop Top: 0 +[CanonVRD, CanonVRD, Image] 586 - Crop Width: 0 +[CanonVRD, CanonVRD, Image] 588 - Crop Height: 0 +[CanonVRD, CanonVRD, Image] 602 - Sharpness Adj: 0 +[CanonVRD, CanonVRD, Image] 608 - Crop Aspect Ratio: Free +[CanonVRD, CanonVRD, Image] 610 - Constrained Crop Width: 0 +[CanonVRD, CanonVRD, Image] 614 - Constrained Crop Height: 0 +[CanonVRD, CanonVRD, Image] 618 - Check Mark: Clear +[CanonVRD, CanonVRD, Image] 622 - Rotation: 90 +[CanonVRD, CanonVRD, Image] 624 - Work Color Space: sRGB diff --git a/t/Writer_36.out b/t/Writer_36.out new file mode 100644 index 0000000..beaf14f --- /dev/null +++ b/t/Writer_36.out @@ -0,0 +1,2 @@ +[IPTC, IPTC, Other] 25 - Keywords: in +[IPTC, IPTC, Other] 0 - Application Record Version: 4 diff --git a/t/Writer_37.out b/t/Writer_37.out new file mode 100644 index 0000000..b2f1039 --- /dev/null +++ b/t/Writer_37.out @@ -0,0 +1,2 @@ +[File, System, Other] FileSize - File Size: 2518 +[EXIF, IFD1, Image] 259 - Compression: 6 diff --git a/t/Writer_38.out b/t/Writer_38.out new file mode 100644 index 0000000..9535e5f --- /dev/null +++ b/t/Writer_38.out @@ -0,0 +1,63 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Writer_38_failed.exif +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 2.2 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: EXIF +[File, File, Other] FileTypeExtension - File Type Extension: exif +[File, File, Other] MIMEType - MIME Type: application/unknown +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: SONY +[EXIF, IFD0, Camera] 272 - Camera Model Name: DSC-F828 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:18 13:51:33 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/250 +[EXIF, ExifIFD, Image] 33437 - F Number: 7.1 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 64 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:12:18 13:51:33 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:12:18 13:51:33 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.0 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 12.5 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 3264 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 2448 +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Auto bracket +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41992 - Contrast: Normal +[EXIF, ExifIFD, Camera] 41993 - Saturation: Normal +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Normal +[MakerNotes, Sony, Camera] 8192 - Sony 0x2000: 0 +[MakerNotes, Sony, Camera] 36865 - Sony 0x9001: ..­mQV„ûV„û.³9°9ŠJuÿ.Ŭ]è^Ž¸.[...] +[MakerNotes, Sony, Camera] 36866 - Sony 0x9002: .JÚ`.p.V!.!¾ê¾ê0ÿ0ÿV!ˆPp,×.0c[...] +[MakerNotes, Sony, Camera] 36867 - Sony 0x9003: .ÜsF®&.¡ÒB.¯.....È..ûÙ;›Õ.utN½½½½½½(¶^w’[...] +[MakerNotes, Sony, Camera] 36868 - Sony 0x9004: ..,.,.,.,.ô.ô.ô.ô.ô.ô.ô.ôlêoÄ@.o”.,‚.,Ï.o‰3úM[...] +[MakerNotes, Sony, Camera] 36869 - Sony 0x9005: ..@o........}[...] +[MakerNotes, Sony, Camera] 36870 - Sony 0x9006: .ð™ârï‘.{.•ân‡öGeG‘š‘`zâ[...] +[MakerNotes, Sony, Camera] 36871 - Sony 0x9007: .ç;.|.cçf.VØÌ£.üêbêØ.ßç¶^O[...] +[MakerNotes, Sony, Camera] 36872 - Sony 0x9008: ..ªø..¼·’.³ôi.Þ.Ð@÷.]:þïó•±ö;Žî;ä‚.ÕH[...] +[PrintIM, PrintIM, Printing] PrintIMVersion - PrintIM Version: 0250 +[PrintIM, PrintIM, Printing] 2 - Print IM 0x0002: 0x00000001 +[PrintIM, PrintIM, Printing] 257 - Print IM 0x0101: 0x00000000 +[Composite, Composite, Image] Exif-Aperture - Aperture: 7.1 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/250 +[Composite, Composite, Image] Exif-LightValue - Light Value: 14.3 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 12.5 mm diff --git a/t/Writer_39.out b/t/Writer_39.out new file mode 100644 index 0000000..d5eda01 --- /dev/null +++ b/t/Writer_39.out @@ -0,0 +1,4 @@ +[File, System, Other] FileName - File Name: Writer_39_failed.jpg +[EXIF, IFD0, Image] 282 - X Resolution: 123 +[EXIF, IFD0, Image] 296 - Resolution Unit: cm +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 1999:99:99 99:99:99 diff --git a/t/Writer_4.out b/t/Writer_4.out new file mode 100644 index 0000000..a63990f --- /dev/null +++ b/t/Writer_4.out @@ -0,0 +1,87 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileSize - File Size: 7.8 kB +[File, File, Other] FileType - File Type: TIFF +[File, File, Other] FileTypeExtension - File Type Extension: tif +[File, File, Other] MIMEType - MIME Type: image/tiff +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: e9bf6d2340af45aa812e91745756c524 +[EXIF, IFD0, Image] 254 - Subfile Type: Full-resolution image +[EXIF, IFD0, Image] 256 - Image Width: 160 +[EXIF, IFD0, Image] 257 - Image Height: 120 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD0, Image] 259 - Compression: LZW +[EXIF, IFD0, Image] 262 - Photometric Interpretation: RGB +[EXIF, IFD0, Image] 270 - Image Description: Modified TIFF +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS DIGITAL REBEL +[EXIF, IFD0, Image] 273 - Strip Offsets: 6754 +[EXIF, IFD0, Image] 277 - Samples Per Pixel: 3 +[EXIF, IFD0, Image] 278 - Rows Per Strip: 120 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 1048 +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 284 - Planar Configuration: Chunky +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: GraphicConverter +[EXIF, IFD0, Time] 306 - Modify Date: 2004:02:20 08:07:49 +[EXIF, IFD0, Image] 317 - Predictor: None +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: new XMP info +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: The picture caption +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it +[IPTC, IPTC, Other] 40 - Special Instructions: no instructions +[IPTC, IPTC, Author] 80 - By-line: I'm the author +[IPTC, IPTC, Author] 85 - By-line Title: On top +[IPTC, IPTC, Author] 110 - Credit: Phil Harvey +[IPTC, IPTC, Author] 115 - Source: My camera +[IPTC, IPTC, Other] 5 - Object Name: This is the title +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:20 +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ontario +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 103 - Original Transmission Reference: no reference +[IPTC, IPTC, Other] 25 - Keywords: exiftool, test, picture, another keyword +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright notice +[IPTC, IPTC, Other] 105 - Headline: A different headline +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Linotronic +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.1.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1998:02:09 06:49:00 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Microsoft Corporation +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: Hewlett-Packard +[ICC_Profile, ICC-header, Image] 52 - Device Model: sRGB +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: Hewlett-Packard +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Copyright (c) 1998 Hewlett-Packard Company +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: sRGB IEC61966-2.1 +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.95045 1 1.08905 +[ICC_Profile, ICC_Profile, Image] bkpt - Media Black Point: 0 0 0 +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.43607 0.22249 0.01392 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.38515 0.71687 0.09708 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.14307 0.06061 0.7141 +[ICC_Profile, ICC_Profile, Camera] dmnd - Device Mfg Desc: IEC http://www.iec.ch +[ICC_Profile, ICC_Profile, Camera] dmdd - Device Model Desc: IEC 61966-2.1 Default RGB colour space - sRGB +[ICC_Profile, ICC_Profile, Image] vued - Viewing Cond Desc: Reference Viewing Condition in IEC61966-2.1 +[ICC_Profile, ICC-view, Image] 8 - Viewing Cond Illuminant: 19.6445 20.3718 16.8089 +[ICC_Profile, ICC-view, Image] 20 - Viewing Cond Surround: 3.92889 4.07439 3.36179 +[ICC_Profile, ICC-view, Image] 32 - Viewing Cond Illuminant Type: D50 +[ICC_Profile, ICC_Profile, Image] lumi - Luminance: 76.03647 80 87.12462 +[ICC_Profile, ICC-meas, Image] 8 - Measurement Observer: CIE 1931 +[ICC_Profile, ICC-meas, Image] 12 - Measurement Backing: 0 0 0 +[ICC_Profile, ICC-meas, Image] 24 - Measurement Geometry: Unknown +[ICC_Profile, ICC-meas, Image] 28 - Measurement Flare: 0.999% +[ICC_Profile, ICC-meas, Image] 32 - Measurement Illuminant: D65 +[ICC_Profile, ICC_Profile, Image] tech - Technology: Cathode Ray Tube Display +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 2060 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 2060 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 2060 bytes) +[Composite, Composite, Image] Exif-ImageSize - Image Size: 160x120 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.019 diff --git a/t/Writer_40.out b/t/Writer_40.out new file mode 100644 index 0000000..26ed400 --- /dev/null +++ b/t/Writer_40.out @@ -0,0 +1,4 @@ +[File, System, Other] FileName - File Name: Writer_40_failed.jpg +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:12:04 06:46:52 diff --git a/t/Writer_41.out b/t/Writer_41.out new file mode 100644 index 0000000..b372eee --- /dev/null +++ b/t/Writer_41.out @@ -0,0 +1,3 @@ +[MakerNotes, CIFF, Camera] 2064 - Owner Name: CIFF Write Test +[Meta, MetaIFD, Camera] 50004 - Serial Number: 12345 +[APP12, PictureInfo, Camera] Serial# - Serial Number: #00000001 diff --git a/t/Writer_42.out b/t/Writer_42.out new file mode 100644 index 0000000..04f8e6e --- /dev/null +++ b/t/Writer_42.out @@ -0,0 +1,5 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 8.32 +[EXIF, IFD0, Image] 282 - X Resolution: 144 +[EXIF, IFD0, Image] 283 - Y Resolution: 144 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered diff --git a/t/Writer_43.out b/t/Writer_43.out new file mode 100644 index 0000000..67429be --- /dev/null +++ b/t/Writer_43.out @@ -0,0 +1,5 @@ +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 5.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Center-weighted average +[MakerNotes, Canon, Camera] 17 - Metering Mode: Unknown (6) +[MakerNotes, Canon, Image] 22 - Exposure Time: 130.8 +[MakerNotes, Canon, Camera] 12 - Serial Number: 0560018159 diff --git a/t/Writer_44.out b/t/Writer_44.out new file mode 100644 index 0000000..35d41ef --- /dev/null +++ b/t/Writer_44.out @@ -0,0 +1,2 @@ +[XMP, XMP-exif, Image] ApertureValue - Aperture Value: 2.7 +[XMP, XMP-exif, Time] DateTimeOriginal - Date/Time Original: 2005:06:09 23:09:27+02:00 diff --git a/t/Writer_45.out b/t/Writer_45.out new file mode 100644 index 0000000..4d29f80 --- /dev/null +++ b/t/Writer_45.out @@ -0,0 +1 @@ +[EXIF, IFD0, Author] 315 - Artist: Pêro diff --git a/t/Writer_46.out b/t/Writer_46.out new file mode 100644 index 0000000..3a32986 --- /dev/null +++ b/t/Writer_46.out @@ -0,0 +1,121 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Writer_46_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 11 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: ec5278e5f2548e4ce57e1814f3413714 +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Author] 315 - Artist: 7 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0232 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 7.0 +[EXIF, ExifIFD, Image] 37888 - Ambient Temperature: 7 C +[EXIF, ExifIFD, Image] 37892 - Acceleration: 7 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: Uncalibrated +[IPTC, IPTC, Other] 120 - ARM Identifier: 7 +[IPTC, IPTC, Other] 122 - ARM Version: 7 +[IPTC, IPTC, Other] 0 - Envelope Record Version: 4 +[IPTC, IPTC, Other] 0 - Application Record Version: 7 +[IPTC, IPTC, Other] 151 - Audio Sampling Rate: 000007 +[IPTC, IPTC, Other] 152 - Audio Sampling Resolution: 07 +[IPTC, IPTC, Other] 153 - Audio Duration: 000007 +[IPTC, IPTC, Other] 154 - Audio Outcue: 7 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-Device, Camera] AppInfoApplication - App Info Application: 7 +[XMP, XMP-Device, Camera] AppInfoItemURI - App Info Item URI: 7 +[XMP, XMP-Device, Camera] AppInfoVersion - App Info Version: 7 +[XMP, XMP-GAudio, Audio] Data - Audio Data: (Binary data 1 bytes) +[XMP, XMP-GAudio, Audio] Mime - Audio Mime Type: 7 +[XMP, XMP-getty, Image] AssetID - Asset ID: 7 +[XMP, XMP-iptcCore, Other] AltTextAccessibility - Alt Text Accessibility: 7 +[XMP, XMP-iptcExt, Author] AboutCvTermCvId - About Cv Term Cv Id: 7 +[XMP, XMP-iptcExt, Author] AboutCvTermCvTermId - About Cv Term Id: 7 +[XMP, XMP-iptcExt, Author] AboutCvTermCvTermName - About Cv Term Name: 7 +[XMP, XMP-iptcExt, Author] AboutCvTermCvTermRefinedAbout - About Cv Term Refined About: 7 +[XMP, XMP-iptcExt, Author] AddlModelInfo - Additional Model Information: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOContentDescription - Artwork Content Description: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOContributionDescription - Artwork Contribution Description: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOCopyrightNotice - Artwork Copyright Notice: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOCreator - Artwork Creator: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOCreatorId - Artwork Creator ID: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOCurrentCopyrightOwnerId - Artwork Copyright Owner ID: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOCurrentCopyrightOwnerName - Artwork Copyright Owner Name: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOCurrentLicensorId - Artwork Licensor ID: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOCurrentLicensorName - Artwork Licensor Name: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOPhysicalDescription - Artwork Physical Description: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOSource - Artwork Source: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOSourceInvNo - Artwork Source Inventory No: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOSourceInvURL - Artwork Source Inv URL: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOStylePeriod - Artwork Style Period: 7 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOTitle - Artwork Title: 7 +[XMP, XMP-iptcExt, Audio] audioBitRate - Audio Bitrate: 7 +[XMP, XMP-iptcExt, Audio] audioBitsPerSample - Audio Bits Per Sample: 7 +[XMP, XMP-iptcExt, Audio] audioChannelCount - Audio Channel Count: 7 +[XMP, XMP-aas, Image] AffineA - Affine A: 7 +[XMP, XMP-aas, Image] AffineB - Affine B: 7 +[XMP, XMP-aas, Image] AffineC - Affine C: 7 +[XMP, XMP-aas, Image] AffineD - Affine D: 7 +[XMP, XMP-aas, Image] AffineX - Affine X: 7 +[XMP, XMP-aas, Image] AffineY - Affine Y: 7 +[XMP, XMP-apple-fi, Image] AngleInfoRoll - Angle Info Roll: 7 +[XMP, XMP-apple-fi, Image] AngleInfoYaw - Angle Info Yaw: 7 +[XMP, XMP-aux, Camera] ApproximateFocusDistance - Approximate Focus Distance: 7 +[XMP, XMP-cc, Author] attributionName - Attribution Name: 7 +[XMP, XMP-cc, Author] attributionURL - Attribution URL: 7 +[XMP, XMP-creatorAtom, Image] aeProjectLinkCompositionID - Ae Project Link Composition ID: 7 +[XMP, XMP-creatorAtom, Image] aeProjectLinkFullPath - Ae Project Link Full Path: 7 +[XMP, XMP-creatorAtom, Image] aeProjectLinkRenderOutputModuleIndex - Ae Project Link Render Output Module Index: 7 +[XMP, XMP-creatorAtom, Image] aeProjectLinkRenderQueueItemID - Ae Project Link Render Queue Item ID: 7 +[XMP, XMP-creatorAtom, Image] aeProjectLinkRenderTimeStamp - Ae Project Link Render Time Stamp: 7 +[XMP, XMP-drone-dji, Location] AbsoluteAltitude - Absolute Altitude: 7 +[XMP, XMP-extensis, Image] Approved - Approved: True +[XMP, XMP-extensis, Image] ApprovedBy - Approved By: 7 +[XMP, XMP-ics, Image] AppVersion - App Version: 7 +[XMP, XMP-pdf, Author] Author - Author: 7 +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: 7 +[XMP, XMP-prism, Document] academicField - Academic Field: 7 +[XMP, XMP-prism, Document] aggregateIssueNumber - Aggregate Issue Number: 7 +[XMP, XMP-prism, Document] aggregationType - Aggregation Type: 7 +[XMP, XMP-prism, Document] alternateTitleA-lang - Alternate Title A-lang: 7 +[XMP, XMP-prism, Document] alternateTitleA-platform - Alternate Title A-platform: 7 +[XMP, XMP-prism, Document] alternateTitleText - Alternate Title Text: 7 +[XMP, XMP-pur, Document] agreement - Agreement: 7 +[XMP, XMP-xmp, Image] Advisory - Advisory: 7 +[XMP, XMP-xmpDM, Image] absPeakAudioFilePath - Abs Peak Audio File Path: 7 +[XMP, XMP-xmpDM, Image] album - Album: 7 +[XMP, XMP-xmpDM, Image] altTapeName - Alt Tape Name: 7 +[XMP, XMP-xmpDM, Image] altTimecodeTimeValue - Alt Timecode Time Value: 7 +[XMP, XMP-xmpDM, Image] altTimecodeValue - Alt Timecode Value: 7 +[XMP, XMP-xmpDM, Image] audioChannelType - Audio Channel Type: 7.1 +[XMP, XMP-xmpDM, Image] audioCompressor - Audio Compressor: 7 +[XMP, XMP-xmpDM, Image] audioSampleRate - Audio Sample Rate: 7 +[XMP, XMP-crs, Image] AlreadyApplied - Already Applied: True +[XMP, XMP-crs, Image] AutoBrightness - Auto Brightness: True +[XMP, XMP-crs, Image] AutoContrast - Auto Contrast: True +[XMP, XMP-crs, Image] AutoExposure - Auto Exposure: True +[XMP, XMP-crs, Image] AutoLateralCA - Auto Lateral CA: 7 +[XMP, XMP-crs, Image] AutoShadows - Auto Shadows: True +[XMP, XMP-crs, Image] AutoTone - Auto Tone: True +[XMP, XMP-crs, Image] AutoToneDigest - Auto Tone Digest: 7 +[XMP, XMP-crs, Image] AutoToneDigestNoSat - Auto Tone Digest No Sat: 7 +[XMP, XMP-crs, Image] AutoWhiteVersion - Auto White Version: 7 +[Composite, Composite, Image] Exif-Aperture - Aperture: 7.0 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/Writer_47.out b/t/Writer_47.out new file mode 100644 index 0000000..636c9d0 --- /dev/null +++ b/t/Writer_47.out @@ -0,0 +1,57 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Writer_47_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 2.8 kB +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 836932ef3a5ae22968bb3bb73ab7e497 +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS DIGITAL REBEL +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Author] 315 - Artist: Phil +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 4 +[EXIF, ExifIFD, Image] 33437 - F Number: 14.0 +[EXIF, ExifIFD, Image] 34855 - ISO: 150 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 9 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 0 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 14.0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 4.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Average +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 34.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 160 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 120 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: THM - DCF thumbnail file +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, InteropIFD, Image] 4097 - Related Image Width: 3072 +[EXIF, InteropIFD, Image] 4098 - Related Image Height: 2048 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3443.946188 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3442.016807 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[IPTC, IPTC, Other] 25 - Keywords: Y +[IPTC, IPTC, Other] 0 - Application Record Version: 4 diff --git a/t/Writer_48.out b/t/Writer_48.out new file mode 100644 index 0000000..740f10a --- /dev/null +++ b/t/Writer_48.out @@ -0,0 +1,31 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 3.9 kB +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Big-endian (Motorola, MM) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: f61c7c28aa8bb54215cff2f36f256b2a +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Author] 315 - Artist: A +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[IPTC, IPTC, Other] 25 - Keywords: A +[IPTC, IPTC, Location] 90 - City: A +[IPTC, IPTC, Other] 0 - Application Record Version: 4 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-iptcExt, Location] LocationCreatedCity - Location Created City: A +[XMP, XMP-dc, Image] subject - Subject: A +[XMP, XMP-dc, Image] title - Title: A +[XMP, XMP-exif, Camera] FlashFired - Flash Fired: True +[Composite, Composite, Camera] XMP-Flash - Flash: Fired +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/Writer_50.out b/t/Writer_50.out new file mode 100644 index 0000000..45482bb --- /dev/null +++ b/t/Writer_50.out @@ -0,0 +1,3 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.15 +[XMP, XMP-dc, Other] test - Test: B +[XMP, XMP-dc, Image] title - Title: A diff --git a/t/Writer_51.out b/t/Writer_51.out new file mode 100644 index 0000000..5d77c4f --- /dev/null +++ b/t/Writer_51.out @@ -0,0 +1,430 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[ExifTool, ExifTool, ExifTool] Warning - Warning: IPTCDigest is not current. XMP may be out of sync +[File, System, Other] FileName - File Name: Writer_51_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 26 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:55-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] Comment - Comment: © PhotoStudio Unicode comment;; +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 6895be53ef9a287520f400aa17242c09 +[File, File, Image] Comment - Comment: a comment +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: A witty caption +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2004:02:26 09:36:46 +[EXIF, IFD0, Author] 315 - Artist: Phil Harvey +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: Copyright 2004 Phil Harvey +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1.6 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 100 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 80 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 852 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 0 +[JFIF, JFIF, Image] 0 - JFIF Version: 1.01 +[JFIF, JFIF, Image] 2 - Resolution Unit: inches +[JFIF, JFIF, Image] 3 - X Resolution: 144 +[JFIF, JFIF, Image] 5 - Y Resolution: 144 +[JFIF, JFXX, Preview] 16 - Thumbnail Image: (Binary data 1558 bytes) +[APP8, SPIFF, Image] 0 - SPIFF Version: 1.2 +[APP8, SPIFF, Image] 2 - Profile ID: Continuous-tone Base +[APP8, SPIFF, Image] 3 - Color Components: 3 +[APP8, SPIFF, Image] 6 - Image Height: 4500 +[APP8, SPIFF, Image] 10 - Image Width: 3000 +[APP8, SPIFF, Image] 14 - Color Space: YCbCr, ITU-R BT 709, video +[APP8, SPIFF, Image] 15 - Bits Per Sample: 8 +[APP8, SPIFF, Image] 16 - Compression: JPEG +[APP8, SPIFF, Image] 17 - Resolution Unit: inches +[APP8, SPIFF, Image] 18 - Y Resolution: 300 +[APP8, SPIFF, Image] 22 - X Resolution: 300 +[MakerNotes, CIFF, Image] 0 - File Format: JPEG (lossy) +[MakerNotes, CIFF, Image] 1 - Target Compression Ratio: 2 +[MakerNotes, CIFF, Image] 0 - Image Width: 512 +[MakerNotes, CIFF, Image] 1 - Image Height: 384 +[MakerNotes, CIFF, Image] 2 - Pixel Aspect Ratio: 1 +[MakerNotes, CIFF, Image] 3 - Rotation: 0 +[MakerNotes, CIFF, Image] 4 - Component Bit Depth: 8 +[MakerNotes, CIFF, Image] 5 - Color Bit Depth: 24 +[MakerNotes, CIFF, Image] 6 - Color BW: 1 +[MakerNotes, CIFF, Camera] 4106 - Target Image Type: Real-world Subject +[MakerNotes, CIFF, Camera] 6148 - Record ID: 0 +[MakerNotes, CIFF, Image] 6167 - File Number: 45 +[MakerNotes, CIFF, Time] 0 - Date/Time Original: 1998:05:01 21:33:18 +[MakerNotes, CIFF, Time] 1 - Time Zone Code: 0 +[MakerNotes, CIFF, Time] 2 - Time Zone Info: 0 +[MakerNotes, CIFF, Camera] 2070 - Original File Name: C:\DC97\CTG_0000\AUT_0045.JPG +[MakerNotes, CIFF, Camera] 2071 - Thumbnail File Name: C:\DC97\CTG_0000\THM_0045.JPG +[MakerNotes, CIFF, Camera] 4112 - Shutter Release Method: Single Shot +[MakerNotes, CIFF, Camera] 4113 - Shutter Release Timing: Priority on focus +[MakerNotes, CIFF, Image] 0 - Flash Guide Number: 0 +[MakerNotes, CIFF, Image] 1 - Flash Threshold: 0 +[MakerNotes, CIFF, Image] 0 - Exposure Compensation: 1 +[MakerNotes, CIFF, Image] 1 - Shutter Speed Value: 1/83 +[MakerNotes, CIFF, Image] 2 - Aperture Value: 6.2 +[MakerNotes, CIFF, Camera] 6151 - Target Distance Setting: 476 mm +[MakerNotes, CIFF, Camera] 6164 - Measured EV: 16.25 +[MakerNotes, CIFF, Camera] 2053 - Canon File Description: +[MakerNotes, CIFF, Camera] 2069 - Canon Image Type: AUT:Full automatic mode +[MakerNotes, CIFF, Camera] 2064 - Owner Name: +[MakerNotes, CIFF, Camera] 0 - Make: Canon +[MakerNotes, CIFF, Camera] 6 - Camera Model Name: Canon PowerShot A5 +[MakerNotes, CIFF, Camera] 4124 - Base ISO: 100 +[MakerNotes, CIFF, Camera] 2061 - ROM Operation Mode: USA +[MakerNotes, CIFF, Camera] 2059 - Canon Firmware Version: Firmware Version 01.00 +[MakerNotes, CIFF, Camera] 1 - Free Bytes: (Binary data 12 bytes) +[MakerNotes, CIFF, Image] 0 - Focal Type: Fixed +[MakerNotes, CIFF, Image] 1 - Focal Length: 5 mm +[MakerNotes, CIFF, Image] 2 - Focal Plane X Size: 5.05 mm +[MakerNotes, CIFF, Image] 3 - Focal Plane Y Size: 3.71 mm +[MakerNotes, Qualcomm, Camera] aec_current_sensor_luma - AEC Current Sensor Luma: 22 +[MakerNotes, Qualcomm, Camera] af_position - AF Position: 26 +[MakerNotes, Qualcomm, Camera] aec_current_exp_index - AEC Current Exp Index: 308 +[MakerNotes, Qualcomm, Camera] awb_sample_decision - AWB Sample Decision: 7 +[MakerNotes, Qualcomm, Camera] asf5_enable - ASF5 Enable: 1 +[MakerNotes, Qualcomm, Camera] asf5_filter_mode - ASF5 Filter Mode: 0 +[MakerNotes, Qualcomm, Camera] asf5_exposure_index_1 - ASF5 Exposure Index 1: 180 +[MakerNotes, Qualcomm, Camera] asf5_exposure_index_2 - ASF5 Exposure Index 2: 270 +[MakerNotes, Qualcomm, Camera] asf5_max_exposure_index - ASF5 Max Exposure Index: 290 +[MakerNotes, Samsung, Other] 0x0100-name - Embedded Audio File Name: SoundShot_000 +[MakerNotes, Samsung, Audio] 0x0100 - Embedded Audio File: (Binary data 16 bytes) +[APP0, AVI1, Image] 0 - Interleaved Field: Not Interleaved +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 4.73 +[XMP, XMP-rdf, Document] about - About: uuid:80056b68-1045-fa97-3401-6f4ed84cd53d +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: UTF-16 (big-endian) encoded XMP +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP +[XMP, XMP-dc, Image] title - Title: Test IPTC picture +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: My Position +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: I wrote it +[XMP, XMP-photoshop, Image] Category - Category: 1 +[XMP, XMP-photoshop, Location] City - City: Kingston +[XMP, XMP-photoshop, Location] Country - Country: Canada +[XMP, XMP-photoshop, Author] Credit - Credit: My Credit +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2004:02:26 +[XMP, XMP-photoshop, Image] Headline - Headline: No headline +[XMP, XMP-photoshop, Image] Instructions - Instructions: What instructions +[XMP, XMP-photoshop, Author] Source - Source: I'm the source +[XMP, XMP-photoshop, Location] State - State: Ont +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: amazing, image, utilities +[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: What is a transmission reference? +[XMP, XMP-photoshop, Image] Urgency - Urgency: 8 (least urgent) +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:4cc7b857-69d0-11d8-8ac4-bb59c92f0d9a +[XMP, XMP-xmpRights, Author] Marked - Marked: False +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Adobe Systems Inc. +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.1.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1999:06:03 00:00:00 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Apple Computer Inc. +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: none +[ICC_Profile, ICC-header, Image] 52 - Device Model: +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: Adobe Systems Inc. +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Copyright 1999 Adobe Systems Incorporated +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: Adobe RGB (1998) +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.95045 1 1.08905 +[ICC_Profile, ICC_Profile, Image] bkpt - Media Black Point: 0 0 0 +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.60974 0.31111 0.01947 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.20528 0.62567 0.06087 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.14919 0.06322 0.74457 +[FlashPix, FlashPix, Other] 1 - Code Page: Unicode UTF-16, little endian +[FlashPix, FlashPix, Other] 268435456 - Used Extension Numbers: 1 +[FlashPix, FlashPix, Other] 1 - Extension Name: Screen nail +[FlashPix, FlashPix, Other] 2 - Extension Class ID: 10000230-6FC0-11D0-BD01-00609719A180 +[FlashPix, FlashPix, Other] 3 - Extension Persistence: Invalidated By Modification +[FlashPix, FlashPix, Time] 4 - Extension Create Date: 1999:05:14 21:47:25 +[FlashPix, FlashPix, Time] 5 - Extension Modify Date: 1999:05:14 21:47:25 +[FlashPix, FlashPix, Other] 6 - Creating Application: Digita +[FlashPix, FlashPix, Other] 7 - Extension Description: Presized image for LCD display +[FlashPix, FlashPix, Other] 4096 - Storage-Stream Pathname: /.Screen Nail_bd0100609719a180 +[FlashPix, FlashPix, Other] Screen Nail - Screen Nail: (Binary data 5917 bytes) +[FlashPix, FlashPix, Preview] FlashPix-PreviewImage - Preview Image: (Binary data 5777 bytes) +[MPF, MPF0, Image] 45056 - MPF Version: 0100 +[MPF, MPF0, Image] 45057 - Number Of Images: 2 +[MPF, MPImage1, Image] 0.1 - MP Image Flags: Dependent parent image +[MPF, MPImage1, Image] 0.2 - MP Image Format: JPEG +[MPF, MPImage1, Image] 0.3 - MP Image Type: Baseline MP Primary Image +[MPF, MPImage1, Image] 4 - MP Image Length: 5959981 +[MPF, MPImage1, Image] 8 - MP Image Start: 0 +[MPF, MPImage1, Image] 12 - Dependent Image 1 Entry Number: 2 +[MPF, MPImage1, Image] 14 - Dependent Image 2 Entry Number: 0 +[MPF, MPImage2, Image] 0.1 - MP Image Flags: Dependent child image +[MPF, MPImage2, Image] 0.2 - MP Image Format: JPEG +[MPF, MPImage2, Image] 0.3 - MP Image Type: Large Thumbnail (full HD equivalent) +[MPF, MPImage2, Image] 4 - MP Image Length: 1039273 +[MPF, MPImage2, Image] 8 - MP Image Start: 5945405 +[MPF, MPImage2, Image] 12 - Dependent Image 1 Entry Number: 0 +[MPF, MPImage2, Image] 14 - Dependent Image 2 Entry Number: 0 +[MPF, MPImage2, Preview] PreviewImage - Preview Image: (Binary data 1039273 bytes) +[Meta, MetaIFD, Image] 50000 - Film Product Code: 37 +[Meta, MetaIFD, Image] 50001 - Image Source EK: 1 +[Meta, MetaIFD, Image] 50002 - Capture Conditions PAR: 1 +[Meta, MetaIFD, Image] 50009 - Frame Number: 0 +[Meta, MetaIFD, Image] 50010 - Film Category: 2 +[Meta, MetaIFD, Image] 50011 - Film Gencode: 2 +[Meta, MetaIFD, Image] 50012 - Model And Version: Version 9 +[Meta, MetaIFD, Image] 50013 - Film Size: 1 +[Meta, MetaIFD, Image] 50014 - SBA RGB Shifts: 0 0 0 +[Meta, MetaIFD, Image] 50015 - SBA Input Image Colorspace: 3 +[Meta, MetaIFD, Image] 50016 - SBA Input Image Bit Depth: 12 12 12 +[Meta, MetaIFD, Image] 50017 - SBA Exposure Record: (Binary data 368 bytes) +[Meta, MetaIFD, Image] 50018 - User Adj SBA RGB Shifts: (Binary data 5 bytes) +[Meta, MetaIFD, Image] 50019 - Image Rotation Status: 0 +[Meta, MetaIFD, Image] 50020 - Roll Guid Elements: 00000000000000000000000000000000 +[Meta, MetaIFD, Image] 50021 - Metadata Number: 0100 +[APP5, RMETA, Image] Sign type - Sign Type: Information +[APP5, RMETA, Image] Location - Location: Roundabout +[APP5, RMETA, Image] Lit - Lit: No +[APP5, RMETA, Image] Condition - Condition: Good +[APP5, RMETA, Image] Azimuth - Azimuth: E +[XML, MediaJukebox, Image] Tool_Name - Tool Name: Media Center +[XML, MediaJukebox, Image] Tool_Version - Tool Version: 19.0.67 +[XML, MediaJukebox, Image] People - People: Santa +[XML, MediaJukebox, Image] Places - Places: Jamaica +[XML, MediaJukebox, Time] Date - Date: 2013:09:01 20:12:19 +[XML, MediaJukebox, Image] Album - Album: 2013-09-01 +[XML, MediaJukebox, Image] Name - Name: Glass home at night +[APP11, JPEG-HDR, Image] ver - JPEG-HDR Version: 11 +[APP11, JPEG-HDR, Image] ln0 - Ln0: 0.122262 +[APP11, JPEG-HDR, Image] ln1 - Ln1: 2.634655 +[APP11, JPEG-HDR, Image] s2n - S2n: 2.269635e+03 +[APP11, JPEG-HDR, Image] alp - Alpha: 1.000000 +[APP11, JPEG-HDR, Image] bet - Beta: 1.000000 +[APP11, JPEG-HDR, Image] cor - Correction Method: 0 +[APP11, JPEG-HDR, Preview] RatioImage - Ratio Image: (Binary data 19 bytes) +[JUMBF, JUMBF, Image] type - JUMD Type: (cacb)-0011-0010-800000aa00389b71 +[JUMBF, JUMBF, Image] label - JUMD Label: cai +[JUMBF, JUMBF, Image] type - JUMD Type: (cast)-0011-0010-800000aa00389b71 +[JUMBF, JUMBF, Image] label - JUMD Label: cb.reuters_1 +[JUMBF, JUMBF, Image] type - JUMD Type: (caas)-0011-0010-800000aa00389b71 +[JUMBF, JUMBF, Image] label - JUMD Label: cai.assertions +[JUMBF, JUMBF, Image] type - JUMD Type: (json)-0011-0010-800000aa00389b71 +[JUMBF, JUMBF, Image] label - JUMD Label: adobe.asset.info +[JUMBF, JSON, Other] title - Title: HEALTHCORONAVIRUSUSAOREGON_SALEM_08.jpg +[JUMBF, JUMBF, Image] type - JUMD Type: (json)-0011-0010-800000aa00389b71 +[JUMBF, JUMBF, Image] label - JUMD Label: cai.location.broad +[JUMBF, JSON, Other] location - Location: Salem, Oregon +[JUMBF, JUMBF, Image] type - JUMD Type: (json)-0011-0010-800000aa00389b71 +[JUMBF, JUMBF, Image] label - JUMD Label: cai.rights +[JUMBF, JSON, Other] copyright - Copyright: Alisha Jucevic +[APP12, PictureInfo, Time] TimeDate - Date/Time Original: 1998:12:31 15:17:20 +[APP12, PictureInfo, Image] Shutter - Exposure Time: 1/155 +[APP12, PictureInfo, Image] Flash - Flash: Off +[APP12, PictureInfo, Image] Resolution - Resolution: 5 +[APP12, PictureInfo, Image] Protect - Protect: 0 +[APP12, PictureInfo, Image] ContTake - Cont Take: 0 +[APP12, PictureInfo, Image] ImageSize - Image Size: 1280x960 +[APP12, PictureInfo, Image] ColorMode - Color Mode: 1 +[APP12, PictureInfo, Image] FNumber - F Number: 11.0 +[APP12, PictureInfo, Image] Zoom - Zoom: 2.1 +[APP12, PictureInfo, Image] Macro - Macro: Off +[APP12, PictureInfo, Image] LightS - Light S: 0 +[APP12, PictureInfo, Image] ExpBias - Exposure Compensation: +2.0 +[APP12, PictureInfo, Camera] Type - Camera Type: SR84 +[APP12, PictureInfo, Camera] Serial# - Serial Number: #00000001 +[APP12, PictureInfo, Camera] Version - Version: v84-71 +[APP12, PictureInfo, Camera] ID - ID: AGFA DIGITAL CAMERA +[APP12, PictureInfo, Image] PicLen - Pic Len: 561039 +[APP12, PictureInfo, Image] ThmLen - Thm Len: 3802 +[APP12, PictureInfo, Image] Q - Tag Q: 96 +[APP12, PictureInfo, Image] R - Tag R: 293 +[APP12, PictureInfo, Image] B - Tag B: 332 +[APP12, PictureInfo, Image] s0 - S0: 1e8,0,11b0,6f72,15cf,4225,4225,1050000,a1e0004,0,2f0030d,2f102c5,2880090,0,0 +[APP12, PictureInfo, Image] T0 - T0: 11b15600,1290000,e00c0f,2,0,0 +[Ducky, Ducky, Image] 1 - Quality: 84% +[Ducky, Ducky, Author] 3 - Copyright: Copyright 2004 Phil Harvey +[IPTC, IPTC, Other] 0 - Application Record Version: 2 +[IPTC, IPTC, Other] 120 - Caption-Abstract: A witty caption +[IPTC, IPTC, Author] 122 - Writer-Editor: I wrote it +[IPTC, IPTC, Other] 105 - Headline: No headline +[IPTC, IPTC, Other] 40 - Special Instructions: What instructions +[IPTC, IPTC, Author] 80 - By-line: Phil Harvey +[IPTC, IPTC, Author] 85 - By-line Title: My Position +[IPTC, IPTC, Author] 110 - Credit: My Credit +[IPTC, IPTC, Other] 5 - Object Name: Test IPTC picture +[IPTC, IPTC, Time] 55 - Date Created: 2004:02:26 +[IPTC, IPTC, Location] 90 - City: Kingston +[IPTC, IPTC, Location] 95 - Province-State: Ont +[IPTC, IPTC, Location] 101 - Country-Primary Location Name: Canada +[IPTC, IPTC, Other] 103 - Original Transmission Reference: What is a transmission reference +[IPTC, IPTC, Other] 15 - Category: 1 +[IPTC, IPTC, Other] 20 - Supplemental Categories: amazing, image, utilities +[IPTC, IPTC, Author] 116 - Copyright Notice: Copyright 2004 Phil Harvey +[IPTC, IPTC, Other] 10 - Urgency: 8 (least urgent) +[IPTC, IPTC, Author] 115 - Source: I'm the source +[IPTC, IPTC, Other] 25 - Keywords: jambalaya +[IPTC, IPTC2, Other] 0 - Application Record Version: 2 +[IPTC, IPTC3, Other] 0 - Application Record Version: 2 +[IPTC, IPTC3, Other] 15 - Category: p +[IPTC, IPTC3, Time] 55 - Date Created: 2005:12:23 +[IPTC, IPTC3, Other] 5 - Object Name: object name +[IPTC, IPTC3, Other] 10 - Urgency: 2 +[IPTC, IPTC3, Other] 20 - Supplemental Categories: supp cat +[IPTC, IPTC3, Other] 40 - Special Instructions: special instructions +[IPTC, IPTC3, Author] 80 - By-line: byline +[IPTC, IPTC3, Author] 85 - By-line Title: byline title +[IPTC, IPTC3, Location] 90 - City: city +[IPTC, IPTC3, Location] 101 - Country-Primary Location Name: country name +[IPTC, IPTC3, Other] 103 - Original Transmission Reference: otr +[IPTC, IPTC3, Other] 105 - Headline: headline +[IPTC, IPTC3, Author] 110 - Credit: credit +[IPTC, IPTC3, Author] 115 - Source: source +[IPTC, IPTC3, Author] 116 - Copyright Notice: copy freely +[IPTC, IPTC3, Other] 120 - Caption-Abstract: ExifTool AFCP test +[IPTC, IPTC3, Author] 122 - Writer-Editor: caption writer +[IPTC, IPTC3, Location] 95 - Province-State: state +[IPTC, IPTC3, Other] 25 - Keywords: jambalaya +[Photoshop, Photoshop, Image] 1061 - IPTC Digest: 05ad1770b1a95f1f9788ac995fa647da +[Photoshop, Photoshop, Image] 0 - X Resolution: 72 +[Photoshop, Photoshop, Image] 2 - Displayed Units X: inches +[Photoshop, Photoshop, Image] 4 - Y Resolution: 72 +[Photoshop, Photoshop, Image] 6 - Displayed Units Y: inches +[Photoshop, Photoshop, Image] 0 - Print Style: Centered +[Photoshop, Photoshop, Image] 2 - Print Position: 0 0 +[Photoshop, Photoshop, Image] 10 - Print Scale: 1 +[Photoshop, Photoshop, Image] 1037 - Global Angle: 30 +[Photoshop, Photoshop, Image] 1049 - Global Altitude: 30 +[Photoshop, Photoshop, Author] 1034 - Copyright Flag: False +[Photoshop, Photoshop, Author] 1035 - URL: https://exiftool.org/ +[Photoshop, Photoshop, Image] 1054 - URL List: +[Photoshop, Photoshop, Other] 20 - Slices Group Name: IPTC +[Photoshop, Photoshop, Other] 24 - Num Slices: 1 +[Photoshop, Photoshop, Image] 4 - Has Real Merged Data: Yes +[Photoshop, Photoshop, Image] 5 - Writer Name: Adobe Photoshop +[Photoshop, Photoshop, Image] 9 - Reader Name: Adobe Photoshop 7.0 +[Photoshop, Photoshop, Image] 0 - Photoshop Quality: 7 +[Photoshop, Photoshop, Image] 1 - Photoshop Format: Standard +[Photoshop, Photoshop, Image] 2 - Progressive Scans: 3 Scans +[APP13, AdobeCM, Image] 0 - Adobe CM Type: 3 +[APP14, Adobe, Image] 0 - DCT Encode Version: 100 +[APP14, Adobe, Image] 1 - APP14 Flags 0: (none) +[APP14, Adobe, Image] 2 - APP14 Flags 1: (none) +[APP14, Adobe, Image] 3 - Color Transform: YCbCr +[APP15, GraphConv, Image] Q - Quality: 70 +[MIE, MIE-Doc, Author] Copyright - Copyright: © 2006 Phil Harvey +[MIE, MIE-Main, Other] zmie - Trailer Signature: +[PhotoMechanic, PhotoMechanic, Image] 221 - Tagged: Yes +[PhotoMechanic, PhotoMechanic, Image] 222 - Color Class: 6 (Typical alt) +[PhotoMechanic, PhotoMechanic, Image] 216 - Rotation: 180 +[PhotoMechanic, PhotoMechanic, Image] 217 - Crop Left: 438 +[PhotoMechanic, PhotoMechanic, Image] 218 - Crop Top: 618 +[PhotoMechanic, PhotoMechanic, Image] 219 - Crop Right: 890 +[PhotoMechanic, PhotoMechanic, Image] 220 - Crop Bottom: 1072 +[CanonVRD, CanonVRD, Image] 2 - VRD Version: 1.0.0 +[CanonVRD, CanonVRD, Image] 6 - WB Adj RGGB Levels: 0 0 0 0 +[CanonVRD, CanonVRD, Image] 24 - White Balance Adj: Shot Settings +[CanonVRD, CanonVRD, Image] 26 - WB Adj Color Temp: 5600 +[CanonVRD, CanonVRD, Image] 36 - WB Fine Tune Active: No +[CanonVRD, CanonVRD, Image] 40 - WB Fine Tune Saturation: 0 +[CanonVRD, CanonVRD, Image] 44 - WB Fine Tune Tone: 0 +[CanonVRD, CanonVRD, Image] 46 - Raw Color Adj: Shot Settings +[CanonVRD, CanonVRD, Image] 48 - Raw Custom Saturation: 0 +[CanonVRD, CanonVRD, Image] 52 - Raw Custom Tone: 0 +[CanonVRD, CanonVRD, Image] 56 - Raw Brightness Adj: 0.00 +[CanonVRD, CanonVRD, Image] 60 - Tone Curve Property: Shot Settings +[CanonVRD, CanonVRD, Image] 122 - Dynamic Range Min: 0 +[CanonVRD, CanonVRD, Image] 124 - Dynamic Range Max: 4095 +[CanonVRD, CanonVRD, Image] 272 - Tone Curve Active: No +[CanonVRD, CanonVRD, Image] 275 - Tone Curve Mode: RGB +[CanonVRD, CanonVRD, Image] 276 - Brightness Adj: 0 +[CanonVRD, CanonVRD, Image] 277 - Contrast Adj: 0 +[CanonVRD, CanonVRD, Image] 278 - Saturation Adj: 100 +[CanonVRD, CanonVRD, Image] 286 - Color Tone Adj: 0 +[CanonVRD, CanonVRD, Image] 294 - Luminance Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 336 - Luminance Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 345 - Tone Curve Interpolation: Curve +[CanonVRD, CanonVRD, Image] 352 - Red Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 394 - Red Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 410 - Green Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 452 - Green Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 468 - Blue Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 510 - Blue Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 526 - RGB Curve Points: (0,0) (255,255) +[CanonVRD, CanonVRD, Image] 568 - RGB Curve Limits: 255 0 255 0 +[CanonVRD, CanonVRD, Image] 580 - Crop Active: No +[CanonVRD, CanonVRD, Image] 582 - Crop Left: 0 +[CanonVRD, CanonVRD, Image] 584 - Crop Top: 0 +[CanonVRD, CanonVRD, Image] 586 - Crop Width: 0 +[CanonVRD, CanonVRD, Image] 588 - Crop Height: 0 +[CanonVRD, CanonVRD, Image] 602 - Sharpness Adj: 0 +[CanonVRD, CanonVRD, Image] 608 - Crop Aspect Ratio: Free +[CanonVRD, CanonVRD, Image] 610 - Constrained Crop Width: 0 +[CanonVRD, CanonVRD, Image] 614 - Constrained Crop Height: 0 +[CanonVRD, CanonVRD, Image] 618 - Check Mark: Clear +[CanonVRD, CanonVRD, Image] 622 - Rotation: 90 +[CanonVRD, CanonVRD, Image] 624 - Work Color Space: sRGB +[FotoStation, FotoStation, Image] 0 - Original Image Width: 16 +[FotoStation, FotoStation, Image] 1 - Original Image Height: 16 +[FotoStation, FotoStation, Image] 2 - Color Planes: 3 +[FotoStation, FotoStation, Image] 3 - XY Resolution: 9 +[FotoStation, FotoStation, Image] 4 - Rotation: 0 +[FotoStation, FotoStation, Image] 6 - Crop Left: 24.557% +[FotoStation, FotoStation, Image] 7 - Crop Top: 21.25% +[FotoStation, FotoStation, Image] 8 - Crop Right: 30.676% +[FotoStation, FotoStation, Image] 9 - Crop Bottom: 86.25% +[FotoStation, FotoStation, Image] 11 - Crop Rotation: 0 +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/155 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-LightValue - Light Value: 10.9 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 6.9 +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.004 mm +[Composite, Composite, Image] Exif-FOV - Field Of View: 47.0 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 6.0 mm (35 mm equivalent: 41.4 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 2.36 m diff --git a/t/Writer_52.out b/t/Writer_52.out new file mode 100644 index 0000000..71d8a00 --- /dev/null +++ b/t/Writer_52.out @@ -0,0 +1,23 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: Writer_52_failed.xmp +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 1638 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:11:01 10:15:50-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:11:01 10:15:50-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:11:01 10:15:50-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: XMP +[File, File, Other] FileTypeExtension - File Type Extension: xmp +[File, File, Other] MIMEType - MIME Type: application/rdf+xml +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 11.75 +[XMP, XMP-dc, Author] rights - Rights: © Copyright Phil Harvey +[XMP, XMP-dc, Author] rights-fr - Rights (fr): © Droit d'auteur Phil Harvey +[XMP, XMP-exif, Time] DateTimeDigitized - Date/Time Digitized: 2005:06:09 20:09:27+02:00 +[XMP, XMP-exif, Time] DateTimeOriginal - Date/Time Original: 2005:06:09 20:09:27+02:00 +[XMP, XMP-xmp, Time] CreateDate - Create Date: 2005:11:21 17:07:14+01:00 +[XMP, XMP-xmp, Time] MetadataDate - Metadata Date: 2005:11:21 17:11:31+01:00 +[XMP, XMP-xmp, Time] ModifyDate - Modify Date: 2005:11:21 17:07:14+01:00 +[XMP, XMP-xmpMM, Other] DerivedFromDocumentID - Derived From Document ID: adobe:docid:photoshop:f481cc67-d8f5-11d9-a31e-a1606d941d83 +[XMP, XMP-xmpMM, Other] DerivedFromInstanceID - Derived From Instance ID: adobe:docid:photoshop:f481cc67-d8f5-11d9-a31e-a1606d941d83 +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: uuid:7A9636BAA85ADA11B611C7FA524F1F71 +[XMP, XMP-xmpMM, Other] InstanceID - Instance ID: uuid:7B9636BAA85ADA11B611C7FA524F1F71 diff --git a/t/Writer_53.out b/t/Writer_53.out new file mode 100644 index 0000000..689c6c9 --- /dev/null +++ b/t/Writer_53.out @@ -0,0 +1,36 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Writer_53_failed.xmp +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 3.6 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:58-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:58-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:58-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0232 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: Uncalibrated +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-aux, Camera] Lens - Lens: 18.0 - 55.0 mm +[XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8 +[XMP, XMP-tiff, Image] ImageLength - Image Height: 8 +[XMP, XMP-tiff, Image] ImageWidth - Image Width: 8 +[XMP, XMP-tiff, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-LensID-2 - Lens ID: 18.0-55.0mm diff --git a/t/Writer_54.out b/t/Writer_54.out new file mode 100644 index 0000000..ba593ee --- /dev/null +++ b/t/Writer_54.out @@ -0,0 +1,2 @@ +[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:12:04 06:46:52 diff --git a/t/Writer_55.out b/t/Writer_55.out new file mode 100644 index 0000000..6ec55d4 --- /dev/null +++ b/t/Writer_55.out @@ -0,0 +1,7 @@ +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Author] 315 - Artist: me +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[IPTC, IPTC, Other] 25 - Keywords: one, two +[IPTC, IPTC, Other] 0 - Application Record Version: 4 diff --git a/t/Writer_56.out b/t/Writer_56.out new file mode 100644 index 0000000..2bf4a7a --- /dev/null +++ b/t/Writer_56.out @@ -0,0 +1,4 @@ +[IPTC, IPTC, Other] 25 - Keywords: one, two +[IPTC, IPTC, Other] 0 - Application Record Version: 4 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.50 +[XMP, XMP-dc, Image] title - Title: Test diff --git a/t/Writer_58.out b/t/Writer_58.out new file mode 100644 index 0000000..4c5017b --- /dev/null +++ b/t/Writer_58.out @@ -0,0 +1,44 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[File, System, Other] FileName - File Name: Writer_58_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 761 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:07:29 09:04:26-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2020:07:29 09:04:26-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2020:07:29 09:04:26-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Nikon Corporation +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.2.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1999:12:07 18:59:22 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Apple Computer Inc. +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: none +[ICC_Profile, ICC-header, Image] 52 - Device Model: +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: Nikon Adobe RGB 4.0.0.3000 +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.60976 0.31113 0.01947 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.20525 0.62566 0.06087 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.1492 0.06322 0.74463 +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 14 bytes) +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.9505 1 1.0891 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Nikon Inc. & Nikon Corporation 2001 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/Writer_59.out b/t/Writer_59.out new file mode 100644 index 0000000..0a8ef98 --- /dev/null +++ b/t/Writer_59.out @@ -0,0 +1,2 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 11.71 +[XMP, XMP-dc, Image] subject - Subject: ;a;; diff --git a/t/Writer_6.out b/t/Writer_6.out new file mode 100644 index 0000000..b621dc7 --- /dev/null +++ b/t/Writer_6.out @@ -0,0 +1,186 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Writer_6_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 5.8 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:53-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:53-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:53-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 27e2cf0c32f8cb445eccf7006bfc9af5 +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS DIGITAL REBEL +[EXIF, IFD0, Image] 274 - Orientation: Rotate 180 +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:04 06:46:52 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 4 +[EXIF, ExifIFD, Image] 33437 - F Number: 14.0 +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 9 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 0 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 14.0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: +999 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 4.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Average +[EXIF, ExifIFD, Camera] 37384 - Light Source: Cloudy +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 34.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 160 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 120 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: THM - DCF thumbnail file +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, InteropIFD, Image] 4097 - Related Image Width: 3072 +[EXIF, InteropIFD, Image] 4098 - Related Image Height: 2048 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3443.946188 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3442.016807 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: mm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, IFD0, Time] 36867 - Date/Time Original: 2005:01:01 00:00:00 +[EXIF, IFD0, Image] 51043 - Time Codes: 02:53:49.07 2009-11-19T12:38:35.21-03:00 +[MakerNotes, Canon, Camera] 1 - Macro Mode: Unknown (0) +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Continuous +[MakerNotes, Canon, Camera] 7 - Focus Mode: Manual Focus (3) +[MakerNotes, Canon, Camera] 9 - Record Mode: CRW+THM +[MakerNotes, Canon, Camera] 10 - Canon Image Size: Large +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: Unknown (-1) +[MakerNotes, Canon, Camera] 13 - Contrast: +1 +[MakerNotes, Canon, Camera] 14 - Saturation: +1 +[MakerNotes, Canon, Camera] 15 - Sharpness: +1 +[MakerNotes, Canon, Camera] 16 - Camera ISO: n/a +[MakerNotes, Canon, Camera] 17 - Metering Mode: Center-weighted average +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Manual +[MakerNotes, Canon, Camera] 22 - Lens Type: n/a +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 55 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 18 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 4 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 27 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: (none) +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 3072 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 3072 +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, Canon, Image] 1 - Focal Length: 34 mm +[MakerNotes, Canon, Image] 2 - Focal Plane X Size: 23.22 mm +[MakerNotes, Canon, Image] 3 - Focal Plane Y Size: 15.49 mm +[MakerNotes, Canon, Camera] 3 - Canon Flash Info: 100 0 0 0 +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 100 +[MakerNotes, Canon, Image] 3 - Measured EV: -1.25 +[MakerNotes, Canon, Image] 4 - Target Aperture: 14 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 19 - Focus Distance Upper: inf +[MakerNotes, Canon, Image] 20 - Focus Distance Lower: 5.46 m +[MakerNotes, Canon, Image] 21 - F Number: 14 +[MakerNotes, Canon, Image] 22 - Exposure Time: 128 +[MakerNotes, Canon, Image] 23 - Measured EV 2: -1.25 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 4 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS Mid-range +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 29 - Self Timer 2: 0 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Image] 6 - Canon Image Type: CRW:EOS DIGITAL REBEL CMOS RAW +[MakerNotes, Canon, Camera] 7 - Canon Firmware Version: Firmware Version 1.1.1 +[MakerNotes, Canon, Camera] 12 - Serial Number: 0560018150 +[MakerNotes, Canon, Camera] 21 - Serial Number Format: Format 1 +[MakerNotes, Canon, Image] 8 - File Number: 118-1861 +[MakerNotes, Canon, Camera] 9 - Owner Name: Phil Harvey +[MakerNotes, Canon, Camera] 16 - Canon Model ID: EOS Digital Rebel / 300D / Kiss Digital +[MakerNotes, Canon, Image] 14 - Canon File Length: 4480822 +[MakerNotes, Canon, Camera] 0 - Canon 0x0000: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Canon, Camera] 192 - Canon 0x00c0: 26 331 372 372 177 240 428 429 277 186 510 511 442 +[MakerNotes, Canon, Camera] 193 - Canon 0x00c1: 26 299 375 375 170 202 394 395 240 153 453 454 375 +[MakerNotes, Canon, Camera] 1 - Measured RGGB: 998 1022 1026 808 +[MakerNotes, Canon, Camera] 168 - Canon 0x00a8: 20 5190 5190 7000 5987 3214 3897 6203 5190 5200 +[MakerNotes, Canon, Camera] 1 - WB RGGB Levels Auto: 1719 832 831 990 +[MakerNotes, Canon, Camera] 5 - WB RGGB Levels Daylight: 1722 832 831 989 +[MakerNotes, Canon, Camera] 9 - WB RGGB Levels Shade: 2035 832 831 839 +[MakerNotes, Canon, Camera] 13 - WB RGGB Levels Cloudy: 1878 832 831 903 +[MakerNotes, Canon, Camera] 17 - WB RGGB Levels Tungsten: 1228 913 912 1668 +[MakerNotes, Canon, Camera] 21 - WB RGGB Levels Fluorescent: 1506 842 841 1381 +[MakerNotes, Canon, Camera] 25 - WB RGGB Levels Flash: 1933 832 831 895 +[MakerNotes, Canon, Camera] 29 - WB RGGB Levels Custom: 1722 832 831 989 +[MakerNotes, Canon, Camera] 33 - WB RGGB Levels Kelvin: 1722 832 831 988 +[MakerNotes, Canon, Camera] 37 - WB RGGB Black Levels: 124 123 124 123 +[MakerNotes, Canon, Camera] 174 - Color Temperature: 5200 +[MakerNotes, Canon, Camera] 180 - Color Space: sRGB +[MakerNotes, Canon, Camera] 0 - Num AF Points: 7 +[MakerNotes, Canon, Camera] 1 - Valid AF Points: 7 +[MakerNotes, Canon, Image] 2 - Canon Image Width: 3072 +[MakerNotes, Canon, Image] 3 - Canon Image Height: 2048 +[MakerNotes, Canon, Camera] 4 - AF Image Width: 3072 +[MakerNotes, Canon, Camera] 5 - AF Image Height: 2048 +[MakerNotes, Canon, Camera] 6 - AF Area Width: 151 +[MakerNotes, Canon, Camera] 7 - AF Area Height: 151 +[MakerNotes, Canon, Camera] 8 - AF Area X Positions: 1014 608 0 0 0 -608 -1014 +[MakerNotes, Canon, Camera] 9 - AF Area Y Positions: 0 0 -506 0 506 0 0 +[MakerNotes, Canon, Camera] 10 - AF Points In Focus: (none) +[MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 7 112 +[MakerNotes, Canon, Camera] 181 - Canon 0x00b5: 10 3 1 2048 1360 +[MakerNotes, Canon, Camera] 0 - Canon 0x0000: 0 0 0 0 0 0 3072000 892 2048000 595 65540 262146 +[IPTC, IPTC, Other] 15 - Category: IPT +[IPTC, IPTC, Other] 0 - Application Record Version: 4 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-dc, Image] description - Description: New description +[XMP, XMP-exif, Camera] Contrast - Contrast: High +[Composite, Composite, Camera] Canon-DriveMode - Drive Mode: Continuous Shooting +[Composite, Composite, Camera] Canon-ISO - ISO: 100 +[Composite, Composite, Camera] Canon-Lens - Lens: 18.0 - 55.0 mm +[Composite, Composite, Camera] Canon-ShootingMode - Shooting Mode: Bulb +[Composite, Composite, Camera] Canon-WB_RGGBLevels - WB RGGB Levels: 1719 832 831 990 +[Composite, Composite, Image] Exif-Aperture - Aperture: 14.0 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 4 +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.190619 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Unknown 18-55mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 5.6 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 2.067348 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.6 +[Composite, Composite, Camera] Canon-Lens35efl - Lens: 18.0 - 55.0 mm (35 mm equivalent: 28.6 - 87.4 mm) +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.019 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: inf (4.31 m - inf) +[Composite, Composite, Image] Exif-FOV - Field Of View: 36.9 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 34.0 mm (35 mm equivalent: 54.0 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 4.37 m diff --git a/t/Writer_7.out b/t/Writer_7.out new file mode 100644 index 0000000..f59713b --- /dev/null +++ b/t/Writer_7.out @@ -0,0 +1,151 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS DIGITAL REBEL +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:04 06:46:52 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 4 +[EXIF, ExifIFD, Image] 33437 - F Number: 14.0 +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 9 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 0 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 14.0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 4.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Average +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 34.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 160 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 120 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: THM - DCF thumbnail file +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, InteropIFD, Image] 4097 - Related Image Width: 3072 +[EXIF, InteropIFD, Image] 4098 - Related Image Height: 2048 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3443.946188 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3442.016807 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[MakerNotes, Canon, Camera] 1 - Macro Mode: Unknown (0) +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Continuous +[MakerNotes, Canon, Camera] 7 - Focus Mode: Manual Focus (3) +[MakerNotes, Canon, Camera] 9 - Record Mode: CRW+THM +[MakerNotes, Canon, Camera] 10 - Canon Image Size: Large +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: Unknown (-1) +[MakerNotes, Canon, Camera] 13 - Contrast: +1 +[MakerNotes, Canon, Camera] 14 - Saturation: +1 +[MakerNotes, Canon, Camera] 15 - Sharpness: +1 +[MakerNotes, Canon, Camera] 16 - Camera ISO: n/a +[MakerNotes, Canon, Camera] 17 - Metering Mode: Center-weighted average +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Manual +[MakerNotes, Canon, Camera] 22 - Lens Type: n/a +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 55 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 18 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 4 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 27 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: (none) +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 3072 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 3072 +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, Canon, Image] 1 - Focal Length: 34 mm +[MakerNotes, Canon, Image] 2 - Focal Plane X Size: 23.22 mm +[MakerNotes, Canon, Image] 3 - Focal Plane Y Size: 15.49 mm +[MakerNotes, Canon, Camera] 3 - Canon Flash Info: 100 0 0 0 +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 100 +[MakerNotes, Canon, Image] 3 - Measured EV: -1.25 +[MakerNotes, Canon, Image] 4 - Target Aperture: 14 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 19 - Focus Distance Upper: inf +[MakerNotes, Canon, Image] 20 - Focus Distance Lower: 5.46 m +[MakerNotes, Canon, Image] 21 - F Number: 14 +[MakerNotes, Canon, Image] 22 - Exposure Time: 128 +[MakerNotes, Canon, Image] 23 - Measured EV 2: -1.25 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 4 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS Mid-range +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 29 - Self Timer 2: 0 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Image] 6 - Canon Image Type: CRW:EOS DIGITAL REBEL CMOS RAW +[MakerNotes, Canon, Camera] 7 - Canon Firmware Version: Firmware Version 1.1.1 +[MakerNotes, Canon, Camera] 12 - Serial Number: 0560018150 +[MakerNotes, Canon, Camera] 21 - Serial Number Format: Format 1 +[MakerNotes, Canon, Image] 8 - File Number: 118-1861 +[MakerNotes, Canon, Camera] 9 - Owner Name: Phil Harvey +[MakerNotes, Canon, Camera] 16 - Canon Model ID: EOS Digital Rebel / 300D / Kiss Digital +[MakerNotes, Canon, Image] 14 - Canon File Length: 4480822 +[MakerNotes, Canon, Camera] 0 - Canon 0x0000: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +[MakerNotes, Canon, Camera] 192 - Canon 0x00c0: 26 331 372 372 177 240 428 429 277 186 510 511 442 +[MakerNotes, Canon, Camera] 193 - Canon 0x00c1: 26 299 375 375 170 202 394 395 240 153 453 454 375 +[MakerNotes, Canon, Camera] 1 - Measured RGGB: 998 1022 1026 808 +[MakerNotes, Canon, Camera] 168 - Canon 0x00a8: 20 5190 5190 7000 5987 3214 3897 6203 5190 5200 +[MakerNotes, Canon, Camera] 1 - WB RGGB Levels Auto: 1719 832 831 990 +[MakerNotes, Canon, Camera] 5 - WB RGGB Levels Daylight: 1722 832 831 989 +[MakerNotes, Canon, Camera] 9 - WB RGGB Levels Shade: 2035 832 831 839 +[MakerNotes, Canon, Camera] 13 - WB RGGB Levels Cloudy: 1878 832 831 903 +[MakerNotes, Canon, Camera] 17 - WB RGGB Levels Tungsten: 1228 913 912 1668 +[MakerNotes, Canon, Camera] 21 - WB RGGB Levels Fluorescent: 1506 842 841 1381 +[MakerNotes, Canon, Camera] 25 - WB RGGB Levels Flash: 1933 832 831 895 +[MakerNotes, Canon, Camera] 29 - WB RGGB Levels Custom: 1722 832 831 989 +[MakerNotes, Canon, Camera] 33 - WB RGGB Levels Kelvin: 1722 832 831 988 +[MakerNotes, Canon, Camera] 37 - WB RGGB Black Levels: 124 123 124 123 +[MakerNotes, Canon, Camera] 174 - Color Temperature: 5200 +[MakerNotes, Canon, Camera] 180 - Color Space: sRGB +[MakerNotes, Canon, Camera] 0 - Num AF Points: 7 +[MakerNotes, Canon, Camera] 1 - Valid AF Points: 7 +[MakerNotes, Canon, Image] 2 - Canon Image Width: 3072 +[MakerNotes, Canon, Image] 3 - Canon Image Height: 2048 +[MakerNotes, Canon, Camera] 4 - AF Image Width: 3072 +[MakerNotes, Canon, Camera] 5 - AF Image Height: 2048 +[MakerNotes, Canon, Camera] 6 - AF Area Width: 151 +[MakerNotes, Canon, Camera] 7 - AF Area Height: 151 +[MakerNotes, Canon, Camera] 8 - AF Area X Positions: 1014 608 0 0 0 -608 -1014 +[MakerNotes, Canon, Camera] 9 - AF Area Y Positions: 0 0 -506 0 506 0 0 +[MakerNotes, Canon, Camera] 10 - AF Points In Focus: (none) +[MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 7 112 +[MakerNotes, Canon, Camera] 181 - Canon 0x00b5: 10 3 1 2048 1360 +[MakerNotes, Canon, Camera] 0 - Canon 0x0000: 0 0 0 0 0 0 3072000 892 2048000 595 65540 262146 diff --git a/t/Writer_9.out b/t/Writer_9.out new file mode 100644 index 0000000..a805112 --- /dev/null +++ b/t/Writer_9.out @@ -0,0 +1,243 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: Writer_9_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 10 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:54-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Image] 270 - Image Description: +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon EOS DIGITAL REBEL +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: E775v1.3u +[EXIF, IFD0, Time] 306 - Modify Date: 2003:12:04 06:46:52 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 4 +[EXIF, ExifIFD, Image] 33437 - F Number: 14.0 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0221 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2003:12:04 06:46:52 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 3 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 0 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 14.0 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 4.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Center-weighted average +[EXIF, ExifIFD, Camera] 37384 - Light Source: Unknown +[EXIF, ExifIFD, Camera] 37385 - Flash: No Flash +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 34.0 mm +[EXIF, ExifIFD, Image] 37510 - User Comment: +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 160 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 120 +[EXIF, InteropIFD, Image] 1 - Interoperability Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Image] 2 - Interoperability Version: 0100 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3443.946154 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3442.016807 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard +[EXIF, ExifIFD, Camera] 41992 - Contrast: High +[EXIF, ExifIFD, Camera] 41993 - Saturation: High +[EXIF, ExifIFD, Camera] 41994 - Sharpness: Hard +[EXIF, ExifIFD, Image] 42032 - Owner Name: Phil Harvey +[EXIF, ExifIFD, Image] 42033 - Serial Number: 0560018150 +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 300 +[EXIF, IFD1, Image] 283 - Y Resolution: 300 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 2436 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 28 +[EXIF, IFD1, Preview] Exif-ThumbnailImage - Thumbnail Image: (Binary data 28 bytes) +[MakerNotes, Canon, Camera] 1 - Macro Mode: Unknown (0) +[MakerNotes, Canon, Camera] 2 - Self Timer: Off +[MakerNotes, Canon, Camera] 3 - Quality: RAW +[MakerNotes, Canon, Camera] 4 - Canon Flash Mode: Off +[MakerNotes, Canon, Camera] 5 - Continuous Drive: Continuous +[MakerNotes, Canon, Camera] 7 - Focus Mode: Manual Focus (3) +[MakerNotes, Canon, Camera] 9 - Record Mode: CRW+THM +[MakerNotes, Canon, Camera] 10 - Canon Image Size: Large +[MakerNotes, Canon, Camera] 11 - Easy Mode: Manual +[MakerNotes, Canon, Camera] 12 - Digital Zoom: Unknown (-1) +[MakerNotes, Canon, Camera] 13 - Contrast: +1 +[MakerNotes, Canon, Camera] 14 - Saturation: +1 +[MakerNotes, Canon, Camera] 15 - Sharpness: +1 +[MakerNotes, Canon, Camera] 16 - Camera ISO: n/a +[MakerNotes, Canon, Camera] 17 - Metering Mode: Center-weighted average +[MakerNotes, Canon, Camera] 18 - Focus Range: Not Known +[MakerNotes, Canon, Camera] 20 - Canon Exposure Mode: Manual +[MakerNotes, Canon, Camera] 22 - Lens Type: n/a +[MakerNotes, Canon, Camera] 23 - Max Focal Length: 55 mm +[MakerNotes, Canon, Camera] 24 - Min Focal Length: 18 mm +[MakerNotes, Canon, Camera] 25 - Focal Units: 1/mm +[MakerNotes, Canon, Camera] 26 - Max Aperture: 4 +[MakerNotes, Canon, Camera] 27 - Min Aperture: 27 +[MakerNotes, Canon, Camera] 28 - Flash Activity: 0 +[MakerNotes, Canon, Camera] 29 - Flash Bits: (none) +[MakerNotes, Canon, Camera] 36 - Zoom Source Width: 3072 +[MakerNotes, Canon, Camera] 37 - Zoom Target Width: 3072 +[MakerNotes, Canon, Camera] 41 - Manual Flash Output: n/a +[MakerNotes, Canon, Camera] 42 - Color Tone: Normal +[MakerNotes, Canon, Image] 1 - Focal Length: 34 mm +[MakerNotes, Canon, Image] 2 - Focal Plane X Size: 23.22 mm +[MakerNotes, Canon, Image] 3 - Focal Plane Y Size: 15.49 mm +[MakerNotes, Canon, Image] 1 - Auto ISO: 100 +[MakerNotes, Canon, Image] 2 - Base ISO: 100 +[MakerNotes, Canon, Image] 3 - Measured EV: -1.25 +[MakerNotes, Canon, Image] 4 - Target Aperture: 14 +[MakerNotes, Canon, Image] 6 - Exposure Compensation: 0 +[MakerNotes, Canon, Image] 7 - White Balance: Auto +[MakerNotes, Canon, Image] 8 - Slow Shutter: None +[MakerNotes, Canon, Image] 9 - Shot Number In Continuous Burst: 0 +[MakerNotes, Canon, Camera] 10 - Optical Zoom Code: n/a +[MakerNotes, Canon, Image] 13 - Flash Guide Number: 0 +[MakerNotes, Canon, Image] 15 - Flash Exposure Compensation: 0 +[MakerNotes, Canon, Image] 16 - Auto Exposure Bracketing: Off +[MakerNotes, Canon, Image] 17 - AEB Bracket Value: 0 +[MakerNotes, Canon, Image] 18 - Control Mode: Camera Local Control +[MakerNotes, Canon, Image] 19 - Focus Distance Upper: inf +[MakerNotes, Canon, Image] 20 - Focus Distance Lower: 5.46 m +[MakerNotes, Canon, Image] 21 - F Number: 14 +[MakerNotes, Canon, Image] 22 - Exposure Time: 128 +[MakerNotes, Canon, Image] 23 - Measured EV 2: -1.25 +[MakerNotes, Canon, Image] 24 - Bulb Duration: 4 +[MakerNotes, Canon, Camera] 26 - Camera Type: EOS Mid-range +[MakerNotes, Canon, Image] 27 - Auto Rotate: None +[MakerNotes, Canon, Image] 28 - ND Filter: n/a +[MakerNotes, Canon, Image] 29 - Self Timer 2: 0 +[MakerNotes, Canon, Image] 3 - Bracket Mode: Off +[MakerNotes, Canon, Image] 4 - Bracket Value: 0 +[MakerNotes, Canon, Image] 5 - Bracket Shot Number: 0 +[MakerNotes, Canon, Image] 6 - Canon Image Type: CRW:EOS DIGITAL REBEL CMOS RAW +[MakerNotes, Canon, Camera] 7 - Canon Firmware Version: Firmware Version 1.1.1 +[MakerNotes, Canon, Camera] 12 - Serial Number: 0560018150 +[MakerNotes, Canon, Camera] 21 - Serial Number Format: Format 1 +[MakerNotes, Canon, Image] 8 - File Number: 118-1861 +[MakerNotes, Canon, Camera] 9 - Owner Name: Phil Harvey +[MakerNotes, Canon, Camera] 16 - Canon Model ID: EOS Digital Rebel / 300D / Kiss Digital +[MakerNotes, Canon, Image] 14 - Canon File Length: 4480822 +[MakerNotes, Canon, Camera] 1 - Measured RGGB: 998 1022 1026 808 +[MakerNotes, Canon, Camera] 1 - WB RGGB Levels Auto: 1719 832 831 990 +[MakerNotes, Canon, Camera] 5 - WB RGGB Levels Daylight: 1722 832 831 989 +[MakerNotes, Canon, Camera] 9 - WB RGGB Levels Shade: 2035 832 831 839 +[MakerNotes, Canon, Camera] 13 - WB RGGB Levels Cloudy: 1878 832 831 903 +[MakerNotes, Canon, Camera] 17 - WB RGGB Levels Tungsten: 1228 913 912 1668 +[MakerNotes, Canon, Camera] 21 - WB RGGB Levels Fluorescent: 1506 842 841 1381 +[MakerNotes, Canon, Camera] 25 - WB RGGB Levels Flash: 1933 832 831 895 +[MakerNotes, Canon, Camera] 29 - WB RGGB Levels Custom: 1722 832 831 989 +[MakerNotes, Canon, Camera] 33 - WB RGGB Levels Kelvin: 1722 832 831 988 +[MakerNotes, Canon, Camera] 37 - WB RGGB Black Levels: 124 123 124 123 +[MakerNotes, Canon, Camera] 174 - Color Temperature: 5200 +[MakerNotes, Canon, Camera] 180 - Color Space: sRGB +[MakerNotes, Canon, Camera] 0 - Num AF Points: 7 +[MakerNotes, Canon, Camera] 1 - Valid AF Points: 7 +[MakerNotes, Canon, Image] 2 - Canon Image Width: 3072 +[MakerNotes, Canon, Image] 3 - Canon Image Height: 2048 +[MakerNotes, Canon, Camera] 4 - AF Image Width: 3072 +[MakerNotes, Canon, Camera] 5 - AF Image Height: 2048 +[MakerNotes, Canon, Camera] 6 - AF Area Width: 151 +[MakerNotes, Canon, Camera] 7 - AF Area Height: 151 +[MakerNotes, Canon, Camera] 8 - AF Area X Positions: 1014 608 0 0 0 -608 -1014 +[MakerNotes, Canon, Camera] 9 - AF Area Y Positions: 0 0 -506 0 506 0 0 +[MakerNotes, Canon, Camera] 10 - AF Points In Focus: (none) +[MakerNotes, Canon, Camera] 19 - Thumbnail Image Valid Area: 0 159 7 112 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-aux, Camera] Lens - Lens: 18.0 - 55.0 mm +[XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: Y, Cb, Cr, - +[XMP, XMP-exif, Image] CompressedBitsPerPixel - Compressed Bits Per Pixel: 9 +[XMP, XMP-exif, Camera] FlashFired - Flash Fired: False +[XMP, XMP-exif, Camera] FlashFunction - Flash Function: False +[XMP, XMP-exif, Camera] FlashMode - Flash Mode: Unknown +[XMP, XMP-exif, Camera] FlashRedEyeMode - Flash Red Eye Mode: False +[XMP, XMP-exif, Camera] FlashReturn - Flash Return: No return detection +[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: THM - DCF thumbnail file +[XMP, XMP-pmi, Image] sequenceNumber - Sequence Number: 0 +[XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8 +[XMP, XMP-tiff, Image] ImageLength - Image Height: 8 +[XMP, XMP-tiff, Image] ImageWidth - Image Width: 8 +[XMP, XMP-tiff, Image] YCbCrPositioning - Y Cb Cr Positioning: Centered +[XMP, XMP-tiff, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[XMP, XMP-crs, Image] Temperature - Color Temperature: 5200 +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Linotronic +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.1.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1998:02:09 06:49:00 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Microsoft Corporation +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: Hewlett-Packard +[ICC_Profile, ICC-header, Image] 52 - Device Model: sRGB +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: Hewlett-Packard +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Copyright (c) 1998 Hewlett-Packard Company +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: sRGB IEC61966-2.1 +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.95045 1 1.08905 +[ICC_Profile, ICC_Profile, Image] bkpt - Media Black Point: 0 0 0 +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.43607 0.22249 0.01392 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.38515 0.71687 0.09708 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.14307 0.06061 0.7141 +[ICC_Profile, ICC_Profile, Camera] dmnd - Device Mfg Desc: IEC http://www.iec.ch +[ICC_Profile, ICC_Profile, Camera] dmdd - Device Model Desc: IEC 61966-2.1 Default RGB colour space - sRGB +[ICC_Profile, ICC_Profile, Image] vued - Viewing Cond Desc: Reference Viewing Condition in IEC61966-2.1 +[ICC_Profile, ICC-view, Image] 8 - Viewing Cond Illuminant: 19.6445 20.3718 16.8089 +[ICC_Profile, ICC-view, Image] 20 - Viewing Cond Surround: 3.92889 4.07439 3.36179 +[ICC_Profile, ICC-view, Image] 32 - Viewing Cond Illuminant Type: D50 +[ICC_Profile, ICC_Profile, Image] lumi - Luminance: 76.03647 80 87.12462 +[ICC_Profile, ICC-meas, Image] 8 - Measurement Observer: CIE 1931 +[ICC_Profile, ICC-meas, Image] 12 - Measurement Backing: 0 0 0 +[ICC_Profile, ICC-meas, Image] 24 - Measurement Geometry: Unknown +[ICC_Profile, ICC-meas, Image] 28 - Measurement Flare: 0.999% +[ICC_Profile, ICC-meas, Image] 32 - Measurement Illuminant: D65 +[ICC_Profile, ICC_Profile, Image] tech - Technology: Cathode Ray Tube Display +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 2060 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 2060 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 2060 bytes) +[Composite, Composite, Camera] Canon-DriveMode - Drive Mode: Continuous Shooting +[Composite, Composite, Camera] Canon-ISO - ISO: 100 +[Composite, Composite, Camera] Canon-Lens - Lens: 18.0 - 55.0 mm +[Composite, Composite, Camera] Canon-ShootingMode - Shooting Mode: Bulb +[Composite, Composite, Camera] Canon-WB_RGGBLevels - WB RGGB Levels: 1719 832 831 990 +[Composite, Composite, Image] Exif-Aperture - Aperture: 14.0 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 4 +[Composite, Composite, Camera] XMP-Flash - Flash: No Flash +[Composite, Composite, Camera] Exif-BlueBalance - Blue Balance: 1.190619 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Camera] Exif-LensID - Lens ID: Unknown 18-55mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 5.6 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-RedBalance - Red Balance: 2.067348 +[Composite, Composite, Camera] Exif-ScaleFactor35efl - Scale Factor To 35 mm Equivalent: 1.6 +[Composite, Composite, Camera] Canon-Lens35efl - Lens: 18.0 - 55.0 mm (35 mm equivalent: 27.9 - 85.3 mm) +[Composite, Composite, Camera] Exif-CircleOfConfusion - Circle Of Confusion: 0.019 mm +[Composite, Composite, Image] Exif-DOF - Depth Of Field: inf (4.21 m - inf) +[Composite, Composite, Image] Exif-FOV - Field Of View: 37.7 deg +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 34.0 mm (35 mm equivalent: 52.7 mm) +[Composite, Composite, Camera] Exif-HyperfocalDistance - Hyperfocal Distance: 4.26 m diff --git a/t/XMP.t b/t/XMP.t new file mode 100644 index 0000000..40967ad --- /dev/null +++ b/t/XMP.t @@ -0,0 +1,701 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/XMP.t". + +BEGIN { + $| = 1; print "1..54\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# definitions for user-defined tag test (#26) +%Image::ExifTool::UserDefined = ( + 'Image::ExifTool::XMP::Main' => { + myXMPns => { + SubDirectory => { + TagTable => 'Image::ExifTool::UserDefined::myXMPns', + # (see the definition of this table below) + }, + }, + }, +); +use vars %Image::ExifTool::UserDefined::myXMPns; # avoid "typo" warning +%Image::ExifTool::UserDefined::myXMPns = ( + GROUPS => { 0 => 'XMP', 1 => 'XMP-myXMPns'}, + NAMESPACE => { 'myXMPns' => 'http://ns.exiftool.org/t/XMP.t' }, + WRITABLE => 'string', + ATestTag => { List => 'Bag', Resource => 1 }, + BTestTag => { + Struct => { + TYPE => 'myXMPns:SomeFunnyType', + Field1 => { Writable => 'lang-alt', List => 'Bag' }, + } + }, + BTestTagField1 => { Name => 'Renamed', Flat => 1 }, +); + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::XMP; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'XMP'; +my $testnum = 1; + +# test 2: Extract information from XMP.jpg +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/XMP.jpg', {Duplicates => 1}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 3: Test rewriting everything with slightly different values +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Duplicates => 1, Binary => 1, ListJoin => undef); + my $info = $exifTool->ImageInfo('t/images/XMP.jpg'); + my $tag; + foreach $tag (keys %$info) { + my $group = $exifTool->GetGroup($tag); + my $val = $$info{$tag}; + if (ref $val eq 'ARRAY') { + push @$val, 'v2'; + } elsif (ref $val eq 'SCALAR') { + $val = 'v2'; + } elsif ($val =~ /^\d+(\.\d*)?$/) { + # (add extra .001 to avoid problem with aperture of 4.85 + # getting rounded to 4.8 or 4.9 and causing failed tests) + $val += ($val / 10) + 1.001; + $1 or $val = int($val); + } else { + $val .= '-v2'; + } + # eat return values so warning don't get printed + my @x = $exifTool->SetNewValue($tag, $val, Group=>$group, Replace=>1); + } + # also try writing a few specific tags + $exifTool->SetNewValue(CreatorCountry => 'Canada'); + $exifTool->SetNewValue(CodedCharacterSet => 'UTF8', Protected => 1); + undef $info; + my $image; + my $ok = writeInfo($exifTool,'t/images/XMP.jpg',\$image); + # this is effectively what the RHEL 3 UTF8 LANG problem does: + # $image = pack("U*", unpack("C*", $image)); + + my $exifTool2 = new Image::ExifTool; + $exifTool2->Options(Duplicates => 1); + $info = $exifTool2->ImageInfo(\$image); + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + if (check($exifTool2, $info, $testname, $testnum) and $ok) { + unlink $testfile; + } else { + # save bad file + open(TESTFILE,">$testfile"); + binmode(TESTFILE); + print TESTFILE $image; + close(TESTFILE); + print 'not '; + } + print "ok $testnum\n"; +} + +# tests 4/5: Test extracting then reading XMP data as a block +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/XMP.jpg','XMP'); + print 'not ' unless $$info{XMP}; + print "ok $testnum\n"; + + ++$testnum; + my $pass; + if ($$info{XMP}) { + $info = $exifTool->ImageInfo($$info{XMP}); + $pass = check($exifTool, $info, $testname, $testnum); + } + print 'not ' unless $pass; + print "ok $testnum\n"; +} + +# test 6: Test copying information to a new XMP data file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/XMP.jpg'); + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + my $ok = writeInfo($exifTool,undef,$testfile); + my $info = $exifTool->ImageInfo($testfile); + if (check($exifTool, $info, $testname, $testnum) and $ok) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 7: Test rewriting CS2 XMP information +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + $exifTool->SetNewValue(Label => 'Blue'); + $exifTool->SetNewValue(Rating => 3); + $exifTool->SetNewValue(Subject => q{char test: & > < ' "}, AddValue => 1); + $exifTool->SetNewValue('Rights' => "\xc2\xa9 Copyright Someone Else"); + my $ok = writeInfo($exifTool,'t/images/XMP.xmp',$testfile); + print 'not ' unless testCompare("t/XMP_$testnum.out",$testfile,$testnum) and $ok; + print "ok $testnum\n"; +} + +# test 8-11: Test reading/writing XMP with blank nodes and some problems that need correcting +{ + my $file; + foreach $file ('XMP2.xmp', 'XMP3.xmp') { + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo("t/images/$file", {Duplicates => 1}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + + ++$testnum; + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + $exifTool->SetNewValue('XMP:Creator' => 'Phil', AddValue => 1); + $exifTool->SetNewValue('manifestplacedXResolution' => 1); + $exifTool->SetNewValue('attributionname' => 'something else'); + $exifTool->WriteInfo("t/images/$file", $testfile); + my $err = $exifTool->GetValue('Error'); + warn "\n $err\n" if $err; + print 'not ' unless testCompare("t/XMP_$testnum.out",$testfile,$testnum); + print "ok $testnum\n"; + } +} + +# tests 12-17: Test writing/deleting XMP alternate languages +{ + my @writeList = ( + [ ['Rights-x-default' => "\xc2\xa9 Copyright Another One"] ], # should overwrite x-default only + [ ['Rights-de-DE' => "\xc2\xa9 Urheberrecht Phil Harvey"] ], # should create de-DE only + [ ['Rights-x-default' => undef] ], # should delete x-default only + [ ['Rights-fr' => undef] ], # should delete fr only + [ ['Title-fr' => 'Test fr title'] ],# should not create x-default + [ ['Title-fr' => 'Test fr title'], + ['Title-x-default' => 'dTitle'] ],# should create x-default before fr + ); + my $writeListRef; + foreach $writeListRef (@writeList) { + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + print 'not ' unless writeCheck($writeListRef, $testname, $testnum, + 't/images/XMP.xmp', ['XMP-dc:*']); + print "ok $testnum\n"; + } +} + +# test 18: Delete some family 1 XMP groups +{ + ++$testnum; + my @writeInfo = ( + [ 'xmp-xmpmm:all' => undef ], + [ 'XMP-PHOTOSHOP:all' => undef ], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, + 't/images/XMP.jpg', ['XMP:all']); + print "ok $testnum\n"; +} + +# test 19-20: Copy from XMP to EXIF with and without PrintConv enabled +{ + my $exifTool = new Image::ExifTool; + while ($testnum < 20) { + ++$testnum; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->SetNewValue(); + $exifTool->SetNewValuesFromFile('t/images/XMP.xmp', 'XMP:all>EXIF:all'); + my $ok = writeInfo($exifTool, "t/images/Writer.jpg", $testfile); + my $info = $exifTool->ImageInfo($testfile, 'EXIF:all'); + if (check($exifTool, $info, $testname, $testnum) and $ok) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + $exifTool->Options(PrintConv => 0); + } +} + +# test 21-22: Copy from EXIF to XMP with and without PrintConv enabled +{ + my $exifTool = new Image::ExifTool; + while ($testnum < 22) { + ++$testnum; + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + $exifTool->SetNewValue(); + $exifTool->SetNewValuesFromFile('t/images/Canon.jpg', 'EXIF:* > XMP:*'); + my $ok = writeInfo($exifTool, undef, $testfile); + my $info = $exifTool->ImageInfo($testfile, 'XMP:*'); + if (check($exifTool, $info, $testname, $testnum) and $ok) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + $exifTool->Options(PrintConv => 0); + } +} + +# test 23: Delete all tags except two specific XMP family 1 groups +{ + ++$testnum; + my @writeInfo = ( + [ 'all' => undef ], + [ 'xmp-dc:all' => undef, Replace => 2 ], + [ 'xmp-xmprights:all' => undef, Replace => 2 ], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, + 't/images/XMP.jpg', ['XMP:all'], undef, 1); + print "ok $testnum\n"; +} + +# test 24: Delete all tags except XMP +{ + ++$testnum; + my @writeInfo = ( + [ 'all' => undef ], + [ 'xmp:all' => undef, Replace => 2 ], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, + 't/images/XMP.jpg', ['-file:all'], undef, 1); + print "ok $testnum\n"; +} + +# test 25: Extract information from SVG image +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/XMP.svg', {Duplicates => 1}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 26: Test creating a variety of XMP information +# (including x:xmptk, rdf:about and rdf:resource attributes) +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + my @writeInfo = ( + [ 'XMP-x:XMPToolkit' => "What's this?", Protected => 1 ], + [ 'XMP-rdf:About' => "http://www.exiftool.org/t/$testname.t#$testnum", Protected => 1 ], + [ 'XMP:ImageType' => 'Video' ], + [ 'LicenseeImageNotes-en' => 'english notes' ], + [ 'LicenseeImageNotes-de' => 'deutsche anmerkungen' ], + [ 'LicenseeImageNotes' => 'default notes' ], + [ 'LicenseeName' => 'Phil' ], + [ 'CopyrightStatus' => 'public' ], + [ 'Custom1-en' => 'a' ], + [ 'Custom1-en' => 'b' ], + [ 'ATestTag' => "http://www.exiftool.org/t/$testname.t#$testnum-one" ], + [ 'ATestTag' => "http://www.exiftool.org/t/$testname.t#$testnum-two" ], + ); + $exifTool->SetNewValue(@$_) foreach @writeInfo; + my $ok = writeInfo($exifTool, undef, $testfile); + print 'not ' unless testCompare("t/XMP_$testnum.out",$testfile,$testnum) and $ok; + print "ok $testnum\n"; +} + +# test 27: Extract information from exiftool RDF/XML output file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/XMP.xml', {Duplicates => 1}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 28: Write information to exiftool RDF/XML output file +{ + ++$testnum; + my @writeInfo = ( + [ 'all' => undef ], + [ 'ifd0:all' => undef, Replace => 2 ], + [ 'XML-file:all' => undef, Replace => 2 ], + [ 'author' => 'Phil' ], + ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/XMP.xml'); + print "ok $testnum\n"; +} + +# test 29: Rewrite extended XMP segment +{ + ++$testnum; + my @writeInfo = ( [ 'author' => 'Test' ] ); + print 'not ' unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/ExtendedXMP.jpg'); + print "ok $testnum\n"; +} + +# test 30: Test mass copy with deletion of specific XMP family 1 groups in shorthand format +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(XMPShorthand => 1); + my $testfile = "t/${testname}_${testnum}_failed.out"; + unlink $testfile; + $exifTool->SetNewValuesFromFile('t/images/XMP.jpg'); + $exifTool->SetNewValue('xmp-exif:all'); + $exifTool->SetNewValue('XMP-TIFF:*'); + $exifTool->WriteInfo(undef,$testfile,'XMP'); #(also test output file type option) + print 'not ' unless testCompare("t/XMP_$testnum.out",$testfile,$testnum); + print "ok $testnum\n"; +} + +# test 31: Extract structured information +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/XMP4.xmp', {Struct => 1}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# tests 32-34: Conditionally add XMP lang-alt tag +{ + # write title only if it doesn't exist + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile; + $exifTool->SetNewValue('XMP-dc:Title-de' => '', DelValue => 1); + $exifTool->SetNewValue('XMP-dc:Title-de' => 'A'); + my $ok = writeInfo($exifTool,'t/images/Writer.jpg',$testfile); + my $info = $exifTool->ImageInfo($testfile,'XMP:*'); + print 'not ' unless check($exifTool, $info, $testname, $testnum) and $ok; + print "ok $testnum\n"; + + # try again when title already exists + ++$testnum; + my $testfile2 = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile2; + $exifTool->SetNewValue('XMP-dc:Title-de' => 'B'); + $exifTool->WriteInfo($testfile,$testfile2); + $info = $exifTool->ImageInfo($testfile2,'XMP:*'); + if (check($exifTool, $info, $testname, $testnum, 32)) { + unlink $testfile2 + } else { + print 'not '; + } + print "ok $testnum\n"; + + # one final time replacing an existing title + ++$testnum; + $testfile2 = "t/${testname}_${testnum}_failed.jpg"; + unlink $testfile2; + $exifTool->SetNewValue('XMP-dc:Title-de' => 'A', DelValue => 1); + $exifTool->SetNewValue('XMP-dc:Title-de' => 'C'); + $ok = writeInfo($exifTool,$testfile,$testfile2); + $info = $exifTool->ImageInfo($testfile2,'XMP:*'); + if (check($exifTool, $info, $testname, $testnum) and $ok) { + unlink $testfile; + unlink $testfile2 + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 35: Test various features of writing structured information +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + my @writeInfo = ( + # write as flattened string + [ HierarchicalKeywords => '{keyWORD=A-1,childREN={keyword=A-2}}' ], + # write as HASH reference + [ HierarchicalKeywords => [{kEyWoRd=>'B-1', cHiLdReN=>{keyword=>'B-2'}},{keyword=>'C-1'}] ], + # write a type'd structure + [ licensee => {licenseename=>'Phil'} ], + # write a region, including a 'seeAlso' resource + [ 'RegionList', { + Area => {X=>0,Y=>0,W=>8,H=>8}, + Name => 'Region 1', + type => 'Face', + seeAlso => 'plus:Licensee', + }], + # write alternate language structure elements + [ ArtworkOrObject => "{AOTitle=test,aotitle-de=pr\xc3\xbcfung,AOTitle_FR=\xc3\xa9preuve}" ], + # disable print conversion for a single structure element + [ 'XMP:Flash' => '{Return=no,mode#=2}' ], + # write a complex user-defined lang-alt structure + [ BTestTag => "{Field1-en-CA=[eh?],Field1-en-US=[huh?,groovy],Field1-fr=[,ing\xc3\xa9nieux]}" ], + # write some dynamic structure elements + [ RegionList => { Extensions => { + # may mix-and-match flattened and structured tags when writing!... + 'XMP-exif:FlashReturn' => 'not', # flattened tag with group name + Flash => { 'Mode#' => 1 }, # structured tag with disabled conversion + 'UsageTerms-fr' => 'libre', # lang-alt tag + 'ArtworkTitle-de' => "verf\xc3\xa4nglich", # renamed lang-alt tag in a list + Renamed => 'this is wild', # user-defined renamed flattened tag with TYPE + }}], + ); + $exifTool->SetNewValue(@$_) foreach @writeInfo; + my $ok = writeInfo($exifTool,undef,$testfile); + print 'not ' unless testCompare("t/images/XMP5.xmp",$testfile,$testnum) and $ok; + print "ok $testnum\n"; +} + +# tests 36-37: Test reading structures with and without the Struct option +{ + my $i; + for ($i=0; $i<2; ++$i) { + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(Struct => 1 - $i); + $exifTool->Options(Escape => 'HTML'); # test escaping of structure fields too + my $info = $exifTool->ImageInfo("t/images/XMP5.xmp"); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + } +} + +# test 38: Copy complex structured information +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + $exifTool->SetNewValuesFromFile('t/images/XMP5.xmp', 'xmp:all'); + my $ok = writeInfo($exifTool,undef,$testfile); + print 'not ' unless testCompare("t/images/XMP5.xmp",$testfile,$testnum) and $ok; + print "ok $testnum\n"; +} + +# test 39: Extract information from an INX file +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/XMP.inx', {Duplicates => 1}); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 40: Copy by flattened tag name and structure at the same time +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + $exifTool->SetNewValuesFromFile('t/images/XMP5.xmp', 'HierarchicalKeywords1', 'Licensee'); + my $ok = writeInfo($exifTool,undef,$testfile); + my $info = $exifTool->ImageInfo($testfile, 'XMP:*'); + if (check($exifTool, $info, $testname, $testnum) and $ok) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 41: Rest writing/reading all DarwinCore tags +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + $exifTool->SetNewValue('xmp-dwc:*' => 2013); + my $ok = writeInfo($exifTool, undef, $testfile); + my $info = $exifTool->ImageInfo($testfile, {Duplicates => 1}); + if (check($exifTool, $info, $testname, $testnum) and $ok) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 42: Read extended XMP +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/ExtendedXMP.jpg', 'xmp:all'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 43: Read XMP with unusual namespace prefixes +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/XMP6.xmp', 'xmp:all'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + +# test 44: Write XMP with unusual namespace prefixes +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + $exifTool->SetNewValue('xmp-dc:subject' => 'changed'); + $exifTool->WriteInfo("t/images/XMP6.xmp", $testfile); + my $err = $exifTool->GetValue('Error'); + warn "\n $err\n" if $err; + print 'not ' unless testCompare("t/XMP_$testnum.out",$testfile,$testnum); + print "ok $testnum\n"; +} + +# test 45: Write empty structures +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + $exifTool->SetNewValue('regioninfo' => '{RegionList=[,]}'); + $exifTool->SetNewValue('xmp:flash' => '{}'); + $exifTool->WriteInfo(undef, $testfile); + print 'not ' unless testCompare("t/XMP_$testnum.out",$testfile,$testnum); + print "ok $testnum\n"; +} + +# test 46: Test the advanced-formatting '@' feature on an XMP:Subject list +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(ListSplit => ', '); + my $cpy = 'subject<${subject@;/^Test/ ? $_=undef : s/Tool$//}'; + $exifTool->SetNewValuesFromFile('t/images/XMP.jpg', $cpy); + $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + writeInfo($exifTool, undef, $testfile); + $exifTool->Options(ListSep => ' // '); + my $info = $exifTool->ImageInfo($testfile, 'Subject'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# tests 47-49: Test replacing specific elements in list of structures +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->Options(ListSplit => ','); + $exifTool->Options(Struct => 1); + $exifTool->SetNewValue('LocationShownCity' => 'Manchester,Lyon,Frankfurt'); + $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + writeInfo($exifTool, 't/images/XMP7.xmp', $testfile); + my $info = $exifTool->ImageInfo($testfile, 'XMP:all'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + + ++$testnum; + $exifTool->SetNewValue(); + $exifTool->SetNewValue('LocationShownCity' => 'London,Berlin', DelValue => 1); + $exifTool->SetNewValue('LocationShownCity' => 'Oxford,Munich'); + $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + writeInfo($exifTool, 't/images/XMP7.xmp', $testfile); + $info = $exifTool->ImageInfo($testfile, 'XMP:all'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; + + ++$testnum; + $exifTool->SetNewValue(); + $exifTool->SetNewValue('AboutCvTermName' => 'one,three', DelValue => 1); + $exifTool->SetNewValue('AboutCvTermName' => 'a,b,c'); + $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + writeInfo($exifTool, 't/images/XMP8.xmp', $testfile); + $info = $exifTool->ImageInfo($testfile, 'XMP:all'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + +# test 50-53: Test replacing/creating elements in nested lang-alt list +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValuesFromFile('t/images/XMP9.xmp', '*:*'); + $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + $exifTool->WriteInfo('t/images/XMP9.xmp', $testfile); + print 'not ' unless testCompare("t/XMP_$testnum.out",$testfile,$testnum); + print "ok $testnum\n"; + + ++$testnum; + $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + $exifTool->WriteInfo(undef, $testfile); + print 'not ' unless testCompare('t/XMP_50.out',$testfile,$testnum); + print "ok $testnum\n"; + + ++$testnum; + $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + $exifTool->SetNewValue(); + $exifTool->SetNewValue(Custom1 => 'test', DelValue => 1); + $exifTool->SetNewValue(Custom1 => 'new'); + $exifTool->WriteInfo('t/images/XMP9.xmp', $testfile); + print 'not ' unless testCompare("t/XMP_$testnum.out",$testfile,$testnum); + print "ok $testnum\n"; + + ++$testnum; + $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + $exifTool->Options(ListSplit => ','); + $exifTool->SetNewValue(); + $exifTool->SetNewValue(Custom1 => 'a,b,c', AddValue => 1); + $exifTool->SetNewValue('Custom1-fr' => 'a-fr,,c-fr,d-fr,,f-fr', AddValue => 1); + $exifTool->WriteInfo('t/images/XMP9.xmp', $testfile); + print 'not ' unless testCompare("t/XMP_$testnum.out",$testfile,$testnum); + print "ok $testnum\n"; +} + +# test 54: Write flattened tag and extension in a variable-namespace structure +{ + ++$testnum; + $testfile = "t/${testname}_${testnum}_failed.xmp"; + unlink $testfile; + my $exifTool = new Image::ExifTool; + $exifTool->SetNewValue(ImageRegionCtypeIdentifier => 'x'); + $exifTool->SetNewValue(ImageRegion => '{Flash={Fired=True,Return#=3}}'); + $exifTool->WriteInfo(undef, $testfile); + $exifTool->Options(Struct => 1); + my $info = $exifTool->ImageInfo($testfile, 'XMP-iptcExt:all'); + if (check($exifTool, $info, $testname, $testnum)) { + unlink $testfile; + } else { + print 'not '; + } + print "ok $testnum\n"; +} + + +# end diff --git a/t/XMP_10.out b/t/XMP_10.out new file mode 100644 index 0000000..9d77afa --- /dev/null +++ b/t/XMP_10.out @@ -0,0 +1,37 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: XMP3.xmp +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 2.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:12:04 21:22:58-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:58-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: XMP +[File, File, Other] FileTypeExtension - File Type Extension: xmp +[File, File, Other] MIMEType - MIME Type: application/rdf+xml +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 6.32 +[XMP, XMP-rdf, Document] about - About: http://www.w3.org/TR/rdf-syntax-grammar +[XMP, XMP-dc, Image] title - Title: ExifTool common node, nonstandard namespace prefix, and bad list type tests +[XMP, XMP-dc, Author] creator - Creator: bad_list_type_A, bad_list_type_B +[XMP, XMP-iptcCore, Location] CountryCode - Country Code: CA +[XMP, XMP-iptcCore, Other] Scene - Scene: scene1 +[XMP, XMP-pdfx, Document] Customↂ0020Propertyↂ00201 - Custom 0020 Property 00201: a custom property value +[XMP, XMP-pdfx, Document] Customↂ0020Propertyↂ00202 - Custom 0020 Property 00202: some other value +[XMP, XMP-xmpMM, Other] ManifestLinkForm - Manifest Link Form: EmbedByReference +[XMP, XMP-xmpMM, Other] ManifestReferenceFilePath - Manifest Reference File Path: C:\some path\file.ext +[XMP, XMP-cc, Author] attributionName - Attribution Name: some attr +[XMP, XMP-ph, Unknown] ph:programmerExclamation - Programmer Exclamation: doh! +[XMP, XMP-ph, Unknown] ph:programmerFood - Programmer Food: cookies +[XMP, XMP-ph, Unknown] ph:programmerFullName - Programmer Full Name: Phil Harvey +[XMP, XMP-ph, Unknown] ph:programmerHomePage - Programmer Home Page: https://exiftool.org/ +[XMP, XMP-ph, Unknown] ph:programmerState - Programmer State: confusion +[XMP, XMP-ph, Unknown] ph:supervisorExclamation - Supervisor Exclamation: doh! +[XMP, XMP-ph, Unknown] ph:supervisorFood - Supervisor Food: cookies +[XMP, XMP-ph, Unknown] ph:supervisorFullName - Supervisor Full Name: Phil Harvey +[XMP, XMP-ph, Unknown] ph:supervisorHomePage - Supervisor Home Page: https://exiftool.org/ +[XMP, XMP-ph, Unknown] ph:supervisorState - Supervisor State: confusion +[XMP, XMP-ph, Unknown] ph:testerExclamation - Tester Exclamation: doh! +[XMP, XMP-ph, Unknown] ph:testerFood - Tester Food: cookies +[XMP, XMP-ph, Unknown] ph:testerFullName - Tester Full Name: Phil Harvey +[XMP, XMP-ph, Unknown] ph:testerHomePage - Tester Home Page: https://exiftool.org/ +[XMP, XMP-ph, Unknown] ph:testerState - Tester State: confusion diff --git a/t/XMP_11.out b/t/XMP_11.out new file mode 100644 index 0000000..49e03ac --- /dev/null +++ b/t/XMP_11.out @@ -0,0 +1,81 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 9.75'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='http://www.w3.org/TR/rdf-syntax-grammar' + xmlns:Iptc4xmpCore='http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/'> + <Iptc4xmpCore:CountryCode>CA</Iptc4xmpCore:CountryCode> + <Iptc4xmpCore:Scene> + <rdf:Bag> + <rdf:li>scene1</rdf:li> + </rdf:Bag> + </Iptc4xmpCore:Scene> + </rdf:Description> + + <rdf:Description rdf:about='http://www.w3.org/TR/rdf-syntax-grammar' + xmlns:cc='http://creativecommons.org/ns#'> + <cc:attributionName>something else</cc:attributionName> + </rdf:Description> + + <rdf:Description rdf:about='http://www.w3.org/TR/rdf-syntax-grammar' + xmlns:dc='http://purl.org/dc/elements/1.1/'> + <dc:creator> + <rdf:Seq> + <rdf:li>bad_list_type_A</rdf:li> + <rdf:li>bad_list_type_B</rdf:li> + <rdf:li>Phil</rdf:li> + </rdf:Seq> + </dc:creator> + <dc:title>ExifTool common node, nonstandard namespace prefix, and bad list type tests</dc:title> + </rdf:Description> + + <rdf:Description rdf:about='http://www.w3.org/TR/rdf-syntax-grammar' + xmlns:pdfx='http://ns.adobe.com/pdfx/1.3/'> + <pdfx:Customↂ0020Propertyↂ00201>a custom property value</pdfx:Customↂ0020Propertyↂ00201> + <pdfx:Customↂ0020Propertyↂ00202>some other value</pdfx:Customↂ0020Propertyↂ00202> + </rdf:Description> + + <rdf:Description rdf:about='http://www.w3.org/TR/rdf-syntax-grammar' + xmlns:ph='https://exiftool.org/ph/1.0/'> + <ph:programmer rdf:parseType='Resource'> + <ph:exclamation>doh!</ph:exclamation> + <ph:food>cookies</ph:food> + <ph:fullName>Phil Harvey</ph:fullName> + <ph:homePage rdf:resource='https://exiftool.org/'/> + <ph:state>confusion</ph:state> + </ph:programmer> + <ph:supervisor rdf:parseType='Resource'> + <ph:exclamation>doh!</ph:exclamation> + <ph:food>cookies</ph:food> + <ph:fullName>Phil Harvey</ph:fullName> + <ph:homePage rdf:resource='https://exiftool.org/'/> + <ph:state>confusion</ph:state> + </ph:supervisor> + <ph:tester rdf:parseType='Resource'> + <ph:exclamation>doh!</ph:exclamation> + <ph:food>cookies</ph:food> + <ph:fullName>Phil Harvey</ph:fullName> + <ph:homePage rdf:resource='https://exiftool.org/'/> + <ph:state>confusion</ph:state> + </ph:tester> + </rdf:Description> + + <rdf:Description rdf:about='http://www.w3.org/TR/rdf-syntax-grammar' + xmlns:stMfs='http://ns.adobe.com/xap/1.0/sType/ManifestItem#' + xmlns:stRef='http://ns.adobe.com/xap/1.0/sType/ResourceRef#' + xmlns:xmpMM='http://ns.adobe.com/xap/1.0/mm/'> + <xmpMM:Manifest> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <stMfs:linkForm>EmbedByReference</stMfs:linkForm> + <stMfs:reference rdf:parseType='Resource'> + <stRef:filePath>C:\some path\file.ext</stRef:filePath> + </stMfs:reference> + <xmpMM:placedXResolution>1</xmpMM:placedXResolution> + </rdf:li> + </rdf:Bag> + </xmpMM:Manifest> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/XMP_12.out b/t/XMP_12.out new file mode 100644 index 0000000..32f37a6 --- /dev/null +++ b/t/XMP_12.out @@ -0,0 +1,4 @@ +[XMP, XMP-dc, Image] format - Format: image/jpeg +[XMP, XMP-dc, Author] rights - Rights: © Copyright Another One +[XMP, XMP-dc, Author] rights-fr - Rights (fr): © Droit d'auteur Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: test1, &-&amp;-& diff --git a/t/XMP_13.out b/t/XMP_13.out new file mode 100644 index 0000000..58660c6 --- /dev/null +++ b/t/XMP_13.out @@ -0,0 +1,5 @@ +[XMP, XMP-dc, Image] format - Format: image/jpeg +[XMP, XMP-dc, Author] rights - Rights: © Copyright Phil Harvey +[XMP, XMP-dc, Author] rights-fr - Rights (fr): © Droit d'auteur Phil Harvey +[XMP, XMP-dc, Author] rights-de-DE - Rights (de-DE): © Urheberrecht Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: test1, &-&amp;-& diff --git a/t/XMP_14.out b/t/XMP_14.out new file mode 100644 index 0000000..5856e34 --- /dev/null +++ b/t/XMP_14.out @@ -0,0 +1,3 @@ +[XMP, XMP-dc, Image] format - Format: image/jpeg +[XMP, XMP-dc, Author] rights-fr - Rights (fr): © Droit d'auteur Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: test1, &-&amp;-& diff --git a/t/XMP_15.out b/t/XMP_15.out new file mode 100644 index 0000000..ab0244b --- /dev/null +++ b/t/XMP_15.out @@ -0,0 +1,3 @@ +[XMP, XMP-dc, Image] format - Format: image/jpeg +[XMP, XMP-dc, Author] rights - Rights: © Copyright Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: test1, &-&amp;-& diff --git a/t/XMP_16.out b/t/XMP_16.out new file mode 100644 index 0000000..b383720 --- /dev/null +++ b/t/XMP_16.out @@ -0,0 +1,5 @@ +[XMP, XMP-dc, Image] format - Format: image/jpeg +[XMP, XMP-dc, Author] rights - Rights: © Copyright Phil Harvey +[XMP, XMP-dc, Author] rights-fr - Rights (fr): © Droit d'auteur Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: test1, &-&amp;-& +[XMP, XMP-dc, Image] title-fr - Title (fr): Test fr title diff --git a/t/XMP_17.out b/t/XMP_17.out new file mode 100644 index 0000000..2df4d18 --- /dev/null +++ b/t/XMP_17.out @@ -0,0 +1,6 @@ +[XMP, XMP-dc, Image] format - Format: image/jpeg +[XMP, XMP-dc, Author] rights - Rights: © Copyright Phil Harvey +[XMP, XMP-dc, Author] rights-fr - Rights (fr): © Droit d'auteur Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: test1, &-&amp;-& +[XMP, XMP-dc, Image] title - Title: dTitle +[XMP, XMP-dc, Image] title-fr - Title (fr): Test fr title diff --git a/t/XMP_18.out b/t/XMP_18.out new file mode 100644 index 0000000..5f79b77 --- /dev/null +++ b/t/XMP_18.out @@ -0,0 +1,10 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 11.78 +[XMP, XMP-rdf, Document] about - About: uuid:80056b68-1045-fa97-3401-6f4ed84cd53d +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: UTF-16 (big-endian) encoded XMP +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP +[XMP, XMP-dc, Image] title - Title: Test IPTC picture +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job +[XMP, XMP-xmpRights, Author] Marked - Marked: False +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ diff --git a/t/XMP_19.out b/t/XMP_19.out new file mode 100644 index 0000000..bc46370 --- /dev/null +++ b/t/XMP_19.out @@ -0,0 +1,35 @@ +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon DIGITAL IXUS 40 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Time] 306 - Modify Date: 2005:11:21 17:07:14 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Centered +[EXIF, IFD0, Image] 18246 - Rating: 1 +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 0.4 +[EXIF, ExifIFD, Image] 33437 - F Number: 2.8 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2005:06:09 20:09:27 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2005:11:21 17:07:14 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 0.4 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 2.8 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: -1 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.8 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 5.8 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 1136 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 852 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 10142.85714 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 10142.85714 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: inches +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: Normal +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: Manual +[EXIF, ExifIFD, Camera] 41987 - White Balance: Auto +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 1 +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: Standard diff --git a/t/XMP_2.out b/t/XMP_2.out new file mode 100644 index 0000000..49acd76 --- /dev/null +++ b/t/XMP_2.out @@ -0,0 +1,140 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: XMP.jpg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 10 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2019:12:04 21:22:58-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:58-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[JFIF, JFIF, Image] 0 - JFIF Version: 1.02 +[JFIF, JFIF, Image] 2 - Resolution Unit: inches +[JFIF, JFIF, Image] 3 - X Resolution: 72 +[JFIF, JFIF, Image] 5 - Y Resolution: 72 +[EXIF, IFD0, Image] 270 - Image Description: A witty caption +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 72 +[EXIF, IFD0, Image] 283 - Y Resolution: 72 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0 +[EXIF, IFD0, Time] 306 - Modify Date: 2004:02:26 09:36:46 +[EXIF, IFD0, Author] 315 - Artist: Phil Harvey +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: Copyright 2004 Phil Harvey +[EXIF, ExifIFD, Image] 33437 - F Number: 3.5 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 100 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0210 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1.6 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 3.5 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 2 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: 0 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 3.5 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 100 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 80 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3053 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3053 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 872 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 0 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 4.73 +[XMP, XMP-rdf, Document] about - About: uuid:80056b68-1045-fa97-3401-6f4ed84cd53d +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: UTF-16 (big-endian) encoded XMP +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP +[XMP, XMP-dc, Image] title - Title: Test IPTC picture +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: My Position +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: I wrote it +[XMP, XMP-photoshop, Image] Category - Category: 1 +[XMP, XMP-photoshop, Location] City - City: Kingston +[XMP, XMP-photoshop, Location] Country - Country: Canada +[XMP, XMP-photoshop, Author] Credit - Credit: My Credit +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2004:02:26 +[XMP, XMP-photoshop, Image] Headline - Headline: No headline +[XMP, XMP-photoshop, Image] Instructions - Instructions: What instructions +[XMP, XMP-photoshop, Author] Source - Source: I'm the source +[XMP, XMP-photoshop, Location] State - State: Ont +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: amazing, image, utilities +[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: What is a transmission reference? +[XMP, XMP-photoshop, Image] Urgency - Urgency: 8 (least urgent) +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:4cc7b857-69d0-11d8-8ac4-bb59c92f0d9a +[XMP, XMP-xmpRights, Author] Marked - Marked: False +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Linotronic +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.1.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1998:02:09 06:49:00 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Microsoft Corporation +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: Hewlett-Packard +[ICC_Profile, ICC-header, Image] 52 - Device Model: sRGB +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: Hewlett-Packard +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Copyright (c) 1998 Hewlett-Packard Company +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: sRGB IEC61966-2.1 +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.95045 1 1.08905 +[ICC_Profile, ICC_Profile, Image] bkpt - Media Black Point: 0 0 0 +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.43607 0.22249 0.01392 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.38515 0.71687 0.09708 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.14307 0.06061 0.7141 +[ICC_Profile, ICC_Profile, Camera] dmnd - Device Mfg Desc: IEC http://www.iec.ch +[ICC_Profile, ICC_Profile, Camera] dmdd - Device Model Desc: IEC 61966-2.1 Default RGB colour space - sRGB +[ICC_Profile, ICC_Profile, Image] vued - Viewing Cond Desc: Reference Viewing Condition in IEC61966-2.1 +[ICC_Profile, ICC-view, Image] 8 - Viewing Cond Illuminant: 19.6445 20.3718 16.8089 +[ICC_Profile, ICC-view, Image] 20 - Viewing Cond Surround: 3.92889 4.07439 3.36179 +[ICC_Profile, ICC-view, Image] 32 - Viewing Cond Illuminant Type: D50 +[ICC_Profile, ICC_Profile, Image] lumi - Luminance: 76.03647 80 87.12462 +[ICC_Profile, ICC-meas, Image] 8 - Measurement Observer: CIE 1931 +[ICC_Profile, ICC-meas, Image] 12 - Measurement Backing: 0 0 0 +[ICC_Profile, ICC-meas, Image] 24 - Measurement Geometry: Unknown +[ICC_Profile, ICC-meas, Image] 28 - Measurement Flare: 0.999% +[ICC_Profile, ICC-meas, Image] 32 - Measurement Illuminant: D65 +[ICC_Profile, ICC_Profile, Image] tech - Technology: Cathode Ray Tube Display +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 2060 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 2060 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 2060 bytes) +[APP14, Adobe, Image] 0 - DCT Encode Version: 100 +[APP14, Adobe, Image] 1 - APP14 Flags 0: (none) +[APP14, Adobe, Image] 2 - APP14 Flags 1: (none) +[APP14, Adobe, Image] 3 - Color Transform: YCbCr +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/64 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 6.0 mm +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.6 diff --git a/t/XMP_20.out b/t/XMP_20.out new file mode 100644 index 0000000..ca61009 --- /dev/null +++ b/t/XMP_20.out @@ -0,0 +1,35 @@ +[EXIF, IFD0, Camera] 271 - Make: Canon +[EXIF, IFD0, Camera] 272 - Camera Model Name: Canon DIGITAL IXUS 40 +[EXIF, IFD0, Image] 274 - Orientation: 1 +[EXIF, IFD0, Image] 282 - X Resolution: 180 +[EXIF, IFD0, Image] 283 - Y Resolution: 180 +[EXIF, IFD0, Image] 296 - Resolution Unit: 2 +[EXIF, IFD0, Time] 306 - Modify Date: 2005:11:21 17:07:14+01:00 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: 1 +[EXIF, IFD0, Image] 18246 - Rating: 1 +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 0.4 +[EXIF, ExifIFD, Image] 33437 - F Number: 2.8 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0.2.2.0 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2005:06:09 20:09:27+02:00 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2005:11:21 17:07:14+01:00 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: 1 2 3 0 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 0.402622582987314 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 2.79795934507662 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: -1 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 2.79795934507662 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: 5 +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 5.8 +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0.1.0.0 +[EXIF, ExifIFD, Image] 40961 - Color Space: 1 +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 1136 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 852 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 10142.85714 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 10142.85714 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: 2 +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: 2 +[EXIF, ExifIFD, Image] 41728 - File Source: 3 +[EXIF, ExifIFD, Image] 41985 - Custom Rendered: 0 +[EXIF, ExifIFD, Camera] 41986 - Exposure Mode: 1 +[EXIF, ExifIFD, Camera] 41987 - White Balance: 0 +[EXIF, ExifIFD, Camera] 41988 - Digital Zoom Ratio: 1 +[EXIF, ExifIFD, Camera] 41990 - Scene Capture Type: 0 diff --git a/t/XMP_21.out b/t/XMP_21.out new file mode 100644 index 0000000..b359535 --- /dev/null +++ b/t/XMP_21.out @@ -0,0 +1,38 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.32 +[XMP, XMP-exif, Image] ApertureValue - Aperture Value: 14.0 +[XMP, XMP-exif, Image] ColorSpace - Color Space: sRGB +[XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: Y, Cb, Cr, - +[XMP, XMP-exif, Image] CompressedBitsPerPixel - Compressed Bits Per Pixel: 9 +[XMP, XMP-exif, Image] CustomRendered - Custom Rendered: Normal +[XMP, XMP-exif, Time] DateTimeOriginal - Date/Time Original: 2003:12:04 06:46:52 +[XMP, XMP-exif, Image] ExifVersion - Exif Version: 0221 +[XMP, XMP-exif, Image] ExposureBiasValue - Exposure Compensation: 0 +[XMP, XMP-exif, Camera] ExposureMode - Exposure Mode: Manual +[XMP, XMP-exif, Image] ExposureTime - Exposure Time: 4 +[XMP, XMP-exif, Image] FNumber - F Number: 14.0 +[XMP, XMP-exif, Image] FileSource - File Source: Digital Camera +[XMP, XMP-exif, Image] FlashpixVersion - Flashpix Version: 0100 +[XMP, XMP-exif, Camera] FocalLength - Focal Length: 34.0 mm +[XMP, XMP-exif, Camera] FocalPlaneResolutionUnit - Focal Plane Resolution Unit: inches +[XMP, XMP-exif, Camera] FocalPlaneXResolution - Focal Plane X Resolution: 3443.94615384615 +[XMP, XMP-exif, Camera] FocalPlaneYResolution - Focal Plane Y Resolution: 3442.01680672269 +[XMP, XMP-exif, Image] ISOSpeedRatings - ISO: 100 +[XMP, XMP-exif, Camera] MaxApertureValue - Max Aperture Value: 4.5 +[XMP, XMP-exif, Camera] MeteringMode - Metering Mode: Average +[XMP, XMP-exif, Image] PixelXDimension - Exif Image Width: 160 +[XMP, XMP-exif, Image] PixelYDimension - Exif Image Height: 120 +[XMP, XMP-exif, Camera] SceneCaptureType - Scene Capture Type: Standard +[XMP, XMP-exif, Camera] SensingMethod - Sensing Method: One-chip color area +[XMP, XMP-exif, Image] ShutterSpeedValue - Shutter Speed Value: 1 +[XMP, XMP-exif, Image] UserComment - User Comment: +[XMP, XMP-exif, Camera] WhiteBalance - White Balance: Auto +[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: THM - DCF thumbnail file +[XMP, XMP-tiff, Camera] Make - Make: Canon +[XMP, XMP-tiff, Camera] Model - Camera Model Name: Canon EOS DIGITAL REBEL +[XMP, XMP-tiff, Image] Orientation - Orientation: Horizontal (normal) +[XMP, XMP-tiff, Image] ResolutionUnit - Resolution Unit: inches +[XMP, XMP-tiff, Image] XResolution - X Resolution: 180 +[XMP, XMP-tiff, Image] YCbCrPositioning - Y Cb Cr Positioning: Centered +[XMP, XMP-tiff, Image] YResolution - Y Resolution: 180 +[XMP, XMP-xmp, Time] CreateDate - Create Date: 2003:12:04 06:46:52 +[XMP, XMP-xmp, Time] ModifyDate - Modify Date: 2003:12:04 06:46:52 diff --git a/t/XMP_22.out b/t/XMP_22.out new file mode 100644 index 0000000..3704dec --- /dev/null +++ b/t/XMP_22.out @@ -0,0 +1,38 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.32 +[XMP, XMP-exif, Image] ApertureValue - Aperture Value: 14.0000277425244 +[XMP, XMP-exif, Image] ColorSpace - Color Space: 1 +[XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: [1,2,3,0] +[XMP, XMP-exif, Image] CompressedBitsPerPixel - Compressed Bits Per Pixel: 9 +[XMP, XMP-exif, Image] CustomRendered - Custom Rendered: 0 +[XMP, XMP-exif, Time] DateTimeOriginal - Date/Time Original: 2003:12:04 06:46:52 +[XMP, XMP-exif, Image] ExifVersion - Exif Version: 0221 +[XMP, XMP-exif, Image] ExposureBiasValue - Exposure Compensation: 0 +[XMP, XMP-exif, Camera] ExposureMode - Exposure Mode: 1 +[XMP, XMP-exif, Image] ExposureTime - Exposure Time: 4 +[XMP, XMP-exif, Image] FNumber - F Number: 14 +[XMP, XMP-exif, Image] FileSource - File Source: 3 +[XMP, XMP-exif, Image] FlashpixVersion - Flashpix Version: 0100 +[XMP, XMP-exif, Camera] FocalLength - Focal Length: 34 +[XMP, XMP-exif, Camera] FocalPlaneResolutionUnit - Focal Plane Resolution Unit: 2 +[XMP, XMP-exif, Camera] FocalPlaneXResolution - Focal Plane X Resolution: 3443.94615384615 +[XMP, XMP-exif, Camera] FocalPlaneYResolution - Focal Plane Y Resolution: 3442.01680672269 +[XMP, XMP-exif, Image] ISOSpeedRatings - ISO: 100 +[XMP, XMP-exif, Camera] MaxApertureValue - Max Aperture Value: 4.49999024812954 +[XMP, XMP-exif, Camera] MeteringMode - Metering Mode: 1 +[XMP, XMP-exif, Image] PixelXDimension - Exif Image Width: 160 +[XMP, XMP-exif, Image] PixelYDimension - Exif Image Height: 120 +[XMP, XMP-exif, Camera] SceneCaptureType - Scene Capture Type: 0 +[XMP, XMP-exif, Camera] SensingMethod - Sensing Method: 2 +[XMP, XMP-exif, Image] ShutterSpeedValue - Shutter Speed Value: 1 +[XMP, XMP-exif, Image] UserComment - User Comment: +[XMP, XMP-exif, Camera] WhiteBalance - White Balance: 0 +[XMP, XMP-exifEX, Image] InteroperabilityIndex - Interoperability Index: THM +[XMP, XMP-tiff, Camera] Make - Make: Canon +[XMP, XMP-tiff, Camera] Model - Camera Model Name: Canon EOS DIGITAL REBEL +[XMP, XMP-tiff, Image] Orientation - Orientation: 1 +[XMP, XMP-tiff, Image] ResolutionUnit - Resolution Unit: 2 +[XMP, XMP-tiff, Image] XResolution - X Resolution: 180 +[XMP, XMP-tiff, Image] YCbCrPositioning - Y Cb Cr Positioning: 1 +[XMP, XMP-tiff, Image] YResolution - Y Resolution: 180 +[XMP, XMP-xmp, Time] CreateDate - Create Date: 2003:12:04 06:46:52 +[XMP, XMP-xmp, Time] ModifyDate - Modify Date: 2003:12:04 06:46:52 diff --git a/t/XMP_23.out b/t/XMP_23.out new file mode 100644 index 0000000..d21958f --- /dev/null +++ b/t/XMP_23.out @@ -0,0 +1,9 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 11.78 +[XMP, XMP-rdf, Document] about - About: uuid:80056b68-1045-fa97-3401-6f4ed84cd53d +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: UTF-16 (big-endian) encoded XMP +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP +[XMP, XMP-dc, Image] title - Title: Test IPTC picture +[XMP, XMP-xmpRights, Author] Marked - Marked: False +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ diff --git a/t/XMP_24.out b/t/XMP_24.out new file mode 100644 index 0000000..d94d26a --- /dev/null +++ b/t/XMP_24.out @@ -0,0 +1,32 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.03 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 4.73 +[XMP, XMP-rdf, Document] about - About: uuid:80056b68-1045-fa97-3401-6f4ed84cd53d +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: UTF-16 (big-endian) encoded XMP +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP +[XMP, XMP-dc, Image] title - Title: Test IPTC picture +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: My Position +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: I wrote it +[XMP, XMP-photoshop, Image] Category - Category: 1 +[XMP, XMP-photoshop, Location] City - City: Kingston +[XMP, XMP-photoshop, Location] Country - Country: Canada +[XMP, XMP-photoshop, Author] Credit - Credit: My Credit +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2004:02:26 +[XMP, XMP-photoshop, Image] Headline - Headline: No headline +[XMP, XMP-photoshop, Image] Instructions - Instructions: What instructions +[XMP, XMP-photoshop, Author] Source - Source: I'm the source +[XMP, XMP-photoshop, Location] State - State: Ont +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: amazing, image, utilities +[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: What is a transmission reference? +[XMP, XMP-photoshop, Image] Urgency - Urgency: 8 (least urgent) +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:4cc7b857-69d0-11d8-8ac4-bb59c92f0d9a +[XMP, XMP-xmpRights, Author] Marked - Marked: False +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[APP14, Adobe, Image] 0 - DCT Encode Version: 100 +[APP14, Adobe, Image] 1 - APP14 Flags 0: (none) +[APP14, Adobe, Image] 2 - APP14 Flags 1: (none) +[APP14, Adobe, Image] 3 - Color Transform: YCbCr +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/XMP_25.out b/t/XMP_25.out new file mode 100644 index 0000000..84dc880 --- /dev/null +++ b/t/XMP_25.out @@ -0,0 +1,28 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: XMP.svg +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1402 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2008:04:07 14:11:53-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:46-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: SVG +[File, File, Other] FileTypeExtension - File Type Extension: svg +[File, File, Other] MIMEType - MIME Type: image/svg+xml +[SVG, SVG, Image] width - Image Width: 4in +[SVG, SVG, Image] height - Image Height: 3in +[SVG, SVG, Image] version - SVG Version: 1.1 +[SVG, SVG, Image] xmlns - Xmlns: http://www.w3.org/2000/svg +[SVG, SVG-myfoo, Unknown] myfoo:descTitle - Desc Title: This is a financial report +[SVG, SVG-myfoo, Unknown] myfoo:descDescrEmph - Desc Descr Emph: myfoo +[SVG, SVG-myfoo, Unknown] myfoo:descSceneWhat - Desc Scene What: widget $growth +[SVG, SVG-myfoo, Unknown] myfoo:descSceneContains - Desc Scene Contains: $three $graph-bar +[SVG, SVG-myfoo, Unknown] myfoo:descSceneWhen - Desc Scene When: 1998 $through 2000 +[XMP, XMP-rdf, Document] about - About: http://example.org/myfoo +[XMP, XMP-dc, Image] title - Title: MyFoo Financial Report +[XMP, XMP-dc, Image] description - Description: $three $bar $thousands $dollars $from 1998 $through 2000 +[XMP, XMP-dc, Author] publisher - Publisher: Example Organization +[XMP, XMP-dc, Time] date - Date: 2000:04:11 +[XMP, XMP-dc, Image] format - Format: image/svg+xml +[XMP, XMP-dc, Other] language - Language: en +[XMP, XMP-dc, Author] creator - Creator: Irving Bird, Mary Lambert diff --git a/t/XMP_26.out b/t/XMP_26.out new file mode 100644 index 0000000..be36406 --- /dev/null +++ b/t/XMP_26.out @@ -0,0 +1,51 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='What&#39;s this?'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='http://www.exiftool.org/t/XMP.t#26' + xmlns:et='http://ns.exiftool.org/1.0/' et:toolkit='Image::ExifTool 12.26' + xmlns:myXMPns='http://ns.exiftool.org/t/XMP.t'> + <myXMPns:ATestTag> + <rdf:Bag> + <rdf:li rdf:resource='http://www.exiftool.org/t/XMP.t#26-one'/> + <rdf:li rdf:resource='http://www.exiftool.org/t/XMP.t#26-two'/> + </rdf:Bag> + </myXMPns:ATestTag> + </rdf:Description> + + <rdf:Description rdf:about='http://www.exiftool.org/t/XMP.t#26' + xmlns:plus='http://ns.useplus.org/ldf/xmp/1.0/'> + <plus:CopyrightStatus>http://ns.useplus.org/ldf/vocab/CS-PUB</plus:CopyrightStatus> + <plus:Custom1> + <rdf:Bag> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='en'>a</rdf:li> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='en'>b</rdf:li> + </rdf:Alt> + </rdf:li> + </rdf:Bag> + </plus:Custom1> + <plus:ImageType>http://ns.useplus.org/ldf/vocab/TY-VID</plus:ImageType> + <plus:Licensee> + <rdf:Seq> + <rdf:li rdf:parseType='Resource'> + <plus:LicenseeName>Phil</plus:LicenseeName> + </rdf:li> + </rdf:Seq> + </plus:Licensee> + <plus:LicenseeImageNotes> + <rdf:Alt> + <rdf:li xml:lang='x-default'>default notes</rdf:li> + <rdf:li xml:lang='de'>deutsche anmerkungen</rdf:li> + <rdf:li xml:lang='en'>english notes</rdf:li> + </rdf:Alt> + </plus:LicenseeImageNotes> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/XMP_27.out b/t/XMP_27.out new file mode 100644 index 0000000..1569d73 --- /dev/null +++ b/t/XMP_27.out @@ -0,0 +1,95 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: XMP.xml +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 6.1 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2021:04:28 17:05:14-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:59-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: XMP +[File, File, Other] FileTypeExtension - File Type Extension: xmp +[File, File, Other] MIMEType - MIME Type: application/rdf+xml +[XMP, XMP-rdf, Document] about - About: t/images/Nikon.jpg +[XML, XML-ExifTool, Unknown] ExifTool:ExifToolVersion - Exif Tool Version: 7.62 +[XML, XML-File, Unknown] File:FileName - File Name: Nikon.jpg +[XML, XML-File, Unknown] File:Directory - Directory: t/images +[XML, XML-File, Unknown] File:FileSize - File Size: 1703 bytes +[XML, XML-File, Unknown] File:FileModifyDate - File Modify Date: 2006:01:04 14:02:27-05:00 +[XML, XML-File, Unknown] File:FileType - File Type: JPEG +[XML, XML-File, Unknown] File:MIMEType - MIME Type: image/jpeg +[XML, XML-File, Unknown] File:ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[XML, XML-File, Unknown] File:ImageWidth - Image Width: 8 +[XML, XML-File, Unknown] File:ImageHeight - Image Height: 8 +[XML, XML-File, Unknown] File:EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[XML, XML-File, Unknown] File:BitsPerSample - Bits Per Sample: 8 +[XML, XML-File, Unknown] File:ColorComponents - Color Components: 3 +[XML, XML-File, Unknown] File:YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[XML, XML-Composite, Unknown] Composite:Aperture - Aperture: 9.4 +[XML, XML-Composite, Unknown] Composite:ImageSize - Image Size: 8x8 +[XML, XML-Composite, Unknown] Composite:ShutterSpeed - Shutter Speed: 0.00469483568075117 +[XML, XML-Composite, Unknown] Composite:ThumbnailImage - Thumbnail Image: <Dummy thumbnail image data> +[XML, XML-Composite, Unknown] Composite:FocalLength35efl - Focal Length 35efl: 8.6 mm +[XML, XML-Composite, Unknown] Composite:LightValue - Light Value: 14.2 +[EXIF, IFD0, Unknown] IFD0:ImageDescription - Image Description: +[EXIF, IFD0, Unknown] IFD0:Make - Make: NIKON +[EXIF, IFD0, Unknown] IFD0:Model - Model: E775 +[EXIF, IFD0, Unknown] IFD0:Orientation - Orientation: Horizontal (normal) +[EXIF, IFD0, Unknown] IFD0:XResolution - X Resolution: 300 +[EXIF, IFD0, Unknown] IFD0:YResolution - Y Resolution: 300 +[EXIF, IFD0, Unknown] IFD0:ResolutionUnit - Resolution Unit: inches +[EXIF, IFD0, Unknown] IFD0:Software - Software: E775v1.3u +[EXIF, IFD0, Unknown] IFD0:ModifyDate - Modify Date: 2001:08:01 12:57:23 +[EXIF, IFD0, Unknown] IFD0:YCbCrPositioning - Y Cb Cr Positioning: Co-sited +[EXIF, ExifIFD, Unknown] ExifIFD:ExposureTime - Exposure Time: 0.00469483568075117 +[EXIF, ExifIFD, Unknown] ExifIFD:FNumber - F Number: 9.4 +[EXIF, ExifIFD, Unknown] ExifIFD:ExposureProgram - Exposure Program: Program AE +[EXIF, ExifIFD, Unknown] ExifIFD:iso - Iso: 100 +[EXIF, ExifIFD, Unknown] ExifIFD:ExifVersion - Exif Version: 0210 +[EXIF, ExifIFD, Unknown] ExifIFD:DateTimeOriginal - Date Time Original: 2001:08:01 12:57:23 +[EXIF, ExifIFD, Unknown] ExifIFD:CreateDate - Create Date: 2001:08:01 12:57:23 +[EXIF, ExifIFD, Unknown] ExifIFD:ComponentsConfiguration - Components Configuration: YCbCr +[EXIF, ExifIFD, Unknown] ExifIFD:CompressedBitsPerPixel - Compressed Bits Per Pixel: 3 +[EXIF, ExifIFD, Unknown] ExifIFD:ExposureCompensation - Exposure Compensation: 0 +[EXIF, ExifIFD, Unknown] ExifIFD:MaxApertureValue - Max Aperture Value: 3.4 +[EXIF, ExifIFD, Unknown] ExifIFD:MeteringMode - Metering Mode: Multi-segment +[EXIF, ExifIFD, Unknown] ExifIFD:LightSource - Light Source: Unknown +[EXIF, ExifIFD, Unknown] ExifIFD:Flash - Flash: No Flash +[EXIF, ExifIFD, Unknown] ExifIFD:FocalLength - Focal Length: 8.6 mm +[EXIF, ExifIFD, Unknown] ExifIFD:UserComment - User Comment: +[EXIF, ExifIFD, Unknown] ExifIFD:FlashpixVersion - Flashpix Version: 0100 +[EXIF, ExifIFD, Unknown] ExifIFD:ColorSpace - Color Space: sRGB +[EXIF, ExifIFD, Unknown] ExifIFD:ExifImageWidth - Exif Image Width: 1600 +[EXIF, ExifIFD, Unknown] ExifIFD:ExifImageHeight - Exif Image Height: 1200 +[EXIF, ExifIFD, Unknown] ExifIFD:FileSource - File Source: Digital Camera +[EXIF, ExifIFD, Unknown] ExifIFD:SceneType - Scene Type: Directly photographed +[EXIF, InteropIFD, Unknown] InteropIFD:InteropIndex - Interop Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Unknown] InteropIFD:InteropVersion - Interop Version: 0100 +[EXIF, IFD1, Unknown] IFD1:Compression - Compression: JPEG (old-style) +[EXIF, IFD1, Unknown] IFD1:XResolution - X Resolution: 300 +[EXIF, IFD1, Unknown] IFD1:YResolution - Y Resolution: 300 +[EXIF, IFD1, Unknown] IFD1:ResolutionUnit - Resolution Unit: inches +[EXIF, IFD1, Unknown] IFD1:ThumbnailOffset - Thumbnail Offset: 1426 +[EXIF, IFD1, Unknown] IFD1:ThumbnailLength - Thumbnail Length: 28 +[MakerNotes, Nikon, Unknown] Nikon:MakerNoteVersion - Maker Note Version: 1.00 +[MakerNotes, Nikon, Unknown] Nikon:iso - Iso: 0 +[MakerNotes, Nikon, Unknown] Nikon:ColorMode - Color Mode: Color +[MakerNotes, Nikon, Unknown] Nikon:Quality - Quality: Fine +[MakerNotes, Nikon, Unknown] Nikon:WhiteBalance - White Balance: Auto +[MakerNotes, Nikon, Unknown] Nikon:Sharpness - Sharpness: Auto +[MakerNotes, Nikon, Unknown] Nikon:FocusMode - Focus Mode: AF-C +[MakerNotes, Nikon, Unknown] Nikon:FlashSetting - Flash Setting: +[MakerNotes, Nikon, Unknown] Nikon:ISOSelection - ISO Selection: Auto +[MakerNotes, Nikon, Unknown] Nikon:ImageAdjustment - Image Adjustment: Normal +[MakerNotes, Nikon, Unknown] Nikon:AuxiliaryLens - Auxiliary Lens: Off +[MakerNotes, Nikon, Unknown] Nikon:ManualFocusDistance - Manual Focus Distance: inf +[MakerNotes, Nikon, Unknown] Nikon:DigitalZoom - Digital Zoom: 1 +[MakerNotes, Nikon, Unknown] Nikon:AFAreaMode - AF Area Mode: Single Area +[MakerNotes, Nikon, Unknown] Nikon:AFPoint - AF Point: Center +[MakerNotes, Nikon, Unknown] Nikon:AFPointsInFocus - AF Points In Focus: (none) +[MakerNotes, Nikon, Unknown] Nikon:SceneMode - Scene Mode: +[MakerNotes, Nikon, Unknown] Nikon:DataDump - Data Dump: (Binary data 122 bytes) +[Composite, Composite, Image] Exif-Aperture - Aperture: 9.4 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/213 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 8.6 mm diff --git a/t/XMP_28.out b/t/XMP_28.out new file mode 100644 index 0000000..b8e067d --- /dev/null +++ b/t/XMP_28.out @@ -0,0 +1,46 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: XMP_28_failed.xml +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 3.1 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:59-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:59-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:59-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: XMP +[File, File, Other] FileTypeExtension - File Type Extension: xmp +[File, File, Other] MIMEType - MIME Type: application/rdf+xml +[XMP, XMP-rdf, Document] about - About: t/images/Nikon.jpg +[XMP, XMP-pdf, Author] Author - Author: Phil +[XML, XML-File, Unknown] File:BitsPerSample - Bits Per Sample: 8 +[XML, XML-File, Unknown] File:ColorComponents - Color Components: 3 +[XML, XML-File, Unknown] File:Directory - Directory: t/images +[XML, XML-File, Unknown] File:EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[XML, XML-File, Unknown] File:ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[XML, XML-File, Unknown] File:FileModifyDate - File Modify Date: 2006:01:04 14:02:27-05:00 +[XML, XML-File, Unknown] File:FileName - File Name: Nikon.jpg +[XML, XML-File, Unknown] File:FileSize - File Size: 1703 bytes +[XML, XML-File, Unknown] File:FileType - File Type: JPEG +[XML, XML-File, Unknown] File:ImageHeight - Image Height: 8 +[XML, XML-File, Unknown] File:ImageWidth - Image Width: 8 +[XML, XML-File, Unknown] File:MIMEType - MIME Type: image/jpeg +[XML, XML-File, Unknown] File:YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[EXIF, IFD0, Unknown] IFD0:ImageDescription - Image Description: +[EXIF, IFD0, Unknown] IFD0:Make - Make: NIKON +[EXIF, IFD0, Unknown] IFD0:Model - Model: E775 +[EXIF, IFD0, Unknown] IFD0:ModifyDate - Modify Date: 2001:08:01 12:57:23 +[EXIF, IFD0, Unknown] IFD0:Orientation - Orientation: Horizontal (normal) +[EXIF, IFD0, Unknown] IFD0:ResolutionUnit - Resolution Unit: inches +[EXIF, IFD0, Unknown] IFD0:Software - Software: E775v1.3u +[EXIF, IFD0, Unknown] IFD0:XResolution - X Resolution: 300 +[EXIF, IFD0, Unknown] IFD0:YCbCrPositioning - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Unknown] IFD0:YResolution - Y Resolution: 300 +[EXIF, IFD1, Unknown] IFD1:Compression - Compression: JPEG (old-style) +[EXIF, IFD1, Unknown] IFD1:ResolutionUnit - Resolution Unit: inches +[EXIF, IFD1, Unknown] IFD1:ThumbnailLength - Thumbnail Length: 28 +[EXIF, IFD1, Unknown] IFD1:ThumbnailOffset - Thumbnail Offset: 1426 +[EXIF, IFD1, Unknown] IFD1:XResolution - X Resolution: 300 +[EXIF, IFD1, Unknown] IFD1:YResolution - Y Resolution: 300 +[EXIF, InteropIFD, Unknown] InteropIFD:InteropIndex - Interop Index: R98 - DCF basic file (sRGB) +[EXIF, InteropIFD, Unknown] InteropIFD:InteropVersion - Interop Version: 0100 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/XMP_29.out b/t/XMP_29.out new file mode 100644 index 0000000..64f887d --- /dev/null +++ b/t/XMP_29.out @@ -0,0 +1,26 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: XMP_29_failed.jpg +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 3.3 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:59-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:59-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:59-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-pdf, Author] Author - Author: Test +[XMP, XMP-pdf, Time] CreationDate - Creation Date: 2008:10:20 19:54:15 +[XMP, XMP-pdf, Author] Creator - Creator: Guess Who +[XMP, XMP-pdf, Time] ModDate - Mod Date: 2008:10:20 19:54:15 +[XMP, XMP-pdf, Author] Producer - Producer: Just ExifTool again +[XMP, XMP-pdf, Image] Title - Title: PDF Title +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 diff --git a/t/XMP_3.out b/t/XMP_3.out new file mode 100644 index 0000000..2e89c0d --- /dev/null +++ b/t/XMP_3.out @@ -0,0 +1,138 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileSize - File Size: 10 kB +[File, File, Other] FileType - File Type: JPEG +[File, File, Other] FileTypeExtension - File Type Extension: jpg +[File, File, Other] MIMEType - MIME Type: image/jpeg +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[File, File, Image] CurrentIPTCDigest - Current IPTC Digest: 2b3df19b0c67788262a0d0dced3b6d58 +[File, File, Image] ImageWidth - Image Width: 8 +[File, File, Image] ImageHeight - Image Height: 8 +[File, File, Image] EncodingProcess - Encoding Process: Baseline DCT, Huffman coding +[File, File, Image] BitsPerSample - Bits Per Sample: 8 +[File, File, Image] ColorComponents - Color Components: 3 +[File, File, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[JFIF, JFIF, Image] 0 - JFIF Version: 1.02 +[JFIF, JFIF, Image] 2 - Resolution Unit: inches +[JFIF, JFIF, Image] 3 - X Resolution: 80 +[JFIF, JFIF, Image] 5 - Y Resolution: 80 +[EXIF, IFD0, Image] 270 - Image Description: A witty caption-v2 +[EXIF, IFD0, Camera] 271 - Make: FUJIFILM-v2 +[EXIF, IFD0, Camera] 272 - Camera Model Name: FinePix2400Zoom-v2 +[EXIF, IFD0, Image] 274 - Orientation: Horizontal (normal) +[EXIF, IFD0, Image] 282 - X Resolution: 80 +[EXIF, IFD0, Image] 283 - Y Resolution: 80 +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, IFD0, Image] 305 - Software: Adobe Photoshop 7.0-v2 +[EXIF, IFD0, Time] 306 - Modify Date: 2004:02:26 09:36:46 +[EXIF, IFD0, Author] 315 - Artist: Phil Harvey-v2 +[EXIF, IFD0, Image] 531 - Y Cb Cr Positioning: Co-sited +[EXIF, IFD0, Author] 33432 - Copyright: Copyright 2004 Phil Harvey-v2 +[EXIF, ExifIFD, Image] 33437 - F Number: 4.9 +[EXIF, ExifIFD, Camera] 34850 - Exposure Program: Program AE +[EXIF, ExifIFD, Image] 34855 - ISO: 111 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0232 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2001:05:19 18:36:41 +[EXIF, ExifIFD, Image] 37121 - Components Configuration: Y, Cb, Cr, - +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 1.6 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/64 +[EXIF, ExifIFD, Image] 37378 - Aperture Value: 4.9 +[EXIF, ExifIFD, Image] 37379 - Brightness Value: 3 +[EXIF, ExifIFD, Image] 37380 - Exposure Compensation: +1 +[EXIF, ExifIFD, Camera] 37381 - Max Aperture Value: 4.9 +[EXIF, ExifIFD, Camera] 37383 - Metering Mode: Multi-segment +[EXIF, ExifIFD, Camera] 37385 - Flash: Fired +[EXIF, ExifIFD, Camera] 37386 - Focal Length: 6.0 mm +[EXIF, ExifIFD, Image] 40960 - Flashpix Version: 0100 +[EXIF, ExifIFD, Image] 40961 - Color Space: sRGB +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 111 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 89 +[EXIF, ExifIFD, Camera] 41486 - Focal Plane X Resolution: 3359 +[EXIF, ExifIFD, Camera] 41487 - Focal Plane Y Resolution: 3359 +[EXIF, ExifIFD, Camera] 41488 - Focal Plane Resolution Unit: cm +[EXIF, ExifIFD, Camera] 41495 - Sensing Method: One-chip color area +[EXIF, ExifIFD, Image] 41728 - File Source: Digital Camera +[EXIF, ExifIFD, Image] 41729 - Scene Type: Directly photographed +[EXIF, IFD1, Image] 259 - Compression: JPEG (old-style) +[EXIF, IFD1, Image] 282 - X Resolution: 72 +[EXIF, IFD1, Image] 283 - Y Resolution: 72 +[EXIF, IFD1, Image] 296 - Resolution Unit: inches +[EXIF, IFD1, Image] 513 - Thumbnail Offset: 890 +[EXIF, IFD1, Image] 514 - Thumbnail Length: 0 +[IPTC, IPTC, Other] 90 - Coded Character Set: UTF8 +[IPTC, IPTC, Other] 0 - Envelope Record Version: 4 +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-rdf, Document] about - About: uuid:80056b68-1045-fa97-3401-6f4ed84cd53d +[XMP, XMP-iptcCore, Author] CreatorContactInfoCiAdrCtry - Creator Country: Canada +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey-v2 +[XMP, XMP-dc, Image] description - Description: UTF-16 (big-endian) encoded XMP-v2 +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey-v2 +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP, v2 +[XMP, XMP-dc, Image] title - Title: Test IPTC picture-v2 +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: My Position-v2 +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: I wrote it-v2 +[XMP, XMP-photoshop, Image] Category - Category: 2 +[XMP, XMP-photoshop, Location] City - City: Kingston-v2 +[XMP, XMP-photoshop, Location] Country - Country: Canada-v2 +[XMP, XMP-photoshop, Author] Credit - Credit: My Credit-v2 +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2004:02:26 02:00 +[XMP, XMP-photoshop, Image] Headline - Headline: No headline-v2 +[XMP, XMP-photoshop, Image] Instructions - Instructions: What instructions-v2 +[XMP, XMP-photoshop, Author] Source - Source: I'm the source-v2 +[XMP, XMP-photoshop, Location] State - State: Ont-v2 +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: amazing, image, utilities, v2 +[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: What is a transmission reference?-v2 +[XMP, XMP-photoshop, Image] Urgency - Urgency: 8 (least urgent) +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job-v2 +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:4cc7b857-69d0-11d8-8ac4-bb59c92f0d9a-v2 +[XMP, XMP-xmpRights, Author] Marked - Marked: False +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/-v2 +[ICC_Profile, ICC-header, Image] 4 - Profile CMM Type: Linotronic +[ICC_Profile, ICC-header, Image] 8 - Profile Version: 2.1.0 +[ICC_Profile, ICC-header, Image] 12 - Profile Class: Display Device Profile +[ICC_Profile, ICC-header, Image] 16 - Color Space Data: RGB +[ICC_Profile, ICC-header, Image] 20 - Profile Connection Space: XYZ +[ICC_Profile, ICC-header, Time] 24 - Profile Date Time: 1998:02:09 06:49:00 +[ICC_Profile, ICC-header, Image] 36 - Profile File Signature: acsp +[ICC_Profile, ICC-header, Image] 40 - Primary Platform: Microsoft Corporation +[ICC_Profile, ICC-header, Image] 44 - CMM Flags: Not Embedded, Independent +[ICC_Profile, ICC-header, Image] 48 - Device Manufacturer: Hewlett-Packard +[ICC_Profile, ICC-header, Image] 52 - Device Model: sRGB +[ICC_Profile, ICC-header, Image] 56 - Device Attributes: Reflective, Glossy, Positive, Color +[ICC_Profile, ICC-header, Image] 64 - Rendering Intent: Perceptual +[ICC_Profile, ICC-header, Image] 68 - Connection Space Illuminant: 0.9642 1 0.82491 +[ICC_Profile, ICC-header, Image] 80 - Profile Creator: Hewlett-Packard +[ICC_Profile, ICC-header, Image] 84 - Profile ID: 0 +[ICC_Profile, ICC_Profile, Image] cprt - Profile Copyright: Copyright (c) 1998 Hewlett-Packard Company +[ICC_Profile, ICC_Profile, Image] desc - Profile Description: sRGB IEC61966-2.1 +[ICC_Profile, ICC_Profile, Image] wtpt - Media White Point: 0.95045 1 1.08905 +[ICC_Profile, ICC_Profile, Image] bkpt - Media Black Point: 0 0 0 +[ICC_Profile, ICC_Profile, Image] rXYZ - Red Matrix Column: 0.43607 0.22249 0.01392 +[ICC_Profile, ICC_Profile, Image] gXYZ - Green Matrix Column: 0.38515 0.71687 0.09708 +[ICC_Profile, ICC_Profile, Image] bXYZ - Blue Matrix Column: 0.14307 0.06061 0.7141 +[ICC_Profile, ICC_Profile, Camera] dmnd - Device Mfg Desc: IEC http://www.iec.ch +[ICC_Profile, ICC_Profile, Camera] dmdd - Device Model Desc: IEC 61966-2.1 Default RGB colour space - sRGB +[ICC_Profile, ICC_Profile, Image] vued - Viewing Cond Desc: Reference Viewing Condition in IEC61966-2.1 +[ICC_Profile, ICC-view, Image] 8 - Viewing Cond Illuminant: 19.6445 20.3718 16.8089 +[ICC_Profile, ICC-view, Image] 20 - Viewing Cond Surround: 3.92889 4.07439 3.36179 +[ICC_Profile, ICC-view, Image] 32 - Viewing Cond Illuminant Type: D50 +[ICC_Profile, ICC_Profile, Image] lumi - Luminance: 76.03647 80 87.12462 +[ICC_Profile, ICC-meas, Image] 8 - Measurement Observer: CIE 1931 +[ICC_Profile, ICC-meas, Image] 12 - Measurement Backing: 0 0 0 +[ICC_Profile, ICC-meas, Image] 24 - Measurement Geometry: Unknown +[ICC_Profile, ICC-meas, Image] 28 - Measurement Flare: 0.999% +[ICC_Profile, ICC-meas, Image] 32 - Measurement Illuminant: D65 +[ICC_Profile, ICC_Profile, Image] tech - Technology: Cathode Ray Tube Display +[ICC_Profile, ICC_Profile, Image] rTRC - Red Tone Reproduction Curve: (Binary data 2060 bytes) +[ICC_Profile, ICC_Profile, Image] gTRC - Green Tone Reproduction Curve: (Binary data 2060 bytes) +[ICC_Profile, ICC_Profile, Image] bTRC - Blue Tone Reproduction Curve: (Binary data 2060 bytes) +[APP14, Adobe, Image] 0 - DCT Encode Version: 100 +[APP14, Adobe, Image] 1 - APP14 Flags 0: (none) +[APP14, Adobe, Image] 2 - APP14 Flags 1: (none) +[APP14, Adobe, Image] 3 - Color Transform: YCbCr +[Composite, Composite, Image] Exif-Aperture - Aperture: 4.9 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/64 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-LightValue - Light Value: 10.4 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 6.0 mm diff --git a/t/XMP_30.out b/t/XMP_30.out new file mode 100644 index 0000000..a7e0912 --- /dev/null +++ b/t/XMP_30.out @@ -0,0 +1,86 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 11.78'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:dc='http://purl.org/dc/elements/1.1/'> + <dc:creator> + <rdf:Seq> + <rdf:li>Phil Harvey</rdf:li> + </rdf:Seq> + </dc:creator> + <dc:description> + <rdf:Alt> + <rdf:li xml:lang='x-default'>UTF-16 (big-endian) encoded XMP</rdf:li> + </rdf:Alt> + </dc:description> + <dc:rights> + <rdf:Alt> + <rdf:li xml:lang='x-default'>Copyright 2004 Phil Harvey</rdf:li> + </rdf:Alt> + </dc:rights> + <dc:subject> + <rdf:Bag> + <rdf:li>ExifTool</rdf:li> + <rdf:li>Test</rdf:li> + <rdf:li>XMP</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title> + <rdf:Alt> + <rdf:li xml:lang='x-default'>Test IPTC picture</rdf:li> + </rdf:Alt> + </dc:title> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:photoshop='http://ns.adobe.com/photoshop/1.0/' + photoshop:AuthorsPosition='My Position' + photoshop:CaptionWriter='I wrote it' + photoshop:Category='1' + photoshop:City='Kingston' + photoshop:Country='Canada' + photoshop:Credit='My Credit' + photoshop:DateCreated='2004-02-26' + photoshop:Headline='No headline' + photoshop:Instructions='What instructions' + photoshop:Source='I&#39;m the source' + photoshop:State='Ont' + photoshop:TransmissionReference='What is a transmission reference?' + photoshop:Urgency='8'> + <photoshop:SupplementalCategories> + <rdf:Bag> + <rdf:li>amazing</rdf:li> + <rdf:li>image</rdf:li> + <rdf:li>utilities</rdf:li> + </rdf:Bag> + </photoshop:SupplementalCategories> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:xmp='http://ns.adobe.com/xap/1.0/' + xmp:CreateDate='2001-05-19T18:36:41' + xmp:ModifyDate='2004-02-26T09:36:46'/> + + <rdf:Description rdf:about='' + xmlns:stJob='http://ns.adobe.com/xap/1.0/sType/Job#' + xmlns:xmpBJ='http://ns.adobe.com/xap/1.0/bj/'> + <xmpBJ:JobRef> + <rdf:Bag> + <rdf:li + stJob:name='My Job'/> + </rdf:Bag> + </xmpBJ:JobRef> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:xmpMM='http://ns.adobe.com/xap/1.0/mm/' + xmpMM:DocumentID='adobe:docid:photoshop:4cc7b857-69d0-11d8-8ac4-bb59c92f0d9a'/> + + <rdf:Description rdf:about='' + xmlns:xmpRights='http://ns.adobe.com/xap/1.0/rights/' + xmpRights:Marked='False' + xmpRights:WebStatement='https://exiftool.org/'/> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/XMP_31.out b/t/XMP_31.out new file mode 100644 index 0000000..4a3b791 --- /dev/null +++ b/t/XMP_31.out @@ -0,0 +1,20 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: XMP4.xmp +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 2.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2009:05:24 11:19:39-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:59-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: XMP +[File, File, Other] FileTypeExtension - File Type Extension: xmp +[File, File, Other] MIMEType - MIME Type: application/rdf+xml +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 7.77 +[XMP, XMP-iptcExt, Location] LocationCreated - Location Created: [{City=one,CountryCode=1},{City=two,CountryCode=2},{City=three},{CountryCode=4}] +[XMP, XMP-dc, Author] contributor - Contributor: me +[XMP, XMP-dc, Image] subject - Subject: one, two +[XMP, XMP-test, Unknown] test:StructList2 - Struct List 2: [{Item1=c1-1,Item2=c2-1},{Item1=c1-2,Item2=c2-2,TestList1=[x1],TestList2=[y1,y2]}] +[XMP, XMP-test, Unknown] test:StructList1 - Struct List 1: [{Item1=b1,Item2=b2}] +[XMP, XMP-test, Unknown] test:BareStruct - Bare Struct: {Item1=a1,Item2=a2} +[XMP, XMP-test, Unknown] test:BareList2 - Bare List 2: b1, b2 +[XMP, XMP-test, Unknown] test:BareList1 - Bare List 1: a1 diff --git a/t/XMP_32.out b/t/XMP_32.out new file mode 100644 index 0000000..1189295 --- /dev/null +++ b/t/XMP_32.out @@ -0,0 +1,2 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 8.44 +[XMP, XMP-dc, Image] title-de - Title (de): A diff --git a/t/XMP_34.out b/t/XMP_34.out new file mode 100644 index 0000000..2c72595 --- /dev/null +++ b/t/XMP_34.out @@ -0,0 +1,2 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 8.44 +[XMP, XMP-dc, Image] title-de - Title (de): C diff --git a/t/XMP_36.out b/t/XMP_36.out new file mode 100644 index 0000000..da69c3a --- /dev/null +++ b/t/XMP_36.out @@ -0,0 +1,19 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: XMP5.xmp +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 4.7 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2021:04:28 17:04:35-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:59-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: XMP +[File, File, Other] FileTypeExtension - File Type Extension: xmp +[File, File, Other] MIMEType - MIME Type: application/rdf+xml +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 8.82 +[XMP, XMP-iptcExt, Author] ArtworkOrObject - Artwork Or Object: [{AOTitle=test,AOTitle-de=pr&uuml;fung,AOTitle-fr=&eacute;preuve}] +[XMP, XMP-exif, Camera] Flash - Flash: {Mode=Off,Return=No return detection} +[XMP, XMP-mwg-kw, Image] Keywords - Keyword Info: {Hierarchy=[{Children=[{Keyword=A-2}],Keyword=A-1},{Children=[{Keyword=B-2}],Keyword=B-1},{Keyword=C-1}]} +[XMP, XMP-mwg-rs, Image] Regions - Region Info: {RegionList=[{Area={H=8,W=8,X=0,Y=0},Name=Region 1,SeeAlso=plus:Licensee,Type=Face},{Extensions={XMP-exif:Flash={Mode=On,Return=Return not detected},XMP-iptcExt:ArtworkOrObject=[{AOTitle-de=verf&auml;nglich}],XMP-myXMPns:BTestTag={Field1=[this is wild]},XMP-xmpRights:UsageTerms-fr=libre}}]} +[XMP, XMP-myXMPns, Other] BTestTag - B Test Tag: {Field1-en-CA=[eh?],Field1-en-US=[huh?,groovy],Field1-fr=[,ing&eacute;nieux]} +[XMP, XMP-plus, Author] Licensee - Licensee: [{LicenseeName=Phil}] +[Composite, Composite, Camera] XMP-Flash - Flash: Off, Did not fire diff --git a/t/XMP_37.out b/t/XMP_37.out new file mode 100644 index 0000000..b511779 --- /dev/null +++ b/t/XMP_37.out @@ -0,0 +1,36 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: XMP5.xmp +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 4.7 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2021:04:28 17:04:35-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:59-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: XMP +[File, File, Other] FileTypeExtension - File Type Extension: xmp +[File, File, Other] MIMEType - MIME Type: application/rdf+xml +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 8.82 +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOTitle - Artwork Title: test +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOTitle-de - Artwork Title (de): pr&uuml;fung +[XMP, XMP-iptcExt, Author] ArtworkOrObjectAOTitle-fr - Artwork Title (fr): &eacute;preuve +[XMP, XMP-exif, Camera] FlashMode - Flash Mode: Off +[XMP, XMP-exif, Camera] FlashReturn - Flash Return: No return detection +[XMP, XMP-mwg-kw, Image] KeywordsHierarchyChildrenKeyword - Hierarchical Keywords 2: A-2, B-2 +[XMP, XMP-mwg-kw, Image] KeywordsHierarchyKeyword - Hierarchical Keywords 1: A-1, B-1, C-1 +[XMP, XMP-mwg-rs, Image] RegionsRegionListAreaH - Region Area H: 8 +[XMP, XMP-mwg-rs, Image] RegionsRegionListAreaW - Region Area W: 8 +[XMP, XMP-mwg-rs, Image] RegionsRegionListAreaX - Region Area X: 0 +[XMP, XMP-mwg-rs, Image] RegionsRegionListAreaY - Region Area Y: 0 +[XMP, XMP-mwg-rs, Image] RegionsRegionListName - Region Name: Region 1 +[XMP, XMP-mwg-rs, Image] RegionsRegionListType - Region Type: Face +[XMP, XMP-mwg-rs, Image] RegionsRegionListSeeAlso - Region See Also: plus:Licensee +[XMP, XMP-mwg-rs, Author] Iptc4xmpExt:RegionsRegionListExtensionsArtworkOrObjectAOTitle-de - Region Extensions Artwork Title (de): verf&auml;nglich +[XMP, XMP-mwg-rs, Camera] exif:RegionsRegionListExtensionsFlashMode - Region Extensions Flash Mode: On +[XMP, XMP-mwg-rs, Camera] exif:RegionsRegionListExtensionsFlashReturn - Region Extensions Flash Return: Return not detected +[XMP, XMP-mwg-rs, Other] myXMPns:RegionsRegionListExtensionsBTestTagField1 - Region Extensions Renamed: this is wild +[XMP, XMP-mwg-rs, Author] xmpRights:RegionsRegionListExtensionsUsageTerms-fr - Region Extensions Usage Terms (fr): libre +[XMP, XMP-myXMPns, Other] BTestTagField1-en-CA - Renamed (en-CA): eh? +[XMP, XMP-myXMPns, Other] BTestTagField1-en-US - Renamed (en-US): huh?, groovy +[XMP, XMP-myXMPns, Other] BTestTagField1-fr - Renamed (fr): ing&eacute;nieux +[XMP, XMP-plus, Author] LicenseeLicenseeName - Licensee Name: Phil +[Composite, Composite, Camera] XMP-Flash - Flash: Off, Did not fire diff --git a/t/XMP_39.out b/t/XMP_39.out new file mode 100644 index 0000000..a2b88e4 --- /dev/null +++ b/t/XMP_39.out @@ -0,0 +1,45 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: XMP.inx +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 6.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2011:11:25 11:38:08-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:59-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: INX +[File, File, Other] FileTypeExtension - File Type Extension: inx +[File, File, Other] MIMEType - MIME Type: application/x-indesign-interchange +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Adobe XMP Core 4.0-c006 1.236519, Wed Jun 14 2006 08:31:24 +[XMP, XMP-xmpMM, Other] InstanceID - Instance ID: beb2441b-dd64-11df-b20e-e65882d9428e +[XMP, XMP-xmpMM, Other] DerivedFromInstanceID - Derived From Instance ID: f0d208df-dc56-11df-95ac-e273561c7691 +[XMP, XMP-xmpMM, Other] DerivedFromDocumentID - Derived From Document ID: adobe:docid:indd:0419e6d7-167b-11df-8afc-dcb7ca988d92 +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:indd:f0d208e0-dc56-11df-95ac-e273561c7691 +[XMP, XMP-xmpMM, Other] RenditionClass - Rendition Class: default +[XMP, XMP-xmpMM, Other] ManifestLinkForm - Manifest Link Form: ReferenceStream +[XMP, XMP-xmpMM, Other] ManifestReferenceInstanceID - Manifest Reference Instance ID: uuid:9CC7E7EDDC5811DF8C4BC09357E49DC9 +[XMP, XMP-xmpMM, Other] ManifestReferenceDocumentID - Manifest Reference Document ID: uuid:9CC7E7ECDC5811DF8C4BC09357E49DC9 +[XMP, XMP-xmpMM, Other] ManifestPlacedXResolution - Manifest Placed X Resolution: 72.00 +[XMP, XMP-xmpMM, Other] ManifestPlacedYResolution - Manifest Placed Y Resolution: 72.00 +[XMP, XMP-xmpMM, Other] ManifestPlacedResolutionUnit - Manifest Placed Resolution Unit: Inches +[XMP, XMP-xmp, Time] CreateDate - Create Date: 2010:10:18 14:59:13Z +[XMP, XMP-xmp, Time] ModifyDate - Modify Date: 2010:10:19 22:53:33Z +[XMP, XMP-xmp, Time] MetadataDate - Metadata Date: 2010:10:19 22:53:33Z +[XMP, XMP-xmp, Image] CreatorTool - Creator Tool: Adobe InDesign 5.0 +[XMP, XMP-xmp, Image] ThumbnailsFormat - Thumbnail Format: JPEG +[XMP, XMP-xmp, Image] ThumbnailsWidth - Thumbnail Width: 1024 +[XMP, XMP-xmp, Image] ThumbnailsHeight - Thumbnail Height: 1024 +[XMP, XMP-xmpTPg, Image] ColorantsSwatchName - Colorant Swatch Name: Black +[XMP, XMP-xmpTPg, Image] ColorantsMode - Colorant Mode: CMYK +[XMP, XMP-xmpTPg, Image] ColorantsType - Colorant Type: Process +[XMP, XMP-xmpTPg, Image] ColorantsCyan - Colorant Cyan: 0 +[XMP, XMP-xmpTPg, Image] ColorantsMagenta - Colorant Magenta: 0 +[XMP, XMP-xmpTPg, Image] ColorantsYellow - Colorant Yellow: 0 +[XMP, XMP-xmpTPg, Image] ColorantsBlack - Colorant Black: 100 +[XMP, XMP-xmpTPg, Image] FontsFontName - Font Name: Times-Roman +[XMP, XMP-xmpTPg, Image] FontsFontFamily - Font Family: Times +[XMP, XMP-xmpTPg, Image] FontsFontFace - Font Face: Regular +[XMP, XMP-xmpTPg, Image] FontsFontType - Font Type: TrueType +[XMP, XMP-xmpTPg, Image] FontsVersionString - Font Version: Times-Roman6.0d6e5 +[XMP, XMP-xmpTPg, Image] FontsComposite - Font Composite: false +[XMP, XMP-xmpTPg, Image] FontsFontFileName - Font File Name: Times.dfont +[XMP, XMP-dc, Image] format - Format: application/x-indesign diff --git a/t/XMP_40.out b/t/XMP_40.out new file mode 100644 index 0000000..0e2fe33 --- /dev/null +++ b/t/XMP_40.out @@ -0,0 +1,3 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 8.82 +[XMP, XMP-mwg-kw, Image] KeywordsHierarchyKeyword - Hierarchical Keywords 1: A-1, B-1, C-1 +[XMP, XMP-plus, Author] LicenseeLicenseeName - Licensee Name: Phil diff --git a/t/XMP_41.out b/t/XMP_41.out new file mode 100644 index 0000000..820e50d --- /dev/null +++ b/t/XMP_41.out @@ -0,0 +1,247 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.44 +[File, System, Other] FileName - File Name: XMP_41_failed.xmp +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 14 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:07:12 14:20:45-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:07:12 14:20:45-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:07:12 14:20:45-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: XMP +[File, File, Other] FileTypeExtension - File Type Extension: xmp +[File, File, Other] MIMEType - MIME Type: application/rdf+xml +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.44 +[XMP, XMP-dwc, Time] EventDay - Event Day: 2013 +[XMP, XMP-dwc, Time] EventEarliestDate - Event Earliest Date: 2013 +[XMP, XMP-dwc, Time] EventEndDayOfYear - Event End Day Of Year: 2013 +[XMP, XMP-dwc, Time] EventEventDate - Event Date: 2013 +[XMP, XMP-dwc, Other] EventEventID - Event ID: 2013 +[XMP, XMP-dwc, Other] EventEventRemarks - Event Remarks: 2013 +[XMP, XMP-dwc, Time] EventEventTime - Event Time: 2013 +[XMP, XMP-dwc, Other] EventFieldNotes - Event Field Notes: 2013 +[XMP, XMP-dwc, Other] EventFieldNumber - Event Field Number: 2013 +[XMP, XMP-dwc, Other] EventHabitat - Event Habitat: 2013 +[XMP, XMP-dwc, Time] EventLatestDate - Event Latest Date: 2013 +[XMP, XMP-dwc, Time] EventMonth - Event Month: 2013 +[XMP, XMP-dwc, Other] EventParentEventID - Event Parent Event ID: 2013 +[XMP, XMP-dwc, Other] EventSampleSizeUnit - Event Sample Size Unit: 2013 +[XMP, XMP-dwc, Other] EventSampleSizeValue - Event Sample Size Value: 2013 +[XMP, XMP-dwc, Other] EventSamplingEffort - Event Sampling Effort: 2013 +[XMP, XMP-dwc, Other] EventSamplingProtocol - Event Sampling Protocol: 2013 +[XMP, XMP-dwc, Time] EventStartDayOfYear - Event Start Day Of Year: 2013 +[XMP, XMP-dwc, Time] EventVerbatimEventDate - Event Verbatim Event Date: 2013 +[XMP, XMP-dwc, Time] EventYear - Event Year: 2013 +[XMP, XMP-dwc, Other] FossilSpecimenMaterialSampleID - Fossil Specimen Material Sample ID: 2013 +[XMP, XMP-dwc, Other] GeologicalContextBed - Geological Context Bed: 2013 +[XMP, XMP-dwc, Other] GeologicalContextEarliestAgeOrLowestStage - Earliest Age Or Lowest Stage: 2013 +[XMP, XMP-dwc, Other] GeologicalContextEarliestEonOrLowestEonothem - Earliest Eon Or Lowest Eonothem: 2013 +[XMP, XMP-dwc, Other] GeologicalContextEarliestEpochOrLowestSeries - Earliest Epoch Or Lowest Series: 2013 +[XMP, XMP-dwc, Other] GeologicalContextEarliestEraOrLowestErathem - Earliest Era Or Lowest Erathem: 2013 +[XMP, XMP-dwc, Other] GeologicalContextEarliestPeriodOrLowestSystem - Earliest Period Or Lowest System: 2013 +[XMP, XMP-dwc, Other] GeologicalContextFormation - Geological Context Formation: 2013 +[XMP, XMP-dwc, Other] GeologicalContextGeologicalContextID - Geological Context ID: 2013 +[XMP, XMP-dwc, Other] GeologicalContextGroup - Geological Context Group: 2013 +[XMP, XMP-dwc, Other] GeologicalContextHighestBiostratigraphicZone - Highest Biostratigraphic Zone: 2013 +[XMP, XMP-dwc, Other] GeologicalContextLatestAgeOrHighestStage - Latest Age Or Highest Stage: 2013 +[XMP, XMP-dwc, Other] GeologicalContextLatestEonOrHighestEonothem - Latest Eon Or Highest Eonothem: 2013 +[XMP, XMP-dwc, Other] GeologicalContextLatestEpochOrHighestSeries - Latest Epoch Or Highest Series: 2013 +[XMP, XMP-dwc, Other] GeologicalContextLatestEraOrHighestErathem - Latest Era Or Highest Erathem: 2013 +[XMP, XMP-dwc, Other] GeologicalContextLatestPeriodOrHighestSystem - Latest Period Or Highest System: 2013 +[XMP, XMP-dwc, Other] GeologicalContextLithostratigraphicTerms - Lithostratigraphic Terms: 2013 +[XMP, XMP-dwc, Other] GeologicalContextLowestBiostratigraphicZone - Lowest Biostratigraphic Zone: 2013 +[XMP, XMP-dwc, Other] GeologicalContextMember - Geological Context Member: 2013 +[XMP, XMP-dwc, Time] HumanObservationDay - Human Observation Day: 2013 +[XMP, XMP-dwc, Time] HumanObservationEarliestDate - Human Observation Earliest Date: 2013 +[XMP, XMP-dwc, Time] HumanObservationEndDayOfYear - Human Observation End Day Of Year: 2013 +[XMP, XMP-dwc, Time] HumanObservationEventDate - Human Observation Event Date: 2013 +[XMP, XMP-dwc, Other] HumanObservationEventID - Human Observation Event ID: 2013 +[XMP, XMP-dwc, Other] HumanObservationEventRemarks - Human Observation Event Remarks: 2013 +[XMP, XMP-dwc, Time] HumanObservationEventTime - Human Observation Event Time: 2013 +[XMP, XMP-dwc, Other] HumanObservationFieldNotes - Human Observation Field Notes: 2013 +[XMP, XMP-dwc, Other] HumanObservationFieldNumber - Human Observation Field Number: 2013 +[XMP, XMP-dwc, Other] HumanObservationHabitat - Human Observation Habitat: 2013 +[XMP, XMP-dwc, Time] HumanObservationLatestDate - Human Observation Latest Date: 2013 +[XMP, XMP-dwc, Time] HumanObservationMonth - Human Observation Month: 2013 +[XMP, XMP-dwc, Other] HumanObservationParentEventID - Human Observation Parent Event ID: 2013 +[XMP, XMP-dwc, Other] HumanObservationSampleSizeUnit - Human Observation Sample Size Unit: 2013 +[XMP, XMP-dwc, Other] HumanObservationSampleSizeValue - Human Observation Sample Size Value: 2013 +[XMP, XMP-dwc, Other] HumanObservationSamplingEffort - Human Observation Sampling Effort: 2013 +[XMP, XMP-dwc, Other] HumanObservationSamplingProtocol - Human Observation Sampling Protocol: 2013 +[XMP, XMP-dwc, Time] HumanObservationStartDayOfYear - Human Observation Start Day Of Year: 2013 +[XMP, XMP-dwc, Time] HumanObservationVerbatimEventDate - Human Observation Verbatim Event Date: 2013 +[XMP, XMP-dwc, Time] HumanObservationYear - Human Observation Year: 2013 +[XMP, XMP-dwc, Time] IdentificationDateIdentified - Date Identified: 2013 +[XMP, XMP-dwc, Other] IdentificationIdentificationID - Identification ID: 2013 +[XMP, XMP-dwc, Other] IdentificationIdentificationQualifier - Identification Qualifier: 2013 +[XMP, XMP-dwc, Other] IdentificationIdentificationReferences - Identification References: 2013 +[XMP, XMP-dwc, Other] IdentificationIdentificationRemarks - Identification Remarks: 2013 +[XMP, XMP-dwc, Other] IdentificationIdentificationVerificationStatus - Identification Verification Status: 2013 +[XMP, XMP-dwc, Other] IdentificationIdentifiedBy - Identified By: 2013 +[XMP, XMP-dwc, Other] IdentificationIdentifiedByID - Identified By ID: 2013 +[XMP, XMP-dwc, Other] IdentificationTypeStatus - Type Status: 2013 +[XMP, XMP-dwc, Other] IdentificationVerbatimIdentification - Verbatim Identification: 2013 +[XMP, XMP-dwc, Other] LivingSpecimenMaterialSampleID - Living Specimen Material Sample ID: 2013 +[XMP, XMP-dwc, Time] MachineObservationDay - Machine Observation Day: 2013 +[XMP, XMP-dwc, Time] MachineObservationEarliestDate - Machine Observation Earliest Date: 2013 +[XMP, XMP-dwc, Time] MachineObservationEndDayOfYear - Machine Observation End Day Of Year: 2013 +[XMP, XMP-dwc, Time] MachineObservationEventDate - Machine Observation Event Date: 2013 +[XMP, XMP-dwc, Other] MachineObservationEventID - Machine Observation Event ID: 2013 +[XMP, XMP-dwc, Other] MachineObservationEventRemarks - Machine Observation Event Remarks: 2013 +[XMP, XMP-dwc, Time] MachineObservationEventTime - Machine Observation Event Time: 2013 +[XMP, XMP-dwc, Other] MachineObservationFieldNotes - Machine Observation Field Notes: 2013 +[XMP, XMP-dwc, Other] MachineObservationFieldNumber - Machine Observation Field Number: 2013 +[XMP, XMP-dwc, Other] MachineObservationHabitat - Machine Observation Habitat: 2013 +[XMP, XMP-dwc, Time] MachineObservationLatestDate - Machine Observation Latest Date: 2013 +[XMP, XMP-dwc, Time] MachineObservationMonth - Machine Observation Month: 2013 +[XMP, XMP-dwc, Other] MachineObservationParentEventID - Machine Observation Parent Event ID: 2013 +[XMP, XMP-dwc, Other] MachineObservationSampleSizeUnit - Machine Observation Sample Size Unit: 2013 +[XMP, XMP-dwc, Other] MachineObservationSampleSizeValue - Machine Observation Sample Size Value: 2013 +[XMP, XMP-dwc, Other] MachineObservationSamplingEffort - Machine Observation Sampling Effort: 2013 +[XMP, XMP-dwc, Other] MachineObservationSamplingProtocol - Machine Observation Sampling Protocol: 2013 +[XMP, XMP-dwc, Time] MachineObservationStartDayOfYear - Machine Observation Start Day Of Year: 2013 +[XMP, XMP-dwc, Time] MachineObservationVerbatimEventDate - Machine Observation Verbatim Event Date: 2013 +[XMP, XMP-dwc, Time] MachineObservationYear - Machine Observation Year: 2013 +[XMP, XMP-dwc, Other] MaterialSampleMaterialSampleID - Material Sample ID: 2013 +[XMP, XMP-dwc, Other] MeasurementOrFactMeasurementAccuracy - Measurement Accuracy: 2013 +[XMP, XMP-dwc, Other] MeasurementOrFactMeasurementDeterminedBy - Measurement Determined By: 2013 +[XMP, XMP-dwc, Time] MeasurementOrFactMeasurementDeterminedDate - Measurement Determined Date: 2013 +[XMP, XMP-dwc, Other] MeasurementOrFactMeasurementID - Measurement ID: 2013 +[XMP, XMP-dwc, Other] MeasurementOrFactMeasurementMethod - Measurement Method: 2013 +[XMP, XMP-dwc, Other] MeasurementOrFactMeasurementRemarks - Measurement Remarks: 2013 +[XMP, XMP-dwc, Other] MeasurementOrFactMeasurementType - Measurement Type: 2013 +[XMP, XMP-dwc, Other] MeasurementOrFactMeasurementUnit - Measurement Unit: 2013 +[XMP, XMP-dwc, Other] MeasurementOrFactMeasurementValue - Measurement Value: 2013 +[XMP, XMP-dwc, Other] OccurrenceAssociatedMedia - Occurrence Associated Media: 2013 +[XMP, XMP-dwc, Other] OccurrenceAssociatedOccurrences - Occurrence Associated Occurrences: 2013 +[XMP, XMP-dwc, Other] OccurrenceAssociatedReferences - Occurrence Associated References: 2013 +[XMP, XMP-dwc, Other] OccurrenceAssociatedSequences - Occurrence Associated Sequences: 2013 +[XMP, XMP-dwc, Other] OccurrenceAssociatedTaxa - Occurrence Associated Taxa: 2013 +[XMP, XMP-dwc, Other] OccurrenceBehavior - Occurrence Behavior: 2013 +[XMP, XMP-dwc, Other] OccurrenceCatalogNumber - Occurrence Catalog Number: 2013 +[XMP, XMP-dwc, Other] OccurrenceDegreeOfEstablishment - Occurrence Degree Of Establishment: 2013 +[XMP, XMP-dwc, Other] OccurrenceDisposition - Occurrence Disposition: 2013 +[XMP, XMP-dwc, Other] OccurrenceEstablishmentMeans - Occurrence Establishment Means: 2013 +[XMP, XMP-dwc, Other] OccurrenceGeoreferenceVerificationStatus - Occurrence Georeference Verification Status: 2013 +[XMP, XMP-dwc, Other] OccurrenceIndividualCount - Occurrence Individual Count: 2013 +[XMP, XMP-dwc, Other] OccurrenceIndividualID - Occurrence Individual ID: 2013 +[XMP, XMP-dwc, Other] OccurrenceLifeStage - Occurrence Life Stage: 2013 +[XMP, XMP-dwc, Other] OccurrenceOccurrenceDetails - Occurrence Details: 2013 +[XMP, XMP-dwc, Other] OccurrenceOccurrenceID - Occurrence ID: 2013 +[XMP, XMP-dwc, Other] OccurrenceOccurrenceRemarks - Occurrence Remarks: 2013 +[XMP, XMP-dwc, Other] OccurrenceOccurrenceStatus - Occurrence Status: 2013 +[XMP, XMP-dwc, Other] OccurrenceOrganismQuantity - Occurrence Organism Quantity: 2013 +[XMP, XMP-dwc, Other] OccurrenceOrganismQuantityType - Occurrence Organism Quantity Type: 2013 +[XMP, XMP-dwc, Other] OccurrenceOtherCatalogNumbers - Occurrence Other Catalog Numbers: 2013 +[XMP, XMP-dwc, Other] OccurrencePathway - Occurrence Pathway: 2013 +[XMP, XMP-dwc, Other] OccurrencePreparations - Occurrence Preparations: 2013 +[XMP, XMP-dwc, Other] OccurrencePreviousIdentifications - Occurrence Previous Identifications: 2013 +[XMP, XMP-dwc, Other] OccurrenceRecordNumber - Occurrence Record Number: 2013 +[XMP, XMP-dwc, Other] OccurrenceRecordedBy - Occurrence Recorded By: 2013 +[XMP, XMP-dwc, Other] OccurrenceRecordedByID - Occurrence Recorded By ID: 2013 +[XMP, XMP-dwc, Other] OccurrenceReproductiveCondition - Occurrence Reproductive Condition: 2013 +[XMP, XMP-dwc, Other] OccurrenceSex - Occurrence Sex: 2013 +[XMP, XMP-dwc, Other] OrganismAssociatedOccurrences - Organism Associated Occurrences: 2013 +[XMP, XMP-dwc, Other] OrganismAssociatedOrganisms - Organism Associated Organisms: 2013 +[XMP, XMP-dwc, Other] OrganismOrganismID - Organism ID: 2013 +[XMP, XMP-dwc, Other] OrganismOrganismName - Organism Name: 2013 +[XMP, XMP-dwc, Other] OrganismOrganismRemarks - Organism Remarks: 2013 +[XMP, XMP-dwc, Other] OrganismOrganismScope - Organism Scope: 2013 +[XMP, XMP-dwc, Other] OrganismPreviousIdentifications - Organism Previous Identifications: 2013 +[XMP, XMP-dwc, Other] PreservedSpecimenMaterialSampleID - Preserved Specimen Material Sample ID: 2013 +[XMP, XMP-dwc, Other] RecordBasisOfRecord - Record Basis Of Record: 2013 +[XMP, XMP-dwc, Other] RecordCollectionCode - Record Collection Code: 2013 +[XMP, XMP-dwc, Other] RecordCollectionID - Record Collection ID: 2013 +[XMP, XMP-dwc, Other] RecordDataGeneralizations - Record Data Generalizations: 2013 +[XMP, XMP-dwc, Other] RecordDatasetID - Record Dataset ID: 2013 +[XMP, XMP-dwc, Other] RecordDatasetName - Record Dataset Name: 2013 +[XMP, XMP-dwc, Other] RecordDynamicProperties - Record Dynamic Properties: 2013 +[XMP, XMP-dwc, Other] RecordInformationWithheld - Record Information Withheld: 2013 +[XMP, XMP-dwc, Other] RecordInstitutionCode - Record Institution Code: 2013 +[XMP, XMP-dwc, Other] RecordInstitutionID - Record Institution ID: 2013 +[XMP, XMP-dwc, Other] RecordOwnerInstitutionCode - Record Owner Institution Code: 2013 +[XMP, XMP-dwc, Other] ResourceRelationshipRelatedResourceID - Related Resource ID: 2013 +[XMP, XMP-dwc, Other] ResourceRelationshipRelationshipAccordingTo - Relationship According To: 2013 +[XMP, XMP-dwc, Time] ResourceRelationshipRelationshipEstablishedDate - Relationship Established Date: 2013 +[XMP, XMP-dwc, Other] ResourceRelationshipRelationshipOfResource - Relationship Of Resource: 2013 +[XMP, XMP-dwc, Other] ResourceRelationshipRelationshipOfResourceID - Relationship Of Resource ID: 2013 +[XMP, XMP-dwc, Other] ResourceRelationshipRelationshipRemarks - Relationship Remarks: 2013 +[XMP, XMP-dwc, Other] ResourceRelationshipResourceID - Resource ID: 2013 +[XMP, XMP-dwc, Other] ResourceRelationshipResourceRelationshipID - Resource Relationship ID: 2013 +[XMP, XMP-dwc, Other] TaxonAcceptedNameUsage - Taxon Accepted Name Usage: 2013 +[XMP, XMP-dwc, Other] TaxonAcceptedNameUsageID - Taxon Accepted Name Usage ID: 2013 +[XMP, XMP-dwc, Other] TaxonClass - Taxon Class: 2013 +[XMP, XMP-dwc, Other] TaxonCultivarEpithet - Taxon Cultivar Epithet: 2013 +[XMP, XMP-dwc, Other] TaxonFamily - Taxon Family: 2013 +[XMP, XMP-dwc, Other] TaxonGenus - Taxon Genus: 2013 +[XMP, XMP-dwc, Other] TaxonHigherClassification - Taxon Higher Classification: 2013 +[XMP, XMP-dwc, Other] TaxonInfraspecificEpithet - Taxon Infraspecific Epithet: 2013 +[XMP, XMP-dwc, Other] TaxonKingdom - Taxon Kingdom: 2013 +[XMP, XMP-dwc, Other] TaxonNameAccordingTo - Taxon Name According To: 2013 +[XMP, XMP-dwc, Other] TaxonNameAccordingToID - Taxon Name According To ID: 2013 +[XMP, XMP-dwc, Other] TaxonNamePublishedIn - Taxon Name Published In: 2013 +[XMP, XMP-dwc, Other] TaxonNamePublishedInID - Taxon Name Published In ID: 2013 +[XMP, XMP-dwc, Other] TaxonNamePublishedInYear - Taxon Name Published In Year: 2013 +[XMP, XMP-dwc, Other] TaxonNomenclaturalCode - Taxon Nomenclatural Code: 2013 +[XMP, XMP-dwc, Other] TaxonNomenclaturalStatus - Taxon Nomenclatural Status: 2013 +[XMP, XMP-dwc, Other] TaxonOrder - Taxon Order: 2013 +[XMP, XMP-dwc, Other] TaxonOriginalNameUsage - Taxon Original Name Usage: 2013 +[XMP, XMP-dwc, Other] TaxonOriginalNameUsageID - Taxon Original Name Usage ID: 2013 +[XMP, XMP-dwc, Other] TaxonParentNameUsage - Taxon Parent Name Usage: 2013 +[XMP, XMP-dwc, Other] TaxonParentNameUsageID - Taxon Parent Name Usage ID: 2013 +[XMP, XMP-dwc, Other] TaxonPhylum - Taxon Phylum: 2013 +[XMP, XMP-dwc, Other] TaxonScientificName - Taxon Scientific Name: 2013 +[XMP, XMP-dwc, Other] TaxonScientificNameAuthorship - Taxon Scientific Name Authorship: 2013 +[XMP, XMP-dwc, Other] TaxonScientificNameID - Taxon Scientific Name ID: 2013 +[XMP, XMP-dwc, Other] TaxonSpecificEpithet - Taxon Specific Epithet: 2013 +[XMP, XMP-dwc, Other] TaxonSubgenus - Taxon Subgenus: 2013 +[XMP, XMP-dwc, Other] TaxonTaxonConceptID - Taxon Concept ID: 2013 +[XMP, XMP-dwc, Other] TaxonTaxonID - Taxon ID: 2013 +[XMP, XMP-dwc, Other] TaxonTaxonRank - Taxon Rank: 2013 +[XMP, XMP-dwc, Other] TaxonTaxonRemarks - Taxon Remarks: 2013 +[XMP, XMP-dwc, Other] TaxonTaxonomicStatus - Taxon Taxonomic Status: 2013 +[XMP, XMP-dwc, Other] TaxonVerbatimTaxonRank - Taxon Verbatim Taxon Rank: 2013 +[XMP, XMP-dwc, Other] TaxonVernacularName - Taxon Vernacular Name: 2013 +[XMP, XMP-dwc, Location] dctermsLocationContinent - DC Continent: 2013 +[XMP, XMP-dwc, Location] dctermsLocationCoordinatePrecision - DC Coordinate Precision: 2013 +[XMP, XMP-dwc, Location] dctermsLocationCoordinateUncertaintyInMeters - DC Coordinate Uncertainty In Meters: 2013 +[XMP, XMP-dwc, Location] dctermsLocationCountry - DC Country: 2013 +[XMP, XMP-dwc, Location] dctermsLocationCountryCode - DC Country Code: 2013 +[XMP, XMP-dwc, Location] dctermsLocationCounty - DC County: 2013 +[XMP, XMP-dwc, Location] dctermsLocationDecimalLatitude - DC Decimal Latitude: 2013 +[XMP, XMP-dwc, Location] dctermsLocationDecimalLongitude - DC Decimal Longitude: 2013 +[XMP, XMP-dwc, Location] dctermsLocationFootprintSRS - DC Footprint SRS: 2013 +[XMP, XMP-dwc, Location] dctermsLocationFootprintSpatialFit - DC Footprint Spatial Fit: 2013 +[XMP, XMP-dwc, Location] dctermsLocationFootprintWKT - DC Footprint WKT: 2013 +[XMP, XMP-dwc, Location] dctermsLocationGeodeticDatum - DC Geodetic Datum: 2013 +[XMP, XMP-dwc, Location] dctermsLocationGeoreferenceProtocol - DC Georeference Protocol: 2013 +[XMP, XMP-dwc, Location] dctermsLocationGeoreferenceRemarks - DC Georeference Remarks: 2013 +[XMP, XMP-dwc, Location] dctermsLocationGeoreferenceSources - DC Georeference Sources: 2013 +[XMP, XMP-dwc, Location] dctermsLocationGeoreferenceVerificationStatus - DC Georeference Verification Status: 2013 +[XMP, XMP-dwc, Location] dctermsLocationGeoreferencedBy - DC Georeferenced By: 2013 +[XMP, XMP-dwc, Location] dctermsLocationGeoreferencedDate - DC Georeferenced Date: 2013 +[XMP, XMP-dwc, Location] dctermsLocationHigherGeography - DC Higher Geography: 2013 +[XMP, XMP-dwc, Location] dctermsLocationHigherGeographyID - DC Higher Geography ID: 2013 +[XMP, XMP-dwc, Location] dctermsLocationIsland - DC Island: 2013 +[XMP, XMP-dwc, Location] dctermsLocationIslandGroup - DC Island Group: 2013 +[XMP, XMP-dwc, Location] dctermsLocationLocality - DC Locality: 2013 +[XMP, XMP-dwc, Location] dctermsLocationLocationAccordingTo - DC Location According To: 2013 +[XMP, XMP-dwc, Location] dctermsLocationLocationID - DC Location ID: 2013 +[XMP, XMP-dwc, Location] dctermsLocationLocationRemarks - DC Location Remarks: 2013 +[XMP, XMP-dwc, Location] dctermsLocationMaximumDepthInMeters - DC Maximum Depth In Meters: 2013 +[XMP, XMP-dwc, Location] dctermsLocationMaximumDistanceAboveSurfaceInMeters - DC Maximum Distance Above Surface In Meters: 2013 +[XMP, XMP-dwc, Location] dctermsLocationMaximumElevationInMeters - DC Maximum Elevation In Meters: 2013 +[XMP, XMP-dwc, Location] dctermsLocationMinimumDepthInMeters - DC Minimum Depth In Meters: 2013 +[XMP, XMP-dwc, Location] dctermsLocationMinimumDistanceAboveSurfaceInMeters - DC Minimum Distance Above Surface In Meters: 2013 +[XMP, XMP-dwc, Location] dctermsLocationMinimumElevationInMeters - DC Minimum Elevation In Meters: 2013 +[XMP, XMP-dwc, Location] dctermsLocationMunicipality - DC Municipality: 2013 +[XMP, XMP-dwc, Location] dctermsLocationPointRadiusSpatialFit - DC Point Radius Spatial Fit: 2013 +[XMP, XMP-dwc, Location] dctermsLocationStateProvince - DC State Province: 2013 +[XMP, XMP-dwc, Location] dctermsLocationVerbatimCoordinateSystem - DC Verbatim Coordinate System: 2013 +[XMP, XMP-dwc, Location] dctermsLocationVerbatimCoordinates - DC Verbatim Coordinates: 2013 +[XMP, XMP-dwc, Location] dctermsLocationVerbatimDepth - DC Verbatim Depth: 2013 +[XMP, XMP-dwc, Location] dctermsLocationVerbatimElevation - DC Verbatim Elevation: 2013 +[XMP, XMP-dwc, Location] dctermsLocationVerbatimLatitude - DC Verbatim Latitude: 2013 +[XMP, XMP-dwc, Location] dctermsLocationVerbatimLocality - DC Verbatim Locality: 2013 +[XMP, XMP-dwc, Location] dctermsLocationVerbatimLongitude - DC Verbatim Longitude: 2013 +[XMP, XMP-dwc, Location] dctermsLocationVerbatimSRS - DC Verbatim SRS: 2013 +[XMP, XMP-dwc, Location] dctermsLocationVerticalDatum - DC Vertical Datum: 2013 +[XMP, XMP-dwc, Location] dctermsLocationWaterBody - DC Water Body: 2013 diff --git a/t/XMP_42.out b/t/XMP_42.out new file mode 100644 index 0000000..9706047 --- /dev/null +++ b/t/XMP_42.out @@ -0,0 +1,8 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 7.50 +[XMP, XMP-xmpNote, Other] HasExtendedXMP - Has Extended XMP: 04B9E48040A30A6308713BD1E4223B41 +[XMP, XMP-pdf, Author] Author - Author: PhilToo +[XMP, XMP-pdf, Time] CreationDate - Creation Date: 2008:10:20 19:54:15 +[XMP, XMP-pdf, Author] Creator - Creator: Guess Who +[XMP, XMP-pdf, Time] ModDate - Mod Date: 2008:10:20 19:54:15 +[XMP, XMP-pdf, Author] Producer - Producer: Just ExifTool again +[XMP, XMP-pdf, Image] Title - Title: PDF Title diff --git a/t/XMP_43.out b/t/XMP_43.out new file mode 100644 index 0000000..8b029ac --- /dev/null +++ b/t/XMP_43.out @@ -0,0 +1,6 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 9.97 +[XMP, XMP-xxxx, Unknown] xxxx:Test - Test: trout +[XMP, XMP-tmp0, Unknown] tmp0:Test - Test: tabby +[XMP, XMP-xmp, Image] Rating - Rating: 2 +[XMP, XMP-dc, Image] subject - Subject: x +[XMP, XMP-dc, Image] title - Title: a title diff --git a/t/XMP_44.out b/t/XMP_44.out new file mode 100644 index 0000000..fbaa762 --- /dev/null +++ b/t/XMP_44.out @@ -0,0 +1,35 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 9.97'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:dc='http://purl.org/dc/elements/1.1/'> + <dc:subject> + <rdf:Bag> + <rdf:li>changed</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title> + <rdf:Alt> + <rdf:li xml:lang='x-default'>a title</rdf:li> + </rdf:Alt> + </dc:title> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:tmp0='http://testtag.com/feline/1.0/'> + <tmp0:Test>tabby</tmp0:Test> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:xmp='http://ns.adobe.com/xap/1.0/'> + <xmp:Rating>2</xmp:Rating> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:xxxx='http://testtag.com/fish/1.0/'> + <xxxx:Test>trout</xxxx:Test> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/XMP_45.out b/t/XMP_45.out new file mode 100644 index 0000000..5e45c66 --- /dev/null +++ b/t/XMP_45.out @@ -0,0 +1,23 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 10.08'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:exif='http://ns.adobe.com/exif/1.0/'> + <exif:Flash rdf:parseType='Resource'/> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:mwg-rs='http://www.metadataworkinggroup.com/schemas/regions/'> + <mwg-rs:Regions rdf:parseType='Resource'> + <mwg-rs:RegionList> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'/> + <rdf:li rdf:parseType='Resource'/> + </rdf:Bag> + </mwg-rs:RegionList> + </mwg-rs:Regions> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/XMP_46.out b/t/XMP_46.out new file mode 100644 index 0000000..fb5ffed --- /dev/null +++ b/t/XMP_46.out @@ -0,0 +1 @@ +[XMP, XMP-dc, Image] subject - Subject: Exif // XMP diff --git a/t/XMP_47.out b/t/XMP_47.out new file mode 100644 index 0000000..1923ad1 --- /dev/null +++ b/t/XMP_47.out @@ -0,0 +1,2 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 11.57 +[XMP, XMP-iptcExt, Location] LocationShown - Location Shown: [{City=Manchester,CountryCode=GB},{City=Lyon,CountryCode=FR},{City=Frankfurt,CountryCode=DE}] diff --git a/t/XMP_48.out b/t/XMP_48.out new file mode 100644 index 0000000..cebd5e2 --- /dev/null +++ b/t/XMP_48.out @@ -0,0 +1,2 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 11.57 +[XMP, XMP-iptcExt, Location] LocationShown - Location Shown: [{City=Oxford,CountryCode=GB},{City=Paris,CountryCode=FR},{City=Munich,CountryCode=DE}] diff --git a/t/XMP_49.out b/t/XMP_49.out new file mode 100644 index 0000000..4b85104 --- /dev/null +++ b/t/XMP_49.out @@ -0,0 +1,2 @@ +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 11.58 +[XMP, XMP-iptcExt, Author] AboutCvTerm - About Cv Term: [{CvId=1,CvTermName=a},{CvId=2,CvTermName=two},{CvId=3,CvTermName=b},{CvTermName=c}] diff --git a/t/XMP_5.out b/t/XMP_5.out new file mode 100644 index 0000000..5e13863 --- /dev/null +++ b/t/XMP_5.out @@ -0,0 +1,30 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileSize - File Size: 6.0 kB +[File, File, Other] FileType - File Type: XMP +[File, File, Other] FileTypeExtension - File Type Extension: xmp +[File, File, Other] MIMEType - MIME Type: application/rdf+xml +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 4.73 +[XMP, XMP-rdf, Document] about - About: uuid:80056b68-1045-fa97-3401-6f4ed84cd53d +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: UTF-16 (big-endian) encoded XMP +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP +[XMP, XMP-dc, Image] title - Title: Test IPTC picture +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: My Position +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: I wrote it +[XMP, XMP-photoshop, Image] Category - Category: 1 +[XMP, XMP-photoshop, Location] City - City: Kingston +[XMP, XMP-photoshop, Location] Country - Country: Canada +[XMP, XMP-photoshop, Author] Credit - Credit: My Credit +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2004:02:26 +[XMP, XMP-photoshop, Image] Headline - Headline: No headline +[XMP, XMP-photoshop, Image] Instructions - Instructions: What instructions +[XMP, XMP-photoshop, Author] Source - Source: I'm the source +[XMP, XMP-photoshop, Location] State - State: Ont +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: amazing, image, utilities +[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: What is a transmission reference? +[XMP, XMP-photoshop, Image] Urgency - Urgency: 8 (least urgent) +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:4cc7b857-69d0-11d8-8ac4-bb59c92f0d9a +[XMP, XMP-xmpRights, Author] Marked - Marked: False +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ diff --git a/t/XMP_50.out b/t/XMP_50.out new file mode 100644 index 0000000..d524ca3 --- /dev/null +++ b/t/XMP_50.out @@ -0,0 +1,35 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 11.64'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:plus='http://ns.useplus.org/ldf/xmp/1.0/'> + <plus:Custom1> + <rdf:Bag> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>cu1</rdf:li> + <rdf:li xml:lang='de'>de1</rdf:li> + <rdf:li xml:lang='fr'>fr1</rdf:li> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>cu2</rdf:li> + <rdf:li xml:lang='de'/> + <rdf:li xml:lang='fr'/> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>cu3</rdf:li> + <rdf:li xml:lang='de'>de3</rdf:li> + <rdf:li xml:lang='fr'>fr3</rdf:li> + </rdf:Alt> + </rdf:li> + </rdf:Bag> + </plus:Custom1> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/XMP_52.out b/t/XMP_52.out new file mode 100644 index 0000000..1d0d47a --- /dev/null +++ b/t/XMP_52.out @@ -0,0 +1,39 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 11.64'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:plus='http://ns.useplus.org/ldf/xmp/1.0/'> + <plus:Custom1> + <rdf:Bag> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>cu1</rdf:li> + <rdf:li xml:lang='de'>de1</rdf:li> + <rdf:li xml:lang='fr'>fr1</rdf:li> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>cu2</rdf:li> + <rdf:li xml:lang='fr'/> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>cu3</rdf:li> + <rdf:li xml:lang='de'>de3</rdf:li> + <rdf:li xml:lang='fr'>fr3</rdf:li> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>new</rdf:li> + </rdf:Alt> + </rdf:li> + </rdf:Bag> + </plus:Custom1> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/XMP_53.out b/t/XMP_53.out new file mode 100644 index 0000000..188a818 --- /dev/null +++ b/t/XMP_53.out @@ -0,0 +1,67 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 11.64'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:plus='http://ns.useplus.org/ldf/xmp/1.0/'> + <plus:Custom1> + <rdf:Bag> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>cu1</rdf:li> + <rdf:li xml:lang='de'>de1</rdf:li> + <rdf:li xml:lang='fr'>fr1</rdf:li> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>cu2</rdf:li> + <rdf:li xml:lang='fr'/> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>cu3</rdf:li> + <rdf:li xml:lang='de'>de3</rdf:li> + <rdf:li xml:lang='fr'>fr3</rdf:li> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>a</rdf:li> + <rdf:li xml:lang='fr'>a-fr</rdf:li> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>b</rdf:li> + <rdf:li xml:lang='fr'/> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>c</rdf:li> + <rdf:li xml:lang='fr'>c-fr</rdf:li> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='fr'>d-fr</rdf:li> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='fr'/> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='fr'>f-fr</rdf:li> + </rdf:Alt> + </rdf:li> + </rdf:Bag> + </plus:Custom1> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/XMP_54.out b/t/XMP_54.out new file mode 100644 index 0000000..8969d4d --- /dev/null +++ b/t/XMP_54.out @@ -0,0 +1 @@ +[XMP, XMP-iptcExt, Image] ImageRegion - Image Region: [{RCtype=[{Identifier=[x]}],XMP-exif:Flash={Fired=True,Return=Return detected}}] diff --git a/t/XMP_6.out b/t/XMP_6.out new file mode 100644 index 0000000..d3c09dd --- /dev/null +++ b/t/XMP_6.out @@ -0,0 +1,89 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: XMP_6_failed.xmp +[File, System, Other] Directory - Directory: t +[File, System, Other] FileSize - File Size: 5.8 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2022:06:01 14:16:58-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:58-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2022:06:01 14:16:58-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: XMP +[File, File, Other] FileTypeExtension - File Type Extension: xmp +[File, File, Other] MIMEType - MIME Type: application/rdf+xml +[XMP, XMP-x, Document] xmptk - XMP Toolkit: Image::ExifTool 12.42 +[XMP, XMP-dc, Author] creator - Creator: Phil Harvey +[XMP, XMP-dc, Image] description - Description: UTF-16 (big-endian) encoded XMP +[XMP, XMP-dc, Author] rights - Rights: Copyright 2004 Phil Harvey +[XMP, XMP-dc, Image] subject - Subject: ExifTool, Test, XMP +[XMP, XMP-dc, Image] title - Title: Test IPTC picture +[XMP, XMP-exif, Image] ApertureValue - Aperture Value: 3.5 +[XMP, XMP-exif, Image] BrightnessValue - Brightness Value: 2 +[XMP, XMP-exif, Image] ColorSpace - Color Space: sRGB +[XMP, XMP-exif, Image] ComponentsConfiguration - Components Configuration: Y, Cb, Cr, - +[XMP, XMP-exif, Image] CompressedBitsPerPixel - Compressed Bits Per Pixel: 1.6 +[XMP, XMP-exif, Time] DateTimeOriginal - Date/Time Original: 2001:05:19 18:36:41 +[XMP, XMP-exif, Image] ExifVersion - Exif Version: 0210 +[XMP, XMP-exif, Image] ExposureBiasValue - Exposure Compensation: 0 +[XMP, XMP-exif, Camera] ExposureProgram - Exposure Program: Program AE +[XMP, XMP-exif, Image] FNumber - F Number: 3.5 +[XMP, XMP-exif, Image] FileSource - File Source: Digital Camera +[XMP, XMP-exif, Camera] FlashFired - Flash Fired: True +[XMP, XMP-exif, Camera] FlashFunction - Flash Function: False +[XMP, XMP-exif, Camera] FlashMode - Flash Mode: Unknown +[XMP, XMP-exif, Camera] FlashRedEyeMode - Flash Red Eye Mode: False +[XMP, XMP-exif, Camera] FlashReturn - Flash Return: No return detection +[XMP, XMP-exif, Image] FlashpixVersion - Flashpix Version: 0100 +[XMP, XMP-exif, Camera] FocalLength - Focal Length: 6.0 mm +[XMP, XMP-exif, Camera] FocalPlaneResolutionUnit - Focal Plane Resolution Unit: cm +[XMP, XMP-exif, Camera] FocalPlaneXResolution - Focal Plane X Resolution: 3053 +[XMP, XMP-exif, Camera] FocalPlaneYResolution - Focal Plane Y Resolution: 3053 +[XMP, XMP-exif, Image] ISOSpeedRatings - ISO: 100 +[XMP, XMP-exif, Camera] MaxApertureValue - Max Aperture Value: 3.5 +[XMP, XMP-exif, Camera] MeteringMode - Metering Mode: Multi-segment +[XMP, XMP-exif, Image] PixelXDimension - Exif Image Width: 100 +[XMP, XMP-exif, Image] PixelYDimension - Exif Image Height: 80 +[XMP, XMP-exif, Image] SceneType - Scene Type: Directly photographed +[XMP, XMP-exif, Camera] SensingMethod - Sensing Method: One-chip color area +[XMP, XMP-exif, Image] ShutterSpeedValue - Shutter Speed Value: 1/64 +[XMP, XMP-photoshop, Author] AuthorsPosition - Authors Position: My Position +[XMP, XMP-photoshop, Author] CaptionWriter - Caption Writer: I wrote it +[XMP, XMP-photoshop, Image] Category - Category: 1 +[XMP, XMP-photoshop, Location] City - City: Kingston +[XMP, XMP-photoshop, Location] Country - Country: Canada +[XMP, XMP-photoshop, Author] Credit - Credit: My Credit +[XMP, XMP-photoshop, Time] DateCreated - Date Created: 2004:02:26 +[XMP, XMP-photoshop, Image] Headline - Headline: No headline +[XMP, XMP-photoshop, Image] Instructions - Instructions: What instructions +[XMP, XMP-photoshop, Author] Source - Source: I'm the source +[XMP, XMP-photoshop, Location] State - State: Ont +[XMP, XMP-photoshop, Image] SupplementalCategories - Supplemental Categories: amazing, image, utilities +[XMP, XMP-photoshop, Image] TransmissionReference - Transmission Reference: What is a transmission reference? +[XMP, XMP-photoshop, Image] Urgency - Urgency: 8 (least urgent) +[XMP, XMP-tiff, Author] Artist - Artist: Phil Harvey +[XMP, XMP-tiff, Image] BitsPerSample - Bits Per Sample: 8 +[XMP, XMP-tiff, Image] Compression - Compression: JPEG (old-style) +[XMP, XMP-tiff, Author] Copyright - Copyright: Copyright 2004 Phil Harvey +[XMP, XMP-tiff, Image] ImageDescription - Image Description: A witty caption +[XMP, XMP-tiff, Image] ImageLength - Image Height: 8 +[XMP, XMP-tiff, Image] ImageWidth - Image Width: 8 +[XMP, XMP-tiff, Camera] Make - Make: FUJIFILM +[XMP, XMP-tiff, Camera] Model - Camera Model Name: FinePix2400Zoom +[XMP, XMP-tiff, Image] Orientation - Orientation: Horizontal (normal) +[XMP, XMP-tiff, Image] ResolutionUnit - Resolution Unit: inches +[XMP, XMP-tiff, Image] Software - Software: Adobe Photoshop 7.0 +[XMP, XMP-tiff, Image] XResolution - X Resolution: 72 +[XMP, XMP-tiff, Image] YCbCrPositioning - Y Cb Cr Positioning: Co-sited +[XMP, XMP-tiff, Image] YCbCrSubSampling - Y Cb Cr Sub Sampling: YCbCr4:2:0 (2 2) +[XMP, XMP-tiff, Image] YResolution - Y Resolution: 72 +[XMP, XMP-xmp, Time] CreateDate - Create Date: 2001:05:19 18:36:41 +[XMP, XMP-xmp, Time] ModifyDate - Modify Date: 2004:02:26 09:36:46 +[XMP, XMP-xmpBJ, Other] JobRefName - Job Ref Name: My Job +[XMP, XMP-xmpMM, Other] DocumentID - Document ID: adobe:docid:photoshop:4cc7b857-69d0-11d8-8ac4-bb59c92f0d9a +[XMP, XMP-xmpRights, Author] Marked - Marked: False +[XMP, XMP-xmpRights, Author] WebStatement - Web Statement: https://exiftool.org/ +[Composite, Composite, Image] Exif-Aperture - Aperture: 3.5 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/64 +[Composite, Composite, Camera] XMP-Flash - Flash: Fired +[Composite, Composite, Image] Exif-ImageSize - Image Size: 8x8 +[Composite, Composite, Image] Exif-LightValue - Light Value: 9.6 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 0.000064 +[Composite, Composite, Camera] Exif-FocalLength35efl - Focal Length: 6.0 mm diff --git a/t/XMP_7.out b/t/XMP_7.out new file mode 100644 index 0000000..7ed546f --- /dev/null +++ b/t/XMP_7.out @@ -0,0 +1,118 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 9.75'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:dc='http://purl.org/dc/elements/1.1/'> + <dc:format>image/jpeg</dc:format> + <dc:rights> + <rdf:Alt> + <rdf:li xml:lang='x-default'>© Copyright Someone Else</rdf:li> + </rdf:Alt> + </dc:rights> + <dc:subject> + <rdf:Bag> + <rdf:li>test1</rdf:li> + <rdf:li>&amp;-<![CDATA[&amp;]]>-&amp;</rdf:li> + <rdf:li>char test: &amp; &gt; &lt; &#39; &quot;</rdf:li> + </rdf:Bag> + </dc:subject> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:exif='http://ns.adobe.com/exif/1.0/'> + <exif:ApertureValue>95/32</exif:ApertureValue> + <exif:ColorSpace>1</exif:ColorSpace> + <exif:ComponentsConfiguration> + <rdf:Seq> + <rdf:li>1</rdf:li> + <rdf:li>2</rdf:li> + <rdf:li>3</rdf:li> + <rdf:li>0</rdf:li> + </rdf:Seq> + </exif:ComponentsConfiguration> + <exif:CompressedBitsPerPixel>3/1</exif:CompressedBitsPerPixel> + <exif:CustomRendered>0</exif:CustomRendered> + <exif:DateTimeDigitized>2005-06-09T20:09:27+02:00</exif:DateTimeDigitized> + <exif:DateTimeOriginal>2005-06-09T20:09:27+02:00</exif:DateTimeOriginal> + <exif:DigitalZoomRatio>2272/2272</exif:DigitalZoomRatio> + <exif:ExifVersion>0.2.2.0</exif:ExifVersion> + <exif:ExposureBiasValue>-3/3</exif:ExposureBiasValue> + <exif:ExposureMode>1</exif:ExposureMode> + <exif:ExposureTime>4/10</exif:ExposureTime> + <exif:FNumber>28/10</exif:FNumber> + <exif:FileSource>3</exif:FileSource> + <exif:Flash rdf:parseType='Resource'> + <exif:Fired>False</exif:Fired> + <exif:Function>False</exif:Function> + <exif:Mode>2</exif:Mode> + <exif:RedEyeMode>False</exif:RedEyeMode> + <exif:Return>0</exif:Return> + </exif:Flash> + <exif:FlashpixVersion>0.1.0.0</exif:FlashpixVersion> + <exif:FocalLength>5800/1000</exif:FocalLength> + <exif:FocalPlaneResolutionUnit>2</exif:FocalPlaneResolutionUnit> + <exif:FocalPlaneXResolution>2272000/224</exif:FocalPlaneXResolution> + <exif:FocalPlaneYResolution>1704000/168</exif:FocalPlaneYResolution> + <exif:MaxApertureValue>95/32</exif:MaxApertureValue> + <exif:MeteringMode>5</exif:MeteringMode> + <exif:NativeDigest>36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;CE459FE772DF591DDF5F63CA3F2A087B</exif:NativeDigest> + <exif:PixelXDimension>1136</exif:PixelXDimension> + <exif:PixelYDimension>852</exif:PixelYDimension> + <exif:SceneCaptureType>0</exif:SceneCaptureType> + <exif:SensingMethod>2</exif:SensingMethod> + <exif:ShutterSpeedValue>42/32</exif:ShutterSpeedValue> + <exif:WhiteBalance>0</exif:WhiteBalance> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:photoshop='http://ns.adobe.com/photoshop/1.0/'> + <photoshop:ColorMode>3</photoshop:ColorMode> + <photoshop:History/> + <photoshop:ICCProfile>sRGB IEC61966-2.1</photoshop:ICCProfile> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:tiff='http://ns.adobe.com/tiff/1.0/'> + <tiff:BitsPerSample> + <rdf:Seq> + <rdf:li>8</rdf:li> + <rdf:li>8</rdf:li> + <rdf:li>8</rdf:li> + </rdf:Seq> + </tiff:BitsPerSample> + <tiff:ImageLength>852</tiff:ImageLength> + <tiff:ImageWidth>1136</tiff:ImageWidth> + <tiff:Make>Canon</tiff:Make> + <tiff:Model>Canon DIGITAL IXUS 40</tiff:Model> + <tiff:NativeDigest>256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;D11E7FC551E751BE9E616260834B2A1D</tiff:NativeDigest> + <tiff:Orientation>1</tiff:Orientation> + <tiff:ResolutionUnit>2</tiff:ResolutionUnit> + <tiff:XResolution>1800000/10000</tiff:XResolution> + <tiff:YCbCrPositioning>1</tiff:YCbCrPositioning> + <tiff:YResolution>1800000/10000</tiff:YResolution> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:xmp='http://ns.adobe.com/xap/1.0/'> + <xmp:CreateDate>2005-11-21T17:07:14+01:00</xmp:CreateDate> + <xmp:CreatorTool>Adobe Photoshop CS2 Windows</xmp:CreatorTool> + <xmp:Label>Blue</xmp:Label> + <xmp:MetadataDate>2005-11-21T17:11:31+01:00</xmp:MetadataDate> + <xmp:ModifyDate>2005-11-21T17:07:14+01:00</xmp:ModifyDate> + <xmp:Rating>3</xmp:Rating> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:stRef='http://ns.adobe.com/xap/1.0/sType/ResourceRef#' + xmlns:xmpMM='http://ns.adobe.com/xap/1.0/mm/'> + <xmpMM:DerivedFrom rdf:parseType='Resource'> + <stRef:documentID>adobe:docid:photoshop:f481cc67-d8f5-11d9-a31e-a1606d941d83</stRef:documentID> + <stRef:instanceID>adobe:docid:photoshop:f481cc67-d8f5-11d9-a31e-a1606d941d83</stRef:instanceID> + </xmpMM:DerivedFrom> + <xmpMM:DocumentID>uuid:7A9636BAA85ADA11B611C7FA524F1F71</xmpMM:DocumentID> + <xmpMM:InstanceID>uuid:7B9636BAA85ADA11B611C7FA524F1F71</xmpMM:InstanceID> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/XMP_8.out b/t/XMP_8.out new file mode 100644 index 0000000..7861796 --- /dev/null +++ b/t/XMP_8.out @@ -0,0 +1,20 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.17 +[File, System, Other] FileName - File Name: XMP2.xmp +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 890 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2006:09:01 09:59:28-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2021:02:02 11:30:54-05:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2017:12:27 12:00:59-05:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: XMP +[File, File, Other] FileTypeExtension - File Type Extension: xmp +[File, File, Other] MIMEType - MIME Type: application/rdf+xml +[XMP, XMP-dc, Image] title - Title: XMP nodeID test (XMP written by f-spot) +[XMP, XMP-aux, Camera] Lens - Lens: 18.0 - 55.0mm +[XMP, XMP-aux, Camera] SerialNumber - Serial Number: 0123456789 +[XMP, XMP-tiff, Image] ImageLength - Image Height: 2048 +[XMP, XMP-tiff, Image] ImageWidth - Image Width: 3072 +[XMP, XMP-dc, Image] subject - Subject: ExifTool, XMP, nodeID, test +[Composite, Composite, Image] Exif-ImageSize - Image Size: 3072x2048 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 6.3 +[Composite, Composite, Camera] Exif-LensID-2 - Lens ID: 18.0-55.0mm diff --git a/t/XMP_9.out b/t/XMP_9.out new file mode 100644 index 0000000..b96a226 --- /dev/null +++ b/t/XMP_9.out @@ -0,0 +1,52 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 9.70'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:aux='http://ns.adobe.com/exif/1.0/aux/'> + <aux:Lens>18.0 - 55.0mm</aux:Lens> + <aux:SerialNumber>0123456789</aux:SerialNumber> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:cc='http://creativecommons.org/ns#'> + <cc:attributionName>something else</cc:attributionName> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:dc='http://purl.org/dc/elements/1.1/'> + <dc:creator> + <rdf:Seq> + <rdf:li>Phil</rdf:li> + </rdf:Seq> + </dc:creator> + <dc:subject> + <rdf:Bag> + <rdf:li>ExifTool</rdf:li> + <rdf:li>XMP</rdf:li> + <rdf:li>nodeID</rdf:li> + <rdf:li>test</rdf:li> + </rdf:Bag> + </dc:subject> + <dc:title>XMP nodeID test (XMP written by f-spot)</dc:title> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:tiff='http://ns.adobe.com/tiff/1.0/'> + <tiff:ImageLength>2048</tiff:ImageLength> + <tiff:ImageWidth>3072</tiff:ImageWidth> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:xmpMM='http://ns.adobe.com/xap/1.0/mm/'> + <xmpMM:Manifest> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <xmpMM:placedXResolution>1</xmpMM:placedXResolution> + </rdf:li> + </rdf:Bag> + </xmpMM:Manifest> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/ZIP.t b/t/ZIP.t new file mode 100644 index 0000000..a2fb270 --- /dev/null +++ b/t/ZIP.t @@ -0,0 +1,70 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/ZIP.t". + +BEGIN { + $| = 1; print "1..7\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::ZIP; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'ZIP'; +my $testnum = 1; +my $failed; + +# tests 2-3: Extract information from test ZIP and GZIP files +{ + my $exifTool = new Image::ExifTool; + my $type; + foreach $type (qw(zip gz)) { + ++$testnum; + my $info = $exifTool->ImageInfo("t/images/ZIP.$type"); + print 'not ' and $failed = 1 unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; + } +} + +# tests 4-7: Extract information from other ZIP-based files (requires Archive::Zip) +{ + my $exifTool = new Image::ExifTool; + my $file; + foreach $file ('OOXML.docx', 'CaptureOne.eip', 'iWork.numbers', 'OpenDoc.ods') { + ++$testnum; + my $skip = ''; + if (eval 'require Archive::Zip') { + my $info = $exifTool->ImageInfo("t/images/$file"); + print 'not ' and $failed = 1 unless check($exifTool, $info, $testname, $testnum); + } else { + $skip = ' # skip Requires Archive::Zip'; + } + print "ok $testnum$skip\n"; + } +} + +# pass on any Archive::Zip warning +if ($Image::ExifTool::ZIP::warnString) { + warn $Image::ExifTool::ZIP::warnString; +} + +# print module versions if anything failed +if ($failed) { + my $mod; + warn "\n"; + foreach $mod ('Archive::Zip', 'Compress::Raw::Zlib', 'IO::String') { + my $v; + if (eval "require $mod") { + my $var = $mod . '::VERSION'; + no strict 'refs'; + $v = $$var; + } + my $w = $v ? "version is $v" : 'is not installed'; + warn " ($mod $w)\n"; + } +} + +# end diff --git a/t/ZIP_2.out b/t/ZIP_2.out new file mode 100644 index 0000000..9f80dfb --- /dev/null +++ b/t/ZIP_2.out @@ -0,0 +1,19 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: ZIP.zip +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 167 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2008:09:04 10:47:13-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:46-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: ZIP +[File, File, Other] FileTypeExtension - File Type Extension: zip +[File, File, Other] MIMEType - MIME Type: application/zip +[ZIP, ZIP, Other] 2 - Zip Required Version: 10 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: None +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2008:08:28 09:54:46 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x6e17461a +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 19 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 19 +[ZIP, ZIP, Other] 15 - Zip File Name: test.txt diff --git a/t/ZIP_3.out b/t/ZIP_3.out new file mode 100644 index 0000000..2741f58 --- /dev/null +++ b/t/ZIP_3.out @@ -0,0 +1,18 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: ZIP.gz +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 71 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2009:11:05 11:15:47-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:46-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: GZIP +[File, File, Other] FileTypeExtension - File Type Extension: gz +[File, File, Other] MIMEType - MIME Type: application/x-gzip +[ZIP, ZIP, Other] 2 - Compression: Deflated +[ZIP, ZIP, Other] 3 - Flags: FileName, Comment +[ZIP, ZIP, Time] 4 - Modify Date: 2009:11:05 11:09:24-05:00 +[ZIP, ZIP, Other] 8 - Extra Flags: Maximum Compression +[ZIP, ZIP, Other] 9 - Operating System: Unix +[ZIP, ZIP, Other] 10 - Archived File Name: test.txt +[ZIP, ZIP, Other] 11 - Comment: This is a test comment diff --git a/t/ZIP_4.out b/t/ZIP_4.out new file mode 100644 index 0000000..ec1c2af --- /dev/null +++ b/t/ZIP_4.out @@ -0,0 +1,214 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: OOXML.docx +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 7.5 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2009:11:04 13:25:05-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:59-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: DOCX +[File, File, Other] FileTypeExtension - File Type Extension: docx +[File, File, Other] MIMEType - MIME Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document +[File, File, Preview] PreviewImage - Preview Image: (Binary data 251 bytes) +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 1980:01:01 00:00:00 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x815b4431 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 362 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 1489 +[ZIP, ZIP, Other] 15 - Zip File Name: [Content_Types].xml +[ZIP, ZIP, Other] 2 - Zip Required Version: 10 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: None +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:01 06:40:40 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x00000000 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 0 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 0 +[ZIP, ZIP, Other] 15 - Zip File Name: _rels/ +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 1980:01:01 00:00:00 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x71b69487 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 270 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 882 +[ZIP, ZIP, Other] 15 - Zip File Name: _rels/.rels +[ZIP, ZIP, Other] 2 - Zip Required Version: 10 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: None +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:01 07:04:16 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x00000000 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 0 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 0 +[ZIP, ZIP, Other] 15 - Zip File Name: docProps/ +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:01 07:04:16 +[ZIP, ZIP, Other] 7 - Zip CRC: 0xb1ed5172 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 522 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 1112 +[ZIP, ZIP, Other] 15 - Zip File Name: docProps/app.xml +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:01 06:55:46 +[ZIP, ZIP, Other] 7 - Zip CRC: 0xe4eea26b +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 424 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 868 +[ZIP, ZIP, Other] 15 - Zip File Name: docProps/core.xml +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:01 06:54:54 +[ZIP, ZIP, Other] 7 - Zip CRC: 0xf1594222 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 661 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 3775 +[ZIP, ZIP, Other] 15 - Zip File Name: docProps/custom.xml +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:01 06:45:46 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x20b43d22 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 125 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 251 +[ZIP, ZIP, Other] 15 - Zip File Name: docProps/thumbnail.jpeg +[ZIP, ZIP, Other] 2 - Zip Required Version: 10 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: None +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:01 06:50:22 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x00000000 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 0 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 0 +[ZIP, ZIP, Other] 15 - Zip File Name: word/ +[ZIP, ZIP, Other] 2 - Zip Required Version: 10 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: None +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:01 06:40:40 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x00000000 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 0 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 0 +[ZIP, ZIP, Other] 15 - Zip File Name: word/_rels/ +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 1980:01:01 00:00:00 +[ZIP, ZIP, Other] 7 - Zip CRC: 0xf13b554b +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 240 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 817 +[ZIP, ZIP, Other] 15 - Zip File Name: word/_rels/document.xml.rels +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 1980:01:01 00:00:00 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x00c8b869 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 506 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 1559 +[ZIP, ZIP, Other] 15 - Zip File Name: word/document.xml +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 1980:01:01 00:00:00 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x6caf2e0d +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 332 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 1291 +[ZIP, ZIP, Other] 15 - Zip File Name: word/fontTable.xml +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 1980:01:01 00:00:00 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x87432dcd +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 716 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 1659 +[ZIP, ZIP, Other] 15 - Zip File Name: word/settings.xml +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:01 06:43:48 +[ZIP, ZIP, Other] 7 - Zip CRC: 0xf1e58e0b +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 466 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 1214 +[ZIP, ZIP, Other] 15 - Zip File Name: word/styles.xml +[ZIP, ZIP, Other] 2 - Zip Required Version: 10 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: None +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:01 06:40:40 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x00000000 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 0 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 0 +[ZIP, ZIP, Other] 15 - Zip File Name: word/theme/ +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:01 06:44:54 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x6430416a +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 137 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 160 +[ZIP, ZIP, Other] 15 - Zip File Name: word/theme/theme1.xml +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 1980:01:01 00:00:00 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x69d759c3 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 192 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 276 +[ZIP, ZIP, Other] 15 - Zip File Name: word/webSettings.xml +[XML, XML, Document] Template - Template: Normal +[XML, XML, Document] TotalTime - Total Edit Time: 7 minutes +[XML, XML, Document] Pages - Pages: 1 +[XML, XML, Document] Words - Words: 7 +[XML, XML, Document] Characters - Characters: 42 +[XML, XML, Document] Application - Application: Microsoft Macintosh Word +[XML, XML, Document] DocSecurity - Doc Security: None +[XML, XML, Document] Lines - Lines: 7 +[XML, XML, Document] Paragraphs - Paragraphs: 4 +[XML, XML, Document] ScaleCrop - Scale Crop: No +[XML, XML, Document] HeadingPairs - Heading Pairs: Title, 1 +[XML, XML, Document] TitlesOfParts - Titles Of Parts: The document title +[XML, XML, Document] Manager - Manager: Manager: Self +[XML, XML, Document] Company - Company: Company - ExifTool +[XML, XML, Document] LinksUpToDate - Links Up To Date: No +[XML, XML, Document] CharactersWithSpaces - Characters With Spaces: 45 +[XML, XML, Document] SharedDoc - Shared Doc: No +[XML, XML, Document] HyperlinkBase - Hyperlink Base: the hyperlink base goes here! +[XML, XML, Document] HyperlinksChanged - Hyperlinks Changed: No +[XML, XML, Document] AppVersion - App Version: 12.0000 +[XML, XML, Document] keywords - Keywords: keyword 1, keyword 2, keyword 3 +[XML, XML, Author] lastModifiedBy - Last Modified By: Jeff +[XML, XML, Document] revision - Revision Number: 3 +[XML, XML, Time] created - Create Date: 2009:10:24 01:41:00Z +[XML, XML, Time] modified - Modify Date: 2009:10:24 01:48:00Z +[XML, XML, Document] category - Category: category goes here +[XML, XML, Document] CheckedBy - Checked By: Checked by +[XML, XML, Document] Client - Client: Client +[XML, XML, Time] DateCompleted - Date Completed: 2009:10:23 07:00:00Z +[XML, XML, Document] Department - Department: Department +[XML, XML, Document] Destination - Destination: Destination +[XML, XML, Document] Disposition - Disposition: Disposition +[XML, XML, Document] Division - Division: Division +[XML, XML, Document] DocumentNumber - Document Number: 35 +[XML, XML, Author] Editor - Editor: Editor +[XML, XML, Document] ForwardTo - Forward To: Forward to +[XML, XML, Document] Group - Group: Group +[XML, XML, Document] Language - Language: Language +[XML, XML, Document] Mailstop - Mailstop: Mailstop +[XML, XML, Document] Matter - Matter: Matter +[XML, XML, Document] Office - Office: Office +[XML, XML, Author] Owner - Owner: Owner +[XML, XML, Document] Project - Project: Project +[XML, XML, Document] Publisher - Publisher: Publisher +[XML, XML, Document] Purpose - Purpose: Purpose +[XML, XML, Document] ReceivedFrom - Received From: Received from +[XML, XML, Document] RecordedBy - Recorded By: Recorded by +[XML, XML, Time] RecordedDate - Recorded Date: 2009:10:20 07:00:00Z +[XML, XML, Document] Reference - Reference: Reference +[XML, XML, Document] Source - Source: Source +[XML, XML, Document] Status - Status: Status +[XML, XML, Document] TelephoneNumber - Telephone Number: 415-399-9921 +[XML, XML, Document] Typist - Typist: Typist +[XML, XML, Document] ACustomField - A Custom Field: A Custom field contents +[XMP, XMP-dc, Image] title - Title: The document title +[XMP, XMP-dc, Image] subject - Subject: the subject +[XMP, XMP-dc, Author] creator - Creator: Author: Jeff +[XMP, XMP-dc, Image] description - Description: here are my comments diff --git a/t/ZIP_5.out b/t/ZIP_5.out new file mode 100644 index 0000000..f216ed2 --- /dev/null +++ b/t/ZIP_5.out @@ -0,0 +1,136 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: CaptureOne.eip +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 5.4 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2009:11:04 08:41:15-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:16:59-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: EIP +[File, File, Other] FileTypeExtension - File Type Extension: eip +[File, File, Other] MIMEType - MIME Type: application/x-captureone +[File, File, Image] ExifByteOrder - Exif Byte Order: Little-endian (Intel, II) +[ZIP, ZIP, Other] 2 - Zip Required Version: 10 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: None +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:04:03 10:14:36 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x03b54756 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 576 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 576 +[ZIP, ZIP, Other] 15 - Zip File Name: 0.IIQ +[ZIP, ZIP, Other] 2 - Zip Required Version: 10 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: None +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:04:03 10:14:36 +[ZIP, ZIP, Other] 7 - Zip CRC: 0xff76e911 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 244 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 244 +[ZIP, ZIP, Other] 15 - Zip File Name: manifest.xml +[ZIP, ZIP, Other] 2 - Zip Required Version: 10 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: None +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:03 19:14:12 +[ZIP, ZIP, Other] 7 - Zip CRC: 0xb7f04729 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 130 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 130 +[ZIP, ZIP, Other] 15 - Zip File Name: manifest50.xml +[ZIP, ZIP, Other] 2 - Zip Required Version: 10 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: None +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:04:03 10:14:44 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x1ad000e6 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 460 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 460 +[ZIP, ZIP, Other] 15 - Zip File Name: CaptureOne/Settings45/0.IIQ.cos +[ZIP, ZIP, Other] 2 - Zip Required Version: 10 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: None +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:03 19:55:32 +[ZIP, ZIP, Other] 7 - Zip CRC: 0xc3481f07 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 3280 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 3280 +[ZIP, ZIP, Other] 15 - Zip File Name: CaptureOne/Settings50/0.IIQ.cos +[EXIF, IFD0, Image] 254 - Subfile Type: Full-resolution image +[EXIF, IFD0, Image] 256 - Image Width: 561 +[EXIF, IFD0, Image] 257 - Image Height: 420 +[EXIF, IFD0, Image] 258 - Bits Per Sample: 8 8 8 +[EXIF, IFD0, Image] 259 - Compression: Uncompressed +[EXIF, IFD0, Image] 262 - Photometric Interpretation: RGB +[EXIF, IFD0, Camera] 271 - Make: Phase One A/S +[EXIF, IFD0, Camera] 272 - Camera Model Name: P65+ +[EXIF, IFD0, Image] 273 - Strip Offsets: 32 +[EXIF, IFD0, Image] 277 - Samples Per Pixel: 3 +[EXIF, IFD0, Image] 278 - Rows Per Strip: 420 +[EXIF, IFD0, Image] 279 - Strip Byte Counts: 20 +[EXIF, IFD0, Image] 282 - X Resolution: 300 +[EXIF, IFD0, Image] 283 - Y Resolution: 300 +[EXIF, IFD0, Image] 284 - Planar Configuration: Chunky +[EXIF, IFD0, Image] 296 - Resolution Unit: inches +[EXIF, ExifIFD, Image] 33434 - Exposure Time: 1/15 +[EXIF, ExifIFD, Image] 34855 - ISO: 200 +[EXIF, ExifIFD, Image] 36864 - Exif Version: 0220 +[EXIF, ExifIFD, Time] 36867 - Date/Time Original: 2009:04:03 15:15:20 +[EXIF, ExifIFD, Time] 36868 - Create Date: 2009:04:03 15:15:20 +[EXIF, ExifIFD, Image] 37122 - Compressed Bits Per Pixel: 3 +[EXIF, ExifIFD, Image] 37377 - Shutter Speed Value: 1/15 +[EXIF, ExifIFD, Camera] 37384 - Light Source: Other +[EXIF, ExifIFD, Image] 40962 - Exif Image Width: 4490 +[EXIF, ExifIFD, Image] 40963 - Exif Image Height: 3364 +[EXIF, ExifIFD, Camera] 41987 - White Balance: Unknown (5) +[EXIF, ExifIFD, Image] 42016 - Image Unique ID: 00E058000066000C01010E13F5000951 +[XML, XML, Image] CompatibleVersion - Compatible Version: 13 +[XML, XML, Image] UUID - UUID: 133ACDE8-EF48-4978-9AED-5C6B4DDE9CBF +[XML, XML, Image] Version - Version: 13 +[XML, XML, Image] UUID - UUID: 43C0DD50-C6FE-4880-A275-7EA545CE1347 +[XML, XML, Image] Basic_Rating - Basic Rating: 3 +[XML, XML, Image] Color_tag_index - Color tag index: 4 +[XML, XML, Image] USMAmount - USM Amount: 140 +[XML, XML, Image] LensGeoAbr - Lens Geo Abr: 0.0,0.0000;26929.9,-2103.9001;53859.8,-16831.2012|0.0|0 +[XML, XML, Image] Rotation - Rotation: 0 +[XML, XML, Image] LensId - Lens Id: 1 +[XML, XML, Image] Shadow - Shadow: 0.000000;0.000000;0.000000;0.000000 +[XML, XML, Image] GCurve - G Curve: +[XML, XML, Image] WhiteBalance - White Balance: 1.391000;1.000000;1.474000 +[XML, XML, Image] Exposure - Exposure: 0 +[XML, XML, Image] LensOpticCenter - Lens Optic Center: 0.000000|0.000000 +[XML, XML, Image] Vignetting - Vignetting: 0.000000|0|0|1 +[XML, XML, Image] USMRadius - USM Radius: 1 +[XML, XML, Image] ShadowRecovery - Shadow Recovery: 0 +[XML, XML, Image] GCurveB - G Curve B: +[XML, XML, Image] LensTilt - Lens Tilt: 0 +[XML, XML, Image] USMThreshold - USM Threshold: 1 +[XML, XML, Image] FilmCurve - Film Curve: PhaseOneP65+-Film Standard.fcrv +[XML, XML, Image] CNRAmount - CNR Amount: 34 +[XML, XML, Image] LensShift - Lens Shift: 0 +[XML, XML, Image] GCurveG - G Curve G: +[XML, XML, Image] ICCProfile - ICC Profile: PhaseOneP65+-Flash.icm +[XML, XML, Image] Contrast - Contrast: 0 +[XML, XML, Image] BRAmount - BR Amount: 0 +[XML, XML, Image] LensTiltDirection - Lens Tilt Direction: 0 +[XML, XML, Image] Crop - Crop: 0.000000;0.000000;0.000000;0.000000 +[XML, XML, Image] NRAmount - NR Amount: 25 +[XML, XML, Image] ColorBalance - Color Balance: 1.000000;1.000000;1.000000;1.000000 +[XML, XML, Image] Highlight - Highlight: 1.000000;1.000000;1.000000;1.000000 +[XML, XML, Image] HighlightRecovery - Highlight Recovery: 0 +[XML, XML, Image] LensShiftDirection - Lens Shift Direction: 0 +[XML, XML, Image] Midtone - Midtone: 0.000000;0.000000;0.000000;0.000000 +[XML, XML, Image] LensOpticCenterEnabled - Lens Optic Center Enabled: 0 +[XML, XML, Image] TargetShadow - Target Shadow: 0.000000;0.000000;0.000000;0.000000 +[XML, XML, Image] CleanLongExposureAmount - Clean Long Exposure Amount: 0 +[XML, XML, Image] Clarity - Clarity: 0.000000 +[XML, XML, Image] Brightness - Brightness: 0 +[XML, XML, Image] LensRadialBlur - Lens Radial Blur: 33662.4,9.4255|33662.4,7.4057|0.0|0 +[XML, XML, Image] TargetEnable - Target Enable: 1 +[XML, XML, Image] Moire - Moire: 0.000000;8 +[XML, XML, Image] Saturation - Saturation: 0 +[XML, XML, Image] GCurveR - G Curve R: +[XML, XML, Image] ColorCorrections - Color Corrections: (Binary data 887 bytes) +[XML, XML, Image] PurpleFringing - Purple Fringing: 0 +[XML, XML, Image] TargetHighlight - Target Highlight: 1.000000;1.000000;1.000000;1.000000 +[XML, XML, Image] Rotation - Rotation: 90 +[XML, XML, Image] Crop - Crop: 2087.088867;1690.806274;3868.893555;3158.520264 +[XML, XML, Image] NRAmount - NR Amount: 18.59756112098694 +[XML, XML, Image] Rating - Rating: 3 +[Composite, Composite, Image] Exif-ImageSize - Image Size: 4490x3364 +[Composite, Composite, Image] Exif-Megapixels - Megapixels: 15.1 +[Composite, Composite, Image] Exif-ShutterSpeed - Shutter Speed: 1/15 diff --git a/t/ZIP_6.out b/t/ZIP_6.out new file mode 100644 index 0000000..e38d8ac --- /dev/null +++ b/t/ZIP_6.out @@ -0,0 +1,50 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 11.75 +[File, System, Other] FileName - File Name: iWork.numbers +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1359 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2009:11:11 14:40:00-05:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2019:10:31 14:56:46-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2019:10:29 08:21:01-04:00 +[File, System, Other] FilePermissions - File Permissions: rw-r--r-- +[File, File, Other] FileType - File Type: NUMBERS +[File, File, Other] FileTypeExtension - File Type Extension: numbers +[File, File, Other] MIMEType - MIME Type: application/x-iwork-numbers-sffnumbers +[File, File, Preview] PreviewImage - Preview Image: (Binary data 27 bytes) +[ZIP, ZIP, Other] 2 - Zip Required Version: 10 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: None +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:11 14:38:06 +[ZIP, ZIP, Other] 7 - Zip CRC: 0xfa4361e7 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 27 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 27 +[ZIP, ZIP, Other] 15 - Zip File Name: QuickLook/Thumbnail.jpg +[ZIP, ZIP, Other] 2 - Zip Required Version: 10 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: None +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:11 14:37:36 +[ZIP, ZIP, Other] 7 - Zip CRC: 0xb6fc7f5e +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 25 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 25 +[ZIP, ZIP, Other] 15 - Zip File Name: QuickLook/Preview.pdf +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:11 14:35:40 +[ZIP, ZIP, Other] 7 - Zip CRC: 0xe267fa27 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 238 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 643 +[ZIP, ZIP, Other] 15 - Zip File Name: buildVersionHistory.plist +[ZIP, ZIP, Other] 2 - Zip Required Version: 20 +[ZIP, ZIP, Other] 3 - Zip Bit Flag: 0 +[ZIP, ZIP, Other] 4 - Zip Compression: Deflated +[ZIP, ZIP, Time] 5 - Zip Modify Date: 2009:11:11 11:57:26 +[ZIP, ZIP, Other] 7 - Zip CRC: 0x02b8a153 +[ZIP, ZIP, Other] 9 - Zip Compressed Size: 451 +[ZIP, ZIP, Other] 11 - Zip Uncompressed Size: 1026 +[ZIP, ZIP, Other] 15 - Zip File Name: index.xml +[XML, XML, Document] projects - Projects: Project 1, Project 2 +[XML, XML, Author] authors - Author: Author Name +[XML, XML, Author] copyright - Copyright: (c) 2009 +[XML, XML, Document] title - Title: Doc Title, yo +[XML, XML, Document] keywords - Keywords: keyword1,keyword2,keyword3 +[XML, XML, Document] comment - Comment: Comments are a joy to behold. diff --git a/t/ZIP_7.out b/t/ZIP_7.out new file mode 100644 index 0000000..ccdca71 --- /dev/null +++ b/t/ZIP_7.out @@ -0,0 +1,29 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.42 +[File, System, Other] FileName - File Name: OpenDoc.ods +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 7.0 kB +[File, System, Time] FileModifyDate - File Modification Date/Time: 2010:05:13 10:39:54-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2022:06:01 14:17:00-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2021:10:31 20:34:50-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: ODS +[File, File, Other] FileTypeExtension - File Type Extension: ods +[File, File, Other] MIMEType - MIME Type: application/vnd.oasis.opendocument.spreadsheet +[File, File, Preview] PreviewPNG - Preview PNG: (Binary data 697 bytes) +[XMP, XMP-grddl, Unknown] grddl:transformation - Transformation: http://docs.oasis-open.org/office/1.2/xslt/odf2rdf.xsl +[XMP, XMP-meta, Unknown] meta:initial-creator - Initial-creator: IDHW IDHW Informatica +[XMP, XMP-meta, Unknown] meta:creation-date - Creation-date: 2010:04:19 11:16:49.13 +[XMP, XMP-dc, Image] title - Title: test +[XMP, XMP-dc, Image] subject - Subject: test +[XMP, XMP-dc, Image] description - Description: test +[XMP, XMP-meta, Unknown] meta:keyword - Keyword: test +[XMP, XMP-dc, Time] date - Date: 2010:04:19 11:18:04.30 +[XMP, XMP-dc, Author] creator - Creator: IDHW IDHW Informatica +[XMP, XMP-meta, Unknown] meta:editing-duration - Editing-duration: PT00H01M17S +[XMP, XMP-meta, Unknown] meta:editing-cycles - Editing-cycles: 1 +[XMP, XMP-meta, Unknown] meta:document-statisticTable-count - Document-statistic Table-count: 3 +[XMP, XMP-meta, Unknown] meta:document-statisticCell-count - Document-statistic Cell-count: 0 +[XMP, XMP-meta, Unknown] meta:document-statisticObject-count - Document-statistic Object-count: 0 +[XMP, XMP-meta, Unknown] meta:generator - Generator: OpenOffice.org/3.2$Win32 OpenOffice.org_project/320m12$Build-9483 +[XMP, XMP-meta, Unknown] meta:user-definedName - User-defined Name: License +[XMP, XMP-meta, Unknown] meta:user-defined - User-defined: test diff --git a/t/ZISRAW.t b/t/ZISRAW.t new file mode 100644 index 0000000..32e4100 --- /dev/null +++ b/t/ZISRAW.t @@ -0,0 +1,29 @@ +# Before "make install", this script should be runnable with "make test". +# After "make install" it should work as "perl t/ZISRAW.t". + +BEGIN { + $| = 1; print "1..2\n"; $Image::ExifTool::configFile = ''; + require './t/TestLib.pm'; t::TestLib->import(); +} +END {print "not ok 1\n" unless $loaded;} + +# test 1: Load the module(s) +use Image::ExifTool 'ImageInfo'; +use Image::ExifTool::ZISRAW; +$loaded = 1; +print "ok 1\n"; + +my $testname = 'ZISRAW'; +my $testnum = 1; + +# test 2: Extract information from ZISRAW.czi +{ + ++$testnum; + my $exifTool = new Image::ExifTool; + my $info = $exifTool->ImageInfo('t/images/ZISRAW.czi'); + print 'not ' unless check($exifTool, $info, $testname, $testnum); + print "ok $testnum\n"; +} + + +# end diff --git a/t/ZISRAW_2.out b/t/ZISRAW_2.out new file mode 100644 index 0000000..d66b1f2 --- /dev/null +++ b/t/ZISRAW_2.out @@ -0,0 +1,42 @@ +[ExifTool, ExifTool, ExifTool] ExifToolVersion - ExifTool Version Number: 12.28 +[File, System, Other] FileName - File Name: ZISRAW.czi +[File, System, Other] Directory - Directory: t/images +[File, System, Other] FileSize - File Size: 1856 bytes +[File, System, Time] FileModifyDate - File Modification Date/Time: 2020:08:07 09:52:14-04:00 +[File, System, Time] FileAccessDate - File Access Date/Time: 2021:04:30 09:16:33-04:00 +[File, System, Time] FileInodeChangeDate - File Inode Change Date/Time: 2020:08:10 09:43:20-04:00 +[File, System, Other] FilePermissions - File Permissions: -rw-r--r-- +[File, File, Other] FileType - File Type: CZI +[File, File, Other] FileTypeExtension - File Type Extension: czi +[File, File, Other] MIMEType - MIME Type: image/x-zeiss-czi +[File, File, Image] 32 - ZISRAW Version: 1.0 +[File, File, Image] 48 - Primary File GUID: 8fae1a521bc8714e97e12b82ec8fa652 +[File, File, Image] 64 - File GUID: 8fae1a521bc8714e97e12b82ec8fa652 +[XML, XML, Image] XML - XML: (Binary data 1003 bytes) +[XML, XML, Unknown] HardwareSettingMicroscopeId - Microscope Id: Microscope +[XML, XML, Unknown] HardwareSettingMicroscopeName - Microscope Name: Axio Observer.Z1 +[XML, XML, Unknown] HardwareSettingMicroscopeUniqueName - Microscope Unique Name: AquilaZ.Stand +[XML, XML, Unknown] HardwareSettingMicroscopeModel - Microscope Model: +[XML, XML, Unknown] HardwareSettingMicroscopeIsAvailable - Microscope Is Available: true +[XML, XML, Unknown] HardwareSettingMicroscopeIsBroken - Microscope Is Broken: false +[XML, XML, Unknown] HardwareSettingMicroscopeIsBrokenReason - Microscope Is Broken Reason: +[XML, XML, Unknown] HardwareSettingMicroscopeMotorization - Microscope Motorization: Motorized +[XML, XML, Unknown] HardwareSettingMicroscopeIsLightSource - Microscope Is Light Source: false +[XML, XML, Unknown] HardwareSettingMicroscopeIsLightSink - Microscope Is Light Sink: false +[XML, XML, Unknown] HardwareSettingMicroscopeStandSpecification - Microscope Stand Specification: Inverted +[XML, XML, Unknown] HardwareSettingMicroscopeDevicesDeviceRefId - Microscope Device Ref Id: MTBCameraAdapter_MTBSideportChanger_Left +[XML, XML, Unknown] HardwareSettingEyePieceId - Eye Piece Id: MTBEyePiece +[XML, XML, Unknown] HardwareSettingEyePieceName - Eye Piece Name: 10x Eyepiece SF23 +[XML, XML, Unknown] HardwareSettingEyePieceUniqueName - Eye Piece Unique Name: Eyepiece.10x_23 +[XML, XML, Unknown] HardwareSettingEyePieceModel - Eye Piece Model: +[XML, XML, Unknown] HardwareSettingEyePieceIsAvailable - Eye Piece Is Available: true +[XML, XML, Unknown] HardwareSettingEyePieceIsBroken - Eye Piece Is Broken: false +[XML, XML, Unknown] HardwareSettingEyePieceIsBrokenReason - Eye Piece Is Broken Reason: +[XML, XML, Unknown] HardwareSettingEyePieceMotorization - Eye Piece Motorization: None +[XML, XML, Unknown] HardwareSettingEyePieceIsLightSource - Eye Piece Is Light Source: false +[XML, XML, Unknown] HardwareSettingEyePieceIsLightSink - Eye Piece Is Light Sink: false +[XML, XML, Unknown] HardwareSettingEyePieceMagnification - Eye Piece Mag: 10 +[XML, XML, Unknown] HardwareSettingEyePieceTotalMagnification - Eye Piece Total Mag: 400 +[XML, XML, Unknown] HardwareSettingEyePieceDepthOfField - Eye Piece Depth Of Field: 0.487202380952381 +[XML, XML, Unknown] HardwareSettingEyePieceFieldOfView - Eye Piece Field Of View: 23 +[XML, XML, Unknown] HardwareSettingEyePieceTotalFieldOfView - Eye Piece Total Field Of View: 0.575 diff --git a/t/images/AFCP.jpg b/t/images/AFCP.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0014a669fb4d9a7d1ff3e768410d9e19de6b56fe GIT binary patch literal 1110 zcmeHG-AWuW6#kN_>r$7xBP%)(*tF=ZAc&6a_D)%MD-~}Rv{1Z}F&k~_I2mTL=y=^X z>I?M3hv?6v^kSNEE7lc!0O=Q!oP6h;?<5COd@p|C3mWyhH|Mn$7FvPd^n*3uVr{Ek zVyoZ1MgJ*~dC%jF`-_Wy$LD^h-&tMl*o2+-&QodkzTz9)D(rB`8&H=xE-7xX4?^$| zl}8NflQD1~F~v{R9AcFn7u)!XX7Qu@@!&NqRqF2z4toHZwzIi>(6csOveReQOF<c( z1xXlvi)ygG-rfj;O-83Mqfb6dVR#%~NJd|R1dKLN%|=PWMQ9lHFnuobOPvlGT|pyD zq)=hRRh*f0B#hE=#^?Z*lRQ$fmH2?#*yKi;$P!0*A(Y7(m8c0licOmTt#$@So0L(7 z>L(cv$N4cTB9%jBOJ}HLdXx$)VlX3glJnD4%E)S6VeZ|PIz7}n;@#cefE$_FjBC6S yVNza-U#7}PD}Icr%!EeLrLr9pc>nLYRlhrpt#X~@?jrv0&#?oy-wF6#zU>d9<amJq literal 0 HcmV?d00001 diff --git a/t/images/AIFF.aif b/t/images/AIFF.aif new file mode 100644 index 0000000000000000000000000000000000000000..97229105ce27b027abe6a05e8fd18ba6b3f00c64 GIT binary patch literal 290 zcmXAku};G<7=$k%P*tEv9ht07FaQlmh!HDo)QW~gl{+woV$w))ToSjCck0T<!*QWr z?)=|ppB={Y2=FfCGz^0{QULn!em{SDbe;FS%x=EYEfZ300$dN!c{<yTxaWG2(U{U7 zf9D^{+Cn&8JJH@I7iz-fBw6K!n55NKH<*s@1!p_z0Tte0F=OR9beX|4qG+moSwjVE z>msmbZEIbD^+4|*T3Tat>BuBLa0<85BCT9rJ19A0-F{NMZ48tm(nVI;&6*#9nm+@F f@Of4ONAPcHU-|rF+zp2htc_cL=|5i4Cwmru#yCF} literal 0 HcmV?d00001 diff --git a/t/images/APE.ape b/t/images/APE.ape new file mode 100644 index 0000000000000000000000000000000000000000..faaf72806c0872ff2068e7753e74770262277ef1 GIT binary patch literal 2166 zcmZuyXH-+!7Cs>XLV!RZV2q<CK^`DIfV3!tB2ADkq9z7%10j$|NKgbpVMKkx2mu9A z<49FXd=|Q3LFCDT5fNpi*vn8yMNm=5Tt;x-kN2H*_g(kf=ez6M`<%75FWr@NLIVJ6 z0004g{vTdScg>_Qc_(kh)Q!uW={XImBmhVVP+ksz0xZykqgyoqh(&R*kQK=T)~LnL ztq@BHs1_DBm_@<^;tL_*9t%Z^gaSS{Qe}~+3q{-n5%3YRIHKK<kcVC3V<W_Iz*Ue4 z2}$rCQZSStLNDfm1%g;oC?rha3i!a%(hOb}RJH$2`my35;0v+2ERrk47ePYJr7Twz zyO80Nd|8pvTs}nF#7%@07qj0L-eMjUA=u+Ua$|`gU}a}zV}()vUiCkI3^{NaA|nvy zu${>hC$dD_f0RHnCH=E+!M9n=t|%b?UH%McdT;dF2oP`s+3*7Lae#9ZNAi;3HZF9I z3R9B+OJ@rrAi%x>GYI)0_!*#;763=I8d@2xhQ*-K7_6qcI#yj>6Q>48tQt;3OB=7P zr9mJNi3EZkg+kFY_yL3p8m)p+QB_e<#j2{SVsTg)IPJfGpiRJOz`zl7m*MgFWx5M; zB9Tlck;y;w2J#yKhX($@ABms<1snp2L&$G~JlM7Z60vjzV7maNgiusQDj@#G0<i>` zL&0|jfmBdHqmatqJC0C50+b?7iL7Nw4`9Vpw3QE>qw2W`({nG~y#Kry|2|L>lz@X( z3P_~t(jhIh4~HaM!U8S&flD_jRF`zuAXILI#L7)R0MwAMDI5|9oWP$S%Tk(4qkBDX z;t(8;15noTvOY5HeS^Foa>%%i>v8Ag;>(P1-u^jC75njr%UD}?xEiTd+o0l6t1fLV zbr)U~?$(*ytcUHm88hYASzo5ncdwn*Co)_WHJ{nU@SCM^9RAcZCrpqfi7Sh3Oe;FP zU(ffxWZz{|lk4PQ(y!M#z+MjOn9YtF8HS&W%Kih)QtSnJdnKBCt_++1p6t2q#Blnc ze%d{qB82I1TXad`yAXqO2wJ6aVzumCPi82w3QNj(WSpCPa9?uMZeQu$JFU5HV`EZU zYn8d9Be$1w?AV0tBu_DOpv^UA<%!--OX3wtmuP;?bQ<QRDTs)V<z5ztm+rUNZd@08 zAw+5Daq^etmg`d8zq$L=kJ9h~yUiH4+&9&p9TeQgm!#&k`yD^h$X{b<avLa>N&zDL z+rcKzr9fA1LT7>M%$uyyiiX_Jo9We^bxGsf?ntx+!m^}-45Rs-(;<=3!$Xn6Eh`e= zeY7Ifj*4F-C7(=r$m51Y1r5~E%e&dK^~(beL8Hd?UL#kj^}3(5;>LfeGI2k6-PY51 z+T(eJjvRP5K3u&wyyf7uG_g;3w@cT>>4}tW&`w{CX&m$`2<;i___*mP<+H_`8YUwB zNr3a0Y(kV3J16`B@f|z$L4NhuJma>@LfL7Ru$<4d_a!Ms*Vb1bpgazxlI~X|y-J<Y zrlmD1dVkU#o~&bpTaSeG20h1LFiw%2OAZnhte`&9p~dM-m%XPhmjh98#Yj?9`5e=H zd)3$I68)BhFGo@)TQ6*+Ia_thN*Kr1<~UY9ZDROzojIYu!i^u8Y+o8tbhcA5Xa<>O z+hBjqWZu>O3~S|2ckI^(_w2so6Vf4WH?5hLGRWt%D(iQ$`QrX5o=?jp%d>X)t<BkO z&55ji^@H!94!eACV{hZ}qD5~d8`Zw~L@OWn;@D)LZQk|d)lU7^+H}w2t;B&h1E~yA z&f3<>;GB)WpkwkHXJpILo<(+Wv_k3=eG1u!XA|5>C?y62^&da{qBOp|f1q$jMn>Ms zLtYHUsKz2Mv?Pg5Qt0liw0Z3hFp7SGZUgu9rGcNcCc2Jxc|=*qY6rYfcO9yl*B$L( zdbIU@JevC`<jab$);hK^?WV(XZx{i;3Oid)|8{e5bEl%qQ1*P{SVve#N3W%d<58#c zPamJV=+QoR$WK=`qLDX5e2)>F>VAzb5Dcv=DlD>PuG&@c>Q2kL{PG>wIbMC|MNVap zJvy&_%D-iLUD)&o6n#JK4dGjUe|hiW_WJQQbyekr*)xSHS1UgJ`)gsU<(yseo;gnM z<bd(u*73K*w)hooq=_woH6Lv5wp?i`;PW?0d+yrmb-ulCu%Fs~@qrwaMiuVCj7@jV z-5cl+wBFW?SuUtf3jf1nS|@AD!{Jj$|M2smI(p?#rz#};XLfeod)JsJ#4l@zZI^y- zS0~zL?a;I{Ir2LD>E>Hwubi&Pn*7XWXixt2Xx4{wgkJ)mhj_|poP21N-hr`^^UaAf zV~+I`{3%_=&;7UzYc0dIvm#H;vEu7}h?<A-r$A{$!xr|aOh3~%o04A^!FRnTr7<?} z4*zPBV{DhHKeA@5$MLt)hg+h<hM3IF4Hp{<OvwE;r!p)i175H0l|4in&<cmx55fj# zvoZS``~jHg5u5v^SH=A|w65gpE9}}2+%+Si*bWrx0snGMi`iLnT2y-Nl-<r=?8Sg@ z=QYyLq}n9Z*86OWjw_iZyJx51xgowKnGIZ~lcew7hH@~sA+0j#WshU!^YB(@Rmj(c zBaS@Xo#Vx;He`~Evx@V}To^{)fv|bX;ww%5nC|Z$O!sgP>w#zGT6k11PJZX53Gf%x C2T;2J literal 0 HcmV?d00001 diff --git a/t/images/APE.mpc b/t/images/APE.mpc new file mode 100644 index 0000000000000000000000000000000000000000..54c26cba8e74e90d25be52caed35ee8e74de202c GIT binary patch literal 2513 zcmY*b2{_bS8$V+#V=#;@Y5NcPkZgm9xoM2az7I(?8s<M{VrKZy42dXi+gEP3;;K~E zvh}rDqeb%N;U+0JOZ#$Vxs|9C^ZiHk-QM#&XL+~td*5@O=Y2g~ZR7w-m|cuOF8~yP zwWS?k_*1`c$sjNU-Quwt7AVQ|g1s34=m1y{1zd&Z39ML1#D&cxSm@c`g9gA-;OXxM zB87ZDED!^VtAx)_gkpJ-VhIATV=%}7r~~>A9)}?m#y|{MBt|c@20#t?b9ph4I}3@2 z69I$f1Ar=^LNp;iRw#lIz@T~qpgX5zEP~t+m?cJSA$Oiw1Q-m|fhu5dc_JtZ5lUhK zV-p<!ML@Q)LSv!%0iX<ISMgAgG(XfeaSp#vqRhVxrwI7?n<;T*@qyD@=9al>TUwJc zR<z1Dv=TGVWFV}_XkaTpf7}GKkhyE{^9(mwfWUwr14oJxp@0{uJkO^hVjdc+7sBF* z6JR8ou)vRrknjOb7!M;5sxy}n+`McqMIkUE;t2)7+S&pgR%F$G3Vm6882G?!9t)zO zVZeySf|MtYkx2xQ4=a+(6Tpx+FCJEymwvbKltjZ3!X1u~E1FAS<6vWFgI5AT_8b0> z$Ap81AvOh}j$6W`CGjlrmLDNN=4kr<iQ8g(Y!s0GDSZkwJU4i302tI28y!G83W%<f z$mm3X0kX`YpFlbe2voK(0tW2sC<h}Q0KWp9qKwcPr;1a;sS@xw9G;+|rbbXx(;%v% zGeMQ8uBoN1rKzr`r?0Q4XJ}wxU}*e<Fv>WbGG19lSy_dkqNYM15>O&)%{kE0BdViB z)YDz0t*yOCS7xrSPa;7i(hqxM>2*NF0e|3+#TWoNA_hyuNN<506t)}|v+xB_xIkVJ zqo9P9!_1M4u|OzKUIWNsuyS%Zd92d+jAP`mKwg2UNYb>X2C(7`w3POoAsf0NX;~L; z+<R7}{XQ@|NJK=f<gi$kg-4R5kBB8%qXwGPJr`~mkX_PfLGoD<**31yexQm)K@qV; z;0*r$Seo2a!tHUtLBw!4jzCG%!}j2$=XKI<*fISUv764x(k?Y6dirN7mhaX+P|Di0 zm1e41WhWmezx=|c5;}4oNzfVhGbFU%*goOgQCF(od$*0%D>hjkHM_5o={rr~IR0&D zsW(Q-j$c+}XI|d!`D(W31^W)0oK!0X<Gww%0c)k8HoVD6J>BGULFs>hMe<r<&dzL& z9hZhI|4edUb8IMWz$o>uP65VzsFhos|1Q}042Du+7GG6!rh8wAekB1)e`uDKw0Boh zV}eiNo!c#0t|KFbl$J_MCnsKy!I2|lHNQtI?CWo(ZC`e*r^8zRQg)|!cI9L${)IV+ zh>PJ}l!TS+w%TG=8*?sLaqv;nm&Mj=Qt034UUhFN+5rg`%$s!YE2jp8x3r5>a@u^4 z9&8Y-G+BKMD3%lgOxU-*jhqXCG@hs<Pi5-$;kV`WS)cu=RUNg7qnmGMYYCCk#JqIV z*=>`-k=&udNMz%Z_;(*|^sc;>JWoveJ^4X2FE}cwzm{6o#jg2faln4~ty!JN@MUtH z?k7$D=x>#)>3gr)yPHkAJuBCd0?&pAD|Uu8@0~1+??vu(>bf{TE@T_GQCHv_27L2E zx(C}odLJ_QZ1uW29Fz7qVEva2y(k-YX4rlGckGn=xm90t%vvuZH7ArqGe1+_7bh27 z{iSM;!J`l|bgw+|Wy+KmCAC4p^ONq-cr7!`b~v;r=$ZC8v*heENkQVgCFF-X6uwd6 zqW9#*QXnoWA5Ls6n+dnvQu&ozY}73Jaxi(k<=h6!dYi7AV&;)mnNAf?8kt_5CyyB| zaTNq6tu2WtIMtyLG=)8EU%&S1>RH;_ldNS+Z?FA@(VcMHE4W?KW?ns6$RwRTTv4}; zEs*q0M0+)lv)r!?y|FvBxhbBtt8U=^lOdN6uI$ax(OmJH><y~lytqn7Jveq5r<!6P zzuacjawW~ZXp?^b>;4p`ICE7?1tW9AZ@BF_4O2CXQlCb)b2NkN;=S_O2c|`INM4Z% z!+l2&JTHkW>+8?onx3AsY`+InA*!Lk1DBo1hUB_BD(qhQ1H6K7plknKqr$*Xnq!@Z zI^CjdW3&REtI-B4XLaAUhr6}*ems=*F!;-oueLh&+uO{CW?nM`P9q)7C;qrG;Mbwx zGMF(NKhhrB-ri%a>~zTa?2|`l&bzhE?Dy5J8CK63)PIi`9`AaE%M%W+DabFd4__Wz z{_=M7n%uIj*Ek-%XT{E?kK8)0e#*URehq2-3+CQSeXaK`x38?{KwI5ttD1_EX!>M+ z^5yam|NfevVm;%Kv}1<TGv04Duxa#-erw#4R%mQvVD$&PJI$Ax^8^C#!tOivh8=J2 z8Sf^yoxd*yB~kf1@FSC*Gk5#@0&O=p;TH?562ty-o76cx;pX_My>IAQP%X7$>GASx z!BYo^uAM6_MRAMjW7-Nox2fsdAKt3ru=?Puj3<6KM_xK#s%iAKn4&!X*TZQq&Ot#j z`W})A(^1m?<%WAkhR-&|PmMU$jR_`nnZNcC(`_|PR!xiDHAafA^<t_Y#2p7E5%n9{ zZ)=S9`D7U6mPQC@R|_f3b<qb-ug)}c*k?4na-`eokCF!)xuJvM;ePe!>+@EV`l^qo zTa5?2TG3PU0BcOiA7tMT9hlC*@2d9)V60nW>6=!`|8Gcb@#U9<RUddOheHVM^78iu z7pt2sPLWch(ymN6Z0jMM5BPRgJ?&(Qo#;xP*Jduic$!4dNY>^B`xNi1=Y>0G_ugGs z24>c!Rs_B1cB*(5*0Np&_Hp4zB2RQ>dPG;5gp-O67v+|^FikxJQSb)yORDq{)t}Cw zy3s?s(OS6*E!FdtfBixQK!sGuRs@My{MZ;6;s_B))~cYr2L$sYU^aUrR|t6tgbAVr li=S2o7oKYZAnIIa@RJO!oK{wASP<G*z|caA^|J;>;eWU(q9_0W literal 0 HcmV?d00001 diff --git a/t/images/ASF.wmv b/t/images/ASF.wmv new file mode 100644 index 0000000000000000000000000000000000000000..044c4aa899e274344b90647207f54a69e1129f60 GIT binary patch literal 12379 zcmeHtWmuJ6x9(hY3DPAY9RgAUQi9ZyZX`rNQo2P#<OKmiN)V6^X%VEmOA!eHNeM}b zMN95yf$sgD_uJof&e`Y3`Qv=nd}fY&jxpxs;(EqCud|f8y|CybeDf9L1Jh5o2G_xP z!i3&1lv`P!2QcRb2w!c2wC;PkYGGF{MsWcJ&;`nX2WSBY=&=PVzy#O<^YdW=pa!g< zURNm71I_c&89ajO{7|-ldYz$C7gz&(@BnIg02fG(>KCFKa08|gqBYcO1tB{BKVZ`S zLra}=JQoPt0a_cG$RM4#!F4F}o<D-;EdYpqNy<YK_K*%2mQnm0%aAx1{!oLk%^-{2 ze#yYVC?#qwC4jo^AQxFeKs>+(I6|f6xdLaSXWzi(J92P20E5ARC-i``ac~=;qM#su zP(p)#=ve6JXlUp-n3xz?csO`?xH!1Dm+*-$U&1HE$Hl!&cA1cvgp`yNkAR$ljD&)S zgp>pc0z-vl(9p5b(XmM`;a(#7zfNaOfDj8(DGe3I08j{FsD!YyHb4iR4RlCbq{6=v z3<c5=0}~4y2N#-9ei@*^P*G9PP?1_gvwfg(fJTT;bd^^MgIL`Jlfj9E&p#?1i&46y znN*{HlZoHd`6)II894<d6*CJf8#{-9;0+;Rk(;+=WaZ=);CD2&v~_g#?&_O8Ft@O@ zvbJ$?b#wRdeB>4IS76Yy;E>Shn3u6}ui_IDGcvQX-{j=x<(IxME3c@ms;+5iZENr7 z?CS0r7##XCJTm%qY-V<D{`<n>(((#oYkOyRZ~x%uA<`}wK)o>QKP~%*U4)QbC}?P? zXqZU5U??6?MkPc;zsie2B&CjN;zZ2A=Z{4q9hF|vjLpceu}Ny`+>b-XBrwB_K$>=L z+5eegPya`j{ik97W!D(MLxn+`he`+}!2#VV;ZHj*?Kd)xO_$yAF*xGi`M+KmYutnx zIdqEO_|UA+5?mvu+0Oh!VZ&)LPW!5y7Jkx5tf$7q`iF)=!-^pU37z^g@SZEnOLlik zQ}SrE5`794Yn|yba5}#f&AwR0A`I&PjI(OGY5u8THk?)Jg%iohzSCG?UrU}l4)z{p z5#5-_H{~<%V;4c;X`$>aZtRogVd|<}bt$SWqNVQp^UNzsj-{!MOk+j^<!69@B%CTH zW0mcw0FrsTw9QC#2AupjUTDi`+{vZ8^T{pAXEoqJXFuo~-hQZg*hEG|JUNaeoz3n` zhoM>f@k}asX2_;lkC(qu#Ivlyjr&?5aU#-l1X%8p*{(MwpA_w`cHH#IoJ^ibqhr_} z9N8+?-E91ElqcP?;C91V;zm);eV)aURhdjxYa53<q>DxTUFQAw#)-t7>Z_^iT2Ugp zLc52}-&rwjq1hW8w3#bN%uy6)S)8OyY11n^CosK#l%VnWxSlh0NYcVi+}!koV{?#8 zEvn?5=E3yGqZ?X?5dAX{HRGlF+&0;}V9?%@6*e%z#yC~DqA_lSm3S2wc;$yKi<uos zs%Fb<jjr3Jm0-R_cd8+OR!+gE$$^T-9OE3Yv3&PLgZPygWuTI>jn+xHjNP<>OcC9B z<{8jwY~n=Kisd3%(`!ww!3kY)`0=)gE4H{Og`D0t_EC6e+WuQ({W2kGhPvZX*0I_| zCpazVm+*>by}<&xuS2&3Dc;g5%2{XAd#6XJ7P;-~w^t;EQ{NHtZwZJo9GjNr^T4;# zl^qN-NASMWLkoV-Hu+Rm%7N}Byoq(XT;E5E$q+@Dl*rzxLnLD(FH^l=rohvMl|sy& zl&0!q{~4&`P>c^#f{AP>RZvzvKbg^KAjU+{8J~XcKagyrLv#Hp;G@zpr}NG#%PRdP z8GYI%|KSFU1Dk>3aDizS<~ZpCoV6!@RJ+qyzJ0GG#D-tpemB%6L~Kx-DR39l)_gCC z_MqKUz{PN><~hY^s~c);*GeJ&B})ofjd}m>!1?E;vHkn1tqxB#ymd#I<Azlk)dzLg z!UbH=74BlJi+kyQN-g8g_RI5zH=GU(O>5T#5)q4qQH1#s(8ez8O$m$)SSGkVt_pin z5WnzXf<VnZDoR6CpnHMHu#zbz`r+cz_b=9F<{<@|3Hsdz_J^qsy8Jo1DDTRw*|@0R zdzJeb=P6oq4N81jIs=!)m?gvJpALLgx|%h4Eh-v+s-=qG>Qpbrdd#!e=kXDvr^-}o zi@HrE2VP|~Iocjg$-QlREJW_0_6pOUc)*Ng%Ml%}UOHLN6}A;Vzni;8qOJXtybjkm zEd4_ZEZy*QY<l=q0N5pU7gt%CX>-g~9}Jy$mdLpNJv<{^cJm~fWgrx5j$%X4Yb0>S zs#{MtRpm?nU8_oddh2=iY2h<KRqvJ!!=L8;;Px#nb)bkd;f{{G7<F3%u})x9u;e}7 zB;8&KflZ|`f>6Bv&gZz%8g6Qi{1awT#-3AF8J<QJ$*oV{0?B00XB`9}S))H?>RMN| z7!khBas%9O8{v9Vcw^{5zJpxXbnh`~RgGtQd^{DLvWhjgkKR|%|E*0W-!kH5WLxX^ z*jvrL?kVDxaU(hjg!6&3b`jVjxN9%!9|jFg!7aA3wdEKWjH=LfdOgJ5B+Lt}Tx=Du zq`=p$vduXZ#0ZC@pQ5~Zy0$iIhSxYLh)$B&Fsm|7w!ut{HU367>R`||vb^m9-b|2c z_N|-uhu?-Kz&}aW!V6felIIilSi%tj@&{~jQ}pjE4JMuSTpaGtp>oj*iJUI=%^7n( z)XBL!<RFL{&QM()yI?}m5@ZSoUM`xCA{<w*eH!S}^8V=TrS(@NCrPz-R3MIeTG^MR z*O}4_EQXi8bS7-bNDc4L=C5AQFHnt0^;ap4%6czn*4-=e(87y1cIQSMy{&tknujIj zUU7*8ra?Dr;EpJpuio5WWXBI@6<QKT!nUUxx(?K5pNI4HaN6-Gzt*l(h~~w^QJ^hU zSmLnU;H2>s`tfGma;S#x*?bDt&&ly@cPjkX=2>}<yNBtsPSy*3B+6$G3EGV>FEKNH z*}?u%H1xd^wpIL=KXJ#Pk<@A|_AeqSCp(|Q$#<8>3Y&xbL=&XCaQNVR`){?W`In4b z=hkCv{7B!jRwsUd_s_f#V7_+-)L-=kK04iZ*~yQxxyiNL#xU2Z#&wj0wWfe29^^Gb zH+ynJFM7<3fyr5-vn~O*)aSA*%_e6I!moAG=BN!Jo3rX{GllO4w@fD0?!R%oqLp^F z5+C0Y-F+~ktTC!tLj_yN=dtm&_z9PR>IAh;WkUtyslhvW<8+p4Niy!&IM*U_zsmS- z@;C=b7P%N>Nq_?jYPZxjs!J&)?9F$}(fMnOP2o&byELjZe*UgYw01l#HR2)k80_Y> z3N$r3&I(R1s|&p`5sSA5i;q<XN5$)#W1gCs-*4L!mdI#$glK;+<r%3&d5@VMbAC~r z-`MhW=oD*!PR^jf?&j2#mErO5W-ubsDY|OIaPi0VCSz-gME`5Uk+qn+k>m<R>!mu^ zb5hO#@8M37nLyej&6b`wR|n-=E7?meP}ApKR@HR}B%yzTKc+ETsMq-05`o!_k4d6n zaP;(pB)lKpD_IZ1&VcKSFWYX0`q4FFhePJlnK|O0H8h6e5Fsqu;+NE)>bf(6n5Mpg zN^fzBM9NGehC3hAZ__H@4P;ClG|ea=kkUN3`4K)#Vu%Oy5bER~e?Csef5o9uHF;z4 zQy3#%vit(a;qiyWmTK8D4un#E6N*-fJSmY4af5qr*xuw5wvyL|pO)SiENFX<<Sx>d zhwoKqhO0j?H(nnOtov>r4bN^eDU*0q*d70<H=tTdSfU*6aiy$0!BVNL>I+Y1WvDv! z4Ml~uKv`7g_(Q;NY;eqoC>zu9rwMwU54YN$$}UO9dj3dqtN#Tya9eFEj`e2EGq65< z`E;42-G$iTmCIIVZ6@9QTYVJ|CmJs43yj&nHz|;2WEarAuApb<woclK<}^AGZCEMP z+MPFclrs2srGclU-|fxN<gOj<m`<qPoEwku5~ca~3cPib2|TBJt$yi+Q)mNgb&}Vp zRElxrx$4_X8LEVvDLWli?;Z3y>WBBNG|*I(R0hrt=qMzvtJNyD(ZIE6wqK~GHGT5j zfB0(CsQ8({e8~4?IxN}JSMJWfM(K~uMzT#rT<*3VDv1lXE2ikyHx{qvWuBzsSH2m8 zbEV|&tIO4Ho6fm>d$4(9%Lk#eX1ihUemj5kwGT7?oJANFylaVxG0<2WEoNdaAZjL+ zWYo$<o~9w&11+X9&UXE+hMe2!-setx@zu|+tJw|I#*1OYIGF(@qf2=O@Fo5u9ns-& zJkzf($3}iQ0XnbkN+Ns_FET2M>$t=1%>(&TI#Y{WUd08Ck;_X8skx+Z>XPl6ea}H( zr^Q8Vs8Br%<jM4DmL_s)V!fg(bVPV>c{$sr#y3qLGjuH&j<JjOgirKapjd>e*V-xj z!fyCew0Om4$|kzS#5sveW6d+ul*+cla5uco__nJh+dPb@4I;<v+3TZQ*_@^%VRQ#< zFY-)sy!i)qI7R&hh*vpXFpqE;eCC#`8}*NO1b6(_B4)eY&H%CXq5id}eRo2l?tb#9 zc8EU#IFdL&J1U=+ig~-KS{pS+#&VT4$fR#lyy(ctX~peh=%n~S`}FO|=Wi;XzE|-q zgzA{WG`vs;YWz?PLyqNCCJ5MOt15KDLxu40v5Gd(CVV2=;%X0w%q4l-h2;j629w7+ z?6ZlA`cOB3s-X5PhibO66MKAt5H|+@o#%`9iNjLLY9h;JZIm>7V$G%^QB>Gq<v$wV z69kjP5!qkLa`s)u*Ky>WdptWA?+JJ5)E4`11)s7m*?7U(Z>RjkJm$F9F=Wi8P&skJ zyt$=k)o|&H+nPB^GflNm(O^Uk=3MAjJ%=%k=fc40oKi?pW7!8(0giW_?}uE+2Xj|L ze|TG3-l)#9@*+|}NV%~rqlAUQI^_M*b4DkM0w;HbDlMi}D;-#{iki^BIP#B#ja<>J z|GKN;x-v8$Q+m5><FC0^-mHPuxHY~fQ-(4Db(;pPse|SA%MI*9$GpxlkG72Rzmu@s z@{V-c_V||CQ6mX6(tk*PE$)zyxdKK`+^}!5^9@foePs+I^+uve_12Vlwa6{d=_pF) z<;D~joR{x@GH7uI{Er>TirzeWp9ags>k(#5U-IEU)FquOChp*7FtCJOS+@lDxrAhD zti8p#CgQfoWv@h#)~~XVnWGjro&o)LWsUfqv(pp?20gQioB~H$h^tLbNepzh^K^zf zA>B*~9XalfV};HSh5UPRvDyt%s*Hy$Nf-3@(kgs;2DnT=%DzQo!k8z+WMpV~j!1cy zbr8@=buT=tou=^B6(edl96YSFTEfwoK+LIk4SWYKt%L2E2IHd!<2F=2^Qy!xuO9#* z4uuuoPpZ3bVqfbrI5yV%MEIWp>mwdUgNn$jM0{non2wx_CxxAW$OlvZ2y?G!bEz6b z`#BfcGXEgO{_*O99rqL`m(8a=6~=J?mu9)0EM<WwucMbd58}tlQ#BK!u^B*}t$z&} znniH7mElcZ9h!D8%eGqCAps+@g^z_j8w^3JX~M;Po{20RAD-f0BAH*LHA~4N6>$zW zzNQxq7g@+AfAL<HBeIwhFAL9^gQ#K1Zm)>j+*DT_T^YNBe=NhD0@bR|aG=fCR;~AP zCsU<BzVo-EK~+s@x_Avjrs<WTqs0Er7j>tU2$tl$wC;*{5!%dp%PvXRl%M%KsO}z; z@MH41TEEN7`bOWZ!XD!m5GN%)c0U6+$~=Z;BRREtTtkzJ?8-f!w5OvB4J-#H2<OEX zaChR)!q9Q<gbAk2?gpl}qB5#6IU3`5H@zFT@9mVdGjMa!b=}JqaU<IHNK;yGhguts zr6t@!9VdSC#HJ!$d^*G}*frhpyZxe~)i67ju<(?lIEKo@u5!ueI)}+m;lz~8VOKpf zBE4Jb`a<^_zXrJ@XojX(>nozi*d~kY$kbbDarshCQ<Fv6ILq8rD$8xym%PZ^pU=%0 zqjlp^%Vw9(vPHTir#p&oaxAt)V06y(VRRQva?0n~_*=gIDAp1G)9e_wIFZ<WP;kGI zP|RZ{;!<IYsKUbOV7=bywmfA^-rhC8+eYrSvxL5k{kB2OQGqqEV-exLZ+td}HSmy% z-5=%$)Gd2ky@dxUiv;2yC^90?0GeWx`mPA;=1#E~!e}B+UhNC1QpT24PK%c1{Rx=u z<C4yqdoi<pgxt^2BxnZB&|h97%-=U_>f09V@QnL3Y-f3AfJ;x&AxFj{_Sw}5N9@BA z*3H5}T@}%cmx=B^s*#d5wSNt`vNN24xP6s(?0xoyepe4ix)mL&_}M>+>eio*(sC** z&T?9-MVbx7e2BzPaXIe&c`0+dn6T_t#W&iVn9$wpn`MG4o_Z@uUy^IAEDY}%;_9v8 z6%OYv$o#dV!-y8zRx_w#@X))nr08pg+Io*~tZW96s9l%CZT&5-sIE6ti(*ab^iQ!? zl_x`o8%y|TR<56P7FpPJ4p%c(8zt0u=wrBOuyxMqG?wZ;xxKfOw(P>AMAuOsOZ7Y* zp78?X;m8@Vko@|*ovz#?g2$V6hWdn2b*OOXr=SSa@S8X`C2J<9NIa)54-4&YPp%V4 zG^maFv@Gr`$yW;Q5gZd8&AtiT)SMFvKUSR;mscIUTCr)4sCcf~@Z#e=!)wD^%yst1 zlyoKlsA7WI{3O!pvVLaPecAGZC{`{KAv>P>tVf+sBu!I;{RkUqkMAJdYM1p@UT^NM zn|#R_T8L$d)+0=@O2?)SGRF<5%KgA2?zFuWo@L8+%?I6g=veb4(-(Kto8=&9#t+kT zu%#FC`7vwJLB>pDdD?cWW(`)J4e;A-qr?vWeyaTqzbXamAp4t$1o_<qXJfhp?)@ge z&3psZ$z0DkT!Zd%5x!}Qo6<dza$Wq}<<&2v13sG7ibW(|cky8;JKfS;I0N13<}0-Y zD@hguMh|wk>O}mu?iw9Re437;a*u!Q!r{Q0D_)@Sb$zG2w>Dv|yYK6~SVVg9;2FU7 z?U%qC@V)B$aZI9ou3qq%G3Nk(O!T>n?|bV*--;6Sr;2Sl9MN)GCRvnWNyl|j+pO)q ztg|`o4~tPfE!&NW>(~+0+ST=SWH-j-(j5wntxG83(FV_R&4fd$9t3|HMVD(E4_qzy zpj<UBGuD`uxILmc{$6E4;Ac+$)CW~<zuN4hNw4(-o;@|hOY$k~={=UgV|e<w=d(5U zQqhyRF?$^mRE7wlfUUPP8^$iyQ`CcX)HBpv;;bP>cIoJ50bcQaZl*naQ&|t_^w-P$ zu*a>Yur|3PO#I9qv4qTg;NtpN`I*T-BMgO7F(BoHv#t_>9vIl0J-ruR$3qZQmu<!u zUOG>c?7L5Ma|HcC(n4{D{Z!)kroyfjyoJzxxaYKn7FV+MA=;L=kyvleLAc$RFgG@{ z1{vMTq_YtIY1$AS?%FOFk8IV5w`$&)&8vn7A=X@l7-+mZ(`C_$#8F9eG@O$=jik6o zemFL`#my$>sCV2H-WC(_Uu7*QxNOXrbFW;tl~!bswPN#8=@&cK6Vx^R(24P~0xB%2 zC=-1A8^zMFruoM@-g&lA{OdHRw1`u*cvaV-6(N>7v+-0=HTdvFX6{!-2h!HttfS#` zd<A%c*1{T(p9n7}w)Be;<XTG-h*{4m&c9&W5xu+4oms`Cpo3<?`xf@WJ1ZsW-P^@) z`)!YL34(p;X&+o(PPBL>6n9Vi1%pgT32ZqI#}U&+Pm<Qp>I?)$dP^R}d^@4;@TEzz znIihK3pXma(!cG)rWM+caRzpu@ez~rv}}r&lYGk|-81-E(AX{6q*9nSR93NY=L|R> zk4XwPu$=Zv+>Dtk4ipn|@yS|E%!!D*WT5m#p!$1shv$0In$H^5JMCt!tt7TSK?l8) z@ZClNPrr7r^%4YXbD~_}OylLsARa+%I`ssmdc6TTy<uu0=gdb&?eZVP$I(t0kNA&$ z5ByAy1eY545cYXFIc<%94c8>UdS=VLVWt=^#ZA0VZN}=7PtLv-P{#7G#~U4C(CQ`s zgLPJs#+iq}v$D-2MS{Gub?p1`vRLqNNr21u@rm2Kuz*YB74u2+JG<XKMOq{+rUlvC z<rgv^|7_^mWVFr}aci8WsAOIG{_v6E&oeOR(WFXrjEkU6ezO|0d>B}fmvcMcy5>zR zf4B8xJGP!~N>}-B^Ot*a7~f#A_9oIi!$doLQNBD)BXQF+V6HgyTDh{#v}%d6L<<df ztIELr>tkQ_+wi+G(GyCdJFk6oo^%AX&hL_(c~ce=RgHD`jTL{6`|%m*8<ZaXDBfyl z*8#_01@Ammu&0R56z^Kq=b_NteN)vWs$1-(Q^jgp#~IlurGw@>q<$}-nn`9ZN8j_w z^=9Kwp&W(5wQ@#3col`i%{0j4Y<*+7YVODQ`wxV2eoSrats%SmJ;b2~!-MwAzTYwN z{tUraSI#p)Gi|_cbdP|$zhe6eIGH&`EH0sw=#pCeh#GkYujng48_=H;`xp`F4DV+0 ziby{Z&U3@<=E3o=j&*EzYTiG#%BTwwO*z(%((vRKjMYvmb7%j+5N1!)ZnB~uJ`%jE zx6{iv%A8#Fa|@><%@uQeER<8AT(<tT*y}lm2-5@6&1ju>Rpd9PYF#*_7{ho)I39Fn zJW)7|&_CWCVtQDOe>cm*HqKs=$Qhmyy1)7P4*9zGFrTvve24MX#x=96x^ah^`WmqD zFST>oB)XcynDV8g58f_FhVxmcm_?)H{SZ}`rIqFscpxOUSivF5^#N8kuP&?n%!lCY z>y>lPM-F1RWPl?0S8nMF#3&(|rR#rt^Me}@<0JsFCKr6yZ)p{X5Hg3@Fl0t1vR^V6 z+!PW4`2c_i;1DmS1Ehfl)ItFe2?3RCKnl`A4k$tLCg35&wMjz^lo?brhqx#;sLvYW zqmV2c?3_<)G6G;W3V`cw00>_LpsN^wMic-dX937X0=B?FGgLguLj{IVd0iJBNJ1rj zIws(R%1B0BKm(PxqzM2iR5lrs0s`bXE<M0T_A4p@RH%Fs7k{oF(JzhZAzdys1kgAd zh==$@+H+kkAYKs3_0dC?xS!W9$g+!h!uU8KeWD;tKCh4P#XM-jqt`UIg7A^4?VYvp zKH62qcxkzh+0vtf1zH&A{ofvoj}g_k!5~uSJT>W(i6SeXPbWo?WiT=Fjr1V^p6C}j z+5>=c)J9`&<T`T~>(CRPPXmMlg9SCn{)LNv46t<>fIPX|-rqKk6-(JgB&MVc1Ccw6 zOeg>kNgQ%PET1XV{MB$f--DM|7-iyL_QTVqXoyv09koi&B`!1p(0RcC5b!TPQ5o{Z z18Db5AV$y@db>c68sw)7IuXgL!lBa#K>hXj@%J|iR6~WR5{&)!6_Jp9|63$Y2;J<Q z3w;1#{}&nsiW4qg*gg4T7bU5tu7giT&k-zt$^MW}HO4omL(}M{Lc&7{1-A0xpuO0@ zL*XyW{4kkAr5^oX-bU^L3_7hS=l=csnMKOM&i?|Cb7UY5+#zespz`*)CKvoLk}S19 z@701v>>$DvX}v2{2hb_!LxLcE{NLas6+k)1hlt1j5&kVm4yhye`5FDa6G(nn3c}NX z^!$B_H6VR1&Mk7Ykv0H8U~nNV@NcF6*AxEVVW^M;;5vjsG2MeLn^luo@F6aLsqhjK z_fPucfj=Jj<AFaO_~U^;9{A&dKOXqwfj=Jj<AFaO`2XpF57`SO&K-QW0}}GAH82eH z_5O`AY|tI7D%^{~zt_{DU<on~0fU~;Uw_9C0Qe{F#hvAU1s8$jkuefvLdH~n$2Oip zu?u7z1_i?9ymm2;Tt)3=eTQEVCOjas^U>8x{vzbs0MJk6e<k-$QmtbP)Sir=&0sn2 z{pahJMt=|u?`OiyEa*-+s>0skuL)BB=tp9roZl1w`#o=Z=qvhnL<1S?aXXK0An%Eb zK;PTEkPH)4=YwKh^icH56#DLW0oTrZ_|AJ2fY*83<vbREyqArX<%I$*j=!QK^w9VD z@93BbbU~R8ilqE|4RoL}WYq0K19~W$^81=LJrtKf#u;ExMgzJ!YJ5?c6P1;JivT%8 zBgk|s#ri<mppP*31UxY|l;KqCZEcJ&=_7nz3f-wMo25UW1ig@#=dqv+1NTqcfe8!+ zFz5i#4h788Q7;2%cc4HHIS9muW~8I0qe2V+bH!J`pqe%)>;AqX&^@Bp{+kBBra{(R zq>KGcgBsB7a)2TMB%tDV6NcO*$ULa)UlJ>%3qi{%rlawbCr}mtG8#>@_mfX<2am($ b`U%6Ig8Q$!GfICS6y!0JRzq&P8YK81>H%#W literal 0 HcmV?d00001 diff --git a/t/images/Apple.jpg b/t/images/Apple.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fdf12ecb3c9c3616da8f375e1f1f1c2e6c4fd81d GIT binary patch literal 2355 zcmaJ?du)?c6#t#CT_1a}wHtdvC=<E?GTO40ZM+1As5n5_5C}2pw!$hcEN(-lNDLa? zA0&>(7{nPD7>N>;i1?Vn2ufl?3^Afc;15DD3I_ELqsB+9zkA#7>kNeZ_4fR}bI&>V zeCKg*>f6*+S9tlZ*cPC*6*B?2kSB#Oh#Z_rDbm<Yd_cUgkqRG3C2}+d4oQ`Tk4kMu zh885Kb)A$uAt8-Rh(9!nvv!`3!Je^mesH>p9eV)h$t68K@hD<zx_4}k`sPszxGy8C zX)sV1s0#t1Krq}KXlf2M`htzk`~?~S-`<0!S4P|3S1r7GusZAEU`+<s0z=%A*6o2% zC^%#@y*0Xq>=xd&U(zyS*cck*roA!tB@N5|i%FZsA5PjWJeqW7_F~+U?hGy>&b4%p zB}+7)5iw3CcdNZ@PY|C<?$<up8-sI^OlI+j>2oj;7?HHiR0<d|%t#iV9<iA??~6la znSGg^!|87kCKIDZhOe+~9L~w$N#r}m@k82Y`soOd&ei^~S{&;~>ou+>-b_<!DDx`o zs)BNEm#N$F_*plp`ZddO2UGGV?e#JaEwrJAs=pUVyPQ{YesH~!6VjF9i>+SA1=jHd zN~rzR-YR>HqftkEieI2|+|BnNxnjx)zsAIGv+hkiMrjiZJ45B09bj9Fe2p1J+oLG3 zWJ<WRDGwA{*g%nmh0!o&R0pA>Cm!qV3j|hs3~Z9M@*G;Q3eE7d*cTv#0nEm3RLLM3 z@R1xt3~h*F80)bNjo5(4QIAVlCNqqg^0LIS5G&A%FL53{)Silscn<^8EhqRqg#hh_ zsJ96hu}c2JH@J!l>5>Ozk326^QH5&C)S?~Tl8|R)rR<h^X_YZPE7<fE@M1bX#~=6& z^JJ@RmnS7GemN;|IVxW2d*Q*mD3<S$FDGyVDJ+lyIWEIuGYYBiVURj7B=^cNu49AD zl859aX_ITRPKxzvJ}ObjT`yq_moZIBq(W|@MrtJwc?`UpA>W23>RiV!aLXt3<tEPH zQ@!S<OaV$UQSOoNuvF^AMlTO@-6?J+QKdHz#Vm#nImtM^iH-6r-p3=1UM>^v;LM|s zv++89rris;LJzKChE&qO0<O7qDNJCDUc)~)B^#(;FD`jdN|{`bPPQtRLgwfvR5EU# z$xfLs3mLyMlvBpb$IT*Au{?saQYsf@udGouriY;_R}GV<-(cjM)$$dOAbXC(>1y8+ zk8JI2-x-PbN86)4J36~J_Qev>-p)uoT11C2?d}=(?|Z8V-uVa5!R0BNeAnzbjm>F; zy7?7U6*+z^PNn`{#x7h<<~HDiS5m3p`+@v1zAxu|n)7(ty>urM>y9K}*;19Q>Hp7g zUq_^Ko3AsHh&~qa&8=%{N+f(+<^<~+Rkw&fJB(FSB~ljHYtBagv(I2WtoU||zlKOf zCmkV&<`X-+nLbmuhauLwE0u16B{RqrX?~mHdo2DC)05?wTl@o<toeDgKY}S1|Cmze z;B}+@C{5GSGo)P^p7O6MjopgJ+3+vv$DE!t-=w8C((C+J_KdP~Bs}@kG<#0!^&?uw zA?9h#^EZ1ZyNv9e?8=pKcQPx>t~KHE8rCfVp6`0-dzDDj1ugxF#DK4_yFbyfJraxi zVu{GssIM#17g?0LjAv0&R8--us3|L}3Hhh^Lv?<Rx<w6YENWSzN6VdtOsuHzP4fB6 z%l%=$&mV3H&zcpc!qSGNcT&r)rB1`6y3u8mY8W1|c_eifD`C}j=Ck0qg@dAW<(Lwr Xo?AGnOUSn|6CRrfi}4Poq%QskgE}mP literal 0 HcmV?d00001 diff --git a/t/images/Audible.aa b/t/images/Audible.aa new file mode 100644 index 0000000000000000000000000000000000000000..3891f12d13bc2647a513f56826e29b3a7c7a561f GIT binary patch literal 1322 zcmZWo|4-9E6fepYL5Gl-puyyfi2(wpU$$#2#$<z;3B)WiP=9K!?a^K6dd>BU_P_8? z@Xzqi^WKe-3v2e)*ZaJ$pZCtPT6^FB)Y!7Dr%H^cwWmIol>Ak)rR0H<f0niUL%km= znLo>OMZH^w{>acD8~Tc&KQZ)GLtj&&o~!RyP{D0|2CUU>_y?yKrQm6u$cUx=)2Mgc zKZ_jK>vS=Rrlse(U<ZlXB@wh(Gy@z8??@(dI;NHUfW{M6A@!3Jiu5t!SNbDn8Hzc- zMmrY;i3LkDn(jgbXm_2|a>B)E!g5xk6Eq~^hBkmg(;KSJ8<tWr_|2}yoaYE~p)(fG zEj9}x1d&{P<uOkim5@mE1zi{X7nneitx~XrhQa%=3r9fgT3N>_k<<<jdZTX#uI*?@ zacFI)v`PdkCF6zJlJ3C3AQbTZCg(*K8Gz{o*sOQM06c+QKjCE~ST>RG-a0rugevyY zJthv(&S)19bVtFcj&oK`sDMCF^2<swC?ie!IjCq1V`&x$Z!6<fRz)Ps1kDJvnD9KO z31|=vIA7Os7B>TMO=rSWn%u1ktkdd{5;dfAO4HdI`9Wxd{W|yzibOP}q-j6r$#tdn z%yj?+4)$iAr?i<lhQ8w?Cv@$u?_meozT@I<U^@Zo1S+U!cWoUQZr)0+##&S~Qf$b1 zUI+{mUOF0GjGL0`OwZt8Zk_PDkop*c?D#Zx!+<1?=LWbFV08=ZLC^1FKeX}Z0d~UP z5f1$UwvQbTd-lM`x`IvRym@;)4E|w1-38(y)Bdforq^5&eK5Z)Goyt7FuArdwuSL1 z+yW!m><Csnsw5He-hyu^i`TPijfFIe(I7HF2n;iB*A*2J$r-86PER_+<DY@=4$m)7 X6sEXnZGBAZ>9j#?N-~O61?1CzUeGiH literal 0 HcmV?d00001 diff --git a/t/images/BMP.bmp b/t/images/BMP.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cf101e49d5ea8cfe4ab2c9644a66510008db267e GIT binary patch literal 1142 zcmb`_yKNg$5CzZ?pg@2lLLD$tK7eDxVCs-9ObOl=*uu2H7TCgTfi19w^%=?~P>UmS zFW=|x=l7q#@A3Tm>GR9CkN@7D-y(iF|NQYS-kh-Sdn}qF5yrmcG(}=y>@BA$5|d*u zIZcsRF!q$w6p2k@jzv=>Hn#P$&9dY&eHpsMMlLx`kqGpW(-et8`p9XD#6*4MG(}=D zJIftSk=Q^V2~CmMR3AA_ktpIPIZcr`(ML{GBnIdsrzsMX^pP`1kyuC{?P!X`;`+#G zio}Nc$Z3j12~*@WMdFJ-a+)IXqdxLy6S*TXK_7RDrbsNJkDR7REUb^5rbuk2kDR7R z6tI+>rbztLNB+Dka-VbfK_A;NujRag^ST+VkDPfu=2e)-Zh?7}^VsGQ&EuF`??mqM z<`&NFnp-osVJ>+tZ!TqOPsOP-ThBJL<V>HT6GuF_bK}Z|jWZ{X99}&v9*;-d@AtUf eZgIU{<8rygwrz1fpW}2o#qoHI!@<5U`1=Qc>|(G0 literal 0 HcmV?d00001 diff --git a/t/images/BPG.bpg b/t/images/BPG.bpg new file mode 100644 index 0000000000000000000000000000000000000000..3a31fba336d5de5a104b43935d383686a1695703 GIT binary patch literal 1863 zcmb_dONbm*6n#}anNK5`HV)!%@lZ@9!Rh++1nr_bnf^JpOw2evpb=d3r>3Xq>8eUq zjomXVjq$TlVuK(u;t&+v#f3YA5^*Vr7{sMYR&E3pLCnH)>s6+EpfxTmczw@3b>6+V z?)!9cW$CZQ=~Rln`LJ}c#;Vm5Y??7P!)7I!O#<y;q=4^%eG%h`lwcApjr*iSk$ngF z{uu88AB#0Iuz|UAupeREB@gG?uT4aAuY#wiRCioQ{PN1#8ZTFus%wR1zFH|(mf0sz zP{v!<(6o%HYi360`bl$P!PK*;@ZAfdo}VCnFUCIuE3b>ZElPB0icP?1hM^@ciQ0aJ zW+KLuC|Y_;Xe6q4kQCnvULJ_}4+2lb{0ZQhfrvkYxXD;!fPZx`6?M}DW_xj7UDKq! zVISlelQ3}$-@(}7%OY11b7y1xByj4om`fq04+I8e@(50h;K>n8I_hE$;{l9A7~?uQ zj_W?p*f+C`W#4CPnqwj!iuGu03$;?UO61}s>%shZeUe>(O}uh%?sVU)H#=6y8&=zP z^2#rtey(u4l~<lQc}6?qm8=c>i5=gn?L4*C-03v4E#>s7WUg=ayI$7{>%8CHbON)V zSL!XdVVS^0s|t@KVJELtyY;qZnw7r2zUI1{T-VZup&*FgS~pkAkH;b4<&}*v^h{Ol z^?K=EChhudRnKO#s%EH$F%QLju<eBP{=5@Bga}C<#VA`r)3?3Qb{$SJ>kW4+%qvQg z$Du8x-jD4B>8R9n)9tGCM%B}rifEkY$TdrD*K-}q34@aBtlRA^zfPe^AoA6$^N}OG zP5YFdQz<VHY4&MjJe?U&YX@lI#F=tYo&QppP>=NCzxO7z*Z-k6^k$?t<eKM7jgr6O z1~zrXcG~pm<6mHHqNW@uN>EsHtiHOxhv4k*Ld(I{>tT<{7d0Fltxzsj<P>9FC-hgB ziu~Dg&+)0Rar-4`KQmTu23}!hWtlK8DU0mE=a28Av%tQcr&tHy-PTJsJwJr%CWg_% zKEuI6U98g!J@C>l@LZ!4;g1RXYpW&jUjiR)3w)h$L*N^PeS8EozmvWlVVUmrxrV@W z`sYHcPkC9%^|pPxy%BOc2)satjMuh<(CP-f>NH*7bFn`yx;{mHG>hFSgw(NPnE2T7 zi2WabXdOhj-=2>8E8YFokQ*jyZuu|7o+M`&yPZFbv5SATvmfFzzd7U<-oRb`2rk{X mhul#e7q80LXS<2P(qdV<cK)R!=<ZSJ$`3cb|KiV=ul@}~D{?#l literal 0 HcmV?d00001 diff --git a/t/images/BigTIFF.btf b/t/images/BigTIFF.btf new file mode 100644 index 0000000000000000000000000000000000000000..bd98ef49897b36802e3014ebd7b4ce5f549f510b GIT binary patch literal 384 zcmdUn(FuS+3`5f^NI&&M9l}X&D@Sv)UV5HVM=+!i9!YCGU;t)bC~}u5WJH4_EFX5m mLZ)xeV((Mxm9bqCyVyVJH8Jf3*b?Kfs9{g++44n~|6C2w5Y18m literal 0 HcmV?d00001 diff --git a/t/images/Canon.jpg b/t/images/Canon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b1be198892203d1c9f22636ba65e18b32f506258 GIT binary patch literal 2697 zcmeH}+iP4!9LIliW^Y-x$?kSTE){Z`hfOrFY>v&bT_Me7v(5Gz($I)VHMS8KG%c(2 zVnZ9Gv{JPsE7&T%EUiLY+JaaSLLXXaeGvZuFHzKoJ{KB%keKoNn={D<6AM1u-(hAx z^E<!GoZmS!yXt%OTh#}BhYGI|<@3)_h={7FMpzU8y@M77*JGSOiwj8tBezE3*W+36 z8pCC9tFf`b4tx_Bub{2AD!zr2KJ9xOdY0aiv3+A+Z};ukX=n4B@<ZKQ?ZLjDzO8f% z7MyWmbkgZ(Gwn_$z0OX%nRRZa!=Wbn^j&W~E)t(N+zD=Z&&#`)6HNxmhav4a?Q+sv zTMjlp!!LrxlxHKbUTeyWImY@@Sg+y$*eZGYqwH(+C%}HAKMf9+D$iSGn3oVXHXp-g zycDFfexeKD6W|aY)8$uCHtTFpr$xCE$1+@oi8Oo&>@R!u++IageaTx}C%DFN4jjGY z#X%~nTf%fXsGmzhFFx~ZfMglw%F8ACz!GLVt|!}6n{lPLvyu)=(ta2w*nju=;G%}t zLc?C<W}|I{wWJhgGq`Pm`Tlxz(r_2p2VM((KlmdsXE_B9z{3Wg0|yP?21nq**&jF~ zYikW-IvFzjc_@w;p6?9oqej19&_uOi_vI|D;wUKX9Bg<+arAT8LU+Kcz&0N4uHg*$ z8W=C0hQL?AVeoG7Rq)f`BKRhl*EWDHbjvW$<6z#A_h7Rc%qeHVUx7L19GEK+K_B3+ z3G$Ne*^(o0efc{Oq?AC<I=|NVNF7t^Ipn|tQkrjQQCffz4$Bi(vn^9ImE^0|UTsO# zgRxBO)hr<dgtLY8$-*;FICHZ#OSVc<D^zo6UQE8v)msqGpj7YRaAw)bVE1mrVKLY} zOq44W-#j={9JP0i7T+rD8?)O}xE5ldhOZaiu=_`f2SyK9luzhM1^z<?8flAo8`l@~ zkgkgxqE<}Pyij6VG*X*5i0c}COQ*#9;vs!P_r*8Rgz15tmzJ+pCMcK4C0<ywr|xuQ zL(TK`xx_$XkiHId$&K<CIjzT^<)a|aH_2UkJSo5PP02}lJn*}Jv&_p;|A$(CY|-BH zn~~#mgt!H9VTXpeouM=IhkS)MI;8wpm^T>(=866^`<i#$MR@GT`J>O8&;TDGE6cAb z8t1Lt)kHfHlg~{{pFJy^|L?T_TA!i*ZK%|eU-YQ?mBmSFEwDMK)lYPs647WwyrHG8 zuEj|<C7o0flIrYW>CAR($v#d*Z9{|ol%1@vPr6Av>1N%wHWv;(9X*e8tK3s}D8?st xNQ!2%VnW7*x<^|`EdCytw;Ncd!T-g7zWLZPjrx%y5}!{@#%LpbNlog9zX7_#`-lJl literal 0 HcmV?d00001 diff --git a/t/images/Canon1DmkIII.jpg b/t/images/Canon1DmkIII.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d9b5253b30c5fdc7230287fa4bdaa0f668d46a6 GIT binary patch literal 8337 zcmeHN4RBS(6+V0SzTdp$y@X&00rDV{@EcxUOb7u(2q7duAc`VYtAwBY5E3E=1jQ09 zBGjKI5tN2eVx}?**jh!aC{>ZMN>NeMPSlFgI<?jrMN7~T$nAITyBAhTh0e4c?Qk}G z?|0ArcF);!_wDZ88>7>BKY8PnmDLqQB_$)sO+;Su3yqvW>yQJ$=iz)ia-5JPaOT`! zILvc9aFT_$0}rz}8gLk8<8gizxsMhp%lhhDb+hb?z(dzZFeRgY<jLiAOY0)X;FMXj zM`siUOUswl1WQUvs2F^<ZJ)!T(AeBiI5!*)W|-iDFsf<2IpSG9Ox<hYV&Ea`PkE4L z;YJ^-YjTl}Qz#tHkWCSf%fQzyybxG4M>v98(c(3|SP8w>60z0Dd`rI`*wqrT<v_h2 z3wwaQ79Um9>J}G;lZZA0uLE|YY5NDlofeHGxH%a_%?fT&Ftu4eXM{qcEn<r!qggoQ zCz2KpdWjruktlyKh$yB#;`1B8eha@19B4lkAMwiwMwO%~SSr}5VCJ#?8<BI6VUl`# zI=$%-EwH&XM~lyqV~TY?A38~6a5WQ;iDSc0YbOrU!n=TV;33dI1MCEg`z%-J0`3QR z9<T>E2%HY=LkYH3*zTfe_5dAzCiDSIUoEJyk5&K7D5AcW9!1&`q35!kQ-Qf3&jDu` zGy&ib(5rrG@q2*p0*C$iB8F%ad?*4QgeP=2F!L7z-@`t@_Xgn2mfeOvM8AOY4RBTi zw*tdO+K0;8z(IA?3A`N`?$Z(AUBI?)2Q43Pi@KnXWsm^B^Ch*T*9`%719NYy7=ZX# zcnNSIKN72Dz_Ix*Iu1??aGa&T6Fs$0e#D<&0mp-*%2j9^KcRr>F?+=K`OIRhG1f?v zA;>U@Qos{5kAk8(LV%XVx-hS-a+WrQHci`iQ-HRaltLWyMTgObcCv7b+(@lv?WW4I z&5W6*;w#IBZN(gUP8)NIs+ZMXSH5gfaL%G-*H$mB3udKfrsJ1+CfUBdK7>RwOHF4$ z7tNX=cWcX%n#E`@1W)_vr-d0395(IgAG7uqvsxM0mY)yw4qZbB4zP;b1G*`-*13#_ zR!caxcD7^8x7H%_wfW>(VT&&7i=|Ua&vEHJtozymdUU<pgAOI@L+A|X%(hgZ<9%D4 zY>V`OSIXE0ao@g6ZXdd1fV9^6_AL=CqoYuzG*`AnL#g^`bNCzyZjd&=-eh!5=aJ;Q zWeILCwDLy^m1DHX((|~>^O~Lim2FT?$}xd(>-TXNK5O}*mEkzpvEcq?%V)oP_z-8l zRs*2w?Y_tyRnOP9oQ<CC_Qq5FvFqdWzoWm2IGs`OoXvD5;`fI4=z({qv{zuJfw0q& zW5j)L+9h|MsUhd?|8F9&6(e#z-HtWzXrz!o=;d4w-G3)NNdK+$^Aq!W#$Yafo!Z1T zTFvp%C%!uIa?fU?ipC1J_NKN;es=7+<ID<!^{UCrm$7<p%x~89rxR-Wr04Y1`?KmR zPER8=HBrzkX&$rR*;%nA+Mef6)yOLh9#MEAO~3oGS2{;O;*FVI`&RdRvl5Sg5Pd1@ zA1_+|=(a&iMy3D0bI-KSkMrlQ+gkM!hD{y;2Xricg3IS`D=<e=9!;C}JYLomciS9Z zkMTA09{TY4^SQ2{UF@3JEw+Y^C4TPP=h(4(UB_*e%ppuydE*Mq(U$p_jZgWI`57B- z*gwy)`Q7%+hZe7Twsq&YBUip{&b+vnjhu^&*C%=rIfUu$DCTcoOU_R=Uuvia(<6`I zdGL?V>?_xQFg+`W>u+7u5r6$tP2183e>8qkea90Yzk2`U><`z?JUj2+=sLjs0sEF7 zoiprj#;&m)lRw{5x%ZAX_g3a#j<*MXd*QVym)X@E^DOhn-??kUmQMx+2M*2dT3PmK z!;Sase}?&cL1G@qh|l5j%qh%o+_*4WHt8cvzmDH|e|P11%ii3V$NVo+v0g6%_z%k{ z)c1Eb(2H>2;MD~SufwJkWn_=e%&M&oR*VU!=ghzhY4Fn7r4hneAE$;w;q2^jXU#uH zJQsm;5%~X)Krx199tn9c`U)9?IPsgIJviab@g$bOJd(52BlB*UuH1Jh*lA(ryA(Z- z*7!5U17NT7`7Ph8Tpz}Dl*07^+qT<qj~AfPijMu^_pBJ`_^b+-<NF~+=~wDz9~zMP zeGQAIlm2N6mI~HUA&Q&gP_R?ME(F!)xE1VCF#B~FnctDIk$IA@DOf64SFl6DP6fMw z@z<-k6`n`IUIj-f*r(uV1;;4ZkEzsdX8@Sn#KQY<jANnW__8cO=DyZ}96%OWQrKlR z1xp3%3U(-%Hv;UkE(N<4>`|~+!BOZSc3B@V`@{lQO~2URXoVA_V84O`3g+^>_sM&n zwqVoh8)6t`@oO!OkM7Z6SYH5RL#WB0ht4l(E+x{f{v4%_2wkIW-h9++#Bj4zl6IZB zPcT>>(_WB!<z=EoE7eQ&>Dm^tLcdOLmOX}soij~zqk<~e@IXeO&eJSk!y4H~^J$nI zC3BqJ&K<r-e9wz&=S4A>#@y>pk-KR(MbQ=Xns!jz;plcGM)i-nP5i~pwo4s738zq( zThmX->Cky8iB`}=>}6(|Ji}2If0Ktxe4@`yI%Mi99Q6s4oppMh{*t%R*W$|1GxTdc zPsZ3KE{|Vfmhd}P^|y6p@n?%9Y>|FQ`eM%(t?OAKK9d_qwDznKZ^%H}Ydssq2Dv2Y zGJY*4$+<~I#;f8>tv;c`=n{X_y87O3{6p-}%HsDL@!E3j$~cWCY8Pr%fkLX+oLXnh zPv~B)Q|yd>fjYDYM5C{pq`XBu88u2wkn_c1?}OrXnIh(Sj)-`7su>aXIPz?hDU3bZ zbQ*<yqZL??UqP244aNR$KlFzF$Rp@{%Ak={LS;17JYG$8*zq2WZw>=!5blh^%6S5I zcZ+EX71AWiLwzYU5Ge^c9qB^Kr)e|`j7i{*L5)~Cn=%2`Qc<=DyTUuL>${q+#b`MU z9%N&kKY=d5uH|I9oJwgW-9Xi}7;Dl-x&>(#O{W6XJDV<n@3kno9Cs_J9PC`wFco#? zBmEfH4Jf^iZbb_#X%0Neq%_NZF0O~t40zT`55xWqsDCL9hfg^)9`-X~r+|J0`>W9A z8d#_|?XRVaP>Stef>eQstVZoMKv$tf<4}GEVpV|lUPV{JvsJLa9*hdGixJNh%l;T} z24HR&Ls!GMxoGPISPo#1JCm}|`ZUC0G};p~+cOrrZ1^=6F)ao+2jy~bH4(K;#W4#{ zb2QqXfbtW;y8t|{kK;QHIoFDPAN&r#AL7Tn$GiAZcn(|XpqMFI5wVxG4Z=flK=ZUJ zdW>#HzE7)^s|GF@KG5A)&+$JX($F72r9a3g=?D!LN5z+p{qp_50sn7B4ONOHdWe$6 z4B6uPE8QrDYPs?$_lNq|&g<oG@C>R%0=`J>p_u-!=o;N+{(?tDtqE)y<O!rAM$ZJk z^#9p-)0lxV)xb~Xz12>dal}PW_tmMU(E9b@7i5p)MluP`W=yq1+Wq2~xKC>n3wg8O zOp#qVe!DvTef<0JBz_oP@cXhY_C&>BaQSQEIf+D|arStc&ExwWY1D<dXy}+caT8rU zE(hq;H&o_xr{(D!JS&Dyk|Odojn^dh7w>u4U9rD-R{^VEyoDC|s#p)bW?_5%QEb_; z&l3ul*Ve8IHdHOIonKd8y(Cy&TVA;+xUjsTJkNLspKjs<fyB7Pw1kATaB6aDI6W1T zo|navS2)R(!tWB%H!(3dAeh>(Uut%0Fg3d{d*sM$6e!3l_^x87?itTfEPq9FOEHAB vSRrGDu@AFN<eL?mV~g`N4gPPyzG<IhPtzE0lMin*TC9x4DE$~E8*lv+R$V*C literal 0 HcmV?d00001 diff --git a/t/images/CanonRaw.cr2 b/t/images/CanonRaw.cr2 new file mode 100644 index 0000000000000000000000000000000000000000..50b2964f71998bc234cf8b50bb663726b89c626a GIT binary patch literal 8724 zcmeHN33L_J8UF8`?Je0}Ac5oscnPbhI4=oXNHK&M2p}K^c?SUvCTu1lLJUZwMoa}Q zDk4SXC<KZeq|{d2Vx*kZg@Y-!Xq5s2#ne*DCJh)7A=B^9yvgG6wG!o=dg`5X@BQZA z?!M0C<n*N|A{st{Qy`Hjf{01PKp_>-#xfBHmO$PCF9qokp-9GsD7_6I1>6a79lVFh zrk!K38Xc4ub~^>>@xbv+F=gt3y+M2&xKB`?11G~~N5l>AvzJ&lRT$dhBXXF}@Vw%= z#bk!Q8^+!2OX;s?`Lc3G<m3(;Lo^b4B3(O9*7g2r`k*vD#pfTC)_-uCe-I_mn#ER5 zrXa~@gE${JX{l8kqU61Uc)2jQTq9Hp>B-4{X}OidLdeTOTmj6Uuw)=cY=z6r#Y)im z3M;K=gnW>`5m;Mcr6tTegIKhUD=5DeGUY2Ys!bqz8TcV!2ZT$zL8vO2AHS}%sunvu zh%3U;YC%j+BBjcz$z?vY`35UL<-n0aTnQYt!Loy-h;6hmAn{gMYK7HSSjdTTM8c1U zcfo&C&3_ZE?=ex^LR<7J5hG3bf$-uj4xvQ-fQ~|t1B;f(L?C*oz@rezz)8RpfK^EO zfL8%)LHsJPGl=&Bhe1PFk9qG_EgVuYz>T0s!j8y&n1UJ!$~?@dA{zA0p!-1Y5KMPG za7<7Jtg1NBg-zifY@ySWpo^9bK)wnXqmC8=ZvjR`D-rBzC4U5T59n(_XBiS@qdIDV zIdCa5HwIn;j)hDrdV`Xop*%#li=F{D1?3bq(&AJy43R6#8TTuugaoQ#45Vn}xPtT+ z0h8V=Z4epv3ooQO+U4icRGuGXXCXd9w^J?MYf?m8igDW7S%z!L$L=!87ZDn;YP(Ql z+2&`@o>#OWZ(f1V-%szCY*Sm}yNmBEp1YvftoL+~MS7waidf_`-LEI7`ljDgS}@<2 zS6Jv<R4{MuP;-`nh}EGKbQ%mV4FSfEQ~2M}cIaOHRs1FNJpPeP^c0ZoW^;#GhIP;= zAs@P_=pDj|TCz|}h#}n8Rg4#toatPY#nD*uIhI7*!#g_}GL?!x_ELB>Ms8cTOhyAh zwuCh@5qIP{W=zr<N@wY8KIZFtSvh-;7SmGp5KCbnXzS%)%IVJY?rOCO!{syWyxZXv z=#VnL;~JMhhvk5Gk4YP?lyo|)2-;NV17WK*f&Quui|l90B`AI3T69~`jqG!2MpMDn zli6F+(x#N2h3o<8wWf@2i&>8JX;Z+vo+(l{qomV|tey`wj>NpfYIwdezGFRmgs(In zjaGSp|H0T7)sy$<jmB${xm@NcR1)zVe}g?m+rswnb?j|A;pWnP>^u#0zapiuM_G~c z9E)-EcC^<sRJ8DIYnZ492#MsyjME)n%tDsC22m_1J@Ir0J)1_;5W31{Lt{9&DdeX# zN~SCtMK@9o^);Uq(1y`a8jO}5Ot;WD`U%~DHEJ|n*Q{>?VX-&$g2pwF{)tV7ELKXo z3G~58{brg$g-F5Q%)gfA&;*)FlfbzNzL@6GbmV6o#=>pjEu_0>7Dnoww3e1p0VqX~ z662+<8;sZMkb~<H4nPTQHwoZs<UP|Y$3&V9{c)t*Y~=M`noM_K_L+s;&B3UckGEu` zH;3-0N_vDUs1&@pw9ZVw&`dwAS>Fb60I?XIT@ZH0>~A|U@Z(V4B#gE$s0kg|hq=pk zU68Y6)Qlg#FT!LzeZWt{GaR*@gK&shqFfq*vgvqwTeE;|;(sC*b2rB$V{J$vF`rsa zbW}l)z}zr~euG_BPu|7lwb_sqlbIW(zLj300-mNk?0k4c4OTq|=BNzxrexGtE-hnk zDjAMi<uiGl<K0Ue)lK|YY&(0FPiK>m*sn254`i#!z{tn*HTRyN$uaJjr~wJbf-_iL zEap3dHhL7p5PKz75-%NyOvi}TX%9OUu>?!gbE{UZ%0M16U~kp@$4er23d7Gte!{|O zy|j=T*(zvWgM3V*A)fv0X_}b$PxdEz-v2Rc!n%A*1yNV_^_ZxPGWm@f(J9Y5?KbM> z`A}Oy7yR#Qwe*F4Mms`d<QMct?KGWHu7ZV&6eWuXyH(U-ijshyQ9*vmVfG>)YR5;` zs==|IEg6j^Q&cz?lf+nh3atTWHHaCi4!7H5>KK`fQ1yJq#1hx_sPQgXPU7ij7(?OU zE7(;G2X<k$P_Sdj0*=8v69tPif-)}5A7$vT#Op9th`M3D??V-AIR)_68F_9QX(Ag} z!l4XsI$zElVWW{^2xp14Fi|}|Vjfgd8_sfOKAz<s(fV-n|6AN*@`sJAo^FMNHcrDV z)5q-nVh$UM`N@S9Bm-W@Dk9dHu6RpDPs#YsW8%AxsUP*f+nn@6uRk%TR`MjwsqcG! zp%u`f#8<Q@=^6hC?RDzqKd1eL4oj-PL93^Oie5qV6?$|T-NHvhLuEDE9rRY>E^Q^9 z_3zW(pjiJY?I1M%rZ;Fu+h|<gye-l=$u=O3bhb^KO4oY!YHO%Z;z4aUy{;eCP9cpl z{k(RT{wyaTS6`aBnu<vYXK1!w%cXqJyV|ofC~=>*mtNH0(au97PQRpGq~FU<Xo#(S z89m6mBaII|D^T*ii91m8-TuQ`4TbxUX#1g2qkm<VJPjI+rbg(J?>9^SqW-1!ca%H@ z8ef<inS3nLIPF=B6|1Y~Bdl0W{ykbPoz+ihV#QjCa-0gTSXMcR<N5*Tvl?w04e-2= zl6Ok1N6A0dcbg@js5hbH^>Q52IB%wL<w`ybX<X@&_d^<&S90(7T=IIfc~Ac*+5xor zN7zApiWVHwoU3nY^F!$E{rm^CL(td_jekI+H#DsA5xUJAG|}eUFg{Mx38ind#<y+r zZqWEX+x-8b<PL{*lQ^Dc=BFmM4s%V46<RyK={PMhoL$NgHkn%-E4KH3UymJ8vGF~a zk6iKHdk;b!YNz*~=??7jQ`+nducsDg?JBJuV<>troYi#m<WoUyAF)llyr<e7FCD$u ziw+pgyZWXM>>g>!#iboWaRS~@oFA>Vx88Q}%uA8<FJlsW9_Na)EZR6tPfIh=3ZXaw zZzxW+yPA)@6i-KuT(%WA8Xvc^7K#(_hT>GaU*{t(MNoqgV4HD5Kg^<xGxUTs7kLZC z33x+ss@-*bz$G_*Zd9^z+yWeDs&RoTrE*vc#R+&rajM;$dBCi<Cs`4CzQJOR<5VIo zhqX|gfHxGU+I`MAXNVizr5$V(@Y<-_eZjb3V6g_*Mggyls@?V&UfRJ%f#w5zwOhrh z@k>MK+9=?)QMEe^cf1WI*G2)ajjG)ZMuQ=4-<Ni<QNU}XE19eC=3Ln*;I&aPZeN$+ z!a$*2C|P^o?uF(eSW$7e>BJpV``#Wm@1vZsvJ<EA_P%XEP8Q(w=ESNHN$q{xM&&3+ z7%mJ};U=QJZ~3@wdj)mN>1BlNeY09cY12lR|0Y`Hr)}D(J#X!8m9~2AZI!lq8t(C* zpvPz>#+3Nt>B5Q}jkzcuXZ0l9&i2K*JsG!&X*kbk;uJp$H$)R~J35)B;nsBq?mWf) zYZ>~>eYlH%2s?<!Xa(AP4SLQ7+JtXEFQDaLr5g0=H_<2S=#TUP?Ir9ush*C~aXO7} zppA3^yAIA&=3)^nn#Hns)|Dl(UaT+ESt=WZJO2!p#YVC*Y&^?lli4&joy}r}tb~=Z zMXZ8VvPW<avy!c0Rcs^M!hXwM#Vy<0td8wr``BT2l$~bhSQAru1druic^|IxK|GU> z;<<bZpTSG`LcW+U<EwZT-@;$!wY-k+<wy8Q-pIKWA;n9*q*N(W8Y@ka=12>rrP69? zvs5kBNe88qQj-)VC&{UDwj7Y>$mQ~5a+SPI-YM^skINV3C?!c5po~<eD8<TRWu>xN z*{<wS>Xk;trFK=5)ogXLTC7&8tJSUQo9aIGq{_9<nyzJQ)3j1;nYK~eq3zYqXf8(& z$56*)N10=V;{`{Z<CsHr_Hbr8Z+G73T<hHKJm|dOjCZBECc757*0^e12VECkUELY( z>F!GRCU>3tq&q4sH7pQT9#$2$GwgU+RQQ1KDdCmjTf#pGzkn~P-`=I?-(6I6k1s#3 zG;e4QzO{?*wm-UH4Qx-PIpW^5Pj~Z+CdXPVZn^QzcJLsemM_{u9$apHq1~E@w;&cb zu)BQXs@48)p#pb~&HpU`+y5<0fL81O7F1?^n-vXW|EsVMGBH8A$XIL;BV*0~EkuEy z5Tt`l``@v0CG3blD6Er&+9oaA{x0zC{~v^%eL-De=SVA@vD5n3ViV+rV{}+Otfps~ zeW`TT-9^)j^JW+NW*6nnEU@}kkT)-HL7VqEB{SQ+m&_|Dn_aM=wdUBl#n<NMWM`Xl JK70`^{Wtffx#|D_ literal 0 HcmV?d00001 diff --git a/t/images/CanonRaw.cr3 b/t/images/CanonRaw.cr3 new file mode 100644 index 0000000000000000000000000000000000000000..22f39e7f5ff326811c73966dddc6d2a1cc0d0a32 GIT binary patch literal 52502 zcmeHw2S8NE)A+u3#~n>TL?lS$04XBnC@LcADOMDNLX_BP0+A+yVvE>8<0lHS#0JC? zOJa>;i5fNb7JtN&STHuw*bpPA@cuKez;Oyf^#3K_&$q|Eot>SX-JNao_U$f&5VH|U z;}XIWQxt>{3f<_@@v($B-inQnA47<>XL53M_>2QPW=%D0STLnw$(e2~KkoswcD{Xl z`}>B(#mD*f^BAU7y16QqF3PqpN+k;btOTmTzP>>L;G&_xO2C@=`gRFI1Q;XEVZ+q% zNQ;IBtBz-p@IXF;eS<oG0<IJ+Pw)5&VDus$<AQPO#kr&(xEK$N({j$u9tSSQ*EG5# z5+foINu~Mv2f6j^=}5G}*8mU_HnD^z0P=9QAtVMcGG7l?!sBHC8&WhucQaTcfDORi z0oItO!Hk<zS}e~C05|2~YXCd&G*}RKh-(7w9kA^H76i0-Y84DYkW2ir^};<BT|Ws_ z__xB!&@@<$$VYJ9m2O_%N_TH}H-($Kx6;eIRcp;C|CnFu0QKN5)Pp_wdMYQgKcE21 zdH5c{)@fY*U|rbrFmWeD$-}HH)1;jI08cXHYy(ibd$>t5I2jiMA1M#ZAc7IVav;@) zmeP=i4FNXhVN-yq`5YgLhV&Qcvi!{<F1>)ur!~M*9`6XSd;ynFE#Rxe!vGRpp57g3 zW-gEuZODr^z!?i@wtcy~5i(y5UZ4h(Y`!dRN+p%e@rUSy=3#8J5+24jYmm$3tuqMA zkca&MHp=DVLb8Nf#le_2S`C({!7?>ixvHu?x&aJ5h9m+{_f=Y~oS~@16Yw7cek;JO z0M-Ne6~JgPzc^snfYk;2rZ)K|92t(i3}Qq1I4;~1ipkYAxS}B>b?zXt1VyCNp7g^C zev4`C=Aradf@#&d)tg8K`8q=&)*Tvkw`(_Nf45f7o~>eI6(d|dTv|D|cJWa33{(UL z`E%5DePSj!Lr6=d(i`TN>JH1u#0$m=4`G~eg}g`zbQ#ha%8ES*2YYC80CDg}fTaLi z1AaTeGN8gSx)fkJz-9oOfxL78RsgI7*a%`^8I6HiBc4wH;6DNw@o4P;9u7Q$0q+19 zoaoG83h{urm<I=dTk)_Lz+RAAZ@~8exIN(Y0nP%rBf!Y7A=pgd*%{o!fd2~e;|FjL z9YPiYjQke>ya@PU0=WP$=JS>dop1>tZGdJyz+VH5<4$WRXg1Io1MCOzdVsMP#R0q> zV4*DM_&h)mDF8g?WjxSmtGGFD8NfO`oC~m#ij&p105??02~Nt#05<0FhoR9lQc2l< ze+yt!fU&O|K_SclhAa{<fIot`%>a%8SOIt_Hkl1@bAYiit_Ro_U??j20y1R}Fy=oO zU?+e<{A4%4t$>dccn$*G24Jkyhm8nntK#ZK1{13f&_h)bQ=DYMgtD=*rdR`_z+9n3 z&@ht?fg1Ts2*b2BawdilmP8alfVl(;*03P&W3iJFjS!|~NWKsIxJNj8!E^zeO64(0 z<P_^i3Y^Q=us-g=rJqC&LmNR;3YJZX<w@Q;<9CZrj2#=27@_DNkvKX!K2G800*V^T z>Mf6zAlXsmfK*22K}i#uWE-OGD+uH*u|Le<mZEfOsrWQeI<-h=S4Ay>AAHd3P3LvY z>q26fc9SDlj(qm(jUD>ATOaq$Zjmzi;*e3QDnCpptl=jCc1G?U;M~;>-xS_r-j)L# zW|8J?beIg%Oh-V?aPtO-z%k#HVi*c2&4?)=Ij%_45q_5NBQPJm$wZZr=A==9E@@hz z3r{c<DSd{|8wBUO%5?M$$@|mZe7h^%K!x<G(`56eY>PNi0-^-|>m=|clnC``9KRGi zECCNUo`D9e2IJ^77%XbW4dFFMpfLfJTY&WekD59fQ1Mw>9OPi>gY*R39W3h3xc-0! z$XOcXjRx09aBV~|%>fX?5XUe9CbRfJnjbIq$x3{wlb)t1c#q65yJU#tvI(Um)6CAQ z@#3P*BKQ-{yGp=GjRDp$&WVU(r!)=M0RzAYtpr`cs^dM;^9G|CPaqNSg8y|_p@D)- zPDYfFdOpC|2GNgN2aAUXx>zFY8<lwQ2zcxRm3Z(7cx<a)V9}-EA>e5q1~ieV!BRCC z*90ngf=7sp@6?re@CbO!cO@P?0=_xm-)8U~oJf!}@x;fubLZem^KZ|DIGfBjYGAZl z?^~^A^ldVQgp-xzp!IfBr9pRDC;BuQM%oZ3(vGZB^f4~dJs|O>#*((6*jSO)#9p81 zO7zpbkAMCwGx)@*lH_9~AV}gbZ7B<ixtrbKvet{QUOs&}VzHm}u>6qHHhSwCmwQ`Y zz%s=vy`#6Ozo_x_$I`zf6C}ZsZIY8xXPFM&pB_QSNo*xg>C^O8`k3U3q?B@^Z6re^ zttB5z3g{)YqogfJl3_f_x{3uA`zsz*m@|J?;3`f5V?x$fOsp7R@m0mI6}c5|fZNC9 zRLCp-EWcOYxMC$UkD0`rkc4XulocAZ(<{)MX;7eRDjz~jqzTe&Em!^c23riS7=EGG zM*BV~mh_i4G&o{-#qf?{q2ViPHno#ts9}^XwVHfK=96Ud1(`+?Bn-8Sx=bA)E65Cz zNG6i0<Pp$qr}mSjB#lfU@g#|wMEOwV@Ow$EqIyxqK)Zs>1p4R1gTkLa^$V;mEd-9c zNNcJ!WkB5`yJ3ZCH@V6FHq&277fN#E{(6B1p$1`K^Ypx+|22}jYWLRfWAK^5K(H6| z?vgI_Az6Pt4}&(9zpp8CVy>%8N*zHQAh~xjsq}jIBErohCGeG{1;988Xlnad8`ws% z?coZcx{;f~x}m4AZirMAn=M$*7mX+ZQ39d_L<xuz`0ym)8PvnSGh6Izk^<k+QgI6P z>5?29J5G@ll^h!y7ZM$#h>i`3j8KG!B!zSU+L+ieQQ;Wp!nTH&&;rO!sqjRg(p2*R zR>QBVBzz-)I_j;Y#E_8?Iyh-0o2FbNO^m3)^$i#e3KftvNq{dj*#HnKH8wmt1OP>B z_?yes_$bm5tEljpL>7X_nCS2b0p?w*O>A`B2=JJUiDen7C)+%n3$qAMj6fPR7_Oh3 z7^C3f=cAKCV*pMaoiv&iFpp30?bm4lz-ZKYvWO-LP>db`qDAu>1&3C9n!&3Sr}*gm z1$6Dshg5EgA!ehKl1B4b<R(}P$XD1K@EC3aVdMEQeEUY6p|H({!<&W0w`Si4_+W6H zz5~6kM=f=XiXR$eSKVl0H2f-{mIZ_I>4nj#Tkormm%dvaQ-k<AzNJye`L)%tEEtMW z|2oEX3h2$g{sC_A?yTe_BnX9b4LYHC2y_Mz5)i0cKzaIh>4|SNXdHTW>cYZoZjc#o zWkJ$5NFW=)y6>wUHI-x4VH$O4M<<{i1=rG!1U(<wRX3U#4ZjMg%`zYlILZ;K<bAcH z4e!{FM)K{bM57(us;wQFWk50BQ#%rbq7VEGFBzbm2;qbTBGhO{UDVo<m(Y&b+)%J8 zfb=FrX*SL9EHa_wh8HPq5c@o018#G(d4?AO{hrzt^}wG^1Riy3S5#gt?MisJ)o3+X z3QR@KX!uoXK|mbzciL5KL{dmKHo!=aZ&&(p+#H1Ab(wqq!?&lw8ttjKZ;*c%J`pSe zECjJdGXobpl@VAJ0{U@<$pI|T$aaGZb(q;7T-d>(l@IPa&MVoyfd}THj`j8l?rq&S z{_M#`>pB-M8?_{B{>@DreLAKjgoKTZNK%AGL`KK8w|}%}zr7+lyuJN^R{l!=1mB3L z=pN$}BLc_w2?`rOGOTU5ea8+yDc&iu2`FwwN^DHrXz!Hv)*<2Xp%LByBihxvgHK}k z2=9Jfy73g?Yi}Kul$7A@>N<ApSeLOLF7b(xu5NAHwslpyySlqO1BLVGadAl@Db8`D zZFmM<B1VTLMkgfU?hRxZ5*nYJ)ZW@!NH;d2l55;(7d8(rVezr9DIp22u-gOk0Xg;V z7m^em7uiAS<ErNKaYc@5DRkg4kZFJ_i`YT8N=6ZJAegZr0g!q>6z9E?mP0KT_e$IK za_1FQoIie>L_-m+@5%%E_2;w{3T6Z^wx-N^RWczlVoY?zSPeyziUpODV~{<Lr}RsR z?3NfG+b^UVF}5zY1F?@k<aA?wZLh{$>tly@z~g!<(y?6<zMkTq9mJu*R*9{X0Nw^x zk0{)Q2w#1X9fo5Ny1QY?QjUWc(Ba;s=vmxa60~HXRo@Aj0hALLRE5eQoZE}m4`?g* zoB=HC6)Oc;*yEK4naKuvW5D?UCt;7&aDe~+?@hw~{H}YE#Jxfw#5x;suTX8G688$# zCLM9FP;Js-CxmJQuVbnOvmS<-u7RxF7Xx^l3H~?s-!zA`*x8ED%bUJF<IIIdC>6Sb zRmb<wM16~!x%>cDpPOK>uS!BJKrM5DC|W8xx$*@eBVf;N16Egqb)UI7myTt>b3dn6 z;-_!vJvxAO^QB*~cp1Hh^_S7Xtowk=I=*B=h7g7JeVG6@&2m}3e(lfzmhOe@u098q z$nL)-#+&#Zgze%LlFM>Ky(*}I45iRqE5HPV1keO&aMPJA?zA+a3CCrCJXOC59(|DB zmqi*>#mHgl4oXeU^ms1aOc+a~V=O;wSUXhz7)NolyVOd%Q1?yHF*cNFGkoYPxd2s< zv5%$m);_8`o0Z0NZExM<6%_3t&2qd_(SSCT8rkbH_Vjs4jG`0MlU^VRZaRrcqCb@+ zH2IoIr`t*j8t-OS(;rI$Odc|)>HG9xV<%EUZ=<7(qDd=BDt*Zym&8jxqc=AAgY1yF z(5d>3s7De5I!~`F<sp4aJ=Wbu-IV@J4c955474q@DeZE3xtvDj>mM~-f5RQ~TF}Pj zup_T2@gaev0~|U#E7=5lrzL=G4L!&dG`glFg80IYd>NHTUXpzV19%110O+)UQU`X% zHvmd!(wNwiJM=lgX#;LJQIM9fBi@=s!ydo+<Q#n2%^?8>$*kh~j|xCcJhi$Aw2X9! zD;Z?;((pNRo>>dKfSQ*qpwnX<X`BCPNl%X?)VgNaC*j8%==0c&V4z$kv7zVF#u5v9 zC)+YO0!yg#VPrDwzh6l<k^ST>xlSID7X)8TEQtzQ#}twQ?+jbW0caToYGJj-`+H$l z(0)T<Pr(9`OSY1O<UH&heaz;Cg53gKF<=(rd*^+3+N*^<R|=d1ge6-JBR>DF5|EN^ z)D0MO20|m%CMTh7nE*_|_!LTQW$_3%r842<lTT%>*R?dda31MAsw%Jl;QhOKEn&6A zt3520?ID}_9>TR)%&#ttvr}M1&4F{eT<;OWf*_apYYx`7T2{|O4?GLGL@R^cNFl&s z5&4-sP!qs#G6s6dA#y|w$ARioR$8NPKtmYJ_jPCX%o9hoPr8K^Q0>Sz>1uL=>O>T{ zZ@YQvvzD-bv7^+8-YoHF?Md=m#VK-`wXY>r2ZW#W1=Wd?Fr6rxDTV<>LcV3^dTTly zVt0djpQDvYW>UDbM!PH+PSkx&+8Qxr?!ay#KdX&Vbx4XQX+&DUKFq!_6OJQa!ict= z93{VzKiSbtK{~P06h@a{U^IISEyYq8SYAt}W^UI=A^C&klRZ$kbD=iENPpM|s)9Xo zN|;|ApiXU|C0l~bEnr?Yhn8#xdqqv5#EoF4ZU{5B5uDR9fcdxqoXOLNSy&HRiw^tK zhB+O7GIrk9g1MVj^q{xkxj61@90QcFyT19{fx#hF*+$tBJ)w3JxN_lA&ugY~dZ-Ku zhrMv>Kf?MT7`Hd^M!O7aM)1K&H%Jd_5Diyn+GSj*dgawDMWn?Rfv1?uioOEh$i5!i zq$Cw;Wj6`n@{dFxu(|DZ-}8j`vDR_!$Gs(_ttk!`$G!2_OorQ-t*PH=N_s~+M(d$g zFIk4{i0m(!mAtDwR6b5VN4`|PUVcb^QGQciBrldfm%or#$Q4upO+%ZK!$M>MT|nWB z0u4GJ1+%Y>G?hw)6M6Hf9nzmFzJ`%!8T?)_S};;qFzsNEo?3H&T7fq+FgWJce+=X+ z^#wQjM3pswHhon3j7ot0mvfo%%pP`il#u7laGrEC?{W^lOTrm%MKz@85hWl>K$L(e z0Z{^?1Vjml5)dUIN<fr=C;?Fdq69<<h!PMbAWA@#fG7b`0-^*&35XI9B_K*blz=D! zQ39d_L<xuz5G5c=K$L(e0Z{^?1Vjml5)dUIN<fr=C;?Fdq69<<h!PMbAWA@#fG7b` z0-^*&35XI9B_K*blz=D!Q39d_L<#(>B~bfaPk-;uroVefRLyri#f)1)3O=!7CAkj% zw{|MrF|i3;MSvA?7>74<tKInkVT$M#B-eMOY6ILei1aK0;1&Zt8o^~f?4$M@Nvh~H zA-s^H5wR!Uqz~Lvl}ys%Zj8<FU$ZZg`|J%fn)K>^jB7$1*}K~!;9p+g?KIoeZl_VF z)r9$rFj(~ejXIohdP<j;F%LTmCE09$b7!yi>ni<-pW~n`(4-?%zgHFT^(N48JRWzP z0s!23!ru9j4Oe@kA1`@2w`tt5@bp7Vbx-;93>&{Uxr45aWT;E=2@{7`_idb$jhFuM zs~uUXQ1tEFw(Xre!AtLr?{y_N+b(a5qDOwWv!2`fL`{s2%pZ|aP|~bHl+~(nvdc#L z;l>twf{f10J$_}~(ZkX4&VA;o78rl4{Ko0tqsu0X<WVCJ|MEgB$12G0=iWNM&5kkO zaA4<6w^QLw&Mlq$L%~nFE~{5RyI1n?$FLL8pWP;&(a$F7_wxLYjxzaZT7NtDg4>=+ zyS5uTYCEoakYXC_`Lx?Sy=n4!GbYeeuAG|I#CNyVFCJG{6lHHXojHwJH2#OOmWiG( z?yEjF3)H(X<IeQ$xl`gig75Dv-qG7=P3Lw-tG_DpjqFh7zds|7ShyAEu3FyI;P;Kg zPOP<8oPV@7XYucD85Z=^8HPi4em3-v%V)Z+FE1QpX*cNH$bkn>+d2mBeQC0H$%EdH zvx){cEOz=f;nafx_9u+<vOIO??#-Ez7@8i_`Ox(RPh<(d^*KJ|<R?={zL+$K*3DVb zz2xkHRkIR0*`F>sd$xC8aPaaY`mJxyKjiY#t%=ls`^K(k3$EKHJNqr_=zKf!@`yP@ zThA<O>05Bvs&v4d#zyBdC(y%MwD>8(+&t8BT0q*9Wv(ytH%?93HrC9kxqea8PVJqi z#M<>Rd_4B-hgioKv!}$JT4&ND=EvSfn|il1(wkM}n|@Wc^~jDq5_!47kW-^>J!z7h z-KzN7b>~mhau(;^i@%wiH2(3L=ruVxXU=phKTtTvdc`VNqX@2!XFu>AF>TwEtiJ{| zEWRH)&m(%0{fQGRvply>-<xwdYx$V;%{~fk?Xr385{?g%FPxOMD`^n@`T7;z+g&}d z%6rYeOMjUumAiHY2OmAk)v-%q;menSfxCBKyKZam=(p&G<L$_C%ad{<qGb7-oZ4M$ z5;v!DvQ^CV-o0D2ShVQ&?I^ct0UeGkb9HYSILRkD?e5fX^@}bS9z5UX%H^Fx9drF0 z`!r|RtAzkmze`G>`EPWwoeM^QJ~SENEvGn7y2GzZ1`h09WI{XOZbZY&NxQ)vYR!O- zyQ`Q6s%CIwAYL)23!z%@M3=w~d>lW#bq;R~-d6*^E08ks+sD(r0M5v-f}MboA7>bz z-wU2jO5x3EujkL2G6atBA0OGG&_qQw1CA27PYWYf@e883{Hb`ls2ccjssCSp(r~XG z%;Xw%>{COXg!6Um!xozcy@{)1TBDBF^ZdT#>5kRF?+)C>hjo06r;~#0xjM!>@v7QP zO?CI`gRVPPXmxm?el`{8a7;THHtv{()F(Xl^FupqzU(~PV4IC3=|%C0ZI-X@&p0*b z!L%v$)6XW1c=U8sip8FGN8A!iOV%A_(lgGd7O57P?NWY|@yf{V5mP_?EPvNR-ARGH zJWI`$$$gLYx3g?`+tYt?ug5Pp=MVD9C|cX^tNQ6@u}`POc}L#gX*Yb^qXAxrAN_c# z$TuZZwlym|k3>Zk=eCKc-`qWF;@&049iC*hPJh@y+ispmXte!_#<^LZe`@;<-C!S@ zes4+r=5DvxCQ@&C;O;f0*KPYn`7JsceJe8U-khN$FP65n-hSBX=fm}%yFWA?{KM1F z1Wlwi{p>tZus8N@XGaK{+<`GUfSnhsV%K5t_?ME1`Wfm@sCU&>KMT;%&r<lgo6~%% z=GuMy+?~R=o0|10eYibWU7s?88<ZuaRGgFFW1p#C9oM9T%b}I1>r>nLIu>;Bn(J89 zncrh&*1!t&vuO~9W7_)P#vMzE@Cgs;cW8%6zVGbrPBxN@*~KSjKaiMQxHJ1fd}00c zv&>^g`elh0dzLJBOZ?uhzt__i8RuX2QY}c$RDNUI$;ghHTR;6w$36O)Z@XTe5hvY} z4QBPXOPhAvGq|GH<2fUK9khC1(b~Z`yVq;|Z2y;2;wDZv>5*o(?a|6^?Tkten(oaC zl5KUqlSlNV#kt?5H#Mlw+RCJI-x0?zJ;~~M>0txq-h@*j?Ju>umXPHcm%leB#56RW zd|yBP?9j8qmpyt0?!NocHQUK9ev4Z7x*ch{Z_dztH_KYKzj4^=LE`LsudRss*?;@` zS(S!WwQj<7eqmjLz<(4F^|KlV#Qzd>{npRws-G>@(9ddKKQjbM_4Tu6?7G<BUq5@Z zzE}1^>wDb#SzUGTff_ovuzscm|9L`PKdbxtSu>6GGaq*StenA>+bW&DruDNAd+oEX z!wl+Y(}5WEvkz_V&Pz#+yY_=gkB0Dl^Ri1jqxmmP_ujoE+Zs40kEpDQb9KLJYOp<L z*oiNWUw3|%nX|aFUWUcQN#h@9?*D9Px1Y{*>wm3q%)!7x=N1m*zI`3F+`DAi&L>%s z{Tdbrcc15xIqOoZ`_Us$nojT?dVYLpdP%QC*TZkf67~;2K4j;zNm*8rgXpGXLh`yR zIu80w)yZB)l*&&#tzA3xJooMEN}DFqj$1Z%eRA`<?I<I^Ma<~ikva}@hURW7YuRY# zVXL`A=QRHOS>}YhYcE{bz5e#?dnYGu3Tz*C?&pe)Q>9^PcPFgTFS0K`c>avN_<i%k z`MxRYXX5%9uAjY+@0(ief8nW`YwPoU)25n!<^bPNC8S(KpL*Bto0|MSwC|hsStISG zp`XR^Yos!bIu>;BI97$A;rr#Azd6_S`(|tYo3rq3`oH^|b6xeWy3(P3HiOsCz9}4c z?9O<faGB1b9gZcwv;Df-NWKp#K5=Hc#KcsQY`o^huXf*LDHLCP-nQ+r7r{$cCHJ~A za+6(NI@Kfpy#2}EkJG0uJY}*Z-p}?%G44N8dcpTi6N^0s+GpmDe!1>wIqW|(N>?pd z(D&?MJ=(}l8d<vNzLSeqe7|cO#$M~K^K@E_`J=*}H_MHe7N)J7`-6qovtO2dqT86M z;P#*89$cvFcW(R1m(7*Q`*Zu-J-&I{bLjHzhMS!nS1DE(t(6AvO0WqiP3Rj&Pnlpl zv9R&LYc3uaRup-rpU%A0Hfo09!<LCZHZa+LbSSs~EPwlyxN+$wJsietdsN|e_)&{Z zMZSe+Wm~6h$s>)=H5jtL+pQ-Ldu6w3lz-hh@KVm=UrjSCmTj70xOe4eL+=~A?Yeid za7>i@pmWsn_U^d<%-?$Nl27(L$;zDAuz35xc^*HEvp<osCChX6WZ$8sexd1;bq`&i z1^QY1sN+LggiRfpJAYOA;M^76@50`sN1OLu`cDI;a)xZ}TE8irezxIZ;miHsZS4A` z?KRsW9sCw;J7m82_gzUj4YSHx-Z_5Q>Zh-g?(KV?IiVeC(PCInbMqPJCvF<?(=u0? zRp6xO)5e<lje2St)Tq7lu!5?+NgtXHE`Hy{xtcTL`q_uG2k-spXL9(@p6Y8MqJGAA zrGJG}zweth>1UccczyIU2hhRQ_n+Y&iE;+l?W=TpQ9pZ^#)A4;8Zf|j&b<C9$A*Ra zg!jMb({uS8-`P(*Z6wWHi%%RpBQXi`Og3)s>UeokhC(rI^^qf+nyd|PJ!`v7+nCGU zw|Mr*FH)ZDeLZnvwBIiyGUk+W=L0TUKYDuD(qhlgcia-^{J!p}JUrgnF?4^df9JD< z1D`&+{9Rn>qV8>6w5G!OfNSS^>$FJ8ynWZUhsBos@Frsx&i&!{^SUmdCF?eR_=3~V z=AT)pJFjf}$v~Mh*>z)oyR#<dCpV~iJ%07)uY>ePm<Dfex+~$<$kK!#hR{>Kw4PX) zJLH;6l3j@D$?r~Qb}Csk-iywkdqm4*e~u2PpKXKl0q$z&14b?8&Ijbf-tna08w|no z0p%OG^8v?ma~A8D#oxs90R!QDz+%`to_4TsOvxvM&V8<SKHyLOe88NU38$vTa_0lI z;C#SLI3ExT=L6=$`GDWye84IGd_XHWA8@~h^8uy&`G8aW`2hb8w<EtB&7BYE4Ce#x z!ubI67BSOxHea}K0L}-5!TEqW{P}<ha6Z5p&Ig!_=L0^l^8xry?L_I3#?YgMcUBc; z!tSRoWw<X)_^sn32oGR~4jOi#a_bv9up^v-H4b;u3;sJd1vF@ASo;WP_or3B|2IZ+ z2<Y+q)q2)P!}n6|+lGX^WK;NOzn?<6AzwAifXy_!Cmv<s&X+-ufiAo2nm`FT88qX= z1sM>Qd(AQ+u**u&h`E&hi6_nOCe(t`sh<zftzj)h_(sO<+oxe=rTUr)o)5sVLp(o0 zCgNJiKT)?rnp_=!q*2H28g<8=0>LvNTw4&@`#=pk;mpPjo^BwU3{Av37Uca;xZ05D zOt2RvG|>xY7|T@*)2A=PEP;X8AFAx81B`TF_xKai?gGOkB@wa#{4+N*%<~@^=FlC6 z`NNHnQ?`Vd-es6or8vG5A|J~zP1jN6`gMkRagdOqFl4$%GEAGn4D%40NZ-zcc->@} z-?JFT_8!CRhV=UW0(!R<A=XZWoPN$Q=Mxy_FC*keNMQ`a6uL5uGK?k-R}*pp(tgP> zOzc)dte!ATMp*?jAJTSS!7wg280N-oLJS%a5^74wppy(!yqjSt6(Py^v7I#vq9Vgd zD#<1XNC7CQ3Q+q8f`1wLft(;$$s-oGetnv8fi7%rZAA2<%1WPcaq$hICR1bBny)LP zm{K%l3}=$eh$-m^KTG)4WDL~;YUHg(Qx_2V2)y>}sY{Id(5Q1)kC&?M;o)%J6(m7e z{Q!~GWx~w}Jn=g?>)*Y!SFhsqTeTR)=Z1Z4Y{Gg1aK|lg@G}!yG#E#S2mOJc=rN?K zIuM@4`)d*;($vMgF`s-y3`2uyBtW*apq(w&CuAaw2z>$B671XXMKC~2fx>Nu!YH6% z=YVMeGUScm7hFxez&{w`&4zdfj0s7FJP3H?l>w2Wz;yx(f7Oh-Uw|R|l?#UC08`eH zxy!s-$vmB0ah9#2H{y7%snxhw<wFBqnLkZD`teAe9&G8ENd*a6dJ|claJn=UnF2Pn zzzRJz7_|@vO)1b-0tYb?g|XGhG#K$A@WReDUjSH1!ZJ-NlA<3*>Gx#PU~o3$d10SW z&)27)27L-B3D!B9!<aN@Uc+ghTEWH*l0tWqmZ11aLGKkjIU#N?N*5*Z@N`frTM*{~ z1=6t>iT_X;>rU*$)|b!~D&wdD`A}jVtOJT+jsZMz0U<qmIudMV64F>DCn*r!1$-U= zmqLcupdVmsfLCD0P^Pfehbtgh9@K+S`#mL11qfD03=*1Ts}J%l_WeB!;a$v-FqT&> z`&wEy+hy^@T>qnmrc#sChFXRf^tbAoXqUgCR(~WDC@=aMy;YJRb=JD4wN@4(x7NO{ zy<Eo}3sBvt%v5fw09BM~ifX=UiRx?BY}I&GsHzj-ja1c1!Kcy&teHvyar{&xRZCS@ zRd$`yJ3Z|*rt^W$uThiw<z#Eetd3zFtva6Tklewf!<O~|?Mr-eeTMt^__XH^u2xH+ zUc9Tt{5N<gs8{SbTrautZ^)9EhksrIMmX}Q8yH?yRelOi(d$<{=}4gUn39i)6X{7Z z$$|6ggFq9KT5jun5Js{YaI20MHJfr|+?~JTTN=mf=J_urJ=qCiten>S-oV!M&#Tgk zB3AnsQky5ycb-VMAj`VID*_lJSNzd1t>Da-%Ko^_G9B^9$D=pHFus^%N$p51ffo-j Q?-C9vP>dYYq1gQXKa7XsJ^%m! literal 0 HcmV?d00001 diff --git a/t/images/CanonRaw.crw b/t/images/CanonRaw.crw new file mode 100644 index 0000000000000000000000000000000000000000..6e9ef063ecc9ad70e29157d9db90a8d91c29225a GIT binary patch literal 6816 zcmeHMeQ;FO6+d_1?q=Cd$Vxs*f<BOTqc+)1Kx)=}5b{A{N!TVa?5M45vP-f<Hrd%M zCS=rR9BLV*6kA7xGBuq}JCzaqsAWQmEzOKp8K_f+POB&)V`;4n#yF*lvai2$-)@iv zF;@TR(A=H--tTwLz31I~&i#1rZewE}5jE6RdunQGTMQ(?^i*EEE)-g?MtlQmFy!kB zsD5A6R~eVy67H&x^o3e3R1&44u7&FlSMil$F0z2x=0i_P8Ov*0R^3^$#8p}hz&trk z>DwBbl65m2{-jJV(f;4=JALRB`=f4Ut6JN*ys@o%h1ycLtZs!`(*#jVb=<q~r~7hc z3}mvXamQv!#B3?Dr#slAHuxfU1=fRIoN9c%eZ3^F>P1hWSMRJ3MnVI=NI-25MEZk$ zy=qA@e&_8N$>u#->YM+-y?@Ov@c5y4WBY*>X$`lwR@0{Ww;#1lwM&IgA^Q}!PPNnM zYKCqp@@C{^$Ro5`i_&vIT!+UYk3>x)%48Azx0wbgO8dzv`Nz1jR!?&h0C!EMJEX)& z`us3}aTd@DTzSqYkeF0RzN2Yhr#X;CX&w}Mb9E~ymdZ1P8L%v?X>)~v?wf5y4Q{D! zjkV{ok?dffyz08dvlDepG)yH*0lB3WUCLMP{io~bOVQcj5)+y6H1@?=_@xSVXW_|a zng>}PxI$^@g^5(~bZ{eCCBF_l3*3yW8GT&{ULbiIrJxL#&xieMP&eU~1GE8{XjtUJ zMnbxUFfAn0W2E5ug3vaZRopeiiG4lOUiSC@mw%0NbQvfc@#kIde|<byFn{teYpz9m z9T&8h=&Rs2AiI#=$ThSM*F}bJ%9Z5~dQ1EObC75g{X^{5cs4vk-xYt?c#Szk*T5pD z6UMjcD{?I(nlL36KwURu?~D0wkR5EeM>_R(nkDv1w2A&G#$`NyMX!rDWjv11*Tkem zCyb|M#JOs6JU*Yj_oTh2jPJl6M}Nj1`|p&vTSlRs{w5xl^W%Q97+#j~*hB5&m_*0P zCEk+$J8b+Hb}D^7Tq+*Zw|83F8#DeJZzcbfSWCHZzJ0#-T^aVaix;F5TImL{Cq6$a z4bRIc?5A$=szmS5Lh(x6e;;8D*VCoqF=KBNeG&g1qSey5b$GA(v5d#}>09D2a;6-h z&EgL-9`DmmIu(z{IVz$L_3@mvfADyovG?EmZ-@3%?M;!U4|Za2o)M44myB;?$JiIg z+vsM@4t@hBdYNt&Zv*p+AEU>`QDENj&ls;3?YMIimt_ypm-{2U!JF~k?#GiCE8MON zxk%zl5;r7q?i=@1l|Q}LEYta?T~UC4GU?x0I@Y~&rQ?I2krt3AHPgahiVgVsTArG2 z$))2|NJ~=^o?(x3GQfw<W0i;rRH^v5Lf%SS>5Q^E?%k1dR{oeKbByS$tY*RYZXSI@ zMDcr?Cg=&VOJs>LiV01Oi9D?Q1NiNv1N4A+P)yJ^dS1K$NmO|-+m1)@JFJiP(H<J7 zQQJ1`4s!&*C7l%Ww9bz=W+Y3z`N@(ix0Y&nS9_1r#h6xaXw$BSH<BgZ{A9_f%}kS; z9jo@nj7g0VkvBhqMr~GTEK>WS#)!2EG-|sFoTOF)T)g-+*VCwNF2=<NsI@VJN5}_Q zeZ2VzG-_K&vuQ$VXG_G|1iHNCN2s4duxO@dF(RhVevVU~FutNvP;VAZpY6qZ+mEkf z3wAmyO`p9+Lo|%OS+R<y()8I$x|{CDo2HF^g4)w(BeI=*%EIlOJ{z?)W7ZbX#ti-L z&DZZ%y50~|48}=ACOw)}pXtr-%-Nh;mR>fuKGTy~Nsl$F^S$}uoa0%Z%;=nM`*`Xv zOiRvn#71IAV;{v9Xsy}~t(!&+{o2#9t+9J!eKB8bRjfI-ELN;}GRfFN2hB^BD&=R& zn7qHPyr05+xzaB0-%}16A5yj`8_Xw6w<wKD!1RQaho;Kw^<Go%fyX!t^jpD|EFK&V zJ%&h!c`$Ctp+XPIU5Ds8pj`T)(qXvXzAQdge`M!VK4wLBKHY0WUV?KtqNjisd&7c; zUs`c^dx?DkcxgJ(jk$I%2XvF&1>^_XZ|8G_hk<@C(Qcq|dlXyli$FW=R%pvJh<<73 zbH{q1UG_?#+kkf4dC7bf=t+sT13hkUfouoRvr={%=-1N91W=isXX9C*n{)Zh3qc|? zavCXKA-6ZR+MZhg4JRvlee9KS@1GluUgo>rc<E0$-uw1mMKA6gdTw?uAJuc&Y<Wak z2$UmH1CWW2&8QnladEG^!Hk8s0SyAB6g~rV7|7<D#Pc_xBX{NSUTRXaq2ZLG@~Iy) zt1AZGVxZDooKsXcuWVLVdfFOSHsi3mwz{o4zKM$?I2Anua<IH=FzoAG8;GhMfv#Y0 zh2!1d{LY~U{S}T?H#WJN!Zm^JV8c)(&^pxI);YAcv&`?Ps<f65x(7qyP$2442SYu* z{qDgEhtJ>F5pV;u*y&JZk?7hAM<f5E;da*z2G_Lp_4TMX6)!4rz(&Ns#@$j|AGZKj z;pmP=!)~W@U|^tlU{P^jq{~@SR#xV8l{!mHi%_Dde|>M%H(1o$e=RInRcWI((BBye zhNFDq%{F}<ee0qX4u@5ZoA!53Sq`s@^hmq@PG_Je5DN50`<*x>cfy>imis&1{`1yY zq(7p%Cn|}~dV*}&-Q(-+s&EVz`2%Zw>w2P&N}T+w1Hovw8VGd+{QiJn^)`9Ro!q9L ypl(c(xV3WUMUT@9f1*QhldJ+iF`RNc$W-70y@=KT!g9%YlQ@Fm@R^Cn%YOi9vis8j literal 0 HcmV?d00001 diff --git a/t/images/CanonVRD.dr4 b/t/images/CanonVRD.dr4 new file mode 100644 index 0000000000000000000000000000000000000000..0ba820b4b0bba6b688eb1003077fc0f1f676a46e GIT binary patch literal 5472 zcmeI0O=w(I6vxkd^O4DiW+qK-7XhabZEUj$G>a?(^MnW!O)*Fpp@cGuNEcnGL{O+U zieN<1phZ*^M7!vsf{2R>#TiQxgB2I;!h(x|meN8OsanK^#{YTue=;vGH>3q8ZoJ8T z=biJr=iYPAefQ3rnVg)Q%t}`BBJz4D^BKr2Y7TWj>iBk%Py#97K1kF>7_?mm*1Kqj zh}#?o)Al<(ejm|Kg7tlVLKb+~3G)jB=}e5L@t!ol1hZIA8N)0rPGety;UA%dYx-1v zntmZz+V2egatQ{Pc<$%O@*Z}cOhV15Yj1uRIbM)iAIr~VA=v#XzhA({&{+n|;<P^d zyWIS;9yUOh^RPj(JXkW<8uKuiu6u`vjgS>QeU7rvP7fO=>+-M(vNAFja_*M9DX=nZ z-5$Rq^y~4kIWozHvWtB}#A|XC>@Wrj63oWC(&KVn1WV_7;BJ@el7|hFNp5XEb<ANf z&1V2+ecE^<^b0*~jI4<H*&3N&#6C-&xlhnfI$Psu9O^qo7I@eJ8xJh~49<e>gn!Ay z=E(Xy>`k(59(IDP-^0$3ZTGN?WcPU34YC~`mhE+Oko@|*41i&qN#J3F#yVPlwhqH& zVS=HXxQvozJZzjS3ub+poB)f@XOCZ%et9w-Nd2@-lXay0l+TbAJgi10U7@U?t;M18 zFxZ0HJZzaP^swiP&M)I(QgSToVGCrr1jF!gOvOIumrpQ@^?kAq4=ZnTegzLZN!ICM zBmK@#g5K4<SS+W(s!;aax_5PND$~y@!RM*2-(C;PlJ$C6fvlM8mA~PybJL=I_JEZk zgCMhJJZ&>fzYr|FZ%4qe6p{hkrT&Q;f#JB5K8%+>m!`mUKS-hVe5$Jc2RL52cm3z| z4B0gHk)2uUr*oJkQ~iP2x6j@h+7s!$=1NPPJ9isj^|K%@(_cmIroZ82A=Y1Y3a-Pk zZtDEXPfl;V<F}*X5F3Bnb@aWJV^G|yN<2SBPuDUpsD1H~xyMxQXZvdmQuCn2?2U(A zyMsf=;{H}pl*jUMo#TD@)AuZAGaj&=NLhA+-F$bi2-+L(|KsXwI)0OOG?C1~9(nT0 zZkex%)F|Kjc%LGfr9ML$nS98_cjWWMlEp5vTz@JqS1TWWpykg>+{x<2<r!-9<9RIu z(JI>D#`W`c-Qi|M$I==<OOU^!K8mWzvGrE{In-0A%9U+Z(YSO?biZjle^IJU^_NiR zP?am&s-kge-gI1z#o|(%>Mx?cf%;#>rFqdc(tT^|s5aGgPd-EYR<0w4M7h&*U@(f^ z(wD{)&OU$K$;PuzHb0~Oij&h{Qs+6d_zm?>ogDj)I@?|Qf%;h|t30Q^Uy5}*x6)GD zULJJu$Y?{KEq%t4C9R7LHex<M6S;QFb$348sJs1t-OiQzzPMbjyLL_TOSE60zC>x~ zh6vA*ijzwf*Uts&mn!U!_RE#E=h*cM<6*mH`rTyv-^hQby%f1|a-5Gn7tBj^C~D=P z$~Keqv6!26JF{JEn_cZ}EwVq8W>5Ry{<Hmm9If2xUb?e<NNPQ7UCiF<+ugNmU2NQq z<i8!qM(+Zv&*Qpx0Pa!S+uUpI%7@K2oe#68WxL|Ae5B(r`&Pw~9%nPXUHRB-+%&)a zIP}b2+JSe9K73EX3sE<Iuw3XCIj28dqS$wc8opQP?;);KBfB%H`(Mk;FsN*u<*tR= Wtd9hX99`yf-Fk<WW-Vri*!UldU;XL; literal 0 HcmV?d00001 diff --git a/t/images/CanonVRD.vrd b/t/images/CanonVRD.vrd new file mode 100644 index 0000000000000000000000000000000000000000..03c931899511fe70c405376e1626ba38b1649399 GIT binary patch literal 1768 zcmb`ITS!z<6o&tG_Bex=a>x;p!lVZid&tC>%22a1Ek+>;yAVYxlHDvzp@%LQQ3+{T zqy<SqkZB|Yg+0`RT8IxmMUjS7c!4OPi#~*>f1mNpoJcF8eOPn${`OjHul?^mGdbD* z0)JvbVNqUzKYL^1n(U%%K)~j%GfjNqyB1K%1kWL!ETx|o7wiWKu|qZu#4)@~#|N5e zeyFp05eSE&d(mdJ8JL^>Q+tHGejY*GeXJo<-Lh+N0SkSFHk~~yXZ~Xq);iUO&wvbA z{a|jGeE!t5hwY^!!>xcYcoB&NtUxLDpqWn(dNGFg_!i9iYov$A5s5g)F2YKbpd6QQ z8IRG0*BHboCNXYhpM-}!%EjhfGlru?EN5IfuH!16@vO)24imGkX`N(n)=D_bhqGF7 z)fqdDbR3(>H|su-+0@hw1vlpdRa!UE;Vt%EFuzaJAYnwHDi3|!*6sNx!dow_ffd+m z{Z-~*kt&1Vmkj$h2H&05ogMUSw%%tvpRISUt4}qkdUtKuTa~Z!!b&}D7T+gJq*|)c zie5P<=Xq*P(k(q?8>C9A(1CGjlXi(kr%Z_{ohnuOjVR-QY*Bu7K}L*K#uYiDjvDPo zjC89ssZcx#*R_DKTHJ_-{EqP?;!9jmS*)4nY?4dg-9SoXh)N;ZdSJ2F!Ai*@fyBKI zc9QvefceD^)<Q-echJFj=4v|-JLF*9WNCnpYuQbP0b>f7M_;=cKC-8Px7;Qiuce&^ z=Du{W!(@J7PMd?Zlf?j0Cmiezf4RN_k&i-5#gj2t#JGdCk~IL~j{SyaO>=4~t)D)- zs0)AlQW`m4P2;|#f~->O$MJsJU9wYT=~_RIZ__T4-J}Mew0;~9(Q3%L$nI$UI5ug_ zB`?TowSELiWIM<{l5N%ck!>T}6xgdu()y9zAj>CPM;p=lkqwjOaeSOcoh<#5$+Vsi zXosftt0B{I6SQU1`rRWd=9;Nw-f8_t$rz)mSP!++`bi~O2lu*weeQ2&{ivkZ7;=}n e%fp`3Cm^~0Z0~?pH)p2*DgH-=l>c4NeDwoVSuC&s literal 0 HcmV?d00001 diff --git a/t/images/CaptureOne.eip b/t/images/CaptureOne.eip new file mode 100644 index 0000000000000000000000000000000000000000..97b0f3d596cefe0e0e507be3b123c85e1fa8481b GIT binary patch literal 5448 zcmcgw%WoS+7$3(8Z6j!j3RDy%OoYVCUe7+g8!rKS?WArSYMcirR2F9wudsKc^(IZE z9C!&30;yEu01~K&-jKK<E{F>faOj~R)IR}<Takbx<(r+I^?KJy3k{4j*>7jQ*L?Gv zZ)T@?CObZfNcri7H)mGnzsx>2h7hR}=zfH`M&pI$r6VYN^}*|n(rdq+Ufv!@e`Nm1 zG#XE#moo@8pcog-R?XLqO+V+E7jmnnZ_etq&0cROx8Ye^wiUJ=M&#G*n0+gE&arZp z;v#A)^3x~}ir_DLzB-;k&sC2h0b^|jOEXx^@$wA(33y~%7G#P1qkm4I%Wr28#&s;K z7>c66KLhjdtMlTV3~!puqkGUNZ%hOtFM-(O?`8w~2cXf#LuecxSP*db;uyLQXbb9i zNbdkW_92!10O-u6$w2lapbuZ7dTs)}d+89$lQyVhmudTZQwU{4`muX}zCzn4fG2ll z3_S|ZPoa`Bh5iCR$e@Cfp`1L-OD3eRK<60HWbhKyY}ig@?h0vON5?W_=qNmApxz5K zv33gTREFx$0eyeSPjo#HwiEp)LYhS3WQLA<0qBQ9dKu`4V|Jg2*|p!H`o965bZHLZ zZtB;qo4*4SsdoeJdZuHqS$&_|?sZ4PPhSW*W+#v6&93RMxn6G;>&1wM_Bp$2LH`lG zWnO5SerGm-vtDGcq-)XgecM^@2mOY*;ct2tV6({DCAk<#ac#G+N38)j5kG4f{bFFF z5mI_FG^?*zUf*_|Sza$P5}aDF9oJ*;f?gbYhyJCV4T}sUcuqopG|)lFzWcacesccC zS8qVLNIe=0nT(^LEq#CEbbQSY1??b$BjbI7!vZmS2-hLo{DQ8Xyb35I^${4tEy5oF z;b+K0U&r#0{wzQww?#w!%rwv8>1Ssr^~S>d>|`#d*K=o{nKs<shUwd{bgeM%)43I3 z6{cb47|-%@qeh!Wv0~KfYN0+SsRc<ZsRgZ4uN7oNsY<n4T{Eh4alw%)S1K){I;C6^ z4P2|qxL_!A^@60TxKI&Fa-meO$dYV8ijqoHIfyRQs1By3YWD5+`4)`CSr1&57%Ss2 z+^*}L_s#Y5wzFz&2TYhT!90Wt_1f8C%`Mjlt*(<4V0?Pzwgi|Pqg>RBR0pgD5*xi3 z%n)EVRt5mS@mafk=#f+3Ub`D1Qujbd9De~i#(%tV`uOXEUFr_dA;u^9V9>!-{y*pl ztqo8(3LO!I_Cd$;;zFh8ZaO|)A5w%UHs5D0r$2AGl~+6pAP(m-M|R(`plE`|Y59V{ zW0BJ^=F76E${MHU3%sI=JSSjY*ahz0l-ALpjN5FiQjZwIS>IyETy-xnUx*{POdT3U zB&Fw#O>fHzq?27Qc5L6OnqAXrQwE+BHJ+%4yb}~4q>=<=QnbFk;r3x~p<X3>Nd(Vr z_;%Z{9N&t<7^o!C2})9E#a?&l?lm;jU5Mo_pJawfY?-U}W<TIfb<>cwthNiObZ4}a zG%(emGpU{oV9D-Mh@=J&#+N#t)$h37J*EtHquwCy!4VO5VRASukgnXKZ#t`{x5}-x zy{)8i<M~z$pkjn+h6m!@V#i+F!#g^z`H|y-UA^hKYjBVVx`!R>n*9!Ew|gmnT*vp! z{vPJ4ac5JZVu7sLp4Cq0WHuzjb2sQLG2k(jq>-L<Zzx)Voa_$L#4yMy{^B4{v?O($ zve!FZsA0-rKE_tb?JC$GlF`iGB3ujhs_#1C;$z<2e#D5G*z&A9CY&WGl2a47WP0nC ze`hJk=vt<8)^*ld)`-D7WzguFp6!Qgc8^q1^~hv6R-Z2alnydLk{--%wYy2vk0>gN zz)5+HlLT4bWv?Yp!g6VJ#->B3(FwqrN;3;Cz<L<BY7#q(CY-@X97h=R>2hraT9UE> zb`94H*G`!1@;v<5Y>yy#p%lg~uZWD|d5w_;LFH6Ikd;z?Ko#JiO+lO=P`tp}c&#MD z=2pTYUnb`FbwC+qf8Z4Co*bM*g_4#ZPzP#1Hfl8*LEHg>69qx!`MeNO2kJl+>ydL& z5LHeSWK~k~1L`2{$E@<a%px!VLxC4LSrQ~s%MYmk$N?pqfw+AY)}1OVU_YY%fqi@{ z1V&iCLm~$I<l1a*dK+D9&V#QP_5qX1Lo|c@>)k^y-rg6BmNFdervg@CF{-Mnl*+uK zVNS)0P?E}`3iG0BqAbg0k(X6Y7O<eCjv7OID@>KFm1KqI1+1xxmg0_mC`G6BeLs|% zXEI|avU}av!Ie^2uDni&@b+$k-rg;5Bb1aMzITbsZ^PBm@GZ<9YSMQRaW$XAjS^GC zZYDqxxtU1%lfDs%D{|mc?w0ohpqbncBsHhMCgYmlziXuC;crXOOuj9t<_VA>_oEZ& MEx5V(;y8Kx8^+wW8UO$Q literal 0 HcmV?d00001 diff --git a/t/images/Casio.jpg b/t/images/Casio.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ab4e7c94cde18d3619aa9357f5b033d764ae62f GIT binary patch literal 1203 zcmaKrPiWI{6vw~6{L-$gn@eVO?HnxZkcz{Sq<_#N)y)nR88U^T$I3P>SP!y+!cIk0 z#6y>Z2SF(aUOfmN#lsFB#naT2ch6qq`z60$61K5dntby9@qX{UU$7Va;h&ctcQ=6L zWt;_&L!M1QBg)eM88br86Tf1U;Phtn1Di%BWZ*SB9rHVOM*2_&=7zCF^83KNkPF0L zv=d35=UwPB&kumtt}NWTb^|M`=c<n5EZrs(u1b6OUR{6WR>&j_Y4J$cbgIp&Yq?Id zR%^O-pwNG#Dr4XJZ)5)cVlJt20E|#3-SJ#!z*UuOZ=lEgcZWqjOyk(mR2~h!4$&Fv zhnDj*vEJ}UWPa+AKPs6V{e0|G^tZ#D|0vcPsv2C!88YclS%;eHP7Xt^IE!IMF+cS_ zie+Lnk(3RX8`H$1+xf#fbC?bv$vf$*NEgNf8IO34zEYJ@Z=zigPo833vY2W{@;Gr; zRXn;&=Z<3OgtTu7t4;}hUiu3@CVdDomg4agA5ZZ_ij5STGUqn#K<%<YIn_Q2E=d2& z#6mPWwYUxX%?sznSF|fMr_h?Ewnz2TZAtC~?<aSHzf9i=jj29xUyG-UnK0YFUBB4g z>h+#joA<YRcOQ1T53Fvlb8p>R>uh#f!EZc8!7xgbrSjBN*|TSDuVRx_T6H0<_ChG_ zqlBF-m8==dE*9;EZP|@>V}8Ct0gLs;qrwtf@D*l`MwsJl4w}ih$%0*62NP3EOZI>U Z#(p1|2Q<MijB)C}$xU3sC(H&v{{!t4aQgrN literal 0 HcmV?d00001 diff --git a/t/images/Casio2.jpg b/t/images/Casio2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c9c2b97243c17319b7ecf25646d2edd630003f5c GIT binary patch literal 1699 zcmaJ?-%C?b9RHsCW3E-S&8gcIJSj}c8fSNI=?F`m(66PLl?8zdEl15lv<!L@p`Jqb zAQ2RURzy!>Z_z`<=qY*(D+q#!9(?dGXnoJQ_v~KN{9X?Cv+wzy&;9;9tE^Uj=+6h{ za#sK{8Q2E^ZrDlofPyH9t3bR0yAi)6eo*mE@BtDAU0{F}(pbfBNV{c&3?wGb)}!5f zVh9{SysFgNJoj>-nLH#=eg-v&+i|S{=$`)GGsgyL|6pe5?8v|{g6RH}BWVf)qX#a= zDMd3liVM9l-?1oT^j`skv3QClQ?V`@OQsT?srW${n$Atl9LoSR5)4mk$PvIt;Z(#7 zhHwnc^N(a~%7gjGRlIz^#g20kgx?x747RAsIF%=hS{1J>5z~e!Dl92go(}~LJmRCE zd@ATw{pUiB#gADoxGju^g&h|5BKB16zZdRue)0!E`Bjwu#270Q%O1liDl*q@D5?^> zpr}i%tvxl*5?<(%Jj=0S`%qGC&XOj5(0-P5OMe{gT@HI03+HjfQj)Q7y~no4pImqW zhH$mv@@!Sbt#lB22*7J<3J;?R7v@+i<9qz{xqiOWik0De3ONGnh^!ujFd_@<3)IX- z7<+Mn5>ZP(@+?zDVC-e>1yw~|aXz%S)Ms+SdALO7tn3D$vfptg=w4xi-_XjmMSe^D zO<RRt%odFaPCkP`4GWJWjyr5REsQo8E{{cc$Yjkhdra00cbTji$7Y>4KVdEr3(mUs zkvZzbe6|nF@4&SV9I(D?AZMM!pLz#waNwW=hb+wf3_J9VHb(z|#Tl|2U920RGr=|6 z$}2JkbFhAD;x@f-WBS^EZ51<Hpbd9-VHb#)G=}pcPPnlB&5XJ*Mb(>5AGL2feav~& z;l&}lW>Tq6ndm%DxZ##Ml%CD!@6ega+5F|HZ0<VE<+E2O=y-M}+hgtBoSwLq!w?)h zm2a>B0k1dY54ANkv>B1+h!KsTM0*lkdeXf@(%T8C3x#MCjRb>{WQ0bN>10Po5)bqx z`nEe}?^WJ`&y9Z(Zk4ov;v=e$RLXDy%*)b|ZPz9Zc=<eU5Z@+E<tyw`v5$SK4-Ug? IXs&$u3+n8r$p8QV literal 0 HcmV?d00001 diff --git a/t/images/CasioQVCI.jpg b/t/images/CasioQVCI.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f246f30f06fd5bed005ee34d8d21b7b168a55b1 GIT binary patch literal 407 zcmaKo&q@O^5XQgR)TL^RNm1Gbp^JwUtPR=V{_{|=E`{2Y7ZH3N559>H;0t*0A*x>V zNz!EP;-S#rK)#R3OvsE~*&pz``C<+V0CEBQi<kR{+XXy?0331cn}cxGSg)>$QK!{y zb?GQPCvr~!d%=Xi;)x&Pf+b~Hs6;DssS=}fq0$`T@^O;q1=<_kFAH6mQYScYPJ8cu z@{MO4a~}1gQNKSjawv_G4mC|Z)9R+C+6A3NQG6Q9!9Zp*mRXgJ$C+!GrL$da|9AEs uq74^}&JYM<g6s#D_#4y@yCK}lfY-}t3cQM~jQv7~xjhReaE&(%?dKZcg*`3+ literal 0 HcmV?d00001 diff --git a/t/images/DICOM.dcm b/t/images/DICOM.dcm new file mode 100644 index 0000000000000000000000000000000000000000..20a2b10d3d1ab289566d90b1725cf3b93bc8e84f GIT binary patch literal 1860 zcmc&!U5ndB6g}1&SCn+C*h>&053@-q?nA`P=)*RY5Us6Ui^`H>*(3{o=+bN;kcGge z&^$GzrA^;bX#Yna`h)sYdS<+Kn{7yFUn+m-+_`7&%sqGR0RQhZ$;UH?TUZut{LZ(7 z7ODgD=F@WcUgp=K0v!w^87L{`Fo**cMEvoe{v9&<kiq(+g5gjZx|aM(B_kCo6%S%g z&{3!zc;xS0ifAS%#_H1NZer2yp_yJmSuL768|R04HgRwbY4+xr3m4;N57j(B%FDD^ z)$@Fo&W~5KdhU|{?hIV`|0)9)0+ZB*%`Q}li~URX%}e&Jzu7uuept*pP*F%RU8s!} zsfbbkvSJtE#*$jQsHp~+>le({!Hl^*Ls4~cl!@8tqbFaUJQdB0^XI2$=Pq8-a|7ZX zkBir+%eLjX@VsW)X3R!$e_l~_a4=8vQn<KF%fn%liFzW^hk06v>Y(6myt?dMtiYYn za*&M~)y{76qcRm9t6i777p%=@JSu2bP&$m_#G@XQ6lC7Bc^#TrUfQ%F_3)TpZ_>C( zctpZj()Zhbu>fl(EW62k?61-1K5nj2?c<h3dg9|YRcqt%`Kj=!potX+JjPPeeravZ zLU4%ow`*Hl0`2dtt+xE{t(}CyFi|o6KOko%6w!|t%=jYmt97L9%%8|?L&piZKigSD zqF*g5WNw^CTTnX(A(5%UF2+S(=3^>ui{ayyXVx>!*IV?<7U8PNPP6mY+0|W>`7}$Z zg4bKpXL_0+_~`b=+|Rsvz*u{|38Rjrk84C9n*Iw_7|IcSxNmsV!$t^v#6G#b=}vPa z*iL^-le0Fv<bJZ{Qn1af@XsrOY|qxna0ISebu`!O5_J%&K@!sHt;eMx-|UHPJ{9Kd zG}m!QDH%}0)tynoYbOa;@hFgyjyX@iml2bpc_W$9$(2>_t?$uDjuJyqVWi?AV-NoG z%=sJoMDNkZu{Bm)@t!>)Y%Qd=F9wv>RJ+gHa>**T&_|p4T*0g=tMPPR%`#0dZ(VxP z>QmnhGTL=nqhUM>2Ql+n1G3RF9FMVDTjW^uF~@c+GAngjjfqP1fkoa<A7VRJbBE@% z_HloU=3CTQr088RryH<0Mj`TYk(EupI2Qe7nJ<d0X+9NyeB+^d0G<fov&mOyXD>wk P<m=O?;?c?Tle>QcDsdmD literal 0 HcmV?d00001 diff --git a/t/images/DNG.dng b/t/images/DNG.dng new file mode 100644 index 0000000000000000000000000000000000000000..c5e7ee122004d08bfd241eb237ac127b9347ef8f GIT binary patch literal 13662 zcmeHO4SZD9l|T2*$D5CQ@)026WB8Ckgv^_KKnNj(5F!x+2mxj(Scl{R1Ic8ZOdztT zDYA+dDUB>zeu~IaOKsO(t=5RF%i4B+Eo-~zDvOFNWi9I}B8!wFLT3N>zK=;rViooG zTYvRU-n-|Xd(OG%o^wCWz3-*En#K~51J4e!0%H8e!+;&gBw>jxD90_?nMJ^ib1=IO zOMue}PqKq1g=GkM0N_3>(~wiJllAGu+h2zvm1P+;<X{6#_y8N+i9S!r><5`+*<=Ab z0GF~G1U=WSQrge8auoxfcTdQWlRvJ_)PV-Z`-rw$d1K>!JHh>g%ygoZ&GG(*{wWW~ zhm#BKasvNMe1r*KijOql)Qb2h6W$#6l1;N!>TB^aCVVPBR?wi<G;91if#+~ae4GjQ zi|3l~;J8odfV$I0#T9{vKhkpJ`6kWmcmdbnvlsY<@x{8WGSRMY>2QC*OGO(qh;lpP z-xV^`h<vzlIrwjSFx(g>@$}4?GvAY6s8o0=s;;l9nRX*lo}v^MD@DahzQ<owTsW!N zUqsE})#1jqVF>UICQ{x3mAzzYOC(skT8(*@sVhR^Dc%oX_-C&tR5!)DsIXe8j!aiq zhGwpds`J;)uBlzOx^_~XcWSAtq@}o}A=046f}WO!`fyWm%M@?0u5p=K449*RUXLJ& zt)AiyRL}Lq8XN0Zhhm=mTxEP-(KyfYXs|(D+ZbK#@#jwPLSVFRdGWl8N?jasQ@kr< zu}HDcw|4E?+_m|+jnNf8|D;Kid`g}#FK;|3#y8y-js;uBhnq&CHlao+V6ugqa)m~@ zwT%tFP{8NUReY$(<q=g?s7<xeP$U*=410Lh!DWrju_<1!%cDzDTS7?{y2#=shBS|- zglCIq;IUARHbGpel9%T%@pVH(vOybZY-*0GHK7Kz)bH~bn#7&(CiVQ4&9RsoogY!v zx`n~|X0<ebk}{!a5*QV6>D=AvOc9l{n;Vv?(b6KHp_hR%Nv1{AXbd`OHB2xGyW&mq z87-QsbEAzb;K<VaE1F>7O@^xZb3_Z~1!JM`il$N&XnvTl-YPO$u0B*+peQ9i?h(L( zN@R30y_z1RX{N0R#)MhtL__Gy!TM4@3dSo%<CXjxV-$>63W|9h!a>~_OpT3_3P_5D z)~R)$Syqz66lU0~JQQrwOstqD?p|iHRR>$TI-tPh>Q<CwQqf&t<m$#cbT7S~)t!+h zX=Qz|X{G4?kzlk*t+_3tPVvrDn;M&=wJOF6caktuWhe>*R0ivtR9&EkNm9&H(S6YO z^<q7nEEn438QO5wl4X_6;aWZryH;QzlXUacx*4~rLQ-c{I-x;p=*OGJ>(Cp}SR1Ur zQ4Oz%tt>4pG_6?K32o9&Z*Gb;Hq2AQbt-SQ(WEQTCb{81p_f721!<BlS{aI|<-z)3 zxK=ggc0rn?^J~?xIz1TSgOdBjB=1&WvWUjag>W^%eOTWtY?@zCI05s7uV`X{VH)1( zZgf3}`KwN1^70joOvP7NWH>QdU1z!;#3ZFG2!~>&-TAK|zzi+Me5Wb;vrpT>W~@Z| z!qM}r4GO*vpl1Loo{zB-tk)+<#h=H`HL<9~*R9N8KqqRd3NLRg^<z5q@V?|xd<wrc zCbPUV1BkKi6&B_yo`!}bovB4tLvV$vE0G63@!C7%3|V5pPH$|8KncvGe6itunUi-f zGMMJ94Xe@FSZ+)8^<QI1q76cf>4vqzC}xdZB^PcIVh!9E@=7eUyqCq4mvmZ8dA7JZ zxLPe0aZQOYiQrmlIm{mQT6wp)$6yd7CWkSXf7%o-M4N;rD^?N}L58q3EG?)y<Gzqt z>T1ot8flK!ix8)-)~D914XCsUcJb?7wXU{!dQ=U@8l&30$rs3OOQ-4H-j~lVa(WtO z8V-RNLNcEj<RN2*iI^9sc-JBb>>7Dew@8#PoWXh?t`0<W?#)OfF3r)>%h+M?{2$7B zN>uQPmZsHd_)EvMytPzIhuo#512$;ommk#9OOv(qm`I6A5$$t%?ngEJMeJ&L-u|4H z4tY~cy$iII>&DBkOgXM6yg}!^?#q=UB7N)#u1KA(fs|feX5R9T_6wM35NKg5`Wrpn zuBRMVXU<~CP#@e}@<csF(&ZAhPUDd~Vc5+k^6aRp!ai*OK(JXT7sT)IJsMyu;4(b; zMv}ub@vs6O0eCK8JE%N>w*i)Q_!+=X9exdP3OIO`vxEC76;xc%Io#=x!?$ar;K2-? z=3YjveB(I~_;c7Z_SNex0!@FN21UCD0WX?CiNsw=JUswBcWxQzcLC;Gr&|C&0hn*~ z)&oA&iT*h7*o4vDz_T(7RbpSf7qA342IUGMzydf6G=oPHCGG@3OVB!P`^|IwvO^E9 zk9H;Qv<V6eu!+P(I0VfiB}pLgCUruSo4AuxOK{tFElZ_3y|@DDak_;L(Cq>P$B3<< zUMvz#@B#9$TSfj7o(V`buCAjtxnDHOjYR<aGAsfHHklfGNM26~Zl2E7Q$tT=zq!7# zz&9573$%cYS-mxtoc#VL+7Am{_eu6;qLb3=R-y+18COVhU}nO>AfH6E1;&QSQ^u4= zk0ObX2P++){rSb`Lk&tkafsFRYMm>@aiohXBuwtsb8H0dPaWvw2cHF4Lw=Up2XlJY zYqJ$oEodX`JU>0P_LHhaN|rNJ!b(^Zy-2sS_3XE_fi|(bSw4GJe$4uJ))MChce}j< z%i)Le1-HY=p|@>w`|WUX=$JK-b4cK3*&+izvT@u}=XX*bk~#FB^0f3^K{wboW>Ath z301Q{T9$XH*DYqhux#qczowpj$MRf9*{}_)%JNP}Am=e=vkXf_20X=1NTrG6{eQ*w zNp*?2{Z6p^q-}}&``D#`^sk8{8P`aK()q-5={1s7%BM)$52Y8_gY<ODA?Z=}OM2fe zS?*vLXrlXBOFp}wH8{_){tmC>YHys+GJbcpFjjUThEonAijlZ^IHFzSkYoXK4Spkm zucTQtnXWa8!7&}B`Q)c!%A*RpfvTwr$KU*y58N~=rAhGYBw9#wXbR1snULT!`3-<e z^wMZ>j05!)0}WcDF?18~lTiD7T2A$-!Ect2r&TnMmeL}W+=M$!QCfzY=U~<QHp*J) zR$7TQc{S~%&7=a;04lyRcD*Jc>w^YU@tlAb8rLEK*FpDk(T)Wa0{<LRjAH0|J1wSK z#2G80-71WVCgk!^-zvJ3Hqw36N->l*V$AUR>qY%IO26XbA!8Qxqak<>6al10z?b+z zXzvJ&wjr>D0@x$MMy-4ZG|Pi!{J6*BnTOvPlo#VS9oDYGbFyer4PB46DfoF&&;PfJ zM`;p%R>XeV>j_Om-cdO|4Rgbd^bgdBT_X)~<(TU8*is@lTKz5h8L3jS?Ox}-*Y87A z>%bgUhTfD1d)3fp_L8m4alrPWb&lgVm-pBomwv+bvqz+5Y!Sk=zehYakv&8SjC}mA zxPHrV*8cAP850J-tDA067UsJI?a8zy5?i4pi)35gOfSKRRp=1=Anl$Mq91PGzP$`O zltJG1rtd}4<6Q8=>Az>G^q8fE&a>^{90xsarpcLaupiKZ;s3+_jehKZi*?X>>%vx| zq3p_(XbqK1)d<c%$b3}(HVw;sO>U!${#WD!^e5$ve4K8yKB=6SPtzIOwUBU$GOYYZ zh@SgWzHKmiMl1O(4$+G|u#ShcI8j36de1Bb$K2o&pCo3}gYX6}9?I%ZyTk3y6g-J? zhRqyF%NImkQ(^HTSRS&m>6wbXg9m<0N8g)@nf_Y9{V_L8#d8#5{=pc58jTC{#~Sok zk`7|55Di1%KZaV_Rtg|D5IQGE8du<}xX=b%inNtEQf8sXUM`I+SqSrZh-Jb^T}rkx z@ypzr$-R%O>CdG}kza2}>*?APJ23RJe()vF^Es>(^OFlJNEvPgs|a6Xh9Xyho>KOO z$HW&MQ{V7^u{r7MZa+S!Zj?q~PJJcwZ)KI<9{#NS06pw~Uw)oO`_IY$LB}k1|5^D2 z9knT~M4zBXuc3v~EO6M_KDm~DG5pu^Hu}haM1Fy?{2$0i!SP?pS@~oaj?Xu5^Eytk z-Ke94JuNS#@tKF^9W-Y6QTb(hUO6d$fI8MF7vzuV->rk8)yG1srI?g(dcq!)Yp5>s zH}WG?H2jEsn4VI8C0_u?Amy@riT=gv1P2fI*U(+kNYwFKW*b_5c=(HG`OE%e@;*xS zAD7<%$3Eo~(eh$&oEIFuxBLy!@~4!K<v*b1`QZ4I;3$`7qmI*=JF#L7&3qjzR)_zP ze1JYu-k14`wGHj~Kwq)6c966c915&^Gfl{R1uY*i`~+J5mh!S_`2wW_Ek9u$ggP#W zI=;G=PeUDFb<1;6$LDK#&X?Ts6Y%*p{@=@Q!so9ef_MiWoNQ{<lh5BqZ_o9=DZdSl zm%;Jh;P8S&8y~&<{H)A<{xrtNX?ou_*5vrCJ|6~-FVp9L2`zUx#Ahkk7p<r(7~c6= zBQV-ii};pdx5Th_S%YVX2ywL3i2bfi9T{2KqnL+W*(1G0NPCO)J{|8sl%L-vGMq}u zt8>KI8-6tQYKqwTv{Kg}57R#1uic$(IeBR`y_qnh`i{QrHp@MiHudeTB#_fv$v4uj z)^0CK<(Jdxe-n$?kFl@#i1kUFrXN^Vzze;V1af*SX?M3vGcRY;$wUqNDNZ!r>LjhV zl0Z&xCGGC#rRy)J(b+_R?ZpoL7|TeUq3>H7p<8byft=n-+T91G376gU$HYdq9;X2B zF?-@7ZM3Y1wBAYrIlYy%yZ1@~VYdfZ1A2afWhLIDh-E9J^;Qzd>8+&QeJ*h>!Qaqq z>T5uO90O{1Urby~V6jH20R?glsNHRh;Z1!FC}3{j+ue5T8b3~OUIPl`7*M-A1@ENJ zic$j#<QP!9`)uND0xvJYYe0b<1NthpN;S1Ipg@iRh4Jd|9vm3h=+|i3)#h#o=Q>ES z<80H3Gp4J{eNUW6IUyyE-T2k!c0-f3*u6QiDx}lZ=ANeYXh#YT47TGW;%aksIBk0t zww34^Jg+vVdBxVnN1s2(z4F&xd~`LrtMy7(zN__0S3Vi%_}`~3v<+iQLa%XQMec*S zC>wkA5jdS4i+y_@P7{l<pD)KQ{sx>7&BN*FV!9cpuFG-e$<JTcpugOKv-rCaL2RKm z_<IL>&Te`f?{=Sr=YLN7(5qiUpFBvvqgUxLA>yPHbduhq({vV*_C-V;60<WGOJjXl z7RzQs*$6h8jb#ceU`06dFJl#KCcBZ%Wi@OuyO}LxD_K2@ur+KQYh@eReK?2N#&)n> zY!7>a{UiH1PT79R4zfe+2s_43veWDw>tJ>%P0EsnN@FBNDw4{j8>AX(iL_jbNG;L^ zX|uFl+9f?9JtG~E4oZim<I*YVyd+uDEZLUPmI6z;WwvFBWtFAHvdQw0Wv`{(a?o<r za>~+S$*_*F7Fa8-0qZL3dg~VJF6-0Qxb=wjJ?kZFhHZpxf^DX4i7jl~VB2QfYuj%- zWIJIyZ*$p)+Vkv{_Qm$FeWU#$`%mpJ*^k&y*(G_PtjLw}&2miMEbozDln={iWS3)< zqtvn3vBuHnc+zpu@vg(}9OW!`-r~H&xzoAddDMB)ne8feEq1MQ?QrdL9d%uD4Rx2f zm$^5(A9o*gpK@oU6r==F)~D=BiKo1ml94(gbxG>R)F)D3O}&_E%+#MHt*RPJ`z0I? z2Hu+Os2#tx?WS8Fe__+i-Qry~|Li$;`aGNg<#hTc9xD<CjyQHq-H-PXI_w<Cv~S`W z|1^LZ-^62SF}{g!9SPX@#vMXf=Wp4|4LOMPrW-JwVHF0f{Ep2qV9MHXzc|+vr=1(N zaFtNTm=w<vFpicbiVqMpJanWu|CE6b4CLb3m^@HDcBsqaLo}LntW)u!0uO5_;rK8U zz9Y^LL^&@hTjJwQ9Vnh>%GnuTV#1Hd?-w+%i}GZAiwVC78T!T56?$^OxcNsK9M*M9 zZPoJPl^Vy_>9;}8m-Mmt24o;nDt{Ts^SF4P#*|bvH#FSli3ZntLi`IjPhBt;EX5Mg z<Nr2r(;4l;;kx<14gQ@y`4N)~KRwm`?muPv6c%RY|1CgH^8XgHJNsJ76m0~xe~+a7 z|AX+O#6LsfHh`t2eu4%y`FY#)@A6TI?}IGwq8u-mc#0`YOF0d<4E!k4)=$gp)`>*b zH6isgStzwNX(1=?TwGJ!c?bTyh4RySwh-hbEi|NO3+2U43!&%sY@s}S(}hdhB7V6R zx*@WnGKw#Dujoe9f5Q%=pBCh9c*KM!Y#O2a5VqOm)nL35ApG$l)5^c#-)i9=<}b1e zO1D}~cwQUBq9wdnu)Iw&Wro|VCVovDU+OiQJKAKuF8IC8sl%9i+FT~h-MiCFc+2i| z6W+c%L#Kx(d-&&ATCbr!#vBI39%ByUu<?IAfc1;_HXgv@ojS3e{wJg-98G>?mj0y~ j`nKq)NJOfSCmgQxd;#zFmQ^$oZ&*mG<nQRe&e#6|BC1+! literal 0 HcmV?d00001 diff --git a/t/images/DPX.dpx b/t/images/DPX.dpx new file mode 100644 index 0000000000000000000000000000000000000000..6a9c7017f68f3addb900218d3fd165127ce491f8 GIT binary patch literal 2080 zcmWG`35Z}|WMBw0)H7fJfx`_T5-7q3WH18pw<VsriRq~dX_+~xd5O8H3NQdtM>Sw% zU}#`vU}0ro3?hv!tPIV-W;++9CYIzE!R&<5RI?XkP(V?BR%&vI0*dbx6sT$kJq&Zs zFQ_caOwTA$$jnR2hXvKp^T&TW0${uV(>e!`ViSSI5y*N524=7;j2IcYKq|l(s=ztG z1*Q}$O-JXCS~W~V0BgdclVEUwXOL%zu8FsTi(`nRv!|b{0*cMRqT0{`MFf>YN|d1L zWMD8bFmY2bP%tzzM3;f{!Nvo5pj^oS;=pAFkU@%{k<~IV2#CV`fh>-X%?S22J{82v Vg=FOC7U$<FIE4hmDh!lR1OTB2$cO*{ literal 0 HcmV?d00001 diff --git a/t/images/DV.dv b/t/images/DV.dv new file mode 100644 index 0000000000000000000000000000000000000000..dfa7b15c5699945e17646a34ae2d2eb501380d9e GIT binary patch literal 4400 zcmb_ec~nzZw?9b;7YN}Jh!8Ol5Ku&9u-FFVLllt!RU&mjgl8CP!P+(mYMuio0SqF@ zMUcTNQ^F7eBp@i@K*H=$M6}jreUcCrv{u2P1`6ce1pjz{^;_RsZ?CNEz0dybea_wc zoP7=r0$qt54oCa{MC%}s1+<n48C>~1W`R$REpQF)^SHt1@#hQtA7@?%VX_QA`$3=m zCKkBH`182Q0_Xm*!2dBG69Vi3h^9@}p3v%kblyM0|E-Y;Vg4=VKLIcy?0*8+vb0)z zZ7dF&)5d8Zj+w`6>n^MQZvZv~^lCEOVB6M`dsl4gWVgzH4&NG@IPkmqfqf0l*S9k_ zVmEj(Si8=24OBjyIdGwf9vffU@Ys0$rpsHl{!mdJ^=+Jc+0RF|2l#}kzD6KGXsdqn zNI)o!dosVVe8=&&lJ9b!u(oQ-4csXcE-!zY82vLw`%e49bT04t+n>}wy@u7Je|4$t zu4!rb`87FGi(UKv_1?Go+54Emlr8fJgdtqQ2cJ!jJ^U<v`5sZ%;nwtNjH3IuTffwQ zS;?qu!KZl)<}N!Jcr%G6o^8#n$``6%s*`rDz5H=Gr9?m_ww^k4Yy4B=;V(7i0o_Av z1i})Uj9g7(rnxT$?nb=mcWwm2pu1$E8;4G{+K?yZ8+F@OjwPSJX|!>wq=}avZbut1 zd@QnEW(dgn79{~@vlT2bT~7cDgg`igs4SIH8P6L!qD(ve2vlQdaJNsEdc!xZP)MZ! zirB}gd?O6BUV;Oa+!e{mwRrN&$w#QoNEmnF*j`<nc?ZktX|^1d5XgYg;P&%m*~fj1 z2(O2<o~^Q#GZ)Q2Y?$*M9XS1Ds7)H*@n=6^T84n-ug}&kPS||sSK<%HzO`VmBgpNG zhImTeneu^Yx+Kr*)R<>{2?F5>@K1m4nSG*tT6XQknXX)4?Tfpw?mj;;o-iLceyB^j zM|1n_-m_sJ9?ZM%mwOzYju$`JnFY;pIqr6+|J9|A?tc2>*QrbU>*14~TxBQ%84{XE z9c$R`DRuOT?%kuWn(99Oe8A(#)6v}*LJzMN69c>_l@1-_1nUPm-`C?$1qS)!{Ve{X z-pB5<bnIA4DO+-4;IHWl(N_nSOkX*=6M-OtbjdHFW8<dum`z_E>~xWt44u|&VePm1 z*!%I+!zQYD8>822ZRRsmr!P&U0zXz7HRut?&M@60g)HWiTl-{dch*fi!JAfk9*9)& z5y*&8$<6W{>-M}FnzL#dqoWc$OKCNuMk;#LmuPKO-1g|?yum!o<%^!XRaJuGYt~rp zpp_37&Akyh;#DwD<q5!CwSyPRP(mPMLW6Yo!z<1+@1wj-3VKL&w%26d-#_r#b~Vg! z&{TXuq;|wzjPy6yHRi%<vM9*T-+si#fbG)&0Lgbm$u!hO`P+L@agk0y<C(y+a)id{ zemh7TJjr^;X(B&P$pyUJM=mOLpQ3?VI85iXPN>$fP_zUP#NA#uay(R;I{=WKesMUh z(2Z-Hb6ND_wHUxbAOb9bI*Yr4@it5I!*o8}5Dw;Tif)7HGzd%gqna)#XuJ%iLOyoC zpQRfh6|dXO)d^t6K3+a%wicBT$P{k0Z9RZ&O4m}c_IvLGDe$zTD5jZm9S}6wwi8nV zdEV{GPhLmaH03(v;Y#!d^pEVOtgct(1@=!)w^k&|^uq{5goTj#2mD7Yt-t>cx)7nM zcU;P74V|n92o374ljNQG>y?%@av+4D;qe@Q3`_58Y|bDPsqu25e6E5N_;k)bN%abW z%;1_*1-W<xE@Jql2sL9hlu+ZrgJdOLJly@evL<V!mPWI(F;3FOs4hH<Oet~vi!g=@ z0P!53qCD;)(q#NyHHnpoZQRu-*`ND!N0;>u=F7tJ4PQsoqFLf5X&mF$hq}Tqt7{qY z>kk>OuMhDvX{@^u8#jHfv}s51_KRgRS1O{q=R7;E^CJ8^8=9=ome{rg{Dwd<+(<6C z@XB+Z5vyAQkSum~6l|s*q004|0HG$i`>*lWB^yYxz6s#Srxdds7OGj8d-@E`mL{{% zdITlJ-8WMY%Mr*NZor;AZx^Y<>!<;P4U?_IJ(26RdTcrv5Y{Xxpq>x<<h8+amfl7} z3^NxhKeIF@aCCYDib5a~EEN=&519JmA0+8YAma<tMRur3Pf~vB`YJ)9#mt^u1s61D zIziaUshZcpOHiv-Ns}K({~4O9=W^SDNpwvJWC067p-EWQ(Q<y-%CdeS%#L1@sGLt& zsJ{?wBYu&=U$L+b5yWRWZdCQV%nq{vFfQP|UYK>xp^+B=nHv<0A&@03vS@k!GR~jS z^T^Y)0aP#MzFz+(g-6c)O1bWg=v=eH%jbjY1T~w2*4H4I*|Z$c<wu(#+91Kw0w1Mt zVT)*U_RJe+zIcQNM<6oX>XBk!^o*ncTr(q!{KmpTql#Fyk9gU`0O}{1ZNtq31KfpE zS>RPNXfz1CHQBoBh5d*rj48KTbvvVhzcB)LO4H`y)OyS*9CI0g7QxcGLjw0gI+30% zNG|6!x*T-6P!UAFN@(V6_LA5Z7n|XlBkmgP2y%;Sz>3a<XZ9!fsHSq%`z$Nl4p^7N zec!jvxQ?~EP<j-T=?G*6OSvUUieN$5zRi@R{Z=w;1=Tlpv~(4kApoT5ya6M<q|;<r z-h+|E+9|m{xr+*dblVyw&8h?Aq%E%NF<b<)hO5AHr>?~m!YEgbZow+>slAvK${Gk? zjDpdQ$4}~A0rB79P(LBQrc#k+L+k04qnc3x(_7yJz<k|xCI5Ym-5Wy$qQFwyt3IFH zFp*f>sLct99ny<$myHau1GXRhI;2HHE&7_cjolYQUK<*aEG}nSj2Q`o7_$*|JvmlB zFRTTct{kS#OlL0<o^4Nj){Q`m;pWotV>Q(;s0KXe?i?4H=*s1=qM4Wskssvqq3z=9 zOWDK?w5l_5?==<8maC)LRI2+IRCh=A6)VZ=Kjf}a(SZ}6YF!s$f^Eu{&=JT6ZZq+` z{`d$DA=+%2+zPj5%N5h+-Q0&wxQvV)Z9px+c=N_uD6_IV)2-aXYaEK<vd!+tZQPbE zE}r;ii>sfN$<!xD3*gL9a(*Nt&=R;2%e<E-5NamnHN{tK8u<aDcts7Z|G%kwo9(68 zsj4JJZC~$@BbqU34iz5EIR@#kb3kr7H9RYyLQloCtK?|iz1dSNbpKJ|>U3dL$Ab}J zIEjV&RP(n%i#Ug%^QlQr#j+|qKaO1dk}d1tqPD66mV=y?##3L=ofqS(B7StccRG3> z*%z)W=<$a${z4#IxMS65ykGXBHehhW(Bf#Ddw){j8g7lCj?aD>(jrX|*<Ts@z@YEz zcOLDe{(L3sRdyf7SF-n#)@J3md%wS(X>dRMQ}gb!6RUUQA1q>jeovmyr$#=M-27B8 zlM;6_CFe@R6Jp&fT6Rgq-XWWzZb|AS!EndgC0}iIu-};K3!kZJ^!IJr(l|H#O~Cgf zO*dm%F8A7<w?+3MkR2>*IuUK*8*5fb8VLFjFI$x+>3Qp*wg@!K_1n};Jn$NVGBdfV zH9xZBno0C7JeC*O{$?cZsiD=X(z%1RVWn!0rq*IAaQkX|>S_d{p%vX?6aEa>zWIi_ zC=hPNDeTqVN={^A??@iFlmU}*wSkX&<ZfujS}tatWk4GX0vvl#b+JtmpI+#Rj(>76 zACFg-<L{vLu!kG7??WE%aDDe#s0lO}tO#(Y7*8J4-_+9VJ?neqwNomt&L-vWBn^+a z_sew(AiHxYC3<PvGe^&L{lx*UHaHc!a>b@n)z&`m%RrQ0mZ*Fm;GTRK&jmnKa2WG; zMAs>GR82}{Cq~dJyeHRYzW^o<X{lt+wy6>@x4eQ9Q$-6Vk08)e_>$Xv?+Afp-A;`- zdiPQ1g)H%9yR4WDGU+%SFO%**bi3Obd6sRmA@zaO<GUwK*pVrV^#Dm6w!Tr+X{7j& z#t?tHeqbGa@%6<q=McydmXss}3-7)0byv5K^@-{%+!#!L%lnM^HMqE&63YH;Dxsaa ztcMsJ8BmWDIJvlwR6h9ur<RqI#2e&u!DY6zq8Z0}Zvjd6E_ecgoM1_QYL<LFmL0## z^sM8_deTaBA7#7h5bchYS4;y`oVZ=?owl)g&!wv&4Uo;A5QT!SY1Dna#qto(<y2kk znpxhV#@wG(>CT5UEEAl?RK(BePY2rLFjNjkHP#cTa{<k`O`aUVJ6$Sun#r)>JcmNl zz0uJ7=<KY=oC^z;G@^*aowz>rNi^OvScqq`RmbUxbUN`4+T%d=&~Y&Q7Rr#LND<$h z>JcG|@9Rm?+C_?TgPCUeiY@;7=e)_HotA;^`%%=KeRkzDznmWra}j7c+%Dex_V<0p zF;nTMc7_^DmJ}tWI>or=-!}F&dM_pylzGv8dSmIyroIWa`3?-WNDXtUaw21di_Cu8 zxAxbI=Wk8Sd|};Uc>412q!|Laz+#a382^C@Ls|dB1)z=xS%zr>ds*nb0Ejc3XU(j+ za=ilTvIo0qJnn)5;KJmT$;A6gAMW2v1DyQxgAL-V5oiT00oh}JTE{u2_pnf;gkLfm z4$|oQ6ale-O8ss@L~Y`9T%VAOr{$ri1AYIUO}Er>^nJQCr0NV|f~DKfuCR=cIpk`V zcREM!*Mg0nOrFxr>+TEmgn=frG~QTzS_ujUEt%2rQ{zEgR78nFId9xA*GZaM^YK`{ zh(If0VJ2k?$D2KT&FeI3s|MSLo=r^J1})DGdjv$8QMTL(RqZ<rS}IV@C6djf-&pEy zZU6|BI%kzuWD3A+g)1{~sFd!9=FbhT&M-@9rKVEpou~<j1hEEdL(g;c3J~%j%=$xa zIs-~V9JBX*;FDQSc{d9HQ}=_o_xi=oEv-eyi8>S;!ZC+EmG`dRDjXall!~_bGM=)3 zNbc+UF~a`WD}TOg9=upCdc^v#sjX4d;+nltOwGfN6Oqw>l$~=EmS=8^{<ij-Sxsxh Ot1*{`&aj9*1OE%HiPF&k literal 0 HcmV?d00001 diff --git a/t/images/DjVu.djvu b/t/images/DjVu.djvu new file mode 100644 index 0000000000000000000000000000000000000000..d558c9b75d8708bd8011eadb91256767e7ed1518 GIT binary patch literal 930 zcmV;T16}+<R3=nLPf|?)00WjpN>)uoNm5M!001w600IC207w7;0IvW4-oKe3A;^`; z-*9yLfX&`x#qB)qAEI=h==CsO_`0qY^qc@jPf|?)003S@N>)`#PDW1v000UA2mlBe z0Av6b07*_mOaK4?4|8Z?a%E&+VQy}3E@@_F076GJGynhq5dca70ssgA2#V(6u{YU& zDv1C>M>I45000C55BZ-$M>I45000643Pw*-O#lD_>_kddNkL9jdH?_d;Q#nh`h~hA ziG)#HZldk0Q?kk&rv?vH&XIV4jY82MnO)TjjU(MtI6F&Z4Q?rw{w-vK-#k81_<6&h zvGpr{A3tjj+exNJuxnabg)KvRON&<Hi;dmh^K)N_@#`iKzA66nZVzUT^GrdY-O#rx z<-0Nd`p@hEqH*p-(rlyxt}$8j<<K;Zk*J)W`1EZhZ(kv=Z6|tOwFlr(unD<-<WrPB zZ{N47uUXl=eO$I#Z;2)lFW_Ro@J9CiS_EF{T(xsMpnoJma@t}Y85Z^lX#1dBVyM%A zAFlUegm)~P=Du}Wx$<Xl(7s%s%eSd9q<?$d_v$eIq7z~)Ts>}9n8U#fUGhN)c#gj? z)L!Hc#k}yU^3f{`|A8U%)WFTvysMWv@saf5pP9lkYxIOld^}Li<zx&!>e>xy_I8=P z!jL3>L|OOOuUg&TQne7o?ab&$;V;bR(-1QRD-g=i8FA$gs~i0I==b-=Gc~ue8S)1> z>a%uT==H;3`SQ@dm{YtJlwDSJv1w`isg=sm=Z|?0fH4x#AJE^xaE{(EeRa{w7N~@{ zT}7C+`y~H+clYSW-OP|7%9ta@ctJOLXw8SPn;dQpJuVRGlpo!=5O>CjB2Bo#!;^U; zaV2QWS({}QEZ2Xi5HKl1*k`|wGZVj>Z<TYNvVYRdKdPI7jN$2n*mx01HGZzVcqkxz zONDgQ03zNiW1B_JQ*CMNe4&8v>+tcyV&kqrcAQv}shoMls_u3B%qxE58K|W*ytj=f z?;!Y5lNSUOXF+uy4<$eL1-G;98c>mA0Bex6S*RJur1AlCuG9%+=|I6}r$J*_*irrp zU9*`{CJkv){}mjYB}bD-Z$kTi2vx5#q)J6~$Gajr!9c&_(i@1q4zhjBtkLWM=KusA zMS-&X({GLXseM}+*D?DKL|S!0sJcAo`EfBo3oJm6!X;yi9!l#P$8@zvtp;;ODvD#Y Eg}@87cK`qY literal 0 HcmV?d00001 diff --git a/t/images/EXE.a b/t/images/EXE.a new file mode 100644 index 0000000000000000000000000000000000000000..cf0fcea87950633320c9c5269ae466217526f7bd GIT binary patch literal 784 zcmY$iNi0gvu;WrT)HgCvKmbD%GXql-Gh<Ur1qD+BL!bmi+R(tj%)~@N0fZqSfh#^< zFF4ZI#nnwA*gq)5)rA2FI6wpt6aX=Z9bZyZ3E~3nF*Jf{1=3J^j10}O+hYb-oxoL+ zT3n)+4>Sb`&i{J*kDY;mkr~Kl1Y#B--T-1K05K3q0<i^%j{{^t#V<hB!1zEj89*3h zE(pZOm!wvdK-ds|h-*X$f)8V{K^Y+PKyHBp7KR2m8_0-{PtMORNK7t?FU>2@%u9)n z_W_3&ObsmD6rch(faZbRV!;IQCy)tbAwYb5YDRooQDSZ?L@YiY)qNUJr4CT~2h=<$ zmw}ss0p@kEkP46#0I|5Zz<iKp5<u(#wLbtzgWL$z#}EL-$N&_SAWRMj_2_&Wdl;b; z8lD)&i9nSwR|PRJRtPW(@UU}C0ICAHTLy@C{D%Nod@wlj3A8ae^TPQ+H9+NTAcOgl IO@}5>0Gqr{hX4Qo literal 0 HcmV?d00001 diff --git a/t/images/EXE.dylib b/t/images/EXE.dylib new file mode 100644 index 0000000000000000000000000000000000000000..6cc4f058301230b47ac8c058f67c060d29c47571 GIT binary patch literal 4144 zcmeHKJxc>Y5S=s8gc!*c77+zSM52XQScrv{2MK<lAwmjeP?BIkFAyRosnS^39axxu z;t#ME|ALKRp`De5IPZ4PTtdWNc3^hC_TJ3CtLEwR{VPUfMTlrjbX>GMLUc{Gctlg8 z>lP7n!6_E}RR5u_^>R8EOd1shE`+&JZZ?#!;(k0YrD~V~f;g&Nbw;TZ4w*0AtEyY# zs#~c^VQ{{##>?uD5X-ZE73T68SL!DhWp!l`?^)xeH3H(`ZNosp8+tSE<o33mtz5ue zz}J9X)ga(a=>Cxj@iL<58_qjLXQk9Sub%3g^F*BhL#Kut>5JCj0+?wDfSVB;7mNSD zFB%rq!@a|`zx-*rfIjV-+kQLRc)Y#eJjn09ek@21b5J7T>v9kyC$cDtx~=D0(lO>W zVi+(C7zPXjh5^HXVZbn87%&VN2L1yBhuNE#;|I^fzBQvC6t>vgup6(5h2H7C6h8LR zq-<(-Z(Fk_B?pPL^JFz`%TC7PKDbKDV#keoi{cUTW|2~-+7DAQM6j37k$;cA0bGYb AU;qFB literal 0 HcmV?d00001 diff --git a/t/images/EXE.elf b/t/images/EXE.elf new file mode 100755 index 0000000000000000000000000000000000000000..2bfae40d2d69dc262c05f923b2ce6a5d17f84658 GIT binary patch literal 2860 zcmcIm;ZIvt6u*VX=oAf`sJM{$Ov)^oytTC`(;0EBQX)|pu(1%Rg?6-tw%ESTEoKpX z@}X&(5S>xu2S@yZG5X0UiJCCGz!tv{{{d%oNf&YHhiUqO?D_k>*K1&67Gpfg@11kc z`Q3BQeZBX-z7gnq-r;ZvDK(;2a5Vd-;`Bqe)Y}oiP({6Pi+$oDu?sH7{IlQyS78%% zfCAJ4O-Rx-r#OlGFeVsdZo(4G6~Ivh2+kLccHHuvM+~UYk4db{cn#DD_#=oBmoX+7 zXAQy)z8kd(6=Ooi2CnH54F4u_{=w<^#KGxE`*b{+J)>n(n$Mn#(pK+1FAiIC*$3zB z2558LT${BH)hcQEK6~Nk6}Yzvc~VpuZPmd?2<(Nu59oYLakA$<;$9&_p{YbF8OrG4 zv>plxv^dGuo)Dqlm*9=Wlc8)T8Uc@?DlZX^Cq++R?~(41PxII%YOEd|cyc`ir7<4A zhpTwn9t!nc#kmW;c%bW{{nS|GaPFG1;Vi{LE0y{96u~P+VRpE|Fk2tPlPSzr&WzE# ze$|AuGDD29>+2XYK=J-Ip8Lu8rQAPsEH-0+F^k8*@z@YlX${1i3k#?@Xly7Y@<->2 zI^IwIolV5%f6(hnZ^IZFy;5ATq{^Lrri+bapIz?925IlZ<6@<zFk&tqhW}9U^uvWO z_A{Tc;`o>@vuU2BYWTI%Y8?|ej7!SsSh1k*7lm&gCEs5E;t;s=EBfAL`e5u{Q(W|! z>u99V=TfjF^VQ8|ZVOBqI5}1bZ?Z)UZqIk(_+V)qyt(2Bd(hBEOX<B^rdcplEG!o& z+eTZUeDPelCO=%pq7Qh@+-l)V*3JhSjWtK^sLPoTG(ai&fHSAK%m<8B<<Plu_DADV z%jkG$te9_cRqGFa%|nG3x@hT&sW%wED&~5=)~J}-oA#2c?@_*U>_JhwfVNKJP22mN zOS1)iTEC~%^kP?7d#eH3gS!NqOEhCY|9;C%1#u>MMwXy?eqzvfK?i`l0q)8B0Sarm z@Jp~7{Y?OR5f1_?^3raG=9%H<;ypu+R#O$^MNcXAQii^PG0cB0ykq2~anwoz*0`s; z`zh6p>!3~bYhKN(`aGT|Jzh_T>OK~YsKKyq``bHwIN$$??Xz-wy*~f;+`e}I4!QqN z_8nHKWnvjUt%oOs7EkKY^o-DwDLtw^cciyn4^IhgDw)+{;Y>_uk+aFn*@Uh2v>iDe zO=se%<hDTwv2=8reA}3r)|owyryf0n=P3*jN=3qYSZL8$=u|qKhze~|Po*;`V5?Uq zkqAk`iTET6q%aW=&B|uaoXCJZnMx$0NnQTpch=mq++*CM);A9W?n5bzQRw66lstZy z_>EFwOW|Elc?9?a`;|PNm0*=8<J80ffVIiv8H$0|1)FCJrp4izc^u$5B5w)2B?Nia zq>xMD-Ouwv9?!}R1h~;<UHXY2!1G0$XRHFA3VUl^48;jRej9m4n=xT)KIY~4<t;p( zX%#&7%{bR5dHm?GSKb-CQ#|1D9*`pYjKCpzLGXg$c_ay%JR${19{=ymg7-chRbda5 zEFgKj!<sR<#fsPu=Ayg~kcTwF51t<Z-hWag&wxYny1?r~K*q?GcA?7SZ^x^e|B3j% zq)6U*IGB$-e#H9zf%oAS9zRw?;K>{a{bgT(&3DXv)_*LJF2m;UOW_>$@d+U7^8bPg z!tMDu{(K9Mcex8Z-s4ipA-)1+zE1EucgV*%-vX@9{`l=a4Bk%f<vYZgPYQYbUn)hK QvZnO+WAWe10kq`(3HCPd7ytkO literal 0 HcmV?d00001 diff --git a/t/images/EXE.exe b/t/images/EXE.exe new file mode 100755 index 0000000000000000000000000000000000000000..6860e2772adead26e73ade4cb8ea18b4802a893e GIT binary patch literal 5120 zcmeHLZ)jWB6+e=n8+oxKhd5o>0(}9w^Po0T;&jdysN848PNpOxcARXDqdZ%(BcgxE zPi+kG(6Bx7rip269|{|zCLIfG5Eo3NgluR@TD8zZX!F5YJJJtxk+HjmrW9`&Yrk`! zBugr6l#PwC-1NM2&$;LR&YyeUwO$W@H%)a!B!LPAq6|0>r+EJ3M*_=Rp18h+<{RGL zl`*;B-ZgMGFfK=9k+GN>l1J2VIHJkJemNEo%Ym@mbF^O$MST8_rlv31iqIYxk=s;H zEiJG0mArjG*1F9ma~D~lX$F~#oaZu#qbuq;ZWD;P7-#T=pzk7)m)O9zyg~3XW2Jz) z%K#pt1Q+5zG&(f@c@4hiAH##=;#|u~V2*JH|8@9OO~qV<E@Q&AXarRZCsDRzczm2y z34Yl5@%fQpyMO^Ga(2Ro@wR{}hLi1L<FOIwL`_f|5t|5N!;tMZq(`&=#R?qP7pGP% zvt)PDOja|!b#HRrdeybwntf0xjOs2SG(CeCgN1vc^_*n$G&?EZ1C_oqbPM~3mU75E zZ4Aiyi&z`VaAVy{x4REM+p8!i_UvwV^|kjOavy5%9q2pOu6(EW#K9w!F8X)Ef59U$ zVru?LE@bM)*O(o5Wc9^0gm{gcUf*d;4q5aIHc7w#@He?SZuD7_os?5-1&o{`$t_OO zm6q9NAm$WH0>LJ?TZG9@2GkXKR)VPaKcy>eNdPh$`+b#{MLZ|<`06Z&q))D)Dw~t> z)#T(F8>QENe+Gy-SEd^yHMwwY6E@{sH(1QMvIe_tus00$mci~A>@G9w)%pv7dHAbQ zeUtUo`tM<WvDciM%;@`V`D?fatXH#BE7Isp);jY;b|Bd})%<A`btbF7Zk<j*)FoT~ z{q;gY@3iHoA;VnzX0FF(@oYngJvMQjU@Mj=zYSYc&y&8F^GY3%F4+aQT=IY~eFep1 zm_Okv<QVp1F9JXq%T2|TH5mK6%)Vb=p3mQhb<O(m%oDu2c;Y%=s)PMgE2nT`a9ljk znLobL9XG$CUUauzHoem~@v%|R)Z`n*nuvnd7RGg%{m!AUtXCh1!h9BQbi9-Df2!Yk z?zDI47RSC74)-nSpTs|0{!ss{)Ia)S>UaiW3^?9HV_Ud9&v1kTICWqKfjPC(h{`!c z<Ra{p_GBsE#D%s@x3-l-{dDSE_V{LfAvv`6=B<WzmzVSR0aTm6@ji*>0sKce9zGV) zVfibtuc~I+=>Hvhd@UKb=tHZeQ{#Mo0&6rrb~hCdv9SGTPA7eTWezK;Q#O$drlg-j zGT7lYcHk{pzFYKDXr0EEbehe06k1=bkzcBje^Db}tdhn1h;mBFp~ji_tkWyN#9PNL z;dt|UR7jSOP}G@hPHE&nYI-uk&!2LK=9H&idK|r}*ncZni;U*8PX8QB$*Gs|ykvtS zr<})>k~l4;&n^tzG8n(FF06W*g>HZZv$bK1UYApLG~?CJDLWr<_bc*)?aX>UU{-tw ze$3siTtM_WrPH`Jx|(G++fTx;GXa)=5zaH*zI@U*Em&^mu$Fv$!$>wxDlakAO-FX> zZv|~Ze^;0<J;Z6(oNu9(k8Gp<xL=ZoErZE;b3ZD$@7}mvecvU!CH)iA&7^7S4;GVo z-@Vvho;!`Zsr>$k`)LPvG5>TC?ZS~GL5}>F{2KE$RUU=bA65A;w7y&=1FzDY`|%6O zh1PTxUZHiqMxLvYGd1#!Dw+K+{ra!vIwGM$8t2S|=VJ2c@o%d@3y_!|jsMRI;N>fi z%iToNkb@Pv+tAHb$YtZ=<TlpsfEGZ12CafxuxBTz4YVIr8hw}#fX;xT75aY_!%kjr zNDYM9Pu#2yM`9XXF^{OhU}S`Ki{_Duu@?eiZy>DsV_`K2-KyCa40=amn%(O?;Bh#j z{+JgZt|NYYMxCe|jrsjVUzI{-j8Q47osIcbpI6mJBe8Rg`<etr(TRz=eZFoj5<*^A z=s+M`6yB#^zsC9_YRHeZqbA6QBffah-=~IsLDrG;pOcY+qXSVB{>)X;w_V4MxZHbo zi$y?v(XqAs?QIg@nLCP~k(GKAK=Bha!Pu4h2K-R$gYKjU=Z!!6rO{T`iRmEqlNV1H z9mDJ(9i=0X58`<Ma~{8wK3?Z9cr!?%I(m%i@hQBC_%|B+1iav2<?#bEPy0!u7zHRy zV?YZ~ko-Un(<nu-IxKAL)QPC~fja3~@mbu3k7pApunAF=RM<}-8Wj=_9K%Cr1(uAg zRNy}k{RH%b^kwWT`RRdnoJNHIDB=hJPqZI0Jr8M=2B3)`CK;NOAQ>9oqhVG;VSl@+ zp#pahHZfRj;5n!RHXXDF)Jem<h1~Qw_HeG6un!~BU_}=FbPfnn{F{I`4H@~tUl1|+ z#10v;N1!1(MB9MnhIUM#aAkNOS9T0LHQ0P!CsP{`z7EvgsH&a1I4sQTtFQ)uq7r)y ziCUgRW<0_o5~JSyKY2{(1;ZboCg)PB5KG3%7**^5)_G8=1|IB-z(X9-XcZN}JtNL> z91#ZKRTe(E_9`e^wTtL!aR${`wI{I`^?w@l4NzC{9C}1HgCe(5#2Xz*WE0(MR3VHg Rg0QUYl?G{!+xx#d{tg<%c=G@N literal 0 HcmV?d00001 diff --git a/t/images/EXE.macho b/t/images/EXE.macho new file mode 100755 index 0000000000000000000000000000000000000000..33a0ad62cf64da15572fc340258a5bbe96ee6f51 GIT binary patch literal 9484 zcmeHNUu;`f8UOB$ojGlw-U!gGDZOqhk!e{o&>oyM8A;Wssak~&A}ydwCpXt8$(8MU z&GmI_4_mR*4z08gkvbv7x-2SHv<EbGf(OK=E&?%lVUGyV9)dQBAv$SNL8?$i_<h&c z_Qi2B!~;+FNGIp#@BjI}@7m5e{@2I<e2<78!Q`Q0?jedYei2i_ObT&s{M5v^C%*A@ zCO1aB0ovCH2+&im2{An}GaY2JPD9UI9|D1$c@BkeWzlWPZ`XfxgD7&8s0XVTt0!C~ zc3B@n<V+)9%Ffvtk#`Go+ie{D5V2`QpTQcmK{34Maa4$a0T8y^IOIFr$1CT|8&&db zu${g@92~}1cCax^)NUif`aCrujJ)fZ)&gGe=wKrS@(tMFwHZen_G@u+e0m(5=For| z^=Q_j3q-#bDc#kZ!tmWmpJ2q(4f<{>36aqosm!@fCmYbGLD=9mXoLG=FD7&>6tZ5= z9c-M17=noN8nn@k*I&SdjZ`Va8S+Pmy_^TDA2xUm+Gwc2hGA#3w$&hXuu%nX#OHHg zGzRkD9E|ZiojpBuX5!@O=Ckn>$ec$FGun$ky#IzC+xjdf;-lW7Lf#q5m~%s|EwTL5 znEOwS{PjsXr9@e?DF@kamh!I59y@UiI_4ZC>wDZ^_eTk$!w5iqA9T+7ITi>EesAEp zFF<R9iQj_oSR0XFa{jTg#5Js}&%JdUllL}2#Lsg$!VH8N2s037;D5<L`I)`NWMb>V zbb_8v!oUjNSzk_UZB$>t2hEQta@-*0`R~S`Dc|~2-{>rno_>rfX4m>uHKHwTQmh<P z*WamaeFD80^wv(iM$x5@)b(=tK(YMlkz)DI6U9kV-W(A`*O#Mrz4d1F6L0-x^zXb@ zPjrvfmhqW`clq%<)LXgY*-!Yqkxslxiu{iGwdHQA;uCDB`k%U!ME|JsqYpaqN0zWZ zBRZX|(HP>BRh`C$E_pU$u>Bn8!uOwC!6$lcl&Es}OmXN6WL7CPJVrE(e7w{{RHlbq z&;KetRaR%-@Lvy&-Jw|J%p-lnX;N6X+|%UI*y`3FhQ9CF>P_w;1@XqJ2kSmp)ad=C zckdOeU-I|0O7Y9x6k#9GyT5elgW}SyzZI8$eXp2&mm-s-eruAtDqM@}f8Kh~UW@u( zyEf~4rBV%hZsfSC&|)${v*lRV`X%U2RY~JI*V5Yg!K;YxdlX|@a*d{v@IQO`(Cy?b zsmM>{BtG<kj{_@=xgSO$Q|;BxmwUR_8SB^L#J%F%oNe@u*EjmsU5=G|g?p#`%8?@M zDeyCZJzas_fpX;lXv&i-$j$XvDRR9+sE>M@_rFr1IP)5NcnkJ;AK*uVeaSZ1{_zde z9P;HGN6?dMbQm=s#5dLztmDfxU3&tt_fVuvAJN!N8U&7&X_K)A9Irfkrns^fxp^F4 zI(ukf{3i9IcM8lKHYq+xsL%4&+g>eUvz)5O&N73jC43yMty1qG`W3oyuEEl;?iG=r z1h0^bHur*Oiub~~57w2RFYM(uKV$Io=IGZr9`!@S6hlnxBff?`44@w4H5%mFR}J-b z$m*~?<Ml#<&VhETQFHJ#=AjSHaSt^7a-AFg*>7c0T^~)O-w{{ss_OO7a9SPX`f`jN zWHjC*WVBsm$d~c@q_Z7mvo51-?rcZd@MSi3ky-O))^?Gp`ZCpBWM+Mt*_~uwysGrE z%+7qe|0(?U8+^2t|38Sx+9~{#>tw}z!7}mzx}KIIB{O<SrdX(uk;1f0*VHrS3(^sW zp2@H{O)p9<Egef{w0t3#vmIBPw;jy|IaRXstZ8T&(}IL%<~7T9wVWgK(sDJ|)|`R` zLC|xKz2NBCV|&<Qa2!gZl`az<#M=KuOgzH<`2POi&Y-QGFxv`8n1L_@VFtnsgc%4k z5N06EK$w9r17QZj41^g7Gw^@TKxAJx-_dF8w%5lI;65MYw2KTJvq8rD*L`W<9#8%y z(0}0LYrsGC@e1%Cef%=;T_58-LFxAK4d8^2*MOh(@h#vPAHNP<^6^iAU-9v6;CFod zGuYSsIAb_6BcJ|r&>vSw;d@35^<m&TBs$x|>fwOQL;$A)xD>#z1@LcLm@c-k`d$kw zo4~$b<u5I|`ui4EJ`Tv>L|mE0`~WfYesDsg?#IO4s)`fHt}kQa4!R4uiToJz7r0XG z$93@+;e_v6Kaa`y5GHi!QB3H2cgN7D1DJf58^oWchm%|C!_+W8he={;X53jY{PhCP zwgjIj;q*z8kk$p$!96*MX<5oHI3jgXcjmt;9JyfP9@-IkX}G3s<@rwCU38?L@{YQM zV;5Z0f(emb6tXCdf-A)$*b+Y-(DBm{(<K~)xdw9$nPVfu(ak(mI+F1N5UB0S6lMyC zW2RezRK_;aLeJ<popWR^15(NsSsm_hj%Lo6a6X4n>$_~@ST=TLAy90pjm1ZFe6lB9 zncBu=C1G0zf`nRLe#f%&ySVHi(B`>=#I^uB$OPh$j$_#<qnB-O_k0f7Dvl!!X<m>b zuV-@^$wh3`c_CxZ=@}6CrwOfc^GT<`8KuxuD0Eg|;0o^`;>fHG+YKqtbG?h8<G0g- rbcK$zdF4Xi88V;0h%$=$&qI8vyf0O-I?L&Es0+7727D6pj+FFoO%jcx literal 0 HcmV?d00001 diff --git a/t/images/EXE.so b/t/images/EXE.so new file mode 100644 index 0000000000000000000000000000000000000000..c4c08ebc9c8711418f867a927556f436f4ac0188 GIT binary patch literal 5608 zcmcIoZ)_A*5TCoF<rHWuq9SP67)b<V1LcpXpm!XF0}E&=sKI1=?QPpL*E_x4nqrJL zDH_m_R6iKLNr)dXCh8Xx^%Dv)5WWx%1{0%A46%xd^aG~;iRaAQ_q*=CyJ}+MT=wS8 zZ)V=idpqy#?t7`Db9+1%BT#}KB9VIL1V~CNCX%|rEJd5Bng5s4VrAPjqpE9tqm|%9 zma>r;&3sL0{X|oMgHP&|rZtCOT>G_&GgDi$72%`W9vo@QaO4`-dXwL+dLaTATcJm< z_<3m`(RrGDk+LEJhu>rDr&H7x|IEU9N?!@ScI??tZ;tK0(Ej@7qtn&+lJ_1zaOuyJ zzfVd}qL-9pI1=ahX)8u^Qac5k%h!#3ee(SqFJw9{{e1ZSBl9jl`@|g|ADe2q`sFVz ztolbv&<$i^Alg#mSPi^Z&4S;-_+1U`dl+k@sp{pqRz$m7<L3<gVa6BIJi1rUKjyT1 z7W+13U!VW23ZG9Sx*rw;a-4yoa>?=hT*Y@Batft_PfkBGa-6=AoHTRA!t*XUyPk8p z+<}7UyOm5a=XtJ2e&rAq3%z}|SGG5j<K}aIj{SN)FX)k>Ql55n?%bMj+U<6G1Hux; z`QAl;8CFXELc>c6H;9cJh?LZIjyi!nuIEeUMb-xBcnFtT0i6ip;ahxK<5D|eJUjMt za`HX~C%=%t1zZQ&v9rlD)eV(|Mb+g#|F<qnaZBVu3G?GbwOW;ikoad`Yg*3A?8~S9 zc=e)k9|!Fp-I8J*WshD-ckdhS&5mtJitNwN9@{byvuN@p_m(|&=Of(iJhpr@Gw$ye zw&`5)efHBo64|k<vF!bqJ*#!uHi>sSmOa{ZJ#JCDy67yM{=`kzSFU{C^c6Q_2h&fT zKhxj3>@W#&ylE-y{hWZmgw4mqoHK3V_}{VSe04&`cmB-yxY!5}lVJPwAjjD}J2qYQ zZ|8i+SZH0w^3^1d`87^+x;i{1gFh&JsClja#Y2<X<aN9>@t~~x7+-Jmh}SR|!oCuF zzKdcbZLy{E=O$(ElJzB5k!|JPQ@W+?m3U@BbD9lA*2HQ>v&q0wPZD1!6EK>uIrf7E zTE;rM{#Ugu&_~*_w!9L7p~{V$*vDmG5_&dZys`sYthsihQ@S4Gh92`Fbt-gQz$mGU z7WgUM5$2*t+wr1Ogm`=hRQ^Y_Jx`XBF%Q?YT+#a94888|e`k2knSu7`aqq}v9<c7= zC&mhEy}jPP&uU+@wtdaIwd<^Vy4<{#&G`YodhNy)M7DQm$j|jM_bUM(M5|QxU3;K3 zZ1)Zqiuu)rJSk}~=M9pbKU8ARfcup|^PF4p3guEna9CGyi#c)7t!Iip*=lpOeRqW0 zYKyhqL8rfx8*-h&Jo`W*yU#CIJPs7Fr~6nbd#m(nSIR1b+)$y9qn5cZ{<Bp8-gw!! zJT&B%d~>S)lf0C@q^3}Zv%NQ<bA3A?lFhAOxn|&xbppOwTcYk!ujpVCH)M^#AL|G_ zsS8!&iVgfx-zmnVZ}=;LWpJ!RfrL=^fyDbGH)Kt~AL{^Io~uI0A9mpTStn}@GS(Tm zCC*Hezr;rVf(hmM!q`N{x(4qNkO}eOkMWmS7xu?K0S-Iym%YjKA7M=L!ajz55FGw& zqDW$e$zvhxzeyW_TVZ2v!yoSfFB<+m+5mj9al_z;ZVwy&*tfyWmqEmb|Et=+cK`GS zkN05g$FMj3j~o6cv_ClNAO4ts$S1Ww?(amCrBwKCFvn~9zhn4c)Be|V9{=Y5f#FZh zL3|X18PAkIH2m?LP3nR&?M?YJ_7_u(AI|}N|BUMUk9mhb#&yAnkN3rK{h&1K7yjTE z4SzhBPicRP^<jb^_}8qIHuA^&{W<NAJkbaIAb-mZ8R8lMn!|s!fnzy<-^6;v4x3)r z@qY+|+=d@ukx~1=gr8^)qzOIoOITdR7xKrv%KJv6_@jE^3>pCqF$glte}c2c^C)bR z;EeHniQ<Xcdsr0bK{QA*K~02xK5E}g*uSIr+}i#e#gn!7vnXEwohJGO@5I<2qxSP^ z=Mqu8!FQeNXF=_|J!;=V*ngsUE1ySLVMw(T{8fg1BdkmiS66c*`-QddwW$5gweyN7 zzKF0cqxdbg_uwdgD`6c)al8%Bph5lC&zr1^Is6?yV;QvMn<7T_^RQCk_4BYv;q~*- z!FZhCTt=}mu`G0uuNckbk9vPv;}`XNKi1I*<I)e8VuWVP|FG((l_rh*_`1Sd=(5qz zTMDnw|6Rr<ZpyI#l<`LMc24y(RmJ|uqM~5`s;`Hutc`J9O&fVmD}1VoeLm=gZF!<B z2qE4!3w}4_3;F8}&w044RCxV)ip}_4FbeTqjLUhAS#Jk4Zl2>DoW;JE@r4b}m8dUQ zEQXF?sITIC{&0W4-N)xBneM$^PUp^j-EuPHY>P;{G9gvI><kpky}6>Jz8IX`@Cfl| zz%xbHck}kfb?fgZQ8<PC2umB*Qt;7{A08Sygg700wy7}NyVAQm97qxd?U^X*^F&4Q zUC)<XcXaOEn(lP=Zr{GIquc3DZ|&@mobz7U8O)XPMLs_Y2B16J_T--Q?wuJ%qvuZz c4w-_}C^>41o=Bxq;e(~RQzx88sgJI|0p-_V#Q*>R literal 0 HcmV?d00001 diff --git a/t/images/ExifTool.jpg b/t/images/ExifTool.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4821d9ba00c278b9b725178e6a55a1d4ac6cdad GIT binary patch literal 25766 zcmeHw2UwHKw&*0GcN7#5F@jR0C3Fx_IzeivqKF{`2ql3eAYjEVR<I*>Kv9Yf1<T%I zZ&(nqH&E=oyWQrk`4a@(>N)$Kd*8eF-7|cXSu?X{&6+iBP5B4$74cn4s82382_Xh! z2vR@@sUkHJ8EF8t1*|&2is0@At04_P0&p)91(CqTR*xi0xGezplfpLuHkIO#0j5J* zEpYFFwUNRf0Uipl3b-mjs5e<c6XUO#N=E&_)q!yCEE$5n9l(zv(t|pVD-z{V*{n<v zm(N4KkpT=}Mqm&^zFZzBl$&c~N2A5^`5DL`C}0jdU5`Y50*4x!!WZ#{Df~>TqZJL= z&}eopG#eKi2P)0k#n!>a&H;s{aMP*&EI|$@4|(x3^90=F6cH6;LgKC{q=!~dm6Tlo zd>PK};@?CHCqnLMkvx(Chh{^kQ5H$$kPrAWQg{Ktq#_9p31mPnlF;0M!;6)O5^MpO zTr3IS0Wd`xz87E_DSQZESt-sbfaQxN{K!Jyic%O$LrIF$3^-_=ls7t!Mp`Gq$2jD5 z5}9NEDN;BTV6_br9<D)Jbt&8iu*L>SS_<IwmBN@j+9*%(kHbk)7}LjQ3;>uu$d&Fw zvv;98Q|V4b4bXoWhTEhP*cc#;)1^q$p8y#9vFRS(iT6xd(h53VIYg1ROgTu=*?OIT z#m?3{9N_M)mqeCG!ym%QQkcjNemdJ$rz^gLGy;4XzKBF3p+)eA#CPNj0(@g)kcRk* z_&V}J3UYGta<U5Y^74v`3Q8(ksw&FLD!RRTt84Yw8(`31PhX!p$jXFjXknzUZ|Z1f zL8IH**$pspc5||EwX(Id!9+-kii#@ADmtpFIyM9K2ip8?BR+^U6_6{kq>u~|S(8N3 zB#Dop0U#<_;2bkAHP9qwWaZ=)6qS?#p-uylNfZiMh9WB~BLmnIag&wNl<hT;?jhGZ zj3sZFrDao4v|ho;b9<vU^TNwPwh4l%ib{R@>gehXHa0Oe8)9eg;OOM+;^pn*>*vo1 z2#<)2ijEl>%TDAZC8uyxg`(`7ak+W<)27duIcxTu!s5kCmM&YqVr9vOjb-H(n>JT& z*|Bq1-R?d04SNqAK63Qf@e?OcHD7GG)Oz{K)oXX#+V9=(c<}Ji<5#cWynXln!^cmb zak)rP>77PWu<y#H3FRWo$WUbDak)t3abPK$GO`2da=kpl<XKt04Q&b(v^<N}Z*NpI zvSq&1P7qvB>NCjh?%-FrXhg~Wxq?mo50&g&!Me(I4XIE_P<a$hGz?wo^C70~;Us!t z^?27-jX8t&&FyfCe4S_V_4DTJ-+RZVwEn64JZ3_XmeDKc{^kp2Mee&~)!xwX=cmwS zh1c4i3+m;z=bJB;Z8Gm)a`W~wpCf**%QQ<#Z*N9VSoLPARfZV7?Em}6z13NRPA8q& zuCTvqLSun?Y1V?9X`ZJ#bS>I*iuxLDbQt1XXSdp&*)Ua%zD~kv^u_3vXid<I@hg5; z@E4=2Tf}IkvZzS?!VI188<EC|d1^Z?KI9*`*tB@yqIvma?~ua1Hm2IvZHsfbKhh}U zhW4$s<Ei7>kK%?+xph74)%u2+Ck_4CTyh`l#YLChUaeX2CGE1woXNYM)=aT{Kk+<6 z(=BYV%%8rt&xa{pJ-#wEkaOz!0wp(x7m;;SmA#b*RTchm&Q&Nzm#ZJ{TDfb*jH)~Q zG41O=M|+fUHMmK6RyY0Ct~-{p`ns+?nEa@)>bF4`tgL@K^TvGClvqY$x}S#gv5^bq z7fid{e`m~={J7_QX07cGdg7c>FHDDph4zcFJwq3x+lE^o$39=n9yIUT{GFp_jx9Dh zGr(YliEG5NJ-_qn7IfS`Rct1Af9!)z_x;QR-rJ79a`2;b!Z~49-qaCJ^ZnoJ4*RT8 z>-8$Qj(^wRDw}Jhc50tY^7G{bJ*Pc7XuO|&_rcs@+f4ROjT$)k+GEmVzes}z3r`&g ziJRv8%4()%tu=WkYwl5Ff8LF82hWAYshnPaa^wUr+q8l9Nd<jO9j|d_p7(suI%!g{ z;LBHi<A&;Ul_&07t@AHyxVbaw{P2f5(+X}cI56Z-F`81{-cr(U{2R+XDrJ>23-S%_ zWlruj#N*|uxQGDJBMx_oP=DI}=W?T7zqs<b#kbbnE_89Bg&${Q>ayL|{ZA`j=oow? zWrV58^Llw5{hW7S{xtWzSpD?v{kk3VH^iLPLH$e`PTu=a)6e_mpO<I6sBL}|kam?F zrf+;JQb{<io=2TZ|9qLharDGlL32zNF!UGhZ63R6ozsb7GX$q9jQLAbiY_yqCMBEh z`<i_AbiW%Xj22P`k(&-0bnJS{n?KLfeB>yZ2jfCFZPH#{*)WsM*S)Tn)BmhX$ud%1 zgxVA|Y{=V}Z!bkQSuUhE9cS;}^|7F>Uz*d{5%t$k-WhsC(dhhJ?bh7M$6c0HXT9ex zyQy>}X0New>4J@$9*qg=ZQ$0jwk109uA-jX$P>puSLpxgBZ?}Q4cawB@wdd44?pxi zEj0d=l#@wQbZ*-yd))8KQCcsbtj{0jWGk!2jz|;sIyQxERxGd`6C0g8B3XPD#v<`U zWEdXG@P#P@hE_Z{X)ZxXxt^pT3xhDp0$cGN@@ob|590iNJVFCP{enouyo#|AS~D!b zUIM`{%#Krt!F$Ru9HszP2P_WqavAOI<?J}xE5a|H24=KJWCQ?q_EtdgNAVH<LEYnF zyvO7brhH~NLYs%nBMndsBy)vksKf;=BnFTO)B78wql5K4Y~&&Axfh1Cuu4G~97jT0 z5M$>d4f=-;Fz@1<ot{o*WsCS3ED@JY&EO|;zNI50Sp}-pr%gcEH(VO>E60n)1HF>? zrH1myaRlL@GEzOh$=H`G$QZ{GaHvrnfe=(sDvfSMqjgaf9LO8C$$0!Q{m%u%GK~s` z9eh1?SRHBdF!EIXurW_(d~;=y@;CYDhj!{Ps{WDT5+Nvm<G+`VDUhdv#d-z>X?%-O z`c^U-+7yTz4)!3}?gr~-ozge`CUY~WFIjXP6%%o4hyuJ2H8@;DM<0^o6iVN)WxjFR zH^x#*T<u$(_93{yJoY6Z%%!mg)~`~)l4&?G4=jbI0l&w<%9zH&Z!1`N(|hnsgRGSa zA!<Pr^9C!vgVa2t7<7mvjQDQfi76scri-;TPiV!$y1W&epJAQL%CrXgTO-hBhM`=P ziCBn@(hvuUKw=5tCL=E7?uJahijfI~aY0W6ABslyC<xKOW`bJA0baQv-+UwhI2_zy z6akd-ffgG%LmCsH?+!XB&W8nlK0)0Q@?-%8OOyoZ(;-(5P!K{s9Qb8JPKH383BR4G zbCC<A$$&H&fFpv`RKlMQTndRe%w1OwF4FK$Y-^$vT~tKCAx^;ndMqd{2WYq;AE3zv zo+5xxKJZ0FcE}1jB3r<eltKVyNCHeI@<zVj@gRxAR8xRM5%B7Qtl@7Q@n;3Uwm^*! zB~6A<I>-nAS%Wlf;MWHJEFlilw}dj~K?!g<bHRtpXe2E`2Jj^*GZ)1WW$2k3j<f0} z2`i8%A4+KrC5s{QwSpY6JaCDWpbW0kTwS0{68Q@NHxqK_LP{QBu%OoXC>ug>>9XMu zw+9#G1e9pdA{-#z0eqHFDjLYl9-t&h<qWd3gi_l<C><aN2(^Pe5&_o^_(}v!Tlh60 z_~==qi9|d2UY41Vw*Vy2B}a^B4K&li;@ZYi6H3cT|5i>aQBI8O0v5Mc7U1E!z*4}m z-Q^Gt@mbwsy2qtM+1*hn(eiN%@dru*lmjX9K$6w~OInBouZwn9Oi$`K&9C@!mBuDQ z4!CdhteYQk?*Xz9{et^WIlBNJ3*?nd^f%nja2~kcvIz=?KqC_Rf-l6-q3)>26zZ7^ z_?Cdj18gpl-V9=}AGb41ArbsBFhYd>lk(`vZ<joNUE)r;V0k1HJx<uI%w27|C-t87 zjO*y{NW%+Cm<jdVl_wQ?E$#z$K<8g+6Fs@?l0jEaU8U<Rxe)3p0i}Y(**)sJtL&ao zKgr#s^4E6!{fPJT7W~(=5s<SGa{fDM{!Y8-$$ghheq8QOso+sdM2rUi)qSJ0{8X4l zLZP2{K^w?~+;MH-QHt{m$#j?5&+7jBl5|hwP00R7qrrdQ5j_)nDIa9RhgO53%)d2z z{WUe7L%YvqlD_>{JQw5v^&uki#9Bru!2xb1lKIUY#;QD`|6<O%!m+&nBh(~gzUvRu zdO?runpvZXkwl{XxI-(Vf{q{{WW)g&bMiADensaW<&X1AhFk<tYIl&~ukz@L`)kUW zUrccXaE@mcJT_qc;pg-_Q~a7P);#d6F5wrKoCh`$?9VCpO!I5{xToT|49}U8mf!_> zb%y;sk1m|fk><yB?hTw`IZCKX;6%u)bLOyw`2*{IHZaHjEVrN0_*KdLAx|tPJj?L_ zb_ea85A7=DyYQdo`PcNn%8dbe;2IY|ZQ&76(zo!e6%9G!QsWl=W1OFH@N=5K;v^hO ziN{|yQDz1*hTJnDOo)bphDZfYumq^!@51{T2R&*1I#;Z%<9c>SAyCer_uX)a>%{yu z#cbd^lbFjoHCq<=a1ZF}mt4rPOE>5~OZS{V|El@810B5j$tUV1nP_`I)?T|)mFTrx zA|+loVaffosqiR_*L%3HN%;PG>h3W;OY-x&`up<wagU9F65&xs2&Lr0FP;_fNXCTn zCV|C0AM3lguDiExyn@9mQ``%Fl%7hY>`7tRPy77e;o?{AC=znTHHA6G<FnIGbNn6? zQ|(?4{}Z(iJSGJ|?IrvzZ9}p@(WPMsLBGp`zQ}>rE}@3k;}WUkeTmLBxg?z@;QVzT z;O8sz?{mXiedh{Y(r>%yx=8bvw8hSur+W|W*<1eF?{O=XtWoj457vk{-%5wM#+18{ zjgp-LOh@wP3bCCs#rrIH6u~_~GIvU(gImpyu_Q8+aP_m1qkEg{SsEPkYgu$p`#-V0 zN=g?5()?FiPzKb=k6I9>i}!i>FcxGJ^@e9E287_*pmTrDg@D*F>fv3UAL+n&_l6C- zI|(qF*b}=v4zSyk2$~GuE1&~}cY~aOCL7kqmVlQ4c+TK+20bSU@Dc%%XmDL6{uyWg zKa4|?QZhlNox2tPO8s`<7x+;<chAQK>KylTyuXX}PG9h)6TQBxH~k7<(qmnv{jMiw zG|)_do!?H4rc+OG2OUeY2a0!R@h&Jwy0?ng1bA<?YX|RVT>PAN=ScLA+<(5^bRRV& zd%JjKm2md`&a))uulwebJuzIX<G{kswYZHuoZ;maAIc1Y+crLMzX5OTdw6^LkYP_h zgC`O&{XD5~j!%_8hv1HdWYeC-7G`>ch6Z9E9IAAk&Pbx+_kAk@N(f!F#I(Kz|8sy6 zJ5wM6)GuId5;;OP9AVG^P8%o6gm6+Rz*-4u1iTHyf(RxYJ&}$8td=Z+TQHm;f$>R% zng9v`IBzk2G69nnFq|NP@!5!$h?9%+?RGtg?(FPLmE152&l8F`8A2+9$L0$%`2v=R zgAaEk{NYqcQ-X*kW(o<N%!ttc#2;J_5^`_C2>FuwoaqYd%7~pU$dUR;WLt#(k-v*Z zsSZLR<#3Smr7O&CKHMm>fU7}EyTXj&07nB3XMQUcx1ns`&=@Aj79S%*<ygZ36yCJM z3jnN8bZ*fH0)!`AZ2IC;1zG5ocz=jPAW~uN#{!ge6c7CskJEUko(3yU8jQn^;KQRa z9Y$>27Q}6&t&(gZQ*7WA2-t>8Zev+d5shaxXN1FDxAmV!;b!=K7$%So5%}T}j+dT- zX^bWOBwzs_iIUJfaPcwQI&kr2q0Qjpt5Unbl>_%6xcDm66>#Au9ijp;%+59$xJ;)Z zp^fRo1svkwt!HtuT7ru!IsT&o>j(MgH4l)`*yXzGr}TnwoOU?aDG{RB@HM}Yy2F^J zJXmj_fsexQ@P-Wz$2OD@ES7#gh!<~ocP)shFumc;6)FmZrJ6UmcymEWEaX_AL}D{Q z%0H&{uT>SUtiJx8l|{nDJ1dL+U7>O0_hGoQ6#GgFi{pob#X`oXk$5}`1q<>fDp3~P zv0yvTD6xPt!FE<kZ-8+nVfP?doDRf03=136!r|C>fGz3+jN`jq(-B<iQdU;(t)bD| zK&PLM0ez6E=^%QDle3qzQ^@q#h@_;5*y&3OmTg;Bu%zjZSbV2R+|!VNfRd7uhMJm& zo>pHiJrje00}V`EEiCOUEnMThhK(38%qyN7mztj%$DOylzJB?<8$bZtPIH8`0h+_l zFLC|yCe;7H+g<+?FK*q0<|HGzfp?HZC2rusjoMx$agQ5a_a2$GEPYsb4=q`;Ysu(n zk|HCxZ2fG+E!)Hl9atbf-%f{snhP2fv$BX46?**;Y33@XUWPwXF<g-vz%8Rt#24ON z3^XjWUn|_)s2+9lt@cjEp}lNQY8@W^_H(=DA9crDEBlYRv*!15qrN5&W&4k;Xxr9z z)L6ND=h|aiFK-WY4?nlQ+MoHHYM~iuSbo&5FufldCT@N$Fq@Go*fk?{PW{2!LWh?7 zTzcT#dEP!Y^pSg90)97Z{L?(U*QVE%V~#NwU2E`v^Qrp&+!r-NR4%VO$*ZFI`mk=M zY`JkP>)EI)r+UBGUR1X9ocQ9Wz01exR3_~yHkzfgnQI5PWS4{uM+QwkT1y|2s9GQZ z+3B|8mU~<?u6eyKnqIakoJ%9ka9GV4KApl<btzs%qlhoHnN_R}vTrf=pLtQ0F*1Mt ziO8!rH#hXkiPjlhIe+ux;=X2m`|pgb-o;%#j#mAoziTg@g;{YK2lfP;uPJMGdJ=eT zwWHC6#^xQr3r|~#KFm2(G;iLeKGWr%j5)pKk#ZK#|Br)NW8$({)S;OIHS_X-2bPMr z{m#GH)Xy!%ub=PPCzayXPnTM9HaAl5MO}VBp=!U`6Xx*^fuRjdS)b=g9gCV+!OVva zr=yLOP26_I8QYH5zo3<1KG}0`(iy*PC#w19mu{aEG;-Cxl&et=%%>Gct}J>QX%=~J zV4BZz@{Urw8g1W{z^ofG=fs!a3{6rUMZa>UeLDMN^oHEY!}~1TqJC?vVl}t=g4T8? za{c3>{Pp*vD$g-P#_x<^M)@tcb<A?gn@OWvCom5?<TzxFoJ4JDy4lFPxpj?-$BEj= zp<AmLY{|SgJ#6U8TTh=2-V>!`WY}=MNkfh8^xkgN<2T0}Kg~Lj;Z=D((0ORc`l^9L z^VLKpm-?FC;BM8o+qOShg&r2YZglL{d74F|pPemgS%18a#|qAQOSfMVB0hibk*cM! z`F;htsm05R7a`ffmV>ECDIivrI#ynMp}i8?`4vMHkl|ijfK-ken|&-h>VJjQdt2Dz z(fgC1^>wbE7|Sfmy0tmw54P;})@@tOja;5KD?RJ$)#fK|zW?;uLG1&)Y4+2&qAI`9 z(UECt?>^<#8dj}78X5Ch#g*x~-Y$M7)i2<<dtYX=t^RYj8T>;^?<(iDYgINK>lm+h zX_o!shof$ETpqD!&hRTvTO6~d(hDCYWnP*q+Q{AdAY;**vLRuGS9a(9wr|sr%543T zcFXb<<ETf|#;o09#p0Le-9I&pS6cGUbl;Ieb+1E5{gx%IxIJfp_~M;I;kzT(EtPqy z8I*9PXlzp4$%2Bo+9~^8lNLV<`4D<XJ^%i$iN+bhPyGf=J|Eq@EMJs!zA9|qkOf1s zdf(e<a-;o>NfrBgm}TOukgaB)oNBE<POG-iR2Dh0PkxTBO#Lt?Ic-qW7i!5Tzqpor z2lnQTetoQgcK$)7Rt{%dD|6C}lUHqw-}@Rl1g8$ktI&J5!fuYg#X@n*r{^WyV<jo7 zr!;xWpEexpx6o@8Ep^f9!xJ{Wtx0T-(l&eNdt&o%(+&3dSPmX{MFEv<D3m#<F1~ax zrF_G_;Zu4QuPzMm$RwGWwJ_z7Lt(bD83n4bwSBvf%ewlBMcd!kEHn1+#gIwpZLxxy zHEm=`B7N8B1#5Qw#+vBT|MqSBeX_s3m6_MJ|MSlM<@cTn&c-@+ob%MGR^V<8T1}6> zFGfm3{DfoA7-k<EUwHfC;g|rqKTjQ=cPZuVA8u{KCvmons~t2earF42quTt_Ne9T5 zrzcHsEH|$hRalr|$yxts%ZYY-t>Wvl_ovkO#(B0K(^5G!JinNhHh{TrvV~pgv=*iN zQQOO?H6@RmK9$f{aqT`Ei7zk9Gju*od0TaLuu8>_b#=RqK7{WHo=1-~X!9=}s2@Em zSvdZUX!mmW`6u-myY}oI@}!r{yvv%YUN<&>An%RKiNCRXqPgRtoC?M@&;6!PUc}i= z>NmrUDrkFGWPh_Gr>b7NK+xfL&3sho+JrmVH5>1W(afNCm)D4qz)-!V_56)Fr;8V- z3D<buT>YV7znw*f%!2x2kF(>Io(E2dd||D9`s2=#aSo05&oy1}$<wZQ;BZ`F3}c*K z>_CUf;`8S|u5QyV4$IKJYrD2OccWf&ORYg$PLA`S#Um@WH6C78{HEpMJSIc+@k#Hb z72LOnhhO#7<L-JKuzVY>UhnhdS#`<}2bCzyt(rW3z}=YFz8AJf$!KJH)UNxgs_imq zU0L$b$)RaSzIfNSJoo$4j{jiv+b0)GA1Lgrw<~$qa$GsMWb5oD;{?%v%n;q2!@oV^ zg!saJGt&+Grrx9VDl{$Yi<C?^6hN2PVj_yT`CiI~!Y7(YD~#dQn>07#g&4IsHdnVe zD*onRu%UdK#+iPj7PYPkdt6=eY*&Mg^P@3Yyj7gWXJe*qD4nPGD$U$_W$x0AZu>17 zN+(*dr{=E}U)*t?VlYuw*n0B8=w8m`x>|b$X0L*o{)U@VKD7SsFiIwRzT(hf1H<Ru z&mX|Bo@1VEn;q@mcC&Vs)x}3qVzkq!*mW57)x1j@hZr7SXVbPul7_8jR-Wc`c)!)J zG~aWd?K9}Tv!x%y+uQqw!&`07#3iyM&&^{50!Gb(*MXuM$FP0Z*QAA{ok<RMOjh5y z=TMcXZNLy3PxQ%}mm_y4+kNSUN3E}}9%PTnI?KJ)e^-|N;ytexE`Jo*QgQ2${j<y3 z*EVe^^en55KL5tV=UO<Qo!Xprc+{tr;+A&N6U937BZc(h<K*8eF1%gw)Y7Ox{-*vP zC2f=RbJL!l?^hYFc6*%r(#JYADx>Sdo>i9Kwp%rX8qF&F#BK|jv+V1O^yK?t1!FG1 zQa&;*c*m7_l-~z<#2bx1lPCz%i5<6jEqkkCKjWh&>(<;)+C1Ms)hKR*_Ds8rK~5Kg zj8T>1TJfb%Pn($+Q^r1}5Agh=Jp9ol^*;u*?w@<?LSFv;YoGnoj6z!ZRU;;r<Qd+) z%+@TOIHdaKjmtK>c5F{#7Y9vv-@D(0i<-0cd=Mj<g>kISTWYpU4Nq;l9wvAqSe4@z zyr{W3x<=&;xzNlEk;JX{DxuM!DM|sRWr*aXwPgAgl~^+~E=2>TyL)C;!<ni3FK_dn zluX{vdndbks&T-F57jHyG!?sD^A+AOYjAoISGRM3dBUrr*7~b=**XKYJxgD;?oO|1 zkl$82Ok3H0a#+jqUB4GypRs1akwXSewYH3m4HjPX{(B=YB;1+wXi0lTZp9o=jZA;{ zrMZn7q0fqsZ>yTP;p#@+p@X3V5BBS~Nthc|Jh#wvR8{MTexZFni)v1cK6(HCVr`Z2 z8H;Qy<m>uIzZ#(|GnS!kU(9=WF1m8HV!gTjwyWavjV;z{S!>>%p51igkF26wi^C3_ z?j7T>_vjg!8AdV>WTK0FM#gWyK4V>ZU*Ywm?%a{tu3sXPv)Si6_Guign@BTHJNUKV z*Ngkl{GR38@!@@qdSHXg{6pSOIaJc~v?uXuDU}s5WkxdZ*pE}Gr7W}Tq&jx8&U*u^ z4U6YRU-cXOqE?uT<YYavGZ%Tjc0L%&_%bB_)$PJbgI`noY~M4e*X`zpPfXt}j>W@` zj=5&F8MoAyEiUbS@V$1UUdc%1?d(v!C*=k)Whur+;tMam0`1zvN}3N^HV#yESXPqS zPv-;4%(SBA3L-DMP~yb|Ev)%I%nVDf$)IayElXA$lsP)sQrk$5%w%5hN8^TxFWxh& zc|2{<ov4iWTlEK+ep=PsFk)_lv9qw`QU5suca}G_wgqeO><fgIA@qB9@|DhQVut;8 ze|>|-vE-7Q=RNCAczyBQo>j7kok^`<;B_IUcg*GZeaqKZ)kQte@cLNv&URka#i1jv zL=KL4-z0o_%<{QPVD4l0rOk0C2JgSIiMsh{^rfel+SQymkH!o(iyL)f_AN_;1G(47 zoVjo<tO$CY<(#D-|JWKAyprGH{@O`<7AxJ;aGYD(wt^hf`Q|6Ku3zmp?u}bv@aF~e z9RtR9FkV+UYtMJvFluve(zF}VaeU-)E_T!A80Df}`VmLp_sSWPHe#;u)C4~+U*FJw zwzE@Pef~Sk_<(7~&Q3<9mzQfcjnC~r_V!BM39IHUG|?^l&4+Ec*fVKwllrmG$CeGB zdUtoh{OVI*BTpqP*1pUvO{%kZW(~E`6kl2%^zpu_&b~Tk-ls+FZ|(2h8rXVvz2Nn- zvuz;{MjsnuQ>U@fwB>SI|ElO99mA7$hXd#Dpa<K}HG9qr$XBt~-BiNbyt{q(46+`# zqLe$c{D#iwSze&NwiPccNlDj1OJ*)B;Ud!0h=gUu`x+OK6AH67EJ6dsm+#XVg%bzo zkjVW;zpt%)`sX!+@vR5mohwqD^yk(BVSRBhqr85Q3e)H;mp;N*l|H*jR(BJ#ZIRlY zh2rxs=QXd%D?4U(yLBHrsCrZHt-R*;<Lj%%h&DQyHYu|GRgHm8;QWFyv&u(hz_{f* zWUa;ZhunoF7Yr&4CY&E}FS%gm(}(GcHXqbA-a9nrknz{A?^Y$Q&udB-M3eU~uOE~j z;yruSB}4BUw=QMtM&?J29E(T|?o-$1W%pmbk1_C=T;BQxrru3!#TT~LPEY#u`EpU} zT)nfNIZxizEFSgBf3L~Ovmr1iD7BZ=Z_~f=)h|hH@pOBaS2<bE+wHZ=Ip<T#>>m5p z9Q32jg!NDvZ^_}|6y<sHa%FbMHc^U3o)E<94PP-p-2Ae4SjmzW-(BPS)lav(sOq0; z%QU9-wp+qvZljURR4wh!!|Ltg{YM}m(1}TASw2><|F>epaxJ|@3A#tqmXAqnjCi^6 zT~$Cad%3-iYxCT_3YH4X+QzRHx4himG*C;8d+ACnP1ArL;Jk^+wzqJZGPQsaRn_)p zaQ|0LMlQ|wr*Zl+#&G*x%c#+!d@OlFRhbmowxen#qo(4Jk@-_y_m2GmuRB&H+3t1A zr{6EMpTAIisezmRl;n&=)v}y1@|yyR)9RnKE7U(4J*l>K@Q&x>(4_3PF()?HB;}ur z3cR^^sI6<}`XtxrxgU2P8NgqB+B3)O%M+u>%Qf#PGlzy>Y~6mM`eo*W&9&#>WwvNL z<(Gb(BWS!{c{sM#b$@|hx$1B&d)}fm)5#^rmN4mUD-_hltuJ#b_GneCxYTO9=8)d8 z*`LE>SC$$K8N5Ak^Hd9)Ql*ho+Y1W&@7OSBc1@m1)@fl}qjnJOVw26{KGT$;RerkC z9A3Grakh-z;b7wuE^Vys)ykB0(YYF=V67FK3Im7Bi_dp#Inc7oFzKy!n)ZlL-GZ-6 zuQV=FXP+Iln88?+qT6I@ot-b^uKh6C^0>+7I;wM-+;V<-=*eDvRyLVcEbCaL;s?Xu zZmP;<uL@|LMXlR1?%E9NFPrn;fmiSRWWg?Wa!O3cv6lVSSN0F$4_&R}<UZ<yT|y{2 zXn+3NHlGvWjZY%(Fk{FON(Y<{o}Nd#UY>XM?uKMR-Rj0$M^!!lNZskk8Z$y@wkF)D z^g(&f8p8%NgIlZWznIT?HfAQdBxBF{hX;Mn^BW$t8#nI}>W@AkM#GzE%r&Ok*K8N5 zL!)afNz2|;xbQ#@=`5XFm0PK>x%2{SwwxY!T{9DHt7R#^2)np|yQ_q>&JUK`FCB*D zsikhO%=DZVdrqXiYfq)-fvF`8x)pjwTU-`#Zg}<%Y;r2$7}rp*DEqJ5P&%%Bnf6n& z3kz?mf2eF4c{@u>ae%m`!z^{}_3AeZ>B4tgQxDE7e9>#km@{W`*hgJf1#3+~Ll&(2 zBjd^+k&l}$ksO+sjZan7oq4;~T`Zl@vSO2_#~+)UwiUOCFF}*Gx;D?c+~2%G<$;W& zeLr$;|DeE0OUDP)*)V?JlR9Upk^blg?(g*SoQ#>X?7ex9uI0-jy+?PZ7~Y+A(e95C z{wMS&+1D@HqW;?aNTs8hdxz!jb7Qog_3LM;J=?N<o=W@c%2IPH#z}eoX3aM<v}Jb6 z%=mM@d1_>p$#%=N;?~z<)GJPY?-duT$*~W{x9kz*Egt&0I926U^z^8Wy;D=q7ryQ@ z_*U70z>XIV2TROMn__0mnLP^9>h1Zq0!_(D?PG80-I6*`6`J8oqrjViOY7UKeQWnU ziA%C6VLCS%$u%3>t=Lq>3kkTqXGdhCYwPjB`K?ibXC7}1c>eU<%#&-^Os!~`ZkTng zZZ2|(a(i1E5xr$qSe)+Z{v#tQ?P@-+4$trPsL!12fhtbg7jEQEx*2X%W4^MPFXJe) z`BPB#hx}7IxhI`!p4{Bg=fNtIBnKF1Kb;EPsxe+KsXe%8F5RTEf;o1OVRpmVeYsCc z!Uf0cqRT3`ovJSqv~dy~rf#GZzHRCgIo_%8z0Q}d=dyKpe#@G73#REhx7XzxFXwF= zwZ%I1qFVL9yVnFmVmFk_CpCoym=#oxiw?a;8**HH;X!J@8LGPS&1?5=Sow1LAJJ^x zl{v1>!MmoG{>hc~u`W<se&~S8nmer<rf_eXxn!5myxQUX(A=9frgo6OV|mCLM(<IF zlGD{zKiS><j9i1Z<Tw;Wr!EY5YOzj7x843h`<7c#Pcxf#pM9!rZvMedDKjhz7X7tc z`IC(uwbL3LiURjIec}%K6vM7bJCro*z`82$jg&0?cI`8{Qy*~l6&*_}uV0*6@}{=e zjnb;T5B8#sO@sFBOt;`O-7B<LZ@68gQ*Cy#w6aWYvEB5`^+OG)N6y(Xdj~a9LGir! zk{xnRTjNPcQ}(<EItEL1H!Tj`ndL7tD?z^UnRaa0nj05s>Zy^RVrb9COt_x0*zrYO z$GAaDMohPseaPD~uVZb8wo_F{164iW_0Xlc=Ig@@ABbCCwN5BJy6;hR*s24}eM7gI z7Y<!8bmNW?54XZB|ImAp8}lDbiy)QP%-yd4wJBaWVnHG^|Dx;mC&5joo6epzx@y%? zIX`C3qbB=y&SQGi`qk|dDjUn{SC%!hOLm<YwQ)_@h|2xT=83PuY0KE4P~UGK_QR(2 zwr(GL!@&dIBFEd^WC*8%YXeqdC{rw7;m>oV@rX3M^13>T$(4jjcbcz=+sO-pI3iZp z;{h5d^e~y&9=CNwDC}_82j$Fe@JK0)>BmZ8%*QB5i(SmeXn^sV%UQ5--O`RZtVqzu z=P2>gaJ(Hq7GUh&1Is!rk20Zfj{#1Q;>QAEwiF+NQ6k__!A*j24#0SOp9UYngM&K1 z>T<@OZ$<^qWmLZT{$s!p(i`$(%;x_U<D)nbDUl_=g%m5<nR42)!%3=?2b2TkwQ_S6 zepmEW_#pOxQyov_Lur;7B6m=xnzVtkOKu-|HJp#gkj&6^(gITC2Mcr?X@Nws!5<z< zY6(MfNYWZ`Oh1KY`E^J{u|PA(^U2Nf1!6slJ38}a5?P-dChiaqBx#WA4Vemhvg?oq znoq{DIIcsyMqF>Wm<THn!zEq{9nGgqBG;o1F{ayT@F$DEGUEHBb<7~22oDqlpGOi# z3CVhddodW;Lqb*I++-eAl$XgtfqXW6F$iDz1#(4jh|5dl5<ZW7Zbr5!MUwdc=`R^o zF?dOQ0sgQN*ktmvd5Nq9ezph&^N}B)p9lx1|9uPvx&}N001X3wQ>cO9K<r0G+<_+f zgoZMLzKu#GRDMJru1~;24AKOl0xnMk7&IGu=#BUcwGaGZ!eHQe5%?iM4bl`G^0y4+ zuN%yW@C9<7K#&Aq#{w}0Oi=uQG*B-ro0Sfq6lPGpSQ#7vi|Qc~3AhQ_B94%R`m#9e zcsL#xaCoA4A%`dA3*ytWGgt(jJ~Bv|l@y=J7ZU9VKHMb{1tKHu?#Vd0nekj+A}5!E z5$s4Zs5fg|LcEZbk(thkPvo$<_;XSsH9n6d0a0O+eLRQ9N=WAr89@>aA}ooUF5(E{ z@fWW$m>4!VHv&Hw7|9lJBzeWt$rxeR&!TOJX#DC+Um|q|D>oh(?M8t>FeHf|ktji& zL@tXOke$X!;O7EW*PwtPZ+BHC*9bm8Jw6!3<}N|;0x@v}uGU@Qok-H*)t&BaMYD2n zl%jNo0#+!858`kSXYoWVS8J&cho`gH9HDyvD}%*l;~0q_V!Yvog}WWyp6+DjWJh;$ za<F%_qdD5sY;Emat%*oL@<>m}&TzM((QPeh&XzQ~tF<Hqq6ohI(pf?wHHDwSp|V6& z9)9!1)tZO_3~OmQk@zw4j|^sbg?K~%t3;9yr6eDM;EO}q#Q8YBm>vl?8t~^clF!Jf z1cWcL;hPR3cxFdQ`~(U8y_xY$1~rExaHG?esOdbK8_kLik9j!QSb&f2W@F`GYv*8Z zZ$TB>@W5x|;Ot;)&oQUjQd#MlZuq-nY^VtwQI`j9ow(7ICL!0v?2L>&D%?Ne@~PYm zRx-z3{DibAAe3k?&}K-hQ?oM?pyl)jH<8U^Cm>CvF$KT<<FqP^!e((Hj+84!GL|3- zMLm%ctOOkBA_8GN{#2I~AjLM7V6%ihu~}Rz5Hm-BM>QefBc2q02*ytp!dTax1<7Z= zIEBcH3*#Y9;fk@w8;ZE1bdI45)et_34~+2l3Sou>!}r3>$Z+_6I)v%t7ZMyF?h)t% zpRhYwrDi4@PK2~0rMX%BFgGZ$Rl0O$uu2f{S&2Bm!IJzsBXE}CtaMI>1vNy#N#^qi z!r@ZFgMLbwctwaPvWbKsyYp!wOwl8qD@?&Xi_OX5vJEGSpHg0XBqy<`ew-W@h>J?4 zBC4YeT~%pRCYLRO-c7~wh*MRH;AU`e8+UVt4nTLbv!kghg{NeTpi0~v>>R-73oSdv z4FD!b$WPD4qIa`bRSFgGMI5#WN5BjyieRO2FwDRWC7hejaiiNf(JY-Y1uuR&Ul0Ui zjT<oF8w`yGi2KsPgCAOgb_q}ri!I<|0)e>egk#7jH`9~L61th&Sb=X8TQaJ4@(uH_ zTR79n4%p=gxU6&|HzP@FrU5nSc;J@fWM}CJeulT3ho7$p)tlkRi0}xcdU*u-Fg<`M zj7Q0xq6p=(136GO2RhBx86=aEfxWg)G#gc=FgIrhkbs+wv#qL<r<<)Ugb8VGbdHk+ z&4Nx(pjkL1Ioepz?b%5db~ZNlk{>$F9`j_uqI1Bp15}$N8qJoL2rivw1Dh{4PEItM zGYw*(h!H@Lo<O&EfFyJqXCf&iWYdx?Y$O<?vZ3+E;b!%}*+9K<c!|(>u@FYVTqbSJ zXq{9lSRY3YbC*s*3JVviT|;81d@M~nc&UPlkgh9er-R|4i$Ekh*0l(5u^Nig$Rf%? z7~Zr21TB^H5Qo8iyKM;Z1qf-ML&$S5wpf!;G9dJRM1Dz8CBGscCC|q1HA#%-_9z7U zFG6=z)ZrIvyoC8;s=kstspkBbMw7T5Nl~9N{o5BmI?k^>Y2f(M{r9_v-FKE#>la%7 zcH=}*n`^<+{=&=7u%p<l9+L8we{u5T4$-G|?_&3TS^cN=J;8f3>)F*C*C<q3W}C<D z8MsOO6a{%_v(xgR09XJKpi?=4s|Q!F{{FYRNc>E`tn0BeTX^iu$&(R;Uu^=xMCn73 zV7;YJ&PD3qJ*lQo&PPfN>Nq?;P`M&~G8ZWa^QkEuR$@9lv8GQpMViqmFiCQGLXjYw zO^oIG<WQvC?RhkPawJj?%7X_qBs!5knTHg??<D{g0%*!2%?OTAL}i3Vcu}Q8nm*YP zDd2b3XfOlnlVg#>2re&KDB|<<$?=F1!h>`iBnK~Zuo7AN<YYvZupy+fs3HN2C(Pgq zi3d3ZoFon?YHZ+D9g*nzWGy5QYC}Fy!>}wd8DdBgM#FT_**HRdvIyz@{IxfIGQ7m* zq)!$iHHJwBRg}V^3i;UroP#b>Ol4&xu+mw1EJDK2z`$t8R`<=^UKu}N`RuBd@fCj8 za2(|k5tmCWR{e>aX^4D_JY4)-{G0-ZB$Q-XQ_2^jxpl@~0dd1z4T=R+8=_F~`jIqQ z3@{G;W>OT8E=kgSsow(s0uVerBZ4)E+%Xk=KMq`icVi+>tt;WMDM-?8REaR$dJG6m z-JX8R8^W(h{K5}Ol8Wfzm{TGRJjDja3_s%`gm*kR@bsVv6h|w*AlVvbxW5=8m5BzC zO7apO1_@3n?}$);WSx`*^wZ%N-{r#@OG4JKEcq6Kw-iVSZ(nrc;Ky7@aF_pE2qBq| z;3w_@O7}Rvb11}c@?D_R`>(_ivQZ%N#$^R*k%vpHRBi?kD!qe9;1Y`^iW`JU%0omG z_Zx95k@@xwH$h7h+3mM`yTSOO-QozaJ3?oilrik(!K*vq;4x7SmZZEyVMszM8+_7q zOtuKCg1D)m2zX~PozF|gFgAglBvE(2C%oMw^%HC`L3fb)F>7+dbS^0UQR#tLb0YP~ zN0x|#;9g+m2@k`&8*TYy0Y5vlN01yJv@jULc-a|{M#U!_Qx74+z^{s567u8lVCg5h zv5g`?N0A~cNsw^}pdv;_G8LTv>he>v1?dq!F%giJRJd69Jwt+o$($Y`a;$XF=8}7a zsj)eb4sNY8g#HmhfeFy-FhPaR;2y||DSSabXr#%Vl2Vrx-oG;#Qp&?~eXQ(sd`Vjo z)-R$Tpo0!43GRumoRCcDlih@?DWUJ__bmdFz)lD8!GNNOpBa)Zf+aw=%2i5-hV++E zl?1*B8q{CHl?mnhyI`UxY2l2BrYaf#1`_^A_$6Was3Q*;cqI@0bYJUre)Nwo0{<F= z3K!DxhyAz$i5w+8R-TvvAP?~~q(XcR5bqTPH)Ni}qeu8@BVxFRdl4^?To~1nCjJV0 z0aUy<0qbhwrm>cWhHfuilfHdTY>WpO+gKTcv2wS^#@*Y4FmPw(=Z2)Mt4r0V8tdp7 zI~Y@q9lRaP%^d*U)86yviMq!~?yo8!g&r?Rj*xE85Mq@4$Ptq47C_v9@8JgxP1?M> zf_q+u-3f=!S3P3F2Z9(0Wen>LAXAucqAm>%_X3za2%+d(-}D-o_%k~d3VT>n+hUzV znV*mfYaS{OmLkNIZiBS|1z~n(CKYxBv1+3w%!G{?R{CGG8@Yr$iTV?XR3spkSc76k zMTX54<zeMSg$)CuNRTJZAsJElA_3N*6uQ(W9+G2AwICska8flwgp~1$keVdmaMFQR zF6xD!=EWN*R1aUTP%3Og0fYHSjV*ck78EotEb_2wBr6obkkwNaArHa=`Oe^}{+p3b ztl*bG`1kv;Z^-`!{y&re(V<Y(c3iY?9cK@c@d}N%AtoHX^*au?KqQ|1u?6MR$P`?p zX=tbkM=+pDhC_E8*Mdl)k8wC*a0hk4DZM;`LxQOxp%Dz&n+c?Pd%)(rWFk{2h4tE7 zn1Gf*$Ay&{jCX$-0U&gM_8s{B$3_XBsV0U6b+LMnLxUeB#TZ>!J$*mIhjrtfABTSz z`k&23B0dl!iiN*Gl9mvO;qM<AjM0hpza`~Al1W#5kCrCa3tF}Y8ViE{7LG;y@4tUb z;NKGXw*>wzf&YCH_@Ul{6!7Qd|AY}=)hFXm{6N*wC*L9fIeqdK0)P$Is~8~d)+b-X z06A5kd>sRne0}l_49MWc;xKjsH<O)^kUmL6<|{3T;e+!97~vZ?lQa~NH=mu27lV^b z6?=c%wmeixh3!*^?*FD@5>7{08I+&F<p7LVps_#-xWJow;dl!NKXHs7g_fQfj$`Fe z@wU7>#4GgffrJ@|$9EGtXG`q<g-*DSuRq=>k!mj_eB>e77exwqPaE4oU;!^8%$pH{ TaWNsSL<k3q*X20eGyMMmn<<?| literal 0 HcmV?d00001 diff --git a/t/images/ExifTool.jps b/t/images/ExifTool.jps new file mode 100644 index 0000000000000000000000000000000000000000..dea7cd4c4df71b384f59c1af01cf49ab15ec5eef GIT binary patch literal 283 zcmex=<Nsp@xp=RDU?7TTU}0ckW@O+gNi8l>NY2mAP0cI$f19C&K}0}6Qb<x=TwL8q zO<v7NPYnq4>`Xzx&czW7T<`%#QAtS!83i>72{kh{1vN7lGi_}%pav&XCw$rva{mu7 z2y!q0Av2>A1Ct;lvmoRDBMjaQjEoGZfDJ>0K>%G1gCK^;|62?^K%X-SG7B=;Gi+v% H|9=wzdrvcY literal 0 HcmV?d00001 diff --git a/t/images/ExifTool.tif b/t/images/ExifTool.tif new file mode 100644 index 0000000000000000000000000000000000000000..0d1982224e40ec5f9838dcd2c5a582604c8133f4 GIT binary patch literal 4864 zcmbW32Ut_fwt#2vG)gETp$FJV?@hWWy$BJc3W69zgiw+g5{ih3BG|E_2#DAa3s`A_ zsDS7JK~O|g6hw{<6-A07@OJcA-uvFY?|pZYJ^5$NS~F|btl1M94d?>^M1UNa0a%nE z^buA+`7i|i;uHu57_=LGAUO#0ogsijTljw%Mp+V|HK3qGg`~bS9%WNV`a3J2Yz2{i zjw$&HlKsc_`=~$VAO({D$yfzQNjQtpEoc#>{ELGj>OZ!^9^F5DF#A3i36(B`%zydA zg&cnCZ@BV(d=FG7D<=^U03dn-03Sx@5yk`k1jaBCE{nkz@R$gL&gHW>Y~Vs?|Ev)= z-vGqb%fl<s$p`Uwb9VDV4GAJ>CHC{zgGcAauox~Jb`q1vXYv3rH#MDWXKHR|Zi<-N z*qK_}&9wzoG+r=(sc;G)|1Wb=;nhIQ3rXg2_)LVwr^32Gip@b->_k3Kzz}+sNQM1? zq?b+t!be@E3-~b{9u*D(cwaWc=WwYo8;JYGu;LL<IxmTtN`(`FC@mFTQv#Dmr@}Zu z3XEYTBIs9W&u8)DnN-*shzOlEH8(e<!eKzfo5hY!<a5|mI1&(i*?c;W#i7DXfJZ|@ zk3xru21L{?9&;s=$7D0m5fp(4GljL1&*8)i8(2Ow5%pdX5dH}&73KqJ7Y;X-$BK^O zBWw<zB{X9Jkr*aDDxSq=3b%sj>BC}kU}*pn*nFP9hcmJyGz=lMqahOocwhzqosr0; z1-J(awY}V2kVI5T$iK_@gCBW)&&bmcL4M2sUqoVXd3-cW{7`L+C}tu<m@z2FC-b>N z`3TCC6>&m_g{OwXLmfmJ&2&JC{=tUdb$+m;kfRdVQK*j4XKqwNl#rWH-jpO@qKpxy zQg#xHnT+y%lr`f82`rQ+QKlp?>51q8B?{$yCL;!AQ<RCkKz|pM=b`CKjQ)dH{K0%? z3hE~Szr(J}&_m2@ZEX-wW^z1}&o}a;GvesHD8z-6z@@WO0r;_Ip%su3#uh<?Y-MI^ zWo2Y;jE4VL`L~_FwEjH^_x6Xz=;H5t2FbPkmi@N<E#n*kz-A1M&CcJl75M;EZ3IB! z(QldNVF0AE0I2NvV?A=he2L-nxppQd$;rvaEGENP7|>tk|5W&;`LE%R`HY40{fZsp z%3Mho#PbnhP#K(fj(~?Ga_I~vV)Q?g_&+xM!>vF3F!cX<Op#zT%h02ZZZ|uMC48Hp zZ<c?x!~db#A3g~2M_!{qJ~jg=k;Xu}g90$`+5na;4lv<|&>ra5zWIm-1L4UFQG59# z?@>nkzt{h*f^*R(oXCnsgkl%}K!hRSB?<Y*Wrp4wVn7PLmlT02&;Yu?2$%zFU=JLD z8(0W@K_CbP%K!t!fCRt;$zTo01leFK*a`N5gP<5317)BbTmV&|4qOK}K`Xcmy1`@6 z4~D>7FapNG6a+y8NCF~5ijW$l1sOo*kPS2+a)W#ze<&1M4n;$3NC2&YHb7gU-Oxd( z1S*5hLp9KK=r+^|^+E&CYv>d76~@3sm;$T7+OP?113SUqa3CB3N5iY&)o>QP13myB zfzQB|@O8Kq?uPr}x9}Kx9gAb+FzOg1j19&G<BJKyti<pzYcX3ed6*-Za!f6z1#=J6 zj~T{%!Q!!GEP^${+G9PjL0ATM6?QFl8}=afB(@UUguRCyz>Z*Na1uBw&H!hJ^TI8` zMdOlj*|<F13EX8|Gp-vqgd4}>@p5<_yfxkvABvB~r{TBZi|`frYxqw5AbyNMASe<H z2o3~a0-eAoWE1iUX9x|1F2WFDQbb%tO~hQpT_j9|EwWxDPvn%yRgo@{mm*W5(xO_T zcA~zbQKG4$xuVBJYehRmheW5uNMbr-4q|~~v0|BG2gJ(7n#G=ojf#tl&k?s3Uo6fN zUnhP*{G9kL@d5EKL>Zz!(S;aJ6cBe1ONrNry~I%o2?=cpM~N^AzQhiRGKofsrxKHr zWJzO5FUcs$49Nn?O35zC_fn!#T2f9@%cNFI<w;$X>W~_i7M0ePc9Et_uaz#4u95DM z9wU)SW+Y!y0%;rR6zMkUl?*{fTgFW$N+wI@s7#~GAQ?l}AiIzm<PGFw<Yw{^1y9kT zcu`_0TPbHL?UWH&8QHnA!Lli`1+w+B{c;#NZ8<Nwc)47;3vv(SzRIh}JIOQUH_MmH zcgasEC@VNBFcr2aR48;Sd{smg-4x>#cPUmW_9<bN^pzGXB`Y0LYE~LnrYPGhGnBU| zUr>HTg{k^fe`*@_D7B3`rlP9ip~6+kS7}rkR+UqARE<^Lt9n)SwHjG%z8XtyuUdoJ z8$=dyLgJAFNE0%mPF43*7pRx0x2sRh(U}u8XZ@UtIei*p8a5g$HTG)U&=}EF)1+yx z(LAmBNJ~`9Mk_{ZzgCOZgtm@$h<1*4mG&zg1syM))jFqjp6E*GF3?@2dqnrX9$wEz zFHWyW@2)<qZ>b-nU!dP%02^2tundX}It_7#wuWrOBZfUjL?b7oB%{+t1IBX3KE~^f ztBl{9XqtqX>@sOFnK89AjW<1J`q)gyY@ykDvs$xH=KAIg^8)kx77`Zj78w@R79Zyt z%w^6!H20w;*^*|NV|l}J+RECBXH{<X+FH|kxpkp+j}67f&t{v=EnA$evu%cLo$VJp zD?7g31-lRSM)q;`r|e(N)0xMdcWmCE!yE^?Ly1HGd}RLe`G@ECFHm1VUvOl>b4Lxw zD900yFP-$9Vx7)7y>~Ws<~d(>o^Y{qNq4#CigERD-QwErCgT?5cF^sq`yBUZ_tWkp z9+n<y9@ji^p5C6jJbS!Uyck|(ULy;w7p5<4@+Nu*cpvnB?xXL+^Qoo5w1u=iv?q(S z7O@vq`2t@r-#xy4emZ`u{H`p<FZNqpu=sC(GygUIEdk_!$beG;<AKhBxq**^bb|yz zH-e>t!-LC$Cqi69c8ByYF<Fwnq%~A2loeVXMhFWII}tXv)NSd$r9<JC;o0F2B6K2B zB5p5JS{A>oK2j=@9(i#&Zh6S^Q_H{6ed$N&V=KH?6s{OyxG?rJ-bOh_?TvcPbYSjg zzFg_Ba`(zt(GJmjqF=`>h{=l?X1TBqvOdOo#ump;#QDaR#?8iu#8)JUBrH#;Vau@N z*i9T&P70@!YrxIs_OG&AwQto3&zpB55lW0mtmaeDKT~Z2UBO1dK+^oAf~3jh;N*)b zq!e~aTdIEQ=G2#~-B%w^!=^FPZmdyXleuOf-6_3fEwpyU+8Y@f8Ce-a>pa$-%oNLv z%e=GRbp7u2pErbTsLfKzT9-Ar(PQK3Y{_h1c2ACdPVpw}Cf26*%@&*UH_vQ|+Va;{ z)2(@1zine|`)j+|_5<5zcdXpeo@<qRXeWLrd*_2)3wE8{P1?PB_uwAdp31$*-Yt7S z?~B}bJ8y1Y@qV%Wg8lsmd=6CSYv%9F|8_9uV0VFYK}8|8aC6~AQB+aaA;&}I#VW;H zi@zRb9e!BiQBrwC`$*nV{L!SNe;*4z)^gnDc-aZ16I)MAm$FOyPx_y1Dzh#tJ4HQ} zdm271IQ{xe_?f$BUC&mR8<m$-$W?4T2hIu3y*a=9{DTYL7j9g%xmbQl>r&xm^5rd+ zP-SZ6NL5T#e|2beXU)Qz8@2Yem#-LKDXmklE2x*P&%G*kHS6kZ!|H~yYuszY*Q2iw z-iW;MxN%A2{ielD?akiJw{E)MY;19AX}INZtM0bl?V7)A{;F!VYOQRuY`c8N^3LUU ztM<wc>yGNXws&hg=XGA~TF`a<p6k7v_r317b}#Dgd=T{DVNZBZ|HG(<uX^KqKR!x& zH1&Ah6Wo(6ebRk-PpMCjJkxtt(QnmXKj1ph_B`PE<3YyY+ZTy1z71vlE%A5WOSP9} zugqW7y>@?n_s!BbLvOinr-rlNk=_-)*L{EKgX4#`ktHKTA9){VKW!UT94-Ak_w$W0 zzp<y|3FA`}TP77JPkyoa((*Or>&vO+Z-j3LruC+4XS`>g%qGmvu0yYRU5X3=m*q6z z7ZateES}@Kf@HHMSc?c82NB&TNtS9mJT<x$HFsFc?{(8MV+B@*n(VuMEWp;Vi)p#T zaUHqr#mY4MV!s%Q?X;YQ)v-m|pKEF6`)DTv-UPlmu6j1)OmJLK?NCyE<hdpB!S-5t zccL$aB?Mn#R`zkK!`UJB#~-{)u3N?lxiU09opGu2<X%HLc~R$UD`F<&Rjn0s8wW4g z67xdz_TT=S*L&tB$Dycb#icL@?ftaU`>}$s`ju4?6%XT+LeAn76I^<qSk+8l{g7VY z&#_rLqej@=GRRA*tLa{JG^q5GZDIL->yn<ApQi$5l9SIr9iE&QF{_i)IykyIUA19B zRrmYxw3$e?(#ChAQ_~r04LuW|W*c^5ropwHR0+sQ+K`O7?ia5}xX#_CBI+z%Xe8Ds zeauq4k=te~)!0e2CpD2Y-DH|c^Mc53yL^_)Hg|5LD>i>T!&G+PRVSdf>}pC^Y56#u zsea4faD&FJ-LBg;Z|@E-(po4Jf0SBV9$2jBEmL<{uXWe`Q$wx1wkxJ>d#G*Gt;55u zX0$!weHM4#WOenoTbvoNzjLvv!nQi#(&&PY`@}J2-)+Znj(&VMS(m2I1|0Xrb2rL+ zcIDEj9sYrL3~2uRcecLw1QHI517%fc{@t=#K>^(YT4+dj_x7cs4`h!s!+K=v1xrKr z-ARk+c_5KV?-@7R$XJr+urI1N&#j2rJDyO&dK7&2XxyW`=CkpS^ZM!&!sXsIa-M`3 z-A;UxOuHk9kdNp~dMeKxN`9KW{dL;Yo;z>TpUDr6t?iee!DTEzASs^N|8Nm$WB(*u zHiv#-t=6XJ2eOSeKc6f&+djDDy+!U|KHg#Hi+okuE~cV!z@DK{cIf`0)a{Yp=kv28 z^8LOXwJeCvZ~jtbUh_`&u&KY?rdy9!+bfr_^2a%)uWPf5PQE#K=xkY>Qu)QxZ^Pc# zR9p=Us5uvR|9w+QO#6xZCBs+Px2xW!?dYpvD<67S`$74{*p&}y?Oz(2ugvdl;1&#b zUal@ANHp8cbMLvyt;><W^{KEJT^zN-qIER<gKfuXx|BmFUqy}9HKw8ybZ;!(H?(K0 zFL!D0xJoJW(S%Ba;Bj(MM_S*+Q>o03kwsNG&jy#7Y<!WrmXrH3^-#v~S6>h1oPGUu zrsDj&sbwE7ewZpI)Q@~CR=e{tUCrd)=yW8fcVaptx9`hZwc>YQXVpr_re-rbCTE|0 zhBC@!ha5%lRfr+Ht`(2HmLiMk=hd$}M{7~3Hozg56gNn-#jiiK#Q6l`vP@Ij3wA#f zDKSgfD1AcC`C)|kK$gaak#<QJPcMmqOSakP-cwx~FB1zXjyWe{74lL-NZwSB%_L)O S*M~*q0g7~HY}7h{ApZqSUxP~k literal 0 HcmV?d00001 diff --git a/t/images/ExtendedXMP.jpg b/t/images/ExtendedXMP.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3800189101b621094672e083df3a12c0315d95bb GIT binary patch literal 1380 zcmdT@O>fgc5M4JCLJ@}sf!auwx&q02sN!8aA8oAIRZ^!EP^t(bm8%<X6Dx^r*&D_5 z%%9=Hg(HV@;79Or>M!8N)r|91wT+74#^kb|ee-7W-cIs0xkMlOLIgUcUZmKLf6A4v zKcev{pgb1bi(KEMh?N@EW@(R=SiQ*Vl_J~QRf`QvZI(2x*eIz8tz{9C-n(9n2F{t@ z4t;0b<)N9yxRxe5t{8H&Z5`t2X@;65v$#e>fLJ{0hHfCBp_!efURj6fG1g(65f`?Z zO)jO2mGjyGRTV~2Z9fj|?tlw?%6qP7ke{C}2zDKVoRnLv6&&!sdvqT1*XPHb?)jiw zb;v&SShm3NXy`?HY>=rKI-Jwal;9~u3=HyoWcRqPH)Hp#<NHIrtCSf5j`UB!#B&Dt zGRS<?$z-BTii#ihs9LR7DbuK?6#!9)-g?503tsdT7(j^|Lg4h<KJ~}KAOy6W4>t;q zeZiOXx196fmI5J&56Y!j{m71*sh<va-n820p9}@jR~P=3TUTa4V}ndUYB2EEN(2Ap z!6Ed283&uN+BCR;=Ube6mM%<vEc$+Ew)^f79@%VP=DEdA9faIYx5csrH#Nrg3MwmT ztfN--a!FUqv!ZLLYo$Q{Y|NtwpY-PqrdUWXU@hOdn|uLS6fF1t#W)gpxgmDXPJW<w z=+XLm{$ZYMY!FS}mNi9&P|R`~rd6MYbyrA_^Lf05<;_jGB4fE?Rd#kNP|zqh?kc;w zOFpCAeFVRZ^aQQtq)bjqzMz*#lF;?IcPoR|Z(>mHRwnt59%Lk7&g9TO`iQoZZ@&S{ CTav*5 literal 0 HcmV?d00001 diff --git a/t/images/FITS.fits b/t/images/FITS.fits new file mode 100644 index 0000000..f688cd2 --- /dev/null +++ b/t/images/FITS.fits @@ -0,0 +1 @@ +SIMPLE = T / file does conform to FITS standard BITPIX = 8 / number of bits per data pixel NAXIS = 0 / number of data axes EXTEND = T / FITS dataset may contain extensions COMMENT +------------------+ COMMENT | HEXTE INDEX | COMMENT | XTE - FITS File | COMMENT | Generated by XFF | COMMENT +------------------+ ORIGIN = 'XTE-SOC ' / CREATOR = 'XFF - Revision: 5.3.2' / DATE = '28/01/97' / FITS file creation date (dd/mm/yy) DATE-OBS= '09/12/96' / Start date for data TIME-OBS= '11:56:26' / Start time for data DATE-END= '09/12/96' / End date for data TIME-END= '12:01:40' / End time for data TIMESYS = 'TT ' / XTE time will be TT (Terrestrial Time) MJDREFI = 49353 / 1994.0(UTC) expressed in TT (integer part) MJDREFF = 6.965740740000E-04 / 1994.0(UTC) expressed in TT (fractional part) COMMENT MJD = JD - 2400000.5 TIMEZERO= 3.37843167E+00 / Clock correction TIMEUNIT= 's ' / TIMEREF = 'LOCAL ' / No path length corrections TASSIGN = 'SATELLITE' / Spacecraft clock TIERRELA= 1.000E-06 / Short-term clock stability TIERABSO= 1.000E+00 / Absolute precision of clock correction CLOCKAPP= T / Clock correction applied? TIMVERSN= 'XFF/95-004' / XFF design document OBJECT = '47_TUCANAE_Slew' / RA_OBJ = 6.02170000E+00 / Nominal pointing DEC_OBJ = -7.20808030E+01 / Nominal pointing EQUINOX = 2000.0 / J2000.0 RADECSYS= 'FK5 ' / Julian coordinate reference frame OBSERVER= 'FAN LEI' / OBS_ID = '10080-01-02-00A' / <proposal>-<target>-<viewing>-<seq no><type> CHECKSUM= 'mB6cn96ZmA6bm96Z' / encoded HDU checksum updated on 28/01/97 DATASUM = ' 0' / data unit checksum updated on 28/01/97 END \ No newline at end of file diff --git a/t/images/FLAC.flac b/t/images/FLAC.flac new file mode 100644 index 0000000000000000000000000000000000000000..120b5dbe24234857a5e312a6855f21cbac46c89f GIT binary patch literal 282 zcmYfENpxmlU{Dfb5MucM|38q)_=TweNHJWI?YY^{u!-em1Lur4Kb-1X7#Q9t0L6<^ z(^894^O92)ax#<Ld>ow>4D}54j1-Iv3``A-3{2U8YC!6OTmyU@Bi$W6{o+G{9G$)6 z16&=wZ4LAcpg;+m8jx~ZT_Y1S14E!fg%l?=lN^1VLVXFC1W|)wk}%M|5YG@FS6kPL n%(RgF{2Yan)Z!9Rps=%lKxB}oyGMv^Kt^Vcf=6OeS!yK!XirJu literal 0 HcmV?d00001 diff --git a/t/images/FLAC.ogg b/t/images/FLAC.ogg new file mode 100644 index 0000000000000000000000000000000000000000..817f87796bce26107df0eda9312eae4cc1987d1a GIT binary patch literal 151 zcmeZIPY-5bVt|5(>KiT~=C3Qyb}$;(yZJaeGcqtRrTHW}14WgD7=)k-8NV<UK$$3% zKgc*Z02v3=&oIGp(hWu(76t|l1t6~|H7&I$H7_|;Aty5lWQBsEo}r$Rf{}rNsezG! HDM&j2$BG(@ literal 0 HcmV?d00001 diff --git a/t/images/FLIF.flif b/t/images/FLIF.flif new file mode 100755 index 0000000000000000000000000000000000000000..1692a5890eab37d9fb05f7a3868980a91cee6114 GIT binary patch literal 674 zcmV;T0$u$^Oi4yFF%J)ASZ#2E8C8+7Zo)7ShIgLAQU_1u2o;rLB`}m$bfBsVQfFfy zV3F9aV;aM&b?77Y73zct(e1v=uTSxR`7Bs24(Q1ScS;xZ_xpzuB@6m7S&o+W5%+3w zcDOpfuEqHvGD&CCK^|DBY=xeaP?fr7p`cuv4YD}5YoMfy_(MToD!xO;o`Tx0jVZ}P zGD&H4IJsr-^XJ|Wsi1rBEdywpCTZ>y<93i{Sq7sqjK{;67}h84c^K;YE*b`;bIh?8 zPFb&vCN1-gIr@Uq0qNCJT+R0A%FZhVV2KrKUqhOt5Osv)QZV6=d*fQX=vVmJ!G%gS zecP*&EV%o^Qx5&EOT$e(hkvfix0^qW?}xsCcD(i(;d&9&@eD5Z{Rd@OX=YJ9i!lm- zFbqXsD%}M)y?}THXThZ)j&2Hy1xE*uZxf4w{QSJ+4^KQG1UjJ9E$sJ-ml~glq@Jbu z{UR-ed6%SDwcF;Z%=PQ5F=uQ}XT0DAX+uL$f)JIEy-EW?5Xb))gdm8DNI-11N~6X# zNoQkBA);PFxI*o6n<EBs_t>l-g>Rs(U5ZpzK7;rMDFmOwLJ+JhoN)uERmgu?<~PGI zUqJ949yG$704}t%t-W1wd~z!CBg`R>C2XV6R{gZrY#xH7jZVk}_@}QoA9>xt^qTD? zeMR<z{*k5TRDOqex$8M%jy<0-+o)A1z9pXTdcJ3lJr9_#UFwLRIA5if`Gt6W+>5mu z_RftKwT_7s!FyLrl3qnh`DeNbS$r#>I9LH1kHE}#7OUO?!!=;xA&V8uz~UzGJXDwV zYTPBrRe(u;R^v1Jy?0O;x#Wg+1N@ZxT9rgmc&Bb`YHZu}h|5xL;RgUhPXJ-I{h45} I{sI@Ve==uDYXATM literal 0 HcmV?d00001 diff --git a/t/images/FLIR.fpf b/t/images/FLIR.fpf new file mode 100644 index 0000000000000000000000000000000000000000..9e0f1e2ebf1aff55c90b5c31fd561667e58613c0 GIT binary patch literal 914 zcmZ<@a8n2<P0GnkR`ASCOixvC%P-1JEMb5FCLp7R8N_2^Sin#L7G?yKlo4(|o<Rz( zCI+}nF|jl-Fw`{y64+G$<&8lAyDS4knp&;1@#G`UZvH-o7Pu6R0C8jEVtWRL27BYl zlYrqd$r<Qnd;a1&pcn%KLaYJIrzAM;vV&3x1A`b4a|5w35Q_kDH8|}685Dq}3tOFi r`nsGq{%>?%e6iaZ#;3r@L7_GNaFer5N@;Fxr9vh+@1-P`B-#N0&i^zW literal 0 HcmV?d00001 diff --git a/t/images/FLIR.jpg b/t/images/FLIR.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d14d97fff6ffbf646d8a62b3eda7b5278294a6e GIT binary patch literal 7338 zcmeHMcUV)|wm(S-H86l6MUdW$Nq|s9kQQkI0*Zi2mm)=^ND(Pw0Rd^EBGS7EQbHi0 zQbHUQP>P_SGk}PrjE)2L(aGH>1X0JiGw;6l$Nk<nE8k}Q_G)LZefBx5y$}5^eH!Am zBw7$51OkE(;0MuXFuTm6{P#kTg@rQ24nYtn^c?~T@d9)VG+uyVX&z|&2o&tXXrc%- zgBODSIwr0JSdnRi1Q-W=1pu!H4bQ|q0Ixx=#_>PS!iX~t<kP^3Xl-FH=@1<j?h_Oy zX=KdkyZLKF=0Fc$dxe{X1O<fzyLkr&N=E9aW7P?sI0%o$;q|b1JseIFr>Te2*2C&R zJWzhp@<@|m_e><j0vHyL$D#m+N0$cVEKFPsFd~bMVFRI%2-fUn-xeU}Wa3VM4`s7K zi@=u(FjUNpiNj(M#jBYinfL`TL4Af<%9mrdf@~$rk&qP7UxlX&5GQDcAm+C+`IgKZ z*u%|)>B|Y`XgRtuh=^ojOMp>KY!5IC6T1M6W@1l(S(!KhU^d_lkL&=z>`a^sFbB}A z5GRNPPXOFt(gXm;B1~=vFg&{Vpuuu3;16>?rXKqj1n$#c(DIDIv!;zVGQ*pg5;RN+ zCYnZOID)p0CQirLOj8H1fyLr=;fzqswaE(XzqOY2P^)X%7~s#>G6K1rt0j;lnV6FU z1Ol|OCRaH9E`18z5_VQrHdZt{8yg!32RkQ5fE&Zbg%ROj^PPaWsKk14Q86(|S#<?T zX;m39F-2`9RV+?ZQ&U1gcasiYUtL2J4+lYTaByI_Fv8s2!gwh$Dg6JK=v@#WJ7fph zp%Bs#k`IC6L(r*^1h^4s1cR1S0DUBi1<lIF&cVqA3`o2X5`jV?Sx{&+3wUA>aX=5T z@S*voa7L_awt28ghYH{mvr5=yj2pWJ?T25;YIq(<;^15>BrGB-C$FHWq^zk0Zi23! ziK!WJi@AlRgX8ucPCK1lyu5w(`uh0?goQ^$9*l~PIg)(z*zpr7so6QXr}NI7J(piv zR$ftARb5lt)Z9X9CAYOxdU~mSwCmsZ-xwJkyE8s<_uk~p?8CW7^N)Xe^7PlmrI)W> zzj^!aJ)9Q;+~gHn&g`qa_&{Dr78Vo>8=Mycc@R#Vj|DA-W92v6#^w>aMjD^UE?}Hh z(%8)*qhbF-(DT4B=UQ3K8M$BK)EJrly~L9Kqs%@fwwl)@gh3&|%|r1)hEP8#%;0j+ z1@)>WpT*MDby<8rxT5lQ2tS)zaH=|Gn<~Du{LG?S`6U4%uBZw*&$%s&$xj-cn+wFR zkU76Uxg)!0(e=E)v{NR&2rrl!6kLX3p9_5{d$8JPyuKmVxj#a*YvkOa>e8K~hi|t} zwu$tdni!jx%A3{Q(Em<io4w$!H=|>BFQ*PIn6^iDbi_G3Pi~AjTl&uO{K>fzmNXn~ zCR69JNYd<XohRh5dnW5Fg&w=!97*R)?hju#F|b#m_!jQ5ACI7Sj>8y9_j%f6(K*$& zCELv6v}%WzQyr%v@wWS{Jo~c8+*RVWI;<8G(`HHCGgZp<`Oo5Se)#@^^6;*a_){Nn zL-+4nMZ_%4Wk-qV&K7&;KAvB2VI3nrJCap^O7%aP`d-n)CH>s=_FkK<?VHTQ)0IeD z!)!-8e^hyP5Z65)^q@HwJ%ratdpQ^*`9iR~P;#H^x`hQ5pON^M*G~y0zG-ZV!)<#v z^B8SR;X1W#$qACYQIJZ>FD&1nKnXH_R@H8+9PJXhLD`+V&f+Ep!p5O}#pKLwUOw{f zGvRr%k@`!WzFJsV<rD3^Hz8`RWg4b(1aGcG<}#SK2Y4)o@SE^4qrsiJTIomo#>mI! z`c$(5lWs$t_w^;)m#h?}wcRbBJq(_`%T_o_x?=Og_(ng{x|UWVCQEgI&pfE>=n&iB zt%>}*8Lww<T9f%x#Mcvo9?R_}>*f43U?I~!H(?-u+R|bE>KTL7(|Svf0%A7wxqWES zDQ&v;gXiJOx}8+}=khNDTBKgr@T-;cjbDkjaG~~c`zvX<S<#_W3wf`&to6huNgo$n zr*BFOtm(i+)@Wv>$STwzuPAiK2;G~B+t%gVF6SjY1T|z2G&Xl{zhLPmnC;?5{^?p} zq*H;?@O)AHbqDIBmZ-C3CH6Yq!quW;FVJxk@zW0!><1<?6W+=;rHRhB{DSt69H~ne zKGUXZsNDXmkDfqoqd<PnJ^7*!+Jox@l|2^ZXJ6}kZrmdIAuXOWdNi2*`y|`n<|eLP z5ba*45}fdUwrro({{1p;H##W=;p1b5iy?2(ecJ+VJWiUrNbD2ijpGh-zOm)TzT2c* zoc99wI#Yx*_T$Bg8m}7kaGP2N1x_9}Nm6-mbE(rH#G<<1S#9*gM0li~rOJaC4Bu}K zNsfuSRmly+?KVgGhl&=PohqU>I4AeL4wHG8rM^}*w0|Lg$y}Id@#<0$&r=Jp>Wzj- z8&r(bz++7Xd;UvXV~3mfR2P^Dx}2=MWjFSVv)8-3+3)yz>T5?X+fNCFLIp}sWBH?M z^$yjA-waj7o9WR?O>@vk+<i064ehr2Cbx7HZfua3J1r4IseaIw#Br-lR-&ew%f+Np z>)E_~-Y)Y&EH_!^dG*i5`=R#**%oh|$6gPTBd2z2U8Sf+eh7{l?j7Pbrrjr_{66}h zC>dJn$tZkv%P3xJHpR)48jTs8nh+F?svJ>ymE>$yJWa_!)RiSt$Id5vPPtZ$jy-?h zQd*b(TR*{cF&qlrV_3U~D}C>*(HkrG*oUdFPEMT&2_kgOB#Ij~D35EN`#E@5Q+D#4 zR-7$stgvT*a>i)D%~v0}75l1#Y9vu37v9>>7NFzyoqOQXHd`Q+Wy5KvzrnI+JDV42 z_~&`@sK=5JcZWjJOr3;4fLlQ4+F!-YB<%Fo><EfDd7=)ZgW12?YrLHfDdiix%I5TI zExy}}u8Xj?k)GH(b>|g6U3=(})cBw};kkiZXrXfFF#23lhKhwF`|Ct&Kf#QLlUHs; zkwi0gkOu2qhAYTqZq+6V_IKVWEz4hapDuLYCYy40T00<Pc5}63gjVjtWCPckZ4E9v zQ){0+J6xD-wKZM5Wm<(G&=Pz8N0Pw+@tM$&6W%wmhj93~A06^@Xeb+XVXwLzEv@h< zd-C9qlDdXi_tc6|^6kg^UioA~nEvjHU<VV{%2c(1O)Ai>T3Y6%^g4WxW1g@6kv2Ni zvgsmmB*-_|WrWwDj1HxiIzCc9Xm53=d>_U*hph73g{w>6+?||hC4+bcis3@p_V@Ac zpZ*;0?XLgC`S1}sbZO5f;uC}4^MBuB_Ojg#;@N5<n`ne=EhFES_!#lA=c51}`c-Rf zv+qpquzGppSa3xr$8T*9Y({VCzGDk~Q`_s9?(9snx})i#YHV}A;kmEQJFgtOvv0)0 ztJNHA`H8{n6odAvYU8L=-iz-M8HcXU#S|8s#J+YeT{ES+w%hf_+U|0H;fN)X6O*=H zNu3!2oNxTco0@cg*x-7gh<=Yg^W7%6qKC^qB9XXKYkbb(0&z2FJfMO4@Y`gUICT(| zqj24b1{Q!bOm#k4U%&YiB+V!;{g`^7L&2LE2AwZTEQKT)`T!sR{%BCFaU5c*A-rl8 z1xP_{$0%5Vo`(u>$ci4<H`um<|Kb1H3?Lv3B)hz`f&(B}7?`mM1yheiA{fhHHMTya z58*&}njxx9NWdo~nB4VL3Vz|8kl-B*Z>x}64BeN1b`b+T!u*I1yTTZ|$X)&iLW0%z zdjzgnS%Cfu{ubx;N#pa);P=m36Obbicv>*{?ArbLLI(<j!wW?si$$YK*F~3$#a4*N zRjrS&kw~bOOsbPgz9fCLUgmg%?1@IX)F%0~W`*<?#Zx4uOp<a|t4a=8HJ7ZK*QR!+ zUHxqPhWvKyc?zz8g1<n~D57W<Q?yDbgi?xj8AYdpqFYJPtD<bIrs&tSZ>nuKxY%x3 z*S7gmn^8U4xS`eLa;s@0$*i%3*wnJ6x!Js>$%52q*?QTkwZWQPzqRd>O<SF9`$aoS z?KVn{eMhxJXQg9j#r7-ZJFb*DT`k#pwb=Puk;}CUu3ZJYy7G5-pWD-Y#;qsMy(ibB zC&#ll%d0ojt2e`&n&v}2xtE&a+jrcr@0fpIazJ0wzP`jjT6_>KE|?Y@LW|i?iwdPh z9-u{p(Za%Mp%Ju@NLtWAT3{3{Ae!bEL)#lm^EpKGilccPrn$${_9W1DCDL4yXwFCa zoRa&tAMJBI)@Ogb&+Y`(Hif!1m1=d8YMIt+p5D79qu1<Ik7;I)aaNB}cDG?pw?S^V z{^_obd0l#EuIZe;rhV=jA^)mY{#A|hSMUW_a2GnUg`FFUI@F6h)JiC-r4*I2cIEOm zrHVGiO0r@VS)saBzJ?@MOOm_TB3suid#PEbzDcH`QTlSDbmL{|rUt3z2C0^MDbgjW z);cM2omAUJsrFhaN{v)UwNz)d^pz^<tCiB%DrCCKWxC5`d&=Z`OXa8~@_oe$v?9gp zg-W0<?JrQdabET2d9{Ij^}%!4p|iMKXEbi-X%3$z4Cm^M<mioN>yKp_+{xTLe#&?v z!}M-C@m`w6<VmZkRGa%Lb`MTC{BV57kH?&+kGjqrahpx@e3<Anm*Dp(K5+hU$m6)M zpAJPniH&(0b9f;-2?<4k-!dHp>>%T;2JVA>8lb@eYeNW1Fx1G&Hd$$KpP>ZD3rzlr zftMYF)?9ERLborP4i40PVME<Kv2i`sMt@OJu!ALYvO_~-=`(%T=KOx7sYcETll*=* z)4lTkfPdcKZUU~odF2|PF8URK|3|>5Jby-xI9+W57W+x9sSWn@8akSIrbI^_rw+d> z{;vrhH__Jm&j<E5FR1kJy3s`0{?F!Z)lr0Tdb8U92mQSn;GCz^qcvOghs34fqqx5$ zd9Xk_!QmBrPvL_OP7Dt(ABF=Q1F)b00SP-hE9ju$g8>G?&&;Ri=8O1_0R-ERKtiQ2 zi)%QtOv+<2!CL?CCTsslpRY%_GLOt>bTh1H9&CMW3c-0gIv9s|9DvKVWrF7d1DxUf z9UX}KJysNe!#ZweV1~}#1Ab*OXhnyL0DfP(LH58e|4*yIl?eav|MnS(zw^71g`<Cv z&-Sp-hB|FzZ}eH00TT@EO}-Wi7~60Cqn+&^oQ+L(SciD5uE?)_{`dX5nhL`$TfT}j zwu$(M;Q<rtugw1G{{NYQZ`EGhAU!c?`Cmqgoy`_*PEq)S1h<8`sXgHAaASwxWmZ8- z_W@gLVQS<URp9yd6bg$`W4vkUbQDBcf6Zvm0TN?NYGGz$T5s&01ik<yLjt_KBK#r> zLP837c?o&Ex;!9t11*>gOpO?1`tJxKC?X;$CMhp0EKiV^lqZ-HR8$DS!C1@q-?^>o tmOmk|L+oFCLa<_dLj?J(5-WoFs$UiH{y_qN{P~jTUz~3@LlX3R{{j+>zFYtR literal 0 HcmV?d00001 diff --git a/t/images/Flash.flv b/t/images/Flash.flv new file mode 100644 index 0000000000000000000000000000000000000000..a502043d6ccc453dd0bd63209e25fb2f5c964346 GIT binary patch literal 1358 zcmb7EZD?Cn7=H8FeA3c()!9{pinTLM(zNI{KXS7!Rb2N`TFPAU<C1%_Tz7kKntPHg zUDvHtm}G(-xH^y_>vS7BI%c&_6bwvdDwbF`OXyq%Mb_qrbg&^~+Uq&@CT>6c<Auw8 zdCqyC=REIu-`mmIt1|(BmAp_5hC}pA9zED3aSOuiCKj_60yKal%F3HjIud95k*w2! zHJm`(C0@j`jV91d1~7_bRS(AY1Zn{z=KB$WOOFw!V`R;Ql1Rivl4cn1&G45p0++se zefakLBVdcMR1KrJOgHPntO6}0NU{Qz&;WlK@KYxx9h=A|`CTmLC6S^|Ho@@{N9@E| zjDXo5-|*1f*bG>RtzMo(60u~Ki4=(d9AQ@MMre1B6cRaVR<*5Vww3%;s*Ez*9}|$a z^81js<VaG&u*9J-&jC|aO0ZCMnIA+DH2;!QL8rjVn3hS#ga;VQw!+ig&IY)bTg_m6 zB@(NqN?DlvWL8C~haj~_PHNM9B7sdq;KZLZ`MQHofK@$^CT&P-Ne)t2mY#^b$i8vF zU(vVo&Ad_tmF0zS9I;r6>w)1#0by4^;&|58(b?N0NrK;%Z1MO!Pr902QH*07yxvqQ z<xw{_s~bHW@<xOtrhCbq5Qn5MaFmx}6*axP)Jp$h-W)~zt|$hET%6`F!V9QWxTPH` zWG9wse^LYVe#&&R0Zb|-ZA#<a3IygzUDuqkK;UoTQ2UV)^W9oIDSJ$kdD<#!GaG>! zzoJPqg~bDE6x0o8wZQBiQv=de4z<|-UbF@SIMs5~qiKCHxHi)@ZM^{&E<pg=kc?$I zbo__xs5(_-ShPVRMocN5!%<+!fRshRFkTH10BEF$I+^8+|37qu;YE_gYvk~lvf#=> z&HCy#qusWn?wRn!zD(D}&cey=eP6Dd-*od~?(r;>t^fG!>>FtBR-dKjzOF=JkvY1C zsX93{VYptgy6H5Gtbcy!+A(G2(><?E9Q$shK}p>lE&l4$_sxr;Ef0<zIdyB9BYK$p zWM)gcwdOq?Hiyj-5NBoGlIW?MdH1LBZ*_OxQk3O`-uAH4THmPT=9Ir)NPqoQ?zz_Q zKNyXy{wV+G!qvi^#F@djC*Rq+v1!#e-m0m}wKKU3#T%*V<y+k+o}Ik@YUBGE_s_MF z{jH(fgRPd@Q?r@FAAZquE+`l39#~j8ebv-<(SGzw@mg`S+nN1bSKM1M5HfcL11~S- z2ewT{&(~kdHC(>@+2VvewQhg2^PGF-?C|~GAMGvTCl@j%tKR>Ld+NOdf1DTGOjFHE Oy4Z2S*QZVRZ~p)+f~J@N literal 0 HcmV?d00001 diff --git a/t/images/Flash.swf b/t/images/Flash.swf new file mode 100644 index 0000000000000000000000000000000000000000..176fce979d97162332a7fc064b0cd7ca382ddca5 GIT binary patch literal 384 zcmYk2&q~8U5XLtb55b!+u;5`&$)+tuvLr2HEqbVkE!1oNY?GzU?viZDS`d9N4?dC? zAHYedrMLOM8GbYK&DYC|PY0n_^p2cggf1QQaaDj3O|4F{EjKvjg^)4%`T8bU<S|)~ z7r{c`@lre-YQ8)?t+K;53v)7^xRGVH(iJxew$)BH%*G_iRmvIEolObuN6a=Rk5y7| z#_p}ytd!c}8-E-SVAT1Bz0BrE0;rgj#%M-q+qQl?@>N~XK^TTK7}DX;g9)#BlP0mA zY_5Ue;+`?%O;!tSgp#;pCaKz+m=G5q(fSN68^1r)&s0UBK?nYb0t@2^6uaG<Qq_~^ iQtYCx{cpf3+Of}e!3VtsFLdQ85fG<Lxr88FNbC<S9eUCL literal 0 HcmV?d00001 diff --git a/t/images/FlashPix.ppt b/t/images/FlashPix.ppt new file mode 100644 index 0000000000000000000000000000000000000000..539dba73fc5f3bbca292956d81ae3d956c7c615b GIT binary patch literal 9728 zcmeHM3vg7`8UF9R8?u4KyCFe>qFgLhv<gU^jt_(gDTNVX$3$zbExSoJWX)zb-Q5@% zMV4w?s!-!#k+clpqcf>aTiZJAh;50Fsa9i+C{;RC(!q|;sq0&$a{GPf-n-ds2o3FY zTBe+xbI&>d`Op78|2g+=|Fh)-cm3?7zequuD~24hOJqzQTtlB#m4HYoIvgLeZQB8g zpnJR=Ll*cHvX;Yn2C5IW2$eoBM)jkXppHcyhe|)Qo`AlIiV(=bjv<wgi<)Nvxg1XX zH;Rsk@yIb31U9T~`oXei%fI!8+$Rs6`C2~d%xfj}7cY52D+4g&CYGQiq*Ef26!xML zm$X<?i+-bYNE>Dd8M#asUDGkm_@x{pV-C&`Umx#`i=<BRX_GKySS5?WuNmBv;2j3% zDEjfirNesU&wb<BU>L#(fS8*|i-zfXbn=`J{vPkq>QB?(OQBIrdChnnn_iRGjp-O? zP81oy#%5)o`GEW1E3Vj@DJ8x;6mYDMq*zUP(VV7W&zl@OxI0Ydi4?5dpzN8J7`#f{ z)AMlY6OkPz-BO4<dl)vUkAz(f?01b5!F;AXY4VJkCA*Y7Tw}`a;w9|JugqFJ>)~NW zSqlBt(z`=unY*aWYUzLHMj0q)wRd*ywRg&%rJ98NTJL>JwJmRYV@+v(uSpwaB!s8q zg&!);82V@6;b`|Gg~iOO!+Ih$a*xT_!Vda$9@^6^ktVb(UJER>m=D{2Tg^HCu411i zhKnrCa*U0Bjqa=<JY<BpF%(Y5mjO>&V4ROT3K={bBS6MvEj)cl_e5sKCpQvwWOcmT zDC4rz09(s=_us^6|4uD{Q=nJFz;A1QoEVypwf-78^&NVhn4BZ*BP53@k~Jp-F7lpH zi6{Bwl??l)^cPRU#1yIYIk*#i#NBa9$6NB$_b-~g^qJqY1ye-fC&mgcl0$}4lu~_a zoQLPts7-k-x?=5t+d@mV^v(4|RO8LCX7-?M6VNUP4IX+d?dW)8&eh-qoFc`(IcnD7 zF%^CC@Y=x7%TzLICm$4wrb34U7H!Y@Q>0=D4X)3xqoHBSx{436&Xij!ZX{i793INc z)h~!tS}zx1d}~DrPg7noRj^3@wyX;HFh|V_=N+evJkNC^`SZ6_v?$mPla9)lVm3D4 zEIAj@TPteugya()3w~!Jy_8?BB4c_LLTPN>$*#SFSQ%X#m?wMO&GjdDTYnaGv*rg1 z%?T_g>fHeI2+1~u@0>h6CR1B|G#!fs+zA3idQ^ngbu^?oSLStQm!(`#HS&vV(Dzhs z<0|r?Vf^;qE|Gnv7e;IkhfiG#@wxMu{|<*w+(P^cz?>cOhSJxRkBz%QM3=V>I-D|T zdU1&-3x+I4NV3HiI*5EcMKYO;Y9AihFV)rEBHi86-G}T^fVXMWCWUu!U!B<9&C*v5 z)aK!M9=+~9Tl!F|tNY}qE9@M-mp^<*(eda}jt#$qEX`orlTUAt!t3npRIP1)B-MR= zVh4lZKZpkf99^!y3N0p@8l)}p1QkRb#LIvRd0jIF9@@20zCQN?`R%HZTJ!wflXCJw zD}^W3&=L66l<NVCXN&zR4guFL6pHk!o4aNIo6rfiTX@T*3NQQDLB1`mUsZV2<GJUa zmaeXENM>t~*nQ3N`re0f^qN73^ybdJMzx_YUoXwgHhclT(97d{`P|dh{5jSH+1I;4 z)?eQ)w=JJ3eGiJP-?|-A-DA$hQyX@!Xv5AGX857!%GrR3!Q1^k<_+jNr;}E2I&q`F zgj%Dr#c(PX<`{q(Y^n<D1<gWVN3?Q$n$@p!oi0`Gd{&)Px>Tz1!xAXUFxbU9;t6>w zQBX+BIje?hQc5s40eD(U0;gZ2xI6uj;_UP@K8I@%TzM_VGSRpx6%nWP#un*918?le zVC2RjSdcr`n|COOK$%jh#Y8}92aMh#H>c1}9tLfs)Wa0*qsXfMcu@E7$4llgRI2i* zROV3`pGPH-M<syFQ|c>)Ag1V9AKHNUv&<e$nPb4t6eGJuwZ80hz%(hz1{@)VJarkX z){!{%GR2qOg?79P*8%6XawF~(pGS8MC~1-r`QB>zwvu}2Ekl#?+${q<-CG9aQ(Q9I z16qG&&}T}yE6ro$yqu@WA0IcREL#sQ;^ukPMV`0NSrCghwp!_g6={m5t;@oxbR=o1 z%x|UAt6~w6yG?38)mbF>sXH7;j)$lj@0y-whO604&}<g4Jk2tjRu|lyj;zywk2;B2 zs1v#Bu1;H(OwOU^NYkU@_V7AIR;C@5Qe}0K#zefyibbxA#LDVhqDim6Fwv1rx407v zqs?BQR^V=%syOofO;cZgbYb66eJbu)r%uh|q5S?NTF*MZ5v;TQ&ZDzV$b3KxjmZQG zt;3yCtT`SJQUKTEWGk}W<osEvcd3htx36eX7F~FW`Z)Kl;OWCz$G-ITQy6*r6pf%y z@8+Y{r?~%w;rej5m*|c@%t#~agI6_I3x2lIhG_K3QE0?n&Yf8pzXRPztC1DxuN<xs z$@~8Wjr1WJz4T8sS_CehkJRfqlCG!GTDlVNFUU*&joNp&-70rzFaM@Rc536XhVKD> z@fl3}^9*LCK*24@yWJGtmMmPtr(xB6yx)fL&7f5*T*Q;=-O~ArG59^fl)o7-fs=Pr z!!pTTB}FnE<4iS}kJkZ@`8b2ta`Q3cf^RC!$5m>6l=&EIynGx34bMh8;1<Gs0kRfv zju{E+H~V&iGVT!SsTnF~yBT+T5wlafzi|IyDP($a8Z)jsePwITQ`|fGJSqQBo&lqf zr^==-&#sb?VO0#274n35@X>Idgp=nYw4R=LMOB}z|I@J$kn%tiSn=Rox#i*ZuVo*3 zbi?K5r2fn)M)hMm?JcFTMGfnNrDOEcngh0d$&#uv-TvYuUHY1}AMdNVsG+j7D&(L4 z?16i=)5lzS$DG@iwLLcO4}q_2+rQrS_k3nTpmpAldxO86B5Q7V_f?VPMBc_UsUb({ zgM+Wb%l(z*9DU%tZ^IaWE_ROnM**j8e5h=Xm;YxAFamhKF{3adm>u|ypEr7L7Un@5 z2kQGjcQns?o|4}8e+C)fS@|x?D4c-GvuGkJGl}<~0Z1M%|AQ7dg!f}(?C?B5$iO$Z zy?bC;OW^+7{qngpezAx5**TbS?tg+e7bkXBqGkN7LuCwYMr9oJpz`kgYgEQkKPuzt z6;#Gd7L~CT08Pf$WS91Iw2ZIw&@wgyXNd6jNm}Y^j#qJxNfRGsu8lON)jVT1+>vfc zBprP6YK^SwOeC99`1EXX4PlLmwzfz-or6(^juh_w@o-xNhZ6C~_gqP~vd@^lEZUe% zq!P_(E12kvB!h`)Jk38XYA`3^^;_B0pk{8X+uDr(I8;BoZ_Wzzy}gC$VPz!ylfS<E zncZ7voE+GAC+vUrfuGa@R#X6+3`E`}XiqfC_FTIim3$vW<$mo$rA_%QjXrt{mG*oe zm3I3(D(&e55!$E}E$vc?mV24L;eUYB&<4<+jh1_!KH`4&;-VH~`mz%(<?wu`>>f@> zRwR<E@Rv%0cBMSa;^(9qlaWZ=s%uH$k08P+M_V`^UJ*$uzj6$pwTI)YlurEb#<M9~ zuu@|*hi#K3W0mZjrw%NI?Ws_Tv}lw1Xj>$uw3{Cb$6KvnGLk~PgwxSP+(p2bK`F%& zqElp&TbMvhSy!YYO^Onw;uNh_8%af1#I5>BTYC&f7&6b@R2PdjMJ)9(GL@T@bub`x zXIX?wich1`uFs=V-h-(0=a&HFo@+%*p;Bn+*EQ}Kjf#Wi!Ns-9mn>d->HJITzMv@3 zTMD{};5tQ(umv5dbfOJ1uS_e-j3O7dw4<#7z9FAH%vx$jp7g7WIX{tzMZ)o1C|rUm z8l?q)wYB4FoWy0BfBNyV+<<Fy3NRMp)k9x~HPs|p&pm8eJUG7Q$;qfK*yCwXP05A$ z>t`k?tpx36zz}cXGXu{gzRAx7FYiY>Tn|<#ySIBZkHpK7-{IwO>cn4|ouJ<aevROf zfD8%6c?QM_z-Owz6C2Sw{OGE*dNoLsaZZ;b@tq7j{wW!SF4XBl=-Q%2^T3aPuU!j@ zjhMT*U_4YuFJ2p!gVXeHgnZ9Jtw9z43&#D`PiTy3$1VhpSUxnTVvcA3^4{C`zl;k( ziM+4=jmhOyFNjB^aeU&xWq}0<oFsnE8>%H&AauAbM_W$9*3Q4yjAq>=Ae}iH#8KiL OE&oxH9W~mq%>N(#{&W}s literal 0 HcmV?d00001 diff --git a/t/images/Font.afm b/t/images/Font.afm new file mode 100644 index 0000000..255ad9b --- /dev/null +++ b/t/images/Font.afm @@ -0,0 +1,28 @@ +StartFontMetrics 2.0 +Comment Generated by pfaedit +Comment Creation Date: Sat Sep 4 16:12:41 2004 +FontName NimbusSanL-ReguCondItal +FullName Nimbus Sans L Condensed Regular Italic +FamilyName Nimbus Sans L Condensed +Weight Regular +Notice (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development; Cyrillic glyphs added by Valek Filippov (C) 2001-2004) +ItalicAngle -9.9 +IsFixedPitch false +UnderlinePosition -100 +UnderlineThickness 50 +Version 1.06 +EncodingScheme AdobeStandardEncoding +FontBBox -139 -376 1021 1130 +CapHeight 718 +XHeight 523 +Ascender 718 +Descender -207 +StartCharMetrics 1 +C 32 ; WX 228 ; N space ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 1 +KPX quoteright y -4 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/t/images/Font.dfont b/t/images/Font.dfont new file mode 100644 index 0000000000000000000000000000000000000000..0612d07d9726d6d3a10874e5b02067589b87a537 GIT binary patch literal 1744 zcmd^A&u<$=7=3FyNkdS8iXSaPXbw=MDq63trjBcVC~1<?3vuhH2ZWH;yR){H-5qOo z64ydVkvPGfD+g}<D>x$l2L2DO<<0Db7zqxXv9&XAzW2Uw-h8`W0|9{bAAmJpIOg?# z``o#)amh2U?S)a;yM6S0mYph<3%3-9$0uK$ic?t`D!y{f3h=sZQ5hHVqi;U_p71?# zpK!hv+;Iv^pYXD+wc{37HEy7VFFkJJEqv{9i#02c*YGjE^LQPv;1`cK@C3hkyopzX zcRk+1?Z5Wj#s|S?K7P~f+eFaXq>G<|1T_xub|dh(f$hdS9yf8f@u9~pyxBPMcn!}R zSGnse@eTak_}yzZajW^Q$6M$&fAn}8pErN?_zm1>z4k(M`g^?{j{V4u_jW`#iaKuW ziv3iLr5G(MBa2ErE)%8aO2<Z~q1exJp=Xn+sf3o5)E5knj4YE`E=DFjP<h%7qwelt z|M1{w;29Dt8ev7xq^@SF6t#Fb5>Z4LMT4m_i7GEdhY!MTG$`UTsZ18;voZOwbHCq< zuB#4n8CQ}{GO2}8!c3)jsOC%OP*gH8c8^SvB$KJq2&3av7O_4Pu`zl!K6jE*nOP#M z@R8JdDTZnx^L%Q|{6V|DSS-TWb|g$x(KgGu{8yr#%SoJvQ&Z%40f7$s*h3FH9`_Ng z;Cl{t8H=d2ni_YB_K`wi3`sn~l8>b!E;tK3Mu~*1#@vmu<5Gk!FGtQ<V}=Q)WNe0J zZpBOEf}>TAT#l_Xb9%c@@s#WY=ZwVEcBzXv?qWbchd96y(cd%cynl*4bNf}SujtpF z?Yi2KRfIct9km@8(5<2id$N)~ZTD<O$o(x_(9;=fT201i&dOt7HKg`Fd)=dQNJdg? z&s(27b4~>F6eEWFSmq&Db9VN+Q^MsWR9tz^sL?Aqc3qOURW$cVS;_j+bS5|(7q`C7 ziLR=Y%(AP5>Wa=EIX{|v3%XTUaBc6Jy<3K!9-z(d!hJ)xOZ_B-t~Uia!`wNu{(DB- zb!Wn=Ii1-2g6M!Qa-ODsQLg?IjZU7Pw*J5+->%09s;uN27&kBY<K_H5E?>UneAnh7 IaM-~=0aOVXU;qFB literal 0 HcmV?d00001 diff --git a/t/images/Font.pfa b/t/images/Font.pfa new file mode 100644 index 0000000..7b07475 --- /dev/null +++ b/t/images/Font.pfa @@ -0,0 +1,38 @@ +%!PS-AdobeFont-1.0: YehudaCLM-Bold 0.100 +%%Title: YehudaCLM-Bold +%%CreationDate: Sat Jun 12 19:16:03 2004 +%%Creator: Maxim Iorsh +%%DocumentSuppliedResources: font YehudaCLM-Bold +% % 2004-2-16: Created. +% Generated by FontForge 20040531 (http://fontforge.sf.net/) +%%EndComments +FontDirectory/YehudaCLM-Bold known{/YehudaCLM-Bold findfont dup/UniqueID known{dup +/UniqueID get 4195924 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +12 dict begin +/FontType 1 def +/FontMatrix [0.000917431 0 0 0.000917431 0 0 ]readonly def +/FontName /YehudaCLM-Bold def +/FontBBox {19 -360 750 840 }readonly def +/UniqueID 4195924 def +/XUID [1021 181 2054546049 7395086] def +/PaintType 0 def +/FontInfo 10 dict dup begin + /version (0.100) readonly def + /Notice (Copyright \.51 2004 by Maxim Iorsh \050iorsh@math.technion.ac.il\051. Distributed under the terms of GNU General Public License version 2\050http://www.gnu.org/licenses/gpl.html\051. \012All rights reserved.) readonly def +% Copyright © 2004 by Maxim Iorsh (iorsh@math.technion.ac.il). Distributed under the terms of GNU General Public License version 2(http://www.gnu.org/licenses/gpl.html). +% All rights reserved. + /FullName (Yehuda CLM Bold) readonly def + /FamilyName (Yehuda CLM) readonly def + /Weight (Bold) readonly def + /FSType 0 def + /ItalicAngle 0 def + /isFixedPitch false def + /UnderlinePosition -100 def + /UnderlineThickness 50 def +end readonly def +currentdict end +currentfile eexec +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if \ No newline at end of file diff --git a/t/images/Font.pfb b/t/images/Font.pfb new file mode 100644 index 0000000000000000000000000000000000000000..295f4482758341cbd9a423a4637e608e83c5e1a6 GIT binary patch literal 1423 zcmbtUL2ueH6z(+bl3($5V4~_mVoKY=P92n~QdgnUu7_<06TbutW2d&mKnSTneRe`& zh|$a7kobM?eg6FXy*$5(-W?s)-VcW1B~v5pD``X0h&yo0r=!9Qsk{mAFe|!BvTI8P zIPg5E)$X|!creQ)bTv}TmF!XL@`lvH5OaVQkn;{{c3K3Qaol=IRJsGHRwK9Wsic^q zw8J9L1xI#=Min|i<1(DOL&Aa@bXC64JR4i6KioYYpPYQ$Mo7EehSA~$fgT#3N%-Ji zW++tdcl-=pSMP|vqD1X<Ghg9b(pNgeQgHmK*@F7m+Po7*UQg<whDjR|ZFKDPUrE+g zQ_p7tU)$pv6RY$hI@HpMRKMl&Ae?f^%9FDqj~*m{D)71oRgnt?+gOGcTIB2^z94{4 zfb(P=c?tK69KnNSm`b)<<|>Dj3WF=2qI(2OLuUw97r0vf4eYK0LV)qa!U!`igDtxY zV_L1hQLFhJe#DJ9CJ_7o=Ixhr1yfQiw&}NYig57o8`dvh)Et%}Ic-CDdT|aUZW18m zG=|kK=cYq1ohT^=l&|{`Z@0ddsd7ZsiCin!r-EpP+Bok*-Mjr5b~bQYmE{RSee15D z@mcIF=N{yruG_(1@tzPoflMs&u>s0hWx(%L-~{?y@H|&D@LXNLllLPD{S@sf>=#0m zeXUoXbMq$++_(vm45e|rex?Q0;AfgA`vi2##o|?py_!d?W^YZshxdo24@tAU0Enus zFJ&eW!giy*4s+Azb7TW<lW}FyHSplHYr!QBl;Qr<0wIa3+XOcQYw&)|lZixQ;H<(> zvfT@eu4JMZml+JLn+2-bCg81-6k5CCEnV(vU)CviG7;yP1o40Vf<z$IR!ym%1WS#^ LeI5K9KEM3~A#2Q< literal 0 HcmV?d00001 diff --git a/t/images/Font.pfm b/t/images/Font.pfm new file mode 100644 index 0000000000000000000000000000000000000000..fc1abf3249eb30e5514dcd487f4b31e034efbad0 GIT binary patch literal 240 zcmZQz{J_A#;GADjS(KTcQKAqU6s{1QpH@<ySd^-xfDkvdv@}vksszac)gyyO1}+92 zMjggIOi<AX2!qjy$%RGXzXDM7I1pcg%7Q34hRHzkHB@9ZRO2lupMe47BppU(h8N5) zm}fIx1{!@8D8lpa7sD6EFN~QCr3{7)$qf2H_=Pcr;VL5oLqL9UNpNyeW<d!9(1q?r Y`5{ocB(*p@MAs=lCxzh`gDc})02bRd1ONa4 literal 0 HcmV?d00001 diff --git a/t/images/Font.ttf b/t/images/Font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5525c9affb6c80ce79d461ebfaa51cbc9c817ab4 GIT binary patch literal 1252 zcmajeT}TvB6ae6J_s3m-g0QgEf}0g)ne2)#EE>3IVvr&xMr6Tl_PR4Nvop-j>WYQf z>O&|J1kr;*Wl%xTLqQq_y;MX|7W5+ZlxzhF_VZxiL&v*Udq`-P+54R{=l;wY*0GZu z3JHJ*sA4c{JbdFN1`7bBPw8`L&9|xw0M|_b_{IC|1dinZ?khNYdZG!Xq4+=u<4KGI zJ)AisJH6*IekEcnX0YJIDU4SzwqyE0&-LDsdpOkssGn3hi#{47p8+BTct50KqQL9f zk8u;mdsM?oeVJ=lF~-YX-<wQ0WO4W?K-21ZQo5<IpIxpJfWtfRyw?ntvizUOcYx+u zyiX0&P7RfxTg3PSz}~xYX7G~bj#8|x#Py~vGvU0uoN)tK4FLHimd&lq@9<lI!ET)2 zZP}((u~dv}4^HEpPRx~)dBA3g4}~IW0zL>yyU>TE-LM;)q&=9ANqf<8=^S)Y+7Dad zY}UBRcDN`_pa5=5yC4@HNW0OGr9F@b&!oM0vN`D-bVk~TUXk`gE-94G1s^Gu&V$XQ zOgbNmNVRkU&c!B(%LRVYBJ2Ve<dAk@H`-6Sggxjya$4An_7PP$N7S3bK2ei>cE89E ziF~f`sPHDVpNydi<cs=CC>LxIHCNGY*oO9yDYO@R08mD5Nn?h*kX}8*YiSSW-=m9R zmzX=>qD47v;b&~#Pn$HR*qWm$i90l6SvseUreP%=ZdcMHaixj|!{OjT{Hg6=ERNp} z9!u)XmQfw8tqMe|d9aQi=g~^q$_8k4sFGF(0yVNk7RYF$JtDeJI|nQ?W;09G6xxjc ztfb8otNAsznY2-5@fcsn-;*Cx&HjI%XXB^bIJ>^+2`w7c5~>`qJK{`<jd$pnz*cD7 zZZmCz>DU+(8^dwry1^VRmd!iaA)*^vJj(U8bQg=Sndw@3Jl&ceO<x#3IXn08`O~jY a-pqX5r&Rpsl`Q{QT3V1VMEL&HOy&=R&mepN literal 0 HcmV?d00001 diff --git a/t/images/FotoStation.jpg b/t/images/FotoStation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f745efbd67997db0f89a193f9c56f8ad9e388421 GIT binary patch literal 4320 zcmeH~yH6BR6o-HJ3_*PEj)A}?H{oWB!R#got2;gl4D6^e7&T&NK{m^1Ccq3~?<V{K zRQ>_>wv<@dnrPwsiOQq1u(mR>8qZp2I7BMTd#0Li?m2gU-%NA!&3p%|=r0ya$4euF zgCn(IIH-*VT%!~9ZcRj!zbo3W)Ih0Zv<ZfWf-o>a7=_hp$PH8Vsr}miKFc4&?*m_+ zDuaCG`6_>kX()x=)w_qFDA&N>L-K7L@f1(?d|bdo4Ch<W1Q1Bm0UW+Kmsm4no3_)| zbO>r(QvqJ1X*I2&+GsA>Buh=DQZZMvR&&AplW01D{+Xq?mGG)7Y1=M$THRhAJB@>r zcWk_zW?8D~F1+ivZfbgjp2m&Ynx<zcG&*gYEt*S7yfA0R_#K{0#_L{4c1qJr$xdr} zC0Sk5Yso@QZzMaT>8)gEHNBJUoTm4JjgM*iAQ|WQC>iJ2kc@MDl8keFmW*?Jk&JU} zO2#?1B;y?0l5vh5!D^i28;(U;tFsuV)?CYM%wO>P(fQqfqq}nkoB?OR8E^)i0cXG& za0Z+KXTTZw9|rgoUs!vv{$vB_<#|2bnI3TeE0C=C<+2Z4{sGM1gNklLo&5P{Q$E?_ He7Ex#rS{x% literal 0 HcmV?d00001 diff --git a/t/images/FujiFilm.jpg b/t/images/FujiFilm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b876aed591f4261589453bf1878c0691e4e0265d GIT binary patch literal 1373 zcmaKsK}Zx~6vyB9&8({?IirSd2~HknBSU6Z-E<L4+oUb65Q^{+jkxK6s~{Q%og^qa z>7FDC#4ZsXqB=!~h>%Vlqw*AV?cQzrfAf9Q47vE=?fcD}_r34EH{Z9xx8SFK>-?I3 zo2XPeN%cf@h?*Iv22d4hfDPCu&=#f<gB5y|r9%4>d`$6M@Cg;e!7kQjVc$b@;5OJ_ z&{i(<h?uQ)jva~qK>Y`Lm{Z3FyBg8>wTq?k(!?alUo2ns*K+-iGrhD_p$mu>RYbPv z&-p9ff_2WTl$Sm0zi{h%dD-nf?Vt+BaSP5s!5y;P!9riY(C?D<Pl!6{>ALJ|8pU-# zjO)xQp2e=TktQ9+$+?cUA^Vy^ysr2Tm~F}!hF<xm%=t+8tBqmhRWPqg|6{PG{5xP> z@e6QD#k>ZmtFoRH_HIxtrqHNj-XZ2*HBDdP`v|6ORj2DXY&-sTd|S@>Y#sJh{0a@F z6hFu85AVp@w!qDbk%EjJnFmPiip5s+EFJbG{7kW^O~_4vm|Lys*Yb(;)(E|U#A4mN zTK^d=o`od+QCxIhn()3E8g<|2kio;Vy$dfh;tsfCxXDQPO+$XAFYsH5nBxg{66_|J zOqpNgq?QD?#>^7T6D*cozA`mAI$;S6r|=usLrgNV98Wwve^Wz)pr}g+=bO-_rfwiU zZp|BeN{?@BKR9_~8J8zx7=Es}6M2$1R_qepyT}d~S1Xmf*2?^9WoFUy7c9Tx&6TZL zZ^au4_UJyf8AhfhlWlL$=Ikyz*K0$1M+St96h}iT9wh8YCS!G4c1MSuw=Fwg%=h%< zv0!Xq?4V`wyWj(v^_Wh*#=41{Ofy;Vi7pX~4ykBMNZmdU{sZN!_}AR$34TzMh7V(E MCY_--)D?XH3+=6!8~^|S literal 0 HcmV?d00001 diff --git a/t/images/FujiFilm.raf b/t/images/FujiFilm.raf new file mode 100644 index 0000000000000000000000000000000000000000..c51ef1ea4b597a7f57ca4c2709c2ef9de82e6209 GIT binary patch literal 38452 zcmeHw2OyPi+xT;wV`mj*?@`I#MTAI-ic$%Qk}|R>A~Zy1D2XC%NwQ~I8Bs>E_slv( z=6U}2bIuX<^M3F5eed{w|M%xU-On}d>)!LZUDuPw;k{ZKTKo2^si}(`+GW5kE-5ad zp&_Lpi9k!6(+4bFx%FfY*xPb*L%%z5331uqc|`g)1c_aTAaQmGlAMO12nxX8h!4yE zKol`sPYmPyJq-Q|cZ%NJ?P_@jg0!@@LP%s9hz>;pQ3C8a@bmzu2k<TM>rrS31t8*C zQKWcS1aLMYUJ3BcL>Ur*OMtjS0M-F732;UL7l7YDLP!UZx#JC<;2%9m)bct8pC&yT zf&^|5a2zO7LJ>K14#?7jLR|!2gV>S)`>oyf04bz&OHkd?!qU;yid)Up`n0_%_iy6d zM^4*Ih$1a3DK0LzU0i0nq$Ib5)OH#9?NZ_p_g~xn<?Fv0it;9m@o5YM-6!HWfb-s1 zo(Doi+#HNLD3}}q!H~G5qy##cFy6^XAqYdnSpkj;A;_S>93TlHq%Vr_L#gm1R~FzT zp#=U;fTM|g4S-{axDLQci84n3P991q4?rObB90V?l87Vomx?HF420Z6!F&R9&Y28? zt^pj$_zV*H0kQlN;^L?W%XK7qK$wdUfDD?57l1iRO2j+B9HosTl=%!ula7en0GvLK zkPZ-sHW6`T-b3-^`1&Gz6cI;eF6t3M9uXlS;s_tTf=^1sEdifw1)pLCPPqc7T7j=y zfg^cP0bc~x6mC!uqz_kH30C7FODPg}Dc(^~DI~rYF&%*7>209!2>&P>0U~_F{Z$ti zXV6Yae=fnLwR|1mA$!Hr2$T}12it-$;PfHl^d$JbX+07fY!CPm0oWu&9H0<-1&&#P zlY?yokw+ZG3Y>BUP6cpeRI-8xH8HLipy`P?62?GJn4!FY;8~GAFA+!b;0HJ&ivoM5 zz)u_niLa2CSi-?bktE{y@-ZxreAEgYTEEOkZ&=15#^rWE5pj?;M6v?MFcN0vR!}HX zA}$GVG9tbm;N(PH72x#5xB!KC7*P;6fO`Q!!MM~f;^LGma4MoazWlpZlx+{{XPbj0 zAdLe@CB<drC1n-lxn&e2)uklBPg+V=Tuxk4LP1_l961b$i|>+`h9Di?L;H8_Lvmhr z$P5|>({1HUVg{Ka^b!O)qP!R&Qb<gEIpPY81eAybzdj#QkO$aujSwNE1}J<e2~v6B z4%l1TIBM+&tGNtF5b0M$1`Y9oCkkI-N(RtkV9-+25nv=(9})UBSPv110%tM=8iN!O z=nrBdumbcv0(-%lfItceO*}P$1#{I?RtH$2mQGm%0AG2^LXi+w=W)O%A>yI@zn-!{ zvOmv6OJ^f+_G^ZUAq)u`jV8f>2L^*7C8HuEBPAuHp`;|IqNAawqobjvW!S*X$gqCX zdRkg04yH{ktZZy-^o*R`9IRZ-tZb|(5RHtKY#kZdI#vc+TGs!uBl$-YfD0f73dj|D zfJX5^Bn&7t0|{J&iUaLWio!dj_J{*}E~p_n1tk?VSX@x}YLk*;Fd)PO*^e;{r0aPk zc9Cs3XiCm&$0&Iv<RJy0YVtd#L!Za_rB2y<Q&Mf*#LU7fASkqX%T{R_Svh%y?P}_~ zH8l5V?bXvie8k}BvEydur_WfNwLItG=;Z9;>UPn`_v*FlH~emfhTRU2h`e(*DlYy} z!s91TpFMw*@-{UsJtH&gePK~?N$H2O@|xPZ`Y#P%8=E@2x_f&2`UeJwuoIKtr>1|* z%+8^}C|PoUs1F0E4`@g<h8(F6io^w}ECYs=M}lnqu7l*Jb{lvluTU_mhCEDuN69C3 zXq@Sk{b#C;{L-BQSfon$8vXYw<o&;@(a#F~tPk7-twVz;$$(~nl%bgo!wp=M?@i`= zYS=DafuU{uFqF4{hj>PRYL-c^wdCS~n#B8!CrMxS#CY+<RT`+}r=+g47?zWVp;!BH zjH0oZ3x&<>HFbEEJ9pnPqB+l2KmR2x;9|*HSr?zgm)%^$tlQoXa8`{RK9*>4ppg5v zVvR?{H~D$#_8;%!Dn<RbJ6}&6+O*%=G`_u6CsS~<Nb6TKp8}TWBNnbN4<}k+oXDg! zg{dFztZ;&%owc6rWWh}>S81l*E?nfe<}cAoAu>u?;Jpuqvd+p*`uJdca3p6_sBenA zqP4?30eSEIXb0j=z)(AxKj}Mb8$&khUWGwl#ro_;YQtn-?Mw0JHhvCeRQxjP6&AfN zr2V{SyHHJ(Z_KmxJrTo=^D+Zv6ZVvf-3fH3FDBGzJF9N@e!_jzy&_{VIw?8V!6oj# z%tQaeA9M<SpR{HBb_8j37L-qSb3XXOf5GG`O>Y%5?M~ILy+<VJ%mm(;dvojyDSpS& zV`Cb7&MmcG?((3GxLe7BzC&roB^DSG-Y86?RroTw+=W((y8|a(`}mxBXIAX7-C~xU zy^F?APVGt<qGLZhymMc-<6W++@&iA1ySP2ePQt*@Rb@-s&Z%>`fs>tLMKlftvJQn$ z2IiQCC->IKv`$^knKbq8RV&-@nrpK>W?g?>e-yU9_=jK4F{fA6r_Ib8c1T%2Zr*K6 zVtpWgo89xLgJD-$_`}KsgU)ll^gQy+n)md5(aS2gU`QAH$cVS&{nHQaV!N`FzUemA zj*311GAusuV{dr{RWy6I%W*c1%xzi>qJ~cd6Y8(4MyyXV9UriNW<BvlNg_nogJG8Q zRQG`8*70G3y5}zH&RJH|E)tb7`q{gTLcR5S%pQAu(=*Qgl6ueaCeG<>y${B~%G`o| zy=PAQ-6`qr8)-K<X>~8Hf25Z2jw@lSI#W8@C$O!X>0|PMVMcQEgR=J%64kTQ&rV&{ z?|=HJd{0<e`8uX*hg#{rTl$Wz!&~SM8qu>`aQ}d!1OjDxZ=A3Tbp<0Z>!vBy9=mHC zyEwMoVs&C%XB%<<*%6tt#my;9pB6)USSfT54uXMAp}HZuyM<MiQS9LEJ14|r;uB@k zV95308Bucy?~66Do4Hw726ZY=e5jt6jng5m^fZ~+QfB$gab8^=r`&18UN_HfT$Meq z{=(wvcPX{G+Ty?mu9K%0DC3*-hLz23;7m1QpK)TaxHGpck6-B@Ij6iqyQ$U)W%@1u zt)ive$w`+57%EA?eTaskipl-~&ypZpx?bTSr;C-!Zv>e^-`LQ)aV=idta-)Ocd3yr zz})AP-8aoIJPQw}w#HU3di0;S8<*;`p9vUfI8HN?@Zmsm=B=159}d`UD9tqIrq^ld z&Z99uXF{WB_T=cfsH>y?9vs&q#nZF0Dc;M31TxwP#n=UtX{g8xruN@TGK+20z885P zhD@ZWlq6MhT6+4u4PYoqPxSsBoLlnuUDY#3JdXuU+*{P}tTG7GatQ0UXtsbM<Dg-E zax&`{C+Z+jHUo9Br+IHqX(kxH=4Wx8>YlAhi?qsji+!cQx3FdLoKdicYU~k^YVgi5 zs6;Jbg0fU8cME?_M-|Gmc43RhIio{#PxVI2UVb0Z8tJxu-6DTM_Ko^i+b2v9tskDZ z_xQ-Um|0q3QyN>InQ%z>S-VbjlTML~Y~;q2JE9LFC^hv%_J+)`W?MWQ`XTG@V4Yz6 z5$(}vcIB?Fe8-i*9DRk7hRnDpg2NFBH*(~<$g4h5AF@4RsDKOSopC5q;G3t`>rR>z z#?I+qI_jcv^OkO}*}cNc++z>Vo$SYXm@I7hJafKio%1bnJ+lDpIT-5HZYs<Y{#u7S zVmYJN`Qzr)h)uh$|L)wh^>WpA4z|3-RFL+LV9Ek01|`G{MN>_U(VkChr`)ETlEY{A zsKxba_k@hdMV22loiJ3d*2j)vX1lAQ-EoyiqjgKF(!q+GHc`D7WiN1wV0CZ2GB?uJ z!(vA4#e?`rDg@d3cHDj4F{&*2JZ8aBPEn{UiNR7r^V0d}m60|DdqVO$MN7&KJP1j> zrm0pc#M~Vp&dy%>wNAR7)?LSYf!XT2CtFL7fyT6kYohH5H}BKJlh!U);#Q>APsj!Q zCdtNaZ{7}e-|_4jIk`tR39Vhr#RjEg8uv5r4s<d;e;k_YYeMGwbhPyP6jSM;PvTtV z(e5-|6D-%SkB#TR(DTyXZ$}qT#X7tgO7*;b+g%>}!m8xT1?_0kmdu5eDEkFTY_{WP zIvi$qHBL$Un{?!Xxp14J?bi$QnHwATyEw${dHtSxPX+JJ&)+doWi>epFNd;jA2|}` zSS@|!rknq3Qw_sDD^&CMDW*r~-#xDVTIG7&?`fHhhw`JLEawD^{=wtEn?66Bs5t&1 zbnENkJ>41d-;1@Jwoxl3PmZ!Y3g$mD-rMA2!$^8CLNSp1X%bgsSw(153=E}u``rJo z(Hi-_onhwAV%CrMtoxtmP#m60+a-k#OF#G0*DT-~chC2Z`sx{jo!iEHb2RsjkKVI8 z`@F{L^Q%o;uEb`1V^$~|(A9}<c(!;~)KKAD^OLCwMa}zq{aM%U&n>o(@6*C~Yx>29 zQbumsrdROcL)%pfQrCBbpM2Wxv4@PQOA6ifF3;?FDqmgOmJ<~mt{`7_F3A4=p1PaS z9JTznJ|C6RVc64oW5*svr_vK$vHa%oB`JHZ?Fu)o`s5)s7&yCdUP{$N*T|<ZmNqqa zUn{fNW7{`mw+`-Yev=#-kRt2ck0O%|klRKVlKbGg?nZ|XF;-@h{FYa>D2002@5kGr z*}Zl&d^&0KR4_kLH~6DWaXHQ;<ZcHHQSI-t-7sq)V&y&%5WE<tEJc-x89BYx;VtKN zE-^kQ(TAPc_sLCM10woFiUU+$XrWpPgtty)Uf9E2LW1?Cagi^6rB}WGNu~9ScH!~x z>3H@i!xP7^C<pT&IJU3oRZ-jX!z}*XX!%ON?6W<W4pHA%KRb87dVychX#eBN(B0?a zMjE}d&hWl`_bJ*UX1MVkS*GxdcWyGX_cIJEwOn*3EEI>{s8THy?;=&}vH0}8dgohz zPD4eTZlR<e;eNUlMz#5VW~UCbCl#fpIORmc@xCjsT%#<43Y`z`O;)(sH8EIjSk$al zazQ&yg;~We_Rh`0Leo~aiTE&<n}Mvcih0J5ozvwC6J>FmQ>%lH^B=Nq7I}P^{m@lz zuY%~Zx6`x9-@hHQjPQH<bx1CT5nFPlOIu{~Ruh@NZ!8-v`lMUEeO&lN0vLP(Q-|sb z4r*!0<v*KDu6psT?a2A$p7uBQOWYYQS+h!~P<I{KJZm9(<N5O)p$6!dhBq^lMbojQ zovEK4OJ3LK3AlRmmI;)Z+McH<8=0hdcZhM_rjuGF@;M@$R_X}@`AOfN9UaybT+i5G zm_BjwvT{h_33o~Clfdt#4T?riNv_X$XfE})>zJmHUZA+C_>$Y4>o%QnPJOedFQ?dy zyN#1AC5MTMYY&}L$t~B@H<*k%K2mJE>KxtKz$`O1zn$Uo$6VcTC*g`8{^l-RGz*$y z#dngV#Wo!M`gLYZ<AyfrFllJ}!BmkSX*MEWmkkav^GRm)J2!n0@Y$|teBwr*oWW3l zWWt^*IdrgQQcd1@xxxu8?OvSb*B<61OLE<QoT-b$d24E22Odg#(W=%9+j~en!?ho| z`n=ygGAh_G{7S_6^7mbsmqUB|A!{mKzM14Hc7sR_pJ!qMnZu{B=X}NLhb?EG6z5Y; znUEHC&Q8&2$T4IUUUEa<zIGzM<nV3TPpmR0M&@&z_`f)($1Tv*$@tkQcZ!E{NF<P2 zy~KUGqSAb|1)HWVI$@X2a$rZ;nCb~X(b6(~_mQ&Es)sqI<378;Z2a+lFg~%a{I!n7 z%{|&G0vMqRv;?<QN6%^RQIR^$E)kaw!R%*>S&6v`%~h%=Zflu_^BJ(&@rvD<LAjo3 zk`0E|om+fj7*cLAV`wlV*V(@5#L$<^+q4q-xl7HhEyO5k_gXuj(jnX4kwVjWXp@!0 z!l4-h2V0ulh2sS^B0P~!8MM#2T*_xARY(tHh=l5NHts$xP#q`ZTPNfB<+`+@b;o== zeHlmE<Ft+I_uo(-&$Lp!XQr2Khq?AnD8Sp{xLm>+2a$xnBF#dIv<$nDm{P@c7c})o zg4U;T)I{X!K7ZHsg_qSPUCdQi-DJbeO%al|k$AttGAG6LG+6bFD!ToR=Ejn{tb#9` zzcrKD&4X1gu5m@b4`a^Rbh4z4O@ukkDe~ZT{u1(0{cBYIh2f%FY<9!F(%sCH`k&=y z#0F!Pi<lC&Jk_gDn8_bxVa54yd7s{HHBCQ|$X=`%8B{iT`OwkgE2-0cQqdzjN@|K2 zPCW5*6sU1J-zc5!9cd6~o!C~W8|D;WMlv>e=Yg{1-nIuXubY`iJDOpSx}{%wWt7j< zYkmCNXQk@cYpjml)s^>#vOP_bTI)UE$yzZjn7$Z|QlDpMsJx<5xSmszRx`dofRo(n z%jm5K18w4q4;QSv>A2blULSw=H1}3Q_(J}+U{&)p%orO~xvg1K!MfBtJ9)33Z=H+n zcg>U=Z#i}hM-El%esWjqsL)au>#o>rZFVQ_*t<lYw6ks7vK06A?zKIGrg~(0A%irq zKDL;HdSA@h@16{<#(gX{Qew?h;l8LF6Z+u_1!v^TxJ1e0vcz9d%ek1X+wFQ-XS$*H zNAskG?{1o^`}3Nv2Blcn7llm;QzaSOdTKiA^6GgEBhGRjrnsU{8k}Acu#gb4=cJNe zcSOudY){JDoA3Mh!&Oc&TuHHUD4V4m*dDa+i!09ZQ_hclgJrBwZuABjf>Yj=;_Q+e z6C)}Vl%Xp8)9f*s12pc9<0a&q%GkBo++JbnD`H5-7A9jW8w3qFE#F?uY)+L1uZLIj z85*T=J6O#>ZGDH?d-4`)e{_jFI;iXWuoCI<>#DhDFE=p;7iriBaxL1_UTdvI2VK5s zXFQR>7Q1z52UA~ds_>;_F~Zw68m3$euy)aybs-UV*&5ydYU@<htrzMMX;>e{gH;>l zW2B89o@x`fE3Jf>*{PB&IJ^48M@});PWk)0j=|8I<J6_;A-A=;s;I&#D47e!0#j`Z zWH-5FeaW<?dc%Jx?)FuPCcLagqRK(*kk62^rO3;Zu5;RV6!%8p9JWRDyPnkPP<stt z&|KIrnm5#5N#7%T6<SYmcx1$w){^tsqx{667iAoSvM`ibHQCAWZ7`1pYn*J$ky~-R zY1W^PKP7I@*OTOGA+=%EX_wE=C?&djzF%LIWgFy_yHlukArsr#e4WhW0VJEZ_l50A zd&#5Yv=k%nYHyD})0}I;I=HFIm-LOK_XOsb#7K|ZB#+0{9{b|t<`lc>>+x!geXHfw z_z2Bl@ph*73l+@nTdcgZvy!(e<`>O{=Z-ZWc6xo!YGGd3?_tKxGm%^4P<-y#@X6>g z=!GN<IR%dH(_qzmCY+eK=oWK6`otms%pv9R{jp)ic|y(a<{6K6FQypNVUrGvVbe=b zi71)R%ci@V%Lm~umBG-yAR(4-?THtUDk;Rq4g?O@$Q>{?c_ASfbU1*LFZpc{IW%h- ztjpp4@Y@mT`)0+TbhkIRGN*Bg>Tao#EO;tk)pmzBJG0%a)KRZ}YDbU{rv!G-OhZSr zweHdSyy~5q7HGOOVV}DO-m<i`;%)=yzj+4rbBd*66h6jXNss2JZpvAxGKi}-<Gn7r z#c=L(w3L*r`@>AbkSeK}n-jX%FRJHJ&%}#eADN=|aZo&GmU+ckFiHX1A;H<FaJC8> z(!Yr9IX&6?tUN1L>t1bN{KsY-6ubURL`A9XrL#X=SZ}@b`4Rar?kuMQ^R1WKdtx1B zr3$5JbLt0hVl!248|B3ws2GH&eMw>t8<OJb&%G2BRbkfam@Qy(!;|6hwi?%@<9?c_ z^P|1U>z{8~FzeRPXz#jz$f(e=RWTD?yJK<4X8vKL^XdI+ML40H3vZ11`<aU>dt$#N z%oxZ_wzRrkG(5LylH$XgBU^IG?`AwZaFpIT+S<yy^j5yix%%%L{hIY+>qNj5V{|u2 ztq~g)HM`o@Uv;(>QkClvrng50u?So_AnsQ7L*_J9j9zxU!=(GyA0N;GW<g0cIf~`F zO#(e0I=Yyr>3uHw)Yby^ihNxkcS4V~?<w;z#!#9ELv~Y1Rod;W?E-~&Ozk))7-d>! zORa(z?TpimgjlKCzr37nnTVC$(mwZ@?J_4;F*55!%}0ypJ`@{AWO9dxZ(SJPr^en9 zZou3cmJ;BggC(t-Xf8cd+hSDYpb({Xn)h)3d5q*nHs`zxI^zAo@=-H>4)#j<PjDu7 zJ<qjv#O{TmcXG{~%Gh<94{O77GlD&Dx!RVDh-&SWm}wi@BFb%;UH15B_YFD;|GZrv zsxEShUp_bZPSc_GqkxUcw@i(`l3lhTFWNq+hun&jpJ9uP*^qAX{?Xgo$A<p-Gf^#% z2d}iIN#yq&jLn|8%rr2uvp=XZFsvgYc89y`xHjdenC$uK(ei_P4zP_~*m1Gpt1@Q@ zcz+X5Z`x^kCWoD_`||nnkM&RUzdal75uHg`bhMzad>3L@=d2_@HaPRSBbLIFHNWU- zYObMvRNJ)l&9-tjEnllj%y7R;dxzX9iNM)nS7xDe75%eZ22q~b+P$;!0W+x&nj2^Q zi`KuLtU8(XCTL`n4y%S_v(){MC2qTd65MDbJ2@QPwQ8-qljqehK8fT#Z9tiQY~xp2 zmFCb~srvLO{)U=XL%nXRsboEq&r^%4G#f|TRcksT4`!yM-`LG=_%5bzitG#jn^0>% zkzlngC-u|z>yivKef*NzxjD4_b5DIDcMLy6F=wB(ezU17O0)d(K`**7ab_FRuB(=u zA@ky{I&OI~u7Z=tKE3U$5#82%^385GyKNW!R46OVWS=A{oPZ&Q*6-!+(w`l<nDdh2 zQ|ljwmW+~VUy8h?G0PNbQ$tZ86wtl(C1e`4|6BR-pd+pyM}4f?nFZ<^^s`Kc{l-Lc z{CX@E8>1{MK2Qpw%}T@S(zK?O4lvtqlrCTyoH3|ABbj^NIlafjS&z*$Y|OLrds1V+ z>%F7vdAA1fvFT{R&@q!c7h|rz6pWV^A2bMJ&D6I|2@9#(;b2^1e6O$s8MH446Z~Cp zZ+H9C$Q7lfxqK20a{N@TZm*6q`dGz=9z%T?6>odQI^yK9p98%+VJNs+Am=ml6vwMU z&W_ITFXCn86U?uvD&_3Y79R|st*QMqq2JvyM~9;<DRSS}pcmtq(>=HqjMc~+PK%dq zS<Y`UJDb3lAKRC4t?^E8h0|H)5O0Z4*V0r+)5t8BGoqt~divPVZjvvGw6qnw3t*_= z;?1ESrFz%NaII<qTv6=U?>8J8q6Qn1`;M{3Vw#KNyOVrQW!K&B*xu_GDs!8@Tu{}6 z{M<ZO_xFGpnYZu9TF+)OE4O=2HsuUg;oh}O+w<qWO<X)%C8!}N5Nazbsa0T5<<_0V zr@$HBy0D&ad*KTy2KJ-m4@%~+;wB{~${*&UYZseL#6EHed0U;lMq_(4eEkMTtYX;h zp15Z92kVu6=}TkCj*d&7F9d7P)u^_+-C}ezF}U}W+9@foQ;+TIW2eswuG`My;%9u4 z_vmy7--}3tO6sx9V_#=w*j_Nk&6sr^br<N|QBsT18;IQQ9!W1Vl5CQC{Det)@+L{K z@~)1t(?=x2sr(ft6?4X@-8ro{=#3wF^5VYU$MHIPr3crvQGNUdHLar=A3sxOCJ3ie zM^m(FOSpz8yt-f57<0YjBWr^Sw$10Uuw?^7<6zU}`xf>xn_0f@;^?9*GELv;nMP{< z?rY6vz0Cr(U!FwjV#y+D>fcsP*FLi1Z0oi>7^5-sb%Kr@6L8bI?L@`X7OR&ROg34c zPTMc*bl8$5VIK?aF{XEzX!Bt9xt=M-1|cgBeJu$Mqj-tzYaFF@{d2V8lQU!86>|d~ zXAE%PxMKUN_bkTTHTO74797+PkgTBmjchv%#cVg|`;ydced;~#(ynarJ)c7(Bbht8 zgW4_`q(_#2b<O|g?4IYsX=P~g<-^Cw(yT%=y6vdN=Ek|pVuv4N&phF?4ejbl=M(I# zCQs5c3bY6x&Z$oK?1;`<*WT3B?{`Fh;t1F4H=Y~2K6C_GkyUpZ%bkyF9WoZFXD!u< z>hQxkU*r9%gpwzJy||^Lskd&ha_pnIqce^c%b!8r*{VLxV{I5)cJ9cyn7>2m)zp%~ zf|RhJ4+gf<J7SC;9h<q-$+g}xpJ_q(={Zi0FCvL?UlQe7bS-&HGViLC@u5S>>l!|p zyk)oh*fql&ZsvH2p5?^pJuS23>1o1cADbMFf*iQBiiKh5xYRY@*1Ml=RLL&vyUCus zPNKx_L(f#H&h>Q9akH&W&%d{_YX;_*&KUT3<0NreTn2Yx2w5y2wu!#|Jf%$f?tJ1o zgNQE?Kb~#my`z?8vTbBGC#`3+i7_10L3hXNvKH31D3^LKR_9@y$;_tX*T!@+Bg#*6 zZuY%}&E{L@uS)Sj(OWY!>EfZ}iGx02pQ^HEG9ML_&u#KfGEnMiIHF3|X_I^PP-K^P zOJ3i2c(yoy5I8c)kHC=P5R<iX2kW9yJC4%f-A;vj$FX^LI|rnh-@;J3PKe^TP7R|@ zkH+(LzR(4qKC|~d!NMSx@0=s6OJT0E&g;5{Lsw2sn&li#qui+0_pC|V%n$n3oW3hA zyxU%Y*1(LqE0bX`ig`18W{mC~3rx6jT|<n{3#B1HKH)8zJYH4xAF8OujL9@PzV&1C zOCzT~%~d8Xeo<Eb81rIYVVkketK>a_^zX0J8Zx)P8;e@V#vW=`_DfZo42PjTA#XP1 zb(eyR*xYCm7&>FpaKydD0XGBA>Nkq+@K(BKx&+d8NmMCq$ur|r@(_Mg8g)4k*^KYV zdAX~0+mX%E;nb2s^SIqLu(3W1mQR~pO^h;XPu=yY=qb7D+|pj8;Y!{xTldK%`|Lo; zw}Z;x%x>q-<YP}cor&!dx=AiP@#^8$bqpZ|ya`#@(&ENfqZrO@*hg_pZUT)S_U~m> z<RWG>s58uC?y@}3y<1(;<D~p%?AC(W%gdi*sB5P@nZCJ9zd1MkevfF9c?dH(=Je5E zHwZ_P*FUq!n(jYRmqNDjh6-oZ;vVJxsGdsC*7m8d-`||ZeaThUxR6fW&m69{8R{LE z=MI_sK31EwcQ}tJHl?|}uWQebGFy7b12fwy<GH5=ycRrJu@}IC*q}Bzsr<vzJzv_o zth2t(k>z{Y$nNgECl1?0HXqTq>!bKOdV>DRS+;BPXd#H}qprX6dzwpn*Ux;4N_daK zjq+a>ZnM>Qk2<cbwnIHPw{9v#X8659U`t%uCu)*rKYoucZHaC6T8dH5DbI#jk33X# z-Y}~z$rF;3Dzw!;L5t-O9d`ih6QL1<hqn#pcTDYw{W@Ac4MW}6eHwJUwMI?rYkC=I znQwr<LVWFUxT;iqIZ%_+FK%Pa`qp9IlM{tBFWlTw5tQXuqI+DJJG>|#wIyz18jTO0 zDJm05yX)s(kYZFq(Qm^}lQ~_Y&>v{;aDwt^<%hjeFKqT#`d+ZtRk~8JxFf_w`4&zw z|JC(|-q_L4vpB0M<wmTE$H|fmRa2hVWMflzl!H0u8+!YTcAT}&(Q-ZzkW*PjO)KeO zTt%9C{Z@Wrb!3%iJJ-}_me8}?v(80CIYwA>w6?^YIFL<xs?F5jvTRmoijSN#SKRXR z!11gmZ8w2{5KZ=j)$=uc7J+K1989mP9)*<q7~OhtF~)9=6oxRBQEj@{vlgFg&3_%^ za}J2TyGw_XL*s(mn9raIt7{2%Qx{A9nT)8C&F0#-^RG2mpEXi(LQ!vxPWwE`uJ>f) zgIbv)t-Y3s`5i0~G0e%a+Tls=dUir()N#j~q+e`dIe-f3o`0%AiO%34Gbl==aE-5< zTD&|gEVVC*+D*Y(wNqPOh+k?Wj`u~u5Us(bx2K(2#_~wc%Vy<|$aQQmqyH*%gSw1= zH;ZcdVFt$RS-Y!N!>Z4z8N3<xd!%E(?`xA!_ua0ZXzo+ldX4-N)~7`2TNr14W3{#* z3|%sg?X#2c4L$6}({{i{Rpn6Pt;`=_W6(3YUP!IoT;VM;_DbYt%kKFB)fDdL&CD2y z`O2L`p;9qqd$8l+FG64`u&Tgs;B1^6^)?T&I&TdQh8^(Vf7X^wc7ps?rF{vuBcMb2 zyq81+3xD*2+PuDDG41_l&8nfK*Na?^6;$tZs`8j?c;Y|v42Jx;lzeMsJl|ItPFn^v zEvRNq+ADuDI!eEbyfVm}j@w&d?%=%2pg~q_kycFA#!z|b-iSlwTVLehgs4gbRpU8t z7VX{xL+^b(lq>b~dkmGao*{$zudOG}MlINXD6h77YV?}^O@_1KW!YfobUtrdx<rrg zF7wb)BO#oi%bZbbamve0X{Ib{X%cMcNsdNlDo@|A32%eP5{o^Hp6aK-0YtZU%7U)j zvho>6yopJ>K=?=zZ`bfC12$gwJaJdaOPt~=#SZkkmeZM?WPDrcD-WhC7=H{1d)JcF z9WK*t7CF{Cu@ExFVln^nvgbV|v1uCv!~5>yJW^;LOKJ)7O2ubfVhUW5pDsJPzA~Za z@I2(NUpM8yqk}wR&g1sJ2a;Pe&PcwHmk6+)RpFm16Kblcadpg3Y@B4N$7LW3>ieti zj7`=9bplxSsCy^m8WXO`=RCd<KHGCdAl?4sTdrN%FAksoG5&Is!-;{(^J&GROv7!q zB99JJwIm<PIE6E&n17Jo#*MD23+am&D&(S9ywsVVVM{yHUUX6Ig!P8|%7>!RqAeq> zsn_f>lVk4gOugmwY{)=3t@}XMos;XdgynSZ?-x$?+Zg{;Bik%5bNBaSN9p>t>^v@A z*cCI;b!hvh;ONVaMpr~{y*$^X@q{+v(NJXCrq}YJ!uO6fDe#@Nr+O2-i!&~ZMy)Hh zXnyv~rLh}0k<4&|vu>$=tzO^DE{99*-CI-lR7byEnj<!Z+Ffhr=GW?=9Gwf|QqQYP znQ=d!Fq!GjBx7~nH4a}EaLsGH<Nc8~<$`Z_1KsF3Cg$C(yICukj%!EgSzmm!3wx=n zAV#aS2!>c@-#pdgnz!k8c*^gkgHz$hj-Dqsz{>f_7{O3e40pY4PT9V(>3iv6j=rHM zdZLrJ>0F%fI2WzgYIWwhmT|Scu=ORQ^!(7d_TzQDS&@QT-I-1<Wn~rUurO`AE}Dy7 zKSsj7T?|O))KlwMs)(HU%4A-q(4;2L_Yf2KU4D1P-Naq`p+USCod>kyT<;Y{3BMS? zao0Oe8%#1b8Re+U?Ys5Jp`b5axzlPve`24>c#5J~@14rs%4s&@2c}Ng4tQ*7v=MbX z-oTqZ6OWZ0QvIRK;C@VML&n>voMEkk6BD?b@dFQ>pXwHw+z?3T;+VO&GruX!6MJ}l z0_Bb}!H;G)6G<yr-sT>&*gunm)z%Sp1T)cC?5(7kXUNMI!C}WLuBbjy+p$-otZrkX z0^xbzgLt;Nmh#UZF5dh?Q*BGtVJ_*`uO*ooXIg5@btFPd?hA|zM|^J1Z5dgoey7`# zQos5HZR7K7!BV)9pv(fEKp)8$Vx*^MS<fQ0X_JtoAeW$|s335nJ7o~JQ+*fSssC3F z#l*tG&CV^z%q%D?$So+VE-Nf73nHk>sQy>cmct0@L=+GO8pTUcCqltRkTy~0>t|ts z5*<McYy}6e#lDgTT7!5^v6Z}E^<GjSE<y|V0znMvBL<+~2-MK1AaN7}po8fjpw>ee z`fJn}6gS|LK-@sd2}AmTz5tXC=$R25N*uzVNPq^M3SNZ`(bxxCO+dR0Neieq(Iatz z?ix^7LufS6m%@iL5W*n_d^jlWW+ES?hs0-)CPH~4R3SojB0PYHD29`G=*4j1r<$1; zh`yRfwChxWN9-BAh#r7HI%a%XQ4li*pEeZ>gf}1nmHhR`4XTOqA~^;;dI@r4Kod~? z`r}zej%O7)UV_{clou)uq=$#RtH|-;<<R6nt`g-%fP6sl6U4azywVcn0|pcT_XWOm z3G%I$9_b&;%ty8gj~+=6wFvUGS%Q2FcwRi<-2ps2<l|l?F3%r%{P=o+SYBuq<cUE3 zRm#VY&zB?#NR)tj;2}TbAJY?qP{`OJ1v0<%$v;Z}afJN2Ibs+>JN!Bd{|VHeyV`#! zoftjJ9Y2-9I3oli!vpb%Tf&iLatTM4h$S4T$}Z!`5=o@dK<Fn9gnr@xS;ALB#JpjN zrW;>@ujH>tpKe9^bSu)QTaiA9`u~9w8^^CdzsyCk?|+=P;-G(M$k%z1ouhq3F0iSN za)Q=S0^d+f9V$QjZn?rL^biFKCj3;mm-==&d>5gSp#u<vDEI$#2k3vJ$A6^{{w9Br zAP@Qmtoy(p<i^V*g9Psns^Dp4py2(%19*C=voR+j)NK&9=Kf?Y;7uGK-rOVuV2jU$ zl_3ha38MgyK;$qQ18f-~pjVFwtrmvp>aWH}H2g^);SPf|dN5{iCd7-oL#lxc4Zsh^ z9f4S3EXE5Cg6Ci%OgrF%MVizMR|QwYBbXy_E<A@DBi#h}K$D*I-C_fD79IsdX+219 zBc>bh(SVPEY2i^w2*U>FK_s|lQa-@P0KOM^<@x}B!O(+Tx^WAnJowT>n4|C&NC>XM zsKMW0W!RY13~Y~oqx^J#ix0}VT7Bt2IalR_a<0k;<y?*bCmS69p~dm$!H;!f?T{r3 zad@~i)(I>Ej~Ip@>#OjQvHnXMM0sSaugXWp&?@O5V|`UVGKN-@N5;@9e1y9iA3xSt zk;jkq)%bs-ocOW6n*84=C*9vDCozdN@GorvZ+?^&$N*SvQ5J!5VFmj_^l$}+8rll8 z!8=KxfS>@tw}E{iI<Pi!fu|z8gVYc3$A9wcFyM_8)`qu}UIKPj8GwHQ_J(M|J|PE> z!DnE3(o?|p)DiH*;gb+G;LF3Ka5~IEx(zJa1%SWGzQWW2_#ePZJPWsB_QGEw25_G{ z2CV<K0sa@j{|0wq4B<kE4Tr<@Ll7TQ&P7-WE`cY&p7H|Pikri<0DDDxu;!BielGk2 za~ggGiQ;B4%hwtI($@WB;@$$kv^P;;<$T1q_iB8ky;tGm+j|v0zP(rB<J)@`KEAzI z;p5wT6+XVbSK%Y=y;?bmqW@;#y%|}{(P_{Wd>CTK1i|`{0IYzC1H~Y&<*S7uYx!z? zWGyEtN0C9|@OumiqzLyz66gVNu0Z7JpfqR)gh3}md%>O0I`lB$gEbPZ0ad}n&?ZC< zh#8?{0Uxa8XhzgQ_#Qln(SwWN9}p!P27ItaqBT%lfM1Kb3O|FVf$8!P;Da@iWEv$6 ze}Tj?TJQ~s8R9@!5Y8>=H&7xR2j=VrxEP*>2Qa*ZbIWSwN7nLH`A9ieX(MDUUzLxP zb2WKT&eiz;=1%{MX6L<SZLBZP@3pc1pF9n`x2@bq(GyT1tPO3$<iQ)kIl&YYNI18k z$Dus<AjFM%2;N&6;qw^qI*XiJ06zze6n1bP(S?{`8;l3x+=3o~GU4OUddwBr2HFHW zV;l(Q7W5~m5jKD}Vf?`Pg&j7;fb$QskFK`XA^RxcPlNqt3&ssLhWKGg%yYuI1)U1^ zp(BtCIG>z__~5OW6vDX$odxy6ryw58A@~-=0}Em@3Fj7c4%7jgLu?ow_zuJk^J8-U zulm$mWUamboo(-nd~g6ba#A$PmmAps1Kd{yVkaR%p(rS*s1S&J3;>ZKP$-n|N$~e2 zM9zx<uR*AjC>8L5s9g{Z+z)qxGx{6|1|Kp2PvkQTzc}R2R!}~|f@{D7yb*wpOd%AG z;PLl*2m?5f?N{g~bP(c%&@eckz%$_F0TWaFL%M`G|C!J0$k7ipI`}9S0V1!_2u((W z$lvY|8oaz9@CIl+03d%aR3OrM_zpy#)DXmjr+#uE9`Ro!Af5|&8hnoe!~;)WLOAj_ zItT-ve1!NvY5w16FL25uND`i248PIqf1@}2MuXEJh>2uJeB#mnkca;jP$@6S%ikLX zb_h_z5~O074DcYnDXiq7@GY<`gS;7laBBz!k71626FY%M!CjCAcss_w34m}$Fa`oK zGJqzu<!KNehuIEjaH0m`0dO0N24fFs{M1Gd!ks8>%r_81NKXnLAURFSOE}>J?$0tJ zr=4GDLSHY36Y^W83HdG4`23dB1Bv~GoWIXnpZ|rr8(&p_U+6nPz&?lEe1W+W1DBEn zlLi46xJd%^bGV#DiSz=X3F|=;TuHJCxyeFqTtIjRT!pG9)gqh_0i6$S0|t=4U?L|& zK>wUu$cYfpP2lFM4)c<55(M-pIC(zBfZG7%CI!ss4bT?Y5d-o=ZcqTt0g1vE7;}LB zQ=R|Szi7R$LF|whbPM=vz$3qlz&ijBA(a31zY`w3wqyTO2jV}Rn12XF*s((it2a6V zNfONs9zS>NWgcP2UZx2<HaZsEvC(3LKs=Bbcm{wQ<xUJp3Awui&*$(MG>-8C7=8yu zgBvy|6}%4;cWiVmI9HEj)&ZKZgEGNbR3zp!nBRo-l;I&%2S$Hs$0p`4jua7}{?9Vg z5%OE63HdG4_#Jz>{K(%;K(0T-0r3}d{$Xo<{uk<Qd{zB#|GIObcfp@X4A7lRJ2qMk zt|y^Gw=V72=-qGwY7E`Hv}2<+;bzoZ^w*^w8*K~p1HPic->e8b_VQdJ?AYiOhzf2) zb1d!HVAgMdbI`0yJ2v_QPz&`zgYPyIc5HMB#0xutzXSY}oqzaWwB8YaXGf0wufv1E zT?Y-fidRA3I1~)@pqB6u3Wyu1PNKl)vyn>=@H!5|K+|NJdL0cd{RRPP<o!H^^1mU& zOqBVpzv+n%pAO64mk9-%1)?q+ihPjN>(^fx1aX5P5l~j-MrKt96sM4_01D?tE#D6! zw?~vjPYqJ|TR0MN&HX7_AY204`rj`|xC*$*^9Bm<!4N8(py3ULpG5hB6!3RR0D3KZ z9&qA-t}J_=3jp_C_Pj{A&$8zOD1@X%^!x~Yb=i9%gL{QM_@?WxG*}gX3E%J=O#*1I z6&|4fIWD{a+K1Ez(e{VT@jn!Jq97*llmi~&uJnk^O8Pe(9P%)vN|1R3a+?TT1fjpp zBM~i35Eu0wc+e%0D4?AO&!vKM;lL|#M5C9Wh7U19n;}J@<Y^ARz#0Jln}8N1l|MS9 zQwa{(R}dY6w@f2!g!d~4;r-6R%gMp@KvSa|L_i}k@jOeQ8`1^zG}_^XpFCRd*Xwb3 z3K%~iBLg^m9^(l1GhKQ-lN6}s{rw+><N;UYKS%Ha33!1zdx4hn0xjSLNdk}XJRmPB zM$XNW1>kxO&?s(*`@apz@M#d_Pl9+V;OF)0@0A2}7AWIG8-3{^jzD@yOp6{Q|C_@A znvD2c3L*y|Jw|>@P7osemS_r)7eD^D#8G)A56MF?$iIMC2Bb6uM<~^Q5%x+E-!eZ- z|4NBS?<b}O)&S5KnE!#*OAczy>IFaXxPeACu&77`-f#(WuVS^qvx*$gDssGdIW!qa z3w%bK0C`uD1FJX47wrJ#*p?vC>ZKd-Vu8m)qSZ?qkl6)zc*wU}djBJ<7ZP=p7X|~; z!$YFgODo{Xf;9>c`MANv_|5W%?{8bZ01F><HHeFc{Hv6YA8+-7rUQ900$Du#J612h z^a+Uf57ETA_Wuo7vw9(P)tc4I|Lu?^TD|--_tval{%`waEqDBj5e8|8HLI7EmOjXh z^=g{h$j$Ytd~k!kDj)qf_~1r+HTks>`R{0fHLDl=lm|_XK>S!IHv2DpWUQ~oN5=YU zd}OSz#z)5bDtsbq4g5=6V9n~~U)sEXNPNxe<qu8rFJ-J*y{xqKLDursG_{d)%c^{^ zmaobOYx$~tu$HgJ|Ce_0TH?eOShIRr8|#0S$*^Yi^6%~GHLI6@Z+rW$S-t#w8~lHn z+nUwO|FYr!bkWwVUci0NPfh(lUHAM;3$$kSg17Gam$vbrE%7z0m%o^`&zjZCpKS{M zgXLMXdReo2S+-PIvvm3gr_-N4`kK`XVaNW<So{2itX>c!9K6*_DCC9zMG)Yc)ytoL zS^B3H@Skq=QUHoZ^mwb6cYr2(yw%HlKodRQ>ZK6SL=W_)A*g8C^CNWeviAat@Jq4? z#9O_ri0_41y{x1WtCy8D37`vBc!2)rxc^J57x0;Jqcy7+XwB+{Fr5gy$v<HAqNwg< aZSBTwZ|cHrX>Dq8n%mse(RAnP-2VrBt;3uE literal 0 HcmV?d00001 diff --git a/t/images/GE.jpg b/t/images/GE.jpg new file mode 100644 index 0000000000000000000000000000000000000000..27463d457b9032ab10b1ab79534d1a6f6ecc0895 GIT binary patch literal 1467 zcmaJ>O=uHQ5T5sTo5r@-q*mH!v5z9Dw6N@M+%#FFHfhqZ+JLkoT0At;SOZCw{y+r} zrHJ-e7Y|Ytg61SW2zu}!;z2xm6SR7;H&0%?itD`n4F>y`WWG0VW_G@rd24;PzC+~P zlraT_5SYgYtbK7ezh1cxP%Od-0ED5F90rQ02Y)8%ws9}w28q}>g!nb-0Rbh!2gosK zvoXM1a@@xs$SKzbqY=gS?L@neMD=6t(IbJ){R)U~oSy*VNFmR1M!~q4nP!ujVtytA zh4NB)xm0CFt+ZHKT4a+qCCDpsLPIyshG*l*f>FG{R4FMX0908{>++Z`YfMe(T1wYc zfD@ZLUZ(Ww<`W+;Yz+k&Z4JA40$>}U9ixk~sw&%p$ADJ1MIUcGAdU^80+tRsoQ&v0 zllt)=o1(98m~Fm(*KBv+g&fSVi!p$C$i@ALJAC_B<{kT8-vH<v^PY{X0K%iXm!~4j zbrQs^(;#MDXu@q?)y1x7jxXV@ZFs&MH~BW2d>f*dk0>@mLCl871$~{R{(|o81UBe5 z?ia8lDIJ@lj4}DNu3$&Tc$Zpq$Zdt&qu(b-;y>{E`TKpoFXXwJH@|6$MTb`zM->N< zPZp;Iw22G0iR-u{P@fCzP`@wmlsdfl)B|m|d(H84bma5E@b?18-;aZb-W21J-D}ME z<R3Ko;mm65Tyw+!t<3DCVc_A6&X|%&vjR$0(^!`8Q)zZtPoz_t%C6v^F`3P}a&Co# zB%8aXGeyzZ6mGSI!VLQyWo_|Nd0CfJlB`H_T2f@jQ{Xe(fh>v5RGdktkhU|`GENjX zfe;Re!xza0w_jWjZojzEeETW!Y9el7{k{4O*wLK&&m-o2m_L(StJQ9^)f;QIYfGg{ zl~wSvm)SyTwKQ&hg}cxjiNtzh!+m|jYJ4!RN^xA$xW?CbE@Q9UL5m!X#n=Fg_xHz> zaTZVJlB1(ZbjWJigWQ5M>m5YH_@N97WC&=K2vK6ahx7PRb@_NA)S`jNzcvtU(O7%X RC1CxdLKM!zOBl4i`~|mpt-SyM literal 0 HcmV?d00001 diff --git a/t/images/GIF.gif b/t/images/GIF.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4298d30324ae3684ad4d74952c8ec35c2c3e0e3 GIT binary patch literal 2321 zcmbtWX>?n~6~0b^7zdMtC9EYA6C#$_deVqEez6l2Np?iMA<IpmY|qjgSy-0T=jTX- z9SWGO3u|9V+q7)0S<2Q@Fgvtt55f*z3@vnl7R(N1oqqG4Pm*7ha~L0=d+*Gh?|%2Y z(%2oz_N6UGE!EOT6q0JWQaVx!DY=xSBG;9!BV8d~E?rWGjw>BUIzl>JI;3)iD}^J4 zkb+A=>MD07cO(~*bIA!vl3YoSBq51QLI7+)0}GdtO{$Jsj_V57<*rMrEF#Bo9pO6M zbx5(mp>SLwT)|yIiWG9W<8tA0?s5W0Ty@EDNw~yaLRGK^7)XO9XyFWnfemP2;WDX) zRE#AYhdU0b{!kW?5RTxEAk{8d;E)T4bB7bU2Pxz_Bpl)np*`pUnz#))&_76^L$C%I zNP{I(!2^YX4QODIQcfKs#^OSd5)%EPEF#VYC+LcH!2*YZxFF~Vr6B-#Ass@aTSy5# zKohqi2RNZ&bO_b}18Lj@E$~2LU;~=eh*UO?5n~Z11|iWO$|B-KYJlGO6$@{oYM$PZ z6e&-4HC|6j#nDqoP1|c&QTBRJ!}n;Z4!lZ$#>W9uf_Ug@ifEE(f@qv*jHp7?PZTF= zAesvrU*mXcYHD(Fa$;g)e0+RtY^+kL^!NA2<MD=uhPiVU_JS{DUo6_)ok(>>S0_?B ziy6gIvA%A4b2?^;o<0^&b|ll$PL@inOmrfnr#-zUno8)b!!pW)`An=-TxVLgY1P-o zqiO7iH7%lRVLhxdZK<v`>yZ{5CHi8iWN$jz)2*}gpvlVlj6G_ZEMt`IyeeH^m&_GQ zmYHQ~BR8V6g<5!JY%yEdqG_6MBFcockTT(=OJJh@8I0P53HydC6V?*GY4=P>p+v)> zW@WfG-wPxD#fX0~qInl1+LHP@S|Dew?doN5!!}@BS5(VJX2`VJfSJn|+X8P*+!J8= zY+GQ>!ChKcIc5&#SFN|qzV+Sd%=)2BOE$1#d0lH&uMU@oP1|7A;X-jlueJq@Y-zyM z;j8UnfO#qQP+K55Y~)N`PgL_FT`Cn=b5poE01PWD^i;fk8UayTV9>V9dN7E&HdT02 z$;t&oEiElUEgTGo8<EjCa(vM?s*S~weSuKNJdC(GlCkoh+Du^@1Eo>BEfA<<)6m(> zX5{jyRq$}LnV?xPhs~lr5)3tkf`DVJHJj1xyj?I=;DbjCwiozOA+I3yf>F%11*(l% zQy8NKJFvVX+0H6?dypwbgNj5U?_+quG)QZ3D||m~EACLlONJ!M-K;Qz%`-BK7)%8d zsF7cM{@JIWeEi>!KK$VQ_uhTy?YE}heB(d=e*Lw7{qrAxfAy8W{q^OSCjav1KmGB= z7oLCa*=L@9>d8${JnlaB=pzq5^oQR+_`v=5-Fwg7cilO0$L+tn?YF<V^_H7&y7AXH zTz}oQ<G=dlHCJDC<rTm9`Np69^d}oG|FQF<%Pzg-;)^c);Saw5y$jAi@7#07&OYnR z@1Ak`X{VlY@<}J2u>SaJW!<PfVtuDvDh?Nhj>`|`gqh6@7{?xS^ifBC`-sEWuK8Af zx-WHDZ%=nu=jua~t2){f@z~1fAuE=*wJy_JmNqXrIKsmrE!fn!_@Dz1*gvpnzlHlY zEMW8Z`R3kx?YYP9yUp8mmz{T-J7@Ne^*hX}+rD<@cH3_AjTtrgrpsB$SS;1CvIF0o zFy5b<H@a8%bkAT!!$sS|0b6_c5p3or+JR=$PPB~X8JUrCw70ht?*!phFkt|+_4@F6 zf9ILTt#`kozkL=TMC87W-!2Qq0e=YmU2?vkR{ntR4=UeEr((!C5&n)j-#=gZ1HQjO z`4zitBj-AmpDA0)zZd@E=~{4UukQTNo24R)sxKf@jYpa^{BS%X>U?^sv@gk0V)>aH z_8{uHnrNHPw(LdDBieWn(d<jM>@5lt%?T3Sy)iRtt(&e=GXsBV{$IQW<Gr*ec+I>` zwpm4UL_W)8G1J5rF+Yfvta8aR)N`sH;Skzand)C2s+~<8wR^9+apQew)b4y>=k9Z8 G+5Z4(dl@kR literal 0 HcmV?d00001 diff --git a/t/images/GIMP.xcf b/t/images/GIMP.xcf new file mode 100644 index 0000000000000000000000000000000000000000..875ad3c5c23f2f328f4fbb5c8361d049efd2088a GIT binary patch literal 2405 zcmb7G&2QXP5Pwcunxr8uB}9T=o>b9I0k6HARBfCu@<EykHd!SrHE^lC_FL~$yte!N zw(CTkIKTl8a6sbFLrxqJCypQie*rxp^$*~TXeA_0mBP%ky&p6XI=f^4W;}1^eawvQ z@m53=r$HOsX9Q>@W5h23YZ_c$1|C`coDgK7N#HZUL%>rRM!Q$Q>~*+Lc;HrVF=@ND zv_V1O>F^h~Zda;z_kc?a%SmKA`%Kb0^LVgWc>Kdp1<KvU!kz0Cvl6YbCf__1Z1-@h z<{a)jb8caIX>1{}l2(LnY0~n8*h&@)wj0)&1sK&v0gQy(uy)orG82#%3r#5_%P=~f zPO&pn425Tu=H})Mvuu>hI#}rOK_Kl!58^A}VT>vt>nwHzk0cL+%$MtQT}5r-D@U$l zFrT$pAY-FcEa40&U2q-C5zLmMKr!{V%kC*5m3+QbZE~M(+TuPtSTJzbpi|aL$jldv zL0{<F?ai#`e#Msq?s3kRZwKCDA<<pdu-m>YEWMNPMlB3|y0^ALC5z<=kuy&!@;^dh zbiuu*jGs5~hG2{~LP2fcKP6@_0EUxX`s{h5)nH|`${pDj?38G^|J1DS(ElS5APaZY zE_CxDh>I!{i%!@w5<7xiFpYE}SxR)rSa(=`SK3k~4aIX8EDqbkVX3zmGL^wGNjN5z zVg+g}K@vSfkf$nB2IrjWpa7s0jBdez&@DL@K%EIJC@9P^45jy#skV+eLP(`T-hk&L zWK5e-g?<I3kF`r=Sd}vrwDuY~t1uzoXqUVAJ8e3%f%c%4)L3j7-)rSA{zaQtcpUV< zee{*WF9QDK6RsKyHj}5oq}Jpyg})8S%7O#hNv};V8IA9?ZK0YL*#uJ@qwXu%5@@v< z$}nz*5xr3~N!c{7TjmX`bd#DltulaF(pP_^KRv<ES?F`;;C{v|m&~IamrV0WOV@UM zOvuqtcdjEx!#xb+kjA;==#dEX&WbzsJMz}M+gn4FkX9hY&aG9t_x=a;+(R-B5igN> zGG#k)v{J3Uhfabpz!l=!`slAmspeO`Px*i0DAqI>KLM@?2oCPw20ZDdxQ4i%;wEBI z+gSsf4*^ejDgF#`J;e_YcVr~N=3BIPB7yj4z;9)-0FujFd>>kAdOEo7*`f)*8PhcJ zaYm<D;a;Vd4_+l?`)fF&r#;>5r*JB75^~|op6+Uykc$Q(KOQ-4aX*Wq4b2d8n%wj8 zXHD(5HuX@l1lC4Kx|Z94Q>0gEDy)Sf3WcrS7m#ixG`px?guG>YO!owLQHOazrek^F zLkfpJcdw02H#{fwp*c>gn=ZV%O<{8sodBS@D7pqi>n9A&pVNN_I5dgjCCmelmhxDj zJUB_2>GXEMCFOzBWHF8p8;uy=;r*kZRi&E2p|}qjjbJY2)c^HyeignDJQ217wQcyV zf%F0}etSRxs*e@KSRSLmh>@_d<@kIb9`D20ZgQIofH8DVs`N8q67Fc1#|Jn%pFPW` RI}Ez*LEY$Gl$Ve3_cxZ;6b1kQ literal 0 HcmV?d00001 diff --git a/t/images/GPS.jpg b/t/images/GPS.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d13ec19d43b04cb3df99fbd0865dbe4a4891685 GIT binary patch literal 2133 zcmd5+Yitx%6h8OfnVsF)?Y6VqrKQY|p-`zrn|<`fYLpfzEP^T2TIGkb?JnIh?k;S% zQks}ZMXCIv^@S!TW$}UiCB8Mr2;%dX;H#iNtWP8{DfmKS9M7GZwp*I``sK}@Io~~d z&OP6pbI%wP#-tElGoWt+h{cwJ697uVODH}8j`1C07wVHJWr#~qe~#iK3<zp2RYWxP zS;UKMd>(PF?L!fVFt!}^MU=3Oy%>BIVh`G?5&NliCigF=A~;ajq5Z%Rg++*OL9Fi; z%v^(rYlbcCWB|{gtjea-{TaO{p4YRPK7h8)^|7|thK-2yOtM`c=m@pvvH(|LEdFM6 zOCsBy)Y?<oe6}x@-L5s&1tA;^hNHozXlR8NibTWB(NGX#@r>4*)ARXk2BWPr3|rsz zH+y|HR=ZMb%O#U-n69oTn+B+a$A+v5j^V3U4_j3b@Wf>{MhLK90&WW;HMZZX=3(>~ zZ2THxGGh4<Udd6}e9I5ePDictClE8+{soV<@fpO@sFhd594;I4w6YyLg+4H5a|i{4 zWX$sCm84@<C${2MVK!cg?ei9_ycaOG)W(3FDl1sA{K$$T42L9>Gn#=EVZH}&ti(rR zrZW*O)DUfG#^%g+tH_4F8&LR_-im^kOsGPgFbv~$u2J|x`X&4V&S=Tp@Je%b1fN`A zZ|+4-9=h?tY<m~(1+eUcXqRk^1q2`Z@H;%tgK#yX@M?uC=A<`m+@221wR>&<sI4n) z-L<x(xgJku_I&Xi(=+%7=9->C2fjq{3=(Q}$%}SsV-;ihT8F|pOzW#x_ovglw0x>R z-JOZ+w`+Pj-ka1C@qGLm;|EeVJ1r5Mmgd&jMuC?Mh)>0GVa-%J0N%M1snS7k7Y&h0 z_4zLCm$-C-$IR86i*HXQb1KbT;?M`4;&D>(!!a*!6FB*`2{wj<D%}D^Q|YbdGYQ_# zjGj*>wCnUtZz7vkX(_PQ&JLB9&p!qSszId-=l_w1s=pX;<1^R;j51~l6BrXjNfZS^ zbU7qZl3i}M?2=`7NtxH}DfP&**Y7PYQ+z(3yTl*xD*?m`VdyW2PEm9!9@(S(>t!4# z1?-PV%*A`f7k()O(IGiqvYX(AnqKq%ECWiAzrZ+e47-zmVgyC>Ee^Ff{F~xZ^^WrJ z?vaDeC9Ow}1~#9VS{muj4Y}k66_pFCYA#z=d-?MEhQ_Am7133z*R-u&7hB(PL+6cM zH{HCYCz0INo6>LV%lF^0b70rt-Fxo2ckl3h`$q47;K7F;KJdt+g+q@&@#Is7pB{hq zx#wSa@uinvdG*+v$KQJUop;}R|Kx`sef-I%6Q@p3e)-kc-+cSsneWe@JOATPKmYRU zh2JhJNSO)(6C_TV(4G8c6+v7aa`;*{N%0;2>hNx7dF#l*BS&3JBAcfI-MJI;f~ED7 zHRm{Mlk`91JoKMP&v2fhY`g)A6WU>bk!qmWbA=eE!Nc$?q%Z}ph2O^u`)c8TEX+9d ECrbabfdBvi literal 0 HcmV?d00001 diff --git a/t/images/GeoTiff.tif b/t/images/GeoTiff.tif new file mode 100644 index 0000000000000000000000000000000000000000..1a7374bc5f8567141b80a350267494c54e397ed8 GIT binary patch literal 2660 zcmebEWzb?^V02^P`qRL`pe_KT9UQjSrSKOEI5@uMc_F!QF9Q@fs>(hKxzgDO6F&e| z2bXvC>95;UtOnzgO51;c=x~e(Io<$dI!4%^oBF#y!Xv*lJwqWh#8;szKQC3m(A=+v zG@}_A7=aqNSU|dfY!(m?NOOSs_5V2-+cz=@Gca&4fy9A)&h`x;9UNR>nvn;pjt8oa z2dvI+A_E5)3ILUYj0Tx1$;b$2OE5AqFoVT`7BMnI*+5l{Y*02(mQfI<o`Z)`48~@V zU=)Y3nIaga7+9g^b1+K7*#e9jP;-FpVRQhoLDn(xwBBF<IavURCEC}61$BVz7eL>D z#6hl~0rWA5b^ziPK+N#}|KHiaEq+}6R`iAc<C^!LZ=StsexdMm@8hTk-|tPiV|er2 z_3W!0mzG{|I(z?g^+}0iTaN@Ce80bEujZ~}JCe6CY@WN(YTflUC94FNuUqQ9=*5E8 zc}lbQ&y1e-W6IP?M*Zh|bGkV@mbE!IKWMD2m#W!b6;l4Ow69pZ;6z?(4pZj*beq%} z$zPKK6V}CZ#imCej#7xI3A-6;8ayfRU4XaWa$gqj1kb%5l5S-#mz?z-yX{}tx!5eU z`fC|wzRgV7B;V+ap@x2|?n50rtyvo1)q_<xsPHIdDjbzplC6`zEoCk-MeKv9ukcDC zHi0C*{k+oL6`WT%4B2{FUNO5dE(V1FX~6zJX|VnuX>k8v(%}C;q(KG-l}Vl|x!Wdr zY`b+k=RXkqtN!!-ck$2nKeE3)|C;>y!KauHH{OT5z3|58)rps`&ksJceX{eh>BEf= zbnmUYt9E<QEx8-Bu8UorbcO#?_eJ*e&1e6gsXq1nWXbUl$8wImIGl3u!GV~4H}{6_ zzPQVG$I0!kTMurr+q7$=+4@cE^wz9et+sOU3i)NTmx?c*yoi56_k4~yjWd5wFP-v! zQbzxy-k7dy9RaN;o1Gi>)|pptsMIQ3QX*G4BVRD5JBu~FKIKPJQT&_Ow5SIWk)fA^ zeFKjBIe72#G;v$!qT#sEUfO1=6~B3hDU(r+{x{tMt(O|fs&|#c6)wnmNgt846WbwT zD7czmm1jPe1p6db9;P-#+#_NY5nqUyK!h=-4pP<I|A*-y&U}RW`hPGT_}qg{{r<l& z9hmX|xA`~wkM3{$pC^A5e>eM${L979)t{_+WN?4WU5i_LZa7>$a@pg;nR5ZBubhlL zcK1l)!KeE(_q^Rzxc%$a%1wVaG_7M>-L;Z$*`y_63un!jo3m(^+VoXZ^(SqfVBWjC z+rHy)n|t%=M*q6YHQ|+a$`eYS6lLVU$t}qGl2MWRC%GY!HNGnLLrhxKoyfrO<6*WT zn}an1=LLxPb@}}FF7<rvk?3~K)yMgelZC@Ndu7|1HvCqt7Qf63OrM#=7+o}U*WasW ztg}K}PIHO|ms-8bSLJNQhYI0xXJnnEcSz|;EEbm(?H6GcsuK9XpT>KKCy?tnr!D(t vHVu|}%p#0k3=E*q0)-AaEb?{Q|0mZ@kbB8<EySmo@eeElM!{$ZP&otuQH}D{ literal 0 HcmV?d00001 diff --git a/t/images/Geotag.gpx b/t/images/Geotag.gpx new file mode 100644 index 0000000..f4df945 --- /dev/null +++ b/t/images/Geotag.gpx @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> +<gpx + xmlns="http://www.topografix.com/GPX/1/0" + version="1.0" creator="Wissenbach Map3D 2.21" + xmlns:wissenbach="http://www.cableone.net/cdwissenbach" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd + http://www.cableone.net/cdwissenbach http://www.cableone.net/cdwissenbach/wissenbach.xsd"> +<trk><name>TESTTRK</name> +<cmt>Test Track</cmt> +<trkseg> +<trkpt lat="43.641000" lon="-116.062231"><ele>1472.396484</ele><time>2003-05-24T17:10:05Z</time></trkpt> +<trkpt lat="43.641086" lon="-116.062059"><ele>1474.319092</ele><time>2003-05-24T17:09:55Z</time></trkpt> +<trkpt lat="43.641450" lon="-116.061802"><ele>1479.606201</ele><time>2003-05-24T17:09:46Z</time></trkpt> +<trkpt lat="43.641751" lon="-116.062102"><ele>1481.528809</ele><time>2003-05-24T17:09:35Z</time></trkpt> +<trkpt lat="43.641922" lon="-116.062338"><ele>1488.739014</ele><time>2003-05-24T17:09:28Z</time></trkpt> +<trkpt lat="43.642030" lon="-116.061995"><ele>1491.622803</ele><time>2003-05-24T17:09:22Z</time></trkpt> +<trkpt lat="43.642201" lon="-116.061738"><ele>1496.429443</ele><time>2003-05-24T17:09:17Z</time></trkpt> +<trkpt lat="43.642545" lon="-116.061587"><ele>1502.677979</ele><time>2003-05-24T17:09:10Z</time></trkpt> +<trkpt lat="43.642824" lon="-116.061502"><ele>1507.003906</ele><time>2003-05-24T17:09:04Z</time></trkpt> +</trkseg> +</trk> +</gpx> diff --git a/t/images/Geotag.igc b/t/images/Geotag.igc new file mode 100644 index 0000000..140b89f --- /dev/null +++ b/t/images/Geotag.igc @@ -0,0 +1,24 @@ +AXMP eTrex Venture HC Software Version 3.10 - 695 +HFDTE050110 +HOPLTPILOT: Josef Klein +HOGTYGLIDERTYPE: Swing Powerplay +HOGIDGLIDERID: 001 +HOCIDCOMPETITIONID: DHV-OLC-2005 +HODTM100GPSDATUM: WGS-84 +HOCCLCOMPETITION CLASS: Paraglider Tandem +HOSITSite: Felsberg +B0723154916430N00643910EA0000000443 +B0731584915416N00645637EA0000000620 +B0742154913984N00648753EA0000000623 +B0753514911464N00650599EA0000000774 +B0805384909414N00653521EA0000000994 +B0813484908365N00653982EA0000001152 +B0824344910245N00649184EA0000000990 +B0836044913533N00645664EA0000000936 +B0846224917082N00642530EA0000000493 +B0852564917363N00642421EA0000000259 +LXMP MaxPunkte_Comp_6.2.2 +LXMP Thursday 07.01.2010 21:23:09 +LXMP Val2.2 +GMaxPunkte 1887F85651F8CAD288F2DE8A2BD3D06C44FB1A83 +GMaxPunkte 5FFF1DF9967C1F0B622473365EC1320B69AFEA3B diff --git a/t/images/Geotag.kml b/t/images/Geotag.kml new file mode 100644 index 0000000..ad456a8 --- /dev/null +++ b/t/images/Geotag.kml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> +<Document> +<name>Location history from 11/13/2013 to 11/13/2013</name> +<open>1</open> +<description/> +<StyleMap id="multiTrack"> +<Pair> +<key>normal</key> +<styleUrl>#multiTrack_n</styleUrl> +</Pair> +<Pair> +<key>highlight</key> +<styleUrl>#multiTrack_h</styleUrl> +</Pair> +</StyleMap> +<Style id="multiTrack_n"> +<IconStyle> +<Icon> +<href>http://earth.google.com/images/kml-icons/track-directional/track-0.png</href> +</Icon> +</IconStyle> +<LineStyle> +<color>99ffac59</color> +<width>6</width> +</LineStyle> +</Style> +<Style id="multiTrack_h"> +<IconStyle> +<scale>1.2</scale> +<Icon> +<href>http://earth.google.com/images/kml-icons/track-directional/track-0.png</href> +</Icon> +</IconStyle> +<LineStyle> +<color>99ffac59</color> +<width>8</width> +</LineStyle> +</Style> +<Placemark> +<name>Latitude User</name> +<description>Location history for Latitude User from 11/13/2013 to 11/13/2013</description> +<styleUrl>#multiTrack</styleUrl> +<gx:Track> +<altitudeMode>clampToGround</altitudeMode> +<when>2013-11-13T01:03:34.245-08:00</when> +<gx:coord>-106.026069 34.166232 0</gx:coord> +<when>2013-11-13T01:04:35.259-08:00</when> +<gx:coord>-106.027012 34.165476 0</gx:coord> +<when>2013-11-13T01:05:35.277-08:00</when> +<gx:coord>-106.027854 34.164765 0</gx:coord> +</gx:Track> +</Placemark> +</Document> +</kml> diff --git a/t/images/Geotag.log b/t/images/Geotag.log new file mode 100644 index 0000000..0d4c27a --- /dev/null +++ b/t/images/Geotag.log @@ -0,0 +1,13 @@ +$PMGNTRK,4415.163,N,07631.126,W,00095,M,110833.53,A,,030409*68 +$PMGNTRK,4414.765,N,07631.087,W,00100,M,110905.52,A,,030409*6B +$PMGNTRK,4414.711,N,07631.117,W,00099,M,110920.53,A,,030409*67 +$PMGNTRK,4414.662,N,07631.160,W,00100,M,111021.54,A,,030409*6D +$PMGNTRK,4414.492,N,07631.159,W,00101,M,111045.54,A,,030409*69 +$PMGNTRK,4414.372,N,07631.145,W,00101,M,111103.53,A,,030409*69 +$PMGNTRK,4414.145,N,07630.915,W,00104,M,111133.53,A,,030409*65 +$PMGNTRK,4413.791,N,07630.854,W,00099,M,111210.54,A,,030409*69 +$PMGNTRK,4413.425,N,07630.765,W,00095,M,111326.54,A,,030409*60 +$PMGNTRK,4413.633,N,07630.004,W,00092,M,111441.53,A,,030409*63 +$PMGNTRK,4413.584,N,07629.988,W,00089,M,111454.53,A,,030409*67 +$PMGNTRK,4413.488,N,07629.969,W,00085,M,111515.54,A,,030409*6A +$PMGNCMD,END*3D diff --git a/t/images/Geotag.xml b/t/images/Geotag.xml new file mode 100644 index 0000000..2b18bee --- /dev/null +++ b/t/images/Geotag.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" ?> +<History xmlns="http://www.garmin.com/xmlschemas/ForerunnerLogbook" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.garmin.com/xmlschemas/ForerunnerLogbook http://www.garmin.com/xmlschemas/ForerunnerLogbookv1.xsd" version="1"> +<Run> +<Track> +<Trackpoint> +<Position> +<Latitude>43.64986</Latitude> +<Longitude>-79.58321</Longitude> +<Altitude>142.893</Altitude> +</Position> +<Time>2004-08-28T13:45:00Z</Time> +</Trackpoint> +<Trackpoint> +<Position> +<Latitude>43.64987</Latitude> +<Longitude>-79.58320</Longitude> +<Altitude>150.374</Altitude> +</Position> +<Time>2004-08-28T14:15:00Z</Time> +</Trackpoint> +</Track> +</Run> +</History> diff --git a/t/images/Geotag2.log b/t/images/Geotag2.log new file mode 100644 index 0000000..3f2e61d --- /dev/null +++ b/t/images/Geotag2.log @@ -0,0 +1,7 @@ +$PTNTHPR,254.7,N,-1.7,N,-12.1,N,A*6E +$GPRMC,112723.000,A,5040.3182,N,00505.9469,E,28.66,138.74,240410,,,A*51 +$PTNTHPR,253.9,N,-2.2,N,-10.7,N,A*6C +$GPRMC,112742.000,A,5040.2023,N,00506.1107,E,27.89,139.01,240410,,,A*56 +$PTNTHPR,260.5,N,-7.5,N,-9.3,N,A*73 +$GPRMC,112802.000,A,5040.0932,N,00506.2621,E,25.54,138.58,240410,,,A*59 +$PTNTHPR,254.3,N,-3.7,N,-5.5,N,A*7E diff --git a/t/images/Geotag3.log b/t/images/Geotag3.log new file mode 100644 index 0000000..5102b97 --- /dev/null +++ b/t/images/Geotag3.log @@ -0,0 +1,7 @@ + 1 0001 42.721544 61.671879 249 25.21 21/04/2014 07:06:41 25.21 5.90 3.27 ypr + + 1 0002 42.721664 61.672028 250 21.94 21/04/2014 07:06:42 21.94 7.33 1.26 ypr + + 1 0003 42.721786 61.672173 249 28.36 21/04/2014 07:06:43 28.36 6.42 0.34 ypr + + 1 0004 42.721910 61.672337 248 22.98 21/04/2014 07:06:44 22.98 5.50 -0.80 ypr \ No newline at end of file diff --git a/t/images/Geotag_DJI_2020-12-02_[07-50-31].csv b/t/images/Geotag_DJI_2020-12-02_[07-50-31].csv new file mode 100644 index 0000000..a8f5cb7 --- /dev/null +++ b/t/images/Geotag_DJI_2020-12-02_[07-50-31].csv @@ -0,0 +1,94 @@ +Id,Time(seconds),Time(text),Latitude,Longitude +1,0.3,0m 0.3s,-44.69009395,170.42456545 +2,0.4,0m 0.4s,-44.69009389,170.42456538 +3,0.5,0m 0.5s,-44.69009368,170.42456536 +4,0.6,0m 0.6s,-44.69009359,170.42456529 +5,0.7,0m 0.7s,-44.69009355,170.42456542 +6,0.8,0m 0.8s,-44.69009345,170.42456534 +7,0.9,0m 0.9s,-44.69009337,170.42456518 +8,1,0m 1s,-44.69009331,170.42456511 +9,1.1,0m 1.1s,-44.69009328,170.424565 +10,1.2,0m 1.2s,-44.69009326,170.42456496 +11,1.3,0m 1.3s,-44.69009337,170.42456508 +12,1.4,0m 1.4s,-44.69009337,170.42456506 +13,1.5,0m 1.5s,-44.69009351,170.42456512 +14,1.6,0m 1.6s,-44.69009345,170.42456509 +15,1.7,0m 1.7s,-44.69009359,170.4245652 +16,1.9,0m 1.9s,-44.69009328,170.42456512 +17,2,0m 2s,-44.69009316,170.42456514 +18,2.1,0m 2.1s,-44.69009334,170.42456511 +19,2.2,0m 2.2s,-44.69009329,170.42456518 +20,2.3,0m 2.3s,-44.69009325,170.4245656 +21,2.4,0m 2.4s,-44.69009319,170.4245658 +22,2.5,0m 2.5s,-44.69009329,170.42456598 +23,2.7,0m 2.7s,-44.69009283,170.4245669 +24,2.8,0m 2.8s,-44.69009242,170.42456753 +25,2.9,0m 2.9s,-44.69009213,170.42456775 +26,3,0m 3s,-44.69009167,170.4245683 +27,3.1,0m 3.1s,-44.69009135,170.42456885 +28,3.2,0m 3.2s,-44.69009102,170.42456924 +29,3.3,0m 3.3s,-44.69009102,170.42456972 +30,3.4,0m 3.4s,-44.69009081,170.42456996 +31,3.5,0m 3.5s,-44.69009059,170.42457032 +32,3.6,0m 3.6s,-44.69009042,170.42457045 +33,3.7,0m 3.7s,-44.69009023,170.42457053 +34,3.8,0m 3.8s,-44.6900901,170.42457054 +35,3.9,0m 3.9s,-44.69009008,170.42457032 +36,4,0m 4s,-44.69009,170.42457026 +37,4.1,0m 4.1s,-44.69009002,170.42457028 +38,4.2,0m 4.2s,-44.69008998,170.42457021 +39,4.3,0m 4.3s,-44.69009004,170.42456997 +40,4.5,0m 4.5s,-44.69009009,170.42456979 +41,4.6,0m 4.6s,-44.69009007,170.42456965 +42,4.7,0m 4.7s,-44.69009011,170.42456949 +43,4.8,0m 4.8s,-44.6900901,170.42456935 +44,4.9,0m 4.9s,-44.69009027,170.42456917 +45,5,0m 5s,-44.69009027,170.42456904 +46,5.1,0m 5.1s,-44.69009024,170.42456892 +47,5.3,0m 5.3s,-44.69009024,170.42456862 +48,5.4,0m 5.4s,-44.69009023,170.4245685 +49,5.5,0m 5.5s,-44.69009038,170.4245683 +50,5.6,0m 5.6s,-44.69009037,170.42456818 +51,5.7,0m 5.7s,-44.69009036,170.42456817 +52,5.8,0m 5.8s,-44.69009035,170.42456808 +53,5.9,0m 5.9s,-44.69009035,170.42456806 +54,6,0m 6s,-44.69009035,170.42456801 +55,6.1,0m 6.1s,-44.69009021,170.42456752 +56,6.2,0m 6.2s,-44.69009018,170.42456746 +57,6.3,0m 6.3s,-44.69009019,170.42456757 +58,6.4,0m 6.4s,-44.69009014,170.42456755 +59,6.5,0m 6.5s,-44.69009001,170.42456755 +60,6.6,0m 6.6s,-44.69008996,170.42456756 +61,6.7,0m 6.7s,-44.6900899,170.42456763 +62,6.8,0m 6.8s,-44.69008985,170.42456767 +63,6.9,0m 6.9s,-44.69008982,170.4245677 +64,7,0m 7s,-44.69008977,170.42456775 +65,7.1,0m 7.1s,-44.69008971,170.42456773 +66,7.2,0m 7.2s,-44.69008964,170.42456778 +67,7.3,0m 7.3s,-44.69008958,170.42456798 +68,7.4,0m 7.4s,-44.69008952,170.424568 +69,7.5,0m 7.5s,-44.69008948,170.42456825 +70,7.6,0m 7.6s,-44.69008944,170.42456828 +71,7.7,0m 7.7s,-44.69008943,170.42456831 +72,7.8,0m 7.8s,-44.69008937,170.42456834 +73,7.9,0m 7.9s,-44.6900893,170.42456855 +74,8,0m 8s,-44.69008922,170.42456853 +75,8.2,0m 8.2s,-44.69008899,170.42456858 +76,8.4,0m 8.4s,-44.69008861,170.42456849 +77,8.5,0m 8.5s,-44.69008836,170.42456849 +78,8.6,0m 8.6s,-44.6900882,170.42456853 +79,8.7,0m 8.7s,-44.69008796,170.42456851 +80,8.8,0m 8.8s,-44.69008784,170.42456857 +81,8.9,0m 8.9s,-44.69008797,170.42456858 +82,9,0m 9s,-44.69008791,170.4245686 +83,9.1,0m 9.1s,-44.69008788,170.42456842 +84,9.2,0m 9.2s,-44.6900878,170.42456834 +85,9.3,0m 9.3s,-44.69008788,170.42456845 +86,9.4,0m 9.4s,-44.69008781,170.42456838 +87,9.5,0m 9.5s,-44.69008777,170.42456858 +88,9.6,0m 9.6s,-44.69008774,170.42456857 +89,9.7,0m 9.7s,-44.69008734,170.4245683 +90,9.8,0m 9.8s,-44.69008731,170.42456832 +91,9.9,0m 9.9s,-44.69008766,170.42456823 +92,10,0m 10s,-44.69008766,170.4245683 + diff --git a/t/images/GoPro.jpg b/t/images/GoPro.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a88d9e50aeb5750c5cf9a4e691358811039a22b GIT binary patch literal 4601 zcmeHKZ%kWN6hHU1unw@m1{;&9l|%-cA#H(zxJ;of&`F`TrQjqE=Eg++O$CE-am}(Q zA2iNp8e_)tgp%&lvScnXM&n{OM-0aKf9ev48bgdRe(-~dXg$C8ug^JHj4?6M1NYr? z&i$Qp?m73~*Za~J(+l>u{1XHHM8P0!CL$Z<2|G#5IfyJjiF}2>k;qyk3Jl&Y){uoU zg8xWdPgx32){rPQ_-;|5Vc45+DYhl-r&qWYzKHn=X>G>OQv+mG{m`+=TXbGJ!Sg7h z%7ZT%o}WHAW$;HP%Q8_WH);HCqQgY1*qhbqcDoK+jEF}MTMho?b3(-k$wJRbhR+KL zK{;AR^NEc9qlDGaUrJ;d_-_)~2LF9xRVJf^P2<^FVztIQn9nirKPC2K4y$cE)g@V* zvu$-wt}HUPvZPldUzRO8pZlturSsC^>0;fd-8#Kqv*pUqs6GXjYevmi@S;)D<Uc88 zVkIpm-fH;FOJ-^Me74Qjcy^T3^My}SzDYe_=yNnY&nKCy)|}Op%rnJOcL?t^JMRo8 ziT4)vp*4J4JtTECT~4PmYSTugb`^^q$SK<0{DhU%1-&|d=(lqwNL$IBjP<hbV!yiW zgLH#po6GovFsE!T8ww}b!nDur&t&$w{dw~~mxR6|_G6N<YP3=D_OE;Ryn$d3SG1)g z6z=H3(^*sRuG$`IQK#B68hUti*;%*x!yO(+(@@|2gICA2vKlp4`c|K(%IU&?EkD&o zgqhpvs%vmL8=Tb+e%97ExNn1+?X0J{N9A&^hPj%KdT;Hdbzk?wh8z13mE7~&K$ZR= zE92_w=29WinJ1fx+8VdlIX$jwSDnY{a@W-=mMc7dP-v^GG_bB{>iEJ^Y<9;J^A}bv z$nTJ_PX!lLQx&!RbA<qZduaKn|Bw8aDqwr-p_FaUSjsjro<iO|@1ILybK!uZos136 z9+~Kr^_m#?2gg#tKFtk3&v+f8y{h4vCD^>k<9P8d-8VQ3?BveD+2r2A*)&rP^T3%2 zF_qUl_cif!T9+|D9S0wWIF6Nj%pDl;rHrrnK%GBg!_UOVsJxc)d)I0_d_YFu%GiC} zFn^t36MeZ;hHU-r{7l8-`I(|m&ZQI^Q5uimakIR&woKkXa(epEo7c^rJz6Puvk%0B z4g7(B{o`{fU@E?@kfC3WjCyMMU1ED+krSF;f9OC4p6d^6-iOQAANUd;*Xs}LKVAP< zI0oXP2G^?poQ4GswSpaZz5bA|RsZj&D&>ospYGS*nc3dZQ?<MQk)0!bBkKDdPMA>3 zUS5+4TbB%(=H8e=H&I>j^0+2n{^(rlH{O>&a*uJ~kBr7-4C}=AN5$9F@abvn8#MU7 z%vkOy&h1OK$Nq+_)7;uq)4-Y6?<nKuxxvTP&JWIsf#>}J>=HNlgfFy}_6M-H^1PPw zk26!x<ES~#C$N~uB=2|BNjaaUI_>5$)Wyc*OPpT`_mF`%*9m(Jb%L+Ew`A%Bc?mX5 zac)`6FIOjE-kqPH-`n5cue~n_=MZ``p$4nCVNSXp`Jmx^_8zO04=|7XFpivIGsia? ztUY+l19P)wji(;rvH}D9OC3=eGQT_I3C%z7*pq0$TuH^O@I~I9332-hV2!{Ieah#r zEGFN_cjceiUpdQ<v;SYx=>s+?oi1aU>u~__7ESp82cL+yncs2d^8vqkJkB<~BsRzQ z-+8k<_vl5r?a5!0Xt3MY{hoXS<G|Cs@5#(kyPsw;pPwJTAn&`^gY=d4BEnS~_dW79 z^r$yM9umpL{>$oax01J-Kc1@HHJ;i!w@bN}!P-O>%wuAk(61?YH%%|T5NAFBncMB? zi{mFoRek=m9D9*<c5S>t>lHb3qhqalX*Bw+zVYGV#~fo1j1TV`=^Gew3=H?}-Q(EZ zH`cc;{jF55-c)`5n3sf9;fn=)ZC3T@_+stB`vnz;9vB@Pb+inP?&=$IMD~o04UFvN zHK%C6dzXS0!G%aP9ON&A#b_iL((KQe$D4y)VfK}O<z2Qd(B8~?=U=@&dfBc?P{Eb= zM{i@K9dWL#e^8Bc<F#(y!A>QATcFgn_4riLy4l#$!iD)KcA&0i@&-G69AEJ5mx9rI zLg4x1hdRQ3#21~+`*w7oe&Qa5k3_Y)P$U>dEd;*5LgA=_2PPElYGS>uu`}AiBFm9h zma|&}E%**#+1m!Wxven@+20+C0uLS(3Iw~=7<qB#+YLVIkHOAarG7hv8>4>M)$DXd z{9d*T`y&{4xr3pd{P7oR^@Wj-;xpXXrSq-LZ7n*V{(=rsQ9;3mH5)dqU%$y+ep9)- zs+_56TP<jtuTdf2N+gOmY;bIJl$Vs0d&(W<9-n8+77rUV)i$kUmKjT*p+XxMz-AF; zBozuvp-7*lyR=VLr6}qnTm5)7X{bQS&#Wo@lP3K+<yrV!y3kTcchD)iDgD{+bN38P literal 0 HcmV?d00001 diff --git a/t/images/HTML.html b/t/images/HTML.html new file mode 100644 index 0000000..2fa94ee --- /dev/null +++ b/t/images/HTML.html @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title>ExifTool HTML Test</title> + <meta http-equiv="Content-type" content='text/html; charset="iso-8859-1"' /> + <!-- Note: The HTML standard uses a '.' namespace separator (ie. "dc.title"), + but a ':' is used in the Daisy specification, as below --> + <meta name="dc:title" content="ExifTool HTML Test" /> + <meta name="dc:creator" content="Phil Harvey" /> + <meta name="dc:creator" content="Another Creator" /> + <meta name="dc:date" content="2007-30-01" scheme="yyyy-mm-dd" /> + <meta name="dc:format" content="Daisy 2.02" /> + <meta name="dc:identifier" content="DTB00345" /> + <meta name="dc:language" content="EN" scheme="ISO 639" /> + <meta name="dc:publisher" content="TPB" /> + <meta name="dc:source" content="0-065-01022-1" scheme="ISBN" /> + <meta name="dc:subject" content="Greek: &alpha; &beta; &gamma;" /> + <meta name="ncc:sourceDate" content="1993" scheme="yyyy" /> + <meta name="ncc:sourceEdition" content="1" /> + <meta name="ncc:sourcePublisher" content="Phil's Desktop" /> + <meta name="ncc:charset" content="iso-8859-1" /> + <meta name="ncc:generator" content="ExifTool 6.73" /> + <meta name="ncc:narrator" content="a narrator" /> + <meta name="ncc:tocItems" content="1024" /> + <meta name="ncc:totalTime" content="91:27:21" scheme="hh:mm:ss" /> + <meta name="ncc:pageNormal" content="881" /> + <meta name="ncc:maxPageNormal" content="881" /> + <meta name="ncc:pageFront" content="27" /> + <meta name="ncc:pageSpecial" content="45" /> + <meta name="ncc:prodNotes" content="0" /> + <meta name="ncc:footnotes" content="0" /> + <meta name="ncc:sidebars" content="0" /> + <meta name="ncc:setInfo" content="1 of 3" /> + <meta name="ncc:depth" content="4" /> + <meta name="ncc:kByteSize" content="1530000" /> + <meta name="ncc:multimediaType" content="audioNCC" /> + <meta name="ncc:files" content="97" /> + <meta name="prod:recLocation" content="Studio 2" /> + <meta name="prod:recEngineer" content="P Harvey" /> +<!--[if gte mso 9]><xml> + <o:DocumentProperties> + <o:Subject>a subject</o:Subject> + <o:Author>an author</o:Author> + <o:Keywords>keyword1, keyword2</o:Keywords> + <o:Description>a comments&#13;a new line</o:Description> + <o:Template>Normal.dotm</o:Template> + <o:LastAuthor>Phil Harvey</o:LastAuthor> + <o:Revision>2</o:Revision> + <o:TotalTime>1</o:TotalTime> + <o:Created>2010-06-28T23:52:00Z</o:Created> + <o:LastSaved>2010-06-28T23:52:00Z</o:LastSaved> + <o:Pages>1</o:Pages> + <o:Words>84</o:Words> + <o:Characters>324</o:Characters> + <o:Category>a catégory</o:Category> + <o:Manager>a manager</o:Manager> + <o:Company>a company</o:Company> + <o:Lines>26</o:Lines> + <o:Paragraphs>26</o:Paragraphs> + <o:CharactersWithSpaces>382</o:CharactersWithSpaces> + <o:Version>12.0</o:Version> + </o:DocumentProperties> + <o:CustomDocumentProperties> + <o:Checked_x0020_by dt:dt="string">Phil</o:Checked_x0020_by> + <o:test1 dt:dt="boolean">1</o:test1> + <o:test2 dt:dt="float">15</o:test2> + <o:test3 dt:dt="date">2010-02-05T05:00:00Z</o:test3> + <o:test4 dt:dt="string">text</o:test4> + </o:CustomDocumentProperties> + <o:OfficeDocumentSettings> + <o:AllowPNG/> + </o:OfficeDocumentSettings> +</xml><![endif]--> +</head> +</html> diff --git a/t/images/ICC_Profile.icc b/t/images/ICC_Profile.icc new file mode 100644 index 0000000000000000000000000000000000000000..045801f54ca93f921a65403461447faaf1ee8544 GIT binary patch literal 492 zcmZQzV0`1}?eE8=z`&53S5g$@?xYYA8KuB}o`Hvfok57fnn5fvxwybFAi#$K2=emt zQh^jBh>ZZ>u0cdD>mtO6W^tyZ7AFH$e*j|NBB13!;~ju(k#q<<1jJ5)uromHqL3hG zpqd&Wn=c*0?g6orAnZ9Hc6mub2~f=%kox3;A`trkkgWr?3&>=U_RGx9&r@(r$xljE z0QuWQ&j1LG4GauG(ojG^6)3DAD(6TtF!(QHU|{)!5Hsm!U|68dz`#EhA*N=;z#yQ{ zz_4#Ya%oW+)D}i2V+IC7e1sXFL%`w9D0aRiwF2lj1_p><JoA$E6x0+T9OwL^g8ZVy Nl1!i{jSLJ7835JbQnCO5 literal 0 HcmV?d00001 diff --git a/t/images/IPTC.jpg b/t/images/IPTC.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5bdefb2e8f1e4397b3c5651cf21ac2878f176331 GIT binary patch literal 9851 zcmeGiO>Y~=b#_-@q#RpH9XJZuctRj@fPh?zwnSB+=}?qpF_A1nUZsgqKv<C@a^vOB zVs~gszO;uNa_p^0Z@C00&>V{XfgbuJ(i8}COajE0qCgG-*f+D>C6^y7D|Q0c(Fk14 zdo%CNdvD*qc{^|0pSQn4GjDH{H;^PtXcPWW`@7eFS7}g2-3GPs^>hX;ua>vR#t<~A zo{$lek(`i^(WN3jG8j9-Ro!L=wG#3}6fff=hcbc<mXHlJeTU)((QBq*k%asPn*D7< zXV|b@=CrDu#!bi-G+k*JCf?MY2jnCn@1g1K6I`LL;W4#P4B(POYMkddn$?KQaJizD zux(UX%K^?gG?mR{Ze+6ArG$JBO}%4Sb(e9G_K~t<0UbdTCEe0%dP1%v?1|xG9WzI_ z+@|5WAPjcMA#sRR1&)`Hw2+W5qe;D~KLl>PKW;SjI*eULu@*B-kdJ`;b7*S)*f`WE zH90WG#Y@Nxy;7p~iDT3o40G9VNXa;omJ_mzE|#w~F>4U)(w4*51qNI-&*ralo1>ZW z&#u^i`^)~-KYjGqkM}>l{RO`t%C~&z*PrEY9XCz<fH+)%o5_WACW%1<S_7GHCik?B z)N=AxA)bG2ZKtHYUs=btX@L1Ed#hXJ5>BR6wP@QW!6n+XTZ}lWx~8q+%2xTVhJl%? zuHQ-GWP>q#MOBZEj?y}xp03g+pXjO;huXwpCtJWZ1qA6Dt0iGQZ<&x>fUUs|E5u{@ z`{bkmEIQ0=$FNws0=C_tPE&{O_9k_Vhty)axl7!<%I5=FhkQ6aGphFqOIIDDGwS#> zu{`)1*rI<qKsCW1>I7zXX2fHWj15MbMaR)kx~z2$f?z=Ci#CGC>B?~?Ai7z|W%H`& zaK4ceRZW9fED#4KpGDVb-c4Ft(;4YyUIVzmT{)G>rm{=g!i|;e@=9j;US1VLr^@Rx z;ILup^<J)U>j~V2LME^JU13nww`gAV%?#^2uK(;f+%!6mApT;(EgI^5|3BU{L^bXw zzVQ~qc06~W*pG6cyHy=Ft-w>C7w73yD+oH^HRmxWh%Z0RW!{B-&;Yl24tJ~}ss*ld zzF$3s{mM6R-}Cvrgq;!U1wM2hez+<8^yaa{kJ~!XysX#OAq(F(tV6o*WipSK^@P&W zV(o*L%SeqQcS*IISO#7golNv4-e=54qq4HW)H{~<lR|DdKUL)YQ(rAcs>!K)xB?`$ z#7r7e)9&VY3OaZF#<1Coxup=go0Gt*!-e)U(*7j>jCPIYKA7f%H3#$j>x(PbmqK}d zq|Cz-{ceWZm+ANTeUIb!V9#<(;VJk<xNg6mBYZctupDx`j!Ta~=W@e+_cvkmx$lY> zR_}E;h}mcIUATQ^h}Ce=QQ?96j^6CPX?LU9P{;Sf!ed6;wB1a@SsJ@rbqpIqdiSg& z@(F(Oh#RFM_tuUemYy;RgM+7#XwgAy;M^nN)_<lnTKVV|qQYV(mC2>D%UU+OvY1=R z+<01Hap1-MNnL9Xjyr#r9sL>bu?Ss9gvRr2ec16`WKj57w)Jk@=)I?a{R#K=XUu{7 zl^x;1BX;o-=;w2DA3T75c0Aa&YrljIew3O$oBY=K4$n&*Pi2Si<bTCV84gu=(a(R= z50aovCY^<MtZt?kl}AGD?E$>+ZPDueE~7);bcxCfTT!I!#O}#jhnJq9s@DnVnmDNF z5i2<Eh+1P%O+Rt$*D{LB5GC`0j!}fYD*6le=a}6ylztU`4fCp~h8E(Ys;hj%E4Szv zDR31Pcc`d;DZkZz)PAH)$h%5?{0-#?D6)4)KZnw}1aJ+05>gaSDgC|;eU1%UV+zel ze-t1NkOLi2J^oIhXL!9|aOwOPmHv4#cCkx%>kr7QN53F&{7ZmW#mu=dto%p7F>!^9 z<Wa>143Y|(X#u^&E6OgElnIp18I;b`)Tygt#<dwS11jX=Kd=!J|5repNIg7+5fiQx z0wZ-WpM3o10F#9g3EhLMKW9;3QeBMT`8~i0+3?N7(58INhldWepJYtfVT$ucTvyOj ze#`rHZ1gH%5fWcqh`FzDP`L>gPah5<RDmD&h%r=#zJ^NB_iYB<p!MSTd`=f?y%YR_ zj$j<LTBZsAxI<1H(3VwmcMd+N0@R_~t+EAxgt!`fGGbDz4zOrj<dF5ktBf`~un=Px zK9A_YT(k+-G^)gX*W7Xel0xf@i!ngI2){`Il-GKAPu3mUvO}l|_==zopPpE)CeU11 zzstEp{S<Hjzo54my-h6QKmg>cBMl;2XL8(|%rShV+^l2x_fzYyv>a1ge@}y@I>zP3 z4`a67ItgJWbdza%J%qbhB|t}xS=rsxwzm%83F8c>d~|4XtU;ZJMboJJmb&CA4<BK8 zXrP>|kwd*@GU&!0K%r~MbbiP$(BbLR2lWy)sncWJS&#qf?O*^%&>d=VTgMo+cUsIP zzGLvQxCxFlfW2@)893Acep-BX(}xyM(q+y}xT=UMW3LH#53Ulo&m~lZM~b2YL=c7t zr2%~gKUef@nDMJqW?+;<X_Vm%y?Ez6v6CX&!y4^J=wh)(4~Telk<|V-`Vd{7nVEZW z?%I_r*Ru0h=d<Z~Xz9WtZ-up@XlqeTdTDMBC-D5sFV8Q{<N2kvr8nPP0)o}W)hM#= zSo<Gnb_&6tA|;VLD=D*5`=96?&nTcv&?bbL0+4rRxZy%=b^z1<0$orf;H=D|Tj=lT IYWrXR1F`#5#sB~S literal 0 HcmV?d00001 diff --git a/t/images/ISO.iso b/t/images/ISO.iso new file mode 100644 index 0000000000000000000000000000000000000000..f2067b451984dae83b4eb345f759d204c0ca97d4 GIT binary patch literal 40960 zcmeI*UuauZ90%}U(vii^ZINgZAM{eNFS>YdE2W~W|B}*RUDG7h`3JYO&28>TlW=o0 zQc|?D57vQYsC#fvb>JV$9tM`xvY`dp%9P5K?MZxysFYS6o6_l8t-qU_rfbut6(rs8 zd&2#5&iUPQPCf~_IrrtbyjCJQc8qsxrmA0V4qZ7%ee(;l^sOvilznoW<+-8nhR%CG zrM}O|GES!7-k*8eLgXE-KRePcT@>g3oU*HBN9Nl{61IV~N!uY$TCQ0}8)omDr5D;p ztyA`abnT06yU$#x^V~@Lyq>evH@=PJ_fBu0cGB+G`bn<qpEQ4eT|Tn6u5W%K8B5%C z^W4v=8D}5S^Z+UGXjq9Pl8z1~BJ?QnxDx3WqN>mtRn<gHbL=dY56aRva*5@Slx#0s zNXcH=WAPm_9kRXglYFCkIyLcwWiUN>{;j#{UsHn@tm*nsOy;9y*HcsWH@j?d;PdGR zsWlc<1Df7)yf>}|dxUT_&?N*_HL7w4FP|FSb#!mXwvV?@*`6v*T${T8_u0SJ1pJQ+ z7j_yAKGJ=~Pt;E)qS}L6rtG5~M1L<XUgfQ27uT6L?z(-%)#MgD^<HkvL@)6Lp_32o z*RSJtGimWdZk1DAW>54*HvjzT<F)Bm-*J!GM?R<+AG>;Yw*C?y`*}OQ_+)vu2nPs2 z00I!W4Fx>UWCo?*EA*dybA2op4i*?^rv5-IplXVyL?Z`!0<pEC_4Z2Esz4b8AOHaf zKmY<;FR*<7FL|3sGtBeBf`c;d|IJOlf>AVFM`SM?f?5bb00Izz00g#5;N<Y7*&oNN zoUc!W&Wu&OJDGc~dyny4cWGRc+2_95=fXBO`KXnesh2uPC55_{0{`W4-TrMx|N4_` zJ$-32j_da?83EWs00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00fF4U}|)V zqGTdrgXBsovOgLP3;tkS6P}HR9fEZ0CAp!_@Y28LnOt_g6JE#1q;F)k(p;GyRW|ok zc5xpr{#q|7r+f7S@gcMNkBu~wwUizp?!vf!<*0l??baa`;oQ?KcoH39B_2{D-9_kc zbr+tH5*C^R>fvDT>Z+pTLtRQj;~_|*LlO^HJyBDXUY9%RjK+FZr8}fKwB-7qeV`+* zse#UdK}w`6m@L=|_gX1R)uJTUNTMiKR*NF#6>!ChL@RQf;V<s;@NxEk6fl0%u!q3y zAYk18T`hvY)$8`R3O<jk(cR>3toOTH_icKBuas;$6oC+c00bZa0SIihfH^z=Ct-t^ zlY+d|uR;NeaAce`UiLT0`%Vhc9&+a1M|S@I@MErA(OM_Q{N0%UpQz9yDo(_6e<Dhf zdPzB5<}jY?UnZ-5wC2tKHyHCq@9EC3-_MIMd--K7$GnFma!?g-)hts<BIh6HoS5C$ z@VP`aoHt&Na#Ran+mOA!f!evPef)VYx3fB?i5GreuD=rmH}xgiR8Zb@Kd&Hfx}R5I i(!a?_5P$##wq9Uy>Hfd<L%|3j009U<00IywlE6QXLH`B- literal 0 HcmV?d00001 diff --git a/t/images/ITC.itc b/t/images/ITC.itc new file mode 100644 index 0000000000000000000000000000000000000000..28c11a104f7c22c031c3002f91f054e0f4da6d53 GIT binary patch literal 672 zcmZQzV3f%$NzPzkU|>SR42eZ0<v{)j2aGM5C8@c<K)3+Jj7XSaqF3$%DfMZBlHmn{ zao&rz<>V*l1o*k90o5=AF$W0$M*=|pfP$37lEhA+19`cmxPT7f_4IHF0@7f2a)4sq zJ6H1#kYY)9^mSxlxXJ8v&3_?~&spFRS<Jw|Eeyhp4727)00oswTq8<?^V3So6N^$A z0!uTKvqLg-Qx(khj1@F|6O$GEgB2n)8I*Gm@&Q$|mw5WRvfp6jWi-+|d;J?5P)O9% s#WAE}PV%4s|LvL04zz@pT<~IG2)n|}YyRfUVxR&BPgg&ebxsLQ0HPjCtpET3 literal 0 HcmV?d00001 diff --git a/t/images/InDesign.indd b/t/images/InDesign.indd new file mode 100644 index 0000000000000000000000000000000000000000..f8d061cedde9d4f53bbecb6cde2ec5eae06dde2e GIT binary patch literal 12288 zcmeI1y>HV%6u?tHB2fm!j4D}TFawV5q+hm@R8>MnRk?*yM8$UTU0N&g2hK%FJ0K=t zK=4m=L8@377!WEO8w(2(0<j<_s2C6|e7ti$nuMsd5=EuFlkR-ydw1{M&(AM@N<9AI z^UI;BcTe=q_uu)Wq5NF#vUP5D;ZQ7gB8bIehoOox5IcElz0rxr2dNQfJlb<0IDb?I zpzW;3VLW@kF&Br+#$2O+3@$(Vl-52CDQy2&0)1R#SGR<(VL<{&00|%gB!C3|Z35z( zQ+!v7??chQ2UV0?jSIF&00|(0JtgqTzP=vcVg4UG;Q9ZN9@4G6y)*Y0ea!!RK;dvl z1a_6|_YubYe@B>62niqoB!C2vz`iDc`TxFtJZKyeIPe5E?X^2^3}fZu?V0jj`{UOK zZ(ol?j(Y<R{*=KV;vx-!f5u6Aq8<>t#JE&oOOBV3Hy>}vl0!4{l@Uv`f*f0R&aZ~- z((3Gjy;`yjDo<q7b+hgUF5^V1yJfFp)-y7peu0_L7q?YeibQxRBQIJPB<}m=lEbA` zLQ|5)S*aKjm(~2RB<YD!IXjpRY0;d|Pc^rLQAS?oJTO(YR;wjyse~Ucsk&hps+Lrf zNd+X7%8JKHUGXZXL0e>ov)EqdRT7a!3EOv7XHnG?nhJ^rrASqtRqW6SxZ``0P)!Pc zm1kr+LN$X97nJ09N>_B9+Df5Fk_sI+7-3@tQWzhW2c@RApu@^8bua<?QbM1UR>l4u z`u?m9+$nCM>M}yiv`)R(R@6z*A3RL7ZIIG1GIJp#oaLcrlbSZBXroF>ThKI9H%u*g zHLdmt0qw1Iez*XRl${i=CQW-l)mid{Q*|tB%Cy#5;Ej}U(qE%K*3{S~)?VvVr?~RF zm0Lo4{<MLOWo=K|btAWnpjnog_wB07JU*SzHeOKb+YU7yk5aSg?PNP|kHB{C)1(78 z=b1+x@ebw6q*BRJRwUIjZ!PJW-E%n9Zj%YBVL6Hz)K*!U2>=!FL%oTH+Gf!YUBa^@ z2+EF4#2M7O0#qW8N~>EE{mpK?)ex{CbgAuN2!nPs1vDAC2C?$n^H;%_n=^B3FP@!w gIC(ApYY;y0zeRXJB!C2v01`j~NB{{SfxkoGC$&4HHvj+t literal 0 HcmV?d00001 diff --git a/t/images/JSON.json b/t/images/JSON.json new file mode 100644 index 0000000..dbdaf10 --- /dev/null +++ b/t/images/JSON.json @@ -0,0 +1,19 @@ +{ + "tags": [], + "description": "test description", + "title": "2013-02-02", + "people": ["one","two","three"], + "comments": [], + "url": "https://(removed)", + "geoInfo": null, + "geoInfoExif": null, + "imageViews": 0, + "license": null, + "test": [{ + "this": [1,2], + "thing": [3,4], + },{ + "this": [5,6], + "thing": [7,8], + }] +} \ No newline at end of file diff --git a/t/images/JVC.jpg b/t/images/JVC.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae86da113acbd693270cd349de59d31b9095ac41 GIT binary patch literal 1253 zcmai!O=wd=5XWcVrupb+UX8Y~g+4sI7K>%`Y#ug9)i!Et5lYb>3lXgbOb?QRf+rC? zc&WJvg3v?tEb6HgDUy?d$KnSF9t82&qnGD@b~hy0QYY-rZ)ay`-_GnN`W*d`zs}z+ zFB8qq9;YM`bx^l(C<CgY^;muhPFvmt_X<e@n%hy)ru8TAfaM+Vi1l&6fnEC@e8@3t z*<OAW(`&a7=tVt2A7I->Tb4xLUZG2i)BjrO;=+mIVqU4137SC+{<ek=lo~Inun>e^ zE-0J~3*#Zp-zl$DXD^cq@`|Vn{zvfRuOgDPgg&8}vqF^8eY@^Ei1X2@xl8xm^o})7 zkB&E{l#7fFBcDA+KgAS}Um+Z8F=+G>HstYRtYQ5TCujY0z-W&3KgrOu2c`zE5$(C< zO+Lz6f?`lA2$Wnib$t(e%<>LcJTX23b&1v5b>4o%o~SkJl(fu8OIc2X+iPauUHIRx zCFlZdf55bE_suCK)|+?5SvU12WJ6ls#);c3&w#~-@kbPjZJ79HVehndpcej?ELsN| z^L{nn&jwfGI$p7w?-cLYJgtMu_hWVhTS;rzMTKp8{%Xz(#*`w(9C&JcA_TLrkAvRP zIbWDK1#0GjJ>n$otB7ONcsXyePvhlmfm>gWa7@PPusfD<b+j~YcSD~pu2w4dyy~sh z%C(hJ`L<WCly2Veu9vE%$><wBq)a-U?adDN^$iF9kROcskg>@;%VhDKmf}Go4rjC8 zpy&7Z`=RgoVKE#X4Y6P<KXuTu=3KN*ZW8}9Nhywz;|l4Ds7`bC&DdkHiknx|V!{7U Y>xkLiV~M^}r$hl<>Czc`LqpM*zcsChHUIzs literal 0 HcmV?d00001 diff --git a/t/images/JVC2.jpg b/t/images/JVC2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4d2dc119d7cf69b97a929bf4dc687a10730fc7f GIT binary patch literal 947 zcmaKrOKTHR6vxlKH?KyknZBdNUb>i+mX?{ZiFS~PZK9@v*iwovQ~C-RS1nX<V<}o( z)xnh@Wa&;pD6YhXxbg#NUHJvNbm{oNbMKHqOAj2*@18lYxsUK?_=g`>cN*(Nwc0pk zh$u@J7^iN~3+P4gIoLPQ95@Zzg7z>$3|8qSmW=Fs@MXgv!DA+dgFWQ-!G4DJa-FOE zjhBfi_Xl_yjyrRc58bM)HR~H|MDxpYQcL`W=q@5v*VuZF<N3}t-<_78=ND)Et1k7@ z+g&}=Awu67{sJD|Z}%=3et>FpkfsET<GGGF(6fF=e8TV%n7!694D%;~Y&69&{K-J~ z`U_46x_%P1x(uuGSrhXQG0%cD<={)H4QQFZuH&#)drx^w?~58r#4OOu@PNvNpd4L+ z+R!ZYwB0z(htMegISQ<TKbZA$b<uY)%fiwl|90(um7@b!L(t;Pbx?a+xF|)!oN)@P z_#W(Hw)h^r0(ag6#`S*%@N>h%suUzX(b(RoY&V-v<<{nQbLC0B@mMz0t&pqrt$I29 zO?%Xr%jJ9Wg~7psXOGz4lnt3G7nPJNw<4*WC9FT6m&4K?8nR2av`dxJ#6$@Rv&Gr7 z(%Rp`uViKLYBGY261SMJSon?Z5mU#~DX9}4yr#|o#nuT=ctqy~4!{x?-K0-668`!R DAyIRZ literal 0 HcmV?d00001 diff --git a/t/images/JXL.jxl b/t/images/JXL.jxl new file mode 100644 index 0000000..26b9f41 --- /dev/null +++ b/t/images/JXL.jxl @@ -0,0 +1,2 @@ +ÿ +Ž<dummy jxl data> \ No newline at end of file diff --git a/t/images/Jpeg2000.j2c b/t/images/Jpeg2000.j2c new file mode 100644 index 0000000000000000000000000000000000000000..4e1113c82a4ddd153f93510e8d09ad3df3b16cce GIT binary patch literal 618 zcmezG|38pHp8*6opcu?yU|<2#APfb}?2L>M^goD!hk=QKhmn<qg@N&Z41=&jKtx0W zGWwswAjrVzotT}NQmR{KqGzOM_&<eF1SkaL`y^JT7U_ECrR7^G<m9Kv8&$ic=9DDr zx@h<YyK3r38^sx#X+ea1G?FSyQj0ZXYjqT0Y%T=_T?0J>9R&rTxvAO)M#uuj=mMtb z0_NxfmZ$=zdIsnMXttQ@nV_pMLl>|>6)=Mus%vBlWCERT26g)X2@G7|0DcJ!$;k}} QaQqe%1A;g7S^sYW0BQ%nEdT%j literal 0 HcmV?d00001 diff --git a/t/images/Jpeg2000.jp2 b/t/images/Jpeg2000.jp2 new file mode 100644 index 0000000000000000000000000000000000000000..708b8f059ba3b101c2804f1073b1ea74f44fa378 GIT binary patch literal 2028 zcmds2%WvaE7#}AoeW+PL>=p#58hIrID<$K+N-2)3$niFA6DOOvv|S-Z#+fGWwsw?E zn-p>2sUAQGi90tqf_g!F;a}i@gb-Yi_OK@od*l|rnK&iY7Ojvt;mOSRnBUBNugM^U z77uC|#~02P5JK1Y*=hHno5sMSkS2h3KwR=Vtsc;4M32tSO2D9}-Qch%I6fg2kB`09 z`PQF5%;mTAufP55m!H4+F>0E(&>UbF0T4wTEcz5533-l+PU)YOVgd_lbYn{Y{FMIX zDgCvN7Eu(iUqS!y<3;oo(C?vtcNRr20DTDk{49c&fG&-#29AG^)-Thsbk+FBo%_pq zdcAOe`ID`Mhqb~4BMD1q5Q=gCpoKINJ3qU@LEL@xiWd{~wVPI<xSGKPZ`&38Zs1d# zTD9KexZfb)?x;Gtg9sPHfD85tIXWvz<KL*xk3cbLCI&~3-bOd&!SVnN(8+@U1;~HU zE<<b8qR@<;pP)IT7P^L{E$5!oI!<Jg>CqR6mjOa|ku>`9_eXQFPv8G<zR|DX{RhLN zL#(dz@r3sJUf}2DR8o;K_1&Q5`R%;CZQo9;%IjKOH7kV;qp8=8f^AkU42%4JUhXi~ zT_a>L7$gt6w4DrkZF0~Z64-_SL>}YThJEi6c90Rsw4$WQZl&CCJM_p&cz&NbzDr?M z-&^YoWjSyiCM<ixQSqzhk0^6m4s%E<m(6Aq>Ey8AlC}7}x?xyGy->dJr)gTZt1vOI zPCRVdX2sCBg$ZRfp``3oZY`^<DN0gNl!USZoJuZ(VPEnO8>{4U{Iqx+uGZ)OCINcY zvJJ~_7LA5pH*5cgEa(N{hPLCiC@!A*&XMQhy5qMgZn)H^5a192p)FT+QF<avg<`R8 zG#c36s~LIOrhPVEfhYCCvkckfxTapM)Iwx~^(bYs_PT=0Uc19O!EqlBV^}2@(5qMK z9y^saz2o!_1IEC#C*T{*VN}*EI>38D@7`nhyJk(V77Z<xT}h=?G7*K<dUe~f>wDUE z10oReyf(#|;5JyOlBsy8cFD9huvyH@xojpSd{?ak)NjRc-=VC7U9g*}MCkZVwQ9rU z6*Ts>Zs@k)=G9#-w*uzuhT@)<UR_biUMTLEMZ2Ws-cZSy<JQirCBxh(*;)qFAuGHf zlWkQpb(~6sv9O_Pyan~lcOG+1o=i=5y6m_I<v>q7mtv9HR63JYiGYtme9hE7&}zNl zfVvC=WdXdIke=yj9<J~(9?-|`k+_Yh#~;hhZrk?u_l=>qpU^gI=}HCNf<NFnG$Xx; p;58Ai%BJ+v1z(q56>pq`A~5+TA5rv(A{2Qp)c^gkmBRIc{sr~U@k;;z literal 0 HcmV?d00001 diff --git a/t/images/Kodak.jpg b/t/images/Kodak.jpg new file mode 100644 index 0000000000000000000000000000000000000000..99db6229add2a3e611638a8eb57de881801302dc GIT binary patch literal 3375 zcmcgvYitx%6h1TC-L`9mZ7H;iH60L21u4_TmQr3_*cO_l4`?MVh;*S3Huiyi$RmbS zf&ro;tO+2|q=0B4gb*e83sZ?PMu|Z}f`TT{2x-KqD9EdF{mz}4-7ZvO|9Ge8erL~~ zdtUe4yHoL<xa`<dxGq>vR8m3{i71ZZl;Na;8wF}sT#_FHezTH9HlTusl+k3DJkbZr z6Jh?Sl4<I|f;u9iza>a9rv3>chqKUIQCZ?G)%;~XuV0&2R#NUQttR7>uj<+9x~?rP zD=X1_#q*0Ry$iK@-jc$_URWTyYT7Z-y=kxIUFqBOUYP%V>)1#nJBVVjDn|EY>pN^R zqh#c8dq<4Ls|h<5Lq}0<6jI1(cu}>GYS~mXLos2w9<qn!d7;=yrlB~Khk;Q10Nxqa zF9^NDzHINJMhm*E*s^uKONrR&QVl*H!FSmV-cbYIZdKC$%l?s;P5V##Q_Quf`~kzJ z!rOJg$V<VdS%cZ*pm`vtN7p_1dQQHct!3-^9#6g}j|P)L*U$Q(X(j?}eVE3WpV39+ z^!xl;acNPRxr>?&{Sv>!Q4@RCt~f`f&4vz!x)1d~LnH*z)Ix)%EGL?BfmD`ZDCCf6 zP3nkC+<BxtUm!(|^afC)TDCISxHXtCN_OS)mEZondF}eI*Z#QmLcM?W?rp0!wgfxg z+V*;|t-2vly<~Ce+~X%UR?RQ=c?)OE$T`>@n5=uAnYzHgeChiK3sT&plb@PD%{S}q zokde~rcEAQ=r1on(7pZD&b4(<*R-v92}d9jv+7Pa;$QUj;pZYxl#a|#-9$?4QCiq3 z)09(%3wZ~>6#YvsQG9*95U1yg{zKcT`55E@bn(TlR8)gHbaslr)3ESyESuCL*HU@` z4s(s<**;A?Z^Qw%n)l(RU)+DENJb?0gLQZ>$Z<b`OAC%?8C&u}Ql9*gl%1D_*fLIt ztM`OB+epf;pM}_Uh$ucqh`r0ON85>##>37^ELJxp@nYv!L|LcGz|nZ@8rvLD6Uxla z$zv~k_mH?J`sH(1+>y^+aaY_HcUqQ~`SQoh8RuD^1QOR{{<25ytMtHTj4=ZcXR!J? z(J%YPZhmI~A`K7LHpUR7<5JT<8tos^J?x8w`Oe4U7g;9$9siFNkuEbhM1#{JYi!gx zX7Thq97gkY#0@0ljm5=b-1InsgWvj&+Q_Z%XpFk`73+R-w5zJcQ<_<c1=2r}#F@U1 zrl$2;`|6ISmCb=*qZVumG}LLef%d>`(W}%Jl~*n1aIslxH%$Q+(mHCVI%=ji3Q`MD zqlMtwAeG~kRI8v>)Cx6L)TopKP-&zUv=aI2lnv4;7c?DrSvKYX<~)3soi1R)OC3;U z5C3VALav^cGl?e^s@d({*9kjSLo~w4MVx9>jL7TZUXH9G8yje<0=3~{1gHtc;MA=L z>GrCh7*&?Xj_5ug_ZXF2HGw6SpM8_~S_K`ZeRr1e0e(=%^;(B@NkIO74+z86g^Ax1 zjsR8QX`l^w2^a(H1KNQ%fDR!4#bQd8PEbQBQt1d##nS`iU+r^1{>A<QXb1KI9l#sF zSYRsW;8JNOklAB+<w$ZFJokG#WC@_??r1i<!{|vJsSn&rE4KoyqYqo#ho_xX2J&o^ z-z|J-mIhEetnpwuQ@JcXH|qv$K`m+EnxNBwPnz7}R^USX7W;tQa&5E*y&9nPY=+Vi zzrqOO9*K^9D4lKC;NR3pa~L_p!9zJijS6^bJwGFU;-^N=CeN|(4~!pOT8M~NP$fFG z1yR2!E5OTGXBa5rOOuDR1@$npkK~pLy&)gDUYcb!F27lZ8y7D+QOR)eDpv>FH2k&K zwY6*Bj@n?0=%og0IbU_*<@X0!{-BKeJ`=<}#^yPG<~0+!??!;<0Y~3jj#xMBDEom% z<1ZhSu_OBg^JNZv0f-&(<;hW(gE;vr5bj8-0r3W}260oa0kOUnkOn6lSPw`RjXLLW zgR?CwU@!PLGl<N)c};8G%fY&}Q8)8N+DyqVmpjQlAthykCnG(>la+yyH9LpLY@b&S z-=l^y((TsLw2ai$jNA+@BiENZX;Lm0%*~nmsAZAwL=Pq6pB0L;DPu`ZRBVZg_#7=c n@I@D?pdb%P$R&3|erryN4@txYO0eP9NVFx=9Qv5j#rOXJOuuFg literal 0 HcmV?d00001 diff --git a/t/images/KyoceraRaw.raw b/t/images/KyoceraRaw.raw new file mode 100644 index 0000000000000000000000000000000000000000..ea0472b442f8d8104b887bfec69cad9746f13961 GIT binary patch literal 166 zcmZQDH_$Uw&?`y}V_@)c4DodLbW!kQ00PG#S7-l7Zv_KmD-%O23qu7nLo0IwD^mjl zBcLoV5L*Co2oO6!G0+4sV1&{jc@8KWM5{sh=0KX!DM&#fEZE3G*TO*GSkDxy43n}c J&dV&Y0{|Lm5<LI_ literal 0 HcmV?d00001 diff --git a/t/images/LNK.lnk b/t/images/LNK.lnk new file mode 100755 index 0000000000000000000000000000000000000000..5c76a6e4d45f502d9b7051f193ee21756d0685ce GIT binary patch literal 876 zcmah|O=uHA6#mvm6a{HZ1Pg*eNNA7*8!FhQ2Wyj}pfof=QrUwc*`(_xyU|QEfgpQO z6c6IXTfkTlJctLulcIZ+_;YBFQcs>dsE76(znNs|O=tFd@6G$2_jdOZ04=zW6z~+q z@&|I42yI_IKN;_9nTPL=bm#gS#OAM0iN3bEy`VfbMfb=R<dA^0o=SQ-7wP=P<=o1h zL_D2O17|UY0Div@C)ZYIllzYa8EBvd6J-cE+*M2?1`AQdmBpaPaiTopvYtH02)U$v zf*2zrTYo-|lVfRKPdUYA&9FryRIp2-tRaMHR~mX|-K^><qhSfBt{W}0EF7mg9kZfw zqs3HFtTLmG0&3(TRyBDeDedWQQzx)aok_0(D#~7>B$QO3Z;4i+>;@*;iB8MEyNqB7 z^Ylw`21PVgeVaKN%;aaxGK)}oZB}j2JHva(8_GC?8jDs3b<A=;@(y9F5jCPjO&Ax5 z%S4uU3UkZOPSWD{>36w6|6xCV7Y=T+QiYH{RYrvvcMI1zZqB}!mviT8H!Z7OFAfi+ ziJdRrkJo{7Z#Nbn-92%m*E{;)`n~7hCtmL2@VD;D)Bo8&GY7xS-T~~g+Z`=~Dcq;z zuR{ppG!Kt8`E{Ma410IjSB*OP=4Pk^o^{3}U$rN58=ZqZEw+K~&y@D+&5MqRY%vn3 slTS%uw4_oZK?Fv+A#;a6hU=>TLsE+HJdd0L2I|3JASHrZswCn13oV|zb^rhX literal 0 HcmV?d00001 diff --git a/t/images/Lytro.lfp b/t/images/Lytro.lfp new file mode 100644 index 0000000000000000000000000000000000000000..cc5826b3c6fac639b8b4f957c9fa57f2bbd3af1d GIT binary patch literal 4400 zcmb_f%WmAr6?Kr6gyaXZYH%$P^?nGLg<lE=kYmAeHVI}?B#YgQ$!3GimShjS%4+^P zr>e+qN_H?aNZPQZs;;`vbI-l?%gy!epU?kt{^G@pKj8n1Uv947O>3<Fc)s5_dg(or zQWlk}7&WR?N{PyGS4r-S@r)JPDQ;~M1pLb9=kv2{*OcR7@Y(8Wh2>dR53chshrxXg zTmQt?S=gVyna_od&X2Bgqx<0Nu$@Ko2&WbGv?5+fUze5gPK(k|>PS&iO@uX-ky>OI zQ7Q}=ntM0;ci$6cEpgOHQ+uLy?T8|@ss*kSQJ1t*S~%%dL5{+j&aM43dlab+!!hqG zUg}b4QWx4fEv1v9stE*pBeH1D*JM?;b0G|)ANEU!@BOywhu8gf^xJXq#aUMNUEY2k zhdv+OdU*$7s@(ADI*1E5YS-@l<a!8UUmaREHvRVLi4>c&ujzOC6@P{wKZX0*ed8a# zo2T*fE~;7>wI3ZknSA?iUS#3a;HzNfI2?S`{Y<GVOW*n-T6|KT461z0Bz!r26J#V@ z)Y3>!N^S{biWeb$g3{8JtguQ}ip#oC%;=DZpU%%hBC>IF=!&gt+LOSbD!WHspk~fM z*13Q6Ls-!mnXcKUC5g-3(BC)VyldY8XyIJO2&I?AToMj_U(dg$LP5Q~KGoZw?tT}b zf2G#K*P-5y*=d{gX1s2ETZP1A5xGZ?9-3<0gcWBdd9m@~{FAMIXn@0*i?E-ZAN+3c z`{jN%xQAO;enMtrJg|I&Vr$wHPQe0?zP;{;&Mk1A4MFAIrm5p*v;*lZS_qph4f#!> zS0+dg>-9GqMYQj9VqPbRrF+@Krb*dJd^5=v#LB0FpX@|Q%bnv!k{x~qEWxbkV+cgE zU7yU)P}7auZv8%nBP*KqTqs2|?r;5Y8)6e3U<+wozjsZ!kTW)I!q#xH9<J8KMKQ}c z>~?;*@%4C=logR~LUBdoP^xW$Z1g=V%kIOv_}JeK>*9p{p#6;Jlu~J!mWl`_3=zsq zk-wz5<@m=e6Py^Wl|iRS!Mh|m)o2*jC@Q%kOc6rte39f_F-xShIHWi@oDgZ#O`0n~ zj3Hd$h+$M~&BakD)7olbsGwTmx)6p<Uy__?W0fY92_>P8N+uVkQYm3P(@H4Cl|}7O z3K=dc!!^fEi37M!Z16qQet?(jIu`;@azWAlAeq1b`~^cu@;7t4UE3rs`+3TL#Mdj= zx^3zI>Y5{c91)y@6f`w@3fYX~<ZHH0pq*A}k*D};84NpR^Tg_JA9wv8?e$gTBD|0y zgn=Ny3gNa|azSGfvbO1(@%eEw5n<);o6;ZaH7nbGQG(f*Lwoqxqy`hHja?FPN!dp# zt|+;ZGDr0P5fGQa26osl(e^FQQ=tDZ5Kp3-eIGJrbXq!aaligv5?Ick$3H)9Oi@2> z#5M53fs~knBtBJoGnSD;X^wFyd^DgRkZPq>{*tI;Kw1RkSjkzlt($E#e!g*CQAMB$ zo?9X~v=EKLLl0AI!dcyyuD$Wwb)sv4o+u%LHbX2^l5)klj?{dXed+t|ZuGmL%bIBu z5)S)$7bTipsQ-r6=M#}ac@SuUa7MW`7Il<PjlKi5xOsr%0;R(RlVAX=W*}#aQ!lGX zS*UTIB+Mp3%=^0D`^fZ{vk|jt&%T}R`p0IxJ?xtHbaNUNzohb{RB>%7M--^x5_W6; zv{JTJ-Lx39PSN+zDu(BV8LBjj1}p>~K^jk)+iwozlk1%?H*VYPyC5-3NPoZc+m~=5 zgz0tL?|mZXH0sVJ_vVnMnq)a40{ZX)V<O<76~?GqpzHTsJK}8LpBlz8D?ukPCKLsM zf)zoW0Q5I0o|6Y+KZ=|NvOW&0rzq}Sw`-q`@zWfCmOX}ZXb1$Yf=b{7xB^V!BR{q1 zIR2B|Vn_o;YqVGa+#6--#P5J}iWQS+B#4&+L_zSNpH$`G)o~&v@YqC<VYZuSsB2?! zrH+U0Ikn|%;~)RNZE6f7ANq%PakNXJ2xWS^sOs3vgfT!o12POTsOl+fLw_2Kf~$l8 zMH2W!Yed^bc?4u8xs|VdIiC9L)MxgnY=7;_alw^S@Y2PzECz`N>4Kvy4O%i1Hz9PM zJ0=hwt81!}lm(tkgpM<`JHg<IWJ20NPSLbU1G+}&y#PP6R!E#hw%FoS%mjm|Cm%{} zj7SK6Y)(@*L3>*ElEGtyyic>s=yubP=+~H--`79lt%G@T5uG4ya^X13&P6*<Jkd9j zGhhpJOMo%UxRnIdyY!3X63x)4K$9RX&>BaPM|0z`=W5E?)Je$yt_HdQ$j}zE5-+sj zh)BFCKBbV{glFBw>c?%Fr_hA(#d$EhCNyo;&Cor#^oq{z0SKqa#p*u%mE(_(o5Skb z7c0hBR9+EwCH3m|?&B)7>Wh`9q%KQ5Zk4GDUKO<!&U1meC$1gQ1W$c$FILdJ{{iy) z`r!w%e7H<+kEidK7ypj$m*4t^{*CXK=cCB;VIr;X@D_9_NaRrytKM>PEv0z%<}D4D Z2Rwc+>ic-_)cdlRj4(<GK>r<o{{uti*l7R& literal 0 HcmV?d00001 diff --git a/t/images/M2TS.mts b/t/images/M2TS.mts new file mode 100644 index 0000000000000000000000000000000000000000..7e416d215e723a9a0bd793825bce27ce7c36c25d GIT binary patch literal 1344 zcmZQzU|?`}U=Uzn*dWNja1h92d<Y~S$iGZ_p8S9C0|o|PR(D6B`<XUaGB5(&|AFxX z4=am@i*Hy53;+K=f22PMe&Ax|015n;cD8T)$N-Xebk;R)WMMI2VYvS9tJwg0lYt@h zs=I@{07Lx;$^ZXB?&nJ8II#W%*hvhG4GinHSeXu>`v_Uhz!108U4T(xJ1_+?X#CS9 zq<*l;GcYthbuSPEx}Na?kbQv5kb!ymQ9%ag;8ajv-~@S#Q9Xr0V=coQ_6C>Q2TBYK z%nVE*BK4vJ;|mW4TTZ+0Y+VfePC%aL_Z=c24H~Z;go_S<SZoZO*Pk#jgafeytA+Tx zo`fI1f;W4vaWE+G%u4fh3Gii?U{c@^k~CBnQz<z0<^TUeP!QEKFr>CT5D+wAc*q9i zGO~j#1R^$(29T+$9j(kl>gVQxT-UYL-9S(<{^9ihpTEwH>$YE5+3b>6?9P|I;mX6` zi5Xi;cA345EVpKVrBe~Pq4tVZ;>zGjxjed-XP73>^7vTP>>v`>66<9hS{Zii&6JYI z`gdNP{AEzKIArTx&dw0?S+#a|DmU?ez0&CTI&cy1l>;&hVp^wMmT$kZRbhviyLO%_ z%iku4)@-lRV>9~i<$YM;{j*;9n*A5OcCEitCf+``r!_g{XtC|1#W$jQu55bb7m&oQ zTvGbsC!>w{>B1WU@(i5Gt?q@O@`v#+3wL89hav-Wek*@tA$PghTnPo|e~LT{ek4o` zEeMVMyz13uwUD2@<);#zTfJs2-!lK=x}V-Z{4@8}{QUg<!b1DXbyhR-=i0XY{1txT z(siGwe_r^-+gEe#zWsT6B<HW?=dava_U%xV|D|i~se67*WcdH6znP6sZ_o57<@nbZ z)>;^Oa(k@U(APH6dZYF+{wZ%4Y-Z_RyQbxwsaiOj%ft52ZC4hkZ?0B&9oVRqa?<)# KTj{c`7aIT~f{VWZ literal 0 HcmV?d00001 diff --git a/t/images/MIE.mie b/t/images/MIE.mie new file mode 100644 index 0000000000000000000000000000000000000000..f30b391c3e52787a975fc1a5310a887ecc955d29 GIT binary patch literal 2055 zcma)7-A~(A6n7wnm=7&g+iBXDPNhzTjRiv~gJ`M>0YYd4SsW&{Xo@cJP3+e8jqGb6 zeYm2f+f=FQL-(?WJ?w3o)~RA$wRZiOw!S;zFWB?`h)p}!5TFm0YRUHT@%f#P-?{f( zk&OSR<#V$NUILE9wNj%_7Yegk{OHs^r=CBO8bMhdStJfM0>^2juGDL&=^4%E^0Ssh zYIOKYoz_G$uH-2vBH5*6(AFbjIvLL}n|USb)bX1K9#xd%1u>t9Wthu7;`5kT=}XLR z)R~VzGt8;WMDU6U=<90h^UR=m;s(SP`hj)Ha?qU;kF1kNlsTLD=BwTH#<GEB(8a)6 zrJg1bB|z<)W0k-^@DI_qnCk4v=}U?sYr05XU+CS5xm_gUy7BH1dT%06Hm0z!-MaP? zk!s65q<$yLFA5h&#8o=CypWsAUCbkgZ^+2@oaNGjwJ|!TX_pyuM6y>|@+|6d!Y$^C zl|-V*c4hQ(`M{mpyR`07Pd27tS~koRZ;dv@d{0c5Tt{fhV~<Wfi`aXWpB>k<k<l|_ zXT`i4(@o;lUF!Q0-@3^dx7^wR9}!K-gffFPIhc`v?$g*MDdwO;T%d$Q4T<-GxCU4p z3`TwTGzT;AI5;#V2K(RILwsCu%a`X@k8b{3dVjIkf5Nvm`xg6`PTl!wN!L0A^bfWT z4O*U=%~edeN?aGR=pQgg>J9-jT?&rn!8$eJS^zw7Q(~ZhrH!O^Ia>_BYi@>rG_N=B zK=>@&hUQn{z2+@wZlQX+xfMPQe~$FwgXWjvcK9TG9NvTG*Ueka>*4+8jXlt2crSb; zVK-4J{oM?=Q<&vP`?1_|X6p557y@ca?D!#Ub~*<>X$-;Zxd3Jxu*w?J%|21oEidac zfk96~K5#20HgB&T29sS_4SeiE11ct~`;w>+_7m{Svw9(*27?O2-3n`#;aO}5T!w7} zlT;`e<i$3Vs55O;)ho{x7bw(eumKKnYX~#~Sfidthv3Bz1Y~<CR0%GHI=0QgPh!he zV77gjRynt*rqp@0Ljm=KdQOe0Z=>|4dJdlxs5uo$lj^h@Q-)BNQm54S)GSJ>IuY4O z`Gk5wP2l@O^}KpALJX*rC`+%C`0tc@UU`Wui<fhy0`q;W5L35^M*+9Z8s#1XiiNwl zvM_a-akOwp+bLfm<%L4yPmO8!w12e6+TCye)*9L^?Y1VgOInBa1xgJ6-!1&68QN#4 zUD3Y5B|XreX}j=(a&ftJA6ida&sz_6wxIQJ=laf#o!cN^t%t4OTTfcghXDURYdx1{ z&sq;*_wmclCK~+OdbD!`yP@KKsy95VX7ay&gnbzf&j9E-mho_J(iyx*al@yzv+0pZ z7@0_)8BdRm2rY5+0&T1_&+unAtZIodTPabWD|i+NMB@mss*OGLSXvuRkB);j8KK8< zrX0fwRkK`TzbXLqq>HplJ?d7dZ*pEw4-c=eucs=^#tCeZ6doqSSE=V%d^q6MiImA5 z8wU310-t-hmi<8iiDNpe@^x(1l)+XhmdQBtaXrH)DGg`n(UQe&DszWip_GBTRgnW( zK<A0&;zb$R$Iuju<XB{id9~r)sn)4vDH9M+WGvpeAfs`dw$R;`VF4aajSO*#K`=t6 zj?<Se;q;SJ98a2@JoJ#I-P294<6iNL*=f`q!TjsY#qsE0%B*HQF{Q>MYu&m=6+<Zq z{f%Ui`bdJD?E}LVXAqsP$)VnU??zFTl8HpQ#Ij#@^1ZSll=!;_;pEfkJO<u21WP7{ e+m@4akr$b-5<h;()(=*zmVIE;r6`H+Wc+_B3Z#Gl literal 0 HcmV?d00001 diff --git a/t/images/MIFF.miff b/t/images/MIFF.miff new file mode 100644 index 0000000000000000000000000000000000000000..ddfd1f39155b17eda009500c65c102cf15295491 GIT binary patch literal 3750 zcmdT{O>7%Q6rNqDP3rzdfK;_L)rbnVMRNA1PHZn;m;4aL0fUvMYSja1y*shDv3Hl< zF}8C;y}${zIUx{LRBk<T1R(@m5J$KHr*ft0fde<-&FuPTgDGuqY~-Eqy?O7OH*em| zY#iIDw9N*onhnR=PFpQA42=~hAQoL_7~{4{DKS>fR!Gv8*Xp$0&?sOWcwOGw#HUT8 zklr96bW+E2jl9;&YZ!N2hlYml^hhhr`XtCYuGLKYfw$$fNY?SGW#sbOP_bC6sYW4J zNGddCp_o3B)=w3dD%Ghe#Ga2bB0?e(GvW?PS8zA*D8UZRh&6P$)^u8U%?#cl{fy|M zL)AWB4v5Wq^Jqp>l$@ez3mNemnt9c68zJ@FjQAExz2SldK?j#j*R;)ycpM38Moc52 zkP%O!nOAzw)~4sRm@u_TLNM+Dd1ZAKQ!as;Nj%Eud6cua#Rp%0{L8an?@G6oy?fzV z)|a{;^`SLr1^A0w?)L)kJI3Gqb@5$<c+XKTve}>E^2wx}`kl*%_#0kA<dx>K5OW;n z()lK(eyGbbff-Sl(VQ1FWIW;F9MUZJf;{jRsQLIaTw;Bo7hjHk@i=Edix6KaZu`to zj(iVtdHSzEp%nzgGK)~9@*-lSN6|4sM2z?@{Eh==llmNfv$6hLz)uM&9uN!alyHFK z9|50^@y~$I#WqkXNCjUO#;@?xV*Cf-mjEAu_An4VEk>No{=*w0It}d!&^zx<asC|O z-=K35cO6Rm*fM=q>}d7!dS$ipS{1E2E~z;^EvG2gJg*(EEE=|pwpS;(*7T?sHa#Eb z=M)6>IIk;tT~jf<b9r4+(O3neWzX*iPNPXNt6Xp%7B@t93Vm`TntK3oJ@@`7eksN_ zSfQKKd@&SFRZ=&jJnVq|RE$3WEZmB01jvDSE8@Jv^t;i*-vuo0M*7bHr(*r*fTv>o z4d4T@&G&$(ccXX?KnRCo%+@O%+x!4FXfKXURTN<_vS&8pUX*iI5vehJ>`oNJPvCnz z#`gfv-idruV1FXUj2?YD&DW0Ug%~q__Phyz<p&b0>aYrG5vv9L!h)VtC+b*DvJG_= zh?!qA_Wuqr&vV=k^aH#5u<zKIgBGEKC>7Tx+X{pF)gj11{Vo9>uU|oo^05wjF~;D^ zpEY<h{z1$3H*9Y=oHJR$%~@Vs?wP)<&M7h~UF`X$wM{6llZN9O(t|I)lCWbN(v|tD zQuUWf(^=aI$fcdvH?5s*t7uCX%jr^2@3s9lp(gINTW+ZL42hHLfSFpBFgKywhQx0Z zT^}5ncz!OImw+R%xAcvb)tCV!LyAM~cDr-k3;Y~Xi^Za>XtJhd!6F;>U268SZg>_L z(wK9skkAU?@_@aE&AQj2h9sqNOlw<1R=*QOXPa%wq($1qr6D9im4OQ5l5Oc$Kuqcd zOpK^6k+-=JNiC;5w%<xJn*ivzH5X#@lAPpX)b=RI5&dF|Cg@qrddqYhhSba2WXtTd zs8qhZxtdiM@VUCv$P(9fO!qt{uI1Up##gJg330@{JdS+>vsn1~5k77h|9<lPM+Bqc z*x+HOejPp~Mx!s8jYJa4?AA<B4ztg$*+fqy#0-48WAtn^>d+P$jrC{=XT#u1ZF3p> zjzv2GnK0&fiU)&4W@F{}XeH_oE`VXBCbsIZn{U{tR);!$*`%c51^u#Gk|$_cVUMXD z+Aj}2auW8eW1p?paVhXdpFauXxM!a||E4MrzpfG<QD4$w1tNzJF?ic$c9&%pEvqez zyNz2UeJ=+M*a7`=VcdM6gkyp4#>ZZWkgj|6$%`;JFT>5gPh>DVJ33;ZZ)yGEZuRT& zA;WET@ZTU?qq5w;1u#2Vd@~3M8_tl}mvkqv2w!}5Ht|Sx*K8A(aG)#6V=BlM*!=T& z8t#*QQ9NO~fTdb}_`KWg(Y&iweZ{jn?AWcWl%w0i_AJNNM+KU*tbDyNpU*B7Z6&L! zb|G6Ztz5QVpD$WPZA-C>W{F*1NwOziabVhDA5-DOrxBfCqp3tbdescJp?LW}LOiOZ zo|Wuy0R0N7U!qX#Z2skmpWNdV32U~T`=5zZjusN`RJdK`;S~+S@REo7!;rdgg$w`l F=WlBmflmMc literal 0 HcmV?d00001 diff --git a/t/images/MOI.moi b/t/images/MOI.moi new file mode 100644 index 0000000000000000000000000000000000000000..6c28db1fcca5b7b334409803fa8cae779a7118b2 GIT binary patch literal 320 zcmWGDV_;x(V86}EFKD&9fq_B(0Rtlg{QyfK$hw2vG_WyZ8qiSg-Y}5SNNh$1K`fR* y{A`iPr<BO6n8>4$$fJ_TtD49slgKNb$Rm@;4P?lG7`$?cJaUP=vWYzMU<LqQOA?;| literal 0 HcmV?d00001 diff --git a/t/images/MP3.mp3 b/t/images/MP3.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..9c0d91b122ac27b3c4b859d00bedffbb1147973c GIT binary patch literal 395 zcmZ{fF;BxV6od~DAW#u7z{KE<snDikLr7LqrG-|Fss|EdTA9XDTt~J8WZ*yWe;L3o zjO3<gz4P7o#>rqCURxhDe*kvTzrF!w{CA8nfAZtu&dHTm@I6ilID=TPkm&APUNKvU z?jrZ^Y#aj@xX)57wNhg3aGTUhHLQ|LR~vCh6amK=zRMTVx@07*^JRVD2w5RZHp<Pb zXh884=zz0Wt4dp8Kzst6Z%mh#rAFk=|79cTEQowS2UJMQRz}wq=y?e2A?o$~E%6LE zK&X-)GM@S9(+&T$3HgE3;`{5fB%YFVr3h#KD{h?hz%AnCqE;<C1eU>HTZ?D^2bDNZ AD*ylh literal 0 HcmV?d00001 diff --git a/t/images/MRC.mrc b/t/images/MRC.mrc new file mode 100644 index 0000000000000000000000000000000000000000..1795ee2fb7a8d47f91db139fbef6504058a08f9c GIT binary patch literal 2560 zcmZP&U|?VXVkRKP2E-@;NpADgJU0-A$Zv6CV1Qsopa4iOGf3jV7Z-*P8(bAkTwOt2 zWCPt?Jq_3RfkkOb_&NqCxVV6<XxL9vi$)C}4T0eh0^p3x!0;akHa-#W-qiinA;i(g zKUmkr)X>r#>_amXLrY|@hUDkwrxzs_WK=>#P4o;6^bGXOOpz63aX8M{`gDy9kFiU5 zo?(RsL%;!;v_-x31an#O{TB}2(OK2_cb`&iN%OZZCVQ;_-9jye*C_e+(6XPlAblWO zYT1S4S)McY>K;|);#&3-PXB<2gVn+80MX%31PY6_cJ71GAy7W7%<}L>R?WZ=?1;(- zse^!s+Ya&{{`0`N>_EnhyMYR;L+;tbXqX&T=mYWF5<tP=pk3c&&!vBGCBMpLdysQL z*vVJdEiorKKM&n1XmO1$4COmC)ZvhU7>iSqTnSjnz-V&Kp{+io^j{>%Hi4SyzcBTT z=e2NSml-{x?iCFF2Vfp4SXQ~~GBEu&91pwwo`&iFOnKhrNmGySgV94M{r9Ogfzp42 OmvQW9`iG?(TF?OKDdp_| literal 0 HcmV?d00001 diff --git a/t/images/MWG.jpg b/t/images/MWG.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b2ce4bf8de229b63b8057ea5c6085274a15c1bf GIT binary patch literal 2255 zcmbVOTW=dh6h6C7TPq-l(?DuisVk7YsAlg<T5oMfjomg@afy;hjSv!ScGvb2d)L@& z+0HY9H<adq=l%yCd4LDRZ{YIOAAtA?+cPukYeTt=XT5W7-#KUI%(3HN<LBJo{gK}Q zsMp~Z0Hh(!y#YL~Ht`9#bx7fxgRA)U4qTyYfUmiCr|WOI4-y@;;_gyg74^R3uP1yC z;2R%S65C(!4F|P{dq?v9<Jtqc>h+zT-;Mk*AQJc-AGBa^s;7qygXva!o*jj~yCUTq z%Y3v-p95UO_ljm1+Ifmbvw?sgKIIsn<5O^PPWdakX~M<RWUcFPagnSI1D;KAbWMB4 zu}tC^k#QKBrdxE1_^p!(@t@rBek+W^ek<&XrlP@}-CBKxWR1Hb;NI}S3;b<J>xF`$ z>6$L^MR-j!bR2o4HGwZf8lesH5%?V<BqNVB3bU~J<ly7S59w~y_Kzy^BX2wmdv1Rw zqdT%B+lRN8?2=s+_=#v{HWhsWZ&E9nqE-B8EbyPgb#`u)_fhEB<j@5EGgzDBA4YcM z3A_jEbIeLO2%;WhM6fZB8+OM%zuAfeew2jC9L^U-{QQd2ilVNiszG0|-SEUyoUo&g z?5?USnhM38QP*}(y+}Oqnto7{{`%oZN%Y;4^kl29)w>n1<?o&Kyu-7{N6y))Q*fo7 z@@jEpjXK?q7un*d(+>L9s3cKv3)h6LN+MN>PD@g)V>dm^B3I=o4BO&urEo_=jGo)D z4yq3l1f)t*66$a`REDM!_L?dlctO<+)i7k#ko)5xvPW{ze;*N6MT#+(uShWMlW-7~ zBxzMlpj~H*+#U4V6xVfBukCfbAnM~r=qkdAV$pRhhg}mwGWbL9OG+@R?U!d2aa`Y* zlT$CM#5GEZ-J&Y3kiS!9c8QOox)=b7$DLjASxooZ(SjqAsMWTEW=R^!uGg>!?MPyQ z%Ea^B7A*wIhy;y#UvftxphedIug+Nk)3hgr`VX#Weu&rp;N%O>VQJE1-nE+xIhUyi zdZUS#$%S5UGCc^YJ3WX?b(vw}h3>^H1SXr?#eZLX-AP}Y*5JZLoQmmnWK}rjS)_Nc zJn1nKvZyYJN!`v^Rcs)%Bt5r`cgK`99p{l|vR12@v|(DBHjguJgqMnz^8ZQ}o5JO3 zPWlZ?5Y?=D==zN@@m$6hjd7Am;xx%rOw-IGLE>D}CixQ90d~-!SvHwMLR}g?O9)#H zHXU`^xsaIlJ}<zAH^j~s{{dgY#@bqTJu7W)N=EKx&QNkVl=2oC<?1~;s;?T{TiL8A zh`Ad#a@#pEw_V-N=eN;dcWd`mW;0p*6J+qu1f)~kd%$P7RECRxhDX4W-}d=&^(79h aE$cw$B~JW1yq@9^IhBDO_#SS?zr6scR#*@K literal 0 HcmV?d00001 diff --git a/t/images/MXF.mxf b/t/images/MXF.mxf new file mode 100644 index 0000000000000000000000000000000000000000..e848a8fe79b5f7ff6505d0c10f709044624a2b8d GIT binary patch literal 7510 zcmeHM3v82B6h8O<eQhx4HpW;WqX`BE2y_Yq(!a9IZY!JRod`-m*oNZ9(}29DB#W=0 z0htek%@7<cf{s^)7>5vp=+qd38UjIr&Y7SyMB;)dsOQ}F{_B73+D-wDuG`<Pr}v)k zyWc(M{P%RWUc*OoD`QEFGyH`rfQNtq2f*j3kEG;IK4v!bX<;FsOt_&ZXUNWzn8vt` z1HCt}t%R+u!ExDmrEuW|op6giNQ845PZm2zt{OTt#@HCM*b)Ge!z~)kOEzZV7>$;d zVvMnKBw_(bGh3`^F=knCA>4)*Eria<f<qv~m__JFA2N(t!h&E!!pGQ%k6T)ha8Mez zMXrlxF`VVLg)COIXoTf4JR@f(N6sF}htn+FIPh4dA5>Q`^hiHqjE!bFLSqQr!W?Kx zkXVd!)D$g=VHT(G+{0u+hPqq@x4P^UHlP~}$wJcW#=6Kt`sfB9u?j@f?IF*?Pa>l0 zlA*AWWV&Q1ENB2-GQ?m=qb&um<YTdLO~ZwPSMnhXZ8CVJVpg({_FjpO7L<d=NGuv7 zl=n(3vd}_df}CYxnuR8TPofhar?5z@pz^qdK0^($cCr}zMHY(ZLg^>Cr)cpT7G@7d zi(jsbqebxXo3J=C@*7yV$6`;54L?@5g#rqS4L^vk(J0ypKAp0b9;2ud?9vm#xzyGY z2&C;TsBbE{`oQWLxgHJ<``Mm-pjXy7j}<uM9vk#Smn4q!<<SFkn|d7x94@P!k$3(3 z!=A*B&j^9iN#?(&2Vew>hts2hv+c_*+nyeLU*MUG>rY>8+ED39Flt7yKA{922RLh; zug~niym4~Ff`Qem2DcwHGj|j7Hl0CVn1Z!zAyj}1{4fue!%8TF)j9_!<ijfbWC6^8 zCHPaJTObdA=D{O4q7=t3fyMY7fSFJL_u$C+_%0hpf*Y@F$igcJhQbJ#hT|*n5;Ju> zBnlN6A~4+ncPJjR&^PgT6g`svAj&Ejhu-GmH5!KMwhnbkeN|5#HOZ>H)*kq%t?)qZ z@vF;@`!<``-;dTmJA)xh5Ow@ddQCoaVtDH19R;scX1%}hn?ZFMykn2N>D$Z3xY7d$ z7ta|m>xcZa#6jH`GhPnit@AN(*%C#4#^~X$R0QAGT;A_o{%sR?Py1x;YFE}3pS5Fc zK1<l&S_jvvVS&`fK6`Q-PJD6l(3oWn^IN7nlK5jqwH5H|$tz>V5})Y%?;$=*{Tv41 z?k<EyxH~1NbSb{N(6StNpajbO77)2xjL{qnLCgsz{$}`|`I-2f`7thsH1A8uUN^C* z>cEk<J;!$SCk`r4vnIWX!xT(UdC#MJk4RvSc)y1pPS&COwI4^!S=SiwJ^PD3^3n%K z9fYCcnlbtiMlseu4lGT>xJwJt7pn<}Ay=yVNYu>kg^UlQjD2A`%C`aomJ*|@0&)`2 zVcj~l>EjD|b?4jDE@-t4#7Ny(GkQb;aZwo2od~#b>XCPLWd2rEUATAlqHn)mK^Q8o z86%kltO)m)93hAcuN7Z>u(jBKbnfN$l9ck6WG(`Or-Z3ZSSr4vu;6aSA4~X~A|;NB z8BgL=udV;N?$a}cJ6x@m=`Ei(&#Eo^ZbSXulj=Y74SW9n>P+IOCVn9XX!&^mTW?qG zpH#E?de+93)-*H68=p+4c7Av;wfXd<*WP`vwe8ZH<HSqlZsrg%7NRCo_U_E8sc*FA z)|`LIS1_t^KVhi2W{fT+lj>gCYC+BHKAvRii?{O_)kq}M`AsfQ&)f4Sz8K&qs-GPG z3@uLGY%_X90i!09_C(IUWUV@{s%F!`()w8o2t&m+V?<6SSy?-K4J8wv$vdhrVX63v z!V!|mPsvp74y)i^jeKSvLu}^78i~ifU`h7|OS{9HNTt)8K-SD-Zi`W@jRT6?7R+^` z6g^J{5q$2DIO@lQ5DW6D-fT%yi~>CDXpF+)sgQ0$YT2aWnG>;;CM{{FSz`IVw>a#X zKMTGipMSAQdlfz0iB}4CM#LEJ_jJUk`{@6uZIf%KMou&#-Hn`#gziR8=7ng^wST;k zJ4DqcN+UPkXylBhL2W!L?#(%SYR}_EH5aru)6aSD>Tc}9TEkn?*!^c3+wl~QYCKV6 zyXCp<TjyKX7jL^%*ZkEBKUInQp7E7LcVmn9{eMGaTdEw#jI(&~WI<odcCE3+`)7>3 z7w7Z2QJP%|O`#P}vl|;So-;e4#&c#@8&P5zM+2-1ZJgQVYQu$A8&JYfabvGqoa5Ic zknyd^&2EZgbLwuCyU-}BF%va8)lQaTMs1X1?@yPKQ-zFFOJYODlbkoXp;m>Cnw)Aw zOG2v+b?j9~PEJ`2I(z*)O?GTfqVe8v3mb2DSZ#_;@5VLe#(yfYAmWX90Lo3@6e|zW Hc)R}qra<9* literal 0 HcmV?d00001 diff --git a/t/images/MacOS.macos b/t/images/MacOS.macos new file mode 100755 index 0000000000000000000000000000000000000000..9bd0f42ae611360a10768b29d5cff8c02f508d73 GIT binary patch literal 4096 zcmeHKPe>F|82@%R$wXySDo|SnbHgHb*A=Z?qeKxTCEZ<7FKusk-tJC2GjE)Eo9VHm z9fDGVpde7_Vp!0rP92g!5d!HV9U?DXih{7Bw(qrnEHS)xn2(wF=bP{Md*Ana@9+l7 z4(<gfzyL`|7b4QAR50O#efS0esu!`xdG%WWhX==bt0)e(_g&FwICSS_u7KD?)cm%X za`d4e4&akunvWQUN`2#5ViKJzI>k@UDs0>Ubz9$6V)3j+Wtnh#WH6HFbRNdO4dB>T zoJKjp7}Aj$=;`BB>tPeR%7{$m9z+W6FgA$y{u?urrY7w*nP!Q2k^dOL$(`f-Nt~)N z#+10x9#^v&E1MYSaymmMjHzr!nM5#h{KTdPz{AXxk6u-hoH5l`N;OI?9wjNTcmTkK zbwejW^UmvuntByore-(OG^%sK@9M{92%u>POspWputiN=#Ddm9;8ZZwmLzhJ1ZgNj zlEhR(zT*oqLACy4?)T=#4OPK>0{0!QUC$pbzCQHWRbJS2heHISiF5L&)oy`e?xr;7 zhSlNsm+Hmh{Txg6TSOCEe%VOvO4;(Ma@o0m=-J@Sv$=C$PhUB|@^QLxwzBSxcWrI@ zdtmX==h=Dh(u{ZheYJ0OGxDzU>5F@}o-}+b+XyW*u1qai*N$GC@qV~|clpMvjWg>T zmu~mfbbo0cd=Tbo#ggzLlE_KoBvs5l=5}{Ud5t9$REUgcR#>U>q5^q0Kz$KA=Wx3A z42P*)(LU0hwK&sSM#reCvWbeef+JX7Ra@VbN0tc7icE$6#J0ITwH2@xuobWsuobWs zuobWsuobWs*j)i}Q7>KAJyCJzH>t(4W`asdW@aQs=Xk$Ym`+r6Qc`J>OL3Lx8T=RC So&Eoh_`Cj6z762X<$eLKiUZ~V literal 0 HcmV?d00001 diff --git a/t/images/Matroska.mkv b/t/images/Matroska.mkv new file mode 100644 index 0000000000000000000000000000000000000000..1fcf6432f9a45ff522962de269287032234df389 GIT binary patch literal 507 zcmb1gy}x*}Q&UH7Vo6bcadx6pdn2P$Ya^pXa6>vH0|Nu2z(0LK-`OPxe0TQ*uWk|b zT$vWUrb&Pq!W9cymkr{s@ZH@9lm#gaUem%T@UsmfAQQYBC=V3){uQLtVZPS&jm`W{ z4!#YGb25`slX7zu$_(_(^(+*$6@UUTM}Pz^^bErtPvvHp<)#*;rz(^g>6z#mC}^m= zmF6bpWagzSgyfee7Nry`xF#2uBo<eyYbqp_X6BSA<mV~4q$VpU7%LbV7+5G6npqhc zS(zBRbhda1DloVtb};{rDOb$D!BD(pLRd}OyCS>IzlA*nO?+1_o(S@f!}E0x6RtNh z79VX{n5oI%+{n1Ik+GwZF?3ZU!<<Hj+~<vq%7*?e_6-aSq3;?Q+WN!deFI$GP4qp3 z{q-HgoL4n6CNEman8G0U{~?29I*?vt@`UMt=RyVsW(Hu8GBX(Qi|Gn6GO%X6@6_p5 ze%#!`loZ9Fv~^B%X<o{MsT-P@4(w`Ta+uY~5VE0(nIQzkS$FArBNNa?4<)R>G&eFK pyND6!A_f!}bvlAwr0-)4bPLFQ#ym5a`42m{wzyk2FwAdc0sw+4x{?3@ literal 0 HcmV?d00001 diff --git a/t/images/Minolta.jpg b/t/images/Minolta.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1dbc6f32c98926e6482e1c58f0546bc152746f61 GIT binary patch literal 13501 zcmeHO4_K7Nx_{@}Z($)icOf#hf8P=)S}AI3r$73EsF;!*1t}HRKPmnLD#a}k_QTM~ zV<+=inrUL8nPrq#WE@!PT9&4s{6`7PcTR<*1ba^go37u^{mrtNr_(vlxzD}b=REhh z1HYY_ciwsDop;`u`F6fp{yG2ipxTj-%$q}$no50%$U+h9S0n{eL@%&^3#6lv-_ERo zbU4!QvM4ekX80r4lgxoM(Fg3>OX&kFKF9-UY`~?uN7=wYIvRBvq^o|E^Y}cHJLRzM z`?gUi((%B55Dn^;JYtkGpkD%|&dbePxOj##BCp>q%DBZ3^rPf?sfnXUDnsXil~Mp` z)EQ5j{cu0jNyw*x2?+!5NEmWQ!T@E!z&i#Fy<^}|N_%)-?&2}2lrV5`0&2*p*A0J? zs2=DRF_9#)E#KJHCu!&M&6m=<OJjcQUuo}P`T?Rf6wqBx7&tItjj5}z(tB&<OX<T; zvrZl+nP{zvgiX<!^yOOlQu^##^QE@FTN@gb4@<AL1k<RrHY}L7A{~B-|H9hn03G%; zNo$vhw)%G<9bVR@+kk|GG8U|hmdm6r+lNz`sVg0-m6^NJgDmBj@s~@%y3nEAbXi*N z(qRyln}hV1!4q;BPgh?=-OKt?-qjaD55J5*BA6Cl*%`#hyan72g#X;={u~XwV+B7T zf{1VGjQgew^P6f-wM?a2%z>blQpcqypl#uae}eTMB&$f@@-^HgjTDh)tB3~NMrzPX zv1?XSX_v(Yo~9?d($w=;oigFk18X4f?}Z=xNF@AnAt2(e5Ym+h#^CQW4Wj=j@}WmV z7)8Wgi)3uDTtvcJ3L<A`l1)cm%-+r!j08fLTzJf11;Nu5po^I3rdsjQMZ7E)?Ep8b zh^-X}h&do;I!dlyOYGUzB&DtJ^P+05>&F80;0Nd2V{qO|l=}?P*$85@XBo~B{-qb3 zb(iybc%7%Z!hl?R9?=%q@}m;oh}xXDU(Tm<r{B}=H;7hYjGj3~^t^ML{Xzrxa-q|u zp!+;t7w0;Kt1#eIZ<5>^24z)?EF}k+%o!PE+A~NkrZke^8p3ZZ(>pC@VzH!YX`l$Z zT?t&P7RM}CNK=p&LD)5%BH<y-d=JvXmjeD}(MYx=M$Je5QaG#oU52g~ULqjD4c+7U zN#FQI!!Xc648zxGx(|^1BYuu{xx~OKBnZOS1km3=uY~?0AaA;W7=vx<PBf+)(QTg) z-F-7r(g32-Em&aR1f~!T`y6!i>yBx}PG3P%Pa8@1N0Ic~+eq3zjHKNuB)#b-skVe9 zJ()~V4P@$9NT!7EiG^Gp06npX==bp7vJZ&ft|Z!DMfAtJFs`$SDkl+bolBIxkth%T zvUmqk5o}$mV!c~Rv=O>(g<h|JhRsLRizI4VPm=kg0O<QlVxd^uZ=6nS;1OcCZz6V^ zpV(xDSY{ltJK!_9Xy>6ZL=Rs<<Ty&SWE9b|4MfGa5v>d-dK|moZ|^30@?Na%M}&cX zxv&ZSc)XnG{ux9W4-=(-OmrW7cy0#KgRu4dlSET77Ac<*TXzky%?-qM9w+wJPGWn% zA@-4z*r9I3j#m-W;l>`6{V)`xeC;o%vyeOpcHguL<Ab>9Iihu|iFRC%F&s^F8td2D zM~IG}C))KmnXhdmv-~c}-xQF1Vgbo@6(pZqO6KnIWWKWxna9MDIe8?R?Z?Rc>daqO zZ^FExiva9S(2orTN&z>f2KvHa^T4_Zy6Ih@3G-|Sa4Ud5$?#bj^~@1KDu7+djPVM& zAN6+!fu&!145&qY*u-=PkcoPh&b0Im+ISPd*ot-;)+Y($B_#pB0kF<VPXd@5(th9o zc(x#(gV>80vI253kK}`Be;i`;Nsa^k4=9IUOFe-B0DN7-x*@#+bfCN+Pz1Dse+rO; zr2uP`1iOg7OGAOzP>%UwmQW7;%<xUQ5j5Dsf;nixoC&)USPX0e_5x=B^ea3DZ~#~% z!=FQ)3#bcw$e;)8cn@OiUow1MUI}ajUI#t^b^$K|s3$)KtN;pthk$G#3z!H%H+lFk zD_iVqDf5XAZYP#j2VX(RfggzQwOHd3lF*NTRDNl_g&hO?B4h^QuDlR(dB8Ya9!y`L zkEaBD20xEJ+kqtH>)O2Bbs49SOMx8`AA+wdEn*ba24icd41#|Y+Z3~=5xe*@vGx5m zI{qS~)O9l37f<r4$yS;-j-=REG>Sc-sVl-1iXnx{;XA8(5{-hK+ex*Cr6?>)gG`LI zq*AgZ#&#cg%tTQ~%@jWwQ|cC?zW2jtuC`LF0v{`mCEFf}`fkHBUn$m*HCC-ONs?tr z*34-dm18emx>Ax8z-sQB#Cn!U%=|2|*hyAqOQf&~w@8UIlNBa^Nu~GAiDB{4DjUQ! zc3&8=<hy9=l5}EyupTbYAofU-!W5YjN53O6TMDuCzA}|!j;^^wv&yw3M<i2>YQx@w zwqlY<h1OP8jwmIi<Sw>?6eX0F$5@mki;a@{-bMFV(C7Os*v(7uh=UGC$@F7@O)%ap zT4olBge(!FmUqU|s?HdXNm}4(AO$=KR*588(2~2#MI4Xnv2vGiM#ad>iY$nVL{?Fd zqC)3R8L%x$ok@i>=ztJu!IP`TAehDw(}XjlriBtAiSVc>K1n7;Q&7<PEe}#f7c|fr zX=;k-O(3XX!CxRmOC=De(Y8P*Af_~S6@{pZY$>)dEN>PqMYWWeP(xEy%ljHCsgb1M z;fkS#Y^~L_I8C!8D)(!}Xp3R*#hRMFml6lWsM?5dV&gDQDVYCBXeeSNvDj`BTe(qT zqsmd^4VBF=lUaH>F`I>K$=DMK&lJgXEsR0@{1@?j03Up8j6xHl;-%}MVDzJ8xo;~e zbLU&BdklOL&8p~Y{BJBY*o=%BBd~#_=gOmK-G(*Fz{wh^NfzznSFD!r`bIHnv6acU zV2g+)_H;~f;wRy<Z3BENM%HX4DvW{l=R81c<4g+M8m<<viYBRi0<l{7;ku|&_WqOD ztCtfi`xt$CfL0`Lm!zJz$Pp`H26?5byh`z~%nm$!s%i*Hsx_XTCT)4Tf+x=s47p4x z7S&Qq^CGT$f;9MVI-}*u3auPKX>v(mQ1D?b10&hGvVk}Ry@zio7*>>FG!-N<w8CFd z10T!9h7=fQhLI2@A_!)r<rtOJK)E0Q*q9JhbR&>}6r|OFFnlP22tpvRctld*5mV$9 z@qwWdvnJ3Sq$w1Sv>>ZgCR9=a84cB9LDT}ym?mhJV$3R$h!8YU$wE<@e4PTV;%`zT zr0~Zy$zqZ;$xO-js1ThLw<88@@&oHcJ1Lr`MJpqdNfon4A#fy6Su*UN6h`uuH<L8o zM`fe-S=HSWWZIT4(c@_3cC1-z-yp5HSh6IFy}lPwqK#y=3Hw|hQo669$R4Z75*1Jl znqd-BKx++62ZM^{G@(jY(5O}zLJQ;-`XfnD2|-av=oLs$Kwgz((iD<Q0<6*uO%anl zu6r6?9ivjOnO3sR97DEUSVv1}r0sc_uhbGBUq))5r&a3H-C|WDtaA5JGHte`#l*&k zhy12QhKiyEG0Wwi(h8=?G!91;8uFO9N=Y}wDs*8n5waW~TheEpgehw!c9XOQ^H(A1 zCTYjB@f15^hrFURELIT$JA<Zbfh9<R9TbpMKtn?evFMwOSTLg;?W^L%g!-r?+Yk$$ zphZLqJ}*h(NLacASQITB0tB<!f@LizL&z2V*@{STYoe7vn+y^_5`y8_Xjf)tu;Lqu zjly7AVxX~rl0q8hhnheZQH5kFNmL7j6!EE&x*X&H0c)>lfnmLi#4PCk%v?%KQDLMg zvVd6~HFivlEK`)(rjV*dVPDa%Ae&hJqzJ5eSmjj}-`!-(Z%9f~Ng;$kU_X7zrLiXx z;q-SC%i2JRW*f1jtCYm6dxo<~_zoSa$hPpFRIIEaTdYL3@+L(od4p`LpiWY98I^x# zA*?Uz+CHRxjO{{R9v*4ApO}2TmBoA@Q?e<UK|1U8C5zi>?jANWERB7bY>iYCB=h7D z3sWa*EGb4~JzjzQ1WH`Ek+Im{k<GFZ>z-znmfvFu+hL=~+A?Bm)1%p{axHOX9}0U; zv9O4-6uD{#_LKyPJ%)8|Wt^P27WKA|wp#XWP}pu2d$C3=yl*spG8m7tbI5dctcA3) zI1EByj9@v~UDax%rL9To07hYHgzw%`6d1Jb&xI=^z^JW~!k7#<OT%{~F+@p3`y|A{ z08<1EstBo+rgd6ZIGh@w2x<Zm#*!>5lLMY269i!C46q0Ra1uoL$7TZ6tV)0+>JSU~ z31UsQYLu`>@F1ud4)~<dluD4dN*YF7h(J)pRw~YotU?>H;u6J(kIwQaH4w86f}&a! zC}jaO<Pedf;sXx|3Zl-&L?Rg0;K?c(t7*J77Be&qRI3`p@LinJViZci^P$Jd^V_(~ zr61AtdMD52OWoYlHpgdpxz9Vi#^6O4YB<RYCR2z?smn$*_C56C_>T2Hy(ZtC^}W4! zuE!YfK3Q0B%AWO<VHDIXt1qZ}egl8+_00A;{@m^E{;QI`^QyT=Kl#0Hv(taZn7UtI zQrEGG^Nwgo<HX8cN4z_C^2#lRhnli8FLoHt2w%-Gey(csi2`><s?Tjd+1&Kb#fdK8 z_`1EW19hiPHfCnDAKicS<;{M>_qy@vZC}>;EAl+<L(9B1{vnkotMx_AK41MdPeaYu zuGFLL?wysN)>pL`oa@=X%oy)|&*j?FIA!F%{;fyTpU;`(;H}w<+S_M&pKo;(bbOmM ztD`!@yFGu7_r1Kaj+Xa$VT11CO*k4_>NINfgC6d7`MkQF>v`P6^*Wc|@9EIFoAUyf z{~b?7lh4^`xb56$cNtrJg{>ZMyVGe*<7Aro4Vi!UW!nkEea8KD)#UV?Z`(XSOn!}@ z_I$f=-TwZY4-d-mx%}f>DjVB3ZRDQT{hkayXOxQ@&%S-O=(+JHs)tX0{_rtZqr=Ew ze?#wvY-dY`zlA3@abD5%f>Yn=Ha<Q4C~q*b^*YZJcTYRmc(LuSmkZAn_?>o_%MtzP zv(xS$*KPg48wc9+zwEtqX#SA8kxRyBM%V4{opr8F=czRp&*oNm>;;}?qt$iXWB2PF zqa99uh*!O}@71XX+x4~u(e8VeygX+oZ>_s=;gv=@-{a!W*wn>qmrPmWI5&HlH{Vg< zm^h`mZsberC*J0Wn>5-v%vsgQJ(+%oz993QdowTOyz*n8x22i;^g8aXsp3r)d3;e# zJ@-wk@_g~^1sM7aZ*AuuPs3L@dgFd?yYA_5`bgGrLY9%yyl`7%&G&;Habw-?wiET= zzSi5Fweq+-b(%Y~(b?{N$6w&9ab#Bcro=7S*_vl}R-AC=@nQB`vbT9ZbY09G{mBDU zTwmy}ozBto&$c-9Q+Dq=yL+{{?(k*0TKL@=c6VM)&G8)XX8o%RenW3O^~ko_r+;r0 zx)*+-d$Vq<s%m(fpFZ(@_UE3vUDG^9%j-q@)O_cm&AaBL9{uF(zD52H{hjeuO;vj< zF7A4#z9c8pb1^HU@%YpeX9l+{_(K-w*R<!Hc=h*9#t%*39O-!5a4$L0GC%Wc*S19& z1-l)Kr=FbU;Es%fjKW3rp6@a?Rc+^<iX{bZ&w7}`;8})?^JbUs%c{}2y``?Xy~gV* zD5%qy=G7a2zL__0Kfh4VxyxU}3vaFFnJ;j?8K;2=I?t~67<z%hFSLH5x3|{0+b?pX zx}wN%PS&}v+3Dqlm3E)*(7j(2>6ol`z0Jiv-|Jo@w^i@Rdyl(^a^J<OF}xm)aDSW2 z;fL2(diX)zsK4Om&OD!v!$|IIt@aeP`}9`sY_yAZ&$+o?y@j`U{@us1rY!Jf>5Ke@ z)h>@8GV6;xzG==vSG&{eEc9>#?#|n}vw>&pyf1HY>yvTF>96q@pvgKM+j8eYZg{H; zJlxl!yYjpX{OGI`^`1J*ooIZQzfq{y=Hni_&uMV4({-q-x%z`T&LKHd=lsMukKy(n z;vHU(*X#05@)UZx-MQJzcR4&d?`Vf-`sZ^8ugNX&yPVD%pYG=s&xr5FHv$oj2l~3^ zw|(j^nb@}bhi?9c17~hN^!WALcAY;s!QH&8;B?zp!`s?(41dEu@1XtMea>jeHx?Mj zn*PwQ>Z0ob{<d+{`ImR+J~!5%p51Y#!v6Asw}*P2!<+0we3kcJnAB2m$~czYI@?u{ zy*S_blrwkKA?KY39X*X{=d+rf?nzi%jvvYR?8rq|)p=Lue&5BVCyy`7FK|6FxlXUR zzrxLP8)1chZjU`bRd?B&xslbre{xYacW1q;FCG8Bx3ICupS``sKGpqJ&M9x9_vFx7 zInI%D1{L~>xv_siVSWDOjw#n<^5-9(eZIh5Q=!AWu%-UGpZn{1k=@{aXVo#6UFTTU zJiLt?K97&{QRDe}p5=8p_gvsby3x{7!wmx__a4DvbcNw;!`Vz=*SmS|Yi&dOefV9= zK3?hEKlN<G4RgKghdi0H!0X|kJ8yCSaa~Qz`LBoi^aIbh{NH?GwD$kK+bDYKn7;4C z@M_0;gCF@kKX=)|!s`!xP+!;9_QJH@CyZy>&Rl=NeXmj7e5$$i?3U5?z226*k6!Te z`T2U&S4;HY?P{xhGQXwuHGkr{EyiHypJ(0dKgC<Q-;eWt*DPb$iybxI3t80;*WKs* z$Br8%M@kkPc8|Zc{LPNGUf+a{J34>rsiF!;(TI5yJDzMk?X9y9{c7^T8~yIw>Oa5N zJGQcU$SCLR%=D=bWzHI!H*&T!d&&BoX-CdX$$EBHT^o0{AM$d;S=j2YG`xidrW&SI zO|Rw!ej|@J<-WvUcG<JsRhU18+}C#N5nkajyfx?H%~f7ZA+8JG$2*A5ojv5LgY8p) z+d5}b^~QrmC94~J{_9+mu5I*8Xls7qn$1OXPNY|@EAr&GxyOC6d2+MA)i^v%FYp^~ zKY!S>r|{0+{MfRV?{v3+``fR$y;+B+oE_Q7?=12(8d+O>&LtPCi^h1GTKwM@O=)U$ zRo(yHSmXM^OY{Y2TOZ9o;?Mdp@66Pya|Nk-{Ac|=`3tkRAM7Zs-tWode3{+t)Eirh z9K20GQuvjtKEL|>Ct1cqe^K7a?f&=d6-IU4r0eqx<3|1C2}QoV8>+MJ-Q{b=6Ts-^ zOvkKcOT5$0)!U7Xw#9Ld@eW7Ept0li#Y-P>OuZ8}$jij@h?^htwjD|J>Ba?TrEXy9 z!6y5KcPZ@C>U18-a`8n591<gnarHRse7vHlgV*a_&oB2jztxyJ(!1yXpI`oK&oA)1 zp9>m@{}uEGzYP!%wg1ZaX`h77H~lw(>OUJ8sQ)Z}R=~d?@u&UypHOimga~v6k?tSN zh%=Rc2BOXl!8-rSkvPt{9GzbR|CKfVKd+m7Gv1?|2KED6fNh<iI85KIIO9V;vK+?@ zLAos%GX>=$9Y-_*d?qvU__{9Yi+X0zZ;FNaP&ZPPt-!e<XrfM}h`WG115a1G0hz)4 zeWEM~Q7!?G0YayzyXvd}j|SPG30+K}2kIaeM`8haD2o#1L8QEhlLe&NcA_<E=k*0} z)4=KI=Um7~x(q0n2rqLmJykrOq=2B{g#)5BB{*hapy4Fr@7XWWOmvlK?`^cxr3ZAH zDQEyI>x2nqLT5n>2V#QdqCc1Hg7yTD?WN9svS)A#4O(%Kmx^Ii<ncNpAZG;1g}g{1 zBS;gm7S!V^$g(0Y>|=`y@_<H=-({n~c#68<kyiXDX9Q>rtR@@A9d*S)Q6kcWHWftI z#pB(AhI25v(~jb3X9dzxD8s1?(R8BjNoX2rRl~WjsLL(`lES84Ko-hgh5!NO4Z+0! zQgrRTBt3i(_Y2k#`}S&*!X6~)u9+k~@&xXCI7q@34e9$|<DyxAoa=o|rfc?+>CW|J zdT<e$o-Br0myqfGIGpeOh2)fGyh5)b`JF$Z8=Em~Pjn)?579ilw|)ruM==*yl;G?g zd%?OgqGx^Z$0pn(xQeJMo#^l+q81#H`*6?0+)At)PB!r>fDQc<u|&Lc8H)F{HWTK_ zfKJR&h!#NR{BID?#N7{+<zn9FeT%ybUbMH9$ceN5$G~6mD$x@kp>62$++v~^-zD17 zgXrb&aNh*{Z(!WZ#WT+@7?i2F*D;J(Mm(|XmxwLAi&)ViVylZVb><U$FNWBG7l|EP zLF`M6NelSTA0o+w`<C5s2j^BCYT}NIH2Ne-cjLWQ@>e9?847yyFQ_y;dBqK6YF|n+ z-gU|Qx039-o8(uk@p}JWlGld<w~}0TlH|%Pl8@sKh|f;u0Uk0Be}T+nPm;NK44Dsp zKp_!P6f#z(kXPa<<fB*$*@}08zi1G54^lC&9|ArE4gu#uyA2Tc6pjO51MmTH$HJTk zfG^}u06r25p9n>{WjW@3EY`AniLSsq%`3&+^>l*4uNm$+u)V+$;6DJ!!d+OB?g5qp z@OkM?pc?oDKwSxbDzyTB=+qau5;}x*(n;_Rhnxcdc-db%^MWR20HXX$)B(RK8+aRa zF?VDI*o{8S2Bx47C<`e>`Z2%-l%gL)0KB)i%s`AaDr_|X{|`s|VVDzP@FlSqg`qED z1^|7-(U<V4zzX0=;Bf%+Esz)VCSWDnZU7Df?*o;<F5o2q<NVLu`H%;LPpp$R;2J>K z1amqtX1}0pu~z?|y$=F6l`tj&|A*h0Hp3@WARU;CLZnF}>h~waBA7d)zx_0anD&Q^ zGKYq)3>l5m5Zs4-=n?|#%0=wGm>V|C72EB=IAA(}xnzUyg<{S{Cn4Pn?S<o>VH@rr z9>pDjcZg<S4q<&H<v{@RMcDwn2GjzWrwZ11+a}-*U?1=~0Kbhv%Q4YFJb2K)kP+Y$ zZG&I5Iq*~9d$fbSB7G0AAE*Z~w=&>g8Su3X_+8Wj92t(so!~)4zXok2_NNIt?xy}b zuI|1}G?AkY=0bXJ0Bb}#c++PA4&b+tF&vl(WCI1jQ@~3=C4eyyZ3Os4T9hLea+Ajb zi_`?Uo1*k!RA$j+Oi(4ws*%i872b&#h|4wehcOa`lufs47A&5ms<p}1?hK`+Nlg8G zoqUhFmTGaSMG9fzDQdJOmT8KmbR~@Q3WcfDDN%*I@De#riG@%_)|Bub<7(d>r%5{$ zwRC`-T#T2Pco{r~CF7Yf+Jg5`iV8(2vY28O>&F%~Opy{IEN|eVg{GCt#VTnj60SEY z@Su?Cc;j47YDgLVy|B7_IK@g}rf3VBFkexlX3)A2D;38_P)cHQf<o3OEH8#fmQo2# zXL3$oMG?a*Nh+1exEEa#t9?mwsbvR6sHLSbWfJbcSf!-y7WqYHDN!L8x2MaU8e&t6 zsm}C?=_AvA;IQdK=dsW<x-Jy!B!eH|u9a%8FfBGMCKuruqv-L#{pKI&haV`%lxxbx zlLX9)$Nc`iZrW;QQnyen{6z7$gyRN?X#r9wrHMb8DtT#w`g4I>EZ|+(Rm6Jn)ATET zntw~{1Spid*>D_?1@m#S^mq)$ATBnJuHV~zGSxy!{Au(Cwuarb2e%lJpWY?!r!gDP zFpChdo_5}kzA5>y?@9l(#{XhorfRw}Jr&=X!(r1a4qS`2O@J_XFkJdI2Y%N8l6YPF zv%luJD>*+W=TYUshi5ODH`}4i%bAfqTX|r{;u*t&f^b;?b>X5UPxv(!Bq?xXTTbYd z3)f~{zjg?L0zdmJm_e(5{1wcgb?mZV!AK061@s=YNs_wKblv5@f(h!8(#aS2qQ!z* zFP@v9Gc$L_yoHzR&FkU&(N=4Zs2;tqxu*BPUN`m{*sm8tzhQ$#7?zwE2+98_u&aCY zP_9#Yb?@G5NH3+=kmMmZ-#i2rk_IRJqiR2v@mg`o41XpTgLl!)6v_BL{M<sUHGdUC h{)Q6x4*6F+6#3Iy#7|KKCYTgyilpK2<{SAJ{|T#xi2?us literal 0 HcmV?d00001 diff --git a/t/images/Minolta.mrw b/t/images/Minolta.mrw new file mode 100644 index 0000000000000000000000000000000000000000..0f554f8083d0439e534294b5e40d0216ae6249a8 GIT binary patch literal 2596 zcmd^BO>7%Q6#iy+{Tny6-H=8hB%2^LP@>3Ql3+z4jd4oqI&RY>P>?ueX<cfG{3vxB zRf>=m{=&^z91s#x52nWemrC4v;1ET<wF);52q9E)03?1?Xw7@GJDU{>Js@tpXm-B& z=FOY8-@F|M#n~bdjbUbX5<rLbjFlowM?Q>gM{2Q~vDnK*LtuXXED(OHSj15phtVPc zL(U*}QwW74HK9Y7JUNI~XoS0|)x|-Hy9j?K;u1#*-x5ime_HZw#P15r!*|~;tN5bw z<tGTy{1s{ssG)HBR6dtAi}_Qhr{}ZgWPU0?pPe>y+2ZlpEDFm@<#V=KEH5p;Ua`%b zy;xec2h9A^xj{^pi`l8;X4cw6=8L7(!SrC-GC?{Fji%G1>5OSTJ(?aG9nN58wY*fx z7m>1tQ?zw}bZMtQjb0V<Ed~Wq^xl$S@;|Z1Ha?=g_!OY+ZhY+FuQ&VlwA<`=@dQwV z)W}F#R=TDu9kuUjhKKLfb+G;vQ*W&s9&WD(RD8X=9&%%nV?FG{5f{gak9z(`>TQyz zy3hyf>zqR%NO+|Fj?9NL3y)nB?poTpp)kd7Xg*%m5c7tLA6{<+Tpy~UM$pCV<IA(* z%d?^KWS^+dKjvbtRLA(lSYxiw=zeFvA4k4ii>xCX^<sef^F$A^w7~^qTTF;5V#Kni zQJkJn(cXjw?WEsAT;c>xeUA=_Nz=eRm<orYm~gBAmuIWkR9`~45AP|APD<bX8Y!~( zH6kK3AMc%VxRY{G=4eor!#zEmS$>-wwH{|EpLC*JHPXiDNnd!#cE<?aX-VR6>nM%= zYsg<5p?1SrD(=%ftL;{`T+MNL%sTmvIb|b2aDiTRn+WB{xv0Dut1<T~cfL{Bm}67D zGjfxnlqZNF{ee%(XbZY!nm_WGjMwmOrh3L?#^coJU1j5&?qSAtaKP6d;>&TR`E&jK zZwub1eUDOWCkei#p6+tPrgqu&<GolX*3i{}=cpxZ1Ig-LBsX`EsQiJ%3n!3x;{(Lk zuOnXid2G$TWLm=`sg(KZ)k^8oIQloVGvX^ZuGf9O5;f5FE7zW5d;#jBhG0C#x1j!{ zet{;s#M{J=WBc$5g2#S3b{l9Fh+v>eCKrbAgogv@_ppXO!t$mkziy8Q9`&$5rw?~{ z7<k0PIt~$b;%G=VAGlaY!t*iE>S28kQ-%kcO{qwRej8muwzjseMVg0@Kns=MpOHA5 zqk(!lCl{w*OJJc#<e9%Xcj3%J;iX)zM+`7`kxecTY!hr<CKKkth+E@A)3EkDQ31R{ z&nU-}vEL-%*zyU5{-LKY$1x`<#``02gO2dNoEyOqM*2*Wy$bYZdNaIAnbc#*vNEbb zoQdez<mJW1tLDmT=}Nh@W|kN2*GlGjyJC-L=W=<efeP{OdV#agP0`YrMkceRd@-A6 zfyOxRDxQL9*S-<IiIO%fPKqzIUadvUF~&3s^#4eqd8fIHs%$&WADTNdm6`0MUlqyy O4<GIcuG(wPx%~w#&k+s) literal 0 HcmV?d00001 diff --git a/t/images/Motorola.jpg b/t/images/Motorola.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be03ece5c5d9fcb48b15be03a6842f2a266ba6b9 GIT binary patch literal 2489 zcmaKuO>7%Q6oB9Cu9Iz=5<5*vLaWBDgo7xtcGo{mEEMwNCMj)xXtE_2XiU5|rb%o$ zc0~{eR8YwY8H+<y31lD=6$ez63x7hP6oHUHh#n|Eha&NNiF)Et3Cx?n^+KzTyt|*@ zzW3(Mo0&ITzgGWQ|LDlmxeUPMB-{@GI<$~BP>^=ub&mKMHzQZbJ>bJ9!E1x;b-70F z1C`0qikM74ivKSVi*X0?Ps(nggVrzRKx6s<H`ec!tfQWun9P^*#r#qVV1CYw9gd+M zz=Y6d&&8!w@${*pQ!20al~<i&Fcvn$X7KpTgcS*!X1ver58|)rEIFxFr|-10whESE z#uCOrg1#~nRwNNQ4A67-yc~n_)Y(^EF0LPJjAy-9u!RW#pn1>?%Q7me9Gmh?MRWP3 zmkHM)iV9T%Ej)7NjjH1Mf4i!>@=I0C<qxVpSLbrIxsk8x4#9qaYKyD$W%XIwmv1kC z@@-AVW*SC~G;C{%%x}l_nku>NLd_?+`L8#5%!E$trnIH32tSln4{I`p=IzZUk6ib# zj2WG7wg@@xfVT*cb2U(R4bkWAX6JS?O#LXDr=?vT8~&GGF>>w?MOUfb<n$a6Y>=`s zMJU;Y9?si@@lNEoY=v2q1$=3%ocANoUFS?)+kOu}$94sZ6B~9#a@nwJl6^J%qGYY# z-jWRa?QdAWxT~~Fb2k9{2Qu>h&6YHeO`9GY13MsRMSU&Jcb+;mjYBcGKH5Nf+QSY1 zO8OIN3nYEn!=Jhg=_@iGWjy_vl&clTkaDu^n37?qW4R1Y#KTd+zIQ%%Vv;YOEb!T2 zGg2T}OYr|c2LK8R=f9sv7Ar~p7+K>hL%WIWYpfo-UB-s_4{}>N3%0>>xEpi$p*_Us z<rH>e&v3?h277_&V5QQ&whJy_bwq45xXiF;PJie9ezAqNe{hZtA^*zxy&CdwoRbS^ z>ltH)H2h@5T4Mf1Y=A8z#>n__7Ede2b}iH7#`a65o%<(Wp}we;s)^je<&5`mR@zWL zBJ{sQ9u+!Rp)yI2{t=;n7s{L6zW&VIE#$ADyi@2$kh=s^Ki!<k8RRjc|2p!x(1{{X zc=)JCe~RaXmcGn1m%|Y9jE5ib@Cgsk38uEThfjL=F;C8C*|^l<;{aK{j{=z6?JVEp zbg$L33fGC?xU#%ztFySLvb<`m<G5(DKBj{q`}8cI7qs=YXL;V#_yFpN>PFW?R#Z2- z9<rjkF?nla-8#WWoX!DP9>$@8_ppMgd1E*-YZ!Rgt(DJ2En~F+i}{sOZl#>ZGp>+Z zER~B6q{^i{zl{u!9(&;E<h&IzAZ8c_MCc7K)&`8|qP3W^U?6IkQ3FppBl2*0g%(tB z-_anj@Zd#PEv=2(iGhBaK|E3Lgu_z=pFE><L2C-tX=j?Kp<^xq9vz?U>&KM<O+=m! zO}IJSuLOO)@s*%gyk7|lk@?U!(6js+*hjr$`_Fm*V6wctycR4ySzdl(C6!wW=9W`g zCzwu^QiJs$;RWdM`@7q_dpkROtx!+M3Wu<T2V=AiCWl!|-l>s2-QB@`!BAIMC>{!i z;>q}-Lvb`1iH+RJtnseC1pyt4l&+G4pah5-AoVM749^}u9QWRIiv;}t*MYz-lKKzO Ss^TmK)BrpL??O-g`+osDO(fv} literal 0 HcmV?d00001 diff --git a/t/images/Nikon.jpg b/t/images/Nikon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b55f35f9c9d948f20162bab509f769998504b204 GIT binary patch literal 1703 zcmc(g&rcIk5Xa~3_7^Rb7Ep@Tup%i$l<XE;pfM;=nlwO*sDzUdf=Z1LV}PJhLx>^= z6QS{<Q9~l}z{#j555`3P2>fv|UQGNObp6im+d=~I>NIcXv-4(WX5YMhHMh*~?v1|r z!eydt_9*#?C_q7>;7U})s04eUUtom5Zs>K4Dxs2q=5au{ExiFgDESSzS^6ko1JC-Q z-($qVHPD+F)ruX5eF_g;R-7$xGZJYfA<AX@^Ev8kZ%+^%LsHJ`XtvH7t!=Xu*L5SM zccgSfGvcX4dn(>W5qi34*Y^hxJ(ui3!iMGT+)a`v5SLcG<bu-UhOVyIwFcqulH33m ztG16o{mQBxKgm8tzg1fo*j=>k8L+o#=i>GAN#;~#JJ>J%bMU`i^b*G#!B_&{f$u{u zYE9N==(<?j?t!vquia@hOO^Z@{%*;BPW;kq)usZ4WL`%W?#&3=e?jtIE4i1=ip2pS z9OH=8BT`o(qg^qlRtT$w85SnqStk&}1@?kdU^ln|+ynMV`w-YGc@*pe^Ip9O_TveD zi%D>$^tldR00&{82QPv-<`Ve6^nVOqlKc$3?9>UrNAM3pufraK{TBEgn1Wtwg<822 zkly@2ewZ@ZT%V>9b)P?%cebo^2c0?I%d>KZ78;0tB9`rqot+;Z>>hAt^O=kj0?#-y z0pL-ZvVlY=Er>LGnY;v~T#c|I#lTwVMByLM_>?OHg6hftjdDEedE)-$DynnUztvxS zAB;q~btMT@;`^hDMiS!&B|}sjjU0|PnrFjjLZfjKhsb5p(2c_MOm>iT>_fuZ3fhmK zVs%2b)`<Jbonk4ou6B|Dy~16&W#OJ6KYd_@lLHrFy$Ij`H{rKXuqTOzJ3BzzUmTa@ zAyuAhynCIqZw|#fXWw1$&a+P__P4nNyCONtp&-r~=IE2@*{P|U+RWta)cEvR;hI*M z8oP2yn;4rJ>oUL6J*o+X>Z<CRYHOR~vHDoNH3n(zO0aaLyDdroOT@mqIxVWjB9T}! zrp1!!WJ^mD5A-B@{`J`QocWQ$KJ?Y6iUv}`LJbRZllsv)`;AIh&n^r8K}xd{!n-Wy T7b;iLfUp{-Q}mYV&Ch=Uf8?a* literal 0 HcmV?d00001 diff --git a/t/images/Nikon.nef b/t/images/Nikon.nef new file mode 100644 index 0000000000000000000000000000000000000000..1cf06614c811d393511ac56adda6cb11d60d5088 GIT binary patch literal 6188 zcmcIo3viT067GL@lT88%1R=Zv{1Oj24Y+xM<RaN6B-}!>8<OQ&h-@Bm0rIHL2K0_c zcpQWX2#d%YQ;;JCqz<h+KtwPcRRRivfLNs-;Gy364ke<c9J#Ome<t}2t4Miv@^63J z+uhSM)6?_MIGqnr7!mcPTVx>xh#yjPT*px08NepROlI&@D4Bt!eyG4E{MJb^Q5SGK ze(Ve!0h|XME&TNALDa=y+f88h8)ImzyTI(LmlC42H3fcp3tR*oYw$DB5JLjm?E|}6 z&`AXD3S0|38a_G3ZNP^XTPPZMCveF!y}!N?qRM4f`V6v9@R(QYwigjxOhCa1iSYps z)Baq}F>aTd;m*r-=Q%u1w~KVi$e}ihhX?$(a#zXB@-j8UTj8(r6|0#=CH``snmjmZ zaDqAkaoTJtskVnx6I0ZLq*U9mR9gytf_CSl(O3j+B1^342?}?ph44^PUKVQ_NS3nl zvf^0NWC|NoQZ~KP&(g=p>MrwpeI@0wreX@s@RoUtya<Do&s+%Bq!N{u`F(k#MyL}f zO;)XEs3Tc1Wxt~sZ((JHBR4mjwb?TpF>a$97j?<`L2a_1jlzqHD+{6Bj3>v3#^K%$ z+;zH+J&X%<{0GK9PhJLe<^o4e*YOI*1v=isc#glq51mHVFRbt}ZUT-MZ2?kmedHZQ z<psqm_d9v84Sz{Cn~i@KbO$XSD_wI-Pa^kDBFoJ-S@Kgvbq^x@*R{z8Bw__TM0BLC zu*x@Ew4#`ji0<^g&Bs?BZM>D3GydWy&^IEzFV3>U!Ri22q*S@DqTJ`@q)?GY37kvG zskR}=A~gY@iK$5`$X4SDm#a4v9*wI}uC!caom^=XfsLz6G3l#i8ssK{d9^Wdy2zCI zJ#gB{s?yRY)zKBxvwY>HdEPl{NvU^wv0CKydxvBF$(YzyR-G#y0LALRWYwz<`|OBE z#=UVFk*qp#)os;f8dk8eKeD>8y{s<mGgx)Wg>7q}fq$&JtXyQ)s)z}ns}|{1!KCQD zZolS5|115zk_x@kF|=usUd^g8_*(_80q$R;S5z}%y<gxH+-FgRRzt@ka6RKdgf`YM z0*3^2pH0BlfbIufpfG^}Dcpb~g#HQW&ka~92Bq*U@KWG-=zi3lXm!A(ReN3~YYaGG zz)D@)F3^3uj=93p4yzU$_eBwyN5}-s`%M?@0!$oZ5uP|ayi)|r++Z@O62hhX@UR{4 z66{}F5ZdfG#m+Vma;sLkZHWms?vWNBoq)`w#qtFVLx3Y;e*-ua7%4&)C|U*X2;2eM z+y+ym@JUK2MYZCN$Y_0SM0F;*$Iw<!M9H>Y;b$Ryh68g|UkoYBxi3o)1(p;IfP9&d z<15t&pMc78_>?g`CEB$s9ccwH?`B!BT`Bxe1YQly>!tuWV2FRM@WZ~=L5Js|3_8yW zKYrl#z$+kM3cLZhA8;2;=tj}6=8$IdCT-*}Z;;oCc1Hl$L!bL%OR(7*MEr44M7yBF zW19_~-2!`n_W+|AQt>EJR$7Ljr$8POrH?2776thO;2(5CT@~`B7-yzD#{?Bbj&UA0 z114mH+m*@Oku@lvIg^4X1K)HFnKxPDmpE|FC*Izei}mZu%u=~%7Z0Z#_sGmd-Mhmx zF3*vzIdW%Zsll|-|0HcH^=XDjqDxA+@;M%?P9d$p9QDAchAENsX^R=}P+znt)ZEfZ zY0-$PHADVDP}Mvb7#ocPw%{)ZGuMaSZJF8f63~*Ck6KXUh*IA8>XgsyQz~OHPKYI; zYrK`NJvL~8ebAKn<R$T6+SN&z`ff;n6S;Kvtvn$yDLG}x(1$Tz<MKW393IcS97i^h zeb>@I_Wt->^sWd@;tNL)n5c@AEU|v}_U;#2rHYnS<Q@Cq2bUi;Dyz^{rnM9Eyl^eB zpsojXq-=d}9u;4Resj$;BQx{yuFw)P1|xxuLJ}0rMg^8*G=GdRL>M{!`Jqm8y8c~q z`D=4J4}EZwx{{-|w+n}Rh;X>cU}Thc)@XIRFxp(}_P;C~?ur;4W7Edaq`ZelHNR>& zJWqznl1&@KVSKw>j*8^c;_gPrbT>JNmmW#&Cz<7jZb-E|a~Zzm(&FyA(LNlJbJE$* z=Q0e*rR6UR$B=W<;m_kT49TU{FAJw#&Pk_t<}wV)rN!NaGxa~UG^9uLh5e<J`_AM( zk$S-lQs;QDFyB?q@iLK*4DNO=!<SrY++8=2b0NmE%Q<JPlL}Wti&2Ary-mYp)X-+e zsG@J&p+Q$ES#J~b`xH(s^@moTNP9iw&=!kx@9++vE82S&(b)X3`R>=<*>#TU<Z)>e zJ`_9Es-*>c-`f|S^K5L%*0Y}PA{6ZvpeI7LQ|9@|IXlYwy6TUdIl5}!fl*?vGE+z1 z3N&OduD$=8w`croTL&SYSC#i|c5#QSt)`;Kr)HMSRPZvW(=4mP<HK|%X~fVMPo0a7 z*mdCO3)o0Q=o+Lr$z@yyU;aSR^}@zCqZ{Vvd#ssGvr#arK490x_Psg}rt?#>_V$MF zQT})A4UzZR_v~isrTcI4iFQQZG%X4)uWr!g_UCl|)p*D5Yv*zbI)9r^I+<^qIDQdT zrj7W^_|2BKH;GVEA?}NJ1CU`uPflVw4{w&>j?`Icue@e(6hgm+hx+O3t0Vi7eR6G& zh!Oq1PiK$3ylOB>BIlaZn_hpUYG`R&3}R-l+*2Ot*?1xPm2XHfs|zzNxH@Y`+y$nu zWBz$#R7Up3rQXAva~u9WM`YQcwe#Xi4!Jki%w6_I>ZyykXX3+v)~zSq#~<&%!F?hy z_|?XKvrbMHZN}Bb$NuJ6{OIb@6RO8Qbg59LaooJ9#~Nn3d#;~)e)hr5p<_h@<vTVW z?3+HOrm=8RQRUM~U+N7g{5pH(#@E|ccDu;YpFI$8WGTq4|JU^rcj8y2K2tvIJ)kXi zGl_S9(I|Q!GzqBbt(lECR$PpJVW{jhSBG43*AKjP;gRfu)hEx6t9}3AqhhpQt-P7m zuZMH)pBt>*Zk{`SRX-TE_H62FQ}<lzdUo`pBdJe?O$dA^tdgIZxTNXhbo=gZ`OhyH zyK}ul-C9im5^$%n<y9j8;Onn!xa@l8@P=d2n?fFWUs(5bJ^cKng<1Y>eXM=$S3EB( zI8++Rduza%{s-4))b3Alo_x!bE6fs>G(B{vwjuN7c~2&HpILuS(aw6(a8&12Egub= zl-+pDm$+d5bEAckBkgb36Q>?=Ejqj_=H6ks@9JXOKcsBNl##BOhEp@_Ay;oAHMBfF zeSFBp%q7|LU+ULu)v9%$E)e1|{g-!K=*^jN_&~(4Ig=VIgm|}S+#5HxpB~ll-_rUA z|2kl=5D(4x)75<od%N~*zqa!Ho~KLoIC<fu;d$cIs(Z7-*N<4gIkn>Y_tS73*IHil zb*JU_zaMr7-u_4Ltb0!nSG4)Yotk!pV?*t9sh@}WP633wUYvE~HHiCQqB^)T;WjC> z_2!7@Ufyy|K?cbipCaI3w_LLzm$zKK*fEH2wz!H*E>4LRzT(*>#Xq>>;=2Ts7Wf7D zabT6R9Y>ps&4uv?kdFoCXg>p<hAPK$jnE(MCW4Rlpj>yp)8ibEGp$CNOzH;Xu5w?g ZcNW^s&u}`SE$n`halm|=b^FcL{{Ss@#0dZZ literal 0 HcmV?d00001 diff --git a/t/images/NikonD2Hs.jpg b/t/images/NikonD2Hs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b46e75405e27eb7d4814939ccadf513f1ed06aa8 GIT binary patch literal 3505 zcmeHJiCa`h67TnBfB{Bi6yy-}K_U=2oFk0jfdVrKA`BuD)QBK*3;Lk~8ZQt8MGTCB z2rAboN;F{NjT()L0ddzTeuAQ#c!jtsx}WhTv(@hyW;br~4{XoZ)4x~m*VR?kRsCAq zrTtlWNSU3SfKW&X8jTPVAX8#6A^{D7t|rWBYzkOI3_&~?3HTwx78%eOp=M&Z4j&_2 zSPp0)B=lSp;GH3)G`0ZTP7WR56eJ@)tLIMPC=Q#xMMx+N4GLC;QvRy&Fjcs3M35>J zF%pF|a0$#ogc~!H86)E}JR}}sF@>aJvFA9kY@Ec45=+N<dICVmCAX5Zl02WgQ-?bW z9a(F@w?bzI^C*N$5HbS&e6dt2DdBO}lbt1e9quh97!E=5P${X?`CiRO*lUOrkFPf1 z<UFC;h+PX}rxvgnh-za!Y@*{^s8?eBf;`Y;r(RF51wNbBs7q)YcoI3xE!D&70bIk` zFA<At2v$E>R6{b@7zi~y1{=lzHqb@Cr_PGy!!Fh{dI-Gr^^Cs+s6q84ZI1x#>CkZc zL9Su-14J5DKaPZkkJyYc?bH~s`h!7k$YRXr;)D5m@zLnTM`NPL7Y<;&9yEwM|1OL! z7=I`eJ|qJ!mxTb4A#`)-po@5c$I#@|Md^qHnXXFQ!6!C9Bw~m<4i7{NGKa|zhzmIy zJO&vW1Xv1MF@`zhWccTBAXFU32}8y-HU>^KGKDvE4#EE*W-Ua3X=WT2A|&GM7MLTZ zsz4WyLc?f#z$Y>ZS#f-rYpsWExEv)HBRg8oqxIX<Hema+(Fiuac*Apawyj0$@Qxw^ z8;<hmeZ^~SL<Ni-i%}uF7WQESs|QcmsE3OfP80#Y6zlXiLh)fH2+2dJ6m!Vc(9a;X zUQEhp4&;=9586g^VgM^p1+8-=gj$1`ng?A*=TRLSD~tO_A*pHmVGV?Kb1?*cdvq9~ z1|25RURo!dUPhg$kzN;a!KfEC(Q<3RuhBu)FPurx0)j%76h)!1aODhTgcu+^Am5o0 zDtZiX_s3(XDm=t@8vPQUm=ViyGp@mPNjF28SPXS6XXi5vCO5ep1s*=J@wr2fAu5GZ zMz86wnx+a@DzI`SmWt)?t~I;td-c|_eB!C*MO$r}1F4{UR!`%V?!B2eOou$)ZnIEb z^x4a#0~eapwQ-f29LXUQ*_hvJEazq?IJY={o*eW(_m+`i*Q(zpN2`W5T1<~syj}MX zGxG<7973&9rN!Ra!i?ZuW`QB2u7*~hJ8{9Gr2o;iFGs9Be5yjY%{Xj=@mCT*Qw^10 zmK1ZSZ%O;BF<Tbg?7!~uEdPm%-0Fu-Mcv)|!>j%0uS`3+IOV&<+0@zRFWQ#$`NTEe zozj)~#rzSGndc_nKX&|=ICZplc>36!0!n$}T(w8`sF1*6^}%74sp8w&;|a5<+t2w+ zFO?lnahhk*I8+rq`M2di7#iKm{q(`?MUJ`7A=z1$?Y}$7<{Wa#sj6JAoz;BtK+>zv zwyGEQZhw5&v~xqRx6=9PnuoR@iw^c|{C4+hs_b_E!v<O1CCj!XvZY}C-2P=<cmBR* zbl#5-&#w^9+gy?|sIc|bPv1;C{zmw(lVi)fE}sbd+erU${8~{&%8bFgkmp3})+trr zpWJX@N6fol_IPc+p7_1Zp0;DBGPjj4+EG@~7G1TX+xqM*H@8_=gSQ>INT!bXrvAHt z`ipYe$_uj!f4aWYYmfHb+Z~b(nv2zb=lBkv*cI6ZtceiS^1XcRE;r4V$;&+VJ~!|T zAX}UT6**@sZxn2KKk;x$?fsADi32;9KaU_#PyWibU(4&pH`u>PE>Bodb@;%9&yDhJ z@2z?!J>n6xI&<)zr|$MKrR9<1Qm3~jrksr5-7sI~Cb;81z0N;sOx)$ueRE$2%W|R& z=G<z1c|BTXe$pyGZtQESr_8eU%Z|vbviuJ3<vm$btP<x;l}}E*ajmOm<gTbk*J3uT zJsh%A6%arnItL+3|KC0kfnR%IZyvtw+e)ozI=IF4YvN<uduyJG>Dn}I>YZT|TV6Z! zP12FG73tlv6`Br-qlt%mSKZfhw<nxF9uYlNaJqH7La}4g%ky+?Ug2u9SP+?&Duun- zl;L`G7}Vw!T$_0grJY=D26zoWHR0vHd-L-WyN}(SS?y!K#PfyO*{Yj8lYV@*;>iv9 z@JrGAyKfbRU$PX9ZZEjuCjIE<0;tV)sLhy}_Q#x3zeu;+XZoq%@C&h(l}8&!6kmJP zS?Z7nwHbN^*Jhw=@uv0OGU?W=eS(Y!eP+};1I4cC|7?7$s-0}I%9-zZGq*n|Rq6OZ zp0Fy)zE<ltRj@bnsHQkfo8J8M0hgDNMOV}8wi}uoUthY}HQ1+R%@YeRv%_ASo13yf zX}$gKVbl2fzS+v=gDG&vNiMZFOONc|`_<*e9xV;es0Kfixlh<Q;;2VM$0sE{;*%8% z^_%{=OrM*;A#?<u7CkvJfqpcCixK|z6ZqCJa4Qz14BUzZ8HC=gm?XIGit$2{<S??; zzZEkJ{pbDGcZPpZkj{d?03;&e<BSbvI>z{m$`AL3yD)Qe<Lmt9czm#jY5&73VZwk{ z!t@V&CCt?G%I>ecnxI&gmbRQ)nzSr!etK;3LMk~eHZh)B5W6(ihkds=BR(@ZK1=_N z_7>baEX>VqhS)e;SvgCcMmkA7oS=F5c;e=x@THsL&l+KAV?)_dPS(~=awp13u8_OB z%3*?^r{AAV8+fNZgG2(jkO+8$BO*lvPef?XqhLe~BnlHv!#_xn`G0ee=noR@O(f*O QzKM7uGzoo+MrynN4FJf%<^TWy literal 0 HcmV?d00001 diff --git a/t/images/NikonD70.jpg b/t/images/NikonD70.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52e471b1a21cb76495b3ddaf665c2a0eb1ba0690 GIT binary patch literal 3661 zcmb7G3sh9s6+QR88RiSaASmDfGfD)N&&==<sUL=)5M}s?ib+k&PaG>B5vaPv0^$#U zK*Xx4mMCh`RilZrk`<ef#2B%rA~7v$tDq9GX=Q9dt=de_eecaMtIMvWch<XS&w1zW zd+s^s-gj-iwmxuwH90jI2qBPyKd|-7cP6d2EConQgDC(Y1y`a129XCo$B8?K<%rJ_ z4`5Le`~mR=F^2&zkns-u2NEpUAOkTt#{Q8QIqZpJ`p7KKp3X5$W^>pDtwoHQ!#D?t zWX6p0Y_@=ipNq@`kb^mOZn{~Uke-#1o@L5TO*adg#A$kJ79!Yka$#Y4m?2DW)Phm3 zkBZeBVhxd6eN1fBwAiTW)DSy%5M?SaAr6%V_~-=bCCE8~R0$G2rgmg1KaQCzj4$V8 zaNT};Oju*x0SAuVGC^1uuCft8f-EAv(P(I7?eSsb8$}Mhu!-<CgkhnHaqui}7GWT8 zdYrAiS?tiSZI%f9n4M;+fYGp7Cg1?Xa)*6g^E%4!f_Y&Znm2KCVccW~n;SVFSR;nC zxycDPkK$Il{|3FjmGJyF8$c_=V?`%omdBEA#A16MWp@sZ<Mov7FwaA1aUJH@i{*)! z;rx-JKbP7Be!Ai|fgeqvP2lIS2!xuH^|Xlv{%o{y5iqs4$A@C4__W#MgZ{M1M}2Ek zj*dM74*nZ-K5Uo+CI_XF;+Iv}%XDZf)H5OsK0a7Q92YHMx!Llw(h^|Yo%ZAuT(?jw z20g}%hKlZ=i^xPJ#)xr2?<jUf?1roq;}}MRy&VUlrQIe3WDXn)3d%vFi_Mjv3kbUA z#^cY45<qSDTf7NR2hN|z)P~=yl=mWx<$S~SF)1+4iO1Us``Bxj$$(nU2N~Muzy@x9 z$_P-;#hUWu!De2MMgUs`9_s5>Ave_PhS5C1Hr^(V`n<!zUxyox`iM$qJ2X)nauxAj zXm(nA3ul9MBw7x?<ao9tE`z-s#@!=&0sP)ZF0lq$IeR=M#367<h)<w&KNdChijU_p zd)zQDzu|arzlr0aog0gJ7B7V34!jgjIB*qmKys=%NvqX@X+d^6O0HpTBqfHWXaP*g zq4V)2nA5Y;O!Mq-<0~yIDnczKA=%mUC<lO|lkP#Tkpvt;8~5)F_Oy=A@e(EqGL*`+ z^u#11XE{G3DJgMY>YS8pE$9vU2w_x1bOh%u7Ld>|M#8%78Y;Qu(N{d8fXf&><)FQz z8wuA$yXi#LU8Yh!`}YeQT!Ric18I;6YO)09tLMieqB~&&J_S~*B*5CJa<iUNs=BR; zIXza^j5>K)E32@UDOA?Z^x0RfDwS2Ql34pBiazT*O6w_=Ti>Z&stjwm>L0xl)l;iV zZ0%L>bJ{SUxez`ra&q*n(1`Ga*)dVmO^?P<*PL6Y^Plg<+CWXp=TZ_Kh~M8pO(5D! zWowhiF^n5Q>;ba46{Y6^a%R%g9VGstQ#{?K>VkCPrsQ~IG}Zm!b^wz2Jfv91MY(}4 zCHog~p+63ZtdAU5sLjU;_rmjnZV1}alasZ;<&}QkxlcT&$GTX6|18uyBBedHGTcMn zz!JPG*uF)nvONT1v!di$4QE6<x(KF*Pc)SPK0aW>UmENIKU=SD30#IY+iKfAz{3JE ztyYzcolb&f&mjnF%<w&an~{)C!AW!aOf8<a#;B;6D6Y7<sznw({8!u(7R=91PqW)- zA<3L#GAAS@3L0>{;Q^)rKTWjG2tBJuZ$9F_(VLHWkT~6Z7-HY?Vk?FiPcbeNzRtHA z)KPT^?d)<!Vr6mh8f{s5VU?xu=UPi~Zc(AOAh#lSmT7)MYATxMSC&^5#%h<AR+JVM zmRRyvY0FA2B^BD-k^=3jWu>JR=risLh9O+8Xh)y1_{dRD@WCT2i*8^3>nh?Rgv$T5 zO8IM}tCZ)xe3kO$POH@Xz*SZ(t1Qkd$+fI-UZ?FQB!JY#MdBisN+c4QOe$A;x+)b4 zrH{uLm8YL?fWM!wMxzZ33(`&qnW)hOPn#T~H$+B81_Vu?8DpFg77=NrBt#~YDHTd@ zS66SNPNOsa-_6zuYAJ-n9F|M~Mom~Xv7LwU7&n&Qo*hkuHw_oUNbsc|FUy2wL}Heq zA4hET+9pza=)?w7?wARgD{DQCP4S<&c;&s_)BgxZ_+Ua<Co&wu5+uM^{%Wi_ycN>I z6B@Fq4I-U~DbscXlsJx2vuc<PPsJtghhEO#cyoid>{$8Xrf-LGG9oUWvB75_1$ON6 z_|@+9i$_{FEnl!O@sazEpdSs-e6ZB@>nmGGck~;dZa6p+dT(`ZRnyL%zJ687cXvJ< zd18*-oc)u;jLE0#hBo>g`RevqLV`xZ#03Su1-ZA*3_(kTu4-aaSk;jp>)?9>*JMNU z)=x@||NVs8WBa`R+<wp1Z+PX@-0Q!4w(je!-Y)fspDJN-d(7Imw+_|Rkjt8DC;WZf z3+~@Jl6+Mc9UWTMJLRtjyyew}`NK*3CzZXv^!DBpJuW$?-Pt|&$K#!<&%Lu~*13&- zY?SwBdmgSz4yh?UdSsyXY|A%Wn#O3}4d||(v;58l^HZ;DpEPAZGv0XYA9MN9^|!J= zJ%4_z*wp3s=-?T}tKRnmZk$wqTwnd%1}$!baa{p#+Q4%2>Kk>J$@Ib4`N3Dy&aKH> zceu1+Y|oW{)$ceN*Qooa`pXZMUv)$eGVP`vn_l~1eRAsYVapexI!(tbTbEsk=pJrg z^p_<wj4hTLzsM1<ss4ZJ`@7rjxW9Sb+3mkZ(Gn0<zWC;^J2GPXYdz!7&zwDe(Z`~y zS$Cft-FE%%VARnW?^Zmo{gRyqWtH*10T0-z-?i_Hd#fYvMZ@XJ{3&1f?JyRfbRRIV z)@=jcsrjXq6Q8se^}jc1U3E#^Mbm)fo3pnfc7+{EuYORZzH2ECugRCNRl(9LXMK!I ze!F5)VYRgN>__|H^=18AR*CMHHvBYZZG!*(%;9^J+ZJVZ<&{j@uHHUijDCEp>GsOD zof4Nz*?Ib%uP8rw7#-OnE$Z5~`2BUhFLI8}t&drDbEs?R;DX6BdiE7q##iOPnf1=0 IW47!60md($$N&HU literal 0 HcmV?d00001 diff --git a/t/images/OOXML.docx b/t/images/OOXML.docx new file mode 100644 index 0000000000000000000000000000000000000000..715638f5d14d3118c78119398f3dffd9abd8eede GIT binary patch literal 7521 zcma)BWmuHa)*V`UKoF1?kOl$ikPtyYWayA)=w|5dkdQDa2|*F0L%K#l(g8tQq`SMn z!2;BK@Au=KXXeLQv(H(3@3Yo^6=ac+2><}V75GC9;JB;hYmNW_bfW+OR{?|oEeRWI z2-q5;tL$nEcF<;Xv9eTAMh74%EOp_hI4{enxF7?z5eNXK%B}LyTfiEcb=>HD2D^3y z>bMfLXEe&`9zKh5ivGN=Bg?Dtv<hh$nXH-5rMo(`X23}v)jR?k;-b@*4MBrGbb6W0 zPjfMMcsylnH2gpVil!!MdZeN}6xupdpCi!Zu2>c7Z4w`o&oa#FAscu3XUa_b;YCNL z&FFl@1tHZ@U|E+#c>E&FEcpf)ynSR?AaWG_Ta^y@qBOEARn7Nu^cvlBGeVSSWwlna zGITLWsD~+%n4{Es>-QME)A0P6sN+L`DS^}iwf1RK#JtyUSqw!gI;dpQ#>ul`i4_I4 zqtPQo$8ZTOy6m>)>+N80;Ll)Dcs<!Aq4v9POEF)J%=fj)c?Da5&J&k98|hw4ac6{} z#A%Vval+v{DNTpDm(bYd_qT;r$Ao(Y5!-I7y=C1R9FaM4ZyXN8YojR9qID_4HWg<~ z6EbdRib)KMKY<#oV(QC!4oqw6L1v7I$UE85*LH%14v-b#d||-30ssiO^##9w`T2ng z=S$ZfZ0W%Mouc;+%QBL#=M<eSJSRFhuFMVxPP9D|0D$>>A=}yVe-fM<+kQr{<gWCQ z|Fq|1iBNz-vNcfA`AQ%z@lq?&MDP-NiFcG(^^Ht3A`Q2huI+Vl*P6lj$Qu2S+~OGa z;v}w;w)rn#V(vWMeN5VQ!?zE{|2SrqW8;CHSDDub90u&B*W1x_M5J^!AxF7D5Vt9n zao4K{$!#b|agk})D0-QD8B|@pSR1`@b+Cj6Rb?s44q}S!SJw$_)KqdC1>d;&Kf9L) zET<{CzTFsnn=<P`zCK;R_51eAy%J1P2wzQF6CT^8Pbb}#Xrk<>!ql8w-5}^(fFwW% zG5wLRUqR-saV>*6(NrAm6cI&jQ>Q+5^^L>itI2!Vq%5xHup+x1oy3p0mANm5@1LUR z0XQcigzqv5=<u^NvN2S!x3T@ngD9MXfAes*)*iH6h=B+Is3QXaz>913ZEb&7+Zn{! z^Q+pDl^;Y6!K+Pe!Q0jo4Jn;cygBEYRcUaK<c%tKr)2cPg@I?wk}%ydJMp5lQ6+~~ zkLk|M4u`$Yw;WSfsLf6KAtK2jMAZt#VQ7K~!Pw0dhS2*%iq}o_AAADNN4OjYt@>>O zV}hiCjm_M-N*m10>Dg(~c420Z<J$u7-Go4WE3$hqtdrfW>u;95=oGodM^``>cl8dS z2glA)?i5o~;OTx-%fu4i!!^X~Hb#i+G~Q->q=?nF_Y=f<sYDE1Z1?0TsKWS7k{ePU zF&O5}W7WO|KVcf5`(WQN_;EU=hF7ySfQwKo*Y9zjj1lwGveu>qBjm1T6|((RF=4di zE`#R5f$6c*z%mCDs$wc!v4iV^CT{*MyE4}YzO_oyJwWc#K|I1S`nn*$Ah-TPRZ5{1 z1%KOSWYI4sg;V@xe*y&<)^l^{siV9FDWwuHP#(1qt&Y0|Y^cS)i6uB$`2?E`R%_hv z6tYYBlC?(MN#y3ReX5}w_mhnqXfZm|L(a!JpHwwR9D&bw!<HJ9leYD1?IND<u&~*1 zQtLjfWJ;0{+peh2)m?8OTH$G5EDB!yCN20-pwFG1aK&-o>s>m?Z<Pas&fGwK5%|rS zFF+4?f+>HOR>*x+YKS`8AIhvL;p5CVoip*=hGwS}jluoM`>Mw0s8Jj74x-N_BDsEt z#0$3Nb$jl6Nasbp%cC!7k-jpO1utqNcv0hBOeRAcd+_gU5`*_`>I>Nv5&Ix&m<kxQ z`t*PjI4dyFnmwe6ljCKItD=_OtDNih>Q>==0xp6^{;4N|H!Wxv=AY@iJD#jh%<KFq zTk7Gr>f3HnIS)edOsxZYmnppOj1avi-mfpwtLZLip>gq$(ycQu&#kaq>m$KrlU`#G zFw=FYYSF$@cJsp~4#8%k^c(|4gc8e#Op8$PQFN(j8F>F0!xg!LdTCCUrG*d^*#<RP zcY9ABV3H^<24pQ`NO`IQ)wZq9g^HOdBSybu?M7t?^YPL&1`f1<#EB$gTWx9<`rKwe zJFxey8rdx?<a~cDVVDG(G_jXVX?k_v6BW4^caBexgkZo1{;m&2Da0#2D3f!CN^{{k z-6nh#TqRfLg(>vO!mqyULdgD_N;mQnsx84bZp2>iKyMWyAu4F=qkhyIQVyzU;_su2 z>)GxI4(4N&LZ5(2zlk{+eVFA>AAd7kzM>z@b*CSK4P+>*cu4^Uc`b=}35*zC7d+0( zYBO+mV8}Umo!!2n#<aL_G^o&ta#T0DTsmp+WO25;n%g=<)<^Ryy+|pOu4&(!zCLfU zQ^a$whv8h`5Z73L3U3^BI6rRc-%ZER(E(y(^_y*MINLZE*e-ppYcq6<plOVLSy0{e z;UsboKC&{a_fFB<zP6nL-q;bJ_a7oHgK<<2SGdsm92IoSG$#-uUmXheGqm)_4v&F- zcc^HmEf)gS1|;egUxLb#-NwE!drwinz0xk-Kq6OzB)#givksjCtziVDQ$@2iO!W>k zszmsUz7}K%t?p@;%b$7_cXvL;fOJjh4I_(-=JR@GpuPurMyYc37PC^9#bU(ng08Hw zkZ@(}Sbwlgf8qoACR_$~!p_%U+i$#Nzs3=HY#QHj3=H1&;*_@b5NhPBjGD=rvfgiz z=vyEEC=ni4xxJ6mqx&SSQ|$RjjvYu?md-d?2wlJtKPl}rl#<v(%rTg!GCD~w*ks9% zL6ng_2a&*tRpiY98ms>6_k!JlN2UeMyoTZ1vr>jFLhIH+28LIdZYU3qJ(hPWqU<Nv zVQLHMS(S~lfzYE`ha)gCv(0Dv$~znA^^y!Ix!$*tq@Vkc`f!!sz_9|MTObuWNM&7q zFkHnU;St2fm0ey?X+=k06Eq%QH8Bw%g2iZEC^(2cHZ@A$u-GQf8%CNPTJb5s%AyDb z)8pD`!GkZJ)FrSt(W6@$5NM=enIe_j)T^l=i;bl;eo<Cy=8EwIVs{tg8Yj{w>^`IC zFEPEu%~QzeJFy4v_8ZnPW{qsS@nm0h3lOY?1tV<@M9c(PDlRc+i0-<Hw4t!G)|O5* zOK!EH5DiYR?Z`M!>e-G{eMaijG9+*kxhDzjQos@abO0NE61!k5C^sU!uDJ!vh5!4+ z%6&W)*~DRK>++i`Ulc@3KdUiVK={{#^p|jBK0J(JfJ{P>Q)}@-X0y6yA?{U4Y|f+y zs}h8DOeAI=m1nG8mz&31?Yu)fXZ^Cc?mV^M!$r*v;SwrOxTraVKSUSX7{t`k%D`IR z%#zLA7Hsler_4i^WiATQL+{B`tDtMBcnAphsqZ`5**Vg1yK>VAb5p^Jxlj-UiKK4X zHlPtp($Ntb5%kj1_IC6V^maVzC@JmqnUH@i@3P&{aEgTGM}{T(u_Nn4J?+PjEFbqy zulVyK(a<0<=|O?|z<MCw2jIT<W8dI-JX6kMDt}?9G3x#)FT%MjkcC(1MQw%x--fe| zz0nV8cH;QAB>1<cJCkPL*ZseRove!B`WpPNIpB8y+2z&n7U5_G7xQPm;lC)on0E8; zN-yxl|Ai;3pr?ZPl%)*y@RwtNB*mR97WB@o@w$A|p>Hs~%C!w0j$Mj-#e-frs?~-W zUj<PlpZSZLc#Kx5Hpp(fIO6)LS7~akDl~*34{vN3YzC-0Tu;x#rBw{0K_Pcgm%aZQ zDyB4pRJql&$7d?fS;lF)nXMI<BUBe_mw+&R|Mfs0#zbB%0w@CEG<G@hHSgZH&S9U( zPs$&g1@pGP8esGlN~+qH6vd%#2;D8DMP4`kd@TwYO<1i?vxFl4^Qt_8R}z1~A|0NH z?deglfkBt=2pf8%nUg){*oNM<I;@Q;SUdZ9?wuJRv+|FC1Naq6g!<zO{eJit5AL7p zxG8SbeE1eY%PN{X+N(u6Cvh#mP$hwwLTps<JcVd9SWCGFFNTcQ{eXO*nXyx5DDmsu z;@r`vhf-3SUqu*6mMa_)A@__w2i$$c^)Zl*Yh!kN*huWg?Axxl$empF-y%oyM7%Y5 z%y8bRK03TYS0YPjl(F$O!){5viO^Ar?ga{3U<#)K2SK2okZK$@)HR01mhJXD_s&ru zDsf)7x{pflWbd;%eM$>1u?G@01L%xL)TX0YoaQOfLklJSFT%+h=p}t1`BMcXI>W=h zJEPz9*?pHDeesOctRAortxwga3n$ed%L!^Wmm9GN=Hs_CWD9+!HKd2YFo<GaKhumj z*)_gU$rTw^JmrUs8rnUHA27>-7V}xtY^&XXU&~f(!3EgSgz?xJZJ&DUrnw@^$&vHD zn5mV;&e4MeELjU3nC8J%*|mbS^_<l^>4!2O+1vR##4U!uRBLm4QC@kC78X%j-cE^i z6H3B1{Y7a}u=OQmlNJM)Dkb{lljo~VrP(Koy(DcgYZm8`6@CrLM#)~+EXO_i*Obrw zP6D*jNLpGP_v(k|KwcZ^e3;{Wo4Y&VmZW(jCz4ld!v{UQo(3ooM&=Xot+=%5meerT zqX|_ll&OPMLpZc(mmz3h{RI-}*yZ1WmxWtWatOoGUOElb1n%v<%0KyD^5?D!n=Ri` z4xT-jaQlq^tN4uJ7Ft=~!17#y{pp@ZW6w(tR$I6v#BfvIRH<kwJ%jQVXi7abxSPRl zb2nLC-i*OFkH(O8lzEH<=ZnWa7+WygXQ(P{mZl-zzGt;$SnbH6*voAOi>92McvZRS zA;!M_`rfV8wxOz!@LFf}pfFyJGVrrB%QzIWeO3Mqb4r%GLqVQ1i<+|AGt&)BM8)DE z8rR}{rArIDSvRP24<BmILi4b7nC_Z?Nr*EM6Rah!G}NB2SL|ml7*0*&)wHEhk^hP( z*Ca`O(}1aYOa4Q+@zCayhXM~!p((}xMk}|vl{^t4PB(o`ABcx&|BAA;g>sR?YAfG2 zRfP`qEq{8tJ7~I$O_X4d+>ddw_e2=#9I}j`0gey~yH%;()yNOmu8m+*N#Ys|`7@e2 zwutIvu{t0@ne|_6@%1>g5Uc9l9(_Ve_2t+bMpIse$;o27j(xeDJ6R=yJK!qG{bD&g zfFTewYZHgx8tG3yl2wM~hed&&`MusDM<YP`N17VQ$N?oPj1jj|YxDXIO`3Gx4LXjj zZIkEM*fA+QK8Q<p=<4X|YT_3@&73ktG7aqBG<5??(ZEKg#Gh}@jeGH*5JbE)6fo&A zeIcb)(7iu+==|n^K?8rxAYLGhhhsDAUb1>EYSWTBdSr7#V?+fglo6u=E>_%dlcX$W zvyC|ClX2uw63QD>4I<@O=#$$U*ED^dVl~K8<bbpeaRu6s+k#9NykFr};E3^fyMMUX znriWSo%H1}afdU7&Ha4GESPP<Go~CPX@xmpbKCn5^I4?P)X-&}CtT*k#T@3nw1iY| z@D)By@+FiYXJKtXEXcDmySv<;6mdu{yg=G0B$S?~_m|a+Q;LoI7-v8XT#c1zFrQ!1 zcqX6}Z3<;rj4D2P`Dj3<Xqm`=B7Q~R-uGQvRtjjU|905$xAiwCcrf%6o6-vIm4-&= zpiG#PneC@>Gz`QV`9zi6ikxFAPo!Sjb!1&GqY;GHgp<fRph#1r^5&L0&TMgWMdwT~ zsXDbK@@-}@YP=vhig*HkmDTi&1Fh!=%~)H0EK?u6`w~_6W8GF_Q!!s`N@;eE1VNKI ztarcdO>9gV*pV$8<#WVpBR?&Pt!=b5PZUy2ZmChwlX?#eUkP70$cn*AVGG2G!7^>s zOS!+u@?_FZO1&xLk>W9;SR#zWiik*|x*pu0<<mkQmY<GYv>+d6G0U1Z8lfO&u*i~| zBmc&1K{xZJ1a`s)5OXSPBlc%71Nq###E?py?ACHRD4S`VPJ=&Ls;E<M2&ayQ*<^1j z;$71ANQXml<R<Fma$a=h9jpNsJ@-ne4>`^Ns6G;PiBGQu$qBz8_L`QBS*Mv{%G@iw zNLC$U#s^6I&wafSmUBOso^rx6dgPy%joGnf_0Ow<q1I#&5k*+4grvn37V3(`o$ztp z$tB+NdT@bDE6m90^&WVGs)dgmaDO!@2Z*aB_`Dh%;F9X?h1p(&(xCP5EuaTG%p173 zqJSQD<JJu{YeX7^p?c9IT=i(?PylYAY>Qo8ZLhw{HuYBPqZM0YC)L`j)7t|3q7T~! z!?krYS;Ux=l*>8>hK;$a!00Fi_$9?J3Wf2jbUlvk-zO>!SY*)Rt0x?Wt5Ekkblq1r z^~rk_!Lx%giyfeT5L1<|fJm7<aJ|HLEMwkz1tbwNq5L*M{ZrW?Wm)oO(T+S72x0+g zF%i`$3)#uI8l_&Zie@fTx8pgew*0AWP_)$=hc<5L?pwZe(3kx;nRHDCXugdx1W8t^ zo#U2L3dGu{3W^+G8O#g7mfk*H#6yF_i|U4ur!7PzNO#<|d2n5A;wf<zaaDo^5-LYQ z8JLFxZf_eT=F{@7qYO4o^dx4Zh_r{-+(uvI5yM2q)j3>r3ffhvLJ`4;@uKwM9g93F z>v*Gcm#{O$$E#8HPV0eQ)!>)VVv0Ddtc<{Q#&tkNGy3?0&na>@%&4^~0`3VjGImGO z6k0DQGvCv{yZs0^*o2t|eAJ`Fvlo*B12vx@nIB^cl;p5Wa9>MX)OqvX<e&nxA-;XJ zhA9Uf@g$!_1j~+JyNa9tU@s-<sKbj%Kzrt~?9k!oN2hJ%@+Ci}2LD5ELQKI{;Quv9 zOoV5Yx!5hEP`KVqg+GM9GU~_b@1GpMyKLDXdBxh%i2<boB7bvFTcvWhDG`ptPp_CB zl05)C&I<+hr}m`0&kv+93EB@@C+A(ycqDFsJuB}^Ro054b6aR;9)bj7DuS|dnC&U} zc9Y>E?Koyiryo~rW$EWSu4b~7^{H2uTz%j9hODsc1<^cbZ2~E;D`<g<1{Jk|nACk& zL>+%K3YqI;optSbiJU1ws7Ak8J$y3+@G>FzwIOG)fztoFH6o(KWTB$Kz*X^6i5Kow z-Tu<1iWrJEk|8HPj$CHfoJ<<K2Ku~LLv*TLJ*rz;c6WlKk`kD&g~|z!tZ14(L3|j^ zCR|;cRE7%+aZB(pXrvGUeY<68y;GXA$CIATn#qB2U(HQjxxb4a9n+XyP$&9bVuexu zwf3fUp%$Mgvaeh*l~rXm&M2{JTu<oo5bH_~C^e@!a|4mWUP#N|sa~RK(2EqI%lkA- zze|2oq&V^<Op3%RX^r5j=H!V7NiBS+iGWCibS`EtzYD;I9|-^eKNCQP@7cG1z8OII z@n%591@IH?-&uwV_<?pd@>~`xfP?<BH*kQnx%D}~c{rCR))&K>{|)fd)%=Gr{+`ud z41*hPn0^mYRFvTuKSr*<w(=vAzh|}=BeA=P@q2>%AE5r8*j<FGg-gia;hfL!;8<t# zyFU-;?}^YwtZcN4SQq9)aI~}e(4T03oA6%;b;f=moYdcu{b|YJh-a4k9Pvj6{OyN- zA)aM`946qGJBF`6bH{(K|MOi3=A{e@__hB3kw%yO@x@bWyo_?u^!=y2I?v9_zVRX~ z0{q86TqJy>XR`Brqvu$cUBpGKJGeiw{_qt41?;i{z6b^b{sg<MhyMfC-|FEa*0-y_ zur6o`IMSJxIN##GyTN5Hw+MeC{knnRDF12+f8RY9<Ket^3FYEV1jjqOiO!=sKlsb7 h{~{g|(NDa;E`m$Pg#x!3XU-2FAO<gA4C1q2{|CL+_hbM7 literal 0 HcmV?d00001 diff --git a/t/images/Olympus.dss b/t/images/Olympus.dss new file mode 100644 index 0000000000000000000000000000000000000000..35c6c77847ce9dd342fe66d3b2c567bf0a8db932 GIT binary patch literal 80 zcmZQdDK2JYU}RuoU|?_wHZnFaP=EuF*uVe({(t{(U}|V+Xl7_^YGh)BV4DI}8yFZG J{Ad3U2LSuS8oU4i literal 0 HcmV?d00001 diff --git a/t/images/Olympus.jpg b/t/images/Olympus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c7e642af98d8102384202771bc0b6b35c8f46eac GIT binary patch literal 1573 zcmc(f&ref95Xa~3>n{pQix8+1c_F5NVDnm`X{*#gi&%w}lzI>%rb^K!w2;~oNzfQ$ zl!FK8(Zqy=#6JN40T0FlH%&|wFY4Kg2}jfCci-D*i8NfDWZ!(cGqXE8J6-Lw_TAb$ z_8_-Flt`Q<2N5;Wafy)vs$evOJD_(kTwpu&E=G$alLXDjNy)0~kKj{+_rSfvhk^Zw zZGirP5dgPB|HL@KjCHtA?zu%@hkssMh>{aGCa11XEAhm5B0Vyp#6~8^QX`5ff9=Vs zbRx#>N#DRkI!>{Gs;V<YSFk3}&(tg7A^-BZkcw==;c&zsh^RruAB>z2MFv%z^5qlb z99|^zO0W;yy<W?)NANt>r42hFO;Q7XRo*bp6okJ;@Kvz1Y4}JuC)+gEpW{9ir=Hsa z*jh2>3t)T2*vpD_9fJ8*4TAZ3oWg$v{%aLGy};xn@H6m3Zs$pDiQN3EDs9#7iftJ+ zehhzE@HfO;1+VkiZM&YE43q@(eYrR>2JnO5ALn|NtT)Hw53X@q#9tO#ziW6j5-|($ zon83ws+o~YFia#LU<)&<*9m{C;4@$wbC3<b17JI2#48#CJHUhBD7b;yNdXtZ)NCQ1 z6$)Kf_>DKg#&w^zR-LPkYrEC=)#()4ie{H{cS_}AHc?nux~ZhH_m>vSrQA|s*ssjS zGWl#VqZp?2>T-72h^gP-bvM^bxB3e<WT5LJ*B5pukGVMdX~wyYdhJX6FKkNLo#E)z zqs>WEAKUCB=dJk+`_$6v`p`z&XmUExG^LsL|D_pjoaz6oR5%2x^)b)LMzVNS_}!W> z&px`=e0hF@557DS`iU37f(BrMJNZ%&^JOsg#dtZNUsX!?%K6)cOm0!h<uiA)%6z7j ziE3ZzDYd#>o)%9}dwWm7+vN@Tybxb>h)Xm+qD%ZJk=i^SrBm^Cba;ba#T$$V`}>0k z7#$itDy(MH-jdsaciJIK-Nf9I?3T25bd98c@7Q)|2Jg3V>e|<RXhz#Zlj8#1vYRf^ J8|u=&`~fx;wqO7N literal 0 HcmV?d00001 diff --git a/t/images/Olympus2.jpg b/t/images/Olympus2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f817dca4416ece89507955c512cb025d379a5630 GIT binary patch literal 7701 zcmeI1e`p*<6vyA}?%m$qZj!r8+FrG_Yt^f$#J#IY(@@&Prqs~J#{Lil6(gw{u&ro| z6%~Tk-#@59EQm_PY72^p7JplcMyXoRe=J%>6n`LEL`0=l>H2-MZ|_FiYW+w5xk+~B zvv1$LnR)Z;b~gGj`h0q6(Z-R>i2D0aqYM%G)T}HDK#$;R0hf^O#FYmZknY7*R5mH3 zd>yA!I{gNGyzmd;Q$@!DSH$K4a24E!w1mv9R&0lLMs9Pooq0CV;}b6BAv^;*4@@Ik zw)BF5!Bs1QzW&AiD|?p)3ws9^E$<DIP<!4#(7U+*+{MAdWy=TKgMc>7=?u?Ufk-ro zx?vIjwe<YeS6?%-Zf#I$PjnKaI;CnD&gl-T-IdOu($O8x?XJwG!K+8suJ0e9aCR6H zodSDp__MTKo4D;RF4F!a%4*K(*rP5K?rUz+aWf4<lBY`$2ebn*!EcCEgxFFyBevBj zVn=gI$7vnAYIJlI{lZUCJc6s^jE=K9&gs~*4#0Ag=D^y^rP#U@TbE+%Qgocwao!$f za}Gyn0lGaui^yw<(=DkueFg)D<qAE->BX?m>0QXf>ANU`)31(?Q*G=RA}RJ5G>=^+ zl|rSdr)P9@*RBYSKAiqp<7lPLpa*Y?=fLx*`oqFI!832KkMCK+gKTEAtDPHGs}*~5 zJRjbIz9YO3tnQ0-6y}ICmeZr_d&pB`aaq5B-Lcp{w=E;g=Ci_ia8C3OLH~v^m-bI4 zN+ZLq;2ZJ$NAwPjOMNO~sK#TPJV>nZcuw+=wG+mGP6=;B&(mYBjC|C2Yn&HSvV`?u zGvv<Jxc*lmZ`zQ%24@V;8k{qj%V66FagF2R8Fr-EdL-GeQ53QM5DW|>eZ-AZS!b{s z+SH6DIK;DLdm1IlO2zk<FpzA69V>3xtI$sgPk_@_hLF%6M6P9N{t%qCTnZrn6r2y5 zbZcJ5eIT4c?Ly(5m|H!<pMVF2QAHite!UM-U0sTgb}3nVi(pH*3btjfUI}(o+|P;! z48qB{OlvX<AXTE-cOZ%^Va`F~2VP<lUum((d4%$s!#&198EhGB8|>H)^+0z!YDkWe z*NJDtQ&@j2Lry6}$6za!iI+#1vBBJjJCWBhbW$RJ3-Yw^9<XcZWDU+4>>2DE+=MlU z+xrRZG#m03vHvyXl(uz!_Jb9e{l~!ub6&11Wn$L8%NlLWX0`tBYzKk!)_cv9{Z~Ii z#QS*iv{K<+hV@I<t!jp;iT>gptBoV+i!v}Tj4eRdnTOqJtdsGyeh*loo;-kt!B!@2 z`zF@O*W0BGwhXqx+&*rKBV0hgr$om^-P2%x{se5gU>;M?gEOMf`Lkg5+3S$!gm;7U zqJu|NFt{kJeT!$ExDqd6cgM_SFa3&|DB)FTx+Ppdb!;%_&UvUgcm?=dl$e!~&pT{R z7)YMMO_;t($<1JH(L-36T7;hg=MDV=<m`dnkQc%4qjKMXliyKnzs=B}3>~(=4&63I z<N*XF;cc8jdX|5WB(t&?I!Bt7J&-%1e=Rs=$GzNxJ;fC{o6H#OgV~21TI|?Yn~^se zQ7kVQ`bE)SN_X0=qTdevHqk+IX_Ck}?_@B`E=3)t8S?4E3y}8&VQ$xn2G2C~Pcryq z;kD4GqA}yZNn0#KZWrSf>3-C~G32RY?4NPS(}vtNIAbtPcBunJJ_~&gyc_T?z^gy6 z`smKXf?gpY9hU1C=rNn2@2uI?uG+8Uqy37m=LqpTAkMRJZrBlqVMj-B#6V$XPNlPg zJ+@M*b|L<Y7EC7fN%od{DMu$R-+anG*E@(QY;bMuNL+C!VowppX>u1o<)OpFnL`vM z#CP@a&3Ccy(VrFG8;CAc??ii}-O&^3-sn(tL$pbisf8BEALpotYxms#$_cmK^3vF$ z@{40HJo`%OgSMAXx#G<~ab5f0QicjH?*pspO}QrMGMb=!urkEKY}E_;CYErUcn#;Z zo7e1|*X)yjo_CdZkN2eahPTiA&Lh9oAMx(+wtBm~59Ge=U++EW?eN~y_a(pVclq0( z|2A^`3>$pk?{9(R2QP>G)BV~0B7c?tC?ubGzj@RBdHw+IFY=%C_IO{RjFNvQG*<f? z{T(QUbDgMdT;PxRuW75T+UkJM65cx+q2Yms2O1t|c%b2dh6frRXn3IEfrbbEe-H4P zN}#q;6Y;4+kK*%?%oizr7E!MqpL7uMSw_3!QwqFy95pOZY>6)-eezJ#)FQbv8E<s_ zqCAYZzKv>$dfL9zxtqplrE0VI{D#wIYLazOzeoHzW6kzo-q`<}+uCUbe>Jo8w~*y? zyFkX-8)}%wDRumI%IDk3m&Pyg<skXexF2kOX;gCJ^%LZlFi?kc5VI4KbY9<vHEXU5 z)?cw<&82IHMy?D-)(l;~Iv5^WKQur3m^M*cK0mcMb=H(Av#RA8<!XBwp?!V_hxvWI zI`sWrP?M%k4W<R<QmNco4$7T<ou{APi413Voc(v%>d&HG{JM%iTg@b^pzMN*CTIyx l;o}z7;`Ct>d>5=e6(}4giT06iqXP<d0q^tA(TwP$KLGcqoRI(k literal 0 HcmV?d00001 diff --git a/t/images/OlympusE1.jpg b/t/images/OlympusE1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b48f233efda6d9f6f67d0a83f762a4927953a05b GIT binary patch literal 7365 zcmeI1e{2**6vyA}?%iJRN_%&0p#_p|YjWkcd)Hotrok3kwUG)zB>IPjnxa+(5mCXY zX+V^Oe`*7f5HJMLKa55b6Qc4XNcck|Ap{cxRY@d5kQg+PKfnm*_wBsB4)P=ZWB9|H zc4t2O_RZUwH*aQk_X;NpKTY_md-cE*L_IxIC`Lr(RG}>LK=0zH1lOWGfFlV`q5KX< zTG^yf@-bdTg7O@Ag7EL)NupzcvtsiSI0vpqS&Pb5mbSw>18+Hj9S<k(9d_v=WYeH? z&jh0R^B(D4@X&)^SI@mYi#q3db31#x7j}AKDqf#Ef8m1p3p*F}%zuEdQTOz0s1uY# zZLo;{V!3$f$`=NnTkd6NG+(1BCzSL3e4C$b^YdQTZ_78gwPb0*%7NvpdV0yv<$Xe5 z6pm`L0=qVCfOQuK1^y%|3pgI+2|9+dJm4`wUP0_PQrsq`3dk+B4!IrVPLM}}JR0P# z8XO$NSgeIk8HOX-M3ku1<vS5weu9ByxtgfU$KX*u--tR~eq-zM3_Q!{|0dPb*0p+^ zx1#oT;ho^d4Wnb&Bs|338FI-%;pcK$dq|J@2hewf4}jI%T1O!coZ)!j!Q+rehV{Kh z!0xcNkIqp{m|I+Ca9s3HL;uxbmp&UybRPUB_%-P69FJ^=v?uHPYR72&T03;y5r)VX z9(2(L;Ysik?Q&&w(dON{E~I1`Y#Z$C*6sIDH)_aTVUG8hAulsHZs_nm*p>Y_rsLo! zx=}>lNCwqF|1#eUMtIJ#tza%8THzAQAvlSAxRytNukyJi3?$oN$I`uOhkiu33mmm# z6ou|QuxnWXKMXFjT=F1)3|yHU^>_-*v*LBg(_oI0A@DdbH+GxqpjzQZ@MJKzjgKk9 z9Z;MK=KF3z-D#rFb8EWj@WmO)(b2tAm`6A1xwH=kF;L`z_rTr~$bIlp*cb~}cYwD* z=V$N&aHay$r6+IDPHt<MxNR#i?|7ul)Yam*_{H_<X6skKI#oDOIA3T{rwdV9TUf2S ziT}E237R^Xpk$H;sRo9NG0a02^!|PHQpx)IA=nZ=0=8v6{uS&f@kA9@RYBd0td9}% zVEIqhK}2v*c%hHV$ZtnTxWaG%#e`eIap6DUiiGgogRpOF`{UtJ%hvYcKyqxckGd3& z5>Odzg(C*Joz!(ZP?wYTX11l-_h+_duU*@V%Qv<7ezqC2+;3^VE1&gq#VZ<&al+t} zpZBwVe&$T>&wrQdVcHx!?FaU?l5zP9Q^FGF<qD1q#)6|PoSlJK<lJ_$wGN{)*b-*@ zw!!TG4#-9jsTd4B)<EUxwReQuV8|(A=ooB8V#T^P7$HKZQP(kaA|gKrc~tlU*fn%w z2FDFf7+h}fn2271F2YWQ$b)!|>Xk!bUfSTG-)Ix3_3PKH(e(e#10T`V0>={PimntQ z#2Xv$DD7P@E?c(7Td{KKO9M+^_6C;qJ-O8D?_1S3o9DY3wK_@;qmq)RJ18J(jc9<J zqu~g29LSlEgCmB1ROBZhcZE-ZV}?$d!Eu8V2A3Pm?ck()s`;OJ9Ry}?!ri7()rXe2 zI_4L`i^lRwFLQ@?n`Ah@uuc+UjCZX`&`C<X@vT!5hg>x+45TW9tD~|8qQ^DDgIM3j ziJhPau|&`YABI%SrX*}E0$VX1|Eu^0vSyw~d&2ee7l<v9?*`k#Y||0ubt5SZB;JjK zdxCj44w<jrd|&$Q(vtlj#do#$W!v`-B@XYKwdY9tkB55qHmpnRKXvr;_D8Sw?zOz6 z*XH$mJG`&GnueZ+jSW9E)HH5xJkz-Lj>(y`*-a;jJa{&TI~n7GrwNYJkE6?@N|@XR zJXmP?E6x{=4d!+>VGtaVJI?b?MC7gLBtMm~&Sqo(!YQ6gM*A4<Un~#zFRoNBHq%$n zUKtbaiO{J4v;RggF)D>GfRl#J6y&_TT6ii?gO8yzjo|QI2bZYY(614`{0uHgjPa}q z*YkO3Pq?0Q-H5GY;BjmcZWxo0$Ar1hWrjR%Yd;*q%SA%uv!GKBW<M+1X^jDMJU<Pa z6-M1ksq4XLt;o4;b;4X{JecEiCF)Kv>Rz*tq(^<Oz<gg$mLa#(dUY9w9mkMI(z?G} zA&(kz*Wj4JRHOUL&%32m@<7Q0B@dK5Q1U>@10@fXJW%pL$pg2?17G5ypWjWsjn*fs zsup+rn^v$sr?Av#w=3_*jrrS&6}&4goHY|vd~d}sL3lsG7gznJ!ygI4U&c1!LreI} z*fy~F%b3C&BKK}L<d!ggwh7XG$oX1W%6FPoPrbP8@#TF3&zfIq3g6QkRGm!LrR$o; zjcdwf>NB|+8KfDr^PFaPbq1;HR!P;=)p--WOl@tZHREMkyIQACZAFDS`8l_$HhQga zkWw+c{l;w7NLEVODOEU3_v34k?olz1UMInCTE(jZsp}+#5xlly08(~}?xs(vzHsty D>Z(jq literal 0 HcmV?d00001 diff --git a/t/images/OpenDoc.ods b/t/images/OpenDoc.ods new file mode 100644 index 0000000000000000000000000000000000000000..e3a0ad2b91a898aaf6e8fbae9ae4897afa16ba63 GIT binary patch literal 7037 zcma)B2|SeD_a9p%2~pMvWt|y@WP}p3FWHGSX2vubGh=4#LYA^`StF#fFO`&~>}4rS zg)C(aMd&R{mg+w<67|#jf3MFxpXc6t&i9^k?!D(Z=P=fzqvr$wm;iv2x>uEhG0-p& z005x;$U^{Uv@??AiATclcnlg2BcX9vup1Tu!oi4WA_#{^Vi7pFt1}Wy0uk{9Bn&}3 zk3^D;f5Rlh{A#@9H+3A=5sh*sP|=7GFp&f!xe^^<1n@c^6B83vmS0Td7qM;lU~o7R zgCxV?2w=D?fj|+$!x=*dFxF$F$PS>TJjm_u;&78^{}jg&gM*Qf8^UZDh6?oav7Hil z9NraAwu9?WCAQ<^-)1#D0f!<WiCfg)j&nOXDT{3y?Z0x7a5&7ra|v!ECE6K=LK49z z(IjUWp7<~Ow2RCP$6-l7_hQ_#E^0u5?eUTn3)lO|iGIWW!b-Q8OmSl&?|%CCz|6c@ zgCI_ZxO*RK=8WSJt+D(JYTy~oU3-R7J>~dWD~xa*x*)@Ig`H0ntbu}Y44k&8EJe&! zBf%e{xVVQ^8R?|-U99MA&)b>!py~RNA%=UqQZIKqo1_SLKW9$er+>*nz{qu{W|J<Q z)ZfUwZyH2UcudoTVMHBG`goTPG|&<K#vktHXr)5#T6HC-PglGvO%Q!;<!TNQ!<wbt z7O%!!y-7ssqU~Nk^D6C{IAIwb9ev+=hT+QrON&zqxe=x@!-3Y7HpS<!m=E{bUOd33 zCn;IRC|4!_{BDU`nfy8SfDbEA(<a3ySXQP<$#3m)8Z=UtV^jJr_V`~Zy4N!Cu=Q|w zMOejH<M-+t9p$|~>BntXTXQS!D!Um=Vl|-0+We!IZKluWiv=|dHrpLnev~!h9#lM6 z?<B&X%+x+t554-Rq}&3oss1KRIH0!Wp^smP&%uxMFoOodo(FxmrfV{eKl&sh?#2*~ z3k(%6gg+^RJjK-`vP<$Vnee^de>mf~kITcJ#}96r61+%XyIH+ttQD9wp?qO*`aQDH zow<Iq1IGRzy{bDhxfmxoB0g0n&kyLvKj9d*n1)35-YB(kB<aCuBh$NhEUapd&ZM0m zhrM*`;|%=T8QDI}pv6C%oe(u8ZJ#P_KN^jAZHK>c130rAdX^-L;@93`+yB;-+w8F? zyYFh@gO+0=-1}Hi+Kk30&lWExPgyq8FiX=d-Y*I+qtlS!Z!-0BXnvv---!zXK@P+I z2^hEXS#i>602g*GE*+Hao!wPs#W<xE|CnjPgi9oBCD>1HMa!-0yR<LYWBac!-jni8 zZH^VBEzY#)jOE~NOdRWMUC7_llaEQ~_c++1%cav45qYaogzo9iJK?rD-gF;#_0b*J zNqVpDe&CD;5aO3om^5wgH<tfGuqCC(G5bD`-4K(yUZJG4=NNnANC<oewmh}4BXDTH zt#xg~bdW<_BL*dzTrzOi<?Z#;BhTnqB>HHy&#low3vN~ENa~6!)5*c~T0lkVJ*hRt zpJKJ*+dHqyH_p^(O`&|Q^ENjzbaY>pLu)Z>hz;De>z)2cxE}a5-XTSWw*0LrQ>V|s zIkivTEs#R2%#lHDv-xwN-BAmMUA5)|wIcHq{P(Sc+l2UUiOOaV98#JOjf9ML9-TA5 z%uni(8U$=+QPtmv9IKa&P=-xW00DjurGMr=%?eVSrbV>JZ~+|vV6<n$X>R9>naOvY zNb<xWi4=GH)_NK{puqXPCWnnP^SysdT-t;1?%ujPFsn-n;$EJBQ(1_tc=4Ecfu+fG zlu?;j-$99&m3^lNxZYj^=xF#(rbSQI6W`emy-DgCfPt6_dVC*+`0TNic&2S$_-$#< zcTe$JYTKUI(j7WsS0ip4gi7%+d1hL92-$`<Vv4_Aw%n;65OV9}p?#tHdo9LVnGe~K zvJ6tViZI3HJKS#{s!k#Xb3G6XpPe|<Gh9r1`og#PPJMt;)hIMo$_IQtrc?-tj1=X$ zQ=W5c<<8<mlO7%J*`?Jd-wAad>`x22CA+Gk@Kbo#hP+cqbclq-Qw?tLXs3go^b1>G z=7HO0N5%yvO6>wgc{R%>tN`>;1)mA&S;hL`8n-7OKlXEpy-CBeXIw||zA;L8hVjj} zb+qf_XqgH9dN#P^oaqmbh0n>BkJ6m<VBW>L&^(mjtIVp;5wcq5JChw=lafx)i^_Kh z%zu~m=?HCnL}%1dZ>nKB>0)6B-Hmr)3IWWSwVsi;yrP=7jBa*mD<^4uUQQD5Kz-14 zmD2O7H0v%7-lzQR@Qo9bkf3|PSv%e6=fFNCk53<asA$#2%+YfCkXg*Y$qNfKdUrcN z(rMaADcB6NT3yBuHOC;A<50`A2i78;0nor_$F(F_A!#OeD-?pK6IH$x+TL6A8=<ee zl$kA^DLRk0oeRsqo>|K^LGK{Fs1b4?>o6o(viD$2aO->nqrN3iR<HN2oTb5<<l#?D z-TKON4bS^M9T*R~EFXG4828!P)If&7Xa8#D*nQ-oYj<W9s=K^ABu)EW<)BuHJng5| z2R!R9U?o2I^4&_#Uz0o2bUSk*roxsZ`D9^!d_0qaI5(G*pXa=0q@tu^{zJG#C(~1F z0fdIOS)S|;$zin3f!p1kGW)tFr^h|pIl}U@)EElQ9S<T64ng@R7H=QtWXb$)d?dDj z*U{X%tEuQM+O<E@9@liueAmsdzT6f$uV!#9#svdjE(Hxx_MEmd^e5+xIff38cM6{w zg-R|;>Tt#Aj?%t^n6T}P4J*5`^SYr{Kb{r-0oH29ui`DxXZn#lIMuL?6nC^Y!x%3< z$6bb5`R87*;d2GQAInKM6^uvY3+VeiShEFljE=Xz_~LuFiUDO%q(!(`7*(~Bo-!@- z!wfqef1AbeVYqViuwLKF*^9kpTrB#0OYymG<EN30^PK`&yM5QjZk|-NuWD3xH8_J~ zeB7wKS4spL)rrgQUE^6ASuSWf%kJz1P5eSfKX}e%uzGUVd<numUy-3BV^DH&QiS7l zoXthvH)cE&pLzm-r(|^R?Tt}s>B2|wwipWalX^}q3{{WaX}Z;0|Ax^s`C>jXF=PCC zHGF~PsD283h$r<soyda2_c{6reW`9xP%WpqkX3`Z>GPJy=B%YMr&?2tFL0HEwakVY zuK~-~a!E5eLQKSOE&HbL1^JlmUbY5)Gfnw|ti!1A`X%Z)D^8Th%Y8Y^TkD+nz9dVw z1ur997A;xPy_UY?TVI~V^|UNHC&Zk7$rNN!>;&9oYJr)REnb=q+Dhl?9?`PT&>hqG zxGYVUX-MeY)Z*I*Y9afMACH7xemNbo|Bj|hvBFCDqu?dWx#ak%86Y9h%Hx{JvvI!8 zpgflVc!rT;SbfBMU`@{Zyz9rF$}M;r-w!D+e);m%(Mosr58%k$(~hbHdTk%%6XO*% z*BQyuhhH^$^Kg?Hth9~+w9zI=QqK=H&^Jq!MZDt`F<hbBO^y0Iwx)x6U`d0?r<quw zzAfqU_X!)n#xoCVp6r7M4!(Kw#`a3X6Svz36k%-MTv`M7Lj5bg$XxJxdbEATiC#_f z>}qaEDm#Afnegjn>^lnzCl^aa>tn?P3A3q-bVYL2c2Pb~tA00lQ-tS3XBQ9frHRJ5 z9h_KhiWTun^wO&g+tC9{s}~cKN`B2R-nm!#5mdv4Q^P30V;nb{u%cIVUz!vD<tl0? z-KwJDXo0BLsJ77|<BXxB&n3YhX%|*|9m}R@+xjhAtMQei4IlhOoxjsiJ{5*fHC(<h z001H6VEFg=+E_vdSV0c}P=3@D0!e~VJ`~Ew$qyknB!NgyB2<KBK{CQZNGu$OKx0uV z!sceDfQrJ$RhgA>j*e(JQfVWv0Fo0Bm=Kv2OH^8)QW16~V3nvDh!Pg&j3g?N;7VIl z5v8rvO4NncM?5fStdolHc@hb)1O~giyMx^2KsW*lEDMD~!PHsdpGzU&zv%F;1Pql5 z0SA*44ob2^1j~YC!5g#`3ID556xyvK;c&QL3sH1fSCP6LL`Fs)yx!kf2}M94Fu&-x zC_tu_1EatQ7zqY+LnGZqgoS?Eaf`tr!a`I4B@zLKB|72=&eRm_7arN<<eZL@*#Rk{ zP=#1WA*%}kdk`@sFb?4eAs`$<<c_fF#$HjBQdOp^hQ^{vXcz_vCntmC#7tF3L)%hl z{ek_tA{?d+-j;S9fyzlfB0#b-NL7f8tPD^_9w-Ynla*DHRZx<Lf@I}>0{l*@jDRbV z&?F2}m4qacl)=BclnJ7%!v!Rqv^ljgK$%1!iEsiMPswgK3APTdOXh_1bjJ}8KS`)6 zYz$FRwvks+Nk$$dCqos6st<+m|FO*$iuHAo2(nGFC?Miz&a7%|CL^OQBWoag)byt% z{)gmuPPiwW9ImO#{z3h7c%Amwg`?!-Xd(#>7ow_2f;nK2Kse47OHvV*6J8%AXWryJ zULPahV=5tzYT?aM@XsTGLSommbX6nrsWPHoZ|d2S13^SB(O5Z%(C-uW<fNFgSztMc zjI%66^rR~qg8)M16*u;M6LDR1S0a)CL?9i}SR`Uy7K&d`5!NR=5-brZymiO6(yA)| zykANb1vY!XOhFy~dsTvxmYbb-b#}nQ&=?|^wDAhUV^PyApNNy=aib3B&J8cj<9E`& zT;=BG=21-cFU$^p(apl5zdIcib&!iVcoy;wY0RcLT)QY%+5Yb2bkMPDU{EhFvBul` z`ac~KQb|r>sb3E#x)r(@#+rKp+4_7P%+8yIFrN%h-oH}%&Gf7^_b&Z7mh@s@&~zHd zHEQ`oJ$zWpi!5CQxd!rg`B^BDJd#8?T+~>8#%73^s>tSBQ&Zni6=>jV+t4_xI6EI# zb-#^U%>DIIo}LGXPd?MGZ~QiG<o`jGlY{Z*AnCGLbnN_0(}e|e+34suc(WHDTb!_< zb;Hd|-E_0?6U!G6Z`+P94q4AN)z}RabS~oQ=EvB|r}T_<-D6c$()5nv4p`qE265=z zex}3p(!4sH{gXrT>ivhQJkK(eA+3U^dTjEV%VtD%qT<FxIHkNje0{N~B27!d<+$R- zBMD2s7ns>=_;eZHAt3Pfb9jfzA4P*v@Ake{>?!}G{?E!-`1MO`IYwMTc{s1CCW*4x z+Xj_<%q{LE*5+gB(G@vyAZ~s780aaB7r75&vA1lk$LfN=i8QDB<Id$h7y4m9S5_S0 zmiEe>@uoeEU6E8uMjGpq=G+z0DboYBBJ@bT7&D{O3a1#8dS@H<$4zHym`L839OBK1 z#KErxBzm-mE;c!7WbCOxh;q-eUwmby&G}F~?`7Q&qj0s){L4f8VoQuWam`$?vyHhc zK{WA?YfibG@CY>SIvRY|!Co=9ZG1VthGs3a<oyoFJkLl0?~-C$?XGH|o(0XZg1zx{ zE&~a(v<n;w^>;LfOF~9$Z{Fv9A@N=X=E8GCM2TO1fyP=bKOLNv(d}=k>|_1X{^jYM zS1$~;jtR_=?!S5wNSZI-(v6GiIf5$lzqtQ|#i3jYb;P)T;6mO0=H7sim8_0AJN`%9 zj3t-6o%BuUl4zS7iu~^<Th-eOL4@A$f_Gl+eDmCrE%~1$*B$X8duo3~v~tc11|&{9 z1BG&OO%dX{oh+}o<Vo#O0+aKF!JbEk6QqQXEGWK{(=Ya?7kbY9PY*zMS0v56)AAvU z2*RfaBeW^=nUBB^92&<&uZ=}$GmM8~;mGmY*96N(1xMHplMZ+1sKV}|8?*@{QhUeM zM;?2yckWIon?FNaa(GCdMEKewk}#OK>U1g1H*m+vE*YL)JD8b!Oy*)uR;yrRz^%P& ziB<Vd%lnyBW8*&!B(F*y=F0QoQyWY#wJ#;9FE`k6vN0@(6^vcZGE%^23`zQqm|lJv z#IMi&>P&e1=dO(MWR6+7)$aJA`HAyZvT~D7eKcH29k#oKM?SubBM3i8{8ke_w>$1! zb}8LEj1vY0xixdyRQGD%ofpn%4o!@=n3|7J*qV*b-DTSrkIIK<Rx=hdrmij>2p@bC z>R5R=;On&^&IWCNeR#=&>7o(TYc0N^PSis2(DUe&_8t0<8m_z*(@RfJTCtt*$3Nej z5>49x4LV)=I=2lpBd8jBZ(4O9-w#Ggq-J70^6UjUsmC7vH&?(#b_E8SW@<nk!&6{q z7#8hF{)SS*wz32@Y=aP+<`Ojc$zXO{{=HF+3%ApSRBGv?1w>gwc(UFtK8cMhcQ!kc z(03_#Xf;CRPCq}RDZfmN+XHrT6+^sJ^7Vy*qoeTEv(+JOUUzwGr&vR$pJi&#SyvkJ zu?H3j#ANr^`<s>KU)LH?;$pmS>t|;loxPA%e(9L=9sOMmdF3s4x{W`#z(s1kZ*t*V zCH6chYA?Q!pWDnBl(-lojg4uUNW9u)C!alEyLw9dpkNpw<MRY2XO+919W4=hNn}Ro zU0tBbc^Lz{7|F{r`-Hj`tE9p+<yg7p>K=c2ks~PTSkL&H@s^LhS48^m_VyGEUgboz zsQr;W!x9B!YKu#+g0cjva>6Q2OzVaq%Hk;Hd;H!DAm!y{zqYkwNna5$j!mr1G6Qv` zZ<}B!HNH3>9*e<6V#6d*8j>^p*`_~X&E-t-acb18X11!XLjwSuXQb=}4J{|&@1=M0 zhHPmYh4??YwvYfQb?MD!Mt=RXw!O8~zP|d_0?$UhoKkGxY!T$wKXLw2djB`!DBsG> zHb#E^6Lhoi{<~o|xd4Bt$U`>epD0@k@qfpml;Str>FscSE6o2L>36-tw?W!0)c;qM zx@}N43-^CVp_J}7+tM~D|5M0c2irIWTMK}cQvPO>Cm#;@W?_G0r#Be4rh}CF;AZ3A zv9(&b!ME}6ia(RZO+IyUa6$>cC_ZR|Yh$&o(arDn7iRx^MD{1jR>w$*gf`nK8D(o+ m^e5-mYfN#Rn{9^N-PVm7>oJfG0RZeF|IL!UvFCnD@BaW_MB>o^ literal 0 HcmV?d00001 diff --git a/t/images/OpenEXR.exr b/t/images/OpenEXR.exr new file mode 100644 index 0000000000000000000000000000000000000000..52b33a385b08715cdf900e11c63163cc656628cc GIT binary patch literal 395 zcmaiu!3x4K42Cn=!J`i%s5=WXJ%}e^9(Jy6#sak+Ynk(=Z*H?8>V}xmBz*b%x6NV| zO#nca!Wh&p44RyWLtrUHp>lBNvmKHBh-4!I(q5_>og-_$X10u#@FFLp>=n+oO$cUz zzJkBTDn+i+;`Udk$>6b8Si^hb`%qDfI&~FFp9xPE3T=gln0IjBI9Vf_-hPM12ZJUl eVA`$w@+rwl`Ep<Zr|zL%yyUj#e9VXWi$4MG<4^7Y literal 0 HcmV?d00001 diff --git a/t/images/Opus.opus b/t/images/Opus.opus new file mode 100644 index 0000000000000000000000000000000000000000..4d256e0ecc49ff969a94aed01a20c0ebd7d83b42 GIT binary patch literal 1128 zcmeZIPY-5bVt|6<H#9v#Osl!)jTnXf3rdSUQWH}c8TFVB$bpskgOtMoNI4^r#~aJ@ znC1Wf|NlTbLK4%9xq*T?nMwITu7aVSA;^4HAa?b0_IGg&vIU8!<|Qkn73JqDfH=A( z`T04;3I=+HdX}ew3VmHe99<kk9OIpQ{GGky13aBWLW5jw9YLTRMC24Cg}dcN1zVOU z<tBp!ydsS(jiMqv)05qEvOof^Ai@bmKuHkGE!->A)zrf!Fh9{b9VB4r73>-m3}Qjm zLv*;LdX^W1Epm>`F7XHg$`|GvWch;in0f`dx`n3t6=Z1#Xs4wI1-d#082Wo?d!$x+ zghznPa&*mc3&{>H4a{|R2Kr_cjE2Cl4*_t=z@i5&N<bw8h$&@IxRa52#{Yi+Zv1N_ literal 0 HcmV?d00001 diff --git a/t/images/PCX.pcx b/t/images/PCX.pcx new file mode 100644 index 0000000000000000000000000000000000000000..07ad09f2d423e1049649bd07bb110df241ea19cc GIT binary patch literal 160 zcmbV@%N2ki3<L=w<U;~&S-M9%(qI7|oO%0pFKYx+5>AhFtu^P22zMW2n3<}I2s8KI YiKw-Ph_zM#*hiG|_TE1@@2h;}0fbr>;{X5v literal 0 HcmV?d00001 diff --git a/t/images/PDF.pdf b/t/images/PDF.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bec9652220f6cd459e95432a2ada15dec82824f2 GIT binary patch literal 8907 zcmc&4TW}j!_3p~gICA17eWh;a#%ZF2LEc?GY)Q41+HzbgjT+ZhnoK*utX3;|8%e9| zu3|es^u^<gX;RAY7&>VReDts7@ll3>K42LB+5%HrU}y>q%+NRGF~f{G=kBhwE6Yv` z4Xmx*d(Zox`#fiN-~7yMSQ?E6B`Q+Aa8GbzA}Hin>nas8vL#paa!{C;%c@BuK(IiC zoNCEMz|bhGr_({TRz${_M?l6<WlJ~cfhj<#bbd*<baP3s)A3R9U{GLaO|Q+!mP!xI zq#~ji7ssW96pM<ncvy^uL@@+(IlXu}l6gZfHWamksuJkW$%<A()dzzuL$M+Lma+y0 zh1;~EN$-xcc6|b@)EhO6N*+!`t>;7s87h$49s;w~q9#x4EA(!l7ij|iK-_|A>J38y zPck2$JXW|zRV<4B&Q?V_#?+!R0otT2sur*d&^r{+&;c2cfyj(rvp|_i#~Fh#uc?Zf zt(9~piTS(bZWMl0HZ5?ZR?^hsX3m~Bv@_Tr$g==VFXj!cP9-WFUa9Mbl`%B4zDi4S z#e}i3D4$XDhFml2*mR`{XQsAVny_u`+*XRsS+wL@Q8tQ<aaOCS(BU#oGCsiD{~xps zK<x}hRP6TDqIOoLk?~{#e4*CL))JMlTNY5iX~9UXZb?jMb6s5oF0M4p6T%aIm|r2= zrs%R}S*ui$>lTdHVg4-HlBLUr4t~<CVO}Exx9fCCm5UXvrVjH5$k2%;*`itv1UD4q zF^BniGBCfSRp^{-oKaVY`Qv0Dw@T-AQ?rHENI%qJQWR09Nd~i_Dz%nWY7dxUzMBl? zRnwx``Fw`fHN|QeplqD<!NiG)k;vFEe;4VyO{<kn3$6SV2^_0|D3$bN<Qh!ZVZKbL zZJ9}BYGKb+HPZz9sG*ir>_d>ajd0R1zl-$BRrxGP!*aKVqYq2{4NI$l$tpBy3*i#O z{B@-7@QPN->v{z%U1%g00w;6x!@NayXY~52p_P|lZh)n*4m7>MJiZS-PPRYFzx9K! z{rZMy&W9cqFI+PBA};V}hFc*4c+SBeT>NkOTh`uOdo$3(F9gcn2Lk_sj%s0F2KRGN zFT#%_fdF!HpI(D9LYvo8AGwZuh*fD5xURr#c!PnrGwmn^t$-)9eLuquwiplHO9;aR z84O3$jjVp1zaDsx)%)2UZk(43EM+_c40~|Nvg&3^5LEE81zsN2jj}*HT#PHUopC|m zII@|gf%jQ$jtHd^U@CC$VGz!NJoc5ZHX#wfaO5tyyEJhI3AZ3<U*I25C!|iuTE{E! zCq#Edt^GGR=9@m0O|Y%dPW~4A=lJbLfD*!HGNav%)xbF1?Dk-l5R`yFj>zl|x3<gm zAc9?LABmU1MK~s5wbrOq;DN)lr+|y83Cq0#HHU9Ou_UN5L-VjNR`gmK>g+nImMm|5 z+S02|oi%*{=98!1V^%cSRqm`DHG!S;>FH)T0PlcbFRNr{JhFSshTf?AKs`E4SXj(z zjVkbLJ-mq0k1-h3gL1>tZ&hom0b2!5G=gUZhd5{xBLp$oYMH|0O1D4IFe>@OC-b1n zaV|RF56PKj)d%U3D^^}E`(T5L3ViB{l{M$`xuXS`Zz!<O1^bBmmvrOoR7EShp4w(N ze$E90XKzt0$&HEy#r`v@VRazC(*^s<2MXnkUeOJYbBApC)3-Jez(Q`<Yv}8KORpbm zSf=U@48#R1Fp$<kw-$5@2GlzE09&Wqz-$f;p)kTZ>(nk*!+~qBgL_#0xJ^OGHZlbZ zuucj@C6vsQB`90)Gg%2146^ew6qJmUQ6i#1do3J64S^%s?8n$t43a^PXVd=)fNz5` zE~QVyZ@UA34$3>Y02>b2gS)wIR(=V}*E{7`p?tuh!C5K+FE;IU_(h!Z-=Tanl()ij z00iyiZJ9{_<@<SZJv^@gxc0d&CO-z{zW}oB)IesBAIZ*UkLJiM%&U2AB@z?GyL7$k z>?gQ`*<-iEX_?^JI3<p!qy&{>si>HW#ffJhB^z(CAapnR`u%p>4X|tE^DX;BPMOW& zhkDscBt|4L@R03?vq0bFl)nIF?wn1-fe-j|w#<tNKW}e0Pe7SJZ^NI0a=?K<4dpJU z{4A8a9h#p(x%a$nPd8ZF@078>f)34#KtnD#wn?JMU1;?wf5G-Su809odGMlb!z;kM z%_(1k^7e~1FCGf6ampy3Jl@Ot4&j_rMjP<@Boxp;&;?QodO=E3DUphfrD9S?7_R@g z`JV*A$hYM1{}js1&(70@yL4~BZjU<MCvH{&XKdoO<&NJJ80n7RX()TgFUQ;dI0A6q zDFZ9J+~MUu;f!pbd)?DAI}hV=nVpiIBQ(Yr?h)EOH)D|KJvW~Yo(|$s8-pCYD^)v~ znbCv6JK%4<CO6ECMqK3>__%uPz|#pAAUJ3gEEbBg=m11R=wsCN3Wg~x5D5wpG60MU zGnxF1s^~>ED4fuWaK?wz{+!B=o=}?BEOTBpGJ3TR3nqkW0AuUuVqI1soS9M2z%I9N z>vStbu!Ff)h_LqZ+V9BrBeU6A!tr<%1aGdrNe0=RCB=Ke)7;vt<Uw-%?%fA(I5@R` z|J1Y~2-BfqxI!b>;59O|m0ixmuC(8|8x9_f?T?LId+o@s!NI{@cpKbhvkZL@0c$@Z zLw&GR_64{R!VhtQA#UwAFu}RC=Q&ui0-SrX!NCze(AC}3+t<Hkz(ug9jcp;f!?@xC zQ19&tzzLj-1Lsg+&km_;>W-0}^6AKZ=boH?towy$cD=o@*N7HgyZ@a`?EJ;2u6l9t zCi7XP=YfYWz5Dn~zPK-b`0D-E*m3pS4?g!&<MsDuzxa*MeCLtpfByTwe)GFO{>2~O zzq54avtRnw_kQxrKmKh9RFZD4r-y^-&>iRz2sgy<2}n~r?vPL4cWz{7<n70v?0V*f z*WQ_4*jq4mosZt1x#{9lvBeq1eD=i$9)3K3>D}(D_Vrx7KVCe1e9YQR<=QJ`Yk)Or zh#VsSeB}5oYrpC+e%<6jT$J1ajENBc0B+_;S|j*m?kH`BpUu>X6Mjw{T7hwR3PS#Z z3TLm$&|BaCVTfwQ$<T>-PR!La>XJ5h)=(GE-kw*^o>G#<(4q8}i9<4GSHdfDJzQeb zz@)0FOpat0Mi9M{0!$UsHFTv~shO#j$q-{mK^eh9h%yrE)MN+(Hi`kpDGfrk(ZpyZ z9F2aQmJGS7F6+iADvicNAkrw7QVWohumwVGGK3)tL@3M4%cILt7N1DTWKs|#LL?Ff zim<s_v*eX<&D;z6m?7H9CR@!MWj2i}dR5R)3eu=3fTAswshWZ2KoSC@WGcfk+L{bC z8d@<`7)wgULNppKB_ncJl8VW2GAYNx2_>N>B4bHKiin{t)KORWnCa682v8VBg_KV0 z35O{_Qd12J&URFTK)IsHCL~S5VIKjkN-T4;F-2apDv%&(lQ1Em`#f#>sN3mg**bf- z?xI~MLz|m0r`4vLlt_CL6cfV6WazjSHe;trP8b@j$>~<2#4Ev1)6Q?HW!+d!OMVUq z+D5Edt7$jq;iE@H8!e{tK(3t)@ew<iHhPweK_}Q*86Ss@^D|(Yl4Uj3Vj5E&VKEYp zjCt9-6n@@0Cw-Lmq>{XxO}w8i>&Y>t*JYi&0(_KyA&V>}na=K)>$-WfH|yjT;83-( zTF~Y+<e7Yw4Cp6hc|s@KwBRP29E&&3MtP-nmf+WN+$durGM(@;x<Djl^V^*RsS|1e zQjeBe#nV9hOl>FLd`W1^bcXh2#kG#?ms8w%A@NSR#YVkeVXcrWkg&(;0|`1D{`L|& zEtgrvu2r<OliITvBd8-~6UlOYol(u?pAT(U93@`QZ){gvN8F~a!VUw8_jX^{qOaU? z37cc*g%S{+B@%}XK->j#otgGnX;ExK;AzVyR2%iVYsml2VWxFNFKq5I6A$nLknL@4 zzu=nbBb&1o?s4{DMw<eDSSL0f!xZ;Xc=2GWsBSXkzHearIF4p!X{rW?7hJ+Y+=So( z*(089#?JU}8^vu_{0|0VF1NXZs@0Z*a=Fxut~7Ar%Fd+i6J1eP;8@h!h?Rn(MC7qZ zxFki!?E{jm#EM}xQBcQ9<I#9LqD~0VPQNfXc3t5!3aDJbpv>I7y(|}Hw%Tm-_!jMS z$J{t;R3~a&<=QWIS7;iQ+IVHY(vB%AO^?(ep~()?MMY5UwcUgTNpjp#R8orldbKq} z7S+@Kh1`=NvMu+GbccLG@XMNjYO!_XZi%0&SU&N1uufIvT6r?G5_XcDp>$i?tAk!g z4%6GF2zA@N{$bU&`mFsO(`77ZsYB%!p4mUF?saeFE~B!k1T~s=9MRIbZm)J<uKA=k zH)~Yh83WOr4`ElDyR=WYjq_|x5S7?42=pN26PjV9Jp|e((MMfptMh*#6vAOQh=#1w zWM~;e<n`$%H&%}(BMCQtck*5M&e;v)-Fz2*)8Nf_trzHi^&q;^R^WYVP^3~kC^j!T z7LP~cv_xAl(1sVSHDQq$80Uw@VvurdgNfoe==9TxQ4#WLepqx|T1OWh!%Ux_P8^Rw zrq2&c#Nv?8^TVR?#5!A|V@dcV!cP~ACfCs=;Jc1?x<p*^*bHx^;oZN%zKme+>%o7J n?t`xySQp?I2|9d>f!%@M1elg=Sj^LjcqAFzx9{+=+2Fqc9pW#{ literal 0 HcmV?d00001 diff --git a/t/images/PDF2.pdf b/t/images/PDF2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..76877ca4033370021e71ab04dfa871337fbd9c6c GIT binary patch literal 2213 zcmai04NwzD6utl=-Y`WF6)eJvCd5HWF60+9lq4eYm!BXw0yaNqI7xDl9Ew<4s$$hr zD{4`(SeyYXiVE66D-6(r|Kdc(Kd5N6pcZQt8MUpJbT5#qWNKe#vOC|tef##kecwA~ zoFZmA78Z^&TYH}NJp8u5+}e5?<pC}rHOtW%GXQ5EZqid3fDfSrz=<IY6mEv2K~3Qb zTubV3AeEvP%8aXxXl`ey%0tCgaleb>9#wG#qC~Dp7|))Q<dJ+f(drdDea?dE?5XoF z#<S169dJ4KJ~C;8doPz?6Bm0a$@=1=K$UgwKC1F?L;6RJ2|{s`Zpbd2(eBVb(4$C1 zuhBE?4M$b0vT(qOQ|s;jX52&p(V)`_xP{CyYjFz*9|Yv2iGu4EKwlKzYCf(b)G{&` zUBZQc5aR)ngqKENZ0H<%pCce~W>TAoQ(y@^Oc4V(N+Uc{HZ;nIMkPoCoRo!{<+zpt zbQqOJ3<&7cP^t6{!!+bDJQQgmtpzxP*KwHOB<5%+`vvXC0ZuZZgIN&+PApF7GbkWN zIdalKniI3sS{&kb8%lUha~4VG3Q*=87#JBrS>kZBoHS;UCOSmWf+MF2xoR+@&_zc^ zZ8vN`A?py|(WCu+{6of%58<(bSiCS6lrX7)7O5iIE{b;vW30bF2mmZUKbDXMSVDy` zG*k#T$ON)?ZF{|DYeu|15cqRt1S2lq3|DW4treMzFc`?&;_ieXqlfDt-cE?E6Y+Fq zK+CS)NEC7m39@xKzdt%Nbh3B?%<(WJ&iTXWHv|*70KPU(G+izxI{q95zJk!=3A5o- zaYX#TswjW!!dTz<fHO_Un6l~-I4j}Fg1V8(?vFm4Sk(25JYQFxxzFS1rN)klWo2cz zE}EEuvJGL;*RYc*mz5FgM|w?k@$z1yNeh0!_IF#eW6L8^c>V7iI@gLGhd0@pZm<3z zjcqK=D`2c@8Fy}gT^}j^p;r|5nY&wb=%JKlQ;Pjo>@sBQ9_1Hyf4%$8FVAdg=o%jv zpQM7*)n~2;?0KHseCK5yF=k;zb$7eJX4{GR6<e{p$*uZh(ml_!*Dpc)czyFv`TB-z z2@YgWT^w@ny;_5gzqWhF#(G}K))3b1=0yFt^j*(KTk}VVpMB5TT~pArvbpkF>9i}J zsR6EwA~KJ5RYV3=5nTz9k*USLMJ_o}=X<&ql@E-lu{ER)ygZqD>l3-8(KRTil0D}u ze`Wjl=7%k5U;KUZXIbJ-%hFNtae}g!F?kK053hed`x)~f<+D0GJ9&JK;stkwyI-DX z!>duL`Ch4iAX6q3T*+|@+<VeE(A+jAbf;HgNn1y?yd*N^h9qL~x^xeHt?bsc&eWP{ zIYDZPH2vYKQ*Osku>0mkKFzD`d@SjVHWh8QD*Ms>H+v7&@V6;nSi8#0awoT}&MR9P z-LQXo{@P20)`5ymjqzVr_Lt7w`BZE*KIprHwy;~t)mW{z^RiCRm^9(nL+ADF$9<@} zEw4@+)Msmn;M>;JFu}dr?WGq^-5r~LN=#*Ca35qAOxpOd!h8LwPhC{)8M?j2+v|mE zZv6OLZApZWbXmo1);GrM_X9U|Kg#Wj=5H>nTkA1zfMqK=-p%~;(5uYaO1}fdxYq6a zs-s@Yv&$}CJu%i;$>KE1R!y$BTFfK{%0n(BR~?DCnqsJ$Wi~$v>6^K9$ITs6iwIGB z_3o<f-f4fueAKa^G_d1v+Y#Y)v#~6F*G<pEZ9%0;cVd%Yl^<-e2_l=KY$Mxh7#Yr` zV=oH2c0^pEqjqSLq9I76O1WI7w%|HI*HZ#WbEwb+?x4rl{BC*8*x+r(h8&m!Neu&> zxrELFDVlB&(B2!2i#hiUxtdZNNc~{*uncvL*W{mT#+RX7fbmf7zXI$tU;+*dlR&$) zyn%6fu)hq$coInY!!S$)`^zvaTnxM2Fiea&>0v@=dzerNDQNiKa3^0dA>T<46NzA2 z9D6CVnlRvI`*%Phk%z+=08Ro)!UzurmZMa_AkV;bY7JM&7pcX%Wm=6y%ol3;m`KCb iXmCst&euxO|5q7Il7&*6DSN;%F;9##nX?wgp#K0`4Ct5u literal 0 HcmV?d00001 diff --git a/t/images/PFM.pfm b/t/images/PFM.pfm new file mode 100644 index 0000000..4501366 --- /dev/null +++ b/t/images/PFM.pfm @@ -0,0 +1,4 @@ +PF +512 768 +-1.000000 +<dummy image data> \ No newline at end of file diff --git a/t/images/PGF.pgf b/t/images/PGF.pgf new file mode 100644 index 0000000000000000000000000000000000000000..06d52e77c3f760e79f891a2101a6e78580e1d68a GIT binary patch literal 286 zcmWG=cQc#Az`(!(#S9D*%*;S`XMmqOFP9V-kjd-m;SvO-89|tX2}n*T555QD6bHFG zF|0c$^AgD6EbxddW?<kJ24O~qS#u<Sf;^rsjv*Y^lYjjGZ_mK`kLll?Gm+1M;*uq< z5hc#~xw)x%B@C_=nQ0;U`8f&!?rsVpsl_FK3Xfa>Dq`?-^>bP0l+Yx{uv|mIWfdx5 VVraH!FlJzI`3F?_9}1|=2LP?+ZCd~U literal 0 HcmV?d00001 diff --git a/t/images/PICT.pict b/t/images/PICT.pict new file mode 100644 index 0000000000000000000000000000000000000000..511b83b169364fcb3fc912f15c0d9312cbfcaa9d GIT binary patch literal 150 zcmZRW#sC5wKq$!cpNHZ9KOoNoieWM!T8@E{fvbVBfwBI7{eOm8K#~6q3LpuvUIqph nFdL>*fI$H$!T}UhVBr3?fPwpu16Uqp4+wy1ricHrB8L9}VhtYI literal 0 HcmV?d00001 diff --git a/t/images/PLIST-bin.plist b/t/images/PLIST-bin.plist new file mode 100644 index 0000000000000000000000000000000000000000..42eaf170f37a24d5c50849208a5e0ee0929275a4 GIT binary patch literal 351 zcmYc)$jK}&F)+Bv$i&RT%Er#Y$;B-oC@Ll{AsG>pT3iy8nwSG-xMU`mM1e$tONuh{ z(j!4k$D*Rd%4iVFGp{5yJ+%nT4$aF<&QD2&=t?YsGZMkFPWkycsfl^Y_TSRL;1Uln zAAd-AMrvM|V`)i7ev$FPIv#}$3=9k*0U4P&@dCoG6`5%vKwSy}KAyoL3MD}677GcB z1n1|a2A7oQhn8d%rKSopGUN*gGq^HTFuY?(V+djR#_)q7he3fMfWe2slOY%=qQFqX z@RFgJp~Tp6+w}#<fHwHpq?G37Rw|?<mL%G7GH@_RGpI1=GFUJ;G59e=F(d;Gs9<Ph wXk+MRn8YxfVFAN7hFuK%7!EO<U^vb2h2bwF7tjzOU}A*O3{p@UN-=T+0KxcU1poj5 literal 0 HcmV?d00001 diff --git a/t/images/PLIST-xml.plist b/t/images/PLIST-xml.plist new file mode 100644 index 0000000..eafab40 --- /dev/null +++ b/t/images/PLIST-xml.plist @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>TestArray</key> + <array> + <string>one</string> + <string>two</string> + <string>three</string> + </array> + <key>TestBoolean</key> + <true/> + <key>TestData</key> + <data> + PGR1bW15IGRhdGE+ + </data> + <key>TestDate</key> + <date>2013-02-22T12:49:10Z</date> + <key>TestDict</key> + <dict> + <key>Author</key> + <string>Phil</string> + <key>When</key> + <date>2000-01-02T08:04:05Z</date> + </dict> + <key>TestInteger</key> + <integer>256</integer> + <key>TestReal</key> + <real>1.4</real> + <key>TestString</key> + <string>ExifTool PLIST test</string> + <key>TestUnicode</key> + <string>ExîfTöøl PLIST tést</string> +</dict> +</plist> diff --git a/t/images/PLIST.aae b/t/images/PLIST.aae new file mode 100644 index 0000000..96ef1b1 --- /dev/null +++ b/t/images/PLIST.aae @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>adjustmentBaseVersion</key> + <integer>0</integer> + <key>adjustmentData</key> + <data> + YnBsaXN0MDDRAQJac2xvd01vdGlvbtIDBAUWV3JlZ2lvbnNUcmF0ZaEG0QcIWXRpbWVS + YW5nZdIJCgsUVXN0YXJ0WGR1cmF0aW9u1AwNDg8QERITVWZsYWdzVXZhbHVlWXRpbWVz + Y2FsZVVlcG9jaBABEwAAAAF3SSaQEjuaygAQANQMDQ4PEBUSExMAAAAG11VeoCI+AAAA + CAsWGyMoKi03PEJLVFpganBye4CCi5QAAAAAAAABAQAAAAAAAAAXAAAAAAAAAAAAAAAA + AAAAmQ== + </data> + <key>adjustmentEditorBundleID</key> + <string></string> + <key>adjustmentFormatIdentifier</key> + <string>com.apple.video.slomo</string> + <key>adjustmentFormatVersion</key> + <string>1.1</string> + <key>adjustmentRenderTypes</key> + <integer>0</integer> +</dict> +</plist> diff --git a/t/images/PLUS.xmp b/t/images/PLUS.xmp new file mode 100644 index 0000000..42c725d --- /dev/null +++ b/t/images/PLUS.xmp @@ -0,0 +1,127 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 10.15'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:Iptc4xmpExt='http://iptc.org/std/Iptc4xmpExt/2008-02-29/'> + <Iptc4xmpExt:DigitalSourceType>https://exiftool.org</Iptc4xmpExt:DigitalSourceType> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:dc='http://purl.org/dc/elements/1.1/'> + <dc:creator> + <rdf:Seq> + <rdf:li>Phil Harvey</rdf:li> + </rdf:Seq> + </dc:creator> + <dc:format>image/tiff</dc:format> + <dc:rights> + <rdf:Alt> + <rdf:li xml:lang='x-default'>Copyright © 2016 Phil Harvey</rdf:li> + </rdf:Alt> + </dc:rights> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:photoshop='http://ns.adobe.com/photoshop/1.0/'> + <photoshop:ColorMode>3</photoshop:ColorMode> + <photoshop:ICCProfile>Adobe RGB (1998)</photoshop:ICCProfile> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:plus='http://ns.useplus.org/ldf/xmp/1.0/'> + <plus:CopyrightOwner> + <rdf:Seq> + <rdf:li rdf:parseType='Resource'> + <plus:CopyrightOwnerName>Phil Harvey</plus:CopyrightOwnerName> + </rdf:li> + </rdf:Seq> + </plus:CopyrightOwner> + <plus:CopyrightStatus>http://ns.useplus.org/ldf/vocab/CS-PRO</plus:CopyrightStatus> + <plus:CreditLineRequired>http://ns.useplus.org/ldf/vocab/CR-CAI</plus:CreditLineRequired> + <plus:ImageAlterationConstraints> + <rdf:Bag> + <rdf:li>http://ns.useplus.org/ldf/vocab/AL-CRP</rdf:li> + <rdf:li>http://ns.useplus.org/ldf/vocab/AL-FLP</rdf:li> + <rdf:li>http://ns.useplus.org/ldf/vocab/AL-RET</rdf:li> + <rdf:li>http://ns.useplus.org/ldf/vocab/AL-CLR</rdf:li> + <rdf:li>http://ns.useplus.org/ldf/vocab/AL-DCL</rdf:li> + <rdf:li>http://ns.useplus.org/ldf/vocab/AL-MRG</rdf:li> + </rdf:Bag> + </plus:ImageAlterationConstraints> + <plus:ImageCreator> + <rdf:Seq> + <rdf:li rdf:parseType='Resource'> + <plus:ImageCreatorName>Phil Harvey</plus:ImageCreatorName> + </rdf:li> + </rdf:Seq> + </plus:ImageCreator> + <plus:ImageDuplicationConstraints>http://ns.useplus.org/ldf/vocab/DP-NOD</plus:ImageDuplicationConstraints> + <plus:ImageFileConstraints> + <rdf:Bag> + <rdf:li>http://ns.useplus.org/ldf/vocab/IF-MFN</rdf:li> + <rdf:li>http://ns.useplus.org/ldf/vocab/IF-MID</rdf:li> + <rdf:li>http://ns.useplus.org/ldf/vocab/IF-MMD</rdf:li> + <rdf:li>http://ns.useplus.org/ldf/vocab/IF-MFT</rdf:li> + </rdf:Bag> + </plus:ImageFileConstraints> + <plus:ImageFileFormatAsDelivered>http://ns.useplus.org/ldf/vocab/FF-JPG</plus:ImageFileFormatAsDelivered> + <plus:ImageFileSizeAsDelivered>http://ns.useplus.org/ldf/vocab/SZ-U50</plus:ImageFileSizeAsDelivered> + <plus:ImageSupplier> + <rdf:Seq> + <rdf:li rdf:parseType='Resource'> + <plus:ImageSupplierName>Phil Harvey</plus:ImageSupplierName> + </rdf:li> + </rdf:Seq> + </plus:ImageSupplier> + <plus:Licensor> + <rdf:Seq> + <rdf:li rdf:parseType='Resource'> + <plus:LicensorName>Phil Harvey</plus:LicensorName> + </rdf:li> + </rdf:Seq> + </plus:Licensor> + <plus:MediaSummaryCode>|PLUS|V0121|U004|1IBB1UNA2EMA3PTZ4SBG5VUP6QUL7DWM8RAU8IAD8IAG8IAR8IAE8IBR8IEC8IEN8I +EV8IFO8IGL8IGR8IHH8IIM8INP8IPR8IPM8ISM8ITR8LEN9EXC|1IBB1UNB2BFT3PTZ4SKG5VUP6QUL7DW +M8RAU8IAD8IAG8IAR8IAE8IBR8IEC8IEN8IEV8IFO8IGL8IGR8IHH8IIM8INP8IPO8IPR8IPM8ITR8LEN9EXC|1 +IBA1UNC2BOS3PSD4SDL5VUP6QCX7DWM8RAU8IAD8IAG8IAR8IAE8IBR8IEC8IEN8IEV8IFO8IGL8IGR8IH +H8IIM8INP8IPR8IPM8ITR8LEN9EXC|1IBA1UND2FET3PRV4SLA5VUP6QCH7DWM8RAU8IAD8IAG8IAR8IAE +8IBR8IEC8IEN8IEV8IFO8IGL8IGR8IHH8IIM8INP8IPR8IPM8ITR8LEN9EXC|</plus:MediaSummaryCode> + <plus:Reuse>http://ns.useplus.org/ldf/vocab/RE-NAP</plus:Reuse> + <plus:Version>1.2.0</plus:Version> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:tiff='http://ns.adobe.com/tiff/1.0/'> + <tiff:BitsPerSample> + <rdf:Seq> + <rdf:li>8</rdf:li> + <rdf:li>8</rdf:li> + <rdf:li>8</rdf:li> + </rdf:Seq> + </tiff:BitsPerSample> + <tiff:ImageLength>1</tiff:ImageLength> + <tiff:ImageWidth>1</tiff:ImageWidth> + <tiff:PhotometricInterpretation>2</tiff:PhotometricInterpretation> + <tiff:SamplesPerPixel>3</tiff:SamplesPerPixel> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:xmp='http://ns.adobe.com/xap/1.0/'> + <xmp:CreatorTool>Adobe Photoshop CS5 Windows</xmp:CreatorTool> + <xmp:MetadataDate>2016-05-18T12:54:01-05:00</xmp:MetadataDate> + <xmp:Rating>0</xmp:Rating> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:xmpRights='http://ns.adobe.com/xap/1.0/rights/'> + <xmpRights:Marked>True</xmpRights:Marked> + <xmpRights:UsageTerms> + <rdf:Alt> + <rdf:li xml:lang='x-default'>Phil Harvey</rdf:li> + </rdf:Alt> + </xmpRights:UsageTerms> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/images/PNG.png b/t/images/PNG.png new file mode 100644 index 0000000000000000000000000000000000000000..55aa11f8447e5f20fa0802de7b48bfcccbf8d4cf GIT binary patch literal 572 zcmY+BzfT)66vs`4gme;!fr+J-7(C@nf&j(315qxJs3bxVsTsNWOk(AJ)#s2S8weyi zbY`i<-l6{h0}>Mhe*ps$e?iv{MeyztMeShweV@Pn*naQZeq(pmSTqnqv$d*o0PB1< zreH$rSND&wd}x2(brAabeW?U$uI6kt(<lDt?dEJ@8of3?zC1tluVH6FS6Z4!K_Ehn zv`91_i|e_+CPGuUvf0wD`W}O{>3UIHm}wBhL4>T$G<JDUXxtVZ8QSFc?H$3=v&om$ z`f@$q7F}5#Dseb$H2JW{%O2U>FszgTAQ0NcY2b$mOKp;K8N^wd5}aFf&nC6N?Fhyy zsXT5*k&oBR)gl3g@{ZYovoj`uvPoC#m{B?y49vlb8L18}mdj<jT%x5?0UU+oG}LZd z2$Lls7&vD*BH>ELT1Fwxm~K1jYnu=QkI^2VkmJ7cbFRm!@I_Xzgci*r1sukf#~D|` z)sf2N2!ANP=3=CLxv}4sKCZgzM4VbQyAX1@I~QZSMgL=sjQ_k8{-4{S09iPxCx}T$ YL<ntAQ16)^7nfPHYL$lb>(kNsJLj3RnE(I) literal 0 HcmV?d00001 diff --git a/t/images/PPM.ppm b/t/images/PPM.ppm new file mode 100644 index 0000000..01b59a9 --- /dev/null +++ b/t/images/PPM.ppm @@ -0,0 +1,5 @@ +P6 +# ExifTool PPM test +8 8 +255 +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/t/images/PSP.psp b/t/images/PSP.psp new file mode 100644 index 0000000000000000000000000000000000000000..7c4db225da798b4acbf0c0812f16f390b38a4724 GIT binary patch literal 1703 zcmeHHNl+6}5bZyImSjS#44_7=vI2-A2L)7IE=rV0zypH2rvL%s0urL4RazQxy{V{Z zX#wtd!(C6{t~cD#i~Dv0cR4V2&m@*r?w;+W=Xdx2-M?RV*Dvq|DnqWKimJt~f?$=) zyU17WcX<K}{b~XbsmQC``S=|kVGFLrCIu!k0i3`{W6)+AQ9^@8ekz<r+bYjgwDdu# zsj10`NpVd(hxsVw)CS4`yxue;wg?Sj0b<dfg`B`7iU+yK10!+)%BhSSb^&Fg7FT9^ zM!Kt@BCybv>kBURFJE0Z2pmHJqAQ)ETtrAliDHs(h-A9#`v3%iK|St~n^}(O{+f_k zC=-^5_RhV&e9{CA4G?ZLH4Zk^zRAbD`zKeSy99Q0$aa<bYf6HF#i2k|CAr8(R7#gL z#n4c(Q+5tGj2NgP#y(m!><1VeZIu(uLIGn&Gh?9!eW)FNT-$J!K)<Iy1V^67>j5S( zn1?^m+d#8mYzt=^2pZ!W(;q+`hKZ8Em>`G(ktB*-lqE%$C0SN1szp&$RID*pRka~0 z7P~#hW+$1P$OHd2MOGBr{wvZivV90xGSk5P4PpWpCA`|I+8iJ-&IOT6m=>N~iF+Vw zQfy*Iwj4LjrzBO!XRg`OY)N*vw)ZXU=o&n-I2g97{rWoxB%}-(nmR0P)aa}+W5<o3 zG&#pJCD)r*G=0X*S+nQNEh+Vvl~)Aj*MycVT~@n%#oD@c>o;uNw0Y~c`t3V*HtgEH zZ~uXVhYlZUIeP5)iIb;JpE-N({Dq5`E?>EN?fQ+Iw{G9Ld$05UqsLF4K70P+<*V1- zZ{EIp|Ka1O&pixyw5rreq;K$G`I$fkRtOIhmeHmrN{JbAZ1yz8R~?s>xyBOj-qPIK zZcQFp*wwc<*rE0tJnB(OH$gHG{TZO}KOy=G=qn!mKE!Z_W5YF=0KL7bT<@fT<uC$= zjwBIMP}+z{RdD-C7L*68mQ<ETz?(Bo6C9=JH0#EsN3FkJbseYp_pIv^jf@gO!Rv|t wQ{+wIMqwmK!iqSM>G5hqruU|HPmkW1NwThUa5hY6r?&p+tne3S`47&10U7H;IRF3v literal 0 HcmV?d00001 diff --git a/t/images/Palm.mobi b/t/images/Palm.mobi new file mode 100644 index 0000000000000000000000000000000000000000..c3bdb6b9ff2e0b49fb9f1ab4ec27306342d1e018 GIT binary patch literal 1382 zcma)+O=whC6vzK}5`si6QY8c}=1|mX7-RjcMq6THN=y?IHE8Nra%bk6dHUwP<h^;3 z*cOW7MyZ>K3$-ZdN^~KLpo`#6W9!Gpb|(l5E{veK5Eb-)CvWT&v+%;1-?{gmd+zyo zbDQ0sb&lDe^Lv_nFYkDf?%Cq>882_}acn;H%~C5L7h<KcqvNOcj>h$z?ky~>021-u z)GQTFrk9hH>OEuyP}4+C0_M#lD}jX<$SJ_`Ipi0>n#<%gplKKRCD1yPoB?b+OjZHi z@5ySQ_bAD|zIyU2z`IV)2BNE^0Ke6cUjqkUlJtGV-pf0O&yn+i6L-m4;H=Fm37kJp z)&ZBElivc@ZjnoX8{OnG;N}C8`Q7`4TnYTUfaKi|XOU}wCn5O*FvgtF0K7U$HUe+C zhILTtBKafKq!(lh)U@x(R;a3f$Tq0iTgeSjbKjAjP)VELCa9$c$S$Z=H_0uejjJ1~ z{tCGbYV{d%2YH{|g+%3RvKM7c9Y~?9)z&pbwvfBYU&$;g{$Om_LrGXUJ%U;mog?n& zQ@hH>Jyx5xZl_-H{xb({S<SLGlHDn{)hG^jAB&2U5_Xp86RO3lC)`w6%ymVvowQ`v z3M2}H-GeIeVPi@*cXzQOi7x7sDH+O)c4x1VP7`Q1uQ_)q)thrV%<l7pOqi7QUYcJB z`snUxi%A8>59Pc1l_JAGiynx^B<+|WuXFa_BY{afDdUMtqfFr+7E0F7@l+@|pJuKJ zS4+PMe9^8umXyfzWqYd$qjcbed4H#5j0{8$U4%w5TJk2$J2~HT{P7+0f9pYK(9|6h zY1E<4_`+i)Atr^6--M#GexT#f#Ea-LC<$*!xS;J(<I0A}4EoY#S8PIlova;*jBC>& znNpf|R-^5BelnzmIWSt??>cEZ3iFRV$?BA=J%+SfyJ1|MAs%6Yina3lZ7B4tT`_~& z>oaa4%TJ@QssC3ac0=)NLwy;4O2+T@1t=ZQMqZ7nH)>S9P>&jh8%{O+$=$yxQz)a9 oJF#xRpSvacy;x6?*3Q~no4;b6!0lL1G`lkXmP+w0mG~|F0M1=Pc>n+a literal 0 HcmV?d00001 diff --git a/t/images/Panasonic.jpg b/t/images/Panasonic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae04fdaba2c8ab32abc9867872fdb99401a293b1 GIT binary patch literal 7099 zcmeHMYj9LW7Czm#?|bf@naCpvS%?7wM2y3jWFdqkkbCD6UPi!35G}$Y5abatKtxnt z3lSoOfTD;HLr{o7DMk<kg%nUIZ-IayinT^r3nd^Z%ObPq&P*!f`q)2K?Vt42*XQfg z=bYPpy64sHKjZ&0`UA7LU<^QZb^=HMpn#K5tO4dDT*z&086tvkKv3F<CVW7?guG3N zS0L{kvZ2Vm=-UG2dc++x=xgf>7O;SCDF#}%SA=7z+llB94Um&RDgTMdlM4O@#=xw* zeZ%jCzSv_wu~B+Go}^Sy_f&89*lx+G$;qinDUdUzU{X=`K=62zJpek|x5AhGEC3Eh zV=V@_Jre*qP}?&EP+=q1jsVvJwGMl2iF3k=*iUwmSy;<%WS!8%8I&u~z;3^VL2XH5 zg7Oi3tleH@d!jtZ1!aAkphWfmEOD@MPB6a-=>2Mldy&VLH07~Vi09bx%0yr&JYKJd zD+}g5742Dw4?<3s25ktg1zj49KgzZ#R{|LxkDM<L>Zc$V%Y)CdGa-ez{U|xaUC5P? z{S369SuVoNRseI5Lq%vj-8>#r(X?-9MR4seh`2H#ei0wQhq!=ypmk-_9AT{(7@HlE zgt)yXq$+5G6lfUd!Z@o6&gFI##t-S+qrDJjBZhG)jLTtM3FG$j?447AyP$K3|JIKD zEuFnS_So%W@5#0ZJ62*yHtl_YNVIIq0>%And!tg~LV7!r7{;C08QAgI5gpRoJ~3f& z+J(4)`q(i2ofs*pB|r^2#D(-|0`0?ihcMm|?d{dSh?$KKjm?8A-6_nbbBNpH?1H1W z<$E~5gfN@CLVE0iu3`GS!+2s?oO?ptp4SoFX+|!gW)6Xd45QEMTth~0-y|4mmCPDt zMUc@Jz!=0JD+#8cEJDn%{^g&E@)?VROv^9#v6wW#s+LAr8cee~L$T$8!B!c`wFbdZ z>k^cr?P80Ng%&TBS$<NESdO|E5e*qbhNeT658!pgdPFs1BVse+EyNZ?4Pq<eJ;V;g zHT3*3;N9EY0%_)L(!z`(oz4Bw)%*%Nm=^_?`GydUG6H3+DbN(tLE}uIsV0M-h<G!S zB$#!OXyUsa;YDO3dL#NEvJmNr7}E_p%D8?Bq&BZ7+noon2XWCSEIEWDIf*!eIEJW0 z<PHOP2r&#X95ED;gE)hI`_Qi;<H0^>G3DP9YCKIw7;eIhuR$<QfIZS^V=+V+r=W## z5L%%=67`3SWOBrC(__Xi@`;f}Y79`e8aQfW1avow!E20!RHG1*j0S(25eX?q0;FSm zfB|HX@hR*!{7`G0gKyDimbo3~n6qH6IRWP3tmd1K!vb?0lptS-d=c_e<cpCnL0*Qu z9QiWjgN-j>sBsK(Q4T|S5@j9AGbqoZY{<yVdW2M%JgGGA$*3|xdfgl|ZN2&I>}rg% z(QH${8Tnhtw;*avRo!ax@E+RkK--;Y`+-@Pu-hE4s@5zj-HUub+8r?K>pnKSbvtCX zgOMf&qf7#$as9@aB8)SgFdi|%bigD;Az})m2r<oU0mX<Jh?$6E80!;Lf|H0kM1#q3 zR}t4RW`l2f$yHy;%h!C>)j#@n9J=Algqyx3xaAuGw|)4HX>|u`bp>W+f?%bAWK96Y z8VU}}03F{KF6@iIz82VSWqBadnqCrZmAo8dRadvQcASgF{y0Pjt1rZ(O=q-Cz?faF zVUUPz561Iiyd>l)7_U3prlL(6%5-Za95L;ElQmF*TPD|FzssA;pOJyyW}ktXyodL* z*VtLMf?vtU@%8L5_Y+m<L3W&7V%wO(ZDujNk3Y;xxIFqCX~(*-EXKIk$U!=l9bpeJ zi91IolXtjsZY?*MPA8|yNNycBhr3GS=|1uhcL#TXULXnNBap}?LTD}hhQ3Sx!e($! z(n{hct4S@1AwNJnI-I^nKBsxKKP^SgN|H?L$$5B(L{pufrz_|H>W2nwPoxjf@8Kl5 zPTJCg(2MMbvG5ffg<DVu2Z53{<U5!`hLPhi9BT1**m-yZrouk7ngIhzG}#YNKnbjX zf4~8#z?vslz(E+f3~S&OwEF?Rgl%vUZa_Wc3?4G{&&YLijOGmdKQiFU%F1=)uO=q( zQiKGOC=p4QsN|A<76E>i^0EHC^0Smg{j>$mrX6W6T|j!#uSk)Q&Oa_J;QhQTd`LU+ zRcsMsv@ch~?cr{bTVymRu~X74x{2#W*V9L79bH2zXcS#1P8Sq$icl{kiSxKCd^-Ob zyN^E4iA-lv7{8KBWt${{%Vj5M47ZD3p<j~gw1`H_pG$qEcqvC(FXb|y*i&fD&!)S% z``9zAAMHm^aMRh}r90Vp;TGp+%egxI42opg+(u=odQI-7v{L3OWBD|>MtqomgWlw3 zvhA#ZK1&6*k3B4<3G3BF!7F~lPZf7?YsDW~o@2FkL7n6{tZs0u66PvB<zoIU?ZNi4 zoop^$OADEwB}=EJWLJcotiC8!sZ04nWt8}e_OZT1^XmPy3VpfwsQSF}0{<O-m|bT3 z*{gIXUC5$%O^Q`Exwk1DHBBkfwhB|!y;72XTVJLh)sJgg&bHF~Y8!O}f0NE&Ke3P5 zCVG@U#UlB7F-_j&l$14Uo;+V|D`YC;q~qEmJxcGdKc+pTe<6-mYn3YgpL7xX0Y9@h zVAdxy7r#rqEKF9niqA<GgazViHcos>SnJ5v4myrHIymwjsp9?0oAT5AX&h%At7OaY zlQ|FP_k#E?n=O3DTJcNRgUrp9GMU}0_EoPayOa&eG$m2kBIinj`1ffxTgoQ0adba5 z*-6aHI_Z$}dnrSmEyb%ve66}!ykC1)U#1o6@mjGyL1fxuWemTJR<qS?3oE5x&<mKM zj?zkbk?X2_Lv1a`I*#(0j!Nl8jdMonr}VX&(^(@XXqT1o{5-mYEyVAtLfn<L%)z&m zPRkzmG-Z#YRKD&og;kE$@_FsL{*<md_i1-JkBN6{?bHH(A$^mrVVl{r^eX+3DLgOv z<twg#D{ZvT<SNHzVZS3){zOZ1mgycR(+4|SN&~eXY9YUz9$@p?n`}D0LASG({B`lN zJk)hf>7reeKT=)7a7P!pQu|2Xq4#%=)9dv$VtcJrwdc2sz0GP^G5wYvVI6V(EIGqD zK>1o7FP~CQ@MY>HX^1vfAFiL#WAtSGG4ZCOxB3XbnC`*6Y{2=|qhA~TlsH3*)t{4V zl<CrT*~8CM3Zz>OhrUM}sXwi)*4m3NIgTp#VP4*5rL2lgpr7IQwuAq@_j9wpIRniZ zXwE=$2AVU_oPl3wpc5WvZo{)h&OT&>SP%3STr6bP_c0Ft2fBgF2Ur#00Jc2@Y(qw~ z+P4kZ6B4*0XtetYe`DLH)3!O5Ovn-N*ptGAkUkK?t}+Fe2m<hhNC(rv|IWtti2rIA zhuY}nX&SQ~9^fzmQh+xoSbnE3@WimW+NO<ufz#ihqOrz#1w0ztD2I6P0>$&!Zawh8 z)*Ge|o<&nk3k{q#5AK0yM`35XwyA^}4xUO2*!r#epoMsT-*_KXjy(K6h|u6E@JiIv z5XVcCU)&AZPr-Amz~VH@G-K+-iBHBBjhi}g)TI1^39$te^T$3KJ37B8Kiz*0=0OXW zD=H$YQ|s29yz%Ygy@~Ny64R6Il5X@46yuKyX&Dt28xtEJ85y4v9~+-yq}+8^3Oe*j z?(;`(O@02|;KsjbcsNhufVv6iCjPz9AMcOs`GghWR~o!s3hNJ0_pdbmv*5tJP2HRu LGT<F(=l}FSkQ56J literal 0 HcmV?d00001 diff --git a/t/images/Panasonic.rw2 b/t/images/Panasonic.rw2 new file mode 100644 index 0000000000000000000000000000000000000000..54dea70e8b8e90f0394ce93b41096f680eb1c8de GIT binary patch literal 12344 zcmeI2d3009y~lqucad}@+46#IcEtr_Hb)q2977yqJ1(nn+2cnjHYCL~Kp;?-q=`dZ z>Hr~>Y?Lf@Dab<QNIXJlLMf%hA%?JpQVN0Ok(3Y~kkmNdB-z&cj&vQ=)13C5p4Wfg z@z@{Dch)=ir`dGxj2kzdl8C74i{%$u`}dyo;+n-P*A9Mg;Q(S}AQ>r+;SL8U31Om* zQ3Ms%M>IluSgS}=bZvxIb-f>X47whRvPNBtx=gwj*U)rrfi`#Qbwt*P{873NMiWIx zXj_C%)O9iHNzyeWb&t?JB6Lr*t_RW^(4bxs@x3E-p9tMg*V&w?zpf1^o1*Le&;w9s zHtMt>&rm&H++!Nz?-~RFV?{HLdnPJG9vif<Suu1BlS6h6!o{+%ZH288bS-S2sONFC zWw9h(Cp&PD%s_VJorQXOM3gQ6X}Hc+h!;+x`M8Got0Nxz+l*Sop8?;=y_{Gz)96R= zpJ8S?1b-fCTZ00{T&4{OuV(R71b-(>(&LLu7neS^WO4aCDwvc%bmFYxwD<DTWu<8P zc3kx~u5~v05HZ%=cHOv_fAq>zFIi~YS_Sb$Q4-PXx=w&jt_t5bB++KQ52mLNlQwgT zM^qmq$huA!dW#mSrx04%60Wld+OQ>DkAgBLUE82FJ<kl}p<fw7WrY+@d?&RgqEua{ zI~-Zr;y=?qEF(L8SawDxeOsI;J0FPli8_Ys{@1M?z7C%sAJGkROQWyF*W~xN`P+Q~ zUz^&}*4hfcqecGf?dFEYTa7LLK%lwR7x1_F+M4{WZLNW3e@h_1eNwaHmwZYq`8q_2 znEHU<-|i2fHeY*tN7!}xdaxrH><D&rw4bh9UbMb35b!m9=xc0hy!odCo5z$qx%asN zm0L20X0Dm=>(cFG@`v{M-tN&hTla+cp>gJD%@mK%?)PL2OzatNjwx9>dqD1z$L9Pn zB|(c$NQ^ZbHO*p<Hke{<(QrwVie{{xH)r8viz?Pt{bW|JsLX`8D61{j)-yIHKCUkd zur}5n`V)SqZf6}7q#$cYM<*#L`{Y*c<9=hS>?fbU)i1ZUnVN33P)l5+wZYF@{fS=% z+M0Y{`<h{+0PN?7{n}e@`+Nc3-12pMvwB;qZ}znY8el(PTOiO9Xce@z_<g)pZc<RA z+#19;5ilXj@An7%t*!oM*ss0g8yj|-61Eg0P`I6&ezfQ{)aSo>=JcmGo7&&|pssB4 zqHU|Eta|hD$s<=hzbdV7pWgj?k1t!*BOxw6b+9eUqV<pKW{n*a+xvk&v5vU-AB-Q~ zH~sm7d3k*ktkM0uSu93_$zU`ZqHIxGv?(g4sIdI$+4B}GC||y=YF)W4s#{N6RJ0|r zuhndcj<JXA*9N<Fglri8gcV`Ekdql>Qjo)batHc+tK4F1{L<&A+a0{)c6$qJ#+dU5 z8vR;hyXZ@;tv-Jn`8!|$zu)k+FA%&C{518-{j16!CK@+xP-rHyeltJ0agEOTX&-dt zoYaGb$J#-}_tbSQbgDl0i0NjSKF^(iPKOrb<2;Dt;jt<5bk0v}5ZGC3pfiZO0nQ#Z zP%iufm?ZuPT><TfF2vyc`}sz+PRu5q{)~r~r437S*zMmsUW=ENFJ3-w5;@W{Fmpzs zWCH#~Yr^xRSha)`^Rif}gcIXhtWLY}Db^{mItdp=;;so6zy}j;u(1k!nqr^^paj+{ z;lF|m!ry~Rh0l70{W-X-2yYN2;eUY1Ncf-k4Eu=wfA5mNSq+lpJF9^mI&w7_psx(Y z!XDqUGNdAZ=gKe|n*A)idNA}h{<CmzEf#t76=N23=ZY~GI&#G@>MMr0)VHl33y}Yb zEe6{29im5}sajvDhB+Lp`p(MDtHY~rg#kTF*VX6=imp@9n-jO+84Zyu64O^F(Wlss za2`nF5n77S@{aI5+EJ&X$BVt48j;5kp^XvR6rr^UEv_ee{=c#+it!}cF5G+|M!%@5 zb9KBkiiz@(Gkk|I6h>m$nxc5;epA%cxtA0=8j0cxVomSd(}^#la~~(t`bN}g*R_bh z3pE+-L{3~RS&v6Fb?)zk?vFg8ZV$#{iryYa`bfusi2SL#7VQ~G;ct3k3(=s6JcIRk zQRk3|_|Cndh);{C=k5sYh|t4yE!v;1Yf*MMtRO6V2<;pZkv}6sXX+Y@EsgAqN29Yk zHOk+kYf)!*MEs}-JzCdd1l}7FpA(_))3vB4H$snz(0LL0^K~ums~{pzVTAr}gdQ8A z$4BT1x}9_JJ7c1*_n^B?!Y>n1_gUDd2;bu%=+B@hN0gneYw<nKjEJA3fA5HvsG@U( z4|lMNh|#EPaSch=q8?e-H!<HUy6%Gxs_Oazeg_zIE%F;9v?)T{D#G8d1*2NHf*Fk8 zk1wD;SdjO&S|1!!xSy)Mwx_pyF)?__;q($6_l}^w@b`fO-nn$pdoy^*>kGCb><2Dy zj_mdp`|7-#3>UnGwBLJ}-bVZ>?@#Hhw<n$PrqXV2Bkl1%N*?c4I_G_d8ogtw0d;+b zd{@1Uu6Sqqu6Ye~-OK3);%<Rv@DVr<>Vd3YS2eZRXRI+8wjul)ctfNGr%rp4?7J}f zKtGTIQo$fF1f&56NCzW8CddNWU^K`9xnM3R1M|TG@Gw{iR)IC(3GgH!z<~^4v-`6d zcfP~O`8reK$2$`Z3C@9PlJl%G$oV=AaiUeuWJ-5FLa9!T(h#;gH}PcWv$6x>6sJT^ z#JQcpV1@HOS_{1nel`5V;4^RqRDvU5J<>MA-wvvvH#&=G6Z968@8Qf)r#WM22Eqln z-gr<5#v)wgBsK+;)GX*+XFShywn=lH6&)qczBJqUYt2^kWx{+XBejN68S=<A==<<@ zgB`#HYMm+_b#kh6j;G^Jn|i|8lTJCUbO!fu9_bgrS#S>QaSo!rP9teGwPdNWQ&i0W ziml0JRHG5E$%W-+=B2R&*G*#&*9A4n)kp5-3Q`|e6kFgrtITyxr}?fC^sviFxvmz< zbD3CyYcMNx4P@1>8_IT9o@s|G+vIe;qPkq4C~jA|X}2rE<Z;!hdyu{t>HCnrAL$ES zH|Y`A72HAtaTl>N*H_fwf>pt1;3~KVu7exk7WfL(gTt<Js&lQQBd!<dxN9@jx~>FI zxIPaab;)$fHIVwD%_%O%?C_J(_Ec9t8U#HAacM3aIa~&o?uuh$U7yf+SAZtMFM?m} zx<*r63Y&)T41_Cit+k*MtOHeGJ=h2~f%@PB`PZn(jr}T^0;YiicU4uP`{R$tx?^I- zBRmmgxf3ZHj0QO%4S5{ykE_z%4;PGZC&y$W&sxkK6|#vc;a9pJrMd36-!235-TnJN z3>LV9!G&&4k09@2unts#^==Do1e@G_X*1XYUIZ^AZ7ZmD*VA^ljdr-NlM`W=TccTS zMkVf4nhoZ-?X(T?uOZK2T;m9+1xG<0s1N2(ilsIM+o0WyIzr>CU}_o>#yJNXkbw$} zzyhLx4a9=_;JB&Bsmg=d%Cn#LdyMRD&ryEBlW(o?oRZdhPD+)YFQj#VJO?EXWX};v z_0&p6&tXXe77zt&o}*GMi1!?q5<GQM68s*>+Y5R7Al(j<5$*?45SI!DA>R<>OY@wO z9G-Jhy63Dk0%Rhb<vAf`qYa}`XAbh_dYmi|?JNL=V6JBmD}z5DJPhiCg#}KUiysJO zpaQG~m0%sH0_(v>unBAiTfmFpWv~@&1FwNMKrYAw1)va&1>?a)Py~v>6fh0U0JA^| zm<{HDTFeC}z$tJB90x}LX1{59G#WXQK|hcJQo$fF1f&56NCzW8CddNWAP3+Z8<RuT zyMn>(U<Ysl7jT2!zym7K6V`%Cunw%>6-QOOI-j(Nm8{EkS)j`TT^8uFK$iu&ED&jd zNt4G-jSP3`E(`oK3yirxZ&EvZi(TX<Hj4(*J5-NnLxb^b>2czG3B^fvzLN&fSt@3e z@nmKh_2&<;nRvH2hHb`Ek>As&G>!^sEdQQ5fvuvi=|y@FPg4Gy>^z&FqjCH=^U!K~ zjb5i$=n^etf0j-w6Il#<gI=Je^aFYpb(HWrHizFLCvBpq!F^~+2})e13G5R46MhtI zrAO!sT8t~M#B+WZWwIM|osLoz%VGH}nGI)^tcBjfyMwK?jXt3JaRm!=uqWAgW@1;V zfbF4kG?8tPk|hV5$X2i=Yz>P?>LjSCtQ-$v+G!elgI#51d?FvkgZvf`vIL1s#Z#tE z`)79SO7F73|Fs1Q^YdqjH_gR9JYV#s`W}M+w~lr6ZTj1oa7d!P&7ZO!N<5n^J;Bf8 z4by0D6ptEdzVy236SiGVQ*P6{?36S(^wVllv`G6T@jY9ea#gih9M)wmAMh6qTiHDM zf+Vq(Y>;FM<vcCbYQ1<r!-q;A){~dYuY_Vxgv$F9d&JyQxM8NH#G2mvpVDtlL%3hI zD5-b}IY9P@a`usznkVq@8yspOdzODJ2STxzLgh~+M#pfqn_-J(rM00oN4}*k<<pht zl<{l=pCzvnkLf8#K5c%0uP{8S&R}2hzsh%oV$X%jFGx&{F{_D&=Pf_C?)9a}-_e%v zx8w$S7#qX?BApLiX}Y}2T*lK3^VCu7Cch}(4#i#!m0z6bi18^s4DVQGS(o{zO8;eO zV!x1TrLXBSvq()L`x)hn+DQJY+N5ag6kjcG43*yyD&H&dV_U6aGi<ixThjwi@k`22 z*ad!!U!n)uC_X$?evhPSR-UM?RqE+Eo+#fNDqk4B|AcbeOG-d3u&CBwHeX@0lmV=s zFW`TstCY$g36-}<t4uzYpx&$WXSwX6)Ep}ROq8&VIiWJ@w}xbOo0eu<-9mh&`X$}X zy2~ZZ&HA&#kfpvaO){NhN7>zK9G}ha;<>6Q=`o4V7uEB<mZ_KGFR8tv4zyq6W7N~^ z3-%w($S3hpOcRfr$)?QHdP{}!NNKjbRbI<ahGLze_P=U5X<uctN5>jUl>^FII)?fA zFrA=7nBk8=pTs-Q3-~*Scb!4nOhZ@`PI<gROWCXPP<fEN-f&piz<;PLQf|n8`7~zn zlQ?a16#NeQSg5Xg64sc3`*|KKQWOpZ{DzjWLgkOrak;lKSAB|)RI8P%O169wCF<yX zI!^C`us)A>)W@lT9>aRElOAVzEP<V&UF?Q(NSd#Bjn~yfe3$x^TCJ{;PN22#hia(B z+vQ_u!SCr7jl{ac*b(+ac94#;$JqkbNG<H5x&)^MR-5V!DbgIn6NXB|0e%LhkJ2gJ z|GV@jI*m5GkE^d?cd=nCfxpGhk;ad)H(4L_PR*F7>{VB2*Nsjo#dy>Bs?pC*!e+<m zCjAlZ_!8|9_b`?nW~FQ)dz>4%pC01L7}XQlFZtc3%gQFh2y>h^P!1TIO|O`;QU6DH zYo5lg;OZ0DExL&CHkQTrqV*1G3m=JBXKwD{E_R=^K%1iOG)}R^o1c|;n{4J^YilSA zXLlrK=EInkHL(oV8#WuwkMMeYTICX{l3kO^q-;s$7o;NdF?FCR!8+N(l_#~G=E0T& z!8V)-dY=_Y9c&Xj%|B%yGB10Q50Yl^dcIF?ldiHA@^2(bF6Cyq!E7>2GSyi(T9+u9 z=A-5&i@)O!+{zE~&C<{LyI6(C@fv=G)v<-rbNo^1lKhn1z+RBANI#Na;5~Vr`HY&O zePzvvdP<pNe#l&C&F)x@J;h)6kNJaqC1#p|+{-=eC6+He!yiNcohAF(VEL>xSALGq z<WHE_spHMBT8pE8tX$My({5YVv@gXy|Av)grx2hTjDmwK8e`xXPvJIcgY>@iCVNY| zPr4)x<(&Uj`-^f+ldR8JXDU(JMbkdZfwpVt=_<}zb)fh3VxQv#)@AhkY+l34xg=So z=@{GF`90Dh_A8dGRVwe8##!F5G|11Gx|uGS{ed&+I~TD7`k3CM&(ZrXqbL1=4zo;F z%a-#wTw(KgH_Q%Y*a0P(`YF4NKQot^r_0qwhw&GhUA~D?Q;WUQ?@-H!=zH&D4|g{! zVlQJ4_gku=Bxc7RtS_6%9K1*w$cOQ3yoBxJs(gkuN^_+TF>Y(o@7}|ByNoNJqc~QA zJykV!V%xEIOJUh;2hN_o#isG=ayK5$H}E{><`d<UtRplliTR?-by=Xx0$mpPcUxd) zUVe$9aK@seRf8lMIObT1vyg@gIm8<!$znmkVBk`8NJ&NmP9`c6VvRUor)e6pg*Dzn zN!a*_?2-l@suLj%uk6JEI^phUOQ#Mci2Qkz#!mbf?;B@p|2?j7c!nd(G17qpM;Tc( zhwg#P4*lC5j_lAsRftPtU)Sl2;Q!8jTWz8wtVB5a3&ed*xhD&%^IU|(A#xaD((vgB zu_67o6N9@`@0=Li2OW80kl~E6*oYoPJl8c2%KgoWK?J`!=eG}9<R4wIV$q`2_T>v! zEGk=ETK<T=d{OBS9<t9bU0#|KyhN20kMpgu-3KHl4oFYwo06WE0+*JPAzV(un2;;@ zM~-#t-re5Io|2T5l9^&p$t=hmJU9~t@-p)NQL#H|!NU||gmsJ(OC}z}q!<>gr3u)B ziu;Lh>fgm+mmQHFk}-c56a0uQ626!iDF#nn-lV?4i{b!l!NhSnIa#Ae73Sv^e)qfM z@4qK2Giy}Ny}5aLqq9ceZSOxcJ*S|>+@dvGnk`M1W^=QtRcq0jv_^Bg0l)S-IxV}b JbY-MX{|A9mHZ}kN literal 0 HcmV?d00001 diff --git a/t/images/Pentax.avi b/t/images/Pentax.avi new file mode 100644 index 0000000000000000000000000000000000000000..d10eea5beb461e6e953c12d63e8fca590c293cec GIT binary patch literal 1672 zcmd5+&1(}u6n{I}G+K&HTa}21Y%16&w%H^r)fO~W8@v4sZ7fARv}U!5CXFUBrb<Cj z5J9j9p&+^Fsegb+55<4L9;6^h^ypEjNL9%C-pr;96};GkLuU4uH}C!4$Gn+IGagU$ z*P8~WO>NYiN{+e!(pDimSI(qQ0l?c=xH!WL3d}I^hd!(QsO$z<cVrDc`V!YS{1!`v zEKbf<&RE6Vja&1w9`VP{wQ>=06Q{RJ(r~Xcw7(ui5zU4_1$;0zoVW=3aY<Rg%z{;^ zAXITGICb4hi5;<~yXsAZKDWbmKJxy*V#@s^lE}Hw-LZ;0d3o7>I?|IZ0Ej7fxtx@{ z7gZF>WC;Q4Fz~`3Ifn0EmHCJIM2=rbNZh+TC`T1T%3HZC{?c2>-{_59cJ<%WnHS9D zevC4r>!(9uJrwEH!jZnP(HAxNJuq<39FI?!Q}HDAaAI&gIWVJ*bXT;$4Q{)J&5&NS zO6kSi!fV8iEsTvpCsI*+t8Q8qz{|-0(;X45uXNX;2|T3Z`OthA5n)%$J~Z9q=p!d| zNVW%Yhj=2m9&+S+5&IoXzBCC398BK3gs-}7*YUD)zZ^$-TrQg$#^6}BZLs02z@8e~ zPB=UWAtB)_LdWlc9+;Q>W_g?xJzg{+M^1o}gzs}(iWr!i$J2qStuj#)AL2Jm)Z{$k z_v`?#8@_1F$2z$_z7XsLJI1dh9x;ot9*zTulPt82D@^AYIa!tbfdv83M4{l(?VG{a zIuujU7_1(FmtduqA-0uIwY4egW#zFBwaMT{`(Wwlv%vEwvxahJ_LptjwLm%e)cb<Y z!wa9j)*e7r<cnwcZlzUQ+1#wD>RRiM7A!uVwGvrI|2z&C+|#?Yhknbyq*Vh$+IN4{ s-%Mdeji_#fdkOCPpoX5lR?xydx-K;~3||@_p*L*j;BN>DbNO=SH)aQ^wEzGB literal 0 HcmV?d00001 diff --git a/t/images/Pentax.jpg b/t/images/Pentax.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6eb71455b2768f5c4ce8b3e09bc766494e8d280 GIT binary patch literal 2721 zcmbW3U2IfE6vxlZ-R<s{LU(KF2h{Ggz%F0n?JljQO5246i&$9|4T)$dX^~ARG)+M? zeym`SM2xs05=o02i-Z>m2`|PM2;m76V|*Z}FU3S-B*Yiw!3Wp>nVGx23gN-Ixii0e z?wK<)XU?2^%Qwn16n$#rri~;7k-$aen~~y%gZW)VgM+l3h{7~S)RF|%<1UJ5h0lsQ zav&4XA+dmhnu)#^3oCp@EVVkYAUbs4Cg@!gsfwMS<wLVN@8>CC?8vQGzn~C$y@Kbv zn8@AShG({BwyE{|#>e)J4^8Cv?NwxDn>*aBvIXiiU~HIHzkG3ITy?BUyPlR(lycqf z9yi_Nrc_6&$L;7zr71U_-#f8skleKE!bTfb*MLjHHKb>Go#%vtHKRmyU9Iamm}@K5 zXr8O<d629Y#u=gvk&uVEc61%kbx_w;x(*cz1rpH$blBmj^;lAmCG}WRk0p7mtkk18 z+P<UhJKDaZ?K|40qpcCe&^s9=szpz3gC|WJzF^uGERf|A-sYA*Fs<{AX&3%t<$7NK zyJ|gj%8L!>%Au(WUpv}vW56LgnzTGjbey!m18yqSaoq7@#`*qupu)d?ER2qj4iy8$ z9>QvzzltGi2a#EfSjO6l)!w)PS$vcG2EN5zUGm22aNUxy`mj`zUQEupTyi`PeOC&4 z9KP{+qt(a8O&dD`OQC5qH^K39#<R&RXYHSHEVDdlxfWdIlZSomt%dcgeexR1Jg_M| zEWAjEa97_i-tQ-aF2^1G==_FuIJ0FvX9Mp{1+;nJTCfu=lCmIXK=%C70+8j%7(8xR ztZbz!vtOYbjs)>oPK{{fGsSjv9>O`&Hu2O)bFG}?a-QWXaGhr#^Yn5Eue9E$(_ncG z<lY_usY%PtF>AIuEMH)mJ@>HBe%vQlK5p}|7sG64k(J}T(PGP-8<tpRorI5*#wUN@ zEZ?T3K7PdLJkI(lBWI*E$2d7bZdPk%{}Mgsv$@u=VtKF8X=wrXnZC|SaKF`0fiu3o zPhyv_7do8{_~e^>JgD;@&x2@-PoDGfb~COJ+w19NGygk@+aJ<StApOy1m0`RKXd?z z*5kKjQ0pTwLPw;D8AL$nG_oSc%m(mz<VNO&;5*2W%+Lu(ktaP?$d(?v$eGrDxL=xB z!nol9SzD3kWVFKDWURtFr1{>l{%-rtVjhzw-k1-{`8sBhal!@JpvQ$D!zW~1Gu#<I zCEGREfzLW+%?kV#=3XhCq;M@N1WUOXDHCwCL`>#p-hD?Q7~bF-38iIt_!#zZ>M+qt zT6!Y=((^}t&-5S7b&LKzPPvSa4g{XnOH4-^yvO^rfA(QkM4#0EanH-ismW7Q=T4tI zeR2A;>GP!v_bB{F(1}?qYG2!jT2b?@?ip@dcX6%g*<0)NbNff#m-#ulJ*~KX^n7PO zw{4#iGKEO36EMrCR1m^JX1+WZ6r^@23P_5_=LXf`_;CC!HQ6?x?#9z`ll!?3(XvbP zY1s={a&mHUCVpKl-_M6A3~R6j3Ou)_n{9J!1YG2Nv_w@%+Z-W+<A3(ACX$`~tBE}A z|Eod7V&|bxk*%`wr64|MT)eEQ+b6R7M@L^*6TA11?%X?+-=p%QL$8jg;h~A4Ui)rr zeB?lW<Td}B@=x?0)kmYvb<N4f#$+lHPo!2QP*(MJa_P-xbjd!bi22RUszoK5ni5?J zmFUWLtys~84(mGCJ*eC4yYgj<h2g%iBic#EgcB3xtF&4FI+~^0x=MfS{w0c<9r4Lx W_ejb=QjLS1i8(POsEZUY|L_l+Q4YBP literal 0 HcmV?d00001 diff --git a/t/images/PhaseOne.iiq b/t/images/PhaseOne.iiq new file mode 100644 index 0000000000000000000000000000000000000000..63870b13f3116f79ffd4c274d99a51a2926ef3e4 GIT binary patch literal 3364 zcmdUxYiv_x7{{MpcI(F0T^QgdIlyH1?X>Gg?FMISw~?ATWMF~`A2_lOD{ZKyu+6Z9 zix)nSI2VF!8F30m{bmRzMurF<42k%`h?i)hlPI5vF;OGL1pPm!Z{bN5gW;2h{ds@? z_kG@LpT4Kza0BJLh{AY6qvp_-T%xYwJ@NRsHe`<WnkjP~-CXvjLA2j^|BZJI*Ow=a z`mHa0KzKg6JaBHU>lNd@<vEr|49YoUX8NYl*0%dR$E52P(4Q>N_1ylb8IO*e+Q25w zugBxsNUOKSul3%Zds8YIO>7t$*&RvkUZ>U*jG5ba4n+1wV(DdN);Y|J3?(DOyELEP zr1hKIQ@fJmT7NVdA2pMafaYn@JuN=^BV@)SNmF|g!yqiXnW#6qBbqW}nu-e|juIg= zHqfi<9=*LiQ}V9(ylg1l4)FTH4MTl@FJ(N=?BZ{AH~1Xz)O4#oS!=%+E-NG|s3f}9 zNL0KYrAc&TACYmCNUtRdKptof)CKiGeUSTKR98o&LCc^@r~+E5IDvjUpeVEldKNkW z9fEk@-g2T^@ZccPiCLlsa0|q1X@#=qbz)pQlnXKUBZk+<Wf<Zy@8ulsC#I@(!nk#1 z%m{~_bR~4y@Hda0d;95wXFoc>q4R3z0i)pijq{Bcu6CX;p6%N9#JI6CmN33~eq`-u z<;OaIpXxvR%QF+kkF}3?9lQS3+0(ziHotS*A!A?Dgi-(Tn6aukV%*Q#{_lO8IIZzG zokV#ki=Z6E72sUO)!;mE0m>T44$eIJ;CvVzDp%|W*MoVyZm2==0Ju@{7I2f|VXy~0 zi829s!JAQXf;Fp{&EOWr+rX`gV_;qJ7}%%yIdHq;NpOeaS@0UgZ-J}9y#6!b3NWv0 z9^9s4D(t9GtbyH%n*{p>_X>VY@K(W32~G*#FZhVy<AP6t3)LFl5j-#WlHe<X7X)7y zd_%AkcVhrs=BEVbfF>$|__O5C15;aKyBLib&vE&p{W6lKK=`@EL@wcL5ML-fUSU)u z{BiVOBzz40i-pHB$ss(hHYyiBKL^VdUPHT6crSd8@Wb$hVn47{Bs}l0PxzVXX`@(p zUXNRNWK*y-%a;lN#itiGmJ6?;f0<a%=V)Ip+R;Ruf0^^<_!Yv#66ao~oqa==Z_M(X z!!o`$%hzXl!X`8E3DSsjCF8k#P{yMoPwj_uhwqSF<!iurozQ9(&z|pwGW6knE`|6W zs8;QK7afLH!Q+qcN~Kw7rD{hvN)!`4q}qADGf<6apU3Yd8`jI?^L!sd4z#n^pdTQo z@SH1lh}*4uj{y_$T&%q_H9a=reWkB<JA}t?s$fve&)q}9SHYLc_yV%?{fR$ISe(tR z=C4C8>)=O3|L-pKY%HZ)h~<&32is$|B-jq-?ED%h;1Kn>iZLj@>2|^-w15~ln0I^) zT#7C7c-kU-+f_V|RjKN^ZHZ#8f54Vw#s7@HRf=zbtHr!^V&3SBYW?`7v;`kqzV&Y) zVvgXn)UQJf>sI%VD$A&UeR{8GqnU&0IlsjiClp@;*B(yC40F(Ao^`6a*Q+}w?Zg@N z6Jnf-?U>vCa(bLfux-j^?PEFDPo?Wu^ZKUloUu#Qx1fIC6yBfMC%;MTbLkkq!5oVD z_FD3Kx}MM5aq7-E8m{yesO!Ku{Af7H?qCV&2;{YUbx&JB?+ADv);#S2pD*C`{9_%T zKYt!4PnXc#3pQ%Lh=aqgG#(F2BOQ+~<i-DM7-4k1PjB~I+^*xLU3@#AcpUz^aA`?! nCZBSV6L-s}Ox{%g$Gj;*d?s%yz<0|VUS2v^vUB54w6OjH;`*|J literal 0 HcmV?d00001 diff --git a/t/images/PhotoCD.pcd b/t/images/PhotoCD.pcd new file mode 100644 index 0000000000000000000000000000000000000000..f72b4365ba4c8dbd84feba1d48d18b6be398381f GIT binary patch literal 4116 zcmezWA3vx80tO&p1cF6CzzPH)J_v9D0ffcCzzGCQK=2p{*nwa!5WwU>dSUEQdNc$^ zLtr!nMnhmU1V%$(;6ot5*(KgHz>|TE-IkHT+A`k(gc%Gh4D<~R6@mj?6buXv3=}}X z+uy~}8_d!-F*1UPxn<_$1}7)x<)s!W7#SECnCKargOvaY6Js+N6HW_yxF!~t<R<1R zc;}}iW<$l9@i#&K{|_k2&q++uQSi)5)&tsOrfX_q4#Xzr1j5e|C?D+P$i~jVD8O)( z!TSHH|F0OPGid%f_2=Q=$-h1^-e!Ew%*Ooc|1AdVzZ?GX{M`W5U}$U#B%2s6F|t66 zXMVxrgMf^J496I37#UK403^={Y65v^sg^MOhkFyq07;F4(GVC7fzc44We9XhpL!ax z=}zMAiuBZqAfpxmmE=V?E#G!$`7bc|WoxM)$DVmKI?L$G`;^JMWWIMxK2Vh5w|(L= y&(Mzb$Uei^W?;{a=`lO7t2Ww0qh&M=TC;63a}(236;cvQ5*1QXb5cuEQ|thW#I(o& literal 0 HcmV?d00001 diff --git a/t/images/PhotoMechanic.jpg b/t/images/PhotoMechanic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ee90448bfd77001beb8532cd1cb8e6b949d4e4c GIT binary patch literal 3417 zcmbtX-EP}96sF}Q&71;Dh7N520TnjD8qnI3-NlU!TR~%QXwjt&niMT|GsqHStCl5= zqG2b%?)C(Gl>xii#dfiaJwkuB0egUAkKi3rKPH{D>re`?$aB8)LyG6e^XK!|g&z)w zAr0eU7-_evCfeP<cd)X8U=+Sm6@(O2RF&Iky>6O~nptnEN*isMjr#4KTE*NkO;!0C zt&hB55YsSFm2c4M5w$5+6^t%*!%0BNsj9fB*nQYjl~uIyu>TA@RC{2L0rMeR?*e!b zGSC%NI+{e01{AF(FYBtZjn?nu(`iWDm@SH70P@>tl@1B!vm%{_s&WZ!eBpXjV@^x} zd5A9a{SAm64KY!b$7uD~qdtfPXst^yfK??%Ye(UPI6yr^m!1%hVgkZ5*n%BVk8R9D z>vys3`X00U8QM6Cu;baj<^=#Op~9}JQ1n4Jj82I+7=q3}(Pgv6o{9;h#?H0)nw=}! zM8C7+g(rRUGcR#op@8Opm%bZP8np}~h^w|6_Hoq-$HvT#j9S$+P<w9{+0F=4t&ay@ z(9!?-`4?UD+>ZWa=fFIOx_Ic_JtO$&?7^{fHgcM-zGs!%v({`JjWM;g+1L-_)~us* z<t>;qvY~4nLPs6_>A|5!!_XhWQP!)?O7o_6Lg16Z`H!?(wV{JP;-0h~^}bBC!K$OD zZcnGv>hxAMBm<+?Y&H$EZq(})Kvd$>fZDT45Pu5BxEJ2jTuj=n_mpoI43#u)s)u8T zc>HT<%(UGPC$yvMB`wu-FQU%pu*GgjaIO;s9PUU=T|-20?c4<eY-n0rWVX_q+YMc8 z!Od+;q7oOpGnhMqd++XYl!adIuXF}EJ39(+GpDt>9zC_P$ZH!*47Q~OiN~bHe???M zmZ9m^t@JIzGuDzo8o^c;%92RNlx6Nr=rAPlVHkTXyeuA)qTDh-7Ej{VN?xK^%8=1X zXj{okM5hcHoko0;1gta{h*B~@7S2+Hl}$v!jK;6q;@jK{VoD|sJBQd3(uyc5VPuoX z#17)I7snv~2%lhr0|#52su6r5YPlFHt9wiapy1Tn6$LY*3}xBc$72j3?Wf<~!!g@k z60!UCfG?7j?^%oVp2Q5082CKDF7cB^s!eq3%?=1xzXvxEt_A$M7As<vnpvqgMKvPg zy}}tX^dpx1<BP*NOW?df#A({eWm*R|8G(<-WP;l)*(a(p@_RYPFWVS9Lp$&s(K!cl zI<fm6jd_WYaLY+2lW!fuwTdmVxTUALgvf78PG_Y#smzv8rI)1z)Oi)>GPC6KQff|9 zU~d1|8|QaH=wX%}5Ml3i?(X8SqY3eOA#xo9Cs7l_3D?qV;5w~%!ds)a#81`$Nzsu< z4|GHqGkA;i2G%r`7|9|JHQB2+EZs#FUO0Nkr&1uZg52`$V9?QL6&Ih_6QAl(9(eJ- zz+NifHqIMhHXRndAz9cv!rw~vtV32u(-!Xn{VAU77nCvGl=XrO&F{7op@+S|nz)-> zJ+qa>{r@$Vx0L^3D%YOi<bEWfLAM5dn~^tyu*h3U96<j#g+_7y3Vn~RY;JCUw5?yg zs@Kcc%k^p*M%CJ3!|L7PqxZH^_;`C;Q?>H7Yvo2+D>r(L8#fvtu)nkaHn9b7{wvyA zNAMI2pCDzcP~0lae?#{X^vCj8J4ZpA%NVqEjxv9VE*A@+xwwV)(2wZ)`~_>-*&m;R ws{F+#YpU{`PZU*o!6t>DROKa`D9=>o6`K^#ROJsgSusI!&*^)S)9?HL0#VE);s5{u literal 0 HcmV?d00001 diff --git a/t/images/Photoshop.psd b/t/images/Photoshop.psd new file mode 100644 index 0000000000000000000000000000000000000000..199bb80da3475f086344de8bb404493331b54ee3 GIT binary patch literal 17369 zcmeGkU2h{-^^U!pO}yJ}DHT$eP))N?F9>^VXVWCE<83~6n^f_xNxUE32deSRwKJRX z%yed)uZI@#P<ZSELeQu74J01u3#bCbA86qLsVYz^@qh$~7KsW3QbjoD&Zj5iNzzTA zZ0)Sa=bU@*Irp47_uM=8%-yNE`YPdw^GU<cF#8S@gyA#y@2R<^+KCekd44oSNQ$IJ zQ(I)Lv8Gr&{1bVbQf-^xbgpZPO?m6Nu4vNH)D9V{QQp?|(NvwBuCFO7zbKj;bbB;) zot$0m8Yb;fUZtW;&C%3Ja;8Boo3AU9-NoiMIdjFNlyB)KFRCi*$ro5p9{4f+!~D1Z z_RX)pys`WATlBS;SlQ>X?A$LZm$nR1TBkPOq-{l;$^P{xKhN@tJd?dSQ7hDpdAg=7 z?wE9S=W0XRS(m2e?4@d^a!Hi+Ce3Y$My{o(HZ?7tTGGte{K^;>Z<V2>Lv4}Y>ZqDk z-kQm>24#SeEM$3B#a^Gu-m2A6Yjs_*`BHu=U&@V-f0=KYVux<(<~m=@Ph^3mDYwci z3s+o*fX!srY}+Uc!sg~?esespn{A;uJv}WHN<yiWgBm$&TeHQjoMxQ|d8{MKEx(y& z<yoKdlHL)NTS75k5I|6dXQCEB9aAxEMb~(-sdw#}Y`3e(WvMtlDPJtoTx+T|nJX6M z>0GlgPIFSBG%k%#k57xOiEM^<#TlV)_Q-<*5IBwkdA{;!F2@6<yxMKvp_0u!MO8$L z%6u-@Q)9MkufYvQSBkIDP;8a%DX$1<zK~8wt>>C<>(-iX#9P<!iajHHI(zi;yy%#^ zk79nko3y!Vi#Ch|EzV57Adlfq6NZ>sbp}>N=vVIF1Yb~JLkBFJDpp;$6m*kn?+^_O zi`LvLF8;Q;p5b?DUN^Q)rM<RS_2a(5Fr4FWEfhp<Dp10nw#OG8rLdN3mVIj^REW3R zaa+T(pVphn_OKe;1{I*%`5+pA&T~&EH*4N;LjtQ?hW0D8g%QAsN^@eHAr7W0JPvC^ zG%bqaX0j{P(z~WaSy;hFtfyrSVrkW#gS5v)L${u=VJ^C(H!DJ@28!Vw+o_5pl*J8K zYDI{2>bT7e;%c>Idv!X2y=t}cf-ZG2G%PJto%u%AB?#KVn03Rqm=wO5p1sUqQaI)a z3c9Y~$hMO8WuxB;bavX5!(p+C)1n3QBHdD2II*&sktr2d8}E7a<HaYxQ|13%<dG%c zB1YGAl#wNYs%#FhAovtrbI4Lz4rc9O(9EiK@1TLDKv@;F_DpswC)1YLRqd=dJQ9{@ zF(boeT@m)mt^i3gsc7qF(3MsCTu)c3p=DkSd$&4cAL50qZJg%=#s}0fv|@}A7uLq- zkHQ?UJFK+ua&#YQz5u6Q??T0)!P*a2fr7uXbnF=Q+@r=>NIYt$QGNp<QHvzv19K&s zCt5f#SJWbj_`qC==7|;#%oVjrB0exzqIsf)19L?!l86t?m1v%5;lNx`izMO$b0wN5 zS~xIQ)FO%az+8#ui53pb1xY9`bwxGES8YOK3Nu^jKVxR=b3cUQj>>O9Y6>>zXT~7C zGsaU*(q#p9e#WjhuH>dzuIkZ+Yx9j~>X&&#RWPA;eQtSao*&Bz!mMFHE@fWt7+pvr z2*N^Rfv+zwtu`PhRS<;BSI79VP!3AO>MWZC6)mA|>IOCK?PcJag9dromd9WV!x7Wd zFQCeh$E#*WD(iH+3JIya!^|)h&Cb`wHoc;o9TC9VqHZcXI^?xf*zBzcSRb0X&EwnK z3MTmS?hcaIW&}2efqgqF4oDqQ1Cb_f4zn7WkwnIjV(HA9rnnuj77>MxK|`-=eR%Az z95R88G_^Wef~_C~kZ)p-BvpZ3V81(1`7pXB^X};K0%V}V%w@o<r9xpMSAd-0RHIlb zmnO=E$=k4VheiAL*TS6E6;*79xx%fda2KkDir|6Fpn_-7ir|?U<Q&w0u9;{W5i?ev zF#i_Cdf)$#_r$1%e&QLg*lWju1C4wn2U?XN^{n}xdapQ7L@ht)fY%ISjvrq>n#<gP zc~Akjxd&&g7}b2&8O&ElFkg8Fj*QQHCG7N3&-bB0_(4;6%bNp-AFJDJIICVmgjM*n ziq_JfbyhM5TlMrTOK0UfUCX925?9~_EssTLaeJ7h(;-)*Nv!uSy+<nEq7V(|Efo>o z_tB!Sn%FwT6)-j>7V@w(4JOBZ$dlt2<7!V#KHftP)+8V`zSG`{G`h$?q+OG_?_K7D zH4n1RPwaEtLO)ocMppVEzYjTnh<cb?3Zvi?;kr>h`}i(AruDd;>(YJ5laukjJKakj z_%3^3bsl&9n0+YUh1<6Tu^Kiy>KM4M!kcTy6m9cHClBv#+N<n6-|${X;t0O`h?}G$ zdaJutp@}(_+OYA|)3xNFwP)YM=N8>l>aTpVgru-Ij@uuFVxu@&zBpYTf4pb=BhjeI zVR6rc``x<Mbxr*5%;+BjA4|}+PiP!W>v7w6cj3QBG_415BYaPRdW`e>$IOAF%J%W# zKC^fq@?dg@<Un!+K4K3x4Ed8V!S_=$G|69I<(CJOJZ3qLWRiEE3}@?0u&;u7zhLd? zuBr-!d<neyV2LeAziq%H-?A>P2aH;xYEc1mI<b#mZWnAgj}f$q&ptt7&yDE~wpS7A zmcQeXBxA3d-r6y$WfGSdB`dy;Ne#m)dV-_N%wQWOs-mYMoRh-5Yc<1iw|~OiE!kox zDi_HjBB^&%Pwu|I`+j;TwUTb1ypaA7j#UyUb4uS%U0`Q2WuS2+oyN16+zYz^dnYx4 zK*-uKd6;{Nfjqm$URWRAV?_@z{>TO8z%M&B`4}rZ8#KQ3H9}a)eT;@@KerhEu#Z2& zxPHL!5q5<O=d{W&9D2&yoMzY;V-IjdUjRUywaPxgT4j8FSx?h{XVgU^v|3Q2!ga`% z<xpPz?#n)<1SK4~4Og$u1f%2v3e(}AfD>X6vK#wJ{}GF0i+1m(jM-)wc@xwXtd)Aw z`MP#{1gM0tbGNMSIYiTwaB=iO)H|(<?VEu0cn2%*rJ+1Wrdx<VagE$AVX@X#Rro>o z9D*~WnrvNb-jM)v+pS1;5ir)#hHmhxuC)PYpJm#z!}y%7cU+uxV+9Teh43LuRU~TN zP?s%e&h^MS$;yEIAbd|TWN9J9`&8T1yG9Rb2;M4y<G)nvcA(9f%d5y8@~J=r{64X3 z>rYXQnh*_fpb<Q7=2p%)m63uaOPw|kKgX?q8qNYWF5hZ^DA%}X{9a1UYSSLdkf_=X zvE4&ED^X}ix9lZru~A!Y!htDdIP8&oDv!Y7+nrfeX?vEs-%%c3%5ccg@|1g|2*8mI zNPNXq$4!4m?yY{h*`C)`-3%G`Qx5;Rr~CqFLayo>+Iqy+jcZ-oqMl=5Sw;m%+Cx3l z)NOF6J@nJ;<V}Rk#?bx93}P#MXBXx!r@+lSnr*H;HOJq2<~D!omoT<4*1|`WEMvA_ zUq)DSx`v?l0dxN2E$1%%Du=whf&>0$B*V0!?uYO#;R!Fe<pqG{P1^uE_bq@QYOXW* zdkCA2m3g556yURM2Yv(LrUSo&un9^)oxfoHHiL200v`u{2w@w%0*S%lH#}d?&*IT{ zesvo%0v(HAf>(-6L-$68(?4uQGS2%$U@?Xs-39IMaQomZ%&y#L-Uw)c9I0z=xERO1 zNyvV9z+?Mogv_o$q<TG|-GJ!-0|DNwN(Z#Z#vsVNK*(zb^BJ_76W*NJ@==CghbxC; z>V7gyWTHd(rGzJSvIejXUyDHo)cEv1HFz>f@&s?bJAZ<FfM2ZD$d>>ZCK>K53%}<9 zdy#vPc_>>6aOcQLtP0=nbD#C$*SHIA9k~5mk+nrFUgt_a{3iDVgU<l{_h0`GgK@Th z?;8pW<;W9!le@70|MCDe-Q|S)>-bXLJK@bw<_iR0B!ZWR%Ec+ZFjX!AaFK-036k)+ zI%JrB1=c<A%kAzG@=D6@)9@?l0LF^&8RF8ezA!TeHsLk`n{dyEZIa?V9^8wmfVaaf zq6`p&8IuD$9qR92yNCN5P5sX4+Gy%s1`Lg+-ev&&pBukMfcw#C>Ng0a?u@2>i$Hp3 TH1!SwC(ws3NlnF&noadT+zk#z literal 0 HcmV?d00001 diff --git a/t/images/PostScript.eps b/t/images/PostScript.eps new file mode 100644 index 0000000..4fe6102 --- /dev/null +++ b/t/images/PostScript.eps @@ -0,0 +1,108 @@ +%!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Photoshop Version 7.0.1 %%Title: c.eps %%CreationDate: 7/18/05 2:33 PM %%BoundingBox: 0 0 8 8 %%HiResBoundingBox: 0 0 8 8 %%SuppressDotGainCompensation %%EndComments %%BeginProlog %%EndProlog %%BeginSetup %%EndSetup %%BeginDocument: (Test-Doc1.eps) %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Photoshop Version 9.0x211 %%Title: 12a.eps %%BoundingBox: 0 0 435 283 %%HiResBoundingBox: 0 0 434.88 283.32 %%SuppressDotGainCompensation %%DocumentProcessColors: Cyan Magenta Yellow Black %%EndDocument %%BeginDocument: (Test-Doc2.eps) %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Photoshop Version 9.0x211 %%Title: 12b.eps %%BoundingBox: 0 0 435 283 %%HiResBoundingBox: 0 0 434.88 283.32 %%SuppressDotGainCompensation %%DocumentProcessColors: Cyan Magenta Yellow Black %%BeginDocument: (Test-Doc2-1.eps) %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Photoshop Version 9.0x211 %%Title: 12c.eps %%BoundingBox: 0 0 435 283 %%HiResBoundingBox: 0 0 434.88 283.32 %%SuppressDotGainCompensation %%DocumentProcessColors: Cyan Magenta Yellow Black %%EndDocument %%EndDocument %%BeginDocument: (Test-Doc3.eps) %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Photoshop Version 9.0x211 %%Title: 12d.eps %%BoundingBox: 0 0 435 283 %%HiResBoundingBox: 0 0 434.88 283.32 %%SuppressDotGainCompensation %%DocumentProcessColors: Cyan Magenta Yellow Black %%EndDocument %ImageData: 8 8 8 3 1 8 2 "beginimage" %BeginPhotoshop: 398 % 3842494d04040000000001661c0200000200021c0278000f4120776974747920 % 63617074696f6e1c027a000a492077726f74652069741c0269000b4e6f206865 % 61646c696e651c022800115768617420696e737472756374696f6e731c025000 % 0b5068696c204861727665791c0255000b4d7920506f736974696f6e1c026e00 % 094d79204372656469741c0273000e49276d2074686520736f757263651c0205 % 001154657374204950544320706963747572651c023700083230303430323236 % 1c025a00084b696e6773746f6e1c025f00034f6e741c0265000643616e616461 % 1c02670020576861742069732061207472616e736d697373696f6e2072656665 % 72656e63651c020f0001311c02140007616d617a696e671c02140005696d6167 % 651c021400097574696c69746965731c020a0001381c0219000845786966546f % 6f6c1c02190004546573741c02190003584d501c0274001a436f707972696768 % 742032303034205068696c204861727665793842494d04250000000000109e02 % efbd9bdc1dc192279e30a0e27323 %EndPhotoshop %begin_xml_code /pdfmark where {pop true} {false} ifelse /currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 ge } {false} ifelse and not {userdict /pdfmark /cleartomark load put} if [/NamespacePush pdfmark [/_objdef {photoshop_metadata_stream} /type /stream /OBJ pdfmark /MetadataString 3771 string def % exact length of metadata /TempString 100 string def /ConsumeMetadata { currentfile TempString readline pop pop currentfile MetadataString readstring pop pop } bind def ConsumeMetadata %begin_xml_packet: 3771 <?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<?adobe-xap-filters esc="CR"?> +<x:xapmeta xmlns:x='adobe:ns:meta/' x:xaptk='XMP toolkit 2.8.2-33, framework 1.5'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'> + + <rdf:Description about='uuid:b691db36-f92a-11d9-99a4-8c8e8269c120' + xmlns:pdf='http://ns.adobe.com/pdf/1.3/'> + <!-- pdf:Author is aliased --> + <!-- pdf:Subject is aliased --> + <!-- pdf:Title is aliased --> + </rdf:Description> + + <rdf:Description about='uuid:b691db36-f92a-11d9-99a4-8c8e8269c120' + xmlns:photoshop='http://ns.adobe.com/photoshop/1.0/'> + <photoshop:AuthorsPosition>My Position</photoshop:AuthorsPosition> + <photoshop:CaptionWriter>I wrote it</photoshop:CaptionWriter> + <photoshop:Category>1</photoshop:Category> + <photoshop:City>Kingston</photoshop:City> + <photoshop:Country>Canada</photoshop:Country> + <photoshop:Credit>My Credit</photoshop:Credit> + <photoshop:DateCreated>2004-02-26</photoshop:DateCreated> + <photoshop:Headline>No headline</photoshop:Headline> + <photoshop:Instructions>What instructions</photoshop:Instructions> + <photoshop:Source>I&apos;m the source</photoshop:Source> + <photoshop:State>Ont</photoshop:State> + <photoshop:TransmissionReference>What is a transmission reference</photoshop:TransmissionReference> + <photoshop:Urgency>8</photoshop:Urgency> + <!-- photoshop:WebStatement is aliased --> + <!-- photoshop:Author is aliased --> + <!-- photoshop:Caption is aliased --> + <!-- photoshop:Copyright is aliased --> + <!-- photoshop:Title is aliased --> + <photoshop:SupplementalCategories> + <rdf:Bag> + <rdf:li>amazing</rdf:li> + <rdf:li>image</rdf:li> + <rdf:li>utilities</rdf:li> + </rdf:Bag> + </photoshop:SupplementalCategories> + <!-- photoshop:Keywords is aliased --> + </rdf:Description> + + <rdf:Description about='uuid:b691db36-f92a-11d9-99a4-8c8e8269c120' + xmlns:xap='http://ns.adobe.com/xap/1.0/'> + <!-- xap:Authors is aliased --> + <!-- xap:Author is aliased --> + <!-- xap:Description is aliased --> + <!-- xap:Title is aliased --> + <!-- xap:Keywords is aliased --> + </rdf:Description> + + <rdf:Description about='uuid:b691db36-f92a-11d9-99a4-8c8e8269c120' + xmlns:stJob='http://ns.adobe.com/xap/1.0/sType/Job#' + xmlns:xapBJ='http://ns.adobe.com/xap/1.0/bj/'> + <xapBJ:JobRef> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <stJob:name>My Job</stJob:name> + </rdf:li> + </rdf:Bag> + </xapBJ:JobRef> + </rdf:Description> + + <rdf:Description about='uuid:b691db36-f92a-11d9-99a4-8c8e8269c120' + xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/'> + <xapMM:DocumentID>adobe:docid:photoshop:cbcc2a62-f127-11d9-ac4d-e8be6f73552e</xapMM:DocumentID> + </rdf:Description> + + <rdf:Description about='uuid:b691db36-f92a-11d9-99a4-8c8e8269c120' + xmlns:xapRights='http://ns.adobe.com/xap/1.0/rights/'> + <xapRights:WebStatement>https://exiftool.org/</xapRights:WebStatement> + <!-- xapRights:Copyright is aliased --> + </rdf:Description> + + <rdf:Description about='uuid:b691db36-f92a-11d9-99a4-8c8e8269c120' + xmlns:dc='http://purl.org/dc/elements/1.1/'> + <dc:creator> + <rdf:Seq> + <rdf:li>Phil Harvey</rdf:li> + </rdf:Seq> + </dc:creator> + <dc:description> + <rdf:Alt> + <rdf:li xml:lang='x-default'>A witty caption</rdf:li> + </rdf:Alt> + </dc:description> + <dc:rights> + <rdf:Alt> + <rdf:li xml:lang='x-default'>Copyright 2004 Phil Harvey</rdf:li> + </rdf:Alt> + </dc:rights> + <dc:title> + <rdf:Alt> + <rdf:li xml:lang='x-default'>Test IPTC picture</rdf:li> + </rdf:Alt> + </dc:title> + <dc:subject> + <rdf:Bag> + <rdf:li>ExifTool</rdf:li> + <rdf:li>Test</rdf:li> + <rdf:li>XMP</rdf:li> + </rdf:Bag> + </dc:subject> + </rdf:Description> + +</rdf:RDF> +</x:xapmeta> +<?xpacket end='w'?> %end_xml_packet [{photoshop_metadata_stream} 2 dict begin /Type /Metadata def /Subtype /XML def currentdict end /PUT pdfmark [{photoshop_metadata_stream} MetadataString /PUT pdfmark [/_objdef {nextImage} /NI pdfmark %end_xml_code gsave % EPS gsave /hascolor /deviceinfo where {pop deviceinfo /Colors known {deviceinfo /Colors get exec 1 gt} {false} ifelse} {/statusdict where {pop statusdict /processcolors known {statusdict /processcolors get exec 1 gt} {false} ifelse} {false} ifelse} ifelse def 40 dict begin /_image systemdict /image get def /_setgray systemdict /setgray get def /_currentgray systemdict /currentgray get def /_settransfer systemdict /settransfer get def /_currenttransfer systemdict /currenttransfer get def /blank 0 _currenttransfer exec 1 _currenttransfer exec eq def /negative blank {0 _currenttransfer exec 0.5 lt} {0 _currenttransfer exec 1 _currenttransfer exec gt} ifelse def /inverted? negative def /level2 systemdict /languagelevel known {languagelevel 2 ge} {false} ifelse def /level3 systemdict /languagelevel known {languagelevel 3 ge} {false} ifelse def /foureq {4 index eq 8 1 roll 4 index eq 8 1 roll 4 index eq 8 1 roll 4 index eq 8 1 roll pop pop pop pop and and and} def hascolor {/band 0 def} {/band 5 def} ifelse /setcmykcolor where {pop 1 0 0 0 setcmykcolor _currentgray 1 exch sub 0 1 0 0 setcmykcolor _currentgray 1 exch sub 0 0 1 0 setcmykcolor _currentgray 1 exch sub 0 0 0 1 setcmykcolor _currentgray 1 exch sub 4 {4 copy} repeat 1 0 0 0 foureq {/band 1 store} if 0 1 0 0 foureq {/band 2 store} if 0 0 1 0 foureq {/band 3 store} if 0 0 0 1 foureq {/band 4 store} if 0 0 0 0 foureq {/band 6 store} if} if blank {/band 6 store} if gsave % Image Header gsave /rows 8 def /cols 8 def 8 8 scale level2 { band 0 eq { /DeviceRGB } {/DeviceGray} ifelse setcolorspace currentdict /PhotoshopDuotoneColorSpace undef currentdict /PhotoshopDuotoneAltColorSpace undef } if /picstr1 8 string def /picstr2 8 string def /picstr3 8 string def /picstr4 8 string def /_rowpadstr 8 string def /rawreaddata {currentfile exch readhexstring pop} def /padreaddata { _topPad 0 gt { /_topPad _topPad 1 sub def pop _rowpadstr } { _subImageRows 0 gt { /_subImageRows _subImageRows 1 sub def dup _leftPad _picsubstr rawreaddata putinterval } { pop _rowpadstr } ifelse } ifelse } def /image2 level2 {/image load def} {{begin Width Height BitsPerComponent ImageMatrix Decode length 2 eq {/DataSource load image} if Decode length 6 eq {DataSource 0 get DataSource 1 get DataSource 2 get true 3 colorimage} if Decode length 8 eq {DataSource 0 get DataSource 1 get DataSource 2 get DataSource 3 get true 4 colorimage} if end} def} ifelse /_image2 level2 {/_image load def} {{begin Width Height BitsPerComponent ImageMatrix /DataSource load _image end} def} ifelse /beginimage { band 0 eq band 4 eq or band 5 eq or {image2} {negative {{pop 0}} {{pop 1}} ifelse _settransfer _image2} ifelse } def /readdata /rawreaddata load bind def 12 dict begin /ImageType 1 def /Width cols def /Height rows def /ImageMatrix [cols 0 0 rows neg 0 rows] def /BitsPerComponent 8 def band 0 eq {/Decode [0 1 0 1 0 1] def /MultipleDataSources true def /DataSource [ {picstr1 readdata} {picstr2 readdata} {picstr3 readdata picstr4 readdata pop} ] def} {/Decode [0 1] def /DataSource { picstr1 readdata pop picstr2 readdata pop picstr3 readdata pop picstr4 readdata } def} ifelse currentdict end %%BeginBinary: 531 beginimage 0202020202020202010101010101010100000001000000000101010101010101 0202020202020202010101010101010100000000000001010101010101010101 0202020202020202010101010100000001000000000001010101010101010101 0202020202020202010101010100010101000000000000000101010101010101 0101020202020202010101010101010101010000000000000101010101010101 0101020202020202010101010101000101010000000001000101010101010101 0102020202020202000001010101000101020100000001000001010101010101 0101020202020202000001010101010102030100000000000101010101010101 %%EndBinary grestore end % Image Trailer grestore grestore % EPS grestore [{nextImage} 1 dict begin /Metadata {photoshop_metadata_stream} def currentdict end /PUT pdfmark [/NamespacePop pdfmark \ No newline at end of file diff --git a/t/images/QuickTime.heic b/t/images/QuickTime.heic new file mode 100644 index 0000000000000000000000000000000000000000..78469063a59bce36dc58723255586d6e55a62e53 GIT binary patch literal 623 zcma)3&r1SP5T5r|$|5u(0wr+Ohz=159hX?rKrefYIs~ojZad)1$F_+^MA5BNm+s!8 zQ@8H@M;<*CHlv7<1P*WB{P<?(eZvEQ%^>b-g+U2O*oHoOq2KlZWKQ|9%XyM~*l0#$ z7eJ#IPyC5ZX^a&IPJym{Y_@0wK*a_*%783`;0(!{Q)DC0rWpzy#LGZ3KoDt;LZ2P( z58Ga;dURYiYs$Uwxnv5{uvs{Zksoj!Nh%Iio!%5YNmNlsn(Q`euSMt$HJ61rC-<2Y zpwox1@4)~dZJ5L`V~Z6r9CCrd6$YQq%agS8gzg@SQSUFPXPEb^uXm>>Z(Fr@K}#FF zrvaH{ft<yP_>4a4Ha)bCS9-Jyz=8#k*rD9*UpCepY^({Jy%{!EZ#kLX7;_oI5+vv2 qBbZ;GG>clfWLfAZ<%4vJ@-abCRyEw%YFsPTHIaYCq}V<9ANc`U+H&at literal 0 HcmV?d00001 diff --git a/t/images/QuickTime.m4a b/t/images/QuickTime.m4a new file mode 100644 index 0000000000000000000000000000000000000000..a6f4a905bd88d8317ebd6536112998e300a76da6 GIT binary patch literal 5237 zcmeI0-ES0C7>7?=Kra+3X-&~;CWQ-PYO}2k(uA0j*2I_;6)|AMm|=HlhwkjIJF^S* za}?!EK1BhA(gq1}`4B-x5Um>hON<xZ`7ii;X7{AqBIQDEnmFO%oH_4#KhFEUXPT@r z#@QN;6^44(Iz|s;Q0VRP!+gNIF)c$uK3~=(8<a;ftW5nidGpu4=xJjbHyJay%rqGO zO+PbUv^?v*e|qP?%^Hnq9*>IdsDzuN(ZuIH(>|>=`K@~r7qk4>opxKlog`y(Uy$)# zO`RY!`&@4uvp8j5`aRj$F_Os^t!kJr<?P&!Oa2c0+*Z9che6d+O|l|WU2o46J>)#Z zcwecQb*l3v--OYYtmeaE6eiiNuA7aj0@3kIpR3U{vv6^c|IHI#m<gFQ#c|xBae>B` z{#Mhbxy~RKYNc`Mo<$lOlvvXiMp2@oxy&~0my)JtrQD~P=wTl&TWe#d#)Z}S;z8|u zL-X2$eq!LN#!KR?I3+HKlj68ID83W#iUZ=PI4o!|(lRWrh!4aOL43Q!KEWv_#4#}@ z*z=ZnU7$<Mdj<PgBQ~I5+XQRGwL=hVNmzaS62lK-ryw?Tk;el2G~pGoTf_o=&cS+C z5YLprKWoH;&!{&3rjfJ1Bk*@#yevip_L03QkP$C)V)6xfxF%S`4}Q_70r6cB#74Zx ziS4q$4)%!Sx_D0@pA_eWE0CWM;{rMU&_5-xOAMb2WHxrrhaNKcQXCTO$qRDuzVHNR zyD6v*_Q(f4!iWvv?7U-_n6W_&#C=gv7tR_BY_N|#<mIwBEU4Rdfes^kkpC#i3poSo z${y@t3*Wni%`3eHeCV)oL!g&@_%vc0->^sgEYJsf>yX$db_w!=AJ#c%MUZRe^v6j- z9q0khi=3E<kG%5EXzNUFY(EnlJw-g!h4?-ZM+7o@<!gb=7uZA}@OMFcC2UUc!MUje z`64cC+p`k~@Ax4GbUEWk0zDfC@oyDB3HGv%%@1oM@AT~Vf}EqvJGEjTaZZTqg1zh^ z9{k%pUDKR=#{xahiXG0$UiyU|B=6*vIWe=Bn23%3+%M2Wj&J1XSh>|B2jr9(IP;XS zYt)gLZNJ{ooSw3G<-F#^4dmrpLA=a4H@a3I|KtTZ`HBT~;vP{qdhUwgjO2y0oDtN{ z)|kA-0{zqCoZz10|CksT+*6yIQ<_sV&NkofIkliJ<c*q<7wQ6cy62pq+LJ?UP&f2= zr!M5{ZryY4F?GP^T=)D{$?;9C=?O++`!DzWqV(_9JwGU0+)3`m?d~~!$z39D&O$%) zPOf>UR=m^W6M}x7>z?nCJQh~R){FYudyYQq#Dx#;19_$=xQF`%{*lxB<QD(P`HrxT z{aEmA#un$`o}<TIMb4S2A!oq%?e01LuL<m6&(@PW#v1R)i2*<K-Fbl?@#DwdbM7%` z`9cs2_K2UnaTdN~lfvF}<R`?qK+bmo{rP;)$$`D+H#O&;Q&%8|oR8e`jYm$c$SZXv zXY4^nUTs}=*WR%U)Ml?Bulx;<1vWkv<PkepYa{;XgJWV+&>!Uate}q60J!)3eeeV| zza-G*op{m1H!{|V&GsUFa6r%-tP#g?L9ery9^gzs>_^4N0$aq!KJri&^eZ_eU*wKF zU?Ud1bC)>Z4uLP;8PR2A9Y3s-OV)VDF8ycgL9F<|H*?k**-I>}19q{)8L*8Ga@K4- zuIAXcv2E6Tli+;Bx>39$$nR_7SurHgM~+QK8w0j?3SuWF^1(a%Sfj?o!g=f(>vj)k zz!rOKPOUHdjtz9|9^`<%1^;tP4t@!vG=F2~>C?2Pl!?@*O}&A~m^?FnB+w5FMYmAk zE?1vFwR@4D4e9nrD>;{&`(VaRv>Vv+q8k*ld>@vj3qE=e)TFIQc^-;_0!dpsLqN;* zR-!zT&U%CXhEmQ8opNtiU#Igz$xn}N@B`0zvMbfqt-WU+*Q2pL@LWDgCY=wu2-)kZ zYHF!PaT1bYW!-b@xn|qyeK@J)S)Hm)Qnksd?pZ56tNR9K?UCjjEAq6mk{#pnIrSc+ z5ij%{x9B+%`e{BC%PVWwZ_xN~{l4c%{H*hgTP%Bg3s$(*E$#JN-0YT8AXAZ_RK=-m zFH)Vh`aJ`A<vjEV<B^IKG`7~u6B}A|D#JxSt}~Q}i}_N)&+!N0vC6PVmOJW|2Na`z z7s~w+e-=7JrO@Y-=0wF&c3MlCCQn21ql}s-<A?m|u+38w>*ty#P1`FOmjk!d`{_xg zR%y+tq=Q=ysHz8EF8M)dSz*}a3^N*!-dvZ?m&w5Ln$i0;H){q<K``b><P}Mx)BV&P MxAd^(-auyl0jO-5CIA2c literal 0 HcmV?d00001 diff --git a/t/images/QuickTime.mov b/t/images/QuickTime.mov new file mode 100644 index 0000000000000000000000000000000000000000..c553122b6e28cb667e93e06b0935f376d2cbdbe1 GIT binary patch literal 3871 zcmb^!O>Y}j@Hs9eY6`@~B}qw>mrayLYW<lsX{<PnTeoRT9Yu`=6{<uwyD#zL{p#*Z z;^fo=N9YX+i4!Un@&zHmp@^a&nL}?}`M4qO^dFd+-F?p5`4ESWHJ*9%`99{&vk7^t z&#<g5LWpi`RaBs4Z=~nWi`tVtLb~n~((^TmfUt?00B{_Jj`2cRcaV<~a^gGg$W>51 z;8ic@TbL6OWI;5@+X)?cgrzWB049Q8F98WDa@poU<BHDKQ4rF_ZO1wwW99+b7*n|m zu7gZ>F%|;MBAA;upXfh^s>vXyhPuCh{#t_l^W4ZtMb#Z-jf(DUX)3dsDPp2H`lX?n zIH~xS;RTA2g+~NG04-+~oMl~eJDkaw>N^jrj=x%P!ug#>W1o-aT)w6QzwUBZ1&V++ z?|*Ew4R3^F`0NMo!d-hwZh;mNA#!@TVsVQm=$+*oi@vP=yT6Im((iI_?@)(XJ_n2g zPC#}AC_)z?>V^XP8qo7T-&Fy-UEl?Pe;W8OUV`yd2<L!b2(SqBE?^mO84yaDtcG|T zBR&YI;Ds$x;g2yy9JEKBkRcVZkgf(gVI!!p!I&tk0HO^2MIJ$gE$T2IQuGPOT7|JV z7L?;StQT=nCgv>ip$_duK0#5ADDopkU(_EKC!8;AC*&d)7F$>*@?c!Va2~<q+Qhuj zS73N<tAP#bgdfJnxrn_%D(0aBkG3K%`j9b~D;6?GL*(yc`W4nNK+hAO`rla8US%H; z?h6+7S>%rDHGW(_;D<-|nxO_EU%UuHw%P^u8rRx1_iwak5s3x8rq}g*P2l%R`V9FY z=rdCteP+y&w`q{cTaP~%(v1}7575yyycMDCAzj1sKpk|A^Ur}I9}jg67<>Nz=Y&rh zjLYCpMVAJi7^){jR=`%3?O;DehysqFjba%|*|v3-e7LD8RjwH<DeG&S1{g?38aQ0@ z9+lCfEFi4mzY!J9e}6=ud`FeNnc<2_<7tp;7zS94eeK#-9#G+w-)&QW(|BeWjk<}w z`t_bof5qqO>jo!p!Xv6}Xk6Cmb=hDJ?oYms?@R{n(T$~Y;XW<iUc6l{+@;qGr5pDO z^cVo=AIpWsl|vmtDIh{l0s9D+HUSiQ1f-(@#aDumpMw!DsRh2OHGBn37GiY0xL;cS zXzpswmX#{wbd7CjW?uUDr#*>kYF_%_aw%Q1ud|AFYu8~byGvzdx2nvl($)D>bG2N} zu(7&m&CpFZSIbMXYOS#x@F-46)HC7Lyi`C1g=F-)<uE#x%p{cb<TRa{PG)Cj(zDr1 z^roZHn{16{CuugFo}rnkTxL3#xgvI6nm<M79CbZ+uXr=a2&24I;oQ!pQrp|x$?eIc z<!q!fv$M0QbT*aECcq-$?wDMzB}{h|L-;X@%vBuC=9*<vj47{Kn>;T`pr>LvhFvVR z!kcc=TU-)qHwEiXWs>PsamSPmO(`+>p_B^ys!Gez-gI<tR;rR>I>Wkm!8y}rUz6>Y zLwhFK&*TM%w8c_R)_GaB*%A~k?5jx&I%ke4b4FJbW-^M3HgmYHd1=W4L*RUkZ0AaF zLU><_;F*_T$FC&Pvx!W$oXO-eGr7sxM0zThPJ3HM=Ts%9I85f2gIgGE;tG4{kNiE= zwfSYZ&-9k;Y_XlW6z(g?e0y&s9OhE(@qF9RnShfogR_Q8OSMW32CZUcCRFG)lp+*z ztPX7n`{k!W%Q#an+$)olAP`+5URU7iLreZ_&oCZ)ZGnKyGEk=M8TOw07=Omb>Kn|& zP>alT9>X2^E$E<l=cM*7syWylQ6Zq~tDvJz)b$+<N5f62TwyMwGTZ=AY6^6w$lHpw z1$L31!0ru<)cn2q7x{$5dwU1Y3|#2zyO13p9?vGn0h05V5$1~p4~oY@<m|uz9i-#^ z{o~W)bbPuveevQnI9$7Y?Kro6UGo<b>xTX5jz%QX6^le;k>;=DJreQyvsg3GlLsWE zx6_8i4oI4RlGD)$M2^PDRq{O<ZvFwmhP|^pvfWR}c(ffmi*H5axj`FG9p3oXe}3xQ z4hOroXF-8i!EQWr8+AOKA+Kx*IsDlfsc$$oSPg`aaKmXl+q5+k|5prorPAS!Wz(pG zmU5?R0__jnf%O2^>(L=qbMe2TNbYO#DLVn|U|p4WfX2hgv*}D4WTRdwcdV=te(=aS VZrJ$a?@Zu+7I=7k0J{wk{Rd$!snY-e literal 0 HcmV?d00001 diff --git a/t/images/RIFF.avi b/t/images/RIFF.avi new file mode 100644 index 0000000000000000000000000000000000000000..d18f3861c94f5d4dfaab1f65ae5016e9d51b438c GIT binary patch literal 1262 zcmZ`&OK;Oa5Z;s?P=!Qz9LnRcGDsjG@gr%|n7D0dWNL)dsEJAsNYTdLHg4^;u{V$Q z%#Yx}??6Z#;Mku6;y`}_vv!gu609}y>^I-c?99&YTc-Kt<ug=2u<%=}-7#|r_1)Mf zL$AMq5IR}Tp^L}YKtm{xa_Cp8A+!Yl3k{)d;9pL#`Jafz0Z4f4gQT&Bo|^<G(eXS_ z#NU2(GlfKK5i|efim{!$6fusT0wiRbFNao<{igLAeay~w<$;jM{T_h%++^S;^BkeW z(NX?+hW`A#l<Fe4z^6;(&ch}LpWq6~q3g(MSe^TT+abd?iLt6+bxl{wdbxx(MJcVM zr&tAs)in34w%NG>`VL_svkxpq%}%)tSP%}qZp%LW0WGa<jU(cmQjUA{*kgwD=i7G) zd#)k9TeB5A+M#`K_dKTU^Jd36KXt0Ew6(cX8|&jB3MeOd9QZ8J$A(1Qut#;!1uRQA zrSMZjstW@?v|D&5j43V`)q<mx)^T~gs8uRTReOQW*uy66VJ$7Cg4MFFuIuUso-Ao| z1=nKtNZ)UmlZ>!4q(0}7F3Y3Qs5mMW!}wTMtJSKkXtJgifKf=!7$@TbOCE_3S&Rlv zoY;%F2aOalNiQ65Lz2Lbr{x4u!=8m_Nii+1=!Ag`b<1i|ksD`>1fFA4*Mn;3d|hYe z7!6`SJ(cUo)TaSuJOO8Qfj=hE%waJT$ugzEA#KCfiO)MEqD>M|=qtl@pVOETPI23z zjACI}p!WuWAvHrFf|glGq}y;qF5#pBo`wX&vr$m01y$>)s;*Y_QndhMr6_63aLsje zC#Hmlv1s9>iEa8J+hslVz0FqN^YJc;hxDu_i@pMu@zdSZp(ZcJ%eZrQ0!|qQcMX#! z&qfV4vtgwSCUgX&C|=$tnCTAG!=3KlZP3NK3-S;|yqE_FEcJg|V%FUguUxD}AB64! bb_Yaw-U1PC3;1=x|4;ML{Am3Cx`h4$olh;J literal 0 HcmV?d00001 diff --git a/t/images/RIFF.wav b/t/images/RIFF.wav new file mode 100755 index 0000000000000000000000000000000000000000..535d9e9633407eae1dfd2693f98959d67fce1678 GIT binary patch literal 224 zcmWIYbaOkwz`zjh80MOmTcRKUWHSQc0XYURW@O-C@bL@|kpPN&`nmagItRIM1KCCf z2Bx|O7C^)RmhS<IrB-C7rIw`@u>jcyMn(pyMX5QwAbq~>0fvSqmU><R?m$%~nYkcQ zLo+KQV=H4*AQK2ulk<y2fOLSXUx;Ibf^&XRL4HwUNoIbY0z+zUN)D2oe*sWfAv^%0 cFE_6Q<mQ6Zypqh63KO7n!5}5EBoV{_07E@5d;kCd literal 0 HcmV?d00001 diff --git a/t/images/RIFF.webp b/t/images/RIFF.webp new file mode 100644 index 0000000000000000000000000000000000000000..41e2a34bb359f3e8864b6b4f06b6995d7d6d66a8 GIT binary patch literal 58 zcmWIYbaOLeU|<M$bqWXzuuxC~vNtg?%w^OPU=U!?%QTtgs{{fJ8QvNUtmii8Ffjc4 JSLFay1pr?`4JQBq literal 0 HcmV?d00001 diff --git a/t/images/RTF.rtf b/t/images/RTF.rtf new file mode 100644 index 0000000..118e6b9 --- /dev/null +++ b/t/images/RTF.rtf @@ -0,0 +1,25 @@ +{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\info +{\title ExifTool RTF test (with sp\'e9c\'ee\'e5l \'e7hars)} +{\revtim\yr2010\mo6\dy19\hr20} +{\subject a \ldblquote subject\rdblquote in funny quotes} +{\doccomm \uc0\u12473 \u12488 \u12525 \u12508 \u12501 \u12521 \u12483 \u12471 \u12517 \u26410 +\u30330 \u20809 \u12289 \u24375 \u21046 \u30330 \u20809 \u12514 \u12540 \uc4\u12489j\'fcnk(end)\ +another line} +{\author +an author \{with braces\}} +{\*\company + a company \\with backslashes and leading space\\} +{\*\copyright \'a9 2010 Phil Harvey} +{\keywords +keyword1, keyword2} +}{\* +\userprops +{{\propname CustomString}\proptype30{\staticval ABCDEF}} +{{\propname CustomNumber}\proptype3{\staticval 123456}} +}\margl1440\margr1440\vieww9000\viewh8400\viewkind0 +\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural + +\f0\fs24 \cf0 This is some text} \ No newline at end of file diff --git a/t/images/Radiance.hdr b/t/images/Radiance.hdr new file mode 100644 index 0000000000000000000000000000000000000000..877ea1b232d1ef77414eddff2bad0d559bc025ad GIT binary patch literal 587 zcmX|8%Wm5+5bT*>F+h(6S(36WF@RARjRWM+I<Vb5P5~v+wNfb(NLr2mK1<iB0PT=F z%USO5^S90N`gZyA`-%<q@H(NlQFz-R{5k!@qu<-wg|xYp@I82o=t7){p^j)fD^;OO z=Es({JR+0e)BaLI3;qU`XLIn=1;>C4e2frs2HuRANkg>tn3v#vfD}?2VgiIFNQF6J z4N)ZY>3Dd7qL?^BTcw=+=xY0lc9u92q<NIo)X4_qiUjRM9rFJ_?>thv`%CpQbvmmi z+2(~(nr+uNyNBgwwZMm8$b=FlIvZj?G}s-E*t!v_fR<M?bCu6=cfEr$rbKl@<A=)m z7%;rTh5Fz;yT4sMEXb%hQ5fkmWu_HfR|`Ftd4?p<r-leq&Xmb$p^8EpgJkcKqD%%% z2O2JArV9>d-ku{lNlXXHZq}P0%iSW=ylUgK@7%NhT{$-H+m7ChbX*ea$!{8;ym-S` j^7BNItsd{z+g~(%CdfTi7{{eljPWNr^5qeVeWLFjB59U+ literal 0 HcmV?d00001 diff --git a/t/images/Real.ra b/t/images/Real.ra new file mode 100644 index 0000000000000000000000000000000000000000..f5832b2dfd27677ca30161ba96c99f4b8953a9bf GIT binary patch literal 130 zcmdNZO8m>f!oZ+clxV`hwf_o;%}@j)8DoI_1O}E#_raJE$OnQjB_JWdz{uj6S7N}D zl9yV-z|0^Jl98$qoLZilm#*NRS(H=EpsA&$keOFpl37w(qLB8dNTD<@vn;i!I5j6H URiUc1I59UjH80~yUV1760OA8Aj{pDw literal 0 HcmV?d00001 diff --git a/t/images/Real.ram b/t/images/Real.ram new file mode 100644 index 0000000..da59c1f --- /dev/null +++ b/t/images/Real.ram @@ -0,0 +1 @@ +rtsp://media.real.com/showcase/service/samples/rob_h_realvideo9_28.rm \ No newline at end of file diff --git a/t/images/Real.rm b/t/images/Real.rm new file mode 100644 index 0000000000000000000000000000000000000000..7325b46521f2a197c59b1c89d99f5745ec2925b5 GIT binary patch literal 1915 zcmbVMPj4GV6o0mpxNh3YEg&HTV%n-LRE_PXNu-7YGImMRV#l&AacZk&J+VjL-LYoJ zjg5qmxWHH7z!yN35C`DY577(#0C4NETv7SG+1)q-wIY4mw{PB`dGr3wRJyHCiRc{V z@Ml=*boV-->&$%hVS>3QM2u7hJ|HUAiNx<j`M)SnrB<`kh5Qi^@Si=9v3;?Asy-bk zEqc~SFMQKuraD`jL~Gy!$HMe}#dv?yG7;z|_%g4lO>d<U5EXv>&0!f4-Gh!EH4}tw zekdd3Ydy{tSwm%{RXBlQ9hax2B-Y$x@KC)1%7Gp#-wW3ERUlQgud(6l1l_I@{_hi= zY3Rtx$cnCKRWx*}CH&d>MWPa?EF)jW;PZ5Pb89S`3SOs^kJ$EIn7GVadLW(2N;r*` z&$??wryD4ZRXP$)&nEhFo7L;<)%99!L)_fn+}N(&VB0;SQ#&$}24(~C$sD3QZQYiE znu(6lgQ+i#=r!+(eWOFsMZMe79%wU;D>p0GE49k{hWK1X1AV}OQjO>=B2xRP!2db^ zJ*4qa4WvFyqZnxudI3ATM6}wJv2WCbeL;dk^ks~iwFFm}jXoecaaYa}(jY0-8+IgP zDLf;^IFmQ_+I`sW0E=~DmBrrG&PWB~wr3v7Ila@+letmDkrk-WmN=>_)rGIa5WVWQ zT9}xnZ@YJxa;pl@Kr=uxbOBfZx*2i5?UZ|(&|Jp<0G?-ofp=X2@`jaq@WnL5BJoj8 z7o5KH2YMdJJi~I^3tb_0`y=TZBs_K?BFM$-0DI**%7Wv-FjDUH)t*IPW2=1EZWqu- zs>>qf^sfS$XE@Vn?&2DVo}L=th05FVKjW7jk>$@@SNg{D$5<rkew;3TO=#}>lt0J} zKraEAXDBr=$wO^;lBs=I6U$BohSKR?rz}FS$3K8BYfwJc0Q107BN-7_mPISlV^iI+ zkA-9U2FNG=l+ra&ekd3?0_GV?xanR`ed#K^^a223)*CipW9Au3EfvcCeBz8(t(@8F zB=D3QvbUi>>8#vKL=&vJF~!etLz2G#JHfzdj-6go((mA#6Z|Emf2K4`l#_jVqPx%n zvf*Rn%PG(DlecDgW#i=epyi64Sr#9=F5T9hTiAy<3(x!Yo&HG00-u*YChT(o^$5=o eUz3IC$cksuUC|@5#S+iYjfMC0;aRA$YX1Y-XgE9o literal 0 HcmV?d00001 diff --git a/t/images/Red.r3d b/t/images/Red.r3d new file mode 100644 index 0000000000000000000000000000000000000000..d2bd0b37132482500fb48a9cd29d762cbc8cc3d3 GIT binary patch literal 1160 zcmb_cT}TvB6h7nbY?Dnol^a$YTqwi!XPKX!UE9`~-Ps@e)pfNra8dft3d)kAg0_Dn zH7b*`H+$%zmp~#R*EO++a4X0M!Cne72r3FnilRC*?Mn61OP4v{cg~$N=id9B%K(_$ zqM@Kjb5W6{SjZkdW#4`;Jau~glW&vn4<5<7-8E{H0^Z)D4$rfvsmnmY9|J?GWy{X= zY#zSLhB;ZL*8s60a}nfnzzZJda*yov2m*$bD0n27N5H2HLyI8srJ~bS8VJe25GLF^ zd<*DE+j9(Nhq|#GLvoA-8IqgkIcc6}Fh{Iv93W$upKr|5+yXz$;1&wJ3uzHAxq;=D zh`iw91zb9tTPg~YEX(K>xE!KGastgSqk!XzP!A#tVueOFI58FlS#<K@Kp7tlxiP8O z3`|oAE@Hu;6c8MMwfWy_3+dV=L^d{qpu~TfioRh!WZiIHH(-5kM94z{!Qxv%>v)Pf zkLA56DtAU+Lqv}NT->LpO%FN}uwZ5oiV)A52&xx0p$Zj72Gg_>*^2RMBR)#jWWN08 zhSG`uEw7NQ&8)3+=HP!b3Q;+o$NH+KeVVHd028TI?Q#LCvVJDmxD9^nZ({(v+o-p- zLT==F(Git`Sf$QPnN4OeV}~O36wt5{fsg6oCcIZoTY-vyMP;`6laF7ac+DUn?t*-L zxBCYU<O6ALHJFa<p|I2YYD()u{zz3NSRyBIdltTBCX2X#77H9XRz7rcu5Rjqfo6>3 z`T_29?5_sUa2$I~^c(Q!U`S{B^0yb_4m$w)$$7QQT5Ra^tjVhOyd{P|FndJ3{%)z^ z_kI7Qr0PE^Q%g3NPvu<nHjIST&O5e2Q|scySm)EEGNVF$<84>X!-dL)38JhE<SI}V zQ}@2SlQ=t4mpJ#}UNUR`sQU2cfSU99xzZudSM2@eip|}w9$Gw+_!9e&2s{}Ze08@^ zO{TVMUs8{>NlDW3Z;Wd@@{VY&<JnqugI#M|`$)TZ_=R@0PeKhZfE|^-%p!Clz$#s% cEBKFKx$c@;e`U}g4dNNEnGkxgDUnO?6V)Q^A^-pY literal 0 HcmV?d00001 diff --git a/t/images/Ricoh.jpg b/t/images/Ricoh.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67993e250ed79b2dfb8c81e80eed7b5cf5632e1f GIT binary patch literal 1903 zcmeHH%}*0S6n`_@F6BdL5#=*s<xmg|nJph;V^E<Q(4g4Fm}n#^0#ZZ4R4`&Z8KWd# zU=QlCC&JO_&4VGv6DA%w7(Wt%iF)$jf3W^$W_L@(@E7>D)A!rA@4b0nGwvt%o0&g- zH#<c%GD7V{6rplfNgSvK%VAXtR{*cFsKQa;m#mr$aE6Ci1BDePddnIEyusQ$9e87j zz~?64Uz9(1uH+4{|M@seA?*iFDg4{oO_UxUyfCEYG?=+Hlby5DX<G?kLqpnL^Mnv~ z(zcW0sAYF0MPIVprnbSu*7%~e!}QYa$vo_dYL{AyaV@oa_$kpcQ3?EpM8X!!hMxy- zSPliabA@Rg#tmBGehv75!>CNh#LqfKdD<}o`4uM=;BhA$*xqzXyckejC*oljxYWaN z?34xidFQ^2fsbO{a~?^|A_#k<;Ky$ZQDB}eN?hQ6y(8NN!^h@YA?)MuCbpn|)$w04 z>~{p}6Id6qWZq34@9{X8lFNR}@8={}Jq4h0Op~0vP&ze;BosylMg?N_CPN`PdAv&` zdMb5h8_=nV>JFH|TTxD>(2-+AQDX-V1%4<RRNDA%Y1=K>{*pH7$veUp-87od&dv{y z5MBht`{3~)9vLH4vBp%_<*AV*_tbgGTySDYo*QW=3Bl4ErrV_=BZ|SI73Zl6+LDK# zX&!l@c@y-coR4WvPc%2)Yu@<7ldBE(`ipFvYwEk~&cxMp_WIm3PC;%mpRtB#r{=B^ zV%4+3c@0Y<N5A6je)X%@NkHn~4Xa4S$FIp$_24Swl48YC8Q+fusp_2TLKMs`eL$`J z`{N_*l@2XYg`P2yOmta7B-M`uNW-EG8J$EsE`!TTAHw=ivH~0(l^qJDkM+qneT(T? zCNi0!YR%BQ9e23dU%bQ3Gdu5a&ir1Q=Xr5H<QbPVgeB)%@#Cq5TyD{tpI*p~&t|eS zRyLQpF=<U?<}>~7S9(Y_(P({jeQRxPYa-qpPjtpXo&7zM`ctPArS>9rpuXN}vf_1h z@!q%<?@je~bo9btpl4t&v*I^*onjG;XT)GF#AD2eG4~xVB<7t>nUW%NmxOTF{6(={ U688&L7^r{Dh|vjpMa}N#KiLzlJ^%m! literal 0 HcmV?d00001 diff --git a/t/images/Ricoh2.jpg b/t/images/Ricoh2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c17732aa28184a75b1273160662825b6fe31c18d GIT binary patch literal 3187 zcmds3U1%It6h3!mcC(YV$!?8p(#CWMy6I0^XD7{?1c|%N)+E@}vW*lfYB$}qUFhzV zxG6>|#27RnO1cP2L0Ke<lu(NLTzx2gv8afMRuC%mrTFAS9(?HdojX6fZDL>gAbNM_ z-tV4!e(pWz+%x0+?A+9U-2Y191ku<S?IfZIZ4gbQ0HyF;6wMN^2fi($5=Vho#70sv z3j9cHp^(HR!eVQHo5XgH2ik-sWm|wYDG$}?b00|h7SMOTRUpmPqhuBy^KnDw>L=8I zbzaI4=~?5!8f8a^o*i*@&`|Eo>4I$>nzD`I9>ahQ8ev2JXqjem!0a8cl13siu(uC? z+CH?yn3yr{7JcsJ$tgNCRVbB5$H=sLO=xI>o)-KRRwvJ#=aZmCWUtG<QTFT5FBAKj zXoKvV&|ekOJwnLSM`z_i402tFLNjD|488A;k<0Gb4rZn+FS;YW?T+d<?zr`qN0-_j zxC;x_i)WbH=Pvm1S1-(c7~qc=I%_ds=<@JuM2jRnqM4RuE~<Wxs23Nt0AD#TTpppQ zbY2N`{!ppm8x@t<k2tyddqoTI?Mf)%|FhEI*+u47A|8fNMfY$kaAUy#SLGbrRoaO( zrSc|Yfw+Y`s{Wo6rdbu9EG$<QKW8IURec<$YRJb8@g=2Zcggn~_OKMLqc?h(Z=u_u zJ$xN|iDQ~yD<{{YVZSNn$7A7P{~Y7dahw%*F8IFjdOy#zh2!?A?|^jpk!@?){BanS z7$?`xVP7nPN1KPAIG2%U+ItiZ@KV%`7JKc>Xy6fbDH?c$$dEkZAb7rq4$4lRwX8({ z8U=_~Np!-J8r6@;SzQ-_VUaSzp?GX$1l8v{9F*_)gM?7%d3hY%(&FS)&KND7uwQVf z87D*ZaiR%2ik?ryPS_2^Cq{h=eT0+w_;VO=`N4-X`j~I9l!eS0_{+sM#vp$}*JvFy zu^ffI#m#0O=negZ`z`e-v(8P_2wx8_w5R_P9fDukyD9MhhLI58-T^K}$y)IPt!KdO z8%XrmXhhB(Z0<^J6v%2?gkgg^XB7kc*33B$+YUPVD9xwzW3(XX4US}Hj%F$Py0%j& zDVnXOS`<n%XI&c}8hdFxJxuJ+sba2NuuGJ+r%U<VggsrRgEkG@cAoaviTuByf_QRv zXxaWgjweS+Gf@fTG2751-Y6K%<8mrUbLQk+K-?o|(etVz(^(7X?*g$bKe+CG?nFL? z4PW*W@{VO;EpiQcC-tP6ztP1#jDx(3tRU|skKDtCK<6FgourR5f3r{5!w7ec9t-GA zv{BLx6o*Z;+2vtTY7Kaj)K*6iz6ta}dPLIkw$h)b4w>Wb8KnYw>3Pm}F^aD+=G`Uf ziw>9G_>M=PcIUF5vE1X{oby~*d%LZkZp-XWJkg!#=}siN&AqkTu?n#W-@kf$r~%Th z9FGhi-re`l8o+vYtJPu9>)(uZUrBnk_LZc6ChESD@S(uF!Kw7i$RH0BYN>2@eVII& znJyM*jPj}J;zTJ|IBgV)xs#JdK3C2SI=4hMJGOs3jjuX(5gO`J`tZ=`C}Tm(hYKf5 zMtSDUBptAiyVv+Yp-e+|DPNG6I{j*)I9)!)?Ei98X!$=>ZB*Pie$#QC2;nwuTHAZh zuQX3B(P-Powyw>ayR7)OxV0yawr8-H+h8UwTjqXEJlxi1v>Wl()_5{*#FLriu3bq8 z?CafkKe5`H^EJgHC@B$DbdnMiYD_p+=^4B~@7Z;D6@~Dgzo*4kQJfpJUPTp*sWEzr KzMyT+FMk8n!68Th literal 0 HcmV?d00001 diff --git a/t/images/Sanyo.jpg b/t/images/Sanyo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25a106b5a4ba6227769a336be47051ef85e0a705 GIT binary patch literal 2165 zcmd6pU1(fI6vxlpxx06F4asgynrxdk)5LD1+r+z@?y5^jyUhl(Hi;pv1?vZHn|>^G ztCp=)*nl7P<H3h?MKDF%VDnJ=Abx-#5h<vZY70eQ>MBU8X!S`1MT@fj=ia$wpiRLy zC!9UMd*;lUGiUCdN&Rwt(K<4Gq_~$TpI=V_BD#ednL(|fDx?YA4t*LD1_z<fLYf&T z1}$YJ^Evu+@G8Y$f^Szo1~{R{*1$<{3-k|=TMajk^eMh*I&uC4|KTUvmK}fKK9S4c zli!{l6+_vv;mNFL9X_yUcll6pw-|b?Z^LMLs*iR|4E2uf>=#5M7%%hk^p12QInjG( z3Nzbwe<opP5($w=W;XU`>=bp=@n_xq-$W8`C_V%3dTA-Q9>p^<@Qg(!l$}i4e8yeN zyYM#^p98aFt`EcdjAL&68tl9pa&o&O{T2TL_ElY<-@sPYomb8gP%P^nR4n%+r2MbJ zzf!emf)imXdI3C*{z=r2=2V^u+h%i1`(@0zb-rXFAH|n_$iZVd_LSx1iIBwR-LXJ2 zH0FwBNz8dS|4SI_Q}$w<$glZZijgt}G<#6vkj4#~znojn^8sWS5`x@lH*aKHt^A>! zah`V8h6g{2I|c2$Z<s|;o!k{~lv`k!c*3TG<!;I>{P-~x<B_<=rr}oNb@(@G_9l(P z8b>s4*4X<pWc(J*-m38mjoUPC*Ep(J=Dkv}T+b@ar$gh_8n4l~Q)8i6zLje=dl&e5 z*ygeJZdHf3@Mhhn`K(hcbD&0xRzSTEA8ImDd7=y8GfpQSv^E9i)L{v}k9fD>U(tz_ z;0qMmD)=lF9ud5S4O9gGlzsf1;B$<h5_|(Y_m1G3S?~+N_p)cc7yL6C_*?J{)o})G z3O;B)PE|2({zNsqVtz!kBZ8l%-*<j!u4fl3v-~RCe{|A3&n}$YW!}%OzCCW1*vl8! zn6I&Ke{3+nqlf=F&o?6$TQ=4c4_!eP|1Flb=w(q>L(0UV;=yu$jBI@4@(W?eWjSl| z=R^n5AdcS9UqrpH(4ut$&OToAJqb;LU*&JBFTQZctB57{<WXr^SBWo3?X+o{W+!RH zx@K&%X7JY#ewx;*z7aY~i|k(X|4*8%kb$Zg&Urm~_g$c+Gf^h#C$4TOdFXjJSq>+o zcax2R^_z_0Jdics4!fZkWp$c&<9K=?ceqq~N|g5>F6}y4C>{{SQeod7F;yrR2J7FT zS}oylv^m<-*4C4Zb;go?F|@wHlx%~!tkZHgYpgXI6&)hh-X2TGL@b?4$Kz=X*pk|E zvtdhp^|KTS;NA~#)<s5y@d&GbLR;}3sU>;Jf1L&Y4|tuPj$CJ{*QkMG10p;^o9I32 HtbhG4Dbf1u literal 0 HcmV?d00001 diff --git a/t/images/Sigma.jpg b/t/images/Sigma.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac6ad9c5f4e7f2c76e7602414c161842028aa78a GIT binary patch literal 1531 zcmaKsO-vI(6vyB0mI4KZ@*xyR7>OxHVzaybplk?QD1}BKNIiJ)Qqu}e`axiuVB*Ob z_22<H84?qs9E?{vc`}BR2M-<$eq8iqjAxJ5|LacECMeUq&Trqm_h$A#J5xETd~^Mo z-OAk}N+vH*3lVv!Ls7{Mx)19Fx1oOo>rymQ(6bFFP1XJhcu?{l_`Hl!!3J^%(7%A0 z;2!jEVcn`zhhuUNT-7=s!Rs!fRB~=H=KPCP+|Y>*Fv2s|`f7w&UMtz9<&Bas13G?2 zI2s{S*F%;bw2TR1j9a0o6*e&c?p<f4J(%vP<RS3L!}=;lC1)@XZ8sAZLb_?{+P1Um zbBK3Ij)IlPPK<&#aqW1j>sx@oX~&uC8n}7Kso#WJt&+LCN5<Sh%$=QP`iYmzfN4+8 zYv{VNS65oya}@fD&Cw+PK+(Qu_4U(pCs#umWxpX;GS90u_?skS+sWM!BlcA~3*Qn8 zfX2FC#@{k}4-5)JUc)lSg`rzP!wQD}sX9W5Uuh7=d6O`%<?JqVAI4Q`g%8q`25tsJ zCTOqXnP@%<J;AKsE*x&@k0qcjm~$Z$zFDs1tg%&c6we+R^Aa&_V6JljZU^(4UV~3b zJ_MhZ{2tsP`3T%8`8(Jv`4_lL@^5etnCtV0(+l<j-QY7|K2!Z*e&cSi0QZCWWQ4#z zFt1<0xakmC*Nq8QYiVv_mME6En8H)Jn9r@Q+1Q1UuuEbbXJd0^ZklLzYrSNR>47NC zl!`W!PN}tY#-Vv6NnhG7Glh6`!x}RXm&oPw&gjgHg^JgM36aX$cCNT87E75d(baM~ zZy6@>K??<pNXQf`*?cy=iLw8m#h@NEVb0G8PDCSdb0!>2L}SzOm>G-k9%}Ng;Jc=F zpS*)2wfp1)xbZ$wROcjohF_IDgxtpagcYpa6t#XbUM>`F3wy0xxLHi+@*-DAuVzIi zZKtOyU+5n7bawi>e4~ARqo#k@ZwCBmfvGUJsd%i~;wLqw*XI*M!r$NTkNAZ@5|50H zMUXHZo<1q9K2~`{-WGf*Et)bys#npxO68EQkiv(ivAK_Va6>l+Fnf=ADxaxcQ&3s+ M(j|ID!<A2e0sb1l$^ZZW literal 0 HcmV?d00001 diff --git a/t/images/Sigma.x3f b/t/images/Sigma.x3f new file mode 100644 index 0000000000000000000000000000000000000000..731f6f021e936a4de10ca5f5450875eb58e08ee9 GIT binary patch literal 1464 zcmbu9PiRv?5QiseQ>%i9Rzwse;6YTHCNI?{Du&nByd=^zF|Un(KqWOXjkHy;1?xdP zdJyy^C<Sk#c=RYzK`%m!h^L}AE%YFQh<FgeZ#GSvLW>7q_%{1yW@mphyNR1Cj`+nd zVJjStSka!&_qiiS4?Nv2JfGS{mI5MYnR`<cW3}q&q}tbeeEyc!K--p0?VH#08e3w1 z?#}G|+}umvUg>u<`eXLtgN0d<TZ!&3XA*(^<-~@o|I^_motjW*3whc!7dn4an?A?N zQ{&^)!P<DKS_zg*lcnR-yBzPwzZH6!-0*4izvFceE%GMBShqp`i>gQS>*G4f5fPuv ze81bV9Pij!w;@OMT-Eqp^>8yzEbD3IjiZuI*a3TBAB5pBXj4zX5S)WcFb%5jHr#{z zFawX^F+79k@B&`LTX+W_U;#eDXIO-<@C|;#FZctkXxj!Iup9QmLFj@Q^g$Mia2`r< z88YHYj`b1LtNwx{jb%WF(VxLLh&9bj<dpQu1?e{t4)2~!$%KqaO{y{~dQ}~<CCkTV z)v&lGCL<|hS@q^jj)67aAldqjibkBrJ_Yu*MI*yv8HEwPqtb)L#aAG6(ZqRJEC~@4 z!W$yfA&GGsL1HRstVl_&G3u#gSe0ZJmtJC`tcf$mSs~a@OTH<_B3lHsH!j_9s7v>< zO?5hEv1(81wl3rK=$Q6z$Y@jbs!aE>Ks%RS)5(Z*ubhBOy|#%EGP`D<eA6y@*4I@! z__L_3-@LkQ5TD*V)oU|fRTsn3Z#t?SQw<qTDaCI3rsE*CM!fc1>(-vw?4f5dL``}> zxKY#-#izZ|dNiW>X6Rmxj5cfZKBUY_tv|?Jxx%RDr1=|>?wUwF!A7K>k@mkHnL<gL z_h#!!qet(aur9(#g-NHZzu^G$B?v(#Yo~VlR_0cEb)LG;yo(t9BY496O^Zmrkjsye F;4hSfynp}z literal 0 HcmV?d00001 diff --git a/t/images/SigmaDP2.x3f b/t/images/SigmaDP2.x3f new file mode 100644 index 0000000000000000000000000000000000000000..a98ea379d9b51b67b982a704f66f68c4527fc423 GIT binary patch literal 4364 zcmdT{U1$_n6h1Tio7L8h|Iw(UwTT+DotaJ6%_{0<ccY8hWZjKF4}#q^u`c9C;>Oxy zK_s<4SWLG<rC<rI7LiiKO0o1sqz}Fn3We5MN-gxQ6r>NOh0^ppcV_O6F-ji_r8j&t z-<*5yx#ym9_uQMV-o5=EQb{*-JsyplVXc0bF>okOX!#J)eLpjz<alM&VzWPsmD0#S zX>4HjULr;Hczym*AXxV}jsI3&%%sYMIH+)AKHy&a^xf$n>yBlPmk$x;a<l>6K?*7J zgz{W`omRq<SC#qXflR?4Da*(wIMKVxa>+kX*4a9kPBFyTh0yy*F(tpPE~x3eUM8<? z=W9&<Nin-4mxO?u;95FwTAw%Y!ptPzMnsQB^oZ^>Rxx$GBViZ`Gp-rYgx;Pob)uE0 z-f_HB)2A*<-hF0G&5JY5Hb<5xi2^X@)lJiw<PAiG6{vlaUda!?saQJ5JypGg-Nc@$ zC#pVaf1(<&Z6Z$9pv|FJt#k2^)IVE2!8Uy#!p`~XX<>gOBC>tT@dx{OO0macwkg$# zTqr-~ak&5fl+WS83-2wl^|6ZgEjtRQ@RDPPxmxq*lE=k;HeU}Nze}!(IIM+lLzm$& zOu(BU!X_GLh~v@7@7Xdkn@o)4aq91<iKhR;_pdx&?go_-n3Z#ZUFq8oZ<q(c2e4Y^ z-kn)IeNsL|e!)G-F31CdhoMlxDArf=cu<|iMNz=)kg)v;nj`fmA+hu8o1&*Azd}z- zevRfyev`tI-=ccS@8HMh*!dDWiaAo@yGx72T-am22ejDn!SAIdf^R4ChiR#l=cz$( ztlfWrmN~hu>!alkhqO`TOI1%Q_i2T-SGf+-N;{AIn_DGq4v>{oUO&-lA-DJ%IoA<- zM(Q7@wahuy{t0^4(FsgYlk|b8*~Qnn_<9%L;NmSVzEN@ywMtGDabg%aOV7FFy5n2m zJQ>cO3`~(J`4x&vKd(`nYizr;d6Qy7N5h7>MVkc2J`UWcxU~N#bqJ2V6bxcl+Bpp_ zrOi^V(H6;_;|H<giq^BEJA*T)tF_4AGtVBgEn*itqN9Z!ovbsX@qFC=t+!>(e(oMG z4JA60#cYbGR$(7f`NtocOVi=0!I8?~nANdAY6ZdRV`*xWc`#KPD)*0-D&^6U;^?7@ zws&ysD7XfH^iW}ZB%4k^4O*?bZfu62QXU>esn<JN_4Zb?qt$3j810Fu_)S|={coOn zq(gT(8!{tttum?^ZI)2fR8Uc4@pDF#+96HS*~ydo-F<v$&eB3N_ruJ+JIk2IilTbd z0Q6`)8U;*4H+2IGiW;%DSZqe>RIHb)k+;x+oT{#B#`c3a(D+DGQ15B>8%kYc?S@jf z)_p@!6{il=#Z`HpQltBZ!jqthTZii{g#6f&9v>clS*si#AMPJ1m4~$QaOuTCZJ<;s zZMFN3j13+u55DB?nf{I@Xkj?qFu$RB$&zNXX;qUMX+n!^ZRfT%ofIwoq^2xtXwVw9 zrlm`pVoh38EFEiUiD5uzd*_pe)%vD!LIrUk20aQYeZAtTSEfIwU8L|1b2tAZ5(>}M zq54N8)Awku2idFl)YCTlm{v`HOSq4|z-i<o=*Bjr4!J!Ez83;JUa4fR%L*Xm&_BXT ztHGW2nLQI<)cD#R1{MJ;0M^?8a3M_qTL3PkX&?u1;XMEx0!9EBr&oYez!~5i@HTJ} zxCC4Ut^=O}w}CH!uYhlWAAp~LUw{X|Z@?dbAN~b_1;Aop8L$#q4@7~jKnlnKy}%w| zAJ7jB0wcf?;5hIq@EY(2Pz5dmmw~Imbs$L@tg9F6!@+`siX~kx34gVURVOJ=2Zdgd zP~Z`vh^?Q;*aG#@9z5BK)uWU3$MGw`Y6?3e11%yA=oH#T@vY-K1&tj3lGKA9zH}8S zOFM+5)@%9M{ZOw4pYkGKmW>`^iT%(3OI8#fX3@iA4dGcFM|xb0OT)h`?G?WBtUZ{w zTYP0`KWwKEpB&yqEf^UQqY3@o*Mm2&>Cv7(Sjq`2)_hJhx*#v0hvzGZ$Qr_CR6H%~ z9FZ>gkVOAZ@LqgzOjwo?{`CpDiK|FNtikHpjWxByHt*CntdmFd!v8&X2H6ICmBb1& z$U!ey0rATMR=jGxoKfBzylxX~=8;8=aN<X{FGXR4^Tsxv>}yn^QDne?A2rP`%;wf~ zyth_W#B8+;YZ#Z866S=_8R0`WR>bk`#jJ!#@a3Iz+#`B9o6dSTe(qgs;Nr*mVEvuK z3a_$&Z_aEjQzYy=`7;sK4iQm~uN94bh@abXlE%fFdC%n@>M25ALbVvca|};z&i~bX z_^bp@@{J4yDg5(2r;fQ!f|@?co%lced%WKQVo6!|X6j=iRa{`XmYjqAY%XbDm_ztI c!$%a!JKz_*h-{%Z|9qIQ$Cl2di{AqO8@msiFaQ7m literal 0 HcmV?d00001 diff --git a/t/images/Sony.jpg b/t/images/Sony.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b419c83ccb911579b4976767643964b2a1da1f58 GIT binary patch literal 2779 zcmb_e4NR3)7=F(E;a(6gKiU+o%L}$krOC&=lOdU24N*{0b7Pfy6HM!-z@5U>l8NR5 zokJnO)N~|e>C7w&oIlJIo3kv}bRe0LwQgNYSvht7-JbK^?*<uj&h?(X-}{{RocBHN z`T5>+0_}kx!_SXj>X{E@WjzivfIhGY9c)C^<S1ez<tOB5;&94+<XEAHpp+ahjH*0B zY}N1y;zzYUI${TH`%`{P?xzddO1-DtpxWx_=)G1G22uA5+021#_a@Akn)4ixG2`hc zGSeJsz(m@~ctX;lD9-d0M|w({EybBWA|>7F#I!}8!s4tcP#hx^K*yraLVoZtHm?fK z#LLjOYIrGeVnuhvNg8%ZlMN;qC=`c7(QgROu#Ei;8m=K0Rlz=jv({Aw{eK|)R7a>| z?<F=?2le}iP1V7%<f@xBEQbo$a5Qm**8ed3FRwNsF$_3PjCw7e6h#sB-8-bK53cgz zNI<XQ4P0TPhW&Em8%%0EdP1RLb#2}a`k@*+4a=eQJ@jEcu(<~g?|~zFVCgG@+{zdx zXt=lC>P;s@RkusCOQ4i%QmWPEsj%@-*jSf`C^#!tAh=sKl$o5Oj`%on2eDqm+qsnn z;$rGw;qn`a%ZSethY{Z*c5|goTL0%w+#wAo%CJakWC9<e0Mn7X`lia3M%gryyjPWL zvr7V2sXDfM_OEbP?lYEp-e%P;bt|E4^I~O^GSdql(f@%&cE=nUm^TW@O^8fr@wfPu zfD*_}sF>y*78;<<qRb892bZPl93IrZURbz~ZBv1E;gU}L>DfSAThO04w>T4fVCO2o z!$dNU@*}~C$zndv@6EG)x13o~Qk-*0C1#)|_mb-OEeB4v7!Ue$*6vjOIP2D|&$)D> zEcf>&Bkmv{t1#Vo4Q=QL1U~n6Vh!cRz|^Lrlna>BOvWzNU;OD~S-P3aPL&t<i-hyK zuuXoQCFSzi_<`e>bf$Ht#h(_4KdpOHcvqT(A@ukPixt*$=MKIQ%}9r7<%;-M!9sr# zTH#`xqNs-5R*}CUUgNwmrB7Dhn#OKfJbu^qF?XCdf)YclhhV~FDNnjj*8U@9dJ>o{ zLca`D??92d7V;xotZM3)3mGJdh)aFOrY29tm-{<w4Q651&bT`eKtT4(Bwyx#SHs%L zU2>$m$;HuJRBFR_Z2~SVqEQw9z}LvNtQP|1SD6Rqk=FxNo5?hp^D5h7fCDptBTnGl zQlRb&pz=@JB>}bUyS4);`2$!%-k-;t=viQTE6~ENGj{PWev5u=z$111YZHOw6y7)m zJXUc)^C6(~H|ozaZPGT96Y(5l8)v!f6vy65e`jdZhiw~~<43anVtsw`tXZ>?lapt~ zH^&pjI~`8SW=FQ8S*vMnT2DE7_#zC;4Rd|-ExGMqp}}y=pYLxs{NQVH^Q7M&xjmMz zE%Vy@xEfq*(coU>Yw+c}zb_4QExtc{z!%kB(4fp!ZnRXkWVgh%S?<>Z4+PA+uCEXW zo2$)@S3KtPai`$ACa-m1cKRJ${;L)rUu9yiyrk-${CSl)GjV}=Pv%o_ea37_DqU9y z>n00)vE@v7+#ga-)G+M6@hM_PWkL+u!BNVZCRFg8SdE^Ywnoaa-p4$*d339k;sY)^ z+2ZY5*~~0))wsZxKtGX|qedO;$u5(xh5avxNu^QD=HZr&6|uBSx32M(QFe%*N^i?M zU#H&N&x}kX>b^5&FcHve@0KvuLhqk9c$I|SKkJBld;io?AA0|6Bkt|}vx9n}3*N^2 ziFF#5?;c4H@}?P;QBqK_%vStzNkM*Lo@b%WQ;_%4Jll(T#d)Ix-(fZSM@PrS#w86H zkmRrrwmXK~NyA5vkTg1DtV$X8BJogMoNbWJK5(Et)o!z=W~2@sno5IlBgWm!th+66 z7%^t17_(j^LKh?SF(S~4Nujh5oVxsm^~h72mg({?iusQw(1A!jH#J5dgE45t;K13x E0d3#tz5oCK literal 0 HcmV?d00001 diff --git a/t/images/Sony.pmp b/t/images/Sony.pmp new file mode 100644 index 0000000000000000000000000000000000000000..653178d3c5e95d571282121260e0dd9051b904de GIT binary patch literal 375 zcmWd-V&D{DU}XS;8X*1+Vkk&4H84H^GQ=4afFu||MHqy{U?Qlrq7=jTBu+*VVM_)E z7!6aQBE~eMfdK;lg8@Y5|Be5*8Cn=b1Oz07B-O>m)s58T)r|DifI!dA6a?&C9KpZ^ zA7B)flvI#WP?L~QGgDJgGjlQ1);0rba58nmrwt+Z{{Vv^2Lli?Gb%AK2{JMZGX6ip r;LX6u2=f7yX2TF+5I|SMAc!II{}uxeGb7MsW<dsfhRqD}|8D{Snyxye literal 0 HcmV?d00001 diff --git a/t/images/Text.csv b/t/images/Text.csv new file mode 100644 index 0000000..c638a99 --- /dev/null +++ b/t/images/Text.csv @@ -0,0 +1,3 @@ +SourceFile,Make,Model,ShutterSpeed,Aperture,ISO +t/images/Canon.jpg,Canon,Canon EOS DIGITAL REBEL,4,14.0,100 +t/images/Nikon.jpg,NIKON,E775,1/213,9.4,100 diff --git a/t/images/Text1.txt b/t/images/Text1.txt new file mode 100644 index 0000000..a2f7f17 --- /dev/null +++ b/t/images/Text1.txt @@ -0,0 +1 @@ +this is plain ASCII diff --git a/t/images/Text2.txt b/t/images/Text2.txt new file mode 100644 index 0000000..5347e13 --- /dev/null +++ b/t/images/Text2.txt @@ -0,0 +1 @@ +this é is Latin1 diff --git a/t/images/Text3.txt b/t/images/Text3.txt new file mode 100644 index 0000000..2a3da08 --- /dev/null +++ b/t/images/Text3.txt @@ -0,0 +1 @@ +this é is UTF-8 diff --git a/t/images/Text4.txt b/t/images/Text4.txt new file mode 100644 index 0000000..4a5626e --- /dev/null +++ b/t/images/Text4.txt @@ -0,0 +1 @@ +this Ž is MacRoman \ No newline at end of file diff --git a/t/images/Text5.txt b/t/images/Text5.txt new file mode 100644 index 0000000000000000000000000000000000000000..c9d2c810d48dcdf44f98a038fd5cc09b5ce0bc56 GIT binary patch literal 36 mcmezOpP_^ygCUclm_Y$bhBAaOxH0H57&4eKI5D^~Z~*|Q4F=`_ literal 0 HcmV?d00001 diff --git a/t/images/Torrent.torrent b/t/images/Torrent.torrent new file mode 100644 index 0000000..b992395 --- /dev/null +++ b/t/images/Torrent.torrent @@ -0,0 +1 @@ +d8:announce35:udp://tracker.bogus.com:80/announce13:announce-listll35:udp://tracker.bogus.com:80/announce36:udp://tracker.bogus2.com:80/announce36:udp://tracker.bogus3.com:80/announceee7:comment32:Test BitTorrent description file10:created by13:uTorrent/184013:creation datei1378481639e8:encoding5:UTF-84:infod5:filesld6:lengthi3700748e4:pathl17:exiftool-9.35.zipeed6:lengthi3662939e4:pathl26:Image-ExifTool-9.35.tar.gzeed6:lengthi2394706e4:pathl17:ExifTool-9.35.dmgeed6:lengthi10848e4:pathl4:docs6:READMEeee4:name19:Image-ExifTool-9.3512:piece lengthi1048576e6:pieces200:¦æ‡[ûš'§OïÕãtš=ÙÖà£aPœÿ"÷á5!“S®:f¹8—Îɯg²æO¹Žké KÝ|á[^åÒâY•Sæ ׌öhò¬/î×èáˆÙ$e 1›4¨á›€§HXg(縵«aL72‰UâðD©â”§ôdUZ&±³Q:ƒ¹XµÞ|y³²x¼ØiCKîÏŽz–#ñö‘»=W¬8Bƒ;šòÅz¡Š]ù#âˆzêçœödº­Âú$2ÆrVþ@l¢De8:url-listl22:http://seed.bogus.com/23:http://seed.bogus2.com/ee \ No newline at end of file diff --git a/t/images/Unknown.jpg b/t/images/Unknown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b07f77d4adc6e0dce5fa01ee72eac62c61f5d9b0 GIT binary patch literal 7199 zcmeI1dvp}l9ml^j8<G$nJG<nu$!@Z<$z~G*giU}LqJUsf5l{+>XnlZyf(jIhRjVi} zRS!L_g7wi>D{aO4q8=ah*%oZE)(5TDM^VILTdlU%Dpsjjx&7RkMbab3)BaOVkIwGQ zeD`<n{oUXD-kCL<&CAL9@n_9HS(-4RMWvGZs=woMmA=Cn1($HYh0`nGJHc@$B8R&@ zYn)!e{Q+>YfPV&VF7$E1ZHyhj{V~pVa5?vvI0v{PAKPdCB}D<B!7yFBu|!?awsWqj zk^DV}rY<`D^ttn;Ij0TJx8<cn>0{;CeV=;7kg&<0K6i=V)|$`zYR~6Kbmcp{+VXzB zqpN***RW1aSu%g&(g~B5Zyy1d5_nYdaRXjL54bvptLt3EwO4R04z3OQ)`g+Y&ms7A z1^g1Y{?a}AG!^hNM(gqt6>-bAx9205hx)%t|Dpok33gV6eH?7!t_u10k3e5t7RXcy zc2|e=I&e{eo&)zP&|ASJt3w&A2E7Z|1D6&0bkOJA)g`*SQW_1u7<?)1+p7_CwJS&( zHmpsndf?SPu+|iGY0KxGHGAT~T@(6m8(|bF;G2q(t$;7YkIoHYf2NSz14nw`q8maT zzfAw)9`up|w!SXyLGRrIm-WDQjxyVq08SO~-r`_ywB|y8T%kGO!<f|G?O}P^7`4B< z@SFV|#^jzL1wplXl*pn3IE!p1(SHiK*kbI|&F@l+Nw`iJm4OeWeK5Wm%e{MY-X6pD z%Ma_|=f53e$2*RHLYYo;B93jCeAJ{PCoEbtRPmzVccC+_5jRrg7M1p@tm<7^)@MMv zqR#*?=9Lwd7WZ{ZB9Tb3i<|zVqp^8lOSZZ^(VR|HR%Dv$a<%z^gHrtmr2Tk#MS5UM zCNZ?BA?JD3>2yt9ZC$pex^-Z-xuSo0WuiJ&m&`;fbLslQ+5T0jM54N`!EZ?A{7h?0 zZN^WhGyZ^Nz3*2iTZT3!Gk$d<Q=hJ{O=V)uxz@Cwtg5N4Z)na`R`t!)49(QnR8*$Z zxrS^qQ<JF5wX{?u{f4?kI#rWyOhlUo4;@(HXB%2_jmd^azp5cWq@g-ppRH|b%%-!o zHHrGBbTXaE)MOiS*=#bEs&8)ceTejFtk2Zdru@Mv7$&PznM~b)SVRA+K`nl5ZF>6b z*|UpO`b;mC9(T|+i?1xg$M&-?j<E+D<2a7CM2$IRdrV7SuG5EyN^f3Qrt3Gwb>46( zR_|!d#f~ne_-={X&kjDDqU#yMSVxXA?|(C@$br4XaYsjGd9`isBlFp@Pb~28#FU<# z=><Mqd2%Z7>$%^p_{<;s#2dzx?=PJ&Od2zi^}Sm`j@jJWN8)_yr+qyt?I@fUZ{gg; z`KdR|J~Dt^`<`GunYv$0W4mg#VVsn`ub;O4y-KC6(zdAmJjLe~KE~L#gVsgWuRJC@ z=CL8(UVUfBm+!36nzq`2@3OVYz4p6%s5F#0*Rf%;bK5!hW{RhXk>@yVylmrqg>!HH ziqOZ>w??-{c>pk-tdbW<3#Xh|refEaD~^<w>)KV)u`_l=mwP|)oY?r-*J97c67gyA z^W&Gr&y1(y=f~E0=Xm#fA9!P9D`QW^%Hv1Gm(g}kygB}j*uCC8(cSC!R&0_UU#^)q zWi@;%d&;9qw0>q^W$L8&OI*$Ca5W>z^HS7)O1(-x4>9KGagNSK);}QY0jdu6qX&UE zI_p^2S3t2xvwCw~!R~W^Eet6C&81xJ>|xm}aM~xmS?(CO(<$fq?QwR->)tYEJ?u{H zFKu*II!R}a%Qp2$V@4U{;)?T(nFu;ex?TF?F5^y;PLhrRwM#s8cF<adD~wqI;wfdP zF)tY7v;BqlM$nkR8C#jY!EUH^3H@k&-k7UFY-`xs|B`-j=~ZJM1`U)Bm(Hh^v5!jg zpk<_Ijp>5cDP3z!Gss6IV{Qa3B4CZV1*r~^h@PuKID$?8i@S_p%XVD4ihgX+KQ!h~ z@FR5IHf9qj8%TN=txY`MNIwQ)4vhbMT4U0FfnZiXq~AbmBaaIqI@ku1o@Tbm(nZp( zAf7zd8e^qLOIX|iI!$_am)VLeX!Jc}BG86PpO<_P%hOe40EmYO{J)ubL4P&oNf2BJ zfIo+lf-a*UmP|<2Gl<zGJwhuM!f=bBrGpU<fS|$UOc2W-JIg5`2I8O}f#8f=?gh=3 zHt#ZJa6zLl7~?@3A$?%Xt7z0MJru}iZNMB)(+^9&9(o#|V@VkKyc2+C^@Z~r#^5F! z8`$6m5MDruSs?s|8Gb=TAbpO!U@W#@Ed7?L(R^3v8DitLFot;g+Gflo#-cesUkDmx zAIQ`QnnCcAA#h<)e^O#w?e_^}`CTa0c4MqpNk<Gd9~8=mBP@E~m~|i|{iiVns~s&_ z)E348HbA~DfnXltRUy4YN)fn>uyHjqP~un+vGEUMmVjEM>C#NliMUx>1R|_QIGT%8 z_^3o$2@QkZZ_IQMra;RvAhg_K%;!K^=~u=K1EKFj#=MOz^qU}k5gJiUJX_r;FJ}d& z@d@=wfhC2^1moGXA{D+|4noU(Frka|So{fOnTXHB$RUqzrN-hJynlU|3-pUR!h1d% zohmJb3v92YW`+EoG3J60;g9cw=!e+TK*)?>1-lSr_l30Qg23}I%JC#Pv*8&mPTJTJ zQ}_WQ2MMUBk*}LV6-?+7>PJaTD43n-*n%N+d)v_{UT<L+GX7m+h!+okqt3$xSG^fV zBC+<4F<*y<?Fm=BU}u{pS?PyJUy*JDG26|yS{e_}G}`BXc?dFI`b`*3qk~f9_vVF* zF@J%Ez86R~?wJ=uJqB%_^mu?oYolwE)Wb779jlZ_4mwQ32r}yBFh7X)SB$w18pb0I zP5_}Bicy4JGT;trHHf-V<_JG}MCWU=hli1|nvGaI^F~laJoG&*C~dZapfX8nGZeC| zD#&93em*fd$`zU75jMOIp<sBiAe5}Wa3;pdEgN;eHYOKJu#~Q#`oJzWkC2COvo=8b zwZR-7rZ_N+F!Y@nn9FAbz9bmE;gt9w2|VOGE=WV0wY@@_8OW;^4D1mYUv>2$vYaZl zL_{AO{<v-<-p76!S?PUjb&T|FB!KghFzWE?&C<hgnaC)L7p-W1i*zN37{AMyS`abb z8Ac}~ZV!^mqxBJqDD=>1T2O4P?{Mc^%!cjX3vB8wW)XDs9<*a=3QDhCf>_j9XB_N8 zGT*}-Xns>*4G+<G7}E`{UHVeEGWqZ`#^%;o^p&j<Rz6CjA>)~iK${K?S=NMgh>CuW z)kz-CT^QOFJC6)nt<SFrWVZF-nt-{tKd*6Fh>!}A2w#}n^dw|9z!@4Qyaa@bE5dq3 z)7lWhd0t>~pLvfDN|DtPbOs}s^rzhTq7hoYfW`B{iqi`LnS&oT_lXFCjHSUR;}eb| zNRP#v9cvJ8y!2quY9+;qB!Ly~2dw9eCH}4oYXl=UlCE$W6<FhVT9N*?Am6OF`0;bb zqWK}xy`faEhpR@1v_4#C@WPEjN$?2V!^5hAB}p_2xJ{U4ftzd;-w|dH{qPKh#hW4Z zbF3aV-SMD}KeU`H{V<gD!mvK0b`6R`Bf`idTknYoWVsWB4bBWJAzH$j#m>rtoo(C` zFF4=U2&z0IY$fa$i1Z=|-3UV@b;^Pr6!!C}btDV&`Go7E!LG$Bc5zU-Y;~kuc7*eG zhEa!>n9%whtDO|0Af`UM{0}U^V@X*=k!ju2x<|CNYq`=<yDa?Q9YkgD4&DCq;@VA_ zrjG0c?fI9%s#GlAV+Z;b^K18iPH&PQyZ>`~58U%VC&vx{kJts>EnxB}I1c4%ZMFM; zK=&C77M$%bop;89lNQdJf4V<^!K_o}`g3M2oi*BQp`MlVPCH)RR8`f~o=fN2TXP(( zqes|dbobcc=>DX`si>~@Q+_Uy$aUoWTt|1upg|oB7&l_vCk@-vW;Q5R%6|o=5vN{m v%!$Mtvr!ZIk1EvYqigZUDExExQELIjK1MMws4xE`xUoo#?e$$so9F)p>FH?b literal 0 HcmV?d00001 diff --git a/t/images/VCard.ics b/t/images/VCard.ics new file mode 100644 index 0000000..60a7486 --- /dev/null +++ b/t/images/VCard.ics @@ -0,0 +1,94 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +VERSION:2.0 +METHOD:PUBLISH +X-WR-CALNAME:Calendar +X-WR-TIMEZONE:America/Toronto +X-APPLE-CALENDAR-COLOR:#CC73E1 +BEGIN:VTIMEZONE +TZID:Canada/Eastern +BEGIN:DAYLIGHT +TZOFFSETFROM:-0500 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU +DTSTART:20070311T020000 +TZNAME:EDT +TZOFFSETTO:-0400 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0400 +RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU +DTSTART:20071104T020000 +TZNAME:EST +TZOFFSETTO:-0500 +END:STANDARD +END:VTIMEZONE +BEGIN:VTIMEZONE +TZID:America/Toronto +BEGIN:DAYLIGHT +TZOFFSETFROM:-0500 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU +DTSTART:20070311T020000 +TZNAME:EDT +TZOFFSETTO:-0400 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0400 +RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU +DTSTART:20071104T020000 +TZNAME:EST +TZOFFSETTO:-0500 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +CREATED:20120807T152746Z +UID:5E9B5BEF-C3D9-452C-AB1A-613510B5BA52 +RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO;WKST=SU +DTEND;TZID=Canada/Eastern:20130916T133000 +EXDATE;TZID=Canada/Eastern:20141201T123000 +EXDATE;TZID=Canada/Eastern:20150427T123000 +TRANSP:OPAQUE +SUMMARY:Group meeting +DTSTART;TZID=Canada/Eastern:20130916T123000 +DTSTAMP:20150420T155518Z +LOCATION:261 +SEQUENCE:0 +BEGIN:VALARM +X-WR-ALARMUID:C41775A2-C98F-456C-BB8F-8E6FB15A554F +UID:C41775A2-C98F-456C-BB8F-8E6FB15A554F +TRIGGER:-PT5M +ATTACH;VALUE=URI:Basso +X-APPLE-LOCAL-DEFAULT-ALARM:TRUE +ACTION:AUDIO +X-APPLE-DEFAULT-ALARM:TRUE +END:VALARM +BEGIN:VALARM +X-WR-ALARMUID:70894F68-E6F8-4C00-A737-73D4CDCF0525 +UID:70894F68-E6F8-4C00-A737-73D4CDCF0525 +TRIGGER:-PT5M +X-APPLE-DEFAULT-ALARM:TRUE +ATTACH;VALUE=URI:Basso +ACTION:AUDIO +END:VALARM +END:VEVENT +BEGIN:VEVENT +CREATED:20120807T152746Z +UID:5E9B5BEF-C3D9-452C-AB1A-613510B5BA52 +DTEND;TZID=Canada/Eastern:20131125T133000 +TRANSP:OPAQUE +SUMMARY:Group meeting +DTSTART;TZID=Canada/Eastern:20131125T123000 +DTSTAMP:20150408T142941Z +LOCATION:501 +SEQUENCE:0 +RECURRENCE-ID;TZID=Canada/Eastern:20131125T123000 +BEGIN:VALARM +X-WR-ALARMUID:C514D9BB-BDB3-4A5F-B580-9287459DA35C +UID:C514D9BB-BDB3-4A5F-B580-9287459DA35C +TRIGGER:-PT5M +ATTACH;VALUE=URI:Basso +X-APPLE-LOCAL-DEFAULT-ALARM:TRUE +ACTION:AUDIO +X-APPLE-DEFAULT-ALARM:TRUE +END:VALARM +END:VEVENT +END:VCALENDAR diff --git a/t/images/VCard.vcf b/t/images/VCard.vcf new file mode 100644 index 0000000..7248373 --- /dev/null +++ b/t/images/VCard.vcf @@ -0,0 +1,45 @@ +BEGIN:VCARD +VERSION:3.0 +PRODID:-//Apple Inc.//Mac OS X 10.10.2//EN +N:Harvey;Phil;;; +FN:Phil Harvey +ORG:ExifTool; +EMAIL;type=INTERNET;type=HOME;type=pref:someone@home.email +EMAIL;type=INTERNET;type=WORK:someone@work.email +item1.EMAIL;type=INTERNET:someone@other.email +item1.X-ABLabel:_$!<Other>!$_ +TEL;type=CELL;type=VOICE;type=pref:555-0000 +TEL;type=IPHONE;type=CELL;type=VOICE:555-1111 +TEL;type=HOME;type=VOICE:555-2222 +TEL;type=WORK;type=VOICE:555-3333 +TEL;type=MAIN:555-4444 +TEL;type=WORK;type=FAX:555-5555 +TEL;type=PAGER:555-6666 +TEL;type=OTHER;type=VOICE:555-7777 +TEL;type=OTHER;type=VOICE:555-8888 +ADR;type=HOME;type=pref:;;Home St.;City;ON;K0K0K0;Canada +ADR;type=WORK:;;Work St.;City;ON;K0K0K0;Canada +ADR;type=OTHER;GEO="geo:12.3457,78.910";LABEL=Test\nLabel:;;Other Rd.;City;ON;K0K0K0;Canada +NOTE:This is "a"\, comma\, \\backslash\nnewline\nnote! +NOTE;LANGUAGE=fr:Oui! +item2.URL;type=pref:https://exiftool.org/ +item2.X-ABLabel:_$!<HomePage>!$_ +BDAY:1900-01-02 +X-AIM;type=HOME;type=pref:AIMName +item3.X-ICQ;type=pref:ICQName +item3.X-ABLabel:_$!<Other>!$_ +IMPP;X-SERVICE-TYPE=AIM;type=HOME;type=pref:aim:AIMName +IMPP;X-SERVICE-TYPE=Facebook;type=WORK:xmpp:FacebookName +item4.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQName +item4.X-ABLabel:_$!<Other>!$_ +PHOTO;ENCODING=b;TYPE=JPEG:PGR1bW15IGltYWdlIGRhdGE+ +X-ABUID:EBAC8BE8-E695-457F-AE4D-E076ECEEA002:ABPerson +END:VCARD +BEGIN:VCARD +VERSION:3.0 +fn:VCard Test +LABEL;WORK;ENCODING=QUOTED-PRINTABLE:12 Cucumber St.=0D=0ASaladVille ON=0D=0ACanada +LOGO:data:image/jpeg;base64,PGR1bW15IGltYWdlIGRhdGE+ +SOUND;OGG:http://example.com/sound.ogg +note:This sample mixes formats from various vCard versions +END:VCARD diff --git a/t/images/Vorbis.ogg b/t/images/Vorbis.ogg new file mode 100644 index 0000000000000000000000000000000000000000..20d5e6f90c9475996b4e4904afd1355aa135cb51 GIT binary patch literal 5371 zcmeG=Yit`wdP~U<$rl^4qxjKN0y?%XqNtc!a!HYn1!$LCa(BrkcbB^q$-qF!<%(Rs z$>sYHK#65H=d`Y^(2Ai;jmQyIOP2&W<LpCS9N<g+c49lW?*hZutD9cxGy!@|d_elI zouwS7IULZUm;Na_ni+jF^Ue2~Z|3`!zIfaZbwCfwMb|R$Z#(*unkO`sTrnyu>Qu** zfd?qhFaKZC_|%;bi@H+-MsMExn-|yr`-3w570|g%$qEoq-!s}sjxPtaQ6#E;);K(D zhGBSQw{{>JQKXnQm(>R4d}4>M7=KF9rsZg$Erjk7uy+$^c3%MJP>!cb8XuK2k+@_? z=B4;!tG`|vHQ15{1VveYDok;46hq@E8b+}ciaHD<D9Uj}AQ>@%A&cTDC<ItH=n>SB za;Bn2Dvi2$bs9w{3{jL+kra=;TJ_*)mBulVaj@2)tH!c8#zu*n7<7V0)R3Snk&Czz zqD07anyL#)Lbg`u23_$CV<<rWW<zn#QMGb-4G-W6GT_8;0q59=6AO(yv0Mhw5<$z* zc3L75h(tEfqDL09R2?aLd7(->1enE9!|&5ISWy&b<EVgQELz276eT&7r8%GruId8D zj<z6e1s`@!faAhYl6WBG!-a=H9CrX?*-;kIs0swYbv#%D_N4(&)=BcXpB;B$WIW7? zVOK&CaUS6*SuEi~JnxoqR^3nAF;>7H(p3SL<VXRpv1w;59wHr~D1p%_Z{1+ap$?P= zxIl**jxtq;1>-n@t{3uQ8O=HCd=*7=_J})<<3R!^QjtvDF3Ymo<sQtVaTA8b<$Mk; zx}}0Q&7{Nb2!kONlBJ5VJVSZ(Rnb`Vn*|GE^m<Z^6)h#WEMvffMOsQK0R`B+RAJ0{ zdyR7$GKNfwX*dG}UB+m|BQsXFixDDqpNFdZ@}yI-4kr{$v?eB$5iA(71BIh;E6a^@ zHb37O;iFXx@A9VEq%|?(Q<4RW5oLo^@;Hd3#bo!BH0MBbf-@;*l7W<|&=5w3tI0wx z?~CO#W(OWhF=-+iQYHw+i5fG}q=KcZdcjtb^HyIKrgA0<bvCM~Ia8jXl0k3P=y&_8 zDIy)?tBgf5=0(=5C+h_mF>?_F!3mo?V2MO{S3U2Ic}M($LGi^ZlFu7-c?C0NN=n%r zN16PQk{jmXyjb`9xKb=75`F_RVl#Os%I=tuG$~xXPKp*!9Im<;YZ@t93u4Xh@!+X~ zp%i0*pGzgH%;&w)k`zw4;Bk-9A|}F?oS4rkO0hw*lEYWXTHv6?pA2}NXw_Wzk`2jF z3{T`rK`9?HriZ2Rg0)&GA*7`|kq;1gdpPVR@VL2Jws=SCrl8GLh-Jk<#bU1vD~v5G zne`z<hP2f4wnS>efaYtZOeE@#*U%_xq--ND6HwYBMhz%#5Hhg@Q#DX<!e`Bygo**B z$`NrSM#w;~8YX%|gsC9qCR{0-6i?(~%H%_;6TDO!mjbS^y_%F|zeyOuacje5H+x-a zlh0vE!Hq_ZQwoWslXBV0`Ee9O@K_CT6}`m*O~6<Yu32kAJn9VNVSc!r95>4dX~vVX z+sgw4HslByUBwKI*L@A5kct(>MhF!X(YQO612RMiPqt={#)FKUFIg=GW88q1tdW>R z1cseueIrKc1HnjwNY^Q)mI!%8he?rg274ivn`n$AiFhzM97CfuMwmzk`PxL-P`6~6 zx*;IK>`2TQp9uPi5?iS1Ny1cw^CpWeX6GBI+knY#>qx0uE~kiyIlvjJSbU-sEb=)4 zR!D}9m#pKIlc|pw;uA&V1O+!Z%4@fJWQ*S|gklYQtw>4fun9H}*JDg7Qxo-m1L_>M zWo>B$R@^|>icnVsquwd<)p5GQH<XGqNJy1o8_W}K$)68Js)D|t_$C~UP|Pfg_PpTF z8tDq=m&^$>uP;S{csA&(B6(xdZ4a=uWD2|wCRd>pW<1%5#T}#*2A5UVOWwH0YjB$s zhDipaTp1?fu-hh)f*=H_JntpTo+LvSg5$KaoWT4=KVnVkIZ6rZqd4%DY=$#A(tM#n z7dRz~#}HDV%Q5aaf=WazP)l<@cfdSe;N4!BvTzkP5Uq#IF3u6>#PPD-WXm8PE5;Yx z-cT+j2W<tnlZbnS{IJnM2BS<pn(_P1$x6d&@>X0~Z`ABc`|U=HwLwy4C0n+|bGckG zGwuWh{kr3XVL`wQ1|vH<x(&ok8h4N=CAe|S7u?DFd>*YA1<{k1Vsb=lm$D_P_~ai% z1EJPW`n;nsyaW8%M%Dl<7w+ZoQD-@uQp52#NIOs-A2nG=U~4y6YL7sCw+w>;Px2mo z6xAY%R*7WtX-PYgD{4!UQj)WAt(1vMu^5Q{Vy+?;wUJ_Jt-6Op?QX9?V>mYoZv+!| zA5G(4el()Z%Ay32GZ`R!4_E;S0qN&Q#}hfNJDaO2z3Q9?6X;PsA!&KQMvJDS<&0+K zawf6`vj;R#7X(de*K9dIdHtXOL4XeSlJh+CSIrf#zPPu?b(Z<lgZG)_KWl4L<kFGf z^`?5TuD}2OwV!?Y>+frk*kcg10vg-Aa$WQ;+>Le3Z9dn{zNYKKx+1pjnc@>WyRk2| zQ$0KG{kr%sKl}2DuC<|+Ad7;AyS7dNGHSO**Xrf=>lThgFT)r5l=t9^+C7i#{AB(W zuW@nyl>^30$KSXWrk+06>remnxnSxo^SxiCn9G~RKZDPI-F3C~&_d7@x@t>IrM$OI zRHb)eSuHIz35)@`4)tC-)OYF7cJjn__l@n>z8C`4_o$im<3d@ubMpB+uRedLTE6|$ z=Wkcap;x6)HS_GN<?#>8yT4i6s%tgS>)UJx+I4!HZn|S?-<us!Of|{ffdd~|r?=T= zL~>@Hoc%a-^kezx_mam}w^2ZjxI&c%dVOI3M*|18kuxoM_TJ*rf&B|hOULA;rKQ;g z`M;=RiHn2KSO+wAq0o1M?E^i~s=ICBix4=|Gfc1RP~VjwZ-4&=&=L8-G&<g-|L&IX z-LDP-96KmyKJUBsd7tkKU<v?i_uW9~oBz!U40{-Ywm?vn*z+EnSgU;*eoD8oeKP;3 z`&>I8c=@;^wvN-!Zukp$m9FM>EHvMEjw;NF*Z04NU*NeNr@#sR_MCcnUC`VXXw?PH zcDfVPwqOu+=|1E`G&G_n)S!%gv1{y69Mt9EAJ=cc*17BE3Q!-Ac^}cRCCyFYD_$mg ztVEyTcmHu*mUsUFUVzaDrLTDbMq{OKMXzr|-v6iZf7$}T?KJB^+lb9=)ptx<HSI6f zZ%<`#r5*vFxGRn@tJbUyt%uHbL!0|9oB&VFkB8m|-`E#U41EWJhOTS?4*$-OyZ6C0 z_@4{#O@`f&Lj!H@wcm$kR=zVdxu8MT-mOE|I$wHH4Q<R_5aFKNvvBq!Xz#u^S3t*r zu=}H-nUCw&5&HhF#Oy--3FQ6zj`g$uR6o|```xaaQ}^me<#!SM1LTE)*#!ui>{ty= zLf=LDH?AH)V*OCh2Ix7a@5&A2+WlQDLJNBr>fjweCeJP{y?bJpuNQ0tNz|Nt^r`*F z60=L6p1zJ;dlXkO%e!kw0ZH)Oe|CBYzyuGk@Qd>9Eyq9@0NX!3ec}-hc#HkQ?(rFw z_tNRNhprfV@SD8w;bH0aDs?A78oC25&)ivceCe~xU~Cx^b_0xOf2w)=Gj;vcx-(_z z_DtqksQqijLxZcoR;WLE{PwBU@2mhnQrv;gywC}aO|CCZv(kFYZ2liKKt&wt0YQ87 z8_g)S<^1txllt2u&1q_Je!j^KJ~nkLyk_pj>9Bh)*5s(CPpzQ_Tjzo#(VE`~4*8ip zXz%m@H|U0b1K6G&ICn(3O6s;KSJAFkbHD9gUx}m6zqY3b)Afs2(NA7)-mrnR;2`&D zAIJ@Ky1gKl&&@ZfHCv}Pa8&={4PdU-1ar*}XmU*-5I@~}`?cq`A6G-s*dR3d^MV?@ zuH5(BoE`!Pa_zq3=B=SCDzNJsQa^g{2WpI!H;jTK0QKf?mL43-rNg5>1ZM?d)6skN zg-<TOy;j{?+I@T9(96e`qI)twT=>!HQ<+WynDtcV?&TBuJExw8pj|)LK*!JQ`^9?i z{_`E*QPqqAd+yVo-R$2F@9Pmgy7NakVB%G(sGfmN;B#H7&q4QIQ?A;6ulr94&DW{T zLr4QXvwj_D?Q5%<1eS%iPH9^lrEA3~U4ILhU)S%abluC4xDG6+bC18mVarf^_`lUb zlb7~%Li~$=ZhCY3Up{tV)uul=u>raW^4Ff|Rk&;J<gKu7@#IYSv)4t2qWVwXpi)nt z?A^J#zr=*yi>>K!@~u5RRB{oBm(rb_;kq85>czTsty|pSTPLq`q^|YLFtvF2mto!9 z6o+-SelpDwi@-5-Tbmm&a&dkd5N+`oSUrdV=i{lt#XU`GKzA6REKYIUK>s{Pk^QZM z)L=ib*+74*7uW~P4fG%8sBX2R7J<127r`8{*qr9tHlyZ%s}Hv38IEjCsjC15Fygqu ztpMuQH38IWHo5M(Ca)d>Pm#L4D!nGp=>T)pXE_Y)0Fdr5Kv`@8zTi4NuD+0)S$S(^ zw(#+K>#>884)v=-1Fd>8_Pw5g$&St~P=4~Db|uuiaWl2)w05fN27d5d=O*v3Y9H-; zbmvbd0X78Ph0d&o#@>Y-4u|Q(yZ;KU-wLB_r0~KaaM`-FZ4}T=wy*t)mx9YTU%mEf Nj&<ONKjPok{0E=0?bHAO literal 0 HcmV?d00001 diff --git a/t/images/WTV.wtv b/t/images/WTV.wtv new file mode 100644 index 0000000000000000000000000000000000000000..c8577879951ced425bf5fc523dbd41c1799efa77 GIT binary patch literal 7680 zcmd^ETWnNC82&*JL_n*EfS{*D6baTX*V0PTLa(-zrQ3o)1lrw}Hf(q6?zWZ0ST#Nn z1O?&)D2fkWFvP?Q3C4t&fF{K7V2l?;6XTQ72j#^eYQ*oGIft|7?Ch<5(YTx0Gc#xA zoBuZ7{O9bc3u3Kox>)i?t4#W7+uQs1o&EgG6E9vYdG@kyj}wvcD8h<NkjWEx)lK$a zhr+IjDCwU&(WpkJnwEa!UsgYKDs^!4z(DPu@2{_V`h4l?bGCdt^fhSN?UeLMzjR9! z*BGv4l9Ep8LYwsfN-t`i62Wf*tvVS(ErwA^g%GfDuG$~({kmzqec_j*6RlrQ%i(DK z@T{j=hre6aF|DFP-<yj5^RFE3c<@Baw8bbkoGh^`emw^4{#UgF4p??OzaCoZ1oZ5N z?0!vFWLdA;?mv5_g|(X}+im}P73il(etF-q#|QN_IM;6Hwlb~16IKt)ZrP4&3SUaz zB{Z`Qp)T1+LRgGAdFix#I{&4P>L=gqIPl3g<3B)q>#_Rb*H9;bUtY()U(HnTY4-I- zh2NUF<RH@ZC?@+j>oqEAB<p$!SR?`q@EV3S;wl=muewx;pQ+z*yZ>Q*4bHIJx&7gI zTd*Va$BB3M&T$!<eXQe)&yGvO>d>DHVP~z9NTWR`fWEqy=MIV7uX?KSTivYUD#H)9 zd=exPi5$o#r{52bJS)|-|L@NvsLs851IiSX8&RgBkYJ{x+=RmYQG#*{%B?80@ogv! z{o7Gyq0B~^gK`H7_wGED|H5a>-(UBioA>-fN9O<W?%awQA?`owyGho`11Neob;?>W zeJA)ZDM7_B{b(h?I!#iG(We84zkR>*#QMD}=N#ESa=E#9)R5Y*ahw<t5AxmxBOhMw zdaL2RyXrT5yhx_|k;xUbcRTicN}Wa`A=D@xnK1=i3q1|kOXV16n$P{G^$p1&xHBEg zJmVQGYo1Yy^^#y7vhV;_?*jwHfWH>ke)M#rwHp$xmmd7K<J9Ci!?Q9emFTHK8Nk?K z^dwME0wV#bcH&DGvoJn}-;_FUEp^`V)Qu|C7K{vI1Xm$e6kpv6WA42`vw+6CyHq`i zwRomSRg0F7VI944kK#_(c4e5m320o|f<Ck`t(%a=Xm3QD5n?Hf2(GoNM(v_#F*}Gt zP7CsN+Loc#oV!k;hV3yN&FG?)x-i1gm7H!VYieD4QK$4}>TAhDc)1+BOT=#6v1FCp zhu^K}e*{;vC-1)I`v%O4VU2F|gdhujkd!KTO52*NyZvS~W`a5{)&r>zwxqXcnKt0k zf80aeD#Dme>2o4?OtxSSy)uX^eZ!Aw23ag~*E;8+&cmvpPgR!rWIz9Wy_1|Mrq3BG zA*C6kI*3{rv1FDgKVmBowH=B_YK1LQ@DWe=U5ND_eET3B<K2-spM+#Pzs`Qotwk)* z1I&7(7+;>1M_li_yqOzK^Gz#!+pl6h0eof-CjTxfK-M*|MI6#b)Gi};a2IlylGB`s z3t)|M@S*$Lj(Pz6<Nj_jNJ0HfQRdgN4f@2=R=jeeXFoaCua)!c<o7@m_6Q@7+|mtw z^rx8F+->9r>R$Zp7TAj1RQ$|#tjKkXpUHEB{JDD+b9EFk=Jg2}83o2V*m(#Dqmi8% zK{uj{vso)%`+CgPJUN=#A?*I(C{_)@S7eWDF)|LAZf+2Scc>koX*Hv3o*_5$<B!k6 zXER!PF6d0bjC2oH(EEhe*1pou+TzL5w0!gfBdQ0ugNQ3?m`^@0D)W^AM58{%dTkpO zhtY=B8I{>A<lX-pF_Id^RjwIV=VV0X8EzisVrA;%WhdII4OvMYRu2P{$Swy?+V;Z> z@iSjeHtAD&&C(7Ab5q)ZIa-IE@s=W^q^<RxF!;(HQ>xgjm<*IpaoW4yHMt|1x#=uB zeND~k5h;~rcn4B}F-v4Q&XA?>c{%FK@GVCM6u`aZs4*5+;Vw_FFs!j0zG2j5J8j7S zUWs(v?Sv(GW;+tKz_!j?pCqJdP$w|u@{Z>{N>dJbDj{D05>Q6g`K6qtvO>vPVTe|A zsrPJNnYeQvMTFBcDO)Cv^!wF3I|NHGFO8@@LM!vkadayjX9MPw5y-#fZ^m_D68KNf z5Ukk)6wRn)oCv;7)c=fxYOJ{2SH$-spDbA7M$Ak=CbNXk{dV<gVG_DHW{FJJ_cE%p zQ<(EGKXdHl=9HP%Dh#0sF`#p89p#xgUgmNnsR6@;z*yu?o)VgisY#&-wLsXIF`rWV zt!kE_5v*Ux>JC@dB64Xxva~*Zrj%{q<A26_&J6GVBfCb@c(r8TlGjbVYM#AD?HIj2 z&;5~^%?BS}U{(8dr94FNuH6j#GRx~wwr1up>aAyCvum*TQ}({iz3YC*E4;B_n&W%V zUzw<8pL+eNS(ULx`N>`SQ<#MLu!2BL06ACWntfR(kHHswMt7shdG-+b5jLzoRA1wl zvT!WsYTV`8$ABC0W6=(oQPPAtYt+mL@&Pv=34y7}gyef*qKpl%1xS2mP*FH$v>Hg} zyvZL_QtE$EGNm-f%qFF&bGkvCyb`%jtb8Y>pGWz&CxX>`F?$C{D7S@72#v4^--77; zF*Pa-J_$1WVg@H-!NtYP!8{>bmQUNbabwbAEOC<$uei9$hgNvp<kz|e`-9K2<Qc~T rabc#)1EP2znDI6Pi|^k3cwS~O>Fs3mj1Oj{13=NAOCLG4{MUZ~r(NLn literal 0 HcmV?d00001 diff --git a/t/images/Writer.jpg b/t/images/Writer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..964260d4ae1ee14ab05d637a78f07ea0576fc46a GIT binary patch literal 251 zcmex=<Ns}j76uUk0ZAcAb#ZZZBQ<$7BRw@B(6ciI0Xr8*FmS;K7)2!|6=W3DBqY?# z)D+arT+Fn!&43!5Or7v)L&*I<z#z!M0EEnpN(@YbjLd?J|Bo<uGcYnTpaM1w5e5Nt cH4K6nBL8nO@Gvt1O=cEkuxHrJApid+0AQ*q_5c6? literal 0 HcmV?d00001 diff --git a/t/images/XMP.inx b/t/images/XMP.inx new file mode 100644 index 0000000..19d9b93 --- /dev/null +++ b/t/images/XMP.inx @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<?aid style="33" type="document" DOMVersion="5.0" readerVersion="4.0" featureSet="257" product="5.0(458)" ?> +<docu InLi="x_0" zero="x_2_U_0_U_0" pacl="o_uaa" DCcp="c_U.S. Web Coated (SWOP) v2" DCrp="c_sRGB IEC61966-2.1" DCci="e_RIcs" DCbi="e_RIcs" DCii="e_RIcs" CSrp="e_CPpp" CScp="e_CPpd" DCsa="b_f" Self="rc_d"> + <lang pnam="rk_English: USA" lsqu="k_‘’" ldqu="k_“â€" pril="rk_English" subl="rk_USA" ID="rl_10d" lhyv="c_Proximity" lspv="c_Proximity" Self="rc_u40"/> + <colr clmd="e_prss" clsp="e_CMYK" clvl="x_4_D_0_D_0_D_0_D_100" ovrd="e_eOvB" clbs="o_n" atcs="e_nasp" atvl="x_0" pnam="c_Black" edbl="b_f" rmbl="b_f" pvis="b_t" swID="l_1f01" Self="rc_ub"/> + <ctbb pvrs="l_0" bbtp="e_bbtc" spcl="y_0" bben="e_eta6" bbmx="x_6_D_1_D_0_D_0_D_1_D_0_D_0" pnam="k_" edbl="b_t" rmbl="b_t" pvis="b_f" swID="l_1f01" Self="rc_u7e"> + <pcnt><![CDATA[AAAAAT/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==]]></pcnt> + </ctbb> + <swch pnam="c_None" edbl="b_f" rmbl="b_f" pvis="b_t" swID="l_1f01" Self="rc_ue"/> + <grad grdt="e_axlg" pnam="k_" edbl="b_t" rmbl="b_t" pvis="b_f" swID="l_1f01" Self="rc_u7c"> + <gstp gcls="o_u7d" loca="D_0" Self="rc_u7cgstp0"/> + </grad> + <StSt strT="rk_" pnam="k_Triple~sep~Stroke" Self="rc_dib01a"/> + <fFam pnam="c_Times" Self="rc_di3e"> + <FonT fFam="c_Times" pnam="c_Times Regular" fPSN="k_Times-Roman" stts="e_fsIn" fSty="c_Regular" fnTp="e_ftTT" WSCR="l_0" fnam="c_Times Roman" fFUN="c_Times Roman" fStN="k_Regular" fPLT="k_" vers="c_6.0d6e5" Self="rc_di3eFonTnTimes Regular"/> + </fFam> + <Cset pnam="k_Styles for Word/RTF Imported Lists" Self="rc_u236"/> + <csty pnam="k_[No character style]" smpt="b_f" Self="rc_u68"/> + <cMep Self="rc_dcMep1"> + <pcnt><![CDATA[<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.0-c006 1.236519, Wed Jun 14 2006 08:31:24"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" + xmlns:stMfs="http://ns.adobe.com/xap/1.0/sType/ManifestItem#"> + <xapMM:InstanceID>beb2441b-dd64-11df-b20e-e65882d9428e</xapMM:InstanceID> + <xapMM:DerivedFrom rdf:parseType="Resource"> + <stRef:instanceID>f0d208df-dc56-11df-95ac-e273561c7691</stRef:instanceID> + <stRef:documentID>adobe:docid:indd:0419e6d7-167b-11df-8afc-dcb7ca988d92</stRef:documentID> + </xapMM:DerivedFrom> + <xapMM:DocumentID>adobe:docid:indd:f0d208e0-dc56-11df-95ac-e273561c7691</xapMM:DocumentID> + <xapMM:RenditionClass>default</xapMM:RenditionClass> + <xapMM:Manifest> + <rdf:Bag> + <rdf:li rdf:parseType="Resource"> + <stMfs:linkForm>ReferenceStream</stMfs:linkForm> + <stMfs:reference rdf:parseType="Resource"> + <stRef:instanceID>uuid:9CC7E7EDDC5811DF8C4BC09357E49DC9</stRef:instanceID> + <stRef:documentID>uuid:9CC7E7ECDC5811DF8C4BC09357E49DC9</stRef:documentID> + </stMfs:reference> + <xapMM:placedXResolution>72.00</xapMM:placedXResolution> + <xapMM:placedYResolution>72.00</xapMM:placedYResolution> + <xapMM:placedResolutionUnit>Inches</xapMM:placedResolutionUnit> + </rdf:li> + </rdf:Bag> + </xapMM:Manifest> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xap="http://ns.adobe.com/xap/1.0/" + xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"> + <xap:CreateDate>2010-10-18T14:59:13Z</xap:CreateDate> + <xap:ModifyDate>2010-10-19T22:53:33Z</xap:ModifyDate> + <xap:MetadataDate>2010-10-19T22:53:33Z</xap:MetadataDate> + <xap:CreatorTool>Adobe InDesign 5.0</xap:CreatorTool> + <xap:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xapGImg:format>JPEG</xapGImg:format> + <xapGImg:width>1024</xapGImg:width> + <xapGImg:height>1024</xapGImg:height></xapGImg:image> + </rdf:li> + </rdf:Alt> + </xap:Thumbnails> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xapTPg="http://ns.adobe.com/xap/1.0/t/pg/" + xmlns:xapG="http://ns.adobe.com/xap/1.0/g/" + xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#"> + <xapTPg:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Black</xapG:swatchName> + <xapG:mode>CMYK</xapG:mode> + <xapG:type>Process</xapG:type> + <xapG:cyan>0</xapG:cyan> + <xapG:magenta>0</xapG:magenta> + <xapG:yellow>0</xapG:yellow> + <xapG:black>100</xapG:black> + </rdf:li> + </rdf:Seq> + </xapTPg:Colorants> + <xapTPg:Fonts> + <rdf:Bag> + <rdf:li rdf:parseType="Resource"> + <stFnt:fontName>Times-Roman</stFnt:fontName> + <stFnt:fontFamily>Times</stFnt:fontFamily> + <stFnt:fontFace>Regular</stFnt:fontFace> + <stFnt:fontType>TrueType</stFnt:fontType> + <stFnt:versionString>Times-Roman6.0d6e5</stFnt:versionString> + <stFnt:composite>false</stFnt:composite> + <stFnt:fontFileName>Times.dfont</stFnt:fontFileName> + </rdf:li> + </rdf:li> + </rdf:Bag> + </xapTPg:Fonts> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <dc:format>application/x-indesign</dc:format> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> +<?xpacket end="r"?>]]></pcnt> + </cMep> + <cOpt tlnm="k_Index" tlsl="o_u67" ReIx="b_t" iBkD="b_f" iHEs="b_f" IdxF="e_NtIf" iSHs="b_t" iEiS="b_f" lOst="o_u67" lTws="o_u67" lThs="o_u67" lFst="o_u67" sHst="o_u67" pnSt="o_u68" crSt="o_u68" crTS="o_u68" ftSp="c_ " beSp="c_; " prSp="c_^=" pnSp="c_, " crSp="c_. " eeSp="c_" Self="rc_dcOpt1"/> + <layr pnam="c_Layer 2" pvis="b_f" plck="b_t" lcol="e_iRed" iwrp="b_f" sogd="b_t" lkgd="b_f" uilr="b_t" exlr="b_t" prta="b_t" Self="rc_u146"/> +</docu> diff --git a/t/images/XMP.jpg b/t/images/XMP.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec2f5a1c7b6fb72d949e6f4bcfaea510d8ef8057 GIT binary patch literal 10314 zcmdry2~-o;+IJ=!`!1U(BeDq+5`+K|kX-^&5Kz!sH6#Hdki-yVajTZvy3~bQ>b{_L zZMD^kO09LRTCMw5wSB11s?}P$xKyqD-<?TJ5JGEv{&U`YlQT2l-23gzy?5@U?P6OC za!5~=q#}YOP#XMD+f`OhO0}{GA&DdiSs;XLksU!I2Y@!fX%Da^+?(Na(6{dg*oj~v z0`B<qBslc_48Yy>@MVAl^*AKJLZEel`*k?O^zcJ~`vYtPcWYqeOfoz%{(`9_>JE1| zXji_)rul~hd>1+ss4AsSS3}998l6(DLa9U2C8?4@nJ87MQe-Qu!@>oE;c9g`wvQ$> z+!N&LLIsswqSmP^O4J%Ek}p7E0ztS~5GD>2QG#f3Kan_GgtAMNWmK9}J5Eu9lGK_S zt+Kd8M`27LHg<vKXz5hOb}i`T^R`j{06i=R70_HBV#7@kCKRydGJdE9e6}8*4KOi} z!6Cp0<UEFFBW|y^qD|NUFj>#EZvmL4Z*K;et%vsk%+cd~1u(Ck(T4-FE%h*tmz5sp zG~l2WdfkKq0kML?$2jB)#^+dnmLARq*shV$;S$i=>)~qvJ2W!1EWmNo!<ao<#iRAd z?Svl2{P8go0L&j8D-;VN#KLGw7)6Ib*l8QiNh>%DfH9^k(bFFW7(e5~wB3OBqcxKT zhC4!B#M0*`7ibLmD+VPE`I`u^Y5o!<<BxP`C-pEb5H5!FGThs)x=k$6=``ZdP*nwA zij$5nQ<sNUOEsZFz91B#7&HJ?BMp)w87f5zq(c-cgnKbkA{B~70nge{0JJH=9(Y3e zC<0|70h}6?1b8LTlZI-M7T{dCzk>3BQ!Vh4p=h890RC~{D=bF}&uW@`2*{KIhY(Z* z^kpDb0URnojsmVSkmLj0bKq*Au0~>@DF>Qzz|jFUML(B;mKAg#*3KwFtZz49htgIU zx#&PcOd$b&Qm|G5Jj5skcq&1sJkV1OdQm7G@lhn|2bhc%TCkxAFmq5cN_{~GrVn#1 z0S$Gas~CmCuZsTh;o1+lsln1>XcdBg@Glg+83xxd_=P|p<{tt!)qn-q&T4qVHulzA zP!4)AHY-s9Z9{u$xQ}n*2|oB!4OWJNWd*ccK1js=z!q774KaGDVz7zvzZP&cAYBQR zD!`CJ)YPaFTCjDM@Wc5aMp3{?02v{Iei1x{fK>wUSp+~uKot$X3jwRcp;ZWw2wKBI zh8%FiK`%LA_JeBxtw;Na%IQ3K(U%&KtpyJl{fO~GfoB<<INI226?!{`&+VjWJ29>p zPMob$z{9b?UckMke#nLXu_isHePv*K9LlCMA7@A!aMGf2Kv4sp3<a3U5C+f4+t|~d zJErMMuNZx=93<e{Xdj!-v`+wE=(^C};Ab)5Nx@&mbiLs`!!mH(DrpWrz+(v1LMrqK zA$AlBgg7e!KLqepfUTtI`#=wV#(9Q0$l<vFMu_ac=#TdL8vW6=#Rk7%e-zUdS7Bna zF{j&eZy#qIqnGhU5?H8#I2&bBP_?)Q!hz2}$%*z_8hv1tWVFs;c?HC&5RCzk%i6`; zXnP{Wr`W_R9rO6b5zl-Eccje&$rT{^WoTX|FWPHw^hxJ-8@z%?Egd}?{D0Sm!F~#6 zk!+}wB**~`NXOB@qm-fx&zSnmT<l-8#FQqP_I+og!GG?Eu7N65gKyN3H5k&o)a=!f z8qcAoa~V_H9r45{0pg*fW#UyvHmw295@vpjgR!cHu3xN~u^s#S?{H(r{FqK@lb|Av zGiyFQk}#{EILIOj)(BeKM+$(kCgybLiqD_P$MT9niWaPn10QxJqdjidoUy)`V+LrB zXB9j);Pr!f{sxM!`Qnuap4AzBvE?c_<#3wk+@7Xu{<u={T!!aNCKHlCmZ8nO3?q(V zr0G27$)G9rBg2(}<si#2bA-VBf!BUvFvpscW{yW!mZgDA>?b_SsQ`|H)wvq-s^o=s zb22;9cO^{%GH}GT5G_0cGPQ+gt$dJ(t;QMMIgU9E%=7F@lU%S8kH0e7W(o2K=^ALO zK>cBbNP#BU0~9<P@yuz^o>$jW@oF8%ISyrko#tyd7y1mCU307iy*2b)W?0!u;R#oO zu`ZP$(YQ7+ou%8)pB+~|ali+^{nXNNDW-F;^VO><S7u$Sq$%-x6ZYI+rNW~ye&55j z#^`OH+O(&=CFW!G^8V_)V)MWvJjzsnl}fncSpkn^Ibd%QoVfDwdKbsqG`sN|EPgY^ zRnQqdMN_utFu-ihzl;`L<<St3iX(+J#^ZC8S&1)VVy>of_-|Zw;4vv3qF4A*s|{v< z!nneyfc0Gs)S?2io#BSx#~H8VeF?)mIYXBSI34!^%)gnxC=IXb4R7d7-5U9d_41iq zG|W7v723X9I@UeTLgpP6@B82tk>a^^SZmDLbZlgH3NRn$7X!TppW=NMJc{5-VCGK7 zJ2-1P$6|cOXk~8XFwMF4*5ID5ePK%b-<YqAb(!GJf09Av5R=X_2=m4JJZcyVD(Sf4 znMwjJcs4NX&xvVB2BRL{<>_n<jCXHju)9+Tqe%q4%Oir_9yzRJ@LqusAiNtC1w3W& zZX5!5g@6|gPtmZ>DFQq>K+FoxXt6oX{ujm}#>yP<sbRO`pTyU6U!b!%o5~SG%yFIL z{aw87OogX1y6TP9)D=Ecu`&9(Ymb=^JPTpx*RY~7tW)A(jm7MN;@w%i3#!oXt>SkA zytiuH!850YdESPR=+EwdJ#S1$4Q6i_kF1PlFYY`uJstPWnLRNa)hak)=eq5hO@SmS zX;gMj7JL;-K?H%2P1+!(N=?ESgmRTmn=>$xDi}7L;vGl$>lPO(2T5fWn#|nPJiMtd zNlBtA0Liey&)grJN5Bc8Ga+f&6vedt<*TDiqt(G@2>cDDpIlKP1Go<0vMQYhx3>c9 zQdo*%l8s?4C<w4ShKm`vFO9>%@fenutKfSFiFMY<%jFn80Px%6Dir{;1_3;6oKjH* z@L7O;%PPy206zlQrCcGcfKNyG+ncXWAu9n`0I-cVFDD7$7=$cricR1`6IiFH20f9< zx3NH3A4(V<9Yv)ns>&2PT}ZZ6Rw~uXsU&r|MyjfT4>PpQm<l;z-%{XYkuX{$3JK$b z`=1|Oc0R}I8o;q-Fn%3O$Bb}2W^6Ok8r#&32u0lo-^?|(6)r?*`<n>4Uoy7&u7J;8 zbqF<`FtNuK=ZpS>PgPYFU#XDsu|uC9e~R!N(>!1zkB{X&_Z^k2D3Vr|=_u?}nYv6} zsii73QkjAZc`=FqHlc}HCVKSEQ4}e(3KfVN3R$L96+^gHawYyKODR?6BK$YWOmx5? zlh*(^uYQJHM)8ru2^Ylr@fcz|TO-zpWza)BkJ}*2p|JmiP`>v~Chq};e)`((Le7Cl zvO-x*;pU{AJW5un9fx7434Gze_+$@XvOQ2w_%;+s?;k|M8*V&&#Y%@a&^$B@jfDBO z1ZH_Hj7SsE6f_OZM03%5Xc1bDR-^T36WW5dqg`k(`Vt*QC($`{8MUAr=niT{56}~W zAb5l=;Y@fC-h>|!OoS0pL>!Sq3?g!fVZ>;nm{1Xw#026EVkS{fEFxAC>xoZ@oy1<^ z2yu$|hPX=HCVn9vlPuDPbRm0?{$wZ_MJA9LWFGk%Sxk;4YsortHo1UoBtImZ$i3uI z@*LSh-XZU^5X+k7%Id`mVMVc$SXr#$tRj|{HHkHY)xc_GZDKXE4zbR#T3B~kzq7e) zXEwzSVfSaJv4^l_?6K@g>{;wZ>~-uW_5t=8_EmN(`x(cU<HZT)h&d8Y0jHQ##hJ!w z;H=?n;~eCi<J{mp;BvXH+yHJQH;p@tJBB-+JBz!NyP3O(dy0FVd!NVSdGLaHvAisv zl&9lO<1OTU$oqnKns<Zu$imvf+ak;&)nd4X%3`WTgT)4m-4>@UZdyFCbg=ZZ6kBFl z$}MXw=UA?`Y_>dMdBgIFm7`UFRjgH>)flTORtu~)Ssk>xV)d)FwY86RwDn+XrS<F9 z3#>o3K5Tu}`ga>An;@Gcn-MmZHnVNk+U&9U#^zUBTU&qIc-!H&I@{T{>uvYjerNm0 z&e@J{C$W>;O}1NX*JO9v?w-A+y`O!8{Yd*-`v&{1_9yJ`I#@dRJ0v+s9VR&}cG&4~ z!QsB6v!l>4%dy;Xmg5G;BaXM6cuxLKDNb^yI;T}m`<<>kvz&W7CppWU-*8^-e9-xZ z3)dyUMdC8XWv0tVF2`M3yE%0W?>4ksb+^UcKJV7z%5wF0mAIC<&T-x1dfxT1TMxGc zH-+1Dw@q%R-5$DkcaL{hxX*Ck?0(Muu?OXm;!)}`&ttpCx1MazAkV>`Ri4W{4|?A1 z?$W(~cUkut-M4hV<VAV~dF6PG_gdw3%<F!So;?Qk(DYc?V}FmkJzaao_Z-u6e$U-K zZ+km?$9XHg=X-zQ{R7pFN}$T91=InmwU<|~v|g3HR`xpH>xoZ*&k&!fKAU~M?QPXN zs&`TE`Mvk`ZuRx{&Gen%yV3WOpQT@vUy0xQeuw-X`Um*u`@iMC-TzjAdw?XMHeh4G zl|b9T0fA!!8w1bw;r5B@Q`%=~pOZmkP()Bk(BhyI!DO%~SQ)%D_*7p`-{`)ozKwk^ zgxG{6gp3Q>7;=^G${)m^%HPhv7wQ{2Jak^@q0nc72tk=(wcxVQNtiC2Dr^@15*8FD z3tJp^wx4ak)P9ru?dbP&cyPEPd|CL#2<M2*h_@p4Mf@R(6lq19M7JY-BS%LriM$Zy z5|te_E9!7GCps~Da`dj~-^C)aPP|3@Q~!|urTsVbzZDY@qlj4@b3N84RvNo9wk3{= z8y&YIu4O>40n!1D1FpsQj+e);iNBf9Ct*y&hY9x*1&P|kZHW()#7PsA_9U~C2PV%* zKAz%~G9+bD%6F+gsl}-qQ(Ff{3>-gjPZ}pJBW+&V1xXKyOtN0mnjV=xG5tV>O-63U zqKs>Uf(B^^HD{8U>6!0lUU|ju71b--vrv{K>)otxvjeinW`8!AJ2-pr;=$kN2y-Un z9Ljah9hJKw_d#A_-kiM4Ljs3X4%s)<e&~py>xVwfPtLE;Zz%{Zm{@RhnCCF%upPsB z!-o!EGyMLmDX+fw>WvW*Bc_cw|60In)vp~H={d4&<maR8M@dI*9nBe?KYGLHr_wBG zqx62Eq;N@Lt1L<OzU+=XUOr!bTM?_MSKKU$EvhfNRUBLVZt?As0VNG3ca=%XMarMY zq>WiV=3!}8>Dtn^vi!2m<rd|m%Xg}rRHdo|>YnOq^(jrTW}2pDta$8uV_UTu+BFqK z#cLHibS|)%I#wB2`DW$SadG1ok9$-#v}$X$W3{UKSWQsP^qQNsskI-BXOEYS-#4Mx zgeeoQPE44%auPAAaMHfXy(iaAzVZ6N*Vj$4no>ID>#2gN^;3U)Bma%&x*m0}*Ij>e z;F}w#*-g_<yYN>3x0b)nep~tW@#+1hFP#2thJ40XGX*mnW<H%IoAuQ@!gm(D(>A+k z_VGEQIm_m9=c?wOpEqFMx_Za@+WPD7X1?1rpPD~o{%`M%dhbX>c*FAdt=_MEzh%Lo z1v?h{E}XmY>7tTF=N2a}-n_(X$@C=;m&%u(UKYP>)AAn6XD)xdLb>AN%7H7J8vPp^ zR&iI2TlM|wp{oyl5cR?OHJ)o`uK8oFYHiE9oOK7*N3LJL!E3{ujpWA4jkiA>@!`pj zl0Vw9DP+^i&90kgevCe@{P>4YMt^dCOU9OcTcfsa`qb~!CEJ|0&1fQ;YMNTNmuzp@ zF>J@Fo#{LGHTQ4c_8I@PwYz%lTKsvp&*$v6+FiH1?Tgwk?(fm;xx2S`@AZA7_Fdjz zu>b6V!3T~X%s6=X%hWITA4)j%#o^e)yN-yD?EEU~tL;ZcN1KjC9NYGF#Mj%7i;g#) zh&-|5Wc11AQ!%G@pB`{}@0sK?U!IkmJ$mkybEnP^Ie+oOhzl(j<ri;#Q})fzm&RRs za{2WuoGUZFb@;a7JFo8=|JCPTn_EOJpI=SBdhA;6waeFK*YEth;@?ki)O~OJeZx)f zo9l0d-P(0K_4dghUj5<59nGC5cc=a6_~Vj$f%iWBDgLKptp%+&e%Ain_RFkaJ$_yL zTljDL?q}cs?m_v3Cl6;l@_4lF_o&|wJ<fl8^GVfH-qQtt^!cOtS;n&~ZRKrkZTFBJ z{U0)Tp@V~HyNv3Pi-UuQlShD?TR@n<w|^Ml9}a$81U}-D6X+wktAps~;X!#({_gJn zB7e$Xlq?Dk76CzGL}FKD#=f>a$k77+x@W;6d=TkKupEiD1MoQrzxT8|xE)&HFMaJW a;K8v&OWP%6!y<q)%Mo6$wj%GgZ~hNgjcw%s literal 0 HcmV?d00001 diff --git a/t/images/XMP.svg b/t/images/XMP.svg new file mode 100644 index 0000000..3c3d094 --- /dev/null +++ b/t/images/XMP.svg @@ -0,0 +1,33 @@ +<?xml version="1.0" standalone="yes"?> +<svg width="4in" height="3in" version="1.1" + xmlns = 'http://www.w3.org/2000/svg'> + <desc xmlns:myfoo="http://example.org/myfoo"> + <myfoo:title>This is a financial report</myfoo:title> + <myfoo:descr>The global description uses markup from the + <myfoo:emph>myfoo</myfoo:emph> namespace.</myfoo:descr> + <myfoo:scene><myfoo:what>widget $growth</myfoo:what> + <myfoo:contains>$three $graph-bar</myfoo:contains> + <myfoo:when>1998 $through 2000</myfoo:when> </myfoo:scene> + </desc> + <metadata> + <rdf:RDF + xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:rdfs = "http://www.w3.org/2000/01/rdf-schema#" + xmlns:dc = "http://purl.org/dc/elements/1.1/" > + <rdf:Description about="http://example.org/myfoo" + dc:title="MyFoo Financial Report" + dc:description="$three $bar $thousands $dollars $from 1998 $through 2000" + dc:publisher="Example Organization" + dc:date="2000-04-11" + dc:format="image/svg+xml" + dc:language="en" > + <dc:creator> + <rdf:Bag> + <rdf:li>Irving Bird</rdf:li> + <rdf:li>Mary Lambert</rdf:li> + </rdf:Bag> + </dc:creator> + </rdf:Description> + </rdf:RDF> + </metadata> +</svg> diff --git a/t/images/XMP.xml b/t/images/XMP.xml new file mode 100644 index 0000000..c846605 --- /dev/null +++ b/t/images/XMP.xml @@ -0,0 +1,98 @@ +<?xml version='1.0' encoding='UTF-8'?> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + +<rdf:Description rdf:about='t/images/Nikon.jpg' + xmlns:et='http://ns.exiftool.org/1.0/' et:toolkit='Image::ExifTool 7.62' + xmlns:ExifTool='http://ns.exiftool.org/ExifTool/1.0/' + xmlns:File='http://ns.exiftool.org/File/1.0/' + xmlns:IFD0='http://ns.exiftool.org/EXIF/IFD0/1.0/' + xmlns:ExifIFD='http://ns.exiftool.org/EXIF/ExifIFD/1.0/' + xmlns:Nikon='http://ns.exiftool.org/MakerNotes/Nikon/1.0/' + xmlns:InteropIFD='http://ns.exiftool.org/EXIF/InteropIFD/1.0/' + xmlns:IFD1='http://ns.exiftool.org/EXIF/IFD1/1.0/' + xmlns:EXIF='http://ns.exiftool.org/EXIF/EXIF/1.0/' + xmlns:Composite='http://ns.exiftool.org/Composite/1.0/'> + <ExifTool:ExifToolVersion et:tagid=''>7.62</ExifTool:ExifToolVersion> + <File:FileName et:tagid=''>Nikon.jpg</File:FileName> + <File:Directory et:tagid=''>t/images</File:Directory> + <File:FileSize et:tagid=''>1703 bytes</File:FileSize> + <File:FileModifyDate et:tagid=''>2006:01:04 14:02:27-05:00</File:FileModifyDate> + <File:FileType et:tagid=''>JPEG</File:FileType> + <File:MIMEType et:tagid=''>image/jpeg</File:MIMEType> + <File:ExifByteOrder et:tagid=''>Little-endian (Intel, II)</File:ExifByteOrder> + <File:ImageWidth et:tagid=''>8</File:ImageWidth> + <File:ImageHeight et:tagid=''>8</File:ImageHeight> + <File:EncodingProcess et:tagid=''>Baseline DCT, Huffman coding</File:EncodingProcess> + <File:BitsPerSample et:tagid=''>8</File:BitsPerSample> + <File:ColorComponents et:tagid=''>3</File:ColorComponents> + <File:YCbCrSubSampling et:tagid=''>YCbCr4:2:0 (2 2)</File:YCbCrSubSampling> + <IFD0:ImageDescription et:tagid='270'> </IFD0:ImageDescription> + <IFD0:Make et:tagid='271'>NIKON</IFD0:Make> + <IFD0:Model et:tagid='272'>E775</IFD0:Model> + <IFD0:Orientation et:tagid='274'>Horizontal (normal)</IFD0:Orientation> + <IFD0:XResolution et:tagid='282'>300</IFD0:XResolution> + <IFD0:YResolution et:tagid='283'>300</IFD0:YResolution> + <IFD0:ResolutionUnit et:tagid='296'>inches</IFD0:ResolutionUnit> + <IFD0:Software et:tagid='305'>E775v1.3u</IFD0:Software> + <IFD0:ModifyDate et:tagid='306'>2001:08:01 12:57:23</IFD0:ModifyDate> + <IFD0:YCbCrPositioning et:tagid='531'>Co-sited</IFD0:YCbCrPositioning> + <ExifIFD:ExposureTime et:tagid='33434'>1/213</ExifIFD:ExposureTime> + <ExifIFD:FNumber et:tagid='33437'>9.4</ExifIFD:FNumber> + <ExifIFD:ExposureProgram et:tagid='34850'>Program AE</ExifIFD:ExposureProgram> + <ExifIFD:ISO et:tagid='34855'>100</ExifIFD:ISO> + <ExifIFD:ExifVersion et:tagid='36864'>0210</ExifIFD:ExifVersion> + <ExifIFD:DateTimeOriginal et:tagid='36867'>2001:08:01 12:57:23</ExifIFD:DateTimeOriginal> + <ExifIFD:CreateDate et:tagid='36868'>2001:08:01 12:57:23</ExifIFD:CreateDate> + <ExifIFD:ComponentsConfiguration et:tagid='37121'>YCbCr</ExifIFD:ComponentsConfiguration> + <ExifIFD:CompressedBitsPerPixel et:tagid='37122'>3</ExifIFD:CompressedBitsPerPixel> + <ExifIFD:ExposureCompensation et:tagid='37380'>0</ExifIFD:ExposureCompensation> + <ExifIFD:MaxApertureValue et:tagid='37381'>3.4</ExifIFD:MaxApertureValue> + <ExifIFD:MeteringMode et:tagid='37383'>Multi-segment</ExifIFD:MeteringMode> + <ExifIFD:LightSource et:tagid='37384'>Unknown</ExifIFD:LightSource> + <ExifIFD:Flash et:tagid='37385'>No Flash</ExifIFD:Flash> + <ExifIFD:FocalLength et:tagid='37386'>8.6 mm</ExifIFD:FocalLength> + <ExifIFD:UserComment et:tagid='37510'></ExifIFD:UserComment> + <ExifIFD:FlashpixVersion et:tagid='40960'>0100</ExifIFD:FlashpixVersion> + <ExifIFD:ColorSpace et:tagid='40961'>sRGB</ExifIFD:ColorSpace> + <ExifIFD:ExifImageWidth et:tagid='40962'>1600</ExifIFD:ExifImageWidth> + <ExifIFD:ExifImageHeight et:tagid='40963'>1200</ExifIFD:ExifImageHeight> + <ExifIFD:FileSource et:tagid='41728'>Digital Camera</ExifIFD:FileSource> + <ExifIFD:SceneType et:tagid='41729'>Directly photographed</ExifIFD:SceneType> + <Nikon:MakerNoteVersion et:tagid='1'>1.00</Nikon:MakerNoteVersion> + <Nikon:ISO et:tagid='2'>0</Nikon:ISO> + <Nikon:ColorMode et:tagid='3'>Color</Nikon:ColorMode> + <Nikon:Quality et:tagid='4'>Fine</Nikon:Quality> + <Nikon:WhiteBalance et:tagid='5'>Auto</Nikon:WhiteBalance> + <Nikon:Sharpness et:tagid='6'>Auto</Nikon:Sharpness> + <Nikon:FocusMode et:tagid='7'>AF-C</Nikon:FocusMode> + <Nikon:FlashSetting et:tagid='8'></Nikon:FlashSetting> + <Nikon:ISOSelection et:tagid='15'>Auto</Nikon:ISOSelection> + <Nikon:ImageAdjustment et:tagid='128'>Normal</Nikon:ImageAdjustment> + <Nikon:AuxiliaryLens et:tagid='130'>Off</Nikon:AuxiliaryLens> + <Nikon:ManualFocusDistance et:tagid='133'>inf</Nikon:ManualFocusDistance> + <Nikon:DigitalZoom et:tagid='134'>1</Nikon:DigitalZoom> + <Nikon:AFAreaMode et:tagid='0'>Single Area</Nikon:AFAreaMode> + <Nikon:AFPoint et:tagid='1'>Center</Nikon:AFPoint> + <Nikon:AFPointsInFocus et:tagid='2'>(none)</Nikon:AFPointsInFocus> + <Nikon:SceneMode et:tagid='143'></Nikon:SceneMode> + <Nikon:DataDump et:tagid='16' rdf:datatype='http://www.w3.org/2001/XMLSchema#base64Binary'> +ATkAgAFEAAAAAP8BAAAAAAJqGAAAAAAAAjEAAA8wAAAR4wAADwsAAA8LAQAf +AArcAE4AAAAABpkFwwSSA3YT/QPrAAAAAA4YHAoAAAAAAAAAAAAAAAALDwAA +KAANJAABYjEANhAAFxwYIRwk/1MRURBYMgABHQAE/wA= +</Nikon:DataDump> + <InteropIFD:InteropIndex et:tagid='1'>R98 - DCF basic file (sRGB)</InteropIFD:InteropIndex> + <InteropIFD:InteropVersion et:tagid='2'>0100</InteropIFD:InteropVersion> + <IFD1:Compression et:tagid='259'>JPEG (old-style)</IFD1:Compression> + <IFD1:XResolution et:tagid='282'>300</IFD1:XResolution> + <IFD1:YResolution et:tagid='283'>300</IFD1:YResolution> + <IFD1:ResolutionUnit et:tagid='296'>inches</IFD1:ResolutionUnit> + <IFD1:ThumbnailOffset et:tagid='513'>1426</IFD1:ThumbnailOffset> + <IFD1:ThumbnailLength et:tagid='514'>28</IFD1:ThumbnailLength> + <Composite:Aperture et:tagid=''>9.4</Composite:Aperture> + <Composite:ImageSize et:tagid=''>8x8</Composite:ImageSize> + <Composite:ShutterSpeed et:tagid=''>1/213</Composite:ShutterSpeed> + <Composite:ThumbnailImage et:tagid=''>&lt;Dummy thumbnail image data&gt;</Composite:ThumbnailImage> + <Composite:FocalLength35efl et:tagid=''>8.6 mm</Composite:FocalLength35efl> + <Composite:LightValue et:tagid=''>14.2</Composite:LightValue> +</rdf:Description> +</rdf:RDF> diff --git a/t/images/XMP.xmp b/t/images/XMP.xmp new file mode 100644 index 0000000..288ba55 --- /dev/null +++ b/t/images/XMP.xmp @@ -0,0 +1,99 @@ +<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="3.1.1-111"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:exif="http://ns.adobe.com/exif/1.0/" + xmlns:tiff="http://ns.adobe.com/tiff/1.0/" + xmlns:xap="http://ns.adobe.com/xap/1.0/" + xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" + exif:ExifVersion="0.2.2.0" + exif:FlashpixVersion="0.1.0.0" + exif:ColorSpace="1" + exif:CompressedBitsPerPixel="3/1" + exif:PixelXDimension="1136" + exif:PixelYDimension="852" + exif:DateTimeOriginal="2005-06-09T20:09:27+02:00" + exif:DateTimeDigitized="2005-06-09T20:09:27+02:00" + exif:ExposureTime="4/10" + exif:FNumber="28/10" + exif:ShutterSpeedValue="42/32" + exif:ApertureValue="95/32" + exif:ExposureBiasValue="-3/3" + exif:MaxApertureValue="95/32" + exif:MeteringMode="5" + exif:FocalLength="5800/1000" + exif:FocalPlaneXResolution="2272000/224" + exif:FocalPlaneYResolution="1704000/168" + exif:FocalPlaneResolutionUnit="2" + exif:SensingMethod="2" + exif:FileSource="3" + exif:CustomRendered="0" + exif:ExposureMode="1" + exif:WhiteBalance="0" + exif:DigitalZoomRatio="2272/2272" + exif:SceneCaptureType="0" + exif:NativeDigest="36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;CE459FE772DF591DDF5F63CA3F2A087B" + tiff:Make="Canon" + tiff:Model="Canon DIGITAL IXUS 40" + tiff:Orientation="1" + tiff:XResolution="1800000/10000" + tiff:YResolution="1800000/10000" + tiff:ResolutionUnit="2" + tiff:YCbCrPositioning="1" + tiff:ImageWidth="1136" + tiff:ImageLength="852" + tiff:NativeDigest="256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;D11E7FC551E751BE9E616260834B2A1D" + xap:CreateDate="2005-11-21T17:07:14+01:00" + xap:ModifyDate="2005-11-21T17:07:14+01:00" + xap:MetadataDate="2005-11-21T17:11:31+01:00" + xap:CreatorTool="Adobe Photoshop CS2 Windows" + xap:Rating="1" + xapMM:DocumentID="uuid:7A9636BAA85ADA11B611C7FA524F1F71" + xapMM:InstanceID="uuid:7B9636BAA85ADA11B611C7FA524F1F71" + dc:format="image/jpeg" + photoshop:ColorMode="3" + photoshop:ICCProfile="sRGB IEC61966-2.1" + photoshop:History=""> + <dc:rights> + <rdf:Alt> + <rdf:li xml:lang='x-default'>© Copyright Phil Harvey</rdf:li> + <rdf:li xml:lang='fr'>© Droit d'auteur Phil Harvey</rdf:li> + </rdf:Alt> + </dc:rights> + <dc:subject> + <rdf:Bag> + <rdf:li>test1</rdf:li> + <rdf:li>&amp;-<![CDATA[&amp;]]>-&amp;</rdf:li> + </rdf:Bag> + </dc:subject> + <exif:ComponentsConfiguration> + <rdf:Seq> + <rdf:li>1</rdf:li> + <rdf:li>2</rdf:li> + <rdf:li>3</rdf:li> + <rdf:li>0</rdf:li> + </rdf:Seq> + </exif:ComponentsConfiguration> + <exif:Flash + exif:Fired="False" + exif:Return="0" + exif:Mode="2" + exif:Function="False" + exif:RedEyeMode="False"/> + <tiff:BitsPerSample> + <rdf:Seq> + <rdf:li>8</rdf:li> + <rdf:li>8</rdf:li> + <rdf:li>8</rdf:li> + </rdf:Seq> + </tiff:BitsPerSample> + <xapMM:DerivedFrom + stRef:instanceID="adobe:docid:photoshop:f481cc67-d8f5-11d9-a31e-a1606d941d83" + stRef:documentID="adobe:docid:photoshop:f481cc67-d8f5-11d9-a31e-a1606d941d83"/> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> +<?xpacket end="w"?> \ No newline at end of file diff --git a/t/images/XMP2.xmp b/t/images/XMP2.xmp new file mode 100644 index 0000000..92ca23c --- /dev/null +++ b/t/images/XMP2.xmp @@ -0,0 +1,25 @@ +<?xpacket begin="" id="testing"?><x:xmpmeta xmlns:x="adobe:ns:meta/"><rdf:RDF +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:tiff="http://ns.adobe.com/tiff/1.0/" +xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" +xmlns:aux="http://ns.adobe.com/exif/1.0/aux/"> +<rdf:Description rdf:nodeID="anon0"> + <aux:Lens>18.0 - 55.0mm</aux:Lens> + <aux:SerialNumber>0123456789</aux:SerialNumber> +</rdf:Description> +<rdf:Description rdf:nodeID="anon1"> + <tiff:ImageLength>2048</tiff:ImageLength> + <tiff:ImageWidth>3072</tiff:ImageWidth> +</rdf:Description> +<rdf:Bag rdf:nodeID="anon2"> + <rdf:li>ExifTool</rdf:li> + <rdf:li>XMP</rdf:li> + <rdf:li>nodeID</rdf:li> + <rdf:li>test</rdf:li> +</rdf:Bag> +<rdf:Description rdf:about="" + dc:title="XMP nodeID test (XMP written by f-spot)"> + <dc:subject rdf:nodeID="anon2" /> +</rdf:Description> +</rdf:RDF> +</x:xmpmeta><?xpacket end="r"?> \ No newline at end of file diff --git a/t/images/XMP3.xmp b/t/images/XMP3.xmp new file mode 100644 index 0000000..5737dd8 --- /dev/null +++ b/t/images/XMP3.xmp @@ -0,0 +1,69 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 6.32'> +<!-- +** Note that rdf:NodeID is not allowed in XMP, so this not strictly +** an XMP sample, but a more general RDF/XML sample! +--> +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:dd="http://purl.org/dc/elements/1.1/" + xmlns:ph="https://exiftool.org/ph/1.0/" + xmlns:xxx="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/" + xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/" + xmlns:stMfs='http://ns.adobe.com/xap/1.0/sType/ManifestItem#' + xmlns:stRef='http://ns.adobe.com/xap/1.0/sType/ResourceRef#' + xmlns:xmpMM='http://ns.adobe.com/xap/1.0/mm/' + xmlns:cc='http://creativecommons.org/ns#'> + <rdf:Description rdf:about="http://www.w3.org/TR/rdf-syntax-grammar" + dd:title="ExifTool common node, nonstandard namespace prefix, and bad list type tests"> + <dd:creator> + <rdf:Bag> + <rdf:li>bad_list_type_A</rdf:li> + <rdf:li>bad_list_type_B</rdf:li> + </rdf:Bag> + </dd:creator> + <ph:supervisor> + <rdf:Description rdf:nodeID="abc" ph:food="cookies"> + <ph:exclamation>doh!</ph:exclamation> + </rdf:Description> + </ph:supervisor> + <ph:programmer> + <rdf:Description rdf:nodeID="abc"> + <ph:state>confusion</ph:state> + </rdf:Description> + </ph:programmer> + <ph:tester rdf:nodeID="abc"/> + <xxx:CountryCode>CA</xxx:CountryCode> + <xxx:Scene> + <rdf:Bag> + <rdf:li>scene1</rdf:li> + </rdf:Bag> + </xxx:Scene> + <pdfx:Customↂ0020Propertyↂ00201>a custom property value</pdfx:Customↂ0020Propertyↂ00201> + <pdfx:Customↂ0020Propertyↂ00202>some other value</pdfx:Customↂ0020Propertyↂ00202> + </rdf:Description> + + <rdf:Description rdf:nodeID="abc" + ph:fullName="Phil Harvey"> + <ph:homePage rdf:resource="https://exiftool.org/"/> + </rdf:Description> + + <rdf:Description> + <xmpMM:Manifest> + <rdf:Seq> + <rdf:li rdf:parseType='Resource'> + <stMfs:linkForm>EmbedByReference</stMfs:linkForm> + <stMfs:reference rdf:parseType='Resource'> + <stRef:filePath>C:\some path\file.ext</stRef:filePath> + </stMfs:reference> + </rdf:li> + </rdf:Seq> + </xmpMM:Manifest> + <cc:attributionName> + <rdf:Alt> + <rdf:li xml:lang='x-default'>some attr</rdf:li> + </rdf:Alt> + </cc:attributionName> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/images/XMP4.xmp b/t/images/XMP4.xmp new file mode 100644 index 0000000..7a925dc --- /dev/null +++ b/t/images/XMP4.xmp @@ -0,0 +1,93 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 7.77'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:Iptc4xmpExt='http://iptc.org/std/Iptc4xmpExt/2008-02-29/'> + <Iptc4xmpExt:LocationCreated> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <Iptc4xmpExt:City>one</Iptc4xmpExt:City> + <Iptc4xmpExt:CountryCode>1</Iptc4xmpExt:CountryCode> + </rdf:li> + <rdf:li rdf:parseType='Resource'> + <Iptc4xmpExt:City>two</Iptc4xmpExt:City> + <Iptc4xmpExt:CountryCode>2</Iptc4xmpExt:CountryCode> + </rdf:li> + <rdf:li rdf:parseType='Resource'> + <Iptc4xmpExt:City>three</Iptc4xmpExt:City> + </rdf:li> + <rdf:li rdf:parseType='Resource'> + <Iptc4xmpExt:CountryCode>4</Iptc4xmpExt:CountryCode> + </rdf:li> + </rdf:Bag> + </Iptc4xmpExt:LocationCreated> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:dc='http://purl.org/dc/elements/1.1/'> + <dc:contributor> + <rdf:Bag> + <rdf:li>me</rdf:li> + </rdf:Bag> + </dc:contributor> + <dc:subject> + <rdf:Bag> + <rdf:li>one</rdf:li> + <rdf:li>two</rdf:li> + </rdf:Bag> + </dc:subject> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:test='http://ns.test.com/'> + <test:StructList2> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <test:Item1>c1-1</test:Item1> + <test:Item2>c2-1</test:Item2> + </rdf:li> + <rdf:li rdf:parseType='Resource'> + <test:Item1>c1-2</test:Item1> + <test:Item2>c2-2</test:Item2> + <test:TestList1> + <rdf:Bag> + <rdf:li>x1</rdf:li> + </rdf:Bag> + </test:TestList1> + <test:TestList2> + <rdf:Bag> + <rdf:li>y1</rdf:li> + <rdf:li>y2</rdf:li> + </rdf:Bag> + </test:TestList2> + </rdf:li> + </rdf:Bag> + </test:StructList2> + <test:StructList1> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <test:Item1>b1</test:Item1> + <test:Item2>b2</test:Item2> + </rdf:li> + </rdf:Bag> + </test:StructList1> + <test:BareStruct rdf:parseType='Resource'> + <test:Item1>a1</test:Item1> + <test:Item2>a2</test:Item2> + </test:BareStruct> + <test:BareList2> + <rdf:Bag> + <rdf:li>b1</rdf:li> + <rdf:li>b2</rdf:li> + </rdf:Bag> + </test:BareList2> + <test:BareList1> + <rdf:Bag> + <rdf:li>a1</rdf:li> + </rdf:Bag> + </test:BareList1> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/images/XMP5.xmp b/t/images/XMP5.xmp new file mode 100644 index 0000000..9566701 --- /dev/null +++ b/t/images/XMP5.xmp @@ -0,0 +1,157 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 8.82'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:Iptc4xmpExt='http://iptc.org/std/Iptc4xmpExt/2008-02-29/'> + <Iptc4xmpExt:ArtworkOrObject> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <Iptc4xmpExt:AOTitle> + <rdf:Alt> + <rdf:li xml:lang='x-default'>test</rdf:li> + <rdf:li xml:lang='de'>prüfung</rdf:li> + <rdf:li xml:lang='fr'>épreuve</rdf:li> + </rdf:Alt> + </Iptc4xmpExt:AOTitle> + </rdf:li> + </rdf:Bag> + </Iptc4xmpExt:ArtworkOrObject> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:exif='http://ns.adobe.com/exif/1.0/'> + <exif:Flash rdf:parseType='Resource'> + <exif:Mode>2</exif:Mode> + <exif:Return>0</exif:Return> + </exif:Flash> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:mwg-kw='http://www.metadataworkinggroup.com/schemas/keywords/'> + <mwg-kw:Keywords rdf:parseType='Resource'> + <mwg-kw:Hierarchy> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <mwg-kw:Children> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <mwg-kw:Keyword>A-2</mwg-kw:Keyword> + </rdf:li> + </rdf:Bag> + </mwg-kw:Children> + <mwg-kw:Keyword>A-1</mwg-kw:Keyword> + </rdf:li> + <rdf:li rdf:parseType='Resource'> + <mwg-kw:Children> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <mwg-kw:Keyword>B-2</mwg-kw:Keyword> + </rdf:li> + </rdf:Bag> + </mwg-kw:Children> + <mwg-kw:Keyword>B-1</mwg-kw:Keyword> + </rdf:li> + <rdf:li rdf:parseType='Resource'> + <mwg-kw:Keyword>C-1</mwg-kw:Keyword> + </rdf:li> + </rdf:Bag> + </mwg-kw:Hierarchy> + </mwg-kw:Keywords> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:Iptc4xmpExt='http://iptc.org/std/Iptc4xmpExt/2008-02-29/' + xmlns:exif='http://ns.adobe.com/exif/1.0/' + xmlns:mwg-rs='http://www.metadataworkinggroup.com/schemas/regions/' + xmlns:myXMPns='http://ns.exiftool.org/t/XMP.t' + xmlns:rdfs='http://www.w3.org/2000/01/rdf-schema#' + xmlns:stArea='http://ns.adobe.com/xmp/sType/Area#' + xmlns:xmpRights='http://ns.adobe.com/xap/1.0/rights/'> + <mwg-rs:Regions rdf:parseType='Resource'> + <mwg-rs:RegionList> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <mwg-rs:Area rdf:parseType='Resource'> + <stArea:h>8</stArea:h> + <stArea:w>8</stArea:w> + <stArea:x>0</stArea:x> + <stArea:y>0</stArea:y> + </mwg-rs:Area> + <mwg-rs:Name>Region 1</mwg-rs:Name> + <mwg-rs:Type>Face</mwg-rs:Type> + <rdfs:seeAlso rdf:resource='plus:Licensee'/> + </rdf:li> + <rdf:li rdf:parseType='Resource'> + <mwg-rs:Extensions rdf:parseType='Resource'> + <Iptc4xmpExt:ArtworkOrObject> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <Iptc4xmpExt:AOTitle> + <rdf:Alt> + <rdf:li xml:lang='de'>verfänglich</rdf:li> + </rdf:Alt> + </Iptc4xmpExt:AOTitle> + </rdf:li> + </rdf:Bag> + </Iptc4xmpExt:ArtworkOrObject> + <exif:Flash rdf:parseType='Resource'> + <exif:Mode>1</exif:Mode> + <exif:Return>2</exif:Return> + </exif:Flash> + <myXMPns:BTestTag rdf:parseType='Resource'> + <rdf:type rdf:resource='myXMPns:SomeFunnyType'/> + <myXMPns:Field1> + <rdf:Bag> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>this is wild</rdf:li> + </rdf:Alt> + </rdf:li> + </rdf:Bag> + </myXMPns:Field1> + </myXMPns:BTestTag> + <xmpRights:UsageTerms> + <rdf:Alt> + <rdf:li xml:lang='fr'>libre</rdf:li> + </rdf:Alt> + </xmpRights:UsageTerms> + </mwg-rs:Extensions> + </rdf:li> + </rdf:Bag> + </mwg-rs:RegionList> + </mwg-rs:Regions> + <myXMPns:BTestTag rdf:parseType='Resource'> + <rdf:type rdf:resource='myXMPns:SomeFunnyType'/> + <myXMPns:Field1> + <rdf:Bag> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='en-CA'>eh?</rdf:li> + <rdf:li xml:lang='en-US'>huh?</rdf:li> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='en-US'>groovy</rdf:li> + <rdf:li xml:lang='fr'>ingénieux</rdf:li> + </rdf:Alt> + </rdf:li> + </rdf:Bag> + </myXMPns:Field1> + </myXMPns:BTestTag> + </rdf:Description> + + <rdf:Description rdf:about='' + xmlns:plus='http://ns.useplus.org/ldf/xmp/1.0/'> + <plus:Licensee> + <rdf:Seq> + <rdf:li rdf:parseType='Resource'> + <plus:LicenseeName>Phil</plus:LicenseeName> + </rdf:li> + </rdf:Seq> + </plus:Licensee> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/images/XMP6.xmp b/t/images/XMP6.xmp new file mode 100644 index 0000000..9fd0c20 --- /dev/null +++ b/t/images/XMP6.xmp @@ -0,0 +1,48 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<!-- using "xmp:xmpmeta" instead of the usual "x:xmpmeta" --> +<xmp:xmpmeta xmlns:xmp='adobe:ns:meta/' xmp:xmptk='Image::ExifTool 9.97'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <!-- a non-standard namespace --> + <rdf:Description rdf:about='' + xmlns:xxxx='http://testtag.com/fish/1.0/'> + <xxxx:Test>trout</xxxx:Test> + </rdf:Description> + + <!-- a non-standard namespace using an already defined non-standard prefix --> + <rdf:Description rdf:about='' + xmlns:xxxx='http://testtag.com/feline/1.0/'> + <xxxx:Test>tabby</xxxx:Test> + </rdf:Description> + + <!-- a standard namespace using the proper (but already defined) standard prefix --> + <rdf:Description rdf:about='' + xmlns:xmp='http://ns.adobe.com/xap/1.0/'> + <xmp:Rating>2</xmp:Rating> + </rdf:Description> + + <!-- another standard namespace using the same prefix --> + <rdf:Description rdf:about='' + xmlns:xmp='http://purl.org/dc/elements/1.1/'> + <xmp:subject> + <rdf:Bag> + <rdf:li>x</rdf:li> + </rdf:Bag> + </xmp:subject> + </rdf:Description> + + <!-- an already-used standard namespace with a different prefix and a non-standard rdf prefix --> + <!-- (note: ExifTool currently processes attributes in order, even though the scope of the xmlns + should be from the beginning of the element, which is why "z:about" won't yet work below) --> + <z:Description rdf:about='' + xmlns:y='http://purl.org/dc/elements/1.1/' + xmlns:z='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + <y:title> + <z:Alt> + <z:li xml:lang='x-default'>a title</z:li> + </z:Alt> + </y:title> + </z:Description> +</rdf:RDF> +</xmp:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/images/XMP7.xmp b/t/images/XMP7.xmp new file mode 100644 index 0000000..328f500 --- /dev/null +++ b/t/images/XMP7.xmp @@ -0,0 +1,26 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 11.57'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:Iptc4xmpExt='http://iptc.org/std/Iptc4xmpExt/2008-02-29/'> + <Iptc4xmpExt:LocationShown> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <Iptc4xmpExt:City>London</Iptc4xmpExt:City> + <Iptc4xmpExt:CountryCode>GB</Iptc4xmpExt:CountryCode> + </rdf:li> + <rdf:li rdf:parseType='Resource'> + <Iptc4xmpExt:City>Paris</Iptc4xmpExt:City> + <Iptc4xmpExt:CountryCode>FR</Iptc4xmpExt:CountryCode> + </rdf:li> + <rdf:li rdf:parseType='Resource'> + <Iptc4xmpExt:City>Berlin</Iptc4xmpExt:City> + <Iptc4xmpExt:CountryCode>DE</Iptc4xmpExt:CountryCode> + </rdf:li> + </rdf:Bag> + </Iptc4xmpExt:LocationShown> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/images/XMP8.xmp b/t/images/XMP8.xmp new file mode 100644 index 0000000..69c7780 --- /dev/null +++ b/t/images/XMP8.xmp @@ -0,0 +1,38 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 11.58'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:Iptc4xmpExt='http://iptc.org/std/Iptc4xmpExt/2008-02-29/'> + <Iptc4xmpExt:AboutCvTerm> + <rdf:Bag> + <rdf:li rdf:parseType='Resource'> + <Iptc4xmpExt:CvId>1</Iptc4xmpExt:CvId> + <Iptc4xmpExt:CvTermName> + <rdf:Alt> + <rdf:li xml:lang='x-default'>one</rdf:li> + </rdf:Alt> + </Iptc4xmpExt:CvTermName> + </rdf:li> + <rdf:li rdf:parseType='Resource'> + <Iptc4xmpExt:CvId>2</Iptc4xmpExt:CvId> + <Iptc4xmpExt:CvTermName> + <rdf:Alt> + <rdf:li xml:lang='x-default'>two</rdf:li> + </rdf:Alt> + </Iptc4xmpExt:CvTermName> + </rdf:li> + <rdf:li rdf:parseType='Resource'> + <Iptc4xmpExt:CvId>3</Iptc4xmpExt:CvId> + <Iptc4xmpExt:CvTermName> + <rdf:Alt> + <rdf:li xml:lang='x-default'>three</rdf:li> + </rdf:Alt> + </Iptc4xmpExt:CvTermName> + </rdf:li> + </rdf:Bag> + </Iptc4xmpExt:AboutCvTerm> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/images/XMP9.xmp b/t/images/XMP9.xmp new file mode 100644 index 0000000..4f840f1 --- /dev/null +++ b/t/images/XMP9.xmp @@ -0,0 +1,34 @@ +<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?> +<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 11.64'> +<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'> + + <rdf:Description rdf:about='' + xmlns:plus='http://ns.useplus.org/ldf/xmp/1.0/'> + <plus:Custom1> + <rdf:Bag> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>cu1</rdf:li> + <rdf:li xml:lang='de'>de1</rdf:li> + <rdf:li xml:lang='fr'>fr1</rdf:li> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>cu2</rdf:li> + <rdf:li xml:lang='fr'/> + </rdf:Alt> + </rdf:li> + <rdf:li> + <rdf:Alt> + <rdf:li xml:lang='x-default'>cu3</rdf:li> + <rdf:li xml:lang='de'>de3</rdf:li> + <rdf:li xml:lang='fr'>fr3</rdf:li> + </rdf:Alt> + </rdf:li> + </rdf:Bag> + </plus:Custom1> + </rdf:Description> +</rdf:RDF> +</x:xmpmeta> +<?xpacket end='w'?> \ No newline at end of file diff --git a/t/images/ZIP.gz b/t/images/ZIP.gz new file mode 100644 index 0000000000000000000000000000000000000000..bb8a5eb05b2b77446de519463e0948a9a8e8d9d8 GIT binary patch literal 71 zcmb2|=8)L(<C7N?b4hA(iC#%X2}4LmX0ZYgB`Sb~6q56Eb5rw57>d`P@Zmmr{(PXv Y`cpaq8lJj(51AO2xlFqw%)r0^0LO(IU;qFB literal 0 HcmV?d00001 diff --git a/t/images/ZIP.zip b/t/images/ZIP.zip new file mode 100644 index 0000000000000000000000000000000000000000..68549bc29b69d0c7e6c836bf6ed9a3cf5e14cdef GIT binary patch literal 167 zcmWIWW@h1H0D<d%GL}+q;(5YAHVAVth%%I<7MJLiRFs5<a56Bft=r~d55%DrEDT>6 zzcRX3WTu7W=jSMZR4Jro=A?23cr!AIGvhLk7i0|sBM>iX1hEjNvqDS{tzcjX@MdKL ONiqVVGm!QJaToyNn;`iB literal 0 HcmV?d00001 diff --git a/t/images/ZISRAW.czi b/t/images/ZISRAW.czi new file mode 100644 index 0000000000000000000000000000000000000000..941d9707ecbb597964ec419bad5aa601a70c6a54 GIT binary patch literal 1856 zcmeHH&2G~`5a#cM#0$V><ttL`B#m06O(dsDgrzt^wgD-ZYHN>^RUNOhUZ;g)rJj4_ z4Y<KGaD&(23=hHjFIl6UP%oA6A*=73na?xxWxcRm$9zArrsD_Y^Qd_~tYCfIetqt| z__3LN`uXzu_w8rrZ=C0S`*Ks1p;}9F=zGc4I{(l6v4KVL|FFlNIWj#{_WY#m``6>< zc|WGP`!2DyCQBGGKU+gA2G5=%gl!NcAc7P~;@5-+mxO~0LeO|w(Rm{EIZJ((0J4I< zwuc&;ku~%+^NKPwKTm;gfwvZI4ZV%&CW9)v$!J6tEmx2@(2&gni29m_tkm2R899%n zgy0$E)R40ai2GVdqEsOqASsh{UM?7?ABmtjt`JCFE1lBiO1LcJz7*UElq`)eYHl}} z9IfcdO~9ui^$X2`70V$61Xw>1%okTacm!MOL#n7ry^?ewEH~v1PvwF*F$0na;Agfs zbZGzy<KlEh;-#df5DIO8^<AYRShM?=V12*+T_PTTfHxHU${uf6<JzCLafKw86glps z(`_15hgvf4EDzqPMKcx`M*f34Hd)4dW7>wCzQHJNcubI}89g#&!2w>W8bKmf^Ke2T z3I;~&=;XL#bh;<TtDgLA=j&JEN?lPf58qL^9CW%^SFw^-yj+bLt=@63YD(qn8m!mW WRpw&-(5;kv*xy~OH}CerkH;TD{#DKZ literal 0 HcmV?d00001 diff --git a/t/images/iWork.numbers b/t/images/iWork.numbers new file mode 100644 index 0000000000000000000000000000000000000000..e27f651b6b9d547dcfec74006ca1327731dbdeb5 GIT binary patch literal 1359 zcmWIWW@h1H0D;3L+1Ae!oqtIK*&r;=Aj%L}nwgyKlb@fhACgg;o0ONBnWL9gkRBSs z$-q2U=(iULhgPsKd}aK~Xya0vn_H<+P?TDhnOd%pnVXoNs*sXcl4!>j0Jmfl(2}_N zKiedM7J#rQiX{OMy?O;HX<#cFfX0I`4l4p&+>k5~0UF1_Py)0-{a5;<cR*e<6UY)# zhNRNWoRqNCqT<Z_Jde!clKi4dy@DJd18fNo(1N#u2upe|Ui3O_Aj0+_`?rYU_m`fF zZX2DnDp_lw5q<F8q16}Hri$G*Su(RUKmQq<Qpb~TAD*6{FJt*XNBT?P%zf{!@NAxt z6tc25{Msvn!?XX)<gn>ys+3+Y{xf@;!rd!-U2i_qjMWoRW9W}E7j>9(T*G_1zGaal z!$~gXKWS_07$n*hb<SzsDSs>ZZNf~y@MH6W#NF;RZrGw)c0J}&{nf(Dhh{tyVKv{h z{n*#8D;w`xI<2u>RenfQw8ZJ>G|wGP|26l2Usir*I+xzIJN<q$%dcxnR|eaCThdci zKW(w_`E<im|MU#Jj{Hd1dAQ4$^Zx0+CVf!UKtfJ8KHEBY;SQ$5j0_A+EDQ{sz>v$# zOG&NJtH{j(ht$_MzfeOe*f)QUfxzD9;SqLQgASN&;9M}F<E&QDQk7L(EWf;(b<&AT z;^w(ce}2z8pQp6&*ojL$&-a?koi8XZU*%Q8vXnbgea23a`*-8+OtCt*q+<O7vlC2N zvaiGEJ-9PNO--d)dCDfnr=ON-9u(cAWV+tLJf=ZStV{gbbx-5xOS)UHY+HN#*SZk) zM}enKtY3b7?}>$v`~tHNXEPeFz7l^nB&#Q<*8A+lP(I18OkReY%KPiz2>sb{-}kHi zNgl6uJ{diq!WNdx4}K*+XV>&C*Qx!mZOXm;#cPkh*uqv2ePw2ju*{DRR}sV6Y^`PA z<u{+4a8_~=<EnnY=oGc>yc~ajs<c0vFq@@1$5>`=&b@;#(hhGsA$Vw#*~JIktbU7A zn#|)Kv?^}vy|TWLwJrV5hl`s(nhUt~%Y}E9dtW^Nd&~E^t7oq2)p~VUK>jStf0>^h ziJ#(o%o9$`N#A6D_rcvKK`%qsmUJvmzrDXc>$!~LY`?GiTeUv=*0_KBxVZIyXA)QN zA+6iz7^_|iPG2#(`-tRo{*tvJH>)^>8)E(1%%%S+eGfd$mt$YKy6JmzjPg2$!Y^vp zDJs8scj_2_Uvnz5wPp@e(YNyZaer6?ycwCqnQ;{WyueJvzyM4S3`-h8ES$vwE2KCG ztzck4HW4$oBb%6tVj@c32bu@T_b~HtWp0FdZyS#R&BK$`fo6iTI>L>(l0CAS48S4; bDH8zA0A&J*8LVueFkt~gD_{`)X9n>A&3z2y literal 0 HcmV?d00001